summaryrefslogtreecommitdiffstats
path: root/sd
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sd/AllLangMoTarget_sd.mk11
-rw-r--r--sd/CppunitTest_sd_activex_controls_tests.mk71
-rw-r--r--sd/CppunitTest_sd_dialogs_test.mk77
-rw-r--r--sd/CppunitTest_sd_export_tests-ooxml1.mk14
-rw-r--r--sd/CppunitTest_sd_export_tests-ooxml2.mk14
-rw-r--r--sd/CppunitTest_sd_export_tests-ooxml3.mk17
-rw-r--r--sd/CppunitTest_sd_export_tests.mk15
-rw-r--r--sd/CppunitTest_sd_filter_eppt.mk50
-rw-r--r--sd/CppunitTest_sd_filters_test.mk78
-rw-r--r--sd/CppunitTest_sd_html_export_tests.mk72
-rw-r--r--sd/CppunitTest_sd_import_tests-smartart.mk14
-rw-r--r--sd/CppunitTest_sd_import_tests.mk15
-rw-r--r--sd/CppunitTest_sd_import_tests2.mk14
-rw-r--r--sd/CppunitTest_sd_layout_tests.mk77
-rw-r--r--sd/CppunitTest_sd_misc_tests.mk135
-rw-r--r--sd/CppunitTest_sd_pdf_import_test.mk72
-rw-r--r--sd/CppunitTest_sd_png_export_tests.mk72
-rw-r--r--sd/CppunitTest_sd_shape_import_export_tests.mk74
-rw-r--r--sd/CppunitTest_sd_svg_export_tests.mk72
-rw-r--r--sd/CppunitTest_sd_tiledrendering.mk71
-rw-r--r--sd/CppunitTest_sd_uiimpress.mk86
-rw-r--r--sd/CppunitTest_sd_uimpress.mk112
-rw-r--r--sd/IwyuFilter_sd.yaml568
-rw-r--r--sd/JunitTest_sd_unoapi.mk14
-rw-r--r--sd/Library_sd.mk590
-rw-r--r--sd/Library_sdd.mk41
-rw-r--r--sd/Library_sdfilt.mk79
-rw-r--r--sd/Library_sdui.mk101
-rw-r--r--sd/Makefile14
-rw-r--r--sd/Module_sd.mk77
-rw-r--r--sd/Package_opengl.mk16
-rw-r--r--sd/Package_web.mk37
-rw-r--r--sd/Package_xml.mk19
-rw-r--r--sd/README.md45
-rw-r--r--sd/README_REMOTE107
-rw-r--r--sd/UIConfig_sdraw.mk126
-rw-r--r--sd/UIConfig_simpress.mk170
-rw-r--r--sd/UITest_impress_tests.mk16
-rw-r--r--sd/UITest_sd_findReplace.mk16
-rw-r--r--sd/export_setup.mk87
-rw-r--r--sd/import_setup.mk141
-rw-r--r--sd/inc/Annotation.hxx159
-rw-r--r--sd/inc/AnnotationEnumeration.hxx37
-rw-r--r--sd/inc/CustomAnimationCloner.hxx33
-rw-r--r--sd/inc/CustomAnimationEffect.hxx454
-rw-r--r--sd/inc/CustomAnimationPreset.hxx142
-rw-r--r--sd/inc/DocumentRenderer.hrc95
-rw-r--r--sd/inc/EffectMigration.hxx75
-rw-r--r--sd/inc/FactoryIds.hxx40
-rw-r--r--sd/inc/Outliner.hxx534
-rw-r--r--sd/inc/OutlinerIterator.hxx314
-rw-r--r--sd/inc/SdShapeTypes.hxx51
-rw-r--r--sd/inc/TransitionPreset.hxx78
-rw-r--r--sd/inc/VectorGraphicSearchContext.hxx35
-rw-r--r--sd/inc/animations.hxx50
-rw-r--r--sd/inc/anminfo.hxx67
-rw-r--r--sd/inc/app.hrc462
-rw-r--r--sd/inc/bitmaps.hlst212
-rw-r--r--sd/inc/createpresentation.hxx35
-rw-r--r--sd/inc/createunocustomshow.hxx30
-rw-r--r--sd/inc/createunopageimpl.hxx32
-rw-r--r--sd/inc/cusshow.hxx65
-rw-r--r--sd/inc/customshowlist.hxx89
-rw-r--r--sd/inc/diadef.h30
-rw-r--r--sd/inc/drawdoc.hxx719
-rw-r--r--sd/inc/errhdl.hrc39
-rw-r--r--sd/inc/fadedef.h28
-rw-r--r--sd/inc/family.hrc43
-rw-r--r--sd/inc/glob.hxx55
-rw-r--r--sd/inc/helper/simplereferencecomponent.hxx63
-rw-r--r--sd/inc/helpids.h62
-rw-r--r--sd/inc/misc/scopelock.hxx51
-rw-r--r--sd/inc/notifydocumentevent.hxx32
-rw-r--r--sd/inc/pageformatpanel.hrc53
-rw-r--r--sd/inc/pch/precompiled_sd.cxx12
-rw-r--r--sd/inc/pch/precompiled_sd.hxx581
-rw-r--r--sd/inc/pch/precompiled_sdui.cxx12
-rw-r--r--sd/inc/pch/precompiled_sdui.hxx497
-rw-r--r--sd/inc/pglink.hxx40
-rw-r--r--sd/inc/pres.hxx73
-rw-r--r--sd/inc/prlayout.hxx46
-rw-r--r--sd/inc/randomnode.hxx35
-rw-r--r--sd/inc/resltn.hxx35
-rw-r--r--sd/inc/sdabstdlg.hxx210
-rw-r--r--sd/inc/sdattr.hrc124
-rw-r--r--sd/inc/sdattr.hxx60
-rw-r--r--sd/inc/sdcgmfilter.hxx37
-rw-r--r--sd/inc/sdcommands.h26
-rw-r--r--sd/inc/sddll.hxx54
-rw-r--r--sd/inc/sddllapi.h30
-rw-r--r--sd/inc/sdenumdef.hxx31
-rw-r--r--sd/inc/sderror.hxx31
-rw-r--r--sd/inc/sdfilter.hxx66
-rw-r--r--sd/inc/sdgrffilter.hxx39
-rw-r--r--sd/inc/sdhtmlfilter.hxx34
-rw-r--r--sd/inc/sdiocmpt.hxx57
-rw-r--r--sd/inc/sdmod.hxx175
-rw-r--r--sd/inc/sdpage.hxx404
-rw-r--r--sd/inc/sdpdffilter.hxx41
-rw-r--r--sd/inc/sdpptwrp.hxx46
-rw-r--r--sd/inc/sdresid.hxx29
-rw-r--r--sd/inc/sdundo.hxx45
-rw-r--r--sd/inc/sdxmlwrp.hxx52
-rw-r--r--sd/inc/shapelist.hxx71
-rw-r--r--sd/inc/stlfamily.hxx116
-rw-r--r--sd/inc/stlpool.hxx141
-rw-r--r--sd/inc/stlsheet.hxx180
-rw-r--r--sd/inc/strings.hrc488
-rw-r--r--sd/inc/strings.hxx23
-rw-r--r--sd/inc/textapi.hxx55
-rw-r--r--sd/inc/undo/undofactory.hxx40
-rw-r--r--sd/inc/undo/undomanager.hxx61
-rw-r--r--sd/inc/undo/undoobjects.hxx175
-rw-r--r--sd/inc/undoanim.hxx84
-rw-r--r--sd/qa/filter/eppt/data/custom-shape-bitmap-fill.pptxbin0 -> 24802 bytes
-rw-r--r--sd/qa/filter/eppt/data/video-loop.pptxbin0 -> 46545 bytes
-rw-r--r--sd/qa/filter/eppt/eppt.cxx158
-rw-r--r--sd/qa/uitest/data/LibreOffice.jpgbin0 -> 18218 bytes
-rw-r--r--sd/qa/uitest/data/embedded.pptxbin0 -> 55350 bytes
-rw-r--r--sd/qa/uitest/data/findReplace.odpbin0 -> 12804 bytes
-rw-r--r--sd/qa/uitest/data/tdf127900.fodp778
-rw-r--r--sd/qa/uitest/data/tdf144943.pptxbin0 -> 33389 bytes
-rw-r--r--sd/qa/uitest/data/tdf146019.jpgbin0 -> 24014 bytes
-rw-r--r--sd/qa/uitest/data/tdf153161_FlushToSave.odpbin0 -> 37209 bytes
-rw-r--r--sd/qa/uitest/findReplace/findReplace.py108
-rw-r--r--sd/qa/uitest/impress_tests/autocorrectOptions.py101
-rw-r--r--sd/qa/uitest/impress_tests/customSlideShow.py74
-rw-r--r--sd/qa/uitest/impress_tests/embedded.py37
-rw-r--r--sd/qa/uitest/impress_tests/exportToPDF.py82
-rw-r--r--sd/qa/uitest/impress_tests/insertSlide.py53
-rw-r--r--sd/qa/uitest/impress_tests/masterElements.py46
-rw-r--r--sd/qa/uitest/impress_tests/masterSlides.py47
-rw-r--r--sd/qa/uitest/impress_tests/renameSlide.py47
-rw-r--r--sd/qa/uitest/impress_tests/save_readonly_with_password.py107
-rw-r--r--sd/qa/uitest/impress_tests/slideShowSettings.py60
-rw-r--r--sd/qa/uitest/impress_tests/tdf106612.py47
-rw-r--r--sd/qa/uitest/impress_tests/tdf125449.py59
-rw-r--r--sd/qa/uitest/impress_tests/tdf127900.py41
-rw-r--r--sd/qa/uitest/impress_tests/tdf130440.py65
-rw-r--r--sd/qa/uitest/impress_tests/tdf133713.py58
-rw-r--r--sd/qa/uitest/impress_tests/tdf134734.py102
-rw-r--r--sd/qa/uitest/impress_tests/tdf137637.py57
-rw-r--r--sd/qa/uitest/impress_tests/tdf137729.py52
-rw-r--r--sd/qa/uitest/impress_tests/tdf139511.py52
-rw-r--r--sd/qa/uitest/impress_tests/tdf141297.py82
-rw-r--r--sd/qa/uitest/impress_tests/tdf141708.py33
-rw-r--r--sd/qa/uitest/impress_tests/tdf144943.py31
-rw-r--r--sd/qa/uitest/impress_tests/tdf146019.py36
-rw-r--r--sd/qa/uitest/impress_tests/tdf82616.py70
-rw-r--r--sd/qa/uitest/impress_tests/tdf91762.py46
-rw-r--r--sd/qa/uitest/impress_tests/textColumnsDialog.py52
-rw-r--r--sd/qa/uitest/impress_tests2/tdf153161.py37
-rw-r--r--sd/qa/unit/HtmlExportTest.cxx60
-rw-r--r--sd/qa/unit/PNGExportTests.cxx503
-rw-r--r--sd/qa/unit/SVGExportTests.cxx352
-rw-r--r--sd/qa/unit/SdrPdfImportTest.cxx311
-rw-r--r--sd/qa/unit/ShapeImportExportTest.cxx401
-rw-r--r--sd/qa/unit/activex-controls-tests.cxx1195
-rw-r--r--sd/qa/unit/data/AllTransitions.odpbin0 -> 15719 bytes
-rw-r--r--sd/qa/unit/data/HtmlExportTestDocument.odpbin0 -> 25480 bytes
-rw-r--r--sd/qa/unit/data/PdfWithAnnotation.pdfbin0 -> 13789 bytes
-rw-r--r--sd/qa/unit/data/README7
-rw-r--r--sd/qa/unit/data/SimplePDF.pdfbin0 -> 8136 bytes
-rw-r--r--sd/qa/unit/data/TextDistancesInsets1.pptxbin0 -> 60484 bytes
-rw-r--r--sd/qa/unit/data/TextDistancesInsets2.pptxbin0 -> 111830 bytes
-rw-r--r--sd/qa/unit/data/TextDistancesInsets3.pptxbin0 -> 60276 bytes
-rw-r--r--sd/qa/unit/data/bnc822347_EmptyBullet.odpbin0 -> 11589 bytes
-rw-r--r--sd/qa/unit/data/cgm/fail/.gitignore0
-rw-r--r--sd/qa/unit/data/cgm/fail/ofz35504-ubsan-1.cgmbin0 -> 12460 bytes
-rw-r--r--sd/qa/unit/data/cgm/fail/ooo6420-1.cgm400
-rw-r--r--sd/qa/unit/data/cgm/fail/recurse-1.cgmbin0 -> 162 bytes
-rw-r--r--sd/qa/unit/data/cgm/indeterminate/.gitignore0
-rw-r--r--sd/qa/unit/data/cgm/pass/.gitignore0
-rw-r--r--sd/qa/unit/data/cgm/pass/binary_corvette.cgmbin0 -> 31788 bytes
-rw-r--r--sd/qa/unit/data/cgm/pass/circles.cgmbin0 -> 4400 bytes
-rw-r--r--sd/qa/unit/data/cgm/pass/ofz-ubsan-2.cgmbin0 -> 56 bytes
-rw-r--r--sd/qa/unit/data/cgm/pass/ofz36348-ubsan-1.cgmbin0 -> 12507 bytes
-rw-r--r--sd/qa/unit/data/cgm/pass/ofz9707-slow-1.cgmbin0 -> 25558 bytes
-rw-r--r--sd/qa/unit/data/dialogs-test.txt75
-rw-r--r--sd/qa/unit/data/empty.fodp2
-rw-r--r--sd/qa/unit/data/fdo47434.pptxbin0 -> 32477 bytes
-rw-r--r--sd/qa/unit/data/fdo64512.odpbin0 -> 14699 bytes
-rw-r--r--sd/qa/unit/data/fdo64586.pptbin0 -> 71680 bytes
-rw-r--r--sd/qa/unit/data/fdo71075.odpbin0 -> 15574 bytes
-rw-r--r--sd/qa/unit/data/fdo71434.pptxbin0 -> 155595 bytes
-rw-r--r--sd/qa/unit/data/fdo71961.odpbin0 -> 23506 bytes
-rw-r--r--sd/qa/unit/data/fdo79731.odpbin0 -> 11008 bytes
-rw-r--r--sd/qa/unit/data/fdo84043.odpbin0 -> 7718 bytes
-rw-r--r--sd/qa/unit/data/fdo90607.pptxbin0 -> 34719 bytes
-rw-r--r--sd/qa/unit/data/fit-to-size.fodp724
-rw-r--r--sd/qa/unit/data/media_embedding.odpbin0 -> 228295 bytes
-rw-r--r--sd/qa/unit/data/n593612.pptxbin0 -> 23024 bytes
-rw-r--r--sd/qa/unit/data/n758621.pptbin0 -> 115712 bytes
-rw-r--r--sd/qa/unit/data/n759180.pptxbin0 -> 39463 bytes
-rw-r--r--sd/qa/unit/data/n762695.pptxbin0 -> 46216 bytes
-rw-r--r--sd/qa/unit/data/n819614.pptxbin0 -> 138478 bytes
-rw-r--r--sd/qa/unit/data/n820786.pptxbin0 -> 43286 bytes
-rw-r--r--sd/qa/unit/data/n828390_4.odpbin0 -> 13928 bytes
-rw-r--r--sd/qa/unit/data/n828390_5.odpbin0 -> 9716 bytes
-rw-r--r--sd/qa/unit/data/n902652.pptxbin0 -> 39315 bytes
-rw-r--r--sd/qa/unit/data/objectwithtext.fodg189
-rw-r--r--sd/qa/unit/data/odg/fail/.gitignore0
-rw-r--r--sd/qa/unit/data/odg/glow.odgbin0 -> 8873 bytes
-rw-r--r--sd/qa/unit/data/odg/gradient-angle.fodg211
-rw-r--r--sd/qa/unit/data/odg/indeterminate/.gitignore0
-rw-r--r--sd/qa/unit/data/odg/ooo124143-1.odgbin0 -> 14818 bytes
-rw-r--r--sd/qa/unit/data/odg/pass/.gitignore0
-rw-r--r--sd/qa/unit/data/odg/pass/CVE-2012-4233-2.odgbin0 -> 67721 bytes
-rw-r--r--sd/qa/unit/data/odg/rhbz1870501.odgbin0 -> 403275 bytes
-rw-r--r--sd/qa/unit/data/odg/shadow-blur.odgbin0 -> 12837 bytes
-rw-r--r--sd/qa/unit/data/odg/softedges.odgbin0 -> 10130 bytes
-rw-r--r--sd/qa/unit/data/odg/tb-rl-textbox.odgbin0 -> 10002 bytes
-rw-r--r--sd/qa/unit/data/odg/tdf114488.fodg365
-rw-r--r--sd/qa/unit/data/odg/tdf126319.odgbin0 -> 9327 bytes
-rw-r--r--sd/qa/unit/data/odg/tdf147119.odgbin0 -> 9591 bytes
-rw-r--r--sd/qa/unit/data/odg/two_columns.odgbin0 -> 14726 bytes
-rw-r--r--sd/qa/unit/data/odp/BulletsAsImage.odpbin0 -> 10754 bytes
-rw-r--r--sd/qa/unit/data/odp/LineStylesOwn.odpbin0 -> 15253 bytes
-rw-r--r--sd/qa/unit/data/odp/Table_with_Cell_Fill.odpbin0 -> 28869 bytes
-rw-r--r--sd/qa/unit/data/odp/Tdf62176.odpbin0 -> 10358 bytes
-rw-r--r--sd/qa/unit/data/odp/author_field.odpbin0 -> 10518 bytes
-rw-r--r--sd/qa/unit/data/odp/author_fixed.odpbin0 -> 10680 bytes
-rw-r--r--sd/qa/unit/data/odp/autofitted-textbox-indent.odpbin0 -> 12486 bytes
-rw-r--r--sd/qa/unit/data/odp/background.odpbin0 -> 14126 bytes
-rw-r--r--sd/qa/unit/data/odp/bnc822341.odpbin0 -> 15983 bytes
-rw-r--r--sd/qa/unit/data/odp/bulletCharAndFont.odpbin0 -> 11279 bytes
-rw-r--r--sd/qa/unit/data/odp/cellspan.odpbin0 -> 13489 bytes
-rw-r--r--sd/qa/unit/data/odp/closed-shapes.odpbin0 -> 16370 bytes
-rw-r--r--sd/qa/unit/data/odp/document_with_linked_graphic.odpbin0 -> 49906 bytes
-rw-r--r--sd/qa/unit/data/odp/document_with_two_images.odpbin0 -> 202183 bytes
-rw-r--r--sd/qa/unit/data/odp/embedded-pdf.odpbin0 -> 25002 bytes
-rw-r--r--sd/qa/unit/data/odp/extfile_field.odpbin0 -> 10918 bytes
-rw-r--r--sd/qa/unit/data/odp/fail/.gitignore0
-rw-r--r--sd/qa/unit/data/odp/fdo77027.odpbin0 -> 13229 bytes
-rw-r--r--sd/qa/unit/data/odp/fillbitmap2.odpbin0 -> 11590 bytes
-rw-r--r--sd/qa/unit/data/odp/group_rotation.odpbin0 -> 10429 bytes
-rw-r--r--sd/qa/unit/data/odp/image_transparency.odpbin0 -> 24448 bytes
-rw-r--r--sd/qa/unit/data/odp/images_with_special_IDs.odpbin0 -> 169241 bytes
-rw-r--r--sd/qa/unit/data/odp/indeterminate/.gitignore0
-rw-r--r--sd/qa/unit/data/odp/linked_graphic.jpgbin0 -> 35738 bytes
-rw-r--r--sd/qa/unit/data/odp/loopNoPause.odpbin0 -> 10998 bytes
-rw-r--r--sd/qa/unit/data/odp/loopPause10.odpbin0 -> 10960 bytes
-rw-r--r--sd/qa/unit/data/odp/masterpage_style_parent.odpbin0 -> 17790 bytes
-rw-r--r--sd/qa/unit/data/odp/math.odpbin0 -> 12269 bytes
-rw-r--r--sd/qa/unit/data/odp/numfmt.odpbin0 -> 11438 bytes
-rw-r--r--sd/qa/unit/data/odp/page_transparent_background.odpbin0 -> 11508 bytes
-rw-r--r--sd/qa/unit/data/odp/pass/.gitignore0
-rw-r--r--sd/qa/unit/data/odp/pass/EDB-26517-1.odpbin0 -> 12752 bytes
-rw-r--r--sd/qa/unit/data/odp/pass/ooo56974-1.odpbin0 -> 11326 bytes
-rw-r--r--sd/qa/unit/data/odp/pass/ooo72169-1.odpbin0 -> 4740 bytes
-rw-r--r--sd/qa/unit/data/odp/pass/test-embedded-dejavu.odpbin0 -> 2225735 bytes
-rw-r--r--sd/qa/unit/data/odp/pass/test-slide-name-fields.odpbin0 -> 10916 bytes
-rw-r--r--sd/qa/unit/data/odp/placeholder-box-textalignment.odpbin0 -> 15853 bytes
-rw-r--r--sd/qa/unit/data/odp/preset-shapes-export.odpbin0 -> 21208 bytes
-rw-r--r--sd/qa/unit/data/odp/repeatBitmapMode.odpbin0 -> 19301 bytes
-rw-r--r--sd/qa/unit/data/odp/rotate_flip.odpbin0 -> 12254 bytes
-rw-r--r--sd/qa/unit/data/odp/search-all-notes.odpbin0 -> 12018 bytes
-rw-r--r--sd/qa/unit/data/odp/shapes-test.odpbin0 -> 61333 bytes
-rw-r--r--sd/qa/unit/data/odp/slide-bitmap-background.odpbin0 -> 82326 bytes
-rw-r--r--sd/qa/unit/data/odp/slide-custom-background.odpbin0 -> 40023 bytes
-rw-r--r--sd/qa/unit/data/odp/slide-tile-background.odpbin0 -> 95650 bytes
-rw-r--r--sd/qa/unit/data/odp/slidecount_field.odpbin0 -> 9918 bytes
-rw-r--r--sd/qa/unit/data/odp/slidename_field.odpbin0 -> 10089 bytes
-rw-r--r--sd/qa/unit/data/odp/slidenum_field.odpbin0 -> 9882 bytes
-rw-r--r--sd/qa/unit/data/odp/svg-export-text-decorations.odpbin0 -> 12407 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf100348_Fontwork2TextWarp.odpbin0 -> 14788 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf100348_FontworkBitmapFill.odpbin0 -> 17886 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf100348_FontworkGradientGlow.odpbin0 -> 20381 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf100387.odpbin0 -> 10810 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf103567.odpbin0 -> 62137 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf105998.odpbin0 -> 11145 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf106026.odpbin0 -> 10876 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf108925.odpbin0 -> 11219 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf109169_Diamond.odpbin0 -> 14664 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf109169_Octagon.odpbin0 -> 13380 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf111785.odpbin0 -> 11819 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf111798.odpbin0 -> 11183 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf112552.odpbin0 -> 11331 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf112557.odpbin0 -> 12749 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf112647.odpbin0 -> 11172 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf113197.odpbin0 -> 56781 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf115005.odpbin0 -> 51823 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf115005_no_fallback_images.odpbin0 -> 21100 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf116266.odpbin0 -> 43204 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf116266_chart.svg99
-rw-r--r--sd/qa/unit/data/odp/tdf118045.odpbin0 -> 12192 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf118768-brake.odpbin0 -> 10742 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf118783.odpbin0 -> 11644 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf118806.odpbin0 -> 11999 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf118825-motionpath.odpbin0 -> 12646 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf118835.odpbin0 -> 11973 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf118836.odpbin0 -> 11655 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf119223.odpbin0 -> 18335 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf123658_SearchAfterSlideChange.odpbin0 -> 11749 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf124781.odpbin0 -> 11833 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf127267DashOnHairline.odpbin0 -> 11874 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf127372.odpbin0 -> 13009 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf127379.odpbin0 -> 19471 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf127901.odpbin0 -> 53808 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf128049.odpbin0 -> 18269 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf128096.odpbin0 -> 10992 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf128345_FullTransparentGradient.odpbin0 -> 11244 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf128345_GradientAxial.odpbin0 -> 12561 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf128345_GradientLinear.odpbin0 -> 13384 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf128345_GradientRadial.odpbin0 -> 14774 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf128985.odpbin0 -> 14781 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf129430.odpbin0 -> 10697 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf133502.odpbin0 -> 13204 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf134969_TransparencyOnColorGradient.odpbin0 -> 17107 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf136949.odpbin0 -> 12555 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf141269.odpbin0 -> 196094 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf146876.odpbin0 -> 11620 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf147919.odpbin0 -> 14790 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf147978_enhancedPath_viewBox.odpbin0 -> 12728 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf149126.odpbin0 -> 11886 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf149128.odpbin0 -> 11816 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf149311.odpbin0 -> 15388 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf150966_hugeInset.odpbin0 -> 14837 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf151492.odpbin0 -> 12618 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf48735.odpbin0 -> 15137 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf53970.odpbin0 -> 30328 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf53970_linked.odpbin0 -> 13158 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf59046.odpbin0 -> 10800 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf66228.odpbin0 -> 13283 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf68759.odpbin0 -> 11250 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf74670.odpbin0 -> 11786 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf80020.odpbin0 -> 13068 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf80224.odpbin0 -> 23894 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf90626.odpbin0 -> 12363 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf90627.odpbin0 -> 38499 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf92076.odpbin0 -> 11185 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf93883.odpbin0 -> 11057 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf94122_autocolor.odpbin0 -> 13942 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf96206.odpbin0 -> 12545 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf96708.odpbin0 -> 7758 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf99213-target-missing.odpbin0 -> 11088 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf99224.odpbin0 -> 11212 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf99497_CircleKind.odpbin0 -> 12196 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf99729-legacy.odpbin0 -> 11064 bytes
-rw-r--r--sd/qa/unit/data/odp/tdf99729-new.odpbin0 -> 11149 bytes
-rw-r--r--sd/qa/unit/data/odp/testLegacyShapeAutofit.odpbin0 -> 13611 bytes
-rw-r--r--sd/qa/unit/data/odp/testZeroIndent.odpbin0 -> 15446 bytes
-rw-r--r--sd/qa/unit/data/odp/text-fields.odpbin0 -> 14035 bytes
-rw-r--r--sd/qa/unit/data/odp/textbox-link-javascript.odpbin0 -> 23573 bytes
-rw-r--r--sd/qa/unit/data/odp/transparent_background.odpbin0 -> 11687 bytes
-rw-r--r--sd/qa/unit/data/pdf/multipage.pdfbin0 -> 13155 bytes
-rw-r--r--sd/qa/unit/data/pdf/txtpic.pdfbin0 -> 21201 bytes
-rw-r--r--sd/qa/unit/data/ppt/FillPatterns.pptbin0 -> 19968 bytes
-rw-r--r--sd/qa/unit/data/ppt/crop.pptbin0 -> 147456 bytes
-rw-r--r--sd/qa/unit/data/ppt/fail/.gitignore0
-rw-r--r--sd/qa/unit/data/ppt/fail/CVE-2010-0033-1.pptbin0 -> 3072 bytes
-rw-r--r--sd/qa/unit/data/ppt/fdo68594.pptbin0 -> 100864 bytes
-rw-r--r--sd/qa/unit/data/ppt/indeterminate/.gitignore0
-rw-r--r--sd/qa/unit/data/ppt/loopNoPause.pptbin0 -> 87552 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/.gitignore0
-rw-r--r--sd/qa/unit/data/ppt/pass/CVE-2006-3655-1.pptbin0 -> 35840 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/CVE-2006-3656-1.pptbin0 -> 35840 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/CVE-2006-3660-1.pptbin0 -> 35840 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/CVE-2006-5296-1.pptbin0 -> 8704 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/CVE-2012-4233-3.pptbin0 -> 423424 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/EDB-39395-1.pptbin0 -> 259072 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/EDB-39397-1.pptbin0 -> 302080 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/crash-1.pptbin0 -> 7677 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/crash-2.pptbin0 -> 7680 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/crash-3.pptbin0 -> 7681 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-1.pptbin0 -> 7680 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-10.pptbin0 -> 7648 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-11.pptbin0 -> 7712 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-12.pptbin0 -> 7705 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-13.pptbin0 -> 7659 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-14.pptbin0 -> 7680 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-15.pptbin0 -> 7680 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-16.pptbin0 -> 7693 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-17.pptbin0 -> 7680 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-18.pptbin0 -> 7680 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-19.pptbin0 -> 7680 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-2.pptbin0 -> 7680 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-20.pptbin0 -> 7732 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-21.pptbin0 -> 7659 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-22.pptbin0 -> 15872 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-3.pptbin0 -> 7680 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-4.pptbin0 -> 7712 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-5.pptbin0 -> 7712 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-6.pptbin0 -> 7712 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-7.pptbin0 -> 7691 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-8.pptbin0 -> 7712 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/hang-9.pptbin0 -> 7712 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/ofz14989-1.pptbin0 -> 60108 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/ofz21531-1.pptbin0 -> 35567 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/ofz37370-1.pptbin0 -> 4341 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/ofz43902-1.pptbin0 -> 43630 bytes
-rw-r--r--sd/qa/unit/data/ppt/pass/ofz7469-leak-1.pptbin0 -> 4341 bytes
-rw-r--r--sd/qa/unit/data/ppt/placeholder-priority.pptxbin0 -> 26091 bytes
-rw-r--r--sd/qa/unit/data/ppt/tdf105150.pptbin0 -> 138752 bytes
-rw-r--r--sd/qa/unit/data/ppt/tdf115394.pptbin0 -> 90112 bytes
-rw-r--r--sd/qa/unit/data/ppt/tdf116899.pptbin0 -> 113152 bytes
-rw-r--r--sd/qa/unit/data/ppt/tdf119629.pptbin0 -> 112128 bytes
-rw-r--r--sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.pptbin0 -> 8192 bytes
-rw-r--r--sd/qa/unit/data/ppt/tdf126761.pptbin0 -> 100352 bytes
-rw-r--r--sd/qa/unit/data/ppt/tdf136911.pptbin0 -> 56832 bytes
-rw-r--r--sd/qa/unit/data/ppt/tdf143315-WordartWithoutBullet.pptbin0 -> 68608 bytes
-rw-r--r--sd/qa/unit/data/ppt/tdf49561.pptbin0 -> 14336 bytes
-rw-r--r--sd/qa/unit/data/ppt/tdf49856.pptbin0 -> 125440 bytes
-rw-r--r--sd/qa/unit/data/ppt/tdf77747.pptbin0 -> 147968 bytes
-rw-r--r--sd/qa/unit/data/ppt/tdf79082.pptbin0 -> 72704 bytes
-rw-r--r--sd/qa/unit/data/ppt/tdf93124.pptbin0 -> 85504 bytes
-rw-r--r--sd/qa/unit/data/pptm/macro.pptmbin0 -> 35129 bytes
-rw-r--r--sd/qa/unit/data/pptx/3columns.pptxbin0 -> 39915 bytes
-rw-r--r--sd/qa/unit/data/pptx/LostPlaceholder.odpbin0 -> 13206 bytes
-rw-r--r--sd/qa/unit/data/pptx/LostPlaceholderFill.odpbin0 -> 15000 bytes
-rw-r--r--sd/qa/unit/data/pptx/Math.pptxbin0 -> 35240 bytes
-rw-r--r--sd/qa/unit/data/pptx/ShapeLineProperties.pptxbin0 -> 25433 bytes
-rw-r--r--sd/qa/unit/data/pptx/ShapePlusImage.pptxbin0 -> 36088 bytes
-rw-r--r--sd/qa/unit/data/pptx/ShapeTextInflateTop.pptxbin0 -> 32007 bytes
-rw-r--r--sd/qa/unit/data/pptx/accent-color.pptxbin0 -> 1079347 bytes
-rw-r--r--sd/qa/unit/data/pptx/activex_checkbox.pptxbin0 -> 39828 bytes
-rw-r--r--sd/qa/unit/data/pptx/activex_combobox.pptxbin0 -> 39414 bytes
-rw-r--r--sd/qa/unit/data/pptx/activex_commandbutton.pptxbin0 -> 39860 bytes
-rw-r--r--sd/qa/unit/data/pptx/activex_fontproperties.pptxbin0 -> 48562 bytes
-rw-r--r--sd/qa/unit/data/pptx/activex_label.pptxbin0 -> 39637 bytes
-rw-r--r--sd/qa/unit/data/pptx/activex_listbox.pptxbin0 -> 39370 bytes
-rw-r--r--sd/qa/unit/data/pptx/activex_optionbutton.pptxbin0 -> 39586 bytes
-rw-r--r--sd/qa/unit/data/pptx/activex_picture.pptxbin0 -> 236898 bytes
-rw-r--r--sd/qa/unit/data/pptx/activex_scrollbar.pptxbin0 -> 39882 bytes
-rw-r--r--sd/qa/unit/data/pptx/activex_spinbutton.pptxbin0 -> 40850 bytes
-rw-r--r--sd/qa/unit/data/pptx/activex_textbox.pptxbin0 -> 41657 bytes
-rw-r--r--sd/qa/unit/data/pptx/activex_togglebutton.pptxbin0 -> 39698 bytes
-rw-r--r--sd/qa/unit/data/pptx/altdescription.pptxbin0 -> 156788 bytes
-rw-r--r--sd/qa/unit/data/pptx/arc-validiert.pptxbin0 -> 14393 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc480256-2.pptxbin0 -> 23387 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc480256.pptxbin0 -> 35990 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc584721_1_2.pptxbin0 -> 15008 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc584721_4.pptxbin0 -> 34738 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc591147.pptxbin0 -> 34591 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc862510_5.pptxbin0 -> 63675 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc862510_6.pptxbin0 -> 48707 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc862510_7.pptxbin0 -> 24443 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc870233_1.pptxbin0 -> 34111 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc870233_2.pptxbin0 -> 55758 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc870237.pptxbin0 -> 40889 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc880763.pptxbin0 -> 45631 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc887225.pptxbin0 -> 32814 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc887230.pptxbin0 -> 25715 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc904423.pptxbin0 -> 25119 bytes
-rw-r--r--sd/qa/unit/data/pptx/bnc910045.pptxbin0 -> 37522 bytes
-rw-r--r--sd/qa/unit/data/pptx/bulletColor.pptxbin0 -> 32946 bytes
-rw-r--r--sd/qa/unit/data/pptx/bulletMarginAndIndent.pptxbin0 -> 32905 bytes
-rw-r--r--sd/qa/unit/data/pptx/connectors.pptxbin0 -> 24318 bytes
-rw-r--r--sd/qa/unit/data/pptx/control_background_color.pptxbin0 -> 85895 bytes
-rw-r--r--sd/qa/unit/data/pptx/crop-position.pptxbin0 -> 28479 bytes
-rw-r--r--sd/qa/unit/data/pptx/crop-to-shape.pptxbin0 -> 83338 bytes
-rw-r--r--sd/qa/unit/data/pptx/croppedTo0.pptxbin0 -> 12974 bytes
-rw-r--r--sd/qa/unit/data/pptx/cshapes.pptxbin0 -> 173125 bytes
-rw-r--r--sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptxbin0 -> 34892 bytes
-rw-r--r--sd/qa/unit/data/pptx/customxml.pptxbin0 -> 44229 bytes
-rw-r--r--sd/qa/unit/data/pptx/deftabstop.pptxbin0 -> 26783 bytes
-rw-r--r--sd/qa/unit/data/pptx/effectOrder.pptxbin0 -> 30482 bytes
-rw-r--r--sd/qa/unit/data/pptx/fail/.gitignore0
-rw-r--r--sd/qa/unit/data/pptx/fail/CVE-2014-6352-1.ppsx1
-rw-r--r--sd/qa/unit/data/pptx/fdo83751.pptxbin0 -> 33818 bytes
-rw-r--r--sd/qa/unit/data/pptx/fill-color-list.pptxbin0 -> 42946 bytes
-rw-r--r--sd/qa/unit/data/pptx/font-scale.pptxbin0 -> 40239 bytes
-rw-r--r--sd/qa/unit/data/pptx/greysscale-graphic.pptxbin0 -> 156595 bytes
-rw-r--r--sd/qa/unit/data/pptx/group-rot.pptxbin0 -> 39796 bytes
-rw-r--r--sd/qa/unit/data/pptx/group.pptxbin0 -> 50247 bytes
-rw-r--r--sd/qa/unit/data/pptx/hyperlinkOnImage.pptxbin0 -> 17576 bytes
-rw-r--r--sd/qa/unit/data/pptx/hyperlinktest.pptxbin0 -> 33633 bytes
-rw-r--r--sd/qa/unit/data/pptx/indeterminate/.gitignore0
-rw-r--r--sd/qa/unit/data/pptx/lineStyle.pptxbin0 -> 31446 bytes
-rw-r--r--sd/qa/unit/data/pptx/loopNoPause.pptxbin0 -> 32373 bytes
-rw-r--r--sd/qa/unit/data/pptx/mirrored-graphic.pptxbin0 -> 173805 bytes
-rw-r--r--sd/qa/unit/data/pptx/multicol.pptxbin0 -> 25935 bytes
-rw-r--r--sd/qa/unit/data/pptx/n778859.pptxbin0 -> 32444 bytes
-rw-r--r--sd/qa/unit/data/pptx/n80340.pptxbin0 -> 83909 bytes
-rw-r--r--sd/qa/unit/data/pptx/n821567.pptxbin0 -> 179901 bytes
-rw-r--r--sd/qa/unit/data/pptx/n828390.pptxbin0 -> 32803 bytes
-rw-r--r--sd/qa/unit/data/pptx/n828390_2.pptxbin0 -> 32749 bytes
-rw-r--r--sd/qa/unit/data/pptx/n828390_3.pptxbin0 -> 34098 bytes
-rw-r--r--sd/qa/unit/data/pptx/n83889.pptxbin0 -> 33401 bytes
-rw-r--r--sd/qa/unit/data/pptx/n862510_1.pptxbin0 -> 34576 bytes
-rw-r--r--sd/qa/unit/data/pptx/n862510_2.pptxbin0 -> 48923 bytes
-rw-r--r--sd/qa/unit/data/pptx/n862510_4.pptxbin0 -> 32840 bytes
-rw-r--r--sd/qa/unit/data/pptx/n90190.pptxbin0 -> 33256 bytes
-rw-r--r--sd/qa/unit/data/pptx/n90223.pptxbin0 -> 83910 bytes
-rw-r--r--sd/qa/unit/data/pptx/n90255.pptxbin0 -> 32622 bytes
-rw-r--r--sd/qa/unit/data/pptx/narration-non-media-shape.pptxbin0 -> 30952 bytes
-rw-r--r--sd/qa/unit/data/pptx/narration.pptxbin0 -> 82099 bytes
-rw-r--r--sd/qa/unit/data/pptx/numfmt.pptxbin0 -> 44390 bytes
-rw-r--r--sd/qa/unit/data/pptx/ole-emf_min.pptxbin0 -> 36796 bytes
-rw-r--r--sd/qa/unit/data/pptx/ole.pptxbin0 -> 41588 bytes
-rw-r--r--sd/qa/unit/data/pptx/ooxtheme.pptxbin0 -> 44886 bytes
-rw-r--r--sd/qa/unit/data/pptx/open-as-read-only.pptxbin0 -> 21569 bytes
-rw-r--r--sd/qa/unit/data/pptx/page_transparent_bitmap.pptxbin0 -> 29823 bytes
-rw-r--r--sd/qa/unit/data/pptx/paraMarginAndIndentation.pptxbin0 -> 32854 bytes
-rw-r--r--sd/qa/unit/data/pptx/pass/.gitignore0
-rw-r--r--sd/qa/unit/data/pptx/pass/CVE-2014-4114.ppsxbin0 -> 109961 bytes
-rw-r--r--sd/qa/unit/data/pptx/pass/ofz35597-1.pptxbin0 -> 23316 bytes
-rw-r--r--sd/qa/unit/data/pptx/pass/ofz46160-1.pptxbin0 -> 21771 bytes
-rw-r--r--sd/qa/unit/data/pptx/predefined-table-style.pptxbin0 -> 36430 bytes
-rw-r--r--sd/qa/unit/data/pptx/presetDashDot.pptxbin0 -> 11273 bytes
-rw-r--r--sd/qa/unit/data/pptx/rightToLeftParagraph.pptxbin0 -> 31841 bytes
-rw-r--r--sd/qa/unit/data/pptx/shape-blur-effect.pptxbin0 -> 33285 bytes
-rw-r--r--sd/qa/unit/data/pptx/shape-glow-effect.pptxbin0 -> 13691 bytes
-rw-r--r--sd/qa/unit/data/pptx/shape-soft-edges.pptxbin0 -> 32995 bytes
-rw-r--r--sd/qa/unit/data/pptx/shape-text-rotate.pptxbin0 -> 33784 bytes
-rw-r--r--sd/qa/unit/data/pptx/slidenum_field.pptxbin0 -> 32715 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-accent-process.pptxbin0 -> 46326 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-autoTxRot.pptxbin0 -> 58937 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-autofit-sync.pptxbin0 -> 41874 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-background-drawingml-fallback.pptxbin0 -> 40964 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-background.pptxbin0 -> 50424 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-bullet-list.pptxbin0 -> 40468 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-center-cycle.pptxbin0 -> 44405 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-chevron.pptxbin0 -> 34076 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-children.pptxbin0 -> 53014 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-cnt.pptxbin0 -> 47360 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-composite-infer-right.pptxbin0 -> 23234 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-continuous-block-process.pptxbin0 -> 46204 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-cycle-matrix.pptxbin0 -> 56986 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-cycle.pptxbin0 -> 35322 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-data-follow.pptxbin0 -> 56896 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-dir.pptxbin0 -> 41593 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-font-size.pptxbin0 -> 63915 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-interopgrabbag.pptxbin0 -> 39419 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-linear-rule-vert.pptxbin0 -> 73085 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-linear-rule.pptxbin0 -> 43743 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-maxdepth.pptxbin0 -> 43256 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-missing-bullet.pptxbin0 -> 30139 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-multidirectional.pptxbin0 -> 43588 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-org-chart.pptxbin0 -> 57764 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-org-chart2.pptxbin0 -> 64524 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-picture-strip.pptxbin0 -> 52395 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-preserve.pptxbin0 -> 40598 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-pyramid-1child.pptxbin0 -> 40059 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-pyramid.pptxbin0 -> 44629 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-recursion.pptxbin0 -> 52943 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-rightoleftblockdiagram.pptxbin0 -> 43399 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-rotation.pptxbin0 -> 43886 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-rotation2.pptxbin0 -> 43658 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-snake-rows.pptxbin0 -> 52877 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-tdf134221.pptxbin0 -> 49627 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-text.pptxbin0 -> 38762 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-vertical-block-list.pptxbin0 -> 47533 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart-vertical-box-list.pptxbin0 -> 43018 bytes
-rw-r--r--sd/qa/unit/data/pptx/smartart1.pptxbin0 -> 43385 bytes
-rw-r--r--sd/qa/unit/data/pptx/table-list.pptxbin0 -> 52249 bytes
-rw-r--r--sd/qa/unit/data/pptx/tableBorderLineStyle.pptxbin0 -> 51776 bytes
-rw-r--r--sd/qa/unit/data/pptx/tablescale.pptxbin0 -> 44606 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf100065.pptxbin0 -> 36317 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf100926.pptxbin0 -> 32382 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf100926_ODP.pptxbin0 -> 32382 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf103347.pptxbin0 -> 35161 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf103473.pptxbin0 -> 26752 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf103477.pptxbin0 -> 64312 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf103792.pptxbin0 -> 14273 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf103800.pptxbin0 -> 30131 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf103876.pptxbin0 -> 29585 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf104015.pptxbin0 -> 19185 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf104201.pptxbin0 -> 15979 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf104445.pptxbin0 -> 14291 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf104722.pptxbin0 -> 40497 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf104786.pptxbin0 -> 35818 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf104788.pptxbin0 -> 82873 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf104789.pptxbin0 -> 22544 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf104792-smart-art-animation.pptxbin0 -> 41239 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf105150.pptxbin0 -> 31961 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf105739.pptxbin0 -> 30709 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf106638.pptxbin0 -> 447309 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf106867.pptxbin0 -> 52203 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf107608.pptxbin0 -> 31369 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf108926.pptbin0 -> 164864 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf109067.pptxbin0 -> 20183 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf109187.pptxbin0 -> 34647 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf111518.pptxbin0 -> 30463 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf111786.pptxbin0 -> 24566 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf111789.pptxbin0 -> 33637 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf111863.pptxbin0 -> 30755 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf111884.pptxbin0 -> 30898 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf112086.pptxbin0 -> 30542 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf112088.pptxbin0 -> 30317 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf112089.pptxbin0 -> 46671 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf112209.pptxbin0 -> 28536 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf112280.pptxbin0 -> 30309 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf112333.pptxbin0 -> 30459 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf112334.pptxbin0 -> 30041 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf112633.pptxbin0 -> 33697 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf113163.pptxbin0 -> 44937 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf113198.pptxbin0 -> 13847 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf113818-swivel.pptxbin0 -> 33604 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf113822underline.pptxbin0 -> 34449 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf114821.pptxbin0 -> 50235 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf114845_rotateShape.pptxbin0 -> 45018 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf114848.pptxbin0 -> 117854 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf114913.pptxbin0 -> 33238 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf115394-zero.pptxbin0 -> 34352 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf115394.pptxbin0 -> 31282 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf116350-texteffects.pptxbin0 -> 38333 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf118776.pptxbin0 -> 31591 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf119015.pptxbin0 -> 11652 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf119087.pptxbin0 -> 15035 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf119118.pptxbin0 -> 31815 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf119187.pptxbin0 -> 18886 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf119649.pptxbin0 -> 21228 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf120028.pptxbin0 -> 30465 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf120573.pptxbin0 -> 243853 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf123090.pptxbin0 -> 34570 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf123684.pptxbin0 -> 142961 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf124457.pptxbin0 -> 35132 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf125071.pptxbin0 -> 35409 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf125346.pptxbin0 -> 22079 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf125346_2.pptxbin0 -> 24482 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf125360.pptxbin0 -> 15379 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf125360_1.pptxbin0 -> 15480 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf125360_2.pptxbin0 -> 15213 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf125551.pptxbin0 -> 131374 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf125554.pptxbin0 -> 32967 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptxbin0 -> 34718 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf126234.pptxbin0 -> 34091 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf126324.pptxbin0 -> 30634 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf126741.pptxbin0 -> 32437 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf127090.odpbin0 -> 12415 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf127129.pptxbin0 -> 30143 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf127237.pptxbin0 -> 34180 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf127964.pptxbin0 -> 34018 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf128212.pptxbin0 -> 16921 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf128213-shaperot.pptxbin0 -> 16937 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf128213.pptxbin0 -> 16938 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf128550.pptxbin0 -> 30230 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf128596.pptxbin0 -> 29444 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf128684.pptxbin0 -> 58086 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf128952.pptxbin0 -> 25578 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf129372.pptxbin0 -> 33865 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf129686.pptxbin0 -> 35331 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf130058.pptxbin0 -> 40724 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf131390.pptxbin0 -> 35286 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf131553.pptxbin0 -> 70111 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf131554.pptxbin0 -> 21065 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf131905.pptxbin0 -> 35474 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf132282.pptxbin0 -> 56323 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf132472.pptxbin0 -> 33439 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf134053_dashdot.pptxbin0 -> 14891 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf134174.pptxbin0 -> 186296 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf134210.pptxbin0 -> 125281 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf135843.pptxbin0 -> 22951 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf135843_export.pptxbin0 -> 32460 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf135843_insideH.pptxbin0 -> 33449 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf136830.pptxbin0 -> 14105 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf137367.pptxbin0 -> 35083 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf137675.pptxbin0 -> 23802 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf138148.pptxbin0 -> 21629 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf140714.pptxbin0 -> 28384 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf140852.pptxbin0 -> 49776 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf140865Wordart3D.pptxbin0 -> 17158 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf141704.pptxbin0 -> 25376 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf142590.pptxbin0 -> 35022 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf142645.pptxbin0 -> 32953 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf142648.pptxbin0 -> 36994 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf142716.pptxbin0 -> 23281 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf142913.pptxbin0 -> 35076 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf142915.pptxbin0 -> 34231 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf143126.pptxbin0 -> 35043 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf143129.pptxbin0 -> 31053 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf143222.pptxbin0 -> 53172 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf143624.pptxbin0 -> 33909 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf144092-emptyShapeTextProps.pptxbin0 -> 35472 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf144092-tableHeight.pptxbin0 -> 34887 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf144616.pptxbin0 -> 18503 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf144917.pptxbin0 -> 16033 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf144918.pptxbin0 -> 17564 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf145162.pptxbin0 -> 33770 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf146223.pptxbin0 -> 37210 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf146731.pptxbin0 -> 33273 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf147121.pptxbin0 -> 32388 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf147459.pptxbin0 -> 13686 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf147586.pptxbin0 -> 54643 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf148665.pptxbin0 -> 33343 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf148685.pptxbin0 -> 23760 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf148921.pptxbin0 -> 39848 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf148965.pptxbin0 -> 19068 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf149124.pptxbin0 -> 33988 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf149206.pptxbin0 -> 89796 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf149314.pptxbin0 -> 18829 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf149588_transparentSolidFill.pptxbin0 -> 65346 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf149697.pptxbin0 -> 16924 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf149803.pptxbin0 -> 20710 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf149961-autofitIndentation.pptxbin0 -> 34123 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf151547-transparent-white-text.pptxbin0 -> 32731 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf152186.pptxbin0 -> 21456 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf152434.pptxbin0 -> 25819 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf153036_resizedConnectorL.pptxbin0 -> 33042 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf44223.pptxbin0 -> 63723 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf50499.pptxbin0 -> 40344 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf51340.pptxbin0 -> 16503 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf54037.pptxbin0 -> 34781 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf59323.pptxbin0 -> 39322 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf62255.pptxbin0 -> 31427 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf65724.pptxbin0 -> 34421 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf79007.pptxbin0 -> 46828 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf79082.pptxbin0 -> 24786 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf84205.pptxbin0 -> 45600 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf89064.pptxbin0 -> 24629 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf89449.pptxbin0 -> 14939 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf89927.pptxbin0 -> 417178 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf89928-blackWhiteEffectThreshold.pptxbin0 -> 36640 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf90626.pptxbin0 -> 24027 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf91060.pptxbin0 -> 23274 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf91378.pptxbin0 -> 33866 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf91999_rotateShape.pptxbin0 -> 21431 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf92222.pptxbin0 -> 21267 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf93097.pptxbin0 -> 29386 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf93830.pptxbin0 -> 64463 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf93868.pptxbin0 -> 69213 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf94238.pptxbin0 -> 35015 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf95932.pptxbin0 -> 66621 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf96061.pptxbin0 -> 21022 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf98477grow.pptxbin0 -> 30023 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf98603.pptxbin0 -> 46390 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdf99030.pptxbin0 -> 59514 bytes
-rw-r--r--sd/qa/unit/data/pptx/tdfpictureplaceholder.pptxbin0 -> 28072 bytes
-rw-r--r--sd/qa/unit/data/pptx/testShapeAutofit.pptxbin0 -> 35044 bytes
-rw-r--r--sd/qa/unit/data/pptx/trigger.pptxbin0 -> 32278 bytes
-rw-r--r--sd/qa/unit/data/pptx/vertical-bracket-list.pptxbin0 -> 42124 bytes
-rw-r--r--sd/qa/unit/data/smoketest.pptxbin0 -> 29956 bytes
-rw-r--r--sd/qa/unit/data/strict_ooxml.pptxbin0 -> 29966 bytes
-rw-r--r--sd/qa/unit/data/svg/test.svg105
-rw-r--r--sd/qa/unit/data/sxi/ooo41061-1.sxibin0 -> 42492 bytes
-rw-r--r--sd/qa/unit/data/tdf100491.pptxbin0 -> 30914 bytes
-rw-r--r--sd/qa/unit/data/tdf101242_ODF.odgbin0 -> 9140 bytes
-rw-r--r--sd/qa/unit/data/tdf101242_settings.odgbin0 -> 9233 bytes
-rw-r--r--sd/qa/unit/data/tdf109317.pptxbin0 -> 39405 bytes
-rw-r--r--sd/qa/unit/data/tdf111522.odpbin0 -> 10869 bytes
-rw-r--r--sd/qa/unit/data/tdf112126.odgbin0 -> 10382 bytes
-rw-r--r--sd/qa/unit/data/tdf119392_InsertLayer.odgbin0 -> 12765 bytes
-rw-r--r--sd/qa/unit/data/tdf119956.odgbin0 -> 11124 bytes
-rw-r--r--sd/qa/unit/data/tdf120527.jpgbin0 -> 1136 bytes
-rw-r--r--sd/qa/unit/data/tdf123841.odgbin0 -> 8590 bytes
-rw-r--r--sd/qa/unit/data/tdf124708.pptbin0 -> 60928 bytes
-rw-r--r--sd/qa/unit/data/tdf126197.odpbin0 -> 10501 bytes
-rw-r--r--sd/qa/unit/data/tdf128651_CustomShapeUndo.odpbin0 -> 13504 bytes
-rw-r--r--sd/qa/unit/data/tdf129898_faulty_DrawnInSlideshow.odpbin0 -> 12607 bytes
-rw-r--r--sd/qa/unit/data/tdf130988_3D_create_lathe.odgbin0 -> 8874 bytes
-rw-r--r--sd/qa/unit/data/tdf131033_3D_SceneSizeIn2d.odgbin0 -> 9744 bytes
-rw-r--r--sd/qa/unit/data/tdf131269.pptbin0 -> 154112 bytes
-rw-r--r--sd/qa/unit/data/tdf143412.svg10
-rw-r--r--sd/qa/unit/data/tdf67248.odgbin0 -> 10302 bytes
-rw-r--r--sd/qa/unit/data/tdf80194_defaultSubscripts.fodg407
-rw-r--r--sd/qa/unit/data/tdf90338.odpbin0 -> 12553 bytes
-rw-r--r--sd/qa/unit/data/tdf90403.pptxbin0 -> 39815 bytes
-rw-r--r--sd/qa/unit/data/tdf92001.odpbin0 -> 11063 bytes
-rw-r--r--sd/qa/unit/data/tdf97808.fodp30
-rw-r--r--sd/qa/unit/data/tdf98839_ShearVFlipH.odgbin0 -> 9070 bytes
-rw-r--r--sd/qa/unit/data/tdf99396.odpbin0 -> 10956 bytes
-rw-r--r--sd/qa/unit/data/tolerance.xml3
-rw-r--r--sd/qa/unit/data/transparent-text.fodg64
-rw-r--r--sd/qa/unit/data/underline.fodp754
-rw-r--r--sd/qa/unit/data/unknown-attribute.fodp26
-rw-r--r--sd/qa/unit/data/xml/fdo47434_0.xml75
-rw-r--r--sd/qa/unit/data/xml/fdo64586_0.xml31
-rw-r--r--sd/qa/unit/data/xml/fdo71434_0.xml10
-rw-r--r--sd/qa/unit/data/xml/n593612_0.xml65
-rw-r--r--sd/qa/unit/data/xml/n758621_0.xml31
-rw-r--r--sd/qa/unit/data/xml/n758621_1.xml31
-rw-r--r--sd/qa/unit/data/xml/n762695_0.xml241
-rw-r--r--sd/qa/unit/data/xml/n762695_1.xml630
-rw-r--r--sd/qa/unit/data/xml/n819614_0.xml6613
-rw-r--r--sd/qa/unit/data/xml/n820786_0.xml3216
-rw-r--r--sd/qa/unit/data/xml/n902652_0.xml309
-rw-r--r--sd/qa/unit/data/xml/shapes-test_page0.xml1666
-rw-r--r--sd/qa/unit/data/xml/shapes-test_page1.xml2425
-rw-r--r--sd/qa/unit/data/xml/shapes-test_page2.xml3104
-rw-r--r--sd/qa/unit/data/xml/shapes-test_page3.xml714
-rw-r--r--sd/qa/unit/data/xml/shapes-test_page4.xml611
-rw-r--r--sd/qa/unit/data/xml/shapes-test_page5.xml664
-rw-r--r--sd/qa/unit/data/xml/shapes-test_page6.xml5
-rw-r--r--sd/qa/unit/data/xml/shapes-test_page7.xml10
-rw-r--r--sd/qa/unit/data/xml/tdf100491_0.xml291
-rw-r--r--sd/qa/unit/data/xml/tdf109317_0.xml495
-rw-r--r--sd/qa/unit/data/xml/tdf90338_0.xml559
-rw-r--r--sd/qa/unit/data/xml/tdf90403_0.xml4
-rw-r--r--sd/qa/unit/data/xml/tdf92001_0.xml80
-rw-r--r--sd/qa/unit/dialogs-test.cxx630
-rw-r--r--sd/qa/unit/export-tests-ooxml1.cxx1894
-rw-r--r--sd/qa/unit/export-tests-ooxml2.cxx1920
-rw-r--r--sd/qa/unit/export-tests-ooxml3.cxx2265
-rw-r--r--sd/qa/unit/export-tests.cxx1758
-rw-r--r--sd/qa/unit/filters-test.cxx118
-rw-r--r--sd/qa/unit/import-tests-smartart.cxx1851
-rw-r--r--sd/qa/unit/import-tests.cxx1987
-rw-r--r--sd/qa/unit/import-tests2.cxx2238
-rw-r--r--sd/qa/unit/layout-tests.cxx360
-rw-r--r--sd/qa/unit/misc-tests.cxx970
-rw-r--r--sd/qa/unit/sdmodeltestbase.hxx497
-rw-r--r--sd/qa/unit/tiledrendering/CallbackRecorder.hxx152
-rw-r--r--sd/qa/unit/tiledrendering/LOKitSearchTest.cxx958
-rw-r--r--sd/qa/unit/tiledrendering/data/2slides.odpbin0 -> 10984 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/MixedTest1.odgbin0 -> 25083 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/MixedTest2.odgbin0 -> 35616 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/OnePDFObject.odgbin0 -> 124632 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/PDFSearch.pdfbin0 -> 14334 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/ReplaceTest.odpbin0 -> 10854 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/TextBoxAndRect.odgbin0 -> 10474 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/cut_selection_change.odpbin0 -> 10983 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/dummy.odgbin0 -> 8183 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/dummy.odpbin0 -> 10763 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/duplicate-undo.odpbin0 -> 11346 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/insert-delete.odpbin0 -> 13178 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/language-all-text.odpbin0 -> 13083 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/notes-view.odpbin0 -> 11184 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/paste-undo.fodp34
-rw-r--r--sd/qa/unit/tiledrendering/data/paste_text_onslide.odpbin0 -> 10587 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/regenerate-diagram.pptxbin0 -> 41813 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/search-all.odpbin0 -> 10974 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/shape.odpbin0 -> 10446 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/table-column.odpbin0 -> 10526 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/table.odpbin0 -> 10559 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/tdf102223.odpbin0 -> 17335 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/tdf103083.fodp932
-rw-r--r--sd/qa/unit/tiledrendering/data/tdf104405.fodp822
-rw-r--r--sd/qa/unit/tiledrendering/data/tdf105502.odpbin0 -> 11629 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/tdf115783.fodp52
-rw-r--r--sd/qa/unit/tiledrendering/data/tdf115873-group.fodp36
-rw-r--r--sd/qa/unit/tiledrendering/data/tdf115873.fodp29
-rw-r--r--sd/qa/unit/tiledrendering/data/tdf118354.odpbin0 -> 14518 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/tdf81754.pptxbin0 -> 35503 bytes
-rw-r--r--sd/qa/unit/tiledrendering/data/title-shape.odpbin0 -> 11406 bytes
-rw-r--r--sd/qa/unit/tiledrendering/tiledrendering.cxx3007
-rw-r--r--sd/qa/unit/uiimpress.cxx1193
-rw-r--r--sd/qa/unit/uimpress.cxx110
-rw-r--r--sd/qa/unoapi/knownissues.xcl86
-rw-r--r--sd/qa/unoapi/sd.sce41
-rw-r--r--sd/res/buttons/elementary.zipbin0 -> 27171 bytes
-rw-r--r--sd/res/buttons/round-white.zipbin0 -> 10533 bytes
-rw-r--r--sd/res/buttons/simple.zipbin0 -> 4046 bytes
-rw-r--r--sd/res/buttons/sukapura.zipbin0 -> 13261 bytes
-rw-r--r--sd/res/webview/common.inc128
-rw-r--r--sd/res/webview/common.pl66
-rw-r--r--sd/res/webview/edit.asp26
-rw-r--r--sd/res/webview/edit.pl18
-rw-r--r--sd/res/webview/editpic.asp75
-rw-r--r--sd/res/webview/editpic.pl57
-rw-r--r--sd/res/webview/index.pl17
-rw-r--r--sd/res/webview/poll.asp53
-rw-r--r--sd/res/webview/poll.pl49
-rw-r--r--sd/res/webview/savepic.asp56
-rw-r--r--sd/res/webview/savepic.pl58
-rw-r--r--sd/res/webview/show.asp59
-rw-r--r--sd/res/webview/show.pl56
-rw-r--r--sd/res/webview/webcast.asp45
-rw-r--r--sd/res/webview/webcast.pl38
-rw-r--r--sd/sdi/SlideSorterController.sdi341
-rw-r--r--sd/sdi/ViewShellBase.sdi152
-rw-r--r--sd/sdi/_docsh.sdi93
-rw-r--r--sd/sdi/_drvwsh.sdi2951
-rw-r--r--sd/sdi/app.sdi93
-rw-r--r--sd/sdi/docshell.sdi31
-rw-r--r--sd/sdi/drbezob.sdi81
-rw-r--r--sd/sdi/drgrfob.sdi138
-rw-r--r--sd/sdi/drtxtob.sdi300
-rw-r--r--sd/sdi/drviewsh.sdi223
-rw-r--r--sd/sdi/grdocsh.sdi26
-rw-r--r--sd/sdi/grviewsh.sdi82
-rw-r--r--sd/sdi/mediaob.sdi26
-rw-r--r--sd/sdi/outlnvsh.sdi557
-rw-r--r--sd/sdi/sdgslots.sdi89
-rw-r--r--sd/sdi/sdraw.sdi4690
-rw-r--r--sd/sdi/sdslots.hrc27
-rw-r--r--sd/sdi/sdslots.sdi91
-rw-r--r--sd/sdi/tables.sdi193
-rw-r--r--sd/source/core/CustomAnimationCloner.cxx307
-rw-r--r--sd/source/core/CustomAnimationEffect.cxx3559
-rw-r--r--sd/source/core/CustomAnimationPreset.cxx514
-rw-r--r--sd/source/core/EffectMigration.cxx1439
-rw-r--r--sd/source/core/PageListWatcher.cxx217
-rw-r--r--sd/source/core/PageListWatcher.hxx87
-rw-r--r--sd/source/core/TransitionPreset.cxx385
-rw-r--r--sd/source/core/anminfo.cxx128
-rw-r--r--sd/source/core/annotations/Annotation.cxx480
-rw-r--r--sd/source/core/annotations/AnnotationEnumeration.cxx85
-rw-r--r--sd/source/core/cusshow.cxx101
-rw-r--r--sd/source/core/drawdoc.cxx1206
-rw-r--r--sd/source/core/drawdoc2.cxx1382
-rw-r--r--sd/source/core/drawdoc3.cxx1873
-rw-r--r--sd/source/core/drawdoc4.cxx1399
-rw-r--r--sd/source/core/drawdoc_animations.cxx54
-rw-r--r--sd/source/core/pglink.cxx128
-rw-r--r--sd/source/core/sdiocmpt.cxx117
-rw-r--r--sd/source/core/sdpage.cxx3157
-rw-r--r--sd/source/core/sdpage2.cxx651
-rw-r--r--sd/source/core/sdpage_animations.cxx160
-rw-r--r--sd/source/core/shapelist.cxx140
-rw-r--r--sd/source/core/stlfamily.cxx513
-rw-r--r--sd/source/core/stlpool.cxx1395
-rw-r--r--sd/source/core/stlsheet.cxx1459
-rw-r--r--sd/source/core/text/textapi.cxx278
-rw-r--r--sd/source/core/typemap.cxx143
-rw-r--r--sd/source/core/undo/undofactory.cxx55
-rw-r--r--sd/source/core/undo/undomanager.cxx58
-rw-r--r--sd/source/core/undo/undoobjects.cxx392
-rw-r--r--sd/source/core/undoanim.cxx280
-rw-r--r--sd/source/filter/cgm/sdcgmfilter.cxx137
-rw-r--r--sd/source/filter/eppt/eppt.cxx1464
-rw-r--r--sd/source/filter/eppt/eppt.hxx232
-rw-r--r--sd/source/filter/eppt/epptbase.hxx412
-rw-r--r--sd/source/filter/eppt/epptdef.hxx145
-rw-r--r--sd/source/filter/eppt/epptooxml.hxx189
-rw-r--r--sd/source/filter/eppt/epptso.cxx3361
-rw-r--r--sd/source/filter/eppt/escherex.cxx266
-rw-r--r--sd/source/filter/eppt/escherex.hxx64
-rw-r--r--sd/source/filter/eppt/grouptable.hxx69
-rw-r--r--sd/source/filter/eppt/pptexanimations.cxx2150
-rw-r--r--sd/source/filter/eppt/pptexanimations.hxx134
-rw-r--r--sd/source/filter/eppt/pptexsoundcollection.cxx213
-rw-r--r--sd/source/filter/eppt/pptexsoundcollection.hxx71
-rw-r--r--sd/source/filter/eppt/pptx-animations.cxx1539
-rw-r--r--sd/source/filter/eppt/pptx-animations.hxx25
-rw-r--r--sd/source/filter/eppt/pptx-epptbase.cxx1000
-rw-r--r--sd/source/filter/eppt/pptx-epptooxml.cxx2594
-rw-r--r--sd/source/filter/eppt/pptx-grouptable.cxx85
-rw-r--r--sd/source/filter/eppt/pptx-stylesheet.cxx489
-rw-r--r--sd/source/filter/eppt/pptx-text.cxx1400
-rw-r--r--sd/source/filter/eppt/text.hxx254
-rw-r--r--sd/source/filter/grf/sdgrffilter.cxx304
-rw-r--r--sd/source/filter/html/HtmlOptionsDialog.cxx203
-rw-r--r--sd/source/filter/html/buttonset.cxx290
-rw-r--r--sd/source/filter/html/buttonset.hxx46
-rw-r--r--sd/source/filter/html/htmlattr.cxx72
-rw-r--r--sd/source/filter/html/htmlattr.hxx40
-rw-r--r--sd/source/filter/html/htmlex.cxx3186
-rw-r--r--sd/source/filter/html/htmlex.hxx237
-rw-r--r--sd/source/filter/html/htmlpublishmode.hxx31
-rw-r--r--sd/source/filter/html/pubdlg.cxx1539
-rw-r--r--sd/source/filter/html/sdhtmlfilter.cxx51
-rw-r--r--sd/source/filter/pdf/sdpdffilter.cxx201
-rw-r--r--sd/source/filter/ppt/ppt97animations.cxx682
-rw-r--r--sd/source/filter/ppt/ppt97animations.hxx156
-rw-r--r--sd/source/filter/ppt/pptanimations.hxx209
-rw-r--r--sd/source/filter/ppt/pptatom.cxx104
-rw-r--r--sd/source/filter/ppt/pptatom.hxx106
-rw-r--r--sd/source/filter/ppt/pptin.cxx2821
-rw-r--r--sd/source/filter/ppt/pptin.hxx92
-rw-r--r--sd/source/filter/ppt/pptinanimations.cxx3294
-rw-r--r--sd/source/filter/ppt/pptinanimations.hxx115
-rw-r--r--sd/source/filter/ppt/propread.cxx615
-rw-r--r--sd/source/filter/ppt/propread.hxx151
-rw-r--r--sd/source/filter/sdfilter.cxx108
-rw-r--r--sd/source/filter/sdpptwrp.cxx377
-rw-r--r--sd/source/filter/xml/sdtransform.cxx368
-rw-r--r--sd/source/filter/xml/sdtransform.hxx28
-rw-r--r--sd/source/filter/xml/sdxmlwrp.cxx1056
-rw-r--r--sd/source/helper/simplereferencecomponent.cxx72
-rw-r--r--sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx773
-rw-r--r--sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx777
-rw-r--r--sd/source/ui/accessibility/AccessibleOutlineEditSource.cxx199
-rw-r--r--sd/source/ui/accessibility/AccessibleOutlineView.cxx238
-rw-r--r--sd/source/ui/accessibility/AccessiblePageShape.cxx261
-rw-r--r--sd/source/ui/accessibility/AccessiblePresentationGraphicShape.cxx76
-rw-r--r--sd/source/ui/accessibility/AccessiblePresentationOLEShape.cxx84
-rw-r--r--sd/source/ui/accessibility/AccessiblePresentationShape.cxx146
-rw-r--r--sd/source/ui/accessibility/AccessibleSlideSorterObject.cxx429
-rw-r--r--sd/source/ui/accessibility/AccessibleSlideSorterView.cxx950
-rw-r--r--sd/source/ui/accessibility/AccessibleViewForwarder.cxx104
-rw-r--r--sd/source/ui/accessibility/SdShapeTypes.cxx132
-rw-r--r--sd/source/ui/animations/CustomAnimationDialog.cxx2090
-rw-r--r--sd/source/ui/animations/CustomAnimationDialog.hxx141
-rw-r--r--sd/source/ui/animations/CustomAnimationList.cxx1231
-rw-r--r--sd/source/ui/animations/CustomAnimationPane.cxx2578
-rw-r--r--sd/source/ui/animations/STLPropertySet.cxx113
-rw-r--r--sd/source/ui/animations/STLPropertySet.hxx73
-rw-r--r--sd/source/ui/animations/SlideTransitionPane.cxx1155
-rw-r--r--sd/source/ui/animations/motionpathtag.cxx1200
-rw-r--r--sd/source/ui/animations/motionpathtag.hxx114
-rw-r--r--sd/source/ui/annotations/annotationmanager.cxx1220
-rw-r--r--sd/source/ui/annotations/annotationmanagerimpl.hxx141
-rw-r--r--sd/source/ui/annotations/annotationtag.cxx662
-rw-r--r--sd/source/ui/annotations/annotationtag.hxx89
-rw-r--r--sd/source/ui/annotations/annotationwindow.cxx802
-rw-r--r--sd/source/ui/annotations/annotationwindow.hxx143
-rw-r--r--sd/source/ui/app/optsitem.cxx1407
-rw-r--r--sd/source/ui/app/scalectrl.cxx108
-rw-r--r--sd/source/ui/app/sddll.cxx269
-rw-r--r--sd/source/ui/app/sdmod.cxx216
-rw-r--r--sd/source/ui/app/sdmod1.cxx638
-rw-r--r--sd/source/ui/app/sdmod2.cxx809
-rw-r--r--sd/source/ui/app/sdpopup.cxx318
-rw-r--r--sd/source/ui/app/sdxfer.cxx807
-rw-r--r--sd/source/ui/app/tmplctrl.cxx110
-rw-r--r--sd/source/ui/controller/displaymodecontroller.cxx264
-rw-r--r--sd/source/ui/controller/slidelayoutcontroller.cxx380
-rw-r--r--sd/source/ui/controller/slidelayoutcontroller.hxx47
-rw-r--r--sd/source/ui/dlg/AnimationChildWindow.cxx50
-rw-r--r--sd/source/ui/dlg/BulletAndPositionDlg.cxx1293
-rw-r--r--sd/source/ui/dlg/LayerTabBar.cxx437
-rw-r--r--sd/source/ui/dlg/NavigatorChildWindow.cxx100
-rw-r--r--sd/source/ui/dlg/PaneChildWindows.cxx107
-rw-r--r--sd/source/ui/dlg/PaneDockingWindow.cxx127
-rw-r--r--sd/source/ui/dlg/PaneShells.cxx79
-rw-r--r--sd/source/ui/dlg/PhotoAlbumDialog.cxx775
-rw-r--r--sd/source/ui/dlg/PhotoAlbumDialog.hxx91
-rw-r--r--sd/source/ui/dlg/RemoteDialog.cxx49
-rw-r--r--sd/source/ui/dlg/RemoteDialog.hxx32
-rw-r--r--sd/source/ui/dlg/RemoteDialogClientBox.cxx134
-rw-r--r--sd/source/ui/dlg/RemoteDialogClientBox.hxx85
-rw-r--r--sd/source/ui/dlg/SpellDialogChildWindow.cxx172
-rw-r--r--sd/source/ui/dlg/TemplateScanner.cxx342
-rw-r--r--sd/source/ui/dlg/animobjs.cxx1134
-rw-r--r--sd/source/ui/dlg/assclass.cxx160
-rw-r--r--sd/source/ui/dlg/brkdlg.cxx156
-rw-r--r--sd/source/ui/dlg/copydlg.cxx263
-rw-r--r--sd/source/ui/dlg/custsdlg.cxx478
-rw-r--r--sd/source/ui/dlg/diactrl.cxx185
-rw-r--r--sd/source/ui/dlg/dlgchar.cxx70
-rw-r--r--sd/source/ui/dlg/dlgfield.cxx301
-rw-r--r--sd/source/ui/dlg/dlgolbul.cxx172
-rw-r--r--sd/source/ui/dlg/dlgpage.cxx116
-rw-r--r--sd/source/ui/dlg/dlgsnap.cxx185
-rw-r--r--sd/source/ui/dlg/filedlg.cxx267
-rw-r--r--sd/source/ui/dlg/gluectrl.cxx200
-rw-r--r--sd/source/ui/dlg/headerfooterdlg.cxx759
-rw-r--r--sd/source/ui/dlg/ins_paste.cxx34
-rw-r--r--sd/source/ui/dlg/inspagob.cxx126
-rw-r--r--sd/source/ui/dlg/layeroptionsdlg.cxx62
-rw-r--r--sd/source/ui/dlg/masterlayoutdlg.cxx133
-rw-r--r--sd/source/ui/dlg/morphdlg.cxx107
-rw-r--r--sd/source/ui/dlg/navigatr.cxx735
-rw-r--r--sd/source/ui/dlg/paragr.cxx169
-rw-r--r--sd/source/ui/dlg/present.cxx323
-rw-r--r--sd/source/ui/dlg/prltempl.cxx305
-rw-r--r--sd/source/ui/dlg/prntopts.cxx235
-rw-r--r--sd/source/ui/dlg/sdabstdlg.cxx55
-rw-r--r--sd/source/ui/dlg/sddlgfact.cxx739
-rw-r--r--sd/source/ui/dlg/sddlgfact.hxx448
-rw-r--r--sd/source/ui/dlg/sdpreslt.cxx267
-rw-r--r--sd/source/ui/dlg/sdtreelb.cxx1206
-rw-r--r--sd/source/ui/dlg/sduiexp.cxx33
-rw-r--r--sd/source/ui/dlg/tabtempl.cxx160
-rw-r--r--sd/source/ui/dlg/titledockwin.cxx261
-rw-r--r--sd/source/ui/dlg/tpaction.cxx801
-rw-r--r--sd/source/ui/dlg/tpoption.cxx618
-rw-r--r--sd/source/ui/dlg/unchss.cxx119
-rw-r--r--sd/source/ui/dlg/vectdlg.cxx336
-rw-r--r--sd/source/ui/docshell/docshel2.cxx416
-rw-r--r--sd/source/ui/docshell/docshel3.cxx443
-rw-r--r--sd/source/ui/docshell/docshel4.cxx1002
-rw-r--r--sd/source/ui/docshell/docshell.cxx515
-rw-r--r--sd/source/ui/docshell/grdocsh.cxx61
-rw-r--r--sd/source/ui/docshell/sdclient.cxx184
-rw-r--r--sd/source/ui/framework/configuration/ChangeRequestQueue.cxx28
-rw-r--r--sd/source/ui/framework/configuration/ChangeRequestQueue.hxx48
-rw-r--r--sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.cxx180
-rw-r--r--sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.hxx126
-rw-r--r--sd/source/ui/framework/configuration/Configuration.cxx311
-rw-r--r--sd/source/ui/framework/configuration/ConfigurationClassifier.cxx167
-rw-r--r--sd/source/ui/framework/configuration/ConfigurationClassifier.hxx165
-rw-r--r--sd/source/ui/framework/configuration/ConfigurationController.cxx541
-rw-r--r--sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.cxx192
-rw-r--r--sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.hxx138
-rw-r--r--sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.cxx303
-rw-r--r--sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.hxx141
-rw-r--r--sd/source/ui/framework/configuration/ConfigurationTracer.cxx73
-rw-r--r--sd/source/ui/framework/configuration/ConfigurationTracer.hxx58
-rw-r--r--sd/source/ui/framework/configuration/ConfigurationUpdater.cxx376
-rw-r--r--sd/source/ui/framework/configuration/ConfigurationUpdater.hxx209
-rw-r--r--sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.cxx81
-rw-r--r--sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.hxx98
-rw-r--r--sd/source/ui/framework/configuration/ResourceFactoryManager.cxx197
-rw-r--r--sd/source/ui/framework/configuration/ResourceFactoryManager.hxx120
-rw-r--r--sd/source/ui/framework/configuration/ResourceId.cxx503
-rw-r--r--sd/source/ui/framework/configuration/UpdateRequest.cxx47
-rw-r--r--sd/source/ui/framework/configuration/UpdateRequest.hxx70
-rw-r--r--sd/source/ui/framework/configuration/debugtrace.hxx15
-rw-r--r--sd/source/ui/framework/factories/BasicPaneFactory.cxx432
-rw-r--r--sd/source/ui/framework/factories/BasicPaneFactory.hxx131
-rw-r--r--sd/source/ui/framework/factories/BasicToolBarFactory.cxx161
-rw-r--r--sd/source/ui/framework/factories/BasicToolBarFactory.hxx84
-rw-r--r--sd/source/ui/framework/factories/BasicViewFactory.cxx518
-rw-r--r--sd/source/ui/framework/factories/BasicViewFactory.hxx129
-rw-r--r--sd/source/ui/framework/factories/ChildWindowPane.cxx219
-rw-r--r--sd/source/ui/framework/factories/ChildWindowPane.hxx101
-rw-r--r--sd/source/ui/framework/factories/FrameWindowPane.cxx39
-rw-r--r--sd/source/ui/framework/factories/FrameWindowPane.hxx50
-rw-r--r--sd/source/ui/framework/factories/FullScreenPane.cxx226
-rw-r--r--sd/source/ui/framework/factories/FullScreenPane.hxx85
-rw-r--r--sd/source/ui/framework/factories/Pane.cxx178
-rw-r--r--sd/source/ui/framework/factories/PresentationFactory.cxx192
-rw-r--r--sd/source/ui/framework/factories/ViewShellWrapper.cxx252
-rw-r--r--sd/source/ui/framework/module/CenterViewFocusModule.cxx151
-rw-r--r--sd/source/ui/framework/module/CenterViewFocusModule.hxx90
-rw-r--r--sd/source/ui/framework/module/DrawModule.cxx41
-rw-r--r--sd/source/ui/framework/module/ImpressModule.cxx51
-rw-r--r--sd/source/ui/framework/module/ModuleController.cxx244
-rw-r--r--sd/source/ui/framework/module/PresentationModule.cxx36
-rw-r--r--sd/source/ui/framework/module/ShellStackGuard.cxx150
-rw-r--r--sd/source/ui/framework/module/ShellStackGuard.hxx94
-rw-r--r--sd/source/ui/framework/module/SlideSorterModule.cxx313
-rw-r--r--sd/source/ui/framework/module/SlideSorterModule.hxx97
-rw-r--r--sd/source/ui/framework/module/ToolBarModule.cxx191
-rw-r--r--sd/source/ui/framework/module/ToolBarModule.hxx81
-rw-r--r--sd/source/ui/framework/module/ViewTabBarModule.cxx180
-rw-r--r--sd/source/ui/framework/module/ViewTabBarModule.hxx83
-rw-r--r--sd/source/ui/framework/tools/FrameworkHelper.cxx952
-rw-r--r--sd/source/ui/func/bulmaper.cxx104
-rw-r--r--sd/source/ui/func/fuarea.cxx99
-rw-r--r--sd/source/ui/func/fubullet.cxx330
-rw-r--r--sd/source/ui/func/fuchar.cxx139
-rw-r--r--sd/source/ui/func/fucon3d.cxx474
-rw-r--r--sd/source/ui/func/fuconarc.cxx254
-rw-r--r--sd/source/ui/func/fuconbez.cxx556
-rw-r--r--sd/source/ui/func/fuconcs.cxx261
-rw-r--r--sd/source/ui/func/fuconnct.cxx71
-rw-r--r--sd/source/ui/func/fuconrec.cxx1096
-rw-r--r--sd/source/ui/func/fuconstr.cxx414
-rw-r--r--sd/source/ui/func/fuconuno.cxx150
-rw-r--r--sd/source/ui/func/fucopy.cxx288
-rw-r--r--sd/source/ui/func/fucushow.cxx91
-rw-r--r--sd/source/ui/func/fudraw.cxx820
-rw-r--r--sd/source/ui/func/fudspord.cxx131
-rw-r--r--sd/source/ui/func/fuediglu.cxx471
-rw-r--r--sd/source/ui/func/fuexecuteinteraction.cxx237
-rw-r--r--sd/source/ui/func/fuexpand.cxx256
-rw-r--r--sd/source/ui/func/fuformatpaintbrush.cxx276
-rw-r--r--sd/source/ui/func/fuhhconv.cxx256
-rw-r--r--sd/source/ui/func/fuinsert.cxx767
-rw-r--r--sd/source/ui/func/fuinsfil.cxx725
-rw-r--r--sd/source/ui/func/fuline.cxx109
-rw-r--r--sd/source/ui/func/fulinend.cxx154
-rw-r--r--sd/source/ui/func/fulink.cxx65
-rw-r--r--sd/source/ui/func/fumeasur.cxx72
-rw-r--r--sd/source/ui/func/fumorph.cxx508
-rw-r--r--sd/source/ui/func/funavig.cxx154
-rw-r--r--sd/source/ui/func/fuoaprms.cxx800
-rw-r--r--sd/source/ui/func/fuolbull.cxx340
-rw-r--r--sd/source/ui/func/fuoltext.cxx305
-rw-r--r--sd/source/ui/func/fupage.cxx648
-rw-r--r--sd/source/ui/func/fuparagr.cxx162
-rw-r--r--sd/source/ui/func/fupoor.cxx1135
-rw-r--r--sd/source/ui/func/fuprlout.cxx277
-rw-r--r--sd/source/ui/func/fuprobjs.cxx154
-rw-r--r--sd/source/ui/func/fuscale.cxx179
-rw-r--r--sd/source/ui/func/fusearch.cxx140
-rw-r--r--sd/source/ui/func/fusel.cxx1328
-rw-r--r--sd/source/ui/func/fusldlg.cxx226
-rw-r--r--sd/source/ui/func/fusnapln.cxx196
-rw-r--r--sd/source/ui/func/fusumry.cxx229
-rw-r--r--sd/source/ui/func/futempl.cxx638
-rw-r--r--sd/source/ui/func/futext.cxx1464
-rw-r--r--sd/source/ui/func/futhes.cxx132
-rw-r--r--sd/source/ui/func/futransf.cxx132
-rw-r--r--sd/source/ui/func/futxtatt.cxx80
-rw-r--r--sd/source/ui/func/fuvect.cxx87
-rw-r--r--sd/source/ui/func/fuzoom.cxx219
-rw-r--r--sd/source/ui/func/sdundogr.cxx66
-rw-r--r--sd/source/ui/func/smarttag.cxx333
-rw-r--r--sd/source/ui/func/undoback.cxx105
-rw-r--r--sd/source/ui/func/undoheaderfooter.cxx53
-rw-r--r--sd/source/ui/func/undolayer.cxx78
-rw-r--r--sd/source/ui/func/undopage.cxx99
-rw-r--r--sd/source/ui/func/unmovss.cxx95
-rw-r--r--sd/source/ui/func/unoaprms.cxx96
-rw-r--r--sd/source/ui/func/unprlout.cxx73
-rw-r--r--sd/source/ui/inc/AccessibleDocumentViewBase.hxx324
-rw-r--r--sd/source/ui/inc/AccessibleDrawDocumentView.hxx165
-rw-r--r--sd/source/ui/inc/AccessibleOutlineEditSource.hxx90
-rw-r--r--sd/source/ui/inc/AccessibleOutlineView.hxx119
-rw-r--r--sd/source/ui/inc/AccessiblePageShape.hxx117
-rw-r--r--sd/source/ui/inc/AccessiblePresentationGraphicShape.hxx60
-rw-r--r--sd/source/ui/inc/AccessiblePresentationOLEShape.hxx57
-rw-r--r--sd/source/ui/inc/AccessiblePresentationShape.hxx61
-rw-r--r--sd/source/ui/inc/AccessibleSlideSorterObject.hxx189
-rw-r--r--sd/source/ui/inc/AccessibleSlideSorterView.hxx255
-rw-r--r--sd/source/ui/inc/AccessibleViewForwarder.hxx92
-rw-r--r--sd/source/ui/inc/AnimationChildWindow.hxx45
-rw-r--r--sd/source/ui/inc/BezierObjectBar.hxx51
-rw-r--r--sd/source/ui/inc/BreakDlg.hxx64
-rw-r--r--sd/source/ui/inc/BulletAndPositionDlg.hxx157
-rw-r--r--sd/source/ui/inc/Client.hxx45
-rw-r--r--sd/source/ui/inc/ClientView.hxx43
-rw-r--r--sd/source/ui/inc/CustomAnimationList.hxx169
-rw-r--r--sd/source/ui/inc/CustomAnimationPane.hxx179
-rw-r--r--sd/source/ui/inc/DocumentRenderer.hxx63
-rw-r--r--sd/source/ui/inc/DrawController.hxx327
-rw-r--r--sd/source/ui/inc/DrawDocShell.hxx235
-rw-r--r--sd/source/ui/inc/DrawSubController.hxx46
-rw-r--r--sd/source/ui/inc/DrawViewShell.hxx513
-rw-r--r--sd/source/ui/inc/EventMultiplexer.hxx172
-rw-r--r--sd/source/ui/inc/FormShellManager.hxx139
-rw-r--r--sd/source/ui/inc/FrameView.hxx213
-rw-r--r--sd/source/ui/inc/GraphicDocShell.hxx54
-rw-r--r--sd/source/ui/inc/GraphicObjectBar.hxx54
-rw-r--r--sd/source/ui/inc/GraphicViewShell.hxx72
-rw-r--r--sd/source/ui/inc/GraphicViewShellBase.hxx50
-rw-r--r--sd/source/ui/inc/ImpressViewShellBase.hxx50
-rw-r--r--sd/source/ui/inc/LayerTabBar.hxx108
-rw-r--r--sd/source/ui/inc/MasterPageObserver.hxx119
-rw-r--r--sd/source/ui/inc/MediaObjectBar.hxx56
-rw-r--r--sd/source/ui/inc/NavigatorChildWindow.hxx40
-rw-r--r--sd/source/ui/inc/OutlineBulletDlg.hxx51
-rw-r--r--sd/source/ui/inc/OutlineView.hxx230
-rw-r--r--sd/source/ui/inc/OutlineViewShell.hxx163
-rw-r--r--sd/source/ui/inc/OutlineViewShellBase.hxx43
-rw-r--r--sd/source/ui/inc/OutlinerIteratorImpl.hxx239
-rw-r--r--sd/source/ui/inc/PaneChildWindows.hxx65
-rw-r--r--sd/source/ui/inc/PaneDockingWindow.hxx66
-rw-r--r--sd/source/ui/inc/PaneShells.hxx63
-rw-r--r--sd/source/ui/inc/PresentationViewShell.hxx70
-rw-r--r--sd/source/ui/inc/PresentationViewShellBase.hxx46
-rw-r--r--sd/source/ui/inc/PreviewRenderer.hxx141
-rw-r--r--sd/source/ui/inc/RemoteServer.hxx88
-rw-r--r--sd/source/ui/inc/Ruler.hxx62
-rw-r--r--sd/source/ui/inc/SdUnoDrawView.hxx116
-rw-r--r--sd/source/ui/inc/SdUnoOutlineView.hxx82
-rw-r--r--sd/source/ui/inc/SdUnoSlideView.hxx82
-rw-r--r--sd/source/ui/inc/ShellFactory.hxx52
-rw-r--r--sd/source/ui/inc/SlideSorter.hxx248
-rw-r--r--sd/source/ui/inc/SlideSorterViewShell.hxx232
-rw-r--r--sd/source/ui/inc/SlideSorterViewShellBase.hxx43
-rw-r--r--sd/source/ui/inc/SlideTransitionPane.hxx137
-rw-r--r--sd/source/ui/inc/SpellDialogChildWindow.hxx86
-rw-r--r--sd/source/ui/inc/TabControl.hxx107
-rw-r--r--sd/source/ui/inc/TableDesignPane.hxx118
-rw-r--r--sd/source/ui/inc/TemplateScanner.hxx175
-rw-r--r--sd/source/ui/inc/TextObjectBar.hxx58
-rw-r--r--sd/source/ui/inc/ToolBarManager.hxx273
-rw-r--r--sd/source/ui/inc/View.hxx300
-rw-r--r--sd/source/ui/inc/ViewClipboard.hxx78
-rw-r--r--sd/source/ui/inc/ViewShell.hxx559
-rw-r--r--sd/source/ui/inc/ViewShellBase.hxx246
-rw-r--r--sd/source/ui/inc/ViewShellHint.hxx57
-rw-r--r--sd/source/ui/inc/ViewShellImplementation.hxx150
-rw-r--r--sd/source/ui/inc/ViewShellManager.hxx195
-rw-r--r--sd/source/ui/inc/ViewTabBar.hxx184
-rw-r--r--sd/source/ui/inc/Window.hxx213
-rw-r--r--sd/source/ui/inc/WindowUpdater.hxx124
-rw-r--r--sd/source/ui/inc/animobjs.hxx163
-rw-r--r--sd/source/ui/inc/annotationmanager.hxx46
-rw-r--r--sd/source/ui/inc/assclass.hxx68
-rw-r--r--sd/source/ui/inc/bulmaper.hxx37
-rw-r--r--sd/source/ui/inc/copydlg.hxx67
-rw-r--r--sd/source/ui/inc/createtableobjectbar.hxx37
-rw-r--r--sd/source/ui/inc/custsdlg.hxx91
-rw-r--r--sd/source/ui/inc/diactrl.hxx68
-rw-r--r--sd/source/ui/inc/dlg_char.hxx41
-rw-r--r--sd/source/ui/inc/dlgfield.hxx56
-rw-r--r--sd/source/ui/inc/dlgpage.hxx48
-rw-r--r--sd/source/ui/inc/dlgsnap.hxx66
-rw-r--r--sd/source/ui/inc/drawview.hxx72
-rw-r--r--sd/source/ui/inc/filedlg.hxx57
-rw-r--r--sd/source/ui/inc/framework/Configuration.hxx181
-rw-r--r--sd/source/ui/inc/framework/ConfigurationController.hxx180
-rw-r--r--sd/source/ui/inc/framework/DrawModule.hxx46
-rw-r--r--sd/source/ui/inc/framework/FrameworkHelper.hxx340
-rw-r--r--sd/source/ui/inc/framework/ImpressModule.hxx46
-rw-r--r--sd/source/ui/inc/framework/ModuleController.hxx114
-rw-r--r--sd/source/ui/inc/framework/Pane.hxx141
-rw-r--r--sd/source/ui/inc/framework/PresentationFactory.hxx77
-rw-r--r--sd/source/ui/inc/framework/PresentationModule.hxx46
-rw-r--r--sd/source/ui/inc/framework/ResourceId.hxx213
-rw-r--r--sd/source/ui/inc/framework/ViewShellWrapper.hxx131
-rw-r--r--sd/source/ui/inc/fuarea.hxx48
-rw-r--r--sd/source/ui/inc/fubullet.hxx54
-rw-r--r--sd/source/ui/inc/fuchar.hxx49
-rw-r--r--sd/source/ui/inc/fucon3d.hxx61
-rw-r--r--sd/source/ui/inc/fuconarc.hxx54
-rw-r--r--sd/source/ui/inc/fuconbez.hxx76
-rw-r--r--sd/source/ui/inc/fuconcs.hxx64
-rw-r--r--sd/source/ui/inc/fuconnct.hxx46
-rw-r--r--sd/source/ui/inc/fuconrec.hxx71
-rw-r--r--sd/source/ui/inc/fuconstr.hxx64
-rw-r--r--sd/source/ui/inc/fuconuno.hxx64
-rw-r--r--sd/source/ui/inc/fucopy.hxx47
-rw-r--r--sd/source/ui/inc/fucushow.hxx45
-rw-r--r--sd/source/ui/inc/fudraw.hxx85
-rw-r--r--sd/source/ui/inc/fudspord.hxx62
-rw-r--r--sd/source/ui/inc/fuediglu.hxx64
-rw-r--r--sd/source/ui/inc/fuexecuteinteraction.hxx44
-rw-r--r--sd/source/ui/inc/fuexpand.hxx45
-rw-r--r--sd/source/ui/inc/fuformatpaintbrush.hxx61
-rw-r--r--sd/source/ui/inc/fuhhconv.hxx58
-rw-r--r--sd/source/ui/inc/fuinsert.hxx112
-rw-r--r--sd/source/ui/inc/fuinsfil.hxx60
-rw-r--r--sd/source/ui/inc/fuline.hxx49
-rw-r--r--sd/source/ui/inc/fulinend.hxx49
-rw-r--r--sd/source/ui/inc/fulink.hxx46
-rw-r--r--sd/source/ui/inc/fumeasur.hxx46
-rw-r--r--sd/source/ui/inc/fumorph.hxx90
-rw-r--r--sd/source/ui/inc/funavig.hxx46
-rw-r--r--sd/source/ui/inc/fuoaprms.hxx46
-rw-r--r--sd/source/ui/inc/fuolbull.hxx62
-rw-r--r--sd/source/ui/inc/fuoltext.hxx76
-rw-r--r--sd/source/ui/inc/fupage.hxx73
-rw-r--r--sd/source/ui/inc/fuparagr.hxx48
-rw-r--r--sd/source/ui/inc/fupoor.hxx180
-rw-r--r--sd/source/ui/inc/fuprlout.hxx51
-rw-r--r--sd/source/ui/inc/fuprobjs.hxx51
-rw-r--r--sd/source/ui/inc/fuscale.hxx45
-rw-r--r--sd/source/ui/inc/fusearch.hxx56
-rw-r--r--sd/source/ui/inc/fusel.hxx104
-rw-r--r--sd/source/ui/inc/fusldlg.hxx45
-rw-r--r--sd/source/ui/inc/fusnapln.hxx48
-rw-r--r--sd/source/ui/inc/fusumry.hxx45
-rw-r--r--sd/source/ui/inc/futempl.hxx48
-rw-r--r--sd/source/ui/inc/futext.hxx97
-rw-r--r--sd/source/ui/inc/futhes.hxx45
-rw-r--r--sd/source/ui/inc/futransf.hxx45
-rw-r--r--sd/source/ui/inc/futxtatt.hxx45
-rw-r--r--sd/source/ui/inc/fuvect.hxx46
-rw-r--r--sd/source/ui/inc/fuzoom.hxx64
-rw-r--r--sd/source/ui/inc/gluectrl.hxx68
-rw-r--r--sd/source/ui/inc/headerfooterdlg.hxx70
-rw-r--r--sd/source/ui/inc/ins_paste.hxx37
-rw-r--r--sd/source/ui/inc/inspagob.hxx57
-rw-r--r--sd/source/ui/inc/layeroptionsdlg.hxx48
-rw-r--r--sd/source/ui/inc/masterlayoutdlg.hxx61
-rw-r--r--sd/source/ui/inc/morphdlg.hxx49
-rw-r--r--sd/source/ui/inc/navigatr.hxx205
-rw-r--r--sd/source/ui/inc/optsitem.hxx580
-rw-r--r--sd/source/ui/inc/paragr.hxx36
-rw-r--r--sd/source/ui/inc/pgjump.hxx31
-rw-r--r--sd/source/ui/inc/present.hxx90
-rw-r--r--sd/source/ui/inc/prltempl.hxx64
-rw-r--r--sd/source/ui/inc/prntopts.hxx69
-rw-r--r--sd/source/ui/inc/pubdlg.hxx205
-rw-r--r--sd/source/ui/inc/registerinterfaces.hxx30
-rw-r--r--sd/source/ui/inc/scalectrl.hxx39
-rw-r--r--sd/source/ui/inc/sdpopup.hxx47
-rw-r--r--sd/source/ui/inc/sdpreslt.hxx70
-rw-r--r--sd/source/ui/inc/sdtreelb.hxx395
-rw-r--r--sd/source/ui/inc/sdundogr.hxx46
-rw-r--r--sd/source/ui/inc/sdxfer.hxx148
-rw-r--r--sd/source/ui/inc/slideshow.hxx216
-rw-r--r--sd/source/ui/inc/smarttag.hxx171
-rw-r--r--sd/source/ui/inc/tablefunction.hxx32
-rw-r--r--sd/source/ui/inc/tabtempl.hxx57
-rw-r--r--sd/source/ui/inc/titledockwin.hxx94
-rw-r--r--sd/source/ui/inc/tmplctrl.hxx40
-rw-r--r--sd/source/ui/inc/tools/AsynchronousCall.hxx77
-rw-r--r--sd/source/ui/inc/tools/AsynchronousTask.hxx49
-rw-r--r--sd/source/ui/inc/tools/ConfigurationAccess.hxx144
-rw-r--r--sd/source/ui/inc/tools/GraphicSizeCheck.hxx116
-rw-r--r--sd/source/ui/inc/tools/IconCache.hxx70
-rw-r--r--sd/source/ui/inc/tools/IdleDetection.hxx89
-rw-r--r--sd/source/ui/inc/tools/PropertySet.hxx114
-rw-r--r--sd/source/ui/inc/tools/SdGlobalResourceContainer.hxx105
-rw-r--r--sd/source/ui/inc/tools/SlotStateListener.hxx138
-rw-r--r--sd/source/ui/inc/tools/TimerBasedTaskExecution.hxx89
-rw-r--r--sd/source/ui/inc/tpaction.hxx104
-rw-r--r--sd/source/ui/inc/tpoption.hxx144
-rw-r--r--sd/source/ui/inc/uiobject.hxx35
-rw-r--r--sd/source/ui/inc/unchss.hxx47
-rw-r--r--sd/source/ui/inc/undoback.hxx58
-rw-r--r--sd/source/ui/inc/undoheaderfooter.hxx45
-rw-r--r--sd/source/ui/inc/undolayer.hxx56
-rw-r--r--sd/source/ui/inc/undopage.hxx161
-rw-r--r--sd/source/ui/inc/unmodpg.hxx74
-rw-r--r--sd/source/ui/inc/unmovss.hxx44
-rw-r--r--sd/source/ui/inc/unoaprms.hxx148
-rw-r--r--sd/source/ui/inc/unokywds.hxx119
-rw-r--r--sd/source/ui/inc/unomodel.hxx406
-rw-r--r--sd/source/ui/inc/unopage.hxx304
-rw-r--r--sd/source/ui/inc/unoprnms.hxx73
-rw-r--r--sd/source/ui/inc/unosrch.hxx134
-rw-r--r--sd/source/ui/inc/unprlout.hxx55
-rw-r--r--sd/source/ui/inc/vectdlg.hxx81
-rw-r--r--sd/source/ui/inc/view/viewoverlaymanager.hxx71
-rw-r--r--sd/source/ui/inc/zoomlist.hxx50
-rw-r--r--sd/source/ui/presenter/CanvasUpdateRequester.cxx131
-rw-r--r--sd/source/ui/presenter/CanvasUpdateRequester.hxx72
-rw-r--r--sd/source/ui/presenter/PresenterCanvas.cxx790
-rw-r--r--sd/source/ui/presenter/PresenterCanvas.hxx320
-rw-r--r--sd/source/ui/presenter/PresenterHelper.cxx466
-rw-r--r--sd/source/ui/presenter/PresenterHelper.hxx93
-rw-r--r--sd/source/ui/presenter/PresenterPreviewCache.cxx360
-rw-r--r--sd/source/ui/presenter/PresenterPreviewCache.hxx97
-rw-r--r--sd/source/ui/presenter/PresenterTextView.cxx466
-rw-r--r--sd/source/ui/presenter/PresenterTextView.hxx71
-rw-r--r--sd/source/ui/presenter/SlideRenderer.cxx201
-rw-r--r--sd/source/ui/presenter/SlideRenderer.hxx94
-rw-r--r--sd/source/ui/remotecontrol/AvahiNetworkService.cxx209
-rw-r--r--sd/source/ui/remotecontrol/AvahiNetworkService.hxx25
-rw-r--r--sd/source/ui/remotecontrol/BluetoothServer.cxx1521
-rw-r--r--sd/source/ui/remotecontrol/BluetoothServer.hxx61
-rw-r--r--sd/source/ui/remotecontrol/BluetoothServer.mm1
-rw-r--r--sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx75
-rw-r--r--sd/source/ui/remotecontrol/BufferedStreamSocket.cxx130
-rw-r--r--sd/source/ui/remotecontrol/BufferedStreamSocket.hxx66
-rw-r--r--sd/source/ui/remotecontrol/Communicator.cxx154
-rw-r--r--sd/source/ui/remotecontrol/Communicator.hxx52
-rw-r--r--sd/source/ui/remotecontrol/DiscoveryService.cxx186
-rw-r--r--sd/source/ui/remotecontrol/DiscoveryService.hxx40
-rw-r--r--sd/source/ui/remotecontrol/DiscoveryService.mm1
-rw-r--r--sd/source/ui/remotecontrol/IBluetoothSocket.hxx42
-rw-r--r--sd/source/ui/remotecontrol/ImagePreparer.cxx255
-rw-r--r--sd/source/ui/remotecontrol/ImagePreparer.hxx45
-rw-r--r--sd/source/ui/remotecontrol/Listener.cxx133
-rw-r--r--sd/source/ui/remotecontrol/Listener.hxx62
-rw-r--r--sd/source/ui/remotecontrol/OSXBluetooth.h30
-rw-r--r--sd/source/ui/remotecontrol/OSXBluetooth.mm53
-rw-r--r--sd/source/ui/remotecontrol/OSXBluetoothWrapper.hxx38
-rw-r--r--sd/source/ui/remotecontrol/OSXNetworkService.h30
-rw-r--r--sd/source/ui/remotecontrol/OSXNetworkService.hxx43
-rw-r--r--sd/source/ui/remotecontrol/OSXNetworkService.mm43
-rw-r--r--sd/source/ui/remotecontrol/Receiver.cxx207
-rw-r--r--sd/source/ui/remotecontrol/Receiver.hxx37
-rw-r--r--sd/source/ui/remotecontrol/Server.cxx373
-rw-r--r--sd/source/ui/remotecontrol/Transmitter.cxx86
-rw-r--r--sd/source/ui/remotecontrol/Transmitter.hxx55
-rw-r--r--sd/source/ui/remotecontrol/WINNetworkService.cxx19
-rw-r--r--sd/source/ui/remotecontrol/WINNetworkService.hxx23
-rw-r--r--sd/source/ui/remotecontrol/ZeroconfService.hxx49
-rw-r--r--sd/source/ui/sidebar/AllMasterPagesSelector.cxx180
-rw-r--r--sd/source/ui/sidebar/AllMasterPagesSelector.hxx80
-rw-r--r--sd/source/ui/sidebar/CurrentMasterPagesSelector.cxx263
-rw-r--r--sd/source/ui/sidebar/CurrentMasterPagesSelector.hxx77
-rw-r--r--sd/source/ui/sidebar/DocumentHelper.cxx536
-rw-r--r--sd/source/ui/sidebar/DocumentHelper.hxx108
-rw-r--r--sd/source/ui/sidebar/IDisposable.hxx31
-rw-r--r--sd/source/ui/sidebar/ISidebarReceiver.hxx31
-rw-r--r--sd/source/ui/sidebar/LayoutMenu.cxx728
-rw-r--r--sd/source/ui/sidebar/LayoutMenu.hxx157
-rw-r--r--sd/source/ui/sidebar/MasterPageContainer.cxx958
-rw-r--r--sd/source/ui/sidebar/MasterPageContainer.hxx199
-rw-r--r--sd/source/ui/sidebar/MasterPageContainerFiller.cxx168
-rw-r--r--sd/source/ui/sidebar/MasterPageContainerFiller.hxx92
-rw-r--r--sd/source/ui/sidebar/MasterPageContainerProviders.cxx205
-rw-r--r--sd/source/ui/sidebar/MasterPageContainerProviders.hxx175
-rw-r--r--sd/source/ui/sidebar/MasterPageContainerQueue.cxx263
-rw-r--r--sd/source/ui/sidebar/MasterPageContainerQueue.hxx131
-rw-r--r--sd/source/ui/sidebar/MasterPageDescriptor.cxx341
-rw-r--r--sd/source/ui/sidebar/MasterPageDescriptor.hxx231
-rw-r--r--sd/source/ui/sidebar/MasterPageObserver.cxx317
-rw-r--r--sd/source/ui/sidebar/MasterPagesSelector.cxx620
-rw-r--r--sd/source/ui/sidebar/MasterPagesSelector.hxx180
-rw-r--r--sd/source/ui/sidebar/NavigatorWrapper.cxx49
-rw-r--r--sd/source/ui/sidebar/NavigatorWrapper.hxx57
-rw-r--r--sd/source/ui/sidebar/PageMarginUtils.hxx159
-rw-r--r--sd/source/ui/sidebar/PanelFactory.cxx141
-rw-r--r--sd/source/ui/sidebar/PanelFactory.hxx49
-rw-r--r--sd/source/ui/sidebar/PreviewValueSet.cxx127
-rw-r--r--sd/source/ui/sidebar/PreviewValueSet.hxx59
-rw-r--r--sd/source/ui/sidebar/RecentMasterPagesSelector.cxx138
-rw-r--r--sd/source/ui/sidebar/RecentMasterPagesSelector.hxx71
-rw-r--r--sd/source/ui/sidebar/RecentlyUsedMasterPages.cxx366
-rw-r--r--sd/source/ui/sidebar/RecentlyUsedMasterPages.hxx125
-rw-r--r--sd/source/ui/sidebar/SlideBackground.cxx1286
-rw-r--r--sd/source/ui/sidebar/SlideBackground.hxx180
-rw-r--r--sd/source/ui/slideshow/PaneHider.cxx99
-rw-r--r--sd/source/ui/slideshow/PaneHider.hxx66
-rw-r--r--sd/source/ui/slideshow/SlideShowRestarter.cxx156
-rw-r--r--sd/source/ui/slideshow/SlideShowRestarter.hxx88
-rw-r--r--sd/source/ui/slideshow/showwin.cxx629
-rw-r--r--sd/source/ui/slideshow/showwindow.hxx110
-rw-r--r--sd/source/ui/slideshow/slideshow.cxx1191
-rw-r--r--sd/source/ui/slideshow/slideshowimpl.cxx3349
-rw-r--r--sd/source/ui/slideshow/slideshowimpl.hxx342
-rw-r--r--sd/source/ui/slideshow/slideshowviewimpl.cxx626
-rw-r--r--sd/source/ui/slideshow/slideshowviewimpl.hxx182
-rw-r--r--sd/source/ui/slidesorter/cache/SlsBitmapCache.cxx550
-rw-r--r--sd/source/ui/slidesorter/cache/SlsBitmapCache.hxx208
-rw-r--r--sd/source/ui/slidesorter/cache/SlsBitmapCompressor.cxx197
-rw-r--r--sd/source/ui/slidesorter/cache/SlsBitmapCompressor.hxx138
-rw-r--r--sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx71
-rw-r--r--sd/source/ui/slidesorter/cache/SlsBitmapFactory.hxx46
-rw-r--r--sd/source/ui/slidesorter/cache/SlsCacheCompactor.cxx189
-rw-r--r--sd/source/ui/slidesorter/cache/SlsCacheCompactor.hxx87
-rw-r--r--sd/source/ui/slidesorter/cache/SlsCacheConfiguration.cxx144
-rw-r--r--sd/source/ui/slidesorter/cache/SlsCacheConfiguration.hxx68
-rw-r--r--sd/source/ui/slidesorter/cache/SlsGenericPageCache.cxx278
-rw-r--r--sd/source/ui/slidesorter/cache/SlsGenericPageCache.hxx152
-rw-r--r--sd/source/ui/slidesorter/cache/SlsPageCache.cxx109
-rw-r--r--sd/source/ui/slidesorter/cache/SlsPageCacheManager.cxx420
-rw-r--r--sd/source/ui/slidesorter/cache/SlsQueueProcessor.cxx176
-rw-r--r--sd/source/ui/slidesorter/cache/SlsQueueProcessor.hxx98
-rw-r--r--sd/source/ui/slidesorter/cache/SlsRequestFactory.cxx50
-rw-r--r--sd/source/ui/slidesorter/cache/SlsRequestFactory.hxx36
-rw-r--r--sd/source/ui/slidesorter/cache/SlsRequestPriorityClass.hxx44
-rw-r--r--sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx275
-rw-r--r--sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx122
-rw-r--r--sd/source/ui/slidesorter/controller/SlideSorterController.cxx910
-rw-r--r--sd/source/ui/slidesorter/controller/SlsAnimationFunction.cxx129
-rw-r--r--sd/source/ui/slidesorter/controller/SlsAnimator.cxx280
-rw-r--r--sd/source/ui/slidesorter/controller/SlsClipboard.cxx918
-rw-r--r--sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx256
-rw-r--r--sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx120
-rw-r--r--sd/source/ui/slidesorter/controller/SlsDragAndDropContext.hxx68
-rw-r--r--sd/source/ui/slidesorter/controller/SlsFocusManager.cxx245
-rw-r--r--sd/source/ui/slidesorter/controller/SlsInsertionIndicatorHandler.cxx243
-rw-r--r--sd/source/ui/slidesorter/controller/SlsListener.cxx597
-rw-r--r--sd/source/ui/slidesorter/controller/SlsListener.hxx164
-rw-r--r--sd/source/ui/slidesorter/controller/SlsPageSelector.cxx386
-rw-r--r--sd/source/ui/slidesorter/controller/SlsProperties.cxx106
-rw-r--r--sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx608
-rw-r--r--sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx1485
-rw-r--r--sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx309
-rw-r--r--sd/source/ui/slidesorter/controller/SlsSelectionObserver.cxx139
-rw-r--r--sd/source/ui/slidesorter/controller/SlsSlotManager.cxx1284
-rw-r--r--sd/source/ui/slidesorter/controller/SlsTransferableData.cxx86
-rw-r--r--sd/source/ui/slidesorter/controller/SlsVisibleAreaManager.cxx234
-rw-r--r--sd/source/ui/slidesorter/inc/cache/SlsCacheContext.hxx98
-rw-r--r--sd/source/ui/slidesorter/inc/cache/SlsPageCache.hxx141
-rw-r--r--sd/source/ui/slidesorter/inc/cache/SlsPageCacheManager.hxx155
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlideSorterController.hxx327
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsAnimationFunction.hxx77
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsAnimator.hxx122
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsClipboard.hxx208
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsCurrentSlideManager.hxx112
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsFocusManager.hxx211
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsInsertionIndicatorHandler.hxx138
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsPageSelector.hxx219
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsProperties.hxx125
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx248
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsSelectionFunction.hxx145
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsSelectionManager.hxx139
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsSelectionObserver.hxx77
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsSlotManager.hxx98
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsTransferableData.hxx78
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsVisibleAreaManager.hxx90
-rw-r--r--sd/source/ui/slidesorter/inc/model/SlideSorterModel.hxx227
-rw-r--r--sd/source/ui/slidesorter/inc/model/SlsEnumeration.hxx44
-rw-r--r--sd/source/ui/slidesorter/inc/model/SlsPageDescriptor.hxx144
-rw-r--r--sd/source/ui/slidesorter/inc/model/SlsPageEnumeration.hxx95
-rw-r--r--sd/source/ui/slidesorter/inc/model/SlsPageEnumerationProvider.hxx51
-rw-r--r--sd/source/ui/slidesorter/inc/model/SlsSharedPageDescriptor.hxx32
-rw-r--r--sd/source/ui/slidesorter/inc/model/SlsVisualState.hxx47
-rw-r--r--sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx225
-rw-r--r--sd/source/ui/slidesorter/inc/view/SlsILayerPainter.hxx53
-rw-r--r--sd/source/ui/slidesorter/inc/view/SlsInsertAnimator.hxx59
-rw-r--r--sd/source/ui/slidesorter/inc/view/SlsInsertionIndicatorOverlay.hxx101
-rw-r--r--sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx237
-rw-r--r--sd/source/ui/slidesorter/inc/view/SlsPageObjectLayouter.hxx144
-rw-r--r--sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx119
-rw-r--r--sd/source/ui/slidesorter/inc/view/SlsTheme.hxx135
-rw-r--r--sd/source/ui/slidesorter/inc/view/SlsToolTip.hxx75
-rw-r--r--sd/source/ui/slidesorter/model/SlideSorterModel.cxx676
-rw-r--r--sd/source/ui/slidesorter/model/SlsPageDescriptor.cxx226
-rw-r--r--sd/source/ui/slidesorter/model/SlsPageEnumeration.cxx202
-rw-r--r--sd/source/ui/slidesorter/model/SlsPageEnumerationProvider.cxx81
-rw-r--r--sd/source/ui/slidesorter/model/SlsVisualState.cxx40
-rw-r--r--sd/source/ui/slidesorter/shell/SlideSorter.cxx456
-rw-r--r--sd/source/ui/slidesorter/shell/SlideSorterService.cxx412
-rw-r--r--sd/source/ui/slidesorter/shell/SlideSorterService.hxx153
-rw-r--r--sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx924
-rw-r--r--sd/source/ui/slidesorter/view/SlideSorterView.cxx856
-rw-r--r--sd/source/ui/slidesorter/view/SlsFramePainter.cxx225
-rw-r--r--sd/source/ui/slidesorter/view/SlsFramePainter.hxx109
-rw-r--r--sd/source/ui/slidesorter/view/SlsInsertAnimator.cxx428
-rw-r--r--sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx360
-rw-r--r--sd/source/ui/slidesorter/view/SlsLayeredDevice.cxx491
-rw-r--r--sd/source/ui/slidesorter/view/SlsLayeredDevice.hxx84
-rw-r--r--sd/source/ui/slidesorter/view/SlsLayouter.cxx1225
-rw-r--r--sd/source/ui/slidesorter/view/SlsPageObjectLayouter.cxx259
-rw-r--r--sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx442
-rw-r--r--sd/source/ui/slidesorter/view/SlsTheme.cxx239
-rw-r--r--sd/source/ui/slidesorter/view/SlsToolTip.cxx160
-rw-r--r--sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx117
-rw-r--r--sd/source/ui/slidesorter/view/SlsViewCacheContext.hxx61
-rw-r--r--sd/source/ui/table/TableDesignPane.cxx763
-rw-r--r--sd/source/ui/table/tablefunction.cxx292
-rw-r--r--sd/source/ui/table/tableobjectbar.cxx224
-rw-r--r--sd/source/ui/table/tableobjectbar.hxx56
-rw-r--r--sd/source/ui/tools/AsynchronousCall.cxx56
-rw-r--r--sd/source/ui/tools/ConfigurationAccess.cxx173
-rw-r--r--sd/source/ui/tools/EventMultiplexer.cxx661
-rw-r--r--sd/source/ui/tools/GraphicSizeCheck.cxx221
-rw-r--r--sd/source/ui/tools/IconCache.cxx106
-rw-r--r--sd/source/ui/tools/IdleDetection.cxx103
-rw-r--r--sd/source/ui/tools/PreviewRenderer.cxx532
-rw-r--r--sd/source/ui/tools/PropertySet.cxx158
-rw-r--r--sd/source/ui/tools/SdGlobalResourceContainer.cxx197
-rw-r--r--sd/source/ui/tools/SlotStateListener.cxx153
-rw-r--r--sd/source/ui/tools/TimerBasedTaskExecution.cxx130
-rw-r--r--sd/source/ui/uitest/uiobject.cxx183
-rw-r--r--sd/source/ui/unoidl/DrawController.cxx815
-rw-r--r--sd/source/ui/unoidl/SdUnoDrawView.cxx548
-rw-r--r--sd/source/ui/unoidl/SdUnoOutlineView.cxx156
-rw-r--r--sd/source/ui/unoidl/SdUnoSlideView.cxx172
-rw-r--r--sd/source/ui/unoidl/UnoDocumentSettings.cxx1431
-rw-r--r--sd/source/ui/unoidl/UnoDocumentSettings.hxx37
-rw-r--r--sd/source/ui/unoidl/randomnode.cxx573
-rw-r--r--sd/source/ui/unoidl/sddetect.cxx160
-rw-r--r--sd/source/ui/unoidl/sddetect.hxx48
-rw-r--r--sd/source/ui/unoidl/unocpres.cxx450
-rw-r--r--sd/source/ui/unoidl/unocpres.hxx147
-rw-r--r--sd/source/ui/unoidl/unodoc.cxx73
-rw-r--r--sd/source/ui/unoidl/unolayer.cxx707
-rw-r--r--sd/source/ui/unoidl/unolayer.hxx169
-rw-r--r--sd/source/ui/unoidl/unomodel.cxx3491
-rw-r--r--sd/source/ui/unoidl/unomodule.cxx132
-rw-r--r--sd/source/ui/unoidl/unomodule.hxx57
-rw-r--r--sd/source/ui/unoidl/unoobj.cxx1627
-rw-r--r--sd/source/ui/unoidl/unoobj.hxx100
-rw-r--r--sd/source/ui/unoidl/unopage.cxx3056
-rw-r--r--sd/source/ui/unoidl/unopback.cxx410
-rw-r--r--sd/source/ui/unoidl/unopback.hxx89
-rw-r--r--sd/source/ui/unoidl/unopool.cxx89
-rw-r--r--sd/source/ui/unoidl/unopool.hxx29
-rw-r--r--sd/source/ui/unoidl/unosrch.cxx778
-rw-r--r--sd/source/ui/unoidl/unowcntr.cxx99
-rw-r--r--sd/source/ui/unoidl/unowcntr.hxx47
-rw-r--r--sd/source/ui/view/DocumentRenderer.cxx2256
-rw-r--r--sd/source/ui/view/FormShellManager.cxx319
-rw-r--r--sd/source/ui/view/GraphicObjectBar.cxx141
-rw-r--r--sd/source/ui/view/GraphicViewShellBase.cxx93
-rw-r--r--sd/source/ui/view/ImpressViewShellBase.cxx97
-rw-r--r--sd/source/ui/view/MediaObjectBar.cxx77
-rw-r--r--sd/source/ui/view/OutlineViewShellBase.cxx66
-rw-r--r--sd/source/ui/view/Outliner.cxx2066
-rw-r--r--sd/source/ui/view/OutlinerIterator.cxx798
-rw-r--r--sd/source/ui/view/PresentationViewShellBase.cxx94
-rw-r--r--sd/source/ui/view/SlideSorterViewShellBase.cxx68
-rw-r--r--sd/source/ui/view/ToolBarManager.cxx1375
-rw-r--r--sd/source/ui/view/ViewClipboard.cxx240
-rw-r--r--sd/source/ui/view/ViewShellBase.cxx1456
-rw-r--r--sd/source/ui/view/ViewShellHint.cxx31
-rw-r--r--sd/source/ui/view/ViewShellImplementation.cxx379
-rw-r--r--sd/source/ui/view/ViewShellManager.cxx1168
-rw-r--r--sd/source/ui/view/ViewTabBar.cxx561
-rw-r--r--sd/source/ui/view/WindowUpdater.cxx131
-rw-r--r--sd/source/ui/view/clview.cxx62
-rw-r--r--sd/source/ui/view/drawview.cxx634
-rw-r--r--sd/source/ui/view/drbezob.cxx320
-rw-r--r--sd/source/ui/view/drtxtob.cxx625
-rw-r--r--sd/source/ui/view/drtxtob1.cxx865
-rw-r--r--sd/source/ui/view/drviews1.cxx1360
-rw-r--r--sd/source/ui/view/drviews2.cxx4004
-rw-r--r--sd/source/ui/view/drviews3.cxx1106
-rw-r--r--sd/source/ui/view/drviews4.cxx982
-rw-r--r--sd/source/ui/view/drviews5.cxx650
-rw-r--r--sd/source/ui/view/drviews6.cxx339
-rw-r--r--sd/source/ui/view/drviews7.cxx1991
-rw-r--r--sd/source/ui/view/drviews8.cxx135
-rw-r--r--sd/source/ui/view/drviews9.cxx886
-rw-r--r--sd/source/ui/view/drviewsa.cxx848
-rw-r--r--sd/source/ui/view/drviewsb.cxx205
-rw-r--r--sd/source/ui/view/drviewsc.cxx72
-rw-r--r--sd/source/ui/view/drviewsd.cxx193
-rw-r--r--sd/source/ui/view/drviewse.cxx1701
-rw-r--r--sd/source/ui/view/drviewsf.cxx826
-rw-r--r--sd/source/ui/view/drviewsg.cxx232
-rw-r--r--sd/source/ui/view/drviewsh.cxx203
-rw-r--r--sd/source/ui/view/drviewsi.cxx165
-rw-r--r--sd/source/ui/view/drviewsj.cxx567
-rw-r--r--sd/source/ui/view/drviewsk.cxx37
-rw-r--r--sd/source/ui/view/drvwshrg.cxx110
-rw-r--r--sd/source/ui/view/frmview.cxx916
-rw-r--r--sd/source/ui/view/grviewsh.cxx88
-rw-r--r--sd/source/ui/view/outlnvs2.cxx636
-rw-r--r--sd/source/ui/view/outlnvsh.cxx1883
-rw-r--r--sd/source/ui/view/outlview.cxx1720
-rw-r--r--sd/source/ui/view/presvish.cxx172
-rw-r--r--sd/source/ui/view/sdruler.cxx148
-rw-r--r--sd/source/ui/view/sdview.cxx1395
-rw-r--r--sd/source/ui/view/sdview2.cxx908
-rw-r--r--sd/source/ui/view/sdview3.cxx1596
-rw-r--r--sd/source/ui/view/sdview4.cxx645
-rw-r--r--sd/source/ui/view/sdview5.cxx118
-rw-r--r--sd/source/ui/view/sdwindow.cxx1097
-rw-r--r--sd/source/ui/view/tabcontr.cxx358
-rw-r--r--sd/source/ui/view/unmodpg.cxx210
-rw-r--r--sd/source/ui/view/viewoverlaymanager.cxx546
-rw-r--r--sd/source/ui/view/viewshe2.cxx958
-rw-r--r--sd/source/ui/view/viewshe3.cxx383
-rw-r--r--sd/source/ui/view/viewshel.cxx1634
-rw-r--r--sd/source/ui/view/zoomlist.cxx94
-rw-r--r--sd/uiconfig/sdraw/menubar/menubar.xml661
-rw-r--r--sd/uiconfig/sdraw/popupmenu/3dobject.xml65
-rw-r--r--sd/uiconfig/sdraw/popupmenu/3dscene.xml57
-rw-r--r--sd/uiconfig/sdraw/popupmenu/3dscene2.xml58
-rw-r--r--sd/uiconfig/sdraw/popupmenu/bezier.xml26
-rw-r--r--sd/uiconfig/sdraw/popupmenu/connector.xml61
-rw-r--r--sd/uiconfig/sdraw/popupmenu/curve.xml72
-rw-r--r--sd/uiconfig/sdraw/popupmenu/draw.xml70
-rw-r--r--sd/uiconfig/sdraw/popupmenu/drawtext.xml29
-rw-r--r--sd/uiconfig/sdraw/popupmenu/form.xml52
-rw-r--r--sd/uiconfig/sdraw/popupmenu/formrichtext.xml46
-rw-r--r--sd/uiconfig/sdraw/popupmenu/gluepoint.xml27
-rw-r--r--sd/uiconfig/sdraw/popupmenu/graphic.xml79
-rw-r--r--sd/uiconfig/sdraw/popupmenu/group.xml66
-rw-r--r--sd/uiconfig/sdraw/popupmenu/layertab.xml15
-rw-r--r--sd/uiconfig/sdraw/popupmenu/line.xml65
-rw-r--r--sd/uiconfig/sdraw/popupmenu/measure.xml72
-rw-r--r--sd/uiconfig/sdraw/popupmenu/media.xml44
-rw-r--r--sd/uiconfig/sdraw/popupmenu/multiselect.xml86
-rw-r--r--sd/uiconfig/sdraw/popupmenu/notebookbar.xml24
-rw-r--r--sd/uiconfig/sdraw/popupmenu/oleobject.xml67
-rw-r--r--sd/uiconfig/sdraw/popupmenu/page.xml52
-rw-r--r--sd/uiconfig/sdraw/popupmenu/pagepane.xml18
-rw-r--r--sd/uiconfig/sdraw/popupmenu/pagepanemaster.xml20
-rw-r--r--sd/uiconfig/sdraw/popupmenu/pagepanenosel.xml16
-rw-r--r--sd/uiconfig/sdraw/popupmenu/pagepanenoselmaster.xml16
-rw-r--r--sd/uiconfig/sdraw/popupmenu/pagetab.xml18
-rw-r--r--sd/uiconfig/sdraw/popupmenu/table.xml78
-rw-r--r--sd/uiconfig/sdraw/popupmenu/textbox.xml64
-rw-r--r--sd/uiconfig/sdraw/statusbar/statusbar.xml31
-rw-r--r--sd/uiconfig/sdraw/toolbar/3dobjectsbar.xml30
-rw-r--r--sd/uiconfig/sdraw/toolbar/alignmentbar.xml28
-rw-r--r--sd/uiconfig/sdraw/toolbar/arrowsbar.xml33
-rw-r--r--sd/uiconfig/sdraw/toolbar/arrowshapes.xml51
-rw-r--r--sd/uiconfig/sdraw/toolbar/basicshapes.xml48
-rw-r--r--sd/uiconfig/sdraw/toolbar/bezierobjectbar.xml37
-rw-r--r--sd/uiconfig/sdraw/toolbar/calloutshapes.xml29
-rw-r--r--sd/uiconfig/sdraw/toolbar/choosemodebar.xml30
-rw-r--r--sd/uiconfig/sdraw/toolbar/colorbar.xml32
-rw-r--r--sd/uiconfig/sdraw/toolbar/commentsbar.xml28
-rw-r--r--sd/uiconfig/sdraw/toolbar/connectorsbar.xml55
-rw-r--r--sd/uiconfig/sdraw/toolbar/distributebar.xml21
-rw-r--r--sd/uiconfig/sdraw/toolbar/drawingobjectbar.xml69
-rw-r--r--sd/uiconfig/sdraw/toolbar/ellipsesbar.xml36
-rw-r--r--sd/uiconfig/sdraw/toolbar/extrusionobjectbar.xml33
-rw-r--r--sd/uiconfig/sdraw/toolbar/findbar.xml31
-rw-r--r--sd/uiconfig/sdraw/toolbar/flowchartshapes.xml53
-rw-r--r--sd/uiconfig/sdraw/toolbar/fontworkobjectbar.xml30
-rw-r--r--sd/uiconfig/sdraw/toolbar/fontworkshapetype.xml55
-rw-r--r--sd/uiconfig/sdraw/toolbar/formcontrols.xml59
-rw-r--r--sd/uiconfig/sdraw/toolbar/formdesign.xml46
-rw-r--r--sd/uiconfig/sdraw/toolbar/formsfilterbar.xml25
-rw-r--r--sd/uiconfig/sdraw/toolbar/formsnavigationbar.xml50
-rw-r--r--sd/uiconfig/sdraw/toolbar/formtextobjectbar.xml45
-rw-r--r--sd/uiconfig/sdraw/toolbar/fullscreenbar.xml22
-rw-r--r--sd/uiconfig/sdraw/toolbar/gluepointsobjectbar.xml37
-rw-r--r--sd/uiconfig/sdraw/toolbar/graffilterbar.xml34
-rw-r--r--sd/uiconfig/sdraw/toolbar/graphicobjectbar.xml70
-rw-r--r--sd/uiconfig/sdraw/toolbar/insertbar.xml34
-rw-r--r--sd/uiconfig/sdraw/toolbar/linesbar.xml30
-rw-r--r--sd/uiconfig/sdraw/toolbar/masterviewtoolbar.xml26
-rw-r--r--sd/uiconfig/sdraw/toolbar/mediaobjectbar.xml24
-rw-r--r--sd/uiconfig/sdraw/toolbar/notebookbarshortcuts.xml16
-rw-r--r--sd/uiconfig/sdraw/toolbar/optimizetablebar.xml27
-rw-r--r--sd/uiconfig/sdraw/toolbar/optionsbar.xml40
-rw-r--r--sd/uiconfig/sdraw/toolbar/positionbar.xml30
-rw-r--r--sd/uiconfig/sdraw/toolbar/rectanglesbar.xml30
-rw-r--r--sd/uiconfig/sdraw/toolbar/redactedexportbar.xml23
-rw-r--r--sd/uiconfig/sdraw/toolbar/redactionbar.xml27
-rw-r--r--sd/uiconfig/sdraw/toolbar/standardbar.xml94
-rw-r--r--sd/uiconfig/sdraw/toolbar/starshapes.xml34
-rw-r--r--sd/uiconfig/sdraw/toolbar/symbolshapes.xml41
-rw-r--r--sd/uiconfig/sdraw/toolbar/tableobjectbar.xml51
-rw-r--r--sd/uiconfig/sdraw/toolbar/textbar.xml28
-rw-r--r--sd/uiconfig/sdraw/toolbar/textobjectbar.xml75
-rw-r--r--sd/uiconfig/sdraw/toolbar/toolbar.xml64
-rw-r--r--sd/uiconfig/sdraw/toolbar/viewerbar.xml37
-rw-r--r--sd/uiconfig/sdraw/toolbar/zoombar.xml34
-rw-r--r--sd/uiconfig/sdraw/ui/breakdialog.ui140
-rw-r--r--sd/uiconfig/sdraw/ui/bulletsandnumbering.ui210
-rw-r--r--sd/uiconfig/sdraw/ui/copydlg.ui581
-rw-r--r--sd/uiconfig/sdraw/ui/crossfadedialog.ui207
-rw-r--r--sd/uiconfig/sdraw/ui/dlgsnap.ui344
-rw-r--r--sd/uiconfig/sdraw/ui/drawchardialog.ui302
-rw-r--r--sd/uiconfig/sdraw/ui/drawpagedialog.ui302
-rw-r--r--sd/uiconfig/sdraw/ui/drawparadialog.ui351
-rw-r--r--sd/uiconfig/sdraw/ui/drawprinteroptions.ui299
-rw-r--r--sd/uiconfig/sdraw/ui/drawprtldialog.ui880
-rw-r--r--sd/uiconfig/sdraw/ui/insertlayer.ui296
-rw-r--r--sd/uiconfig/sdraw/ui/insertslidesdialog.ui195
-rw-r--r--sd/uiconfig/sdraw/ui/namedesign.ui113
-rw-r--r--sd/uiconfig/sdraw/ui/notebookbar.ui18918
-rw-r--r--sd/uiconfig/sdraw/ui/notebookbar_compact.ui20580
-rw-r--r--sd/uiconfig/sdraw/ui/notebookbar_groupedbar_compact.ui14160
-rw-r--r--sd/uiconfig/sdraw/ui/notebookbar_online.ui67
-rw-r--r--sd/uiconfig/sdraw/ui/notebookbar_single.ui11625
-rw-r--r--sd/uiconfig/sdraw/ui/paranumberingtab.ui85
-rw-r--r--sd/uiconfig/sdraw/ui/queryunlinkimagedialog.ui35
-rw-r--r--sd/uiconfig/sdraw/ui/vectorize.ui376
-rw-r--r--sd/uiconfig/simpress/menubar/menubar.xml692
-rw-r--r--sd/uiconfig/simpress/popupmenu/3dobject.xml68
-rw-r--r--sd/uiconfig/simpress/popupmenu/3dscene.xml61
-rw-r--r--sd/uiconfig/simpress/popupmenu/3dscene2.xml62
-rw-r--r--sd/uiconfig/simpress/popupmenu/bezier.xml26
-rw-r--r--sd/uiconfig/simpress/popupmenu/connector.xml64
-rw-r--r--sd/uiconfig/simpress/popupmenu/curve.xml75
-rw-r--r--sd/uiconfig/simpress/popupmenu/draw.xml73
-rw-r--r--sd/uiconfig/simpress/popupmenu/drawtext.xml31
-rw-r--r--sd/uiconfig/simpress/popupmenu/form.xml52
-rw-r--r--sd/uiconfig/simpress/popupmenu/formrichtext.xml46
-rw-r--r--sd/uiconfig/simpress/popupmenu/gluepoint.xml27
-rw-r--r--sd/uiconfig/simpress/popupmenu/graphic.xml82
-rw-r--r--sd/uiconfig/simpress/popupmenu/group.xml69
-rw-r--r--sd/uiconfig/simpress/popupmenu/line.xml68
-rw-r--r--sd/uiconfig/simpress/popupmenu/measure.xml75
-rw-r--r--sd/uiconfig/simpress/popupmenu/media.xml48
-rw-r--r--sd/uiconfig/simpress/popupmenu/multiselect.xml88
-rw-r--r--sd/uiconfig/simpress/popupmenu/notebookbar.xml24
-rw-r--r--sd/uiconfig/simpress/popupmenu/oleobject.xml70
-rw-r--r--sd/uiconfig/simpress/popupmenu/outline.xml33
-rw-r--r--sd/uiconfig/simpress/popupmenu/page.xml82
-rw-r--r--sd/uiconfig/simpress/popupmenu/pagepane.xml62
-rw-r--r--sd/uiconfig/simpress/popupmenu/pagepanemaster.xml18
-rw-r--r--sd/uiconfig/simpress/popupmenu/pagepanenosel.xml16
-rw-r--r--sd/uiconfig/simpress/popupmenu/pagepanenoselmaster.xml16
-rw-r--r--sd/uiconfig/simpress/popupmenu/pagetab.xml19
-rw-r--r--sd/uiconfig/simpress/popupmenu/table.xml79
-rw-r--r--sd/uiconfig/simpress/popupmenu/textbox.xml68
-rw-r--r--sd/uiconfig/simpress/statusbar/statusbar.xml31
-rw-r--r--sd/uiconfig/simpress/toolbar/3dobjectsbar.xml30
-rw-r--r--sd/uiconfig/simpress/toolbar/alignmentbar.xml28
-rw-r--r--sd/uiconfig/simpress/toolbar/arrowsbar.xml33
-rw-r--r--sd/uiconfig/simpress/toolbar/arrowshapes.xml51
-rw-r--r--sd/uiconfig/simpress/toolbar/basicshapes.xml48
-rw-r--r--sd/uiconfig/simpress/toolbar/bezierobjectbar.xml37
-rw-r--r--sd/uiconfig/simpress/toolbar/calloutshapes.xml29
-rw-r--r--sd/uiconfig/simpress/toolbar/choosemodebar.xml30
-rw-r--r--sd/uiconfig/simpress/toolbar/classificationbar.xml13
-rw-r--r--sd/uiconfig/simpress/toolbar/colorbar.xml32
-rw-r--r--sd/uiconfig/simpress/toolbar/commentsbar.xml28
-rw-r--r--sd/uiconfig/simpress/toolbar/commontaskbar.xml39
-rw-r--r--sd/uiconfig/simpress/toolbar/connectorsbar.xml55
-rw-r--r--sd/uiconfig/simpress/toolbar/distributebar.xml21
-rw-r--r--sd/uiconfig/simpress/toolbar/drawingobjectbar.xml71
-rw-r--r--sd/uiconfig/simpress/toolbar/ellipsesbar.xml36
-rw-r--r--sd/uiconfig/simpress/toolbar/extrusionobjectbar.xml33
-rw-r--r--sd/uiconfig/simpress/toolbar/findbar.xml31
-rw-r--r--sd/uiconfig/simpress/toolbar/flowchartshapes.xml53
-rw-r--r--sd/uiconfig/simpress/toolbar/fontworkobjectbar.xml30
-rw-r--r--sd/uiconfig/simpress/toolbar/fontworkshapetype.xml55
-rw-r--r--sd/uiconfig/simpress/toolbar/formcontrols.xml59
-rw-r--r--sd/uiconfig/simpress/toolbar/formdesign.xml46
-rw-r--r--sd/uiconfig/simpress/toolbar/formsfilterbar.xml25
-rw-r--r--sd/uiconfig/simpress/toolbar/formsnavigationbar.xml50
-rw-r--r--sd/uiconfig/simpress/toolbar/formtextobjectbar.xml45
-rw-r--r--sd/uiconfig/simpress/toolbar/fullscreenbar.xml22
-rw-r--r--sd/uiconfig/simpress/toolbar/gluepointsobjectbar.xml37
-rw-r--r--sd/uiconfig/simpress/toolbar/graffilterbar.xml34
-rw-r--r--sd/uiconfig/simpress/toolbar/graphicobjectbar.xml72
-rw-r--r--sd/uiconfig/simpress/toolbar/insertbar.xml34
-rw-r--r--sd/uiconfig/simpress/toolbar/linesbar.xml30
-rw-r--r--sd/uiconfig/simpress/toolbar/masterviewtoolbar.xml26
-rw-r--r--sd/uiconfig/simpress/toolbar/mediaobjectbar.xml24
-rw-r--r--sd/uiconfig/simpress/toolbar/notebookbarshortcuts.xml17
-rw-r--r--sd/uiconfig/simpress/toolbar/optimizetablebar.xml27
-rw-r--r--sd/uiconfig/simpress/toolbar/optionsbar.xml40
-rw-r--r--sd/uiconfig/simpress/toolbar/outlinetoolbar.xml33
-rw-r--r--sd/uiconfig/simpress/toolbar/positionbar.xml30
-rw-r--r--sd/uiconfig/simpress/toolbar/rectanglesbar.xml30
-rw-r--r--sd/uiconfig/simpress/toolbar/singlemode.xml87
-rw-r--r--sd/uiconfig/simpress/toolbar/slideviewobjectbar.xml27
-rw-r--r--sd/uiconfig/simpress/toolbar/slideviewtoolbar.xml24
-rw-r--r--sd/uiconfig/simpress/toolbar/standardbar.xml80
-rw-r--r--sd/uiconfig/simpress/toolbar/starshapes.xml34
-rw-r--r--sd/uiconfig/simpress/toolbar/symbolshapes.xml41
-rw-r--r--sd/uiconfig/simpress/toolbar/tableobjectbar.xml51
-rw-r--r--sd/uiconfig/simpress/toolbar/textbar.xml28
-rw-r--r--sd/uiconfig/simpress/toolbar/textobjectbar.xml75
-rw-r--r--sd/uiconfig/simpress/toolbar/toolbar.xml70
-rw-r--r--sd/uiconfig/simpress/toolbar/viewerbar.xml39
-rw-r--r--sd/uiconfig/simpress/toolbar/zoombar.xml34
-rw-r--r--sd/uiconfig/simpress/ui/annotation.ui169
-rw-r--r--sd/uiconfig/simpress/ui/annotationtagmenu.ui47
-rw-r--r--sd/uiconfig/simpress/ui/clientboxfragment.ui81
-rw-r--r--sd/uiconfig/simpress/ui/currentmastermenu.ui69
-rw-r--r--sd/uiconfig/simpress/ui/customanimationeffecttab.ui439
-rw-r--r--sd/uiconfig/simpress/ui/customanimationfragment.ui440
-rw-r--r--sd/uiconfig/simpress/ui/customanimationproperties.ui241
-rw-r--r--sd/uiconfig/simpress/ui/customanimationspanel.ui705
-rw-r--r--sd/uiconfig/simpress/ui/customanimationtexttab.ui151
-rw-r--r--sd/uiconfig/simpress/ui/customanimationtimingtab.ui283
-rw-r--r--sd/uiconfig/simpress/ui/customslideshows.ui271
-rw-r--r--sd/uiconfig/simpress/ui/definecustomslideshow.ui358
-rw-r--r--sd/uiconfig/simpress/ui/displaywindow.ui123
-rw-r--r--sd/uiconfig/simpress/ui/dlgfield.ui268
-rw-r--r--sd/uiconfig/simpress/ui/dockinganimation.ui657
-rw-r--r--sd/uiconfig/simpress/ui/effectmenu.ui69
-rw-r--r--sd/uiconfig/simpress/ui/fieldmenu.ui9
-rw-r--r--sd/uiconfig/simpress/ui/fontsizemenu.ui41
-rw-r--r--sd/uiconfig/simpress/ui/fontstylemenu.ui33
-rw-r--r--sd/uiconfig/simpress/ui/gluebox.ui23
-rw-r--r--sd/uiconfig/simpress/ui/headerfooterdialog.ui223
-rw-r--r--sd/uiconfig/simpress/ui/headerfootertab.ui519
-rw-r--r--sd/uiconfig/simpress/ui/impressprinteroptions.ui441
-rw-r--r--sd/uiconfig/simpress/ui/insertslides.ui156
-rw-r--r--sd/uiconfig/simpress/ui/interactiondialog.ui89
-rw-r--r--sd/uiconfig/simpress/ui/interactionpage.ui485
-rw-r--r--sd/uiconfig/simpress/ui/layoutmenu.ui31
-rw-r--r--sd/uiconfig/simpress/ui/layoutpanel.ui25
-rw-r--r--sd/uiconfig/simpress/ui/layoutwindow.ui136
-rw-r--r--sd/uiconfig/simpress/ui/masterlayoutdlg.ui220
-rw-r--r--sd/uiconfig/simpress/ui/mastermenu.ui47
-rw-r--r--sd/uiconfig/simpress/ui/masterpagemenu.ui9
-rw-r--r--sd/uiconfig/simpress/ui/masterpagepanel.ui25
-rw-r--r--sd/uiconfig/simpress/ui/masterpagepanelall.ui25
-rw-r--r--sd/uiconfig/simpress/ui/masterpagepanelrecent.ui25
-rw-r--r--sd/uiconfig/simpress/ui/navigatorpanel.ui288
-rw-r--r--sd/uiconfig/simpress/ui/notebookbar.ui19881
-rw-r--r--sd/uiconfig/simpress/ui/notebookbar_compact.ui20285
-rw-r--r--sd/uiconfig/simpress/ui/notebookbar_groupedbar_compact.ui14144
-rw-r--r--sd/uiconfig/simpress/ui/notebookbar_groupedbar_full.ui12494
-rw-r--r--sd/uiconfig/simpress/ui/notebookbar_groups.ui1900
-rw-r--r--sd/uiconfig/simpress/ui/notebookbar_online.ui67
-rw-r--r--sd/uiconfig/simpress/ui/notebookbar_single.ui11343
-rw-r--r--sd/uiconfig/simpress/ui/optimpressgeneralpage.ui721
-rw-r--r--sd/uiconfig/simpress/ui/pagesfieldbox.ui31
-rw-r--r--sd/uiconfig/simpress/ui/photoalbum.ui416
-rw-r--r--sd/uiconfig/simpress/ui/presentationdialog.ui722
-rw-r--r--sd/uiconfig/simpress/ui/prntopts.ui556
-rw-r--r--sd/uiconfig/simpress/ui/publishingdialog.ui1831
-rw-r--r--sd/uiconfig/simpress/ui/remotedialog.ui167
-rw-r--r--sd/uiconfig/simpress/ui/rotatemenu.ui63
-rw-r--r--sd/uiconfig/simpress/ui/scalemenu.ui71
-rw-r--r--sd/uiconfig/simpress/ui/sdviewpage.ui118
-rw-r--r--sd/uiconfig/simpress/ui/sidebarslidebackground.ui367
-rw-r--r--sd/uiconfig/simpress/ui/slidecontextmenu.ui165
-rw-r--r--sd/uiconfig/simpress/ui/slidedesigndialog.ui216
-rw-r--r--sd/uiconfig/simpress/ui/slidetransitionspanel.ui468
-rw-r--r--sd/uiconfig/simpress/ui/snapmenu.ui9
-rw-r--r--sd/uiconfig/simpress/ui/tabledesignpanel.ui145
-rw-r--r--sd/uiconfig/simpress/ui/tabviewbar.ui47
-rw-r--r--sd/uiconfig/simpress/ui/templatedialog.ui895
-rw-r--r--sd/util/sd.component112
-rw-r--r--sd/util/sdd.component26
-rw-r--r--sd/util/sdfilt.component13
-rw-r--r--sd/workben/custompanel/ctp_panel.cxx215
-rw-r--r--sd/workben/custompanel/ctp_panel.hxx82
-rw-r--r--sd/workben/testdll/makefile91
-rw-r--r--sd/xml/effects.xml2699
-rw-r--r--sd/xml/layoutlist.xml86
-rw-r--r--sd/xml/objectlist.xml41
-rw-r--r--sd/xml/transitions-ogl.xml77
-rw-r--r--sd/xml/transitions.xml251
-rw-r--r--sd/xsl/effect.xsl580
-rw-r--r--sdext/CppunitTest_sdext_pdfimport.mk60
-rw-r--r--sdext/CustomTarget_pdfimport.mk23
-rw-r--r--sdext/Executable_pdf2xml.mk44
-rw-r--r--sdext/Executable_pdfunzip.mk42
-rw-r--r--sdext/Executable_xpdfimport.mk38
-rw-r--r--sdext/IwyuFilter_sdext.yaml19
-rw-r--r--sdext/Library_PresentationMinimizer.mk59
-rw-r--r--sdext/Library_PresenterScreen.mk66
-rw-r--r--sdext/Library_pdfimport.mk72
-rw-r--r--sdext/Makefile14
-rw-r--r--sdext/Module_sdext.mk40
-rw-r--r--sdext/Package_pdfimport_xpdfimport.mk14
-rw-r--r--sdext/README.md30
-rw-r--r--sdext/inc/bitmaps.hlst17
-rw-r--r--sdext/inc/pch/precompiled_PresentationMinimizer.cxx12
-rw-r--r--sdext/inc/pch/precompiled_PresentationMinimizer.hxx169
-rw-r--r--sdext/inc/pch/precompiled_PresenterScreen.cxx12
-rw-r--r--sdext/inc/pch/precompiled_PresenterScreen.hxx162
-rw-r--r--sdext/source/minimizer/configurationaccess.cxx458
-rw-r--r--sdext/source/minimizer/configurationaccess.hxx116
-rw-r--r--sdext/source/minimizer/fileopendialog.cxx169
-rw-r--r--sdext/source/minimizer/fileopendialog.hxx59
-rw-r--r--sdext/source/minimizer/graphiccollector.cxx423
-rw-r--r--sdext/source/minimizer/graphiccollector.hxx95
-rw-r--r--sdext/source/minimizer/impoptimizer.cxx702
-rw-r--r--sdext/source/minimizer/impoptimizer.hxx70
-rw-r--r--sdext/source/minimizer/informationdialog.cxx350
-rw-r--r--sdext/source/minimizer/informationdialog.hxx81
-rw-r--r--sdext/source/minimizer/minimizer.component16
-rw-r--r--sdext/source/minimizer/optimizationstats.cxx86
-rw-r--r--sdext/source/minimizer/optimizationstats.hxx45
-rw-r--r--sdext/source/minimizer/optimizerdialog.cxx780
-rw-r--r--sdext/source/minimizer/optimizerdialog.hxx203
-rw-r--r--sdext/source/minimizer/optimizerdialogcontrols.cxx909
-rw-r--r--sdext/source/minimizer/pagecollector.cxx136
-rw-r--r--sdext/source/minimizer/pagecollector.hxx43
-rw-r--r--sdext/source/minimizer/pppoptimizer.cxx39
-rw-r--r--sdext/source/minimizer/pppoptimizer.hxx32
-rw-r--r--sdext/source/minimizer/pppoptimizerdialog.cxx153
-rw-r--r--sdext/source/minimizer/pppoptimizerdialog.hxx81
-rw-r--r--sdext/source/minimizer/pppoptimizertoken.cxx198
-rw-r--r--sdext/source/minimizer/pppoptimizertoken.hxx148
-rw-r--r--sdext/source/minimizer/unodialog.cxx309
-rw-r--r--sdext/source/minimizer/unodialog.hxx118
-rw-r--r--sdext/source/pdfimport/config/pdf_import_filter.xcu216
-rw-r--r--sdext/source/pdfimport/config/pdf_types.xcu35
-rw-r--r--sdext/source/pdfimport/dialogs/xpdfimport_err.pdfbin0 -> 21204 bytes
-rw-r--r--sdext/source/pdfimport/filterdet.cxx610
-rw-r--r--sdext/source/pdfimport/filterdet.hxx102
-rw-r--r--sdext/source/pdfimport/inc/contentsink.hxx181
-rw-r--r--sdext/source/pdfimport/inc/genericelements.hxx309
-rw-r--r--sdext/source/pdfimport/inc/imagecontainer.hxx50
-rw-r--r--sdext/source/pdfimport/inc/odfemitter.hxx36
-rw-r--r--sdext/source/pdfimport/inc/pdfihelper.hxx231
-rw-r--r--sdext/source/pdfimport/inc/pdfiprocessor.hxx211
-rw-r--r--sdext/source/pdfimport/inc/pdfparse.hxx304
-rw-r--r--sdext/source/pdfimport/inc/saxemitter.hxx36
-rw-r--r--sdext/source/pdfimport/inc/treevisiting.hxx62
-rw-r--r--sdext/source/pdfimport/inc/treevisitorfactory.hxx59
-rw-r--r--sdext/source/pdfimport/inc/wrapper.hxx94
-rw-r--r--sdext/source/pdfimport/inc/xmlemitter.hxx53
-rw-r--r--sdext/source/pdfimport/misc/pdfihelper.cxx119
-rw-r--r--sdext/source/pdfimport/misc/pwdinteract.cxx186
-rw-r--r--sdext/source/pdfimport/odf/odfemitter.cxx121
-rw-r--r--sdext/source/pdfimport/pdfiadaptor.cxx366
-rw-r--r--sdext/source/pdfimport/pdfiadaptor.hxx143
-rw-r--r--sdext/source/pdfimport/pdfimport.component32
-rw-r--r--sdext/source/pdfimport/pdfparse/pdfentries.cxx1461
-rw-r--r--sdext/source/pdfimport/pdfparse/pdfparse.cxx701
-rw-r--r--sdext/source/pdfimport/sax/emitcontext.cxx179
-rw-r--r--sdext/source/pdfimport/sax/emitcontext.hxx51
-rw-r--r--sdext/source/pdfimport/sax/saxattrlist.cxx80
-rw-r--r--sdext/source/pdfimport/sax/saxattrlist.hxx67
-rw-r--r--sdext/source/pdfimport/test/outputwrap.hxx93
-rw-r--r--sdext/source/pdfimport/test/pdf2xml.cxx98
-rw-r--r--sdext/source/pdfimport/test/pdfunzip.cxx532
-rw-r--r--sdext/source/pdfimport/test/testTdf105536.pdfbin0 -> 59646 bytes
-rw-r--r--sdext/source/pdfimport/test/testTdf141709.pdfbin0 -> 11119 bytes
-rw-r--r--sdext/source/pdfimport/test/testTdf96993.pdfbin0 -> 12665 bytes
-rw-r--r--sdext/source/pdfimport/test/testdocs/graphicformats.pdfbin0 -> 27149 bytes
-rw-r--r--sdext/source/pdfimport/test/testdocs/graphicformats_pdfi_unittest_draw.xml259
-rw-r--r--sdext/source/pdfimport/test/testdocs/graphicformats_pdfi_unittest_impress.xml259
-rw-r--r--sdext/source/pdfimport/test/testdocs/graphicformats_pdfi_unittest_writer.xml385
-rw-r--r--sdext/source/pdfimport/test/testdocs/makefile.mk72
-rw-r--r--sdext/source/pdfimport/test/testdocs/pictxt.pdfbin0 -> 24475 bytes
-rw-r--r--sdext/source/pdfimport/test/testdocs/pictxt_pdfi_unittest_draw.xml3396
-rw-r--r--sdext/source/pdfimport/test/testdocs/pictxt_pdfi_unittest_impress.xml3396
-rw-r--r--sdext/source/pdfimport/test/testdocs/pictxt_pdfi_unittest_writer.xml550
-rw-r--r--sdext/source/pdfimport/test/testdocs/tdf104597_textrun.pdfbin0 -> 21042 bytes
-rw-r--r--sdext/source/pdfimport/test/testdocs/tdf78427-MyraidPro-Semibold-Light.pdfbin0 -> 13199 bytes
-rw-r--r--sdext/source/pdfimport/test/testdocs/tdf78427-testFontFeatures.pdfbin0 -> 81012 bytes
-rw-r--r--sdext/source/pdfimport/test/testdocs/testSpace.pdfbin0 -> 8140 bytes
-rw-r--r--sdext/source/pdfimport/test/testdocs/testTdf143959.pdfbin0 -> 63999 bytes
-rw-r--r--sdext/source/pdfimport/test/testdocs/txtpic.pdfbin0 -> 24486 bytes
-rw-r--r--sdext/source/pdfimport/test/testdocs/txtpic_pdfi_unittest_draw.xml3396
-rw-r--r--sdext/source/pdfimport/test/testdocs/txtpic_pdfi_unittest_impress.xml3396
-rw-r--r--sdext/source/pdfimport/test/testdocs/txtpic_pdfi_unittest_writer.xml550
-rw-r--r--sdext/source/pdfimport/test/testdocs/txtpictxt.pdfbin0 -> 24484 bytes
-rw-r--r--sdext/source/pdfimport/test/testdocs/txtpictxt_pdfi_unittest_draw.xml3396
-rw-r--r--sdext/source/pdfimport/test/testdocs/txtpictxt_pdfi_unittest_impress.xml3396
-rw-r--r--sdext/source/pdfimport/test/testdocs/txtpictxt_pdfi_unittest_writer.xml550
-rw-r--r--sdext/source/pdfimport/test/testdocs/verticaltext.pdfbin0 -> 16533 bytes
-rw-r--r--sdext/source/pdfimport/test/testdocs/verticaltext_pdfi_unittest_draw.xml233
-rw-r--r--sdext/source/pdfimport/test/testdocs/verticaltext_pdfi_unittest_impress.xml233
-rw-r--r--sdext/source/pdfimport/test/testdocs/verticaltext_pdfi_unittest_writer.xml356
-rw-r--r--sdext/source/pdfimport/test/testinput.odpbin0 -> 40660 bytes
-rw-r--r--sdext/source/pdfimport/test/testinput.pdfbin0 -> 67103 bytes
-rw-r--r--sdext/source/pdfimport/test/tests.cxx904
-rw-r--r--sdext/source/pdfimport/tree/drawtreevisiting.cxx1104
-rw-r--r--sdext/source/pdfimport/tree/drawtreevisiting.hxx117
-rw-r--r--sdext/source/pdfimport/tree/genericelements.cxx434
-rw-r--r--sdext/source/pdfimport/tree/imagecontainer.cxx146
-rw-r--r--sdext/source/pdfimport/tree/pdfiprocessor.cxx715
-rw-r--r--sdext/source/pdfimport/tree/style.cxx248
-rw-r--r--sdext/source/pdfimport/tree/style.hxx166
-rw-r--r--sdext/source/pdfimport/tree/treevisitorfactory.cxx111
-rw-r--r--sdext/source/pdfimport/tree/writertreevisiting.cxx1299
-rw-r--r--sdext/source/pdfimport/tree/writertreevisiting.hxx110
-rw-r--r--sdext/source/pdfimport/wrapper/keyword_list53
-rw-r--r--sdext/source/pdfimport/wrapper/wrapper.cxx1253
-rw-r--r--sdext/source/pdfimport/xpdftest/binary_0_out.defbin0 -> 80097 bytes
-rw-r--r--sdext/source/pdfimport/xpdftest/binary_1_out.defbin0 -> 75159156 bytes
-rw-r--r--sdext/source/pdfimport/xpdftest/book.pdfbin0 -> 463628 bytes
-rw-r--r--sdext/source/pdfimport/xpdftest/makefile.mk48
-rw-r--r--sdext/source/pdfimport/xpdftest/testinput.odpbin0 -> 44591 bytes
-rw-r--r--sdext/source/pdfimport/xpdftest/testinput.pdfbin0 -> 64488 bytes
-rw-r--r--sdext/source/pdfimport/xpdftest/text_0_out.def202
-rw-r--r--sdext/source/pdfimport/xpdftest/text_1_out.def70338
-rw-r--r--sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx1168
-rw-r--r--sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx302
-rw-r--r--sdext/source/pdfimport/xpdfwrapper/pnghelper.cxx404
-rw-r--r--sdext/source/pdfimport/xpdfwrapper/pnghelper.hxx84
-rw-r--r--sdext/source/pdfimport/xpdfwrapper/wrapper_gpl.cxx188
-rw-r--r--sdext/source/presenter/PresenterAccessibility.cxx1849
-rw-r--r--sdext/source/presenter/PresenterAccessibility.hxx115
-rw-r--r--sdext/source/presenter/PresenterBitmapContainer.cxx399
-rw-r--r--sdext/source/presenter/PresenterBitmapContainer.hxx146
-rw-r--r--sdext/source/presenter/PresenterButton.cxx447
-rw-r--r--sdext/source/presenter/PresenterButton.hxx138
-rw-r--r--sdext/source/presenter/PresenterCanvasHelper.cxx289
-rw-r--r--sdext/source/presenter/PresenterCanvasHelper.hxx107
-rw-r--r--sdext/source/presenter/PresenterConfigurationAccess.cxx274
-rw-r--r--sdext/source/presenter/PresenterConfigurationAccess.hxx178
-rw-r--r--sdext/source/presenter/PresenterController.cxx1185
-rw-r--r--sdext/source/presenter/PresenterController.hxx222
-rw-r--r--sdext/source/presenter/PresenterCurrentSlideObserver.cxx130
-rw-r--r--sdext/source/presenter/PresenterCurrentSlideObserver.hxx81
-rw-r--r--sdext/source/presenter/PresenterFrameworkObserver.cxx109
-rw-r--r--sdext/source/presenter/PresenterFrameworkObserver.hxx81
-rw-r--r--sdext/source/presenter/PresenterGeometryHelper.cxx262
-rw-r--r--sdext/source/presenter/PresenterGeometryHelper.hxx117
-rw-r--r--sdext/source/presenter/PresenterHelpView.cxx747
-rw-r--r--sdext/source/presenter/PresenterHelpView.hxx121
-rw-r--r--sdext/source/presenter/PresenterHelper.cxx56
-rw-r--r--sdext/source/presenter/PresenterHelper.hxx48
-rw-r--r--sdext/source/presenter/PresenterNotesView.cxx650
-rw-r--r--sdext/source/presenter/PresenterNotesView.hxx156
-rw-r--r--sdext/source/presenter/PresenterPaintManager.cxx141
-rw-r--r--sdext/source/presenter/PresenterPaintManager.hxx89
-rw-r--r--sdext/source/presenter/PresenterPane.cxx169
-rw-r--r--sdext/source/presenter/PresenterPane.hxx80
-rw-r--r--sdext/source/presenter/PresenterPaneBase.cxx342
-rw-r--r--sdext/source/presenter/PresenterPaneBase.hxx128
-rw-r--r--sdext/source/presenter/PresenterPaneBorderPainter.cxx882
-rw-r--r--sdext/source/presenter/PresenterPaneBorderPainter.hxx138
-rw-r--r--sdext/source/presenter/PresenterPaneContainer.cxx331
-rw-r--r--sdext/source/presenter/PresenterPaneContainer.hxx161
-rw-r--r--sdext/source/presenter/PresenterPaneFactory.cxx283
-rw-r--r--sdext/source/presenter/PresenterPaneFactory.hxx117
-rw-r--r--sdext/source/presenter/PresenterProtocolHandler.cxx829
-rw-r--r--sdext/source/presenter/PresenterProtocolHandler.hxx91
-rw-r--r--sdext/source/presenter/PresenterScreen.cxx801
-rw-r--r--sdext/source/presenter/PresenterScreen.hxx227
-rw-r--r--sdext/source/presenter/PresenterScrollBar.cxx824
-rw-r--r--sdext/source/presenter/PresenterScrollBar.hxx257
-rw-r--r--sdext/source/presenter/PresenterSlidePreview.cxx352
-rw-r--r--sdext/source/presenter/PresenterSlidePreview.hxx145
-rw-r--r--sdext/source/presenter/PresenterSlideShowView.cxx953
-rw-r--r--sdext/source/presenter/PresenterSlideShowView.hxx241
-rw-r--r--sdext/source/presenter/PresenterSlideSorter.cxx1929
-rw-r--r--sdext/source/presenter/PresenterSlideSorter.hxx189
-rw-r--r--sdext/source/presenter/PresenterSprite.cxx163
-rw-r--r--sdext/source/presenter/PresenterSprite.hxx73
-rw-r--r--sdext/source/presenter/PresenterSpritePane.cxx172
-rw-r--r--sdext/source/presenter/PresenterSpritePane.hxx79
-rw-r--r--sdext/source/presenter/PresenterTextView.cxx1192
-rw-r--r--sdext/source/presenter/PresenterTextView.hxx279
-rw-r--r--sdext/source/presenter/PresenterTheme.cxx1060
-rw-r--r--sdext/source/presenter/PresenterTheme.hxx134
-rw-r--r--sdext/source/presenter/PresenterTimer.cxx571
-rw-r--r--sdext/source/presenter/PresenterTimer.hxx122
-rw-r--r--sdext/source/presenter/PresenterToolBar.cxx2015
-rw-r--r--sdext/source/presenter/PresenterToolBar.hxx250
-rw-r--r--sdext/source/presenter/PresenterUIPainter.cxx241
-rw-r--r--sdext/source/presenter/PresenterUIPainter.hxx56
-rw-r--r--sdext/source/presenter/PresenterViewFactory.cxx503
-rw-r--r--sdext/source/presenter/PresenterViewFactory.hxx164
-rw-r--r--sdext/source/presenter/PresenterWindowManager.cxx1043
-rw-r--r--sdext/source/presenter/PresenterWindowManager.hxx208
-rw-r--r--sdext/source/presenter/presenter.component18
2116 files changed, 655765 insertions, 0 deletions
diff --git a/sd/AllLangMoTarget_sd.mk b/sd/AllLangMoTarget_sd.mk
new file mode 100644
index 000000000..7ea813e5f
--- /dev/null
+++ b/sd/AllLangMoTarget_sd.mk
@@ -0,0 +1,11 @@
+# -*- 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,sd))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_activex_controls_tests.mk b/sd/CppunitTest_sd_activex_controls_tests.mk
new file mode 100644
index 000000000..5fa268efb
--- /dev/null
+++ b/sd/CppunitTest_sd_activex_controls_tests.mk
@@ -0,0 +1,71 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t; fill-column: 100 -*-
+#
+# 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,sd_activex_controls_tests))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_activex_controls_tests,\
+ boost_headers \
+ libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_activex_controls_tests))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_activex_controls_tests, \
+ sd/qa/unit/activex-controls-tests \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_activex_controls_tests, \
+ $(call gb_Helper_optional,AVMEDIA,avmedia) \
+ basegfx \
+ comphelper \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ for \
+ forui \
+ i18nlangtag \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sd \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ test \
+ tl \
+ tk \
+ ucbhelper \
+ unotest \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sd_activex_controls_tests,\
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_activex_controls_tests))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_activex_controls_tests))
+$(eval $(call gb_CppunitTest_use_vcl,sd_activex_controls_tests))
+
+$(eval $(call gb_CppunitTest_use_rdb,sd_activex_controls_tests,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_activex_controls_tests))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_dialogs_test.mk b/sd/CppunitTest_sd_dialogs_test.mk
new file mode 100644
index 000000000..839f702de
--- /dev/null
+++ b/sd/CppunitTest_sd_dialogs_test.mk
@@ -0,0 +1,77 @@
+# -*- 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_CppunitScreenShot,sd_dialogs_test))
+
+$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_dialogs_test))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_dialogs_test, \
+ sd/qa/unit/dialogs-test \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_dialogs_test))
+
+$(eval $(call gb_CppunitTest_set_include,sd_dialogs_test,\
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_dialogs_test, \
+ basegfx \
+ comphelper \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ i18nlangtag \
+ i18nutil \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sd \
+ sdui \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ test \
+ tl \
+ tk \
+ ucbhelper \
+ unotest \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_CppunitTest_use_external,sd_dialogs_test,boost_headers))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_dialogs_test))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_dialogs_test))
+$(eval $(call gb_CppunitTest_use_vcl_non_headless_with_windows,sd_dialogs_test))
+
+$(eval $(call gb_CppunitTest_use_rdb,sd_dialogs_test,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_dialogs_test))
+
+$(eval $(call gb_CppunitTest_use_uiconfigs,sd_dialogs_test,\
+ cui \
+ modules/sdraw \
+ modules/simpress \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_export_tests-ooxml1.mk b/sd/CppunitTest_sd_export_tests-ooxml1.mk
new file mode 100644
index 000000000..914ff8ec5
--- /dev/null
+++ b/sd/CppunitTest_sd_export_tests-ooxml1.mk
@@ -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/.
+#
+#*************************************************************************
+
+$(eval $(call sd_export_test,-ooxml1))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_export_tests-ooxml2.mk b/sd/CppunitTest_sd_export_tests-ooxml2.mk
new file mode 100644
index 000000000..44664f69a
--- /dev/null
+++ b/sd/CppunitTest_sd_export_tests-ooxml2.mk
@@ -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/.
+#
+#*************************************************************************
+
+$(eval $(call sd_export_test,-ooxml2))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_export_tests-ooxml3.mk b/sd/CppunitTest_sd_export_tests-ooxml3.mk
new file mode 100644
index 000000000..4e79f4ccd
--- /dev/null
+++ b/sd/CppunitTest_sd_export_tests-ooxml3.mk
@@ -0,0 +1,17 @@
+# -*- 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 sd_export_test,-ooxml3))
+
+$(call gb_CppunitTest_get_target,sd_export_tests-ooxml3): \
+ $(call gb_Package_get_target,postprocess_images)
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_export_tests.mk b/sd/CppunitTest_sd_export_tests.mk
new file mode 100644
index 000000000..20aea4da1
--- /dev/null
+++ b/sd/CppunitTest_sd_export_tests.mk
@@ -0,0 +1,15 @@
+# -*- 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/.
+#
+#*************************************************************************
+
+# empty second argument (i.e. no 1)
+$(eval $(call sd_export_test,))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_filter_eppt.mk b/sd/CppunitTest_sd_filter_eppt.mk
new file mode 100644
index 000000000..0105efe5d
--- /dev/null
+++ b/sd/CppunitTest_sd_filter_eppt.mk
@@ -0,0 +1,50 @@
+# -*- 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,sd_filter_eppt))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_filter_eppt,\
+ boost_headers \
+ libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_filter_eppt, \
+ sd/qa/filter/eppt/eppt \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_filter_eppt, \
+ comphelper \
+ cppu \
+ sdfilt \
+ sal \
+ test \
+ unotest \
+ utl \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_filter_eppt))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_filter_eppt))
+$(eval $(call gb_CppunitTest_use_vcl,sd_filter_eppt))
+
+$(eval $(call gb_CppunitTest_use_rdb,sd_filter_eppt,services))
+
+$(eval $(call gb_CppunitTest_use_custom_headers,sd_filter_eppt,\
+ officecfg/registry \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_filter_eppt))
+
+$(eval $(call gb_CppunitTest_add_arguments,sd_filter_eppt, \
+ -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_filters_test.mk b/sd/CppunitTest_sd_filters_test.mk
new file mode 100644
index 000000000..0668683fa
--- /dev/null
+++ b/sd/CppunitTest_sd_filters_test.mk
@@ -0,0 +1,78 @@
+# -*- 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,sd_filters_test))
+
+$(eval $(call gb_CppunitTest_use_external,sd_filters_test,boost_headers))
+
+$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_filters_test))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_filters_test, \
+ sd/qa/unit/filters-test \
+))
+
+ifeq ($(DISABLE_CVE_TESTS),TRUE)
+$(eval $(call gb_CppunitTest_add_defs,sd_filters_test,\
+ -DDISABLE_CVE_TESTS \
+))
+endif
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_filters_test, \
+ basegfx \
+ comphelper \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ i18nlangtag \
+ i18nutil \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sd \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ test \
+ tl \
+ tk \
+ ucbhelper \
+ unotest \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sd_filters_test,\
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_filters_test))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_filters_test))
+$(eval $(call gb_CppunitTest_use_vcl,sd_filters_test))
+
+$(eval $(call gb_CppunitTest_use_rdb,sd_filters_test,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_filters_test))
+
+# sd dlopens libicg.so for cgm import, so ensure its built by now
+$(call gb_CppunitTest_get_target,sd_filters_test) : | \
+ $(call gb_Library_get_target,icg) \
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_html_export_tests.mk b/sd/CppunitTest_sd_html_export_tests.mk
new file mode 100644
index 000000000..268f2b193
--- /dev/null
+++ b/sd/CppunitTest_sd_html_export_tests.mk
@@ -0,0 +1,72 @@
+# -*- 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,sd_html_export_tests))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_html_export_tests,\
+ boost_headers \
+ libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_html_export_tests))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_html_export_tests, \
+ sd/qa/unit/HtmlExportTest \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_html_export_tests, \
+ basegfx \
+ comphelper \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ for \
+ forui \
+ i18nlangtag \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sd \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ test \
+ tl \
+ tk \
+ ucbhelper \
+ unotest \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sd_html_export_tests,\
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_html_export_tests))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_html_export_tests))
+$(eval $(call gb_CppunitTest_use_vcl,sd_html_export_tests))
+
+$(eval $(call gb_CppunitTest_use_rdb,sd_html_export_tests,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_html_export_tests))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_import_tests-smartart.mk b/sd/CppunitTest_sd_import_tests-smartart.mk
new file mode 100644
index 000000000..9b7362b08
--- /dev/null
+++ b/sd/CppunitTest_sd_import_tests-smartart.mk
@@ -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/.
+#
+#*************************************************************************
+
+$(eval $(call sd_import_test,-smartart))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_import_tests.mk b/sd/CppunitTest_sd_import_tests.mk
new file mode 100644
index 000000000..c75b571c2
--- /dev/null
+++ b/sd/CppunitTest_sd_import_tests.mk
@@ -0,0 +1,15 @@
+# -*- 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/.
+#
+#*************************************************************************
+
+# empty second argument (i.e. no 1)
+$(eval $(call sd_import_test,))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_import_tests2.mk b/sd/CppunitTest_sd_import_tests2.mk
new file mode 100644
index 000000000..102de14b4
--- /dev/null
+++ b/sd/CppunitTest_sd_import_tests2.mk
@@ -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/.
+#
+#*************************************************************************
+
+$(eval $(call sd_import_test,2))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_layout_tests.mk b/sd/CppunitTest_sd_layout_tests.mk
new file mode 100644
index 000000000..03075c2c7
--- /dev/null
+++ b/sd/CppunitTest_sd_layout_tests.mk
@@ -0,0 +1,77 @@
+# -*- 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,sd_layout_tests))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_layout_tests,\
+ boost_headers \
+ libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_layout_tests))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_layout_tests, \
+ sd/qa/unit/layout-tests \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_layout_tests, \
+ $(call gb_Helper_optional,AVMEDIA,avmedia) \
+ basegfx \
+ comphelper \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ for \
+ forui \
+ i18nlangtag \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sd \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ test \
+ tl \
+ tk \
+ ucbhelper \
+ unotest \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sd_layout_tests,\
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_layout_tests))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_layout_tests))
+$(eval $(call gb_CppunitTest_use_vcl,sd_layout_tests))
+
+$(eval $(call gb_CppunitTest_use_rdb,sd_layout_tests,services))
+
+$(eval $(call gb_CppunitTest_use_custom_headers,sd_layout_tests,\
+ officecfg/registry \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_layout_tests))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_misc_tests.mk b/sd/CppunitTest_sd_misc_tests.mk
new file mode 100644
index 000000000..ce1e0dd86
--- /dev/null
+++ b/sd/CppunitTest_sd_misc_tests.mk
@@ -0,0 +1,135 @@
+# -*- 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,sd_misc_tests))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_misc_tests,\
+ boost_headers \
+ libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_misc_tests))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_misc_tests, \
+ sd/qa/unit/misc-tests \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_misc_tests, \
+ $(call gb_Helper_optional,AVMEDIA,avmedia) \
+ basegfx \
+ canvastools \
+ comphelper \
+ cppcanvas \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ for \
+ forui \
+ i18nlangtag \
+ i18nutil \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sb \
+ sd \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ test \
+ tl \
+ tk \
+ ucbhelper \
+ unotest \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sd_misc_tests,\
+ -I$(SRCDIR)/sd/inc \
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/source/ui/slidesorter/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_misc_tests))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_misc_tests,\
+ boost_headers \
+))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_misc_tests))
+$(eval $(call gb_CppunitTest_use_vcl,sd_misc_tests))
+
+$(eval $(call gb_CppunitTest_use_components,sd_misc_tests,\
+ animations/source/animcore/animcore \
+ basic/util/sb \
+ chart2/source/chartcore \
+ chart2/source/controller/chartcontroller \
+ comphelper/util/comphelp \
+ configmgr/source/configmgr \
+ dbaccess/util/dba \
+ desktop/source/deployment/deployment \
+ embeddedobj/util/embobj \
+ filter/source/config/cache/filterconfig1 \
+ filter/source/odfflatxml/odfflatxml \
+ filter/source/svg/svgfilter \
+ filter/source/xmlfilteradaptor/xmlfa \
+ filter/source/xmlfilterdetect/xmlfd \
+ forms/util/frm \
+ framework/util/fwk \
+ i18npool/util/i18npool \
+ linguistic/source/lng \
+ oox/util/oox \
+ package/source/xstor/xstor \
+ package/util/package2 \
+ sax/source/expatwrap/expwrap \
+ sd/util/sd \
+ sd/util/sdfilt \
+ sd/util/sdd \
+ sfx2/util/sfx \
+ sot/util/sot \
+ svl/source/fsstor/fsstorage \
+ svtools/util/svt \
+ toolkit/util/tk \
+ ucb/source/core/ucb1 \
+ ucb/source/ucp/expand/ucpexpand1 \
+ ucb/source/ucp/file/ucpfile1 \
+ ucb/source/ucp/package/ucppkg1 \
+ ucb/source/ucp/tdoc/ucptdoc1 \
+ unotools/util/utl \
+ unoxml/source/rdf/unordf \
+ unoxml/source/service/unoxml \
+ uui/util/uui \
+ vcl/vcl.common \
+ xmloff/util/xo \
+ xmlsecurity/util/xmlsecurity \
+))
+
+$(eval $(call gb_CppunitTest_use_custom_headers,sd_misc_tests,\
+ officecfg/registry \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_misc_tests))
+
+$(call gb_CppunitTest_get_target,sd_misc_tests): $(call gb_Package_get_target,postprocess_images)
+
+$(eval $(call gb_CppunitTest_add_arguments,sd_misc_tests, \
+ -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_pdf_import_test.mk b/sd/CppunitTest_sd_pdf_import_test.mk
new file mode 100644
index 000000000..6dedcbf42
--- /dev/null
+++ b/sd/CppunitTest_sd_pdf_import_test.mk
@@ -0,0 +1,72 @@
+# -*- 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,sd_pdf_import_test))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_pdf_import_test, \
+ sd/qa/unit/SdrPdfImportTest \
+))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_pdf_import_test, \
+ boost_headers \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sd_pdf_import_test,\
+ -I$(SRCDIR)/sd/inc \
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/source/ui/slidesorter/inc \
+ -I$(SRCDIR)/svx/source/inc \
+ -I$(SRCDIR)/svx/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_pdf_import_test, \
+ $(call gb_Helper_optional,AVMEDIA,avmedia) \
+ basegfx \
+ canvastools \
+ comphelper \
+ cppcanvas \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ for \
+ forui \
+ i18nlangtag \
+ i18nutil \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sb \
+ sd \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ test \
+ tl \
+ tk \
+ ucbhelper \
+ unotest \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_pdf_import_test))
+$(eval $(call gb_CppunitTest_use_ure,sd_pdf_import_test))
+$(eval $(call gb_CppunitTest_use_vcl,sd_pdf_import_test))
+$(eval $(call gb_CppunitTest_use_rdb,sd_pdf_import_test,services))
+$(eval $(call gb_CppunitTest_use_configuration,sd_pdf_import_test))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_png_export_tests.mk b/sd/CppunitTest_sd_png_export_tests.mk
new file mode 100644
index 000000000..015557873
--- /dev/null
+++ b/sd/CppunitTest_sd_png_export_tests.mk
@@ -0,0 +1,72 @@
+# -*- 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,sd_png_export_tests))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_png_export_tests,\
+ boost_headers \
+ libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_png_export_tests))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_png_export_tests, \
+ sd/qa/unit/PNGExportTests \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_png_export_tests, \
+ basegfx \
+ comphelper \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ for \
+ forui \
+ i18nlangtag \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sd \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ test \
+ tl \
+ tk \
+ ucbhelper \
+ unotest \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sd_png_export_tests,\
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_png_export_tests))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_png_export_tests))
+$(eval $(call gb_CppunitTest_use_vcl,sd_png_export_tests))
+
+$(eval $(call gb_CppunitTest_use_rdb,sd_png_export_tests,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_png_export_tests))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_shape_import_export_tests.mk b/sd/CppunitTest_sd_shape_import_export_tests.mk
new file mode 100644
index 000000000..89d1f96ef
--- /dev/null
+++ b/sd/CppunitTest_sd_shape_import_export_tests.mk
@@ -0,0 +1,74 @@
+# -*- 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,sd_shape_import_export_tests))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_shape_import_export_tests,\
+ boost_headers \
+ libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_shape_import_export_tests, \
+ sd/qa/unit/ShapeImportExportTest \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sd_shape_import_export_tests,\
+ -I$(SRCDIR)/sd/inc \
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/source/ui/slidesorter/inc \
+ -I$(SRCDIR)/svx/source/inc \
+ -I$(SRCDIR)/svx/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_shape_import_export_tests, \
+ $(call gb_Helper_optional,AVMEDIA,avmedia) \
+ basegfx \
+ canvastools \
+ comphelper \
+ cppcanvas \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ for \
+ forui \
+ i18nlangtag \
+ i18nutil \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sb \
+ sd \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ test \
+ tl \
+ tk \
+ ucbhelper \
+ unotest \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_shape_import_export_tests))
+$(eval $(call gb_CppunitTest_use_ure,sd_shape_import_export_tests))
+$(eval $(call gb_CppunitTest_use_vcl,sd_shape_import_export_tests))
+$(eval $(call gb_CppunitTest_use_rdb,sd_shape_import_export_tests,services))
+$(eval $(call gb_CppunitTest_use_configuration,sd_shape_import_export_tests))
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_svg_export_tests.mk b/sd/CppunitTest_sd_svg_export_tests.mk
new file mode 100644
index 000000000..728ab4000
--- /dev/null
+++ b/sd/CppunitTest_sd_svg_export_tests.mk
@@ -0,0 +1,72 @@
+# -*- 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,sd_svg_export_tests))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_svg_export_tests,\
+ boost_headers \
+ libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_svg_export_tests))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_svg_export_tests, \
+ sd/qa/unit/SVGExportTests \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_svg_export_tests, \
+ basegfx \
+ comphelper \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ for \
+ forui \
+ i18nlangtag \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sd \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ test \
+ tl \
+ tk \
+ ucbhelper \
+ unotest \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sd_svg_export_tests,\
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_svg_export_tests))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_svg_export_tests))
+$(eval $(call gb_CppunitTest_use_vcl,sd_svg_export_tests))
+
+$(eval $(call gb_CppunitTest_use_rdb,sd_svg_export_tests,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_svg_export_tests))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_tiledrendering.mk b/sd/CppunitTest_sd_tiledrendering.mk
new file mode 100644
index 000000000..a408aa4d7
--- /dev/null
+++ b/sd/CppunitTest_sd_tiledrendering.mk
@@ -0,0 +1,71 @@
+# -*- 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,sd_tiledrendering))
+
+$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_tiledrendering))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_tiledrendering, \
+ sd/qa/unit/tiledrendering/LOKitSearchTest \
+ sd/qa/unit/tiledrendering/tiledrendering \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_tiledrendering, \
+ comphelper \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ sal \
+ sfx \
+ svl \
+ svt \
+ svxcore \
+ sd \
+ test \
+ unotest \
+ vcl \
+ tl \
+ utl \
+))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_tiledrendering,\
+ boost_headers \
+ libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sd_tiledrendering,\
+ -I$(SRCDIR)/sd/inc \
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/qa/unit \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_tiledrendering))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_tiledrendering))
+$(eval $(call gb_CppunitTest_use_vcl,sd_tiledrendering))
+
+$(eval $(call gb_CppunitTest_use_rdb,sd_tiledrendering,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_tiledrendering))
+
+$(eval $(call gb_CppunitTest_use_uiconfigs,sd_tiledrendering, \
+ modules/simpress \
+ svx \
+))
+
+
+$(eval $(call gb_CppunitTest_add_arguments,sd_tiledrendering, \
+ -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_uiimpress.mk b/sd/CppunitTest_sd_uiimpress.mk
new file mode 100644
index 000000000..4d06c52db
--- /dev/null
+++ b/sd/CppunitTest_sd_uiimpress.mk
@@ -0,0 +1,86 @@
+# -*- 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,sd_uiimpress))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_uiimpress,\
+ boost_headers \
+ libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_uiimpress))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_uiimpress, \
+ sd/qa/unit/uiimpress \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_uiimpress, \
+ $(call gb_Helper_optional,AVMEDIA,avmedia) \
+ basegfx \
+ canvastools \
+ comphelper \
+ cppcanvas \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ for \
+ forui \
+ i18nlangtag \
+ i18nutil \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sb \
+ sd \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ test \
+ tl \
+ tk \
+ ucbhelper \
+ unotest \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sd_uiimpress,\
+ -I$(SRCDIR)/sd/inc \
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/source/ui/slidesorter/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_uiimpress))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_uiimpress,\
+ boost_headers \
+))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_uiimpress))
+$(eval $(call gb_CppunitTest_use_vcl,sd_uiimpress))
+
+$(eval $(call gb_CppunitTest_use_rdb,sd_uiimpress,services))
+
+$(eval $(call gb_CppunitTest_use_custom_headers,sd_uiimpress,\
+ officecfg/registry \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_uiimpress))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/CppunitTest_sd_uimpress.mk b/sd/CppunitTest_sd_uimpress.mk
new file mode 100644
index 000000000..63f143978
--- /dev/null
+++ b/sd/CppunitTest_sd_uimpress.mk
@@ -0,0 +1,112 @@
+# -*- 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,sd_uimpress))
+
+$(eval $(call gb_CppunitTest_set_include,sd_uimpress,\
+ $$(INCLUDE) \
+ -I$(SRCDIR)/sd/inc \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_uimpress))
+
+$(eval $(call gb_CppunitTest_use_library_objects,sd_uimpress,sd))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_uimpress,\
+ $(call gb_Helper_optional,AVMEDIA,avmedia) \
+ basegfx \
+ canvastools \
+ comphelper \
+ cppcanvas \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ drawinglayercore \
+ editeng \
+ i18nlangtag \
+ i18nutil \
+ msfilter \
+ oox \
+ sal \
+ sax \
+ salhelper \
+ sb \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svxcore \
+ svx \
+ test \
+ tk \
+ tl \
+ ucbhelper \
+ utl \
+ vcl \
+ xo \
+))
+
+ifeq ($(OS),WNT)
+$(eval $(call gb_CppunitTest_use_system_win32_libs,sd_uimpress,\
+ uuid \
+ ws2_32 \
+))
+endif
+
+ifeq ($(OS),MACOSX)
+$(eval $(call gb_CppunitTest_add_libs,sd_uimpress,\
+ -lobjc \
+))
+
+$(eval $(call gb_CppunitTest_use_system_darwin_frameworks,sd_uimpress,\
+ Foundation \
+ IOBluetooth \
+))
+endif
+
+$(eval $(call gb_CppunitTest_use_externals,sd_uimpress,\
+ boost_headers \
+ dbus \
+ $(if $(ENABLE_AVAHI), \
+ avahi \
+ ) \
+ $(if $(filter WNT,$(OS)),mDNSResponder) \
+ libxml2 \
+))
+
+ifneq ($(DBUS_HAVE_GLIB),)
+$(eval $(call gb_CppunitTest_set_include,sd_uimpress,\
+ $$(INCLUDE) \
+ $(DBUS_GLIB_CFLAGS) \
+))
+$(eval $(call gb_CppunitTest_add_libs,sd_uimpress,\
+ $(DBUS_GLIB_LIBS) \
+))
+endif
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_uimpress,\
+ sd/qa/unit/uimpress \
+))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_uimpress))
+$(eval $(call gb_CppunitTest_use_vcl,sd_uimpress))
+
+$(eval $(call gb_CppunitTest_use_components,sd_uimpress,\
+ configmgr/source/configmgr \
+ framework/util/fwk \
+ i18npool/util/i18npool \
+ linguistic/source/lng \
+ ucb/source/core/ucb1 \
+ ucb/source/ucp/file/ucpfile1 \
+ unoxml/source/service/unoxml \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_uimpress))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/IwyuFilter_sd.yaml b/sd/IwyuFilter_sd.yaml
new file mode 100644
index 000000000..3a1aed9d2
--- /dev/null
+++ b/sd/IwyuFilter_sd.yaml
@@ -0,0 +1,568 @@
+---
+assumeFilename: sd/source/core/drawdoc.cxx
+excludelist:
+ sd/qa/unit/SdrPdfImportTest.cxx:
+ # Actually used
+ - comphelper/scopeguard.hxx
+ # Needed on WIN to compile
+ - prewin.h
+ - postwin.h
+ - fpdfview.h
+ sd/sdi/sdslots.hrc:
+ # Needed for sdi files to compile
+ - sfx2/sfxsids.hrc
+ - editeng/editids.hrc
+ - editeng/memberids.h
+ - svx/svxids.hrc
+ - svx/unomid.hxx
+ - app.hrc
+ - sdattr.hrc
+ sd/inc/CustomAnimationCloner.hxx:
+ # base class has to be a complete type
+ - com/sun/star/animations/XAnimationNode.hpp
+ sd/inc/CustomAnimationPreset.hxx:
+ # base class has to be a complete type
+ - com/sun/star/lang/XMultiServiceFactory.hpp
+ sd/inc/CustomAnimationEffect.hxx:
+ # base class has to be a complete type
+ - com/sun/star/animations/XAnimationNode.hpp
+ - com/sun/star/animations/XAudio.hpp
+ - com/sun/star/animations/XTimeContainer.hpp
+ - com/sun/star/drawing/XShape.hpp
+ - com/sun/star/util/XChangesListener.hpp
+ sd/inc/OutlinerIterator.hxx:
+ # base class has to be a complete type
+ - svx/svdobj.hxx
+ sd/inc/sderror.hxx:
+ # needed for defines
+ - vcl/errcode.hxx
+ sd/inc/sdfilter.hxx:
+ # base class has to be a complete type
+ - com/sun/star/frame/XModel.hpp
+ - com/sun/star/task/XStatusIndicator.hpp
+ sd/inc/sdmod.hxx:
+ # base class has to be a complete type
+ - com/sun/star/beans/XPropertySetInfo.hpp
+ - sot/storage.hxx
+ # Needed for define
+ - sfx2/app.hxx
+ sd/inc/sdpage.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/XDrawPage.hpp
+ - com/sun/star/office/XAnnotation.hpp
+ sd/inc/stlfamily.hxx:
+ # base class has to be a complete type
+ - com/sun/star/beans/XPropertySet.hpp
+ - com/sun/star/container/XIndexAccess.hpp
+ - com/sun/star/container/XNameContainer.hpp
+ - com/sun/star/lang/XComponent.hpp
+ - com/sun/star/container/XNamed.hpp
+ - com/sun/star/lang/XServiceInfo.hpp
+ - com/sun/star/lang/XSingleServiceFactory.hpp
+ sd/inc/stlpool.hxx:
+ # base class has to be a complete type
+ - com/sun/star/lang/XServiceInfo.hpp
+ - com/sun/star/container/XIndexAccess.hpp
+ - com/sun/star/lang/XComponent.hpp
+ sd/inc/stlsheet.hxx:
+ # base class has to be a complete type
+ - com/sun/star/beans/XPropertySet.hpp
+ - com/sun/star/beans/XPropertyState.hpp
+ - com/sun/star/lang/XComponent.hpp
+ - com/sun/star/lang/XServiceInfo.hpp
+ - com/sun/star/style/XStyle.hpp
+ - com/sun/star/util/XModifyBroadcaster.hpp
+ sd/inc/textapi.hxx:
+ # base class has to be a complete type
+ - editeng/outliner.hxx
+ sd/inc/TransitionPreset.hxx:
+ # base class has to be a complete type
+ - com/sun/star/lang/XMultiServiceFactory.hpp
+ sd/inc/undoanim.hxx:
+ # base class has to be a complete type
+ - com/sun/star/animations/XAnimationNode.hpp
+ sd/inc/undo/undoobjects.hxx:
+ # base class has to be a complete type
+ - tools/weakbase.hxx
+ sd/source/filter/eppt/eppt.hxx:
+ # base class has to be a complete type
+ - escherex.hxx
+ sd/source/ui/annotations/annotationmanagerimpl.hxx:
+ # base class has to be a complete type
+ - annotationtag.hxx
+ - com/sun/star/document/XEventListener.hpp
+ sd/source/ui/annotations/annotationmanager.cxx:
+ # Needed for unique_ptr type
+ - editeng/outlobj.hxx
+ sd/source/ui/app/sdmod.cxx:
+ # Needed to inherit linker visibility from SdResId declaration
+ - sdresid.hxx
+ sd/source/ui/dlg/headerfooterdlg.cxx:
+ # Needed for unique_ptr type
+ - editeng/outlobj.hxx
+ sd/source/ui/dlg/prntopts.cxx:
+ # Needed on MACOSX
+ - svl/intitem.hxx
+ - app.hrc
+ sd/source/ui/dlg/sdtreelb.cxx:
+ # comphelper::ScopeGuard is actually used
+ - comphelper/scopeguard.hxx
+ sd/source/ui/framework/configuration/ConfigurationTracer.hxx:
+ # Needed for css shortcut
+ - sal/types.h
+ sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.hxx:
+ # base class has to be a complete type
+ - com/sun/star/container/XNamed.hpp
+ - com/sun/star/drawing/framework/XConfigurationChangeRequest.hpp
+ sd/source/ui/framework/configuration/UpdateRequest.hxx:
+ # base class has to be a complete type
+ - com/sun/star/container/XNamed.hpp
+ - com/sun/star/drawing/framework/XConfigurationChangeRequest.hpp
+ sd/source/ui/framework/factories/BasicToolBarFactory.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XResourceFactory.hpp
+ - com/sun/star/lang/XInitialization.hpp
+ sd/source/ui/framework/factories/BasicPaneFactory.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp
+ - com/sun/star/drawing/framework/XResourceFactory.hpp
+ - com/sun/star/lang/XInitialization.hpp
+ sd/source/ui/framework/factories/BasicViewFactory.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XResourceFactory.hpp
+ - com/sun/star/lang/XInitialization.hpp
+ sd/source/ui/framework/factories/ChildWindowPane.hxx:
+ # base class has to be a complete type
+ - com/sun/star/lang/XEventListener.hpp
+ - framework/Pane.hxx
+ sd/source/ui/framework/module/CenterViewFocusModule.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp
+ sd/source/ui/framework/module/ShellStackGuard.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp
+ sd/source/ui/framework/module/ToolBarModule.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp
+ sd/source/ui/framework/module/SlideSorterModule.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp
+ sd/source/ui/framework/module/ViewTabBarModule.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp
+ sd/source/ui/inc/AccessibleDocumentViewBase.hxx:
+ # base class has to be a complete type
+ - com/sun/star/accessibility/XAccessibleExtendedAttributes.hpp
+ - com/sun/star/awt/XFocusListener.hpp
+ - com/sun/star/awt/XWindowListener.hpp
+ - com/sun/star/beans/XPropertyChangeListener.hpp
+ sd/source/ui/inc/AccessibleDrawDocumentView.hxx:
+ # base class has to be a complete type
+ - com/sun/star/accessibility/XAccessibleGroupPosition.hpp
+ sd/source/ui/inc/AccessibleSlideSorterObject.hxx:
+ # base class has to be a complete type
+ - com/sun/star/accessibility/XAccessible.hpp
+ - com/sun/star/accessibility/XAccessibleComponent.hpp
+ - com/sun/star/accessibility/XAccessibleContext.hpp
+ - com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp
+ - com/sun/star/lang/XServiceInfo.hpp
+ sd/source/ui/inc/AccessibleSlideSorterView.hxx:
+ # base class has to be a complete type
+ - com/sun/star/accessibility/XAccessible.hpp
+ - com/sun/star/accessibility/XAccessibleComponent.hpp
+ - com/sun/star/accessibility/XAccessibleContext.hpp
+ - com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp
+ - com/sun/star/accessibility/XAccessibleSelection.hpp
+ - com/sun/star/lang/XServiceInfo.hpp
+ sd/source/ui/inc/CustomAnimationPane.hxx:
+ # Needed for typedef
+ - motionpathtag.hxx
+ sd/source/ui/inc/DrawDocShell.hxx:
+ # base class has to be a complete type
+ - fupoor.hxx
+ sd/source/ui/inc/DocumentRenderer.hxx:
+ # base class has to be a complete type
+ - com/sun/star/view/XRenderable.hpp
+ sd/source/ui/inc/DrawController.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/XDrawView.hpp
+ - com/sun/star/drawing/framework/XControllerManager.hpp
+ - com/sun/star/lang/XServiceInfo.hpp
+ - com/sun/star/lang/XUnoTunnel.hpp
+ - com/sun/star/view/XFormLayerAccess.hpp
+ - com/sun/star/view/XSelectionSupplier.hpp
+ - sfx2/sfxbasecontroller.hxx
+ sd/source/ui/inc/fupage.hxx:
+ # base class has to be a complete type
+ - vcl/weld.hxx
+ sd/source/ui/inc/slideshow.hxx:
+ # typedef needs a complete type
+ - com/sun/star/lang/XServiceInfo.hpp
+ - com/sun/star/presentation/XPresentation2.hpp
+ sd/source/ui/inc/unomodel.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/XDrawPages.hpp
+ sd/source/ui/inc/unosrch.hxx:
+ # base class has to be a complete type
+ - com/sun/star/lang/XUnoTunnel.hpp
+ - com/sun/star/util/XReplaceDescriptor.hpp
+ sd/source/ui/inc/ViewTabBar.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp
+ - com/sun/star/drawing/framework/XTabBar.hpp
+ - com/sun/star/drawing/framework/XToolBar.hpp
+ - com/sun/star/lang/XUnoTunnel.hpp
+ sd/source/ui/inc/framework/Configuration.hxx:
+ # base class has to be a complete type
+ - com/sun/star/container/XNamed.hpp
+ - com/sun/star/drawing/framework/XConfiguration.hpp
+ - com/sun/star/lang/XServiceInfo.hpp
+ sd/source/ui/inc/framework/ConfigurationController.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XConfigurationController.hpp
+ - com/sun/star/lang/XInitialization.hpp
+ sd/source/ui/inc/framework/DrawModule.hxx:
+ # Needed for css shortcut
+ - sal/types.h
+ sd/source/ui/inc/framework/ImpressModule.hxx:
+ # Needed for css shortcut
+ - sal/types.h
+ sd/source/ui/inc/framework/ModuleController.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XModuleController.hpp
+ - com/sun/star/lang/XInitialization.hpp
+ sd/source/ui/inc/framework/Pane.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XPane.hpp
+ - com/sun/star/drawing/framework/XPane2.hpp
+ - com/sun/star/lang/XUnoTunnel.hpp
+ sd/source/ui/inc/framework/PresentationModule.hxx:
+ # Needed for css shortcut
+ - sal/types.h
+ sd/source/ui/inc/framework/PresentationFactory.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XResourceFactory.hpp
+ - com/sun/star/drawing/framework/XConfigurationChangeListener.hpp
+ sd/source/ui/inc/framework/ResourceId.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/framework/XResourceId.hpp
+ - com/sun/star/lang/XInitialization.hpp
+ - com/sun/star/lang/XServiceInfo.hpp
+ sd/source/ui/inc/framework/ViewShellWrapper.hxx:
+ # base class has to be a complete type
+ - com/sun/star/awt/XWindowListener.hpp
+ - com/sun/star/drawing/framework/XRelocatableResource.hpp
+ - com/sun/star/drawing/framework/XView.hpp
+ - com/sun/star/lang/XUnoTunnel.hpp
+ - com/sun/star/view/XSelectionSupplier.hpp
+ sd/source/ui/inc/tools/PropertySet.hxx:
+ # base class has to be a complete type
+ - com/sun/star/beans/XPropertySet.hpp
+ sd/source/ui/inc/tools/SlotStateListener.hxx:
+ # base class has to be a complete type
+ - com/sun/star/frame/XStatusListener.hpp
+ sd/source/ui/presenter/PresenterHelper.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/XPresenterHelper.hpp
+ - com/sun/star/lang/XInitialization.hpp
+ sd/source/ui/presenter/PresenterPreviewCache.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/XSlidePreviewCache.hpp
+ - com/sun/star/lang/XInitialization.hpp
+ sd/source/ui/presenter/PresenterCanvas.hxx:
+ # base class has to be a complete type
+ - com/sun/star/rendering/XSpriteCanvas.hpp
+ - com/sun/star/rendering/XBitmap.hpp
+ - com/sun/star/awt/XWindowListener.hpp
+ sd/source/ui/presenter/PresenterTextView.hxx:
+ # base class has to be a complete type
+ - tools/PropertySet.hxx
+ - com/sun/star/lang/XInitialization.hpp
+ sd/source/ui/presenter/SlideRenderer.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/XSlideRenderer.hpp
+ - com/sun/star/lang/XInitialization.hpp
+ - com/sun/star/lang/XServiceInfo.hpp
+ sd/source/ui/remotecontrol/Listener.hxx:
+ # base class has to be a complete type
+ - com/sun/star/presentation/XSlideShowListener.hpp
+ sd/source/ui/sidebar/PanelFactory.hxx:
+ # base class has to be a complete type
+ - com/sun/star/ui/XUIElementFactory.hpp
+ sd/source/ui/sidebar/PageMarginUtils.hxx:
+ # Needed for std::abs
+ - cmath
+ sd/source/ui/slideshow/slideshowimpl.hxx:
+ # base class has to be a complete type
+ - com/sun/star/presentation/XShapeEventListener.hpp
+ - com/sun/star/presentation/XSlideShowController.hpp
+ - com/sun/star/presentation/XSlideShowListener.hpp
+ sd/source/ui/slideshow/slideshowviewimpl.hxx:
+ # base class has to be a complete type
+ - com/sun/star/awt/XPaintListener.hpp
+ - com/sun/star/awt/XWindowListener.hpp
+ - com/sun/star/presentation/XSlideShowView.hpp
+ - com/sun/star/util/XModifyListener.hpp
+ sd/source/ui/slidesorter/controller/SlsListener.hxx:
+ # base class has to be a complete type
+ - com/sun/star/document/XEventListener.hpp
+ - com/sun/star/beans/XPropertyChangeListener.hpp
+ - com/sun/star/accessibility/XAccessibleEventListener.hpp
+ - com/sun/star/frame/XFrameActionListener.hpp
+ sd/source/ui/slidesorter/shell/SlideSorterService.hxx:
+ # base class has to be a complete type
+ - com/sun/star/awt/XWindowListener.hpp
+ - com/sun/star/drawing/XSlideSorterBase.hpp
+ - com/sun/star/lang/XInitialization.hpp
+ sd/source/ui/unoidl/sddetect.hxx:
+ # base class has to be a complete type
+ - com/sun/star/document/XExtendedFilterDetection.hpp
+ - com/sun/star/lang/XServiceInfo.hpp
+ sd/source/ui/unoidl/unolayer.hxx:
+ # base class has to be a complete type
+ - com/sun/star/drawing/XLayer.hpp
+ - com/sun/star/drawing/XLayerManager.hpp
+ sd/source/ui/unoidl/unocpres.hxx:
+ # base class has to be a complete type
+ - com/sun/star/container/XIndexContainer.hpp
+ - com/sun/star/container/XNameContainer.hpp
+ - com/sun/star/container/XNamed.hpp
+ - com/sun/star/lang/XComponent.hpp
+ - com/sun/star/lang/XServiceInfo.hpp
+ - com/sun/star/lang/XSingleServiceFactory.hpp
+ - com/sun/star/lang/XUnoTunnel.hpp
+ sd/source/ui/unoidl/unopback.hxx:
+ # base class has to be a complete type
+ - com/sun/star/beans/XPropertySet.hpp
+ - com/sun/star/beans/XPropertyState.hpp
+ - com/sun/star/lang/XServiceInfo.hpp
+ - com/sun/star/lang/XUnoTunnel.hpp
+ sd/source/core/annotations/AnnotationEnumeration.cxx:
+ # Avoid loplugin:unreffun error
+ - AnnotationEnumeration.hxx
+ sd/source/core/CustomAnimationCloner.cxx:
+ # Avoid loplugin:unreffun error
+ - CustomAnimationCloner.hxx
+ sd/source/core/EffectMigration.cxx:
+ # Needed for UnoType
+ - com/sun/star/presentation/ParagraphTarget.hpp
+ sd/source/core/stlsheet.cxx:
+ # Needed for UnoType
+ - com/sun/star/table/BorderLine.hpp
+ # Needed for TypedWhichId macros
+ - svx/sdtaaitm.hxx
+ - svx/sdtacitm.hxx
+ - svx/sdtayitm.hxx
+ - svx/sdtaiitm.hxx
+ sd/source/core/typemap.cxx:
+ # Needed by sdslots.hxx to build
+ - config_options.h
+ - editeng/boxitem.hxx
+ - editeng/cmapitem.hxx
+ - editeng/colritem.hxx
+ - editeng/contouritem.hxx
+ - editeng/crossedoutitem.hxx
+ - editeng/fhgtitem.hxx
+ - editeng/fontitem.hxx
+ - editeng/kernitem.hxx
+ - editeng/langitem.hxx
+ - editeng/lineitem.hxx
+ - editeng/lrspitem.hxx
+ - editeng/lspcitem.hxx
+ - editeng/memberids.h
+ - editeng/postitem.hxx
+ - editeng/protitem.hxx
+ - editeng/shdditem.hxx
+ - editeng/sizeitem.hxx
+ - editeng/tstpitem.hxx
+ - editeng/udlnitem.hxx
+ - editeng/ulspitem.hxx
+ - editeng/wghtitem.hxx
+ - sfx2/frame.hxx
+ - sfx2/msg.hxx
+ - sfx2/tplpitem.hxx
+ - sfx2/zoomitem.hxx
+ - svl/globalnameitem.hxx
+ - svl/lckbitem.hxx
+ - svl/ptitem.hxx
+ - svl/rectitem.hxx
+ - svl/slstitm.hxx
+ - svl/srchitem.hxx
+ - svx/chrtitem.hxx
+ - svx/clipfmtitem.hxx
+ - svx/drawitem.hxx
+ - svx/galleryitem.hxx
+ - svx/hlnkitem.hxx
+ - svx/pageitem.hxx
+ - svx/postattr.hxx
+ - svx/rulritem.hxx
+ - svx/sdmetitm.hxx
+ - svx/sdooitm.hxx
+ - svx/sdprcitm.hxx
+ - svx/sdtfsitm.hxx
+ - svx/unomid.hxx
+ - svx/xbtmpit.hxx
+ - svx/xfillit0.hxx
+ - svx/xflclit.hxx
+ - svx/xflftrit.hxx
+ - svx/xflhtit.hxx
+ - svx/xftadit.hxx
+ - svx/xftdiit.hxx
+ - svx/xftmrit.hxx
+ - svx/xftouit.hxx
+ - svx/xftshcit.hxx
+ - svx/xftshit.hxx
+ - svx/xftshxy.hxx
+ - svx/xftstit.hxx
+ - svx/xlineit0.hxx
+ - svx/xlinjoit.hxx
+ - svx/xlncapit.hxx
+ - svx/xlnclit.hxx
+ - svx/xlndsit.hxx
+ - svx/xlnedit.hxx
+ - svx/xlnstit.hxx
+ - svx/xlnwtit.hxx
+ - svx/xtextit0.hxx
+ - svx/zoomslideritem.hxx
+ - svx/sdangitm.hxx
+ sd/source/core/drawdoc.cxx:
+ # Needed for template
+ - com/sun/star/frame/XModel.hpp
+ sd/source/core/text/textapi.cxx:
+ # Needed for macro defines
+ - editeng/unoprnms.hxx
+ sd/source/filter/eppt/epptso.cxx:
+ # Needed for direct member access
+ - com/sun/star/table/XTable.hpp
+ sd/source/filter/eppt/pptx-animations.hxx:
+ # Needed for typedef
+ - sax/fshelper.hxx
+ sd/source/filter/eppt/pptexanimations.cxx:
+ # Needed for template
+ - com/sun/star/drawing/XDrawPage.hpp
+ sd/source/filter/eppt/pptx-epptooxml.cxx:
+ # Needed for direct member access
+ - com/sun/star/task/XStatusIndicator.hpp
+ - com/sun/star/frame/XModel.hpp
+ sd/source/filter/eppt/pptx-text.cxx:
+ # Needed for direct member access
+ - com/sun/star/awt/XBitmap.hpp
+ - com/sun/star/beans/XPropertyState.hpp
+ - com/sun/star/style/TabStop.hpp
+ - com/sun/star/graphic/XGraphic.hpp
+ sd/source/filter/eppt/epptso.cxx:
+ # Needed for template
+ - com/sun/star/frame/XModel.hpp
+ sd/source/filter/ppt/pptinanimations.cxx:
+ # Needed for template
+ - com/sun/star/drawing/XDrawPage.hpp
+ sd/source/filter/xml/sdxmlwrp.cxx:
+ # Needed for implicit dtor
+ - editeng/outlobj.hxx
+ sd/source/filter/xml/sdtransform.cxx:
+ # Needed for implicit dtor
+ - editeng/outlobj.hxx
+ sd/source/ui/annotations/annotationtag.cxx:
+ # Needed for template
+ - com/sun/star/office/XAnnotation.hpp
+ sd/source/ui/animations/CustomAnimationList.cxx:
+ # Actually used
+ - comphelper/scopeguard.hxx
+ sd/source/ui/animations/CustomAnimationPane.cxx:
+ # Actually used
+ - comphelper/scopeguard.hxx
+ sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.cxx:
+ # Needed for DEBUG_SD_CONFIGURATION_TRACE
+ - ConfigurationTracer.hxx
+ - com/sun/star/container/XNamed.hpp
+ sd/source/ui/framework/configuration/ConfigurationTracer.cxx:
+ # Needed for DEBUG mode
+ - sal/log.hxx
+ sd/source/ui/framework/configuration/ConfigurationUpdater.cxx:
+ # Needed for DEBUG_SD_CONFIGURATION_TRACE
+ - ConfigurationTracer.hxx
+ # comphelper::ScopeGuard is actually used
+ - comphelper/scopeguard.hxx
+ sd/source/ui/framework/configuration/ResourceFactoryManager.cxx:
+ # Needed for VERBOSE mode
+ - sal/log.hxx
+ sd/source/ui/framework/module/ModuleController.cxx:
+ # Needed for direct member access
+ - com/sun/star/frame/XController.hpp
+ sd/source/ui/func/fuconbez.cxx:
+ # Needed for virtual method parameter
+ - Window.hxx
+ sd/source/ui/func/fuhhconv.cxx:
+ # Needed for direct member access
+ - com/sun/star/awt/XWindow.hpp
+ sd/source/ui/dlg/RemoteDialogClientBox.cxx:
+ # Actually used
+ - vector
+ sd/source/ui/dlg/sdtreelb.cxx:
+ # Needed for template
+ - com/sun/star/embed/XEmbeddedObject.hpp
+ sd/source/ui/func/futempl.cxx:
+ # Needed for template
+ - com/sun/star/frame/XModel.hpp
+ sd/source/ui/presenter/PresenterHelper.cxx:
+ # Needed for template
+ - com/sun/star/awt/XWindowPeer.hpp
+ sd/source/ui/sidebar/MasterPageObserver.cxx:
+ # Actually used
+ - set
+ sd/source/ui/slideshow/PaneHider.cxx:
+ # Needed for template
+ - com/sun/star/frame/XController.hpp
+ sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx:
+ # Needed for instantiation of function template specialization
+ - Window.hxx
+ # Needed for rtl::math::round
+ - rtl/math.hxx
+ sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx:
+ # Needed for OSL_DEBUG_LEVEL >=2
+ - sal/log.hxx
+ sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx:
+ # Needed for template
+ - com/sun/star/frame/XController.hpp
+ sd/source/ui/slidesorter/controller/SlsListener.cxx:
+ # Needed for template
+ - com/sun/star/frame/FrameActionEvent.hpp
+ sd/source/ui/unoidl/sddetect.cxx:
+ # Needed for template
+ - com/sun/star/beans/PropertyValue.hpp
+ sd/source/ui/unoidl/unoobj.cxx:
+ # Needed for template
+ - com/sun/star/beans/PropertyState.hpp
+ sd/source/ui/unoidl/unodoc.cxx:
+ # Needed for template
+ - com/sun/star/frame/XModel.hpp
+ sd/source/ui/view/GraphicObjectBar.cxx:
+ # Needed by a sdslots.hxx constant
+ - svx/svxids.hrc
+ sd/source/ui/view/Outliner.cxx:
+ # comphelper::ScopeGuard is actually used
+ - comphelper/scopeguard.hxx
+ sd/source/ui/view/PresentationViewShellBase.cxx:
+ # Needed for template
+ - com/sun/star/frame/XFrame.hpp
+ sd/source/ui/view/drviews1.cxx:
+ # comphelper::ScopeGuard is actually used
+ - comphelper/scopeguard.hxx
+ sd/source/ui/view/drviews2.cxx:
+ # comphelper::ScopeGuard is actually used
+ - comphelper/scopeguard.hxx
+ sd/source/ui/view/drviewsf.cxx:
+ # Needed for template
+ - svx/sdmetitm.hxx
+ sd/source/ui/view/drvwshrg.cxx:
+ # Needed by a sdslots.hxx constant
+ - app.hrc
+ sd/source/ui/view/MediaObjectBar.cxx:
+ # Needed by a sdslots.hxx constant
+ - sfx2/sfxsids.hrc
+ sd/source/ui/view/sdview2.cxx:
+ # Needed for template
+ - com/sun/star/embed/XEmbeddedObject.hpp
+ sd/source/ui/view/presvish.cxx:
+ # Needed by a sdslots.hxx constant
+ - svx/svxids.hrc
diff --git a/sd/JunitTest_sd_unoapi.mk b/sd/JunitTest_sd_unoapi.mk
new file mode 100644
index 000000000..85f5f3d49
--- /dev/null
+++ b/sd/JunitTest_sd_unoapi.mk
@@ -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/.
+#
+
+$(eval $(call gb_JunitTest_JunitTest,sd_unoapi))
+
+$(eval $(call gb_JunitTest_set_unoapi_test_defaults,sd_unoapi))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/Library_sd.mk b/sd/Library_sd.mk
new file mode 100644
index 000000000..1ded5eadc
--- /dev/null
+++ b/sd/Library_sd.mk
@@ -0,0 +1,590 @@
+# -*- 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,sd))
+
+$(eval $(call gb_Library_set_precompiled_header,sd,sd/inc/pch/precompiled_sd))
+
+# runtime dependency for unit tests
+$(eval $(call gb_Library_use_package,sd,sd_xml))
+
+$(eval $(call gb_SdiTarget_SdiTarget,sd/sdi/sdslots,sd/sdi/sdslots))
+
+$(eval $(call gb_SdiTarget_set_include,sd/sdi/sdslots,\
+ -I$(SRCDIR)/sd/inc \
+ -I$(SRCDIR)/sd/sdi \
+ -I$(SRCDIR)/svx/sdi \
+ -I$(SRCDIR)/sfx2/sdi \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_SdiTarget_SdiTarget,sd/sdi/sdgslots,sd/sdi/sdgslots))
+
+$(eval $(call gb_SdiTarget_set_include,sd/sdi/sdgslots,\
+ -I$(SRCDIR)/sd/inc \
+ -I$(SRCDIR)/sd/sdi \
+ -I$(SRCDIR)/svx/sdi \
+ -I$(SRCDIR)/sfx2/sdi \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_Library_add_sdi_headers,sd,\
+ sd/sdi/sdgslots \
+ sd/sdi/sdslots \
+))
+
+$(eval $(call gb_Library_set_include,sd,\
+ $$(INCLUDE) \
+ -I$(SRCDIR)/sd/inc \
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/source/ui/slidesorter/inc \
+ -I$(WORKDIR)/SdiTarget/sd/sdi \
+))
+
+$(eval $(call gb_Library_add_defs,sd,\
+ -DSD_DLLIMPLEMENTATION \
+ -DSDUI_DLL_NAME=\"$(call gb_Library_get_runtime_filename,$(call gb_Library__get_name,sdui))\" \
+))
+
+ifneq ($(strip $(dbg_anim_log)$(DBG_ANIM_LOG)),)
+$(eval $(call gb_Library_add_defs,sd,\
+ $$(DEFS) \
+ -DDBG_ANIM_LOG \
+))
+endif
+
+$(eval $(call gb_Library_use_custom_headers,sd,\
+ officecfg/registry \
+ oox/generated \
+))
+
+$(eval $(call gb_Library_use_sdk_api,sd))
+
+$(eval $(call gb_Library_use_libraries,sd,\
+ avmedia \
+ basegfx \
+ canvastools \
+ comphelper \
+ cppcanvas \
+ cppu \
+ cppuhelper \
+ drawinglayercore \
+ drawinglayer \
+ editeng \
+ i18nlangtag \
+ i18nutil \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sb \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svxcore \
+ svx \
+ tk \
+ tl \
+ ucbhelper \
+ utl \
+ vcl \
+ $(if $(ENABLE_NSS),xmlsecurity) \
+))
+
+$(eval $(call gb_Library_use_externals,sd,\
+ boost_headers \
+ libxml2 \
+ dbus \
+ $(if $(ENABLE_AVAHI), \
+ avahi \
+ ) \
+ icu_headers \
+))
+
+ifneq ($(DBUS_HAVE_GLIB),)
+$(eval $(call gb_Library_set_include,sd,\
+ $$(INCLUDE) \
+ $(DBUS_GLIB_CFLAGS) \
+))
+$(eval $(call gb_Library_add_libs,sd,\
+ $(DBUS_GLIB_LIBS) \
+))
+endif
+
+ifeq ($(OS),WNT)
+$(eval $(call gb_Library_use_system_win32_libs,sd,\
+ uuid \
+ ws2_32 \
+))
+endif
+
+$(eval $(call gb_Library_set_componentfile,sd,sd/util/sd,services))
+
+ifneq ($(ENABLE_WASM_STRIP_ACCESSIBILITY),TRUE)
+$(eval $(call gb_Library_add_exception_objects,sd,\
+ sd/source/ui/accessibility/AccessibleDocumentViewBase \
+ sd/source/ui/accessibility/AccessibleDrawDocumentView \
+ sd/source/ui/accessibility/AccessibleOutlineEditSource \
+ sd/source/ui/accessibility/AccessibleOutlineView \
+ sd/source/ui/accessibility/AccessiblePageShape \
+ sd/source/ui/accessibility/AccessiblePresentationGraphicShape \
+ sd/source/ui/accessibility/AccessiblePresentationOLEShape \
+ sd/source/ui/accessibility/AccessiblePresentationShape \
+ sd/source/ui/accessibility/AccessibleSlideSorterObject \
+ sd/source/ui/accessibility/AccessibleSlideSorterView \
+ sd/source/ui/accessibility/AccessibleViewForwarder \
+ sd/source/ui/accessibility/SdShapeTypes \
+))
+endif
+
+$(eval $(call gb_Library_add_exception_objects,sd,\
+ sd/source/core/CustomAnimationCloner \
+ sd/source/core/CustomAnimationEffect \
+ sd/source/core/CustomAnimationPreset \
+ sd/source/core/EffectMigration \
+ sd/source/core/PageListWatcher \
+ sd/source/core/TransitionPreset \
+ sd/source/core/anminfo \
+ sd/source/core/annotations/Annotation \
+ sd/source/core/annotations/AnnotationEnumeration \
+ sd/source/core/cusshow \
+ sd/source/core/drawdoc \
+ sd/source/core/drawdoc2 \
+ sd/source/core/drawdoc3 \
+ sd/source/core/drawdoc4 \
+ sd/source/core/drawdoc_animations \
+ sd/source/core/pglink \
+ sd/source/core/sdiocmpt \
+ sd/source/core/sdpage \
+ sd/source/core/sdpage2 \
+ sd/source/core/sdpage_animations \
+ sd/source/core/shapelist \
+ sd/source/core/stlfamily \
+ sd/source/core/stlpool \
+ sd/source/core/stlsheet \
+ sd/source/core/text/textapi \
+ sd/source/core/typemap \
+ sd/source/core/undo/undofactory \
+ sd/source/core/undo/undomanager \
+ sd/source/core/undo/undoobjects \
+ sd/source/core/undoanim \
+ sd/source/filter/cgm/sdcgmfilter \
+ sd/source/filter/grf/sdgrffilter \
+ sd/source/filter/html/HtmlOptionsDialog \
+ sd/source/filter/html/buttonset \
+ sd/source/filter/html/htmlex \
+ sd/source/filter/html/sdhtmlfilter \
+ sd/source/filter/pdf/sdpdffilter \
+ sd/source/filter/sdfilter \
+ sd/source/filter/sdpptwrp \
+ sd/source/filter/xml/sdtransform \
+ sd/source/filter/xml/sdxmlwrp \
+ sd/source/helper/simplereferencecomponent \
+ sd/source/ui/animations/CustomAnimationDialog \
+ sd/source/ui/animations/CustomAnimationList \
+ sd/source/ui/animations/CustomAnimationPane \
+ sd/source/ui/animations/STLPropertySet \
+ sd/source/ui/animations/SlideTransitionPane \
+ sd/source/ui/animations/motionpathtag \
+ sd/source/ui/annotations/annotationmanager \
+ sd/source/ui/annotations/annotationtag \
+ sd/source/ui/annotations/annotationwindow \
+ sd/source/ui/app/optsitem \
+ sd/source/ui/app/sddll \
+ sd/source/ui/app/sdmod \
+ sd/source/ui/app/sdmod1 \
+ sd/source/ui/app/sdmod2 \
+ sd/source/ui/app/sdpopup \
+ sd/source/ui/app/sdxfer \
+ sd/source/ui/app/tmplctrl \
+ sd/source/ui/app/scalectrl \
+ sd/source/ui/controller/slidelayoutcontroller \
+ sd/source/ui/controller/displaymodecontroller \
+ sd/source/ui/dlg/AnimationChildWindow \
+ sd/source/ui/dlg/LayerTabBar \
+ sd/source/ui/dlg/NavigatorChildWindow \
+ sd/source/ui/dlg/PaneChildWindows \
+ sd/source/ui/dlg/PaneDockingWindow \
+ sd/source/ui/dlg/PaneShells \
+ sd/source/ui/dlg/SpellDialogChildWindow \
+ sd/source/ui/dlg/TemplateScanner \
+ sd/source/ui/dlg/animobjs \
+ sd/source/ui/dlg/assclass \
+ sd/source/ui/dlg/diactrl \
+ sd/source/ui/dlg/filedlg \
+ sd/source/ui/dlg/gluectrl \
+ sd/source/ui/dlg/ins_paste \
+ sd/source/ui/dlg/layeroptionsdlg \
+ sd/source/ui/dlg/navigatr \
+ sd/source/ui/dlg/sdabstdlg \
+ sd/source/ui/dlg/sdtreelb \
+ sd/source/ui/dlg/titledockwin \
+ sd/source/ui/dlg/unchss \
+ sd/source/ui/docshell/docshel2 \
+ sd/source/ui/docshell/docshel3 \
+ sd/source/ui/docshell/docshel4 \
+ sd/source/ui/docshell/docshell \
+ sd/source/ui/docshell/grdocsh \
+ sd/source/ui/docshell/sdclient \
+ sd/source/ui/framework/configuration/ChangeRequestQueue \
+ sd/source/ui/framework/configuration/ChangeRequestQueueProcessor \
+ sd/source/ui/framework/configuration/Configuration \
+ sd/source/ui/framework/configuration/ConfigurationClassifier \
+ sd/source/ui/framework/configuration/ConfigurationController \
+ sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster \
+ sd/source/ui/framework/configuration/ConfigurationControllerResourceManager \
+ sd/source/ui/framework/configuration/ConfigurationTracer \
+ sd/source/ui/framework/configuration/ConfigurationUpdater \
+ sd/source/ui/framework/configuration/GenericConfigurationChangeRequest \
+ sd/source/ui/framework/configuration/ResourceFactoryManager \
+ sd/source/ui/framework/configuration/ResourceId \
+ sd/source/ui/framework/configuration/UpdateRequest \
+ sd/source/ui/framework/factories/BasicPaneFactory \
+ sd/source/ui/framework/factories/BasicToolBarFactory \
+ sd/source/ui/framework/factories/BasicViewFactory \
+ sd/source/ui/framework/factories/ChildWindowPane \
+ sd/source/ui/framework/factories/FrameWindowPane \
+ sd/source/ui/framework/factories/FullScreenPane \
+ sd/source/ui/framework/factories/Pane \
+ sd/source/ui/framework/factories/PresentationFactory \
+ sd/source/ui/framework/factories/ViewShellWrapper \
+ sd/source/ui/framework/module/CenterViewFocusModule \
+ sd/source/ui/framework/module/DrawModule \
+ sd/source/ui/framework/module/ImpressModule \
+ sd/source/ui/framework/module/ModuleController \
+ sd/source/ui/framework/module/PresentationModule \
+ sd/source/ui/framework/module/ShellStackGuard \
+ sd/source/ui/framework/module/SlideSorterModule \
+ sd/source/ui/framework/module/ToolBarModule \
+ sd/source/ui/framework/module/ViewTabBarModule \
+ sd/source/ui/framework/tools/FrameworkHelper \
+ sd/source/ui/func/bulmaper \
+ sd/source/ui/func/fuarea \
+ sd/source/ui/func/fubullet \
+ sd/source/ui/func/fuchar \
+ sd/source/ui/func/fucon3d \
+ sd/source/ui/func/fuconarc \
+ sd/source/ui/func/fuconbez \
+ sd/source/ui/func/fuconcs \
+ sd/source/ui/func/fuconnct \
+ sd/source/ui/func/fuconrec \
+ sd/source/ui/func/fuconstr \
+ sd/source/ui/func/fuconuno \
+ sd/source/ui/func/fucopy \
+ sd/source/ui/func/fucushow \
+ sd/source/ui/func/fudraw \
+ sd/source/ui/func/fudspord \
+ sd/source/ui/func/fuediglu \
+ sd/source/ui/func/fuexecuteinteraction \
+ sd/source/ui/func/fuexpand \
+ sd/source/ui/func/fuformatpaintbrush \
+ sd/source/ui/func/fuhhconv \
+ sd/source/ui/func/fuinsert \
+ sd/source/ui/func/fuinsfil \
+ sd/source/ui/func/fuline \
+ sd/source/ui/func/fulinend \
+ sd/source/ui/func/fulink \
+ sd/source/ui/func/fumeasur \
+ sd/source/ui/func/fumorph \
+ sd/source/ui/func/funavig \
+ sd/source/ui/func/fuoaprms \
+ sd/source/ui/func/fuolbull \
+ sd/source/ui/func/fuoltext \
+ sd/source/ui/func/fupage \
+ sd/source/ui/func/fuparagr \
+ sd/source/ui/func/fupoor \
+ sd/source/ui/func/fuprlout \
+ sd/source/ui/func/fuprobjs \
+ sd/source/ui/func/fuscale \
+ sd/source/ui/func/fusearch \
+ sd/source/ui/func/fusel \
+ sd/source/ui/func/fusldlg \
+ sd/source/ui/func/fusnapln \
+ sd/source/ui/func/fusumry \
+ sd/source/ui/func/futempl \
+ sd/source/ui/func/futext \
+ sd/source/ui/func/futhes \
+ sd/source/ui/func/futransf \
+ sd/source/ui/func/futxtatt \
+ sd/source/ui/func/fuvect \
+ sd/source/ui/func/fuzoom \
+ sd/source/ui/func/sdundogr \
+ sd/source/ui/func/smarttag \
+ sd/source/ui/func/undoback \
+ sd/source/ui/func/undoheaderfooter \
+ sd/source/ui/func/undolayer \
+ sd/source/ui/func/undopage \
+ sd/source/ui/func/unmovss \
+ sd/source/ui/func/unoaprms \
+ sd/source/ui/func/unprlout \
+ sd/source/ui/presenter/CanvasUpdateRequester \
+ sd/source/ui/presenter/PresenterCanvas \
+ sd/source/ui/presenter/PresenterHelper \
+ sd/source/ui/presenter/PresenterPreviewCache \
+ sd/source/ui/presenter/PresenterTextView \
+ sd/source/ui/presenter/SlideRenderer \
+ sd/source/ui/sidebar/AllMasterPagesSelector \
+ sd/source/ui/sidebar/CurrentMasterPagesSelector \
+ sd/source/ui/sidebar/DocumentHelper \
+ sd/source/ui/sidebar/LayoutMenu \
+ sd/source/ui/sidebar/MasterPageContainer \
+ sd/source/ui/sidebar/MasterPageContainerFiller \
+ sd/source/ui/sidebar/MasterPageContainerProviders \
+ sd/source/ui/sidebar/MasterPageContainerQueue \
+ sd/source/ui/sidebar/MasterPageDescriptor \
+ sd/source/ui/sidebar/MasterPageObserver \
+ sd/source/ui/sidebar/MasterPagesSelector \
+ sd/source/ui/sidebar/NavigatorWrapper \
+ sd/source/ui/sidebar/PanelFactory \
+ sd/source/ui/sidebar/PreviewValueSet \
+ sd/source/ui/sidebar/RecentlyUsedMasterPages \
+ sd/source/ui/sidebar/RecentMasterPagesSelector \
+ sd/source/ui/sidebar/SlideBackground \
+ sd/source/ui/slideshow/PaneHider \
+ sd/source/ui/slideshow/SlideShowRestarter \
+ sd/source/ui/slideshow/showwin \
+ sd/source/ui/slideshow/slideshow \
+ sd/source/ui/slideshow/slideshowimpl \
+ sd/source/ui/slideshow/slideshowviewimpl \
+ sd/source/ui/slidesorter/cache/SlsBitmapCache \
+ sd/source/ui/slidesorter/cache/SlsBitmapCompressor \
+ sd/source/ui/slidesorter/cache/SlsBitmapFactory \
+ sd/source/ui/slidesorter/cache/SlsCacheCompactor \
+ sd/source/ui/slidesorter/cache/SlsCacheConfiguration \
+ sd/source/ui/slidesorter/cache/SlsGenericPageCache \
+ sd/source/ui/slidesorter/cache/SlsPageCache \
+ sd/source/ui/slidesorter/cache/SlsPageCacheManager \
+ sd/source/ui/slidesorter/cache/SlsQueueProcessor \
+ sd/source/ui/slidesorter/cache/SlsRequestFactory \
+ sd/source/ui/slidesorter/cache/SlsRequestQueue \
+ sd/source/ui/slidesorter/controller/SlideSorterController \
+ sd/source/ui/slidesorter/controller/SlsAnimationFunction \
+ sd/source/ui/slidesorter/controller/SlsAnimator \
+ sd/source/ui/slidesorter/controller/SlsClipboard \
+ sd/source/ui/slidesorter/controller/SlsCurrentSlideManager \
+ sd/source/ui/slidesorter/controller/SlsDragAndDropContext \
+ sd/source/ui/slidesorter/controller/SlsFocusManager \
+ sd/source/ui/slidesorter/controller/SlsInsertionIndicatorHandler \
+ sd/source/ui/slidesorter/controller/SlsListener \
+ sd/source/ui/slidesorter/controller/SlsPageSelector \
+ sd/source/ui/slidesorter/controller/SlsProperties \
+ sd/source/ui/slidesorter/controller/SlsScrollBarManager \
+ sd/source/ui/slidesorter/controller/SlsSelectionFunction \
+ sd/source/ui/slidesorter/controller/SlsSelectionManager \
+ sd/source/ui/slidesorter/controller/SlsSelectionObserver \
+ sd/source/ui/slidesorter/controller/SlsSlotManager \
+ sd/source/ui/slidesorter/controller/SlsTransferableData \
+ sd/source/ui/slidesorter/controller/SlsVisibleAreaManager \
+ sd/source/ui/slidesorter/model/SlideSorterModel \
+ sd/source/ui/slidesorter/model/SlsPageDescriptor \
+ sd/source/ui/slidesorter/model/SlsPageEnumeration \
+ sd/source/ui/slidesorter/model/SlsPageEnumerationProvider \
+ sd/source/ui/slidesorter/model/SlsVisualState \
+ sd/source/ui/slidesorter/shell/SlideSorter \
+ sd/source/ui/slidesorter/shell/SlideSorterService \
+ sd/source/ui/slidesorter/shell/SlideSorterViewShell \
+ sd/source/ui/slidesorter/view/SlideSorterView \
+ sd/source/ui/slidesorter/view/SlsFramePainter \
+ sd/source/ui/slidesorter/view/SlsInsertAnimator \
+ sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay \
+ sd/source/ui/slidesorter/view/SlsLayeredDevice \
+ sd/source/ui/slidesorter/view/SlsLayouter \
+ sd/source/ui/slidesorter/view/SlsPageObjectLayouter \
+ sd/source/ui/slidesorter/view/SlsPageObjectPainter \
+ sd/source/ui/slidesorter/view/SlsTheme \
+ sd/source/ui/slidesorter/view/SlsToolTip \
+ sd/source/ui/slidesorter/view/SlsViewCacheContext \
+ sd/source/ui/table/TableDesignPane \
+ sd/source/ui/table/tablefunction \
+ sd/source/ui/table/tableobjectbar \
+ sd/source/ui/tools/AsynchronousCall \
+ sd/source/ui/tools/ConfigurationAccess \
+ sd/source/ui/tools/EventMultiplexer \
+ sd/source/ui/tools/GraphicSizeCheck \
+ sd/source/ui/tools/IconCache \
+ sd/source/ui/tools/IdleDetection \
+ sd/source/ui/tools/PreviewRenderer \
+ sd/source/ui/tools/PropertySet \
+ sd/source/ui/tools/SdGlobalResourceContainer \
+ sd/source/ui/tools/SlotStateListener \
+ sd/source/ui/tools/TimerBasedTaskExecution \
+ sd/source/ui/uitest/uiobject \
+ sd/source/ui/unoidl/DrawController \
+ sd/source/ui/unoidl/SdUnoDrawView \
+ sd/source/ui/unoidl/SdUnoOutlineView \
+ sd/source/ui/unoidl/SdUnoSlideView \
+ sd/source/ui/unoidl/UnoDocumentSettings \
+ sd/source/ui/unoidl/randomnode \
+ sd/source/ui/unoidl/unocpres \
+ sd/source/ui/unoidl/unodoc \
+ sd/source/ui/unoidl/unolayer \
+ sd/source/ui/unoidl/unomodel \
+ sd/source/ui/unoidl/unomodule \
+ sd/source/ui/unoidl/unoobj \
+ sd/source/ui/unoidl/unopage \
+ sd/source/ui/unoidl/unopback \
+ sd/source/ui/unoidl/unopool \
+ sd/source/ui/unoidl/unosrch \
+ sd/source/ui/unoidl/unowcntr \
+ sd/source/ui/view/DocumentRenderer \
+ sd/source/ui/view/FormShellManager \
+ sd/source/ui/view/GraphicObjectBar \
+ sd/source/ui/view/GraphicViewShellBase \
+ sd/source/ui/view/ImpressViewShellBase \
+ sd/source/ui/view/MediaObjectBar \
+ sd/source/ui/view/OutlineViewShellBase \
+ sd/source/ui/view/Outliner \
+ sd/source/ui/view/OutlinerIterator \
+ sd/source/ui/view/PresentationViewShellBase \
+ sd/source/ui/view/SlideSorterViewShellBase \
+ sd/source/ui/view/ToolBarManager \
+ sd/source/ui/view/ViewClipboard \
+ sd/source/ui/view/ViewShellBase \
+ sd/source/ui/view/ViewShellHint \
+ sd/source/ui/view/ViewShellImplementation \
+ sd/source/ui/view/ViewShellManager \
+ sd/source/ui/view/ViewTabBar \
+ sd/source/ui/view/WindowUpdater \
+ sd/source/ui/view/clview \
+ sd/source/ui/view/drawview \
+ sd/source/ui/view/drbezob \
+ sd/source/ui/view/drtxtob \
+ sd/source/ui/view/drtxtob1 \
+ sd/source/ui/view/drviews1 \
+ sd/source/ui/view/drviews2 \
+ sd/source/ui/view/drviews3 \
+ sd/source/ui/view/drviews4 \
+ sd/source/ui/view/drviews5 \
+ sd/source/ui/view/drviews6 \
+ sd/source/ui/view/drviews7 \
+ sd/source/ui/view/drviews8 \
+ sd/source/ui/view/drviews9 \
+ sd/source/ui/view/drviewsa \
+ sd/source/ui/view/drviewsb \
+ sd/source/ui/view/drviewsc \
+ sd/source/ui/view/drviewsd \
+ sd/source/ui/view/drviewse \
+ sd/source/ui/view/drviewsf \
+ sd/source/ui/view/drviewsg \
+ sd/source/ui/view/drviewsh \
+ sd/source/ui/view/drviewsi \
+ sd/source/ui/view/drviewsj \
+ sd/source/ui/view/drviewsk \
+ sd/source/ui/view/drvwshrg \
+ sd/source/ui/view/frmview \
+ sd/source/ui/view/grviewsh \
+ sd/source/ui/view/outlnvs2 \
+ sd/source/ui/view/outlnvsh \
+ sd/source/ui/view/outlview \
+ sd/source/ui/view/presvish \
+ sd/source/ui/view/sdruler \
+ sd/source/ui/view/sdview \
+ sd/source/ui/view/sdview2 \
+ sd/source/ui/view/sdview3 \
+ sd/source/ui/view/sdview4 \
+ sd/source/ui/view/sdview5 \
+ sd/source/ui/view/sdwindow \
+ sd/source/ui/view/tabcontr \
+ sd/source/ui/view/unmodpg \
+ sd/source/ui/view/viewoverlaymanager \
+ sd/source/ui/view/viewshe2 \
+ sd/source/ui/view/viewshe3 \
+ sd/source/ui/view/viewshel \
+ sd/source/ui/view/zoomlist \
+))
+
+ifeq ($(ENABLE_SDREMOTE),TRUE)
+$(eval $(call gb_Library_add_exception_objects,sd,\
+ sd/source/ui/remotecontrol/BufferedStreamSocket \
+ sd/source/ui/remotecontrol/Communicator \
+ sd/source/ui/remotecontrol/ImagePreparer \
+ sd/source/ui/remotecontrol/Server \
+ sd/source/ui/remotecontrol/Receiver \
+ sd/source/ui/remotecontrol/Listener \
+ sd/source/ui/remotecontrol/Transmitter \
+))
+
+ifeq ($(OS),MACOSX)
+$(eval $(call gb_Library_add_objcxxobjects,sd,\
+ sd/source/ui/remotecontrol/DiscoveryService \
+ sd/source/ui/remotecontrol/OSXNetworkService \
+))
+
+$(eval $(call gb_Library_use_system_darwin_frameworks,sd,\
+ Foundation \
+))
+
+else # OS!=MACSOX
+
+ifeq ($(ENABLE_AVAHI),TRUE)
+$(eval $(call gb_Library_add_exception_objects,sd,\
+ sd/source/ui/remotecontrol/AvahiNetworkService \
+))
+endif # ENABLE_AVAHI=TRUE
+
+$(eval $(call gb_Library_add_exception_objects,sd,\
+ sd/source/ui/remotecontrol/DiscoveryService \
+))
+
+ifeq ($(OS),WNT)
+
+$(eval $(call gb_Library_add_exception_objects,sd,\
+ sd/source/ui/remotecontrol/WINNetworkService \
+))
+
+$(eval $(call gb_Library_use_external,sd,mDNSResponder))
+
+endif # OS=WNT
+
+endif # OS!=MACOSX
+
+$(eval $(call gb_Library_add_defs,sd,\
+ -DENABLE_SDREMOTE \
+))
+
+ifeq ($(ENABLE_SDREMOTE_BLUETOOTH),TRUE)
+
+ifneq ($(OS),MACOSX)
+
+$(eval $(call gb_Library_add_exception_objects,sd,\
+ sd/source/ui/remotecontrol/BluetoothServer \
+))
+
+else # OS!=MACOSX
+
+$(eval $(call gb_Library_add_objcxxobjects,sd,\
+ sd/source/ui/remotecontrol/BluetoothServer \
+ sd/source/ui/remotecontrol/OSXBluetooth \
+))
+
+$(eval $(call gb_Library_add_libs,sd,\
+ -lobjc \
+))
+
+$(eval $(call gb_Library_use_system_darwin_frameworks,sd,\
+ IOBluetooth \
+))
+
+endif # OS!=MACOSX
+
+$(eval $(call gb_Library_add_defs,sd,\
+ -DENABLE_SDREMOTE_BLUETOOTH \
+))
+
+$(eval $(call gb_Library_use_externals,sd,\
+ bluez_bluetooth_headers \
+))
+
+endif # ENABLE_SDREMOTE_BLUETOOTH=TRUE
+
+endif # ENABLE_SDREMOTE=TRUE
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/Library_sdd.mk b/sd/Library_sdd.mk
new file mode 100644
index 000000000..997556407
--- /dev/null
+++ b/sd/Library_sdd.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_Library_Library,sdd))
+
+$(eval $(call gb_Library_set_include,sdd,\
+ $$(INCLUDE) \
+ -I$(SRCDIR)/sd/inc \
+))
+
+$(eval $(call gb_Library_use_external,sdd,boost_headers))
+
+$(eval $(call gb_Library_use_sdk_api,sdd))
+
+$(eval $(call gb_Library_use_libraries,sdd,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ sfx \
+ sot \
+ tl \
+ utl \
+ vcl \
+))
+
+$(eval $(call gb_Library_set_componentfile,sdd,sd/util/sdd,services))
+
+$(eval $(call gb_Library_use_common_precompiled_header,sdd))
+
+$(eval $(call gb_Library_add_exception_objects,sdd,\
+ sd/source/ui/unoidl/sddetect \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/Library_sdfilt.mk b/sd/Library_sdfilt.mk
new file mode 100644
index 000000000..2db739d36
--- /dev/null
+++ b/sd/Library_sdfilt.mk
@@ -0,0 +1,79 @@
+# -*- 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,sdfilt))
+
+$(eval $(call gb_Library_set_include,sdfilt,\
+ $$(INCLUDE) \
+ -I$(SRCDIR)/sd/inc \
+ -I$(SRCDIR)/sd/source/ui/inc \
+))
+
+ifneq ($(strip $(dbg_anim_log)$(DBG_ANIM_LOG)),)
+$(eval $(call gb_Library_add_defs,sdfilt,\
+ -DDBG_ANIM_LOG \
+))
+endif
+
+$(eval $(call gb_Library_use_external,sdfilt,boost_headers))
+
+$(eval $(call gb_Library_use_custom_headers,sdfilt,\
+ oox/generated \
+))
+
+$(eval $(call gb_Library_use_sdk_api,sdfilt))
+
+$(eval $(call gb_Library_use_libraries,sdfilt,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ editeng \
+ i18nlangtag \
+ i18nutil \
+ msfilter \
+ oox \
+ sal \
+ sax \
+ sd \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svxcore \
+ tl \
+ ucbhelper \
+ utl \
+ vcl \
+ basegfx \
+))
+
+$(eval $(call gb_Library_set_componentfile,sdfilt,sd/util/sdfilt,services))
+
+$(eval $(call gb_Library_use_common_precompiled_header,sdfilt))
+
+$(eval $(call gb_Library_add_exception_objects,sdfilt,\
+ sd/source/filter/eppt/eppt \
+ sd/source/filter/eppt/epptso \
+ sd/source/filter/eppt/escherex \
+ sd/source/filter/eppt/pptexanimations \
+ sd/source/filter/eppt/pptexsoundcollection \
+ sd/source/filter/eppt/pptx-epptbase \
+ sd/source/filter/eppt/pptx-epptooxml \
+ sd/source/filter/eppt/pptx-animations \
+ sd/source/filter/eppt/pptx-grouptable \
+ sd/source/filter/eppt/pptx-stylesheet \
+ sd/source/filter/eppt/pptx-text \
+ sd/source/filter/ppt/ppt97animations \
+ sd/source/filter/ppt/pptatom \
+ sd/source/filter/ppt/pptin \
+ sd/source/filter/ppt/pptinanimations \
+ sd/source/filter/ppt/propread \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/Library_sdui.mk b/sd/Library_sdui.mk
new file mode 100644
index 000000000..a774d0610
--- /dev/null
+++ b/sd/Library_sdui.mk
@@ -0,0 +1,101 @@
+# -*- 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,sdui))
+
+$(eval $(call gb_Library_set_plugin_for,sdui,sd))
+
+$(eval $(call gb_Library_set_include,sdui,\
+ $$(INCLUDE) \
+ -I$(SRCDIR)/sd/inc \
+ -I$(SRCDIR)/sd/source/ui/inc \
+))
+
+ifeq ($(ENABLE_SDREMOTE),TRUE)
+$(eval $(call gb_Library_add_defs,sdui,\
+ -DENABLE_SDREMOTE \
+))
+
+ifeq ($(ENABLE_SDREMOTE_BLUETOOTH),TRUE)
+$(eval $(call gb_Library_add_defs,sdui,\
+ -DENABLE_SDREMOTE_BLUETOOTH \
+))
+endif
+
+endif
+
+$(eval $(call gb_Library_use_custom_headers,sdui,\
+ officecfg/registry \
+))
+
+$(eval $(call gb_Library_set_precompiled_header,sdui,sd/inc/pch/precompiled_sdui))
+
+$(eval $(call gb_Library_use_external,sdui,boost_headers))
+
+$(eval $(call gb_Library_use_sdk_api,sdui))
+
+$(eval $(call gb_Library_use_libraries,sdui,\
+ basegfx \
+ comphelper \
+ cppcanvas \
+ cppu \
+ cppuhelper \
+ editeng \
+ i18nlangtag \
+ fwk \
+ sal \
+ salhelper \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svxcore \
+ svx \
+ tl \
+ utl \
+ vcl \
+ cui \
+))
+
+$(eval $(call gb_Library_add_exception_objects,sdui,\
+ sd/source/filter/html/htmlattr \
+ sd/source/filter/html/pubdlg \
+ sd/source/ui/dlg/brkdlg \
+ sd/source/ui/dlg/copydlg \
+ sd/source/ui/dlg/custsdlg \
+ sd/source/ui/dlg/dlgchar \
+ sd/source/ui/dlg/dlgfield \
+ sd/source/ui/dlg/dlgolbul \
+ sd/source/ui/dlg/dlgpage \
+ sd/source/ui/dlg/dlgsnap \
+ sd/source/ui/dlg/headerfooterdlg \
+ sd/source/ui/dlg/inspagob \
+ sd/source/ui/dlg/masterlayoutdlg \
+ sd/source/ui/dlg/morphdlg \
+ sd/source/ui/dlg/paragr \
+ sd/source/ui/dlg/present \
+ sd/source/ui/dlg/prltempl \
+ sd/source/ui/dlg/prntopts \
+ sd/source/ui/dlg/RemoteDialog \
+ sd/source/ui/dlg/RemoteDialogClientBox \
+ sd/source/ui/dlg/sddlgfact \
+ sd/source/ui/dlg/sdpreslt \
+ sd/source/ui/dlg/sduiexp \
+ sd/source/ui/dlg/tabtempl \
+ sd/source/ui/dlg/tpaction \
+ sd/source/ui/dlg/tpoption \
+ sd/source/ui/dlg/vectdlg \
+ sd/source/ui/dlg/PhotoAlbumDialog \
+ sd/source/ui/dlg/BulletAndPositionDlg \
+))
+
+# $(WORKDIR)/inc/sd/sddll0.hxx :
+ # echo "#define" DLL_NAME \"$(if $(filter-out WNT,$(OS)),lib)sd$(DLLPOSTFIX)$(DLLPOST)\" > $@
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/Makefile b/sd/Makefile
new file mode 100644
index 000000000..0997e6284
--- /dev/null
+++ b/sd/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/sd/Module_sd.mk b/sd/Module_sd.mk
new file mode 100644
index 000000000..0ac7b5763
--- /dev/null
+++ b/sd/Module_sd.mk
@@ -0,0 +1,77 @@
+# -*- 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/.
+#
+
+include $(SRCDIR)/sd/export_setup.mk
+include $(SRCDIR)/sd/import_setup.mk
+
+$(eval $(call gb_Module_Module,sd))
+
+$(eval $(call gb_Module_add_targets,sd,\
+ Library_sd \
+ Library_sdd \
+ Library_sdfilt \
+ Library_sdui \
+ Package_opengl \
+ Package_web \
+ Package_xml \
+ UIConfig_sdraw \
+ UIConfig_simpress \
+))
+
+$(eval $(call gb_Module_add_l10n_targets,sd,\
+ AllLangMoTarget_sd \
+))
+
+ifeq ($(filter DRAGONFLY FREEBSD,$(OS)),)
+$(eval $(call gb_Module_add_slowcheck_targets,sd,\
+ $(if $(and $(filter $(COM),MSC),$(MERGELIBS)),, \
+ CppunitTest_sd_uimpress) \
+ CppunitTest_sd_import_tests \
+ CppunitTest_sd_import_tests2 \
+ CppunitTest_sd_import_tests-smartart \
+ CppunitTest_sd_export_tests-ooxml1 \
+ CppunitTest_sd_export_tests-ooxml2 \
+ CppunitTest_sd_export_tests-ooxml3 \
+ CppunitTest_sd_export_tests \
+ CppunitTest_sd_filters_test \
+ CppunitTest_sd_layout_tests \
+ CppunitTest_sd_misc_tests \
+ CppunitTest_sd_uiimpress \
+ CppunitTest_sd_html_export_tests \
+ CppunitTest_sd_activex_controls_tests \
+ CppunitTest_sd_pdf_import_test \
+ CppunitTest_sd_png_export_tests \
+ CppunitTest_sd_filter_eppt \
+ CppunitTest_sd_shape_import_export_tests \
+))
+endif
+
+ifneq ($(DISABLE_GUI),TRUE)
+ifeq ($(OS),LINUX)
+$(eval $(call gb_Module_add_slowcheck_targets,sd,\
+ CppunitTest_sd_svg_export_tests \
+ CppunitTest_sd_tiledrendering \
+))
+endif
+endif
+
+# screenshots
+$(eval $(call gb_Module_add_screenshot_targets,sd, \
+ CppunitTest_sd_dialogs_test \
+))
+
+$(eval $(call gb_Module_add_subsequentcheck_targets,sd,\
+ JunitTest_sd_unoapi \
+))
+
+$(eval $(call gb_Module_add_uicheck_targets,sd,\
+ UITest_impress_tests \
+ UITest_sd_findReplace \
+))
+# vim: set noet sw=4 ts=4:
diff --git a/sd/Package_opengl.mk b/sd/Package_opengl.mk
new file mode 100644
index 000000000..ef03ab08f
--- /dev/null
+++ b/sd/Package_opengl.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_Package_Package,sd_opengl,$(SRCDIR)/sd/xml))
+
+$(eval $(call gb_Package_add_files,sd_opengl,$(LIBO_SHARE_FOLDER)/config/soffice.cfg/simpress,\
+ transitions-ogl.xml \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/Package_web.mk b/sd/Package_web.mk
new file mode 100644
index 000000000..1c7c6b80a
--- /dev/null
+++ b/sd/Package_web.mk
@@ -0,0 +1,37 @@
+# -*- 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_Package_Package,sd_web,$(SRCDIR)/sd/res))
+
+$(eval $(call gb_Package_add_files,sd_web,$(LIBO_SHARE_FOLDER)/config/webcast,\
+ webview/common.inc \
+ webview/common.pl \
+ webview/edit.asp \
+ webview/editpic.asp \
+ webview/editpic.pl \
+ webview/edit.pl \
+ webview/index.pl \
+ webview/poll.asp \
+ webview/poll.pl \
+ webview/savepic.asp \
+ webview/savepic.pl \
+ webview/show.asp \
+ webview/show.pl \
+ webview/webcast.asp \
+ webview/webcast.pl \
+))
+
+$(eval $(call gb_Package_add_files,sd_web,$(LIBO_SHARE_FOLDER)/config/wizard/web/buttons,\
+ buttons/elementary.zip \
+ buttons/sukapura.zip \
+ buttons/round-white.zip \
+ buttons/simple.zip \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/Package_xml.mk b/sd/Package_xml.mk
new file mode 100644
index 000000000..fa227b728
--- /dev/null
+++ b/sd/Package_xml.mk
@@ -0,0 +1,19 @@
+# -*- 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_Package_Package,sd_xml,$(SRCDIR)/sd/xml))
+
+$(eval $(call gb_Package_add_files,sd_xml,$(LIBO_SHARE_FOLDER)/config/soffice.cfg/simpress,\
+ effects.xml \
+ transitions.xml \
+ layoutlist.xml \
+ objectlist.xml \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/README.md b/sd/README.md
new file mode 100644
index 000000000..4413a0776
--- /dev/null
+++ b/sd/README.md
@@ -0,0 +1,45 @@
+# LibreOffice Impress / Draw Application
+
+The core directory for the impress/draw applications.
+
+Think of impress as a hack on top of draw.
+
+`sd` module contains impress/draw specific code, non-shared UI and part
+of `ppt` and `pptx` filter, few other filters too.
+
+the slideshow UI lives here as well, the slideshow engine is in
+`slideshow` module though (including the 3D transitions engine
+`slideshow/source/engine/opengl`).
+
+the most used filters are ODF's `odp`, binary ppt and OOXML's
+`pptx`. their locations are listed below:
+
+ * `odp` import and export filters are in `xmloff` module (mostly `xmloff/source/draw`)
+
+ * `ppt` import is in `sd/source/filter/ppt` (big shared chunks are also in `svx`)
+ * `ppt` export is in `sd/source/filter/eppt` (big shared chunks are also in `svx`)
+
+ * `pptx` import is in `oox/source/ppt` (and uses a lot of
+ `oox/source/drawingml` and `oox/source/*`)
+ * `pptx` export is in `sd/source/filter/eppt` (mostly in `pptx-*` source
+ files) and shared part is in `oox/source/export`
+
+## PPTX Export / Import Filters
+
+PPTX export filter is split into 2 parts. Impress related part is in
+`sd/source/filter/eppt/pptx-*` and the other part is in
+`oox/source/export/` because it contains mostly code related to
+`DrawingML`, which is shared with writer and calc ooxml export.
+
+The export filter was written in 2009 IIRC and was not much extended
+feature-wise lately.
+
+## Future Works
+Add custom shapes export (see below). enhance text
+output, we don't write text style for indentation levels now, need to
+export `a:lvl1pPr`, `a:lvl2pPr`, ... elements.
+
+`PPTX` import was written by Sun/Oracle and then extended in LibreOffice
+a lot during bug fixing. It is located in `oox/source/ppt` and
+`oox/source/drawingml`. The areas with most bugs (at least until today)
+were shape placeholders and text style inheritance.
diff --git a/sd/README_REMOTE b/sd/README_REMOTE
new file mode 100644
index 000000000..cc53c4d8a
--- /dev/null
+++ b/sd/README_REMOTE
@@ -0,0 +1,107 @@
+LibreOffice Impress Remote Protocol Specification
+
+Communication is over a UTF-8 encoded character stream.
+(Using RTL_TEXTENCODING_UTF8 in the LibreOffice portion.)
+
+TCP
+---
+
+More TCP-specific details on setup and initial handshake to be
+written, but the actual message protocol is the same as for Bluetooth.
+
+
+Bluetooth
+---------
+
+Bluetooth communication is over RFCOMM.
+
+For discovery use the "standard UUID for the Serial Port Profile"
+I.e. the 16-bit SerialPort UUID 0x1101,
+or if necessary inserted into the Bluetooth BASE_UUID:
+00001101-0000-1000-8000-00805F9B34FB
+See https://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm
+
+Message Format
+--------------
+
+A message consists of one or more lines. The first line is the message description,
+further lines can add any necessary data. An empty line concludes the message.
+
+I.e. "MESSAGE\n\n" or "MESSAGE\nDATA\nDATA2...\n\n"
+
+You must keep reading a message until an empty line (i.e. double
+new-line) is reached to allow for future protocol extension.
+
+Initialisation
+-------------
+
+Once connected the server sends "LO_SERVER_SERVER_PAIRED".
+(I.e. "LO_SERVER_SERVER_PAIRED\n\n" is sent over the stream.)
+
+Subsequently the server will send either slideshow_started if a slideshow is running,
+or slideshow_finished if no slideshow is running. (See below for details of.)
+
+The current server implementation then proceeds to send all slide notes and previews
+to the client. (This should be changed to prevent memory issues, and a preview
+request mechanism implemented.)
+
+
+Commands (Client to Server)
+---------------------------
+
+The client should not assume that the state of the server has changed when a
+command has been sent. All changes will be signalled back to the client.
+(This is to allow for cases such as multiple clients requesting different changes, etc.)
+
+Any lines in [square brackets] are optional, and should be omitted if not needed.
+
+* transition_next
+* transition_previous
+
+* goto_slide
+ slide_number
+
+* presentation_start
+* presentation_stop
+
+* presentation_resume // Resumes after a presentation_blank_screen.
+* presentation_blank_screen
+ [Colour String] // Colour the screen will show (default: black). Not
+ // implemented, and format hasn't yet been defined.
+
+# As of gsoc2013, these commands are extended to the existing protocol, since server-end are tolerant with unknown commands, these extensions doesn't break backward compatibility
+* pointer_started // create a red dot on screen at initial position (x,y)
+ initial_x // This should be called when user first touch the screen
+ initial_y // note that x, y are in percentage (from 0.0 to 1.0) with respect to the slideshow size
+* pointer_dismissed // This dismiss the pointer red dot on screen, should be called when user stop touching screen
+* pointer_coordination // This update pointer's position to current (x,y)
+ current_x // note that x, y are in percentage (from 0.0 to 1.0) with respect to the slideshow size
+ current_y // unless screenupdater's performance is significantly improved, we should consider limit the update frequency on the
+ // remote-end
+
+
+
+Status/Data (Server to Client)
+------------------------------
+
+* slideshow_finished // (Also transmitted if no slideshow running when started.)
+
+* slideshow_started // (Also transmitted if a slideshow is running on startup.)
+ numberOfSlides
+ currentSlideNumber
+
+* slide_notes
+ slideNumber
+ [Notes] // The notes are an html document, and may also include \n newlines,
+ // i.e. the client should keep reading until a blank line is reached.
+
+* slide_updated // Slide on server has changed
+ currentSlideNumber
+
+* slide_preview // Supplies a preview image for a slide.
+ slideNumber
+ image // A Base 64 Encoded png image.
+
+# As of gsoc2013, these commands are extended to the existing protocol, since remote-end also ignore all unknown commands (which is the case of gsoc2012 android implementation), backward compatibility is kept.
+* slideshow_info // once paired, the server-end will send back the title of the current presentation
+ Title
diff --git a/sd/UIConfig_sdraw.mk b/sd/UIConfig_sdraw.mk
new file mode 100644
index 000000000..136f84fcd
--- /dev/null
+++ b/sd/UIConfig_sdraw.mk
@@ -0,0 +1,126 @@
+# -*- 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_UIConfig_UIConfig,modules/sdraw))
+
+$(eval $(call gb_UIConfig_add_menubarfiles,modules/sdraw,\
+ sd/uiconfig/sdraw/menubar/menubar \
+))
+
+$(eval $(call gb_UIConfig_add_popupmenufiles,modules/sdraw,\
+ sd/uiconfig/sdraw/popupmenu/3dobject \
+ sd/uiconfig/sdraw/popupmenu/3dscene2 \
+ sd/uiconfig/sdraw/popupmenu/3dscene \
+ sd/uiconfig/sdraw/popupmenu/bezier \
+ sd/uiconfig/sdraw/popupmenu/connector \
+ sd/uiconfig/sdraw/popupmenu/curve \
+ sd/uiconfig/sdraw/popupmenu/drawtext \
+ sd/uiconfig/sdraw/popupmenu/draw \
+ sd/uiconfig/sdraw/popupmenu/form \
+ sd/uiconfig/sdraw/popupmenu/formrichtext \
+ sd/uiconfig/sdraw/popupmenu/gluepoint \
+ sd/uiconfig/sdraw/popupmenu/graphic \
+ sd/uiconfig/sdraw/popupmenu/group \
+ sd/uiconfig/sdraw/popupmenu/layertab \
+ sd/uiconfig/sdraw/popupmenu/line \
+ sd/uiconfig/sdraw/popupmenu/measure \
+ sd/uiconfig/sdraw/popupmenu/media \
+ sd/uiconfig/sdraw/popupmenu/multiselect \
+ sd/uiconfig/sdraw/popupmenu/notebookbar \
+ sd/uiconfig/sdraw/popupmenu/oleobject \
+ sd/uiconfig/sdraw/popupmenu/pagepanemaster \
+ sd/uiconfig/sdraw/popupmenu/pagepanenoselmaster \
+ sd/uiconfig/sdraw/popupmenu/pagepanenosel \
+ sd/uiconfig/sdraw/popupmenu/pagepane \
+ sd/uiconfig/sdraw/popupmenu/pagetab \
+ sd/uiconfig/sdraw/popupmenu/page \
+ sd/uiconfig/sdraw/popupmenu/table \
+ sd/uiconfig/sdraw/popupmenu/textbox \
+))
+
+$(eval $(call gb_UIConfig_add_statusbarfiles,modules/sdraw,\
+ sd/uiconfig/sdraw/statusbar/statusbar \
+))
+
+$(eval $(call gb_UIConfig_add_toolbarfiles,modules/sdraw,\
+ sd/uiconfig/sdraw/toolbar/3dobjectsbar \
+ sd/uiconfig/sdraw/toolbar/alignmentbar \
+ sd/uiconfig/sdraw/toolbar/arrowsbar \
+ sd/uiconfig/sdraw/toolbar/arrowshapes \
+ sd/uiconfig/sdraw/toolbar/basicshapes \
+ sd/uiconfig/sdraw/toolbar/bezierobjectbar \
+ sd/uiconfig/sdraw/toolbar/calloutshapes \
+ sd/uiconfig/sdraw/toolbar/choosemodebar \
+ sd/uiconfig/sdraw/toolbar/colorbar \
+ sd/uiconfig/sdraw/toolbar/commentsbar \
+ sd/uiconfig/sdraw/toolbar/connectorsbar \
+ sd/uiconfig/sdraw/toolbar/drawingobjectbar \
+ sd/uiconfig/sdraw/toolbar/distributebar \
+ sd/uiconfig/sdraw/toolbar/ellipsesbar \
+ sd/uiconfig/sdraw/toolbar/extrusionobjectbar \
+ sd/uiconfig/sdraw/toolbar/findbar \
+ sd/uiconfig/sdraw/toolbar/flowchartshapes \
+ sd/uiconfig/sdraw/toolbar/fontworkobjectbar \
+ sd/uiconfig/sdraw/toolbar/fontworkshapetype \
+ sd/uiconfig/sdraw/toolbar/formcontrols \
+ sd/uiconfig/sdraw/toolbar/formdesign \
+ sd/uiconfig/sdraw/toolbar/formsfilterbar \
+ sd/uiconfig/sdraw/toolbar/formsnavigationbar \
+ sd/uiconfig/sdraw/toolbar/formtextobjectbar \
+ sd/uiconfig/sdraw/toolbar/fullscreenbar \
+ sd/uiconfig/sdraw/toolbar/gluepointsobjectbar \
+ sd/uiconfig/sdraw/toolbar/graffilterbar \
+ sd/uiconfig/sdraw/toolbar/graphicobjectbar \
+ sd/uiconfig/sdraw/toolbar/insertbar \
+ sd/uiconfig/sdraw/toolbar/linesbar \
+ sd/uiconfig/sdraw/toolbar/masterviewtoolbar \
+ sd/uiconfig/sdraw/toolbar/mediaobjectbar \
+ sd/uiconfig/sdraw/toolbar/notebookbarshortcuts \
+ sd/uiconfig/sdraw/toolbar/optimizetablebar \
+ sd/uiconfig/sdraw/toolbar/optionsbar \
+ sd/uiconfig/sdraw/toolbar/positionbar \
+ sd/uiconfig/sdraw/toolbar/rectanglesbar \
+ sd/uiconfig/sdraw/toolbar/redactedexportbar \
+ sd/uiconfig/sdraw/toolbar/redactionbar \
+ sd/uiconfig/sdraw/toolbar/standardbar \
+ sd/uiconfig/sdraw/toolbar/starshapes \
+ sd/uiconfig/sdraw/toolbar/symbolshapes \
+ sd/uiconfig/sdraw/toolbar/tableobjectbar \
+ sd/uiconfig/sdraw/toolbar/textbar \
+ sd/uiconfig/sdraw/toolbar/textobjectbar \
+ sd/uiconfig/sdraw/toolbar/toolbar \
+ sd/uiconfig/sdraw/toolbar/viewerbar \
+ sd/uiconfig/sdraw/toolbar/zoombar \
+))
+
+$(eval $(call gb_UIConfig_add_uifiles,modules/sdraw,\
+ sd/uiconfig/sdraw/ui/breakdialog \
+ sd/uiconfig/sdraw/ui/bulletsandnumbering \
+ sd/uiconfig/sdraw/ui/crossfadedialog \
+ sd/uiconfig/sdraw/ui/dlgsnap \
+ sd/uiconfig/sdraw/ui/copydlg \
+ sd/uiconfig/sdraw/ui/drawchardialog \
+ sd/uiconfig/sdraw/ui/drawprinteroptions \
+ sd/uiconfig/sdraw/ui/drawparadialog \
+ sd/uiconfig/sdraw/ui/drawpagedialog \
+ sd/uiconfig/sdraw/ui/drawprtldialog \
+ sd/uiconfig/sdraw/ui/insertlayer \
+ sd/uiconfig/sdraw/ui/insertslidesdialog \
+ sd/uiconfig/sdraw/ui/namedesign \
+ sd/uiconfig/sdraw/ui/notebookbar \
+ sd/uiconfig/sdraw/ui/notebookbar_compact \
+ sd/uiconfig/sdraw/ui/notebookbar_single \
+ sd/uiconfig/sdraw/ui/notebookbar_groupedbar_compact \
+ sd/uiconfig/sdraw/ui/notebookbar_online \
+ sd/uiconfig/sdraw/ui/paranumberingtab \
+ sd/uiconfig/sdraw/ui/queryunlinkimagedialog \
+ sd/uiconfig/sdraw/ui/vectorize \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/UIConfig_simpress.mk b/sd/UIConfig_simpress.mk
new file mode 100644
index 000000000..3476e409a
--- /dev/null
+++ b/sd/UIConfig_simpress.mk
@@ -0,0 +1,170 @@
+# -*- 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_UIConfig_UIConfig,modules/simpress))
+
+$(eval $(call gb_UIConfig_add_menubarfiles,modules/simpress,\
+ sd/uiconfig/simpress/menubar/menubar \
+))
+
+$(eval $(call gb_UIConfig_add_popupmenufiles,modules/simpress,\
+ sd/uiconfig/simpress/popupmenu/3dobject \
+ sd/uiconfig/simpress/popupmenu/3dscene2 \
+ sd/uiconfig/simpress/popupmenu/3dscene \
+ sd/uiconfig/simpress/popupmenu/bezier \
+ sd/uiconfig/simpress/popupmenu/connector \
+ sd/uiconfig/simpress/popupmenu/curve \
+ sd/uiconfig/simpress/popupmenu/drawtext \
+ sd/uiconfig/simpress/popupmenu/draw \
+ sd/uiconfig/simpress/popupmenu/form \
+ sd/uiconfig/simpress/popupmenu/formrichtext \
+ sd/uiconfig/simpress/popupmenu/gluepoint \
+ sd/uiconfig/simpress/popupmenu/graphic \
+ sd/uiconfig/simpress/popupmenu/group \
+ sd/uiconfig/simpress/popupmenu/line \
+ sd/uiconfig/simpress/popupmenu/measure \
+ sd/uiconfig/simpress/popupmenu/media \
+ sd/uiconfig/simpress/popupmenu/multiselect \
+ sd/uiconfig/simpress/popupmenu/notebookbar \
+ sd/uiconfig/simpress/popupmenu/oleobject \
+ sd/uiconfig/simpress/popupmenu/outline \
+ sd/uiconfig/simpress/popupmenu/pagepanemaster \
+ sd/uiconfig/simpress/popupmenu/pagepanenoselmaster \
+ sd/uiconfig/simpress/popupmenu/pagepanenosel \
+ sd/uiconfig/simpress/popupmenu/pagepane \
+ sd/uiconfig/simpress/popupmenu/pagetab \
+ sd/uiconfig/simpress/popupmenu/page \
+ sd/uiconfig/simpress/popupmenu/table \
+ sd/uiconfig/simpress/popupmenu/textbox \
+))
+
+$(eval $(call gb_UIConfig_add_statusbarfiles,modules/simpress,\
+ sd/uiconfig/simpress/statusbar/statusbar \
+))
+
+$(eval $(call gb_UIConfig_add_toolbarfiles,modules/simpress,\
+ sd/uiconfig/simpress/toolbar/3dobjectsbar \
+ sd/uiconfig/simpress/toolbar/alignmentbar \
+ sd/uiconfig/simpress/toolbar/arrowsbar \
+ sd/uiconfig/simpress/toolbar/arrowshapes \
+ sd/uiconfig/simpress/toolbar/basicshapes \
+ sd/uiconfig/simpress/toolbar/bezierobjectbar \
+ sd/uiconfig/simpress/toolbar/calloutshapes \
+ sd/uiconfig/simpress/toolbar/choosemodebar \
+ sd/uiconfig/simpress/toolbar/classificationbar \
+ sd/uiconfig/simpress/toolbar/colorbar \
+ sd/uiconfig/simpress/toolbar/commentsbar \
+ sd/uiconfig/simpress/toolbar/commontaskbar \
+ sd/uiconfig/simpress/toolbar/connectorsbar \
+ sd/uiconfig/simpress/toolbar/drawingobjectbar \
+ sd/uiconfig/simpress/toolbar/distributebar \
+ sd/uiconfig/simpress/toolbar/ellipsesbar \
+ sd/uiconfig/simpress/toolbar/extrusionobjectbar \
+ sd/uiconfig/simpress/toolbar/findbar \
+ sd/uiconfig/simpress/toolbar/flowchartshapes \
+ sd/uiconfig/simpress/toolbar/fontworkobjectbar \
+ sd/uiconfig/simpress/toolbar/fontworkshapetype \
+ sd/uiconfig/simpress/toolbar/formcontrols \
+ sd/uiconfig/simpress/toolbar/formdesign \
+ sd/uiconfig/simpress/toolbar/formsfilterbar \
+ sd/uiconfig/simpress/toolbar/formsnavigationbar \
+ sd/uiconfig/simpress/toolbar/formtextobjectbar \
+ sd/uiconfig/simpress/toolbar/fullscreenbar \
+ sd/uiconfig/simpress/toolbar/gluepointsobjectbar \
+ sd/uiconfig/simpress/toolbar/graffilterbar \
+ sd/uiconfig/simpress/toolbar/graphicobjectbar \
+ sd/uiconfig/simpress/toolbar/insertbar \
+ sd/uiconfig/simpress/toolbar/linesbar \
+ sd/uiconfig/simpress/toolbar/masterviewtoolbar \
+ sd/uiconfig/simpress/toolbar/mediaobjectbar \
+ sd/uiconfig/simpress/toolbar/notebookbarshortcuts \
+ sd/uiconfig/simpress/toolbar/optimizetablebar \
+ sd/uiconfig/simpress/toolbar/optionsbar \
+ sd/uiconfig/simpress/toolbar/outlinetoolbar \
+ sd/uiconfig/simpress/toolbar/positionbar \
+ sd/uiconfig/simpress/toolbar/rectanglesbar \
+ sd/uiconfig/simpress/toolbar/slideviewobjectbar \
+ sd/uiconfig/simpress/toolbar/slideviewtoolbar \
+ sd/uiconfig/simpress/toolbar/singlemode \
+ sd/uiconfig/simpress/toolbar/standardbar \
+ sd/uiconfig/simpress/toolbar/starshapes \
+ sd/uiconfig/simpress/toolbar/symbolshapes \
+ sd/uiconfig/simpress/toolbar/tableobjectbar \
+ sd/uiconfig/simpress/toolbar/textbar \
+ sd/uiconfig/simpress/toolbar/textobjectbar \
+ sd/uiconfig/simpress/toolbar/toolbar \
+ sd/uiconfig/simpress/toolbar/viewerbar \
+ sd/uiconfig/simpress/toolbar/zoombar \
+))
+
+$(eval $(call gb_UIConfig_add_uifiles,modules/simpress,\
+ sd/uiconfig/simpress/ui/annotation \
+ sd/uiconfig/simpress/ui/annotationtagmenu \
+ sd/uiconfig/simpress/ui/clientboxfragment \
+ sd/uiconfig/simpress/ui/currentmastermenu \
+ sd/uiconfig/simpress/ui/customanimationspanel \
+ sd/uiconfig/simpress/ui/customanimationproperties \
+ sd/uiconfig/simpress/ui/customanimationeffecttab \
+ sd/uiconfig/simpress/ui/customanimationfragment \
+ sd/uiconfig/simpress/ui/customanimationtimingtab \
+ sd/uiconfig/simpress/ui/customanimationtexttab \
+ sd/uiconfig/simpress/ui/customslideshows \
+ sd/uiconfig/simpress/ui/definecustomslideshow \
+ sd/uiconfig/simpress/ui/displaywindow \
+ sd/uiconfig/simpress/ui/dlgfield \
+ sd/uiconfig/simpress/ui/dockinganimation \
+ sd/uiconfig/simpress/ui/effectmenu \
+ sd/uiconfig/simpress/ui/fieldmenu \
+ sd/uiconfig/simpress/ui/fontsizemenu \
+ sd/uiconfig/simpress/ui/fontstylemenu \
+ sd/uiconfig/simpress/ui/gluebox \
+ sd/uiconfig/simpress/ui/headerfooterdialog \
+ sd/uiconfig/simpress/ui/headerfootertab \
+ sd/uiconfig/simpress/ui/impressprinteroptions \
+ sd/uiconfig/simpress/ui/insertslides \
+ sd/uiconfig/simpress/ui/interactiondialog \
+ sd/uiconfig/simpress/ui/interactionpage \
+ sd/uiconfig/simpress/ui/layoutmenu \
+ sd/uiconfig/simpress/ui/layoutpanel \
+ sd/uiconfig/simpress/ui/layoutwindow \
+ sd/uiconfig/simpress/ui/masterlayoutdlg \
+ sd/uiconfig/simpress/ui/mastermenu \
+ sd/uiconfig/simpress/ui/masterpagemenu \
+ sd/uiconfig/simpress/ui/masterpagepanel \
+ sd/uiconfig/simpress/ui/masterpagepanelall \
+ sd/uiconfig/simpress/ui/masterpagepanelrecent \
+ sd/uiconfig/simpress/ui/navigatorpanel \
+ sd/uiconfig/simpress/ui/notebookbar \
+ sd/uiconfig/simpress/ui/notebookbar_compact \
+ sd/uiconfig/simpress/ui/notebookbar_single \
+ sd/uiconfig/simpress/ui/notebookbar_groups \
+ sd/uiconfig/simpress/ui/notebookbar_groupedbar_full \
+ sd/uiconfig/simpress/ui/notebookbar_groupedbar_compact \
+ sd/uiconfig/simpress/ui/notebookbar_online \
+ sd/uiconfig/simpress/ui/optimpressgeneralpage \
+ sd/uiconfig/simpress/ui/pagesfieldbox \
+ sd/uiconfig/simpress/ui/photoalbum \
+ sd/uiconfig/simpress/ui/presentationdialog \
+ sd/uiconfig/simpress/ui/prntopts \
+ sd/uiconfig/simpress/ui/publishingdialog \
+ sd/uiconfig/simpress/ui/remotedialog \
+ sd/uiconfig/simpress/ui/rotatemenu \
+ sd/uiconfig/simpress/ui/scalemenu \
+ sd/uiconfig/simpress/ui/sdviewpage \
+ sd/uiconfig/simpress/ui/sidebarslidebackground \
+ sd/uiconfig/simpress/ui/slidecontextmenu \
+ sd/uiconfig/simpress/ui/slidedesigndialog \
+ sd/uiconfig/simpress/ui/slidetransitionspanel \
+ sd/uiconfig/simpress/ui/snapmenu \
+ sd/uiconfig/simpress/ui/tabviewbar \
+ sd/uiconfig/simpress/ui/tabledesignpanel \
+ sd/uiconfig/simpress/ui/templatedialog \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/UITest_impress_tests.mk b/sd/UITest_impress_tests.mk
new file mode 100644
index 000000000..882e0a85c
--- /dev/null
+++ b/sd/UITest_impress_tests.mk
@@ -0,0 +1,16 @@
+# 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,impress_tests))
+
+$(eval $(call gb_UITest_add_modules,impress_tests,$(SRCDIR)/sd/qa/uitest,\
+ impress_tests/ \
+))
+
+$(eval $(call gb_UITest_set_defs,impress_tests, \
+ TDOC="$(SRCDIR)/sd/qa/uitest/data" \
+))
diff --git a/sd/UITest_sd_findReplace.mk b/sd/UITest_sd_findReplace.mk
new file mode 100644
index 000000000..5551aa560
--- /dev/null
+++ b/sd/UITest_sd_findReplace.mk
@@ -0,0 +1,16 @@
+# 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,sd_findReplace))
+
+$(eval $(call gb_UITest_add_modules,sd_findReplace,$(SRCDIR)/sd/qa/uitest,\
+ findReplace/ \
+))
+
+$(eval $(call gb_UITest_set_defs,sd_findReplace, \
+ TDOC="$(SRCDIR)/sd/qa/uitest/data" \
+))
diff --git a/sd/export_setup.mk b/sd/export_setup.mk
new file mode 100644
index 000000000..77e5a965c
--- /dev/null
+++ b/sd/export_setup.mk
@@ -0,0 +1,87 @@
+# -*- 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/.
+#
+#*************************************************************************
+
+# template for export tests
+define sd_export_test
+
+$(eval $(call gb_CppunitTest_CppunitTest,sd_export_tests$(1)))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_export_tests$(1),\
+ boost_headers \
+ libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_export_tests$(1)))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_export_tests$(1), \
+ sd/qa/unit/export-tests$(1) \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_export_tests$(1), \
+ $(call gb_Helper_optional,AVMEDIA,avmedia) \
+ basegfx \
+ comphelper \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ for \
+ forui \
+ i18nlangtag \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sd \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ test \
+ tl \
+ tk \
+ ucbhelper \
+ unotest \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sd_export_tests$(1),\
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_export_tests$(1)))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_export_tests$(1)))
+$(eval $(call gb_CppunitTest_use_vcl,sd_export_tests$(1)))
+
+$(eval $(call gb_CppunitTest_use_rdb,sd_export_tests$(1),services))
+
+$(eval $(call gb_CppunitTest_use_custom_headers,sd_export_tests$(1),\
+ officecfg/registry \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_export_tests$(1)))
+
+$(eval $(call gb_CppunitTest_add_arguments,sd_export_tests$(1),\
+ -env:SVG_DISABLE_FONT_EMBEDDING= \
+ -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \
+))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/import_setup.mk b/sd/import_setup.mk
new file mode 100644
index 000000000..0fd0984ac
--- /dev/null
+++ b/sd/import_setup.mk
@@ -0,0 +1,141 @@
+# -*- 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/.
+#
+#*************************************************************************
+
+# template for import tests
+define sd_import_test
+
+$(eval $(call gb_CppunitTest_CppunitTest,sd_import_tests$(1)))
+
+$(eval $(call gb_CppunitTest_use_externals,sd_import_tests$(1),\
+ boost_headers \
+ libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_use_common_precompiled_header,sd_import_tests$(1)))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sd_import_tests$(1), \
+ sd/qa/unit/import-tests$(1) \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sd_import_tests$(1), \
+ $(call gb_Helper_optional,AVMEDIA,avmedia) \
+ basegfx \
+ comphelper \
+ cppu \
+ cppuhelper \
+ drawinglayer \
+ editeng \
+ for \
+ forui \
+ i18nlangtag \
+ msfilter \
+ oox \
+ sal \
+ salhelper \
+ sax \
+ sd \
+ sfx \
+ sot \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ test \
+ tl \
+ tk \
+ ucbhelper \
+ unotest \
+ utl \
+ vcl \
+ xo \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sd_import_tests$(1),\
+ -I$(SRCDIR)/sd/source/ui/inc \
+ -I$(SRCDIR)/sd/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sd_import_tests$(1)))
+
+$(eval $(call gb_CppunitTest_use_ure,sd_import_tests$(1)))
+$(eval $(call gb_CppunitTest_use_vcl,sd_import_tests$(1)))
+
+$(eval $(call gb_CppunitTest_use_components,sd_import_tests$(1),\
+ animations/source/animcore/animcore \
+ basic/util/sb \
+ chart2/source/chartcore \
+ chart2/source/controller/chartcontroller \
+ comphelper/util/comphelp \
+ configmgr/source/configmgr \
+ dbaccess/util/dba \
+ desktop/source/deployment/deployment \
+ drawinglayer/drawinglayer \
+ embeddedobj/util/embobj \
+ emfio/emfio \
+ filter/source/config/cache/filterconfig1 \
+ filter/source/odfflatxml/odfflatxml \
+ filter/source/svg/svgfilter \
+ filter/source/pdf/pdffilter \
+ filter/source/xmlfilteradaptor/xmlfa \
+ filter/source/xmlfilterdetect/xmlfd \
+ filter/source/storagefilterdetect/storagefd \
+ forms/util/frm \
+ framework/util/fwk \
+ i18npool/util/i18npool \
+ linguistic/source/lng \
+ oox/util/oox \
+ package/source/xstor/xstor \
+ package/util/package2 \
+ sax/source/expatwrap/expwrap \
+ sd/util/sd \
+ sd/util/sdfilt \
+ sd/util/sdd \
+ $(if $(ENABLE_POPPLER),sdext/source/pdfimport/pdfimport) \
+ sfx2/util/sfx \
+ sot/util/sot \
+ svl/source/fsstor/fsstorage \
+ svtools/util/svt \
+ svx/util/svxcore \
+ svgio/svgio \
+ toolkit/util/tk \
+ ucb/source/core/ucb1 \
+ ucb/source/ucp/expand/ucpexpand1 \
+ ucb/source/ucp/file/ucpfile1 \
+ ucb/source/ucp/package/ucppkg1 \
+ ucb/source/ucp/tdoc/ucptdoc1 \
+ unotools/util/utl \
+ unoxml/source/rdf/unordf \
+ unoxml/source/service/unoxml \
+ uui/util/uui \
+ vcl/vcl.common \
+ xmlscript/util/xmlscript \
+ xmloff/util/xo \
+ xmlsecurity/util/xmlsecurity \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,sd_import_tests$(1)))
+
+$(eval $(call gb_CppunitTest_use_packages,sd_import_tests$(1),\
+ oox_customshapes \
+))
+
+ifneq ($(ENABLE_POPPLER),)
+$(eval $(call gb_CppunitTest_use_executable,sd_import_tests$(1),xpdfimport))
+endif
+
+$(eval $(call gb_CppunitTest_add_arguments,sd_import_tests$(1), \
+ -env:arg-env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \
+))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/sd/inc/Annotation.hxx b/sd/inc/Annotation.hxx
new file mode 100644
index 000000000..707f2cdc8
--- /dev/null
+++ b/sd/inc/Annotation.hxx
@@ -0,0 +1,159 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+#include <sal/types.h>
+#include <memory>
+
+#include <com/sun/star/office/XAnnotation.hpp>
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/propertysetmixin.hxx>
+
+#include "sdpage.hxx"
+#include "textapi.hxx"
+#include "sddllapi.h"
+
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <tools/color.hxx>
+
+class SdrUndoAction;
+
+namespace com::sun::star::office {
+ class XAnnotation;
+}
+
+namespace com::sun::star::uno { template <typename > class Reference; }
+
+class SfxViewShell;
+
+namespace sd {
+
+enum class CommentNotificationType { Add, Modify, Remove };
+
+void createAnnotation( css::uno::Reference< css::office::XAnnotation >& xAnnotation, SdPage* pPage );
+
+std::unique_ptr<SdrUndoAction> CreateUndoInsertOrRemoveAnnotation( const css::uno::Reference< css::office::XAnnotation >& xAnnotation, bool bInsert );
+
+void CreateChangeUndo(const css::uno::Reference< css::office::XAnnotation >& xAnnotation);
+
+sal_uInt32 getAnnotationId(const css::uno::Reference <css::office::XAnnotation>& xAnnotation);
+
+const SdPage* getAnnotationPage(const css::uno::Reference<css::office::XAnnotation>& xAnnotation);
+
+void LOKCommentNotify(CommentNotificationType nType, const SfxViewShell* pViewShell,
+ css::uno::Reference<css::office::XAnnotation> const & rxAnnotation);
+
+void LOKCommentNotifyAll(CommentNotificationType nType,
+ css::uno::Reference<css::office::XAnnotation> const & rxAnnotation);
+
+struct SD_DLLPUBLIC CustomAnnotationMarker
+{
+ Color maLineColor;
+ Color maFillColor;
+ float mnLineWidth;
+ std::vector<basegfx::B2DPolygon> maPolygons;
+};
+
+class Annotation final : private ::cppu::BaseMutex,
+ public ::cppu::WeakComponentImplHelper<css::office::XAnnotation>,
+ public ::cppu::PropertySetMixin<css::office::XAnnotation>
+{
+public:
+ explicit Annotation( const css::uno::Reference<css::uno::XComponentContext>& context, SdPage* pPage );
+ Annotation(const Annotation&) = delete;
+ Annotation& operator=(const Annotation&) = delete;
+
+ static sal_uInt32 m_nLastId;
+
+ SdPage* GetPage() const { return mpPage; }
+ SdrModel* GetModel() { return (mpPage != nullptr) ? &mpPage->getSdrModelFromSdrPage() : nullptr; }
+ sal_uInt32 GetId() const { return m_nId; }
+
+ // XInterface:
+ virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const & type) override;
+ virtual void SAL_CALL acquire() noexcept override { ::cppu::WeakComponentImplHelper<css::office::XAnnotation>::acquire(); }
+ virtual void SAL_CALL release() noexcept override { ::cppu::WeakComponentImplHelper<css::office::XAnnotation>::release(); }
+
+ // css::beans::XPropertySet:
+ virtual css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue(const OUString & aPropertyName, const css::uno::Any & aValue) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue(const OUString & PropertyName) override;
+ virtual void SAL_CALL addPropertyChangeListener(const OUString & aPropertyName, const css::uno::Reference<css::beans::XPropertyChangeListener> & xListener) override;
+ virtual void SAL_CALL removePropertyChangeListener(const OUString & aPropertyName, const css::uno::Reference<css::beans::XPropertyChangeListener> & aListener) override;
+ virtual void SAL_CALL addVetoableChangeListener(const OUString & PropertyName, const css::uno::Reference<css::beans::XVetoableChangeListener> & aListener) override;
+ virtual void SAL_CALL removeVetoableChangeListener(const OUString & PropertyName, const css::uno::Reference<css::beans::XVetoableChangeListener> & aListener) override;
+
+ // css::office::XAnnotation:
+ virtual css::uno::Any SAL_CALL getAnchor() override;
+ virtual css::geometry::RealPoint2D SAL_CALL getPosition() override;
+ virtual void SAL_CALL setPosition(const css::geometry::RealPoint2D & the_value) override;
+ virtual css::geometry::RealSize2D SAL_CALL getSize() override;
+ virtual void SAL_CALL setSize(const css::geometry::RealSize2D& _size) override;
+ virtual OUString SAL_CALL getAuthor() override;
+ virtual void SAL_CALL setAuthor(const OUString & the_value) override;
+ virtual OUString SAL_CALL getInitials() override;
+ virtual void SAL_CALL setInitials(const OUString & the_value) override;
+ virtual css::util::DateTime SAL_CALL getDateTime() override;
+ virtual void SAL_CALL setDateTime(const css::util::DateTime & the_value) override;
+ virtual css::uno::Reference<css::text::XText> SAL_CALL getTextRange() override;
+
+ void createChangeUndo();
+
+ void createCustomAnnotationMarker()
+ {
+ m_pCustomAnnotationMarker = std::make_unique<CustomAnnotationMarker>();
+ }
+
+ CustomAnnotationMarker& getCustomAnnotationMarker()
+ {
+ return *m_pCustomAnnotationMarker;
+ }
+
+ bool hasCustomAnnotationMarker() const
+ {
+ return bool(m_pCustomAnnotationMarker);
+ }
+
+private:
+ // destructor is private and will be called indirectly by the release call virtual ~Annotation() {}
+
+ // override WeakComponentImplHelperBase::disposing()
+ // This function is called upon disposing the component,
+ // if your component needs special work when it becomes
+ // disposed, do it here.
+ virtual void SAL_CALL disposing() override;
+
+ sal_uInt32 m_nId;
+ SdPage* mpPage;
+ css::geometry::RealPoint2D m_Position;
+ css::geometry::RealSize2D m_Size;
+ OUString m_Author;
+ OUString m_Initials;
+ css::util::DateTime m_DateTime;
+ rtl::Reference<TextApiObject> m_TextRange;
+
+ std::unique_ptr<CustomAnnotationMarker> m_pCustomAnnotationMarker;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/AnnotationEnumeration.hxx b/sd/inc/AnnotationEnumeration.hxx
new file mode 100644
index 000000000..ed35b46b4
--- /dev/null
+++ b/sd/inc/AnnotationEnumeration.hxx
@@ -0,0 +1,37 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include "sdpage.hxx"
+
+namespace com::sun::star::office
+{
+class XAnnotationEnumeration;
+}
+
+namespace sd
+{
+css::uno::Reference<css::office::XAnnotationEnumeration>
+createAnnotationEnumeration(AnnotationVector&&);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/CustomAnimationCloner.hxx b/sd/inc/CustomAnimationCloner.hxx
new file mode 100644
index 000000000..5cc71b0e6
--- /dev/null
+++ b/sd/inc/CustomAnimationCloner.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/animations/XAnimationNode.hpp>
+
+class SdPage;
+
+namespace sd
+{
+css::uno::Reference<css::animations::XAnimationNode>
+Clone(const css::uno::Reference<css::animations::XAnimationNode>& xSourceNode,
+ const SdPage* pSource = nullptr, const SdPage* pTarget = nullptr);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/CustomAnimationEffect.hxx b/sd/inc/CustomAnimationEffect.hxx
new file mode 100644
index 000000000..e117783c9
--- /dev/null
+++ b/sd/inc/CustomAnimationEffect.hxx
@@ -0,0 +1,454 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/animations/XAnimationNode.hpp>
+#include <com/sun/star/animations/XTimeContainer.hpp>
+#include <com/sun/star/animations/XAudio.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
+#include <com/sun/star/util/XChangesListener.hpp>
+#include <vcl/timer.hxx>
+#include <tools/long.hxx>
+#include "sddllapi.h"
+#include <list>
+#include <vector>
+#include <map>
+#include <memory>
+
+class SdrPathObj;
+class SdrModel;
+
+namespace sd {
+
+enum class EValue { To, By };
+
+class CustomAnimationEffect;
+
+class CustomAnimationPreset;
+typedef std::shared_ptr< CustomAnimationPreset > CustomAnimationPresetPtr;
+
+typedef std::shared_ptr< CustomAnimationEffect > CustomAnimationEffectPtr;
+
+typedef std::list< CustomAnimationEffectPtr > EffectSequence;
+
+class EffectSequenceHelper;
+
+class SD_DLLPUBLIC CustomAnimationEffect final
+{
+ friend class MainSequence;
+ friend class EffectSequenceHelper;
+
+public:
+ CustomAnimationEffect( const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ ~CustomAnimationEffect();
+
+ SAL_DLLPRIVATE const css::uno::Reference< css::animations::XAnimationNode >& getNode() const { return mxNode; }
+ SAL_DLLPRIVATE void setNode( const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ SAL_DLLPRIVATE void replaceNode( const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+
+ SAL_DLLPRIVATE CustomAnimationEffectPtr clone() const;
+
+ // attributes
+ SAL_DLLPRIVATE const OUString& getPresetId() const { return maPresetId; }
+ SAL_DLLPRIVATE const OUString& getPresetSubType() const { return maPresetSubType; }
+ SAL_DLLPRIVATE const OUString& getProperty() const { return maProperty; }
+
+ SAL_DLLPRIVATE sal_Int16 getPresetClass() const { return mnPresetClass; }
+ SAL_DLLPRIVATE void setPresetClassAndId( sal_Int16 nPresetClass, const OUString& rPresetId );
+
+ SAL_DLLPRIVATE sal_Int16 getNodeType() const { return mnNodeType; }
+ void setNodeType( sal_Int16 nNodeType );
+
+ SAL_DLLPRIVATE css::uno::Any getRepeatCount() const;
+ SAL_DLLPRIVATE void setRepeatCount( const css::uno::Any& rRepeatCount );
+
+ SAL_DLLPRIVATE css::uno::Any getEnd() const;
+ SAL_DLLPRIVATE void setEnd( const css::uno::Any& rEnd );
+
+ SAL_DLLPRIVATE sal_Int16 getFill() const { return mnFill; }
+ SAL_DLLPRIVATE void setFill( sal_Int16 nFill );
+
+ SAL_DLLPRIVATE double getBegin() const { return mfBegin; }
+ void setBegin( double fBegin );
+
+ SAL_DLLPRIVATE double getDuration() const { return mfDuration; }
+ void setDuration( double fDuration );
+
+ SAL_DLLPRIVATE double getAbsoluteDuration() const { return mfAbsoluteDuration; }
+
+ SAL_DLLPRIVATE sal_Int16 getIterateType() const { return mnIterateType; }
+ void setIterateType( sal_Int16 nIterateType );
+
+ SAL_DLLPRIVATE double getIterateInterval() const { return mfIterateInterval; }
+ void setIterateInterval( double fIterateInterval );
+
+ SAL_DLLPRIVATE const css::uno::Any& getTarget() const { return maTarget; }
+ void setTarget( const css::uno::Any& rTarget );
+
+ SAL_DLLPRIVATE bool hasAfterEffect() const { return mbHasAfterEffect; }
+ SAL_DLLPRIVATE void setHasAfterEffect( bool bHasAfterEffect ) { mbHasAfterEffect = bHasAfterEffect; }
+
+ SAL_DLLPRIVATE const css::uno::Any& getDimColor() const { return maDimColor; }
+ SAL_DLLPRIVATE void setDimColor( const css::uno::Any& rDimColor ) { maDimColor = rDimColor; }
+
+ SAL_DLLPRIVATE bool IsAfterEffectOnNext() const { return mbAfterEffectOnNextEffect; }
+ SAL_DLLPRIVATE void setAfterEffectOnNext( bool bOnNextEffect ) { mbAfterEffectOnNextEffect = bOnNextEffect; }
+
+ SAL_DLLPRIVATE sal_Int32 getParaDepth() const { return mnParaDepth; }
+
+ SAL_DLLPRIVATE bool hasText() const { return mbHasText; }
+
+ SAL_DLLPRIVATE sal_Int16 getCommand() const { return mnCommand; }
+
+ SAL_DLLPRIVATE double getAcceleration() const { return mfAcceleration; }
+ SAL_DLLPRIVATE void setAcceleration( double fAcceleration );
+
+ SAL_DLLPRIVATE double getDecelerate() const { return mfDecelerate; }
+ SAL_DLLPRIVATE void setDecelerate( double fDecelerate );
+
+ SAL_DLLPRIVATE bool getAutoReverse() const { return mbAutoReverse; }
+ SAL_DLLPRIVATE void setAutoReverse( bool bAutoReverse );
+
+ SAL_DLLPRIVATE css::uno::Any getProperty( sal_Int32 nNodeType, std::u16string_view rAttributeName, EValue eValue );
+ SAL_DLLPRIVATE bool setProperty( sal_Int32 nNodeType, std::u16string_view rAttributeName, EValue eValue, const css::uno::Any& rValue );
+
+ SAL_DLLPRIVATE css::uno::Any getTransformationProperty( sal_Int32 nTransformType, EValue eValue );
+ SAL_DLLPRIVATE bool setTransformationProperty( sal_Int32 nTransformType, EValue eValue, const css::uno::Any& rValue );
+
+ SAL_DLLPRIVATE css::uno::Any getColor( sal_Int32 nIndex );
+ SAL_DLLPRIVATE void setColor( sal_Int32 nIndex, const css::uno::Any& rColor );
+
+ SAL_DLLPRIVATE sal_Int32 getGroupId() const { return mnGroupId; }
+ SAL_DLLPRIVATE void setGroupId( sal_Int32 nGroupId );
+
+ SAL_DLLPRIVATE sal_Int16 getTargetSubItem() const { return mnTargetSubItem; }
+ void setTargetSubItem( sal_Int16 nSubItem );
+
+ SAL_DLLPRIVATE OUString getPath() const;
+ SAL_DLLPRIVATE void setPath( const OUString& rPath );
+
+ SAL_DLLPRIVATE bool checkForText( const std::vector<sal_Int32>* paragraphNumberingLevel = nullptr );
+ SAL_DLLPRIVATE bool calculateIterateDuration();
+
+ SAL_DLLPRIVATE void setAudio( const css::uno::Reference< css::animations::XAudio >& xAudio );
+ SAL_DLLPRIVATE bool getStopAudio() const;
+ void setStopAudio();
+ void createAudio( const css::uno::Any& rSource );
+ SAL_DLLPRIVATE void removeAudio();
+ SAL_DLLPRIVATE const css::uno::Reference< css::animations::XAudio >& getAudio() const { return mxAudio; }
+
+ SAL_DLLPRIVATE EffectSequenceHelper* getEffectSequence() const { return mpEffectSequence; }
+
+ // helper
+ /// @throws css::uno::Exception
+ SAL_DLLPRIVATE css::uno::Reference< css::animations::XAnimationNode > createAfterEffectNode() const;
+ SAL_DLLPRIVATE css::uno::Reference< css::drawing::XShape > getTargetShape() const;
+
+ // static helpers
+ SAL_DLLPRIVATE static sal_Int32 get_node_type( const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ SAL_DLLPRIVATE static sal_Int32 getNumberOfSubitems( const css::uno::Any& aTarget, sal_Int16 nIterateType );
+
+ SAL_DLLPRIVATE SdrPathObj* createSdrPathObjFromPath(SdrModel& rTargetModel);
+ SAL_DLLPRIVATE void updateSdrPathObjFromPath( SdrPathObj& rPathObj );
+ SAL_DLLPRIVATE void updatePathFromSdrPathObj( const SdrPathObj& rPathObj );
+
+private:
+ SAL_DLLPRIVATE void setEffectSequence( EffectSequenceHelper* pSequence ) { mpEffectSequence = pSequence; }
+
+ sal_Int16 mnNodeType;
+ OUString maPresetId;
+ OUString maPresetSubType;
+ OUString maProperty;
+ sal_Int16 mnPresetClass;
+ sal_Int16 mnFill;
+ double mfBegin;
+ double mfDuration; // this is the maximum duration of the subeffects
+ double mfAbsoluteDuration; // this is the maximum duration of the subeffects including possible iterations
+ sal_Int32 mnGroupId;
+ sal_Int16 mnIterateType;
+ double mfIterateInterval;
+ sal_Int32 mnParaDepth;
+ bool mbHasText;
+ double mfAcceleration;
+ double mfDecelerate;
+ bool mbAutoReverse;
+ sal_Int16 mnTargetSubItem;
+ sal_Int16 mnCommand;
+
+ EffectSequenceHelper* mpEffectSequence;
+
+ css::uno::Reference< css::animations::XAnimationNode > mxNode;
+ css::uno::Reference< css::animations::XAudio > mxAudio;
+ css::uno::Any maTarget;
+
+ bool mbHasAfterEffect;
+ css::uno::Any maDimColor;
+ bool mbAfterEffectOnNextEffect;
+};
+
+struct stl_CustomAnimationEffect_search_node_predict
+{
+ stl_CustomAnimationEffect_search_node_predict( const css::uno::Reference< css::animations::XAnimationNode >& xSearchNode );
+ bool operator()( const CustomAnimationEffectPtr& pEffect ) const;
+ const css::uno::Reference< css::animations::XAnimationNode >& mxSearchNode;
+};
+
+/** this listener is implemented by UI components to track changes in the animation core */
+class ISequenceListener
+{
+public:
+ virtual void notify_change() = 0;
+
+protected:
+ ~ISequenceListener() {}
+};
+
+/** this class keeps track of a group of animations that build up
+ a text animation for a single shape */
+class CustomAnimationTextGroup
+{
+ friend class EffectSequenceHelper;
+
+public:
+ CustomAnimationTextGroup( const css::uno::Reference< css::drawing::XShape >& rTarget, sal_Int32 nGroupId );
+
+ void reset();
+ void addEffect( CustomAnimationEffectPtr const & pEffect );
+
+ const EffectSequence& getEffects() const { return maEffects; }
+
+ /* -1: as single object, 0: all at once, n > 0: by n Th paragraph */
+ sal_Int32 getTextGrouping() const { return mnTextGrouping; }
+
+ bool getAnimateForm() const { return mbAnimateForm; }
+ bool getTextReverse() const { return mbTextReverse; }
+ double getTextGroupingAuto() const { return mfGroupingAuto; }
+
+private:
+ EffectSequence maEffects;
+ css::uno::Reference< css::drawing::XShape > maTarget;
+
+ enum { PARA_LEVELS = 5 };
+
+ sal_Int32 mnTextGrouping;
+ bool mbAnimateForm;
+ bool mbTextReverse;
+ double mfGroupingAuto;
+ sal_Int32 mnLastPara;
+ sal_Int8 mnDepthFlags[PARA_LEVELS];
+ sal_Int32 mnGroupId;
+};
+
+typedef std::shared_ptr< CustomAnimationTextGroup > CustomAnimationTextGroupPtr;
+typedef std::map< sal_Int32, CustomAnimationTextGroupPtr > CustomAnimationTextGroupMap;
+
+class SD_DLLPUBLIC EffectSequenceHelper
+{
+friend class MainSequence;
+
+public:
+ SAL_DLLPRIVATE EffectSequenceHelper();
+ SAL_DLLPRIVATE EffectSequenceHelper( const css::uno::Reference< css::animations::XTimeContainer >& xSequenceRoot );
+ SAL_DLLPRIVATE virtual ~EffectSequenceHelper();
+
+ SAL_DLLPRIVATE virtual css::uno::Reference< css::animations::XAnimationNode > getRootNode();
+
+ SAL_DLLPRIVATE CustomAnimationEffectPtr append( const CustomAnimationPresetPtr& pDescriptor, const css::uno::Any& rTarget, double fDuration );
+ SAL_DLLPRIVATE CustomAnimationEffectPtr append( const SdrPathObj& rPathObj, const css::uno::Any& rTarget, double fDuration, const OUString& rPresetId );
+ void append( const CustomAnimationEffectPtr& pEffect );
+ SAL_DLLPRIVATE void replace( const CustomAnimationEffectPtr& pEffect, const CustomAnimationPresetPtr& pDescriptor, double fDuration );
+ SAL_DLLPRIVATE void replace( const CustomAnimationEffectPtr& pEffect, const CustomAnimationPresetPtr& pDescriptor, const OUString& rPresetSubType, double fDuration );
+ SAL_DLLPRIVATE void remove( const CustomAnimationEffectPtr& pEffect );
+ SAL_DLLPRIVATE void moveToBeforeEffect( const CustomAnimationEffectPtr& pEffect, const CustomAnimationEffectPtr& pInsertBefore);
+
+ SAL_DLLPRIVATE void create( const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ SAL_DLLPRIVATE void createEffectsequence( const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ SAL_DLLPRIVATE void processAfterEffect( const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ SAL_DLLPRIVATE void createEffects( const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+
+ SAL_DLLPRIVATE sal_Int32 getCount() const { return sal::static_int_cast< sal_Int32 >( maEffects.size() ); }
+
+ SAL_DLLPRIVATE virtual CustomAnimationEffectPtr findEffect( const css::uno::Reference< css::animations::XAnimationNode >& xNode ) const;
+
+ SAL_DLLPRIVATE virtual bool disposeShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+ SAL_DLLPRIVATE virtual void insertTextRange( const css::uno::Any& aTarget );
+ SAL_DLLPRIVATE virtual void disposeTextRange( const css::uno::Any& aTarget );
+ SAL_DLLPRIVATE virtual bool hasEffect( const css::uno::Reference< css::drawing::XShape >& xShape );
+ SAL_DLLPRIVATE virtual void onTextChanged( const css::uno::Reference< css::drawing::XShape >& xShape );
+
+ /** this method rebuilds the animation nodes */
+ SAL_DLLPRIVATE virtual void rebuild();
+
+ SAL_DLLPRIVATE EffectSequence::iterator getBegin() { return maEffects.begin(); }
+ SAL_DLLPRIVATE EffectSequence::iterator getEnd() { return maEffects.end(); }
+ SAL_DLLPRIVATE EffectSequence::iterator find( const CustomAnimationEffectPtr& pEffect );
+
+ SAL_DLLPRIVATE EffectSequence& getSequence() { return maEffects; }
+
+ SAL_DLLPRIVATE void addListener( ISequenceListener* pListener );
+ SAL_DLLPRIVATE void removeListener( ISequenceListener* pListener );
+
+ // text group methods
+
+ SAL_DLLPRIVATE CustomAnimationTextGroupPtr findGroup( sal_Int32 nGroupId );
+ CustomAnimationTextGroupPtr createTextGroup(const CustomAnimationEffectPtr& pEffect,
+ sal_Int32 nTextGrouping, double fTextGroupingAuto,
+ bool bAnimateForm, bool bTextReverse);
+ SAL_DLLPRIVATE void setTextGrouping( const CustomAnimationTextGroupPtr& pTextGroup, sal_Int32 nTextGrouping );
+ SAL_DLLPRIVATE void setAnimateForm( const CustomAnimationTextGroupPtr& pTextGroup, bool bAnimateForm );
+ SAL_DLLPRIVATE void setTextGroupingAuto( const CustomAnimationTextGroupPtr& pTextGroup, double fTextGroupingAuto );
+ SAL_DLLPRIVATE void setTextReverse( const CustomAnimationTextGroupPtr& pTextGroup, bool bAnimateForm );
+
+ SAL_DLLPRIVATE sal_Int32 getSequenceType() const { return mnSequenceType; }
+
+ SAL_DLLPRIVATE const css::uno::Reference< css::drawing::XShape >& getTriggerShape() const { return mxEventSource; }
+ SAL_DLLPRIVATE void setTriggerShape( const css::uno::Reference< css::drawing::XShape >& xTrigger ) { mxEventSource = xTrigger; }
+
+ SAL_DLLPRIVATE virtual sal_Int32 getOffsetFromEffect( const CustomAnimationEffectPtr& xEffect ) const;
+ SAL_DLLPRIVATE virtual CustomAnimationEffectPtr getEffectFromOffset( sal_Int32 nOffset ) const;
+
+protected:
+ SAL_DLLPRIVATE virtual void implRebuild();
+ SAL_DLLPRIVATE virtual void reset();
+
+ SAL_DLLPRIVATE void createTextGroupParagraphEffects( const CustomAnimationTextGroupPtr& pTextGroup, const CustomAnimationEffectPtr& pEffect, bool bUsed );
+
+ SAL_DLLPRIVATE void notify_listeners();
+
+ SAL_DLLPRIVATE void updateTextGroups();
+
+ SAL_DLLPRIVATE bool getParagraphNumberingLevels( const css::uno::Reference< css::drawing::XShape >& xShape, std::vector< sal_Int32 >& rParagraphNumberingLevel );
+
+protected:
+ css::uno::Reference< css::animations::XTimeContainer > mxSequenceRoot;
+ EffectSequence maEffects;
+ std::list< ISequenceListener* > maListeners;
+ CustomAnimationTextGroupMap maGroupMap;
+ sal_Int32 mnSequenceType;
+ css::uno::Reference< css::drawing::XShape > mxEventSource;
+};
+
+class MainSequence;
+
+class InteractiveSequence final : public EffectSequenceHelper
+{
+friend class MainSequence;
+friend class MainSequenceChangeGuard;
+
+public:
+ InteractiveSequence( const css::uno::Reference< css::animations::XTimeContainer >& xSequenceRoot, MainSequence* pMainSequence );
+
+ /** this method rebuilds the animation nodes */
+ virtual void rebuild() override;
+
+private:
+ virtual void implRebuild() override;
+
+ MainSequence* mpMainSequence;
+};
+
+typedef std::shared_ptr< InteractiveSequence > InteractiveSequencePtr;
+typedef std::vector< InteractiveSequencePtr > InteractiveSequenceVector;
+
+class SD_DLLPUBLIC MainSequence final : public EffectSequenceHelper, public ISequenceListener
+{
+ friend class UndoAnimation;
+ friend class MainSequenceRebuildGuard;
+ friend class MainSequenceChangeGuard;
+
+public:
+ MainSequence();
+ MainSequence( const css::uno::Reference< css::animations::XAnimationNode >& xTimingRootNode );
+ virtual ~MainSequence() override;
+
+ virtual css::uno::Reference< css::animations::XAnimationNode > getRootNode() override;
+ void reset( const css::uno::Reference< css::animations::XAnimationNode >& xTimingRootNode );
+
+ /** this method rebuilds the animation nodes */
+ virtual void rebuild() override;
+
+ virtual CustomAnimationEffectPtr findEffect( const css::uno::Reference< css::animations::XAnimationNode >& xNode ) const override;
+
+ virtual bool disposeShape( const css::uno::Reference< css::drawing::XShape >& xShape ) override;
+ virtual void insertTextRange( const css::uno::Any& aTarget ) override;
+ virtual void disposeTextRange( const css::uno::Any& aTarget ) override;
+ virtual bool hasEffect( const css::uno::Reference< css::drawing::XShape >& xShape ) override;
+ virtual void onTextChanged( const css::uno::Reference< css::drawing::XShape >& xShape ) override;
+
+ const InteractiveSequenceVector& getInteractiveSequenceVector() const { return maInteractiveSequenceVector; }
+
+ virtual void notify_change() override;
+
+ bool setTrigger( const CustomAnimationEffectPtr& pEffect, const css::uno::Reference< css::drawing::XShape >& xTriggerShape );
+
+ /** starts a timer that recreates the internal structure from the API core after 1 second */
+ void startRecreateTimer();
+
+ /** starts a timer that rebuilds the API core from the internal structure after 1 second */
+ void startRebuildTimer();
+
+ virtual sal_Int32 getOffsetFromEffect( const CustomAnimationEffectPtr& xEffect ) const override;
+ virtual CustomAnimationEffectPtr getEffectFromOffset( sal_Int32 nOffset ) const override;
+
+private:
+ /** permits rebuilds until unlockRebuilds() is called. All rebuild calls during a locked sequence are
+ process after unlockRebuilds() call. lockRebuilds() and unlockRebuilds() calls can be nested. */
+ void lockRebuilds();
+ void unlockRebuilds();
+
+ DECL_DLLPRIVATE_LINK(onTimerHdl, Timer *, void);
+
+ virtual void implRebuild() override;
+
+ void init();
+
+ void createMainSequence();
+ virtual void reset() override;
+
+ InteractiveSequencePtr createInteractiveSequence( const css::uno::Reference< css::drawing::XShape >& xShape );
+
+ InteractiveSequenceVector maInteractiveSequenceVector;
+
+ css::uno::Reference< css::util::XChangesListener > mxChangesListener;
+ css::uno::Reference< css::animations::XTimeContainer > mxTimingRootNode;
+ Timer maTimer;
+ bool mbTimerMode;
+ bool mbRebuilding;
+
+ ::tools::Long mnRebuildLockGuard;
+ bool mbPendingRebuildRequest;
+ sal_Int32 mbIgnoreChanges;
+};
+
+typedef std::shared_ptr< MainSequence > MainSequencePtr;
+
+class MainSequenceRebuildGuard
+{
+public:
+ MainSequenceRebuildGuard( const MainSequencePtr& pMainSequence );
+ ~MainSequenceRebuildGuard();
+
+private:
+ MainSequencePtr mpMainSequence;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/CustomAnimationPreset.hxx b/sd/inc/CustomAnimationPreset.hxx
new file mode 100644
index 000000000..b746b20b7
--- /dev/null
+++ b/sd/inc/CustomAnimationPreset.hxx
@@ -0,0 +1,142 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <vector>
+
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+
+#include "CustomAnimationEffect.hxx"
+
+#include <unordered_map>
+
+namespace sd {
+
+typedef std::unordered_map< OUString, CustomAnimationEffectPtr > EffectsSubTypeMap;
+typedef std::unordered_map< OUString, OUString > UStringMap;
+
+class CustomAnimationPreset
+{
+ friend class CustomAnimationPresets;
+
+public:
+ CustomAnimationPreset( const CustomAnimationEffectPtr& pEffect );
+
+ void add( const CustomAnimationEffectPtr& pEffect );
+
+ SD_DLLPUBLIC css::uno::Reference< css::animations::XAnimationNode > create( const OUString& rstrSubType );
+
+ const OUString& getPresetId() const { return maPresetId; }
+ const OUString& getLabel() const { return maLabel; }
+ double getDuration() const { return mfDuration; }
+
+ std::vector<OUString> getSubTypes();
+ std::vector<OUString> getProperties() const;
+
+ bool hasProperty( std::u16string_view rProperty ) const;
+ bool isTextOnly() const { return mbIsTextOnly; }
+
+private:
+ OUString maPresetId;
+ OUString maProperty;
+ OUString maLabel;
+ OUString maDefaultSubTyp;
+ double mfDuration;
+ bool mbIsTextOnly;
+
+ EffectsSubTypeMap maSubTypes;
+};
+
+typedef std::shared_ptr< CustomAnimationPreset > CustomAnimationPresetPtr;
+typedef std::unordered_map<OUString, CustomAnimationPresetPtr> EffectDescriptorMap;
+typedef std::vector< CustomAnimationPresetPtr > EffectDescriptorList;
+
+struct PresetCategory
+{
+ OUString maLabel;
+ EffectDescriptorList maEffects;
+
+ PresetCategory( const OUString& rLabel, EffectDescriptorList&& rEffects )
+ : maLabel( rLabel ), maEffects( std::move(rEffects) ) {}
+};
+typedef std::shared_ptr< PresetCategory > PresetCategoryPtr;
+typedef std::vector< PresetCategoryPtr > PresetCategoryList;
+
+class SD_DLLPUBLIC CustomAnimationPresets final
+{
+public:
+ SAL_DLLPRIVATE CustomAnimationPresets();
+ SAL_DLLPRIVATE ~CustomAnimationPresets();
+
+ /** This method gets presets instance, which is localized
+ * for the current user's locale.
+ */
+ static const CustomAnimationPresets& getCustomAnimationPresets();
+
+ SAL_DLLPRIVATE css::uno::Reference< css::animations::XAnimationNode > getRandomPreset( sal_Int16 nPresetClass ) const;
+
+ CustomAnimationPresetPtr getEffectDescriptor( const OUString& rPresetId ) const;
+
+ SAL_DLLPRIVATE const OUString& getUINameForPresetId( const OUString& rPresetId ) const;
+ SAL_DLLPRIVATE const OUString& getUINameForProperty( const OUString& rProperty ) const;
+
+ SAL_DLLPRIVATE const PresetCategoryList& getEntrancePresets() const { return maEntrancePresets; }
+ SAL_DLLPRIVATE const PresetCategoryList& getEmphasisPresets() const { return maEmphasisPresets; }
+ SAL_DLLPRIVATE const PresetCategoryList& getExitPresets() const { return maExitPresets; }
+ SAL_DLLPRIVATE const PresetCategoryList& getMotionPathsPresets() const { return maMotionPathsPresets; }
+ SAL_DLLPRIVATE const PresetCategoryList& getMiscPresets() const { return maMiscPresets; }
+
+ SAL_DLLPRIVATE void changePresetSubType( const CustomAnimationEffectPtr& pEffect, const OUString& rPresetSubType ) const;
+
+private:
+ SAL_DLLPRIVATE void importEffects();
+ SAL_DLLPRIVATE void importResources();
+
+ SAL_DLLPRIVATE void importPresets( const css::uno::Reference< css::lang::XMultiServiceFactory >& xConfigProvider, const OUString& rNodePath, PresetCategoryList& rPresetMap );
+
+ SAL_DLLPRIVATE static const OUString& translateName( const OUString& rId, const UStringMap& rNameMap );
+
+private:
+ css::uno::Reference< css::animations::XAnimationNode > mxRootNode;
+ EffectDescriptorMap maEffectDescriptorMap;
+ UStringMap maEffectNameMap;
+ UStringMap maPropertyNameMap;
+
+ PresetCategoryList maEntrancePresets;
+ PresetCategoryList maEmphasisPresets;
+ PresetCategoryList maExitPresets;
+ PresetCategoryList maMotionPathsPresets;
+ PresetCategoryList maMiscPresets;
+
+ //! Maps per-language the animation presets.
+ SAL_DLLPRIVATE static std::map<OUString, CustomAnimationPresets> mPresetsMap;
+};
+
+
+css::uno::Reference< css::animations::XAnimationNode > implImportEffects( const css::uno::Reference< css::lang::XMultiServiceFactory >& xServiceFactory, const OUString& rPath );
+
+void implImportLabels( const css::uno::Reference< css::lang::XMultiServiceFactory >& xConfigProvider, const OUString& rNodePath, UStringMap& rStringMap );
+
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/DocumentRenderer.hrc b/sd/inc/DocumentRenderer.hrc
new file mode 100644
index 000000000..755fa5a66
--- /dev/null
+++ b/sd/inc/DocumentRenderer.hrc
@@ -0,0 +1,95 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <unotools/resmgr.hxx>
+
+#define NC_(Context, String) TranslateId(Context, reinterpret_cast<char const *>(u8##String))
+
+const TranslateId STR_IMPRESS_PRINT_UI_CONTENT_CHOICES[] =
+{
+ NC_("STR_IMPRESS_PRINT_UI_CONTENT_CHOICES", "Slides"),
+ NC_("STR_IMPRESS_PRINT_UI_CONTENT_CHOICES", "Handouts"),
+ NC_("STR_IMPRESS_PRINT_UI_CONTENT_CHOICES", "Notes"),
+ NC_("STR_IMPRESS_PRINT_UI_CONTENT_CHOICES", "Outline")
+};
+
+const TranslateId STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES[] =
+{
+ NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "According to layout"),
+ NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "1"),
+ NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "2"),
+ NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "3"),
+ NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "4"),
+ NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "6"),
+ NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES", "9")
+};
+
+const TranslateId STR_IMPRESS_PRINT_UI_ORDER_CHOICES[] =
+{
+ NC_("STR_IMPRESS_PRINT_UI_ORDER_CHOICES", "Left to right, then down"),
+ NC_("STR_IMPRESS_PRINT_UI_ORDER_CHOICES", "Top to bottom, then right")
+};
+
+const TranslateId STR_IMPRESS_PRINT_UI_QUALITY_CHOICES[] =
+{
+ NC_("STR_IMPRESS_PRINT_UI_QUALITY_CHOICES", "Original colors"),
+ NC_("STR_IMPRESS_PRINT_UI_QUALITY_CHOICES", "Grayscale"),
+ NC_("STR_IMPRESS_PRINT_UI_QUALITY_CHOICES", "Black & white")
+};
+
+const TranslateId STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES[] =
+{
+ NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES", "Original size"),
+ NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES", "Fit to printable page"),
+ NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES", "Distribute on multiple sheets of paper"),
+ NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES", "Tile sheet of paper with repeated slides")
+};
+
+const TranslateId STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW[] =
+{
+ NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW", "Original size"),
+ NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW", "Fit to printable page"),
+ NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW", "Distribute on multiple sheets of paper"),
+ NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW", "Tile sheet of paper with repeated pages")
+};
+
+const TranslateId STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE_LIST[] =
+{
+ NC_("STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE_LIST", "All pages"),
+ NC_("STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE_LIST", "Front sides / right pages"),
+ NC_("STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE_LIST", "Back sides / left pages")
+};
+
+const TranslateId STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE[] =
+{
+ NC_("STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE", "All ~Slides"),
+ NC_("STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE", "S~lides:"),
+ NC_("STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE", "~Selection")
+};
+
+const TranslateId STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE[] =
+{
+ NC_("STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE", "All ~Pages"),
+ NC_("STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE", "~Pages:"),
+ NC_("STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE", "~Selection")
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/EffectMigration.hxx b/sd/inc/EffectMigration.hxx
new file mode 100644
index 000000000..e6e5f9fac
--- /dev/null
+++ b/sd/inc/EffectMigration.hxx
@@ -0,0 +1,75 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/presentation/AnimationEffect.hpp>
+#include <com/sun/star/presentation/AnimationSpeed.hpp>
+#include <com/sun/star/presentation/FadeEffect.hpp>
+
+class SdDrawDocument;
+class SdPage;
+class SvxShape;
+class SdAnimationInfo;
+class SdrPathObj;
+class SdrObjGroup;
+
+namespace sd {
+
+/** this helper class gives various methods to convert effects from OOo 1.1
+ and below to and from OOo 2.0 and above
+*/
+class EffectMigration
+{
+public:
+ static css::presentation::AnimationSpeed ConvertDuration( double fDuration );
+ static double ConvertAnimationSpeed( css::presentation::AnimationSpeed eSpeed );
+
+ static bool ConvertPreset( std::u16string_view rPresetId, const OUString* pPresetSubType, css::presentation::AnimationEffect& rEffect );
+ static bool ConvertAnimationEffect( const css::presentation::AnimationEffect& rEffect, OUString& rPresetId, OUString& rPresetSubType );
+
+ static void SetFadeEffect( SdPage* pPage, css::presentation::FadeEffect eNewEffect);
+ static css::presentation::FadeEffect GetFadeEffect( const SdPage* pPage );
+
+ static void SetAnimationEffect( SvxShape* pShape, css::presentation::AnimationEffect eValue );
+ static css::presentation::AnimationEffect GetAnimationEffect( SvxShape* pShape );
+ static void SetTextAnimationEffect( SvxShape* pShape, css::presentation::AnimationEffect eValue );
+ static css::presentation::AnimationEffect GetTextAnimationEffect( SvxShape* pShape );
+ static void SetAnimationSpeed( SvxShape* pShape, css::presentation::AnimationSpeed eSpeed );
+ static css::presentation::AnimationSpeed GetAnimationSpeed( SvxShape* pShape );
+ static void SetDimColor( SvxShape* pShape, sal_Int32 nColor );
+ static sal_Int32 GetDimColor( SvxShape* pShape );
+ static void SetDimHide( SvxShape* pShape, bool bDimHide );
+ static bool GetDimHide( SvxShape* pShape );
+ static void SetDimPrevious( SvxShape* pShape, bool bDimPrevious );
+ static bool GetDimPrevious( SvxShape* pShape );
+ static void SetPresentationOrder( SvxShape* pShape, sal_Int32 nNewPos );
+ static sal_Int32 GetPresentationOrder( SvxShape* pShape );
+ static void UpdateSoundEffect( SvxShape* pShape, SdAnimationInfo const * pInfo );
+ static OUString GetSoundFile( SvxShape* pShape );
+ static bool GetSoundOn( SvxShape* pShape );
+
+ static void SetAnimationPath( SvxShape* pShape, SdrPathObj const * pPathObj );
+ static void CreateAnimatedGroup(SdrObjGroup const & rGroupObj, SdPage& rPage);
+ static void DocumentLoaded(SdDrawDocument & rDoc);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/FactoryIds.hxx b/sd/inc/FactoryIds.hxx
new file mode 100644
index 000000000..cc257b20a
--- /dev/null
+++ b/sd/inc/FactoryIds.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/shell.hxx>
+
+namespace sd {
+
+/** This are ids used by SfxTopFrame::Create() or CreateViewFrame() to
+ select a factory to create an instance of an SfxViewShell super
+ class. This allows the caller to create a view shell directly
+ with a certain view instead of first create a default view and
+ then switch to the desired view.
+*/
+constexpr auto IMPRESS_FACTORY_ID = SfxInterfaceId(1);
+constexpr auto DRAW_FACTORY_ID = SfxInterfaceId(1);
+constexpr auto SLIDE_SORTER_FACTORY_ID = SfxInterfaceId(2);
+constexpr auto OUTLINE_FACTORY_ID = SfxInterfaceId(3);
+constexpr auto PRESENTATION_FACTORY_ID = SfxInterfaceId(4);
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/Outliner.hxx b/sd/inc/Outliner.hxx
new file mode 100644
index 000000000..4a7100db3
--- /dev/null
+++ b/sd/inc/Outliner.hxx
@@ -0,0 +1,534 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svx/svdoutl.hxx>
+#include "pres.hxx"
+#include "OutlinerIterator.hxx"
+#include <editeng/SpellPortions.hxx>
+#include <memory>
+
+class SdrObject;
+class SdrTextObj;
+class SdDrawDocument;
+
+namespace weld
+{
+class Window;
+}
+
+namespace sd
+{
+class View;
+class ViewShell;
+class Window;
+
+/// Describes a single search hit: a set of rectangles on a given page.
+struct SearchSelection
+{
+ /// 0-based index of the page that has the selection.
+ int m_nPage;
+
+ /**
+ * List of selection rectangles in twips -- multiple rectangles only in
+ * case the selection spans over more layout lines.
+ */
+ OString m_aRectangles;
+
+ SearchSelection(int nPage, const OString& rRectangles)
+ : m_nPage(nPage)
+ , m_aRectangles(rRectangles)
+ {
+ }
+
+ bool operator==(const SearchSelection& rOther) const
+ {
+ return m_nPage == rOther.m_nPage && m_aRectangles == rOther.m_aRectangles;
+ }
+};
+
+} // end of namespace sd
+
+/** The main purpose of this class is searching and replacing as well as
+ spelling of impress documents. The main part of both tasks lies in
+ iterating over the pages and view modes of a document and apply the
+ respective function to all objects containing text on those pages.
+
+ <p>Relevant objects: There are two sets of objects to search/spell
+ check. One is the set of all selected objects. The other consists of
+ all objects on all pages in draw-, notes-, and handout view as well as
+ slide- and background view (draw pages and master pages).</p>
+
+ <p>Iteration: Search/replace and spelling functions operate on shapes
+ containing text. To cover all relevant objects an order has to be
+ defined on the objects. For the set of all selected objects this order
+ is simply the order in which they can be retrieved from the selection
+ object.<br>
+ When there is no selection the order is nested. The three modes of the
+ draw view are on the outer level: draw mode, notes mode, handout mode.
+ The inner level switches between draw pages and master pages. This
+ leads to the following order:
+ <ol>
+ <li>draw pages of draw mode</li>
+ <li>master pages of draw mode</li>
+ <li>draw pages of notes mode</li>
+ <li>master pages of notes mode</li>
+ <li>draw pages of handout mode</li>
+ <li>master pages of handout mode</li>
+ </ol>
+ Iteration starts at the top of the current page. When reaching the end
+ of the document, i.e. the last master page of the handout mode, it jumps
+ to the first draw page of draw mode. In backward searches this order is
+ reversed. When doing a <em>replace all</em> then the whole document is
+ searched for matches starting at the first page of the draw/slide view
+ (or last page of handout/background view even though search
+ direction).</p>
+
+ <p>The start position is restored after finishing spell checking or
+ replacing all matches in a document.</p>
+
+ <p>Some related pieces of information:
+ The search dialog (<type>SvxSearchDialog</type>) can be controlled in
+ more than one way:
+ <ul><li>A set of option flags returned by the slot call
+ SID_SEARCH_OPTIONS handled by the
+ <member>SdDrawDocument::GetState()</member> method.</li>
+ <li>The contents of the search item of type
+ <type>SvxSearchItem</type>.</li>
+ <li>The <member>HasSelection()</member> view shell method that returns
+ whether or not a selection exists. However, it is called from the
+ search dialog with an argument so that only text selections are
+ queried. This is only sufficient for searching the outline view.
+ </p>
+*/
+class SdOutliner final : public SdrOutliner
+{
+public:
+ friend class ::sd::outliner::OutlinerContainer;
+
+ /** Create a new sd outliner object.
+ @param pDoc
+ The draw document from which to take the content.
+ @param nMode
+ The valid values <const>OutlinerMode::DontKnow</const>,
+ <const>OutlinerMode::TextObject</const>,
+ <const>OutlinerMode::TitleObject</const>,
+ <const>OutlinerMode::OutlineObject</const>, and
+ <const>OutlinerMode::OutlineView</const> are defined in
+ editeng/outliner.hxx.
+ */
+ SdOutliner(SdDrawDocument* pDoc, OutlinerMode nMode);
+ virtual ~SdOutliner() override;
+ /// Forbid copy construction and copy assignment
+ SdOutliner(const Outliner&) = delete;
+ SdOutliner& operator=(const Outliner&) = delete;
+
+ /** Despite the name this method is called prior to spell checking *and*
+ searching and replacing. The position of current view
+ mode/page/object/caret position is remembered and, depending on the
+ search mode, may be restored after finishing searching/spell
+ checking.
+ */
+ void PrepareSpelling();
+
+ /** Initialize a spell check but do not start it yet. This method
+ is a better candidate for the name PrepareSpelling.
+ */
+ void StartSpelling();
+
+ /** Initiate a find and/or replace on the next relevant text object.
+ @return
+ Returns </sal_True> when the search/replace is finished (as
+ indicated by user input to the search dialog). A </sal_False> value
+ indicates that another call to this method is required.
+ */
+ bool StartSearchAndReplace(const SvxSearchItem* pSearchItem);
+
+ /** Iterate over the sentences in all text shapes and stop at the
+ next sentence with spelling errors. While doing so the view
+ mode may be changed and text shapes are set into edit mode.
+ */
+ svx::SpellPortions GetNextSpellSentence();
+
+ /** Release all resources that have been created during the find&replace
+ or spell check.
+ */
+ void EndSpelling();
+
+ /** callback for textconversion */
+ bool ConvertNextDocument() override;
+
+ /** Starts the text conversion (hangul/hanja or Chinese simplified/traditional)
+ for the current viewshell */
+ void StartConversion(LanguageType nSourceLanguage, LanguageType nTargetLanguage,
+ const vcl::Font* pTargetFont, sal_Int32 nOptions, bool bIsInteractive);
+
+ /** This is called internally when text conversion is started.
+ The position of current view mode/page/object/caret position
+ is remembered and will be restored after conversion.
+ */
+ void BeginConversion();
+
+ /** Release all resources that have been created during the conversion */
+ void EndConversion();
+
+ int GetIgnoreCurrentPageChangesLevel() const { return mnIgnoreCurrentPageChangesLevel; };
+ void IncreIgnoreCurrentPageChangesLevel() { mnIgnoreCurrentPageChangesLevel++; };
+ void DecreIgnoreCurrentPageChangesLevel() { mnIgnoreCurrentPageChangesLevel--; };
+ SdDrawDocument* GetDoc() const { return mpDrawDocument; }
+
+private:
+ class Implementation;
+ ::std::unique_ptr<Implementation> mpImpl;
+
+ /// Returns the current outline view
+ OutlinerView* getOutlinerView();
+
+ /// Specifies whether to search and replace, to spell check or to do a
+ /// text conversion.
+ enum mode
+ {
+ SEARCH,
+ SPELL,
+ TEXT_CONVERSION
+ } meMode;
+
+ /// The view which displays the searched objects.
+ ::sd::View* mpView;
+ /** The view shell containing the view. It is held as weak
+ pointer to avoid keeping it alive when the view is changed
+ during searching.
+ */
+ std::weak_ptr<::sd::ViewShell> mpWeakViewShell;
+ /// This window contains the view.
+ VclPtr<::sd::Window> mpWindow;
+ /// The document on whose objects and pages this class operates.
+ SdDrawDocument* mpDrawDocument;
+
+ /** this is the language that is used for current text conversion.
+ Only valid if meMode is TEXT_CONVERSION.
+ */
+ LanguageType mnConversionLanguage;
+
+ /** While the value of this flag is greater than 0 changes of the current page
+ do not lead to selecting the corresponding text in the outliner.
+ */
+ int mnIgnoreCurrentPageChangesLevel;
+
+ /// Specifies whether the search string has been found so far.
+ bool mbStringFound;
+
+ /** This flag indicates whether there may exist a match of the search
+ string before/after the current position in the document. It can be
+ set to </sal_False> only when starting from the beginning/end of the
+ document. When reaching the end/beginning with it still be set to
+ </sal_False> then there exists no match and the search can be terminated.
+ */
+ bool mbMatchMayExist;
+
+ /// The number of pages in the current view.
+ sal_uInt16 mnPageCount;
+
+ /** A <TRUE/> value indicates that the end of the find&replace or spell
+ check has been reached.
+ */
+ bool mbEndOfSearch;
+
+ /** Set to <TRUE/> when an object has been prepared successfully for
+ searching/spell checking. This flag directs the internal iteration
+ which stops when set to </sal_True>.
+ */
+ bool mbFoundObject;
+
+ /** This flag indicates whether to search forward or backwards.
+ */
+ bool mbDirectionIsForward;
+
+ /** This flag indicates that only the selected objects are to be
+ searched.
+ */
+ bool mbRestrictSearchToSelection;
+
+ /** When the search is restricted to the current selection then
+ this list contains pointers to all the objects of the
+ selection. This copy is necessary because during the search
+ process the mark list is modified.
+ */
+ ::std::vector<tools::WeakReference<SdrObject>> maMarkListCopy;
+
+ /** Current object that may be a text object. The object pointer to
+ corresponds to <member>mnObjIndex</member>. While iterating over the
+ objects on a page <member>mpObj</member> will point to every object
+ while <member>mpTextObj</member> will be set only to valid text
+ objects.
+ */
+ SdrObject* mpObj;
+
+ /** this stores the first object that is used for text conversion.
+ Conversion automatically wraps around the document and stops when it
+ finds this object again.
+ */
+ SdrObject* mpFirstObj;
+
+ /// Candidate for being searched/spell checked.
+ SdrTextObj* mpSearchSpellTextObj;
+
+ /// Current text to be searched/spelled inside the current text object
+ sal_Int32 mnText;
+
+ /// Paragraph object of <member>mpTextObj</member>.
+ OutlinerParaObject* mpParaObj;
+
+ /// The view mode that was active when starting to search/spell check.
+ PageKind meStartViewMode;
+
+ /// The master page mode that was active when starting to search/spell check.
+ EditMode meStartEditMode;
+
+ /// The current page index on starting to search/spell check.
+ sal_uInt16 mnStartPageIndex;
+
+ /// The object in edit mode when searching /spell checking was started
+ /// (if any).
+ SdrObject* mpStartEditedObject;
+
+ /// The position of the caret when searching /spell checking was started.
+ ESelection maStartSelection;
+
+ /** The search item contains various attributes that define the type of
+ search. It is set every time the
+ <member>SearchAndReplaceAll</member> method is called.
+ */
+ std::unique_ptr<const SvxSearchItem> mpSearchItem;
+
+ /// The actual object iterator.
+ ::sd::outliner::Iterator maObjectIterator;
+ /// The current position of the object iterator.
+ ::sd::outliner::IteratorPosition maCurrentPosition;
+ /// The position when the search started. Corresponds largely to the
+ /// m?Start* members.
+ ::sd::outliner::Iterator maSearchStartPosition;
+ /** The last valid position describes where the last text object has been
+ found. This position is restored when some dialogs are shown. The
+ position is initially set to the where the search begins.
+ */
+ ::sd::outliner::IteratorPosition maLastValidPosition;
+
+ /** When this flag is true then a PrepareSpelling() is executed when
+ StartSearchAndReplace() is called the next time.
+ */
+ bool mbPrepareSpellingPending;
+
+ /** Initialize the object iterator. Call this method after being
+ invoked from the search or spellcheck dialog. It creates a new
+ iterator pointing at the current object when this has not been done
+ before. It reverses the direction of iteration if the given flag
+ differs from the current direction.
+ @param bDirectionIsForward
+ This flag specifies in which direction to iterator over the
+ objects. If it differs from the current direction the iterator
+ is reversed.
+ */
+ void Initialize(bool bDirectionIsForward);
+
+ /** Do search and replace for whole document.
+ */
+ bool SearchAndReplaceAll();
+
+ /** Do search and replace for next match.
+ @param pSelections
+ When tiled rendering and not 0, then don't emit LOK events, instead
+ assume the caller will do so.
+ @return
+ The return value specifies whether the search ended (</sal_True>) or
+ another call to this method is required (</sal_False>).
+ */
+ bool SearchAndReplaceOnce(std::vector<::sd::SearchSelection>* pSelections = nullptr);
+
+ void sendLOKSearchResultCallback(const std::shared_ptr<sd::ViewShell>& pViewShell,
+ const OutlinerView* pOutlinerView,
+ std::vector<sd::SearchSelection>* pSelections);
+
+ /** Detect changes of the document or view and react accordingly. Such
+ changes may occur because different calls to
+ <member>SearchAndReplace()</member> there usually is user
+ interaction. This is at least the press of the search or replace
+ button but may include any other action some of which affect the
+ search.
+ */
+ void DetectChange();
+
+ /** Detect whether the selection has changed.
+ @return
+ Return <TRUE/> when the selection has been changed since the
+ last call to this method.
+ */
+ bool DetectSelectionChange();
+
+ /** Remember the current edited object/caret position/page/view mode
+ when starting to search/spell check so that it can be restored on
+ termination.
+ */
+ void RememberStartPosition();
+
+ /** Restore the position stored in the last call of
+ <member>RememberStartPositiony</member>.
+ */
+ void RestoreStartPosition();
+
+ /** Provide next object to search or spell check as text object in edit
+ mode on the current page. This skips all objects that do not
+ match or are no text object.
+ */
+ void ProvideNextTextObject();
+
+ /** Handle the situation that the iterator has reached the last object.
+ This may result in setting the <member>mbEndOfSearch</member> flag
+ back to </sal_False>. This method may show either the end-of-search
+ dialog or the wrap-around dialog.
+ */
+ void EndOfSearch();
+
+ /** Show a dialog that tells the user that the search has ended either
+ because there are no more matches after finding at least one or that
+ no match has been found at all.
+ */
+ void ShowEndOfSearchDialog();
+
+ /** Show a dialog that asks the user whether to wrap around to the
+ beginning/end of the document and continue with the search/spell
+ check.
+ */
+ bool ShowWrapAroundDialog();
+
+ /** Put text of current text object into outliner so that the text can
+ be searched/spell checked.
+ */
+ void PutTextIntoOutliner();
+
+ /** Prepare to do spell checking on the current text object. This
+ includes putting it into edit mode. Under certain conditions this
+ method sets <member>mbEndOfSearch</member> to <TRUE/>.
+ */
+ void PrepareSpellCheck();
+
+ /** Prepare to search and replace on the current text object. This
+ includes putting it into edit mode.
+ */
+ void PrepareSearchAndReplace();
+
+ /** Prepare to do a text conversion on the current text
+ object. This includes putting it into edit mode.
+ */
+ void PrepareConversion();
+
+ /** Switch to a new view mode. Try to restore the original edit mode
+ before doing so.
+ @param ePageKind
+ Specifies the new view mode.
+ */
+ void SetViewMode(PageKind ePageKind);
+
+ /** Switch to the page or master page specified by the
+ <member>mnPage</member> index. Master page mode is specified by
+ <member>meEditMode</member>.
+ @param eEditMode
+ The new edit mode.
+ @param nPageIndex
+ The new page index.
+ */
+ void SetPage(EditMode eEditMode, sal_uInt16 nPageIndex);
+
+ /** Switch on edit mode for the currently selected text object.
+ */
+ void EnterEditMode(bool bGrabFocus);
+
+ /** Return the position at which a new search is started with respect to
+ the search direction as specified by the argument.
+ @return
+ The position mentioned above in form of a selection with start
+ equals end.
+ */
+ ESelection GetSearchStartPosition() const;
+
+ /** Detect whether there exists a previous match. Note that only the
+ absence of such a match can be detected reliably. An existing match
+ is assumed when the search started not at the beginning/end of the
+ presentation. This does not have to be true. The user can have set
+ the cursor at the middle of the text without a prior search.
+ @return
+ Returns </True> when there is no previous match and </False>
+ when there may be one.
+ */
+ bool HasNoPreviousMatch();
+
+ /** Handle a failed search (with or without replace) for the outline
+ mode. Show message boxes when the search failed completely,
+ i.e. there is no match in the whole presentation, or when no further
+ match exists.
+ @return
+ The returned value indicates whether another (wrapped around)
+ search shall take place. If that is so, then it is the caller's
+ responsibility to set the cursor position accordingly.
+ */
+ bool HandleFailedSearch();
+
+ /** Take a position as returned by an object iterator and switch to the
+ view and page on which the object specified by this position is
+ located.
+ @param rPosition
+ This position points to a <type>SdrObject</type> object and
+ contains the view and page where it is located.
+ @return
+ Return a pointer to the <type>SdrObject</type>.
+ */
+ SdrObject* SetObject(const ::sd::outliner::IteratorPosition& rPosition);
+
+ /** Use this method when the view shell in which to search has changed.
+ It handles i.e. registering at the associated view as selection
+ change listener.
+ */
+ void SetViewShell(const std::shared_ptr<::sd::ViewShell>& rpViewShell);
+
+ /** Activate or deactivate the search in the current selection. Call
+ this method whenever the selection has changed. This method creates
+ a copy of the current selection and reassigns the object iterator to
+ the current() iterator.
+ */
+ void HandleChangedSelection();
+
+ /** Initiate the spell check of the next relevant text object.
+ When the outline view is active then this method is called
+ after a wrap around to continue at the beginning of the document.
+ @return
+ Returns <TRUE/> to indicate that another call to this method is
+ required. When all text objects have been processed then
+ <FALSE/> is returned.
+ */
+ virtual bool SpellNextDocument() override;
+
+ /** Find the right parent to use for a message. This function makes sure
+ that the otherwise non-modal search or spell dialogs, if visible, are
+ locked, too.
+ */
+ weld::Window* GetMessageBoxParent();
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/OutlinerIterator.hxx b/sd/inc/OutlinerIterator.hxx
new file mode 100644
index 000000000..d160609d8
--- /dev/null
+++ b/sd/inc/OutlinerIterator.hxx
@@ -0,0 +1,314 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svx/svdobj.hxx>
+
+#include "pres.hxx"
+#include <sal/types.h>
+#include <memory>
+#include <vector>
+
+class SdDrawDocument;
+class SdOutliner;
+
+namespace sd {
+
+class ViewShell;
+
+namespace outliner {
+
+class IteratorImplBase;
+class IteratorPosition;
+
+/** Use this enum to specify the initial location of the object pointed to by
+ a newly created iterator. The values are
+ <ul><li><const>BEGIN</const> for the first object with reference to
+ iteration direction.</li>
+ <li>END for one past the last valid object or, if the iterator is a
+ backward iterator, the object in front of the first valid one.</li>
+ <li>CURRENT for the current object. Because there is only a current
+ page this usually is taken to be the first/last object on the current
+ page.</li></ul>
+*/
+enum IteratorLocation {BEGIN,END,CURRENT};
+
+/** This iterator can be used to iterate over all <type>SdrObject</type>
+ objects of one of three set denoted by the <type>IteratorType</type>:
+ <ul><li>All objects of the current mark list (selection)
+ (type==SELECTION).</li>
+ <li>All objects in the current view (type==SINGLE_VIEW).</li>
+ <li>All objects in all views (type=DOCUMENT).</li></ul>
+
+ <p>Note that the iterator does not change pages or views. It is the
+ task of the user of the iterator to take the information provided by the
+ <type>IteratorPosition</type> as returned by the
+ <member>operator*()</member> method and set view, visible page, and
+ selection/edit mode markers to reflect this position.</p>
+
+ <p>A simple forward iteration from the first to the last object would
+ instantiate the iterator with
+ <code>Iterator(pDocument,pViewShell,true,BEGIN)</code> for some document
+ and view shell. This iterator can then be compared against
+ <code>Iterator(pDocument,pViewShell,true,END)</code>. On equality the
+ iteration should be stopped without evaluating the iterator: The position
+ of an end iterator is not valid.</p>
+*/
+class Iterator
+{
+public:
+ Iterator();
+
+ /** The copy constructor creates a new iterator by copying the
+ implementation object.
+ */
+ Iterator (const Iterator& rIterator);
+ Iterator(Iterator&& rIterator) noexcept;
+
+ /** Create a new iterator with the implementation object being the
+ provided one.
+ @param pObject
+ A copy of this object will become the implementation object.
+ */
+ explicit Iterator (std::unique_ptr<IteratorImplBase> pObject);
+
+ ~Iterator();
+
+ /** Assign the iterator from the given one. The implementation object
+ of this iterator will be a copy of the given iterator.
+ @param rIterator
+ The iterator which to assign from.
+ */
+ Iterator& operator= (const Iterator& rIterator);
+ Iterator& operator=(Iterator&& rIterator) noexcept;
+
+ /** Return the current position of the iterator.
+ @return
+ Returns a reference to the current position. Therefore this
+ method is not thread safe. The reason for this behaviour is, of
+ course, to omit the copying of the returned position.
+ */
+ const IteratorPosition& operator* () const;
+ /** The prefix increment operator returns the iterator pointing to the
+ next object. When in doubt prefer this operator over the postfix
+ increment operator.
+ @return
+ Returns a reference to this iterator pointing to the next object.
+ */
+ Iterator& operator++ ();
+ /** Test equality of two iterators. Two iterators are taken to be equal
+ when they point are of the same type (their implementation objects
+ are instances of the same class) and point to the same object.
+ @param rIterator
+ The iterator to test equality with.
+ @return
+ Returns <TRUE/> when both iterators point to the same object.
+ */
+ bool operator== (const Iterator& rIterator) const;
+ /** Test whether two iterators point to different objects. This is just
+ the negation of the result of the equality operator.
+ @param rIterator
+ The iterator to test inequality with.
+ @return
+ Returns <TRUE/> when both iterators point to the different objects.
+ */
+ bool operator!= (const Iterator& rIterator) const;
+ /** Reverse the direction of iteration. The position of the iterator is
+ not changed. Thus calling this method twice returns to the old state.
+ */
+ void Reverse();
+
+private:
+ /// The implementation object to which most of the methods are forwarded.
+ std::unique_ptr<IteratorImplBase> mxIterator;
+};
+
+/** This class wraps the <type>SdOutliner</type> class and represents it as
+ a container of <type>SdrObject</type> objects. Its main purpose is to
+ provide iterators for certain sub-sets of those objects. These sub-sets
+ are a) the set of the currently selected objects, b) all objects in the
+ current view, and c) all objects in all views.
+
+ <p>The direction of the returned iterators depends on the underlying
+ <type>SdOutliner</type> object and is usually set in the search
+ dialog.</p>
+*/
+class OutlinerContainer
+{
+public:
+ /** Create a new wrapper object for the given outliner.
+ @param pOutliner
+ The outliner that is represented by the new object as
+ <type>SdrObject</type> container.
+ */
+ OutlinerContainer (SdOutliner* pOutliner);
+
+ /** Return an iterator that points to the first object of one of the
+ sets described above. This takes also into account the direction of
+ iteration.
+ @return
+ The returned iterator points either to the first (forward
+ search) or to the last object (backward search) of the set.
+ */
+ Iterator begin();
+
+ /** Return an iterator that marks the end of the iteration. This takes
+ also into account the direction of iteration. The object pointed to
+ is not valid.
+ @return
+ The returned iterator points either to that object past the last
+ one (forward search) or to the one in front of the first
+ (backward search).
+ */
+ Iterator end();
+
+ /** Return an iterator that points to the current object of one of the
+ sets described above. This takes also into account the direction of
+ iteration.
+ @return
+ The returned iterator points either to the first (forward
+ search) or to the last object (backward search) of the set of
+ selected objects or of the current page if the search set spans
+ more than one page.
+ */
+ Iterator current();
+
+private:
+ /// The wrapped outliner that is represented as object container.
+ SdOutliner* mpOutliner;
+
+ /** Create an iterator. The object pointed to depends on the search
+ direction retrieved from the outliner object
+ <member>mpOutliner</member> and the given location.
+ @param aLocation
+ This specifies whether the returned iterator points to the
+ first, (one past the) last, or current object.
+ @return
+ Returns an iterator as constructed by
+ <member>CreateSelectionIterator()</member>,
+ */
+ Iterator CreateIterator (IteratorLocation aLocation);
+
+ /** Create an iterator that iterates over all currently selected
+ <type>SdrObjects</type> objects of the <member>mpOutliner</member>
+ outliner.
+ @param rObjectList
+ List of currently selected objects. This list is necessary
+ so that the selection can be changed without affecting the
+ iterator.
+ @param pDocument
+ The document to which the objects belong.
+ @param pViewShell
+ The view shell which displays the objects.
+ @param bDirectionIsForward
+ The direction of iteration. It defaults to forward.
+ @param aLocation
+ This specifies at which object the iterator points initially.
+ */
+ static Iterator CreateSelectionIterator (
+ const ::std::vector<::tools::WeakReference<SdrObject>>& rObjectList,
+ SdDrawDocument* pDocument,
+ const std::shared_ptr<ViewShell>& rpViewShell,
+ bool bDirectionIsForward,
+ IteratorLocation aLocation);
+
+ /** Create an iterator that iterates over all <type>SdrObjects</type>
+ objects of the <member>mpOutliner</member> outliner.
+ @param pDocument
+ The document to which the objects belong.
+ @param pViewShell
+ The view shell which displays the objects.
+ @param bDirectionIsForward
+ The direction of iteration. It defaults to forward.
+ @param aLocation
+ This specifies at which object the iterator points initially.
+ */
+ static Iterator CreateDocumentIterator (
+ SdDrawDocument* pDocument,
+ const std::shared_ptr<ViewShell>& rpViewShell,
+ bool bDirectionIsForward,
+ IteratorLocation aLocation);
+
+ /** Return the index of a page that contains an object that a new
+ iterator shall point to. This page index depends primarily on the
+ location, iteration direction, as well as on edit mode and page
+ kind.
+ @param pDocument
+ The document to which the page belongs.
+ @param pViewShell
+ The view shell which displays the page.
+ @param ePageKind
+ Specifies the view the page belongs to.
+ @param eEditMode
+ Specifies whether the page is a master page.
+ @param bDirectionIsForward
+ The direction of iteration.
+ @param aLocation
+ This specifies at which object the iterator points initially.
+ */
+ static sal_Int32 GetPageIndex (
+ SdDrawDocument const * pDocument,
+ const std::shared_ptr<ViewShell>& rpViewShell,
+ PageKind ePageKind,
+ EditMode eEditMode,
+ bool bDirectionIsForward,
+ IteratorLocation aLocation);
+
+ // Do not allow default constructor and copying of outliner containers.
+ OutlinerContainer (const OutlinerContainer&) = delete;
+ OutlinerContainer& operator= (const OutlinerContainer&) = delete;
+};
+
+/** Data collection specifying a <type>SdrObject</type> and its position in
+ a document and view.
+*/
+class IteratorPosition
+{
+public:
+ /** Create a new object with all data members set to default values.
+ These values should not be accessed. The only use of the object as
+ it is as a marker in comparisons.
+ */
+ IteratorPosition();
+
+ /** Compare two positions for equality.
+ @return
+ <TRUE/> is returned only when all data members have the same
+ values in both position objects.
+ */
+ bool operator== (const IteratorPosition& aPosition) const;
+
+ /// Pointer to the actual <type>SdrObject</type> object.
+ ::tools::WeakReference<SdrObject> mxObject;
+
+ /// Number of the actual SdrText from the current <type>SdrObject</type>
+ sal_Int32 mnText;
+
+ /// The index of a page where the object is located on.
+ sal_Int32 mnPageIndex;
+ /// Page kind of the view.
+ PageKind mePageKind;
+ /// Edit mode of the view.
+ EditMode meEditMode;
+};
+
+} } // end of namespace ::sd::outliner
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/SdShapeTypes.hxx b/sd/inc/SdShapeTypes.hxx
new file mode 100644
index 000000000..ef944e593
--- /dev/null
+++ b/sd/inc/SdShapeTypes.hxx
@@ -0,0 +1,51 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+namespace accessibility
+{
+/** Register the SD presentation shape types with the ShapeTypeHandler singleton.
+ This method is usually called while loading the sd library.
+*/
+void RegisterImpressShapeTypes();
+
+/** Enum describing all shape types known in the SD project.
+*/
+enum SdShapeTypes
+{
+ PRESENTATION_OUTLINER,
+ PRESENTATION_SUBTITLE,
+ PRESENTATION_GRAPHIC_OBJECT,
+ PRESENTATION_PAGE,
+ PRESENTATION_OLE,
+ PRESENTATION_CHART,
+ PRESENTATION_TABLE,
+ PRESENTATION_NOTES,
+ PRESENTATION_TITLE,
+ PRESENTATION_HANDOUT,
+ PRESENTATION_HEADER,
+ PRESENTATION_FOOTER,
+ PRESENTATION_DATETIME,
+ PRESENTATION_PAGENUMBER
+};
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/TransitionPreset.hxx b/sd/inc/TransitionPreset.hxx
new file mode 100644
index 000000000..0075e3205
--- /dev/null
+++ b/sd/inc/TransitionPreset.hxx
@@ -0,0 +1,78 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+
+#include <vector>
+#include <map>
+#include <memory>
+#include <unordered_map>
+
+namespace com::sun::star {
+ namespace animations { class XAnimationNode; }
+ namespace uno { template<class X> class Reference; }
+}
+
+namespace sd {
+
+class TransitionPreset;
+typedef std::shared_ptr< TransitionPreset > TransitionPresetPtr;
+typedef std::vector< TransitionPresetPtr > TransitionPresetList;
+typedef std::unordered_map< OUString, OUString > UStringMap;
+
+class TransitionPreset
+{
+public:
+ static const TransitionPresetList& getTransitionPresetList();
+
+ sal_Int16 getTransition() const { return mnTransition; }
+ sal_Int16 getSubtype() const { return mnSubtype; }
+ bool getDirection() const { return mbDirection; }
+ sal_Int32 getFadeColor() const { return mnFadeColor; }
+
+ const OUString& getPresetId() const { return maPresetId; }
+ const OUString& getSetId() const { return maSetId; }
+ const OUString& getSetLabel() const { return maSetLabel; }
+ const OUString& getVariantLabel() const { return maVariantLabel; }
+
+private:
+ TransitionPreset( const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+
+ static bool importTransitionPresetList(TransitionPresetList& rList);
+ static std::map<OUString, TransitionPresetList> mPresetsMap;
+
+ sal_Int16 mnTransition;
+ sal_Int16 mnSubtype;
+ bool mbDirection;
+ sal_Int32 mnFadeColor;
+ OUString maPresetId;
+ OUString maSetId;
+ OUString maSetLabel;
+ OUString maVariantLabel;
+
+ static bool importTransitionsFile( TransitionPresetList& rList,
+ css::uno::Reference< css::lang::XMultiServiceFactory > const & xServiceFactory,
+ const OUString& aFilename );
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/VectorGraphicSearchContext.hxx b/sd/inc/VectorGraphicSearchContext.hxx
new file mode 100644
index 000000000..e6f978ca2
--- /dev/null
+++ b/sd/inc/VectorGraphicSearchContext.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/.
+ *
+ */
+
+#pragma once
+
+#include <vcl/VectorGraphicSearch.hxx>
+
+namespace sd
+{
+struct VectorGraphicSearchContext
+{
+ bool mbCurrentIsVectorGraphic;
+ std::unique_ptr<VectorGraphicSearch> mpVectorGraphicSearch;
+
+ VectorGraphicSearchContext()
+ : mbCurrentIsVectorGraphic(false)
+ {
+ }
+
+ void reset()
+ {
+ mbCurrentIsVectorGraphic = false;
+ mpVectorGraphicSearch.reset();
+ }
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/animations.hxx b/sd/inc/animations.hxx
new file mode 100644
index 000000000..cb7863473
--- /dev/null
+++ b/sd/inc/animations.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "sddllapi.h"
+
+#include <com/sun/star/uno/Reference.hxx>
+
+namespace com::sun::star::animations { class XAnimationNode; }
+
+namespace sd
+{
+
+/** stores the link between an after effect node and its master for later insertion
+ into the timing hierarchy
+*/
+struct AfterEffectNode
+{
+ css::uno::Reference< css::animations::XAnimationNode > mxNode;
+ css::uno::Reference< css::animations::XAnimationNode > mxMaster;
+ bool mbOnNextEffect;
+
+ AfterEffectNode( const css::uno::Reference< css::animations::XAnimationNode >& xNode, const css::uno::Reference< css::animations::XAnimationNode >& xMaster, bool bOnNextEffect )
+ : mxNode( xNode ), mxMaster( xMaster ), mbOnNextEffect( bOnNextEffect ) {}
+};
+
+/** inserts the animation node in the given AfterEffectNode at the correct position
+ in the timing hierarchy of its master */
+SD_DLLPUBLIC void stl_process_after_effect_node_func(AfterEffectNode const & rNode);
+
+} // namespace sd;
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/anminfo.hxx b/sd/inc/anminfo.hxx
new file mode 100644
index 000000000..8abc54c90
--- /dev/null
+++ b/sd/inc/anminfo.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/presentation/AnimationEffect.hpp>
+#include <com/sun/star/presentation/AnimationSpeed.hpp>
+#include <com/sun/star/presentation/ClickAction.hpp>
+#include "pres.hxx"
+#include <svx/svdobj.hxx>
+#include <tools/color.hxx>
+#include "sddllapi.h"
+
+class SD_DLLPUBLIC SdAnimationInfo final : public SdrObjUserData
+{
+public:
+ PresObjKind mePresObjKind;
+
+ /* deprecated animation infos */
+ css::presentation::AnimationEffect meEffect; ///< Animation effect
+ css::presentation::AnimationEffect meTextEffect; ///< Animation effect for text content
+ css::presentation::AnimationSpeed meSpeed; ///< Speed of the animation
+ bool mbActive; ///< turned on?
+ bool mbDimPrevious; ///< Object fade out
+ bool mbIsMovie; ///< if group object than it is a sequence of them.
+ bool mbDimHide; ///< hide rather than dim
+ Color maBlueScreen; ///< identifies "background pixels"
+ Color maDimColor; ///< for fading the object
+ OUString maSoundFile; ///< Path to the sound file in MS DOS notation
+ bool mbSoundOn; ///< Sound on / off
+ bool mbPlayFull; ///< play sound completely.
+ css::presentation::ClickAction meClickAction; ///< Action at mouse click
+ css::presentation::AnimationEffect meSecondEffect; ///< for object fading.
+ css::presentation::AnimationSpeed meSecondSpeed; ///< for object fading.
+ OUString maSecondSoundFile; ///< for object fading.
+ bool mbSecondSoundOn; ///< for object fading.
+ bool mbSecondPlayFull; ///< for object fading.
+ sal_uInt16 mnVerb; ///< for OLE object
+ SdrObject& mrObject;
+
+ void SetBookmark( const OUString& rBookmark );
+ OUString GetBookmark() const;
+public:
+ SAL_DLLPRIVATE SdAnimationInfo(SdrObject& rObject);
+ SAL_DLLPRIVATE SdAnimationInfo(const SdAnimationInfo& rAnmInfo, SdrObject& rObject);
+ SAL_DLLPRIVATE virtual ~SdAnimationInfo() override;
+
+ SAL_DLLPRIVATE virtual std::unique_ptr<SdrObjUserData> Clone(SdrObject* pObject) const override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/app.hrc b/sd/inc/app.hrc
new file mode 100644
index 000000000..875dc0cc3
--- /dev/null
+++ b/sd/inc/app.hrc
@@ -0,0 +1,462 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svl/solar.hrc>
+
+// Helper IDs for templates
+#define HID_STANDARD_STYLESHEET_NAME (HID_SD_START + 70)
+#define HID_POOLSHEET_OBJWITHOUTFILL (HID_SD_START + 73)
+#define HID_POOLSHEET_OBJNOLINENOFILL (HID_SD_START + 74)
+#define HID_POOLSHEET_TEXT (HID_SD_START + 71)
+#define HID_POOLSHEET_A4 (HID_SD_START + 104)
+#define HID_POOLSHEET_A4_TITLE (HID_SD_START + 72)
+#define HID_POOLSHEET_A4_HEADLINE (HID_SD_START + 75)
+#define HID_POOLSHEET_A4_TEXT (HID_SD_START + 105)
+#define HID_POOLSHEET_A0 (HID_SD_START + 109)
+#define HID_POOLSHEET_A0_TITLE (HID_SD_START + 110)
+#define HID_POOLSHEET_A0_HEADLINE (HID_SD_START + 111)
+#define HID_POOLSHEET_A0_TEXT (HID_SD_START + 112)
+#define HID_POOLSHEET_GRAPHIC (HID_SD_START + 106)
+#define HID_POOLSHEET_SHAPES (HID_SD_START + 107)
+#define HID_POOLSHEET_FILLED (HID_SD_START + 77)
+#define HID_POOLSHEET_FILLED_BLUE (HID_SD_START + 78)
+#define HID_POOLSHEET_FILLED_GREEN (HID_SD_START + 79)
+#define HID_POOLSHEET_FILLED_RED (HID_SD_START + 80)
+#define HID_POOLSHEET_FILLED_YELLOW (HID_SD_START + 81)
+#define HID_POOLSHEET_OUTLINE (HID_SD_START + 82)
+#define HID_POOLSHEET_OUTLINE_BLUE (HID_SD_START + 83)
+#define HID_POOLSHEET_OUTLINE_GREEN (HID_SD_START + 84)
+#define HID_POOLSHEET_OUTLINE_RED (HID_SD_START + 102)
+#define HID_POOLSHEET_OUTLINE_YELLOW (HID_SD_START + 103)
+#define HID_POOLSHEET_LINES (HID_SD_START + 108)
+#define HID_POOLSHEET_MEASURE (HID_SD_START + 76)
+#define HID_POOLSHEET_LINES_DASHED (HID_SD_START + 113) //dummy
+#define HID_POOLSHEET_LAST (HID_SD_START + 114) //dummy
+
+#define HID_PSEUDOSHEET_TITLE (HID_SD_START + 85)
+#define HID_PSEUDOSHEET_OUTLINE (HID_SD_START + 86)
+#define HID_PSEUDOSHEET_OUTLINE1 (HID_SD_START + 87)
+#define HID_PSEUDOSHEET_OUTLINE2 (HID_SD_START + 88)
+#define HID_PSEUDOSHEET_OUTLINE3 (HID_SD_START + 89)
+#define HID_PSEUDOSHEET_OUTLINE4 (HID_SD_START + 90)
+#define HID_PSEUDOSHEET_OUTLINE5 (HID_SD_START + 91)
+#define HID_PSEUDOSHEET_OUTLINE6 (HID_SD_START + 92)
+#define HID_PSEUDOSHEET_OUTLINE7 (HID_SD_START + 93)
+#define HID_PSEUDOSHEET_OUTLINE8 (HID_SD_START + 94)
+#define HID_PSEUDOSHEET_OUTLINE9 (HID_SD_START + 95)
+#define HID_PSEUDOSHEET_BACKGROUNDOBJECTS (HID_SD_START + 96)
+#define HID_PSEUDOSHEET_BACKGROUND (HID_SD_START + 97)
+#define HID_PSEUDOSHEET_NOTES (HID_SD_START + 98)
+#define HID_PSEUDOSHEET_SUBTITLE (HID_SD_START + 101)
+
+#define HID_SD_CELL_STYLE_DEFAULT (HID_SD_START + 194)
+#define HID_SD_CELL_STYLE_BANDED (HID_SD_START + 195)
+#define HID_SD_CELL_STYLE_HEADER (HID_SD_START + 196)
+#define HID_SD_CELL_STYLE_TOTAL (HID_SD_START + 197)
+#define HID_SD_CELL_STYLE_FIRST_COLUMN (HID_SD_START + 198)
+#define HID_SD_CELL_STYLE_LAST_COLUMN (HID_SD_START + 199)
+
+#define SID_PAGESETUP (SID_SD_START+2)
+ // FREE
+#define SID_COPYOBJECTS (SID_SD_START+4)
+#define SID_MANAGE_LINKS (SID_SD_START+5)
+ // FREE
+#define SID_CONVERT_TO_3D_LATHE (SID_SD_START+8)
+#define SID_DRAWINGMODE (SID_SD_START+9)
+#define SID_OUTLINE_MODE (SID_SD_START+10)
+#define SID_SLIDE_SORTER_MODE (SID_SD_START+11)
+#define SID_DISPLAY_MODE (SID_SD_START+12)
+#define SID_TOGGLE_TABBAR_VISIBILITY (SID_SD_START+13)
+#define SID_INSERTPAGE (SID_SD_START+14)
+#define SID_INSERTFILE (SID_SD_START+15)
+ // FREE
+#define SID_ZOOM_PANNING (SID_SD_START+17)
+#define SID_PRESENTATION_END (SID_SD_START+18)
+ // FREE
+#define SID_POSITION (SID_SD_START+22)
+ // FREE
+#define SID_TEXT_COMBINE (SID_SD_START+25)
+#define SID_COMBINE (SID_SD_START+26)
+#define SID_NAME_GROUP (SID_SD_START+27)
+#define SID_DRAWTBX_CONNECTORS (SID_SD_START+28)
+ // FREE
+// In svxids.hrc: SID_BEZIER_ELIMINATE_POINTS (SID_SD_START+30)
+#define SID_MOREFRONT (SID_SD_START+31)
+#define SID_MOREBACK (SID_SD_START+32)
+// #i68101#
+#define SID_OBJECT_TITLE_DESCRIPTION (SID_SD_START+33)
+#define SID_VERTICAL (SID_SD_START+34)
+#define SID_HORIZONTAL (SID_SD_START+35)
+#define SID_CHANGEBEZIER (SID_SD_START+36)
+#define SID_CHANGEPOLYGON (SID_SD_START+37)
+#define SID_CAPTUREPOINT (SID_SD_START+38)
+#define SID_INSERTLAYER (SID_SD_START+39)
+// In svxids.hrc: SID_RULER (SID_SD_START+40)
+#define SID_EDIT_OUTLINER (SID_SD_START+41)
+#define SID_SWITCHPAGE (SID_SD_START+42)
+#define SID_MODIFYPAGE (SID_SD_START+43)
+#define SID_SWITCHLAYER (SID_SD_START+44)
+#define SID_MODIFYLAYER (SID_SD_START+45)
+#define SID_PAGEMODE (SID_SD_START+46)
+#define SID_LAYERMODE (SID_SD_START+47)
+ // FREE
+#define SID_MASTERPAGE (SID_SD_START+50)
+// Navigation between slides
+#define SID_GO_TO_NEXT_PAGE (SID_SD_START+51)
+#define SID_GO_TO_PREVIOUS_PAGE (SID_SD_START+52)
+#define SID_GO_TO_FIRST_PAGE (SID_SD_START+53)
+#define SID_GO_TO_LAST_PAGE (SID_SD_START+54)
+// Slide sorting
+#define SID_MOVE_PAGE_UP (SID_SD_START+55)
+#define SID_MOVE_PAGE_DOWN (SID_SD_START+56)
+#define SID_MOVE_PAGE_FIRST (SID_SD_START+57)
+#define SID_MOVE_PAGE_LAST (SID_SD_START+58)
+ // FREE
+#define SID_TOOL_CONNECTOR (SID_SD_START+61)
+#define SID_ANIMATION_OBJECTS (SID_SD_START+62)
+#define SID_ANIMATION_EFFECTS (SID_SD_START+63)
+#define SID_PRESENTATION_LAYOUT (SID_SD_START+64)
+// In svxids.hrc: SID_BEZIER_CONVERT (SID_SD_START+65)
+// In svxids.hrc: SID_BEZIER_EDGE (SID_SD_START+66)
+// In svxids.hrc: SID_BEZIER_SYMMTR (SID_SD_START+67)
+#define SID_NOTES_MODE TypedWhichId<SfxBoolItem>(SID_SD_START+69)
+#define SID_HANDOUT_MASTER_MODE (SID_SD_START+70)
+#define SID_LINEEND_POLYGON (SID_SD_START+71)
+#define SID_EXECUTE_ANIMATION_EFFECT (SID_SD_START+72)
+ // FREE
+#define SID_SWITCH_POINTEDIT (SID_SD_START+74)
+ // FREE
+// In svxids.hrc: SID_TEXTEDIT (SID_SD_START+76)
+#define SID_SET_SNAPITEM (SID_SD_START+77)
+ // FREE
+#define SID_DELETE_PAGE (SID_SD_START+80)
+#define SID_DELETE_LAYER (SID_SD_START+81)
+#define SID_DISMANTLE (SID_SD_START+82)
+ // FREE
+#define SID_SCALE (SID_SD_START+85)
+#define SID_STATUS_PAGE (SID_SD_START+86)
+#define SID_STATUS_LAYOUT (SID_SD_START+87)
+#define SID_STATUS_SELMODE (SID_SD_START+88)
+// In sfxsids.hrc: SID_MODIFIED TypedWhichId<SfxBoolItem>(SID_SD_START+89)
+#define SID_OBJECT_CROOK_ROTATE (SID_SD_START+90)
+#define SID_OBJECT_CROOK_SLANT (SID_SD_START+91)
+#define SID_OBJECT_CROOK_STRETCH (SID_SD_START+92)
+#define SID_CONNECT (SID_SD_START+93)
+#define SID_BREAK (SID_SD_START+94)
+#define SID_OBJECT_CHOOSE_MODE (SID_SD_START+95)
+// In svxids.hrc: SID_ENTER_GROUP (SID_SD_START+96)
+// In svxids.hrc: SID_LEAVE_GROUP (SID_SD_START+97)
+// In svxids.hrc: SID_SIZE_PAGE_WIDTH (SID_SD_START+98)
+// In sfxsids.hrc: SID_SIZE_OPTIMAL (SID_SD_START+99)
+#define SID_OBJECT_TRANSPARENCE (SID_SD_START+100)
+#define SID_OBJECT_GRADIENT (SID_SD_START+101)
+ // FREE
+// In svxids.hrc: SID_INSERT_MATH (SID_SD_START+106)
+#define SID_OBJECT_SHEAR (SID_SD_START+107)
+#define SID_DELETE_SNAPITEM (SID_SD_START+108)
+#define SID_OBJECT_CLOSE (SID_SD_START+109)
+#define SID_ANIMATOR_ADD (SID_SD_START+110)
+#define SID_ANIMATOR_CREATE (SID_SD_START+111)
+#define SID_ANIMATOR_STATE (SID_SD_START+112)
+#define SID_PRESENTATIONOBJECT (SID_SD_START+113)
+// In svxids.hrc: SID_SIZE_VISAREA (SID_SD_START+114)
+// In svxids.hrc: SID_ATTR_SYMBOLTYPE (SID_SD_START+115)
+// In svxids.hrc: SID_ATTR_SYMBOLSIZE (SID_SD_START+116)
+#define SID_REVERSE_ORDER (SID_SD_START+117)
+#define SID_CLEAR_UNDO_STACK (SID_SD_START+118)
+#define SID_CONNECTOR_ARROW_START (SID_SD_START+119)
+#define SID_CONNECTOR_ARROW_END (SID_SD_START+120)
+#define SID_CONNECTOR_ARROWS (SID_SD_START+121)
+#define SID_CONNECTOR_CIRCLE_START (SID_SD_START+122)
+#define SID_CONNECTOR_CIRCLE_END (SID_SD_START+123)
+#define SID_CONNECTOR_CIRCLES (SID_SD_START+124)
+#define SID_CONNECTOR_LINE (SID_SD_START+125)
+#define SID_CONNECTOR_LINE_ARROW_START (SID_SD_START+126)
+#define SID_CONNECTOR_LINE_ARROW_END (SID_SD_START+127)
+#define SID_CONNECTOR_LINE_ARROWS (SID_SD_START+128)
+#define SID_CONNECTOR_LINE_CIRCLE_START (SID_SD_START+129)
+#define SID_CONNECTOR_LINE_CIRCLE_END (SID_SD_START+130)
+#define SID_CONNECTOR_LINE_CIRCLES (SID_SD_START+131)
+#define SID_CONNECTOR_CURVE (SID_SD_START+132)
+#define SID_CONNECTOR_CURVE_ARROW_START (SID_SD_START+133)
+#define SID_CONNECTOR_CURVE_ARROW_END (SID_SD_START+134)
+#define SID_CONNECTOR_CURVE_ARROWS (SID_SD_START+135)
+#define SID_CONNECTOR_CURVE_CIRCLE_START (SID_SD_START+136)
+#define SID_CONNECTOR_CURVE_CIRCLE_END (SID_SD_START+137)
+#define SID_CONNECTOR_CURVE_CIRCLES (SID_SD_START+138)
+#define SID_CONNECTOR_LINES (SID_SD_START+139)
+#define SID_CONNECTOR_LINES_ARROW_START (SID_SD_START+140)
+#define SID_CONNECTOR_LINES_ARROW_END (SID_SD_START+141)
+#define SID_CONNECTOR_LINES_ARROWS (SID_SD_START+142)
+#define SID_CONNECTOR_LINES_CIRCLE_START (SID_SD_START+143)
+#define SID_CONNECTOR_LINES_CIRCLE_END (SID_SD_START+144)
+#define SID_CONNECTOR_LINES_CIRCLES (SID_SD_START+145)
+#define SID_BEHIND_OBJ (SID_SD_START+146)
+ // FREE
+// Option pane slot IDs
+#define SID_SOLID_CREATE (SID_SD_START+151)
+#define SID_HELPLINES_USE (SID_SD_START+152)
+// In svxids.hrc: SID_HELPLINES_MOVE (SID_SD_START+153)
+// In svxids.hrc: SID_GRID_USE (SID_SD_START+154)
+#define SID_SNAP_BORDER (SID_SD_START+155)
+#define SID_SNAP_FRAME (SID_SD_START+156)
+#define SID_SNAP_POINTS (SID_SD_START+157)
+#define SID_QUICKEDIT (SID_SD_START+158)
+#define SID_PICK_THROUGH (SID_SD_START+159)
+ // FREE 160 - 168
+#define SID_DOUBLECLICK_TEXTEDIT (SID_SD_START+169)
+#define SID_CLICK_CHANGE_ROTATION (SID_SD_START+170)
+#define SID_HELPLINES_VISIBLE (SID_SD_START+179)
+#define SID_HELPLINES_FRONT (SID_SD_START+180)
+#define SID_BEFORE_OBJ (SID_SD_START+181)
+ // FREE
+#define SID_CUSTOM_ANIMATION_PANEL (SID_SD_START+183)
+#define SID_MASTER_SLIDES_PANEL (SID_SD_START+184)
+ // FREE
+// and even more...
+#define ID_VAL_ENDINTENS (SID_SD_START+197)
+#define ID_VAL_STARTINTENS (SID_SD_START+198)
+#define ID_VAL_BORDER (SID_SD_START+199)
+// In svxids.hrc: ID_VAL_MOUSESTART_X (SID_SD_START+200)
+// In svxids.hrc: ID_VAL_MOUSESTART_Y (SID_SD_START+201)
+// In svxids.hrc: ID_VAL_MOUSEEND_X (SID_SD_START+204)
+// In svxids.hrc: ID_VAL_MOUSEEND_Y (SID_SD_START+205)
+// In svxids.hrc: ID_VAL_AXIS_X (SID_SD_START+206)
+// In svxids.hrc: ID_VAL_AXIS_Y (SID_SD_START+207)
+// In svxids.hrc: ID_VAL_ANGLESTART (SID_SD_START+208)
+// In svxids.hrc: ID_VAL_ANGLEEND (SID_SD_START+209)
+// In svxids.hrc: ID_VAL_CENTER_X (SID_SD_START+210)
+// In svxids.hrc: ID_VAL_CENTER_Y (SID_SD_START+211)
+#define ID_VAL_WHATPAGE (SID_SD_START+212)
+#define ID_VAL_WHATLAYER (SID_SD_START+213)
+#define ID_VAL_ANGLE (SID_SD_START+214)
+#define ID_VAL_MIRRORVERT (SID_SD_START+215)
+#define ID_VAL_ISACTIVE (SID_SD_START+216)
+#define ID_VAL_WHATKIND (SID_SD_START+217)
+#define ID_VAL_PAGEWIDTH (SID_SD_START+218)
+ // FREE
+#define ID_VAL_PAGETOP (SID_SD_START+220)
+#define ID_VAL_PAGEBOTTOM (SID_SD_START+221)
+#define ID_VAL_PAGELEFT (SID_SD_START+222)
+#define ID_VAL_PAGERIGHT (SID_SD_START+223)
+#define ID_VAL_SCALEOBJECTS (SID_SD_START+224)
+#define ID_VAL_PAGENAME (SID_SD_START+225)
+#define ID_VAL_WHATLAYOUT (SID_SD_START+226)
+#define ID_VAL_ISPAGEBACK (SID_SD_START+227)
+#define ID_VAL_ISPAGEOBJ (SID_SD_START+228)
+#define ID_VAL_LAYERNAME (SID_SD_START+229)
+
+// just for tests, namely that APP:HRC ff. has not to be build every time
+// In sfxsids.hrc: ID_VAL_DUMMY0 (SID_SD_START+230)
+#define ID_VAL_ISLOCKED (SID_SD_START+231)
+#define ID_VAL_ISPRINTABLE (SID_SD_START+232)
+#define ID_VAL_PAGEHEIGHT (SID_SD_START+233)
+#define ID_VAL_ZOOM (SID_SD_START+234)
+#define ID_VAL_RED (SID_SD_START+237)
+#define ID_VAL_GREEN (SID_SD_START+238)
+#define ID_VAL_BLUE (SID_SD_START+239)
+// In svxids.hrc: ID_VAL_STYLE (SID_SD_START+240)
+// In svxids.hrc: ID_VAL_DOTS (SID_SD_START+241)
+// In svxids.hrc: ID_VAL_DOTLEN (SID_SD_START+242)
+// In svxids.hrc: ID_VAL_DASHES (SID_SD_START+243)
+// In svxids.hrc: ID_VAL_DASHLEN (SID_SD_START+244)
+// In svxids.hrc: ID_VAL_DISTANCE (SID_SD_START+245)
+// In svxids.hrc: ID_VAL_INDEX (SID_SD_START+246)
+#define ID_VAL_WIDTH (SID_SD_START+247)
+#define SID_GRID_FRONT (SID_SD_START+248)
+#define ID_VAL_ISVISIBLE (SID_SD_START+249)
+#define SID_MOVETO (SID_SD_START+250)
+#define SID_LINETO (SID_SD_START+251)
+// In svxids.hrc: SID_BEZIERTO (SID_SD_START+252)
+#define SID_PAGESIZE (SID_SD_START+253)
+#define SID_PAGEMARGIN (SID_SD_START+254)
+ // FREE
+#define SID_COLORVIEW (SID_SD_START+257)
+ // FREE
+#define SID_GETRED (SID_SD_START+259)
+#define SID_GETBLUE (SID_SD_START+260)
+#define SID_GETGREEN (SID_SD_START+261)
+#define SID_SETFILLSTYLE (SID_SD_START+262)
+#define SID_SETFILLCOLOR (SID_SD_START+263)
+#define SID_GRADIENT (SID_SD_START+264)
+#define SID_SETLINESTYLE (SID_SD_START+265)
+#define SID_SETLINEWIDTH (SID_SD_START+266)
+// In svxids.hrc: SID_DASH (SID_SD_START+267)
+#define SID_RENAMEPAGE (SID_SD_START+268)
+#define SID_RENAMELAYER (SID_SD_START+269)
+#define SID_HATCH (SID_SD_START+270)
+#define SID_GETFILLSTYLE (SID_SD_START+271)
+#define SID_GETLINESTYLE (SID_SD_START+272)
+#define SID_GETLINEWIDTH (SID_SD_START+273)
+#define SID_SETLINECOLOR (SID_SD_START+274)
+#define SID_SETHATCHCOLOR (SID_SD_START+275)
+#define SID_SETGRADSTARTCOLOR (SID_SD_START+276)
+#define SID_SETGRADENDCOLOR (SID_SD_START+277)
+#define SID_SELECTGRADIENT (SID_SD_START+278)
+#define SID_SELECTHATCH (SID_SD_START+279)
+#define SID_UNSELECT (SID_SD_START+280)
+#define SID_TEXTATTR_DLG (SID_SD_START+281)
+#define SID_ORIGINAL_SIZE (SID_SD_START+282)
+#define SID_PAGES_PER_ROW (SID_SD_START+284)
+#define SID_TEXT_FITTOSIZE (SID_SD_START+285)
+// In svxids.hrc: SID_TEXT_FITTOSIZE_VERTICAL (SID_SD_START+286)
+#define SID_NAVIGATOR_PAGENAME (SID_SD_START+287)
+#define SID_NAVIGATOR_STATE (SID_SD_START+288)
+#define SID_NAVIGATOR_INIT (SID_SD_START+289)
+ // FREE
+#define SID_NAVIGATOR_PAGE (SID_SD_START+292)
+#define SID_NAVIGATOR_OBJECT (SID_SD_START+293)
+#define SID_ANIMATOR_INIT (SID_SD_START+294)
+#define SID_DRAWTBX_3D_OBJECTS (SID_SD_START+295)
+#define SID_3D_CUBE (SID_SD_START+296)
+#define SID_3D_SPHERE (SID_SD_START+297)
+#define SID_3D_CYLINDER (SID_SD_START+298)
+#define SID_3D_CONE (SID_SD_START+299)
+#define SID_3D_PYRAMID (SID_SD_START+300)
+#define SID_GLUE_EDITMODE (SID_SD_START+301)
+#define SID_GLUE_INSERT_POINT (SID_SD_START+302)
+#define SID_GLUE_PERCENT (SID_SD_START+303)
+#define SID_GLUE_ESCDIR (SID_SD_START+304)
+#define SID_GLUE_HORZALIGN_CENTER (SID_SD_START+305)
+#define SID_GLUE_HORZALIGN_LEFT (SID_SD_START+306)
+#define SID_GLUE_HORZALIGN_RIGHT (SID_SD_START+307)
+#define SID_GLUE_VERTALIGN_CENTER (SID_SD_START+308)
+#define SID_GLUE_VERTALIGN_TOP (SID_SD_START+309)
+#define SID_GLUE_VERTALIGN_BOTTOM (SID_SD_START+310)
+#define SID_3D_SHELL (SID_SD_START+311)
+#define SID_3D_TORUS (SID_SD_START+312)
+#define SID_3D_HALF_SPHERE (SID_SD_START+313)
+#define SID_GLUE_ESCDIR_LEFT (SID_SD_START+314)
+#define SID_GLUE_ESCDIR_RIGHT (SID_SD_START+315)
+#define SID_GLUE_ESCDIR_TOP (SID_SD_START+316)
+#define SID_GLUE_ESCDIR_BOTTOM (SID_SD_START+317)
+#define SID_DRAWTBX_INSERT (SID_SD_START+318)
+#define SID_POLYGON_MORPHING (SID_SD_START+319)
+ // FREE
+// In svxids.hrc: SID_GRID_VISIBLE (SID_SD_START+322)
+// In svxids.hrc: ID_VAL_USEFIRSTROWSTYLE (SID_SD_START+323)
+// In svxids.hrc: ID_VAL_USELASTROWSTYLE (SID_SD_START+324)
+// In svxids.hrc: ID_VAL_USEBANDINGROWSTYLE (SID_SD_START+325)
+// In svxids.hrc: ID_VAL_USEFIRSTCOLUMNSTYLE (SID_SD_START+326)
+// In svxids.hrc: ID_VAL_USELASTCOLUMNSTYLE (SID_SD_START+327)
+// In svxids.hrc: ID_VAL_USEBANDINGCOLUMNSTYLE (SID_SD_START+328)
+
+
+#define SID_PREVIEW_STATE (SID_SD_START+329)
+ // FREE
+#define SID_SLIDE_TRANSITIONS_PANEL (SID_SD_START+334)
+ // FREE
+#define SID_PHOTOALBUM (SID_SD_START+336)
+#define SID_REMOTE_DLG (SID_SD_START+337)
+#define SID_CONNECTION_DLG (SID_SD_START+338)
+#define SID_PRESENTATION_DLG (SID_SD_START+339)
+#define SID_HYPHENATION (SID_SD_START+340)
+#define SID_CONNECTION_NEW_ROUTING (SID_SD_START+341)
+#define SID_DUPLICATE_PAGE (SID_SD_START+342)
+#define SID_EXPAND_PAGE (SID_SD_START+343)
+#define SID_SUMMARY_PAGE (SID_SD_START+344)
+#define SID_LEAVE_ALL_GROUPS (SID_SD_START+345)
+ // FREE
+#define SID_SLIDE_MASTER_MODE TypedWhichId<SfxBoolItem>(SID_SD_START+348)
+ // FREE
+#define SID_NOTES_MASTER_MODE (SID_SD_START+350)
+ // FREE
+#define SID_INSERTPAGE_QUICK (SID_SD_START+352)
+ // FREE
+#define SID_INSERT_FLD_PAGE_TITLE (SID_SD_START+356)
+#define SID_INSERT_FLD_DATE_VAR (SID_SD_START+357)
+#define SID_INSERT_FLD_DATE_FIX (SID_SD_START+358)
+#define SID_INSERT_FLD_TIME_VAR (SID_SD_START+359)
+#define SID_INSERT_FLD_TIME_FIX (SID_SD_START+360)
+#define SID_INSERT_FLD_PAGE (SID_SD_START+361)
+#define SID_MODIFY_FIELD (SID_SD_START+362)
+#define SID_INSERT_FLD_FILE (SID_SD_START+363)
+#define SID_INSERT_FLD_AUTHOR (SID_SD_START+364)
+#define SID_CUSTOMSHOW_DLG (SID_SD_START+365)
+#define SID_OUTPUT_QUALITY_COLOR (SID_SD_START+366)
+#define SID_OUTPUT_QUALITY_GRAYSCALE (SID_SD_START+367)
+#define SID_OUTPUT_QUALITY_BLACKWHITE (SID_SD_START+368)
+#define SID_PREVIEW_QUALITY_COLOR (SID_SD_START+369)
+ // FREE
+#define SID_INSERT_FLD_PAGES (SID_SD_START+373)
+ // FREE
+#define SID_CONVERT_TO_BITMAP (SID_SD_START+378)
+#define SID_CONVERT_TO_METAFILE (SID_SD_START+379)
+ // FREE
+#define SID_CONVERT_TO_CONTOUR (SID_SD_START+381)
+ // FREE
+#define ID_VAL_DUMMY1 (SID_SD_START+383)
+#define ID_VAL_DUMMY2 (SID_SD_START+384)
+#define ID_VAL_DUMMY3 (SID_SD_START+385)
+#define ID_VAL_DUMMY4 (SID_SD_START+386)
+#define ID_VAL_DUMMY5 (SID_SD_START+387)
+#define ID_VAL_DUMMY6 (SID_SD_START+388)
+ // FREE
+#define SID_OUTPUT_QUALITY_CONTRAST (SID_SD_START+400)
+#define SID_PREVIEW_QUALITY_CONTRAST (SID_SD_START+401)
+ // FREE
+#define SID_RENAMEPAGE_QUICK (SID_SD_START+405)
+#define SID_SWITCH_SHELL (SID_SD_START+406)
+#define SID_HEADER_AND_FOOTER (SID_SD_START+407)
+#define SID_MASTER_LAYOUTS (SID_SD_START+408)
+ // FREE
+#define SID_INSERT_PAGE_NUMBER (SID_SD_START+411)
+#define SID_INSERT_DATE_TIME (SID_SD_START+412)
+#define SID_SDMODE_FLAG (SID_SD_START+413)
+// Enum in the middle of IDs...
+#define SD_DRAW_MODE 1
+#define SD_IMPRESS_MODE 2
+
+#define SID_LEFT_PANE_IMPRESS (SID_SD_START+414)
+#define SID_LEFT_PANE_DRAW (SID_SD_START+415)
+ // FREE
+#define SID_NOTES_WINDOW (SID_SD_START+417)
+ // FREE
+#define SID_NORMAL_MULTI_PANE_GUI TypedWhichId<SfxBoolItem>(SID_SD_START+420)
+#define SID_SLIDE_SORTER_MULTI_PANE_GUI (SID_SD_START+421)
+
+#define SID_SELECT_BACKGROUND (SID_SD_START+422)
+#define SID_SAVE_BACKGROUND (SID_SD_START+423)
+ // FREE
+// Slots for the tool pane popup
+ // FREE
+#define SID_INSERT_MASTER_PAGE (SID_SD_START+431)
+#define SID_DELETE_MASTER_PAGE (SID_SD_START+432)
+#define SID_RENAME_MASTER_PAGE (SID_SD_START+433)
+#define SID_CLOSE_MASTER_VIEW (SID_SD_START+434)
+#define SID_ASSIGN_LAYOUT (SID_SD_START+435)
+#define SID_DISPLAY_MASTER_BACKGROUND (SID_SD_START+436)
+#define SID_DISPLAY_MASTER_OBJECTS (SID_SD_START+437)
+#define SID_INSERTPAGE_LAYOUT_MENU (SID_SD_START+438)
+ // FREE
+#define SID_OUTLINE_TEXT_AUTOFIT (SID_SD_START+440)
+
+// Add companion for the SID_HIDE_SLIDE (that is defined in svx)
+#define SID_SHOW_SLIDE (SID_SD_START+441)
+#define SID_ADD_MOTION_PATH TypedWhichId<SfxUnoAnyItem>(SID_SD_START+442)
+
+ // FREE
+#define SID_ZOOM_MODE (SID_SD_START+447)
+#define SID_HIDE_LAST_LEVEL (SID_SD_START+448)
+#define SID_SHOW_NEXT_LEVEL (SID_SD_START+449)
+#define SID_PRESENTATION_MINIMIZER (SID_SD_START+450)
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/bitmaps.hlst b/sd/inc/bitmaps.hlst
new file mode 100644
index 000000000..e1c798cfa
--- /dev/null
+++ b/sd/inc/bitmaps.hlst
@@ -0,0 +1,212 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#pragma once
+
+#include <rtl/ustring.hxx>
+
+// preview bitmaps for layouts
+inline constexpr OUStringLiteral BMP_LAYOUT_EMPTY = u"sd/res/layout_empty.png";
+inline constexpr OUStringLiteral BMP_LAYOUT_HEAD01 = u"sd/res/layout_head01.png";
+inline constexpr OUStringLiteral BMP_LAYOUT_HEAD02 = u"sd/res/layout_head02.png";
+inline constexpr OUStringLiteral BMP_LAYOUT_HEAD02A = u"sd/res/layout_head02a.png";
+inline constexpr OUStringLiteral BMP_LAYOUT_HEAD02B = u"sd/res/layout_head02b.png";
+inline constexpr OUStringLiteral BMP_LAYOUT_HEAD03 = u"sd/res/layout_head03.png";
+inline constexpr OUStringLiteral BMP_LAYOUT_HEAD03A = u"sd/res/layout_head03a.png";
+inline constexpr OUStringLiteral BMP_LAYOUT_HEAD03B = u"sd/res/layout_head03b.png";
+inline constexpr OUStringLiteral BMP_LAYOUT_HEAD03C = u"sd/res/layout_head03c.png";
+inline constexpr OUStringLiteral BMP_LAYOUT_HEAD04 = u"sd/res/layout_head04.png";
+inline constexpr OUStringLiteral BMP_LAYOUT_HEAD06 = u"sd/res/layout_head06.png";
+inline constexpr OUStringLiteral BMP_LAYOUT_TEXTONLY = u"sd/res/layout_textonly.png";
+inline constexpr OUStringLiteral BMP_LAYOUT_VERTICAL01 = u"sd/res/layout_vertical01.png";
+inline constexpr OUStringLiteral BMP_LAYOUT_VERTICAL02 = u"sd/res/layout_vertical02.png";
+inline constexpr OUStringLiteral BMP_SLIDE_NONE = u"sd/res/foilnone.png";
+inline constexpr OUStringLiteral BMP_SLIDEH_01 = u"sd/res/foilh01.png";
+inline constexpr OUStringLiteral BMP_SLIDEH_02 = u"sd/res/foilh02.png";
+inline constexpr OUStringLiteral BMP_SLIDEH_03 = u"sd/res/foilh03.png";
+inline constexpr OUStringLiteral BMP_SLIDEH_04 = u"sd/res/foilh04.png";
+inline constexpr OUStringLiteral BMP_SLIDEH_06 = u"sd/res/foilh06.png";
+inline constexpr OUStringLiteral BMP_SLIDEH_09 = u"sd/res/foilh09.png";
+inline constexpr OUStringLiteral BMP_DISPLAYMODE_SLIDE = u"sd/res/displaymode_slide.png";
+inline constexpr OUStringLiteral BMP_DISPLAYMODE_OUTLINE = u"sd/res/displaymode_outline.png";
+inline constexpr OUStringLiteral BMP_DISPLAYMODE_NOTES = u"sd/res/displaymode_notes.png";
+inline constexpr OUStringLiteral BMP_DISPLAYMODE_SLIDE_SORTER = u"sd/res/displaymode_slidesorter.png";
+inline constexpr OUStringLiteral BMP_DISPLAYMODE_SLIDE_MASTER = u"sd/res/displaymode_slidemaster.png";
+inline constexpr OUStringLiteral BMP_DISPLAYMODE_NOTES_MASTER = u"sd/res/displaymode_notesmaster.png";
+inline constexpr OUStringLiteral BMP_DISPLAYMODE_HANDOUT_MASTER = u"sd/res/displaymode_handoutmaster.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_CHART_SMALL = u"sd/res/placeholder_chart_small.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_CHART_SMALL_HOVER = u"sd/res/placeholder_chart_small_hover.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_IMAGE_SMALL = u"sd/res/placeholder_image_small.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_IMAGE_SMALL_HOVER = u"sd/res/placeholder_image_small_hover.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_MOVIE_SMALL = u"sd/res/placeholder_movie_small.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_MOVIE_SMALL_HOVER = u"sd/res/placeholder_movie_small_hover.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_TABLE_SMALL = u"sd/res/placeholder_table_small.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_TABLE_SMALL_HOVER = u"sd/res/placeholder_table_small_hover.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_CHART_LARGE = u"sd/res/placeholder_chart_large.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_CHART_LARGE_HOVER = u"sd/res/placeholder_chart_large_hover.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_IMAGE_LARGE = u"sd/res/placeholder_image_large.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_IMAGE_LARGE_HOVER = u"sd/res/placeholder_image_large_hover.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_MOVIE_LARGE = u"sd/res/placeholder_movie_large.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_MOVIE_LARGE_HOVER = u"sd/res/placeholder_movie_large_hover.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_TABLE_LARGE = u"sd/res/placeholder_table_large.png";
+inline constexpr OUStringLiteral BMP_PLACEHOLDER_TABLE_LARGE_HOVER = u"sd/res/placeholder_table_large_hover.png";
+inline constexpr OUStringLiteral BMP_SLIDEN_01 = u"sd/res/foiln01.png";
+inline constexpr OUStringLiteral BMP_PAGE = u"sd/res/page.png";
+inline constexpr OUStringLiteral BMP_PAGE_EXCLUDED = u"sd/res/pageexcl.png";
+inline constexpr OUStringLiteral BMP_PAGEOBJS_EXCLUDED = u"sd/res/pagobjex.png";
+inline constexpr OUStringLiteral BMP_PAGEOBJS = u"sd/res/pageobjs.png";
+inline constexpr OUStringLiteral BMP_OBJECTS = u"sd/res/objects.png";
+inline constexpr OUStringLiteral BMP_OLE = u"sd/res/ole.png";
+inline constexpr OUStringLiteral BMP_GROUP = u"sd/res/group.png";
+inline constexpr OUStringLiteral BMP_DOC_OPEN = u"sd/res/docopen.png";
+inline constexpr OUStringLiteral BMP_DOC_TEXT = u"sd/res/doctext.png" ;
+inline constexpr OUStringLiteral BMP_GRAPHIC = u"sd/res/graphic.png";
+inline constexpr OUStringLiteral BMP_STYLES_FAMILY_GRAPHICS = u"sd/res/sf01.png";
+inline constexpr OUStringLiteral BMP_STYLES_FAMILY_PRESENTATIONS = u"sd/res/sf02.png";
+inline constexpr OUStringLiteral BMP_PRESOBJ_GRAPHIC = u"sd/res/image.png";
+inline constexpr OUStringLiteral BMP_PRESOBJ_OBJECT = u"sd/res/object.png";
+inline constexpr OUStringLiteral BMP_PRESOBJ_CHART = u"sd/res/chart.png";
+inline constexpr OUStringLiteral BMP_PRESOBJ_ORGCHART = u"sd/res/orgchart.png";
+inline constexpr OUStringLiteral BMP_PRESOBJ_TABLE = u"sd/res/table.png";
+inline constexpr OUStringLiteral BMP_POINTER_ICON = u"sd/res/pointericon.png";
+inline constexpr OUStringLiteral BMP_WAIT_ICON = u"sd/res/waiticon.png";
+inline constexpr OUStringLiteral BMP_FADE_EFFECT_INDICATOR = u"sd/res/fade_effect_indicator.png";
+inline constexpr OUStringLiteral BMP_CUSTOM_ANIMATION_INDICATOR = u"sd/res/click_16.png";
+// Presenter Screen bitmaps:
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_LEFT = u"sd/res/presenterscreen-BorderLeft.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_SLIDE_NEXT_DISABLED = u"sd/res/presenterscreen-ButtonSlideNextDisabled.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_SELECTED = u"sd/res/presenterscreen-ButtonSlidePreviousSelected.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_TOP = u"sd/res/presenterscreen-BorderCurrentSlideTop.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_NOTES_SELECTED = u"sd/res/presenterscreen-ButtonNotesSelected.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_SELECTED = u"sd/res/presenterscreen-ScrollbarArrowDownSelected.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BACKGROUND = u"sd/res/presenterscreen-Background.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_ANIMATION = u"sd/res/presenterscreen-Animation.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_TRANSITION = u"sd/res/presenterscreen-Transition.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_RIGHT = u"sd/res/presenterscreen-BorderRight.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_ACTIVE_TOP = u"sd/res/presenterscreen-BorderActiveTop.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_HELP_DISABLED = u"sd/res/presenterscreen-ButtonHelpDisabled.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_ACTIVE_RIGHT = u"sd/res/presenterscreen-BorderActiveRight.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_FRAME_CENTER_NORMAL = u"sd/res/presenterscreen-ButtonFrameCenterNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_MIDDLE_MOUSE_OVER = u"sd/res/presenterscreen-ScrollbarThumbMiddleMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_BOTTOM_RIGHT = u"sd/res/presenterscreen-BorderCurrentSlideBottomRight.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_TOP_LEFT = u"sd/res/presenterscreen-BorderTopLeft.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM = u"sd/res/presenterscreen-BorderActiveBottom.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_BOTTOM_LEFT = u"sd/res/presenterscreen-BorderBottomLeft.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_TOOLBAR_TOP = u"sd/res/presenterscreen-BorderToolbarTop.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_ACTIVE_LEFT = u"sd/res/presenterscreen-BorderActiveLeft.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_HELP_NORMAL = u"sd/res/presenterscreen-ButtonHelpNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_EXIT_PRESENTER_NORMAL = u"sd/res/presenterscreen-ButtonExitPresenterNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SEPARATOR = u"sd/res/presenterscreen-Separator.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM_CALLOUT = u"sd/res/presenterscreen-BorderActiveBottomCallout.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_TOOLBAR_LEFT = u"sd/res/presenterscreen-BorderToolbarLeft.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_NORMAL = u"sd/res/presenterscreen-ButtonSlideSorterNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_PAGER_MIDDLE_NORMAL = u"sd/res/presenterscreen-ScrollbarPagerMiddleNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_FRAME_RIGHT_NORMAL = u"sd/res/presenterscreen-ButtonFrameRightNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_MOUSE_OVER = u"sd/res/presenterscreen-ButtonEffectNextMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_TOP_MOUSE_OVER = u"sd/res/presenterscreen-ScrollbarThumbTopMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_DISABLED = u"sd/res/presenterscreen-ButtonEffectNextDisabled.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_FRAME_CENTER_MOUSE_OVER = u"sd/res/presenterscreen-ButtonFrameCenterMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_LEFT = u"sd/res/presenterscreen-BorderCurrentSlideLeft.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_FRAME_LEFT_MOUSE_OVER = u"sd/res/presenterscreen-ButtonFrameLeftMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_HELP_SELECTED = u"sd/res/presenterscreen-ButtonHelpSelected.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_VIEW_BACKGROUND = u"sd/res/presenterscreen-ViewBackground.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_NOTES_MOUSE_OVER = u"sd/res/presenterscreen-ButtonNotesMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_PLUS_MOUSE_OVER = u"sd/res/presenterscreen-ButtonPlusMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_SELECTED = u"sd/res/presenterscreen-ButtonSlideSorterSelected.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_RIGHT = u"sd/res/presenterscreen-LabelMouseOverRight.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_SWITCH_MONITOR_NORMAL = u"sd/res/presenterscreen-ButtonSwitchMonitorNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_RESTART_TIMER_NORMAL = u"sd/res/presenterscreen-ButtonRestartTimerNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_PAUSE_TIMER_NORMAL = u"sd/res/presenterscreen-ButtonPauseTimerNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_RESUME_TIMER_NORMAL = u"sd/res/presenterscreen-ButtonResumeTimerNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_TOOLBAR_RIGHT = u"sd/res/presenterscreen-BorderToolbarRight.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_MIDDLE_NORMAL = u"sd/res/presenterscreen-ScrollbarThumbMiddleNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_SELECTED = u"sd/res/presenterscreen-ButtonEffectNextSelected.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_NORMAL = u"sd/res/presenterscreen-ScrollbarArrowDownNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_TOP_RIGHT = u"sd/res/presenterscreen-BorderCurrentSlideTopRight.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_PLUS_NORMAL = u"sd/res/presenterscreen-ButtonPlusNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_TOOLBAR_TOP_RIGHT = u"sd/res/presenterscreen-BorderToolbarTopRight.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_MINUS_DISABLED = u"sd/res/presenterscreen-ButtonMinusDisabled.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_DISABLED = u"sd/res/presenterscreen-ScrollbarArrowDownDisabled.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_FRAME_RIGHT_MOUSE_OVER = u"sd/res/presenterscreen-ButtonFrameRightMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_SWITCH_MONITOR_MOUSE_OVER = u"sd/res/presenterscreen-ButtonSwitchMonitorMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_RESTART_TIMER_MOUSE_OVER = u"sd/res/presenterscreen-ButtonRestartTimerMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_PAUSE_TIMER_MOUSE_OVER = u"sd/res/presenterscreen-ButtonPauseTimerMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_RESUME_TIMER_MOUSE_OVER = u"sd/res/presenterscreen-ButtonResumeTimerMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_DISABLED = u"sd/res/presenterscreen-ButtonSlidePreviousDisabled.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_MINUS_SELECTED = u"sd/res/presenterscreen-ButtonMinusSelected.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_CENTER = u"sd/res/presenterscreen-LabelMouseOverCenter.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_SLIDE_NEXT_MOUSE_OVER = u"sd/res/presenterscreen-ButtonSlideNextMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_SLIDE_NEXT_NORMAL = u"sd/res/presenterscreen-ButtonSlideNextNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_MOUSE_OVER = u"sd/res/presenterscreen-ButtonSlidePreviousMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_TOP = u"sd/res/presenterscreen-BorderTop.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_FRAME_LEFT_NORMAL = u"sd/res/presenterscreen-ButtonFrameLeftNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_MOUSE_OVER = u"sd/res/presenterscreen-ScrollbarArrowUpMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_NOTES_NORMAL = u"sd/res/presenterscreen-ButtonNotesNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_DISABLED = u"sd/res/presenterscreen-ButtonSlideSorterDisabled.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_NORMAL = u"sd/res/presenterscreen-ButtonEffectNextNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_TOOLBAR_TOP_LEFT = u"sd/res/presenterscreen-BorderToolbarTopLeft.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM_RIGHT = u"sd/res/presenterscreen-BorderActiveBottomRight.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_BOTTOM = u"sd/res/presenterscreen-BorderBottom.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM_LEFT = u"sd/res/presenterscreen-BorderActiveBottomLeft.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_MOUSE_OVER = u"sd/res/presenterscreen-ScrollbarArrowDownMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_PLUS_SELECTED = u"sd/res/presenterscreen-ButtonPlusSelected.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_ACTIVE_TOP_RIGHT = u"sd/res/presenterscreen-BorderActiveTopRight.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_NORMAL = u"sd/res/presenterscreen-ButtonSlidePreviousNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_MOUSE_OVER = u"sd/res/presenterscreen-ButtonSlideSorterMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_MINUS_MOUSE_OVER = u"sd/res/presenterscreen-ButtonMinusMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_NOTES_DISABLED = u"sd/res/presenterscreen-ButtonNotesDisabled.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_BOTTOM_LEFT = u"sd/res/presenterscreen-BorderCurrentSlideBottomLeft.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_TOP_RIGHT = u"sd/res/presenterscreen-BorderTopRight.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_HELP_MOUSE_OVER = u"sd/res/presenterscreen-ButtonHelpMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_EXIT_PRESENTER_MOUSE_OVER = u"sd/res/presenterscreen-ButtonExitPresenterMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_TOP_NORMAL = u"sd/res/presenterscreen-ScrollbarThumbTopNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_SELECTED = u"sd/res/presenterscreen-ScrollbarArrowUpSelected.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_DISABLED = u"sd/res/presenterscreen-ScrollbarArrowUpDisabled.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_NORMAL = u"sd/res/presenterscreen-ScrollbarArrowUpNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_TOOLBAR_BOTTOM = u"sd/res/presenterscreen-BorderToolbarBottom.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_TOP_LEFT = u"sd/res/presenterscreen-BorderCurrentSlideTopLeft.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_MINUS_NORMAL = u"sd/res/presenterscreen-ButtonMinusNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_BOTTOM_MOUSE_OVER = u"sd/res/presenterscreen-ScrollbarThumbBottomMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_ACTIVE_TOP_LEFT = u"sd/res/presenterscreen-BorderActiveTopLeft.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_BOTTOM = u"sd/res/presenterscreen-BorderCurrentSlideBottom.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_PAGER_MIDDLE_MOUSE_OVER = u"sd/res/presenterscreen-ScrollbarPagerMiddleMouseOver.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_LEFT = u"sd/res/presenterscreen-LabelMouseOverLeft.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_RIGHT = u"sd/res/presenterscreen-BorderCurrentSlideRight.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BORDER_BOTTOM_RIGHT = u"sd/res/presenterscreen-BorderBottomRight.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_BOTTOM_NORMAL = u"sd/res/presenterscreen-ScrollbarThumbBottomNormal.png";
+inline constexpr OUStringLiteral BMP_PRESENTERSCREEN_BUTTON_PLUS_DISABLED = u"sd/res/presenterscreen-ButtonPlusDisabled.png";
+
+inline constexpr OUStringLiteral BMP_EMBEDDED = u"sd/res/nv08.png";
+inline constexpr OUStringLiteral BMP_LINK = u"sd/res/nv09.png";
+inline constexpr OUStringLiteral BMP_HYPERLINK = u"sd/res/nv010.png";
+
+inline constexpr OUStringLiteral IMAGE_SHADOW = u"sd/res/slide_sorter_shadow.png";
+inline constexpr OUStringLiteral IMAGE_INSERT_SHADOW = u"sd/res/slide_sorter_insert_shadow.png";
+inline constexpr OUStringLiteral IMAGE_HIDE_SLIDE_OVERLAY = u"sd/res/slide_sorter_hide_slide_overlay.png";
+inline constexpr OUStringLiteral IMAGE_FOCUS_BORDER = u"sd/res/slide_sorter_focus_border.png";
+
+inline constexpr OUStringLiteral BMP_CUSTOMANIMATION_ON_CLICK = u"sd/res/click_16.png";
+inline constexpr OUStringLiteral BMP_CUSTOMANIMATION_AFTER_PREVIOUS = u"sd/res/time_16.png";
+inline constexpr OUStringLiteral BMP_CUSTOMANIMATION_ENTRANCE_EFFECT = u"sd/res/effect_16.png";
+inline constexpr OUStringLiteral BMP_CUSTOMANIMATION_EMPHASIS_EFFECT = u"sd/res/effectshape_16.png";
+inline constexpr OUStringLiteral BMP_CUSTOMANIMATION_EXIT_EFFECT = u"sd/res/effectfade_16.png";
+inline constexpr OUStringLiteral BMP_CUSTOMANIMATION_MOTION_PATH = u"sd/res/effectpath_16.png";
+inline constexpr OUStringLiteral BMP_CUSTOMANIMATION_OLE = u"sd/res/effectole_16.png";
+inline constexpr OUStringLiteral BMP_CUSTOMANIMATION_MEDIA_PLAY = u"sd/res/playblue_16.png";
+inline constexpr OUStringLiteral BMP_CUSTOMANIMATION_MEDIA_PAUSE = u"sd/res/breakplayingblue_16.png";
+inline constexpr OUStringLiteral BMP_CUSTOMANIMATION_MEDIA_STOP = u"sd/res/stopplayingblue_16.png";
+
+inline constexpr OUStringLiteral BMP_MENU_NEXT = u"cmd/sc_nextrecord.png";
+inline constexpr OUStringLiteral BMP_MENU_PREV = u"cmd/sc_prevrecord.png";
+inline constexpr OUStringLiteral BMP_MENU_FIRST = u"cmd/sc_firstrecord.png";
+inline constexpr OUStringLiteral BMP_MENU_LAST = u"cmd/sc_lastrecord.png";
+
+inline constexpr OUStringLiteral SFX_BMP_CLOSE_DOC = u"sfx2/res/closedoc.png";
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sd/inc/createpresentation.hxx b/sd/inc/createpresentation.hxx
new file mode 100644
index 000000000..b1c3016e4
--- /dev/null
+++ b/sd/inc/createpresentation.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <com/sun/star/uno/Reference.hxx>
+
+namespace com::sun::star::presentation
+{
+class XPresentation2;
+}
+class SdDrawDocument;
+
+css::uno::Reference<css::presentation::XPresentation2>
+CreatePresentation(SdDrawDocument const& rDocument);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/createunocustomshow.hxx b/sd/inc/createunocustomshow.hxx
new file mode 100644
index 000000000..334aa867a
--- /dev/null
+++ b/sd/inc/createunocustomshow.hxx
@@ -0,0 +1,30 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Reference.hxx>
+
+namespace com::sun::star::uno { class XInterface; }
+class SdCustomShow;
+
+css::uno::Reference<css::uno::XInterface> createUnoCustomShow(
+ SdCustomShow * pShow);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/createunopageimpl.hxx b/sd/inc/createunopageimpl.hxx
new file mode 100644
index 000000000..8707704c1
--- /dev/null
+++ b/sd/inc/createunopageimpl.hxx
@@ -0,0 +1,32 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Reference.hxx>
+
+namespace com::sun::star::uno
+{
+class XInterface;
+}
+class SdPage;
+
+css::uno::Reference<css::uno::XInterface> createUnoPageImpl(SdPage* pPage);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/cusshow.hxx b/sd/inc/cusshow.hxx
new file mode 100644
index 000000000..c0115c310
--- /dev/null
+++ b/sd/inc/cusshow.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 .
+ */
+
+#pragma once
+
+#include <vector>
+#include <cppuhelper/weakref.hxx>
+#include "sddllapi.h"
+
+class SdPage;
+
+class SD_DLLPUBLIC SdCustomShow final
+{
+public:
+ typedef ::std::vector<const SdPage*> PageVec;
+
+private:
+ PageVec maPages;
+ OUString aName;
+
+ // this is a weak reference to a possible living api wrapper for this custom show
+ css::uno::WeakReference<css::uno::XInterface> mxUnoCustomShow;
+
+public:
+ SdCustomShow();
+ SdCustomShow(css::uno::Reference<css::uno::XInterface> const& xShow);
+
+ ~SdCustomShow();
+
+ // @@@ copy ctor, but no copy assignment? @@@
+ SdCustomShow(const SdCustomShow& rShow);
+
+ SdCustomShow& operator=(const SdCustomShow& rShow) = delete;
+
+ /** Provides a direct access to the collection of the SdPage objects. */
+ PageVec& PagesVector() { return maPages; }
+ /**
+ * Replaces all occurrences of pOldPage with pNewPage.
+ * If pNewPage is 0 then removes all occurrences of pOldPage.
+ */
+ void ReplacePage(const SdPage* pOldPage, const SdPage* pNewPage);
+
+ void SetName(const OUString& rName);
+ const OUString& GetName() const { return aName; }
+
+ css::uno::Reference<css::uno::XInterface> getUnoCustomShow();
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/customshowlist.hxx b/sd/inc/customshowlist.hxx
new file mode 100644
index 000000000..8a1706ec2
--- /dev/null
+++ b/sd/inc/customshowlist.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "sddllapi.h"
+#include "cusshow.hxx"
+#include <vector>
+#include <memory>
+#include <algorithm>
+#include <cassert>
+
+class SD_DLLPUBLIC SdCustomShowList
+{
+private:
+ std::vector<std::unique_ptr<SdCustomShow>> mShows;
+ sal_uInt16 mnCurPos;
+public:
+ SdCustomShowList()
+ : mShows(), mnCurPos(0)
+ {
+ }
+
+ SdCustomShowList& operator=( SdCustomShowList const & ) = delete; // MSVC2017 workaround
+ SdCustomShowList( SdCustomShowList const & ) = delete; // MSVC2017 workaround
+
+ bool empty() const {return mShows.empty();}
+
+ size_t size() const {return mShows.size();}
+
+ std::unique_ptr<SdCustomShow>& operator[](size_t i) {return mShows[i];}
+
+ std::vector<std::unique_ptr<SdCustomShow>>::iterator begin() {return mShows.begin();}
+
+ void erase(std::vector<std::unique_ptr<SdCustomShow>>::iterator it);
+
+ void push_back(std::unique_ptr<SdCustomShow> p) {mShows.push_back(std::move(p));}
+
+ sal_uInt16 GetCurPos() const { return mnCurPos; }
+ void Seek(sal_uInt16 nNewPos) { mnCurPos = nNewPos; }
+
+ SdCustomShow* First()
+ {
+ if( mShows.empty() )
+ return nullptr;
+ mnCurPos = 0;
+ return mShows[mnCurPos].get();
+ }
+ SdCustomShow* Next()
+ {
+ ++mnCurPos;
+ return mnCurPos >= mShows.size() ? nullptr : mShows[mnCurPos].get();
+ }
+ void Last()
+ {
+ if( !mShows.empty() )
+ mnCurPos = mShows.size() - 1;
+ }
+ SdCustomShow* GetCurObject()
+ {
+ return mShows.empty() ? nullptr : mShows[mnCurPos].get();
+ }
+ void erase(const SdCustomShow* p)
+ {
+ auto it = std::find_if(mShows.begin(), mShows.end(),
+ [&] (std::unique_ptr<SdCustomShow> const &i) { return i.get() == p; });
+ assert( it != mShows.end() );
+ if( it != mShows.end() )
+ mShows.erase(it);
+ }
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/diadef.h b/sd/inc/diadef.h
new file mode 100644
index 000000000..6d0f9a266
--- /dev/null
+++ b/sd/inc/diadef.h
@@ -0,0 +1,30 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+enum class PresChange
+{
+ Manual = 0,
+ Auto = 1,
+ SemiAuto = 2,
+ LAST = SemiAuto
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/drawdoc.hxx b/sd/inc/drawdoc.hxx
new file mode 100644
index 000000000..a99c27c49
--- /dev/null
+++ b/sd/inc/drawdoc.hxx
@@ -0,0 +1,719 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/text/WritingMode.hpp>
+#include <svl/style.hxx>
+#include <svx/fmmodel.hxx>
+#include <vcl/prntypes.hxx>
+#include <xmloff/autolayout.hxx>
+
+#include <vector>
+#include <memory>
+#include <string_view>
+
+#include "sddllapi.h"
+#include "pres.hxx"
+
+namespace com::sun::star::xml::dom { class XNode; }
+namespace com::sun::star::uno { class XInterface; }
+namespace vcl { class Font; }
+namespace com::sun::star::presentation { class XPresentation2; }
+class SdOutliner;
+class Timer;
+class SfxObjectShell;
+class SdPage;
+class SdAnimationInfo;
+class SdStyleSheetPool;
+class SfxMedium;
+class SvxSearchItem;
+class EditStatus;
+class Point;
+class SdTransferable;
+struct SpellCallbackInfo;
+class SdCustomShowList;
+class SdUndoGroup;
+class SdrObject;
+class CharClass;
+class Idle;
+class ImageMap;
+class Outliner;
+class SdrModel;
+class SdrOutliner;
+class SdrPage;
+class SdrTextObj;
+class SfxItemPool;
+class Size;
+
+namespace sd
+{
+class DrawDocShell;
+#ifndef SV_DECL_DRAW_DOC_SHELL_DEFINED
+#define SV_DECL_DRAW_DOC_SHELL_DEFINED
+typedef ::tools::SvRef<DrawDocShell> DrawDocShellRef;
+#endif
+class UndoManager;
+class ShapeList;
+class FrameView;
+}
+
+class ImpDrawPageListWatcher;
+class ImpMasterPageListWatcher;
+
+struct StyleReplaceData
+{
+ SfxStyleFamily nFamily;
+ SfxStyleFamily nNewFamily;
+ OUString aName;
+ OUString aNewName;
+};
+
+enum class DocCreationMode
+{
+ New,
+ Loaded
+};
+
+namespace sd
+{
+ struct PresentationSettings
+ {
+ OUString maPresPage;
+ bool mbAll;
+ bool mbEndless;
+ bool mbCustomShow;
+ bool mbManual;
+ bool mbMouseVisible;
+ bool mbMouseAsPen;
+ bool mbLockedPages;
+ bool mbAlwaysOnTop;
+ bool mbFullScreen;
+ bool mbAnimationAllowed;
+ sal_Int32 mnPauseTimeout;
+ bool mbShowPauseLogo;
+ bool mbStartCustomShow;
+
+ PresentationSettings();
+ };
+}
+
+// SdDrawDocument
+class SD_DLLPUBLIC SdDrawDocument final : public FmFormModel
+{
+public:
+ SAL_DLLPRIVATE void setDocAccTitle( const OUString& rTitle ) { msDocAccTitle = rTitle; }
+ SAL_DLLPRIVATE const OUString& getDocAccTitle() const { return msDocAccTitle; }
+ SAL_DLLPRIVATE bool getDocReadOnly() const { return m_bReadOnly; }
+private:
+ OUString msDocAccTitle;
+ std::unique_ptr<SdOutliner>
+ mpOutliner; ///< local outliner for outline mode
+ std::unique_ptr<SdOutliner>
+ mpInternalOutliner; ///< internal outliner for creation of text objects
+ std::unique_ptr<Timer> mpWorkStartupTimer;
+ std::unique_ptr<Idle>
+ mpOnlineSpellingIdle;
+ std::unique_ptr<sd::ShapeList>
+ mpOnlineSpellingList;
+ std::unique_ptr<SvxSearchItem>
+ mpOnlineSearchItem;
+ std::vector<std::unique_ptr<sd::FrameView>>
+ maFrameViewList;
+ std::unique_ptr<SdCustomShowList> mpCustomShowList;
+ ::sd::DrawDocShell* mpDocSh;
+ SdTransferable * mpCreatingTransferable;
+ bool mbHasOnlineSpellErrors;
+ bool mbInitialOnlineSpellingEnabled;
+ OUString maBookmarkFile;
+ ::sd::DrawDocShellRef mxBookmarkDocShRef;
+
+ sd::PresentationSettings maPresentationSettings;
+
+ css::uno::Reference< css::presentation::XPresentation2 > mxPresentation;
+
+ bool mbNewOrLoadCompleted;
+
+ bool mbOnlineSpell;
+ bool mbSummationOfParagraphs;
+ bool mbStartWithPresentation; ///< is set to true when starting with command line parameter -start
+ bool mbExitAfterPresenting; ///< true if mbStartWithPresentation AND Presentation was shown fully
+ LanguageType meLanguage;
+ LanguageType meLanguageCJK;
+ LanguageType meLanguageCTL;
+ SvxNumType mePageNumType;
+ ::sd::DrawDocShellRef mxAllocedDocShRef; // => AllocModel()
+ bool mbAllocDocSh; // => AllocModel()
+ DocumentType meDocType;
+ std::unique_ptr<CharClass>
+ mpCharClass;
+
+ ::std::unique_ptr<ImpDrawPageListWatcher> mpDrawPageListWatcher;
+ ::std::unique_ptr<ImpMasterPageListWatcher> mpMasterPageListWatcher;
+
+ SAL_DLLPRIVATE void UpdatePageObjectsInNotes(sal_uInt16 nStartPos);
+ SAL_DLLPRIVATE void UpdatePageRelativeURLs(SdPage const * pPage, sal_uInt16 nPos, sal_Int32 nIncrement);
+ SAL_DLLPRIVATE void FillOnlineSpellingList(SdPage const * pPage);
+ SAL_DLLPRIVATE void SpellObject(SdrTextObj* pObj);
+
+ DECL_DLLPRIVATE_LINK(WorkStartupHdl, Timer *, void);
+ DECL_DLLPRIVATE_LINK(OnlineSpellingHdl, Timer *, void);
+ DECL_DLLPRIVATE_LINK(OnlineSpellEventHdl, EditStatus&, void);
+
+ std::vector< OUString > maAnnotationAuthors;
+ std::vector<css::uno::Reference< css::xml::dom::XNode> > maLayoutInfo;
+
+ std::vector<css::uno::Reference< css::xml::dom::XNode> > maPresObjectInfo;
+
+ bool mbEmbedFonts : 1;
+ bool mbEmbedUsedFontsOnly : 1;
+ bool mbEmbedFontScriptLatin : 1;
+ bool mbEmbedFontScriptAsian : 1;
+ bool mbEmbedFontScriptComplex : 1;
+
+ sal_Int32 mnImagePreferredDPI;
+
+ SAL_DLLPRIVATE virtual css::uno::Reference< css::uno::XInterface > createUnoModel() override;
+
+public:
+
+
+ SAL_DLLPRIVATE SdDrawDocument(DocumentType eType, SfxObjectShell* pDocSh);
+ SAL_DLLPRIVATE virtual ~SdDrawDocument() override;
+
+ // Adapt to given Size and Borders scaling all contained data, maybe
+ // including PresObj's in higher derivations
+ virtual void adaptSizeAndBorderForAllPages(
+ const Size& rNewSize,
+ tools::Long nLeft = 0,
+ tools::Long nRight = 0,
+ tools::Long nUpper = 0,
+ tools::Long nLower = 0) override;
+
+ // Adapt PageSize for all Pages of PageKind ePageKind. Also
+ // set Borders to left/right/upper/lower, ScaleAll, Orientation,
+ // PaperBin and BackgroundFullSize. Create Undo-Actions when
+ // a SdUndoGroup is given (then used from the View probably)
+ void AdaptPageSizeForAllPages(
+ const Size& rNewSize,
+ PageKind ePageKind,
+ SdUndoGroup* pUndoGroup = nullptr,
+ tools::Long nLeft = 0,
+ tools::Long nRight = 0,
+ tools::Long nUpper = 0,
+ tools::Long nLower = 0,
+ bool bScaleAll = false,
+ Orientation eOrientation = Orientation::Landscape,
+ sal_uInt16 nPaperBin = 0,
+ bool bBackgroundFullSize = false);
+
+ SAL_DLLPRIVATE SdDrawDocument* AllocSdDrawDocument() const;
+ SAL_DLLPRIVATE virtual SdrModel* AllocModel() const override; //forwards to AllocSdDrawDocument
+
+ SAL_DLLPRIVATE rtl::Reference<SdPage> AllocSdPage(bool bMasterPage);
+ SAL_DLLPRIVATE virtual rtl::Reference<SdrPage> AllocPage(bool bMasterPage) override; //forwards to AllocSdPage
+
+ SAL_DLLPRIVATE virtual bool IsReadOnly() const override;
+ SAL_DLLPRIVATE virtual void SetChanged(bool bFlag = true) override;
+
+ SAL_DLLPRIVATE SfxItemPool& GetPool() { return( *m_pItemPool ); }
+
+ SAL_DLLPRIVATE SdOutliner* GetOutliner(bool bCreateOutliner=true);
+ SdOutliner* GetInternalOutliner(bool bCreateOutliner=true);
+
+ SAL_DLLPRIVATE ::sd::DrawDocShell* GetDocSh() const { return mpDocSh; }
+
+ SAL_DLLPRIVATE LanguageType GetLanguage( const sal_uInt16 nId ) const;
+ SAL_DLLPRIVATE void SetLanguage( const LanguageType eLang, const sal_uInt16 nId );
+
+ SAL_DLLPRIVATE SvxNumType GetPageNumType() const override;
+ SAL_DLLPRIVATE void SetPageNumType(SvxNumType eType) { mePageNumType = eType; }
+ OUString CreatePageNumValue(sal_uInt16 nNum) const;
+
+ SAL_DLLPRIVATE DocumentType GetDocumentType() const { return meDocType; }
+
+ SAL_DLLPRIVATE void SetAllocDocSh(bool bAlloc);
+
+ SAL_DLLPRIVATE void CreatingDataObj( SdTransferable* pTransferable ) { mpCreatingTransferable = pTransferable; }
+ SAL_DLLPRIVATE virtual bool IsCreatingDataObj() const override { return mpCreatingTransferable != nullptr; }
+
+ /** if the document does not contain at least one handout, one slide and one notes page with
+ at least one master each this methods creates them.
+ If a reference document is given, the sizes and border settings of that document are used
+ for newly created slides.
+ */
+ void CreateFirstPages( SdDrawDocument const * pRefDocument = nullptr );
+ bool CreateMissingNotesAndHandoutPages();
+
+ SAL_DLLPRIVATE void MovePage(sal_uInt16 nPgNum, sal_uInt16 nNewPos) override;
+ SAL_DLLPRIVATE void InsertPage(SdrPage* pPage, sal_uInt16 nPos=0xFFFF) override;
+ SAL_DLLPRIVATE void DeletePage(sal_uInt16 nPgNum) override;
+ SAL_DLLPRIVATE rtl::Reference<SdrPage> RemovePage(sal_uInt16 nPgNum) override;
+
+ SAL_DLLPRIVATE virtual void InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos=0xFFFF) override;
+ SAL_DLLPRIVATE virtual rtl::Reference<SdrPage> RemoveMasterPage(sal_uInt16 nPgNum) override;
+
+ SAL_DLLPRIVATE void RemoveUnnecessaryMasterPages( SdPage* pMaster=nullptr, bool bOnlyDuplicatePages=false, bool bUndo=true );
+ void SetMasterPage(sal_uInt16 nSdPageNum, std::u16string_view rLayoutName,
+ SdDrawDocument* pSourceDoc, bool bMaster, bool bCheckMasters);
+
+ SdDrawDocument* OpenBookmarkDoc(const OUString& rBookmarkFile);
+ SAL_DLLPRIVATE SdDrawDocument* OpenBookmarkDoc(SfxMedium* pMedium);
+
+ SAL_DLLPRIVATE void InsertBookmark(const std::vector<OUString> &rBookmarkList,
+ std::vector<OUString> &rExchangeList, bool bLink,
+ sal_uInt16 nPgPos,
+ ::sd::DrawDocShell* pBookmarkDocSh,
+ Point const * pObjPos);
+
+ SAL_DLLPRIVATE bool IsStartWithPresentation() const { return mbStartWithPresentation;}
+ SAL_DLLPRIVATE void SetStartWithPresentation( bool bStartWithPresentation );
+
+ SAL_DLLPRIVATE bool IsExitAfterPresenting() const { return mbExitAfterPresenting;}
+ SAL_DLLPRIVATE void SetExitAfterPresenting( bool bExitAfterPresenting );
+
+ /// load xml-based impress layout definitions into document
+ SAL_DLLPRIVATE void InitLayoutVector();
+ /// return reference to vector of Impress layout definitions
+ SAL_DLLPRIVATE const std::vector<css::uno::Reference< css::xml::dom::XNode> >& GetLayoutVector() const
+ { return maLayoutInfo; }
+
+ /// load xml-based impress master presentation object definitions into document
+ SAL_DLLPRIVATE void InitObjectVector();
+ /// return reference to vector of master presentation object definitions
+ SAL_DLLPRIVATE const std::vector<css::uno::Reference<css::xml::dom::XNode> >& GetObjectVector() const { return maPresObjectInfo; }
+ /** Insert pages into this document
+
+ This method inserts whole pages into this document, either
+ selected ones (specified via pBookmarkList/pExchangeList), or
+ all from the source document.
+
+ @attention Beware! This method in its current state does not
+ handle all combinations of their input parameters
+ correctly. For example, for pBookmarkList=NULL, bReplace=true
+ is ignored (no replace happens).
+
+ @param pBookmarkList
+ A list of strings, denoting the names of the pages to be copied
+
+ @param pExchangeList
+ A list of strings, denoting the names of the pages to be renamed
+
+ @param bLink
+ Whether the inserted pages should be linked to the bookmark document
+
+ @param bReplace
+ Whether the pages should not be inserted, but replace the pages in
+ the destination document
+
+ @param nPgPos
+ Insertion point/start of replacement
+
+ @param bNoDialogs
+ Whether query dialogs are allowed (e.g. for page scaling)
+
+ @param pBookmarkDocSh
+ DocShell of the source document (used e.g. to extract the filename
+ for linked pages)
+
+ @param bCopy
+ Whether the source document should be treated as immutable (i.e.
+ inserted pages are not removed from it, but cloned)
+
+ @param bMergeMasterPages
+ Whether the source document's master pages should be copied, too.
+
+ @param bPreservePageNames
+ Whether the replace operation should take the name from the new
+ page, or preserve the old name
+ */
+
+ SAL_DLLPRIVATE bool InsertBookmarkAsPage(const std::vector<OUString> &rBookmarkList,
+ std::vector<OUString> *pExchangeList,
+ bool bLink, bool bReplace, sal_uInt16 nPgPos,
+ bool bNoDialogs, ::sd::DrawDocShell* pBookmarkDocSh,
+ bool bCopy, bool bMergeMasterPages,
+ bool bPreservePageNames);
+
+ SAL_DLLPRIVATE bool InsertBookmarkAsObject(const std::vector<OUString> &rBookmarkList,
+ const std::vector<OUString> &rExchangeList,
+ ::sd::DrawDocShell* pBookmarkDocSh,
+ Point const * pObjPos, bool bCalcObjCount);
+
+ void CloseBookmarkDoc();
+
+ SAL_DLLPRIVATE SdrObject* GetObj(std::u16string_view rObjName) const;
+
+ /** Return the first page that has the given name. Regular pages and
+ notes pages are searched first. When not found then the master
+ pages are searched.
+ @param rPgName
+ Name of the page to return.
+ @param rbIsMasterPage
+ Is set by the method to indicate whether the returned index
+ belongs to a master page (<TRUE/>) or a regular or notes page
+ (<FALSE/>). The given value is ignored.
+ @return
+ Returns the index of the page with the given name or
+ SDRPAGE_NOTFOUND (=0xffff) when such a page does not exist.
+ */
+ SAL_DLLPRIVATE sal_uInt16 GetPageByName(std::u16string_view rPgName, bool& rbIsMasterPage ) const;
+ /** checks, if the given name is a *unique* name for an *existing* slide
+
+ @param rPageName the name of an existing slide
+
+ @return true, if the name is unique and the slide exists
+ */
+ bool IsPageNameUnique( std::u16string_view rPageName ) const;
+ SdPage*GetSdPage(sal_uInt16 nPgNum, PageKind ePgKind) const;
+ sal_uInt16 GetSdPageCount(PageKind ePgKind) const;
+
+ SAL_DLLPRIVATE void SetSelected(SdPage* pPage, bool bSelect);
+ SAL_DLLPRIVATE void UnselectAllPages();
+ SAL_DLLPRIVATE bool MovePages(sal_uInt16 nTargetPage);
+
+ SdPage*GetMasterSdPage(sal_uInt16 nPgNum, PageKind ePgKind);
+ sal_uInt16 GetMasterSdPageCount(PageKind ePgKind) const;
+
+ sal_uInt16 GetActiveSdPageCount() const;
+
+ SAL_DLLPRIVATE sal_uInt16 GetMasterPageUserCount(SdrPage const * pMaster) const;
+
+ SAL_DLLPRIVATE const sd::PresentationSettings& getPresentationSettings() const { return maPresentationSettings; }
+ SAL_DLLPRIVATE sd::PresentationSettings& getPresentationSettings() { return maPresentationSettings; }
+
+ SAL_DLLPRIVATE const css::uno::Reference< css::presentation::XPresentation2 >& getPresentation() const;
+
+ SAL_DLLPRIVATE void SetSummationOfParagraphs( bool bOn = true ) { mbSummationOfParagraphs = bOn; }
+ SAL_DLLPRIVATE bool IsSummationOfParagraphs() const { return mbSummationOfParagraphs; }
+
+ /** Set the mode that controls whether (and later how) the formatting of the document
+ depends on the current printer metrics.
+ @param nMode
+ Use <const
+ scope="css::document::PrinterIndependentLayout">ENABLED</const>
+ to make formatting printer-independent and <const
+ scope="css::document::PrinterIndependentLayout">DISABLED</const>
+ to make formatting depend on the current printer metrics.
+ */
+ SAL_DLLPRIVATE void SetPrinterIndependentLayout (sal_Int32 nMode);
+
+ /** Get the flag that controls whether the formatting of the document
+ depends on the current printer metrics.
+ @return
+ Use <const
+ scope="css::document::PrinterIndependentLayout">ENABLED</const>
+ when formatting is printer-independent and <const
+ scope="css::document::PrinterIndependentLayout">DISABLED</const>
+ when formatting depends on the current printer metrics.
+ */
+ SAL_DLLPRIVATE sal_Int32 GetPrinterIndependentLayout() const { return mnPrinterIndependentLayout;}
+
+ SAL_DLLPRIVATE void SetOnlineSpell( bool bIn );
+ SAL_DLLPRIVATE bool GetOnlineSpell() const { return mbOnlineSpell; }
+ SAL_DLLPRIVATE void StopOnlineSpelling();
+ SAL_DLLPRIVATE void StartOnlineSpelling(bool bForceSpelling=true);
+
+ SAL_DLLPRIVATE void ImpOnlineSpellCallback(SpellCallbackInfo const * pInfo, SdrObject* pObj, SdrOutliner const * pOutl);
+
+ SAL_DLLPRIVATE void InsertObject(SdrObject* pObj);
+ SAL_DLLPRIVATE void RemoveObject(SdrObject* pObj);
+
+ SAL_DLLPRIVATE sal_uLong GetLinkCount() const;
+
+ SAL_DLLPRIVATE std::vector<std::unique_ptr<sd::FrameView>>& GetFrameViewList() { return maFrameViewList; }
+ SdCustomShowList* GetCustomShowList(bool bCreate = false);
+
+ SAL_DLLPRIVATE void NbcSetChanged(bool bFlag);
+
+ SAL_DLLPRIVATE void SetTextDefaults() const;
+
+ SAL_DLLPRIVATE void CreateLayoutTemplates();
+ SAL_DLLPRIVATE void RenameLayoutTemplate(const OUString& rOldLayoutName, const OUString& rNewName);
+
+ SAL_DLLPRIVATE void CreateDefaultCellStyles();
+
+ void StopWorkStartupDelay();
+
+ SAL_DLLPRIVATE void NewOrLoadCompleted(DocCreationMode eMode);
+ SAL_DLLPRIVATE void NewOrLoadCompleted( SdPage* pPage, SdStyleSheetPool* pSPool );
+ SAL_DLLPRIVATE bool IsNewOrLoadCompleted() const {return mbNewOrLoadCompleted; }
+
+ SAL_DLLPRIVATE ::sd::FrameView* GetFrameView(sal_uLong nPos) {
+ return nPos < maFrameViewList.size() ? maFrameViewList[nPos].get() : nullptr; }
+
+ /** deprecated*/
+ SAL_DLLPRIVATE static SdAnimationInfo* GetAnimationInfo(SdrObject* pObject);
+
+ static SdAnimationInfo* GetShapeUserData(SdrObject& rObject, bool bCreate = false );
+
+ SAL_DLLPRIVATE CharClass* GetCharClass() const { return mpCharClass.get(); }
+
+ SAL_DLLPRIVATE void UpdateAllLinks();
+
+ SAL_DLLPRIVATE void CheckMasterPages();
+
+ SAL_DLLPRIVATE void Merge(SdrModel& rSourceModel,
+ sal_uInt16 nFirstPageNum, sal_uInt16 nLastPageNum,
+ sal_uInt16 nDestPos,
+ bool bMergeMasterPages, bool bAllMasterPages,
+ bool bUndo = true, bool bTreadSourceAsConst = false) override;
+
+ css::text::WritingMode GetDefaultWritingMode() const;
+ SAL_DLLPRIVATE void SetDefaultWritingMode( css::text::WritingMode eMode );
+
+ /** replacespOldPage from all custom shows with pNewPage or removes pOldPage from
+ all custom shows if pNewPage is 0.
+ */
+ SAL_DLLPRIVATE void ReplacePageInCustomShows( const SdPage* pOldPage, const SdPage* pNewPage );
+
+public:
+
+ /// static to prevent recursions while resolving links
+ SAL_DLLPRIVATE static SdDrawDocument* s_pDocLockedInsertingLinks;
+
+ /** Create and insert a set of two new pages: a standard (draw) page and
+ the associated notes page. The new pages are inserted directly
+ after the specified page set.
+ @param pCurrentPage
+ This page is used to retrieve the layout for the page to
+ create.
+ @param ePageKind
+ This specifies whether <argument>pCurrentPage</argument> is a
+ standard (draw) page or a notes page.
+ @param sStandardPageName
+ Name of the standard page. An empty string leads to using an
+ automatically created name.
+ @param sNotesPageName
+ Name of the standard page. An empty string leads to using an
+ automatically created name.
+ @param eStandardLayout
+ Layout to use for the new standard page. Note that this layout
+ is not used when the given <argument>pCurrentPage</argument> is
+ not a standard page. In this case the layout is taken from the
+ standard page associated with <argument>pCurrentPage</argument>.
+ @param eNotesLayout
+ Layout to use for the new notes page. Note that this layout
+ is not used when the given <argument>pCurrentPage</argument> is
+ not a notes page. In this case the layout is taken from the
+ notes page associated with <argument>pCurrentPage</argument>.
+ @param bIsPageBack
+ This flag indicates whether to show the background shape.
+ @param bIsPageObj
+ This flag indicates whether to show the shapes on the master page.
+ @param nInsertPosition
+ Position where to insert the standard page. When -1 then the
+ new page set is inserted after the current page.
+
+ @return
+ Returns an index of the inserted pages that can be used with the
+ <member>GetSdPage()</member> method.
+ */
+ SAL_DLLPRIVATE sal_uInt16 CreatePage (
+ SdPage* pCurrentPage,
+ PageKind ePageKind,
+ const OUString& sStandardPageName,
+ const OUString& sNotesPageName,
+ AutoLayout eStandardLayout,
+ AutoLayout eNotesLayout,
+ bool bIsPageBack,
+ bool bIsPageObj,
+ const sal_Int32 nInsertPosition);
+
+ /** This method acts as a simplified front end for the more complex
+ <member>DuplicatePage()</member> method.
+ @param nPageNum
+ The page number as passed to the <member>GetSdPage()</member>
+ method for which the standard page and the notes page are to be
+ copied.
+ @return
+ Returns an index of the inserted pages that can be used with the
+ <member>GetSdPage()</member> method.
+ */
+ SAL_DLLPRIVATE sal_uInt16 DuplicatePage (sal_uInt16 nPageNum);
+
+ /** Create and insert a set of two new pages that are copies of the
+ given <argument>pCurrentPage</argument> and its associated notes
+ resp. standard page. The copies are inserted directly after the
+ specified page set.
+ @param pCurrentPage
+ This page and its associated notes/standard page is copied.
+ @param ePageKind
+ This specifies whether <argument>pCurrentPage</argument> is a
+ standard (draw) page or a notes page.
+ @param sStandardPageName
+ Name of the standard page. An empty string leads to using an
+ automatically created name.
+ @param sNotesPageName
+ Name of the standard page. An empty string leads to using an
+ automatically created name.
+ @param bIsPageBack
+ This flag indicates whether to show the background shape.
+ @param bIsPageObj
+ This flag indicates whether to show the shapes on the master page.
+ @param nInsertPosition
+ Position where to insert the standard page. When -1 then the
+ new page set is inserted after the current page.
+
+ @return
+ Returns an index of the inserted pages that can be used with the
+ <member>GetSdPage()</member> method.
+ */
+ SAL_DLLPRIVATE sal_uInt16 DuplicatePage (
+ SdPage* pCurrentPage,
+ PageKind ePageKind,
+ const OUString& sStandardPageName,
+ const OUString& sNotesPageName,
+ bool bIsPageBack,
+ bool bIsPageObj,
+ const sal_Int32 nInsertPosition);
+
+ /** return the document fonts for latin, cjk and ctl according to the current
+ languages set at this document */
+ SAL_DLLPRIVATE void getDefaultFonts( vcl::Font& rLatinFont, vcl::Font& rCJKFont, vcl::Font& rCTLFont );
+
+ sd::UndoManager* GetUndoManager() const;
+
+ /** converts the given western font height to a corresponding ctl font height, depending on the system language */
+ SAL_DLLPRIVATE static sal_uInt32 convertFontHeightToCTL( sal_uInt32 nWesternFontHeight );
+
+ /** Get the style sheet pool if it was a SdStyleSheetPool.
+ */
+ SdStyleSheetPool* GetSdStyleSheetPool() const;
+
+ SAL_DLLPRIVATE void UpdatePageRelativeURLs(
+ const OUString& rOldName, std::u16string_view rNewName);
+
+ SAL_DLLPRIVATE static void SetCalcFieldValueHdl( ::Outliner* pOutliner);
+
+ SAL_DLLPRIVATE sal_uInt16 GetAnnotationAuthorIndex( const OUString& rAuthor );
+
+ SAL_DLLPRIVATE bool IsEmbedFonts() const { return mbEmbedFonts; }
+ SAL_DLLPRIVATE bool IsEmbedUsedFontsOnly() const { return mbEmbedUsedFontsOnly; }
+ SAL_DLLPRIVATE bool IsEmbedFontScriptLatin() const { return mbEmbedFontScriptLatin; }
+ SAL_DLLPRIVATE bool IsEmbedFontScriptAsian() const { return mbEmbedFontScriptAsian; }
+ SAL_DLLPRIVATE bool IsEmbedFontScriptComplex() const { return mbEmbedFontScriptComplex; }
+
+ SAL_DLLPRIVATE void SetEmbedFonts(bool bUse) { mbEmbedFonts = bUse; }
+ SAL_DLLPRIVATE void SetEmbedUsedFontsOnly(bool bUse) { mbEmbedUsedFontsOnly = bUse; }
+ SAL_DLLPRIVATE void SetEmbedFontScriptLatin(bool bUse) { mbEmbedFontScriptLatin = bUse; }
+ SAL_DLLPRIVATE void SetEmbedFontScriptAsian(bool bUse) { mbEmbedFontScriptAsian = bUse; }
+ SAL_DLLPRIVATE void SetEmbedFontScriptComplex(bool bUse) { mbEmbedFontScriptComplex = bUse; }
+
+ sal_Int32 getImagePreferredDPI() const override { return mnImagePreferredDPI; }
+ void setImagePreferredDPI(sal_Int32 nValue) { mnImagePreferredDPI = nValue; }
+
+ void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+
+private:
+ /** This member stores the printer independent layout mode. Please
+ refer to <member>SetPrinterIndependentLayout()</member> for its
+ values.
+ */
+ sal_Int32 mnPrinterIndependentLayout;
+
+ /** Insert a given set of standard and notes page after the given <argument>pCurrentPage</argument>.
+ @param pCurrentPage
+ This page and its associated notes/standard page is copied.
+ @param ePageKind
+ This specifies whether <argument>pCurrentPage</argument> is a
+ standard (draw) page or a notes page.
+ @param sStandardPageName
+ Name of the standard page. An empty string leads to using an
+ automatically created name.
+ @param sNotesPageName
+ Name of the standard page. An empty string leads to using an
+ automatically created name.
+ @param bIsPageBack
+ This flag indicates whether to show the background shape.
+ @param bIsPageObj
+ This flag indicates whether to show the shapes on the master page.
+ @param pStandardPage
+ The standard page to insert.
+ @param pNotesPage
+ The notes page to insert.
+ @param nInsertPosition
+ Position where to insert the standard page. When -1 then the
+ new page set is inserted after the current page.
+
+ @return
+ Returns an index of the inserted pages that can be used with the
+ <member>GetSdPage()</member> method.
+ */
+ SAL_DLLPRIVATE sal_uInt16 InsertPageSet (
+ SdPage* pCurrentPage,
+ PageKind ePageKind,
+ const OUString& sStandardPageName,
+ const OUString& sNotesPageName,
+ bool bIsPageBack,
+ bool bIsPageObj,
+ SdPage* pStandardPage,
+ SdPage* pNotesPage,
+ sal_Int32 nInsertPosition);
+
+ /** Set up a newly created page and insert it into the list of pages.
+ @param pPreviousPage
+ A page to take the size and border geometry from.
+ @param pPage
+ This is the page to set up and insert.
+ @param sPageName
+ The name of the new page.
+ @param nInsertionPoint
+ Index of the page before which the new page will be inserted.
+ @param bIsPageBack
+ This flag indicates whether to show the background shape.
+ @param bIsPageObj
+ This flag indicates whether to show the shapes on the master
+ page.
+ */
+ SAL_DLLPRIVATE void SetupNewPage (
+ SdPage const * pPreviousPage,
+ SdPage* pPage,
+ const OUString& sPageName,
+ sal_uInt16 nInsertionPoint,
+ bool bIsPageBack,
+ bool bIsPageObj);
+
+ SAL_DLLPRIVATE virtual void PageListChanged() override;
+ SAL_DLLPRIVATE virtual void MasterPageListChanged() override;
+};
+
+namespace sd
+{
+
+/**an instance of this guard disables modification of a document
+ during its lifetime*/
+class ModifyGuard
+{
+public:
+ ModifyGuard( SdDrawDocument* pDoc );
+ ~ModifyGuard();
+
+private:
+ void init();
+
+ DrawDocShell* mpDocShell;
+ SdDrawDocument* mpDoc;
+ bool mbIsEnableSetModified;
+ bool mbIsDocumentChanged;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/errhdl.hrc b/sd/inc/errhdl.hrc
new file mode 100644
index 000000000..ea7d4e712
--- /dev/null
+++ b/sd/inc/errhdl.hrc
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#define NC_(Context, String) TranslateId(Context, reinterpret_cast<char const *>(u8##String))
+
+#include <svtools/ehdl.hxx>
+#include <vcl/errcode.hxx>
+#include "sderror.hxx"
+
+const ErrMsgCode RID_SD_ERRHDL[] =
+{
+ { NC_("RID_SD_ERRHDL", "File format error found at $(ARG1)(row,col)."),
+ ERR_FORMAT_ROWCOL },
+ { NC_("RID_SD_ERRHDL", "Format error discovered in the file in sub-document $(ARG1) at position $(ARG2)(row,col)."),
+ ERR_FORMAT_FILE_ROWCOL },
+ { NC_("RID_SD_ERRHDL", "Format error discovered in the file in sub-document $(ARG1) at position $(ARG2)(row,col)."),
+ WARN_FORMAT_FILE_ROWCOL },
+ { {}, ERRCODE_NONE }
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/fadedef.h b/sd/inc/fadedef.h
new file mode 100644
index 000000000..84100f944
--- /dev/null
+++ b/sd/inc/fadedef.h
@@ -0,0 +1,28 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+// has to be adjusted!
+#define FADE_EFFECT_COUNT 57
+
+// has to be adjusted!
+#define FADE_SPEED_COUNT 3
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/family.hrc b/sd/inc/family.hrc
new file mode 100644
index 000000000..ad2617a30
--- /dev/null
+++ b/sd/inc/family.hrc
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <svl/style.hxx>
+#include <unotools/resmgr.hxx>
+
+#define NC_(Context, String) TranslateId(Context, reinterpret_cast<char const *>(u8##String))
+
+const std::pair<TranslateId, SfxStyleSearchBits> RID_GRAPHICSTYLEFAMILY[] =
+{
+ { NC_("RID_GRAPHICSTYLEFAMILY", "All Styles") , SfxStyleSearchBits::AllVisible },
+ { NC_("RID_GRAPHICSTYLEFAMILY", "Hidden Styles") , SfxStyleSearchBits::Hidden },
+ { NC_("RID_GRAPHICSTYLEFAMILY", "Applied Styles") , SfxStyleSearchBits::Used },
+ { NC_("RID_GRAPHICSTYLEFAMILY", "Custom Styles") , SfxStyleSearchBits::UserDefined },
+ { {}, SfxStyleSearchBits::Auto }
+};
+
+const std::pair<TranslateId, SfxStyleSearchBits> RID_PRESENTATIONSTYLEFAMILY[] =
+{
+ { NC_("RID_PRESENTATIONSTYLEFAMILY", "All Styles") , SfxStyleSearchBits::AllVisible },
+ { NC_("RID_PRESENTATIONSTYLEFAMILY", "Hidden Styles") , SfxStyleSearchBits::Hidden },
+ { {}, SfxStyleSearchBits::Auto }
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/glob.hxx b/sd/inc/glob.hxx
new file mode 100644
index 000000000..6ecfc3fd3
--- /dev/null
+++ b/sd/inc/glob.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <rtl/ustring.hxx>
+
+#define SD_IF_SDAPP SFX_INTERFACE_SD_START + SfxInterfaceId(0)
+#define SD_IF_SDDRAWDOCSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(1)
+#define SD_IF_SDDRAWVIEWSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(3)
+#define SD_IF_SDOUTLINEVIEWSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(5)
+#define SD_IF_SDDRAWTEXTOBJECTBAR SFX_INTERFACE_SD_START + SfxInterfaceId(7)
+#define SD_IF_SDDRAWBEZIEROBJECTBAR SFX_INTERFACE_SD_START + SfxInterfaceId(8)
+#define SD_IF_SDGRAPHICDOCSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(10)
+#define SD_IF_SDGRAPHICVIEWSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(11)
+#define SD_IF_SDDRAWGRAFOBJECTBAR SFX_INTERFACE_SD_START + SfxInterfaceId(13)
+#define SD_IF_SDPRESVIEWSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(14)
+#define SD_IF_SDVIEWSHELLBASE SFX_INTERFACE_SD_START + SfxInterfaceId(16)
+#define SD_IF_SDSLIDESORTERVIEWSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(19)
+#define SD_IF_SDDRAWMEDIAOBJECTBAR SFX_INTERFACE_SD_START + SfxInterfaceId(23)
+#define SD_IF_SDLEFTIMPRESSPANESHELL SFX_INTERFACE_SD_START + SfxInterfaceId(24)
+#define SD_IF_SDLEFTDRAWPANESHELL SFX_INTERFACE_SD_START + SfxInterfaceId(25)
+#define SD_IF_SDDRAWTABLEOBJECTBAR SFX_INTERFACE_SD_START + SfxInterfaceId(27)
+#define SD_IF_SDTOOLPANELPANESHELL SFX_INTERFACE_SD_START + SfxInterfaceId(29)
+#define SD_IF_SDTOOLPANELSHELL SFX_INTERFACE_SD_START + SfxInterfaceId(30)
+
+
+// Object-Ids for StarDraw UserData
+#define SD_ANIMATIONINFO_ID 1
+// SVX_IMAPINFO_ID = 2
+
+// Separator between layout name and template name of presentation templates
+inline constexpr OUStringLiteral SD_LT_SEPARATOR = u"~LT~";
+
+// option-stream identifier
+#define SD_OPTION_MORPHING u"Morph"
+#define SD_OPTION_VECTORIZE u"Vectorize"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/helper/simplereferencecomponent.hxx b/sd/inc/helper/simplereferencecomponent.hxx
new file mode 100644
index 000000000..89e43639e
--- /dev/null
+++ b/sd/inc/helper/simplereferencecomponent.hxx
@@ -0,0 +1,63 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <osl/interlck.h>
+
+namespace sd
+{
+/** A simple base implementation for reference-counted components.
+ acts like sal::SimpleReferenceObject but calls the virtual disposing()
+ methods before the ref count switches from 1 to zero.
+ */
+class SimpleReferenceComponent
+{
+public:
+ SimpleReferenceComponent();
+
+ /** @ATTENTION
+ The results are undefined if, for any individual instance of
+ SimpleReferenceComponent, the total number of calls to acquire() exceeds
+ the total number of calls to release() by a platform dependent amount
+ (which, hopefully, is quite large).
+ */
+ void acquire();
+ void release();
+
+ void Dispose();
+
+ bool isDisposed() const { return mbDisposed; }
+
+protected:
+ virtual void disposing();
+
+ virtual ~SimpleReferenceComponent();
+
+private:
+ oslInterlockedCount m_nCount;
+
+ SimpleReferenceComponent(SimpleReferenceComponent const&) = delete;
+ void operator=(SimpleReferenceComponent const&) = delete;
+
+ bool mbDisposed;
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/helpids.h b/sd/inc/helpids.h
new file mode 100644
index 000000000..18e898ee7
--- /dev/null
+++ b/sd/inc/helpids.h
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <rtl/string.hxx>
+
+inline constexpr OStringLiteral HID_SDDRAWVIEWSHELL = "SD_HID_SDDRAWVIEWSHELL";
+inline constexpr OStringLiteral HID_SDGRAPHICVIEWSHELL = "SD_HID_SDGRAPHICVIEWSHELL";
+inline constexpr OStringLiteral HID_SDOUTLINEVIEWSHELL = "SD_HID_SDOUTLINEVIEWSHELL";
+
+inline constexpr OStringLiteral HID_SD_WIN_PRESENTATION = "SD_HID_SD_WIN_PRESENTATION";
+
+#define HID_SD_HTMLEXPORT_PAGE1 "SD_HID_SD_HTMLEXPORT_PAGE1"
+#define HID_SD_HTMLEXPORT_PAGE2 "SD_HID_SD_HTMLEXPORT_PAGE2"
+#define HID_SD_HTMLEXPORT_PAGE3 "SD_HID_SD_HTMLEXPORT_PAGE3"
+#define HID_SD_HTMLEXPORT_PAGE4 "SD_HID_SD_HTMLEXPORT_PAGE4"
+#define HID_SD_HTMLEXPORT_PAGE5 "SD_HID_SD_HTMLEXPORT_PAGE5"
+#define HID_SD_HTMLEXPORT_PAGE6 "SD_HID_SD_HTMLEXPORT_PAGE6"
+
+inline constexpr OStringLiteral HID_SD_TABBAR_PAGES = "SD_HID_SD_TABBAR_PAGES";
+inline constexpr OStringLiteral HID_SD_TABBAR_LAYERS = "SD_HID_SD_TABBAR_LAYERS";
+
+inline constexpr OStringLiteral HID_SD_NAMEDIALOG_OBJECT = "SD_HID_SD_NAMEDIALOG_OBJECT";
+inline constexpr OStringLiteral HID_SD_NAMEDIALOG_PAGE = "SD_HID_SD_NAMEDIALOG_PAGE";
+inline constexpr OStringLiteral HID_SD_NAMEDIALOG_LINEEND = "SD_HID_SD_NAMEDIALOG_LINEEND";
+
+inline constexpr OStringLiteral HID_SD_TASK_PANE_PREVIEW_CURRENT = "SD_HID_SD_TASK_PANE_PREVIEW_CURRENT";
+inline constexpr OStringLiteral HID_SD_TASK_PANE_PREVIEW_RECENT = "SD_HID_SD_TASK_PANE_PREVIEW_RECENT";
+inline constexpr OStringLiteral HID_SD_TASK_PANE_PREVIEW_ALL = "SD_HID_SD_TASK_PANE_PREVIEW_ALL";
+inline constexpr OStringLiteral HID_SD_TASK_PANE_PREVIEW_LAYOUTS = "SD_HID_SD_TASK_PANE_PREVIEW_LAYOUTS";
+
+inline constexpr OStringLiteral HID_SD_CUSTOMANIMATIONPANE_PRESETPROPERTYBOX = "SD_HID_SD_CUSTOMANIMATIONPANE_PRESETPROPERTYBOX";
+inline constexpr OStringLiteral HID_SD_CUSTOMANIMATIONPANE_COLORPROPERTYBOX = "SD_HID_SD_CUSTOMANIMATIONPANE_COLORPROPERTYBOX";
+inline constexpr OStringLiteral HID_SD_CUSTOMANIMATIONPANE_FONTPROPERTYBOX = "SD_HID_SD_CUSTOMANIMATIONPANE_FONTPROPERTYBOX";
+inline constexpr OStringLiteral HID_SD_CUSTOMANIMATIONPANE_CHARHEIGHTPROPERTYBOX = "SD_HID_SD_CUSTOMANIMATIONPANE_CHARHEIGHTPROPERTYBOX";
+inline constexpr OStringLiteral HID_SD_CUSTOMANIMATIONPANE_ROTATIONPROPERTYBOX = "SD_HID_SD_CUSTOMANIMATIONPANE_ROTATIONPROPERTYBOX";
+inline constexpr OStringLiteral HID_SD_CUSTOMANIMATIONPANE_TRANSPARENCYPROPERTYBOX = "SD_HID_SD_CUSTOMANIMATIONPANE_TRANSPARENCYPROPERTYBOX";
+inline constexpr OStringLiteral HID_SD_CUSTOMANIMATIONPANE_SCALEPROPERTYBOX = "SD_HID_SD_CUSTOMANIMATIONPANE_SCALEPROPERTYBOX";
+inline constexpr OStringLiteral HID_SD_CUSTOMANIMATIONPANE_FONTSTYLEPROPERTYBOX = "SD_HID_SD_CUSTOMANIMATIONPANE_FONTSTYLEPROPERTYBOX";
+
+
+inline constexpr OStringLiteral HID_SD_RULER_HORIZONTAL = "SD_HID_SD_RULER_HORIZONTAL";
+inline constexpr OStringLiteral HID_SD_RULER_VERTICAL = "SD_HID_SD_RULER_VERTICAL";
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/misc/scopelock.hxx b/sd/inc/misc/scopelock.hxx
new file mode 100644
index 000000000..544bb5873
--- /dev/null
+++ b/sd/inc/misc/scopelock.hxx
@@ -0,0 +1,51 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+
+namespace sd
+{
+
+class ScopeLock
+{
+ friend class ScopeLockGuard;
+public:
+ ScopeLock() : mnLock(0) {}
+ bool isLocked() const { return mnLock != 0; }
+private:
+ void lock() { mnLock++; }
+ void unlock() { mnLock--; }
+
+ sal_Int32 mnLock;
+};
+
+class ScopeLockGuard
+{
+public:
+ ScopeLockGuard( ScopeLock& rScopeLock ) : mrScopeLock( rScopeLock ) { mrScopeLock.lock(); }
+ ~ScopeLockGuard() { mrScopeLock.unlock(); }
+private:
+ ScopeLock& mrScopeLock;
+};
+
+} // namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/notifydocumentevent.hxx b/sd/inc/notifydocumentevent.hxx
new file mode 100644
index 000000000..11847a7f9
--- /dev/null
+++ b/sd/inc/notifydocumentevent.hxx
@@ -0,0 +1,32 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+#include <rtl/ustring.hxx>
+#include <com/sun/star/uno/Reference.hxx>
+
+class SdDrawDocument;
+
+void NotifyDocumentEvent( SdDrawDocument const & rDocument, const OUString& rEventName );
+
+void NotifyDocumentEvent( SdDrawDocument const & rDocument, const OUString& rEventName, const css::uno::Reference< css::uno::XInterface >& xSource );
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/pageformatpanel.hrc b/sd/inc/pageformatpanel.hrc
new file mode 100644
index 000000000..ea3c04a9c
--- /dev/null
+++ b/sd/inc/pageformatpanel.hrc
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#pragma once
+
+#include <unotools/resmgr.hxx>
+
+#include <utility>
+
+#define NC_(Context, String) TranslateId(Context, reinterpret_cast<char const *>(u8##String))
+
+namespace sd
+{
+
+// To translators: this is a listbox labelled by "Margins:", inch units
+const std::pair<TranslateId, int> RID_PAGEFORMATPANEL_MARGINS_INCH[] =
+{
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "None"), 0 },
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "Narrow"), 0 },
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "Moderate"), 0 },
+ // Normal (0.75")
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "Normal (%1)"), 75 },
+ // Normal (1")
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "Normal (%1)"), 100 },
+ // Normal (1.25")
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "Normal (%1)"), 125 },
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_INCH", "Wide"), 0 }
+};
+
+// To translators: this is a listbox labelled by "Margins:", cm units
+const std::pair<TranslateId, int> RID_PAGEFORMATPANEL_MARGINS_CM[] =
+{
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "None"), 0 },
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "Narrow"), 0 },
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "Moderate"), 0 },
+ // Normal (1.9 cm)
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "Normal (%1)"), 190 },
+ // Normal (2.54 cm)
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "Normal (%1)"), 254 },
+ // Normal (3.18 cm)
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "Normal (%1)"), 318 },
+ { NC_("RID_PAGEFORMATPANEL_MARGINS_CM", "Wide"), 0 }
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sd/inc/pch/precompiled_sd.cxx b/sd/inc/pch/precompiled_sd.cxx
new file mode 100644
index 000000000..d681ebc7e
--- /dev/null
+++ b/sd/inc/pch/precompiled_sd.cxx
@@ -0,0 +1,12 @@
+/* -*- 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 "precompiled_sd.hxx"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/pch/precompiled_sd.hxx b/sd/inc/pch/precompiled_sd.hxx
new file mode 100644
index 000000000..f2ee62c48
--- /dev/null
+++ b/sd/inc/pch/precompiled_sd.hxx
@@ -0,0 +1,581 @@
+/* -*- 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 has been autogenerated by update_pch.sh. It is possible to edit it
+ manually (such as when an include file has been moved/renamed/removed). All such
+ manual changes will be rewritten by the next run of update_pch.sh (which presumably
+ also fixes all possible problems, so it's usually better to use it).
+
+ Generated on 2021-04-08 13:51:32 using:
+ ./bin/update_pch sd sd --cutoff=4 --exclude:system --exclude:module --include:local
+
+ If after updating build fails, use the following command to locate conflicting headers:
+ ./bin/update_pch_bisect ./sd/inc/pch/precompiled_sd.hxx "make sd.build" --find-conflicts
+*/
+
+#include <sal/config.h>
+#if PCH_LEVEL >= 1
+#include <algorithm>
+#include <cassert>
+#include <cstddef>
+#include <cstdlib>
+#include <functional>
+#include <initializer_list>
+#include <iomanip>
+#include <locale>
+#include <map>
+#include <memory>
+#include <new>
+#include <optional>
+#include <ostream>
+#include <set>
+#include <stddef.h>
+#include <string_view>
+#include <type_traits>
+#include <unordered_map>
+#include <utility>
+#include <vector>
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/property_tree/ptree_fwd.hpp>
+#endif // PCH_LEVEL >= 1
+#if PCH_LEVEL >= 2
+#include <osl/diagnose.h>
+#include <osl/diagnose.hxx>
+#include <osl/doublecheckedlocking.h>
+#include <osl/endian.h>
+#include <osl/file.hxx>
+#include <osl/getglobalmutex.hxx>
+#include <osl/interlck.h>
+#include <osl/module.h>
+#include <osl/module.hxx>
+#include <osl/mutex.hxx>
+#include <osl/socket_decl.hxx>
+#include <osl/thread.h>
+#include <osl/time.h>
+#include <rtl/alloc.h>
+#include <rtl/character.hxx>
+#include <rtl/math.hxx>
+#include <rtl/ref.hxx>
+#include <rtl/strbuf.hxx>
+#include <rtl/string.hxx>
+#include <rtl/tencinfo.h>
+#include <rtl/textenc.h>
+#include <rtl/ustrbuf.hxx>
+#include <rtl/ustring.hxx>
+#include <sal/backtrace.hxx>
+#include <sal/log.hxx>
+#include <sal/macros.h>
+#include <sal/types.h>
+#include <sal/typesizes.h>
+#include <vcl/EnumContext.hxx>
+#include <vcl/InterimItemWindow.hxx>
+#include <vcl/bitmapex.hxx>
+#include <vcl/commandevent.hxx>
+#include <vcl/commandinfoprovider.hxx>
+#include <vcl/customweld.hxx>
+#include <vcl/dllapi.h>
+#include <vcl/dockwin.hxx>
+#include <vcl/errcode.hxx>
+#include <vcl/errinf.hxx>
+#include <vcl/event.hxx>
+#include <vcl/fntstyle.hxx>
+#include <vcl/font.hxx>
+#include <vcl/graph.hxx>
+#include <vcl/graphicfilter.hxx>
+#include <vcl/help.hxx>
+#include <vcl/idle.hxx>
+#include <vcl/image.hxx>
+#include <vcl/imapobj.hxx>
+#include <vcl/keycod.hxx>
+#include <vcl/outdev.hxx>
+#include <vcl/ptrstyle.hxx>
+#include <vcl/scrbar.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/timer.hxx>
+#include <vcl/toolbox.hxx>
+#include <vcl/transfer.hxx>
+#include <vcl/vclenum.hxx>
+#include <vcl/vclevent.hxx>
+#include <vcl/vclptr.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/weld.hxx>
+#include <vcl/weldutils.hxx>
+#include <vcl/window.hxx>
+#include <vcl/wrkwin.hxx>
+#endif // PCH_LEVEL >= 2
+#if PCH_LEVEL >= 3
+#include <avmedia/avmediadllapi.h>
+#include <avmedia/mediaplayer.hxx>
+#include <avmedia/mediawindow.hxx>
+#include <basegfx/basegfxdllapi.h>
+#include <basegfx/color/bcolor.hxx>
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <basegfx/matrix/b2dhommatrixtools.hxx>
+#include <basegfx/point/b2dpoint.hxx>
+#include <basegfx/point/b2ipoint.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <basegfx/range/b2drange.hxx>
+#include <basegfx/range/basicrange.hxx>
+#include <basegfx/tuple/b2dtuple.hxx>
+#include <basegfx/tuple/b3dtuple.hxx>
+#include <basegfx/vector/b2dvector.hxx>
+#include <basic/sberrors.hxx>
+#include <basic/sbstar.hxx>
+#include <cache/SlsPageCache.hxx>
+#include <cache/SlsPageCacheManager.hxx>
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+#include <com/sun/star/accessibility/XAccessibleExtendedAttributes.hpp>
+#include <com/sun/star/accessibility/XAccessibleGroupPosition.hpp>
+#include <com/sun/star/accessibility/XAccessibleSelection.hpp>
+#include <com/sun/star/animations/AnimationFill.hpp>
+#include <com/sun/star/animations/AnimationNodeType.hpp>
+#include <com/sun/star/animations/ParallelTimeContainer.hpp>
+#include <com/sun/star/animations/XAnimate.hpp>
+#include <com/sun/star/awt/FontDescriptor.hpp>
+#include <com/sun/star/awt/FontSlant.hpp>
+#include <com/sun/star/awt/Rectangle.hpp>
+#include <com/sun/star/awt/Size.hpp>
+#include <com/sun/star/beans/NamedValue.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/beans/PropertyState.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/beans/XMultiPropertySet.hpp>
+#include <com/sun/star/beans/XPropertyChangeListener.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/beans/XPropertySetInfo.hpp>
+#include <com/sun/star/beans/XPropertyState.hpp>
+#include <com/sun/star/configuration/theDefaultProvider.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/container/XIndexReplace.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/datatransfer/XTransferable2.hpp>
+#include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
+#include <com/sun/star/datatransfer/clipboard/XClipboardOwner.hpp>
+#include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>
+#include <com/sun/star/datatransfer/dnd/DropTargetDragEvent.hpp>
+#include <com/sun/star/datatransfer/dnd/DropTargetDropEvent.hpp>
+#include <com/sun/star/datatransfer/dnd/XDragGestureListener.hpp>
+#include <com/sun/star/datatransfer/dnd/XDragSourceListener.hpp>
+#include <com/sun/star/datatransfer/dnd/XDropTargetListener.hpp>
+#include <com/sun/star/drawing/LineStyle.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
+#include <com/sun/star/drawing/framework/ResourceId.hpp>
+#include <com/sun/star/drawing/framework/XConfiguration.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <com/sun/star/embed/Aspects.hpp>
+#include <com/sun/star/embed/ElementModes.hpp>
+#include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
+#include <com/sun/star/embed/XEmbedPersist.hpp>
+#include <com/sun/star/embed/XEmbeddedObject.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/frame/XFrame.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <com/sun/star/frame/XTerminateListener.hpp>
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <com/sun/star/lang/Locale.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XTypeProvider.hpp>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+#include <com/sun/star/media/XPlayer.hpp>
+#include <com/sun/star/office/XAnnotation.hpp>
+#include <com/sun/star/presentation/EffectNodeType.hpp>
+#include <com/sun/star/presentation/EffectPresetClass.hpp>
+#include <com/sun/star/presentation/ParagraphTarget.hpp>
+#include <com/sun/star/style/XStyle.hpp>
+#include <com/sun/star/task/XStatusIndicator.hpp>
+#include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/text/XTextCopy.hpp>
+#include <com/sun/star/text/XTextRange.hpp>
+#include <com/sun/star/text/XTextRangeCompare.hpp>
+#include <com/sun/star/uno/Any.h>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/uno/Exception.hpp>
+#include <com/sun/star/uno/Reference.h>
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/RuntimeException.hpp>
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/uno/Type.h>
+#include <com/sun/star/uno/Type.hxx>
+#include <com/sun/star/uno/TypeClass.hdl>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/uno/XInterface.hpp>
+#include <com/sun/star/uno/genfunc.hxx>
+#include <com/sun/star/util/DateTime.hpp>
+#include <com/sun/star/util/URLTransformer.hpp>
+#include <com/sun/star/util/XCloneable.hpp>
+#include <com/sun/star/view/XSelectionSupplier.hpp>
+#include <comphelper/classids.hxx>
+#include <comphelper/comphelperdllapi.h>
+#include <comphelper/extract.hxx>
+#include <comphelper/lok.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertysequence.hxx>
+#include <comphelper/scopeguard.hxx>
+#include <comphelper/sequence.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <comphelper/storagehelper.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsClipboard.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <controller/SlsFocusManager.hxx>
+#include <controller/SlsInsertionIndicatorHandler.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsProperties.hxx>
+#include <controller/SlsScrollBarManager.hxx>
+#include <controller/SlsSelectionFunction.hxx>
+#include <controller/SlsSelectionManager.hxx>
+#include <controller/SlsSelectionObserver.hxx>
+#include <controller/SlsSlotManager.hxx>
+#include <controller/SlsVisibleAreaManager.hxx>
+#include <cppcanvas/vclfactory.hxx>
+#include <cppu/cppudllapi.h>
+#include <cppu/unotype.hxx>
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/cppuhelperdllapi.h>
+#include <cppuhelper/implbase.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <cppuhelper/weakagg.hxx>
+#include <drawinglayer/drawinglayerdllapi.h>
+#include <drawinglayer/geometry/viewinformation2d.hxx>
+#include <editeng/AccessibleComponentBase.hxx>
+#include <editeng/AccessibleContextBase.hxx>
+#include <editeng/adjustitem.hxx>
+#include <editeng/boxitem.hxx>
+#include <editeng/cmapitem.hxx>
+#include <editeng/colritem.hxx>
+#include <editeng/contouritem.hxx>
+#include <editeng/crossedoutitem.hxx>
+#include <editeng/editdata.hxx>
+#include <editeng/editeng.hxx>
+#include <editeng/editengdllapi.h>
+#include <editeng/editobj.hxx>
+#include <editeng/editstat.hxx>
+#include <editeng/editview.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/escapementitem.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/flditem.hxx>
+#include <editeng/flstitem.hxx>
+#include <editeng/fontitem.hxx>
+#include <editeng/frmdiritem.hxx>
+#include <editeng/langitem.hxx>
+#include <editeng/lrspitem.hxx>
+#include <editeng/lspcitem.hxx>
+#include <editeng/memberids.h>
+#include <editeng/numitem.hxx>
+#include <editeng/outliner.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/postitem.hxx>
+#include <editeng/shdditem.hxx>
+#include <editeng/sizeitem.hxx>
+#include <editeng/udlnitem.hxx>
+#include <editeng/ulspitem.hxx>
+#include <editeng/unoedsrc.hxx>
+#include <editeng/unolingu.hxx>
+#include <editeng/wghtitem.hxx>
+#include <framework/ConfigurationController.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <framework/Pane.hxx>
+#include <framework/ViewShellWrapper.hxx>
+#include <i18nlangtag/lang.h>
+#include <i18nlangtag/languagetag.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <o3tl/cow_wrapper.hxx>
+#include <o3tl/deleter.hxx>
+#include <o3tl/safeint.hxx>
+#include <o3tl/sorted_vector.hxx>
+#include <o3tl/strong_int.hxx>
+#include <o3tl/typed_flags_set.hxx>
+#include <o3tl/underlyingenumvalue.hxx>
+#include <officecfg/Office/Impress.hxx>
+#include <salhelper/simplereferenceobject.hxx>
+#include <salhelper/thread.hxx>
+#include <sfx2/app.hxx>
+#include <sfx2/basedlgs.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/chalign.hxx>
+#include <sfx2/childwin.hxx>
+#include <sfx2/devtools/DevelopmentToolChildWindow.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/dllapi.h>
+#include <sfx2/docfile.hxx>
+#include <sfx2/docfilt.hxx>
+#include <sfx2/fcontnr.hxx>
+#include <sfx2/frame.hxx>
+#include <sfx2/infobar.hxx>
+#include <sfx2/ipclient.hxx>
+#include <sfx2/linkmgr.hxx>
+#include <sfx2/lokhelper.hxx>
+#include <sfx2/msg.hxx>
+#include <sfx2/notebookbar/SfxNotebookBar.hxx>
+#include <sfx2/objface.hxx>
+#include <sfx2/objsh.hxx>
+#include <sfx2/printer.hxx>
+#include <sfx2/progress.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/sfxdlg.hxx>
+#include <sfx2/shell.hxx>
+#include <sfx2/sidebar/Sidebar.hxx>
+#include <sfx2/sidebar/SidebarChildWindow.hxx>
+#include <sfx2/sidebar/Theme.hxx>
+#include <sfx2/stbitem.hxx>
+#include <sfx2/tbxctrl.hxx>
+#include <sfx2/tplpitem.hxx>
+#include <sfx2/viewfac.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/viewsh.hxx>
+#include <sfx2/zoomitem.hxx>
+#include <sot/exchange.hxx>
+#include <sot/formats.hxx>
+#include <svl/SfxBroadcaster.hxx>
+#include <svl/eitem.hxx>
+#include <svl/hint.hxx>
+#include <svl/intitem.hxx>
+#include <svl/itempool.hxx>
+#include <svl/itemset.hxx>
+#include <svl/languageoptions.hxx>
+#include <svl/lstner.hxx>
+#include <svl/macitem.hxx>
+#include <svl/metitem.hxx>
+#include <svl/poolitem.hxx>
+#include <svl/ptitem.hxx>
+#include <svl/srchitem.hxx>
+#include <svl/stritem.hxx>
+#include <svl/style.hxx>
+#include <svl/svldllapi.h>
+#include <svl/typedwhich.hxx>
+#include <svl/urlbmk.hxx>
+#include <svl/whiter.hxx>
+#include <svtools/ehdl.hxx>
+#include <svtools/sfxecode.hxx>
+#include <svtools/svtdllapi.h>
+#include <svtools/svtresid.hxx>
+#include <svtools/toolbarmenu.hxx>
+#include <svx/AccessibleShapeTreeInfo.hxx>
+#include <svx/IAccessibleViewForwarder.hxx>
+#include <svx/IAccessibleViewForwarderListener.hxx>
+#include <svx/ImageMapInfo.hxx>
+#include <svx/ShapeTypeHandler.hxx>
+#include <svx/SvxColorChildWindow.hxx>
+#include <svx/bmpmask.hxx>
+#include <svx/dialmgr.hxx>
+#include <svx/drawitem.hxx>
+#include <svx/extrusionbar.hxx>
+#include <svx/f3dchild.hxx>
+#include <svx/fmshell.hxx>
+#include <svx/fontwork.hxx>
+#include <svx/fontworkbar.hxx>
+#include <svx/hlnkitem.hxx>
+#include <svx/hyperdlg.hxx>
+#include <svx/imapdlg.hxx>
+#include <svx/obj3d.hxx>
+#include <svx/pageitem.hxx>
+#include <svx/ruler.hxx>
+#include <svx/rulritem.hxx>
+#include <svx/scene3d.hxx>
+#include <svx/sdmetitm.hxx>
+#include <svx/sdr/contact/viewcontact.hxx>
+#include <svx/sdr/contact/viewobjectcontact.hxx>
+#include <svx/sdr/overlay/overlayobject.hxx>
+#include <svx/sdrpagewindow.hxx>
+#include <svx/sdrpaintwindow.hxx>
+#include <svx/sdtagitm.hxx>
+#include <svx/sdtfsitm.hxx>
+#include <svx/srchdlg.hxx>
+#include <svx/svddef.hxx>
+#include <svx/svdetc.hxx>
+#include <svx/svdhdl.hxx>
+#include <svx/svditer.hxx>
+#include <svx/svdlayer.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdogrp.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdopage.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/svdorect.hxx>
+#include <svx/svdotable.hxx>
+#include <svx/svdotext.hxx>
+#include <svx/svdouno.hxx>
+#include <svx/svdoutl.hxx>
+#include <svx/svdpage.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdpool.hxx>
+#include <svx/svdundo.hxx>
+#include <svx/svxdlg.hxx>
+#include <svx/svxdllapi.h>
+#include <svx/unoapi.hxx>
+#include <svx/unoshape.hxx>
+#include <svx/xbtmpit.hxx>
+#include <svx/xdef.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xflgrit.hxx>
+#include <svx/xflhtit.hxx>
+#include <svx/xit.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/xlnclit.hxx>
+#include <svx/xlndsit.hxx>
+#include <svx/xlnedit.hxx>
+#include <svx/xlnstit.hxx>
+#include <svx/xlnwtit.hxx>
+#include <svx/xtable.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <tools/UnitConversion.hxx>
+#include <tools/color.hxx>
+#include <tools/debug.hxx>
+#include <tools/degree.hxx>
+#include <tools/diagnose_ex.h>
+#include <tools/fldunit.hxx>
+#include <tools/fontenum.hxx>
+#include <tools/gen.hxx>
+#include <tools/globname.hxx>
+#include <tools/lineend.hxx>
+#include <tools/link.hxx>
+#include <tools/long.hxx>
+#include <tools/mapunit.hxx>
+#include <tools/ref.hxx>
+#include <tools/solar.h>
+#include <tools/stream.hxx>
+#include <tools/toolsdllapi.h>
+#include <tools/urlobj.hxx>
+#include <tools/weakbase.h>
+#include <tools/wintypes.hxx>
+#include <typelib/typedescription.h>
+#include <undo/undomanager.hxx>
+#include <undo/undoobjects.hxx>
+#include <uno/any2.h>
+#include <uno/data.h>
+#include <uno/sequence2.h>
+#include <unotools/configmgr.hxx>
+#include <unotools/localedatawrapper.hxx>
+#include <unotools/moduleoptions.hxx>
+#include <unotools/options.hxx>
+#include <unotools/saveopt.hxx>
+#include <unotools/streamwrap.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#include <unotools/unotoolsdllapi.h>
+#include <unotools/useroptions.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsLayouter.hxx>
+#include <view/SlsPageObjectLayouter.hxx>
+#include <view/SlsTheme.hxx>
+#include <xmloff/autolayout.hxx>
+#endif // PCH_LEVEL >= 3
+#if PCH_LEVEL >= 4
+#include <AccessibleViewForwarder.hxx>
+#include <AnimationChildWindow.hxx>
+#include <Annotation.hxx>
+#include <Client.hxx>
+#include <CustomAnimationEffect.hxx>
+#include <CustomAnimationPane.hxx>
+#include <CustomAnimationPreset.hxx>
+#include <DrawController.hxx>
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <EffectMigration.hxx>
+#include <EventMultiplexer.hxx>
+#include <FactoryIds.hxx>
+#include <FormShellManager.hxx>
+#include <FrameView.hxx>
+#include <GraphicDocShell.hxx>
+#include <GraphicViewShell.hxx>
+#include <LayerTabBar.hxx>
+#include <MasterPageObserver.hxx>
+#include <OutlineView.hxx>
+#include <OutlineViewShell.hxx>
+#include <Outliner.hxx>
+#include <PaneChildWindows.hxx>
+#include <PaneDockingWindow.hxx>
+#include <PresentationViewShell.hxx>
+#include <PreviewRenderer.hxx>
+#include <SdShapeTypes.hxx>
+#include <SlideSorter.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <SpellDialogChildWindow.hxx>
+#include <TextObjectBar.hxx>
+#include <ToolBarManager.hxx>
+#include <View.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShellHint.hxx>
+#include <ViewShellImplementation.hxx>
+#include <ViewShellManager.hxx>
+#include <Window.hxx>
+#include <anminfo.hxx>
+#include <cusshow.hxx>
+#include <customshowlist.hxx>
+#include <drawdoc.hxx>
+#include <drawview.hxx>
+#include <fubullet.hxx>
+#include <fuconstr.hxx>
+#include <fucushow.hxx>
+#include <fudraw.hxx>
+#include <fuexpand.hxx>
+#include <fuinsfil.hxx>
+#include <fupoor.hxx>
+#include <fusel.hxx>
+#include <fusldlg.hxx>
+#include <fusumry.hxx>
+#include <futempl.hxx>
+#include <futext.hxx>
+#include <glob.hxx>
+#include <helpids.h>
+#include <navigatr.hxx>
+#include <notifydocumentevent.hxx>
+#include <optsitem.hxx>
+#include <pres.hxx>
+#include <sdabstdlg.hxx>
+#include <sddll.hxx>
+#include <sddllapi.h>
+#include <sdfilter.hxx>
+#include <sdmod.hxx>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <sdtreelb.hxx>
+#include <sdundo.hxx>
+#include <sdundogr.hxx>
+#include <sdxfer.hxx>
+#include <slideshow.hxx>
+#include <stlpool.hxx>
+#include <stlsheet.hxx>
+#include <strings.hxx>
+#include <unchss.hxx>
+#include <undoanim.hxx>
+#include <unmodpg.hxx>
+#include <unokywds.hxx>
+#include <unomodel.hxx>
+#include <unopage.hxx>
+#include <unoprnms.hxx>
+#include <zoomlist.hxx>
+#endif // PCH_LEVEL >= 4
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/pch/precompiled_sdui.cxx b/sd/inc/pch/precompiled_sdui.cxx
new file mode 100644
index 000000000..0471b10db
--- /dev/null
+++ b/sd/inc/pch/precompiled_sdui.cxx
@@ -0,0 +1,12 @@
+/* -*- 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 "precompiled_sdui.hxx"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/pch/precompiled_sdui.hxx b/sd/inc/pch/precompiled_sdui.hxx
new file mode 100644
index 000000000..237dd892c
--- /dev/null
+++ b/sd/inc/pch/precompiled_sdui.hxx
@@ -0,0 +1,497 @@
+/* -*- 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 has been autogenerated by update_pch.sh. It is possible to edit it
+ manually (such as when an include file has been moved/renamed/removed). All such
+ manual changes will be rewritten by the next run of update_pch.sh (which presumably
+ also fixes all possible problems, so it's usually better to use it).
+
+ Generated on 2021-09-12 11:52:07 using:
+ ./bin/update_pch sd sdui --cutoff=4 --exclude:system --include:module --include:local
+
+ If after updating build fails, use the following command to locate conflicting headers:
+ ./bin/update_pch_bisect ./sd/inc/pch/precompiled_sdui.hxx "make sd.build" --find-conflicts
+*/
+
+#include <sal/config.h>
+#if PCH_LEVEL >= 1
+#include <algorithm>
+#include <array>
+#include <cassert>
+#include <chrono>
+#include <cmath>
+#include <cstddef>
+#include <cstdlib>
+#include <cstring>
+#include <deque>
+#include <float.h>
+#include <functional>
+#include <initializer_list>
+#include <iomanip>
+#include <iterator>
+#include <limits.h>
+#include <limits>
+#include <map>
+#include <math.h>
+#include <memory>
+#include <mutex>
+#include <new>
+#include <numeric>
+#include <optional>
+#include <ostream>
+#include <set>
+#include <sstream>
+#include <stddef.h>
+#include <stdexcept>
+#include <string.h>
+#include <string>
+#include <string_view>
+#include <type_traits>
+#include <unordered_map>
+#include <unordered_set>
+#include <utility>
+#include <vector>
+#include <boost/property_tree/ptree_fwd.hpp>
+#endif // PCH_LEVEL >= 1
+#if PCH_LEVEL >= 2
+#include <osl/diagnose.h>
+#include <osl/doublecheckedlocking.h>
+#include <osl/endian.h>
+#include <osl/getglobalmutex.hxx>
+#include <osl/interlck.h>
+#include <osl/mutex.h>
+#include <osl/mutex.hxx>
+#include <osl/socket_decl.hxx>
+#include <osl/thread.h>
+#include <osl/time.h>
+#include <rtl/alloc.h>
+#include <rtl/byteseq.h>
+#include <rtl/instance.hxx>
+#include <rtl/locale.h>
+#include <rtl/math.h>
+#include <rtl/ref.hxx>
+#include <rtl/strbuf.hxx>
+#include <rtl/string.h>
+#include <rtl/string.hxx>
+#include <rtl/stringconcat.hxx>
+#include <rtl/stringutils.hxx>
+#include <rtl/textcvt.h>
+#include <rtl/textenc.h>
+#include <rtl/ustrbuf.h>
+#include <rtl/ustrbuf.hxx>
+#include <rtl/ustring.h>
+#include <rtl/ustring.hxx>
+#include <rtl/uuid.h>
+#include <sal/backtrace.hxx>
+#include <sal/detail/log.h>
+#include <sal/log.hxx>
+#include <sal/macros.h>
+#include <sal/saldllapi.h>
+#include <sal/types.h>
+#include <sal/typesizes.h>
+#include <vcl/BinaryDataContainer.hxx>
+#include <vcl/BitmapColor.hxx>
+#include <vcl/BitmapPalette.hxx>
+#include <vcl/ColorMask.hxx>
+#include <vcl/GraphicAttributes.hxx>
+#include <vcl/GraphicExternalLink.hxx>
+#include <vcl/GraphicObject.hxx>
+#include <vcl/IDialogRenderable.hxx>
+#include <vcl/ITiledRenderable.hxx>
+#include <vcl/Scanline.hxx>
+#include <vcl/alpha.hxx>
+#include <vcl/animate/Animation.hxx>
+#include <vcl/animate/AnimationBitmap.hxx>
+#include <vcl/bitmap.hxx>
+#include <vcl/bitmap/BitmapTypes.hxx>
+#include <vcl/bitmapex.hxx>
+#include <vcl/builderpage.hxx>
+#include <vcl/cairo.hxx>
+#include <vcl/checksum.hxx>
+#include <vcl/ctrl.hxx>
+#include <vcl/customweld.hxx>
+#include <vcl/devicecoordinate.hxx>
+#include <vcl/dllapi.h>
+#include <vcl/dockwin.hxx>
+#include <vcl/errcode.hxx>
+#include <vcl/event.hxx>
+#include <vcl/fntstyle.hxx>
+#include <vcl/font.hxx>
+#include <vcl/formatter.hxx>
+#include <vcl/gdimtf.hxx>
+#include <vcl/gfxlink.hxx>
+#include <vcl/gradient.hxx>
+#include <vcl/graph.hxx>
+#include <vcl/idle.hxx>
+#include <vcl/image.hxx>
+#include <vcl/keycod.hxx>
+#include <vcl/keycodes.hxx>
+#include <vcl/mapmod.hxx>
+#include <vcl/metaactiontypes.hxx>
+#include <vcl/metric.hxx>
+#include <vcl/outdev.hxx>
+#include <vcl/ptrstyle.hxx>
+#include <vcl/region.hxx>
+#include <vcl/rendercontext/AddFontSubstituteFlags.hxx>
+#include <vcl/rendercontext/AntialiasingFlags.hxx>
+#include <vcl/rendercontext/DrawGridFlags.hxx>
+#include <vcl/rendercontext/DrawImageFlags.hxx>
+#include <vcl/rendercontext/DrawModeFlags.hxx>
+#include <vcl/rendercontext/DrawTextFlags.hxx>
+#include <vcl/rendercontext/GetDefaultFontFlags.hxx>
+#include <vcl/rendercontext/ImplMapRes.hxx>
+#include <vcl/rendercontext/InvertFlags.hxx>
+#include <vcl/rendercontext/RasterOp.hxx>
+#include <vcl/rendercontext/SalLayoutFlags.hxx>
+#include <vcl/rendercontext/State.hxx>
+#include <vcl/rendercontext/SystemTextColorFlags.hxx>
+#include <vcl/salgtype.hxx>
+#include <vcl/salnativewidgets.hxx>
+#include <vcl/scopedbitmapaccess.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/syswin.hxx>
+#include <vcl/task.hxx>
+#include <vcl/timer.hxx>
+#include <vcl/transfer.hxx>
+#include <vcl/uitest/factory.hxx>
+#include <vcl/vclenum.hxx>
+#include <vcl/vclptr.hxx>
+#include <vcl/vclreferencebase.hxx>
+#include <vcl/vectorgraphicdata.hxx>
+#include <vcl/wall.hxx>
+#include <vcl/weld.hxx>
+#include <vcl/window.hxx>
+#include <vcl/windowstate.hxx>
+#endif // PCH_LEVEL >= 2
+#if PCH_LEVEL >= 3
+#include <basegfx/basegfxdllapi.h>
+#include <basegfx/color/bcolor.hxx>
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <basegfx/numeric/ftools.hxx>
+#include <basegfx/point/b2dpoint.hxx>
+#include <basegfx/point/b2ipoint.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <basegfx/range/b2drange.hxx>
+#include <basegfx/range/b2drectangle.hxx>
+#include <basegfx/range/basicrange.hxx>
+#include <basegfx/tuple/Tuple2D.hxx>
+#include <basegfx/tuple/Tuple3D.hxx>
+#include <basegfx/tuple/b2dtuple.hxx>
+#include <basegfx/tuple/b2i64tuple.hxx>
+#include <basegfx/tuple/b2ituple.hxx>
+#include <basegfx/tuple/b3dtuple.hxx>
+#include <basegfx/utils/common.hxx>
+#include <basegfx/vector/b2dsize.hxx>
+#include <basegfx/vector/b2dvector.hxx>
+#include <basegfx/vector/b2enums.hxx>
+#include <basegfx/vector/b2ivector.hxx>
+#include <com/sun/star/awt/DeviceInfo.hpp>
+#include <com/sun/star/awt/Gradient.hpp>
+#include <com/sun/star/awt/GradientStyle.hpp>
+#include <com/sun/star/awt/Key.hpp>
+#include <com/sun/star/awt/KeyGroup.hpp>
+#include <com/sun/star/awt/SystemPointer.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/container/XIndexContainer.hpp>
+#include <com/sun/star/container/XIndexReplace.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/datatransfer/DataFlavor.hpp>
+#include <com/sun/star/datatransfer/XTransferable.hpp>
+#include <com/sun/star/datatransfer/XTransferable2.hpp>
+#include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
+#include <com/sun/star/datatransfer/clipboard/XClipboardOwner.hpp>
+#include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>
+#include <com/sun/star/datatransfer/dnd/DropTargetDragEvent.hpp>
+#include <com/sun/star/datatransfer/dnd/DropTargetDropEvent.hpp>
+#include <com/sun/star/datatransfer/dnd/XDragGestureListener.hpp>
+#include <com/sun/star/datatransfer/dnd/XDragSourceListener.hpp>
+#include <com/sun/star/datatransfer/dnd/XDropTargetListener.hpp>
+#include <com/sun/star/document/EventObject.hpp>
+#include <com/sun/star/document/XCmisDocument.hpp>
+#include <com/sun/star/document/XDocumentEventBroadcaster.hpp>
+#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+#include <com/sun/star/document/XDocumentRecovery.hpp>
+#include <com/sun/star/document/XDocumentSubStorageSupplier.hpp>
+#include <com/sun/star/document/XEmbeddedScripts.hpp>
+#include <com/sun/star/document/XEventBroadcaster.hpp>
+#include <com/sun/star/document/XEventsSupplier.hpp>
+#include <com/sun/star/document/XLinkTargetSupplier.hpp>
+#include <com/sun/star/document/XScriptInvocationContext.hpp>
+#include <com/sun/star/document/XShapeEventBroadcaster.hpp>
+#include <com/sun/star/document/XStorageBasedDocument.hpp>
+#include <com/sun/star/document/XUndoManagerSupplier.hpp>
+#include <com/sun/star/document/XViewDataSupplier.hpp>
+#include <com/sun/star/drawing/DashStyle.hpp>
+#include <com/sun/star/drawing/HatchStyle.hpp>
+#include <com/sun/star/drawing/LineCap.hpp>
+#include <com/sun/star/drawing/TextFitToSizeType.hpp>
+#include <com/sun/star/drawing/XDrawPageDuplicator.hpp>
+#include <com/sun/star/drawing/XDrawPages.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XLayerSupplier.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/embed/Aspects.hpp>
+#include <com/sun/star/embed/XStorage.hpp>
+#include <com/sun/star/embed/XVisualObject.hpp>
+#include <com/sun/star/form/FormComponentType.hpp>
+#include <com/sun/star/frame/XDispatch.hpp>
+#include <com/sun/star/frame/XFrame.hpp>
+#include <com/sun/star/frame/XLoadable.hpp>
+#include <com/sun/star/frame/XModel3.hpp>
+#include <com/sun/star/frame/XModule.hpp>
+#include <com/sun/star/frame/XStatusListener.hpp>
+#include <com/sun/star/frame/XStorable2.hpp>
+#include <com/sun/star/frame/XTerminateListener.hpp>
+#include <com/sun/star/frame/XTitle.hpp>
+#include <com/sun/star/frame/XTitleChangeBroadcaster.hpp>
+#include <com/sun/star/frame/XUntitledNumbers.hpp>
+#include <com/sun/star/graphic/XPrimitive2D.hpp>
+#include <com/sun/star/i18n/ForbiddenCharacters.hpp>
+#include <com/sun/star/i18n/WordType.hpp>
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/lang/EventObject.hpp>
+#include <com/sun/star/lang/Locale.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/XEventListener.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/lang/XTypeProvider.hpp>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+#include <com/sun/star/presentation/XCustomPresentationSupplier.hpp>
+#include <com/sun/star/presentation/XHandoutMasterSupplier.hpp>
+#include <com/sun/star/presentation/XPresentationSupplier.hpp>
+#include <com/sun/star/rdf/XDocumentMetadataAccess.hpp>
+#include <com/sun/star/script/XStarBasicAccess.hpp>
+#include <com/sun/star/script/provider/XScriptProviderSupplier.hpp>
+#include <com/sun/star/style/NumberingType.hpp>
+#include <com/sun/star/style/XStyle.hpp>
+#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
+#include <com/sun/star/text/textfield/Type.hpp>
+#include <com/sun/star/ucb/XAnyCompareFactory.hpp>
+#include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
+#include <com/sun/star/uno/Any.h>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/uno/Exception.hpp>
+#include <com/sun/star/uno/Reference.h>
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/RuntimeException.hpp>
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/uno/Type.h>
+#include <com/sun/star/uno/Type.hxx>
+#include <com/sun/star/uno/TypeClass.hdl>
+#include <com/sun/star/uno/XAggregation.hpp>
+#include <com/sun/star/uno/XInterface.hpp>
+#include <com/sun/star/uno/XWeak.hpp>
+#include <com/sun/star/uno/genfunc.h>
+#include <com/sun/star/uno/genfunc.hxx>
+#include <com/sun/star/util/Date.hpp>
+#include <com/sun/star/util/DateTime.hpp>
+#include <com/sun/star/util/Time.hpp>
+#include <com/sun/star/util/XCloseable.hpp>
+#include <com/sun/star/util/XModifiable2.hpp>
+#include <com/sun/star/view/XPrintJobBroadcaster.hpp>
+#include <com/sun/star/view/XPrintable.hpp>
+#include <com/sun/star/view/XRenderable.hpp>
+#include <comphelper/comphelperdllapi.h>
+#include <comphelper/interfacecontainer2.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <comphelper/weak.hxx>
+#include <cppu/cppudllapi.h>
+#include <cppu/unotype.hxx>
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/compbase_ex.hxx>
+#include <cppuhelper/cppuhelperdllapi.h>
+#include <cppuhelper/implbase.hxx>
+#include <cppuhelper/implbase_ex.hxx>
+#include <cppuhelper/implbase_ex_post.hxx>
+#include <cppuhelper/implbase_ex_pre.hxx>
+#include <cppuhelper/interfacecontainer.h>
+#include <cppuhelper/weak.hxx>
+#include <cppuhelper/weakagg.hxx>
+#include <cppuhelper/weakref.hxx>
+#include <cui/cuidllapi.h>
+#include <drawinglayer/drawinglayerdllapi.h>
+#include <drawinglayer/primitive2d/CommonTypes.hxx>
+#include <drawinglayer/primitive2d/Primitive2DContainer.hxx>
+#include <drawinglayer/primitive2d/Primitive2DVisitor.hxx>
+#include <editeng/editdata.hxx>
+#include <editeng/editengdllapi.h>
+#include <editeng/editstat.hxx>
+#include <editeng/editview.hxx>
+#include <editeng/eedata.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/flditem.hxx>
+#include <editeng/forbiddencharacterstable.hxx>
+#include <editeng/numdef.hxx>
+#include <editeng/outliner.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/overflowingtxt.hxx>
+#include <editeng/paragraphdata.hxx>
+#include <editeng/svxenum.hxx>
+#include <editeng/svxfont.hxx>
+#include <helper/simplereferencecomponent.hxx>
+#include <i18nlangtag/i18nlangtagdllapi.h>
+#include <i18nlangtag/lang.h>
+#include <i18nlangtag/languagetag.hxx>
+#include <o3tl/cow_wrapper.hxx>
+#include <o3tl/deleter.hxx>
+#include <o3tl/enumarray.hxx>
+#include <o3tl/safeint.hxx>
+#include <o3tl/sorted_vector.hxx>
+#include <o3tl/strong_int.hxx>
+#include <o3tl/typed_flags_set.hxx>
+#include <o3tl/underlyingenumvalue.hxx>
+#include <o3tl/unit_conversion.hxx>
+#include <salhelper/salhelperdllapi.h>
+#include <salhelper/simplereferenceobject.hxx>
+#include <salhelper/thread.hxx>
+#include <sfx2/basedlgs.hxx>
+#include <sfx2/dllapi.h>
+#include <sfx2/objsh.hxx>
+#include <sfx2/sfxbasemodel.hxx>
+#include <sfx2/shell.hxx>
+#include <sfx2/tabdlg.hxx>
+#include <sot/exchange.hxx>
+#include <sot/formats.hxx>
+#include <sot/sotdllapi.h>
+#include <svl/SfxBroadcaster.hxx>
+#include <svl/eitem.hxx>
+#include <svl/hint.hxx>
+#include <svl/intitem.hxx>
+#include <svl/itempool.hxx>
+#include <svl/itemset.hxx>
+#include <svl/languageoptions.hxx>
+#include <svl/lstner.hxx>
+#include <svl/poolitem.hxx>
+#include <svl/setitem.hxx>
+#include <svl/stritem.hxx>
+#include <svl/style.hxx>
+#include <svl/stylesheetuser.hxx>
+#include <svl/svldllapi.h>
+#include <svl/typedwhich.hxx>
+#include <svl/undo.hxx>
+#include <svl/whichranges.hxx>
+#include <svtools/accessibilityoptions.hxx>
+#include <svtools/colorcfg.hxx>
+#include <svtools/svtdllapi.h>
+#include <svtools/unitconv.hxx>
+#include <svtools/valueset.hxx>
+#include <svx/XPropertyEntry.hxx>
+#include <svx/drawitem.hxx>
+#include <svx/flagsdef.hxx>
+#include <svx/fmdmod.hxx>
+#include <svx/ipolypolygoneditorcontroller.hxx>
+#include <svx/itextprovider.hxx>
+#include <svx/sdr/animation/scheduler.hxx>
+#include <svx/sdr/overlay/overlayobject.hxx>
+#include <svx/sdr/overlay/overlayobjectlist.hxx>
+#include <svx/sdr/properties/defaultproperties.hxx>
+#include <svx/sdr/properties/properties.hxx>
+#include <svx/sdrobjectuser.hxx>
+#include <svx/sdtaditm.hxx>
+#include <svx/sdtaitm.hxx>
+#include <svx/sdtakitm.hxx>
+#include <svx/selectioncontroller.hxx>
+#include <svx/svdcrtv.hxx>
+#include <svx/svddef.hxx>
+#include <svx/svddrag.hxx>
+#include <svx/svddrgv.hxx>
+#include <svx/svdedtv.hxx>
+#include <svx/svdedxv.hxx>
+#include <svx/svdglev.hxx>
+#include <svx/svdglue.hxx>
+#include <svx/svdhdl.hxx>
+#include <svx/svdhlpln.hxx>
+#include <svx/svdlayer.hxx>
+#include <svx/svdmark.hxx>
+#include <svx/svdmodel.hxx>
+#include <svx/svdmrkv.hxx>
+#include <svx/svdoattr.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdobjkind.hxx>
+#include <svx/svdoedge.hxx>
+#include <svx/svdotext.hxx>
+#include <svx/svdpntv.hxx>
+#include <svx/svdpoev.hxx>
+#include <svx/svdsnpv.hxx>
+#include <svx/svdsob.hxx>
+#include <svx/svdtext.hxx>
+#include <svx/svdtrans.hxx>
+#include <svx/svdtypes.hxx>
+#include <svx/svdundo.hxx>
+#include <svx/svdxcgv.hxx>
+#include <svx/svxdllapi.h>
+#include <svx/unomod.hxx>
+#include <svx/xdash.hxx>
+#include <svx/xdef.hxx>
+#include <svx/xgrad.hxx>
+#include <svx/xhatch.hxx>
+#include <svx/xpoly.hxx>
+#include <svx/xtable.hxx>
+#include <tools/color.hxx>
+#include <tools/date.hxx>
+#include <tools/datetime.hxx>
+#include <tools/debug.hxx>
+#include <tools/degree.hxx>
+#include <tools/fldunit.hxx>
+#include <tools/fontenum.hxx>
+#include <tools/fract.hxx>
+#include <tools/gen.hxx>
+#include <tools/globname.hxx>
+#include <tools/helpers.hxx>
+#include <tools/lineend.hxx>
+#include <tools/link.hxx>
+#include <tools/long.hxx>
+#include <tools/mapunit.hxx>
+#include <tools/poly.hxx>
+#include <tools/ref.hxx>
+#include <tools/solar.h>
+#include <tools/stream.hxx>
+#include <tools/time.hxx>
+#include <tools/toolsdllapi.h>
+#include <tools/urlobj.hxx>
+#include <tools/weakbase.h>
+#include <tools/weakbase.hxx>
+#include <tools/wintypes.hxx>
+#include <typelib/typeclass.h>
+#include <typelib/typedescription.h>
+#include <typelib/uik.h>
+#include <uno/any2.h>
+#include <uno/data.h>
+#include <uno/sequence2.h>
+#include <unotools/fontcvt.hxx>
+#include <unotools/fontdefs.hxx>
+#include <unotools/options.hxx>
+#include <unotools/resmgr.hxx>
+#include <unotools/syslocale.hxx>
+#include <unotools/unotoolsdllapi.h>
+#endif // PCH_LEVEL >= 3
+#if PCH_LEVEL >= 4
+#include <DrawDocShell.hxx>
+#include <View.hxx>
+#include <drawdoc.hxx>
+#include <fupoor.hxx>
+#include <pres.hxx>
+#include <sddllapi.h>
+#include <sdmod.hxx>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <unomodel.hxx>
+#endif // PCH_LEVEL >= 4
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/pglink.hxx b/sd/inc/pglink.hxx
new file mode 100644
index 000000000..5d4a31451
--- /dev/null
+++ b/sd/inc/pglink.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/lnkbase.hxx>
+
+class SdPage;
+
+class SdPageLink final : public ::sfx2::SvBaseLink
+{
+ SdPage* pPage;
+
+public:
+ SdPageLink(SdPage* pPg, const OUString& rFileName, const OUString& rBookmarkName);
+ virtual ~SdPageLink() override;
+
+ virtual void Closed() override;
+ virtual ::sfx2::SvBaseLink::UpdateResult DataChanged(
+ const OUString& rMimeType, const css::uno::Any & rValue ) override;
+ void Connect() { SvBaseLink::GetRealObject(); }
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/pres.hxx b/sd/inc/pres.hxx
new file mode 100644
index 000000000..ab2b44adf
--- /dev/null
+++ b/sd/inc/pres.hxx
@@ -0,0 +1,73 @@
+/* -*- 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 .
+ */
+#pragma once
+
+enum class PresObjKind
+{
+ NONE = 0,
+ Title,
+ Outline,
+ Text,
+ Graphic,
+ Object,
+ Chart,
+ OrgChart,
+ Table,
+ Page,
+ Handout,
+ Notes,
+ Header,
+ Footer,
+ DateTime,
+ SlideNumber,
+ Calc,
+ Media,
+ LAST = Media
+};
+
+enum class PageKind
+{
+ Standard,
+ Notes,
+ Handout,
+ LAST = Handout
+};
+
+enum class EditMode
+{
+ Page,
+ MasterPage
+};
+
+enum class DocumentType
+{
+ Impress,
+ Draw
+};
+
+enum NavigatorDragType
+{
+ NAVIGATOR_DRAGTYPE_NONE,
+ NAVIGATOR_DRAGTYPE_URL,
+ NAVIGATOR_DRAGTYPE_LINK,
+ NAVIGATOR_DRAGTYPE_EMBEDDED
+};
+#define NAVIGATOR_DRAGTYPE_COUNT 4
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/prlayout.hxx b/sd/inc/prlayout.hxx
new file mode 100644
index 000000000..7cf768eae
--- /dev/null
+++ b/sd/inc/prlayout.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/.
+ *
+ * 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 .
+ */
+
+/*************************************************************************
+|* Contained once the class SdPresentationLayoutDlg (not needed anymore).
+|* This file disappeared in a mysterious way from the PVCS. It is newly
+|* checked in and does only contain the enumerator.
+\************************************************************************/
+
+#pragma once
+
+enum class PresentationObjects
+{
+ Title,
+ Background,
+ BackgroundObjects,
+ Outline_1,
+ Outline_2,
+ Outline_3,
+ Outline_4,
+ Outline_5,
+ Outline_6,
+ Outline_7,
+ Outline_8,
+ Outline_9,
+ Notes,
+ Subtitle
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/randomnode.hxx b/sd/inc/randomnode.hxx
new file mode 100644
index 000000000..6bccc738b
--- /dev/null
+++ b/sd/inc/randomnode.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/XInterface.hpp>
+
+#include "sddllapi.h"
+
+namespace sd
+{
+SD_DLLPUBLIC css::uno::Reference<css::uno::XInterface>
+RandomAnimationNode_createInstance(sal_Int16 nPresetClass);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/resltn.hxx b/sd/inc/resltn.hxx
new file mode 100644
index 000000000..cac2602b6
--- /dev/null
+++ b/sd/inc/resltn.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+enum PublishingFormat
+{
+ FORMAT_GIF,
+ FORMAT_JPG,
+ FORMAT_PNG
+};
+
+enum PublishingScript
+{
+ SCRIPT_ASP,
+ SCRIPT_PERL
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdabstdlg.hxx b/sd/inc/sdabstdlg.hxx
new file mode 100644
index 000000000..9428325cd
--- /dev/null
+++ b/sd/inc/sdabstdlg.hxx
@@ -0,0 +1,210 @@
+/* -*- 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 .
+ */
+#pragma once
+
+#include <vector>
+
+#include <rtl/string.hxx>
+#include <sfx2/tabdlg.hxx>
+#include <svl/itemset.hxx>
+#include <tools/solar.h>
+#include <vcl/abstdlg.hxx>
+#include <svx/svxdlg.hxx>
+
+#include <com/sun/star/beans/PropertyValue.hpp>
+
+#include "prlayout.hxx"
+#include "pres.hxx"
+#include "sddllapi.h"
+
+namespace sd {
+ class View;
+ class ViewShell;
+ class DrawDocShell;
+ class DrawView;
+}
+
+class SfxObjectShell;
+class SvxFieldData;
+class GDIMetaFile;
+class SdDrawDocument;
+class SfxMedium;
+class SdrObject;
+class SfxStyleSheetBasePool;
+class SfxStyleSheetBase;
+class SdrModel;
+class SdrView;
+class Bitmap;
+class SdPage;
+class SdCustomShowList;
+class SfxAbstractDialog;
+class SfxAbstractTabDialog;
+
+class AbstractCopyDlg : public VclAbstractDialog
+{
+protected:
+ virtual ~AbstractCopyDlg() override = default;
+public:
+ virtual void GetAttr( SfxItemSet& rOutAttrs ) = 0;
+};
+
+class AbstractSdCustomShowDlg : public VclAbstractDialog
+{
+protected:
+ virtual ~AbstractSdCustomShowDlg() override = default;
+public:
+ virtual bool IsCustomShow() const = 0;
+};
+
+class AbstractSdModifyFieldDlg : public VclAbstractDialog
+{
+protected:
+ virtual ~AbstractSdModifyFieldDlg() override = default;
+public:
+ virtual SvxFieldData* GetField() = 0;
+ virtual SfxItemSet GetItemSet() = 0;
+};
+
+class AbstractSdSnapLineDlg : public VclAbstractDialog
+{
+protected:
+ virtual ~AbstractSdSnapLineDlg() override = default;
+public:
+ virtual void GetAttr(SfxItemSet& rOutAttrs) = 0;
+ virtual void HideRadioGroup() = 0;
+ virtual void HideDeleteBtn() = 0;
+ virtual void SetInputFields(bool bEnableX, bool bEnableY) = 0;
+ virtual void SetText( const OUString& rStr ) = 0;
+};
+
+class AbstractSdInsertLayerDlg : public VclAbstractDialog
+{
+protected:
+ virtual ~AbstractSdInsertLayerDlg() override = default;
+public:
+ virtual void GetAttr( SfxItemSet& rOutAttrs ) = 0;
+ virtual void SetHelpId( const OString& rHelpId ) = 0;
+};
+
+class AbstractSdInsertPagesObjsDlg : public VclAbstractDialog
+{
+protected:
+ virtual ~AbstractSdInsertPagesObjsDlg() override = default;
+public:
+ virtual std::vector<OUString> GetList ( const sal_uInt16 nType ) = 0;
+ virtual bool IsLink() = 0;
+ virtual bool IsRemoveUnnecessaryMasterPages() const = 0;
+};
+
+class AbstractMorphDlg : public VclAbstractDialog
+{
+protected:
+ virtual ~AbstractMorphDlg() override = default;
+public:
+ virtual void SaveSettings() const = 0;
+ virtual sal_uInt16 GetFadeSteps() const = 0;
+ virtual bool IsAttributeFade() const = 0;
+ virtual bool IsOrientationFade() const = 0;
+};
+
+class AbstractSdStartPresDlg : public VclAbstractDialog
+{
+protected:
+ virtual ~AbstractSdStartPresDlg() override = default;
+public:
+ virtual void GetAttr( SfxItemSet& rOutAttrs ) = 0;
+};
+
+class AbstractSdPresLayoutDlg : public VclAbstractDialog
+{
+protected:
+ virtual ~AbstractSdPresLayoutDlg() override = default;
+public:
+ virtual void GetAttr(SfxItemSet& rOutAttrs) = 0;
+};
+
+class AbstractSdVectorizeDlg : public VclAbstractDialog
+{
+protected:
+ virtual ~AbstractSdVectorizeDlg() override = default;
+public:
+ virtual const GDIMetaFile& GetGDIMetaFile() const = 0;
+};
+
+class AbstractSdPublishingDlg : public VclAbstractDialog
+{
+protected:
+ virtual ~AbstractSdPublishingDlg() override = default;
+public:
+ virtual void GetParameterSequence( css::uno::Sequence< css::beans::PropertyValue >& rParams ) = 0;
+};
+
+class AbstractHeaderFooterDialog : public VclAbstractDialog
+{
+protected:
+ virtual ~AbstractHeaderFooterDialog() override = default;
+};
+
+class SdAbstractDialogFactory
+{
+public:
+ SD_DLLPUBLIC static SdAbstractDialogFactory* Create();
+
+ virtual VclPtr<AbstractSvxBulletAndPositionDlg> CreateSvxBulletAndPositionDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) = 0;
+ virtual VclPtr<VclAbstractDialog> CreateBreakDlg(weld::Window* pWindow, ::sd::DrawView* pDrView, ::sd::DrawDocShell* pShell, sal_uLong nSumActionCount, sal_uLong nObjCount ) = 0;
+ virtual VclPtr<AbstractCopyDlg> CreateCopyDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, ::sd::View* pView ) = 0;
+ virtual VclPtr<AbstractSdCustomShowDlg> CreateSdCustomShowDlg(weld::Window* pWindow, SdDrawDocument& rDrawDoc) = 0;
+ virtual VclPtr<SfxAbstractTabDialog> CreateSdTabCharDialog(weld::Window* pWindow, const SfxItemSet* pAttr, SfxObjectShell* pDocShell) = 0;
+ virtual VclPtr<SfxAbstractTabDialog> CreateSdTabPageDialog(weld::Window* pWindow, const SfxItemSet* pAttr, SfxObjectShell* pDocShell, bool bAreaPage, bool bIsImpressDoc, bool bIsImpressMaster) = 0;
+ virtual VclPtr<AbstractSdModifyFieldDlg> CreateSdModifyFieldDlg(weld::Window* pWindow, const SvxFieldData* pInField, const SfxItemSet& rSet) = 0;
+ virtual VclPtr<AbstractSdSnapLineDlg> CreateSdSnapLineDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, ::sd::View* pView) = 0;
+ virtual VclPtr<AbstractSdInsertLayerDlg> CreateSdInsertLayerDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, bool bDeletable, const OUString& rStr) = 0;
+ virtual VclPtr<AbstractSdInsertPagesObjsDlg> CreateSdInsertPagesObjsDlg(weld::Window* pParent, const SdDrawDocument* pDoc, SfxMedium* pSfxMedium, const OUString& rFileName) = 0;
+ virtual VclPtr<AbstractMorphDlg> CreateMorphDlg(weld::Window* pParent, const SdrObject* pObj1, const SdrObject* pObj2) = 0;
+ virtual VclPtr<SfxAbstractTabDialog> CreateSdOutlineBulletTabDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) = 0;
+ virtual VclPtr<SfxAbstractTabDialog> CreateSdParagraphTabDlg(weld::Window* pWindow, const SfxItemSet* pAttr) = 0;
+ virtual VclPtr<AbstractSdStartPresDlg> CreateSdStartPresentationDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs,
+ const std::vector<OUString> &rPageNames, SdCustomShowList* pCSList ) = 0;
+ virtual VclPtr<VclAbstractDialog> CreateRemoteDialog(weld::Window* pWindow) = 0;
+ virtual VclPtr<SfxAbstractTabDialog> CreateSdPresLayoutTemplateDlg(SfxObjectShell* pDocSh, weld::Window* pParent, bool bBackgroundDlg, SfxStyleSheetBase& rStyleBase, PresentationObjects ePO, SfxStyleSheetBasePool* pSSPool) = 0;
+ virtual VclPtr<AbstractSdPresLayoutDlg> CreateSdPresLayoutDlg(weld::Window* pParent, ::sd::DrawDocShell* pDocShell, const SfxItemSet& rInAttrs) = 0;
+ virtual VclPtr<SfxAbstractTabDialog> CreateSdTabTemplateDlg(weld::Window* pParent, const SfxObjectShell* pDocShell, SfxStyleSheetBase& rStyleBase, SdrModel* pModel, SdrView* pView) = 0;
+ virtual VclPtr<SfxAbstractDialog> CreatSdActionDialog(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) = 0;
+ virtual VclPtr<AbstractSdVectorizeDlg> CreateSdVectorizeDlg(weld::Window* pParent, const Bitmap& rBmp, ::sd::DrawDocShell* pDocShell) = 0;
+ virtual VclPtr<AbstractSdPublishingDlg> CreateSdPublishingDlg(weld::Window* pWindow, DocumentType eDocType) = 0;
+
+ virtual VclPtr<VclAbstractDialog> CreateMasterLayoutDialog(weld::Window* pParent, SdDrawDocument* pDoc, SdPage*) = 0;
+
+ virtual VclPtr<AbstractHeaderFooterDialog> CreateHeaderFooterDialog(sd::ViewShell* pViewShell,
+ weld::Window* pParent,
+ SdDrawDocument* pDoc,
+ SdPage* pCurrentPage) = 0;
+
+ virtual CreateTabPage GetSdOptionsContentsTabPageCreatorFunc() = 0;
+ virtual CreateTabPage GetSdPrintOptionsTabPageCreatorFunc() = 0;
+ virtual CreateTabPage GetSdOptionsMiscTabPageCreatorFunc() = 0;
+ virtual CreateTabPage GetSdOptionsSnapTabPageCreatorFunc() = 0;
+
+ virtual VclPtr<VclAbstractDialog> CreateSdPhotoAlbumDialog(weld::Window* pWindow, SdDrawDocument* pDoc) = 0;
+
+protected:
+ ~SdAbstractDialogFactory() {}
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdattr.hrc b/sd/inc/sdattr.hrc
new file mode 100644
index 000000000..17f8d8761
--- /dev/null
+++ b/sd/inc/sdattr.hrc
@@ -0,0 +1,124 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svl/solar.hrc>
+
+class SdOptionsPrintItem;
+class XColorItem;
+
+// Layer attributes
+#define ATTR_LAYER_START SID_SD_START + 1234
+#define ATTR_LAYER_NAME ATTR_LAYER_START
+#define ATTR_LAYER_VISIBLE ATTR_LAYER_START + 1
+#define ATTR_LAYER_PRINTABLE ATTR_LAYER_START + 2
+#define ATTR_LAYER_LOCKED ATTR_LAYER_START + 3
+#define ATTR_LAYER_THISPAGE ATTR_LAYER_START + 4
+#define ATTR_LAYER_TITLE ATTR_LAYER_START + 5
+#define ATTR_LAYER_DESC ATTR_LAYER_START + 6
+#define ATTR_LAYER_END ATTR_LAYER_DESC
+
+// presentation attributes
+#define ATTR_PRESENT_START ATTR_LAYER_END + 1
+#define ATTR_PRESENT_ALL ATTR_PRESENT_START
+#define ATTR_PRESENT_CUSTOMSHOW ATTR_PRESENT_START + 1
+#define ATTR_PRESENT_DIANAME ATTR_PRESENT_START + 2
+#define ATTR_PRESENT_ENDLESS ATTR_PRESENT_START + 3
+#define ATTR_PRESENT_MANUEL ATTR_PRESENT_START + 4
+#define ATTR_PRESENT_MOUSE ATTR_PRESENT_START + 5
+#define ATTR_PRESENT_PEN ATTR_PRESENT_START + 6
+#define ATTR_PRESENT_NAVIGATOR ATTR_PRESENT_START + 7
+#define ATTR_PRESENT_CHANGE_PAGE ATTR_PRESENT_START + 8
+#define ATTR_PRESENT_ALWAYS_ON_TOP ATTR_PRESENT_START + 9
+#define ATTR_PRESENT_FULLSCREEN ATTR_PRESENT_START + 10
+#define ATTR_PRESENT_ANIMATION_ALLOWED ATTR_PRESENT_START + 12
+#define ATTR_PRESENT_PAUSE_TIMEOUT ATTR_PRESENT_START + 13
+#define ATTR_PRESENT_SHOW_PAUSELOGO ATTR_PRESENT_START + 14
+#define ATTR_PRESENT_DISPLAY ATTR_PRESENT_START + 15
+#define ATTR_PRESENT_END ATTR_PRESENT_DISPLAY
+
+// animation attributes
+#define ATTR_ANIMATION_START ATTR_PRESENT_END + 1
+#define ATTR_ANIMATION_ACTIVE ATTR_ANIMATION_START
+#define ATTR_ANIMATION_EFFECT ATTR_ANIMATION_START + 1
+#define ATTR_ANIMATION_SPEED ATTR_ANIMATION_START + 2
+#define ATTR_ANIMATION_INVISIBLE ATTR_ANIMATION_START + 3
+#define ATTR_ANIMATION_FADEOUT ATTR_ANIMATION_START + 4
+#define ATTR_ANIMATION_COLOR ATTR_ANIMATION_START + 5
+#define ATTR_ANIMATION_SOUNDON ATTR_ANIMATION_START + 6
+#define ATTR_ANIMATION_SOUNDFILE ATTR_ANIMATION_START + 7
+#define ATTR_ANIMATION_PLAYFULL ATTR_ANIMATION_START + 8
+#define ATTR_ANIMATION_TEXTEFFECT ATTR_ANIMATION_START + 10
+#define ATTR_ANIMATION_END ATTR_ANIMATION_TEXTEFFECT
+
+#define ATTR_ACTION_START ATTR_ANIMATION_END + 1
+#define ATTR_ACTION ATTR_ACTION_START
+#define ATTR_ACTION_EFFECT ATTR_ACTION_START + 1
+#define ATTR_ACTION_EFFECTSPEED ATTR_ACTION_START + 2
+#define ATTR_ACTION_FILENAME ATTR_ACTION_START + 3
+#define ATTR_ACTION_SOUNDON ATTR_ACTION_START + 4
+#define ATTR_ACTION_PLAYFULL ATTR_ACTION_START + 5
+#define ATTR_ACTION_END ATTR_ACTION_PLAYFULL
+
+#define ATTR_COPY_START ATTR_ACTION_END + 1
+#define ATTR_COPY_NUMBER TypedWhichId<SfxUInt16Item>(ATTR_COPY_START)
+#define ATTR_COPY_MOVE_X TypedWhichId<SfxInt32Item>(ATTR_COPY_START + 1)
+#define ATTR_COPY_MOVE_Y TypedWhichId<SfxInt32Item>(ATTR_COPY_START + 2)
+#define ATTR_COPY_ANGLE TypedWhichId<SdrAngleItem>(ATTR_COPY_START + 3)
+#define ATTR_COPY_WIDTH TypedWhichId<SfxInt32Item>(ATTR_COPY_START + 4)
+#define ATTR_COPY_HEIGHT TypedWhichId<SfxInt32Item>(ATTR_COPY_START + 5)
+#define ATTR_COPY_START_COLOR TypedWhichId<XColorItem>(ATTR_COPY_START + 6)
+#define ATTR_COPY_END_COLOR TypedWhichId<XColorItem>(ATTR_COPY_START + 7)
+#define ATTR_COPY_END ATTR_COPY_END_COLOR
+
+#define ATTR_SNAPLINE_START ATTR_COPY_END + 1
+#define ATTR_SNAPLINE_KIND ATTR_SNAPLINE_START
+#define ATTR_SNAPLINE_X ATTR_SNAPLINE_START + 1
+#define ATTR_SNAPLINE_Y ATTR_SNAPLINE_START + 2
+#define ATTR_SNAPLINE_END ATTR_SNAPLINE_Y
+
+#define ATTR_OPTIONS_START ATTR_SNAPLINE_END + 1
+#define ATTR_OPTIONS_LAYOUT TypedWhichId<SdOptionsLayoutItem>(ATTR_OPTIONS_START + 1)
+#define ATTR_OPTIONS_MISC TypedWhichId<SdOptionsMiscItem>(ATTR_OPTIONS_START + 2)
+#define ATTR_OPTIONS_SNAP TypedWhichId<SdOptionsSnapItem>(ATTR_OPTIONS_START + 3)
+#define ATTR_OPTIONS_PRINT TypedWhichId<SdOptionsPrintItem>(ATTR_OPTIONS_START + 4)
+#define ATTR_OPTIONS_END ATTR_OPTIONS_PRINT
+
+#define ATTR_OPTIONS_SCALE_START ATTR_OPTIONS_END + 1
+#define ATTR_OPTIONS_SCALE_X TypedWhichId<SfxInt32Item>(ATTR_OPTIONS_SCALE_START)
+#define ATTR_OPTIONS_SCALE_Y TypedWhichId<SfxInt32Item>(ATTR_OPTIONS_SCALE_START + 1)
+#define ATTR_OPTIONS_SCALE_WIDTH ATTR_OPTIONS_SCALE_START + 2
+#define ATTR_OPTIONS_SCALE_HEIGHT ATTR_OPTIONS_SCALE_START + 3
+#define ATTR_OPTIONS_SCALE_END ATTR_OPTIONS_SCALE_HEIGHT
+
+#define ATTR_PRESLAYOUT_START ATTR_OPTIONS_SCALE_END + 1
+#define ATTR_PRESLAYOUT_NAME TypedWhichId<SfxStringItem>(ATTR_PRESLAYOUT_START)
+#define ATTR_PRESLAYOUT_LOAD ATTR_PRESLAYOUT_START + 1
+#define ATTR_PRESLAYOUT_MASTER_PAGE TypedWhichId<SfxBoolItem>(ATTR_PRESLAYOUT_START + 2)
+#define ATTR_PRESLAYOUT_CHECK_MASTERS ATTR_PRESLAYOUT_START + 3
+#define ATTR_PRESLAYOUT_END ATTR_PRESLAYOUT_CHECK_MASTERS
+
+// paragraph numbering attributes
+#define ATTR_PARANUMBERING_START ATTR_PRESLAYOUT_END + 1
+#define ATTR_NUMBER_NEWSTART TypedWhichId<SfxBoolItem>(ATTR_PARANUMBERING_START)
+#define ATTR_NUMBER_NEWSTART_AT TypedWhichId<SfxInt16Item>(ATTR_PARANUMBERING_START + 1)
+#define ATTR_PARANUMBERING_END ATTR_NUMBER_NEWSTART_AT
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdattr.hxx b/sd/inc/sdattr.hxx
new file mode 100644
index 000000000..bff52726e
--- /dev/null
+++ b/sd/inc/sdattr.hxx
@@ -0,0 +1,60 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svl/eitem.hxx>
+#include <svl/stritem.hxx>
+
+#include "sdattr.hrc"
+
+// layer attributes
+inline SfxStringItem makeSdAttrLayerName(const OUString& aStr)
+{
+ return SfxStringItem(ATTR_LAYER_NAME, aStr);
+}
+
+inline SfxStringItem makeSdAttrLayerTitle(const OUString& aStr = OUString())
+{
+ return SfxStringItem(ATTR_LAYER_TITLE, aStr);
+}
+
+inline SfxStringItem makeSdAttrLayerDesc(const OUString& aStr = OUString())
+{
+ return SfxStringItem(ATTR_LAYER_DESC, aStr);
+}
+
+inline SfxBoolItem makeSdAttrLayerVisible(bool bValue = true)
+{
+ return SfxBoolItem(ATTR_LAYER_VISIBLE, bValue);
+}
+
+inline SfxBoolItem makeSdAttrLayerPrintable(bool bValue = true)
+{
+ return SfxBoolItem(ATTR_LAYER_PRINTABLE, bValue);
+}
+
+inline SfxBoolItem makeSdAttrLayerLocked(bool bValue = false)
+{
+ return SfxBoolItem(ATTR_LAYER_LOCKED, bValue);
+}
+
+inline SfxBoolItem makeSdAttrLayerThisPage() { return SfxBoolItem(ATTR_LAYER_THISPAGE, false); }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdcgmfilter.hxx b/sd/inc/sdcgmfilter.hxx
new file mode 100644
index 000000000..6d5022f3c
--- /dev/null
+++ b/sd/inc/sdcgmfilter.hxx
@@ -0,0 +1,37 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "sdfilter.hxx"
+
+// SdCGMFilter
+class SdCGMFilter final : public SdFilter
+{
+public:
+ SdCGMFilter (
+ SfxMedium& rMedium,
+ ::sd::DrawDocShell& rDocShell );
+ virtual ~SdCGMFilter() override;
+
+ bool Import();
+ bool Export() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdcommands.h b/sd/inc/sdcommands.h
new file mode 100644
index 000000000..829e5d50a
--- /dev/null
+++ b/sd/inc/sdcommands.h
@@ -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/.
+ *
+ * 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 .
+ */
+#pragma once
+
+#include <rtl/string.hxx>
+
+inline constexpr OStringLiteral CMD_SID_HANDOUT_MASTER_MODE = ".uno:HandoutMode";
+inline constexpr OStringLiteral CMD_SID_NOTES_MODE = ".uno:NotesMode";
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sddll.hxx b/sd/inc/sddll.hxx
new file mode 100644
index 000000000..7f1258500
--- /dev/null
+++ b/sd/inc/sddll.hxx
@@ -0,0 +1,54 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "sddllapi.h"
+
+class SdModule;
+
+/*************************************************************************
+|*
+|* This class is a wrapper for a Load-On-Demand-DLL. One instance
+|* per SfxApplication will be created for the runtime of
+|* SfxApplication-subclass::Main().
+|*
+|* Remember: Do export this class! It is used by the application.
+|*
+\************************************************************************/
+
+class SD_DLLPUBLIC SdDLL final
+{
+#ifdef ENABLE_SDREMOTE
+ static void RegisterRemotes();
+#endif
+ static void RegisterFactorys();
+ static void RegisterInterfaces(const SdModule* pMod);
+ static void RegisterControllers(SdModule* pMod);
+
+public:
+ // Ctor/Dtor must be linked to the application
+ SdDLL();
+ ~SdDLL();
+
+ // DLL-init/exit-code must be linked to the DLL only
+ static void Init(); // called directly after loading the DLL
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sddllapi.h b/sd/inc/sddllapi.h
new file mode 100644
index 000000000..d8d4e1938
--- /dev/null
+++ b/sd/inc/sddllapi.h
@@ -0,0 +1,30 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+
+#if defined(SD_DLLIMPLEMENTATION)
+#define SD_DLLPUBLIC SAL_DLLPUBLIC_EXPORT
+#else
+#define SD_DLLPUBLIC SAL_DLLPUBLIC_IMPORT
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdenumdef.hxx b/sd/inc/sdenumdef.hxx
new file mode 100644
index 000000000..bd04c67a9
--- /dev/null
+++ b/sd/inc/sdenumdef.hxx
@@ -0,0 +1,31 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#define RET_SNAP_DELETE 111
+
+enum class SnapKind
+{
+ Horizontal,
+ Vertical,
+ Point
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sderror.hxx b/sd/inc/sderror.hxx
new file mode 100644
index 000000000..07ee1d7fa
--- /dev/null
+++ b/sd/inc/sderror.hxx
@@ -0,0 +1,31 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/errcode.hxx>
+
+// Import errors
+#define ERR_FORMAT_ROWCOL ErrCode(ErrCodeArea::Sd, ErrCodeClass::Read, 1)
+#define ERR_FORMAT_FILE_ROWCOL ErrCode(ErrCodeArea::Sd, ErrCodeClass::Read, 2)
+
+// Warnings
+#define WARN_FORMAT_FILE_ROWCOL ErrCode(WarningFlag::Yes, ErrCodeArea::Sd, ErrCodeClass::Read, 100)
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdfilter.hxx b/sd/inc/sdfilter.hxx
new file mode 100644
index 000000000..8d7782e4f
--- /dev/null
+++ b/sd/inc/sdfilter.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <osl/module.h>
+#include <rtl/ustring.hxx>
+#include <com/sun/star/frame/XModel.hpp>
+#include <com/sun/star/task/XStatusIndicator.hpp>
+
+// SdFilter
+class SfxMedium;
+namespace sd {
+class DrawDocShell;
+}
+class SdDrawDocument;
+namespace osl { class Module; }
+
+class SdFilter
+{
+public:
+ SdFilter( SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell );
+ virtual ~SdFilter();
+
+ bool IsDraw() const { return mbIsDraw; }
+ virtual bool Export() = 0;
+
+#ifndef DISABLE_DYNLOADING
+ static void Preload();
+ /// Open library @rLibraryName and lookup symbol @rFnSymbol
+ static oslGenericFunction GetLibrarySymbol( const OUString& rLibraryName, const OUString &rFnSymbol );
+#endif
+
+protected:
+ css::uno::Reference< css::frame::XModel > mxModel;
+ css::uno::Reference< css::task::XStatusIndicator > mxStatusIndicator;
+
+ SfxMedium& mrMedium;
+ ::sd::DrawDocShell& mrDocShell;
+ SdDrawDocument& mrDocument;
+ bool mbIsDraw : 1;
+ void CreateStatusIndicator();
+
+private:
+
+ static OUString ImplGetFullLibraryName( std::u16string_view rLibraryName );
+
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdgrffilter.hxx b/sd/inc/sdgrffilter.hxx
new file mode 100644
index 000000000..dc9027f94
--- /dev/null
+++ b/sd/inc/sdgrffilter.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "sdfilter.hxx"
+class ErrCode;
+
+// SdCGMFilter
+class SdGRFFilter final : public SdFilter
+{
+public:
+ SdGRFFilter(SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell);
+
+ virtual ~SdGRFFilter() override;
+
+ bool Import();
+ bool Export() override;
+
+ static void HandleGraphicFilterError(ErrCode nFilterError, ErrCode nStreamError);
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdhtmlfilter.hxx b/sd/inc/sdhtmlfilter.hxx
new file mode 100644
index 000000000..84b9c5d48
--- /dev/null
+++ b/sd/inc/sdhtmlfilter.hxx
@@ -0,0 +1,34 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "sdfilter.hxx"
+
+// SdHTMLFilter
+class SdHTMLFilter final : public SdFilter
+{
+public:
+ SdHTMLFilter(SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell);
+ virtual ~SdHTMLFilter() override;
+
+ virtual bool Export() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdiocmpt.hxx b/sd/inc/sdiocmpt.hxx
new file mode 100644
index 000000000..9f1395fd7
--- /dev/null
+++ b/sd/inc/sdiocmpt.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <tools/stream.hxx>
+#include "sddllapi.h"
+
+
+class old_SdrDownCompat
+{
+protected:
+ SvStream& rStream;
+ sal_uInt32 nSubRecSiz;
+ sal_uInt32 nSubRecPos;
+ StreamMode nMode;
+ bool bOpen;
+
+protected:
+ void Write();
+
+public:
+ old_SdrDownCompat(SvStream& rNewStream, StreamMode nNewMode);
+ ~old_SdrDownCompat();
+ void OpenSubRecord();
+ void CloseSubRecord();
+};
+
+#define SDIOCOMPAT_VERSIONDONTKNOW sal_uInt16(0xffff)
+
+class SD_DLLPUBLIC SdIOCompat : public old_SdrDownCompat
+{
+public:
+ // nNewMode: StreamMode::READ or StreamMode::WRITE
+ // nVer: specify only when writing
+ SdIOCompat(SvStream& rNewStream, StreamMode nNewMode,
+ sal_uInt16 nVer = SDIOCOMPAT_VERSIONDONTKNOW);
+ ~SdIOCompat();
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdmod.hxx b/sd/inc/sdmod.hxx
new file mode 100644
index 000000000..047a78fa2
--- /dev/null
+++ b/sd/inc/sdmod.hxx
@@ -0,0 +1,175 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "glob.hxx"
+#include "pres.hxx"
+
+#include <sot/storage.hxx>
+#include "sddllapi.h"
+#include <svl/lstner.hxx>
+#include <com/sun/star/beans/XPropertySetInfo.hpp>
+#include <sfx2/app.hxx>
+#include <sfx2/module.hxx>
+#include <sal/types.h>
+#include <vcl/virdev.hxx>
+#include <map>
+#include <memory>
+#include <string_view>
+
+class SdOptions;
+class SvxSearchItem;
+class EditFieldInfo;
+class SdTransferable;
+class SvNumberFormatter;
+class SfxErrorHandler;
+class SfxFrame;
+struct SfxItemPropertyMapEntry;
+class VclSimpleEvent;
+namespace svtools { class ColorConfig; }
+enum class SdrObjKind : sal_uInt16;
+
+namespace com::sun::star::frame {
+ class XFrame;
+}
+
+enum class SdOptionStreamMode
+{
+ Load = 0,
+ Store = 1
+};
+
+typedef std::map< SfxItemPropertyMapEntry const * , css::uno::Reference<css::beans::XPropertySetInfo> > SdExtPropertySetInfoCache;
+typedef std::map< SdrObjKind, css::uno::Sequence< css::uno::Type> > SdTypesCache;
+
+/*
+
+ This subclass of <SfxModule> (which is a subclass of <SfxShell>) is
+ linked to the DLL. One instance of this class exists while the DLL is
+ loaded.
+
+ SdModule is like to be compared with the <SfxApplication>-subclass.
+
+ Remember: Don`t export this class! It uses DLL-internal symbols.
+
+*/
+
+class SAL_DLLPUBLIC_RTTI SdModule final : public SfxModule, public SfxListener
+{
+public:
+ SFX_DECL_INTERFACE(SD_IF_SDAPP)
+ DECL_DLLPRIVATE_LINK( CalcFieldValueHdl, EditFieldInfo*, void );
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+public:
+ SdModule(SfxObjectFactory* pDrawObjFact, SfxObjectFactory* pGraphicObjFact);
+ virtual ~SdModule() override;
+
+ SdTransferable* pTransferClip;
+ SdTransferable* pTransferDrag;
+ SdTransferable* pTransferSelection;
+
+ void Execute(SfxRequest& rReq);
+ void GetState(SfxItemSet&);
+
+ SdOptions* GetSdOptions(DocumentType eDocType);
+ SD_DLLPUBLIC tools::SvRef<SotStorageStream> GetOptionStream( std::u16string_view rOptionName, SdOptionStreamMode eMode );
+
+ bool GetWaterCan() const { return bWaterCan; }
+ void SetWaterCan( bool bWC ) { bWaterCan = bWC; }
+
+ SvxSearchItem* GetSearchItem() { return pSearchItem.get(); }
+ void SetSearchItem(std::unique_ptr<SvxSearchItem> pItem);
+
+ /** Return the virtual device that can be used for printer independent
+ layout.
+ @return
+ The returned pointer is NULL when the device could not be
+ created when this modules was instantiated.
+ */
+ OutputDevice* GetVirtualRefDevice() { return mpVirtualRefDevice;}
+
+ SD_DLLPUBLIC SvNumberFormatter* GetNumberFormatter();
+
+ // virtual methods for the option dialog
+ virtual std::optional<SfxItemSet> CreateItemSet( sal_uInt16 nId ) override;
+ virtual void ApplyItemSet( sal_uInt16 nId, const SfxItemSet& rSet ) override;
+ virtual std::unique_ptr<SfxTabPage> CreateTabPage( sal_uInt16 nId, weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rSet ) override;
+ virtual std::optional<SfxStyleFamilies> CreateStyleFamilies() override;
+
+ SdExtPropertySetInfoCache gImplImpressPropertySetInfoCache;
+ SdExtPropertySetInfoCache gImplDrawPropertySetInfoCache;
+ SdTypesCache gImplTypesCache;
+
+ svtools::ColorConfig& GetColorConfig();
+
+private:
+
+ SdOptions* pImpressOptions;
+ SdOptions* pDrawOptions;
+ std::unique_ptr<SvxSearchItem> pSearchItem;
+ std::unique_ptr<SvNumberFormatter> pNumberFormatter;
+ tools::SvRef<SotStorage> xOptionStorage;
+ bool bWaterCan;
+ std::unique_ptr<SfxErrorHandler> mpErrorHdl;
+ /** This device is used for printer independent layout. It is virtual
+ in the sense that it does not represent a printer. The pointer may
+ be NULL when the virtual device could not be created.
+ */
+ VclPtr< VirtualDevice > mpVirtualRefDevice;
+
+ virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
+
+ SfxFrame* ExecuteNewDocument( SfxRequest const & rReq );
+
+ static SfxFrame* CreateEmptyDocument( const css::uno::Reference< css::frame::XFrame >& i_rFrame );
+ static SfxFrame* CreateFromTemplate(const OUString& rTemplatePath,
+ const css::uno::Reference<css::frame::XFrame>& i_rFrame,
+ const bool bReplaceable);
+
+ bool mbEventListenerAdded;
+
+ /** Take an outline from a text document and create a new impress
+ document according to the structure of the outline.
+ @param rRequest
+ This typically is the unmodified request from an execute()
+ function from where this function is called.
+ */
+ static bool OutlineToImpress(SfxRequest const & rRequest);
+
+ /** Add an eventlistener as soon as possible in sd, allows to use
+ remote devices to start the slideshow elegantly, and respecting
+ portability
+ @EventListenerHdl
+ The event listener handler
+ @VclSimpleEvent *
+ a pointer to a VCLSimpleEvent (see vcl/vclevent.hxx )
+ */
+ DECL_DLLPRIVATE_STATIC_LINK( SdModule, EventListenerHdl, VclSimpleEvent&, void );
+
+ std::unique_ptr<svtools::ColorConfig> mpColorConfig;
+};
+
+#define SD_MOD() ( static_cast<SdModule*>(SfxApplication::GetModule(SfxToolsModule::Draw)) )
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdpage.hxx b/sd/inc/sdpage.hxx
new file mode 100644
index 000000000..16315c219
--- /dev/null
+++ b/sd/inc/sdpage.hxx
@@ -0,0 +1,404 @@
+/* -*- 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_SD_INC_SDPAGE_HXX
+#define INCLUDED_SD_INC_SDPAGE_HXX
+
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/presentation/FadeEffect.hpp>
+#include <com/sun/star/office/XAnnotation.hpp>
+
+#include <memory>
+#include <string_view>
+#include <vector>
+#include <editeng/flditem.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/fmpage.hxx>
+#include <xmloff/autolayout.hxx>
+#include "diadef.h"
+#include "pres.hxx"
+#include "shapelist.hxx"
+#include "misc/scopelock.hxx"
+#include "sddllapi.h"
+
+namespace com::sun::star::animations {
+ class XAnimationNode;
+}
+
+class SfxStyleSheet;
+class SdDrawDocument;
+class SdrTextObj;
+class SdPageLink;
+class SfxItemSet;
+class Paragraph;
+class Outliner;
+class SdStyleSheet;
+class Graphic;
+
+namespace sd
+{
+ class MainSequence;
+}
+
+namespace sd {
+
+ struct SD_DLLPUBLIC HeaderFooterSettings
+ {
+ bool mbHeaderVisible;
+ OUString maHeaderText;
+
+ bool mbFooterVisible;
+ OUString maFooterText;
+
+ bool mbSlideNumberVisible;
+
+ bool mbDateTimeVisible;
+ bool mbDateTimeIsFixed;
+ OUString maDateTimeText;
+ SvxDateFormat meDateFormat;
+ SvxTimeFormat meTimeFormat;
+
+ HeaderFooterSettings();
+
+ bool operator==( const HeaderFooterSettings& rSettings ) const;
+ };
+
+ typedef std::vector< css::uno::Reference< css::office::XAnnotation > > AnnotationVector;
+}
+
+namespace sd {
+ class UndoAnimation;
+ class UndoTransition;
+ class UndoGeoObject;
+ class UndoAttrObject;
+}
+
+class SD_DLLPUBLIC SdPage final : public FmFormPage, public SdrObjUserCall
+{
+ SdPage& operator=(const SdPage&) = delete;
+ SdPage(const SdPage&) = delete;
+
+friend class SdGenericDrawPage;
+friend class SdDrawPage;
+friend class sd::UndoAnimation;
+friend class sd::UndoTransition;
+friend class ModifyPageUndoAction;
+friend class sd::UndoGeoObject;
+friend class sd::UndoAttrObject;
+
+ PageKind mePageKind; ///< page type
+ AutoLayout meAutoLayout; ///< AutoLayout
+ sd::ShapeList maPresentationShapeList;///< presentation objects
+ sd::ScopeLock maLockAutoLayoutArrangement;
+ bool mbSelected; ///< selection identifier
+ PresChange mePresChange; ///< manual / automatic / semi automatic
+ double mfTime; ///< Display time in seconds
+ bool mbSoundOn; ///< with / without sound.
+ bool mbExcluded; ///< will (not) be displayed during show.
+ OUString maLayoutName; ///< Name of the layout
+ OUString maSoundFile; ///< Path to sound file (MS-DOS notation).
+ bool mbLoopSound;
+ bool mbStopSound;
+ OUString maCreatedPageName; ///< generated page name by GetPageName.
+ OUString maFileName; ///< file name.
+ OUString maBookmarkName; ///< Bookmark name.
+ bool mbScaleObjects; ///< Objects should be scaled
+ rtl_TextEncoding meCharSet; ///< Text encoding
+ sal_uInt16 mnPaperBin; ///< PaperBin
+ SdPageLink* mpPageLink; ///< Page link (at left sides only)
+
+ sd::AnnotationVector maAnnotations;
+
+ /** holds the smil animation sequences for this page */
+ css::uno::Reference< css::animations::XAnimationNode > mxAnimationNode;
+
+ /** a helper class to manipulate effects inside the main sequence */
+ std::shared_ptr< sd::MainSequence > mpMainSequence;
+
+ virtual css::uno::Reference< css::uno::XInterface > createUnoPage() override;
+
+ std::unique_ptr<SfxItemSet> mpItems;
+
+ SfxItemSet* getOrCreateItems();
+
+ sd::HeaderFooterSettings maHeaderFooterSettings;
+
+ // new transition settings
+ sal_Int16 mnTransitionType;
+ sal_Int16 mnTransitionSubtype;
+ bool mbTransitionDirection;
+ sal_Int32 mnTransitionFadeColor;
+ double mfTransitionDuration;
+
+ void lateInit(const SdPage& rSrcPage);
+
+public:
+
+ SdPage(SdDrawDocument& rNewDoc, bool bMasterPage);
+ virtual ~SdPage() override;
+
+ virtual rtl::Reference<SdrPage> CloneSdrPage(SdrModel& rTargetModel) const override;
+
+ virtual void SetSize(const Size& aSize) override;
+ virtual void SetBorder(sal_Int32 nLft, sal_Int32 nUpp, sal_Int32 nRgt, sal_Int32 Lwr) override;
+ virtual void SetLeftBorder(sal_Int32 nBorder) override;
+ virtual void SetRightBorder(sal_Int32 nBorder) override;
+ virtual void SetUpperBorder(sal_Int32 nBorder) override;
+ virtual void SetLowerBorder(sal_Int32 nBorder) override;
+ virtual bool IsReadOnly() const override;
+
+ sd::ShapeList& GetPresentationShapeList() { return maPresentationShapeList; }
+
+ void EnsureMasterPageDefaultBackground();
+ SdrObject* CreatePresObj(PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect);
+ SdrObject* CreateDefaultPresObj(PresObjKind eObjKind);
+ void DestroyDefaultPresObj(PresObjKind eObjKind);
+ SdrObject* GetPresObj(PresObjKind eObjKind, int nIndex = 1, bool bFuzzySearch = false );
+ PresObjKind GetPresObjKind(SdrObject* pObj) const;
+ OUString GetPresObjText(PresObjKind eObjKind) const;
+ SfxStyleSheet* GetStyleSheetForMasterPageBackground() const;
+ SfxStyleSheet* GetStyleSheetForPresObj(PresObjKind eObjKind) const;
+ sal_Int64 GetHashCode() const;
+ bool RestoreDefaultText( SdrObject* pObj );
+
+ /** @return true if the given SdrObject is inside the presentation object list */
+ bool IsPresObj(const SdrObject* pObj);
+
+ /** removes the given SdrObject from the presentation object list */
+ void RemovePresObj(const SdrObject* pObj);
+
+ /** inserts the given SdrObject into the presentation object list */
+ void InsertPresObj(SdrObject* pObj, PresObjKind eKind );
+
+ void SetAutoLayout(AutoLayout eLayout, bool bInit=false, bool bCreate=false);
+ AutoLayout GetAutoLayout() const { return meAutoLayout; }
+ void CreateTitleAndLayout(bool bInit=false, bool bCreate=false);
+ SdrObject* InsertAutoLayoutShape(SdrObject* pObj, PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect, bool bInit);
+
+ virtual void NbcInsertObject(SdrObject* pObj, size_t nPos=SAL_MAX_SIZE) override;
+ virtual SdrObject* NbcRemoveObject(size_t nObjNum) override;
+ virtual SdrObject* RemoveObject(size_t nObjNum) override;
+
+ /** Also override ReplaceObject methods to realize when
+ objects are removed with this mechanism instead of RemoveObject*/
+ virtual SdrObject* ReplaceObject(SdrObject* pNewObj, size_t nObjNum) override;
+
+ void SetObjText(SdrTextObj* pObj, SdrOutliner* pOutliner, PresObjKind eObjKind, std::u16string_view rStr );
+
+ void SetPageKind(PageKind ePgType) { mePageKind = ePgType; }
+ PageKind GetPageKind() const { return mePageKind; }
+
+ void SetSelected(bool bSel) { mbSelected = bSel; }
+ bool IsSelected() const { return mbSelected; }
+
+ void SetFadeEffect(css::presentation::FadeEffect eNewEffect);
+ css::presentation::FadeEffect GetFadeEffect() const;
+
+ void SetPresChange(PresChange eChange) { mePresChange = eChange; }
+ PresChange GetPresChange() const { return mePresChange; }
+
+ void SetTime(double fNewTime) { mfTime = fNewTime; }
+ double GetTime() const { return mfTime; }
+
+ void SetSound(bool bNewSoundOn) { mbSoundOn = bNewSoundOn; }
+ bool IsSoundOn() const { return mbSoundOn; }
+
+ void SetExcluded(bool bNewExcluded) { mbExcluded = bNewExcluded; }
+ bool IsExcluded() const { return mbExcluded; }
+
+ bool IsScaleObjects() const { return mbScaleObjects; }
+
+ void SetSoundFile(const OUString& rStr) { maSoundFile = rStr; }
+ const OUString& GetSoundFile() const { return maSoundFile; }
+
+ void SetLoopSound( bool bLoopSound ) { mbLoopSound = bLoopSound; }
+ bool IsLoopSound() const { return mbLoopSound; }
+
+ void SetStopSound( bool bStopSound ) { mbStopSound = bStopSound; }
+ bool IsStopSound() const { return mbStopSound; }
+
+ sal_Int16 getTransitionType() const { return mnTransitionType;}
+ void setTransitionType( sal_Int16 nTransitionType );
+
+ sal_Int16 getTransitionSubtype() const { return mnTransitionSubtype;}
+ void setTransitionSubtype( sal_Int16 nTransitionSubtype );
+
+ bool getTransitionDirection() const { return mbTransitionDirection;}
+ void setTransitionDirection( bool bTransitionbDirection );
+
+ sal_Int32 getTransitionFadeColor() const { return mnTransitionFadeColor;}
+ void setTransitionFadeColor( sal_Int32 nTransitionFadeColor );
+
+ double getTransitionDuration() const { return mfTransitionDuration;}
+ void setTransitionDuration( double fTransitionDuration );
+
+ virtual void Changed(const SdrObject& rObj, SdrUserCallType eType,
+ const ::tools::Rectangle& rOldBoundRect) override;
+
+ void SetLayoutName(const OUString& aName);
+ virtual OUString GetLayoutName() const override { return maLayoutName; }
+
+ void SetFileName(const OUString& aName) { maFileName = aName; }
+ const OUString& GetFileName() const { return maFileName; }
+ void SetBookmarkName(const OUString& aName) { maBookmarkName = aName; }
+ const OUString& GetBookmarkName() const { return maBookmarkName; }
+
+ void ConnectLink();
+ void DisconnectLink();
+
+ void ScaleObjects(const Size& rNewPageSize, const ::tools::Rectangle& rNewBorderRect,
+ bool bScaleAllObj);
+
+ const OUString& GetName() const;
+ OUString const & GetRealName() const { return FmFormPage::GetName(); };
+
+ void SetPresentationLayout(std::u16string_view rLayoutName,
+ bool bReplaceStyleSheets = true,
+ bool bSetMasterPage = true,
+ bool bReverseOrder = false);
+ void EndListenOutlineText();
+
+ void SetPaperBin(sal_uInt16 nBin) { mnPaperBin = nBin; }
+ sal_uInt16 GetPaperBin() const { return mnPaperBin; }
+ virtual void SetOrientation(Orientation eOrient) override;
+ virtual Orientation GetOrientation() const override;
+
+ virtual SfxStyleSheet* GetTextStyleSheetForObject( SdrObject* pObj ) const override;
+
+ bool setAlienAttributes( const css::uno::Any& rAttributes );
+ void getAlienAttributes( css::uno::Any& rAttributes );
+
+ /** @return the main animation node
+
+ @throws css::uno::RuntimeException
+ */
+ css::uno::Reference< css::animations::XAnimationNode > const & getAnimationNode();
+
+ /** sets the main animation node
+
+ @throws css::uno::RuntimeException
+ */
+ void setAnimationNode( css::uno::Reference< css::animations::XAnimationNode > const & xNode );
+
+ /// @return a helper class to manipulate effects inside the main sequence
+ std::shared_ptr< sd::MainSequence > const & getMainSequence();
+
+ /** quick check if this slide has an animation node.
+ This can be used to have a cost free check if there are no animations ad this slide.
+ If it returns true this does not mean that there are animations available.
+ */
+ bool hasAnimationNode() const;
+
+ /// @return the SdPage implementation for the given XDrawPage or 0 if not available
+ static SdPage* getImplementation( const css::uno::Reference< css::drawing::XDrawPage >& xPage );
+
+ /** removes all custom animations for the given shape */
+ void removeAnimations( const SdrObject* pObj );
+
+ /** Notify that the object has been renamed and the animation effects has to update. */
+ void notifyObjectRenamed(const SdrObject* pObj);
+
+ /** Set the name of the page and broadcast a model change.
+ */
+ void SetName (const OUString& rName);
+
+ const sd::HeaderFooterSettings& getHeaderFooterSettings() const;
+ void setHeaderFooterSettings( const sd::HeaderFooterSettings& rNewSettings );
+
+ /**
+ @return true if the object from the ViewObjectContact should
+ be visible on this page while rendering.
+
+ bEdit selects if visibility test is for an editing view or a final render,
+ like printing.
+ */
+ virtual bool checkVisibility(
+ const sdr::contact::ViewObjectContact& rOriginal,
+ const sdr::contact::DisplayInfo& rDisplayInfo,
+ bool bEdit ) override;
+
+ /** callback from the sd::View when a new paragraph for one object on this page is created */
+ void onParagraphInserted( const ::Outliner* pOutliner, Paragraph const * pPara, SdrObject* pObj );
+
+ /** callback from the sd::View when a paragraph from one object on this page is removed */
+ void onParagraphRemoving( const ::Outliner* pOutliner, Paragraph const * pPara, SdrObject* pObj );
+
+ /** callback from the sd::View when an object just left text edit mode */
+ void onEndTextEdit( SdrObject* pObj );
+
+ /** @return the presentation style with the given helpid from this masterpage or this
+ slides masterpage */
+ SdStyleSheet* getPresentationStyle( sal_uInt32 nHelpId ) const;
+
+ /** removes all empty presentation objects from this slide */
+ void RemoveEmptyPresentationObjects();
+
+ ::tools::Rectangle GetTitleRect() const;
+ ::tools::Rectangle GetLayoutRect() const;
+
+ static void CalculateHandoutAreas( SdDrawDocument& rModel, AutoLayout eLayout, bool bHorizontal, std::vector< ::tools::Rectangle >& rAreas );
+
+ /** Set the "precious" flag to the given value.
+ */
+ void SetPrecious (const bool bIsPrecious);
+
+ /** The "precious" flag is used for master pages to prevent some unused
+ master pages from being deleted automatically. For pages
+ other than master pages this flag can be ignored.
+ @return
+ When this method returns <TRUE/> for a master page then this
+ master page should not be deleted automatically.
+ */
+ bool IsPrecious() const { return mbIsPrecious; }
+
+ void createAnnotation( css::uno::Reference< css::office::XAnnotation >& xAnnotation );
+ void addAnnotation( const css::uno::Reference< css::office::XAnnotation >& xAnnotation, int nIndex );
+ void removeAnnotation( const css::uno::Reference< css::office::XAnnotation >& xAnnotation );
+ const sd::AnnotationVector& getAnnotations() const { return maAnnotations; }
+ bool Equals(const SdPage&) const;
+ virtual void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+ sal_uInt16 getPageId() const { return mnPageId; }
+
+ /**
+ Returns graphics objects from the page that can be prefetched before it's painted.
+ The pointers are temporary and should not be kept.
+ */
+ void getGraphicsForPrefetch(std::vector<Graphic*>& graphics) const;
+
+ static sal_uInt16 mnLastPageId;
+
+private:
+ bool mbIsPrecious;
+
+ // page id of this page
+ sal_uInt16 mnPageId;
+
+ /** clone the animations from this and set them to rTargetPage
+ * TTTT: Order is strange, should be the other way around by
+ * convention/convenience and makes usage a little dangerous...
+ */
+ void cloneAnimations( SdPage& rTargetPage ) const;
+
+ /** called before a shape is removed or replaced from this slide */
+ void onRemoveObject( SdrObject* pObject );
+};
+
+#endif // INCLUDED_SD_INC_SDPAGE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdpdffilter.hxx b/sd/inc/sdpdffilter.hxx
new file mode 100644
index 000000000..685a3485a
--- /dev/null
+++ b/sd/inc/sdpdffilter.hxx
@@ -0,0 +1,41 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "sdfilter.hxx"
+
+class SfxMedium;
+namespace sd
+{
+class DrawDocShell;
+}
+
+class SdPdfFilter final : public SdFilter
+{
+public:
+ SdPdfFilter(SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell);
+
+ virtual ~SdPdfFilter() override;
+
+ bool Import();
+ bool Export() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdpptwrp.hxx b/sd/inc/sdpptwrp.hxx
new file mode 100644
index 000000000..7ff62a5c0
--- /dev/null
+++ b/sd/inc/sdpptwrp.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "sdfilter.hxx"
+
+#include <tools/stream.hxx>
+
+// SdPPTFilter
+class SdPPTFilter final : public SdFilter
+{
+public:
+ SdPPTFilter (
+ SfxMedium& rMedium,
+ ::sd::DrawDocShell& rDocShell);
+ virtual ~SdPPTFilter() override;
+
+ /// these methods are necessary for the export to PowerPoint
+ bool Import();
+ bool Export() override;
+
+ /// restores the original basic storage
+ void PreSaveBasic();
+
+private:
+ SvMemoryStream* pBas;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdresid.hxx b/sd/inc/sdresid.hxx
new file mode 100644
index 000000000..2ed8cd42c
--- /dev/null
+++ b/sd/inc/sdresid.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <rtl/ustring.hxx>
+#include "sddllapi.h"
+#include <unotools/resmgr.hxx>
+
+SD_DLLPUBLIC OUString SdResId(TranslateId aId);
+SD_DLLPUBLIC OUString SdResId(TranslateNId aContextSingularPlural, int nCardinality);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdundo.hxx b/sd/inc/sdundo.hxx
new file mode 100644
index 000000000..fbcc03574
--- /dev/null
+++ b/sd/inc/sdundo.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <svl/undo.hxx>
+#include "sddllapi.h"
+
+class SdDrawDocument;
+
+class SD_DLLPUBLIC SdUndoAction : public SfxUndoAction
+{
+public:
+ SdUndoAction(SdDrawDocument* pSdDrawDocument);
+
+ void SetComment(const OUString& rStr) { maComment = rStr; }
+ virtual OUString GetComment() const override { return maComment; }
+ virtual SdUndoAction* Clone() const { return nullptr; }
+ /// See SfxUndoAction::GetViewShellId().
+ ViewShellId GetViewShellId() const override;
+
+protected:
+ SdDrawDocument* mpDoc;
+ ViewShellId mnViewShellId;
+private:
+ OUString maComment;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/sdxmlwrp.hxx b/sd/inc/sdxmlwrp.hxx
new file mode 100644
index 000000000..9a1bf82c0
--- /dev/null
+++ b/sd/inc/sdxmlwrp.hxx
@@ -0,0 +1,52 @@
+/* -*- 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 .
+ */
+#pragma once
+
+#include <comphelper/fileformat.h>
+#include <tools/solar.h>
+#include "sdfilter.hxx"
+
+class ErrCode;
+
+// SdXMLFilter
+enum class SdXMLFilterMode
+{
+ Normal, ///< standard load and save of the complete document
+ Organizer ///< only for import, only the styles are loaded
+};
+
+class SdXMLFilter final : public SdFilter
+{
+public:
+ SdXMLFilter(
+ SfxMedium& rMedium,
+ ::sd::DrawDocShell& rDocShell,
+ SdXMLFilterMode eFilterMode = SdXMLFilterMode::Normal,
+ sal_uLong nStoreVer = SOFFICE_FILEFORMAT_8 );
+ virtual ~SdXMLFilter() override;
+
+ bool Import( ErrCode& nError );
+ bool Export() override;
+
+private:
+ SdXMLFilterMode meFilterMode;
+ sal_uLong mnStoreVer;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/shapelist.hxx b/sd/inc/shapelist.hxx
new file mode 100644
index 000000000..6528cc073
--- /dev/null
+++ b/sd/inc/shapelist.hxx
@@ -0,0 +1,71 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+#include <svx/sdrobjectuser.hxx>
+
+#include <list>
+
+namespace sd
+{
+ class ShapeList final : public sdr::ObjectUser
+ {
+ public:
+ ShapeList();
+ virtual ~ShapeList();
+
+ /** adds the given shape to this list */
+ void addShape( SdrObject& rObject );
+
+ /** removes the shape from this list*/
+ void removeShape( SdrObject& rObject );
+
+ /** removes all shapes from this list */
+ void clear();
+
+ /** @return true if this list is empty */
+ bool isEmpty() const;
+
+ /** @return true if given shape is part of this list */
+ bool hasShape( SdrObject& rObject ) const;
+
+ /** returns the shape the internal iterator points to, or 0 if
+ * the list end is reached. moves the internal iterator to the
+ * next shape. */
+ SdrObject* getNextShape();
+
+ /** Sets the internal iterator to the shape at given index. */
+ void seekShape( sal_uInt32 nIndex );
+
+ bool hasMore() const;
+
+ const std::list< SdrObject* >& getList() const { return maShapeList; }
+
+ private:
+ virtual void ObjectInDestruction(const SdrObject& rObject) override;
+
+ typedef std::list< SdrObject* > ListImpl;
+ ListImpl maShapeList;
+ ListImpl::iterator maIter;
+ };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/stlfamily.hxx b/sd/inc/stlfamily.hxx
new file mode 100644
index 000000000..df7ded613
--- /dev/null
+++ b/sd/inc/stlfamily.hxx
@@ -0,0 +1,116 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/container/XIndexAccess.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+
+#include <rtl/ref.hxx>
+
+#include <cppuhelper/implbase.hxx>
+
+#include <svl/style.hxx>
+
+class SdStyleSheet;
+class SdPage;
+struct SdStyleFamilyImpl;
+
+class SdStyleFamily final : public ::cppu::WeakImplHelper< css::container::XNameContainer, css::container::XNamed, css::container::XIndexAccess, css::lang::XSingleServiceFactory, css::lang::XServiceInfo, css::lang::XComponent, css::beans::XPropertySet >
+{
+public:
+ /// creates the style family for the given SfxStyleFamily
+ SdStyleFamily( const rtl::Reference< SfxStyleSheetPool >& xPool, SfxStyleFamily nFamily );
+
+ /// creates the presentation family for the given masterpage
+ SdStyleFamily( const rtl::Reference< SfxStyleSheetPool >& xPool, const SdPage* pMasterPage );
+
+ virtual ~SdStyleFamily() 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;
+
+ // XNamed
+ virtual OUString SAL_CALL getName( ) override;
+ virtual void SAL_CALL setName( const OUString& aName ) override;
+
+ // XNameAccess
+ virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override;
+ virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() override;
+
+ // XIndexAccess
+ virtual sal_Int32 SAL_CALL getCount() override ;
+ virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override;
+
+ // XNameContainer
+ virtual void SAL_CALL insertByName( const OUString& aName, const css::uno::Any& aElement ) override;
+ virtual void SAL_CALL removeByName( const OUString& Name ) override;
+
+ // XNameReplace
+ virtual void SAL_CALL replaceByName( const OUString& aName, const css::uno::Any& aElement ) override;
+
+ // XSingleServiceFactory
+ virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance( ) override;
+ virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArguments( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
+
+ // XComponent
+ virtual void SAL_CALL dispose( ) override;
+ virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override;
+ virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override;
+
+ // XPropertySet
+ virtual css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override;
+ virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference<css::beans::XPropertyChangeListener>& xListener ) override;
+ virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference<css::beans::XPropertyChangeListener>& aListener ) override;
+ virtual void SAL_CALL addVetoableChangeListener(const OUString& PropertyName, const css::uno::Reference<css::beans::XVetoableChangeListener>& aListener ) override;
+ virtual void SAL_CALL removeVetoableChangeListener(const OUString& PropertyName,const css::uno::Reference<css::beans::XVetoableChangeListener>&aListener ) override;
+
+private:
+ /// @throws css::uno::RuntimeException
+ void throwIfDisposed() const;
+ /// @throws css::lang::IllegalArgumentException
+ SdStyleSheet* GetValidNewSheet( const css::uno::Any& rElement );
+ /// @throws css::container::NoSuchElementException
+ /// @throws css::lang::WrappedTargetException
+ SdStyleSheet* GetSheetByName( const OUString& rName );
+
+ SfxStyleFamily mnFamily;
+ rtl::Reference< SfxStyleSheetPool > mxPool;
+ std::unique_ptr<SdStyleFamilyImpl> mpImpl;
+};
+
+typedef rtl::Reference< SdStyleFamily > SdStyleFamilyRef;
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/stlpool.hxx b/sd/inc/stlpool.hxx
new file mode 100644
index 000000000..bb73e157e
--- /dev/null
+++ b/sd/inc/stlpool.hxx
@@ -0,0 +1,141 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/container/XIndexAccess.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+
+#include <cppuhelper/implbase.hxx>
+#include <vcl/font.hxx>
+#include <map>
+#include <string_view>
+#include <vector>
+
+#include "stlfamily.hxx"
+#include "stlsheet.hxx"
+
+#include "sddllapi.h"
+
+class SdDrawDocument;
+class SdPage;
+class SvxNumberFormat;
+
+typedef std::map< const SdPage*, SdStyleFamilyRef > SdStyleFamilyMap;
+
+typedef ::cppu::ImplInheritanceHelper< SfxStyleSheetPool,
+ css::lang::XServiceInfo,
+ css::container::XIndexAccess,
+ css::container::XNameAccess,
+ css::lang::XComponent > SdStyleSheetPoolBase;
+
+class SAL_DLLPUBLIC_RTTI SdStyleSheetPool final : public SdStyleSheetPoolBase, public SfxListener
+{
+ friend class SdDrawDocument;
+public:
+ SdStyleSheetPool(SfxItemPool const& rPool, SdDrawDocument* pDocument);
+
+ void SetActualStyleSheet(SfxStyleSheetBase* pActStyleSheet) { mpActualStyleSheet = pActStyleSheet; }
+ SfxStyleSheetBase* GetActualStyleSheet() { return mpActualStyleSheet; }
+
+ SfxStyleSheetBase* GetTitleSheet(std::u16string_view rLayoutName);
+
+ // Caller has to delete the list
+ void CreateOutlineSheetList(std::u16string_view rLayoutName, std::vector<SfxStyleSheetBase*> &rOutlineStyles);
+
+ /** creates all layout style sheets for the given layout name if they
+ don't exist yet.
+
+ @param rLayoutName Must be the name of a master page
+ @param bCheck If set to true, the debug version will assert if a style
+ had to be created. This is used to assert errors in documents
+ when styles are missing.
+ */
+ SD_DLLPUBLIC void CreateLayoutStyleSheets(std::u16string_view rLayoutName, bool bCheck = false );
+ static void CreateLayoutSheetNames(std::u16string_view rLayoutName, std::vector<OUString> &aNameList);
+ void CreateLayoutSheetList(std::u16string_view rLayoutName, SdStyleSheetVector& rLayoutSheets);
+ void CopyLayoutSheets(std::u16string_view rLayoutName, SdStyleSheetPool& rSourcePool, StyleSheetCopyResultVector& rCreatedSheets);
+ void CopyGraphicSheets(SdStyleSheetPool& rSourcePool);
+ void CopyCellSheets(SdStyleSheetPool& rSourcePool);
+ void CopyTableStyles(SdStyleSheetPool const & rSourcePool);
+ void CopyCellSheets(SdStyleSheetPool& rSourcePool, StyleSheetCopyResultVector& rCreatedSheets);
+ void RenameAndCopyGraphicSheets(SdStyleSheetPool& rSourcePool, StyleSheetCopyResultVector& rCreatedSheets, std::u16string_view rRenameSuffix);
+
+ void CreatePseudosIfNecessary();
+ void UpdateStdNames();
+ static void PutNumBulletItem( SfxStyleSheetBase* pSheet, vcl::Font& rBulletFont );
+ static vcl::Font GetBulletFont();
+
+ SdDrawDocument* GetDoc() const { return mpDoc; }
+
+ static SdStyleSheetVector CreateChildList( SdStyleSheet const * pSheet );
+
+ static void setDefaultOutlineNumberFormatBulletAndIndent(sal_uInt16 i, SvxNumberFormat &rNumberFormat);
+
+public:
+ /// @throws css::uno::RuntimeException
+ void throwIfDisposed();
+
+ // 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;
+
+ // XNameAccess
+ virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override;
+ virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() override;
+
+ // XIndexAccess
+ virtual sal_Int32 SAL_CALL getCount() override ;
+ virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override;
+
+ // XComponent
+ virtual void SAL_CALL dispose( ) override;
+ virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override;
+ virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override;
+
+private:
+ void CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily eFamily );
+ void CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily eFamily, StyleSheetCopyResultVector& rCreatedSheets );
+ void CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily eFamily, StyleSheetCopyResultVector& rCreatedSheets, std::u16string_view rRenameSuffix );
+
+ virtual rtl::Reference<SfxStyleSheetBase> Create(const OUString& rName, SfxStyleFamily eFamily, SfxStyleSearchBits nMask) override;
+
+ using SfxStyleSheetPool::Create;
+ virtual ~SdStyleSheetPool() override;
+
+ void AddStyleFamily( const SdPage* pPage );
+ void RemoveStyleFamily( const SdPage* pPage );
+
+ SfxStyleSheetBase* mpActualStyleSheet;
+ SdDrawDocument* mpDoc;
+ SdStyleFamilyRef mxGraphicFamily;
+ SdStyleFamilyRef mxCellFamily;
+ SdStyleFamilyMap maStyleFamilyMap;
+ css::uno::Reference< css::container::XNameAccess > mxTableFamily;
+ OUString msTableFamilyName;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/stlsheet.hxx b/sd/inc/stlsheet.hxx
new file mode 100644
index 000000000..645259e9e
--- /dev/null
+++ b/sd/inc/stlsheet.hxx
@@ -0,0 +1,180 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <rtl/ref.hxx>
+
+#include <com/sun/star/style/XStyle.hpp>
+#include <com/sun/star/beans/XMultiPropertySet.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/beans/XPropertyState.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/util/XModifyBroadcaster.hpp>
+
+#include <cppuhelper/interfacecontainer.h>
+#include <cppuhelper/implbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+
+#include <svl/style.hxx>
+
+#include <memory>
+
+#include "prlayout.hxx"
+
+class ModifyListenerForwarder;
+struct SfxItemPropertyMapEntry;
+
+typedef cppu::ImplInheritanceHelper< SfxUnoStyleSheet,
+ css::beans::XPropertySet,
+ css::beans::XMultiPropertySet,
+ css::lang::XServiceInfo,
+ css::beans::XPropertyState,
+ css::util::XModifyBroadcaster,
+ css::lang::XComponent > SdStyleSheetBase ;
+
+class SdStyleSheet final : public SdStyleSheetBase, private ::cppu::BaseMutex
+{
+public:
+ SdStyleSheet( const OUString& rDisplayName, SfxStyleSheetBasePool& rPool, SfxStyleFamily eFamily, SfxStyleSearchBits nMask );
+
+ virtual bool SetParent (const OUString& rParentName) override;
+ virtual SfxItemSet& GetItemSet() override;
+ virtual bool IsUsed() const override;
+ virtual bool HasFollowSupport() const override;
+ virtual bool HasParentSupport() const override;
+ virtual bool HasClearParentSupport() const override;
+ virtual void SetHelpId( const OUString& r, sal_uLong nId ) override;
+
+ void AdjustToFontHeight(SfxItemSet& rSet, bool bOnlyMissingItems = true);
+
+ SdStyleSheet* GetRealStyleSheet() const;
+ SdStyleSheet* GetPseudoStyleSheet() const;
+
+ void SetApiName( const OUString& rApiName );
+ OUString const & GetApiName() const;
+
+ static OUString GetFamilyString( SfxStyleFamily eFamily );
+
+ static rtl::Reference<SdStyleSheet> CreateEmptyUserStyle( SfxStyleSheetBasePool& rPool, SfxStyleFamily eFamily );
+
+ //Broadcast that a SdStyleSheet has changed, taking into account outline sublevels
+ //which need to be explicitly broadcast as changing if their parent style was
+ //the one that changed
+ static void BroadcastSdStyleSheetChange(SfxStyleSheetBase const * pStyleSheet, PresentationObjects ePO,
+ SfxStyleSheetBasePool* pSSPool);
+
+ // SfxStyleSheetBase
+ virtual bool SetName(const OUString& rNewName, bool bReindexNow = true) override;
+
+ // XInterface
+ virtual void SAL_CALL release( ) noexcept 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;
+
+ // XNamed
+ virtual OUString SAL_CALL getName( ) override;
+ virtual void SAL_CALL setName( const OUString& aName ) override;
+
+ // XStyle
+ virtual sal_Bool SAL_CALL isUserDefined( ) override;
+ virtual sal_Bool SAL_CALL isInUse( ) override;
+ virtual OUString SAL_CALL getParentStyle( ) override;
+ virtual void SAL_CALL setParentStyle( const OUString& aParentStyle ) override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override;
+ virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override;
+ virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+ virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+
+ // XMultiPropertySet
+ virtual void SAL_CALL setPropertyValues(const css::uno::Sequence<OUString>& aPropertyNames, const css::uno::Sequence<css::uno::Any>& aValues) override;
+ virtual css::uno::Sequence<css::uno::Any> SAL_CALL getPropertyValues(const css::uno::Sequence<OUString>& aPropertyNames) override;
+ virtual void SAL_CALL addPropertiesChangeListener(const css::uno::Sequence<OUString>& aPropertyNames, const css::uno::Reference<css::beans::XPropertiesChangeListener>& xListener) override;
+ virtual void SAL_CALL removePropertiesChangeListener(const css::uno::Reference<css::beans::XPropertiesChangeListener>& xListener) override;
+ virtual void SAL_CALL firePropertiesChangeEvent(const css::uno::Sequence<OUString>& aPropertyNames, const css::uno::Reference<css::beans::XPropertiesChangeListener>& xListener) override;
+
+ // XPropertyState
+ virtual css::beans::PropertyState SAL_CALL getPropertyState( const OUString& PropertyName ) override;
+ virtual css::uno::Sequence< css::beans::PropertyState > SAL_CALL getPropertyStates( const css::uno::Sequence< OUString >& aPropertyName ) override;
+ virtual void SAL_CALL setPropertyToDefault( const OUString& PropertyName ) override;
+ virtual css::uno::Any SAL_CALL getPropertyDefault( const OUString& aPropertyName ) override;
+
+ // XModifyBroadcaster
+ virtual void SAL_CALL addModifyListener( const css::uno::Reference< css::util::XModifyListener >& aListener ) override;
+ virtual void SAL_CALL removeModifyListener( const css::uno::Reference< css::util::XModifyListener >& aListener ) override;
+
+ // XComponent
+ virtual void SAL_CALL dispose( ) override;
+ virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override;
+ virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override;
+
+ void notifyModifyListener();
+
+private:
+ /// @throws css::uno::RuntimeException
+ static const SfxItemPropertyMapEntry* getPropertyMapEntry( std::u16string_view rPropertyName );
+
+ void setPropertyValue_Impl(const OUString& aPropertyName, const css::uno::Any& aValue);
+ css::uno::Any getPropertyValue_Impl(const OUString& PropertyName);
+
+ virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
+ virtual ~SdStyleSheet() override;
+
+ /// @throws css::uno::RuntimeException
+ void throwIfDisposed();
+
+ void disposing();
+
+ OUString msApiName;
+ rtl::Reference< SfxStyleSheetBasePool > mxPool;
+
+ /** broadcast helper for events */
+ ::cppu::OBroadcastHelper mrBHelper;
+
+ std::unique_ptr< ModifyListenerForwarder > mpModifyListenerForwarder;
+
+ SdStyleSheet( const SdStyleSheet& ) = delete;
+ SdStyleSheet& operator=( const SdStyleSheet& ) = delete;
+};
+
+typedef std::vector< rtl::Reference< SdStyleSheet > > SdStyleSheetVector;
+
+struct StyleSheetCopyResult
+{
+ rtl::Reference<SdStyleSheet> m_xStyleSheet;
+ bool m_bCreatedByCopy;
+ StyleSheetCopyResult(SdStyleSheet* pStyleSheet, bool bCreatedByCopy)
+ : m_xStyleSheet(pStyleSheet)
+ , m_bCreatedByCopy(bCreatedByCopy)
+ {
+ }
+};
+
+typedef std::vector<StyleSheetCopyResult> StyleSheetCopyResultVector;
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/strings.hrc b/sd/inc/strings.hrc
new file mode 100644
index 000000000..05326f9e4
--- /dev/null
+++ b/sd/inc/strings.hrc
@@ -0,0 +1,488 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#define NC_(Context, String) TranslateId(Context, reinterpret_cast<char const *>(u8##String))
+#define NNC_(Context, StringSingular, StringPlural) TranslateNId(Context, reinterpret_cast<char const *>(u8##StringSingular), reinterpret_cast<char const *>(u8##StringPlural))
+
+#define STR_NULL NC_("STR_NULL", "None")
+#define STR_INSERTPAGE NC_("STR_INSERTPAGE", "Insert Slide")
+#define STR_INSERTLAYER NC_("STR_INSERTLAYER", "Insert Layer")
+#define STR_MODIFYLAYER NC_("STR_MODIFYLAYER", "Modify Layer")
+#define STR_UNDO_SLIDE_PARAMS NC_("STR_UNDO_SLIDE_PARAMS", "Slide parameter")
+#define STR_UNDO_CUT NC_("STR_UNDO_CUT", "Cut")
+#define STR_UNDO_REPLACE NC_("STR_UNDO_REPLACE", "Replace")
+#define STR_UNDO_DRAGDROP NC_("STR_UNDO_DRAGDROP", "Drag and Drop")
+#define STR_INSERTGRAPHIC NC_("STR_INSERTGRAPHIC", "Insert Image")
+#define STR_UNDO_BEZCLOSE NC_("STR_UNDO_BEZCLOSE", "Close Polygon")
+#define STR_SLIDE_SORTER_MODE NC_("STR_SLIDE_SORTER_MODE", "Slide Sorter")
+#define STR_NORMAL_MODE NC_("STR_NORMAL_MODE", "Normal")
+#define STR_SLIDE_MASTER_MODE NC_("STR_SLIDE_MASTER_MODE", "Master Slide")
+#define STR_OUTLINE_MODE NC_("STR_OUTLINE_MODE", "Outline")
+#define STR_NOTES_MODE NC_("STR_NOTES_MODE", "Notes")
+#define STR_NOTES_MASTER_MODE NC_("STR_NOTES_MASTER_MODE", "Master Notes")
+#define STR_HANDOUT_MASTER_MODE NC_("STR_HANDOUT_MASTER_MODE", "Master Handout")
+#define STR_AUTOLAYOUT_NONE NC_("STR_AUTOLAYOUT_NONE", "Blank Slide")
+#define STR_AUTOLAYOUT_ONLY_TITLE NC_("STR_AUTOLAYOUT_ONLY_TITLE", "Title Only")
+#define STR_AUTOLAYOUT_ONLY_TEXT NC_("STR_AUTOLAYOUT_ONLY_TEXT", "Centered Text")
+#define STR_AUTOLAYOUT_TITLE NC_("STR_AUTOLAYOUT_TITLE", "Title Slide")
+#define STR_AUTOLAYOUT_CONTENT NC_("STR_AUTOLAYOUT_CONTENT", "Title, Content")
+#define STR_AUTOLAYOUT_2CONTENT NC_("STR_AUTOLAYOUT_2CONTENT", "Title and 2 Content")
+#define STR_AUTOLAYOUT_CONTENT_2CONTENT NC_("STR_AUTOLAYOUT_CONTENT_2CONTENT", "Title, Content and 2 Content")
+#define STR_AUTOLAYOUT_2CONTENT_CONTENT NC_("STR_AUTOLAYOUT_2CONTENT_CONTENT", "Title, 2 Content and Content")
+#define STR_AUTOLAYOUT_2CONTENT_OVER_CONTENT NC_("STR_AUTOLAYOUT_2CONTENT_OVER_CONTENT", "Title, 2 Content over Content")
+#define STR_AUTOLAYOUT_CONTENT_OVER_CONTENT NC_("STR_AUTOLAYOUT_CONTENT_OVER_CONTENT", "Title, Content over Content")
+#define STR_AUTOLAYOUT_4CONTENT NC_("STR_AUTOLAYOUT_4CONTENT", "Title, 4 Content")
+#define STR_AUTOLAYOUT_6CONTENT NC_("STR_AUTOLAYOUT_6CONTENT", "Title, 6 Content")
+#define STR_AL_TITLE_VERT_OUTLINE NC_("STR_AL_TITLE_VERT_OUTLINE", "Title, Vertical Text")
+#define STR_AL_TITLE_VERT_OUTLINE_CLIPART NC_("STR_AL_TITLE_VERT_OUTLINE_CLIPART", "Title, Vertical Text, Clipart")
+#define STR_AL_VERT_TITLE_TEXT_CHART NC_("STR_AL_VERT_TITLE_TEXT_CHART", "Vertical Title, Text, Chart")
+#define STR_AL_VERT_TITLE_VERT_OUTLINE NC_("STR_AL_VERT_TITLE_VERT_OUTLINE", "Vertical Title, Vertical Text")
+#define STR_AUTOLAYOUT_HANDOUT1 NC_("STR_AUTOLAYOUT_HANDOUT1", "One Slide")
+#define STR_AUTOLAYOUT_HANDOUT2 NC_("STR_AUTOLAYOUT_HANDOUT2", "Two Slides")
+#define STR_AUTOLAYOUT_HANDOUT3 NC_("STR_AUTOLAYOUT_HANDOUT3", "Three Slides")
+#define STR_AUTOLAYOUT_HANDOUT4 NC_("STR_AUTOLAYOUT_HANDOUT4", "Four Slides")
+#define STR_AUTOLAYOUT_HANDOUT6 NC_("STR_AUTOLAYOUT_HANDOUT6", "Six Slides")
+#define STR_AUTOLAYOUT_HANDOUT9 NC_("STR_AUTOLAYOUT_HANDOUT9", "Nine Slides")
+#define STR_AUTOLAYOUT_NOTES NC_("STR_AUTOLAYOUT_NOTES", "Notes")
+#define STR_TRANSFORM NC_("STR_TRANSFORM", "Transform")
+#define STR_LINEEND NC_("STR_LINEEND", "Line Ends")
+#define STR_DESC_LINEEND NC_("STR_DESC_LINEEND", "Please enter a name for the new arrow style:")
+#define STR_WARN_NAME_DUPLICATE NC_("STR_WARN_NAME_DUPLICATE", "The name chosen already exists. \nPlease enter another name.")
+#define STR_UNDO_ANIMATION NC_("STR_UNDO_ANIMATION", "Animation parameters")
+#define STR_UNDO_COPYOBJECTS NC_("STR_UNDO_COPYOBJECTS", "Duplicate")
+#define STR_TITLE_NAMEGROUP NC_("STR_TITLE_NAMEGROUP", "Name Object")
+#define STR_DESC_NAMEGROUP NC_("STR_DESC_NAMEGROUP", "Name")
+#define STR_WARN_PAGE_EXISTS NC_("STR_WARN_PAGE_EXISTS", "The slide name already exists or is invalid. Please enter another name.")
+#define STR_WARN_PAGE_EXISTS_DRAW NC_("STR_WARN_PAGE_EXISTS_DRAW", "The page name already exists or is invalid. Please enter another name.")
+#define STR_SNAPDLG_SETLINE NC_("STR_SNAPDLG_SETLINE", "Edit Snap Line")
+#define STR_SNAPDLG_SETPOINT NC_("STR_SNAPDLG_SETPOINT", "Edit Snap Point")
+#define STR_POPUP_EDIT_SNAPLINE NC_("STR_POPUP_EDIT_SNAPLINE", "Edit Snap Line...")
+#define STR_POPUP_EDIT_SNAPPOINT NC_("STR_POPUP_EDIT_SNAPPOINT", "Edit Snap Point...")
+#define STR_POPUP_DELETE_SNAPLINE NC_("STR_POPUP_DELETE_SNAPLINE", "Delete Snap Line")
+#define STR_POPUP_DELETE_SNAPPOINT NC_("STR_POPUP_DELETE_SNAPPOINT", "Delete Snap Point")
+#define STR_IMPRESS NC_("STR_IMPRESS", "StarImpress 4.0")
+#define STR_LAYER NC_("STR_LAYER", "Layer")
+#define STR_UNDO_DELETEPAGES NC_("STR_UNDO_DELETEPAGES", "Delete slides")
+#define STR_UNDO_DELETEPAGES_DRAW NC_("STR_UNDO_DELETEPAGES_DRAW", "Delete pages")
+#define STR_UNDO_INSERTPAGES NC_("STR_UNDO_INSERTPAGES", "Insert slides")
+#define STR_ASK_DELETE_LAYER NC_("STR_ASK_DELETE_LAYER", "Are you sure you want to delete the layer \"$\"?\nNote: All objects on this layer will be deleted!")
+#define STR_ASK_DELETE_ALL_PICTURES NC_("STR_ASK_DELETE_ALL_PICTURES", "Do you really want to delete all images?")
+#define STR_UNDO_CHANGE_TITLE_AND_LAYOUT NC_("STR_UNDO_CHANGE_TITLE_AND_LAYOUT", "Modify title and outline")
+#define STR_WAV_FILE NC_("STR_WAV_FILE", "Audio")
+#define STR_MIDI_FILE NC_("STR_MIDI_FILE", "MIDI")
+#define STR_AU_FILE NC_("STR_AU_FILE", "Sun/NeXT Audio")
+#define STR_VOC_FILE NC_("STR_VOC_FILE", "Creative Labs Audio")
+#define STR_AIFF_FILE NC_("STR_AIFF_FILE", "Apple/SGI Audio")
+#define STR_SVX_FILE NC_("STR_SVX_FILE", "Amiga SVX Audio")
+#define STR_SD_PAGE NC_("STR_SD_PAGE", "Slide")
+#define STR_SD_PAGE_COUNT NC_("STR_SD_PAGE_COUNT", "Slide %1 of %2")
+#define STR_SD_PAGE_COUNT_CUSTOM NC_("STR_SD_PAGE_COUNT_CUSTOM", "Slide %1 of %2 (%3)")
+#define STR_ALL_SUPPORTED_FORMATS NC_("STR_ALL_SUPPORTED_FORMATS", "All supported formats")
+#define STR_ALL_FILES NC_("STR_ALL_FILES", "All files")
+#define STR_UNDO_INSERT_TEXTFRAME NC_("STR_UNDO_INSERT_TEXTFRAME", "Insert text frame")
+#define STR_ACTION_NOTPOSSIBLE NC_("STR_ACTION_NOTPOSSIBLE", "This function cannot be run \nwith the selected objects.")
+#define STR_DLG_INSERT_PAGES_FROM_FILE NC_("STR_DLG_INSERT_PAGES_FROM_FILE", "Insert File")
+#define STR_READ_DATA_ERROR NC_("STR_READ_DATA_ERROR", "The file could not be loaded!")
+#define STR_SCALE_OBJECTS NC_("STR_SCALE_OBJECTS", "The page size of the target document is different than the source document.\n\nDo you want to scale the copied objects to fit the new page size?")
+#define STR_SCALE_TOOLTIP NC_("STR_SCALE_TOOLTIP", "Scaling factor of the document; right-click to change.")
+#define STR_CREATE_PAGES NC_("STR_CREATE_PAGES", "Create Slides")
+#define STR_UNDO_CHANGE_PAGEFORMAT NC_("STR_UNDO_CHANGE_PAGEFORMAT", "Modify page format")
+#define STR_UNDO_CHANGE_PAGEBORDER NC_("STR_UNDO_CHANGE_PAGEBORDER", "Modify page margins")
+#define STR_EDIT_OBJ NC_("STR_EDIT_OBJ", "~Edit")
+#define STR_DELETE_PAGES NC_("STR_DELETE_PAGES", "Delete Slides")
+#define STR_WARN_PRINTFORMAT_FAILURE NC_("STR_WARN_PRINTFORMAT_FAILURE", "The document format could not be set on the specified printer.")
+#define STR_IMPORT_GRFILTER_OPENERROR NC_("STR_IMPORT_GRFILTER_OPENERROR", "Image file cannot be opened")
+#define STR_IMPORT_GRFILTER_IOERROR NC_("STR_IMPORT_GRFILTER_IOERROR", "Image file cannot be read")
+#define STR_IMPORT_GRFILTER_FORMATERROR NC_("STR_IMPORT_GRFILTER_FORMATERROR", "Unknown image format")
+#define STR_IMPORT_GRFILTER_VERSIONERROR NC_("STR_IMPORT_GRFILTER_VERSIONERROR", "This image file version is not supported")
+#define STR_IMPORT_GRFILTER_FILTERERROR NC_("STR_IMPORT_GRFILTER_FILTERERROR", "Image filter not found")
+#define STR_IMPORT_GRFILTER_TOOBIG NC_("STR_IMPORT_GRFILTER_TOOBIG", "Not enough memory to import image")
+#define STR_OBJECTS NC_("STR_OBJECTS", "Objects")
+#define STR_END_SPELLING NC_("STR_END_SPELLING", "Spellcheck of entire document has been completed.")
+#define STR_END_SPELLING_OBJ NC_("STR_END_SPELLING_OBJ", "The spellcheck for the selected objects has been completed.")
+#define STR_ASK_FOR_CONVERT_TO_BEZIER NC_("STR_ASK_FOR_CONVERT_TO_BEZIER", "Convert selected object to curve?")
+#define STR_UNDO_CHANGE_PRES_OBJECT NC_("STR_UNDO_CHANGE_PRES_OBJECT", "Modify presentation object '$'")
+#define STR_UNDO_MODIFY_PAGE NC_("STR_UNDO_MODIFY_PAGE", "Slide layout")
+#define STR_UNDO_MODIFY_PAGE_DRAW NC_("STR_UNDO_MODIFY_PAGE_DRAW", "Page layout")
+#define STR_UNDO_INSERT_FILE NC_("STR_UNDO_INSERT_FILE", "Insert file")
+#define STR_UNDO_INSERT_SPECCHAR NC_("STR_UNDO_INSERT_SPECCHAR", "Insert special character")
+#define STR_UNDO_SET_PRESLAYOUT NC_("STR_UNDO_SET_PRESLAYOUT", "Apply presentation layout")
+#define STR_PLAY NC_("STR_PLAY", "~Play")
+#define STR_STOP NC_("STR_STOP", "Sto~p")
+#define STR_UNDO_ORIGINALSIZE NC_("STR_UNDO_ORIGINALSIZE", "Original Size")
+#define STR_WARN_SCALE_FAIL NC_("STR_WARN_SCALE_FAIL", "The specified scale is invalid.\nDo you want to enter a new one?")
+#define STR_CLICK_ACTION_NONE NC_("STR_CLICK_ACTION_NONE", "No action")
+#define STR_CLICK_ACTION_PREVPAGE NC_("STR_CLICK_ACTION_PREVPAGE", "Go to previous slide")
+#define STR_CLICK_ACTION_NEXTPAGE NC_("STR_CLICK_ACTION_NEXTPAGE", "Go to next slide")
+#define STR_CLICK_ACTION_FIRSTPAGE NC_("STR_CLICK_ACTION_FIRSTPAGE", "Go to first slide")
+#define STR_CLICK_ACTION_LASTPAGE NC_("STR_CLICK_ACTION_LASTPAGE", "Go to last slide")
+#define STR_CLICK_ACTION_BOOKMARK NC_("STR_CLICK_ACTION_BOOKMARK", "Go to page or object")
+#define STR_CLICK_ACTION_DOCUMENT NC_("STR_CLICK_ACTION_DOCUMENT", "Go to document")
+#define STR_CLICK_ACTION_SOUND NC_("STR_CLICK_ACTION_SOUND", "Play audio")
+#define STR_CLICK_ACTION_VERB NC_("STR_CLICK_ACTION_VERB", "Start object action")
+#define STR_CLICK_ACTION_PROGRAM NC_("STR_CLICK_ACTION_PROGRAM", "Run program")
+#define STR_CLICK_ACTION_MACRO NC_("STR_CLICK_ACTION_MACRO", "Run macro")
+#define STR_CLICK_ACTION_STOPPRESENTATION NC_("STR_CLICK_ACTION_STOPPRESENTATION", "Exit presentation")
+#define STR_EFFECTDLG_JUMP NC_("STR_EFFECTDLG_JUMP", "Target")
+#define STR_EFFECTDLG_ACTION NC_("STR_EFFECTDLG_ACTION", "Act~ion")
+#define STR_EFFECTDLG_SOUND NC_("STR_EFFECTDLG_SOUND", "Audio")
+#define STR_EFFECTDLG_PAGE_OBJECT NC_("STR_EFFECTDLG_PAGE_OBJECT", "Slide / Object")
+#define STR_EFFECTDLG_DOCUMENT NC_("STR_EFFECTDLG_DOCUMENT", "Document")
+#define STR_EFFECTDLG_PROGRAM NC_("STR_EFFECTDLG_PROGRAM", "Program")
+#define STR_EFFECTDLG_MACRO NC_("STR_EFFECTDLG_MACRO", "Macro")
+#define STR_FULLSCREEN_SLIDESHOW NC_("STR_FULLSCREEN_SLIDESHOW", "Presenting: %s")
+
+// To translators: this is the spinbutton in the slidesorter toolbar to set the number of slides to show per row
+#define STR_SLIDES NNC_("STR_SLIDES", "%1 slide", "%1 slides")
+
+// Strings for animation effects
+#define STR_INSERT_TEXT NC_("STR_INSERT_TEXT", "Insert Text")
+#define STR_LOAD_PRESENTATION_LAYOUT NC_("STR_LOAD_PRESENTATION_LAYOUT", "Load Master Slide")
+#define STR_GLUE_ESCDIR_SMART NC_("STR_GLUE_ESCDIR_SMART", "Smart")
+#define STR_GLUE_ESCDIR_LEFT NC_("STR_GLUE_ESCDIR_LEFT", "Left")
+#define STR_GLUE_ESCDIR_RIGHT NC_("STR_GLUE_ESCDIR_RIGHT", "Right")
+#define STR_GLUE_ESCDIR_TOP NC_("STR_GLUE_ESCDIR_TOP", "Top")
+#define STR_GLUE_ESCDIR_BOTTOM NC_("STR_GLUE_ESCDIR_BOTTOM", "Bottom")
+#define STR_GLUE_ESCDIR_LO NC_("STR_GLUE_ESCDIR_LO", "Top Left?")
+#define STR_GLUE_ESCDIR_LU NC_("STR_GLUE_ESCDIR_LU", "Bottom Left?")
+#define STR_GLUE_ESCDIR_RO NC_("STR_GLUE_ESCDIR_RO", "Top Right?")
+#define STR_GLUE_ESCDIR_RU NC_("STR_GLUE_ESCDIR_RU", "Bottom Right?")
+#define STR_GLUE_ESCDIR_HORZ NC_("STR_GLUE_ESCDIR_HORZ", "Horizontal")
+#define STR_GLUE_ESCDIR_VERT NC_("STR_GLUE_ESCDIR_VERT", "Vertical")
+#define STR_GLUE_ESCDIR_ALL NC_("STR_GLUE_ESCDIR_ALL", "All?")
+#define STR_CANT_PERFORM_IN_LIVEMODE NC_("STR_CANT_PERFORM_IN_LIVEMODE", "This action can't be run in the live mode.")
+#define STR_PUBLISH_BACK NC_("STR_PUBLISH_BACK", "Back")
+#define STR_PUBLISH_NEXT NC_("STR_PUBLISH_NEXT", "Continue")
+#define STR_PUBLISH_OUTLINE NC_("STR_PUBLISH_OUTLINE", "Overview")
+#define STR_EYEDROPPER NC_("STR_EYEDROPPER", "Color Replacer")
+#define STR_UNDO_MORPHING NC_("STR_UNDO_MORPHING", "Cross-fading")
+#define STR_UNDO_EXPAND_PAGE NC_("STR_UNDO_EXPAND_PAGE", "Expand Slide")
+#define STR_UNDO_SUMMARY_PAGE NC_("STR_UNDO_SUMMARY_PAGE", "Table of Contents Slide")
+#define STR_TWAIN_NO_SOURCE_UNX NC_("STR_TWAIN_NO_SOURCE_UNX", "No SANE source is available at the moment.")
+#define STR_TWAIN_NO_SOURCE NC_("STR_TWAIN_NO_SOURCE", "At present, no TWAIN source is available.")
+#define STR_FIX NC_("STR_FIX", "Fixed")
+#define STR_VAR NC_("STR_VAR", "Variable")
+#define STR_STANDARD_NORMAL NC_("STR_STANDARD_NORMAL", "Standard")
+#define STR_STANDARD_SMALL NC_("STR_STANDARD_SMALL", "Standard (short)")
+#define STR_STANDARD_BIG NC_("STR_STANDARD_BIG", "Standard (long)")
+#define STR_FILEFORMAT_NAME_EXT NC_("STR_FILEFORMAT_NAME_EXT", "File name")
+#define STR_FILEFORMAT_FULLPATH NC_("STR_FILEFORMAT_FULLPATH", "Path/File name")
+#define STR_FILEFORMAT_PATH NC_("STR_FILEFORMAT_PATH", "Path")
+#define STR_FILEFORMAT_NAME NC_("STR_FILEFORMAT_NAME", "File name without extension")
+#define STR_NEW_CUSTOMSHOW NC_("STR_NEW_CUSTOMSHOW", "New Custom Slide Show")
+#define STR_COPY_CUSTOMSHOW NC_("STR_COPY_CUSTOMSHOW", "Copy ")
+#define STR_IMPRESS_DOCUMENT_FULLTYPE_60 NC_("STR_IMPRESS_DOCUMENT_FULLTYPE_60", "%PRODUCTNAME Presentation format (Impress 6)")
+#define STR_GRAPHIC_DOCUMENT_FULLTYPE_60 NC_("STR_GRAPHIC_DOCUMENT_FULLTYPE_60", "%PRODUCTNAME Drawing format (Draw 6)")
+#define STR_BREAK_METAFILE NC_("STR_BREAK_METAFILE", "Ungroup Metafile(s)...")
+#define STR_BREAK_FAIL NC_("STR_BREAK_FAIL", "It was not possible to ungroup all drawing objects.")
+#define STR_IMPRESS_DOCUMENT_FULLTYPE_80 NC_("STR_IMPRESS_DOCUMENT_FULLTYPE_80", "%PRODUCTNAME %PRODUCTVERSION Presentation")
+#define STR_GRAPHIC_DOCUMENT_FULLTYPE_80 NC_("STR_GRAPHIC_DOCUMENT_FULLTYPE_80", "%PRODUCTNAME %PRODUCTVERSION Drawing")
+
+// HtmlExport
+#define STR_PUBDLG_SAMENAME NC_("STR_PUBDLG_SAMENAME", "A design already exists with this name.\nDo you want to replace it?")
+#define STR_HTMLATTR_TEXT NC_("STR_HTMLATTR_TEXT", "Text")
+#define STR_HTMLATTR_LINK NC_("STR_HTMLATTR_LINK", "Hyperlink")
+#define STR_HTMLATTR_VLINK NC_("STR_HTMLATTR_VLINK", "Visited link")
+#define STR_HTMLATTR_ALINK NC_("STR_HTMLATTR_ALINK", "Active link")
+#define STR_HTMLEXP_NOTES NC_("STR_HTMLEXP_NOTES", "Notes")
+#define STR_HTMLEXP_CONTENTS NC_("STR_HTMLEXP_CONTENTS", "Table of contents")
+#define STR_HTMLEXP_CLICKSTART NC_("STR_HTMLEXP_CLICKSTART", "Click here to start")
+#define STR_HTMLEXP_AUTHOR NC_("STR_HTMLEXP_AUTHOR", "Author")
+#define STR_HTMLEXP_EMAIL NC_("STR_HTMLEXP_EMAIL", "Email")
+#define STR_HTMLEXP_HOMEPAGE NC_("STR_HTMLEXP_HOMEPAGE", "Homepage")
+#define STR_HTMLEXP_INFO NC_("STR_HTMLEXP_INFO", "Further information")
+#define STR_HTMLEXP_DOWNLOAD NC_("STR_HTMLEXP_DOWNLOAD", "Download presentation")
+#define STR_HTMLEXP_NOFRAMES NC_("STR_HTMLEXP_NOFRAMES", "Unfortunately your browser does not support floating frames.")
+#define STR_HTMLEXP_FIRSTPAGE NC_("STR_HTMLEXP_FIRSTPAGE", "First page")
+#define STR_HTMLEXP_LASTPAGE NC_("STR_HTMLEXP_LASTPAGE", "Last page")
+#define STR_HTMLEXP_SETTEXT NC_("STR_HTMLEXP_SETTEXT", "Text")
+#define STR_HTMLEXP_SETGRAPHIC NC_("STR_HTMLEXP_SETGRAPHIC", "Image")
+#define STR_HTMLEXP_OUTLINE NC_("STR_HTMLEXP_OUTLINE", "With contents")
+#define STR_HTMLEXP_NOOUTLINE NC_("STR_HTMLEXP_NOOUTLINE", "Without contents")
+#define STR_WEBVIEW_SAVE NC_("STR_WEBVIEW_SAVE", "To given page")
+#define STR_UNDO_VECTORIZE NC_("STR_UNDO_VECTORIZE", "Convert bitmap to polygon" )
+#define STR_PRES_SOFTEND NC_("STR_PRES_SOFTEND", "Click to exit presentation..." )
+#define STR_PRES_PAUSE NC_("STR_PRES_PAUSE", "Pause..." )
+#define STR_UNDO_APPLY_3D_FAVOURITE NC_("STR_UNDO_APPLY_3D_FAVOURITE", "Apply 3D favorite")
+#define STR_UNDO_GRAFFILTER NC_("STR_UNDO_GRAFFILTER", "Image filter" )
+#define STR_WARNING_NOSOUNDFILE NC_("STR_WARNING_NOSOUNDFILE", "The file %\nis not a valid audio file !" )
+#define STR_UNDO_CONVERT_TO_METAFILE NC_("STR_UNDO_CONVERT_TO_METAFILE", "Convert to metafile" )
+#define STR_UNDO_CONVERT_TO_BITMAP NC_("STR_UNDO_CONVERT_TO_BITMAP", "Convert to bitmap")
+#define STR_HTMLEXP_ERROR_CREATE_FILE NC_("STR_HTMLEXP_ERROR_CREATE_FILE", "Cannot create the file $(URL1).")
+#define STR_HTMLEXP_ERROR_OPEN_FILE NC_("STR_HTMLEXP_ERROR_OPEN_FILE", "Could not open the file $(URL1).")
+#define STR_HTMLEXP_ERROR_COPY_FILE NC_("STR_HTMLEXP_ERROR_COPY_FILE", "The file $(URL1) could not be copied to $(URL2)")
+#define STR_STATUSBAR_MASTERPAGE NC_("STR_STATUSBAR_MASTERPAGE", "Slide Master name. Right-click for list or click for dialog.")
+#define STR_TITLE_RENAMESLIDE NC_("STR_TITLE_RENAMESLIDE", "Rename Slide")
+#define STR_TITLE_RENAMEPAGE NC_("STR_TITLE_RENAMEPAGE", "Rename Page")
+#define STR_TOOLTIP_RENAME NC_("STR_TOOLTIP_RENAME", "Duplicate or empty names are not possible")
+#define STR_DESC_RENAMESLIDE NC_("STR_DESC_RENAMESLIDE", "Name")
+#define STR_TITLE_RENAMEMASTER NC_("STR_TITLE_RENAMEMASTER", "Rename Master Slide")
+#define STR_PLACEHOLDER_DESCRIPTION_TITLE NC_("STR_PLACEHOLDER_DESCRIPTION_TITLE", "Title Area for AutoLayouts" )
+#define STR_PLACEHOLDER_DESCRIPTION_OUTLINE NC_("STR_PLACEHOLDER_DESCRIPTION_OUTLINE", "Object Area for AutoLayouts" )
+#define STR_PLACEHOLDER_DESCRIPTION_FOOTER NC_("STR_PLACEHOLDER_DESCRIPTION_FOOTER", "Footer Area" )
+#define STR_PLACEHOLDER_DESCRIPTION_HEADER NC_("STR_PLACEHOLDER_DESCRIPTION_HEADER", "Header Area" )
+#define STR_PLACEHOLDER_DESCRIPTION_DATETIME NC_("STR_PLACEHOLDER_DESCRIPTION_DATETIME", "Date Area" )
+#define STR_PLACEHOLDER_DESCRIPTION_SLIDE NC_("STR_PLACEHOLDER_DESCRIPTION_SLIDE", "Slide Number Area" )
+#define STR_PLACEHOLDER_DESCRIPTION_NUMBER NC_("STR_PLACEHOLDER_DESCRIPTION_NUMBER", "Page Number Area" )
+#define STR_FIELD_PLACEHOLDER_HEADER NC_("STR_FIELD_PLACEHOLDER_HEADER", "<header>" )
+#define STR_FIELD_PLACEHOLDER_FOOTER NC_("STR_FIELD_PLACEHOLDER_FOOTER", "<footer>" )
+#define STR_FIELD_PLACEHOLDER_DATETIME NC_("STR_FIELD_PLACEHOLDER_DATETIME", "<date/time>" )
+#define STR_FIELD_PLACEHOLDER_NUMBER NC_("STR_FIELD_PLACEHOLDER_NUMBER", "<number>" )
+#define STR_FIELD_PLACEHOLDER_COUNT NC_("STR_FIELD_PLACEHOLDER_COUNT", "<count>" )
+#define STR_FIELD_PLACEHOLDER_SLIDENAME NC_("STR_FIELD_PLACEHOLDER_SLIDENAME", "<slide-name>" )
+#define STR_FIELD_PLACEHOLDER_PAGENAME NC_("STR_FIELD_PLACEHOLDER_PAGENAME", "<page-name>" )
+#define STR_PLACEHOLDER_DESCRIPTION_NOTES NC_("STR_PLACEHOLDER_DESCRIPTION_NOTES", "Notes Area")
+#define STR_UNDO_HANGULHANJACONVERSION NC_("STR_UNDO_HANGULHANJACONVERSION", "Hangul/Hanja Conversion")
+#define STR_LEFT_PANE_IMPRESS_TITLE NC_("STR_LEFT_PANE_IMPRESS_TITLE", "Slides")
+#define STR_LEFT_PANE_DRAW_TITLE NC_("STR_LEFT_PANE_DRAW_TITLE", "Pages")
+#define STR_TASKPANEL_NOT_AVAILABLE_SUBSTITUTION NC_("STR_TASKPANEL_NOT_AVAILABLE_SUBSTITUTION", "Preview not available")
+#define STR_TASKPANEL_PREPARING_PREVIEW_SUBSTITUTION NC_("STR_TASKPANEL_PREPARING_PREVIEW_SUBSTITUTION", "Preparing preview")
+#define STR_TASKPANEL_LAYOUT_MENU_TITLE NC_("STR_TASKPANEL_LAYOUT_MENU_TITLE", "Layouts")
+#define STR_GRAPHICS_STYLE_FAMILY NC_("STR_GRAPHICS_STYLE_FAMILY", "Drawing Styles")
+#define STR_PRESENTATIONS_STYLE_FAMILY NC_("STR_PRESENTATIONS_STYLE_FAMILY", "Presentation Styles")
+#define STR_CELL_STYLE_FAMILY NC_("STR_CELL_STYLE_FAMILY", "Cell Styles")
+#define STR_NAVIGATOR_SHAPE_BASE_NAME NC_("STR_NAVIGATOR_SHAPE_BASE_NAME", "Shape %1")
+#define STR_SET_BACKGROUND_PICTURE NC_("STR_SET_BACKGROUND_PICTURE", "Set Background Image" )
+#define RID_ANNOTATIONS_START NC_("RID_ANNOTATIONS_START", "Comments")
+#define STR_RESET_LAYOUT NC_("STR_RESET_LAYOUT", "Reset Slide Layout")
+#define STR_INSERT_TABLE NC_("STR_INSERT_TABLE", "Insert Table")
+#define STR_INSERT_CHART NC_("STR_INSERT_CHART", "Insert Chart")
+#define STR_INSERT_PICTURE NC_("STR_INSERT_PICTURE", "Insert Image")
+#define STR_INSERT_MOVIE NC_("STR_INSERT_MOVIE", "Insert Audio or Video")
+#define STRING_DRAG_AND_DROP_PAGES NC_("STRING_DRAG_AND_DROP_PAGES", "Drag and Drop Pages" )
+#define STRING_DRAG_AND_DROP_SLIDES NC_("STRING_DRAG_AND_DROP_SLIDES", "Drag and Drop Slides" )
+#define STR_PHOTO_ALBUM_EMPTY_WARNING NC_("STR_PHOTO_ALBUM_EMPTY_WARNING", "Please add Images to the Album." )
+#define STR_PHOTO_ALBUM_TEXTBOX NC_("STR_PHOTO_ALBUM_TEXTBOX", "Text Slide")
+#define STR_OVERWRITE_WARNING NC_("STR_OVERWRITE_WARNING", "The local target directory '%FILENAME' is not empty. Some files might be overwritten. Do you want to continue?")
+
+#define STR_LAYER_BCKGRND NC_("STR_LAYER_BCKGRND", "Background" )
+#define STR_LAYER_BCKGRNDOBJ NC_("STR_LAYER_BCKGRNDOBJ", "Background objects" )
+#define STR_LAYER_LAYOUT NC_("STR_LAYER_LAYOUT", "Layout" )
+#define STR_LAYER_CONTROLS NC_("STR_LAYER_CONTROLS", "Controls" )
+#define STR_LAYER_MEASURELINES NC_("STR_LAYER_MEASURELINES", "Dimension Lines" )
+#define STR_PAGE NC_("STR_PAGE", "Slide" )
+#define STR_PAGE_NAME NC_("STR_PAGE_NAME", "Page" )
+#define STR_SLIDE_NAME NC_("STR_SLIDE_NAME", "Slide" )
+#define STR_MASTERSLIDE_NAME NC_("STR_MASTERSLIDE_NAME", "Master Slide")
+#define STR_MASTERSLIDE_LABEL NC_("STR_MASTERSLIDE_LABEL", "Master Slide:")
+#define STR_MASTERPAGE_NAME NC_("STR_MASTERPAGE_NAME", "Master Page")
+#define STR_MASTERPAGE_LABEL NC_("STR_MASTERPAGE_LABEL", "Master Page:")
+#define STR_NOTES NC_("STR_NOTES", "(Notes)" )
+#define STR_HANDOUT NC_("STR_HANDOUT", "Handouts" )
+#define STR_PRESOBJ_MPTITLE NC_("STR_PRESOBJ_MPTITLE", "Click to edit the title text format" )
+#define STR_PRESOBJ_MPOUTLINE NC_("STR_PRESOBJ_MPOUTLINE", "Click to edit the outline text format" )
+#define STR_PRESOBJ_MPTITLE_MOBILE NC_("STR_PRESOBJ_MPTITLE_MOBILE", "Double-tap to edit the title text format" )
+#define STR_PRESOBJ_MPOUTLINE_MOBILE NC_("STR_PRESOBJ_MPOUTLINE_MOBILE", "Double-tap to edit the outline text format" )
+#define STR_PRESOBJ_MPOUTLLAYER2 NC_("STR_PRESOBJ_MPOUTLLAYER2", "Second Outline Level" )
+#define STR_PRESOBJ_MPOUTLLAYER3 NC_("STR_PRESOBJ_MPOUTLLAYER3", "Third Outline Level" )
+#define STR_PRESOBJ_MPOUTLLAYER4 NC_("STR_PRESOBJ_MPOUTLLAYER4", "Fourth Outline Level" )
+#define STR_PRESOBJ_MPOUTLLAYER5 NC_("STR_PRESOBJ_MPOUTLLAYER5", "Fifth Outline Level" )
+#define STR_PRESOBJ_MPOUTLLAYER6 NC_("STR_PRESOBJ_MPOUTLLAYER6", "Sixth Outline Level" )
+#define STR_PRESOBJ_MPOUTLLAYER7 NC_("STR_PRESOBJ_MPOUTLLAYER7", "Seventh Outline Level" )
+#define STR_PRESOBJ_MPNOTESTITLE NC_("STR_PRESOBJ_MPNOTESTITLE", "Click to move the slide" )
+#define STR_PRESOBJ_MPNOTESTEXT NC_("STR_PRESOBJ_MPNOTESTEXT", "Click to edit the notes format" )
+#define STR_PRESOBJ_MPNOTESTITLE_MOBILE NC_("STR_PRESOBJ_MPNOTESTITLE_MOBILE", "Double-tap to move the slide" )
+#define STR_PRESOBJ_MPNOTESTEXT_MOBILE NC_("STR_PRESOBJ_MPNOTESTEXT_MOBILE", "Double-tap to edit the notes format" )
+#define STR_PRESOBJ_TITLE NC_("STR_PRESOBJ_TITLE", "Click to add Title" )
+#define STR_PRESOBJ_OUTLINE NC_("STR_PRESOBJ_OUTLINE", "Click to add Text" )
+#define STR_PRESOBJ_TEXT NC_("STR_PRESOBJ_TEXT", "Click to add Text" )
+#define STR_PRESOBJ_NOTESTEXT NC_("STR_PRESOBJ_NOTESTEXT", "Click to add Notes" )
+#define STR_PRESOBJ_TITLE_MOBILE NC_("STR_PRESOBJ_TITLE_MOBILE", "Double-tap to add Title" )
+#define STR_PRESOBJ_OUTLINE_MOBILE NC_("STR_PRESOBJ_OUTLINE_MOBILE", "Double-tap to add Text" )
+#define STR_PRESOBJ_TEXT_MOBILE NC_("STR_PRESOBJ_TEXT_MOBILE", "Double-tap to add Text" )
+#define STR_PRESOBJ_TEXT_EDIT_MOBILE NC_("STR_PRESOBJ_TEXT_MOBILE", "Tap to edit text" )
+#define STR_PRESOBJ_NOTESTEXT_MOBILE NC_("STR_PRESOBJ_NOTESTEXT_MOBILE", "Double-tap to add Notes" )
+#define STR_PRESOBJ_GRAPHIC NC_("STR_PRESOBJ_GRAPHIC", "Double-click to add an Image" )
+#define STR_PRESOBJ_OBJECT NC_("STR_PRESOBJ_OBJECT", "Double-click to add an Object" )
+#define STR_PRESOBJ_CHART NC_("STR_PRESOBJ_CHART", "Double-click to add a Chart" )
+#define STR_PRESOBJ_ORGCHART NC_("STR_PRESOBJ_ORGCHART", "Double-click to add an Organization Chart" )
+#define STR_PRESOBJ_TABLE NC_("STR_PRESOBJ_TABLE", "Double-click to add a Spreadsheet" )
+#define STR_LAYOUT_DEFAULT_NAME NC_("STR_LAYOUT_DEFAULT_NAME", "Default" )
+#define STR_LAYOUT_DEFAULT_TITLE_NAME NC_("STR_LAYOUT_DEFAULT_TITLE_NAME", "Title" )
+#define STR_STANDARD_STYLESHEET_NAME NC_("STR_STANDARD_STYLESHEET_NAME", "Default Drawing Style" )
+#define STR_UNDO_MOVEPAGES NC_("STR_UNDO_MOVEPAGES", "Move slides" )
+#define STR_INSERT_PAGES NC_("STR_INSERT_PAGES", "Insert Pages" )
+#define STR_INSERT_PAGE_DRAW NC_("STR_INSERT_PAGE_DRAW", "Insert Page" )
+#define STR_SLIDE_SETUP_TITLE NC_("STR_SLIDE_SETUP_TITLE", "Slide Properties" )
+
+#define STR_POOLSHEET_OBJWITHOUTFILL NC_("STR_POOLSHEET_OBJWITHOUTFILL", "Object without fill" )
+#define STR_POOLSHEET_OBJNOLINENOFILL NC_("STR_POOLSHEET_OBJNOLINENOFILL", "Object with no fill and no line" )
+#define STR_POOLSHEET_TEXT NC_("STR_POOLSHEET_TEXT", "Text" )
+#define STR_POOLSHEET_A4 NC_("STR_POOLSHEET_A4", "A4" )
+#define STR_POOLSHEET_A4_TITLE NC_("STR_POOLSHEET_A4_TITLE", "Title A4" )
+#define STR_POOLSHEET_A4_HEADLINE NC_("STR_POOLSHEET_A4_HEADLINE", "Heading A4" )
+#define STR_POOLSHEET_A4_TEXT NC_("STR_POOLSHEET_A4_TEXT", "Text A4" )
+#define STR_POOLSHEET_A0 NC_("STR_POOLSHEET_A0", "A0" )
+#define STR_POOLSHEET_A0_TITLE NC_("STR_POOLSHEET_A0_TITLE", "Title A0" )
+#define STR_POOLSHEET_A0_HEADLINE NC_("STR_POOLSHEET_A0_HEADLINE", "Heading A0" )
+#define STR_POOLSHEET_A0_TEXT NC_("STR_POOLSHEET_A0_TEXT", "Text A0" )
+#define STR_POOLSHEET_GRAPHIC NC_("STR_POOLSHEET_GRAPHIC", "Graphic" )
+#define STR_POOLSHEET_SHAPES NC_("STR_POOLSHEET_GRAPHIC", "Shapes" )
+#define STR_POOLSHEET_LINES NC_("STR_POOLSHEET_LINES", "Lines" )
+#define STR_POOLSHEET_MEASURE NC_("STR_POOLSHEET_MEASURE", "Arrow Line" )
+#define STR_POOLSHEET_LINES_DASHED NC_("STR_POOLSHEET_LINES_DASHED", "Dashed Line" )
+
+#define STR_POOLSHEET_FILLED NC_("STR_POOLSHEET_FILLED", "Filled" )
+#define STR_POOLSHEET_FILLED_BLUE NC_("STR_POOLSHEET_FILLED_BLUE", "Filled Blue" )
+#define STR_POOLSHEET_FILLED_GREEN NC_("STR_POOLSHEET_FILLED_GREEN", "Filled Green" )
+#define STR_POOLSHEET_FILLED_YELLOW NC_("STR_POOLSHEET_FILLED_YELLOW", "Filled Yellow" )
+#define STR_POOLSHEET_FILLED_RED NC_("STR_POOLSHEET_FILLED_RED", "Filled Red" )
+
+#define STR_POOLSHEET_OUTLINE NC_("STR_POOLSHEET_OUTLINE", "Outlined" )
+#define STR_POOLSHEET_OUTLINE_BLUE NC_("STR_POOLSHEET_OUTLINE_BLUE", "Outlined Blue" )
+#define STR_POOLSHEET_OUTLINE_GREEN NC_("STR_POOLSHEET_OUTLINE_GREEN", "Outlined Green" )
+#define STR_POOLSHEET_OUTLINE_YELLOW NC_("STR_POOLSHEET_OUTLINE_YELLOW", "Outlined Yellow" )
+#define STR_POOLSHEET_OUTLINE_RED NC_("STR_POOLSHEET_OUTLINE_RED", "Outlined Red" )
+
+#define STR_PSEUDOSHEET_TITLE NC_("STR_PSEUDOSHEET_TITLE", "Title" )
+#define STR_PSEUDOSHEET_SUBTITLE NC_("STR_PSEUDOSHEET_SUBTITLE", "Subtitle")
+#define STR_PSEUDOSHEET_OUTLINE NC_("STR_PSEUDOSHEET_OUTLINE", "Outline" )
+#define STR_PSEUDOSHEET_BACKGROUNDOBJECTS NC_("STR_PSEUDOSHEET_BACKGROUNDOBJECTS", "Background objects" )
+#define STR_PSEUDOSHEET_BACKGROUND NC_("STR_PSEUDOSHEET_BACKGROUND", "Background" )
+#define STR_PSEUDOSHEET_NOTES NC_("STR_PSEUDOSHEET_NOTES", "Notes" )
+#define STR_POWERPOINT_IMPORT NC_("STR_POWERPOINT_IMPORT", "PowerPoint Import")
+#define STR_SAVE_DOC NC_("STR_SAVE_DOC", "Save Document" )
+#define STR_POOLSHEET_BANDED_CELL NC_("STR_POOLSHEET_BANDED_CELL", "Banding cell" )
+#define STR_POOLSHEET_HEADER NC_("STR_POOLSHEET_HEADER", "Header" )
+#define STR_POOLSHEET_TOTAL NC_("STR_POOLSHEET_TOTAL", "Total line" )
+#define STR_POOLSHEET_FIRST_COLUMN NC_("STR_POOLSHEET_FIRST_COLUMN", "First column" )
+#define STR_POOLSHEET_LAST_COLUMN NC_("STR_POOLSHEET_LAST_COLUMN", "Last column" )
+#define STR_SHRINK_FONT_SIZE NC_("STR_SHRINK_FONT_SIZE", "Shrink font size")
+#define STR_GROW_FONT_SIZE NC_("STR_GROW_FONT_SIZE", "Grow font size")
+
+/* Names and descriptions of the Draw/Impress accessibility views
+ ==============================================================
+*/
+#define SID_SD_A11Y_D_DRAWVIEW_N NC_("SID_SD_A11Y_D_DRAWVIEW_N", "Drawing View")
+#define SID_SD_A11Y_I_DRAWVIEW_N NC_("SID_SD_A11Y_I_DRAWVIEW_N", "Drawing View")
+#define SID_SD_A11Y_I_OUTLINEVIEW_N NC_("SID_SD_A11Y_I_OUTLINEVIEW_N", "Outline View")
+#define SID_SD_A11Y_I_SLIDEVIEW_N NC_("SID_SD_A11Y_I_SLIDEVIEW_N", "Slides View")
+#define SID_SD_A11Y_I_SLIDEVIEW_D NC_("SID_SD_A11Y_I_SLIDEVIEW_D", "This is where you sort slides.")
+#define SID_SD_A11Y_I_NOTESVIEW_N NC_("SID_SD_A11Y_I_NOTESVIEW_N", "Notes View")
+#define SID_SD_A11Y_I_HANDOUTVIEW_N NC_("SID_SD_A11Y_I_HANDOUTVIEW_N", "Handout View")
+#define SID_SD_A11Y_P_TITLE_N NC_("SID_SD_A11Y_P_TITLE_N", "PresentationTitle")
+#define SID_SD_A11Y_P_OUTLINER_N NC_("SID_SD_A11Y_P_OUTLINER_N", "PresentationOutliner")
+#define SID_SD_A11Y_P_SUBTITLE_N NC_("SID_SD_A11Y_P_SUBTITLE_N", "PresentationSubtitle")
+#define SID_SD_A11Y_P_PAGE_N NC_("SID_SD_A11Y_P_PAGE_N", "PresentationPage")
+#define SID_SD_A11Y_P_NOTES_N NC_("SID_SD_A11Y_P_NOTES_N", "PresentationNotes")
+#define SID_SD_A11Y_P_HANDOUT_N NC_("SID_SD_A11Y_P_HANDOUT_N", "Handout")
+#define SID_SD_A11Y_P_UNKNOWN_N NC_("SID_SD_A11Y_P_UNKNOWN_N", "UnknownAccessiblePresentationShape")
+#define SID_SD_A11Y_P_FOOTER_N NC_("SID_SD_A11Y_P_FOOTER_N", "PresentationFooter")
+#define SID_SD_A11Y_P_HEADER_N NC_("SID_SD_A11Y_P_HEADER_N", "PresentationHeader")
+#define SID_SD_A11Y_P_DATE_N NC_("SID_SD_A11Y_P_DATE_N", "PresentationDateAndTime")
+#define SID_SD_A11Y_P_NUMBER_N NC_("SID_SD_A11Y_P_NUMBER_N", "PresentationPageNumber")
+#define SID_SD_A11Y_D_PRESENTATION NC_("SID_SD_A11Y_D_PRESENTATION", "%PRODUCTNAME Presentation")
+#define SID_SD_A11Y_P_TITLE_N_STYLE NC_("SID_SD_A11Y_P_TITLE_N_STYLE", "Title")
+#define SID_SD_A11Y_P_OUTLINER_N_STYLE NC_("SID_SD_A11Y_P_OUTLINER_N_STYLE", "Outliner")
+#define SID_SD_A11Y_P_SUBTITLE_N_STYLE NC_("SID_SD_A11Y_P_SUBTITLE_N_STYLE", "Subtitle")
+#define SID_SD_A11Y_P_PAGE_N_STYLE NC_("SID_SD_A11Y_P_PAGE_N_STYLE", "Page")
+#define SID_SD_A11Y_P_NOTES_N_STYLE NC_("SID_SD_A11Y_P_NOTES_N_STYLE", "Notes")
+#define SID_SD_A11Y_P_HANDOUT_N_STYLE NC_("SID_SD_A11Y_P_HANDOUT_N_STYLE", "Handout")
+#define SID_SD_A11Y_P_UNKNOWN_N_STYLE NC_("SID_SD_A11Y_P_UNKNOWN_N_STYLE", "Unknown Accessible Presentation Shape")
+#define SID_SD_A11Y_P_FOOTER_N_STYLE NC_("SID_SD_A11Y_P_FOOTER_N_STYLE", "Footer")
+#define SID_SD_A11Y_P_HEADER_N_STYLE NC_("SID_SD_A11Y_P_HEADER_N_STYLE", "Header")
+#define SID_SD_A11Y_P_DATE_N_STYLE NC_("SID_SD_A11Y_P_DATE_N_STYLE", "Date")
+#define SID_SD_A11Y_P_NUMBER_N_STYLE NC_("SID_SD_A11Y_P_NUMBER_N_STYLE", "Number")
+#define SID_SD_A11Y_D_PRESENTATION_READONLY NC_("SID_SD_A11Y_D_PRESENTATION_READONLY", "(read-only)")
+
+#define STR_CUSTOMANIMATION_REPEAT_NONE NC_("STR_CUSTOMANIMATION_REPEAT_NONE", "none")
+#define STR_CUSTOMANIMATION_REPEAT_UNTIL_NEXT_CLICK NC_("STR_CUSTOMANIMATION_REPEAT_UNTIL_NEXT_CLICK", "Until next click")
+#define STR_CUSTOMANIMATION_REPEAT_UNTIL_END_OF_SLIDE NC_("STR_CUSTOMANIMATION_REPEAT_UNTIL_END_OF_SLIDE", "Until end of slide")
+#define STR_CUSTOMANIMATION_DIRECTION_PROPERTY NC_("STR_CUSTOMANIMATION_DIRECTION_PROPERTY", "Direction:")
+#define STR_CUSTOMANIMATION_ZOOM_PROPERTY NC_("STR_CUSTOMANIMATION_ZOOM_PROPERTY", "Zoom:")
+#define STR_CUSTOMANIMATION_SPOKES_PROPERTY NC_("STR_CUSTOMANIMATION_SPOKES_PROPERTY", "Spokes:")
+#define STR_CUSTOMANIMATION_FIRST_COLOR_PROPERTY NC_("STR_CUSTOMANIMATION_FIRST_COLOR_PROPERTY", "First color:")
+#define STR_CUSTOMANIMATION_SECOND_COLOR_PROPERTY NC_("STR_CUSTOMANIMATION_SECOND_COLOR_PROPERTY", "Second color:")
+#define STR_CUSTOMANIMATION_FILL_COLOR_PROPERTY NC_("STR_CUSTOMANIMATION_FILL_COLOR_PROPERTY", "Fill color:")
+#define STR_CUSTOMANIMATION_STYLE_PROPERTY NC_("STR_CUSTOMANIMATION_STYLE_PROPERTY", "Style:")
+#define STR_CUSTOMANIMATION_FONT_PROPERTY NC_("STR_CUSTOMANIMATION_FONT_PROPERTY", "Font:")
+#define STR_CUSTOMANIMATION_FONT_COLOR_PROPERTY NC_("STR_CUSTOMANIMATION_FONT_COLOR_PROPERTY", "Font color:")
+#define STR_CUSTOMANIMATION_FONT_SIZE_STYLE_PROPERTY NC_("STR_CUSTOMANIMATION_FONT_SIZE_STYLE_PROPERTY", "Style:")
+#define STR_CUSTOMANIMATION_FONT_STYLE_PROPERTY NC_("STR_CUSTOMANIMATION_FONT_STYLE_PROPERTY", "Typeface:")
+#define STR_CUSTOMANIMATION_LINE_COLOR_PROPERTY NC_("STR_CUSTOMANIMATION_LINE_COLOR_PROPERTY", "Line color:")
+#define STR_CUSTOMANIMATION_SIZE_PROPERTY NC_("STR_CUSTOMANIMATION_SIZE_PROPERTY", "Font size:")
+#define STR_CUSTOMANIMATION_SCALE_PROPERTY NC_("STR_CUSTOMANIMATION_SCALE_PROPERTY", "Size:")
+#define STR_CUSTOMANIMATION_AMOUNT_PROPERTY NC_("STR_CUSTOMANIMATION_AMOUNT_PROPERTY", "Amount:")
+#define STR_CUSTOMANIMATION_COLOR_PROPERTY NC_("STR_CUSTOMANIMATION_COLOR_PROPERTY", "Color:")
+#define STR_CUSTOMANIMATION_NO_SOUND NC_("STR_CUSTOMANIMATION_NO_SOUND", "(No sound)")
+#define STR_CUSTOMANIMATION_STOP_PREVIOUS_SOUND NC_("STR_CUSTOMANIMATION_STOP_PREVIOUS_SOUND", "(Stop previous sound)")
+#define STR_CUSTOMANIMATION_BROWSE_SOUND NC_("STR_CUSTOMANIMATION_BROWSE_SOUND", "Other sound...")
+#define STR_CUSTOMANIMATION_SAMPLE NC_("STR_CUSTOMANIMATION_SAMPLE", "Sample")
+#define STR_CUSTOMANIMATION_TRIGGER NC_("STR_CUSTOMANIMATION_TRIGGER", "Trigger")
+#define STR_CUSTOMANIMATION_USERPATH NC_("STR_CUSTOMANIMATION_USERPATH", "User paths")
+#define STR_CUSTOMANIMATION_ENTRANCE NC_("STR_CUSTOMANIMATION_ENTRANCE", "Entrance: %1")
+#define STR_CUSTOMANIMATION_EMPHASIS NC_("STR_CUSTOMANIMATION_EMPHASIS", "Emphasis: %1")
+#define STR_CUSTOMANIMATION_EXIT NC_("STR_CUSTOMANIMATION_EXIT", "Exit: %1")
+#define STR_CUSTOMANIMATION_MOTION_PATHS NC_("STR_CUSTOMANIMATION_MOTION_PATHS", "Motion Paths: %1")
+#define STR_CUSTOMANIMATION_MISC NC_("STR_CUSTOMANIMATION_MISC", "Misc: %1")
+#define STR_SLIDETRANSITION_NONE NC_("STR_SLIDETRANSITION_NONE", "None")
+
+#define STR_ANNOTATION_TODAY NC_("STR_ANNOTATION_TODAY", "Today," )
+#define STR_ANNOTATION_YESTERDAY NC_("STR_ANNOTATION_YESTERDAY", "Yesterday," )
+#define STR_ANNOTATION_NOAUTHOR NC_("STR_ANNOTATION_NOAUTHOR", "(no author)" )
+#define STR_ANNOTATION_WRAP_FORWARD NC_("STR_ANNOTATION_WRAP_FORWARD", "%PRODUCTNAME Impress reached the end of the presentation. Do you want to continue at the beginning?")
+#define STR_ANNOTATION_WRAP_BACKWARD NC_("STR_ANNOTATION_WRAP_BACKWARD", "%PRODUCTNAME Impress reached the beginning of the presentation. Do you want to continue at the end?")
+#define STR_ANNOTATION_WRAP_FORWARD_DRAW NC_("STR_ANNOTATION_WRAP_FORWARD_DRAW", "%PRODUCTNAME Draw reached the end of the document. Do you want to continue at the beginning?")
+#define STR_ANNOTATION_WRAP_BACKWARD_DRAW NC_("STR_ANNOTATION_WRAP_BACKWARD_DRAW", "%PRODUCTNAME Draw reached the beginning of the document. Do you want to continue at the end?")
+#define STR_ANNOTATION_UNDO_INSERT NC_("STR_ANNOTATION_UNDO_INSERT", "Insert Comment")
+#define STR_ANNOTATION_UNDO_DELETE NC_("STR_ANNOTATION_UNDO_DELETE", "Delete Comment(s)")
+#define STR_ANNOTATION_UNDO_MOVE NC_("STR_ANNOTATION_UNDO_MOVE", "Move Comment")
+#define STR_ANNOTATION_UNDO_EDIT NC_("STR_ANNOTATION_UNDO_EDIT", "Edit Comment")
+#define STR_ANNOTATION_REPLY NC_("STR_ANNOTATION_REPLY", "Reply to %1" )
+
+#define RID_DRAW_MEDIA_TOOLBOX NC_("RID_DRAW_MEDIA_TOOLBOX", "Media Playback" )
+#define RID_DRAW_TABLE_TOOLBOX NC_("RID_DRAW_TABLE_TOOLBOX", "Table" )
+
+#define STR_IMPRESS_PRINT_UI_GROUP_NAME NC_("STR_IMPRESS_PRINT_UI_GROUP_NAME", "%PRODUCTNAME %s")
+#define STR_IMPRESS_PRINT_UI_CONTENT NC_("STR_IMPRESS_PRINT_UI_CONTENT", "Document")
+#define STR_IMPRESS_PRINT_UI_SLIDESPERPAGE NC_("STR_IMPRESS_PRINT_UI_SLIDESPERPAGE", "Slides per page:" )
+#define STR_IMPRESS_PRINT_UI_ORDER NC_("STR_IMPRESS_PRINT_UI_ORDER", "Order:" )
+#define STR_IMPRESS_PRINT_UI_INCLUDE_CONTENT NC_("STR_IMPRESS_PRINT_UI_INCLUDE_CONTENT", "~Contents")
+#define STR_IMPRESS_PRINT_UI_IS_PRINT_NAME NC_("STR_IMPRESS_PRINT_UI_IS_PRINT_NAME", "~Slide name")
+#define STR_DRAW_PRINT_UI_IS_PRINT_NAME NC_("STR_DRAW_PRINT_UI_IS_PRINT_NAME", "P~age name")
+#define STR_IMPRESS_PRINT_UI_IS_PRINT_DATE NC_("STR_IMPRESS_PRINT_UI_IS_PRINT_DATE", "~Date and time")
+#define STR_IMPRESS_PRINT_UI_IS_PRINT_HIDDEN NC_("STR_IMPRESS_PRINT_UI_IS_PRINT_HIDDEN", "Hidden pages")
+#define STR_IMPRESS_PRINT_UI_QUALITY NC_("STR_IMPRESS_PRINT_UI_QUALITY", "Color")
+#define STR_IMPRESS_PRINT_UI_PAGE_OPTIONS NC_("STR_IMPRESS_PRINT_UI_PAGE_OPTIONS", "~Size")
+#define STR_IMPRESS_PRINT_UI_BROCHURE NC_("STR_IMPRESS_PRINT_UI_BROCHURE", "Brochure")
+#define STR_IMPRESS_PRINT_UI_PAGE_SIDES NC_("STR_IMPRESS_PRINT_UI_PAGE_SIDES", "Page sides")
+#define STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE NC_("STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE", "Include")
+#define STR_IMPRESS_PRINT_UI_PAPER_TRAY NC_("STR_IMPRESS_PRINT_UI_PAPER_TRAY", "~Use only paper tray from printer preferences")
+#define STR_IMPRESS_PRINT_UI_PAGE_RANGE NC_("STR_IMPRESS_PRINT_UI_PAGE_RANGE", "Pages:")
+#define STR_IMPRESS_PRINT_UI_SLIDE_RANGE NC_("STR_IMPRESS_PRINT_UI_SLIDE_RANGE", "Slides:")
+
+#define STR_SAR_WRAP_FORWARD NC_("STR_SAR_WRAP_FORWARD", "%PRODUCTNAME Impress has searched to the end of the presentation. Do you want to continue at the beginning?")
+#define STR_SAR_WRAP_BACKWARD NC_("STR_SAR_WRAP_BACKWARD", "%PRODUCTNAME Impress has searched to the beginning of the presentation. Do you want to continue at the end?")
+#define STR_SAR_WRAP_FORWARD_DRAW NC_("STR_SAR_WRAP_FORWARD_DRAW", "%PRODUCTNAME Draw has searched to the end of the document. Do you want to continue at the beginning?")
+#define STR_SAR_WRAP_BACKWARD_DRAW NC_("STR_SAR_WRAP_BACKWARD_DRAW", "%PRODUCTNAME Draw has searched to the beginning of the document. Do you want to continue at the end?")
+
+#define STR_ANIMATION_DIALOG_TITLE NC_("STR_ANIMATION_DIALOG_TITLE", "Animation")
+
+#define RID_SVXSTR_EDIT_GRAPHIC NC_("RID_SVXSTR_EDIT_GRAPHIC", "Link")
+
+#define RID_SVXSTR_MENU_NEXT NC_("RID_SVXSTR_MENU_NEXT", "~Next")
+#define RID_SVXSTR_MENU_PREV NC_("RID_SVXSTR_MENU_NEXT", "~Previous")
+#define RID_SVXSTR_MENU_FIRST NC_("RID_SVXSTR_MENU_FIRST", "~First Slide")
+#define RID_SVXSTR_MENU_LAST NC_("RID_SVXSTR_MENU_LAST", "~Last Slide")
+
+#define STR_CLOSE_PANE NC_("STR_CLOSE_PANE", "Close Pane")
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/strings.hxx b/sd/inc/strings.hxx
new file mode 100644
index 000000000..ed8fb7dd3
--- /dev/null
+++ b/sd/inc/strings.hxx
@@ -0,0 +1,23 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+#pragma once
+
+#include <rtl/ustring.hxx>
+
+/* do not translate */
+inline constexpr OUStringLiteral STR_LAYOUT_TITLE = u"Titel";
+inline constexpr OUStringLiteral STR_LAYOUT_OUTLINE = u"Gliederung";
+inline constexpr OUStringLiteral STR_LAYOUT_BACKGROUND = u"Hintergrund";
+inline constexpr OUStringLiteral STR_LAYOUT_BACKGROUNDOBJECTS = u"Hintergrundobjekte";
+inline constexpr OUStringLiteral STR_LAYOUT_NOTES = u"Notizen";
+inline constexpr OUStringLiteral STR_LAYOUT_SUBTITLE = u"Untertitel";
+#define STR_HTMLEXP_DEFAULT_EXTENSION ".html"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sd/inc/textapi.hxx b/sd/inc/textapi.hxx
new file mode 100644
index 000000000..701103490
--- /dev/null
+++ b/sd/inc/textapi.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <editeng/unotext.hxx>
+#include <rtl/ref.hxx>
+#include <editeng/outliner.hxx>
+
+class SdDrawDocument;
+
+namespace sd {
+
+class TextAPIEditSource;
+
+class TextApiObject final : public SvxUnoText
+{
+public:
+ static rtl::Reference< TextApiObject > create( SdDrawDocument* pDoc );
+
+ virtual ~TextApiObject() noexcept override;
+
+ /// @throws css::uno::RuntimeException
+ void dispose();
+
+ std::optional<OutlinerParaObject> CreateText();
+ void SetText( OutlinerParaObject const & rText );
+ OUString GetText() const;
+
+ static TextApiObject* getImplementation( const css::uno::Reference< css::text::XText >& );
+
+private:
+ std::unique_ptr<TextAPIEditSource> mpSource;
+ TextApiObject( std::unique_ptr<TextAPIEditSource> pEditSource );
+};
+
+} // namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/undo/undofactory.hxx b/sd/inc/undo/undofactory.hxx
new file mode 100644
index 000000000..92b875c78
--- /dev/null
+++ b/sd/inc/undo/undofactory.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <svx/svdundo.hxx>
+
+namespace sd
+{
+
+class UndoFactory final : public SdrUndoFactory
+{
+public:
+ virtual std::unique_ptr<SdrUndoAction> CreateUndoRemoveObject(SdrObject& rObject) override;
+ virtual std::unique_ptr<SdrUndoAction> CreateUndoDeleteObject( SdrObject& rObject, bool bOrdNumDirect = false) override;
+ virtual std::unique_ptr<SdrUndoAction> CreateUndoObjectSetText( SdrObject& rNewObj, sal_Int32 nText ) override;
+ virtual std::unique_ptr<SdrUndoAction> CreateUndoReplaceObject( SdrObject& rOldObject, SdrObject& rNewObject ) override;
+ virtual std::unique_ptr<SdrUndoAction> CreateUndoGeoObject( SdrObject& rObject ) override;
+ virtual std::unique_ptr<SdrUndoAction> CreateUndoAttrObject( SdrObject& rObject, bool bStyleSheet1 = false, bool bSaveText = false ) override;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/undo/undomanager.hxx b/sd/inc/undo/undomanager.hxx
new file mode 100644
index 000000000..f4b2e6dd4
--- /dev/null
+++ b/sd/inc/undo/undomanager.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <svx/sdrundomanager.hxx>
+
+namespace sd
+{
+
+class UndoManager final : public SdrUndoManager
+{
+public:
+ UndoManager();
+
+ virtual void EnterListAction(const OUString &rComment, const OUString& rRepeatComment, sal_uInt16 nId, ViewShellId nViewShellId) override;
+
+ virtual void AddUndoAction( std::unique_ptr<SfxUndoAction> pAction, bool bTryMerg=false ) override;
+
+ /** Set or reset the undo manager linked with the called undo manager.
+ */
+ void SetLinkedUndoManager (SfxUndoManager* pLinkedUndoManager);
+
+private:
+ using SdrUndoManager::Undo;
+ using SdrUndoManager::Redo;
+
+ /** Used when the outline view is visible as a last resort to
+ synchronize the undo managers.
+ */
+ SfxUndoManager* mpLinkedUndoManager;
+
+ /** Call ClearRedo() at the linked undo manager, when present.
+
+ It should not be necessary to call ClearRedo() explicitly, but the
+ synchronization between the under managers of the document and the
+ outline view seems to have a bug. Therefore this method is called
+ whenever a new undo action is added.
+ */
+ void ClearLinkedRedoActions();
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/undo/undoobjects.hxx b/sd/inc/undo/undoobjects.hxx
new file mode 100644
index 000000000..4602187ec
--- /dev/null
+++ b/sd/inc/undo/undoobjects.hxx
@@ -0,0 +1,175 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <svx/svdundo.hxx>
+#include <pres.hxx>
+#include <tools/weakbase.hxx>
+#include <unotools/weakref.hxx>
+
+class SdrObjUserCall;
+class SdPage;
+
+namespace sd
+{
+class UndoRemovePresObjectImpl
+{
+protected:
+ UndoRemovePresObjectImpl(SdrObject& rObject);
+ virtual ~UndoRemovePresObjectImpl();
+
+ virtual void Undo();
+ virtual void Redo();
+
+private:
+ std::unique_ptr<SfxUndoAction> mpUndoUsercall;
+ std::unique_ptr<SfxUndoAction> mpUndoAnimation;
+ std::unique_ptr<SfxUndoAction> mpUndoPresObj;
+};
+
+class UndoRemoveObject final : public SdrUndoRemoveObj, public UndoRemovePresObjectImpl
+{
+public:
+ UndoRemoveObject(SdrObject& rObject);
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+private:
+ ::tools::WeakReference<SdrObject> mxSdrObject;
+};
+
+class UndoDeleteObject final : public SdrUndoDelObj, public UndoRemovePresObjectImpl
+{
+public:
+ UndoDeleteObject(SdrObject& rObject, bool bOrdNumDirect);
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+private:
+ ::tools::WeakReference<SdrObject> mxSdrObject;
+};
+
+class UndoReplaceObject final : public SdrUndoReplaceObj, public UndoRemovePresObjectImpl
+{
+public:
+ UndoReplaceObject(SdrObject& rOldObject, SdrObject& rNewObject);
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+private:
+ ::tools::WeakReference<SdrObject> mxSdrObject;
+};
+
+class UndoObjectSetText final : public SdrUndoObjSetText
+{
+public:
+ UndoObjectSetText(SdrObject& rNewObj, sal_Int32 nText);
+ virtual ~UndoObjectSetText() override;
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+private:
+ std::unique_ptr<SfxUndoAction> mpUndoAnimation;
+ bool mbNewEmptyPresObj;
+ ::tools::WeakReference<SdrObject> mxSdrObject;
+};
+
+// Undo for SdrObject::SetUserCall()
+
+class UndoObjectUserCall final : public SdrUndoObj
+{
+public:
+ UndoObjectUserCall(SdrObject& rNewObj);
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+private:
+ SdrObjUserCall* mpOldUserCall;
+ SdrObjUserCall* mpNewUserCall;
+ ::tools::WeakReference<SdrObject> mxSdrObject;
+};
+
+// Undo for SdPage::InsertPresObj() and SdPage::RemovePresObj()
+
+class UndoObjectPresentationKind final : public SdrUndoObj
+{
+public:
+ UndoObjectPresentationKind(SdrObject& rObject);
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+private:
+ PresObjKind meOldKind;
+ PresObjKind meNewKind;
+ ::unotools::WeakReference<SdPage> mxPage;
+ ::tools::WeakReference<SdrObject> mxSdrObject;
+};
+
+// Restores correct position and size for presentation shapes with user call
+// on undo
+
+class UndoAutoLayoutPosAndSize final : public SfxUndoAction
+{
+public:
+ UndoAutoLayoutPosAndSize(SdPage& rPage);
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+private:
+ ::unotools::WeakReference<SdPage> mxPage;
+};
+
+class UndoGeoObject final : public SdrUndoGeoObj
+{
+public:
+ UndoGeoObject(SdrObject& rNewObj);
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+private:
+ ::unotools::WeakReference<SdPage> mxPage;
+ ::tools::WeakReference<SdrObject> mxSdrObject;
+};
+
+class UndoAttrObject final : public SdrUndoAttrObj
+{
+public:
+ UndoAttrObject(SdrObject& rObject, bool bStyleSheet1, bool bSaveText);
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+private:
+ ::unotools::WeakReference<SdPage> mxPage;
+ ::tools::WeakReference<SdrObject> mxSdrObject;
+};
+
+} // namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/inc/undoanim.hxx b/sd/inc/undoanim.hxx
new file mode 100644
index 000000000..2d329b50d
--- /dev/null
+++ b/sd/inc/undoanim.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/animations/XAnimationNode.hpp>
+#include <svx/svdundo.hxx>
+#include <memory>
+
+#include "sdundo.hxx"
+
+class SdPage;
+
+namespace sd
+{
+struct UndoAnimationImpl;
+
+class UndoAnimation final : public SdrUndoAction
+{
+public:
+ UndoAnimation(SdDrawDocument* pDoc, SdPage* pThePage);
+ virtual ~UndoAnimation() override;
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+ virtual OUString GetComment() const override;
+
+private:
+ std::unique_ptr<UndoAnimationImpl> mpImpl;
+};
+
+struct UndoAnimationPathImpl;
+class UndoAnimationPath final : public SdrUndoAction
+{
+public:
+ UndoAnimationPath(SdDrawDocument* pDoc, SdPage* pThePage,
+ const css::uno::Reference<css::animations::XAnimationNode>& xNode);
+ virtual ~UndoAnimationPath() override;
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+ virtual OUString GetComment() const override;
+
+private:
+ std::unique_ptr<UndoAnimationPathImpl> mpImpl;
+};
+
+struct UndoTransitionImpl;
+
+class UndoTransition final : public SdUndoAction
+{
+public:
+ UndoTransition(SdDrawDocument* pDoc, SdPage* pThePage);
+ virtual ~UndoTransition() override;
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+ virtual OUString GetComment() const override;
+
+private:
+ std::unique_ptr<UndoTransitionImpl> mpImpl;
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/filter/eppt/data/custom-shape-bitmap-fill.pptx b/sd/qa/filter/eppt/data/custom-shape-bitmap-fill.pptx
new file mode 100644
index 000000000..b37d7b6a8
--- /dev/null
+++ b/sd/qa/filter/eppt/data/custom-shape-bitmap-fill.pptx
Binary files differ
diff --git a/sd/qa/filter/eppt/data/video-loop.pptx b/sd/qa/filter/eppt/data/video-loop.pptx
new file mode 100644
index 000000000..4cb7e20b7
--- /dev/null
+++ b/sd/qa/filter/eppt/data/video-loop.pptx
Binary files differ
diff --git a/sd/qa/filter/eppt/eppt.cxx b/sd/qa/filter/eppt/eppt.cxx
new file mode 100644
index 000000000..151b9cfce
--- /dev/null
+++ b/sd/qa/filter/eppt/eppt.cxx
@@ -0,0 +1,158 @@
+/* -*- 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 <test/bootstrapfixture.hxx>
+#include <unotest/macros_test.hxx>
+#include <test/xmltesttools.hxx>
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XMasterPageTarget.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/util/Color.hpp>
+
+#include <unotools/mediadescriptor.hxx>
+#include <unotools/tempfile.hxx>
+#include <test/xmldocptr.hxx>
+
+using namespace ::com::sun::star;
+
+namespace
+{
+/// Covers sd/source/filter/eppt/ fixes.
+class Test : public test::BootstrapFixture, public unotest::MacrosTest, public XmlTestTools
+{
+private:
+ uno::Reference<lang::XComponent> mxComponent;
+
+public:
+ void setUp() override;
+ void tearDown() override;
+ void registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) override;
+ uno::Reference<lang::XComponent>& getComponent() { return mxComponent; }
+};
+
+void Test::setUp()
+{
+ test::BootstrapFixture::setUp();
+
+ mxDesktop.set(frame::Desktop::create(mxComponentContext));
+}
+
+void Test::tearDown()
+{
+ if (mxComponent.is())
+ mxComponent->dispose();
+
+ test::BootstrapFixture::tearDown();
+}
+
+void Test::registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx)
+{
+ XmlTestTools::registerOOXMLNamespaces(pXmlXpathCtx);
+}
+
+constexpr OUStringLiteral DATA_DIRECTORY = u"/sd/qa/filter/eppt/data/";
+
+CPPUNIT_TEST_FIXTURE(Test, testOOXMLCustomShapeBitmapFill)
+{
+ // Save the bugdoc to PPT.
+ OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "custom-shape-bitmap-fill.pptx";
+ getComponent() = loadFromDesktop(aURL);
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ uno::Reference<frame::XStorable> xStorable(getComponent(), uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OUString("MS PowerPoint 97");
+ xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+ getComponent()->dispose();
+ getComponent() = loadFromDesktop(aTempFile.GetURL());
+
+ // Check if the bitmap shape was lost.
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(getComponent(), uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPages> xDrawPages = xDrawPagesSupplier->getDrawPages();
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPages->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY);
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: com.sun.star.drawing.GraphicObjectShape
+ // - Actual : com.sun.star.drawing.CustomShape
+ // i.e. the custom shape geometry was kept, but the actual bitmap was lost.
+ CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.GraphicObjectShape"),
+ xShape->getShapeType());
+}
+
+CPPUNIT_TEST_FIXTURE(Test, testThemeExport)
+{
+ // Given a document with a master slide and a theme, lt1 is set to 0x000002:
+ uno::Reference<lang::XComponent> xComponent = loadFromDesktop("private:factory/simpress");
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(xComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XMasterPageTarget> xDrawPage(
+ xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xMasterPage(xDrawPage->getMasterPage(), uno::UNO_QUERY);
+ comphelper::SequenceAsHashMap aMap;
+ aMap["Name"] <<= OUString("mytheme");
+ aMap["ColorSchemeName"] <<= OUString("mycolorscheme");
+ uno::Sequence<util::Color> aColorScheme
+ = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc };
+ aMap["ColorScheme"] <<= aColorScheme;
+ uno::Any aTheme(aMap.getAsConstPropertyValueList());
+ xMasterPage->setPropertyValue("Theme", aTheme);
+
+ // When exporting to PPTX:
+ utl::TempFile aTempFile;
+ uno::Reference<frame::XStorable> xStorable(xComponent, uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OUString("Impress Office Open XML");
+ aTempFile.EnableKillingFile();
+ xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+ validate(aTempFile.GetFileName(), test::OOXML);
+
+ // Then verify that this color is not lost:
+ std::unique_ptr<SvStream> pStream = parseExportStream(aTempFile, "ppt/theme/theme1.xml");
+ xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get());
+ assertXPath(pXmlDoc, "//a:clrScheme/a:lt1/a:srgbClr", "val", "000002");
+ // Without the fix in place, this test would have failed with:
+ // - Expected: 1
+ // - Actual : 0
+ // - XPath '//a:clrScheme/a:lt1/a:srgbClr' number of nodes is incorrect
+ // i.e. the RGB color was lost on export.
+ xComponent->dispose();
+}
+
+CPPUNIT_TEST_FIXTURE(Test, testLoopingFromAnimation)
+{
+ // Given a media shape that has an animation that specifies looping for the video:
+ OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "video-loop.pptx";
+ getComponent() = loadFromDesktop(aURL);
+
+ // When exporting that to PPTX:
+ utl::TempFile aTempFile;
+ uno::Reference<frame::XStorable> xStorable(getComponent(), uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OUString("Impress Office Open XML");
+ aTempFile.EnableKillingFile();
+ xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+ validate(aTempFile.GetFileName(), test::OOXML);
+
+ // Then make sure that the "infinite" repeat count is written:
+ std::unique_ptr<SvStream> pStream = parseExportStream(aTempFile, "ppt/slides/slide1.xml");
+ xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get());
+ // Without the fix in place, this test would have failed with:
+ // - Expected: 1
+ // - Actual : 0
+ // - In <>, XPath '//p:cMediaNode/p:cTn' number of nodes is incorrect
+ // i.e. the media node was lost on export, the video no longer looped.
+ assertXPath(pXmlDoc, "//p:cMediaNode/p:cTn", "repeatCount", "indefinite");
+}
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/uitest/data/LibreOffice.jpg b/sd/qa/uitest/data/LibreOffice.jpg
new file mode 100644
index 000000000..23812dcfd
--- /dev/null
+++ b/sd/qa/uitest/data/LibreOffice.jpg
Binary files differ
diff --git a/sd/qa/uitest/data/embedded.pptx b/sd/qa/uitest/data/embedded.pptx
new file mode 100644
index 000000000..956fda7e9
--- /dev/null
+++ b/sd/qa/uitest/data/embedded.pptx
Binary files differ
diff --git a/sd/qa/uitest/data/findReplace.odp b/sd/qa/uitest/data/findReplace.odp
new file mode 100644
index 000000000..6ccbfcfed
--- /dev/null
+++ b/sd/qa/uitest/data/findReplace.odp
Binary files differ
diff --git a/sd/qa/uitest/data/tdf127900.fodp b/sd/qa/uitest/data/tdf127900.fodp
new file mode 100644
index 000000000..adedafc27
--- /dev/null
+++ b/sd/qa/uitest/data/tdf127900.fodp
@@ -0,0 +1,778 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d: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:rpt="http://openoffice.org/2005/report" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:drawooo="http://openoffice.org/2010/draw" 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: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: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:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xmlns:officeooo="http://openoffice.org/2009/office" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.presentation">
+ <office:meta><meta:creation-date>2021-08-30T08:55:10.394000000</meta:creation-date><meta:generator>LibreOffice/7.1.1.2$Windows_X86_64 LibreOffice_project/fe0b08f4af1bacafe4c7ecc87ce55bb426164676</meta:generator><dc:date>2021-08-30T08:56:29.116000000</dc:date><meta:editing-duration>PT7S</meta:editing-duration><meta:editing-cycles>1</meta:editing-cycles><meta:document-statistic meta:object-count="29"/></office:meta>
+ <office:settings>
+ <config:config-item-set config:name="ooo:view-settings">
+ <config:config-item config:name="VisibleAreaTop" config:type="int">0</config:config-item>
+ <config:config-item config:name="VisibleAreaLeft" config:type="int">0</config:config-item>
+ <config:config-item config:name="VisibleAreaWidth" config:type="int">14099</config:config-item>
+ <config:config-item config:name="VisibleAreaHeight" config:type="int">9999</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">view1</config:config-item>
+ <config:config-item config:name="GridIsVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="GridIsFront" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsSnapToGrid" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToPageMargins" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToSnapLines" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToObjectFrame" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToObjectPoints" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPlusHandlesAlwaysVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsFrameDragSingles" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EliminatePolyPointLimitAngle" config:type="int">1500</config:config-item>
+ <config:config-item config:name="IsEliminatePolyPoints" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="VisibleLayers" config:type="base64Binary">Hw==</config:config-item>
+ <config:config-item config:name="PrintableLayers" config:type="base64Binary">Hw==</config:config-item>
+ <config:config-item config:name="LockedLayers" config:type="base64Binary"/>
+ <config:config-item config:name="NoAttribs" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="NoColors" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="RulerIsVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PageKind" config:type="short">0</config:config-item>
+ <config:config-item config:name="SelectedPage" config:type="short">1</config:config-item>
+ <config:config-item config:name="IsLayerMode" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsDoubleClickTextEdit" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsClickChangeRotation" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="SlidesPerRow" config:type="short">4</config:config-item>
+ <config:config-item config:name="EditMode" config:type="int">0</config:config-item>
+ <config:config-item config:name="VisibleAreaTop" config:type="int">-974</config:config-item>
+ <config:config-item config:name="VisibleAreaLeft" config:type="int">-423</config:config-item>
+ <config:config-item config:name="VisibleAreaWidth" config:type="int">28894</config:config-item>
+ <config:config-item config:name="VisibleAreaHeight" config:type="int">17739</config:config-item>
+ <config:config-item config:name="GridCoarseWidth" config:type="int">2000</config:config-item>
+ <config:config-item config:name="GridCoarseHeight" config:type="int">2000</config:config-item>
+ <config:config-item config:name="GridFineWidth" config:type="int">500</config:config-item>
+ <config:config-item config:name="GridFineHeight" config:type="int">500</config:config-item>
+ <config:config-item config:name="GridSnapWidthXNumerator" config:type="int">2000</config:config-item>
+ <config:config-item config:name="GridSnapWidthXDenominator" config:type="int">4</config:config-item>
+ <config:config-item config:name="GridSnapWidthYNumerator" config:type="int">2000</config:config-item>
+ <config:config-item config:name="GridSnapWidthYDenominator" config:type="int">4</config:config-item>
+ <config:config-item config:name="IsAngleSnapEnabled" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SnapAngle" config:type="int">1500</config:config-item>
+ <config:config-item config:name="ZoomOnPage" config:type="boolean">true</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="ApplyUserData" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="BitmapTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.sob</config:config-item>
+ <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item>
+ <config:config-item config:name="ColorTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.soc</config:config-item>
+ <config:config-item config:name="DashTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.sod</config:config-item>
+ <config:config-item config:name="DefaultTabStop" config:type="int">1250</config:config-item>
+ <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="GradientTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.sog</config:config-item>
+ <config:config-item config:name="HandoutsHorizontal" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="HatchTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.soh</config:config-item>
+ <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintBooklet" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintBookletBack" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintBookletFront" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintDate" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintDrawing" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintFitPage" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintHandout" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintHiddenPages" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintNotes" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintOutline" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintPageName" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintTilePage" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintTime" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="LineEndTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.soe</config:config-item>
+ <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PageNumberFormat" config:type="int">4</config:config-item>
+ <config:config-item config:name="ParagraphSummation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrintQuality" config:type="int">0</config:config-item>
+ <config:config-item config:name="PrinterIndependentLayout" config:type="string">low-resolution</config:config-item>
+ <config:config-item config:name="PrinterName" config:type="string">Microsoft Print to PDF</config:config-item>
+ <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrinterSetup" config:type="base64Binary">GRb+/01pY3Jvc29mdCBQcmludCB0byBQREYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATWljcm9zb2Z0IFByaW50IFRvIFBERgAAAAAAAAAAAAAWAAEANhUAAAAAAAAEAAhSAAAEdAAAM1ROVwAAAAAKAE0AaQBjAHIAbwBzAG8AZgB0ACAAUAByAGkAbgB0ACAAdABvACAAUABEAEYAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAMG3ABQFAMvAQABAAkAmgs0CGQAAQAPAFgCAgABAFgCAwABAEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAIAAAABAAAA/////0dJUzQAAAAAAAAAAAAAAABESU5VIgDIACQDLBE/XXt+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAUAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAAFNNVEoAAAAAEAC4AHsAMAA4ADQARgAwADEARgBBAC0ARQA2ADMANAAtADQARAA3ADcALQA4ADMARQBFAC0AMAA3ADQAOAAxADcAQwAwADMANQA4ADEAfQAAAFJFU0RMTABVbmlyZXNETEwAUGFwZXJTaXplAEE0AE9yaWVudGF0aW9uAFBPUlRSQUlUAFJlc29sdXRpb24AUmVzT3B0aW9uMQBDb2xvck1vZGUAQ29sb3IAAAAAAAAAAAAAAAAAAAAAAAAsEQAAVjRETQEAAAAAAAAAnApwIhwAAADsAAAAAwAAAPoBTwg05ndNg+4HSBfANYHQAAAATAAAAAMAAAAACAAAAAAAAAAAAAADAAAAAAgAACoAAAAACAAAAwAAAEAAAABWAAAAABAAAEQAbwBjAHUAbQBlAG4AdABVAHMAZQByAFAAYQBzAHMAdwBvAHIAZAAAAEQAbwBjAHUAbQBlAG4AdABPAHcAbgBlAHIAUABhAHMAcwB3AG8AcgBkAAAARABvAGMAdQBtAGUAbgB0AEMAcgB5AHAAdABTAGUAYwB1AHIAaQB0AHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgBDT01QQVRfRFVQTEVYX01PREUTAER1cGxleE1vZGU6OlVua25vd24=</config:config-item>
+ <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SlidesPerHandout" config:type="short">6</config:config-item>
+ <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</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="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <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="Noto Sans" svg:font-family="&apos;Noto Sans&apos;" style:font-family-generic="roman" 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"/>
+ <style:font-face style:name="Microsoft YaHei" svg:font-family="&apos;Microsoft YaHei&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Segoe UI" svg:font-family="&apos;Segoe UI&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Tahoma" svg:font-family="Tahoma" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+ <draw:gradient draw:name="Filled" draw:style="linear" draw:start-color="#ffffff" draw:end-color="#cccccc" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="30deg" draw:border="0%"/>
+ <draw:gradient draw:name="Filled_20_Blue" draw:display-name="Filled Blue" draw:style="linear" draw:start-color="#729fcf" draw:end-color="#355269" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="30deg" draw:border="0%"/>
+ <draw:gradient draw:name="Filled_20_Green" draw:display-name="Filled Green" draw:style="linear" draw:start-color="#77bc65" draw:end-color="#127622" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="30deg" draw:border="0%"/>
+ <draw:gradient draw:name="Filled_20_Red" draw:display-name="Filled Red" draw:style="linear" draw:start-color="#ff6d6d" draw:end-color="#c9211e" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="30deg" draw:border="0%"/>
+ <draw:gradient draw:name="Filled_20_Yellow" draw:display-name="Filled Yellow" draw:style="linear" draw:start-color="#ffde59" draw:end-color="#b47804" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="30deg" draw:border="0%"/>
+ <draw:gradient draw:name="Shapes" draw:style="rectangular" draw:cx="50%" draw:cy="50%" draw:start-color="#cccccc" draw:end-color="#ffffff" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="0deg" draw:border="0%"/>
+ <draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="M10 0l-10 30h20z"/>
+ <style:default-style style:family="graphic">
+ <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap"/>
+ <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" 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" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="24pt" fo:language="hu" fo:country="HU" style:font-name-asian="Segoe UI" style:font-size-asian="24pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Tahoma" style:font-size-complex="24pt" style:language-complex="hi" style:country-complex="IN"/>
+ </style:default-style>
+ <style:style style:name="standard" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0cm" svg:stroke-color="#3465a4" draw:marker-start-width="0.2cm" draw:marker-start-center="false" draw:marker-end-width="0.2cm" draw:marker-end-center="false" draw:fill="solid" draw:fill-color="#729fcf" draw:textarea-horizontal-align="justify" fo:padding-top="0.125cm" fo:padding-bottom="0.125cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" fo:wrap-option="wrap" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080">
+ <text:list-style style:name="standard">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" loext:opacity="0%" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="Microsoft YaHei" style:font-family-asian="&apos;Microsoft YaHei&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="18pt" style:font-style-asian="normal" style:font-weight-asian="normal" 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="18pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="objectwithoutfill" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Object_20_with_20_no_20_fill_20_and_20_no_20_line" style:display-name="Object with no fill and no line" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Text" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#cccccc" draw:fill="solid" draw:fill-color="#eeeeee"/>
+ <style:text-properties style:font-name="Noto Sans" fo:font-family="&apos;Noto Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ </style:style>
+ <style:style style:name="A4" style:family="graphic" style:parent-style-name="Text">
+ <style:graphic-properties draw:fill="none"/>
+ <style:text-properties fo:font-size="18pt"/>
+ </style:style>
+ <style:style style:name="Title_20_A4" style:display-name="Title A4" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ <style:text-properties fo:font-size="44pt"/>
+ </style:style>
+ <style:style style:name="Heading_20_A4" style:display-name="Heading A4" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="Text_20_A4" style:display-name="Text A4" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ </style:style>
+ <style:style style:name="A4" style:family="graphic" style:parent-style-name="Text">
+ <style:graphic-properties draw:fill="none"/>
+ <style:text-properties fo:font-size="18pt"/>
+ </style:style>
+ <style:style style:name="Title_20_A0" style:display-name="Title A0" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ <style:text-properties fo:font-size="96pt"/>
+ </style:style>
+ <style:style style:name="Heading_20_A0" style:display-name="Heading A0" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ <style:text-properties fo:font-size="71.9000015258789pt"/>
+ </style:style>
+ <style:style style:name="Text_20_A0" style:display-name="Text A0" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ </style:style>
+ <style:style style:name="Graphic" style:family="graphic">
+ <style:graphic-properties draw:fill="solid" draw:fill-color="#ffffff"/>
+ <style:text-properties style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt"/>
+ </style:style>
+ <style:style style:name="Shapes" style:family="graphic" style:parent-style-name="Graphic">
+ <style:graphic-properties draw:stroke="none" draw:fill="gradient" draw:fill-gradient-name="Shapes"/>
+ <style:text-properties fo:font-size="14pt" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="Filled" style:family="graphic" style:parent-style-name="Shapes">
+ <style:graphic-properties draw:fill="gradient" draw:fill-gradient-name="Filled"/>
+ </style:style>
+ <style:style style:name="Filled_20_Blue" style:display-name="Filled Blue" style:family="graphic" style:parent-style-name="Filled">
+ <style:graphic-properties draw:fill-gradient-name="Filled_20_Blue"/>
+ <style:text-properties fo:color="#ffffff" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Filled_20_Green" style:display-name="Filled Green" style:family="graphic" style:parent-style-name="Filled">
+ <style:graphic-properties draw:fill-gradient-name="Filled_20_Green"/>
+ <style:text-properties fo:color="#ffffff" loext:opacity="100%" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ </style:style>
+ <style:style style:name="Filled_20_Red" style:display-name="Filled Red" style:family="graphic" style:parent-style-name="Filled">
+ <style:graphic-properties draw:fill-gradient-name="Filled_20_Red"/>
+ <style:text-properties fo:color="#ffffff" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Filled_20_Yellow" style:display-name="Filled Yellow" style:family="graphic" style:parent-style-name="Filled">
+ <style:graphic-properties draw:fill-gradient-name="Filled_20_Yellow"/>
+ <style:text-properties fo:color="#ffffff" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Outlined" style:family="graphic" style:parent-style-name="Shapes">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0.081cm" svg:stroke-color="#000000" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Outlined_20_Blue" style:display-name="Outlined Blue" style:family="graphic" style:parent-style-name="Outlined">
+ <style:graphic-properties svg:stroke-color="#355269"/>
+ <style:text-properties fo:color="#355269" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Outlined_20_Green" style:display-name="Outlined Green" style:family="graphic" style:parent-style-name="Outlined">
+ <style:graphic-properties svg:stroke-color="#127622"/>
+ <style:text-properties fo:color="#127622" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Outlined_20_Red" style:display-name="Outlined Red" style:family="graphic" style:parent-style-name="Outlined">
+ <style:graphic-properties svg:stroke-color="#c9211e"/>
+ <style:text-properties fo:color="#c9211e" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Outlined_20_Yellow" style:display-name="Outlined Yellow" style:family="graphic" style:parent-style-name="Outlined">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#b47804"/>
+ <style:text-properties fo:color="#b47804" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Lines" style:family="graphic" style:parent-style-name="Graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#000000" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Arrow_20_Line" style:display-name="Arrow Line" style:family="graphic" style:parent-style-name="Lines">
+ <style:graphic-properties draw:marker-start="Arrow" draw:marker-start-width="0.2cm" draw:marker-end="Arrow" draw:marker-end-width="0.2cm" draw:show-unit="true"/>
+ </style:style>
+ <style:style style:name="Arrow_20_Dashed" style:display-name="Arrow Dashed" style:family="graphic" style:parent-style-name="Lines">
+ <style:graphic-properties draw:stroke="dash"/>
+ </style:style>
+ <style:style style:name="Default-background" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties style:letter-kerning="true"/>
+ </style:style>
+ <style:style style:name="Default-backgroundobjects" style:family="presentation">
+ <style:graphic-properties draw:textarea-horizontal-align="justify" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:text-properties style:letter-kerning="true"/>
+ </style:style>
+ <style:style style:name="Default-notes" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-left="0.6cm" fo:margin-right="0cm" fo:text-indent="-0.6cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" loext:opacity="0%" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="20pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Microsoft YaHei" style:font-family-asian="&apos;Microsoft YaHei&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="20pt" style:font-style-asian="normal" style:font-weight-asian="normal" 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="20pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="Default-outline1" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:auto-grow-height="false" draw:fit-to-size="false" style:shrink-to-fit="true">
+ <text:list-style style:name="Default-outline1">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.3cm" text:min-label-width="0.9cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="–">
+ <style:list-level-properties text:space-before="1.5cm" text:min-label-width="0.9cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="75%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.8cm" text:min-label-width="0.8cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="–">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="75%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="6.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="7.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="9cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="10.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="11.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-top="0.5cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" loext:opacity="0%" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="32pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Microsoft YaHei" style:font-family-asian="&apos;Microsoft YaHei&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="32pt" style:font-style-asian="normal" style:font-weight-asian="normal" 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="32pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="Default-outline2" style:family="presentation" style:parent-style-name="Default-outline1">
+ <style:paragraph-properties fo:margin-top="0.4cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="28pt" style:font-size-asian="28pt" style:font-size-complex="28pt"/>
+ </style:style>
+ <style:style style:name="Default-outline3" style:family="presentation" style:parent-style-name="Default-outline2">
+ <style:paragraph-properties fo:margin-top="0.3cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="24pt" style:font-size-asian="24pt" style:font-size-complex="24pt"/>
+ </style:style>
+ <style:style style:name="Default-outline4" style:family="presentation" style:parent-style-name="Default-outline3">
+ <style:paragraph-properties fo:margin-top="0.2cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline5" style:family="presentation" style:parent-style-name="Default-outline4">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline6" style:family="presentation" style:parent-style-name="Default-outline5">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline7" style:family="presentation" style:parent-style-name="Default-outline6">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline8" style:family="presentation" style:parent-style-name="Default-outline7">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline9" style:family="presentation" style:parent-style-name="Default-outline8">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-subtitle" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-vertical-align="middle">
+ <text:list-style style:name="Default-subtitle">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-align="center" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" loext:opacity="0%" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="32pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Microsoft YaHei" style:font-family-asian="&apos;Microsoft YaHei&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="32pt" style:font-style-asian="normal" style:font-weight-asian="normal" 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="32pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="Default-title" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-vertical-align="middle">
+ <text:list-style style:name="Default-title">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" loext:opacity="0%" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="44pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Microsoft YaHei" style:font-family-asian="&apos;Microsoft YaHei&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="44pt" style:font-style-asian="normal" style:font-weight-asian="normal" 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="44pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:presentation-page-layout style:name="AL0T26">
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="1.743cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="1.743cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="3.612cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="3.612cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="5.481cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="5.481cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ </style:presentation-page-layout>
+ <style:presentation-page-layout style:name="AL1T0">
+ <presentation:placeholder presentation:object="title" svg:x="2.058cm" svg:y="1.743cm" svg:width="23.912cm" svg:height="3.507cm"/>
+ <presentation:placeholder presentation:object="subtitle" svg:x="2.058cm" svg:y="5.838cm" svg:width="23.912cm" svg:height="13.23cm"/>
+ </style:presentation-page-layout>
+ <style:presentation-page-layout style:name="AL2T1">
+ <presentation:placeholder presentation:object="title" svg:x="2.058cm" svg:y="1.743cm" svg:width="23.912cm" svg:height="3.507cm"/>
+ <presentation:placeholder presentation:object="outline" svg:x="2.058cm" svg:y="5.838cm" svg:width="23.912cm" svg:height="13.23cm"/>
+ </style:presentation-page-layout>
+ </office:styles>
+ <office:automatic-styles>
+ <style:page-layout style:name="PM0">
+ <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="21cm" fo:page-height="29.7cm" style:print-orientation="portrait"/>
+ </style:page-layout>
+ <style:page-layout style:name="PM1">
+ <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="28cm" fo:page-height="15.75cm" style:print-orientation="landscape"/>
+ </style:page-layout>
+ <style:style style:name="dp1" style:family="drawing-page">
+ <style:drawing-page-properties draw:background-size="border" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="dp2" style:family="drawing-page">
+ <style:drawing-page-properties presentation:display-header="true" presentation:display-footer="true" presentation:display-page-number="false" presentation:display-date-time="true"/>
+ </style:style>
+ <style:style style:name="dp3" style:family="drawing-page">
+ <style:drawing-page-properties presentation:background-visible="true" presentation:background-objects-visible="true" presentation:display-footer="true" presentation:display-page-number="false" presentation:display-date-time="true"/>
+ </style:style>
+ <style:style style:name="gr1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="gr2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="gr3" style:family="graphic">
+ <style:graphic-properties style:protect="size"/>
+ </style:style>
+ <style:style style:name="pr1" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.086cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="pr2" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="pr3" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="pr4" style:family="presentation" style:parent-style-name="Default-title">
+ <style:graphic-properties fo:min-height="2.629cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="pr5" style:family="presentation" style:parent-style-name="Default-subtitle">
+ <style:graphic-properties draw:fill-color="#ffffff" fo:min-height="9.134cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="pr6" style:family="presentation" style:parent-style-name="Default-notes">
+ <style:graphic-properties draw:fill-color="#ffffff" fo:min-height="13.364cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="pr7" style:family="presentation" style:parent-style-name="Default-outline1">
+ <style:graphic-properties fo:min-height="8.884cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="P1" style:family="paragraph">
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P2" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P3" style:family="paragraph">
+ <style:paragraph-properties fo:text-align="end" style:writing-mode="lr-tb"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P4" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:paragraph-properties fo:text-align="end" style:writing-mode="lr-tb"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P5" style:family="paragraph">
+ <style:paragraph-properties fo:text-align="center" style:writing-mode="lr-tb"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P6" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:paragraph-properties fo:text-align="center" style:writing-mode="lr-tb"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P7" style:family="paragraph">
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="P8" style:family="paragraph">
+ <loext:graphic-properties draw:fill-color="#ffffff"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="P9" style:family="paragraph">
+ <loext:graphic-properties draw:fill-color="#ffffff"/>
+ </style:style>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <text:list-style style:name="L1">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ <text:list-style style:name="L2">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </office:automatic-styles>
+ <office:master-styles>
+ <draw:layer-set>
+ <draw:layer draw:name="layout"/>
+ <draw:layer draw:name="background"/>
+ <draw:layer draw:name="backgroundobjects"/>
+ <draw:layer draw:name="controls"/>
+ <draw:layer draw:name="measurelines"/>
+ </draw:layer-set>
+ <style:handout-master presentation:presentation-page-layout-name="AL0T26" style:page-layout-name="PM0" draw:style-name="dp2">
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="5.061cm" svg:x="1cm" svg:y="3.742cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="5.061cm" svg:x="1cm" svg:y="12.318cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="5.061cm" svg:x="1cm" svg:y="20.894cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="5.061cm" svg:x="11cm" svg:y="3.742cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="5.061cm" svg:x="11cm" svg:y="12.318cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="5.061cm" svg:x="11cm" svg:y="20.894cm"/>
+ <draw:frame draw:style-name="gr1" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="0cm" presentation:class="header">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:header/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr1" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="0cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><presentation:date-time/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr2" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="28.215cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:footer/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr2" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="28.215cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ </style:handout-master>
+ <style:master-page style:name="Default" style:page-layout-name="PM1" draw:style-name="dp1">
+ <draw:frame presentation:style-name="Default-title" draw:layer="backgroundobjects" svg:width="25.199cm" svg:height="2.629cm" svg:x="1.4cm" svg:y="0.628cm" presentation:class="title" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="Default-outline1" draw:layer="backgroundobjects" svg:width="25.199cm" svg:height="9.134cm" svg:x="1.4cm" svg:y="3.685cm" presentation:class="outline" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="6.523cm" svg:height="1.085cm" svg:x="1.4cm" svg:y="14.348cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:date-time/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P6" draw:layer="backgroundobjects" svg:width="8.875cm" svg:height="1.085cm" svg:x="9.576cm" svg:y="14.348cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P5"><text:span text:style-name="T1"><presentation:footer/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="6.523cm" svg:height="1.085cm" svg:x="20.076cm" svg:y="14.348cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <presentation:notes style:page-layout-name="PM0">
+ <draw:page-thumbnail presentation:style-name="Default-title" draw:layer="backgroundobjects" svg:width="19.798cm" svg:height="11.136cm" svg:x="0.6cm" svg:y="2.257cm" presentation:class="page"/>
+ <draw:frame presentation:style-name="Default-notes" draw:layer="backgroundobjects" svg:width="16.799cm" svg:height="13.364cm" svg:x="2.1cm" svg:y="14.107cm" presentation:class="notes" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr2" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="0cm" presentation:class="header">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:header/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr2" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="0cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><presentation:date-time/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr3" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="28.215cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:footer/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr3" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="28.215cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ </presentation:notes>
+ </style:master-page>
+ </office:master-styles>
+ <office:body>
+ <office:presentation>
+ <draw:page draw:name="page1" draw:style-name="dp3" draw:master-page-name="Default" presentation:presentation-page-layout-name="AL1T0">
+ <draw:frame presentation:style-name="pr4" draw:text-style-name="P7" draw:layer="layout" svg:width="25.199cm" svg:height="2.629cm" svg:x="1.4cm" svg:y="0.628cm" presentation:class="title" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr5" draw:text-style-name="P8" draw:layer="layout" svg:width="25.199cm" svg:height="9.134cm" svg:x="1.4cm" svg:y="3.685cm" presentation:class="subtitle" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <presentation:notes draw:style-name="dp2">
+ <draw:page-thumbnail draw:style-name="gr3" draw:layer="layout" svg:width="19.798cm" svg:height="11.136cm" svg:x="0.6cm" svg:y="2.257cm" draw:page-number="1" presentation:class="page"/>
+ <draw:frame presentation:style-name="pr6" draw:text-style-name="P8" draw:layer="layout" svg:width="16.799cm" svg:height="13.364cm" svg:x="2.1cm" svg:y="14.107cm" presentation:class="notes" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ </presentation:notes>
+ </draw:page>
+ <draw:page draw:name="page2" draw:style-name="dp3" draw:master-page-name="Default" presentation:presentation-page-layout-name="AL2T1">
+ <draw:frame presentation:style-name="pr4" draw:layer="layout" svg:width="25.199cm" svg:height="2.629cm" svg:x="1.4cm" svg:y="0.628cm" presentation:class="title" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr7" draw:layer="layout" svg:width="25.199cm" svg:height="9.134cm" svg:x="1.4cm" svg:y="3.685cm" presentation:class="outline" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <presentation:notes draw:style-name="dp2">
+ <draw:page-thumbnail draw:style-name="gr3" draw:layer="layout" svg:width="19.798cm" svg:height="11.136cm" svg:x="0.6cm" svg:y="2.257cm" draw:page-number="2" presentation:class="page"/>
+ <draw:frame presentation:style-name="pr6" draw:text-style-name="P9" draw:layer="layout" svg:width="16.799cm" svg:height="13.364cm" svg:x="2.1cm" svg:y="14.107cm" presentation:class="notes" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ </presentation:notes>
+ </draw:page>
+ <presentation:settings presentation:mouse-visible="false"/>
+ </office:presentation>
+ </office:body>
+</office:document> \ No newline at end of file
diff --git a/sd/qa/uitest/data/tdf144943.pptx b/sd/qa/uitest/data/tdf144943.pptx
new file mode 100644
index 000000000..e03788fba
--- /dev/null
+++ b/sd/qa/uitest/data/tdf144943.pptx
Binary files differ
diff --git a/sd/qa/uitest/data/tdf146019.jpg b/sd/qa/uitest/data/tdf146019.jpg
new file mode 100644
index 000000000..eba4055a1
--- /dev/null
+++ b/sd/qa/uitest/data/tdf146019.jpg
Binary files differ
diff --git a/sd/qa/uitest/data/tdf153161_FlushToSave.odp b/sd/qa/uitest/data/tdf153161_FlushToSave.odp
new file mode 100644
index 000000000..1fd5c20c2
--- /dev/null
+++ b/sd/qa/uitest/data/tdf153161_FlushToSave.odp
Binary files differ
diff --git a/sd/qa/uitest/findReplace/findReplace.py b/sd/qa/uitest/findReplace/findReplace.py
new file mode 100644
index 000000000..0e4bd4c12
--- /dev/null
+++ b/sd/qa/uitest/findReplace/findReplace.py
@@ -0,0 +1,108 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+from uitest.framework import UITestCase
+from uitest.uihelper.common import select_pos
+from uitest.uihelper.calc import enter_text_to_cell
+from libreoffice.calc.document import get_cell_by_position
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_state_as_dict, get_url_for_data_file, type_text
+
+class findReplace(UITestCase):
+ def test_find_impress(self):
+ with self.ui_test.load_file(get_url_for_data_file("findReplace.odp")) as impress_doc:
+
+ # check current slide is 1
+ self.assertEqual(impress_doc.CurrentController.getCurrentPage().Number, 1)
+
+ self.assertEqual("First first first", impress_doc.DrawPages[0].getByIndex(1).String)
+ self.assertEqual("second", impress_doc.DrawPages[1].getByIndex(1).String)
+ self.assertEqual("Third", impress_doc.DrawPages[2].getByIndex(1).String)
+ self.assertEqual("Text size 16", impress_doc.DrawPages[3].getByIndex(1).String)
+
+ # search for string "second"
+ with self.ui_test.execute_modeless_dialog_through_command(".uno:SearchDialog", close_button="close") as xDialog:
+ searchterm = xDialog.getChild("searchterm")
+ searchterm.executeAction("TYPE", mkPropertyValues({"TEXT":"second"})) #2nd slide
+ xsearch = xDialog.getChild("search")
+ xsearch.executeAction("CLICK", tuple())
+
+ # verify we moved to slide 2
+ self.assertEqual(impress_doc.CurrentController.getCurrentPage().Number, 2)
+
+ # search for string "third"
+ searchterm.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
+ searchterm.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
+ searchterm.executeAction("TYPE", mkPropertyValues({"TEXT":"third"}))
+ xsearch.executeAction("CLICK", tuple())
+
+ #verify we moved to slide 3
+ self.assertEqual(impress_doc.CurrentController.getCurrentPage().Number, 3) #3rd slide
+
+ self.assertEqual("First first first", impress_doc.DrawPages[0].getByIndex(1).String)
+ self.assertEqual("second", impress_doc.DrawPages[1].getByIndex(1).String)
+ self.assertEqual("Third", impress_doc.DrawPages[2].getByIndex(1).String)
+ self.assertEqual("Text size 16", impress_doc.DrawPages[3].getByIndex(1).String)
+
+ # now open dialog and verify find="third" (remember last value);
+ # replace value with "First" (click match case) with word "Replace"
+ # click twice the Replace button, check "Replace first first"
+
+ # open the dialog again
+ with self.ui_test.execute_modeless_dialog_through_command(".uno:SearchDialog", close_button="close") as xDialog:
+
+ # verify search string is still "third" from previous search
+ searchterm = xDialog.getChild("searchterm")
+ self.assertEqual(get_state_as_dict(searchterm)["Text"], "third")
+
+ # replace it with "First"
+ searchterm.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
+ searchterm.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
+ searchterm.executeAction("TYPE", mkPropertyValues({"TEXT":"First"}))
+
+ # click "match case"
+ matchcase = xDialog.getChild("matchcase")
+ matchcase.executeAction("CLICK", tuple()) #click match case
+
+ # set the replace string to "Replace"
+ replaceterm = xDialog.getChild("replaceterm")
+ replaceterm.executeAction("TYPE", mkPropertyValues({"TEXT":"Replace"})) #replace textbox
+
+ # hit replace button 2 times
+ replace = xDialog.getChild("replace")
+
+ replace.executeAction("CLICK", tuple())
+ replace.executeAction("CLICK", tuple()) #click twice Replace button (one selects, second replaces)
+
+ # now replace first (uncheck match case) with word "aaa" - click once Replace All button, check "Replace aaa aaa"
+ matchcase = xDialog.getChild("matchcase")
+ matchcase.executeAction("CLICK", tuple()) # uncheck match case
+
+ self.assertEqual("Replace first first", impress_doc.DrawPages[0].getByIndex(1).String)
+ self.assertEqual("second", impress_doc.DrawPages[1].getByIndex(1).String)
+ # tdf#145868 - Third was search for earlier, but never should have been replaced
+ self.assertEqual("Third", impress_doc.DrawPages[2].getByIndex(1).String)
+ self.assertEqual("Text size 16", impress_doc.DrawPages[3].getByIndex(1).String)
+
+ replaceterm = xDialog.getChild("replaceterm")
+ replaceterm.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
+ replaceterm.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
+ replaceterm.executeAction("TYPE", mkPropertyValues({"TEXT":"aaa"}))
+ replaceall = xDialog.getChild("replaceall")
+ replaceall.executeAction("CLICK", tuple()) # click on replace all button
+
+ self.assertEqual(impress_doc.CurrentController.getCurrentPage().Number, 1)
+
+ # tdf#122788: Without the fix in place, this test would have failed with
+ # AssertionError: 'Replace aaa aaa' != 'Replace first first'
+ self.assertEqual("Replace aaa aaa", impress_doc.DrawPages[0].getByIndex(1).String)
+ self.assertEqual("second", impress_doc.DrawPages[1].getByIndex(1).String)
+ self.assertEqual("Third", impress_doc.DrawPages[2].getByIndex(1).String)
+ self.assertEqual("Text size 16", impress_doc.DrawPages[3].getByIndex(1).String)
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/autocorrectOptions.py b/sd/qa/uitest/impress_tests/autocorrectOptions.py
new file mode 100644
index 000000000..a79facecc
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/autocorrectOptions.py
@@ -0,0 +1,101 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_state_as_dict
+import time
+from uitest.uihelper.common import select_pos
+
+class autocorrectOptions(UITestCase):
+
+ def test_autocorrect_options_impress(self):
+ with self.ui_test.create_doc_in_start_center("impress"):
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ with self.ui_test.execute_dialog_through_command(".uno:AutoCorrectDlg", close_button="cancel") as xDialog:
+ xTabs = xDialog.getChild("tabcontrol")
+ select_pos(xTabs, "0") #tab replace
+ origtext = xDialog.getChild("origtext")
+ newtext = xDialog.getChild("newtext")
+ xnew = xDialog.getChild("new")
+ xdelete = xDialog.getChild("delete")
+ xtabview = xDialog.getChild("tabview")
+ xreset = xDialog.getChild("reset")
+ nrRows = get_state_as_dict(xtabview)["VisibleCount"]
+
+ self.assertTrue(int(nrRows) > 0)
+
+ #add new rule
+ origtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
+ origtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
+ origtext.executeAction("TYPE", mkPropertyValues({"TEXT":"::::"}))
+ newtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
+ newtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
+ newtext.executeAction("TYPE", mkPropertyValues({"TEXT":"dvojtecky"}))
+ xnew.executeAction("CLICK", tuple())
+ nrRowsNew = get_state_as_dict(xtabview)["VisibleCount"]
+ nrRowsDiff = int(nrRowsNew) - int(nrRows)
+ self.assertEqual(nrRowsDiff, 1) #we have +1 rule
+ #delete rule
+ origtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
+ origtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
+ origtext.executeAction("TYPE", mkPropertyValues({"TEXT":"::::"}))
+ newtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
+ newtext.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
+ newtext.executeAction("TYPE", mkPropertyValues({"TEXT":"dvojtecky"}))
+ xdelete.executeAction("CLICK", tuple())
+ self.assertEqual(get_state_as_dict(xtabview)["VisibleCount"], nrRows) #we have default nr of rules
+
+ select_pos(xTabs, "1") #tab Exceptions
+ #abbreviations
+ abbrev = xDialog.getChild("abbrev")
+ newabbrev = xDialog.getChild("newabbrev")
+ delabbrev = xDialog.getChild("delabbrev")
+ abbrevlist = xDialog.getChild("abbrevlist")
+
+ nrRowsAbb = get_state_as_dict(abbrevlist)["VisibleCount"]
+
+ self.assertTrue(int(nrRowsAbb) > 0)
+
+ abbrev.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
+ abbrev.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
+ abbrev.executeAction("TYPE", mkPropertyValues({"TEXT":"qqqqq"}))
+ newabbrev.executeAction("CLICK", tuple())
+ nrRowsAbbNew = get_state_as_dict(abbrevlist)["VisibleCount"]
+ nrRowsAbbDiff = int(nrRowsAbbNew) - int(nrRowsAbb)
+ self.assertEqual(nrRowsAbbDiff, 1) #we have +1 rule
+ delabbrev.executeAction("CLICK", tuple())
+ self.assertEqual(get_state_as_dict(abbrevlist)["VisibleCount"], nrRowsAbb) #we have default nr of rules
+
+ #words with two initial capitals
+ double = xDialog.getChild("double")
+ newdouble = xDialog.getChild("newdouble")
+ deldouble = xDialog.getChild("deldouble")
+ doublelist = xDialog.getChild("doublelist")
+
+ nrRowsDouble = get_state_as_dict(doublelist)["VisibleCount"]
+
+ self.assertTrue(int(nrRowsDouble) > 0)
+
+ double.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
+ double.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
+ double.executeAction("TYPE", mkPropertyValues({"TEXT":"QQqqq"}))
+ newdouble.executeAction("CLICK", tuple())
+ nrRowsDoubleNew = get_state_as_dict(doublelist)["VisibleCount"]
+ nrRowsDoubleDiff = int(nrRowsDoubleNew) - int(nrRowsDouble) #convert string and
+ self.assertEqual(nrRowsDoubleDiff, 1) #we have +1 rule
+ deldouble.executeAction("CLICK", tuple())
+ self.assertEqual(get_state_as_dict(doublelist)["VisibleCount"], nrRowsDouble) #we have default nr of rules
+
+
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/customSlideShow.py b/sd/qa/uitest/impress_tests/customSlideShow.py
new file mode 100644
index 000000000..f070a1ca1
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/customSlideShow.py
@@ -0,0 +1,74 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+import importlib
+from uitest.uihelper.common import select_pos
+from uitest.uihelper.common import get_state_as_dict, type_text
+
+class customSlideShow(UITestCase):
+ def test_customSlideShow(self):
+ with self.ui_test.create_doc_in_start_center("impress"):
+ MainWindow = self.xUITest.getTopFocusWindow()
+ TemplateDialog = self.xUITest.getTopFocusWindow()
+ cancel = TemplateDialog.getChild("close")
+ self.ui_test.close_dialog_through_button(cancel)
+ with self.ui_test.execute_dialog_through_command(".uno:CustomShowDialog") as CustomSlideShows:
+ new = CustomSlideShows.getChild("new")
+
+ with self.ui_test.execute_blocking_action(new.executeAction, args=('CLICK', ())) as DefineCustomSlideShow:
+ customname = DefineCustomSlideShow.getChild("customname")
+ customname.executeAction("TYPE", mkPropertyValues({"KEYCODE": "BACKSPACE"}))
+ customname.executeAction("TYPE", mkPropertyValues({"TEXT": "a"}))
+ customname.executeAction("TYPE", mkPropertyValues({"TEXT": "a"}))
+ pages = DefineCustomSlideShow.getChild("pages")
+ xEntry = pages.getChild("0")
+ xEntry.executeAction("SELECT", tuple())
+ add = DefineCustomSlideShow.getChild("add")
+ add.executeAction("CLICK",tuple())
+
+ #verify
+ with self.ui_test.execute_dialog_through_command(".uno:CustomShowDialog") as CustomSlideShows:
+ edit = CustomSlideShows.getChild("edit")
+ customshowlist = CustomSlideShows.getChild("customshowlist")
+ self.assertEqual(get_state_as_dict(customshowlist)["SelectionCount"], "1")
+
+ with self.ui_test.execute_blocking_action(edit.executeAction, args=('CLICK', ()), close_button="cancel") as DefineCustomSlideShow:
+ customname = DefineCustomSlideShow.getChild("customname")
+ self.assertEqual(get_state_as_dict(customname)["Text"], "aa")
+ custompages = DefineCustomSlideShow.getChild("custompages")
+ pages = DefineCustomSlideShow.getChild("pages")
+ remove = DefineCustomSlideShow.getChild("remove")
+ self.assertEqual(get_state_as_dict(custompages)["Children"], "1")
+ self.assertEqual(get_state_as_dict(pages)["Children"], "1")
+ xEntry = custompages.getChild("0")
+ xEntry.executeAction("SELECT", tuple())
+# remove.executeAction("CLICK",tuple()) #tdf126951
+ self.assertEqual(get_state_as_dict(custompages)["Children"], "1")
+ self.assertEqual(get_state_as_dict(pages)["Children"], "1")
+
+ delete = CustomSlideShows.getChild("delete")
+ customshowlist = CustomSlideShows.getChild("customshowlist")
+ self.assertEqual(get_state_as_dict(customshowlist)["Children"], "1")
+
+# delete.executeAction("CLICK",tuple())
+# self.assertEqual(get_state_as_dict(customshowlist)["Children"], "0")
+
+ def test_tdf143125(self):
+ with self.ui_test.create_doc_in_start_center("impress"):
+ MainWindow = self.xUITest.getTopFocusWindow()
+ TemplateDialog = self.xUITest.getTopFocusWindow()
+ cancel = TemplateDialog.getChild("close")
+ self.ui_test.close_dialog_through_button(cancel)
+ with self.ui_test.execute_dialog_through_command(".uno:CustomShowDialog") as CustomSlideShows:
+ # Without the fix in place, this test would have crashed here
+ pass
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/embedded.py b/sd/qa/uitest/impress_tests/embedded.py
new file mode 100644
index 000000000..e324424f6
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/embedded.py
@@ -0,0 +1,37 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_url_for_data_file
+from libreoffice.calc.document import get_cell_by_position
+
+class EmbeddedDocument(UITestCase):
+
+ def test_open_embedded_document(self):
+ with self.ui_test.load_file(get_url_for_data_file("embedded.pptx")):
+
+ xImpressDoc = self.xUITest.getTopFocusWindow()
+ xEditWin = xImpressDoc.getChild("impress_win")
+
+ xEditWin.executeAction("SELECT", mkPropertyValues({"OBJECT":"Object 2"}))
+
+ xEditWin.executeAction("TYPE", mkPropertyValues({"KEYCODE": "RETURN"}))
+
+ document = self.ui_test.get_component()
+ self.assertEqual("Name", get_cell_by_position(document, 0, 0, 0).getString())
+ self.assertEqual("NWell", get_cell_by_position(document, 0, 0, 1).getString())
+ self.assertEqual("PWell", get_cell_by_position(document, 0, 0, 2).getString())
+ self.assertEqual("Active", get_cell_by_position(document, 0, 0, 3).getString())
+ self.assertEqual("NoPoly", get_cell_by_position(document, 0, 0, 4).getString())
+ self.assertEqual("Poly", get_cell_by_position(document, 0, 0, 5).getString())
+ self.assertEqual("Sized", get_cell_by_position(document, 0, 0, 6).getString())
+
+ self.xUITest.executeCommand(".uno:CloseDoc")
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/exportToPDF.py b/sd/qa/uitest/impress_tests/exportToPDF.py
new file mode 100644
index 000000000..4dcaa4954
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/exportToPDF.py
@@ -0,0 +1,82 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from uitest.uihelper.common import get_state_as_dict, get_url_for_data_file
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from org.libreoffice.unotest import systemPathToFileUrl
+from tempfile import TemporaryDirectory
+import os.path
+
+class exportToPDF(UITestCase):
+
+ def test_checkDefaultValues(self):
+
+ with TemporaryDirectory() as tempdir:
+ xFilePath = os.path.join(tempdir, 'exportToPDFFromImpress-tmp.pdf')
+
+ with self.ui_test.create_doc_in_start_center("impress"):
+
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ xDoc = self.xUITest.getTopFocusWindow()
+ xEdit = xDoc.getChild("impress_win")
+
+ xEdit.executeAction("TYPE", mkPropertyValues({"TEXT":"Hello World"}))
+
+ # Export as PDF
+ with self.ui_test.execute_dialog_through_command('.uno:ExportToPDF', close_button="") as xDialog:
+
+ selectedChildren = ['bookmarks', 'display', 'effects', 'enablea11y', 'enablecopy', 'exporturl', 'forms', 'reduceresolution']
+
+ for child in selectedChildren:
+ self.assertEqual("true", get_state_as_dict(xDialog.getChild(child))['Selected'])
+
+ nonSelectedChildren = ['allowdups', 'center', 'comments', 'convert', 'embed', 'emptypages', 'export', 'exportplaceholders',
+ 'firstonleft', 'hiddenpages', 'menubar', 'notes', 'onlynotes', 'open', 'pdfa', 'pdfua', 'resize', 'singlepagesheets',
+ 'tagged', 'toolbar', 'usereferencexobject', 'viewpdf', 'watermark', 'window']
+
+ for child in nonSelectedChildren:
+ self.assertEqual("false", get_state_as_dict(xDialog.getChild(child))['Selected'])
+
+ checkedChildren = ['all', 'allbookmarks', 'changeany', 'default', 'defaultlayout', 'fitdefault', 'jpegcompress', 'pageonly', 'printhigh']
+
+ for child in checkedChildren:
+ self.assertEqual("true", get_state_as_dict(xDialog.getChild(child))['Checked'])
+
+ nonCheckedChildren = ['changecomment', 'changeform', 'changeinsdel', 'changenone', 'contfacinglayout', 'contlayout', 'fitvis',
+ 'fitwidth', 'fitwin', 'fitzoom', 'losslesscompress', 'openinternet', 'openpdf', 'outline', 'printlow', 'printnone', 'range',
+ 'selection', 'singlelayout', 'thumbs', 'visiblebookmark']
+
+ for child in nonCheckedChildren:
+ self.assertEqual("false", get_state_as_dict(xDialog.getChild(child))['Checked'])
+
+ self.assertEqual("300 DPI", get_state_as_dict(xDialog.getChild("resolution"))['Text'])
+ self.assertEqual("90", get_state_as_dict(xDialog.getChild("quality"))['Value'])
+ self.assertEqual("FDF", get_state_as_dict(xDialog.getChild("format"))['DisplayText'])
+
+ xOk = xDialog.getChild("ok")
+ with self.ui_test.execute_dialog_through_action(xOk, "CLICK", close_button="open") as xSaveDialog:
+ xFileName = xSaveDialog.getChild('file_name')
+ xFileName.executeAction('TYPE', mkPropertyValues({'KEYCODE':'CTRL+A'}))
+ xFileName.executeAction('TYPE', mkPropertyValues({'KEYCODE':'BACKSPACE'}))
+ xFileName.executeAction('TYPE', mkPropertyValues({'TEXT': xFilePath}))
+
+ self.ui_test.wait_until_file_is_available(xFilePath)
+
+ with self.ui_test.load_file(systemPathToFileUrl(xFilePath)) as document:
+
+ self.assertEqual("", document.DrawPages[0].getByIndex(0).String)
+ self.assertEqual(" ", document.DrawPages[0].getByIndex(1).String)
+ self.assertEqual(" ", document.DrawPages[0].getByIndex(2).String)
+ self.assertEqual("Hello World", document.DrawPages[0].getByIndex(3).String)
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/insertSlide.py b/sd/qa/uitest/impress_tests/insertSlide.py
new file mode 100644
index 000000000..f81d0792f
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/insertSlide.py
@@ -0,0 +1,53 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_state_as_dict
+import time
+from uitest.uihelper.common import select_pos
+#Bug 85360 - LibreOffice crashes and crashes desktop too on inserting 4th slide
+
+class insertSlide(UITestCase):
+
+ def test_insert_slide(self):
+ with self.ui_test.create_doc_in_start_center("impress") as document:
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+ self.assertEqual(document.DrawPages.getCount(), 1) #nr. of pages
+
+ self.xUITest.executeCommand(".uno:InsertPage")
+
+ #verify
+ self.assertEqual(document.DrawPages.getCount(), 2) #nr. of pages
+ #undo
+ self.xUITest.executeCommand(".uno:Undo")
+ self.assertEqual(document.DrawPages.getCount(), 1) #nr. of pages
+
+ def test_tdf85360_insert_4th_slide(self):
+ with self.ui_test.create_doc_in_start_center("impress") as document:
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+ self.assertEqual(document.DrawPages.getCount(), 1) #nr. of pages
+
+ self.xUITest.executeCommand(".uno:InsertPage")
+ self.xUITest.executeCommand(".uno:InsertPage")
+ self.xUITest.executeCommand(".uno:InsertPage")
+ self.xUITest.executeCommand(".uno:InsertPage")
+ #verify
+ self.assertEqual(document.DrawPages.getCount(), 5) #nr. of pages
+ #undo
+ self.xUITest.executeCommand(".uno:Undo")
+ self.xUITest.executeCommand(".uno:Undo")
+ self.xUITest.executeCommand(".uno:Undo")
+ self.xUITest.executeCommand(".uno:Undo")
+ self.assertEqual(document.DrawPages.getCount(), 1) #nr. of pages
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/masterElements.py b/sd/qa/uitest/impress_tests/masterElements.py
new file mode 100644
index 000000000..ad277ca25
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/masterElements.py
@@ -0,0 +1,46 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_state_as_dict
+import time
+from uitest.uihelper.common import select_pos
+
+class masterElements(UITestCase):
+
+ def test_master_elements(self):
+ with self.ui_test.create_doc_in_start_center("impress"):
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ with self.ui_test.execute_dialog_through_command(".uno:MasterLayouts") as xDialog:
+
+ xpagenumber = xDialog.getChild("pagenumber")
+ xfooter = xDialog.getChild("footer")
+ datetime = xDialog.getChild("datetime")
+ xpagenumber.executeAction("CLICK", tuple())
+ xfooter.executeAction("CLICK", tuple())
+ datetime.executeAction("CLICK", tuple())
+
+
+ #verify
+ with self.ui_test.execute_dialog_through_command(".uno:MasterLayouts") as xDialog:
+ xfooter = xDialog.getChild("footer")
+ datetime = xDialog.getChild("datetime")
+ xpagenumber = xDialog.getChild("pagenumber")
+
+ self.assertEqual(get_state_as_dict(xfooter)["Selected"], "false")
+ self.assertEqual(get_state_as_dict(datetime)["Selected"], "false")
+ self.assertEqual(get_state_as_dict(xpagenumber)["Selected"], "false")
+
+
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/masterSlides.py b/sd/qa/uitest/impress_tests/masterSlides.py
new file mode 100644
index 000000000..c413537af
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/masterSlides.py
@@ -0,0 +1,47 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from uitest.uihelper.common import get_state_as_dict
+from libreoffice.uno.propertyvalue import mkPropertyValues
+
+class masterSlides(UITestCase):
+
+ def test_change_master_slide_from_dialog(self):
+
+ with self.ui_test.create_doc_in_start_center("impress"):
+
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ xImpress = self.xUITest.getTopFocusWindow()
+ xMasterSlide = xImpress.getChild("masterslide")
+ self.assertEqual("Default", get_state_as_dict(xMasterSlide)['SelectEntryText'])
+
+ xMasterButton = xImpress.getChild("masterslidebutton")
+ xMasterButton.executeAction("CLICK", tuple())
+
+ self.xUITest.executeCommand(".uno:InsertMasterPage")
+
+ xCloseMasterButton = xImpress.getChild("closemasterslide")
+ xCloseMasterButton.executeAction("CLICK", tuple())
+
+ with self.ui_test.execute_dialog_through_command(".uno:PresentationLayout") as xDialog:
+
+ xSelect = xDialog.getChild('select')
+ xSelect.executeAction("TYPE", mkPropertyValues({"KEYCODE": "RIGHT"}))
+
+
+ xMasterSlide = xImpress.getChild("masterslide")
+ self.assertEqual("Default 1", get_state_as_dict(xMasterSlide)['SelectEntryText'])
+
+
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/renameSlide.py b/sd/qa/uitest/impress_tests/renameSlide.py
new file mode 100644
index 000000000..c47e9f490
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/renameSlide.py
@@ -0,0 +1,47 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_state_as_dict
+
+class renameSlide(UITestCase):
+
+ def test_rename_slide(self):
+ with self.ui_test.create_doc_in_start_center("impress"):
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ with self.ui_test.execute_dialog_through_command(".uno:RenamePage") as xDialog:
+
+ name_entry = xDialog.getChild("name_entry")
+ name_entry.executeAction("TYPE", mkPropertyValues({"TEXT":"NewName"}))
+
+
+ #verify
+ with self.ui_test.execute_dialog_through_command(".uno:RenamePage") as xDialog:
+
+ name_entry = xDialog.getChild("name_entry")
+ self.assertEqual(get_state_as_dict(name_entry)["Text"], "NewName")
+
+ self.xUITest.executeCommand(".uno:InsertPage")
+
+ with self.ui_test.execute_dialog_through_command(".uno:RenamePage", close_button="cancel") as xDialog:
+
+ xOKBtn = xDialog.getChild("ok")
+ self.assertEqual("true", get_state_as_dict(xOKBtn)['Enabled'])
+
+ name_entry = xDialog.getChild("name_entry")
+ name_entry.executeAction("TYPE", mkPropertyValues({"TEXT":"NewName"}))
+
+ self.assertEqual("false", get_state_as_dict(xOKBtn)['Enabled'])
+
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/save_readonly_with_password.py b/sd/qa/uitest/impress_tests/save_readonly_with_password.py
new file mode 100644
index 000000000..caca0126a
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/save_readonly_with_password.py
@@ -0,0 +1,107 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from org.libreoffice.unotest import systemPathToFileUrl
+from uitest.uihelper.common import select_by_text
+from tempfile import TemporaryDirectory
+import os.path
+
+class save_readonly_with_password(UITestCase):
+
+ #Bug 145511 - FILESAVE to PPTX as read-only with additional password protection for editing not working
+ def test_save_to_pptx(self):
+
+ with TemporaryDirectory() as tempdir:
+ xFilePath = os.path.join(tempdir, "tdf144374-tmp.pptx")
+
+ with self.ui_test.create_doc_in_start_center("impress"):
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ # Save the document
+ with self.ui_test.execute_dialog_through_command(".uno:Save", close_button="") as xSaveDialog:
+ xFileName = xSaveDialog.getChild("file_name")
+ xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
+ xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
+ xFileName.executeAction("TYPE", mkPropertyValues({"TEXT": xFilePath}))
+ xFileTypeCombo = xSaveDialog.getChild("file_type")
+ select_by_text(xFileTypeCombo, "Office Open XML Presentation (.pptx)")
+ xPasswordCheckButton = xSaveDialog.getChild("password")
+ xPasswordCheckButton.executeAction("CLICK", tuple())
+ xOpen = xSaveDialog.getChild("open")
+
+ with self.ui_test.execute_dialog_through_action(xOpen, "CLICK", close_button="") as xPasswordDialog:
+ xReadonly = xPasswordDialog.getChild("readonly")
+ xReadonly.executeAction("CLICK", tuple())
+ xNewPassword = xPasswordDialog.getChild("newpassroEntry")
+ xNewPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"}))
+ xConfirmPassword = xPasswordDialog.getChild("confirmropassEntry")
+ xConfirmPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"}))
+
+ xOk = xPasswordDialog.getChild("ok")
+ # PPTX confirmation dialog is displayed
+ with self.ui_test.execute_dialog_through_action(xOk, "CLICK", close_button="save"):
+ pass
+
+ self.ui_test.wait_until_file_is_available(xFilePath)
+
+ with self.ui_test.load_file(systemPathToFileUrl(xFilePath)) as document:
+
+ self.assertTrue(document.isReadonly())
+
+ # Without the fix in place, this dialog wouldn't have been displayed
+ with self.ui_test.execute_dialog_through_command(".uno:EditDoc") as xDialog:
+ xPassword = xDialog.getChild("newpassEntry")
+ xPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"}))
+
+ self.assertFalse(document.isReadonly())
+
+ def test_save_to_odp(self):
+
+ with TemporaryDirectory() as tempdir:
+ xFilePath = os.path.join(tempdir, "readonly_with_password_tmp.odp")
+
+ with self.ui_test.create_doc_in_start_center("impress"):
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ # Save the document
+ with self.ui_test.execute_dialog_through_command(".uno:Save", close_button="") as xSaveDialog:
+ xFileName = xSaveDialog.getChild("file_name")
+ xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
+ xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
+ xFileName.executeAction("TYPE", mkPropertyValues({"TEXT": xFilePath}))
+ xPasswordCheckButton = xSaveDialog.getChild("password")
+ xPasswordCheckButton.executeAction("CLICK", tuple())
+ xOpen = xSaveDialog.getChild("open")
+
+ with self.ui_test.execute_dialog_through_action(xOpen, "CLICK") as xPasswordDialog:
+ xReadonly = xPasswordDialog.getChild("readonly")
+ xReadonly.executeAction("CLICK", tuple())
+ xNewPassword = xPasswordDialog.getChild("newpassroEntry")
+ xNewPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"}))
+ xConfirmPassword = xPasswordDialog.getChild("confirmropassEntry")
+ xConfirmPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"}))
+
+ self.ui_test.wait_until_file_is_available(xFilePath)
+
+ with self.ui_test.load_file(systemPathToFileUrl(xFilePath)) as document:
+
+ self.assertTrue(document.isReadonly())
+
+ with self.ui_test.execute_dialog_through_command(".uno:EditDoc") as xDialog:
+ xPassword = xDialog.getChild("newpassEntry")
+ xPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"}))
+
+ self.assertFalse(document.isReadonly())
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/slideShowSettings.py b/sd/qa/uitest/impress_tests/slideShowSettings.py
new file mode 100644
index 000000000..16fbdc840
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/slideShowSettings.py
@@ -0,0 +1,60 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_state_as_dict, type_text, select_pos
+
+class slideShowSettings(UITestCase):
+ def test_slideShowSettings(self):
+ with self.ui_test.create_doc_in_start_center("impress"):
+ MainWindow = self.xUITest.getTopFocusWindow()
+ TemplateDialog = self.xUITest.getTopFocusWindow()
+ cancel = TemplateDialog.getChild("close")
+ self.ui_test.close_dialog_through_button(cancel)
+ self.xUITest.executeCommand(".uno:InsertPage")
+ with self.ui_test.execute_dialog_through_command(".uno:PresentationDialog") as PresentationDialog:
+
+ xfrom = PresentationDialog.getChild("from")
+ xfrom.executeAction("CLICK",tuple())
+ from_cb = PresentationDialog.getChild("from_cb")
+ select_pos(from_cb, "0")
+ window = PresentationDialog.getChild("window")
+ window.executeAction("CLICK",tuple())
+ manualslides = PresentationDialog.getChild("manualslides")
+ manualslides.executeAction("CLICK",tuple())
+ pointervisible = PresentationDialog.getChild("pointervisible")
+ pointervisible.executeAction("CLICK",tuple())
+ pointeraspen = PresentationDialog.getChild("pointeraspen")
+ pointeraspen.executeAction("CLICK",tuple())
+ animationsallowed = PresentationDialog.getChild("animationsallowed")
+ animationsallowed.executeAction("CLICK",tuple())
+ changeslidesbyclick = PresentationDialog.getChild("changeslidesbyclick")
+ changeslidesbyclick.executeAction("CLICK",tuple())
+
+ #verify
+ with self.ui_test.execute_dialog_through_command(".uno:PresentationDialog", close_button="cancel") as PresentationDialog:
+ xfrom = PresentationDialog.getChild("from")
+ self.assertEqual(get_state_as_dict(xfrom)["Checked"], "true")
+ from_cb = PresentationDialog.getChild("from_cb")
+ self.assertEqual(get_state_as_dict(from_cb)["SelectEntryText"], "Slide 1")
+ manualslides = PresentationDialog.getChild("manualslides")
+ self.assertEqual(get_state_as_dict(manualslides)["Selected"], "true")
+ pointervisible = PresentationDialog.getChild("pointervisible")
+ self.assertEqual(get_state_as_dict(pointervisible)["Selected"], "true")
+ pointeraspen = PresentationDialog.getChild("pointeraspen")
+ self.assertEqual(get_state_as_dict(pointeraspen)["Selected"], "true")
+ animationsallowed = PresentationDialog.getChild("animationsallowed")
+ self.assertEqual(get_state_as_dict(animationsallowed)["Selected"], "false")
+ changeslidesbyclick = PresentationDialog.getChild("changeslidesbyclick")
+ self.assertEqual(get_state_as_dict(changeslidesbyclick)["Selected"], "false")
+
+
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf106612.py b/sd/qa/uitest/impress_tests/tdf106612.py
new file mode 100644
index 000000000..6ca8fbbaf
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf106612.py
@@ -0,0 +1,47 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_state_as_dict
+
+class Tdf106612(UITestCase):
+
+ def test_tdf106612(self):
+ with self.ui_test.create_doc_in_start_center("impress"):
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ xImpressDoc = self.xUITest.getTopFocusWindow()
+
+ xEditWin = xImpressDoc.getChild("impress_win")
+
+ self.xUITest.executeCommand(".uno:DuplicatePage")
+
+ self.assertEqual("2", get_state_as_dict(xEditWin)["CurrentSlide"])
+
+ xEditWin.executeAction("SIDEBAR", mkPropertyValues({"PANEL": "SdNavigatorPanel"}))
+
+ xTree = xImpressDoc.getChild("tree")
+ self.assertEqual(2, len(xTree.getChildren()))
+
+ self.assertEqual("Slide 1", get_state_as_dict(xTree.getChild('0'))['Text'])
+ self.assertEqual(2, len(xTree.getChild('0').getChildren()))
+
+ self.assertEqual("Slide 2", get_state_as_dict(xTree.getChild('1'))['Text'])
+ self.assertEqual(2, len(xTree.getChild('1').getChildren()))
+
+ xTree.getChild('0').executeAction("DOUBLECLICK", tuple())
+
+ # Without the fix in place, this test would have failed with
+ # AssertionError: '1' != '2'
+ self.assertEqual("1", get_state_as_dict(xEditWin)["CurrentSlide"])
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf125449.py b/sd/qa/uitest/impress_tests/tdf125449.py
new file mode 100644
index 000000000..242a79e65
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf125449.py
@@ -0,0 +1,59 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from uitest.uihelper.common import select_pos
+from com.sun.star.awt.GradientStyle import LINEAR
+
+class tdf125449(UITestCase):
+
+ def test_tdf125449(self):
+
+ with self.ui_test.create_doc_in_start_center("impress") as document:
+
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ with self.ui_test.execute_dialog_through_command(".uno:PageSetup") as xPageSetupDlg:
+
+ tabcontrol = xPageSetupDlg.getChild("tabcontrol")
+ select_pos(tabcontrol, "1")
+
+ xBtn = xPageSetupDlg.getChild('btngradient')
+ xBtn.executeAction("CLICK", tuple())
+
+ xAngle = xPageSetupDlg.getChild('anglemtr')
+ xAngle.executeAction("UP", tuple())
+
+
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillGradient.Style, LINEAR)
+ self.assertEqual(
+ hex(document.DrawPages.getByIndex(0).Background.FillGradient.StartColor), '0xdde8cb')
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillGradient.Angle, 450)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillGradient.Border, 0)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillGradient.XOffset, 0)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillGradient.YOffset, 0)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillGradient.StartIntensity, 100)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillGradient.EndIntensity, 100)
+
+ # Without the patch in place, this test would have failed with
+ # AssertionError: '' != 'gradient'
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillGradientName, 'gradient')
+
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf127900.py b/sd/qa/uitest/impress_tests/tdf127900.py
new file mode 100644
index 000000000..b85e602fa
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf127900.py
@@ -0,0 +1,41 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+from uitest.framework import UITestCase
+from uitest.uihelper.common import select_pos, get_state_as_dict
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_url_for_data_file
+
+class tdf127900(UITestCase):
+
+ def test_tdf127900(self):
+
+ with self.ui_test.load_file(get_url_for_data_file("tdf127900.fodp")) as doc:
+
+ xMasterLang = doc.MasterPages.getByIndex(0).getByIndex(1).CharLocale.Language
+ xSlideLang = doc.DrawPages.getByIndex(1).getByIndex(1).CharLocale.Language
+
+ self.assertEqual(xMasterLang, xSlideLang)
+
+ self.xUITest.executeCommand(".uno:SlideMasterPage")
+
+ xMaster = self.xUITest.getTopFocusWindow().getChild("impress_win")
+
+ xMaster.executeAction("TYPE", mkPropertyValues({"KEYCODE": "TAB"}))
+ xMaster.executeAction("TYPE", mkPropertyValues({"KEYCODE": "TAB"}))
+
+ with self.ui_test.execute_dialog_through_command(".uno:FontDialog") as xDlg:
+
+ select_pos(xDlg.getChild("cbWestLanguage"), "10")
+
+ xMasterLang = doc.MasterPages.getByIndex(0).getByIndex(1).CharLocale.Language
+ xSlideLang = doc.DrawPages.getByIndex(1).getByIndex(1).CharLocale.Language
+
+ self.assertEqual(xMasterLang, xSlideLang)
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf130440.py b/sd/qa/uitest/impress_tests/tdf130440.py
new file mode 100644
index 000000000..73fe44b31
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf130440.py
@@ -0,0 +1,65 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+
+class tdf129346(UITestCase):
+
+ def test_run(self):
+ with self.ui_test.create_doc_in_start_center("impress") as document:
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ xToolkit = self.xContext.ServiceManager.createInstance('com.sun.star.awt.Toolkit')
+
+ self.assertEqual(document.CurrentController.getCurrentPage().Number, 1)
+ self.xUITest.executeCommand(".uno:DuplicatePage")
+ xToolkit.processEventsToIdle()
+ self.assertEqual(document.CurrentController.getCurrentPage().Number, 2)
+
+ xDoc = self.xUITest.getTopFocusWindow()
+ xEdit = xDoc.getChild("impress_win")
+ # Type "test" into the text box
+ xEdit.executeAction("TYPE", mkPropertyValues({"TEXT":"test"}))
+ # Go to Page 1, which also forces to end edit box
+ xEdit.executeAction("GOTO", mkPropertyValues({"PAGE": "1"}))
+ xToolkit.processEventsToIdle()
+
+ # We should be at Page 1
+ self.assertEqual(document.CurrentController.getCurrentPage().Number, 1)
+
+ # Undo sends us to Page 2 and undo-es the text edit
+ self.xUITest.executeCommand(".uno:Undo")
+ xToolkit.processEventsToIdle()
+ self.assertEqual(document.CurrentController.getCurrentPage().Number, 2)
+
+ # Undo sends us to page 1 and undo-es command ".uno:DuplicatePage"
+ self.xUITest.executeCommand(".uno:Undo")
+ xToolkit.processEventsToIdle()
+ self.assertEqual(document.CurrentController.getCurrentPage().Number, 1)
+
+ # Redo ".uno:DuplicatePage" - we go to Page 2
+ self.xUITest.executeCommand(".uno:Redo")
+ xToolkit.processEventsToIdle()
+ self.assertEqual(document.CurrentController.getCurrentPage().Number, 2)
+
+ # Redo text edit
+ self.xUITest.executeCommand(".uno:Redo")
+
+ xDoc = self.xUITest.getTopFocusWindow()
+ xEdit = xDoc.getChild("impress_win")
+ xEdit.executeAction("TYPE", mkPropertyValues({"TEXT":"test"}))
+
+ xToolkit.processEventsToIdle()
+ #Without the accompanying fix in place, it would fail with AssertionError: 2 != 1
+ self.assertEqual(document.CurrentController.getCurrentPage().Number, 2)
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf133713.py b/sd/qa/uitest/impress_tests/tdf133713.py
new file mode 100644
index 000000000..a4195fd2b
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf133713.py
@@ -0,0 +1,58 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.uihelper.common import get_state_as_dict
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.framework import UITestCase
+
+class Tdf133713(UITestCase):
+
+ def test_Tdf133713(self):
+ with self.ui_test.create_doc_in_start_center("impress") as document:
+
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ xDoc = self.xUITest.getTopFocusWindow()
+ xEditWin = xDoc.getChild("impress_win")
+
+ xEditWin.executeAction("SELECT", mkPropertyValues({"OBJECT":"Unnamed Drawinglayer object 1"}))
+ self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName())
+
+ xEditWin.executeAction("TYPE", mkPropertyValues({"TEXT":"one"}))
+ xEditWin.executeAction("TYPE", mkPropertyValues({"KEYCODE": "RETURN"}))
+ xEditWin.executeAction("TYPE", mkPropertyValues({"TEXT":"two"}))
+ xEditWin.executeAction("TYPE", mkPropertyValues({"KEYCODE": "RETURN"}))
+ xEditWin.executeAction("TYPE", mkPropertyValues({"TEXT":"three"}))
+
+ self.xUITest.executeCommand(".uno:SelectAll")
+
+ with self.ui_test.execute_dialog_through_command(".uno:OutlineBullet") as xDialog:
+ xNumFormat = xDialog.getChild("numfmtlb")
+ xSelection = xDialog.getChild("selectionrb")
+ xIndent = xDialog.getChild("indentmf")
+ xRelSize = xDialog.getChild("relsize")
+
+ # Check some default values
+ self.assertEqual("Bullet", get_state_as_dict(xNumFormat)["DisplayText"])
+ self.assertEqual("true", get_state_as_dict(xSelection)["Checked"])
+ self.assertEqual("0", get_state_as_dict(xIndent)["Value"])
+ self.assertEqual("45%", get_state_as_dict(xRelSize)["Text"])
+
+ drawPage = document.getDrawPages().getByIndex(0)
+ shape = drawPage.getByIndex(1)
+ xEnumeration = shape.Text.createEnumeration()
+
+ # Without the fix in place, this test would have failed with
+ # AssertionError: 0 != None
+ for i in range(3):
+ self.assertEqual(0, xEnumeration.nextElement().NumberingLevel)
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf134734.py b/sd/qa/uitest/impress_tests/tdf134734.py
new file mode 100644
index 000000000..404e75dd7
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf134734.py
@@ -0,0 +1,102 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_state_as_dict, select_pos
+from com.sun.star.drawing.FillStyle import SOLID
+import importlib
+
+class TestClass(UITestCase):
+ def test_master_page_background(self):
+ with self.ui_test.create_doc_in_start_center("impress") as document:
+ TemplateDialog = self.xUITest.getTopFocusWindow()
+ close = TemplateDialog.getChild("close")
+ self.ui_test.close_dialog_through_button(close)
+
+ # set margins and fill color
+ with self.ui_test.execute_dialog_through_command(".uno:PageSetup") as DrawPageDialog:
+ xTabs = DrawPageDialog.getChild("tabcontrol")
+ select_pos(xTabs, "0")
+ checkBackgroundFullSize = DrawPageDialog.getChild("checkBackgroundFullSize")
+ self.assertEqual(get_state_as_dict(checkBackgroundFullSize)["Selected"], "false")
+ spinMargLeft = DrawPageDialog.getChild("spinMargLeft")
+ for _ in range(20):
+ spinMargLeft.executeAction("UP",tuple())
+ spinMargRight = DrawPageDialog.getChild("spinMargRight")
+ for _ in range(15):
+ spinMargRight.executeAction("UP",tuple())
+ spinMargTop = DrawPageDialog.getChild("spinMargTop")
+ for _ in range(10):
+ spinMargTop.executeAction("UP",tuple())
+ spinMargBot = DrawPageDialog.getChild("spinMargBot")
+ for _ in range(5):
+ spinMargBot.executeAction("UP",tuple())
+ xTabs = DrawPageDialog.getChild("tabcontrol")
+ select_pos(xTabs, "1")
+ btncolor = DrawPageDialog.getChild("btncolor")
+ btncolor.executeAction("CLICK",tuple())
+
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillStyle, SOLID)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).BorderLeft, 1016)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).BorderRight, 762)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).BorderTop, 508)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).BorderBottom, 254)
+ self.assertEqual(
+ document.MasterPages.getByIndex(0).BackgroundFullSize, False)
+
+ # check it
+ with self.ui_test.execute_dialog_through_command(".uno:PageSetup") as DrawPageDialog:
+ xTabs = DrawPageDialog.getChild("tabcontrol")
+ select_pos(xTabs, "0")
+ checkBackgroundFullSize = DrawPageDialog.getChild("checkBackgroundFullSize")
+ self.assertEqual(get_state_as_dict(checkBackgroundFullSize)["Selected"], "false")
+ checkBackgroundFullSize.executeAction("CLICK",tuple())
+
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillStyle, SOLID)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).BorderLeft, 1016)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).BorderRight, 762)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).BorderTop, 508)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).BorderBottom, 254)
+ self.assertEqual(
+ document.MasterPages.getByIndex(0).BackgroundFullSize, True)
+
+ # uncheck it again
+ with self.ui_test.execute_dialog_through_command(".uno:PageSetup") as DrawPageDialog:
+ xTabs = DrawPageDialog.getChild("tabcontrol")
+ select_pos(xTabs, "0")
+ checkBackgroundFullSize = DrawPageDialog.getChild("checkBackgroundFullSize")
+ self.assertEqual(get_state_as_dict(checkBackgroundFullSize)["Selected"], "true")
+ checkBackgroundFullSize.executeAction("CLICK",tuple())
+
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillStyle, SOLID)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).BorderLeft, 1016)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).BorderRight, 762)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).BorderTop, 508)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).BorderBottom, 254)
+ self.assertEqual(
+ document.MasterPages.getByIndex(0).BackgroundFullSize, False)
+
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf137637.py b/sd/qa/uitest/impress_tests/tdf137637.py
new file mode 100644
index 000000000..fa2a16472
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf137637.py
@@ -0,0 +1,57 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_state_as_dict
+
+class Tdf137637(UITestCase):
+
+ def test_tdf137637(self):
+ with self.ui_test.create_doc_in_start_center("impress") as document:
+
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ # Insert shape with Ctrl key
+ xArgs = mkPropertyValues({"KeyModifier": 8192})
+ self.xUITest.executeCommandWithParameters(".uno:BasicShapes.rectangle", xArgs)
+
+ self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName())
+
+ xImpressDoc = self.xUITest.getTopFocusWindow()
+
+ xEditWin = xImpressDoc.getChild("impress_win")
+
+ xEditWin.executeAction("SIDEBAR", mkPropertyValues({"PANEL": "SdCustomAnimationPanel"}))
+
+ # Without the fix in place, this test would have failed with
+ # AttributeError: 'NoneType' object has no attribute 'getImplementationName'
+ self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName())
+
+ xAnimationList = xImpressDoc.getChild("custom_animation_list")
+ self.assertEqual('0', get_state_as_dict(xAnimationList)['Children'])
+
+ xAddBtn = xImpressDoc.getChild("add_effect")
+ xAddBtn.executeAction("CLICK", tuple())
+
+ self.assertEqual('1', get_state_as_dict(xAnimationList)['Children'])
+
+ self.xUITest.executeCommand(".uno:Undo")
+
+ # tdf#135033: Without the fix in place, this test would have failed with
+ # AssertionError: '0' != '1'
+ self.assertEqual('0', get_state_as_dict(xAnimationList)['Children'])
+
+ # tdf#145030: Without the fix in place, this test would have failed with
+ # AttributeError: 'NoneType' object has no attribute 'getImplementationName'
+ self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName())
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab: \ No newline at end of file
diff --git a/sd/qa/uitest/impress_tests/tdf137729.py b/sd/qa/uitest/impress_tests/tdf137729.py
new file mode 100644
index 000000000..e5b3d1fb6
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf137729.py
@@ -0,0 +1,52 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from uitest.uihelper.common import select_pos
+from com.sun.star.drawing.HatchStyle import SINGLE
+from uitest.uihelper.common import get_state_as_dict
+
+class tdf137729(UITestCase):
+
+ def test_tdf137729(self):
+
+ with self.ui_test.create_doc_in_start_center("impress") as document:
+
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ with self.ui_test.execute_dialog_through_command(".uno:PageSetup") as xPageSetupDlg:
+
+ tabcontrol = xPageSetupDlg.getChild("tabcontrol")
+ select_pos(tabcontrol, "1")
+
+ xBtn = xPageSetupDlg.getChild('btnhatch')
+ xBtn.executeAction("CLICK", tuple())
+
+ xDistance = xPageSetupDlg.getChild('distancemtr')
+ xDistance.executeAction("UP", tuple())
+
+
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillHatch.Style, SINGLE )
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillHatch.Color, 0)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillHatch.Distance, 152)
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillHatch.Angle, 0)
+
+ # Without the patch in place, this test would have failed with
+ # AssertionError: '' != 'hatch'
+ self.assertEqual(
+ document.DrawPages.getByIndex(0).Background.FillHatchName, 'hatch')
+
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf139511.py b/sd/qa/uitest/impress_tests/tdf139511.py
new file mode 100644
index 000000000..3c1988510
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf139511.py
@@ -0,0 +1,52 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from uitest.uihelper.common import get_state_as_dict
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import change_measurement_unit
+
+class tdf139511(UITestCase):
+
+ def test_tdf139511(self):
+ with self.ui_test.create_doc_in_start_center("impress") as document:
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ change_measurement_unit(self, "Centimeter")
+
+ self.xUITest.executeCommand(".uno:InsertTable?Columns:short=4&Rows:short=4")
+
+ self.assertEqual(8004, document.DrawPages[0].getByIndex(2).BoundRect.Height)
+ self.assertEqual(14104, document.DrawPages[0].getByIndex(2).BoundRect.Width)
+
+ with self.ui_test.execute_dialog_through_command(".uno:TransformDialog") as xDialog:
+
+
+ xWidth = xDialog.getChild('MTR_FLD_WIDTH')
+ xHeight = xDialog.getChild('MTR_FLD_HEIGHT')
+
+ xWidth.executeAction("TYPE", mkPropertyValues({"KEYCODE": "CTRL+A"}))
+ xWidth.executeAction("TYPE", mkPropertyValues({"KEYCODE": "BACKSPACE"}))
+ xWidth.executeAction("TYPE", mkPropertyValues({"TEXT": "10"}))
+
+ xHeight.executeAction("TYPE", mkPropertyValues({"KEYCODE": "CTRL+A"}))
+ xHeight.executeAction("TYPE", mkPropertyValues({"KEYCODE": "BACKSPACE"}))
+ xHeight.executeAction("TYPE", mkPropertyValues({"TEXT": "5"}))
+
+
+
+ # Without the fix in place, this test would have failed with
+ # AssertionError: 5005 != 8004
+ self.assertEqual(5005, document.DrawPages[0].getByIndex(2).BoundRect.Height)
+ self.assertEqual(10005, document.DrawPages[0].getByIndex(2).BoundRect.Width)
+
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf141297.py b/sd/qa/uitest/impress_tests/tdf141297.py
new file mode 100644
index 000000000..c7a9e3057
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf141297.py
@@ -0,0 +1,82 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_state_as_dict, get_url_for_data_file
+from org.libreoffice.unotest import systemPathToFileUrl
+from tempfile import TemporaryDirectory
+import os.path
+
+class tdf141297(UITestCase):
+
+ def test_tdf141297(self):
+ with TemporaryDirectory() as tempdir:
+ xFilePath = os.path.join(tempdir, "tdf141297-tmp.odp")
+
+ with self.ui_test.create_doc_in_start_center("impress"):
+
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ with self.ui_test.execute_dialog_through_command(".uno:InsertGraphic", close_button="") as xOpenDialog:
+
+ xFileName = xOpenDialog.getChild("file_name")
+ xFileName.executeAction("TYPE", mkPropertyValues({"TEXT": get_url_for_data_file("LibreOffice.jpg")}))
+
+ xLink = xOpenDialog.getChild("link")
+ self.assertEqual("false", get_state_as_dict(xLink)['Selected'])
+
+ xLink.executeAction("CLICK", tuple())
+
+ xOpen = xOpenDialog.getChild("open")
+ #Confirmation dialog is displayed
+ with self.ui_test.execute_dialog_through_action(xOpen, "CLICK"):
+ pass
+
+ with self.ui_test.execute_dialog_through_command(".uno:ManageLinks", close_button="close") as xDialog:
+
+ sLinks = "TB_LINKS"
+ xLinks = xDialog.getChild(sLinks)
+ self.assertEqual(1, len(xLinks.getChildren()))
+
+ sFileName = "FULL_FILE_NAME"
+ xFileName = xDialog.getChild(sFileName)
+ self.assertTrue(get_state_as_dict(xFileName)["Text"].endswith("/LibreOffice.jpg"))
+
+ sBreakLink = "BREAK_LINK"
+ xBreakLink = xDialog.getChild(sBreakLink)
+
+ with self.ui_test.execute_blocking_action(xBreakLink.executeAction,
+ args=("CLICK", tuple()), close_button="yes"):
+ pass
+
+ # Save Copy as
+ with self.ui_test.execute_dialog_through_command(".uno:SaveAs", close_button="open") as xDialog:
+
+ xFileName = xDialog.getChild("file_name")
+ xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"CTRL+A"}))
+ xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"}))
+ xFileName.executeAction("TYPE", mkPropertyValues({"TEXT": xFilePath}))
+
+ self.ui_test.wait_until_file_is_available(xFilePath)
+
+ with self.ui_test.load_file(systemPathToFileUrl(xFilePath)):
+
+ self.xUITest.executeCommand(".uno:ManageLinks")
+
+ # Since the image is no longer linked, the link dialog is not open.
+ # Without the fix in place, this dialog would have been opened
+ xMainWin = self.xUITest.getTopFocusWindow()
+ self.assertTrue(sLinks not in xMainWin.getChildren())
+ self.assertTrue(sFileName not in xMainWin.getChildren())
+ self.assertTrue(sBreakLink not in xMainWin.getChildren())
+ self.assertTrue("impress_win" in xMainWin.getChildren())
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf141708.py b/sd/qa/uitest/impress_tests/tdf141708.py
new file mode 100644
index 000000000..bb9298f68
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf141708.py
@@ -0,0 +1,33 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+from uitest.framework import UITestCase
+
+class tdf141708(UITestCase):
+
+ def test_tdf141708(self):
+
+ with self.ui_test.create_doc_in_start_center("impress"):
+
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ self.xUITest.executeCommand(".uno:Navigator")
+
+ self.xUITest.executeCommand(".uno:CloseDoc")
+
+ with self.ui_test.create_doc_in_start_center("impress"):
+
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ # Without the fix in place, this test would have crashed here
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf144943.py b/sd/qa/uitest/impress_tests/tdf144943.py
new file mode 100644
index 000000000..9bf5a891f
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf144943.py
@@ -0,0 +1,31 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+from uitest.framework import UITestCase
+from uitest.uihelper.common import get_url_for_data_file
+from libreoffice.uno.propertyvalue import mkPropertyValues
+
+#Bug 144943 - FILEOPEN PPTX Read-only passwords on PPTX files are not working
+
+class tdf144943(UITestCase):
+
+ def test_tdf144943(self):
+ with self.ui_test.load_file(get_url_for_data_file("tdf144943.pptx")):
+ document = self.ui_test.get_component()
+
+ # Without the fix in place, this test would have failed with
+ # AssertionError: False is not true
+ self.assertTrue(document.isReadonly())
+
+ with self.ui_test.execute_dialog_through_command(".uno:EditDoc") as xDialog:
+ xPassword = xDialog.getChild("newpassEntry")
+ xPassword.executeAction("TYPE", mkPropertyValues({"TEXT": "password"}))
+
+ self.assertFalse(document.isReadonly())
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf146019.py b/sd/qa/uitest/impress_tests/tdf146019.py
new file mode 100644
index 000000000..16e0290ab
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf146019.py
@@ -0,0 +1,36 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_url_for_data_file
+
+class tdf146019(UITestCase):
+
+ def test_tdf146019(self):
+
+ with self.ui_test.create_doc_in_start_center("impress") as document:
+
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ with self.ui_test.execute_dialog_through_command(".uno:InsertGraphic", close_button="open") as xOpenDialog:
+
+ xFileName = xOpenDialog.getChild("file_name")
+ xFileName.executeAction("TYPE", mkPropertyValues({"TEXT": get_url_for_data_file("tdf146019.jpg")}))
+
+ # Before the fix, a dialog was displayed at this point
+
+ # Check the shape is rotated, height > width
+ drawPage = document.getDrawPages().getByIndex(0)
+ shape = drawPage.getByIndex(2)
+ self.assertEqual(8996, shape.getSize().Width)
+ self.assertEqual(11745, shape.getSize().Height)
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf82616.py b/sd/qa/uitest/impress_tests/tdf82616.py
new file mode 100644
index 000000000..7f6b1db82
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf82616.py
@@ -0,0 +1,70 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.uihelper.common import get_state_as_dict
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import change_measurement_unit
+from uitest.framework import UITestCase
+
+class Tdf82616(UITestCase):
+
+ def test_tdf82616(self):
+ with self.ui_test.create_doc_in_start_center("impress") as document:
+
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ change_measurement_unit(self, 'Centimeter')
+
+ xImpressDoc = self.xUITest.getTopFocusWindow()
+
+ self.assertIsNone(document.CurrentSelection)
+
+ xEditWin = xImpressDoc.getChild("impress_win")
+ xEditWin.executeAction("SELECT", mkPropertyValues({"OBJECT":"Unnamed Drawinglayer object 1"}))
+ self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName())
+
+ with self.ui_test.execute_dialog_through_command(".uno:Size") as xDialog:
+ self.assertEqual('25.2', get_state_as_dict(xDialog.getChild('MTR_FLD_WIDTH'))['Value'])
+ self.assertEqual('9.13', get_state_as_dict(xDialog.getChild('MTR_FLD_HEIGHT'))['Value'])
+ self.assertEqual('1.4', get_state_as_dict(xDialog.getChild('MTR_FLD_POS_X'))['Value'])
+ self.assertEqual('3.69', get_state_as_dict(xDialog.getChild('MTR_FLD_POS_Y'))['Value'])
+ self.assertEqual('0', get_state_as_dict(xDialog.getChild('NF_ANGLE'))['Value'])
+
+ xEditWin.executeAction("SIDEBAR", mkPropertyValues({"PANEL": "PosSizePropertyPanel"}))
+
+ xHorizontalPos = xImpressDoc.getChild("horizontalpos")
+ self.ui_test.wait_until_property_is_updated(xHorizontalPos, "Value", "1.4")
+ self.assertEqual("1.4", get_state_as_dict(xHorizontalPos)['Value'])
+
+ xVerticalPos = xImpressDoc.getChild("verticalpos")
+ self.ui_test.wait_until_property_is_updated(xVerticalPos, "Value", "3.69")
+ self.assertEqual("3.69", get_state_as_dict(xVerticalPos)['Value'])
+
+ xDrawinglayerObject = xEditWin.getChild("Unnamed Drawinglayer object 1")
+ xDrawinglayerObject.executeAction("MOVE", mkPropertyValues({"X": "-5000", "Y":"-10000"}))
+
+ with self.ui_test.execute_dialog_through_command(".uno:Size") as xDialog:
+ self.assertEqual('25.2', get_state_as_dict(xDialog.getChild('MTR_FLD_WIDTH'))['Value'])
+ self.assertEqual('9.13', get_state_as_dict(xDialog.getChild('MTR_FLD_HEIGHT'))['Value'])
+ self.assertEqual('-3.6', get_state_as_dict(xDialog.getChild('MTR_FLD_POS_X'))['Value'])
+ self.assertEqual('-6.32', get_state_as_dict(xDialog.getChild('MTR_FLD_POS_Y'))['Value'])
+ self.assertEqual('0', get_state_as_dict(xDialog.getChild('NF_ANGLE'))['Value'])
+
+ # Without the fix in place, this test would have failed with
+ # AssertionError: '-3.6' != '0'
+ self.ui_test.wait_until_property_is_updated(xHorizontalPos, "Value", "-3.6")
+ self.assertEqual("-3.6", get_state_as_dict(xHorizontalPos)['Value'])
+
+ self.ui_test.wait_until_property_is_updated(xVerticalPos, "Value", "-6.32")
+ self.assertEqual("-6.32", get_state_as_dict(xVerticalPos)['Value'])
+
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/tdf91762.py b/sd/qa/uitest/impress_tests/tdf91762.py
new file mode 100644
index 000000000..2b3282413
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf91762.py
@@ -0,0 +1,46 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.framework import UITestCase
+from uitest.uihelper.common import get_state_as_dict
+from libreoffice.uno.propertyvalue import mkPropertyValues
+
+class tdf91762(UITestCase):
+
+ def test_tdf91762(self):
+ with self.ui_test.create_doc_in_start_center("impress") as document:
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ self.xUITest.executeCommand(".uno:AssignLayout?WhatLayout:long=1")
+
+ with self.ui_test.execute_dialog_through_command(".uno:InsertTable") as xDialog:
+ self.assertEqual('5', get_state_as_dict(xDialog.getChild('columns'))['Text'])
+ self.assertEqual('2', get_state_as_dict(xDialog.getChild('rows'))['Text'])
+
+ self.assertEqual(1929, document.DrawPages[0].getByIndex(1).BoundRect.Height)
+ self.assertEqual(25198, document.DrawPages[0].getByIndex(1).Size.Width)
+ self.assertEqual(1923, document.DrawPages[0].getByIndex(1).Size.Height)
+
+ self.assertEqual(1400, document.DrawPages[0].getByIndex(1).Position.X)
+ self.assertEqual(3685, document.DrawPages[0].getByIndex(1).Position.Y)
+
+ xDoc = self.xUITest.getTopFocusWindow()
+ xEdit = xDoc.getChild("impress_win")
+ for i in range(5):
+ xEdit.executeAction("TYPE", mkPropertyValues({"TEXT":"test"}))
+ xEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": "RETURN"}))
+
+ # tdf#138011: Without the fix in place, this test would have failed with
+ # AssertionError: 5504 != 3559
+ self.assertEqual(5504, document.DrawPages[0].getByIndex(1).BoundRect.Height)
+
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests/textColumnsDialog.py b/sd/qa/uitest/impress_tests/textColumnsDialog.py
new file mode 100644
index 000000000..2d13c6a9f
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/textColumnsDialog.py
@@ -0,0 +1,52 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from uitest.uihelper.common import get_state_as_dict
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import change_measurement_unit, select_pos
+from uitest.framework import UITestCase
+
+class textColumnsDialog(UITestCase):
+
+ def test_textColumnsDialog(self):
+ with self.ui_test.create_doc_in_start_center("impress") as document:
+
+ xTemplateDlg = self.xUITest.getTopFocusWindow()
+ xCancelBtn = xTemplateDlg.getChild("close")
+ self.ui_test.close_dialog_through_button(xCancelBtn)
+
+ change_measurement_unit(self, 'Centimeter')
+
+ xImpressDoc = self.xUITest.getTopFocusWindow()
+
+ xEditWin = xImpressDoc.getChild("impress_win")
+ xEditWin.executeAction("SELECT", mkPropertyValues({"OBJECT":"Unnamed Drawinglayer object 1"}))
+ self.assertEqual("com.sun.star.drawing.SvxShapeCollection", document.CurrentSelection.getImplementationName())
+
+ # Test defaults and set some values
+ with self.ui_test.execute_dialog_through_command(".uno:TextAttributes") as xDialog:
+ xTabs = xDialog.getChild("tabcontrol")
+ select_pos(xTabs, "2")
+ colNumber = xDialog.getChild('FLD_COL_NUMBER')
+ colSpacing = xDialog.getChild('MTR_FLD_COL_SPACING')
+ self.assertEqual('1', get_state_as_dict(colNumber)['Text'])
+ self.assertEqual('0.00 cm', get_state_as_dict(colSpacing)['Text'])
+ colNumber.executeAction("SET", mkPropertyValues({"TEXT": "3"}))
+ colSpacing.executeAction("SET", mkPropertyValues({"TEXT": "1.5"}))
+
+ # Test that settings persist
+ with self.ui_test.execute_dialog_through_command(".uno:TextAttributes") as xDialog:
+ xTabs = xDialog.getChild("tabcontrol")
+ select_pos(xTabs, "2")
+ colNumber = xDialog.getChild('FLD_COL_NUMBER')
+ colSpacing = xDialog.getChild('MTR_FLD_COL_SPACING')
+ self.assertEqual('3', get_state_as_dict(colNumber)['Text'])
+ self.assertEqual('1.50 cm', get_state_as_dict(colSpacing)['Text'])
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/uitest/impress_tests2/tdf153161.py b/sd/qa/uitest/impress_tests2/tdf153161.py
new file mode 100644
index 000000000..db14d7986
--- /dev/null
+++ b/sd/qa/uitest/impress_tests2/tdf153161.py
@@ -0,0 +1,37 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.framework import UITestCase
+from uitest.uihelper.common import get_url_for_data_file
+
+class TestTdf153161(UITestCase):
+
+ def testTdf153161(self):
+ url = get_url_for_data_file('tdf153161_FlushToSave.odp')
+
+ with self.ui_test.load_file(url) as document:
+ oldText = document.DrawPages[0].getByIndex(1).String
+ self.assertTrue(oldText.startswith('在没有版本控制系统的时期'))
+
+ xImpressDoc = self.xUITest.getTopFocusWindow()
+ xEditWin = xImpressDoc.getChild('impress_win')
+ xEditWin.executeAction('SELECT', mkPropertyValues({'OBJECT':'Unnamed Drawinglayer object 1'}))
+
+ # Type something, getting into text editing mode (appending) automatically
+ xEditWin.executeAction('TYPE', mkPropertyValues({'TEXT': 'Foo Bar'}))
+ xToolkit = self.xContext.ServiceManager.createInstance('com.sun.star.awt.Toolkit')
+ xToolkit.processEventsToIdle()
+ self.xUITest.executeCommand('.uno:Save')
+
+ # Reload and check that the edit was saved
+ with self.ui_test.load_file(url) as document:
+ self.assertEqual(oldText + 'Foo Bar', document.DrawPages[0].getByIndex(1).String)
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/qa/unit/HtmlExportTest.cxx b/sd/qa/unit/HtmlExportTest.cxx
new file mode 100644
index 000000000..c409dc12f
--- /dev/null
+++ b/sd/qa/unit/HtmlExportTest.cxx
@@ -0,0 +1,60 @@
+/* -*- 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 "sdmodeltestbase.hxx"
+
+#include <test/htmltesttools.hxx>
+#include <test/xmltesttools.hxx>
+
+using namespace css;
+
+class SdHTMLFilterTest : public SdModelTestBase, public XmlTestTools, public HtmlTestTools
+{
+private:
+ htmlDocUniquePtr exportAndParseHtml(sd::DrawDocShellRef const& xDocShRef)
+ {
+ FileFormat* pFormat = getFormat(HTML);
+ OUString aExt = "." + OUString::createFromAscii(pFormat->pName);
+ utl::TempFile aTempFile(u"", true, &aExt);
+ aTempFile.EnableKillingFile();
+ exportTo(xDocShRef.get(), pFormat, aTempFile);
+ return parseHtml(aTempFile);
+ }
+
+public:
+ void testHTMLExport()
+ {
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/HtmlExportTestDocument.odp"), ODP);
+ htmlDocUniquePtr htmlDoc = exportAndParseHtml(xDocShRef);
+
+ assertXPath(htmlDoc, "/html", 1);
+ assertXPath(htmlDoc, "/html/body", 1);
+ assertXPath(htmlDoc, "/html/body/h1", 4);
+ assertXPath(htmlDoc, "/html/body/table", 1);
+ assertXPath(htmlDoc, "/html/body/table/tr", 5);
+ assertXPath(htmlDoc, "/html/body/ul", 1);
+ assertXPath(htmlDoc, "/html/body/ul/li", 2);
+
+ assertXPath(htmlDoc, "/html/head/meta[1]", "content", "text/html; charset=utf-8");
+ assertXPath(htmlDoc, "/html/head/meta[2]", "name", "generator");
+ assertXPath(htmlDoc, "/html/head/meta[3]", "name", "created");
+ assertXPath(htmlDoc, "/html/head/meta[3]", "content", "2014-04-09T17:05:41.987922038");
+ }
+
+ CPPUNIT_TEST_SUITE(SdHTMLFilterTest);
+ CPPUNIT_TEST(testHTMLExport);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdHTMLFilterTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/PNGExportTests.cxx b/sd/qa/unit/PNGExportTests.cxx
new file mode 100644
index 000000000..6af1b6ea0
--- /dev/null
+++ b/sd/qa/unit/PNGExportTests.cxx
@@ -0,0 +1,503 @@
+
+/* -*- 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 <sal/config.h>
+
+#include "sdmodeltestbase.hxx"
+
+#include <com/sun/star/drawing/GraphicExportFilter.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <comphelper/propertyvalue.hxx>
+#include <vcl/BitmapReadAccess.hxx>
+#include <vcl/filter/PngImageReader.hxx>
+
+class SdPNGExportTest : public SdModelTestBase
+{
+protected:
+ uno::Reference<lang::XComponent> mxComponent;
+
+public:
+ virtual void setUp() override;
+ virtual void tearDown() override;
+};
+
+void SdPNGExportTest::setUp()
+{
+ test::BootstrapFixture::setUp();
+
+ mxDesktop.set(frame::Desktop::create(mxComponentContext));
+}
+
+void SdPNGExportTest::tearDown()
+{
+ if (mxComponent.is())
+ mxComponent->dispose();
+
+ test::BootstrapFixture::tearDown();
+}
+
+static void assertColorsAreSimilar(const std::string& message, const BitmapColor& expected,
+ const BitmapColor& actual, int nDelta)
+{
+ // Check that the two colors match or are reasonably similar.
+ if (expected.GetColorError(actual) <= nDelta)
+ return;
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual);
+}
+
+CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf105998)
+{
+ mxComponent
+ = loadFromDesktop(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf105998.odp"));
+ uno::Reference<uno::XComponentContext> xContext = getComponentContext();
+ CPPUNIT_ASSERT(xContext.is());
+ uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
+ = drawing::GraphicExportFilter::create(xContext);
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+
+ uno::Sequence<beans::PropertyValue> aDescriptor{
+ comphelper::makePropertyValue("URL", aTempFile.GetURL()),
+ comphelper::makePropertyValue("FilterName", OUString("PNG"))
+ };
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ uno::Reference<lang::XComponent> xShape(xPage->getByIndex(0), uno::UNO_QUERY);
+ xGraphicExporter->setSourceDocument(xShape);
+ xGraphicExporter->filter(aDescriptor);
+
+ SvFileStream aFileStream(aTempFile.GetURL(), StreamMode::READ);
+ vcl::PngImageReader aPNGReader(aFileStream);
+ BitmapEx aBMPEx = aPNGReader.read();
+
+ // make sure only the shape is exported
+ Size aSize = aBMPEx.GetSizePixel();
+ const auto[scalingX, scalingY] = getDPIScaling();
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(193 * scalingX, aSize.getWidth(), 1.0);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(193 * scalingY, aSize.getHeight(), 1.0);
+ if (!IsDefaultDPI())
+ return;
+
+ // Check all borders are red
+ // use assertColorsAreSimilar since the color might differ a little bit on mac
+ Bitmap aBMP = aBMPEx.GetBitmap();
+ {
+ Bitmap::ScopedReadAccess pReadAccess(aBMP);
+ for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
+ {
+ const Color aColorTop = pReadAccess->GetColor(0, nX);
+ const Color aColorBottom = pReadAccess->GetColor(aSize.Height() - 1, nX);
+
+ assertColorsAreSimilar("Incorrect top border", COL_LIGHTRED, aColorTop, 5);
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: Color: R:255 G:0 B:0 A:0
+ // - Actual : Color: R:9 G:9 B:9 A:0
+ assertColorsAreSimilar("Incorrect bottom border", COL_LIGHTRED, aColorBottom, 5);
+ }
+
+ for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
+ {
+ const Color aColorLeft = pReadAccess->GetColor(nY, 0);
+ const Color aColorRight = pReadAccess->GetColor(nY, aSize.Width() - 1);
+
+ assertColorsAreSimilar("Incorrect left border", COL_LIGHTRED, aColorLeft, 5);
+ assertColorsAreSimilar("Incorrect right border", COL_LIGHTRED, aColorRight, 5);
+ }
+ }
+}
+
+CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf126319)
+{
+ mxComponent
+ = loadFromDesktop(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odg/tdf126319.odg"));
+ uno::Reference<uno::XComponentContext> xContext = getComponentContext();
+ CPPUNIT_ASSERT(xContext.is());
+ uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
+ = drawing::GraphicExportFilter::create(xContext);
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+
+ uno::Sequence<beans::PropertyValue> aDescriptor{
+ comphelper::makePropertyValue("URL", aTempFile.GetURL()),
+ comphelper::makePropertyValue("FilterName", OUString("PNG"))
+ };
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ uno::Reference<lang::XComponent> xShape(xPage->getByIndex(0), uno::UNO_QUERY);
+ xGraphicExporter->setSourceDocument(xShape);
+ xGraphicExporter->filter(aDescriptor);
+
+ SvFileStream aFileStream(aTempFile.GetURL(), StreamMode::READ);
+ vcl::PngImageReader aPNGReader(aFileStream);
+ BitmapEx aBMPEx = aPNGReader.read();
+
+ // make sure only the shape is exported
+ Size aSize = aBMPEx.GetSizePixel();
+ const auto[scalingX, scalingY] = getDPIScaling();
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(295 * scalingX, aSize.getWidth(), 1.0);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(134 * scalingY, aSize.getHeight(), 1.0);
+
+ // Check all borders are red or similar. Ignore the corners
+ Bitmap aBMP = aBMPEx.GetBitmap();
+ {
+ Bitmap::ScopedReadAccess pReadAccess(aBMP);
+ for (tools::Long nX = 2; nX < aSize.Width() - 2; ++nX)
+ {
+ const Color aColorTop = pReadAccess->GetColor(0, nX);
+ const Color aColorBottom = pReadAccess->GetColor(aSize.Height() - 2, nX);
+
+ assertColorsAreSimilar("Incorrect top border", COL_LIGHTRED, aColorTop, 5);
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: Color: R:255 G:0 B:0 A:0
+ // - Actual : Color: R:77 G:0 B:0 A:0
+ assertColorsAreSimilar("Incorrect bottom border", COL_LIGHTRED, aColorBottom, 5);
+ }
+
+ for (tools::Long nY = 2; nY < aSize.Height() - 2; ++nY)
+ {
+ const Color aColorLeft = pReadAccess->GetColor(nY, 0);
+ const Color aColorRight = pReadAccess->GetColor(nY, aSize.Width() - 2);
+
+ assertColorsAreSimilar("Incorrect left border", COL_LIGHTRED, aColorLeft, 5);
+ assertColorsAreSimilar("Incorrect right border", COL_LIGHTRED, aColorRight, 5);
+ }
+ }
+}
+
+CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf136632)
+{
+ // Reuse existing file
+ mxComponent
+ = loadFromDesktop(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf105998.odp"));
+ uno::Reference<uno::XComponentContext> xContext = getComponentContext();
+ CPPUNIT_ASSERT(xContext.is());
+ uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
+ = drawing::GraphicExportFilter::create(xContext);
+
+ uno::Sequence<beans::PropertyValue> aFilterData{ comphelper::makePropertyValue("Translucent",
+ sal_Int32(0)) };
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+
+ uno::Sequence<beans::PropertyValue> aDescriptor{
+ comphelper::makePropertyValue("URL", aTempFile.GetURL()),
+ comphelper::makePropertyValue("FilterName", OUString("PNG")),
+ comphelper::makePropertyValue("FilterData", aFilterData)
+ };
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ uno::Reference<lang::XComponent> xShape(xPage->getByIndex(0), uno::UNO_QUERY);
+ xGraphicExporter->setSourceDocument(xShape);
+ xGraphicExporter->filter(aDescriptor);
+
+ SvFileStream aFileStream(aTempFile.GetURL(), StreamMode::READ);
+ vcl::PngImageReader aPNGReader(aFileStream);
+ BitmapEx aBMPEx = aPNGReader.read();
+ AlphaMask aAlpha = aBMPEx.GetAlpha();
+ AlphaMask::ScopedReadAccess pReadAccess(aAlpha);
+
+ // Without the fix in place, this test would have failed here
+ CPPUNIT_ASSERT(!pReadAccess);
+}
+
+CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf113163)
+{
+ mxComponent
+ = loadFromDesktop(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf113163.pptx"));
+ uno::Reference<uno::XComponentContext> xContext = getComponentContext();
+ CPPUNIT_ASSERT(xContext.is());
+ uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
+ = drawing::GraphicExportFilter::create(xContext);
+
+ uno::Sequence<beans::PropertyValue> aFilterData{
+ comphelper::makePropertyValue("PixelWidth", sal_Int32(100)),
+ comphelper::makePropertyValue("PixelHeight", sal_Int32(100))
+ };
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+
+ uno::Sequence<beans::PropertyValue> aDescriptor{
+ comphelper::makePropertyValue("URL", aTempFile.GetURL()),
+ comphelper::makePropertyValue("FilterName", OUString("PNG")),
+ comphelper::makePropertyValue("FilterData", aFilterData)
+ };
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ xGraphicExporter->setSourceDocument(xPage);
+ xGraphicExporter->filter(aDescriptor);
+
+ SvFileStream aFileStream(aTempFile.GetURL(), StreamMode::READ);
+ vcl::PngImageReader aPNGReader(aFileStream);
+ BitmapEx aBMPEx = aPNGReader.read();
+
+ // make sure the bitmap is not empty and correct size (PNG export->import was successful)
+ Size aSize = aBMPEx.GetSizePixel();
+ CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);
+ Bitmap aBMP = aBMPEx.GetBitmap();
+ {
+ Bitmap::ScopedReadAccess pReadAccess(aBMP);
+ for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
+ {
+ for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
+ {
+ // Check all pixels in the image are black
+ // Without the fix in place, this test would have failed with
+ // - Expected: 0
+ // - Actual : 16777215
+ const Color aColor = pReadAccess->GetColor(nY, nX);
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, aColor);
+ }
+ }
+ }
+}
+
+CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf147119)
+{
+ mxComponent
+ = loadFromDesktop(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odg/tdf147119.odg"));
+ uno::Reference<uno::XComponentContext> xContext = getComponentContext();
+ CPPUNIT_ASSERT(xContext.is());
+ uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
+ = drawing::GraphicExportFilter::create(xContext);
+
+ uno::Sequence<beans::PropertyValue> aFilterData{
+ comphelper::makePropertyValue("PixelWidth", sal_Int32(100)),
+ comphelper::makePropertyValue("PixelHeight", sal_Int32(100)),
+ comphelper::makePropertyValue("Translucent", sal_Int32(1)),
+ };
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+
+ uno::Sequence<beans::PropertyValue> aDescriptor{
+ comphelper::makePropertyValue("URL", aTempFile.GetURL()),
+ comphelper::makePropertyValue("FilterName", OUString("PNG")),
+ comphelper::makePropertyValue("FilterData", aFilterData)
+ };
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ xGraphicExporter->setSourceDocument(xPage);
+ xGraphicExporter->filter(aDescriptor);
+
+ SvFileStream aFileStream(aTempFile.GetURL(), StreamMode::READ);
+ vcl::PngImageReader aPNGReader(aFileStream);
+ BitmapEx aBMPEx = aPNGReader.read();
+
+ Size aSize = aBMPEx.GetSizePixel();
+ CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);
+ AlphaMask aAlpha = aBMPEx.GetAlpha();
+ {
+ AlphaMask::ScopedReadAccess pReadAccess(aAlpha);
+ for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
+ {
+ for (tools::Long nY = 1; nY < aSize.Height() - 1; ++nY)
+ {
+ // Without the fix in place, this test would have failed with
+ // - Expected: Color: R:255 G:255 B:255 A:0
+ // - Actual : Color: R:0 G:0 B:0 A:0
+ const Color aColor = pReadAccess->GetColor(nY, nX);
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, aColor);
+ }
+ }
+ }
+}
+
+CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf113197)
+{
+ mxComponent
+ = loadFromDesktop(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf113197.odp"));
+ uno::Reference<uno::XComponentContext> xContext = getComponentContext();
+ CPPUNIT_ASSERT(xContext.is());
+ uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
+ = drawing::GraphicExportFilter::create(xContext);
+
+ uno::Sequence<beans::PropertyValue> aFilterData{
+ comphelper::makePropertyValue("PixelWidth", sal_Int32(100)),
+ comphelper::makePropertyValue("PixelHeight", sal_Int32(100)),
+ };
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+
+ uno::Sequence<beans::PropertyValue> aDescriptor{
+ comphelper::makePropertyValue("URL", aTempFile.GetURL()),
+ comphelper::makePropertyValue("FilterName", OUString("PNG")),
+ comphelper::makePropertyValue("FilterData", aFilterData)
+ };
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ xGraphicExporter->setSourceDocument(xPage);
+ xGraphicExporter->filter(aDescriptor);
+
+ SvFileStream aFileStream(aTempFile.GetURL(), StreamMode::READ);
+ vcl::PngImageReader aPNGReader(aFileStream);
+ BitmapEx aBMPEx = aPNGReader.read();
+
+ // make sure the bitmap is not empty and correct size (PNG export->import was successful)
+ Size aSize = aBMPEx.GetSizePixel();
+ CPPUNIT_ASSERT_EQUAL(Size(100, 100), aSize);
+ Bitmap aBMP = aBMPEx.GetBitmap();
+ {
+ Bitmap::ScopedReadAccess pReadAccess(aBMP);
+ for (tools::Long nX = 1; nX < aSize.Width() - 1; ++nX)
+ {
+ // Check the bottom half of the document is white
+ for (tools::Long nY = 50; nY < aSize.Height() - 1; ++nY)
+ {
+ // Check all pixels in the image are black
+ // Without the fix in place, this test would have failed with
+ // - Expected: Color: R:255 G:255 B:255 A:0
+ // - Actual : Color: R:153 G:0 B:51 A:0
+ const Color aColor = pReadAccess->GetColor(nY, nX);
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, aColor);
+ }
+ }
+ }
+}
+
+CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf93124)
+{
+ mxComponent
+ = loadFromDesktop(m_directories.getURLFromSrc(u"/sd/qa/unit/data/ppt/tdf93124.ppt"));
+ uno::Reference<uno::XComponentContext> xContext = getComponentContext();
+ CPPUNIT_ASSERT(xContext.is());
+ uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
+ = drawing::GraphicExportFilter::create(xContext);
+
+ uno::Sequence<beans::PropertyValue> aFilterData{
+ comphelper::makePropertyValue("PixelWidth", sal_Int32(320)),
+ comphelper::makePropertyValue("PixelHeight", sal_Int32(180))
+ };
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+
+ uno::Sequence<beans::PropertyValue> aDescriptor{
+ comphelper::makePropertyValue("URL", aTempFile.GetURL()),
+ comphelper::makePropertyValue("FilterName", OUString("PNG")),
+ comphelper::makePropertyValue("FilterData", aFilterData)
+ };
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ xGraphicExporter->setSourceDocument(xPage);
+ xGraphicExporter->filter(aDescriptor);
+
+ SvFileStream aFileStream(aTempFile.GetURL(), StreamMode::READ);
+ vcl::PngImageReader aPNGReader(aFileStream);
+ BitmapEx aBMPEx = aPNGReader.read();
+
+ // make sure the bitmap is not empty and correct size (PNG export->import was successful)
+ CPPUNIT_ASSERT_EQUAL(Size(320, 180), aBMPEx.GetSizePixel());
+ Bitmap aBMP = aBMPEx.GetBitmap();
+ {
+ Bitmap::ScopedReadAccess pReadAccess(aBMP);
+ int nNonWhiteCount = 0;
+ // The word "Top" should be in rectangle 34,4 - 76,30. If text alignment is wrong, the rectangle will be white.
+ for (tools::Long nY = 4; nY < (4 + 26); ++nY)
+ {
+ for (tools::Long nX = 34; nX < (34 + 43); ++nX)
+ {
+ const Color aColor = pReadAccess->GetColor(nY, nX);
+ if ((aColor.GetRed() != 0xff) || (aColor.GetGreen() != 0xff)
+ || (aColor.GetBlue() != 0xff))
+ ++nNonWhiteCount;
+ }
+ }
+ CPPUNIT_ASSERT_MESSAGE("Tdf93124: vertical alignment of text is incorrect!",
+ nNonWhiteCount > 50);
+ }
+}
+
+CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf99729)
+{
+ const OUString filenames[]
+ = { "/sd/qa/unit/data/odp/tdf99729-new.odp", "/sd/qa/unit/data/odp/tdf99729-legacy.odp" };
+ int nonwhitecounts[] = { 0, 0 };
+ for (size_t i = 0; i < SAL_N_ELEMENTS(filenames); ++i)
+ {
+ // 1st check for new behaviour - having AnchoredTextOverflowLegacy compatibility flag set to false in settings.xml
+ mxComponent = loadFromDesktop(m_directories.getURLFromSrc(filenames[i]),
+ "com.sun.star.presentation.PresentationDocument");
+
+ uno::Reference<uno::XComponentContext> xContext = getComponentContext();
+ CPPUNIT_ASSERT(xContext.is());
+ uno::Reference<drawing::XGraphicExportFilter> xGraphicExporter
+ = drawing::GraphicExportFilter::create(xContext);
+ CPPUNIT_ASSERT(xGraphicExporter.is());
+
+ uno::Sequence<beans::PropertyValue> aFilterData{
+ comphelper::makePropertyValue("PixelWidth", sal_Int32(320)),
+ comphelper::makePropertyValue("PixelHeight", sal_Int32(240))
+ };
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+
+ uno::Sequence<beans::PropertyValue> aDescriptor{
+ comphelper::makePropertyValue("URL", aTempFile.GetURL()),
+ comphelper::makePropertyValue("FilterName", OUString("PNG")),
+ comphelper::makePropertyValue("FilterData", aFilterData)
+ };
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<lang::XComponent> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPage.is());
+ xGraphicExporter->setSourceDocument(xPage);
+ xGraphicExporter->filter(aDescriptor);
+
+ SvFileStream aFileStream(aTempFile.GetURL(), StreamMode::READ);
+ vcl::PngImageReader aPNGReader(aFileStream);
+ BitmapEx aBMPEx = aPNGReader.read();
+ Bitmap aBMP = aBMPEx.GetBitmap();
+ Bitmap::ScopedReadAccess pRead(aBMP);
+ for (tools::Long nX = 154; nX < (154 + 12); ++nX)
+ {
+ for (tools::Long nY = 16; nY < (16 + 96); ++nY)
+ {
+ const Color aColor = pRead->GetColor(nY, nX);
+ if ((aColor.GetRed() != 0xff) || (aColor.GetGreen() != 0xff)
+ || (aColor.GetBlue() != 0xff))
+ ++nonwhitecounts[i];
+ }
+ }
+ mxComponent->dispose();
+ }
+ // The numbers 1-9 should be above the Text Box in rectangle 154,16 - 170,112.
+ // If text alignment is wrong, the rectangle will be white.
+ CPPUNIT_ASSERT_MESSAGE("Tdf99729: vertical alignment of text is incorrect!",
+ nonwhitecounts[0] > 100); // it is 134 with cleartype disabled
+ // The numbers 1-9 should be below the Text Box -> rectangle 154,16 - 170,112 should be white.
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Tdf99729: legacy vertical alignment of text is incorrect!", 0,
+ nonwhitecounts[1]);
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sd/qa/unit/SVGExportTests.cxx b/sd/qa/unit/SVGExportTests.cxx
new file mode 100644
index 000000000..4878eca27
--- /dev/null
+++ b/sd/qa/unit/SVGExportTests.cxx
@@ -0,0 +1,352 @@
+/* -*- 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 <sal/config.h>
+
+#include <string_view>
+
+#include <test/bootstrapfixture.hxx>
+
+#include <sal/macros.h>
+#include <test/xmltesttools.hxx>
+#include <unotest/macros_test.hxx>
+#include <unotools/mediadescriptor.hxx>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <comphelper/processfactory.hxx>
+#include <unotools/syslocaleoptions.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/settings.hxx>
+
+#include <regex>
+
+#define SVG_SVG *[name()='svg']
+#define SVG_G *[name()='g']
+#define SVG_TEXT *[name()='text']
+#define SVG_TSPAN *[name()='tspan']
+#define SVG_DEFS *[name()='defs']
+#define SVG_IMAGE *[name()='image']
+#define SVG_USE *[name()='use']
+#define SVG_PATTERN *[name()='pattern']
+#define SVG_RECT *[name()='rect']
+
+using namespace css;
+
+namespace
+{
+bool isValidBitmapId(const OUString& sId)
+{
+ std::regex aRegEx("bitmap\\(\\d+\\)");
+ return std::regex_match(sId.toUtf8().getStr(), aRegEx);
+}
+
+BitmapChecksum getBitmapChecksumFromId(std::u16string_view sId)
+{
+ size_t nStart = sId.find(u"(") + 1;
+ size_t nCount = sId.find(u")") - nStart;
+ bool bIsValidRange = nStart > 0 && nStart != std::u16string_view::npos && nCount > 0;
+ CPPUNIT_ASSERT(bIsValidRange);
+ OUString sChecksum( sId.substr( nStart, nCount ) );
+ return sChecksum.toUInt64();
+}
+
+bool isValidBackgroundPatternId(const OUString& sId)
+{
+ std::regex aRegEx( R"(bg\-pattern\.id\d+\.\d+)" );
+ return std::regex_match(sId.toUtf8().getStr(), aRegEx);
+}
+
+bool isValidTiledBackgroundId(const OUString& sId)
+{
+ std::regex aRegEx( R"(bg\-id\d+\.\d+)" );
+ return std::regex_match(sId.toUtf8().getStr(), aRegEx);
+}
+
+}
+
+class SdSVGFilterTest : public test::BootstrapFixture, public unotest::MacrosTest, public XmlTestTools
+{
+ class Resetter
+ {
+ private:
+ std::function<void ()> m_Func;
+
+ public:
+ Resetter(std::function<void ()> const& rFunc)
+ : m_Func(rFunc)
+ {
+ }
+ ~Resetter()
+ {
+ try
+ {
+ m_Func();
+ }
+ catch (...) // has to be reliable
+ {
+ CPPUNIT_FAIL("resetter failed with exception");
+ }
+ }
+ };
+
+ uno::Reference<lang::XComponent> mxComponent;
+ utl::TempFile maTempFile;
+
+protected:
+ void load(std::u16string_view pDir, const char* pName)
+ {
+ return loadURL(m_directories.getURLFromSrc(pDir) + OUString::createFromAscii(pName), pName);
+ }
+
+ void loadURL(OUString const& rURL, const char* pName)
+ {
+ if (mxComponent.is())
+ mxComponent->dispose();
+ // Output name early, so in the case of a hang, the name of the hanging input file is visible.
+ if (pName)
+ std::cout << pName << ",";
+ mxComponent = loadFromDesktop(rURL);
+ }
+
+ void save()
+ {
+ uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OUString("impress_svg_Export");
+ xStorable->storeToURL(maTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+ }
+
+public:
+ SdSVGFilterTest()
+ {
+ maTempFile.EnableKillingFile();
+ }
+
+ virtual void setUp() override
+ {
+ test::BootstrapFixture::setUp();
+
+ mxDesktop.set(css::frame::Desktop::create(comphelper::getComponentContext(getMultiServiceFactory())));
+ }
+
+ virtual void tearDown() override
+ {
+ if (mxComponent.is())
+ mxComponent->dispose();
+
+ test::BootstrapFixture::tearDown();
+ }
+
+ void executeExport(const char* pName)
+ {
+ load( u"/sd/qa/unit/data/odp/", pName );
+ save();
+ }
+
+ void testSVGExportTextDecorations()
+ {
+ executeExport( "svg-export-text-decorations.odp" );
+
+ xmlDocUniquePtr svgDoc = parseXml(maTempFile);
+ CPPUNIT_ASSERT(svgDoc);
+
+ svgDoc->name = reinterpret_cast<char *>(xmlStrdup(reinterpret_cast<xmlChar const *>(OUStringToOString(maTempFile.GetURL(), RTL_TEXTENCODING_UTF8).getStr())));
+
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG ), 1);
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2] ), "class", "SlideGroup");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G ), "class", "Slide");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[1] ), "class", "TitleText");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[1]/SVG_G/SVG_TEXT ), "class", "SVGTextShape");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[1]/SVG_G/SVG_TEXT/SVG_TSPAN ), "class", "TextParagraph");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[1]/SVG_G/SVG_TEXT/SVG_TSPAN ), "text-decoration", "underline");
+
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[2]/SVG_G/SVG_TEXT ), "class", "SVGTextShape");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[2]/SVG_G/SVG_TEXT/SVG_TSPAN ), "class", "TextParagraph");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_G[2]/SVG_G/SVG_TEXT/SVG_TSPAN ), "text-decoration", "line-through");
+ }
+
+ void testSVGExportJavascriptURL()
+ {
+ executeExport("textbox-link-javascript.odp");
+
+ xmlDocUniquePtr svgDoc = parseXml(maTempFile);
+ CPPUNIT_ASSERT(svgDoc);
+
+ // There should be only one child (no link to javascript url)
+ assertXPathChildren(svgDoc,
+ SAL_STRINGIFY(/ SVG_SVG / SVG_G[2] / SVG_G / SVG_G / SVG_G / SVG_G
+ / SVG_G[3] / SVG_G),
+ 1);
+ }
+
+ void testSVGExportSlideCustomBackground()
+ {
+ executeExport("slide-custom-background.odp");
+
+ xmlDocUniquePtr svgDoc = parseXml(maTempFile);
+ CPPUNIT_ASSERT(svgDoc);
+
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G/SVG_G/SVG_G/SVG_G/SVG_DEFS ), "class", "SlideBackground");
+ }
+
+ void testSVGExportTextFieldsInMasterPage()
+ {
+ executeExport("text-fields.odp");
+
+ xmlDocUniquePtr svgDoc = parseXml(maTempFile);
+ CPPUNIT_ASSERT(svgDoc);
+
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2] ), "class", "Master_Slide");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2] ), "class", "BackgroundObjects");
+ // Current Date Field
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[4] ), "class", "TextShape");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[4]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "class", "PlaceholderText");
+ assertXPathContent(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[4]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "<date>");
+ // Current Time Field
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[5] ), "class", "TextShape");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[5]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "class", "PlaceholderText");
+ assertXPathContent(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[5]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "<time>");
+ // Slide Name Field
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[6] ), "class", "TextShape");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[6]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "class", "PlaceholderText");
+ assertXPathContent(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[6]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "<slide-name>");
+ // Slide Number Field
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[7] ), "class", "TextShape");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[7]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "class", "PlaceholderText");
+ assertXPathContent(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[7]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "<number>");
+ }
+
+ void testSVGExportSlideBitmapBackground()
+ {
+ executeExport("slide-bitmap-background.odp");
+
+ xmlDocUniquePtr svgDoc = parseXml(maTempFile);
+ CPPUNIT_ASSERT(svgDoc);
+
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9] ), "class", "BackgroundBitmaps");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_IMAGE ), 1);
+
+ OUString sImageId = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_IMAGE ), "id");
+ CPPUNIT_ASSERT_MESSAGE(OString("The exported bitmap has not a valid id: " + sImageId.toUtf8()).getStr(), isValidBitmapId(sImageId));
+
+ BitmapChecksum nChecksum = getBitmapChecksumFromId(sImageId);
+ CPPUNIT_ASSERT_MESSAGE(OString("The exported bitmap has not a valid checksum: " + sImageId.toUtf8()).getStr(), nChecksum != 0);
+
+ // single image case
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G/SVG_G/SVG_G/SVG_DEFS ), "class", "SlideBackground");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G/SVG_G/SVG_G/SVG_DEFS/SVG_G/SVG_G/SVG_USE ), 1);
+ OUString sRef = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G/SVG_G/SVG_G/SVG_DEFS/SVG_G/SVG_G/SVG_USE ), "href");
+ CPPUNIT_ASSERT_MESSAGE("The <use> element has not a valid href attribute: starting '#' not present.", sRef.startsWith("#"));
+ sRef = sRef.copy(1);
+ CPPUNIT_ASSERT_MESSAGE(OString("The <use> element does not point to a valid bitmap id: " + sRef.toUtf8()).getStr(), isValidBitmapId(sRef));
+
+ BitmapChecksum nUseChecksum = getBitmapChecksumFromId(sRef);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("The bitmap checksum used in <use> does not match the expected one: ", nChecksum, nUseChecksum);
+ }
+
+ void testSVGExportSlideTileBitmapBackground()
+ {
+ executeExport("slide-tile-background.odp");
+
+ xmlDocUniquePtr svgDoc = parseXml(maTempFile);
+ CPPUNIT_ASSERT(svgDoc);
+
+ // check the bitmap
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9] ), "class", "BackgroundBitmaps");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_IMAGE ), 1);
+
+ // check the pattern and background rectangle
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10] ), "class", "BackgroundPatterns");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_PATTERN ), 1);
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_PATTERN/SVG_USE ), 1);
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_G/SVG_RECT ), 1);
+
+
+ // check that <pattern><use> is pointing to the correct <image>
+ OUString sImageId = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_IMAGE ), "id");
+ CPPUNIT_ASSERT_MESSAGE(OString("The exported bitmap has not a valid id: " + sImageId.toUtf8()).getStr(), isValidBitmapId(sImageId));
+
+ BitmapChecksum nChecksum = getBitmapChecksumFromId(sImageId);
+ CPPUNIT_ASSERT_MESSAGE(OString("The exported bitmap has not a valid checksum: " + sImageId.toUtf8()).getStr(), nChecksum != 0);
+
+ OUString sRef = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_PATTERN/SVG_USE ), "href");
+ CPPUNIT_ASSERT_MESSAGE("The <pattern><use> element has not a valid href attribute: starting '#' not present.", sRef.startsWith("#"));
+ sRef = sRef.copy(1);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("The href attribute for <pattern><use> does not match the <image> id attribute: ", sImageId, sRef);
+
+ OUString sPatternId = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_PATTERN ), "id");
+ CPPUNIT_ASSERT_MESSAGE(OString("The exported pattern has not a valid id: " + sPatternId.toUtf8()).getStr(), isValidBackgroundPatternId(sPatternId));
+
+ OUString sFillUrl = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_G/SVG_RECT ), "fill");
+ bool bIsUrlFormat = sFillUrl.startsWith("url(#") && sFillUrl.endsWith(")");
+ CPPUNIT_ASSERT_MESSAGE("The fill attribute for the <rectangle> element has not a url format .", bIsUrlFormat);
+ // remove "url(#" and ")"
+ sFillUrl = sFillUrl.copy(5, sFillUrl.getLength() - 6);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("The fill url for <rectangle> does not match the <pattern> id attribute: ", sPatternId, sFillUrl);
+
+ OUString sBackgroundId = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[10]/SVG_G ), "id");
+ CPPUNIT_ASSERT_MESSAGE(OString("The exported tiled background has not a valid id: " + sBackgroundId.toUtf8()).getStr(), isValidTiledBackgroundId(sBackgroundId));
+
+ // check <use> element that point to the tiled background
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G/SVG_G/SVG_G/SVG_DEFS ), "class", "SlideBackground");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G/SVG_G/SVG_G/SVG_DEFS/SVG_G/SVG_USE ), 1);
+
+ sRef = getXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_G[2]/SVG_G[1]/SVG_G/SVG_G/SVG_G/SVG_DEFS/SVG_G/SVG_USE ), "href");
+ CPPUNIT_ASSERT_MESSAGE("The <use> element has not a valid href attribute: starting '#' not present.", sRef.startsWith("#"));
+ sRef = sRef.copy(1);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("The href attribute for <use> does not match the tiled background id attribute: ", sBackgroundId, sRef);
+ }
+
+ void testSVGPlaceholderLocale()
+ {
+ static const OUStringLiteral aLangISO(u"it-IT");
+ SvtSysLocaleOptions aSysLocaleOptions;
+ aSysLocaleOptions.SetLocaleConfigString(aLangISO);
+ aSysLocaleOptions.SetUILocaleConfigString(aLangISO);
+
+ auto aSavedSettings = Application::GetSettings();
+ Resetter aResetter([&]() { Application::SetSettings(aSavedSettings); });
+ AllSettings aSettings(aSavedSettings);
+ aSettings.SetLanguageTag(aLangISO, true);
+ Application::SetSettings(aSettings);
+
+ executeExport("text-fields.odp");
+
+ xmlDocUniquePtr svgDoc = parseXml(maTempFile);
+ CPPUNIT_ASSERT(svgDoc);
+
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2] ), "class", "Master_Slide");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2] ), "class", "BackgroundObjects");
+
+ // Slide Name Field
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[6] ), "class", "TextShape");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[6]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "class", "PlaceholderText");
+ assertXPathContent(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[6]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "<slide-name>");
+ // Slide Number Field
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[7] ), "class", "TextShape");
+ assertXPath(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[7]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "class", "PlaceholderText");
+ assertXPathContent(svgDoc, SAL_STRINGIFY( /SVG_SVG/SVG_DEFS[9]/SVG_G[2]/SVG_G[2]/SVG_G[7]/SVG_G/SVG_TEXT/SVG_TSPAN/SVG_TSPAN/SVG_TSPAN ), "<number>");
+ }
+
+ CPPUNIT_TEST_SUITE(SdSVGFilterTest);
+ CPPUNIT_TEST(testSVGExportTextDecorations);
+ CPPUNIT_TEST(testSVGExportJavascriptURL);
+ CPPUNIT_TEST(testSVGExportSlideCustomBackground);
+ CPPUNIT_TEST(testSVGExportTextFieldsInMasterPage);
+ CPPUNIT_TEST(testSVGExportSlideBitmapBackground);
+ CPPUNIT_TEST(testSVGExportSlideTileBitmapBackground);
+ CPPUNIT_TEST(testSVGPlaceholderLocale);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdSVGFilterTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/SdrPdfImportTest.cxx b/sd/qa/unit/SdrPdfImportTest.cxx
new file mode 100644
index 000000000..ba3c42e92
--- /dev/null
+++ b/sd/qa/unit/SdrPdfImportTest.cxx
@@ -0,0 +1,311 @@
+/* -*- 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 <test/bootstrapfixture.hxx>
+#include <unotest/macros_test.hxx>
+
+#include <comphelper/scopeguard.hxx>
+#include <comphelper/propertysequence.hxx>
+
+#include <unotools/tempfile.hxx>
+#include <unotools/mediadescriptor.hxx>
+#include <tools/stream.hxx>
+#include <svx/svdograf.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/editobj.hxx>
+#include <vcl/filter/PDFiumLibrary.hxx>
+#include <vcl/pdf/PDFAnnotationSubType.hxx>
+
+#include <DrawDocShell.hxx>
+#include <ViewShell.hxx>
+#include <sdpage.hxx>
+#include <unomodel.hxx>
+
+#include <com/sun/star/frame/Desktop.hpp>
+
+using namespace css;
+
+namespace
+{
+class EnvVarGuard
+{
+public:
+ EnvVarGuard(const char* var, const char* val)
+ {
+ if (getenv(var) == nullptr)
+ {
+ sVar = var;
+ SetEnv(sVar, val);
+ }
+ }
+ ~EnvVarGuard()
+ {
+ if (sVar)
+ SetEnv(sVar, nullptr);
+ }
+
+private:
+ static void SetEnv(const char* var, const char* val)
+ {
+#ifdef _WIN32
+ if (!val)
+ val = ""; // remove
+ _putenv_s(var, val);
+#else
+ if (val)
+ setenv(var, val, false);
+ else
+ unsetenv(var);
+#endif
+ }
+
+ const char* sVar = nullptr;
+};
+}
+
+class SdrPdfImportTest : public test::BootstrapFixture, public unotest::MacrosTest
+{
+protected:
+ uno::Reference<lang::XComponent> mxComponent;
+
+public:
+ virtual void setUp() override;
+ virtual void tearDown() override;
+};
+
+void SdrPdfImportTest::setUp()
+{
+ test::BootstrapFixture::setUp();
+
+ mxDesktop.set(frame::Desktop::create(mxComponentContext));
+}
+
+void SdrPdfImportTest::tearDown()
+{
+ if (mxComponent.is())
+ mxComponent->dispose();
+
+ test::BootstrapFixture::tearDown();
+}
+
+// Load the PDF in Draw, which will load the PDF as an Graphic, then
+// mark the graphic object and trigger "break" function. This should
+// convert the PDF content into objects/shapes.
+CPPUNIT_TEST_FIXTURE(SdrPdfImportTest, testImportSimpleText)
+{
+ auto pPdfium = vcl::pdf::PDFiumLibrary::get();
+ if (!pPdfium)
+ {
+ return;
+ }
+
+ // We need to enable PDFium import (and make sure to disable after the test)
+ EnvVarGuard UsePDFiumGuard("LO_IMPORT_USE_PDFIUM", "1");
+
+ mxComponent = loadFromDesktop(m_directories.getURLFromSrc(u"sd/qa/unit/data/SimplePDF.pdf"));
+ auto pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell);
+
+ // Get the first page - there should be only one.
+ SdPage* pPage = pViewShell->GetActualPage();
+ CPPUNIT_ASSERT(pPage);
+
+ // Check there is one object on the page only
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->GetObjCount());
+
+ // Get the first object - there should be only one.
+ SdrObject* pObject = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject);
+
+ // Check the object is a graphic object
+ SdrGrafObj* pGraphicObject = dynamic_cast<SdrGrafObj*>(pObject);
+ CPPUNIT_ASSERT(pGraphicObject);
+ // Check the graphic is a vector graphic and that it is PDF
+ Graphic aGraphic = pGraphicObject->GetGraphic();
+ auto const& pVectorGraphicData = aGraphic.getVectorGraphicData();
+ CPPUNIT_ASSERT(pVectorGraphicData);
+ CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
+
+ // Mark the object
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pObject, pView->GetSdrPageView());
+
+ // Execute the break operation - to turn the PDF into shapes/objects
+ pViewShell->GetDrawView()->DoImportMarkedMtf();
+
+ // Check there is one object on the page only
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->GetObjCount());
+
+ // Get the object
+ SdrObject* pImportedObject = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pImportedObject);
+
+ // Check the object position
+ CPPUNIT_ASSERT_EQUAL(tools::Rectangle(Point(2011, 2102), Size(2106 + 1, 298 + 1)),
+ pImportedObject->GetLogicRect());
+
+ // Object should be a text object containing one paragraph with
+ // content "This is PDF!"
+
+ SdrTextObj* pTextObject = dynamic_cast<SdrTextObj*>(pImportedObject);
+ CPPUNIT_ASSERT(pTextObject);
+ OutlinerParaObject* pOutlinerParagraphObject = pTextObject->GetOutlinerParaObject();
+ const EditTextObject& aEdit = pOutlinerParagraphObject->GetTextObject();
+ OUString sText = aEdit.GetText(0);
+ CPPUNIT_ASSERT_EQUAL(OUString("This is PDF!"), sText);
+}
+
+CPPUNIT_TEST_FIXTURE(SdrPdfImportTest, testAnnotationsImportExport)
+{
+ auto pPdfium = vcl::pdf::PDFiumLibrary::get();
+ if (!pPdfium)
+ {
+ return;
+ }
+
+ // We need to enable PDFium import (and make sure to disable after the test)
+ EnvVarGuard UsePDFiumGuard("LO_IMPORT_USE_PDFIUM", "1");
+
+ EnvVarGuard DisablePDFCompressionGuard("VCL_DEBUG_DISABLE_PDFCOMPRESSION", "1");
+
+ auto pPdfiumLibrary = vcl::pdf::PDFiumLibrary::get();
+
+ mxComponent
+ = loadFromDesktop(m_directories.getURLFromSrc(u"sd/qa/unit/data/PdfWithAnnotation.pdf"));
+ auto pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell);
+
+ BinaryDataContainer aContainer;
+
+ {
+ // Get the first page - there should be only one.
+ SdPage* pPage = pViewShell->GetActualPage();
+ CPPUNIT_ASSERT(pPage);
+
+ // Check the number of annotations
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->getAnnotations().size());
+
+ // Get the first object - there should be only one.
+ SdrObject* pObject = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject);
+
+ // Check the object is a graphic object
+ SdrGrafObj* pGraphicObject = dynamic_cast<SdrGrafObj*>(pObject);
+ CPPUNIT_ASSERT(pGraphicObject);
+
+ // Check the graphic is a vector graphic and that it is PDF
+ Graphic aGraphic = pGraphicObject->GetGraphic();
+ auto const& pVectorGraphicData = aGraphic.getVectorGraphicData();
+ CPPUNIT_ASSERT(pVectorGraphicData);
+ CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
+
+ // Write the PDF
+ aContainer = pVectorGraphicData->getBinaryDataContainer();
+ }
+
+ { // check graphic PDF has annotations
+
+ CPPUNIT_ASSERT_EQUAL(false, aContainer.isEmpty());
+
+ auto pPDFDocument
+ = pPdfiumLibrary->openDocument(aContainer.getData(), aContainer.getSize(), OString());
+ auto pPDFPage = pPDFDocument->openPage(0);
+
+ CPPUNIT_ASSERT_EQUAL(2, pPDFPage->getAnnotationCount());
+
+ auto pPDFAnnotation1 = pPDFPage->getAnnotation(0);
+ CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Text,
+ pPDFAnnotation1->getSubType()); // Text annotation
+
+ auto pPDFAnnotation2 = pPDFPage->getAnnotation(1);
+ CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup,
+ pPDFAnnotation2->getSubType()); // Pop-up annotation
+ }
+
+ { // save as PDF and check annotations
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+
+ uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OUString("writer_pdf_Export");
+ uno::Sequence<beans::PropertyValue> aFilterData(
+ comphelper::InitPropertySequence({ { "ExportBookmarks", uno::Any(true) } }));
+ aMediaDescriptor["FilterData"] <<= aFilterData;
+ xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+ mxComponent->dispose();
+
+ SvFileStream aFile(aTempFile.GetURL(), StreamMode::READ);
+ SvMemoryStream aMemory;
+ aMemory.WriteStream(aFile);
+
+ // Check PDF for annotations
+ auto pPDFDocument
+ = pPdfiumLibrary->openDocument(aMemory.GetData(), aMemory.GetSize(), OString());
+ CPPUNIT_ASSERT(pPDFDocument);
+ CPPUNIT_ASSERT_EQUAL(1, pPDFDocument->getPageCount());
+
+ auto pPDFPage = pPDFDocument->openPage(0);
+ CPPUNIT_ASSERT(pPDFPage);
+
+ CPPUNIT_ASSERT_EQUAL(2, pPDFPage->getAnnotationCount());
+
+ auto pPDFAnnotation1 = pPDFPage->getAnnotation(0);
+ CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Text,
+ pPDFAnnotation1->getSubType()); // Text annotation
+
+ auto pPDFAnnotation2 = pPDFPage->getAnnotation(1);
+ CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup,
+ pPDFAnnotation2->getSubType()); // Pop-up annotation
+
+ // Load document again
+ mxComponent = loadFromDesktop(aTempFile.GetURL());
+ auto pNewImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pNewViewShell = pNewImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pNewViewShell);
+
+ SdPage* pPage = pNewViewShell->GetActualPage();
+ CPPUNIT_ASSERT(pPage);
+
+ // We expect only 1 annotation in the document because the PDF
+ // annotations are dependent on each-other:
+ // parent annotation "Text" and the child annotation "Pop-up"
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->getAnnotations().size());
+
+ // check annotation
+ auto xAnnotation = pPage->getAnnotations().at(0);
+
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(90.33, xAnnotation->getPosition().X, 1E-3);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(12.07, xAnnotation->getPosition().Y, 1E-3);
+
+ CPPUNIT_ASSERT_EQUAL(OUString("TheAuthor"), xAnnotation->getAuthor());
+ CPPUNIT_ASSERT_EQUAL(OUString(), xAnnotation->getInitials());
+
+ auto xText = xAnnotation->getTextRange();
+
+ CPPUNIT_ASSERT_EQUAL(OUString("This is the annotation text!"), xText->getString());
+
+ auto aDateTime = xAnnotation->getDateTime();
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2020), aDateTime.Year);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(6), aDateTime.Month);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(18), aDateTime.Day);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(12), aDateTime.Hours);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(11), aDateTime.Minutes);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(53), aDateTime.Seconds);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), aDateTime.NanoSeconds);
+ CPPUNIT_ASSERT_EQUAL(false, bool(aDateTime.IsUTC));
+ }
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/ShapeImportExportTest.cxx b/sd/qa/unit/ShapeImportExportTest.cxx
new file mode 100644
index 000000000..0f1609df2
--- /dev/null
+++ b/sd/qa/unit/ShapeImportExportTest.cxx
@@ -0,0 +1,401 @@
+/* -*- 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 "sdmodeltestbase.hxx"
+
+#include <com/sun/star/uno/Reference.hxx>
+
+#include <com/sun/star/drawing/XShapes.hpp>
+
+#include <svx/svdpage.hxx>
+#include <svx/svdotext.hxx>
+
+using namespace css;
+
+/// Shape / SdrObject import and export tests
+class ShapeImportExportTest : public SdModelTestBaseXML
+{
+public:
+ void testTextDistancesOOXML();
+ void testTextDistancesOOXML_LargerThanTextAreaSpecialCase();
+ void testTextDistancesOOXML_Export();
+ void testTextDistancesODP_OOXML_Export();
+
+ CPPUNIT_TEST_SUITE(ShapeImportExportTest);
+ CPPUNIT_TEST(testTextDistancesOOXML);
+ CPPUNIT_TEST(testTextDistancesOOXML_LargerThanTextAreaSpecialCase);
+ CPPUNIT_TEST(testTextDistancesOOXML_Export);
+ CPPUNIT_TEST(testTextDistancesODP_OOXML_Export);
+ CPPUNIT_TEST_SUITE_END();
+
+ virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override
+ {
+ XmlTestTools::registerODFNamespaces(pXmlXPathCtx);
+ XmlTestTools::registerOOXMLNamespaces(pXmlXPathCtx);
+ }
+};
+
+namespace
+{
+SdrObject* searchObject(SdrPage const* pPage, std::u16string_view rName)
+{
+ for (size_t i = 0; i < pPage->GetObjCount(); ++i)
+ {
+ SdrObject* pCurrent = pPage->GetObj(i);
+ if (pCurrent->GetName() == rName)
+ return pCurrent;
+ }
+ return nullptr;
+}
+}
+
+/* Test text distances (insets) */
+void ShapeImportExportTest::testTextDistancesOOXML()
+{
+ ::sd::DrawDocShellRef xDocShell
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/TextDistancesInsets1.pptx"), PPTX);
+
+ SdrPage const* pPage = GetPage(1, xDocShell);
+ // Bottom Margin = 4cm
+ {
+ std::array<std::u16string_view, 3> aObjectDesc = {
+ u"T, BM - 4cm",
+ u"M, BM - 4cm",
+ u"B, BM - 4cm",
+ };
+
+ for (auto const& rString : aObjectDesc)
+ {
+ auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, rString));
+ CPPUNIT_ASSERT(pTextObj);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(-1292), pTextObj->GetTextUpperDistance());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(2708), pTextObj->GetTextLowerDistance());
+ }
+ }
+
+ // Bottom Margin = 1cm
+ {
+ std::array<std::u16string_view, 3> aObjectDesc = {
+ u"T, BM - 1cm",
+ u"M, BM - 1cm",
+ u"B, BM - 1cm",
+ };
+
+ for (auto const& rString : aObjectDesc)
+ {
+ auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, rString));
+ CPPUNIT_ASSERT(pTextObj);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(0), pTextObj->GetTextUpperDistance());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(1000), pTextObj->GetTextLowerDistance());
+ }
+ }
+
+ // Top + Bottom Margin = 1cm
+ {
+ std::array<std::u16string_view, 3> aObjectDesc = {
+ u"T, TM+BM - 1cm",
+ u"M, TM+BM - 1cm",
+ u"B, TM+BM - 1cm",
+ };
+
+ for (auto const& rString : aObjectDesc)
+ {
+ auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, rString));
+ CPPUNIT_ASSERT(pTextObj);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(708), pTextObj->GetTextUpperDistance());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(708), pTextObj->GetTextLowerDistance());
+ }
+ }
+
+ // No margin - Top + Bottom = 0cm
+ {
+ std::array<std::u16string_view, 3> aObjectDesc = {
+ u"T",
+ u"M",
+ u"B",
+ };
+
+ for (auto const& rString : aObjectDesc)
+ {
+ auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, rString));
+ CPPUNIT_ASSERT(pTextObj);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(0), pTextObj->GetTextUpperDistance());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(0), pTextObj->GetTextLowerDistance());
+ }
+ }
+
+ // Top Margin = 1cm
+ {
+ std::array<std::u16string_view, 3> aObjectDesc = {
+ u"T, TM - 1cm",
+ u"M, TM - 1cm",
+ u"B, TM - 1cm",
+ };
+
+ for (auto const& rString : aObjectDesc)
+ {
+ auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, rString));
+ CPPUNIT_ASSERT(pTextObj);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(1000), pTextObj->GetTextUpperDistance());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(0), pTextObj->GetTextLowerDistance());
+ }
+ }
+
+ // Top Margin = 4cm
+ {
+ std::array<std::u16string_view, 3> aObjectDesc = {
+ u"T, TM - 4cm",
+ u"M, TM - 4cm",
+ u"B, TM - 4cm",
+ };
+
+ for (auto const& rString : aObjectDesc)
+ {
+ auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, rString));
+ CPPUNIT_ASSERT(pTextObj);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(2708), pTextObj->GetTextUpperDistance());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(-1292), pTextObj->GetTextLowerDistance());
+ }
+ }
+
+ xDocShell->DoClose();
+}
+
+/* Test text distances (insets) variants where top+bottom margin > text area*/
+void ShapeImportExportTest::testTextDistancesOOXML_LargerThanTextAreaSpecialCase()
+{
+ ::sd::DrawDocShellRef xDocShell
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/TextDistancesInsets2.pptx"), PPTX);
+
+ SdrPage const* pPage = GetPage(1, xDocShell);
+
+ // Top/Bottom 0cm/3cm, 1cm/4cm, 4cm/7cm - all should be converted to the same value in LO
+ {
+ std::array<std::u16string_view, 9> aObjectNames = {
+ u"T_0_3", u"M_0_3", u"B_0_3", u"T_1_4", u"M_1_4",
+ u"B_1_4", u"T_4_7", u"M_4_7", u"B_4_7",
+ };
+
+ for (auto const& rName : aObjectNames)
+ {
+ auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, rName));
+ CPPUNIT_ASSERT(pTextObj);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(-792), pTextObj->GetTextUpperDistance());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(2208), pTextObj->GetTextLowerDistance());
+ }
+ }
+
+ // Top/Bottom 0cm/2cm, 1cm/3cm, 4cm/6cm - all should be converted to the same value in LO
+ {
+ std::array<std::u16string_view, 9> aObjectNames = {
+ u"T_0_2", u"M_0_2", u"B_0_2", u"T_1_3", u"M_1_3",
+ u"B_1_3", u"T_4_6", u"M_4_6", u"B_4_6",
+ };
+
+ for (auto const& rName : aObjectNames)
+ {
+ auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, rName));
+ CPPUNIT_ASSERT(pTextObj);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(-292), pTextObj->GetTextUpperDistance());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(1708), pTextObj->GetTextLowerDistance());
+ }
+ }
+
+ // Top/Bottom 2cm/2cm, 3cm/3cm, 4cm/4cm - all should be converted to the same value in LO
+ {
+ std::array<std::u16string_view, 9> aObjectNames = {
+ u"T_2_2", u"M_2_2", u"B_2_2", u"T_3_3", u"M_3_3",
+ u"B_3_3", u"T_4_4", u"M_4_4", u"B_4_4",
+ };
+
+ for (auto const& rName : aObjectNames)
+ {
+ auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, rName));
+ CPPUNIT_ASSERT(pTextObj);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(708), pTextObj->GetTextUpperDistance());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(708), pTextObj->GetTextLowerDistance());
+ }
+ }
+
+ // Top/Bottom 2cm/0cm, 3cm/1cm, 6cm/4cm - all should be converted to the same value in LO
+ {
+ std::array<std::u16string_view, 9> aObjectNames = {
+ u"T_2_0", u"M_2_0", u"B_2_0", u"T_3_1", u"M_3_1",
+ u"B_3_1", u"T_6_4", u"M_6_4", u"B_6_4",
+ };
+
+ for (auto const& rName : aObjectNames)
+ {
+ auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, rName));
+ CPPUNIT_ASSERT(pTextObj);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(1708), pTextObj->GetTextUpperDistance());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(-292), pTextObj->GetTextLowerDistance());
+ }
+ }
+
+ // Top/Bottom 3cm/0cm, 4cm/1cm, 7cm/4cm - all should be converted to the same value in LO
+ {
+ std::array<std::u16string_view, 9> aObjectNames = {
+ u"T_3_0", u"M_3_0", u"B_3_0", u"T_4_1", u"M_4_1",
+ u"B_4_1", u"T_7_4", u"M_7_4", u"B_7_4",
+ };
+
+ for (auto const& rName : aObjectNames)
+ {
+ auto* pTextObj = dynamic_cast<SdrTextObj*>(searchObject(pPage, rName));
+ CPPUNIT_ASSERT(pTextObj);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(2208), pTextObj->GetTextUpperDistance());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(-792), pTextObj->GetTextLowerDistance());
+ }
+ }
+
+ xDocShell->DoClose();
+}
+
+/* Test export of text distances (insets) - conversion back of special case */
+void ShapeImportExportTest::testTextDistancesOOXML_Export()
+{
+ ::sd::DrawDocShellRef xDocShell
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/TextDistancesInsets3.pptx"), PPTX);
+
+ utl::TempFile aTempFile;
+ xDocShell = saveAndReload(xDocShell.get(), PPTX, &aTempFile);
+ xDocShell->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "ppt/slides/slide1.xml");
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ //Check shape Top/Bottom - 0cm, 4cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvPr", "name", "Text_TB_0_4");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr",
+ { { "tIns", "-360000" }, { "bIns", "1079640" } });
+
+ //Check shape Top/Bottom - 4cm, 0cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvPr", "name", "Text_TB_4_0");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr",
+ { { "tIns", "1079640" }, { "bIns", "-360000" } });
+
+ //Check shape Top/Bottom - 0cm, 3cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:nvSpPr/p:cNvPr", "name", "Text_TB_0_3");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:txBody/a:bodyPr",
+ { { "tIns", "-180000" }, { "bIns", "899640" } });
+
+ //Check shape Top/Bottom - 2cm, 1cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:nvSpPr/p:cNvPr", "name", "Text_TB_2_1");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:txBody/a:bodyPr",
+ { { "tIns", "540000" }, { "bIns", "180000" } });
+
+ //Check shape Top/Bottom - 0cm, 2.5cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:nvSpPr/p:cNvPr", "name",
+ "Text_TB_0_2.5");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:txBody/a:bodyPr",
+ { { "tIns", "-90000" }, { "bIns", "809640" } });
+
+ //Check shape Top/Bottom - 0cm, 2cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[6]/p:nvSpPr/p:cNvPr", "name", "Text_TB_0_2");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[6]/p:txBody/a:bodyPr",
+ { { "tIns", "0" }, { "bIns", "720000" } });
+
+ //Check shape Top/Bottom - 0cm, 1.5cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[7]/p:nvSpPr/p:cNvPr", "name",
+ "Text_TB_0_1.5");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[7]/p:txBody/a:bodyPr",
+ { { "tIns", "0" }, { "bIns", "540000" } });
+
+ //Check shape Top/Bottom - 3cm, 0cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[8]/p:nvSpPr/p:cNvPr", "name", "Text_TB_3_0");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[8]/p:txBody/a:bodyPr",
+ { { "tIns", "899640" }, { "bIns", "-180000" } });
+
+ //Check shape Top/Bottom - 2.5cm, 0cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[9]/p:nvSpPr/p:cNvPr", "name",
+ "Text_TB_2.5_0");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[9]/p:txBody/a:bodyPr",
+ { { "tIns", "809640" }, { "bIns", "-90000" } });
+
+ //Check shape Top/Bottom - 2cm, 0cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[10]/p:nvSpPr/p:cNvPr", "name", "Text_TB_2_0");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[10]/p:txBody/a:bodyPr",
+ { { "tIns", "720000" }, { "bIns", "0" } });
+
+ //Check shape Top/Bottom - 1.5cm, 0cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[11]/p:nvSpPr/p:cNvPr", "name",
+ "Text_TB_1.5_0");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[11]/p:txBody/a:bodyPr",
+ { { "tIns", "540000" }, { "bIns", "0" } });
+
+ //Check shape Top/Bottom - 1cm, 2cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[12]/p:nvSpPr/p:cNvPr", "name", "Text_TB_1_2");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[12]/p:txBody/a:bodyPr",
+ { { "tIns", "180000" }, { "bIns", "540000" } });
+
+ //Check shape Top/Bottom - 2cm, 1.5cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[13]/p:nvSpPr/p:cNvPr", "name",
+ "Text_TB_2_1.5");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[13]/p:txBody/a:bodyPr",
+ { { "tIns", "450000" }, { "bIns", "270000" } });
+
+ //Check shape Top/Bottom - 1.5cm, 2cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[14]/p:nvSpPr/p:cNvPr", "name",
+ "Text_TB_1.5_2");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[14]/p:txBody/a:bodyPr",
+ { { "tIns", "270000" }, { "bIns", "450000" } });
+
+ //Check shape Top/Bottom - 2cm, 1.75cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[15]/p:nvSpPr/p:cNvPr", "name",
+ "Text_TB_2_1.75");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[15]/p:txBody/a:bodyPr",
+ { { "tIns", "405000" }, { "bIns", "315000" } });
+
+ //Check shape Top/Bottom - 1.75cm, 2cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[16]/p:nvSpPr/p:cNvPr", "name",
+ "Text_TB_1.75_2");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[16]/p:txBody/a:bodyPr",
+ { { "tIns", "315000" }, { "bIns", "405000" } });
+
+ //Check shape Top/Bottom - 2cm, 2cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[17]/p:nvSpPr/p:cNvPr", "name", "Text_TB_2_2");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[17]/p:txBody/a:bodyPr",
+ { { "tIns", "360000" }, { "bIns", "360000" } });
+
+ //Check shape Top/Bottom - 1cm, 1cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[18]/p:nvSpPr/p:cNvPr", "name", "Text_TB_1_1");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[18]/p:txBody/a:bodyPr",
+ { { "tIns", "360000" }, { "bIns", "360000" } });
+
+ //Check shape Top/Bottom - 0.5cm, 0.5cm
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[19]/p:nvSpPr/p:cNvPr", "name",
+ "Text_TB_0.5_0.5");
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[19]/p:txBody/a:bodyPr",
+ { { "tIns", "180000" }, { "bIns", "180000" } });
+}
+
+void ShapeImportExportTest::testTextDistancesODP_OOXML_Export()
+{
+ ::sd::DrawDocShellRef xDocShell
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf150966_hugeInset.odp"), ODP);
+
+ utl::TempFile aTempFile;
+ xDocShell = saveAndReload(xDocShell.get(), PPTX, &aTempFile);
+ xDocShell->DoClose();
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "ppt/slides/slide1.xml");
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ // The text ends 5cm below the top edge of the shape.
+ // Without the fix we exported tIns="3600000" and bIns="5400000".
+ // The text had ended about 3.3cm below the top edge in PowerPoint.
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr",
+ { { "tIns", "720000" }, { "bIns", "2520000" } });
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(ShapeImportExportTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/activex-controls-tests.cxx b/sd/qa/unit/activex-controls-tests.cxx
new file mode 100644
index 000000000..4adbea72b
--- /dev/null
+++ b/sd/qa/unit/activex-controls-tests.cxx
@@ -0,0 +1,1195 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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 "sdmodeltestbase.hxx"
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/XControlShape.hpp>
+#include <com/sun/star/awt/TextAlign.hpp>
+#include <com/sun/star/style/VerticalAlignment.hpp>
+#include <com/sun/star/awt/ScrollBarOrientation.hpp>
+#include <com/sun/star/awt/VisualEffect.hpp>
+#include <com/sun/star/awt/ImagePosition.hpp>
+#include <com/sun/star/awt/ImageScaleMode.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
+#include <com/sun/star/awt/FontSlant.hpp>
+#include <com/sun/star/awt/FontUnderline.hpp>
+#include <com/sun/star/awt/FontStrikeout.hpp>
+#include <com/sun/star/graphic/XGraphic.hpp>
+
+
+class SdActiveXControlsTest: public SdModelTestBase
+{
+public:
+ void testBackgroundColor();
+ void testLabelProperties();
+ void testTextBoxProperties();
+ void testSpinButtonProperties();
+ void testCommandButtonProperties();
+ void testScrollBarProperties();
+ void testCheckBoxProperties();
+ void testOptionButtonProperties();
+ void testComboBoxProperties();
+ void testListBoxProperties();
+ void testToggleButtonProperties();
+ void testPictureProperties();
+ void testFontProperties();
+
+ CPPUNIT_TEST_SUITE(SdActiveXControlsTest);
+
+ CPPUNIT_TEST(testBackgroundColor);
+ CPPUNIT_TEST(testLabelProperties);
+ CPPUNIT_TEST(testTextBoxProperties);
+ CPPUNIT_TEST(testSpinButtonProperties);
+ CPPUNIT_TEST(testCommandButtonProperties);
+ CPPUNIT_TEST(testScrollBarProperties);
+ CPPUNIT_TEST(testCheckBoxProperties);
+ CPPUNIT_TEST(testOptionButtonProperties);
+ CPPUNIT_TEST(testComboBoxProperties);
+ CPPUNIT_TEST(testListBoxProperties);
+ CPPUNIT_TEST(testToggleButtonProperties);
+ CPPUNIT_TEST(testPictureProperties);
+ CPPUNIT_TEST(testFontProperties);
+
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void SdActiveXControlsTest::testBackgroundColor()
+{
+ // Check whether all system colors are imported correctly
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/control_background_color.pptx"), PPTX);
+
+ const std::vector<Color> vBackgroundColors =
+ {
+ 0xD4D0C8, // Scroll Bars
+ 0x004E98, // Desktop
+ 0x0054E3, // Active Title Bar
+ 0x7A96DF, // Inactive Title Bar
+ 0xFFFFFF, // Menu Bar
+ 0xFFFFFF, // Window Background
+ 0x000000, // Window Frame
+ 0x000000, // Menu Text
+ 0x000000, // Window Text
+ 0xFFFFFF, // Active Title Bar Text
+ 0xD4D0C8, // Active Border
+ 0xD4D0C8, // Inactive Border
+ 0x808080, // Application Workspace
+ 0x316AC5, // Highlight
+ 0xFFFFFF, // Highlight Text
+ 0xECE9D8, // Button Face
+ 0xACA899, // Button Shadow
+ 0xACA899, // Disabled Text
+ 0x000000, // Button Text
+ 0xD8E4F8, // Inactive Title Bar Text
+ 0xFFFFFF, // Button Highlight
+ 0x716F64, // Button Dark Shadow
+ 0xF1EFE2, // Button Light Shadow
+ 0x000000, // Tooltip Text
+ 0xFFFFE1, // Tooltip
+ 0xFF0000, // Custom red color
+ };
+
+ for (size_t i = 0; i < vBackgroundColors.size(); ++i)
+ {
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(i, 0, xDocShRef), uno::UNO_QUERY_THROW);
+
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+ Color nColor;
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ OString sMessage = "The wrong control's index is: " + OString::number(i);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), vBackgroundColors[i], nColor);
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdActiveXControlsTest::testLabelProperties()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/activex_label.pptx"), PPTX);
+
+ // First control has default properties
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+
+ OUString sLabel;
+ xPropertySet->getPropertyValue("Label") >>= sLabel;
+ CPPUNIT_ASSERT_EQUAL(OUString("Label1"), sLabel);
+
+ bool bEnabled;
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(true, bEnabled);
+
+ bool bMultiLine;
+ xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine;
+ CPPUNIT_ASSERT_EQUAL(true, bMultiLine);
+
+ Color nColor;
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor);
+
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor);
+
+ sal_Int16 nBorderStyle;
+ xPropertySet->getPropertyValue("Border") >>= nBorderStyle;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nBorderStyle);
+
+ sal_Int16 nAlign;
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign);
+
+ style::VerticalAlignment eAlign;
+ xPropertySet->getPropertyValue("VerticalAlign") >>= eAlign;
+ CPPUNIT_ASSERT_EQUAL(style::VerticalAlignment_TOP, eAlign);
+
+ // Second control has custom properties
+ xControlShape.set(getShapeFromPage(1, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("Label") >>= sLabel;
+ CPPUNIT_ASSERT_EQUAL(OUString("Custom Label"), sLabel);
+
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(false, bEnabled);
+
+ xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine;
+ CPPUNIT_ASSERT_EQUAL(false, bMultiLine);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xE0E0E0), nColor);
+
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x0000FF), nColor);
+
+ xPropertySet->getPropertyValue("Border") >>= nBorderStyle;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nBorderStyle);
+
+ Color nBorderColor;
+ xPropertySet->getPropertyValue("BorderColor") >>= nBorderColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x00FF00), nBorderColor);
+
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign);
+
+ xPropertySet->getPropertyValue("VerticalAlign") >>= eAlign;
+ CPPUNIT_ASSERT_EQUAL(style::VerticalAlignment_TOP, eAlign);
+
+ // Third control has transparent background
+ xControlShape.set(getShapeFromPage(2, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("BackgroundColor") >>= nColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdActiveXControlsTest::testTextBoxProperties()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/activex_textbox.pptx"), PPTX);
+
+ // First control has default properties
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+
+ OUString sText;
+ xPropertySet->getPropertyValue("Text") >>= sText;
+ CPPUNIT_ASSERT_EQUAL(OUString(), sText);
+
+ bool bEnabled;
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(true, bEnabled);
+
+ bool bMultiLine;
+ xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine;
+ CPPUNIT_ASSERT_EQUAL(false, bMultiLine);
+
+ Color nColor;
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor);
+
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor);
+
+ sal_Int16 nBorderStyle;
+ xPropertySet->getPropertyValue("Border") >>= nBorderStyle;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nBorderStyle);
+
+ sal_Int16 nAlign;
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign);
+
+ style::VerticalAlignment eAlign;
+ CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("VerticalAlign") >>= eAlign);
+
+ bool bHideSelection;
+ xPropertySet->getPropertyValue("HideInactiveSelection") >>= bHideSelection;
+ CPPUNIT_ASSERT_EQUAL(true, bHideSelection);
+
+ sal_Int16 nMaxLength;
+ xPropertySet->getPropertyValue("MaxTextLen") >>= nMaxLength;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nMaxLength);
+
+ sal_Int16 nEchoChar;
+ xPropertySet->getPropertyValue("EchoChar") >>= nEchoChar;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nEchoChar);
+
+ bool bHScroll;
+ xPropertySet->getPropertyValue("HScroll") >>= bHScroll;
+ CPPUNIT_ASSERT_EQUAL(false, bHScroll);
+
+ bool bVScroll;
+ xPropertySet->getPropertyValue("VScroll") >>= bVScroll;
+ CPPUNIT_ASSERT_EQUAL(false, bVScroll);
+
+ bool bReadOnly;
+ xPropertySet->getPropertyValue("ReadOnly") >>= bReadOnly;
+ CPPUNIT_ASSERT_EQUAL(false, bReadOnly);
+
+ // Second control has custom properties
+ xControlShape.set(getShapeFromPage(1, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("Text") >>= sText;
+ CPPUNIT_ASSERT_EQUAL(OUString("Some Text"), sText);
+
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(false, bEnabled);
+
+ // These textfields are not multilines in the pptx testfile
+ xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine;
+ CPPUNIT_ASSERT_EQUAL(false, bMultiLine);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x404040), nColor);
+
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x00C000), nColor);
+
+ xPropertySet->getPropertyValue("Border") >>= nBorderStyle;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nBorderStyle);
+
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign);
+
+ CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("VerticalAlign") >>= eAlign);
+
+ xPropertySet->getPropertyValue("HideInactiveSelection") >>= bHideSelection;
+ CPPUNIT_ASSERT_EQUAL(false, bHideSelection);
+
+ xPropertySet->getPropertyValue("MaxTextLen") >>= nMaxLength;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(50), nMaxLength);
+
+ xPropertySet->getPropertyValue("EchoChar") >>= nEchoChar;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16('x'), nEchoChar);
+
+ xPropertySet->getPropertyValue("HScroll") >>= bHScroll;
+ CPPUNIT_ASSERT_EQUAL(true, bHScroll);
+
+ xPropertySet->getPropertyValue("VScroll") >>= bVScroll;
+ CPPUNIT_ASSERT_EQUAL(false, bVScroll);
+
+ xPropertySet->getPropertyValue("ReadOnly") >>= bReadOnly;
+ CPPUNIT_ASSERT_EQUAL(true, bReadOnly);
+
+ // Third shape has some other custom properties
+ xControlShape.set(getShapeFromPage(2, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ // Transparent background
+ CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("BackgroundColor") >>= nColor);
+
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::RIGHT), nAlign);
+
+ xPropertySet->getPropertyValue("HScroll") >>= bHScroll;
+ CPPUNIT_ASSERT_EQUAL(false, bHScroll);
+
+ xPropertySet->getPropertyValue("VScroll") >>= bVScroll;
+ CPPUNIT_ASSERT_EQUAL(true, bVScroll);
+
+ // Fourth shape has both scroll bar
+ xControlShape.set(getShapeFromPage(3, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("HScroll") >>= bHScroll;
+ CPPUNIT_ASSERT_EQUAL(true, bHScroll);
+
+ xPropertySet->getPropertyValue("VScroll") >>= bVScroll;
+ CPPUNIT_ASSERT_EQUAL(true, bVScroll);
+
+ xDocShRef->DoClose();
+}
+
+void SdActiveXControlsTest::testSpinButtonProperties()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/activex_spinbutton.pptx"), PPTX);
+
+ // First control has default properties
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+
+ bool bEnabled;
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(true, bEnabled);
+
+ Color nColor;
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xECE9D8), nColor);
+
+ sal_Int32 nMax;
+ xPropertySet->getPropertyValue("SpinValueMax") >>= nMax;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(100), nMax);
+
+ sal_Int32 nMin;
+ xPropertySet->getPropertyValue("SpinValueMin") >>= nMin;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nMin);
+
+ sal_Int32 nIncrement;
+ xPropertySet->getPropertyValue("SpinIncrement") >>= nIncrement;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nIncrement);
+
+ bool bRepeat;
+ xPropertySet->getPropertyValue("Repeat") >>= bRepeat;
+ CPPUNIT_ASSERT_EQUAL(true, bRepeat);
+
+ sal_Int32 nDelay;
+ xPropertySet->getPropertyValue("RepeatDelay") >>= nDelay;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(50), nDelay);
+
+ Color nArrowColor;
+ xPropertySet->getPropertyValue("SymbolColor") >>= nArrowColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nArrowColor);
+
+ sal_Int32 nOrientation;
+ xPropertySet->getPropertyValue("Orientation") >>= nOrientation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(awt::ScrollBarOrientation::HORIZONTAL), nOrientation);
+
+ sal_Int32 nSpinValue;
+ xPropertySet->getPropertyValue("SpinValue") >>= nSpinValue;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nSpinValue);
+
+ // Second control has custom properties
+ xControlShape.set(getShapeFromPage(1, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(false, bEnabled);
+
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFFFF00), nColor);
+
+ xPropertySet->getPropertyValue("SpinValueMax") >>= nMax;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(320), nMax);
+
+ xPropertySet->getPropertyValue("SpinValueMin") >>= nMin;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(123), nMin);
+
+ xPropertySet->getPropertyValue("SpinIncrement") >>= nIncrement;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), nIncrement);
+
+ xPropertySet->getPropertyValue("Repeat") >>= bRepeat;
+ CPPUNIT_ASSERT_EQUAL(true, bRepeat);
+
+ xPropertySet->getPropertyValue("RepeatDelay") >>= nDelay;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(123), nDelay);
+
+ xPropertySet->getPropertyValue("SymbolColor") >>= nArrowColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x00FF00), nArrowColor);
+
+ xPropertySet->getPropertyValue("Orientation") >>= nOrientation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(awt::ScrollBarOrientation::VERTICAL), nOrientation);
+
+ xPropertySet->getPropertyValue("SpinValue") >>= nSpinValue;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(123), nSpinValue);
+
+ // Third control has horizontal orientation
+ xControlShape.set(getShapeFromPage(2, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("Orientation") >>= nOrientation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(awt::ScrollBarOrientation::HORIZONTAL), nOrientation);
+
+ xDocShRef->DoClose();
+}
+
+void SdActiveXControlsTest::testCommandButtonProperties()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/activex_commandbutton.pptx"), PPTX);
+
+ // First control has default properties
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+
+ OUString sLabel;
+ xPropertySet->getPropertyValue("Label") >>= sLabel;
+ CPPUNIT_ASSERT_EQUAL(OUString("CommandButton1"), sLabel);
+
+ bool bEnabled;
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(true, bEnabled);
+
+ bool bMultiLine;
+ xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine;
+ CPPUNIT_ASSERT_EQUAL(false, bMultiLine);
+
+ Color nColor;
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xECE9D8), nColor);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor);
+
+ bool bFocusOnClick;
+ xPropertySet->getPropertyValue("FocusOnClick") >>= bFocusOnClick;
+ CPPUNIT_ASSERT_EQUAL(true, bFocusOnClick);
+
+ bool bRepeat;
+ xPropertySet->getPropertyValue("Repeat") >>= bRepeat;
+ CPPUNIT_ASSERT_EQUAL(false, bRepeat);
+
+ // Second control has custom properties
+ xControlShape.set(getShapeFromPage(1, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("Label") >>= sLabel;
+ CPPUNIT_ASSERT_EQUAL(OUString("Custom Caption"), sLabel);
+
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(false, bEnabled);
+
+ xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine;
+ CPPUNIT_ASSERT_EQUAL(true, bMultiLine);
+
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x0000FF), nColor);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFFFF80), nColor);
+
+ xPropertySet->getPropertyValue("FocusOnClick") >>= bFocusOnClick;
+ CPPUNIT_ASSERT_EQUAL(false, bFocusOnClick);
+
+ xPropertySet->getPropertyValue("Repeat") >>= bRepeat;
+ CPPUNIT_ASSERT_EQUAL(false, bRepeat);
+
+ // Third shape has some other custom properties
+ xControlShape.set(getShapeFromPage(2, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ // Transparent background
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdActiveXControlsTest::testScrollBarProperties()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/activex_scrollbar.pptx"), PPTX);
+
+ // First control has default properties
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+
+ bool bEnabled;
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(true, bEnabled);
+
+ Color nColor;
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xECE9D8), nColor);
+
+ xPropertySet->getPropertyValue("SymbolColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor);
+
+ sal_Int32 nDelay;
+ xPropertySet->getPropertyValue("RepeatDelay") >>= nDelay;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(50), nDelay);
+
+ sal_Int16 nBorderStyle;
+ xPropertySet->getPropertyValue("Border") >>= nBorderStyle;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nBorderStyle);
+
+ sal_Int32 nVisibleSize;
+ xPropertySet->getPropertyValue("VisibleSize") >>= nVisibleSize;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nVisibleSize);
+
+ sal_Int32 nScrollValueMin;
+ xPropertySet->getPropertyValue("ScrollValueMin") >>= nScrollValueMin;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nScrollValueMin);
+
+ sal_Int32 nScrollValueMax;
+ xPropertySet->getPropertyValue("ScrollValueMax") >>= nScrollValueMax;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(32767), nScrollValueMax);
+
+ sal_Int32 nScrollValue;
+ xPropertySet->getPropertyValue("DefaultScrollValue") >>= nScrollValue;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nScrollValue);
+
+ sal_Int32 nLineIncrement;
+ xPropertySet->getPropertyValue("LineIncrement") >>= nLineIncrement;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nLineIncrement);
+
+ sal_Int32 nBlockIncrement;
+ xPropertySet->getPropertyValue("BlockIncrement") >>= nBlockIncrement;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nBlockIncrement);
+
+ sal_Int32 nOrientation;
+ xPropertySet->getPropertyValue("Orientation") >>= nOrientation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(awt::ScrollBarOrientation::VERTICAL), nOrientation);
+
+ // Second control has custom properties
+ xControlShape.set(getShapeFromPage(1, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(false, bEnabled);
+
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x00FFFF), nColor);
+
+ xPropertySet->getPropertyValue("SymbolColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), nColor);
+
+ xPropertySet->getPropertyValue("RepeatDelay") >>= nDelay;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(230), nDelay);
+
+ xPropertySet->getPropertyValue("Border") >>= nBorderStyle;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nBorderStyle);
+
+ xPropertySet->getPropertyValue("VisibleSize") >>= nVisibleSize;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nVisibleSize);
+
+ xPropertySet->getPropertyValue("ScrollValueMin") >>= nScrollValueMin;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(123), nScrollValueMin);
+
+ xPropertySet->getPropertyValue("ScrollValueMax") >>= nScrollValueMax;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1234567), nScrollValueMax);
+
+ xPropertySet->getPropertyValue("DefaultScrollValue") >>= nScrollValue;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(125), nScrollValue);
+
+ xPropertySet->getPropertyValue("LineIncrement") >>= nLineIncrement;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), nLineIncrement);
+
+ xPropertySet->getPropertyValue("BlockIncrement") >>= nBlockIncrement;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), nBlockIncrement);
+
+ xPropertySet->getPropertyValue("Orientation") >>= nOrientation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(awt::ScrollBarOrientation::VERTICAL), nOrientation);
+
+ // Third shape has some other custom properties
+ xControlShape.set(getShapeFromPage(2, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("Orientation") >>= nOrientation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(awt::ScrollBarOrientation::HORIZONTAL), nOrientation);
+
+ xPropertySet->getPropertyValue("VisibleSize") >>= nVisibleSize;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), nVisibleSize);
+
+ xDocShRef->DoClose();
+}
+
+void SdActiveXControlsTest::testCheckBoxProperties()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/activex_checkbox.pptx"), PPTX);
+
+ // First control has default properties
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+
+ OUString sLabel;
+ xPropertySet->getPropertyValue("Label") >>= sLabel;
+ CPPUNIT_ASSERT_EQUAL(OUString("CheckBox1"), sLabel);
+
+ bool bEnabled;
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(true, bEnabled);
+
+ Color nColor;
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor);
+
+ bool bMultiLine;
+ xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine;
+ CPPUNIT_ASSERT_EQUAL(true, bMultiLine);
+
+ sal_Int16 nVisualEffect;
+ xPropertySet->getPropertyValue("VisualEffect") >>= nVisualEffect;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::VisualEffect::LOOK3D), nVisualEffect);
+
+ bool bTriState;
+ xPropertySet->getPropertyValue("TriState") >>= bTriState;
+ CPPUNIT_ASSERT_EQUAL(false, bTriState);
+
+ sal_Int16 nState;
+ xPropertySet->getPropertyValue("State") >>= nState;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nState);
+
+ sal_Int16 nAlign;
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign);
+
+ // Second control has custom properties
+ xControlShape.set(getShapeFromPage(1, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("Label") >>= sLabel;
+ CPPUNIT_ASSERT_EQUAL(OUString("Custom Caption"), sLabel);
+
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(false, bEnabled);
+
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), nColor);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFF80FF), nColor);
+
+ xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine;
+ CPPUNIT_ASSERT_EQUAL(false, bMultiLine);
+
+ xPropertySet->getPropertyValue("VisualEffect") >>= nVisualEffect;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::VisualEffect::FLAT), nVisualEffect);
+
+ xPropertySet->getPropertyValue("TriState") >>= bTriState;
+ CPPUNIT_ASSERT_EQUAL(true, bTriState);
+
+ xPropertySet->getPropertyValue("State") >>= nState;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nState);
+
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign);
+
+ // Third shape has some other custom properties
+ xControlShape.set(getShapeFromPage(2, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("TriState") >>= bTriState;
+ CPPUNIT_ASSERT_EQUAL(true, bTriState);
+
+ xPropertySet->getPropertyValue("State") >>= nState;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nState);
+
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::RIGHT), nAlign);
+
+ // Transparent background
+ CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("BackgroundColor") >>= nColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdActiveXControlsTest::testOptionButtonProperties()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/activex_optionbutton.pptx"), PPTX);
+
+ // First control has default properties
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+
+ OUString sLabel;
+ xPropertySet->getPropertyValue("Label") >>= sLabel;
+ CPPUNIT_ASSERT_EQUAL(OUString("OptionButton1"), sLabel);
+
+ bool bEnabled;
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(true, bEnabled);
+
+ Color nColor;
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor);
+
+ bool bMultiLine;
+ xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine;
+ CPPUNIT_ASSERT_EQUAL(true, bMultiLine);
+
+ sal_Int16 nVisualEffect;
+ xPropertySet->getPropertyValue("VisualEffect") >>= nVisualEffect;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::VisualEffect::LOOK3D), nVisualEffect);
+
+ sal_Int16 nState;
+ xPropertySet->getPropertyValue("State") >>= nState;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nState);
+
+ sal_Int16 nAlign;
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign);
+
+ // Second control has custom properties
+ xControlShape.set(getShapeFromPage(1, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("Label") >>= sLabel;
+ CPPUNIT_ASSERT_EQUAL(OUString("Custom Caption"), sLabel);
+
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(false, bEnabled);
+
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x00FFFF), nColor);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), nColor);
+
+ xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine;
+ CPPUNIT_ASSERT_EQUAL(false, bMultiLine);
+
+ xPropertySet->getPropertyValue("VisualEffect") >>= nVisualEffect;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::VisualEffect::FLAT), nVisualEffect);
+
+ xPropertySet->getPropertyValue("State") >>= nState;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nState);
+
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign);
+
+ // Third shape has some other custom properties
+ xControlShape.set(getShapeFromPage(2, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("State") >>= nState;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nState); // TriState / undefined imported as unchecked
+
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::RIGHT), nAlign);
+
+ // Transparent background
+ CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("BackgroundColor") >>= nColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdActiveXControlsTest::testComboBoxProperties()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/activex_combobox.pptx"), PPTX);
+
+ // First control has default properties
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+
+ bool bEnabled;
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(true, bEnabled);
+
+ Color nColor;
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor);
+
+ bool bAutocomplete;
+ xPropertySet->getPropertyValue("Autocomplete") >>= bAutocomplete;
+ CPPUNIT_ASSERT_EQUAL(true, bAutocomplete);
+
+ sal_Int16 nBorderStyle;
+ xPropertySet->getPropertyValue("Border") >>= nBorderStyle;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nBorderStyle);
+
+ Color nBorderColor;
+ xPropertySet->getPropertyValue("BorderColor") >>= nBorderColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nBorderColor);
+
+ bool bDropdown;
+ xPropertySet->getPropertyValue("Dropdown") >>= bDropdown;
+ CPPUNIT_ASSERT_EQUAL(true, bDropdown);
+
+ bool bHideInactiveSelection;
+ xPropertySet->getPropertyValue("HideInactiveSelection") >>= bHideInactiveSelection;
+ CPPUNIT_ASSERT_EQUAL(true, bHideInactiveSelection);
+
+ sal_Int16 nLineCount;
+ xPropertySet->getPropertyValue("LineCount") >>= nLineCount;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(8), nLineCount);
+
+ sal_Int16 nMaxTextLen;
+ xPropertySet->getPropertyValue("MaxTextLen") >>= nMaxTextLen;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nMaxTextLen);
+
+ bool bReadOnly;
+ xPropertySet->getPropertyValue("ReadOnly") >>= bReadOnly;
+ CPPUNIT_ASSERT_EQUAL(false, bReadOnly);
+
+ sal_Int16 nAlign;
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign);
+
+ // Second control has custom properties
+ xControlShape.set(getShapeFromPage(1, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(false, bEnabled);
+
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x800000), nColor);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor);
+
+ xPropertySet->getPropertyValue("Autocomplete") >>= bAutocomplete;
+ CPPUNIT_ASSERT_EQUAL(true, bAutocomplete);
+
+ xPropertySet->getPropertyValue("Border") >>= nBorderStyle;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nBorderStyle);
+
+ xPropertySet->getPropertyValue("BorderColor") >>= nBorderColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x404040), nBorderColor);
+
+ xPropertySet->getPropertyValue("Dropdown") >>= bDropdown;
+ CPPUNIT_ASSERT_EQUAL(true, bDropdown);
+
+ xPropertySet->getPropertyValue("HideInactiveSelection") >>= bHideInactiveSelection;
+ CPPUNIT_ASSERT_EQUAL(false, bHideInactiveSelection);
+
+ xPropertySet->getPropertyValue("LineCount") >>= nLineCount;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(12), nLineCount);
+
+ xPropertySet->getPropertyValue("MaxTextLen") >>= nMaxTextLen;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(130), nMaxTextLen);
+
+ xPropertySet->getPropertyValue("ReadOnly") >>= bReadOnly;
+ CPPUNIT_ASSERT_EQUAL(false, bReadOnly); // Bogus, should be true (tdf#111417)
+
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign);
+
+ // Third shape has some other custom properties
+ xControlShape.set(getShapeFromPage(2, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("Autocomplete") >>= bAutocomplete;
+ CPPUNIT_ASSERT_EQUAL(false, bAutocomplete);
+
+ xPropertySet->getPropertyValue("Dropdown") >>= bDropdown;
+ CPPUNIT_ASSERT_EQUAL(false, bDropdown);
+
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::RIGHT), nAlign);
+
+ // Transparent background
+ CPPUNIT_ASSERT_EQUAL(false, xPropertySet->getPropertyValue("BackgroundColor") >>= nColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdActiveXControlsTest::testListBoxProperties()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/activex_listbox.pptx"), PPTX);
+
+ // First control has default properties
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+
+ bool bEnabled;
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(true, bEnabled);
+
+ Color nColor;
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor);
+
+ sal_Int16 nBorderStyle;
+ xPropertySet->getPropertyValue("Border") >>= nBorderStyle;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nBorderStyle);
+
+ Color nBorderColor;
+ xPropertySet->getPropertyValue("BorderColor") >>= nBorderColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nBorderColor);
+
+ bool bDropdown;
+ xPropertySet->getPropertyValue("Dropdown") >>= bDropdown;
+ CPPUNIT_ASSERT_EQUAL(false, bDropdown);
+
+ bool bMultiSelection;
+ xPropertySet->getPropertyValue("MultiSelection") >>= bMultiSelection;
+ CPPUNIT_ASSERT_EQUAL(false, bMultiSelection);
+
+ sal_Int16 nLineCount;
+ xPropertySet->getPropertyValue("LineCount") >>= nLineCount;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(5), nLineCount);
+
+ bool bReadOnly;
+ xPropertySet->getPropertyValue("ReadOnly") >>= bReadOnly;
+ CPPUNIT_ASSERT_EQUAL(false, bReadOnly);
+
+ sal_Int16 nAlign;
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign);
+
+ // Second control has custom properties
+ xControlShape.set(getShapeFromPage(1, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(false, bEnabled);
+
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFFFF00), nColor);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), nColor);
+
+ xPropertySet->getPropertyValue("Border") >>= nBorderStyle;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nBorderStyle);
+
+ xPropertySet->getPropertyValue("BorderColor") >>= nBorderColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFF00FF), nBorderColor);
+
+ xPropertySet->getPropertyValue("MultiSelection") >>= bMultiSelection;
+ CPPUNIT_ASSERT_EQUAL(true, bMultiSelection);
+
+ xPropertySet->getPropertyValue("ReadOnly") >>= bReadOnly;
+ CPPUNIT_ASSERT_EQUAL(false, bReadOnly); // Bogus, should be true (tdf#111417)
+
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign);
+
+ // Third shape has some other custom properties
+ xControlShape.set(getShapeFromPage(2, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("MultiSelection") >>= bMultiSelection;
+ CPPUNIT_ASSERT_EQUAL(true, bMultiSelection);
+
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::RIGHT), nAlign);
+
+ xDocShRef->DoClose();
+}
+
+void SdActiveXControlsTest::testToggleButtonProperties()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/activex_togglebutton.pptx"), PPTX);
+
+ // First control has default properties
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+
+ OUString sLabel;
+ xPropertySet->getPropertyValue("Label") >>= sLabel;
+ CPPUNIT_ASSERT_EQUAL(OUString("ToggleButton1"), sLabel);
+
+ bool bEnabled;
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(true, bEnabled);
+
+ bool bMultiLine;
+ xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine;
+ CPPUNIT_ASSERT_EQUAL(true, bMultiLine);
+
+ Color nColor;
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xECE9D8), nColor);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor);
+
+ bool bToggle;
+ xPropertySet->getPropertyValue("Toggle") >>= bToggle;
+ CPPUNIT_ASSERT_EQUAL(true, bToggle);
+
+ sal_Int16 nState;
+ xPropertySet->getPropertyValue("State") >>= nState;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nState);
+
+ sal_Int16 nAlign;
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::CENTER), nAlign);
+
+ // Second control has custom properties
+ xControlShape.set(getShapeFromPage(1, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("Label") >>= sLabel;
+ CPPUNIT_ASSERT_EQUAL(OUString("Custom Caption"), sLabel);
+
+ xPropertySet->getPropertyValue("Enabled") >>= bEnabled;
+ CPPUNIT_ASSERT_EQUAL(false, bEnabled);
+
+ xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine;
+ CPPUNIT_ASSERT_EQUAL(false, bMultiLine);
+
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFF80FF), nColor);
+
+ xPropertySet->getPropertyValue("TextColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x808080), nColor);
+
+ xPropertySet->getPropertyValue("Toggle") >>= bToggle;
+ CPPUNIT_ASSERT_EQUAL(true, bToggle);
+
+ xPropertySet->getPropertyValue("State") >>= nState;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nState);
+
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::LEFT), nAlign);
+
+ // Third shape has some other custom properties
+ xControlShape.set(getShapeFromPage(2, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
+
+ xPropertySet->getPropertyValue("State") >>= nState;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nState); // Undefined state
+
+ xPropertySet->getPropertyValue("Align") >>= nAlign;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(awt::TextAlign::RIGHT), nAlign);
+
+ // Transparent background
+ xPropertySet->getPropertyValue("BackgroundColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, nColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdActiveXControlsTest::testPictureProperties()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/activex_picture.pptx"), PPTX);
+
+ // Different controls has different image positioning
+
+ // Command buttons here with icons
+ const std::vector<sal_Int16> vImagePositions =
+ {
+ awt::ImagePosition::AboveCenter,
+ awt::ImagePosition::LeftTop,
+ awt::ImagePosition::LeftCenter,
+ awt::ImagePosition::LeftBottom,
+ awt::ImagePosition::RightTop,
+ awt::ImagePosition::RightCenter,
+ awt::ImagePosition::RightBottom,
+ awt::ImagePosition::AboveLeft,
+ awt::ImagePosition::AboveRight,
+ awt::ImagePosition::BelowLeft,
+ awt::ImagePosition::BelowCenter,
+ awt::ImagePosition::BelowRight,
+ awt::ImagePosition::Centered,
+ };
+
+ for (size_t i = 0; i < vImagePositions.size(); ++i)
+ {
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(i, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xPropertySet->getPropertyValue("Graphic") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+
+ sal_Int16 nColor;
+ xPropertySet->getPropertyValue("ImagePosition") >>= nColor;
+ OString sMessage = "The wrong control's index is: " + OString::number(i);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), vImagePositions[i], nColor);
+ }
+
+ // Picture controls with different properties
+ for (size_t i = 0; i < 4; ++i)
+ {
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(vImagePositions.size() + i, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+
+ OString sMessage = "The wrong control's index is: " + OString::number(i);
+
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xPropertySet->getPropertyValue("Graphic") >>= xGraphic;
+ if (i == 0) // First control has no image specified
+ CPPUNIT_ASSERT_MESSAGE(sMessage.getStr(), !xGraphic.is());
+ else
+ CPPUNIT_ASSERT_MESSAGE(sMessage.getStr(), xGraphic.is());
+
+ sal_Int16 nScaleMode;
+ xPropertySet->getPropertyValue("ScaleMode") >>= nScaleMode;
+ if (i == 2) // Stretch mode
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), awt::ImageScaleMode::ANISOTROPIC, nScaleMode);
+ else if (i == 3) // Zoom mode
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), awt::ImageScaleMode::ISOTROPIC, nScaleMode);
+ else // Clip mode
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), awt::ImageScaleMode::NONE, nScaleMode);
+ }
+
+ // Note: LO picture control does not support tiled image and also image positioning
+ // When there is no scaling picture positioned to center.
+
+ xDocShRef->DoClose();
+}
+
+void SdActiveXControlsTest::testFontProperties()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/activex_fontproperties.pptx"), PPTX);
+
+ // Different controls has different font properties
+
+ for (size_t i = 0; i < 8; ++i)
+ {
+ uno::Reference< drawing::XControlShape > xControlShape(getShapeFromPage(i, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
+
+ OString sMessage = "The wrong control's index is: " + OString::number(i);
+
+ OUString sFontName;
+ xPropertySet->getPropertyValue("FontName") >>= sFontName;
+ if (i == 4 || i == 5)
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), OUString("Times New Roman"), sFontName);
+ else
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), OUString("Arial"), sFontName);
+
+ float fFontWeight;
+ xPropertySet->getPropertyValue("FontWeight") >>= fFontWeight;
+ if (i == 2 || i == 4)
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), awt::FontWeight::BOLD, fFontWeight);
+ else
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), awt::FontWeight::NORMAL, fFontWeight);
+
+ sal_Int16 nFontSlant;
+ xPropertySet->getPropertyValue("FontSlant") >>= nFontSlant;
+ if (i == 3 || i == 4)
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), sal_Int16(awt::FontSlant_ITALIC), nFontSlant);
+ else
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), sal_Int16(awt::FontSlant_NONE), nFontSlant);
+
+ sal_Int16 nFontUnderline;
+ xPropertySet->getPropertyValue("FontUnderline") >>= nFontUnderline;
+ if (i == 7)
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), sal_Int16(awt::FontUnderline::SINGLE), nFontUnderline);
+ else
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), sal_Int16(awt::FontUnderline::NONE), nFontUnderline);
+
+ sal_Int16 nFontStrikeout;
+ xPropertySet->getPropertyValue("FontStrikeout") >>= nFontStrikeout;
+ if (i == 6 || i == 7)
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), sal_Int16(awt::FontStrikeout::SINGLE), nFontStrikeout);
+ else
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), sal_Int16(awt::FontStrikeout::NONE), nFontStrikeout);
+
+ float fFontHeight;
+ xPropertySet->getPropertyValue("FontHeight") >>= fFontHeight;
+ if (i == 1)
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), 24.0f, fFontHeight);
+ else
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), 14.0f, fFontHeight);
+ }
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdActiveXControlsTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sd/qa/unit/data/AllTransitions.odp b/sd/qa/unit/data/AllTransitions.odp
new file mode 100644
index 000000000..8922a0756
--- /dev/null
+++ b/sd/qa/unit/data/AllTransitions.odp
Binary files differ
diff --git a/sd/qa/unit/data/HtmlExportTestDocument.odp b/sd/qa/unit/data/HtmlExportTestDocument.odp
new file mode 100644
index 000000000..3c1661471
--- /dev/null
+++ b/sd/qa/unit/data/HtmlExportTestDocument.odp
Binary files differ
diff --git a/sd/qa/unit/data/PdfWithAnnotation.pdf b/sd/qa/unit/data/PdfWithAnnotation.pdf
new file mode 100644
index 000000000..09529ed17
--- /dev/null
+++ b/sd/qa/unit/data/PdfWithAnnotation.pdf
Binary files differ
diff --git a/sd/qa/unit/data/README b/sd/qa/unit/data/README
new file mode 100644
index 000000000..2cc9fb3cb
--- /dev/null
+++ b/sd/qa/unit/data/README
@@ -0,0 +1,7 @@
+Files with the string 'CVE' in their name are encrypted to avoid
+problems with virus checkers on source code download.; use:
+
+mdecrypt --bare -a arcfour -o hex -k 435645 -s 3 foo.doc # to unencrypt
+mcrypt --bare -a arcfour -o hex -k 435645 -s 3 foo.doc # to create new tests
+
+to get access to the plain files for manual testing.
diff --git a/sd/qa/unit/data/SimplePDF.pdf b/sd/qa/unit/data/SimplePDF.pdf
new file mode 100644
index 000000000..5d6fdb191
--- /dev/null
+++ b/sd/qa/unit/data/SimplePDF.pdf
Binary files differ
diff --git a/sd/qa/unit/data/TextDistancesInsets1.pptx b/sd/qa/unit/data/TextDistancesInsets1.pptx
new file mode 100644
index 000000000..1d1020626
--- /dev/null
+++ b/sd/qa/unit/data/TextDistancesInsets1.pptx
Binary files differ
diff --git a/sd/qa/unit/data/TextDistancesInsets2.pptx b/sd/qa/unit/data/TextDistancesInsets2.pptx
new file mode 100644
index 000000000..136d15c9b
--- /dev/null
+++ b/sd/qa/unit/data/TextDistancesInsets2.pptx
Binary files differ
diff --git a/sd/qa/unit/data/TextDistancesInsets3.pptx b/sd/qa/unit/data/TextDistancesInsets3.pptx
new file mode 100644
index 000000000..e977f459c
--- /dev/null
+++ b/sd/qa/unit/data/TextDistancesInsets3.pptx
Binary files differ
diff --git a/sd/qa/unit/data/bnc822347_EmptyBullet.odp b/sd/qa/unit/data/bnc822347_EmptyBullet.odp
new file mode 100644
index 000000000..73f7e0296
--- /dev/null
+++ b/sd/qa/unit/data/bnc822347_EmptyBullet.odp
Binary files differ
diff --git a/sd/qa/unit/data/cgm/fail/.gitignore b/sd/qa/unit/data/cgm/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/cgm/fail/.gitignore
diff --git a/sd/qa/unit/data/cgm/fail/ofz35504-ubsan-1.cgm b/sd/qa/unit/data/cgm/fail/ofz35504-ubsan-1.cgm
new file mode 100644
index 000000000..07aa3db00
--- /dev/null
+++ b/sd/qa/unit/data/cgm/fail/ofz35504-ubsan-1.cgm
Binary files differ
diff --git a/sd/qa/unit/data/cgm/fail/ooo6420-1.cgm b/sd/qa/unit/data/cgm/fail/ooo6420-1.cgm
new file mode 100644
index 000000000..5b42b6ff7
--- /dev/null
+++ b/sd/qa/unit/data/cgm/fail/ooo6420-1.cgm
@@ -0,0 +1,400 @@
+BEGMF 'xfig-fig012228';
+mfversion 1;
+mfdesc 'Converted from /tmp/xfig-fig012228 using fig2dev -Lcgm';
+mfelemlist 'DRAWINGPLUS';
+vdctype integer;
+fontlist 'Hardware',
+ 'Times New Roman', 'Times New Roman Bold', 'Times New Roman Italic',
+ 'Helvetica', 'Courier',
+ 'Times-Roman', 'Times-Italic',
+ 'Times-Bold', 'Times-BoldItalic',
+ 'AvantGarde-Book', 'AvantGarde-BookOblique',
+ 'AvantGarde-Demi', 'AvantGarde-DemiOblique',
+ 'Bookman-light', 'Bookman-lightItalic',
+ 'Bookman-Demi', 'Bookman-DemiItalic',
+ 'Courier', 'Courier-Oblique',
+ 'Courier-Bold', 'Courier-BoldOblique',
+ 'Helvetica', 'Helvetica-Oblique',
+ 'Helvetica-Bold', 'Helvetica-BoldOblique',
+ 'Helvetica-Narrow', 'Helvetica-Narrow-Oblique',
+ 'Helvetica-Narrow-Bold', 'Helvetica-Narrow-BoldOblique',
+ 'NewCenturySchlbk-Roman', 'NewCenturySchlbk-Italic',
+ 'NewCenturySchlbk-Bold', 'NewCenturySchlbk-BoldItalic',
+ 'Palatino-Roman', 'Palatino-Italic',
+ 'Palatino-Bold', 'Palatino-BoldItalic',
+ 'Symbol', 'ZapfChancery-MediumItalic', 'ZapfDingbats';
+BEGMFDEFAULTS;
+ vdcext (0,0) (12974,8467);
+ clip off;
+ colrmode indexed;
+ colrtable 1
+ 0 0 0
+ 0 0 255
+ 0 255 0
+ 0 255 255
+ 255 0 0
+ 255 0 255
+ 255 255 0
+ 255 255 255
+ 0 0 142
+ 0 0 175
+ 0 0 209
+ 135 206 255
+ 0 142 0
+ 0 175 0
+ 0 209 0
+ 0 142 142
+ 0 175 175
+ 0 209 209
+ 142 0 0
+ 175 0 0
+ 209 0 0
+ 142 0 142
+ 175 0 175
+ 209 0 209
+ 127 48 0
+ 160 63 0
+ 191 96 0
+ 255 127 127
+ 255 160 160
+ 255 191 191
+ 255 224 224
+ 255 214 0;
+ linewidthmode abs;
+ edgewidthmode abs;
+ backcolr 255 255 255;
+ textprec stroke;
+ transparency ON;
+ENDMFDEFAULTS;
+BEGPIC 'xfig-fig012228';
+BEGPICBODY;
+% Circle %
+intstyle EMPTY;
+edgevis ON;
+edgetype 1;
+edgewidth 30;
+edgecolr 1;
+circle (7747,5647) 225;
+% Polygon %
+polygon (2797,6997) (3697,5197) (2797,3397) (2797,6997);
+% Polyline %
+linetype 1;
+linewidth 30;
+linecolr 1;
+line (3697,5197) (3907,5197);
+intstyle SOLID;
+fillcolr 1;
+polygon (3847,5257)(4087,5197)(3847,5137);
+% Polyline %
+line (772,4747) (2797,4747);
+% Polyline %
+line (772,3847) (2797,3847);
+% Polyline %
+line (997,472) (8422,472);
+% Polyline %
+line (997,1372) (8422,1372);
+% Polyline %
+line (6622,2272) (8422,2272);
+% Box %
+intstyle EMPTY;
+rect (5497,4522) (6622,3622);
+% Polyline %
+line (6622,4072) (6880,4072);
+intstyle SOLID;
+fillcolr 8;
+polygon (6772,4132)(7012,4072)(6772,4012)(6820,4072);
+% Polygon %
+intstyle EMPTY;
+polygon (8422,3622) (9322,1822) (8422,22) (8422,3622);
+% Polyline %
+line (9322,1822) (9532,1822);
+intstyle SOLID;
+fillcolr 1;
+polygon (9472,1882)(9712,1822)(9472,1762);
+% Polyline %
+line (9772,3397) (9772,4522) (7747,4522) (7747,5182);
+polygon (7687,5122)(7747,5362)(7807,5122);
+% Polyline %
+line (772,6322) (772,7387);
+line (712,7147)(772,7387)(832,7147);
+% Polyline %
+line (772,5647) (2797,5647);
+% Polyline %
+line (322,6322) (1672,6322) (1672,5647);
+% Polyline %
+line (9772,4522) (10222,4522);
+% Polyline %
+line (10447,4522) (12472,4522) (12472,8122) (322,8122) (322,6322);
+% Polyline %
+line (9772,3397) (9772,697) (11062,697);
+line (10822,757)(11062,697)(10822,637);
+% Polyline %
+line (9772,2722) (11962,2722);
+line (11722,2782)(11962,2722)(11722,2662);
+% Polyline %
+line (10537,3622) (10537,3847) (12022,3847);
+% Polyline %
+line (10222,4522) (10222,3397) (11962,3397);
+line (11722,3457)(11962,3397)(11722,3337);
+% Polyline %
+line (10222,4072) (11962,4072);
+line (11722,4132)(11962,4072)(11722,4012);
+% Polyline %
+line (4147,7222) (4147,4072) (5257,4072);
+polygon (5197,4132)(5437,4072)(5197,4012);
+% Polyline %
+line (4147,7222) (8182,7222);
+polygon (8122,7282)(8362,7222)(8122,7162);
+% Polyline %
+line (10837,7672) (8422,7672) (8422,6772) (10837,6772);
+line (10597,7732)(10837,7672)(10597,7612);
+line (10597,6832)(10837,6772)(10597,6712);
+% Polyline %
+line (4147,6322) (7747,6322) (7747,6112);
+polygon (7807,6172)(7747,5932)(7687,6172);
+% Polyline %
+line (7972,5647) (8182,5647);
+polygon (8122,5707)(8362,5647)(8122,5587);
+% Polyline %
+line (1672,6547) (1882,6547);
+polygon (1822,6607)(2062,6547)(1822,6487);
+% Polyline %
+line (10987,3847) (10777,3847);
+polygon (10837,3787)(10597,3847)(10837,3907);
+% Polyline %
+line (9772,4522) (9982,4522);
+polygon (9922,4582)(10162,4522)(9922,4462);
+% Polyline %
+line (10942,4522) (10732,4522);
+polygon (10792,4462)(10552,4522)(10792,4582);
+% Box %
+intstyle EMPTY;
+rect (5497,2722) (6622,1822);
+% Polyline %
+line (5047,2272) (5305,2272);
+intstyle SOLID;
+fillcolr 8;
+polygon (5197,2332)(5437,2272)(5197,2212)(5245,2272);
+% Polyline %
+line (1447,7447) (1447,6547) (2572,6547);
+% Polyline %
+line (10837,6097) (8422,6097) (8422,5197) (10837,5197);
+line (10597,6157)(10837,6097)(10597,6037);
+line (10597,5257)(10837,5197)(10597,5137);
+% Polyline %
+line (2077,6547) (2797,6547);
+% Text %
+textfontindex 25;
+textalign right base 0.0 0.0;
+textcolr 1;
+charheight 140;
+charori (0,1200) (1200,0);
+text (862,1282) final 'FMS_IN';
+% Text %
+text (862,382) final 'WFB_IN';
+% Text %
+textalign left base 0.0 0.0;
+text (7162,3982) final 'NET';
+% Text %
+text (5767,4207) final 'PCM';
+% Text %
+text (5767,3892) final 'capture';
+% Text %
+textalign ctr base 0.0 0.0;
+text (1222,7582) final 'DECRYPT';
+% Text %
+textalign left base 0.0 0.0;
+text (12067,3892) final 'CRYPT';
+% Text %
+text (10042,2047) final 'SE_OUT';
+% Text %
+text (9997,1012) final 'GS_OUT';
+% Text %
+textalign right base 0.0 0.0;
+text (8197,1642) final 'FMS_IN';
+% Text %
+text (8197,742) final 'WFB_IN';
+% Text %
+text (4912,2182) final 'NET';
+% Text %
+textalign left base 0.0 0.0;
+text (5767,2407) final 'PCM';
+% Text %
+text (5767,2092) final 'receive';
+% Text %
+text (4327,4612) final 'NET_CAPTURE';
+% Text %
+text (4372,6592) final 'LSTA_OUT';
+% Text %
+text (4372,7492) final 'FMS_OUT';
+% Text %
+textalign right base 0.0 0.0;
+text (2662,6817) final 'CYUN_IN';
+% Text %
+text (2572,5917) final 'SE_IN';
+% Text %
+text (2572,5017) final 'PA_IN';
+% Text %
+text (2572,4117) final 'GS_IN';
+% Text %
+text (8332,2542) final 'NET_RECEIVE';
+% Text %
+textalign left base 0.0 0.0;
+text (2932,5107) final 'LEFT';
+% Text %
+text (8512,1732) final 'RIGHT';
+% Text %
+textalign right base 0.0 0.0;
+text (682,4657) final 'PA_IN';
+% Text %
+text (682,3757) final 'GS_IN';
+% Text %
+text (682,5557) final 'SE_IN';
+% Text %
+textalign left base 0.0 0.0;
+text (10987,7582) final 'FMS_OUT';
+% Text %
+text (10987,6682) final 'WFB_OUT';
+% Text %
+text (10987,6007) final 'TA_OUT';
+% Text %
+text (10987,5107) final 'LS_OUT';
+% Text %
+text (12067,2632) final 'PA_OUT';
+% Text %
+text (11212,607) final 'GS_OUT';
+% Text %
+textalign ctr base 0.0 0.0;
+text (11302,3577) final 'OL-SE';
+% Text %
+text (9997,5377) final 'OL-LS';
+% Text %
+text (9997,6277) final 'OL-TA';
+% Text %
+text (6172,8302) final 'LOOP-RS';
+% Text %
+text (1222,5827) final 'IL-SE';
+% Text %
+text (11347,2902) final 'OL-PA';
+% Text %
+textalign left base 0.0 0.0;
+text (12067,3307) final 'SE_OUT';
+% Text %
+textalign ctr base 0.0 0.0;
+text (10312,4612) final 'RS1';
+% Text %
+textalign left base 0.0 0.0;
+text (8197,4657) final 'TA_BACK';
+% Text %
+textalign ctr base 0.0 0.0;
+text (9097,5512) final 'LS_ON';
+% Text %
+text (9097,6412) final 'TA_ON';
+% Text %
+text (10357,2992) final 'PA_ON';
+% Polygon %
+colrtable 33 255 255 255;
+fillcolr 33;
+polygon (2122,6772) (2122,6322) (2572,6547) (2122,6772);
+% Polygon %
+polygon (2122,5872) (2122,5422) (2572,5647) (2122,5872);
+% Polygon %
+polygon (2122,4972) (2122,4522) (2572,4747) (2122,4972);
+% Polygon %
+polygon (2122,4072) (2122,3622) (2572,3847) (2122,4072);
+% Polygon %
+polygon (4372,4297) (4372,3847) (4822,4072) (4372,4297);
+% Polygon %
+polygon (9997,922) (9997,472) (10447,697) (9997,922);
+% Polygon %
+polygon (7747,2497) (7747,2047) (8197,2272) (7747,2497);
+% Polygon %
+polygon (7747,1597) (7747,1147) (8197,1372) (7747,1597);
+% Polygon %
+polygon (7747,697) (7747,247) (8197,472) (7747,697);
+% Polygon %
+polygon (9547,2047) (9997,2047) (9772,2497) (9547,2047);
+% Box %
+rect (997,5782) (1447,5512);
+% Box %
+rect (5947,8257) (6397,7987);
+% Box %
+rect (11122,2857) (11572,2587);
+% Box %
+rect (11122,3532) (11572,3262);
+% Polygon %
+polygon (4372,7447) (4372,6997) (4822,7222) (4372,7447);
+% Polygon %
+polygon (4372,6547) (4372,6097) (4822,6322) (4372,6547);
+% Box %
+rect (9772,6232) (10222,5962);
+% Box %
+rect (9772,5332) (10222,5062);
+% Polyline %
+linewidth 45;
+linecolr 8;
+line (8332,4522) (8017,4522);
+% Polyline %
+line (10222,4207) (10222,4522);
+% Polyline %
+line (10222,2722) (10537,2722);
+% Polyline %
+line (10852,3397) (10537,3397);
+% Polyline %
+line (8917,5197) (9232,5197);
+% Polyline %
+line (8917,6097) (9232,6097);
+% Polyline %
+linewidth 30;
+linecolr 1;
+line (8332,4522) (8017,4657);
+% Polyline %
+line (10222,4207) (10357,4522);
+% Polyline %
+line (10222,2722) (10537,2857);
+% Polyline %
+line (10852,3397) (10537,3532);
+% Polyline %
+line (8917,5197) (9232,5332);
+% Polyline %
+line (8917,6097) (9232,6232);
+% Circle %
+edgewidth 15;
+circle (8332,4522) 45;
+% Circle %
+circle (8017,4522) 45;
+% Circle %
+circle (8017,4747) 45;
+% Circle %
+circle (10222,4207) 45;
+% Circle %
+circle (10222,4522) 45;
+% Circle %
+circle (10447,4522) 45;
+% Circle %
+circle (10222,2722) 45;
+% Circle %
+circle (10537,2722) 45;
+% Circle %
+circle (10537,2947) 45;
+% Circle %
+circle (10852,3397) 45;
+% Circle %
+circle (10537,3397) 45;
+% Circle %
+circle (10537,3622) 45;
+% Circle %
+circle (8917,5197) 45;
+% Circle %
+circle (9232,5197) 45;
+% Circle %
+circle (9232,5422) 45;
+% Circle %
+circle (8917,6097) 45;
+% Circle %
+circle (9232,6322) 45;
+% Circle %
+circle (9232,6097) 45;
+% End of Picture %
+ENDPIC;
+ENDMF;
diff --git a/sd/qa/unit/data/cgm/fail/recurse-1.cgm b/sd/qa/unit/data/cgm/fail/recurse-1.cgm
new file mode 100644
index 000000000..4ba3b95de
--- /dev/null
+++ b/sd/qa/unit/data/cgm/fail/recurse-1.cgm
Binary files differ
diff --git a/sd/qa/unit/data/cgm/indeterminate/.gitignore b/sd/qa/unit/data/cgm/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/cgm/indeterminate/.gitignore
diff --git a/sd/qa/unit/data/cgm/pass/.gitignore b/sd/qa/unit/data/cgm/pass/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/cgm/pass/.gitignore
diff --git a/sd/qa/unit/data/cgm/pass/binary_corvette.cgm b/sd/qa/unit/data/cgm/pass/binary_corvette.cgm
new file mode 100644
index 000000000..2b38c4834
--- /dev/null
+++ b/sd/qa/unit/data/cgm/pass/binary_corvette.cgm
Binary files differ
diff --git a/sd/qa/unit/data/cgm/pass/circles.cgm b/sd/qa/unit/data/cgm/pass/circles.cgm
new file mode 100644
index 000000000..d31c1b4f3
--- /dev/null
+++ b/sd/qa/unit/data/cgm/pass/circles.cgm
Binary files differ
diff --git a/sd/qa/unit/data/cgm/pass/ofz-ubsan-2.cgm b/sd/qa/unit/data/cgm/pass/ofz-ubsan-2.cgm
new file mode 100644
index 000000000..08692230b
--- /dev/null
+++ b/sd/qa/unit/data/cgm/pass/ofz-ubsan-2.cgm
Binary files differ
diff --git a/sd/qa/unit/data/cgm/pass/ofz36348-ubsan-1.cgm b/sd/qa/unit/data/cgm/pass/ofz36348-ubsan-1.cgm
new file mode 100644
index 000000000..4b2e9cf0d
--- /dev/null
+++ b/sd/qa/unit/data/cgm/pass/ofz36348-ubsan-1.cgm
Binary files differ
diff --git a/sd/qa/unit/data/cgm/pass/ofz9707-slow-1.cgm b/sd/qa/unit/data/cgm/pass/ofz9707-slow-1.cgm
new file mode 100644
index 000000000..9695f9bba
--- /dev/null
+++ b/sd/qa/unit/data/cgm/pass/ofz9707-slow-1.cgm
Binary files differ
diff --git a/sd/qa/unit/data/dialogs-test.txt b/sd/qa/unit/data/dialogs-test.txt
new file mode 100644
index 000000000..b3585b8e9
--- /dev/null
+++ b/sd/qa/unit/data/dialogs-test.txt
@@ -0,0 +1,75 @@
+# -*- 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 contains all dialogs that the unit tests in the module
+# will work on if it is in script mode. It will read one-by-one,
+# try to open it and create a screenshot that will be saved in
+# workdir/screenshots using the pattern of the ui-file name.
+#
+# Syntax:
+# - empty lines are allowed
+# - lines starting with '#' are treated as comment
+# - all other lines should contain a *.ui filename in the same
+# notation as in the dialog constructors (see code)
+
+#
+# The 'known' dialogs which have a hard-coded representation
+# in registerKnownDialogsByID/createDialogByID
+#
+
+modules/sdraw/ui/breakdialog.ui
+modules/sdraw/ui/copydlg.ui
+modules/sdraw/ui/drawchardialog.ui
+modules/sdraw/ui/drawpagedialog.ui
+modules/sdraw/ui/dlgsnap.ui
+modules/sdraw/ui/insertlayer.ui
+modules/sdraw/ui/insertslidesdialog.ui
+modules/sdraw/ui/crossfadedialog.ui
+modules/sdraw/ui/bulletsandnumbering.ui
+modules/sdraw/ui/drawparadialog.ui
+modules/sdraw/ui/drawprtldialog.ui
+modules/sdraw/ui/vectorize.ui
+
+modules/simpress/ui/publishingdialog.ui
+modules/simpress/ui/customslideshows.ui
+modules/simpress/ui/dlgfield.ui
+modules/simpress/ui/presentationdialog.ui
+modules/simpress/ui/remotedialog.ui
+modules/simpress/ui/templatedialog.ui
+modules/simpress/ui/slidedesigndialog.ui
+modules/simpress/ui/interactiondialog.ui
+modules/simpress/ui/photoalbum.ui
+modules/simpress/ui/masterlayoutdlg.ui
+modules/simpress/ui/headerfooterdialog.ui
+
+#
+# Dialogs without a hard-coded representation. These will
+# be visualized using a fallback based on weld::Builder
+#
+
+modules/sdraw/ui/paranumberingtab.ui
+modules/sdraw/ui/namedesign.ui
+
+# currently deactivated, leads to problems and the test to not work
+# This is typically a hint that these should be hard-coded in the
+# test case since they need some document and model data to work
+#
+# modules/simpress/ui/assistentdialog.ui
+
+modules/simpress/ui/headerfootertab.ui
+modules/simpress/ui/customanimationproperties.ui
+modules/simpress/ui/customanimationeffecttab.ui
+modules/simpress/ui/customanimationtimingtab.ui
+modules/simpress/ui/customanimationtexttab.ui
+modules/simpress/ui/sdviewpage.ui
+modules/simpress/ui/prntopts.ui
+modules/simpress/ui/optimpressgeneralpage.ui
+modules/simpress/ui/interactionpage.ui
+modules/simpress/ui/definecustomslideshow.ui
+modules/simpress/ui/insertslides.ui
diff --git a/sd/qa/unit/data/empty.fodp b/sd/qa/unit/data/empty.fodp
new file mode 100644
index 000000000..3c2a4cf2c
--- /dev/null
+++ b/sd/qa/unit/data/empty.fodp
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.presentation"><office:body><office:presentation><draw:page/></office:presentation></office:body></office:document>
diff --git a/sd/qa/unit/data/fdo47434.pptx b/sd/qa/unit/data/fdo47434.pptx
new file mode 100644
index 000000000..1ecb8a9de
--- /dev/null
+++ b/sd/qa/unit/data/fdo47434.pptx
Binary files differ
diff --git a/sd/qa/unit/data/fdo64512.odp b/sd/qa/unit/data/fdo64512.odp
new file mode 100644
index 000000000..ffb9f044b
--- /dev/null
+++ b/sd/qa/unit/data/fdo64512.odp
Binary files differ
diff --git a/sd/qa/unit/data/fdo64586.ppt b/sd/qa/unit/data/fdo64586.ppt
new file mode 100644
index 000000000..62a4b11a1
--- /dev/null
+++ b/sd/qa/unit/data/fdo64586.ppt
Binary files differ
diff --git a/sd/qa/unit/data/fdo71075.odp b/sd/qa/unit/data/fdo71075.odp
new file mode 100644
index 000000000..b418faf39
--- /dev/null
+++ b/sd/qa/unit/data/fdo71075.odp
Binary files differ
diff --git a/sd/qa/unit/data/fdo71434.pptx b/sd/qa/unit/data/fdo71434.pptx
new file mode 100644
index 000000000..384f1f31e
--- /dev/null
+++ b/sd/qa/unit/data/fdo71434.pptx
Binary files differ
diff --git a/sd/qa/unit/data/fdo71961.odp b/sd/qa/unit/data/fdo71961.odp
new file mode 100644
index 000000000..323fbe82a
--- /dev/null
+++ b/sd/qa/unit/data/fdo71961.odp
Binary files differ
diff --git a/sd/qa/unit/data/fdo79731.odp b/sd/qa/unit/data/fdo79731.odp
new file mode 100644
index 000000000..d5d094ae0
--- /dev/null
+++ b/sd/qa/unit/data/fdo79731.odp
Binary files differ
diff --git a/sd/qa/unit/data/fdo84043.odp b/sd/qa/unit/data/fdo84043.odp
new file mode 100644
index 000000000..eed9e79ef
--- /dev/null
+++ b/sd/qa/unit/data/fdo84043.odp
Binary files differ
diff --git a/sd/qa/unit/data/fdo90607.pptx b/sd/qa/unit/data/fdo90607.pptx
new file mode 100644
index 000000000..0c01aa81e
--- /dev/null
+++ b/sd/qa/unit/data/fdo90607.pptx
Binary files differ
diff --git a/sd/qa/unit/data/fit-to-size.fodp b/sd/qa/unit/data/fit-to-size.fodp
new file mode 100644
index 000000000..734cf8a3a
--- /dev/null
+++ b/sd/qa/unit/data/fit-to-size.fodp
@@ -0,0 +1,724 @@
+<?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:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation: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:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" 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.presentation">
+ <office:meta><meta:creation-date>2017-10-18T22:06:17.203271648</meta:creation-date><dc:date>2017-10-19T22:51:45.845520353</dc:date><meta:editing-duration>PT31M43S</meta:editing-duration><meta:editing-cycles>4</meta:editing-cycles><meta:generator>LibreOfficeDev/5.3.8.0.0$Linux_X86_64 LibreOffice_project/a0fae00a2d52960eebbb14f08d2de251e0a8ff3f</meta:generator><meta:document-statistic meta:object-count="31"/></office:meta>
+ <office:font-face-decls>
+ <style:font-face style:name="Arial Black" svg:font-family="&apos;Arial Black&apos;" style:font-family-generic="roman"/>
+ <style:font-face style:name="MS Gothic" svg:font-family="&apos;MS Gothic&apos;" style:font-pitch="variable"/>
+ <style:font-face style:name="Tahoma" svg:font-family="Tahoma" style:font-pitch="variable"/>
+ <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <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="DejaVu Sans" svg:font-family="&apos;DejaVu Sans&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Lohit Devanagari" svg:font-family="&apos;Lohit Devanagari&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Source Han Sans CN Regular" svg:font-family="&apos;Source Han Sans CN Regular&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+ <draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="M10 0l-10 30h20z"/>
+ <style:default-style style:family="graphic">
+ <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap"/>
+ <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" style:line-break="strict" style:writing-mode="lr-tb" 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="24pt" fo:language="de" fo:country="DE" style:font-name-asian="DejaVu Sans" style:font-size-asian="24pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="DejaVu Sans" style:font-size-complex="24pt" style:language-complex="hi" style:country-complex="IN"/>
+ </style:default-style>
+ <style:style style:name="standard" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0cm" svg:stroke-color="#3465a4" draw:marker-start-width="0.2cm" draw:marker-start-center="false" draw:marker-end-width="0.2cm" draw:marker-end-center="false" draw:fill="solid" draw:fill-color="#729fcf" draw:textarea-horizontal-align="justify" fo:padding-top="0.125cm" fo:padding-bottom="0.125cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080">
+ <text:list-style style:name="standard">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="Source Han Sans CN Regular" style:font-family-asian="&apos;Source Han Sans CN Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="18pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Lohit Devanagari" style:font-family-complex="&apos;Lohit Devanagari&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="18pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="objectwitharrow" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0.15cm" svg:stroke-color="#000000" draw:marker-start="Arrow" draw:marker-start-width="0.7cm" draw:marker-start-center="true" draw:marker-end-width="0.3cm"/>
+ </style:style>
+ <style:style style:name="objectwithshadow" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ </style:style>
+ <style:style style:name="objectwithoutfill" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties svg:stroke-color="#000000" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Object_20_with_20_no_20_fill_20_and_20_no_20_line" style:display-name="Object with no fill and no line" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="text" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="textbody" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties fo:font-size="16pt"/>
+ </style:style>
+ <style:style style:name="textbodyjustfied" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:text-align="justify"/>
+ </style:style>
+ <style:style style:name="textbodyindent" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0.6cm"/>
+ </style:style>
+ <style:style style:name="title" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties fo:font-size="44pt"/>
+ </style:style>
+ <style:style style:name="title1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="solid" draw:fill-color="#008080" draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="title2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties svg:stroke-width="0.05cm" draw:fill-color="#ffcc99" draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0.2cm" fo:margin-top="0.1cm" fo:margin-bottom="0.1cm" fo:text-align="center" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-size="36pt"/>
+ </style:style>
+ <style:style style:name="headline" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="headline1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="18pt" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="headline2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="14pt" fo:font-style="italic" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="measure" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#000000" draw:marker-start="Arrow" draw:marker-start-width="0.2cm" draw:marker-end="Arrow" draw:marker-end-width="0.2cm" draw:fill="none" draw:show-unit="true"/>
+ <style:text-properties fo:font-size="12pt"/>
+ </style:style>
+ <style:style style:name="Default-background" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties style:letter-kerning="true"/>
+ </style:style>
+ <style:style style:name="Default-backgroundobjects" style:family="presentation">
+ <style:graphic-properties draw:textarea-horizontal-align="justify" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:text-properties style:letter-kerning="true"/>
+ </style:style>
+ <style:style style:name="Default-notes" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-left="0.6cm" fo:margin-right="0cm" fo:text-indent="-0.6cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="20pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Source Han Sans CN Regular" style:font-family-asian="&apos;Source Han Sans CN Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="20pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Lohit Devanagari" style:font-family-complex="&apos;Lohit Devanagari&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="20pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="Default-outline1" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:auto-grow-height="false" draw:fit-to-size="shrink-to-fit">
+ <text:list-style style:name="Default-outline1">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.3cm" text:min-label-width="0.9cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="–">
+ <style:list-level-properties text:space-before="1.5cm" text:min-label-width="0.9cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="75%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.8cm" text:min-label-width="0.8cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="–">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="75%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="6.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="7.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="9cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="10.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="11.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-top="0.5cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="32pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Source Han Sans CN Regular" style:font-family-asian="&apos;Source Han Sans CN Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="32pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Lohit Devanagari" style:font-family-complex="&apos;Lohit Devanagari&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="32pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="Default-outline2" style:family="presentation" style:parent-style-name="Default-outline1">
+ <style:paragraph-properties fo:margin-top="0.4cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="28pt" style:font-size-asian="28pt" style:font-size-complex="28pt"/>
+ </style:style>
+ <style:style style:name="Default-outline3" style:family="presentation" style:parent-style-name="Default-outline2">
+ <style:paragraph-properties fo:margin-top="0.3cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="24pt" style:font-size-asian="24pt" style:font-size-complex="24pt"/>
+ </style:style>
+ <style:style style:name="Default-outline4" style:family="presentation" style:parent-style-name="Default-outline3">
+ <style:paragraph-properties fo:margin-top="0.2cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline5" style:family="presentation" style:parent-style-name="Default-outline4">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline6" style:family="presentation" style:parent-style-name="Default-outline5">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline7" style:family="presentation" style:parent-style-name="Default-outline6">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline8" style:family="presentation" style:parent-style-name="Default-outline7">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline9" style:family="presentation" style:parent-style-name="Default-outline8">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-subtitle" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-vertical-align="middle">
+ <text:list-style style:name="Default-subtitle">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-align="center" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="32pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Source Han Sans CN Regular" style:font-family-asian="&apos;Source Han Sans CN Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="32pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Lohit Devanagari" style:font-family-complex="&apos;Lohit Devanagari&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="32pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="Default-title" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-vertical-align="middle">
+ <text:list-style style:name="Default-title">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="44pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Source Han Sans CN Regular" style:font-family-asian="&apos;Source Han Sans CN Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="44pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Lohit Devanagari" style:font-family-complex="&apos;Lohit Devanagari&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="44pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:presentation-page-layout style:name="AL0T26">
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="1.743cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="1.743cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="3.612cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="3.612cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="5.481cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="5.481cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ </style:presentation-page-layout>
+ <style:presentation-page-layout style:name="AL1T0">
+ <presentation:placeholder presentation:object="title" svg:x="2.058cm" svg:y="1.743cm" svg:width="23.912cm" svg:height="3.507cm"/>
+ <presentation:placeholder presentation:object="subtitle" svg:x="2.058cm" svg:y="5.838cm" svg:width="23.912cm" svg:height="13.23cm"/>
+ </style:presentation-page-layout>
+ </office:styles>
+ <office:automatic-styles>
+ <style:page-layout style:name="PM0">
+ <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="21cm" fo:page-height="29.7cm" style:print-orientation="portrait"/>
+ </style:page-layout>
+ <style:page-layout style:name="PM1">
+ <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="28cm" fo:page-height="21cm" style:print-orientation="landscape"/>
+ </style:page-layout>
+ <style:style style:name="dp1" style:family="drawing-page">
+ <style:drawing-page-properties draw:background-size="border" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="dp2" style:family="drawing-page">
+ <style:drawing-page-properties presentation:display-header="true" presentation:display-footer="true" presentation:display-page-number="false" presentation:display-date-time="true"/>
+ </style:style>
+ <style:style style:name="dp3" style:family="drawing-page">
+ <style:drawing-page-properties presentation:background-visible="true" presentation:background-objects-visible="true" presentation:display-footer="true" presentation:display-page-number="false" presentation:display-date-time="true"/>
+ </style:style>
+ <style:style style:name="gr1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ </style:style>
+ <style:style style:name="gr2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ </style:style>
+ <style:style style:name="gr3" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0.026cm" svg:stroke-color="#000000" draw:marker-start="" draw:marker-start-width="0.3cm" draw:marker-start-center="false" draw:marker-end="" draw:marker-end-width="0.3cm" draw:marker-end-center="false" draw:stroke-linejoin="miter" draw:fill="solid" draw:fill-color="#000000" draw:textarea-horizontal-align="center" draw:textarea-vertical-align="middle" draw:auto-grow-height="false" draw:fit-to-size="false" fo:min-height="1.14cm" fo:min-width="9.501cm" fo:padding-top="0.13cm" fo:padding-bottom="0.13cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" fo:wrap-option="wrap" draw:shadow="hidden" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:shadow-color="#808080"/>
+ </style:style>
+ <style:style style:name="gr4" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0.026cm" svg:stroke-color="#000000" draw:marker-start="" draw:marker-start-width="0.3cm" draw:marker-start-center="false" draw:marker-end="" draw:marker-end-width="0.3cm" draw:marker-end-center="false" draw:stroke-linejoin="miter" draw:fill="solid" draw:fill-color="#000000" draw:textarea-horizontal-align="justify" draw:textarea-vertical-align="middle" draw:auto-grow-height="false" draw:fit-to-size="all" fo:min-height="1.14cm" fo:min-width="9.501cm" fo:padding-top="0.13cm" fo:padding-bottom="0.13cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" fo:wrap-option="wrap" draw:shadow="hidden" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:shadow-color="#808080"/>
+ </style:style>
+ <style:style style:name="gr5" style:family="graphic">
+ <style:graphic-properties style:protect="size"/>
+ </style:style>
+ <style:style style:name="pr1" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.449cm"/>
+ </style:style>
+ <style:style style:name="pr2" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ </style:style>
+ <style:style style:name="pr3" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ </style:style>
+ <style:style style:name="pr4" style:family="presentation" style:parent-style-name="Default-subtitle">
+ <style:graphic-properties draw:fill-color="#ffffff" draw:fit-to-size="false" fo:min-height="4.686cm"/>
+ </style:style>
+ <style:style style:name="pr5" style:family="presentation" style:parent-style-name="Default-subtitle">
+ <style:graphic-properties draw:fill-color="#ffffff" draw:fit-to-size="true" fo:min-height="5.085cm"/>
+ </style:style>
+ <style:style style:name="pr6" style:family="presentation" style:parent-style-name="Default-subtitle">
+ <style:graphic-properties draw:fill-color="#ffffff" draw:fit-to-size="all" fo:min-height="4.485cm"/>
+ </style:style>
+ <style:style style:name="pr7" style:family="presentation" style:parent-style-name="Default-subtitle">
+ <style:graphic-properties draw:fill-color="#ffffff" draw:fit-to-size="shrink-to-fit" fo:min-height="3.885cm"/>
+ </style:style>
+ <style:style style:name="pr8" style:family="presentation" style:parent-style-name="Default-notes">
+ <style:graphic-properties draw:fill-color="#ffffff" fo:min-height="13.364cm"/>
+ </style:style>
+ <style:style style:name="P1" style:family="paragraph">
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P2" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P3" style:family="paragraph">
+ <style:paragraph-properties fo:text-align="end"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P4" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:paragraph-properties fo:text-align="end"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P5" style:family="paragraph">
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P6" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P7" style:family="paragraph">
+ <loext:graphic-properties draw:fill-color="#ffffff"/>
+ </style:style>
+ <style:style style:name="P8" style:family="paragraph">
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-align="start" fo:text-indent="0cm" style:punctuation-wrap="simple" style:line-break="normal" style:writing-mode="lr-tb">
+ <style:tab-stops/>
+ </style:paragraph-properties>
+ </style:style>
+ <style:style style:name="P9" style:family="paragraph">
+ <loext:graphic-properties draw:fill="solid" draw:fill-color="#000000"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-align="start" fo:text-indent="0cm" style:punctuation-wrap="simple" style:line-break="normal" style:writing-mode="lr-tb">
+ <style:tab-stops/>
+ </style:paragraph-properties>
+ <style:text-properties fo:color="#000000" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:text-position="0% 100%" style:font-name="Arial Black" fo:font-size="24pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="MS Gothic" style:font-size-asian="24pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Tahoma" style:font-size-complex="24pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="T2" style:family="text">
+ <style:text-properties fo:color="#000000" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:text-position="0% 100%" style:font-name="Arial Black" fo:font-size="24pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="MS Gothic" style:font-size-asian="24pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Tahoma" style:font-size-complex="24pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <text:list-style style:name="L1">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ <text:list-style style:name="L2">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </office:automatic-styles>
+ <office:master-styles>
+ <draw:layer-set>
+ <draw:layer draw:name="layout"/>
+ <draw:layer draw:name="background"/>
+ <draw:layer draw:name="backgroundobjects"/>
+ <draw:layer draw:name="controls"/>
+ <draw:layer draw:name="measurelines"/>
+ </draw:layer-set>
+ <style:handout-master presentation:presentation-page-layout-name="AL0T26" style:page-layout-name="PM0" draw:style-name="dp2">
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="6.749cm" svg:x="1cm" svg:y="2.898cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="6.749cm" svg:x="1cm" svg:y="11.474cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="6.749cm" svg:x="1cm" svg:y="20.05cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="6.749cm" svg:x="11cm" svg:y="2.898cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="6.749cm" svg:x="11cm" svg:y="11.474cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="6.749cm" svg:x="11cm" svg:y="20.05cm"/>
+ <draw:frame draw:style-name="gr1" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="0cm" presentation:class="header">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:header/></text:span><presentation:header/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr1" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="0cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><presentation:date-time/></text:span><presentation:date-time/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr2" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="28.215cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:footer/></text:span><presentation:footer/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr2" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="28.215cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span><text:page-number>&lt;number&gt;</text:page-number></text:p>
+ </draw:text-box>
+ </draw:frame>
+ </style:handout-master>
+ <style:master-page style:name="Default" style:page-layout-name="PM1" draw:style-name="dp1">
+ <draw:frame presentation:style-name="Default-title" draw:layer="backgroundobjects" svg:width="25.199cm" svg:height="3.506cm" svg:x="1.4cm" svg:y="0.837cm" presentation:class="title" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="Default-outline1" draw:layer="backgroundobjects" svg:width="25.199cm" svg:height="12.179cm" svg:x="1.4cm" svg:y="4.914cm" presentation:class="outline" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="Default-outline1" draw:layer="backgroundobjects" svg:width="25.199cm" svg:height="12.179cm" svg:x="1.4cm" svg:y="4.914cm" presentation:class="outline" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="6.523cm" svg:height="1.448cm" svg:x="1.4cm" svg:y="19.131cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:date-time/></text:span><presentation:date-time/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P6" draw:layer="backgroundobjects" svg:width="8.875cm" svg:height="1.448cm" svg:x="9.576cm" svg:y="19.131cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P5"><text:span text:style-name="T1"><presentation:footer/></text:span><presentation:footer/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="6.523cm" svg:height="1.448cm" svg:x="20.076cm" svg:y="19.131cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span><text:page-number>&lt;number&gt;</text:page-number></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <presentation:notes style:page-layout-name="PM0">
+ <draw:page-thumbnail presentation:style-name="Default-title" draw:layer="backgroundobjects" svg:width="14.848cm" svg:height="11.136cm" svg:x="3.075cm" svg:y="2.257cm" presentation:class="page"/>
+ <draw:frame presentation:style-name="Default-notes" draw:layer="backgroundobjects" svg:width="16.799cm" svg:height="13.364cm" svg:x="2.1cm" svg:y="14.107cm" presentation:class="notes" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="Default-notes" draw:layer="backgroundobjects" svg:width="16.799cm" svg:height="13.364cm" svg:x="2.1cm" svg:y="14.107cm" presentation:class="notes" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr2" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="0cm" presentation:class="header">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:header/></text:span><presentation:header/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr2" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="0cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><presentation:date-time/></text:span><presentation:date-time/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr3" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="28.215cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:footer/></text:span><presentation:footer/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr3" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="28.215cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span><text:page-number>&lt;number&gt;</text:page-number></text:p>
+ </draw:text-box>
+ </draw:frame>
+ </presentation:notes>
+ </style:master-page>
+ </office:master-styles>
+ <office:body>
+ <office:presentation>
+ <draw:page draw:name="page1" draw:style-name="dp3" draw:master-page-name="Default" presentation:presentation-page-layout-name="AL1T0">
+ <draw:frame presentation:style-name="pr4" draw:text-style-name="P7" draw:layer="layout" svg:width="12.4cm" svg:height="4.686cm" svg:x="1.4cm" svg:y="2cm" presentation:class="subtitle" presentation:user-transformed="true">
+ <draw:text-box>
+ <text:p>1</text:p>
+ <text:p>foo</text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr5" draw:text-style-name="P7" draw:layer="layout" svg:width="12.599cm" svg:height="5.085cm" svg:x="14cm" svg:y="2.4cm">
+ <draw:text-box>
+ <text:p>2</text:p>
+ <text:p>foo</text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr6" draw:text-style-name="P7" draw:layer="layout" svg:width="12.599cm" svg:height="4.485cm" svg:x="1.201cm" svg:y="10.115cm">
+ <draw:text-box>
+ <text:p>3</text:p>
+ <text:p>foo</text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr7" draw:text-style-name="P7" draw:layer="layout" svg:width="12.399cm" svg:height="3.885cm" svg:x="14.2cm" svg:y="10.2cm">
+ <draw:text-box>
+ <text:p>4</text:p>
+ <text:p>foo</text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:custom-shape draw:style-name="gr3" draw:text-style-name="P9" draw:layer="layout" svg:width="10cm" svg:height="1.4cm" svg:x="2.6cm" svg:y="18cm">
+ <text:p text:style-name="P8"><text:span text:style-name="T2">5</text:span></text:p>
+ <text:p text:style-name="P8"><text:span text:style-name="T2">Fontwork</text:span></text:p>
+ <draw:enhanced-geometry svg:viewBox="0 0 21600 21600" draw:glue-points="?f18 ?f0 ?f20 10800 ?f19 ?f1 ?f21 10800" draw:text-areas="0 0 21600 21600" draw:text-path="true" draw:text-path-mode="shape" draw:text-path-scale="path" draw:text-path-same-letter-heights="false" draw:type="fontwork-wave" draw:modifiers="4460 10800" draw:enhanced-path="M ?f7 ?f0 C ?f15 ?f9 ?f16 ?f10 ?f12 ?f0 N M ?f29 ?f1 C ?f27 ?f28 ?f25 ?f26 ?f24 ?f1 N">
+ <draw:equation draw:name="f0" draw:formula="$0 "/>
+ <draw:equation draw:name="f1" draw:formula="21600-?f0 "/>
+ <draw:equation draw:name="f2" draw:formula="$1 "/>
+ <draw:equation draw:name="f3" draw:formula="?f2 -10800"/>
+ <draw:equation draw:name="f4" draw:formula="?f3 *2"/>
+ <draw:equation draw:name="f5" draw:formula="abs(?f4 )"/>
+ <draw:equation draw:name="f6" draw:formula="4320-?f5 "/>
+ <draw:equation draw:name="f7" draw:formula="if(?f3 ,0,?f5 )"/>
+ <draw:equation draw:name="f8" draw:formula="15800*?f0 /4460"/>
+ <draw:equation draw:name="f9" draw:formula="?f0 -?f8 "/>
+ <draw:equation draw:name="f10" draw:formula="?f0 +?f8 "/>
+ <draw:equation draw:name="f11" draw:formula="21600-?f4 "/>
+ <draw:equation draw:name="f12" draw:formula="if(?f3 ,?f11 ,21600)"/>
+ <draw:equation draw:name="f13" draw:formula="?f12 -?f7 "/>
+ <draw:equation draw:name="f14" draw:formula="?f5 /2"/>
+ <draw:equation draw:name="f15" draw:formula="?f7 +7200-?f14 "/>
+ <draw:equation draw:name="f16" draw:formula="?f12 +?f14 -7200"/>
+ <draw:equation draw:name="f17" draw:formula="?f13 /2"/>
+ <draw:equation draw:name="f18" draw:formula="?f7 +?f17 "/>
+ <draw:equation draw:name="f19" draw:formula="21600-?f18 "/>
+ <draw:equation draw:name="f20" draw:formula="?f5 /2"/>
+ <draw:equation draw:name="f21" draw:formula="21600-?f20 "/>
+ <draw:equation draw:name="f22" draw:formula="?f0 *2"/>
+ <draw:equation draw:name="f23" draw:formula="21600-?f22 "/>
+ <draw:equation draw:name="f24" draw:formula="21600-?f7 "/>
+ <draw:equation draw:name="f25" draw:formula="21600-?f15 "/>
+ <draw:equation draw:name="f26" draw:formula="?f1 +?f8 "/>
+ <draw:equation draw:name="f27" draw:formula="21600-?f16 "/>
+ <draw:equation draw:name="f28" draw:formula="?f1 -?f8 "/>
+ <draw:equation draw:name="f29" draw:formula="21600-?f12 "/>
+ <draw:handle draw:handle-position="left $0" draw:handle-range-y-minimum="0" draw:handle-range-y-maximum="4460"/>
+ <draw:handle draw:handle-position="$1 21600" draw:handle-range-x-minimum="8640" draw:handle-range-x-maximum="12960"/>
+ </draw:enhanced-geometry>
+ </draw:custom-shape>
+ <draw:custom-shape draw:style-name="gr4" draw:text-style-name="P9" draw:layer="layout" svg:width="10cm" svg:height="1.4cm" svg:x="15cm" svg:y="18cm">
+ <text:p text:style-name="P8"><text:span text:style-name="T2">6</text:span></text:p>
+ <text:p text:style-name="P8"><text:span text:style-name="T2">Fontwork</text:span></text:p>
+ <draw:enhanced-geometry svg:viewBox="0 0 21600 21600" draw:glue-points="?f18 ?f0 ?f20 10800 ?f19 ?f1 ?f21 10800" draw:text-areas="0 0 21600 21600" draw:text-path="true" draw:text-path-mode="shape" draw:text-path-scale="path" draw:text-path-same-letter-heights="false" draw:type="fontwork-wave" draw:modifiers="4460 10800" draw:enhanced-path="M ?f7 ?f0 C ?f15 ?f9 ?f16 ?f10 ?f12 ?f0 N M ?f29 ?f1 C ?f27 ?f28 ?f25 ?f26 ?f24 ?f1 N">
+ <draw:equation draw:name="f0" draw:formula="$0 "/>
+ <draw:equation draw:name="f1" draw:formula="21600-?f0 "/>
+ <draw:equation draw:name="f2" draw:formula="$1 "/>
+ <draw:equation draw:name="f3" draw:formula="?f2 -10800"/>
+ <draw:equation draw:name="f4" draw:formula="?f3 *2"/>
+ <draw:equation draw:name="f5" draw:formula="abs(?f4 )"/>
+ <draw:equation draw:name="f6" draw:formula="4320-?f5 "/>
+ <draw:equation draw:name="f7" draw:formula="if(?f3 ,0,?f5 )"/>
+ <draw:equation draw:name="f8" draw:formula="15800*?f0 /4460"/>
+ <draw:equation draw:name="f9" draw:formula="?f0 -?f8 "/>
+ <draw:equation draw:name="f10" draw:formula="?f0 +?f8 "/>
+ <draw:equation draw:name="f11" draw:formula="21600-?f4 "/>
+ <draw:equation draw:name="f12" draw:formula="if(?f3 ,?f11 ,21600)"/>
+ <draw:equation draw:name="f13" draw:formula="?f12 -?f7 "/>
+ <draw:equation draw:name="f14" draw:formula="?f5 /2"/>
+ <draw:equation draw:name="f15" draw:formula="?f7 +7200-?f14 "/>
+ <draw:equation draw:name="f16" draw:formula="?f12 +?f14 -7200"/>
+ <draw:equation draw:name="f17" draw:formula="?f13 /2"/>
+ <draw:equation draw:name="f18" draw:formula="?f7 +?f17 "/>
+ <draw:equation draw:name="f19" draw:formula="21600-?f18 "/>
+ <draw:equation draw:name="f20" draw:formula="?f5 /2"/>
+ <draw:equation draw:name="f21" draw:formula="21600-?f20 "/>
+ <draw:equation draw:name="f22" draw:formula="?f0 *2"/>
+ <draw:equation draw:name="f23" draw:formula="21600-?f22 "/>
+ <draw:equation draw:name="f24" draw:formula="21600-?f7 "/>
+ <draw:equation draw:name="f25" draw:formula="21600-?f15 "/>
+ <draw:equation draw:name="f26" draw:formula="?f1 +?f8 "/>
+ <draw:equation draw:name="f27" draw:formula="21600-?f16 "/>
+ <draw:equation draw:name="f28" draw:formula="?f1 -?f8 "/>
+ <draw:equation draw:name="f29" draw:formula="21600-?f12 "/>
+ <draw:handle draw:handle-position="left $0" draw:handle-range-y-minimum="0" draw:handle-range-y-maximum="4460"/>
+ <draw:handle draw:handle-position="$1 21600" draw:handle-range-x-minimum="8640" draw:handle-range-x-maximum="12960"/>
+ </draw:enhanced-geometry>
+ </draw:custom-shape>
+ <presentation:notes draw:style-name="dp2">
+ <draw:page-thumbnail draw:style-name="gr5" draw:layer="layout" svg:width="14.848cm" svg:height="11.136cm" svg:x="3.075cm" svg:y="2.257cm" draw:page-number="1" presentation:class="page"/>
+ <draw:frame presentation:style-name="pr8" draw:text-style-name="P7" draw:layer="layout" svg:width="16.799cm" svg:height="13.364cm" svg:x="2.1cm" svg:y="14.107cm" presentation:class="notes" presentation:placeholder="true" presentation:user-transformed="true">
+ <draw:text-box/>
+ </draw:frame>
+ </presentation:notes>
+ </draw:page>
+ <presentation:settings presentation:mouse-visible="false"/>
+ </office:presentation>
+ </office:body>
+</office:document>
diff --git a/sd/qa/unit/data/media_embedding.odp b/sd/qa/unit/data/media_embedding.odp
new file mode 100644
index 000000000..8069b3f57
--- /dev/null
+++ b/sd/qa/unit/data/media_embedding.odp
Binary files differ
diff --git a/sd/qa/unit/data/n593612.pptx b/sd/qa/unit/data/n593612.pptx
new file mode 100644
index 000000000..2ba3eebab
--- /dev/null
+++ b/sd/qa/unit/data/n593612.pptx
Binary files differ
diff --git a/sd/qa/unit/data/n758621.ppt b/sd/qa/unit/data/n758621.ppt
new file mode 100644
index 000000000..1470efa2b
--- /dev/null
+++ b/sd/qa/unit/data/n758621.ppt
Binary files differ
diff --git a/sd/qa/unit/data/n759180.pptx b/sd/qa/unit/data/n759180.pptx
new file mode 100644
index 000000000..16cbf9adb
--- /dev/null
+++ b/sd/qa/unit/data/n759180.pptx
Binary files differ
diff --git a/sd/qa/unit/data/n762695.pptx b/sd/qa/unit/data/n762695.pptx
new file mode 100644
index 000000000..cf547f382
--- /dev/null
+++ b/sd/qa/unit/data/n762695.pptx
Binary files differ
diff --git a/sd/qa/unit/data/n819614.pptx b/sd/qa/unit/data/n819614.pptx
new file mode 100644
index 000000000..67e8ca2d9
--- /dev/null
+++ b/sd/qa/unit/data/n819614.pptx
Binary files differ
diff --git a/sd/qa/unit/data/n820786.pptx b/sd/qa/unit/data/n820786.pptx
new file mode 100644
index 000000000..d778b7492
--- /dev/null
+++ b/sd/qa/unit/data/n820786.pptx
Binary files differ
diff --git a/sd/qa/unit/data/n828390_4.odp b/sd/qa/unit/data/n828390_4.odp
new file mode 100644
index 000000000..888611cc0
--- /dev/null
+++ b/sd/qa/unit/data/n828390_4.odp
Binary files differ
diff --git a/sd/qa/unit/data/n828390_5.odp b/sd/qa/unit/data/n828390_5.odp
new file mode 100644
index 000000000..29cb8afc0
--- /dev/null
+++ b/sd/qa/unit/data/n828390_5.odp
Binary files differ
diff --git a/sd/qa/unit/data/n902652.pptx b/sd/qa/unit/data/n902652.pptx
new file mode 100644
index 000000000..87266001b
--- /dev/null
+++ b/sd/qa/unit/data/n902652.pptx
Binary files differ
diff --git a/sd/qa/unit/data/objectwithtext.fodg b/sd/qa/unit/data/objectwithtext.fodg
new file mode 100644
index 000000000..f58a377f2
--- /dev/null
+++ b/sd/qa/unit/data/objectwithtext.fodg
@@ -0,0 +1,189 @@
+<?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:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation: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:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" 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.graphics">
+ <office:meta><meta:creation-date>2017-11-06T19:36:05.770859258</meta:creation-date><dc:date>2017-11-06T19:38:11.864425937</dc:date><meta:editing-duration>PT2M6S</meta:editing-duration><meta:editing-cycles>1</meta:editing-cycles><meta:document-statistic meta:object-count="1"/><meta:generator>LibreOfficeDev/6.0.0.0.alpha1$Linux_X86_64 LibreOffice_project/2f8c1379a07d581ac46337ca0f91609c544c3d6e</meta:generator></office:meta>
+ <office:font-face-decls>
+ <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <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="DejaVu Sans" svg:font-family="&apos;DejaVu Sans&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Lohit Devanagari" svg:font-family="&apos;Lohit Devanagari&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Source Han Sans CN Regular" svg:font-family="&apos;Source Han Sans CN Regular&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+ <draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="M10 0l-10 30h20z"/>
+ <style:default-style style:family="graphic">
+ <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap"/>
+ <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" 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="24pt" fo:language="de" fo:country="DE" style:font-name-asian="DejaVu Sans" style:font-size-asian="24pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="DejaVu Sans" style:font-size-complex="24pt" style:language-complex="hi" style:country-complex="IN"/>
+ </style:default-style>
+ <style:style style:name="standard" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0cm" svg:stroke-color="#3465a4" draw:marker-start-width="0.2cm" draw:marker-start-center="false" draw:marker-end-width="0.2cm" draw:marker-end-center="false" draw:fill="solid" draw:fill-color="#729fcf" draw:textarea-horizontal-align="justify" fo:padding-top="0.125cm" fo:padding-bottom="0.125cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080">
+ <text:list-style style:name="standard">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="Source Han Sans CN Regular" style:font-family-asian="&apos;Source Han Sans CN Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="18pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Lohit Devanagari" style:font-family-complex="&apos;Lohit Devanagari&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="18pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="objectwitharrow" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0.15cm" svg:stroke-color="#000000" draw:marker-start="Arrow" draw:marker-start-width="0.7cm" draw:marker-start-center="true" draw:marker-end-width="0.3cm"/>
+ </style:style>
+ <style:style style:name="objectwithshadow" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ </style:style>
+ <style:style style:name="objectwithoutfill" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties svg:stroke-color="#000000" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Object_20_with_20_no_20_fill_20_and_20_no_20_line" style:display-name="Object with no fill and no line" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="text" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="textbody" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties fo:font-size="16pt"/>
+ </style:style>
+ <style:style style:name="textbodyjustfied" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:text-align="justify"/>
+ </style:style>
+ <style:style style:name="textbodyindent" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0.6cm"/>
+ </style:style>
+ <style:style style:name="title" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties fo:font-size="44pt"/>
+ </style:style>
+ <style:style style:name="title1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="solid" draw:fill-color="#008080" draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="title2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties svg:stroke-width="0.05cm" draw:fill-color="#ffcc99" draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0.2cm" fo:margin-top="0.1cm" fo:margin-bottom="0.1cm" fo:text-align="center" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-size="36pt"/>
+ </style:style>
+ <style:style style:name="headline" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="headline1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="18pt" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="headline2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="14pt" fo:font-style="italic" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="measure" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#000000" draw:marker-start="Arrow" draw:marker-start-width="0.2cm" draw:marker-end="Arrow" draw:marker-end-width="0.2cm" draw:fill="none" draw:show-unit="true"/>
+ <style:text-properties fo:font-size="12pt"/>
+ </style:style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:page-layout style:name="PM0">
+ <style:page-layout-properties fo:margin-top="1cm" fo:margin-bottom="1cm" fo:margin-left="1cm" fo:margin-right="1cm" fo:page-width="21cm" fo:page-height="29.7cm" style:print-orientation="portrait"/>
+ </style:page-layout>
+ <style:style style:name="dp1" style:family="drawing-page">
+ <style:drawing-page-properties draw:background-size="border" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="dp2" style:family="drawing-page"/>
+ <style:style style:name="gr1" style:family="graphic" style:parent-style-name="Object_20_with_20_no_20_fill_20_and_20_no_20_line">
+ <style:graphic-properties draw:textarea-vertical-align="middle" draw:ole-draw-aspect="1" style:protect="size"/>
+ </style:style>
+ <style:style style:name="P1" style:family="paragraph">
+ <style:paragraph-properties fo:text-align="center"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:master-styles>
+ <draw:layer-set>
+ <draw:layer draw:name="layout"/>
+ <draw:layer draw:name="background"/>
+ <draw:layer draw:name="backgroundobjects"/>
+ <draw:layer draw:name="controls"/>
+ <draw:layer draw:name="measurelines"/>
+ </draw:layer-set>
+ <style:master-page style:name="Default" style:page-layout-name="PM0" draw:style-name="dp1"/>
+ </office:master-styles>
+ <office:body>
+ <office:drawing>
+ <draw:page draw:name="page1" draw:style-name="dp2" draw:master-page-name="Default">
+ <draw:frame draw:style-name="gr1" draw:text-style-name="P1" draw:layer="layout" svg:width="5cm" svg:height="2.6cm" svg:x="9.651cm" svg:y="14.29cm">
+ <draw:object>
+ <loext:p text:style-name="P1">foobar</loext:p>
+ <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
+ <semantics>
+ <mrow>
+ <mn>1</mn>
+ <mo stretchy="false">+</mo>
+ <mn>1</mn>
+ </mrow>
+ <annotation encoding="StarMath 5.0">1+1</annotation>
+ </semantics>
+ </math>
+ </draw:object><draw:image>
+ <office:binary-data>VkNMTVRGAQAxAAAAAAAAAAEAGwAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAZYDAADX
+ AQAAHQAAAJYAAQACAAAACQCLAAEAAgAAAP//gQABABAAAAAAAAAAAAAAAJUDAADWAQAAlQAB
+ AAQAAAAAAAAAlgABAAIAAAAJAIsAAQACAAAAHwCKAAEAQgAAAAMAPAAAABAATGliZXJhdGlv
+ biBTZXJpZgAAAAAAAKYBAAAAAAAAAAAFAAAAAAAAAP8DAAAAAAAAAAEA/wMAAAAAAIgAAQAC
+ AAAAAQCHAAEABQAAAP////8AhgABAAQAAAAAAAAAcgACABcAAABqAAAAcgEAAAEAMdQAAAAA
+ AAEAAQAxAIwAAQAAAAAAiwABAAIAAAAfAIoAAQA8AAAAAwA2AAAACgBPcGVuU3ltYm9sAAAA
+ AAAApgEAAP//AAAAAAUAAAAAAAAA/wMAAAAAAAAAAQD/AwAAAAAAiAABAAIAAAABAIcAAQAF
+ AAAA/////wCGAAEABAAAAAAAAAByAAIAGgAAAFgBAAByAQAAAQAAACsA9gAAAAAAAQABACsA
+ jAABAAAAAACLAAEAAgAAAB8AigABAEIAAAADADwAAAAQAExpYmVyYXRpb24gU2VyaWYAAAAA
+ AACmAQAAAAAAAAAABQAAAAAAAAD/AwAAAAAAAAABAP8DAAAAAACIAAEAAgAAAAEAhwABAAUA
+ AAD/////AIYAAQAEAAAAAAAAAHIAAgAXAAAAYQIAAHIBAAABADHUAAAAAAABAAEAMQCMAAEA
+ AAAAAJUAAQAEAAAAAAAAAJYAAQACAAAACQCMAAEAAAAAAA==
+ </office:binary-data>
+ </draw:image>
+ </draw:frame>
+ </draw:page>
+ </office:drawing>
+ </office:body>
+</office:document>
diff --git a/sd/qa/unit/data/odg/fail/.gitignore b/sd/qa/unit/data/odg/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/odg/fail/.gitignore
diff --git a/sd/qa/unit/data/odg/glow.odg b/sd/qa/unit/data/odg/glow.odg
new file mode 100644
index 000000000..9020f663b
--- /dev/null
+++ b/sd/qa/unit/data/odg/glow.odg
Binary files differ
diff --git a/sd/qa/unit/data/odg/gradient-angle.fodg b/sd/qa/unit/data/odg/gradient-angle.fodg
new file mode 100644
index 000000000..6ad3b1ddf
--- /dev/null
+++ b/sd/qa/unit/data/odg/gradient-angle.fodg
@@ -0,0 +1,211 @@
+<?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:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation: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:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" 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.graphics">
+ <office:meta><meta:initial-creator>ms </meta:initial-creator><meta:creation-date>2015-10-09T14:51:21.086447801</meta:creation-date><dc:date>2015-10-09T14:54:47.829092906</dc:date><dc:creator>ms </dc:creator><meta:editing-duration>PT3M27S</meta:editing-duration><meta:editing-cycles>1</meta:editing-cycles><meta:generator>LibreOfficeDev/5.1.0.0.alpha1$Linux_X86_64 LibreOffice_project/83c5214889c712646e45dc1c19b6d3c13a05aa83</meta:generator><meta:document-statistic meta:object-count="1"/></office:meta>
+ <office:font-face-decls>
+ <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <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="DejaVu Sans" svg:font-family="&apos;DejaVu Sans&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Lohit Devanagari" svg:font-family="&apos;Lohit Devanagari&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Source Han Sans CN Regular" svg:font-family="&apos;Source Han Sans CN Regular&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+ <draw:gradient draw:name="Gradient_20_10" draw:display-name="Gradient 10" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="27deg" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_11" draw:display-name="Gradient 11" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="2rad" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_12" draw:display-name="Gradient 12" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="100grad" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_13" draw:display-name="Gradient 13" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="-1" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_14" draw:display-name="Gradient 14" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="-1rad" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_15" draw:display-name="Gradient 15" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="3900" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_16" draw:display-name="Gradient 16" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="10.5deg" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_17" draw:display-name="Gradient 17" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="3.14159265358979323846rad" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_18" draw:display-name="Gradient 18" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="190" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_19" draw:display-name="Gradient 19" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="180" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_2" draw:display-name="Gradient 2" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="320" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_20" draw:display-name="Gradient 20" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="170" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_21" draw:display-name="Gradient 21" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="160" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_22" draw:display-name="Gradient 22" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="150" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_23" draw:display-name="Gradient 23" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="140" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_24" draw:display-name="Gradient 24" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="130" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_25" draw:display-name="Gradient 25" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="120" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_26" draw:display-name="Gradient 26" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="110" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_27" draw:display-name="Gradient 27" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="100" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_28" draw:display-name="Gradient 28" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="90" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_29" draw:display-name="Gradient 29" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="80" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_3" draw:display-name="Gradient 3" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="330" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_30" draw:display-name="Gradient 30" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="70" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_31" draw:display-name="Gradient 31" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="60" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_32" draw:display-name="Gradient 32" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="50" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_33" draw:display-name="Gradient 33" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="40" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_34" draw:display-name="Gradient 34" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="30" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_35" draw:display-name="Gradient 35" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="20" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_36" draw:display-name="Gradient 36" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="10" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_37" draw:display-name="Gradient 37" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="0" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_38" draw:display-name="Gradient 38" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="3600" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_39" draw:display-name="Gradient 39" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="3590" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_4" draw:display-name="Gradient 4" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="340" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_40" draw:display-name="Gradient 40" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="3580" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_5" draw:display-name="Gradient 5" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="350" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_6" draw:display-name="Gradient 6" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="360" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_7" draw:display-name="Gradient 7" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="300" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_8" draw:display-name="Gradient 8" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="290" draw:border="0%"/>
+ <draw:gradient draw:name="Gradient_20_9" draw:display-name="Gradient 9" draw:style="linear" draw:start-color="#8ae234" draw:end-color="#4e9a06" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="280" draw:border="0%"/>
+ <draw:opacity draw:name="Transparency_20_1" draw:display-name="Transparency 1" draw:style="linear" draw:start="100%" draw:end="0%" draw:angle="90deg" draw:border="0%"/>
+ <draw:opacity draw:name="Transparency_20_2" draw:display-name="Transparency 2" draw:style="linear" draw:start="100%" draw:end="0%" draw:angle="10" draw:border="0%"/>
+ <draw:opacity draw:name="Transparency_20_3" draw:display-name="Transparency 3" draw:style="linear" draw:start="100%" draw:end="0%" draw:angle="1.0rad" draw:border="0%"/>
+ <draw:opacity draw:name="Transparency_20_4" draw:display-name="Transparency 4" draw:style="linear" draw:start="100%" draw:end="0%" draw:angle="1000grad" draw:border="0%"/>
+ <draw:opacity draw:name="Transparency_20_5" draw:display-name="Transparency 5" draw:style="linear" draw:start="100%" draw:end="0%" draw:angle="3580" draw:border="0%"/>
+ <draw:opacity draw:name="Transparency_20_6" draw:display-name="Transparency 6" draw:style="linear" draw:start="100%" draw:end="0%" draw:angle="3570" draw:border="0%"/>
+ <draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="M10 0l-10 30h20z"/>
+ <style:default-style style:family="graphic">
+ <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap"/>
+ <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" style:line-break="strict" style:writing-mode="lr-tb" 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="24pt" fo:language="de" fo:country="DE" style:font-name-asian="DejaVu Sans" style:font-size-asian="24pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="DejaVu Sans" style:font-size-complex="24pt" style:language-complex="hi" style:country-complex="IN"/>
+ </style:default-style>
+ <style:style style:name="standard" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0cm" svg:stroke-color="#3465a4" draw:marker-start-width="0.2cm" draw:marker-start-center="false" draw:marker-end-width="0.2cm" draw:marker-end-center="false" draw:fill="solid" draw:fill-color="#729fcf" draw:textarea-horizontal-align="justify" fo:padding-top="0.125cm" fo:padding-bottom="0.125cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080">
+ <text:list-style style:name="standard">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="Source Han Sans CN Regular" style:font-family-asian="&apos;Source Han Sans CN Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="18pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Lohit Devanagari" style:font-family-complex="&apos;Lohit Devanagari&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="18pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="objectwitharrow" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0.15cm" svg:stroke-color="#000000" draw:marker-start="Arrow" draw:marker-start-width="0.7cm" draw:marker-start-center="true" draw:marker-end-width="0.3cm"/>
+ </style:style>
+ <style:style style:name="objectwithshadow" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ </style:style>
+ <style:style style:name="objectwithoutfill" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties svg:stroke-color="#000000" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Object_20_with_20_no_20_fill_20_and_20_no_20_line" style:display-name="Object with no fill and no line" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="text" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="textbody" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties fo:font-size="16pt"/>
+ </style:style>
+ <style:style style:name="textbodyjustfied" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:text-align="justify"/>
+ </style:style>
+ <style:style style:name="textbodyindent" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0.6cm"/>
+ </style:style>
+ <style:style style:name="title" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties fo:font-size="44pt"/>
+ </style:style>
+ <style:style style:name="title1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="solid" draw:fill-color="#008080" draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="title2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties svg:stroke-width="0.05cm" draw:fill-color="#ffcc99" draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0.2cm" fo:margin-top="0.1cm" fo:margin-bottom="0.1cm" fo:text-align="center" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-size="36pt"/>
+ </style:style>
+ <style:style style:name="headline" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="headline1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="18pt" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="headline2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="14pt" fo:font-style="italic" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="measure" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#000000" draw:marker-start="Arrow" draw:marker-start-width="0.2cm" draw:marker-end="Arrow" draw:marker-end-width="0.2cm" draw:fill="none" draw:show-unit="true"/>
+ <style:text-properties fo:font-size="12pt"/>
+ </style:style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:page-layout style:name="PM0">
+ <style:page-layout-properties fo:margin-top="1cm" fo:margin-bottom="1cm" fo:margin-left="1cm" fo:margin-right="1cm" fo:page-width="21cm" fo:page-height="29.7cm" style:print-orientation="portrait"/>
+ </style:page-layout>
+ <style:style style:name="dp1" style:family="drawing-page">
+ <style:drawing-page-properties draw:background-size="border" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="dp2" style:family="drawing-page"/>
+ <style:style style:name="gr1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:fill="gradient" draw:fill-gradient-name="Gradient_20_38" draw:opacity="100%" draw:opacity-name="Transparency_20_2" draw:textarea-horizontal-align="justify" draw:textarea-vertical-align="middle" draw:auto-grow-height="false" fo:min-height="4.35cm" fo:min-width="10.1cm"/>
+ </style:style>
+ <style:style style:name="P1" style:family="paragraph">
+ <loext:graphic-properties draw:fill="gradient" draw:fill-gradient-name="Gradient_20_38" draw:opacity="100%" draw:opacity-name="Transparency_20_2"/>
+ <style:paragraph-properties fo:text-align="center"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:master-styles>
+ <draw:layer-set>
+ <draw:layer draw:name="layout"/>
+ <draw:layer draw:name="background"/>
+ <draw:layer draw:name="backgroundobjects"/>
+ <draw:layer draw:name="controls"/>
+ <draw:layer draw:name="measurelines"/>
+ </draw:layer-set>
+ <style:master-page style:name="Default" style:page-layout-name="PM0" draw:style-name="dp1"/>
+ </office:master-styles>
+ <office:body>
+ <office:drawing>
+ <draw:page draw:name="page1" draw:style-name="dp2" draw:master-page-name="Default">
+ <draw:custom-shape draw:style-name="gr1" draw:text-style-name="P1" draw:layer="layout" svg:width="10.6cm" svg:height="4.6cm" svg:x="3.9cm" svg:y="2.5cm">
+ <text:p/>
+ <draw:enhanced-geometry svg:viewBox="0 0 21600 21600" draw:type="rectangle" draw:enhanced-path="M 0 0 L 21600 0 21600 21600 0 21600 0 0 Z N"/>
+ </draw:custom-shape>
+ </draw:page>
+ </office:drawing>
+ </office:body>
+</office:document>
diff --git a/sd/qa/unit/data/odg/indeterminate/.gitignore b/sd/qa/unit/data/odg/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/odg/indeterminate/.gitignore
diff --git a/sd/qa/unit/data/odg/ooo124143-1.odg b/sd/qa/unit/data/odg/ooo124143-1.odg
new file mode 100644
index 000000000..8e341cbc7
--- /dev/null
+++ b/sd/qa/unit/data/odg/ooo124143-1.odg
Binary files differ
diff --git a/sd/qa/unit/data/odg/pass/.gitignore b/sd/qa/unit/data/odg/pass/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/odg/pass/.gitignore
diff --git a/sd/qa/unit/data/odg/pass/CVE-2012-4233-2.odg b/sd/qa/unit/data/odg/pass/CVE-2012-4233-2.odg
new file mode 100644
index 000000000..321bd9cdb
--- /dev/null
+++ b/sd/qa/unit/data/odg/pass/CVE-2012-4233-2.odg
Binary files differ
diff --git a/sd/qa/unit/data/odg/rhbz1870501.odg b/sd/qa/unit/data/odg/rhbz1870501.odg
new file mode 100644
index 000000000..cc4bcef19
--- /dev/null
+++ b/sd/qa/unit/data/odg/rhbz1870501.odg
Binary files differ
diff --git a/sd/qa/unit/data/odg/shadow-blur.odg b/sd/qa/unit/data/odg/shadow-blur.odg
new file mode 100644
index 000000000..a67b8e186
--- /dev/null
+++ b/sd/qa/unit/data/odg/shadow-blur.odg
Binary files differ
diff --git a/sd/qa/unit/data/odg/softedges.odg b/sd/qa/unit/data/odg/softedges.odg
new file mode 100644
index 000000000..a1fcab90e
--- /dev/null
+++ b/sd/qa/unit/data/odg/softedges.odg
Binary files differ
diff --git a/sd/qa/unit/data/odg/tb-rl-textbox.odg b/sd/qa/unit/data/odg/tb-rl-textbox.odg
new file mode 100644
index 000000000..95dda6208
--- /dev/null
+++ b/sd/qa/unit/data/odg/tb-rl-textbox.odg
Binary files differ
diff --git a/sd/qa/unit/data/odg/tdf114488.fodg b/sd/qa/unit/data/odg/tdf114488.fodg
new file mode 100644
index 000000000..41a3c497d
--- /dev/null
+++ b/sd/qa/unit/data/odg/tdf114488.fodg
@@ -0,0 +1,365 @@
+<?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:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation: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:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" 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.graphics">
+ <office:meta><dc:date>2016-12-14T10:36:44.079000000</dc:date><meta:editing-duration>PT2M21S</meta:editing-duration><meta:editing-cycles>1</meta:editing-cycles><meta:generator>LibreOfficeDev/6.1.0.0.alpha0$Linux_X86_64 LibreOffice_project/d36007ffd98bc9ed2f8ca6151a5283bd46a92485</meta:generator><meta:document-statistic meta:object-count="1"/></office:meta>
+ <office:settings>
+ <config:config-item-set config:name="ooo:view-settings">
+ <config:config-item config:name="VisibleAreaTop" config:type="int">-817</config:config-item>
+ <config:config-item config:name="VisibleAreaLeft" config:type="int">-127</config:config-item>
+ <config:config-item config:name="VisibleAreaWidth" config:type="int">10457</config:config-item>
+ <config:config-item config:name="VisibleAreaHeight" config:type="int">6649</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">view1</config:config-item>
+ <config:config-item config:name="GridIsVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="GridIsFront" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsSnapToGrid" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToPageMargins" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToSnapLines" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsSnapToObjectFrame" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsSnapToObjectPoints" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPlusHandlesAlwaysVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsFrameDragSingles" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EliminatePolyPointLimitAngle" config:type="int">1500</config:config-item>
+ <config:config-item config:name="IsEliminatePolyPoints" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="VisibleLayers" config:type="base64Binary">//////////////////////////////////////////8=</config:config-item>
+ <config:config-item config:name="PrintableLayers" config:type="base64Binary">//////////////////////////////////////////8=</config:config-item>
+ <config:config-item config:name="LockedLayers" config:type="base64Binary"/>
+ <config:config-item config:name="NoAttribs" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="NoColors" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="RulerIsVisible" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="PageKind" config:type="short">0</config:config-item>
+ <config:config-item config:name="SelectedPage" config:type="short">0</config:config-item>
+ <config:config-item config:name="IsLayerMode" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsDoubleClickTextEdit" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsClickChangeRotation" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="SlidesPerRow" config:type="short">4</config:config-item>
+ <config:config-item config:name="EditMode" config:type="int">0</config:config-item>
+ <config:config-item config:name="VisibleAreaTop" config:type="int">-940</config:config-item>
+ <config:config-item config:name="VisibleAreaLeft" config:type="int">787</config:config-item>
+ <config:config-item config:name="VisibleAreaWidth" config:type="int">8624</config:config-item>
+ <config:config-item config:name="VisibleAreaHeight" config:type="int">6889</config:config-item>
+ <config:config-item config:name="GridCoarseWidth" config:type="int">1270</config:config-item>
+ <config:config-item config:name="GridCoarseHeight" config:type="int">1270</config:config-item>
+ <config:config-item config:name="GridFineWidth" config:type="int">127</config:config-item>
+ <config:config-item config:name="GridFineHeight" config:type="int">127</config:config-item>
+ <config:config-item config:name="GridSnapWidthXNumerator" config:type="int">127</config:config-item>
+ <config:config-item config:name="GridSnapWidthXDenominator" config:type="int">1</config:config-item>
+ <config:config-item config:name="GridSnapWidthYNumerator" config:type="int">127</config:config-item>
+ <config:config-item config:name="GridSnapWidthYDenominator" config:type="int">1</config:config-item>
+ <config:config-item config:name="IsAngleSnapEnabled" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SnapAngle" config:type="int">1500</config:config-item>
+ <config:config-item config:name="ZoomOnPage" 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="ApplyUserData" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="BitmapTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sob</config:config-item>
+ <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item>
+ <config:config-item config:name="ColorTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soc</config:config-item>
+ <config:config-item config:name="DashTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sod</config:config-item>
+ <config:config-item config:name="DefaultTabStop" config:type="int">1270</config:config-item>
+ <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="GradientTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sog</config:config-item>
+ <config:config-item config:name="HatchTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soh</config:config-item>
+ <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintBooklet" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintBookletBack" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintBookletFront" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintDate" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintFitPage" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintHiddenPages" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintPageName" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintTilePage" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintTime" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="LineEndTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soe</config:config-item>
+ <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="MeasureUnit" config:type="short">7</config:config-item>
+ <config:config-item config:name="PageNumberFormat" config:type="int">4</config:config-item>
+ <config:config-item config:name="ParagraphSummation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrintQuality" config:type="int">0</config:config-item>
+ <config:config-item config:name="PrinterIndependentLayout" config:type="string">low-resolution</config:config-item>
+ <config:config-item config:name="PrinterName" config:type="string"/>
+ <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrinterSetup" config:type="base64Binary"/>
+ <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="ScaleDenominator" config:type="int">1</config:config-item>
+ <config:config-item config:name="ScaleNumerator" config:type="int">1</config:config-item>
+ <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</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="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <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="Lohit Devanagari" svg:font-family="&apos;Lohit Devanagari&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"/>
+ <style:font-face style:name="Microsoft YaHei" svg:font-family="&apos;Microsoft YaHei&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Noto Sans CJK SC Regular" svg:font-family="&apos;Noto Sans CJK SC Regular&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Segoe UI" svg:font-family="&apos;Segoe UI&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Tahoma" svg:font-family="Tahoma" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+ <draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="M10 0l-10 30h20z"/>
+ <style:default-style style:family="graphic">
+ <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap"/>
+ <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" 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="24pt" fo:language="en" fo:country="US" style:font-name-asian="Segoe UI" style:font-size-asian="24pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Tahoma" style:font-size-complex="24pt" style:language-complex="hi" style:country-complex="IN"/>
+ </style:default-style>
+ <style:style style:name="standard" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0cm" svg:stroke-color="#3465a4" draw:marker-start-width="0.2cm" draw:marker-start-center="false" draw:marker-end-width="0.2cm" draw:marker-end-center="false" draw:fill="solid" draw:fill-color="#729fcf" draw:textarea-horizontal-align="justify" fo:padding-top="0.125cm" fo:padding-bottom="0.125cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080">
+ <text:list-style style:name="standard">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="Microsoft YaHei" style:font-family-asian="&apos;Microsoft YaHei&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="18pt" style:font-style-asian="normal" style:font-weight-asian="normal" 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="18pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="objectwitharrow" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0.15cm" svg:stroke-color="#000000" draw:marker-start="Arrow" draw:marker-start-width="0.7cm" draw:marker-start-center="true" draw:marker-end-width="0.3cm"/>
+ </style:style>
+ <style:style style:name="objectwithshadow" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ </style:style>
+ <style:style style:name="objectwithoutfill" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties svg:stroke-color="#000000" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Object_20_with_20_no_20_fill_20_and_20_no_20_line" style:display-name="Object with no fill and no line" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="text" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="textbody" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties fo:font-size="16pt"/>
+ </style:style>
+ <style:style style:name="textbodyjustfied" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:text-align="justify"/>
+ </style:style>
+ <style:style style:name="textbodyindent" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0.6cm"/>
+ </style:style>
+ <style:style style:name="title" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties fo:font-size="44pt"/>
+ </style:style>
+ <style:style style:name="title1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="solid" draw:fill-color="#008080" draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="title2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties svg:stroke-width="0.05cm" draw:fill-color="#ffcc99" draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0.2cm" fo:margin-top="0.1cm" fo:margin-bottom="0.1cm" fo:text-align="center" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-size="36pt"/>
+ </style:style>
+ <style:style style:name="headline" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="headline1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="18pt" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="headline2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="14pt" fo:font-style="italic" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="measure" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#000000" draw:marker-start="Arrow" draw:marker-start-width="0.2cm" draw:marker-end="Arrow" draw:marker-end-width="0.2cm" draw:fill="none" draw:show-unit="true"/>
+ <style:text-properties fo:font-size="12pt"/>
+ </style:style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:page-layout style:name="PM0">
+ <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="10.16cm" fo:page-height="5.08cm" style:print-orientation="portrait"/>
+ </style:page-layout>
+ <style:style style:name="dp1" style:family="drawing-page">
+ <style:drawing-page-properties draw:background-size="border" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="dp2" style:family="drawing-page"/>
+ <style:style style:name="gr1" style:family="graphic" style:parent-style-name="Object_20_with_20_no_20_fill_20_and_20_no_20_line">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-vertical-align="middle" draw:color-mode="standard" draw:luminance="0%" draw:contrast="0%" draw:gamma="100%" draw:red="0%" draw:green="0%" draw:blue="0%" fo:clip="rect(0cm, 0cm, 0cm, 0cm)" draw:image-opacity="100%" style:mirror="none"/>
+ </style:style>
+ <style:style style:name="P1" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none"/>
+ <style:paragraph-properties fo:text-align="center"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:master-styles>
+ <draw:layer-set>
+ <draw:layer draw:name="layout"/>
+ <draw:layer draw:name="background"/>
+ <draw:layer draw:name="backgroundobjects"/>
+ <draw:layer draw:name="controls"/>
+ <draw:layer draw:name="measurelines"/>
+ </draw:layer-set>
+ <style:master-page style:name="Default" style:page-layout-name="PM0" draw:style-name="dp1"/>
+ </office:master-styles>
+ <office:body>
+ <office:drawing>
+ <draw:page draw:name="page1" draw:style-name="dp2" draw:master-page-name="Default">
+ <draw:frame draw:style-name="gr1" draw:text-style-name="P1" draw:layer="layout" svg:width="4.69cm" svg:height="0.776cm" svg:x="2.413cm" svg:y="2.272cm">
+ <draw:image xlink:href="" loext:mime-type="image/x-wmf">
+ <office:binary-data>183GmgAAAAAAAKAQwAIBCQAAAABwTAEACQAAAz0CAAACABwAAAAAAAUAAAAJAgAAAAAFAAAA
+ AgEBAAAABQAAAAEC////AAUAAAAuARgAAAAFAAAACwIAAAAABQAAAAwCwAKgEBIAAAAmBg8A
+ GgD/////AAAQAAAAwP///8D///9gEAAAgAIAAAsAAAAmBg8ADABNYXRoVHlwZQAAgAAcAAAA
+ +wKA/gAAAAAAAJABAQAAAAQCABBUaW1lcyBOZXcgUm9tYW4AdPEtAIlAg30gAIZ9IAdmwAQA
+ AAAtAQAACAAAADIKwAHCDwEAAAByeQgAAAAyCsABUA4BAAAAZHkIAAAAMgrAARgNAQAAAHJ5
+ CAAAADIKwAFDCgEAAABoeQgAAAAyCsABKQkBAAAAcnkIAAAAMgrAAdwDAQAAAGp5CAAAADIK
+ wAHwAQEAAABoeQgAAAAyCsABmgABAAAAaXkcAAAA+wIg/wAAAAAAAJABAQAAAAQCABBUaW1l
+ cyBOZXcgUm9tYW4AdPEtAIlAg30gAIZ9IAdmwAQAAAAtAQEABAAAAPABAAAIAAAAMgogAvsL
+ AQAAAGp5CAAAADIKIALnBwEAAABpeRwAAAD7AiD/AAAAAAAAkAEAAAAABAIAEFRpbWVzIE5l
+ dyBSb21hbgB08S0AiUCDfSAAhn0gB2bABAAAAC0BAAAEAAAA8AEBAAgAAAAyChQBRA8BAAAA
+ M3kIAAAAMgoUAQwIAQAAACp5HAAAAPsCgP4AAAAAAACQAQAAAAAEAgAQVGltZXMgTmV3IFJv
+ bWFuAHTxLQCJQIN9IACGfSAHZsAEAAAALQEBAAQAAADwAQAACAAAADIKwAHGDQEAAAApeQgA
+ AAAyCsABjgwBAAAAKHkIAAAAMgpOAYMKAQAAAIh5CAAAADIKwAHXCQEAAAApeQgAAAAyCsAB
+ nwgBAAAAKHkIAAAAMgrAAVoEAQAAAF15CAAAADIKwAH4AgEAAAB8eQgAAAAyCk4BMAIBAAAA
+ iHkIAAAAMgrAAVQBAQAAAHx5CAAAADIKwAEcAAEAAABbeRwAAAD7AoD+AAAAAAAAkAEBAAAC
+ BAIAEFN5bWJvbAAABQcK/CAAhn108S0AiUCDfSAAhn0gB2bABAAAAC0BAAAEAAAA8AEBAAgA
+ AAAyCsABAwsBAAAAZnkIAAAAMgrAAR8HAQAAAGZ5HAAAAPsCwP0AAAAAAACQAQAAAAIAAgAQ
+ U3ltYm9sAACsAgoAIACGfXTxLQCJQIN9IACGfSAHZsAEAAAALQEBAAQAAADwAQAACAAAADIK
+ SgJeBgEAAADyeRwAAAD7AoD+AAAAAAAAkAEAAAACAAIAEFN5bWJvbAAABQcK/SAAhn108S0A
+ iUCDfSAAhn0gB2bABAAAAC0BAAAEAAAA8AEBAAgAAAAyCsABJgUBAAAAPXkKAAAAJgYPAAoA
+ /////wEAAAAAABwAAAD7AhAABwAAAAAAvAIAAAAAAQICIlN5c3RlbQDAIAdmwAAACgAhAIoB
+ AAAAAAEAAACQ8y0ABAAAAC0BAQAEAAAA8AEAAAMAAAAAAA==
+ </office:binary-data>
+ <text:p/>
+ </draw:image>
+ <draw:image loext:mime-type="image/png">
+ <office:binary-data>iVBORw0KGgoAAAANSUhEUgAAALEAAAAdCAYAAADl941QAAAACXBIWXMAAA69AAAOlAEDvQ9G
+ AAAPp0lEQVR4nO2bd1wU59bHn2e20pcuRTq7gCwWCGJU7CZ4NTaaBYMgalCB1ysWYsGCKEJU
+ MBoboqAgdjHBHjs2sAC7sAurgCgqgtJ2ly1zFxEEwmyhaPKG7z98mHnmnN8czsycc2bAoygK
+ eujhnwz+awvooYfO0u1JzM1JpcWeYHqKaZOKgrz7HlEBQNjdPv9t/Ntj3K1JjFZc0g71DIy/
+ bjawHsYdsSrSuC3a5aZzBEp2dafffxM9Me7OJEbf4E6H7wrGrb594J43LQGyUk3DloevOdE/
+ LtO9F8zrNr//Jnpi/JHuS2KoJ5oce3L15KbfqZ6FW096zuo2f18AtDJDMzZ4RcSeW0VjlVxC
+ H+3dFxjYXxm8bW8tl/3QlEUsVDl2yHCi338o51T60Qv0EcDtUkH/r2KMwsoTq0av4JgPcuI/
+ qM/qFVy7fY7trwQAxLKObExiEZO0cWC/szH1Y0wmDKP/aeM6/U6QBz1FWVptJWIRo0atPWhx
+ 4fAydxIobiuoKjPBPjhg0W/JWlsA59JPow0hxh9Qqh1sarOP2cQduTEzL+cG/dwl0rAljzMm
+ LLfB3ZT3eIURlxISAxZHsuYcvrUBDBK6H14dGOcz50y8GzHpr4tRKKjNVtu/4uDPuW9Vej0T
+ LlDb6EDfCJA2q6pz1FJSSqa4+rsdM0JAHYZj+CJ9v+ttE+86zz5qDxvLBAXi2wV0XGe71uDb
+ 23udtkRsWrH1nuvgU6UJjuPJ4IXkikSJ1lOeLZ404B5VoAN8Rx9NyvUNT+qHB5Wy9LW4E+PR
+ Pv47jsYHm61FmgVw4bXFjqu978/+/vL1UDd7HHgv32lDVH3AD4xhBgs5l8xoUAcCvnzHSUMI
+ n24e9tOYg4MCU7OiRw+je+Qtj/RYKS7ZYTLK9tCNztuX4f3pHlrMHfvhUYcN1qs/pGvTh/S9
+ 5e5EyGi15slmu+UPZ7pG+RvuRoW6wG3V3F91/9AdNLoP4SkKW9sTPEs1XTDv5DaHqL3bDKXe
+ oRHUaLDTozdz3bcEeuyhx001TcADKO5ofD9rNNqNyFE3d05ne3dRiOoO9n/oO3jP1V8r7Eyp
+ BFDVtEfFYUABVfITff9Bj6djWKODyHdeMsoJPNChDuA41ps90YCgXh6DzQjZJAYbtbAeR03H
+ d0mTgQCKWb8SJ0frLB084HXeniKIIDv9D9d80mCiMqIkGLTy8vbHK8H21mu48FZy0Tj7EMPz
+ iOQPpeE0PsdNXIdzMcNla2qQPrRaWn1TI2zy6ni46W78gn5qN2Q1YVC9f9XC30JWzHWZlLZS
+ /2b5piGqZzsW35Ya5TimK3S2iwAU5j+zVqLZFpvgQO3n7ZK79L3kfgePXvMy9gy72kVJTEDt
+ 5ycl/g5AojzGWoLWsFTySilGNJoeW66AyQRBTbx+TfvdC6R13pai1MGnWXn9hAJnggBtWxQ0
+ gr4/r5XydpD5On1Y0LwRURZpaoDWCSx5ouTGLfb5jeynkTmGkibvFAFSxlYumb028ZvFO8Jn
+ ZSy/blvDIioa33Y1YtI1Ou1wbc8ffCzNWIU8c8uJtNyWNS+/jkfWGjj98RLnsU/jJ0/ftWfw
+ +cdBpshDWT6xk1j8Cv9nXKh/SNjxDfpbi6IvzNWPUmRsI2IzjFioNXmE2o3qSI9lCXEXWBMJ
+ QzZkpp0O9nQgggp57XwELcfd3r3SZ+mqA+uq5t8982h9/+D2H1XtCeHj6ngCshgFEGsJhASU
+ rEKqw2Gdn+gl4Xkx3xjl1pF4oGUS18OSS7GuMWfLp+CenzPK1h0tChx7+fi42L3r/WyJ99q1
+ JXxETkrM8bL03n/TAgdqmrdzM1V2+s7etuKMtseGzC2TSDGLpqw7UTXN5/KTWZHf4NMBwKGW
+ bt/fNA8/FH748RKXtSLGa/ni2wGNWDplamygtc4IR/yFhjvshydJdhGRJ0KfE5SJ/KJHhney
+ yI7jlpuc+BxzIWQfjRqfjqNSjETPRY+MPWrnGSCF8vjETmLEQDh8xsjTRmE3V1jRtNiKzh1r
+ WEzTEqRC6Xx8hueiTTdiCpdGbHd23X/+BHNBf4e++CuK2AJQRzTYb8rxPuGHF5fbWubJncAS
+ 6m+EOtMnxqe9FgMypnlVz/dHiuJdJpAaGox2EJfjXr8V66C8OmKduClmtUjWL+4BftfHj09M
+ 9Jt30as4cmF01EbLzQ5Txkf8vsIzabK7ajuNsbg0Q+8OB7G2srE40uo8lBxr/X2/SQpPz510
+ MXL7Ty7eu07Fqu8r51rhC5uW4C1sX1JxHO6djFfOVRRmtuz4dkwjpk45NLbVKXbsfbH2zhqn
+ sdPvJnidObUgqq/KNRFzI22g05krdjRCiycCHrWfveaY/affps9u2u4IZMal3T/aJ4RshnHD
+ 1f6DdWuRshHCAgbbRtRrePmSzSvXjKHAImE13h4iGiJNdaRaMVuNiMvytVlVxpqDrJU5ihxH
+ HBGbUVgVq9MRn82gXMjloSRUzEW4PMnFQEZhZfriYV479ENi7gdOsGGv1gnUnoJP00KeFSmR
+ eHXl7zTrUIBXhX9NEFExR78YVSfbahHbdN1iWJqXb1VFUANjwvbFBtmRbotHR5OEZEkB2Xwy
+ OvW6GuIPmRyOOYvMFkiPb8c1YuuUQ2MrnUXmovo3ylHzt21GFjw4E9xX5XrDbj4zx7SQTEPs
+ THBFsoMv26eUJEZhVX6e2SttGx5NF5bJdtaSWshiFlM1RkzMHEaBJQ1beOy83kUqVDHNEClV
+ zFYjwgKmUQFiTfCzwimUxF2DANYLAAGg9QhfgBIkLT5p+4rknw2CHqWO1+Fxrq1NX2PhHnqF
+ glaITj183t/IgZ6nhdEIozVVStUoGU8mwzbNqRCwJRc+Yfi2LF870v2GLQiZzCe2XALJKJmM
+ 8muqytVZz4ppUuPbCY3YOuXQ2EpnjRrvVnL/hAIn+vJp1v9tLB1EsDCHacu38i5rOZnARrZP
+ KUksAgUMFg21Hid5NADF7p7CQiKDJbaydrW+3tg5CyFHYkto5dMg/K+FvkxQWM5imVUY9K+m
+ qsJ3imnh4qtq+SrSa2IiqqyhXI09WEcB2nS85KfgfpJ9UuG3dsu8LBYjH05TDlzr6+odqf6j
+ mBNvmnDLfOi0CMc5mCUPhCiU7BKL2zSI4pd4Zn61tYkrja3cEPx2aTwOomU4JktsKYnvNaz4
+ dkojlk65NLbQCVH0RVZWn3Idp9o++sjLxn1cyMwptCPTbItNW00msEzJ9omdxGg1kp9XStO0
+ oT3TRRQcaXFZysxiVWOajRGrsXPmIyzGMxslmk2RcYfeWglBAZNNg9bTS63wil1QgtsrHV08
+ Dp58IwYkrDVQZeqHg6zdruNIQI6nhBi8efzI5pXF0HfOuqCkLPHAqAffLnyxW7n89bkNsZGl
+ HjsyghzwtzB9UbRqKJAnkJQnrWt0IZvEZCEW1HmWlzGTC+VJyhlI0lCrrMsvVu2LHV8x7IxG
+ TJ3yaGypU5Pynl/HU0JRFDY3VIJ80pNcoY2VDy1Dnrdx8vjETmJRgeRuilpSx1IvKDrnFRYy
+ DFkiK2Vf6qfCXcQhMPIFVtYzqPcUacqaQSsRVn65tb4dlaMB29RfMiAMi7nHeBNjpLBPTCBQ
+ UlOtIYiEUCTiEJMT8rxHr3FKfb53jueqF/PoySdHzmJELApgz9h+e7Y58qjt0Xhz6isLXFVd
+ WVmtHgqIsKlhFpcxtfOqemt+S1XB7j9qXym9eo/TNNeorGSLrJSw4ytL4zgfreYXJEKYuSVo
+ zr3xcTmBtrjmlzft6ZRLYwudFlRLtoVOH4Za2e/a8amL3PsMLT93Knr5woMs8oARdiYJmNOg
+ FsjjEzuJa/JV8kpEvcuu7XNJdA5xneWsKXPY3QSPxTQpUqGJbY2RksYN+UoMjtC88v5x3sVn
+ S23dzHEMeew0IywgMQuAufVU61Nd8+KkM0CgNTns6s/HlmStD8qNZjzW+HbQlfUl8bpBpefT
+ h080wIM6sDJuxxCso3WGVoygg6f7c/LthMAFEj6dj5DFMGYjVOIcK+wmWpCf0zsP0EkzKUVl
+ 0TLiK1NjM3jUMXTnXkc5dMqjsaVOvyHad9Utw+9vnTF1f0jAwE13h86fumnhsF26u5/Ozk5N
+ Hpft5neaTpD+Wlken9hJTJlZfrp2pqk0B1ioeh77o8oTfL77qbi/T6lyt+yIrQbQarZqfplu
+ L5sOjPq6BdWBVaFnr/yYEdo3LGB+Qs2eiIH/JX56wohepRj+OCNnZ8jFDX5O+Hbm4Thq/cz5
+ ow5E/5K26slGF00nAvhY4xNH/3b7ZQ3Qx3YqgE/T0kdVjAzJ9gv2/2X1/4ENzbvai68UjS0R
+ v07Tn+d+Ya/3lR1zRxHB5wa+HZ2yNbbWOZOKywSIFX9mwpPgmQkguGnFVP6GY9JtfEYeny2S
+ WAhz9y/08i900G34AGiRu/1RqR8AfUGEzCcmTPwAwjQ6PrdpW8MHQDuSb87Iy77ukC0kUb7r
+ VgWIpM9puHjwKIHwqZzh3lRNOqnyH68zTmEtkwMh8kQCA/sKKmbtjqDGPjFn16b+MHHdoYDZ
+ p/zNYuR5rIqKEnuvO27oEX5mVrAx5kc4bcDQ2EqNupgr0rOvtP1Lw/0FdXaSxiTG2fLDHvK/
+ C/sSHuVGBHP37Z/6bpbvTdXzV4dz3VZmfk+BzXNFFbpH3jK6x6ovowWPEhuSF5JQEhF+HEtV
+ X05yPmc4XXzVDtfqtaiQmWvCt/V5KfW/Kwg0XmDKoQXcgAXRIZQ43+ipFodIUrp9PueEWWjQ
+ +c2uh47+vMCGcFde1VgaWyIqzDWqNB/6Tre9j4i+kM7O8jf+HzsheM06TFs/5ViAQDhWvDd+
+ Soh2l3wN1wE+zj0hH1HVrKMQGjWoTThwpWgCaPPmEYXluUzLWgiQahQQKFLmsJAy8P2SlISf
+ 7l/mDPmAWhD0IOZYDX54q6rhk5C85BsdXIkistvX2Boug2lGsAsoxuo1voTOztLxJJbUTEuv
+ HZ7WaQWYdkjoyKjrESMBiOi0j84iSWIlMuQhygaVelLHjRA1mHcu5RIAKXLZxekKnL/T/VP6
+ IgTVG/jdEz0F5MqPEObn8qh9JmnmSO01vrpO6fyN78R/IyBZrESC9SRz2xJLBefUf1uEj8mH
+ t16cy6ifoD3bAY/9IdA/gJ4kxgSFvIq3GjxVPT4Fh4pRSV1MH/TNA6wPZv5x4PvxZoT2i/3a
+ MrqCniTGQJSzycbVeeV1zqTUuwX7VX1fvHdU85hkcU6eDr2HL0tPEmMgfvdK/XU9UIbcYqUr
+ v1zzZ7uvfxBthd3l9/D16EliDAhDlmXtixQvTXzKdMnUXVqXvGzwMnUFX3n38GXoSWIscEaC
+ MaE7do4BYOfXltKDdP4HEfnvnktJxIAAAAAASUVORK5CYII=
+ </office:binary-data>
+ </draw:image>
+ </draw:frame>
+ </draw:page>
+ </office:drawing>
+ </office:body>
+</office:document> \ No newline at end of file
diff --git a/sd/qa/unit/data/odg/tdf126319.odg b/sd/qa/unit/data/odg/tdf126319.odg
new file mode 100644
index 000000000..71bfde547
--- /dev/null
+++ b/sd/qa/unit/data/odg/tdf126319.odg
Binary files differ
diff --git a/sd/qa/unit/data/odg/tdf147119.odg b/sd/qa/unit/data/odg/tdf147119.odg
new file mode 100644
index 000000000..aafc9d600
--- /dev/null
+++ b/sd/qa/unit/data/odg/tdf147119.odg
Binary files differ
diff --git a/sd/qa/unit/data/odg/two_columns.odg b/sd/qa/unit/data/odg/two_columns.odg
new file mode 100644
index 000000000..bd721f0c0
--- /dev/null
+++ b/sd/qa/unit/data/odg/two_columns.odg
Binary files differ
diff --git a/sd/qa/unit/data/odp/BulletsAsImage.odp b/sd/qa/unit/data/odp/BulletsAsImage.odp
new file mode 100644
index 000000000..7094d34af
--- /dev/null
+++ b/sd/qa/unit/data/odp/BulletsAsImage.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/LineStylesOwn.odp b/sd/qa/unit/data/odp/LineStylesOwn.odp
new file mode 100644
index 000000000..8a145bb9f
--- /dev/null
+++ b/sd/qa/unit/data/odp/LineStylesOwn.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/Table_with_Cell_Fill.odp b/sd/qa/unit/data/odp/Table_with_Cell_Fill.odp
new file mode 100644
index 000000000..1a06f235e
--- /dev/null
+++ b/sd/qa/unit/data/odp/Table_with_Cell_Fill.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/Tdf62176.odp b/sd/qa/unit/data/odp/Tdf62176.odp
new file mode 100644
index 000000000..1139dd048
--- /dev/null
+++ b/sd/qa/unit/data/odp/Tdf62176.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/author_field.odp b/sd/qa/unit/data/odp/author_field.odp
new file mode 100644
index 000000000..ace132df4
--- /dev/null
+++ b/sd/qa/unit/data/odp/author_field.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/author_fixed.odp b/sd/qa/unit/data/odp/author_fixed.odp
new file mode 100644
index 000000000..2e666ad17
--- /dev/null
+++ b/sd/qa/unit/data/odp/author_fixed.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/autofitted-textbox-indent.odp b/sd/qa/unit/data/odp/autofitted-textbox-indent.odp
new file mode 100644
index 000000000..298c19903
--- /dev/null
+++ b/sd/qa/unit/data/odp/autofitted-textbox-indent.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/background.odp b/sd/qa/unit/data/odp/background.odp
new file mode 100644
index 000000000..f96785dd2
--- /dev/null
+++ b/sd/qa/unit/data/odp/background.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/bnc822341.odp b/sd/qa/unit/data/odp/bnc822341.odp
new file mode 100644
index 000000000..28fe2f4f4
--- /dev/null
+++ b/sd/qa/unit/data/odp/bnc822341.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/bulletCharAndFont.odp b/sd/qa/unit/data/odp/bulletCharAndFont.odp
new file mode 100644
index 000000000..51277b272
--- /dev/null
+++ b/sd/qa/unit/data/odp/bulletCharAndFont.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/cellspan.odp b/sd/qa/unit/data/odp/cellspan.odp
new file mode 100644
index 000000000..775e1e400
--- /dev/null
+++ b/sd/qa/unit/data/odp/cellspan.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/closed-shapes.odp b/sd/qa/unit/data/odp/closed-shapes.odp
new file mode 100644
index 000000000..d422c74a0
--- /dev/null
+++ b/sd/qa/unit/data/odp/closed-shapes.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/document_with_linked_graphic.odp b/sd/qa/unit/data/odp/document_with_linked_graphic.odp
new file mode 100644
index 000000000..b0c327d44
--- /dev/null
+++ b/sd/qa/unit/data/odp/document_with_linked_graphic.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/document_with_two_images.odp b/sd/qa/unit/data/odp/document_with_two_images.odp
new file mode 100644
index 000000000..33fb9bb56
--- /dev/null
+++ b/sd/qa/unit/data/odp/document_with_two_images.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/embedded-pdf.odp b/sd/qa/unit/data/odp/embedded-pdf.odp
new file mode 100644
index 000000000..d67584d19
--- /dev/null
+++ b/sd/qa/unit/data/odp/embedded-pdf.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/extfile_field.odp b/sd/qa/unit/data/odp/extfile_field.odp
new file mode 100644
index 000000000..e5425bead
--- /dev/null
+++ b/sd/qa/unit/data/odp/extfile_field.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/fail/.gitignore b/sd/qa/unit/data/odp/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/odp/fail/.gitignore
diff --git a/sd/qa/unit/data/odp/fdo77027.odp b/sd/qa/unit/data/odp/fdo77027.odp
new file mode 100644
index 000000000..4d834d468
--- /dev/null
+++ b/sd/qa/unit/data/odp/fdo77027.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/fillbitmap2.odp b/sd/qa/unit/data/odp/fillbitmap2.odp
new file mode 100644
index 000000000..2bf258df0
--- /dev/null
+++ b/sd/qa/unit/data/odp/fillbitmap2.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/group_rotation.odp b/sd/qa/unit/data/odp/group_rotation.odp
new file mode 100644
index 000000000..92568c150
--- /dev/null
+++ b/sd/qa/unit/data/odp/group_rotation.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/image_transparency.odp b/sd/qa/unit/data/odp/image_transparency.odp
new file mode 100644
index 000000000..6d3f6c232
--- /dev/null
+++ b/sd/qa/unit/data/odp/image_transparency.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/images_with_special_IDs.odp b/sd/qa/unit/data/odp/images_with_special_IDs.odp
new file mode 100644
index 000000000..f6a5545a8
--- /dev/null
+++ b/sd/qa/unit/data/odp/images_with_special_IDs.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/indeterminate/.gitignore b/sd/qa/unit/data/odp/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/odp/indeterminate/.gitignore
diff --git a/sd/qa/unit/data/odp/linked_graphic.jpg b/sd/qa/unit/data/odp/linked_graphic.jpg
new file mode 100644
index 000000000..2218cdd72
--- /dev/null
+++ b/sd/qa/unit/data/odp/linked_graphic.jpg
Binary files differ
diff --git a/sd/qa/unit/data/odp/loopNoPause.odp b/sd/qa/unit/data/odp/loopNoPause.odp
new file mode 100644
index 000000000..d9be1c2dc
--- /dev/null
+++ b/sd/qa/unit/data/odp/loopNoPause.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/loopPause10.odp b/sd/qa/unit/data/odp/loopPause10.odp
new file mode 100644
index 000000000..0e3e316db
--- /dev/null
+++ b/sd/qa/unit/data/odp/loopPause10.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/masterpage_style_parent.odp b/sd/qa/unit/data/odp/masterpage_style_parent.odp
new file mode 100644
index 000000000..e9f637849
--- /dev/null
+++ b/sd/qa/unit/data/odp/masterpage_style_parent.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/math.odp b/sd/qa/unit/data/odp/math.odp
new file mode 100644
index 000000000..c7605c571
--- /dev/null
+++ b/sd/qa/unit/data/odp/math.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/numfmt.odp b/sd/qa/unit/data/odp/numfmt.odp
new file mode 100644
index 000000000..51227ea09
--- /dev/null
+++ b/sd/qa/unit/data/odp/numfmt.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/page_transparent_background.odp b/sd/qa/unit/data/odp/page_transparent_background.odp
new file mode 100644
index 000000000..02b11976a
--- /dev/null
+++ b/sd/qa/unit/data/odp/page_transparent_background.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/pass/.gitignore b/sd/qa/unit/data/odp/pass/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/odp/pass/.gitignore
diff --git a/sd/qa/unit/data/odp/pass/EDB-26517-1.odp b/sd/qa/unit/data/odp/pass/EDB-26517-1.odp
new file mode 100644
index 000000000..8367930bf
--- /dev/null
+++ b/sd/qa/unit/data/odp/pass/EDB-26517-1.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/pass/ooo56974-1.odp b/sd/qa/unit/data/odp/pass/ooo56974-1.odp
new file mode 100644
index 000000000..6a48db41a
--- /dev/null
+++ b/sd/qa/unit/data/odp/pass/ooo56974-1.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/pass/ooo72169-1.odp b/sd/qa/unit/data/odp/pass/ooo72169-1.odp
new file mode 100644
index 000000000..7a024b8f8
--- /dev/null
+++ b/sd/qa/unit/data/odp/pass/ooo72169-1.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp b/sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp
new file mode 100644
index 000000000..d539e8cfa
--- /dev/null
+++ b/sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/pass/test-slide-name-fields.odp b/sd/qa/unit/data/odp/pass/test-slide-name-fields.odp
new file mode 100644
index 000000000..3de53f931
--- /dev/null
+++ b/sd/qa/unit/data/odp/pass/test-slide-name-fields.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/placeholder-box-textalignment.odp b/sd/qa/unit/data/odp/placeholder-box-textalignment.odp
new file mode 100644
index 000000000..df33291fb
--- /dev/null
+++ b/sd/qa/unit/data/odp/placeholder-box-textalignment.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/preset-shapes-export.odp b/sd/qa/unit/data/odp/preset-shapes-export.odp
new file mode 100644
index 000000000..30668535b
--- /dev/null
+++ b/sd/qa/unit/data/odp/preset-shapes-export.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/repeatBitmapMode.odp b/sd/qa/unit/data/odp/repeatBitmapMode.odp
new file mode 100644
index 000000000..b3d829930
--- /dev/null
+++ b/sd/qa/unit/data/odp/repeatBitmapMode.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/rotate_flip.odp b/sd/qa/unit/data/odp/rotate_flip.odp
new file mode 100644
index 000000000..675b3fb85
--- /dev/null
+++ b/sd/qa/unit/data/odp/rotate_flip.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/search-all-notes.odp b/sd/qa/unit/data/odp/search-all-notes.odp
new file mode 100644
index 000000000..6c38ecabb
--- /dev/null
+++ b/sd/qa/unit/data/odp/search-all-notes.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/shapes-test.odp b/sd/qa/unit/data/odp/shapes-test.odp
new file mode 100644
index 000000000..fa202104b
--- /dev/null
+++ b/sd/qa/unit/data/odp/shapes-test.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/slide-bitmap-background.odp b/sd/qa/unit/data/odp/slide-bitmap-background.odp
new file mode 100644
index 000000000..46ea62be5
--- /dev/null
+++ b/sd/qa/unit/data/odp/slide-bitmap-background.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/slide-custom-background.odp b/sd/qa/unit/data/odp/slide-custom-background.odp
new file mode 100644
index 000000000..df07c6f34
--- /dev/null
+++ b/sd/qa/unit/data/odp/slide-custom-background.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/slide-tile-background.odp b/sd/qa/unit/data/odp/slide-tile-background.odp
new file mode 100644
index 000000000..d926b555f
--- /dev/null
+++ b/sd/qa/unit/data/odp/slide-tile-background.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/slidecount_field.odp b/sd/qa/unit/data/odp/slidecount_field.odp
new file mode 100644
index 000000000..c8f5bd46d
--- /dev/null
+++ b/sd/qa/unit/data/odp/slidecount_field.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/slidename_field.odp b/sd/qa/unit/data/odp/slidename_field.odp
new file mode 100644
index 000000000..e1a119b9f
--- /dev/null
+++ b/sd/qa/unit/data/odp/slidename_field.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/slidenum_field.odp b/sd/qa/unit/data/odp/slidenum_field.odp
new file mode 100644
index 000000000..e7789a3a0
--- /dev/null
+++ b/sd/qa/unit/data/odp/slidenum_field.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/svg-export-text-decorations.odp b/sd/qa/unit/data/odp/svg-export-text-decorations.odp
new file mode 100644
index 000000000..d51661716
--- /dev/null
+++ b/sd/qa/unit/data/odp/svg-export-text-decorations.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf100348_Fontwork2TextWarp.odp b/sd/qa/unit/data/odp/tdf100348_Fontwork2TextWarp.odp
new file mode 100644
index 000000000..9df8d6615
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf100348_Fontwork2TextWarp.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf100348_FontworkBitmapFill.odp b/sd/qa/unit/data/odp/tdf100348_FontworkBitmapFill.odp
new file mode 100644
index 000000000..be3d17c21
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf100348_FontworkBitmapFill.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf100348_FontworkGradientGlow.odp b/sd/qa/unit/data/odp/tdf100348_FontworkGradientGlow.odp
new file mode 100644
index 000000000..e2c5f1e88
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf100348_FontworkGradientGlow.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf100387.odp b/sd/qa/unit/data/odp/tdf100387.odp
new file mode 100644
index 000000000..72c7ba385
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf100387.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf103567.odp b/sd/qa/unit/data/odp/tdf103567.odp
new file mode 100644
index 000000000..a6f72c414
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf103567.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf105998.odp b/sd/qa/unit/data/odp/tdf105998.odp
new file mode 100644
index 000000000..dca83afd1
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf105998.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf106026.odp b/sd/qa/unit/data/odp/tdf106026.odp
new file mode 100644
index 000000000..0d77f755b
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf106026.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf108925.odp b/sd/qa/unit/data/odp/tdf108925.odp
new file mode 100644
index 000000000..5b6dfc4ca
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf108925.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf109169_Diamond.odp b/sd/qa/unit/data/odp/tdf109169_Diamond.odp
new file mode 100644
index 000000000..cd6a18d1b
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf109169_Diamond.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf109169_Octagon.odp b/sd/qa/unit/data/odp/tdf109169_Octagon.odp
new file mode 100644
index 000000000..f35e746f3
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf109169_Octagon.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf111785.odp b/sd/qa/unit/data/odp/tdf111785.odp
new file mode 100644
index 000000000..fdb704e4c
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf111785.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf111798.odp b/sd/qa/unit/data/odp/tdf111798.odp
new file mode 100644
index 000000000..f00c0bec7
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf111798.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf112552.odp b/sd/qa/unit/data/odp/tdf112552.odp
new file mode 100644
index 000000000..df4afb76b
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf112552.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf112557.odp b/sd/qa/unit/data/odp/tdf112557.odp
new file mode 100644
index 000000000..5587e7fce
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf112557.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf112647.odp b/sd/qa/unit/data/odp/tdf112647.odp
new file mode 100644
index 000000000..72a6621b8
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf112647.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf113197.odp b/sd/qa/unit/data/odp/tdf113197.odp
new file mode 100644
index 000000000..0ebabeb5f
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf113197.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf115005.odp b/sd/qa/unit/data/odp/tdf115005.odp
new file mode 100644
index 000000000..764a862fe
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf115005.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf115005_no_fallback_images.odp b/sd/qa/unit/data/odp/tdf115005_no_fallback_images.odp
new file mode 100644
index 000000000..2f88282af
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf115005_no_fallback_images.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf116266.odp b/sd/qa/unit/data/odp/tdf116266.odp
new file mode 100644
index 000000000..17ce46ea5
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf116266.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf116266_chart.svg b/sd/qa/unit/data/odp/tdf116266_chart.svg
new file mode 100644
index 000000000..3a3ef2d0e
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf116266_chart.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="120mm" height="110mm" viewBox="0 0 12000 11000" version="1.1" xmlns="http://www.w3.org/2000/svg" stroke-width="28.222" stroke-linejoin="round" xml:space="preserve">
+ <path fill="rgb(255,255,255)" stroke="none" d="M 6000,11000 L 0,11000 0,0 12000,0 12000,11000 6000,11000 Z"/>
+ <path fill="none" stroke="rgb(178,178,178)" stroke-width="30" stroke-linejoin="round" d="M 7008,10247 L 2399,10247 2399,249 11617,249 11617,10247 7008,10247 Z"/>
+ <path fill="none" stroke="rgb(178,178,178)" stroke-width="30" stroke-linejoin="round" d="M 11617,10246 L 2399,10246"/>
+ <path fill="none" stroke="rgb(178,178,178)" stroke-width="30" stroke-linejoin="round" d="M 11617,8930 L 2399,8930"/>
+ <path fill="none" stroke="rgb(178,178,178)" stroke-width="30" stroke-linejoin="round" d="M 11617,7614 L 2399,7614"/>
+ <path fill="none" stroke="rgb(178,178,178)" stroke-width="30" stroke-linejoin="round" d="M 11617,6299 L 2399,6299"/>
+ <path fill="none" stroke="rgb(178,178,178)" stroke-width="30" stroke-linejoin="round" d="M 11617,4984 L 2399,4984"/>
+ <path fill="none" stroke="rgb(178,178,178)" stroke-width="30" stroke-linejoin="round" d="M 11617,3668 L 2399,3668"/>
+ <path fill="none" stroke="rgb(178,178,178)" stroke-width="30" stroke-linejoin="round" d="M 11617,2353 L 2399,2353"/>
+ <path fill="none" stroke="rgb(178,178,178)" stroke-width="30" stroke-linejoin="round" d="M 11617,1037 L 2399,1037"/>
+ <path fill="none" stroke="rgb(179,179,179)" stroke-linejoin="round" d="M 2399,10246 L 11617,10246"/>
+ <path fill="none" stroke="rgb(179,179,179)" stroke-linejoin="round" d="M 2399,10246 L 2399,248"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 11504,10246 L 11594,10246 11594,2205 11504,2205 11504,10246 Z"/>
+ <path fill="rgb(255,51,51)" stroke="none" d="M 11368,10246 L 11458,10246 11458,2271 11368,2271 11368,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 11232,10246 L 11323,10246 11323,2405 11232,2405 11232,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 11097,10246 L 11187,10246 11187,2213 11097,2213 11097,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 10961,10246 L 11052,10246 11052,1684 10961,1684 10961,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 10826,10246 L 10916,10246 10916,946 10826,946 10826,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 10690,10246 L 10780,10246 10780,385 10690,385 10690,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 10555,10246 L 10645,10246 10645,262 10555,262 10555,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 10419,10246 L 10509,10246 10509,529 10419,529 10419,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 10283,10246 L 10374,10246 10374,1250 10283,1250 10283,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 10148,10246 L 10238,10246 10238,1870 10148,1870 10148,10246 Z"/>
+ <path fill="rgb(255,51,51)" stroke="none" d="M 10012,10246 L 10103,10246 10103,2084 10012,2084 10012,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 9877,10246 L 9967,10246 9967,2209 9877,2209 9877,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 9741,10246 L 9831,10246 9831,2575 9741,2575 9741,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 9605,10246 L 9696,10246 9696,3208 9605,3208 9605,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 9470,10246 L 9560,10246 9560,4062 9470,4062 9470,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 9334,10246 L 9425,10246 9425,4739 9334,4739 9334,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 9199,10246 L 9289,10246 9289,4783 9199,4783 9199,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 9063,10246 L 9154,10246 9154,4987 9063,4987 9063,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 8928,10246 L 9018,10246 9018,5000 8928,5000 8928,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 8792,10246 L 8882,10246 8882,4878 8792,4878 8792,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 8656,10246 L 8747,10246 8747,4850 8656,4850 8656,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 8521,10246 L 8611,10246 8611,4540 8521,4540 8521,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 8385,10246 L 8476,10246 8476,4186 8385,4186 8385,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 8250,10246 L 8340,10246 8340,3822 8250,3822 8250,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 8114,10246 L 8205,10246 8205,3465 8114,3465 8114,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 7979,10246 L 8069,10246 8069,3829 7979,3829 7979,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 7843,10246 L 7933,10246 7933,2939 7843,2939 7843,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 7707,10246 L 7798,10246 7798,2597 7707,2597 7707,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 7572,10246 L 7662,10246 7662,2518 7572,2518 7572,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 7436,10246 L 7527,10246 7527,2344 7436,2344 7436,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 7301,10246 L 7391,10246 7391,2249 7301,2249 7301,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 7165,10246 L 7256,10246 7256,2765 7165,2765 7165,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 7030,10246 L 7120,10246 7120,3300 7030,3300 7030,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 6894,10246 L 6984,10246 6984,3558 6894,3558 6894,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 6758,10246 L 6849,10246 6849,3343 6758,3343 6758,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 6623,10246 L 6713,10246 6713,4418 6623,4418 6623,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 6487,10246 L 6578,10246 6578,5017 6487,5017 6487,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 6352,10246 L 6442,10246 6442,4994 6352,4994 6352,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 6216,10246 L 6307,10246 6307,5025 6216,5025 6216,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 6081,10246 L 6171,10246 6171,5054 6081,5054 6081,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 5946,10246 L 6035,10246 6035,5260 5946,5260 5946,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 5810,10246 L 5901,10246 5901,5125 5810,5125 5810,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 5675,10246 L 5765,10246 5765,4815 5675,4815 5675,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 5539,10246 L 5630,10246 5630,4746 5539,4746 5539,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 5404,10246 L 5494,10246 5494,4457 5404,4457 5404,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 5268,10246 L 5359,10246 5359,4480 5268,4480 5268,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 5133,10246 L 5223,10246 5223,3834 5133,3834 5133,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 4997,10246 L 5087,10246 5087,3320 4997,3320 4997,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 4861,10246 L 4952,10246 4952,3009 4861,3009 4861,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 4726,10246 L 4816,10246 4816,3198 4726,3198 4726,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 4590,10246 L 4681,10246 4681,4142 4590,4142 4590,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 4455,10246 L 4545,10246 4545,5121 4455,5121 4455,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 4319,10246 L 4410,10246 4410,5097 4319,5097 4319,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 4184,10246 L 4274,10246 4274,4920 4184,4920 4184,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 4048,10246 L 4138,10246 4138,4846 4048,4846 4048,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 3912,10246 L 4003,10246 4003,5263 3912,5263 3912,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 3777,10246 L 3867,10246 3867,5465 3777,5465 3777,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 3641,10246 L 3732,10246 3732,5344 3641,5344 3641,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 3506,10246 L 3596,10246 3596,5378 3506,5378 3506,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 3370,10246 L 3460,10246 3460,5349 3370,5349 3370,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 3235,10246 L 3325,10246 3325,5485 3235,5485 3235,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 3099,10246 L 3189,10246 3189,5546 3099,5546 3099,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 2963,10246 L 3054,10246 3054,5281 2963,5281 2963,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 2828,10246 L 2918,10246 2918,4492 2828,4492 2828,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 2692,10246 L 2783,10246 2783,4657 2692,4657 2692,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 2557,10246 L 2647,10246 2647,6278 2557,6278 2557,10246 Z"/>
+ <path fill="rgb(0,69,134)" stroke="none" d="M 2421,10246 L 2511,10246 2511,8391 2421,8391 2421,10246 Z"/>
+ <text class="TextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="1831" y="10830"><tspan fill="rgb(0,0,0)" stroke="none">1950</tspan></tspan></tspan></text>
+ <text class="TextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="4543" y="10830"><tspan fill="rgb(0,0,0)" stroke="none">1970</tspan></tspan></tspan></text>
+ <text class="TextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="7254" y="10830"><tspan fill="rgb(0,0,0)" stroke="none">1990</tspan></tspan></tspan></text>
+ <text class="TextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="9966" y="10830"><tspan fill="rgb(0,0,0)" stroke="none">2010</tspan></tspan></tspan></text>
+ <text class="TextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="1981" y="10406"><tspan fill="rgb(0,0,0)" stroke="none">0</tspan></tspan></tspan></text>
+ <text class="TextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="1346" y="9090"><tspan fill="rgb(0,0,0)" stroke="none">100</tspan></tspan></tspan></text>
+ <text class="TextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="1346" y="7774"><tspan fill="rgb(0,0,0)" stroke="none">200</tspan></tspan></tspan></text>
+ <text class="TextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="1346" y="6459"><tspan fill="rgb(0,0,0)" stroke="none">300</tspan></tspan></tspan></text>
+ <text class="TextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="1346" y="5143"><tspan fill="rgb(0,0,0)" stroke="none">400</tspan></tspan></tspan></text>
+ <text class="TextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="1346" y="3827"><tspan fill="rgb(0,0,0)" stroke="none">500</tspan></tspan></tspan></text>
+ <text class="TextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="1346" y="2512"><tspan fill="rgb(0,0,0)" stroke="none">600</tspan></tspan></tspan></text>
+ <text class="TextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="1346" y="1196"><tspan fill="rgb(0,0,0)" stroke="none">700</tspan></tspan></tspan></text>
+ <text class="TextShape" transform="translate(675,5848) rotate(-90) translate(-675,-5848)"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="675" y="5848"><tspan fill="rgb(0,0,0)" stroke="none">Data</tspan></tspan></tspan></text>
+ <path fill="rgb(255,255,255)" stroke="none" d="M 6490,1975 L 3170,1975 3170,1324 9810,1324 9810,1975 6490,1975 Z"/>
+ <text class="TextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="3217" y="1808"><tspan fill="rgb(255,51,51)" stroke="none">2016 vs 2006 ≙- 0,23 %/a</tspan></tspan></tspan></text>
+</svg> \ No newline at end of file
diff --git a/sd/qa/unit/data/odp/tdf118045.odp b/sd/qa/unit/data/odp/tdf118045.odp
new file mode 100644
index 000000000..8b5fac36a
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf118045.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf118768-brake.odp b/sd/qa/unit/data/odp/tdf118768-brake.odp
new file mode 100644
index 000000000..1f3abbcc0
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf118768-brake.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf118783.odp b/sd/qa/unit/data/odp/tdf118783.odp
new file mode 100644
index 000000000..719db63d1
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf118783.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf118806.odp b/sd/qa/unit/data/odp/tdf118806.odp
new file mode 100644
index 000000000..7120fd968
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf118806.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf118825-motionpath.odp b/sd/qa/unit/data/odp/tdf118825-motionpath.odp
new file mode 100644
index 000000000..c070b0ae2
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf118825-motionpath.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf118835.odp b/sd/qa/unit/data/odp/tdf118835.odp
new file mode 100644
index 000000000..c3e15a6dc
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf118835.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf118836.odp b/sd/qa/unit/data/odp/tdf118836.odp
new file mode 100644
index 000000000..50857b79d
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf118836.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf119223.odp b/sd/qa/unit/data/odp/tdf119223.odp
new file mode 100644
index 000000000..efb4306b9
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf119223.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf123658_SearchAfterSlideChange.odp b/sd/qa/unit/data/odp/tdf123658_SearchAfterSlideChange.odp
new file mode 100644
index 000000000..cfd296700
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf123658_SearchAfterSlideChange.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf124781.odp b/sd/qa/unit/data/odp/tdf124781.odp
new file mode 100644
index 000000000..199287db5
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf124781.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf127267DashOnHairline.odp b/sd/qa/unit/data/odp/tdf127267DashOnHairline.odp
new file mode 100644
index 000000000..08aed1758
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf127267DashOnHairline.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf127372.odp b/sd/qa/unit/data/odp/tdf127372.odp
new file mode 100644
index 000000000..adf5ad589
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf127372.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf127379.odp b/sd/qa/unit/data/odp/tdf127379.odp
new file mode 100644
index 000000000..91602c796
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf127379.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf127901.odp b/sd/qa/unit/data/odp/tdf127901.odp
new file mode 100644
index 000000000..e1c5dfad3
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf127901.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf128049.odp b/sd/qa/unit/data/odp/tdf128049.odp
new file mode 100644
index 000000000..8b9990a5c
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf128049.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf128096.odp b/sd/qa/unit/data/odp/tdf128096.odp
new file mode 100644
index 000000000..827239973
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf128096.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf128345_FullTransparentGradient.odp b/sd/qa/unit/data/odp/tdf128345_FullTransparentGradient.odp
new file mode 100644
index 000000000..904490d43
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf128345_FullTransparentGradient.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf128345_GradientAxial.odp b/sd/qa/unit/data/odp/tdf128345_GradientAxial.odp
new file mode 100644
index 000000000..55b8ec1aa
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf128345_GradientAxial.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf128345_GradientLinear.odp b/sd/qa/unit/data/odp/tdf128345_GradientLinear.odp
new file mode 100644
index 000000000..1eadfa11f
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf128345_GradientLinear.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf128345_GradientRadial.odp b/sd/qa/unit/data/odp/tdf128345_GradientRadial.odp
new file mode 100644
index 000000000..634d1dc1b
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf128345_GradientRadial.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf128985.odp b/sd/qa/unit/data/odp/tdf128985.odp
new file mode 100644
index 000000000..61a184ac7
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf128985.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf129430.odp b/sd/qa/unit/data/odp/tdf129430.odp
new file mode 100644
index 000000000..f5304f75c
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf129430.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf133502.odp b/sd/qa/unit/data/odp/tdf133502.odp
new file mode 100644
index 000000000..de7267304
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf133502.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf134969_TransparencyOnColorGradient.odp b/sd/qa/unit/data/odp/tdf134969_TransparencyOnColorGradient.odp
new file mode 100644
index 000000000..bb0d7bbc5
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf134969_TransparencyOnColorGradient.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf136949.odp b/sd/qa/unit/data/odp/tdf136949.odp
new file mode 100644
index 000000000..91f3017d4
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf136949.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf141269.odp b/sd/qa/unit/data/odp/tdf141269.odp
new file mode 100644
index 000000000..dfce4e064
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf141269.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf146876.odp b/sd/qa/unit/data/odp/tdf146876.odp
new file mode 100644
index 000000000..edb361fba
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf146876.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf147919.odp b/sd/qa/unit/data/odp/tdf147919.odp
new file mode 100644
index 000000000..2676b0e1c
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf147919.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf147978_enhancedPath_viewBox.odp b/sd/qa/unit/data/odp/tdf147978_enhancedPath_viewBox.odp
new file mode 100644
index 000000000..15d704681
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf147978_enhancedPath_viewBox.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf149126.odp b/sd/qa/unit/data/odp/tdf149126.odp
new file mode 100644
index 000000000..1d9c3c8c2
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf149126.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf149128.odp b/sd/qa/unit/data/odp/tdf149128.odp
new file mode 100644
index 000000000..0c26fdd6b
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf149128.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf149311.odp b/sd/qa/unit/data/odp/tdf149311.odp
new file mode 100644
index 000000000..2500ed5e7
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf149311.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf150966_hugeInset.odp b/sd/qa/unit/data/odp/tdf150966_hugeInset.odp
new file mode 100644
index 000000000..9dcc88bef
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf150966_hugeInset.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf151492.odp b/sd/qa/unit/data/odp/tdf151492.odp
new file mode 100644
index 000000000..6928dac59
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf151492.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf48735.odp b/sd/qa/unit/data/odp/tdf48735.odp
new file mode 100644
index 000000000..9a1593a0d
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf48735.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf53970.odp b/sd/qa/unit/data/odp/tdf53970.odp
new file mode 100644
index 000000000..0d48cf5d6
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf53970.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf53970_linked.odp b/sd/qa/unit/data/odp/tdf53970_linked.odp
new file mode 100644
index 000000000..3ddb79334
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf53970_linked.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf59046.odp b/sd/qa/unit/data/odp/tdf59046.odp
new file mode 100644
index 000000000..5c56acb95
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf59046.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf66228.odp b/sd/qa/unit/data/odp/tdf66228.odp
new file mode 100644
index 000000000..a34c6fc65
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf66228.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf68759.odp b/sd/qa/unit/data/odp/tdf68759.odp
new file mode 100644
index 000000000..db3e51e97
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf68759.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf74670.odp b/sd/qa/unit/data/odp/tdf74670.odp
new file mode 100644
index 000000000..98e223eb0
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf74670.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf80020.odp b/sd/qa/unit/data/odp/tdf80020.odp
new file mode 100644
index 000000000..dade8d659
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf80020.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf80224.odp b/sd/qa/unit/data/odp/tdf80224.odp
new file mode 100644
index 000000000..5712c1a7d
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf80224.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf90626.odp b/sd/qa/unit/data/odp/tdf90626.odp
new file mode 100644
index 000000000..cea98fcd7
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf90626.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf90627.odp b/sd/qa/unit/data/odp/tdf90627.odp
new file mode 100644
index 000000000..dfa28c9b0
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf90627.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf92076.odp b/sd/qa/unit/data/odp/tdf92076.odp
new file mode 100644
index 000000000..ab0a20ba2
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf92076.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf93883.odp b/sd/qa/unit/data/odp/tdf93883.odp
new file mode 100644
index 000000000..54d589ca0
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf93883.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf94122_autocolor.odp b/sd/qa/unit/data/odp/tdf94122_autocolor.odp
new file mode 100644
index 000000000..921533cbe
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf94122_autocolor.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf96206.odp b/sd/qa/unit/data/odp/tdf96206.odp
new file mode 100644
index 000000000..faebfd153
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf96206.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf96708.odp b/sd/qa/unit/data/odp/tdf96708.odp
new file mode 100644
index 000000000..bb602f390
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf96708.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf99213-target-missing.odp b/sd/qa/unit/data/odp/tdf99213-target-missing.odp
new file mode 100644
index 000000000..3bc8c7260
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf99213-target-missing.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf99224.odp b/sd/qa/unit/data/odp/tdf99224.odp
new file mode 100644
index 000000000..e52a000de
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf99224.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf99497_CircleKind.odp b/sd/qa/unit/data/odp/tdf99497_CircleKind.odp
new file mode 100644
index 000000000..f3749dfdf
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf99497_CircleKind.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf99729-legacy.odp b/sd/qa/unit/data/odp/tdf99729-legacy.odp
new file mode 100644
index 000000000..899b55c09
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf99729-legacy.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/tdf99729-new.odp b/sd/qa/unit/data/odp/tdf99729-new.odp
new file mode 100644
index 000000000..1c5a9cd5a
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf99729-new.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/testLegacyShapeAutofit.odp b/sd/qa/unit/data/odp/testLegacyShapeAutofit.odp
new file mode 100644
index 000000000..16a900b63
--- /dev/null
+++ b/sd/qa/unit/data/odp/testLegacyShapeAutofit.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/testZeroIndent.odp b/sd/qa/unit/data/odp/testZeroIndent.odp
new file mode 100644
index 000000000..ead2c0268
--- /dev/null
+++ b/sd/qa/unit/data/odp/testZeroIndent.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/text-fields.odp b/sd/qa/unit/data/odp/text-fields.odp
new file mode 100644
index 000000000..3c5d057ba
--- /dev/null
+++ b/sd/qa/unit/data/odp/text-fields.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/textbox-link-javascript.odp b/sd/qa/unit/data/odp/textbox-link-javascript.odp
new file mode 100644
index 000000000..c046cf0c7
--- /dev/null
+++ b/sd/qa/unit/data/odp/textbox-link-javascript.odp
Binary files differ
diff --git a/sd/qa/unit/data/odp/transparent_background.odp b/sd/qa/unit/data/odp/transparent_background.odp
new file mode 100644
index 000000000..ce599db54
--- /dev/null
+++ b/sd/qa/unit/data/odp/transparent_background.odp
Binary files differ
diff --git a/sd/qa/unit/data/pdf/multipage.pdf b/sd/qa/unit/data/pdf/multipage.pdf
new file mode 100644
index 000000000..65c8eeaa3
--- /dev/null
+++ b/sd/qa/unit/data/pdf/multipage.pdf
Binary files differ
diff --git a/sd/qa/unit/data/pdf/txtpic.pdf b/sd/qa/unit/data/pdf/txtpic.pdf
new file mode 100644
index 000000000..220c5822b
--- /dev/null
+++ b/sd/qa/unit/data/pdf/txtpic.pdf
Binary files differ
diff --git a/sd/qa/unit/data/ppt/FillPatterns.ppt b/sd/qa/unit/data/ppt/FillPatterns.ppt
new file mode 100644
index 000000000..bbd353b52
--- /dev/null
+++ b/sd/qa/unit/data/ppt/FillPatterns.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/crop.ppt b/sd/qa/unit/data/ppt/crop.ppt
new file mode 100644
index 000000000..844a4392a
--- /dev/null
+++ b/sd/qa/unit/data/ppt/crop.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/fail/.gitignore b/sd/qa/unit/data/ppt/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/ppt/fail/.gitignore
diff --git a/sd/qa/unit/data/ppt/fail/CVE-2010-0033-1.ppt b/sd/qa/unit/data/ppt/fail/CVE-2010-0033-1.ppt
new file mode 100644
index 000000000..0e4f50239
--- /dev/null
+++ b/sd/qa/unit/data/ppt/fail/CVE-2010-0033-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/fdo68594.ppt b/sd/qa/unit/data/ppt/fdo68594.ppt
new file mode 100644
index 000000000..83a95cd4d
--- /dev/null
+++ b/sd/qa/unit/data/ppt/fdo68594.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/indeterminate/.gitignore b/sd/qa/unit/data/ppt/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/ppt/indeterminate/.gitignore
diff --git a/sd/qa/unit/data/ppt/loopNoPause.ppt b/sd/qa/unit/data/ppt/loopNoPause.ppt
new file mode 100644
index 000000000..d82879a52
--- /dev/null
+++ b/sd/qa/unit/data/ppt/loopNoPause.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/.gitignore b/sd/qa/unit/data/ppt/pass/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/.gitignore
diff --git a/sd/qa/unit/data/ppt/pass/CVE-2006-3655-1.ppt b/sd/qa/unit/data/ppt/pass/CVE-2006-3655-1.ppt
new file mode 100644
index 000000000..3cbcb724a
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/CVE-2006-3655-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/CVE-2006-3656-1.ppt b/sd/qa/unit/data/ppt/pass/CVE-2006-3656-1.ppt
new file mode 100644
index 000000000..a1fd65a19
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/CVE-2006-3656-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/CVE-2006-3660-1.ppt b/sd/qa/unit/data/ppt/pass/CVE-2006-3660-1.ppt
new file mode 100644
index 000000000..1289cfa22
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/CVE-2006-3660-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/CVE-2006-5296-1.ppt b/sd/qa/unit/data/ppt/pass/CVE-2006-5296-1.ppt
new file mode 100644
index 000000000..5d50f905b
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/CVE-2006-5296-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/CVE-2012-4233-3.ppt b/sd/qa/unit/data/ppt/pass/CVE-2012-4233-3.ppt
new file mode 100644
index 000000000..625c116fd
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/CVE-2012-4233-3.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/EDB-39395-1.ppt b/sd/qa/unit/data/ppt/pass/EDB-39395-1.ppt
new file mode 100644
index 000000000..64043235b
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/EDB-39395-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/EDB-39397-1.ppt b/sd/qa/unit/data/ppt/pass/EDB-39397-1.ppt
new file mode 100644
index 000000000..091fb653a
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/EDB-39397-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/crash-1.ppt b/sd/qa/unit/data/ppt/pass/crash-1.ppt
new file mode 100644
index 000000000..5d1a04b33
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/crash-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/crash-2.ppt b/sd/qa/unit/data/ppt/pass/crash-2.ppt
new file mode 100644
index 000000000..78a4da466
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/crash-2.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/crash-3.ppt b/sd/qa/unit/data/ppt/pass/crash-3.ppt
new file mode 100644
index 000000000..daa0102db
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/crash-3.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-1.ppt b/sd/qa/unit/data/ppt/pass/hang-1.ppt
new file mode 100644
index 000000000..d30cb8472
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-10.ppt b/sd/qa/unit/data/ppt/pass/hang-10.ppt
new file mode 100644
index 000000000..99a81c4a3
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-10.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-11.ppt b/sd/qa/unit/data/ppt/pass/hang-11.ppt
new file mode 100644
index 000000000..2d9ef1837
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-11.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-12.ppt b/sd/qa/unit/data/ppt/pass/hang-12.ppt
new file mode 100644
index 000000000..921481c93
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-12.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-13.ppt b/sd/qa/unit/data/ppt/pass/hang-13.ppt
new file mode 100644
index 000000000..04fbdc558
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-13.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-14.ppt b/sd/qa/unit/data/ppt/pass/hang-14.ppt
new file mode 100644
index 000000000..8dd397bb3
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-14.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-15.ppt b/sd/qa/unit/data/ppt/pass/hang-15.ppt
new file mode 100644
index 000000000..b93255a7f
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-15.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-16.ppt b/sd/qa/unit/data/ppt/pass/hang-16.ppt
new file mode 100644
index 000000000..c398d2ba1
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-16.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-17.ppt b/sd/qa/unit/data/ppt/pass/hang-17.ppt
new file mode 100644
index 000000000..de876ff37
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-17.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-18.ppt b/sd/qa/unit/data/ppt/pass/hang-18.ppt
new file mode 100644
index 000000000..3b3e9f744
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-18.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-19.ppt b/sd/qa/unit/data/ppt/pass/hang-19.ppt
new file mode 100644
index 000000000..942a58a66
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-19.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-2.ppt b/sd/qa/unit/data/ppt/pass/hang-2.ppt
new file mode 100644
index 000000000..c6880b771
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-2.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-20.ppt b/sd/qa/unit/data/ppt/pass/hang-20.ppt
new file mode 100644
index 000000000..7bfe75d7b
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-20.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-21.ppt b/sd/qa/unit/data/ppt/pass/hang-21.ppt
new file mode 100644
index 000000000..99cf49f8d
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-21.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-22.ppt b/sd/qa/unit/data/ppt/pass/hang-22.ppt
new file mode 100644
index 000000000..c869b3937
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-22.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-3.ppt b/sd/qa/unit/data/ppt/pass/hang-3.ppt
new file mode 100644
index 000000000..156a9d0e5
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-3.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-4.ppt b/sd/qa/unit/data/ppt/pass/hang-4.ppt
new file mode 100644
index 000000000..f5aa24752
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-4.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-5.ppt b/sd/qa/unit/data/ppt/pass/hang-5.ppt
new file mode 100644
index 000000000..cfaa8f4c6
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-5.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-6.ppt b/sd/qa/unit/data/ppt/pass/hang-6.ppt
new file mode 100644
index 000000000..f5aa24752
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-6.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-7.ppt b/sd/qa/unit/data/ppt/pass/hang-7.ppt
new file mode 100644
index 000000000..8c05271f9
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-7.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-8.ppt b/sd/qa/unit/data/ppt/pass/hang-8.ppt
new file mode 100644
index 000000000..0f52bd5d2
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-8.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/hang-9.ppt b/sd/qa/unit/data/ppt/pass/hang-9.ppt
new file mode 100644
index 000000000..97e0158ac
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/hang-9.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/ofz14989-1.ppt b/sd/qa/unit/data/ppt/pass/ofz14989-1.ppt
new file mode 100644
index 000000000..b470ebecd
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/ofz14989-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/ofz21531-1.ppt b/sd/qa/unit/data/ppt/pass/ofz21531-1.ppt
new file mode 100644
index 000000000..0d93e5b84
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/ofz21531-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/ofz37370-1.ppt b/sd/qa/unit/data/ppt/pass/ofz37370-1.ppt
new file mode 100644
index 000000000..87f904c74
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/ofz37370-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/ofz43902-1.ppt b/sd/qa/unit/data/ppt/pass/ofz43902-1.ppt
new file mode 100644
index 000000000..44d81a951
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/ofz43902-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/pass/ofz7469-leak-1.ppt b/sd/qa/unit/data/ppt/pass/ofz7469-leak-1.ppt
new file mode 100644
index 000000000..d52f795e6
--- /dev/null
+++ b/sd/qa/unit/data/ppt/pass/ofz7469-leak-1.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/placeholder-priority.pptx b/sd/qa/unit/data/ppt/placeholder-priority.pptx
new file mode 100644
index 000000000..d11dc4785
--- /dev/null
+++ b/sd/qa/unit/data/ppt/placeholder-priority.pptx
Binary files differ
diff --git a/sd/qa/unit/data/ppt/tdf105150.ppt b/sd/qa/unit/data/ppt/tdf105150.ppt
new file mode 100644
index 000000000..c832371e9
--- /dev/null
+++ b/sd/qa/unit/data/ppt/tdf105150.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/tdf115394.ppt b/sd/qa/unit/data/ppt/tdf115394.ppt
new file mode 100644
index 000000000..1fd299a5e
--- /dev/null
+++ b/sd/qa/unit/data/ppt/tdf115394.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/tdf116899.ppt b/sd/qa/unit/data/ppt/tdf116899.ppt
new file mode 100644
index 000000000..edad3356d
--- /dev/null
+++ b/sd/qa/unit/data/ppt/tdf116899.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/tdf119629.ppt b/sd/qa/unit/data/ppt/tdf119629.ppt
new file mode 100644
index 000000000..b9c90e916
--- /dev/null
+++ b/sd/qa/unit/data/ppt/tdf119629.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt b/sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt
new file mode 100644
index 000000000..9df17e9a8
--- /dev/null
+++ b/sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/tdf126761.ppt b/sd/qa/unit/data/ppt/tdf126761.ppt
new file mode 100644
index 000000000..186799ec5
--- /dev/null
+++ b/sd/qa/unit/data/ppt/tdf126761.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/tdf136911.ppt b/sd/qa/unit/data/ppt/tdf136911.ppt
new file mode 100644
index 000000000..550dc5c3a
--- /dev/null
+++ b/sd/qa/unit/data/ppt/tdf136911.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/tdf143315-WordartWithoutBullet.ppt b/sd/qa/unit/data/ppt/tdf143315-WordartWithoutBullet.ppt
new file mode 100644
index 000000000..54111bb28
--- /dev/null
+++ b/sd/qa/unit/data/ppt/tdf143315-WordartWithoutBullet.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/tdf49561.ppt b/sd/qa/unit/data/ppt/tdf49561.ppt
new file mode 100644
index 000000000..c80bf1252
--- /dev/null
+++ b/sd/qa/unit/data/ppt/tdf49561.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/tdf49856.ppt b/sd/qa/unit/data/ppt/tdf49856.ppt
new file mode 100644
index 000000000..3e6053d45
--- /dev/null
+++ b/sd/qa/unit/data/ppt/tdf49856.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/tdf77747.ppt b/sd/qa/unit/data/ppt/tdf77747.ppt
new file mode 100644
index 000000000..e011be717
--- /dev/null
+++ b/sd/qa/unit/data/ppt/tdf77747.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/tdf79082.ppt b/sd/qa/unit/data/ppt/tdf79082.ppt
new file mode 100644
index 000000000..259b88085
--- /dev/null
+++ b/sd/qa/unit/data/ppt/tdf79082.ppt
Binary files differ
diff --git a/sd/qa/unit/data/ppt/tdf93124.ppt b/sd/qa/unit/data/ppt/tdf93124.ppt
new file mode 100644
index 000000000..fad847898
--- /dev/null
+++ b/sd/qa/unit/data/ppt/tdf93124.ppt
Binary files differ
diff --git a/sd/qa/unit/data/pptm/macro.pptm b/sd/qa/unit/data/pptm/macro.pptm
new file mode 100644
index 000000000..54e81db2a
--- /dev/null
+++ b/sd/qa/unit/data/pptm/macro.pptm
Binary files differ
diff --git a/sd/qa/unit/data/pptx/3columns.pptx b/sd/qa/unit/data/pptx/3columns.pptx
new file mode 100644
index 000000000..596db14a0
--- /dev/null
+++ b/sd/qa/unit/data/pptx/3columns.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/LostPlaceholder.odp b/sd/qa/unit/data/pptx/LostPlaceholder.odp
new file mode 100644
index 000000000..80ead189f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/LostPlaceholder.odp
Binary files differ
diff --git a/sd/qa/unit/data/pptx/LostPlaceholderFill.odp b/sd/qa/unit/data/pptx/LostPlaceholderFill.odp
new file mode 100644
index 000000000..d2ea8dab6
--- /dev/null
+++ b/sd/qa/unit/data/pptx/LostPlaceholderFill.odp
Binary files differ
diff --git a/sd/qa/unit/data/pptx/Math.pptx b/sd/qa/unit/data/pptx/Math.pptx
new file mode 100644
index 000000000..fef20675b
--- /dev/null
+++ b/sd/qa/unit/data/pptx/Math.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/ShapeLineProperties.pptx b/sd/qa/unit/data/pptx/ShapeLineProperties.pptx
new file mode 100644
index 000000000..36ece8cae
--- /dev/null
+++ b/sd/qa/unit/data/pptx/ShapeLineProperties.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/ShapePlusImage.pptx b/sd/qa/unit/data/pptx/ShapePlusImage.pptx
new file mode 100644
index 000000000..dd9424d17
--- /dev/null
+++ b/sd/qa/unit/data/pptx/ShapePlusImage.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/ShapeTextInflateTop.pptx b/sd/qa/unit/data/pptx/ShapeTextInflateTop.pptx
new file mode 100644
index 000000000..cc8fd0279
--- /dev/null
+++ b/sd/qa/unit/data/pptx/ShapeTextInflateTop.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/accent-color.pptx b/sd/qa/unit/data/pptx/accent-color.pptx
new file mode 100644
index 000000000..59591606e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/accent-color.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/activex_checkbox.pptx b/sd/qa/unit/data/pptx/activex_checkbox.pptx
new file mode 100644
index 000000000..acca5f696
--- /dev/null
+++ b/sd/qa/unit/data/pptx/activex_checkbox.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/activex_combobox.pptx b/sd/qa/unit/data/pptx/activex_combobox.pptx
new file mode 100644
index 000000000..21bb21a1b
--- /dev/null
+++ b/sd/qa/unit/data/pptx/activex_combobox.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/activex_commandbutton.pptx b/sd/qa/unit/data/pptx/activex_commandbutton.pptx
new file mode 100644
index 000000000..29a255617
--- /dev/null
+++ b/sd/qa/unit/data/pptx/activex_commandbutton.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/activex_fontproperties.pptx b/sd/qa/unit/data/pptx/activex_fontproperties.pptx
new file mode 100644
index 000000000..2f117d326
--- /dev/null
+++ b/sd/qa/unit/data/pptx/activex_fontproperties.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/activex_label.pptx b/sd/qa/unit/data/pptx/activex_label.pptx
new file mode 100644
index 000000000..3e1404e68
--- /dev/null
+++ b/sd/qa/unit/data/pptx/activex_label.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/activex_listbox.pptx b/sd/qa/unit/data/pptx/activex_listbox.pptx
new file mode 100644
index 000000000..5e232579f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/activex_listbox.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/activex_optionbutton.pptx b/sd/qa/unit/data/pptx/activex_optionbutton.pptx
new file mode 100644
index 000000000..e75498484
--- /dev/null
+++ b/sd/qa/unit/data/pptx/activex_optionbutton.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/activex_picture.pptx b/sd/qa/unit/data/pptx/activex_picture.pptx
new file mode 100644
index 000000000..425a909e1
--- /dev/null
+++ b/sd/qa/unit/data/pptx/activex_picture.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/activex_scrollbar.pptx b/sd/qa/unit/data/pptx/activex_scrollbar.pptx
new file mode 100644
index 000000000..ba7c14d93
--- /dev/null
+++ b/sd/qa/unit/data/pptx/activex_scrollbar.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/activex_spinbutton.pptx b/sd/qa/unit/data/pptx/activex_spinbutton.pptx
new file mode 100644
index 000000000..32b5f73e8
--- /dev/null
+++ b/sd/qa/unit/data/pptx/activex_spinbutton.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/activex_textbox.pptx b/sd/qa/unit/data/pptx/activex_textbox.pptx
new file mode 100644
index 000000000..68dec15d5
--- /dev/null
+++ b/sd/qa/unit/data/pptx/activex_textbox.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/activex_togglebutton.pptx b/sd/qa/unit/data/pptx/activex_togglebutton.pptx
new file mode 100644
index 000000000..3d4bfd287
--- /dev/null
+++ b/sd/qa/unit/data/pptx/activex_togglebutton.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/altdescription.pptx b/sd/qa/unit/data/pptx/altdescription.pptx
new file mode 100644
index 000000000..f116efe41
--- /dev/null
+++ b/sd/qa/unit/data/pptx/altdescription.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/arc-validiert.pptx b/sd/qa/unit/data/pptx/arc-validiert.pptx
new file mode 100644
index 000000000..163f187b0
--- /dev/null
+++ b/sd/qa/unit/data/pptx/arc-validiert.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc480256-2.pptx b/sd/qa/unit/data/pptx/bnc480256-2.pptx
new file mode 100644
index 000000000..a622d77ac
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc480256-2.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc480256.pptx b/sd/qa/unit/data/pptx/bnc480256.pptx
new file mode 100644
index 000000000..71e91c2f4
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc480256.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc584721_1_2.pptx b/sd/qa/unit/data/pptx/bnc584721_1_2.pptx
new file mode 100644
index 000000000..dbbcabddc
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc584721_1_2.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc584721_4.pptx b/sd/qa/unit/data/pptx/bnc584721_4.pptx
new file mode 100644
index 000000000..102ee0b14
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc584721_4.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc591147.pptx b/sd/qa/unit/data/pptx/bnc591147.pptx
new file mode 100644
index 000000000..afa382e65
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc591147.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc862510_5.pptx b/sd/qa/unit/data/pptx/bnc862510_5.pptx
new file mode 100644
index 000000000..ed145e4cf
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc862510_5.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc862510_6.pptx b/sd/qa/unit/data/pptx/bnc862510_6.pptx
new file mode 100644
index 000000000..fc5f008c5
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc862510_6.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc862510_7.pptx b/sd/qa/unit/data/pptx/bnc862510_7.pptx
new file mode 100644
index 000000000..0eb3bbec7
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc862510_7.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc870233_1.pptx b/sd/qa/unit/data/pptx/bnc870233_1.pptx
new file mode 100644
index 000000000..0659e30b3
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc870233_1.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc870233_2.pptx b/sd/qa/unit/data/pptx/bnc870233_2.pptx
new file mode 100644
index 000000000..7f4fc715a
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc870233_2.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc870237.pptx b/sd/qa/unit/data/pptx/bnc870237.pptx
new file mode 100644
index 000000000..245ef51f8
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc870237.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc880763.pptx b/sd/qa/unit/data/pptx/bnc880763.pptx
new file mode 100644
index 000000000..f45eb13ec
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc880763.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc887225.pptx b/sd/qa/unit/data/pptx/bnc887225.pptx
new file mode 100644
index 000000000..e5c528f18
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc887225.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc887230.pptx b/sd/qa/unit/data/pptx/bnc887230.pptx
new file mode 100644
index 000000000..7d4a23578
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc887230.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc904423.pptx b/sd/qa/unit/data/pptx/bnc904423.pptx
new file mode 100644
index 000000000..618ad1b47
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc904423.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bnc910045.pptx b/sd/qa/unit/data/pptx/bnc910045.pptx
new file mode 100644
index 000000000..5788ea929
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bnc910045.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bulletColor.pptx b/sd/qa/unit/data/pptx/bulletColor.pptx
new file mode 100644
index 000000000..61bb834e4
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bulletColor.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/bulletMarginAndIndent.pptx b/sd/qa/unit/data/pptx/bulletMarginAndIndent.pptx
new file mode 100644
index 000000000..3ecfb5a74
--- /dev/null
+++ b/sd/qa/unit/data/pptx/bulletMarginAndIndent.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/connectors.pptx b/sd/qa/unit/data/pptx/connectors.pptx
new file mode 100644
index 000000000..2f65acba1
--- /dev/null
+++ b/sd/qa/unit/data/pptx/connectors.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/control_background_color.pptx b/sd/qa/unit/data/pptx/control_background_color.pptx
new file mode 100644
index 000000000..5d3fe61c5
--- /dev/null
+++ b/sd/qa/unit/data/pptx/control_background_color.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/crop-position.pptx b/sd/qa/unit/data/pptx/crop-position.pptx
new file mode 100644
index 000000000..85b859be6
--- /dev/null
+++ b/sd/qa/unit/data/pptx/crop-position.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/crop-to-shape.pptx b/sd/qa/unit/data/pptx/crop-to-shape.pptx
new file mode 100644
index 000000000..929b07e00
--- /dev/null
+++ b/sd/qa/unit/data/pptx/crop-to-shape.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/croppedTo0.pptx b/sd/qa/unit/data/pptx/croppedTo0.pptx
new file mode 100644
index 000000000..081661f48
--- /dev/null
+++ b/sd/qa/unit/data/pptx/croppedTo0.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/cshapes.pptx b/sd/qa/unit/data/pptx/cshapes.pptx
new file mode 100644
index 000000000..b54620625
--- /dev/null
+++ b/sd/qa/unit/data/pptx/cshapes.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptx b/sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptx
new file mode 100644
index 000000000..e162f7e99
--- /dev/null
+++ b/sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/customxml.pptx b/sd/qa/unit/data/pptx/customxml.pptx
new file mode 100644
index 000000000..ca9e8fe70
--- /dev/null
+++ b/sd/qa/unit/data/pptx/customxml.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/deftabstop.pptx b/sd/qa/unit/data/pptx/deftabstop.pptx
new file mode 100644
index 000000000..5cfe71794
--- /dev/null
+++ b/sd/qa/unit/data/pptx/deftabstop.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/effectOrder.pptx b/sd/qa/unit/data/pptx/effectOrder.pptx
new file mode 100644
index 000000000..7f913b372
--- /dev/null
+++ b/sd/qa/unit/data/pptx/effectOrder.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/fail/.gitignore b/sd/qa/unit/data/pptx/fail/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/pptx/fail/.gitignore
diff --git a/sd/qa/unit/data/pptx/fail/CVE-2014-6352-1.ppsx b/sd/qa/unit/data/pptx/fail/CVE-2014-6352-1.ppsx
new file mode 100644
index 000000000..f88506ff7
--- /dev/null
+++ b/sd/qa/unit/data/pptx/fail/CVE-2014-6352-1.ppsx
@@ -0,0 +1 @@
+ת.Gx©Š}Ø'[eë2Î~ \ No newline at end of file
diff --git a/sd/qa/unit/data/pptx/fdo83751.pptx b/sd/qa/unit/data/pptx/fdo83751.pptx
new file mode 100644
index 000000000..be0dfe43d
--- /dev/null
+++ b/sd/qa/unit/data/pptx/fdo83751.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/fill-color-list.pptx b/sd/qa/unit/data/pptx/fill-color-list.pptx
new file mode 100644
index 000000000..c88434952
--- /dev/null
+++ b/sd/qa/unit/data/pptx/fill-color-list.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/font-scale.pptx b/sd/qa/unit/data/pptx/font-scale.pptx
new file mode 100644
index 000000000..df33b20ce
--- /dev/null
+++ b/sd/qa/unit/data/pptx/font-scale.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/greysscale-graphic.pptx b/sd/qa/unit/data/pptx/greysscale-graphic.pptx
new file mode 100644
index 000000000..547b60c10
--- /dev/null
+++ b/sd/qa/unit/data/pptx/greysscale-graphic.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/group-rot.pptx b/sd/qa/unit/data/pptx/group-rot.pptx
new file mode 100644
index 000000000..11b2d6367
--- /dev/null
+++ b/sd/qa/unit/data/pptx/group-rot.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/group.pptx b/sd/qa/unit/data/pptx/group.pptx
new file mode 100644
index 000000000..f0b739ee2
--- /dev/null
+++ b/sd/qa/unit/data/pptx/group.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/hyperlinkOnImage.pptx b/sd/qa/unit/data/pptx/hyperlinkOnImage.pptx
new file mode 100644
index 000000000..38832da5e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/hyperlinkOnImage.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/hyperlinktest.pptx b/sd/qa/unit/data/pptx/hyperlinktest.pptx
new file mode 100644
index 000000000..dac61c023
--- /dev/null
+++ b/sd/qa/unit/data/pptx/hyperlinktest.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/indeterminate/.gitignore b/sd/qa/unit/data/pptx/indeterminate/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/pptx/indeterminate/.gitignore
diff --git a/sd/qa/unit/data/pptx/lineStyle.pptx b/sd/qa/unit/data/pptx/lineStyle.pptx
new file mode 100644
index 000000000..0af7efabf
--- /dev/null
+++ b/sd/qa/unit/data/pptx/lineStyle.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/loopNoPause.pptx b/sd/qa/unit/data/pptx/loopNoPause.pptx
new file mode 100644
index 000000000..f0c9966ce
--- /dev/null
+++ b/sd/qa/unit/data/pptx/loopNoPause.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/mirrored-graphic.pptx b/sd/qa/unit/data/pptx/mirrored-graphic.pptx
new file mode 100644
index 000000000..c7cd6a406
--- /dev/null
+++ b/sd/qa/unit/data/pptx/mirrored-graphic.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/multicol.pptx b/sd/qa/unit/data/pptx/multicol.pptx
new file mode 100644
index 000000000..3590d84c1
--- /dev/null
+++ b/sd/qa/unit/data/pptx/multicol.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/n778859.pptx b/sd/qa/unit/data/pptx/n778859.pptx
new file mode 100644
index 000000000..034cfc544
--- /dev/null
+++ b/sd/qa/unit/data/pptx/n778859.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/n80340.pptx b/sd/qa/unit/data/pptx/n80340.pptx
new file mode 100644
index 000000000..670207559
--- /dev/null
+++ b/sd/qa/unit/data/pptx/n80340.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/n821567.pptx b/sd/qa/unit/data/pptx/n821567.pptx
new file mode 100644
index 000000000..9f365ad02
--- /dev/null
+++ b/sd/qa/unit/data/pptx/n821567.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/n828390.pptx b/sd/qa/unit/data/pptx/n828390.pptx
new file mode 100644
index 000000000..e28a78559
--- /dev/null
+++ b/sd/qa/unit/data/pptx/n828390.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/n828390_2.pptx b/sd/qa/unit/data/pptx/n828390_2.pptx
new file mode 100644
index 000000000..e30948fd7
--- /dev/null
+++ b/sd/qa/unit/data/pptx/n828390_2.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/n828390_3.pptx b/sd/qa/unit/data/pptx/n828390_3.pptx
new file mode 100644
index 000000000..ad9575858
--- /dev/null
+++ b/sd/qa/unit/data/pptx/n828390_3.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/n83889.pptx b/sd/qa/unit/data/pptx/n83889.pptx
new file mode 100644
index 000000000..e2f0b1386
--- /dev/null
+++ b/sd/qa/unit/data/pptx/n83889.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/n862510_1.pptx b/sd/qa/unit/data/pptx/n862510_1.pptx
new file mode 100644
index 000000000..2a16a4b66
--- /dev/null
+++ b/sd/qa/unit/data/pptx/n862510_1.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/n862510_2.pptx b/sd/qa/unit/data/pptx/n862510_2.pptx
new file mode 100644
index 000000000..b46cea502
--- /dev/null
+++ b/sd/qa/unit/data/pptx/n862510_2.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/n862510_4.pptx b/sd/qa/unit/data/pptx/n862510_4.pptx
new file mode 100644
index 000000000..0a461eee6
--- /dev/null
+++ b/sd/qa/unit/data/pptx/n862510_4.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/n90190.pptx b/sd/qa/unit/data/pptx/n90190.pptx
new file mode 100644
index 000000000..caeabe710
--- /dev/null
+++ b/sd/qa/unit/data/pptx/n90190.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/n90223.pptx b/sd/qa/unit/data/pptx/n90223.pptx
new file mode 100644
index 000000000..0a9ee82d8
--- /dev/null
+++ b/sd/qa/unit/data/pptx/n90223.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/n90255.pptx b/sd/qa/unit/data/pptx/n90255.pptx
new file mode 100644
index 000000000..2263d89bb
--- /dev/null
+++ b/sd/qa/unit/data/pptx/n90255.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/narration-non-media-shape.pptx b/sd/qa/unit/data/pptx/narration-non-media-shape.pptx
new file mode 100644
index 000000000..e7a527485
--- /dev/null
+++ b/sd/qa/unit/data/pptx/narration-non-media-shape.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/narration.pptx b/sd/qa/unit/data/pptx/narration.pptx
new file mode 100644
index 000000000..5226ce607
--- /dev/null
+++ b/sd/qa/unit/data/pptx/narration.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/numfmt.pptx b/sd/qa/unit/data/pptx/numfmt.pptx
new file mode 100644
index 000000000..f855fbbeb
--- /dev/null
+++ b/sd/qa/unit/data/pptx/numfmt.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/ole-emf_min.pptx b/sd/qa/unit/data/pptx/ole-emf_min.pptx
new file mode 100644
index 000000000..0f97208fb
--- /dev/null
+++ b/sd/qa/unit/data/pptx/ole-emf_min.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/ole.pptx b/sd/qa/unit/data/pptx/ole.pptx
new file mode 100644
index 000000000..b998e79e0
--- /dev/null
+++ b/sd/qa/unit/data/pptx/ole.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/ooxtheme.pptx b/sd/qa/unit/data/pptx/ooxtheme.pptx
new file mode 100644
index 000000000..f0f3f2575
--- /dev/null
+++ b/sd/qa/unit/data/pptx/ooxtheme.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/open-as-read-only.pptx b/sd/qa/unit/data/pptx/open-as-read-only.pptx
new file mode 100644
index 000000000..57a4d32de
--- /dev/null
+++ b/sd/qa/unit/data/pptx/open-as-read-only.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/page_transparent_bitmap.pptx b/sd/qa/unit/data/pptx/page_transparent_bitmap.pptx
new file mode 100644
index 000000000..ac1dd074b
--- /dev/null
+++ b/sd/qa/unit/data/pptx/page_transparent_bitmap.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/paraMarginAndIndentation.pptx b/sd/qa/unit/data/pptx/paraMarginAndIndentation.pptx
new file mode 100644
index 000000000..a6164a227
--- /dev/null
+++ b/sd/qa/unit/data/pptx/paraMarginAndIndentation.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/pass/.gitignore b/sd/qa/unit/data/pptx/pass/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/sd/qa/unit/data/pptx/pass/.gitignore
diff --git a/sd/qa/unit/data/pptx/pass/CVE-2014-4114.ppsx b/sd/qa/unit/data/pptx/pass/CVE-2014-4114.ppsx
new file mode 100644
index 000000000..ee80cbe4e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/pass/CVE-2014-4114.ppsx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/pass/ofz35597-1.pptx b/sd/qa/unit/data/pptx/pass/ofz35597-1.pptx
new file mode 100644
index 000000000..e7fcacc25
--- /dev/null
+++ b/sd/qa/unit/data/pptx/pass/ofz35597-1.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/pass/ofz46160-1.pptx b/sd/qa/unit/data/pptx/pass/ofz46160-1.pptx
new file mode 100644
index 000000000..721d1d87d
--- /dev/null
+++ b/sd/qa/unit/data/pptx/pass/ofz46160-1.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/predefined-table-style.pptx b/sd/qa/unit/data/pptx/predefined-table-style.pptx
new file mode 100644
index 000000000..5c3429f9e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/predefined-table-style.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/presetDashDot.pptx b/sd/qa/unit/data/pptx/presetDashDot.pptx
new file mode 100644
index 000000000..ae1525c97
--- /dev/null
+++ b/sd/qa/unit/data/pptx/presetDashDot.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/rightToLeftParagraph.pptx b/sd/qa/unit/data/pptx/rightToLeftParagraph.pptx
new file mode 100644
index 000000000..8c3a46c8b
--- /dev/null
+++ b/sd/qa/unit/data/pptx/rightToLeftParagraph.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/shape-blur-effect.pptx b/sd/qa/unit/data/pptx/shape-blur-effect.pptx
new file mode 100644
index 000000000..db304fa65
--- /dev/null
+++ b/sd/qa/unit/data/pptx/shape-blur-effect.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/shape-glow-effect.pptx b/sd/qa/unit/data/pptx/shape-glow-effect.pptx
new file mode 100644
index 000000000..6a33aa58f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/shape-glow-effect.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/shape-soft-edges.pptx b/sd/qa/unit/data/pptx/shape-soft-edges.pptx
new file mode 100644
index 000000000..cafb8cf4c
--- /dev/null
+++ b/sd/qa/unit/data/pptx/shape-soft-edges.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/shape-text-rotate.pptx b/sd/qa/unit/data/pptx/shape-text-rotate.pptx
new file mode 100644
index 000000000..4a433c748
--- /dev/null
+++ b/sd/qa/unit/data/pptx/shape-text-rotate.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/slidenum_field.pptx b/sd/qa/unit/data/pptx/slidenum_field.pptx
new file mode 100644
index 000000000..338856883
--- /dev/null
+++ b/sd/qa/unit/data/pptx/slidenum_field.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-accent-process.pptx b/sd/qa/unit/data/pptx/smartart-accent-process.pptx
new file mode 100644
index 000000000..8710e7f17
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-accent-process.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-autoTxRot.pptx b/sd/qa/unit/data/pptx/smartart-autoTxRot.pptx
new file mode 100644
index 000000000..30e69a6de
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-autoTxRot.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-autofit-sync.pptx b/sd/qa/unit/data/pptx/smartart-autofit-sync.pptx
new file mode 100644
index 000000000..9a6ce0f49
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-autofit-sync.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-background-drawingml-fallback.pptx b/sd/qa/unit/data/pptx/smartart-background-drawingml-fallback.pptx
new file mode 100644
index 000000000..d89f28a21
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-background-drawingml-fallback.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-background.pptx b/sd/qa/unit/data/pptx/smartart-background.pptx
new file mode 100644
index 000000000..beb862dc1
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-background.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-bullet-list.pptx b/sd/qa/unit/data/pptx/smartart-bullet-list.pptx
new file mode 100644
index 000000000..d95bdb769
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-bullet-list.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-center-cycle.pptx b/sd/qa/unit/data/pptx/smartart-center-cycle.pptx
new file mode 100644
index 000000000..72f3685fb
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-center-cycle.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-chevron.pptx b/sd/qa/unit/data/pptx/smartart-chevron.pptx
new file mode 100644
index 000000000..883fbeb49
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-chevron.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-children.pptx b/sd/qa/unit/data/pptx/smartart-children.pptx
new file mode 100644
index 000000000..8eca2f21e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-children.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-cnt.pptx b/sd/qa/unit/data/pptx/smartart-cnt.pptx
new file mode 100644
index 000000000..4ab27d169
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-cnt.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-composite-infer-right.pptx b/sd/qa/unit/data/pptx/smartart-composite-infer-right.pptx
new file mode 100644
index 000000000..ca417499f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-composite-infer-right.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-continuous-block-process.pptx b/sd/qa/unit/data/pptx/smartart-continuous-block-process.pptx
new file mode 100644
index 000000000..b2ef58f0b
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-continuous-block-process.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-cycle-matrix.pptx b/sd/qa/unit/data/pptx/smartart-cycle-matrix.pptx
new file mode 100644
index 000000000..fb1cb7ea2
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-cycle-matrix.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-cycle.pptx b/sd/qa/unit/data/pptx/smartart-cycle.pptx
new file mode 100644
index 000000000..bea0524d3
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-cycle.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-data-follow.pptx b/sd/qa/unit/data/pptx/smartart-data-follow.pptx
new file mode 100644
index 000000000..7e906462d
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-data-follow.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-dir.pptx b/sd/qa/unit/data/pptx/smartart-dir.pptx
new file mode 100644
index 000000000..ab94459d2
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-dir.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-font-size.pptx b/sd/qa/unit/data/pptx/smartart-font-size.pptx
new file mode 100644
index 000000000..253cd4c73
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-font-size.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx b/sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx
new file mode 100644
index 000000000..ef678b6c3
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-linear-rule-vert.pptx b/sd/qa/unit/data/pptx/smartart-linear-rule-vert.pptx
new file mode 100644
index 000000000..cf1a23a61
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-linear-rule-vert.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-linear-rule.pptx b/sd/qa/unit/data/pptx/smartart-linear-rule.pptx
new file mode 100644
index 000000000..05905299e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-linear-rule.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-maxdepth.pptx b/sd/qa/unit/data/pptx/smartart-maxdepth.pptx
new file mode 100644
index 000000000..545d744bd
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-maxdepth.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-missing-bullet.pptx b/sd/qa/unit/data/pptx/smartart-missing-bullet.pptx
new file mode 100644
index 000000000..2917875a0
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-missing-bullet.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-multidirectional.pptx b/sd/qa/unit/data/pptx/smartart-multidirectional.pptx
new file mode 100644
index 000000000..fd723982a
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-multidirectional.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-org-chart.pptx b/sd/qa/unit/data/pptx/smartart-org-chart.pptx
new file mode 100644
index 000000000..08c9a4fc9
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-org-chart.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-org-chart2.pptx b/sd/qa/unit/data/pptx/smartart-org-chart2.pptx
new file mode 100644
index 000000000..5e2be2167
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-org-chart2.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-picture-strip.pptx b/sd/qa/unit/data/pptx/smartart-picture-strip.pptx
new file mode 100644
index 000000000..bfb8d4f2c
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-picture-strip.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-preserve.pptx b/sd/qa/unit/data/pptx/smartart-preserve.pptx
new file mode 100644
index 000000000..6108a8c77
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-preserve.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-pyramid-1child.pptx b/sd/qa/unit/data/pptx/smartart-pyramid-1child.pptx
new file mode 100644
index 000000000..42e43c54b
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-pyramid-1child.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-pyramid.pptx b/sd/qa/unit/data/pptx/smartart-pyramid.pptx
new file mode 100644
index 000000000..7c2296f9d
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-pyramid.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-recursion.pptx b/sd/qa/unit/data/pptx/smartart-recursion.pptx
new file mode 100644
index 000000000..205db6b70
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-recursion.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-rightoleftblockdiagram.pptx b/sd/qa/unit/data/pptx/smartart-rightoleftblockdiagram.pptx
new file mode 100644
index 000000000..1a6421b9b
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-rightoleftblockdiagram.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-rotation.pptx b/sd/qa/unit/data/pptx/smartart-rotation.pptx
new file mode 100644
index 000000000..e938d9a29
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-rotation.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-rotation2.pptx b/sd/qa/unit/data/pptx/smartart-rotation2.pptx
new file mode 100644
index 000000000..e1c4493a7
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-rotation2.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-snake-rows.pptx b/sd/qa/unit/data/pptx/smartart-snake-rows.pptx
new file mode 100644
index 000000000..7f5e82df3
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-snake-rows.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-tdf134221.pptx b/sd/qa/unit/data/pptx/smartart-tdf134221.pptx
new file mode 100644
index 000000000..5ef12a7ff
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-tdf134221.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-text.pptx b/sd/qa/unit/data/pptx/smartart-text.pptx
new file mode 100644
index 000000000..9656e4fab
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-text.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-vertical-block-list.pptx b/sd/qa/unit/data/pptx/smartart-vertical-block-list.pptx
new file mode 100644
index 000000000..923f03c0e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-vertical-block-list.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart-vertical-box-list.pptx b/sd/qa/unit/data/pptx/smartart-vertical-box-list.pptx
new file mode 100644
index 000000000..b67d99e70
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart-vertical-box-list.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/smartart1.pptx b/sd/qa/unit/data/pptx/smartart1.pptx
new file mode 100644
index 000000000..2a8817f15
--- /dev/null
+++ b/sd/qa/unit/data/pptx/smartart1.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/table-list.pptx b/sd/qa/unit/data/pptx/table-list.pptx
new file mode 100644
index 000000000..bc5fe7418
--- /dev/null
+++ b/sd/qa/unit/data/pptx/table-list.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tableBorderLineStyle.pptx b/sd/qa/unit/data/pptx/tableBorderLineStyle.pptx
new file mode 100644
index 000000000..c46b7bcee
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tableBorderLineStyle.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tablescale.pptx b/sd/qa/unit/data/pptx/tablescale.pptx
new file mode 100644
index 000000000..c4d946e5c
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tablescale.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf100065.pptx b/sd/qa/unit/data/pptx/tdf100065.pptx
new file mode 100644
index 000000000..c6125dc6d
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf100065.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf100926.pptx b/sd/qa/unit/data/pptx/tdf100926.pptx
new file mode 100644
index 000000000..71627394e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf100926.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf100926_ODP.pptx b/sd/qa/unit/data/pptx/tdf100926_ODP.pptx
new file mode 100644
index 000000000..71627394e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf100926_ODP.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf103347.pptx b/sd/qa/unit/data/pptx/tdf103347.pptx
new file mode 100644
index 000000000..120785190
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf103347.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf103473.pptx b/sd/qa/unit/data/pptx/tdf103473.pptx
new file mode 100644
index 000000000..5b31b761d
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf103473.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf103477.pptx b/sd/qa/unit/data/pptx/tdf103477.pptx
new file mode 100644
index 000000000..0ee96462c
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf103477.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf103792.pptx b/sd/qa/unit/data/pptx/tdf103792.pptx
new file mode 100644
index 000000000..e48d25e40
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf103792.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf103800.pptx b/sd/qa/unit/data/pptx/tdf103800.pptx
new file mode 100644
index 000000000..91f8bb719
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf103800.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf103876.pptx b/sd/qa/unit/data/pptx/tdf103876.pptx
new file mode 100644
index 000000000..5eb7e869e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf103876.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf104015.pptx b/sd/qa/unit/data/pptx/tdf104015.pptx
new file mode 100644
index 000000000..f3675f9e8
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf104015.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf104201.pptx b/sd/qa/unit/data/pptx/tdf104201.pptx
new file mode 100644
index 000000000..99a6532a6
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf104201.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf104445.pptx b/sd/qa/unit/data/pptx/tdf104445.pptx
new file mode 100644
index 000000000..bee32dc00
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf104445.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf104722.pptx b/sd/qa/unit/data/pptx/tdf104722.pptx
new file mode 100644
index 000000000..27ea41958
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf104722.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf104786.pptx b/sd/qa/unit/data/pptx/tdf104786.pptx
new file mode 100644
index 000000000..165b5676e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf104786.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf104788.pptx b/sd/qa/unit/data/pptx/tdf104788.pptx
new file mode 100644
index 000000000..c46fb3da5
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf104788.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf104789.pptx b/sd/qa/unit/data/pptx/tdf104789.pptx
new file mode 100644
index 000000000..d5ead6a93
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf104789.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf104792-smart-art-animation.pptx b/sd/qa/unit/data/pptx/tdf104792-smart-art-animation.pptx
new file mode 100644
index 000000000..ac72639ef
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf104792-smart-art-animation.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf105150.pptx b/sd/qa/unit/data/pptx/tdf105150.pptx
new file mode 100644
index 000000000..48a2e01dc
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf105150.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf105739.pptx b/sd/qa/unit/data/pptx/tdf105739.pptx
new file mode 100644
index 000000000..08e26f55a
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf105739.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf106638.pptx b/sd/qa/unit/data/pptx/tdf106638.pptx
new file mode 100644
index 000000000..6a4d7819e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf106638.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf106867.pptx b/sd/qa/unit/data/pptx/tdf106867.pptx
new file mode 100644
index 000000000..5bf16d690
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf106867.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf107608.pptx b/sd/qa/unit/data/pptx/tdf107608.pptx
new file mode 100644
index 000000000..52973c8ed
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf107608.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf108926.ppt b/sd/qa/unit/data/pptx/tdf108926.ppt
new file mode 100644
index 000000000..c8455e226
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf108926.ppt
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf109067.pptx b/sd/qa/unit/data/pptx/tdf109067.pptx
new file mode 100644
index 000000000..ef213774c
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf109067.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf109187.pptx b/sd/qa/unit/data/pptx/tdf109187.pptx
new file mode 100644
index 000000000..0fd03c81e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf109187.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf111518.pptx b/sd/qa/unit/data/pptx/tdf111518.pptx
new file mode 100644
index 000000000..a0d77617f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf111518.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf111786.pptx b/sd/qa/unit/data/pptx/tdf111786.pptx
new file mode 100644
index 000000000..5d8f62b24
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf111786.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf111789.pptx b/sd/qa/unit/data/pptx/tdf111789.pptx
new file mode 100644
index 000000000..32d7d754a
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf111789.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf111863.pptx b/sd/qa/unit/data/pptx/tdf111863.pptx
new file mode 100644
index 000000000..19579ada5
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf111863.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf111884.pptx b/sd/qa/unit/data/pptx/tdf111884.pptx
new file mode 100644
index 000000000..9d08b668d
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf111884.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf112086.pptx b/sd/qa/unit/data/pptx/tdf112086.pptx
new file mode 100644
index 000000000..ba125df45
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf112086.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf112088.pptx b/sd/qa/unit/data/pptx/tdf112088.pptx
new file mode 100644
index 000000000..5ad58192e
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf112088.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf112089.pptx b/sd/qa/unit/data/pptx/tdf112089.pptx
new file mode 100644
index 000000000..d0cafcd91
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf112089.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf112209.pptx b/sd/qa/unit/data/pptx/tdf112209.pptx
new file mode 100644
index 000000000..80865820d
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf112209.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf112280.pptx b/sd/qa/unit/data/pptx/tdf112280.pptx
new file mode 100644
index 000000000..39c2aa4cb
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf112280.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf112333.pptx b/sd/qa/unit/data/pptx/tdf112333.pptx
new file mode 100644
index 000000000..c381ed8b3
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf112333.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf112334.pptx b/sd/qa/unit/data/pptx/tdf112334.pptx
new file mode 100644
index 000000000..1e57d41ca
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf112334.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf112633.pptx b/sd/qa/unit/data/pptx/tdf112633.pptx
new file mode 100644
index 000000000..b9e062967
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf112633.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf113163.pptx b/sd/qa/unit/data/pptx/tdf113163.pptx
new file mode 100644
index 000000000..f220eb940
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf113163.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf113198.pptx b/sd/qa/unit/data/pptx/tdf113198.pptx
new file mode 100644
index 000000000..a541a2b26
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf113198.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf113818-swivel.pptx b/sd/qa/unit/data/pptx/tdf113818-swivel.pptx
new file mode 100644
index 000000000..f39225223
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf113818-swivel.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf113822underline.pptx b/sd/qa/unit/data/pptx/tdf113822underline.pptx
new file mode 100644
index 000000000..2d0d07654
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf113822underline.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf114821.pptx b/sd/qa/unit/data/pptx/tdf114821.pptx
new file mode 100644
index 000000000..3813b0607
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf114821.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf114845_rotateShape.pptx b/sd/qa/unit/data/pptx/tdf114845_rotateShape.pptx
new file mode 100644
index 000000000..e9fcb92d8
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf114845_rotateShape.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf114848.pptx b/sd/qa/unit/data/pptx/tdf114848.pptx
new file mode 100644
index 000000000..5b8b6c3fa
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf114848.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf114913.pptx b/sd/qa/unit/data/pptx/tdf114913.pptx
new file mode 100644
index 000000000..cf031aba0
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf114913.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf115394-zero.pptx b/sd/qa/unit/data/pptx/tdf115394-zero.pptx
new file mode 100644
index 000000000..e8fb0cfa2
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf115394-zero.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf115394.pptx b/sd/qa/unit/data/pptx/tdf115394.pptx
new file mode 100644
index 000000000..d01c90270
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf115394.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf116350-texteffects.pptx b/sd/qa/unit/data/pptx/tdf116350-texteffects.pptx
new file mode 100644
index 000000000..2a5067ae1
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf116350-texteffects.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf118776.pptx b/sd/qa/unit/data/pptx/tdf118776.pptx
new file mode 100644
index 000000000..8df94522a
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf118776.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf119015.pptx b/sd/qa/unit/data/pptx/tdf119015.pptx
new file mode 100644
index 000000000..8c2313ad9
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf119015.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf119087.pptx b/sd/qa/unit/data/pptx/tdf119087.pptx
new file mode 100644
index 000000000..d70bc8b0d
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf119087.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf119118.pptx b/sd/qa/unit/data/pptx/tdf119118.pptx
new file mode 100644
index 000000000..8eba15328
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf119118.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf119187.pptx b/sd/qa/unit/data/pptx/tdf119187.pptx
new file mode 100644
index 000000000..0c4501abb
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf119187.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf119649.pptx b/sd/qa/unit/data/pptx/tdf119649.pptx
new file mode 100644
index 000000000..303d4c0ad
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf119649.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf120028.pptx b/sd/qa/unit/data/pptx/tdf120028.pptx
new file mode 100644
index 000000000..035c36730
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf120028.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf120573.pptx b/sd/qa/unit/data/pptx/tdf120573.pptx
new file mode 100644
index 000000000..3c8070fc9
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf120573.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf123090.pptx b/sd/qa/unit/data/pptx/tdf123090.pptx
new file mode 100644
index 000000000..c219f52de
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf123090.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf123684.pptx b/sd/qa/unit/data/pptx/tdf123684.pptx
new file mode 100644
index 000000000..872434227
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf123684.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf124457.pptx b/sd/qa/unit/data/pptx/tdf124457.pptx
new file mode 100644
index 000000000..5ea5173a1
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf124457.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf125071.pptx b/sd/qa/unit/data/pptx/tdf125071.pptx
new file mode 100644
index 000000000..42b65ab1f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf125071.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf125346.pptx b/sd/qa/unit/data/pptx/tdf125346.pptx
new file mode 100644
index 000000000..32fbbdf52
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf125346.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf125346_2.pptx b/sd/qa/unit/data/pptx/tdf125346_2.pptx
new file mode 100644
index 000000000..532255810
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf125346_2.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf125360.pptx b/sd/qa/unit/data/pptx/tdf125360.pptx
new file mode 100644
index 000000000..c1a3045bc
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf125360.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf125360_1.pptx b/sd/qa/unit/data/pptx/tdf125360_1.pptx
new file mode 100644
index 000000000..cfc579836
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf125360_1.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf125360_2.pptx b/sd/qa/unit/data/pptx/tdf125360_2.pptx
new file mode 100644
index 000000000..4f6b16455
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf125360_2.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf125551.pptx b/sd/qa/unit/data/pptx/tdf125551.pptx
new file mode 100644
index 000000000..fb7c106d2
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf125551.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf125554.pptx b/sd/qa/unit/data/pptx/tdf125554.pptx
new file mode 100644
index 000000000..b78bc43fa
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf125554.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptx b/sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptx
new file mode 100644
index 000000000..e8d1938a2
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf126234.pptx b/sd/qa/unit/data/pptx/tdf126234.pptx
new file mode 100644
index 000000000..7db54f822
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf126234.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf126324.pptx b/sd/qa/unit/data/pptx/tdf126324.pptx
new file mode 100644
index 000000000..d5540cdc4
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf126324.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf126741.pptx b/sd/qa/unit/data/pptx/tdf126741.pptx
new file mode 100644
index 000000000..ca74d1c34
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf126741.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf127090.odp b/sd/qa/unit/data/pptx/tdf127090.odp
new file mode 100644
index 000000000..bbdc79958
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf127090.odp
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf127129.pptx b/sd/qa/unit/data/pptx/tdf127129.pptx
new file mode 100644
index 000000000..680fcf631
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf127129.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf127237.pptx b/sd/qa/unit/data/pptx/tdf127237.pptx
new file mode 100644
index 000000000..f63423cd4
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf127237.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf127964.pptx b/sd/qa/unit/data/pptx/tdf127964.pptx
new file mode 100644
index 000000000..89482a4ce
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf127964.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf128212.pptx b/sd/qa/unit/data/pptx/tdf128212.pptx
new file mode 100644
index 000000000..52ba8ed0d
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf128212.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf128213-shaperot.pptx b/sd/qa/unit/data/pptx/tdf128213-shaperot.pptx
new file mode 100644
index 000000000..4e834bb7c
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf128213-shaperot.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf128213.pptx b/sd/qa/unit/data/pptx/tdf128213.pptx
new file mode 100644
index 000000000..1f308128c
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf128213.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf128550.pptx b/sd/qa/unit/data/pptx/tdf128550.pptx
new file mode 100644
index 000000000..e2be342b2
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf128550.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf128596.pptx b/sd/qa/unit/data/pptx/tdf128596.pptx
new file mode 100644
index 000000000..62a166308
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf128596.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf128684.pptx b/sd/qa/unit/data/pptx/tdf128684.pptx
new file mode 100644
index 000000000..80a5f3056
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf128684.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf128952.pptx b/sd/qa/unit/data/pptx/tdf128952.pptx
new file mode 100644
index 000000000..242a3ee9a
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf128952.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf129372.pptx b/sd/qa/unit/data/pptx/tdf129372.pptx
new file mode 100644
index 000000000..ff172c9cd
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf129372.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf129686.pptx b/sd/qa/unit/data/pptx/tdf129686.pptx
new file mode 100644
index 000000000..9aeb396f6
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf129686.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf130058.pptx b/sd/qa/unit/data/pptx/tdf130058.pptx
new file mode 100644
index 000000000..cb28109ec
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf130058.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf131390.pptx b/sd/qa/unit/data/pptx/tdf131390.pptx
new file mode 100644
index 000000000..22069d816
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf131390.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf131553.pptx b/sd/qa/unit/data/pptx/tdf131553.pptx
new file mode 100644
index 000000000..106067d51
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf131553.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf131554.pptx b/sd/qa/unit/data/pptx/tdf131554.pptx
new file mode 100644
index 000000000..a65f423ad
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf131554.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf131905.pptx b/sd/qa/unit/data/pptx/tdf131905.pptx
new file mode 100644
index 000000000..4d203510f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf131905.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf132282.pptx b/sd/qa/unit/data/pptx/tdf132282.pptx
new file mode 100644
index 000000000..cc1d7df4c
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf132282.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf132472.pptx b/sd/qa/unit/data/pptx/tdf132472.pptx
new file mode 100644
index 000000000..e7873dcd5
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf132472.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf134053_dashdot.pptx b/sd/qa/unit/data/pptx/tdf134053_dashdot.pptx
new file mode 100644
index 000000000..f2d951c57
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf134053_dashdot.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf134174.pptx b/sd/qa/unit/data/pptx/tdf134174.pptx
new file mode 100644
index 000000000..ef722dc50
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf134174.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf134210.pptx b/sd/qa/unit/data/pptx/tdf134210.pptx
new file mode 100644
index 000000000..6867ac480
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf134210.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf135843.pptx b/sd/qa/unit/data/pptx/tdf135843.pptx
new file mode 100644
index 000000000..0a5dcb334
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf135843.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf135843_export.pptx b/sd/qa/unit/data/pptx/tdf135843_export.pptx
new file mode 100644
index 000000000..c07b0e0df
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf135843_export.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf135843_insideH.pptx b/sd/qa/unit/data/pptx/tdf135843_insideH.pptx
new file mode 100644
index 000000000..9b7864adb
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf135843_insideH.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf136830.pptx b/sd/qa/unit/data/pptx/tdf136830.pptx
new file mode 100644
index 000000000..b9ca65899
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf136830.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf137367.pptx b/sd/qa/unit/data/pptx/tdf137367.pptx
new file mode 100644
index 000000000..cf6aa086d
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf137367.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf137675.pptx b/sd/qa/unit/data/pptx/tdf137675.pptx
new file mode 100644
index 000000000..d4d767aa5
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf137675.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf138148.pptx b/sd/qa/unit/data/pptx/tdf138148.pptx
new file mode 100644
index 000000000..76237c602
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf138148.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf140714.pptx b/sd/qa/unit/data/pptx/tdf140714.pptx
new file mode 100644
index 000000000..6f5e98ec6
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf140714.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf140852.pptx b/sd/qa/unit/data/pptx/tdf140852.pptx
new file mode 100644
index 000000000..1332b5a68
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf140852.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx b/sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx
new file mode 100644
index 000000000..e55bc4380
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf141704.pptx b/sd/qa/unit/data/pptx/tdf141704.pptx
new file mode 100644
index 000000000..2aef7c3f9
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf141704.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf142590.pptx b/sd/qa/unit/data/pptx/tdf142590.pptx
new file mode 100644
index 000000000..ecc131c2a
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf142590.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf142645.pptx b/sd/qa/unit/data/pptx/tdf142645.pptx
new file mode 100644
index 000000000..e57bd9ee1
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf142645.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf142648.pptx b/sd/qa/unit/data/pptx/tdf142648.pptx
new file mode 100644
index 000000000..fc470530f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf142648.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf142716.pptx b/sd/qa/unit/data/pptx/tdf142716.pptx
new file mode 100644
index 000000000..4ef29e389
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf142716.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf142913.pptx b/sd/qa/unit/data/pptx/tdf142913.pptx
new file mode 100644
index 000000000..4fd938de1
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf142913.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf142915.pptx b/sd/qa/unit/data/pptx/tdf142915.pptx
new file mode 100644
index 000000000..889a08fd5
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf142915.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf143126.pptx b/sd/qa/unit/data/pptx/tdf143126.pptx
new file mode 100644
index 000000000..f5799b60f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf143126.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf143129.pptx b/sd/qa/unit/data/pptx/tdf143129.pptx
new file mode 100644
index 000000000..77377c212
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf143129.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf143222.pptx b/sd/qa/unit/data/pptx/tdf143222.pptx
new file mode 100644
index 000000000..63938d1bd
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf143222.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf143624.pptx b/sd/qa/unit/data/pptx/tdf143624.pptx
new file mode 100644
index 000000000..1eed8feda
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf143624.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf144092-emptyShapeTextProps.pptx b/sd/qa/unit/data/pptx/tdf144092-emptyShapeTextProps.pptx
new file mode 100644
index 000000000..5d75c87d5
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf144092-emptyShapeTextProps.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf144092-tableHeight.pptx b/sd/qa/unit/data/pptx/tdf144092-tableHeight.pptx
new file mode 100644
index 000000000..c597abf9a
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf144092-tableHeight.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf144616.pptx b/sd/qa/unit/data/pptx/tdf144616.pptx
new file mode 100644
index 000000000..bb153dcff
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf144616.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf144917.pptx b/sd/qa/unit/data/pptx/tdf144917.pptx
new file mode 100644
index 000000000..654b17a43
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf144917.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf144918.pptx b/sd/qa/unit/data/pptx/tdf144918.pptx
new file mode 100644
index 000000000..54f862bd1
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf144918.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf145162.pptx b/sd/qa/unit/data/pptx/tdf145162.pptx
new file mode 100644
index 000000000..3746740f3
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf145162.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf146223.pptx b/sd/qa/unit/data/pptx/tdf146223.pptx
new file mode 100644
index 000000000..73d5eea14
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf146223.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf146731.pptx b/sd/qa/unit/data/pptx/tdf146731.pptx
new file mode 100644
index 000000000..3862e4546
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf146731.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf147121.pptx b/sd/qa/unit/data/pptx/tdf147121.pptx
new file mode 100644
index 000000000..5762a4b92
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf147121.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf147459.pptx b/sd/qa/unit/data/pptx/tdf147459.pptx
new file mode 100644
index 000000000..ef71ec94d
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf147459.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf147586.pptx b/sd/qa/unit/data/pptx/tdf147586.pptx
new file mode 100644
index 000000000..723facf82
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf147586.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf148665.pptx b/sd/qa/unit/data/pptx/tdf148665.pptx
new file mode 100644
index 000000000..e8613e296
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf148665.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf148685.pptx b/sd/qa/unit/data/pptx/tdf148685.pptx
new file mode 100644
index 000000000..80af5a9bb
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf148685.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf148921.pptx b/sd/qa/unit/data/pptx/tdf148921.pptx
new file mode 100644
index 000000000..f4fce9ae4
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf148921.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf148965.pptx b/sd/qa/unit/data/pptx/tdf148965.pptx
new file mode 100644
index 000000000..5b7b9f098
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf148965.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf149124.pptx b/sd/qa/unit/data/pptx/tdf149124.pptx
new file mode 100644
index 000000000..9c43c43ce
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf149124.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf149206.pptx b/sd/qa/unit/data/pptx/tdf149206.pptx
new file mode 100644
index 000000000..ec39ec635
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf149206.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf149314.pptx b/sd/qa/unit/data/pptx/tdf149314.pptx
new file mode 100644
index 000000000..3138c1dda
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf149314.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf149588_transparentSolidFill.pptx b/sd/qa/unit/data/pptx/tdf149588_transparentSolidFill.pptx
new file mode 100644
index 000000000..8967590b9
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf149588_transparentSolidFill.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf149697.pptx b/sd/qa/unit/data/pptx/tdf149697.pptx
new file mode 100644
index 000000000..b8209e360
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf149697.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf149803.pptx b/sd/qa/unit/data/pptx/tdf149803.pptx
new file mode 100644
index 000000000..a3a16cc23
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf149803.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf149961-autofitIndentation.pptx b/sd/qa/unit/data/pptx/tdf149961-autofitIndentation.pptx
new file mode 100644
index 000000000..25513df7c
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf149961-autofitIndentation.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf151547-transparent-white-text.pptx b/sd/qa/unit/data/pptx/tdf151547-transparent-white-text.pptx
new file mode 100644
index 000000000..1bb723c2a
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf151547-transparent-white-text.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf152186.pptx b/sd/qa/unit/data/pptx/tdf152186.pptx
new file mode 100644
index 000000000..c4160f209
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf152186.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf152434.pptx b/sd/qa/unit/data/pptx/tdf152434.pptx
new file mode 100644
index 000000000..f0716a92f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf152434.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf153036_resizedConnectorL.pptx b/sd/qa/unit/data/pptx/tdf153036_resizedConnectorL.pptx
new file mode 100644
index 000000000..e9a3199b4
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf153036_resizedConnectorL.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf44223.pptx b/sd/qa/unit/data/pptx/tdf44223.pptx
new file mode 100644
index 000000000..6f0af688c
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf44223.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf50499.pptx b/sd/qa/unit/data/pptx/tdf50499.pptx
new file mode 100644
index 000000000..2cdcbfa98
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf50499.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf51340.pptx b/sd/qa/unit/data/pptx/tdf51340.pptx
new file mode 100644
index 000000000..090ea1be1
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf51340.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf54037.pptx b/sd/qa/unit/data/pptx/tdf54037.pptx
new file mode 100644
index 000000000..a6120619c
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf54037.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf59323.pptx b/sd/qa/unit/data/pptx/tdf59323.pptx
new file mode 100644
index 000000000..0660c0af4
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf59323.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf62255.pptx b/sd/qa/unit/data/pptx/tdf62255.pptx
new file mode 100644
index 000000000..fc06a9ea7
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf62255.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf65724.pptx b/sd/qa/unit/data/pptx/tdf65724.pptx
new file mode 100644
index 000000000..fef2d9f2d
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf65724.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf79007.pptx b/sd/qa/unit/data/pptx/tdf79007.pptx
new file mode 100644
index 000000000..65e94f1a9
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf79007.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf79082.pptx b/sd/qa/unit/data/pptx/tdf79082.pptx
new file mode 100644
index 000000000..8dcf4ff0a
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf79082.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf84205.pptx b/sd/qa/unit/data/pptx/tdf84205.pptx
new file mode 100644
index 000000000..211cea6d0
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf84205.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf89064.pptx b/sd/qa/unit/data/pptx/tdf89064.pptx
new file mode 100644
index 000000000..312496f79
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf89064.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf89449.pptx b/sd/qa/unit/data/pptx/tdf89449.pptx
new file mode 100644
index 000000000..e55cbf21a
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf89449.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf89927.pptx b/sd/qa/unit/data/pptx/tdf89927.pptx
new file mode 100644
index 000000000..c71e55702
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf89927.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf89928-blackWhiteEffectThreshold.pptx b/sd/qa/unit/data/pptx/tdf89928-blackWhiteEffectThreshold.pptx
new file mode 100644
index 000000000..90edf8ea0
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf89928-blackWhiteEffectThreshold.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf90626.pptx b/sd/qa/unit/data/pptx/tdf90626.pptx
new file mode 100644
index 000000000..ef31fc92f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf90626.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf91060.pptx b/sd/qa/unit/data/pptx/tdf91060.pptx
new file mode 100644
index 000000000..8ed2d4145
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf91060.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf91378.pptx b/sd/qa/unit/data/pptx/tdf91378.pptx
new file mode 100644
index 000000000..361be2c9a
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf91378.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf91999_rotateShape.pptx b/sd/qa/unit/data/pptx/tdf91999_rotateShape.pptx
new file mode 100644
index 000000000..7559597b7
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf91999_rotateShape.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf92222.pptx b/sd/qa/unit/data/pptx/tdf92222.pptx
new file mode 100644
index 000000000..60ec3b886
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf92222.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf93097.pptx b/sd/qa/unit/data/pptx/tdf93097.pptx
new file mode 100644
index 000000000..687110db3
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf93097.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf93830.pptx b/sd/qa/unit/data/pptx/tdf93830.pptx
new file mode 100644
index 000000000..8415daff3
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf93830.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf93868.pptx b/sd/qa/unit/data/pptx/tdf93868.pptx
new file mode 100644
index 000000000..f54fb0496
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf93868.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf94238.pptx b/sd/qa/unit/data/pptx/tdf94238.pptx
new file mode 100644
index 000000000..6f61cc5b4
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf94238.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf95932.pptx b/sd/qa/unit/data/pptx/tdf95932.pptx
new file mode 100644
index 000000000..5e22b1158
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf95932.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf96061.pptx b/sd/qa/unit/data/pptx/tdf96061.pptx
new file mode 100644
index 000000000..c6e6aa5ae
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf96061.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf98477grow.pptx b/sd/qa/unit/data/pptx/tdf98477grow.pptx
new file mode 100644
index 000000000..5761c7b07
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf98477grow.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf98603.pptx b/sd/qa/unit/data/pptx/tdf98603.pptx
new file mode 100644
index 000000000..92c717721
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf98603.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdf99030.pptx b/sd/qa/unit/data/pptx/tdf99030.pptx
new file mode 100644
index 000000000..38448f93f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf99030.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/tdfpictureplaceholder.pptx b/sd/qa/unit/data/pptx/tdfpictureplaceholder.pptx
new file mode 100644
index 000000000..d681c749c
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdfpictureplaceholder.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/testShapeAutofit.pptx b/sd/qa/unit/data/pptx/testShapeAutofit.pptx
new file mode 100644
index 000000000..fd402c01c
--- /dev/null
+++ b/sd/qa/unit/data/pptx/testShapeAutofit.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/trigger.pptx b/sd/qa/unit/data/pptx/trigger.pptx
new file mode 100644
index 000000000..fdfb39740
--- /dev/null
+++ b/sd/qa/unit/data/pptx/trigger.pptx
Binary files differ
diff --git a/sd/qa/unit/data/pptx/vertical-bracket-list.pptx b/sd/qa/unit/data/pptx/vertical-bracket-list.pptx
new file mode 100644
index 000000000..bef9d7481
--- /dev/null
+++ b/sd/qa/unit/data/pptx/vertical-bracket-list.pptx
Binary files differ
diff --git a/sd/qa/unit/data/smoketest.pptx b/sd/qa/unit/data/smoketest.pptx
new file mode 100644
index 000000000..e0cfe4900
--- /dev/null
+++ b/sd/qa/unit/data/smoketest.pptx
Binary files differ
diff --git a/sd/qa/unit/data/strict_ooxml.pptx b/sd/qa/unit/data/strict_ooxml.pptx
new file mode 100644
index 000000000..534b483ff
--- /dev/null
+++ b/sd/qa/unit/data/strict_ooxml.pptx
Binary files differ
diff --git a/sd/qa/unit/data/svg/test.svg b/sd/qa/unit/data/svg/test.svg
new file mode 100644
index 000000000..74e01e644
--- /dev/null
+++ b/sd/qa/unit/data/svg/test.svg
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<svg version="1.2" baseProfile="tiny" viewBox="0 0 28002 20999" preserveAspectRatio="xMidYMid" fill-rule="evenodd" clip-path="url(#presentation_clip_path)" stroke-width="28.222" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xml:space="preserve">
+ <defs>
+ <clipPath id="presentation_clip_path" clipPathUnits="userSpaceOnUse">
+ <rect x="0" y="0" width="28002" height="20999"/>
+ </clipPath>
+ </defs>
+ <g id="id2" class="Master_Slide" clip-path="url(#presentation_clip_path)">
+ <g id="bo-id2" visibility="visible" class="BackgroundObjects">
+ <g class="com.sun.star.presentation.TitleTextShape">
+ <g>
+ <rect fill="none" stroke="none" x="1400" y="837" width="25199" height="3507"/>
+ <g font-family="Liberation Sans" font-size="635px" font-style="normal" font-weight="400">
+ <g fill="rgb(0,0,0)" stroke="none">
+ <text x="9662" y="2844">C</text>
+ <text x="10119" y="2844">l</text>
+ <text x="10259" y="2844">i</text>
+ <text x="10399" y="2844">c</text>
+ <text x="10716" y="2844">k</text>
+ <text x="11034" y="2844"> </text>
+ <text x="11211" y="2844">t</text>
+ <text x="11389" y="2844">o</text>
+ <text x="11741" y="2844"> </text>
+ <text x="11918" y="2844">e</text>
+ <text x="12270" y="2844">d</text>
+ <text x="12621" y="2844">i</text>
+ <text x="12761" y="2844">t</text>
+ <text x="12939" y="2844"> </text>
+ <text x="13116" y="2844">t</text>
+ <text x="13294" y="2844">h</text>
+ <text x="13646" y="2844">e</text>
+ <text x="13997" y="2844"> </text>
+ <text x="14175" y="2844">t</text>
+ <text x="14353" y="2844">i</text>
+ <text x="14492" y="2844">t</text>
+ <text x="14670" y="2844">l</text>
+ <text x="14810" y="2844">e</text>
+ <text x="15161" y="2844"> </text>
+ <text x="15339" y="2844">t</text>
+ <text x="15517" y="2844">e</text>
+ <text x="15868" y="2844">x</text>
+ <text x="16181" y="2844">t</text>
+ <text x="16359" y="2844"> </text>
+ <text x="16537" y="2844">f</text>
+ <text x="16715" y="2844">o</text>
+ <text x="17066" y="2844">r</text>
+ <text x="17278" y="2844">m</text>
+ <text x="17807" y="2844">a</text>
+ <text x="18158" y="2844">t</text></g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g id="id1" class="Slide" visibility="visible" clip-path="url(#presentation_clip_path)">
+ <g class="com.sun.star.drawing.CustomShape">
+ <g>
+ <g font-family="Liberation Sans" font-size="635px" font-style="normal" font-weight="400">
+ <g fill="rgb(0,0,0)" stroke="none">
+ <text x="13280" y="2844">H</text>
+ <text x="13737" y="2844">e</text>
+ <text x="14089" y="2844">l</text>
+ <text x="14228" y="2844">l</text>
+ <text x="14368" y="2844">o</text></g>
+ <rect fill="none" stroke="none" x="1400" y="837" width="25199" height="3506"/>
+ </g>
+ </g>
+ </g>
+ <g class="com.sun.star.drawing.CustomShape">
+ <g>
+ <g font-family="Liberation Sans" font-size="635px" font-style="normal" font-weight="700">
+ <g fill="rgb(0,0,0)" stroke="none">
+ <text x="12200" y="12097">R</text>
+ <text x="12657" y="12097">a</text>
+ <text x="13009" y="12097">d</text>
+ <text x="13398" y="12097">e</text>
+ <text x="13749" y="12097">k</text>
+ <text x="14101" y="12097">s</text>
+ <text x="14452" y="12097">k</text>
+ <text x="14804" y="12097">i</text>
+ <text x="14981" y="12097"> </text>
+ <text x="15159" y="12097">:</text>
+ <text x="15375" y="12097">-</text>
+ <text x="15587" y="12097">)</text></g>
+ <rect fill="none" stroke="none" x="1400" y="4914" width="25199" height="13859"/>
+ </g>
+ </g>
+ </g>
+ <g class="Graphic">
+ <g>
+ <path fill="none" stroke="rgb(128,128,128)" d="M 12267,5588 L 15493,5588 15493,8761 12267,8761 12267,5588"/>
+ <g font-family="Liberation Sans" font-size="635px" font-style="normal" font-weight="400">
+ <g fill="rgb(255,0,0)" stroke="none">
+ <text x="12467" y="6364"> </text></g>
+ <g fill="rgb(255,0,0)" stroke="none">
+ <text x="12645" y="6364">.</text>
+ <text x="12823" y="6364">.</text>
+ <text x="13001" y="6364">.</text></g>
+ <rect fill="none" stroke="none" x="12267" y="5588" width="3227" height="3174"/>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/sd/qa/unit/data/sxi/ooo41061-1.sxi b/sd/qa/unit/data/sxi/ooo41061-1.sxi
new file mode 100644
index 000000000..4c2482a58
--- /dev/null
+++ b/sd/qa/unit/data/sxi/ooo41061-1.sxi
Binary files differ
diff --git a/sd/qa/unit/data/tdf100491.pptx b/sd/qa/unit/data/tdf100491.pptx
new file mode 100644
index 000000000..d25388d23
--- /dev/null
+++ b/sd/qa/unit/data/tdf100491.pptx
Binary files differ
diff --git a/sd/qa/unit/data/tdf101242_ODF.odg b/sd/qa/unit/data/tdf101242_ODF.odg
new file mode 100644
index 000000000..98934c7f7
--- /dev/null
+++ b/sd/qa/unit/data/tdf101242_ODF.odg
Binary files differ
diff --git a/sd/qa/unit/data/tdf101242_settings.odg b/sd/qa/unit/data/tdf101242_settings.odg
new file mode 100644
index 000000000..5bea0d072
--- /dev/null
+++ b/sd/qa/unit/data/tdf101242_settings.odg
Binary files differ
diff --git a/sd/qa/unit/data/tdf109317.pptx b/sd/qa/unit/data/tdf109317.pptx
new file mode 100644
index 000000000..427108069
--- /dev/null
+++ b/sd/qa/unit/data/tdf109317.pptx
Binary files differ
diff --git a/sd/qa/unit/data/tdf111522.odp b/sd/qa/unit/data/tdf111522.odp
new file mode 100644
index 000000000..fd6ebeb6e
--- /dev/null
+++ b/sd/qa/unit/data/tdf111522.odp
Binary files differ
diff --git a/sd/qa/unit/data/tdf112126.odg b/sd/qa/unit/data/tdf112126.odg
new file mode 100644
index 000000000..f291a3910
--- /dev/null
+++ b/sd/qa/unit/data/tdf112126.odg
Binary files differ
diff --git a/sd/qa/unit/data/tdf119392_InsertLayer.odg b/sd/qa/unit/data/tdf119392_InsertLayer.odg
new file mode 100644
index 000000000..617624ce9
--- /dev/null
+++ b/sd/qa/unit/data/tdf119392_InsertLayer.odg
Binary files differ
diff --git a/sd/qa/unit/data/tdf119956.odg b/sd/qa/unit/data/tdf119956.odg
new file mode 100644
index 000000000..eb1104035
--- /dev/null
+++ b/sd/qa/unit/data/tdf119956.odg
Binary files differ
diff --git a/sd/qa/unit/data/tdf120527.jpg b/sd/qa/unit/data/tdf120527.jpg
new file mode 100644
index 000000000..12b393569
--- /dev/null
+++ b/sd/qa/unit/data/tdf120527.jpg
Binary files differ
diff --git a/sd/qa/unit/data/tdf123841.odg b/sd/qa/unit/data/tdf123841.odg
new file mode 100644
index 000000000..a92477e83
--- /dev/null
+++ b/sd/qa/unit/data/tdf123841.odg
Binary files differ
diff --git a/sd/qa/unit/data/tdf124708.ppt b/sd/qa/unit/data/tdf124708.ppt
new file mode 100644
index 000000000..6d29e1acb
--- /dev/null
+++ b/sd/qa/unit/data/tdf124708.ppt
Binary files differ
diff --git a/sd/qa/unit/data/tdf126197.odp b/sd/qa/unit/data/tdf126197.odp
new file mode 100644
index 000000000..cbe5b0744
--- /dev/null
+++ b/sd/qa/unit/data/tdf126197.odp
Binary files differ
diff --git a/sd/qa/unit/data/tdf128651_CustomShapeUndo.odp b/sd/qa/unit/data/tdf128651_CustomShapeUndo.odp
new file mode 100644
index 000000000..9e820da09
--- /dev/null
+++ b/sd/qa/unit/data/tdf128651_CustomShapeUndo.odp
Binary files differ
diff --git a/sd/qa/unit/data/tdf129898_faulty_DrawnInSlideshow.odp b/sd/qa/unit/data/tdf129898_faulty_DrawnInSlideshow.odp
new file mode 100644
index 000000000..796b57b2c
--- /dev/null
+++ b/sd/qa/unit/data/tdf129898_faulty_DrawnInSlideshow.odp
Binary files differ
diff --git a/sd/qa/unit/data/tdf130988_3D_create_lathe.odg b/sd/qa/unit/data/tdf130988_3D_create_lathe.odg
new file mode 100644
index 000000000..e2b37ef60
--- /dev/null
+++ b/sd/qa/unit/data/tdf130988_3D_create_lathe.odg
Binary files differ
diff --git a/sd/qa/unit/data/tdf131033_3D_SceneSizeIn2d.odg b/sd/qa/unit/data/tdf131033_3D_SceneSizeIn2d.odg
new file mode 100644
index 000000000..f6cfc96e6
--- /dev/null
+++ b/sd/qa/unit/data/tdf131033_3D_SceneSizeIn2d.odg
Binary files differ
diff --git a/sd/qa/unit/data/tdf131269.ppt b/sd/qa/unit/data/tdf131269.ppt
new file mode 100644
index 000000000..480691d3b
--- /dev/null
+++ b/sd/qa/unit/data/tdf131269.ppt
Binary files differ
diff --git a/sd/qa/unit/data/tdf143412.svg b/sd/qa/unit/data/tdf143412.svg
new file mode 100644
index 000000000..147830f83
--- /dev/null
+++ b/sd/qa/unit/data/tdf143412.svg
@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- This file was generated by dvisvgm 2.8.1 -->
+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='22.752105pt' height='7.85056pt' viewBox='76.712329 56.956413 22.752105 7.85056'>
+<defs/>
+<g id='page1'>
+<path d='M80.039851 59.755915C80.099626 59.496887 80.328767 58.580324 81.026152 58.580324C81.075965 58.580324 81.315068 58.580324 81.524284 58.709838C81.24533 58.759651 81.046077 59.008717 81.046077 59.247821C81.046077 59.407223 81.155666 59.596513 81.424658 59.596513C81.643836 59.596513 81.96264 59.417186 81.96264 59.01868C81.96264 58.500623 81.374844 58.361146 81.036115 58.361146C80.458281 58.361146 80.109589 58.889166 79.990037 59.118306C79.740971 58.460772 79.202989 58.361146 78.914072 58.361146C77.877958 58.361146 77.310087 59.646326 77.310087 59.895392C77.310087 59.995019 77.409714 59.995019 77.429639 59.995019C77.50934 59.995019 77.539228 59.975093 77.559153 59.88543C77.897883 58.82939 78.555417 58.580324 78.894147 58.580324C79.083437 58.580324 79.43213 58.669988 79.43213 59.247821C79.43213 59.556663 79.262765 60.224159 78.894147 61.618929C78.734745 62.236613 78.386052 62.655044 77.947696 62.655044C77.88792 62.655044 77.65878 62.655044 77.449564 62.525529C77.69863 62.475716 77.917808 62.266501 77.917808 61.987547C77.917808 61.718555 77.69863 61.638854 77.549191 61.638854C77.250311 61.638854 77.001245 61.897883 77.001245 62.216687C77.001245 62.674969 77.499377 62.874222 77.937733 62.874222C78.595268 62.874222 78.953923 62.176837 78.983811 62.117061C79.103362 62.485679 79.462017 62.874222 80.059776 62.874222C81.085928 62.874222 81.653798 61.589041 81.653798 61.339975C81.653798 61.240349 81.564134 61.240349 81.534247 61.240349C81.444583 61.240349 81.424658 61.280199 81.404732 61.349938C81.075965 62.41594 80.398506 62.655044 80.079701 62.655044C79.691158 62.655044 79.531756 62.336239 79.531756 61.997509C79.531756 61.778331 79.591532 61.559153 79.701121 61.120797L80.039851 59.755915Z'/>
+<path d='M88.694847 60.473225H91.474423C91.6139 60.473225 91.80319 60.473225 91.80319 60.273973S91.6139 60.07472 91.474423 60.07472H88.694847V57.285181C88.694847 57.145704 88.694847 56.956413 88.495594 56.956413S88.296341 57.145704 88.296341 57.285181V60.07472H85.506802C85.367325 60.07472 85.178035 60.07472 85.178035 60.273973S85.367325 60.473225 85.506802 60.473225H88.296341V63.262765C88.296341 63.402242 88.296341 63.591532 88.495594 63.591532S88.694847 63.402242 88.694847 63.262765V60.473225Z'/>
+<path d='M99.424583 58.968867C99.464434 58.82939 99.464434 58.809465 99.464434 58.739726C99.464434 58.560399 99.324957 58.470735 99.175517 58.470735C99.075891 58.470735 98.916489 58.530511 98.826825 58.67995C98.8069 58.729763 98.727199 59.038605 98.687348 59.217933C98.61761 59.476961 98.547871 59.745953 98.488095 60.014944L98.039776 61.808219C97.999926 61.957659 97.571532 62.655044 96.913998 62.655044C96.405903 62.655044 96.296314 62.216687 96.296314 61.84807C96.296314 61.389788 96.465679 60.772105 96.804409 59.895392C96.963811 59.486924 97.003662 59.377335 97.003662 59.178082C97.003662 58.729763 96.684857 58.361146 96.186725 58.361146C95.240275 58.361146 94.871657 59.805729 94.871657 59.895392C94.871657 59.995019 94.971283 59.995019 94.991209 59.995019C95.090835 59.995019 95.100798 59.975093 95.150611 59.815691C95.419602 58.879203 95.818108 58.580324 96.156837 58.580324C96.236539 58.580324 96.405903 58.580324 96.405903 58.899128C96.405903 59.148194 96.306277 59.407223 96.236539 59.596513C95.838033 60.652553 95.658705 61.220423 95.658705 61.688667C95.658705 62.575342 96.286352 62.874222 96.874148 62.874222C97.262691 62.874222 97.60142 62.704857 97.880374 62.425903C97.75086 62.94396 97.631308 63.43213 97.232803 63.960149C96.973774 64.298879 96.595194 64.587796 96.136912 64.587796C95.997435 64.587796 95.549116 64.557908 95.379752 64.169365C95.539154 64.169365 95.668668 64.169365 95.808145 64.049813C95.907771 63.960149 96.007398 63.830635 96.007398 63.641345C96.007398 63.332503 95.738407 63.292653 95.63878 63.292653C95.409639 63.292653 95.080872 63.452055 95.080872 63.940224C95.080872 64.438356 95.519229 64.806974 96.136912 64.806974C97.163064 64.806974 98.189216 63.900374 98.46817 62.774595L99.424583 58.968867Z'/>
+</g>
+</svg> \ No newline at end of file
diff --git a/sd/qa/unit/data/tdf67248.odg b/sd/qa/unit/data/tdf67248.odg
new file mode 100644
index 000000000..03417effa
--- /dev/null
+++ b/sd/qa/unit/data/tdf67248.odg
Binary files differ
diff --git a/sd/qa/unit/data/tdf80194_defaultSubscripts.fodg b/sd/qa/unit/data/tdf80194_defaultSubscripts.fodg
new file mode 100644
index 000000000..12efa023b
--- /dev/null
+++ b/sd/qa/unit/data/tdf80194_defaultSubscripts.fodg
@@ -0,0 +1,407 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document xmlns:officeooo="http://openoffice.org/2009/office" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:ooo="http://openoffice.org/2004/office" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.graphics">
+ <office:meta><meta:creation-date>2020-02-17T15:21:21.927256142</meta:creation-date><dc:date>2020-02-17T16:18:41.297941901</dc:date><meta:editing-duration>PT17M53S</meta:editing-duration><meta:editing-cycles>8</meta:editing-cycles><meta:generator>LibreOfficeDev/7.0.0.0.alpha0$Linux_X86_64 LibreOffice_project/76fec020a99a41a06176307cb2c31f9494867dd0</meta:generator><meta:document-statistic meta:object-count="2"/></office:meta>
+ <office:settings>
+ <config:config-item-set config:name="ooo:view-settings">
+ <config:config-item config:name="VisibleAreaTop" config:type="int">19876</config:config-item>
+ <config:config-item config:name="VisibleAreaLeft" config:type="int">6602</config:config-item>
+ <config:config-item config:name="VisibleAreaWidth" config:type="int">3646</config:config-item>
+ <config:config-item config:name="VisibleAreaHeight" config:type="int">3659</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">view1</config:config-item>
+ <config:config-item config:name="GridIsVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="GridIsFront" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsSnapToGrid" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToPageMargins" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToSnapLines" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsSnapToObjectFrame" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsSnapToObjectPoints" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPlusHandlesAlwaysVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsFrameDragSingles" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EliminatePolyPointLimitAngle" config:type="int">1500</config:config-item>
+ <config:config-item config:name="IsEliminatePolyPoints" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="VisibleLayers" config:type="base64Binary">Hw==</config:config-item>
+ <config:config-item config:name="PrintableLayers" config:type="base64Binary">Hw==</config:config-item>
+ <config:config-item config:name="LockedLayers" config:type="base64Binary"/>
+ <config:config-item config:name="NoAttribs" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="NoColors" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="RulerIsVisible" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="PageKind" config:type="short">0</config:config-item>
+ <config:config-item config:name="SelectedPage" config:type="short">0</config:config-item>
+ <config:config-item config:name="IsLayerMode" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsDoubleClickTextEdit" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsClickChangeRotation" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="SlidesPerRow" config:type="short">4</config:config-item>
+ <config:config-item config:name="EditMode" config:type="int">0</config:config-item>
+ <config:config-item config:name="VisibleAreaTop" config:type="int">20184</config:config-item>
+ <config:config-item config:name="VisibleAreaLeft" config:type="int">6885</config:config-item>
+ <config:config-item config:name="VisibleAreaWidth" config:type="int">3052</config:config-item>
+ <config:config-item config:name="VisibleAreaHeight" config:type="int">3063</config:config-item>
+ <config:config-item config:name="GridCoarseWidth" config:type="int">1000</config:config-item>
+ <config:config-item config:name="GridCoarseHeight" config:type="int">1000</config:config-item>
+ <config:config-item config:name="GridFineWidth" config:type="int">100</config:config-item>
+ <config:config-item config:name="GridFineHeight" config:type="int">100</config:config-item>
+ <config:config-item config:name="GridSnapWidthXNumerator" config:type="int">1000</config:config-item>
+ <config:config-item config:name="GridSnapWidthXDenominator" config:type="int">10</config:config-item>
+ <config:config-item config:name="GridSnapWidthYNumerator" config:type="int">1000</config:config-item>
+ <config:config-item config:name="GridSnapWidthYDenominator" config:type="int">10</config:config-item>
+ <config:config-item config:name="IsAngleSnapEnabled" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SnapAngle" config:type="int">1500</config:config-item>
+ <config:config-item config:name="ZoomOnPage" 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="ApplyUserData" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="BitmapTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sob</config:config-item>
+ <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item>
+ <config:config-item config:name="ColorTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soc</config:config-item>
+ <config:config-item config:name="DashTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sod</config:config-item>
+ <config:config-item config:name="DefaultTabStop" config:type="int">1250</config:config-item>
+ <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item>
+ <config:config-item-map-indexed config:name="ForbiddenCharacters">
+ <config:config-item-map-entry>
+ <config:config-item config:name="Language" config:type="string">en</config:config-item>
+ <config:config-item config:name="Country" config:type="string">GB</config:config-item>
+ <config:config-item config:name="Variant" config:type="string"/>
+ <config:config-item config:name="BeginLine" config:type="string"/>
+ <config:config-item config:name="EndLine" config:type="string"/>
+ </config:config-item-map-entry>
+ </config:config-item-map-indexed>
+ <config:config-item config:name="GradientTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sog</config:config-item>
+ <config:config-item config:name="HatchTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soh</config:config-item>
+ <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintBooklet" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintBookletBack" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintBookletFront" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintDate" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintFitPage" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintHiddenPages" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintPageName" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintTilePage" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintTime" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="LineEndTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soe</config:config-item>
+ <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="MeasureUnit" config:type="short">3</config:config-item>
+ <config:config-item config:name="PageNumberFormat" config:type="int">4</config:config-item>
+ <config:config-item config:name="ParagraphSummation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrintQuality" config:type="int">0</config:config-item>
+ <config:config-item config:name="PrinterIndependentLayout" config:type="string">low-resolution</config:config-item>
+ <config:config-item config:name="PrinterName" config:type="string">Boomaga</config:config-item>
+ <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrinterSetup" config:type="base64Binary">lwH+/0Jvb21hZ2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ1VQUzpCb29tYWdhAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAMAuAAAAAAAAAAEAAhSAAAEdAAASm9iRGF0YSAxCnByaW50ZXI9Qm9vbWFnYQpvcmllbnRhdGlvbj1Qb3J0cmFpdApjb3BpZXM9MQpjb2xsYXRlPWZhbHNlCm1hcmdpbmRhanVzdG1lbnQ9MCwwLDAsMApjb2xvcmRlcHRoPTI0CnBzbGV2ZWw9MApwZGZkZXZpY2U9MQpjb2xvcmRldmljZT0wClBQRENvbnRleERhdGEKRHVwbGV4Ok5vbmUAUGFnZVNpemU6QTQAABIAQ09NUEFUX0RVUExFWF9NT0RFDwBEdXBsZXhNb2RlOjpPZmY=</config:config-item>
+ <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="ScaleDenominator" config:type="int">1</config:config-item>
+ <config:config-item config:name="ScaleNumerator" config:type="int">1</config:config-item>
+ <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</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="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <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="Noto Sans" svg:font-family="&apos;Noto Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <style:font-face style:name="DejaVu Sans" svg:font-family="&apos;DejaVu Sans&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="FreeSans" svg:font-family="FreeSans" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Noto Sans CJK SC Regular" svg:font-family="&apos;Noto Sans CJK SC Regular&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+ <draw:gradient draw:name="Filled" draw:style="linear" draw:start-color="#ffffff" draw:end-color="#cccccc" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="300" draw:border="0%"/>
+ <draw:gradient draw:name="Filled_20_Blue" draw:display-name="Filled Blue" draw:style="linear" draw:start-color="#729fcf" draw:end-color="#355269" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="300" draw:border="0%"/>
+ <draw:gradient draw:name="Filled_20_Green" draw:display-name="Filled Green" draw:style="linear" draw:start-color="#77bc65" draw:end-color="#127622" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="300" draw:border="0%"/>
+ <draw:gradient draw:name="Filled_20_Red" draw:display-name="Filled Red" draw:style="linear" draw:start-color="#ff6d6d" draw:end-color="#c9211e" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="300" draw:border="0%"/>
+ <draw:gradient draw:name="Filled_20_Yellow" draw:display-name="Filled Yellow" draw:style="linear" draw:start-color="#ffde59" draw:end-color="#b47804" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="300" draw:border="0%"/>
+ <draw:gradient draw:name="Pastel_20_Bouquet" draw:display-name="Pastel Bouquet" draw:style="linear" draw:start-color="#e8a202" draw:end-color="#5b277d" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="300" draw:border="0%"/>
+ <draw:gradient draw:name="Shapes" draw:style="rectangular" draw:cx="50%" draw:cy="50%" draw:start-color="#cccccc" draw:end-color="#ffffff" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="0" draw:border="0%"/>
+ <draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="M10 0l-10 30h20z"/>
+ <style:default-style style:family="graphic">
+ <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap"/>
+ <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" style:line-break="strict" style:writing-mode="lr-tb" style:font-independent-line-spacing="false">
+ <style:tab-stops/>
+ </style:paragraph-properties>
+ <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="24pt" fo:language="en" fo:country="GB" style:font-name-asian="DejaVu Sans" style:font-size-asian="24pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="DejaVu Sans" style:font-size-complex="24pt" style:language-complex="hi" style:country-complex="IN"/>
+ </style:default-style>
+ <style:style style:name="standard" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0cm" svg:stroke-color="#3465a4" draw:marker-start-width="0.2cm" draw:marker-start-center="false" draw:marker-end-width="0.2cm" draw:marker-end-center="false" draw:fill="solid" draw:fill-color="#729fcf" draw:textarea-horizontal-align="justify" fo:padding-top="0.125cm" fo:padding-bottom="0.125cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080">
+ <text:list-style style:name="standard">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" loext:opacity="0%" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="Noto Sans CJK SC Regular" style:font-family-asian="&apos;Noto Sans CJK SC Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="18pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="18pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="objectwithoutfill" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Object_20_with_20_no_20_fill_20_and_20_no_20_line" style:display-name="Object with no fill and no line" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Text" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#cccccc" draw:fill="solid" draw:fill-color="#eeeeee"/>
+ <style:text-properties style:font-name="Noto Sans" fo:font-family="&apos;Noto Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ </style:style>
+ <style:style style:name="A4" style:family="graphic" style:parent-style-name="Text">
+ <style:graphic-properties draw:fill="none"/>
+ <style:text-properties fo:font-size="18pt"/>
+ </style:style>
+ <style:style style:name="Title_20_A4" style:display-name="Title A4" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ <style:text-properties fo:font-size="44pt"/>
+ </style:style>
+ <style:style style:name="Heading_20_A4" style:display-name="Heading A4" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="Text_20_A4" style:display-name="Text A4" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ </style:style>
+ <style:style style:name="A4" style:family="graphic" style:parent-style-name="Text">
+ <style:graphic-properties draw:fill="none"/>
+ <style:text-properties fo:font-size="18pt"/>
+ </style:style>
+ <style:style style:name="Title_20_A0" style:display-name="Title A0" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ <style:text-properties fo:font-size="96pt"/>
+ </style:style>
+ <style:style style:name="Heading_20_A0" style:display-name="Heading A0" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ <style:text-properties fo:font-size="72pt"/>
+ </style:style>
+ <style:style style:name="Text_20_A0" style:display-name="Text A0" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ </style:style>
+ <style:style style:name="Graphic" style:family="graphic">
+ <style:graphic-properties draw:fill="solid" draw:fill-color="#ffffff"/>
+ <style:text-properties style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt"/>
+ </style:style>
+ <style:style style:name="Shapes" style:family="graphic" style:parent-style-name="Graphic">
+ <style:graphic-properties draw:stroke="none" draw:fill="gradient" draw:fill-gradient-name="Shapes"/>
+ <style:text-properties fo:font-size="14pt" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="Filled" style:family="graphic" style:parent-style-name="Shapes">
+ <style:graphic-properties draw:fill="gradient" draw:fill-gradient-name="Filled"/>
+ </style:style>
+ <style:style style:name="Filled_20_Blue" style:display-name="Filled Blue" style:family="graphic" style:parent-style-name="Filled">
+ <style:graphic-properties draw:fill-gradient-name="Filled_20_Blue"/>
+ <style:text-properties fo:color="#ffffff" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Filled_20_Green" style:display-name="Filled Green" style:family="graphic" style:parent-style-name="Filled">
+ <style:graphic-properties draw:fill-gradient-name="Filled_20_Green"/>
+ <style:text-properties fo:color="#ffffff" loext:opacity="100%" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ </style:style>
+ <style:style style:name="Filled_20_Red" style:display-name="Filled Red" style:family="graphic" style:parent-style-name="Filled">
+ <style:graphic-properties draw:fill-gradient-name="Filled_20_Red"/>
+ <style:text-properties fo:color="#ffffff" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Filled_20_Yellow" style:display-name="Filled Yellow" style:family="graphic" style:parent-style-name="Filled">
+ <style:graphic-properties draw:fill-gradient-name="Filled_20_Yellow"/>
+ <style:text-properties fo:color="#ffffff" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Outlined" style:family="graphic" style:parent-style-name="Shapes">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0.081cm" svg:stroke-color="#000000" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Outlined_20_Blue" style:display-name="Outlined Blue" style:family="graphic" style:parent-style-name="Outlined">
+ <style:graphic-properties svg:stroke-color="#355269"/>
+ <style:text-properties fo:color="#355269" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Outlined_20_Green" style:display-name="Outlined Green" style:family="graphic" style:parent-style-name="Outlined">
+ <style:graphic-properties svg:stroke-color="#127622"/>
+ <style:text-properties fo:color="#127622" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Outlined_20_Red" style:display-name="Outlined Red" style:family="graphic" style:parent-style-name="Outlined">
+ <style:graphic-properties svg:stroke-color="#c9211e"/>
+ <style:text-properties fo:color="#c9211e" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Outlined_20_Yellow" style:display-name="Outlined Yellow" style:family="graphic" style:parent-style-name="Outlined">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#b47804"/>
+ <style:text-properties fo:color="#b47804" loext:opacity="100%"/>
+ </style:style>
+ <style:style style:name="Lines" style:family="graphic" style:parent-style-name="Graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#000000" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Arrow_20_Line" style:display-name="Arrow Line" style:family="graphic" style:parent-style-name="Lines">
+ <style:graphic-properties draw:marker-start="Arrow" draw:marker-start-width="0.2cm" draw:marker-end="Arrow" draw:marker-end-width="0.2cm" draw:show-unit="true"/>
+ </style:style>
+ <style:style style:name="Arrow_20_Dashed" style:display-name="Arrow Dashed" style:family="graphic" style:parent-style-name="Lines">
+ <style:graphic-properties draw:stroke="dash"/>
+ </style:style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:page-layout style:name="PM0">
+ <style:page-layout-properties fo:margin-top="1cm" fo:margin-bottom="1cm" fo:margin-left="1cm" fo:margin-right="1cm" fo:page-width="21cm" fo:page-height="29.7cm" style:print-orientation="portrait"/>
+ </style:page-layout>
+ <style:style style:name="dp1" style:family="drawing-page">
+ <style:drawing-page-properties draw:background-size="border" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="dp2" style:family="drawing-page"/>
+ <style:style style:name="gr1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" svg:stroke-color="#000000" draw:fill="gradient" draw:fill-color="#ffffff" draw:fill-gradient-name="Pastel_20_Bouquet" fo:min-height="4.25cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="gr2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" svg:stroke-color="#000000" draw:fill="none" draw:fill-color="#ffffff" fo:min-height="16.354cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="P1" style:family="paragraph">
+ <loext:graphic-properties draw:fill="gradient" draw:fill-color="#ffffff" draw:fill-gradient-name="Pastel_20_Bouquet"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="P2" style:family="paragraph">
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-indent="0cm"/>
+ </style:style>
+ <style:style style:name="P3" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties style:text-position="sub 58%" fo:font-size="18pt" style:font-size-asian="18pt" style:font-size-complex="18pt"/>
+ </style:style>
+ <style:style style:name="T2" style:family="text">
+ <style:text-properties style:text-position="0% 100%" fo:font-size="18pt" style:font-size-asian="18pt" style:font-size-complex="18pt"/>
+ </style:style>
+ <style:style style:name="T3" style:family="text">
+ <style:text-properties style:text-position="super 58%" fo:font-size="18pt" style:font-size-asian="18pt" style:font-size-complex="18pt"/>
+ </style:style>
+ <text:list-style style:name="L1">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </office:automatic-styles>
+ <office:master-styles>
+ <draw:layer-set>
+ <draw:layer draw:name="layout"/>
+ <draw:layer draw:name="background"/>
+ <draw:layer draw:name="backgroundobjects"/>
+ <draw:layer draw:name="controls"/>
+ <draw:layer draw:name="measurelines"/>
+ </draw:layer-set>
+ <style:master-page style:name="Default" style:page-layout-name="PM0" draw:style-name="dp1"/>
+ </office:master-styles>
+ <office:body>
+ <office:drawing>
+ <draw:page draw:name="page1" draw:style-name="dp2" draw:master-page-name="Default">
+ <draw:frame draw:name="Zoomed Textbox" draw:style-name="gr1" draw:text-style-name="P1" draw:layer="layout" svg:width="8.2cm" svg:height="4.5cm" svg:x="3.9cm" svg:y="19.2cm">
+ <draw:text-box>
+ <text:p>Subscript shouldn’t drop below descender: q<text:span text:style-name="T1">p</text:span></text:p>
+ <text:p><text:span text:style-name="T2"/></text:p>
+ <text:p><text:span text:style-name="T2">Superscript shouldn’t raise above ascender: d</text:span><text:span text:style-name="T3">L</text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:name="Overgrown textbox" draw:style-name="gr2" draw:text-style-name="P3" draw:layer="layout" svg:width="16.9cm" svg:height="16.604cm" svg:x="1.6cm" svg:y="2.6cm">
+ <draw:text-box>
+ <text:p>Text with a<text:span text:style-name="T1">Subscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">Text with a</text:span><text:span text:style-name="T1">Subscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">Text with a</text:span><text:span text:style-name="T1">Subscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">Text with a</text:span><text:span text:style-name="T1">Subscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">Text with a</text:span><text:span text:style-name="T1">Subscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">Text with a</text:span><text:span text:style-name="T1">Subscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">A normal line of text</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">A normal line of text</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">A normal line of text</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">A normal line of text</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">A normal line of text</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">A normal line of text</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">Text with a</text:span><text:span text:style-name="T1">Subscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">Text with a</text:span><text:span text:style-name="T1">Subscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">Text with a</text:span><text:span text:style-name="T1">Subscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">Text with a</text:span><text:span text:style-name="T1">Subscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">Text with a</text:span><text:span text:style-name="T1">Subscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">Text with a</text:span><text:span text:style-name="T3">Superscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">Text with a</text:span><text:span text:style-name="T3">Superscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">Text with a</text:span><text:span text:style-name="T3">Superscript</text:span></text:p>
+ <text:p text:style-name="P2"><text:span text:style-name="T2">The spacing between all of these rows should be identical. There should not be big gaps caused by default subscripts or superscripts.</text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ </draw:page>
+ </office:drawing>
+ </office:body>
+</office:document>
diff --git a/sd/qa/unit/data/tdf90338.odp b/sd/qa/unit/data/tdf90338.odp
new file mode 100644
index 000000000..55739bb98
--- /dev/null
+++ b/sd/qa/unit/data/tdf90338.odp
Binary files differ
diff --git a/sd/qa/unit/data/tdf90403.pptx b/sd/qa/unit/data/tdf90403.pptx
new file mode 100644
index 000000000..fd48d058a
--- /dev/null
+++ b/sd/qa/unit/data/tdf90403.pptx
Binary files differ
diff --git a/sd/qa/unit/data/tdf92001.odp b/sd/qa/unit/data/tdf92001.odp
new file mode 100644
index 000000000..886826f0b
--- /dev/null
+++ b/sd/qa/unit/data/tdf92001.odp
Binary files differ
diff --git a/sd/qa/unit/data/tdf97808.fodp b/sd/qa/unit/data/tdf97808.fodp
new file mode 100644
index 000000000..ac2d3e2d8
--- /dev/null
+++ b/sd/qa/unit/data/tdf97808.fodp
@@ -0,0 +1,30 @@
+<?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.presentation">
+ <office:styles>
+
+ <draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="M10 0l-10 30h20z"/>
+ <draw:stroke-dash draw:name="Dashed_20__28_var_29__20_2" draw:display-name="Dashed (var) 2" draw:style="rect" draw:dots1="1" draw:dots1-length="0.02cm" draw:dots2="1" draw:dots2-length="0.02cm" draw:distance="0.02cm"/>
+ <style:style style:name="objectwithoutfill" style:family="graphic">
+ <style:graphic-properties draw:stroke-dash="Dashed_20__28_var_29__20_2" svg:stroke-color="#000000" draw:marker-end="Arrow" draw:marker-end-width="0.6cm" draw:fill="solid" draw:fill-color="#008000"/>
+ </style:style>
+
+ </office:styles>
+ <office:automatic-styles>
+
+ <style:style style:name="gr12" style:family="graphic" style:parent-style-name="objectwithoutfill">
+ <style:graphic-properties svg:stroke-color="#999999" draw:marker-end="" draw:marker-end-width="0.3cm" draw:fill="solid" draw:textarea-vertical-align="middle"/>
+ </style:style>
+
+ </office:automatic-styles>
+ <office:body>
+ <office:presentation>
+
+ <draw:page>
+ <draw:line draw:style-name="gr12" svg:x1="7.152cm" svg:y1="17.473cm" svg:x2="6.89cm" svg:y2="15.718cm">
+ <text:p/>
+ </draw:line>
+ </draw:page>
+
+ </office:presentation>
+ </office:body>
+</office:document>
diff --git a/sd/qa/unit/data/tdf98839_ShearVFlipH.odg b/sd/qa/unit/data/tdf98839_ShearVFlipH.odg
new file mode 100644
index 000000000..88763f8d3
--- /dev/null
+++ b/sd/qa/unit/data/tdf98839_ShearVFlipH.odg
Binary files differ
diff --git a/sd/qa/unit/data/tdf99396.odp b/sd/qa/unit/data/tdf99396.odp
new file mode 100644
index 000000000..636260020
--- /dev/null
+++ b/sd/qa/unit/data/tdf99396.odp
Binary files differ
diff --git a/sd/qa/unit/data/tolerance.xml b/sd/qa/unit/data/tolerance.xml
new file mode 100644
index 000000000..167dfb61b
--- /dev/null
+++ b/sd/qa/unit/data/tolerance.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<tolerances>
+</tolerances>
diff --git a/sd/qa/unit/data/transparent-text.fodg b/sd/qa/unit/data/transparent-text.fodg
new file mode 100644
index 000000000..697f2a22b
--- /dev/null
+++ b/sd/qa/unit/data/transparent-text.fodg
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:officeooo="http://openoffice.org/2009/office" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field: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:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.graphics">
+ <office:font-face-decls>
+ <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <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="Noto Sans" svg:font-family="&apos;Noto Sans&apos;" style:font-family-generic="roman" 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"/>
+ <style:font-face style:name="Segoe UI" svg:font-family="&apos;Segoe UI&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Tahoma" svg:font-family="Tahoma" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+ <draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="M10 0l-10 30h20z"/>
+ <style:default-style style:family="graphic">
+ <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap"/>
+ <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" 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" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="24pt" fo:language="hu" fo:country="HU" style:font-name-asian="Segoe UI" style:font-size-asian="24pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Tahoma" style:font-size-complex="24pt" style:language-complex="hi" style:country-complex="IN"/>
+ </style:default-style>
+ <style:style style:name="standard" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0cm" svg:stroke-color="#3465a4" draw:marker-start-width="0.2cm" draw:marker-start-center="false" draw:marker-end-width="0.2cm" draw:marker-end-center="false" draw:fill="solid" draw:fill-color="#729fcf" draw:textarea-horizontal-align="justify" fo:padding-top="0.125cm" fo:padding-bottom="0.125cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080">
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" loext:opacity="0%" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="Tahoma" style:font-family-asian="Tahoma" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="18pt" style:font-style-asian="normal" style:font-weight-asian="normal" 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="18pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="objectwithoutfill" style:family="graphic" style:parent-style-name="standard"/>
+ <style:style style:name="Text" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#cccccc" draw:fill="solid" draw:fill-color="#eeeeee"/>
+ <style:text-properties style:font-name="Noto Sans" fo:font-family="&apos;Noto Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ </style:style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:page-layout style:name="PM0">
+ <style:page-layout-properties fo:margin-top="1cm" fo:margin-bottom="1cm" fo:margin-left="1cm" fo:margin-right="1cm" fo:page-width="21.59cm" fo:page-height="27.94cm" style:print-orientation="portrait"/>
+ </style:page-layout>
+ <style:style style:name="dp1" style:family="drawing-page">
+ <style:drawing-page-properties draw:background-size="border" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="dp2" style:family="drawing-page"/>
+ <style:style style:name="gr1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" svg:stroke-color="#3465a4" draw:fill="none" draw:textarea-horizontal-align="justify" draw:textarea-vertical-align="middle" draw:auto-grow-height="false" fo:min-height="5.148cm" fo:min-width="7.491cm"/>
+ </style:style>
+ <style:style style:name="P1" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none"/>
+ <style:text-properties fo:color="#ff0000" loext:opacity="25%" fo:font-size="66pt" style:font-size-asian="18pt" style:font-size-complex="18pt"/>
+ </style:style>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties fo:color="#ff0000" loext:opacity="25%" fo:font-size="66pt" style:font-size-asian="18pt" style:font-size-complex="18pt"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:master-styles>
+ <style:master-page style:name="Default" style:page-layout-name="PM0" draw:style-name="dp1"/>
+ </office:master-styles>
+ <office:body>
+ <office:drawing>
+ <draw:page draw:name="page1" draw:style-name="dp2" draw:master-page-name="Default">
+ <draw:custom-shape draw:name="Shape3" draw:style-name="gr1" draw:text-style-name="P1" draw:layer="layout" svg:width="7.991cm" svg:height="5.398cm" svg:x="6.43cm" svg:y="14.304cm">
+ <text:p><text:span text:style-name="T1">asdf</text:span></text:p>
+ <draw:enhanced-geometry svg:viewBox="0 0 21600 21600" draw:type="rectangle" draw:enhanced-path="M 0 0 L 21600 0 21600 21600 0 21600 0 0 Z N"/>
+ </draw:custom-shape>
+ </draw:page>
+ </office:drawing>
+ </office:body>
+</office:document>
diff --git a/sd/qa/unit/data/underline.fodp b/sd/qa/unit/data/underline.fodp
new file mode 100644
index 000000000..6fe945b3f
--- /dev/null
+++ b/sd/qa/unit/data/underline.fodp
@@ -0,0 +1,754 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document xmlns:officeooo="http://openoffice.org/2009/office" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rpt="http://openoffice.org/2005/report" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field: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:xforms="http://www.w3.org/2002/xforms" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.presentation">
+ <office:meta><meta:creation-date>2022-04-21T09:59:24.360983546</meta:creation-date><dc:date>2022-04-21T10:00:11.300414659</dc:date><meta:editing-duration>PT47S</meta:editing-duration><meta:editing-cycles>1</meta:editing-cycles><meta:generator>LibreOfficeDev/7.4.0.0.alpha0$Linux_X86_64 LibreOffice_project/795a39cc0b0e640863503d4b7b1dfdc4fcd7c6a4</meta:generator><meta:document-statistic meta:object-count="24"/></office:meta>
+ <office:settings>
+ <config:config-item-set config:name="ooo:view-settings">
+ <config:config-item config:name="VisibleAreaTop" config:type="int">-30780</config:config-item>
+ <config:config-item config:name="VisibleAreaLeft" config:type="int">-441</config:config-item>
+ <config:config-item config:name="VisibleAreaWidth" config:type="int">29545</config:config-item>
+ <config:config-item config:name="VisibleAreaHeight" config:type="int">77170</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">view1</config:config-item>
+ <config:config-item config:name="GridIsVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="GridIsFront" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsSnapToGrid" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToPageMargins" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToSnapLines" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToObjectFrame" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToObjectPoints" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPlusHandlesAlwaysVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsFrameDragSingles" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EliminatePolyPointLimitAngle" config:type="int">1500</config:config-item>
+ <config:config-item config:name="IsEliminatePolyPoints" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="VisibleLayers" config:type="base64Binary">Hw==</config:config-item>
+ <config:config-item config:name="PrintableLayers" config:type="base64Binary">Hw==</config:config-item>
+ <config:config-item config:name="LockedLayers" config:type="base64Binary"/>
+ <config:config-item config:name="NoAttribs" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="NoColors" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="RulerIsVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PageKind" config:type="short">0</config:config-item>
+ <config:config-item config:name="SelectedPage" config:type="short">0</config:config-item>
+ <config:config-item config:name="IsLayerMode" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsDoubleClickTextEdit" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsClickChangeRotation" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="SlidesPerRow" config:type="short">4</config:config-item>
+ <config:config-item config:name="EditMode" config:type="int">0</config:config-item>
+ <config:config-item config:name="VisibleAreaTop" config:type="int">-30780</config:config-item>
+ <config:config-item config:name="VisibleAreaLeft" config:type="int">-441</config:config-item>
+ <config:config-item config:name="VisibleAreaWidth" config:type="int">29546</config:config-item>
+ <config:config-item config:name="VisibleAreaHeight" config:type="int">77171</config:config-item>
+ <config:config-item config:name="GridCoarseWidth" config:type="int">2000</config:config-item>
+ <config:config-item config:name="GridCoarseHeight" config:type="int">2000</config:config-item>
+ <config:config-item config:name="GridFineWidth" config:type="int">500</config:config-item>
+ <config:config-item config:name="GridFineHeight" config:type="int">500</config:config-item>
+ <config:config-item config:name="GridSnapWidthXNumerator" config:type="int">2000</config:config-item>
+ <config:config-item config:name="GridSnapWidthXDenominator" config:type="int">4</config:config-item>
+ <config:config-item config:name="GridSnapWidthYNumerator" config:type="int">2000</config:config-item>
+ <config:config-item config:name="GridSnapWidthYDenominator" config:type="int">4</config:config-item>
+ <config:config-item config:name="IsAngleSnapEnabled" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SnapAngle" config:type="int">1500</config:config-item>
+ <config:config-item config:name="ZoomOnPage" config:type="boolean">true</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="ApplyUserData" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="BitmapTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sob</config:config-item>
+ <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item>
+ <config:config-item config:name="ColorTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soc</config:config-item>
+ <config:config-item config:name="DashTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sod</config:config-item>
+ <config:config-item config:name="DefaultTabStop" config:type="int">1250</config:config-item>
+ <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="GradientTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.sog</config:config-item>
+ <config:config-item config:name="HandoutsHorizontal" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="HatchTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soh</config:config-item>
+ <config:config-item config:name="ImagePreferredDPI" config:type="int">0</config:config-item>
+ <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintBooklet" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintBookletBack" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintBookletFront" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintDate" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintDrawing" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintFitPage" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintHandout" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintHiddenPages" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintNotes" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintOutline" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintPageName" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintTilePage" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintTime" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="LineEndTableURL" config:type="string">$(brandbaseurl)/share/palette%3B$(userpath)/config/standard.soe</config:config-item>
+ <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PageNumberFormat" config:type="int">4</config:config-item>
+ <config:config-item config:name="ParagraphSummation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrintQuality" config:type="int">0</config:config-item>
+ <config:config-item config:name="PrinterIndependentLayout" config:type="string">low-resolution</config:config-item>
+ <config:config-item config:name="PrinterName" config:type="string">Generic Printer</config:config-item>
+ <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrinterSetup" config:type="base64Binary">lAH+/0dlbmVyaWMgUHJpbnRlcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0dFTlBSVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAMAtQAAAAAAAAAEAAhSAAAEdAAASm9iRGF0YSAxCnByaW50ZXI9R2VuZXJpYyBQcmludGVyCm9yaWVudGF0aW9uPVBvcnRyYWl0CmNvcGllcz0xCmNvbGxhdGU9ZmFsc2UKbWFyZ2luYWRqdXN0bWVudD0wLDAsMCwwCmNvbG9yZGVwdGg9MjQKcHNsZXZlbD0wCnBkZmRldmljZT0xCmNvbG9yZGV2aWNlPTAKUFBEQ29udGV4dERhdGEKUGFnZVNpemU6QTQAABIAQ09NUEFUX0RVUExFWF9NT0RFDwBEdXBsZXhNb2RlOjpPZmY=</config:config-item>
+ <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SlidesPerHandout" config:type="short">6</config:config-item>
+ <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</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="Bitstream Vera Sans" svg:font-family="&apos;Bitstream Vera Sans&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="DejaVu Sans" svg:font-family="&apos;DejaVu Sans&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <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="Lohit Devanagari" svg:font-family="&apos;Lohit Devanagari&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Noto Sans" svg:font-family="&apos;Noto Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <style:font-face style:name="Noto Sans CJK SC" svg:font-family="&apos;Noto Sans CJK SC&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+ <draw:gradient draw:name="Filled" draw:style="linear" draw:start-color="#ffffff" draw:end-color="#cccccc" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="30deg" draw:border="0%"/>
+ <draw:gradient draw:name="Filled_20_Blue" draw:display-name="Filled Blue" draw:style="linear" draw:start-color="#729fcf" draw:end-color="#355269" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="30deg" draw:border="0%"/>
+ <draw:gradient draw:name="Filled_20_Green" draw:display-name="Filled Green" draw:style="linear" draw:start-color="#77bc65" draw:end-color="#127622" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="30deg" draw:border="0%"/>
+ <draw:gradient draw:name="Filled_20_Red" draw:display-name="Filled Red" draw:style="linear" draw:start-color="#ff6d6d" draw:end-color="#c9211e" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="30deg" draw:border="0%"/>
+ <draw:gradient draw:name="Filled_20_Yellow" draw:display-name="Filled Yellow" draw:style="linear" draw:start-color="#ffde59" draw:end-color="#b47804" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="30deg" draw:border="0%"/>
+ <draw:gradient draw:name="Shapes" draw:style="rectangular" draw:cx="50%" draw:cy="50%" draw:start-color="#cccccc" draw:end-color="#ffffff" draw:start-intensity="100%" draw:end-intensity="100%" draw:angle="0deg" draw:border="0%"/>
+ <draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="M10 0l-10 30h20z"/>
+ <style:default-style style:family="graphic">
+ <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap"/>
+ <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" 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" loext:opacity="0%" loext:color-lum-mod="100%" loext:color-lum-off="0%" style:font-name="Liberation Serif" fo:font-size="24pt" fo:language="es" fo:country="ES" style:font-name-asian="DejaVu Sans" style:font-size-asian="24pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Bitstream Vera Sans" style:font-size-complex="24pt" style:language-complex="hi" style:country-complex="IN"/>
+ </style:default-style>
+ <style:style style:name="standard" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0cm" svg:stroke-color="#3465a4" draw:marker-start-width="0.2cm" draw:marker-start-center="false" draw:marker-end-width="0.2cm" draw:marker-end-center="false" draw:fill="solid" draw:fill-color="#729fcf" draw:textarea-horizontal-align="justify" fo:padding-top="0.125cm" fo:padding-bottom="0.125cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" fo:wrap-option="wrap" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080">
+ <text:list-style style:name="standard">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" loext:opacity="0%" loext:color-lum-mod="100%" loext:color-lum-off="0%" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="Noto Sans CJK SC" style:font-family-asian="&apos;Noto Sans CJK SC&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="18pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Lohit Devanagari" style:font-family-complex="&apos;Lohit Devanagari&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="18pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="objectwithoutfill" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Object_20_with_20_no_20_fill_20_and_20_no_20_line" style:display-name="Object with no fill and no line" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Text" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#cccccc" draw:fill="solid" draw:fill-color="#eeeeee"/>
+ <style:text-properties style:font-name="Noto Sans" fo:font-family="&apos;Noto Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ </style:style>
+ <style:style style:name="A4" style:family="graphic" style:parent-style-name="Text">
+ <style:graphic-properties draw:fill="none"/>
+ <style:text-properties fo:font-size="18pt"/>
+ </style:style>
+ <style:style style:name="Title_20_A4" style:display-name="Title A4" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ <style:text-properties fo:font-size="44pt"/>
+ </style:style>
+ <style:style style:name="Heading_20_A4" style:display-name="Heading A4" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="Text_20_A4" style:display-name="Text A4" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ </style:style>
+ <style:style style:name="A4" style:family="graphic" style:parent-style-name="Text">
+ <style:graphic-properties draw:fill="none"/>
+ <style:text-properties fo:font-size="18pt"/>
+ </style:style>
+ <style:style style:name="Title_20_A0" style:display-name="Title A0" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ <style:text-properties fo:font-size="96pt"/>
+ </style:style>
+ <style:style style:name="Heading_20_A0" style:display-name="Heading A0" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ <style:text-properties fo:font-size="71.9000015258789pt"/>
+ </style:style>
+ <style:style style:name="Text_20_A0" style:display-name="Text A0" style:family="graphic" style:parent-style-name="A4">
+ <style:graphic-properties draw:stroke="none"/>
+ </style:style>
+ <style:style style:name="Graphic" style:family="graphic">
+ <style:graphic-properties draw:fill="solid" draw:fill-color="#ffffff"/>
+ <style:text-properties style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt"/>
+ </style:style>
+ <style:style style:name="Shapes" style:family="graphic" style:parent-style-name="Graphic">
+ <style:graphic-properties draw:stroke="none" draw:fill="gradient" draw:fill-gradient-name="Shapes"/>
+ <style:text-properties fo:font-size="14pt" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="Filled" style:family="graphic" style:parent-style-name="Shapes">
+ <style:graphic-properties draw:fill="gradient" draw:fill-gradient-name="Filled"/>
+ </style:style>
+ <style:style style:name="Filled_20_Blue" style:display-name="Filled Blue" style:family="graphic" style:parent-style-name="Filled">
+ <style:graphic-properties draw:fill-gradient-name="Filled_20_Blue"/>
+ <style:text-properties fo:color="#ffffff" loext:opacity="100%" loext:color-lum-mod="100%" loext:color-lum-off="0%"/>
+ </style:style>
+ <style:style style:name="Filled_20_Green" style:display-name="Filled Green" style:family="graphic" style:parent-style-name="Filled">
+ <style:graphic-properties draw:fill-gradient-name="Filled_20_Green"/>
+ <style:text-properties fo:color="#ffffff" loext:opacity="100%" loext:color-lum-mod="100%" loext:color-lum-off="0%" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ </style:style>
+ <style:style style:name="Filled_20_Red" style:display-name="Filled Red" style:family="graphic" style:parent-style-name="Filled">
+ <style:graphic-properties draw:fill-gradient-name="Filled_20_Red"/>
+ <style:text-properties fo:color="#ffffff" loext:opacity="100%" loext:color-lum-mod="100%" loext:color-lum-off="0%"/>
+ </style:style>
+ <style:style style:name="Filled_20_Yellow" style:display-name="Filled Yellow" style:family="graphic" style:parent-style-name="Filled">
+ <style:graphic-properties draw:fill-gradient-name="Filled_20_Yellow"/>
+ <style:text-properties fo:color="#ffffff" loext:opacity="100%" loext:color-lum-mod="100%" loext:color-lum-off="0%"/>
+ </style:style>
+ <style:style style:name="Outlined" style:family="graphic" style:parent-style-name="Shapes">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0.081cm" svg:stroke-color="#000000" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Outlined_20_Blue" style:display-name="Outlined Blue" style:family="graphic" style:parent-style-name="Outlined">
+ <style:graphic-properties svg:stroke-color="#355269"/>
+ <style:text-properties fo:color="#355269" loext:opacity="100%" loext:color-lum-mod="100%" loext:color-lum-off="0%"/>
+ </style:style>
+ <style:style style:name="Outlined_20_Green" style:display-name="Outlined Green" style:family="graphic" style:parent-style-name="Outlined">
+ <style:graphic-properties svg:stroke-color="#127622"/>
+ <style:text-properties fo:color="#127622" loext:opacity="100%" loext:color-lum-mod="100%" loext:color-lum-off="0%"/>
+ </style:style>
+ <style:style style:name="Outlined_20_Red" style:display-name="Outlined Red" style:family="graphic" style:parent-style-name="Outlined">
+ <style:graphic-properties svg:stroke-color="#c9211e"/>
+ <style:text-properties fo:color="#c9211e" loext:opacity="100%" loext:color-lum-mod="100%" loext:color-lum-off="0%"/>
+ </style:style>
+ <style:style style:name="Outlined_20_Yellow" style:display-name="Outlined Yellow" style:family="graphic" style:parent-style-name="Outlined">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#b47804"/>
+ <style:text-properties fo:color="#b47804" loext:opacity="100%" loext:color-lum-mod="100%" loext:color-lum-off="0%"/>
+ </style:style>
+ <style:style style:name="Lines" style:family="graphic" style:parent-style-name="Graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#000000" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Arrow_20_Line" style:display-name="Arrow Line" style:family="graphic" style:parent-style-name="Lines">
+ <style:graphic-properties draw:marker-start="Arrow" draw:marker-start-width="0.2cm" draw:marker-end="Arrow" draw:marker-end-width="0.2cm" draw:show-unit="true"/>
+ </style:style>
+ <style:style style:name="Arrow_20_Dashed" style:display-name="Arrow Dashed" style:family="graphic" style:parent-style-name="Lines">
+ <style:graphic-properties draw:stroke="dash"/>
+ </style:style>
+ <style:style style:name="Default-background" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties style:letter-kerning="true"/>
+ </style:style>
+ <style:style style:name="Default-backgroundobjects" style:family="presentation">
+ <style:graphic-properties draw:textarea-horizontal-align="justify" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:text-properties style:letter-kerning="true"/>
+ </style:style>
+ <style:style style:name="Default-notes" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-left="0.6cm" fo:margin-right="0cm" fo:text-indent="-0.6cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" loext:opacity="0%" loext:color-lum-mod="100%" loext:color-lum-off="0%" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="20pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Noto Sans CJK SC" style:font-family-asian="&apos;Noto Sans CJK SC&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="20pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Lohit Devanagari" style:font-family-complex="&apos;Lohit Devanagari&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="20pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="Default-outline1" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:auto-grow-height="false" draw:fit-to-size="false" style:shrink-to-fit="true">
+ <text:list-style style:name="Default-outline1">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.3cm" text:min-label-width="0.9cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="–">
+ <style:list-level-properties text:space-before="1.5cm" text:min-label-width="0.9cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="75%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.8cm" text:min-label-width="0.8cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="–">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="75%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="6.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="7.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="9cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="10.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="11.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-top="0.5cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" loext:opacity="0%" loext:color-lum-mod="100%" loext:color-lum-off="0%" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="32pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Noto Sans CJK SC" style:font-family-asian="&apos;Noto Sans CJK SC&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="32pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Lohit Devanagari" style:font-family-complex="&apos;Lohit Devanagari&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="32pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="Default-outline2" style:family="presentation" style:parent-style-name="Default-outline1">
+ <style:paragraph-properties fo:margin-top="0.4cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="28pt" style:font-size-asian="28pt" style:font-size-complex="28pt"/>
+ </style:style>
+ <style:style style:name="Default-outline3" style:family="presentation" style:parent-style-name="Default-outline2">
+ <style:paragraph-properties fo:margin-top="0.3cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="24pt" style:font-size-asian="24pt" style:font-size-complex="24pt"/>
+ </style:style>
+ <style:style style:name="Default-outline4" style:family="presentation" style:parent-style-name="Default-outline3">
+ <style:paragraph-properties fo:margin-top="0.2cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline5" style:family="presentation" style:parent-style-name="Default-outline4">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline6" style:family="presentation" style:parent-style-name="Default-outline5">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline7" style:family="presentation" style:parent-style-name="Default-outline6">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline8" style:family="presentation" style:parent-style-name="Default-outline7">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline9" style:family="presentation" style:parent-style-name="Default-outline8">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-subtitle" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-vertical-align="middle">
+ <text:list-style style:name="Default-subtitle">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-align="center" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" loext:opacity="0%" loext:color-lum-mod="100%" loext:color-lum-off="0%" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="32pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Noto Sans CJK SC" style:font-family-asian="&apos;Noto Sans CJK SC&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="32pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Lohit Devanagari" style:font-family-complex="&apos;Lohit Devanagari&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="32pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="Default-title" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-vertical-align="middle">
+ <text:list-style style:name="Default-title">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" loext:opacity="0%" loext:color-lum-mod="100%" loext:color-lum-off="0%" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="44pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Noto Sans CJK SC" style:font-family-asian="&apos;Noto Sans CJK SC&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="44pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Lohit Devanagari" style:font-family-complex="&apos;Lohit Devanagari&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="44pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:presentation-page-layout style:name="AL0T26">
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="1.743cm" svg:width="10.556cm" svg:height="-0.231cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="1.743cm" svg:width="10.556cm" svg:height="-0.231cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="3.612cm" svg:width="10.556cm" svg:height="-0.231cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="3.612cm" svg:width="10.556cm" svg:height="-0.231cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="5.481cm" svg:width="10.556cm" svg:height="-0.231cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="5.481cm" svg:width="10.556cm" svg:height="-0.231cm"/>
+ </style:presentation-page-layout>
+ <style:presentation-page-layout style:name="AL1T0">
+ <presentation:placeholder presentation:object="title" svg:x="2.058cm" svg:y="1.743cm" svg:width="23.912cm" svg:height="3.507cm"/>
+ <presentation:placeholder presentation:object="subtitle" svg:x="2.058cm" svg:y="5.838cm" svg:width="23.912cm" svg:height="13.23cm"/>
+ </style:presentation-page-layout>
+ </office:styles>
+ <office:automatic-styles>
+ <style:page-layout style:name="PM0">
+ <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="21cm" fo:page-height="29.7cm" style:print-orientation="portrait"/>
+ </style:page-layout>
+ <style:page-layout style:name="PM1">
+ <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="28cm" fo:page-height="15.75cm" style:print-orientation="landscape"/>
+ </style:page-layout>
+ <style:style style:name="dp1" style:family="drawing-page">
+ <style:drawing-page-properties draw:background-size="border" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="dp2" style:family="drawing-page">
+ <style:drawing-page-properties presentation:display-header="true" presentation:display-footer="true" presentation:display-page-number="false" presentation:display-date-time="true"/>
+ </style:style>
+ <style:style style:name="dp3" style:family="drawing-page">
+ <style:drawing-page-properties presentation:background-visible="true" presentation:background-objects-visible="true" presentation:display-footer="true" presentation:display-page-number="false" presentation:display-date-time="true"/>
+ </style:style>
+ <style:style style:name="gr1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="gr2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="gr3" style:family="graphic">
+ <style:graphic-properties style:protect="size"/>
+ </style:style>
+ <style:style style:name="pr1" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.086cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="pr2" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="pr3" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="pr4" style:family="presentation" style:parent-style-name="Default-subtitle">
+ <style:graphic-properties draw:fill-color="#ffffff" fo:min-height="9.134cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="pr5" style:family="presentation" style:parent-style-name="Default-notes">
+ <style:graphic-properties draw:fill-color="#ffffff" fo:min-height="13.364cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="P1" style:family="paragraph">
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P2" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P3" style:family="paragraph">
+ <style:paragraph-properties fo:text-align="end" style:writing-mode="lr-tb"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P4" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:paragraph-properties fo:text-align="end" style:writing-mode="lr-tb"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P5" style:family="paragraph">
+ <style:paragraph-properties fo:text-align="center" style:writing-mode="lr-tb"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P6" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:paragraph-properties fo:text-align="center" style:writing-mode="lr-tb"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P7" style:family="paragraph">
+ <loext:graphic-properties draw:fill-color="#ffffff"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ <style:text-properties fo:color="#ff0000" loext:opacity="100%" loext:color-lum-mod="100%" loext:color-lum-off="0%" style:text-underline-style="solid" style:text-underline-type="double" style:text-underline-width="auto" style:text-underline-color="font-color"/>
+ </style:style>
+ <style:style style:name="P8" style:family="paragraph">
+ <loext:graphic-properties draw:fill-color="#ffffff"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="T2" style:family="text">
+ <style:text-properties fo:color="#ff0000" loext:opacity="100%" style:text-underline-style="solid" style:text-underline-type="double" style:text-underline-width="auto" style:text-underline-color="font-color"/>
+ </style:style>
+ <text:list-style style:name="L1">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ <text:list-style style:name="L2">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </office:automatic-styles>
+ <office:master-styles>
+ <draw:layer-set>
+ <draw:layer draw:name="layout"/>
+ <draw:layer draw:name="background"/>
+ <draw:layer draw:name="backgroundobjects"/>
+ <draw:layer draw:name="controls"/>
+ <draw:layer draw:name="measurelines"/>
+ </draw:layer-set>
+ <style:handout-master presentation:presentation-page-layout-name="AL0T26" style:page-layout-name="PM0" draw:style-name="dp2">
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="5.061cm" svg:x="1cm" svg:y="3.742cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="5.061cm" svg:x="1cm" svg:y="12.318cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="5.061cm" svg:x="1cm" svg:y="20.894cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="5.061cm" svg:x="11cm" svg:y="3.742cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="5.061cm" svg:x="11cm" svg:y="12.318cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="5.061cm" svg:x="11cm" svg:y="20.894cm"/>
+ <draw:frame draw:style-name="gr1" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="0cm" presentation:class="header">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:header/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr1" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="0cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><presentation:date-time/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr2" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="28.215cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:footer/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr2" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="28.215cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ </style:handout-master>
+ <style:master-page style:name="Default" style:page-layout-name="PM1" draw:style-name="dp1">
+ <draw:frame presentation:style-name="Default-title" draw:layer="backgroundobjects" svg:width="25.199cm" svg:height="2.629cm" svg:x="1.4cm" svg:y="0.628cm" presentation:class="title" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="Default-outline1" draw:layer="backgroundobjects" svg:width="25.199cm" svg:height="9.134cm" svg:x="1.4cm" svg:y="3.685cm" presentation:class="outline" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="6.523cm" svg:height="1.085cm" svg:x="1.4cm" svg:y="14.348cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:date-time/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P6" draw:layer="backgroundobjects" svg:width="8.875cm" svg:height="1.085cm" svg:x="9.576cm" svg:y="14.348cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P5"><text:span text:style-name="T1"><presentation:footer/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="6.523cm" svg:height="1.085cm" svg:x="20.076cm" svg:y="14.348cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <presentation:notes style:page-layout-name="PM0">
+ <draw:page-thumbnail presentation:style-name="Default-title" draw:layer="backgroundobjects" svg:width="19.798cm" svg:height="11.136cm" svg:x="0.6cm" svg:y="2.257cm" presentation:class="page"/>
+ <draw:frame presentation:style-name="Default-notes" draw:layer="backgroundobjects" svg:width="16.799cm" svg:height="13.364cm" svg:x="2.1cm" svg:y="14.107cm" presentation:class="notes" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr2" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="0cm" presentation:class="header">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:header/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr2" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="0cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><presentation:date-time/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr3" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="28.215cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:footer/></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr3" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="28.215cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ </presentation:notes>
+ </style:master-page>
+ </office:master-styles>
+ <office:body>
+ <office:presentation>
+ <draw:page draw:name="page1" draw:style-name="dp3" draw:master-page-name="Default" presentation:presentation-page-layout-name="AL1T0">
+ <draw:frame presentation:style-name="pr4" draw:text-style-name="P7" draw:layer="layout" svg:width="25.199cm" svg:height="9.134cm" svg:x="1.4cm" svg:y="3.685cm" presentation:class="subtitle">
+ <draw:text-box>
+ <text:p><text:span text:style-name="T2">Test</text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <presentation:notes draw:style-name="dp2">
+ <draw:page-thumbnail draw:style-name="gr3" draw:layer="layout" svg:width="19.798cm" svg:height="11.136cm" svg:x="0.6cm" svg:y="2.257cm" draw:page-number="1" presentation:class="page"/>
+ <draw:frame presentation:style-name="pr5" draw:text-style-name="P8" draw:layer="layout" svg:width="16.799cm" svg:height="13.364cm" svg:x="2.1cm" svg:y="14.107cm" presentation:class="notes" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ </presentation:notes>
+ </draw:page>
+ <presentation:settings presentation:mouse-visible="false"/>
+ </office:presentation>
+ </office:body>
+</office:document> \ No newline at end of file
diff --git a/sd/qa/unit/data/unknown-attribute.fodp b/sd/qa/unit/data/unknown-attribute.fodp
new file mode 100644
index 000000000..3aa39b666
--- /dev/null
+++ b/sd/qa/unit/data/unknown-attribute.fodp
@@ -0,0 +1,26 @@
+<?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.presentation">
+ <office:styles>
+
+ </office:styles>
+ <office:automatic-styles>
+
+ <style:style style:name="gr1" style:family="graphic">
+ <style:graphic-properties svg:stroke-color="#000000" draw:fill="solid" draw:fill-color="#008000"
+ svg:fill-rule="evenodd"
+ svg:non-existent-attr="blah"
+ xmlns:foo="http://example.com/" foo:non-existent-att="bar"
+ />
+ </style:style>
+
+ </office:automatic-styles>
+ <office:body>
+ <office:presentation>
+
+ <draw:page>
+ <draw:polygon draw:style-name="gr1" svg:width="3.2cm" svg:height="2cm" svg:x="4cm" svg:y="11.7cm" svg:viewBox="0 0 3201 2001" draw:points="0,2001 3201,2001 3201,0 0,0"/>
+ </draw:page>
+
+ </office:presentation>
+ </office:body>
+</office:document>
diff --git a/sd/qa/unit/data/xml/fdo47434_0.xml b/sd/qa/unit/data/xml/fdo47434_0.xml
new file mode 100644
index 000000000..24dc47005
--- /dev/null
+++ b/sd/qa/unit/data/xml/fdo47434_0.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="5357" positionY="4365" sizeX="5557" sizeY="1" type="com.sun.star.drawing.ConnectorShape" name="Straight Arrow Connector 4" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd>
+ <pointSequence>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="350" positionY="322" polygonFlags="NORMAL"/>
+ <point positionX="322" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="193" positionY="102" polygonFlags="NORMAL"/>
+ <point positionX="193" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="156" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="156" positionY="102" polygonFlags="NORMAL"/>
+ <point positionX="27" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="322" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineEnd>
+ </XShape>
+ <XShape positionX="5357" positionY="5159" sizeX="5557" sizeY="0" type="com.sun.star.drawing.ConnectorShape" name="Straight Arrow Connector 5" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd>
+ <pointSequence>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="350" positionY="322" polygonFlags="NORMAL"/>
+ <point positionX="322" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="193" positionY="102" polygonFlags="NORMAL"/>
+ <point positionX="193" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="156" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="156" positionY="102" polygonFlags="NORMAL"/>
+ <point positionX="27" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="322" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineEnd>
+ </XShape>
+ <XShape positionX="14485" positionY="4365" sizeX="5557" sizeY="1" type="com.sun.star.drawing.ConnectorShape" name="Straight Arrow Connector 6" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd>
+ <pointSequence>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="350" positionY="322" polygonFlags="NORMAL"/>
+ <point positionX="322" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="193" positionY="102" polygonFlags="NORMAL"/>
+ <point positionX="193" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="156" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="156" positionY="102" polygonFlags="NORMAL"/>
+ <point positionX="27" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="322" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineEnd>
+ </XShape>
+ <XShape positionX="14485" positionY="5159" sizeX="5557" sizeY="0" type="com.sun.star.drawing.ConnectorShape" name="Straight Arrow Connector 8" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd>
+ <pointSequence>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="350" positionY="322" polygonFlags="NORMAL"/>
+ <point positionX="322" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="193" positionY="102" polygonFlags="NORMAL"/>
+ <point positionX="193" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="156" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="156" positionY="102" polygonFlags="NORMAL"/>
+ <point positionX="27" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="322" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineEnd>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/fdo64586_0.xml b/sd/qa/unit/data/xml/fdo64586_0.xml
new file mode 100644
index 000000000..d8ae74578
--- /dev/null
+++ b/sd/qa/unit/data/xml/fdo64586_0.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="1397" positionY="838" sizeX="25197" sizeY="3506" type="com.sun.star.presentation.TitleTextShape" fontHeight="44.000000" fontColor="000000" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="3506" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="000000" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="25198.000000" column2="0.000000" column3="1397.000000"/>
+ <Line2 column1="0.000000" column2="3507.000000" column3="838.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+ <XShape positionX="1397" positionY="4912" sizeX="25197" sizeY="12180" type="com.sun.star.presentation.SubtitleShape" text="Blah" fontHeight="32.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="0" textRightDistance="0" textUpperDistance="78" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="12103" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="000000" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="25198.000000" column2="0.000000" column3="1397.000000"/>
+ <Line2 column1="0.000000" column2="12181.000000" column3="4912.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/fdo71434_0.xml b/sd/qa/unit/data/xml/fdo71434_0.xml
new file mode 100644
index 000000000..0ec2570dc
--- /dev/null
+++ b/sd/qa/unit/data/xml/fdo71434_0.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="2823" positionY="-75" sizeX="19753" sizeY="19045" type="com.sun.star.drawing.GraphicObjectShape" name="Picture 5" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" shadow="false" shadowColor="808080" shadowTransparence="0" shadowXDistance="200" shadowYDistance="200" zOrder="0" layerID="0" layerName="layout" visible="true" printable="true" moveProtect="false" sizeProtect="false">
+ <Transformation>
+ <Line1 column1="19754.000000" column2="0.000000" column3="2823.000000"/>
+ <Line2 column1="0.000000" column2="19046.000000" column3="-75.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/n593612_0.xml b/sd/qa/unit/data/xml/n593612_0.xml
new file mode 100644
index 000000000..3f5f88e44
--- /dev/null
+++ b/sd/qa/unit/data/xml/n593612_0.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="11429" positionY="1324" sizeX="2259" sizeY="15209" type="com.sun.star.drawing.CustomShape" name="Rectangle 52" text="&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;" fontHeight="24.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="254" textRightDistance="254" textUpperDistance="127" textLowerDistance="127" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="3c8c93" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2260.000000" column2="0.000000" column3="11429.000000"/>
+ <Line2 column1="0.000000" column2="15210.000000" column3="1324.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/n758621_0.xml b/sd/qa/unit/data/xml/n758621_0.xml
new file mode 100644
index 000000000..aba12ebe6
--- /dev/null
+++ b/sd/qa/unit/data/xml/n758621_0.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="12042" positionY="1904" sizeX="12087" sizeY="9521" type="com.sun.star.presentation.TitleTextShape" fontHeight="60.000000" fontColor="004990" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="RIGHT" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="130" textLowerDistance="130" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="9261" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="000000" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="12088.000000" column2="0.000000" column3="12042.000000"/>
+ <Line2 column1="0.000000" column2="9522.000000" column3="1904.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+ <XShape positionX="14176" positionY="13123" sizeX="9953" sizeY="3810" type="com.sun.star.presentation.SubtitleShape" fontHeight="36.000000" fontColor="92d050" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="RIGHT" textVerticalAdjust="TOP" textLeftDistance="0" textRightDistance="0" textUpperDistance="0" textLowerDistance="0" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="3810" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="000000" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="9954.000000" column2="0.000000" column3="14176.000000"/>
+ <Line2 column1="0.000000" column2="3811.000000" column3="13123.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/n758621_1.xml b/sd/qa/unit/data/xml/n758621_1.xml
new file mode 100644
index 000000000..556c18673
--- /dev/null
+++ b/sd/qa/unit/data/xml/n758621_1.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="1485" positionY="610" sizeX="18411" sizeY="1954" type="com.sun.star.presentation.TitleTextShape" fontHeight="40.000000" fontColor="ff0000" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="LEFT" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="130" textLowerDistance="130" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="1645" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="000000" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="18412.000000" column2="0.000000" column3="1485.000000"/>
+ <Line2 column1="0.000000" column2="1955.000000" column3="610.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+ <XShape positionX="1692" positionY="4444" sizeX="22217" sizeY="12061" type="com.sun.star.presentation.OutlinerShape" fontHeight="24.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="AUTOFIT" textHorizontalAdjust="LEFT" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="130" textLowerDistance="130" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="11811" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="000000" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="22218.000000" column2="0.000000" column3="1692.000000"/>
+ <Line2 column1="0.000000" column2="12062.000000" column3="4444.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/n762695_0.xml b/sd/qa/unit/data/xml/n762695_0.xml
new file mode 100644
index 000000000..ae755e644
--- /dev/null
+++ b/sd/qa/unit/data/xml/n762695_0.xml
@@ -0,0 +1,241 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="5769" positionY="5160" sizeX="13390" sizeY="10855" type="com.sun.star.drawing.CustomShape" name="Freeform 3" fontHeight="20.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="c3d69b" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="13391.000000" column2="0.000000" column3="5769.000000"/>
+ <Line2 column1="0.000000" column2="10856.000000" column3="5160.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4572508" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1524525" type="0"/>
+ <Second value="2755361" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1521154" type="0"/>
+ <Second value="1860047" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5441" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4567067" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3003587" type="0"/>
+ <Second value="1854731" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3015827" type="0"/>
+ <Second value="2721006" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4572508" type="0"/>
+ <Second value="4572508" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4572508" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="SubViewSize" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="5291" positionY="7175" sizeX="1419" sizeY="1450" type="com.sun.star.drawing.CustomShape" name="Left Arrow 9" fontHeight="20.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="b29dde" endColor="ffffff" angle="1350" border="0" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1004.091629" column2="1026.011940" column3="5291.000000"/>
+ <Line2 column1="-1004.091629" column2="1026.011940" column3="7175.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="50000" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="50000" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="14" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="6"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-leftArrow" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="17594" positionY="7175" sizeX="1418" sizeY="1450" type="com.sun.star.drawing.CustomShape" name="Left Arrow 13" fontHeight="20.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="b29dde" endColor="ffffff" angle="2250" border="0" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1003.384523" column2="1026.011940" column3="17594.000000"/>
+ <Line2 column1="-1003.384523" column2="1026.011940" column3="7175.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="50000" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="50000" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="true" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="14" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="6"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-leftArrow" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/n762695_1.xml b/sd/qa/unit/data/xml/n762695_1.xml
new file mode 100644
index 000000000..a43924138
--- /dev/null
+++ b/sd/qa/unit/data/xml/n762695_1.xml
@@ -0,0 +1,630 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="3175" positionY="7197" sizeX="17991" sizeY="7619" type="com.sun.star.drawing.CustomShape" name="Freeform 15" fontHeight="24.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="17992.000000" column2="0.000000" column3="3175.000000"/>
+ <Line2 column1="0.000000" column2="7620.000000" column3="7197.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1882502" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="330926" type="0"/>
+ <Second value="2481216" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="912223" type="0"/>
+ <Second value="2807788" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1423852" type="0"/>
+ <Second value="2496457" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1935481" type="0"/>
+ <Second value="2185126" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2240282" type="0"/>
+ <Second value="197393" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3069773" type="0"/>
+ <Second value="14513" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3899265" type="0"/>
+ <Second value="-168367" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4996543" type="0"/>
+ <Second value="1438364" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6400801" type="0"/>
+ <Second value="1399177" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="3"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="SubViewSize" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="3387" positionY="4229" sizeX="17682" sizeY="9528" type="com.sun.star.drawing.CustomShape" name="Freeform 16" fontHeight="24.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="17683.000000" column2="0.000000" column3="3387.000000"/>
+ <Line2 column1="0.000000" column2="9529.000000" column3="4229.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2732828" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="330926" type="0"/>
+ <Second value="3331542" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="531223" type="0"/>
+ <Second value="3917194" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="862149" type="0"/>
+ <Second value="3451286" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1193075" type="0"/>
+ <Second value="2985378" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1774372" type="0"/>
+ <Second value="773399" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2690949" type="0"/>
+ <Second value="250885" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3607526" type="0"/>
+ <Second value="-271629" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4944292" type="0"/>
+ <Second value="159444" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6361612" type="0"/>
+ <Second value="316200" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="3"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="SubViewSize" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="3598" positionY="5715" sizeX="4929" sizeY="1273" type="com.sun.star.drawing.CustomShape" name="Rounded Rectangular Callout 19" fontHeight="20.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="msTransGradient 1">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="cccccc" angle="0" border="0" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="fff88d" endColor="ffd560" angle="0" border="0" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="4930.000000" column2="0.000000" column3="3598.000000"/>
+ <Line2 column1="0.000000" column2="1274.000000" column3="5715.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="-19361" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="567694" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="16667" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="43" type="1"/>
+ <Second value="44" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21" type="1"/>
+ <Second value="29" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="36" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="45" type="1"/>
+ <Second value="46" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="42" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="23" type="1"/>
+ <Second value="31" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="42" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="42" type="1"/>
+ <Second value="37" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="47" type="1"/>
+ <Second value="48" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="41" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="25" type="1"/>
+ <Second value="33" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="41" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="41" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="49" type="1"/>
+ <Second value="50" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19" type="1"/>
+ <Second value="27" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="4"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="4"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="4"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-wedgeRoundRectCallout" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10689" positionY="6125" sizeX="4131" sizeY="1273" type="com.sun.star.drawing.CustomShape" name="Rounded Rectangular Callout 20" fontHeight="20.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="msTransGradient 2">
+ <FillTransparenceGradient style="LINEAR" startColor="cccccc" endColor="000000" angle="0" border="0" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="fff88d" endColor="fff88d" angle="0" border="0" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="4132.000000" column2="0.000000" column3="10689.000000"/>
+ <Line2 column1="0.000000" column2="1274.000000" column3="6125.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="-21713" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="-165440" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="16667" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="43" type="1"/>
+ <Second value="44" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21" type="1"/>
+ <Second value="29" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="36" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="45" type="1"/>
+ <Second value="46" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="42" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="23" type="1"/>
+ <Second value="31" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="42" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="42" type="1"/>
+ <Second value="37" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="47" type="1"/>
+ <Second value="48" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="41" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="25" type="1"/>
+ <Second value="33" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="41" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="41" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="49" type="1"/>
+ <Second value="50" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19" type="1"/>
+ <Second value="27" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="4"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="4"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="4"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-wedgeRoundRectCallout" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="15910" positionY="6125" sizeX="4978" sizeY="2671" type="com.sun.star.drawing.CustomShape" name="Rounded Rectangular Callout 21" fontHeight="20.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="msTransGradient 3">
+ <FillTransparenceGradient style="LINEAR" startColor="cccccc" endColor="000000" angle="0" border="0" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="fff88d" endColor="fff88d" angle="0" border="0" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="4979.000000" column2="0.000000" column3="15910.000000"/>
+ <Line2 column1="0.000000" column2="2672.000000" column3="6125.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="-22292" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="-100356" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="16667" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="43" type="1"/>
+ <Second value="44" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21" type="1"/>
+ <Second value="29" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="36" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="45" type="1"/>
+ <Second value="46" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="42" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="23" type="1"/>
+ <Second value="31" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="42" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="42" type="1"/>
+ <Second value="37" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="47" type="1"/>
+ <Second value="48" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="41" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="25" type="1"/>
+ <Second value="33" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="41" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="41" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="49" type="1"/>
+ <Second value="50" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19" type="1"/>
+ <Second value="27" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="4"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="4"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="4"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-wedgeRoundRectCallout" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/n819614_0.xml b/sd/qa/unit/data/xml/n819614_0.xml
new file mode 100644
index 000000000..8048bbf3d
--- /dev/null
+++ b/sd/qa/unit/data/xml/n819614_0.xml
@@ -0,0 +1,6613 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="1270" positionY="763" sizeX="21166" sizeY="1564" type="com.sun.star.presentation.TitleTextShape" name="Title 1" text="Test" fontHeight="44.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="AUTOFIT" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="254" textRightDistance="254" textUpperDistance="127" textLowerDistance="127" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="3181" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="000000" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="21167.000000" column2="0.000000" column3="1270.000000"/>
+ <Line2 column1="0.000000" column2="1565.000000" column3="763.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+ <XShape positionX="0" positionY="2328" sizeX="25399" sizeY="16509" type="com.sun.star.drawing.GroupShape" name="Content Placeholder 4">
+ <XShapes>
+ <XShape positionX="0" positionY="2328" sizeX="25399" sizeY="16509" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="25400.000000" column2="0.000000" column3="0.000000"/>
+ <Line2 column1="0.000000" column2="16510.000000" column3="2328.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10751" positionY="3496" sizeX="1563" sizeY="253" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1564.000000" column2="0.000000" column3="10751.000000"/>
+ <Line2 column1="0.000000" column2="254.000000" column3="3496.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="563107" type="0"/>
+ <Second value="45720" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="563107" type="0"/>
+ <Second value="121221" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="121221" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="563107" height="91440"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="22386" positionY="5702" sizeX="363" sizeY="2071" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="364.000000" column2="0.000000" column3="22386.000000"/>
+ <Line2 column1="0.000000" column2="2072.000000" column3="5702.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="745970" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="131086" type="0"/>
+ <Second value="745970" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="131086" height="745970"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="22386" positionY="5702" sizeX="363" sizeY="810" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="364.000000" column2="0.000000" column3="22386.000000"/>
+ <Line2 column1="0.000000" column2="811.000000" column3="5702.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="291846" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="131086" type="0"/>
+ <Second value="291846" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="131086" height="291846"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12315" positionY="3623" sizeX="11167" sizeY="833" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="11168.000000" column2="0.000000" column3="12315.000000"/>
+ <Line2 column1="0.000000" column2="834.000000" column3="3623.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="273703" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4020393" type="0"/>
+ <Second value="273703" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4020393" type="0"/>
+ <Second value="300220" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="4020393" height="300220"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18514" positionY="5771" sizeX="457" sizeY="4508" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="458.000000" column2="0.000000" column3="18514.000000"/>
+ <Line2 column1="0.000000" column2="4509.000000" column3="5771.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1623395" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="165038" type="0"/>
+ <Second value="1623395" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="165038" height="1623395"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18514" positionY="5771" sizeX="457" sizeY="3164" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="458.000000" column2="0.000000" column3="18514.000000"/>
+ <Line2 column1="0.000000" column2="3165.000000" column3="5771.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1139459" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="165040" type="0"/>
+ <Second value="1139459" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="165040" height="1139459"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18514" positionY="5771" sizeX="362" sizeY="7482" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="363.000000" column2="0.000000" column3="18514.000000"/>
+ <Line2 column1="0.000000" column2="7483.000000" column3="5771.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2693873" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="130616" type="0"/>
+ <Second value="2693873" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="130616" height="2693873"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18514" positionY="5771" sizeX="457" sizeY="5902" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="458.000000" column2="0.000000" column3="18514.000000"/>
+ <Line2 column1="0.000000" column2="5903.000000" column3="5771.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2125235" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="165038" type="0"/>
+ <Second value="2125235" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="165038" height="2125235"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="19023" positionY="7078" sizeX="253" sizeY="629" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="254.000000" column2="0.000000" column3="19023.000000"/>
+ <Line2 column1="0.000000" column2="630.000000" column3="7078.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="45720" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="45720" type="0"/>
+ <Second value="226704" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="100129" type="0"/>
+ <Second value="226704" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="91440" height="226704"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18514" positionY="5771" sizeX="361" sizeY="740" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="362.000000" column2="0.000000" column3="18514.000000"/>
+ <Line2 column1="0.000000" column2="741.000000" column3="5771.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="266850" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="130264" type="0"/>
+ <Second value="266850" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="130264" height="266850"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12315" positionY="3623" sizeX="7295" sizeY="902" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="7296.000000" column2="0.000000" column3="12315.000000"/>
+ <Line2 column1="0.000000" column2="903.000000" column3="3623.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="298548" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2626458" type="0"/>
+ <Second value="298548" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2626458" type="0"/>
+ <Second value="325065" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="2626458" height="325065"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="15231" positionY="5771" sizeX="411" sizeY="3271" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="412.000000" column2="0.000000" column3="15231.000000"/>
+ <Line2 column1="0.000000" column2="3272.000000" column3="5771.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1177815" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="148175" type="0"/>
+ <Second value="1177815" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="148175" height="1177815"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="15231" positionY="5771" sizeX="411" sizeY="1991" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="412.000000" column2="0.000000" column3="15231.000000"/>
+ <Line2 column1="0.000000" column2="1992.000000" column3="5771.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="717254" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="148175" type="0"/>
+ <Second value="717254" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="148175" height="717254"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="15231" positionY="5771" sizeX="411" sizeY="712" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="412.000000" column2="0.000000" column3="15231.000000"/>
+ <Line2 column1="0.000000" column2="713.000000" column3="5771.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="256693" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="148175" type="0"/>
+ <Second value="256693" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="148175" height="256693"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12315" positionY="3623" sizeX="4012" sizeY="902" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="4013.000000" column2="0.000000" column3="12315.000000"/>
+ <Line2 column1="0.000000" column2="903.000000" column3="3623.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="298548" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1444590" type="0"/>
+ <Second value="298548" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1444590" type="0"/>
+ <Second value="325065" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="1444590" height="325065"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12289" positionY="13817" sizeX="337" sizeY="1988" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="338.000000" column2="0.000000" column3="12289.000000"/>
+ <Line2 column1="0.000000" column2="1989.000000" column3="13817.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="715909" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="121763" type="0"/>
+ <Second value="715909" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="121763" height="715909"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12289" positionY="13817" sizeX="337" sizeY="736" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="338.000000" column2="0.000000" column3="12289.000000"/>
+ <Line2 column1="0.000000" column2="737.000000" column3="13817.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="265474" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="121763" type="0"/>
+ <Second value="265474" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="121763" height="265474"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11527" positionY="5771" sizeX="463" sizeY="7376" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="464.000000" column2="0.000000" column3="11527.000000"/>
+ <Line2 column1="0.000000" column2="7377.000000" column3="5771.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2655568" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="167040" type="0"/>
+ <Second value="2655568" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="167040" height="2655568"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11527" positionY="5771" sizeX="463" sizeY="5850" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="464.000000" column2="0.000000" column3="11527.000000"/>
+ <Line2 column1="0.000000" column2="5851.000000" column3="5771.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2106248" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="166927" type="0"/>
+ <Second value="2106248" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="166927" height="2106248"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11527" positionY="5771" sizeX="458" sizeY="12372" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="459.000000" column2="0.000000" column3="11527.000000"/>
+ <Line2 column1="0.000000" column2="12373.000000" column3="5771.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4454427" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="165333" type="0"/>
+ <Second value="4454427" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="165333" height="4454427"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11527" positionY="5771" sizeX="462" sizeY="11249" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="463.000000" column2="0.000000" column3="11527.000000"/>
+ <Line2 column1="0.000000" column2="11250.000000" column3="5771.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4050135" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="166687" type="0"/>
+ <Second value="4050135" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="166687" height="4050135"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12091" positionY="7232" sizeX="397" sizeY="3176" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="398.000000" column2="0.000000" column3="12091.000000"/>
+ <Line2 column1="0.000000" column2="3177.000000" column3="7232.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1143610" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="143281" type="0"/>
+ <Second value="1143610" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="143281" height="1143610"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12091" positionY="7232" sizeX="397" sizeY="1948" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="398.000000" column2="0.000000" column3="12091.000000"/>
+ <Line2 column1="0.000000" column2="1949.000000" column3="7232.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="701811" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="143281" type="0"/>
+ <Second value="701811" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="143281" height="701811"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12091" positionY="7232" sizeX="389" sizeY="727" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="390.000000" column2="0.000000" column3="12091.000000"/>
+ <Line2 column1="0.000000" column2="728.000000" column3="7232.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="262128" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="140344" type="0"/>
+ <Second value="262128" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="140344" height="262128"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11527" positionY="5771" sizeX="289" sizeY="776" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="290.000000" column2="0.000000" column3="11527.000000"/>
+ <Line2 column1="0.000000" column2="777.000000" column3="5771.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="279885" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="104258" type="0"/>
+ <Second value="279885" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="104258" height="279885"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12315" positionY="3623" sizeX="309" sizeY="902" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="310.000000" column2="0.000000" column3="12315.000000"/>
+ <Line2 column1="0.000000" column2="903.000000" column3="3623.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="298548" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="111428" type="0"/>
+ <Second value="298548" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="111428" type="0"/>
+ <Second value="325065" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="111428" height="325065"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8247" positionY="5774" sizeX="438" sizeY="7084" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="439.000000" column2="0.000000" column3="8247.000000"/>
+ <Line2 column1="0.000000" column2="7085.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2550748" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="157913" type="0"/>
+ <Second value="2550748" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="157913" height="2550748"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8247" positionY="5774" sizeX="411" sizeY="5829" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="412.000000" column2="0.000000" column3="8247.000000"/>
+ <Line2 column1="0.000000" column2="5830.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2098937" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="148175" type="0"/>
+ <Second value="2098937" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="148175" height="2098937"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8247" positionY="5774" sizeX="411" sizeY="4550" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="412.000000" column2="0.000000" column3="8247.000000"/>
+ <Line2 column1="0.000000" column2="4551.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1638376" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="148175" type="0"/>
+ <Second value="1638376" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="148175" height="1638376"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8247" positionY="5774" sizeX="411" sizeY="3271" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="412.000000" column2="0.000000" column3="8247.000000"/>
+ <Line2 column1="0.000000" column2="3272.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1177815" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="148175" type="0"/>
+ <Second value="1177815" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="148175" height="1177815"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8247" positionY="5774" sizeX="411" sizeY="1991" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="412.000000" column2="0.000000" column3="8247.000000"/>
+ <Line2 column1="0.000000" column2="1992.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="717254" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="148175" type="0"/>
+ <Second value="717254" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="148175" height="717254"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8247" positionY="5774" sizeX="411" sizeY="712" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="412.000000" column2="0.000000" column3="8247.000000"/>
+ <Line2 column1="0.000000" column2="713.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="256693" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="148175" type="0"/>
+ <Second value="256693" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="148175" height="256693"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="9345" positionY="3623" sizeX="2970" sizeY="905" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2971.000000" column2="0.000000" column3="9345.000000"/>
+ <Line2 column1="0.000000" column2="906.000000" column3="3623.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1069491" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1069491" type="0"/>
+ <Second value="299631" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="299631" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="326148" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="1069491" height="326148"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4594" positionY="5774" sizeX="351" sizeY="11223" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="352.000000" column2="0.000000" column3="4594.000000"/>
+ <Line2 column1="0.000000" column2="11224.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4040595" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="126691" type="0"/>
+ <Second value="4040595" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="126691" height="4040595"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4594" positionY="5774" sizeX="351" sizeY="9915" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="352.000000" column2="0.000000" column3="4594.000000"/>
+ <Line2 column1="0.000000" column2="9916.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="3569738" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="126691" type="0"/>
+ <Second value="3569738" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="126691" height="3569738"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4594" positionY="5774" sizeX="351" sizeY="8607" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="352.000000" column2="0.000000" column3="4594.000000"/>
+ <Line2 column1="0.000000" column2="8608.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="3098881" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="126689" type="0"/>
+ <Second value="3098881" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="126689" height="3098881"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="5093" positionY="12333" sizeX="253" sizeY="780" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="254.000000" column2="0.000000" column3="5093.000000"/>
+ <Line2 column1="0.000000" column2="781.000000" column3="12333.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="45720" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="45720" type="0"/>
+ <Second value="281292" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="103887" type="0"/>
+ <Second value="281292" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="91440" height="281292"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4594" positionY="5774" sizeX="351" sizeY="5991" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="352.000000" column2="0.000000" column3="4594.000000"/>
+ <Line2 column1="0.000000" column2="5992.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2157166" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="126691" type="0"/>
+ <Second value="2157166" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="126691" height="2157166"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4594" positionY="5774" sizeX="351" sizeY="4683" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="352.000000" column2="0.000000" column3="4594.000000"/>
+ <Line2 column1="0.000000" column2="4684.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1686309" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="126689" type="0"/>
+ <Second value="1686309" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="126689" height="1686309"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4594" positionY="5774" sizeX="351" sizeY="3375" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="352.000000" column2="0.000000" column3="4594.000000"/>
+ <Line2 column1="0.000000" column2="3376.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1215450" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="126691" type="0"/>
+ <Second value="1215450" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="126691" height="1215450"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4594" positionY="5774" sizeX="351" sizeY="2067" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="352.000000" column2="0.000000" column3="4594.000000"/>
+ <Line2 column1="0.000000" column2="2068.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="744593" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="126691" type="0"/>
+ <Second value="744593" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="126691" height="744593"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4594" positionY="5774" sizeX="290" sizeY="12489" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="291.000000" column2="0.000000" column3="4594.000000"/>
+ <Line2 column1="0.000000" column2="12490.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4496230" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="104725" type="0"/>
+ <Second value="4496230" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="104725" height="4496230"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4594" positionY="5774" sizeX="411" sizeY="712" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="412.000000" column2="0.000000" column3="4594.000000"/>
+ <Line2 column1="0.000000" column2="713.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="256693" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="148175" type="0"/>
+ <Second value="256693" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="148175" height="256693"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="5691" positionY="3623" sizeX="6623" sizeY="905" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="6624.000000" column2="0.000000" column3="5691.000000"/>
+ <Line2 column1="0.000000" column2="906.000000" column3="3623.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2384666" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2384666" type="0"/>
+ <Second value="299633" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="299633" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="326150" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="2384666" height="326150"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="456" positionY="5774" sizeX="273" sizeY="10862" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="274.000000" column2="0.000000" column3="456.000000"/>
+ <Line2 column1="0.000000" column2="10863.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="3910684" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="98745" type="0"/>
+ <Second value="3910684" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="98745" height="3910684"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="1067" positionY="13615" sizeX="301" sizeY="1816" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="302.000000" column2="0.000000" column3="1067.000000"/>
+ <Line2 column1="0.000000" column2="1817.000000" column3="13615.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="654273" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="108799" type="0"/>
+ <Second value="654273" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="108799" height="654273"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="1067" positionY="13615" sizeX="362" sizeY="656" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="363.000000" column2="0.000000" column3="1067.000000"/>
+ <Line2 column1="0.000000" column2="657.000000" column3="13615.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="236424" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="130697" type="0"/>
+ <Second value="236424" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="130697" height="236424"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="456" positionY="5774" sizeX="335" sizeY="7274" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="336.000000" column2="0.000000" column3="456.000000"/>
+ <Line2 column1="0.000000" column2="7275.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2618886" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="121032" type="0"/>
+ <Second value="2618886" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="121032" height="2618886"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="456" positionY="5774" sizeX="283" sizeY="6011" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="284.000000" column2="0.000000" column3="456.000000"/>
+ <Line2 column1="0.000000" column2="6012.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2164416" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="102407" type="0"/>
+ <Second value="2164416" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="102407" height="2164416"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="456" positionY="5774" sizeX="334" sizeY="4730" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="335.000000" column2="0.000000" column3="456.000000"/>
+ <Line2 column1="0.000000" column2="4731.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1703047" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="120545" type="0"/>
+ <Second value="1703047" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="120545" height="1703047"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="456" positionY="5774" sizeX="335" sizeY="3474" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="336.000000" column2="0.000000" column3="456.000000"/>
+ <Line2 column1="0.000000" column2="3475.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1250852" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="121032" type="0"/>
+ <Second value="1250852" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="121032" height="1250852"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="456" positionY="5774" sizeX="335" sizeY="2048" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="336.000000" column2="0.000000" column3="456.000000"/>
+ <Line2 column1="0.000000" column2="2049.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="737655" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="121032" type="0"/>
+ <Second value="737655" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="121032" height="737655"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="456" positionY="5774" sizeX="336" sizeY="12186" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="337.000000" column2="0.000000" column3="456.000000"/>
+ <Line2 column1="0.000000" column2="12187.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4387295" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="121476" type="0"/>
+ <Second value="4387295" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="121476" height="4387295"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="456" positionY="5774" sizeX="335" sizeY="709" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="336.000000" column2="0.000000" column3="456.000000"/>
+ <Line2 column1="0.000000" column2="710.000000" column3="5774.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="255779" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="121032" type="0"/>
+ <Second value="255779" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="121032" height="255779"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="1554" positionY="3623" sizeX="10761" sizeY="905" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="10762.000000" column2="0.000000" column3="1554.000000"/>
+ <Line2 column1="0.000000" column2="906.000000" column3="3623.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3874249" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3874249" type="0"/>
+ <Second value="299633" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="299633" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="326150" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="3874249" height="326150"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11049" positionY="2544" sizeX="2531" sizeY="1078" type="com.sun.star.drawing.CustomShape" text="Test1&#10;" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2532.000000" column2="0.000000" column3="11049.000000"/>
+ <Line2 column1="0.000000" column2="1079.000000" column3="2544.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="182" positionY="4529" sizeX="2743" sizeY="1244" type="com.sun.star.drawing.CustomShape" text="A " fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="182.000000"/>
+ <Line2 column1="0.000000" column2="1245.000000" column3="4529.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="792" positionY="5919" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="A1" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="792.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="5919.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="794" positionY="17350" sizeX="2761" sizeY="1222" type="com.sun.star.drawing.CustomShape" text="A2" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="ddd9c3" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2762.000000" column2="0.000000" column3="794.000000"/>
+ <Line2 column1="0.000000" column2="1223.000000" column3="17350.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="792" positionY="7189" sizeX="2728" sizeY="1268" type="com.sun.star.drawing.CustomShape" text="A3" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2729.000000" column2="0.000000" column3="792.000000"/>
+ <Line2 column1="0.000000" column2="1269.000000" column3="7189.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="792" positionY="8671" sizeX="2653" sizeY="1156" type="com.sun.star.drawing.CustomShape" text="A4" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2654.000000" column2="0.000000" column3="792.000000"/>
+ <Line2 column1="0.000000" column2="1157.000000" column3="8671.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="791" positionY="9939" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="A5" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="791.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="9939.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="741" positionY="11210" sizeX="2850" sizeY="1151" type="com.sun.star.drawing.CustomShape" text="A6" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2851.000000" column2="0.000000" column3="741.000000"/>
+ <Line2 column1="0.000000" column2="1152.000000" column3="11210.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="792" positionY="12483" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="A7" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="792.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="12483.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="1430" positionY="13753" sizeX="2683" sizeY="1036" type="com.sun.star.drawing.CustomShape" text="A7i" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2684.000000" column2="0.000000" column3="1430.000000"/>
+ <Line2 column1="0.000000" column2="1037.000000" column3="13753.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="1369" positionY="14901" sizeX="2694" sizeY="1062" type="com.sun.star.drawing.CustomShape" text="A7ii" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2695.000000" column2="0.000000" column3="1369.000000"/>
+ <Line2 column1="0.000000" column2="1063.000000" column3="14901.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="730" positionY="16071" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="A8" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="730.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="16071.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4319" positionY="4529" sizeX="2743" sizeY="1244" type="com.sun.star.drawing.CustomShape" text="B" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="4319.000000"/>
+ <Line2 column1="0.000000" column2="1245.000000" column3="4529.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="5005" positionY="5921" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="B1" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="5005.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="5921.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4885" positionY="17689" sizeX="2922" sizeY="1148" type="com.sun.star.drawing.CustomShape" text="B2" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2923.000000" column2="0.000000" column3="4885.000000"/>
+ <Line2 column1="0.000000" column2="1149.000000" column3="17689.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4946" positionY="7277" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="B3" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="4946.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="7277.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4946" positionY="8585" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="B4" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="4946.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="8585.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4946" positionY="9893" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="B5" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="4946.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="9893.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4946" positionY="11200" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="B6" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="4946.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="11200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="5382" positionY="12508" sizeX="2663" sizeY="1210" type="com.sun.star.drawing.CustomShape" text="B6i" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2664.000000" column2="0.000000" column3="5382.000000"/>
+ <Line2 column1="0.000000" column2="1211.000000" column3="12508.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4946" positionY="13816" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="B7" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="4946.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="13816.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4946" positionY="15124" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="B8" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="4946.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="15124.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="4946" positionY="16432" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="B9" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="4946.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="16432.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="7973" positionY="4529" sizeX="2743" sizeY="1244" type="com.sun.star.drawing.CustomShape" text="C" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="7973.000000"/>
+ <Line2 column1="0.000000" column2="1245.000000" column3="4529.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8659" positionY="5921" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="C1" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="8659.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="5921.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8659" positionY="7201" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="C2" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="8659.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="7201.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8659" positionY="8480" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="C3" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="8659.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="8480.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8659" positionY="9759" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="C4" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="8659.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="9759.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8659" positionY="11039" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="C5" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="8659.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="11039.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8686" positionY="12309" sizeX="2663" sizeY="1100" type="com.sun.star.drawing.CustomShape" text="C6" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2664.000000" column2="0.000000" column3="8686.000000"/>
+ <Line2 column1="0.000000" column2="1101.000000" column3="12309.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11253" positionY="4526" sizeX="2743" sizeY="1244" type="com.sun.star.drawing.CustomShape" text="D" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="11253.000000"/>
+ <Line2 column1="0.000000" column2="1245.000000" column3="4526.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11817" positionY="5866" sizeX="2743" sizeY="1365" type="com.sun.star.drawing.CustomShape" text="D1" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="11817.000000"/>
+ <Line2 column1="0.000000" column2="1366.000000" column3="5866.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12481" positionY="7416" sizeX="2477" sizeY="1087" type="com.sun.star.drawing.CustomShape" text="D1i" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2478.000000" column2="0.000000" column3="12481.000000"/>
+ <Line2 column1="0.000000" column2="1088.000000" column3="7416.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12489" positionY="8677" sizeX="2466" sizeY="1007" type="com.sun.star.drawing.CustomShape" text="D1ii" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2467.000000" column2="0.000000" column3="12489.000000"/>
+ <Line2 column1="0.000000" column2="1008.000000" column3="8677.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12489" positionY="9946" sizeX="2398" sizeY="924" type="com.sun.star.drawing.CustomShape" text="D1iii" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="ddd9c3" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2399.000000" column2="0.000000" column3="12489.000000"/>
+ <Line2 column1="0.000000" column2="925.000000" column3="9946.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11990" positionY="16505" sizeX="2743" sizeY="1033" type="com.sun.star.drawing.CustomShape" text="D2" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="11990.000000"/>
+ <Line2 column1="0.000000" column2="1034.000000" column3="16505.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11987" positionY="17689" sizeX="2688" sizeY="911" type="com.sun.star.drawing.CustomShape" text="D3" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="ddd9c3" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2689.000000" column2="0.000000" column3="11987.000000"/>
+ <Line2 column1="0.000000" column2="912.000000" column3="17689.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11991" positionY="10999" sizeX="2743" sizeY="1244" type="com.sun.star.drawing.CustomShape" text="D4" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="11991.000000"/>
+ <Line2 column1="0.000000" column2="1245.000000" column3="10999.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11991" positionY="12479" sizeX="2973" sizeY="1337" type="com.sun.star.drawing.CustomShape" text="D5" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2974.000000" column2="0.000000" column3="11991.000000"/>
+ <Line2 column1="0.000000" column2="1338.000000" column3="12479.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12627" positionY="13962" sizeX="2444" sizeY="1183" type="com.sun.star.drawing.CustomShape" text="D5i" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2445.000000" column2="0.000000" column3="12627.000000"/>
+ <Line2 column1="0.000000" column2="1184.000000" column3="13962.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12627" positionY="15233" sizeX="2444" sizeY="1143" type="com.sun.star.drawing.CustomShape" text="D5ii" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2445.000000" column2="0.000000" column3="12627.000000"/>
+ <Line2 column1="0.000000" column2="1144.000000" column3="15233.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="14956" positionY="4526" sizeX="2743" sizeY="1244" type="com.sun.star.drawing.CustomShape" text="E" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="14956.000000"/>
+ <Line2 column1="0.000000" column2="1245.000000" column3="4526.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="15642" positionY="5918" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="E1" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="15642.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="5918.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="15642" positionY="7198" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="E2" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="15642.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="7198.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="15642" positionY="8477" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="E3" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="15642.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="8477.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18239" positionY="4526" sizeX="2743" sizeY="1244" type="com.sun.star.drawing.CustomShape" text="F" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="18239.000000"/>
+ <Line2 column1="0.000000" column2="1245.000000" column3="4526.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18875" positionY="5947" sizeX="2740" sizeY="1130" type="com.sun.star.drawing.CustomShape" text="F1" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2741.000000" column2="0.000000" column3="18875.000000"/>
+ <Line2 column1="0.000000" column2="1131.000000" column3="5947.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="19301" positionY="7223" sizeX="2636" sizeY="968" type="com.sun.star.drawing.CustomShape" text="F1i" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2637.000000" column2="0.000000" column3="19301.000000"/>
+ <Line2 column1="0.000000" column2="969.000000" column3="7223.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18972" positionY="11059" sizeX="2629" sizeY="1230" type="com.sun.star.drawing.CustomShape" text="F2" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2630.000000" column2="0.000000" column3="18972.000000"/>
+ <Line2 column1="0.000000" column2="1231.000000" column3="11059.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18876" positionY="12543" sizeX="2813" sizeY="1421" type="com.sun.star.drawing.CustomShape" text="F3" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="ddd9c3" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2814.000000" column2="0.000000" column3="18876.000000"/>
+ <Line2 column1="0.000000" column2="1422.000000" column3="12543.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18972" positionY="8371" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="F4" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="18972.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="8371.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18972" positionY="9715" sizeX="2743" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="F5" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="18972.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="9715.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="22111" positionY="4457" sizeX="2743" sizeY="1244" type="com.sun.star.drawing.CustomShape" text="G" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2744.000000" column2="0.000000" column3="22111.000000"/>
+ <Line2 column1="0.000000" column2="1245.000000" column3="4457.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="22750" positionY="5947" sizeX="2557" sizeY="1131" type="com.sun.star.drawing.CustomShape" text="G1" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2558.000000" column2="0.000000" column3="22750.000000"/>
+ <Line2 column1="0.000000" column2="1132.000000" column3="5947.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="22750" positionY="7224" sizeX="2421" sizeY="1100" type="com.sun.star.drawing.CustomShape" text="G2" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffffff" endColor="ffffff" angle="1800" border="35" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2422.000000" column2="0.000000" column3="22750.000000"/>
+ <Line2 column1="0.000000" column2="1101.000000" column3="7224.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8389" positionY="3341" sizeX="2361" sizeY="982" type="com.sun.star.drawing.CustomShape" fontHeight="7.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="12" textRightDistance="12" textUpperDistance="12" textLowerDistance="12" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2362.000000" column2="0.000000" column3="8389.000000"/>
+ <Line2 column1="0.000000" column2="983.000000" column3="3341.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ </XShapes>
+ <Transformation>
+ <Line1 column1="25400.000000" column2="0.000000" column3="0.000000"/>
+ <Line2 column1="0.000000" column2="16510.000000" column3="2328.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/n820786_0.xml b/sd/qa/unit/data/xml/n820786_0.xml
new file mode 100644
index 000000000..1dedb61fa
--- /dev/null
+++ b/sd/qa/unit/data/xml/n820786_0.xml
@@ -0,0 +1,3216 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="23154" positionY="6036" sizeX="1370" sizeY="3655" type="com.sun.star.drawing.CustomShape" name="Rectangle 20" fontHeight="24.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffcc" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="ff0000" distance="50" angle="900"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="0.000000" column2="-3656.000000" column3="23154.000000"/>
+ <Line2 column1="1371.000000" column2="0.000000" column3="6036.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="20904" positionY="11701" sizeX="846" sizeY="1057" type="com.sun.star.drawing.GroupShape" name="Group 43">
+ <XShapes>
+ <XShape positionX="21750" positionY="12758" sizeX="846" sizeY="1057" type="com.sun.star.drawing.CustomShape" name="Oval 44" fontHeight="24.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="175" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="-847.000000" column2="-0.000000" column3="21750.000000"/>
+ <Line2 column1="0.000000" column2="-1058.000000" column3="12758.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="13" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="15" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-ellipse" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="21750" positionY="12758" sizeX="211" sizeY="1057" type="com.sun.star.drawing.CustomShape" name="Oval 45" fontHeight="24.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="175" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="-212.000000" column2="-0.000000" column3="21750.000000"/>
+ <Line2 column1="0.000000" column2="-1058.000000" column3="12758.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="13" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="15" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-ellipse" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ </XShapes>
+ <Transformation>
+ <Line1 column1="847.000000" column2="0.000000" column3="20904.000000"/>
+ <Line2 column1="0.000000" column2="1058.000000" column3="11701.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+ <XShape positionX="6985" positionY="2309" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 1" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="250" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="6985.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="2309.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8890" positionY="2309" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 6" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="200" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="8890.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="2309.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10795" positionY="2309" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 7" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="150" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="10795.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="2309.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12700" positionY="2309" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 8" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="200" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="12700.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="2309.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="14510" positionY="2309" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 12" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="175" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="14510.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="2309.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="16415" positionY="2309" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 13" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="150" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="16415.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="2309.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="6985" positionY="4145" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 16" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="125" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="6985.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="4145.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8890" positionY="4145" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 17" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="TRIPLE" color="000000" distance="150" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="8890.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="4145.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10795" positionY="4145" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 18" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="TRIPLE" color="000000" distance="125" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="10795.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="4145.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12700" positionY="4145" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 19" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="TRIPLE" color="000000" distance="100" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="12700.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="4145.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="14510" positionY="4145" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 20" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="TRIPLE" color="000000" distance="75" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="14510.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="4145.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="16415" positionY="4145" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 21" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="TRIPLE" color="000000" distance="50" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="16415.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="4145.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="6985" positionY="5981" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 24" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="50" angle="1350"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="6985.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="5981.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8890" positionY="5981" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 25" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="50" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="8890.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="5981.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10795" positionY="5981" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 26" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="50" angle="1350"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="10795.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="5981.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12700" positionY="5981" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 27" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="50" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="12700.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="5981.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="14510" positionY="5981" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 28" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="100" angle="1350"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="14510.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="5981.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="16415" positionY="5981" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 29" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="100" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="16415.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="5981.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="6985" positionY="7816" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 32" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="50" angle="900"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="6985.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="7816.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8890" positionY="7816" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 33" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="50" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="8890.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="7816.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10795" positionY="7816" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 34" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="50" angle="900"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="10795.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="7816.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12700" positionY="7816" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 35" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="50" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="12700.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="7816.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="14510" positionY="7816" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 36" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="25" angle="900"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="14510.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="7816.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="16415" positionY="7816" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 37" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="25" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="16415.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="7816.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="6985" positionY="9652" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 40" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="150" angle="1350"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="6985.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="9652.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8890" positionY="9652" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 41" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="150" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="8890.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="9652.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10795" positionY="9652" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 42" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="150" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="10795.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="9652.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12700" positionY="9652" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 43" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="150" angle="900"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="12700.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="9652.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="14510" positionY="9652" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 44" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="200" angle="600"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="14510.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="9652.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="16415" positionY="9652" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 45" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="100" angle="600"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="16415.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="9652.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="6985" positionY="11488" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 48" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="75" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="6985.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="11488.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8890" positionY="11488" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 49" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="100" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="8890.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="11488.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10795" positionY="11488" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 50" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="300" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="10795.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="11488.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12700" positionY="11488" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 51" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="300" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="12700.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="11488.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="14510" positionY="11488" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 52" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="150" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="14510.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="11488.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="16415" positionY="11488" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 53" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="TRIPLE" color="000000" distance="200" angle="900"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="16415.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="11488.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="6985" positionY="13323" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 56" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="TRIPLE" color="000000" distance="400" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="6985.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="13323.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8890" positionY="13323" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 57" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="400" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="8890.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="13323.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10795" positionY="13323" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 58" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="300" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="10795.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="13323.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12700" positionY="13323" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 59" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="200" angle="1350"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="12700.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="13323.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="14510" positionY="13323" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 60" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="75" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="14510.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="13323.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="16415" positionY="13323" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 61" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="TRIPLE" color="000000" distance="100" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="16415.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="13323.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="6985" positionY="15159" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 64" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="50" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="6985.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="15159.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="8890" positionY="15159" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 65" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="100" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="8890.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="15159.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10795" positionY="15159" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 66" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="50" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="10795.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="15159.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12700" positionY="15159" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 67" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="100" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="12700.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="15159.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="14510" positionY="15159" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 68" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="100" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="14510.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="15159.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="16415" positionY="15159" sizeX="1481" sizeY="1481" type="com.sun.star.drawing.CustomShape" name="Rectangle 69" fontHeight="24.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="ffffff" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="000000" distance="100" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1482.000000" column2="0.000000" column3="16415.000000"/>
+ <Line2 column1="0.000000" column2="1482.000000" column3="15159.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/n902652_0.xml b/sd/qa/unit/data/xml/n902652_0.xml
new file mode 100644
index 000000000..b5fd7740e
--- /dev/null
+++ b/sd/qa/unit/data/xml/n902652_0.xml
@@ -0,0 +1,309 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="899" positionY="9525" sizeX="9000" sizeY="4800" type="com.sun.star.drawing.CustomShape" name="Rounded Rectangle 3" text=" LibreOffice" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="3000" textRightDistance="500" textUpperDistance="300" textLowerDistance="3000" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="9bbb59" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="0.000000" column2="4801.000000" column3="899.000000"/>
+ <Line2 column1="-9001.000000" column2="0.000000" column3="9525.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="16667" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="13" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="15" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="10" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-roundRect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="15800" positionY="7848" sizeX="9000" sizeY="4800" type="com.sun.star.drawing.CustomShape" name="Rounded Rectangle 4" text=" LibreOffice" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="1000" textRightDistance="0" textUpperDistance="3000" textLowerDistance="300" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="9bbb59" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="-9001.000000" column2="-0.000000" column3="15800.000000"/>
+ <Line2 column1="0.000000" column2="-4801.000000" column3="7848.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="16667" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="13" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="15" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="10" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="-90" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-roundRect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="16224" positionY="14365" sizeX="9000" sizeY="4800" type="com.sun.star.drawing.CustomShape" name="Rounded Rectangle 5" text=" LibreOffice" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="0" textRightDistance="1000" textUpperDistance="900" textLowerDistance="3000" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="9bbb59" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="-9001.000000" column2="-0.000000" column3="16224.000000"/>
+ <Line2 column1="0.000000" column2="-4801.000000" column3="14365.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="16667" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="13" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="15" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="10" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="17" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="-270" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-roundRect" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/shapes-test_page0.xml b/sd/qa/unit/data/xml/shapes-test_page0.xml
new file mode 100644
index 000000000..60afef280
--- /dev/null
+++ b/sd/qa/unit/data/xml/shapes-test_page0.xml
@@ -0,0 +1,1666 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="1000" positionY="1200" sizeX="3000" sizeY="2400" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3001.000000" column2="0.000000" column3="1000.000000"/>
+ <Line2 column1="0.000000" column2="2401.000000" column3="1200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="rectangle" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="6200" positionY="1000" sizeX="3600" sizeY="3000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3601.000000" column2="0.000000" column3="6200.000000"/>
+ <Line2 column1="0.000000" column2="3001.000000" column3="1000.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="round-rectangle" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="3600" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11400" positionY="1400" sizeX="2200" sizeY="2200" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2201.000000" column2="0.000000" column3="11400.000000"/>
+ <Line2 column1="0.000000" column2="2201.000000" column3="1400.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="rectangle" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="15200" positionY="1400" sizeX="2400" sizeY="2400" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2401.000000" column2="0.000000" column3="15200.000000"/>
+ <Line2 column1="0.000000" column2="2401.000000" column3="1400.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="round-rectangle" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="3600" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18600" positionY="1200" sizeX="2800" sizeY="2800" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2801.000000" column2="0.000000" column3="18600.000000"/>
+ <Line2 column1="0.000000" column2="2801.000000" column3="1200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ellipse" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="360" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="9" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="22800" positionY="2200" sizeX="3600" sizeY="1200" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3601.000000" column2="0.000000" column3="22800.000000"/>
+ <Line2 column1="0.000000" column2="1201.000000" column3="2200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ellipse" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="360" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="9" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="1400" positionY="4600" sizeX="3200" sizeY="3200" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3201.000000" column2="0.000000" column3="1400.000000"/>
+ <Line2 column1="0.000000" column2="3201.000000" column3="4600.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="Type" value="mso-spt100" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="-90" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="0" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePointType" value="1" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="13" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="5000" positionY="5200" sizeX="4400" sizeY="2000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="4401.000000" column2="0.000000" column3="5000.000000"/>
+ <Line2 column1="0.000000" column2="2001.000000" column3="5200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="isosceles-triangle" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="10800" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10400" positionY="5200" sizeX="1400" sizeY="2000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1401.000000" column2="0.000000" column3="10400.000000"/>
+ <Line2 column1="0.000000" column2="2001.000000" column3="5200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="right-triangle" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="13400" positionY="5000" sizeX="2600" sizeY="2000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2601.000000" column2="0.000000" column3="13400.000000"/>
+ <Line2 column1="0.000000" column2="2001.000000" column3="5000.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="trapezoid" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="5400" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="17400" positionY="5200" sizeX="1400" sizeY="2800" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1401.000000" column2="0.000000" column3="17400.000000"/>
+ <Line2 column1="0.000000" column2="2801.000000" column3="5200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="diamond" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="21000" positionY="5600" sizeX="3200" sizeY="2000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3201.000000" column2="0.000000" column3="21000.000000"/>
+ <Line2 column1="0.000000" column2="2001.000000" column3="5600.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="parallelogram" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="5400" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="1600" positionY="9400" sizeX="2600" sizeY="2400" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2601.000000" column2="0.000000" column3="1600.000000"/>
+ <Line2 column1="0.000000" column2="2401.000000" column3="9400.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="pentagon" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="8260" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4230" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="17370" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="8260" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="5"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="5600" positionY="9400" sizeX="3400" sizeY="2800" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3401.000000" column2="0.000000" column3="5600.000000"/>
+ <Line2 column1="0.000000" column2="2801.000000" column3="9400.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="hexagon" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="5400" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="5"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10600" positionY="9200" sizeX="3000" sizeY="3200" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3001.000000" column2="0.000000" column3="10600.000000"/>
+ <Line2 column1="0.000000" column2="3201.000000" column3="9200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="octagon" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="5000" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="7"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="15800" positionY="9400" sizeX="2600" sizeY="2600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2601.000000" column2="0.000000" column3="15800.000000"/>
+ <Line2 column1="0.000000" column2="2601.000000" column3="9400.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="cross" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="5400" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="12"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="19800" positionY="9400" sizeX="2600" sizeY="2600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2601.000000" column2="0.000000" column3="19800.000000"/>
+ <Line2 column1="0.000000" column2="2601.000000" column3="9400.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ring" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="5400" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="360" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="360" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="9" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="9" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="23800" positionY="9200" sizeX="2400" sizeY="5200" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2401.000000" column2="0.000000" column3="23800.000000"/>
+ <Line2 column1="0.000000" column2="5201.000000" column3="9200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="block-arc" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="180" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="5400" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="11" count="1"/>
+ <EnhancedCustomShapeSegment command="12" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="1600" positionY="14600" sizeX="2200" sizeY="3800" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2201.000000" column2="0.000000" column3="1600.000000"/>
+ <Line2 column1="0.000000" column2="3801.000000" column3="14600.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="88" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="can" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="5400" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="68" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="68" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20" type="0"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="68" type="0"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="68" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="2"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="5800" positionY="14800" sizeX="3000" sizeY="3000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3001.000000" column2="0.000000" column3="5800.000000"/>
+ <Line2 column1="0.000000" column2="3001.000000" column3="14800.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="cube" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="5400" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="5"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10400" positionY="15200" sizeX="2200" sizeY="3600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2201.000000" column2="0.000000" column3="10400.000000"/>
+ <Line2 column1="0.000000" column2="3601.000000" column3="15200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="paper" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="18900" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10" type="1"/>
+ <Second value="11" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="15400" positionY="15200" sizeX="4800" sizeY="3200" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="4801.000000" column2="0.000000" column3="15400.000000"/>
+ <Line2 column1="0.000000" column2="3201.000000" column3="15200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="frame" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="2000" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Extrusion">
+ <Extrusion>
+ <PropertyValue name="Origin" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewPoint" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Skew" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ProjectionMode" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Depth" handle="0" propertyState="DIRECT_VALUE"/>
+ </Extrusion>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="GluePointType" value="1" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/shapes-test_page1.xml b/sd/qa/unit/data/xml/shapes-test_page1.xml
new file mode 100644
index 000000000..b5d97b558
--- /dev/null
+++ b/sd/qa/unit/data/xml/shapes-test_page1.xml
@@ -0,0 +1,2425 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="1800" positionY="1600" sizeX="1800" sizeY="1600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1801.000000" column2="0.000000" column3="1800.000000"/>
+ <Line2 column1="0.000000" column2="1601.000000" column3="1600.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="bang" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11464" type="0"/>
+ <Second value="4340" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9722" type="0"/>
+ <Second value="1887" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8548" type="0"/>
+ <Second value="6383" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4503" type="0"/>
+ <Second value="3626" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5373" type="0"/>
+ <Second value="7816" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1174" type="0"/>
+ <Second value="8270" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3934" type="0"/>
+ <Second value="11592" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="12875" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3329" type="0"/>
+ <Second value="15372" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1283" type="0"/>
+ <Second value="17824" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4804" type="0"/>
+ <Second value="18239" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4918" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7525" type="0"/>
+ <Second value="18125" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8698" type="0"/>
+ <Second value="19712" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9871" type="0"/>
+ <Second value="17371" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11614" type="0"/>
+ <Second value="18844" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12178" type="0"/>
+ <Second value="15937" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14943" type="0"/>
+ <Second value="17371" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14640" type="0"/>
+ <Second value="14348" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18878" type="0"/>
+ <Second value="15632" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16382" type="0"/>
+ <Second value="12311" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18270" type="0"/>
+ <Second value="11292" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16986" type="0"/>
+ <Second value="9404" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="6646" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16382" type="0"/>
+ <Second value="6533" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18005" type="0"/>
+ <Second value="3172" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14524" type="0"/>
+ <Second value="5778" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14789" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11464" type="0"/>
+ <Second value="4340" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="28"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="6000" positionY="800" sizeX="2800" sizeY="3000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2801.000000" column2="0.000000" column3="6000.000000"/>
+ <Line2 column1="0.000000" column2="3001.000000" column3="800.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="star4" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="8100" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="8"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11000" positionY="1000" sizeX="3200" sizeY="3200" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3201.000000" column2="0.000000" column3="11000.000000"/>
+ <Line2 column1="0.000000" column2="3201.000000" column3="1000.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="star5" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10797" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8278" type="0"/>
+ <Second value="8256" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="8256" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6722" type="0"/>
+ <Second value="13405" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4198" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10797" type="0"/>
+ <Second value="16580" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="17401" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14878" type="0"/>
+ <Second value="13405" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="8256" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13321" type="0"/>
+ <Second value="8256" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10797" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="10"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="16200" positionY="1000" sizeX="1400" sizeY="3400" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1401.000000" column2="0.000000" column3="16200.000000"/>
+ <Line2 column1="0.000000" column2="3401.000000" column3="1000.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="780" height="907"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="390" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="492" type="0"/>
+ <Second value="276" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="780" type="0"/>
+ <Second value="228" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="594" type="0"/>
+ <Second value="457" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="780" type="0"/>
+ <Second value="679" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="492" type="0"/>
+ <Second value="631" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="390" type="0"/>
+ <Second value="907" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="288" type="0"/>
+ <Second value="631" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="679" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="186" type="0"/>
+ <Second value="457" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="228" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="288" type="0"/>
+ <Second value="276" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="390" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="12"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="19400" positionY="1200" sizeX="3600" sizeY="3000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3601.000000" column2="0.000000" column3="19400.000000"/>
+ <Line2 column1="0.000000" column2="3001.000000" column3="1200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="star8" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="2500" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="17" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="23" type="1"/>
+ <Second value="24" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="29" type="1"/>
+ <Second value="30" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="36" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="41" type="1"/>
+ <Second value="42" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="47" type="1"/>
+ <Second value="48" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="53" type="1"/>
+ <Second value="54" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="59" type="1"/>
+ <Second value="60" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="65" type="1"/>
+ <Second value="66" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="71" type="1"/>
+ <Second value="72" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="77" type="1"/>
+ <Second value="78" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="83" type="1"/>
+ <Second value="84" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="89" type="1"/>
+ <Second value="90" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="95" type="1"/>
+ <Second value="96" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="16"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="24000" positionY="1400" sizeX="3200" sizeY="3000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3201.000000" column2="0.000000" column3="24000.000000"/>
+ <Line2 column1="0.000000" column2="3001.000000" column3="1400.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="858" height="864"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="426" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="480" type="0"/>
+ <Second value="246" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="642" type="0"/>
+ <Second value="60" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="564" type="0"/>
+ <Second value="294" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="804" type="0"/>
+ <Second value="216" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="618" type="0"/>
+ <Second value="384" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="858" type="0"/>
+ <Second value="432" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="618" type="0"/>
+ <Second value="480" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="804" type="0"/>
+ <Second value="648" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="564" type="0"/>
+ <Second value="570" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="642" type="0"/>
+ <Second value="804" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="480" type="0"/>
+ <Second value="618" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="426" type="0"/>
+ <Second value="864" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="378" type="0"/>
+ <Second value="618" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="216" type="0"/>
+ <Second value="804" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="294" type="0"/>
+ <Second value="570" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="54" type="0"/>
+ <Second value="648" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="240" type="0"/>
+ <Second value="480" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="432" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="240" type="0"/>
+ <Second value="384" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="54" type="0"/>
+ <Second value="216" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="294" type="0"/>
+ <Second value="294" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="216" type="0"/>
+ <Second value="60" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="378" type="0"/>
+ <Second value="246" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="426" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="24"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="800" positionY="4800" sizeX="3400" sizeY="3400" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3401.000000" column2="0.000000" column3="800.000000"/>
+ <Line2 column1="0.000000" column2="3401.000000" column3="4800.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="star24" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="2500" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9" type="1"/>
+ <Second value="10" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="14" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="17" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19" type="1"/>
+ <Second value="20" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21" type="1"/>
+ <Second value="22" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="23" type="1"/>
+ <Second value="24" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="25" type="1"/>
+ <Second value="26" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="27" type="1"/>
+ <Second value="28" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="29" type="1"/>
+ <Second value="30" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="31" type="1"/>
+ <Second value="32" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="33" type="1"/>
+ <Second value="34" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="1"/>
+ <Second value="36" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="37" type="1"/>
+ <Second value="38" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="39" type="1"/>
+ <Second value="40" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="41" type="1"/>
+ <Second value="42" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="43" type="1"/>
+ <Second value="44" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="45" type="1"/>
+ <Second value="46" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="47" type="1"/>
+ <Second value="48" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="49" type="1"/>
+ <Second value="50" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="51" type="1"/>
+ <Second value="52" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="53" type="1"/>
+ <Second value="54" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="55" type="1"/>
+ <Second value="56" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="57" type="1"/>
+ <Second value="58" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="59" type="1"/>
+ <Second value="60" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="61" type="1"/>
+ <Second value="62" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="63" type="1"/>
+ <Second value="64" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="65" type="1"/>
+ <Second value="66" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="67" type="1"/>
+ <Second value="68" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="69" type="1"/>
+ <Second value="70" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="71" type="1"/>
+ <Second value="72" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="73" type="1"/>
+ <Second value="74" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="75" type="1"/>
+ <Second value="76" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="77" type="1"/>
+ <Second value="78" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="79" type="1"/>
+ <Second value="80" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="81" type="1"/>
+ <Second value="82" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="83" type="1"/>
+ <Second value="84" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="85" type="1"/>
+ <Second value="86" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="87" type="1"/>
+ <Second value="88" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="89" type="1"/>
+ <Second value="90" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="91" type="1"/>
+ <Second value="92" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="93" type="1"/>
+ <Second value="94" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="95" type="1"/>
+ <Second value="96" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="97" type="1"/>
+ <Second value="98" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="99" type="1"/>
+ <Second value="100" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="48"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="5800" positionY="5000" sizeX="5000" sizeY="4000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="5001.000000" column2="0.000000" column3="5800.000000"/>
+ <Line2 column1="0.000000" column2="4001.000000" column3="5000.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="153" height="132"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="123" type="0"/>
+ <Second value="39" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="116" type="0"/>
+ <Second value="26" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="113" type="0"/>
+ <Second value="13" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="114" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="103" type="0"/>
+ <Second value="7" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="90" type="0"/>
+ <Second value="11" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="76" type="0"/>
+ <Second value="11" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="62" type="0"/>
+ <Second value="11" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="49" type="0"/>
+ <Second value="7" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="38" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="37" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="37" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="37" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="38" type="0"/>
+ <Second value="13" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="0"/>
+ <Second value="27" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="28" type="0"/>
+ <Second value="39" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="22" type="0"/>
+ <Second value="51" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="0"/>
+ <Second value="60" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="66" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="66" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="66" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="66" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="67" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="67" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="67" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="0"/>
+ <Second value="73" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="22" type="0"/>
+ <Second value="82" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="28" type="0"/>
+ <Second value="93" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="35" type="0"/>
+ <Second value="105" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="38" type="0"/>
+ <Second value="119" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="38" type="0"/>
+ <Second value="131" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="38" type="0"/>
+ <Second value="132" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="38" type="0"/>
+ <Second value="132" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="38" type="0"/>
+ <Second value="132" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="38" type="0"/>
+ <Second value="132" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="38" type="0"/>
+ <Second value="132" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="38" type="0"/>
+ <Second value="132" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="49" type="0"/>
+ <Second value="125" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="62" type="0"/>
+ <Second value="121" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="76" type="0"/>
+ <Second value="121" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="90" type="0"/>
+ <Second value="121" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="103" type="0"/>
+ <Second value="125" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="114" type="0"/>
+ <Second value="132" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="114" type="0"/>
+ <Second value="132" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="114" type="0"/>
+ <Second value="132" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="114" type="0"/>
+ <Second value="132" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="113" type="0"/>
+ <Second value="119" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="116" type="0"/>
+ <Second value="106" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="123" type="0"/>
+ <Second value="93" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="130" type="0"/>
+ <Second value="81" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="141" type="0"/>
+ <Second value="72" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="153" type="0"/>
+ <Second value="66" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="153" type="0"/>
+ <Second value="66" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="153" type="0"/>
+ <Second value="66" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="153" type="0"/>
+ <Second value="66" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="141" type="0"/>
+ <Second value="60" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="130" type="0"/>
+ <Second value="51" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="123" type="0"/>
+ <Second value="39" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="19"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12600" positionY="5600" sizeX="4000" sizeY="4400" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="4001.000000" column2="0.000000" column3="12600.000000"/>
+ <Line2 column1="0.000000" column2="4401.000000" column3="5600.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="vertical-scroll" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="2700" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="StretchX" value="11000" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="11" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="11" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="11" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="11" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9" type="1"/>
+ <Second value="10" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="11" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="11" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="2"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="2"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="3"/>
+ <EnhancedCustomShapeSegment command="14" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18600" positionY="6200" sizeX="5600" sizeY="3600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="5601.000000" column2="0.000000" column3="18600.000000"/>
+ <Line2 column1="0.000000" column2="3601.000000" column3="6200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="horizontal-scroll" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="2700" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="11000" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="13" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="11" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="11" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="11" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="15" count="2"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="15" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="3"/>
+ <EnhancedCustomShapeSegment command="14" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="1200" positionY="11000" sizeX="2400" sizeY="4000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2401.000000" column2="0.000000" column3="1200.000000"/>
+ <Line2 column1="0.000000" column2="4001.000000" column3="11000.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="14810" height="25050"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="NonPrimitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7214" type="0"/>
+ <Second value="23549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6714" type="0"/>
+ <Second value="22049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5942" type="0"/>
+ <Second value="21405" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5839" type="0"/>
+ <Second value="19749" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6214" type="0"/>
+ <Second value="17249" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7714" type="0"/>
+ <Second value="17549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7214" type="0"/>
+ <Second value="14049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7839" type="0"/>
+ <Second value="14049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8589" type="0"/>
+ <Second value="13549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9214" type="0"/>
+ <Second value="13549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9214" type="0"/>
+ <Second value="17549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7714" type="0"/>
+ <Second value="17749" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7714" type="0"/>
+ <Second value="19749" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7714" type="0"/>
+ <Second value="21409" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8214" type="0"/>
+ <Second value="21549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9214" type="0"/>
+ <Second value="23549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8589" type="0"/>
+ <Second value="23549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8214" type="0"/>
+ <Second value="23049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7214" type="0"/>
+ <Second value="23549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12814" type="0"/>
+ <Second value="25049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11314" type="0"/>
+ <Second value="23549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9042" type="0"/>
+ <Second value="21405" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8939" type="0"/>
+ <Second value="19749" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9314" type="0"/>
+ <Second value="17249" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10314" type="0"/>
+ <Second value="17049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9314" type="0"/>
+ <Second value="13549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11189" type="0"/>
+ <Second value="13549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11814" type="0"/>
+ <Second value="17049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10814" type="0"/>
+ <Second value="17749" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10814" type="0"/>
+ <Second value="19749" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10814" type="0"/>
+ <Second value="21409" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12814" type="0"/>
+ <Second value="22249" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14814" type="0"/>
+ <Second value="24549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13314" type="0"/>
+ <Second value="24049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13314" type="0"/>
+ <Second value="24549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12814" type="0"/>
+ <Second value="25049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6789" type="0"/>
+ <Second value="2116" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3812" type="0"/>
+ <Second value="2116" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1539" type="0"/>
+ <Second value="4389" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1539" type="0"/>
+ <Second value="7366" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1539" type="0"/>
+ <Second value="10343" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3812" type="0"/>
+ <Second value="12616" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6789" type="0"/>
+ <Second value="12616" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9766" type="0"/>
+ <Second value="12616" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12039" type="0"/>
+ <Second value="10343" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12039" type="0"/>
+ <Second value="7366" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12039" type="0"/>
+ <Second value="4389" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9766" type="0"/>
+ <Second value="2116" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6789" type="0"/>
+ <Second value="2116" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14339" type="0"/>
+ <Second value="7122" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14363" type="0"/>
+ <Second value="8236" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12802" type="0"/>
+ <Second value="9487" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12339" type="0"/>
+ <Second value="10501" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11876" type="0"/>
+ <Second value="11515" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12522" type="0"/>
+ <Second value="12368" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11665" type="0"/>
+ <Second value="13081" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10808" type="0"/>
+ <Second value="13794" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9466" type="0"/>
+ <Second value="12917" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8415" type="0"/>
+ <Second value="13181" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7304" type="0"/>
+ <Second value="13459" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6459" type="0"/>
+ <Second value="14938" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5338" type="0"/>
+ <Second value="14707" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4277" type="0"/>
+ <Second value="14488" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4096" type="0"/>
+ <Second value="12885" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3234" type="0"/>
+ <Second value="12227" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2324" type="0"/>
+ <Second value="11533" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="641" type="0"/>
+ <Second value="11794" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="123" type="0"/>
+ <Second value="10774" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="-368" type="0"/>
+ <Second value="9807" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="772" type="0"/>
+ <Second value="8666" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="749" type="0"/>
+ <Second value="7582" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="725" type="0"/>
+ <Second value="6438" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="-135" type="0"/>
+ <Second value="5541" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="339" type="0"/>
+ <Second value="4500" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="789" type="0"/>
+ <Second value="3513" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1999" type="0"/>
+ <Second value="3437" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2831" type="0"/>
+ <Second value="2744" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3711" type="0"/>
+ <Second value="2011" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3831" type="0"/>
+ <Second value="313" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4942" type="0"/>
+ <Second value="34" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5993" type="0"/>
+ <Second value="-229" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6852" type="0"/>
+ <Second value="1136" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7913" type="0"/>
+ <Second value="1355" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9034" type="0"/>
+ <Second value="1586" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10437" type="0"/>
+ <Second value="621" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11347" type="0"/>
+ <Second value="1315" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12208" type="0"/>
+ <Second value="1973" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11676" type="0"/>
+ <Second value="3496" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12167" type="0"/>
+ <Second value="4462" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12686" type="0"/>
+ <Second value="5483" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14315" type="0"/>
+ <Second value="6008" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14339" type="0"/>
+ <Second value="7122" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7214" type="0"/>
+ <Second value="23549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6714" type="0"/>
+ <Second value="22049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5942" type="0"/>
+ <Second value="21405" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5839" type="0"/>
+ <Second value="19749" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6214" type="0"/>
+ <Second value="17249" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7714" type="0"/>
+ <Second value="17549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7214" type="0"/>
+ <Second value="14049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7839" type="0"/>
+ <Second value="14049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8589" type="0"/>
+ <Second value="13549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9214" type="0"/>
+ <Second value="13549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9214" type="0"/>
+ <Second value="17549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7714" type="0"/>
+ <Second value="17749" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7714" type="0"/>
+ <Second value="19749" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7714" type="0"/>
+ <Second value="21409" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8214" type="0"/>
+ <Second value="21549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9214" type="0"/>
+ <Second value="23549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8589" type="0"/>
+ <Second value="23549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8214" type="0"/>
+ <Second value="23049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7214" type="0"/>
+ <Second value="23549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12814" type="0"/>
+ <Second value="25049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11314" type="0"/>
+ <Second value="23549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9042" type="0"/>
+ <Second value="21405" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8939" type="0"/>
+ <Second value="19749" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9314" type="0"/>
+ <Second value="17249" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10314" type="0"/>
+ <Second value="17049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9314" type="0"/>
+ <Second value="13549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11189" type="0"/>
+ <Second value="13549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11814" type="0"/>
+ <Second value="17049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10814" type="0"/>
+ <Second value="17749" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10814" type="0"/>
+ <Second value="19749" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10814" type="0"/>
+ <Second value="21409" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12814" type="0"/>
+ <Second value="22249" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14814" type="0"/>
+ <Second value="24549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13314" type="0"/>
+ <Second value="24049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13314" type="0"/>
+ <Second value="24549" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12814" type="0"/>
+ <Second value="25049" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6789" type="0"/>
+ <Second value="2116" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3812" type="0"/>
+ <Second value="2116" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1539" type="0"/>
+ <Second value="4389" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1539" type="0"/>
+ <Second value="7366" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1539" type="0"/>
+ <Second value="10343" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3812" type="0"/>
+ <Second value="12616" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6789" type="0"/>
+ <Second value="12616" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9766" type="0"/>
+ <Second value="12616" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12039" type="0"/>
+ <Second value="10343" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12039" type="0"/>
+ <Second value="7366" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12039" type="0"/>
+ <Second value="4389" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9766" type="0"/>
+ <Second value="2116" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6789" type="0"/>
+ <Second value="2116" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14339" type="0"/>
+ <Second value="7122" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14363" type="0"/>
+ <Second value="8236" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12802" type="0"/>
+ <Second value="9487" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12339" type="0"/>
+ <Second value="10501" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11876" type="0"/>
+ <Second value="11515" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12522" type="0"/>
+ <Second value="12368" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11665" type="0"/>
+ <Second value="13081" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10808" type="0"/>
+ <Second value="13794" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9466" type="0"/>
+ <Second value="12917" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8415" type="0"/>
+ <Second value="13181" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7304" type="0"/>
+ <Second value="13459" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6459" type="0"/>
+ <Second value="14938" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5338" type="0"/>
+ <Second value="14707" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4277" type="0"/>
+ <Second value="14488" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4096" type="0"/>
+ <Second value="12885" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3234" type="0"/>
+ <Second value="12227" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2324" type="0"/>
+ <Second value="11533" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="641" type="0"/>
+ <Second value="11794" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="123" type="0"/>
+ <Second value="10774" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="-368" type="0"/>
+ <Second value="9807" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="772" type="0"/>
+ <Second value="8666" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="749" type="0"/>
+ <Second value="7582" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="725" type="0"/>
+ <Second value="6438" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="-135" type="0"/>
+ <Second value="5541" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="339" type="0"/>
+ <Second value="4500" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="789" type="0"/>
+ <Second value="3513" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1999" type="0"/>
+ <Second value="3437" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2831" type="0"/>
+ <Second value="2744" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3711" type="0"/>
+ <Second value="2011" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3831" type="0"/>
+ <Second value="313" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4942" type="0"/>
+ <Second value="34" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5993" type="0"/>
+ <Second value="-229" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6852" type="0"/>
+ <Second value="1136" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7913" type="0"/>
+ <Second value="1355" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9034" type="0"/>
+ <Second value="1586" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10437" type="0"/>
+ <Second value="621" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11347" type="0"/>
+ <Second value="1315" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12208" type="0"/>
+ <Second value="1973" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11676" type="0"/>
+ <Second value="3496" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12167" type="0"/>
+ <Second value="4462" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12686" type="0"/>
+ <Second value="5483" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14315" type="0"/>
+ <Second value="6008" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14339" type="0"/>
+ <Second value="7122" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="6"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="2"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="14"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="6"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="2"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="3"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="14"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="5800" positionY="11000" sizeX="4400" sizeY="4200" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="4401.000000" column2="0.000000" column3="5800.000000"/>
+ <Line2 column1="0.000000" column2="4201.000000" column3="11000.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="mso-spt21" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="3600" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/shapes-test_page2.xml b/sd/qa/unit/data/xml/shapes-test_page2.xml
new file mode 100644
index 000000000..e9f3139fd
--- /dev/null
+++ b/sd/qa/unit/data/xml/shapes-test_page2.xml
@@ -0,0 +1,3104 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="1400" positionY="1200" sizeX="2800" sizeY="2200" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2801.000000" column2="0.000000" column3="1400.000000"/>
+ <Line2 column1="0.000000" column2="2201.000000" column3="1200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="smiley" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="17520" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="360" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7305" type="0"/>
+ <Second value="7515" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1165" type="0"/>
+ <Second value="1165" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="360" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14295" type="0"/>
+ <Second value="7515" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1165" type="0"/>
+ <Second value="1165" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="360" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4870" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8680" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12920" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16730" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="9" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="9" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="9" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="6" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="6000" positionY="1000" sizeX="3200" sizeY="2400" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3201.000000" column2="0.000000" column3="6000.000000"/>
+ <Line2 column1="0.000000" column2="2401.000000" column3="1000.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="sun" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="5400" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10" type="1"/>
+ <Second value="11" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="13" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="15" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20" type="1"/>
+ <Second value="21" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="22" type="1"/>
+ <Second value="23" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="24" type="1"/>
+ <Second value="25" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="26" type="1"/>
+ <Second value="27" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="28" type="1"/>
+ <Second value="29" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="30" type="1"/>
+ <Second value="31" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="32" type="1"/>
+ <Second value="33" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="34" type="1"/>
+ <Second value="35" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="36" type="1"/>
+ <Second value="37" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="38" type="1"/>
+ <Second value="39" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="40" type="1"/>
+ <Second value="41" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="42" type="1"/>
+ <Second value="43" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="1"/>
+ <Second value="45" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="46" type="1"/>
+ <Second value="47" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="48" type="1"/>
+ <Second value="49" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="50" type="1"/>
+ <Second value="51" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="54" type="1"/>
+ <Second value="54" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="360" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="9" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11000" positionY="1400" sizeX="2000" sizeY="2200" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2001.000000" column2="0.000000" column3="11000.000000"/>
+ <Line2 column1="0.000000" column2="2201.000000" column3="1400.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="MirroredX" value="true" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="moon" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="10800" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="5080" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="16520" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9740" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="16730" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4870" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9740" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="14800" positionY="1000" sizeX="2600" sizeY="3800" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2601.000000" column2="0.000000" column3="14800.000000"/>
+ <Line2 column1="0.000000" column2="3801.000000" column3="1000.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="640" height="861"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="640" type="0"/>
+ <Second value="233" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="221" type="0"/>
+ <Second value="293" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="506" type="0"/>
+ <Second value="12" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="367" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="29" type="0"/>
+ <Second value="406" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="431" type="0"/>
+ <Second value="347" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="145" type="0"/>
+ <Second value="645" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="99" type="0"/>
+ <Second value="520" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="861" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="326" type="0"/>
+ <Second value="765" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="209" type="0"/>
+ <Second value="711" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="640" type="0"/>
+ <Second value="233" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="640" type="0"/>
+ <Second value="233" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="12"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18600" positionY="1400" sizeX="2400" sizeY="2600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2401.000000" column2="0.000000" column3="18600.000000"/>
+ <Line2 column1="0.000000" column2="2601.000000" column3="1400.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="11200" height="11200"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="heart" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="1000" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="1000" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5606" type="0"/>
+ <Second value="11198" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2606" type="0"/>
+ <Second value="-1156" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5606" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8606" type="0"/>
+ <Second value="-1156" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5606" type="0"/>
+ <Second value="11198" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="23400" positionY="1400" sizeX="2800" sizeY="2600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2801.000000" column2="0.000000" column3="23400.000000"/>
+ <Line2 column1="0.000000" column2="2601.000000" column3="1400.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="5143" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7593" type="0"/>
+ <Second value="5143" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5143" type="0"/>
+ <Second value="7593" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5143" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5143" type="0"/>
+ <Second value="14007" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7593" type="0"/>
+ <Second value="16457" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="16457" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14007" type="0"/>
+ <Second value="16457" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16457" type="0"/>
+ <Second value="14007" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16457" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16457" type="0"/>
+ <Second value="7593" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14007" type="0"/>
+ <Second value="5143" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="5143" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="9159" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1010" type="0"/>
+ <Second value="7827" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2468" type="0"/>
+ <Second value="7371" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2205" type="0"/>
+ <Second value="6866" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2057" type="0"/>
+ <Second value="6285" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2057" type="0"/>
+ <Second value="5657" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2057" type="0"/>
+ <Second value="3617" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3616" type="0"/>
+ <Second value="2057" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5657" type="0"/>
+ <Second value="2057" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6285" type="0"/>
+ <Second value="2057" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6867" type="0"/>
+ <Second value="2206" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7371" type="0"/>
+ <Second value="2468" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7827" type="0"/>
+ <Second value="1010" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9158" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12442" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13773" type="0"/>
+ <Second value="1010" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14229" type="0"/>
+ <Second value="2468" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14733" type="0"/>
+ <Second value="2206" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15315" type="0"/>
+ <Second value="2057" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15943" type="0"/>
+ <Second value="2057" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="17984" type="0"/>
+ <Second value="2057" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19543" type="0"/>
+ <Second value="3617" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19543" type="0"/>
+ <Second value="5657" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19543" type="0"/>
+ <Second value="6285" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19395" type="0"/>
+ <Second value="6866" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19132" type="0"/>
+ <Second value="7371" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20590" type="0"/>
+ <Second value="7827" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="9159" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="12441" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20590" type="0"/>
+ <Second value="13773" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19132" type="0"/>
+ <Second value="14229" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19395" type="0"/>
+ <Second value="14734" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19543" type="0"/>
+ <Second value="15315" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19543" type="0"/>
+ <Second value="15943" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19543" type="0"/>
+ <Second value="17983" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="17984" type="0"/>
+ <Second value="19543" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15943" type="0"/>
+ <Second value="19543" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15315" type="0"/>
+ <Second value="19543" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14733" type="0"/>
+ <Second value="19394" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14229" type="0"/>
+ <Second value="19132" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13773" type="0"/>
+ <Second value="20590" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12442" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9158" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7827" type="0"/>
+ <Second value="20590" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7371" type="0"/>
+ <Second value="19132" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6867" type="0"/>
+ <Second value="19394" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6285" type="0"/>
+ <Second value="19543" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5657" type="0"/>
+ <Second value="19543" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3616" type="0"/>
+ <Second value="19543" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2057" type="0"/>
+ <Second value="17983" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2057" type="0"/>
+ <Second value="15943" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2057" type="0"/>
+ <Second value="15315" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2205" type="0"/>
+ <Second value="14734" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2468" type="0"/>
+ <Second value="14229" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1010" type="0"/>
+ <Second value="13773" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="12441" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="20"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="1600" positionY="5600" sizeX="2400" sizeY="1600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2401.000000" column2="0.000000" column3="1600.000000"/>
+ <Line2 column1="0.000000" column2="1601.000000" column3="5600.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1930" type="0"/>
+ <Second value="7160" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1530" type="0"/>
+ <Second value="4490" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3400" type="0"/>
+ <Second value="1970" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5270" type="0"/>
+ <Second value="1970" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5860" type="0"/>
+ <Second value="1950" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6470" type="0"/>
+ <Second value="2210" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6970" type="0"/>
+ <Second value="2600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7450" type="0"/>
+ <Second value="1390" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8340" type="0"/>
+ <Second value="650" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9340" type="0"/>
+ <Second value="650" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10004" type="0"/>
+ <Second value="690" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10710" type="0"/>
+ <Second value="1050" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11210" type="0"/>
+ <Second value="1700" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11570" type="0"/>
+ <Second value="630" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12330" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13150" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13840" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14470" type="0"/>
+ <Second value="460" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14870" type="0"/>
+ <Second value="1160" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15330" type="0"/>
+ <Second value="440" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16020" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16740" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="17910" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18900" type="0"/>
+ <Second value="1130" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19110" type="0"/>
+ <Second value="2710" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20240" type="0"/>
+ <Second value="3150" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21060" type="0"/>
+ <Second value="4580" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21060" type="0"/>
+ <Second value="6220" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21060" type="0"/>
+ <Second value="6720" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21000" type="0"/>
+ <Second value="7200" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20830" type="0"/>
+ <Second value="7660" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21310" type="0"/>
+ <Second value="8460" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="9450" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="10460" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="12750" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20310" type="0"/>
+ <Second value="14680" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18650" type="0"/>
+ <Second value="15010" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18650" type="0"/>
+ <Second value="17200" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="17370" type="0"/>
+ <Second value="18920" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15770" type="0"/>
+ <Second value="18920" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15220" type="0"/>
+ <Second value="18920" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14700" type="0"/>
+ <Second value="18710" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14240" type="0"/>
+ <Second value="18310" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13820" type="0"/>
+ <Second value="20240" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12490" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11000" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9890" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8840" type="0"/>
+ <Second value="20790" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8210" type="0"/>
+ <Second value="19510" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7620" type="0"/>
+ <Second value="20000" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7930" type="0"/>
+ <Second value="20290" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6240" type="0"/>
+ <Second value="20290" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4850" type="0"/>
+ <Second value="20290" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3570" type="0"/>
+ <Second value="19280" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2900" type="0"/>
+ <Second value="17640" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1300" type="0"/>
+ <Second value="17600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="480" type="0"/>
+ <Second value="16300" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="480" type="0"/>
+ <Second value="14660" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="480" type="0"/>
+ <Second value="13900" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="690" type="0"/>
+ <Second value="13210" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1070" type="0"/>
+ <Second value="12640" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="380" type="0"/>
+ <Second value="12160" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="11210" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="10120" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="8590" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="840" type="0"/>
+ <Second value="7330" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1930" type="0"/>
+ <Second value="7160" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1930" type="0"/>
+ <Second value="7160" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1950" type="0"/>
+ <Second value="7410" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2040" type="0"/>
+ <Second value="7690" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2090" type="0"/>
+ <Second value="7920" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6970" type="0"/>
+ <Second value="2600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7200" type="0"/>
+ <Second value="2790" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7480" type="0"/>
+ <Second value="3050" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7670" type="0"/>
+ <Second value="3310" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11210" type="0"/>
+ <Second value="1700" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11130" type="0"/>
+ <Second value="1910" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11080" type="0"/>
+ <Second value="2160" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11030" type="0"/>
+ <Second value="2400" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14870" type="0"/>
+ <Second value="1160" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14720" type="0"/>
+ <Second value="1400" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14640" type="0"/>
+ <Second value="1720" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14540" type="0"/>
+ <Second value="2010" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19110" type="0"/>
+ <Second value="2710" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19130" type="0"/>
+ <Second value="2890" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19230" type="0"/>
+ <Second value="3290" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19190" type="0"/>
+ <Second value="3380" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20830" type="0"/>
+ <Second value="7660" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20660" type="0"/>
+ <Second value="8170" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20430" type="0"/>
+ <Second value="8620" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20110" type="0"/>
+ <Second value="8990" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18660" type="0"/>
+ <Second value="15010" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18740" type="0"/>
+ <Second value="14200" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18280" type="0"/>
+ <Second value="12200" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="17000" type="0"/>
+ <Second value="11450" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14240" type="0"/>
+ <Second value="18310" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14320" type="0"/>
+ <Second value="17980" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14350" type="0"/>
+ <Second value="17680" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14370" type="0"/>
+ <Second value="17360" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8220" type="0"/>
+ <Second value="19510" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8060" type="0"/>
+ <Second value="19250" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7960" type="0"/>
+ <Second value="18950" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7860" type="0"/>
+ <Second value="18640" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2900" type="0"/>
+ <Second value="17640" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3090" type="0"/>
+ <Second value="17600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3280" type="0"/>
+ <Second value="17540" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3460" type="0"/>
+ <Second value="17450" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1070" type="0"/>
+ <Second value="12640" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1400" type="0"/>
+ <Second value="12900" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1780" type="0"/>
+ <Second value="13130" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2330" type="0"/>
+ <Second value="13040" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="22"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="6" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="6" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="6" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="6" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="6" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="6" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="6" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="6" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="6" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="6" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="6" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="6000" positionY="5000" sizeX="3400" sizeY="2600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3401.000000" column2="0.000000" column3="6000.000000"/>
+ <Line2 column1="0.000000" column2="2601.000000" column3="5000.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="forbidden" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="2700" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="360" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9" type="1"/>
+ <Second value="10" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="14" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="9" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="11" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="11" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="10800" positionY="5200" sizeX="2400" sizeY="2600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2401.000000" column2="0.000000" column3="10800.000000"/>
+ <Line2 column1="0.000000" column2="2601.000000" column3="5200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="20590" height="20590"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="NonPrimitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3088" type="0"/>
+ <Second value="5088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2369" type="0"/>
+ <Second value="5088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1915" type="0"/>
+ <Second value="5963" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1288" type="0"/>
+ <Second value="5826" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="442" type="0"/>
+ <Second value="5641" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="202" type="0"/>
+ <Second value="5060" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="4390" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="-110" type="0"/>
+ <Second value="3232" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="867" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="867" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="477" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="477" type="0"/>
+ <Second value="88" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="867" type="0"/>
+ <Second value="88" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="867" type="0"/>
+ <Second value="88" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3232" type="0"/>
+ <Second value="-110" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4390" type="0"/>
+ <Second value="88" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5060" type="0"/>
+ <Second value="202" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5641" type="0"/>
+ <Second value="442" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5826" type="0"/>
+ <Second value="1288" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5963" type="0"/>
+ <Second value="1915" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5088" type="0"/>
+ <Second value="2369" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5088" type="0"/>
+ <Second value="3088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5088" type="0"/>
+ <Second value="4505" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6171" type="0"/>
+ <Second value="5588" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7588" type="0"/>
+ <Second value="5588" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9005" type="0"/>
+ <Second value="5588" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10088" type="0"/>
+ <Second value="4505" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10088" type="0"/>
+ <Second value="3088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10088" type="0"/>
+ <Second value="2369" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9213" type="0"/>
+ <Second value="1915" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9350" type="0"/>
+ <Second value="1288" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9535" type="0"/>
+ <Second value="442" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10115" type="0"/>
+ <Second value="202" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10786" type="0"/>
+ <Second value="88" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11944" type="0"/>
+ <Second value="-110" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14310" type="0"/>
+ <Second value="88" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14310" type="0"/>
+ <Second value="88" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14699" type="0"/>
+ <Second value="88" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15088" type="0"/>
+ <Second value="477" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15088" type="0"/>
+ <Second value="867" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15088" type="0"/>
+ <Second value="867" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14890" type="0"/>
+ <Second value="3232" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15088" type="0"/>
+ <Second value="4390" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15202" type="0"/>
+ <Second value="5060" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15442" type="0"/>
+ <Second value="5641" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16288" type="0"/>
+ <Second value="5826" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16915" type="0"/>
+ <Second value="5963" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="17369" type="0"/>
+ <Second value="5088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18088" type="0"/>
+ <Second value="5088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19505" type="0"/>
+ <Second value="5088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20588" type="0"/>
+ <Second value="6171" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20588" type="0"/>
+ <Second value="7588" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20588" type="0"/>
+ <Second value="9005" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="19505" type="0"/>
+ <Second value="10088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="18088" type="0"/>
+ <Second value="10088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="17369" type="0"/>
+ <Second value="10088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16915" type="0"/>
+ <Second value="9213" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16288" type="0"/>
+ <Second value="9350" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15442" type="0"/>
+ <Second value="9535" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15202" type="0"/>
+ <Second value="10115" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15088" type="0"/>
+ <Second value="10786" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14890" type="0"/>
+ <Second value="11944" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15088" type="0"/>
+ <Second value="14310" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15088" type="0"/>
+ <Second value="14310" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15088" type="0"/>
+ <Second value="14699" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14699" type="0"/>
+ <Second value="15088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14310" type="0"/>
+ <Second value="15088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14310" type="0"/>
+ <Second value="15088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11944" type="0"/>
+ <Second value="14890" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10786" type="0"/>
+ <Second value="15088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10115" type="0"/>
+ <Second value="15202" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9535" type="0"/>
+ <Second value="15442" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9350" type="0"/>
+ <Second value="16288" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9213" type="0"/>
+ <Second value="16915" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10088" type="0"/>
+ <Second value="17369" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10088" type="0"/>
+ <Second value="18088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10088" type="0"/>
+ <Second value="19505" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="9005" type="0"/>
+ <Second value="20588" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="7588" type="0"/>
+ <Second value="20588" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6171" type="0"/>
+ <Second value="20588" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5088" type="0"/>
+ <Second value="19505" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5088" type="0"/>
+ <Second value="18088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5088" type="0"/>
+ <Second value="17369" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5963" type="0"/>
+ <Second value="16915" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5826" type="0"/>
+ <Second value="16288" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5641" type="0"/>
+ <Second value="15442" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5060" type="0"/>
+ <Second value="15202" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4390" type="0"/>
+ <Second value="15088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3232" type="0"/>
+ <Second value="14890" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="867" type="0"/>
+ <Second value="15088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="867" type="0"/>
+ <Second value="15088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="477" type="0"/>
+ <Second value="15088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="14699" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="14310" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="14310" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="-110" type="0"/>
+ <Second value="11944" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="10786" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="202" type="0"/>
+ <Second value="10115" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="442" type="0"/>
+ <Second value="9535" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1288" type="0"/>
+ <Second value="9350" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1915" type="0"/>
+ <Second value="9213" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2369" type="0"/>
+ <Second value="10088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3088" type="0"/>
+ <Second value="10088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4505" type="0"/>
+ <Second value="10088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5588" type="0"/>
+ <Second value="9005" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5588" type="0"/>
+ <Second value="7588" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5588" type="0"/>
+ <Second value="6171" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4505" type="0"/>
+ <Second value="5088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3088" type="0"/>
+ <Second value="5088" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="36"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="15200" positionY="6000" sizeX="2000" sizeY="1200" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2001.000000" column2="0.000000" column3="15200.000000"/>
+ <Line2 column1="0.000000" column2="1201.000000" column3="6000.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="bracket-pair" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="3700" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18200" positionY="5200" sizeX="1200" sizeY="2400" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1201.000000" column2="0.000000" column3="18200.000000"/>
+ <Line2 column1="0.000000" column2="2401.000000" column3="5200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="left-bracket" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="1800" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="21000" positionY="5400" sizeX="1400" sizeY="2400" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1401.000000" column2="0.000000" column3="21000.000000"/>
+ <Line2 column1="0.000000" column2="2401.000000" column3="5400.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="right-bracket" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="1800" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="1600" positionY="9800" sizeX="2600" sizeY="2600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2601.000000" column2="0.000000" column3="1600.000000"/>
+ <Line2 column1="0.000000" column2="2601.000000" column3="9800.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="brace-pair" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="1800" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8" type="1"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="8" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="14" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="15" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="6000" positionY="9800" sizeX="1000" sizeY="2800" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1001.000000" column2="0.000000" column3="6000.000000"/>
+ <Line2 column1="0.000000" column2="2801.000000" column3="9800.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="left-brace" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="1800" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="10800" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16200" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5400" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5400" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16200" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="2"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="9800" positionY="9200" sizeX="1600" sizeY="3200" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="749" textMinimumFrameWidth="499" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1601.000000" column2="0.000000" column3="9800.000000"/>
+ <Line2 column1="0.000000" column2="3201.000000" column3="9200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="right-brace" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="1800" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="10800" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5400" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16200" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="16200" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5400" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="2"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="13800" positionY="9600" sizeX="3200" sizeY="3400" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3201.000000" column2="0.000000" column3="13800.000000"/>
+ <Line2 column1="0.000000" column2="3401.000000" column3="9600.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="quad-bevel" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="2700" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="18800" positionY="9800" sizeX="3800" sizeY="2400" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="750" textMinimumFrameWidth="500" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="3801.000000" column2="0.000000" column3="18800.000000"/>
+ <Line2 column1="0.000000" column2="2401.000000" column3="9800.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="col-60da8460" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="2000" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="7"/>
+ <EnhancedCustomShapeSegment command="7" count="0"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="24800" positionY="9600" sizeX="2200" sizeY="3000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="66" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2201.000000" column2="0.000000" column3="24800.000000"/>
+ <Line2 column1="0.000000" column2="3001.000000" column3="9600.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="col-502ad400" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="4000" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="7" count="0"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/shapes-test_page3.xml b/sd/qa/unit/data/xml/shapes-test_page3.xml
new file mode 100644
index 000000000..4b06ff3d1
--- /dev/null
+++ b/sd/qa/unit/data/xml/shapes-test_page3.xml
@@ -0,0 +1,714 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="2200" positionY="1800" sizeX="2600" sizeY="2800" type="com.sun.star.drawing.LineShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <PolyPolygon>
+ <pointSequence>
+ <point positionX="4800" positionY="1800"/>
+ <point positionX="2200" positionY="4600"/>
+ </pointSequence>
+ </PolyPolygon>
+ <Geometry>
+ <pointSequence>
+ <point positionX="2600" positionY="0"/>
+ <point positionX="0" positionY="2800"/>
+ </pointSequence>
+ </Geometry>
+ <Transformation>
+ <Line1 column1="2600.000000" column2="0.000000" column3="2200.000000"/>
+ <Line2 column1="0.000000" column2="2800.000000" column3="1800.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+ <XShape positionX="4800" positionY="3600" sizeX="1200" sizeY="200" type="com.sun.star.drawing.LineShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <PolyPolygon>
+ <pointSequence>
+ <point positionX="4800" positionY="3600"/>
+ <point positionX="6000" positionY="3800"/>
+ </pointSequence>
+ </PolyPolygon>
+ <Geometry>
+ <pointSequence>
+ <point positionX="0" positionY="0"/>
+ <point positionX="1200" positionY="200"/>
+ </pointSequence>
+ </Geometry>
+ <Transformation>
+ <Line1 column1="1200.000000" column2="0.000000" column3="4800.000000"/>
+ <Line2 column1="0.000000" column2="200.000000" column3="3600.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+ <XShape positionX="8629" positionY="86" sizeX="7592" sizeY="7398" type="com.sun.star.drawing.OpenBezierShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="0.000000" column2="7591.681979" column3="8629.325587"/>
+ <Line2 column1="-7398.482222" column2="0.000000" column3="7484.216507"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <pointSequence>
+ <point positionX="8632" positionY="7287" polygonFlags="NORMAL"/>
+ <point positionX="8587" positionY="6521" polygonFlags="CONTROL"/>
+ <point positionX="9125" positionY="5860" polygonFlags="CONTROL"/>
+ <point positionX="9109" positionY="5074" polygonFlags="NORMAL"/>
+ <point positionX="9094" positionY="4361" polygonFlags="CONTROL"/>
+ <point positionX="9252" positionY="3652" polygonFlags="CONTROL"/>
+ <point positionX="9369" positionY="2949" polygonFlags="NORMAL"/>
+ <point positionX="9463" positionY="2381" polygonFlags="CONTROL"/>
+ <point positionX="9761" positionY="1863" polygonFlags="CONTROL"/>
+ <point positionX="9890" positionY="1301" polygonFlags="NORMAL"/>
+ <point positionX="10046" positionY="619" polygonFlags="CONTROL"/>
+ <point positionX="10588" positionY="71" polygonFlags="CONTROL"/>
+ <point positionX="11191" positionY="86" polygonFlags="NORMAL"/>
+ <point positionX="11768" positionY="100" polygonFlags="CONTROL"/>
+ <point positionX="12092" positionY="810" polygonFlags="CONTROL"/>
+ <point positionX="12275" positionY="1344" polygonFlags="NORMAL"/>
+ <point positionX="12429" positionY="1795" polygonFlags="CONTROL"/>
+ <point positionX="12397" positionY="2270" polygonFlags="CONTROL"/>
+ <point positionX="12362" positionY="2732" polygonFlags="NORMAL"/>
+ <point positionX="12325" positionY="3216" polygonFlags="CONTROL"/>
+ <point positionX="12522" positionY="3633" polygonFlags="CONTROL"/>
+ <point positionX="12449" positionY="4120" polygonFlags="NORMAL"/>
+ <point positionX="12371" positionY="4635" polygonFlags="CONTROL"/>
+ <point positionX="12002" positionY="5300" polygonFlags="CONTROL"/>
+ <point positionX="12362" positionY="5682" polygonFlags="NORMAL"/>
+ <point positionX="12837" positionY="6186" polygonFlags="CONTROL"/>
+ <point positionX="13734" positionY="5831" polygonFlags="CONTROL"/>
+ <point positionX="14401" positionY="5682" polygonFlags="NORMAL"/>
+ <point positionX="15026" positionY="5542" polygonFlags="CONTROL"/>
+ <point positionX="15806" positionY="5330" polygonFlags="CONTROL"/>
+ <point positionX="16049" positionY="4684" polygonFlags="NORMAL"/>
+ <point positionX="16276" positionY="4079" polygonFlags="CONTROL"/>
+ <point positionX="16249" positionY="3402" polygonFlags="CONTROL"/>
+ <point positionX="16136" positionY="2776" polygonFlags="NORMAL"/>
+ <point positionX="16049" positionY="2294" polygonFlags="CONTROL"/>
+ <point positionX="16592" positionY="1463" polygonFlags="CONTROL"/>
+ <point positionX="15658" positionY="1344" polygonFlags="NORMAL"/>
+ <point positionX="14831" positionY="1238" polygonFlags="CONTROL"/>
+ <point positionX="15004" positionY="2018" polygonFlags="CONTROL"/>
+ <point positionX="14834" positionY="2429" polygonFlags="NORMAL"/>
+ <point positionX="14603" positionY="2986" polygonFlags="CONTROL"/>
+ <point positionX="14392" positionY="3574" polygonFlags="CONTROL"/>
+ <point positionX="13967" positionY="3990" polygonFlags="NORMAL"/>
+ <point positionX="13587" positionY="4362" polygonFlags="CONTROL"/>
+ <point positionX="12972" positionY="4385" polygonFlags="CONTROL"/>
+ <point positionX="12449" positionY="4380" polygonFlags="NORMAL"/>
+ <point positionX="11972" positionY="4375" polygonFlags="CONTROL"/>
+ <point positionX="11522" positionY="4205" polygonFlags="CONTROL"/>
+ <point positionX="11061" positionY="4033" polygonFlags="NORMAL"/>
+ <point positionX="10612" positionY="3865" polygonFlags="CONTROL"/>
+ <point positionX="10027" positionY="4118" polygonFlags="CONTROL"/>
+ <point positionX="9846" positionY="4727" polygonFlags="NORMAL"/>
+ <point positionX="9695" positionY="5235" polygonFlags="CONTROL"/>
+ <point positionX="9639" positionY="5679" polygonFlags="CONTROL"/>
+ <point positionX="9673" positionY="6159" polygonFlags="NORMAL"/>
+ <point positionX="9724" positionY="6890" polygonFlags="CONTROL"/>
+ <point positionX="10610" positionY="7073" polygonFlags="CONTROL"/>
+ <point positionX="11191" positionY="7243" polygonFlags="NORMAL"/>
+ <point positionX="11848" positionY="7435" polygonFlags="CONTROL"/>
+ <point positionX="12518" positionY="7533" polygonFlags="CONTROL"/>
+ <point positionX="13230" positionY="7460" polygonFlags="NORMAL"/>
+ <point positionX="13746" positionY="7407" polygonFlags="CONTROL"/>
+ <point positionX="14357" positionY="7495" polygonFlags="CONTROL"/>
+ <point positionX="14748" positionY="7070" polygonFlags="NORMAL"/>
+ <point positionX="14748" positionY="7070" polygonFlags="NORMAL"/>
+ </pointSequence>
+ <pointSequence>
+ <point positionX="197" positionY="3" polygonFlags="NORMAL"/>
+ <point positionX="963" positionY="-42" polygonFlags="CONTROL"/>
+ <point positionX="1624" positionY="496" polygonFlags="CONTROL"/>
+ <point positionX="2410" positionY="480" polygonFlags="NORMAL"/>
+ <point positionX="3123" positionY="465" polygonFlags="CONTROL"/>
+ <point positionX="3832" positionY="623" polygonFlags="CONTROL"/>
+ <point positionX="4535" positionY="740" polygonFlags="NORMAL"/>
+ <point positionX="5103" positionY="834" polygonFlags="CONTROL"/>
+ <point positionX="5621" positionY="1132" polygonFlags="CONTROL"/>
+ <point positionX="6183" positionY="1261" polygonFlags="NORMAL"/>
+ <point positionX="6865" positionY="1417" polygonFlags="CONTROL"/>
+ <point positionX="7413" positionY="1959" polygonFlags="CONTROL"/>
+ <point positionX="7398" positionY="2562" polygonFlags="NORMAL"/>
+ <point positionX="7384" positionY="3139" polygonFlags="CONTROL"/>
+ <point positionX="6674" positionY="3463" polygonFlags="CONTROL"/>
+ <point positionX="6140" positionY="3646" polygonFlags="NORMAL"/>
+ <point positionX="5689" positionY="3800" polygonFlags="CONTROL"/>
+ <point positionX="5214" positionY="3768" polygonFlags="CONTROL"/>
+ <point positionX="4752" positionY="3733" polygonFlags="NORMAL"/>
+ <point positionX="4268" positionY="3696" polygonFlags="CONTROL"/>
+ <point positionX="3851" positionY="3893" polygonFlags="CONTROL"/>
+ <point positionX="3364" positionY="3820" polygonFlags="NORMAL"/>
+ <point positionX="2849" positionY="3742" polygonFlags="CONTROL"/>
+ <point positionX="2184" positionY="3373" polygonFlags="CONTROL"/>
+ <point positionX="1802" positionY="3733" polygonFlags="NORMAL"/>
+ <point positionX="1298" positionY="4208" polygonFlags="CONTROL"/>
+ <point positionX="1653" positionY="5105" polygonFlags="CONTROL"/>
+ <point positionX="1802" positionY="5772" polygonFlags="NORMAL"/>
+ <point positionX="1942" positionY="6397" polygonFlags="CONTROL"/>
+ <point positionX="2154" positionY="7177" polygonFlags="CONTROL"/>
+ <point positionX="2800" positionY="7420" polygonFlags="NORMAL"/>
+ <point positionX="3405" positionY="7647" polygonFlags="CONTROL"/>
+ <point positionX="4082" positionY="7620" polygonFlags="CONTROL"/>
+ <point positionX="4708" positionY="7507" polygonFlags="NORMAL"/>
+ <point positionX="5190" positionY="7420" polygonFlags="CONTROL"/>
+ <point positionX="6021" positionY="7963" polygonFlags="CONTROL"/>
+ <point positionX="6140" positionY="7029" polygonFlags="NORMAL"/>
+ <point positionX="6246" positionY="6202" polygonFlags="CONTROL"/>
+ <point positionX="5466" positionY="6375" polygonFlags="CONTROL"/>
+ <point positionX="5055" positionY="6205" polygonFlags="NORMAL"/>
+ <point positionX="4498" positionY="5974" polygonFlags="CONTROL"/>
+ <point positionX="3910" positionY="5763" polygonFlags="CONTROL"/>
+ <point positionX="3494" positionY="5338" polygonFlags="NORMAL"/>
+ <point positionX="3122" positionY="4958" polygonFlags="CONTROL"/>
+ <point positionX="3099" positionY="4343" polygonFlags="CONTROL"/>
+ <point positionX="3104" positionY="3820" polygonFlags="NORMAL"/>
+ <point positionX="3109" positionY="3343" polygonFlags="CONTROL"/>
+ <point positionX="3279" positionY="2893" polygonFlags="CONTROL"/>
+ <point positionX="3451" positionY="2432" polygonFlags="NORMAL"/>
+ <point positionX="3619" positionY="1983" polygonFlags="CONTROL"/>
+ <point positionX="3366" positionY="1398" polygonFlags="CONTROL"/>
+ <point positionX="2757" positionY="1217" polygonFlags="NORMAL"/>
+ <point positionX="2249" positionY="1066" polygonFlags="CONTROL"/>
+ <point positionX="1805" positionY="1010" polygonFlags="CONTROL"/>
+ <point positionX="1325" positionY="1044" polygonFlags="NORMAL"/>
+ <point positionX="594" positionY="1095" polygonFlags="CONTROL"/>
+ <point positionX="411" positionY="1981" polygonFlags="CONTROL"/>
+ <point positionX="241" positionY="2562" polygonFlags="NORMAL"/>
+ <point positionX="49" positionY="3219" polygonFlags="CONTROL"/>
+ <point positionX="-49" positionY="3889" polygonFlags="CONTROL"/>
+ <point positionX="24" positionY="4601" polygonFlags="NORMAL"/>
+ <point positionX="77" positionY="5117" polygonFlags="CONTROL"/>
+ <point positionX="-11" positionY="5728" polygonFlags="CONTROL"/>
+ <point positionX="414" positionY="6119" polygonFlags="NORMAL"/>
+ <point positionX="414" positionY="6119" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </XShape>
+ <XShape positionX="3800" positionY="6400" sizeX="1800" sizeY="1200" type="com.sun.star.drawing.LineShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd>
+ <pointSequence>
+ <point positionX="10" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="30" polygonFlags="NORMAL"/>
+ <point positionX="20" positionY="30" polygonFlags="NORMAL"/>
+ <point positionX="10" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineEnd>
+ <PolyPolygon>
+ <pointSequence>
+ <point positionX="3800" positionY="7600"/>
+ <point positionX="5600" positionY="6400"/>
+ </pointSequence>
+ </PolyPolygon>
+ <Geometry>
+ <pointSequence>
+ <point positionX="0" positionY="1200"/>
+ <point positionX="1800" positionY="0"/>
+ </pointSequence>
+ </Geometry>
+ <Transformation>
+ <Line1 column1="1800.000000" column2="0.000000" column3="3800.000000"/>
+ <Line2 column1="0.000000" column2="1200.000000" column3="6400.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+ <XShape positionX="18348" positionY="525" sizeX="8645" sizeY="6751" type="com.sun.star.drawing.ClosedBezierShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="8645.321503" column2="0.000000" column3="18348.000000"/>
+ <Line2 column1="0.000000" column2="6751.172578" column3="525.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <pointSequence>
+ <point positionX="18348" positionY="7243" polygonFlags="NORMAL"/>
+ <point positionX="18951" positionY="7332" polygonFlags="CONTROL"/>
+ <point positionX="19562" positionY="7215" polygonFlags="CONTROL"/>
+ <point positionX="20169" positionY="7200" polygonFlags="NORMAL"/>
+ <point positionX="20809" positionY="7184" polygonFlags="CONTROL"/>
+ <point positionX="20839" positionY="6538" polygonFlags="CONTROL"/>
+ <point positionX="20950" positionY="6115" polygonFlags="NORMAL"/>
+ <point positionX="21085" positionY="5599" polygonFlags="CONTROL"/>
+ <point positionX="21023" positionY="5074" polygonFlags="CONTROL"/>
+ <point positionX="21037" positionY="4554" polygonFlags="NORMAL"/>
+ <point positionX="21049" positionY="4092" polygonFlags="CONTROL"/>
+ <point positionX="21033" positionY="3627" polygonFlags="CONTROL"/>
+ <point positionX="21037" positionY="3166" polygonFlags="NORMAL"/>
+ <point positionX="21042" positionY="2557" polygonFlags="CONTROL"/>
+ <point positionX="20311" positionY="2450" polygonFlags="CONTROL"/>
+ <point positionX="19866" positionY="2515" polygonFlags="NORMAL"/>
+ <point positionX="19390" positionY="2584" polygonFlags="CONTROL"/>
+ <point positionX="18645" positionY="2487" polygonFlags="CONTROL"/>
+ <point positionX="18608" positionY="1908" polygonFlags="NORMAL"/>
+ <point positionX="18578" positionY="1443" polygonFlags="CONTROL"/>
+ <point positionX="18333" positionY="866" polygonFlags="CONTROL"/>
+ <point positionX="19042" positionY="607" polygonFlags="NORMAL"/>
+ <point positionX="19599" positionY="403" polygonFlags="CONTROL"/>
+ <point positionX="20169" positionY="602" polygonFlags="CONTROL"/>
+ <point positionX="20560" positionY="954" polygonFlags="NORMAL"/>
+ <point positionX="20998" positionY="1348" polygonFlags="CONTROL"/>
+ <point positionX="21528" positionY="1585" polygonFlags="CONTROL"/>
+ <point positionX="21948" positionY="2038" polygonFlags="NORMAL"/>
+ <point positionX="22328" positionY="2448" polygonFlags="CONTROL"/>
+ <point positionX="22815" positionY="2752" polygonFlags="CONTROL"/>
+ <point positionX="23336" positionY="2992" polygonFlags="NORMAL"/>
+ <point positionX="23850" positionY="3228" polygonFlags="CONTROL"/>
+ <point positionX="24383" positionY="3468" polygonFlags="CONTROL"/>
+ <point positionX="24984" positionY="3426" polygonFlags="NORMAL"/>
+ <point positionX="25462" positionY="3392" polygonFlags="CONTROL"/>
+ <point positionX="26206" positionY="3798" polygonFlags="CONTROL"/>
+ <point positionX="26459" positionY="3253" polygonFlags="NORMAL"/>
+ <point positionX="26648" positionY="2847" polygonFlags="CONTROL"/>
+ <point positionX="26666" positionY="2292" polygonFlags="CONTROL"/>
+ <point positionX="26415" positionY="1908" polygonFlags="NORMAL"/>
+ <point positionX="26129" positionY="1470" polygonFlags="CONTROL"/>
+ <point positionX="25369" positionY="1324" polygonFlags="CONTROL"/>
+ <point positionX="25027" positionY="1648" polygonFlags="NORMAL"/>
+ <point positionX="24655" positionY="2001" polygonFlags="CONTROL"/>
+ <point positionX="25301" positionY="2552" polygonFlags="CONTROL"/>
+ <point positionX="25288" positionY="3036" polygonFlags="NORMAL"/>
+ <point positionX="25275" positionY="3508" polygonFlags="CONTROL"/>
+ <point positionX="25468" positionY="3950" polygonFlags="CONTROL"/>
+ <point positionX="25548" positionY="4424" polygonFlags="NORMAL"/>
+ <point positionX="25655" positionY="5059" polygonFlags="CONTROL"/>
+ <point positionX="26263" positionY="4848" polygonFlags="CONTROL"/>
+ <point positionX="26632" positionY="4988" polygonFlags="NORMAL"/>
+ <point positionX="27116" positionY="5171" polygonFlags="CONTROL"/>
+ <point positionX="27166" positionY="6200" polygonFlags="CONTROL"/>
+ <point positionX="26459" positionY="6289" polygonFlags="NORMAL"/>
+ <point positionX="25910" positionY="6358" polygonFlags="CONTROL"/>
+ <point positionX="25585" positionY="5832" polygonFlags="CONTROL"/>
+ <point positionX="25157" positionY="5595" polygonFlags="NORMAL"/>
+ <point positionX="24651" positionY="5315" polygonFlags="CONTROL"/>
+ <point positionX="24507" positionY="4749" polygonFlags="CONTROL"/>
+ <point positionX="24507" positionY="4250" polygonFlags="SMOOTH"/>
+ <point positionX="24507" positionY="3534" polygonFlags="CONTROL"/>
+ <point positionX="23865" positionY="3497" polygonFlags="CONTROL"/>
+ <point positionX="23422" positionY="3339" polygonFlags="NORMAL"/>
+ <point positionX="22949" positionY="3170" polygonFlags="CONTROL"/>
+ <point positionX="22437" positionY="3093" polygonFlags="CONTROL"/>
+ <point positionX="21991" positionY="3296" polygonFlags="NORMAL"/>
+ <point positionX="21380" positionY="3574" polygonFlags="CONTROL"/>
+ <point positionX="21765" positionY="4222" polygonFlags="CONTROL"/>
+ <point positionX="21644" positionY="4684" polygonFlags="NORMAL"/>
+ <point positionX="21542" positionY="5074" polygonFlags="CONTROL"/>
+ <point positionX="21980" positionY="5726" polygonFlags="CONTROL"/>
+ <point positionX="21167" positionY="5768" polygonFlags="NORMAL"/>
+ <point positionX="20654" positionY="5794" polygonFlags="CONTROL"/>
+ <point positionX="20256" positionY="5430" polygonFlags="CONTROL"/>
+ <point positionX="19779" positionY="5508" polygonFlags="NORMAL"/>
+ <point positionX="19306" positionY="5585" polygonFlags="CONTROL"/>
+ <point positionX="19067" positionY="6562" polygonFlags="CONTROL"/>
+ <point positionX="19866" positionY="6636" polygonFlags="NORMAL"/>
+ <point positionX="20348" positionY="6680" polygonFlags="CONTROL"/>
+ <point positionX="20787" positionY="6882" polygonFlags="CONTROL"/>
+ <point positionX="21254" positionY="6983" polygonFlags="NORMAL"/>
+ <point positionX="21739" positionY="7088" polygonFlags="CONTROL"/>
+ <point positionX="22200" positionY="6884" polygonFlags="CONTROL"/>
+ <point positionX="22642" positionY="6723" polygonFlags="NORMAL"/>
+ <point positionX="23076" positionY="6565" polygonFlags="CONTROL"/>
+ <point positionX="23842" positionY="6723" polygonFlags="CONTROL"/>
+ <point positionX="23813" positionY="5985" polygonFlags="NORMAL"/>
+ <point positionX="23769" positionY="5595" polygonFlags="NORMAL"/>
+ <point positionX="18348" positionY="7243" polygonFlags="NORMAL"/>
+ </pointSequence>
+ <pointSequence>
+ <point positionX="0" positionY="6718" polygonFlags="NORMAL"/>
+ <point positionX="603" positionY="6807" polygonFlags="CONTROL"/>
+ <point positionX="1214" positionY="6690" polygonFlags="CONTROL"/>
+ <point positionX="1821" positionY="6675" polygonFlags="NORMAL"/>
+ <point positionX="2461" positionY="6659" polygonFlags="CONTROL"/>
+ <point positionX="2491" positionY="6013" polygonFlags="CONTROL"/>
+ <point positionX="2602" positionY="5590" polygonFlags="NORMAL"/>
+ <point positionX="2737" positionY="5074" polygonFlags="CONTROL"/>
+ <point positionX="2675" positionY="4549" polygonFlags="CONTROL"/>
+ <point positionX="2689" positionY="4029" polygonFlags="NORMAL"/>
+ <point positionX="2701" positionY="3567" polygonFlags="CONTROL"/>
+ <point positionX="2685" positionY="3102" polygonFlags="CONTROL"/>
+ <point positionX="2689" positionY="2641" polygonFlags="NORMAL"/>
+ <point positionX="2694" positionY="2032" polygonFlags="CONTROL"/>
+ <point positionX="1963" positionY="1925" polygonFlags="CONTROL"/>
+ <point positionX="1518" positionY="1990" polygonFlags="NORMAL"/>
+ <point positionX="1042" positionY="2059" polygonFlags="CONTROL"/>
+ <point positionX="297" positionY="1962" polygonFlags="CONTROL"/>
+ <point positionX="260" positionY="1383" polygonFlags="NORMAL"/>
+ <point positionX="230" positionY="918" polygonFlags="CONTROL"/>
+ <point positionX="-15" positionY="341" polygonFlags="CONTROL"/>
+ <point positionX="694" positionY="82" polygonFlags="NORMAL"/>
+ <point positionX="1251" positionY="-122" polygonFlags="CONTROL"/>
+ <point positionX="1821" positionY="77" polygonFlags="CONTROL"/>
+ <point positionX="2212" positionY="429" polygonFlags="NORMAL"/>
+ <point positionX="2650" positionY="823" polygonFlags="CONTROL"/>
+ <point positionX="3180" positionY="1060" polygonFlags="CONTROL"/>
+ <point positionX="3600" positionY="1513" polygonFlags="NORMAL"/>
+ <point positionX="3980" positionY="1923" polygonFlags="CONTROL"/>
+ <point positionX="4467" positionY="2227" polygonFlags="CONTROL"/>
+ <point positionX="4988" positionY="2467" polygonFlags="NORMAL"/>
+ <point positionX="5502" positionY="2703" polygonFlags="CONTROL"/>
+ <point positionX="6035" positionY="2943" polygonFlags="CONTROL"/>
+ <point positionX="6636" positionY="2901" polygonFlags="NORMAL"/>
+ <point positionX="7114" positionY="2867" polygonFlags="CONTROL"/>
+ <point positionX="7858" positionY="3273" polygonFlags="CONTROL"/>
+ <point positionX="8111" positionY="2728" polygonFlags="NORMAL"/>
+ <point positionX="8300" positionY="2322" polygonFlags="CONTROL"/>
+ <point positionX="8318" positionY="1767" polygonFlags="CONTROL"/>
+ <point positionX="8067" positionY="1383" polygonFlags="NORMAL"/>
+ <point positionX="7781" positionY="945" polygonFlags="CONTROL"/>
+ <point positionX="7021" positionY="799" polygonFlags="CONTROL"/>
+ <point positionX="6679" positionY="1123" polygonFlags="NORMAL"/>
+ <point positionX="6307" positionY="1476" polygonFlags="CONTROL"/>
+ <point positionX="6953" positionY="2027" polygonFlags="CONTROL"/>
+ <point positionX="6940" positionY="2511" polygonFlags="NORMAL"/>
+ <point positionX="6927" positionY="2983" polygonFlags="CONTROL"/>
+ <point positionX="7120" positionY="3425" polygonFlags="CONTROL"/>
+ <point positionX="7200" positionY="3899" polygonFlags="NORMAL"/>
+ <point positionX="7307" positionY="4534" polygonFlags="CONTROL"/>
+ <point positionX="7915" positionY="4323" polygonFlags="CONTROL"/>
+ <point positionX="8284" positionY="4463" polygonFlags="NORMAL"/>
+ <point positionX="8768" positionY="4646" polygonFlags="CONTROL"/>
+ <point positionX="8818" positionY="5675" polygonFlags="CONTROL"/>
+ <point positionX="8111" positionY="5764" polygonFlags="NORMAL"/>
+ <point positionX="7562" positionY="5833" polygonFlags="CONTROL"/>
+ <point positionX="7237" positionY="5307" polygonFlags="CONTROL"/>
+ <point positionX="6809" positionY="5070" polygonFlags="NORMAL"/>
+ <point positionX="6303" positionY="4790" polygonFlags="CONTROL"/>
+ <point positionX="6159" positionY="4224" polygonFlags="CONTROL"/>
+ <point positionX="6159" positionY="3725" polygonFlags="SMOOTH"/>
+ <point positionX="6159" positionY="3009" polygonFlags="CONTROL"/>
+ <point positionX="5517" positionY="2972" polygonFlags="CONTROL"/>
+ <point positionX="5074" positionY="2814" polygonFlags="NORMAL"/>
+ <point positionX="4601" positionY="2645" polygonFlags="CONTROL"/>
+ <point positionX="4089" positionY="2568" polygonFlags="CONTROL"/>
+ <point positionX="3643" positionY="2771" polygonFlags="NORMAL"/>
+ <point positionX="3032" positionY="3049" polygonFlags="CONTROL"/>
+ <point positionX="3417" positionY="3697" polygonFlags="CONTROL"/>
+ <point positionX="3296" positionY="4159" polygonFlags="NORMAL"/>
+ <point positionX="3194" positionY="4549" polygonFlags="CONTROL"/>
+ <point positionX="3632" positionY="5201" polygonFlags="CONTROL"/>
+ <point positionX="2819" positionY="5243" polygonFlags="NORMAL"/>
+ <point positionX="2306" positionY="5269" polygonFlags="CONTROL"/>
+ <point positionX="1908" positionY="4905" polygonFlags="CONTROL"/>
+ <point positionX="1431" positionY="4983" polygonFlags="NORMAL"/>
+ <point positionX="958" positionY="5060" polygonFlags="CONTROL"/>
+ <point positionX="719" positionY="6037" polygonFlags="CONTROL"/>
+ <point positionX="1518" positionY="6111" polygonFlags="NORMAL"/>
+ <point positionX="2000" positionY="6155" polygonFlags="CONTROL"/>
+ <point positionX="2439" positionY="6357" polygonFlags="CONTROL"/>
+ <point positionX="2906" positionY="6458" polygonFlags="NORMAL"/>
+ <point positionX="3391" positionY="6563" polygonFlags="CONTROL"/>
+ <point positionX="3852" positionY="6359" polygonFlags="CONTROL"/>
+ <point positionX="4294" positionY="6198" polygonFlags="NORMAL"/>
+ <point positionX="4728" positionY="6040" polygonFlags="CONTROL"/>
+ <point positionX="5494" positionY="6198" polygonFlags="CONTROL"/>
+ <point positionX="5465" positionY="5460" polygonFlags="NORMAL"/>
+ <point positionX="5421" positionY="5070" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="6718" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </XShape>
+ <XShape positionX="7400" positionY="7886" sizeX="4479" sizeY="6914" type="com.sun.star.drawing.ClosedBezierShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="4479.155188" column2="0.000000" column3="7400.000000"/>
+ <Line2 column1="0.000000" column2="6913.571703" column3="7886.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <pointSequence>
+ <point positionX="9200" positionY="13600" polygonFlags="NORMAL"/>
+ <point positionX="9200" positionY="12200" polygonFlags="CONTROL"/>
+ <point positionX="7600" positionY="10600" polygonFlags="CONTROL"/>
+ <point positionX="7600" positionY="10600" polygonFlags="NORMAL"/>
+ <point positionX="7600" positionY="10600" polygonFlags="CONTROL"/>
+ <point positionX="8600" positionY="9000" polygonFlags="CONTROL"/>
+ <point positionX="8200" positionY="9200" polygonFlags="SYMMETRIC"/>
+ <point positionX="7800" positionY="9400" polygonFlags="CONTROL"/>
+ <point positionX="9800" positionY="7800" polygonFlags="CONTROL"/>
+ <point positionX="9800" positionY="9800" polygonFlags="SYMMETRIC"/>
+ <point positionX="9800" positionY="11800" polygonFlags="CONTROL"/>
+ <point positionX="13600" positionY="11800" polygonFlags="CONTROL"/>
+ <point positionX="10800" positionY="8600" polygonFlags="SYMMETRIC"/>
+ <point positionX="8000" positionY="5400" polygonFlags="CONTROL"/>
+ <point positionX="10000" positionY="14000" polygonFlags="CONTROL"/>
+ <point positionX="11600" positionY="14000" polygonFlags="SYMMETRIC"/>
+ <point positionX="13200" positionY="14000" polygonFlags="CONTROL"/>
+ <point positionX="7400" positionY="14800" polygonFlags="CONTROL"/>
+ <point positionX="7400" positionY="14800" polygonFlags="NORMAL"/>
+ <point positionX="9200" positionY="13600" polygonFlags="NORMAL"/>
+ </pointSequence>
+ <pointSequence>
+ <point positionX="1800" positionY="5714" polygonFlags="NORMAL"/>
+ <point positionX="1800" positionY="4314" polygonFlags="CONTROL"/>
+ <point positionX="200" positionY="2714" polygonFlags="CONTROL"/>
+ <point positionX="200" positionY="2714" polygonFlags="NORMAL"/>
+ <point positionX="200" positionY="2714" polygonFlags="CONTROL"/>
+ <point positionX="1200" positionY="1114" polygonFlags="CONTROL"/>
+ <point positionX="800" positionY="1314" polygonFlags="SYMMETRIC"/>
+ <point positionX="400" positionY="1514" polygonFlags="CONTROL"/>
+ <point positionX="2400" positionY="-86" polygonFlags="CONTROL"/>
+ <point positionX="2400" positionY="1914" polygonFlags="SYMMETRIC"/>
+ <point positionX="2400" positionY="3914" polygonFlags="CONTROL"/>
+ <point positionX="6200" positionY="3914" polygonFlags="CONTROL"/>
+ <point positionX="3400" positionY="714" polygonFlags="SYMMETRIC"/>
+ <point positionX="600" positionY="-2486" polygonFlags="CONTROL"/>
+ <point positionX="2600" positionY="6114" polygonFlags="CONTROL"/>
+ <point positionX="4200" positionY="6114" polygonFlags="SYMMETRIC"/>
+ <point positionX="5800" positionY="6114" polygonFlags="CONTROL"/>
+ <point positionX="0" positionY="6914" polygonFlags="CONTROL"/>
+ <point positionX="0" positionY="6914" polygonFlags="NORMAL"/>
+ <point positionX="1800" positionY="5714" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </XShape>
+ <XShape positionX="14800" positionY="9000" sizeX="3800" sizeY="4800" type="com.sun.star.drawing.PolyLineShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <PolyPolygon>
+ <pointSequence>
+ <point positionX="15000" positionY="13800"/>
+ <point positionX="16801" positionY="11800"/>
+ <point positionX="16400" positionY="9000"/>
+ <point positionX="18600" positionY="10000"/>
+ <point positionX="14800" positionY="11400"/>
+ </pointSequence>
+ </PolyPolygon>
+ <Geometry>
+ <pointSequence>
+ <point positionX="0" positionY="2171"/>
+ <point positionX="2691" positionY="2171"/>
+ <point positionX="4504" positionY="0"/>
+ <point positionX="5233" positionY="2304"/>
+ <point positionX="1650" positionY="416"/>
+ </pointSequence>
+ </Geometry>
+ <Transformation>
+ <Line1 column1="3500.881673" column2="1712.474725" column3="13386.648093"/>
+ <Line2 column1="-3889.487950" column2="1541.378057" column3="12347.841208"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+ <XShape positionX="1312" positionY="8865" sizeX="5636" sizeY="6339" type="com.sun.star.drawing.OpenBezierShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="1567.207856" column2="6230.915598" column3="41.872336"/>
+ <Line2 column1="-6267.085096" column2="1558.162962" column3="14880.349578"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <pointSequence>
+ <point positionX="1401" positionY="13600" polygonFlags="NORMAL"/>
+ <point positionX="2001" positionY="11200" polygonFlags="CONTROL"/>
+ <point positionX="6001" positionY="13600" polygonFlags="CONTROL"/>
+ <point positionX="2600" positionY="10600" polygonFlags="SYMMETRIC"/>
+ <point positionX="-801" positionY="7600" polygonFlags="CONTROL"/>
+ <point positionX="4600" positionY="9400" polygonFlags="CONTROL"/>
+ <point positionX="4600" positionY="9400" polygonFlags="NORMAL"/>
+ <point positionX="4600" positionY="9400" polygonFlags="CONTROL"/>
+ <point positionX="8001" positionY="10800" polygonFlags="CONTROL"/>
+ <point positionX="5601" positionY="11000" polygonFlags="SYMMETRIC"/>
+ <point positionX="3201" positionY="11200" polygonFlags="CONTROL"/>
+ <point positionX="5201" positionY="12600" polygonFlags="CONTROL"/>
+ <point positionX="5600" positionY="12000" polygonFlags="SYMMETRIC"/>
+ <point positionX="6000" positionY="11400" polygonFlags="CONTROL"/>
+ <point positionX="7401" positionY="13600" polygonFlags="CONTROL"/>
+ <point positionX="6801" positionY="14000" polygonFlags="SYMMETRIC"/>
+ <point positionX="6201" positionY="14399" polygonFlags="CONTROL"/>
+ <point positionX="1401" positionY="15001" polygonFlags="CONTROL"/>
+ <point positionX="1601" positionY="14000" polygonFlags="NORMAL"/>
+ <point positionX="1401" positionY="15001" polygonFlags="NORMAL"/>
+ <point positionX="1201" positionY="16000" polygonFlags="CONTROL"/>
+ <point positionX="1400" positionY="13000" polygonFlags="CONTROL"/>
+ <point positionX="1400" positionY="13000" polygonFlags="NORMAL"/>
+ </pointSequence>
+ <pointSequence>
+ <point positionX="1572" positionY="1008" polygonFlags="NORMAL"/>
+ <point positionX="4045" positionY="1008" polygonFlags="CONTROL"/>
+ <point positionX="2688" positionY="5471" polygonFlags="CONTROL"/>
+ <point positionX="4773" positionY="1444" polygonFlags="SYMMETRIC"/>
+ <point positionX="6858" positionY="-2583" polygonFlags="CONTROL"/>
+ <point positionX="6422" positionY="3093" polygonFlags="CONTROL"/>
+ <point positionX="6422" positionY="3093" polygonFlags="NORMAL"/>
+ <point positionX="6422" positionY="3093" polygonFlags="CONTROL"/>
+ <point positionX="5889" positionY="6732" polygonFlags="CONTROL"/>
+ <point positionX="5113" positionY="4452" polygonFlags="SYMMETRIC"/>
+ <point positionX="4337" positionY="2172" polygonFlags="CONTROL"/>
+ <point positionX="3464" positionY="4452" polygonFlags="CONTROL"/>
+ <point positionX="4143" positionY="4694" polygonFlags="SYMMETRIC"/>
+ <point positionX="4822" positionY="4936" polygonFlags="CONTROL"/>
+ <point positionX="3027" positionY="6829" polygonFlags="CONTROL"/>
+ <point positionX="2494" positionY="6344" polygonFlags="SYMMETRIC"/>
+ <point positionX="1961" positionY="5859" polygonFlags="CONTROL"/>
+ <point positionX="213" positionY="1348" polygonFlags="CONTROL"/>
+ <point positionX="1232" positionY="1299" polygonFlags="NORMAL"/>
+ <point positionX="213" positionY="1348" polygonFlags="NORMAL"/>
+ <point positionX="-805" positionY="1396" polygonFlags="CONTROL"/>
+ <point positionX="2154" positionY="862" polygonFlags="CONTROL"/>
+ <point positionX="2154" positionY="862" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </XShape>
+ <XShape positionX="20400" positionY="9800" sizeX="7000" sizeY="6000" type="com.sun.star.drawing.PolyPolygonShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <PolyPolygon>
+ <pointSequence>
+ <point positionX="20400" positionY="13600"/>
+ <point positionX="20600" positionY="9800"/>
+ <point positionX="24200" positionY="11600"/>
+ <point positionX="27400" positionY="14400"/>
+ <point positionX="23000" positionY="15800"/>
+ <point positionX="20400" positionY="13600"/>
+ </pointSequence>
+ </PolyPolygon>
+ <Geometry>
+ <pointSequence>
+ <point positionX="0" positionY="3800"/>
+ <point positionX="200" positionY="0"/>
+ <point positionX="3800" positionY="1800"/>
+ <point positionX="7000" positionY="4600"/>
+ <point positionX="2600" positionY="6000"/>
+ <point positionX="0" positionY="3800"/>
+ </pointSequence>
+ </Geometry>
+ <Transformation>
+ <Line1 column1="7000.000000" column2="0.000000" column3="20400.000000"/>
+ <Line2 column1="0.000000" column2="6000.000000" column3="9800.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+ <XShape positionX="2200" positionY="16600" sizeX="7800" sizeY="3000" type="com.sun.star.drawing.PolyPolygonShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="NONE" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <PolyPolygon>
+ <pointSequence>
+ <point positionX="2200" positionY="16600"/>
+ <point positionX="2200" positionY="17800"/>
+ <point positionX="4000" positionY="19600"/>
+ <point positionX="4800" positionY="19600"/>
+ <point positionX="4800" positionY="18600"/>
+ <point positionX="5800" positionY="19600"/>
+ <point positionX="6400" positionY="19600"/>
+ <point positionX="7000" positionY="19000"/>
+ <point positionX="7600" positionY="19000"/>
+ <point positionX="8200" positionY="19600"/>
+ <point positionX="10000" positionY="17800"/>
+ <point positionX="4000" positionY="17800"/>
+ <point positionX="4000" positionY="16600"/>
+ <point positionX="2200" positionY="16600"/>
+ </pointSequence>
+ </PolyPolygon>
+ <Geometry>
+ <pointSequence>
+ <point positionX="0" positionY="7800"/>
+ <point positionX="1200" positionY="7800"/>
+ <point positionX="3000" positionY="6000"/>
+ <point positionX="3000" positionY="5200"/>
+ <point positionX="2000" positionY="5200"/>
+ <point positionX="3000" positionY="4200"/>
+ <point positionX="3000" positionY="3600"/>
+ <point positionX="2400" positionY="3000"/>
+ <point positionX="2400" positionY="2400"/>
+ <point positionX="3000" positionY="1800"/>
+ <point positionX="1200" positionY="0"/>
+ <point positionX="1200" positionY="6000"/>
+ <point positionX="0" positionY="6000"/>
+ <point positionX="0" positionY="7800"/>
+ </pointSequence>
+ </Geometry>
+ <Transformation>
+ <Line1 column1="0.000000" column2="-7800.000000" column3="10000.000000"/>
+ <Line2 column1="3000.000000" column2="0.000000" column3="16600.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+ <XShape positionX="12400" positionY="17200" sizeX="6200" sizeY="2600" type="com.sun.star.drawing.PolyPolygonShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <PolyPolygon>
+ <pointSequence>
+ <point positionX="14600" positionY="18000"/>
+ <point positionX="13200" positionY="18000"/>
+ <point positionX="12400" positionY="18800"/>
+ <point positionX="13400" positionY="19800"/>
+ <point positionX="15400" positionY="19800"/>
+ <point positionX="17600" positionY="19800"/>
+ <point positionX="18600" positionY="18800"/>
+ <point positionX="17800" positionY="18000"/>
+ <point positionX="16400" positionY="18000"/>
+ <point positionX="16400" positionY="17200"/>
+ <point positionX="15000" positionY="17200"/>
+ <point positionX="15000" positionY="17400"/>
+ <point positionX="13800" positionY="17400"/>
+ <point positionX="13800" positionY="17600"/>
+ <point positionX="15000" positionY="17600"/>
+ <point positionX="15000" positionY="18000"/>
+ <point positionX="14000" positionY="18000"/>
+ <point positionX="14600" positionY="18000"/>
+ </pointSequence>
+ </PolyPolygon>
+ <Geometry>
+ <pointSequence>
+ <point positionX="2200" positionY="800"/>
+ <point positionX="800" positionY="800"/>
+ <point positionX="0" positionY="1600"/>
+ <point positionX="1000" positionY="2600"/>
+ <point positionX="3000" positionY="2600"/>
+ <point positionX="5200" positionY="2600"/>
+ <point positionX="6200" positionY="1600"/>
+ <point positionX="5400" positionY="800"/>
+ <point positionX="4000" positionY="800"/>
+ <point positionX="4000" positionY="0"/>
+ <point positionX="2600" positionY="0"/>
+ <point positionX="2600" positionY="200"/>
+ <point positionX="1400" positionY="200"/>
+ <point positionX="1400" positionY="400"/>
+ <point positionX="2600" positionY="400"/>
+ <point positionX="2600" positionY="800"/>
+ <point positionX="1600" positionY="800"/>
+ <point positionX="2200" positionY="800"/>
+ </pointSequence>
+ </Geometry>
+ <Transformation>
+ <Line1 column1="6200.000000" column2="0.000000" column3="12400.000000"/>
+ <Line2 column1="0.000000" column2="2600.000000" column3="17200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/shapes-test_page4.xml b/sd/qa/unit/data/xml/shapes-test_page4.xml
new file mode 100644
index 000000000..3557b1038
--- /dev/null
+++ b/sd/qa/unit/data/xml/shapes-test_page4.xml
@@ -0,0 +1,611 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="2200" positionY="1800" sizeX="4400" sizeY="7000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="SQUARE" startColor="008000" endColor="800080" angle="1200" border="40" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="4401.000000" column2="0.000000" column3="2200.000000"/>
+ <Line2 column1="0.000000" column2="7001.000000" column3="1800.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="88" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="can" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="5400" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="68" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="68" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20" type="0"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="68" type="0"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="68" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="2"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="11800" positionY="2400" sizeX="5800" sizeY="5600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="ffff66" endColor="996633" angle="450" border="45" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="5801.000000" column2="0.000000" column3="11800.000000"/>
+ <Line2 column1="0.000000" column2="5601.000000" column3="2400.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="cube" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="5400" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="5"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="21400" positionY="3800" sizeX="2400" sizeY="4600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="AXIAL" startColor="ff0000" endColor="ffffff" angle="0" border="50" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2401.000000" column2="0.000000" column3="21400.000000"/>
+ <Line2 column1="0.000000" column2="4601.000000" column3="3800.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="88" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="can" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="5400" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="68" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="68" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="20" type="0"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="68" type="0"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="88" type="0"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="68" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="44" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="2"/>
+ <EnhancedCustomShapeSegment command="2" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="24800" positionY="2000" sizeX="2800" sizeY="3000" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="000000" endColor="ffffff" angle="0" border="0" xOffset="0" yOffset="0" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2801.000000" column2="0.000000" column3="24800.000000"/>
+ <Line2 column1="0.000000" column2="3001.000000" column3="2000.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="cube" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="5400" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="12" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="1" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="11" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="5"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="7600" positionY="9800" sizeX="5600" sizeY="5600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="GRADIENT" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="RADIAL" startColor="800000" endColor="ffff00" angle="0" border="20" xOffset="30" yOffset="30" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="5601.000000" column2="0.000000" column3="7600.000000"/>
+ <Line2 column1="0.000000" column2="5601.000000" column3="9800.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ellipse" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="10800" type="0"/>
+ <Second value="10800" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="360" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="9" count="1"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/shapes-test_page5.xml b/sd/qa/unit/data/xml/shapes-test_page5.xml
new file mode 100644
index 000000000..cb0ae4724
--- /dev/null
+++ b/sd/qa/unit/data/xml/shapes-test_page5.xml
@@ -0,0 +1,664 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="4000" positionY="3200" sizeX="4800" sizeY="4200" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="TRIPLE" color="0000ff" distance="102" angle="900"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="4801.000000" column2="0.000000" column3="4000.000000"/>
+ <Line2 column1="0.000000" column2="4201.000000" column3="3200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="quad-bevel" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="2700" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="16000" positionY="2200" sizeX="5800" sizeY="4400" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="750" textMinimumFrameWidth="500" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="102" angle="450"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="5801.000000" column2="0.000000" column3="16000.000000"/>
+ <Line2 column1="0.000000" column2="4401.000000" column3="2200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="col-60da8460" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="2000" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="17" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="13" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="18" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="15" type="1"/>
+ <Second value="16" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="12" type="1"/>
+ <Second value="19" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="7"/>
+ <EnhancedCustomShapeSegment command="7" count="0"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="6600" positionY="10200" sizeX="4600" sizeY="8800" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="66" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="DOUBLE" color="800000" distance="76" angle="900"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="4601.000000" column2="0.000000" column3="6600.000000"/>
+ <Line2 column1="0.000000" column2="8801.000000" column3="10200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="col-502ad400" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="4000" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="3" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="6" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="5" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="4" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="7" count="0"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="14400" positionY="10200" sizeX="7600" sizeY="2600" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="HATCH" fillColor="cfe7f5" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="000000" distance="102" angle="900"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="7601.000000" column2="0.000000" column3="14400.000000"/>
+ <Line2 column1="0.000000" column2="2601.000000" column3="10200.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="21600" height="21600"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="quad-bevel" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="2700" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="StretchX" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="StretchY" value="10800" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="21600" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="21600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="0" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="1"/>
+ <Second value="2" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ </CustomShapeGeometry>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/shapes-test_page6.xml b/sd/qa/unit/data/xml/shapes-test_page6.xml
new file mode 100644
index 000000000..45ef53676
--- /dev/null
+++ b/sd/qa/unit/data/xml/shapes-test_page6.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="6753" positionY="13803" sizeX="14098" sizeY="971" type="com.sun.star.drawing.TableShape"/>
+ <XShape positionX="2108" positionY="1361" sizeX="14098" sizeY="9184" type="com.sun.star.drawing.TableShape"/>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/shapes-test_page7.xml b/sd/qa/unit/data/xml/shapes-test_page7.xml
new file mode 100644
index 000000000..2ebed128b
--- /dev/null
+++ b/sd/qa/unit/data/xml/shapes-test_page7.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="1361" positionY="9000" sizeX="24639" sizeY="7858" type="com.sun.star.presentation.GraphicObjectShape" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="true" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" shadow="false" shadowColor="808080" shadowTransparence="0" shadowXDistance="200" shadowYDistance="200" zOrder="0" layerID="0" layerName="layout" visible="true" printable="true" moveProtect="false" sizeProtect="false">
+ <Transformation>
+ <Line1 column1="24640.000000" column2="0.000000" column3="1361.000000"/>
+ <Line2 column1="0.000000" column2="7859.000000" column3="9000.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/tdf100491_0.xml b/sd/qa/unit/data/xml/tdf100491_0.xml
new file mode 100644
index 000000000..e45eba130
--- /dev/null
+++ b/sd/qa/unit/data/xml/tdf100491_0.xml
@@ -0,0 +1,291 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="3680" positionY="2451" sizeX="6" sizeY="2990" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 3" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="350" positionY="330" polygonFlags="NORMAL"/>
+ <point positionX="330" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="187" positionY="70" polygonFlags="NORMAL"/>
+ <point positionX="187" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="162" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="162" positionY="70" polygonFlags="NORMAL"/>
+ <point positionX="19" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="330" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="4324" positionY="2449" sizeX="5" sizeY="2990" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 4" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="275" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="550" positionY="241" polygonFlags="NORMAL"/>
+ <point positionX="530" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="287" positionY="32" polygonFlags="NORMAL"/>
+ <point positionX="287" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="262" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="262" positionY="32" polygonFlags="NORMAL"/>
+ <point positionX="19" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="241" polygonFlags="NORMAL"/>
+ <point positionX="275" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="4947" positionY="2449" sizeX="5" sizeY="2990" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 5" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="275" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="550" positionY="530" polygonFlags="NORMAL"/>
+ <point positionX="530" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="287" positionY="70" polygonFlags="NORMAL"/>
+ <point positionX="287" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="262" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="262" positionY="70" polygonFlags="NORMAL"/>
+ <point positionX="19" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="530" polygonFlags="NORMAL"/>
+ <point positionX="275" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="9401" positionY="2435" sizeX="5" sizeY="2988" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 6" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="350" positionY="274" polygonFlags="NORMAL"/>
+ <point positionX="274" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="275" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="275" polygonFlags="NORMAL"/>
+ <point positionX="75" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="274" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="10043" positionY="2433" sizeX="5" sizeY="2988" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 7" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="350" positionY="196" polygonFlags="NORMAL"/>
+ <point positionX="274" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="196" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="196" polygonFlags="NORMAL"/>
+ <point positionX="75" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="196" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="10669" positionY="2435" sizeX="5" sizeY="2990" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 8" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="275" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="550" positionY="474" polygonFlags="NORMAL"/>
+ <point positionX="474" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="325" positionY="275" polygonFlags="NORMAL"/>
+ <point positionX="325" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="224" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="224" positionY="275" polygonFlags="NORMAL"/>
+ <point positionX="75" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="474" polygonFlags="NORMAL"/>
+ <point positionX="275" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="12466" positionY="2433" sizeX="6" sizeY="2988" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 9" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="350" positionY="274" polygonFlags="NORMAL"/>
+ <point positionX="274" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="275" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="275" polygonFlags="NORMAL"/>
+ <point positionX="75" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="274" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="13107" positionY="2431" sizeX="5" sizeY="2988" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 10" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="350" positionY="196" polygonFlags="NORMAL"/>
+ <point positionX="274" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="196" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="196" polygonFlags="NORMAL"/>
+ <point positionX="75" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="196" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="13731" positionY="2431" sizeX="5" sizeY="2988" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 11" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="275" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="550" positionY="474" polygonFlags="NORMAL"/>
+ <point positionX="474" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="325" positionY="275" polygonFlags="NORMAL"/>
+ <point positionX="325" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="224" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="224" positionY="275" polygonFlags="NORMAL"/>
+ <point positionX="75" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="474" polygonFlags="NORMAL"/>
+ <point positionX="275" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="15872" positionY="2431" sizeX="6" sizeY="2988" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 12" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="350" positionY="274" polygonFlags="NORMAL"/>
+ <point positionX="274" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="275" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="275" polygonFlags="NORMAL"/>
+ <point positionX="75" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="274" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="16513" positionY="2430" sizeX="5" sizeY="2988" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 13" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="350" positionY="196" polygonFlags="NORMAL"/>
+ <point positionX="274" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="196" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="196" polygonFlags="NORMAL"/>
+ <point positionX="75" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="196" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="17137" positionY="2430" sizeX="5" sizeY="2988" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 14" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="350" positionY="432" polygonFlags="NORMAL"/>
+ <point positionX="274" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="432" polygonFlags="NORMAL"/>
+ <point positionX="225" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="124" positionY="432" polygonFlags="NORMAL"/>
+ <point positionX="75" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="432" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="17772" positionY="2430" sizeX="5" sizeY="2988" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 15" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="125" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="250" positionY="174" polygonFlags="NORMAL"/>
+ <point positionX="174" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="275" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="74" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="74" positionY="275" polygonFlags="NORMAL"/>
+ <point positionX="75" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="174" polygonFlags="NORMAL"/>
+ <point positionX="125" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="6549" positionY="2438" sizeX="6" sizeY="2990" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 16" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="350" positionY="344" polygonFlags="NORMAL"/>
+ <point positionX="344" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="178" positionY="19" polygonFlags="NORMAL"/>
+ <point positionX="178" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="171" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="171" positionY="19" polygonFlags="NORMAL"/>
+ <point positionX="5" positionY="350" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="344" polygonFlags="NORMAL"/>
+ <point positionX="175" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="7193" positionY="2435" sizeX="5" sizeY="2990" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 17" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="275" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="550" positionY="246" polygonFlags="NORMAL"/>
+ <point positionX="541" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="280" positionY="13" polygonFlags="NORMAL"/>
+ <point positionX="280" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="269" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="269" positionY="13" polygonFlags="NORMAL"/>
+ <point positionX="8" positionY="250" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="246" polygonFlags="NORMAL"/>
+ <point positionX="275" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+ <XShape positionX="7816" positionY="2435" sizeX="5" sizeY="2990" type="com.sun.star.drawing.ConnectorShape" name="Straight Connector 18" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" lineStyle="SOLID">
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart>
+ <pointSequence>
+ <point positionX="275" positionY="0" polygonFlags="NORMAL"/>
+ <point positionX="550" positionY="541" polygonFlags="NORMAL"/>
+ <point positionX="541" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="280" positionY="30" polygonFlags="NORMAL"/>
+ <point positionX="280" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="269" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="269" positionY="30" polygonFlags="NORMAL"/>
+ <point positionX="8" positionY="550" polygonFlags="NORMAL"/>
+ <point positionX="0" positionY="541" polygonFlags="NORMAL"/>
+ <point positionX="275" positionY="0" polygonFlags="NORMAL"/>
+ </pointSequence>
+ </LineStart>
+ <LineEnd/>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/tdf109317_0.xml b/sd/qa/unit/data/xml/tdf109317_0.xml
new file mode 100644
index 000000000..f34beafbd
--- /dev/null
+++ b/sd/qa/unit/data/xml/tdf109317_0.xml
@@ -0,0 +1,495 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="3136" positionY="3068" sizeX="3639" sizeY="6340" type="com.sun.star.drawing.CustomShape" name="Freihandform: Form 1" fontHeight="18.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="0070c0" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2573.868684" column2="4483.764100" column3="3136.000000"/>
+ <Line2 column1="-2573.868684" column2="4483.764100" column3="3068.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="true" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="SubViewSize" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="103371" type="0"/>
+ <Second value="22445" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="-97237" type="0"/>
+ <Second value="202837" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="45832" type="0"/>
+ <Second value="1706620" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="103371" type="0"/>
+ <Second value="2056518" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="160910" type="0"/>
+ <Second value="2406416" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="384845" type="0"/>
+ <Second value="2286673" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="448604" type="0"/>
+ <Second value="2121832" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="512363" type="0"/>
+ <Second value="1956991" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="342857" type="0"/>
+ <Second value="1258750" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="485926" type="0"/>
+ <Second value="1067473" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="628995" type="0"/>
+ <Second value="876196" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1367669" type="0"/>
+ <Second value="1145228" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1307020" type="0"/>
+ <Second value="974167" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1246371" type="0"/>
+ <Second value="803106" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="303979" type="0"/>
+ <Second value="-157947" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="103371" type="0"/>
+ <Second value="22445" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="5"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="12187" positionY="5984" sizeX="7764" sizeY="4016" type="com.sun.star.drawing.CustomShape" name="Freihandform: Form 2" fontHeight="18.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="0070c0" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="5490.684156" column2="2840.447940" column3="12187.000000"/>
+ <Line2 column1="-5490.684156" column2="2840.447940" column3="5984.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="MirroredX" value="true" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="SubViewSize" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="258783" type="0"/>
+ <Second value="126408" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="656889" type="0"/>
+ <Second value="61094" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2317739" type="0"/>
+ <Second value="-111522" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2675412" type="0"/>
+ <Second value="107747" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="3033086" type="0"/>
+ <Second value="327016" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2485689" type="0"/>
+ <Second value="1373600" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2404824" type="0"/>
+ <Second value="1442024" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2323959" type="0"/>
+ <Second value="1510448" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2543228" type="0"/>
+ <Second value="675359" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="2190220" type="0"/>
+ <Second value="518294" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1837212" type="0"/>
+ <Second value="361229" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="610236" type="0"/>
+ <Second value="558727" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="286775" type="0"/>
+ <Second value="499633" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="-36686" type="0"/>
+ <Second value="440539" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="-139323" type="0"/>
+ <Second value="191722" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="258783" type="0"/>
+ <Second value="126408" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="5"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="3136" positionY="13374" sizeX="3639" sizeY="5390" type="com.sun.star.drawing.CustomShape" name="Rechtwinkliges Dreieck 4" fontHeight="18.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="0070c0" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2573.868684" column2="3812.012657" column3="3136.000000"/>
+ <Line2 column1="-2573.868684" column2="3812.012657" column3="13374.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="true" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-rtTriangle" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="13136" positionY="11766" sizeX="3913" sizeY="5183" type="com.sun.star.drawing.CustomShape" name="Rechtwinkliges Dreieck 5" fontHeight="18.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="0070c0" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2767.615942" column2="3665.641554" column3="13136.000000"/>
+ <Line2 column1="-2767.615942" column2="3665.641554" column3="11766.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="MirroredX" value="true" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-rtTriangle" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="27418" positionY="11262" sizeX="3308" sizeY="4403" type="com.sun.star.drawing.CustomShape" name="Rechtwinkliges Dreieck 3" fontHeight="18.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="0070c0" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2339.816339" column2="-3114.098264" column3="27418.000000"/>
+ <Line2 column1="2339.816339" column2="3114.098264" column3="11262.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="MirroredX" value="true" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="true" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-rtTriangle" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="GluePoints" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="6" type="1"/>
+ <Second value="4" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="2"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+ <XShape positionX="28728" positionY="762" sizeX="3186" sizeY="7824" type="com.sun.star.drawing.CustomShape" name="Freihandform: Form 6" fontHeight="18.000000" fontColor="ffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="0070c0" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="2253.549312" column2="-5533.110563" column3="28728.000000"/>
+ <Line2 column1="2253.549312" column2="5533.110563" column3="762.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="MirroredX" value="true" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="true" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="SubViewSize" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1054550" type="0"/>
+ <Second value="60147" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="878381" type="0"/>
+ <Second value="-236264" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="75834" type="0"/>
+ <Second value="651571" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5926" type="0"/>
+ <Second value="798378" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="-63982" type="0"/>
+ <Second value="945185" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="505071" type="0"/>
+ <Second value="651571" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="635100" type="0"/>
+ <Second value="940991" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="765129" type="0"/>
+ <Second value="1230411" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="714795" type="0"/>
+ <Second value="2262257" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="786102" type="0"/>
+ <Second value="2534899" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="857408" type="0"/>
+ <Second value="2807541" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1015401" type="0"/>
+ <Second value="2983710" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1062939" type="0"/>
+ <Second value="2576844" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1110477" type="0"/>
+ <Second value="2169978" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1230719" type="0"/>
+ <Second value="356558" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="1054550" type="0"/>
+ <Second value="60147" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="5"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/tdf90338_0.xml b/sd/qa/unit/data/xml/tdf90338_0.xml
new file mode 100644
index 000000000..741d6ca08
--- /dev/null
+++ b/sd/qa/unit/data/xml/tdf90338_0.xml
@@ -0,0 +1,559 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="5498" positionY="2715" sizeX="11630" sizeY="8623" type="com.sun.star.drawing.CustomShape" name="Freeform 3" fontHeight="11.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="e7e6e6" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="11631.000000" column2="0.000000" column3="5498.000000"/>
+ <Line2 column1="0.000000" column2="8624.000000" column3="2715.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues/>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="true" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="626694" type="0"/>
+ <Second value="500766" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="658274" type="0"/>
+ <Second value="500766" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="683875" type="0"/>
+ <Second value="526366" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="683875" type="0"/>
+ <Second value="557947" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="683875" type="0"/>
+ <Second value="589527" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="658274" type="0"/>
+ <Second value="615128" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="626694" type="0"/>
+ <Second value="615128" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="595113" type="0"/>
+ <Second value="615128" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="569513" type="0"/>
+ <Second value="589527" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="569513" type="0"/>
+ <Second value="557947" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="569513" type="0"/>
+ <Second value="526366" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="595113" type="0"/>
+ <Second value="500766" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="626694" type="0"/>
+ <Second value="500766" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="352919" type="0"/>
+ <Second value="500765" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="384499" type="0"/>
+ <Second value="500765" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="410100" type="0"/>
+ <Second value="526366" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="410100" type="0"/>
+ <Second value="557946" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="410100" type="0"/>
+ <Second value="589527" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="384499" type="0"/>
+ <Second value="615127" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="352919" type="0"/>
+ <Second value="615127" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="321338" type="0"/>
+ <Second value="615127" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="295737" type="0"/>
+ <Second value="589527" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="295737" type="0"/>
+ <Second value="557946" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="295737" type="0"/>
+ <Second value="526366" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="321338" type="0"/>
+ <Second value="500765" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="352919" type="0"/>
+ <Second value="500765" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="489807" type="0"/>
+ <Second value="202385" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="523492" type="0"/>
+ <Second value="202385" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="550800" type="0"/>
+ <Second value="229692" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="550800" type="0"/>
+ <Second value="263378" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="550800" type="0"/>
+ <Second value="297063" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="523492" type="0"/>
+ <Second value="324371" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="489807" type="0"/>
+ <Second value="324371" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="456122" type="0"/>
+ <Second value="324371" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="428814" type="0"/>
+ <Second value="297063" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="428814" type="0"/>
+ <Second value="263378" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="428814" type="0"/>
+ <Second value="229692" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="456122" type="0"/>
+ <Second value="202385" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="489807" type="0"/>
+ <Second value="202385" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="175791" type="0"/>
+ <Second value="200142" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="137652" type="0"/>
+ <Second value="200142" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="106735" type="0"/>
+ <Second value="246628" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="106735" type="0"/>
+ <Second value="303972" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="106735" type="0"/>
+ <Second value="361316" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="137652" type="0"/>
+ <Second value="407802" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="175791" type="0"/>
+ <Second value="407802" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="154055" type="0"/>
+ <Second value="383291" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="141263" type="0"/>
+ <Second value="344823" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="141263" type="0"/>
+ <Second value="303972" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="141263" type="0"/>
+ <Second value="263120" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="154055" type="0"/>
+ <Second value="224653" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="175791" type="0"/>
+ <Second value="200142" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="803821" type="0"/>
+ <Second value="200142" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="825557" type="0"/>
+ <Second value="224653" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="838349" type="0"/>
+ <Second value="263120" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="838349" type="0"/>
+ <Second value="303972" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="838349" type="0"/>
+ <Second value="344823" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="825557" type="0"/>
+ <Second value="383291" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="803821" type="0"/>
+ <Second value="407802" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="841960" type="0"/>
+ <Second value="407802" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="872877" type="0"/>
+ <Second value="361316" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="872877" type="0"/>
+ <Second value="303972" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="872877" type="0"/>
+ <Second value="246628" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="841960" type="0"/>
+ <Second value="200142" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="803821" type="0"/>
+ <Second value="200142" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="489807" type="0"/>
+ <Second value="97034" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="397937" type="0"/>
+ <Second value="97034" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="323463" type="0"/>
+ <Second value="171509" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="323463" type="0"/>
+ <Second value="263378" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="323463" type="0"/>
+ <Second value="355247" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="397937" type="0"/>
+ <Second value="429722" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="489807" type="0"/>
+ <Second value="429722" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="581676" type="0"/>
+ <Second value="429722" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="656151" type="0"/>
+ <Second value="355247" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="656151" type="0"/>
+ <Second value="263378" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="656151" type="0"/>
+ <Second value="171509" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="581676" type="0"/>
+ <Second value="97034" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="489807" type="0"/>
+ <Second value="97034" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="139849" type="0"/>
+ <Second value="93700" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="62613" type="0"/>
+ <Second value="93700" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="187842" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="303971" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="420100" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="62613" type="0"/>
+ <Second value="514242" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="139849" type="0"/>
+ <Second value="514242" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="80774" type="0"/>
+ <Second value="482466" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="41350" type="0"/>
+ <Second value="398306" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="41350" type="0"/>
+ <Second value="303971" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="41350" type="0"/>
+ <Second value="209636" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="80774" type="0"/>
+ <Second value="125476" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="139849" type="0"/>
+ <Second value="93700" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="839763" type="0"/>
+ <Second value="93700" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="898838" type="0"/>
+ <Second value="125476" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="938262" type="0"/>
+ <Second value="209636" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="938262" type="0"/>
+ <Second value="303971" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="938262" type="0"/>
+ <Second value="398306" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="898838" type="0"/>
+ <Second value="482466" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="839763" type="0"/>
+ <Second value="514242" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="916999" type="0"/>
+ <Second value="514242" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="979612" type="0"/>
+ <Second value="420100" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="979612" type="0"/>
+ <Second value="303971" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="979612" type="0"/>
+ <Second value="187842" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="916999" type="0"/>
+ <Second value="93700" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="839763" type="0"/>
+ <Second value="93700" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="489806" type="0"/>
+ <Second value="69310" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="596987" type="0"/>
+ <Second value="69310" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="683875" type="0"/>
+ <Second value="156198" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="683875" type="0"/>
+ <Second value="263379" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="683875" type="0"/>
+ <Second value="370560" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="596987" type="0"/>
+ <Second value="457447" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="489806" type="0"/>
+ <Second value="457447" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="382625" type="0"/>
+ <Second value="457447" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="295738" type="0"/>
+ <Second value="370560" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="295738" type="0"/>
+ <Second value="263379" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="295738" type="0"/>
+ <Second value="156198" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="382625" type="0"/>
+ <Second value="69310" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="489806" type="0"/>
+ <Second value="69310" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="735857" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="243755" type="0"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="243755" type="0"/>
+ <Second value="658446" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="735857" type="0"/>
+ <Second value="658446" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="3" count="4"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="3"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="SubViewSize" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="Type" value="ooxml-non-primitive" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/tdf90403_0.xml b/sd/qa/unit/data/xml/tdf90403_0.xml
new file mode 100644
index 000000000..297504d4b
--- /dev/null
+++ b/sd/qa/unit/data/xml/tdf90403_0.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="4233" positionY="3881" sizeX="16932" sizeY="14044" type="com.sun.star.drawing.TableShape" name="Table 1"/>
+</XShapes>
diff --git a/sd/qa/unit/data/xml/tdf92001_0.xml b/sd/qa/unit/data/xml/tdf92001_0.xml
new file mode 100644
index 000000000..d67952eb1
--- /dev/null
+++ b/sd/qa/unit/data/xml/tdf92001_0.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0"?>
+<XShapes>
+ <XShape positionX="4826" positionY="4826" sizeX="19557" sizeY="12953" type="com.sun.star.drawing.CustomShape" fontHeight="18.000000" fontColor="000000" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="CENTER" textLeftDistance="325" textRightDistance="325" textUpperDistance="200" textLowerDistance="200" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" fillStyle="SOLID" fillColor="729fcf" fillTransparence="0" fillTransparenceGradientName="">
+ <FillTransparenceGradient style="LINEAR" startColor="000000" endColor="000000" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillGradient style="LINEAR" startColor="3465a4" endColor="ffffff" angle="0" border="0" xOffset="50" yOffset="50" startIntensity="100" endIntensity="100" stepCount="0"/>
+ <FillHatch style="SINGLE" color="3465a4" distance="20" angle="0"/>
+ <FillBitmap width="32" height="32"/>
+ <LineDash style="RECT" dots="1" dotLen="20" dashes="1" dashLen="20" distance="20"/>
+ <LineStart/>
+ <LineEnd/>
+ <Transformation>
+ <Line1 column1="19558.000000" column2="0.000000" column3="4826.000000"/>
+ <Line2 column1="0.000000" column2="12954.000000" column3="4826.000000"/>
+ <Line3 column1="0.000000" column2="0.000000" column3="1.000000"/>
+ </Transformation>
+ <CustomShapeGeometry>
+ <PropertyValue name="AdjustmentValues">
+ <AdjustmentValues>
+ <EnhancedCustomShapeAdjustmentValue value="47433" propertyState="DIRECT_VALUE"/>
+ <EnhancedCustomShapeAdjustmentValue value="90654" propertyState="DIRECT_VALUE"/>
+ </AdjustmentValues>
+ </PropertyValue>
+ <PropertyValue name="Equations" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Handles" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredX" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="MirroredY" value="false" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Path">
+ <Path>
+ <PropertyValue name="Coordinates">
+ <Coordinates>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="8" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="0" type="0"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="14" type="1"/>
+ <Second value="7" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="13" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="5" type="1"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ <EnhancedCustomShapeParameterPair>
+ <First value="0" type="0"/>
+ <Second value="9" type="1"/>
+ </EnhancedCustomShapeParameterPair>
+ </Coordinates>
+ </PropertyValue>
+ <PropertyValue name="Segments">
+ <Segments>
+ <EnhancedCustomShapeSegment command="1" count="1"/>
+ <EnhancedCustomShapeSegment command="2" count="6"/>
+ <EnhancedCustomShapeSegment command="4" count="0"/>
+ <EnhancedCustomShapeSegment command="5" count="0"/>
+ </Segments>
+ </PropertyValue>
+ <PropertyValue name="TextFrames" handle="0" propertyState="DIRECT_VALUE"/>
+ </Path>
+ </PropertyValue>
+ <PropertyValue name="TextCameraZRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="TextPreRotateAngle" value="0" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="Type" value="ooxml-rightArrow" handle="0" propertyState="DIRECT_VALUE"/>
+ <PropertyValue name="ViewBox">
+ <ViewBox x="0" y="0" width="0" height="0"/>
+ </PropertyValue>
+ </CustomShapeGeometry>
+ </XShape>
+</XShapes>
diff --git a/sd/qa/unit/dialogs-test.cxx b/sd/qa/unit/dialogs-test.cxx
new file mode 100644
index 000000000..c6e904198
--- /dev/null
+++ b/sd/qa/unit/dialogs-test.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 <memory>
+#include <sal/config.h>
+#include <test/screenshot_test.hxx>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/presentation/AnimationEffect.hpp>
+#include <com/sun/star/presentation/ClickAction.hpp>
+
+#include <svl/intitem.hxx>
+#include <svl/stritem.hxx>
+#include <editeng/colritem.hxx>
+#include <svx/xfillit0.hxx>
+#include <vcl/svapp.hxx>
+
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+
+#include <sdabstdlg.hxx>
+#include <sdpage.hxx>
+#include <unomodel.hxx>
+#include <ViewShell.hxx>
+#include <drawview.hxx>
+#include <sdattr.hrc>
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <sdattr.hxx>
+
+using namespace ::com::sun::star;
+
+/// Test opening a dialog in sd
+class SdDialogsTest : public ScreenshotTest
+{
+private:
+ /// Document and ComponentContext
+ uno::Reference<lang::XComponent> mxComponent;
+
+ /// initially created SdAbstractDialogFactory and pointer to document
+ SdAbstractDialogFactory* mpFact;
+ SdXImpressDocument* mpImpressDocument;
+
+ /// on-demand created instances required for various dialogs to open
+ ::sd::DrawDocShell* mpDocShell;
+ ::sd::ViewShell* mpViewShell;
+ ::sd::DrawView* mpDrawView;
+
+ std::unique_ptr<SfxItemSet> mpSfxItemSetFromSdrObject;
+ std::unique_ptr<SfxItemSet> mpEmptySfxItemSet;
+ std::unique_ptr<SfxItemSet> mpEmptyFillStyleSfxItemSet;
+
+ /// helpers
+ SdAbstractDialogFactory* getSdAbstractDialogFactory();
+ SdXImpressDocument* getSdXImpressDocument();
+ ::sd::DrawDocShell* getDocShell();
+ ::sd::ViewShell* getViewShell();
+ ::sd::DrawView* getDrawView();
+ const SfxItemSet& getSfxItemSetFromSdrObject();
+ const SfxItemSet& getEmptySfxItemSet();
+ const SfxItemSet& getEmptyFillStyleSfxItemSet();
+
+ /// helper method to populate KnownDialogs, called in setUp(). Needs to be
+ /// written and has to add entries to KnownDialogs
+ virtual void registerKnownDialogsByID(mapType& rKnownDialogs) override;
+
+ /// dialog creation for known dialogs by ID. Has to be implemented for
+ /// each registered known dialog
+ virtual VclPtr<VclAbstractDialog> createDialogByID(sal_uInt32 nID) override;
+
+public:
+ SdDialogsTest();
+
+ virtual void setUp() override;
+
+ void tearDown() override;
+
+ // try to open a dialog
+ void openAnyDialog();
+
+ CPPUNIT_TEST_SUITE(SdDialogsTest);
+ CPPUNIT_TEST(openAnyDialog);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+SdDialogsTest::SdDialogsTest()
+: mxComponent(),
+ mpFact(nullptr),
+ mpImpressDocument(nullptr),
+ mpDocShell(nullptr),
+ mpViewShell(nullptr),
+ mpDrawView(nullptr)
+{
+}
+
+void SdDialogsTest::setUp()
+{
+ ScreenshotTest::setUp();
+
+ mpFact = SdAbstractDialogFactory::Create();
+ mxComponent = loadFromDesktop("private:factory/simpress", "com.sun.star.presentation.PresentationDocument");
+
+ mpImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ CPPUNIT_ASSERT(mpImpressDocument);
+}
+
+void SdDialogsTest::tearDown()
+{
+ mpSfxItemSetFromSdrObject.reset();
+ mpEmptySfxItemSet.reset();
+ mpEmptyFillStyleSfxItemSet.reset();
+ mxComponent->dispose();
+ ScreenshotTest::tearDown();
+}
+
+SdAbstractDialogFactory* SdDialogsTest::getSdAbstractDialogFactory()
+{
+ return mpFact;
+}
+
+SdXImpressDocument* SdDialogsTest::getSdXImpressDocument()
+{
+ return mpImpressDocument;
+}
+
+::sd::DrawDocShell* SdDialogsTest::getDocShell()
+{
+ if (!mpDocShell)
+ {
+ mpDocShell = getSdXImpressDocument()->GetDocShell();
+ CPPUNIT_ASSERT(mpDocShell);
+ }
+
+ return mpDocShell;
+}
+
+::sd::ViewShell* SdDialogsTest::getViewShell()
+{
+ if (!mpViewShell)
+ {
+ mpViewShell = getDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(mpViewShell);
+ }
+
+ return mpViewShell;
+}
+
+::sd::DrawView* SdDialogsTest::getDrawView()
+{
+ if (!mpDrawView)
+ {
+ mpDrawView = dynamic_cast<::sd::DrawView*>(getViewShell()->GetDrawView());
+ CPPUNIT_ASSERT(mpDrawView);
+ }
+
+ return mpDrawView;
+}
+
+const SfxItemSet& SdDialogsTest::getSfxItemSetFromSdrObject()
+{
+ if (!mpSfxItemSetFromSdrObject)
+ {
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+ SdPage* pSdPage = pDrawDoc->GetSdPage(0, PageKind::Standard);
+ CPPUNIT_ASSERT(pSdPage);
+ SdrObject* pSdrObj = pSdPage->GetObj(0);
+ CPPUNIT_ASSERT(pSdrObj);
+ mpSfxItemSetFromSdrObject.reset( new SfxItemSet( pSdrObj->GetMergedItemSet() ) );
+ CPPUNIT_ASSERT(mpSfxItemSetFromSdrObject);
+ }
+
+ return *mpSfxItemSetFromSdrObject;
+}
+
+const SfxItemSet& SdDialogsTest::getEmptySfxItemSet()
+{
+ if (!mpEmptySfxItemSet)
+ {
+ // needs an SfxItemSet, use the one from the 1st object
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+ mpEmptySfxItemSet.reset( new SfxItemSet(pDrawDoc->GetItemPool()) );
+ CPPUNIT_ASSERT(mpEmptySfxItemSet);
+ }
+
+ return *mpEmptySfxItemSet;
+}
+
+const SfxItemSet& SdDialogsTest::getEmptyFillStyleSfxItemSet()
+{
+ if (!mpEmptyFillStyleSfxItemSet)
+ {
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+ mpEmptyFillStyleSfxItemSet.reset( new SfxItemSet(pDrawDoc->GetItemPool(), svl::Items<XATTR_FILL_FIRST, XATTR_FILL_LAST>) );
+ CPPUNIT_ASSERT(mpEmptyFillStyleSfxItemSet);
+ mpEmptyFillStyleSfxItemSet->Put(XFillStyleItem(drawing::FillStyle_NONE));
+ }
+
+ return *mpEmptyFillStyleSfxItemSet;
+}
+
+void SdDialogsTest::registerKnownDialogsByID(mapType& rKnownDialogs)
+{
+ // fill map of known dialogs
+ rKnownDialogs["modules/simpress/ui/publishingdialog.ui"] = 0;
+ rKnownDialogs["modules/sdraw/ui/breakdialog.ui"] = 1;
+ rKnownDialogs["modules/sdraw/ui/copydlg.ui"] = 2;
+ rKnownDialogs["modules/simpress/ui/customslideshows.ui"] = 3;
+ rKnownDialogs["modules/sdraw/ui/drawchardialog.ui"] = 4;
+ rKnownDialogs["modules/sdraw/ui/drawpagedialog.ui"] = 5;
+ rKnownDialogs["modules/simpress/ui/dlgfield.ui"] = 6;
+ rKnownDialogs["modules/sdraw/ui/dlgsnap.ui"] = 7;
+ rKnownDialogs["modules/sdraw/ui/insertlayer.ui"] = 8;
+ rKnownDialogs["modules/sdraw/ui/insertslidesdialog.ui"] = 9;
+ rKnownDialogs["modules/sdraw/ui/crossfadedialog.ui"] = 10;
+ rKnownDialogs["modules/sdraw/ui/bulletsandnumbering.ui"] = 11;
+ rKnownDialogs["modules/sdraw/ui/drawparadialog.ui"] = 12;
+ rKnownDialogs["modules/simpress/ui/presentationdialog.ui"] = 13;
+ rKnownDialogs["modules/simpress/ui/remotedialog.ui"] = 14;
+ rKnownDialogs["modules/sdraw/ui/drawprtldialog.ui"] = 15;
+ rKnownDialogs["modules/simpress/ui/slidedesigndialog.ui"] = 16;
+ rKnownDialogs["modules/simpress/ui/templatedialog.ui"] = 17;
+ rKnownDialogs["modules/simpress/ui/interactiondialog.ui"] = 18;
+ rKnownDialogs["modules/sdraw/ui/vectorize.ui"] = 19;
+ rKnownDialogs["modules/simpress/ui/photoalbum.ui"] = 20;
+ rKnownDialogs["modules/simpress/ui/masterlayoutdlg.ui"] = 21;
+ rKnownDialogs["modules/simpress/ui/headerfooterdialog.ui"] = 22;
+}
+
+VclPtr<VclAbstractDialog> SdDialogsTest::createDialogByID(sal_uInt32 nID)
+{
+ VclPtr<VclAbstractDialog> pRetval;
+
+ if (getSdAbstractDialogFactory())
+ {
+ switch (nID)
+ {
+ case 0:
+ {
+ // CreateSdPublishingDlg(vcl::Window* pWindow, DocumentType eDocType) override;
+ // this dialog does not need much, not even a SdDrawDocument. OTOH
+ // it is more a 'wizard' in that it has prev/next buttons and implicitly
+ // multiple pages. To make use of that it is necessary that the implementation
+ // supports the 'Screenshot interface'
+ pRetval = getSdAbstractDialogFactory()->CreateSdPublishingDlg(
+ Application::GetDefDialogParent(),
+ DocumentType::Impress);
+ break;
+ }
+ case 1:
+ {
+ // CreateBreakDlg(weld::Window* pWindow, ::sd::DrawView* pDrView, ::sd::DrawDocShell* pShell, sal_uLong nSumActionCount, sal_uLong nObjCount) override;
+ // this dialog requires pDrawView. It does not show much when
+ // there is no object selected that can be broken up. For better
+ // results it might be necessary to add/select an object that
+ // delivers a good metafile (which is the base for breaking)
+ pRetval = getSdAbstractDialogFactory()->CreateBreakDlg(
+ Application::GetDefDialogParent(),
+ getDrawView(),
+ getDocShell(),
+ 0,
+ 0);
+ break;
+ }
+ case 2:
+ {
+ // needs an SfxItemSet, use the one from the 1st object
+ pRetval = getSdAbstractDialogFactory()->CreateCopyDlg(
+ getViewShell()->GetFrameWeld(),
+ getSfxItemSetFromSdrObject(),
+ getDrawView());
+ break;
+ }
+ case 3:
+ {
+ // CreateSdCustomShowDlg(SdDrawDocument& rDrawDoc) = 0;
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+
+ pRetval = getSdAbstractDialogFactory()->CreateSdCustomShowDlg(
+ getViewShell()->GetFrameWeld(), *pDrawDoc);
+ break;
+ }
+ case 4:
+ {
+ // CreateSdTabCharDialog(const SfxItemSet* pAttr, SfxObjectShell* pDocShell) override;
+ // needs an SfxItemSet, use an empty constructed one
+ // needs a 'SfxObjectShell* pDocShell', crashes without
+ pRetval = getSdAbstractDialogFactory()->CreateSdTabCharDialog(
+ getViewShell()->GetFrameWeld(),
+ &getEmptySfxItemSet(),
+ getDocShell());
+ break;
+ }
+ case 5:
+ {
+ // CreateSdTabPageDialog(const SfxItemSet* pAttr, SfxObjectShell* pDocShell, bool bAreaPage = true, bool bIsImpressDoc) override;
+ // needs a special SfxItemSet with merged content from page and other stuff, crashes without that (2nd page)
+ // needs a 'SfxObjectShell* pDocShell', crashes without. Also sufficient: FillStyleItemSet with XFILL_NONE set
+ pRetval = getSdAbstractDialogFactory()->CreateSdTabPageDialog(
+ getViewShell()->GetFrameWeld(),
+ &getEmptyFillStyleSfxItemSet(),
+ getDocShell(),
+ true, /*bIsImpressDoc=*/false, /*bIsImpressMaster=*/false);
+ break;
+ }
+ case 6:
+ {
+ // CreateSdModifyFieldDlg(weld::Window* pWindow, const SvxFieldData* pInField, const SfxItemSet& rSet) override;
+ pRetval = getSdAbstractDialogFactory()->CreateSdModifyFieldDlg(
+ getViewShell()->GetFrameWeld(),
+ nullptr,
+ getEmptySfxItemSet());
+ break;
+ }
+ case 7:
+ {
+ // CreateSdSnapLineDlg(const SfxItemSet& rInAttrs, ::sd::View* pView) override;
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+ SfxItemSet aNewAttr(pDrawDoc->GetItemPool(), svl::Items<ATTR_SNAPLINE_START, ATTR_SNAPLINE_END>);
+ aNewAttr.Put(SfxInt32Item(ATTR_SNAPLINE_X, 0));
+ aNewAttr.Put(SfxInt32Item(ATTR_SNAPLINE_Y, 0));
+ pRetval = getSdAbstractDialogFactory()->CreateSdSnapLineDlg(
+ getViewShell()->GetFrameWeld(),
+ aNewAttr,
+ getDrawView());
+ break;
+ }
+ case 8:
+ {
+ // CreateSdInsertLayerDlg(const SfxItemSet& rInAttrs, bool bDeletable, const OUString& aStr) override;
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+ SfxItemSet aNewAttr(pDrawDoc->GetItemPool(), svl::Items<ATTR_LAYER_START, ATTR_LAYER_END>);
+ const OUString aLayerName = SdResId(STR_LAYER); // + OUString::number(2);
+ aNewAttr.Put(makeSdAttrLayerName(aLayerName));
+ aNewAttr.Put(makeSdAttrLayerTitle());
+ aNewAttr.Put(makeSdAttrLayerDesc());
+ aNewAttr.Put(makeSdAttrLayerVisible());
+ aNewAttr.Put(makeSdAttrLayerPrintable());
+ aNewAttr.Put(makeSdAttrLayerLocked());
+ aNewAttr.Put(makeSdAttrLayerThisPage());
+ pRetval = getSdAbstractDialogFactory()->CreateSdInsertLayerDlg(
+ getViewShell()->GetFrameWeld(),
+ aNewAttr,
+ true, // alternative: false
+ SdResId(STR_INSERTLAYER) /* alternative: STR_MODIFYLAYER */);
+ break;
+ }
+ case 9:
+ {
+ // CreateSdInsertPagesObjsDlg(const SdDrawDocument* pDoc, SfxMedium* pSfxMedium, const OUString& rFileName) override;
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+ pRetval = getSdAbstractDialogFactory()->CreateSdInsertPagesObjsDlg(
+ getViewShell()->GetFrameWeld(),
+ pDrawDoc,
+ nullptr,
+ "foo");
+ break;
+ }
+ case 10:
+ {
+ // CreateMorphDlg(weld::Window* pParent, const SdrObject* pObj1, const SdrObject* pObj2) override;
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+ SdPage* pSdPage = pDrawDoc->GetSdPage(0, PageKind::Standard);
+ CPPUNIT_ASSERT(pSdPage);
+ SdrObject* pSdrObj = pSdPage->GetObj(0);
+ // using one SdrObject is okay, none crashes
+ CPPUNIT_ASSERT(pSdrObj);
+ pRetval = getSdAbstractDialogFactory()->CreateMorphDlg(
+ Application::GetDefDialogParent(),
+ pSdrObj,
+ pSdrObj);
+ break;
+ }
+ case 11:
+ {
+ // CreateSdOutlineBulletTabDlg(const SfxItemSet* pAttr, ::sd::View* pView = nullptr) override;
+ pRetval = getSdAbstractDialogFactory()->CreateSdOutlineBulletTabDlg(
+ Application::GetDefDialogParent(),
+ &getEmptySfxItemSet(),
+ getDrawView());
+ break;
+ }
+ case 12:
+ {
+ // CreateSdParagraphTabDlg(const SfxItemSet* pAttr) override;
+ pRetval = getSdAbstractDialogFactory()->CreateSdParagraphTabDlg(
+ getViewShell()->GetFrameWeld(),
+ &getEmptySfxItemSet());
+ break;
+ }
+ case 13:
+ {
+ // CreateSdStartPresentationDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, const std::vector<OUString> &rPageNames, SdCustomShowList* pCSList) override;
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+ SfxItemSet aDlgSet(pDrawDoc->GetItemPool(), svl::Items<ATTR_PRESENT_START, ATTR_PRESENT_END>);
+ ::sd::PresentationSettings& rPresentationSettings = pDrawDoc->getPresentationSettings();
+ aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_ALL, rPresentationSettings.mbAll));
+ aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_CUSTOMSHOW, rPresentationSettings.mbCustomShow));
+ aDlgSet.Put(SfxStringItem(ATTR_PRESENT_DIANAME, OUString()));
+ aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_ENDLESS, rPresentationSettings.mbEndless));
+ aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_MANUEL, rPresentationSettings.mbManual));
+ aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_MOUSE, rPresentationSettings.mbMouseVisible));
+ aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_PEN, rPresentationSettings.mbMouseAsPen));
+ aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_ANIMATION_ALLOWED, rPresentationSettings.mbAnimationAllowed));
+ aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_CHANGE_PAGE, !rPresentationSettings.mbLockedPages));
+ aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_ALWAYS_ON_TOP, rPresentationSettings.mbAlwaysOnTop));
+ aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_FULLSCREEN, rPresentationSettings.mbFullScreen));
+ aDlgSet.Put(SfxUInt32Item(ATTR_PRESENT_PAUSE_TIMEOUT, rPresentationSettings.mnPauseTimeout));
+ aDlgSet.Put(SfxBoolItem(ATTR_PRESENT_SHOW_PAUSELOGO, rPresentationSettings.mbShowPauseLogo));
+ //SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress);
+ aDlgSet.Put(SfxInt32Item(ATTR_PRESENT_DISPLAY, 0 /*pOptions->GetDisplay()*/));
+ pRetval = getSdAbstractDialogFactory()->CreateSdStartPresentationDlg(
+ Application::GetDefDialogParent(),
+ aDlgSet,
+ std::vector<OUString>(),
+ nullptr);
+ break;
+ }
+ case 14:
+ {
+ // CreateRemoteDialog(vcl::Window* pWindow) override; // ad for RemoteDialog
+ pRetval = getSdAbstractDialogFactory()->CreateRemoteDialog(
+ Application::GetDefDialogParent());
+ break;
+ }
+ case 15:
+ {
+ // CreateSdPresLayoutTemplateDlg(SfxObjectShell* pDocSh, weld::Window* pParent, const SdResId& DlgId, SfxStyleSheetBase& rStyleBase, PresentationObjects ePO, SfxStyleSheetBasePool* pSSPool) override;
+ // use STR_PSEUDOSHEET_TITLE configuration, see futempl.cxx for more possible configurations
+ // may be nicer on the long run to take a configuration which represents a selected SdrObject
+ SfxStyleSheetBasePool* pStyleSheetPool = getDocShell()->GetStyleSheetPool();
+ CPPUNIT_ASSERT(pStyleSheetPool);
+ SfxStyleSheetBase* pStyleSheet = pStyleSheetPool->First(SfxStyleFamily::Page);
+ CPPUNIT_ASSERT(pStyleSheet);
+ pRetval = getSdAbstractDialogFactory()->CreateSdPresLayoutTemplateDlg(
+ getDocShell(),
+ Application::GetDefDialogParent(),
+ false,
+ *pStyleSheet,
+ PresentationObjects::Title,
+ pStyleSheetPool);
+ break;
+ }
+ case 16:
+ {
+ // CreateSdPresLayoutDlg(::sd::DrawDocShell* pDocShell, vcl::Window* pWindow, const SfxItemSet& rInAttrs) override;
+ pRetval = getSdAbstractDialogFactory()->CreateSdPresLayoutDlg(
+ Application::GetDefDialogParent(),
+ getDocShell(),
+ getEmptySfxItemSet());
+ break;
+ }
+ case 17:
+ {
+ // CreateSdTabTemplateDlg(const SfxObjectShell* pDocShell, SfxStyleSheetBase& rStyleBase, SdrModel* pModel, SdrView* pView) override;
+ // pretty similar to CreateSdPresLayoutTemplateDlg, see above
+ // may be nicer on the long run to take a configuration which represents a selected SdrObject
+ SfxStyleSheetBasePool* pStyleSheetPool = getDocShell()->GetStyleSheetPool();
+ CPPUNIT_ASSERT(pStyleSheetPool);
+ SfxStyleSheetBase* pStyleSheet = pStyleSheetPool->First(SfxStyleFamily::Pseudo);
+ CPPUNIT_ASSERT(pStyleSheet);
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+ pRetval = getSdAbstractDialogFactory()->CreateSdTabTemplateDlg(
+ getViewShell()->GetFrameWeld(),
+ getDocShell(),
+ *pStyleSheet,
+ pDrawDoc,
+ getDrawView());
+ break;
+ }
+ case 18:
+ {
+ // CreatSdActionDialog(const SfxItemSet* pAttr, ::sd::View* pView) override;
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+ SfxItemSet aSet(pDrawDoc->GetItemPool(), svl::Items<ATTR_ANIMATION_START, ATTR_ACTION_END>);
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_ACTIVE, false));
+ aSet.Put(SfxUInt16Item(ATTR_ANIMATION_EFFECT, sal_uInt16(presentation::AnimationEffect_NONE)));
+ aSet.Put(SfxUInt16Item(ATTR_ANIMATION_TEXTEFFECT, sal_uInt16(presentation::AnimationEffect_NONE)));
+ aSet.InvalidateItem(ATTR_ANIMATION_SPEED);
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_FADEOUT, false));
+ aSet.Put(SvxColorItem(COL_LIGHTGRAY, ATTR_ANIMATION_COLOR));
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_INVISIBLE, false));
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_SOUNDON, false));
+ aSet.InvalidateItem(ATTR_ANIMATION_SOUNDFILE);
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_PLAYFULL, false));
+ aSet.Put(SfxUInt16Item(ATTR_ACTION, sal_uInt16(presentation::ClickAction_NONE)));
+ aSet.InvalidateItem(ATTR_ACTION_FILENAME);
+ aSet.Put(SfxUInt16Item(ATTR_ACTION_EFFECT, sal_uInt16(presentation::AnimationEffect_NONE)));
+ aSet.InvalidateItem(ATTR_ACTION_EFFECTSPEED);
+ aSet.Put(SfxBoolItem(ATTR_ACTION_SOUNDON, false));
+ aSet.Put(SfxBoolItem(ATTR_ACTION_PLAYFULL, false));
+ pRetval = getSdAbstractDialogFactory()->CreatSdActionDialog(
+ getViewShell()->GetFrameWeld(),
+ &aSet,
+ getDrawView());
+ break;
+ }
+ case 19:
+ {
+ // CreateSdVectorizeDlg(weld::Window* pParent, const Bitmap& rBmp, ::sd::DrawDocShell* pDocShell) override;
+ // works well with empty Bitmap, but my be nicer with setting one
+ Bitmap aEmptyBitmap;
+ pRetval = getSdAbstractDialogFactory()->CreateSdVectorizeDlg(
+ Application::GetDefDialogParent(),
+ aEmptyBitmap,
+ getDocShell());
+ break;
+ }
+ case 20:
+ {
+ // CreateSdPhotoAlbumDialog(weld::Window* pWindow, SdDrawDocument* pDoc) override;
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+ pRetval = getSdAbstractDialogFactory()->CreateSdPhotoAlbumDialog(
+ Application::GetDefDialogParent(),
+ pDrawDoc);
+ break;
+ }
+ case 21:
+ {
+ // CreateMasterLayoutDialog(weld::Window* pParent, SdDrawDocument* pDoc, SdPage*) override;
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+ SdPage* pSdPage = pDrawDoc->GetSdPage(0, PageKind::Standard);
+ CPPUNIT_ASSERT(pSdPage);
+ pRetval = getSdAbstractDialogFactory()->CreateMasterLayoutDialog(
+ Application::GetDefDialogParent(),
+ pDrawDoc,
+ pSdPage);
+ break;
+ }
+ case 22:
+ {
+ // CreateHeaderFooterDialog(sd::ViewShell* pViewShell, weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage) override;
+ // This is a hard case, for two reasons:
+ // - It uses BaseClass TabPage which has a very sparse interface,
+ // need to add 'Screenshot interface' there and implement
+ // - The concrete dialog has two TabPages which use the *same*
+ // .ui file, so extended markup will be needed to differ these two
+ // cases
+ SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc();
+ CPPUNIT_ASSERT(pDrawDoc);
+ SdPage* pSdPage = pDrawDoc->GetSdPage(0, PageKind::Standard);
+ CPPUNIT_ASSERT(pSdPage);
+ pRetval = getSdAbstractDialogFactory()->CreateHeaderFooterDialog(
+ getViewShell(),
+ Application::GetDefDialogParent(),
+ pDrawDoc,
+ pSdPage);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ return pRetval;
+}
+
+void SdDialogsTest::openAnyDialog()
+{
+ /// example how to process an input file containing the UXMLDescriptions of the dialogs
+ /// to dump
+ if (true)
+ {
+ processDialogBatchFile(u"sd/qa/unit/data/dialogs-test.txt");
+ }
+
+ /// example how to dump all known dialogs
+ if ((false))
+ {
+ processAllKnownDialogs();
+ }
+
+ /// example how to dump exactly one known dialog
+ if ((false))
+ {
+ // example for SfxTabDialog: 5 -> "modules/sdraw/ui/drawpagedialog.ui"
+ // example for TabDialog: 22 -> "modules/simpress/ui/headerfooterdialog.ui"
+ // example for self-adapted wizard: 0 -> "modules/simpress/ui/publishingdialog.ui"
+ ScopedVclPtr<VclAbstractDialog> pDlg(createDialogByID(5));
+
+ if (pDlg)
+ {
+ // known dialog, dump screenshot to path
+ dumpDialogToPath(*pDlg);
+ }
+ else
+ {
+ // unknown dialog, should not happen in this basic loop.
+ // You have probably forgotten to add a case and
+ // implementation to createDialogByID, please do this
+ }
+ }
+
+ /// example how to dump a dialog using fallback functionality
+ if ((false))
+ {
+ // unknown dialog, try fallback to generic created
+ // VclBuilder-generated instance. Keep in mind that Dialogs
+ // using this mechanism will probably not be layouted well
+ // since the setup/initialization part is missing. Thus,
+ // only use for fallback when only the UI file is available.
+ //
+ // Take any example here, it's only for demonstration - using
+ // even a known one to demonstrate the fallback possibility
+ dumpDialogToPath("modules/sdraw/ui/breakdialog.ui");
+ }
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdDialogsTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/export-tests-ooxml1.cxx b/sd/qa/unit/export-tests-ooxml1.cxx
new file mode 100644
index 000000000..965ffe7c1
--- /dev/null
+++ b/sd/qa/unit/export-tests-ooxml1.cxx
@@ -0,0 +1,1894 @@
+/* -*- 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 <officecfg/Office/Common.hxx>
+#include "sdmodeltestbase.hxx"
+#include <Outliner.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/editobj.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/escapementitem.hxx>
+#include <editeng/colritem.hxx>
+#include <editeng/fontitem.hxx>
+#include <editeng/wghtitem.hxx>
+#include <editeng/numitem.hxx>
+#include <editeng/postitem.hxx>
+
+#include <oox/drawingml/drawingmltypes.hxx>
+
+#include <svx/svdoashp.hxx>
+#include <svx/svdogrp.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/sdooitm.hxx>
+#include <svx/sdmetitm.hxx>
+#include <unotools/mediadescriptor.hxx>
+
+#include <com/sun/star/awt/FontDescriptor.hpp>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/drawing/LineDash.hpp>
+#include <com/sun/star/text/WritingMode2.hpp>
+#include <com/sun/star/table/BorderLine2.hpp>
+#include <com/sun/star/table/XMergeableCell.hpp>
+
+#include <svx/svdotable.hxx>
+#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+#include <rtl/uri.hxx>
+#include <vcl/filter/PngImageReader.hxx>
+
+using namespace css;
+
+class SdOOXMLExportTest1 : public SdModelTestBaseXML
+{
+public:
+ void testTdf149803();
+ void testTdf149311();
+ void testTdf149128();
+ void testTdf66228();
+ void testTdf147919();
+ void testTdf130165();
+ void testTdf124781();
+ void testTdf144914();
+ void testTdf124232();
+ void testTdf143624();
+ void testTdf142648();
+ void testTdf47365();
+ void testTdf125071();
+ void testTdf54037();
+ void testFdo90607();
+ void testTdf127237();
+ void testBnc887230();
+ void testBnc870233_1();
+ void testBnc870233_2();
+ void testN828390_4();
+ void testN828390_5();
+ void testFdo71961();
+ void testLostPlaceholders();
+ void testN828390();
+ void testBnc880763();
+ void testBnc862510_5();
+ void testBnc822347_EmptyBullet();
+ void testFdo83751();
+ void testFdo79731();
+ void testTableCellFillProperties();
+ void testBulletStartNumber();
+ void testLineStyle();
+ void testCellLeftAndRightMargin();
+ void testRightToLeftParaghraph();
+ void testTextboxWithHyperlink();
+ void testMergedCells();
+ void testTableCellBorder();
+ void testBulletColor();
+ void testBulletCharAndFont();
+ void testBulletMarginAndIndentation();
+ void testParaMarginAndindentation();
+ void testTdf111884();
+ void testTdf112633();
+ void testTdf128952();
+ void testTdf127090();
+ void testCustomXml();
+ void testTdf94238();
+ void testPictureTransparency();
+ void testTdf125554();
+ void testRoundtripOwnLineStyles();
+ void testRoundtripPrstDash();
+ void testDashOnHairline();
+ void testNarrationNonMediaShape();
+ void testCustomshapeBitmapfillSrcrect();
+ void testTdf100348FontworkBitmapFill();
+ void testTdf100348FontworkGradientGlow();
+ void testTdf128345FullTransparentGradient();
+ void testTdf128345GradientLinear();
+ void testTdf128345GradientRadial();
+ void testTdf128345GradientAxial();
+ void testTdf134969TransparencyOnColorGradient();
+ void testTdf136911();
+ void testArcTo();
+ void testNarrationMimeType();
+ void testTdf140865Wordart3D();
+ void testTdf124457();
+ void testPlaceholderFillAndOutlineExport();
+ void testTdf143126();
+ void testTdf143129();
+ void testTdf118045();
+ void testTdf137675();
+
+ CPPUNIT_TEST_SUITE(SdOOXMLExportTest1);
+
+ CPPUNIT_TEST(testTdf149803);
+ CPPUNIT_TEST(testTdf149311);
+ CPPUNIT_TEST(testTdf149128);
+ CPPUNIT_TEST(testTdf66228);
+ CPPUNIT_TEST(testTdf147919);
+ CPPUNIT_TEST(testTdf130165);
+ CPPUNIT_TEST(testTdf124781);
+ CPPUNIT_TEST(testTdf144914);
+ CPPUNIT_TEST(testTdf124232);
+ CPPUNIT_TEST(testTdf143624);
+ CPPUNIT_TEST(testTdf142648);
+ CPPUNIT_TEST(testTdf47365);
+ CPPUNIT_TEST(testTdf125071);
+ CPPUNIT_TEST(testTdf54037);
+ CPPUNIT_TEST(testFdo90607);
+ CPPUNIT_TEST(testTdf127237);
+ CPPUNIT_TEST(testBnc887230);
+ CPPUNIT_TEST(testBnc870233_1);
+ CPPUNIT_TEST(testBnc870233_2);
+ CPPUNIT_TEST(testN828390_4);
+ CPPUNIT_TEST(testN828390_5);
+ CPPUNIT_TEST(testFdo71961);
+ CPPUNIT_TEST(testLostPlaceholders);
+ CPPUNIT_TEST(testN828390);
+ CPPUNIT_TEST(testBnc880763);
+ CPPUNIT_TEST(testBnc862510_5);
+ CPPUNIT_TEST(testBnc822347_EmptyBullet);
+ CPPUNIT_TEST(testFdo83751);
+ CPPUNIT_TEST(testFdo79731);
+ CPPUNIT_TEST(testTableCellFillProperties);
+ CPPUNIT_TEST(testBulletStartNumber);
+ CPPUNIT_TEST(testLineStyle);
+ CPPUNIT_TEST(testCellLeftAndRightMargin);
+ CPPUNIT_TEST(testRightToLeftParaghraph);
+ CPPUNIT_TEST(testTextboxWithHyperlink);
+ CPPUNIT_TEST(testMergedCells);
+ CPPUNIT_TEST(testTableCellBorder);
+ CPPUNIT_TEST(testBulletColor);
+ CPPUNIT_TEST(testBulletCharAndFont);
+ CPPUNIT_TEST(testBulletMarginAndIndentation);
+ CPPUNIT_TEST(testParaMarginAndindentation);
+ CPPUNIT_TEST(testTdf111884);
+ CPPUNIT_TEST(testTdf112633);
+ CPPUNIT_TEST(testTdf128952);
+ CPPUNIT_TEST(testTdf127090);
+ CPPUNIT_TEST(testCustomXml);
+ CPPUNIT_TEST(testTdf94238);
+ CPPUNIT_TEST(testTdf125554);
+ CPPUNIT_TEST(testPictureTransparency);
+ CPPUNIT_TEST(testRoundtripOwnLineStyles);
+ CPPUNIT_TEST(testRoundtripPrstDash);
+ CPPUNIT_TEST(testDashOnHairline);
+ CPPUNIT_TEST(testNarrationNonMediaShape);
+ CPPUNIT_TEST(testCustomshapeBitmapfillSrcrect);
+ CPPUNIT_TEST(testTdf100348FontworkBitmapFill);
+ CPPUNIT_TEST(testTdf100348FontworkGradientGlow);
+ CPPUNIT_TEST(testTdf128345FullTransparentGradient);
+ CPPUNIT_TEST(testTdf128345GradientLinear);
+ CPPUNIT_TEST(testTdf128345GradientRadial);
+ CPPUNIT_TEST(testTdf128345GradientAxial);
+ CPPUNIT_TEST(testTdf134969TransparencyOnColorGradient);
+ CPPUNIT_TEST(testTdf136911);
+ CPPUNIT_TEST(testArcTo);
+ CPPUNIT_TEST(testNarrationMimeType);
+ CPPUNIT_TEST(testTdf140865Wordart3D);
+ CPPUNIT_TEST(testTdf124457);
+ CPPUNIT_TEST(testPlaceholderFillAndOutlineExport);
+ CPPUNIT_TEST(testTdf143126);
+ CPPUNIT_TEST(testTdf143129);
+ CPPUNIT_TEST(testTdf118045);
+ CPPUNIT_TEST(testTdf137675);
+
+ CPPUNIT_TEST_SUITE_END();
+
+ virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override
+ {
+ XmlTestTools::registerOOXMLNamespaces(pXmlXPathCtx);
+ }
+};
+
+namespace {
+
+template< typename ItemValue, typename ItemType >
+void checkFontAttributes( const SdrTextObj* pObj, ItemValue nVal, sal_uInt32 nId)
+{
+ CPPUNIT_ASSERT_MESSAGE( "no object", pObj != nullptr);
+ const EditTextObject& aEdit = pObj->GetOutlinerParaObject()->GetTextObject();
+ std::vector<EECharAttrib> rLst;
+ aEdit.GetCharAttribs(0, rLst);
+ for( std::vector<EECharAttrib>::reverse_iterator it = rLst.rbegin(); it!=rLst.rend(); ++it)
+ {
+ const ItemType* pAttrib = dynamic_cast<const ItemType *>((*it).pAttr);
+ if (pAttrib && pAttrib->Which() == nId)
+ {
+ CPPUNIT_ASSERT_EQUAL( nVal, static_cast<ItemValue>(pAttrib->GetValue()));
+ }
+ }
+}
+
+}
+
+void SdOOXMLExportTest1::testTdf149803()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf149803.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp", "useBgFill", "1");
+}
+
+void SdOOXMLExportTest1::testTdf149311()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf149311.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pRelsDoc = parseExport(tempFile, "ppt/slides/_rels/slide1.xml.rels");
+
+ assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']", "Target",
+ "slide2.xml");
+}
+
+void SdOOXMLExportTest1::testTdf149128()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf149128.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn", "id", "42");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn", "idx", "0");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:endCxn", "id", "43");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:endCxn", "idx", "2");
+}
+
+void SdOOXMLExportTest1::testTdf66228()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf66228.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:spPr/a:prstGeom", "prst",
+ "bentConnector3");
+}
+
+void SdOOXMLExportTest1::testTdf147919()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf147919.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[1]/p:spPr/a:prstGeom", "prst",
+ "bentConnector2");
+
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:spPr/a:prstGeom/a:avLst/a:gd", "name", "adj1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:spPr/a:prstGeom", "prst",
+ "bentConnector3");
+
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:xfrm", "flipH", "1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:xfrm", "rot", "16200000");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:prstGeom/a:avLst/a:gd[1]", "name", "adj1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:prstGeom/a:avLst/a:gd[2]", "name", "adj2");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[3]/p:spPr/a:prstGeom", "prst",
+ "bentConnector4");
+
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:xfrm", "flipH", "1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:xfrm", "flipV", "1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:xfrm", "rot", "10800000");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:prstGeom/a:avLst/a:gd[1]", "name", "adj1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:prstGeom/a:avLst/a:gd[2]", "name", "adj2");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:prstGeom/a:avLst/a:gd[3]", "name", "adj3");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[4]/p:spPr/a:prstGeom", "prst",
+ "bentConnector5");
+
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[5]/p:spPr/a:xfrm", "flipH", "1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[5]/p:spPr/a:xfrm", "rot", "16200000");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[5]/p:spPr/a:prstGeom", "prst",
+ "curvedConnector2");
+
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[6]/p:spPr/a:xfrm", "flipH", "1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[6]/p:spPr/a:xfrm", "rot", "16200000");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[6]/p:spPr/a:prstGeom/a:avLst/a:gd", "name", "adj1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[6]/p:spPr/a:prstGeom", "prst",
+ "curvedConnector3");
+
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:xfrm", "flipH", "1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:xfrm", "flipV", "1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:xfrm", "rot", "10800000");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:prstGeom/a:avLst/a:gd[1]", "name", "adj1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:prstGeom/a:avLst/a:gd[2]", "name", "adj2");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[7]/p:spPr/a:prstGeom", "prst",
+ "curvedConnector4");
+
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:xfrm", "flipV", "1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:xfrm", "rot", "16200000");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:prstGeom/a:avLst/a:gd[1]", "name", "adj1");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:prstGeom/a:avLst/a:gd[2]", "name", "adj2");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:prstGeom/a:avLst/a:gd[3]", "name", "adj3");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:cxnSp[8]/p:spPr/a:prstGeom", "prst",
+ "curvedConnector5");
+}
+
+void SdOOXMLExportTest1::testTdf130165()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf146223.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc, "/p:sld", "showMasterSp", "0");
+}
+
+void SdOOXMLExportTest1::testTdf124781()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf124781.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[1]/a:r[2]/a:rPr", "baseline",
+ "33000");
+
+ xmlDocUniquePtr pXmlDoc2 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc2, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[2]/a:r[2]/a:rPr", "baseline",
+ "-8000");
+}
+
+void SdOOXMLExportTest1::testTdf144914()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf144616.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvPr/a:hlinkClick", "action",
+ "ppaction://hlinkshowjump?jump=firstslide");
+
+ xmlDocUniquePtr pXmlDoc2 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvPr/a:hlinkClick", "action",
+ "ppaction://hlinkshowjump?jump=lastslide");
+
+ xmlDocUniquePtr pXmlDoc3 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc3, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:nvSpPr/p:cNvPr/a:hlinkClick", "action",
+ "ppaction://hlinkshowjump?jump=nextslide");
+
+ xmlDocUniquePtr pXmlDoc4 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc4, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:nvSpPr/p:cNvPr/a:hlinkClick", "action",
+ "ppaction://hlinkshowjump?jump=previousslide");
+
+ xmlDocUniquePtr pXmlDoc5 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc5, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:nvSpPr/p:cNvPr/a:hlinkClick", "action",
+ "ppaction://hlinksldjump");
+ xmlDocUniquePtr pRelsDoc5 = parseExport(tempFile, "ppt/slides/_rels/slide1.xml.rels");
+ assertXPath(pRelsDoc5, "/rels:Relationships/rels:Relationship[@Id='rId1']", "Target",
+ "slide2.xml");
+
+ xmlDocUniquePtr pXmlDoc6 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc6, "/p:sld/p:cSld/p:spTree/p:sp[6]/p:nvSpPr/p:cNvPr/a:hlinkClick", "action",
+ "ppaction://hlinkshowjump?jump=endshow");
+
+ xmlDocUniquePtr pXmlDoc7 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc7, "/p:sld/p:cSld/p:spTree/p:sp[7]/p:nvSpPr/p:cNvPr/a:hlinkClick", "id",
+ "rId2");
+ xmlDocUniquePtr pRelsDoc7 = parseExport(tempFile, "ppt/slides/_rels/slide1.xml.rels");
+ assertXPath(pRelsDoc7, "/rels:Relationships/rels:Relationship[@Id='rId2']", "Target",
+ "http://www.example.com/");
+}
+
+void SdOOXMLExportTest1::testTdf124232()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf141704.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick", "action",
+ "ppaction://hlinkshowjump?jump=lastslide");
+
+ xmlDocUniquePtr pXmlDoc2 = parseExport(tempFile, "ppt/slides/slide2.xml");
+ assertXPath(pXmlDoc2, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick", "action",
+ "ppaction://hlinkshowjump?jump=nextslide");
+
+ xmlDocUniquePtr pXmlDoc3 = parseExport(tempFile, "ppt/slides/slide3.xml");
+ assertXPath(pXmlDoc3, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick", "action",
+ "ppaction://hlinkshowjump?jump=previousslide");
+
+ xmlDocUniquePtr pXmlDoc4 = parseExport(tempFile, "ppt/slides/slide4.xml");
+ assertXPath(pXmlDoc4, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick",
+ "id", "rId1");
+ xmlDocUniquePtr pRelsDoc4 = parseExport(tempFile, "ppt/slides/_rels/slide4.xml.rels");
+ assertXPath(pRelsDoc4, "/rels:Relationships/rels:Relationship[@Id='rId1']", "Target",
+ "http://www.example.com/");
+
+ xmlDocUniquePtr pXmlDoc5 = parseExport(tempFile, "ppt/slides/slide5.xml");
+ assertXPath(pXmlDoc5, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick",
+ "action", "ppaction://hlinksldjump");
+ xmlDocUniquePtr pRelsDoc5 = parseExport(tempFile, "ppt/slides/_rels/slide5.xml.rels");
+ assertXPath(pRelsDoc5, "/rels:Relationships/rels:Relationship[@Id='rId1']", "Target",
+ "slide6.xml");
+
+ xmlDocUniquePtr pXmlDoc6 = parseExport(tempFile, "ppt/slides/slide6.xml");
+ assertXPath(pXmlDoc6, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick",
+ "action", "ppaction://hlinkshowjump?jump=endshow");
+
+ xmlDocUniquePtr pXmlDoc7 = parseExport(tempFile, "ppt/slides/slide7.xml");
+ assertXPath(pXmlDoc7, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:cNvPr/a:hlinkClick",
+ "action", "ppaction://hlinkshowjump?jump=firstslide");
+}
+
+void SdOOXMLExportTest1::testTdf143624()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf143624.pptx"), PPTX );
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/presProps.xml");
+
+ assertXPath(pXmlDoc, "/p:presentationPr/p:showPr", "useTimings", "0");
+
+ assertXPath(pXmlDoc, "/p:presentationPr/p:showPr", "showNarration", "1");
+}
+
+void SdOOXMLExportTest1::testTdf142648()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf142648.pptx"), PPTX );
+ utl::TempFile tempFile;
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDPS(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XDrawPages> xDrawPages(xDPS->getDrawPages(), uno::UNO_SET_THROW);
+ uno::Reference<drawing::XDrawPage> xDrawPage;
+ xDrawPages->getByIndex(0) >>= xDrawPage;
+ uno::Reference<container::XNamed> xNamed(xDrawPage, uno::UNO_QUERY_THROW);
+ xNamed->setName("#Slide 1");
+
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pRelsDoc = parseExport(tempFile, "ppt/slides/_rels/slide2.xml.rels");
+
+ assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']", "Target",
+ "slide1.xml");
+}
+
+void SdOOXMLExportTest1::testTdf47365()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/loopNoPause.pptx"), PPTX );
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/presProps.xml");
+
+ assertXPath(pXmlDoc, "/p:presentationPr/p:showPr", "loop", "1");
+
+ assertXPath(pXmlDoc, "/p:presentationPr/p:showPr", "showNarration", "1");
+}
+
+void SdOOXMLExportTest1::testTdf125071()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf125071.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/presentation.xml");
+
+ assertXPath(pXmlDoc, "/p:presentation/p:custShowLst/p:custShow[1]", "name", "Custom1");
+ assertXPath(pXmlDoc, "/p:presentation/p:custShowLst/p:custShow[2]", "name", "Custom2");
+}
+
+void SdOOXMLExportTest1::testTdf54037()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf54037.pptx"), PPTX );
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ xmlDocUniquePtr pRelsDoc = parseExport(tempFile, "ppt/slides/_rels/slide1.xml.rels");
+
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[1]/a:r/a:rPr/a:hlinkClick",
+ "action", "ppaction://hlinksldjump");
+
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[2]/a:r/a:rPr/a:hlinkClick",
+ "action", "ppaction://hlinkshowjump?jump=nextslide");
+
+ assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']", "Target",
+ "slide2.xml");
+}
+
+void SdOOXMLExportTest1::testTdf127237()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf127237.pptx"), PPTX );
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ CPPUNIT_ASSERT(pPage != nullptr);
+
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pTableObj != nullptr);
+ uno::Reference< table::XCellRange > xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+
+ Color nFillColor;
+ uno::Reference< beans::XPropertySet > xCell(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nFillColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x0070C0), nFillColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testBnc887230()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc887230.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ const SdrTextObj *pObj = dynamic_cast<SdrTextObj *>( pPage->GetObj( 0 ) );
+ // Without the fix in place, this test would have failed with
+ //- Expected: 255
+ //- Actual : 13421823
+ checkFontAttributes<Color, SvxColorItem>( pObj, Color(0x0000ff), EE_CHAR_COLOR );
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testBnc870233_1()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc870233_1.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ // The problem was all shapes had the same font (the last parsed font attributes overwrote all previous ones)
+
+ // First shape has red, bold font
+ {
+ const SdrTextObj *pObj = dynamic_cast<SdrTextObj *>( pPage->GetObj( 0 ) );
+ checkFontAttributes<Color, SvxColorItem>( pObj, Color(0xff0000), EE_CHAR_COLOR );
+ checkFontAttributes<FontWeight, SvxWeightItem>( pObj, WEIGHT_BOLD, EE_CHAR_WEIGHT );
+ }
+
+ // Second shape has blue, italic font
+ {
+ const SdrTextObj *pObj = dynamic_cast<SdrTextObj *>( pPage->GetObj( 1 ) );
+ checkFontAttributes<Color, SvxColorItem>( pObj, Color(0x0000ff), EE_CHAR_COLOR);
+ checkFontAttributes<FontItalic, SvxPostureItem>( pObj, ITALIC_NORMAL, EE_CHAR_ITALIC);
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testBnc870233_2()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc870233_2.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ // The problem was in some SmartArts font color was wrong
+
+ // First smart art has blue font color (direct formatting)
+ {
+ const SdrObjGroup *pObjGroup = dynamic_cast<SdrObjGroup *>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pObjGroup);
+ const SdrTextObj *pObj = dynamic_cast<SdrTextObj *>(pObjGroup->GetSubList()->GetObj(1));
+ checkFontAttributes<Color, SvxColorItem>(pObj, Color(0x0000ff), EE_CHAR_COLOR);
+ }
+
+ // Second smart art has "dk2" font color (style)
+ {
+ const SdrObjGroup *pObjGroup = dynamic_cast<SdrObjGroup *>(pPage->GetObj(1));
+ CPPUNIT_ASSERT(pObjGroup);
+ const SdrTextObj *pObj = dynamic_cast<SdrTextObj *>(pObjGroup->GetSubList()->GetObj(1));
+ checkFontAttributes<Color, SvxColorItem>( pObj, Color(0x1f497d), EE_CHAR_COLOR );
+ }
+
+ // Third smart art has white font color (style)
+ {
+ const SdrObjGroup *pObjGroup = dynamic_cast<SdrObjGroup *>(pPage->GetObj(2));
+ CPPUNIT_ASSERT(pObjGroup);
+ const SdrTextObj *pObj = dynamic_cast<SdrTextObj *>(pObjGroup->GetSubList()->GetObj(1));
+ checkFontAttributes<Color, SvxColorItem>(pObj, Color(0xffffff), EE_CHAR_COLOR);
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testN828390_4()
+{
+ bool bPassed = false;
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/n828390_4.odp"), ODP );
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ {
+ std::vector<EECharAttrib> rLst;
+ SdrObject *pObj = pPage->GetObj(0);
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
+ CPPUNIT_ASSERT( pTxtObj );
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ aEdit.GetCharAttribs(0, rLst);
+ for( std::vector<EECharAttrib>::reverse_iterator it = rLst.rbegin(); it!=rLst.rend(); ++it)
+ {
+ const SvxFontHeightItem * pFontHeight = dynamic_cast<const SvxFontHeightItem *>((*it).pAttr);
+ if( pFontHeight && (*it).nStart == 18 )
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font height is wrong", static_cast<sal_uInt32>(1129), pFontHeight->GetHeight() );
+ const SvxFontItem *pFont = dynamic_cast<const SvxFontItem *>((*it).pAttr);
+ if( pFont )
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font is wrong", OUString("Arial"), pFont->GetFamilyName() );
+ bPassed = true;
+ }
+ const SvxWeightItem *pWeight = dynamic_cast<const SvxWeightItem *>((*it).pAttr);
+ if( pWeight && (*it).nStart == 18 )
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font Weight is wrong", WEIGHT_BOLD, pWeight->GetWeight() );
+ }
+ }
+ CPPUNIT_ASSERT(bPassed);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testN828390_5()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/n828390_5.odp"), ODP );
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ {
+ SdrObject *pObj = pPage->GetObj(0);
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
+ CPPUNIT_ASSERT( pTxtObj );
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ const SvxNumBulletItem& rNumFmt = aEdit.GetParaAttribs(3).Get(EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Bullet's relative size is wrong!", sal_uInt16(75), rNumFmt.GetNumRule().GetLevel(1).GetBulletRelSize() ); // != 25
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testLostPlaceholders()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/LostPlaceholder.odp"), ODP);
+ CPPUNIT_ASSERT(xDocShRef.is());
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ CPPUNIT_ASSERT(xDocShRef.is());
+
+ auto pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT(pDoc);
+ auto pPage = pDoc->GetPage(1);
+ CPPUNIT_ASSERT(pPage);
+ auto pObj = pPage->GetObj(1);
+ CPPUNIT_ASSERT(pObj);
+ uno::Reference<drawing::XShape> xShp (pObj->getUnoShape(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xShp);
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong ShapeType!", OUString(u"com.sun.star.presentation.OutlinerShape"), xShp->getShapeType());
+ uno::Reference<beans::XPropertySet> xShpProps(xShp, uno::UNO_QUERY);
+ // Without the fix in place there will be the following error:
+ // Expected: com.sun.star.presentation.OutlinerShape
+ // Actual: com.sun.star.drawing.CustomShape
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("It must be a placeholder!", true, xShpProps->getPropertyValue("IsPresentationObject").get<bool>());
+ // Without the fix in place this will the following:
+ // Expected: true
+ // Actual: false
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testPlaceholderFillAndOutlineExport()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/LostPlaceholderFill.odp"), ODP);
+
+ uno::Any aFillStyle;
+ uno::Any aFillColor;
+ uno::Any aLineStyle;
+ uno::Any aLineColor;
+
+ for (int i = 1; i <= 2; i++)
+ {
+ CPPUNIT_ASSERT(xDocShRef.is());
+
+ auto pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT(pDoc);
+ auto pPage = pDoc->GetPage(1);
+ CPPUNIT_ASSERT(pPage);
+ auto pObj = pPage->GetObj(1);
+ CPPUNIT_ASSERT(pObj);
+
+ uno::Reference<drawing::XShape> xShp(pObj->getUnoShape(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xShp);
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong ShapeType!", OUString(u"com.sun.star.presentation.OutlinerShape"), xShp->getShapeType());
+ uno::Reference<beans::XPropertySet> xShpProps(xShp, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("It must be a placeholder!", true, xShpProps->getPropertyValue("IsPresentationObject").get<bool>());
+
+ if (i == 1)
+ {
+ aFillStyle = xShpProps->getPropertyValue("FillStyle");
+ aFillColor = xShpProps->getPropertyValue("FillColor");
+
+ aLineStyle = xShpProps->getPropertyValue("LineStyle");
+ aLineColor = xShpProps->getPropertyValue("LineColor");
+
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ continue;
+ }
+ else
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("The Placeholder fillstyle has not been exported!", aFillStyle, xShpProps->getPropertyValue("FillStyle"));
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("The Placeholder fillcolor has not been exported!", aFillColor, xShpProps->getPropertyValue("FillColor"));
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("The Placeholder linestyle has not been exported!", aLineStyle, xShpProps->getPropertyValue("LineStyle"));
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("The Placeholder linecolor has not been exported!", aLineColor, xShpProps->getPropertyValue("LineColor"));
+ break;
+ }
+ }
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testFdo71961()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/fdo71961.odp"), ODP);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ // Export to .pptx changes all text frames to custom shape objects, which obey TextWordWrap property
+ // (which is false for text frames otherwise and is ignored). Check that frames that should wrap still do.
+ auto pTxtObj = pPage->GetObj( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL( OUString( "Text to be always wrapped" ), pTxtObj->GetOutlinerParaObject()->GetTextObject().GetText(0));
+ CPPUNIT_ASSERT_EQUAL( true, pTxtObj->GetMergedItem(SDRATTR_TEXT_WORDWRAP).GetValue());
+
+ pTxtObj = dynamic_cast<SdrObjCustomShape *>( pPage->GetObj( 2 ));
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL( OUString( "Custom shape non-wrapped text" ), pTxtObj->GetOutlinerParaObject()->GetTextObject().GetText(0));
+ CPPUNIT_ASSERT_EQUAL( false, pTxtObj->GetMergedItem(SDRATTR_TEXT_WORDWRAP).GetValue());
+
+ pTxtObj = dynamic_cast<SdrObjCustomShape *>( pPage->GetObj( 3 ));
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL( OUString( "Custom shape wrapped text" ), pTxtObj->GetOutlinerParaObject()->GetTextObject().GetText(0));
+ CPPUNIT_ASSERT_EQUAL( true, pTxtObj->GetMergedItem(SDRATTR_TEXT_WORDWRAP).GetValue());
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testN828390()
+{
+ bool bPassed = false;
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/n828390.pptx"), PPTX );
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ {
+ std::vector<EECharAttrib> rLst;
+ // Get the object
+ SdrObject *pObj = pPage->GetObj(0);
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
+ CPPUNIT_ASSERT( pTxtObj );
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ aEdit.GetCharAttribs(0, rLst);
+ bPassed = std::any_of(rLst.rbegin(), rLst.rend(),
+ [](const EECharAttrib& rCharAttr) {
+ const SvxEscapementItem *pFontEscapement = dynamic_cast<const SvxEscapementItem *>(rCharAttr.pAttr);
+ return pFontEscapement && (pFontEscapement->GetEsc() == -25);
+ });
+ }
+ CPPUNIT_ASSERT_MESSAGE("Subscript not exported properly", bPassed);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testBnc880763()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc880763.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ // Check z-order of the two shapes, use background color to identify them
+ // First object in the background has blue background color
+ const SdrObjGroup *pObjGroup = dynamic_cast<SdrObjGroup *>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pObjGroup);
+ const SdrObject *pObj = pObjGroup->GetSubList()->GetObj(1);
+ CPPUNIT_ASSERT_MESSAGE( "no object", pObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL( Color(0x0000ff),(static_cast< const XColorItem& >(pObj->GetMergedItem(XATTR_FILLCOLOR))).GetColorValue());
+
+ // Second object at the front has green background color
+ pObj = pPage->GetObj(1);
+ CPPUNIT_ASSERT_MESSAGE( "no object", pObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL( Color(0x00ff00),(static_cast< const XColorItem& >(pObj->GetMergedItem(XATTR_FILLCOLOR))).GetColorValue());
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testBnc862510_5()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc862510_5.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ // Same as testBnc870237, but here we check the horizontal spacing
+ const SdrObjGroup *pObjGroup = dynamic_cast<SdrObjGroup *>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pObjGroup);
+ const SdrObject* pObj = pObjGroup->GetSubList()->GetObj(2);
+ CPPUNIT_ASSERT_MESSAGE( "no object", pObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(0), pObj->GetMergedItem(SDRATTR_TEXT_UPPERDIST).GetValue());
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(0), pObj->GetMergedItem(SDRATTR_TEXT_LOWERDIST).GetValue());
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(7510), pObj->GetMergedItem(SDRATTR_TEXT_RIGHTDIST).GetValue());
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(0), pObj->GetMergedItem(SDRATTR_TEXT_LEFTDIST).GetValue());
+
+ xDocShRef->DoClose();
+}
+
+// In numbering a bullet could be defined as empty (no character).
+// When exporting to OOXML make sure that the bullet is ignored and
+// not written into the file.
+void SdOOXMLExportTest1::testBnc822347_EmptyBullet()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/bnc822347_EmptyBullet.odp"), ODP);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX);
+
+ SdDrawDocument* pDoc = xDocShRef->GetDoc();
+ SdrOutliner* pOutliner = pDoc->GetInternalOutliner();
+ const SdrPage* pPage = pDoc->GetPage(1);
+ SdrObject* pObject = pPage->GetObj(0);
+ SdrTextObj* pTextObject = dynamic_cast<SdrTextObj*>(pObject);
+ CPPUNIT_ASSERT(pTextObject);
+
+ OutlinerParaObject* pOutlinerParagraphObject = pTextObject->GetOutlinerParaObject();
+ const EditTextObject& aEdit = pOutlinerParagraphObject->GetTextObject();
+
+ OUString sText = aEdit.GetText(0);
+ CPPUNIT_ASSERT_EQUAL(OUString("M3 Feature Test"), sText);
+
+ pOutliner->SetText(*pOutlinerParagraphObject);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pOutliner->GetParagraphCount());
+
+ const sal_Int16 nDepth = pOutliner->GetDepth(0);
+
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(-1), nDepth); // depth >= 0 means that the paragraph has bullets enabled
+
+ xDocShRef->DoClose();
+}
+
+//Bullets not having any text following them are not getting exported to pptx correctly.
+void SdOOXMLExportTest1::testFdo90607()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/fdo90607.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pPage->GetObj(1) );
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
+ OutlinerParaObject* pOutlinerParagraphObject = pTxtObj->GetOutlinerParaObject();
+ const sal_Int16 nDepth = pOutlinerParagraphObject->GetDepth(0);
+ CPPUNIT_ASSERT_MESSAGE("not equal", nDepth != -1);
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testFdo83751()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/fdo83751.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr );
+
+ uno::Reference<document::XDocumentPropertiesSupplier> xDocumentPropertiesSupplier( xDocShRef->GetModel(), uno::UNO_QUERY );
+ uno::Reference<document::XDocumentProperties> xProps = xDocumentPropertiesSupplier->getDocumentProperties();
+ uno::Reference<beans::XPropertySet> xUDProps( xProps->getUserDefinedProperties(), uno::UNO_QUERY );
+ OUString propValue;
+ xUDProps->getPropertyValue("Testing") >>= propValue;
+ CPPUNIT_ASSERT_EQUAL(OUString("Document"), propValue);
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testFdo79731()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/fdo79731.odp"), ODP);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT(pDoc);
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testTableCellFillProperties()
+{
+ std::shared_ptr< comphelper::ConfigurationChanges > batch(comphelper::ConfigurationChanges::create());
+ officecfg::Office::Common::Cache::GraphicManager::TotalCacheSize::set(sal_Int32(1), batch);
+ batch->commit();
+
+ // Load the original file
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/Table_with_Cell_Fill.odp"), ODP);
+
+ // Export the document and import again for a check
+ uno::Reference< lang::XComponent > xComponent = xDocShRef->GetModel();
+ uno::Reference<frame::XStorable> xStorable(xComponent, uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OStringToOUString(std::string_view(aFileFormats[PPTX].pFilterName), RTL_TEXTENCODING_UTF8);
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+ xComponent.set(xStorable, uno::UNO_QUERY);
+ xComponent->dispose();
+ xDocShRef = loadURL(aTempFile.GetURL(), PPTX);
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT( pTableObj );
+ uno::Reference< table::XCellRange > xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+ uno::Reference< beans::XPropertySet > xCell;
+
+ // Test Solid fill color
+ Color nColor;
+ xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x66ffff), nColor);
+
+ // Test Picture fill type for cell
+ drawing::FillStyle aFillStyle( drawing::FillStyle_NONE );
+ xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillStyle") >>= aFillStyle;
+ CPPUNIT_ASSERT_EQUAL(int(drawing::FillStyle_BITMAP), static_cast<int>(aFillStyle));
+
+ // Test Gradient fill type for cell
+ xCell.set(xTable->getCellByPosition(1, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillStyle") >>= aFillStyle;
+ CPPUNIT_ASSERT_EQUAL(int(drawing::FillStyle_GRADIENT), static_cast<int>(aFillStyle));
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testBulletStartNumber()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/n90255.pptx"), PPTX );
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pPage->GetObj(0) );
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ const SvxNumBulletItem *pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pNumFmt);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Bullet's start number is wrong!", sal_Int16(3), sal_Int16(pNumFmt->GetNumRule().GetLevel(0).GetStart()) );
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testLineStyle()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/lineStyle.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ SdrObject const* pShape = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("no shape", pShape != nullptr);
+
+ const XLineStyleItem& rStyleItem = dynamic_cast<const XLineStyleItem&>(
+ pShape->GetMergedItem(XATTR_LINESTYLE));
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong style", int(drawing::LineStyle_SOLID), static_cast<int>(rStyleItem.GetValue()));
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testRightToLeftParaghraph()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/rightToLeftParagraph.pptx"), PPTX);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+
+ // Get first paragraph
+ uno::Reference<text::XTextRange> const xParagraph( getParagraphFromShape( 0, xShape ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xParagraph, uno::UNO_QUERY_THROW );
+
+ sal_Int16 nWritingMode = 0;
+ xPropSet->getPropertyValue( "WritingMode" ) >>= nWritingMode;
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong paragraph WritingMode", text::WritingMode2::RL_TB, nWritingMode);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testTextboxWithHyperlink()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/hyperlinktest.pptx"), PPTX);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+
+ // Get first paragraph
+ uno::Reference<text::XTextRange> const xParagraph( getParagraphFromShape( 0, xShape ) );
+
+ // first chunk of text
+ uno::Reference<text::XTextRange> xRun( getRunFromParagraph( 0, xParagraph ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xRun, uno::UNO_QUERY_THROW );
+
+ uno::Reference<text::XTextField> xField;
+ xPropSet->getPropertyValue("TextField") >>= xField;
+ CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is() );
+
+ xPropSet.set(xField, uno::UNO_QUERY);
+ OUString aURL;
+ xPropSet->getPropertyValue("URL") >>= aURL;
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("URLs don't match", OUString("http://www.xkcd.com/"), aURL);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testTdf136911()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/ppt/tdf136911.ppt"), PPT);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+
+ // Get second paragraph
+ uno::Reference<text::XTextRange> const xParagraph( getParagraphFromShape( 0, xShape ) );
+
+ // first chunk of text
+ uno::Reference<text::XTextRange> xRun( getRunFromParagraph( 0, xParagraph ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xRun, uno::UNO_QUERY_THROW );
+
+ uno::Reference<text::XTextField> xField;
+ xPropSet->getPropertyValue("TextField") >>= xField;
+ CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is() );
+
+ xPropSet.set(xField, uno::UNO_QUERY);
+ OUString aURL;
+ xPropSet->getPropertyValue("URL") >>= aURL;
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("URLs don't match", OUString("http://google.com"), aURL);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testBulletColor()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bulletColor.pptx"), PPTX );
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pPage->GetObj(0) );
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
+
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ const SvxNumBulletItem *pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pNumFmt);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Bullet's color is wrong!", Color(0xff0000),pNumFmt->GetNumRule().GetLevel(0).GetBulletColor());
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testBulletCharAndFont()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/bulletCharAndFont.odp"), ODP);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+ uno::Reference<text::XTextRange> const xParagraph( getParagraphFromShape( 0, xShape ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xParagraph, uno::UNO_QUERY_THROW );
+
+ uno::Reference<container::XIndexAccess> xLevels(xPropSet->getPropertyValue("NumberingRules"), uno::UNO_QUERY);
+ uno::Sequence<beans::PropertyValue> aProps;
+ xLevels->getByIndex(0) >>= aProps; // 1st level
+ OUString sBulletChar(u'\xf06c');
+ for (beans::PropertyValue const & rProp : std::as_const(aProps))
+ {
+ if (rProp.Name == "BulletChar")
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "BulletChar incorrect.", sBulletChar ,rProp.Value.get<OUString>());
+ if (rProp.Name == "BulletFont")
+ {
+ awt::FontDescriptor aFontDescriptor;
+ rProp.Value >>= aFontDescriptor;
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "BulletFont incorrect.", OUString("Wingdings"),aFontDescriptor.Name);
+ }
+ }
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testBulletMarginAndIndentation()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bulletMarginAndIndent.pptx"), PPTX );
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pPage->GetObj(0) );
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
+
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ const SvxNumBulletItem *pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pNumFmt);
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Bullet's left margin is wrong!", sal_Int32(1000),pNumFmt->GetNumRule().GetLevel(0).GetAbsLSpace() ); // left margin is 0.79 cm
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Bullet's indentation is wrong!", sal_Int32(-1000),pNumFmt->GetNumRule().GetLevel(0). GetFirstLineOffset());
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testParaMarginAndindentation()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/paraMarginAndIndentation.pptx"), PPTX);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+
+ // Get first paragraph
+ uno::Reference<text::XTextRange> const xParagraph( getParagraphFromShape( 0, xShape ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xParagraph, uno::UNO_QUERY_THROW );
+
+ sal_Int32 nParaLeftMargin = 0;
+ xPropSet->getPropertyValue( "ParaLeftMargin" ) >>= nParaLeftMargin;
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(1000), sal_uInt32(nParaLeftMargin));
+
+ sal_Int32 nParaFirstLineIndent = 0;
+ xPropSet->getPropertyValue( "ParaFirstLineIndent" ) >>= nParaFirstLineIndent;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(-1270), nParaFirstLineIndent);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testCellLeftAndRightMargin()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/n90223.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ sal_Int32 nLeftMargin, nRightMargin;
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT( pTableObj );
+
+ uno::Reference< css::table::XTable > xTable (pTableObj->getTable(), uno::UNO_SET_THROW);
+ uno::Reference< css::table::XMergeableCell > xCell( xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW );
+ uno::Reference< beans::XPropertySet > xCellPropSet(xCell, uno::UNO_QUERY_THROW);
+
+ uno::Any aLeftMargin = xCellPropSet->getPropertyValue("TextLeftDistance");
+ CPPUNIT_ASSERT(aLeftMargin >>= nLeftMargin);
+
+ uno::Any aRightMargin = xCellPropSet->getPropertyValue("TextRightDistance");
+ CPPUNIT_ASSERT(aRightMargin >>= nRightMargin);
+
+ // Convert values to EMU
+ nLeftMargin = oox::drawingml::convertHmmToEmu( nLeftMargin );
+ nRightMargin = oox::drawingml::convertHmmToEmu( nRightMargin );
+
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(45720), nLeftMargin);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(45720), nRightMargin);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testMergedCells()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/cellspan.odp"), ODP);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+
+ CPPUNIT_ASSERT( pTableObj );
+ uno::Reference< table::XTable > xTable(pTableObj->getTable(), uno::UNO_SET_THROW);
+ uno::Reference< text::XTextRange > xText1(xTable->getCellByPosition(3, 0), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL( OUString("0,3"), xText1->getString() );
+
+ uno::Reference< text::XTextRange > xText2(xTable->getCellByPosition(3, 2), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL( OUString("2,3"), xText2->getString() );
+}
+
+void SdOOXMLExportTest1::testTableCellBorder()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/n90190.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT( pTableObj );
+
+ table::BorderLine2 aBorderLine;
+
+ uno::Reference< table::XTable > xTable(pTableObj->getTable(), uno::UNO_SET_THROW);
+ uno::Reference< css::table::XMergeableCell > xCell(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ uno::Reference< beans::XPropertySet > xCellPropSet (xCell, uno::UNO_QUERY_THROW);
+
+ xCellPropSet->getPropertyValue("LeftBorder") >>= aBorderLine;
+// While importing the table cell border line width, it converts EMU->Hmm then divided result by 2.
+// To get original value of LineWidth need to multiple by 2.
+ sal_Int32 nLeftBorder = aBorderLine.LineWidth * 2;
+ nLeftBorder = oox::drawingml::convertHmmToEmu( nLeftBorder );
+ CPPUNIT_ASSERT(nLeftBorder);
+ CPPUNIT_ASSERT_EQUAL(Color(0x00b0f0), Color(ColorTransparency, aBorderLine.Color));
+
+ xCellPropSet->getPropertyValue("RightBorder") >>= aBorderLine;
+ sal_Int32 nRightBorder = aBorderLine.LineWidth * 2;
+ nRightBorder = oox::drawingml::convertHmmToEmu( nRightBorder );
+ CPPUNIT_ASSERT(nRightBorder);
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, Color(ColorTransparency, aBorderLine.Color));
+
+ xCellPropSet->getPropertyValue("TopBorder") >>= aBorderLine;
+ sal_Int32 nTopBorder = aBorderLine.LineWidth * 2;
+ nTopBorder = oox::drawingml::convertHmmToEmu( nTopBorder );
+ CPPUNIT_ASSERT(nTopBorder);
+ CPPUNIT_ASSERT_EQUAL(Color(0x00b0f0), Color(ColorTransparency, aBorderLine.Color));
+
+
+ xCellPropSet->getPropertyValue("BottomBorder") >>= aBorderLine;
+ sal_Int32 nBottomBorder = aBorderLine.LineWidth * 2;
+ nBottomBorder = oox::drawingml::convertHmmToEmu( nBottomBorder );
+ CPPUNIT_ASSERT(nBottomBorder);
+ CPPUNIT_ASSERT_EQUAL(Color(0x00b0f0), Color(ColorTransparency, aBorderLine.Color));
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testTdf111884()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf111884.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ const SdrPage *pPage = GetPage(1, xDocShRef);
+ SdrObject const* pShape = pPage->GetObj(2);
+ CPPUNIT_ASSERT_MESSAGE("no shape", pShape != nullptr);
+
+ // must be a group shape
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::Group, pShape->GetObjIdentifier());
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testTdf112633()
+{
+ // Load document and export it to a temporary file
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf112633.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ xmlDocUniquePtr pRelsDoc = parseExport(tempFile, "ppt/slides/_rels/slide1.xml.rels");
+
+ // Check image with artistic effect exists in the slide
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:extLst/a:ext/a14:imgProps/"
+ "a14:imgLayer/a14:imgEffect/a14:artisticPencilGrayscale",
+ "pencilSize", "80");
+
+ // Check there is a relation with the .wdp file that contains the backed up image
+ OUString sEmbedId1 = getXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:extLst/"
+ "a:ext/a14:imgProps/a14:imgLayer", "embed");
+ OUString sXmlPath = "/rels:Relationships/rels:Relationship[@Id='" + sEmbedId1 + "']";
+ assertXPath(pRelsDoc, OUStringToOString( sXmlPath, RTL_TEXTENCODING_UTF8 ), "Target", "../media/hdphoto1.wdp");
+
+ // Check the .wdp file exists
+ uno::Reference<packages::zip::XZipFileAccess2> xNameAccess = packages::zip::ZipFileAccess::createWithURL(
+ comphelper::getComponentContext(m_xSFactory), tempFile.GetURL());
+ CPPUNIT_ASSERT_EQUAL(true, bool(xNameAccess->hasByName("ppt/media/hdphoto1.wdp")));
+}
+
+void SdOOXMLExportTest1::testTdf128952()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf128952.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm/a:off", "x", "360");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm/a:off", "y", "-360");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm/a:ext", "cx", "1919880");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm/a:ext", "cy", "1462680");
+}
+
+void SdOOXMLExportTest1::testTdf127090()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf127090.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr", "rot", "-5400000");
+}
+
+void SdOOXMLExportTest1::testCustomXml()
+{
+ // Load document and export it to a temporary file
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/customxml.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "customXml/item1.xml");
+ CPPUNIT_ASSERT(pXmlDoc);
+ xmlDocUniquePtr pRelsDoc = parseExport(tempFile, "customXml/_rels/item1.xml.rels");
+ CPPUNIT_ASSERT(pRelsDoc);
+
+ // Check there is a relation to itemProps1.xml.
+ assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship", 1);
+ assertXPath(pRelsDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']", "Target", "itemProps1.xml");
+
+ std::unique_ptr<SvStream> pStream = parseExportStream(tempFile, "ddp/ddpfile.xen");
+ CPPUNIT_ASSERT(pStream);
+}
+
+void SdOOXMLExportTest1::testTdf94238()
+{
+ // Load document and export it to a temporary file.
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf94238.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDoc.is());
+
+ uno::Reference<drawing::XDrawPage> xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPage.is());
+
+ uno::Reference<beans::XPropertySet> xShape(getShape(0, xPage));
+ CPPUNIT_ASSERT(xShape.is());
+
+ awt::Gradient aGradient;
+ CPPUNIT_ASSERT(xShape->getPropertyValue("FillGradient") >>= aGradient);
+
+ // Without the accompanying fix in place, this test would have failed with
+ // the following details:
+ // - aGradient.Style was awt::GradientStyle_ELLIPTICAL
+ // - aGradient.YOffset was 70
+ // - aGradient.Border was 0
+ CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_RADIAL, aGradient.Style);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(100), aGradient.YOffset);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(39), aGradient.Border);
+
+ // Without the accompanying fix in place, this test would have failed with
+ // 'Expected: 0, Actual : 10592673', i.e. the start color of the gradient
+ // was incorrect.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0x0), aGradient.StartColor);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0x8B8B8B), aGradient.EndColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testPictureTransparency()
+{
+ // Load document and export it to a temporary file.
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/image_transparency.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDoc.is());
+
+ uno::Reference<drawing::XDrawPage> xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPage.is());
+
+ uno::Reference<beans::XPropertySet> xGraphicShape(getShape(0, xPage));
+ CPPUNIT_ASSERT(xGraphicShape.is());
+
+ sal_Int16 nTransparency = 0;
+ CPPUNIT_ASSERT(xGraphicShape->getPropertyValue("Transparency") >>= nTransparency);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(51), nTransparency);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testTdf125554()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf125554.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ uno::Reference<beans::XPropertySet> xShape = getShapeFromPage(0, 0, xDocShRef);
+ uno::Any aFillTransparenceGradientName
+ = xShape->getPropertyValue("FillTransparenceGradientName");
+ CPPUNIT_ASSERT(aFillTransparenceGradientName.has<OUString>());
+ // Without the accompanying fix in place, this test would have failed, i.e. the transparency of
+ // the shape has no gradient, so it looked like a solid fill instead of a gradient fill.
+ CPPUNIT_ASSERT(!aFillTransparenceGradientName.get<OUString>().isEmpty());
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testRoundtripOwnLineStyles()
+{
+ // Load odp document and read the LineDash values.
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/LineStylesOwn.odp"), ODP);
+ uno::Reference<drawing::XDrawPagesSupplier> xDocodp(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDocodp.is());
+ uno::Reference<drawing::XDrawPage> xPageodp(xDocodp->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPageodp.is());
+ drawing::LineDash aLineDashodp[10];
+ for (sal_uInt16 i= 0; i < 10; i++)
+ {
+ uno::Reference<beans::XPropertySet> xShapeodp(getShape(i, xPageodp));
+ CPPUNIT_ASSERT(xShapeodp.is());
+ xShapeodp->getPropertyValue("LineDash") >>= aLineDashodp[i];
+ }
+
+ // Save to pptx, reload and compare the LineDash values
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ uno::Reference<drawing::XDrawPagesSupplier> xDocpptx(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDocpptx.is());
+ uno::Reference<drawing::XDrawPage> xPagepptx(xDocpptx->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPagepptx.is());
+
+ for (sal_uInt16 i = 0; i < 10; i++)
+ {
+ drawing::LineDash aLineDashpptx;
+ uno::Reference<beans::XPropertySet> xShapepptx(getShape(i, xPagepptx));
+ CPPUNIT_ASSERT(xShapepptx.is());
+ xShapepptx->getPropertyValue("LineDash") >>= aLineDashpptx;
+ bool bIsSameLineDash = (aLineDashodp[i].Style == aLineDashpptx.Style
+ && aLineDashodp[i].Dots == aLineDashpptx.Dots
+ && aLineDashodp[i].DotLen == aLineDashpptx.DotLen
+ && aLineDashodp[i].Dashes == aLineDashpptx.Dashes
+ && aLineDashodp[i].DashLen == aLineDashpptx.DashLen
+ && aLineDashodp[i].Distance == aLineDashpptx.Distance);
+ CPPUNIT_ASSERT_MESSAGE("LineDash differ", bIsSameLineDash);
+ }
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testRoundtripPrstDash()
+{
+ // load and save document, compare prstDash values in saved document with original.
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/presetDashDot.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ const OUString sOriginal[] = {
+ "dash",
+ "dashDot",
+ "dot",
+ "lgDash",
+ "lgDashDot",
+ "lgDashDotDot",
+ "sysDash",
+ "sysDashDot",
+ "sysDashDotDot",
+ "sysDot"
+ };
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ const OString sStart = "/p:sld/p:cSld/p:spTree/p:sp[";
+ const OString sEnd = "]/p:spPr/a:ln/a:prstDash";
+ for (sal_uInt16 i = 0; i < 10; i++)
+ {
+ OString sXmlPath = sStart + OString::number(i+1) + sEnd;
+ OUString sResaved = getXPath(pXmlDoc, sXmlPath, "val");
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("wrong prstDash", sOriginal[i], sResaved);
+ }
+
+ // tdf#126746: Make sure that dash-dot pattern starts with the longer dash, as defined in OOXML
+ // Make sure Style is drawing::DashStyle_RECTRELATIVE
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDoc.is());
+ uno::Reference<drawing::XDrawPage> xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPage.is());
+ for (sal_uInt16 i = 0; i < 10; i++)
+ {
+ drawing::LineDash aLineDash;
+ uno::Reference<beans::XPropertySet> xShape(getShape(i, xPage));
+ CPPUNIT_ASSERT(xShape.is());
+ xShape->getPropertyValue("LineDash") >>= aLineDash;
+ CPPUNIT_ASSERT_MESSAGE("First dash is short", aLineDash.DotLen >= aLineDash.DashLen);
+ bool bIsRectRelative = aLineDash.Style == drawing::DashStyle_RECTRELATIVE;
+ CPPUNIT_ASSERT_MESSAGE("not RECTRELATIVE", bIsRectRelative);
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testDashOnHairline()
+{
+ // load and save document, make sure the custDash has 11 child elements.
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf127267DashOnHairline.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:ln/a:custDash/a:ds", 11);
+}
+
+void SdOOXMLExportTest1::testNarrationNonMediaShape()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/narration-non-media-shape.pptx"), PPTX);
+ utl::TempFile aTempFile;
+ // Without the accompanying fix in place, this test would have failed,
+ // beans::UnknownPropertyException was thrown.
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &aTempFile);
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testCustomshapeBitmapfillSrcrect()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptx"),
+ PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ // tdf#132680
+ // We are preventing the side effect of DOCX improvement to PPTX case.
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 1
+ // - Actual : 0
+ // - XPath '/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect' number of nodes is incorrect
+ // i.e. <a:srcRect> was exported as <a:fillRect> in <a:stretch>, which made part of the image
+ // invisible.
+
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect");
+
+ // tdf#134210
+ // Original values of attribute of l and r in xml files: <a:srcRect l="4393" r="4393"/>
+ // No core feature for handling this. We add support to import filter. We crop the bitmap
+ // physically during import and shouldn't export the l r t b attributes anymore. In the
+ // future if we add core feature to LibreOffice, we should change the control value with
+ // 4393.
+
+ assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect", "l");
+ assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect", "r");
+ assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect", "t");
+ assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect", "b");
+}
+
+
+
+void SdOOXMLExportTest1::testTdf100348FontworkBitmapFill()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf100348_FontworkBitmapFill.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ // Make sure the fontwork shape has a blip bitmap fill and a colored outline.
+ // Without the patch, fill and outline were black.
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ const OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr");
+ assertXPath(pXmlDoc, sPathStart + "/a:blipFill/a:blip", 1);
+ assertXPath(pXmlDoc, sPathStart + "/a:ln/a:solidFill/a:srgbClr", "val", "ffbf00");
+}
+
+void SdOOXMLExportTest1::testTdf100348FontworkGradientGlow()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf100348_FontworkGradientGlow.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ // Make sure the fontwork shape has a gradient fill and a colored glow.
+ // Without the patch, fill was black and no glow applied.
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ const OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr");
+ assertXPath(pXmlDoc, sPathStart + "/a:gradFill/a:gsLst/a:gs[1]/a:srgbClr", "val", "8d281e");
+ assertXPath(pXmlDoc, sPathStart + "/a:effectLst/a:glow", "rad", "63360");
+ assertXPath(pXmlDoc, sPathStart + "/a:effectLst/a:glow/a:srgbClr", "val", "ff4500");
+}
+
+void SdOOXMLExportTest1::testTdf128345FullTransparentGradient()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf128345_FullTransparentGradient.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ // Make sure the shape has no fill. Without the patch, fill was solid red.
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:noFill");
+}
+
+void SdOOXMLExportTest1::testTdf128345GradientLinear()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf128345_GradientLinear.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ // Make sure the shape has a lin fill. Without the patch, fill was solid red.
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ const OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:gradFill");
+ assertXPath(pXmlDoc, sPathStart + "/a:lin", "ang", "3600000");
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs",2);
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]", "pos", "25000");
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr", "val", "ff0000");
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr/a:alpha", "val", "20000");
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]", "pos", "100000");
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr", "val", "ff0000");
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr/a:alpha", "val", "80000");
+}
+
+void SdOOXMLExportTest1::testTdf128345GradientRadial()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf128345_GradientRadial.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ // Make sure the shape has transparency. In OOXML alpha means 'opacity' with default
+ // 100000 for full opak, so only the full transparency with val 0 should be written.
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ const OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:gradFill");
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs",2);
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr", "val", "ff0000");
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr/a:alpha", 0);
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr", "val", "ffffff");
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr/a:alpha", "val", "0");
+}
+
+void SdOOXMLExportTest1::testTdf128345GradientAxial()
+{
+ // Without the patch, symmetric linear gradient with full transparence outside and
+ // full opak in the middle were imported as full transparent.
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf128345_GradientAxial.odp"), ODP);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ uno::Reference<beans::XPropertySet> xShapePropSet(getShapeFromPage(0, 0, xDocShRef));
+
+ awt::Gradient aTransparenceGradient;
+ xShapePropSet->getPropertyValue("FillTransparenceGradient") >>= aTransparenceGradient;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, aTransparenceGradient.StartColor));
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, Color(ColorTransparency, aTransparenceGradient.EndColor));
+ CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_AXIAL, aTransparenceGradient.Style);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testTdf134969TransparencyOnColorGradient()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf134969_TransparencyOnColorGradient.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ // Make sure the shape has a transparency in gradient stops.
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ const OString sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:gradFill");
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs",2);
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[1]/a:srgbClr/a:alpha", "val", "60000");
+ assertXPath(pXmlDoc, sPathStart + "/a:gsLst/a:gs[2]/a:srgbClr/a:alpha", "val", "60000");
+}
+
+void SdOOXMLExportTest1::testArcTo()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/arc-validiert.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ const OString sPath("//a:custGeom/a:pathLst/a:path/a:arcTo");
+ assertXPath(pXmlDoc, sPath, "wR", "3");
+ assertXPath(pXmlDoc, sPath, "hR", "3");
+ assertXPath(pXmlDoc, sPath, "stAng", "1800000");
+ assertXPath(pXmlDoc, sPath, "swAng", "2700000");
+}
+
+void SdOOXMLExportTest1::testNarrationMimeType()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/narration.pptx"), PPTX);
+ utl::TempFile aTempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &aTempFile);
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "[Content_Types].xml");
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: audio/mp4
+ // - Actual : application/vnd.sun.star.media
+ // i.e. the mime type of the narration was incorrect.
+ assertXPath(pXmlDoc,
+ "/ContentType:Types/ContentType:Override[@PartName='/ppt/media/media1.m4a']",
+ "ContentType", "audio/mp4");
+
+ // Check if the bitmap of the media shape is exported correctly.
+ xmlDocUniquePtr pSlideDoc = parseExport(aTempFile, "ppt/slides/slide1.xml");
+ OUString aImageId = getXPath(pSlideDoc, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip", "embed");
+ xmlDocUniquePtr pRelsDoc = parseExport(aTempFile, "ppt/slides/_rels/slide1.xml.rels");
+ OUString aImagePath = "/rels:Relationships/rels:Relationship[@Id='" + aImageId + "']";
+ // Something like ../media/image2.png.
+ OUString aImageStreamName = getXPath(pRelsDoc, aImagePath.toUtf8(), "Target");
+ OUString aImageAbsName = rtl::Uri::convertRelToAbs("file:///ppt/slides/", aImageStreamName);
+ // Something like ppt/media/image2.png.
+ OUString aImageRelName;
+ CPPUNIT_ASSERT(aImageAbsName.startsWith("file:///", &aImageRelName));
+ std::unique_ptr<SvStream> pImageStream = parseExportStream(aTempFile, aImageRelName);
+ vcl::PngImageReader aReader(*pImageStream);
+ BitmapEx aBitmapEx = aReader.read();
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 256
+ // - Actual : 120
+ // i.e. the bitmap of the narration was lost, some default placeholder was exported instead.
+ CPPUNIT_ASSERT_EQUAL(static_cast<tools::Long>(256), aBitmapEx.GetSizePixel().Height());
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 1
+ // - Actual : 0
+ // i.e. p:blipFill was missing its a:stretch child element, so the shape was invisible.
+ assertXPath(pSlideDoc, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:stretch/a:fillRect", 1);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - ... no attribute 'cmd' exist
+ // i.e. '<p:cmd type="call">' was written instead of '<p:cmd type="call" cmd="playFrom(0.0)">'.
+ assertXPath(pSlideDoc, "//p:cmd", "cmd", "playFrom(0.0)");
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 1
+ // - Actual : 0
+ // i.e. <p:childTnLst> had no <p:audio> children, the whole audio animation node was lost.
+ assertXPath(pSlideDoc, "//p:childTnLst/p:audio/p:cMediaNode", 1);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - ... no attribute 'showWhenStopped' exist
+ // i.e. <p:cMediaNode> had the default visibility -> bitmap was visible during slideshow.
+ assertXPath(pSlideDoc, "//p:childTnLst/p:audio/p:cMediaNode", "showWhenStopped", "0");
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - ... no attribute 'isNarration' exist
+ // i.e. <p:audio> was not a narration -> could not mass-remove narrations on the UI.
+ assertXPath(pSlideDoc, "//p:childTnLst/p:audio", "isNarration", "1");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testTdf140865Wordart3D()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx"), PPTX);
+ utl::TempFile aTempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &aTempFile);
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "ppt/slides/slide1.xml");
+
+ // without the fix in place a:sp3d was lost on round trip, and so extrusion was lost.
+ constexpr OStringLiteral sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr");
+ assertXPath(pXmlDoc, sPathStart + "/a:sp3d", "extrusionH", "342900");
+ assertXPath(pXmlDoc, sPathStart + "/a:sp3d", "contourW", "12700");
+ assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelT", "w", "114300");
+ assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelT", "h", "38100");
+ assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelT", "prst", "softRound");
+ assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelB", "h", "152400");
+ assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:extrusionClr/a:srgbClr", "val", "990000");
+ assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:contourClr/a:srgbClr", "val", "009876");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest1::testTdf124457()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf124457.pptx"), PPTX );
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ assertXPath(pXmlDoc,
+ "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/"
+ "p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par[1]/p:cTn",
+ "repeatCount", "3000");
+
+ assertXPath(pXmlDoc,
+ "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/"
+ "p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par[2]/p:cTn",
+ "repeatCount", "indefinite");
+}
+
+void SdOOXMLExportTest1::testTdf143126()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf143126.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/presProps.xml");
+
+ assertXPath(pXmlDoc, "/p:presentationPr/p:showPr", "showNarration", "1");
+ assertXPath(pXmlDoc, "/p:presentationPr/p:showPr/p:sldRg", "st", "2" );
+ assertXPath(pXmlDoc, "/p:presentationPr/p:showPr/p:sldRg", "end", "3" );
+}
+
+void SdOOXMLExportTest1::testTdf143129()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf143129.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/presProps.xml");
+
+ assertXPath(pXmlDoc, "/p:presentationPr/p:showPr", "showNarration", "1");
+ assertXPath(pXmlDoc, "/p:presentationPr/p:showPr/p:custShow", "id", "0" );
+}
+
+void SdOOXMLExportTest1::testTdf118045()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf118045.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:lnSpc/a:spcPct", "val",
+ "110000");
+}
+
+void SdOOXMLExportTest1::testTdf137675()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf137675.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path", "fill", "none");
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdOOXMLExportTest1);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx
new file mode 100644
index 000000000..c17be51c1
--- /dev/null
+++ b/sd/qa/unit/export-tests-ooxml2.cxx
@@ -0,0 +1,1920 @@
+/* -*- 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 "sdmodeltestbase.hxx"
+#include <comphelper/propertysequence.hxx>
+#include <editeng/flditem.hxx>
+
+#include <svx/svdomedia.hxx>
+#include <svx/svdotable.hxx>
+#include <svx/svdpage.hxx>
+
+#include <com/sun/star/animations/TransitionType.hpp>
+#include <com/sun/star/animations/TransitionSubType.hpp>
+#include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/style/LineSpacing.hpp>
+#include <com/sun/star/style/LineSpacingMode.hpp>
+#include <com/sun/star/text/XTextColumns.hpp>
+
+#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+
+#include <rtl/character.hxx>
+#include <o3tl/string_view.hxx>
+
+using namespace css;
+using namespace css::animations;
+
+namespace {
+
+bool checkBeginWithNumber(const OUString& rStr)
+{
+ sal_Unicode aChar = (rStr.getLength() > 1) ? rStr[0] : '\0';
+ return aChar == '.' || aChar == '-' || rtl::isAsciiDigit(aChar);
+}
+
+}
+
+#define CPPUNIT_ASSERT_MOTIONPATH(expect, actual) \
+ assertMotionPath(expect, actual, CPPUNIT_SOURCELINE())
+
+static void assertMotionPath(std::u16string_view rStr1, std::u16string_view rStr2, const CppUnit::SourceLine &rSourceLine)
+{
+ sal_Int32 nIdx1 = 0;
+ sal_Int32 nIdx2 = 0;
+
+ OString sMessage = "Motion path values mismatch.\nExpect: " +
+ OUStringToOString(rStr1, RTL_TEXTENCODING_UTF8) +
+ "\nActual: " + OUStringToOString(rStr2, RTL_TEXTENCODING_UTF8);
+
+ while(nIdx1 != -1 && nIdx2 != -1)
+ {
+ OUString aToken1( o3tl::getToken(rStr1, 0, ' ', nIdx1) );
+ OUString aToken2( o3tl::getToken(rStr2, 0, ' ', nIdx2) );
+
+ if (checkBeginWithNumber(aToken1) && checkBeginWithNumber(aToken2))
+ assertDoubleEquals(aToken1.toDouble(), aToken2.toDouble(), DBL_EPSILON, rSourceLine, sMessage.getStr());
+ else
+ assertEquals(aToken1, aToken2, rSourceLine, sMessage.getStr());
+ }
+ assertEquals(sal_Int32(-1), nIdx1, rSourceLine, sMessage.getStr());
+ assertEquals(sal_Int32(-1), nIdx2, rSourceLine, sMessage.getStr());
+}
+
+class SdOOXMLExportTest2 : public SdModelTestBaseXML
+{
+public:
+ void testRepeatBitmapMode();
+ void testTdf151492();
+ void testTdf149697();
+ void testTdf149126();
+ void testTdf131905();
+ void testTdf93883();
+ void testTdf91378();
+ void testBnc822341();
+ void testMathObject();
+ void testMathObjectPPT2010();
+ void testTdf119015();
+ void testTdf123090();
+ void testTdf126324();
+ void testTdf119187();
+ void testTdf132472();
+ void testTdf80224();
+ void testExportTransitionsPPTX();
+ void testPresetShapesExport();
+ void testTdf92527();
+ void testDatetimeFieldNumberFormat();
+ void testDatetimeFieldNumberFormatPPTX();
+ void testSlideNumberField();
+ void testSlideNumberFieldPPTX();
+ void testSlideCountField();
+ void testSlideNameField();
+ void testExtFileField();
+ void testAuthorField();
+ void testTdf99224();
+ void testTdf92076();
+ void testTdf59046();
+ void testTdf133502();
+ void testTdf105739();
+ void testPageBitmapWithTransparency();
+ void testPptmContentType();
+ void testTdf111798();
+ void testPptmVBAStream();
+ void testTdf111863();
+ void testTdf111518();
+ void testTdf100387();
+ void testClosingShapesAndLineCaps();
+ void testRotateFlip();
+ void testTdf106867();
+ void testTdf112280();
+ void testTdf112088();
+ void testTdf112333();
+ void testTdf112552();
+ void testTdf112557();
+ void testTdf128049();
+ void testTdf106026();
+ void testTdf112334();
+ void testTdf112089();
+ void testTdf112086();
+ void testTdf112647();
+ void testGroupRotation();
+ void testTdf104788();
+ void testSmartartRotation2();
+ void testTdf91999_rotateShape();
+ void testTdf114845_rotateShape();
+ void testGroupsPosition();
+ void testGroupsRotatedPosition();
+ void testAccentColor();
+ void testThemeColors();
+ void testTdf111785();
+ void testTdf118825();
+ void testTextColumns_tdf140852();
+ void testTextColumns_3columns();
+ void testTdf59323_slideFooters();
+ void testTdf53970();
+
+ CPPUNIT_TEST_SUITE(SdOOXMLExportTest2);
+
+ CPPUNIT_TEST(testRepeatBitmapMode);
+ CPPUNIT_TEST(testTdf151492);
+ CPPUNIT_TEST(testTdf149697);
+ CPPUNIT_TEST(testTdf149126);
+ CPPUNIT_TEST(testTdf131905);
+ CPPUNIT_TEST(testTdf93883);
+ CPPUNIT_TEST(testTdf91378);
+ CPPUNIT_TEST(testBnc822341);
+ CPPUNIT_TEST(testMathObject);
+ CPPUNIT_TEST(testMathObjectPPT2010);
+ CPPUNIT_TEST(testTdf119015);
+ CPPUNIT_TEST(testTdf123090);
+ CPPUNIT_TEST(testTdf126324);
+ CPPUNIT_TEST(testTdf119187);
+ CPPUNIT_TEST(testTdf132472);
+ CPPUNIT_TEST(testTdf80224);
+ CPPUNIT_TEST(testExportTransitionsPPTX);
+ CPPUNIT_TEST(testPresetShapesExport);
+ CPPUNIT_TEST(testTdf92527);
+ CPPUNIT_TEST(testDatetimeFieldNumberFormat);
+ CPPUNIT_TEST(testDatetimeFieldNumberFormatPPTX);
+ CPPUNIT_TEST(testSlideNumberField);
+ CPPUNIT_TEST(testSlideNumberFieldPPTX);
+ CPPUNIT_TEST(testSlideCountField);
+ CPPUNIT_TEST(testSlideNameField);
+ CPPUNIT_TEST(testExtFileField);
+ CPPUNIT_TEST(testAuthorField);
+ CPPUNIT_TEST(testTdf99224);
+ CPPUNIT_TEST(testTdf92076);
+ CPPUNIT_TEST(testTdf59046);
+ CPPUNIT_TEST(testTdf133502);
+ CPPUNIT_TEST(testTdf105739);
+ CPPUNIT_TEST(testPageBitmapWithTransparency);
+ CPPUNIT_TEST(testPptmContentType);
+ CPPUNIT_TEST(testTdf111798);
+ CPPUNIT_TEST(testPptmVBAStream);
+ CPPUNIT_TEST(testTdf111863);
+ CPPUNIT_TEST(testTdf111518);
+ CPPUNIT_TEST(testTdf100387);
+ CPPUNIT_TEST(testClosingShapesAndLineCaps);
+ CPPUNIT_TEST(testRotateFlip);
+ CPPUNIT_TEST(testTdf106867);
+ CPPUNIT_TEST(testTdf112280);
+ CPPUNIT_TEST(testTdf112088);
+ CPPUNIT_TEST(testTdf112333);
+ CPPUNIT_TEST(testTdf112552);
+ CPPUNIT_TEST(testTdf112557);
+ CPPUNIT_TEST(testTdf128049);
+ CPPUNIT_TEST(testTdf106026);
+ CPPUNIT_TEST(testTdf112334);
+ CPPUNIT_TEST(testTdf112089);
+ CPPUNIT_TEST(testTdf112086);
+ CPPUNIT_TEST(testTdf112647);
+ CPPUNIT_TEST(testGroupRotation);
+ CPPUNIT_TEST(testTdf104788);
+ CPPUNIT_TEST(testSmartartRotation2);
+ CPPUNIT_TEST(testTdf91999_rotateShape);
+ CPPUNIT_TEST(testTdf114845_rotateShape);
+ CPPUNIT_TEST(testGroupsPosition);
+ CPPUNIT_TEST(testGroupsRotatedPosition);
+ CPPUNIT_TEST(testAccentColor);
+ CPPUNIT_TEST(testThemeColors);
+ CPPUNIT_TEST(testTdf111785);
+ CPPUNIT_TEST(testTdf118825);
+ CPPUNIT_TEST(testTextColumns_tdf140852);
+ CPPUNIT_TEST(testTextColumns_3columns);
+ CPPUNIT_TEST(testTdf59323_slideFooters);
+ CPPUNIT_TEST(testTdf53970);
+
+ CPPUNIT_TEST_SUITE_END();
+
+ virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override
+ {
+ XmlTestTools::registerOOXMLNamespaces(pXmlXPathCtx);
+ }
+};
+
+void SdOOXMLExportTest2::testRepeatBitmapMode()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/repeatBitmapMode.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile", "tx", "1269669");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile", "ty", "186051");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile", "sx", "100000");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile", "sy", "100000");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile", "algn", "tr");
+
+ // if the "Scale" setting is checked in the images settings dialog.
+ xmlDocUniquePtr pXmlDocContent2 = parseExport(tempFile, "ppt/slides/slide2.xml");
+ assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile", "tx", "0");
+ assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile", "ty", "0");
+ assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile", "sx", "682760");
+ assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile", "sy", "639983");
+ assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:bg/p:bgPr/a:blipFill/a:tile", "algn", "ctr");
+}
+
+void SdOOXMLExportTest2::testTdf151492()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf151492.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:cxnSp/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn",
+ "idx", "0");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf149697()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf149697.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:cxnSp[1]/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn",
+ "idx", "5");
+
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:cxnSp[1]/p:nvCxnSpPr/p:cNvCxnSpPr/a:endCxn",
+ "idx", "4");
+
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn",
+ "idx", "3");
+
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:nvCxnSpPr/p:cNvCxnSpPr/a:endCxn",
+ "idx", "1");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf149126()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf149126.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:prstGeom", "prst",
+ "triangle");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf131905()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf131905.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(
+ pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr[1]/a:tc/a:tcPr",
+ "anchor", "t");
+
+ assertXPath(
+ pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr[2]/a:tc/a:tcPr",
+ "anchor", "ctr");
+
+ assertXPath(
+ pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr[3]/a:tc/a:tcPr",
+ "anchor", "b");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf93883()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf93883.odp"), ODP);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+ uno::Reference<text::XTextRange> const xParagraph( getParagraphFromShape( 0, xShape ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xParagraph, uno::UNO_QUERY_THROW );
+ CPPUNIT_ASSERT(!xPropSet->getPropertyValue("NumberingLevel").hasValue());
+}
+
+void SdOOXMLExportTest2::testBnc822341()
+{
+ // Check import / export of embedded text document
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/bnc822341.odp"), ODP);
+ utl::TempFile tempFile1;
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX, &tempFile1 );
+
+ // Export an LO specific ole object (imported from an ODP document)
+ {
+ xmlDocUniquePtr pXmlDocCT = parseExport(tempFile1, "[Content_Types].xml");
+ assertXPath(pXmlDocCT,
+ "/ContentType:Types/ContentType:Override[@ContentType='application/vnd.openxmlformats-officedocument.wordprocessingml.document']",
+ "PartName",
+ "/ppt/embeddings/oleObject1.docx");
+
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile1, "ppt/slides/_rels/slide1.xml.rels");
+ assertXPath(pXmlDocRels,
+ "/rels:Relationships/rels:Relationship[@Target='../embeddings/oleObject1.docx']",
+ "Type",
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package");
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile1, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/p:oleObj",
+ "progId",
+ "Word.Document.12");
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef.get() );
+
+ const SdrObject* pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE( "no object", pObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL( SdrObjKind::OLE2, pObj->GetObjIdentifier() );
+ }
+
+ utl::TempFile tempFile2;
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX, &tempFile2 );
+
+ // Export an MS specific ole object (imported from a PPTX document)
+ {
+ xmlDocUniquePtr pXmlDocCT = parseExport(tempFile2, "[Content_Types].xml");
+ assertXPath(pXmlDocCT,
+ "/ContentType:Types/ContentType:Override[@ContentType='application/vnd.openxmlformats-officedocument.wordprocessingml.document']",
+ "PartName",
+ "/ppt/embeddings/oleObject1.docx");
+
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile2, "ppt/slides/_rels/slide1.xml.rels");
+ assertXPath(pXmlDocRels,
+ "/rels:Relationships/rels:Relationship[@Target='../embeddings/oleObject1.docx']",
+ "Type",
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package");
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile2, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/p:oleObj",
+ "progId",
+ "Word.Document.12");
+
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr );
+ const SdrPage *pPage = pDoc->GetPage(1);
+ CPPUNIT_ASSERT_MESSAGE( "no page", pPage != nullptr );
+
+ const SdrObject* pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE( "no object", pObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL( SdrObjKind::OLE2, pObj->GetObjIdentifier() );
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testMathObject()
+{
+ // Check import / export of math object
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/math.odp"), ODP);
+ utl::TempFile tempFile1;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile1);
+
+ // Export an LO specific ole object (imported from an ODP document)
+ {
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile1, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice",
+ "Requires",
+ "a14");
+ assertXPathContent(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice/p:sp/p:txBody/a:p/a14:m/m:oMath/m:r[1]/m:t",
+ "a");
+
+ const SdrPage *pPage = GetPage(1, xDocShRef);
+ const SdrObject* pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::OLE2, pObj->GetObjIdentifier());
+ }
+
+ utl::TempFile tempFile2;
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX, &tempFile2 );
+
+ // Export an MS specific ole object (imported from a PPTX document)
+ {
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile1, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice",
+ "Requires",
+ "a14");
+ assertXPathContent(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice/p:sp/p:txBody/a:p/a14:m/m:oMath/m:r[1]/m:t",
+ "a");
+
+ const SdrPage *pPage = GetPage(1, xDocShRef);
+ const SdrObject* pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::OLE2, pObj->GetObjIdentifier());
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testMathObjectPPT2010()
+{
+ // Check import / export of math object
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/Math.pptx"), PPTX);
+ utl::TempFile tempFile1;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile1);
+
+ // Export an MS specific ole object (imported from a PPTX document)
+ {
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile1, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice",
+ "Requires",
+ "a14");
+ assertXPathContent(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice/p:sp/p:txBody/a:p/a14:m/m:oMath/m:sSup/m:e/m:r[1]/m:t",
+ u"\U0001D44E"); // non-BMP char
+
+ const SdrPage *pPage = GetPage(1, xDocShRef);
+ const SdrObject* pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::OLE2, pObj->GetObjIdentifier());
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf119015()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf119015.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+
+ sdr::table::SdrTableObj* pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pTableObj);
+ // The position was previously not properly initialized: (0, 0, 100, 100)
+ CPPUNIT_ASSERT_EQUAL(tools::Rectangle(Point(6991, 6902), Size(14099, 2000)),
+ pTableObj->GetLogicRect());
+ uno::Reference<table::XTable> xTable(pTableObj->getTable());
+
+ // Test that we actually have three cells: this threw css.lang.IndexOutOfBoundsException
+ uno::Reference<text::XTextRange> xTextRange(xTable->getCellByPosition(1, 0),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("A3"), xTextRange->getString());
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf123090()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf123090.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+
+ sdr::table::SdrTableObj* pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pTableObj);
+
+ uno::Reference<table::XTable> xTable(pTableObj->getTable());
+
+ // Test that we actually have two cells: this threw css.lang.IndexOutOfBoundsException
+ uno::Reference<text::XTextRange> xTextRange(xTable->getCellByPosition(1, 0),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("aaa"), xTextRange->getString());
+
+ sal_Int32 nWidth;
+ uno::Reference< css::table::XTableColumns > xColumns( xTable->getColumns(), uno::UNO_SET_THROW);
+ uno::Reference< beans::XPropertySet > xRefColumn( xColumns->getByIndex(1), uno::UNO_QUERY_THROW );
+ xRefColumn->getPropertyValue( "Width" ) >>= nWidth;
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(9136), nWidth);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf126324()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf126324.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDoc.is());
+ uno::Reference<drawing::XDrawPage> xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPage.is());
+ uno::Reference<beans::XPropertySet> xShape(getShape(0, xPage));
+ CPPUNIT_ASSERT(xShape.is());
+ uno::Reference< text::XText > xText = uno::Reference< text::XTextRange>( xShape, uno::UNO_QUERY_THROW )->getText();
+ CPPUNIT_ASSERT_EQUAL(OUString("17"), xText->getString());
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf119187()
+{
+ std::vector< sd::DrawDocShellRef > xDocShRef;
+ // load document
+ xDocShRef.push_back(loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf119187.pptx"), PPTX));
+ // load resaved document
+ xDocShRef.push_back(saveAndReload( xDocShRef.at(0).get(), PPTX ));
+
+ // check documents
+ for (const sd::DrawDocShellRef& xDoc : xDocShRef)
+ {
+ // get shape properties
+ const SdrPage* pPage = GetPage(1, xDoc);
+ CPPUNIT_ASSERT(pPage);
+ SdrObject* pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pObj);
+ const sdr::properties::BaseProperties & rProperties = pObj->GetProperties();
+
+ // check text vertical alignment
+ const SdrTextVertAdjustItem& rSdrTextVertAdjustItem = rProperties.GetItem(SDRATTR_TEXT_VERTADJUST);
+ const SdrTextVertAdjust eTVA = rSdrTextVertAdjustItem.GetValue();
+ CPPUNIT_ASSERT_EQUAL(SDRTEXTVERTADJUST_TOP, eTVA);
+ }
+}
+
+void SdOOXMLExportTest2::testTdf132472()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf132472.pptx"), PPTX );
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT( pTableObj );
+
+ uno::Reference< table::XCellRange > xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+ uno::Reference< beans::XPropertySet > xCell;
+ Color nColor;
+
+ xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x729fcf), nColor);
+
+ uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xCell));
+ uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
+ uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY);
+ xPropSet->getPropertyValue("CharColor") >>= nColor;
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: Color: R:0 G:0 B:0 A:0
+ // - Actual : Color: R:255 G:255 B:255 A:0
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf80224()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf80224.odp"), ODP);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+
+ uno::Reference<text::XTextRange> const xParagraph( getParagraphFromShape( 0, xShape ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xParagraph->getStart(), uno::UNO_QUERY_THROW );
+
+ Color nCharColor;
+ xPropSet->getPropertyValue("CharColor") >>= nCharColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x6562ac), nCharColor);
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf91378()
+{
+
+ //Check For Import and Export Both
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf91378.pptx"), PPTX);
+ for( sal_uInt32 i=0;i<2;i++)
+ {
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr );
+ uno::Reference<document::XDocumentPropertiesSupplier> xDocumentPropertiesSupplier( xDocShRef->GetModel(), uno::UNO_QUERY );
+ uno::Reference<document::XDocumentProperties> xProps = xDocumentPropertiesSupplier->getDocumentProperties();
+ uno::Reference<beans::XPropertySet> xUDProps( xProps->getUserDefinedProperties(), uno::UNO_QUERY );
+ OUString propValue;
+ xUDProps->getPropertyValue("Testing") >>= propValue;
+ CPPUNIT_ASSERT(propValue.isEmpty());
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ }
+ xDocShRef->DoClose();
+}
+
+static bool checkTransitionOnPage(uno::Reference<drawing::XDrawPagesSupplier> const & xDoc, sal_Int32 nSlideNumber,
+ sal_Int16 nExpectedTransitionType, sal_Int16 nExpectedTransitionSubType,
+ bool bExpectedDirection = true)
+{
+ sal_Int32 nSlideIndex = nSlideNumber - 1;
+
+ CPPUNIT_ASSERT_MESSAGE("Slide/Page index out of range", nSlideIndex < xDoc->getDrawPages()->getCount());
+
+ uno::Reference<drawing::XDrawPage> xPage(xDoc->getDrawPages()->getByIndex(nSlideIndex), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropSet(xPage, uno::UNO_QUERY);
+
+ sal_Int16 nTransitionType = 0;
+ xPropSet->getPropertyValue("TransitionType") >>= nTransitionType;
+
+ if (nExpectedTransitionType != nTransitionType)
+ {
+ std::cerr << "Transition type: " << nTransitionType << " " << nExpectedTransitionType << std::endl;
+ return false;
+ }
+
+ sal_Int16 nTransitionSubtype = 0;
+ xPropSet->getPropertyValue("TransitionSubtype") >>= nTransitionSubtype;
+ if (nExpectedTransitionSubType != nTransitionSubtype)
+ {
+ std::cerr << "Transition Subtype: " << nTransitionSubtype << " " << nExpectedTransitionSubType << std::endl;
+ return false;
+ }
+
+ bool bDirection = false;
+ xPropSet->getPropertyValue("TransitionDirection") >>= bDirection;
+
+ if (bExpectedDirection != bDirection)
+ {
+ std::cerr << "Transition Direction: " << (bExpectedDirection ? "normal" : "reversed")
+ << " " << (bDirection ? "normal" : "reversed") << std::endl;
+ return false;
+ }
+
+ return true;
+}
+
+void SdOOXMLExportTest2::testExportTransitionsPPTX()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/AllTransitions.odp"), ODP);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+
+ // WIPE TRANSITIONS
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 01, TransitionType::BARWIPE, TransitionSubType::TOPTOBOTTOM, false));
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 02, TransitionType::BARWIPE, TransitionSubType::LEFTTORIGHT));
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 03, TransitionType::BARWIPE, TransitionSubType::LEFTTORIGHT, false));
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 04, TransitionType::BARWIPE, TransitionSubType::TOPTOBOTTOM));
+
+ // CUT THROUGH BLACK
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 31, TransitionType::BARWIPE, TransitionSubType::FADEOVERCOLOR));
+
+ // COMB
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 41, TransitionType::PUSHWIPE, TransitionSubType::COMBHORIZONTAL));
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 42, TransitionType::PUSHWIPE, TransitionSubType::COMBVERTICAL));
+
+ // OUTSIDE TURNING CUBE
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 57, TransitionType::MISCSHAPEWIPE, TransitionSubType::CORNERSOUT));
+ // INSIDE TURNING CUBE
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 60, TransitionType::MISCSHAPEWIPE, TransitionSubType::CORNERSIN));
+
+ // FALL
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 61, TransitionType::MISCSHAPEWIPE, TransitionSubType::LEFTTORIGHT));
+
+ // VORTEX
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 70, TransitionType::MISCSHAPEWIPE, TransitionSubType::VERTICAL));
+
+ // RIPPLE
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 71, TransitionType::MISCSHAPEWIPE, TransitionSubType::HORIZONTAL));
+
+ // GLITTER
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 72, TransitionType::MISCSHAPEWIPE, TransitionSubType::DIAMOND));
+
+ // HONEYCOMB
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 73, TransitionType::MISCSHAPEWIPE, TransitionSubType::HEART));
+
+ // NEWSFLASH
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 74, TransitionType::ZOOM, TransitionSubType::ROTATEIN));
+
+ // OVAL VERTICAL - cannot be exported to PPTX so fallback to circle
+ //CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 76, TransitionType::ELLIPSEWIPE, TransitionSubType::VERTICAL));
+ CPPUNIT_ASSERT(checkTransitionOnPage(xDoc, 76, TransitionType::ELLIPSEWIPE, TransitionSubType::CIRCLE));
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testPresetShapesExport()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/preset-shapes-export.odp"), ODP);
+ const char *sShapeTypeAndValues[] =
+ {
+ "wedgeEllipseCallout",
+ "adj1","val 45310",
+ "adj2","val 97194",
+ "wedgeRoundRectCallout",
+ "adj1","val 46694",
+ "adj2","val 129726",
+ "adj3","val 16667",
+ "wedgeRectCallout",
+ "adj1","val 40037",
+ "adj2","val 111694",
+ "smileyFace",
+ "adj","val -9282",
+ "can",
+ "adj","val 50000",
+ "frame",
+ "adj1","val 10490",
+ "donut",
+ "adj","val 9601",
+ "bevel",
+ "adj","val 42592",
+ "foldedCorner",
+ "adj","val 10750",
+ "verticalScroll",
+ "adj","val 25000",
+ "horizontalScroll",
+ "adj","val 25000",
+ "cube",
+ "adj","val 85129",
+ "bracketPair",
+ "adj","val 50000",
+ "sun",
+ "adj","val 12500",
+ "bracePair",
+ "adj","val 25000",
+ "cloudCallout",
+ "adj1","val 77611",
+ "adj2","val -47819",
+ "borderCallout1",
+ "adj1","val 18750",
+ "adj2","val -8333",
+ "adj3","val 170013",
+ "adj4","val 143972",
+ "borderCallout2",
+ "adj1","val 18750",
+ "adj2","val -8333",
+ "adj3","val 113768",
+ "adj4","val -81930",
+ "adj5","val -22375",
+ "adj6","val -134550",
+ "blockArc",
+ "adj1","val 12975429",
+ "adj2","val 19424571",
+ "adj3","val 3770",
+ };
+
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX, &tempFile );
+
+ xmlDocUniquePtr pXmlDocCT = parseExport(tempFile, "ppt/slides/slide1.xml");
+ const OString sPattern( "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:prstGeom[@prst='_T_']/a:avLst/a:gd[_N_]" );
+ const OString sT( "_T_" );
+ const OString sN( "_N_" );
+ const OString sPropertyName("name");
+ const OString sPropertyFmla("fmla");
+
+ size_t i = 0;
+ while(i < SAL_N_ELEMENTS( sShapeTypeAndValues )) {
+ OString sType( sShapeTypeAndValues[ i++ ] );
+ for ( size_t j = 1 ; i < SAL_N_ELEMENTS( sShapeTypeAndValues ) && o3tl::starts_with(sShapeTypeAndValues[i], "adj") ; ++j ) {
+ OString sXPath= sPattern.replaceFirst( sT, sType).replaceFirst( sN, OString::number(j) );
+ assertXPath(pXmlDocCT, sXPath, sPropertyName , OUString::createFromAscii(sShapeTypeAndValues[ i++ ]) );
+ assertXPath(pXmlDocCT, sXPath, sPropertyFmla , OUString::createFromAscii(sShapeTypeAndValues[ i++ ]) );
+ }
+ }
+}
+
+void SdOOXMLExportTest2::testTdf92527()
+{
+ // We draw a diamond in an empty document.
+ // If custom shape has name and preset information in OOXML, should be export as preset shape.
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/empty.fodp"), FODG );
+ uno::Reference<css::lang::XMultiServiceFactory> xFactory(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShape1(xFactory->createInstance("com.sun.star.drawing.CustomShape"), uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc1(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XDrawPage> xPage1(xDoc1->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW);
+ xPage1->add(xShape1);
+ xShape1->setSize(awt::Size(10000, 10000));
+ xShape1->setPosition(awt::Point(1000, 1000));
+ uno::Sequence<beans::PropertyValue> aShapeGeometry(comphelper::InitPropertySequence(
+ {
+ {"Type", uno::Any(OUString("diamond"))},
+ }));
+ uno::Reference<beans::XPropertySet> xPropertySet1(xShape1, uno::UNO_QUERY);
+ xPropertySet1->setPropertyValue("CustomShapeGeometry", uno::Any(aShapeGeometry));
+
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc2(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XDrawPage> xPage2(xDoc2->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape2(xPage2->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference< beans::XPropertySet > xPropertySet2( xShape2, uno::UNO_QUERY_THROW );
+ uno::Sequence<beans::PropertyValue> aProps;
+ xPropertySet2->getPropertyValue("CustomShapeGeometry") >>= aProps;
+ uno::Sequence<beans::PropertyValue> aPathProps;
+ for (beans::PropertyValue const & rProp : std::as_const(aProps))
+ {
+ if (rProp.Name == "Path")
+ aPathProps = rProp.Value.get< uno::Sequence<beans::PropertyValue> >();
+ }
+ uno::Sequence<drawing::EnhancedCustomShapeParameterPair> aCoordinates;
+ for (beans::PropertyValue const & rProp : std::as_const(aPathProps))
+ {
+ if (rProp.Name == "Coordinates")
+ aCoordinates = rProp.Value.get< uno::Sequence<drawing::EnhancedCustomShapeParameterPair> >();
+ }
+
+ // 4 coordinate pairs
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), aCoordinates.getLength());
+ xDocShRef->DoClose();
+}
+
+namespace {
+
+void matchNumberFormat( int nPage, uno::Reference< text::XTextField > const & xField)
+{
+ uno::Reference< beans::XPropertySet > xPropSet( xField, uno::UNO_QUERY_THROW );
+ sal_Int32 nNumFmt;
+ xPropSet->getPropertyValue("NumberFormat") >>= nNumFmt;
+ switch( nPage )
+ {
+ case 0: // 13/02/96 (StdSmall)
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Date fields don't match", sal_Int32(SvxDateFormat::StdSmall), nNumFmt);
+ break;
+ case 1: // 13/02/1996
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Date fields don't match", sal_Int32(SvxDateFormat::B), nNumFmt);
+ break;
+ case 2: // Tuesday, June 29, 2021 (StdBig)
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Date fields don't match", sal_Int32(SvxDateFormat::StdBig), nNumFmt);
+ break;
+ case 3: // 13:49:38 (Standard)
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Time fields don't match", sal_Int32(SvxTimeFormat::Standard), nNumFmt);
+ break;
+ case 4: // 13:49
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Time fields don't match", sal_Int32(SvxTimeFormat::HH24_MM), nNumFmt);
+ break;
+ case 5: // 01:49 PM
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Time fields don't match", sal_Int32(SvxTimeFormat::HH12_MM), nNumFmt);
+ break;
+ case 6: // 01:49:38 PM
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Time fields don't match", sal_Int32(SvxTimeFormat::HH12_MM_SS), nNumFmt);
+ break;
+ case 7: // June 29, 2021
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Date fields don't match", sal_Int32(SvxDateFormat::D), nNumFmt);
+ break;
+ case 8: // Jun 29, 2021
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Number formats of Date fields don't match", sal_Int32(SvxDateFormat::C), nNumFmt);
+ break;
+ }
+}
+
+}
+
+void SdOOXMLExportTest2::testDatetimeFieldNumberFormat()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/numfmt.odp"), ODP);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ for(sal_uInt16 i = 0; i <= 8; ++i)
+ {
+ matchNumberFormat( i, getTextFieldFromPage(0, 0, 0, i, xDocShRef) );
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testDatetimeFieldNumberFormatPPTX()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/numfmt.pptx"), PPTX);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ for(sal_uInt16 i = 0; i <= 8; ++i)
+ {
+ matchNumberFormat( i, getTextFieldFromPage(0, 0, 0, i, xDocShRef) );
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testSlideNumberField()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/slidenum_field.odp"), ODP);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ uno::Reference< text::XTextField > xField = getTextFieldFromPage(0, 0, 0, 0, xDocShRef);
+ CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is() );
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testSlideNumberFieldPPTX()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/slidenum_field.pptx"), PPTX);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ uno::Reference< text::XTextField > xField = getTextFieldFromPage(0, 0, 0, 0, xDocShRef);
+ CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is() );
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testSlideCountField()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/slidecount_field.odp"), ODP);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ uno::Reference< text::XTextField > xField = getTextFieldFromPage(0, 0, 0, 0, xDocShRef);
+ CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is() );
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testSlideNameField()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/slidename_field.odp"), ODP);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ uno::Reference< text::XTextField > xField = getTextFieldFromPage(0, 0, 0, 0, xDocShRef);
+ CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is() );
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testExtFileField()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/extfile_field.odp"), ODP);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ for(sal_uInt16 i = 0; i <= 3; ++i)
+ {
+ uno::Reference< text::XTextField > xField = getTextFieldFromPage(0, 0, i, 0, xDocShRef);
+ CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is() );
+
+ uno::Reference< beans::XPropertySet > xPropSet( xField, uno::UNO_QUERY_THROW );
+ sal_Int32 nNumFmt;
+ xPropSet->getPropertyValue("FileFormat") >>= nNumFmt;
+ switch( i )
+ {
+ case 0: // Path/File name
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("File formats don't match", sal_Int32(0), nNumFmt);
+ break;
+ case 1: // Path
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("File formats don't match", sal_Int32(1), nNumFmt);
+ break;
+ case 2: // File name without extension
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("File formats don't match", sal_Int32(2), nNumFmt);
+ break;
+ case 3: // File name with extension
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("File formats don't match", sal_Int32(3), nNumFmt);
+ }
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testAuthorField()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/author_field.odp"), ODP);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ uno::Reference< text::XTextField > xField = getTextFieldFromPage(0, 0, 0, 0, xDocShRef);
+ CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is() );
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf99224()
+{
+ sd::DrawDocShellRef xShell = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf99224.odp"), ODP);
+ xShell = saveAndReload(xShell.get(), PPTX);
+ uno::Reference<drawing::XDrawPage> xPage = getPage(0, xShell);
+ // This was 0: the image with text was lost on export.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), xPage->getCount());
+ xShell->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf92076()
+{
+ sd::DrawDocShellRef xShell = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf92076.odp"), ODP);
+ xShell = saveAndReload(xShell.get(), PPTX);
+ uno::Reference<drawing::XDrawPage> xPage = getPage(0, xShell);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), xPage->getCount());
+ xShell->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf59046()
+{
+ sd::DrawDocShellRef xShell = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf59046.odp"), ODP);
+ utl::TempFile tempFile;
+ xShell = saveAndReload(xShell.get(), PPTX, &tempFile);
+ xShell->DoClose();
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path", 1);
+}
+
+void SdOOXMLExportTest2::testTdf133502()
+{
+ sd::DrawDocShellRef xShell = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf133502.odp"), ODP);
+ utl::TempFile tempFile;
+ xShell = saveAndReload(xShell.get(), PPTX, &tempFile);
+ xShell->DoClose();
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "ppt/comments/comment1.xml");
+
+ assertXPathContent(pXmlDocRels, "/p:cmLst/p:cm/p:text", "Test for creator-initials");
+
+ // Without the fix in place, the comment position would have been 0,0
+ assertXPath(pXmlDocRels, "/p:cmLst/p:cm/p:pos", "x", "2032");
+ assertXPath(pXmlDocRels, "/p:cmLst/p:cm/p:pos", "y", "1029");
+}
+
+void SdOOXMLExportTest2::testTdf105739()
+{
+ // Gradient was lost during saving to ODP
+ sd::DrawDocShellRef xShell = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf105739.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xShell = saveAndReload(xShell.get(), ODP, &tempFile);
+ uno::Reference<drawing::XDrawPage> xPage = getPage(0, xShell);
+ uno::Reference<beans::XPropertySet> xPropSet(xPage, uno::UNO_QUERY);
+ uno::Any aAny = xPropSet->getPropertyValue("Background");
+ CPPUNIT_ASSERT(aAny.hasValue());
+ if (aAny.hasValue())
+ {
+ uno::Reference< beans::XPropertySet > aXBackgroundPropSet;
+ aAny >>= aXBackgroundPropSet;
+
+ // Test fill type
+ drawing::FillStyle aFillStyle(drawing::FillStyle_NONE);
+ aXBackgroundPropSet->getPropertyValue("FillStyle") >>= aFillStyle;
+ CPPUNIT_ASSERT_EQUAL(int(drawing::FillStyle_GRADIENT), static_cast<int>(aFillStyle));
+
+ // Test gradient properties
+ com::sun::star::awt::Gradient aFillGradient;
+ aXBackgroundPropSet->getPropertyValue("FillGradient") >>= aFillGradient;
+ CPPUNIT_ASSERT_EQUAL(int(awt::GradientStyle_LINEAR), static_cast<int>(aFillGradient.Style));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0xff0000), aFillGradient.StartColor);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0x00b050), aFillGradient.EndColor);
+ }
+
+ xShell->DoClose();
+}
+
+void SdOOXMLExportTest2::testPageBitmapWithTransparency()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/page_transparent_bitmap.pptx"), PPTX );
+
+ xDocShRef = saveAndReload( xDocShRef.get(), ODP );
+ uno::Reference< drawing::XDrawPagesSupplier > xDoc(
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "There should be exactly one page", static_cast<sal_Int32>(1), xDoc->getDrawPages()->getCount() );
+
+ uno::Reference< drawing::XDrawPage > xPage( getPage( 0, xDocShRef ) );
+
+ uno::Reference< beans::XPropertySet > xPropSet( xPage, uno::UNO_QUERY );
+ uno::Any aAny = xPropSet->getPropertyValue( "Background" );
+ CPPUNIT_ASSERT_MESSAGE("Slide background is missing", aAny.hasValue());
+
+ uno::Reference< beans::XPropertySet > aXBackgroundPropSet;
+ aAny >>= aXBackgroundPropSet;
+ sal_Int32 nTransparence;
+ aAny = aXBackgroundPropSet->getPropertyValue( "FillTransparence" );
+ aAny >>= nTransparence;
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Slide background transparency is wrong", sal_Int32(49), nTransparence);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testPptmContentType()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptm/macro.pptm"), PPTM);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTM, &tempFile);
+
+ // Assert that the content type is the one of PPTM
+ xmlDocUniquePtr pXmlContentType = parseExport(tempFile, "[Content_Types].xml");
+ assertXPath(pXmlContentType,
+ "/ContentType:Types/ContentType:Override[@PartName='/ppt/presentation.xml']",
+ "ContentType",
+ "application/vnd.ms-powerpoint.presentation.macroEnabled.main+xml");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf111798()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf111798.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ const OUString data[][11] =
+ {
+ {
+ "2700000", "2458080", "2414880", "1439640", "1440000",
+ "gd[1]", "adj1", "val 50000",
+ "gd[2]", "adj2", "val 25000"
+ },
+ {
+ "2700000", "6778080", "2414880", "1439640", "1440000",
+ "gd[1]", "adj1", "val 50000",
+ "gd[2]", "adj2", "val 25006"
+ }
+ };
+
+ for (size_t nShapeIndex = 0; nShapeIndex < SAL_N_ELEMENTS(data); nShapeIndex++)
+ {
+ size_t nDataIndex = 0;
+
+ const OString sSpPr = "/p:sld/p:cSld/p:spTree/p:sp[" + OString::number(nShapeIndex + 1) + "]/p:spPr";
+ const OString sXfrm = sSpPr + "/a:xfrm";
+ assertXPath(pXmlDoc, sXfrm, "rot", data[nShapeIndex][nDataIndex++]);
+ const OString sOff = sXfrm + "/a:off";
+ assertXPath(pXmlDoc, sOff, "x", data[nShapeIndex][nDataIndex++]);
+ assertXPath(pXmlDoc, sOff, "y", data[nShapeIndex][nDataIndex++]);
+ const OString sExt = sXfrm + "/a:ext";
+ assertXPath(pXmlDoc, sExt, "cx", data[nShapeIndex][nDataIndex++]);
+ assertXPath(pXmlDoc, sExt, "cy", data[nShapeIndex][nDataIndex++]);
+
+ while (nDataIndex < SAL_N_ELEMENTS(data[nShapeIndex]))
+ {
+ const OString sGd = sSpPr + "/a:prstGeom/a:avLst/a:" + data[nShapeIndex][nDataIndex++].toUtf8() + "";
+ assertXPath(pXmlDoc, sGd, "name", data[nShapeIndex][nDataIndex++]);
+ assertXPath(pXmlDoc, sGd, "fmla", data[nShapeIndex][nDataIndex++]);
+ }
+ }
+}
+
+void SdOOXMLExportTest2::testPptmVBAStream()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptm/macro.pptm"), PPTM);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTM, &tempFile);
+
+ uno::Reference<packages::zip::XZipFileAccess2> xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), tempFile.GetURL());
+ // This failed: VBA stream was not roundtripped
+ CPPUNIT_ASSERT(xNameAccess->hasByName("ppt/vbaProject.bin"));
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf111863()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf111863.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ // check that transition attribute didn't change from 'out' to 'in'
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:animEffect",
+ "transition", "out");
+}
+
+void SdOOXMLExportTest2::testTdf111518()
+{
+ sd::DrawDocShellRef xShell = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf111518.pptx"), PPTX);
+ utl::TempFile tempFile;
+ tempFile.EnableKillingFile(false);
+ xShell = saveAndReload(xShell.get(), PPTX, &tempFile);
+ xShell->DoClose();
+
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "ppt/slides/slide1.xml");
+ OUString sActual = getXPath(pXmlDocRels,
+ "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:animMotion",
+ "path");
+ CPPUNIT_ASSERT_MOTIONPATH(u"M -3.54167E-6 -4.81481E-6 L 0.39037 -0.00069 E", sActual);
+}
+
+void SdOOXMLExportTest2::testTdf100387()
+{
+
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf100387.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ assertXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn", "dur", "indefinite");
+ assertXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[1]/p:cTn", "fill", "hold");
+ assertXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[1]/p:cTn/p:childTnLst/p:par/p:cTn", "fill", "hold");
+
+ assertXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[1]"
+ "/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set/p:cBhvr/p:tgtEl/p:spTgt/p:txEl/p:pRg", "st", "0");
+ assertXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[1]"
+ "/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set/p:cBhvr/p:tgtEl/p:spTgt/p:txEl/p:pRg", "end", "0");
+
+ assertXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[2]"
+ "/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set/p:cBhvr/p:tgtEl/p:spTgt/p:txEl/p:pRg", "st", "1");
+ assertXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[2]"
+ "/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set/p:cBhvr/p:tgtEl/p:spTgt/p:txEl/p:pRg", "end", "1");
+
+ assertXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[3]"
+ "/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set/p:cBhvr/p:tgtEl/p:spTgt/p:txEl/p:pRg", "st", "2");
+ assertXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[3]"
+ "/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set/p:cBhvr/p:tgtEl/p:spTgt/p:txEl/p:pRg", "end", "2");
+}
+
+// tdf#126746 Add support for Line Caps import and export
+void SdOOXMLExportTest2::testClosingShapesAndLineCaps()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/closed-shapes.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:custGeom/a:pathLst/a:path/a:moveTo/a:pt", 1);
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:custGeom/a:pathLst/a:path/a:lnTo[1]/a:pt", 1);
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:custGeom/a:pathLst/a:path/a:lnTo[2]/a:pt", 1);
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:custGeom/a:pathLst/a:path/a:close", 1);
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln", "cap", "rnd");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln/a:miter", 1);
+
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:custGeom/a:pathLst/a:path/a:close", 0);
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:ln", "cap", "rnd");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:ln/a:miter", 1);
+
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:custGeom/a:pathLst/a:path/a:close", 0);
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:ln", "cap", "rnd");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:ln/a:miter", 1);
+
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:spPr/a:custGeom/a:pathLst/a:path/a:close", 0);
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:spPr/a:ln", "cap", "sq");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:spPr/a:ln/a:round", 1);
+
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:spPr/a:custGeom/a:pathLst/a:path/a:close", 0);
+ assertXPathNoAttribute(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:spPr/a:ln", "cap"); // by default it is "flat" cap style
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:spPr/a:ln/a:bevel", 1);
+
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[6]/p:spPr/a:custGeom/a:pathLst/a:path/a:close", 0);
+ assertXPathNoAttribute(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:spPr/a:ln", "cap"); // by default it is "flat" cap style
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[6]/p:spPr/a:ln/a:round", 1);
+}
+
+void SdOOXMLExportTest2::testRotateFlip()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/rotate_flip.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ const OUString data[][4] =
+ {// flipH flipV x y
+ { "0", "1", "1170000", "1035720" },
+ { "1", "1", "7108560", "1036440" },
+ { "1", "0", "4140000", "1036440" }
+ };
+
+ const OUString points[][2] = { {"221", "293"}, {"506", "12" }, {"367", "0" }, {"29", "406"}, {"431", "347"}, {"145", "645"},
+ {"99", "520"}, {"0", "861"}, {"326", "765"}, {"209", "711"}, {"640", "233"}, {"640", "233"} };
+
+ for (size_t nShapeIndex = 0; nShapeIndex < SAL_N_ELEMENTS(data); nShapeIndex++)
+ {
+ size_t nDataIndex = 0;
+
+ const OString sSpPr = "/p:sld/p:cSld/p:spTree/p:sp[" + OString::number(nShapeIndex + 1) + "]/p:spPr";
+ const OString sXfrm = sSpPr + "/a:xfrm";
+ if(data[nShapeIndex][nDataIndex++] == "1")
+ assertXPath(pXmlDocContent, sXfrm, "flipH", "1");
+ if(data[nShapeIndex][nDataIndex++] == "1")
+ assertXPath(pXmlDocContent, sXfrm, "flipV", "1");
+ assertXPath(pXmlDocContent, sXfrm, "rot", "20400000");
+ const OString sOff = sXfrm + "/a:off";
+ assertXPath(pXmlDocContent, sOff, "x", data[nShapeIndex][nDataIndex++]);
+ assertXPath(pXmlDocContent, sOff, "y", data[nShapeIndex][nDataIndex++]);
+ const OString sExt = sXfrm + "/a:ext";
+ assertXPath(pXmlDocContent, sExt, "cx", "1800000");
+ assertXPath(pXmlDocContent, sExt, "cy", "3600000");
+
+ for (size_t nPointIndex = 0; nPointIndex < SAL_N_ELEMENTS(points); nPointIndex++)
+ {
+ const OString sPt = sSpPr + "/a:custGeom/a:pathLst/a:path/a:lnTo[" + OString::number(nPointIndex + 1) + "]/a:pt";
+ assertXPath(pXmlDocContent, sPt, "x", points[nPointIndex][0]);
+ assertXPath(pXmlDocContent, sPt, "y", points[nPointIndex][1]);
+ }
+ assertXPath(pXmlDocContent, sSpPr + "/a:custGeom/a:pathLst/a:path/a:close", 1);
+ }
+}
+
+void SdOOXMLExportTest2::testTdf106867()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf106867.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ const SdrPage *pPage = GetPage(1, xDocShRef.get());
+
+ // first check that we have the media object
+ const SdrMediaObj* pMediaObj = dynamic_cast<SdrMediaObj*>(pPage->GetObj(2));
+ CPPUNIT_ASSERT_MESSAGE("no media object", pMediaObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL(OUString("vnd.sun.star.Package:ppt/media/media1.avi"), pMediaObj->getURL());
+
+ xDocShRef->DoClose();
+
+ // additional checks of the output file
+ uno::Reference<packages::zip::XZipFileAccess2> xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), tempFile.GetURL());
+ // check that the document contains the video stream
+ CPPUNIT_ASSERT(xNameAccess->hasByName("ppt/media/media1.avi"));
+
+ // both the ooxml and the extended markup
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:nvPr/a:videoFile");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:nvPr/p:extLst/p:ext/p14:media");
+
+ // target the shape with the video in the command
+ assertXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:cmd/p:cBhvr/p:tgtEl/p:spTgt",
+ "spid", "42");
+}
+
+void SdOOXMLExportTest2::testTdf112280()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf112280.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ // check the animRot value
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:animRot",
+ "by", "21600000");
+}
+
+void SdOOXMLExportTest2::testTdf112088()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf112088.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ // check gradient stops
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPathChildren(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:gradFill/a:gsLst", 2);
+}
+
+void SdOOXMLExportTest2::testTdf112333()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf112333.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ OUString sTo = getXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set[1]/p:to/p:strVal", "val");
+ CPPUNIT_ASSERT_EQUAL(OUString("solid"), sTo);
+
+ OUString sAttributeName = getXPathContent(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set[1]/p:cBhvr/p:attrNameLst/p:attrName");
+ CPPUNIT_ASSERT_EQUAL(OUString("fill.type"), sAttributeName);
+
+ sTo = getXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set[2]/p:to/p:strVal", "val");
+ CPPUNIT_ASSERT_EQUAL(OUString("true"), sTo);
+
+ sAttributeName = getXPathContent(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set[2]/p:cBhvr/p:attrNameLst/p:attrName");
+ CPPUNIT_ASSERT_EQUAL(OUString("fill.on"), sAttributeName);
+
+ sTo = getXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:animClr/p:to/a:srgbClr", "val");
+ CPPUNIT_ASSERT_EQUAL(OUString("0563c1"), sTo);
+
+ sAttributeName = getXPathContent(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:animClr/p:cBhvr/p:attrNameLst/p:attrName");
+ CPPUNIT_ASSERT_EQUAL(OUString("fillcolor"), sAttributeName);
+}
+
+void SdOOXMLExportTest2::testTdf112552()
+{
+ // Background fill was not displayed, but it was because of the wrong geometry
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf112552.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path", "w", "21600");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path", "h", "21600");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path/a:lnTo[1]/a:pt", "x", "21600");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path/a:lnTo[1]/a:pt", "y", "0");
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf112557()
+{
+ // Subtitle shape should be skipped by export.
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf112557.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slideMasters/slideMaster1.xml");
+ assertXPath(pXmlDocContent, "/p:sldMaster/p:cSld/p:spTree/p:sp", 2); // title and object
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf128049()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf128049.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:custGeom", 0);
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom", "prst", "noSmoking");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom/a:avLst/a:gd", "name", "adj");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom/a:avLst/a:gd", "fmla", "val 12500");
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf106026()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf106026.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlMasterContent = parseExport(tempFile, "ppt/slideMasters/slideMaster1.xml");
+ assertXPath(pXmlMasterContent, "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[1]/a:pPr/a:spcBef/a:spcPts", "val", "1417");
+ assertXPath(pXmlMasterContent, "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[2]/a:pPr/a:spcBef/a:spcPts", "val", "1134");
+ assertXPath(pXmlMasterContent, "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[3]/a:pPr/a:spcBef/a:spcPts", "val", "850");
+ assertXPath(pXmlMasterContent, "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[4]/a:pPr/a:spcBef/a:spcPts", "val", "567");
+ assertXPath(pXmlMasterContent, "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[5]/a:pPr/a:spcBef/a:spcPts", "val", "283");
+ assertXPath(pXmlMasterContent, "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[6]/a:pPr/a:spcBef/a:spcPts", "val", "283");
+ assertXPath(pXmlMasterContent, "/p:sldMaster/p:cSld/p:spTree/p:sp/p:txBody/a:p[7]/a:pPr/a:spcBef/a:spcPts", "val", "283");
+
+ xmlDocUniquePtr pXmlSlideContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlSlideContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[1]/a:pPr/a:spcAft/a:spcPts", "val", "11339");
+ assertXPath(pXmlSlideContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr/a:spcAft/a:spcPts", "val", "11339");
+ assertXPath(pXmlSlideContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[3]/a:pPr/a:spcAft/a:spcPts", "val", "11339");
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf112334()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf112334.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ OUString sAttributeName = getXPathContent(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:animClr[1]/p:cBhvr/p:attrNameLst/p:attrName");
+ CPPUNIT_ASSERT_EQUAL(OUString("style.color"), sAttributeName);
+}
+
+void SdOOXMLExportTest2::testTdf112089()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf112089.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ OUString sID = getXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:graphicFrame/p:nvGraphicFramePr/p:cNvPr", "id");
+ OUString sTarget = getXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:set/p:cBhvr/p:tgtEl/p:spTgt", "spid");
+ CPPUNIT_ASSERT_EQUAL(sID, sTarget);
+}
+
+void SdOOXMLExportTest2::testTdf112086()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf112086.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ OUString sVal = getXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:anim[2]/p:tavLst/p:tav/p:val/p:fltVal", "val");
+ CPPUNIT_ASSERT_EQUAL(OUString("0"), sVal);
+
+ OUString sAttributeName = getXPathContent(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:anim[1]/p:cBhvr/p:attrNameLst/p:attrName");
+ CPPUNIT_ASSERT_EQUAL(OUString("ppt_w"), sAttributeName);
+
+ sVal = getXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:anim[2]/p:tavLst/p:tav/p:val/p:fltVal", "val");
+ CPPUNIT_ASSERT_EQUAL(OUString("0"), sVal);
+
+ sAttributeName = getXPathContent(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:anim[2]/p:cBhvr/p:attrNameLst/p:attrName");
+ CPPUNIT_ASSERT_EQUAL(OUString("ppt_h"), sAttributeName);
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf112647()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf112647.odp"), ODP);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+ uno::Reference<text::XTextRange> xParagraph( getParagraphFromShape( 0, xShape ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xParagraph, uno::UNO_QUERY_THROW );
+
+ css::style::LineSpacing aLineSpacing;
+ xPropSet->getPropertyValue("ParaLineSpacing") >>= aLineSpacing;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(css::style::LineSpacingMode::FIX), aLineSpacing.Mode);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2117), aLineSpacing.Height);
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testGroupRotation()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/group_rotation.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPathNoAttribute(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:grpSpPr/a:xfrm", "rot");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[1]/p:spPr/a:xfrm", "rot", "20400000");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[2]/p:spPr/a:xfrm", "rot", "20400000");
+}
+
+void SdOOXMLExportTest2::testTdf104788()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf104788.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide6.xml");
+
+ OUString sVal = getXPath(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[2]/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:anim[2]", "to");
+ CPPUNIT_ASSERT_EQUAL(-1.0, sVal.toDouble());
+
+ OUString sAttributeName = getXPathContent(pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par[2]/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:anim[2]/p:cBhvr/p:attrNameLst/p:attrName");
+ CPPUNIT_ASSERT_EQUAL(OUString("xshear"), sAttributeName);
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testSmartartRotation2()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/smartart-rotation2.pptx"), PPTX);
+
+ // clear SmartArt data to check how group shapes with double-rotated children are exported, not smartart
+ // NOTE: Resetting the GrabBag data is a *very* indirect way to reset the SmartArt functionality.
+ // Since this worked before and there is not (yet?) a better way to do it using UNO API, I added
+ // code to support this for now
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Sequence<beans::PropertyValue> aInteropGrabBag;
+ xShape->setPropertyValue("InteropGrabBag", uno::Any(aInteropGrabBag));
+
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPathContent(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[4]/p:txBody/a:p/a:r/a:t", "Text");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[4]/p:txBody/a:bodyPr", "rot", "10800000");
+ double dX = getXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[4]/p:spPr/a:xfrm/a:off", "x").toDouble();
+ double dY = getXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[4]/p:spPr/a:xfrm/a:off", "y").toDouble();
+ CPPUNIT_ASSERT_DOUBLES_EQUAL( 2276280.0, dX, dX * .001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL( 3158280.0, dY, dY * .001);
+}
+
+void SdOOXMLExportTest2::testTdf91999_rotateShape()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf91999_rotateShape.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvPr", "name", "CustomShape 2");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm", "rot", "10800000");
+ double dX = getXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm/a:off", "x").toDouble();
+ double dY = getXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm/a:off", "y").toDouble();
+ CPPUNIT_ASSERT_DOUBLES_EQUAL( 2960640.0, dX, dX * .001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL( 1449000.0, dY, dY * .001);
+}
+
+void SdOOXMLExportTest2::testTdf114845_rotateShape()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf114845_rotateShape.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:nvCxnSpPr/p:cNvPr", "name", "Straight Arrow Connector 9");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:spPr/a:xfrm", "flipV", "1");
+ double dX = getXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:spPr/a:xfrm/a:off", "x").toDouble();
+ double dY = getXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:cxnSp[2]/p:spPr/a:xfrm/a:off", "y").toDouble();
+ CPPUNIT_ASSERT_DOUBLES_EQUAL( 4059000.0, dX, dX * .001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL( 3287520.0, dY, dY * .001);
+}
+
+void SdOOXMLExportTest2::testGroupsPosition()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/group.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp[1]/p:sp[1]/p:spPr/a:xfrm/a:off", "x", "5004000");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp[1]/p:sp[1]/p:spPr/a:xfrm/a:off", "y", "3310560");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp[1]/p:sp[3]/p:spPr/a:xfrm/a:off", "x", "7760160");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp[1]/p:sp[3]/p:spPr/a:xfrm/a:off", "y", "3310560");
+}
+
+void SdOOXMLExportTest2::testGroupsRotatedPosition()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/group-rot.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[3]/p:spPr/a:xfrm/a:off", "x", "2857320");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[3]/p:spPr/a:xfrm/a:off", "y", "4026960");
+}
+
+void SdOOXMLExportTest2::testAccentColor()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/accent-color.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:sp/p:style/a:fillRef/a:schemeClr", "val", "accent6");
+ xmlDocUniquePtr pXmlDocContent2 = parseExport(tempFile, "ppt/slides/slide2.xml");
+ assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:spTree/p:sp/p:style/a:fillRef/a:schemeClr", "val", "accent6");
+ xmlDocUniquePtr pXmlDocTheme1 = parseExport(tempFile, "ppt/theme/theme1.xml");
+ assertXPath(pXmlDocTheme1, "/a:theme/a:themeElements/a:clrScheme/a:accent6/a:srgbClr", "val", "70ad47");
+ xmlDocUniquePtr pXmlDocTheme2 = parseExport(tempFile, "ppt/theme/theme2.xml");
+ assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:accent6/a:srgbClr", "val", "deb340");
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: Motyw pakietu Office
+ // - Actual : Office Theme
+ // i.e. the theme and color scheme name was lost on export.
+ assertXPath(pXmlDocTheme1, "/a:theme", "name", "Motyw pakietu Office");
+ assertXPath(pXmlDocTheme1, "/a:theme/a:themeElements/a:clrScheme", "name", "Pakiet Office");
+}
+
+void SdOOXMLExportTest2::testThemeColors()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf84205.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocTheme2 = parseExport(tempFile, "ppt/theme/theme2.xml");
+ assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:dk2/a:srgbClr", "val", "44546a");
+ assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:accent3/a:srgbClr", "val", "a5a5a5");
+}
+
+void SdOOXMLExportTest2::testTdf111785()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf111785.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: ed1c24
+ // - Actual : ffffff
+ assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:spPr/a:pattFill/a:bgClr/a:srgbClr", "val", "ed1c24");
+}
+
+void SdOOXMLExportTest2::testTdf118825()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf118825-motionpath.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+
+ CPPUNIT_ASSERT_MOTIONPATH(u"M 0.0449285714285714 0.00368253968253968 C 0.0575714285714285 -0.00095238095238096 0.0704264795523803 -0.00370117418637049 0.0831071428571428 -0.00819047619047622 C 0.0953550597998766 -0.0125265741339082 0.107821870086751 -0.010397536991717 0.120321428571429 -0.0115555555555556 C 0.133179018681433 -0.0127467438724762 0.151318627483861 -0.0158700272533852 0.1585 0.00539682539682542 C 0.16478291361998 0.0240029898688431 0.15828642886492 0.0483806254341085 0.161392857142857 0.0698412698412698 C 0.165179286017685 0.0959996731216037 0.17453898927982 0.119735912694626 0.187142857142857 0.132634920634921 C 0.199788991845377 0.145577185161529 0.215607110490848 0.142889773028431 0.230107142857143 0.142857142857143 C 0.243821417584191 0.142826280916829 0.257716514999779 0.142685979556724 0.271142857142857 0.137777777777778 C 0.286895094567923 0.132019309914514 0.302318190711873 0.122962218306185 0.317928571428571 0.11568253968254 C 0.333496771884548 0.108422531222479 0.348787823719556 0.0990570571890929 0.363714285714286 0.0885079365079364 C 0.374930683062651 0.080580865157908 0.385357142857143 0.0693333333333332 0.396178571428571 0.0596825396825396 L 0.404785714285714 0.0410158730158729 L 0.401892857142857 0.0342222222222221 E", getXPath(pXmlDocContent, "(//p:animMotion)[1]", "path"));
+ CPPUNIT_ASSERT_MOTIONPATH(u"M 0.025 0.0571428571428571 L 0.0821428571428571 0.184126984126984 L -0.175 0.234920634920635 L -0.246428571428571 -0.0190476190476191 L -0.0821428571428573 -0.133333333333333 E", getXPath(pXmlDocContent, "(//p:animMotion)[2]", "path"));
+ CPPUNIT_ASSERT_MOTIONPATH(u"M -0.0107142857142857 0.00634920634920635 C -0.110714285714286 0.501587301587301 -0.153571428571429 -0.00634920634920635 -0.246428571428572 0.184126984126984 C -0.339285714285715 0.374603174603175 -0.296428571428572 0.514285714285714 -0.267857142857143 0.603174603174603 C -0.239285714285715 0.692063492063492 0.0607142857142858 0.590476190476191 0.0607142857142858 0.590476190476191 E", getXPath(pXmlDocContent, "(//p:animMotion)[3]", "path"));
+ CPPUNIT_ASSERT_MOTIONPATH(u"M 0.0535714285714286 -0.0444444444444444 L 0.132142857142857 -0.0444444444444444 L 0.132142857142857 -0.146031746031746 L 0.0964285714285715 -0.146031746031746 E", getXPath(pXmlDocContent, "(//p:animMotion)[4]", "path"));
+ xDocShRef->DoClose();
+}
+
+
+void SdOOXMLExportTest2::testTextColumns_tdf140852()
+{
+ // The document defines two columns in slideLayout12.xml, but explicitly redefines
+ // in slide1.xml. Here we check that the redefinition in the slide takes precedence.
+
+ auto xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf140852.pptx"), PPTX);
+
+ {
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier = getDoc(xDocShRef);
+ uno::Reference<drawing::XDrawPages> xPages = xDrawPagesSupplier->getDrawPages();
+ uno::Reference<drawing::XDrawPage> xPage(xPages->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<container::XIndexAccess> xIndexAccess(xPage, uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xProps(xShape, uno::UNO_QUERY_THROW);
+ uno::Reference<text::XTextRange> const xParagraph(getParagraphFromShape(0, xProps));
+ CPPUNIT_ASSERT_EQUAL(OUString("Training will be treated as part of sharing the sweet when "
+ "it comes to serving ice cream"),
+ xParagraph->getString());
+ uno::Reference<text::XTextColumns> xCols(xProps->getPropertyValue("TextColumns"),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(1), xCols->getColumnCount());
+ uno::Reference<beans::XPropertySet> xColProps(xCols, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(1000)),
+ xColProps->getPropertyValue("AutomaticDistance"));
+ }
+
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ {
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier = getDoc(xDocShRef);
+ uno::Reference<drawing::XDrawPages> xPages = xDrawPagesSupplier->getDrawPages();
+ uno::Reference<drawing::XDrawPage> xPage(xPages->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<container::XIndexAccess> xIndexAccess(xPage, uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xProps(xShape, uno::UNO_QUERY_THROW);
+ uno::Reference<text::XTextRange> const xParagraph(getParagraphFromShape(0, xProps));
+ CPPUNIT_ASSERT_EQUAL(OUString("Training will be treated as part of sharing the sweet when "
+ "it comes to serving ice cream"),
+ xParagraph->getString());
+ uno::Reference<text::XTextColumns> xCols(xProps->getPropertyValue("TextColumns"),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(1), xCols->getColumnCount());
+ uno::Reference<beans::XPropertySet> xColProps(xCols, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(1000)),
+ xColProps->getPropertyValue("AutomaticDistance"));
+ }
+
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr", "numCol", "1");
+ assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr", "spcCol", "360000");
+
+ tempFile.EnableKillingFile();
+}
+
+void SdOOXMLExportTest2::testTextColumns_3columns()
+{
+ auto xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/3columns.pptx"), PPTX);
+
+ {
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier = getDoc(xDocShRef);
+ uno::Reference<drawing::XDrawPages> xPages = xDrawPagesSupplier->getDrawPages();
+ uno::Reference<drawing::XDrawPage> xPage(xPages->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<container::XIndexAccess> xIndexAccess(xPage, uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xProps(xShape, uno::UNO_QUERY_THROW);
+ uno::Reference<text::XTextColumns> xCols(xProps->getPropertyValue("TextColumns"),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(3), xCols->getColumnCount());
+ uno::Reference<beans::XPropertySet> xColProps(xCols, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(300)),
+ xColProps->getPropertyValue("AutomaticDistance"));
+ // Scale value may be unstable; just test that the text is actually scaled
+ sal_Int16 nScale;
+ CPPUNIT_ASSERT(xProps->getPropertyValue("TextFitToSizeScale") >>= nScale);
+ CPPUNIT_ASSERT_GREATER(sal_Int16(0), nScale);
+ CPPUNIT_ASSERT_LESS(sal_Int16(100), nScale);
+ }
+
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ {
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier = getDoc(xDocShRef);
+ uno::Reference<drawing::XDrawPages> xPages = xDrawPagesSupplier->getDrawPages();
+ uno::Reference<drawing::XDrawPage> xPage(xPages->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<container::XIndexAccess> xIndexAccess(xPage, uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xProps(xShape, uno::UNO_QUERY_THROW);
+ uno::Reference<text::XTextColumns> xCols(xProps->getPropertyValue("TextColumns"),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(3), xCols->getColumnCount());
+ uno::Reference<beans::XPropertySet> xColProps(xCols, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(300)),
+ xColProps->getPropertyValue("AutomaticDistance"));
+ // Scale value may be unstable; just test that the text is actually scaled
+ sal_Int16 nScale;
+ CPPUNIT_ASSERT(xProps->getPropertyValue("TextFitToSizeScale") >>= nScale);
+ CPPUNIT_ASSERT_GREATER(sal_Int16(0), nScale);
+ CPPUNIT_ASSERT_LESS(sal_Int16(100), nScale);
+ }
+
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr", "numCol", "3");
+ assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr", "spcCol", "108000");
+
+ tempFile.EnableKillingFile();
+}
+
+void SdOOXMLExportTest2::testTdf59323_slideFooters()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf59323.pptx"), PPTX);
+
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xDoc->getDrawPages()->getCount());
+
+ for (int nPageIndex = 0; nPageIndex < 3; nPageIndex++)
+ {
+ uno::Reference<drawing::XDrawPage> xPage(getPage(0, xDocShRef));
+ uno::Reference<beans::XPropertySet> xPropSet(xPage, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(true, xPropSet->getPropertyValue("IsFooterVisible").get<bool>());
+ CPPUNIT_ASSERT_EQUAL(true, xPropSet->getPropertyValue("IsDateTimeVisible").get<bool>());
+ CPPUNIT_ASSERT_EQUAL(true, xPropSet->getPropertyValue("IsPageNumberVisible").get<bool>());
+ }
+
+ // Test placeholder indexes
+ xmlDocUniquePtr pXmlDocMaster = parseExport(tempFile, "ppt/slideMasters/slideMaster1.xml");
+ assertXPath(pXmlDocMaster, "//p:ph [@type='dt']", "idx", "1");
+ assertXPath(pXmlDocMaster, "//p:ph [@type='ftr']", "idx", "2");
+ assertXPath(pXmlDocMaster, "//p:ph [@type='sldNum']", "idx", "3");
+
+ xmlDocUniquePtr pXmlDocSlide1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocSlide1, "//p:ph [@type='dt']", "idx", "1");
+ assertXPath(pXmlDocSlide1, "//p:ph [@type='ftr']", "idx", "2");
+ assertXPath(pXmlDocSlide1, "//p:ph [@type='sldNum']", "idx", "3");
+
+ // Test if datetime fields have text in them
+ // This is needed for backwards compatibility
+ assertXPath(pXmlDocSlide1, "//a:fld [@type='datetime1']/a:t");
+
+ // tdf#143316: Without the fix in place, this test would have failed with
+ // - Expected: 1
+ // - Actual : 0
+ assertXPath(pXmlDocSlide1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:fld/a:rPr");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest2::testTdf53970()
+{
+ // Embedded media file
+ {
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf53970.odp"), ODP);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ // Without fix in place, the media shape was lost on export.
+ CPPUNIT_ASSERT(getPage(0, xDocShRef)->hasElements());
+
+ xDocShRef->DoClose();
+ }
+
+ // Linked media file
+ {
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf53970_linked.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlRels = parseExport(tempFile, "ppt/slides/_rels/slide1.xml.rels");
+ CPPUNIT_ASSERT(pXmlRels);
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@TargetMode='External']", 2);
+
+ uno::Reference<beans::XPropertySet> xShape(getShape(0, getPage(0, xDocShRef)));
+ CPPUNIT_ASSERT(xShape.is());
+ OUString sVideoURL;
+
+ // Without fix in place, the media shape was imported as an image after export
+ // and this test would have failed with exception of type com.sun.star.beans.UnknownPropertyException
+ CPPUNIT_ASSERT_MESSAGE("MediaURL property is not set",
+ xShape->getPropertyValue("MediaURL") >>= sVideoURL);
+ CPPUNIT_ASSERT_MESSAGE("MediaURL is empty", !sVideoURL.isEmpty());
+
+ xDocShRef->DoClose();
+ }
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdOOXMLExportTest2);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/export-tests-ooxml3.cxx b/sd/qa/unit/export-tests-ooxml3.cxx
new file mode 100644
index 000000000..5f4928b66
--- /dev/null
+++ b/sd/qa/unit/export-tests-ooxml3.cxx
@@ -0,0 +1,2265 @@
+
+/* -*- 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 <officecfg/Office/Common.hxx>
+#include "sdmodeltestbase.hxx"
+#include <comphelper/sequence.hxx>
+#include <comphelper/sequenceashashmap.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/editobj.hxx>
+#include <editeng/numitem.hxx>
+#include <editeng/unoprnms.hxx>
+
+#include <svx/xlineit0.hxx>
+#include <svx/xlndsit.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdotable.hxx>
+
+#include <com/sun/star/awt/FontUnderline.hpp>
+#include <com/sun/star/drawing/EnhancedCustomShapeAdjustmentValue.hpp>
+#include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/frame/XLoadable.hpp>
+#include <com/sun/star/lang/Locale.hpp>
+#include <com/sun/star/text/GraphicCrop.hpp>
+
+#include <sdpage.hxx>
+
+class SdOOXMLExportTest3 : public SdModelTestBaseXML
+{
+public:
+ void testTdf92222();
+ void testTdf129430();
+ void testTdf114848();
+ void testTdf147586();
+ void testTdf68759();
+ void testTdf127901();
+ void testTdf48735();
+ void testTdf90626();
+ void testTdf107608();
+ void testTdf111786();
+ void testFontScale();
+ void testShapeAutofitPPTX();
+ void testLegacyShapeAutofitPPTX();
+ void testTdf115394();
+ void testTdf115394Zero();
+ void testTdf115005();
+ int testTdf115005_FallBack_Images(bool bAddReplacementImages);
+ void testTdf115005_FallBack_Images_On();
+ void testTdf115005_FallBack_Images_Off();
+ void testTdf118806();
+ void testTdf130058();
+ void testTdf111789();
+ void testTdf145162();
+ void testZeroIndentExport();
+ void testTdf100348_convert_Fontwork2TextWarp();
+ void testTdf1225573_FontWorkScaleX();
+ void testTdf99497_keepAppearanceOfCircleKind();
+ /// SmartArt animated elements
+ void testTdf104792();
+ void testTdf90627();
+ void testTdf104786();
+ void testTdf118783();
+ void testTdf104789();
+ void testOpenDocumentAsReadOnly();
+ void testTdf118835();
+ void testTdf118768();
+ void testTdf118836();
+ void testTdf116350TextEffects();
+ void testTdf128096();
+ void testTdf120573();
+ void testTdf119118();
+ void testTdf99213();
+ void testPotxExport();
+ void testTdf44223();
+ void testTdf135843();
+ void testSmartArtPreserve();
+ void testTdf125346();
+ void testTdf125346_2();
+ void testTdf125360();
+ void testTdf125360_1();
+ void testTdf125360_2();
+ void testTdf125551();
+ void testTdf136830();
+ void testTdf126234();
+ void testTdf126741();
+ void testTdf127372();
+ void testTdf127379();
+ void testTdf98603();
+ void testTdf79082();
+ void testTdf128213();
+ void testTdf129372();
+ void testShapeGlowEffect();
+ void testUnderline();
+ void testTdf119087();
+ void testTdf131554();
+ void testTdf132282();
+ void testTdf132201EffectOrder();
+ void testShapeSoftEdgeEffect();
+ void testShapeShadowBlurEffect();
+ void testTdf119223();
+ void testTdf128213ShapeRot();
+ void testTdf125560_textDeflate();
+ void testTdf125560_textInflateTop();
+ void testTdf96061_textHighlight();
+ void testTdf143222_embeddedWorksheet();
+ void testTdf142235_TestPlaceholderTextAlignment();
+ void testTdf143315();
+ void testTdf147121();
+ void testTdf140912_PicturePlaceholder();
+ void testEnhancedPathViewBox();
+ void testTdf74670();
+ void testTdf109169_OctagonBevel();
+ void testTdf109169_DiamondBevel();
+ void testTdf144092_emptyShapeTextProps();
+ void testTdf94122_autoColor();
+ void testTdf124333();
+ void testAutofittedTextboxIndent();
+ void testTdf152436();
+
+ CPPUNIT_TEST_SUITE(SdOOXMLExportTest3);
+
+ CPPUNIT_TEST(testTdf92222);
+ CPPUNIT_TEST(testTdf129430);
+ CPPUNIT_TEST(testTdf114848);
+ CPPUNIT_TEST(testTdf147586);
+ CPPUNIT_TEST(testTdf68759);
+ CPPUNIT_TEST(testTdf127901);
+ CPPUNIT_TEST(testTdf48735);
+ CPPUNIT_TEST(testTdf90626);
+ CPPUNIT_TEST(testTdf107608);
+ CPPUNIT_TEST(testTdf111786);
+ CPPUNIT_TEST(testFontScale);
+ CPPUNIT_TEST(testShapeAutofitPPTX);
+ CPPUNIT_TEST(testLegacyShapeAutofitPPTX);
+ CPPUNIT_TEST(testTdf115394);
+ CPPUNIT_TEST(testTdf115394Zero);
+ CPPUNIT_TEST(testTdf115005);
+ CPPUNIT_TEST(testTdf115005_FallBack_Images_On);
+ CPPUNIT_TEST(testTdf115005_FallBack_Images_Off);
+ CPPUNIT_TEST(testTdf118806);
+ CPPUNIT_TEST(testTdf130058);
+ CPPUNIT_TEST(testTdf111789);
+ CPPUNIT_TEST(testTdf145162);
+ CPPUNIT_TEST(testZeroIndentExport);
+ CPPUNIT_TEST(testTdf100348_convert_Fontwork2TextWarp);
+ CPPUNIT_TEST(testTdf1225573_FontWorkScaleX);
+ CPPUNIT_TEST(testTdf99497_keepAppearanceOfCircleKind);
+ CPPUNIT_TEST(testTdf104792);
+ CPPUNIT_TEST(testTdf90627);
+ CPPUNIT_TEST(testTdf104786);
+ CPPUNIT_TEST(testTdf118783);
+ CPPUNIT_TEST(testTdf104789);
+ CPPUNIT_TEST(testOpenDocumentAsReadOnly);
+ CPPUNIT_TEST(testTdf118835);
+ CPPUNIT_TEST(testTdf118768);
+ CPPUNIT_TEST(testTdf118836);
+ CPPUNIT_TEST(testTdf116350TextEffects);
+ CPPUNIT_TEST(testTdf128096);
+ CPPUNIT_TEST(testTdf120573);
+ CPPUNIT_TEST(testTdf119118);
+ CPPUNIT_TEST(testTdf99213);
+ CPPUNIT_TEST(testPotxExport);
+ CPPUNIT_TEST(testTdf44223);
+ CPPUNIT_TEST(testTdf135843);
+ CPPUNIT_TEST(testSmartArtPreserve);
+ CPPUNIT_TEST(testTdf125346);
+ CPPUNIT_TEST(testTdf125346_2);
+ CPPUNIT_TEST(testTdf125360);
+ CPPUNIT_TEST(testTdf125360_1);
+ CPPUNIT_TEST(testTdf125360_2);
+ CPPUNIT_TEST(testTdf125551);
+ CPPUNIT_TEST(testTdf136830);
+ CPPUNIT_TEST(testTdf126234);
+ CPPUNIT_TEST(testTdf126741);
+ CPPUNIT_TEST(testTdf127372);
+ CPPUNIT_TEST(testTdf127379);
+ CPPUNIT_TEST(testTdf98603);
+ CPPUNIT_TEST(testTdf79082);
+ CPPUNIT_TEST(testTdf128213);
+ CPPUNIT_TEST(testTdf129372);
+ CPPUNIT_TEST(testShapeGlowEffect);
+ CPPUNIT_TEST(testUnderline);
+ CPPUNIT_TEST(testTdf119087);
+ CPPUNIT_TEST(testTdf131554);
+ CPPUNIT_TEST(testTdf132282);
+ CPPUNIT_TEST(testTdf132201EffectOrder);
+ CPPUNIT_TEST(testShapeSoftEdgeEffect);
+ CPPUNIT_TEST(testShapeShadowBlurEffect);
+ CPPUNIT_TEST(testTdf119223);
+ CPPUNIT_TEST(testTdf128213ShapeRot);
+ CPPUNIT_TEST(testTdf125560_textDeflate);
+ CPPUNIT_TEST(testTdf125560_textInflateTop);
+ CPPUNIT_TEST(testTdf96061_textHighlight);
+ CPPUNIT_TEST(testTdf143222_embeddedWorksheet);
+ CPPUNIT_TEST(testTdf142235_TestPlaceholderTextAlignment);
+ CPPUNIT_TEST(testTdf143315);
+ CPPUNIT_TEST(testTdf147121);
+ CPPUNIT_TEST(testTdf140912_PicturePlaceholder);
+ CPPUNIT_TEST(testEnhancedPathViewBox);
+ CPPUNIT_TEST(testTdf74670);
+ CPPUNIT_TEST(testTdf109169_OctagonBevel);
+ CPPUNIT_TEST(testTdf109169_DiamondBevel);
+ CPPUNIT_TEST(testTdf144092_emptyShapeTextProps);
+ CPPUNIT_TEST(testTdf94122_autoColor);
+ CPPUNIT_TEST(testTdf124333);
+ CPPUNIT_TEST(testAutofittedTextboxIndent);
+ CPPUNIT_TEST(testTdf152436);
+ CPPUNIT_TEST_SUITE_END();
+
+ virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override
+ {
+ XmlTestTools::registerODFNamespaces(pXmlXPathCtx);
+ XmlTestTools::registerOOXMLNamespaces(pXmlXPathCtx);
+ }
+};
+
+void SdOOXMLExportTest3::testTdf92222()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf92222.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocTheme = parseExport(tempFile, "ppt/theme/theme1.xml");
+ assertXPath(pXmlDocTheme, "/a:theme/a:themeElements/a:fmtScheme/a:lnStyleLst/a:ln[1]", "w",
+ "6350");
+ assertXPath(pXmlDocTheme, "/a:theme/a:themeElements/a:fmtScheme/a:lnStyleLst/a:ln[2]", "w",
+ "12700");
+ assertXPath(pXmlDocTheme, "/a:theme/a:themeElements/a:fmtScheme/a:lnStyleLst/a:ln[3]", "w",
+ "19050");
+}
+
+void SdOOXMLExportTest3::testTdf129430()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf129430.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[2]/a:pPr/a:lnSpc/a:spcPct",
+ "val", "100000");
+}
+
+void SdOOXMLExportTest3::testTdf114848()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf114848.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocTheme1 = parseExport(tempFile, "ppt/theme/theme1.xml");
+ assertXPath(pXmlDocTheme1, "/a:theme/a:themeElements/a:clrScheme/a:dk2/a:srgbClr", "val",
+ "1f497d");
+ xmlDocUniquePtr pXmlDocTheme2 = parseExport(tempFile, "ppt/theme/theme2.xml");
+ assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:dk2/a:srgbClr", "val",
+ "1f497d");
+}
+
+void SdOOXMLExportTest3::testTdf147586()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf147586.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ // Without the fix in place, this test would have failed with
+ // - Expected: 227fc7
+ // - Actual : 4f4f4f
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:p[1]/a:pPr/a:buClr/a:srgbClr", "val",
+ "227fc7");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:p[2]/a:pPr/a:buClr/a:srgbClr", "val",
+ "227fc7");
+}
+
+void SdOOXMLExportTest3::testTdf68759()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf68759.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[1]/p:spPr/a:xfrm/a:off", "x",
+ "1687320");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[1]/p:spPr/a:xfrm/a:off", "y",
+ "1615320");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[2]/p:spPr/a:xfrm", "flipH", "1");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[2]/p:spPr/a:xfrm", "rot", "9600000");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[2]/p:spPr/a:xfrm/a:off", "x",
+ "3847320");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[2]/p:spPr/a:xfrm/a:off", "y",
+ "1614600");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[3]/p:spPr/a:xfrm", "flipH", "1");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[3]/p:spPr/a:xfrm/a:off", "x",
+ "5934960");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:pic[3]/p:spPr/a:xfrm/a:off", "y",
+ "1615320");
+}
+
+void SdOOXMLExportTest3::testTdf127901()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf127901.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:lum", "bright",
+ "70000");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:lum", "contrast",
+ "-70000");
+
+ xmlDocUniquePtr pXmlDocContent2 = parseExport(tempFile, "ppt/slides/slide2.xml");
+ assertXPath(pXmlDocContent2, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:grayscl", 1);
+
+ xmlDocUniquePtr pXmlDocContent3 = parseExport(tempFile, "ppt/slides/slide3.xml");
+ assertXPath(pXmlDocContent3, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:blip/a:biLevel",
+ "thresh", "50000");
+}
+
+void SdOOXMLExportTest3::testTdf48735()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf48735.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:srcRect", "b", "23627");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:srcRect", "l", "23627");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:srcRect", "r", "23627");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:pic/p:blipFill/a:srcRect", "t", "18842");
+}
+
+void SdOOXMLExportTest3::testTdf90626()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf90626.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[1]/a:pPr/a:buSzPct",
+ "val", "100000");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr/a:buSzPct",
+ "val", "150142");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[3]/a:pPr/a:buSzPct",
+ "val", "100000");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[4]/a:pPr/a:buSzPct",
+ "val", "150142");
+}
+
+void SdOOXMLExportTest3::testTdf107608()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf107608.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<beans::XPropertySet> xPropSet(xShape, uno::UNO_SET_THROW);
+
+ drawing::FillStyle aFillStyle(drawing::FillStyle_NONE);
+ xPropSet->getPropertyValue("FillStyle") >>= aFillStyle;
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, aFillStyle);
+
+ bool bBackgroundFill = false;
+ xPropSet->getPropertyValue("FillBackground") >>= bBackgroundFill;
+ CPPUNIT_ASSERT(bBackgroundFill);
+
+ Color nBackgroundColor;
+ xPropSet->getPropertyValue("FillColor") >>= nBackgroundColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x92D050), nBackgroundColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf111786()
+{
+ // Export line transparency with the color
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf111786.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<beans::XPropertySet> xPropSet(xShape, uno::UNO_SET_THROW);
+
+ Color nLineColor;
+ xPropSet->getPropertyValue("LineColor") >>= nLineColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x3465A4), nLineColor);
+
+ sal_Int16 nTransparency;
+ xPropSet->getPropertyValue("LineTransparence") >>= nTransparency;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(33), nTransparency);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testFontScale()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/font-scale.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ // Rounding errors possible, approximate value (+/- 1%)
+ OUString sScale = getXPath(
+ pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr/a:normAutofit", "fontScale");
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(76000), sScale.toInt32(), 1000);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testShapeAutofitPPTX()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/testShapeAutofit.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ CPPUNIT_ASSERT(pXmlDocContent);
+
+ // TextAutoGrowHeight --> "Resize shape to fit text" --> true
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr/a:spAutoFit", 1);
+ // TextAutoGrowHeight --> "Resize shape to fit text" --> false
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr/a:noAutofit", 1);
+}
+
+void SdOOXMLExportTest3::testLegacyShapeAutofitPPTX()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/testLegacyShapeAutofit.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ CPPUNIT_ASSERT(pXmlDocContent);
+
+ // Text in a legacy rectangle
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr/a:noAutofit", 1);
+ // Text in (closed) Polygon
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr/a:noAutofit", 1);
+ // Text in a legacy ellipse
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:txBody/a:bodyPr/a:noAutofit", 1);
+}
+
+void SdOOXMLExportTest3::testTdf115394()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf115394.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ double fTransitionDuration;
+
+ // Slow in MS formats
+ SdPage* pPage1 = xDocShRef->GetDoc()->GetSdPage(0, PageKind::Standard);
+ fTransitionDuration = pPage1->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(1.0, fTransitionDuration);
+
+ // Medium in MS formats
+ SdPage* pPage2 = xDocShRef->GetDoc()->GetSdPage(1, PageKind::Standard);
+ fTransitionDuration = pPage2->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.75, fTransitionDuration);
+
+ // Fast in MS formats
+ SdPage* pPage3 = xDocShRef->GetDoc()->GetSdPage(2, PageKind::Standard);
+ fTransitionDuration = pPage3->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.5, fTransitionDuration);
+
+ // Custom values
+ SdPage* pPage4 = xDocShRef->GetDoc()->GetSdPage(3, PageKind::Standard);
+ fTransitionDuration = pPage4->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.25, fTransitionDuration);
+
+ SdPage* pPage5 = xDocShRef->GetDoc()->GetSdPage(4, PageKind::Standard);
+ fTransitionDuration = pPage5->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(4.25, fTransitionDuration);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf115394Zero()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf115394-zero.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ double fTransitionDuration;
+
+ SdPage* pPage = xDocShRef->GetDoc()->GetSdPage(0, PageKind::Standard);
+ fTransitionDuration = pPage->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.01, fTransitionDuration);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf115005()
+{
+ sd::DrawDocShellRef xDocShRefOriginal
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf115005.odp"), ODP);
+ utl::TempFile tempFile;
+ sd::DrawDocShellRef xDocShRefResaved = saveAndReload(xDocShRefOriginal.get(), ODP, &tempFile);
+
+ // additional checks of the output file
+ uno::Reference<packages::zip::XZipFileAccess2> xNameAccess
+ = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory),
+ tempFile.GetURL());
+
+ // check that the document contains original vector images
+ const uno::Sequence<OUString> names = xNameAccess->getElementNames();
+ int nSVMFiles = 0;
+ for (OUString const& s : names)
+ {
+ if (s.endsWith(".svm"))
+ nSVMFiles++;
+ }
+ CPPUNIT_ASSERT_EQUAL(3, nSVMFiles);
+}
+
+int SdOOXMLExportTest3::testTdf115005_FallBack_Images(bool bAddReplacementImages)
+{
+ sd::DrawDocShellRef xDocShRefOriginal = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf115005_no_fallback_images.odp"), ODP);
+
+ // check if fallback images were not created if AddReplacementImages=true/false
+ // set AddReplacementImages
+ {
+ std::shared_ptr<comphelper::ConfigurationChanges> batch(
+ comphelper::ConfigurationChanges::create());
+ if (!officecfg::Office::Common::Save::Graphic::AddReplacementImages::isReadOnly())
+ officecfg::Office::Common::Save::Graphic::AddReplacementImages::set(
+ bAddReplacementImages, batch);
+ batch->commit();
+ }
+
+ // save the file with already set options
+ utl::TempFile tempFile;
+ sd::DrawDocShellRef xDocShRefResaved = saveAndReload(xDocShRefOriginal.get(), ODP, &tempFile);
+
+ // additional checks of the output file
+ uno::Reference<packages::zip::XZipFileAccess2> xNameAccess
+ = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory),
+ tempFile.GetURL());
+
+ // check that the document contains original vector images
+ const uno::Sequence<OUString> names = xNameAccess->getElementNames();
+ int nSVMFiles = 0;
+ int nPNGFiles = 0;
+ for (OUString const& n : names)
+ {
+ if (n.endsWith(".svm"))
+ nSVMFiles++;
+ if (n.endsWith(".png"))
+ nPNGFiles++;
+ }
+
+ // check results
+ CPPUNIT_ASSERT_EQUAL(1, nSVMFiles);
+ return nPNGFiles;
+}
+
+void SdOOXMLExportTest3::testTdf115005_FallBack_Images_On()
+{
+ const int nPNGFiles = testTdf115005_FallBack_Images(true);
+ CPPUNIT_ASSERT_EQUAL(1, nPNGFiles);
+}
+
+void SdOOXMLExportTest3::testTdf115005_FallBack_Images_Off()
+{
+ const int nPNGFiles = testTdf115005_FallBack_Images(false);
+ CPPUNIT_ASSERT_EQUAL(0, nPNGFiles);
+}
+
+void SdOOXMLExportTest3::testTdf118806()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf118806.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "//p:animMotion", "origin", "layout");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf130058()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf130058.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ bool bHasShadow = false;
+ xShape->getPropertyValue("Shadow") >>= bHasShadow;
+ CPPUNIT_ASSERT(bHasShadow);
+ double fShadowDist = 0.0;
+ xShape->getPropertyValue("ShadowXDistance") >>= fShadowDist;
+ CPPUNIT_ASSERT_EQUAL(static_cast<double>(0), fShadowDist);
+ xShape->getPropertyValue("ShadowYDistance") >>= fShadowDist;
+ CPPUNIT_ASSERT_EQUAL(static_cast<double>(141), fShadowDist);
+ Color nColor;
+ xShape->getPropertyValue("ShadowColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor);
+ sal_Int32 nTransparency = 0;
+ xShape->getPropertyValue("ShadowTransparence") >>= nTransparency;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(57), nTransparency);
+ double fShadowSizeX = 0.0;
+ xShape->getPropertyValue("ShadowSizeX") >>= fShadowSizeX;
+ CPPUNIT_ASSERT_EQUAL(static_cast<double>(1000), fShadowSizeX);
+ double fShadowSizeY = 0.0;
+ xShape->getPropertyValue("ShadowSizeY") >>= fShadowSizeY;
+ CPPUNIT_ASSERT_EQUAL(static_cast<double>(1000), fShadowSizeY);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf111789()
+{
+ // Shadow properties were not exported for text shapes.
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf111789.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ // First text shape has some shadow
+ {
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ bool bHasShadow = false;
+ xShape->getPropertyValue("Shadow") >>= bHasShadow;
+ CPPUNIT_ASSERT(bHasShadow);
+ double fShadowDist = 0.0;
+ xShape->getPropertyValue("ShadowXDistance") >>= fShadowDist;
+ CPPUNIT_ASSERT_EQUAL(static_cast<double>(273), fShadowDist);
+ xShape->getPropertyValue("ShadowYDistance") >>= fShadowDist;
+ CPPUNIT_ASSERT_EQUAL(static_cast<double>(273), fShadowDist);
+ Color nColor;
+ xShape->getPropertyValue("ShadowColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), nColor);
+ sal_Int32 nTransparency = 0;
+ xShape->getPropertyValue("ShadowTransparence") >>= nTransparency;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(7), nTransparency);
+ double fShadowSizeX = 0.0;
+ xShape->getPropertyValue("ShadowSizeX") >>= fShadowSizeX;
+ CPPUNIT_ASSERT_EQUAL(static_cast<double>(100000), fShadowSizeX);
+ double fShadowSizeY = 0.0;
+ xShape->getPropertyValue("ShadowSizeY") >>= fShadowSizeY;
+ CPPUNIT_ASSERT_EQUAL(static_cast<double>(100000), fShadowSizeY);
+ }
+
+ // Second text shape has no shadow
+ {
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(1, 0, xDocShRef));
+ bool bHasShadow = false;
+ xShape->getPropertyValue("Shadow") >>= bHasShadow;
+ CPPUNIT_ASSERT(!bHasShadow);
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf145162()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf145162.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr/a:buNone");
+ // Before the fix, that tag was missing so PP put bullet to each para.
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testZeroIndentExport()
+{
+ // Load the bugdoc and save to pptx then.
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/testZeroIndent.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ // There are 3 slides, get them
+ xmlDocUniquePtr pSlide1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ xmlDocUniquePtr pSlide2 = parseExport(tempFile, "ppt/slides/slide2.xml");
+ xmlDocUniquePtr pSlide3 = parseExport(tempFile, "ppt/slides/slide3.xml");
+
+ CPPUNIT_ASSERT(pSlide1);
+ CPPUNIT_ASSERT(pSlide2);
+ CPPUNIT_ASSERT(pSlide3);
+
+ // Each slide has 3 paragraphs, one full line, an empty and a normal para.
+ // Check the indent and bullet. These have to match with PP. Before the fix,
+ // they were different.
+ assertXPath(pSlide1, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr/a:buNone");
+
+ assertXPath(pSlide2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[1]/a:pPr/a:buNone");
+ assertXPath(pSlide2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[1]/a:pPr", "indent", "0");
+ assertXPath(pSlide2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr/a:buNone");
+ assertXPath(pSlide2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr", "indent", "0");
+ assertXPath(pSlide2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[3]/a:pPr/a:buNone");
+ assertXPath(pSlide2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[3]/a:pPr", "indent", "0");
+
+ assertXPath(pSlide3, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[1]/a:pPr", "indent", "0");
+ assertXPath(pSlide3, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr/a:buNone");
+ assertXPath(pSlide3, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[2]/a:pPr", "indent", "0");
+ assertXPath(pSlide3, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p[3]/a:pPr", "indent", "0");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf100348_convert_Fontwork2TextWarp()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf100348_Fontwork2TextWarp.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ // Resulting pptx has to contain the TextWarp shape
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ const OString sPathStart("/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr/a:prstTxWarp");
+ assertXPath(pXmlDocContent, sPathStart + "[@prst='textWave1']");
+ const OString sPathAdj(sPathStart + "/a:avLst/a:gd");
+ assertXPath(pXmlDocContent, sPathAdj + "[@name='adj1' and @fmla='val 18750']");
+ assertXPath(pXmlDocContent, sPathAdj + "[@name='adj2' and @fmla='val -7500']");
+
+ // Reloading has to get the Fontwork shape back
+ // TextPath makes a custom shape to a Fontwork shape, so must exist
+ uno::Reference<beans::XPropertySet> xShapeWavePropSet(getShapeFromPage(0, 0, xDocShRef));
+ auto aGeomPropSeq = xShapeWavePropSet->getPropertyValue("CustomShapeGeometry")
+ .get<uno::Sequence<beans::PropertyValue>>();
+ auto aGeomPropVec
+ = comphelper::sequenceToContainer<std::vector<beans::PropertyValue>>(aGeomPropSeq);
+ OUString sName = "TextPath";
+ auto aIterator = std::find_if(
+ aGeomPropVec.begin(), aGeomPropVec.end(),
+ [sName](const beans::PropertyValue& rValue) { return rValue.Name == sName; });
+ CPPUNIT_ASSERT_MESSAGE("No TextPath", aIterator != aGeomPropVec.end());
+
+ // Type has to be same as in original document on roundtrip.
+ sName = "Type";
+ auto aIterator2 = std::find_if(
+ aGeomPropVec.begin(), aGeomPropVec.end(),
+ [sName](const beans::PropertyValue& rValue) { return rValue.Name == sName; });
+ CPPUNIT_ASSERT_MESSAGE("No Type", aIterator2 != aGeomPropVec.end());
+ OUString sOwnName;
+ aIterator2->Value >>= sOwnName;
+ CPPUNIT_ASSERT_EQUAL(OUString("fontwork-wave"), sOwnName);
+
+ // Adjustmentvalues need to be the same.
+ sName = "AdjustmentValues";
+ auto aIterator3 = std::find_if(
+ aGeomPropVec.begin(), aGeomPropVec.end(),
+ [sName](const beans::PropertyValue& rValue) { return rValue.Name == sName; });
+ CPPUNIT_ASSERT_MESSAGE("No AdjustmentValues", aIterator3 != aGeomPropVec.end());
+ uno::Sequence<drawing::EnhancedCustomShapeAdjustmentValue> aAdjValueSeq;
+ aIterator3->Value >>= aAdjValueSeq;
+ double fAdj1;
+ aAdjValueSeq[0].Value >>= fAdj1;
+ double fAdj2;
+ aAdjValueSeq[1].Value >>= fAdj2;
+ CPPUNIT_ASSERT_EQUAL(4050.0, fAdj1); // odp values, not pptx values
+ CPPUNIT_ASSERT_EQUAL(9180.0, fAdj2);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf1225573_FontWorkScaleX()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ // Error was, that attribute 'fromWordArt' was ignored
+ // ensure, resulting pptx has fromWordArt="1" on textArchDown shape
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr[@fromWordArt='1']");
+
+ // Error was, that text in legacy shapes of category "Follow Path" was not scaled to the path.
+ uno::Reference<beans::XPropertySet> xShapeArchProps(getShapeFromPage(0, 0, xDocShRef));
+ awt::Rectangle aBoundRectArch;
+ xShapeArchProps->getPropertyValue(UNO_NAME_MISC_OBJ_BOUNDRECT) >>= aBoundRectArch;
+ // difference should be zero, but allow some range for stroke thickness
+ CPPUNIT_ASSERT_LESS(sal_Int32(50), std::abs(aBoundRectArch.Width - 13081));
+
+ // Error was, that text in shapes of category "Warp" was not scaled to the path.
+ uno::Reference<beans::XPropertySet> xShapeWaveProps(getShapeFromPage(0, 1, xDocShRef));
+ awt::Rectangle aBoundRectWave;
+ xShapeWaveProps->getPropertyValue(UNO_NAME_MISC_OBJ_BOUNDRECT) >>= aBoundRectWave;
+ // difference should be zero, but allow some range for stroke thickness
+ CPPUNIT_ASSERT_LESS(sal_Int32(50), std::abs(aBoundRectWave.Width - 11514));
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf99497_keepAppearanceOfCircleKind()
+{
+ // Error was, that all CircleKind were exported to 'ellipse'.
+ // Resulting pptx has to contain the customshapes of the corresponding kind
+ // slide 1 ARC -> arc, slide 2 CUT -> chord, slide 3 SECTION -> pie
+ // Adjustment values need to exist and their values need to correspond to the
+ // original angles. Shape 'arc' needs to be unfilled.
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf99497_CircleKind.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ // slide 1 45° -> adj1 = 20493903, 270° -> adj2 = 5400000, <a:noFill/> exists
+ xmlDocUniquePtr pXmlDocContent1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ const OString sPathStart1("/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:prstGeom");
+ assertXPath(pXmlDocContent1, sPathStart1 + "[@prst='arc']");
+ const OString sPathAdj1(sPathStart1 + "/a:avLst/a:gd");
+ assertXPath(pXmlDocContent1, sPathAdj1 + "[@name='adj1' and @fmla='val 20493903']");
+ assertXPath(pXmlDocContent1, sPathAdj1 + "[@name='adj2' and @fmla='val 5400000']");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:noFill");
+
+ // slide 2 270° -> adj1 = 5400000, 180° -> adj2 = 10800000
+ xmlDocUniquePtr pXmlDocContent2 = parseExport(tempFile, "ppt/slides/slide2.xml");
+ const OString sPathStart2("/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:prstGeom");
+ assertXPath(pXmlDocContent2, sPathStart2 + "[@prst='chord']");
+ const OString sPathAdj2(sPathStart2 + "/a:avLst/a:gd");
+ assertXPath(pXmlDocContent2, sPathAdj2 + "[@name='adj1' and @fmla='val 5400000']");
+ assertXPath(pXmlDocContent2, sPathAdj2 + "[@name='adj2' and @fmla='val 10800000']");
+
+ // slide 3 120° -> adj1 = 12600000, 30° -> adj2 = 20946396
+ xmlDocUniquePtr pXmlDocContent3 = parseExport(tempFile, "ppt/slides/slide3.xml");
+ const OString sPathStart3("/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:prstGeom");
+ assertXPath(pXmlDocContent3, sPathStart3 + "[@prst='pie']");
+ const OString sPathAdj3(sPathStart3 + "/a:avLst/a:gd");
+ assertXPath(pXmlDocContent3, sPathAdj3 + "[@name='adj1' and @fmla='val 12600000']");
+ assertXPath(pXmlDocContent3, sPathAdj3 + "[@name='adj2' and @fmla='val 20946396']");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf104792()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf104792-smart-art-animation.pptx"),
+ PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst[1]/p:seq/p:cTn/p:childTnLst[1]/"
+ "p:par[1]/p:cTn/p:childTnLst[1]/p:par/p:cTn/p:childTnLst[1]/p:par/p:cTn/"
+ "p:childTnLst[1]/p:set/p:cBhvr/p:tgtEl/p:spTgt",
+ 1);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf90627()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf90627.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ // Don't export empty endCondLst without cond.
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst[1]/p:seq/p:cTn/p:childTnLst[1]/"
+ "p:par[2]/p:cTn/p:childTnLst[1]/p:par/p:cTn/p:childTnLst[1]/p:par/p:cTn/"
+ "p:endCondLst[not(*)]",
+ 0);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf104786()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf104786.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide2.xml");
+ // Don't export empty 'to'
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst[1]/p:seq/p:cTn/p:childTnLst[1]/"
+ "p:par[2]/p:cTn/p:childTnLst[1]/p:par/p:cTn/p:childTnLst[1]/p:par/p:cTn/"
+ "p:childTnLst/p:set[2]/p:to",
+ 0);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf118783()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf118783.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ OUString sAttributeName
+ = getXPathContent(pXmlDocContent, "//p:animRot/p:cBhvr/p:attrNameLst/p:attrName");
+ CPPUNIT_ASSERT_EQUAL(OUString("r"), sAttributeName);
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf104789()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf104789.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ OUString sAttributeName = getXPathContent(
+ pXmlDocContent, "/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/"
+ "p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/"
+ "p:childTnLst/p:set/p:cBhvr/p:attrNameLst/p:attrName");
+ CPPUNIT_ASSERT_EQUAL(OUString("style.opacity"), sAttributeName);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testOpenDocumentAsReadOnly()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/open-as-read-only.pptx"), PPTX);
+ CPPUNIT_ASSERT(xDocShRef->IsSecurityOptOpenReadOnly());
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ CPPUNIT_ASSERT(xDocShRef->IsSecurityOptOpenReadOnly());
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf118835()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf118835.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "(//p:animClr)[1]", "clrSpc", "rgb");
+ assertXPathContent(pXmlDocContent, "(//p:animClr)[1]//p:attrName", "style.color");
+ assertXPath(pXmlDocContent, "(//p:animClr)[1]//p:to/a:srgbClr", "val", "ed1c24");
+
+ assertXPath(pXmlDocContent, "(//p:animClr)[2]", "clrSpc", "rgb");
+ assertXPathContent(pXmlDocContent, "(//p:animClr)[2]//p:attrName", "stroke.color");
+ assertXPath(pXmlDocContent, "(//p:animClr)[2]//p:to/a:srgbClr", "val", "333399");
+
+ assertXPath(pXmlDocContent, "(//p:animClr)[3]", "clrSpc", "rgb");
+ assertXPathContent(pXmlDocContent, "(//p:animClr)[3]//p:attrName", "fillcolor");
+ assertXPath(pXmlDocContent, "(//p:animClr)[3]//p:to/a:srgbClr", "val", "fcd3c1");
+
+ assertXPath(pXmlDocContent, "(//p:animClr)[5]", "clrSpc", "hsl");
+ assertXPathContent(pXmlDocContent, "(//p:animClr)[5]//p:attrName", "fillcolor");
+ assertXPath(pXmlDocContent, "(//p:animClr)[5]//p:by/p:hsl", "h", "10800000");
+ assertXPath(pXmlDocContent, "(//p:animClr)[5]//p:by/p:hsl", "s", "0");
+ assertXPath(pXmlDocContent, "(//p:animClr)[5]//p:by/p:hsl", "l", "0");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf118768()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf118768-brake.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "//p:anim[1]", "from", "(-#ppt_w/2)");
+ assertXPath(pXmlDocContent, "//p:anim[1]", "to", "(#ppt_x)");
+ assertXPath(pXmlDocContent, "//p:anim[2]", "from", "0");
+
+ assertXPath(pXmlDocContent, "//p:anim[2]", "to", "-1");
+ assertXPath(pXmlDocContent, "//p:anim[2]/p:cBhvr/p:cTn", "autoRev", "1");
+
+ assertXPath(pXmlDocContent, "//p:anim[3]", "by", "(#ppt_h/3+#ppt_w*0.1)");
+ assertXPath(pXmlDocContent, "//p:anim[3]/p:cBhvr/p:cTn", "autoRev", "1");
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf118836()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf118836.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "//p:animScale/p:by", "x", "250000");
+ assertXPath(pXmlDocContent, "//p:animScale/p:by", "y", "250000");
+ xDocShRef->DoClose();
+}
+
+static double getAdjustmentValue(const uno::Reference<beans::XPropertySet>& xSet)
+{
+ auto aGeomPropSeq
+ = xSet->getPropertyValue("CustomShapeGeometry").get<uno::Sequence<beans::PropertyValue>>();
+ auto aGeomPropVec
+ = comphelper::sequenceToContainer<std::vector<beans::PropertyValue>>(aGeomPropSeq);
+
+ auto aIterator = std::find_if(
+ aGeomPropVec.begin(), aGeomPropVec.end(),
+ [](const beans::PropertyValue& rValue) { return rValue.Name == "AdjustmentValues"; });
+
+ if (aIterator != aGeomPropVec.end())
+ {
+ uno::Sequence<drawing::EnhancedCustomShapeAdjustmentValue> aAdjustment;
+ double fResult = 0.0;
+ aIterator->Value >>= aAdjustment;
+ aAdjustment[0].Value >>= fResult;
+ return fResult;
+ }
+
+ return -1.0;
+}
+
+static bool getScaleXValue(const uno::Reference<beans::XPropertySet>& xSet)
+{
+ bool bScaleX = false;
+
+ auto aGeomPropSeq
+ = xSet->getPropertyValue("CustomShapeGeometry").get<uno::Sequence<beans::PropertyValue>>();
+ auto aGeomPropVec
+ = comphelper::sequenceToContainer<std::vector<beans::PropertyValue>>(aGeomPropSeq);
+
+ auto aIterator = std::find_if(
+ aGeomPropVec.begin(), aGeomPropVec.end(),
+ [](const beans::PropertyValue& rValue) { return rValue.Name == "TextPath"; });
+
+ if (aIterator != aGeomPropVec.end())
+ {
+ uno::Sequence<beans::PropertyValue> aTextPathProperties;
+ aIterator->Value >>= aTextPathProperties;
+ auto aIterator2 = std::find_if(
+ std::cbegin(aTextPathProperties), std::cend(aTextPathProperties),
+ [](const beans::PropertyValue& rValue) { return rValue.Name == "ScaleX"; });
+
+ if (aIterator2 != std::cend(aTextPathProperties))
+ {
+ aIterator2->Value >>= bScaleX;
+ }
+ }
+
+ return bScaleX;
+}
+
+void SdOOXMLExportTest3::testTdf116350TextEffects()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf116350-texteffects.pptx"), PPTX);
+
+ // Default angle for ArchUp
+ uno::Reference<beans::XPropertySet> xShape0(getShapeFromPage(0, 0, xDocShRef));
+ double fAdjust = getAdjustmentValue(xShape0);
+ CPPUNIT_ASSERT_EQUAL(180.0, fAdjust);
+
+ bool bScaleX = getScaleXValue(xShape0);
+ CPPUNIT_ASSERT_EQUAL(true, bScaleX);
+
+ // Default angle for ArchDown
+ uno::Reference<beans::XPropertySet> xShape14(getShapeFromPage(14, 0, xDocShRef));
+ fAdjust = getAdjustmentValue(xShape14);
+ CPPUNIT_ASSERT_EQUAL(0.0, fAdjust);
+
+ bScaleX = getScaleXValue(xShape14);
+ CPPUNIT_ASSERT_EQUAL(true, bScaleX);
+
+ // Angle directly set
+ uno::Reference<beans::XPropertySet> xShape1(getShapeFromPage(1, 0, xDocShRef));
+ fAdjust = getAdjustmentValue(xShape1);
+ CPPUNIT_ASSERT_EQUAL(213.25, fAdjust);
+
+ bScaleX = getScaleXValue(xShape1);
+ CPPUNIT_ASSERT_EQUAL(true, bScaleX);
+
+ // Export
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "//p:sp[1]/p:txBody/a:bodyPr/a:prstTxWarp", "prst", "textArchUp");
+ assertXPath(pXmlDocContent, "//p:sp[14]/p:txBody/a:bodyPr/a:prstTxWarp", "prst", "textCircle");
+ assertXPath(pXmlDocContent, "//p:sp[14]/p:spPr/a:solidFill/a:srgbClr", 0);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf128096()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf128096.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocContent1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent1,
+ "//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:highlight/a:srgbClr", "val",
+ "ffff00");
+
+ // Check that underlined content is also highlighted
+ xmlDocUniquePtr pXmlDocContent2 = parseExport(tempFile, "ppt/slides/slide2.xml");
+ assertXPath(pXmlDocContent2,
+ "//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:highlight/a:srgbClr", "val",
+ "ffff00");
+}
+void SdOOXMLExportTest3::testTdf120573()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf120573.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:nvPr/a:audioFile", 1);
+ assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:pic/p:nvPicPr/p:nvPr/a:videoFile", 0);
+
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "ppt/slides/_rels/slide1.xml.rels");
+ assertXPath(pXmlDocRels,
+ "(/rels:Relationships/rels:Relationship[@Target='../media/media1.wav'])[1]", "Type",
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio");
+
+ xmlDocUniquePtr pXmlContentType = parseExport(tempFile, "[Content_Types].xml");
+ assertXPath(pXmlContentType,
+ "/ContentType:Types/ContentType:Override[@PartName='/ppt/media/media1.wav']",
+ "ContentType", "audio/x-wav");
+}
+
+void SdOOXMLExportTest3::testTdf119118()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf119118.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "//p:iterate", "type", "lt");
+ assertXPath(pXmlDocContent, "//p:tmAbs", "val", "200");
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf99213()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf99213-target-missing.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ // Number of nodes with p:attrNameLst was 3, including one that missed tgtEl
+ assertXPath(pXmlDocContent, "//p:attrNameLst", 2);
+ // Timenode that miss its target element should be filtered.
+ assertXPath(pXmlDocContent, "//p:attrNameLst/preceding-sibling::p:tgtEl", 2);
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testPotxExport()
+{
+ // Create new document
+ sd::DrawDocShellRef xDocShRef
+ = new sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Draw);
+ uno::Reference<frame::XLoadable> xLoadable(xDocShRef->GetModel(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xLoadable.is());
+ xLoadable->initNew();
+
+ // Export as a POTM template
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), POTX, &tempFile);
+ xDocShRef->DoClose();
+
+ // Load and check content type
+ xmlDocUniquePtr pContentTypes = parseExport(tempFile, "[Content_Types].xml");
+ CPPUNIT_ASSERT(pContentTypes);
+ assertXPath(pContentTypes,
+ "/ContentType:Types/ContentType:Override[@PartName='/ppt/presentation.xml']",
+ "ContentType",
+ "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml");
+}
+
+void SdOOXMLExportTest3::testTdf44223()
+{
+ utl::TempFile tempFile;
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf44223.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ std::unique_ptr<SvStream> const pStream1(parseExportStream(tempFile, "ppt/media/audio1.wav"));
+ CPPUNIT_ASSERT_EQUAL(sal_uInt64(11140), pStream1->remainingSize());
+
+ std::unique_ptr<SvStream> const pStream2(parseExportStream(tempFile, "ppt/media/audio2.wav"));
+ CPPUNIT_ASSERT_EQUAL(sal_uInt64(28074), pStream2->remainingSize());
+
+ xmlDocUniquePtr pXmlContentType = parseExport(tempFile, "[Content_Types].xml");
+ assertXPath(pXmlContentType,
+ "/ContentType:Types/ContentType:Override[@PartName='/ppt/media/audio1.wav']",
+ "ContentType", "audio/x-wav");
+
+ assertXPath(pXmlContentType,
+ "/ContentType:Types/ContentType:Override[@PartName='/ppt/media/audio2.wav']",
+ "ContentType", "audio/x-wav");
+
+ xmlDocUniquePtr pDoc1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ // Start condition: 0s after timenode id 5 begins.
+ assertXPath(pDoc1, "//p:audio/p:cMediaNode/p:cTn/p:stCondLst/p:cond", "evt", "begin");
+ assertXPath(pDoc1, "//p:audio/p:cMediaNode/p:cTn/p:stCondLst/p:cond", "delay", "0");
+ assertXPath(pDoc1, "//p:audio/p:cMediaNode/p:cTn/p:stCondLst/p:cond/p:tn", "val", "5");
+
+ xmlDocUniquePtr pDoc2 = parseExport(tempFile, "ppt/slides/slide2.xml");
+ assertXPath(pDoc2, "//p:transition/p:sndAc/p:stSnd/p:snd[@r:embed]", 2);
+
+ xmlDocUniquePtr pRels1 = parseExport(tempFile, "ppt/slides/_rels/slide1.xml.rels");
+ assertXPath(pRels1, "//rels:Relationship[@Id='rId1']", "Type",
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio");
+ assertXPath(pRels1, "//rels:Relationship[@Id='rId1']", "Target", "../media/audio1.wav");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf135843()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf135843_export.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ const OString sPathStart("/p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/a:tbl");
+ assertXPath(pXmlDoc, sPathStart + "/a:tr[1]/a:tc[1]/a:tcPr/a:lnL/a:noFill");
+ assertXPath(pXmlDoc, sPathStart + "/a:tr[1]/a:tc[1]/a:tcPr/a:lnR/a:noFill");
+ assertXPath(pXmlDoc, sPathStart + "/a:tr[1]/a:tc[1]/a:tcPr/a:lnT/a:noFill");
+ assertXPath(pXmlDoc, sPathStart + "/a:tr[1]/a:tc[1]/a:tcPr/a:lnB/a:noFill");
+
+ assertXPath(pXmlDoc, sPathStart + "/a:tr[2]/a:tc[1]/a:tcPr/a:lnL/a:noFill");
+ assertXPath(pXmlDoc, sPathStart + "/a:tr[2]/a:tc[1]/a:tcPr/a:lnR/a:noFill");
+ assertXPath(pXmlDoc, sPathStart + "/a:tr[2]/a:tc[1]/a:tcPr/a:lnT/a:noFill");
+ assertXPath(pXmlDoc, sPathStart + "/a:tr[2]/a:tc[1]/a:tcPr/a:lnB/a:noFill");
+
+ assertXPath(pXmlDoc, sPathStart + "/a:tr[3]/a:tc[1]/a:tcPr/a:lnL/a:noFill");
+ assertXPath(pXmlDoc, sPathStart + "/a:tr[3]/a:tc[1]/a:tcPr/a:lnR/a:noFill");
+ assertXPath(pXmlDoc, sPathStart + "/a:tr[3]/a:tc[1]/a:tcPr/a:lnT/a:noFill");
+ assertXPath(pXmlDoc, sPathStart + "/a:tr[3]/a:tc[1]/a:tcPr/a:lnB/a:noFill");
+}
+
+void SdOOXMLExportTest3::testSmartArtPreserve()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/smartart-preserve.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:graphicFrame/p:nvGraphicFramePr/p:cNvPr");
+ assertXPath(pXmlDoc,
+ "//p:sld/p:cSld/p:spTree/p:graphicFrame/a:graphic/a:graphicData/dgm:relIds");
+ assertXPath(pXmlDoc,
+ "//p:sld/p:cSld/p:spTree/p:graphicFrame/p:nvGraphicFramePr/p:nvPr/p:extLst/p:ext",
+ "uri", "{D42A27DB-BD31-4B8C-83A1-F6EECF244321}");
+ assertXPath(pXmlDoc, "//p:sld/p:cSld/p:spTree/p:graphicFrame/p:nvGraphicFramePr/p:nvPr/"
+ "p:extLst/p:ext/p14:modId");
+
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "ppt/slides/_rels/slide1.xml.rels");
+ assertXPath(
+ pXmlDocRels,
+ "(/rels:Relationships/rels:Relationship[@Target='../diagrams/layout1.xml'])[1]", "Type",
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramLayout");
+ assertXPath(
+ pXmlDocRels, "(/rels:Relationships/rels:Relationship[@Target='../diagrams/data1.xml'])[1]",
+ "Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramData");
+ assertXPath(
+ pXmlDocRels,
+ "(/rels:Relationships/rels:Relationship[@Target='../diagrams/colors1.xml'])[1]", "Type",
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramColors");
+ assertXPath(
+ pXmlDocRels,
+ "(/rels:Relationships/rels:Relationship[@Target='../diagrams/quickStyle1.xml'])[1]", "Type",
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramQuickStyle");
+
+ xmlDocUniquePtr pXmlContentType = parseExport(tempFile, "[Content_Types].xml");
+ assertXPath(pXmlContentType,
+ "/ContentType:Types/ContentType:Override[@PartName='/ppt/diagrams/layout1.xml']",
+ "ContentType",
+ "application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml");
+ assertXPath(pXmlContentType,
+ "/ContentType:Types/ContentType:Override[@PartName='/ppt/diagrams/data1.xml']",
+ "ContentType",
+ "application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml");
+ assertXPath(pXmlContentType,
+ "/ContentType:Types/ContentType:Override[@PartName='/ppt/diagrams/colors1.xml']",
+ "ContentType",
+ "application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml");
+ assertXPath(
+ pXmlContentType,
+ "/ContentType:Types/ContentType:Override[@PartName='/ppt/diagrams/quickStyle1.xml']",
+ "ContentType", "application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf125346()
+{
+ // There are two themes in the test document, make sure we use the right theme
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf125346.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<beans::XPropertySet> xPropSet(xShape, uno::UNO_SET_THROW);
+
+ drawing::FillStyle aFillStyle(drawing::FillStyle_NONE);
+ xPropSet->getPropertyValue("FillStyle") >>= aFillStyle;
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, aFillStyle);
+
+ Color nFillColor;
+ xPropSet->getPropertyValue("FillColor") >>= nFillColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x90C226), nFillColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf125346_2()
+{
+ // There are two themes in the test document, make sure we use the right theme
+ // Test more slides with different themes
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf125346_2.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ {
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<beans::XPropertySet> xPropSet(xShape, uno::UNO_SET_THROW);
+
+ drawing::FillStyle aFillStyle(drawing::FillStyle_NONE);
+ xPropSet->getPropertyValue("FillStyle") >>= aFillStyle;
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, aFillStyle);
+
+ Color nFillColor;
+ xPropSet->getPropertyValue("FillColor") >>= nFillColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x90C226), nFillColor);
+ }
+
+ {
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 1, xDocShRef));
+ uno::Reference<beans::XPropertySet> xPropSet(xShape, uno::UNO_SET_THROW);
+
+ drawing::FillStyle aFillStyle(drawing::FillStyle_NONE);
+ xPropSet->getPropertyValue("FillStyle") >>= aFillStyle;
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, aFillStyle);
+
+ Color nFillColor;
+ xPropSet->getPropertyValue("FillColor") >>= nFillColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x052F61), nFillColor);
+ }
+
+ {
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 2, xDocShRef));
+ uno::Reference<beans::XPropertySet> xPropSet(xShape, uno::UNO_SET_THROW);
+
+ drawing::FillStyle aFillStyle(drawing::FillStyle_NONE);
+ xPropSet->getPropertyValue("FillStyle") >>= aFillStyle;
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, aFillStyle);
+
+ Color nFillColor;
+ xPropSet->getPropertyValue("FillColor") >>= nFillColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x90C226), nFillColor);
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf125360()
+{
+ // Check whether the changed fill transparency is exported correctly.
+ // Color is defined by shape style
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf125360.pptx"), PPTX);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+
+ xShape->setPropertyValue("FillTransparence", uno::Any(static_cast<sal_Int32>(23)));
+
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xShape.set(getShapeFromPage(0, 0, xDocShRef));
+
+ sal_Int32 nTransparence = 0;
+ xShape->getPropertyValue("FillTransparence") >>= nTransparence;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(23), nTransparence);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf125360_1()
+{
+ // Check whether the changed fill transparency is exported correctly.
+ // Color is defined by color scheme
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf125360_1.pptx"), PPTX);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+
+ xShape->setPropertyValue("FillTransparence", uno::Any(static_cast<sal_Int32>(23)));
+
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xShape.set(getShapeFromPage(0, 0, xDocShRef));
+
+ sal_Int32 nTransparence = 0;
+ xShape->getPropertyValue("FillTransparence") >>= nTransparence;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(23), nTransparence);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf125360_2()
+{
+ // Check whether the changed fill transparency is exported correctly.
+ // Color is defined by color scheme with a transparency
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf125360_2.pptx"), PPTX);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+
+ sal_Int32 nTransparence = 0;
+ xShape->getPropertyValue("FillTransparence") >>= nTransparence;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(82), nTransparence);
+
+ xShape->setPropertyValue("FillTransparence", uno::Any(static_cast<sal_Int32>(23)));
+
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xShape.set(getShapeFromPage(0, 0, xDocShRef));
+
+ nTransparence = 0;
+ xShape->getPropertyValue("FillTransparence") >>= nTransparence;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(23), nTransparence);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf125551()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf125551.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ uno::Reference<drawing::XShapes> xGroupShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShapeBg(xGroupShape->getByIndex(0), uno::UNO_QUERY);
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1024), xShapeBg->getPosition().X);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(576), xShapeBg->getPosition().Y);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(10815), xShapeBg->getSize().Width);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(8587), xShapeBg->getSize().Height);
+}
+
+void SdOOXMLExportTest3::testTdf136830()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf136830.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ // Without the fix in place, the X position of the shapes would have been 0
+ uno::Reference<drawing::XShapes> xGroupShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+
+ uno::Reference<drawing::XShape> xShape1(xGroupShape->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(14134), xShape1->getPosition().X);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(-5321), xShape1->getPosition().Y);
+
+ uno::Reference<drawing::XShape> xShape2(xGroupShape->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(8085), xShape2->getPosition().X);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(8085), xShape2->getPosition().Y);
+
+ uno::Reference<drawing::XShape> xShape3(xGroupShape->getByIndex(2), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(8283), xShape3->getPosition().X);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4620), xShape3->getPosition().Y);
+}
+
+void SdOOXMLExportTest3::testTdf126234()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf126234.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ // check relative size of the bullet, 400% is a legitimate value for MS Office document
+ // Without a fix, it will fail to set the size correctly
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pNumFmt);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(400), pNumFmt->GetNumRule().GetLevel(0).GetBulletRelSize());
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf126741()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf126741.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ // dash dot dot line style import fix
+ // The original fixed values are replaced with the percent values, because
+ // with fix for tdf#127166 the MS Office preset styles are correctly detected.
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ SdrObject* const pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pObj);
+
+ const XLineStyleItem& rStyleItem
+ = dynamic_cast<const XLineStyleItem&>(pObj->GetMergedItem(XATTR_LINESTYLE));
+ const XLineDashItem& rDashItem
+ = dynamic_cast<const XLineDashItem&>(pObj->GetMergedItem(XATTR_LINEDASH));
+
+ CPPUNIT_ASSERT_EQUAL(drawing::LineStyle_DASH, rStyleItem.GetValue());
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rDashItem.GetDashValue().GetDots());
+ CPPUNIT_ASSERT_EQUAL(800.0, rDashItem.GetDashValue().GetDotLen());
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rDashItem.GetDashValue().GetDashes());
+ CPPUNIT_ASSERT_EQUAL(100.0, rDashItem.GetDashValue().GetDashLen());
+ CPPUNIT_ASSERT_EQUAL(300.0, rDashItem.GetDashValue().GetDistance());
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf127372()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf127372.odp"), ODP);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ awt::Gradient aTransparenceGradient;
+ xShape->getPropertyValue("FillTransparenceGradient") >>= aTransparenceGradient;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0x000000), aTransparenceGradient.StartColor);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0x000000), aTransparenceGradient.EndColor);
+}
+
+void SdOOXMLExportTest3::testTdf127379()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf127379.odp"), ODP);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xDoc->getDrawPages()->getCount());
+
+ uno::Reference<drawing::XDrawPage> xPage(getPage(0, xDocShRef));
+ uno::Reference<beans::XPropertySet> xPropSet(xPage, uno::UNO_QUERY);
+
+ uno::Any aAny = xPropSet->getPropertyValue("Background");
+ CPPUNIT_ASSERT_MESSAGE("Slide background is missing", aAny.hasValue());
+ uno::Reference<beans::XPropertySet> aXBackgroundPropSet;
+ aAny >>= aXBackgroundPropSet;
+
+ drawing::FillStyle aFillStyle(drawing::FillStyle_NONE);
+ aXBackgroundPropSet->getPropertyValue("FillStyle") >>= aFillStyle;
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, aFillStyle);
+
+ awt::Gradient aGradient;
+ CPPUNIT_ASSERT(aXBackgroundPropSet->getPropertyValue("FillGradient") >>= aGradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0xFF0000), aGradient.StartColor);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0x2A6099), aGradient.EndColor);
+}
+
+void SdOOXMLExportTest3::testTdf98603()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf98603.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<text::XTextRange> const xParagraph(getParagraphFromShape(0, xShape));
+ uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
+ uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW);
+ css::lang::Locale aLocale;
+ xPropSet->getPropertyValue("CharLocaleComplex") >>= aLocale;
+ CPPUNIT_ASSERT_EQUAL(OUString("he"), aLocale.Language);
+ CPPUNIT_ASSERT_EQUAL(OUString("IL"), aLocale.Country);
+}
+
+void SdOOXMLExportTest3::testTdf128213()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf128213.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPathNoAttribute(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:xfrm", "rot");
+}
+
+void SdOOXMLExportTest3::testTdf79082()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf79082.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[1]", "pos",
+ "360000");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[1]", "algn", "l");
+
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[2]", "pos",
+ "756000");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[2]", "algn", "l");
+
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[3]", "pos",
+ "1440000");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[3]", "algn",
+ "ctr");
+
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[4]", "pos",
+ "1800000");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[4]", "algn", "r");
+
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[5]", "pos",
+ "3240000");
+ assertXPath(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr/a:tabLst/a:tab[5]", "algn",
+ "dec");
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf129372()
+{
+ //Without the fix in place, it would crash at import time
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf129372.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ const SdrPage* pPage = GetPage(1, xDocShRef.get());
+
+ const SdrObject* pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::OLE2, pObj->GetObjIdentifier());
+}
+
+void SdOOXMLExportTest3::testShapeGlowEffect()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/shape-glow-effect.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ sal_Int32 nRadius = -1;
+ xShape->getPropertyValue("GlowEffectRadius") >>= nRadius;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(388), nRadius); // 139700 EMU = 388.0556 mm/100
+ Color nColor;
+ xShape->getPropertyValue("GlowEffectColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFFC000), nColor);
+ sal_Int16 nTransparency;
+ xShape->getPropertyValue("GlowEffectTransparency") >>= nTransparency;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(60), nTransparency);
+}
+
+void SdOOXMLExportTest3::testUnderline()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/underline.fodp"), FODP);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xShape));
+ uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
+ uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW);
+
+ Color nColor;
+ xPropSet->getPropertyValue("CharColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, nColor);
+
+ xPropSet->getPropertyValue("CharUnderlineColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_AUTO, nColor);
+
+ sal_Int16 nUnderline;
+ xPropSet->getPropertyValue("CharUnderline") >>= nUnderline;
+ CPPUNIT_ASSERT_EQUAL(awt::FontUnderline::DOUBLE, nUnderline);
+
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ xShape.set(getShapeFromPage(0, 0, xDocShRef));
+ xParagraph.set(getParagraphFromShape(0, xShape));
+ xRun.set(getRunFromParagraph(0, xParagraph));
+ xPropSet.set(xRun, uno::UNO_QUERY_THROW);
+
+ xPropSet->getPropertyValue("CharColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, nColor);
+
+ xPropSet->getPropertyValue("CharUnderlineColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_AUTO, nColor);
+
+ xPropSet->getPropertyValue("CharUnderline") >>= nUnderline;
+ CPPUNIT_ASSERT_EQUAL(awt::FontUnderline::DOUBLE, nUnderline);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf119087()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf119087.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ // This would fail both on export validation, and reloading the saved pptx file.
+
+ // Get first paragraph of the text
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<text::XTextRange> const xParagraph(getParagraphFromShape(0, xShape));
+ // Get first run of the paragraph
+ uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
+ uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW);
+
+ Color nColor = COL_AUTO;
+ xPropSet->getPropertyValue("CharColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x00B050), nColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf131554()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf131554.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ uno::Reference<drawing::XShape> xShape(getShapeFromPage(1, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(5622), xShape->getPosition().X);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(13251), xShape->getPosition().Y);
+}
+
+void SdOOXMLExportTest3::testTdf132282()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf132282.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ uno::Reference<drawing::XShape> xShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ // Without the fix in place, the position would be 0,0, height = 1 and width = 1
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1736), xShape->getPosition().X);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(763), xShape->getPosition().Y);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(30523), xShape->getSize().Width);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2604), xShape->getSize().Height);
+}
+
+void SdOOXMLExportTest3::testTdf132201EffectOrder()
+{
+ auto xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/effectOrder.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xmlDocUniquePtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPathChildren(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:effectLst", 2);
+ // The relative order of effects is important: glow must be before shadow
+ CPPUNIT_ASSERT_EQUAL(0, getXPathPosition(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:effectLst",
+ "glow"));
+ CPPUNIT_ASSERT_EQUAL(1, getXPathPosition(pXmlDocContent,
+ "/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:effectLst",
+ "outerShdw"));
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testShapeSoftEdgeEffect()
+{
+ auto xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/shape-soft-edges.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ auto xShapeProps(getShapeFromPage(0, 0, xDocShRef));
+ sal_Int32 nRadius = -1;
+ xShapeProps->getPropertyValue("SoftEdgeRadius") >>= nRadius;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(635), nRadius); // 18 pt
+}
+
+void SdOOXMLExportTest3::testShapeShadowBlurEffect()
+{
+ auto xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/shape-blur-effect.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ bool bHasShadow = false;
+ xShape->getPropertyValue("Shadow") >>= bHasShadow;
+ CPPUNIT_ASSERT(bHasShadow);
+ sal_Int32 nRadius = -1;
+ xShape->getPropertyValue("ShadowBlur") >>= nRadius;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(388), nRadius); // 11 pt
+}
+
+void SdOOXMLExportTest3::testTdf119223()
+{
+ auto xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf119223.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeCustomShape']");
+
+ assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomePicture']");
+
+ assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeFormula']");
+
+ assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeLine']");
+
+ assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeTextbox']");
+
+ assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeTable']");
+
+ assertXPath(pXmlDocRels, "//p:cNvPr[@name='SomeGroup']");
+}
+
+void SdOOXMLExportTest3::testTdf128213ShapeRot()
+{
+ auto xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf128213-shaperot.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr/a:scene3d");
+ assertXPath(pXmlDocRels,
+ "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr/a:scene3d/a:camera/a:rot", "rev",
+ "5400000");
+}
+
+void SdOOXMLExportTest3::testTdf125560_textDeflate()
+{
+ auto xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/ShapePlusImage.pptx"), PPTX);
+ utl::TempFile tempFile;
+
+ // This problem did not affect the pptx export, only the ODP so assert that
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "content.xml");
+ assertXPath(pXmlDocRels,
+ "/office:document-content/office:body/office:presentation/draw:page/"
+ "draw:custom-shape/draw:enhanced-geometry",
+ "type", "mso-spt161");
+}
+
+void SdOOXMLExportTest3::testTdf125560_textInflateTop()
+{
+ auto xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/ShapeTextInflateTop.pptx"), PPTX);
+ utl::TempFile tempFile;
+
+ // This problem did not affect the pptx export, only the ODP so assert that
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDocRels = parseExport(tempFile, "content.xml");
+ assertXPath(pXmlDocRels,
+ "/office:document-content/office:body/office:presentation/draw:page/"
+ "draw:custom-shape/draw:enhanced-geometry",
+ "type", "mso-spt164");
+}
+
+void SdOOXMLExportTest3::testTdf142235_TestPlaceholderTextAlignment()
+{
+ auto xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/placeholder-box-textalignment.odp"), ODP);
+
+ utl::TempFile tmpfile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tmpfile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXml1 = parseExport(tmpfile, "ppt/slides/slide2.xml");
+ xmlDocUniquePtr pXml2 = parseExport(tmpfile, "ppt/slides/slide3.xml");
+
+ // Without the fix in place many of these asserts failed, because alignment was bad.
+
+ assertXPath(pXml1, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr", "anchor", "t");
+ assertXPath(pXml2, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr", "anchor", "t");
+}
+
+void SdOOXMLExportTest3::testTdf96061_textHighlight()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf96061.pptx"), PPTX);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<text::XTextRange> const xParagraph1(getParagraphFromShape(0, xShape));
+ uno::Reference<text::XTextRange> xRun1(getRunFromParagraph(0, xParagraph1));
+ uno::Reference<beans::XPropertySet> xPropSet1(xRun1, uno::UNO_QUERY_THROW);
+
+ Color aColor;
+ xPropSet1->getPropertyValue("CharBackColor") >>= aColor;
+ CPPUNIT_ASSERT_EQUAL(COL_YELLOW, aColor);
+
+ uno::Reference<text::XTextRange> const xParagraph2(getParagraphFromShape(1, xShape));
+ uno::Reference<text::XTextRange> xRun2(getRunFromParagraph(0, xParagraph2));
+ uno::Reference<beans::XPropertySet> xPropSet2(xRun2, uno::UNO_QUERY_THROW);
+ xPropSet2->getPropertyValue("CharBackColor") >>= aColor;
+ CPPUNIT_ASSERT_EQUAL(COL_AUTO, aColor);
+
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ uno::Reference<beans::XPropertySet> xShape2(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<text::XTextRange> const xParagraph3(getParagraphFromShape(0, xShape2));
+ uno::Reference<text::XTextRange> xRun3(getRunFromParagraph(0, xParagraph3));
+ uno::Reference<beans::XPropertySet> xPropSet3(xRun3, uno::UNO_QUERY_THROW);
+ xPropSet3->getPropertyValue("CharBackColor") >>= aColor;
+ CPPUNIT_ASSERT_EQUAL(COL_YELLOW, aColor);
+
+ uno::Reference<text::XTextRange> const xParagraph4(getParagraphFromShape(1, xShape2));
+ uno::Reference<text::XTextRange> xRun4(getRunFromParagraph(0, xParagraph4));
+ uno::Reference<beans::XPropertySet> xPropSet4(xRun4, uno::UNO_QUERY_THROW);
+ xPropSet4->getPropertyValue("CharBackColor") >>= aColor;
+ CPPUNIT_ASSERT_EQUAL(COL_AUTO, aColor);
+}
+
+void SdOOXMLExportTest3::testTdf143222_embeddedWorksheet()
+{
+ // Check import of embedded worksheet in slide.
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf143222.pptx"), PPTX);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef.get());
+ const SdrOle2Obj* pOleObj = static_cast<SdrOle2Obj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT_MESSAGE("no object", pOleObj != nullptr);
+
+ // Without the fix we lost the graphic of ole object.
+ const Graphic* pGraphic = pOleObj->GetGraphic();
+ CPPUNIT_ASSERT_MESSAGE("no graphic", pGraphic != nullptr);
+
+ // Check export of embedded worksheet in slide.
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ pPage = GetPage(1, xDocShRef.get());
+ pOleObj = static_cast<SdrOle2Obj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT_MESSAGE("no object after the export", pOleObj != nullptr);
+
+ pGraphic = pOleObj->GetGraphic();
+ CPPUNIT_ASSERT_MESSAGE("no graphic after the export", pGraphic != nullptr);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf143315()
+{
+ auto xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/ppt/tdf143315-WordartWithoutBullet.ppt"),
+ PPT);
+
+ utl::TempFile tmpfile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tmpfile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXml = parseExport(tmpfile, "ppt/slides/slide1.xml");
+
+ // Without the fix in place, this would have failed with
+ // - Expected:
+ // - Actual : 216000
+ // - In <file:///tmp/lu161922zcvd.tmp>, XPath '/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr' unexpected 'marL' attribute
+
+ assertXPathNoAttribute(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr", "marL");
+ assertXPathNoAttribute(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr", "indent");
+ assertXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:buClr", 0);
+ assertXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:buSzPct", 0);
+ assertXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:buFont", 0);
+ assertXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:pPr/a:buChar", 0);
+}
+
+void SdOOXMLExportTest3::testTdf147121()
+{
+ // Get the bugdoc
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf147121.pptx"), PPTX);
+
+ CPPUNIT_ASSERT(xDocShRef);
+ // Get the second line props of the placeholder
+ uno::Reference<drawing::XDrawPage> xPage(getPage(0, xDocShRef));
+ uno::Reference<beans::XPropertySet> xShape(xPage->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xRun(
+ getRunFromParagraph(2, getParagraphFromShape(0, xShape)), uno::UNO_QUERY_THROW);
+
+ // Save the font size
+ const auto nFontSizeBefore = xRun->getPropertyValue("CharHeight").get<float>() * 100;
+
+ // Save and reload
+ utl::TempFile tmpfile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tmpfile);
+ xDocShRef->DoClose();
+
+ // Parse the export
+ xmlDocUniquePtr pXml = parseExport(tmpfile, "ppt/slides/slide1.xml");
+ const auto nFontSizeAfter
+ = getXPath(pXml, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:br[1]/a:rPr", "sz").toFloat();
+
+ // The font size was not saved before now it must be equal with the saved one.
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Unexpected font size", nFontSizeBefore, nFontSizeAfter);
+}
+
+void SdOOXMLExportTest3::testTdf140912_PicturePlaceholder()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdfpictureplaceholder.pptx"), PPTX);
+
+ uno::Reference<beans::XPropertySet> xShapeProps(getShapeFromPage(0, 0, xDocShRef));
+ bool bTextContourFrame = true;
+ xShapeProps->getPropertyValue("TextContourFrame") >>= bTextContourFrame;
+ CPPUNIT_ASSERT_EQUAL(false, bTextContourFrame);
+
+ text::GraphicCrop aGraphicCrop;
+ xShapeProps->getPropertyValue("GraphicCrop") >>= aGraphicCrop;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(-8490), aGraphicCrop.Top);
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testEnhancedPathViewBox()
+{
+ auto xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf147978_enhancedPath_viewBox.odp"),
+ ODP);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ auto xShapeProps(getShapeFromPage(0, 0, xDocShRef));
+ awt::Rectangle aBoundRectangle;
+ xShapeProps->getPropertyValue("BoundRect") >>= aBoundRectangle;
+ // The shape has a Bézier curve which does not touch the right edge. Prior to the fix the curve
+ // was stretched to touch the edge, resulting in 5098 curve width instead of 2045.
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2045), aBoundRectangle.Width);
+}
+
+void SdOOXMLExportTest3::testTdf74670()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf74670.odp"), ODP);
+ utl::TempFile tmpfile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tmpfile);
+ xDocShRef->DoClose();
+
+ uno::Reference<packages::zip::XZipFileAccess2> xNameAccess
+ = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory),
+ tmpfile.GetURL());
+ const uno::Sequence<OUString> aNames(xNameAccess->getElementNames());
+ int nImageFiles = 0;
+ for (const auto& rElementName : aNames)
+ if (rElementName.startsWith("ppt/media/image"))
+ nImageFiles++;
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 1
+ // - Actual : 2
+ // i.e. the embedded picture would have been saved twice.
+ CPPUNIT_ASSERT_EQUAL(1, nImageFiles);
+}
+
+void SdOOXMLExportTest3::testTdf109169_OctagonBevel()
+{
+ // The document has a shape 'Octagon Bevel'. It consists of an octagon with 8 points and eight
+ // facets with 4 points each, total 8+8*4=40 points. Without the patch it was exported as
+ // rectangle and thus had 4 points.
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf109169_Octagon.odp"), ODP);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ auto xPropSet(getShapeFromPage(0, 0, xDocShRef));
+ auto aGeomPropSeq = xPropSet->getPropertyValue("CustomShapeGeometry")
+ .get<uno::Sequence<beans::PropertyValue>>();
+ comphelper::SequenceAsHashMap aCustomShapeGeometry(aGeomPropSeq);
+ auto aPathSeq((aCustomShapeGeometry["Path"]).get<uno::Sequence<beans::PropertyValue>>());
+ comphelper::SequenceAsHashMap aPath(aPathSeq);
+ auto aCoordinates(
+ (aPath["Coordinates"]).get<uno::Sequence<drawing::EnhancedCustomShapeParameterPair>>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(40), aCoordinates.getLength());
+}
+
+void SdOOXMLExportTest3::testTdf109169_DiamondBevel()
+{
+ // The document has a shape 'Diamond Bevel'. It consists of a diamond with 4 points and four
+ // facets with 4 points each, total 4+4*4=20 points. Without the patch it was exported as
+ // rectangle and thus had 4 points.
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf109169_Diamond.odp"), ODP);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ auto xPropSet(getShapeFromPage(0, 0, xDocShRef));
+ auto aGeomPropSeq = xPropSet->getPropertyValue("CustomShapeGeometry")
+ .get<uno::Sequence<beans::PropertyValue>>();
+ comphelper::SequenceAsHashMap aCustomShapeGeometry(aGeomPropSeq);
+ auto aPathSeq((aCustomShapeGeometry["Path"]).get<uno::Sequence<beans::PropertyValue>>());
+ comphelper::SequenceAsHashMap aPath(aPathSeq);
+ auto aCoordinates(
+ (aPath["Coordinates"]).get<uno::Sequence<drawing::EnhancedCustomShapeParameterPair>>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(20), aCoordinates.getLength());
+}
+
+void SdOOXMLExportTest3::testTdf144092_emptyShapeTextProps()
+{
+ // Document contains one shape and one table. Both without any text but with
+ // text properties contained inside endParaRPr - The import and export
+ // of endParaRPr for empty cells and shapes are tested here
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf144092-emptyShapeTextProps.pptx"),
+ PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ Color aColor;
+ // check text properties of empty shape
+ uno::Reference<beans::XPropertySet> xRectShapeProps(getShapeFromPage(1, 0, xDocShRef));
+ CPPUNIT_ASSERT_EQUAL(OUString("Calibri"),
+ xRectShapeProps->getPropertyValue("CharFontName").get<OUString>());
+ CPPUNIT_ASSERT_EQUAL(float(196), xRectShapeProps->getPropertyValue("CharHeight").get<float>());
+ xRectShapeProps->getPropertyValue("CharColor") >>= aColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x70AD47), aColor);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ sdr::table::SdrTableObj* pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pTableObj);
+ uno::Reference<table::XCellRange> xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xCell;
+
+ // check text properties of empty cells
+ xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("CharColor") >>= aColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFFFFFF), aColor);
+
+ xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("CharColor") >>= aColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x70AD47), aColor);
+ CPPUNIT_ASSERT_EQUAL(float(96), xCell->getPropertyValue("CharHeight").get<float>());
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testTdf94122_autoColor()
+{
+ // Document contains three pages, with different scenarios for automatic
+ // color export to pptx.
+ // - First page: Page background light, automatic colored text on a FillType_NONE shape
+ // - Second page: Page background dark, automatic colored text on a FillType_NONE shape
+ // - Third page: Page background light, automatic colored text on a dark colored fill
+ // and another automatic colored text on a light colored fill
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf94122_autocolor.odp"), ODP);
+
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ // Without the accompanying fix in place, these tests would have failed with:
+ // - Expected: 1
+ // - Actual : 0
+ // - In ..., XPath '/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr' number of nodes is incorrect
+ // i.e. automatic color wasn't resolved & exported
+
+ xmlDocUniquePtr pXmlDocContent1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent1,
+ "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr", "val",
+ "000000");
+
+ xmlDocUniquePtr pXmlDocContent2 = parseExport(tempFile, "ppt/slides/slide2.xml");
+ assertXPath(pXmlDocContent2,
+ "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr", "val",
+ "ffffff");
+
+ xmlDocUniquePtr pXmlDocContent3 = parseExport(tempFile, "ppt/slides/slide3.xml");
+ assertXPath(pXmlDocContent3,
+ "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr",
+ "val", "ffffff");
+ assertXPath(pXmlDocContent3,
+ "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:srgbClr",
+ "val", "000000");
+}
+
+void SdOOXMLExportTest3::testTdf124333()
+{
+ // Document contains one rectangle and one embedded OLE object.
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/ole.pptx"), PPTX);
+
+ // Without the fix in place, the number of shapes was 3.
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("number of shapes is incorrect", sal_Int32(2),
+ getPage(0, xDocShRef)->getCount());
+
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ // Check number of shapes after export.
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("number of shapes is incorrect after export", sal_Int32(2),
+ getPage(0, xDocShRef)->getCount());
+
+ xDocShRef->DoClose();
+}
+
+void SdOOXMLExportTest3::testAutofittedTextboxIndent()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/autofitted-textbox-indent.odp"), ODP);
+
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ // Without the accompanying fix in place, these tests would have failed with:
+ // - Expected: 691200
+ // - Actual : 1080000
+ // i.e. paragraph indent wasn't scaled proportionally to autofitted textbox
+ // font scale on export
+
+ xmlDocUniquePtr pXmlDocContent1 = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent1, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p[1]/a:pPr", "marL",
+ "691200");
+}
+
+void SdOOXMLExportTest3::testTdf152436()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/ole-emf_min.pptx"), PPTX);
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("number of shapes is incorrect", sal_Int32(1),
+ getPage(0, xDocShRef)->getCount());
+
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ // Check number of shapes after export.
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("number of shapes is incorrect after export", sal_Int32(1),
+ getPage(0, xDocShRef)->getCount());
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdOOXMLExportTest3);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/export-tests.cxx b/sd/qa/unit/export-tests.cxx
new file mode 100644
index 000000000..7b0a1032b
--- /dev/null
+++ b/sd/qa/unit/export-tests.cxx
@@ -0,0 +1,1758 @@
+/* -*- 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 <sal/config.h>
+
+#include <string_view>
+
+#include <officecfg/Office/Common.hxx>
+#include "sdmodeltestbase.hxx"
+#include <sdpage.hxx>
+
+#include <editeng/editobj.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/colritem.hxx>
+#include <editeng/eeitem.hxx>
+
+#include <svx/svdotext.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdomedia.hxx>
+#include <unotools/mediadescriptor.hxx>
+#include <rtl/ustring.hxx>
+
+#include <com/sun/star/drawing/BitmapMode.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/awt/XBitmap.hpp>
+#include <com/sun/star/graphic/XGraphic.hpp>
+#include <com/sun/star/graphic/GraphicType.hpp>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
+#include <com/sun/star/table/BorderLine2.hpp>
+#include <com/sun/star/text/WritingMode2.hpp>
+#include <com/sun/star/text/XTextColumns.hpp>
+
+#include <svx/svdotable.hxx>
+#include <vcl/filter/PDFiumLibrary.hxx>
+
+using namespace css;
+using namespace css::animations;
+
+class SdExportTest : public SdModelTestBaseXML
+{
+public:
+ void testBackgroundImage();
+ void testMediaEmbedding();
+ void testFillBitmapUnused();
+ void testFdo84043();
+ void testTdf97630();
+ void testSwappedOutImageExport();
+ void testOOoXMLAnimations();
+ void testBnc480256();
+ void testUnknownAttributes();
+ void testTdf80020();
+ void testTdf128985();
+ void testLinkedGraphicRT();
+ void testTdf79082();
+ void testImageWithSpecialID();
+ void testTdf62176();
+ void testTransparentBackground();
+ void testTdf142716();
+ void testEmbeddedPdf();
+ void testEmbeddedText();
+ void testTransparenText();
+ void testDefaultSubscripts();
+ void testTdf98477();
+ void testAuthorField();
+ void testTdf50499();
+ void testTdf100926();
+ void testPageWithTransparentBackground();
+ void testTextRotation();
+ void testTdf115394PPT();
+ void testBulletsAsImage();
+ void testTdf113818();
+ void testTdf119629();
+ void testTdf141269();
+ void testTdf123557();
+ void testTdf113822();
+ void testTdf126761();
+ void testGlow();
+ void testSoftEdges();
+ void testShadowBlur();
+ void testRhbz1870501();
+ void testTdf91060();
+ void testTdf128550();
+ void testTdf140714();
+ void testMasterPageBackgroundFullSize();
+ void testColumnsODG();
+ void testTdf112126();
+ void testTdf153179();
+
+ CPPUNIT_TEST_SUITE(SdExportTest);
+
+ CPPUNIT_TEST(testBackgroundImage);
+ CPPUNIT_TEST(testMediaEmbedding);
+ CPPUNIT_TEST(testFillBitmapUnused);
+ CPPUNIT_TEST(testFdo84043);
+ CPPUNIT_TEST(testTdf97630);
+ CPPUNIT_TEST(testSwappedOutImageExport);
+ CPPUNIT_TEST(testOOoXMLAnimations);
+ CPPUNIT_TEST(testBnc480256);
+ CPPUNIT_TEST(testUnknownAttributes);
+ CPPUNIT_TEST(testTdf80020);
+ CPPUNIT_TEST(testTdf128985);
+ CPPUNIT_TEST(testLinkedGraphicRT);
+ CPPUNIT_TEST(testTdf79082);
+ CPPUNIT_TEST(testImageWithSpecialID);
+ CPPUNIT_TEST(testTdf62176);
+ CPPUNIT_TEST(testTransparentBackground);
+ CPPUNIT_TEST(testTdf142716);
+ CPPUNIT_TEST(testEmbeddedPdf);
+ CPPUNIT_TEST(testEmbeddedText);
+ CPPUNIT_TEST(testTransparenText);
+ CPPUNIT_TEST(testDefaultSubscripts);
+ CPPUNIT_TEST(testTdf98477);
+ CPPUNIT_TEST(testAuthorField);
+ CPPUNIT_TEST(testTdf50499);
+ CPPUNIT_TEST(testTdf100926);
+ CPPUNIT_TEST(testPageWithTransparentBackground);
+ CPPUNIT_TEST(testTextRotation);
+ CPPUNIT_TEST(testTdf115394PPT);
+ CPPUNIT_TEST(testBulletsAsImage);
+ CPPUNIT_TEST(testTdf113818);
+ CPPUNIT_TEST(testTdf119629);
+ CPPUNIT_TEST(testTdf141269);
+ CPPUNIT_TEST(testTdf123557);
+ CPPUNIT_TEST(testTdf113822);
+ CPPUNIT_TEST(testTdf126761);
+ CPPUNIT_TEST(testGlow);
+ CPPUNIT_TEST(testSoftEdges);
+ CPPUNIT_TEST(testShadowBlur);
+ CPPUNIT_TEST(testRhbz1870501);
+ CPPUNIT_TEST(testTdf91060);
+ CPPUNIT_TEST(testTdf128550);
+ CPPUNIT_TEST(testTdf140714);
+ CPPUNIT_TEST(testMasterPageBackgroundFullSize);
+ CPPUNIT_TEST(testColumnsODG);
+ CPPUNIT_TEST(testTdf112126);
+ CPPUNIT_TEST(testTdf153179);
+ CPPUNIT_TEST_SUITE_END();
+
+ virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override
+ {
+ XmlTestTools::registerODFNamespaces(pXmlXPathCtx);
+ }
+
+};
+
+namespace
+{
+uno::Reference<awt::XBitmap> getBitmapFromTable(const sd::DrawDocShellRef& xDocShRef,
+ OUString const& rName)
+{
+ uno::Reference<awt::XBitmap> xBitmap;
+
+ uno::Reference<lang::XMultiServiceFactory> xFactory(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY);
+
+ try
+ {
+ uno::Reference<container::XNameAccess> xBitmapTable(xFactory->createInstance("com.sun.star.drawing.BitmapTable"), uno::UNO_QUERY);
+ uno::Any rValue = xBitmapTable->getByName(rName);
+ if (rValue.has<uno::Reference<awt::XBitmap>>())
+ {
+ return rValue.get<uno::Reference<awt::XBitmap>>();
+ }
+ }
+ catch (const uno::Exception & /*rEx*/)
+ {
+ }
+
+ return xBitmap;
+}
+
+}
+
+void SdExportTest::testBackgroundImage()
+{
+ // Initial bug: N821567
+
+ // Check if Slide background image is imported from PPTX and exported to PPTX, PPT and ODP correctly
+
+ OUString bgImageName;
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/n821567.pptx"), PPTX);
+
+ // Check that imported background image from PPTX exists
+ {
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("not exactly one page", static_cast<sal_Int32>(1), xDoc->getDrawPages()->getCount());
+ uno::Reference<drawing::XDrawPage> xPage(getPage(0, xDocShRef));
+
+ uno::Reference<beans::XPropertySet> xPropertySet(xPage, uno::UNO_QUERY);
+ uno::Any aAny = xPropertySet->getPropertyValue("Background");
+ if (aAny.has<uno::Reference<beans::XPropertySet>>())
+ {
+ uno::Reference<beans::XPropertySet> xBackgroundPropSet;
+ aAny >>= xBackgroundPropSet;
+ aAny = xBackgroundPropSet->getPropertyValue("FillBitmapName");
+ aAny >>= bgImageName;
+ }
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Slide Background is not imported from PPTX correctly", OUString("msFillBitmap 1"), bgImageName);
+
+ uno::Reference<awt::XBitmap> xBitmap = getBitmapFromTable(xDocShRef, bgImageName);
+ CPPUNIT_ASSERT_MESSAGE("Slide Background Bitmap is missing when imported from PPTX", xBitmap.is());
+ }
+
+ // Save as PPTX, reload and check again so we make sure exporting to PPTX is working correctly
+ {
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("not exactly one page", static_cast<sal_Int32>(1), xDoc->getDrawPages()->getCount());
+ uno::Reference<drawing::XDrawPage> xPage(getPage(0, xDocShRef));
+
+ uno::Reference<beans::XPropertySet> xPropertySet(xPage, uno::UNO_QUERY);
+ uno::Any aAny = xPropertySet->getPropertyValue("Background");
+ if (aAny.hasValue())
+ {
+ uno::Reference<beans::XPropertySet> xBackgroundPropSet;
+ aAny >>= xBackgroundPropSet;
+ aAny = xBackgroundPropSet->getPropertyValue("FillBitmapName");
+ aAny >>= bgImageName;
+ }
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Slide Background is not exported from PPTX correctly", OUString("msFillBitmap 1"), bgImageName);
+
+ uno::Reference<awt::XBitmap> xBitmap = getBitmapFromTable(xDocShRef, bgImageName);
+ CPPUNIT_ASSERT_MESSAGE("Slide Background Bitmap is missing when exported from PPTX", xBitmap.is());
+ }
+
+ // Save as ODP, reload and check again so we make sure exporting and importing to ODP is working correctly
+ {
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP);
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("not exactly one page", static_cast<sal_Int32>(1), xDoc->getDrawPages()->getCount());
+ uno::Reference<drawing::XDrawPage> xPage(getPage(0, xDocShRef));
+
+ uno::Reference<beans::XPropertySet> xPropertySet(xPage, uno::UNO_QUERY);
+ uno::Any aAny = xPropertySet->getPropertyValue("Background");
+ if (aAny.hasValue())
+ {
+ uno::Reference<beans::XPropertySet> xBackgroundPropSet;
+ aAny >>= xBackgroundPropSet;
+ aAny = xBackgroundPropSet->getPropertyValue("FillBitmapName");
+ aAny >>= bgImageName;
+ }
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Slide Background is not exported or imported from ODP correctly", OUString("msFillBitmap 1"), bgImageName);
+
+ uno::Reference<awt::XBitmap> xBitmap = getBitmapFromTable(xDocShRef, bgImageName);
+ CPPUNIT_ASSERT_MESSAGE("Slide Background Bitmap is missing when exported or imported from ODP", xBitmap.is());
+ }
+
+ xDocShRef->DoClose();
+}
+
+namespace {
+
+template< typename ItemValue, typename ItemType >
+void checkFontAttributes( const SdrTextObj* pObj, ItemValue nVal, sal_uInt32 nId)
+{
+ CPPUNIT_ASSERT_MESSAGE( "no object", pObj != nullptr);
+ const EditTextObject& aEdit = pObj->GetOutlinerParaObject()->GetTextObject();
+ std::vector<EECharAttrib> rLst;
+ aEdit.GetCharAttribs(0, rLst);
+ for( std::vector<EECharAttrib>::reverse_iterator it = rLst.rbegin(); it!=rLst.rend(); ++it)
+ {
+ const ItemType* pAttrib = dynamic_cast<const ItemType *>((*it).pAttr);
+ if (pAttrib && pAttrib->Which() == nId)
+ {
+ CPPUNIT_ASSERT_EQUAL( nVal, static_cast<ItemValue>(pAttrib->GetValue()));
+ }
+ }
+}
+
+}
+
+void SdExportTest::testTransparentBackground()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/transparent_background.odp"), ODP);
+ xDocShRef = saveAndReload( xDocShRef.get(), ODP );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ const SdrTextObj *pObj1 = dynamic_cast<SdrTextObj *>( pPage->GetObj( 0 ) );
+ checkFontAttributes<Color, SvxColorItem>( pObj1, COL_TRANSPARENT, EE_CHAR_BKGCOLOR);
+
+ const SdrTextObj *pObj2 = dynamic_cast<SdrTextObj *>( pPage->GetObj( 1 ) );
+ checkFontAttributes<Color, SvxColorItem>( pObj2, COL_YELLOW, EE_CHAR_BKGCOLOR);
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testTdf142716()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf142716.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ const SdrTextObj *pObj = dynamic_cast<SdrTextObj *>( pPage->GetObj( 0 ) );
+
+ OUString sText = pObj->GetOutlinerParaObject()->GetTextObject().GetText(0);
+
+ // Without fix "yyy" part will be lost.
+ CPPUNIT_ASSERT_EQUAL( OUString( "xxx and yyy" ), sText);
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testMediaEmbedding()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/media_embedding.odp"), ODP);
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ // Second object is a sound
+ SdrMediaObj *pMediaObj = dynamic_cast<SdrMediaObj*>( pPage->GetObj( 3 ));
+ CPPUNIT_ASSERT_MESSAGE( "missing media object", pMediaObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL( OUString( "vnd.sun.star.Package:Media/button-1.wav" ), pMediaObj->getMediaProperties().getURL());
+ CPPUNIT_ASSERT_EQUAL( OUString( "application/vnd.sun.star.media" ), pMediaObj->getMediaProperties().getMimeType());
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testFillBitmapUnused()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/fillbitmap2.odp"), ODP);
+ utl::TempFile aTempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &aTempFile);
+
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "content.xml");
+ // shapes
+ assertXPath(pXmlDoc, "//style:style[@style:family='graphic']/style:graphic-properties[@draw:fill='bitmap']", 1);
+ assertXPath(pXmlDoc, "//style:style[@style:family='graphic']/style:graphic-properties[@draw:fill='bitmap']", "fill-image-name", "nav_5f_up");
+ assertXPath(pXmlDoc, "//style:style[@style:family='graphic']/style:graphic-properties[@draw:fill='solid']", 1);
+ assertXPath(pXmlDoc, "//style:style[@style:family='graphic']/style:graphic-properties[@draw:fill='solid' and @draw:fill-image-name]", 0);
+ assertXPath(pXmlDoc, "//style:style[@style:family='graphic']/style:graphic-properties[@draw:fill='solid']", "fill-color", "#808080");
+
+ xmlDocUniquePtr pStyles = parseExport(aTempFile, "styles.xml");
+ // master slide presentation style
+ assertXPath(pStyles,
+ "/office:document-styles/office:styles/style:style[@style:family='presentation' and @style:name='Default-background']/style:graphic-properties", "fill", "bitmap");
+ assertXPath(pStyles,
+ "/office:document-styles/office:styles/style:style[@style:family='presentation' and @style:name='Default-background']/style:graphic-properties", "fill-image-name", "nav_5f_up");
+ assertXPath(pStyles,
+ "/office:document-styles/office:styles/style:style[@style:family='presentation' and @style:name='Default_20_1-background']/style:graphic-properties", "fill", "solid");
+ assertXPath(pStyles,
+ "/office:document-styles/office:styles/style:style[@style:family='presentation' and @style:name='Default_20_1-background']/style:graphic-properties", "fill-color", "#808080");
+ assertXPath(pStyles,
+ "/office:document-styles/office:styles/style:style[@style:family='presentation' and @style:name='Default_20_1-background']/style:graphic-properties[@draw:fill-image-name]", 0);
+ // master slide drawing-page style
+ assertXPath(pStyles,
+ "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp1']/style:drawing-page-properties", "fill", "bitmap");
+ assertXPath(pStyles,
+ "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp1']/style:drawing-page-properties", "fill-image-name", "nav_5f_up");
+ assertXPath(pStyles,
+ "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/style:drawing-page-properties", "fill", "solid");
+ assertXPath(pStyles,
+ "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/style:drawing-page-properties", "fill-color", "#808080");
+ assertXPath(pStyles,
+ "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/style:drawing-page-properties[@draw:fill-image-name]", 0);
+
+ // the named items
+ assertXPath(pStyles,
+ "/office:document-styles/office:styles/draw:fill-image", 1);
+ assertXPath(pStyles,
+ "/office:document-styles/office:styles/draw:fill-image", "name", "nav_5f_up");
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testFdo84043()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/fdo84043.odp"), ODP);
+ xDocShRef = saveAndReload( xDocShRef.get(), ODP );
+
+ // the bug was duplicate attributes, causing crash in a build with asserts
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ SdrObject const* pShape = pPage->GetObj(1);
+ CPPUNIT_ASSERT_MESSAGE("no shape", pShape != nullptr);
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testTdf97630()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/fit-to-size.fodp"), FODP);
+
+ {
+ uno::Reference<drawing::XDrawPagesSupplier> xDPS(xDocShRef->GetModel(), uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xDP(xDPS->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+
+ drawing::TextFitToSizeType tmp;
+ // text shapes
+ uno::Reference<beans::XPropertySet> xShape0(xDP->getByIndex(0), uno::UNO_QUERY);
+ xShape0->getPropertyValue("TextFitToSize") >>= tmp;
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_NONE, tmp);
+ uno::Reference<beans::XPropertySet> xShape1(xDP->getByIndex(1), uno::UNO_QUERY);
+ xShape1->getPropertyValue("TextFitToSize") >>= tmp;
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_PROPORTIONAL, tmp);
+ uno::Reference<beans::XPropertySet> xShape2(xDP->getByIndex(2), uno::UNO_QUERY);
+ xShape2->getPropertyValue("TextFitToSize") >>= tmp;
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_ALLLINES, tmp);
+ uno::Reference<beans::XPropertySet> xShape3(xDP->getByIndex(3), uno::UNO_QUERY);
+ xShape3->getPropertyValue("TextFitToSize") >>= tmp;
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_AUTOFIT, tmp);
+
+ // fontworks
+ uno::Reference<beans::XPropertySet> xShape4(xDP->getByIndex(4), uno::UNO_QUERY);
+ xShape4->getPropertyValue("TextFitToSize") >>= tmp;
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_NONE, tmp);
+ uno::Reference<beans::XPropertySet> xShape5(xDP->getByIndex(5), uno::UNO_QUERY);
+ xShape5->getPropertyValue("TextFitToSize") >>= tmp;
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_ALLLINES, tmp);
+
+ }
+
+ utl::TempFile aTempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &aTempFile);
+
+ {
+ uno::Reference<drawing::XDrawPagesSupplier> xDPS(xDocShRef->GetModel(), uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xDP(xDPS->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+
+ drawing::TextFitToSizeType tmp;
+ // text shapes
+ uno::Reference<beans::XPropertySet> xShape0(xDP->getByIndex(0), uno::UNO_QUERY);
+ xShape0->getPropertyValue("TextFitToSize") >>= tmp;
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_NONE, tmp);
+ uno::Reference<beans::XPropertySet> xShape1(xDP->getByIndex(1), uno::UNO_QUERY);
+ xShape1->getPropertyValue("TextFitToSize") >>= tmp;
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_PROPORTIONAL, tmp);
+ uno::Reference<beans::XPropertySet> xShape2(xDP->getByIndex(2), uno::UNO_QUERY);
+ xShape2->getPropertyValue("TextFitToSize") >>= tmp;
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_PROPORTIONAL, tmp);
+ uno::Reference<beans::XPropertySet> xShape3(xDP->getByIndex(3), uno::UNO_QUERY);
+ xShape3->getPropertyValue("TextFitToSize") >>= tmp;
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_AUTOFIT, tmp);
+
+ // fontworks
+ uno::Reference<beans::XPropertySet> xShape4(xDP->getByIndex(4), uno::UNO_QUERY);
+ xShape4->getPropertyValue("TextFitToSize") >>= tmp;
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_NONE, tmp);
+ uno::Reference<beans::XPropertySet> xShape5(xDP->getByIndex(5), uno::UNO_QUERY);
+ xShape5->getPropertyValue("TextFitToSize") >>= tmp;
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_PROPORTIONAL, tmp);
+ }
+
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "content.xml");
+ // text shapes
+ assertXPath(pXmlDoc, "//style:style[@style:family='presentation']/style:graphic-properties[@draw:fit-to-size='false' and @style:shrink-to-fit='false']", 1);
+ assertXPath(pXmlDoc, "//style:style[@style:family='presentation']/style:graphic-properties[@draw:fit-to-size='true' and @style:shrink-to-fit='false']", 2);
+ assertXPath(pXmlDoc, "//style:style[@style:family='presentation']/style:graphic-properties[@draw:fit-to-size='false' and @style:shrink-to-fit='true']", 1);
+ // fontworks
+ assertXPath(pXmlDoc, "//style:style[@style:family='graphic']/style:graphic-properties[@draw:fit-to-size='false' and @style:shrink-to-fit='false']", 1);
+ assertXPath(pXmlDoc, "//style:style[@style:family='graphic']/style:graphic-properties[@draw:fit-to-size='true' and @style:shrink-to-fit='false']", 1);
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testSwappedOutImageExport()
+{
+ // Problem was with the swapped out images, which were not swapped in during export.
+ const sal_Int32 vFormats[] = {
+ ODP,
+ PPT,
+ PPTX,
+ };
+
+ // Set cache size to a very small value to make sure one of the images is swapped out
+ std::shared_ptr< comphelper::ConfigurationChanges > xBatch(comphelper::ConfigurationChanges::create());
+ officecfg::Office::Common::Cache::GraphicManager::TotalCacheSize::set(sal_Int32(1), xBatch);
+ xBatch->commit();
+
+ for( size_t nExportFormat = 0; nExportFormat < SAL_N_ELEMENTS(vFormats); ++nExportFormat )
+ {
+ // Load the original file with one image
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/document_with_two_images.odp"), ODP);
+ const OString sFailedMessage = OString::Concat("Failed on filter: ") + aFileFormats[vFormats[nExportFormat]].pFilterName;
+
+ // Export the document and import again for a check
+ uno::Reference< lang::XComponent > xComponent = xDocShRef->GetModel();
+ uno::Reference<frame::XStorable> xStorable(xComponent, uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OStringToOUString(std::string_view(aFileFormats[vFormats[nExportFormat]].pFilterName), RTL_TEXTENCODING_UTF8);
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+ xComponent.set(xStorable, uno::UNO_QUERY);
+ xComponent->dispose();
+ xDocShRef = loadURL(aTempFile.GetURL(), nExportFormat);
+
+ // Check whether graphic exported well after it was swapped out
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(xDocShRef->GetModel(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), static_cast<sal_Int32>(2), xDrawPagesSupplier->getDrawPages()->getCount());
+ uno::Reference< drawing::XDrawPage > xDrawPage( xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW );
+
+ uno::Reference<drawing::XShape> xImage(xDrawPage->getByIndex(2), uno::UNO_QUERY);
+ uno::Reference< beans::XPropertySet > XPropSet( xImage, uno::UNO_QUERY_THROW );
+
+ // Check Graphic, Size
+ {
+ uno::Reference<graphic::XGraphic> xGraphic;
+ XPropSet->getPropertyValue("Graphic") >>= xGraphic;
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is());
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic->getType() != graphic::GraphicType::EMPTY);
+ uno::Reference<awt::XBitmap> xBitmap(xGraphic, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast<sal_Int32>(610), xBitmap->getSize().Width );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast<sal_Int32>(381), xBitmap->getSize().Height );
+ }
+
+ // Second Image
+ xDrawPage.set(xDrawPagesSupplier->getDrawPages()->getByIndex(1), uno::UNO_QUERY_THROW );
+ xImage.set(xDrawPage->getByIndex(1), uno::UNO_QUERY);
+ XPropSet.set( xImage, uno::UNO_QUERY_THROW );
+
+ // Check Graphic, Size
+ {
+ uno::Reference<graphic::XGraphic> xGraphic;
+ XPropSet->getPropertyValue("Graphic") >>= xGraphic;
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is());
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic->getType() != graphic::GraphicType::EMPTY);
+ uno::Reference<awt::XBitmap> xBitmap(xGraphic, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast<sal_Int32>(900), xBitmap->getSize().Width );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast<sal_Int32>(600), xBitmap->getSize().Height );
+ }
+ xDocShRef->DoClose();
+ }
+}
+
+void SdExportTest::testOOoXMLAnimations()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/sxi/ooo41061-1.sxi"), SXI);
+
+ uno::Reference<lang::XComponent> xComponent = xDocShRef->GetModel();
+ uno::Reference<frame::XStorable> xStorable(xComponent, uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OStringToOUString(std::string_view(getFormat(ODP)->pFilterName), RTL_TEXTENCODING_UTF8);
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+
+ xDocShRef->DoClose();
+
+ // the problem was that legacy OOoXML animations were lost if store
+ // immediately follows load because they were "converted" async by a timer
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "content.xml");
+ assertXPath(pXmlDoc, "//anim:par[@presentation:node-type='timing-root']", 26);
+ // currently getting 52 of these without the fix (depends on timing)
+ assertXPath(pXmlDoc, "//anim:par", 223);
+}
+
+void SdExportTest::testBnc480256()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc480256.pptx"), PPTX);
+ // In the document, there are two tables with table background properties.
+ // Make sure colors are set properly for individual cells.
+
+ // TODO: If you are working on improving table background support, expect
+ // this unit test to fail. In that case, feel free to change the numbers.
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ sdr::table::SdrTableObj *pTableObj;
+ uno::Reference< table::XCellRange > xTable;
+ uno::Reference< beans::XPropertySet > xCell;
+ Color nColor;
+ table::BorderLine2 aBorderLine;
+
+ pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT( pTableObj );
+ xTable.set(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+
+ xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x9bc3ee), nColor);
+ xCell->getPropertyValue("LeftBorder") >>= aBorderLine;
+ CPPUNIT_ASSERT_EQUAL(Color(0x5597d3), Color(ColorTransparency, aBorderLine.Color));
+
+ xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xc6ddff), nColor);
+ xCell->getPropertyValue("TopBorder") >>= aBorderLine;
+ CPPUNIT_ASSERT_EQUAL(Color(0x5597d3), Color(ColorTransparency, aBorderLine.Color));
+
+ pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(1));
+ CPPUNIT_ASSERT( pTableObj );
+ xTable.set(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+
+ xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x6bace6), nColor);
+ xCell->getPropertyValue("LeftBorder") >>= aBorderLine;
+ CPPUNIT_ASSERT_EQUAL(Color(0xbecfe6), Color(ColorTransparency, aBorderLine.Color));
+
+ xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x4697e0), nColor);
+
+ // This border should be invisible.
+ xCell.set(xTable->getCellByPosition(1, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("BottomBorder") >>= aBorderLine;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), sal_Int32(aBorderLine.LineWidth));
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testUnknownAttributes()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/unknown-attribute.fodp"), FODP);
+
+ uno::Reference<lang::XComponent> xComponent = xDocShRef->GetModel();
+ uno::Reference<frame::XStorable> xStorable(xComponent, uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OStringToOUString(std::string_view(getFormat(ODP)->pFilterName), RTL_TEXTENCODING_UTF8);
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "content.xml");
+ assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name='gr1']/style:graphic-properties[@foo:non-existent-att='bar']");
+// TODO: if the namespace is *known*, the attribute is not preserved, but that seems to be a pre-existing problem, or maybe it's even intentional?
+// assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name='gr1']/style:graphic-properties[@svg:non-existent-att='blah']");
+ // this was on style:graphic-properties on the import, but the export moves it to root node which is OK
+ assertXPathNSDef(pXmlDoc, "/office:document-content", u"foo", u"http://example.com/");
+}
+
+void SdExportTest::testTdf80020()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf80020.odp"), ODP);
+ {
+ uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(xDocShRef->GetModel(), uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xStyleFamilies = xStyleFamiliesSupplier->getStyleFamilies();
+ uno::Reference<container::XNameAccess> xStyleFamily(xStyleFamilies->getByName("graphics"), uno::UNO_QUERY);
+ uno::Reference<style::XStyle> xStyle(xStyleFamily->getByName("Test Style"), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("text"), xStyle->getParentStyle());
+ xDocShRef = saveAndReload( xDocShRef.get(), ODP );
+ }
+ uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(xDocShRef->GetModel(), uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xStyleFamilies = xStyleFamiliesSupplier->getStyleFamilies();
+ uno::Reference<container::XNameAccess> xStyleFamily(xStyleFamilies->getByName("graphics"), uno::UNO_QUERY);
+ uno::Reference<style::XStyle> xStyle(xStyleFamily->getByName("Test Style"), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("text"), xStyle->getParentStyle());
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testTdf128985()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf128985.odp"), ODP);
+
+ {
+ uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(xDocShRef->GetModel(), uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xStyleFamilies = xStyleFamiliesSupplier->getStyleFamilies();
+ uno::Reference<container::XNameAccess> xStyleFamily(xStyleFamilies->getByName("LushGreen"), uno::UNO_QUERY);
+ uno::Reference<style::XStyle> xStyle(xStyleFamily->getByName("outline1"), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xPropSet( xStyle, uno::UNO_QUERY );
+
+ sal_Int16 nWritingMode = 0;
+ xPropSet->getPropertyValue( "WritingMode" ) >>= nWritingMode;
+ CPPUNIT_ASSERT_EQUAL(text::WritingMode2::RL_TB, nWritingMode);
+
+ xPropSet->setPropertyValue("WritingMode", uno::Any(text::WritingMode2::LR_TB));
+
+ xDocShRef = saveAndReload( xDocShRef.get(), ODP );
+ }
+
+ uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(xDocShRef->GetModel(), uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xStyleFamilies = xStyleFamiliesSupplier->getStyleFamilies();
+ uno::Reference<container::XNameAccess> xStyleFamily(xStyleFamilies->getByName("LushGreen"), uno::UNO_QUERY);
+ uno::Reference<style::XStyle> xStyle(xStyleFamily->getByName("outline1"), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xPropSet( xStyle, uno::UNO_QUERY );
+
+ sal_Int16 nWritingMode = 0;
+ xPropSet->getPropertyValue( "WritingMode" ) >>= nWritingMode;
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: 0
+ // - Actual : 1
+ CPPUNIT_ASSERT_EQUAL(text::WritingMode2::LR_TB, nWritingMode);
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testLinkedGraphicRT()
+{
+ // Problem was with linked images
+ const sal_Int32 vFormats[] = {
+ ODP,
+ PPT,
+// PPTX, -> this fails now, need a fix
+ };
+
+ for( size_t nExportFormat = 0; nExportFormat < SAL_N_ELEMENTS(vFormats); ++nExportFormat )
+ {
+ // Load the original file with one image
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/document_with_linked_graphic.odp"), ODP);
+
+ // Export the document and import again for a check
+ uno::Reference< lang::XComponent > xComponent = xDocShRef->GetModel();
+ uno::Reference<frame::XStorable> xStorable(xComponent, uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OStringToOUString(std::string_view(aFileFormats[vFormats[nExportFormat]].pFilterName), RTL_TEXTENCODING_UTF8);
+
+ // Check if the graphic has been imported correctly (before doing the export/import run)
+ {
+ const OString sFailedImportMessage = "Failed to correctly import the document";
+ SdDrawDocument* pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE(sFailedImportMessage.getStr(), pDoc != nullptr);
+ const SdrPage* pPage = pDoc->GetPage(1);
+ CPPUNIT_ASSERT_MESSAGE(sFailedImportMessage.getStr(), pPage != nullptr);
+ SdrGrafObj* pObject = dynamic_cast<SdrGrafObj*>(pPage->GetObj(2));
+ CPPUNIT_ASSERT_MESSAGE(sFailedImportMessage.getStr(), pObject != nullptr );
+ CPPUNIT_ASSERT_MESSAGE(sFailedImportMessage.getStr(), pObject->IsLinkedGraphic() );
+
+ const GraphicObject& rGraphicObj = pObject->GetGraphicObject(true);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedImportMessage.getStr(), int(GraphicType::Bitmap), int(rGraphicObj.GetGraphic().GetType()));
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedImportMessage.getStr(), sal_uLong(864900), rGraphicObj.GetGraphic().GetSizeBytes());
+ }
+
+ // Save and reload
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+ xComponent.set(xStorable, uno::UNO_QUERY);
+ xComponent->dispose();
+ xDocShRef = loadURL(aTempFile.GetURL(), nExportFormat);
+
+ // Check whether graphic imported well after export
+ {
+ const OString sFailedMessage = OString::Concat("Failed on filter: ") + aFileFormats[vFormats[nExportFormat]].pFilterName;
+
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), pDoc != nullptr );
+ const SdrPage *pPage = pDoc->GetPage(1);
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), pPage != nullptr );
+ SdrGrafObj* pObject = dynamic_cast<SdrGrafObj*>(pPage->GetObj(2));
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), pObject != nullptr );
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), pObject->IsLinkedGraphic() );
+
+ const GraphicObject& rGraphicObj = pObject->GetGraphicObject(true);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), int(GraphicType::Bitmap), int(rGraphicObj.GetGraphic().GetType()));
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), sal_uLong(864900), rGraphicObj.GetGraphic().GetSizeBytes());
+ }
+
+ xDocShRef->DoClose();
+ }
+}
+
+void SdExportTest::testTdf79082()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/ppt/tdf79082.ppt"), PPT);
+ utl::TempFile tempFile;
+ tempFile.EnableKillingFile();
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile);
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "content.xml");
+
+ // P1 should have 6 tab stops defined
+ assertXPathChildren(
+ pXmlDoc, "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops", 6);
+ assertXPath(pXmlDoc,
+ "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/"
+ "style:tab-stop[1]",
+ "position", "0cm");
+ assertXPath(pXmlDoc,
+ "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/"
+ "style:tab-stop[2]",
+ "position", "5.08cm");
+ assertXPath(pXmlDoc,
+ "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/"
+ "style:tab-stop[3]",
+ "position", "10.16cm");
+ assertXPath(pXmlDoc,
+ "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/"
+ "style:tab-stop[4]",
+ "position", "15.24cm");
+ assertXPath(pXmlDoc,
+ "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/"
+ "style:tab-stop[5]",
+ "position", "20.32cm");
+ assertXPath(pXmlDoc,
+ "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/"
+ "style:tab-stop[6]",
+ "position", "25.4cm");
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testImageWithSpecialID()
+{
+ // Check how LO handles when the imported graphic's ID is different from that one
+ // which is generated by LO.
+ const sal_Int32 vFormats[] = {
+ ODP,
+ PPT,
+ PPTX,
+ };
+
+ // Trigger swap out mechanism to test swapped state factor too.
+ std::shared_ptr< comphelper::ConfigurationChanges > batch(comphelper::ConfigurationChanges::create());
+ officecfg::Office::Common::Cache::GraphicManager::TotalCacheSize::set(sal_Int32(1), batch);
+ batch->commit();
+
+ for( size_t nExportFormat = 0; nExportFormat < SAL_N_ELEMENTS(vFormats); ++nExportFormat )
+ {
+ // Load the original file
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/images_with_special_IDs.odp"), ODP);
+ const OString sFailedMessage = OString::Concat("Failed on filter: ") + aFileFormats[vFormats[nExportFormat]].pFilterName;
+
+ // Export the document and import again for a check
+ uno::Reference< lang::XComponent > xComponent = xDocShRef->GetModel();
+ uno::Reference<frame::XStorable> xStorable(xComponent, uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OStringToOUString(std::string_view(aFileFormats[vFormats[nExportFormat]].pFilterName), RTL_TEXTENCODING_UTF8);
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+ xComponent.set(xStorable, uno::UNO_QUERY);
+ xComponent->dispose();
+ xDocShRef = loadURL(aTempFile.GetURL(), nExportFormat);
+
+ // Check whether graphic was exported well
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(xDocShRef->GetModel(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), static_cast<sal_Int32>(2), xDrawPagesSupplier->getDrawPages()->getCount() );
+ uno::Reference< drawing::XDrawPage > xDrawPage( xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW );
+
+ uno::Reference<drawing::XShape> xImage(xDrawPage->getByIndex(2), uno::UNO_QUERY);
+ uno::Reference< beans::XPropertySet > XPropSet( xImage, uno::UNO_QUERY_THROW );
+
+ // Check Graphic, Size
+ {
+ uno::Reference<graphic::XGraphic> xGraphic;
+ XPropSet->getPropertyValue("Graphic") >>= xGraphic;
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is());
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic->getType() != graphic::GraphicType::EMPTY);
+ uno::Reference<awt::XBitmap> xBitmap(xGraphic, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast<sal_Int32>(610), xBitmap->getSize().Width );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast<sal_Int32>(381), xBitmap->getSize().Height );
+ }
+
+ // Second Image
+ xDrawPage.set(xDrawPagesSupplier->getDrawPages()->getByIndex(1), uno::UNO_QUERY_THROW );
+ xImage.set(xDrawPage->getByIndex(1), uno::UNO_QUERY);
+ XPropSet.set( xImage, uno::UNO_QUERY_THROW );
+
+ // Check Graphic, Size
+ {
+ uno::Reference<graphic::XGraphic> xGraphic;
+ XPropSet->getPropertyValue("Graphic") >>= xGraphic;
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is());
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic->getType() != graphic::GraphicType::EMPTY);
+ uno::Reference<awt::XBitmap> xBitmap(xGraphic, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast<sal_Int32>(900), xBitmap->getSize().Width );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast<sal_Int32>(600), xBitmap->getSize().Height );
+ }
+ xDocShRef->DoClose();
+ }
+}
+
+void SdExportTest::testTdf62176()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/Tdf62176.odp"), ODP);
+ uno::Reference<drawing::XDrawPage> xPage( getPage( 0, xDocShRef ) );
+
+ //there should be only *one* shape
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xPage->getCount());
+
+ uno::Reference<beans::XPropertySet> xShape( getShape( 0, xPage ) );
+ //checking Paragraph's Left Margin with expected value
+ sal_Int32 nParaLeftMargin = 0;
+ xShape->getPropertyValue("ParaLeftMargin") >>= nParaLeftMargin;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), nParaLeftMargin);
+ //checking Paragraph's First Line Indent with expected value
+ sal_Int32 nParaFirstLineIndent = 0;
+ xShape->getPropertyValue("ParaFirstLineIndent") >>= nParaFirstLineIndent;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(-1300), nParaFirstLineIndent);
+
+ //Checking the *Text* in TextBox
+ uno::Reference<text::XTextRange> xParagraph( getParagraphFromShape( 0, xShape ) );
+ CPPUNIT_ASSERT_EQUAL(OUString("Hello World"), xParagraph->getString());
+
+ //Saving and Reloading the file
+ xDocShRef = saveAndReload( xDocShRef.get(), ODP );
+ uno::Reference<drawing::XDrawPage> xPage2( getPage(0, xDocShRef ) );
+ //there should be only *one* shape
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xPage2->getCount());
+
+ uno::Reference<beans::XPropertySet> xShape2( getShape( 0, xPage2 ) );
+ //checking Paragraph's Left Margin with expected value
+ sal_Int32 nParaLeftMargin2 = 0;
+ xShape2->getPropertyValue("ParaLeftMargin") >>= nParaLeftMargin2;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), nParaLeftMargin2);
+ //checking Paragraph's First Line Indent with expected value
+ sal_Int32 nParaFirstLineIndent2 = 0;
+ xShape2->getPropertyValue("ParaFirstLineIndent") >>= nParaFirstLineIndent2;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(-1300), nParaFirstLineIndent2);
+
+ //Checking the *Text* in TextBox
+ uno::Reference<text::XTextRange> xParagraph2( getParagraphFromShape( 0, xShape2 ) );
+ CPPUNIT_ASSERT_EQUAL(OUString("Hello World"), xParagraph2->getString());
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testEmbeddedPdf()
+{
+ auto pPdfium = vcl::pdf::PDFiumLibrary::get();
+ if (!pPdfium)
+ {
+ return;
+ }
+
+ sd::DrawDocShellRef xShell = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/embedded-pdf.odp"), ODP);
+ xShell = saveAndReload( xShell.get(), ODP );
+ uno::Reference<drawing::XDrawPage> xPage = getPage(0, xShell);
+ uno::Reference<beans::XPropertySet> xShape(xPage->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShape->getPropertyValue("ReplacementGraphic") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+ xShell->DoClose();
+}
+
+void SdExportTest::testEmbeddedText()
+{
+ sd::DrawDocShellRef xShell = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/objectwithtext.fodg"), FODG);
+ xShell = saveAndReload( xShell.get(), ODG );
+
+ uno::Reference<drawing::XDrawPage> xPage = getPage(0, xShell);
+ uno::Reference<beans::XPropertySet> xShape(xPage->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<text::XText> xText(xShape, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xText.is());
+
+ uno::Reference<container::XEnumerationAccess> xEA(xShape, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xEA->hasElements());
+ uno::Reference<container::XEnumeration> xEnum(xEA->createEnumeration());
+ uno::Reference<text::XTextContent> xTC;
+ xEnum->nextElement() >>= xTC;
+ CPPUNIT_ASSERT(xTC.is());
+
+ uno::Reference<container::XEnumerationAccess> xParaEA(xTC, uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> xParaEnum(xParaEA->createEnumeration());
+ uno::Reference<beans::XPropertySet> xPortion(xParaEnum->nextElement(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPortion.is());
+ uno::Reference<text::XTextRange> xRange(xPortion, uno::UNO_QUERY);
+ OUString type;
+ xPortion->getPropertyValue("TextPortionType") >>= type;
+ CPPUNIT_ASSERT_EQUAL(OUString("Text"), type);
+ CPPUNIT_ASSERT_EQUAL(OUString("foobar"), xRange->getString()); //tdf#112547
+
+ xShell->DoClose();
+}
+
+void SdExportTest::testTransparenText()
+{
+ sd::DrawDocShellRef xShell
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/transparent-text.fodg"), FODG);
+ xShell = saveAndReload(xShell.get(), ODG);
+
+ uno::Reference<drawing::XDrawPage> xPage = getPage(0, xShell);
+ uno::Reference<beans::XPropertySet> xShape(xPage->getByIndex(0), uno::UNO_QUERY);
+ sal_Int16 nCharTransparence = 0;
+ xShape->getPropertyValue("CharTransparence") >>= nCharTransparence;
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 75
+ // - Actual : 0
+ // i.e. the 75% transparent text was turned into a "not transparent at all" text.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(75), nCharTransparence);
+
+ xShell->DoClose();
+}
+
+void SdExportTest::testDefaultSubscripts()
+{
+ sd::DrawDocShellRef xShell
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/tdf80194_defaultSubscripts.fodg"), FODG);
+ xShell = saveAndReload(xShell.get(), ODG);
+
+ uno::Reference<drawing::XDrawPage> xPage = getPage(0, xShell);
+ uno::Reference<drawing::XShape> xShape(xPage->getByIndex(1), uno::UNO_QUERY);
+ // Default subscripts were too large, enlarging the gap between the next line.
+ // The exact size isn't important. Was 18975, now 16604.
+ CPPUNIT_ASSERT(17000 > xShape->getSize().Height);
+
+ xShell->DoClose();
+}
+
+void SdExportTest::testTdf98477()
+{
+ utl::TempFile tempFile;
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf98477grow.pptx"), PPTX);
+
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile);
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "content.xml");
+ assertXPath(pXmlDoc, "//anim:animateTransform", "by", "0.5,0.5");
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testAuthorField()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/author_fixed.odp"), ODP);
+
+ xDocShRef = saveAndReload( xDocShRef.get(), ODP );
+
+ uno::Reference< text::XTextField > xField = getTextFieldFromPage(0, 0, 0, 0, xDocShRef);
+ CPPUNIT_ASSERT_MESSAGE("Where is the text field?", xField.is() );
+
+ uno::Reference< beans::XPropertySet > xPropSet( xField, uno::UNO_QUERY_THROW );
+ bool bFixed = false;
+ xPropSet->getPropertyValue("IsFixed") >>= bFixed;
+ CPPUNIT_ASSERT_MESSAGE("Author field is not fixed", bFixed);
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testTdf50499()
+{
+ utl::TempFile tempFile;
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf50499.pptx"), PPTX);
+
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile);
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "content.xml");
+ assertXPath(pXmlDoc, "//anim:animate[1]", "from", "(-width/2)");
+ assertXPath(pXmlDoc, "//anim:animate[1]", "to", "(x)");
+ assertXPath(pXmlDoc, "//anim:animate[3]", "by", "(height/3+width*0.1)");
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testTdf100926()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf100926_ODP.pptx"), PPTX);
+
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ CPPUNIT_ASSERT(pPage != nullptr);
+
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pTableObj != nullptr);
+ uno::Reference< table::XCellRange > xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+
+ sal_Int32 nRotation = 0;
+ uno::Reference< beans::XPropertySet > xCell(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("RotateAngle") >>= nRotation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(27000), nRotation);
+
+ xCell.set(xTable->getCellByPosition(1, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("RotateAngle") >>= nRotation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(9000), nRotation);
+
+ xCell.set(xTable->getCellByPosition(2, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("RotateAngle") >>= nRotation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nRotation);
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testPageWithTransparentBackground()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/page_transparent_background.odp"), ODP );
+
+ xDocShRef = saveAndReload( xDocShRef.get(), ODP );
+ uno::Reference< drawing::XDrawPagesSupplier > xDoc(
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "There should be exactly one page", static_cast<sal_Int32>(1), xDoc->getDrawPages()->getCount() );
+
+ uno::Reference< drawing::XDrawPage > xPage( getPage( 0, xDocShRef ) );
+
+ uno::Reference< beans::XPropertySet > xPropSet( xPage, uno::UNO_QUERY );
+ uno::Any aAny = xPropSet->getPropertyValue( "Background" );
+ CPPUNIT_ASSERT_MESSAGE("Slide background is missing", aAny.hasValue());
+
+ uno::Reference< beans::XPropertySet > aXBackgroundPropSet;
+ aAny >>= aXBackgroundPropSet;
+ sal_Int32 nTransparence;
+ aAny = aXBackgroundPropSet->getPropertyValue( "FillTransparence" );
+ aAny >>= nTransparence;
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Slide background transparency is wrong", sal_Int32(42), nTransparence);
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testTextRotation()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/shape-text-rotate.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile);
+
+ uno::Reference<drawing::XDrawPage> xPage(getPage(0, xDocShRef));
+ uno::Reference<beans::XPropertySet> xPropSet(getShape(0, xPage));
+
+ CPPUNIT_ASSERT(xPropSet.is());
+
+ auto aGeomPropSeq = xPropSet->getPropertyValue("CustomShapeGeometry").get<uno::Sequence<beans::PropertyValue>>();
+ comphelper::SequenceAsHashMap aCustomShapeGeometry(aGeomPropSeq);
+
+ auto it = aCustomShapeGeometry.find("TextRotateAngle");
+ CPPUNIT_ASSERT(it != aCustomShapeGeometry.end());
+
+ CPPUNIT_ASSERT_EQUAL(double(-90), aCustomShapeGeometry["TextRotateAngle"].get<double>());
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testTdf115394PPT()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/ppt/tdf115394.ppt"), PPT);
+
+ // Export the document and import again for a check
+ uno::Reference< lang::XComponent > xComponent = xDocShRef->GetModel();
+ uno::Reference<frame::XStorable> xStorable(xComponent, uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OStringToOUString(std::string_view(aFileFormats[PPT].pFilterName), RTL_TEXTENCODING_UTF8);
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+ xComponent.set(xStorable, uno::UNO_QUERY);
+ xComponent->dispose();
+ xDocShRef = loadURL(aTempFile.GetURL(), PPT);
+
+ double fTransitionDuration;
+
+ // Fast
+ SdPage* pPage1 = xDocShRef->GetDoc()->GetSdPage(0, PageKind::Standard);
+ fTransitionDuration = pPage1->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.5, fTransitionDuration);
+
+ // Medium
+ SdPage* pPage2 = xDocShRef->GetDoc()->GetSdPage(1, PageKind::Standard);
+ fTransitionDuration = pPage2->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.75, fTransitionDuration);
+
+ // Slow
+ SdPage* pPage3 = xDocShRef->GetDoc()->GetSdPage(2, PageKind::Standard);
+ fTransitionDuration = pPage3->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(1.0, fTransitionDuration);
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testBulletsAsImage()
+{
+ for (sal_Int32 nExportFormat : {ODP, PPTX, PPT})
+ {
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/BulletsAsImage.odp"), ODP);
+ const OString sFailedMessageBase = OString::Concat("Failed on filter '") + aFileFormats[nExportFormat].pFilterName + "': ";
+
+ uno::Reference< lang::XComponent > xComponent = xDocShRef->GetModel();
+ uno::Reference<frame::XStorable> xStorable(xComponent, uno::UNO_QUERY);
+ utl::MediaDescriptor aMediaDescriptor;
+ aMediaDescriptor["FilterName"] <<= OStringToOUString(std::string_view(aFileFormats[nExportFormat].pFilterName), RTL_TEXTENCODING_UTF8);
+
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+ xComponent.set(xStorable, uno::UNO_QUERY);
+ xComponent->dispose();
+
+ xDocShRef = loadURL(aTempFile.GetURL(), nExportFormat);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<text::XTextRange> const xParagraph(getParagraphFromShape(0, xShape));
+ uno::Reference<beans::XPropertySet> xPropSet(xParagraph, uno::UNO_QUERY_THROW);
+
+ uno::Reference<container::XIndexAccess> xLevels(xPropSet->getPropertyValue("NumberingRules"), uno::UNO_QUERY_THROW);
+ uno::Sequence<beans::PropertyValue> aProperties;
+ xLevels->getByIndex(0) >>= aProperties; // 1st level
+
+ uno::Reference<awt::XBitmap> xBitmap;
+ awt::Size aSize;
+ sal_Int16 nNumberingType = -1;
+
+ for (beans::PropertyValue const & rProperty : std::as_const(aProperties))
+ {
+ if (rProperty.Name == "NumberingType")
+ {
+ nNumberingType = rProperty.Value.get<sal_Int16>();
+ }
+ else if (rProperty.Name == "GraphicBitmap")
+ {
+ xBitmap = rProperty.Value.get<uno::Reference<awt::XBitmap>>();
+ }
+ else if (rProperty.Name == "GraphicSize")
+ {
+ aSize = rProperty.Value.get<awt::Size>();
+ }
+ }
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessageBase.getStr(), style::NumberingType::BITMAP, nNumberingType);
+
+ // Graphic Bitmap
+ const OString sFailed = sFailedMessageBase + "No bitmap for the bullets";
+ CPPUNIT_ASSERT_MESSAGE(sFailed.getStr(), xBitmap.is());
+ Graphic aGraphic(uno::Reference<graphic::XGraphic>(xBitmap, uno::UNO_QUERY));
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessageBase.getStr(), GraphicType::Bitmap, aGraphic.GetType());
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessageBase.getStr(), aGraphic.GetSizeBytes() > o3tl::make_unsigned(0));
+
+ if (nExportFormat == ODP || nExportFormat == PPT)
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessageBase.getStr(), tools::Long(16), aGraphic.GetSizePixel().Width());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessageBase.getStr(), tools::Long(16), aGraphic.GetSizePixel().Height());
+ }
+ else // FIXME: what happened here
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessageBase.getStr(), tools::Long(64), aGraphic.GetSizePixel().Width());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessageBase.getStr(), tools::Long(64), aGraphic.GetSizePixel().Height());
+ }
+
+ // Graphic Size
+ if (nExportFormat == ODP)
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessageBase.getStr(), sal_Int32(500), aSize.Width);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessageBase.getStr(), sal_Int32(500), aSize.Height);
+
+ }
+ else if (nExportFormat == PPT) // seems like a conversion error
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessageBase.getStr(), sal_Int32(504), aSize.Width);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessageBase.getStr(), sal_Int32(504), aSize.Height);
+ }
+ else // FIXME: totally wrong
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessageBase.getStr(), sal_Int32(790), aSize.Width);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessageBase.getStr(), sal_Int32(790), aSize.Height);
+ }
+
+ xDocShRef->DoClose();
+ }
+}
+
+void SdExportTest::testTdf113822()
+{
+ utl::TempFile tempFile;
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf113822underline.pptx"), PPTX);
+
+ // Was unable to export iterate container (tdf#99213).
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ // Was unable to import iterate container (tdf#113822).
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile);
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "content.xml");
+
+ // IterateContainer was created as ParallelTimeContainer before, so
+ // the iterate type is not set too.
+ assertXPath(pXmlDoc, "//anim:iterate", "iterate-type", "by-letter");
+ // The target of the child animation nodes need to be in the iterate container.
+ assertXPath(pXmlDoc, "//anim:iterate", "targetElement", "id1");
+ assertXPath(pXmlDoc, "//anim:iterate/anim:set", "attributeName", "text-underline");
+ assertXPath(pXmlDoc, "//anim:iterate/anim:set", "to", "solid");
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testTdf113818()
+{
+ utl::TempFile tempFile;
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf113818-swivel.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPT);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile);
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "content.xml");
+ assertXPath(pXmlDoc, "//anim:animate[1]", "formula", "width*sin(2.5*pi*$)");
+ assertXPath(pXmlDoc, "//anim:animate[1]", "values", "0;1");
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testTdf119629()
+{
+ utl::TempFile tempFile;
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/ppt/tdf119629.ppt"), PPT);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPT);
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile);
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "content.xml");
+
+ // MSO's effect node type Click parallel node, with group node, after group node
+ // were missing.
+ assertXPath(pXmlDoc, "//draw:page"
+ "/anim:par[@presentation:node-type='timing-root']"
+ "/anim:seq[@presentation:node-type='main-sequence']"
+ "/anim:par[@presentation:node-type='on-click']"
+ "/anim:par[@presentation:node-type='with-previous']"
+ "/anim:par[@presentation:node-type='on-click']"
+ "/anim:animate[@anim:formula='width*sin(2.5*pi*$)']", 1);
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testTdf141269()
+{
+ utl::TempFile tempFile;
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf141269.odp"), ODP);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPT);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_SET_THROW);
+ CPPUNIT_ASSERT(xShape.is());
+
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShape->getPropertyValue("Graphic") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+
+ Graphic aGraphic(xGraphic);
+ BitmapEx aBitmap(aGraphic.GetBitmapEx());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(1920), aBitmap.GetSizePixel().Width());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(1080), aBitmap.GetSizePixel().Height());
+
+ Color aExpectedColor(0xC2DEEA);
+ aExpectedColor.SetAlpha(0xF);
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: Color: R:194 G:222 B:234 A:240
+ // - Actual : Color: R:194 G:222 B:234 A:15
+ CPPUNIT_ASSERT_EQUAL(aExpectedColor, aBitmap.GetPixelColor(960, 540));
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testTdf123557()
+{
+ utl::TempFile tempFile;
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/trigger.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile);
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "content.xml");
+
+ // Contains 2 interactive sequences and 3 triggered effects.
+ assertXPath(pXmlDoc, "//draw:page", 1);
+ assertXPath(pXmlDoc, "//draw:page/anim:par", 1);
+ assertXPath(pXmlDoc, "//draw:page"
+ "/anim:par[@presentation:node-type='timing-root']"
+ "/anim:seq[@presentation:node-type='interactive-sequence']", 2);
+ assertXPath(pXmlDoc, "//draw:page"
+ "/anim:par[@presentation:node-type='timing-root']"
+ "/anim:seq[@presentation:node-type='interactive-sequence']"
+ "/anim:par[@smil:begin]",3);
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testTdf126761()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/ppt/tdf126761.ppt"), PPT);
+ xDocShRef = saveAndReload( xDocShRef.get(), ODP );
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+
+ // Get first paragraph of the text
+ uno::Reference<text::XTextRange> const xParagraph( getParagraphFromShape( 0, xShape ) );
+
+ // Get first run of the paragraph
+ uno::Reference<text::XTextRange> xRun( getRunFromParagraph (0, xParagraph ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xRun, uno::UNO_QUERY_THROW );
+
+ // Check character underline, to make sure it has been set correctly
+ sal_uInt32 nCharUnderline;
+ xPropSet->getPropertyValue( "CharUnderline" ) >>= nCharUnderline;
+ CPPUNIT_ASSERT_EQUAL( sal_uInt32(1), nCharUnderline );
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testGlow()
+{
+ auto xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odg/glow.odg"), ODG);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), ODG, &tempFile);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+
+ // Check glow properties
+ sal_Int32 nGlowEffectRad = 0;
+ CPPUNIT_ASSERT(xShape->getPropertyValue("GlowEffectRadius") >>= nGlowEffectRad);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(529), nGlowEffectRad); // 15 pt = 529.166... mm/100
+ Color nGlowEffectColor;
+ CPPUNIT_ASSERT(xShape->getPropertyValue("GlowEffectColor") >>= nGlowEffectColor);
+ CPPUNIT_ASSERT_EQUAL(Color(0x00FF4000), nGlowEffectColor); // "Brick"
+ sal_Int16 nGlowEffectTransparency = 0;
+ CPPUNIT_ASSERT(xShape->getPropertyValue("GlowEffectTransparency") >>= nGlowEffectTransparency);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(60), nGlowEffectTransparency); // 60%
+
+ // Test ODF element
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "content.xml");
+
+ // check that we actually test graphic style
+ assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[2]",
+ "family", "graphic");
+ // check loext graphic attributes
+ assertXPath(
+ pXmlDoc,
+ "/office:document-content/office:automatic-styles/style:style[2]/style:graphic-properties",
+ "glow-radius", "0.529cm");
+ assertXPath(
+ pXmlDoc,
+ "/office:document-content/office:automatic-styles/style:style[2]/style:graphic-properties",
+ "glow-color", "#ff4000");
+ assertXPath(
+ pXmlDoc,
+ "/office:document-content/office:automatic-styles/style:style[2]/style:graphic-properties",
+ "glow-transparency", "60%");
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testSoftEdges()
+{
+ auto xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odg/softedges.odg"), ODG);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), ODG, &tempFile);
+ auto xShapeProps(getShapeFromPage(0, 0, xDocShRef));
+
+ // Check property
+ sal_Int32 nRad = 0;
+ CPPUNIT_ASSERT(xShapeProps->getPropertyValue("SoftEdgeRadius") >>= nRad);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(635), nRad); // 18 pt
+
+ // Test ODF element
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "content.xml");
+
+ // check that we actually test graphic style
+ assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[2]",
+ "family", "graphic");
+ // check loext graphic attribute
+ assertXPath(
+ pXmlDoc,
+ "/office:document-content/office:automatic-styles/style:style[2]/style:graphic-properties",
+ "softedge-radius", "0.635cm");
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testShadowBlur()
+{
+ auto xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odg/shadow-blur.odg"), ODG);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), ODG, &tempFile);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+
+ sal_Int32 nRad = 0;
+ CPPUNIT_ASSERT(xShape->getPropertyValue("ShadowBlur") >>= nRad);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(388), nRad); // 11 pt = 388 Hmm
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "content.xml");
+
+ assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[2]",
+ "family", "graphic");
+ assertXPath(
+ pXmlDoc,
+ "/office:document-content/office:automatic-styles/style:style[2]/style:graphic-properties",
+ "shadow-blur", "0.388cm");
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testRhbz1870501()
+{
+ //Without the fix in place, it would crash at export time
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/odg/rhbz1870501.odg"), ODG);
+ xDocShRef = saveAndReload( xDocShRef.get(), ODG );
+}
+
+void SdExportTest::testTdf91060()
+{
+ //Without the fix in place, it would crash at import time
+ ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf91060.pptx"), PPTX);
+ xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+}
+
+void SdExportTest::testTdf128550()
+{
+ utl::TempFile tempFile;
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf128550.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile);
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "content.xml");
+ assertXPath( pXmlDoc, "//anim:iterate[@anim:sub-item='background']", 1);
+ assertXPath( pXmlDoc, "//anim:iterate[@anim:sub-item='text']", 4);
+ xDocShRef->DoClose();
+
+}
+
+void SdExportTest::testTdf140714()
+{
+ //Without the fix in place, shape will be imported as GraphicObjectShape instead of CustomShape.
+
+ auto xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf140714.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ uno::Reference<drawing::XShape> xShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString{"com.sun.star.drawing.CustomShape"}, xShape->getShapeType());
+
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testMasterPageBackgroundFullSize()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/background.odp"), ODP);
+
+ // BackgroundFullSize exists on master pages only
+ // (note: this document can't be created with the UI because UI keeps
+ // page margins and the flag synchronized across all master pages)
+ uno::Reference<drawing::XMasterPagesSupplier> xMPS(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPages> xMPs(xMPS->getMasterPages());
+ Color nFillColor;
+ {
+ uno::Reference<beans::XPropertySet> xMP(xMPs->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(!xMP->getPropertyValue("BackgroundFullSize").get<bool>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get<sal_Int32>());
+ uno::Reference<beans::XPropertySet> xBackgroundProps(
+ xMP->getPropertyValue("Background").get<uno::Reference<beans::XPropertySet>>());
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, xBackgroundProps->getPropertyValue("FillStyle").get<drawing::FillStyle>());
+ xBackgroundProps->getPropertyValue("FillColor") >>= nFillColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x729fcf), nFillColor);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get<sal_Int16>());
+ }
+ {
+ uno::Reference<beans::XPropertySet> xMP(xMPs->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xMP->getPropertyValue("BackgroundFullSize").get<bool>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get<sal_Int32>());
+ uno::Reference<beans::XPropertySet> xBackgroundProps(
+ xMP->getPropertyValue("Background").get<uno::Reference<beans::XPropertySet>>());
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, xBackgroundProps->getPropertyValue("FillStyle").get<drawing::FillStyle>());
+ xBackgroundProps->getPropertyValue("FillColor") >>= nFillColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x729fcf), nFillColor);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get<sal_Int16>());
+ }
+ {
+ uno::Reference<beans::XPropertySet> xMP(xMPs->getByIndex(2), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(!xMP->getPropertyValue("BackgroundFullSize").get<bool>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get<sal_Int32>());
+ uno::Reference<beans::XPropertySet> xBackgroundProps(
+ xMP->getPropertyValue("Background").get<uno::Reference<beans::XPropertySet>>());
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, xBackgroundProps->getPropertyValue("FillStyle").get<drawing::FillStyle>());
+ CPPUNIT_ASSERT_EQUAL(drawing::BitmapMode_STRETCH, xBackgroundProps->getPropertyValue("FillBitmapMode").get<drawing::BitmapMode>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get<sal_Int16>());
+ }
+ {
+ uno::Reference<beans::XPropertySet> xMP(xMPs->getByIndex(3), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xMP->getPropertyValue("BackgroundFullSize").get<bool>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get<sal_Int32>());
+ uno::Reference<beans::XPropertySet> xBackgroundProps(
+ xMP->getPropertyValue("Background").get<uno::Reference<beans::XPropertySet>>());
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, xBackgroundProps->getPropertyValue("FillStyle").get<drawing::FillStyle>());
+ CPPUNIT_ASSERT_EQUAL(drawing::BitmapMode_STRETCH, xBackgroundProps->getPropertyValue("FillBitmapMode").get<drawing::BitmapMode>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get<sal_Int16>());
+ }
+
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP, &tempFile);
+
+ xMPS.set(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY);
+ xMPs.set(xMPS->getMasterPages());
+ {
+ uno::Reference<beans::XPropertySet> xMP(xMPs->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(!xMP->getPropertyValue("BackgroundFullSize").get<bool>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get<sal_Int32>());
+ uno::Reference<beans::XPropertySet> xBackgroundProps(
+ xMP->getPropertyValue("Background").get<uno::Reference<beans::XPropertySet>>());
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, xBackgroundProps->getPropertyValue("FillStyle").get<drawing::FillStyle>());
+ xBackgroundProps->getPropertyValue("FillColor") >>= nFillColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x729fcf), nFillColor);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get<sal_Int16>());
+ }
+ {
+ uno::Reference<beans::XPropertySet> xMP(xMPs->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xMP->getPropertyValue("BackgroundFullSize").get<bool>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get<sal_Int32>());
+ uno::Reference<beans::XPropertySet> xBackgroundProps(
+ xMP->getPropertyValue("Background").get<uno::Reference<beans::XPropertySet>>());
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, xBackgroundProps->getPropertyValue("FillStyle").get<drawing::FillStyle>());
+ xBackgroundProps->getPropertyValue("FillColor") >>= nFillColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x729fcf), nFillColor);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get<sal_Int16>());
+ }
+ {
+ uno::Reference<beans::XPropertySet> xMP(xMPs->getByIndex(2), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(!xMP->getPropertyValue("BackgroundFullSize").get<bool>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get<sal_Int32>());
+ uno::Reference<beans::XPropertySet> xBackgroundProps(
+ xMP->getPropertyValue("Background").get<uno::Reference<beans::XPropertySet>>());
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, xBackgroundProps->getPropertyValue("FillStyle").get<drawing::FillStyle>());
+ CPPUNIT_ASSERT_EQUAL(drawing::BitmapMode_STRETCH, xBackgroundProps->getPropertyValue("FillBitmapMode").get<drawing::BitmapMode>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get<sal_Int16>());
+ }
+ {
+ uno::Reference<beans::XPropertySet> xMP(xMPs->getByIndex(3), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xMP->getPropertyValue("BackgroundFullSize").get<bool>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderTop").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), xMP->getPropertyValue("BorderLeft").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderBottom").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xMP->getPropertyValue("BorderRight").get<sal_Int32>());
+ uno::Reference<beans::XPropertySet> xBackgroundProps(
+ xMP->getPropertyValue("Background").get<uno::Reference<beans::XPropertySet>>());
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, xBackgroundProps->getPropertyValue("FillStyle").get<drawing::FillStyle>());
+ CPPUNIT_ASSERT_EQUAL(drawing::BitmapMode_STRETCH, xBackgroundProps->getPropertyValue("FillBitmapMode").get<drawing::BitmapMode>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), xBackgroundProps->getPropertyValue("FillTransparence").get<sal_Int16>());
+ }
+
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "styles.xml");
+ assertXPath(pXmlDoc,
+ "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = "
+ "/office:document-styles/office:master-styles/style:master-page[@style:name='Default']/attribute::draw:style-name"
+ "]/style:drawing-page-properties", "background-size", "border");
+ assertXPath(pXmlDoc,
+ "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = "
+ "/office:document-styles/office:master-styles/style:master-page[@style:name='Default_20_3']/attribute::draw:style-name"
+ "]/style:drawing-page-properties", "background-size", "full");
+ assertXPath(pXmlDoc,
+ "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = "
+ "/office:document-styles/office:master-styles/style:master-page[@style:name='Default_20_2']/attribute::draw:style-name"
+ "]/style:drawing-page-properties", "background-size", "border");
+ assertXPath(pXmlDoc,
+ "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = "
+ "/office:document-styles/office:master-styles/style:master-page[@style:name='Default_20_1']/attribute::draw:style-name"
+ "]/style:drawing-page-properties", "background-size", "full");
+
+ tempFile.EnableKillingFile();
+}
+
+void SdExportTest::testColumnsODG()
+{
+ auto xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odg/two_columns.odg"), ODG);
+
+ {
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier = getDoc(xDocShRef);
+ uno::Reference<drawing::XDrawPages> xPages = xDrawPagesSupplier->getDrawPages();
+ uno::Reference<drawing::XDrawPage> xPage(xPages->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<container::XIndexAccess> xIndexAccess(xPage, uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xProps(xShape, uno::UNO_QUERY_THROW);
+ uno::Reference<text::XTextColumns> xCols(xProps->getPropertyValue("TextColumns"),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2), xCols->getColumnCount());
+ uno::Reference<beans::XPropertySet> xColProps(xCols, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(700)),
+ xColProps->getPropertyValue("AutomaticDistance"));
+
+ auto pTextObj = dynamic_cast<SdrTextObj*>(SdrObject::getSdrObjectFromXShape(xShape));
+ CPPUNIT_ASSERT(pTextObj);
+
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pTextObj->GetTextColumnsNumber());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(700), pTextObj->GetTextColumnsSpacing());
+ }
+
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), ODG, &tempFile);
+
+ {
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier = getDoc(xDocShRef);
+ uno::Reference<drawing::XDrawPages> xPages = xDrawPagesSupplier->getDrawPages();
+ uno::Reference<drawing::XDrawPage> xPage(xPages->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<container::XIndexAccess> xIndexAccess(xPage, uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xProps(xShape, uno::UNO_QUERY_THROW);
+ uno::Reference<text::XTextColumns> xCols(xProps->getPropertyValue("TextColumns"),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2), xCols->getColumnCount());
+ uno::Reference<beans::XPropertySet> xColProps(xCols, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(700)),
+ xColProps->getPropertyValue("AutomaticDistance"));
+
+ auto pTextObj = dynamic_cast<SdrTextObj*>(SdrObject::getSdrObjectFromXShape(xShape));
+ CPPUNIT_ASSERT(pTextObj);
+
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pTextObj->GetTextColumnsNumber());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(700), pTextObj->GetTextColumnsSpacing());
+ }
+
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "content.xml");
+ assertXPath(pXmlDoc,
+ "/office:document-content/office:automatic-styles/style:style/"
+ "style:graphic-properties/style:columns",
+ "column-count", "2");
+ assertXPath(pXmlDoc,
+ "/office:document-content/office:automatic-styles/style:style/"
+ "style:graphic-properties/style:columns",
+ "column-gap", "0.7cm");
+
+ tempFile.EnableKillingFile();
+}
+
+void SdExportTest::testTdf112126()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/tdf112126.odg"), ODG);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), ODG, &tempFile);
+ uno::Reference<drawing::XDrawPage> xPage(getPage(0, xDocShRef));
+ uno::Reference<beans::XPropertySet> xPropertySet(xPage, uno::UNO_QUERY);
+
+ OUString xPageName;
+ xPropertySet->getPropertyValue("LinkDisplayName") >>= xPageName;
+
+ // without the fix in place, it fails with
+ // - Expected: Page 1
+ // - Actual : Slide 1
+ CPPUNIT_ASSERT_EQUAL(OUString("Page 1"), xPageName);
+ xDocShRef->DoClose();
+}
+
+void SdExportTest::testTdf153179()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/ole-emf_min.pptx"), PPTX);
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("number of shapes is incorrect", sal_Int32(1),
+ getPage(0, xDocShRef)->getCount());
+
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP);
+
+ // Check number of shapes after export.
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getPage(0, xDocShRef)->getCount());
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdExportTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/filters-test.cxx b/sd/qa/unit/filters-test.cxx
new file mode 100644
index 000000000..33bbe48e5
--- /dev/null
+++ b/sd/qa/unit/filters-test.cxx
@@ -0,0 +1,118 @@
+/* -*- 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 <sal/config.h>
+#include <unotest/filters-test.hxx>
+#include <test/bootstrapfixture.hxx>
+#include <com/sun/star/lang/XComponent.hpp>
+
+#include <sfx2/docfilt.hxx>
+#include <sfx2/docfile.hxx>
+
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+
+using namespace ::com::sun::star;
+
+/// Test loading of files to assure they do not crash on load.
+class SdFiltersTest
+ : public test::FiltersTest
+ , public test::BootstrapFixture
+{
+public:
+ SdFiltersTest();
+
+ virtual bool load( const OUString &rFilter,
+ const OUString &rURL, const OUString &rUserData,
+ SfxFilterFlags nFilterFlags, SotClipboardFormatId nClipboardID,
+ unsigned int nFilterVersion) override;
+
+ virtual void setUp() override;
+ virtual void tearDown() override;
+
+ // Ensure CVEs remain unbroken
+ void testCVEs();
+
+ CPPUNIT_TEST_SUITE(SdFiltersTest);
+ CPPUNIT_TEST(testCVEs);
+ CPPUNIT_TEST_SUITE_END();
+
+private:
+ uno::Reference<uno::XInterface> m_xDrawComponent;
+};
+
+bool SdFiltersTest::load(const OUString &rFilter, const OUString &rURL,
+ const OUString &rUserData, SfxFilterFlags nFilterFlags, SotClipboardFormatId nClipboardID,
+ unsigned int nFilterVersion)
+{
+ auto pFilter = std::make_shared<SfxFilter>(
+ rFilter,
+ OUString(), nFilterFlags, nClipboardID, OUString(), OUString(),
+ rUserData, OUString() );
+ pFilter->SetVersion(nFilterVersion);
+
+ ::sd::DrawDocShellRef xDocShRef = new ::sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Impress);
+ SfxMedium* pSrcMed = new SfxMedium(rURL, StreamMode::STD_READ);
+ pSrcMed->SetFilter(pFilter);
+ bool bLoaded = xDocShRef->DoLoad(pSrcMed);
+ xDocShRef->DoClose();
+ return bLoaded;
+}
+
+void SdFiltersTest::testCVEs()
+{
+#ifndef DISABLE_CVE_TESTS
+ testDir("MS PowerPoint 97",
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/ppt/"),
+ "sdfilt");
+
+ testDir("Impress Office Open XML",
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/"),
+ "", (SfxFilterFlags::IMPORT | SfxFilterFlags::ALIEN | SfxFilterFlags::STARONEFILTER));
+
+ testDir("impress8",
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/"),
+ "sdfilt");
+
+ testDir("draw8",
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/odg/"),
+ "sdfilt");
+
+ testDir("CGM - Computer Graphics Metafile",
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/cgm/"),
+ "icg");
+#endif
+}
+
+SdFiltersTest::SdFiltersTest()
+{
+}
+
+void SdFiltersTest::setUp()
+{
+ test::BootstrapFixture::setUp();
+
+ // This is a bit of a fudge, we do this to ensure that ScGlobals::ensure,
+ // which is a private symbol to us, gets called
+ m_xDrawComponent =
+ getMultiServiceFactory()->createInstance("com.sun.star.comp.Draw.PresentationDocument");
+ CPPUNIT_ASSERT_MESSAGE("no impress component!", m_xDrawComponent.is());
+}
+
+void SdFiltersTest::tearDown()
+{
+ uno::Reference< lang::XComponent >( m_xDrawComponent, uno::UNO_QUERY_THROW )->dispose();
+ test::BootstrapFixture::tearDown();
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdFiltersTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/import-tests-smartart.cxx b/sd/qa/unit/import-tests-smartart.cxx
new file mode 100644
index 000000000..371d8d815
--- /dev/null
+++ b/sd/qa/unit/import-tests-smartart.cxx
@@ -0,0 +1,1851 @@
+/* -*- 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 "sdmodeltestbase.hxx"
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/drawing/TextFitToSizeType.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
+#include <com/sun/star/style/ParagraphAdjust.hpp>
+#include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/graphic/XGraphic.hpp>
+
+#include <svx/svdpage.hxx>
+#include <svx/svdogrp.hxx>
+#include <comphelper/sequenceashashmap.hxx>
+#include <oox/drawingml/drawingmltypes.hxx>
+
+using namespace ::com::sun::star;
+
+namespace
+{
+/// Gets one child of xShape, which one is specified by nIndex.
+uno::Reference<drawing::XShape> getChildShape(const uno::Reference<drawing::XShape>& xShape,
+ sal_Int32 nIndex)
+{
+ uno::Reference<container::XIndexAccess> xGroup(xShape, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+
+ CPPUNIT_ASSERT(xGroup->getCount() > nIndex);
+
+ uno::Reference<drawing::XShape> xRet(xGroup->getByIndex(nIndex), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xRet.is());
+
+ return xRet;
+}
+
+uno::Reference<drawing::XShape> findChildShapeByText(const uno::Reference<drawing::XShape>& xShape,
+ const OUString& sText)
+{
+ uno::Reference<text::XText> xText(xShape, uno::UNO_QUERY);
+ if (xText.is() && xText->getString() == sText)
+ return xShape;
+
+ uno::Reference<container::XIndexAccess> xGroup(xShape, uno::UNO_QUERY);
+ if (!xGroup.is())
+ return uno::Reference<drawing::XShape>();
+
+ for (sal_Int32 i = 0; i < xGroup->getCount(); i++)
+ {
+ uno::Reference<drawing::XShape> xChildShape(xGroup->getByIndex(i), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xReturnShape = findChildShapeByText(xChildShape, sText);
+ if (xReturnShape.is())
+ return xReturnShape;
+ }
+
+ return uno::Reference<drawing::XShape>();
+}
+}
+
+class SdImportTestSmartArt : public SdModelTestBase
+{
+public:
+ void testBase();
+ void testChildren();
+ void testText();
+ void testCnt();
+ void testDir();
+ void testTdf148665();
+ void testTdf148921();
+ void testMaxDepth();
+ void testRotation();
+ void testTextAutoRotation();
+ void testPyramid();
+ void testPyramidOneChild();
+ void testChevron();
+ void testCycle();
+ void testvenndiagram();
+ void testmatrix();
+ void testHierarchy();
+ void testInvertedPyramid();
+ void testBasicProcess();
+ void testMultidirectional();
+ void testHorizontalBulletList();
+ void testBasicRadicals();
+ void testEquation();
+ void testSegmentedCycle();
+ void testBaseRtoL();
+ void testVerticalBoxList();
+ void testVerticalBracketList();
+ void testTableList();
+ void testAccentProcess();
+ void testContinuousBlockProcess();
+ void testOrgChart();
+ void testCycleMatrix();
+ void testPictureStrip();
+ void testInteropGrabBag();
+ void testBackground();
+ void testBackgroundDrawingmlFallback();
+ void testCenterCycle();
+ void testFontSize();
+ void testVerticalBlockList();
+ void testBulletList();
+ void testMissingBulletAndIndent();
+ void testRecursion();
+ void testDataFollow();
+ void testOrgChart2();
+ void testTdf131553();
+ void testFillColorList();
+ void testTdf134221();
+ void testLinearRule();
+ void testLinearRuleVert();
+ void testAutofitSync();
+ void testSnakeRows();
+ void testCompositeInferRight();
+
+ CPPUNIT_TEST_SUITE(SdImportTestSmartArt);
+
+ CPPUNIT_TEST(testBase);
+ CPPUNIT_TEST(testChildren);
+ CPPUNIT_TEST(testText);
+ CPPUNIT_TEST(testCnt);
+ CPPUNIT_TEST(testDir);
+ CPPUNIT_TEST(testTdf148665);
+ CPPUNIT_TEST(testTdf148921);
+ CPPUNIT_TEST(testMaxDepth);
+ CPPUNIT_TEST(testRotation);
+ CPPUNIT_TEST(testTextAutoRotation);
+ CPPUNIT_TEST(testPyramid);
+ CPPUNIT_TEST(testPyramidOneChild);
+ CPPUNIT_TEST(testChevron);
+ CPPUNIT_TEST(testCycle);
+ CPPUNIT_TEST(testHierarchy);
+ CPPUNIT_TEST(testmatrix);
+ CPPUNIT_TEST(testvenndiagram);
+ CPPUNIT_TEST(testInvertedPyramid);
+ CPPUNIT_TEST(testBasicProcess);
+ CPPUNIT_TEST(testMultidirectional);
+ CPPUNIT_TEST(testHorizontalBulletList);
+ CPPUNIT_TEST(testBasicRadicals);
+ CPPUNIT_TEST(testEquation);
+ CPPUNIT_TEST(testSegmentedCycle);
+ CPPUNIT_TEST(testBaseRtoL);
+ CPPUNIT_TEST(testVerticalBoxList);
+ CPPUNIT_TEST(testVerticalBracketList);
+ CPPUNIT_TEST(testTableList);
+ CPPUNIT_TEST(testAccentProcess);
+ CPPUNIT_TEST(testContinuousBlockProcess);
+ CPPUNIT_TEST(testOrgChart);
+ CPPUNIT_TEST(testCycleMatrix);
+ CPPUNIT_TEST(testPictureStrip);
+ CPPUNIT_TEST(testInteropGrabBag);
+ CPPUNIT_TEST(testBackground);
+ CPPUNIT_TEST(testBackgroundDrawingmlFallback);
+ CPPUNIT_TEST(testCenterCycle);
+ CPPUNIT_TEST(testFontSize);
+ CPPUNIT_TEST(testVerticalBlockList);
+ CPPUNIT_TEST(testBulletList);
+ CPPUNIT_TEST(testMissingBulletAndIndent);
+ CPPUNIT_TEST(testRecursion);
+ CPPUNIT_TEST(testDataFollow);
+ CPPUNIT_TEST(testOrgChart2);
+ CPPUNIT_TEST(testTdf131553);
+ CPPUNIT_TEST(testFillColorList);
+ CPPUNIT_TEST(testTdf134221);
+ CPPUNIT_TEST(testLinearRule);
+ CPPUNIT_TEST(testLinearRuleVert);
+ CPPUNIT_TEST(testAutofitSync);
+ CPPUNIT_TEST(testSnakeRows);
+ CPPUNIT_TEST(testCompositeInferRight);
+
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void SdImportTestSmartArt::testBase()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/smartart1.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xShapeGroup->getCount());
+
+ uno::Reference<text::XText> xText0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("a"), xText0->getString());
+ uno::Reference<text::XText> xText1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("b"), xText1->getString());
+ uno::Reference<text::XText> xText2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("c"), xText2->getString());
+ uno::Reference<text::XText> xText3(xShapeGroup->getByIndex(4), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("d"), xText3->getString());
+ uno::Reference<text::XText> xText4(xShapeGroup->getByIndex(5), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("e"), xText4->getString());
+
+ uno::Reference<beans::XPropertySet> xShape(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+
+ Color nFillColor;
+ xShape->getPropertyValue("FillColor") >>= nFillColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x4F81BD), nFillColor);
+
+ sal_Int16 nParaAdjust = 0;
+ uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xShape));
+ uno::Reference<beans::XPropertySet> xPropSet(xParagraph, uno::UNO_QUERY_THROW);
+ xPropSet->getPropertyValue("ParaAdjust") >>= nParaAdjust;
+ CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_CENTER,
+ static_cast<style::ParagraphAdjust>(nParaAdjust));
+
+ uno::Reference<drawing::XShape> xShape0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape3(xShapeGroup->getByIndex(4), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape4(xShapeGroup->getByIndex(5), uno::UNO_QUERY_THROW);
+
+ /*
+ * Arrangement
+ * (LTR)
+ * ╭─────────╮
+ * │ 0 1 │
+ * │ 2 3 │
+ * │ 4 │
+ * ╰─────────╯
+ */
+ CPPUNIT_ASSERT_EQUAL(xShape0->getPosition().Y, xShape1->getPosition().Y);
+ CPPUNIT_ASSERT_EQUAL(xShape2->getPosition().Y, xShape3->getPosition().Y);
+
+ CPPUNIT_ASSERT_EQUAL(xShape0->getPosition().X, xShape2->getPosition().X);
+ CPPUNIT_ASSERT_EQUAL(xShape1->getPosition().X, xShape3->getPosition().X);
+
+ CPPUNIT_ASSERT_EQUAL(xShape2->getPosition().Y - xShape0->getPosition().Y,
+ xShape4->getPosition().Y - xShape2->getPosition().Y);
+ CPPUNIT_ASSERT_EQUAL(xShape1->getPosition().X - xShape0->getPosition().X,
+ xShape3->getPosition().X - xShape2->getPosition().X);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(xShape2->getPosition().X + xShape3->getPosition().X,
+ 2 * xShape4->getPosition().X, 1);
+
+ CPPUNIT_ASSERT(xShape2->getPosition().Y > xShape0->getPosition().Y);
+ CPPUNIT_ASSERT(xShape4->getPosition().Y > xShape2->getPosition().Y);
+ CPPUNIT_ASSERT(xShape0->getPosition().X < xShape1->getPosition().X);
+ CPPUNIT_ASSERT(xShape2->getPosition().X < xShape3->getPosition().X);
+ CPPUNIT_ASSERT((xShape2->getPosition().X < xShape4->getPosition().X));
+ CPPUNIT_ASSERT((xShape3->getPosition().X > xShape4->getPosition().X));
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testChildren()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/smartart-children.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xShapeGroup->getCount());
+
+ uno::Reference<drawing::XShapes> xShapeGroup0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xShapeGroup0->getCount());
+ uno::Reference<text::XText> xTextA(xShapeGroup0->getByIndex(0), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("a"), xTextA->getString());
+
+ uno::Reference<drawing::XShapes> xChildren0(xShapeGroup0->getByIndex(1), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xChildren0->getCount());
+ uno::Reference<drawing::XShapes> xChildB(xChildren0->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<text::XText> xTextB(xChildB->getByIndex(0), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("b"), xTextB->getString());
+ uno::Reference<drawing::XShapes> xChildC(xChildren0->getByIndex(1), uno::UNO_QUERY_THROW);
+ uno::Reference<text::XText> xTextC(xChildC->getByIndex(0), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("c"), xTextC->getString());
+
+ uno::Reference<drawing::XShapes> xShapeGroup1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xShapeGroup1->getCount());
+ uno::Reference<text::XText> xTextX(xShapeGroup1->getByIndex(0), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("x"), xTextX->getString());
+
+ uno::Reference<drawing::XShapes> xChildren1(xShapeGroup1->getByIndex(1), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xChildren1->getCount());
+ uno::Reference<drawing::XShapes> xChildY(xChildren1->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<text::XText> xTextY(xChildY->getByIndex(0), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("y"), xTextY->getString());
+ uno::Reference<drawing::XShapes> xChildZ(xChildren1->getByIndex(1), uno::UNO_QUERY_THROW);
+ uno::Reference<text::XText> xTextZ(xChildZ->getByIndex(0), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("z"), xTextZ->getString());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testText()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/smartart-text.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShapes> xShapeGroup2(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+
+ uno::Reference<text::XText> xText0(xShapeGroup2->getByIndex(0), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT(xText0->getString().isEmpty());
+
+ uno::Reference<text::XText> xText1(xShapeGroup2->getByIndex(1), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("test"), xText1->getString());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testCnt()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/smartart-cnt.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ sal_Int32 nCount = xShapeGroup->getCount();
+ sal_Int32 nCorrect = 0;
+ for (sal_Int32 i = 0; i < nCount; i++)
+ {
+ uno::Reference<text::XText> xText(xShapeGroup->getByIndex(i), uno::UNO_QUERY);
+ if (xText.is() && !xText->getString().isEmpty())
+ nCorrect++;
+ }
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), nCorrect);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testDir()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/smartart-dir.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xShapeGroup->getCount());
+
+ uno::Reference<drawing::XShape> xShape0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT(xShape0->getPosition().X > xShape1->getPosition().X);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testTdf148665()
+{
+ // Without the fix in place, this test would have crashed at import time
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf148665.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xShapeGroup->getCount());
+
+ uno::Reference<text::XText> xText0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("\nFufufu"), xText0->getString());
+ uno::Reference<text::XText> xText1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("Susu"), xText1->getString());
+ uno::Reference<text::XText> xText2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("Sasa Haha"), xText2->getString());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testTdf148921()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf148921.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xShapeGroup->getCount());
+
+ uno::Reference<drawing::XShapes> xShapeGroup2(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: 2
+ // - Actual : 4
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xShapeGroup2->getCount());
+
+ uno::Reference<drawing::XShape> xShape0(xShapeGroup2->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape1(xShapeGroup2->getByIndex(1), uno::UNO_QUERY_THROW);
+
+ CPPUNIT_ASSERT(xShape0->getPosition().X < xShape1->getPosition().X);
+ CPPUNIT_ASSERT(xShape0->getPosition().Y < xShape1->getPosition().Y);
+ CPPUNIT_ASSERT(xShape0->getSize().Height > xShape1->getSize().Height);
+ CPPUNIT_ASSERT(xShape0->getSize().Width > xShape1->getSize().Width);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testMaxDepth()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/smartart-maxdepth.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xShapeGroup->getCount());
+
+ uno::Reference<text::XText> xText0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("first"), xText0->getString());
+ uno::Reference<text::XText> xText1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("second"), xText1->getString());
+
+ uno::Reference<drawing::XShape> xShape0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(xShape0->getPosition().Y,
+ xShape1->getPosition().Y); // Confirms shapes are in same Y axis-level.
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testRotation()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/smartart-rotation.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+
+ uno::Reference<beans::XPropertySet> xShape0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xShape0->getPropertyValue("RotateAngle").get<sal_Int32>());
+
+ uno::Reference<beans::XPropertySet> xShape1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(24000),
+ xShape1->getPropertyValue("RotateAngle").get<sal_Int32>());
+
+ uno::Reference<beans::XPropertySet> xShape2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(12000),
+ xShape2->getPropertyValue("RotateAngle").get<sal_Int32>());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testTextAutoRotation()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/smartart-autoTxRot.pptx"), PPTX);
+
+ auto testText = [&](int pageNo, sal_Int32 txtNo, const OUString& expTx, sal_Int32 expShRot,
+ sal_Int32 expTxRot) {
+ OString msgText = "Page: " + OString::number(pageNo) + " text: " + OString::number(txtNo);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, pageNo, xDocShRef),
+ uno::UNO_QUERY_THROW);
+
+ txtNo++; //skip background
+ uno::Reference<text::XText> xTxt(xShapeGroup->getByIndex(txtNo), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(msgText.getStr(), expTx, xTxt->getString());
+ uno::Reference<beans::XPropertySet> xTxtProps(xTxt, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(msgText.getStr(), expShRot,
+ xTxtProps->getPropertyValue("RotateAngle").get<sal_Int32>());
+
+ auto aGeomPropSeq = xTxtProps->getPropertyValue("CustomShapeGeometry")
+ .get<uno::Sequence<beans::PropertyValue>>();
+ comphelper::SequenceAsHashMap aCustomShapeGeometry(aGeomPropSeq);
+
+ auto it = aCustomShapeGeometry.find("TextPreRotateAngle");
+ if (it == aCustomShapeGeometry.end())
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(msgText.getStr(), sal_Int32(0), expTxRot);
+ }
+ else
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(msgText.getStr(), expTxRot, it->second.get<sal_Int32>());
+ }
+ };
+
+ // Slide 1: absent autoTxRot => defaults to "upr"
+ testText(0, 0, "a", 0, 0);
+ testText(0, 1, "b", 33750, 0);
+ testText(0, 2, "c", 31500, 0);
+ testText(0, 3, "d", 29250, 90);
+ testText(0, 4, "e", 27000, 90);
+ testText(0, 5, "f", 24750, 90);
+ testText(0, 6, "g", 22500, 180);
+ testText(0, 7, "h", 20250, 180);
+ testText(0, 8, "i", 18000, 180);
+ testText(0, 9, "j", 15750, 180);
+ testText(0, 10, "k", 13500, 180);
+ testText(0, 11, "l", 11250, 270);
+ testText(0, 12, "m", 9000, 270);
+ testText(0, 13, "n", 6750, 270);
+ testText(0, 14, "o", 4500, 0);
+ testText(0, 15, "p", 2250, 0);
+
+ // Slide 2: autoTxRot == "none"
+ testText(1, 0, "a", 0, 0);
+ testText(1, 1, "b", 33750, 0);
+ testText(1, 2, "c", 31500, 0);
+ testText(1, 3, "d", 29250, 0);
+ testText(1, 4, "e", 27000, 0);
+ testText(1, 5, "f", 24750, 0);
+ testText(1, 6, "g", 22500, 0);
+ testText(1, 7, "h", 20250, 0);
+ testText(1, 8, "i", 18000, 0);
+ testText(1, 9, "j", 15750, 0);
+ testText(1, 10, "k", 13500, 0);
+ testText(1, 11, "l", 11250, 0);
+ testText(1, 12, "m", 9000, 0);
+ testText(1, 13, "n", 6750, 0);
+ testText(1, 14, "o", 4500, 0);
+ testText(1, 15, "p", 2250, 0);
+
+ // Slide 3: autoTxRot == "grav"
+ testText(2, 0, "a", 0, 0);
+ testText(2, 1, "b", 33750, 0);
+ testText(2, 2, "c", 31500, 0);
+ testText(2, 3, "d", 29250, 0);
+ testText(2, 4, "e", 27000, 0);
+ testText(2, 5, "f", 24750, 180);
+ testText(2, 6, "g", 22500, 180);
+ testText(2, 7, "h", 20250, 180);
+ testText(2, 8, "i", 18000, 180);
+ testText(2, 9, "j", 15750, 180);
+ testText(2, 10, "k", 13500, 180);
+ testText(2, 11, "l", 11250, 180);
+ testText(2, 12, "m", 9000, 0);
+ testText(2, 13, "n", 6750, 0);
+ testText(2, 14, "o", 4500, 0);
+ testText(2, 15, "p", 2250, 0);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testBasicProcess()
+{
+ //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet.
+}
+
+void SdImportTestSmartArt::testPyramid()
+{
+ //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet.
+}
+
+void SdImportTestSmartArt::testPyramidOneChild()
+{
+ // Load a document with a pyra algorithm in it.
+ // Without the accompanying fix in place, this test would have crashed.
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/smartart-pyramid-1child.pptx"), PPTX);
+ uno::Reference<drawing::XShape> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ uno::Reference<text::XTextRange> xText(getChildShape(getChildShape(xGroup, 1), 1),
+ uno::UNO_QUERY);
+ // Verify that the text of the only child is imported correctly.
+ CPPUNIT_ASSERT_EQUAL(OUString("A"), xText->getString());
+}
+
+void SdImportTestSmartArt::testChevron()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/smartart-chevron.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xShapeGroup->getCount());
+
+ uno::Reference<text::XText> xText0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("a"), xText0->getString());
+ uno::Reference<text::XText> xText1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("b"), xText1->getString());
+ uno::Reference<text::XText> xText2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("c"), xText2->getString());
+
+ uno::Reference<drawing::XShape> xShape0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW);
+
+ CPPUNIT_ASSERT(xShape0->getPosition().X < xShape1->getPosition().X);
+ CPPUNIT_ASSERT(xShape1->getPosition().X < xShape2->getPosition().X);
+ CPPUNIT_ASSERT_EQUAL(xShape0->getPosition().Y, xShape1->getPosition().Y);
+ CPPUNIT_ASSERT_EQUAL(xShape1->getPosition().Y, xShape2->getPosition().Y);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testCycle()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-cycle.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+
+ // 11 children: background, 5 shapes, 5 connectors
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(11), xGroup->getCount());
+
+ uno::Reference<drawing::XShape> xShape0(xGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShapeConn(xGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape2(xGroup->getByIndex(3), uno::UNO_QUERY_THROW);
+
+ uno::Reference<text::XText> xText0(xShape0, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("a"), xText0->getString());
+ uno::Reference<text::XText> xText2(xShape2, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("b"), xText2->getString());
+
+ // xShapeConn is connector between shapes 0 and 2
+ // it should lay between them and be rotated 0 -> 2
+ CPPUNIT_ASSERT(xShape0->getPosition().X < xShapeConn->getPosition().X);
+ CPPUNIT_ASSERT(xShape0->getPosition().Y < xShapeConn->getPosition().Y);
+ CPPUNIT_ASSERT(xShapeConn->getPosition().Y < xShape2->getPosition().Y);
+ uno::Reference<beans::XPropertySet> xPropSetConn(xShapeConn, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(32400),
+ xPropSetConn->getPropertyValue("RotateAngle").get<sal_Int32>());
+
+ // Make sure that we have an arrow shape between the two shapes
+ comphelper::SequenceAsHashMap aCustomShapeGeometry(
+ xPropSetConn->getPropertyValue("CustomShapeGeometry"));
+ CPPUNIT_ASSERT(aCustomShapeGeometry["Type"].has<OUString>());
+ OUString aType = aCustomShapeGeometry["Type"].get<OUString>();
+ CPPUNIT_ASSERT_EQUAL(OUString("ooxml-rightArrow"), aType);
+}
+
+void SdImportTestSmartArt::testHierarchy()
+{
+ //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet.
+}
+
+void SdImportTestSmartArt::testmatrix()
+{
+ //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet.
+}
+
+void SdImportTestSmartArt::testvenndiagram()
+{
+ //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet.
+}
+
+void SdImportTestSmartArt::testInvertedPyramid()
+{
+ //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet.
+}
+
+void SdImportTestSmartArt::testMultidirectional()
+{
+ // similar document as cycle, but arrows are pointing in both directions
+
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-multidirectional.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+
+ // 7 children: background, 3 shapes, 3 connectors
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(7), xGroup->getCount());
+
+ uno::Reference<drawing::XShape> xShapeConn(xGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropSetConn(xShapeConn, uno::UNO_QUERY_THROW);
+ comphelper::SequenceAsHashMap aCustomShapeGeometry(
+ xPropSetConn->getPropertyValue("CustomShapeGeometry"));
+ CPPUNIT_ASSERT(aCustomShapeGeometry["Type"].has<OUString>());
+ OUString aType = aCustomShapeGeometry["Type"].get<OUString>();
+ CPPUNIT_ASSERT_EQUAL(OUString("ooxml-leftRightArrow"), aType);
+}
+
+void SdImportTestSmartArt::testHorizontalBulletList()
+{
+ //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet.
+}
+
+void SdImportTestSmartArt::testEquation()
+{
+ //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet.
+}
+
+void SdImportTestSmartArt::testBasicRadicals()
+{
+ //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet.
+}
+
+void SdImportTestSmartArt::testSegmentedCycle()
+{
+ //FIXME : so far this only introduce the test document, but the actual importer was not fixed yet.
+}
+
+void SdImportTestSmartArt::testBaseRtoL()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/smartart-rightoleftblockdiagram.pptx"),
+ PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xShapeGroup->getCount());
+
+ uno::Reference<text::XText> xText0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("a"), xText0->getString());
+ uno::Reference<text::XText> xText1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("b"), xText1->getString());
+ uno::Reference<text::XText> xText2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("c"), xText2->getString());
+ uno::Reference<text::XText> xText3(xShapeGroup->getByIndex(4), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("d"), xText3->getString());
+ uno::Reference<text::XText> xText4(xShapeGroup->getByIndex(5), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("e"), xText4->getString());
+
+ uno::Reference<beans::XPropertySet> xShape(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+
+ Color nFillColor;
+ xShape->getPropertyValue("FillColor") >>= nFillColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x4F81BD), nFillColor);
+
+ sal_Int16 nParaAdjust = 0;
+ uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xShape));
+ uno::Reference<beans::XPropertySet> xPropSet(xParagraph, uno::UNO_QUERY_THROW);
+ xPropSet->getPropertyValue("ParaAdjust") >>= nParaAdjust;
+ CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_CENTER,
+ static_cast<style::ParagraphAdjust>(nParaAdjust));
+
+ uno::Reference<drawing::XShape> xShape0(xShapeGroup->getByIndex(1), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape1(xShapeGroup->getByIndex(2), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape2(xShapeGroup->getByIndex(3), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape3(xShapeGroup->getByIndex(4), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape4(xShapeGroup->getByIndex(5), uno::UNO_QUERY_THROW);
+
+ /*
+ * Arrangement
+ * (RTL)
+ * ╭─────────╮
+ * │ 1 0 │
+ * │ 3 2 │
+ * │ 4 │
+ * ╰─────────╯
+ */
+ CPPUNIT_ASSERT_EQUAL(xShape0->getPosition().Y, xShape1->getPosition().Y);
+ CPPUNIT_ASSERT_EQUAL(xShape2->getPosition().Y, xShape3->getPosition().Y);
+
+ CPPUNIT_ASSERT_EQUAL(xShape0->getPosition().X, xShape2->getPosition().X);
+ CPPUNIT_ASSERT_EQUAL(xShape1->getPosition().X, xShape3->getPosition().X);
+
+ CPPUNIT_ASSERT_EQUAL(xShape2->getPosition().Y - xShape0->getPosition().Y,
+ xShape4->getPosition().Y - xShape2->getPosition().Y);
+ CPPUNIT_ASSERT_EQUAL(xShape1->getPosition().X - xShape0->getPosition().X,
+ xShape3->getPosition().X - xShape2->getPosition().X);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(xShape2->getPosition().X + xShape3->getPosition().X,
+ 2 * xShape4->getPosition().X, 1);
+
+ CPPUNIT_ASSERT(xShape2->getPosition().Y > xShape0->getPosition().Y);
+ CPPUNIT_ASSERT(xShape4->getPosition().Y > xShape2->getPosition().Y);
+ CPPUNIT_ASSERT(xShape0->getPosition().X > xShape1->getPosition().X);
+ CPPUNIT_ASSERT(xShape2->getPosition().X > xShape3->getPosition().X);
+ CPPUNIT_ASSERT((xShape2->getPosition().X > xShape4->getPosition().X));
+ CPPUNIT_ASSERT((xShape3->getPosition().X < xShape4->getPosition().X));
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testVerticalBoxList()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-vertical-box-list.pptx"),
+ PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ // Without the accompanying fix in place, this test would have failed with
+ // 'actual: 0'.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), xShapeGroup->getCount());
+
+ uno::Reference<drawing::XShapes> xFirstChild(xShapeGroup->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFirstChild.is());
+ uno::Reference<drawing::XShape> xParentText(xFirstChild->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xParentText.is());
+ // Without the accompanying fix in place, this test would have failed with
+ // 'actual: 7361', i.e. the width was not the 70% of the parent as the
+ // constraint wanted.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(11852), xParentText->getSize().Width);
+
+ uno::Reference<drawing::XShape> xChildText(xShapeGroup->getByIndex(2), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xChildText.is());
+ // Without the accompanying fix in place, this test would have failed with
+ // 'actual: 7361' (and with the fix: 'actual: 16932', i.e. the width of the
+ // parent).
+ CPPUNIT_ASSERT_GREATER(static_cast<sal_Int32>(10000), xChildText->getSize().Width);
+
+ // Assert that the right edge of the parent text is closer to the slide
+ // boundary than the right edge of the parent text.
+ // Without the accompanying fix in place, this test would have failed with
+ // 'Expected greater than: 25656, Actual : 21165'.
+ CPPUNIT_ASSERT_GREATER(xParentText->getPosition().X + xParentText->getSize().Width,
+ xChildText->getPosition().X + xChildText->getSize().Width);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testVerticalBracketList()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/vertical-bracket-list.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), xShapeGroup->getCount());
+
+ uno::Reference<drawing::XShapes> xFirstChild(xShapeGroup->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFirstChild.is());
+ // Without the accompanying fix in place, this test would have failed with
+ // 'actual: 2', i.e. one child shape (with its "A" text) was missing.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), xFirstChild->getCount());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testTableList()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/table-list.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xShapeGroup.is());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), xShapeGroup->getCount());
+
+ uno::Reference<text::XText> xParentText(xShapeGroup->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xParentText.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("Parent"), xParentText->getString());
+ uno::Reference<drawing::XShape> xParent(xParentText, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xParent.is());
+ int nParentRight = xParent->getPosition().X + xParent->getSize().Width;
+
+ uno::Reference<drawing::XShapes> xChildren(xShapeGroup->getByIndex(2), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xChildren.is());
+ uno::Reference<text::XText> xChild2Text(xChildren->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xChild2Text.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("Child 2"), xChild2Text->getString());
+ uno::Reference<drawing::XShape> xChild2(xChild2Text, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xChild2.is());
+ int nChild2Right = xChild2->getPosition().X + xChild2->getSize().Width;
+
+ // Without the accompanying fix in place, this test would have failed with
+ // 'Expected less than: 100, Actual : 22014', i.e. the second child was
+ // shifted to the right too much.
+ CPPUNIT_ASSERT_LESS(100, abs(nChild2Right - nParentRight));
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testAccentProcess()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-accent-process.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+ // 3 children: first pair, connector, second pair.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), xGroup->getCount());
+ uno::Reference<drawing::XShape> xGroupShape(xGroup, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroupShape.is());
+
+ // The pair is a parent (shape + text) and a child, so 3 shapes in total.
+ // The order is important, first is at the back, last is at the front.
+ uno::Reference<drawing::XShapes> xFirstPair(xGroup->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFirstPair.is());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), xFirstPair->getCount());
+
+ uno::Reference<text::XText> xFirstParentText(xFirstPair->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFirstParentText.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("a"), xFirstParentText->getString());
+ uno::Reference<drawing::XShape> xFirstParent(xFirstParentText, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFirstParent.is());
+ int nFirstParentTop = xFirstParent->getPosition().Y;
+
+ uno::Reference<text::XText> xFirstChildText(xFirstPair->getByIndex(2), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFirstChildText.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("b"), xFirstChildText->getString());
+ uno::Reference<drawing::XShape> xFirstChild(xFirstChildText, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFirstChildText.is());
+
+ {
+ uno::Reference<container::XEnumerationAccess> xParasAccess(xFirstChildText, uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> xParas = xParasAccess->createEnumeration();
+ uno::Reference<beans::XPropertySet> xPara(xParas->nextElement(), uno::UNO_QUERY);
+ // Without the accompanying fix in place, this test would have failed
+ // with 'Expected: 0; Actual : 1270', i.e. there was a large
+ // unexpected left margin.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0),
+ xPara->getPropertyValue("ParaLeftMargin").get<sal_Int32>());
+
+ uno::Reference<container::XIndexAccess> xRules(xPara->getPropertyValue("NumberingRules"),
+ uno::UNO_QUERY);
+ comphelper::SequenceAsHashMap aRule(xRules->getByIndex(0));
+ CPPUNIT_ASSERT_EQUAL(OUString(u"•"), aRule["BulletChar"].get<OUString>());
+ }
+
+ int nFirstChildTop = xFirstChild->getPosition().Y;
+ int nFirstChildRight = xFirstChild->getPosition().X + xFirstChild->getSize().Width;
+
+ // First child is below the first parent.
+ // Without the accompanying fix in place, this test would have failed with
+ // 'Expected less than: 3881, Actual : 3881', i.e. xFirstChild was not
+ // below xFirstParent (a good position is 9081).
+ CPPUNIT_ASSERT_LESS(nFirstChildTop, nFirstParentTop);
+
+ // Make sure that we have an arrow shape between the two pairs.
+ uno::Reference<beans::XPropertySet> xArrow(xGroup->getByIndex(2), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xArrow.is());
+ comphelper::SequenceAsHashMap aCustomShapeGeometry(
+ xArrow->getPropertyValue("CustomShapeGeometry"));
+ // Without the accompanying fix in place, this test would have failed, i.e.
+ // the custom shape lacked a type -> arrow was not visible.
+ CPPUNIT_ASSERT(aCustomShapeGeometry["Type"].has<OUString>());
+ OUString aType = aCustomShapeGeometry["Type"].get<OUString>();
+ CPPUNIT_ASSERT_EQUAL(OUString("ooxml-rightArrow"), aType);
+
+ // Make sure that height of the arrow is less than its width.
+ uno::Reference<drawing::XShape> xArrowShape(xArrow, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xArrowShape.is());
+ awt::Size aArrowSize = xArrowShape->getSize();
+ CPPUNIT_ASSERT_LESS(aArrowSize.Width, aArrowSize.Height);
+
+ uno::Reference<drawing::XShapes> xSecondPair(xGroup->getByIndex(3), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xSecondPair.is());
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), xSecondPair->getCount());
+ uno::Reference<text::XText> xSecondParentText(xSecondPair->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFirstParentText.is());
+ // Without the accompanying fix in place, this test would have failed with
+ // 'Expected: cc; Actual : c', i.e. non-first runs on data points were ignored.
+ CPPUNIT_ASSERT_EQUAL(OUString("cc"), xSecondParentText->getString());
+ uno::Reference<drawing::XShape> xSecondParent(xSecondParentText, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xSecondParent.is());
+ int nSecondParentLeft = xSecondParent->getPosition().X;
+ // Without the accompanying fix in place, this test would have failed with
+ // 'Expected less than: 12700; Actual : 18540', i.e. the "b" and "c"
+ // shapes overlapped.
+ CPPUNIT_ASSERT_LESS(nSecondParentLeft, nFirstChildRight);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testContinuousBlockProcess()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(
+ u"/sd/qa/unit/data/pptx/smartart-continuous-block-process.pptx"),
+ PPTX);
+ uno::Reference<drawing::XShapes> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+ // 3 children: diagram background, background arrow, foreground.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), xGroup->getCount());
+
+ uno::Reference<drawing::XShapes> xLinear(xGroup->getByIndex(2), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xLinear.is());
+ // 3 children: A, B and C.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), xLinear->getCount());
+
+ uno::Reference<text::XText> xA(xLinear->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xA.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("A"), xA->getString());
+ uno::Reference<drawing::XShape> xAShape(xA, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xAShape.is());
+ // Without the accompanying fix in place, this test would have failed: the
+ // theoretically correct value is 5462 mm100 (16933 is the total width, and
+ // need to divide that to 1, 0.5, 1, 0.5 and 1 units), while the old value
+ // was 4703 and the new one is 5461.
+ CPPUNIT_ASSERT_GREATER(static_cast<sal_Int32>(5000), xAShape->getSize().Width);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testOrgChart()
+{
+ // Simple org chart with 1 manager and 1 employee only.
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-org-chart.pptx"), PPTX);
+ uno::Reference<drawing::XShape> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+
+ uno::Reference<text::XText> xManager(
+ getChildShape(getChildShape(getChildShape(xGroup, 1), 0), 0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xManager.is());
+ // Without the accompanying fix in place, this test would have failed: this
+ // was just "Manager", and the second paragraph was lost.
+ CPPUNIT_ASSERT_EQUAL(OUString("Manager\nSecond para"), xManager->getString());
+
+ uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xManager, uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
+ uno::Reference<text::XTextRange> xPara(xParaEnum->nextElement(), uno::UNO_QUERY);
+ uno::Reference<container::XEnumerationAccess> xRunEnumAccess(xPara, uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> xRunEnum = xRunEnumAccess->createEnumeration();
+ uno::Reference<beans::XPropertySet> xRun(xRunEnum->nextElement(), uno::UNO_QUERY);
+ Color nActualColor;
+ xRun->getPropertyValue("CharColor") >>= nActualColor;
+ // Without the accompanying fix in place, this test would have failed: the
+ // "Manager" font color was black, not white.
+ CPPUNIT_ASSERT_EQUAL(COL_WHITE, nActualColor);
+
+ uno::Reference<drawing::XShape> xManagerShape(xManager, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xManagerShape.is());
+
+ awt::Point aManagerPos = xManagerShape->getPosition();
+ awt::Size aManagerSize = xManagerShape->getSize();
+
+ // Make sure that the manager has 2 employees.
+ uno::Reference<drawing::XShapes> xEmployees(getChildShape(getChildShape(xGroup, 1), 2),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xEmployees.is());
+ // 4 children: connector, 1st employee, connector, 2nd employee.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), xEmployees->getCount());
+
+ uno::Reference<text::XText> xEmployee(
+ getChildShape(
+ getChildShape(getChildShape(getChildShape(getChildShape(xGroup, 1), 2), 1), 0), 0),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xEmployee.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("Employee"), xEmployee->getString());
+
+ uno::Reference<drawing::XShape> xEmployeeShape(xEmployee, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xEmployeeShape.is());
+
+ awt::Point aEmployeePos = xEmployeeShape->getPosition();
+ awt::Size aEmployeeSize = xEmployeeShape->getSize();
+
+ CPPUNIT_ASSERT_EQUAL(aManagerPos.X, aEmployeePos.X);
+
+ // Without the accompanying fix in place, this test would have failed: the
+ // two shapes were overlapping, i.e. "manager" was not above "employee".
+ CPPUNIT_ASSERT_GREATER(aManagerPos.Y, aEmployeePos.Y);
+
+ // Make sure that the second employee is on the right of the first one.
+ // Without the accompanying fix in place, this test would have failed, as
+ // the second employee was below the first one.
+ uno::Reference<text::XText> xEmployee2(
+ getChildShape(
+ getChildShape(getChildShape(getChildShape(getChildShape(xGroup, 1), 2), 3), 0), 0),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xEmployee2.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("Employee2"), xEmployee2->getString());
+
+ uno::Reference<drawing::XShape> xEmployee2Shape(xEmployee2, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xEmployee2Shape.is());
+
+ awt::Point aEmployee2Pos = xEmployee2Shape->getPosition();
+ //awt::Size aEmployee2Size = xEmployee2Shape->getSize();
+ CPPUNIT_ASSERT_GREATER(aEmployeePos.X, aEmployee2Pos.X);
+
+ // Make sure that assistant is above employees.
+ uno::Reference<text::XText> xAssistant(
+ getChildShape(
+ getChildShape(getChildShape(getChildShape(getChildShape(xGroup, 1), 1), 1), 0), 0),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("Assistant"), xAssistant->getString());
+
+ uno::Reference<drawing::XShape> xAssistantShape(xAssistant, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xAssistantShape.is());
+
+ awt::Point aAssistantPos = xAssistantShape->getPosition();
+ // Without the accompanying fix in place, this test would have failed: the
+ // assistant shape was below the employee shape.
+ CPPUNIT_ASSERT_GREATER(aAssistantPos.Y, aEmployeePos.Y);
+
+ // Make sure the connector of the assistant is above the shape.
+ uno::Reference<drawing::XShape> xAssistantConnector
+ = getChildShape(getChildShape(getChildShape(xGroup, 1), 1), 0);
+ CPPUNIT_ASSERT(xAssistantConnector.is());
+ //awt::Point aAssistantConnectorPos = xAssistantConnector->getPosition();
+ // This failed, the vertical positions of the connector and the shape of
+ // the assistant were the same.
+ //CPPUNIT_ASSERT_LESS(aAssistantPos.Y, aAssistantConnectorPos.Y);
+ // connectors are hidden as they don't work correctly
+
+ // Make sure the height of xManager and xManager2 is the same.
+ uno::Reference<text::XText> xManager2(
+ getChildShape(getChildShape(getChildShape(xGroup, 2), 0), 0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xManager2.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("Manager2"), xManager2->getString());
+
+ uno::Reference<drawing::XShape> xManager2Shape(xManager2, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xManager2Shape.is());
+
+ awt::Size aManager2Size = xManager2Shape->getSize();
+ // Without the accompanying fix in place, this test would have failed:
+ // xManager2's height was 3 times larger than xManager's height.
+ CPPUNIT_ASSERT_EQUAL(aManagerSize.Height, aManager2Size.Height);
+
+ // Make sure the employee nodes use the free space on the right, since
+ // manager2 has no assistants / employees.
+ //CPPUNIT_ASSERT_GREATER(aManagerSize.Width, aEmployeeSize.Width + aEmployee2Size.Width);
+ // currently disabled as causes problems in complex charts
+
+ // Without the accompanying fix in place, this test would have failed: an
+ // employee was exactly the third of the total height, without any spacing.
+ CPPUNIT_ASSERT_LESS(xGroup->getSize().Height / 3, aEmployeeSize.Height);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testCycleMatrix()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-cycle-matrix.pptx"), PPTX);
+ uno::Reference<drawing::XShape> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+
+ // Without the accompanying fix in place, this test would have failed: the height was 12162,
+ // which is not the mm100 equivalent of the 4064000 EMU in the input file.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(11288), xGroup->getSize().Height);
+
+ uno::Reference<text::XText> xA1(getChildShape(getChildShape(xGroup, 2), 0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xA1.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("A1"), xA1->getString());
+
+ // Test fill color of B1, should be orange.
+ uno::Reference<text::XText> xB1(getChildShape(getChildShape(xGroup, 2), 1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xB1.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("B1"), xB1->getString());
+
+ uno::Reference<beans::XPropertySet> xB1Props(xB1, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xB1Props.is());
+ Color nFillColor;
+ xB1Props->getPropertyValue("FillColor") >>= nFillColor;
+ // Without the accompanying fix in place, this test would have failed: the background color was
+ // 0x4f81bd, i.e. blue, not orange.
+ CPPUNIT_ASSERT_EQUAL(Color(0xf79646), nFillColor);
+
+ // Without the accompanying fix in place, this test would have failed: the
+ // content of the "A2" shape was lost.
+ uno::Reference<text::XText> xA2(getChildShape(getChildShape(getChildShape(xGroup, 1), 0), 1),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xA2.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("A2"), xA2->getString());
+
+ // Test that the layout of shapes is like this:
+ // A2 B2
+ // D2 C2
+
+ uno::Reference<drawing::XShape> xA2Shape(xA2, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xA2Shape.is());
+
+ uno::Reference<text::XText> xB2(getChildShape(getChildShape(getChildShape(xGroup, 1), 1), 1),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xB2.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("B2"), xB2->getString());
+ uno::Reference<drawing::XShape> xB2Shape(xB2, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xB2Shape.is());
+
+ // Test line color of B2, should be orange.
+ uno::Reference<beans::XPropertySet> xB2Props(xB2, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xB2Props.is());
+ Color nLineColor = 0;
+ xB2Props->getPropertyValue("LineColor") >>= nLineColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xf79646), nLineColor);
+
+ uno::Reference<text::XText> xC2(getChildShape(getChildShape(getChildShape(xGroup, 1), 2), 1),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xC2.is());
+ // Without the accompanying fix in place, this test would have failed, i.e. the order of the
+ // lines in the shape were wrong: C2-1\nC2-4\nC2-3\nC2-2.
+ CPPUNIT_ASSERT_EQUAL(OUString("C2-1\nC2-2\nC2-3\nC2-4"), xC2->getString());
+ uno::Reference<drawing::XShape> xC2Shape(xC2, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xC2Shape.is());
+
+ uno::Reference<text::XText> xD2(getChildShape(getChildShape(getChildShape(xGroup, 1), 3), 1),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xD2.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("D2"), xD2->getString());
+ uno::Reference<drawing::XShape> xD2Shape(xD2, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xD2Shape.is());
+
+ // Without the accompanying fix in place, this test would have failed, i.e.
+ // the A2 and B2 shapes had the same horizontal position, while B2 should
+ // be on the right of A2.
+ CPPUNIT_ASSERT_GREATER(xA2Shape->getPosition().X, xB2Shape->getPosition().X);
+ CPPUNIT_ASSERT_EQUAL(xA2Shape->getPosition().Y, xB2Shape->getPosition().Y);
+ CPPUNIT_ASSERT_GREATER(xA2Shape->getPosition().X, xC2Shape->getPosition().X);
+ CPPUNIT_ASSERT_GREATER(xA2Shape->getPosition().Y, xC2Shape->getPosition().Y);
+ CPPUNIT_ASSERT_EQUAL(xA2Shape->getPosition().X, xD2Shape->getPosition().X);
+ CPPUNIT_ASSERT_GREATER(xA2Shape->getPosition().Y, xD2Shape->getPosition().Y);
+
+ // Without the accompanying fix in place, this test would have failed: width was expected to be
+ // 4887, was actually 7331.
+ uno::Reference<drawing::XShape> xA1Shape(xA1, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xA1Shape.is());
+ CPPUNIT_ASSERT_EQUAL(xA1Shape->getSize().Height, xA1Shape->getSize().Width);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testPictureStrip()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-picture-strip.pptx"), PPTX);
+ uno::Reference<drawing::XShape> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+
+ uno::Reference<beans::XPropertySet> xFirstImage(getChildShape(getChildShape(xGroup, 1), 1),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFirstImage.is());
+ drawing::FillStyle eFillStyle = drawing::FillStyle_NONE;
+ xFirstImage->getPropertyValue("FillStyle") >>= eFillStyle;
+ // Without the accompanying fix in place, this test would have failed: fill style was solid, not
+ // bitmap.
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, eFillStyle);
+
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xFirstImage->getPropertyValue("FillBitmap") >>= xGraphic;
+ Graphic aFirstGraphic(xGraphic);
+
+ uno::Reference<beans::XPropertySet> xSecondImage(getChildShape(getChildShape(xGroup, 2), 1),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xSecondImage.is());
+ eFillStyle = drawing::FillStyle_NONE;
+ xSecondImage->getPropertyValue("FillStyle") >>= eFillStyle;
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, eFillStyle);
+
+ xSecondImage->getPropertyValue("FillBitmap") >>= xGraphic;
+ Graphic aSecondGraphic(xGraphic);
+ // Without the accompanying fix in place, this test would have failed: both xFirstImage and
+ // xSecondImage had the bitmap fill from the second shape.
+ CPPUNIT_ASSERT(aFirstGraphic.GetChecksum() != aSecondGraphic.GetChecksum());
+
+ // Test that the 3 images are in a single column, in 3 rows.
+ uno::Reference<drawing::XShape> xFirstImageShape(xFirstImage, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFirstImage.is());
+ uno::Reference<drawing::XShape> xSecondImageShape(xSecondImage, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xSecondImage.is());
+ uno::Reference<drawing::XShape> xThirdImageShape = getChildShape(getChildShape(xGroup, 3), 1);
+ CPPUNIT_ASSERT(xThirdImageShape.is());
+ // Without the accompanying fix in place, this test would have failed: the first and the second
+ // image were in the same row.
+ CPPUNIT_ASSERT_EQUAL(xFirstImageShape->getPosition().X, xSecondImageShape->getPosition().X);
+ CPPUNIT_ASSERT_EQUAL(xSecondImageShape->getPosition().X, xThirdImageShape->getPosition().X);
+ CPPUNIT_ASSERT_GREATER(xFirstImageShape->getPosition().Y, xSecondImageShape->getPosition().Y);
+ CPPUNIT_ASSERT_GREATER(xSecondImageShape->getPosition().Y, xThirdImageShape->getPosition().Y);
+
+ // Make sure that the title shape doesn't overlap with the diagram.
+ // Note that real "no overlap" is asserted here, though in fact what we want is a less strict
+ // condition: that no text part of the title shape and the diagram overlaps.
+ uno::Reference<drawing::XShape> xTitle(getShapeFromPage(1, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xTitle.is());
+ // Without the accompanying fix in place, this test would have failed with 'Expected greater
+ // than: 2873; Actual : 2320', i.e. the title shape and the diagram overlapped.
+ uno::Reference<drawing::XShape> xFirstPair = getChildShape(xGroup, 1);
+ CPPUNIT_ASSERT_GREATER(xTitle->getPosition().Y + xTitle->getSize().Height,
+ xFirstPair->getPosition().Y);
+
+ // Make sure that left margin is 60% of width (if you count width in points and margin in mms).
+ uno::Reference<beans::XPropertySet> xFirstText(getChildShape(getChildShape(xGroup, 1), 0),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFirstText.is());
+ sal_Int32 nTextLeftDistance = 0;
+ xFirstText->getPropertyValue("TextLeftDistance") >>= nTextLeftDistance;
+ uno::Reference<drawing::XShape> xFirstTextShape(xFirstText, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFirstTextShape.is());
+ sal_Int32 nWidth = xFirstTextShape->getSize().Width;
+ double fFactor = oox::drawingml::convertPointToMms(0.6);
+ // Without the accompanying fix in place, this test would have failed with 'Expected: 3440,
+ // Actual : 263', i.e. the left margin was too small.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(nWidth * fFactor), nTextLeftDistance);
+
+ // Make sure that aspect ratio is not ignored, i.e. width is not larger than height 3 times.
+ awt::Size aFirstPairSize = xFirstPair->getSize();
+ // Without the accompanying fix in place, this test would have failed: bad width was 16932, good
+ // width is 12540, but let's accept 12541 as well.
+ CPPUNIT_ASSERT_LESSEQUAL(aFirstPairSize.Height * 3 + 1, aFirstPairSize.Width);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testInteropGrabBag()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-interopgrabbag.pptx"), PPTX);
+ uno::Reference<drawing::XShape> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+
+ uno::Reference<beans::XPropertySet> xPropertySet(xGroup, uno::UNO_QUERY_THROW);
+ uno::Sequence<beans::PropertyValue> aGrabBagSeq;
+ xPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBagSeq;
+ comphelper::SequenceAsHashMap aGrabBag(aGrabBagSeq);
+ CPPUNIT_ASSERT(aGrabBag.find("OOXData") != aGrabBag.end());
+ CPPUNIT_ASSERT(aGrabBag.find("OOXLayout") != aGrabBag.end());
+ CPPUNIT_ASSERT(aGrabBag.find("OOXStyle") != aGrabBag.end());
+ CPPUNIT_ASSERT(aGrabBag.find("OOXColor") != aGrabBag.end());
+ CPPUNIT_ASSERT(aGrabBag.find("OOXDrawing") != aGrabBag.end());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testBackground()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-background.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+
+ // background should fill whole diagram
+ uno::Reference<drawing::XShape> xShapeGroup(xGroup, uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShape(xGroup->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(xShape->getPosition().X, xShapeGroup->getPosition().X);
+ CPPUNIT_ASSERT_EQUAL(xShape->getPosition().Y, xShapeGroup->getPosition().Y);
+ CPPUNIT_ASSERT_EQUAL(xShape->getSize().Width, xShapeGroup->getSize().Width);
+ CPPUNIT_ASSERT_EQUAL(xShape->getSize().Height, xShapeGroup->getSize().Height);
+
+ uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY_THROW);
+ drawing::FillStyle eFillStyle = drawing::FillStyle_NONE;
+ xPropertySet->getPropertyValue("FillStyle") >>= eFillStyle;
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, eFillStyle);
+
+ Color nFillColor;
+ xPropertySet->getPropertyValue("FillColor") >>= nFillColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x339933), nFillColor);
+
+ bool bMoveProtect = false;
+ xPropertySet->getPropertyValue("MoveProtect") >>= bMoveProtect;
+ CPPUNIT_ASSERT_EQUAL(true, bMoveProtect);
+
+ bool bSizeProtect = false;
+ xPropertySet->getPropertyValue("SizeProtect") >>= bSizeProtect;
+ CPPUNIT_ASSERT_EQUAL(true, bSizeProtect);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testBackgroundDrawingmlFallback()
+{
+ // same as testBackground, but test file contains drawingML fallback
+
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(
+ u"/sd/qa/unit/data/pptx/smartart-background-drawingml-fallback.pptx"),
+ PPTX);
+ uno::Reference<drawing::XShapes> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+
+ // background should fill whole diagram
+ uno::Reference<drawing::XShape> xShapeGroup(xGroup, uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShape(xGroup->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(xShape->getPosition().X, xShapeGroup->getPosition().X);
+ CPPUNIT_ASSERT_EQUAL(xShape->getPosition().Y, xShapeGroup->getPosition().Y);
+ CPPUNIT_ASSERT_EQUAL(xShape->getSize().Width, xShapeGroup->getSize().Width);
+ CPPUNIT_ASSERT_EQUAL(xShape->getSize().Height, xShapeGroup->getSize().Height);
+
+ uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY_THROW);
+ drawing::FillStyle eFillStyle = drawing::FillStyle_NONE;
+ xPropertySet->getPropertyValue("FillStyle") >>= eFillStyle;
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, eFillStyle);
+
+ Color nFillColor;
+ xPropertySet->getPropertyValue("FillColor") >>= nFillColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x339933), nFillColor);
+
+ bool bMoveProtect = false;
+ xPropertySet->getPropertyValue("MoveProtect") >>= bMoveProtect;
+ CPPUNIT_ASSERT_EQUAL(true, bMoveProtect);
+
+ bool bSizeProtect = false;
+ xPropertySet->getPropertyValue("SizeProtect") >>= bSizeProtect;
+ CPPUNIT_ASSERT_EQUAL(true, bSizeProtect);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testCenterCycle()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-center-cycle.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+
+ uno::Reference<drawing::XShapes> xGroupNested(xGroup->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroupNested.is());
+
+ uno::Reference<drawing::XShape> xShapeCenter(xGroupNested->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShapeA(xGroupNested->getByIndex(1), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShapeB(xGroupNested->getByIndex(2), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShapeC(xGroupNested->getByIndex(3), uno::UNO_QUERY);
+
+ uno::Reference<text::XText> xTextCenter(xShapeCenter, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xTextCenter.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("center"), xTextCenter->getString());
+
+ CPPUNIT_ASSERT_LESS(xShapeCenter->getPosition().Y, xShapeA->getPosition().Y);
+ CPPUNIT_ASSERT_GREATER(xShapeCenter->getPosition().X, xShapeB->getPosition().X);
+ CPPUNIT_ASSERT_GREATER(xShapeCenter->getPosition().Y, xShapeB->getPosition().Y);
+ CPPUNIT_ASSERT_LESS(xShapeCenter->getPosition().X, xShapeC->getPosition().X);
+ CPPUNIT_ASSERT_GREATER(xShapeCenter->getPosition().Y, xShapeC->getPosition().Y);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testFontSize()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-font-size.pptx"), PPTX);
+
+ uno::Reference<drawing::XShapes> xGroup1(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xShape1(xGroup1->getByIndex(1), uno::UNO_QUERY);
+ uno::Reference<text::XTextRange> xParagraph1(getParagraphFromShape(0, xShape1));
+ uno::Reference<text::XTextRange> xRun1(getRunFromParagraph(0, xParagraph1));
+ uno::Reference<beans::XPropertySet> xPropSet1(xRun1, uno::UNO_QUERY);
+ double fFontSize1 = xPropSet1->getPropertyValue("CharHeight").get<double>();
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(65.0, fFontSize1, 0.01);
+
+ uno::Reference<drawing::XShapes> xGroup2(getShapeFromPage(1, 0, xDocShRef), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xShape2(xGroup2->getByIndex(1), uno::UNO_QUERY);
+ uno::Reference<text::XTextRange> xParagraph2(getParagraphFromShape(0, xShape2));
+ uno::Reference<text::XTextRange> xRun2(getRunFromParagraph(0, xParagraph2));
+ uno::Reference<beans::XPropertySet> xPropSet2(xRun2, uno::UNO_QUERY);
+ double fFontSize2 = xPropSet2->getPropertyValue("CharHeight").get<double>();
+ CPPUNIT_ASSERT_EQUAL(32.0, fFontSize2);
+
+ uno::Reference<drawing::XShapes> xGroup3(getShapeFromPage(2, 0, xDocShRef), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xShape3(xGroup3->getByIndex(1), uno::UNO_QUERY);
+ drawing::TextFitToSizeType eTextFitToSize = drawing::TextFitToSizeType_NONE;
+ xShape3->getPropertyValue("TextFitToSize") >>= eTextFitToSize;
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_AUTOFIT, eTextFitToSize);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testVerticalBlockList()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-vertical-block-list.pptx"),
+ PPTX);
+ uno::Reference<drawing::XShapes> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+
+ uno::Reference<drawing::XShapes> xGroup1(xGroup->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), xGroup1->getCount());
+ uno::Reference<drawing::XShape> xShapeA(xGroup1->getByIndex(1), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShapeBC(xGroup1->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<text::XText> xTextA(xShapeA, uno::UNO_QUERY);
+ uno::Reference<text::XText> xTextBC(xShapeBC, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("a"), xTextA->getString());
+ CPPUNIT_ASSERT_EQUAL(OUString("b\nc"), xTextBC->getString());
+
+ uno::Reference<beans::XPropertySet> xPropSetBC(xShapeBC, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(27000),
+ xPropSetBC->getPropertyValue("RotateAngle").get<sal_Int32>());
+
+ // BC shape is rotated 90*, so width and height is swapped
+ CPPUNIT_ASSERT_GREATER(xShapeA->getSize().Width, xShapeBC->getSize().Height);
+ CPPUNIT_ASSERT_LESS(xShapeA->getSize().Height, xShapeBC->getSize().Width);
+ CPPUNIT_ASSERT_GREATER(xShapeA->getPosition().X, xShapeBC->getPosition().X);
+ CPPUNIT_ASSERT_GREATER(xShapeA->getPosition().Y, xShapeBC->getPosition().Y);
+
+ uno::Reference<drawing::XShapes> xGroup3(xGroup->getByIndex(3), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), xGroup3->getCount());
+ uno::Reference<drawing::XShape> xShapeEmpty(xGroup3->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<text::XText> xTextEmpty(xShapeEmpty, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("empty"), xTextEmpty->getString());
+
+ CPPUNIT_ASSERT_EQUAL(xShapeA->getSize().Width, xShapeEmpty->getSize().Width);
+ CPPUNIT_ASSERT_EQUAL(xShapeA->getSize().Height, xShapeEmpty->getSize().Height);
+ CPPUNIT_ASSERT_EQUAL(xShapeA->getPosition().X, xShapeEmpty->getPosition().X);
+ CPPUNIT_ASSERT_GREATER(xShapeA->getPosition().Y + 2 * xShapeA->getSize().Height,
+ xShapeEmpty->getPosition().Y);
+
+ uno::Reference<drawing::XShape> xGroupShape(xGroup, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(xGroupShape->getPosition().Y + xGroupShape->getSize().Height,
+ xShapeEmpty->getPosition().Y + xShapeEmpty->getSize().Height);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testMissingBulletAndIndent()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-missing-bullet.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ uno::Reference<drawing::XShapes> xGroup1(xGroup->getByIndex(2), uno::UNO_QUERY);
+ uno::Reference<drawing::XShapes> xGroup2(xGroup1->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<text::XText> xText(xGroup2->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xText.is());
+
+ uno::Reference<container::XEnumerationAccess> xParasAccess(xText, uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> xParas = xParasAccess->createEnumeration();
+ xParas->nextElement(); // skip parent
+
+ uno::Reference<beans::XPropertySet> xPara1(xParas->nextElement(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPara1.is());
+
+ sal_Int16 nNumberingLevel = -1;
+ xPara1->getPropertyValue("NumberingLevel") >>= nNumberingLevel;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nNumberingLevel);
+
+ uno::Reference<container::XIndexAccess> xNumRule;
+ xPara1->getPropertyValue("NumberingRules") >>= xNumRule;
+ uno::Sequence<beans::PropertyValue> aBulletProps;
+ xNumRule->getByIndex(1) >>= aBulletProps;
+
+ for (beans::PropertyValue const& rProp : std::as_const(aBulletProps))
+ {
+ if (rProp.Name == "LeftMargin")
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(309), rProp.Value.get<sal_Int32>());
+ }
+}
+
+void SdImportTestSmartArt::testBulletList()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-bullet-list.pptx"), PPTX);
+ uno::Reference<drawing::XShapes> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xGroup.is());
+
+ uno::Reference<text::XText> xText(xGroup->getByIndex(1), uno::UNO_QUERY);
+ uno::Reference<container::XEnumerationAccess> xParasAccess(xText, uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> xParas = xParasAccess->createEnumeration();
+ xParas->nextElement(); // skip parent
+
+ // child levels should have bullets
+ uno::Reference<beans::XPropertySet> xPara1(xParas->nextElement(), uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xRules1(xPara1->getPropertyValue("NumberingRules"),
+ uno::UNO_QUERY);
+ comphelper::SequenceAsHashMap aRule1(xRules1->getByIndex(1));
+ CPPUNIT_ASSERT_EQUAL(OUString(u"•"), aRule1["BulletChar"].get<OUString>());
+
+ uno::Reference<beans::XPropertySet> xPara2(xParas->nextElement(), uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xRules2(xPara2->getPropertyValue("NumberingRules"),
+ uno::UNO_QUERY);
+ comphelper::SequenceAsHashMap aRule2(xRules2->getByIndex(2));
+ CPPUNIT_ASSERT_EQUAL(OUString(u"•"), aRule2["BulletChar"].get<OUString>());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testRecursion()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-recursion.pptx"), PPTX);
+
+ uno::Reference<drawing::XShapes> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ uno::Reference<drawing::XShapes> xGroup1(xGroup->getByIndex(1), uno::UNO_QUERY);
+
+ uno::Reference<drawing::XShapes> xGroupA(xGroup1->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<text::XText> xTextA(xGroupA->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("A"), xTextA->getString());
+
+ uno::Reference<drawing::XShapes> xGroupB(xGroup1->getByIndex(1), uno::UNO_QUERY);
+ // 5 connectors, B1 with children, B2 with children
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(7), xGroupB->getCount());
+
+ uno::Reference<drawing::XShapes> xGroupB1(xGroupB->getByIndex(1), uno::UNO_QUERY);
+
+ uno::Reference<drawing::XShapes> xGroupB1a(xGroupB1->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<text::XText> xTextB1(xGroupB1a->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("B1"), xTextB1->getString());
+
+ uno::Reference<drawing::XShape> xGroupC12(xGroupB1->getByIndex(1), uno::UNO_QUERY);
+ uno::Reference<text::XText> xTextC1(
+ getChildShape(getChildShape(getChildShape(xGroupC12, 0), 0), 0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("C1"), xTextC1->getString());
+ uno::Reference<text::XText> xTextC2(
+ getChildShape(getChildShape(getChildShape(xGroupC12, 1), 0), 0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("C2"), xTextC2->getString());
+
+ uno::Reference<drawing::XShapes> xGroupB2(xGroupB->getByIndex(5), uno::UNO_QUERY);
+
+ uno::Reference<drawing::XShapes> xGroupB2a(xGroupB2->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<text::XText> xTextB2(xGroupB2a->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("B2"), xTextB2->getString());
+
+ uno::Reference<drawing::XShape> xGroupC3(xGroupB2->getByIndex(1), uno::UNO_QUERY);
+ uno::Reference<text::XText> xTextC3(
+ getChildShape(getChildShape(getChildShape(xGroupC3, 0), 0), 0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("C3"), xTextC3->getString());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testDataFollow()
+{
+ // checks if data nodes are followed correctly
+ // different variables are set for two presentation points with the same name
+ // they should be layouted differently - one horizontally and one vertically
+
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-data-follow.pptx"), PPTX);
+
+ uno::Reference<drawing::XShapes> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+
+ uno::Reference<drawing::XShapes> xGroupLeft(xGroup->getByIndex(1), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xGroupB(xGroupLeft->getByIndex(1), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShapeB1
+ = getChildShape(getChildShape(getChildShape(xGroupB, 1), 0), 0);
+ uno::Reference<text::XText> xTextB1(xShapeB1, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("B1"), xTextB1->getString());
+ uno::Reference<drawing::XShape> xShapeB2
+ = getChildShape(getChildShape(getChildShape(xGroupB, 3), 0), 0);
+ uno::Reference<text::XText> xTextB2(xShapeB2, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("B2"), xTextB2->getString());
+
+ CPPUNIT_ASSERT_EQUAL(xShapeB1->getPosition().Y, xShapeB2->getPosition().Y);
+ CPPUNIT_ASSERT_GREATEREQUAL(xShapeB1->getPosition().X + xShapeB1->getSize().Width,
+ xShapeB2->getPosition().X);
+
+ uno::Reference<drawing::XShapes> xGroupRight(xGroup->getByIndex(2), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xGroupC(xGroupRight->getByIndex(1), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShapeC1
+ = getChildShape(getChildShape(getChildShape(xGroupC, 3), 0), 0);
+ uno::Reference<text::XText> xTextC1(xShapeC1, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("C1"), xTextC1->getString());
+ uno::Reference<drawing::XShape> xShapeC2
+ = getChildShape(getChildShape(getChildShape(xGroupC, 5), 0), 0);
+ uno::Reference<text::XText> xTextC2(xShapeC2, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("C2"), xTextC2->getString());
+
+ CPPUNIT_ASSERT_EQUAL(xShapeC1->getPosition().X, xShapeC2->getPosition().X);
+ CPPUNIT_ASSERT_GREATEREQUAL(xShapeC1->getPosition().Y + xShapeC1->getSize().Height,
+ xShapeC2->getPosition().Y);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testOrgChart2()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-org-chart2.pptx"), PPTX);
+ uno::Reference<drawing::XShape> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+
+ uno::Reference<drawing::XShape> xShapeC1 = findChildShapeByText(xGroup, "C1");
+ uno::Reference<drawing::XShape> xShapeC2 = findChildShapeByText(xGroup, "C2");
+ uno::Reference<drawing::XShape> xShapeC3 = findChildShapeByText(xGroup, "C3");
+ uno::Reference<drawing::XShape> xShapeC4 = findChildShapeByText(xGroup, "C4");
+ uno::Reference<drawing::XShape> xShapeD1 = findChildShapeByText(xGroup, "D1");
+ uno::Reference<drawing::XShape> xShapeD2 = findChildShapeByText(xGroup, "D2");
+
+ CPPUNIT_ASSERT(xShapeC1.is());
+ CPPUNIT_ASSERT(xShapeC2.is());
+ CPPUNIT_ASSERT(xShapeC3.is());
+ CPPUNIT_ASSERT(xShapeC4.is());
+ CPPUNIT_ASSERT(xShapeD1.is());
+ CPPUNIT_ASSERT(xShapeD2.is());
+
+ CPPUNIT_ASSERT_EQUAL(xShapeC1->getPosition().Y, xShapeC2->getPosition().Y);
+ CPPUNIT_ASSERT_GREATEREQUAL(xShapeC1->getPosition().X + xShapeC1->getSize().Width,
+ xShapeC2->getPosition().X);
+
+ CPPUNIT_ASSERT_EQUAL(xShapeC3->getPosition().X, xShapeC4->getPosition().X);
+ CPPUNIT_ASSERT_GREATEREQUAL(xShapeC3->getPosition().Y + xShapeC3->getSize().Height,
+ xShapeC4->getPosition().Y);
+
+ CPPUNIT_ASSERT_EQUAL(xShapeD1->getPosition().X, xShapeD2->getPosition().X);
+ CPPUNIT_ASSERT_GREATEREQUAL(xShapeD1->getPosition().Y + xShapeD1->getSize().Height,
+ xShapeD2->getPosition().Y);
+
+ CPPUNIT_ASSERT_GREATEREQUAL(xShapeC2->getPosition().X, xShapeD1->getPosition().X);
+ CPPUNIT_ASSERT_GREATEREQUAL(xShapeC2->getPosition().Y + xShapeC2->getSize().Height,
+ xShapeD1->getPosition().Y);
+
+ CPPUNIT_ASSERT_GREATEREQUAL(xShapeD1->getPosition().X + xShapeD1->getSize().Width,
+ xShapeC4->getPosition().X);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testTdf131553()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf131553.pptx"), PPTX);
+ uno::Reference<drawing::XShape> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ const SdrObjGroup* pObjGroup = dynamic_cast<SdrObjGroup*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pObjGroup);
+ const SdrObject* pObj = pObjGroup->GetSubList()->GetObj(1);
+ CPPUNIT_ASSERT_MESSAGE("no object", pObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::OLE2, pObj->GetObjIdentifier());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testFillColorList()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/fill-color-list.pptx"), PPTX);
+ uno::Reference<drawing::XShape> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShape = getChildShape(getChildShape(xGroup, 1), 0);
+ uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY_THROW);
+ Color nFillColor;
+ xPropertySet->getPropertyValue("FillColor") >>= nFillColor;
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 12603469 (0xc0504d)
+ // - Actual : 16225862 (0xf79646)
+ // i.e. the background of the "A" shape was orange-ish, rather than red-ish.
+ CPPUNIT_ASSERT_EQUAL(Color(0xC0504D), nFillColor);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 2239
+ // - Actual : 5199
+ // i.e. the "A" shape's height/width aspect ratio was not 0.4 but rather close to 1.0, even if
+ // ppt/diagrams/layout1.xml's <dgm:constr type="h" refType="w" op="lte" fact="0.4"/> requested
+ // 0.4.
+ awt::Size aActualSize = xShape->getSize();
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2239), aActualSize.Height);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected greater than: 1738 (2766)
+ // - Actual : 1738
+ // i.e. the columns were not centered vertically.
+ sal_Int32 nGroupTop = xGroup->getPosition().Y;
+ sal_Int32 nShapeTop = xShape->getPosition().Y;
+ CPPUNIT_ASSERT_GREATER(nGroupTop, nShapeTop);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testTdf134221()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-tdf134221.pptx"), PPTX);
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+ uno::Reference<drawing::XShape> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShapeB = findChildShapeByText(xGroup, "B");
+ CPPUNIT_ASSERT(xShapeB.is());
+ uno::Reference<beans::XPropertySet> xTxtProps(xShapeB, uno::UNO_QUERY_THROW);
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(736),
+ xTxtProps->getPropertyValue("TextUpperDistance").get<sal_Int32>());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testLinearRule()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-linear-rule.pptx"), PPTX);
+
+ uno::Reference<drawing::XShape> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ // Last child, then first child inside that.
+ // It is first as backgroundArrow is last, but chOrder="t" is set to reverse the order.
+ uno::Reference<drawing::XShape> xShape = getChildShape(getChildShape(xGroup, 1), 0);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected greater than: 17500 (19867)
+ // - Actual : 4966
+ // i.e. the width of the background arrow was too small.
+ CPPUNIT_ASSERT_GREATER(static_cast<sal_Int32>(17500), xShape->getSize().Width);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 3160
+ // - Actual : 8770
+ // i.e. there was unexpected spacing on the left of the arrow.
+ // Then the imported version of the test document failed with:
+ // - Expected: 3160
+ // - Actual : 19828
+ // i.e. the spacing on the left of the arrow was so large that the shape was mostly outside the
+ // slide.
+ sal_Int32 nGroupLeft = xGroup->getPosition().X;
+ sal_Int32 nArrowLeft = xShape->getPosition().X;
+ CPPUNIT_ASSERT_EQUAL(nGroupLeft, nArrowLeft);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected less or equal than: 10092
+ // - Actual : 20183
+ // i.e. the arrow height was larger than the canvas given to the smartart on slide 1.
+ CPPUNIT_ASSERT_LESSEQUAL(static_cast<sal_Int32>(10092), xShape->getSize().Height);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testLinearRuleVert()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-linear-rule-vert.pptx"), PPTX);
+
+ uno::Reference<drawing::XShape> xGroup(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ // Get the P1 shape.
+ uno::Reference<drawing::XShape> xShape = getChildShape(getChildShape(xGroup, 1), 1);
+ uno::Reference<text::XTextRange> xShapeText(xShape, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("P1"), xShapeText->getString());
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 2020
+ // - Actual : 10308
+ // i.e. the first item on the vertical linear layout used ~all space, the other items were not
+ // visible.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2020), xShape->getSize().Height);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testAutofitSync()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-autofit-sync.pptx"), PPTX);
+
+ uno::Reference<drawing::XShape> xDiagram(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xMiddle = getChildShape(xDiagram, 2);
+ uno::Reference<beans::XPropertySet> xFirstInner(getChildShape(getChildShape(xMiddle, 0), 0),
+ uno::UNO_QUERY);
+ sal_Int16 nFirstScale = 0;
+ CPPUNIT_ASSERT(xFirstInner->getPropertyValue("TextFitToSizeScale") >>= nFirstScale);
+ CPPUNIT_ASSERT_GREATER(static_cast<sal_Int16>(0), nFirstScale);
+ CPPUNIT_ASSERT_LESS(static_cast<sal_Int16>(100), nFirstScale);
+ uno::Reference<beans::XPropertySet> xSecondInner(getChildShape(getChildShape(xMiddle, 2), 0),
+ uno::UNO_QUERY);
+ sal_Int16 nSecondScale = 0;
+ CPPUNIT_ASSERT(xSecondInner->getPropertyValue("TextFitToSizeScale") >>= nSecondScale);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 56
+ // - Actual : 100
+ // i.e. the left shape had no scale-down and the right shape was scaled down, even if it was
+ // requested that their scaling matches.
+ CPPUNIT_ASSERT_EQUAL(nSecondScale, nFirstScale);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 0 (drawing::TextFitToSizeType_NONE)
+ // - Actual : 3 (TextFitToSizeType_AUTOFIT)
+ // i.e. the 3rd shape had font size as direct formatting, but its automatic text scale was not
+ // disabled.
+ uno::Reference<beans::XPropertySet> xThirdInner(getChildShape(getChildShape(xMiddle, 4), 0),
+ uno::UNO_QUERY);
+ drawing::TextFitToSizeType eType{};
+ CPPUNIT_ASSERT(xThirdInner->getPropertyValue("TextFitToSize") >>= eType);
+ CPPUNIT_ASSERT_EQUAL(drawing::TextFitToSizeType_NONE, eType);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testSnakeRows()
+{
+ // Load a smartart which contains a snake algorithm.
+ // The expected layout of the 6 children is a 3x2 grid.
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-snake-rows.pptx"), PPTX);
+
+ uno::Reference<drawing::XShapes> xDiagram(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ // Collect position of the background and the real child shapes. First row and background has
+ // the same top position, unless some unexpected spacing happens, since this is a
+ // "left-to-right, then top-to-bottom" snake direction.
+ std::set<sal_Int32> aYPositions;
+ for (sal_Int32 nChild = 0; nChild < xDiagram->getCount(); ++nChild)
+ {
+ uno::Reference<drawing::XShape> xChild(xDiagram->getByIndex(nChild), uno::UNO_QUERY);
+ aYPositions.insert(xChild->getPosition().Y);
+ }
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 2
+ // - Actual : 3
+ // i.e. an unwanted row appeared.
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), aYPositions.size());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTestSmartArt::testCompositeInferRight()
+{
+ // Load a smartart which contains a composite algorithm.
+ // One constraint says that the left of the text should be the right of the image.
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/smartart-composite-infer-right.pptx"),
+ PPTX);
+
+ uno::Reference<drawing::XShape> xDiagram(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xMiddle = getChildShape(xDiagram, 1);
+ uno::Reference<drawing::XShape> xImage = getChildShape(xMiddle, 1);
+ uno::Reference<drawing::XShape> xText = getChildShape(xMiddle, 2);
+ sal_Int32 nRightOfImage = xImage->getPosition().X + xImage->getSize().Width;
+ sal_Int32 nLeftOfText = xText->getPosition().X;
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected greater than: 7925
+ // - Actual : 2430
+ // i.e. the text was overlapping with the image.
+ CPPUNIT_ASSERT_GREATER(nRightOfImage, nLeftOfText);
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTestSmartArt);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
new file mode 100644
index 000000000..b17f051df
--- /dev/null
+++ b/sd/qa/unit/import-tests.cxx
@@ -0,0 +1,1987 @@
+/* -*- 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 <config_poppler.h>
+
+#include "sdmodeltestbase.hxx"
+
+#include <editeng/eeitem.hxx>
+#include <editeng/editobj.hxx>
+#include <editeng/ulspitem.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/escapementitem.hxx>
+#include <editeng/colritem.hxx>
+#include <editeng/numitem.hxx>
+
+#include <svx/svdoashp.hxx>
+#include <svx/svdogrp.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdotable.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/xlnclit.hxx>
+#include <svx/xlnwtit.hxx>
+#include <svx/sdasitm.hxx>
+#include <svx/sdmetitm.hxx>
+#include <animations/animationnodehelper.hxx>
+#include <sax/tools/converter.hxx>
+
+#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+#include <com/sun/star/document/XEventsSupplier.hpp>
+#include <com/sun/star/presentation/ClickAction.hpp>
+#include <com/sun/star/presentation/XPresentationSupplier.hpp>
+#include <com/sun/star/animations/XAnimationNodeSupplier.hpp>
+#include <com/sun/star/animations/XAnimate.hpp>
+#include <com/sun/star/chart/XChartDocument.hpp>
+#include <com/sun/star/chart2/XChartDocument.hpp>
+#include <com/sun/star/chart2/XDataSeriesContainer.hpp>
+#include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
+#include <com/sun/star/chart2/XChartTypeContainer.hpp>
+#include <com/sun/star/chart2/data/XNumericalDataSequence.hpp>
+#include <com/sun/star/table/BorderLineStyle.hpp>
+#include <com/sun/star/table/BorderLine2.hpp>
+#include <com/sun/star/style/ParagraphAdjust.hpp>
+#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/presentation/XCustomPresentationSupplier.hpp>
+#include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
+#include <com/sun/star/drawing/ConnectorType.hpp>
+
+#include <stlpool.hxx>
+#include <unotools/syslocaleoptions.hxx>
+#include <comphelper/scopeguard.hxx>
+#include <comphelper/sequenceashashmap.hxx>
+#include <comphelper/lok.hxx>
+#include <svx/svdograf.hxx>
+#include <vcl/filter/PDFiumLibrary.hxx>
+#include <filter/msfilter/escherex.hxx>
+
+using namespace ::com::sun::star;
+
+namespace com::sun::star::uno {
+
+template<class T>
+static std::ostream& operator<<(std::ostream& rStrm, const uno::Reference<T>& xRef)
+{
+ rStrm << xRef.get();
+ return rStrm;
+}
+
+}
+
+
+/// Impress import filters tests.
+class SdImportTest : public SdModelTestBase
+{
+public:
+ virtual void setUp() override;
+
+ void testDocumentLayout();
+ void testTdf152434();
+ void testConnectors();
+ void testTdf153036_resizedConnectorL();
+ void testTdf149314();
+ void testTdf149124();
+ void testTdf148965();
+ void testTdf89449();
+ void testTdf147459();
+ void testTdf146223();
+ void testTdf144918();
+ void testTdf144917();
+ void testHyperlinkOnImage();
+ void testTdf142645();
+ void testTdf141704();
+ void testTdf142915();
+ void testTdf142913();
+ void testTdf142590();
+ void testCustomSlideShow();
+ void testInternalHyperlink();
+ void testHyperlinkColor();
+ void testSmoketest();
+ void testTdf131269();
+ void testN759180();
+ void testN778859();
+ void testMasterPageStyleParent();
+ void testGradientAngle();
+ void testTdf97808();
+ void testFillStyleNone();
+ void testFdo64512();
+ void testFdo71075();
+ void testN828390_2();
+ void testN828390_3();
+ void testFdo68594();
+ void testPlaceholderPriority();
+ void testFdo72998();
+ void testFdo77027();
+ void testStrictOOXML();
+ void testN862510_1();
+ void testN862510_2();
+ void testN862510_4();
+ void testBnc870237();
+ void testBnc887225();
+ void testPredefinedTableStyle();
+ void testBnc591147();
+ void testCreationDate();
+ void testMultiColTexts();
+ void testBnc584721_1();
+ void testBnc584721_2();
+ void testBnc584721_4();
+ void testBnc904423();
+ void testShapeLineStyle();
+ void testTableBorderLineStyle();
+ void testBnc862510_6();
+ void testBnc862510_7();
+#if ENABLE_PDFIMPORT
+ void testPDFImportShared();
+#if defined(IMPORT_PDF_ELEMENTS)
+ void testPDFImport();
+ void testPDFImportSkipImages();
+#endif
+#endif
+ void testBulletSuffix();
+ void testBnc910045();
+ void testRowHeight();
+ void testTdf93830();
+ void testTdf127129();
+ void testTdf93097();
+ void testTdf62255();
+ void testTdf89927();
+ void testTdf103800();
+
+ CPPUNIT_TEST_SUITE(SdImportTest);
+
+ CPPUNIT_TEST(testDocumentLayout);
+ CPPUNIT_TEST(testTdf152434);
+ CPPUNIT_TEST(testConnectors);
+ CPPUNIT_TEST(testTdf153036_resizedConnectorL);
+ CPPUNIT_TEST(testTdf149314);
+ CPPUNIT_TEST(testTdf149124);
+ CPPUNIT_TEST(testTdf148965);
+ CPPUNIT_TEST(testTdf89449);
+ CPPUNIT_TEST(testTdf147459);
+ CPPUNIT_TEST(testTdf146223);
+ CPPUNIT_TEST(testTdf144918);
+ CPPUNIT_TEST(testTdf144917);
+ CPPUNIT_TEST(testHyperlinkOnImage);
+ CPPUNIT_TEST(testTdf142645);
+ CPPUNIT_TEST(testTdf141704);
+ CPPUNIT_TEST(testTdf142915);
+ CPPUNIT_TEST(testTdf142913);
+ CPPUNIT_TEST(testTdf142590);
+ CPPUNIT_TEST(testCustomSlideShow);
+ CPPUNIT_TEST(testInternalHyperlink);
+ CPPUNIT_TEST(testHyperlinkColor);
+ CPPUNIT_TEST(testSmoketest);
+ CPPUNIT_TEST(testTdf131269);
+ CPPUNIT_TEST(testN759180);
+ CPPUNIT_TEST(testN778859);
+ CPPUNIT_TEST(testMasterPageStyleParent);
+ CPPUNIT_TEST(testGradientAngle);
+ CPPUNIT_TEST(testTdf97808);
+ CPPUNIT_TEST(testFillStyleNone);
+ CPPUNIT_TEST(testFdo64512);
+ CPPUNIT_TEST(testFdo71075);
+ CPPUNIT_TEST(testN828390_2);
+ CPPUNIT_TEST(testN828390_3);
+ CPPUNIT_TEST(testFdo68594);
+ CPPUNIT_TEST(testPlaceholderPriority);
+ CPPUNIT_TEST(testFdo72998);
+ CPPUNIT_TEST(testFdo77027);
+ CPPUNIT_TEST(testStrictOOXML);
+ CPPUNIT_TEST(testN862510_1);
+ CPPUNIT_TEST(testN862510_2);
+ CPPUNIT_TEST(testN862510_4);
+ CPPUNIT_TEST(testBnc870237);
+ CPPUNIT_TEST(testBnc887225);
+ CPPUNIT_TEST(testPredefinedTableStyle);
+ CPPUNIT_TEST(testBnc591147);
+ CPPUNIT_TEST(testCreationDate);
+ CPPUNIT_TEST(testMultiColTexts);
+ CPPUNIT_TEST(testBnc584721_1);
+ CPPUNIT_TEST(testBnc584721_2);
+ CPPUNIT_TEST(testBnc584721_4);
+ CPPUNIT_TEST(testBnc904423);
+ CPPUNIT_TEST(testShapeLineStyle);
+ CPPUNIT_TEST(testTableBorderLineStyle);
+ CPPUNIT_TEST(testBnc862510_6);
+ CPPUNIT_TEST(testBnc862510_7);
+#if ENABLE_PDFIMPORT
+ CPPUNIT_TEST(testPDFImportShared);
+#if defined(IMPORT_PDF_ELEMENTS)
+ CPPUNIT_TEST(testPDFImport);
+ CPPUNIT_TEST(testPDFImportSkipImages);
+#endif
+#endif
+ CPPUNIT_TEST(testBulletSuffix);
+ CPPUNIT_TEST(testBnc910045);
+ CPPUNIT_TEST(testRowHeight);
+ CPPUNIT_TEST(testTdf93830);
+ CPPUNIT_TEST(testTdf127129);
+ CPPUNIT_TEST(testTdf93097);
+ CPPUNIT_TEST(testTdf62255);
+ CPPUNIT_TEST(testTdf89927);
+ CPPUNIT_TEST(testTdf103800);
+
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void SdImportTest::setUp()
+{
+ SdModelTestBase::setUp();
+ mxDesktop.set(frame::Desktop::create(getComponentContext()));
+}
+
+/** Test document against a reference XML dump of shapes.
+
+If you want to update one of these tests, or add a new one, set the nUpdateMe
+to the index of the test, and the dump XML's will be created (or rewritten)
+instead of checking. Use with care - when the test is failing, first find out
+why, instead of just updating .xml's blindly.
+
+Example: Let's say you are adding a test called fdoABCD.pptx. You'll place it
+to the data/ subdirectory, and will add an entry to aFilesToCompare below,
+the 3rd parameter is for export test - can be -1 (don't export), ODP, PPT or PPTX
+like:
+
+ { "fdoABCD.pptx", "xml/fdoABCD_", PPTX },
+
+and will count the index in the aFilesToCompare structure (1st is 0, 2nd is 1,
+etc.) Temporarily you'll set nUpdateMe to this index (instead of -1), and run
+
+make sd
+
+This will generate the sd/qa/unit/data/xml/fdoABCD_*.xml for you. Now you
+will change nUpdateMe back to -1, and commit your fdoABCD.pptx test, the
+xml/fdoABCD_*.xml dumps, and the aFilesToCompare addition in one commit.
+
+As the last step, you will revert your fix and do 'make sd' again, to check
+that without your fix, the unit test breaks. Then clean up, and push :-)
+
+NOTE: This approach is suitable only for tests of fixes that actually change
+the layout - best to check by reverting your fix locally after having added
+the test, and re-running; it should break.
+*/
+void SdImportTest::testDocumentLayout()
+{
+ static const struct { std::u16string_view sInput, sDump; sal_Int32 nFormat; sal_Int32 nExportType; } aFilesToCompare[] =
+ {
+ { u"odp/shapes-test.odp", u"xml/shapes-test_page", ODP, -1 },
+ { u"fdo47434.pptx", u"xml/fdo47434_", PPTX, -1 },
+ { u"n758621.ppt", u"xml/n758621_", PPT, -1 },
+ { u"fdo64586.ppt", u"xml/fdo64586_", PPT, -1 },
+ { u"n819614.pptx", u"xml/n819614_", PPTX, -1 },
+ { u"n820786.pptx", u"xml/n820786_", PPTX, -1 },
+ { u"n762695.pptx", u"xml/n762695_", PPTX, -1 },
+ { u"n593612.pptx", u"xml/n593612_", PPTX, -1 },
+ { u"fdo71434.pptx", u"xml/fdo71434_", PPTX, -1 },
+ { u"n902652.pptx", u"xml/n902652_", PPTX, -1 },
+ { u"tdf90403.pptx", u"xml/tdf90403_", PPTX, -1 },
+ { u"tdf90338.odp", u"xml/tdf90338_", ODP, PPTX },
+ { u"tdf92001.odp", u"xml/tdf92001_", ODP, PPTX },
+// GCC -mfpmath=387 rounding issues in lclPushMarkerProperties
+// (oox/source/drawingml/lineproperties.cxx); see mail sub-thread starting at
+// <https://lists.freedesktop.org/archives/libreoffice/2016-September/
+// 075211.html> "Re: Test File: sc/qa/unit/data/functions/fods/chiinv.fods:
+// fails with Assertion" for how "-mfpmath=sse -msse2" would fix that:
+#if !(defined LINUX && defined X86)
+ { u"tdf100491.pptx", u"xml/tdf100491_", PPTX, -1 },
+#endif
+ { u"tdf109317.pptx", u"xml/tdf109317_", PPTX, ODP},
+ // { u"pptx/n828390.pptx", u"pptx/xml/n828390_", PPTX, PPTX }, // Example
+ };
+
+ for ( int i = 0; i < static_cast< int >( SAL_N_ELEMENTS( aFilesToCompare ) ); ++i )
+ {
+ int const nUpdateMe = -1; // index of test we want to update; supposedly only when the test is created
+
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc( u"/sd/qa/unit/data/" ) + aFilesToCompare[i].sInput, aFilesToCompare[i].nFormat );
+ if( aFilesToCompare[i].nExportType >= 0 )
+ xDocShRef = saveAndReload( xDocShRef.get(), aFilesToCompare[i].nExportType );
+ compareWithShapesDump( xDocShRef,
+ OUStringConcatenation(m_directories.getPathFromSrc( u"/sd/qa/unit/data/" ) + aFilesToCompare[i].sDump),
+ i == nUpdateMe );
+ }
+}
+
+void SdImportTest::testTdf152434()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf152434.pptx"), PPTX);
+
+ const SdrPage* pPage = GetPage( 1, xDocShRef );
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->GetObjCount());
+}
+
+void SdImportTest::testConnectors()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/connectors.pptx"), PPTX);
+
+ sal_Int32 aEdgeValue[] = { -1123, -1123, -1547, 1432, 1356, -1357, 1604, -1540,
+ 599, 1288, -1629, -1052, -513, 1569, -1283, 333 };
+
+ sal_Int32 nCount = 0;
+ for (size_t i = 0; i < 18; i++)
+ {
+ uno::Reference<beans::XPropertySet> xConnector(getShapeFromPage(i, 0, xDocShRef));
+ bool bConnector = xConnector->getPropertySetInfo()->hasPropertyByName("EdgeLine1Delta");
+ if (bConnector)
+ {
+ sal_Int32 nEdgeLine = xConnector->getPropertyValue("EdgeLine1Delta").get<sal_Int32>();
+ CPPUNIT_ASSERT_EQUAL(aEdgeValue[nCount], nEdgeLine);
+ nCount++;
+ }
+ }
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf153036_resizedConnectorL()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf153036_resizedConnectorL.pptx"), PPTX);
+
+ // TODO: If you are working on improvement related to connectors import, then
+ // expect this unit test to fail.
+ // This is a "L" shape, imported as a special "Z" shape that looks like a "L" shape.
+ uno::Reference<beans::XPropertySet> xConnector(getShapeFromPage(1, 0, xDocShRef));
+ CPPUNIT_ASSERT(xConnector->getPropertySetInfo()->hasPropertyByName("EdgeLine1Delta"));
+
+ sal_Int32 nEdgeLine = xConnector->getPropertyValue("EdgeLine1Delta").get<sal_Int32>();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(-3243), nEdgeLine);
+}
+
+void SdImportTest::testTdf149314()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf149314.pptx"), PPTX);
+
+ OUString aURL;
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 1, xDocShRef));
+
+ uno::Reference<text::XTextRange> const xParagraph1(getParagraphFromShape(0, xShape));
+ uno::Reference<text::XTextRange> xRun1(getRunFromParagraph(0, xParagraph1));
+ uno::Reference<beans::XPropertySet> xPropSet1(xRun1, uno::UNO_QUERY_THROW);
+ uno::Reference<text::XTextField> xField1;
+ xPropSet1->getPropertyValue("TextField") >>= xField1;
+ xPropSet1.set(xField1, uno::UNO_QUERY);
+ xPropSet1->getPropertyValue("URL") >>= aURL;
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("URLs don't match", OUString("#Slide 1"), aURL);
+
+ uno::Reference<text::XTextRange> const xParagraph2(getParagraphFromShape(1, xShape));
+ uno::Reference<text::XTextRange> xRun2(getRunFromParagraph(0, xParagraph2));
+ uno::Reference<beans::XPropertySet> xPropSet2(xRun2, uno::UNO_QUERY_THROW);
+ uno::Reference<text::XTextField> xField2;
+ xPropSet2->getPropertyValue("TextField") >>= xField2;
+ xPropSet2.set(xField2, uno::UNO_QUERY);
+ xPropSet2->getPropertyValue("URL") >>= aURL;
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("URLs don't match", OUString("#Slide 3"), aURL);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf149124()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf149124.pptx"), PPTX);
+
+ uno::Reference<container::XIndexAccess> xGroupShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xStandardConnector(xGroupShape->getByIndex(2), uno::UNO_QUERY_THROW);
+
+ sal_Int32 nStartGlueId = xStandardConnector->getPropertyValue("StartGluePointIndex").get<sal_Int32>();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), nStartGlueId);
+ sal_Int32 nEndGlueId = xStandardConnector->getPropertyValue("EndGluePointIndex").get<sal_Int32>();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nEndGlueId);
+}
+
+void SdImportTest::testTdf148965()
+{
+ // Set the system user interface to Hungarian
+ SvtSysLocaleOptions aOptions;
+ OUString sUIConfigString = aOptions.GetLanguageTag().getBcp47();
+ aOptions.SetUILocaleConfigString("hu-HU");
+ aOptions.Commit();
+ comphelper::ScopeGuard g([&aOptions, &sUIConfigString] {
+ aOptions.SetUILocaleConfigString(sUIConfigString);
+ aOptions.Commit();
+ });
+
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf148965.pptx"), PPTX);
+
+ uno::Reference<beans::XPropertySet> xShape1(getShapeFromPage(0, 1, xDocShRef));
+ uno::Reference<document::XEventsSupplier> xEventsSupplier1(xShape1, uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xEvents1(xEventsSupplier1->getEvents());
+ uno::Sequence<beans::PropertyValue> props1;
+ xEvents1->getByName("OnClick") >>= props1;
+ comphelper::SequenceAsHashMap map1(props1);
+ auto iter1(map1.find("Bookmark"));
+ CPPUNIT_ASSERT_EQUAL(OUString("page1"), iter1->second.get<OUString>());
+
+ uno::Reference<beans::XPropertySet> xShape2(getShapeFromPage(1, 1, xDocShRef));
+ uno::Reference<document::XEventsSupplier> xEventsSupplier2(xShape2, uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xEvents2(xEventsSupplier2->getEvents());
+ uno::Sequence<beans::PropertyValue> props2;
+ xEvents2->getByName("OnClick") >>= props2;
+ comphelper::SequenceAsHashMap map2(props2);
+ auto iter2(map2.find("Bookmark"));
+ CPPUNIT_ASSERT_EQUAL(OUString("page3"), iter2->second.get<OUString>());
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf89449()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf89449.pptx"), PPTX);
+
+ sal_Int32 nStartGlueId;
+ sal_Int32 nEndGlueId;
+ css::drawing::ConnectorType aConnectorType;
+
+ uno::Reference<beans::XPropertySet> xCurvedConnector(getShapeFromPage(3, 0, xDocShRef));
+ xCurvedConnector->getPropertyValue("EdgeKind") >>= aConnectorType;
+ CPPUNIT_ASSERT_EQUAL(drawing::ConnectorType::ConnectorType_CURVE, aConnectorType);
+ nStartGlueId = xCurvedConnector->getPropertyValue("StartGluePointIndex").get<sal_Int32>();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nStartGlueId);
+ nEndGlueId = xCurvedConnector->getPropertyValue("EndGluePointIndex").get<sal_Int32>();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nEndGlueId);
+
+ uno::Reference<beans::XPropertySet> xStraightConnector(getShapeFromPage(4, 0, xDocShRef));
+ xStraightConnector->getPropertyValue("EdgeKind") >>= aConnectorType;
+ CPPUNIT_ASSERT_EQUAL(drawing::ConnectorType::ConnectorType_LINE, aConnectorType);
+ nStartGlueId = xStraightConnector->getPropertyValue("StartGluePointIndex").get<sal_Int32>();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nStartGlueId);
+ nEndGlueId = xStraightConnector->getPropertyValue("EndGluePointIndex").get<sal_Int32>();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), nEndGlueId);
+
+ uno::Reference<beans::XPropertySet> xStandardConnector(getShapeFromPage(5, 0, xDocShRef));
+ xStandardConnector->getPropertyValue("EdgeKind") >>= aConnectorType;
+ CPPUNIT_ASSERT_EQUAL(drawing::ConnectorType::ConnectorType_STANDARD, aConnectorType);
+ nStartGlueId = xStandardConnector->getPropertyValue("StartGluePointIndex").get<sal_Int32>();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), nStartGlueId);
+ nEndGlueId = xStandardConnector->getPropertyValue("EndGluePointIndex").get<sal_Int32>();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), nEndGlueId);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf147459()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf147459.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xTriangleShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Sequence<beans::PropertyValue> aProps;
+ xTriangleShape->getPropertyValue("CustomShapeGeometry") >>= aProps;
+
+ uno::Sequence<beans::PropertyValue> aPathProps;
+ for (beans::PropertyValue const& rProp : std::as_const(aProps))
+ {
+ if (rProp.Name == "Path")
+ aPathProps = rProp.Value.get<uno::Sequence<beans::PropertyValue>>();
+ }
+
+ uno::Sequence<drawing::EnhancedCustomShapeParameterPair> seqGluePoints;
+ for (beans::PropertyValue const& rProp : std::as_const(aPathProps))
+ {
+ if (rProp.Name == "GluePoints")
+ {
+ seqGluePoints
+ = rProp.Value.get<uno::Sequence<drawing::EnhancedCustomShapeParameterPair>>();
+ }
+ }
+
+ sal_Int32 nCountGluePoints = seqGluePoints.getLength();
+ // The triangle has 6 glue points.
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(6), nCountGluePoints);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf146223()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf146223.pptx"), PPTX);
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY_THROW);
+
+ uno::Reference<drawing::XDrawPage> xPage1(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xSet(xPage1, uno::UNO_QUERY_THROW);
+
+ bool bBackgroundObjectsVisible;
+ xSet->getPropertyValue("IsBackgroundObjectsVisible") >>= bBackgroundObjectsVisible;
+ CPPUNIT_ASSERT_EQUAL(false, bBackgroundObjectsVisible);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf144918()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf144918.pptx"), PPTX);
+
+ uno::Reference< beans::XPropertySet > xShape1(getShapeFromPage(0, 1, xDocShRef));
+ uno::Reference<document::XEventsSupplier> xEventsSupplier1(xShape1, uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xEvents1(xEventsSupplier1->getEvents());
+ uno::Sequence<beans::PropertyValue> props1;
+ xEvents1->getByName("OnClick") >>= props1;
+ comphelper::SequenceAsHashMap map1(props1);
+ auto iter1(map1.find("Bookmark"));
+ CPPUNIT_ASSERT_EQUAL(OUString("First slide"), iter1->second.get<OUString>());
+
+ uno::Reference< beans::XPropertySet > xShape2(getShapeFromPage(1, 1, xDocShRef));
+ uno::Reference<document::XEventsSupplier> xEventsSupplier2(xShape2, uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xEvents2(xEventsSupplier2->getEvents());
+ uno::Sequence<beans::PropertyValue> props2;
+ xEvents2->getByName("OnClick") >>= props2;
+ comphelper::SequenceAsHashMap map2(props2);
+ auto iter2(map2.find("Bookmark"));
+ CPPUNIT_ASSERT_EQUAL(OUString("Third slide"), iter2->second.get<OUString>());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf144917()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf144917.pptx"), PPTX);
+
+ uno::Reference<container::XIndexAccess> xGroupShape(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xShape(xGroupShape->getByIndex(1), uno::UNO_QUERY_THROW);
+ uno::Reference<document::XEventsSupplier> xEventsSupplier(xShape, uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xEvents(xEventsSupplier->getEvents());
+ uno::Sequence<beans::PropertyValue> props;
+ xEvents->getByName("OnClick") >>= props;
+ comphelper::SequenceAsHashMap map(props);
+ auto iter(map.find("Bookmark"));
+ CPPUNIT_ASSERT_EQUAL(OUString("http://www.example.com/"), iter->second.get<OUString>());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testHyperlinkOnImage()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/hyperlinkOnImage.pptx"), PPTX);
+
+ uno::Reference< beans::XPropertySet > xShape1(getShapeFromPage(1, 0, xDocShRef));
+ uno::Reference<document::XEventsSupplier> xEventsSupplier1(xShape1, uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xEvents1(xEventsSupplier1->getEvents());
+ uno::Sequence<beans::PropertyValue> props1;
+ xEvents1->getByName("OnClick") >>= props1;
+ comphelper::SequenceAsHashMap map1(props1);
+ auto iter1(map1.find("ClickAction"));
+ CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_LASTPAGE,
+ iter1->second.get<css::presentation::ClickAction>());
+
+ uno::Reference< beans::XPropertySet > xShape2(getShapeFromPage(1, 1, xDocShRef));
+ uno::Reference<document::XEventsSupplier> xEventsSupplier2(xShape2, uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xEvents2(xEventsSupplier2->getEvents());
+ uno::Sequence<beans::PropertyValue> props2;
+ xEvents2->getByName("OnClick") >>= props2;
+ comphelper::SequenceAsHashMap map2(props2);
+ auto iter2(map2.find("ClickAction"));
+ CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_NONE,
+ iter2->second.get<css::presentation::ClickAction>());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf142645()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf142645.pptx"), PPTX);
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY_THROW);
+
+ uno::Reference<drawing::XDrawPage> xPage1(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<container::XNamed> xNamed1(xPage1, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("Hello"), xNamed1->getName());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf141704()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf141704.pptx"), PPTX);
+
+ for (sal_Int32 i = 0; i < 7; i++)
+ {
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(1, i, xDocShRef));
+ uno::Reference<document::XEventsSupplier> xEventsSupplier(xShape, uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xEvents(xEventsSupplier->getEvents());
+
+ uno::Sequence<beans::PropertyValue> props;
+ xEvents->getByName("OnClick") >>= props;
+ comphelper::SequenceAsHashMap map(props);
+ auto iter(map.find("ClickAction"));
+ switch (i)
+ {
+ case 0:
+ CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_LASTPAGE,
+ iter->second.get<css::presentation::ClickAction>());
+ break;
+ case 1:
+ CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_NEXTPAGE,
+ iter->second.get<css::presentation::ClickAction>());
+ break;
+ case 2:
+ CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_PREVPAGE,
+ iter->second.get<css::presentation::ClickAction>());
+ break;
+ case 3:
+ {
+ auto iter1(map.find("Bookmark"));
+ CPPUNIT_ASSERT_EQUAL(OUString("http://www.example.com/"), iter1->second.get<OUString>());
+ }
+ break;
+ case 4:
+ {
+ auto iter2(map.find("Bookmark"));
+ CPPUNIT_ASSERT_EQUAL(OUString("End Show"), iter2->second.get<OUString>());
+ }
+ break;
+ case 5:
+ CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_STOPPRESENTATION,
+ iter->second.get<css::presentation::ClickAction>());
+ break;
+ case 6:
+ CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_FIRSTPAGE,
+ iter->second.get<css::presentation::ClickAction>());
+ break;
+ default:
+ break;
+ }
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf142915()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf142915.pptx"), PPTX);
+
+ uno::Reference<presentation::XPresentationSupplier> xPresentationSupplier(
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPresentationProps(xPresentationSupplier->getPresentation(),
+ uno::UNO_QUERY_THROW);
+
+ bool bChangeManually = xPresentationProps->getPropertyValue("IsAutomatic").get<bool>();
+
+ CPPUNIT_ASSERT_EQUAL(true, bChangeManually);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf142913()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf142913.pptx"), PPTX);
+
+ uno::Reference<presentation::XPresentationSupplier> xPresentationSupplier(
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPresentationProps(xPresentationSupplier->getPresentation(),
+ uno::UNO_QUERY_THROW);
+
+ OUString sFirstPage = xPresentationProps->getPropertyValue("FirstPage").get<OUString>();
+
+ CPPUNIT_ASSERT_EQUAL(OUString("Second"), sFirstPage);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf142590()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf142590.pptx"), PPTX);
+
+ uno::Reference<presentation::XPresentationSupplier> xPresentationSupplier(
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPresentationProps(xPresentationSupplier->getPresentation(),
+ uno::UNO_QUERY_THROW);
+ const OUString sCustomShowId
+ = xPresentationProps->getPropertyValue("CustomShow").get<OUString>();
+
+ CPPUNIT_ASSERT(!sCustomShowId.isEmpty());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testCustomSlideShow()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf131390.pptx"), PPTX);
+
+ css::uno::Reference<css::presentation::XCustomPresentationSupplier> aXCPSup(
+ xDocShRef->GetModel(), css::uno::UNO_QUERY);
+ css::uno::Reference<css::container::XNameContainer> aXCont(aXCPSup->getCustomPresentations());
+ const css::uno::Sequence< OUString> aNameSeq( aXCont->getElementNames() );
+
+ // In the document, there are two custom presentations.
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(2), aNameSeq.size());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testInternalHyperlink()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf65724.pptx"), PPTX);
+
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 1, 0, xDocShRef ) );
+
+ // Get first paragraph
+ uno::Reference<text::XTextRange> const xParagraph( getParagraphFromShape( 0, xShape ) );
+
+ // first chunk of text
+ uno::Reference<text::XTextRange> xRun( getRunFromParagraph( 0, xParagraph ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xRun, uno::UNO_QUERY_THROW );
+
+ uno::Reference<text::XTextField> xField;
+ xPropSet->getPropertyValue("TextField") >>= xField;
+ CPPUNIT_ASSERT_MESSAGE("The text field is missing!", xField.is() );
+
+ xPropSet.set(xField, uno::UNO_QUERY);
+ OUString aURL;
+ xPropSet->getPropertyValue("URL") >>= aURL;
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("URLs don't match", OUString("#Slide2"), aURL);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testHyperlinkColor()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf137367.pptx"), PPTX);
+
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+
+ // Get first paragraph of the text
+ uno::Reference<text::XTextRange> const xParagraph1( getParagraphFromShape( 0, xShape ) );
+ // Get second paragraph of the text
+ uno::Reference<text::XTextRange> const xParagraph2( getParagraphFromShape( 1, xShape ) );
+ // Get third paragraph of the text
+ uno::Reference<text::XTextRange> const xParagraph3( getParagraphFromShape( 2, xShape ) );
+
+ // Get run of the first paragraph
+ uno::Reference<text::XTextRange> xRun1( getRunFromParagraph (0, xParagraph1 ) );
+ uno::Reference< beans::XPropertySet > xPropSet1( xRun1, uno::UNO_QUERY_THROW );
+ Color nCharColorBlue;
+ xPropSet1->getPropertyValue( "CharColor" ) >>= nCharColorBlue;
+
+ // Get run of the second paragraph
+ uno::Reference<text::XTextRange> xRun2( getRunFromParagraph (1, xParagraph2 ) );
+ uno::Reference< beans::XPropertySet > xPropSet2( xRun2, uno::UNO_QUERY_THROW );
+ Color nCharColorRed;
+ xPropSet2->getPropertyValue( "CharColor" ) >>= nCharColorRed;
+
+ // Get run of the third paragraph
+ uno::Reference<text::XTextRange> xRun3( getRunFromParagraph (2, xParagraph3 ) );
+ uno::Reference< beans::XPropertySet > xPropSet3( xRun3, uno::UNO_QUERY_THROW );
+ Color nCharColorGreen;
+ xPropSet3->getPropertyValue( "CharColor" ) >>= nCharColorGreen;
+
+ // Hyperlink colors should be blue, red, green.
+ CPPUNIT_ASSERT_EQUAL( Color(0x4472c4), nCharColorBlue );
+ CPPUNIT_ASSERT_EQUAL( Color(0xff0000), nCharColorRed );
+ CPPUNIT_ASSERT_EQUAL( Color(0x548235), nCharColorGreen );
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testSmoketest()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/smoketest.pptx"), PPTX);
+
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr );
+
+ // cf. SdrModel svx/svdmodel.hxx ...
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "wrong page count", static_cast<sal_uInt16>(3), pDoc->GetPageCount());
+
+ const SdrPage *pPage = pDoc->GetPage (1);
+ CPPUNIT_ASSERT_MESSAGE( "no page", pPage != nullptr );
+
+ CPPUNIT_ASSERT_MESSAGE( "changed", !pDoc->IsChanged() );
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf131269()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/tdf131269.ppt"), PPT);
+
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr );
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: 115
+ // - Actual : 3
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(115), pDoc->GetPageCount());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testN759180()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/n759180.pptx"), PPTX);
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ // Get the object
+ SdrObject *pObj = pPage->GetObj(0);
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
+ CPPUNIT_ASSERT(pTxtObj);
+ std::vector<EECharAttrib> rLst;
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ const SvxULSpaceItem *pULSpace = aEdit.GetParaAttribs(0).GetItem(EE_PARA_ULSPACE);
+ CPPUNIT_ASSERT(pULSpace);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Para bottom spacing is wrong!", static_cast<sal_uInt16>(0), pULSpace->GetLower());
+ aEdit.GetCharAttribs(1, rLst);
+ auto it = std::find_if(rLst.rbegin(), rLst.rend(),
+ [](const EECharAttrib& rCharAttr) { return dynamic_cast<const SvxFontHeightItem *>(rCharAttr.pAttr) != nullptr; });
+ if (it != rLst.rend())
+ {
+ const SvxFontHeightItem * pFontHeight = dynamic_cast<const SvxFontHeightItem *>((*it).pAttr);
+ // nStart == 9
+ // font height = 5 => 5*2540/72
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font height is wrong", static_cast<sal_uInt32>(176), pFontHeight->GetHeight() );
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testN862510_1()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/n862510_1.pptx"), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ {
+ std::vector<EECharAttrib> rLst;
+ SdrObject *pObj = pPage->GetObj( 0 );
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
+ CPPUNIT_ASSERT( pTxtObj );
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ aEdit.GetCharAttribs( 0, rLst );
+ for( std::vector<EECharAttrib>::reverse_iterator it = rLst.rbegin(); it!=rLst.rend(); ++it)
+ {
+ const SvxEscapementItem *pFontEscapement = dynamic_cast<const SvxEscapementItem *>( (*it).pAttr );
+ CPPUNIT_ASSERT_MESSAGE( "Baseline attribute not handled properly", !(pFontEscapement && pFontEscapement->GetProportionalHeight() != 100) );
+ }
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testN862510_2()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/n862510_2.pptx"), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ {
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->GetObjCount());
+ SdrObjGroup *pGrpObj = dynamic_cast<SdrObjGroup *>( pPage->GetObj( 0 ) );
+ CPPUNIT_ASSERT( pGrpObj );
+ SdrObjCustomShape *pObj = dynamic_cast<SdrObjCustomShape *>( pGrpObj->GetSubList()->GetObj( 1 ) );
+ CPPUNIT_ASSERT( pObj );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Wrong Text Rotation!", 90.0, pObj->GetExtraTextRotation( true ) );
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testN862510_4()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/n862510_4.pptx"), PPTX );
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ {
+ std::vector<EECharAttrib> rLst;
+ SdrObject *pObj = pPage->GetObj( 0 );
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
+ CPPUNIT_ASSERT( pTxtObj );
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ aEdit.GetCharAttribs( 0, rLst );
+ for( std::vector<EECharAttrib>::reverse_iterator it = rLst.rbegin(); it != rLst.rend(); ++it )
+ {
+ const SvxColorItem *pC = dynamic_cast<const SvxColorItem *>( (*it).pAttr );
+ CPPUNIT_ASSERT_MESSAGE( "gradfill for text color not handled!", !( pC && pC->GetValue() == Color(0) ) );
+ }
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testN828390_2()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/n828390_2.pptx"), PPTX );
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ SdrObject *pObj = pPage->GetObj(0);
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
+ CPPUNIT_ASSERT( pTxtObj );
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ CPPUNIT_ASSERT_EQUAL(OUString("Linux "), aEdit.GetText(0));
+ CPPUNIT_ASSERT_EQUAL(OUString("Standard Platform"), aEdit.GetText(1));
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testN828390_3()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/n828390_3.pptx"), PPTX );
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ SdrObject *pObj = pPage->GetObj(0);
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
+ CPPUNIT_ASSERT( pTxtObj );
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ std::vector<EECharAttrib> rLst;
+ aEdit.GetCharAttribs(1, rLst);
+ bool bPassed = std::none_of(rLst.rbegin(), rLst.rend(),
+ [](const EECharAttrib& rCharAttr) {
+ const SvxEscapementItem *pFontEscapement = dynamic_cast<const SvxEscapementItem *>(rCharAttr.pAttr);
+ return pFontEscapement && (pFontEscapement->GetEsc() != 0);
+ });
+ CPPUNIT_ASSERT_MESSAGE("CharEscapment not imported properly", bPassed);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testMasterPageStyleParent()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/masterpage_style_parent.odp"), ODP );
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr );
+
+ SdStyleSheetPool *const pPool(pDoc->GetSdStyleSheetPool());
+
+ int parents(0);
+ SfxStyleSheetIterator iter(pPool, SfxStyleFamily::Page);
+ for (SfxStyleSheetBase * pStyle = iter.First(); pStyle; pStyle = iter.Next())
+ {
+ OUString const name(pStyle->GetName());
+ OUString const parent(pStyle->GetParent());
+ if (!parent.isEmpty())
+ {
+ ++parents;
+ // check that parent exists
+ SfxStyleSheetBase *const pParentStyle(
+ pPool->Find(parent, SfxStyleFamily::Page));
+ CPPUNIT_ASSERT(pParentStyle);
+ CPPUNIT_ASSERT_EQUAL(pParentStyle->GetName(), parent);
+ // check that parent has the same master page as pStyle
+ CPPUNIT_ASSERT(parent.indexOf(SD_LT_SEPARATOR) != -1);
+ CPPUNIT_ASSERT(name.indexOf(SD_LT_SEPARATOR) != -1);
+ CPPUNIT_ASSERT_EQUAL(
+ parent.copy(0, parent.indexOf(SD_LT_SEPARATOR)),
+ name.copy(0, name.indexOf(SD_LT_SEPARATOR)));
+ }
+ }
+ // check that there are actually parents...
+ CPPUNIT_ASSERT_EQUAL(16, parents);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testGradientAngle()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odg/gradient-angle.fodg"), FODG);
+
+ uno::Reference<lang::XMultiServiceFactory> const xDoc(
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY);
+
+ awt::Gradient gradient;
+ uno::Reference<container::XNameAccess> const xGradients(
+ xDoc->createInstance("com.sun.star.drawing.GradientTable"),
+ uno::UNO_QUERY);
+
+ CPPUNIT_ASSERT(xGradients->getByName("Gradient 38") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(0), gradient.Angle); // was: 3600
+
+ CPPUNIT_ASSERT(xGradients->getByName("Gradient 10") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(270), gradient.Angle); // 27deg
+
+ CPPUNIT_ASSERT(xGradients->getByName("Gradient 11") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(1145), gradient.Angle); // 2rad
+
+ CPPUNIT_ASSERT(xGradients->getByName("Gradient 12") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(900), gradient.Angle); // 100grad
+
+ CPPUNIT_ASSERT(xGradients->getByName("Gradient 13") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(3599), gradient.Angle); // -1
+
+ CPPUNIT_ASSERT(xGradients->getByName("Gradient 14") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(3028), gradient.Angle); // -1rad
+
+ CPPUNIT_ASSERT(xGradients->getByName("Gradient 15") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(300), gradient.Angle); // 3900
+
+ CPPUNIT_ASSERT(xGradients->getByName("Gradient 16") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(105), gradient.Angle); // 10.5deg
+
+ CPPUNIT_ASSERT(xGradients->getByName("Gradient 17") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(1800), gradient.Angle); // \pi rad
+
+ uno::Reference<container::XNameAccess> const xTranspGradients(
+ xDoc->createInstance("com.sun.star.drawing.TransparencyGradientTable"),
+ uno::UNO_QUERY);
+
+ CPPUNIT_ASSERT(xTranspGradients->getByName("Transparency 2") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(10), gradient.Angle); // 1
+
+ CPPUNIT_ASSERT(xTranspGradients->getByName("Transparency 1") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(900), gradient.Angle); // 90deg
+
+ CPPUNIT_ASSERT(xTranspGradients->getByName("Transparency 3") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(572), gradient.Angle); // 1.0rad
+
+ CPPUNIT_ASSERT(xTranspGradients->getByName("Transparency 4") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(1800), gradient.Angle); // 1000grad
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testN778859()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/n778859.pptx"), PPTX);
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ {
+ // Get the object
+ SdrObject *pObj = pPage->GetObj(1);
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
+ CPPUNIT_ASSERT(!pTxtObj->IsAutoFit());
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testFdo68594()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/ppt/fdo68594.ppt"), PPT);
+
+ const SdrPage *pPage = &(GetPage( 1, xDocShRef )->TRG_GetMasterPage());
+ SdrObject *pObj = pPage->GetObj(1);
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
+ const SvxColorItem *pC = &pTxtObj->GetMergedItem(EE_CHAR_COLOR);
+ CPPUNIT_ASSERT_MESSAGE( "no color item", pC != nullptr);
+ // Color should be black
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Placeholder color mismatch", COL_BLACK, pC->GetValue() );
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testPlaceholderPriority()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/ppt/placeholder-priority.pptx"), PPTX);
+
+ const SdrPage* pPage = GetPage( 1, xDocShRef );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Missing placeholder", sal_uInt32(2), sal_uInt32(pPage->GetObjCount()));
+
+ tools::Rectangle pObj1Rect(9100, 3500, 29619, 4038);
+ SdrObject *pObj1 = pPage->GetObj(0);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Placeholder position is wrong, check the placeholder priority", pObj1Rect, pObj1->GetCurrentBoundRect());
+
+ tools::Rectangle pObj2Rect(9102, 8643, 29619, 12642);
+ SdrObject *pObj2 = pPage->GetObj(1);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Placeholder position is wrong, check the placeholder priority", pObj2Rect, pObj2->GetCurrentBoundRect());
+
+ // If the placeholder positions are wrong, please check placeholder priority in Placeholders class.
+}
+
+void SdImportTest::testFdo72998()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/cshapes.pptx"), PPTX);
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ {
+ SdrObjCustomShape *pObj = dynamic_cast<SdrObjCustomShape *>(pPage->GetObj(2));
+ CPPUNIT_ASSERT( pObj );
+ const SdrCustomShapeGeometryItem& rGeometryItem = pObj->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY );
+ const css::uno::Any* pViewBox = const_cast<SdrCustomShapeGeometryItem&>(rGeometryItem).GetPropertyValueByName( OUString( "ViewBox" ) );
+ CPPUNIT_ASSERT_MESSAGE( "Missing ViewBox", pViewBox );
+ css::awt::Rectangle aViewBox;
+ CPPUNIT_ASSERT( (*pViewBox >>= aViewBox ) );
+ CPPUNIT_ASSERT_MESSAGE( "Width should be zero - for forcing scale to 1", !aViewBox.Width );
+ CPPUNIT_ASSERT_MESSAGE( "Height should be zero - for forcing scale to 1", !aViewBox.Height );
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testFdo77027()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/fdo77027.odp"), ODP);
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ {
+ SdrOle2Obj *const pObj = dynamic_cast<SdrOle2Obj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pObj);
+
+ // check that the fill style/color was actually imported
+ const XFillStyleItem& rStyleItem = dynamic_cast<const XFillStyleItem&>(
+ pObj->GetMergedItem(XATTR_FILLSTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue());
+ const XFillColorItem& rColorItem = dynamic_cast<const XFillColorItem&>(
+ pObj->GetMergedItem(XATTR_FILLCOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0xff6600), rColorItem.GetColorValue());
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf97808()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/tdf97808.fodp"), FODP);
+
+ uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(
+ xDocShRef->GetModel(), uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xStyleFamilies = xStyleFamiliesSupplier->getStyleFamilies();
+ uno::Reference<container::XNameAccess> xStyleFamily(xStyleFamilies->getByName("graphics"), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xStyle(xStyleFamily->getByName("objectwithoutfill"), uno::UNO_QUERY);
+ OUString lineend;
+ CPPUNIT_ASSERT(xStyle->getPropertyValue("LineEndName") >>= lineend);
+ CPPUNIT_ASSERT_EQUAL(OUString("Arrow"), lineend);
+
+ // the draw:marker-end="" did not override the style
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XDrawPage> xPage(
+ xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xLine(
+ xPage->getByIndex(0), uno::UNO_QUERY_THROW);
+ //uno::Reference<style::XStyle> xParent;
+ uno::Reference<beans::XPropertySet> xParent;
+ CPPUNIT_ASSERT(xLine->getPropertyValue("Style") >>= xParent);
+ CPPUNIT_ASSERT_EQUAL(xStyle, xParent);
+ CPPUNIT_ASSERT(xLine->getPropertyValue("LineEndName") >>= lineend);
+ CPPUNIT_ASSERT_EQUAL(OUString(), lineend);
+
+ xDocShRef->DoClose();
+}
+void SdImportTest::testFillStyleNone()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/tdf123841.odg"), ODG);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ const SdrObject* pObj = pPage->GetObj(0);
+ auto& rFillStyleItem
+ = dynamic_cast<const XFillStyleItem&>(pObj->GetMergedItem(XATTR_FILLSTYLE));
+ // Without the accompanying fix in place, this test would have failed with 'Expected: 0; Actual:
+ // 1', i.e. the shape's fill was FillStyle_SOLID, making the text of the shape unreadable.
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue());
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testFdo64512()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/fdo64512.odp"), ODP);
+
+ uno::Reference< drawing::XDrawPagesSupplier > xDoc(
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "not exactly one page", static_cast<sal_Int32>(1), xDoc->getDrawPages()->getCount() );
+
+ uno::Reference< drawing::XDrawPage > xPage(
+ xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "not exactly three shapes", static_cast<sal_Int32>(3), xPage->getCount() );
+
+ uno::Reference< beans::XPropertySet > xConnectorShape(
+ xPage->getByIndex(2), uno::UNO_QUERY );
+ CPPUNIT_ASSERT_MESSAGE( "no connector shape", xConnectorShape.is() );
+
+ uno::Reference< beans::XPropertySet > xSvgShape(
+ xConnectorShape->getPropertyValue("StartShape"), uno::UNO_QUERY );
+ CPPUNIT_ASSERT_MESSAGE( "no start shape", xSvgShape.is() );
+
+ uno::Reference< beans::XPropertySet > xCustomShape(
+ xConnectorShape->getPropertyValue("EndShape"), uno::UNO_QUERY );
+ CPPUNIT_ASSERT_MESSAGE( "no end shape", xCustomShape.is() );
+
+ uno::Reference< animations::XAnimationNodeSupplier > xAnimNodeSupplier(
+ xPage, uno::UNO_QUERY_THROW );
+ uno::Reference< animations::XAnimationNode > xRootNode(
+ xAnimNodeSupplier->getAnimationNode() );
+ std::vector< uno::Reference< animations::XAnimationNode > > aAnimVector;
+ anim::create_deep_vector(xRootNode, aAnimVector);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "not 8 animation nodes", static_cast<std::size_t>(8), aAnimVector.size() );
+
+ uno::Reference< animations::XAnimate > xNode(
+ aAnimVector[7], uno::UNO_QUERY_THROW );
+ uno::Reference< drawing::XShape > xTargetShape(
+ xNode->getTarget(), uno::UNO_QUERY_THROW );
+ CPPUNIT_ASSERT_MESSAGE( "inner node not referencing svg shape",
+ xTargetShape != xSvgShape );
+
+ xDocShRef->DoClose();
+}
+
+// Unit test for importing charts
+void SdImportTest::testFdo71075()
+{
+ double values[] = { 12.0, 13.0, 14.0 };
+ css::uno::Any aAny;
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/fdo71075.odp"), ODP);
+
+ uno::Reference< beans::XPropertySet > xPropSet( getShapeFromPage( 0, 0, xDocShRef ) );
+ aAny = xPropSet->getPropertyValue( "Model" );
+ CPPUNIT_ASSERT_MESSAGE( "The shape doesn't have the property", aAny.hasValue() );
+
+ uno::Reference< chart::XChartDocument > xChartDoc;
+ aAny >>= xChartDoc;
+ CPPUNIT_ASSERT_MESSAGE( "failed to load chart", xChartDoc.is() );
+ uno::Reference< chart2::XChartDocument > xChart2Doc( xChartDoc, uno::UNO_QUERY );
+ CPPUNIT_ASSERT_MESSAGE( "failed to load chart", xChart2Doc.is() );
+
+ uno::Reference< chart2::XCoordinateSystemContainer > xBCooSysCnt( xChart2Doc->getFirstDiagram(), uno::UNO_QUERY );
+ uno::Sequence< uno::Reference< chart2::XCoordinateSystem > > aCooSysSeq( xBCooSysCnt->getCoordinateSystems());
+ uno::Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[0], uno::UNO_QUERY );
+
+ uno::Reference< chart2::XDataSeriesContainer > xDSCnt( xCTCnt->getChartTypes()[0], uno::UNO_QUERY );
+ CPPUNIT_ASSERT_MESSAGE( "failed to load data series", xDSCnt.is() );
+ uno::Sequence< uno::Reference< chart2::XDataSeries > > aSeriesSeq( xDSCnt->getDataSeries());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Invalid Series count", static_cast<sal_Int32>(1), aSeriesSeq.getLength() );
+ uno::Reference< chart2::data::XDataSource > xSource( aSeriesSeq[0], uno::UNO_QUERY );
+ uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aSeqCnt(xSource->getDataSequences());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Invalid Series count", static_cast<sal_Int32>(1), aSeqCnt.getLength());
+ uno::Reference< chart2::data::XDataSequence > xValueSeq( aSeqCnt[0]->getValues() );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Invalid Data count", static_cast<sal_Int32>(SAL_N_ELEMENTS(values)), xValueSeq->getData().getLength());
+ uno::Reference< chart2::data::XNumericalDataSequence > xNumSeq( xValueSeq, uno::UNO_QUERY );
+ uno::Sequence< double > aValues( xNumSeq->getNumericalData());
+ for(sal_Int32 i=0;i<xValueSeq->getData().getLength();i++)
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Invalid Series count", values[i], aValues.getConstArray()[i]);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testStrictOOXML()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/strict_ooxml.pptx"), PPTX);
+
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr );
+ getShapeFromPage( 0, 0, xDocShRef );
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testBnc870237()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc870237.pptx"), PPTX);
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ // Simulate a:ext inside dsp:txXfrm with changing the lower distance
+ const SdrObjGroup* pGroupObj = dynamic_cast<SdrObjGroup*>( pPage->GetObj( 0 ) );
+ const SdrObject* pObj = pGroupObj->GetSubList()->GetObj( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "no object", pObj != nullptr);
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(0), pObj->GetMergedItem(SDRATTR_TEXT_UPPERDIST).GetValue());
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(9919), pObj->GetMergedItem(SDRATTR_TEXT_LOWERDIST).GetValue());
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(0), pObj->GetMergedItem(SDRATTR_TEXT_RIGHTDIST).GetValue());
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(0), pObj->GetMergedItem(SDRATTR_TEXT_LEFTDIST).GetValue());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testCreationDate()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/fdo71434.pptx"), PPTX);
+ uno::Reference<document::XDocumentPropertiesSupplier> xDocumentPropertiesSupplier(xDocShRef->GetModel(), uno::UNO_QUERY);
+ uno::Reference<document::XDocumentProperties> xDocumentProperties = xDocumentPropertiesSupplier->getDocumentProperties();
+ util::DateTime aDate = xDocumentProperties->getCreationDate();
+ OUStringBuffer aBuffer;
+ sax::Converter::convertDateTime(aBuffer, aDate, nullptr);
+ // Metadata wasn't imported, this was 0000-00-00.
+ CPPUNIT_ASSERT_EQUAL(OUString("2013-11-09T10:37:56"), aBuffer.makeStringAndClear());
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testMultiColTexts()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/multicol.pptx"), PPTX );
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ auto pTextObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pTextObj);
+
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pTextObj->GetTextColumnsNumber());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), pTextObj->GetTextColumnsSpacing());
+
+ auto pMasterTextObj = dynamic_cast<SdrTextObj*>(pPage->TRG_GetMasterPage().GetObj(0));
+ CPPUNIT_ASSERT(pMasterTextObj);
+
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pMasterTextObj->GetTextColumnsNumber());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), pMasterTextObj->GetTextColumnsSpacing());
+
+ uno::Reference<text::XTextRange> xText(pMasterTextObj->getUnoShape(), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("mastershape1\nmastershape2"), xText->getString());
+}
+
+void SdImportTest::testPredefinedTableStyle()
+{
+ // 073A0DAA-6AF3-43AB-8588-CEC1D06C72B9 (Medium Style 2)
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/predefined-table-style.pptx"), PPTX );
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT( pTableObj );
+
+ uno::Reference< table::XCellRange > xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+ uno::Reference< beans::XPropertySet > xCell;
+ Color nColor;
+
+ xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(COL_BLACK, nColor);
+
+ xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xcccccc), nColor);
+
+ xCell.set(xTable->getCellByPosition(0, 2), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xe7e7e7), nColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testBnc887225()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc887225.pptx"), PPTX );
+ // In the document, lastRow and lastCol table properties are used.
+ // Make sure styles are set properly for individual cells.
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(2));
+ CPPUNIT_ASSERT( pTableObj );
+ uno::Reference< table::XCellRange > xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+ uno::Reference< beans::XPropertySet > xCell;
+ Color nColor;
+
+ xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x5b9bd5), nColor);
+
+ xCell.set(xTable->getCellByPosition(0, 1), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x5b9bd5), nColor);
+
+ xCell.set(xTable->getCellByPosition(1, 1), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xd1deef), nColor);
+
+ xCell.set(xTable->getCellByPosition(1, 2), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xe9eff7), nColor);
+
+ xCell.set(xTable->getCellByPosition(1, 4), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x5b9bd5), nColor);
+
+ xCell.set(xTable->getCellByPosition(3, 2), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x5b9bd5), nColor);
+
+ xCell.set(xTable->getCellByPosition(3, 4), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x5b9bd5), nColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testBnc584721_1()
+{
+ // Title text shape on the master page contained wrong text.
+
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc584721_1_2.pptx"), PPTX);
+
+ const SdrPage *pPage = &(GetPage( 1, xDocShRef )->TRG_GetMasterPage());
+ SdrObject *pObj = pPage->GetObj(0);
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ CPPUNIT_ASSERT_EQUAL(OUString("Click to edit Master title style"), aEdit.GetText(0));
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testBnc584721_2()
+{
+ // Import created an extra/unneeded outliner shape on the master slide next to the imported title shape.
+
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc584721_1_2.pptx"), PPTX);
+
+ const SdrPage *pPage = &(GetPage( 1, xDocShRef )->TRG_GetMasterPage());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pPage->GetObjCount());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testBnc591147()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc591147.pptx"), PPTX);
+
+ // In the document, there are two slides with media files.
+ uno::Reference< drawing::XDrawPagesSupplier > xDoc(
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW );
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(2), xDoc->getDrawPages()->getCount() );
+
+ // First page has video file inserted
+ uno::Reference< drawing::XDrawPage > xPage(
+ xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW );
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(1), xPage->getCount() );
+
+ //uno::Reference< drawing::XShape > xShape(xPage->getByIndex(0), uno::UNO_QUERY_THROW );
+ uno::Reference< beans::XPropertySet > xPropSet( getShape( 0, xPage ) );
+ OUString sVideoURL("emptyURL");
+ bool bSuccess = xPropSet->getPropertyValue("MediaURL") >>= sVideoURL;
+ CPPUNIT_ASSERT_MESSAGE( "MediaURL property is not set", bSuccess );
+ CPPUNIT_ASSERT_MESSAGE("MediaURL is empty", !sVideoURL.isEmpty());
+
+ // Second page has audio file inserted
+ xPage.set( xDoc->getDrawPages()->getByIndex(1), uno::UNO_QUERY_THROW );
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(1), xPage->getCount() );
+
+ xPropSet.set( getShape( 0, xPage ) );
+ OUString sAudioURL("emptyURL");
+ bSuccess = xPropSet->getPropertyValue("MediaURL") >>= sAudioURL;
+ CPPUNIT_ASSERT_MESSAGE( "MediaURL property is not set", bSuccess );
+ CPPUNIT_ASSERT_MESSAGE("MediaURL is empty", !sAudioURL.isEmpty());
+
+ CPPUNIT_ASSERT_MESSAGE( "sAudioURL and sVideoURL should not be equal", sAudioURL != sVideoURL );
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testBnc584721_4()
+{
+ // Black text was imported as white because of wrong caching mechanism
+
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc584721_4.pptx"), PPTX);
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 1, 1, xDocShRef ) );
+
+ // Get first paragraph of the text
+ uno::Reference<text::XTextRange> const xParagraph( getParagraphFromShape( 0, xShape ) );
+
+ // Get first run of the paragraph
+ uno::Reference<text::XTextRange> xRun( getRunFromParagraph (0, xParagraph ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xRun, uno::UNO_QUERY_THROW );
+ Color nCharColor;
+ xPropSet->getPropertyValue( "CharColor" ) >>= nCharColor;
+
+ // Color should be black
+ CPPUNIT_ASSERT_EQUAL( COL_BLACK, nCharColor );
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testBnc904423()
+{
+ // Here the problem was that different fill properties were applied in wrong order on the shape
+ // Right order: 1) master slide fill style, 2) theme, 3) direct formatting
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/bnc904423.pptx"), PPTX);
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ // First shape's background color is defined on master slide
+ {
+ SdrObject *const pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pObj);
+
+ const XFillStyleItem& rStyleItem = dynamic_cast<const XFillStyleItem&>(
+ pObj->GetMergedItem(XATTR_FILLSTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue());
+ const XFillColorItem& rColorItem = dynamic_cast<const XFillColorItem&>(
+ pObj->GetMergedItem(XATTR_FILLCOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0x00CC99), rColorItem.GetColorValue());
+ }
+
+ // Second shape's background color is defined by theme
+ {
+ SdrObject *const pObj = pPage->GetObj(1);
+ CPPUNIT_ASSERT(pObj);
+
+ const XFillStyleItem& rStyleItem = dynamic_cast<const XFillStyleItem&>(
+ pObj->GetMergedItem(XATTR_FILLSTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue());
+ const XFillColorItem& rColorItem = dynamic_cast<const XFillColorItem&>(
+ pObj->GetMergedItem(XATTR_FILLCOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0x3333CC), rColorItem.GetColorValue());
+ }
+
+ // Third shape's background color is defined by direct formatting
+ {
+ SdrObject *const pObj = pPage->GetObj(2);
+ CPPUNIT_ASSERT(pObj);
+
+ const XFillStyleItem& rStyleItem = dynamic_cast<const XFillStyleItem&>(
+ pObj->GetMergedItem(XATTR_FILLSTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue());
+ const XFillColorItem& rColorItem = dynamic_cast<const XFillColorItem&>(
+ pObj->GetMergedItem(XATTR_FILLCOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), rColorItem.GetColorValue());
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testShapeLineStyle()
+{
+ // Here the problem was that different line properties were applied in wrong order on the shape
+ // Right order: 1) master slide line style, 2) theme, 3) direct formatting
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/ShapeLineProperties.pptx"), PPTX);
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ // First shape's line style is defined on master slide
+ {
+ SdrObject *const pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pObj);
+
+ const XLineStyleItem& rStyleItem = dynamic_cast<const XLineStyleItem&>(
+ pObj->GetMergedItem(XATTR_LINESTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::LineStyle_DASH, rStyleItem.GetValue());
+
+ const XLineColorItem& rColorItem = dynamic_cast<const XLineColorItem&>(
+ pObj->GetMergedItem(XATTR_LINECOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), rColorItem.GetColorValue());
+
+ const XLineWidthItem& rWidthItem = dynamic_cast<const XLineWidthItem&>(
+ pObj->GetMergedItem(XATTR_LINEWIDTH));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(132), rWidthItem.GetValue());
+ }
+
+ // Second shape's line style is defined by theme
+ {
+ SdrObject *const pObj = pPage->GetObj(1);
+ CPPUNIT_ASSERT(pObj);
+
+ const XLineStyleItem& rStyleItem = dynamic_cast<const XLineStyleItem&>(
+ pObj->GetMergedItem(XATTR_LINESTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::LineStyle_SOLID, rStyleItem.GetValue());
+
+ const XLineColorItem& rColorItem = dynamic_cast<const XLineColorItem&>(
+ pObj->GetMergedItem(XATTR_LINECOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0x3333CC), rColorItem.GetColorValue());
+
+ const XLineWidthItem& rWidthItem = dynamic_cast<const XLineWidthItem&>(
+ pObj->GetMergedItem(XATTR_LINEWIDTH));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(35), rWidthItem.GetValue());
+ }
+
+ // Third shape's line style is defined by direct formatting
+ {
+ SdrObject *const pObj = pPage->GetObj(2);
+ CPPUNIT_ASSERT(pObj);
+
+ const XLineStyleItem& rStyleItem = dynamic_cast<const XLineStyleItem&>(
+ pObj->GetMergedItem(XATTR_LINESTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::LineStyle_SOLID, rStyleItem.GetValue());
+
+ const XLineColorItem& rColorItem = dynamic_cast<const XLineColorItem&>(
+ pObj->GetMergedItem(XATTR_LINECOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0x7030A0), rColorItem.GetColorValue());
+
+ const XLineWidthItem& rWidthItem = dynamic_cast<const XLineWidthItem&>(
+ pObj->GetMergedItem(XATTR_LINEWIDTH));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(176), rWidthItem.GetValue());
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTableBorderLineStyle()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tableBorderLineStyle.pptx"), PPTX );
+
+ // TODO: If you are working on improvement of table border line style
+ // support, then expect this unit test to fail.
+
+ const sal_Int16 nObjBorderLineStyles[] =
+ {
+ ::table::BorderLineStyle::DASHED,
+ ::table::BorderLineStyle::DASH_DOT_DOT,
+ ::table::BorderLineStyle::DASH_DOT,
+ ::table::BorderLineStyle::DOTTED,
+ ::table::BorderLineStyle::DASHED,
+ ::table::BorderLineStyle::DOTTED,
+ ::table::BorderLineStyle::DASHED,
+ ::table::BorderLineStyle::DASH_DOT,
+ ::table::BorderLineStyle::DASH_DOT,
+ ::table::BorderLineStyle::SOLID,
+ ::table::BorderLineStyle::NONE
+ };
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ CPPUNIT_ASSERT_EQUAL(SAL_N_ELEMENTS(nObjBorderLineStyles), pPage->GetObjCount());
+
+ sdr::table::SdrTableObj *pTableObj;
+ uno::Reference< table::XCellRange > xTable;
+ uno::Reference< beans::XPropertySet > xCell;
+ table::BorderLine2 aBorderLine;
+
+ for (size_t i = 0; i < SAL_N_ELEMENTS(nObjBorderLineStyles); i++)
+ {
+ pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(i));
+ CPPUNIT_ASSERT( pTableObj );
+ xTable.set(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+ xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("TopBorder") >>= aBorderLine;
+ if (aBorderLine.LineWidth > 0) {
+ CPPUNIT_ASSERT_EQUAL(nObjBorderLineStyles[i], aBorderLine.LineStyle);
+ }
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testBnc862510_6()
+{
+ // Black text was imported instead of gray
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc862510_6.pptx"), PPTX);
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+
+ // Get first paragraph of the text
+ uno::Reference<text::XTextRange> const xParagraph( getParagraphFromShape( 0, xShape ) );
+
+ // Get first run of the paragraph
+ uno::Reference<text::XTextRange> xRun( getRunFromParagraph( 0, xParagraph ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xRun, uno::UNO_QUERY_THROW );
+ Color nCharColor;
+ xPropSet->getPropertyValue( "CharColor" ) >>= nCharColor;
+
+ // Color should be gray
+ CPPUNIT_ASSERT_EQUAL( Color(0x8B8B8B), nCharColor );
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testBnc862510_7()
+{
+ // Title shape's text was aligned to left instead of center.
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc862510_7.pptx"), PPTX);
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+
+ // Get first paragraph
+ uno::Reference<text::XTextRange> const xParagraph( getParagraphFromShape( 0, xShape ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xParagraph, uno::UNO_QUERY_THROW );
+
+ sal_Int16 nParaAdjust = 0;
+ xPropSet->getPropertyValue( "ParaAdjust" ) >>= nParaAdjust;
+ CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_CENTER, static_cast<style::ParagraphAdjust>(nParaAdjust));
+
+ xDocShRef->DoClose();
+}
+
+#if ENABLE_PDFIMPORT
+// These tests use the old PDF-importing logic, which imports PDF elements as
+// SD elements. This suffered many issues, and therefore wasn't ideal.
+// The old PDF importer relied on an open-source project (xpdf) with an
+// incompatible license (gpl), which has to be interfaced via an out-of-process
+// library wrapper process. The resulting imported document was inaccurate
+// and often very slow and with large memory footprint.
+// Instead, PDFium offers state-of-the-art PDF importing logic,
+// which is well-maintained and renders PDFs into images with high accuracy.
+// So, the idea is to import PDFs as images using PDFium, which has a very
+// high quality (and is much faster) than importing individual editable elements.
+// So that's the "new" way of importing.
+// The user then breaks the image to editable elements (which is not perfect,
+// but very close to the old way), only if they need editing ability.
+// PDFium should overall be better, and where it isn't, we just need to improve it.
+// So these tests aren't really useful anymore. They should be modified to do
+// import+break and then check the results. But that isn't straight-forward and
+// currently await volunteering time to implement.
+
+void SdImportTest::testPDFImportShared()
+{
+ auto pPdfium = vcl::pdf::PDFiumLibrary::get();
+ if (!pPdfium)
+ {
+ return;
+ }
+
+ comphelper::LibreOfficeKit::setActive();
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pdf/multipage.pdf"), PDF);
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr );
+
+ // This test is to verify that we share the PDF stream linked to each
+ // Graphic instance in the imported document.
+ // Since we import PDFs as images, we support attaching the original
+ // PDF with each image to allow for advanced editing.
+ // Here we iterate over all Graphic instances embedded in the pages
+ // and verify that they all point to the same object in memory.
+ std::vector<Graphic> aGraphics;
+
+ for (int nPageIndex = 0; nPageIndex < pDoc->GetPageCount(); ++nPageIndex)
+ {
+ const SdrPage* pPage = GetPage(nPageIndex, xDocShRef);
+ if (pPage == nullptr)
+ break;
+
+ for (size_t nObjIndex = 0; nObjIndex < pPage->GetObjCount(); ++nObjIndex)
+ {
+ SdrObject* pObject = pPage->GetObj(nObjIndex);
+ if (pObject == nullptr)
+ continue;
+
+ SdrGrafObj* pSdrGrafObj = dynamic_cast<SdrGrafObj*>(pObject);
+ if (pSdrGrafObj == nullptr)
+ continue;
+
+ const GraphicObject& rGraphicObject = pSdrGrafObj->GetGraphicObject().GetGraphic();
+ const Graphic& rGraphic = rGraphicObject.GetGraphic();
+ CPPUNIT_ASSERT_MESSAGE("After loading, the PDF shouldn't have the primitive sequence created yet",
+ !rGraphic.getVectorGraphicData()->isPrimitiveSequenceCreated());
+ aGraphics.push_back(rGraphic);
+ }
+ }
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Expected more than one page.", size_t(9), aGraphics.size());
+
+ Graphic const & rFirstGraphic = aGraphics[0];
+
+ for (size_t i = 0; i < aGraphics.size(); ++i)
+ {
+ Graphic const & rGraphic = aGraphics[i];
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Expected all PDF streams to be identical.",
+ rFirstGraphic.getVectorGraphicData()->getBinaryDataContainer().getData(),
+ rGraphic.getVectorGraphicData()->getBinaryDataContainer().getData());
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Expected all GfxLinks to be identical.",
+ rFirstGraphic.GetSharedGfxLink().get(),
+ rGraphic.GetSharedGfxLink().get());
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Page number doesn't match expected", sal_Int32(i), rGraphic.getPageNumber());
+ }
+
+ xDocShRef->DoClose();
+ comphelper::LibreOfficeKit::setActive(false);
+}
+
+#if defined(IMPORT_PDF_ELEMENTS)
+
+void SdImportTest::testPDFImport()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/pdf/txtpic.pdf"), PDF);
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr );
+ uno::Reference< drawing::XDrawPagesSupplier > xDoc(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW );
+ uno::Reference< drawing::XDrawPage > xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "no exactly two shapes", static_cast<sal_Int32>(2), xPage->getCount() );
+
+ uno::Reference< beans::XPropertySet > xShape( getShape( 0, xPage ) );
+ uno::Reference<text::XText> xText = uno::Reference<text::XTextRange>(xShape, uno::UNO_QUERY_THROW)->getText();
+ CPPUNIT_ASSERT_MESSAGE( "not a text shape", xText.is() );
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testPDFImportSkipImages()
+{
+ auto pParams = std::make_shared<SfxAllItemSet>( SfxGetpApp()->GetPool() );
+ pParams->Put( SfxStringItem ( SID_FILE_FILTEROPTIONS, "SkipImages" ) );
+
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/pdf/txtpic.pdf"), PDF, pParams);
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr );
+ uno::Reference< drawing::XDrawPagesSupplier > xDoc(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW );
+ uno::Reference< drawing::XDrawPage > xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "no exactly one shape", static_cast<sal_Int32>(1), xPage->getCount() );
+
+ uno::Reference< drawing::XShape > xShape(xPage->getByIndex(0), uno::UNO_QUERY_THROW );
+ uno::Reference<text::XText> xText = uno::Reference<text::XTextRange>(xShape, uno::UNO_QUERY_THROW)->getText();
+ CPPUNIT_ASSERT_MESSAGE( "not a text shape", xText.is() );
+
+ xDocShRef->DoClose();
+}
+
+#endif
+#endif
+
+void SdImportTest::testBulletSuffix()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/n83889.pptx"), PPTX );
+
+ // check suffix of the char bullet
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pPage->GetObj(0) );
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != nullptr);
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ const SvxNumBulletItem *pNumFmt = aEdit.GetParaAttribs(1).GetItem(EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pNumFmt);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Bullet's suffix is wrong!", pNumFmt->GetNumRule().GetLevel(0).GetSuffix(), OUString() );
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testBnc910045()
+{
+ // Problem with table style which defines cell color with fill style
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc910045.pptx"), PPTX );
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT( pTableObj );
+ uno::Reference< table::XCellRange > xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+ uno::Reference< beans::XPropertySet > xCell;
+ Color nColor;
+
+ xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x4f81bd), nColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testRowHeight()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/n80340.pptx"), PPTX );
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT( pTableObj );
+
+ sal_Int32 nHeight;
+ uno::Reference< css::table::XTable > xTable(pTableObj->getTable(), uno::UNO_SET_THROW);
+ uno::Reference< css::table::XTableRows > xRows( xTable->getRows(), uno::UNO_SET_THROW);
+ uno::Reference< beans::XPropertySet > xRefRow( xRows->getByIndex(0), uno::UNO_QUERY_THROW );
+ xRefRow->getPropertyValue( "Height" ) >>= nHeight;
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(508), nHeight);
+
+ xDocShRef->DoClose();
+
+ sd::DrawDocShellRef xDocShRef2 = loadURL( m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tablescale.pptx"), PPTX );
+ const SdrPage *pPage2 = GetPage( 1, xDocShRef2 );
+
+ sdr::table::SdrTableObj *pTableObj2 = dynamic_cast<sdr::table::SdrTableObj*>(pPage2->GetObj(0));
+ CPPUNIT_ASSERT( pTableObj2 );
+
+ uno::Reference< css::table::XTable > xTable2(pTableObj2->getTable(), uno::UNO_SET_THROW);
+ uno::Reference< css::table::XTableRows > xRows2( xTable2->getRows(), uno::UNO_SET_THROW);
+
+ for(sal_Int32 nRow = 0; nRow < 7; ++nRow)
+ {
+ uno::Reference< beans::XPropertySet > xRefRow2( xRows2->getByIndex(nRow), uno::UNO_QUERY_THROW );
+ xRefRow2->getPropertyValue( "Height" ) >>= nHeight;
+ CPPUNIT_ASSERT_EQUAL( sal_Int32(800), nHeight);
+ }
+
+ xDocShRef2->DoClose();
+}
+
+void SdImportTest::testTdf93830()
+{
+ // Text shape offset was ignored
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf93830.pptx"), PPTX);
+ uno::Reference< drawing::XDrawPage > xPage( getPage( 0, xDocShRef ) );
+
+ // Get the first text box from group shape
+ uno::Reference< container::XIndexAccess > xShape( xPage->getByIndex(0), uno::UNO_QUERY );
+ uno::Reference< beans::XPropertySet > xPropSet( xShape->getByIndex(3), uno::UNO_QUERY );
+ CPPUNIT_ASSERT_MESSAGE( "no textbox shape", xPropSet.is() );
+
+ sal_Int32 nTextLeftDistance = 0;
+ xPropSet->getPropertyValue( "TextLeftDistance" ) >>= nTextLeftDistance;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4152), nTextLeftDistance);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf127129()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf127129.pptx"), PPTX);
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+ uno::Reference< text::XTextRange > xParagraph( getParagraphFromShape( 0, xShape ) );
+ uno::Reference< text::XTextRange > xRun( getRunFromParagraph( 0, xParagraph ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xRun, uno::UNO_QUERY_THROW );
+
+ Color nCharColor;
+ xPropSet->getPropertyValue( "CharColor" ) >>= nCharColor;
+ CPPUNIT_ASSERT_EQUAL( COL_BLACK, nCharColor );
+
+ // Without the accompanying fix in place, the highlight would be -1
+ Color nCharBackColor;
+ xPropSet->getPropertyValue( "CharBackColor" ) >>= nCharBackColor;
+ CPPUNIT_ASSERT_EQUAL( Color(0xFF00), nCharBackColor );
+
+ xDocShRef->DoClose();
+}
+void SdImportTest::testTdf93097()
+{
+ // Throwing metadata import aborted the filter, check that metadata is now imported.
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf93097.pptx"), PPTX);
+ uno::Reference<document::XDocumentPropertiesSupplier> xDocumentPropertiesSupplier(xDocShRef->GetModel(), uno::UNO_QUERY);
+ uno::Reference<document::XDocumentProperties> xDocumentProperties = xDocumentPropertiesSupplier->getDocumentProperties();
+ CPPUNIT_ASSERT_EQUAL(OUString("ss"), xDocumentProperties->getTitle());
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf62255()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf62255.pptx"), PPTX);
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+
+ sdr::table::SdrTableObj *pTableObj;
+ pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT( pTableObj );
+
+ css::uno::Any aAny;
+ uno::Reference< table::XCellRange > xTable;
+ uno::Reference< beans::XPropertySet > xCell;
+ xTable.set(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+ xCell.set(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ aAny = xCell->getPropertyValue("FillStyle");
+
+ if (aAny.hasValue())
+ {
+ drawing::FillStyle aFillStyle;
+ aAny >>= aFillStyle;
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, aFillStyle);
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf89927()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf89927.pptx"), PPTX);
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+ uno::Reference< text::XTextRange > xParagraph( getParagraphFromShape( 0, xShape ) );
+ uno::Reference< text::XTextRange > xRun( getRunFromParagraph( 0, xParagraph ) );
+ uno::Reference< beans::XPropertySet > xPropSet( xRun, uno::UNO_QUERY_THROW );
+
+ Color nCharColor;
+ xPropSet->getPropertyValue( "CharColor" ) >>= nCharColor;
+ CPPUNIT_ASSERT_EQUAL( COL_WHITE, nCharColor );
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest::testTdf103800()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf103800.pptx"), PPTX);
+ uno::Reference< beans::XPropertySet > xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference< text::XTextRange > xParagraph(getParagraphFromShape(0, xShape));
+ uno::Reference< text::XTextRange > xRun(getRunFromParagraph(0, xParagraph));
+ uno::Reference< beans::XPropertySet > xPropSet(xRun, uno::UNO_QUERY_THROW);
+
+ Color nCharColor;
+ xPropSet->getPropertyValue("CharColor") >>= nCharColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xC00000), nCharColor);
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/import-tests2.cxx b/sd/qa/unit/import-tests2.cxx
new file mode 100644
index 000000000..e9f2ce067
--- /dev/null
+++ b/sd/qa/unit/import-tests2.cxx
@@ -0,0 +1,2238 @@
+/* -*- 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 <sdpage.hxx>
+
+#include "sdmodeltestbase.hxx"
+
+#include <editeng/eeitem.hxx>
+#include <editeng/editobj.hxx>
+#include <editeng/numitem.hxx>
+#include <editeng/unoprnms.hxx>
+
+#include <svx/svdotable.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xfilluseslidebackgrounditem.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xflbckit.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/xlnclit.hxx>
+#include <svx/sdooitm.hxx>
+#include <animations/animationnodehelper.hxx>
+
+#include <com/sun/star/awt/XBitmap.hpp>
+#include <com/sun/star/document/XEventsSupplier.hpp>
+#include <com/sun/star/presentation/ClickAction.hpp>
+#include <com/sun/star/presentation/XPresentationPage.hpp>
+#include <com/sun/star/presentation/XPresentationSupplier.hpp>
+#include <com/sun/star/drawing/BitmapMode.hpp>
+#include <com/sun/star/drawing/ColorMode.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/drawing/XGluePointsSupplier.hpp>
+#include <com/sun/star/drawing/GluePoint2.hpp>
+#include <com/sun/star/container/XIdentifierAccess.hpp>
+#include <com/sun/star/animations/XAnimationNodeSupplier.hpp>
+#include <com/sun/star/animations/XAnimate.hpp>
+#include <com/sun/star/chart/DataLabelPlacement.hpp>
+#include <com/sun/star/chart/XChartDocument.hpp>
+#include <com/sun/star/chart2/XChartDocument.hpp>
+#include <com/sun/star/chart2/XDataSeriesContainer.hpp>
+#include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
+#include <com/sun/star/chart2/XChartTypeContainer.hpp>
+#include <com/sun/star/style/ParagraphAdjust.hpp>
+#include <com/sun/star/style/LineSpacing.hpp>
+#include <com/sun/star/style/LineSpacingMode.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/text/GraphicCrop.hpp>
+#include <com/sun/star/text/XTextColumns.hpp>
+#include <com/sun/star/xml/dom/XDocument.hpp>
+
+#include <comphelper/sequenceashashmap.hxx>
+#include <comphelper/graphicmimetype.hxx>
+#include <sfx2/linkmgr.hxx>
+#include <vcl/BitmapReadAccess.hxx>
+#include <vcl/dibtools.hxx>
+
+using namespace ::com::sun::star;
+
+class SdImportTest2 : public SdModelTestBase
+{
+public:
+ virtual void setUp() override;
+
+ void testTdf152186();
+ void testTdf93868();
+ void testTdf95932();
+ void testTdf99030();
+ void testTdf49561();
+ void testTdf103473();
+ void testAoo124143();
+ void testTdf103567();
+ void testTdf103792();
+ void testTdf148685();
+ void testTdf103876();
+ void testTdf79007();
+ void testTdf119649();
+ void testTdf118776();
+ void testTdf129686();
+ void testTdf104015();
+ void testTdf104201();
+ void testTdf103477();
+ void testTdf104445();
+ void testTdf105150();
+ void testTdf105150PPT();
+ void testTdf123684();
+ void testTdf100926();
+ void testTdf89064();
+ void testTdf108925();
+ void testTdf109067();
+ void testTdf109187();
+ void testTdf108926();
+ void testTdf100065();
+ void testTdf90626();
+ void testTdf138148();
+ void testTdf114488();
+ void testTdf134174();
+ void testTdf134210();
+ void testTdf114913();
+ void testTdf114821();
+ void testTdf115394();
+ void testTdf115394PPT();
+ void testTdf51340();
+ void testTdf116899();
+ void testTdf77747();
+ void testTdf116266();
+ void testTdf128684();
+ void testShapeGlowEffectPPTXImpoer();
+ void testShapeBlurPPTXImport();
+ void testMirroredGraphic();
+ void testGreysScaleGraphic();
+ void testTdf134210CropPosition();
+
+ bool checkPattern(sd::DrawDocShellRef const& rDocRef, int nShapeNumber,
+ std::vector<sal_uInt8>& rExpected);
+ void testPatternImport();
+ void testPptCrop();
+ void testTdf149206();
+ void testTdf120028();
+ void testDescriptionImport();
+ void testTdf83247();
+ void testTdf47365();
+ void testTdf122899();
+ void testOOXTheme();
+ void testCropToShape();
+ void testTdf127964();
+ void testTdf106638();
+ void testTdf113198();
+ void testTdf49856();
+ void testTdf103347();
+ void testHyperlinksOnShapes();
+ void testTdf112209();
+ void testTdf128596();
+ void testDefaultTabStop();
+ void testCropToZero();
+ void testTdf144092TableHeight();
+ void testTdf89928BlackWhiteThreshold();
+ void testTdf151547TransparentWhiteText();
+ void testTdf149961AutofitIndentation();
+ void testTdf149588TransparentSolidFill();
+
+ CPPUNIT_TEST_SUITE(SdImportTest2);
+
+ CPPUNIT_TEST(testTdf152186);
+ CPPUNIT_TEST(testTdf93868);
+ CPPUNIT_TEST(testTdf95932);
+ CPPUNIT_TEST(testTdf99030);
+ CPPUNIT_TEST(testTdf49561);
+ CPPUNIT_TEST(testTdf103473);
+ CPPUNIT_TEST(testAoo124143);
+ CPPUNIT_TEST(testTdf103567);
+ CPPUNIT_TEST(testTdf103792);
+ CPPUNIT_TEST(testTdf148685);
+ CPPUNIT_TEST(testTdf103876);
+ CPPUNIT_TEST(testTdf79007);
+ CPPUNIT_TEST(testTdf119649);
+ CPPUNIT_TEST(testTdf118776);
+ CPPUNIT_TEST(testTdf129686);
+ CPPUNIT_TEST(testTdf104015);
+ CPPUNIT_TEST(testTdf104201);
+ CPPUNIT_TEST(testTdf103477);
+ CPPUNIT_TEST(testTdf104445);
+ CPPUNIT_TEST(testTdf105150);
+ CPPUNIT_TEST(testTdf105150PPT);
+ CPPUNIT_TEST(testTdf123684);
+ CPPUNIT_TEST(testTdf100926);
+ CPPUNIT_TEST(testPatternImport);
+ CPPUNIT_TEST(testTdf89064);
+ CPPUNIT_TEST(testTdf108925);
+ CPPUNIT_TEST(testTdf109067);
+ CPPUNIT_TEST(testTdf109187);
+ CPPUNIT_TEST(testTdf108926);
+ CPPUNIT_TEST(testTdf100065);
+ CPPUNIT_TEST(testTdf90626);
+ CPPUNIT_TEST(testTdf138148);
+ CPPUNIT_TEST(testTdf114488);
+ CPPUNIT_TEST(testTdf134174);
+ CPPUNIT_TEST(testTdf134210);
+ CPPUNIT_TEST(testTdf114913);
+ CPPUNIT_TEST(testTdf114821);
+ CPPUNIT_TEST(testTdf115394);
+ CPPUNIT_TEST(testTdf115394PPT);
+ CPPUNIT_TEST(testTdf51340);
+ CPPUNIT_TEST(testTdf116899);
+ CPPUNIT_TEST(testTdf77747);
+ CPPUNIT_TEST(testTdf116266);
+ CPPUNIT_TEST(testPptCrop);
+ CPPUNIT_TEST(testTdf149206);
+ CPPUNIT_TEST(testTdf120028);
+ CPPUNIT_TEST(testDescriptionImport);
+ CPPUNIT_TEST(testTdf83247);
+ CPPUNIT_TEST(testTdf47365);
+ CPPUNIT_TEST(testTdf122899);
+ CPPUNIT_TEST(testOOXTheme);
+ CPPUNIT_TEST(testCropToShape);
+ CPPUNIT_TEST(testTdf127964);
+ CPPUNIT_TEST(testTdf106638);
+ CPPUNIT_TEST(testTdf128684);
+ CPPUNIT_TEST(testTdf113198);
+ CPPUNIT_TEST(testTdf49856);
+ CPPUNIT_TEST(testShapeGlowEffectPPTXImpoer);
+ CPPUNIT_TEST(testShapeBlurPPTXImport);
+ CPPUNIT_TEST(testMirroredGraphic);
+ CPPUNIT_TEST(testGreysScaleGraphic);
+ CPPUNIT_TEST(testTdf134210CropPosition);
+ CPPUNIT_TEST(testTdf103347);
+ CPPUNIT_TEST(testHyperlinksOnShapes);
+ CPPUNIT_TEST(testTdf112209);
+ CPPUNIT_TEST(testTdf128596);
+ CPPUNIT_TEST(testDefaultTabStop);
+ CPPUNIT_TEST(testCropToZero);
+ CPPUNIT_TEST(testTdf144092TableHeight);
+ CPPUNIT_TEST(testTdf89928BlackWhiteThreshold);
+ CPPUNIT_TEST(testTdf151547TransparentWhiteText);
+ CPPUNIT_TEST(testTdf149961AutofitIndentation);
+ CPPUNIT_TEST(testTdf149588TransparentSolidFill);
+
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void SdImportTest2::setUp()
+{
+ SdModelTestBase::setUp();
+ mxDesktop.set(frame::Desktop::create(getComponentContext()));
+}
+
+void SdImportTest2::testTdf152186()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf152186.pptx"), PPTX);
+
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ bool bHasShadow;
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ for (size_t i = 0; i < pPage->GetObjCount(); ++i)
+ {
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(i, 0, xDocShRef));
+ xShape->getPropertyValue("Shadow") >>= bHasShadow;
+ CPPUNIT_ASSERT(!bHasShadow);
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf93868()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf93868.pptx"), PPTX);
+
+ const SdrPage* pPage = &(GetPage(1, xDocShRef)->TRG_GetMasterPage());
+ CPPUNIT_ASSERT_EQUAL(size_t(5), pPage->GetObjCount());
+ CPPUNIT_ASSERT_EQUAL(
+ drawing::FillStyle_SOLID,
+ dynamic_cast<const XFillStyleItem&>(pPage->GetObj(0)->GetMergedItem(XATTR_FILLSTYLE))
+ .GetValue());
+
+ CPPUNIT_ASSERT_EQUAL(
+ drawing::FillStyle_NONE,
+ dynamic_cast<const XFillStyleItem&>(pPage->GetObj(1)->GetMergedItem(XATTR_FILLSTYLE))
+ .GetValue());
+ CPPUNIT_ASSERT_EQUAL(true, dynamic_cast<const XFillUseSlideBackgroundItem&>(
+ pPage->GetObj(1)->GetMergedItem(XATTR_FILLUSESLIDEBACKGROUND))
+ .GetValue());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf95932()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf95932.pptx"), PPTX);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ SdrObject* const pObj = pPage->GetObj(1);
+ CPPUNIT_ASSERT(pObj);
+
+ const XFillStyleItem& rStyleItem
+ = dynamic_cast<const XFillStyleItem&>(pObj->GetMergedItem(XATTR_FILLSTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue());
+ const XFillColorItem& rColorItem
+ = dynamic_cast<const XFillColorItem&>(pObj->GetMergedItem(XATTR_FILLCOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0x76bf3d), rColorItem.GetColorValue());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf99030()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf99030.pptx"), PPTX);
+
+ uno::Reference<drawing::XMasterPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XDrawPage> xPage(xDoc->getMasterPages()->getByIndex(0),
+ uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropSet(xPage, uno::UNO_QUERY);
+
+ Color nFillColor;
+ uno::Any aAny = xPropSet->getPropertyValue("Background");
+ if (aAny.hasValue())
+ {
+ uno::Reference<beans::XPropertySet> xBackgroundPropSet;
+ aAny >>= xBackgroundPropSet;
+ xBackgroundPropSet->getPropertyValue("FillColor") >>= nFillColor;
+ }
+ CPPUNIT_ASSERT_EQUAL(Color(0x676A55), nFillColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf49561()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/ppt/tdf49561.ppt"), PPT);
+
+ uno::Reference<drawing::XMasterPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XDrawPage> xPage(xDoc->getMasterPages()->getByIndex(0),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xPage->getCount());
+
+ uno::Reference<beans::XPropertySet> xShape(getShape(3, xPage));
+ uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xShape));
+ uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
+ uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW);
+
+ float fCharHeight = 0;
+ CPPUNIT_ASSERT(xPropSet->getPropertyValue("CharHeight") >>= fCharHeight);
+ CPPUNIT_ASSERT_EQUAL(12.f, fCharHeight);
+
+ OUString aCharFontName;
+ CPPUNIT_ASSERT(xPropSet->getPropertyValue("CharFontName") >>= aCharFontName);
+ CPPUNIT_ASSERT_EQUAL(OUString("Stencil"), aCharFontName);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf103473()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf103473.pptx"), PPTX);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ SdrTextObj* const pObj = dynamic_cast<SdrTextObj* const>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pObj);
+ ::tools::Rectangle aRect = pObj->GetGeoRect();
+ CPPUNIT_ASSERT_EQUAL(tools::Long(3629), aRect.Left());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(4431), aRect.Top());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(8353), aRect.Right());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(9155), aRect.Bottom());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testAoo124143()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odg/ooo124143-1.odg"), ODG);
+
+ uno::Reference<beans::XPropertySet> const xImage(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<drawing::XGluePointsSupplier> const xGPS(xImage, uno::UNO_QUERY);
+ uno::Reference<container::XIdentifierAccess> const xGluePoints(xGPS->getGluePoints(),
+ uno::UNO_QUERY);
+
+ uno::Sequence<sal_Int32> const ids(xGluePoints->getIdentifiers());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(6), ids.getLength());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), ids[0]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ids[1]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), ids[2]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), ids[3]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), ids[4]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), ids[5]);
+
+ // interesting ones are custom 4, 5
+ drawing::GluePoint2 glue4;
+ xGluePoints->getByIdentifier(4) >>= glue4;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2470), glue4.Position.X);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(-1810), glue4.Position.Y);
+
+ drawing::GluePoint2 glue5;
+ xGluePoints->getByIdentifier(5) >>= glue5;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(-2975), glue5.Position.X);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(-2165), glue5.Position.Y);
+
+ // now check connectors
+ uno::Reference<beans::XPropertySet> const xEllipse(getShapeFromPage(1, 0, xDocShRef));
+ uno::Reference<beans::XPropertySet> const xConn1(getShapeFromPage(2, 0, xDocShRef));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1),
+ xConn1->getPropertyValue("StartGluePointIndex").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(
+ xEllipse,
+ xConn1->getPropertyValue("StartShape").get<uno::Reference<beans::XPropertySet>>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4),
+ xConn1->getPropertyValue("EndGluePointIndex").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(
+ xImage, xConn1->getPropertyValue("EndShape").get<uno::Reference<beans::XPropertySet>>());
+ uno::Reference<beans::XPropertySet> const xConn2(getShapeFromPage(3, 0, xDocShRef));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3),
+ xConn2->getPropertyValue("StartGluePointIndex").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(
+ xEllipse,
+ xConn2->getPropertyValue("StartShape").get<uno::Reference<beans::XPropertySet>>());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5),
+ xConn2->getPropertyValue("EndGluePointIndex").get<sal_Int32>());
+ CPPUNIT_ASSERT_EQUAL(
+ xImage, xConn2->getPropertyValue("EndShape").get<uno::Reference<beans::XPropertySet>>());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf103567()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf103567.odp"), ODP);
+ for (int i = 0; i < 4; ++i)
+ {
+ uno::Reference<beans::XPropertySet> const xShape(getShapeFromPage(i, 0, xDocShRef));
+ uno::Reference<document::XEventsSupplier> const xEventsSupplier(xShape, uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> const xEvents(xEventsSupplier->getEvents());
+ OString const msg("shape " + OString::number(i) + ": ");
+
+ CPPUNIT_ASSERT(xEvents->hasByName("OnClick"));
+ uno::Sequence<beans::PropertyValue> props;
+ xEvents->getByName("OnClick") >>= props;
+ comphelper::SequenceAsHashMap const map(props);
+ {
+ auto iter(map.find("EventType"));
+ CPPUNIT_ASSERT_MESSAGE(OString(msg + "no EventType").getStr(), iter != map.end());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.getStr(), OUString("Presentation"),
+ iter->second.get<OUString>());
+ }
+ {
+ auto iter(map.find("ClickAction"));
+ CPPUNIT_ASSERT_MESSAGE(OString(msg + "no ClickAction").getStr(), iter != map.end());
+ if (i % 2 == 0)
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.getStr(), css::presentation::ClickAction_DOCUMENT,
+ iter->second.get<css::presentation::ClickAction>());
+ }
+ else
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.getStr(), css::presentation::ClickAction_NEXTPAGE,
+ iter->second.get<css::presentation::ClickAction>());
+ }
+ }
+ if (i % 2 == 0)
+ {
+ auto iter(map.find("Bookmark"));
+ CPPUNIT_ASSERT_MESSAGE(OString(msg + "no Bookmark").getStr(), iter != map.end());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.getStr(), OUString("http://example.com/"),
+ iter->second.get<OUString>());
+ }
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf103792()
+{
+ // Title text shape on the actual slide contained no text neither a placeholder text.
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf103792.pptx"), PPTX);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ CPPUNIT_ASSERT_MESSAGE("No page found", pPage != nullptr);
+ SdrObject* pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("Wrong object", pObj != nullptr);
+ SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pObj);
+ CPPUNIT_ASSERT_MESSAGE("Not a text object", pTxtObj != nullptr);
+
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ CPPUNIT_ASSERT_EQUAL(OUString("Click to add Title"), aEdit.GetText(0));
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf148685()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf148685.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(1, 0, xDocShRef));
+
+ uno::Reference<text::XTextRange> const xParagraph(getParagraphFromShape(0, xShape));
+
+ uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
+ CPPUNIT_ASSERT_EQUAL(OUString("TEXT "), xRun->getString());
+
+ uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW);
+
+ Color nCharUnderlineColor;
+ xPropSet->getPropertyValue("CharUnderlineColor") >>= nCharUnderlineColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xA1467E), nCharUnderlineColor);
+
+ xRun.set(getRunFromParagraph(1, xParagraph));
+
+ CPPUNIT_ASSERT_EQUAL(OUString("TE"), xRun->getString());
+
+ xPropSet.set(xRun, uno::UNO_QUERY_THROW);
+
+ xPropSet->getPropertyValue("CharUnderlineColor") >>= nCharUnderlineColor;
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: Color: R:255 G:255 B:255 A:255
+ // - Actual : Color: R:161 G:70 B:126 A:0
+ CPPUNIT_ASSERT_EQUAL(COL_AUTO, nCharUnderlineColor);
+
+ xRun.set(getRunFromParagraph(2, xParagraph));
+ CPPUNIT_ASSERT_EQUAL(OUString("XT"), xRun->getString());
+
+ xPropSet.set(xRun, uno::UNO_QUERY_THROW);
+
+ xPropSet->getPropertyValue("CharUnderlineColor") >>= nCharUnderlineColor;
+ CPPUNIT_ASSERT_EQUAL(COL_AUTO, nCharUnderlineColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf103876()
+{
+ // Title text shape's placeholder text did not inherit the corresponding text properties
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf103876.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+
+ // Check paragraph alignment
+ sal_Int16 nParaAdjust = 0;
+ xShape->getPropertyValue("ParaAdjust") >>= nParaAdjust;
+ CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_CENTER,
+ static_cast<style::ParagraphAdjust>(nParaAdjust));
+
+ // Check character color
+ Color nCharColor;
+ xShape->getPropertyValue("CharColor") >>= nCharColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), nCharColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf79007()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf79007.pptx"), PPTX);
+
+ uno::Reference<beans::XPropertySet> xShape1(getShapeFromPage(0, 0, xDocShRef));
+ CPPUNIT_ASSERT_MESSAGE("Not a shape", xShape1.is());
+
+ // Check we map mso washout to our watermark
+ drawing::ColorMode aColorMode1;
+ xShape1->getPropertyValue("GraphicColorMode") >>= aColorMode1;
+ CPPUNIT_ASSERT_EQUAL(drawing::ColorMode_WATERMARK, aColorMode1);
+
+ sal_Int16 nContrast1;
+ xShape1->getPropertyValue("AdjustContrast") >>= nContrast1;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(0), nContrast1);
+
+ sal_Int16 nLuminance1;
+ xShape1->getPropertyValue("AdjustLuminance") >>= nLuminance1;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(0), nLuminance1);
+
+ uno::Reference<beans::XPropertySet> xShape2(getShapeFromPage(1, 0, xDocShRef));
+ CPPUNIT_ASSERT_MESSAGE("Not a shape", xShape2.is());
+
+ // Check we map mso grayscale to our grayscale
+ drawing::ColorMode aColorMode2;
+ xShape2->getPropertyValue("GraphicColorMode") >>= aColorMode2;
+ CPPUNIT_ASSERT_EQUAL(drawing::ColorMode_GREYS, aColorMode2);
+
+ sal_Int16 nContrast2;
+ xShape2->getPropertyValue("AdjustContrast") >>= nContrast2;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(0), nContrast2);
+
+ sal_Int16 nLuminance2;
+ xShape2->getPropertyValue("AdjustLuminance") >>= nLuminance2;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(0), nLuminance2);
+
+ uno::Reference<beans::XPropertySet> xShape3(getShapeFromPage(2, 0, xDocShRef));
+ CPPUNIT_ASSERT_MESSAGE("Not a shape", xShape3.is());
+
+ // Check we map mso black/white to our black/white
+ drawing::ColorMode aColorMode3;
+ xShape3->getPropertyValue("GraphicColorMode") >>= aColorMode3;
+ CPPUNIT_ASSERT_EQUAL(drawing::ColorMode_MONO, aColorMode3);
+
+ sal_Int16 nContrast3;
+ xShape3->getPropertyValue("AdjustContrast") >>= nContrast3;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(0), nContrast3);
+
+ sal_Int16 nLuminance3;
+ xShape3->getPropertyValue("AdjustLuminance") >>= nLuminance3;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(0), nLuminance3);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf119649()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf119649.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(1, 0, xDocShRef));
+
+ // Get first paragraph of the text
+ uno::Reference<text::XTextRange> const xParagraph(getParagraphFromShape(0, xShape));
+
+ uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
+ CPPUNIT_ASSERT_EQUAL(OUString("default_color("), xRun->getString());
+
+ uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW);
+
+ Color nCharColor;
+ xPropSet->getPropertyValue("CharColor") >>= nCharColor;
+ CPPUNIT_ASSERT_EQUAL(COL_AUTO, nCharColor);
+
+ xRun.set(getRunFromParagraph(1, xParagraph));
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: colored_text
+ // - Actual : colored_text)
+ CPPUNIT_ASSERT_EQUAL(OUString("colored_text"), xRun->getString());
+
+ xPropSet.set(xRun, uno::UNO_QUERY_THROW);
+
+ xPropSet->getPropertyValue("CharColor") >>= nCharColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xCE181E), nCharColor);
+
+ xRun.set(getRunFromParagraph(2, xParagraph));
+ CPPUNIT_ASSERT_EQUAL(OUString(")"), xRun->getString());
+
+ xPropSet.set(xRun, uno::UNO_QUERY_THROW);
+
+ xPropSet->getPropertyValue("CharColor") >>= nCharColor;
+ CPPUNIT_ASSERT_EQUAL(COL_AUTO, nCharColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf118776()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf118776.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+
+ // Get first paragraph of the text
+ uno::Reference<text::XTextRange> const xParagraph(getParagraphFromShape(0, xShape));
+
+ // Get first run of the paragraph
+ uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
+ uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW);
+ sal_Int16 nTransparency = 0;
+ xPropSet->getPropertyValue("CharTransparence") >>= nTransparency;
+
+ // Import noFill color as 99% transparency
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(99), nTransparency);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf129686()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf129686.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+
+ // Get first paragraph of the text
+ uno::Reference<text::XTextRange> const xParagraph(getParagraphFromShape(0, xShape));
+
+ // Get first run of the paragraph
+ uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
+ uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW);
+ sal_Int16 nTransparency = 0;
+ xPropSet->getPropertyValue("CharTransparence") >>= nTransparency;
+
+ // 0 = no transparency, 100 (default) = completely transparent (unless COL_AUTO)
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(0), nTransparency);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf104015()
+{
+ // Shape fill, line and effect properties were not inherited from master slide shape
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf104015.pptx"), PPTX);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ CPPUNIT_ASSERT_MESSAGE("No page found", pPage != nullptr);
+ SdrObject* const pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("Wrong object", pObj != nullptr);
+ // Should have a red fill color
+ {
+ const XFillStyleItem& rStyleItem
+ = dynamic_cast<const XFillStyleItem&>(pObj->GetMergedItem(XATTR_FILLSTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue());
+ const XFillColorItem& rColorItem
+ = dynamic_cast<const XFillColorItem&>(pObj->GetMergedItem(XATTR_FILLCOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), rColorItem.GetColorValue());
+ }
+ // Should have a blue line
+ {
+ const XLineStyleItem& rStyleItem
+ = dynamic_cast<const XLineStyleItem&>(pObj->GetMergedItem(XATTR_LINESTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::LineStyle_SOLID, rStyleItem.GetValue());
+
+ const XLineColorItem& rColorItem
+ = dynamic_cast<const XLineColorItem&>(pObj->GetMergedItem(XATTR_LINECOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0x0000FF), rColorItem.GetColorValue());
+ }
+ // Should have some shadow
+ {
+ const SdrOnOffItem& rShadowItem
+ = dynamic_cast<const SdrOnOffItem&>(pObj->GetMergedItem(SDRATTR_SHADOW));
+ CPPUNIT_ASSERT(rShadowItem.GetValue());
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf104201()
+{
+ // Group shape properties did not overwrite the child shapes' fill
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf104201.pptx"), PPTX);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ CPPUNIT_ASSERT_MESSAGE("No page found", pPage != nullptr);
+
+ // First shape has red fill, but this should be overwritten by green group fill
+ {
+ SdrObject* const pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("Wrong object", pObj != nullptr);
+ const XFillStyleItem& rStyleItem
+ = dynamic_cast<const XFillStyleItem&>(pObj->GetMergedItem(XATTR_FILLSTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue());
+ const XFillColorItem& rColorItem
+ = dynamic_cast<const XFillColorItem&>(pObj->GetMergedItem(XATTR_FILLCOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0x00FF00), rColorItem.GetColorValue());
+ }
+ // Second shape has blue fill, but this should be overwritten by green group fill
+ {
+ SdrObject* const pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("Wrong object", pObj != nullptr);
+ const XFillStyleItem& rStyleItem
+ = dynamic_cast<const XFillStyleItem&>(pObj->GetMergedItem(XATTR_FILLSTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue());
+ const XFillColorItem& rColorItem
+ = dynamic_cast<const XFillColorItem&>(pObj->GetMergedItem(XATTR_FILLCOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0x00FF00), rColorItem.GetColorValue());
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf103477()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf103477.pptx"), PPTX);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+
+ SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(6));
+ CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
+
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pNumFmt);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Bullet's color is wrong!", Color(0x000000),
+ pNumFmt->GetNumRule().GetLevel(1).GetBulletColor());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf105150()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf105150.pptx"), PPTX);
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ const SdrObject* pObj = pPage->GetObj(1);
+ auto& rFillStyleItem
+ = dynamic_cast<const XFillStyleItem&>(pObj->GetMergedItem(XATTR_FILLSTYLE));
+ // This was drawing::FillStyle_NONE, <p:sp useBgFill="1"> was ignored when
+ // the slide didn't have an explicit background fill.
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue());
+ auto& rFillBackgroundItem = dynamic_cast<const XFillUseSlideBackgroundItem&>(
+ pObj->GetMergedItem(XATTR_FILLUSESLIDEBACKGROUND));
+ CPPUNIT_ASSERT_EQUAL(true, rFillBackgroundItem.GetValue());
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf123684()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf123684.pptx"), PPTX);
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ const SdrObject* pObj = pPage->GetObj(0);
+ auto& rFillStyleItem
+ = dynamic_cast<const XFillStyleItem&>(pObj->GetMergedItem(XATTR_FILLSTYLE));
+ // Without the accompanying fix in place, this test would have failed with 'Expected: 0; Actual:
+ // 1', i.e. the shape's fill was FillStyle_SOLID, making the text of the shape unreadable.
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue());
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf105150PPT()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/ppt/tdf105150.ppt"), PPT);
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ const SdrObject* pObj = pPage->GetObj(1);
+ // This was drawing::FillStyle_NONE, the shape's mso_fillBackground was
+ // ignored when the slide didn't have an explicit background fill.
+ auto& rFillStyleItem
+ = dynamic_cast<const XFillStyleItem&>(pObj->GetMergedItem(XATTR_FILLSTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rFillStyleItem.GetValue());
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf104445()
+{
+ // Extra bullets were added to the first shape
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf104445.pptx"), PPTX);
+
+ // First shape should not have bullet
+ {
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<text::XText> xText
+ = uno::Reference<text::XTextRange>(xShape, uno::UNO_QUERY_THROW)->getText();
+ CPPUNIT_ASSERT_MESSAGE("Not a text shape", xText.is());
+ uno::Reference<beans::XPropertySet> xPropSet(xText, uno::UNO_QUERY_THROW);
+
+ uno::Reference<container::XIndexAccess> xNumRule;
+ xPropSet->getPropertyValue("NumberingRules") >>= xNumRule;
+ uno::Sequence<beans::PropertyValue> aBulletProps;
+ xNumRule->getByIndex(0) >>= aBulletProps;
+
+ for (beans::PropertyValue const& rProp : std::as_const(aBulletProps))
+ {
+ if (rProp.Name == "NumberingType")
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(style::NumberingType::NUMBER_NONE),
+ rProp.Value.get<sal_Int16>());
+ if (rProp.Name == "LeftMargin")
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), rProp.Value.get<sal_Int32>());
+ }
+ }
+ // Second shape should have bullet set
+ {
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(1, 0, xDocShRef));
+ uno::Reference<text::XText> xText
+ = uno::Reference<text::XTextRange>(xShape, uno::UNO_QUERY_THROW)->getText();
+ CPPUNIT_ASSERT_MESSAGE("Not a text shape", xText.is());
+ uno::Reference<beans::XPropertySet> xPropSet(xText, uno::UNO_QUERY_THROW);
+
+ uno::Reference<container::XIndexAccess> xNumRule;
+ xPropSet->getPropertyValue("NumberingRules") >>= xNumRule;
+ uno::Sequence<beans::PropertyValue> aBulletProps;
+ xNumRule->getByIndex(0) >>= aBulletProps;
+
+ for (beans::PropertyValue const& rProp : std::as_const(aBulletProps))
+ {
+ if (rProp.Name == "NumberingType")
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(style::NumberingType::CHAR_SPECIAL),
+ rProp.Value.get<sal_Int16>());
+ if (rProp.Name == "LeftMargin")
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(635), rProp.Value.get<sal_Int32>());
+ }
+ }
+ xDocShRef->DoClose();
+}
+
+namespace
+{
+bool checkPatternValues(std::vector<sal_uInt8>& rExpected, Bitmap& rBitmap)
+{
+ bool bResult = true;
+
+ const Color aFGColor(0xFF0000);
+ const Color aBGColor(0xFFFFFF);
+
+ Bitmap::ScopedReadAccess pAccess(rBitmap);
+ for (tools::Long y = 0; y < pAccess->Height(); ++y)
+ {
+ Scanline pScanline = pAccess->GetScanline(y);
+ for (tools::Long x = 0; x < pAccess->Width(); ++x)
+ {
+ Color aColor = pAccess->GetPixelFromData(pScanline, x);
+ sal_uInt8 aValue = rExpected[y * 8 + x];
+
+ if (aValue == 1 && aColor != aFGColor)
+ bResult = false;
+ else if (aValue == 0 && aColor != aBGColor)
+ bResult = false;
+ }
+ }
+
+ return bResult;
+}
+
+} // end anonymous namespace
+
+bool SdImportTest2::checkPattern(sd::DrawDocShellRef const& rDocRef, int nShapeNumber,
+ std::vector<sal_uInt8>& rExpected)
+{
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(nShapeNumber, 0, rDocRef));
+ CPPUNIT_ASSERT_MESSAGE("Not a shape", xShape.is());
+
+ Bitmap aBitmap;
+ if (xShape.is())
+ {
+ uno::Any aBitmapAny = xShape->getPropertyValue("FillBitmap");
+ uno::Reference<awt::XBitmap> xBitmap;
+ if (aBitmapAny >>= xBitmap)
+ {
+ uno::Sequence<sal_Int8> aBitmapSequence(xBitmap->getDIB());
+ SvMemoryStream aBitmapStream(aBitmapSequence.getArray(), aBitmapSequence.getLength(),
+ StreamMode::READ);
+ ReadDIB(aBitmap, aBitmapStream, true);
+ }
+ }
+ CPPUNIT_ASSERT_EQUAL(tools::Long(8), aBitmap.GetSizePixel().Width());
+ CPPUNIT_ASSERT_EQUAL(tools::Long(8), aBitmap.GetSizePixel().Height());
+ return checkPatternValues(rExpected, aBitmap);
+}
+
+/* Test checks that importing a PPT file with all supported fill patterns is
+ * correctly imported as a tiled fill bitmap with the expected pattern.
+ */
+void SdImportTest2::testPatternImport()
+{
+ sd::DrawDocShellRef xDocRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/ppt/FillPatterns.ppt"), PPT);
+
+ std::vector<sal_uInt8> aExpectedPattern1 = {
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+ std::vector<sal_uInt8> aExpectedPattern2 = {
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+ std::vector<sal_uInt8> aExpectedPattern3 = {
+ 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+ std::vector<sal_uInt8> aExpectedPattern4 = {
+ 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0,
+ };
+ std::vector<sal_uInt8> aExpectedPattern5 = {
+ 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0,
+ 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPattern6 = {
+ 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0,
+ 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1,
+ 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPattern7 = {
+ 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0,
+ 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1,
+ 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPattern8 = {
+ 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0,
+ 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1,
+ 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPattern9 = {
+ 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1,
+ 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1,
+ 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPattern10 = {
+ 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPattern11 = {
+ 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPattern12 = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPatternLine1 = {
+ 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
+ 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPatternLine2 = {
+ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1,
+ 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0,
+ 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ };
+ std::vector<sal_uInt8> aExpectedPatternLine3 = {
+ 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0,
+ 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0,
+ 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPatternLine4 = {
+ 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1,
+ 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0,
+ 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPatternLine5 = {
+ 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPatternLine6 = {
+ 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1,
+ 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1,
+ 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPatternLine7 = {
+ 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0,
+ 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ };
+ std::vector<sal_uInt8> aExpectedPatternLine8 = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+ std::vector<sal_uInt8> aExpectedPatternLine9 = {
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+ };
+ std::vector<sal_uInt8> aExpectedPatternLine10 = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+ std::vector<sal_uInt8> aExpectedPatternLine11 = {
+ 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
+ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0,
+ 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0,
+ };
+ std::vector<sal_uInt8> aExpectedPatternLine12 = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+
+ CPPUNIT_ASSERT_MESSAGE("Pattern1 - 5%", checkPattern(xDocRef, 0, aExpectedPattern1));
+ CPPUNIT_ASSERT_MESSAGE("Pattern2 - 10%", checkPattern(xDocRef, 1, aExpectedPattern2));
+ CPPUNIT_ASSERT_MESSAGE("Pattern3 - 20%", checkPattern(xDocRef, 2, aExpectedPattern3));
+ CPPUNIT_ASSERT_MESSAGE("Pattern4 - 25%", checkPattern(xDocRef, 3, aExpectedPattern4));
+ CPPUNIT_ASSERT_MESSAGE("Pattern5 - 30%", checkPattern(xDocRef, 4, aExpectedPattern5));
+ CPPUNIT_ASSERT_MESSAGE("Pattern6 - 40%", checkPattern(xDocRef, 5, aExpectedPattern6));
+ CPPUNIT_ASSERT_MESSAGE("Pattern7 - 50%", checkPattern(xDocRef, 6, aExpectedPattern7));
+ CPPUNIT_ASSERT_MESSAGE("Pattern8 - 60%", checkPattern(xDocRef, 7, aExpectedPattern8));
+ CPPUNIT_ASSERT_MESSAGE("Pattern9 - 70%", checkPattern(xDocRef, 8, aExpectedPattern9));
+ CPPUNIT_ASSERT_MESSAGE("Pattern10 - 75%", checkPattern(xDocRef, 9, aExpectedPattern10));
+ CPPUNIT_ASSERT_MESSAGE("Pattern11 - 80%", checkPattern(xDocRef, 10, aExpectedPattern11));
+ CPPUNIT_ASSERT_MESSAGE("Pattern12 - 90%", checkPattern(xDocRef, 11, aExpectedPattern12));
+
+ CPPUNIT_ASSERT_MESSAGE("Pattern13 - Light downward diagonal",
+ checkPattern(xDocRef, 12, aExpectedPatternLine1));
+ CPPUNIT_ASSERT_MESSAGE("Pattern14 - Light upward diagonal",
+ checkPattern(xDocRef, 13, aExpectedPatternLine2));
+ CPPUNIT_ASSERT_MESSAGE("Pattern15 - Dark downward diagonal",
+ checkPattern(xDocRef, 14, aExpectedPatternLine3));
+ CPPUNIT_ASSERT_MESSAGE("Pattern16 - Dark upward diagonal",
+ checkPattern(xDocRef, 15, aExpectedPatternLine4));
+ CPPUNIT_ASSERT_MESSAGE("Pattern17 - Wide downward diagonal",
+ checkPattern(xDocRef, 16, aExpectedPatternLine5));
+ CPPUNIT_ASSERT_MESSAGE("Pattern18 - Wide upward diagonal",
+ checkPattern(xDocRef, 17, aExpectedPatternLine6));
+
+ CPPUNIT_ASSERT_MESSAGE("Pattern19 - Light vertical",
+ checkPattern(xDocRef, 18, aExpectedPatternLine7));
+ CPPUNIT_ASSERT_MESSAGE("Pattern20 - Light horizontal",
+ checkPattern(xDocRef, 19, aExpectedPatternLine8));
+ CPPUNIT_ASSERT_MESSAGE("Pattern21 - Narrow vertical",
+ checkPattern(xDocRef, 20, aExpectedPatternLine9));
+ CPPUNIT_ASSERT_MESSAGE("Pattern22 - Narrow horizontal",
+ checkPattern(xDocRef, 21, aExpectedPatternLine10));
+ CPPUNIT_ASSERT_MESSAGE("Pattern23 - Dark vertical",
+ checkPattern(xDocRef, 22, aExpectedPatternLine11));
+ CPPUNIT_ASSERT_MESSAGE("Pattern24 - Dark horizontal",
+ checkPattern(xDocRef, 23, aExpectedPatternLine12));
+
+ // TODO: other patterns in the test document
+
+ xDocRef->DoClose();
+}
+
+void SdImportTest2::testTdf100926()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf100926.pptx"), PPTX);
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ CPPUNIT_ASSERT(pPage != nullptr);
+
+ sdr::table::SdrTableObj* pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pTableObj != nullptr);
+ uno::Reference<table::XCellRange> xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+
+ sal_Int32 nRotation = 0;
+ uno::Reference<beans::XPropertySet> xCell(xTable->getCellByPosition(0, 0),
+ uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("RotateAngle") >>= nRotation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(27000), nRotation);
+
+ xCell.set(xTable->getCellByPosition(1, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("RotateAngle") >>= nRotation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(9000), nRotation);
+
+ xCell.set(xTable->getCellByPosition(2, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("RotateAngle") >>= nRotation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nRotation);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf89064()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf89064.pptx"), PPTX);
+ uno::Reference<presentation::XPresentationPage> xPage(getPage(0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XDrawPage> xNotesPage(xPage->getNotesPage(), uno::UNO_SET_THROW);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), xNotesPage->getCount());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf108925()
+{
+ // Test document contains bulleting with too small bullet size (1%) which breaks the lower constraint
+ // So it should be converted to the lowest allowed value (25%).
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/tdf108925.odp"), ODP);
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr);
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+
+ const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pNumFmt);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(25), pNumFmt->GetNumRule().GetLevel(0).GetBulletRelSize());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf109067()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf109067.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_SET_THROW);
+ awt::Gradient gradient;
+ CPPUNIT_ASSERT(xShape->getPropertyValue("FillGradient") >>= gradient);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(450), gradient.Angle);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf109187()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf109187.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xArrow1(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_SET_THROW);
+ awt::Gradient aGradient1;
+ CPPUNIT_ASSERT(xArrow1->getPropertyValue("FillGradient") >>= aGradient1);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2250), aGradient1.Angle);
+ uno::Reference<beans::XPropertySet> xArrow2(getShapeFromPage(1, 0, xDocShRef),
+ uno::UNO_SET_THROW);
+ awt::Gradient aGradient2;
+ CPPUNIT_ASSERT(xArrow2->getPropertyValue("FillGradient") >>= aGradient2);
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(1350), aGradient2.Angle);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf108926()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf108926.ppt"), PPT);
+ uno::Reference<presentation::XPresentationPage> xPage(getPage(0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XDrawPage> xNotesPage(xPage->getNotesPage(), uno::UNO_SET_THROW);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), xNotesPage->getCount());
+
+ // Second object should be imported as an empty presentation shape
+ uno::Reference<beans::XPropertySet> xPresentationShape(xNotesPage->getByIndex(1),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPresentationShape.is());
+ bool bIsEmptyPresObject = false;
+ xPresentationShape->getPropertyValue("IsEmptyPresentationObject") >>= bIsEmptyPresObject;
+ CPPUNIT_ASSERT(bIsEmptyPresObject);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf100065()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf100065.pptx"), PPTX);
+
+ uno::Reference<container::XIndexAccess> xGroupShape1(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xShape1(xGroupShape1->getByIndex(1), uno::UNO_QUERY_THROW);
+ sal_Int32 nAngle1;
+ CPPUNIT_ASSERT(xShape1->getPropertyValue("RotateAngle") >>= nAngle1);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), nAngle1);
+
+ uno::Reference<container::XIndexAccess> xGroupShape2(getShapeFromPage(1, 0, xDocShRef),
+ uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xShape2(xGroupShape2->getByIndex(0), uno::UNO_QUERY_THROW);
+ sal_Int32 nAngle2;
+ CPPUNIT_ASSERT(xShape2->getPropertyValue("RotateAngle") >>= nAngle2);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(18000), nAngle2);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf90626()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf90626.pptx"), PPTX);
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(1));
+ CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr);
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ for (int i = 0; i < 4; i++)
+ {
+ const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(i).GetItem(EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pNumFmt);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(tools::Long(372),
+ pNumFmt->GetNumRule().GetLevel(0).GetGraphicSize().getHeight(),
+ tools::Long(1));
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf138148()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf138148.pptx"), PPTX);
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr);
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ for (int i = 0; i < 2; i++)
+ {
+ const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(i).GetItem(EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pNumFmt);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(tools::Long(444),
+ pNumFmt->GetNumRule().GetLevel(0).GetGraphicSize().getHeight(),
+ tools::Long(1));
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: 148
+ // - Actual : 444
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(tools::Long(148),
+ pNumFmt->GetNumRule().GetLevel(0).GetGraphicSize().getWidth(),
+ tools::Long(1));
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf114488()
+{
+ // This doc has two images - one WMF and the other PNG (fallback image).
+ // When loading this doc, the WMF image should be preferred over the PNG image.
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odg/tdf114488.fodg"), FODG);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_SET_THROW);
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShape->getPropertyValue("Graphic") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+ OUString sMimeType(comphelper::GraphicMimeTypeHelper::GetMimeTypeForXGraphic(xGraphic));
+ CPPUNIT_ASSERT_EQUAL(OUString("image/x-wmf"), sMimeType);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf134174()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf134174.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_SET_THROW);
+ CPPUNIT_ASSERT(xShape.is());
+
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShape->getPropertyValue("FillBitmap") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+
+ Graphic aGraphic(xGraphic);
+ BitmapEx aBitmap(aGraphic.GetBitmapEx());
+ CPPUNIT_ASSERT_EQUAL(Color(0x8b21db), aBitmap.GetPixelColor(0, 0));
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf134210()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf134210.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_SET_THROW);
+ CPPUNIT_ASSERT(xShape.is());
+
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShape->getPropertyValue("FillBitmap") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+
+ Graphic aGraphic(xGraphic);
+ BitmapEx aBitmap(aGraphic.GetBitmapEx());
+ CPPUNIT_ASSERT_EQUAL(Color(0x605741), aBitmap.GetPixelColor(0, 0));
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf114913()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf114913.pptx"), PPTX);
+ SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(GetPage(1, xDocShRef)->GetObj(1));
+ CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr);
+ const SvxNumBulletItem* pItem
+ = pTxtObj->GetOutlinerParaObject()->GetTextObject().GetParaAttribs(0).GetItem(
+ EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pItem);
+ CPPUNIT_ASSERT_EQUAL(tools::Long(692),
+ pItem->GetNumRule().GetLevel(0).GetGraphicSize().getHeight());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf114821()
+{
+ css::uno::Any aAny;
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf114821.pptx"), PPTX);
+
+ uno::Reference<beans::XPropertySet> xPropSet(getShapeFromPage(0, 0, xDocShRef));
+ aAny = xPropSet->getPropertyValue("Model");
+ CPPUNIT_ASSERT_MESSAGE("The shape doesn't have the property", aAny.hasValue());
+
+ uno::Reference<chart::XChartDocument> xChartDoc;
+ aAny >>= xChartDoc;
+ CPPUNIT_ASSERT_MESSAGE("failed to load chart", xChartDoc.is());
+ uno::Reference<chart2::XChartDocument> xChart2Doc(xChartDoc, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_MESSAGE("failed to load chart", xChart2Doc.is());
+
+ uno::Reference<chart2::XCoordinateSystemContainer> xBCooSysCnt(xChart2Doc->getFirstDiagram(),
+ uno::UNO_QUERY);
+ uno::Sequence<uno::Reference<chart2::XCoordinateSystem>> aCooSysSeq(
+ xBCooSysCnt->getCoordinateSystems());
+ uno::Reference<chart2::XChartTypeContainer> xCTCnt(aCooSysSeq[0], uno::UNO_QUERY);
+
+ uno::Reference<chart2::XDataSeriesContainer> xDSCnt(xCTCnt->getChartTypes()[0], uno::UNO_QUERY);
+ CPPUNIT_ASSERT_MESSAGE("failed to load data series", xDSCnt.is());
+ uno::Sequence<uno::Reference<chart2::XDataSeries>> aSeriesSeq(xDSCnt->getDataSeries());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Invalid Series count", static_cast<sal_Int32>(1),
+ aSeriesSeq.getLength());
+
+ // These Labels have custom position, so the exported LabelPlacement (reference point) by MSO is OUTSIDE/OUTEND
+ // Check the first label
+ const css::uno::Reference<css::beans::XPropertySet>& rPropSet0(
+ aSeriesSeq[0]->getDataPointByIndex(0));
+ CPPUNIT_ASSERT(rPropSet0.is());
+ sal_Int32 aPlacement;
+ rPropSet0->getPropertyValue("LabelPlacement") >>= aPlacement;
+ CPPUNIT_ASSERT_EQUAL(css::chart::DataLabelPlacement::OUTSIDE, aPlacement);
+
+ // Check the second label
+ const css::uno::Reference<css::beans::XPropertySet>& rPropSet1(
+ aSeriesSeq[0]->getDataPointByIndex(1));
+ CPPUNIT_ASSERT(rPropSet1.is());
+ rPropSet1->getPropertyValue("LabelPlacement") >>= aPlacement;
+ CPPUNIT_ASSERT_EQUAL(css::chart::DataLabelPlacement::OUTSIDE, aPlacement);
+
+ // Check the third label
+ const css::uno::Reference<css::beans::XPropertySet>& rPropSet2(
+ aSeriesSeq[0]->getDataPointByIndex(2));
+ CPPUNIT_ASSERT(rPropSet2.is());
+ rPropSet2->getPropertyValue("LabelPlacement") >>= aPlacement;
+ CPPUNIT_ASSERT_EQUAL(css::chart::DataLabelPlacement::OUTSIDE, aPlacement);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf115394()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf115394.pptx"), PPTX);
+ double fTransitionDuration;
+
+ // Slow in MS formats
+ SdPage* pPage1 = xDocShRef->GetDoc()->GetSdPage(0, PageKind::Standard);
+ fTransitionDuration = pPage1->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(1.0, fTransitionDuration);
+
+ // Medium in MS formats
+ SdPage* pPage2 = xDocShRef->GetDoc()->GetSdPage(1, PageKind::Standard);
+ fTransitionDuration = pPage2->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.75, fTransitionDuration);
+
+ // Fast in MS formats
+ SdPage* pPage3 = xDocShRef->GetDoc()->GetSdPage(2, PageKind::Standard);
+ fTransitionDuration = pPage3->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.5, fTransitionDuration);
+
+ // Custom values
+ SdPage* pPage4 = xDocShRef->GetDoc()->GetSdPage(3, PageKind::Standard);
+ fTransitionDuration = pPage4->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.25, fTransitionDuration);
+
+ SdPage* pPage5 = xDocShRef->GetDoc()->GetSdPage(4, PageKind::Standard);
+ fTransitionDuration = pPage5->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(4.25, fTransitionDuration);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf115394PPT()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/ppt/tdf115394.ppt"), PPT);
+ double fTransitionDuration;
+
+ // Fast
+ SdPage* pPage1 = xDocShRef->GetDoc()->GetSdPage(0, PageKind::Standard);
+ fTransitionDuration = pPage1->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.5, fTransitionDuration);
+
+ // Medium
+ SdPage* pPage2 = xDocShRef->GetDoc()->GetSdPage(1, PageKind::Standard);
+ fTransitionDuration = pPage2->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.75, fTransitionDuration);
+
+ // Slow
+ SdPage* pPage3 = xDocShRef->GetDoc()->GetSdPage(2, PageKind::Standard);
+ fTransitionDuration = pPage3->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(1.0, fTransitionDuration);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf51340()
+{
+ // Line spacing was not inherited from upper levels (slide layout, master slide)
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf51340.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(1, 0, xDocShRef));
+
+ // First paragraph has a 90% line spacing set on master slide
+ uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xShape));
+ uno::Reference<beans::XPropertySet> xPropSet(xParagraph, uno::UNO_QUERY_THROW);
+ css::style::LineSpacing aSpacing;
+ xPropSet->getPropertyValue("ParaLineSpacing") >>= aSpacing;
+ CPPUNIT_ASSERT_EQUAL(css::style::LineSpacingMode::PROP, aSpacing.Mode);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(90), aSpacing.Height);
+
+ // Second paragraph has a 125% line spacing set on slide layout
+ xParagraph.set(getParagraphFromShape(1, xShape));
+ xPropSet.set(xParagraph, uno::UNO_QUERY_THROW);
+ xPropSet->getPropertyValue("ParaLineSpacing") >>= aSpacing;
+ CPPUNIT_ASSERT_EQUAL(css::style::LineSpacingMode::PROP, aSpacing.Mode);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(125), aSpacing.Height);
+
+ // Third paragraph has a 70% line spacing set directly on normal slide (master slide property is overridden)
+ xParagraph.set(getParagraphFromShape(2, xShape));
+ xPropSet.set(xParagraph, uno::UNO_QUERY_THROW);
+ xPropSet->getPropertyValue("ParaLineSpacing") >>= aSpacing;
+ CPPUNIT_ASSERT_EQUAL(css::style::LineSpacingMode::PROP, aSpacing.Mode);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(70), aSpacing.Height);
+
+ // Fourth paragraph has a 190% line spacing set directly on normal slide (slide layout property is overridden)
+ xParagraph.set(getParagraphFromShape(3, xShape));
+ xPropSet.set(xParagraph, uno::UNO_QUERY_THROW);
+ xPropSet->getPropertyValue("ParaLineSpacing") >>= aSpacing;
+ CPPUNIT_ASSERT_EQUAL(css::style::LineSpacingMode::PROP, aSpacing.Mode);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(190), aSpacing.Height);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf116899()
+{
+ // This is a PPT created in Impress and roundtripped in PP, the key times become [1, -1] in PP,
+ // a time of -1 (-1000) in PPT means key times have to be distributed evenly between 0 and 1
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/ppt/tdf116899.ppt"), PPT);
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XDrawPage> xPage(xDoc->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY_THROW);
+ uno::Reference<animations::XAnimationNodeSupplier> xAnimNodeSupplier(xPage,
+ uno::UNO_QUERY_THROW);
+ uno::Reference<animations::XAnimationNode> xRootNode(xAnimNodeSupplier->getAnimationNode());
+ std::vector<uno::Reference<animations::XAnimationNode>> aAnimVector;
+ anim::create_deep_vector(xRootNode, aAnimVector);
+ uno::Reference<animations::XAnimate> xNode(aAnimVector[8], uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Number of key times in the animation node isn't 2.",
+ static_cast<sal_Int32>(2), xNode->getKeyTimes().getLength());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ "First key time in the animation node isn't 0, key times aren't normalized.", 0.,
+ xNode->getKeyTimes()[0]);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ "Second key time in the animation node isn't 1, key times aren't normalized.", 1.,
+ xNode->getKeyTimes()[1]);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf77747()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/ppt/tdf77747.ppt"), PPT);
+ CPPUNIT_ASSERT(xDocShRef.is());
+ SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(GetPage(1, xDocShRef)->GetObj(0));
+ CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr);
+ const SvxNumBulletItem* pNumFmt
+ = pTxtObj->GetOutlinerParaObject()->GetTextObject().GetParaAttribs(0).GetItem(
+ EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pNumFmt);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Bullet's suffix is wrong!", OUString("-"),
+ pNumFmt->GetNumRule().GetLevel(0).GetSuffix());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Bullet's numbering type is wrong!", SVX_NUM_NUMBER_HEBREW,
+ pNumFmt->GetNumRule().GetLevel(0).GetNumberingType());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf116266()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf116266.odp"), ODP);
+ SdDrawDocument* pDoc = xDocShRef->GetDoc();
+ sfx2::LinkManager* rLinkManager = pDoc->GetLinkManager();
+ // The document contains one SVG stored as a link.
+ CPPUNIT_ASSERT_EQUAL(size_t(1), rLinkManager->GetLinks().size());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testPptCrop()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/ppt/crop.ppt"), PPT);
+
+ uno::Reference<beans::XPropertySet> xPropertySet(
+ getShapeFromPage(/*nShape=*/1, /*nPage=*/0, xDocShRef));
+ text::GraphicCrop aCrop;
+ xPropertySet->getPropertyValue("GraphicCrop") >>= aCrop;
+ // These were all 0, lazy-loading broke cropping.
+ CPPUNIT_ASSERT_GREATER(static_cast<sal_Int32>(0), aCrop.Top);
+ CPPUNIT_ASSERT_GREATER(static_cast<sal_Int32>(0), aCrop.Bottom);
+ CPPUNIT_ASSERT_GREATER(static_cast<sal_Int32>(0), aCrop.Left);
+ CPPUNIT_ASSERT_GREATER(static_cast<sal_Int32>(0), aCrop.Right);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf149206()
+{
+ // Check that the image is cropped
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf149206.pptx"), PPTX);
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY);
+
+ uno::Reference<beans::XPropertySet> xPropertySet(
+ getShapeFromPage(/*nShape=*/0, /*nPage=*/0, xDocShRef));
+ text::GraphicCrop aCrop;
+ xPropertySet->getPropertyValue("GraphicCrop") >>= aCrop;
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aCrop.Top);
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: 5937
+ // - Actual : 0
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(5937), aCrop.Bottom);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aCrop.Left);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aCrop.Right);
+}
+
+void SdImportTest2::testTdf120028()
+{
+ // Check that the text shape has 4 columns.
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf120028.pptx"), PPTX);
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDoc.is());
+
+ uno::Reference<drawing::XDrawPage> xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPage.is());
+
+ uno::Reference<beans::XPropertySet> xShape(getShape(0, xPage));
+ uno::Reference<text::XTextColumns> xCols(xShape->getPropertyValue("TextColumns"),
+ uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(4), xCols->getColumnCount());
+ uno::Reference<beans::XPropertySet> xColProps(xCols, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int32(0)), xColProps->getPropertyValue("AutomaticDistance"));
+
+ // Check font size in the shape.
+ uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xShape));
+ uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
+ uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW);
+ double fCharHeight = 0;
+ xPropSet->getPropertyValue("CharHeight") >>= fCharHeight;
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(13.5, fCharHeight, 1E-12);
+ // 13.5 * 86% is approx. 11.6 (the correct scaled font size)
+ CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(86)), xShape->getPropertyValue("TextFitToSizeScale"));
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testDescriptionImport()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/altdescription.pptx"), PPTX);
+
+ uno::Reference<beans::XPropertySet> xPropertySet(
+ getShapeFromPage(/*nShape=*/2, /*nPage=*/0, xDocShRef));
+ OUString sDesc;
+
+ xPropertySet->getPropertyValue("Description") >>= sDesc;
+
+ CPPUNIT_ASSERT_EQUAL(OUString("We Can Do It!"), sDesc);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf83247()
+{
+ auto GetPause = [this](const OUString& sSrc, sal_Int32 nFormat) {
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(sSrc), nFormat);
+ uno::Reference<presentation::XPresentationSupplier> xPresentationSupplier(
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xPresentationProps(
+ xPresentationSupplier->getPresentation(), uno::UNO_QUERY_THROW);
+
+ auto retVal = xPresentationProps->getPropertyValue("Pause");
+ xDocShRef->DoClose();
+ return retVal.get<sal_Int32>();
+ };
+
+ // 1. Check that presentation:pause attribute is imported correctly
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(10), GetPause("/sd/qa/unit/data/odp/loopPause10.odp", ODP));
+
+ // 2. ODF compliance: if presentation:pause attribute is absent, it must be treated as 0
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), GetPause("/sd/qa/unit/data/odp/loopNoPause.odp", ODP));
+
+ // 3. Import PPT: pause should be 0
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), GetPause("/sd/qa/unit/data/ppt/loopNoPause.ppt", PPT));
+}
+
+void SdImportTest2::testTdf47365()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/loopNoPause.pptx"), PPTX);
+ uno::Reference<presentation::XPresentationSupplier> xPresentationSupplier(
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPresentationProps(xPresentationSupplier->getPresentation(),
+ uno::UNO_QUERY_THROW);
+
+ const bool bEndlessVal = xPresentationProps->getPropertyValue("IsEndless").get<bool>();
+ const sal_Int32 nPauseVal = xPresentationProps->getPropertyValue("Pause").get<sal_Int32>();
+
+ // Check that we import "loop" attribute of the presentation, and don't introduce any pauses
+ CPPUNIT_ASSERT(bEndlessVal);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nPauseVal);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf122899()
+{
+ // tdf122899 FILEOPEN: ppt: old kind arc from MS Office 97 is broken
+ // Error was, that the path coordinates of a mso_sptArc shape were read as sal_Int16
+ // although they are unsigned 16 bit. This leads to wrong positions of start and end
+ // point and results to a huge shape width in the test document.
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt"),
+ PPT);
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_MESSAGE("Could not get XDrawPagesSupplier", xDrawPagesSupplier.is());
+ uno::Reference<drawing::XDrawPages> xDrawPages(xDrawPagesSupplier->getDrawPages());
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPages->getByIndex(0), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_MESSAGE("Could not get xDrawPage", xDrawPage.is());
+ uno::Reference<drawing::XShape> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_MESSAGE("Could not get xShape", xShape.is());
+ awt::Rectangle aFrameRect;
+ uno::Reference<beans::XPropertySet> xShapeProps(xShape, uno::UNO_QUERY);
+ CPPUNIT_ASSERT_MESSAGE("Could not get the shape properties", xShapeProps.is());
+ xShapeProps->getPropertyValue(UNO_NAME_MISC_OBJ_FRAMERECT) >>= aFrameRect;
+ // original width is 9cm, add some tolerance
+ CPPUNIT_ASSERT_LESS(static_cast<sal_Int32>(9020), aFrameRect.Width);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testOOXTheme()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/ooxtheme.pptx"), PPTX);
+
+ uno::Reference<beans::XPropertySet> xPropSet(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY_THROW);
+ uno::Sequence<beans::PropertyValue> aGrabBag;
+ xPropSet->getPropertyValue("InteropGrabBag") >>= aGrabBag;
+
+ bool bTheme = false;
+ for (beans::PropertyValue const& prop : std::as_const(aGrabBag))
+ {
+ if (prop.Name == "OOXTheme")
+ {
+ bTheme = true;
+ uno::Reference<xml::dom::XDocument> aThemeDom;
+ CPPUNIT_ASSERT(prop.Value >>= aThemeDom); // PropertyValue of proper type
+ CPPUNIT_ASSERT(aThemeDom); // Reference not empty
+ }
+ }
+ CPPUNIT_ASSERT(bTheme); // Grab Bag has all the expected elements
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testCropToShape()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/crop-to-shape.pptx"), PPTX);
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_MESSAGE("Could not get XDrawPagesSupplier", xDrawPagesSupplier.is());
+ uno::Reference<drawing::XDrawPages> xDrawPages(xDrawPagesSupplier->getDrawPages());
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPages->getByIndex(0), uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_MESSAGE("Could not get xDrawPage", xDrawPage.is());
+ uno::Reference<drawing::XShape> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString{ "com.sun.star.drawing.CustomShape" }, xShape->getShapeType());
+ CPPUNIT_ASSERT_MESSAGE("Could not get xShape", xShape.is());
+ uno::Reference<beans::XPropertySet> xShapeProps(xShape, uno::UNO_QUERY);
+ css::drawing::FillStyle fillStyle;
+ xShapeProps->getPropertyValue("FillStyle") >>= fillStyle;
+ CPPUNIT_ASSERT_EQUAL(css::drawing::FillStyle_BITMAP, fillStyle);
+ css::drawing::BitmapMode bitmapmode;
+ xShapeProps->getPropertyValue("FillBitmapMode") >>= bitmapmode;
+ CPPUNIT_ASSERT_EQUAL(css::drawing::BitmapMode_STRETCH, bitmapmode);
+}
+
+void SdImportTest2::testTdf127964()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf127964.pptx"), PPTX);
+ {
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ const SdrObject* pObj = pPage->GetObj(0);
+ auto& rFillStyleItem
+ = dynamic_cast<const XFillStyleItem&>(pObj->GetMergedItem(XATTR_FILLSTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue());
+ auto& rFillBackgroundItem = dynamic_cast<const XFillUseSlideBackgroundItem&>(
+ pObj->GetMergedItem(XATTR_FILLUSESLIDEBACKGROUND));
+ CPPUNIT_ASSERT_EQUAL(true, rFillBackgroundItem.GetValue());
+ }
+
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP);
+
+ {
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ const SdrObject* pObj = pPage->GetObj(0);
+ auto& rFillStyleItem
+ = dynamic_cast<const XFillStyleItem&>(pObj->GetMergedItem(XATTR_FILLSTYLE));
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue());
+ auto& rFillBackgroundItem = dynamic_cast<const XFillUseSlideBackgroundItem&>(
+ pObj->GetMergedItem(XATTR_FILLUSESLIDEBACKGROUND));
+ CPPUNIT_ASSERT_EQUAL(true, rFillBackgroundItem.GetValue());
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf106638()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf106638.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<text::XTextRange> const xPara(getParagraphFromShape(1, xShape));
+ uno::Reference<text::XText> xText = xPara->getText();
+ uno::Reference<text::XTextCursor> xTextCursor
+ = xText->createTextCursorByRange(xPara->getStart());
+ uno::Reference<beans::XPropertySet> xPropSet(xTextCursor, uno::UNO_QUERY_THROW);
+ OUString aCharFontName;
+ CPPUNIT_ASSERT(xTextCursor->goRight(1, true));
+ // First character U+f0fe that uses Wingding
+ xPropSet->getPropertyValue("CharFontName") >>= aCharFontName;
+ CPPUNIT_ASSERT_EQUAL(OUString("Wingdings"), aCharFontName);
+
+ // The rest characters that do not use Wingding.
+ CPPUNIT_ASSERT(xTextCursor->goRight(45, true));
+ xPropSet->getPropertyValue("CharFontName") >>= aCharFontName;
+ CPPUNIT_ASSERT(aCharFontName != "Wingdings");
+}
+
+void SdImportTest2::testTdf128684()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf128684.pptx"), PPTX);
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDoc.is());
+ uno::Reference<drawing::XDrawPage> xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPage.is());
+ uno::Reference<beans::XPropertySet> xShape(getShape(0, xPage));
+ CPPUNIT_ASSERT(xShape.is());
+ uno::Any aAny = xShape->getPropertyValue("CustomShapeGeometry");
+ CPPUNIT_ASSERT(aAny.hasValue());
+ uno::Sequence<beans::PropertyValue> aProps;
+ CPPUNIT_ASSERT(aAny >>= aProps);
+ sal_Int32 nRotateAngle = 0;
+ for (const auto& rProp : std::as_const(aProps))
+ {
+ if (rProp.Name == "TextPreRotateAngle")
+ {
+ rProp.Value >>= nRotateAngle;
+ }
+ }
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(-90), nRotateAngle);
+}
+
+void SdImportTest2::testTdf113198()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf113198.pptx"), PPTX);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ sal_Int16 nParaAdjust = -1;
+ xShape->getPropertyValue("ParaAdjust") >>= nParaAdjust;
+ CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_CENTER,
+ static_cast<style::ParagraphAdjust>(nParaAdjust));
+}
+
+void SdImportTest2::testTdf49856()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/ppt/tdf49856.ppt"), PPT);
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(1));
+ CPPUNIT_ASSERT_MESSAGE("No text object", pTxtObj != nullptr);
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(2).GetItem(EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pNumFmt);
+ const sal_UCS4 aBullet = pNumFmt->GetNumRule().GetLevel(0).GetBulletChar();
+ CPPUNIT_ASSERT_EQUAL(OUString("More level 2"), aEdit.GetText(2));
+ CPPUNIT_ASSERT_EQUAL(sal_UCS4(0x2022), aBullet);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testShapeGlowEffectPPTXImpoer()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/shape-glow-effect.pptx"), PPTX);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ sal_Int32 nRadius = -1;
+ xShape->getPropertyValue("GlowEffectRadius") >>= nRadius;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(388), nRadius); // 139700 EMU = 388.0556 mm/100
+ Color nColor;
+ xShape->getPropertyValue("GlowEffectColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0xFFC000), nColor);
+ sal_Int16 nTransparency;
+ xShape->getPropertyValue("GlowEffectTransparency") >>= nTransparency;
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(60), nTransparency);
+}
+
+void SdImportTest2::testShapeBlurPPTXImport()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/shape-blur-effect.pptx"), PPTX);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ bool bHasShadow = false;
+ xShape->getPropertyValue("Shadow") >>= bHasShadow;
+ CPPUNIT_ASSERT(bHasShadow);
+
+ sal_Int32 nRadius = -1;
+ xShape->getPropertyValue("ShadowBlur") >>= nRadius;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(388), nRadius); // 584200EMU=46pt - 139700EMU = 388Hmm = 11pt
+}
+
+void SdImportTest2::testMirroredGraphic()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/mirrored-graphic.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_SET_THROW);
+ CPPUNIT_ASSERT(xShape.is());
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShape->getPropertyValue("FillBitmap") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+ Graphic aGraphic(xGraphic);
+ BitmapEx aBitmap(aGraphic.GetBitmapEx());
+ CPPUNIT_ASSERT_EQUAL(Color(0x4f4955), aBitmap.GetPixelColor(0, 0));
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf134210CropPosition()
+{
+ // We are testing crop position of bitmap in custom shapes. We should see only green with proper fix.
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/crop-position.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_SET_THROW);
+ CPPUNIT_ASSERT(xShape.is());
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShape->getPropertyValue("FillBitmap") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+ Graphic aGraphic(xGraphic);
+ BitmapEx aBitmap(aGraphic.GetBitmapEx());
+ CPPUNIT_ASSERT_EQUAL(Color(0x81d41a), aBitmap.GetPixelColor(0, 0));
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testGreysScaleGraphic()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/greysscale-graphic.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_SET_THROW);
+ CPPUNIT_ASSERT(xShape.is());
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShape->getPropertyValue("FillBitmap") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+ Graphic aGraphic(xGraphic);
+ BitmapEx aBitmap(aGraphic.GetBitmapEx());
+ CPPUNIT_ASSERT_EQUAL(Color(0x3c3c3c), aBitmap.GetPixelColor(0, 0));
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf103347()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf103347.pptx"), PPTX);
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY_THROW);
+
+ uno::Reference<drawing::XDrawPage> xPage1(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<container::XNamed> xNamed1(xPage1, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("Hello"), xNamed1->getName());
+
+ uno::Reference<drawing::XDrawPage> xPage2(xDoc->getDrawPages()->getByIndex(1), uno::UNO_QUERY);
+ uno::Reference<container::XNamed> xNamed2(xPage2, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("Hello (2)"), xNamed2->getName());
+
+ uno::Reference<drawing::XDrawPage> xPage3(xDoc->getDrawPages()->getByIndex(2), uno::UNO_QUERY);
+ uno::Reference<container::XNamed> xNamed3(xPage3, uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_EQUAL(OUString("Hello (3)"), xNamed3->getName());
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testHyperlinksOnShapes()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf144616.pptx"), PPTX);
+
+ for (sal_Int32 i = 0; i < 7; i++)
+ {
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(i, 0, xDocShRef));
+ uno::Reference<document::XEventsSupplier> xEventsSupplier(xShape, uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xEvents(xEventsSupplier->getEvents());
+
+ uno::Sequence<beans::PropertyValue> props;
+ xEvents->getByName("OnClick") >>= props;
+ comphelper::SequenceAsHashMap map(props);
+ auto iter(map.find("ClickAction"));
+ switch (i)
+ {
+ case 0:
+ CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_FIRSTPAGE,
+ iter->second.get<css::presentation::ClickAction>());
+ break;
+ case 1:
+ CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_LASTPAGE,
+ iter->second.get<css::presentation::ClickAction>());
+ break;
+ case 2:
+ CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_NEXTPAGE,
+ iter->second.get<css::presentation::ClickAction>());
+ break;
+ case 3:
+ CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_PREVPAGE,
+ iter->second.get<css::presentation::ClickAction>());
+ break;
+ case 4:
+ {
+ auto iter2(map.find("Bookmark"));
+ CPPUNIT_ASSERT_EQUAL(OUString("Second slide"), iter2->second.get<OUString>());
+ }
+ break;
+ case 5:
+ CPPUNIT_ASSERT_EQUAL(css::presentation::ClickAction_STOPPRESENTATION,
+ iter->second.get<css::presentation::ClickAction>());
+ break;
+ case 6:
+ {
+ auto iter1(map.find("Bookmark"));
+ CPPUNIT_ASSERT_EQUAL(OUString("http://www.example.com/"),
+ iter1->second.get<OUString>());
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf112209()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf112209.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_SET_THROW);
+ CPPUNIT_ASSERT(xShape.is());
+
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShape->getPropertyValue("FillBitmap") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+
+ Graphic aGraphic(xGraphic);
+ BitmapEx aBitmap(aGraphic.GetBitmapEx());
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: Color: R:132 G:132 B:132 A:0
+ // - Actual : Color: R:21 G:170 B:236 A:0
+ // i.e. the image color was blue instead of grey.
+ CPPUNIT_ASSERT_EQUAL(Color(0x848484), aBitmap.GetPixelColor(0, 0));
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf128596()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf128596.pptx"), PPTX);
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_SET_THROW);
+ CPPUNIT_ASSERT(xShape.is());
+
+ css::drawing::BitmapMode bitmapmode;
+ xShape->getPropertyValue("FillBitmapMode") >>= bitmapmode;
+ CPPUNIT_ASSERT_EQUAL(css::drawing::BitmapMode_REPEAT, bitmapmode);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testDefaultTabStop()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/deftabstop.pptx"), PPTX);
+ SdDrawDocument* pDoc = xDocShRef->GetDoc();
+ sal_Int32 nDefTab = pDoc->GetDefaultTabulator();
+
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2540), nDefTab);
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testCropToZero()
+{
+ // Must not crash because of division by zero
+ // Also must not fail assertions because of passing negative value to CropQuotientsFromSrcRect
+ loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/croppedTo0.pptx"), PPTX);
+}
+
+void SdImportTest2::testTdf144092TableHeight()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf144092-tableHeight.pptx"), PPTX);
+
+ uno::Reference<drawing::XShape> xTableShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 7208
+ // - Actual : 4595
+ // i.e. the table height wasn't corrected by expanding less than minimum sized rows.
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(7208), xTableShape->getSize().Height);
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf89928BlackWhiteThreshold()
+{
+ // A slide with two graphics, one with color HSV{0,0,74%} and one with HSV{0,0,76%}
+ // where both have an applied 75% Black/White Color Effect.
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(
+ u"sd/qa/unit/data/pptx/tdf89928-blackWhiteEffectThreshold.pptx"),
+ PPTX);
+
+ // First graphic should appear black
+ {
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef),
+ uno::UNO_SET_THROW);
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShape->getPropertyValue("Graphic") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+
+ Graphic aGraphic(xGraphic);
+ BitmapEx aBitmap(aGraphic.GetBitmapEx());
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: Color: R:0 G:0 B:0 A:0
+ // - Actual : Color: R:189 G:189 B:189 A:0
+ CPPUNIT_ASSERT_EQUAL(Color(ColorTransparency, 0x000000), aBitmap.GetPixelColor(0, 0));
+ }
+
+ // Second graphic should appear white
+ {
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(1, 0, xDocShRef),
+ uno::UNO_SET_THROW);
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShape->getPropertyValue("Graphic") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+
+ Graphic aGraphic(xGraphic);
+ BitmapEx aBitmap(aGraphic.GetBitmapEx());
+
+ CPPUNIT_ASSERT_EQUAL(Color(ColorTransparency, 0xFFFFFF), aBitmap.GetPixelColor(0, 0));
+ }
+
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf151547TransparentWhiteText()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf151547-transparent-white-text.pptx"),
+ PPTX);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef));
+ uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xShape));
+ uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
+ uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW);
+
+ Color nCharColor;
+ xPropSet->getPropertyValue("CharColor") >>= nCharColor;
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: Color: R:255 G:255 B:254 A:255
+ // - Actual : Color: R:255 G:255 B:255 A:255
+ // i.e. fully transparent white text color was interpreted as COL_AUTO
+ CPPUNIT_ASSERT_EQUAL(Color(ColorTransparency, 0xFFFFFFFE), nCharColor);
+ xDocShRef->DoClose();
+}
+
+void SdImportTest2::testTdf149961AutofitIndentation()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf149961-autofitIndentation.pptx"),
+ PPTX);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+
+ {
+ SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
+
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pNumFmt);
+
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3175), pNumFmt->GetNumRule().GetLevel(0).GetAbsLSpace());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(-3175),
+ pNumFmt->GetNumRule().GetLevel(0).GetFirstLineOffset());
+ }
+
+ {
+ SdrTextObj* pTxtObj = dynamic_cast<SdrTextObj*>(pPage->GetObj(1));
+ CPPUNIT_ASSERT_MESSAGE("no text object", pTxtObj != nullptr);
+
+ const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
+ const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(0).GetItem(EE_PARA_NUMBULLET);
+ CPPUNIT_ASSERT(pNumFmt);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 12700
+ // - Actual : 3175
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(12700), pNumFmt->GetNumRule().GetLevel(0).GetAbsLSpace());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(-12700),
+ pNumFmt->GetNumRule().GetLevel(0).GetFirstLineOffset());
+ }
+}
+
+void SdImportTest2::testTdf149588TransparentSolidFill()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf149588_transparentSolidFill.pptx"),
+ PPTX);
+
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(6, 0, xDocShRef));
+ uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xShape));
+ uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
+ uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW);
+
+ Color nCharColor;
+ xPropSet->getPropertyValue("CharColor") >>= nCharColor;
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: Color: R:99 G:99 B:99 A 51 (T:204)
+ // - Actual : Color: R:99 G:99 B:99 A: 255 (T: 0)
+ CPPUNIT_ASSERT_EQUAL(Color(ColorTransparency, 0xCC636363), nCharColor);
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest2);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/layout-tests.cxx b/sd/qa/unit/layout-tests.cxx
new file mode 100644
index 000000000..d73771e56
--- /dev/null
+++ b/sd/qa/unit/layout-tests.cxx
@@ -0,0 +1,360 @@
+/* -*- 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 "sdmodeltestbase.hxx"
+
+class SdLayoutTest : public SdModelTestBaseXML
+{
+};
+
+CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf104722)
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf104722.pptx"), PPTX);
+
+ std::shared_ptr<GDIMetaFile> xMetaFile = xDocShRef->GetPreviewMetaFile();
+ MetafileXmlDump dumper;
+
+ xmlDocUniquePtr pXmlDoc = XmlTestTools::dumpAndParse(dumper, *xMetaFile);
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ // Without the fix in place, this would have failed with
+ // - Expected: 2093
+ // - Actual : -10276
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray[1]", "x", "2093");
+
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray[1]", "y", "9273");
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf135843)
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf135843.pptx"), PPTX);
+
+ std::shared_ptr<GDIMetaFile> xMetaFile = xDocShRef->GetPreviewMetaFile();
+ MetafileXmlDump dumper;
+
+ xmlDocUniquePtr pXmlDoc = XmlTestTools::dumpAndParse(dumper, *xMetaFile);
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ // Without the fix, the test fails with:
+ // - Expected: 21165
+ // - Actual : 4218
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[5]/polyline[1]/point[1]", "x", "21165");
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[5]/polyline[1]/point[1]", "y", "3866");
+
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[5]/polyline[1]/point[2]", "x", "21165");
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[5]/polyline[1]/point[2]", "y", "5956");
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf146876)
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf146876.odp"), ODP);
+
+ std::shared_ptr<GDIMetaFile> xMetaFile = xDocShRef->GetPreviewMetaFile();
+ MetafileXmlDump dumper;
+
+ xmlDocUniquePtr pXmlDoc = XmlTestTools::dumpAndParse(dumper, *xMetaFile);
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ // Check the shape is inside the (5000,8500) - (11500,12500) area
+ for (size_t i = 2; i < 4; ++i)
+ {
+ for (size_t j = 1; j < 6; ++j)
+ {
+ const OString xPath = "/metafile/push[1]/push[1]/push[" + OString::number(i)
+ + "]/polyline/point[" + OString::number(j) + "]";
+ const sal_Int32 nX = getXPath(pXmlDoc, xPath.getStr(), "x").toInt32();
+ const sal_Int32 nY = getXPath(pXmlDoc, xPath.getStr(), "y").toInt32();
+
+ // Without the fix in place, this test would have failed with
+ // - Expected greater or equal than: 5000
+ // - Actual : 0
+ CPPUNIT_ASSERT_GREATEREQUAL(sal_Int32(5000), nX);
+ CPPUNIT_ASSERT_LESSEQUAL(sal_Int32(11500), nX);
+
+ CPPUNIT_ASSERT_GREATEREQUAL(sal_Int32(8500), nY);
+ CPPUNIT_ASSERT_LESSEQUAL(sal_Int32(12500), nY);
+ }
+ }
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf136949)
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf136949.odp"), ODP);
+
+ std::shared_ptr<GDIMetaFile> xMetaFile = xDocShRef->GetPreviewMetaFile();
+ MetafileXmlDump dumper;
+
+ xmlDocUniquePtr pXmlDoc = XmlTestTools::dumpAndParse(dumper, *xMetaFile);
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: 13687
+ // - Actual : 2832
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[7]/polyline/point[1]", "x", "13687");
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[7]/polyline/point[2]", "x", "24759");
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf128212)
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf128212.pptx"), PPTX);
+
+ std::shared_ptr<GDIMetaFile> xMetaFile = xDocShRef->GetPreviewMetaFile();
+ MetafileXmlDump dumper;
+
+ xmlDocUniquePtr pXmlDoc = XmlTestTools::dumpAndParse(dumper, *xMetaFile);
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: 7797
+ // - Actual : 12068
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray", "x", "4525");
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray", "y", "7797");
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_FIXTURE(SdLayoutTest, testColumnsLayout)
+{
+ // This tests a 2-column text box's layout
+
+ const OUString sText[] = {
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum consequat mi quis "
+ "pretium semper. Proin luctus orci ac neque venenatis, quis commodo dolor posuere. "
+ "Curabitur dignissim sapien quis cursus egestas. Donec blandit auctor arcu, nec "
+ "pellentesque eros molestie eget. In consectetur aliquam hendrerit. Sed cursus mauris "
+ "vitae ligula pellentesque, non pellentesque urna aliquet. Fusce placerat mauris enim, "
+ "nec rutrum purus semper vel. Praesent tincidunt neque eu pellentesque pharetra. Fusce "
+ "pellentesque est orci.",
+ "Integer sodales tincidunt tristique. Sed a metus posuere, adipiscing nunc et, viverra "
+ "odio. Donec auctor molestie sem, sit amet tristique lectus hendrerit sed. Cras sodales "
+ "nisl sed orci mattis iaculis. Nunc eget dolor accumsan, pharetra risus a, vestibulum "
+ "mauris. Nunc vulputate lobortis mollis. Vivamus nec tellus faucibus, tempor magna nec, "
+ "facilisis felis. Donec commodo enim a vehicula pellentesque. Nullam vehicula vestibulum "
+ "est vel ultricies.",
+ "Aliquam velit massa, laoreet vel leo nec, volutpat facilisis eros. Donec consequat arcu "
+ "ut diam tempor luctus. Cum sociis natoque penatibus et magnis dis parturient montes, "
+ "nascetur ridiculus mus. Praesent vitae lacus vel leo sodales pharetra a a nibh. "
+ "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; "
+ "Nam luctus tempus nibh, fringilla dictum augue consectetur eget. Curabitur at ante sit "
+ "amet tortor pharetra molestie eu nec ante. Mauris tincidunt, nibh eu sollicitudin "
+ "molestie, dolor sapien congue tortor, a pulvinar sapien turpis sed ante. Donec nec est "
+ "elementum, euismod nulla in, mollis nunc."
+ };
+
+ // sentence#, index, length, x, y
+ const std::tuple<int, int, int, int, int> strings[] = {
+ // Column 1
+ { 0, 0, 40, 3750, 3193 },
+ { 0, 40, 41, 3750, 3587 },
+ { 0, 81, 39, 3750, 3981 },
+ { 0, 120, 33, 3750, 4375 },
+ { 0, 153, 35, 3750, 4769 },
+ { 0, 188, 34, 3750, 5163 },
+ { 0, 222, 38, 3750, 5557 },
+ { 0, 260, 35, 3750, 5951 },
+ { 0, 295, 37, 3750, 6345 },
+ { 0, 332, 31, 3750, 6739 },
+ { 0, 363, 33, 3750, 7133 },
+ { 0, 396, 39, 3750, 7527 },
+ { 0, 435, 37, 3750, 7921 },
+ { 0, 472, 32, 3750, 8315 },
+ { 0, 504, 22, 3750, 8709 },
+ { 1, 0, 43, 3750, 9103 },
+ { 1, 43, 35, 3750, 9497 },
+ { 1, 78, 36, 3750, 9891 },
+ { 1, 114, 41, 3750, 10285 },
+ { 1, 155, 39, 3750, 10679 },
+ { 1, 194, 35, 3750, 11073 },
+ { 1, 229, 37, 3750, 11467 },
+ { 1, 266, 40, 3750, 11861 },
+ { 1, 306, 39, 3750, 12255 },
+ { 1, 345, 38, 3750, 12649 },
+ { 1, 383, 39, 3750, 13043 },
+ { 1, 422, 29, 3750, 13437 },
+ { 2, 0, 42, 3750, 13831 },
+ { 2, 42, 41, 3750, 14225 },
+ { 2, 83, 39, 3750, 14619 },
+ { 2, 122, 32, 3750, 15013 },
+ { 2, 154, 38, 3750, 15407 },
+ { 2, 192, 34, 3750, 15801 },
+ { 2, 226, 38, 3750, 16195 },
+ // Column 2
+ { 2, 264, 42, 10725, 3193 },
+ { 2, 306, 39, 10725, 3587 },
+ { 2, 345, 37, 10725, 3981 },
+ { 2, 382, 37, 10725, 4375 },
+ { 2, 419, 42, 10725, 4769 },
+ { 2, 461, 36, 10725, 5163 },
+ { 2, 497, 36, 10725, 5557 },
+ { 2, 533, 40, 10725, 5951 },
+ { 2, 573, 35, 10725, 6345 },
+ { 2, 608, 30, 10725, 6739 },
+ };
+
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odg/two_columns.odg"), ODG);
+
+ std::shared_ptr<GDIMetaFile> xMetaFile = xDocShRef->GetPreviewMetaFile();
+ MetafileXmlDump dumper;
+
+ xmlDocUniquePtr pXmlDoc = XmlTestTools::dumpAndParse(dumper, *xMetaFile);
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ for (size_t i = 0; i < SAL_N_ELEMENTS(strings); ++i)
+ {
+ const auto & [ sentence, index, length, x, y ] = strings[i];
+ OString sXPath = "/metafile/push[1]/push[1]/textarray[" + OString::number(i + 1) + "]";
+ assertXPathContent(pXmlDoc, sXPath + "/text", sText[sentence]);
+ assertXPath(pXmlDoc, sXPath, "index", OUString::number(index));
+ assertXPath(pXmlDoc, sXPath, "length", OUString::number(length));
+ assertXPath(pXmlDoc, sXPath, "x", OUString::number(x));
+ assertXPath(pXmlDoc, sXPath, "y", OUString::number(y));
+ }
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_FIXTURE(SdLayoutTest, tdf143258_testTbRlLayout)
+{
+ // This tests a 1-column and a 2-column text boxes' layout
+
+ const OUString sText[] = {
+ "tb-rl text within a small text box", // Box 1
+ "tb-rl text within a small 2-column text box", // Box 2
+ };
+
+ // sentence#, index, length, x, y
+ const std::tuple<int, int, int, int, int> strings[] = {
+ // Box 1
+ { 0, 0, 11, 5346, 3250 },
+ { 0, 11, 9, 4635, 3250 },
+ { 0, 20, 6, 3924, 3250 },
+ { 0, 26, 8, 3213, 3250 },
+ // Box 2 column 1
+ { 1, 0, 6, 5346, 7250 },
+ { 1, 6, 5, 4635, 7250 },
+ { 1, 11, 9, 3924, 7250 },
+ { 1, 20, 6, 3213, 7250 },
+ // Box 2 column 2
+ { 1, 26, 2, 5346, 9600 },
+ { 1, 28, 7, 4635, 9600 },
+ { 1, 35, 5, 3924, 9600 },
+ { 1, 40, 3, 3213, 9600 },
+ };
+
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odg/tb-rl-textbox.odg"), ODG);
+
+ std::shared_ptr<GDIMetaFile> xMetaFile = xDocShRef->GetPreviewMetaFile();
+ MetafileXmlDump dumper;
+
+ xmlDocUniquePtr pXmlDoc = XmlTestTools::dumpAndParse(dumper, *xMetaFile);
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/font", SAL_N_ELEMENTS(strings));
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/textarray", SAL_N_ELEMENTS(strings));
+ for (size_t i = 0; i < SAL_N_ELEMENTS(strings); ++i)
+ {
+ const auto & [ sentence, index, length, x, y ] = strings[i];
+ OString sXPath = "/metafile/push[1]/push[1]/font[" + OString::number(i + 1) + "]";
+ assertXPath(pXmlDoc, sXPath, "orientation", "-900");
+ assertXPath(pXmlDoc, sXPath, "vertical", "true");
+ sXPath = "/metafile/push[1]/push[1]/textarray[" + OString::number(i + 1) + "]";
+ assertXPathContent(pXmlDoc, sXPath + "/text", sText[sentence]);
+ assertXPath(pXmlDoc, sXPath, "index", OUString::number(index));
+ assertXPath(pXmlDoc, sXPath, "length", OUString::number(length));
+
+ // Without the fix in place, this would have failed with
+ // - Expected: 5346
+ // - Actual : 503924
+ // - In <>, attribute 'x' of '/metafile/push[1]/push[1]/textarray[1]' incorrect value.
+ assertXPath(pXmlDoc, sXPath, "x", OUString::number(x));
+ assertXPath(pXmlDoc, sXPath, "y", OUString::number(y));
+ }
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf146731)
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf146731.pptx"), PPTX);
+
+ std::shared_ptr<GDIMetaFile> xMetaFile = xDocShRef->GetPreviewMetaFile();
+ MetafileXmlDump dumper;
+
+ xmlDocUniquePtr pXmlDoc = XmlTestTools::dumpAndParse(dumper, *xMetaFile);
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[3]/polyline[1]", "width", "187");
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[4]/polyline[1]", "width", "187");
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[5]/polyline[1]", "width", "187");
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: 30
+ // - Actual : 187
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[6]/polyline[1]", "width", "30");
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[7]/polyline[1]", "width", "187");
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_FIXTURE(SdLayoutTest, testTdf135843_InsideHBorders)
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf135843_insideH.pptx"), PPTX);
+
+ std::shared_ptr<GDIMetaFile> xMetaFile = xDocShRef->GetPreviewMetaFile();
+ MetafileXmlDump dumper;
+
+ xmlDocUniquePtr pXmlDoc = XmlTestTools::dumpAndParse(dumper, *xMetaFile);
+ CPPUNIT_ASSERT(pXmlDoc);
+ // Without the fix, the test fails with:
+ //- Expected: 34
+ //- Actual : 36
+ // We shouldn't see two vertical borders inside the table on ui.
+
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push", 34);
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_FIXTURE(SdLayoutTest, testBnc480256)
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/bnc480256-2.pptx"), PPTX);
+
+ std::shared_ptr<GDIMetaFile> xMetaFile = xDocShRef->GetPreviewMetaFile();
+ MetafileXmlDump dumper;
+
+ xmlDocUniquePtr pXmlDoc = XmlTestTools::dumpAndParse(dumper, *xMetaFile);
+ CPPUNIT_ASSERT(pXmlDoc);
+ // Without the fix, the test fails with:
+ //- Expected: #ff0000
+ //- Actual : #ffffff
+ // We should see the red vertical border inside the table.
+
+ assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[8]/linecolor[1]", "color", "#ff0000");
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/misc-tests.cxx b/sd/qa/unit/misc-tests.cxx
new file mode 100644
index 000000000..f864dfa6b
--- /dev/null
+++ b/sd/qa/unit/misc-tests.cxx
@@ -0,0 +1,970 @@
+/* -*- 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 <officecfg/Office/Common.hxx>
+#include "sdmodeltestbase.hxx"
+
+#include <com/sun/star/uno/Reference.hxx>
+
+#include <comphelper/processfactory.hxx>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/frame/XModel2.hpp>
+
+#include <com/sun/star/awt/Gradient.hpp>
+#include <com/sun/star/awt/PosSize.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/drawing/TextVerticalAdjust.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XDrawPages.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/drawing/XShapes.hpp>
+#include <com/sun/star/graphic/XGraphic.hpp>
+#include <com/sun/star/container/XIndexAccess.hpp>
+#include <com/sun/star/frame/XLoadable.hpp>
+#include <com/sun/star/table/XTable.hpp>
+#include <com/sun/star/table/XMergeableCellRange.hpp>
+
+#include <vcl/scheduler.hxx>
+#include <osl/thread.hxx>
+#include <svx/sdr/table/tablecontroller.hxx>
+#include <sfx2/request.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svxids.hrc>
+#include <editeng/eeitem.hxx>
+#include <editeng/adjustitem.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/editobj.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <SlideSorter.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsClipboard.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <undo/undomanager.hxx>
+#include <GraphicViewShell.hxx>
+#include <chrono>
+#include <sdpage.hxx>
+#include <comphelper/base64.hxx>
+#include <LayerTabBar.hxx>
+#include <vcl/event.hxx>
+#include <vcl/keycodes.hxx>
+#include <svx/svdoashp.hxx>
+#include <tools/gen.hxx>
+#include <svx/view3d.hxx>
+#include <svx/scene3d.hxx>
+#include <svx/sdmetitm.hxx>
+
+using namespace ::com::sun::star;
+
+/// Impress miscellaneous tests.
+class SdMiscTest : public SdModelTestBaseXML
+{
+public:
+ void testTdf96206();
+ void testTdf96708();
+ void testTdf99396();
+ void testTableObjectUndoTest();
+ void testFillGradient();
+ void testTdf44774();
+ void testTdf38225();
+ void testTdf101242_ODF_no_settings();
+ void testTdf101242_ODF_add_settings();
+ void testTdf101242_settings_keep();
+ void testTdf101242_settings_remove();
+ void testTdf119392();
+ void testTdf67248();
+ void testTdf119956();
+ void testTdf120527();
+ void testTextColumns();
+ void testTdf98839_ShearVFlipH();
+ void testTdf130988();
+ void testTdf131033();
+ void testTdf129898LayerDrawnInSlideshow();
+ void testTdf136956();
+
+ CPPUNIT_TEST_SUITE(SdMiscTest);
+ CPPUNIT_TEST(testTdf96206);
+ CPPUNIT_TEST(testTdf96708);
+ CPPUNIT_TEST(testTdf99396);
+ CPPUNIT_TEST(testTableObjectUndoTest);
+ CPPUNIT_TEST(testFillGradient);
+ CPPUNIT_TEST(testTdf44774);
+ CPPUNIT_TEST(testTdf38225);
+ CPPUNIT_TEST(testTdf101242_ODF_no_settings);
+ CPPUNIT_TEST(testTdf101242_ODF_add_settings);
+ CPPUNIT_TEST(testTdf101242_settings_keep);
+ CPPUNIT_TEST(testTdf101242_settings_remove);
+ CPPUNIT_TEST(testTdf119392);
+ CPPUNIT_TEST(testTdf67248);
+ CPPUNIT_TEST(testTdf119956);
+ CPPUNIT_TEST(testTdf120527);
+ CPPUNIT_TEST(testTextColumns);
+ CPPUNIT_TEST(testTdf98839_ShearVFlipH);
+ CPPUNIT_TEST(testTdf130988);
+ CPPUNIT_TEST(testTdf131033);
+ CPPUNIT_TEST(testTdf129898LayerDrawnInSlideshow);
+ CPPUNIT_TEST(testTdf136956);
+ CPPUNIT_TEST_SUITE_END();
+
+virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override
+ {
+ XmlTestTools::registerODFNamespaces(pXmlXPathCtx);
+ }
+
+private:
+ sd::DrawDocShellRef Load(const OUString& rURL, sal_Int32 nFormat);
+};
+
+sd::DrawDocShellRef SdMiscTest::Load(const OUString& rURL, sal_Int32 nFormat)
+{
+ uno::Reference< frame::XDesktop2 > xDesktop = frame::Desktop::create(::comphelper::getProcessComponentContext());
+ CPPUNIT_ASSERT(xDesktop.is());
+
+ // create a frame
+ uno::Reference< frame::XFrame > xTargetFrame = xDesktop->findFrame("_blank", 0);
+ CPPUNIT_ASSERT(xTargetFrame.is());
+
+ // This ContainerWindow corresponds to the outermost window of a running LibreOffice.
+ // It needs a non-zero size and must be shown. Otherwise visible elements like the
+ // LayerTabBar in Draw have zero size and cannot get mouse events.
+ // The here used size is freely chosen.
+ uno::Reference<awt::XWindow> xContainerWindow = xTargetFrame->getContainerWindow();
+ CPPUNIT_ASSERT(xContainerWindow.is());
+ xContainerWindow->setPosSize(0, 0, 1024, 768, awt::PosSize::SIZE);
+ xContainerWindow->setVisible(true);
+
+ // 1. Open the document
+ sd::DrawDocShellRef xDocSh = loadURL(rURL, nFormat);
+ CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocSh.is());
+
+ uno::Reference< frame::XModel2 > xModel2 = xDocSh->GetModel();
+ CPPUNIT_ASSERT(xModel2.is());
+
+ uno::Reference< frame::XController2 > xController = xModel2->createDefaultViewController(xTargetFrame);
+ CPPUNIT_ASSERT(xController.is());
+
+ // introduce model/view/controller to each other
+ xController->attachModel(xModel2);
+ xModel2->connectController(xController);
+ xTargetFrame->setComponent(xController->getComponentWindow(), xController);
+ xController->attachFrame(xTargetFrame);
+ xModel2->setCurrentController(xController);
+
+ sd::ViewShell *pViewShell = xDocSh->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell);
+
+ // Draw has no slidesorter, Impress never shows a LayerTabBar
+ if (sd::ViewShell::ST_DRAW == pViewShell->GetShellType())
+ {
+ sd::LayerTabBar* pLayerTabBar = static_cast<sd::GraphicViewShell*>(pViewShell)->GetLayerTabControl();
+ CPPUNIT_ASSERT(pLayerTabBar);
+ pLayerTabBar->StateChanged(StateChangedType::InitShow);
+ }
+ else
+ {
+ sd::slidesorter::SlideSorterViewShell* pSSVS = nullptr;
+ for (int i = 0; i < 1000; i++)
+ {
+ // Process all Tasks - slide sorter is created here
+ Scheduler::ProcessEventsToIdle();
+ if ((pSSVS = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(pViewShell->GetViewShellBase())) != nullptr)
+ break;
+ osl::Thread::wait(std::chrono::milliseconds(100));
+ }
+ CPPUNIT_ASSERT(pSSVS);
+ }
+
+ return xDocSh;
+}
+
+void SdMiscTest::testTdf96206()
+{
+ // Copying/pasting slide referring to a non-default master with a text duplicated the master
+
+ sd::DrawDocShellRef xDocSh = Load(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf96206.odp"), ODP);
+ sd::ViewShell *pViewShell = xDocSh->GetViewShell();
+ auto pSSVS = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(pViewShell->GetViewShellBase());
+ auto& rSSController = pSSVS->GetSlideSorter().GetController();
+
+ const sal_uInt16 nMasterPageCnt1 = xDocSh->GetDoc()->GetMasterSdPageCount(PageKind::Standard);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), nMasterPageCnt1);
+ rSSController.GetClipboard().DoCopy();
+ rSSController.GetClipboard().DoPaste();
+ const sal_uInt16 nMasterPageCnt2 = xDocSh->GetDoc()->GetMasterSdPageCount(PageKind::Standard);
+ CPPUNIT_ASSERT_EQUAL(nMasterPageCnt1, nMasterPageCnt2);
+
+ xDocSh->DoClose();
+}
+
+void SdMiscTest::testTdf96708()
+{
+ sd::DrawDocShellRef xDocSh = Load(m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf96708.odp"), ODP);
+ sd::ViewShell *pViewShell = xDocSh->GetViewShell();
+ auto pSSVS = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(pViewShell->GetViewShellBase());
+ auto& rSSController = pSSVS->GetSlideSorter().GetController();
+ auto& rPageSelector = rSSController.GetPageSelector();
+
+ const sal_uInt16 nMasterPageCnt1 = xDocSh->GetDoc()->GetMasterSdPageCount(PageKind::Standard);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), nMasterPageCnt1);
+ rPageSelector.SelectAllPages();
+ rSSController.GetClipboard().DoCopy();
+
+ // Now wait for timers to trigger creation of auto-layout
+ osl::Thread::wait(std::chrono::milliseconds(100));
+ Scheduler::ProcessEventsToIdle();
+
+ rSSController.GetClipboard().DoPaste();
+ const sal_uInt16 nMasterPageCnt2 = xDocSh->GetDoc()->GetMasterSdPageCount(PageKind::Standard);
+ CPPUNIT_ASSERT_EQUAL(nMasterPageCnt1, nMasterPageCnt2);
+
+ xDocSh->DoClose();
+}
+
+void SdMiscTest::testTdf99396()
+{
+ // Load the document and select the table.
+ sd::DrawDocShellRef xDocSh = Load(m_directories.getURLFromSrc(u"/sd/qa/unit/data/tdf99396.odp"), ODP);
+ sd::ViewShell *pViewShell = xDocSh->GetViewShell();
+ SdPage* pPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pPage->GetObj(0);
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pObject, pView->GetSdrPageView());
+
+ // Make sure that the undo stack is empty.
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionCount());
+
+ // Set the vertical alignment of the cells to bottom.
+ sdr::table::SvxTableController* pTableController = dynamic_cast<sdr::table::SvxTableController*>(pView->getSelectionController().get());
+ CPPUNIT_ASSERT(pTableController);
+ SfxRequest aRequest(pViewShell->GetViewFrame(), SID_TABLE_VERT_BOTTOM);
+ pTableController->Execute(aRequest);
+ // This was 0, it wasn't possible to undo a vertical alignment change.
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionCount());
+
+ xDocSh->DoClose();
+}
+
+void SdMiscTest::testTableObjectUndoTest()
+{
+ // See tdf#99396 for the issue
+
+ // Load the document and select the table.
+ sd::DrawDocShellRef xDocSh = Load(m_directories.getURLFromSrc(u"/sd/qa/unit/data/tdf99396.odp"), ODP);
+ sd::ViewShell* pViewShell = xDocSh->GetViewShell();
+ SdPage* pPage = pViewShell->GetActualPage();
+ auto pTableObject = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pTableObject);
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pTableObject, pView->GetSdrPageView());
+
+ // Make sure that the undo stack is empty.
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionCount());
+
+ // Set horizontal and vertical adjustment during text edit.
+ pView->SdrBeginTextEdit(pTableObject);
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+ {
+ SfxRequest aRequest(pViewShell->GetViewFrame(), SID_ATTR_PARA_ADJUST_RIGHT);
+ SfxItemSet aEditAttr(xDocSh->GetDoc()->GetPool());
+ pView->GetAttributes(aEditAttr);
+ SfxItemSet aNewAttr(*(aEditAttr.GetPool()), aEditAttr.GetRanges());
+ aNewAttr.Put(SvxAdjustItem(SvxAdjust::Right, EE_PARA_JUST));
+ aRequest.Done(aNewAttr);
+ const SfxItemSet* pArgs = aRequest.GetArgs();
+ pView->SetAttributes(*pArgs);
+ }
+ const auto& pLocalUndoManager = pView->getViewLocalUndoManager();
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pLocalUndoManager->GetUndoActionCount());
+ CPPUNIT_ASSERT_EQUAL(OUString("Apply attributes"), pLocalUndoManager->GetUndoActionComment());
+ {
+ auto pTableController = dynamic_cast<sdr::table::SvxTableController*>(pView->getSelectionController().get());
+ CPPUNIT_ASSERT(pTableController);
+ SfxRequest aRequest(pViewShell->GetViewFrame(), SID_TABLE_VERT_BOTTOM);
+ pTableController->Execute(aRequest);
+ }
+ // Global change "Format cell" is applied only - Change the vertical alignment to "Bottom"
+ CPPUNIT_ASSERT_EQUAL(size_t(1), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionCount());
+ CPPUNIT_ASSERT_EQUAL(OUString("Format cell"), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionComment());
+
+ pView->SdrEndTextEdit();
+
+ // End of text edit, so the text edit action is added to the undo stack
+ CPPUNIT_ASSERT_EQUAL(size_t(2), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionCount());
+ CPPUNIT_ASSERT_EQUAL(OUString("Edit text of Table"), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionComment(0));
+ CPPUNIT_ASSERT_EQUAL(OUString("Format cell"), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionComment(1));
+
+ // Check that the result is what we expect.
+ {
+ uno::Reference<table::XTable> xTable = pTableObject->getTable();
+ uno::Reference<beans::XPropertySet> xCell(xTable->getCellByPosition(0, 0), uno::UNO_QUERY);
+ drawing::TextVerticalAdjust eAdjust = xCell->getPropertyValue("TextVerticalAdjust").get<drawing::TextVerticalAdjust>();
+ CPPUNIT_ASSERT_EQUAL(int(drawing::TextVerticalAdjust_BOTTOM), static_cast<int>(eAdjust));
+ }
+ {
+ const EditTextObject& rEdit = pTableObject->getText(0)->GetOutlinerParaObject()->GetTextObject();
+ const SfxItemSet& rParaAttribs = rEdit.GetParaAttribs(0);
+ auto pAdjust = rParaAttribs.GetItem(EE_PARA_JUST);
+ CPPUNIT_ASSERT_EQUAL(SvxAdjust::Right, pAdjust->GetAdjust());
+ }
+
+ // Now undo.
+ xDocSh->GetUndoManager()->Undo();
+
+ // Undoing the last action - one left
+ CPPUNIT_ASSERT_EQUAL(size_t(1), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionCount());
+ CPPUNIT_ASSERT_EQUAL(OUString("Format cell"), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionComment(0));
+
+ // Check again that the result is what we expect.
+ {
+ uno::Reference<table::XTable> xTable = pTableObject->getTable();
+ uno::Reference<beans::XPropertySet> xCell(xTable->getCellByPosition(0, 0), uno::UNO_QUERY);
+ drawing::TextVerticalAdjust eAdjust = xCell->getPropertyValue("TextVerticalAdjust").get<drawing::TextVerticalAdjust>();
+ // This failed: Undo() did not change it from drawing::TextVerticalAdjust_BOTTOM.
+ CPPUNIT_ASSERT_EQUAL(int(drawing::TextVerticalAdjust_TOP), static_cast<int>(eAdjust));
+ }
+ {
+ const EditTextObject& rEdit = pTableObject->getText(0)->GetOutlinerParaObject()->GetTextObject();
+ const SfxItemSet& rParaAttribs = rEdit.GetParaAttribs(0);
+ auto pAdjust = rParaAttribs.GetItem(EE_PARA_JUST);
+ CPPUNIT_ASSERT_EQUAL(SvxAdjust::Center, pAdjust->GetAdjust());
+ }
+
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT_EQUAL(size_t(1), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionCount());
+ CPPUNIT_ASSERT_EQUAL(OUString("Format cell"), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionComment(0));
+
+ /*
+ * now test tdf#103950 - Undo does not revert bundled font size changes for table cells
+ */
+ pTableObject = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ pView->MarkObj(pTableObject, pView->GetSdrPageView()); // select table
+ {
+ SfxRequest aRequest(pViewShell->GetViewFrame(), SID_GROW_FONT_SIZE);
+ static_cast<sd::DrawViewShell*>(pViewShell)->ExecChar(aRequest);
+ }
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionCount());
+ CPPUNIT_ASSERT_EQUAL(OUString("Apply attributes to Table"), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionComment(0));
+ CPPUNIT_ASSERT_EQUAL(OUString("Grow font size"), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionComment(1));
+ CPPUNIT_ASSERT_EQUAL(OUString("Format cell"), xDocSh->GetDoc()->GetUndoManager()->GetUndoActionComment(2));
+
+ xDocSh->DoClose();
+}
+
+void SdMiscTest::testFillGradient()
+{
+ ::sd::DrawDocShellRef xDocShRef = new ::sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Impress);
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier = getDoc( xDocShRef );
+ uno::Reference<drawing::XDrawPages> xDrawPages = xDrawPagesSupplier->getDrawPages();
+ // Insert a new page.
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPages->insertNewByIndex(0), uno::UNO_SET_THROW );
+ uno::Reference<drawing::XShapes> xShapes(xDrawPage,uno::UNO_QUERY_THROW);
+ uno::Reference<lang::XMultiServiceFactory> const xDoc(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY);
+ // Create a rectangle
+ uno::Reference<drawing::XShape> xShape1(xDoc->createInstance("com.sun.star.drawing.RectangleShape"),uno::UNO_QUERY_THROW );
+ uno::Reference<beans::XPropertySet> xPropSet(xShape1, uno::UNO_QUERY_THROW);
+ // Set FillStyle and FillGradient
+ awt::Gradient aGradient;
+ aGradient.StartColor = sal_Int32(Color(255, 0, 0));
+ aGradient.EndColor = sal_Int32(Color(0, 255, 0));
+ xPropSet->setPropertyValue("FillStyle", uno::Any(drawing::FillStyle_GRADIENT));
+ xPropSet->setPropertyValue("FillGradient", uno::Any(aGradient));
+ // Add the rectangle to the page.
+ xShapes->add(xShape1);
+
+ // Retrieve the shape and check FillStyle and FillGradient
+ uno::Reference<container::XIndexAccess> xIndexAccess(xDrawPage, uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet > xPropSet2(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW);
+ drawing::FillStyle eFillStyle;
+ awt::Gradient aGradient2;
+ CPPUNIT_ASSERT(xPropSet2->getPropertyValue("FillStyle") >>= eFillStyle);
+ CPPUNIT_ASSERT_EQUAL(int(drawing::FillStyle_GRADIENT), static_cast<int>(eFillStyle));
+ CPPUNIT_ASSERT(xPropSet2->getPropertyValue("FillGradient") >>= aGradient2);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(Color(255, 0, 0)),aGradient2.StartColor);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(Color(0, 255, 0)),aGradient2.EndColor);
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf44774()
+{
+ sd::DrawDocShellRef xDocShRef = new sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false,
+ DocumentType::Draw);
+ const uno::Reference<frame::XLoadable> xLoadable(xDocShRef->GetModel(), uno::UNO_QUERY_THROW);
+ xLoadable->initNew();
+ SfxStyleSheetBasePool* pSSPool = xDocShRef->GetStyleSheetPool();
+
+ // Create a new style with an empty name, like what happens in UI when creating a new style
+ SfxStyleSheetBase& rStyleA = pSSPool->Make("", SfxStyleFamily::Para, SfxStyleSearchBits::UserDefined);
+ // Assign a new name, which does not yet set its ApiName
+ rStyleA.SetName("StyleA");
+ // Create another style
+ SfxStyleSheetBase& rStyleB = pSSPool->Make("StyleB", SfxStyleFamily::Para, SfxStyleSearchBits::UserDefined);
+ // ... and set its parent to the first one
+ rStyleB.SetParent("StyleA");
+
+ // Now save the file and reload
+ xDocShRef = saveAndReload(xDocShRef.get(), ODG);
+ pSSPool = xDocShRef->GetStyleSheetPool();
+
+ SfxStyleSheetBase* pStyle = pSSPool->Find("StyleB", SfxStyleFamily::Para);
+ CPPUNIT_ASSERT(pStyle);
+ // The parent set in StyleB used to reset, because parent style's msApiName was empty
+ CPPUNIT_ASSERT_EQUAL(OUString("StyleA"), pStyle->GetParent());
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf38225()
+{
+ sd::DrawDocShellRef xDocShRef = new sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false,
+ DocumentType::Draw);
+ const uno::Reference<frame::XLoadable> xLoadable(xDocShRef->GetModel(), uno::UNO_QUERY_THROW);
+ xLoadable->initNew();
+ SfxStyleSheetBasePool* pSSPool = xDocShRef->GetStyleSheetPool();
+
+ // Create a new style with a name
+ pSSPool->Make("StyleWithName1", SfxStyleFamily::Para, SfxStyleSearchBits::UserDefined);
+
+ // Now save the file and reload
+ xDocShRef = saveAndReload(xDocShRef.get(), ODG);
+ pSSPool = xDocShRef->GetStyleSheetPool();
+
+ SfxStyleSheetBase* pStyle = pSSPool->Find("StyleWithName1", SfxStyleFamily::Para);
+ CPPUNIT_ASSERT(pStyle);
+
+ // Rename the style
+ CPPUNIT_ASSERT(pStyle->SetName("StyleWithName2"));
+
+ // Save the file and reload again
+ xDocShRef = saveAndReload(xDocShRef.get(), ODG);
+ pSSPool = xDocShRef->GetStyleSheetPool();
+
+ // The problem was that the style kept the old name upon reloading
+ pStyle = pSSPool->Find("StyleWithName1", SfxStyleFamily::Para);
+ CPPUNIT_ASSERT(!pStyle);
+ pStyle = pSSPool->Find("StyleWithName2", SfxStyleFamily::Para);
+ CPPUNIT_ASSERT(pStyle);
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf120527()
+{
+ sd::DrawDocShellRef xDocShRef
+ = new sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Draw);
+ uno::Reference<frame::XLoadable> xLoadable(xDocShRef->GetModel(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xLoadable.is());
+ xLoadable->initNew();
+
+ // Load a bitmap into the bitmap table.
+ uno::Reference<lang::XMultiServiceFactory> xFactory(xDocShRef->GetModel(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xFactory.is());
+ uno::Reference<container::XNameContainer> xBitmaps(
+ xFactory->createInstance("com.sun.star.drawing.BitmapTable"), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xBitmaps.is());
+ OUString aGraphicURL = m_directories.getURLFromSrc(u"/sd/qa/unit/data/tdf120527.jpg");
+ xBitmaps->insertByName("test", uno::Any(aGraphicURL));
+
+ // Create a graphic.
+ uno::Reference<drawing::XShape> xShape(
+ xFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xShape.is());
+ uno::Reference<beans::XPropertySet> xShapeProperySet(xShape, uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xShapeProperySet.is());
+ xShapeProperySet->setPropertyValue("GraphicURL", xBitmaps->getByName("test"));
+
+ // Insert it.
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(xDocShRef->GetModel(),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDrawPagesSupplier.is());
+ uno::Reference<drawing::XDrawPages> xDrawPages = xDrawPagesSupplier->getDrawPages();
+ CPPUNIT_ASSERT(xDrawPages.is());
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPages->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xDrawPage.is());
+ // This failed with a lang.IllegalArgumentException.
+ xDrawPage->add(xShape);
+
+ // Verify that the graphic was actually consumed.
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShapeProperySet->getPropertyValue("Graphic") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+
+ xDocShRef->DoClose();
+}
+
+// Testing document model part of editengine-columns
+void SdMiscTest::testTextColumns()
+{
+ ::sd::DrawDocShellRef xDocShRef
+ = new ::sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Impress);
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier = getDoc(xDocShRef);
+ uno::Reference<drawing::XDrawPages> xDrawPages = xDrawPagesSupplier->getDrawPages();
+ // Insert a new page.
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPages->insertNewByIndex(0),
+ uno::UNO_SET_THROW);
+ uno::Reference<drawing::XShapes> xShapes(xDrawPage, uno::UNO_QUERY_THROW);
+ uno::Reference<lang::XMultiServiceFactory> const xDoc(xDocShRef->GetDoc()->getUnoModel(),
+ uno::UNO_QUERY);
+
+ {
+ // Create a text shape
+ uno::Reference<drawing::XShape> xShape(
+ xDoc->createInstance("com.sun.star.drawing.TextShape"), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropSet(xShape, uno::UNO_QUERY_THROW);
+
+ // Add the shape to the page.
+ xShapes->add(xShape);
+
+ // Set up columns
+ auto pTextObj = dynamic_cast<SdrTextObj*>(SdrObject::getSdrObjectFromXShape(xShape));
+ CPPUNIT_ASSERT(pTextObj);
+ pTextObj->SetMergedItem(SfxInt16Item(SDRATTR_TEXTCOLUMNS_NUMBER, 2));
+ pTextObj->SetMergedItem(SdrMetricItem(SDRATTR_TEXTCOLUMNS_SPACING, 1000));
+ }
+
+ {
+ // Retrieve the shape and check columns
+ uno::Reference<container::XIndexAccess> xIndexAccess(xDrawPage, uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XShape> xShape(xIndexAccess->getByIndex(0), uno::UNO_QUERY_THROW);
+
+ auto pTextObj = dynamic_cast<SdrTextObj*>(SdrObject::getSdrObjectFromXShape(xShape));
+ CPPUNIT_ASSERT(pTextObj);
+
+ CPPUNIT_ASSERT_EQUAL(sal_Int16(2), pTextObj->GetTextColumnsNumber());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), pTextObj->GetTextColumnsSpacing());
+ }
+
+ xDocShRef->DoClose();
+}
+
+/// Draw miscellaneous tests.
+
+// Since LO 6.2 the visible/printable/locked information for layers is always
+// written as ODF attributes draw:display and draw:protected. It is only read from
+// there, if the config items VisibleLayers, PrintableLayers and LockedLayers do
+// not exist. The user option WriteLayerStateAsConfigItem can be set to 'true' to
+// write these config items in addition to the ODF attributes for to produce
+// documents for older LO versions or Apache OpenOffice. With value 'false' no
+// config items are written. The 'testTdf101242_xyz' tests combine source
+// files with and without config items with option values 'true' and 'false'.
+
+void SdMiscTest::testTdf101242_ODF_add_settings()
+{
+ // Loads a document, which has the visible/printable/locked information for layers
+ // only in the ODF attributes draw:display and draw:protected. The resaved document
+ // should still have the ODF attributes and in addition the config items in settings.xml.
+ // "Load" is needed for to handle layers, simple "loadURL" does not work.
+ sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc(u"/sd/qa/unit/data/tdf101242_ODF.odg"), ODG);
+ CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocShRef.is());
+
+ // Saving including items in settings.xml
+ std::shared_ptr<comphelper::ConfigurationChanges> pBatch( comphelper::ConfigurationChanges::create() );
+ officecfg::Office::Common::Misc::WriteLayerStateAsConfigItem::set(true, pBatch);
+ pBatch->commit();
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ save(xDocShRef.get(), getFormat(ODG), aTempFile );
+
+ // Verify, that the saved document still has the ODF attributes
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "styles.xml");
+ CPPUNIT_ASSERT_MESSAGE("Failed to get 'styles.xml'", pXmlDoc);
+ const OString sPathStart("/office:document-styles/office:master-styles/draw:layer-set/draw:layer");
+ assertXPath(pXmlDoc, sPathStart + "[@draw:name='backgroundobjects' and @draw:protected='true']");
+ assertXPath(pXmlDoc, sPathStart + "[@draw:name='controls' and @draw:display='screen']");
+ assertXPath(pXmlDoc, sPathStart + "[@draw:name='measurelines' and @draw:display='printer']");
+
+ // Verify, that the saved document has got the items in settings.xml
+ xmlDocUniquePtr pXmlDoc2 = parseExport(aTempFile, "settings.xml");
+ CPPUNIT_ASSERT_MESSAGE("Failed to get 'settings.xml'", pXmlDoc2);
+ const OString sPathStart2("/office:document-settings/office:settings/config:config-item-set[@config:name='ooo:view-settings']/config:config-item-map-indexed[@config:name='Views']/config:config-item-map-entry");
+ // Value is a bitfield with first Byte in order '* * * measurelines controls backgroundobjects background layout'
+ // The first three bits depend on initialization and may change. The values in file are Base64 encoded.
+ OUString sBase64;
+ uno::Sequence<sal_Int8> aDecodedSeq;
+ sBase64 = getXPathContent(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='VisibleLayers']");
+ CPPUNIT_ASSERT_MESSAGE( "Item VisibleLayers does not exists.", !sBase64.isEmpty());
+ comphelper::Base64::decode(aDecodedSeq, sBase64);
+ CPPUNIT_ASSERT_EQUAL( 0x0F, static_cast<sal_uInt8>(aDecodedSeq[0]) & 0x1F );
+
+ sBase64 = getXPathContent(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='PrintableLayers']");
+ CPPUNIT_ASSERT_MESSAGE( "Item PrintableLayers does not exists.", !sBase64.isEmpty());
+ comphelper::Base64::decode(aDecodedSeq, sBase64);
+ CPPUNIT_ASSERT_EQUAL( 0x17, static_cast<sal_uInt8>(aDecodedSeq[0]) & 0x1F);
+
+ sBase64 = getXPathContent(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='LockedLayers']");
+ CPPUNIT_ASSERT_MESSAGE( "Item LockedLayers does not exists.", !sBase64.isEmpty());
+ comphelper::Base64::decode(aDecodedSeq, sBase64);
+ CPPUNIT_ASSERT_EQUAL( 0x04, static_cast<sal_uInt8>(aDecodedSeq[0]) & 0x1F);
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf101242_ODF_no_settings()
+{
+ // Loads a document, which has the visible/printable/locked information for layers
+ // only in the ODF attributes draw:display and draw:protected. The resave document
+ // should have only the ODF attributes and no config items in settings.xml.
+ sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc(u"/sd/qa/unit/data/tdf101242_ODF.odg"), ODG);
+ CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocShRef.is());
+
+ // Saving without items in settings.xml
+ std::shared_ptr<comphelper::ConfigurationChanges> pBatch( comphelper::ConfigurationChanges::create() );
+ officecfg::Office::Common::Misc::WriteLayerStateAsConfigItem::set(false, pBatch);
+ pBatch->commit();
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ save(xDocShRef.get(), getFormat(ODG), aTempFile );
+
+ // Verify, that the saved document still has the ODF attributes
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "styles.xml");
+ CPPUNIT_ASSERT_MESSAGE("Failed to get 'styles.xml'", pXmlDoc);
+ const OString sPathStart("/office:document-styles/office:master-styles/draw:layer-set/draw:layer");
+ assertXPath(pXmlDoc, sPathStart + "[@draw:name='backgroundobjects' and @draw:protected='true']");
+ assertXPath(pXmlDoc, sPathStart + "[@draw:name='controls' and @draw:display='screen']");
+ assertXPath(pXmlDoc, sPathStart + "[@draw:name='measurelines' and @draw:display='printer']");
+
+ // Verify, that the saved document has no layer items in settings.xml
+ xmlDocUniquePtr pXmlDoc2 = parseExport(aTempFile, "settings.xml");
+ CPPUNIT_ASSERT_MESSAGE("Failed to get 'settings.xml'", pXmlDoc2);
+ const OString sPathStart2("/office:document-settings/office:settings/config:config-item-set[@config:name='ooo:view-settings']/config:config-item-map-indexed[@config:name='Views']/config:config-item-map-entry");
+ xmlXPathObjectPtr pXmlObj=getXPathNode(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='VisibleLayers']");
+ CPPUNIT_ASSERT_EQUAL(0, xmlXPathNodeSetGetLength(pXmlObj->nodesetval));
+ xmlXPathFreeObject(pXmlObj);
+ pXmlObj=getXPathNode(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='PrintableLayers']");
+ CPPUNIT_ASSERT_EQUAL(0, xmlXPathNodeSetGetLength(pXmlObj->nodesetval));
+ xmlXPathFreeObject(pXmlObj);
+ pXmlObj=getXPathNode(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='LockedLayers']");
+ CPPUNIT_ASSERT_EQUAL(0, xmlXPathNodeSetGetLength(pXmlObj->nodesetval));
+ xmlXPathFreeObject(pXmlObj);
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf101242_settings_keep()
+{
+ // Loads a document, which has the visible/printable/locked information for layers
+ // only in the config items in settings.xml. That is the case for all old documents.
+ // The resaved document should have the ODF attributes draw:display and draw:protected
+ // and should still have these config items in settings.xml.
+ sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc(u"/sd/qa/unit/data/tdf101242_settings.odg"), ODG);
+ CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocShRef.is());
+
+ // Saving including items in settings.xml
+ std::shared_ptr<comphelper::ConfigurationChanges> pBatch( comphelper::ConfigurationChanges::create() );
+ officecfg::Office::Common::Misc::WriteLayerStateAsConfigItem::set(true, pBatch);
+ pBatch->commit();
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ save(xDocShRef.get(), getFormat(ODG), aTempFile );
+
+ // Verify, that the saved document has the ODF attributes
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "styles.xml");
+ CPPUNIT_ASSERT_MESSAGE("Failed to get 'styles.xml'", pXmlDoc);
+ const OString sPathStart("/office:document-styles/office:master-styles/draw:layer-set/draw:layer");
+ assertXPath(pXmlDoc, sPathStart + "[@draw:name='backgroundobjects' and @draw:protected='true']");
+ assertXPath(pXmlDoc, sPathStart + "[@draw:name='controls' and @draw:display='screen']");
+ assertXPath(pXmlDoc, sPathStart + "[@draw:name='measurelines' and @draw:display='printer']");
+
+ // Verify, that the saved document still has the items in settings.xml
+ xmlDocUniquePtr pXmlDoc2 = parseExport(aTempFile, "settings.xml");
+ CPPUNIT_ASSERT_MESSAGE("Failed to get 'settings.xml'", pXmlDoc2);
+ const OString sPathStart2("/office:document-settings/office:settings/config:config-item-set[@config:name='ooo:view-settings']/config:config-item-map-indexed[@config:name='Views']/config:config-item-map-entry");
+ // Value is a bitfield with first Byte in order '* * * measurelines controls backgroundobjects background layout'
+ // The first three bits depend on initialization and may change. The values in file are Base64 encoded.
+ OUString sBase64;
+ uno::Sequence<sal_Int8> aDecodedSeq;
+ sBase64 = getXPathContent(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='VisibleLayers']");
+ CPPUNIT_ASSERT_MESSAGE( "Item VisibleLayers does not exists.", !sBase64.isEmpty());
+ comphelper::Base64::decode(aDecodedSeq, sBase64);
+ CPPUNIT_ASSERT_EQUAL( 0x0F, static_cast<sal_uInt8>(aDecodedSeq[0]) & 0x1F );
+
+ sBase64 = getXPathContent(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='PrintableLayers']");
+ CPPUNIT_ASSERT_MESSAGE( "Item PrintableLayers does not exists.", !sBase64.isEmpty());
+ comphelper::Base64::decode(aDecodedSeq, sBase64);
+ CPPUNIT_ASSERT_EQUAL( 0x17, static_cast<sal_uInt8>(aDecodedSeq[0]) & 0x1F);
+
+ sBase64 = getXPathContent(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='LockedLayers']");
+ CPPUNIT_ASSERT_MESSAGE( "Item LockedLayers does not exists.", !sBase64.isEmpty());
+ comphelper::Base64::decode(aDecodedSeq, sBase64);
+ CPPUNIT_ASSERT_EQUAL( 0x04, static_cast<sal_uInt8>(aDecodedSeq[0]) & 0x1F);
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf101242_settings_remove()
+{
+ // Loads a document, which has the visible/printable/locked information for layers
+ // only in the config items in settings.xml. That is the case for all old documents.
+ // The resaved document should have only the ODF attributes draw:display and draw:protected
+ // and should have no config items in settings.xml.
+ sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc(u"/sd/qa/unit/data/tdf101242_settings.odg"), ODG);
+ CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocShRef.is());
+
+ // Saving without config items in settings.xml
+ std::shared_ptr<comphelper::ConfigurationChanges> pBatch( comphelper::ConfigurationChanges::create() );
+ officecfg::Office::Common::Misc::WriteLayerStateAsConfigItem::set(false, pBatch);
+ pBatch->commit();
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ save(xDocShRef.get(), getFormat(ODG), aTempFile );
+
+ // Verify, that the saved document has the ODF attributes
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "styles.xml");
+ CPPUNIT_ASSERT_MESSAGE("Failed to get 'styles.xml'", pXmlDoc);
+ const OString sPathStart("/office:document-styles/office:master-styles/draw:layer-set/draw:layer");
+ assertXPath(pXmlDoc, sPathStart + "[@draw:name='backgroundobjects' and @draw:protected='true']");
+ assertXPath(pXmlDoc, sPathStart + "[@draw:name='controls' and @draw:display='screen']");
+ assertXPath(pXmlDoc, sPathStart + "[@draw:name='measurelines' and @draw:display='printer']");
+
+ // Verify, that the saved document has no layer items in settings.xml
+ xmlDocUniquePtr pXmlDoc2 = parseExport(aTempFile, "settings.xml");
+ CPPUNIT_ASSERT_MESSAGE("Failed to get 'settings.xml'", pXmlDoc2);
+ const OString sPathStart2("/office:document-settings/office:settings/config:config-item-set[@config:name='ooo:view-settings']/config:config-item-map-indexed[@config:name='Views']/config:config-item-map-entry");
+ xmlXPathObjectPtr pXmlObj=getXPathNode(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='VisibleLayers']");
+ CPPUNIT_ASSERT_EQUAL(0, xmlXPathNodeSetGetLength(pXmlObj->nodesetval));
+ xmlXPathFreeObject(pXmlObj);
+ pXmlObj=getXPathNode(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='PrintableLayers']");
+ CPPUNIT_ASSERT_EQUAL(0, xmlXPathNodeSetGetLength(pXmlObj->nodesetval));
+ xmlXPathFreeObject(pXmlObj);
+ pXmlObj=getXPathNode(pXmlDoc2, sPathStart2 + "/config:config-item[@config:name='LockedLayers']");
+ CPPUNIT_ASSERT_EQUAL(0, xmlXPathNodeSetGetLength(pXmlObj->nodesetval));
+ xmlXPathFreeObject(pXmlObj);
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf119392()
+{
+ // Loads a document which has two user layers "V--" and "V-L". Inserts a new layer "-P-" between them.
+ // Checks, that the bitfields in the saved file have the bits in the correct order, in case
+ // option WriteLayerAsConfigItem is true and the config items are written.
+ std::shared_ptr<comphelper::ConfigurationChanges> batch( comphelper::ConfigurationChanges::create() );
+ officecfg::Office::Common::Misc::WriteLayerStateAsConfigItem::set(true, batch);
+ batch->commit();
+
+ sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf119392_InsertLayer.odg"), ODG);
+ CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocShRef.is());
+ // Insert layer "-P-", not visible, printable, not locked
+ SdrView* pView = xDocShRef -> GetViewShell()->GetView();
+ pView -> InsertNewLayer("-P-", 6); // 0..4 standard layer, 5 layer "V--"
+ SdrPageView* pPageView = pView -> GetSdrPageView();
+ pPageView -> SetLayerVisible("-P-", false);
+ pPageView -> SetLayerPrintable("-P-", true);
+ pPageView -> SetLayerLocked("-P-", false);
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ save(xDocShRef.get(), getFormat(ODG), aTempFile );
+
+ // Verify correct bit order in bitfield in the config items in settings.xml
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "settings.xml");
+ CPPUNIT_ASSERT_MESSAGE("Failed to get 'settings.xml'", pXmlDoc);
+ const OString sPathStart("/office:document-settings/office:settings/config:config-item-set[@config:name='ooo:view-settings']/config:config-item-map-indexed[@config:name='Views']/config:config-item-map-entry");
+ // First Byte is in order 'V-L -P- V-- measurelines controls backgroundobjects background layout'
+ // Bits need to be: visible=10111111=0xbf=191 printable=01011111=0x5f=95 locked=10000000=0x80=128
+ // The values in file are Base64 encoded.
+ OUString sBase64;
+ uno::Sequence<sal_Int8> aDecodedSeq;
+ sBase64 = getXPathContent(pXmlDoc, sPathStart + "/config:config-item[@config:name='VisibleLayers']");
+ CPPUNIT_ASSERT_MESSAGE( "Item VisibleLayers does not exists.", !sBase64.isEmpty());
+ comphelper::Base64::decode(aDecodedSeq, sBase64);
+ CPPUNIT_ASSERT_EQUAL( 0xbF, static_cast<sal_uInt8>(aDecodedSeq[0]) & 0xff); // & 0xff forces unambiguous types for CPPUNIT_ASSERT_EQUAL
+
+ sBase64 = getXPathContent(pXmlDoc, sPathStart + "/config:config-item[@config:name='PrintableLayers']");
+ CPPUNIT_ASSERT_MESSAGE( "Item PrintableLayers does not exists.", !sBase64.isEmpty());
+ comphelper::Base64::decode(aDecodedSeq, sBase64);
+ CPPUNIT_ASSERT_EQUAL( 0x5f, static_cast<sal_uInt8>(aDecodedSeq[0]) & 0xff);
+
+ sBase64 = getXPathContent(pXmlDoc, sPathStart + "/config:config-item[@config:name='LockedLayers']");
+ CPPUNIT_ASSERT_MESSAGE( "Item LockedLayers does not exists.", !sBase64.isEmpty());
+ comphelper::Base64::decode(aDecodedSeq, sBase64);
+ CPPUNIT_ASSERT_EQUAL( 0x80, static_cast<sal_uInt8>(aDecodedSeq[0]) & 0xff);
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf67248()
+{
+ // The document tdf67248.odg has been created with a German UI. It has a user layer named "Background".
+ // On opening the user layer must still exists. The error was, that it was merged into the standard
+ // layer "background".
+ sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf67248.odg"), ODG);
+ CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocShRef.is());
+ SdrLayerAdmin& rLayerAdmin = xDocShRef->GetDoc()->GetLayerAdmin();
+ CPPUNIT_ASSERT_EQUAL( sal_uInt16(6), rLayerAdmin.GetLayerCount());
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf119956()
+{
+ sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf119956.odg"), ODG);
+ CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocShRef.is());
+ sd::GraphicViewShell* pGraphicViewShell = static_cast<sd::GraphicViewShell*>(xDocShRef -> GetViewShell());
+ CPPUNIT_ASSERT(pGraphicViewShell);
+ sd::LayerTabBar* pLayerTabBar = pGraphicViewShell->GetLayerTabControl();
+ CPPUNIT_ASSERT(pLayerTabBar);
+
+ // Alt+Click sets a tab in edit mode, so that you can rename it.
+ // The error was, that Alt+Click on a tab, which was not the current tab, did not set the clicked tab
+ // as current tab. As a result, the entered text was applied to the wrong tab.
+
+ // The test document has the layer tabs "layout", "controls", "measurelines" and "Layer4" in this order
+ // The "pagePos" is 0, 1, 2, 3
+ // Make sure, that tab "layout" is the current tab.
+ MouseEvent aSyntheticMouseEvent;
+ if (pLayerTabBar->GetCurPagePos() != 0)
+ {
+ sal_uInt16 nIdOfTabPos0(pLayerTabBar->GetPageId(0));
+ tools::Rectangle aTabPos0Rect(pLayerTabBar->GetPageRect(nIdOfTabPos0));
+ aSyntheticMouseEvent = MouseEvent(aTabPos0Rect.Center(), 1, MouseEventModifiers::SYNTHETIC, MOUSE_LEFT, 0);
+ pLayerTabBar->MouseButtonDown(aSyntheticMouseEvent);
+ }
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pLayerTabBar->GetCurPagePos());
+
+ // Alt+Click on tab "Layer4"
+ sal_uInt16 nIdOfTabPos3(pLayerTabBar->GetPageId(3));
+ tools::Rectangle aTabPos3Rect(pLayerTabBar->GetPageRect(nIdOfTabPos3));
+ aSyntheticMouseEvent = MouseEvent(aTabPos3Rect.Center(), 1, MouseEventModifiers::SYNTHETIC, MOUSE_LEFT, KEY_MOD2);
+ pLayerTabBar->MouseButtonDown(aSyntheticMouseEvent);
+
+ // Make sure, tab 3 is current tab now.
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pLayerTabBar->GetCurPagePos());
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf98839_ShearVFlipH()
+{
+ // Loads a document with a sheared shape and mirrors it
+ sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf98839_ShearVFlipH.odg"), ODG);
+ sd::GraphicViewShell* pViewShell = static_cast<sd::GraphicViewShell*>(xDocShRef->GetViewShell());
+ SdPage* pPage = pViewShell->GetActualPage();
+ SdrObjCustomShape* pShape = static_cast<SdrObjCustomShape*>(pPage->GetObj(0));
+ pShape->Mirror(Point(4000, 2000), Point(4000, 10000));
+
+ // Save and examine attribute draw:transform
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ save(xDocShRef.get(), getFormat(ODG), aTempFile);
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "content.xml");
+ CPPUNIT_ASSERT_MESSAGE("Failed to get 'content.xml'", pXmlDoc);
+ const OString sPathStart("/office:document-content/office:body/office:drawing/draw:page");
+ assertXPath(pXmlDoc, sPathStart);
+ const OUString sTransform = getXPath(pXmlDoc, sPathStart + "/draw:custom-shape","transform");
+
+ // Error was, that the shear angle had a wrong sign.
+ CPPUNIT_ASSERT_MESSAGE("expected: draw:transform='skewX (-0.64350...)", sTransform.startsWith("skewX (-"));
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf130988()
+{
+ sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf130988_3D_create_lathe.odg"), ODG);
+
+ //emulate command .uno:ConvertInto3DLathe
+ sd::ViewShell* pViewShell = xDocShRef->GetViewShell();
+ E3dView* pView = pViewShell->GetView();
+ pView->MarkNextObj();
+ pView->ConvertMarkedObjTo3D(false, basegfx::B2DPoint(8000.0, -3000.0), basegfx::B2DPoint(3000.0, -8000.0));
+ E3dScene* pObj = dynamic_cast<E3dScene*>(pView->GetMarkedObjectByIndex(0));
+ CPPUNIT_ASSERT(pObj);
+
+ // Error was, that the created 3D object had a wrong path. Instead examining
+ // the path directly, I use the scene distance, because that is easier. The
+ // scene distance is calculated from the object while creating.
+ const double fDistance = pObj->GetDistance();
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("D3DSceneDistance", 7071.0, fDistance, 0.5);
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf131033()
+{
+ sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf131033_3D_SceneSizeIn2d.odg"), ODG);
+
+ // The document contains a polygon, so that emulate command .uno:ConvertInto3DLathe
+ // by direct call of ConvertMarkedObjTo3D works.
+ // It produces a rotation around a vertical axis, which is far away from the
+ // generating shape.
+ sd::ViewShell* pViewShell = xDocShRef->GetViewShell();
+ E3dView* pView = pViewShell->GetView();
+ pView->MarkNextObj();
+ pView->ConvertMarkedObjTo3D(false, basegfx::B2DPoint(11000.0, -5000.0), basegfx::B2DPoint(11000.0, -9000.0));
+ E3dScene* pObj = dynamic_cast<E3dScene*>(pView->GetMarkedObjectByIndex(0));
+ CPPUNIT_ASSERT(pObj);
+
+ // Error was, that the 2D representation of the scene did not contain the default 20°
+ // rotation of the new scene around x-axis and therefore was not high enough.
+ const double fSnapRectHeight = pObj->GetSnapRect().getHeight();
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("2D height", 7096.0, fSnapRectHeight, 1.0);
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf129898LayerDrawnInSlideshow()
+{
+ // Versions LO 6.2 to 6.4 have produced files, where the layer DrawnInSlideshow has
+ // got visible=false and printable=false attributes. Those files should be repaired now.
+ sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf129898_faulty_DrawnInSlideshow.odp"), ODP);
+ CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocShRef.is());
+
+ // Verify model
+ static const OUStringLiteral sName = u"DrawnInSlideshow";
+ SdrLayerAdmin& rLayerAdmin = xDocShRef->GetDoc()->GetLayerAdmin();
+ SdrLayer* pLayer = rLayerAdmin.GetLayer(sName);
+ CPPUNIT_ASSERT_MESSAGE("No layer DrawnInSlideshow", pLayer);
+ CPPUNIT_ASSERT(pLayer->IsVisibleODF());
+ CPPUNIT_ASSERT(pLayer->IsPrintableODF());
+
+ // Verify view
+ sd::DrawViewShell* pViewShell = static_cast<sd::DrawViewShell*>(xDocShRef->GetViewShell());
+ SdrPageView* pPageView = pViewShell->GetView()->GetSdrPageView();
+ CPPUNIT_ASSERT(pPageView->IsLayerVisible(sName));
+ CPPUNIT_ASSERT(pPageView->IsLayerPrintable(sName));
+
+ xDocShRef->DoClose();
+}
+
+void SdMiscTest::testTdf136956()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/odp/cellspan.odp"), ODP);
+
+ const SdrPage *pPage = GetPage( 1, xDocShRef );
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT( pTableObj );
+ uno::Reference< table::XTable > xTable(pTableObj->getTable(), uno::UNO_SET_THROW);
+
+ uno::Reference< css::table::XMergeableCellRange > xRange(
+ xTable->createCursorByRange( xTable->getCellRangeByPosition( 0, 0, 3, 2 ) ), uno::UNO_QUERY_THROW );
+
+ // 4x3 Table before merge.
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable->getColumnCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getRowCount());
+
+ xRange->merge();
+
+ // 1x1 Table after merge.
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumnCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRowCount());
+
+ xDocShRef->GetUndoManager()->Undo();
+
+ // 4x3 Table after undo. Undo crashed before.
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable->getColumnCount());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getRowCount());
+
+ xDocShRef->DoClose();
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdMiscTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/sdmodeltestbase.hxx b/sd/qa/unit/sdmodeltestbase.hxx
new file mode 100644
index 000000000..03b087f8b
--- /dev/null
+++ b/sd/qa/unit/sdmodeltestbase.hxx
@@ -0,0 +1,497 @@
+/* -*- 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/.
+ */
+
+#pragma once
+
+#include <memory>
+#include <string_view>
+
+#include <test/bootstrapfixture.hxx>
+#include <test/xmldiff.hxx>
+#include <test/xmltesttools.hxx>
+
+#include <unotest/filters-test.hxx>
+#include <unotest/macros_test.hxx>
+
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <GraphicDocShell.hxx>
+#include <unotools/tempfile.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#include <tools/color.hxx>
+#include <comphelper/fileformat.h>
+#include <comphelper/processfactory.hxx>
+#include <o3tl/safeint.hxx>
+#include <rtl/strbuf.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/docfilt.hxx>
+#include <svl/itemset.hxx>
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/packages/zip/ZipFileAccess.hpp>
+#include <drawinglayer/XShapeDumper.hxx>
+#include <com/sun/star/text/XTextField.hpp>
+
+using namespace ::com::sun::star;
+
+struct FileFormat
+{
+ const char* pName;
+ const char* pFilterName;
+ const char* pTypeName;
+ const char* pUserData;
+ SfxFilterFlags nFormatType;
+};
+
+// These values are taken from "Flags" in filter/source/config/fragments/filters/*
+// You need to turn value of oor:name="Flags" to SfxFilterFlags::*, see
+// include/comphelper/documentconstants.hxx for the possible values.
+// Note: 3RDPARTYFILTER == SfxFilterFlags::STARONEFILTER
+#define ODP_FORMAT_TYPE ( SfxFilterFlags::IMPORT | SfxFilterFlags::EXPORT | SfxFilterFlags::TEMPLATE | SfxFilterFlags::OWN | SfxFilterFlags::DEFAULT | SfxFilterFlags::ENCRYPTION | SfxFilterFlags::PREFERED )
+#define PPT_FORMAT_TYPE ( SfxFilterFlags::IMPORT | SfxFilterFlags::EXPORT | SfxFilterFlags::ALIEN )
+#define PPTX_FORMAT_TYPE ( SfxFilterFlags::IMPORT | SfxFilterFlags::EXPORT | SfxFilterFlags::ALIEN | SfxFilterFlags::STARONEFILTER | SfxFilterFlags::PREFERED )
+#define HTML_FORMAT_TYPE ( SfxFilterFlags::EXPORT | SfxFilterFlags::ALIEN )
+#define PDF_FORMAT_TYPE ( SfxFilterFlags::STARONEFILTER | SfxFilterFlags::ALIEN | SfxFilterFlags::IMPORT | SfxFilterFlags::PREFERED )
+#define FODG_FORMAT_TYPE (SfxFilterFlags::STARONEFILTER | SfxFilterFlags::OWN | SfxFilterFlags::IMPORT | SfxFilterFlags::EXPORT)
+#define FODP_FORMAT_TYPE (SfxFilterFlags::STARONEFILTER | SfxFilterFlags::OWN | SfxFilterFlags::IMPORT | SfxFilterFlags::EXPORT)
+#define SXI_FORMAT_TYPE (SfxFilterFlags::IMPORT | SfxFilterFlags::TEMPLATE | SfxFilterFlags::OWN | SfxFilterFlags::ALIEN | SfxFilterFlags::PREFERED | SfxFilterFlags::ENCRYPTION)
+#define ODG_FORMAT_TYPE ( SfxFilterFlags::IMPORT | SfxFilterFlags::EXPORT | SfxFilterFlags::TEMPLATE | SfxFilterFlags::OWN | SfxFilterFlags::DEFAULT | SfxFilterFlags::ENCRYPTION | SfxFilterFlags::PREFERED )
+#define PPTM_FORMAT_TYPE ( SfxFilterFlags::IMPORT | SfxFilterFlags::EXPORT | SfxFilterFlags::ALIEN | SfxFilterFlags::STARONEFILTER | SfxFilterFlags::PREFERED )
+#define POTX_FORMAT_TYPE ( SfxFilterFlags::IMPORT | SfxFilterFlags::EXPORT | SfxFilterFlags::ALIEN | SfxFilterFlags::TEMPLATE | SfxFilterFlags::STARONEFILTER | SfxFilterFlags::PREFERED )
+
+/** List of file formats we support in Impress unit tests.
+
+Taken from filter/source/config/fragments/filters/ too:
+pName: The file extension.
+pFilterName: <node oor:Name="...">
+pTypeName: <prop oor:Name="Type">...</prop>
+nFormatType: <prop oor:name="Flags">...</prop>
+*/
+static FileFormat aFileFormats[] =
+{
+ { "odp", "impress8", "impress8", "", ODP_FORMAT_TYPE },
+ { "ppt", "MS PowerPoint 97", "impress_MS_PowerPoint_97", "sdfilt", PPT_FORMAT_TYPE },
+ { "pptx", "Impress Office Open XML", "Office Open XML Presentation", "", PPTX_FORMAT_TYPE },
+ { "html", "graphic_HTML", "graphic_HTML", "", HTML_FORMAT_TYPE },
+ { "pdf", "draw_pdf_import", "pdf_Portable_Document_Format", "", PDF_FORMAT_TYPE },
+ { "fodg", "OpenDocument Drawing Flat XML", "draw_ODG_FlatXML", "", FODG_FORMAT_TYPE },
+ { "fodp", "OpenDocument Presentation Flat XML", "impress_ODP_FlatXML", "", FODP_FORMAT_TYPE },
+ { "sxi", "StarOffice XML (Impress)", "impress_StarOffice_XML_Impress", "", SXI_FORMAT_TYPE },
+ { "odg", "draw8", "draw8", "", ODG_FORMAT_TYPE },
+ { "pptm", "Impress MS PowerPoint 2007 XML VBA", "MS PowerPoint 2007 XML VBA", "", PPTM_FORMAT_TYPE },
+ { "potx", "Impress Office Open XML Template", "Office Open XML Presentation Template", "", POTX_FORMAT_TYPE },
+ { nullptr, nullptr, nullptr, nullptr, SfxFilterFlags::NONE }
+};
+
+#define ODP 0
+#define PPT 1
+#define PPTX 2
+#define HTML 3
+#define PDF 4
+#define FODG 5
+#define FODP 6
+#define SXI 7
+#define ODG 8
+#define PPTM 9
+#define POTX 10
+
+/// Base class for filter tests loading or roundtripping a document, and asserting the document model.
+class SdModelTestBase : public test::BootstrapFixture, public unotest::MacrosTest
+{
+private:
+ uno::Reference<uno::XInterface> mxDrawComponent;
+ uno::Reference<uno::XInterface> mxImpressComponent;
+
+public:
+ SdModelTestBase()
+ {}
+
+ virtual void setUp() override
+ {
+ test::BootstrapFixture::setUp();
+
+ // This is a bit of a fudge, we do this to ensure that ScGlobals::ensure,
+ // which is a private symbol to us, gets called
+ mxImpressComponent = getMultiServiceFactory()->createInstance("com.sun.star.comp.Draw.PresentationDocument");
+ CPPUNIT_ASSERT_MESSAGE("no impress component!", mxImpressComponent.is());
+ mxDrawComponent = getMultiServiceFactory()->createInstance("com.sun.star.comp.Draw.DrawingDocument");
+ CPPUNIT_ASSERT_MESSAGE("no draw component!", mxDrawComponent.is());
+ }
+
+ virtual void tearDown() override
+ {
+ uno::Reference<lang::XComponent>(mxImpressComponent, uno::UNO_QUERY_THROW)->dispose();
+ uno::Reference<lang::XComponent>(mxDrawComponent, uno::UNO_QUERY_THROW)->dispose();
+ test::BootstrapFixture::tearDown();
+ }
+
+protected:
+ /// Load the document.
+ sd::DrawDocShellRef loadURL( const OUString &rURL, sal_Int32 nFormat, std::shared_ptr<SfxAllItemSet> pParams = nullptr )
+ {
+ FileFormat *pFmt = getFormat(nFormat);
+ CPPUNIT_ASSERT_MESSAGE( "missing filter info", pFmt->pName != nullptr );
+ if ( std::strcmp(pFmt->pName, "odg") == 0)
+ { // Draw
+ SotClipboardFormatId nOptions = SotClipboardFormatId::NONE;
+ if (pFmt->nFormatType != SfxFilterFlags::NONE)
+ nOptions = SotClipboardFormatId::STARDRAW_8;
+ auto pFilter = std::make_shared<SfxFilter>(
+ OUString::createFromAscii( pFmt->pFilterName ),
+ OUString(), pFmt->nFormatType, nOptions,
+ OUString::createFromAscii( pFmt->pTypeName ),
+ OUString(),
+ OUString::createFromAscii( pFmt->pUserData ),
+ "private:factory/sdraw*" );
+ pFilter->SetVersion(SOFFICE_FILEFORMAT_CURRENT);
+
+ ::sd::DrawDocShellRef xDocShRef = new ::sd::GraphicDocShell(SfxObjectCreateMode::EMBEDDED);
+ SfxMedium* pSrcMed = new SfxMedium(rURL, StreamMode::STD_READ, pFilter, std::move(pParams));
+ if ( !xDocShRef->DoLoad(pSrcMed) || !xDocShRef.is() )
+ {
+ if (xDocShRef.is())
+ xDocShRef->DoClose();
+ CPPUNIT_ASSERT_MESSAGE( OString("failed to load Draw doc" + OUStringToOString( rURL, RTL_TEXTENCODING_UTF8 )).getStr(), false );
+ }
+ CPPUNIT_ASSERT_MESSAGE( "not in destruction", !xDocShRef->IsInDestruction() );
+ return xDocShRef;
+ }
+ else // Impress
+ {
+ SotClipboardFormatId nOptions = SotClipboardFormatId::NONE;
+ if (pFmt->nFormatType != SfxFilterFlags::NONE)
+ nOptions = SotClipboardFormatId::STARIMPRESS_8;
+ auto pFilter = std::make_shared<SfxFilter>(
+ OUString::createFromAscii( pFmt->pFilterName ),
+ OUString(), pFmt->nFormatType, nOptions,
+ OUString::createFromAscii( pFmt->pTypeName ),
+ OUString(),
+ OUString::createFromAscii( pFmt->pUserData ),
+ "private:factory/simpress*" );
+ pFilter->SetVersion(SOFFICE_FILEFORMAT_CURRENT);
+
+ ::sd::DrawDocShellRef xDocShRef = new ::sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Impress);
+ SfxMedium* pSrcMed = new SfxMedium(rURL, StreamMode::STD_READ, pFilter, std::move(pParams));
+ if ( !xDocShRef->DoLoad(pSrcMed) || !xDocShRef.is() )
+ {
+ if (xDocShRef.is())
+ xDocShRef->DoClose();
+ CPPUNIT_ASSERT_MESSAGE( OString("failed to load " + OUStringToOString( rURL, RTL_TEXTENCODING_UTF8 )).getStr(), false );
+ }
+ CPPUNIT_ASSERT_MESSAGE( "not in destruction", !xDocShRef->IsInDestruction() );
+ return xDocShRef;
+ }
+ }
+
+ FileFormat* getFormat(sal_Int32 nExportType)
+ {
+ FileFormat* pFormat = &aFileFormats[0];
+ if (o3tl::make_unsigned(nExportType) < SAL_N_ELEMENTS(aFileFormats))
+ pFormat = &aFileFormats[nExportType];
+ return pFormat;
+ }
+
+ void exportTo(sd::DrawDocShell* pShell, FileFormat const * pFormat, utl::TempFile const & rTempFile)
+ {
+ SfxMedium aStoreMedium(rTempFile.GetURL(), StreamMode::STD_WRITE);
+ if ( std::strcmp(pFormat->pName, "odg") == 0)
+ { // Draw
+ SotClipboardFormatId nExportFormat = SotClipboardFormatId::NONE;
+ if (pFormat->nFormatType == ODG_FORMAT_TYPE)
+ nExportFormat = SotClipboardFormatId::STARDRAW_8;
+ auto pExportFilter = std::make_shared<SfxFilter>(
+ OUString::createFromAscii(pFormat->pFilterName),
+ OUString(), pFormat->nFormatType, nExportFormat,
+ OUString::createFromAscii(pFormat->pTypeName),
+ OUString(),
+ OUString::createFromAscii(pFormat->pUserData),
+ "private:factory/sdraw*" );
+
+ pExportFilter->SetVersion(SOFFICE_FILEFORMAT_CURRENT);
+ aStoreMedium.SetFilter(pExportFilter);
+ }
+ else // Impress
+ {
+ SotClipboardFormatId nExportFormat = SotClipboardFormatId::NONE;
+ if (pFormat->nFormatType == ODP_FORMAT_TYPE)
+ nExportFormat = SotClipboardFormatId::STARIMPRESS_8;
+ auto pExportFilter = std::make_shared<SfxFilter>(
+ OUString::createFromAscii(pFormat->pFilterName),
+ OUString(), pFormat->nFormatType, nExportFormat,
+ OUString::createFromAscii(pFormat->pTypeName),
+ OUString(),
+ OUString::createFromAscii(pFormat->pUserData),
+ "private:factory/simpress*" );
+
+ pExportFilter->SetVersion(SOFFICE_FILEFORMAT_CURRENT);
+ aStoreMedium.SetFilter(pExportFilter);
+ }
+ pShell->ConvertTo(aStoreMedium);
+ pShell->DoClose();
+
+ }
+
+ void save(sd::DrawDocShell* pShell, FileFormat const * pFormat, utl::TempFile const & rTempFile)
+ {
+ SfxMedium aStoreMedium(rTempFile.GetURL(), StreamMode::STD_WRITE);
+ if ( std::strcmp(pFormat->pName, "odg") == 0 )
+ { // Draw
+ SotClipboardFormatId nExportFormat = SotClipboardFormatId::NONE;
+ if (pFormat->nFormatType == ODG_FORMAT_TYPE)
+ nExportFormat = SotClipboardFormatId::STARDRAW_8;
+ auto pExportFilter = std::make_shared<SfxFilter>(
+ OUString::createFromAscii(pFormat->pFilterName),
+ OUString(), pFormat->nFormatType, nExportFormat,
+ OUString::createFromAscii(pFormat->pTypeName),
+ OUString(),
+ OUString::createFromAscii(pFormat->pUserData),
+ "private:factory/sdraw*" );
+ pExportFilter->SetVersion(SOFFICE_FILEFORMAT_CURRENT);
+ aStoreMedium.SetFilter(pExportFilter);
+ }
+ else // Impress
+ {
+ SotClipboardFormatId nExportFormat = SotClipboardFormatId::NONE;
+ if (pFormat->nFormatType == ODP_FORMAT_TYPE)
+ nExportFormat = SotClipboardFormatId::STARCHART_8;
+ auto pExportFilter = std::make_shared<SfxFilter>(
+ OUString::createFromAscii(pFormat->pFilterName),
+ OUString(), pFormat->nFormatType, nExportFormat,
+ OUString::createFromAscii(pFormat->pTypeName),
+ OUString(),
+ OUString::createFromAscii(pFormat->pUserData),
+ "private:factory/simpress*" );
+ pExportFilter->SetVersion(SOFFICE_FILEFORMAT_CURRENT);
+ aStoreMedium.SetFilter(pExportFilter);
+ }
+ pShell->DoSaveAs(aStoreMedium);
+ pShell->DoClose();
+ }
+
+ sd::DrawDocShellRef saveAndReload(sd::DrawDocShell *pShell, sal_Int32 nExportType,
+ utl::TempFile * pTempFile = nullptr)
+ {
+ FileFormat* pFormat = getFormat(nExportType);
+ std::unique_ptr<utl::TempFile> pNewTempFile;
+ if (!pTempFile)
+ {
+ pNewTempFile.reset(new utl::TempFile);
+ pTempFile = pNewTempFile.get();
+ }
+ save(pShell, pFormat, *pTempFile);
+ if (nExportType == ODP || nExportType == ODG)
+ {
+ BootstrapFixture::validate(pTempFile->GetFileName(), test::ODF);
+ }
+ else if(nExportType == PPTX)
+ {
+ BootstrapFixture::validate(pTempFile->GetFileName(), test::OOXML);
+ }
+ else if(nExportType == PPT)
+ {
+ BootstrapFixture::validate(pTempFile->GetFileName(), test::MSBINARY);
+ }
+ pTempFile->EnableKillingFile();
+ return loadURL(pTempFile->GetURL(), nExportType);
+ }
+
+ /** Dump shapes in xDocShRef, and compare the dump against content of pShapesDumpFileNameBase<number>.xml.
+
+ @param bCreate Instead of comparing to the reference file(s), create it/them.
+ */
+ void compareWithShapesDump( ::sd::DrawDocShellRef xDocShRef, std::u16string_view rShapesDumpFileNameBase, bool bCreate )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "failed to load", xDocShRef.is() );
+ CPPUNIT_ASSERT_MESSAGE( "not in destruction", !xDocShRef->IsInDestruction() );
+
+ uno::Reference<frame::XModel> xTempModel(xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier (xTempModel, uno::UNO_QUERY_THROW);
+ uno::Reference< drawing::XDrawPages > xDrawPages = xDrawPagesSupplier->getDrawPages();
+ CPPUNIT_ASSERT(xDrawPages.is());
+
+ sal_Int32 nLength = xDrawPages->getCount();
+ for (sal_Int32 i = 0; i < nLength; ++i)
+ {
+ uno::Reference<drawing::XDrawPage> xDrawPage;
+ uno::Any aAny = xDrawPages->getByIndex(i);
+ aAny >>= xDrawPage;
+ uno::Reference< drawing::XShapes > xShapes(xDrawPage, uno::UNO_QUERY_THROW);
+ OUString aString = XShapeDumper::dump(xShapes);
+
+ OString aFileName = OUStringToOString( rShapesDumpFileNameBase, RTL_TEXTENCODING_UTF8 ) +
+ OString::number(i) + ".xml";
+
+ if ( bCreate )
+ {
+ std::ofstream aStream( aFileName.getStr(), std::ofstream::out | std::ofstream::binary );
+ aStream << aString;
+ aStream.close();
+ }
+ else
+ {
+ doXMLDiff(aFileName.getStr(),
+ OUStringToOString(aString, RTL_TEXTENCODING_UTF8).getStr(),
+ static_cast<int>(aString.getLength()),
+ OUStringToOString(
+ m_directories.getPathFromSrc(u"/sd/qa/unit/data/tolerance.xml"),
+ RTL_TEXTENCODING_UTF8).getStr());
+ }
+ }
+ xDocShRef->DoClose();
+ }
+
+ uno::Reference< drawing::XDrawPagesSupplier > getDoc( sd::DrawDocShellRef xDocShRef )
+ {
+ uno::Reference< drawing::XDrawPagesSupplier > xDoc (
+ xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW );
+ return xDoc;
+ }
+
+ uno::Reference< drawing::XDrawPage > getPage( int nPage, sd::DrawDocShellRef xDocShRef )
+ {
+ uno::Reference< drawing::XDrawPagesSupplier > xDoc( getDoc( xDocShRef ) );
+ uno::Reference< drawing::XDrawPage > xPage( xDoc->getDrawPages()->getByIndex( nPage ), uno::UNO_QUERY_THROW );
+ return xPage;
+ }
+
+ // very confusing ... UNO index-based access to pages is 0-based. This one is 1-based
+ const SdrPage* GetPage( int nPage, sd::DrawDocShellRef xDocShRef )
+ {
+ SdDrawDocument* pDoc = xDocShRef->GetDoc() ;
+ CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != nullptr );
+
+ const SdrPage* pPage = pDoc->GetPage( nPage );
+ CPPUNIT_ASSERT_MESSAGE( "no page", pPage != nullptr );
+ return pPage;
+ }
+
+ uno::Reference< beans::XPropertySet > getShape( int nShape, uno::Reference< drawing::XDrawPage > const & xPage )
+ {
+ uno::Reference< beans::XPropertySet > xShape( xPage->getByIndex( nShape ), uno::UNO_QUERY );
+ CPPUNIT_ASSERT_MESSAGE( "Failed to load shape", xShape.is() );
+ return xShape;
+ }
+
+ // Nth shape on Mth page
+ uno::Reference< beans::XPropertySet > getShapeFromPage( int nShape, int nPage, sd::DrawDocShellRef xDocShRef )
+ {
+ uno::Reference< drawing::XDrawPage > xPage ( getPage( nPage, xDocShRef ) );
+ uno::Reference< beans::XPropertySet > xShape( getShape( nShape, xPage ) );
+ CPPUNIT_ASSERT_MESSAGE( "Failed to load shape", xShape.is() );
+
+ return xShape;
+ }
+
+ // Nth paragraph of text in given text shape
+ uno::Reference< text::XTextRange > getParagraphFromShape( int nPara, uno::Reference< beans::XPropertySet > const & xShape )
+ {
+ uno::Reference< text::XText > xText = uno::Reference< text::XTextRange>( xShape, uno::UNO_QUERY_THROW )->getText();
+ CPPUNIT_ASSERT_MESSAGE( "Not a text shape", xText.is() );
+
+ uno::Reference< container::XEnumerationAccess > paraEnumAccess( xText, uno::UNO_QUERY );
+ uno::Reference< container::XEnumeration > paraEnum( paraEnumAccess->createEnumeration() );
+
+ for ( int i = 0; i < nPara; ++i )
+ paraEnum->nextElement();
+
+ uno::Reference< text::XTextRange > xParagraph( paraEnum->nextElement(), uno::UNO_QUERY_THROW );
+
+ return xParagraph;
+ }
+
+ uno::Reference< text::XTextRange > getRunFromParagraph( int nRun, uno::Reference< text::XTextRange > const & xParagraph )
+ {
+ uno::Reference< container::XEnumerationAccess > runEnumAccess(xParagraph, uno::UNO_QUERY);
+ uno::Reference< container::XEnumeration > runEnum = runEnumAccess->createEnumeration();
+
+ for ( int i = 0; i < nRun; ++i )
+ runEnum->nextElement();
+
+ uno::Reference< text::XTextRange > xRun( runEnum->nextElement(), uno::UNO_QUERY);
+
+ return xRun;
+ }
+
+ uno::Reference<text::XTextField> getTextFieldFromPage(int nRun, int nPara, int nShape, int nPage, sd::DrawDocShellRef xDocShRef)
+ {
+ // get TextShape 1 from the first page
+ uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( nShape, nPage, xDocShRef ) );
+
+ // Get first paragraph
+ uno::Reference<text::XTextRange> xParagraph( getParagraphFromShape( nPara, xShape ) );
+
+ // first chunk of text
+ uno::Reference<text::XTextRange> xRun( getRunFromParagraph( nRun, xParagraph ) );
+
+ uno::Reference< beans::XPropertySet > xPropSet( xRun, uno::UNO_QUERY_THROW );
+
+ uno::Reference<text::XTextField> xField;
+ xPropSet->getPropertyValue("TextField") >>= xField;
+ return xField;
+ }
+
+};
+
+class SdModelTestBaseXML
+ : public SdModelTestBase, public XmlTestTools
+{
+
+public:
+ xmlDocUniquePtr parseExport(utl::TempFile const & rTempFile, OUString const& rStreamName)
+ {
+ std::unique_ptr<SvStream> const pStream(parseExportStream(rTempFile, rStreamName));
+ xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get());
+ OUString const url(rTempFile.GetURL());
+ pXmlDoc->name = reinterpret_cast<char *>(xmlStrdup(
+ reinterpret_cast<xmlChar const *>(OUStringToOString(url, RTL_TEXTENCODING_UTF8).getStr())));
+ return pXmlDoc;
+ }
+
+};
+
+CPPUNIT_NS_BEGIN
+
+template<> struct assertion_traits<Color>
+{
+ static bool equal( const Color& c1, const Color& c2 )
+ {
+ return c1 == c2;
+ }
+
+ static std::string toString( const Color& c )
+ {
+ OStringStream ost;
+ ost << "Color: R:" << static_cast<int>(c.GetRed())
+ << " G:" << static_cast<int>(c.GetGreen())
+ << " B:" << static_cast<int>(c.GetBlue())
+ << " A:" << static_cast<int>(255 - c.GetAlpha());
+ return ost.str();
+ }
+};
+
+template<> struct assertion_traits<tools::Rectangle>
+{
+ static bool equal( const tools::Rectangle& r1, const tools::Rectangle& r2 )
+ {
+ return r1 == r2;
+ }
+
+ static std::string toString( const tools::Rectangle& r)
+ {
+ OStringStream ost;
+ ost << "Rect P: [" << r.Top() << ", " << r.Left() << "] "
+ "S: [" << r.GetWidth() << ", " << r.GetHeight() << "]";
+ return ost.str();
+ }
+};
+
+CPPUNIT_NS_END
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/tiledrendering/CallbackRecorder.hxx b/sd/qa/unit/tiledrendering/CallbackRecorder.hxx
new file mode 100644
index 000000000..ad64f5ab3
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/CallbackRecorder.hxx
@@ -0,0 +1,152 @@
+/* -*- 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/.
+ */
+
+#pragma once
+
+#include <cppunit/TestAssert.h>
+
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+#include <boost/property_tree/json_parser.hpp>
+#include <comphelper/string.hxx>
+#include <osl/conditn.hxx>
+#include <sfx2/viewsh.hxx>
+#include <test/lokcallback.hxx>
+#include <o3tl/string_view.hxx>
+
+using namespace css;
+
+namespace
+{
+std::vector<OUString> lcl_convertSeparated(std::u16string_view rString, sal_Unicode nSeparator)
+{
+ std::vector<OUString> aRet;
+
+ sal_Int32 nIndex = 0;
+ do
+ {
+ OUString aToken(o3tl::trim(o3tl::getToken(rString, 0, nSeparator, nIndex)));
+ if (!aToken.isEmpty())
+ aRet.push_back(aToken);
+ } while (nIndex >= 0);
+
+ return aRet;
+}
+
+void lcl_convertRectangle(std::u16string_view rString, tools::Rectangle& rRectangle)
+{
+ uno::Sequence<OUString> aSeq = comphelper::string::convertCommaSeparated(rString);
+ CPPUNIT_ASSERT(aSeq.getLength() == 4 || aSeq.getLength() == 5);
+ rRectangle.SetLeft(aSeq[0].toInt32());
+ rRectangle.SetTop(aSeq[1].toInt32());
+ rRectangle.setWidth(aSeq[2].toInt32());
+ rRectangle.setHeight(aSeq[3].toInt32());
+}
+}
+
+struct CallbackRecorder
+{
+ CallbackRecorder()
+ : m_bFound(true)
+ , m_nPart(0)
+ , m_nSelectionBeforeSearchResult(0)
+ , m_nSelectionAfterSearchResult(0)
+ , m_nSearchResultCount(0)
+ , m_callbackWrapper(&callback, this)
+ {
+ }
+
+ tools::Rectangle m_aInvalidation;
+ std::vector<::tools::Rectangle> m_aSelection;
+ bool m_bFound;
+ sal_Int32 m_nPart;
+ std::vector<OString> m_aSearchResultSelection;
+ std::vector<int> m_aSearchResultPart;
+ int m_nSelectionBeforeSearchResult;
+ int m_nSelectionAfterSearchResult;
+ int m_nSearchResultCount;
+ /// For document size changed callback.
+ osl::Condition m_aDocumentSizeCondition;
+ TestLokCallbackWrapper m_callbackWrapper;
+
+ static void callback(int nType, const char* pPayload, void* pData)
+ {
+ static_cast<CallbackRecorder*>(pData)->processCallback(nType, pPayload);
+ }
+
+ void processCallback(int nType, const char* pPayload)
+ {
+ switch (nType)
+ {
+ case LOK_CALLBACK_INVALIDATE_TILES:
+ {
+ OUString aPayload = OUString::createFromAscii(pPayload);
+ if (aPayload != "EMPTY" && m_aInvalidation.IsEmpty())
+ lcl_convertRectangle(aPayload, m_aInvalidation);
+ }
+ break;
+ case LOK_CALLBACK_TEXT_SELECTION:
+ {
+ OUString aPayload = OUString::createFromAscii(pPayload);
+ m_aSelection.clear();
+ for (const OUString& rString : lcl_convertSeparated(aPayload, u';'))
+ {
+ ::tools::Rectangle aRectangle;
+ lcl_convertRectangle(rString, aRectangle);
+ m_aSelection.push_back(aRectangle);
+ }
+ if (m_aSearchResultSelection.empty())
+ ++m_nSelectionBeforeSearchResult;
+ else
+ ++m_nSelectionAfterSearchResult;
+ }
+ break;
+ case LOK_CALLBACK_SEARCH_NOT_FOUND:
+ {
+ m_bFound = false;
+ }
+ break;
+ case LOK_CALLBACK_DOCUMENT_SIZE_CHANGED:
+ {
+ m_aDocumentSizeCondition.set();
+ }
+ break;
+ case LOK_CALLBACK_SET_PART:
+ {
+ OUString aPayload = OUString::createFromAscii(pPayload);
+ m_nPart = aPayload.toInt32();
+ }
+ break;
+ case LOK_CALLBACK_SEARCH_RESULT_SELECTION:
+ {
+ m_nSearchResultCount++;
+ m_aSearchResultSelection.clear();
+ m_aSearchResultPart.clear();
+ boost::property_tree::ptree aTree;
+ std::stringstream aStream(pPayload);
+ boost::property_tree::read_json(aStream, aTree);
+ for (const boost::property_tree::ptree::value_type& rValue :
+ aTree.get_child("searchResultSelection"))
+ {
+ m_aSearchResultSelection.emplace_back(
+ rValue.second.get<std::string>("rectangles").c_str());
+ m_aSearchResultPart.push_back(
+ std::atoi(rValue.second.get<std::string>("part").c_str()));
+ }
+ }
+ break;
+ }
+ }
+
+ void registerCallbacksFor(SfxViewShell& rViewShell)
+ {
+ rViewShell.setLibreOfficeKitViewCallback(&m_callbackWrapper);
+ }
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/tiledrendering/LOKitSearchTest.cxx b/sd/qa/unit/tiledrendering/LOKitSearchTest.cxx
new file mode 100644
index 000000000..12b83754d
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/LOKitSearchTest.cxx
@@ -0,0 +1,958 @@
+/* -*- 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 "../sdmodeltestbase.hxx"
+
+#include "CallbackRecorder.hxx"
+
+#include <test/bootstrapfixture.hxx>
+#include <test/helper/transferable.hxx>
+#include <test/xmltesttools.hxx>
+
+#include <comphelper/dispatchcommand.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertysequence.hxx>
+#include <comphelper/lok.hxx>
+#include <svl/srchitem.hxx>
+#include <vcl/scheduler.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShell.hxx>
+#include <unomodel.hxx>
+
+#include <sdpage.hxx>
+#include <svx/svdograf.hxx>
+#include <vcl/filter/PDFiumLibrary.hxx>
+
+#include <com/sun/star/frame/Desktop.hpp>
+
+using namespace css;
+
+class LOKitSearchTest : public SdModelTestBase, public XmlTestTools
+{
+private:
+ static constexpr OUStringLiteral DATA_DIRECTORY = u"/sd/qa/unit/tiledrendering/data/";
+
+public:
+ LOKitSearchTest() = default;
+
+ virtual void setUp() override;
+ virtual void tearDown() override;
+
+ void testSearch();
+ void testSearchAll();
+ void testSearchAllSelections();
+ void testSearchAllNotifications();
+ void testSearchAllFollowedBySearch();
+ void testDontSearchInMasterPages();
+ void testSearchInPDFNonExisting();
+ void testSearchInPDF();
+ void testSearchInPDFOnePDFObject();
+ void testSearchInPDFInMultiplePages();
+ void testSearchInPDFInMultiplePagesBackwards();
+ void testSearchIn2MixedObjects();
+ void testSearchIn6MixedObjects();
+ void testReplace();
+ void testReplaceAll();
+ void testReplaceCombined();
+
+ CPPUNIT_TEST_SUITE(LOKitSearchTest);
+ CPPUNIT_TEST(testSearch);
+ CPPUNIT_TEST(testSearchAll);
+ CPPUNIT_TEST(testSearchAllSelections);
+ CPPUNIT_TEST(testSearchAllNotifications);
+ CPPUNIT_TEST(testSearchAllFollowedBySearch);
+ CPPUNIT_TEST(testDontSearchInMasterPages);
+ CPPUNIT_TEST(testSearchInPDFNonExisting);
+ CPPUNIT_TEST(testSearchInPDF);
+ CPPUNIT_TEST(testSearchInPDFOnePDFObject);
+ CPPUNIT_TEST(testSearchInPDFInMultiplePages);
+ CPPUNIT_TEST(testSearchInPDFInMultiplePagesBackwards);
+ CPPUNIT_TEST(testSearchIn2MixedObjects);
+ CPPUNIT_TEST(testSearchIn6MixedObjects);
+ CPPUNIT_TEST(testReplace);
+ CPPUNIT_TEST(testReplaceAll);
+ CPPUNIT_TEST(testReplaceCombined);
+ CPPUNIT_TEST_SUITE_END();
+
+private:
+ SdXImpressDocument* createDoc(const char* pName,
+ const uno::Sequence<beans::PropertyValue>& rArguments
+ = uno::Sequence<beans::PropertyValue>());
+
+ uno::Reference<lang::XComponent> mxComponent;
+ std::unique_ptr<CallbackRecorder> mpCallbackRecorder;
+};
+
+void LOKitSearchTest::setUp()
+{
+ test::BootstrapFixture::setUp();
+
+ // prevent showing warning message box
+ setenv("OOX_NO_SMARTART_WARNING", "1", 1);
+ comphelper::LibreOfficeKit::setActive(true);
+
+ mxDesktop.set(
+ css::frame::Desktop::create(comphelper::getComponentContext(getMultiServiceFactory())));
+ mpCallbackRecorder = std::make_unique<CallbackRecorder>();
+}
+
+void LOKitSearchTest::tearDown()
+{
+ if (mxComponent.is())
+ mxComponent->dispose();
+
+ comphelper::LibreOfficeKit::setActive(false);
+
+ test::BootstrapFixture::tearDown();
+}
+
+SdXImpressDocument*
+LOKitSearchTest::createDoc(const char* pName, const uno::Sequence<beans::PropertyValue>& rArguments)
+{
+ if (mxComponent.is())
+ mxComponent->dispose();
+
+ mxComponent = loadFromDesktop(m_directories.getURLFromSrc(DATA_DIRECTORY)
+ + OUString::createFromAscii(pName));
+
+ SdXImpressDocument* pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ CPPUNIT_ASSERT(pImpressDocument);
+ pImpressDocument->initializeForTiledRendering(rArguments);
+ return pImpressDocument;
+}
+
+namespace
+{
+void lcl_search(const OUString& rKey, bool bFindAll = false, bool bBackwards = false)
+{
+ Scheduler::ProcessEventsToIdle();
+ SvxSearchCmd eSearch = bFindAll ? SvxSearchCmd::FIND_ALL : SvxSearchCmd::FIND;
+
+ uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence({
+ { "SearchItem.SearchString", uno::Any(rKey) },
+ { "SearchItem.Backward", uno::Any(bBackwards) },
+ { "SearchItem.Command", uno::Any(sal_uInt16(eSearch)) },
+ }));
+
+ comphelper::dispatchCommand(".uno:ExecuteSearch", aPropertyValues);
+ Scheduler::ProcessEventsToIdle();
+}
+
+void lcl_replace(const OUString& rKey, const OUString& rReplace, bool bAll = false)
+{
+ Scheduler::ProcessEventsToIdle();
+
+ SvxSearchCmd eSearch = bAll ? SvxSearchCmd::REPLACE_ALL : SvxSearchCmd::REPLACE;
+
+ uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence({
+ { "SearchItem.SearchString", uno::Any(rKey) },
+ { "SearchItem.ReplaceString", uno::Any(rReplace) },
+ { "SearchItem.Command", uno::Any(sal_uInt16(eSearch)) },
+ }));
+
+ comphelper::dispatchCommand(".uno:ExecuteSearch", aPropertyValues);
+ Scheduler::ProcessEventsToIdle();
+}
+
+SdrObject* lclGetSelectedObject(sd::ViewShell* pViewShell)
+{
+ SdrView* pSdrView = pViewShell->GetView();
+ const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList();
+ CPPUNIT_ASSERT_EQUAL(size_t(1), rMarkList.GetMarkCount());
+ SdrObject* pObject = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ return pObject;
+}
+
+} // end anonymous namespace
+
+void LOKitSearchTest::testSearch()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+ uno::Reference<container::XIndexAccess> xDrawPage(
+ pXImpressDocument->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<text::XTextRange> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY);
+ xShape->setString("Aaa bbb.");
+
+ lcl_search("bbb");
+
+ SdrView* pView = pViewShell->GetView();
+ EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView();
+ // Did we indeed manage to select the second word?
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), rEditView.GetSelected());
+
+ // Did the selection callback fire?
+ CPPUNIT_ASSERT_EQUAL(static_cast<std::size_t>(1), mpCallbackRecorder->m_aSelection.size());
+
+ // Search for something on the second slide, and make sure that the set-part callback fired.
+ lcl_search("bbb");
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), mpCallbackRecorder->m_nPart);
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ // This was 0; should be 1 match for "find".
+ CPPUNIT_ASSERT_EQUAL(static_cast<std::size_t>(1),
+ mpCallbackRecorder->m_aSearchResultSelection.size());
+ // Result is on the second slide.
+ CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_aSearchResultPart[0]);
+
+ // This should trigger the not-found callback.
+ lcl_search("ccc");
+ CPPUNIT_ASSERT_EQUAL(false, mpCallbackRecorder->m_bFound);
+}
+
+void LOKitSearchTest::testSearchAll()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("search-all.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ lcl_search("match", /*bFindAll=*/true);
+
+ // This was empty: find-all did not highlight the first match.
+ CPPUNIT_ASSERT_EQUAL(OString("match"),
+ apitest::helper::transferable::getTextSelection(
+ pXImpressDocument->getSelection(), "text/plain;charset=utf-8"));
+
+ // We're on the first slide, search for something on the second slide and make sure we get a SET_PART.
+ mpCallbackRecorder->m_nPart = 0;
+ lcl_search("second", /*bFindAll=*/true);
+ // This was 0: no SET_PART was emitted.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), mpCallbackRecorder->m_nPart);
+}
+
+void LOKitSearchTest::testSearchAllSelections()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("search-all.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ lcl_search("third", /*bFindAll=*/true);
+ // Make sure this is found on the 3rd slide.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), mpCallbackRecorder->m_nPart);
+ // This was 1: only the first match was highlighted.
+ CPPUNIT_ASSERT_EQUAL(static_cast<std::size_t>(2), mpCallbackRecorder->m_aSelection.size());
+}
+
+void LOKitSearchTest::testSearchAllNotifications()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("search-all.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ lcl_search("third", /*bFindAll=*/true);
+ // Make sure that we get no notifications about selection changes during search.
+ CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_nSelectionBeforeSearchResult);
+ // But we do get the selection of the first hit.
+ CPPUNIT_ASSERT(mpCallbackRecorder->m_nSelectionAfterSearchResult > 0);
+}
+
+void LOKitSearchTest::testSearchAllFollowedBySearch()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("search-all.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ lcl_search("third", /*bFindAll=*/true);
+ lcl_search("match" /*,bFindAll=false*/);
+
+ // This used to give wrong result: 'search' after 'search all' still
+ // returned 'third'
+ CPPUNIT_ASSERT_EQUAL(OString("match"),
+ apitest::helper::transferable::getTextSelection(
+ pXImpressDocument->getSelection(), "text/plain;charset=utf-8"));
+}
+
+void LOKitSearchTest::testDontSearchInMasterPages()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ // This should trigger the not-found callback ("date" is present only on
+ // the master page)
+ lcl_search("date");
+ CPPUNIT_ASSERT_EQUAL(false, mpCallbackRecorder->m_bFound);
+}
+
+void LOKitSearchTest::testSearchInPDFNonExisting()
+{
+ auto pPdfium = vcl::pdf::PDFiumLibrary::get();
+ if (!pPdfium)
+ {
+ return;
+ }
+
+ SdXImpressDocument* pXImpressDocument = createDoc("PDFSearch.pdf");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell);
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ SdPage* pPage = pViewShell->GetActualPage();
+ CPPUNIT_ASSERT(pPage);
+
+ SdrObject* pObject = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject);
+
+ SdrGrafObj* pGraphicObject = dynamic_cast<SdrGrafObj*>(pObject);
+ CPPUNIT_ASSERT(pGraphicObject);
+
+ Graphic aGraphic = pGraphicObject->GetGraphic();
+ auto const& pVectorGraphicData = aGraphic.getVectorGraphicData();
+ CPPUNIT_ASSERT(pVectorGraphicData);
+ CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
+
+ lcl_search("NonExisting");
+
+ CPPUNIT_ASSERT_EQUAL(false, mpCallbackRecorder->m_bFound);
+}
+
+void LOKitSearchTest::testSearchInPDF()
+{
+ auto pPdfium = vcl::pdf::PDFiumLibrary::get();
+ if (!pPdfium)
+ {
+ return;
+ }
+
+ SdXImpressDocument* pXImpressDocument = createDoc("PDFSearch.pdf");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell);
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ SdPage* pPage = pViewShell->GetActualPage();
+ CPPUNIT_ASSERT(pPage);
+
+ SdrObject* pObject = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject);
+
+ SdrGrafObj* pGraphicObject = dynamic_cast<SdrGrafObj*>(pObject);
+ CPPUNIT_ASSERT(pGraphicObject);
+
+ Graphic aGraphic = pGraphicObject->GetGraphic();
+ auto const& pVectorGraphicData = aGraphic.getVectorGraphicData();
+ CPPUNIT_ASSERT(pVectorGraphicData);
+ CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
+
+ // Search
+ lcl_search("ABC");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(OString("3763, 1331, 1432, 483"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+ CPPUNIT_ASSERT_EQUAL(tools::Rectangle(Point(3763, 1331), Size(1433, 484)),
+ mpCallbackRecorder->m_aSelection[0]);
+
+ // Search again - same result
+ lcl_search("ABC");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(2, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(OString("3763, 1331, 1432, 483"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+ CPPUNIT_ASSERT_EQUAL(tools::Rectangle(Point(3763, 1331), Size(1433, 484)),
+ mpCallbackRecorder->m_aSelection[0]);
+}
+
+void LOKitSearchTest::testSearchInPDFOnePDFObject()
+{
+ auto pPdfium = vcl::pdf::PDFiumLibrary::get();
+ if (!pPdfium)
+ {
+ return;
+ }
+
+ SdXImpressDocument* pXImpressDocument = createDoc("OnePDFObject.odg");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell);
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ SdPage* pPage = pViewShell->GetActualPage();
+ CPPUNIT_ASSERT(pPage);
+
+ SdrObject* pObject = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject);
+
+ SdrGrafObj* pGraphicObject = dynamic_cast<SdrGrafObj*>(pObject);
+ CPPUNIT_ASSERT(pGraphicObject);
+
+ Graphic aGraphic = pGraphicObject->GetGraphic();
+ auto const& pVectorGraphicData = aGraphic.getVectorGraphicData();
+ CPPUNIT_ASSERT(pVectorGraphicData);
+ CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
+
+ // Search down
+ lcl_search("ABC", false, false);
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_nSearchResultCount);
+
+ // Search up
+ lcl_search("ABC", false, true); // This caused a crash
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(2, mpCallbackRecorder->m_nSearchResultCount);
+}
+
+void LOKitSearchTest::testSearchInPDFInMultiplePages()
+{
+ auto pPdfium = vcl::pdf::PDFiumLibrary::get();
+ if (!pPdfium)
+ {
+ return;
+ }
+
+ SdXImpressDocument* pXImpressDocument = createDoc("PDFSearch.pdf");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell);
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ SdPage* pPage = pViewShell->GetActualPage();
+ CPPUNIT_ASSERT(pPage);
+
+ {
+ SdrObject* pObject = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject);
+
+ SdrGrafObj* pGraphicObject = dynamic_cast<SdrGrafObj*>(pObject);
+ CPPUNIT_ASSERT(pGraphicObject);
+
+ Graphic aGraphic = pGraphicObject->GetGraphic();
+ auto const& pVectorGraphicData = aGraphic.getVectorGraphicData();
+ CPPUNIT_ASSERT(pVectorGraphicData);
+ CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
+ }
+
+ // Search for "him"
+ lcl_search("him");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+
+ CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_aSearchResultPart[0]);
+ CPPUNIT_ASSERT_EQUAL(OString("9463, 3382, 1099, 499"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+
+ // Search for "him"
+ lcl_search("him");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(2, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+
+ CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_aSearchResultPart[0]);
+ CPPUNIT_ASSERT_EQUAL(OString("5592, 5038, 1100, 499"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+
+ // Search for "him"
+ lcl_search("him");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(3, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+
+ CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_aSearchResultPart[0]);
+ CPPUNIT_ASSERT_EQUAL(OString("9463, 1308, 1099, 499"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+
+ // Search for "him"
+ lcl_search("him");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(4, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+
+ CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_aSearchResultPart[0]);
+ CPPUNIT_ASSERT_EQUAL(OString("5592, 2964, 1100, 499"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+
+ // Search for "him" - back to start
+ lcl_search("him");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(5, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+
+ CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_aSearchResultPart[0]);
+ CPPUNIT_ASSERT_EQUAL(OString("9463, 3382, 1099, 499"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+}
+
+void LOKitSearchTest::testSearchInPDFInMultiplePagesBackwards()
+{
+ auto pPdfium = vcl::pdf::PDFiumLibrary::get();
+ if (!pPdfium)
+ {
+ return;
+ }
+
+ SdXImpressDocument* pXImpressDocument = createDoc("PDFSearch.pdf");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell);
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ SdPage* pPage = pViewShell->GetActualPage();
+ CPPUNIT_ASSERT(pPage);
+
+ {
+ SdrObject* pObject = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject);
+
+ SdrGrafObj* pGraphicObject = dynamic_cast<SdrGrafObj*>(pObject);
+ CPPUNIT_ASSERT(pGraphicObject);
+
+ Graphic aGraphic = pGraphicObject->GetGraphic();
+ auto const& pVectorGraphicData = aGraphic.getVectorGraphicData();
+ CPPUNIT_ASSERT(pVectorGraphicData);
+ CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
+ }
+
+ // Expected for backwards search is:
+ // - Start with Page 1
+ // + search backwards through objects
+ // + inside objects search backwards through text
+ // - Switch to Page 2
+ // + search backwards through objects
+ // + inside objects search backwards through text
+
+ // Search for "him"
+ lcl_search("him", /*FindAll*/ false, /*Backwards*/ true);
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+
+ CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_aSearchResultPart[0]);
+ CPPUNIT_ASSERT_EQUAL(OString("5592, 5038, 1100, 499"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+
+ // Search for "him"
+ lcl_search("him", /*FindAll*/ false, /*Backwards*/ true);
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(2, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+
+ CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_aSearchResultPart[0]);
+ CPPUNIT_ASSERT_EQUAL(OString("9463, 3382, 1099, 499"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+
+ // Search for "him"
+ lcl_search("him", /*FindAll*/ false, /*Backwards*/ true);
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(3, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+
+ CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_aSearchResultPart[0]);
+ CPPUNIT_ASSERT_EQUAL(OString("5592, 2964, 1100, 499"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+
+ // Search for "him"
+ lcl_search("him", /*FindAll*/ false, /*Backwards*/ true);
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(4, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+
+ CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_aSearchResultPart[0]);
+ CPPUNIT_ASSERT_EQUAL(OString("9463, 1308, 1099, 499"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+
+ // Search for "him" - back to start
+ lcl_search("him", /*FindAll*/ false, /*Backwards*/ true);
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(5, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+
+ CPPUNIT_ASSERT_EQUAL(0, mpCallbackRecorder->m_aSearchResultPart[0]);
+ CPPUNIT_ASSERT_EQUAL(OString("5592, 5038, 1100, 499"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+}
+
+// Test searching in document with mixed objects.
+// We have 2 objects: 1. Text Object, 2. Graphic Object with PDF
+void LOKitSearchTest::testSearchIn2MixedObjects()
+{
+ auto pPdfium = vcl::pdf::PDFiumLibrary::get();
+ if (!pPdfium)
+ {
+ return;
+ }
+
+ SdXImpressDocument* pXImpressDocument = createDoc("MixedTest1.odg");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell);
+ SdDrawDocument* pDocument = pXImpressDocument->GetDocShell()->GetDoc();
+ CPPUNIT_ASSERT(pDocument);
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ // Check we have one page
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pDocument->GetSdPageCount(PageKind::Standard));
+
+ SdPage* pPage = pViewShell->GetActualPage();
+ CPPUNIT_ASSERT(pPage);
+
+ // Check page has 2 objects only
+ CPPUNIT_ASSERT_EQUAL(size_t(2), pPage->GetObjCount());
+
+ // Check Object 1
+ {
+ SdrObject* pObject = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject);
+
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::Text, pObject->GetObjIdentifier());
+ }
+
+ // Check Object 2
+ {
+ SdrObject* pObject = pPage->GetObj(1);
+ CPPUNIT_ASSERT(pObject);
+
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::Graphic, pObject->GetObjIdentifier());
+
+ SdrGrafObj* pGraphicObject = dynamic_cast<SdrGrafObj*>(pObject);
+ CPPUNIT_ASSERT(pGraphicObject);
+
+ Graphic aGraphic = pGraphicObject->GetGraphic();
+ auto const& pVectorGraphicData = aGraphic.getVectorGraphicData();
+ CPPUNIT_ASSERT(pVectorGraphicData);
+
+ CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
+ }
+
+ // Let's try to search now
+
+ lcl_search("ABC");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+
+ CPPUNIT_ASSERT_EQUAL(OString("3546, 3174, 738, 402"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+
+ // Search next
+
+ lcl_search("ABC");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(2, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+
+ CPPUNIT_ASSERT_EQUAL(OString("8412, 6385, 519, 174"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+
+ // Search next again - we should get the first object again
+
+ lcl_search("ABC");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(3, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+
+ CPPUNIT_ASSERT_EQUAL(OString("3546, 3174, 738, 402"),
+ mpCallbackRecorder->m_aSearchResultSelection[0]);
+}
+
+// Test searching in document with mixed objects. We have 6 objects.
+void LOKitSearchTest::testSearchIn6MixedObjects()
+{
+ auto pPdfium = vcl::pdf::PDFiumLibrary::get();
+ if (!pPdfium)
+ {
+ return;
+ }
+
+ SdXImpressDocument* pXImpressDocument = createDoc("MixedTest2.odg");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell);
+ SdDrawDocument* pDocument = pXImpressDocument->GetDocShell()->GetDoc();
+ CPPUNIT_ASSERT(pDocument);
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ // Check we have one page
+ CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pDocument->GetSdPageCount(PageKind::Standard));
+
+ SdPage* pPage = pViewShell->GetActualPage();
+ CPPUNIT_ASSERT(pPage);
+
+ // Check page has 6 objects only
+ CPPUNIT_ASSERT_EQUAL(size_t(6), pPage->GetObjCount());
+
+ // Check we have the right objects that we expect
+
+ // Check Object 1
+ {
+ SdrObject* pObject = pPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::Text, pObject->GetObjIdentifier());
+ }
+
+ // Check Object 2
+ {
+ SdrObject* pObject = pPage->GetObj(1);
+ CPPUNIT_ASSERT(pObject);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::Graphic, pObject->GetObjIdentifier());
+ SdrGrafObj* pGraphicObject = dynamic_cast<SdrGrafObj*>(pObject);
+ CPPUNIT_ASSERT(pGraphicObject);
+ auto const& pVectorGraphicData = pGraphicObject->GetGraphic().getVectorGraphicData();
+ CPPUNIT_ASSERT(pVectorGraphicData);
+ CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
+ }
+
+ // Check Object 3
+ {
+ SdrObject* pObject = pPage->GetObj(2);
+ CPPUNIT_ASSERT(pObject);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::CustomShape, pObject->GetObjIdentifier());
+ }
+
+ // Check Object 4
+ {
+ SdrObject* pObject = pPage->GetObj(3);
+ CPPUNIT_ASSERT(pObject);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::CustomShape, pObject->GetObjIdentifier());
+ }
+
+ // Check Object 5
+ {
+ SdrObject* pObject = pPage->GetObj(4);
+ CPPUNIT_ASSERT(pObject);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::Graphic, pObject->GetObjIdentifier());
+ SdrGrafObj* pGraphicObject = dynamic_cast<SdrGrafObj*>(pObject);
+ CPPUNIT_ASSERT(pGraphicObject);
+ auto const& pVectorGraphicData = pGraphicObject->GetGraphic().getVectorGraphicData();
+ CPPUNIT_ASSERT(pVectorGraphicData);
+ CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Svg, pVectorGraphicData->getType());
+ }
+
+ // Check Object 6
+ {
+ SdrObject* pObject = pPage->GetObj(5);
+ CPPUNIT_ASSERT(pObject);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::Graphic, pObject->GetObjIdentifier());
+ SdrGrafObj* pGraphicObject = dynamic_cast<SdrGrafObj*>(pObject);
+ CPPUNIT_ASSERT(pGraphicObject);
+ auto const& pVectorGraphicData = pGraphicObject->GetGraphic().getVectorGraphicData();
+ CPPUNIT_ASSERT(pVectorGraphicData);
+ CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType());
+ }
+
+ // Search "ABC" which is in all objects (2 times in Object 3)
+
+ // Object 1
+ lcl_search("ABC");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(1, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+ CPPUNIT_ASSERT_EQUAL(pPage->GetObj(0), lclGetSelectedObject(pViewShell));
+
+ // Object 2
+ lcl_search("ABC");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(2, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+ CPPUNIT_ASSERT_EQUAL(pPage->GetObj(1), lclGetSelectedObject(pViewShell));
+
+ // Object 3
+ lcl_search("ABC");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(3, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+ CPPUNIT_ASSERT_EQUAL(pPage->GetObj(2), lclGetSelectedObject(pViewShell));
+
+ // Object 3 again
+ lcl_search("ABC");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(4, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+ CPPUNIT_ASSERT_EQUAL(pPage->GetObj(2), lclGetSelectedObject(pViewShell));
+
+ // Object 4
+ lcl_search("ABC");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(5, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+ CPPUNIT_ASSERT_EQUAL(pPage->GetObj(3), lclGetSelectedObject(pViewShell));
+
+ // Object 5
+ lcl_search("ABC");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(6, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+ CPPUNIT_ASSERT_EQUAL(pPage->GetObj(4), lclGetSelectedObject(pViewShell));
+
+ // Object 6
+ lcl_search("ABC");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(7, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+ CPPUNIT_ASSERT_EQUAL(pPage->GetObj(5), lclGetSelectedObject(pViewShell));
+
+ // Loop to Object 1 again
+ lcl_search("ABC");
+
+ CPPUNIT_ASSERT_EQUAL(true, mpCallbackRecorder->m_bFound);
+ CPPUNIT_ASSERT_EQUAL(8, mpCallbackRecorder->m_nSearchResultCount);
+
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultSelection.size());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), mpCallbackRecorder->m_aSearchResultPart.size());
+ CPPUNIT_ASSERT_EQUAL(pPage->GetObj(0), lclGetSelectedObject(pViewShell));
+}
+namespace
+{
+OUString getShapeText(SdXImpressDocument* pXImpressDocument, sal_uInt32 nPage, sal_uInt32 nShape)
+{
+ uno::Reference<container::XIndexAccess> xDrawPage;
+ xDrawPage.set(pXImpressDocument->getDrawPages()->getByIndex(nPage), uno::UNO_QUERY);
+
+ uno::Reference<text::XTextRange> xShape(xDrawPage->getByIndex(nShape), uno::UNO_QUERY);
+ return xShape->getString();
+}
+}
+
+void LOKitSearchTest::testReplace()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("ReplaceTest.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 0, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("Bbb bbb bbb bbb"), getShapeText(pXImpressDocument, 1, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 2, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 3, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 4, 0));
+
+ lcl_replace("bbb", "aaa", false); // select
+
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 0, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("Bbb bbb bbb bbb"), getShapeText(pXImpressDocument, 1, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 2, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 3, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 4, 0));
+
+ lcl_replace("bbb", "aaa", false); // replace
+
+ CPPUNIT_ASSERT_EQUAL(OUString("aaa"), getShapeText(pXImpressDocument, 0, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("Bbb bbb bbb bbb"), getShapeText(pXImpressDocument, 1, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 2, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 3, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 4, 0));
+}
+
+void LOKitSearchTest::testReplaceAll()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("ReplaceTest.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 0, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("Bbb bbb bbb bbb"), getShapeText(pXImpressDocument, 1, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 2, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 3, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 4, 0));
+
+ lcl_replace("bbb", "ccc", true);
+
+ CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 0, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("ccc ccc ccc ccc"), getShapeText(pXImpressDocument, 1, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 2, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 3, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 4, 0));
+
+ lcl_replace("ccc", "bbb", true);
+
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 0, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb bbb bbb bbb"), getShapeText(pXImpressDocument, 1, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 2, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 3, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 4, 0));
+}
+
+void LOKitSearchTest::testReplaceCombined()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("ReplaceTest.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ mpCallbackRecorder->registerCallbacksFor(pViewShell->GetViewShellBase());
+
+ lcl_replace("bbb", "aaa", false); // select
+ lcl_replace("bbb", "aaa", false); // replace
+
+ CPPUNIT_ASSERT_EQUAL(OUString("aaa"), getShapeText(pXImpressDocument, 0, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("Bbb bbb bbb bbb"), getShapeText(pXImpressDocument, 1, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 2, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 3, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), getShapeText(pXImpressDocument, 4, 0));
+
+ lcl_replace("bbb", "ccc", true);
+
+ CPPUNIT_ASSERT_EQUAL(OUString("aaa"), getShapeText(pXImpressDocument, 0, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("ccc ccc ccc ccc"), getShapeText(pXImpressDocument, 1, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 2, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 3, 0));
+ CPPUNIT_ASSERT_EQUAL(OUString("ccc"), getShapeText(pXImpressDocument, 4, 0));
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(LOKitSearchTest);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/tiledrendering/data/2slides.odp b/sd/qa/unit/tiledrendering/data/2slides.odp
new file mode 100644
index 000000000..baa42ba9f
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/2slides.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/MixedTest1.odg b/sd/qa/unit/tiledrendering/data/MixedTest1.odg
new file mode 100644
index 000000000..db952318c
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/MixedTest1.odg
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/MixedTest2.odg b/sd/qa/unit/tiledrendering/data/MixedTest2.odg
new file mode 100644
index 000000000..2709707c1
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/MixedTest2.odg
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/OnePDFObject.odg b/sd/qa/unit/tiledrendering/data/OnePDFObject.odg
new file mode 100644
index 000000000..225741c7b
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/OnePDFObject.odg
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/PDFSearch.pdf b/sd/qa/unit/tiledrendering/data/PDFSearch.pdf
new file mode 100644
index 000000000..ea8a0919a
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/PDFSearch.pdf
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/ReplaceTest.odp b/sd/qa/unit/tiledrendering/data/ReplaceTest.odp
new file mode 100644
index 000000000..9b0fc61aa
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/ReplaceTest.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg b/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg
new file mode 100644
index 000000000..aa1a37b83
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/cut_selection_change.odp b/sd/qa/unit/tiledrendering/data/cut_selection_change.odp
new file mode 100644
index 000000000..19d3a1848
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/cut_selection_change.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/dummy.odg b/sd/qa/unit/tiledrendering/data/dummy.odg
new file mode 100644
index 000000000..19ae49d63
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/dummy.odg
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/dummy.odp b/sd/qa/unit/tiledrendering/data/dummy.odp
new file mode 100644
index 000000000..83dee413c
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/dummy.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/duplicate-undo.odp b/sd/qa/unit/tiledrendering/data/duplicate-undo.odp
new file mode 100644
index 000000000..f66c9f608
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/duplicate-undo.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/insert-delete.odp b/sd/qa/unit/tiledrendering/data/insert-delete.odp
new file mode 100644
index 000000000..e388fb60b
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/insert-delete.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/language-all-text.odp b/sd/qa/unit/tiledrendering/data/language-all-text.odp
new file mode 100644
index 000000000..a484a6310
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/language-all-text.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/notes-view.odp b/sd/qa/unit/tiledrendering/data/notes-view.odp
new file mode 100644
index 000000000..d41bdf959
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/notes-view.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/paste-undo.fodp b/sd/qa/unit/tiledrendering/data/paste-undo.fodp
new file mode 100644
index 000000000..2615d1e11
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/paste-undo.fodp
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style: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:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.presentation">
+ <office:styles>
+ <style:presentation-page-layout style:name="AL1T0">
+ <presentation:placeholder presentation:object="title" svg:x="2.058cm" svg:y="1.743cm" svg:width="23.912cm" svg:height="3.507cm"/>
+ <presentation:placeholder presentation:object="subtitle" svg:x="2.058cm" svg:y="5.838cm" svg:width="23.912cm" svg:height="13.23cm"/>
+ </style:presentation-page-layout>
+ </office:styles>
+ <office:automatic-styles>
+ <style:page-layout style:name="PM0">
+ <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="21cm" fo:page-height="29.7cm" style:print-orientation="portrait"/>
+ </style:page-layout>
+ <style:page-layout style:name="PM1">
+ <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="28cm" fo:page-height="15.75cm" style:print-orientation="landscape"/>
+ </style:page-layout>
+ <style:style style:name="dp3" style:family="drawing-page">
+ </style:style>
+ <style:style style:name="gr3" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" svg:stroke-color="#000000" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="true" draw:auto-grow-width="false" fo:max-height="0cm" fo:min-height="0.712cm"/>
+ <style:paragraph-properties style:writing-mode="lr-tb"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:presentation>
+ <draw:page draw:name="page1" draw:style-name="dp3" draw:master-page-name="Default" presentation:presentation-page-layout-name="AL1T0">
+ <draw:frame draw:style-name="gr3" draw:text-style-name="P7" draw:layer="layout" svg:width="7.5cm" svg:height="0.962cm" svg:x="3.5cm" svg:y="3.5cm">
+ <draw:text-box>
+ <text:p>world</text:p>
+ </draw:text-box>
+ </draw:frame>
+ </draw:page>
+ </office:presentation>
+ </office:body>
+</office:document>
diff --git a/sd/qa/unit/tiledrendering/data/paste_text_onslide.odp b/sd/qa/unit/tiledrendering/data/paste_text_onslide.odp
new file mode 100644
index 000000000..c33b7c110
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/paste_text_onslide.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/regenerate-diagram.pptx b/sd/qa/unit/tiledrendering/data/regenerate-diagram.pptx
new file mode 100644
index 000000000..97635a518
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/regenerate-diagram.pptx
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/search-all.odp b/sd/qa/unit/tiledrendering/data/search-all.odp
new file mode 100644
index 000000000..46ddaf412
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/search-all.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/shape.odp b/sd/qa/unit/tiledrendering/data/shape.odp
new file mode 100644
index 000000000..b1ffa54e3
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/shape.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/table-column.odp b/sd/qa/unit/tiledrendering/data/table-column.odp
new file mode 100644
index 000000000..d2c274e88
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/table-column.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/table.odp b/sd/qa/unit/tiledrendering/data/table.odp
new file mode 100644
index 000000000..6d92898a0
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/table.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/tdf102223.odp b/sd/qa/unit/tiledrendering/data/tdf102223.odp
new file mode 100644
index 000000000..6b8570f07
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/tdf102223.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/tdf103083.fodp b/sd/qa/unit/tiledrendering/data/tdf103083.fodp
new file mode 100644
index 000000000..8de5e37b8
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/tdf103083.fodp
@@ -0,0 +1,932 @@
+<?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:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation: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:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" 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.presentation">
+ <office:meta>
+ <meta:creation-date>2016-10-03T11:33:02.159552013</meta:creation-date>
+ <meta:editing-duration>PT21M51S</meta:editing-duration>
+ <meta:editing-cycles>2</meta:editing-cycles>
+ <meta:generator>LibreOfficeDev/5.3.0.0.alpha0$Linux_X86_64 LibreOffice_project/36b8fd83a57132f486d918e5ab39a6e8898bb630</meta:generator>
+ <dc:date>2016-10-03T11:33:43.592997719</dc:date><meta:document-statistic meta:object-count="27"/></office:meta>
+ <office:settings>
+ <config:config-item-set config:name="ooo:view-settings">
+ <config:config-item config:name="VisibleAreaTop" config:type="int">-275</config:config-item>
+ <config:config-item config:name="VisibleAreaLeft" config:type="int">-1323</config:config-item>
+ <config:config-item config:name="VisibleAreaWidth" config:type="int">28053</config:config-item>
+ <config:config-item config:name="VisibleAreaHeight" config:type="int">19616</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">view1</config:config-item>
+ <config:config-item config:name="GridIsVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="GridIsFront" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsSnapToGrid" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToPageMargins" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToSnapLines" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToObjectFrame" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToObjectPoints" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPlusHandlesAlwaysVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsFrameDragSingles" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EliminatePolyPointLimitAngle" config:type="int">1500</config:config-item>
+ <config:config-item config:name="IsEliminatePolyPoints" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="VisibleLayers" config:type="base64Binary">//////////////////////////////////////////8=</config:config-item>
+ <config:config-item config:name="PrintableLayers" config:type="base64Binary">//////////////////////////////////////////8=</config:config-item>
+ <config:config-item config:name="LockedLayers" config:type="base64Binary"/>
+ <config:config-item config:name="NoAttribs" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="NoColors" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="SnapLinesDrawing" config:type="string">V2278V23104H18449H578V627V24757H4049H2466H17561</config:config-item>
+ <config:config-item config:name="RulerIsVisible" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="PageKind" config:type="short">0</config:config-item>
+ <config:config-item config:name="SelectedPage" config:type="short">0</config:config-item>
+ <config:config-item config:name="IsLayerMode" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsDoubleClickTextEdit" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsClickChangeRotation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SlidesPerRow" config:type="short">4</config:config-item>
+ <config:config-item config:name="EditMode" config:type="int">0</config:config-item>
+ <config:config-item config:name="VisibleAreaTop" config:type="int">-275</config:config-item>
+ <config:config-item config:name="VisibleAreaLeft" config:type="int">-1323</config:config-item>
+ <config:config-item config:name="VisibleAreaWidth" config:type="int">28057</config:config-item>
+ <config:config-item config:name="VisibleAreaHeight" config:type="int">19620</config:config-item>
+ <config:config-item config:name="GridCoarseWidth" config:type="int">2540</config:config-item>
+ <config:config-item config:name="GridCoarseHeight" config:type="int">2540</config:config-item>
+ <config:config-item config:name="GridFineWidth" config:type="int">254</config:config-item>
+ <config:config-item config:name="GridFineHeight" config:type="int">254</config:config-item>
+ <config:config-item config:name="GridSnapWidthXNumerator" config:type="int">254</config:config-item>
+ <config:config-item config:name="GridSnapWidthXDenominator" config:type="int">1</config:config-item>
+ <config:config-item config:name="GridSnapWidthYNumerator" config:type="int">254</config:config-item>
+ <config:config-item config:name="GridSnapWidthYDenominator" config:type="int">1</config:config-item>
+ <config:config-item config:name="IsAngleSnapEnabled" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SnapAngle" config:type="int">1500</config:config-item>
+ <config:config-item config:name="ZoomOnPage" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">true</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="ApplyUserData" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="BitmapTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.sob</config:config-item>
+ <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item>
+ <config:config-item config:name="ColorTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.soc</config:config-item>
+ <config:config-item config:name="DashTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.sod</config:config-item>
+ <config:config-item config:name="DefaultTabStop" config:type="int">1270</config:config-item>
+ <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item>
+ <config:config-item-map-indexed config:name="ForbiddenCharacters">
+ <config:config-item-map-entry>
+ <config:config-item config:name="Language" config:type="string">de</config:config-item>
+ <config:config-item config:name="Country" config:type="string">DE</config:config-item>
+ <config:config-item config:name="Variant" config:type="string"/>
+ <config:config-item config:name="BeginLine" config:type="string"/>
+ <config:config-item config:name="EndLine" config:type="string"/>
+ </config:config-item-map-entry>
+ <config:config-item-map-entry>
+ <config:config-item config:name="Language" config:type="string">en</config:config-item>
+ <config:config-item config:name="Country" config:type="string">US</config:config-item>
+ <config:config-item config:name="Variant" config:type="string"/>
+ <config:config-item config:name="BeginLine" config:type="string"/>
+ <config:config-item config:name="EndLine" config:type="string"/>
+ </config:config-item-map-entry>
+ <config:config-item-map-entry>
+ <config:config-item config:name="Language" config:type="string">en</config:config-item>
+ <config:config-item config:name="Country" config:type="string">GB</config:config-item>
+ <config:config-item config:name="Variant" config:type="string"/>
+ <config:config-item config:name="BeginLine" config:type="string"/>
+ <config:config-item config:name="EndLine" config:type="string"/>
+ </config:config-item-map-entry>
+ <config:config-item-map-entry>
+ <config:config-item config:name="Language" config:type="string">en</config:config-item>
+ <config:config-item config:name="Country" config:type="string">ZA</config:config-item>
+ <config:config-item config:name="Variant" config:type="string"/>
+ <config:config-item config:name="BeginLine" config:type="string"/>
+ <config:config-item config:name="EndLine" config:type="string"/>
+ </config:config-item-map-entry>
+ </config:config-item-map-indexed>
+ <config:config-item config:name="GradientTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.sog</config:config-item>
+ <config:config-item config:name="HandoutsHorizontal" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="HatchTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.soh</config:config-item>
+ <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintBooklet" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintBookletBack" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintBookletFront" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintDate" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintDrawing" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintFitPage" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintHandout" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintHiddenPages" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintNotes" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintOutline" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintPageName" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintTilePage" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintTime" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="LineEndTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.soe</config:config-item>
+ <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PageNumberFormat" config:type="int">4</config:config-item>
+ <config:config-item config:name="ParagraphSummation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrintQuality" config:type="int">0</config:config-item>
+ <config:config-item config:name="PrinterIndependentLayout" config:type="string">low-resolution</config:config-item>
+ <config:config-item config:name="PrinterName" config:type="string"/>
+ <config:config-item config:name="PrinterSetup" config:type="base64Binary"/>
+ <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SlidesPerHandout" config:type="short">6</config:config-item>
+ <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</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="Arial2" svg:font-family="Arial" style:font-family-generic="swiss"/>
+ <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <style:font-face style:name="Thorndale AMT" svg:font-family="&apos;Thorndale AMT&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable"/>
+ <style:font-face style:name="Arial1" svg:font-family="Arial" style:font-adornments="Regular" style:font-family-generic="swiss" style:font-pitch="variable"/>
+ <style:font-face style:name="Calibri" svg:font-family="Calibri" style:font-family-generic="swiss" style:font-pitch="variable"/>
+ <style:font-face style:name="Albany AMT" svg:font-family="&apos;Albany AMT&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="FreeSans" svg:font-family="FreeSans" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Mangal" svg:font-family="Mangal" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Microsoft YaHei" svg:font-family="&apos;Microsoft YaHei&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Noto Sans CJK SC Regular" svg:font-family="&apos;Noto Sans CJK SC Regular&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+ <draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="M10 0l-10 30h20z"/>
+ <draw:stroke-dash draw:name="Dashed_20__28_var_29__20_2" draw:display-name="Dashed (var) 2" draw:style="rect" draw:dots1="1" draw:dots1-length="0.02cm" draw:dots2="1" draw:dots2-length="0.02cm" draw:distance="0.02cm"/>
+ <style:default-style style:family="graphic">
+ <style:graphic-properties svg:stroke-color="#000000" draw:fill-color="#99ccff" fo:wrap-option="no-wrap"/>
+ <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" style:line-break="strict" style:writing-mode="lr-tb" style:font-independent-line-spacing="false">
+ <style:tab-stops/>
+ </style:paragraph-properties>
+ <style:text-properties style:use-window-font-color="true" style:font-name="Thorndale AMT" fo:font-size="24pt" fo:language="en" fo:country="US" style:font-name-asian="Albany AMT" style:font-size-asian="24pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Albany AMT" style:font-size-complex="24pt" style:language-complex="hi" style:country-complex="IN"/>
+ </style:default-style>
+ <style:style style:name="standard" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" draw:stroke-dash="Dashed_20__28_var_29__20_2" svg:stroke-width="0.076cm" svg:stroke-color="#454c51" draw:marker-start-width="0.406cm" draw:marker-start-center="false" draw:marker-end-width="0.406cm" draw:marker-end-center="false" draw:fill="solid" draw:fill-color="#e4e5e6" draw:fill-image-width="0cm" draw:fill-image-height="0cm" draw:auto-grow-width="true" fo:padding-top="0.125cm" fo:padding-bottom="0.125cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" draw:shadow="hidden" draw:shadow-offset-x="0.305cm" draw:shadow-offset-y="0.305cm" draw:shadow-color="#808080">
+ <text:list-style style:name="standard">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-indent="0cm"/>
+ <style:text-properties style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Arial1" fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="18pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="Microsoft YaHei" style:font-family-asian="&apos;Microsoft YaHei&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="18pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Mangal" style:font-family-complex="Mangal" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="18pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none"/>
+ </style:style>
+ <style:style style:name="objectwitharrow" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0.15cm" svg:stroke-color="#000000" draw:marker-start="Arrow" draw:marker-start-width="0.7cm" draw:marker-start-center="true" draw:marker-end-width="0.3cm"/>
+ </style:style>
+ <style:style style:name="objectwithshadow" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:shadow="visible" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:shadow-color="#808080"/>
+ </style:style>
+ <style:style style:name="objectwithoutfill" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Object_20_with_20_no_20_fill_20_and_20_no_20_line" style:display-name="Object with no fill and no line" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="text" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="textbody" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties fo:font-size="16pt"/>
+ </style:style>
+ <style:style style:name="textbodyjustfied" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:text-align="justify"/>
+ </style:style>
+ <style:style style:name="textbodyindent" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0.6cm"/>
+ </style:style>
+ <style:style style:name="title" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties fo:font-size="40pt"/>
+ </style:style>
+ <style:style style:name="title1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="solid" draw:fill-color="#008080" draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="title2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties svg:stroke-width="0.05cm" draw:fill-color="#ffcc99" draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0.2cm" fo:margin-top="0.1cm" fo:margin-bottom="0.1cm" fo:text-align="center" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-size="32pt"/>
+ </style:style>
+ <style:style style:name="headline" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="headline1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="18pt" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="headline2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="14pt" fo:font-style="normal" fo:font-weight="normal"/>
+ </style:style>
+ <style:style style:name="measure" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" draw:marker-start="Arrow" draw:marker-start-width="0.2cm" draw:marker-end="Arrow" draw:marker-end-width="0.2cm" draw:fill="none" draw:show-unit="true"/>
+ <style:text-properties fo:font-size="12pt"/>
+ </style:style>
+ <style:style style:name="Normal" style:family="graphic">
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0.623cm" fo:line-height="115%" fo:text-align="start" fo:text-indent="0cm" style:text-autospace="ideograph-alpha"/>
+ <style:text-properties style:font-name="Arial1" fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="11pt" fo:language="en" fo:country="US" style:font-name-asian="Calibri" style:font-family-asian="Calibri" style:font-family-generic-asian="swiss" style:font-pitch-asian="variable" style:font-size-asian="11pt" style:language-asian="en" style:country-asian="US" style:font-name-complex="Calibri" style:font-family-complex="Calibri" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable" style:font-size-complex="11pt" style:language-complex="ar" style:country-complex="SA"/>
+ </style:style>
+ <style:style style:name="Default_20_Paragraph_20_Font" style:display-name="Default Paragraph Font" style:family="graphic">
+ <style:paragraph-properties style:text-autospace="none"/>
+ <style:text-properties style:font-name="Arial1" fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" style:font-pitch="variable"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-background" style:display-name="No-Logo Content-background" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-image-width="0cm" draw:fill-image-height="0cm"/>
+ <style:text-properties style:letter-kerning="true"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-backgroundobjects" style:display-name="No-Logo Content-backgroundobjects" style:family="presentation">
+ <style:graphic-properties draw:shadow="hidden" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:shadow-color="#808080"/>
+ <style:text-properties style:font-name="Arial1" fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" style:font-pitch="variable" style:letter-kerning="true"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-notes" style:display-name="No-Logo Content-notes" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-left="0.6cm" fo:margin-right="0cm" fo:text-indent="0cm"/>
+ <style:text-properties style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Arial2" fo:font-family="Arial" style:font-family-generic="swiss" fo:font-size="14pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="Microsoft YaHei" style:font-family-asian="&apos;Microsoft YaHei&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Mangal" style:font-family-complex="Mangal" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-outline1" style:display-name="No-Logo Content-outline1" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-horizontal-align="left" draw:auto-grow-height="false" draw:fit-to-size="false">
+ <text:list-style style:name="No-Logo_20_Content-outline1" style:display-name="No-Logo Content-outline1">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="•">
+ <style:list-level-properties text:space-before="0.008cm" text:min-label-width="0.47cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="0.766cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="1.515cm" text:min-label-width="0.452cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="2.028cm" text:min-label-width="0.47cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="2.786cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="3.561cm" text:min-label-width="0.505cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="4.061cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="9.119cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="10.312cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="11.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0.405cm" fo:text-indent="0cm"/>
+ <style:text-properties fo:color="#000000" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Arial1" fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="24pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="Microsoft YaHei" style:font-family-asian="&apos;Microsoft YaHei&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="32pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Mangal" style:font-family-complex="Mangal" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="32pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-outline2" style:display-name="No-Logo Content-outline2" style:family="presentation" style:parent-style-name="No-Logo_20_Content-outline1">
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0.406cm" fo:text-indent="0cm"/>
+ <style:text-properties fo:color="#000000" fo:font-size="20pt" style:font-size-asian="28pt" style:font-size-complex="28pt"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-outline3" style:display-name="No-Logo Content-outline3" style:family="presentation" style:parent-style-name="No-Logo_20_Content-outline2">
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0.406cm" fo:text-indent="0cm"/>
+ <style:text-properties fo:color="#000000" fo:font-size="16pt" style:font-size-asian="24pt" style:font-size-complex="24pt"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-outline4" style:display-name="No-Logo Content-outline4" style:family="presentation" style:parent-style-name="No-Logo_20_Content-outline3">
+ <style:paragraph-properties fo:margin-left="0.266cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0.406cm" fo:text-indent="0cm"/>
+ <style:text-properties fo:color="#000000" fo:font-size="14pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-outline5" style:display-name="No-Logo Content-outline5" style:family="presentation" style:parent-style-name="No-Logo_20_Content-outline4">
+ <style:paragraph-properties fo:margin-left="0.265cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0.406cm" fo:text-indent="0cm"/>
+ <style:text-properties fo:color="#000000" fo:font-size="12pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-outline6" style:display-name="No-Logo Content-outline6" style:family="presentation" style:parent-style-name="No-Logo_20_Content-outline5">
+ <style:paragraph-properties fo:margin-left="0.239cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0.406cm" fo:text-indent="0cm"/>
+ <style:text-properties fo:color="#000000" fo:font-size="12pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-outline7" style:display-name="No-Logo Content-outline7" style:family="presentation" style:parent-style-name="No-Logo_20_Content-outline6">
+ <style:paragraph-properties fo:margin-left="0.505cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0.406cm" fo:text-indent="0cm"/>
+ <style:text-properties fo:color="#000000" fo:font-size="12pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-outline8" style:display-name="No-Logo Content-outline8" style:family="presentation" style:parent-style-name="No-Logo_20_Content-outline7">
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0.406cm" fo:text-indent="0cm"/>
+ <style:text-properties fo:color="#000000" fo:font-size="12pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-outline9" style:display-name="No-Logo Content-outline9" style:family="presentation" style:parent-style-name="No-Logo_20_Content-outline8">
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0.406cm" fo:text-indent="0cm"/>
+ <style:text-properties fo:color="#000000" fo:font-size="12pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-subtitle" style:display-name="No-Logo Content-subtitle" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-vertical-align="middle">
+ <text:list-style style:name="No-Logo_20_Content-subtitle" style:display-name="No-Logo Content-subtitle">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-align="center" fo:text-indent="0cm"/>
+ <style:text-properties style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Arial1" fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="20pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="Microsoft YaHei" style:font-family-asian="&apos;Microsoft YaHei&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="32pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Mangal" style:font-family-complex="Mangal" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="32pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none"/>
+ </style:style>
+ <style:style style:name="No-Logo_20_Content-title" style:display-name="No-Logo Content-title" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-vertical-align="middle">
+ <text:list-style style:name="No-Logo_20_Content-title" style:display-name="No-Logo Content-title">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:text-align="start"/>
+ <style:text-properties fo:color="#000000" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Arial1" fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="32pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="bold" style:letter-kerning="true" style:font-name-asian="Microsoft YaHei" style:font-family-asian="&apos;Microsoft YaHei&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="44pt" style:font-style-asian="normal" style:font-weight-asian="bold" style:font-name-complex="Mangal" style:font-family-complex="Mangal" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="44pt" style:font-style-complex="normal" style:font-weight-complex="bold" style:text-emphasize="none" style:font-relief="none"/>
+ </style:style>
+ <style:presentation-page-layout style:name="AL0T26">
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="1.743cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="1.743cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="3.612cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="3.612cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="5.481cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="5.481cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ </style:presentation-page-layout>
+ <style:presentation-page-layout style:name="AL1T1">
+ <presentation:placeholder presentation:object="title" svg:x="2.058cm" svg:y="1.743cm" svg:width="23.912cm" svg:height="3.507cm"/>
+ <presentation:placeholder presentation:object="outline" svg:x="2.058cm" svg:y="5.838cm" svg:width="23.912cm" svg:height="13.23cm"/>
+ </style:presentation-page-layout>
+ </office:styles>
+ <office:automatic-styles>
+ <style:page-layout style:name="PM0">
+ <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="21.59cm" fo:page-height="27.94cm" style:print-orientation="portrait"/>
+ </style:page-layout>
+ <style:page-layout style:name="PM1">
+ <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="25.4cm" fo:page-height="19.05cm" style:print-orientation="landscape"/>
+ </style:page-layout>
+ <style:style style:name="dp1" style:family="drawing-page">
+ <style:drawing-page-properties draw:background-size="border" draw:fill="none" draw:fill-image-width="0cm" draw:fill-image-height="0cm"/>
+ </style:style>
+ <style:style style:name="dp2" style:family="drawing-page">
+ <style:drawing-page-properties presentation:display-header="true" presentation:display-footer="true" presentation:display-page-number="false" presentation:display-date-time="true"/>
+ </style:style>
+ <style:style style:name="dp3" style:family="drawing-page">
+ <style:drawing-page-properties presentation:background-visible="true" presentation:background-objects-visible="true" presentation:display-footer="true" presentation:display-page-number="false" presentation:display-date-time="true"/>
+ </style:style>
+ <style:style style:name="gr1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.397cm" fo:min-width="4.236cm"/>
+ </style:style>
+ <style:style style:name="gr2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.397cm" fo:min-width="5.234cm"/>
+ </style:style>
+ <style:style style:name="gr3" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" fo:min-height="1.397cm" fo:min-width="3.694cm"/>
+ </style:style>
+ <style:style style:name="gr4" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" fo:min-height="1.397cm" fo:min-width="4.506cm"/>
+ </style:style>
+ <style:style style:name="gr5" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-horizontal-align="center" draw:textarea-vertical-align="middle" draw:color-mode="standard" draw:luminance="0%" draw:contrast="0%" draw:gamma="100%" draw:red="0%" draw:green="0%" draw:blue="0%" fo:clip="rect(0cm, 0cm, 0cm, 0cm)" draw:image-opacity="100%" style:mirror="none"/>
+ </style:style>
+ <style:style style:name="gr6" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" svg:stroke-width="0.076cm" draw:stroke-linejoin="round" draw:fill="none" draw:textarea-vertical-align="top" draw:auto-grow-height="false" fo:padding-top="0.13cm" fo:padding-bottom="0.13cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" fo:wrap-option="wrap"/>
+ </style:style>
+ <style:style style:name="gr7" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="middle" draw:auto-grow-width="true" fo:min-height="0.952cm" fo:min-width="1.78cm"/>
+ </style:style>
+ <style:style style:name="gr8" style:family="graphic">
+ <style:graphic-properties style:protect="size"/>
+ </style:style>
+ <style:style style:name="pr1" style:family="presentation" style:parent-style-name="No-Logo_20_Content-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.397cm" fo:min-width="8.869cm"/>
+ </style:style>
+ <style:style style:name="pr2" style:family="presentation" style:parent-style-name="No-Logo_20_Content-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" fo:min-height="1.397cm" fo:min-width="8.869cm"/>
+ </style:style>
+ <style:style style:name="pr3" style:family="presentation" style:parent-style-name="No-Logo_20_Content-title">
+ <style:graphic-properties draw:auto-grow-height="true" fo:min-height="2.743cm" fo:min-width="21.058cm"/>
+ </style:style>
+ <style:style style:name="pr4" style:family="presentation" style:parent-style-name="No-Logo_20_Content-outline1">
+ <style:graphic-properties draw:fit-to-size="false" fo:min-height="10.799cm" fo:min-width="10.066cm"/>
+ </style:style>
+ <style:style style:name="pr5" style:family="presentation" style:parent-style-name="No-Logo_20_Content-notes">
+ <style:graphic-properties draw:fill-color="#ffffff" draw:auto-grow-height="true" fo:min-height="12.572cm" fo:min-width="16.771cm"/>
+ </style:style>
+ <style:style style:name="P1" style:family="paragraph">
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P2" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P3" style:family="paragraph">
+ <style:paragraph-properties fo:text-align="end"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P4" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:paragraph-properties fo:text-align="end"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P5" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none"/>
+ <style:paragraph-properties fo:text-align="center"/>
+ </style:style>
+ <style:style style:name="P6" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none"/>
+ <style:paragraph-properties fo:text-align="start"/>
+ <style:text-properties fo:font-size="18pt"/>
+ </style:style>
+ <style:style style:name="P7" style:family="paragraph">
+ <style:paragraph-properties fo:text-align="center"/>
+ </style:style>
+ <style:style style:name="P8" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ </style:style>
+ <style:style style:name="P9" style:family="paragraph">
+ <loext:graphic-properties draw:fill-color="#ffffff"/>
+ </style:style>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="T2" style:family="text">
+ <style:text-properties fo:color="#ffffff" style:font-name="Arial" fo:font-size="11pt" style:font-size-asian="11pt" style:font-size-complex="11pt"/>
+ </style:style>
+ <style:style style:name="T3" style:family="text">
+ <style:text-properties style:text-position="super 58%"/>
+ </style:style>
+ <text:list-style style:name="L1">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ <text:list-style style:name="L2">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ <text:list-style style:name="L3">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="•">
+ <style:list-level-properties text:space-before="0.008cm" text:min-label-width="0.47cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="0.766cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="1.515cm" text:min-label-width="0.452cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="2.028cm" text:min-label-width="0.47cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="2.786cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="3.561cm" text:min-label-width="0.505cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="4.061cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="9.119cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="10.312cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="‒">
+ <style:list-level-properties text:space-before="11.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="Arial" style:font-style-name="Regular" style:font-family-generic="swiss" fo:color="#000000" fo:font-size="65%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ <text:list-style style:name="L4">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="-0.005cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.766cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.51cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.285cm" text:min-label-width="0.505cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.056cm" text:min-label-width="0.505cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.806cm" text:min-label-width="0.473cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.576cm" text:min-label-width="0.473cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="9.127cm" text:min-label-width="0.473cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="10.312cm" text:min-label-width="0.473cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="11.405cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ <text:list-style style:name="L5">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.008cm" text:min-label-width="0.47cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.766cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.515cm" text:min-label-width="0.452cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.028cm" text:min-label-width="0.47cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.786cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.561cm" text:min-label-width="0.505cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.061cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="9.119cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="10.312cm" text:min-label-width="0.483cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="11.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:font-charset="x-symbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </office:automatic-styles>
+ <office:master-styles>
+ <draw:layer-set>
+ <draw:layer draw:name="layout"/>
+ <draw:layer draw:name="background"/>
+ <draw:layer draw:name="backgroundobjects"/>
+ <draw:layer draw:name="controls"/>
+ <draw:layer draw:name="measurelines"/>
+ </draw:layer-set>
+ <style:handout-master presentation:presentation-page-layout-name="AL0T26" style:page-layout-name="PM0" draw:style-name="dp2">
+ <draw:frame draw:style-name="gr1" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="7.133cm" svg:height="1.396cm" svg:x="1.119cm" svg:y="0cm" presentation:class="header">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:header/></text:span><text:span text:style-name="T1"> </text:span><text:span text:style-name="T1"><presentation:header/></text:span><text:span text:style-name="T1"> </text:span><presentation:header/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr2" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="8.63cm" svg:height="1.396cm" svg:x="12.589cm" svg:y="0cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><presentation:date-time/></text:span><text:span text:style-name="T1"> </text:span><text:span text:style-name="T1"><presentation:date-time/></text:span><text:span text:style-name="T1"> </text:span><presentation:date-time/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr3" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="6.32cm" svg:height="1.396cm" svg:x="1.525cm" svg:y="26.543cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:footer/></text:span><text:span text:style-name="T1"> </text:span><text:span text:style-name="T1"><presentation:footer/></text:span><text:span text:style-name="T1"> </text:span><presentation:footer/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr4" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="7.538cm" svg:height="1.396cm" svg:x="13.135cm" svg:y="26.543cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span><text:span text:style-name="T1"> </text:span><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span><text:span text:style-name="T1"> </text:span><text:page-number>&lt;number&gt;</text:page-number></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="9.294cm" svg:height="6.97cm" svg:x="1cm" svg:y="2.435cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="9.294cm" svg:height="6.97cm" svg:x="1cm" svg:y="10.483cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="9.294cm" svg:height="6.97cm" svg:x="1cm" svg:y="18.531cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="9.294cm" svg:height="6.97cm" svg:x="11.295cm" svg:y="2.435cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="9.294cm" svg:height="6.97cm" svg:x="11.295cm" svg:y="10.483cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="9.294cm" svg:height="6.97cm" svg:x="11.295cm" svg:y="18.531cm"/>
+ </style:handout-master>
+ <style:master-page style:name="No-Logo_20_Content" style:display-name="No-Logo Content" style:page-layout-name="PM1" draw:style-name="dp1">
+ <draw:frame draw:style-name="gr5" draw:text-style-name="P5" draw:layer="backgroundobjects" svg:width="24.125cm" svg:height="0.792cm" svg:x="0.626cm" svg:y="18.269cm">
+ </draw:frame>
+ <draw:frame presentation:style-name="No-Logo_20_Content-title" draw:layer="backgroundobjects" svg:width="20.93cm" svg:height="2.743cm" svg:x="2.286cm" svg:y="0.711cm" presentation:class="title" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="No-Logo_20_Content-outline1" draw:layer="backgroundobjects" svg:width="22.859cm" svg:height="11.048cm" svg:x="1.27cm" svg:y="4.457cm" presentation:class="outline" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="No-Logo_20_Content-outline1" draw:layer="backgroundobjects" svg:width="20.93cm" svg:height="11.049cm" svg:x="2.286cm" svg:y="4.039cm" presentation:class="outline" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:custom-shape draw:name="Text Box 4" draw:style-name="gr6" draw:text-style-name="P6" draw:layer="backgroundobjects" svg:width="16.024cm" svg:height="0.656cm" svg:x="2.403cm" svg:y="18.318cm">
+ <text:p/>
+ <draw:enhanced-geometry svg:viewBox="0 0 21600 21600" draw:type="rectangle" draw:enhanced-path="M 0 0 L 21600 0 21600 21600 0 21600 0 0 Z N"/>
+ </draw:custom-shape>
+ <draw:frame draw:style-name="gr7" draw:text-style-name="P8" draw:layer="backgroundobjects" svg:width="2.39cm" svg:height="1.202cm" svg:x="0.305cm" svg:y="18.102cm">
+ <draw:text-box>
+ <text:p text:style-name="P7"><text:span text:style-name="T2"><text:page-number>&lt;number&gt;</text:page-number></text:span><text:span text:style-name="T2"> </text:span></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <presentation:notes style:page-layout-name="PM0">
+ <draw:page-thumbnail presentation:style-name="No-Logo_20_Content-title" draw:layer="backgroundobjects" svg:width="13.97cm" svg:height="10.465cm" svg:x="3.81cm" svg:y="2.134cm" presentation:class="page"/>
+ <draw:frame presentation:style-name="No-Logo_20_Content-notes" draw:layer="backgroundobjects" svg:width="17.271cm" svg:height="12.572cm" svg:x="2.159cm" svg:y="13.271cm" presentation:class="notes" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="No-Logo_20_Content-notes" draw:layer="backgroundobjects" svg:width="17.271cm" svg:height="12.572cm" svg:x="2.159cm" svg:y="13.271cm" presentation:class="notes" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.369cm" svg:height="1.396cm" svg:x="0cm" svg:y="0cm" presentation:class="header">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:header/></text:span><text:span text:style-name="T1"> </text:span><text:span text:style-name="T1"><presentation:header/></text:span><text:span text:style-name="T1"> </text:span><presentation:header/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.369cm" svg:height="1.396cm" svg:x="12.22cm" svg:y="0cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><presentation:date-time/></text:span><text:span text:style-name="T1"> </text:span><text:span text:style-name="T1"><presentation:date-time/></text:span><text:span text:style-name="T1"> </text:span><presentation:date-time/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr2" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.369cm" svg:height="1.396cm" svg:x="0cm" svg:y="26.543cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P1"><text:span text:style-name="T1"><presentation:footer/></text:span><text:span text:style-name="T1"> </text:span><text:span text:style-name="T1"><presentation:footer/></text:span><text:span text:style-name="T1"> </text:span><presentation:footer/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr2" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.369cm" svg:height="1.396cm" svg:x="12.22cm" svg:y="26.543cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span><text:span text:style-name="T1"> </text:span><text:span text:style-name="T1"><text:page-number>&lt;number&gt;</text:page-number></text:span><text:span text:style-name="T1"> </text:span><text:page-number>&lt;number&gt;</text:page-number></text:p>
+ </draw:text-box>
+ </draw:frame>
+ </presentation:notes>
+ </style:master-page>
+ </office:master-styles>
+ <office:body>
+ <office:presentation>
+ <draw:page draw:name="page1" draw:style-name="dp3" draw:master-page-name="No-Logo_20_Content" presentation:presentation-page-layout-name="AL1T1">
+ <office:forms form:automatic-focus="false" form:apply-design-mode="false"/>
+ <draw:frame presentation:style-name="pr3" draw:layer="layout" svg:width="20.93cm" svg:height="2.743cm" svg:x="2.286cm" svg:y="0.711cm" presentation:class="title" presentation:user-transformed="true">
+ <draw:text-box>
+ <text:p>How to reproduce</text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr4" draw:layer="layout" svg:width="20.93cm" svg:height="13.487cm" svg:x="2.286cm" svg:y="4.039cm" presentation:class="outline" presentation:user-transformed="true">
+ <draw:text-box>
+ <text:list text:style-name="L3">
+ <text:list-item>
+ <text:p>This is the 1<text:span text:style-name="T3">st</text:span> level</text:p>
+ </text:list-item>
+ </text:list>
+ <text:list text:style-name="L4">
+ <text:list-item>
+ <text:list>
+ <text:list-item>
+ <text:p>These are the 4 bullet points we are focussing on</text:p>
+ </text:list-item>
+ </text:list>
+ </text:list-item>
+ </text:list>
+ <text:list text:style-name="L5">
+ <text:list-item>
+ <text:list>
+ <text:list-item>
+ <text:p>They have all the same formatting</text:p>
+ </text:list-item>
+ </text:list>
+ </text:list-item>
+ </text:list>
+ <text:list text:style-name="L4">
+ <text:list-item>
+ <text:list>
+ <text:list-item>
+ <text:p>Simply cut (CTRL+X) and paste (CTRL+V) a line</text:p>
+ </text:list-item>
+ <text:list-item>
+ <text:p>And see what happens. But bullet point changes format</text:p>
+ </text:list-item>
+ </text:list>
+ </text:list-item>
+ </text:list>
+ </draw:text-box>
+ </draw:frame>
+ <presentation:notes draw:style-name="dp2">
+ <draw:page-thumbnail draw:style-name="gr8" draw:layer="layout" svg:width="13.97cm" svg:height="10.465cm" svg:x="3.81cm" svg:y="2.134cm" draw:page-number="1" presentation:class="page"/>
+ <draw:frame presentation:style-name="pr5" draw:text-style-name="P9" draw:layer="layout" svg:width="17.271cm" svg:height="12.572cm" svg:x="2.159cm" svg:y="13.271cm" presentation:class="notes" presentation:placeholder="true" presentation:user-transformed="true">
+ <draw:text-box/>
+ </draw:frame>
+ </presentation:notes>
+ </draw:page>
+ <presentation:settings presentation:mouse-visible="false"/>
+ </office:presentation>
+ </office:body>
+</office:document> \ No newline at end of file
diff --git a/sd/qa/unit/tiledrendering/data/tdf104405.fodp b/sd/qa/unit/tiledrendering/data/tdf104405.fodp
new file mode 100644
index 000000000..d902f177d
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/tdf104405.fodp
@@ -0,0 +1,822 @@
+<?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:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation: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:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" 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.presentation">
+ <office:meta><meta:creation-date>2016-11-16T15:27:08.222708354</meta:creation-date><dc:date>2016-11-16T15:30:23.342583235</dc:date><meta:editing-duration>PT3M18S</meta:editing-duration><meta:editing-cycles>1</meta:editing-cycles><meta:document-statistic meta:object-count="26"/><meta:generator>LibreOfficeDev/5.3.0.0.alpha1$Linux_X86_64 LibreOffice_project/f0c20dc458d8fe9e86b323c8c24df2f3d31610ad</meta:generator></office:meta>
+ <office:settings>
+ <config:config-item-set config:name="ooo:view-settings">
+ <config:config-item config:name="VisibleAreaTop" config:type="int">0</config:config-item>
+ <config:config-item config:name="VisibleAreaLeft" config:type="int">0</config:config-item>
+ <config:config-item config:name="VisibleAreaWidth" config:type="int">14099</config:config-item>
+ <config:config-item config:name="VisibleAreaHeight" config:type="int">9999</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">view1</config:config-item>
+ <config:config-item config:name="GridIsVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="GridIsFront" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsSnapToGrid" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToPageMargins" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToSnapLines" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToObjectFrame" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsSnapToObjectPoints" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPlusHandlesAlwaysVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsFrameDragSingles" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="EliminatePolyPointLimitAngle" config:type="int">1500</config:config-item>
+ <config:config-item config:name="IsEliminatePolyPoints" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="VisibleLayers" config:type="base64Binary">//////////////////////////////////////////8=</config:config-item>
+ <config:config-item config:name="PrintableLayers" config:type="base64Binary">//////////////////////////////////////////8=</config:config-item>
+ <config:config-item config:name="LockedLayers" config:type="base64Binary"/>
+ <config:config-item config:name="NoAttribs" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="NoColors" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="RulerIsVisible" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PageKind" config:type="short">0</config:config-item>
+ <config:config-item config:name="SelectedPage" config:type="short">0</config:config-item>
+ <config:config-item config:name="IsLayerMode" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsDoubleClickTextEdit" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsClickChangeRotation" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="SlidesPerRow" config:type="short">4</config:config-item>
+ <config:config-item config:name="EditMode" config:type="int">0</config:config-item>
+ <config:config-item config:name="VisibleAreaTop" config:type="int">-310</config:config-item>
+ <config:config-item config:name="VisibleAreaLeft" config:type="int">-2139</config:config-item>
+ <config:config-item config:name="VisibleAreaWidth" config:type="int">32314</config:config-item>
+ <config:config-item config:name="VisibleAreaHeight" config:type="int">21646</config:config-item>
+ <config:config-item config:name="GridCoarseWidth" config:type="int">2000</config:config-item>
+ <config:config-item config:name="GridCoarseHeight" config:type="int">2000</config:config-item>
+ <config:config-item config:name="GridFineWidth" config:type="int">200</config:config-item>
+ <config:config-item config:name="GridFineHeight" config:type="int">200</config:config-item>
+ <config:config-item config:name="GridSnapWidthXNumerator" config:type="int">200</config:config-item>
+ <config:config-item config:name="GridSnapWidthXDenominator" config:type="int">1</config:config-item>
+ <config:config-item config:name="GridSnapWidthYNumerator" config:type="int">200</config:config-item>
+ <config:config-item config:name="GridSnapWidthYDenominator" config:type="int">1</config:config-item>
+ <config:config-item config:name="IsAngleSnapEnabled" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SnapAngle" config:type="int">1500</config:config-item>
+ <config:config-item config:name="ZoomOnPage" config:type="boolean">true</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="ApplyUserData" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="BitmapTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.sob</config:config-item>
+ <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item>
+ <config:config-item config:name="ColorTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.soc</config:config-item>
+ <config:config-item config:name="DashTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.sod</config:config-item>
+ <config:config-item config:name="DefaultTabStop" config:type="int">1250</config:config-item>
+ <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item>
+ <config:config-item-map-indexed config:name="ForbiddenCharacters">
+ <config:config-item-map-entry>
+ <config:config-item config:name="Language" config:type="string">en</config:config-item>
+ <config:config-item config:name="Country" config:type="string">ZA</config:config-item>
+ <config:config-item config:name="Variant" config:type="string"/>
+ <config:config-item config:name="BeginLine" config:type="string"/>
+ <config:config-item config:name="EndLine" config:type="string"/>
+ </config:config-item-map-entry>
+ </config:config-item-map-indexed>
+ <config:config-item config:name="GradientTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.sog</config:config-item>
+ <config:config-item config:name="HandoutsHorizontal" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="HatchTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.soh</config:config-item>
+ <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintBooklet" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintBookletBack" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintBookletFront" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintDate" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintDrawing" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintFitPage" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintHandout" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintHiddenPages" config:type="boolean">true</config:config-item>
+ <config:config-item config:name="IsPrintNotes" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintOutline" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintPageName" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintTilePage" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="IsPrintTime" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="LineEndTableURL" config:type="string">$(inst)/share/palette%3B$(user)/config/standard.soe</config:config-item>
+ <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PageNumberFormat" config:type="int">4</config:config-item>
+ <config:config-item config:name="ParagraphSummation" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="PrintQuality" config:type="int">0</config:config-item>
+ <config:config-item config:name="PrinterIndependentLayout" config:type="string">low-resolution</config:config-item>
+ <config:config-item config:name="PrinterName" config:type="string"/>
+ <config:config-item config:name="PrinterSetup" config:type="base64Binary"/>
+ <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item>
+ <config:config-item config:name="SlidesPerHandout" config:type="short">6</config:config-item>
+ <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</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="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ <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="DejaVu Sans" svg:font-family="&apos;DejaVu Sans&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="FreeSans" svg:font-family="FreeSans" style:font-family-generic="system" style:font-pitch="variable"/>
+ <style:font-face style:name="Noto Sans CJK SC Regular" svg:font-family="&apos;Noto Sans CJK SC Regular&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+ <draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="M10 0l-10 30h20z"/>
+ <style:default-style style:family="graphic">
+ <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap"/>
+ <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" style:line-break="strict" style:writing-mode="lr-tb" 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="24pt" fo:language="en" fo:country="ZA" style:font-name-asian="DejaVu Sans" style:font-size-asian="24pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="DejaVu Sans" style:font-size-complex="24pt" style:language-complex="hi" style:country-complex="IN"/>
+ </style:default-style>
+ <style:style style:name="standard" style:family="graphic">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0cm" svg:stroke-color="#3465a4" draw:marker-start-width="0.2cm" draw:marker-start-center="false" draw:marker-end-width="0.2cm" draw:marker-end-center="false" draw:fill="solid" draw:fill-color="#729fcf" draw:textarea-horizontal-align="justify" fo:padding-top="0.125cm" fo:padding-bottom="0.125cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080">
+ <text:list-style style:name="standard">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-name-asian="Noto Sans CJK SC Regular" style:font-family-asian="&apos;Noto Sans CJK SC Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="18pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="18pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="objectwitharrow" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-width="0.15cm" svg:stroke-color="#000000" draw:marker-start="Arrow" draw:marker-start-width="0.7cm" draw:marker-start-center="true" draw:marker-end-width="0.3cm"/>
+ </style:style>
+ <style:style style:name="objectwithshadow" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ </style:style>
+ <style:style style:name="objectwithoutfill" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties svg:stroke-color="#000000" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="Object_20_with_20_no_20_fill_20_and_20_no_20_line" style:display-name="Object with no fill and no line" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="text" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="textbody" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties fo:font-size="16pt"/>
+ </style:style>
+ <style:style style:name="textbodyjustfied" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:text-align="justify"/>
+ </style:style>
+ <style:style style:name="textbodyindent" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-indent="0.6cm"/>
+ </style:style>
+ <style:style style:name="title" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties fo:font-size="44pt"/>
+ </style:style>
+ <style:style style:name="title1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="solid" draw:fill-color="#008080" draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="title2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties svg:stroke-width="0.05cm" draw:fill-color="#ffcc99" draw:shadow="visible" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0.2cm" fo:margin-top="0.1cm" fo:margin-bottom="0.1cm" fo:text-align="center" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-size="36pt"/>
+ </style:style>
+ <style:style style:name="headline" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="24pt"/>
+ </style:style>
+ <style:style style:name="headline1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="18pt" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="headline2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-top="0.42cm" fo:margin-bottom="0.21cm"/>
+ <style:text-properties fo:font-size="14pt" fo:font-style="italic" fo:font-weight="bold"/>
+ </style:style>
+ <style:style style:name="measure" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="solid" svg:stroke-color="#000000" draw:marker-start="Arrow" draw:marker-start-width="0.2cm" draw:marker-end="Arrow" draw:marker-end-width="0.2cm" draw:fill="none" draw:show-unit="true"/>
+ <style:text-properties fo:font-size="12pt"/>
+ </style:style>
+ <style:style style:name="default" style:family="table-cell">
+ <loext:graphic-properties draw:fill="solid" draw:fill-color="#ccccff" draw:textarea-horizontal-align="left" draw:textarea-vertical-align="top" fo:padding-top="0.13cm" fo:padding-bottom="0.13cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm"/>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-indent="0cm" fo:border="0.03pt solid #ffffff"/>
+ <style:text-properties style:use-window-font-color="true" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt" style:letter-kerning="true" style:font-name-asian="Noto Sans CJK SC Regular" style:font-family-asian="&apos;Noto Sans CJK SC Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="18pt" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="18pt"/>
+ </style:style>
+ <style:style style:name="gray1" style:family="table-cell" style:parent-style-name="default">
+ <loext:graphic-properties draw:fill="solid" draw:fill-color="#e6e6e6"/>
+ </style:style>
+ <style:style style:name="gray2" style:family="table-cell" style:parent-style-name="default">
+ <loext:graphic-properties draw:fill="solid" draw:fill-color="#cccccc"/>
+ </style:style>
+ <style:style style:name="gray3" style:family="table-cell" style:parent-style-name="default">
+ <loext:graphic-properties draw:fill="solid" draw:fill-color="#b3b3b3"/>
+ </style:style>
+ <table:table-template text:style-name="default">
+ <table:first-row table:style-name="gray3"/>
+ <table:last-row table:style-name="gray3"/>
+ <table:first-column table:style-name="gray3"/>
+ <table:last-column table:style-name="gray3"/>
+ <table:body table:style-name="gray1"/>
+ <table:odd-rows table:style-name="gray2"/>
+ <table:odd-columns table:style-name="gray2"/>
+ </table:table-template>
+ <style:style style:name="Default-background" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:text-properties style:letter-kerning="true"/>
+ </style:style>
+ <style:style style:name="Default-backgroundobjects" style:family="presentation">
+ <style:graphic-properties draw:textarea-horizontal-align="justify" draw:shadow="hidden" draw:shadow-offset-x="0.2cm" draw:shadow-offset-y="0.2cm" draw:shadow-color="#808080"/>
+ <style:text-properties style:letter-kerning="true"/>
+ </style:style>
+ <style:style style:name="Default-notes" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none"/>
+ <style:paragraph-properties fo:margin-left="0.6cm" fo:margin-right="0cm" fo:text-indent="-0.6cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="20pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Noto Sans CJK SC Regular" style:font-family-asian="&apos;Noto Sans CJK SC Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="20pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="20pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="Default-outline1" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:auto-grow-height="false" draw:fit-to-size="shrink-to-fit">
+ <text:list-style style:name="Default-outline1">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.3cm" text:min-label-width="0.9cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="–">
+ <style:list-level-properties text:space-before="1.5cm" text:min-label-width="0.9cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="75%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.8cm" text:min-label-width="0.8cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="–">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="75%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="6.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="7.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="9cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="10.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="11.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-top="0.5cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="32pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Noto Sans CJK SC Regular" style:font-family-asian="&apos;Noto Sans CJK SC Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="32pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="32pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="Default-outline2" style:family="presentation" style:parent-style-name="Default-outline1">
+ <style:paragraph-properties fo:margin-top="0.4cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="28pt" style:font-size-asian="28pt" style:font-size-complex="28pt"/>
+ </style:style>
+ <style:style style:name="Default-outline3" style:family="presentation" style:parent-style-name="Default-outline2">
+ <style:paragraph-properties fo:margin-top="0.3cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="24pt" style:font-size-asian="24pt" style:font-size-complex="24pt"/>
+ </style:style>
+ <style:style style:name="Default-outline4" style:family="presentation" style:parent-style-name="Default-outline3">
+ <style:paragraph-properties fo:margin-top="0.2cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline5" style:family="presentation" style:parent-style-name="Default-outline4">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline6" style:family="presentation" style:parent-style-name="Default-outline5">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline7" style:family="presentation" style:parent-style-name="Default-outline6">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline8" style:family="presentation" style:parent-style-name="Default-outline7">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-outline9" style:family="presentation" style:parent-style-name="Default-outline8">
+ <style:paragraph-properties fo:margin-top="0.1cm" fo:margin-bottom="0cm"/>
+ <style:text-properties fo:font-size="20pt" style:font-size-asian="20pt" style:font-size-complex="20pt"/>
+ </style:style>
+ <style:style style:name="Default-subtitle" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-vertical-align="middle">
+ <text:list-style style:name="Default-subtitle">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:text-align="center" fo:text-indent="0cm"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="32pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Noto Sans CJK SC Regular" style:font-family-asian="&apos;Noto Sans CJK SC Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="32pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="32pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:style style:name="Default-title" style:family="presentation">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-vertical-align="middle">
+ <text:list-style style:name="Default-title">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </style:graphic-properties>
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-variant="normal" fo:text-transform="none" style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-line-through-type="none" style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="44pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" fo:background-color="transparent" style:font-name-asian="Noto Sans CJK SC Regular" style:font-family-asian="&apos;Noto Sans CJK SC Regular&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="44pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="44pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none" style:text-overline-style="none" style:text-overline-color="font-color"/>
+ </style:style>
+ <style:presentation-page-layout style:name="AL0T26">
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="1.743cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="1.743cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="3.612cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="3.612cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="2.058cm" svg:y="5.481cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ <presentation:placeholder presentation:object="handout" svg:x="15.414cm" svg:y="5.481cm" svg:width="10.556cm" svg:height="-0.233cm"/>
+ </style:presentation-page-layout>
+ <style:presentation-page-layout style:name="AL1T0">
+ <presentation:placeholder presentation:object="title" svg:x="2.058cm" svg:y="1.743cm" svg:width="23.912cm" svg:height="3.507cm"/>
+ <presentation:placeholder presentation:object="subtitle" svg:x="2.058cm" svg:y="5.838cm" svg:width="23.912cm" svg:height="13.23cm"/>
+ </style:presentation-page-layout>
+ </office:styles>
+ <office:automatic-styles>
+ <style:page-layout style:name="PM0">
+ <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="21cm" fo:page-height="29.7cm" style:print-orientation="portrait"/>
+ </style:page-layout>
+ <style:page-layout style:name="PM1">
+ <style:page-layout-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:margin-left="0cm" fo:margin-right="0cm" fo:page-width="28cm" fo:page-height="21cm" style:print-orientation="landscape"/>
+ </style:page-layout>
+ <style:style style:name="dp1" style:family="drawing-page">
+ <style:drawing-page-properties draw:background-size="border" draw:fill="none"/>
+ </style:style>
+ <style:style style:name="dp2" style:family="drawing-page">
+ <style:drawing-page-properties presentation:display-header="true" presentation:display-footer="true" presentation:display-page-number="false" presentation:display-date-time="true"/>
+ </style:style>
+ <style:style style:name="dp3" style:family="drawing-page">
+ <style:drawing-page-properties presentation:background-visible="true" presentation:background-objects-visible="true" presentation:display-footer="true" presentation:display-page-number="false" presentation:display-date-time="true"/>
+ </style:style>
+ <style:style style:name="gr1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ </style:style>
+ <style:style style:name="gr2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ </style:style>
+ <style:style style:name="gr3" style:family="graphic">
+ <style:graphic-properties style:protect="size"/>
+ </style:style>
+ <style:style style:name="pr1" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.449cm"/>
+ </style:style>
+ <style:style style:name="pr2" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ </style:style>
+ <style:style style:name="pr3" style:family="presentation" style:parent-style-name="Default-backgroundobjects">
+ <style:graphic-properties draw:stroke="none" draw:fill="none" draw:fill-color="#ffffff" draw:textarea-vertical-align="bottom" draw:auto-grow-height="false" fo:min-height="1.485cm"/>
+ </style:style>
+ <style:style style:name="pr4" style:family="presentation" style:parent-style-name="Default-title">
+ <style:graphic-properties fo:min-height="3.506cm"/>
+ </style:style>
+ <style:style style:name="pr5" style:family="presentation" style:parent-style-name="Default-subtitle">
+ <style:graphic-properties draw:fill-color="#ffffff" fo:min-height="12.179cm"/>
+ </style:style>
+ <style:style style:name="pr6" style:family="presentation" style:parent-style-name="Default-notes">
+ <style:graphic-properties draw:fill-color="#ffffff" fo:min-height="13.364cm"/>
+ </style:style>
+ <style:style style:name="co1" style:family="table-column">
+ <style:table-column-properties style:column-width="4.758cm" style:use-optimal-column-width="false"/>
+ </style:style>
+ <style:style style:name="co2" style:family="table-column">
+ <style:table-column-properties style:column-width="4.767cm" style:use-optimal-column-width="false"/>
+ </style:style>
+ <style:style style:name="ro1" style:family="table-row">
+ <style:table-row-properties style:row-height="2.848cm"/>
+ </style:style>
+ <style:style style:name="ro2" style:family="table-row">
+ <style:table-row-properties style:row-height="2.855cm"/>
+ </style:style>
+ <style:style style:name="ce1" style:family="table-cell">
+ <style:paragraph-properties fo:text-align="center"/>
+ </style:style>
+ <style:style style:name="ce2" style:family="table-cell">
+ <loext:graphic-properties draw:textarea-vertical-align="bottom"/>
+ <style:paragraph-properties fo:text-align="center"/>
+ </style:style>
+ <style:style style:name="P1" style:family="paragraph">
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P2" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P3" style:family="paragraph">
+ <style:paragraph-properties fo:text-align="end"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P4" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:paragraph-properties fo:text-align="end"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P5" style:family="paragraph">
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P6" style:family="paragraph">
+ <loext:graphic-properties draw:fill="none" draw:fill-color="#ffffff"/>
+ <style:paragraph-properties fo:text-align="center"/>
+ <style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
+ </style:style>
+ <style:style style:name="P7" style:family="paragraph">
+ <loext:graphic-properties draw:fill-color="#ffffff"/>
+ </style:style>
+ <style:style style:name="P8" style:family="paragraph">
+ <style:paragraph-properties fo:text-align="center"/>
+ </style:style>
+ <text:list-style style:name="L1">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ <text:list-style style:name="L2">
+ <text:list-level-style-bullet text:level="1" text:bullet-char="â—">
+ <style:list-level-properties text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="2" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="3" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="4" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="5" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="6" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="7" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="8" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="9" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ <text:list-level-style-bullet text:level="10" text:bullet-char="â—">
+ <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/>
+ <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/>
+ </text:list-level-style-bullet>
+ </text:list-style>
+ </office:automatic-styles>
+ <office:master-styles>
+ <draw:layer-set>
+ <draw:layer draw:name="layout"/>
+ <draw:layer draw:name="background"/>
+ <draw:layer draw:name="backgroundobjects"/>
+ <draw:layer draw:name="controls"/>
+ <draw:layer draw:name="measurelines"/>
+ </draw:layer-set>
+ <style:handout-master presentation:presentation-page-layout-name="AL0T26" style:page-layout-name="PM0" draw:style-name="dp2">
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="6.749cm" svg:x="1cm" svg:y="2.898cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="6.749cm" svg:x="1cm" svg:y="11.474cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="6.749cm" svg:x="1cm" svg:y="20.05cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="6.749cm" svg:x="11cm" svg:y="2.898cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="6.749cm" svg:x="11cm" svg:y="11.474cm"/>
+ <draw:page-thumbnail draw:layer="backgroundobjects" svg:width="8.999cm" svg:height="6.749cm" svg:x="11cm" svg:y="20.05cm"/>
+ <draw:frame draw:style-name="gr1" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="0cm" presentation:class="header">
+ <draw:text-box>
+ <text:p text:style-name="P1"><presentation:header/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr1" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="0cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P3"><presentation:date-time/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr2" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="28.215cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P1"><presentation:footer/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame draw:style-name="gr2" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="28.215cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:page-number>&lt;number&gt;</text:page-number></text:p>
+ </draw:text-box>
+ </draw:frame>
+ </style:handout-master>
+ <style:master-page style:name="Default" style:page-layout-name="PM1" draw:style-name="dp1">
+ <draw:frame presentation:style-name="Default-title" draw:layer="backgroundobjects" svg:width="25.199cm" svg:height="3.506cm" svg:x="1.4cm" svg:y="0.837cm" presentation:class="title" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="Default-outline1" draw:layer="backgroundobjects" svg:width="25.199cm" svg:height="12.179cm" svg:x="1.4cm" svg:y="4.914cm" presentation:class="outline" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="6.523cm" svg:height="1.448cm" svg:x="1.4cm" svg:y="19.131cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P1"><presentation:date-time/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P6" draw:layer="backgroundobjects" svg:width="8.875cm" svg:height="1.448cm" svg:x="9.576cm" svg:y="19.131cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P5"><presentation:footer/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr1" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="6.523cm" svg:height="1.448cm" svg:x="20.076cm" svg:y="19.131cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:page-number>&lt;number&gt;</text:page-number></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <presentation:notes style:page-layout-name="PM0">
+ <draw:page-thumbnail presentation:style-name="Default-title" draw:layer="backgroundobjects" svg:width="14.848cm" svg:height="11.136cm" svg:x="3.075cm" svg:y="2.257cm" presentation:class="page"/>
+ <draw:frame presentation:style-name="Default-notes" draw:layer="backgroundobjects" svg:width="16.799cm" svg:height="13.364cm" svg:x="2.1cm" svg:y="14.107cm" presentation:class="notes" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr2" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="0cm" presentation:class="header">
+ <draw:text-box>
+ <text:p text:style-name="P1"><presentation:header/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr2" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="0cm" presentation:class="date-time">
+ <draw:text-box>
+ <text:p text:style-name="P3"><presentation:date-time/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr3" draw:text-style-name="P2" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="0cm" svg:y="28.215cm" presentation:class="footer">
+ <draw:text-box>
+ <text:p text:style-name="P1"><presentation:footer/></text:p>
+ </draw:text-box>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr3" draw:text-style-name="P4" draw:layer="backgroundobjects" svg:width="9.113cm" svg:height="1.484cm" svg:x="11.886cm" svg:y="28.215cm" presentation:class="page-number">
+ <draw:text-box>
+ <text:p text:style-name="P3"><text:page-number>&lt;number&gt;</text:page-number></text:p>
+ </draw:text-box>
+ </draw:frame>
+ </presentation:notes>
+ </style:master-page>
+ </office:master-styles>
+ <office:body>
+ <office:presentation>
+ <draw:page draw:name="page1" draw:style-name="dp3" draw:master-page-name="Default" presentation:presentation-page-layout-name="AL1T0">
+ <draw:frame presentation:style-name="pr4" draw:layer="layout" svg:width="25.199cm" svg:height="3.506cm" svg:x="1.4cm" svg:y="0.837cm" presentation:class="title" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame presentation:style-name="pr5" draw:text-style-name="P7" draw:layer="layout" svg:width="25.199cm" svg:height="12.179cm" svg:x="1.4cm" svg:y="4.914cm" presentation:class="subtitle" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ <draw:frame draw:style-name="standard" draw:layer="layout" svg:width="23.798cm" svg:height="11.398cm" svg:x="1.8cm" svg:y="5.4cm">
+ <table:table table:template-name="default" table:use-first-row-styles="true" table:use-banding-rows-styles="true">
+ <table:table-column table:style-name="co1"/>
+ <table:table-column table:style-name="co1"/>
+ <table:table-column table:style-name="co1"/>
+ <table:table-column table:style-name="co1"/>
+ <table:table-column table:style-name="co2"/>
+ <table:table-row table:style-name="ro1" table:default-cell-style-name="gray3">
+ <table:table-cell>
+ <text:p>aaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aa</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="ce1">
+ <text:p text:style-name="P8">aaaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aaaaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aaaa</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1" table:default-cell-style-name="gray2">
+ <table:table-cell>
+ <text:p>aaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aaa</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="ce2">
+ <text:p text:style-name="P8">aaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aaaaaa</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro1" table:default-cell-style-name="gray1">
+ <table:table-cell>
+ <text:p>aaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aaaaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aaaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aaaaaa</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro2" table:default-cell-style-name="gray2">
+ <table:table-cell>
+ <text:p>aaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aaaaaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aaa</text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p>aaa</text:p>
+ </table:table-cell>
+ </table:table-row>
+ </table:table><draw:image>
+ <office:binary-data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAAEElEQVR4nGJgAQAAAP//AwAA
+ BgAFV7+r1AAAAABJRU5ErkJggg==
+ </office:binary-data>
+ </draw:image>
+ </draw:frame>
+ <presentation:notes draw:style-name="dp2">
+ <draw:page-thumbnail draw:style-name="gr3" draw:layer="layout" svg:width="14.848cm" svg:height="11.136cm" svg:x="3.075cm" svg:y="2.257cm" draw:page-number="1" presentation:class="page"/>
+ <draw:frame presentation:style-name="pr6" draw:text-style-name="P7" draw:layer="layout" svg:width="16.799cm" svg:height="13.364cm" svg:x="2.1cm" svg:y="14.107cm" presentation:class="notes" presentation:placeholder="true">
+ <draw:text-box/>
+ </draw:frame>
+ </presentation:notes>
+ </draw:page>
+ <presentation:settings presentation:mouse-visible="false"/>
+ </office:presentation>
+ </office:body>
+</office:document> \ No newline at end of file
diff --git a/sd/qa/unit/tiledrendering/data/tdf105502.odp b/sd/qa/unit/tiledrendering/data/tdf105502.odp
new file mode 100644
index 000000000..2150f1152
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/tdf105502.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/tdf115783.fodp b/sd/qa/unit/tiledrendering/data/tdf115783.fodp
new file mode 100644
index 000000000..d9ada63ad
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/tdf115783.fodp
@@ -0,0 +1,52 @@
+<?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:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation: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:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" 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.presentation">
+ <office:font-face-decls>
+ <style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:automatic-styles>
+ <style:style style:name="co1" style:family="table-column">
+ <style:table-column-properties style:column-width="4.3cm" style:use-optimal-column-width="false"/>
+ </style:style>
+ <style:style style:name="co2" style:family="table-column">
+ <style:table-column-properties style:column-width="6.241cm" style:use-optimal-column-width="false"/>
+ </style:style>
+ <style:style style:name="co3" style:family="table-column">
+ <style:table-column-properties style:column-width="4.909cm" style:use-optimal-column-width="false"/>
+ </style:style>
+ <style:style style:name="ro1" style:family="table-row">
+ <style:table-row-properties style:row-height="1.364cm"/>
+ </style:style>
+ <style:style style:name="ce1" style:family="table-cell">
+ <loext:graphic-properties draw:fill="none" style:repeat="repeat"/>
+ <style:paragraph-properties fo:border="0.03pt solid #000000"/>
+ <style:text-properties style:font-name="Arial" fo:font-size="12pt"/>
+ </style:style>
+ <style:style style:name="T1" style:family="text">
+ <style:text-properties style:font-name="Arial" fo:font-size="12pt"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:presentation>
+ <draw:page draw:name="page1">
+ <draw:frame draw:style-name="standard" draw:layer="layout" svg:width="15.449cm" svg:height="1.363cm" svg:x="2.179cm" svg:y="3.302cm">
+ <table:table table:template-name="default">
+ <table:table-column table:style-name="co1"/>
+ <table:table-column table:style-name="co2"/>
+ <table:table-column table:style-name="co3"/>
+ <table:table-row table:style-name="ro1" table:default-cell-style-name="ce1">
+ <table:table-cell>
+ <text:p><text:span text:style-name="T1">before</text:span></text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p><text:span text:style-name="T1">hello</text:span></text:p>
+ </table:table-cell>
+ <table:table-cell>
+ <text:p><text:span text:style-name="T1">after</text:span></text:p>
+ </table:table-cell>
+ </table:table-row>
+ </table:table>
+ </draw:frame>
+ </draw:page>
+ </office:presentation>
+ </office:body>
+</office:document>
diff --git a/sd/qa/unit/tiledrendering/data/tdf115873-group.fodp b/sd/qa/unit/tiledrendering/data/tdf115873-group.fodp
new file mode 100644
index 000000000..603ec4c7e
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/tdf115873-group.fodp
@@ -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:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation: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:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" 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.presentation">
+ <office:automatic-styles>
+ <style:style style:name="dp1" style:family="drawing-page">
+ </style:style>
+ <style:style style:name="gr1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:textarea-horizontal-align="justify" draw:textarea-vertical-align="middle" draw:auto-grow-height="false" fo:min-height="2.15cm" fo:min-width="1.3cm"/>
+ </style:style>
+ <style:style style:name="gr2" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:textarea-horizontal-align="justify" draw:textarea-vertical-align="middle" draw:auto-grow-height="false" fo:min-height="1.55cm" fo:min-width="1.3cm"/>
+ </style:style>
+ <style:style style:name="gr3" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:textarea-horizontal-align="justify" draw:textarea-vertical-align="middle" draw:auto-grow-height="false" fo:min-height="1.55cm" fo:min-width="2.1cm"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:presentation>
+ <draw:page draw:name="page1" draw:style-name="dp1">
+ <draw:g draw:name="Group 1">
+ <draw:custom-shape draw:name="Rectangle 1" draw:style-name="gr1" draw:layer="layout" svg:width="1.8cm" svg:height="2.4cm" svg:x="2.8cm" svg:y="2.8cm">
+ <text:p/>
+ <draw:enhanced-geometry svg:viewBox="0 0 21600 21600" draw:type="rectangle" draw:enhanced-path="M 0 0 L 21600 0 21600 21600 0 21600 0 0 Z N"/>
+ </draw:custom-shape>
+ <draw:custom-shape draw:name="Rectangle 2" draw:style-name="gr2" draw:layer="layout" svg:width="1.8cm" svg:height="1.8cm" svg:x="6cm" svg:y="3.2cm">
+ <text:p/>
+ <draw:enhanced-geometry svg:viewBox="0 0 21600 21600" draw:type="rectangle" draw:enhanced-path="M 0 0 L 21600 0 21600 21600 0 21600 0 0 Z N"/>
+ </draw:custom-shape>
+ </draw:g>
+ <draw:custom-shape draw:name="Rectangle 3" draw:style-name="gr3" draw:layer="layout" svg:width="2.6cm" svg:height="1.8cm" svg:x="4.6cm" svg:y="7.4cm">
+ <text:p/>
+ <draw:enhanced-geometry svg:viewBox="0 0 21600 21600" draw:type="rectangle" draw:enhanced-path="M 0 0 L 21600 0 21600 21600 0 21600 0 0 Z N"/>
+ </draw:custom-shape>
+ </draw:page>
+ </office:presentation>
+ </office:body>
+</office:document>
diff --git a/sd/qa/unit/tiledrendering/data/tdf115873.fodp b/sd/qa/unit/tiledrendering/data/tdf115873.fodp
new file mode 100644
index 000000000..1633a0471
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/tdf115873.fodp
@@ -0,0 +1,29 @@
+<?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:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation: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:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" 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.presentation">
+ <office:font-face-decls>
+ <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="roman" 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"/>
+ <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" 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 Sans" fo:font-size="24pt" fo:language="en" fo:country="US" style:font-size-asian="24pt" style:language-asian="zh" style:country-asian="CN" style:font-size-complex="24pt" style:language-complex="hi" style:country-complex="IN"/>
+ </style:default-style>
+ </office:styles>
+ <office:automatic-styles>
+ <style:style style:name="gr1" style:family="graphic" style:parent-style-name="standard">
+ <style:graphic-properties draw:textarea-horizontal-align="justify" draw:textarea-vertical-align="middle" draw:auto-grow-height="false" fo:min-height="2.544cm" fo:min-width="4.58cm"/>
+ </style:style>
+ </office:automatic-styles>
+ <office:body>
+ <office:presentation>
+ <draw:page draw:name="page1">
+ <draw:custom-shape draw:name="Rectangle" draw:style-name="gr1" draw:layer="layout" svg:width="5.08cm" svg:height="2.794cm" svg:x="12.954cm" svg:y="7.62cm">
+ <draw:enhanced-geometry svg:viewBox="0 0 21600 21600" draw:type="rectangle" draw:enhanced-path="M 0 0 L 21600 0 21600 21600 0 21600 0 0 Z N"/>
+ </draw:custom-shape>
+ </draw:page>
+ </office:presentation>
+ </office:body>
+</office:document>
diff --git a/sd/qa/unit/tiledrendering/data/tdf118354.odp b/sd/qa/unit/tiledrendering/data/tdf118354.odp
new file mode 100644
index 000000000..beb132c7e
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/tdf118354.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/tdf81754.pptx b/sd/qa/unit/tiledrendering/data/tdf81754.pptx
new file mode 100644
index 000000000..8a1fa1dcf
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/tdf81754.pptx
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/data/title-shape.odp b/sd/qa/unit/tiledrendering/data/title-shape.odp
new file mode 100644
index 000000000..15d39d68e
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/data/title-shape.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx
new file mode 100644
index 000000000..e9f3f012b
--- /dev/null
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -0,0 +1,3007 @@
+/* -*- 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 "../sdmodeltestbase.hxx"
+
+#include <app.hrc>
+#include <test/bootstrapfixture.hxx>
+#include <test/helper/transferable.hxx>
+#include <test/xmltesttools.hxx>
+#include <boost/property_tree/json_parser.hpp>
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+#include <sal/log.hxx>
+#include <sfx2/lokhelper.hxx>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <comphelper/dispatchcommand.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertysequence.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <comphelper/string.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/editids.hrc>
+#include <editeng/editobj.hxx>
+#include <editeng/editview.hxx>
+#include <editeng/numitem.hxx>
+#include <editeng/outliner.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/outlobj.hxx>
+#include <osl/conditn.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svl/stritem.hxx>
+#include <svl/intitem.hxx>
+#include <comphelper/lok.hxx>
+#include <svx/svdotable.hxx>
+#include <svx/svdoutl.hxx>
+#include <unotools/datetime.hxx>
+#include <test/lokcallback.hxx>
+
+#include <DrawDocShell.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShell.hxx>
+#include <sdpage.hxx>
+#include <unomodel.hxx>
+#include <drawdoc.hxx>
+#include <undo/undomanager.hxx>
+#include <sfx2/request.hxx>
+#include <svx/svxids.hrc>
+#include <pres.hxx>
+#include <navigatr.hxx>
+#include <vcl/cursor.hxx>
+#include <vcl/scheduler.hxx>
+#include <vcl/vclevent.hxx>
+#include <o3tl/string_view.hxx>
+
+#include <chrono>
+#include <cstdlib>
+#include <string_view>
+
+using namespace css;
+
+namespace
+{
+ constexpr OUStringLiteral DATA_DIRECTORY = u"/sd/qa/unit/tiledrendering/data/";
+}
+
+static std::ostream& operator<<(std::ostream& os, ViewShellId id)
+{
+ os << static_cast<sal_Int32>(id);
+ return os;
+}
+
+class SdTiledRenderingTest : public SdModelTestBase, public XmlTestTools
+{
+public:
+ SdTiledRenderingTest();
+ virtual void setUp() override;
+ virtual void tearDown() override;
+
+ void testCreateDestroy();
+ void testCreateView();
+ void testRegisterCallback();
+ void testPostKeyEvent();
+ void testPostMouseEvent();
+ void testSetTextSelection();
+ void testGetTextSelection();
+ void testSetGraphicSelection();
+ void testUndoShells();
+ void testResetSelection();
+ void testInsertDeletePage();
+ void testInsertTable();
+ void testPartHash();
+ void testResizeTable();
+ void testResizeTableColumn();
+ void testViewCursors();
+ void testViewCursorParts();
+ void testCursorViews();
+ void testCursorVisibility_SingleClick();
+ void testCursorVisibility_DoubleClick();
+ void testCursorVisibility_MultiView();
+ void testCursorVisibility_Escape();
+ void testViewLock();
+ void testUndoLimiting();
+ void testCreateViewGraphicSelection();
+ void testCreateViewTextCursor();
+ void testTdf102223();
+ void testTdf118354();
+ void testPostKeyEventInvalidation();
+ void testTdf103083();
+ void testTdf104405();
+ void testTdf81754();
+ void testTdf105502();
+ void testCommentCallbacks();
+ void testCommentChangeImpress();
+ void testCommentChangeDraw();
+ void testMultiViewInsertDeletePage();
+ void testMultiViewInsertDeletePage2();
+ void testDisableUndoRepair();
+ void testDocumentRepair();
+ void testLanguageStatus();
+ void testDefaultView();
+ void testIMESupport();
+ void testTdf115783();
+ void testPasteTextOnSlide();
+ void testTdf115873();
+ void testTdf115873Group();
+ void testCutSelectionChange();
+ void testRegenerateDiagram();
+ void testLanguageAllText();
+ void testInsertDeletePageInvalidation();
+ void testSpellOnlineRenderParameter();
+ void testSlideDuplicateUndo();
+ void testMoveShapeHandle();
+ void testDeleteTable();
+ void testPasteUndo();
+ void testShapeEditInMultipleViews();
+
+ CPPUNIT_TEST_SUITE(SdTiledRenderingTest);
+ CPPUNIT_TEST(testCreateDestroy);
+ CPPUNIT_TEST(testCreateView);
+ CPPUNIT_TEST(testRegisterCallback);
+ CPPUNIT_TEST(testPostKeyEvent);
+ CPPUNIT_TEST(testPostMouseEvent);
+ CPPUNIT_TEST(testSetTextSelection);
+ CPPUNIT_TEST(testGetTextSelection);
+ CPPUNIT_TEST(testSetGraphicSelection);
+ CPPUNIT_TEST(testUndoShells);
+ CPPUNIT_TEST(testResetSelection);
+ CPPUNIT_TEST(testInsertDeletePage);
+ CPPUNIT_TEST(testInsertTable);
+ CPPUNIT_TEST(testPartHash);
+ CPPUNIT_TEST(testResizeTable);
+ CPPUNIT_TEST(testResizeTableColumn);
+ CPPUNIT_TEST(testViewCursors);
+ CPPUNIT_TEST(testViewCursorParts);
+ CPPUNIT_TEST(testCursorViews);
+ CPPUNIT_TEST(testCursorVisibility_SingleClick);
+ CPPUNIT_TEST(testCursorVisibility_DoubleClick);
+ CPPUNIT_TEST(testCursorVisibility_MultiView);
+ CPPUNIT_TEST(testCursorVisibility_Escape);
+ CPPUNIT_TEST(testViewLock);
+ CPPUNIT_TEST(testUndoLimiting);
+ CPPUNIT_TEST(testCreateViewGraphicSelection);
+ CPPUNIT_TEST(testCreateViewTextCursor);
+ CPPUNIT_TEST(testTdf102223);
+ CPPUNIT_TEST(testTdf118354);
+ CPPUNIT_TEST(testPostKeyEventInvalidation);
+ CPPUNIT_TEST(testTdf103083);
+ CPPUNIT_TEST(testTdf104405);
+ CPPUNIT_TEST(testTdf81754);
+ CPPUNIT_TEST(testTdf105502);
+ CPPUNIT_TEST(testCommentCallbacks);
+ CPPUNIT_TEST(testCommentChangeImpress);
+ CPPUNIT_TEST(testCommentChangeDraw);
+ CPPUNIT_TEST(testMultiViewInsertDeletePage);
+ CPPUNIT_TEST(testMultiViewInsertDeletePage2);
+ CPPUNIT_TEST(testDisableUndoRepair);
+ CPPUNIT_TEST(testDocumentRepair);
+ CPPUNIT_TEST(testLanguageStatus);
+ CPPUNIT_TEST(testDefaultView);
+ CPPUNIT_TEST(testIMESupport);
+ CPPUNIT_TEST(testTdf115783);
+ CPPUNIT_TEST(testPasteTextOnSlide);
+ CPPUNIT_TEST(testTdf115873);
+ CPPUNIT_TEST(testTdf115873Group);
+ CPPUNIT_TEST(testCutSelectionChange);
+ CPPUNIT_TEST(testRegenerateDiagram);
+ CPPUNIT_TEST(testLanguageAllText);
+ CPPUNIT_TEST(testInsertDeletePageInvalidation);
+ CPPUNIT_TEST(testSpellOnlineRenderParameter);
+ CPPUNIT_TEST(testSlideDuplicateUndo);
+ CPPUNIT_TEST(testMoveShapeHandle);
+ CPPUNIT_TEST(testDeleteTable);
+ CPPUNIT_TEST(testPasteUndo);
+ CPPUNIT_TEST(testShapeEditInMultipleViews);
+ CPPUNIT_TEST_SUITE_END();
+
+private:
+ SdXImpressDocument* createDoc(const char* pName, const uno::Sequence<beans::PropertyValue>& rArguments = uno::Sequence<beans::PropertyValue>());
+ void setupLibreOfficeKitViewCallback(SfxViewShell& pViewShell);
+ static void callback(int nType, const char* pPayload, void* pData);
+ void callbackImpl(int nType, const char* pPayload);
+ xmlDocUniquePtr parseXmlDump();
+
+ uno::Reference<lang::XComponent> mxComponent;
+ ::tools::Rectangle m_aInvalidation;
+ std::vector<::tools::Rectangle> m_aSelection;
+ bool m_bFound;
+ sal_Int32 m_nPart;
+ std::vector<OString> m_aSearchResultSelection;
+ std::vector<int> m_aSearchResultPart;
+ int m_nSelectionBeforeSearchResult;
+ int m_nSelectionAfterSearchResult;
+
+ /// For document size changed callback.
+ osl::Condition m_aDocumentSizeCondition;
+ xmlBufferPtr m_pXmlBuffer;
+ TestLokCallbackWrapper m_callbackWrapper;
+};
+
+SdTiledRenderingTest::SdTiledRenderingTest()
+ : m_bFound(true),
+ m_nPart(0),
+ m_nSelectionBeforeSearchResult(0),
+ m_nSelectionAfterSearchResult(0),
+ m_pXmlBuffer(nullptr),
+ m_callbackWrapper(&callback, this)
+{
+}
+
+void SdTiledRenderingTest::setUp()
+{
+ test::BootstrapFixture::setUp();
+
+ // prevent showing warning message box
+ setenv("OOX_NO_SMARTART_WARNING", "1", 1);
+ comphelper::LibreOfficeKit::setActive(true);
+
+ mxDesktop.set(css::frame::Desktop::create(comphelper::getComponentContext(getMultiServiceFactory())));
+}
+
+void SdTiledRenderingTest::tearDown()
+{
+ if (mxComponent.is())
+ mxComponent->dispose();
+
+ if (m_pXmlBuffer)
+ xmlBufferFree(m_pXmlBuffer);
+
+ m_callbackWrapper.clear();
+ comphelper::LibreOfficeKit::setActive(false);
+
+ test::BootstrapFixture::tearDown();
+}
+
+SdXImpressDocument* SdTiledRenderingTest::createDoc(const char* pName, const uno::Sequence<beans::PropertyValue>& rArguments)
+{
+ if (mxComponent.is())
+ mxComponent->dispose();
+ mxComponent = loadFromDesktop(m_directories.getURLFromSrc(DATA_DIRECTORY) + OUString::createFromAscii(pName), "com.sun.star.presentation.PresentationDocument");
+ SdXImpressDocument* pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ CPPUNIT_ASSERT(pImpressDocument);
+ pImpressDocument->initializeForTiledRendering(rArguments);
+ return pImpressDocument;
+}
+
+void SdTiledRenderingTest::setupLibreOfficeKitViewCallback(SfxViewShell& pViewShell)
+{
+ pViewShell.setLibreOfficeKitViewCallback(&m_callbackWrapper);
+ m_callbackWrapper.setLOKViewId(SfxLokHelper::getView(&pViewShell));
+}
+
+void SdTiledRenderingTest::callback(int nType, const char* pPayload, void* pData)
+{
+ static_cast<SdTiledRenderingTest*>(pData)->callbackImpl(nType, pPayload);
+}
+
+namespace
+{
+
+std::vector<OUString> lcl_convertSeparated(std::u16string_view rString, sal_Unicode nSeparator)
+{
+ std::vector<OUString> aRet;
+
+ sal_Int32 nIndex = 0;
+ do
+ {
+ OUString aToken( o3tl::trim(o3tl::getToken(rString, 0, nSeparator, nIndex)) );
+ if (!aToken.isEmpty())
+ aRet.push_back(aToken);
+ }
+ while (nIndex >= 0);
+
+ return aRet;
+}
+
+void lcl_convertRectangle(std::u16string_view rString, ::tools::Rectangle& rRectangle)
+{
+ uno::Sequence<OUString> aSeq = comphelper::string::convertCommaSeparated(rString);
+ CPPUNIT_ASSERT(aSeq.getLength() == 4 || aSeq.getLength() == 5);
+ rRectangle.SetLeft(aSeq[0].toInt32());
+ rRectangle.SetTop(aSeq[1].toInt32());
+ rRectangle.setWidth(aSeq[2].toInt32());
+ rRectangle.setHeight(aSeq[3].toInt32());
+}
+
+} // end anonymous namespace
+
+void SdTiledRenderingTest::callbackImpl(int nType, const char* pPayload)
+{
+ switch (nType)
+ {
+ case LOK_CALLBACK_INVALIDATE_TILES:
+ {
+ OUString aPayload = OUString::createFromAscii(pPayload);
+ if (aPayload != "EMPTY" && m_aInvalidation.IsEmpty())
+ lcl_convertRectangle(aPayload, m_aInvalidation);
+ }
+ break;
+ case LOK_CALLBACK_TEXT_SELECTION:
+ {
+ OUString aPayload = OUString::createFromAscii(pPayload);
+ m_aSelection.clear();
+ for (const OUString& rString : lcl_convertSeparated(aPayload, u';'))
+ {
+ ::tools::Rectangle aRectangle;
+ lcl_convertRectangle(rString, aRectangle);
+ m_aSelection.push_back(aRectangle);
+ }
+ if (m_aSearchResultSelection.empty())
+ ++m_nSelectionBeforeSearchResult;
+ else
+ ++m_nSelectionAfterSearchResult;
+ }
+ break;
+ case LOK_CALLBACK_SEARCH_NOT_FOUND:
+ {
+ m_bFound = false;
+ }
+ break;
+ case LOK_CALLBACK_DOCUMENT_SIZE_CHANGED:
+ {
+ m_aDocumentSizeCondition.set();
+ }
+ break;
+ case LOK_CALLBACK_SET_PART:
+ {
+ OUString aPayload = OUString::createFromAscii(pPayload);
+ m_nPart = aPayload.toInt32();
+ }
+ break;
+ case LOK_CALLBACK_SEARCH_RESULT_SELECTION:
+ {
+ m_aSearchResultSelection.clear();
+ m_aSearchResultPart.clear();
+ boost::property_tree::ptree aTree;
+ std::stringstream aStream(pPayload);
+ boost::property_tree::read_json(aStream, aTree);
+ for (const boost::property_tree::ptree::value_type& rValue : aTree.get_child("searchResultSelection"))
+ {
+ m_aSearchResultSelection.emplace_back(rValue.second.get<std::string>("rectangles").c_str());
+ m_aSearchResultPart.push_back(std::atoi(rValue.second.get<std::string>("part").c_str()));
+ }
+ }
+ break;
+ }
+}
+
+xmlDocUniquePtr SdTiledRenderingTest::parseXmlDump()
+{
+ if (m_pXmlBuffer)
+ xmlBufferFree(m_pXmlBuffer);
+
+ // Create the xml writer.
+ m_pXmlBuffer = xmlBufferCreate();
+ xmlTextWriterPtr pXmlWriter = xmlNewTextWriterMemory(m_pXmlBuffer, 0);
+ (void)xmlTextWriterStartDocument(pXmlWriter, nullptr, nullptr, nullptr);
+
+ // Create the dump.
+ SdXImpressDocument* pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ CPPUNIT_ASSERT(pImpressDocument);
+ pImpressDocument->GetDoc()->dumpAsXml(pXmlWriter);
+
+ // Delete the xml writer.
+ (void)xmlTextWriterEndDocument(pXmlWriter);
+ xmlFreeTextWriter(pXmlWriter);
+
+ auto pCharBuffer = xmlBufferContent(m_pXmlBuffer);
+ SAL_INFO("test", "SdTiledRenderingTest::parseXmlDump: pCharBuffer is '" << pCharBuffer << "'");
+ return xmlDocUniquePtr(xmlParseDoc(pCharBuffer));
+}
+
+void SdTiledRenderingTest::testCreateDestroy()
+{
+ createDoc("dummy.odp");
+ // Nothing to do, the tearDown call should cleanup.
+}
+
+void SdTiledRenderingTest::testCreateView()
+{
+ createDoc("dummy.odp");
+
+ SfxLokHelper::createView();
+}
+
+void SdTiledRenderingTest::testRegisterCallback()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ setupLibreOfficeKitViewCallback(pViewShell->GetViewShellBase());
+
+ // Start text edit of the empty title shape.
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ SdrView* pView = pViewShell->GetView();
+ pView->SdrBeginTextEdit(pObject);
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+
+ // Check that the top left 256x256px tile would be invalidated.
+ CPPUNIT_ASSERT(!m_aInvalidation.IsEmpty());
+ ::tools::Rectangle aTopLeft(0, 0, 256*15, 256*15); // 1 px = 15 twips, assuming 96 DPI.
+ CPPUNIT_ASSERT(m_aInvalidation.Overlaps(aTopLeft));
+}
+
+void SdTiledRenderingTest::testPostKeyEvent()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject->GetObjIdentifier());
+ SdrTextObj* pTextObj = static_cast<SdrTextObj*>(pObject);
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pTextObj, pView->GetSdrPageView());
+ SfxStringItem aInputString(SID_ATTR_CHAR, "x");
+ pViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR,
+ SfxCallMode::SYNCHRON, { &aInputString });
+
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+ EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView();
+ // Did we manage to enter a second character?
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), rEditView.GetSelection().nStartPos);
+ ESelection aWordSelection(0, 0, 0, 2); // start para, start char, end para, end char.
+ rEditView.SetSelection(aWordSelection);
+ // Did we enter the expected character?
+ CPPUNIT_ASSERT_EQUAL(OUString("xx"), rEditView.GetSelected());
+}
+
+void SdTiledRenderingTest::testPostMouseEvent()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject->GetObjIdentifier());
+ SdrTextObj* pTextObj = static_cast<SdrTextObj*>(pObject);
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pTextObj, pView->GetSdrPageView());
+ SfxStringItem aInputString(SID_ATTR_CHAR, "x");
+ pViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR,
+ SfxCallMode::SYNCHRON, { &aInputString });
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+ EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView();
+ // Did we manage to go after the first character?
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), rEditView.GetSelection().nStartPos);
+
+ vcl::Cursor* pCursor = rEditView.GetCursor();
+ Point aPosition(pCursor->GetPos().getX(), pCursor->GetPos().getY() + pCursor->GetSize().Height() / 2);
+ aPosition.setX(aPosition.getX() - 1000);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ o3tl::toTwips(aPosition.getX(), o3tl::Length::mm100), o3tl::toTwips(aPosition.getY(), o3tl::Length::mm100),
+ 1, MOUSE_LEFT, 0);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP,
+ o3tl::toTwips(aPosition.getX(), o3tl::Length::mm100), o3tl::toTwips(aPosition.getY(), o3tl::Length::mm100),
+ 1, MOUSE_LEFT, 0);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+ // The new cursor position must be before the first word.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), rEditView.GetSelection().nStartPos);
+}
+
+void SdTiledRenderingTest::testSetTextSelection()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ uno::Reference<container::XIndexAccess> xDrawPage(pXImpressDocument->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<text::XTextRange> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY);
+ xShape->setString("Aaa bbb.");
+ // Create a selection on the second word.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ SdrView* pView = pViewShell->GetView();
+ pView->SdrBeginTextEdit(pObject);
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+ EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView();
+ ESelection aWordSelection(0, 4, 0, 7);
+ rEditView.SetSelection(aWordSelection);
+ // Did we indeed manage to select the second word?
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), rEditView.GetSelected());
+
+ // Now use setTextSelection() to move the end of the selection 1000 twips right.
+ vcl::Cursor* pCursor = rEditView.GetCursor();
+ Point aEnd = pCursor->GetPos();
+ aEnd.setX(aEnd.getX() + 1000);
+ pXImpressDocument->setTextSelection(LOK_SETTEXTSELECTION_END, aEnd.getX(), aEnd.getY());
+ // The new selection must include the ending dot, too -- but not the first word.
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb."), rEditView.GetSelected());
+}
+
+void SdTiledRenderingTest::testGetTextSelection()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ uno::Reference<container::XIndexAccess> xDrawPage(pXImpressDocument->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<text::XTextRange> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY);
+ xShape->setString("Shape");
+ // Create a selection on the shape text.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ SdrView* pView = pViewShell->GetView();
+ pView->SdrBeginTextEdit(pObject);
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+ EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView();
+ ESelection aWordSelection(0, 0, 0, 5);
+ rEditView.SetSelection(aWordSelection);
+ // Did we indeed manage to copy the selected text?
+ CPPUNIT_ASSERT_EQUAL(OString("Shape"), apitest::helper::transferable::getTextSelection(pXImpressDocument->getSelection(), "text/plain;charset=utf-8"));
+
+ // Make sure returned RTF is not empty.
+ CPPUNIT_ASSERT(!apitest::helper::transferable::getTextSelection(pXImpressDocument->getSelection(), "text/rtf").isEmpty());
+}
+
+void SdTiledRenderingTest::testSetGraphicSelection()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("shape.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pPage->GetObj(0);
+ SdrHdlList handleList(nullptr);
+ pObject->AddToHdlList(handleList);
+ // Make sure the rectangle has 8 handles: at each corner and at the center of each edge.
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(8), handleList.GetHdlCount());
+ // Take the bottom center one.
+ SdrHdl* pHdl = handleList.GetHdl(6);
+ CPPUNIT_ASSERT_EQUAL(int(SdrHdlKind::Lower), static_cast<int>(pHdl->GetKind()));
+ ::tools::Rectangle aShapeBefore = pObject->GetSnapRect();
+ // Resize.
+ pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_START, o3tl::toTwips(pHdl->GetPos().getX(), o3tl::Length::mm100), o3tl::toTwips(pHdl->GetPos().getY(), o3tl::Length::mm100));
+ pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_END, o3tl::toTwips(pHdl->GetPos().getX(), o3tl::Length::mm100), o3tl::toTwips(pHdl->GetPos().getY() + 1000, o3tl::Length::mm100));
+
+ // Assert that view shell ID tracking works.
+ sal_Int32 nView1 = SfxLokHelper::getView();
+ SdDrawDocument* pDocument = pXImpressDocument->GetDoc();
+ sd::UndoManager* pUndoManager = pDocument->GetUndoManager();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pUndoManager->GetUndoActionCount());
+ auto pListAction = dynamic_cast<SfxListUndoAction*>(pUndoManager->GetUndoAction());
+ CPPUNIT_ASSERT(pListAction);
+ for (size_t i = 0; i < pListAction->maUndoActions.size(); ++i)
+ // The second item was -1 here, view shell ID wasn't known.
+ CPPUNIT_ASSERT_EQUAL(ViewShellId(nView1), pListAction->GetUndoAction(i)->GetViewShellId());
+
+ ::tools::Rectangle aShapeAfter = pObject->GetSnapRect();
+ // Check that a resize happened, but aspect ratio is not kept.
+ CPPUNIT_ASSERT_EQUAL(aShapeBefore.getWidth(), aShapeAfter.getWidth());
+ CPPUNIT_ASSERT(aShapeBefore.getHeight() < aShapeAfter.getHeight());
+}
+
+void SdTiledRenderingTest::testUndoShells()
+{
+ // Load a document and set the page size.
+ SdXImpressDocument* pXImpressDocument = createDoc("shape.odp");
+ uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence(
+ {
+ {"AttributePageSize.Width", uno::Any(static_cast<sal_Int32>(10000))},
+ {"AttributePageSize.Height", uno::Any(static_cast<sal_Int32>(10000))},
+ }));
+ comphelper::dispatchCommand(".uno:AttributePageSize", aPropertyValues);
+ Scheduler::ProcessEventsToIdle();
+
+ // Assert that view shell ID tracking works for SdUndoAction subclasses.
+ SdDrawDocument* pDocument = pXImpressDocument->GetDoc();
+ sd::UndoManager* pUndoManager = pDocument->GetUndoManager();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pUndoManager->GetUndoActionCount());
+ sal_Int32 nView1 = SfxLokHelper::getView();
+ // This was -1, SdUndoGroup did not track what view shell created it.
+ CPPUNIT_ASSERT_EQUAL(ViewShellId(nView1), pUndoManager->GetUndoAction()->GetViewShellId());
+}
+
+void SdTiledRenderingTest::testResetSelection()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ uno::Reference<container::XIndexAccess> xDrawPage(pXImpressDocument->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<text::XTextRange> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY);
+ xShape->setString("Aaa bbb.");
+ // Create a selection on the second word.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ SdrView* pView = pViewShell->GetView();
+ pView->SdrBeginTextEdit(pObject);
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+ EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView();
+ ESelection aWordSelection(0, 4, 0, 7);
+ rEditView.SetSelection(aWordSelection);
+ // Did we indeed manage to select the second word?
+ CPPUNIT_ASSERT_EQUAL(OUString("bbb"), rEditView.GetSelected());
+
+ // Now use resetSelection() to reset the selection.
+ pXImpressDocument->resetSelection();
+ CPPUNIT_ASSERT(!pView->GetTextEditObject());
+}
+
+namespace
+{
+
+std::vector<OUString> getCurrentParts(SdXImpressDocument* pDocument)
+{
+ int parts = pDocument->getParts();
+ std::vector<OUString> result;
+
+ result.reserve(parts);
+ for (int i = 0; i < parts; i++)
+ {
+ result.push_back(pDocument->getPartName(i));
+ }
+
+ return result;
+}
+
+}
+
+void SdTiledRenderingTest::testInsertDeletePage()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("insert-delete.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ setupLibreOfficeKitViewCallback(pViewShell->GetViewShellBase());
+
+ SdDrawDocument* pDoc = pXImpressDocument->GetDocShell()->GetDoc();
+ CPPUNIT_ASSERT(pDoc);
+
+ std::vector<OUString> aInserted =
+ {
+ "Slide 1", "Slide 2", "Slide 3", "Slide 4", "Slide 5",
+ "Slide 6", "Slide 7", "Slide 8", "Slide 9", "Slide 10", "Slide 11"
+ };
+
+ std::vector<OUString> aDeleted =
+ {
+ "Slide 1"
+ };
+
+ // the document has 1 slide
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(1), pDoc->GetSdPageCount(PageKind::Standard));
+
+ uno::Sequence<beans::PropertyValue> aArgs;
+
+ // Insert slides
+ m_aDocumentSizeCondition.reset();
+ for (unsigned it = 1; it <= 10; it++)
+ comphelper::dispatchCommand(".uno:InsertPage", aArgs);
+
+ osl::Condition::Result aResult = m_aDocumentSizeCondition.wait(std::chrono::seconds(2));
+ CPPUNIT_ASSERT_EQUAL(osl::Condition::result_ok, aResult);
+
+ // Verify inserted slides
+ std::vector<OUString> aPageList(getCurrentParts(pXImpressDocument));
+ CPPUNIT_ASSERT_EQUAL(aPageList.size(), aInserted.size());
+
+ for (auto it1 = aPageList.begin(), it2 = aInserted.begin(); it1 != aPageList.end(); ++it1, ++it2)
+ {
+ CPPUNIT_ASSERT_EQUAL(*it1, *it2);
+ }
+
+ // Delete slides
+ m_aDocumentSizeCondition.reset();
+ for (unsigned it = 1; it <= 10; it++)
+ comphelper::dispatchCommand(".uno:DeletePage", aArgs);
+
+ aResult = m_aDocumentSizeCondition.wait(std::chrono::seconds(2));
+ CPPUNIT_ASSERT_EQUAL(osl::Condition::result_ok, aResult);
+
+ // Verify deleted slides
+ aPageList = getCurrentParts(pXImpressDocument);
+ CPPUNIT_ASSERT_EQUAL(aPageList.size(), aDeleted.size());
+ for (auto it1 = aPageList.begin(), it2 = aDeleted.begin(); it1 != aPageList.end(); ++it1, ++it2)
+ {
+ CPPUNIT_ASSERT_EQUAL(*it1, *it2);
+ }
+
+ // Undo deleted slides
+ m_aDocumentSizeCondition.reset();
+ for (unsigned it = 1; it <= 10; it++)
+ comphelper::dispatchCommand(".uno:Undo", aArgs);
+
+ aResult = m_aDocumentSizeCondition.wait(std::chrono::seconds(2));
+ CPPUNIT_ASSERT_EQUAL(osl::Condition::result_ok, aResult);
+
+ // Verify inserted slides
+ aPageList = getCurrentParts(pXImpressDocument);
+ CPPUNIT_ASSERT_EQUAL(aPageList.size(), aInserted.size());
+ for (auto it1 = aPageList.begin(), it2 = aInserted.begin(); it1 != aPageList.end(); ++it1, ++it2)
+ {
+ CPPUNIT_ASSERT_EQUAL(*it1, *it2);
+ }
+
+ // Redo deleted slides
+ m_aDocumentSizeCondition.reset();
+ for (unsigned it = 1; it <= 10; it++)
+ comphelper::dispatchCommand(".uno:Redo", aArgs);
+
+ aResult = m_aDocumentSizeCondition.wait(std::chrono::seconds(2));
+ CPPUNIT_ASSERT_EQUAL(osl::Condition::result_ok, aResult);
+
+ // Verify deleted slides
+ aPageList = getCurrentParts(pXImpressDocument);
+ CPPUNIT_ASSERT_EQUAL(aPageList.size(), aDeleted.size());
+ for (auto it1 = aPageList.begin(), it2 = aDeleted.begin(); it1 != aPageList.end(); ++it1, ++it2)
+ {
+ CPPUNIT_ASSERT_EQUAL(*it1, *it2);
+ }
+
+ // the document has 1 slide
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(1), pDoc->GetSdPageCount(PageKind::Standard));
+}
+
+void SdTiledRenderingTest::testInsertTable()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+
+ uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence(
+ {
+ { "Rows", uno::Any(sal_Int32(3)) },
+ { "Columns", uno::Any(sal_Int32(5)) }
+ }));
+
+ comphelper::dispatchCommand(".uno:InsertTable", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // get the table
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(1);
+ CPPUNIT_ASSERT(pObject);
+
+ // check that the table is not in the top left corner
+ Point aPos(pObject->GetRelativePos());
+
+ CPPUNIT_ASSERT(aPos.X() != 0);
+ CPPUNIT_ASSERT(aPos.Y() != 0);
+}
+
+void SdTiledRenderingTest::testDeleteTable()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+
+ uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence(
+ {
+ { "Rows", uno::Any(sal_Int32(3)) },
+ { "Columns", uno::Any(sal_Int32(5)) }
+ }));
+
+ comphelper::dispatchCommand(".uno:InsertTable", aArgs);
+ Scheduler::ProcessEventsToIdle();
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdrView* pSdrView = pViewShell->GetView();
+ const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList();
+ CPPUNIT_ASSERT(rMarkList.GetMarkCount());
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_MOD1 | awt::Key::A);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_MOD1 | awt::Key::A);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_DELETE);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_DELETE);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(!rMarkList.GetMarkCount());
+}
+
+void SdTiledRenderingTest::testPartHash()
+{
+ SdXImpressDocument* pDoc = createDoc("dummy.odp");
+
+ int nParts = pDoc->getParts();
+ for (int it = 0; it < nParts; it++)
+ {
+ CPPUNIT_ASSERT(!pDoc->getPartHash(it).isEmpty());
+ }
+
+ // check part that it does not exists
+ CPPUNIT_ASSERT(pDoc->getPartHash(100).isEmpty());
+}
+
+void SdTiledRenderingTest::testResizeTable()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("table.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ auto pTableObject = dynamic_cast<sdr::table::SdrTableObj*>(pObject);
+ CPPUNIT_ASSERT(pTableObject);
+
+ // Select the table by marking it + starting and ending text edit.
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pObject, pView->GetSdrPageView());
+ pView->SdrBeginTextEdit(pObject);
+ pView->SdrEndTextEdit();
+
+ // Remember the original row heights.
+ uno::Reference<table::XColumnRowRange> xTable = pTableObject->getTable();
+ uno::Reference<container::XIndexAccess> xRows = xTable->getRows();
+ uno::Reference<beans::XPropertySet> xRow1(xRows->getByIndex(0), uno::UNO_QUERY);
+ sal_Int32 nExpectedRow1 = xRow1->getPropertyValue("Size").get<sal_Int32>();
+ uno::Reference<beans::XPropertySet> xRow2(xRows->getByIndex(1), uno::UNO_QUERY);
+ sal_Int32 nExpectedRow2 = xRow2->getPropertyValue("Size").get<sal_Int32>();
+
+ // Resize the upper row, decrease its height by 1 cm.
+ Point aInnerRowEdge = pObject->GetSnapRect().Center();
+ pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_START, o3tl::toTwips(aInnerRowEdge.getX(), o3tl::Length::mm100), o3tl::toTwips(aInnerRowEdge.getY(), o3tl::Length::mm100));
+ pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_END, o3tl::toTwips(aInnerRowEdge.getX(), o3tl::Length::mm100), o3tl::toTwips(aInnerRowEdge.getY() - 1000, o3tl::Length::mm100));
+
+ // Remember the resized row heights.
+ sal_Int32 nResizedRow1 = xRow1->getPropertyValue("Size").get<sal_Int32>();
+ CPPUNIT_ASSERT(nResizedRow1 < nExpectedRow1);
+ sal_Int32 nResizedRow2 = xRow2->getPropertyValue("Size").get<sal_Int32>();
+ CPPUNIT_ASSERT_EQUAL(nExpectedRow2, nResizedRow2);
+
+ // Now undo the resize.
+ pXImpressDocument->GetDocShell()->GetUndoManager()->Undo();
+
+ // Check the undo result.
+ sal_Int32 nActualRow1 = xRow1->getPropertyValue("Size").get<sal_Int32>();
+ CPPUNIT_ASSERT_EQUAL(nExpectedRow1, nActualRow1);
+ sal_Int32 nActualRow2 = xRow2->getPropertyValue("Size").get<sal_Int32>();
+ // Expected was 4000, actual was 4572, i.e. the second row after undo was larger than expected.
+ CPPUNIT_ASSERT_EQUAL(nExpectedRow2, nActualRow2);
+}
+
+void SdTiledRenderingTest::testResizeTableColumn()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("table-column.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ auto pTableObject = dynamic_cast<sdr::table::SdrTableObj*>(pObject);
+ CPPUNIT_ASSERT(pTableObject);
+
+ // Select the table by marking it + starting and ending text edit.
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pObject, pView->GetSdrPageView());
+ pView->SdrBeginTextEdit(pObject);
+ pView->SdrEndTextEdit();
+
+ // Remember the original cell widths.
+ xmlDocUniquePtr pXmlDoc = parseXmlDump();
+ OString aPrefix = "/SdDrawDocument/SdrModel/maPages/SdPage/SdrPage/SdrObjList/SdrTableObj/SdrTableObjImpl/TableLayouter/columns/";
+ sal_Int32 nExpectedColumn1 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[1]", "size").toInt32();
+ sal_Int32 nExpectedColumn2 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[2]", "size").toInt32();
+ pXmlDoc = nullptr;
+
+ // Resize the left column, decrease its width by 1 cm.
+ Point aInnerRowEdge = pObject->GetSnapRect().Center();
+ pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_START, o3tl::toTwips(aInnerRowEdge.getX(), o3tl::Length::mm100), o3tl::toTwips(aInnerRowEdge.getY(), o3tl::Length::mm100));
+ pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_END, o3tl::toTwips(aInnerRowEdge.getX() - 1000, o3tl::Length::mm100), o3tl::toTwips(aInnerRowEdge.getY(), o3tl::Length::mm100));
+
+ // Remember the resized column widths.
+ pXmlDoc = parseXmlDump();
+ sal_Int32 nResizedColumn1 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[1]", "size").toInt32();
+ CPPUNIT_ASSERT(nResizedColumn1 < nExpectedColumn1);
+ sal_Int32 nResizedColumn2 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[2]", "size").toInt32();
+ CPPUNIT_ASSERT(nResizedColumn2 > nExpectedColumn2);
+ pXmlDoc = nullptr;
+
+ // Now undo the resize.
+ pXImpressDocument->GetDocShell()->GetUndoManager()->Undo();
+
+ // Check the undo result.
+ pXmlDoc = parseXmlDump();
+ sal_Int32 nActualColumn1 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[1]", "size").toInt32();
+ // Expected was 7049, actual was 6048, i.e. the first column width after undo was 1cm smaller than expected.
+ CPPUNIT_ASSERT_EQUAL(nExpectedColumn1, nActualColumn1);
+ sal_Int32 nActualColumn2 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[2]", "size").toInt32();
+ CPPUNIT_ASSERT_EQUAL(nExpectedColumn2, nActualColumn2);
+ pXmlDoc = nullptr;
+}
+
+namespace {
+
+/// A view callback tracks callbacks invoked on one specific view.
+class ViewCallback final
+{
+ SfxViewShell* mpViewShell;
+ int mnView;
+public:
+ bool m_bGraphicSelectionInvalidated;
+ bool m_bGraphicViewSelectionInvalidated;
+ /// Our current part, to be able to decide if a view cursor/selection is relevant for us.
+ int m_nPart;
+ bool m_bCursorVisibleChanged;
+ bool m_bCursorVisible;
+ bool m_bViewLock;
+ bool m_bTilesInvalidated;
+ std::vector<tools::Rectangle> m_aInvalidations;
+ std::map<int, bool> m_aViewCursorInvalidations;
+ std::map<int, bool> m_aViewCursorVisibilities;
+ bool m_bViewSelectionSet;
+ boost::property_tree::ptree m_aCommentCallbackResult;
+ OString m_ShapeSelection;
+ TestLokCallbackWrapper m_callbackWrapper;
+
+ ViewCallback()
+ : m_bGraphicSelectionInvalidated(false),
+ m_bGraphicViewSelectionInvalidated(false),
+ m_nPart(0),
+ m_bCursorVisibleChanged(false),
+ m_bCursorVisible(false),
+ m_bViewLock(false),
+ m_bTilesInvalidated(false),
+ m_bViewSelectionSet(false),
+ m_callbackWrapper(&callback, this)
+ {
+ mpViewShell = SfxViewShell::Current();
+ mpViewShell->setLibreOfficeKitViewCallback(&m_callbackWrapper);
+ mnView = SfxLokHelper::getView();
+ m_callbackWrapper.setLOKViewId( mnView );
+ }
+
+ ~ViewCallback()
+ {
+ SfxLokHelper::setView(mnView);
+ mpViewShell->setLibreOfficeKitViewCallback(nullptr);
+ }
+
+ static void callback(int nType, const char* pPayload, void* pData)
+ {
+ static_cast<ViewCallback*>(pData)->callbackImpl(nType, pPayload);
+ }
+
+ void callbackImpl(int nType, const char* pPayload)
+ {
+ switch (nType)
+ {
+ case LOK_CALLBACK_INVALIDATE_TILES:
+ {
+ m_bTilesInvalidated = true;
+ OString text(pPayload);
+ if (!text.startsWith("EMPTY"))
+ {
+ uno::Sequence<OUString> aSeq = comphelper::string::convertCommaSeparated(OUString::createFromAscii(pPayload));
+ CPPUNIT_ASSERT(aSeq.getLength() == 4 || aSeq.getLength() == 5);
+ tools::Rectangle aInvalidationRect;
+ aInvalidationRect.SetLeft(aSeq[0].toInt32());
+ aInvalidationRect.SetTop(aSeq[1].toInt32());
+ aInvalidationRect.setWidth(aSeq[2].toInt32());
+ aInvalidationRect.setHeight(aSeq[3].toInt32());
+ m_aInvalidations.push_back(aInvalidationRect);
+ }
+ }
+ break;
+ case LOK_CALLBACK_GRAPHIC_SELECTION:
+ {
+ m_bGraphicSelectionInvalidated = true;
+ m_ShapeSelection = OString(pPayload);
+ }
+ break;
+ case LOK_CALLBACK_GRAPHIC_VIEW_SELECTION:
+ {
+ std::stringstream aStream(pPayload);
+ boost::property_tree::ptree aTree;
+ boost::property_tree::read_json(aStream, aTree);
+ if (aTree.get_child("part").get_value<int>() == m_nPart)
+ // Ignore callbacks which are for a different part.
+ m_bGraphicViewSelectionInvalidated = true;
+ }
+ break;
+ case LOK_CALLBACK_CURSOR_VISIBLE:
+ {
+ m_bCursorVisibleChanged = true;
+ m_bCursorVisible = (std::string_view("true") == pPayload);
+ }
+ break;
+ case LOK_CALLBACK_VIEW_LOCK:
+ {
+ std::stringstream aStream(pPayload);
+ boost::property_tree::ptree aTree;
+ boost::property_tree::read_json(aStream, aTree);
+ m_bViewLock = aTree.get_child("rectangle").get_value<std::string>() != "EMPTY";
+ }
+ break;
+ case LOK_CALLBACK_INVALIDATE_VIEW_CURSOR:
+ {
+ std::stringstream aStream(pPayload);
+ boost::property_tree::ptree aTree;
+ boost::property_tree::read_json(aStream, aTree);
+ int nViewId = aTree.get_child("viewId").get_value<int>();
+ m_aViewCursorInvalidations[nViewId] = true;
+ }
+ break;
+ case LOK_CALLBACK_VIEW_CURSOR_VISIBLE:
+ {
+ std::stringstream aStream(pPayload);
+ boost::property_tree::ptree aTree;
+ boost::property_tree::read_json(aStream, aTree);
+ const int nViewId = aTree.get_child("viewId").get_value<int>();
+ m_aViewCursorVisibilities[nViewId] = std::string_view("true") == pPayload;
+ }
+ break;
+ case LOK_CALLBACK_TEXT_VIEW_SELECTION:
+ {
+ m_bViewSelectionSet = true;
+ }
+ break;
+ case LOK_CALLBACK_COMMENT:
+ {
+ m_aCommentCallbackResult.clear();
+ std::stringstream aStream(pPayload);
+ boost::property_tree::read_json(aStream, m_aCommentCallbackResult);
+ m_aCommentCallbackResult = m_aCommentCallbackResult.get_child("comment");
+ }
+ break;
+ }
+ }
+};
+
+}
+
+void SdTiledRenderingTest::testViewCursors()
+{
+ // Create two views.
+ SdXImpressDocument* pXImpressDocument = createDoc("shape.odp");
+ ViewCallback aView1;
+ SfxLokHelper::createView();
+ ViewCallback aView2;
+
+ // Select the shape in the second view.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pObject, pView->GetSdrPageView());
+ Scheduler::ProcessEventsToIdle();
+
+ // First view notices that there was a selection change in the other view.
+ CPPUNIT_ASSERT(aView1.m_bGraphicViewSelectionInvalidated);
+ // Second view notices that there was a selection change in its own view.
+ CPPUNIT_ASSERT(aView2.m_bGraphicSelectionInvalidated);
+}
+
+void SdTiledRenderingTest::testViewCursorParts()
+{
+ // Create two views.
+ SdXImpressDocument* pXImpressDocument = createDoc("shape.odp");
+ ViewCallback aView1;
+ SfxLokHelper::createView();
+ pXImpressDocument->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+ ViewCallback aView2;
+
+ // Select the shape in the second view.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pObject, pView->GetSdrPageView());
+ Scheduler::ProcessEventsToIdle();
+ // First view notices that there was a selection change in the other view.
+ CPPUNIT_ASSERT(aView1.m_bGraphicViewSelectionInvalidated);
+ pView->UnmarkAllObj(pView->GetSdrPageView());
+
+ // Now switch to the second part in the second view.
+ pXImpressDocument->setPart(1);
+ aView2.m_nPart = 1;
+ aView1.m_bGraphicViewSelectionInvalidated = false;
+ pActualPage = pViewShell->GetActualPage();
+ pObject = pActualPage->GetObj(0);
+ pView->MarkObj(pObject, pView->GetSdrPageView());
+ Scheduler::ProcessEventsToIdle();
+ // First view ignores view selection, as it would be for part 1, and it's in part 0.
+ // This failed when the "part" was always 0 in the callback.
+ CPPUNIT_ASSERT(!aView1.m_bGraphicViewSelectionInvalidated);
+}
+
+void SdTiledRenderingTest::testCursorViews()
+{
+ // Create the first view.
+ SdXImpressDocument* pXImpressDocument = createDoc("title-shape.odp");
+ int nView1 = SfxLokHelper::getView();
+ ViewCallback aView1;
+
+ // Begin text edit on the only object on the slide.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdrView* pView = pViewShell->GetView();
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(pView->IsTextEdit());
+
+ // Make sure that cursor state is not changed just because we create a second view.
+ aView1.m_bCursorVisibleChanged = false;
+ SfxLokHelper::createView();
+ pXImpressDocument->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(!aView1.m_bCursorVisibleChanged);
+
+ // Make sure that typing in the first view causes an invalidation in the
+ // second view as well, even if the second view was created after begin
+ // text edit in the first view.
+ ViewCallback aView2;
+ // This failed: the second view didn't get a lock notification, even if the
+ // first view already started text edit.
+ CPPUNIT_ASSERT(aView2.m_bViewLock);
+ SfxLokHelper::setView(nView1);
+ aView2.m_bTilesInvalidated = false;
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0);
+ Scheduler::ProcessEventsToIdle();
+ // This failed: the second view was not invalidated when pressing a key in
+ // the first view.
+ CPPUNIT_ASSERT(aView2.m_bTilesInvalidated);
+}
+
+void SdTiledRenderingTest::testCursorVisibility_SingleClick()
+{
+ // Single-clicking in a text box enters editing only
+ // when it's on the text, even if it's the default text.
+
+ // Load doc.
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ ViewCallback aView1;
+
+ // Begin text edit on the only object on the slide.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject1 = pActualPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject1 != nullptr);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject1->GetObjIdentifier());
+ SdrTextObj* pTextObject = static_cast<SdrTextObj*>(pObject1);
+
+ // Click once outside of the text (in the first quartile) => no editing.
+ const ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect();
+ const auto cornerX = o3tl::toTwips(aRect.Left() + (aRect.getWidth() / 4), o3tl::Length::mm100);
+ const auto cornerY = o3tl::toTwips(aRect.Top() + (aRect.getHeight() / 4), o3tl::Length::mm100);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ cornerX, cornerY,
+ 1, MOUSE_LEFT, 0);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP,
+ cornerX, cornerY,
+ 1, MOUSE_LEFT, 0);
+ Scheduler::ProcessEventsToIdle();
+
+ // No editing.
+ CPPUNIT_ASSERT(!pViewShell->GetView()->IsTextEdit());
+ CPPUNIT_ASSERT(!aView1.m_bCursorVisible);
+
+ // Click again, now on the text, in the center, to start editing.
+ const auto centerX = o3tl::toTwips(aRect.Left() + (aRect.getWidth() / 2), o3tl::Length::mm100);
+ const auto centerY = o3tl::toTwips(aRect.Top() + (aRect.getHeight() / 2), o3tl::Length::mm100);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ centerX, centerY,
+ 1, MOUSE_LEFT, 0);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP,
+ centerX, centerY,
+ 1, MOUSE_LEFT, 0);
+ Scheduler::ProcessEventsToIdle();
+
+ // We must be in text editing mode and have cursor visible.
+ CPPUNIT_ASSERT(pViewShell->GetView()->IsTextEdit());
+ CPPUNIT_ASSERT(aView1.m_bCursorVisible);
+}
+
+
+void SdTiledRenderingTest::testCursorVisibility_DoubleClick()
+{
+ // Double-clicking anywhere in the TextBox should start editing.
+
+ // Create the first view.
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ ViewCallback aView1;
+
+ // Begin text edit on the only object on the slide.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject1 = pActualPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject1 != nullptr);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject1->GetObjIdentifier());
+ SdrTextObj* pTextObject = static_cast<SdrTextObj*>(pObject1);
+
+ // Double-click outside the text to enter edit mode.
+ const ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect();
+ const auto cornerX = o3tl::toTwips(aRect.Left() + (aRect.getWidth() / 4), o3tl::Length::mm100);
+ const auto cornerY = o3tl::toTwips(aRect.Top() + (aRect.getHeight() / 4), o3tl::Length::mm100);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ cornerX, cornerY,
+ 2, MOUSE_LEFT, 0);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP,
+ cornerX, cornerY,
+ 2, MOUSE_LEFT, 0);
+ Scheduler::ProcessEventsToIdle();
+
+ // We must be in text editing mode and have cursor visible.
+ CPPUNIT_ASSERT(pViewShell->GetView()->IsTextEdit());
+ CPPUNIT_ASSERT(aView1.m_bCursorVisible);
+}
+
+void SdTiledRenderingTest::testCursorVisibility_MultiView()
+{
+ // Create the first view.
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ const int nView1 = SfxLokHelper::getView();
+ ViewCallback aView1;
+
+ // Begin text edit on the only object on the slide.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject1 = pActualPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject1);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject1->GetObjIdentifier());
+ SdrTextObj* pTextObject = static_cast<SdrTextObj*>(pObject1);
+
+ // Make sure that cursor state is not changed just because we create a second view.
+ SfxLokHelper::createView();
+ pXImpressDocument->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+ const int nView2 = SfxLokHelper::getView();
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT_EQUAL(false, aView1.m_bCursorVisibleChanged);
+ CPPUNIT_ASSERT_EQUAL(false, aView1.m_aViewCursorVisibilities[nView2]);
+
+ // Also check that the second view gets the notifications.
+ ViewCallback aView2;
+
+ SfxLokHelper::setView(nView1);
+
+ ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect();
+ const auto centerX = o3tl::toTwips(aRect.Left() + (aRect.getWidth() / 2), o3tl::Length::mm100);
+ const auto centerY = o3tl::toTwips(aRect.Top() + (aRect.getHeight() / 2), o3tl::Length::mm100);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ centerX, centerY,
+ 2, MOUSE_LEFT, 0);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP,
+ centerX, centerY,
+ 2, MOUSE_LEFT, 0);
+ Scheduler::ProcessEventsToIdle();
+
+ // We must be in text editing mode and have cursor visible.
+ CPPUNIT_ASSERT(pViewShell->GetView()->IsTextEdit());
+ CPPUNIT_ASSERT(aView1.m_bCursorVisible);
+ CPPUNIT_ASSERT_EQUAL(false, aView1.m_aViewCursorVisibilities[nView2]);
+
+ CPPUNIT_ASSERT_EQUAL(false, aView2.m_bCursorVisible);
+ CPPUNIT_ASSERT_EQUAL(false, aView2.m_aViewCursorVisibilities[nView1]);
+ CPPUNIT_ASSERT_EQUAL(false, aView2.m_aViewCursorVisibilities[nView2]);
+}
+
+void SdTiledRenderingTest::testCursorVisibility_Escape()
+{
+ // Load doc.
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ ViewCallback aView1;
+
+ // Begin text edit on the only object on the slide.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject1 = pActualPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject1 != nullptr);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject1->GetObjIdentifier());
+ SdrTextObj* pTextObject = static_cast<SdrTextObj*>(pObject1);
+
+ // Click once on the text to start editing.
+ const ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect();
+ const auto centerX = o3tl::toTwips(aRect.Left() + (aRect.getWidth() / 2), o3tl::Length::mm100);
+ const auto centerY = o3tl::toTwips(aRect.Top() + (aRect.getHeight() / 2), o3tl::Length::mm100);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ centerX, centerY,
+ 1, MOUSE_LEFT, 0);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP,
+ centerX, centerY,
+ 1, MOUSE_LEFT, 0);
+ Scheduler::ProcessEventsToIdle();
+
+ // We must be in text editing mode and have cursor visible.
+ CPPUNIT_ASSERT(pViewShell->GetView()->IsTextEdit());
+ CPPUNIT_ASSERT(aView1.m_bCursorVisible);
+
+ // End editing by pressing the escape key.
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE);
+ Scheduler::ProcessEventsToIdle();
+
+ // We must be in text editing mode and have cursor visible.
+ CPPUNIT_ASSERT(!pViewShell->GetView()->IsTextEdit());
+ CPPUNIT_ASSERT_EQUAL(false, aView1.m_bCursorVisible);
+}
+
+void SdTiledRenderingTest::testViewLock()
+{
+ // Load a document that has a shape and create two views.
+ SdXImpressDocument* pXImpressDocument = createDoc("shape.odp");
+ ViewCallback aView1;
+ SfxLokHelper::createView();
+ pXImpressDocument->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+
+ // Begin text edit in the second view and assert that the first gets a lock
+ // notification.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ SdrView* pView = pViewShell->GetView();
+ aView1.m_bViewLock = false;
+ pView->SdrBeginTextEdit(pObject);
+ CPPUNIT_ASSERT(aView1.m_bViewLock);
+
+ // End text edit in the second view, and assert that the lock is removed in
+ // the first view.
+ pView->SdrEndTextEdit();
+ CPPUNIT_ASSERT(!aView1.m_bViewLock);
+}
+
+void SdTiledRenderingTest::testUndoLimiting()
+{
+ // Create the first view.
+ SdXImpressDocument* pXImpressDocument = createDoc("title-shape.odp");
+ sd::ViewShell* pViewShell1 = pXImpressDocument->GetDocShell()->GetViewShell();
+ int nView1 = SfxLokHelper::getView();
+ SfxLokHelper::createView();
+ sd::ViewShell* pViewShell2 = pXImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell1 != pViewShell2);
+
+ // Begin text edit on the only object on the slide.
+ SfxLokHelper::setView(nView1);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(pViewShell1->GetView()->IsTextEdit());
+
+ // View2 UNDO stack should be empty
+ {
+ SfxRequest aReq2(SID_UNDO, SfxCallMode::SLOT, pXImpressDocument->GetDocShell()->GetDoc()->GetPool());
+ aReq2.AppendItem(SfxUInt16Item(SID_UNDO, 1));
+ pViewShell2->ExecuteSlot(aReq2);
+ const auto* pReturnValue = aReq2.GetReturnValue();
+ CPPUNIT_ASSERT(!pReturnValue);
+ }
+
+ // View1 can UNDO
+ {
+ SfxRequest aReq1(SID_UNDO, SfxCallMode::SLOT, pXImpressDocument->GetDocShell()->GetDoc()->GetPool());
+ aReq1.AppendItem(SfxUInt16Item(SID_UNDO, 1));
+ pViewShell1->ExecuteSlot(aReq1);
+ CPPUNIT_ASSERT(aReq1.IsDone());
+ }
+
+ // View1 can REDO
+ {
+ SfxRequest aReq1(SID_REDO, SfxCallMode::SLOT, pXImpressDocument->GetDocShell()->GetDoc()->GetPool());
+ aReq1.AppendItem(SfxUInt16Item(SID_REDO, 1));
+ pViewShell1->ExecuteSlot(aReq1);
+ CPPUNIT_ASSERT(aReq1.IsDone());
+ }
+
+ // Exit text edit mode
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT(!pViewShell1->GetView()->IsTextEdit());
+
+ // Now check view2 cannot undo actions.
+ {
+ SfxRequest aReq2(SID_UNDO, SfxCallMode::SLOT, pXImpressDocument->GetDocShell()->GetDoc()->GetPool());
+ aReq2.AppendItem(SfxUInt16Item(SID_UNDO, 1));
+ pViewShell2->ExecuteSlot(aReq2);
+ const SfxUInt32Item* pUInt32Item = dynamic_cast<const SfxUInt32Item*>(aReq2.GetReturnValue());
+ CPPUNIT_ASSERT(pUInt32Item);
+ CPPUNIT_ASSERT_EQUAL(static_cast< sal_uInt32 >(SID_REPAIRPACKAGE), pUInt32Item->GetValue());
+ }
+
+ // Now check view1 can undo action
+ {
+ SfxRequest aReq1(SID_UNDO, SfxCallMode::SLOT, pXImpressDocument->GetDocShell()->GetDoc()->GetPool());
+ aReq1.AppendItem(SfxUInt16Item(SID_UNDO, 1));
+ pViewShell1->ExecuteSlot(aReq1);
+ CPPUNIT_ASSERT(aReq1.IsDone());
+ }
+
+ mxComponent->dispose();
+ mxComponent.clear();
+}
+
+void SdTiledRenderingTest::testCreateViewGraphicSelection()
+{
+ // Load a document and register a callback.
+ SdXImpressDocument* pXImpressDocument = createDoc("shape.odp");
+ ViewCallback aView1;
+
+ // Select the only shape in the document and assert that the graphic selection is changed.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ SdrView* pView = pViewShell->GetView();
+ aView1.m_bGraphicSelectionInvalidated = false;
+ pView->MarkObj(pObject, pView->GetSdrPageView());
+ CPPUNIT_ASSERT(aView1.m_bGraphicSelectionInvalidated);
+
+ // Now create a new view.
+ aView1.m_bGraphicSelectionInvalidated = false;
+ SfxLokHelper::createView();
+ pXImpressDocument->initializeForTiledRendering({});
+ // This failed, creating a new view affected the graphic selection of an
+ // existing view.
+ CPPUNIT_ASSERT(!aView1.m_bGraphicSelectionInvalidated);
+
+ // Check that when the first view has a shape selected and we register a
+ // callback on the second view, then it gets a "graphic view selection".
+ ViewCallback aView2;
+ // This failed, the created new view had no "view selection" of the first
+ // view's selected shape.
+ CPPUNIT_ASSERT(aView2.m_bGraphicViewSelectionInvalidated);
+}
+
+void SdTiledRenderingTest::testCreateViewTextCursor()
+{
+ // Load a document and register a callback.
+ SdXImpressDocument* pXImpressDocument = createDoc("title-shape.odp");
+ ViewCallback aView1;
+
+ // Begin text edit.
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0);
+ Scheduler::ProcessEventsToIdle();
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdrView* pSdrView = pViewShell->GetView();
+ CPPUNIT_ASSERT(pSdrView->IsTextEdit());
+
+ // Create an editeng text selection.
+ EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView();
+ // 0th para, 0th char -> 0th para, 1st char.
+ ESelection aWordSelection(0, 0, 0, 1);
+ rEditView.SetSelection(aWordSelection);
+
+ // Make sure that creating a new view either doesn't affect the previous
+ // one, or at least the effect is not visible at the end.
+ aView1.m_aViewCursorInvalidations.clear();
+ aView1.m_aViewCursorVisibilities.clear();
+ SfxLokHelper::createView();
+ pXImpressDocument->initializeForTiledRendering({});
+ ViewCallback aView2;
+ bool bFoundCursor = false;
+ for (const auto& rInvalidation : aView1.m_aViewCursorInvalidations)
+ {
+ auto itVisibility = aView1.m_aViewCursorVisibilities.find(rInvalidation.first);
+ // For each cursor invalidation: if there is no visibility or the visibility is true, that's a problem.
+ if (itVisibility == aView1.m_aViewCursorVisibilities.end() || itVisibility->second)
+ {
+ bFoundCursor = true;
+ break;
+ }
+ }
+ // This failed: the second view created an unexpected view cursor in the
+ // first view.
+ CPPUNIT_ASSERT(!bFoundCursor);
+ // This failed: the text view selection of the first view wasn't seen by
+ // the second view.
+ CPPUNIT_ASSERT(aView2.m_bViewSelectionSet);
+}
+
+void SdTiledRenderingTest::testTdf102223()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("tdf102223.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ auto pTableObject = dynamic_cast<sdr::table::SdrTableObj*>(pActualPage->GetObj(2));
+ CPPUNIT_ASSERT(pTableObject);
+ SdrView* pView = pViewShell->GetView();
+
+ // select contents of cell
+ ::tools::Rectangle aRect = pTableObject->GetCurrentBoundRect();
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100),
+ 1, MOUSE_LEFT, 0);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP,
+ o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100),
+ 1, MOUSE_LEFT, 0);
+ Scheduler::ProcessEventsToIdle();
+ pView->SdrBeginTextEdit(pTableObject);
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+ EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView();
+ rEditView.SetSelection(ESelection(0, 0, 0, 3)); // start para, start char, end para, end char.
+ CPPUNIT_ASSERT_EQUAL(OUString("Red"), rEditView.GetSelected());
+ const SvxFontHeightItem& rItem = rEditView.GetAttribs().Get(EE_CHAR_FONTHEIGHT);
+ CPPUNIT_ASSERT_EQUAL(int(1411), static_cast<int>(rItem.GetHeight()));
+
+ // cut contents of cell
+ uno::Sequence<beans::PropertyValue> aArgs;
+ comphelper::dispatchCommand(".uno:Cut", aArgs);
+
+ pView->SdrEndTextEdit(false);
+ pView->SdrBeginTextEdit(pTableObject);
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+ EditView& rEditView2 = pView->GetTextEditOutlinerView()->GetEditView();
+ rEditView2.SetSelection(ESelection(0, 0, 0, 1)); // start para, start char, end para, end char.
+ const SvxFontHeightItem& rItem2 = rEditView2.GetAttribs().Get(EE_CHAR_FONTHEIGHT);
+ CPPUNIT_ASSERT_EQUAL(int(1411), static_cast<int>(rItem2.GetHeight()));
+}
+
+void SdTiledRenderingTest::testTdf118354()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("tdf118354.odp");
+
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), pActualPage->GetObjCount());
+
+ auto pTableObject = dynamic_cast<sdr::table::SdrTableObj*>(pActualPage->GetObj(0));
+ CPPUNIT_ASSERT(pTableObject);
+
+ // Without the fix, it would crash here
+ ::tools::Rectangle aRect = pTableObject->GetCurrentBoundRect();
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100),
+ 1, MOUSE_LEFT, 0);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP,
+ o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100),
+ 1, MOUSE_LEFT, 0);
+ Scheduler::ProcessEventsToIdle();
+
+ SdrView* pView = pViewShell->GetView();
+ auto pMarkedObj = dynamic_cast<sdr::table::SdrTableObj*>(pView->GetMarkedObjectByIndex(0));
+ CPPUNIT_ASSERT_EQUAL(pMarkedObj, pTableObject);
+}
+
+void SdTiledRenderingTest::testPostKeyEventInvalidation()
+{
+ // Load a document and begin text edit on the first slide.
+ SdXImpressDocument* pXImpressDocument = createDoc("2slides.odp");
+ CPPUNIT_ASSERT_EQUAL(0, pXImpressDocument->getPart());
+ ViewCallback aView1;
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdrView* pView = pViewShell->GetView();
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_F2);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_F2);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+
+ // Create a second view and begin text edit there as well, in parallel.
+ SfxLokHelper::createView();
+ pXImpressDocument->initializeForTiledRendering({});
+ ViewCallback aView2;
+ pXImpressDocument->setPart(1);
+ sd::ViewShell* pViewShell2 = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdrView* pView2 = pViewShell2->GetView();
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_F2);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_F2);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(pView2->GetTextEditObject());
+
+ // Now go left with the cursor in the second view and watch for
+ // invalidations.
+ aView2.m_bTilesInvalidated = false;
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT);
+ Scheduler::ProcessEventsToIdle();
+ // This failed: moving the cursor caused unexpected invalidation.
+ CPPUNIT_ASSERT(!aView2.m_bTilesInvalidated);
+}
+
+/**
+ * tests a cut/paste bug around bullet items in a list
+ */
+void SdTiledRenderingTest::testTdf103083()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("tdf103083.fodp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+
+ SdrObject* pObject1 = pActualPage->GetObj(1);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::OutlineText, pObject1->GetObjIdentifier());
+ SdrTextObj* pTextObject = static_cast<SdrTextObj*>(pObject1);
+
+ SdrView* pView = pViewShell->GetView();
+
+ // select contents of bullet item
+ ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect();
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100),
+ 1, MOUSE_LEFT, 0);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP,
+ o3tl::toTwips(aRect.Left() + 2, o3tl::Length::mm100), o3tl::toTwips(aRect.Top() + 2, o3tl::Length::mm100),
+ 1, MOUSE_LEFT, 0);
+ Scheduler::ProcessEventsToIdle();
+ pView->SdrBeginTextEdit(pTextObject);
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+ EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView();
+ rEditView.SetSelection(ESelection(2, 0, 2, 33)); // start para, start char, end para, end char.
+ CPPUNIT_ASSERT_EQUAL(OUString("They have all the same formatting"), rEditView.GetSelected());
+ SdrOutliner* pOutliner = pView->GetTextEditOutliner();
+ CPPUNIT_ASSERT_EQUAL(OUString("No-Logo Content~LT~Gliederung 2"),
+ pOutliner->GetStyleSheet(2)->GetName());
+ const EditTextObject& aEdit = pTextObject->GetOutlinerParaObject()->GetTextObject();
+ const SvxNumBulletItem* pNumFmt = aEdit.GetParaAttribs(2).GetItem(EE_PARA_NUMBULLET);
+ SvxNumberFormat aNumFmt(pNumFmt->GetNumRule().GetLevel(2));
+
+ // cut contents of bullet item
+ comphelper::dispatchCommand(".uno:Cut", uno::Sequence<beans::PropertyValue>());
+
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+ EditView& rEditView2 = pView->GetTextEditOutlinerView()->GetEditView();
+ rEditView2.SetSelection(ESelection(2, 0, 2, 10)); // start para, start char, end para, end char.
+ CPPUNIT_ASSERT_EQUAL(OUString(), rEditView2.GetSelected());
+
+ // paste contents of bullet item
+ comphelper::dispatchCommand(".uno:Paste", uno::Sequence<beans::PropertyValue>());
+
+ // send an ESC key to trigger the commit of the edit to the main model
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE);
+ Scheduler::ProcessEventsToIdle();
+
+ pView->SdrBeginTextEdit(pTextObject);
+ CPPUNIT_ASSERT(pView->GetTextEditObject());
+ pOutliner = pView->GetTextEditOutliner();
+ EditView& rEditView3 = pView->GetTextEditOutlinerView()->GetEditView();
+ rEditView3.SetSelection(ESelection(2, 0, 2, 33)); // start para, start char, end para, end char.
+ CPPUNIT_ASSERT_EQUAL(OUString("They have all the same formatting"), rEditView3.GetSelected());
+ CPPUNIT_ASSERT_EQUAL(OUString("No-Logo Content~LT~Gliederung 2"),
+ pOutliner->GetStyleSheet(2)->GetName());
+
+ const EditTextObject& aEdit2 = pTextObject->GetOutlinerParaObject()->GetTextObject();
+ const SvxNumBulletItem* pNumFmt2 = aEdit2.GetParaAttribs(2).GetItem(EE_PARA_NUMBULLET);
+ SvxNumberFormat aNumFmt2(pNumFmt2->GetNumRule().GetLevel(2));
+
+ bool bEqual(aNumFmt2 == aNumFmt);
+ CPPUNIT_ASSERT_MESSAGE("Bullet properties changed after paste", bEqual);
+}
+
+/**
+ * tests a clone-formatting bug around table cell attributes
+ */
+void SdTiledRenderingTest::testTdf104405()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("tdf104405.fodp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(2);
+ auto pTableObject = dynamic_cast<sdr::table::SdrTableObj*>(pObject);
+ CPPUNIT_ASSERT(pTableObject);
+
+ // select the middle cell
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pTableObject, pView->GetSdrPageView());
+ pTableObject->setActiveCell(sdr::table::CellPos(2,1));
+ pView->SdrBeginTextEdit(pTableObject);
+ EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView();
+ rEditView.SetSelection(ESelection(0, 0, 0, 3)); // start para, start char, end para, end char.
+
+ // trigger the clone-formatting/paintbrush command to copy formatting contents of cell
+ uno::Sequence aArgs{ comphelper::makePropertyValue("PersistentCopy", true) };
+ comphelper::dispatchCommand(".uno:FormatPaintbrush", aArgs);
+
+ Scheduler::ProcessEventsToIdle();
+
+ // now click on the table
+ pView->MarkObj(pTableObject, pView->GetSdrPageView());
+ pTableObject->setActiveCell(sdr::table::CellPos(0,0));
+ pView->SdrEndTextEdit(false);
+ pView->SdrBeginTextEdit(pTableObject);
+ EditView& rEditView2 = pView->GetTextEditOutlinerView()->GetEditView();
+ rEditView2.SetSelection(ESelection(0, 0, 0, 3)); // start para, start char, end para, end char.
+ ::tools::Rectangle aRect = pTableObject->GetCurrentBoundRect();
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ o3tl::toTwips(aRect.Left(), o3tl::Length::mm100), o3tl::toTwips(aRect.Top(), o3tl::Length::mm100),
+ 1, MOUSE_LEFT, 0);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP,
+ o3tl::toTwips(aRect.Left(), o3tl::Length::mm100), o3tl::toTwips(aRect.Top(), o3tl::Length::mm100),
+ 1, MOUSE_LEFT, 0);
+
+ Scheduler::ProcessEventsToIdle();
+
+ // check that the first cell has acquired the resulting vertical style
+ xmlDocUniquePtr pXmlDoc = parseXmlDump();
+ // the following name has a compiler-dependent part
+ CPPUNIT_ASSERT_EQUAL(
+ OUString("2"),
+ getXPath(
+ pXmlDoc,
+ "/SdDrawDocument/SdrModel/maPages/SdPage/SdrPage/SdrObjList/SdrTableObj/SdrTableObjImpl"
+ "/TableModel/Cell[1]/DefaultProperties/SfxItemSet/SdrTextVertAdjustItem",
+ "value"));
+}
+
+void SdTiledRenderingTest::testTdf81754()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("tdf81754.pptx");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(1);
+
+ SdrTextObj* pTextObj = static_cast<SdrTextObj*>(pObject);
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pTextObj, pView->GetSdrPageView());
+ SfxStringItem aInputString(SID_ATTR_CHAR, "x");
+ pViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR,
+ SfxCallMode::SYNCHRON, { &aInputString });
+
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'x', 0);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'x', 0);
+ Scheduler::ProcessEventsToIdle();
+
+ // now save, reload, and assert that we did not lose the edit
+ ::sd::DrawDocShellRef xDocShRef = saveAndReload(pXImpressDocument->GetDocShell(), PPTX);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ SdrTextObj* pTextObject = dynamic_cast<SdrTextObj*>(pPage->GetObj(1));
+ CPPUNIT_ASSERT(pTextObject);
+
+ OutlinerParaObject* pOutlinerParagraphObject = pTextObject->GetOutlinerParaObject();
+ const EditTextObject& aEdit = pOutlinerParagraphObject->GetTextObject();
+
+ CPPUNIT_ASSERT_EQUAL(OUString("Somethingxx"), aEdit.GetText(0));
+
+ xDocShRef->DoClose();
+}
+
+void SdTiledRenderingTest::testTdf105502()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("tdf105502.odp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ sd::Window* pWindow = pViewShell->GetActiveWindow();
+ CPPUNIT_ASSERT(pWindow);
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ auto pTableObject = dynamic_cast<sdr::table::SdrTableObj*>(pObject);
+ CPPUNIT_ASSERT(pTableObject);
+
+ // Select the first row.
+ sd::View* pView = pViewShell->GetView();
+ pView->MarkObj(pObject, pView->GetSdrPageView());
+ pView->SdrBeginTextEdit(pObject);
+ rtl::Reference<sdr::SelectionController> xSelectionController(pView->getSelectionController());
+ CPPUNIT_ASSERT(xSelectionController.is());
+ SfxRequest aRequest(pViewShell->GetViewFrame(), SID_TABLE_SELECT_ROW);
+ xSelectionController->Execute(aRequest);
+
+ // Assert that the A1:B1 selection succeeded.
+ CPPUNIT_ASSERT(xSelectionController->hasSelectedCells());
+ sdr::table::CellPos aFirstCell;
+ sdr::table::CellPos aLastCell;
+ xSelectionController->getSelectedCells(aFirstCell, aLastCell);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aFirstCell.mnCol);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aFirstCell.mnRow);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aLastCell.mnCol);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aLastCell.mnRow);
+
+ // Grow font size for the selection.
+ comphelper::dispatchCommand(".uno:Grow", {});
+ Scheduler::ProcessEventsToIdle();
+
+ // Assert that the selected A1 has now a larger font than the unselected
+ // A2.
+ xmlDocUniquePtr pXmlDoc = parseXmlDump();
+ sal_Int32 nA1Height = getXPath(pXmlDoc, "//Cell[1]/SdrText/OutlinerParaObject/EditTextObject/ContentInfo/SfxItemSet/SvxFontHeightItem[1]", "height").toInt32();
+ sal_Int32 nA2Height = getXPath(pXmlDoc, "//Cell[3]/SdrText/OutlinerParaObject/EditTextObject/ContentInfo/attribs[1]/SvxFontHeightItem", "height").toInt32();
+ // This failed when FuText::ChangeFontSize() never did "continue" in the
+ // text loop, instead of doing so depending on what IsInSelection() returns.
+ CPPUNIT_ASSERT(nA1Height > nA2Height);
+
+ // Check that selection remains the same
+ CPPUNIT_ASSERT(xSelectionController->hasSelectedCells());
+ xSelectionController->getSelectedCells(aFirstCell, aLastCell);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aFirstCell.mnCol);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aFirstCell.mnRow);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aLastCell.mnCol);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aLastCell.mnRow);
+}
+
+void SdTiledRenderingTest::testCommentCallbacks()
+{
+ // Load the document.
+ // Set the tiled annotations off
+ comphelper::LibreOfficeKit::setTiledAnnotations(false);
+
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp", comphelper::InitPropertySequence(
+ {
+ {".uno:Author", uno::Any(OUString("LOK User1"))},
+ }));
+ ViewCallback aView1;
+ int nView1 = SfxLokHelper::getView();
+
+ SfxLokHelper::createView();
+ uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence(
+ {
+ {".uno:Author", uno::Any(OUString("LOK User2"))},
+ }));
+ pXImpressDocument->initializeForTiledRendering(aArgs);
+ ViewCallback aView2;
+ int nView2 = SfxLokHelper::getView();
+
+ SfxLokHelper::setView(nView1);
+
+ // Add a new comment
+ aArgs = comphelper::InitPropertySequence(
+ {
+ {"Text", uno::Any(OUString("Comment"))},
+ });
+ comphelper::dispatchCommand(".uno:InsertAnnotation", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // We received a LOK_CALLBACK_COMMENT callback with comment 'Add' action
+ CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+ CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
+ int nComment1 = aView1.m_aCommentCallbackResult.get<int>("id");
+ CPPUNIT_ASSERT_EQUAL(nComment1, aView2.m_aCommentCallbackResult.get<int>("id"));
+ css::util::DateTime aDateTime;
+ OUString aDateTimeString = OUString::createFromAscii(aView1.m_aCommentCallbackResult.get<std::string>("dateTime").c_str());
+ CPPUNIT_ASSERT(utl::ISO8601parseDateTime(aDateTimeString, aDateTime));
+ CPPUNIT_ASSERT_EQUAL(std::string("LOK User1"), aView1.m_aCommentCallbackResult.get<std::string>("author"));
+ CPPUNIT_ASSERT_EQUAL(std::string("LOK User1"), aView2.m_aCommentCallbackResult.get<std::string>("author"));
+ CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
+ CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView2.m_aCommentCallbackResult.get<std::string>("text"));
+ CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get<std::string>("parthash").empty());
+ CPPUNIT_ASSERT(!aView2.m_aCommentCallbackResult.get<std::string>("parthash").empty());
+
+ // Reply to a just added comment
+ SfxLokHelper::setView(nView2);
+ aArgs = comphelper::InitPropertySequence(
+ {
+ {"Id", uno::Any(OUString::number(nComment1))},
+ {"Text", uno::Any(OUString("Reply to comment"))},
+ });
+ comphelper::dispatchCommand(".uno:ReplyToAnnotation", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // We received a LOK_CALLBACK_COMMENT callback with comment 'Modify' action
+ CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+ CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
+ CPPUNIT_ASSERT_EQUAL(nComment1, aView1.m_aCommentCallbackResult.get<int>("id"));
+ CPPUNIT_ASSERT_EQUAL(nComment1, aView2.m_aCommentCallbackResult.get<int>("id"));
+ CPPUNIT_ASSERT_EQUAL(std::string("LOK User2"), aView1.m_aCommentCallbackResult.get<std::string>("author"));
+ CPPUNIT_ASSERT_EQUAL(std::string("LOK User2"), aView2.m_aCommentCallbackResult.get<std::string>("author"));
+ OUString aReplyTextView1 = OUString::createFromAscii(aView1.m_aCommentCallbackResult.get<std::string>("text").c_str());
+ OUString aReplyTextView2 = OUString::createFromAscii(aView2.m_aCommentCallbackResult.get<std::string>("text").c_str());
+ CPPUNIT_ASSERT(aReplyTextView1.startsWith("Reply to LOK User1"));
+ CPPUNIT_ASSERT(aReplyTextView1.endsWith("Reply to comment"));
+ CPPUNIT_ASSERT(aReplyTextView2.startsWith("Reply to LOK User1"));
+ CPPUNIT_ASSERT(aReplyTextView2.endsWith("Reply to comment"));
+ CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get<std::string>("parthash").empty());
+ CPPUNIT_ASSERT(!aView2.m_aCommentCallbackResult.get<std::string>("parthash").empty());
+
+ // Edit this annotation now
+ aArgs = comphelper::InitPropertySequence(
+ {
+ {"Id", uno::Any(OUString::number(nComment1))},
+ {"Text", uno::Any(OUString("Edited comment"))},
+ });
+ comphelper::dispatchCommand(".uno:EditAnnotation", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // We received a LOK_CALLBACK_COMMENT callback with comment 'Modify' action
+ CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+ CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
+ CPPUNIT_ASSERT_EQUAL(nComment1, aView1.m_aCommentCallbackResult.get<int>("id"));
+ CPPUNIT_ASSERT_EQUAL(nComment1, aView2.m_aCommentCallbackResult.get<int>("id"));
+ CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get<std::string>("parthash").empty());
+ CPPUNIT_ASSERT(!aView2.m_aCommentCallbackResult.get<std::string>("parthash").empty());
+ CPPUNIT_ASSERT_EQUAL(std::string("Edited comment"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
+ CPPUNIT_ASSERT_EQUAL(std::string("Edited comment"), aView2.m_aCommentCallbackResult.get<std::string>("text"));
+
+ // Delete the comment
+ aArgs = comphelper::InitPropertySequence(
+ {
+ {"Id", uno::Any(OUString::number(nComment1))},
+ });
+ comphelper::dispatchCommand(".uno:DeleteAnnotation", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // We received a LOK_CALLBACK_COMMENT callback with comment 'Remove' action
+ CPPUNIT_ASSERT_EQUAL(std::string("Remove"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+ CPPUNIT_ASSERT_EQUAL(std::string("Remove"), aView2.m_aCommentCallbackResult.get<std::string>("action"));
+ CPPUNIT_ASSERT_EQUAL(nComment1, aView1.m_aCommentCallbackResult.get<int>("id"));
+ CPPUNIT_ASSERT_EQUAL(nComment1, aView2.m_aCommentCallbackResult.get<int>("id"));
+
+ comphelper::LibreOfficeKit::setTiledAnnotations(true);
+}
+
+void SdTiledRenderingTest::testCommentChangeImpress()
+{
+ uno::Sequence<beans::PropertyValue> aArgs;
+
+ // Load the document.
+ // Set the tiled annotations off
+ comphelper::LibreOfficeKit::setTiledAnnotations(false);
+
+ createDoc("dummy.odp", comphelper::InitPropertySequence(
+ {
+ {".uno:Author", uno::Any(OUString("LOK User1"))},
+ }));
+
+ ViewCallback aView1;
+
+ // Add a new comment
+ aArgs = comphelper::InitPropertySequence(
+ {
+ {"Text", uno::Any(OUString("Comment"))},
+ });
+ comphelper::dispatchCommand(".uno:InsertAnnotation", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+
+ int nComment1 = aView1.m_aCommentCallbackResult.get<int>("id");
+
+ CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get<std::string>("parthash").empty());
+ CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
+ CPPUNIT_ASSERT_EQUAL(std::string("0, 0, 0, 0"), aView1.m_aCommentCallbackResult.get<std::string>("rectangle"));
+
+ // Edit this annotation now
+ aArgs = comphelper::InitPropertySequence(
+ {
+ {"Id", uno::Any(OUString::number(nComment1))},
+ {"PositionX", uno::Any(sal_Int32(10))},
+ {"PositionY", uno::Any(sal_Int32(20))}
+ });
+ comphelper::dispatchCommand(".uno:EditAnnotation", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+ CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
+ CPPUNIT_ASSERT_EQUAL(std::string("10, 20, 0, 0"), aView1.m_aCommentCallbackResult.get<std::string>("rectangle"));
+
+ comphelper::LibreOfficeKit::setTiledAnnotations(true);
+}
+
+void SdTiledRenderingTest::testCommentChangeDraw()
+{
+ uno::Sequence<beans::PropertyValue> aArgs;
+
+ // Load the document.
+ // Set the tiled annotations off
+ comphelper::LibreOfficeKit::setTiledAnnotations(false);
+
+ createDoc("dummy.odg", comphelper::InitPropertySequence(
+ {
+ {".uno:Author", uno::Any(OUString("LOK User1"))},
+ }));
+
+ ViewCallback aView1;
+
+ // Add a new comment
+ aArgs = comphelper::InitPropertySequence(
+ {
+ {"Text", uno::Any(OUString("Comment"))},
+ });
+ comphelper::dispatchCommand(".uno:InsertAnnotation", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(std::string("Add"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+
+ int nComment1 = aView1.m_aCommentCallbackResult.get<int>("id");
+
+ CPPUNIT_ASSERT(!aView1.m_aCommentCallbackResult.get<std::string>("parthash").empty());
+ CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
+ CPPUNIT_ASSERT_EQUAL(std::string("0, 0, 0, 0"), aView1.m_aCommentCallbackResult.get<std::string>("rectangle"));
+
+ // Edit this annotation now
+ aArgs = comphelper::InitPropertySequence(
+ {
+ {"Id", uno::Any(OUString::number(nComment1))},
+ {"PositionX", uno::Any(sal_Int32(10))},
+ {"PositionY", uno::Any(sal_Int32(20))}
+ });
+ comphelper::dispatchCommand(".uno:EditAnnotation", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(std::string("Modify"), aView1.m_aCommentCallbackResult.get<std::string>("action"));
+ CPPUNIT_ASSERT_EQUAL(std::string("Comment"), aView1.m_aCommentCallbackResult.get<std::string>("text"));
+ CPPUNIT_ASSERT_EQUAL(std::string("10, 20, 0, 0"), aView1.m_aCommentCallbackResult.get<std::string>("rectangle"));
+
+ comphelper::LibreOfficeKit::setTiledAnnotations(true);
+}
+
+void SdTiledRenderingTest::testMultiViewInsertDeletePage()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ ViewCallback aView1;
+ int nView1 = SfxLokHelper::getView();
+ uno::Sequence<beans::PropertyValue> aArgs;
+ SdDrawDocument* pDoc = pXImpressDocument->GetDocShell()->GetDoc();
+
+ // Create second view
+ SfxLokHelper::createView();
+ pXImpressDocument->initializeForTiledRendering(aArgs);
+ ViewCallback aView2;
+ int nView2 = SfxLokHelper::getView();
+
+ // the document has 8 slides
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(8), pDoc->GetSdPageCount(PageKind::Standard));
+
+ // Switch to 5th page in 2nd view
+ pXImpressDocument->setPart(4);
+
+ // Insert slide in 1st view
+ SfxLokHelper::setView(nView1);
+ comphelper::dispatchCommand(".uno:InsertPage", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // See if the current slide number changed in 2nd view too
+ SfxLokHelper::setView(nView2);
+ CPPUNIT_ASSERT_EQUAL(5, pXImpressDocument->getPart());
+
+ // Delete the page in 1st view now
+ SfxLokHelper::setView(nView1);
+ comphelper::dispatchCommand(".uno:DeletePage", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // See if current slide number changed in 2nd view too
+ SfxLokHelper::setView(nView2);
+ CPPUNIT_ASSERT_EQUAL(4, pXImpressDocument->getPart());
+}
+
+void SdTiledRenderingTest::testMultiViewInsertDeletePage2()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ ViewCallback aView1;
+ int nView1 = SfxLokHelper::getView();
+ uno::Sequence<beans::PropertyValue> aArgs;
+ SdDrawDocument* pDoc = pXImpressDocument->GetDocShell()->GetDoc();
+
+ // Create second view
+ SfxLokHelper::createView();
+ pXImpressDocument->initializeForTiledRendering(aArgs);
+ ViewCallback aView2;
+ int nView2 = SfxLokHelper::getView();
+
+ // the document has 8 slides
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(8), pDoc->GetSdPageCount(PageKind::Standard));
+
+ // Switch to 5th page in 2nd view
+ pXImpressDocument->setPart(4);
+
+ // Begin text edit on the only object on the slide.
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject1 = pActualPage->GetObj(0);
+ CPPUNIT_ASSERT(pObject1 != nullptr);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::TitleText, pObject1->GetObjIdentifier());
+ SdrTextObj* pTextObject = static_cast<SdrTextObj*>(pObject1);
+
+ // Double-click outside the text to enter edit mode.
+ const ::tools::Rectangle aRect = pTextObject->GetCurrentBoundRect();
+ const auto cornerX = o3tl::toTwips(aRect.Left() + (aRect.getWidth() / 4), o3tl::Length::mm100);
+ const auto cornerY = o3tl::toTwips(aRect.Top() + (aRect.getHeight() / 4), o3tl::Length::mm100);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN,
+ cornerX, cornerY,
+ 2, MOUSE_LEFT, 0);
+ pXImpressDocument->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP,
+ cornerX, cornerY,
+ 2, MOUSE_LEFT, 0);
+ Scheduler::ProcessEventsToIdle();
+
+ // We must be in text editing mode and have cursor visible.
+ CPPUNIT_ASSERT(pViewShell->GetView()->IsTextEdit());
+
+ // Insert slide in 1st view
+ SfxLokHelper::setView(nView1);
+ comphelper::dispatchCommand(".uno:InsertPage", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // See if the current slide number changed in 2nd view too
+ SfxLokHelper::setView(nView2);
+ CPPUNIT_ASSERT_EQUAL(5, pXImpressDocument->getPart());
+
+ // Delete the page in 1st view now
+ SfxLokHelper::setView(nView1);
+ comphelper::dispatchCommand(".uno:DeletePage", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // See if current slide number changed in 2nd view too
+ SfxLokHelper::setView(nView2);
+ CPPUNIT_ASSERT_EQUAL(4, pXImpressDocument->getPart());
+
+ // We must be still in text editing mode and have cursor visible.
+ CPPUNIT_ASSERT(pViewShell->GetView()->IsTextEdit());
+}
+
+void SdTiledRenderingTest::testDisableUndoRepair()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+
+ // Create View 1
+ SfxViewShell* pView1 = SfxViewShell::Current();
+ sd::ViewShell* pViewShell1 = pXImpressDocument->GetDocShell()->GetViewShell();
+ int nView1 = SfxLokHelper::getView();
+
+ // Create View 2
+ SfxLokHelper::createView();
+ SfxViewShell* pView2 = SfxViewShell::Current();
+ sd::ViewShell* pViewShell2 = pXImpressDocument->GetDocShell()->GetViewShell();
+ int nView2 = SfxLokHelper::getView();
+
+ // Check UNDO is disabled
+ {
+ std::unique_ptr<SfxPoolItem> pItem1;
+ std::unique_ptr<SfxPoolItem> pItem2;
+ CPPUNIT_ASSERT_EQUAL(SfxItemState::DISABLED, pView1->GetViewFrame()->GetBindings().QueryState(SID_UNDO, pItem1));
+ CPPUNIT_ASSERT_EQUAL(SfxItemState::DISABLED, pView2->GetViewFrame()->GetBindings().QueryState(SID_UNDO, pItem2));
+ }
+
+ // Insert a character in the first view.
+ SfxLokHelper::setView(nView1);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'h', 0);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'h', 0);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(pViewShell1->GetView()->IsTextEdit());
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(!pViewShell1->GetView()->IsTextEdit());
+
+ // Check
+ {
+ std::unique_ptr<SfxPoolItem> xItem1;
+ pView1->GetViewFrame()->GetBindings().QueryState(SID_UNDO, xItem1);
+ const auto* pUInt32Item1 = dynamic_cast<const SfxUInt32Item*>(xItem1.get());
+ CPPUNIT_ASSERT(!pUInt32Item1);
+
+ std::unique_ptr<SfxPoolItem> xItem2;
+ pView2->GetViewFrame()->GetBindings().QueryState(SID_UNDO, xItem2);
+ const auto* pUInt32Item2 = dynamic_cast<const SfxUInt32Item*>(xItem2.get());
+ CPPUNIT_ASSERT(pUInt32Item2);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(SID_REPAIRPACKAGE), pUInt32Item2->GetValue());
+ }
+
+ // Insert a character in the second view.
+ SfxLokHelper::setView(nView2);
+ pXImpressDocument->setPart(1);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'c', 0);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'c', 0);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(pViewShell2->GetView()->IsTextEdit());
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(!pViewShell2->GetView()->IsTextEdit());
+
+ // Check
+ {
+ std::unique_ptr<SfxPoolItem> xItem1;
+ pView1->GetViewFrame()->GetBindings().QueryState(SID_UNDO, xItem1);
+ const SfxUInt32Item* pUInt32Item = dynamic_cast<const SfxUInt32Item*>(xItem1.get());
+ CPPUNIT_ASSERT(pUInt32Item);
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(SID_REPAIRPACKAGE), pUInt32Item->GetValue());
+
+ std::unique_ptr<SfxPoolItem> xItem2;
+ pView2->GetViewFrame()->GetBindings().QueryState(SID_UNDO, xItem2);
+ CPPUNIT_ASSERT(!dynamic_cast< const SfxUInt32Item* >(xItem2.get()));
+ }
+}
+
+void SdTiledRenderingTest::testDocumentRepair()
+{
+ // Create two views.
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ CPPUNIT_ASSERT(pXImpressDocument);
+
+ // view #1
+ SfxViewShell* pView1 = SfxViewShell::Current();
+
+ // view #2
+ SfxLokHelper::createView();
+ SfxViewShell* pView2 = SfxViewShell::Current();
+ int nView2 = SfxLokHelper::getView();
+ sd::ViewShell* pViewShell2 = pXImpressDocument->GetDocShell()->GetViewShell();
+
+ CPPUNIT_ASSERT(pView1 != pView2);
+ {
+ std::unique_ptr<SfxBoolItem> pItem1;
+ pView1->GetViewFrame()->GetBindings().QueryState(SID_DOC_REPAIR, pItem1);
+ CPPUNIT_ASSERT(pItem1);
+ CPPUNIT_ASSERT_EQUAL(false, pItem1->GetValue());
+
+ std::unique_ptr<SfxBoolItem> pItem2;
+ pView2->GetViewFrame()->GetBindings().QueryState(SID_DOC_REPAIR, pItem2);
+ CPPUNIT_ASSERT(pItem2);
+ CPPUNIT_ASSERT_EQUAL(false, pItem2->GetValue());
+ }
+
+ // Insert a character in the second view.
+ SfxLokHelper::setView(nView2);
+ pXImpressDocument->setPart(1);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'c', 0);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 'c', 0);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(pViewShell2->GetView()->IsTextEdit());
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(!pViewShell2->GetView()->IsTextEdit());
+
+ {
+ std::unique_ptr<SfxBoolItem> pItem1;
+ pView1->GetViewFrame()->GetBindings().QueryState(SID_DOC_REPAIR, pItem1);
+ CPPUNIT_ASSERT(pItem1);
+ CPPUNIT_ASSERT_EQUAL(true, pItem1->GetValue());
+
+ std::unique_ptr<SfxBoolItem> pItem2;
+ pView2->GetViewFrame()->GetBindings().QueryState(SID_DOC_REPAIR, pItem2);
+ CPPUNIT_ASSERT(pItem2);
+ CPPUNIT_ASSERT_EQUAL(true, pItem2->GetValue());
+ }
+}
+
+void SdTiledRenderingTest::testLanguageStatus()
+{
+ // Load the document.
+ createDoc("dummy.odp");
+ SfxViewShell* pView1 = SfxViewShell::Current();
+ SfxLokHelper::createView();
+ SfxViewShell* pView2 = SfxViewShell::Current();
+ {
+ std::unique_ptr<SfxPoolItem> xItem1;
+ std::unique_ptr<SfxPoolItem> xItem2;
+ pView1->GetViewFrame()->GetBindings().QueryState(SID_LANGUAGE_STATUS, xItem1);
+ pView2->GetViewFrame()->GetBindings().QueryState(SID_LANGUAGE_STATUS, xItem2);
+ auto pStringItem = dynamic_cast<const SfxStringItem*>(xItem1.get());
+ CPPUNIT_ASSERT(pStringItem);
+
+ CPPUNIT_ASSERT_EQUAL(OUString("English (USA);en-US"), pStringItem->GetValue());
+
+ CPPUNIT_ASSERT(dynamic_cast< const SfxStringItem* >(xItem2.get()));
+ }
+}
+
+void SdTiledRenderingTest::testLanguageAllText()
+{
+ // Load the document, which has a single shape, with Hungarian text.
+ createDoc("language-all-text.odp");
+
+ // Set the language to English for all text.
+ uno::Sequence<beans::PropertyValue> aArgs = comphelper::InitPropertySequence({
+ { "Language", uno::Any(OUString("Default_English (USA)")) },
+ });
+ comphelper::dispatchCommand(".uno:LanguageStatus", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // Assert that the shape text language was changed.
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xShape(xPage->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xRun(
+ getRunFromParagraph(0, getParagraphFromShape(0, xShape)), uno::UNO_QUERY);
+ lang::Locale aLocale;
+ xRun->getPropertyValue("CharLocale") >>= aLocale;
+ // Without the accompanying fix in place, this test would have failed with 'Expected: en;
+ // Actual: hu', as the shape text language was not set.
+ CPPUNIT_ASSERT_EQUAL(OUString("en"), aLocale.Language);
+}
+
+void SdTiledRenderingTest::testDefaultView()
+{
+ // Load the document with notes view.
+ SdXImpressDocument* pXImpressDocument = createDoc("notes-view.odp");
+ sd::ViewShell* pView = pXImpressDocument->GetDocShell()->GetViewShell();
+ {
+ std::unique_ptr<SfxBoolItem> pImpressView;
+ std::unique_ptr<SfxBoolItem> pNotesView;
+ pView->GetViewFrame()->GetBindings().QueryState(SID_NORMAL_MULTI_PANE_GUI, pImpressView);
+ pView->GetViewFrame()->GetBindings().QueryState(SID_NOTES_MODE, pNotesView);
+ CPPUNIT_ASSERT(pImpressView);
+ CPPUNIT_ASSERT(pNotesView);
+ CPPUNIT_ASSERT_EQUAL(true, pImpressView->GetValue());
+ CPPUNIT_ASSERT_EQUAL(false, pNotesView->GetValue());
+ }
+}
+
+void SdTiledRenderingTest::testIMESupport()
+{
+ // Load the document with notes view.
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ VclPtr<vcl::Window> pDocWindow = pXImpressDocument->getDocWindow();
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdrObject* pObject = pViewShell->GetActualPage()->GetObj(0);
+ SdrTextObj* pTextObj = static_cast<SdrTextObj*>(pObject);
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pTextObj, pView->GetSdrPageView());
+ SfxStringItem aInputString(SID_ATTR_CHAR, "x");
+ pViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR,
+ SfxCallMode::SYNCHRON, { &aInputString });
+
+ // sequence of chinese IME compositions when 'nihao' is typed in an IME
+ const std::vector<OString> aUtf8Inputs{ "年", "你", "你好", "你哈", "你好", "你好" };
+ std::vector<OUString> aInputs;
+ std::transform(aUtf8Inputs.begin(), aUtf8Inputs.end(),
+ std::back_inserter(aInputs), [](OString aInput) {
+ return OUString::fromUtf8(aInput);
+ });
+ for (const auto& aInput: aInputs)
+ {
+ pDocWindow->PostExtTextInputEvent(VclEventId::ExtTextInput, aInput);
+ }
+ pDocWindow->PostExtTextInputEvent(VclEventId::EndExtTextInput, "");
+
+ // the cursor should be at position 3rd
+ EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView();
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), rEditView.GetSelection().nStartPos);
+
+ ESelection aWordSelection(0, 0, 0, 3); // start para, start char, end para, end char.
+ rEditView.SetSelection(aWordSelection);
+ // content contains only the last IME composition, not all
+ CPPUNIT_ASSERT_EQUAL(OUString("x" + aInputs[aInputs.size() - 1]), rEditView.GetSelected());
+}
+
+void SdTiledRenderingTest::testTdf115783()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("tdf115783.fodp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ auto pTableObject = dynamic_cast<sdr::table::SdrTableObj*>(pObject);
+ CPPUNIT_ASSERT(pTableObject);
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pTableObject, pView->GetSdrPageView());
+
+ // Create a cell selection and set font height.
+ // Go to the end of the B1 cell.
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT);
+ // Create a B1->C1 cell selection.
+ const int nShiftRight = KEY_SHIFT + KEY_RIGHT;
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, nShiftRight);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, nShiftRight);
+ uno::Sequence<beans::PropertyValue> aArgs = comphelper::InitPropertySequence({
+ { "FontHeight.Height", uno::Any(static_cast<float>(12)) },
+ });
+ comphelper::dispatchCommand(".uno:FontHeight", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // Create a text selection on the B1 cell.
+ pTableObject->setActiveCell(sdr::table::CellPos(1, 0));
+ pView->SdrBeginTextEdit(pTableObject);
+ EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView();
+ // Start para, start char, end para, end char.
+ rEditView.SetSelection(ESelection(0, 0, 0, 5));
+ CPPUNIT_ASSERT_EQUAL(OUString("hello"), rEditView.GetSelected());
+
+ // Copy selection, paste at the start of the cell.
+ aArgs = {};
+ comphelper::dispatchCommand(".uno:Copy", aArgs);
+ Scheduler::ProcessEventsToIdle();
+ rEditView.SetSelection(ESelection(0, 0, 0, 0));
+ aArgs = {};
+ comphelper::dispatchCommand(".uno:Paste", aArgs);
+ Scheduler::ProcessEventsToIdle();
+ pView->SdrEndTextEdit();
+
+ // And now verify that the cell has the correct font size.
+ uno::Reference<table::XCellRange> xTable = pTableObject->getTable();
+ CPPUNIT_ASSERT(xTable.is());
+ uno::Reference<text::XTextRange> xCell(xTable->getCellByPosition(1, 0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xCell.is());
+ uno::Reference<container::XEnumerationAccess> xText(xCell->getText(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xText.is());
+ uno::Reference<container::XEnumerationAccess> xParagraph(
+ xText->createEnumeration()->nextElement(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xParagraph.is());
+ uno::Reference<text::XTextRange> xPortion(xParagraph->createEnumeration()->nextElement(),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xPortion.is());
+ // This failed, it was only "hello" as the paragraph had 2 portions: a
+ // "hello" with 12pt size and a "hello" with 18pt.
+ CPPUNIT_ASSERT_EQUAL(OUString("hellohello"), xPortion->getString());
+ uno::Reference<beans::XPropertySet> xPropertySet(xPortion, uno::UNO_QUERY);
+ int nHeight = xPropertySet->getPropertyValue("CharHeight").get<float>();
+ // Make sure that the single font size for the cell is the expected one.
+ CPPUNIT_ASSERT_EQUAL(12, nHeight);
+}
+
+void SdTiledRenderingTest::testPasteTextOnSlide()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("paste_text_onslide.odp");
+ CPPUNIT_ASSERT(pXImpressDocument);
+
+ // select second text object
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB);
+ Scheduler::ProcessEventsToIdle();
+
+ // step into text editing
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, '1', 0);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, '1', 0);
+ Scheduler::ProcessEventsToIdle();
+
+ // select full text
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT);
+ Scheduler::ProcessEventsToIdle();
+
+ // Copy some text
+ comphelper::dispatchCommand(".uno:Copy", uno::Sequence<beans::PropertyValue>());
+ Scheduler::ProcessEventsToIdle();
+
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE);
+ Scheduler::ProcessEventsToIdle();
+
+ // Paste onto the slide
+ comphelper::dispatchCommand(".uno:Paste", uno::Sequence<beans::PropertyValue>());
+ Scheduler::ProcessEventsToIdle();
+
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::ESCAPE);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::ESCAPE);
+ Scheduler::ProcessEventsToIdle();
+
+ // Check the position of the newly added text shape, created for pasted text
+ SdPage* pActualPage = pXImpressDocument->GetDocShell()->GetViewShell()->GetActualPage();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pActualPage->GetObjCount());
+ SdrObject* pObject = pActualPage->GetObj(2);
+ CPPUNIT_ASSERT(pObject);
+ SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(pObject);
+ CPPUNIT_ASSERT(pTextObj);
+ CPPUNIT_ASSERT_EQUAL(SdrObjKind::Text, pTextObj->GetObjIdentifier());
+ const Point aPos = pTextObj->GetLastBoundRect().TopLeft();
+ CPPUNIT_ASSERT_EQUAL(static_cast<tools::Long>(0), aPos.getX());
+ CPPUNIT_ASSERT_EQUAL(static_cast<tools::Long>(0), aPos.getY());
+}
+
+void SdTiledRenderingTest::testTdf115873()
+{
+ // Initialize the navigator.
+ SdXImpressDocument* pXImpressDocument = createDoc("tdf115873.fodp");
+ SfxViewShell* pViewShell = SfxViewShell::Current();
+ CPPUNIT_ASSERT(pViewShell);
+ SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings();
+ auto xNavigator = std::make_unique<SdNavigatorWin>(nullptr, &rBindings, nullptr);
+ xNavigator->InitTreeLB(pXImpressDocument->GetDoc());
+ SdPageObjsTLV& rObjects = xNavigator->GetObjects();
+ rObjects.SelectEntry(u"Slide 1");
+ rObjects.Select();
+ sd::ViewShell* pSdViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdrView* pSdrView = pSdViewShell->GetView();
+ pSdrView->UnmarkAllObj(pSdrView->GetSdrPageView());
+
+ // Make sure that no shapes are selected.
+ const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList();
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), rMarkList.GetMarkCount());
+
+ // Single-click with the mouse.
+ MouseEvent aMouseEvent(Point(0, 0), /*nClicks=*/1, MouseEventModifiers::NONE, MOUSE_LEFT);
+ rObjects.MousePressHdl(aMouseEvent);
+ rObjects.SelectEntry(u"Rectangle");
+ rObjects.Select();
+ rObjects.MouseReleaseHdl(aMouseEvent);
+ Scheduler::ProcessEventsToIdle();
+ // This failed, single-click did not result in a shape selection (only
+ // double-click did).
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rMarkList.GetMarkCount());
+}
+
+void SdTiledRenderingTest::testTdf115873Group()
+{
+ // Initialize the navigator.
+ SdXImpressDocument* pXImpressDocument = createDoc("tdf115873-group.fodp");
+ SfxViewShell* pViewShell = SfxViewShell::Current();
+ CPPUNIT_ASSERT(pViewShell);
+ SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings();
+ auto xNavigator = std::make_unique<SdNavigatorWin>(nullptr, &rBindings, nullptr);
+ xNavigator->InitTreeLB(pXImpressDocument->GetDoc());
+ SdPageObjsTLV& rObjects = xNavigator->GetObjects();
+ // This failed, Fill() and IsEqualToDoc() were out of sync for group
+ // shapes.
+ CPPUNIT_ASSERT(rObjects.IsEqualToDoc(pXImpressDocument->GetDoc()));
+}
+
+void SdTiledRenderingTest::testCutSelectionChange()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("cut_selection_change.odp");
+ CPPUNIT_ASSERT(pXImpressDocument);
+
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ setupLibreOfficeKitViewCallback(pViewShell->GetViewShellBase());
+ Scheduler::ProcessEventsToIdle();
+
+ // Select first text object
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB);
+ Scheduler::ProcessEventsToIdle();
+
+ // step into text editing
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, '1', 0);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, '1', 0);
+ Scheduler::ProcessEventsToIdle();
+
+ // select some text
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_LEFT | KEY_SHIFT);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_LEFT | KEY_SHIFT);
+ Scheduler::ProcessEventsToIdle();
+
+ // Check that we have a selection before cutting
+ CPPUNIT_ASSERT_EQUAL(static_cast<std::size_t>(1), m_aSelection.size());
+
+ // Cut the selected text
+ comphelper::dispatchCommand(".uno:Cut", uno::Sequence<beans::PropertyValue>());
+ Scheduler::ProcessEventsToIdle();
+
+ // Selection is removed
+ CPPUNIT_ASSERT_EQUAL(static_cast<std::size_t>(0), m_aSelection.size());
+}
+
+void SdTiledRenderingTest::testRegenerateDiagram()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("regenerate-diagram.pptx");
+ CPPUNIT_ASSERT(pXImpressDocument);
+
+ SdPage* pActualPage = pXImpressDocument->GetDocShell()->GetViewShell()->GetActualPage();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(4), pActualPage->GetObj(0)->GetSubList()->GetObjCount());
+
+ // For new Diagram functionality entering group using UI is not allowed as long
+ // as the group shape is a diagram. Do the same as before done by triggering UI
+ // events directly in the model
+ // Remove and free top-left entry (Box showing "A")
+ SdrObject* pTopLeftRemoved = pActualPage->GetObj(0)->GetSubList()->RemoveObject(1);
+ SdrObject::Free(pTopLeftRemoved);
+
+ // select diagram
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pActualPage->GetObj(0)->GetSubList()->GetObjCount());
+
+ // regenerate diagram
+ comphelper::dispatchCommand(".uno:RegenerateDiagram", uno::Sequence<beans::PropertyValue>());
+ Scheduler::ProcessEventsToIdle();
+
+ // diagram content (child shape count) should be the same as in the beginning
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(4), pActualPage->GetObj(0)->GetSubList()->GetObjCount());
+}
+
+void SdTiledRenderingTest::testInsertDeletePageInvalidation()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ ViewCallback aView1;
+ CPPUNIT_ASSERT_EQUAL(8, pXImpressDocument->getParts());
+
+ // Insert slide
+ aView1.m_bTilesInvalidated = false;
+ aView1.m_aInvalidations.clear();
+ comphelper::dispatchCommand(".uno:InsertPage", uno::Sequence<beans::PropertyValue>());
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(aView1.m_bTilesInvalidated);
+ CPPUNIT_ASSERT_EQUAL(9, pXImpressDocument->getParts());
+ CPPUNIT_ASSERT_EQUAL(size_t(9), aView1.m_aInvalidations.size());
+
+ // Delete slide
+ aView1.m_bTilesInvalidated = false;
+ aView1.m_aInvalidations.clear();
+ comphelper::dispatchCommand(".uno:DeletePage", uno::Sequence<beans::PropertyValue>());
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(aView1.m_bTilesInvalidated);
+ CPPUNIT_ASSERT_EQUAL(8, pXImpressDocument->getParts());
+ CPPUNIT_ASSERT_EQUAL(size_t(8), aView1.m_aInvalidations.size());
+}
+
+void SdTiledRenderingTest::testSpellOnlineRenderParameter()
+{
+ // Load the document.
+ SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp");
+ bool bSet = pXImpressDocument->GetDoc()->GetOnlineSpell();
+
+ uno::Sequence<beans::PropertyValue> aPropertyValues =
+ {
+ comphelper::InitPropertySequence({ { ".uno:SpellOnline", uno::Any(!bSet) } }),
+ };
+ pXImpressDocument->initializeForTiledRendering(aPropertyValues);
+ CPPUNIT_ASSERT_EQUAL(!bSet, pXImpressDocument->GetDoc()->GetOnlineSpell());
+}
+
+void SdTiledRenderingTest::testSlideDuplicateUndo()
+{
+ // Create two views.
+ SdXImpressDocument* pXImpressDocument = createDoc("duplicate-undo.odp");
+ int nView0 = SfxLokHelper::getView();
+ SfxLokHelper::createView();
+ pXImpressDocument->initializeForTiledRendering({});
+ int nView1 = SfxLokHelper::getView();
+ SfxLokHelper::setView(nView0);
+
+ // Switch to the 3rd slide on view 0, and start text editing.
+ {
+ pXImpressDocument->setPart(2);
+ sd::ViewShell* pViewShell0 = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdrView* pView = pViewShell0->GetView();
+ SdPage* pActualPage = pViewShell0->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(1);
+ SdrTextObj* pTextObj = static_cast<SdrTextObj*>(pObject);
+ pView->MarkObj(pTextObj, pView->GetSdrPageView());
+ SfxStringItem aInputString(SID_ATTR_CHAR, "x");
+ pViewShell0->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR,
+ SfxCallMode::SYNCHRON, { &aInputString });
+ CPPUNIT_ASSERT(pView->IsTextEdit());
+ CPPUNIT_ASSERT(pView->GetTextEditPageView());
+ }
+
+ // Duplicate the first slide on view 1 and undo it.
+ SfxLokHelper::setView(nView1);
+ comphelper::dispatchCommand(".uno:DuplicatePage", {});
+ Scheduler::ProcessEventsToIdle();
+ pXImpressDocument->setPart(0, /*bAllowChangeFocus=*/false);
+ pXImpressDocument->setPart(1, /*bAllowChangeFocus=*/false);
+ SfxLokHelper::setView(nView0);
+ pXImpressDocument->setPart(0, /*bAllowChangeFocus=*/false);
+ pXImpressDocument->setPart(3, /*bAllowChangeFocus=*/false);
+ SfxLokHelper::setView(nView1);
+ pXImpressDocument->getUndoManager()->undo();
+ // Without the accompanying fix in place, this would have tried to access the outdated page view
+ // pointer, potentially leading to a crash.
+ pXImpressDocument->setPart(2, /*bAllowChangeFocus=*/false);
+
+ // Make sure that view 0 now doesn't have an outdated page view pointer.
+ SfxLokHelper::setView(nView0);
+ sd::ViewShell* pViewShell0 = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdrView* pView0 = pViewShell0->GetView();
+ CPPUNIT_ASSERT(!pView0->GetTextEditPageView());
+}
+
+namespace
+{
+
+void lcl_extractHandleParameters(std::string_view selection, sal_uInt32& id, sal_uInt32& x, sal_uInt32& y)
+{
+ OString extraInfo( selection.substr(selection.find("{")) );
+ std::stringstream aStream(extraInfo.getStr());
+ boost::property_tree::ptree aTree;
+ boost::property_tree::read_json(aStream, aTree);
+ boost::property_tree::ptree
+ handle0 = aTree
+ .get_child("handles")
+ .get_child("kinds")
+ .get_child("rectangle")
+ .get_child("1")
+ .begin()->second;
+ id = handle0.get_child("id").get_value<int>();
+ x = handle0.get_child("point").get_child("x").get_value<int>();
+ y = handle0.get_child("point").get_child("y").get_value<int>();
+}
+
+}
+
+void SdTiledRenderingTest::testMoveShapeHandle()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("shape.odp");
+ ViewCallback aView1;
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pPage->GetObj(0);
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pObject, pView->GetSdrPageView());
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT(!aView1.m_ShapeSelection.isEmpty());
+ {
+ sal_uInt32 id, x, y;
+ lcl_extractHandleParameters(aView1.m_ShapeSelection, id, x ,y);
+ sal_uInt32 oldX = x;
+ sal_uInt32 oldY = y;
+ uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence(
+ {
+ {"HandleNum", uno::Any(id)},
+ {"NewPosX", uno::Any(x+1)},
+ {"NewPosY", uno::Any(y+1)}
+ }));
+ comphelper::dispatchCommand(".uno:MoveShapeHandle", aPropertyValues);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT(!aView1.m_ShapeSelection.isEmpty());
+ lcl_extractHandleParameters(aView1.m_ShapeSelection, id, x ,y);
+ CPPUNIT_ASSERT_EQUAL(x-1, oldX);
+ CPPUNIT_ASSERT_EQUAL(y-1, oldY);
+ }
+}
+
+void SdTiledRenderingTest::testPasteUndo()
+{
+ // Given a document with a textbox, containing "world":
+ SdXImpressDocument* pXImpressDocument = createDoc("paste-undo.fodp");
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pObject, pView->GetSdrPageView());
+ pView->SdrBeginTextEdit(pObject);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_HOME);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_HOME);
+ EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView();
+ ESelection aWordSelection(0, 0, 0, 1); // "w" of "world"
+ rEditView.SetSelection(aWordSelection);
+ comphelper::dispatchCommand(".uno:Cut", {});
+ Scheduler::ProcessEventsToIdle();
+
+ // When undoing a paste:
+ comphelper::dispatchCommand(".uno:Paste", {});
+ Scheduler::ProcessEventsToIdle();
+ comphelper::dispatchCommand(".uno:Undo", {});
+ Scheduler::ProcessEventsToIdle();
+
+ // Then make sure the cursor position is still at the beginning:
+ ESelection aSelection = rEditView.GetSelection();
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 0
+ // - Actual : 4
+ // i.e. the cursor position after undo was at the end of the line, not at the start, as
+ // expected.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aSelection.nStartPos);
+}
+
+void SdTiledRenderingTest::testShapeEditInMultipleViews()
+{
+ SdXImpressDocument* pXImpressDocument = createDoc("TextBoxAndRect.odg");
+ pXImpressDocument->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+ SdDrawDocument* pDocument = pXImpressDocument->GetDoc();
+
+ // Create view 1
+ const int nView1 = SfxLokHelper::getView();
+ sd::ViewShell* pViewShell1 = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdrView* pView1 = pViewShell1->GetView();
+ Scheduler::ProcessEventsToIdle();
+
+ // Create view 2
+ SfxLokHelper::createView();
+ const int nView2 = SfxLokHelper::getView();
+ CPPUNIT_ASSERT(nView1 != nView2);
+
+ sd::ViewShell* pViewShell2 = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdrView* pView2 = pViewShell2->GetView();
+ Scheduler::ProcessEventsToIdle();
+
+ // Switch to view 1
+ SfxLokHelper::setView(nView1);
+
+ SdPage* pPage1 = pViewShell1->GetActualPage();
+
+ SdrObject* pTextBoxObject = pPage1->GetObj(0);
+ CPPUNIT_ASSERT_EQUAL(OUString("Text Box"), pTextBoxObject->GetName());
+
+ SdrObject* pRectangleObject = pPage1->GetObj(1);
+ CPPUNIT_ASSERT_EQUAL(OUString("Rect"), pRectangleObject->GetName());
+
+ SdrObject* pTableObject = pPage1->GetObj(2);
+ CPPUNIT_ASSERT_EQUAL(OUString("Table1"), pTableObject->GetName());
+
+ // Scenario 1
+ // 2 shapes - "Text Box" and "Rect"
+ // View1 - "Text Box" enters text edit mode, View 2 - moves the "Rect" around
+ {
+ sd::UndoManager* pUndoManager = pDocument->GetUndoManager();
+ CPPUNIT_ASSERT_EQUAL(size_t(0), pUndoManager->GetUndoActionCount());
+
+ pView1->SdrBeginTextEdit(pTextBoxObject);
+ CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit());
+ CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
+
+ // Local undo count for View1 is 0
+ CPPUNIT_ASSERT_EQUAL(size_t(0), pView1->getViewLocalUndoManager()->GetUndoActionCount());
+ // Write 'test' in View1
+ SfxStringItem aInputString(SID_ATTR_CHAR, "test");
+ pViewShell1->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR, SfxCallMode::SYNCHRON, { &aInputString });
+ // Local undo count for View1 is now 1
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pView1->getViewLocalUndoManager()->GetUndoActionCount());
+
+ // Mark rectangle object
+ pView2->MarkObj(pRectangleObject, pView2->GetSdrPageView());
+
+ // Check the initial position of the object
+ tools::Rectangle aRectangle = pRectangleObject->GetLogicRect();
+ CPPUNIT_ASSERT_EQUAL(6250L, aRectangle.TopLeft().X());
+ CPPUNIT_ASSERT_EQUAL(7000L, aRectangle.TopLeft().Y());
+ CPPUNIT_ASSERT_EQUAL(6501L, aRectangle.GetWidth());
+ CPPUNIT_ASSERT_EQUAL(4501L, aRectangle.GetHeight());
+
+ // On View2 - Move handle 0 on the shape to a new position - resize
+ Point aNewPosition = aRectangle.TopLeft() + Point(-1250, -1000);
+ pView2->MoveShapeHandle(0, aNewPosition, -1);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pUndoManager->GetUndoActionCount());
+
+ // Check the object has a new size
+ aRectangle = pRectangleObject->GetLogicRect();
+ CPPUNIT_ASSERT_EQUAL(5000L, aRectangle.TopLeft().X());
+ CPPUNIT_ASSERT_EQUAL(6000L, aRectangle.TopLeft().Y());
+ CPPUNIT_ASSERT_EQUAL(7751L, aRectangle.GetWidth());
+ CPPUNIT_ASSERT_EQUAL(5501L, aRectangle.GetHeight());
+
+ // View1 is still in text edit mode...
+ CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit());
+ CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
+
+ // On View2 - relative move the shape to a different position
+ pView2->MoveMarkedObj(Size(1000, 2000), /*bCopy=*/false);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT_EQUAL(size_t(2), pUndoManager->GetUndoActionCount());
+
+ // Check the object is at a different position
+ aRectangle = pRectangleObject->GetLogicRect();
+ CPPUNIT_ASSERT_EQUAL(6000L, aRectangle.TopLeft().X());
+ CPPUNIT_ASSERT_EQUAL(8000L, aRectangle.TopLeft().Y());
+ CPPUNIT_ASSERT_EQUAL(7751L, aRectangle.GetWidth());
+ CPPUNIT_ASSERT_EQUAL(5501L, aRectangle.GetHeight());
+
+ // View1 is still in text edit mode...
+ CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit());
+ CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
+
+ // End Text edit - check undo count increase from 2 -> 3
+ CPPUNIT_ASSERT_EQUAL(size_t(2), pUndoManager->GetUndoActionCount());
+ pView1->SdrEndTextEdit();
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT_EQUAL(size_t(3), pUndoManager->GetUndoActionCount());
+
+ // Check that both views exited the text edit mode
+ CPPUNIT_ASSERT_EQUAL(false, pView1->IsTextEdit());
+ CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
+ }
+
+ // Scenario 2
+ // 1 shapes - "Text Box"
+ // View1 - "Text Box" enters text edit mode, View 2 - moves the "Text Box" around
+ {
+ sd::UndoManager* pUndoManager = pDocument->GetUndoManager();
+ CPPUNIT_ASSERT_EQUAL(size_t(3), pUndoManager->GetUndoActionCount());
+
+ pView1->SdrBeginTextEdit(pTextBoxObject);
+ CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit());
+ CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
+
+ // Local undo count for View1 is 0
+ CPPUNIT_ASSERT_EQUAL(size_t(0), pView1->getViewLocalUndoManager()->GetUndoActionCount());
+ // Write 'test' in View1
+ SfxStringItem aInputString(SID_ATTR_CHAR, "test");
+ pViewShell1->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR, SfxCallMode::SYNCHRON, { &aInputString });
+ // Local undo count for View1 is now 1
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pView1->getViewLocalUndoManager()->GetUndoActionCount());
+
+ // Mark rectangle object
+ pView2->MarkObj(pTextBoxObject, pView2->GetSdrPageView());
+
+ // Check the initial position of the object
+ tools::Rectangle aRectangle = pTextBoxObject->GetLogicRect();
+ CPPUNIT_ASSERT_EQUAL(2250L, aRectangle.TopLeft().X());
+ CPPUNIT_ASSERT_EQUAL(2000L, aRectangle.TopLeft().Y());
+ CPPUNIT_ASSERT_EQUAL(4501L, aRectangle.GetWidth());
+ CPPUNIT_ASSERT_EQUAL(2001L, aRectangle.GetHeight());
+
+ // On View2 - Move handle 0 on the shape to a new position - resize
+ Point aNewPosition = aRectangle.TopLeft() + Point(-1250, -1000);
+ pView2->MoveShapeHandle(0, aNewPosition, -1);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT_EQUAL(size_t(4), pUndoManager->GetUndoActionCount());
+
+ // Check the object has a new size
+ aRectangle = pTextBoxObject->GetLogicRect();
+ CPPUNIT_ASSERT_EQUAL(1000L, aRectangle.TopLeft().X());
+ CPPUNIT_ASSERT_EQUAL(1000L, aRectangle.TopLeft().Y());
+ CPPUNIT_ASSERT_EQUAL(4990L, aRectangle.GetWidth());
+ CPPUNIT_ASSERT_EQUAL(2175L, aRectangle.GetHeight());
+
+ // View1 is still in text edit mode...
+ CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit());
+ CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
+
+ // On View2 - relative move the shape to a different position
+ pView2->MoveMarkedObj(Size(1000, 2000), /*bCopy=*/false);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT_EQUAL(size_t(5), pUndoManager->GetUndoActionCount());
+
+ // Check the object is at a different position
+ aRectangle = pTextBoxObject->GetLogicRect();
+ CPPUNIT_ASSERT_EQUAL(2000L, aRectangle.TopLeft().X());
+ CPPUNIT_ASSERT_EQUAL(3000L, aRectangle.TopLeft().Y());
+ CPPUNIT_ASSERT_EQUAL(4990L, aRectangle.GetWidth());
+ CPPUNIT_ASSERT_EQUAL(2175L, aRectangle.GetHeight());
+
+ // View1 is still in text edit mode...
+ CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit());
+ CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
+
+ // End Text edit - check undo count increase from 5 -> 6
+ CPPUNIT_ASSERT_EQUAL(size_t(5), pUndoManager->GetUndoActionCount());
+ pView1->SdrEndTextEdit();
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT_EQUAL(size_t(6), pUndoManager->GetUndoActionCount());
+
+ // Check that both views exited the text edit mode
+ CPPUNIT_ASSERT_EQUAL(false, pView1->IsTextEdit());
+ CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
+ }
+
+ // Scenario 3
+ // 1 shapes - "Table1"
+ // View1 - "Table1" enters text edit mode, View 2 - moves the "Table1" around
+ {
+ sd::UndoManager* pUndoManager = pDocument->GetUndoManager();
+ CPPUNIT_ASSERT_EQUAL(size_t(6), pUndoManager->GetUndoActionCount());
+
+ pView1->SdrBeginTextEdit(pTableObject);
+ CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit());
+ CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
+
+ // Local undo count for View1 is 0
+ CPPUNIT_ASSERT_EQUAL(size_t(0), pView1->getViewLocalUndoManager()->GetUndoActionCount());
+ // Write 'test' in View1
+ SfxStringItem aInputString(SID_ATTR_CHAR, "test");
+ pViewShell1->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR, SfxCallMode::SYNCHRON, { &aInputString });
+ // Local undo count for View1 is now 1
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pView1->getViewLocalUndoManager()->GetUndoActionCount());
+
+ // Mark rectangle object
+ pView2->MarkObj(pTableObject, pView2->GetSdrPageView());
+
+ // Check the initial position of the table
+ tools::Rectangle aRectangle = pTableObject->GetLogicRect();
+ CPPUNIT_ASSERT_EQUAL(2919L, aRectangle.TopLeft().X());
+ CPPUNIT_ASSERT_EQUAL(18063L, aRectangle.TopLeft().Y());
+ CPPUNIT_ASSERT_EQUAL(14099L, aRectangle.GetWidth());
+ CPPUNIT_ASSERT_EQUAL(5999L, aRectangle.GetHeight());
+
+ // On View2 - relative move the shape to a different position
+ pView2->MoveMarkedObj(Size(1000, 2000), /*bCopy=*/false);
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT_EQUAL(size_t(7), pUndoManager->GetUndoActionCount());
+
+ // Check the object is at a different position
+ aRectangle = pTableObject->GetLogicRect();
+ CPPUNIT_ASSERT_EQUAL(3919L, aRectangle.TopLeft().X());
+ CPPUNIT_ASSERT_EQUAL(20063L, aRectangle.TopLeft().Y());
+ CPPUNIT_ASSERT_EQUAL(14099L, aRectangle.GetWidth());
+ CPPUNIT_ASSERT_EQUAL(5999L, aRectangle.GetHeight());
+
+ // View1 is still in text edit mode...
+ CPPUNIT_ASSERT_EQUAL(true, pView1->IsTextEdit());
+ CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
+
+ // End Text edit - check undo count increase from 7 -> 8
+ CPPUNIT_ASSERT_EQUAL(size_t(7), pUndoManager->GetUndoActionCount());
+ pView1->SdrEndTextEdit();
+ Scheduler::ProcessEventsToIdle();
+ CPPUNIT_ASSERT_EQUAL(size_t(8), pUndoManager->GetUndoActionCount());
+
+ // Check that both views exited the text edit mode
+ CPPUNIT_ASSERT_EQUAL(false, pView1->IsTextEdit());
+ CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
+ }
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(SdTiledRenderingTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/uiimpress.cxx b/sd/qa/unit/uiimpress.cxx
new file mode 100644
index 000000000..3642bef71
--- /dev/null
+++ b/sd/qa/unit/uiimpress.cxx
@@ -0,0 +1,1193 @@
+/* -*- 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 "sdmodeltestbase.hxx"
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/drawing/XMasterPageTarget.hpp>
+#include <com/sun/star/frame/DispatchHelper.hpp>
+#include <com/sun/star/table/XMergeableCell.hpp>
+#include <com/sun/star/text/WritingMode2.hpp>
+#include <com/sun/star/view/XSelectionSupplier.hpp>
+
+#include <comphelper/dispatchcommand.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertysequence.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svl/intitem.hxx>
+#include <svl/srchitem.hxx>
+#include <svx/svxids.hrc>
+#include <svx/svdoashp.hxx>
+#include <svx/svdotable.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xflgrit.hxx>
+#include <svx/xlndsit.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <SlideSorter.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <svl/stritem.hxx>
+#include <undo/undomanager.hxx>
+#include <vcl/scheduler.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <comphelper/sequenceashashmap.hxx>
+
+#include <ViewShell.hxx>
+#include <app.hrc>
+#include <sdpage.hxx>
+#include <unomodel.hxx>
+#include <osl/thread.hxx>
+#include <slideshow.hxx>
+
+using namespace ::com::sun::star;
+
+/// Impress UI tests.
+class SdUiImpressTest : public test::BootstrapFixture, public unotest::MacrosTest
+{
+protected:
+ uno::Reference<lang::XComponent> mxComponent;
+
+public:
+ virtual void setUp() override;
+ virtual void tearDown() override;
+
+ void checkCurrentPageNumber(sal_uInt16 nNum);
+ void typeString(SdXImpressDocument* rImpressDocument, const std::string& rStr);
+ void typeKey(SdXImpressDocument* rImpressDocument, const sal_uInt16 nKey);
+ void insertStringToObject(sal_uInt16 nObj, const std::string& rStr, bool bUseEscape);
+ sd::slidesorter::SlideSorterViewShell* getSlideSorterViewShell();
+ FileFormat* getFormat(sal_Int32 nExportType);
+ void save(sd::DrawDocShell* pShell, FileFormat const* pFormat, utl::TempFile const& rTempFile);
+};
+
+void SdUiImpressTest::setUp()
+{
+ test::BootstrapFixture::setUp();
+
+ mxDesktop.set(frame::Desktop::create(mxComponentContext));
+}
+
+void SdUiImpressTest::tearDown()
+{
+ if (mxComponent.is())
+ mxComponent->dispose();
+
+ test::BootstrapFixture::tearDown();
+}
+
+void SdUiImpressTest::checkCurrentPageNumber(sal_uInt16 nNum)
+{
+ uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawView> xDrawView(xModel->getCurrentController(), uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xPage(xDrawView->getCurrentPage(), uno::UNO_SET_THROW);
+ uno::Reference<beans::XPropertySet> xPropertySet(xPage, uno::UNO_QUERY);
+
+ sal_uInt16 nPageNumber;
+ xPropertySet->getPropertyValue("Number") >>= nPageNumber;
+ CPPUNIT_ASSERT_EQUAL(nNum, nPageNumber);
+}
+
+void SdUiImpressTest::typeKey(SdXImpressDocument* rImpressDocument, const sal_uInt16 nKey)
+{
+ rImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, nKey);
+ rImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, nKey);
+ Scheduler::ProcessEventsToIdle();
+}
+
+void SdUiImpressTest::typeString(SdXImpressDocument* rImpressDocument, const std::string& rStr)
+{
+ for (const char c : rStr)
+ {
+ rImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, c, 0);
+ rImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, c, 0);
+ Scheduler::ProcessEventsToIdle();
+ }
+}
+
+void SdUiImpressTest::insertStringToObject(sal_uInt16 nObj, const std::string& rStr,
+ bool bUseEscape)
+{
+ auto pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pPage = pViewShell->GetActualPage();
+ SdrObject* pShape = pPage->GetObj(nObj);
+ CPPUNIT_ASSERT_MESSAGE("No Shape", pShape);
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pShape, pView->GetSdrPageView());
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT(!pView->IsTextEdit());
+
+ typeString(pImpressDocument, rStr);
+
+ CPPUNIT_ASSERT(pView->IsTextEdit());
+
+ if (bUseEscape)
+ {
+ typeKey(pImpressDocument, KEY_ESCAPE);
+ CPPUNIT_ASSERT(!pView->IsTextEdit());
+ }
+}
+
+sd::slidesorter::SlideSorterViewShell* SdUiImpressTest::getSlideSorterViewShell()
+{
+ auto pXImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ sd::slidesorter::SlideSorterViewShell* pSSVS = nullptr;
+ // Same as in sd/qa/unit/misc-tests.cxx
+ for (int i = 0; i < 1000; i++)
+ {
+ // Process all Tasks - slide sorter is created here
+ Scheduler::ProcessEventsToIdle();
+ if ((pSSVS = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(
+ pViewShell->GetViewShellBase()))
+ != nullptr)
+ break;
+ osl::Thread::wait(std::chrono::milliseconds(100));
+ }
+ CPPUNIT_ASSERT(pSSVS);
+ return pSSVS;
+}
+
+FileFormat* SdUiImpressTest::getFormat(sal_Int32 nExportType)
+{
+ FileFormat* pFormat = &aFileFormats[0];
+ if (o3tl::make_unsigned(nExportType) < SAL_N_ELEMENTS(aFileFormats))
+ pFormat = &aFileFormats[nExportType];
+ return pFormat;
+}
+
+void SdUiImpressTest::save(sd::DrawDocShell* pShell, FileFormat const* pFormat,
+ utl::TempFile const& rTempFile)
+{
+ SfxMedium aStoreMedium(rTempFile.GetURL(), StreamMode::STD_WRITE);
+ if (std::strcmp(pFormat->pName, "odg") == 0)
+ { // Draw
+ SotClipboardFormatId nExportFormat = SotClipboardFormatId::NONE;
+ if (pFormat->nFormatType == ODG_FORMAT_TYPE)
+ nExportFormat = SotClipboardFormatId::STARDRAW_8;
+ auto pExportFilter = std::make_shared<SfxFilter>(
+ OUString::createFromAscii(pFormat->pFilterName), OUString(), pFormat->nFormatType,
+ nExportFormat, OUString::createFromAscii(pFormat->pTypeName), OUString(),
+ OUString::createFromAscii(pFormat->pUserData), "private:factory/sdraw*");
+ pExportFilter->SetVersion(SOFFICE_FILEFORMAT_CURRENT);
+ aStoreMedium.SetFilter(pExportFilter);
+ }
+ else // Impress
+ {
+ SotClipboardFormatId nExportFormat = SotClipboardFormatId::NONE;
+ if (pFormat->nFormatType == ODP_FORMAT_TYPE)
+ nExportFormat = SotClipboardFormatId::STARCHART_8;
+ auto pExportFilter = std::make_shared<SfxFilter>(
+ OUString::createFromAscii(pFormat->pFilterName), OUString(), pFormat->nFormatType,
+ nExportFormat, OUString::createFromAscii(pFormat->pTypeName), OUString(),
+ OUString::createFromAscii(pFormat->pUserData), "private:factory/simpress*");
+ pExportFilter->SetVersion(SOFFICE_FILEFORMAT_CURRENT);
+ aStoreMedium.SetFilter(pExportFilter);
+ }
+ pShell->DoSaveAs(aStoreMedium);
+ pShell->DoClose();
+}
+
+static void lcl_search(const OUString& rKey, bool bFindAll = false, bool bBackwards = false)
+{
+ Scheduler::ProcessEventsToIdle();
+ SvxSearchCmd eSearch = bFindAll ? SvxSearchCmd::FIND_ALL : SvxSearchCmd::FIND;
+
+ uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence({
+ { "SearchItem.SearchString", uno::Any(rKey) },
+ { "SearchItem.Backward", uno::Any(bBackwards) },
+ { "SearchItem.Command", uno::Any(sal_uInt16(eSearch)) },
+ }));
+
+ comphelper::dispatchCommand(".uno:ExecuteSearch", aPropertyValues);
+ Scheduler::ProcessEventsToIdle();
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf111522)
+{
+ // Load the document and create two new windows.
+ mxComponent = loadFromDesktop(m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf111522.odp"));
+ auto pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell();
+ pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_NEWWINDOW, SfxCallMode::SYNCHRON);
+ sd::ViewShell* pViewShell1 = pImpressDocument->GetDocShell()->GetViewShell();
+ pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_NEWWINDOW, SfxCallMode::SYNCHRON);
+ sd::ViewShell* pViewShell2 = pImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell1 != pViewShell2);
+
+ // Have slide 1 in window 1, slide 2 in window 2.
+ SfxRequest aRequest(pViewShell2->GetViewFrame(), SID_SWITCHPAGE);
+ aRequest.AppendItem(SfxUInt32Item(ID_VAL_WHATPAGE, 1));
+ aRequest.AppendItem(
+ SfxUInt32Item(ID_VAL_WHATKIND, static_cast<sal_uInt32>(PageKind::Standard)));
+ pViewShell2->ExecuteSlot(aRequest, /*bAsync=*/false);
+
+ // Start text edit in window 1.
+ SdPage* pPage1 = pViewShell1->GetActualPage();
+ SdrObject* pShape1 = pPage1->GetObj(0);
+ SdrView* pView1 = pViewShell1->GetView();
+ pView1->MarkObj(pShape1, pView1->GetSdrPageView());
+ pView1->SdrBeginTextEdit(pShape1);
+ CPPUNIT_ASSERT(pView1->IsTextEdit());
+
+ // Move the shape in window 2 & undo.
+ SdPage* pPage2 = pViewShell2->GetActualPage();
+ CPPUNIT_ASSERT(pPage1 != pPage2);
+ SdrObject* pShape2 = pPage2->GetObj(0);
+ SdrView* pView2 = pViewShell2->GetView();
+ pView2->MarkObj(pShape2, pView2->GetSdrPageView());
+ pView2->MoveMarkedObj(Size(1, 1), /*bCopy=*/false);
+ // Without the accompanying fix in place, this test would have failed with an assertion failure
+ // in SdrObjEditView::SdrEndTextEdit() as mpOldTextEditUndoManager was not nullptr.
+ pViewShell2->GetViewFrame()->GetDispatcher()->Execute(SID_UNDO, SfxCallMode::SYNCHRON);
+
+ // Rotate the shape in window 2 & undo.
+ pView2->MarkObj(pShape2, pView2->GetSdrPageView());
+ pView2->RotateMarkedObj(pShape2->GetLastBoundRect().Center(), /*nAngle=*/45_deg100);
+ // Without the accompanying fix in place, this test would have failed with an assertion failure
+ // in SdrObjEditView::SdrEndTextEdit() as mpOldTextEditUndoManager was not nullptr.
+ pViewShell2->GetViewFrame()->GetDispatcher()->Execute(SID_UNDO, SfxCallMode::SYNCHRON);
+
+ // Start text edit in window 2.
+ // tdf#125824
+ pView2->MarkObj(pShape2, pView2->GetSdrPageView());
+ pView2->SdrBeginTextEdit(pShape2);
+ CPPUNIT_ASSERT(pView2->IsTextEdit());
+ // Write 'test' inside the shape
+ SfxStringItem aInputString(SID_ATTR_CHAR, "test");
+ pViewShell2->GetViewFrame()->GetDispatcher()->ExecuteList(SID_ATTR_CHAR, SfxCallMode::SYNCHRON,
+ { &aInputString });
+ CPPUNIT_ASSERT(pView2->GetTextEditObject());
+ EditView& rEditView = pView2->GetTextEditOutlinerView()->GetEditView();
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), rEditView.GetSelection().nStartPos);
+ pView2->SdrEndTextEdit();
+ // Without the accompanying fix in place, this test would have failed with an assertion failure
+ // in SdrObjEditView::SdrEndTextEdit() as mpOldTextEditUndoManager was not nullptr.
+ pViewShell2->GetViewFrame()->GetDispatcher()->Execute(SID_UNDO, SfxCallMode::SYNCHRON);
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf126197)
+{
+ // Load the document and create two new windows.
+ mxComponent = loadFromDesktop(m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf126197.odp"));
+ auto pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell();
+ pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_NEWWINDOW, SfxCallMode::SYNCHRON);
+ sd::ViewShell* pViewShell1 = pImpressDocument->GetDocShell()->GetViewShell();
+ pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_NEWWINDOW, SfxCallMode::SYNCHRON);
+ sd::ViewShell* pViewShell2 = pImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell1 != pViewShell2);
+
+ // Start text edit in window 1.
+ SdPage* pPage1 = pViewShell1->GetActualPage();
+ SdrObject* pShape1 = pPage1->GetObj(0);
+ SdrView* pView1 = pViewShell1->GetView();
+ pView1->MarkObj(pShape1, pView1->GetSdrPageView());
+ pView1->SdrBeginTextEdit(pShape1);
+ CPPUNIT_ASSERT(pView1->IsTextEdit());
+
+ SdPage* pPage2 = pViewShell2->GetActualPage();
+ CPPUNIT_ASSERT_EQUAL(pPage1, pPage2);
+ SdrObject* pShape2 = pPage2->GetObj(0);
+ CPPUNIT_ASSERT_EQUAL(pShape1, pShape2);
+ SdrView* pView2 = pViewShell2->GetView();
+ pView2->MarkObj(pShape2, pView2->GetSdrPageView());
+
+ // Without the accompanying fix in place, this test would have failed with an assertion failure
+ // in SdrObjEditView::SdrEndTextEdit()
+ pViewShell2->GetViewFrame()->GetDispatcher()->Execute(SID_DELETE, SfxCallMode::SYNCHRON);
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf124708)
+{
+ mxComponent = loadFromDesktop(m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf124708.ppt"));
+
+ dispatchCommand(mxComponent, ".uno:NextPage", {});
+ Scheduler::ProcessEventsToIdle();
+
+ checkCurrentPageNumber(2);
+
+ auto pXImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(16), pActualPage->GetObjCount());
+
+ dispatchCommand(mxComponent, ".uno:SelectAll", {});
+ Scheduler::ProcessEventsToIdle();
+
+ // Without the fix in place, this test would have crashed here
+ dispatchCommand(mxComponent, ".uno:Delete", {});
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pActualPage->GetObjCount());
+
+ dispatchCommand(mxComponent, ".uno:Undo", {});
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(16), pActualPage->GetObjCount());
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf143412)
+{
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+
+ auto pXImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), pActualPage->GetObjCount());
+
+ OUString aImageURL = m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf143412.svg");
+ uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence({
+ { "FileName", uno::Any(aImageURL) },
+ }));
+ dispatchCommand(mxComponent, ".uno:InsertGraphic", aArgs);
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pActualPage->GetObjCount());
+
+ // Without the fix in place, this test would have crashed
+ // Check that converting an image to the different options doesn't crash
+
+ dispatchCommand(mxComponent, ".uno:ChangeBezier", {});
+
+ dispatchCommand(mxComponent, ".uno:ChangePolygon", {});
+
+ dispatchCommand(mxComponent, ".uno:convert_to_contour", {});
+
+ dispatchCommand(mxComponent, ".uno:ConvertInto3D", {});
+
+ dispatchCommand(mxComponent, ".uno:ConvertInto3DLatheFast", {});
+
+ dispatchCommand(mxComponent, ".uno:ConvertIntoBitmap", {});
+
+ dispatchCommand(mxComponent, ".uno:ConvertIntoMetaFile", {});
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pActualPage->GetObjCount());
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf139996)
+{
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+
+ sd::slidesorter::SlideSorterViewShell* pSSVS = getSlideSorterViewShell();
+ auto& rSSController = pSSVS->GetSlideSorter().GetController();
+ auto& rPageSelector = rSSController.GetPageSelector();
+
+ CPPUNIT_ASSERT_EQUAL(1, rPageSelector.GetSelectedPageCount());
+
+ rPageSelector.DeselectAllPages();
+
+ CPPUNIT_ASSERT_EQUAL(0, rPageSelector.GetSelectedPageCount());
+
+ // Without the fix in place, this test would have crashed here
+ dispatchCommand(mxComponent, ".uno:MovePageUp", {});
+ Scheduler::ProcessEventsToIdle();
+
+ dispatchCommand(mxComponent, ".uno:MovePageDown", {});
+ Scheduler::ProcessEventsToIdle();
+
+ dispatchCommand(mxComponent, ".uno:MovePageTop", {});
+ Scheduler::ProcessEventsToIdle();
+
+ dispatchCommand(mxComponent, ".uno:MovePageBottom", {});
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(0, rPageSelector.GetSelectedPageCount());
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf128651)
+{
+ // Error was, that undo and redo changes size of the shape. Affected actions were e.g.
+ // extrusion on/off, shadow on/off, changes on line or fill attributes.
+ // All these actions do not change the snap rectangle.
+ mxComponent = loadFromDesktop(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf128651_CustomShapeUndo.odp"));
+ auto pXImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pObject = pActualPage->GetObj(0);
+ auto pCustomShape = dynamic_cast<SdrObjCustomShape*>(pObject);
+ CPPUNIT_ASSERT_MESSAGE("No Shape", pCustomShape);
+ const sal_Int32 nOrigWidth(pCustomShape->GetSnapRect().GetWidth());
+
+ SdDrawDocument* pDocument = pXImpressDocument->GetDoc();
+ sd::UndoManager* pUndoManager = pDocument->GetUndoManager();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pUndoManager->GetUndoActionCount());
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pUndoManager->GetRedoActionCount());
+
+ SdrView* pView = pViewShell->GetView();
+ pView->MarkObj(pCustomShape, pView->GetSdrPageView());
+ pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_EXTRUSION_TOGGLE,
+ SfxCallMode::SYNCHRON);
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pUndoManager->GetUndoActionCount());
+
+ pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_UNDO, SfxCallMode::SYNCHRON);
+ const sal_Int32 nUndoWidth(pCustomShape->GetSnapRect().GetWidth());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Undo changes width", nOrigWidth, nUndoWidth);
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pUndoManager->GetRedoActionCount());
+ pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_REDO, SfxCallMode::SYNCHRON);
+ const sal_Int32 nRedoWidth(pCustomShape->GetSnapRect().GetWidth());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Redo changes width", nUndoWidth, nRedoWidth);
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf126605)
+{
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+
+ dispatchCommand(mxComponent, ".uno:InsertPage", {});
+ Scheduler::ProcessEventsToIdle();
+
+ insertStringToObject(0, "Test", /*bUseEscape*/ false);
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(1),
+ uno::UNO_QUERY);
+
+ uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY);
+
+ uno::Reference<text::XText> xText
+ = uno::Reference<text::XTextRange>(xShape, uno::UNO_QUERY_THROW)->getText();
+ CPPUNIT_ASSERT_MESSAGE("Not a text shape", xText.is());
+
+ uno::Reference<container::XEnumerationAccess> paraEnumAccess(xText, uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> paraEnum(paraEnumAccess->createEnumeration());
+
+ // Get first paragraph
+ uno::Reference<text::XTextRange> xParagraph(paraEnum->nextElement(), uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xPropSet(xParagraph, uno::UNO_QUERY_THROW);
+
+ sal_Int16 nWritingMode = 0;
+ xPropSet->getPropertyValue("WritingMode") >>= nWritingMode;
+ CPPUNIT_ASSERT_EQUAL(text::WritingMode2::LR_TB, nWritingMode);
+
+ // Without the fix in place, this test would have crashed here
+ dispatchCommand(mxComponent, ".uno:ParaRightToLeft", {});
+ Scheduler::ProcessEventsToIdle();
+
+ xPropSet->getPropertyValue("WritingMode") >>= nWritingMode;
+ CPPUNIT_ASSERT_EQUAL(text::WritingMode2::RL_TB, nWritingMode);
+
+ dispatchCommand(mxComponent, ".uno:ParaLeftToRight", {});
+ Scheduler::ProcessEventsToIdle();
+
+ xPropSet->getPropertyValue("WritingMode") >>= nWritingMode;
+ CPPUNIT_ASSERT_EQUAL(text::WritingMode2::LR_TB, nWritingMode);
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf100950)
+{
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+
+ dispatchCommand(mxComponent, ".uno:InsertPage", {});
+ Scheduler::ProcessEventsToIdle();
+
+ dispatchCommand(mxComponent, ".uno:InsertPage", {});
+ Scheduler::ProcessEventsToIdle();
+
+ insertStringToObject(0, "Test", /*bUseEscape*/ true);
+
+ dispatchCommand(mxComponent, ".uno:Undo", {});
+ Scheduler::ProcessEventsToIdle();
+
+ sd::slidesorter::SlideSorterViewShell* pSSVS = getSlideSorterViewShell();
+ auto& rSSController = pSSVS->GetSlideSorter().GetController();
+ auto& rPageSelector = rSSController.GetPageSelector();
+
+ // Without the fix in place, this test would have failed here
+ CPPUNIT_ASSERT(rPageSelector.IsPageSelected(2));
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf129346)
+{
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+
+ dispatchCommand(mxComponent, ".uno:DiaMode", {});
+ Scheduler::ProcessEventsToIdle();
+ checkCurrentPageNumber(1);
+
+ dispatchCommand(mxComponent, ".uno:InsertPage", {});
+ Scheduler::ProcessEventsToIdle();
+ checkCurrentPageNumber(2);
+
+ dispatchCommand(mxComponent, ".uno:Undo", {});
+ Scheduler::ProcessEventsToIdle();
+ checkCurrentPageNumber(1);
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testmoveSlides)
+{
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+
+ auto pXImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+
+ uno::Sequence<beans::PropertyValue> aArgs(
+ comphelper::InitPropertySequence({ { "PageName", uno::Any(OUString("Test 1")) },
+ { "WhatLayout", uno::Any(sal_Int32(1)) },
+ { "IsPageBack", uno::Any(false) },
+ { "IsPageObj", uno::Any(false) } }));
+
+ dispatchCommand(mxComponent, ".uno:InsertPage", aArgs);
+ Scheduler::ProcessEventsToIdle();
+ checkCurrentPageNumber(2);
+
+ CPPUNIT_ASSERT_EQUAL(OUString("Test 1"), pViewShell->GetActualPage()->GetName());
+
+ aArgs = comphelper::InitPropertySequence({ { "PageName", uno::Any(OUString("Test 2")) },
+ { "WhatLayout", uno::Any(sal_Int32(1)) },
+ { "IsPageBack", uno::Any(false) },
+ { "IsPageObj", uno::Any(false) } });
+
+ dispatchCommand(mxComponent, ".uno:InsertPage", aArgs);
+ Scheduler::ProcessEventsToIdle();
+ checkCurrentPageNumber(3);
+
+ CPPUNIT_ASSERT_EQUAL(OUString("Test 2"), pViewShell->GetActualPage()->GetName());
+
+ // Move slide 'Test 2' up
+ for (size_t i = 2; i > 0; --i)
+ {
+ dispatchCommand(mxComponent, ".uno:MovePageUp", {});
+ Scheduler::ProcessEventsToIdle();
+ checkCurrentPageNumber(i);
+ CPPUNIT_ASSERT_EQUAL(OUString("Test 2"), pViewShell->GetActualPage()->GetName());
+ }
+
+ // Move slide 'Test 2' down
+ for (size_t i = 2; i < 4; ++i)
+ {
+ dispatchCommand(mxComponent, ".uno:MovePageDown", {});
+ Scheduler::ProcessEventsToIdle();
+ checkCurrentPageNumber(i);
+ CPPUNIT_ASSERT_EQUAL(OUString("Test 2"), pViewShell->GetActualPage()->GetName());
+ }
+
+ // Move slide 'Test 2' to the top
+ dispatchCommand(mxComponent, ".uno:MovePageFirst", {});
+ Scheduler::ProcessEventsToIdle();
+ checkCurrentPageNumber(1);
+ CPPUNIT_ASSERT_EQUAL(OUString("Test 2"), pViewShell->GetActualPage()->GetName());
+
+ // Move slide 'Test 2' to the bottom
+ dispatchCommand(mxComponent, ".uno:MovePageLast", {});
+ Scheduler::ProcessEventsToIdle();
+ checkCurrentPageNumber(3);
+ CPPUNIT_ASSERT_EQUAL(OUString("Test 2"), pViewShell->GetActualPage()->GetName());
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf148620)
+{
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+
+ auto pXImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ uno::Reference<text::XTextRange> xShape(xDrawPage->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString(u""), xShape->getString());
+
+ insertStringToObject(1, "one", /*bUseEscape*/ false);
+ typeKey(pXImpressDocument, KEY_RETURN);
+ typeString(pXImpressDocument, "two");
+ typeKey(pXImpressDocument, KEY_RETURN);
+ typeString(pXImpressDocument, "three");
+ typeKey(pXImpressDocument, KEY_RETURN);
+ typeString(pXImpressDocument, "four");
+ typeKey(pXImpressDocument, KEY_RETURN);
+ typeString(pXImpressDocument, "five");
+ typeKey(pXImpressDocument, KEY_RETURN);
+ typeString(pXImpressDocument, "six");
+
+ CPPUNIT_ASSERT_EQUAL(OUString(u"One\nTwo\nThree\nFour\nFive\nsix"), xShape->getString());
+
+ uno::Sequence<beans::PropertyValue> aArgs(
+ comphelper::InitPropertySequence({ { "KeyModifier", uno::Any(sal_Int32(0)) } }));
+ dispatchCommand(mxComponent, ".uno:OutlineUp", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(OUString(u"One\nTwo\nThree\nFour\nsix\nFive"), xShape->getString());
+
+ dispatchCommand(mxComponent, ".uno:OutlineUp", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(OUString(u"One\nTwo\nThree\nsix\nFour\nFive"), xShape->getString());
+
+ dispatchCommand(mxComponent, ".uno:OutlineUp", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(OUString(u"One\nTwo\nsix\nThree\nFour\nFive"), xShape->getString());
+
+ dispatchCommand(mxComponent, ".uno:OutlineUp", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(OUString(u"One\nsix\nTwo\nThree\nFour\nFive"), xShape->getString());
+
+ dispatchCommand(mxComponent, ".uno:OutlineUp", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(OUString(u"six\nOne\nTwo\nThree\nFour\nFive"), xShape->getString());
+
+ dispatchCommand(mxComponent, ".uno:OutlineDown", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(OUString(u"One\nsix\nTwo\nThree\nFour\nFive"), xShape->getString());
+
+ dispatchCommand(mxComponent, ".uno:OutlineDown", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(OUString(u"One\nTwo\nsix\nThree\nFour\nFive"), xShape->getString());
+
+ dispatchCommand(mxComponent, ".uno:OutlineDown", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(OUString(u"One\nTwo\nThree\nsix\nFour\nFive"), xShape->getString());
+
+ dispatchCommand(mxComponent, ".uno:OutlineDown", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(OUString(u"One\nTwo\nThree\nFour\nsix\nFive"), xShape->getString());
+
+ dispatchCommand(mxComponent, ".uno:OutlineDown", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(OUString(u"One\nTwo\nThree\nFour\nFive\nsix"), xShape->getString());
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf141703)
+{
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+
+ auto pXImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+
+ uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence(
+ { { "Rows", uno::Any(sal_Int32(2)) }, { "Columns", uno::Any(sal_Int32(2)) } }));
+
+ dispatchCommand(mxComponent, ".uno:InsertTable", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // Move to A1 using Alt + Tab and write 'A'
+ for (int i = 0; i < 3; i++)
+ {
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_TAB);
+ pXImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_SHIFT | KEY_TAB);
+ Scheduler::ProcessEventsToIdle();
+ }
+
+ typeString(pXImpressDocument, "A");
+
+ // Move to A2 with Tab and write 'B'
+ typeKey(pXImpressDocument, KEY_TAB);
+
+ typeString(pXImpressDocument, "B");
+
+ typeKey(pXImpressDocument, KEY_ESCAPE);
+
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ auto pTableObject = dynamic_cast<sdr::table::SdrTableObj*>(pActualPage->GetObj(2));
+ CPPUNIT_ASSERT(pTableObject);
+
+ uno::Reference<css::table::XTable> xTable(pTableObject->getTable(), uno::UNO_SET_THROW);
+ uno::Reference<css::table::XMergeableCell> xCellA1(xTable->getCellByPosition(0, 0),
+ uno::UNO_QUERY_THROW);
+ uno::Reference<css::table::XMergeableCell> xCellA2(xTable->getCellByPosition(1, 0),
+ uno::UNO_QUERY_THROW);
+
+ uno::Reference<text::XText> xTextA1
+ = uno::Reference<text::XTextRange>(xCellA1, uno::UNO_QUERY_THROW)->getText();
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: A
+ // - Actual :
+ CPPUNIT_ASSERT_EQUAL(OUString("A"), xTextA1->getString());
+
+ uno::Reference<text::XText> xTextA2
+ = uno::Reference<text::XTextRange>(xCellA2, uno::UNO_QUERY_THROW)->getText();
+ CPPUNIT_ASSERT_EQUAL(OUString("B"), xTextA2->getString());
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf127481)
+{
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+
+ auto pXImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), pActualPage->GetObjCount());
+
+ uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence(
+ { { "Rows", uno::Any(sal_Int32(1)) }, { "Columns", uno::Any(sal_Int32(1)) } }));
+
+ dispatchCommand(mxComponent, ".uno:InsertTable", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pActualPage->GetObjCount());
+
+ dispatchCommand(mxComponent, ".uno:DuplicatePage", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ checkCurrentPageNumber(2);
+
+ pActualPage = pViewShell->GetActualPage();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pActualPage->GetObjCount());
+
+ auto pTableObject = dynamic_cast<sdr::table::SdrTableObj*>(pActualPage->GetObj(2));
+ CPPUNIT_ASSERT(pTableObject);
+
+ //without the fix, it would crash here
+ pViewShell->GetView()->SdrBeginTextEdit(pTableObject);
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pActualPage->GetObjCount());
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testPageFillColor)
+{
+ // Load the document and create two new windows.
+ mxComponent = loadFromDesktop(m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf126197.odp"));
+ auto pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell();
+
+ // Set FillPageColor
+
+ uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence({
+ { "Color", uno::Any(OUString("ff0000")) },
+ }));
+
+ dispatchCommand(mxComponent, ".uno:FillPageColor", aPropertyValues);
+
+ SdPage* pPage = pViewShell->getCurrentPage();
+ const SfxItemSet& rPageAttr = pPage->getSdrPageProperties().GetItemSet();
+
+ const XFillStyleItem* pFillStyle = rPageAttr.GetItem(XATTR_FILLSTYLE);
+ drawing::FillStyle eXFS = pFillStyle->GetValue();
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, eXFS);
+
+ Color aColor = rPageAttr.GetItem(XATTR_FILLCOLOR)->GetColorValue();
+ CPPUNIT_ASSERT_EQUAL(Color(0xff0000), aColor);
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testPageFillGradient)
+{
+ // Load the document and create two new windows.
+ mxComponent = loadFromDesktop(m_directories.getURLFromSrc(u"sd/qa/unit/data/tdf126197.odp"));
+ auto pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell();
+
+ // Set FillPageColor
+
+ uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence({
+ { "FillPageGradientJSON",
+ uno::Any(
+ OUString("{\"style\":\"LINEAR\",\"startcolor\":\"ff0000\",\"endcolor\":\"0000ff\","
+ "\"angle\":\"300\",\"border\":\"0\",\"x\":\"0\",\"y\":\"0\",\"intensstart\":"
+ "\"100\",\"intensend\":\"100\",\"stepcount\":\"0\"}")) },
+ }));
+
+ dispatchCommand(mxComponent, ".uno:FillPageGradient", aPropertyValues);
+
+ SdPage* pPage = pViewShell->getCurrentPage();
+ const SfxItemSet& rPageAttr = pPage->getSdrPageProperties().GetItemSet();
+
+ const XFillStyleItem* pFillStyle = rPageAttr.GetItem(XATTR_FILLSTYLE);
+ drawing::FillStyle eXFS = pFillStyle->GetValue();
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, eXFS);
+
+ XGradient aGradient = rPageAttr.GetItem(XATTR_FILLGRADIENT)->GetGradientValue();
+ CPPUNIT_ASSERT_EQUAL(Color(0xff0000), aGradient.GetStartColor());
+ CPPUNIT_ASSERT_EQUAL(Color(0x0000ff), aGradient.GetEndColor());
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf134053)
+{
+ // Error was, that dashes and dots were longer than in MS Office.
+ mxComponent = loadFromDesktop(
+ m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf134053_dashdot.pptx"));
+ auto pXImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ SdPage* pActualPage = pViewShell->GetActualPage();
+ SdrObject* pShape = pActualPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("No Shape", pShape);
+
+ SdDrawDocument* pDocument = pXImpressDocument->GetDoc();
+ sd::UndoManager* pUndoManager = pDocument->GetUndoManager();
+
+ // tdf#114613: Without the fix in place, this test would have failed with
+ // - Expected: 0
+ // - Actual : 8
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pUndoManager->GetUndoActionCount());
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pUndoManager->GetRedoActionCount());
+
+ XDash dash = pShape->GetMergedItem(XATTR_LINEDASH).GetDashValue();
+
+ // Because 0% is not possible as dash length (as of June 2020) 1% is used in the fix.
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Distance", 399.0, dash.GetDistance());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Dot length", 301.0, dash.GetDotLen());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Dash length", 1.0, dash.GetDashLen());
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testSpellOnlineParameter)
+{
+ mxComponent = loadFromDesktop(m_directories.getURLFromSrc(u"sd/qa/unit/data/empty.fodp"));
+ auto pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ bool bSet = pImpressDocument->GetDoc()->GetOnlineSpell();
+
+ uno::Sequence<beans::PropertyValue> params(
+ comphelper::InitPropertySequence({ { "Enable", uno::Any(!bSet) } }));
+ dispatchCommand(mxComponent, ".uno:SpellOnline", params);
+ CPPUNIT_ASSERT_EQUAL(!bSet, pImpressDocument->GetDoc()->GetOnlineSpell());
+
+ // set the same state as now and we don't expect any change (no-toggle)
+ params = comphelper::InitPropertySequence({ { "Enable", uno::Any(!bSet) } });
+ dispatchCommand(mxComponent, ".uno:SpellOnline", params);
+ CPPUNIT_ASSERT_EQUAL(!bSet, pImpressDocument->GetDoc()->GetOnlineSpell());
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf38669)
+{
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+ auto pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ CPPUNIT_ASSERT(pImpressDocument);
+
+ // Insert shape with ctrl key
+ uno::Sequence<beans::PropertyValue> aArgs(
+ comphelper::InitPropertySequence({ { "KeyModifier", uno::Any(KEY_MOD1) } }));
+ dispatchCommand(mxComponent, ".uno:BasicShapes.rectangle", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xDraws = xDrawPagesSupplier->getDrawPages();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xDraws->getCount());
+
+ // Insert an UTF-8 character (176 is the code of the degree sign, i.e., '°')
+ pImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 176, 0);
+ pImpressDocument->postKeyEvent(LOK_KEYEVENT_KEYUP, 176, 0);
+ Scheduler::ProcessEventsToIdle();
+
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ uno::Reference<text::XTextRange> xShape(xDrawPage->getByIndex(2), uno::UNO_QUERY);
+ // Without the fix in place, this test would have failed with:
+ // - Expected: °
+ // - Actual : ã…€
+ CPPUNIT_ASSERT_EQUAL(OUString(u"°"), xShape->getString());
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf123841)
+{
+ // To check if selecting unfilled rectangle produces unfilled rectangle
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+ auto pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ CPPUNIT_ASSERT(pImpressDocument);
+
+ uno::Sequence<beans::PropertyValue> aArgs(
+ comphelper::InitPropertySequence({ { "KeyModifier", uno::Any(KEY_MOD1) } }));
+ dispatchCommand(mxComponent, ".uno:Rect_Unfilled", aArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xDraws = xDrawPagesSupplier->getDrawPages();
+
+ int getShapes = xDraws->getCount();
+ CPPUNIT_ASSERT_EQUAL(1, getShapes);
+
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+
+ for (int i = 0; i < 3; i++)
+ {
+ uno::Reference<beans::XPropertySet> XPropSet(xDrawPage->getByIndex(i), uno::UNO_QUERY);
+ drawing::FillStyle eFillStyle = drawing::FillStyle_NONE;
+ XPropSet->getPropertyValue("FillStyle") >>= eFillStyle;
+
+ // Without the fix in place, this test would have failed with
+ // with drawing::FillStyle_NONE != drawing::FillStyle_SOLID
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, eFillStyle);
+ }
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testSearchAllInDocumentAndNotes)
+{
+ // tdf#142478
+ // "find all" produces a crash when the search string exists in notes
+ // and the document
+
+ mxComponent = loadFromDesktop(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/search-all-notes.odp"));
+
+ auto pXImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell();
+ CPPUNIT_ASSERT(pViewShell);
+
+ lcl_search("Crash", /*bFindAll=*/true, /*bBackwards=*/true);
+}
+
+#if !defined(_WIN32) && !defined(MACOSX)
+// for some reason, the search for "second" (or "Second") didn't return page 2 in WIN and MACOS
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf123658_SearchAfterSlideChange)
+{
+ mxComponent = loadFromDesktop(
+ m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf123658_SearchAfterSlideChange.odp"));
+
+ auto pXImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+
+ lcl_search("second");
+ checkCurrentPageNumber(2);
+
+ pXImpressDocument->setPart(0); // Switch to 1st page
+
+ lcl_search("of");
+ // Instead of finding this on the 1st page (or on the 2nd page would be acceptable too)
+ // it was going to the third page.
+ checkCurrentPageNumber(1);
+}
+#endif
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf142589)
+{
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+
+ auto pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell();
+
+ SfxRequest aRequest(pViewShell->GetViewFrame(), SID_PRESENTATION);
+ pImpressDocument->GetDoc()->getPresentationSettings().mbCustomShow = true;
+ pImpressDocument->GetDoc()->getPresentationSettings().mbStartCustomShow = true;
+ sd::slideshowhelp::ShowSlideShow(aRequest, *pImpressDocument->GetDoc());
+ CPPUNIT_ASSERT_EQUAL(false, pImpressDocument->GetDoc()->getPresentationSettings().mbCustomShow);
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testCharColorTheme)
+{
+ // Given an Impress document with a shape, with its text selected:
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+ uno::Reference<drawing::XDrawPagesSupplier> xPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xPage(xPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ uno::Reference<text::XTextRange> xShape(xPage->getByIndex(0), uno::UNO_QUERY);
+ {
+ uno::Reference<text::XSimpleText> xText = xShape->getText();
+ xText->insertString(xText->getStart(), "test", false);
+ }
+ uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
+ uno::Reference<view::XSelectionSupplier> xController(xModel->getCurrentController(),
+ uno::UNO_QUERY);
+ xController->select(uno::Any(xShape));
+ Scheduler::ProcessEventsToIdle();
+ dispatchCommand(mxComponent, ".uno:Text", {});
+ Scheduler::ProcessEventsToIdle();
+ auto pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell();
+ SdrView* pView = pViewShell->GetView();
+ CPPUNIT_ASSERT(pView->IsTextEdit());
+ dispatchCommand(mxComponent, ".uno:SelectAll", {});
+ Scheduler::ProcessEventsToIdle();
+
+ // When picking a theme color on the sidebar:
+ uno::Sequence<beans::PropertyValue> aColorArgs = {
+ comphelper::makePropertyValue("Color", static_cast<sal_Int32>(0xdae3f3)), // 80% light blue
+ comphelper::makePropertyValue("ColorThemeIndex", static_cast<sal_Int16>(4)), // accent 1
+ comphelper::makePropertyValue("ColorLumMod", static_cast<sal_Int16>(2000)),
+ comphelper::makePropertyValue("ColorLumOff", static_cast<sal_Int16>(8000)),
+ };
+ dispatchCommand(mxComponent, ".uno:Color", aColorArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // Then make sure the theme "metadata" is set in the document model:
+ pView->EndTextEditCurrentView();
+ CPPUNIT_ASSERT(!pView->IsTextEdit());
+ uno::Reference<container::XEnumerationAccess> xShapeParaAccess(xShape, uno::UNO_QUERY);
+ uno::Reference<container::XEnumerationAccess> xPara(
+ xShapeParaAccess->createEnumeration()->nextElement(), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xPortion(xPara->createEnumeration()->nextElement(),
+ uno::UNO_QUERY);
+ sal_Int16 nCharColorTheme{};
+ xPortion->getPropertyValue("CharColorTheme") >>= nCharColorTheme;
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 4
+ // - Actual : -1
+ // i.e. the theme index (accent1) was not set.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(4), nCharColorTheme);
+ sal_Int16 nCharColorLumMod{};
+ xPortion->getPropertyValue("CharColorLumMod") >>= nCharColorLumMod;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(2000), nCharColorLumMod);
+ sal_Int16 nCharColorLumOff{};
+ xPortion->getPropertyValue("CharColorLumOff") >>= nCharColorLumOff;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(8000), nCharColorLumOff);
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testFillColorTheme)
+{
+ // Given an Impress document with a selected shape:
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+ uno::Reference<drawing::XDrawPagesSupplier> xPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xPage(xPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xShape(xPage->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
+ uno::Reference<view::XSelectionSupplier> xController(xModel->getCurrentController(),
+ uno::UNO_QUERY);
+ xController->select(uno::Any(xShape));
+
+ // When setting the fill color of that shape, with theme metadata & effects:
+ uno::Sequence<beans::PropertyValue> aColorArgs = {
+ comphelper::makePropertyValue("FillColor", static_cast<sal_Int32>(0xed7d31)), // orange
+ comphelper::makePropertyValue("ColorThemeIndex", static_cast<sal_Int16>(4)), // accent 1
+ comphelper::makePropertyValue("ColorLumMod", static_cast<sal_Int16>(4000)),
+ comphelper::makePropertyValue("ColorLumOff", static_cast<sal_Int16>(6000)),
+ };
+ dispatchCommand(mxComponent, ".uno:FillColor", aColorArgs);
+ Scheduler::ProcessEventsToIdle();
+
+ // Then make sure the theme index is not lost when the sidebar sets it:
+ sal_Int16 nFillColorTheme{};
+ xShape->getPropertyValue("FillColorTheme") >>= nFillColorTheme;
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 4
+ // - Actual : -1
+ // i.e. the theme index was lost during the dispatch of the command.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(4), nFillColorTheme);
+
+ // Then also verify the effects:
+ sal_Int16 nFillColorLumMod = 10000;
+ xShape->getPropertyValue("FillColorLumMod") >>= nFillColorLumMod;
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 4000
+ // - Actual : 10000
+ // i.e. the theme index was set, but not the effects.
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(4000), nFillColorLumMod);
+ sal_Int16 nFillColorLumOff = 0;
+ xShape->getPropertyValue("FillColorLumOff") >>= nFillColorLumOff;
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(6000), nFillColorLumOff);
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testFillColorNoColor)
+{
+ // Given an empty Impress document:
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+ auto pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get());
+ sd::ViewShell* pViewShell = pImpressDocument->GetDocShell()->GetViewShell();
+ SfxDispatcher* pDispatcher = pViewShell->GetViewFrame()->GetDispatcher();
+
+ // When dispatching a fill color that only has a fill style (no color), then make sure we don't
+ // crash:
+ XFillStyleItem aXFillStyleItem(drawing::FillStyle_NONE);
+ pDispatcher->ExecuteList(SID_ATTR_FILL_COLOR, SfxCallMode::RECORD, { &aXFillStyleItem });
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testTdf127696)
+{
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+
+ dispatchCommand(mxComponent, ".uno:InsertPage", {});
+ Scheduler::ProcessEventsToIdle();
+
+ insertStringToObject(0, "Test", /*bUseEscape*/ false);
+ dispatchCommand(mxComponent, ".uno:SelectAll", {});
+ dispatchCommand(mxComponent, ".uno:OutlineFont", {});
+
+ // Save it as PPTX and load it again.
+ utl::TempFile aTempFile;
+ save(dynamic_cast<SdXImpressDocument*>(mxComponent.get())->GetDocShell(), getFormat(PPTX),
+ aTempFile);
+ mxComponent = loadFromDesktop(aTempFile.GetURL());
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(1),
+ uno::UNO_QUERY);
+
+ uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY);
+
+ uno::Reference<text::XText> xText
+ = uno::Reference<text::XTextRange>(xShape, uno::UNO_QUERY_THROW)->getText();
+ CPPUNIT_ASSERT_MESSAGE("Not a text shape", xText.is());
+
+ uno::Reference<container::XEnumerationAccess> paraEnumAccess(xText, uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> paraEnum(paraEnumAccess->createEnumeration());
+
+ uno::Reference<text::XTextRange> xParagraph(paraEnum->nextElement(), uno::UNO_QUERY_THROW);
+
+ uno::Reference<container::XEnumerationAccess> runEnumAccess(xParagraph, uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> runEnum = runEnumAccess->createEnumeration();
+
+ uno::Reference<text::XTextRange> xRun(runEnum->nextElement(), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY_THROW);
+
+ bool bContoured = false;
+ xPropSet->getPropertyValue("CharContoured") >>= bContoured;
+ CPPUNIT_ASSERT(bContoured);
+}
+
+CPPUNIT_TEST_FIXTURE(SdUiImpressTest, testThemeShapeInsert)
+{
+ // Given a document with a theme, accent1 color is set to 0x000004:
+ mxComponent = loadFromDesktop("private:factory/simpress",
+ "com.sun.star.presentation.PresentationDocument");
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+ uno::Reference<drawing::XMasterPageTarget> xMasterPageTarget(xDrawPage, uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xMasterPage(xMasterPageTarget->getMasterPage(),
+ uno::UNO_QUERY);
+ comphelper::SequenceAsHashMap aMap;
+ aMap["Name"] <<= OUString("mytheme");
+ aMap["ColorSchemeName"] <<= OUString("mycolorscheme");
+ uno::Sequence<util::Color> aColorScheme
+ = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb };
+ aMap["ColorScheme"] <<= aColorScheme;
+ uno::Any aTheme(aMap.getAsConstPropertyValueList());
+ xMasterPage->setPropertyValue("Theme", aTheme);
+
+ // When inserting a shape:
+ uno::Sequence<beans::PropertyValue> aArgs = {
+ comphelper::makePropertyValue("CreateDirectly", true),
+ };
+ dispatchCommand(mxComponent, ".uno:BasicShapes.round-rectangle", aArgs);
+
+ // Then make sure the that fill color of the last shape is the accent1 color:
+ sal_Int32 nShapeIndex = xDrawPage->getCount() - 1;
+ uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(nShapeIndex), uno::UNO_QUERY);
+ sal_Int32 nFillColor{};
+ xShape->getPropertyValue("FillColor") >>= nFillColor;
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 0 / 0x000004 (~black)
+ // - Actual : 7512015 / 0x729fcf (~blue)
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0x4), nFillColor);
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/uimpress.cxx b/sd/qa/unit/uimpress.cxx
new file mode 100644
index 000000000..bd6bb16a7
--- /dev/null
+++ b/sd/qa/unit/uimpress.cxx
@@ -0,0 +1,110 @@
+/* -*- 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 <sal/types.h>
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <cppuhelper/bootstrap.hxx>
+#include <comphelper/processfactory.hxx>
+
+#include <vcl/svapp.hxx>
+#include <svx/svdpage.hxx>
+#include <sddll.hxx>
+#include <drawdoc.hxx>
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/lang/XMultiComponentFactory.hpp>
+
+using namespace ::com::sun::star;
+
+namespace {
+
+class Test : public CppUnit::TestFixture {
+public:
+ Test();
+
+ virtual void setUp() override;
+ virtual void tearDown() override;
+
+ void testAddPage();
+ void testCustomShow();
+
+ CPPUNIT_TEST_SUITE(Test);
+ CPPUNIT_TEST(testAddPage);
+ CPPUNIT_TEST(testCustomShow);
+ CPPUNIT_TEST_SUITE_END();
+
+private:
+ uno::Reference< uno::XComponentContext > m_xContext;
+ std::unique_ptr<SdDrawDocument> m_pDoc;
+};
+
+Test::Test()
+ : m_xContext(cppu::defaultBootstrap_InitialComponentContext())
+{
+
+ uno::Reference<lang::XMultiComponentFactory> xFactory(m_xContext->getServiceManager());
+ uno::Reference<lang::XMultiServiceFactory> xSM(xFactory, uno::UNO_QUERY_THROW);
+
+ //Without this we're crashing because callees are using
+ //getProcessServiceFactory. In general those should be removed in favour
+ //of retaining references to the root ServiceFactory as it's passed around
+ comphelper::setProcessServiceFactory(xSM);
+
+ InitVCL();
+
+ SdDLL::Init();
+}
+
+void Test::setUp()
+{
+ m_pDoc.reset(new SdDrawDocument(DocumentType::Impress, nullptr));
+}
+
+void Test::tearDown()
+{
+ m_pDoc.reset();
+}
+
+void Test::testAddPage()
+{
+ rtl::Reference<SdrPage> pPage = m_pDoc->AllocPage(false);
+ m_pDoc->InsertPage(pPage.get());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("added one page to model",
+ static_cast<sal_uInt16>(1), m_pDoc->GetPageCount());
+ m_pDoc->DeletePage(0);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("removed one page to model",
+ static_cast<sal_uInt16>(0), m_pDoc->GetPageCount());
+
+ rtl::Reference<SdrPage> pMasterPage = m_pDoc->AllocPage(true);
+ m_pDoc->InsertMasterPage(pMasterPage.get());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("added one master page to model",
+ static_cast<sal_uInt16>(1), m_pDoc->GetMasterPageCount());
+ m_pDoc->DeleteMasterPage(0);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("removed one master page to model",
+ static_cast<sal_uInt16>(0), m_pDoc->GetMasterPageCount());
+}
+
+void Test::testCustomShow()
+{
+ CPPUNIT_ASSERT_MESSAGE("test generation of custom show list!",
+ m_pDoc->GetCustomShowList(true));
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(Test);
+
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unoapi/knownissues.xcl b/sd/qa/unoapi/knownissues.xcl
new file mode 100644
index 000000000..d9e069001
--- /dev/null
+++ b/sd/qa/unoapi/knownissues.xcl
@@ -0,0 +1,86 @@
+#
+# 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 .
+#
+
+### tdf#115345 - not useful to set Orientation ###
+sd.SdDrawPage::com::sun::star::drawing::GenericDrawPage
+sd.SdGenericDrawPage::com::sun::star::drawing::GenericDrawPage
+sd.SdMasterPage::com::sun::star::drawing::GenericDrawPage
+
+### i84994 ###
+sd.SdXImpressDocument::com::sun::star::view::XPrintable
+# -> disabled in sd.sce
+
+### i34994 ###
+sd.SdXPresentation::com::sun::star::presentation::Presentation
+
+### i53605 ###
+sd.DrawController_OutlineView::com::sun::star::awt::XUserInputInterception
+sd.DrawController_PresentationView::com::sun::star::awt::XUserInputInterception
+sd.DrawController_DrawView::com::sun::star::awt::XUserInputInterception
+sd.DrawController_HandoutView::com::sun::star::awt::XUserInputInterception
+sd.DrawController_NotesView::com::sun::star::awt::XUserInputInterception
+
+### i63664 ###
+sd.DrawController_OutlineView::com::sun::star::view::XSelectionSupplier
+sd.DrawController_PresentationView::com::sun::star::view::XSelectionSupplier
+
+### i65255 ###
+sd.DrawController_OutlineView::com::sun::star::drawing::DrawingDocumentDrawView
+sd.DrawController_PresentationView::com::sun::star::drawing::DrawingDocumentDrawView
+sd.DrawController_DrawView::com::sun::star::drawing::DrawingDocumentDrawView
+sd.DrawController_HandoutView::com::sun::star::drawing::DrawingDocumentDrawView
+sd.DrawController_NotesView::com::sun::star::drawing::DrawingDocumentDrawView
+
+### i65256 ###
+sd.DrawController_PresentationView::com::sun::star::drawing::XDrawView
+sd.DrawController_HandoutView::com::sun::star::drawing::XDrawView
+sd.DrawController_NotesView::com::sun::star::drawing::XDrawView
+
+### i84992 ###
+sd.DrawController_NotesView::com::sun::star::ui::XContextMenuInterception
+sd.DrawController_OutlineView::com::sun::star::ui::XContextMenuInterception
+sd.DrawController_HandoutView::com::sun::star::ui::XContextMenuInterception
+sd.DrawController_PresentationView::com::sun::star::ui::XContextMenuInterception
+sd.DrawController_DrawView::com::sun::star::ui::XContextMenuInterception
+
+### i87746 ###
+sd.SdXShape::com::sun::star::drawing::Shape::Style
+# -> disabled in sd.sce
+
+### i88256 ###
+sd.SdXCustomPresentationAccess::com::sun::star::container::XNameReplace
+
+### i88309 ###
+sd.DrawController_OutlineView::com::sun::star::frame::XController
+
+### i88537 ###
+sd.DrawController_OutlineView::com::sun::star::beans::XPropertySet
+
+### i88537 ###
+sd.DrawController_PresentationView::com::sun::star::beans::XPropertySet
+
+### i109518 ###
+sd.SdXPresentation::com::sun::star::presentation::XPresentation
+sd.SdXPresentation::com::sun::star::beans::XPropertySet
+
+### i113161 ###
+sd.SdLayer::com::sun::star::beans::XPropertySet
+sd.SdLayer::com::sun::star::drawing::Layer
+
+### i113386 ###
+sd.AccessibleDrawDocumentView::com::sun::star::accessibility::XAccessibleComponent
diff --git a/sd/qa/unoapi/sd.sce b/sd/qa/unoapi/sd.sce
new file mode 100644
index 000000000..3ba62b02d
--- /dev/null
+++ b/sd/qa/unoapi/sd.sce
@@ -0,0 +1,41 @@
+#
+# 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 .
+#
+
+-o sd.AccessibleDrawDocumentView
+#i111199 -o sd.AccessibleOutlineView
+#i35935# -o sd.AccessibleSlideView
+#i111042# -o sd.DrawController_DrawView
+#i111042# -o sd.DrawController_HandoutView
+#i111042# -o sd.DrawController_NotesView
+#i111043# -o sd.DrawController_OutlineView
+#i111042# -o sd.DrawController_PresentationView
+-o sd.SdDocLinkTargets
+-o sd.SdDrawPage
+-o sd.SdDrawPagesAccess
+-o sd.SdGenericDrawPage
+-o sd.SdLayer
+-o sd.SdLayerManager
+-o sd.SdMasterPage
+-o sd.SdMasterPagesAccess
+-o sd.SdPageLinkTargets
+-o sd.SdXCustomPresentation
+#i111329 -o sd.SdXCustomPresentationAccess
+#i84994# -o sd.SdXImpressDocument
+-o sd.SdXPresentation
+#i87746 -o sd.SdXShape
+
diff --git a/sd/res/buttons/elementary.zip b/sd/res/buttons/elementary.zip
new file mode 100644
index 000000000..3bb99b9c7
--- /dev/null
+++ b/sd/res/buttons/elementary.zip
Binary files differ
diff --git a/sd/res/buttons/round-white.zip b/sd/res/buttons/round-white.zip
new file mode 100644
index 000000000..9c5f1b2aa
--- /dev/null
+++ b/sd/res/buttons/round-white.zip
Binary files differ
diff --git a/sd/res/buttons/simple.zip b/sd/res/buttons/simple.zip
new file mode 100644
index 000000000..60c0b0957
--- /dev/null
+++ b/sd/res/buttons/simple.zip
Binary files differ
diff --git a/sd/res/buttons/sukapura.zip b/sd/res/buttons/sukapura.zip
new file mode 100644
index 000000000..80cccc6bc
--- /dev/null
+++ b/sd/res/buttons/sukapura.zip
Binary files differ
diff --git a/sd/res/webview/common.inc b/sd/res/webview/common.inc
new file mode 100644
index 000000000..8a26d7f7a
--- /dev/null
+++ b/sd/res/webview/common.inc
@@ -0,0 +1,128 @@
+/*
+ * 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 .
+ */
+
+<%
+
+public const cnRefreshTime = 5 ' refresh time in seconds
+
+' filename for file with all pictures and file containing the name of the current picture
+public const csFilePicture= "picture.txt"
+public const csFileCurrent= "currpic.txt"
+
+' constants for file-access
+const ForReading = 1
+const ForWriting = 2
+
+' new-line delimiter
+Dim FILE_LINE_DELIMITER
+FILE_LINE_DELIMITER = vbCRLF
+
+'/**
+' * Get data from file using a given separator.
+' */
+function File_getDataVirtual( sFilename, sServerPath, sSeparator )
+ call Err.Clear()
+
+ Dim aFSObject, sServerFileName
+
+ Set aFSObject = CreateObject("Scripting.FileSystemObject")
+ sServerFileName = aFSObject.BuildPath( Server.MapPath( sServerPath ), sFileName )
+
+ File_getDataVirtual = ""
+ if Err.Number = 0 then
+ File_getDataVirtual = File_read( sServerFileName )
+ If Not IsNull(File_getDataVirtual) Then
+ File_getDataVirtual = Replace( File_getDataVirtual, FILE_LINE_DELIMITER, sSeparator)
+ File_getDataVirtual = Split( File_getDataVirtual, sSeparator)
+ End If
+ end if
+end function
+
+'/**
+' * Get data from a file
+' */
+function File_read( sFilename )
+ call Err.Clear()
+
+ Dim aFSObject, aStream
+
+ Set aFSObject = CreateObject( "Scripting.FileSystemObject" )
+ Set aStream = aFSObject.OpenTextFile( sFilename, ForReading )
+
+ while not aStream.AtEndOfStream
+ File_read = File_read + aStream.ReadLine + FILE_LINE_DELIMITER
+ wend
+
+ aStream.Close
+end function
+
+'/**
+' * Get data from a file given by filename and virtual pathname
+' */
+Function File_readVirtual(sFileName, sServerPath)
+ call Err.Clear()
+
+ Dim aFSObject, sServerFileName
+
+ Set aFSObject = CreateObject("Scripting.FileSystemObject")
+ sServerFileName = aFSObject.BuildPath( Server.MapPath( sServerPath ), sFileName )
+
+ File_readVirtual = ""
+ if Err.Number = 0 then
+ File_readVirtual = File_read( sServerFileName )
+ end if
+End Function
+
+'/**
+' * Write data to a file
+' */
+function File_write( sFileName, sText )
+ call Err.Clear()
+
+ Dim aFSObject, aFile
+
+ Set aFSObject = CreateObject( "Scripting.FileSystemObject" )
+ if Err.Number = 0 then
+ Set aFile = aFSObject.CreateTextFile( sFileName, TRUE )
+ if Err.Number = 0 then
+ aFile.Write( sText )
+ aFile.Close
+ end if
+ end if
+
+ File_write = ( Err.Number = 0 )
+end function
+
+'/**
+' * Write data to a file given by filename and virtual pathname
+' */
+function File_writeVirtual( sFileName, sServerPath, sText )
+ call Err.Clear()
+
+ Dim aFSObject, aServerFile
+
+ Set aFSObject = CreateObject( "Scripting.FileSystemObject" )
+ aServerFile = aFSObject.BuildPath( Server.MapPath( sServerPath ), sFileName )
+
+ If Err.Number = 0 Then
+ File_writeVirtual = File_write( aServerFile, sText )
+ else
+ File_writeVirtual = false
+ End If
+end function
+%> \ No newline at end of file
diff --git a/sd/res/webview/common.pl b/sd/res/webview/common.pl
new file mode 100644
index 000000000..69c9c1d71
--- /dev/null
+++ b/sd/res/webview/common.pl
@@ -0,0 +1,66 @@
+#
+# 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 .
+#
+
+package common;
+
+$REFRESH_TIME = 5;
+
+sub File_read
+{
+ $sFilename = @_[ 0 ];
+
+ @aFileContentList = "";
+ open( F_CURRPIC, "<" . $sFilename ) || "Could not open file " . $sFilename . " !<BR>\n";
+ while( <F_CURRPIC> )
+ {
+ push( @aFileContentList, $_ );
+ }
+ close( F_CURRPIC );
+
+ return @aFileContentList;
+} ##File_read
+
+
+sub HTTP_getRequest
+{
+ # post- or get- method ?
+ if( $ENV{ 'REQUEST_METHOD' } eq 'GET' )
+ {
+ # get parameters from querystring (get)
+ $sRequest = $ENV{ 'QUERY_STRING' }
+ }
+ else
+ {
+ # get parameters from stdin (post)
+ read( STDIN, $sRequest, $ENV{ 'CONTENT_LENGTH' } );
+ }
+ # process parameters
+ @aRequestList = split( /&/, $sRequest );
+ foreach $Feld ( @aRequestList )
+ {
+ ( $name, $sValue ) = split( /=/, $Feld );
+ $sValue =~ tr/+/ /;
+ $sValue =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+ $sValue =~ s/<!--(.|\n)*-->//g;
+ $aRequestMap{ $name } = $sValue;
+ }
+
+ return %aRequestMap;
+} ##HTTP_getRequest
+
+1;
diff --git a/sd/res/webview/edit.asp b/sd/res/webview/edit.asp
new file mode 100644
index 000000000..6d5f7291a
--- /dev/null
+++ b/sd/res/webview/edit.asp
@@ -0,0 +1,26 @@
+<HTML>
+<!--
+ * 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 .
+-->
+<HEAD>
+ <TITLE>$$1</TITLE>
+</HEAD>
+<FRAMESET ROWS="90%,10%" FRAMEBORDER=yes>
+ <FRAME name="view" src="webcast.asp">
+ <FRAME name="edit" src="editpic.asp">
+</FRAMESET>
+</HTML> \ No newline at end of file
diff --git a/sd/res/webview/edit.pl b/sd/res/webview/edit.pl
new file mode 100644
index 000000000..bdde80c2c
--- /dev/null
+++ b/sd/res/webview/edit.pl
@@ -0,0 +1,18 @@
+<HTML>
+
+<HEAD>
+ <TITLE>$$1</TITLE>
+</HEAD>
+
+<FRAMESET ROWS="*,42,2" BORDER=0 FRAMEBORDER=0 FRAMESPACING=0>
+ <FRAME SRC="$$3show.pl" NAME="frame1" SCROLLING=yes RESIZE MARGINWIDTH=0 MARGINHEIGHT=0 FRAMEBORDER=0>
+ <FRAME SRC="$$3editpic.pl" NAME="frame3" SCROLLING=yes RESIZE MARGINWIDTH=0 MARGINHEIGHT=0 FRAMEBORDER=0>
+ <FRAME SRC="$$3poll.pl" NAME="frame2" SCROLLING=no NORESIZE MARGINWIDTH=0 MARGINHEIGHT=0 FRAMEBORDER=0>
+</FRAMESET>
+
+<NOFRAMES>
+
+<BODY BGCOLOR="white">
+ <META HTTP-EQUIV="-REFRESH" CONTENT="1;URL=$$3show.pl">
+</BODY>
+</HTML>
diff --git a/sd/res/webview/editpic.asp b/sd/res/webview/editpic.asp
new file mode 100644
index 000000000..78599e0fd
--- /dev/null
+++ b/sd/res/webview/editpic.asp
@@ -0,0 +1,75 @@
+<%
+ Option Explicit
+ Response.Expires = 0
+ Response.Buffer = True
+%>
+<!--
+ * 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 file = "common.inc" -->
+
+
+<%
+ Dim aPictureArray, nPic, nUpper
+
+ aPictureArray = File_getDataVirtual( csFilePicture, ".", ";" )
+ nPic = File_readVirtual( "currpic.txt", "." )
+ nUpper = CInt( (UBound(aPictureArray) - 1 ) / 2)
+%>
+
+<HTML>
+<HEAD>
+</HEAD>
+<BODY>
+ <FORM action="savepic.asp" method=get>
+ <%
+ if isNumeric(nPic) then
+ if (CInt( nPic ) >= CInt( (UBound(aPictureArray ) - 1 ) / 2 )) then
+ nPic = nUpper
+ end if
+ else
+ nPic = nUpper
+ end if
+
+
+ if CInt( nPic ) > 1 then
+ %>
+ <INPUT type=submit name="Auswahl" value="-"></INPUT>
+ <%
+ else
+ %>
+ <INPUT type=button value=" "></INPUT>
+ <%
+ end if
+ %>
+ <INPUT type=text name="CurrPic" value="<% = nPic %>" SIZE=3></INPUT>
+ <%
+ if CInt( nPic ) < CInt( nUpper ) then
+ %>
+ <INPUT type=submit name="Auswahl" value="+"></INPUT>
+ <%
+ else
+ %>
+ <INPUT type=button value=" "></INPUT>
+ <%
+ end if
+ %>
+ <INPUT type=submit name="Auswahl" value="$$2"></INPUT>
+ </FORM>
+</BODY>
+</HTML>
diff --git a/sd/res/webview/editpic.pl b/sd/res/webview/editpic.pl
new file mode 100644
index 000000000..c14df32e2
--- /dev/null
+++ b/sd/res/webview/editpic.pl
@@ -0,0 +1,57 @@
+#!/usr/bin/env perl
+#
+# 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 .
+#
+
+require "common.pl";
+
+print "Content-type: text/html\n\n";
+print "<HTML>\n";
+
+print "<HEAD>\n";
+print "<title>editpic.pl</title>";
+print "</HEAD>\n";
+
+print "<BODY>\n";
+ $sCurrPic = join( "", common::File_read( "currpic.txt" ) );
+ @aPictureArray = common::File_read( "picture.txt" );
+ $nPictureArrayLen = @aPictureArray;
+ print "<FORM action=\"savepic.pl\" method=get>\n";
+ if( abs( $sCurrPic ) > 1 )
+ {
+ print "<INPUT type=submit name=\"Auswahl\" value=\"-\"></INPUT>\n";
+ }
+ else
+ {
+ print "<INPUT type=button value=\" \"></INPUT>\n";
+ }
+ print "<INPUT type=text name=\"CurrPic\" value=\"";
+ print $sCurrPic;
+ print "\" SIZE=3></INPUT>\n";
+ if( abs( $sCurrPic ) < ( $nPictureArrayLen - 1 ) )
+ {
+ print "<INPUT type=submit name=\"Auswahl\" value=\"+\"></INPUT>\n";
+ }
+ else
+ {
+ print "<INPUT type=button value=\" \"></INPUT>\n";
+ }
+ print "<INPUT type=submit name=\"Auswahl\" value=\"$$2\"></INPUT>\n";
+ print "</FORM>\n";
+print "</BODY>\n";
+
+print "</HTML>\n";
diff --git a/sd/res/webview/index.pl b/sd/res/webview/index.pl
new file mode 100644
index 000000000..e0198e6d3
--- /dev/null
+++ b/sd/res/webview/index.pl
@@ -0,0 +1,17 @@
+<HTML>
+
+<HEAD>
+ <TITLE>$$1</TITLE>
+</HEAD>
+
+<FRAMESET ROWS="*" BORDER=0 FRAMEBORDER=0 FRAMESPACING=0>
+ <FRAME SRC="$$3webcast.pl" NAME="frame1" SCROLLING=yes RESIZE MARGINWIDTH=0 MARGINHEIGHT=0 FRAMEBORDER=0>
+</FRAMESET>
+
+<NOFRAMES>
+
+<BODY BGCOLOR="white">
+ <META HTTP-EQUIV="-REFRESH" CONTENT="1;URL=$$3webcast.pl">
+</BODY>;
+
+</HTML>
diff --git a/sd/res/webview/poll.asp b/sd/res/webview/poll.asp
new file mode 100644
index 000000000..0bbce4338
--- /dev/null
+++ b/sd/res/webview/poll.asp
@@ -0,0 +1,53 @@
+<%
+ Option Explicit
+ Response.Expires = 0
+%>
+<!--
+ * 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 file = "common.inc" -->
+
+<HTML>
+
+<HEAD>
+ <META http-equiv="refresh" CONTENT="<% = cnRefreshTime %>">
+</HEAD>
+
+<%
+ ' get current picture id
+ Dim nGIFID
+
+ nGifID = File_getDataVirtual( csFileCurrent, ".", ";" )( 0 )
+
+ ' a new picture was chosen ?
+ if nGIFID <> Session( "GIFID" ) then
+ ' then store the id of the new picture and show it
+ Session( "GIFID" ) = nGIFID
+ %>
+ <BODY bgcolor="red" onLoad="parent.frame1.location.href='./show.asp?<%= nGIFID %>'">
+ <%
+ else
+ %>
+ <BODY bgcolor="green">
+ <%
+ end if
+%>
+
+</BODY>
+
+</HTML> \ No newline at end of file
diff --git a/sd/res/webview/poll.pl b/sd/res/webview/poll.pl
new file mode 100644
index 000000000..6dded715d
--- /dev/null
+++ b/sd/res/webview/poll.pl
@@ -0,0 +1,49 @@
+#!/usr/bin/env perl
+#
+# 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 .
+#
+
+require "common.pl";
+
+print "Content-type: text/html\n\n";
+print "<HTML>";
+
+# get current and last shown picture id
+$sCurrPic = join( "", common::File_read( "currpic.txt" ) );
+
+%aRequestMap = common::HTTP_getRequest();
+$sLastPic = $aRequestMap{ "LastPic" };
+
+print "<HEAD>";
+ print "<META http-equiv=\"refresh\" CONTENT=\"" . $common::REFRESH_TIME . "; URL=poll.pl?LastPic=" . $sCurrPic . "\">";
+print "</HEAD>";
+
+#' a new picture was chosen ?
+if( $sLastPic ne $sCurrPic )
+{
+ # then show the new picture
+ print "<BODY bgcolor=\"red\" onLoad=\"parent.frame1.location.href='./show.pl?" . $sCurrPic . "'\">";
+}
+else
+{
+ # otherwise do nothing
+ print "<BODY bgcolor=\"green\">";
+}
+
+print "</BODY>";
+
+print "</HTML>";
diff --git a/sd/res/webview/savepic.asp b/sd/res/webview/savepic.asp
new file mode 100644
index 000000000..9a9f32cd1
--- /dev/null
+++ b/sd/res/webview/savepic.asp
@@ -0,0 +1,56 @@
+<%
+ Option Explicit
+ Response.Expires = 0
+ Response.Buffer = True
+%>
+<!--
+ * 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 file = "common.inc" -->
+
+<%
+ ' get new picture
+ Dim sCurrPic,aPictureArray, nUpper, nCurrPic
+
+ aPictureArray = File_getDataVirtual( csFilePicture, ".", ";" )
+ nUpper = CInt( (UBound(aPictureArray) - 1 ) / 2)
+
+ sCurrPic = Request( "CurrPic" )
+
+ ' check if + or - was pressed
+ select case Request( "Auswahl" )
+ case "+"
+ if isNumeric( sCurrPic ) then
+ sCurrPic = CStr( CLng( sCurrPic ) + 1 )
+ end if
+ case "-"
+ if isNumeric( sCurrPic ) then
+ sCurrPic = CStr( CLng( sCurrPic ) - 1 )
+ end if
+ end select
+
+ ' save picture name
+ if isNumeric( sCurrPic ) then
+ if (CInt( sCurrPic ) > 0) and ( CInt( sCurrPic ) <= nUpper ) then
+ call File_writeVirtual( "currpic.txt", ".", sCurrPic )
+ end if
+ end if
+
+ ' return to edit page
+ Response.Redirect( "./editpic.asp" )
+%>
diff --git a/sd/res/webview/savepic.pl b/sd/res/webview/savepic.pl
new file mode 100644
index 000000000..3502312e5
--- /dev/null
+++ b/sd/res/webview/savepic.pl
@@ -0,0 +1,58 @@
+#!/usr/bin/env perl
+#
+# 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 .
+#
+
+require "common.pl";
+
+%aRequestMap = common::HTTP_getRequest();
+
+# get new picture
+$sCurrPic = $aRequestMap{ "CurrPic" };
+
+@aPictureArray = common::File_read( "picture.txt" );
+$nPictureArrayLen = @aPictureArray;
+
+# check if + or - was pressed
+if( $aRequestMap{ "Auswahl" } eq "+" )
+{
+ $sCurrPic = abs( $sCurrPic ) + 1;
+}
+
+if( $aRequestMap{ "Auswahl" } eq "-" )
+{
+ $sCurrPic = abs( $sCurrPic ) - 1;
+}
+
+# save picture name
+if( (abs( $sCurrPic ) > 0) && ( abs( $sCurrPic ) < ( $nPictureArrayLen ) ) )
+{
+ open( F_CURRPIC, ">currpic.txt");
+ print F_CURRPIC abs( $sCurrPic );
+ close( F_CURRPIC );
+}
+
+# return to edit page
+print "Content-type: text/html\n\n";
+print "<HTML>\n<HEAD>\n";
+print "<META http-equiv=\"refresh\" CONTENT=\"0 ;URL=editpic.pl\">";
+print "<title>savepic.pl</title>";
+print "</HEAD>\n";
+print "<BODY>\n";
+print "</BODY>\n";
+print "</HTML>\n";
+%>
diff --git a/sd/res/webview/show.asp b/sd/res/webview/show.asp
new file mode 100644
index 000000000..c59516706
--- /dev/null
+++ b/sd/res/webview/show.asp
@@ -0,0 +1,59 @@
+<%
+ Option Explicit
+ Response.Expires = 0
+%>
+<!--
+ * 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 file = "common.inc" -->
+
+<%
+ Dim sGifName1, sGifName2, nGifID, aPictureArray
+
+ nGifID = Session( "GIFID" )
+
+ ' get current and next picture
+ aPictureArray = File_getDataVirtual( csFilePicture, ".", ";" )
+
+ ' not last picture or wrong input ?
+ If CInt( nGifID ) < UBound( aPictureArray ) / 2 Then
+ sGifName1 = aPictureArray( ( nGifID - 1 ) * 2 + 1 )
+ sGifName2 = aPictureArray( ( nGifID ) * 2 + 1 )
+ Else
+ nGifID = CInt( UBound( aPictureArray ) / 2 )
+ sGifName1 = aPictureArray( ( nGifID - 1 ) * 2 + 1 )
+ sGifName2 = sGifName1
+ End If
+%>
+
+<HTML>
+
+<HEAD>
+ <TITLE>$$1</TITLE>
+</HEAD>
+
+<BODY bgcolor="white">
+ <table width=100% height=99%>
+ <tr valign=center><td align=center>
+ <IMG src="<% = sGifName1 %>" width=$$4 height=$$5 border=0>
+ <br><IMG src="<% = sGifName2 %>" width=1 height=1 border=0>
+ </td></tr>
+ </table>
+</BODY>
+
+</HTML> \ No newline at end of file
diff --git a/sd/res/webview/show.pl b/sd/res/webview/show.pl
new file mode 100644
index 000000000..3252eaeb8
--- /dev/null
+++ b/sd/res/webview/show.pl
@@ -0,0 +1,56 @@
+#!/usr/bin/env perl
+#
+# 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 .
+#
+
+require "common.pl";
+
+print "Content-type: text/html\n\n";
+
+# get current and next picture
+$sCurrPic = join( "", common::File_read( "currpic.txt" ) );
+@aPictureArray = common::File_read( "picture.txt" );
+
+# not last picture or wrong input ?
+if( abs( $sCurrPic ) > 0 )
+{
+ $nCurrPic = abs( $sCurrPic );
+ $nPictureArrayLen = @aPictureArray;
+ if( $nCurrPic < $nPictureArrayLen )
+ {
+ $sPictureName1 = ( split( ";", @aPictureArray[ $nCurrPic ] ) )[ 1 ];
+ $sPictureName2 = ( split( ";", @aPictureArray[ $nCurrPic + 1 ] ) )[ 1 ];
+ }
+ else
+ {
+ $sPictureName1 = ( split( ";", @aPictureArray[ $nCurrPic ] ) )[ 1 ];
+ $sPictureName2 = $sPictureName1;
+ }
+}
+
+print "<HTML>";
+
+print "<HEAD>";
+ print "<TITLE>$$1</TITLE>";
+print "</HEAD>";
+
+print "<BODY bgcolor=\"white\">";
+ print "<P ALIGN=CENTER><IMG src=\"" . $sPictureName1 . "\" width=$$4 height=$$5 border=0>";
+ print "<P><IMG src=\"" . $sPictureName2 . "\" width=1 height=1 border=0>";
+print "</BODY>";
+
+print "</HTML>";
diff --git a/sd/res/webview/webcast.asp b/sd/res/webview/webcast.asp
new file mode 100644
index 000000000..f084fc2df
--- /dev/null
+++ b/sd/res/webview/webcast.asp
@@ -0,0 +1,45 @@
+<%
+ Option Explicit
+ Response.Expires = 0
+%>
+<!--
+ * 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 file = "common.inc" -->
+
+<%
+ Session( "GIFID" ) = File_getDataVirtual( csFileCurrent, ".", ";" )( 0 )
+%>
+
+<HTML>
+
+<HEAD>
+</HEAD>
+
+<FRAMESET ROWS="*,2" BORDER=0 FRAMEBORDER=0 FRAMESPACING=0>
+ <FRAME SRC="./show.asp" NAME="frame1" SCROLLING=yes RESIZE MARGINWIDTH=0 MARGINHEIGHT=0 FRAMEBORDER=0>
+ <FRAME SRC="./poll.asp" NAME="frame2" SCROLLING=no NORESIZE MARGINWIDTH=0 MARGINHEIGHT=0 FRAMEBORDER=0>
+</FRAMESET>
+
+<NOFRAMES>
+
+<BODY BGCOLOR="white">
+ <META HTTP-EQUIV="-REFRESH" CONTENT="1;URL=./show.asp">
+</BODY>
+
+</HTML> \ No newline at end of file
diff --git a/sd/res/webview/webcast.pl b/sd/res/webview/webcast.pl
new file mode 100644
index 000000000..37c80e5a1
--- /dev/null
+++ b/sd/res/webview/webcast.pl
@@ -0,0 +1,38 @@
+#!/usr/bin/env perl
+#
+# 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 .
+#
+
+print "Content-type: text/html\n\n";
+
+print "<HTML>";
+
+print "<HEAD>";
+print "</HEAD>";
+
+print "<FRAMESET ROWS=\"*,2\" BORDER=0 FRAMEBORDER=0 FRAMESPACING=0>";
+ print "<FRAME SRC=\"./show.pl\" NAME=\"frame1\" SCROLLING=yes RESIZE MARGINWIDTH=0 MARGINHEIGHT=0 FRAMEBORDER=0>";
+ print "<FRAME SRC=\"./poll.pl\" NAME=\"frame2\" SCROLLING=no NORESIZE MARGINWIDTH=0 MARGINHEIGHT=0 FRAMEBORDER=0>";
+print "</FRAMESET>";
+
+print "<NOFRAMES>";
+
+print "<BODY BGCOLOR=\"white\">";
+ print "<META HTTP-EQUIV=\"-REFRESH\" CONTENT=\"1;URL=./show.pl\">";
+print "</BODY>";
+
+print "</HTML>";
diff --git a/sd/sdi/SlideSorterController.sdi b/sd/sdi/SlideSorterController.sdi
new file mode 100644
index 000000000..22bc64214
--- /dev/null
+++ b/sd/sdi/SlideSorterController.sdi
@@ -0,0 +1,341 @@
+/*
+ * 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 .
+ */
+
+enum FadeEffect
+{
+ FADE_EFFECT_NONE ,
+ FADE_EFFECT_FADE_FROM_LEFT ,
+ FADE_EFFECT_FADE_FROM_TOP ,
+ FADE_EFFECT_FADE_FROM_RIGHT ,
+ FADE_EFFECT_FADE_FROM_BOTTOM ,
+ FADE_EFFECT_FADE_TO_CENTER ,
+ FADE_EFFECT_FADE_FROM_CENTER ,
+ FADE_EFFECT_MOVE_FROM_LEFT ,
+ FADE_EFFECT_MOVE_FROM_TOP ,
+ FADE_EFFECT_MOVE_FROM_RIGHT ,
+ FADE_EFFECT_MOVE_FROM_BOTTOM ,
+ FADE_EFFECT_ROLL_FROM_LEFT ,
+ FADE_EFFECT_ROLL_FROM_TOP ,
+ FADE_EFFECT_ROLL_FROM_RIGHT ,
+ FADE_EFFECT_ROLL_FROM_BOTTOM ,
+ FADE_EFFECT_VERTICAL_STRIPES ,
+ FADE_EFFECT_HORIZONTAL_STRIPES ,
+ FADE_EFFECT_OPEN_VERTICAL ,
+ FADE_EFFECT_CLOSE_VERTICAL ,
+ FADE_EFFECT_OPEN_HORIZONTAL ,
+ FADE_EFFECT_CLOSE_HORIZONTAL ,
+ FADE_EFFECT_CLEAR_AWAY ,
+ FADE_EFFECT_OVERLAY
+}
+
+enum FadeSpeed
+{
+ FADE_SPEED_SLOW ,
+ FADE_SPEED_MEDIUM ,
+ FADE_SPEED_FAST
+}
+
+enum PresChange
+{
+ PresChange::Manual ,
+ PresChange::Auto ,
+ PresChange::SemiAuto
+} ;
+
+ // Items
+item UINT32 DiaTimeItem ;
+item PresChange DiaAutoItem ;
+item FadeEffect DiaEffectItem ;
+item FadeSpeed DiaSpeedItem ;
+
+
+interface SlideSorterView
+{
+ SID_INSERTPAGE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_MASTER_PAGE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DUPLICATE_PAGE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DELETE_PAGE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetClipboardState ;
+ ]
+ SID_DELETE_MASTER_PAGE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetClipboardState ;
+ ]
+ SID_RENAMEPAGE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_RENAME_MASTER_PAGE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DELETE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CUT // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetClipboardState ;
+ ]
+ SID_COPY // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetClipboardState ;
+ ]
+ SID_PASTE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetClipboardState ;
+ ]
+ SID_PASTE_SPECIAL // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetClipboardState ;
+ ]
+ SID_REHEARSE_TIMINGS // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PRESENTATION // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PRESENTATION_CURRENT_SLIDE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_HIDE_SLIDE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SHOW_SLIDE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECT_SELECT // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ZOOM_TOOLBOX // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SIZE_VISAREA // ole : no, status : no
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PAGES_PER_ROW // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_SELECTALL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_STATUS_PAGE // ole : no, status : ?
+ [
+ ExecMethod = ExecStatusBar ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_STATUS_LAYOUT // ole : no, status : ?
+ [
+ ExecMethod = ExecStatusBar ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_SCALE // ole : no, status : ?
+ [
+ ExecMethod = ExecStatusBar ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_RELOAD // ole : no, status : ?
+ [
+ GroupId = SfxGroupId::Document ;
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ Asynchron , AutoUpdate ,
+ MenuConfig , AccelConfig , ToolBoxConfig ;
+ ]
+ SID_SEARCH_DLG // ole : no, status : ?
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SLIDE_TRANSITIONS_PANEL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_MASTER_SLIDES_PANEL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PRESENTATION_DLG
+ [
+ ExecMethod = FuTemporary ;
+ ]
+ SID_REMOTE_DLG
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CUSTOMSHOW_DLG
+ [
+ ExecMethod = FuTemporary ;
+ ]
+ SID_EXPAND_PAGE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SUMMARY_PAGE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OUTPUT_QUALITY_COLOR // ole : no, status : play rec
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_OUTPUT_QUALITY_GRAYSCALE // ole : no, status : play rec
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_OUTPUT_QUALITY_BLACKWHITE // ole : no, status : play rec
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_OUTPUT_QUALITY_CONTRAST // ole : no, status : play rec
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_MAIL_SCROLLBODY_PAGEDOWN // ole : no, status : ?
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_STYLE_FAMILY
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OPT_LOCALE_CHANGED // ole : no, status : ?
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+
+ SID_GETUNDOSTRINGS // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_UNDO // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GETREDOSTRINGS // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_REDO // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_MODIFYPAGE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ASSIGN_LAYOUT
+ [
+ ExecMethod = FuTemporary;
+ StateMethod = GetMenuState;
+ ]
+ SID_PHOTOALBUM
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_MOVE_PAGE_UP
+ [
+ ExecMethod = ExecMovePageUp ;
+ StateMethod = GetStateMovePageUp ;
+ ]
+ SID_MOVE_PAGE_DOWN
+ [
+ ExecMethod = ExecMovePageDown ;
+ StateMethod = GetStateMovePageDown ;
+ ]
+ SID_MOVE_PAGE_FIRST
+ [
+ ExecMethod = ExecMovePageFirst ;
+ StateMethod = GetStateMovePageFirst ;
+ ]
+ SID_MOVE_PAGE_LAST
+ [
+ ExecMethod = ExecMovePageLast ;
+ StateMethod = GetStateMovePageLast ;
+ ]
+}
+
+shell SlideSorterController
+{
+ import SlideSorterView;
+}
+
+shell SlideSorterViewShell
+{
+ import SlideSorterView;
+}
diff --git a/sd/sdi/ViewShellBase.sdi b/sd/sdi/ViewShellBase.sdi
new file mode 100644
index 000000000..f39368368
--- /dev/null
+++ b/sd/sdi/ViewShellBase.sdi
@@ -0,0 +1,152 @@
+/*
+ * 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 .
+ */
+
+interface ViewShellBaseView
+{
+ SID_SWITCH_SHELL
+ [
+ ExecMethod = Execute;
+ ]
+ SID_LEFT_PANE_IMPRESS
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_LEFT_PANE_DRAW
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_NOTES_WINDOW
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_NORMAL_MULTI_PANE_GUI
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_SLIDE_SORTER_MULTI_PANE_GUI
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TOGGLE_TABBAR_VISIBILITY
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_DISPLAY_MODE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_DRAWINGMODE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_SLIDE_SORTER_MODE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_OUTLINE_MODE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_NOTES_MODE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_HANDOUT_MASTER_MODE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_SLIDE_MASTER_MODE
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_NOTES_MASTER_MODE
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_WIN_FULLSCREEN
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ FN_INSERT_SOFT_HYPHEN // status(final|play)
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ FN_INSERT_HARDHYPHEN // status()
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ FN_INSERT_HARD_SPACE // status(final|play)
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ FN_INSERT_NNBSP // status(final|play)
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_INSERT_RLM
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_INSERT_LRM
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_INSERT_ZWSP
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_INSERT_WJ
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_RESTORE_EDITING_VIEW
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_INSERT_DRAW
+ []
+}
+
+shell ViewShellBase
+{
+ import ViewShellBaseView;
+}
diff --git a/sd/sdi/_docsh.sdi b/sd/sdi/_docsh.sdi
new file mode 100644
index 000000000..02de70858
--- /dev/null
+++ b/sd/sdi/_docsh.sdi
@@ -0,0 +1,93 @@
+/*
+ * 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 .
+ */
+interface DrawDocument
+{
+ SID_ATTR_CHAR_FONTLIST
+ [
+ StateMethod = GetState ;
+ ]
+ SID_CLOSEDOC // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_HANGUL_HANJA_CONVERSION // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_CHINESE_CONVERSION // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_LANGUAGE_STATUS
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ // ?
+ FID_SEARCH_NOW // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ // ?
+ FID_SEARCH_ON // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ // ?
+ FID_SEARCH_OFF // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+
+ SID_GET_COLORLIST
+ [
+ ExecMethod = Execute;
+ ]
+ SID_VERSION
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_NOTEBOOKBAR
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+
+ SID_SPELLCHECK_IGNORE_ALL
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+
+ SID_SPELLCHECK_APPLY_SUGGESTION
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+}
+
diff --git a/sd/sdi/_drvwsh.sdi b/sd/sdi/_drvwsh.sdi
new file mode 100644
index 000000000..978866b97
--- /dev/null
+++ b/sd/sdi/_drvwsh.sdi
@@ -0,0 +1,2951 @@
+/*
+ * 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 .
+ */
+
+interface DrawView
+{
+ SID_JUMPTOMARK // ole : no, status : ?
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_SWITCHPAGE // ole : no, status : play rec
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_SWITCHLAYER // ole : no, status : play rec
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_RELOAD // ole : no, status : ?
+ [
+ GroupId = SfxGroupId::Document ;
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ Asynchron , AutoUpdate ,
+ MenuConfig , AccelConfig , ToolBoxConfig ;
+ ]
+ SID_PAGEMODE // ole : no, status : play rec
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_LAYERMODE // ole : no, status : play rec
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECTRESIZE // ole : no, status : ?
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ORIGINAL_SIZE // ole : yes, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CHANGE_PICTURE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SAVE_GRAPHIC
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_COMPRESS_GRAPHIC
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GRAPHIC_SIZE_CHECK
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTERNAL_EDIT
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CUT // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_COPY // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PASTE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_UNICODE_NOTATION_TOGGLE
+ [
+ ExecMethod = FuSupport;
+ ]
+ SID_PASTE_UNFORMATTED
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CLIPBOARD_FORMAT_ITEMS
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ];
+ SID_DRAWINGMODE // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_MASTERPAGE // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ // Menu messages for temporary functions with dialog
+ SID_ATTR_ZOOM // ole : no, status : no
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_ATTR_ZOOMSLIDER // status()
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_ATTRIBUTES_LINE // ole : no, status : no
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ATTRIBUTES_AREA // ole : no, status : no
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERTPAGE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERTPAGE_QUICK // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_HYPERLINK_SETLINK // ole : no, status : no
+ [
+ ExecMethod = FuTemporary ;
+ ]
+ SID_HYPERLINK_GETLINK // ole : no, status : no
+ [
+ StateMethod = GetCtrlState ;
+ ]
+ SID_READONLY_MODE // ole : no, status : no
+ [
+ StateMethod = GetCtrlState ;
+ ]
+ SID_RENAMEPAGE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_RENAMEPAGE_QUICK // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERTLAYER // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_MODIFYLAYER // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_RENAMELAYER // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_NAVIGATOR // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_3D_WIN // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_3D_INIT // ole : no, status : ?
+ [
+ ExecMethod = ExecEffectWin ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_3D_STATE // ole : no, status : ?
+ [
+ ExecMethod = ExecEffectWin ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_3D_ASSIGN // ole : no, status : ?
+ [
+ ExecMethod = ExecEffectWin ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ATTR_TRANSFORM // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_ATTR_TRANSFORM_WIDTH // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetDrawAttrState ;
+ ]
+ SID_ATTR_TRANSFORM_HEIGHT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetDrawAttrState ;
+ ]
+ SID_ATTR_TRANSFORM_POS_X // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetDrawAttrState ;
+ ]
+ SID_ATTR_TRANSFORM_POS_Y // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetDrawAttrState ;
+ ]
+ SID_ATTR_TRANSFORM_ANGLE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetDrawAttrState ;
+ ]
+ SID_ATTR_TRANSFORM_ROT_X
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetDrawAttrState ;
+ ]
+ SID_ATTR_TRANSFORM_ROT_Y
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetDrawAttrState ;
+ ]
+ SID_ATTR_TRANSFORM_PROTECT_POS
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetDrawAttrState ;
+ ]
+ SID_ATTR_TRANSFORM_PROTECT_SIZE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetDrawAttrState ;
+ ]
+ SID_ATTR_TRANSFORM_AUTOWIDTH
+ [
+ StateMethod = GetDrawAttrState ;
+ ]
+ SID_ATTR_TRANSFORM_AUTOHEIGHT
+ [
+ StateMethod = GetDrawAttrState ;
+ ]
+
+ /// !?
+ SID_CHAR_DLG // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CHAR_DLG_EFFECT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_PARA_DLG // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ GroupId = SfxGroupId::Document ;
+ MenuConfig , AccelConfig , ToolBoxConfig ;
+ ]
+ SID_CHARMAP // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EMOJI_CONTROL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CHARMAP_CONTROL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ FN_INSERT_SOFT_HYPHEN // status(final|play)
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ FN_INSERT_HARDHYPHEN // status()
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ FN_INSERT_HARD_SPACE // status(final|play)
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ FN_INSERT_NNBSP // status(final|play)
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_RLM
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_LRM
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_ZWSP
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_WJ
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_PASTE_SPECIAL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_INSERT_GRAPHIC // ole : no, status : todo
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ GroupId = SfxGroupId::Insert ;
+ Asynchron ,
+ MenuConfig , AccelConfig , ToolBoxConfig ;
+ ]
+ SID_MANAGE_LINKS // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_THESAURUS // ole : no, status : no
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ATTR_TABLE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_INSERT_DIAGRAM // ole : yes, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ GroupId = SfxGroupId::Document ;
+ Asynchron ,
+ MenuConfig , AccelConfig , ToolBoxConfig ;
+ ]
+ SID_BMPMASK // ole : yes, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_BMPMASK_PIPETTE // ole : no, status : ?
+ [
+ ExecMethod = ExecBmpMask ;
+ StateMethod = GetBmpMaskState ;
+ ]
+ SID_BMPMASK_EXEC // ole : no, status : ?
+ [
+ ExecMethod = ExecBmpMask ;
+ StateMethod = GetBmpMaskState ;
+ ]
+ SID_INSERT_OBJECT // ole : yes, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLOATINGFRAME // ole : yes, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_MATH // ole : yes, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_COPYOBJECTS // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PAGESETUP // ole : no, status : no
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PAGESIZE // ole : no, status : rec play
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PAGEMARGIN // ole : no, status : rec play
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PRESENTATION_LAYOUT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GROUP // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ FastCall = FALSE ;
+ ]
+ SID_ENTER_GROUP // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_LEAVE_GROUP // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_LEAVE_ALL_GROUPS // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_UNGROUP // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ FastCall = FALSE ;
+ ]
+ SID_TEXT_COMBINE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_COMBINE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DISTRIBUTE_DLG // ole : no, status : ?
+ [
+ StateMethod = GetMenuState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_DISTRIBUTE_HLEFT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DISTRIBUTE_HCENTER // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DISTRIBUTE_HDISTANCE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DISTRIBUTE_HRIGHT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DISTRIBUTE_VTOP // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DISTRIBUTE_VCENTER // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DISTRIBUTE_VDISTANCE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DISTRIBUTE_VBOTTOM // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_POLY_MERGE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_POLY_SUBSTRACT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_POLY_INTERSECT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EQUALIZEWIDTH // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EQUALIZEHEIGHT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DISMANTLE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_BREAK // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONVERT_TO_3D // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONVERT_TO_3D_LATHE // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONVERT_TO_BITMAP // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONVERT_TO_METAFILE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FRAME_TO_TOP // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_MOREFRONT // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FRAME_UP // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_BEFORE_OBJ // ole : no, status : no
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_BEHIND_OBJ // ole : no, status : no
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_REVERSE_ORDER // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_MOREBACK // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FRAME_DOWN // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FRAME_TO_BOTTOM // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECT_ALIGN_LEFT // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECT_ALIGN_CENTER // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECT_ALIGN_RIGHT // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECT_ALIGN_UP // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECT_ALIGN_MIDDLE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECT_ALIGN_DOWN // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SELECTALL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ZOOM_NEXT // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ZOOM_PREV // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ZOOM_OUT // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ZOOM_MODE // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ZOOM_PANNING // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ZOOM_IN // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SIZE_REAL // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SIZE_PAGE // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SIZE_VISAREA // ole : no, status : no
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SIZE_PAGE_WIDTH // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SIZE_OPTIMAL // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SIZE_ALL // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DELETE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ GroupId = SfxGroupId::Document ;
+ Asynchron ,
+ MenuConfig , AccelConfig , ToolBoxConfig ;
+ ]
+ SID_CHANGEBEZIER // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CHANGEPOLYGON // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ReadOnlyDoc = FALSE ;
+ ]
+ SID_CONVERT_TO_CONTOUR // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ReadOnlyDoc = FALSE ;
+ ]
+ FN_NUM_BULLET_ON
+ [
+ ExecMethod = FuTemporary;
+ StateMethod = GetAttrState;
+ ]
+ FN_NUM_NUMBERING_ON
+ [
+ ExecMethod = FuTemporary;
+ StateMethod = GetAttrState;
+ ]
+ SID_OUTLINE_BULLET // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ MenuConfig = TRUE;
+ ]
+ FN_SVX_SET_BULLET
+ [
+ ExecMethod = FuTemporary ;
+ ]
+ FN_SVX_SET_NUMBER
+ [
+ ExecMethod = FuTemporary ;
+ ]
+ FN_BUL_NUM_RULE_INDEX
+ [
+ ExecMethod = FuTemporary;
+ StateMethod = GetAttrState;
+ Asynchron , AutoUpdate ;
+ ]
+ FN_NUM_NUM_RULE_INDEX
+ [
+ ExecMethod = FuTemporary;
+ StateMethod = GetAttrState;
+ Asynchron , AutoUpdate ;
+ ]
+ SID_ATTR_CHAR // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_TEXT_VERTICAL // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_TEXTEDIT // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_TEXT_FITTOSIZE // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OUTLINE_TEXT_AUTOFIT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_TEXT_FITTOSIZE_VERTICAL // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_VERTICALTEXT_STATE
+ [
+ StateMethod = GetMenuState ;
+ ]
+ SID_CTLFONT_STATE
+ [
+ StateMethod = GetMenuState ;
+ ]
+
+
+ SID_OBJECT_ROTATE // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ GroupId = SfxGroupId::Document ;
+ AutoUpdate ,
+ MenuConfig , AccelConfig , ToolBoxConfig ;
+ ]
+ SID_OBJECT_SHEAR // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_OBJECT_MIRROR // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_OBJECT_CROP // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_OBJECT_TRANSPARENCE // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECT_GRADIENT // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_OBJECT_CROOK_ROTATE // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECT_CROOK_SLANT // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECT_CROOK_STRETCH // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_RECT // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_RECT_NOFILL // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_RECT_ROUND // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_RECT_ROUND_NOFILL // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_SQUARE // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_SQUARE_NOFILL // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_SQUARE_ROUND // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_SQUARE_ROUND_NOFILL // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_TOOL_CONNECTOR // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_ARROW_START // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_ARROW_END // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_ARROWS // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_CIRCLE_START // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_CIRCLE_END // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_CIRCLES // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINE // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINE_ARROW_START // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINE_ARROW_END // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINE_ARROWS // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINE_CIRCLE_START // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINE_CIRCLE_END // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINE_CIRCLES // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_CURVE // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_CURVE_ARROW_START // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_CURVE_ARROW_END // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_CURVE_ARROWS // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_CURVE_CIRCLE_START // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_CURVE_CIRCLE_END // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_CURVE_CIRCLES // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINES // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINES_ARROW_START // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINES_ARROW_END // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINES_ARROWS // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINES_CIRCLE_START // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINES_CIRCLE_END // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTOR_LINES_CIRCLES // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_LINE_ARROW_START // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_LINE_ARROW_END // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_LINE_ARROWS // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_LINE_ARROW_CIRCLE // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_LINE_CIRCLE_ARROW // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_LINE_ARROW_SQUARE // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_LINE_SQUARE_ARROW // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_CAPTION // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_CAPTION_VERTICAL // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_CIRCLE // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_CIRCLE_NOFILL // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_ELLIPSE // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_ELLIPSE_NOFILL // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_ARC // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_CIRCLEARC // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_PIE // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_PIE_NOFILL // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_CIRCLEPIE // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_CIRCLEPIE_NOFILL // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_CIRCLECUT // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_CIRCLECUT_NOFILL // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_ELLIPSECUT // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_ELLIPSECUT_NOFILL // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_LINE // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_MEASURELINE // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_XLINE // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_MOVETO // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_LINETO // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_BEZIERTO // ole : no, status : play rec
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_XPOLYGON // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_XPOLYGON_NOFILL // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_POLYGON // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_POLYGON_NOFILL // ole : no, status : no
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_BEZIER_FILL // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_BEZIER_NOFILL // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_FREELINE // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_FREELINE_NOFILL // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_3D_CUBE // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_3D_SPHERE // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_3D_CYLINDER // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_3D_CONE // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_3D_PYRAMID // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_3D_SHELL // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_3D_TORUS // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_3D_HALF_SPHERE // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_OBJECT_ALIGN // ole : no, status : ?
+ [
+ StateMethod = GetMenuState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+
+ SID_ZOOM_TOOLBOX // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECT_CHOOSE_MODE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_POSITION // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_TEXT // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_CONNECTORS // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_RECTANGLES // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_ELLIPSES // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_REDACTED_EXPORT // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_LINES // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_ARROWS // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_3D_OBJECTS // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_INSERT // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECT_SELECT // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ReadOnlyDoc = TRUE ;
+ ]
+
+ // Begin FormSlots
+ SID_FM_CREATE_CONTROL
+ [
+ ExecMethod = FuPermanent ;
+ ]
+ SfxBoolItem CreateFieldControl SID_FM_CREATE_FIELDCONTROL
+ ()
+ [
+ ExecMethod = FuPermanent ;
+ ]
+ SID_ATTR_YEAR2000
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ // End FormSlots
+
+ SID_ATTR_FILL_STYLE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_FILL_COLOR // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_FILL_GRADIENT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_FILL_HATCH // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_FILL_BITMAP // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_FILL_USE_SLIDE_BACKGROUND // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_FILL_TRANSPARENCE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_FILL_FLOATTRANSPARENCE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_LINE_STYLE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_LINE_JOINT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_LINE_CAP // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_LINE_TRANSPARENCE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_LINE_DASH // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_DASH_LIST
+ [
+ StateMethod = GetAttrState ;
+ ]
+ SID_LINEEND_LIST
+ [
+ StateMethod = GetAttrState ;
+ ]
+ SID_COLOR_TABLE
+ [
+ StateMethod = GetAttrState;
+ ]
+ SID_GRADIENT_LIST
+ [
+ StateMethod = GetAttrState ;
+ ]
+ SID_HATCH_LIST
+ [
+ StateMethod = GetAttrState ;
+ ]
+ SID_BITMAP_LIST
+ [
+ StateMethod = GetAttrState ;
+ ]
+ SID_PATTERN_LIST
+ [
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_LINE_WIDTH // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_LINE_COLOR // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_LINEEND_STYLE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_LINE_START // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_LINE_END // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_DELETE_PAGE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DELETE_LAYER // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERTFILE // ole : no, status : todo
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_STYLE_FAMILY2 // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_STYLE_FAMILY3 // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_STYLE_NEW // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_STYLE_DRAGHIERARCHIE // ole : no, status : ?
+ [
+ StateMethod = GetAttrState ;
+ ]
+ SID_STYLE_EDIT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_STYLE_DELETE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_STYLE_HIDE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_STYLE_SHOW
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_STYLE_APPLY // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_STYLE_WATERCAN // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_STYLE_NEW_BY_EXAMPLE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_STYLE_UPDATE_BY_EXAMPLE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_SET_DEFAULT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_REMOVE_HYPERLINK // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_RULER_PAGE_POS // ole : no, status : ?
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetRulerState ;
+ ]
+
+ SID_RULER_OBJECT // ole : no, status : ?
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetRulerState ;
+ ]
+
+ SID_RULER_NULL_OFFSET // ole : no, status : ?
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetRulerState ;
+ ]
+ SID_ATTR_LONG_LRSPACE // ole : no, status : ?
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetRulerState ;
+ ]
+ SID_ATTR_LONG_ULSPACE // ole : no, status : ?
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetRulerState ;
+ ]
+ SID_RULER_LR_MIN_MAX // ole : no, status : ?
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetRulerState ;
+ ]
+
+ SID_RULER_PROTECT // status()
+ [
+ StateMethod = GetRulerState ;
+ ]
+ SID_RULER_TEXT_RIGHT_TO_LEFT
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetRulerState ;
+ ]
+
+ SID_ATTR_TABSTOP // ole : no, status : ?
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetRulerState ;
+ ]
+
+ SID_ATTR_PARA_LRSPACE // ole : no, status : ?
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_PARA_LINESPACE
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_PARA_ULSPACE
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_PARA_ADJUST_LEFT
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_PARA_ADJUST_CENTER
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_PARA_ADJUST_RIGHT
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_PARA_ADJUST_BLOCK
+ [
+ ExecMethod = ExecRuler ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_POSITION // ole : no, status : ?
+ [
+ ExecMethod = ExecStatusBar ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_ATTR_SIZE // ole : no, status : ?
+ [
+ ExecMethod = ExecStatusBar ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_STATUS_PAGE // ole : no, status : ?
+ [
+ ExecMethod = ExecStatusBar ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_STATUS_LAYOUT // ole : no, status : ?
+ [
+ ExecMethod = ExecStatusBar ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_SCALE // ole : no, status : ?
+ [
+ ExecMethod = ExecStatusBar ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_LINEEND_POLYGON // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_NAME_GROUP // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OBJECT_TITLE_DESCRIPTION // #i68101# ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONTEXT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SET_SNAPITEM // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetSnapItemState ;
+ ]
+ SID_DELETE_SNAPITEM // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetSnapItemState ;
+ ]
+ SID_CAPTUREPOINT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_SWITCH_POINTEDIT // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_RULER // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ GroupId = SfxGroupId::Document ;
+ MenuConfig = TRUE ;
+ ]
+ SID_COLOR_CONTROL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FONTWORK // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FORMTEXT_STYLE // ole : no, status : ?
+ [
+ ExecMethod = ExecFormText ;
+ StateMethod = GetFormTextState ;
+ ]
+ SID_FORMTEXT_ADJUST // ole : no, status : ?
+ [
+ ExecMethod = ExecFormText ;
+ StateMethod = GetFormTextState ;
+ ]
+ SID_FORMTEXT_DISTANCE // ole : no, status : ?
+ [
+ ExecMethod = ExecFormText ;
+ StateMethod = GetFormTextState ;
+ ]
+ SID_FORMTEXT_START // ole : no, status : ?
+ [
+ ExecMethod = ExecFormText ;
+ StateMethod = GetFormTextState ;
+ ]
+ SID_FORMTEXT_MIRROR // ole : no, status : ?
+ [
+ ExecMethod = ExecFormText ;
+ StateMethod = GetFormTextState ;
+ ]
+ SID_FORMTEXT_HIDEFORM // ole : no, status : ?
+ [
+ ExecMethod = ExecFormText ;
+ StateMethod = GetFormTextState ;
+ ]
+ SID_FORMTEXT_OUTLINE // ole : no, status : ?
+ [
+ ExecMethod = ExecFormText ;
+ StateMethod = GetFormTextState ;
+ ]
+ SID_FORMTEXT_SHADOW // ole : no, status : ?
+ [
+ ExecMethod = ExecFormText ;
+ StateMethod = GetFormTextState ;
+ ]
+ SID_FORMTEXT_SHDWCOLOR // ole : no, status : ?
+ [
+ ExecMethod = ExecFormText ;
+ StateMethod = GetFormTextState ;
+ ]
+ SID_FORMTEXT_SHDWXVAL // ole : no, status : ?
+ [
+ ExecMethod = ExecFormText ;
+ StateMethod = GetFormTextState ;
+ ]
+ SID_FORMTEXT_SHDWYVAL // ole : no, status : ?
+ [
+ ExecMethod = ExecFormText ;
+ StateMethod = GetFormTextState ;
+ ]
+ SID_GALLERY // ole : yes, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ ]
+ SID_GALLERY_FORMATS // ole : no, status : ?
+ [
+ ExecMethod = ExecGallery ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_NAVIGATOR_INIT // ole : no, status : ?
+ [
+ ExecMethod = ExecNavigatorWin ;
+ StateMethod = GetNavigatorWinState ;
+ ]
+ SID_NAVIGATOR_PAGE // ole : no, status : ?
+ [
+ ExecMethod = ExecNavigatorWin ;
+ StateMethod = GetNavigatorWinState ;
+ ]
+ SID_NAVIGATOR_OBJECT // ole : no, status : ?
+ [
+ ExecMethod = ExecNavigatorWin ;
+ StateMethod = GetNavigatorWinState ;
+ ]
+ SID_NAVIGATOR_STATE // ole : no, status : ?
+ [
+ ExecMethod = ExecNavigatorWin ;
+ StateMethod = GetNavigatorWinState ;
+ ]
+ SID_NAVIGATOR_PAGENAME // ole : no, status : ?
+ [
+ ExecMethod = ExecNavigatorWin ;
+ StateMethod = GetNavigatorWinState ;
+ ]
+ SID_HORIZONTAL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FLIP_HORIZONTAL
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_VERTICAL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FLIP_VERTICAL
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ATTR_FILL_SHADOW // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_SHADOW_COLOR
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_SHADOW_TRANSPARENCE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_SHADOW_BLUR
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_SHADOW_XDISTANCE
+ [
+ ExecMethod = FuTemporary;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_SHADOW_YDISTANCE
+ [
+ ExecMethod = FuTemporary;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_TEXT_FITTOSIZE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_OBJECT_CLOSE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SETFILLSTYLE // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_GETFILLSTYLE // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_SETLINESTYLE // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_GETLINESTYLE // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_SETLINEWIDTH // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_GETLINEWIDTH // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_SETFILLCOLOR // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_SETLINECOLOR // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_SETHATCHCOLOR // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_SETGRADSTARTCOLOR // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_SETGRADENDCOLOR // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_GETRED // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_GETBLUE // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_GETGREEN // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_DASH // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_HATCH // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_GRADIENT // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_SELECTGRADIENT // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_SELECTHATCH // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_UNSELECT // ole : no, status : play rec
+ [
+ ExecMethod = AttrExec ;
+ StateMethod = AttrState ;
+ ]
+ SID_TEXTATTR_DLG // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_MEASURE_DLG // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTION_DLG // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONNECTION_NEW_ROUTING // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SCAN // ole : no, status : todo
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_TWAIN_SELECT // ole : no, status : todo
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_TWAIN_TRANSFER // ole : no, status : todo
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_IMAP // ole : yes, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_IMAP_EXEC // ole : no, status : ?
+ [
+ ExecMethod = ExecIMap ;
+ StateMethod = GetIMapState ;
+ ]
+ SID_GLUE_EDITMODE // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_INSERT_POINT // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_PERCENT // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_ESCDIR // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_ESCDIR_LEFT // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_ESCDIR_RIGHT // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_ESCDIR_TOP // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_ESCDIR_BOTTOM // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_HORZALIGN_CENTER // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_HORZALIGN_LEFT // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_HORZALIGN_RIGHT // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_VERTALIGN_CENTER // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_VERTALIGN_TOP // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_VERTALIGN_BOTTOM // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_POLYGON_MORPHING // ole : no, status : no
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GRID_FRONT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_HELPLINES_FRONT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_AUTOSPELL_CHECK // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CONVERT_TO_3D_LATHE_FAST // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ // slots in the option pane
+ SID_BEZIER_EDIT // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GLUE_EDITMODE // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GRID_VISIBLE // ole : no, status : ?
+ [
+ ExecMethod = ExecOptionsBar ;
+ StateMethod = GetOptionsBarState ;
+ ]
+ SID_HELPLINES_VISIBLE // ole : no, status : ?
+ [
+ ExecMethod = ExecOptionsBar ;
+ StateMethod = GetOptionsBarState ;
+ ]
+ SID_SOLID_CREATE // ole : ?, status : ?
+ [
+ ExecMethod = ExecOptionsBar ;
+ StateMethod = GetOptionsBarState ;
+ ]
+ SID_HELPLINES_USE // ole : ?, status : ?
+ [
+ ExecMethod = ExecOptionsBar ;
+ StateMethod = GetOptionsBarState ;
+ ]
+ SID_HELPLINES_MOVE // ole : ?, status : ?
+ [
+ ExecMethod = ExecOptionsBar ;
+ StateMethod = GetOptionsBarState ;
+ ]
+ SID_GRID_USE // ole : ?, status : ?
+ [
+ ExecMethod = ExecOptionsBar ;
+ StateMethod = GetOptionsBarState ;
+ ]
+ SID_SNAP_BORDER // ole : ?, status : ?
+ [
+ ExecMethod = ExecOptionsBar ;
+ StateMethod = GetOptionsBarState ;
+ ]
+ SID_SNAP_FRAME // ole : ?, status : ?
+ [
+ ExecMethod = ExecOptionsBar ;
+ StateMethod = GetOptionsBarState ;
+ ]
+ SID_SNAP_POINTS // ole : ?, status : ?
+ [
+ ExecMethod = ExecOptionsBar ;
+ StateMethod = GetOptionsBarState ;
+ ]
+ SID_QUICKEDIT // ole : ?, status : ?
+ [
+ ExecMethod = ExecOptionsBar ;
+ StateMethod = GetOptionsBarState ;
+ ]
+ SID_PICK_THROUGH // ole : ?, status : ?
+ [
+ ExecMethod = ExecOptionsBar ;
+ StateMethod = GetOptionsBarState ;
+ ]
+ SID_DOUBLECLICK_TEXTEDIT // ole : ?, status : ?
+ [
+ ExecMethod = ExecOptionsBar ;
+ StateMethod = GetOptionsBarState ;
+ ]
+ SID_CLICK_CHANGE_ROTATION // ole : ?, status : ?
+ [
+ ExecMethod = ExecOptionsBar ;
+ StateMethod = GetOptionsBarState ;
+ ]
+ SID_HYPHENATION // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_DUPLICATE_PAGE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_DATE_FIX // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_DATE_VAR // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_TIME_FIX // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_TIME_VAR // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_PAGE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_PAGE_TITLE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_PAGES // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_FILE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_AUTHOR // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_MODIFY_FIELD // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OUTPUT_QUALITY_COLOR // ole : no, status : play rec
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_OUTPUT_QUALITY_GRAYSCALE // ole : no, status : play rec
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_OUTPUT_QUALITY_BLACKWHITE // ole : no, status : play rec
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_OUTPUT_QUALITY_CONTRAST // ole : no, status : play rec
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_MAIL_SCROLLBODY_PAGEDOWN // ole : no, status : ?
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_EDIT_HYPERLINK // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OPEN_HYPERLINK // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_COPY_HYPERLINK_LOCATION // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_HIDE_LAST_LEVEL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SHOW_NEXT_LEVEL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_TRANSLITERATE_UPPER // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_SENTENCE_CASE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_TITLE_CASE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_TOGGLE_CASE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_ROTATE_CASE // ole : no, status : ?
+ [
+ ExecMethod = FuSupportRotate ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_LOWER // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_HALFWIDTH // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_FULLWIDTH // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_HIRAGANA // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_KATAKANA // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+
+ // #UndoRedo#
+ SID_GETUNDOSTRINGS // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_UNDO // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GETREDOSTRINGS // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_REDO // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_FORMATPAINTBRUSH
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_HEADER_AND_FOOTER // ole : no, status : ?
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_INSERT_PAGE_NUMBER // ole : no, status : ?
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_INSERT_DATE_TIME // ole : no, status : ?
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_MASTER_LAYOUTS
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_OPT_LOCALE_CHANGED // ole : no, status : ?
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+
+ SID_OPEN_XML_FILTERSETTINGS // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SPELL_DIALOG // ole : no, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_TOGGLE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_TILT_DOWN
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_TILT_UP
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_TILT_LEFT
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_TILT_RIGHT
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_DEPTH_FLOATER
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_DEPTH_DIALOG
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_DIRECTION_FLOATER
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_LIGHTING_FLOATER
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_SURFACE_FLOATER
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_3D_COLOR
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_DEPTH
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_DIRECTION
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_PROJECTION
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_LIGHTING_DIRECTION
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_LIGHTING_INTENSITY
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXTRUSION_SURFACE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FONTWORK_SHAPE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FONTWORK_GALLERY_FLOATER
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FONTWORK_SHAPE_TYPE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FONTWORK_ALIGNMENT_FLOATER
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FONTWORK_CHARACTER_SPACING_FLOATER
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FONTWORK_ALIGNMENT
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FONTWORK_SAME_LETTER_HEIGHTS
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FONTWORK_CHARACTER_SPACING
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FONTWORK_KERN_CHARACTER_PAIRS
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_FONTWORK_CHARACTER_SPACING_DIALOG
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_FONTWORK
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_FONTWORK_VERTICAL
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_CS_BASIC
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_CS_SYMBOL
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_CS_ARROW
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_CS_FLOWCHART
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_CS_CALLOUT
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAWTBX_CS_STAR
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DRAW_CS_ID
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_SIGNATURELINE
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ReadOnlyDoc = TRUE ;
+ ]
+ SID_AVMEDIA_PLAYER // ole : yes, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_AVMEDIA // ole : yes, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_INSERT_MASTER_PAGE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DELETE_MASTER_PAGE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_RENAME_MASTER_PAGE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CLOSE_MASTER_VIEW
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SELECT_BACKGROUND
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SAVE_BACKGROUND
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ATTR_PAGE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetPageProperties ;
+ ]
+ SID_ATTR_PAGE_SIZE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetPageProperties ;
+ ]
+ SID_ATTR_PAGE_LRSPACE
+ [
+ ExecMethod = SetPageProperties ;
+ StateMethod = GetMarginProperties ;
+ ]
+ SID_ATTR_PAGE_ULSPACE
+ [
+ ExecMethod = SetPageProperties ;
+ StateMethod = GetMarginProperties ;
+ ]
+ SID_ATTR_PAGE_COLOR
+ [
+ ExecMethod = SetPageProperties ;
+ StateMethod = GetPageProperties;
+ ]
+ SID_ATTR_PAGE_GRADIENT
+ [
+ ExecMethod = SetPageProperties ;
+ StateMethod = GetPageProperties ;
+ ]
+ SID_ATTR_PAGE_HATCH
+ [
+ ExecMethod = SetPageProperties ;
+ StateMethod = GetPageProperties ;
+ ]
+ SID_ATTR_PAGE_BITMAP
+ [
+ ExecMethod = SetPageProperties ;
+ StateMethod = GetPageProperties ;
+ ]
+ SID_ATTR_PAGE_FILLSTYLE
+ [
+ ExecMethod = SetPageProperties;
+ StateMethod = GetPageProperties;
+ ]
+ SID_DISPLAY_MASTER_BACKGROUND
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DISPLAY_MASTER_OBJECTS
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_TABLE
+ [
+ ExecMethod = FuTable ;
+ StateMethod = GetTableMenuState ;
+ ]
+ SID_TABLEDESIGN
+ [
+ ExecMethod = FuTable ;
+ StateMethod = GetTableMenuState ;
+ ]
+ SID_ATTR_CHAR_FONT
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_CHAR_FONTHEIGHT
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_CHAR_WEIGHT
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_CHAR_POSTURE
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_CHAR_OVERLINE
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_CHAR_UNDERLINE
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ULINE_VAL_NONE
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ULINE_VAL_SINGLE
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ULINE_VAL_DOUBLE
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ULINE_VAL_DOTTED
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_CHAR_SHADOWED
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_CHAR_STRIKEOUT
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_CHAR_CONTOUR // ole : ?, status : ?
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_CHAR_COLOR
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_CHAR_BACK_COLOR
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_CHAR_KERNING
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_SET_SUB_SCRIPT
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_SET_SUPER_SCRIPT
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_SHRINK_FONT_SIZE
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_GROW_FONT_SIZE
+ [
+ ExecMethod = ExecChar ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_TABLE_VERT_NONE
+ [
+ ExecMethod = ExecutePropPanelAttr ;
+ StateMethod = GetStatePropPanelAttr ;
+ ]
+ SID_TABLE_VERT_CENTER
+ [
+ ExecMethod = ExecutePropPanelAttr ;
+ StateMethod = GetStatePropPanelAttr ;
+ ]
+ SID_TABLE_VERT_BOTTOM
+ [
+ ExecMethod = ExecutePropPanelAttr ;
+ StateMethod = GetStatePropPanelAttr ;
+ ]
+ SID_PRESENTATION_MINIMIZER
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GO_TO_NEXT_PAGE
+ [
+ ExecMethod = ExecGoToNextPage ;
+ StateMethod = GetStateGoToNextPage ;
+ ]
+ SID_GO_TO_PREVIOUS_PAGE
+ [
+ ExecMethod = ExecGoToPreviousPage ;
+ StateMethod = GetStateGoToPreviousPage ;
+ ]
+ SID_GO_TO_FIRST_PAGE
+ [
+ ExecMethod = ExecGoToFirstPage ;
+ StateMethod = GetStateGoToFirstPage ;
+ ]
+ SID_GO_TO_LAST_PAGE
+ [
+ ExecMethod = ExecGoToLastPage ;
+ StateMethod = GetStateGoToLastPage ;
+ ]
+ SID_CLASSIFICATION_APPLY
+ [
+ ExecMethod = FuTemporary ;
+ ]
+ SID_CLASSIFICATION_DIALOG
+ [
+ ExecMethod = FuTemporary ;
+ ]
+ SID_REGENERATE_DIAGRAM
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EDIT_DIAGRAM
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_QRCODE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EDIT_QRCODE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ADDITIONS_DIALOG
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ATTR_GLOW_COLOR
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ATTR_GLOW_RADIUS
+ [
+ ExecMethod = FuTemporary;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_GLOW_TRANSPARENCY
+ [
+ ExecMethod = FuTemporary;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_SOFTEDGE_RADIUS
+ [
+ ExecMethod = FuTemporary;
+ StateMethod = GetAttrState;
+ ]
+ SID_MOVE_SHAPE_HANDLE
+ [
+ ExecMethod = FuTemporary ;
+ ]
+ SID_ATTR_TEXTCOLUMNS_NUMBER
+ [
+ ExecMethod = FuTemporary;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_TEXTCOLUMNS_SPACING
+ [
+ ExecMethod = FuTemporary;
+ StateMethod = GetAttrState;
+ ]
+
+}
diff --git a/sd/sdi/app.sdi b/sd/sdi/app.sdi
new file mode 100644
index 000000000..b524f4a4b
--- /dev/null
+++ b/sd/sdi/app.sdi
@@ -0,0 +1,93 @@
+/*
+ * 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 .
+ */
+
+interface StarImpress
+{
+ SID_NEWDOC // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ GroupId = SfxGroupId::Application ;
+ Container ;
+ ]
+
+ SID_ATTR_METRIC
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+
+ SID_NEWSD // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_OPENDOC // ole() api()
+ [
+
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+
+ SID_OPENHYPERLINK // ole() api()
+ [
+
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+
+ SID_AUTOSPELL_CHECK // ole() api()
+ [
+
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+
+ SID_ATTR_LANGUAGE // ole() api()
+ [
+
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+
+ SID_ATTR_CHAR_CJK_LANGUAGE // ole() api()
+ [
+
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+
+ SID_ATTR_CHAR_CTL_LANGUAGE // ole() api()
+ [
+
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+
+ SID_OUTLINE_TO_IMPRESS // ole() api()
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+}
+
+shell SdModule
+{
+ import StarImpress;
+}
+
diff --git a/sd/sdi/docshell.sdi b/sd/sdi/docshell.sdi
new file mode 100644
index 000000000..f5f322177
--- /dev/null
+++ b/sd/sdi/docshell.sdi
@@ -0,0 +1,31 @@
+/*
+ * 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 .
+ */
+
+interface ImpressDocument : DrawDocument
+{
+ SID_NOTEBOOKBAR
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+}
+
+shell DrawDocShell
+{
+ import ImpressDocument;
+}
diff --git a/sd/sdi/drbezob.sdi b/sd/sdi/drbezob.sdi
new file mode 100644
index 000000000..10387e821
--- /dev/null
+++ b/sd/sdi/drbezob.sdi
@@ -0,0 +1,81 @@
+/*
+ * 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 .
+ */
+
+shell BezierObjectBar
+{
+ SID_BEZIER_MOVE // ole : no, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_BEZIER_INSERT // ole : no, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_BEZIER_DELETE // ole : no, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_BEZIER_CUTLINE // ole : no, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_BEZIER_CONVERT // ole : no, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_BEZIER_EDGE // ole : no, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_BEZIER_SMOOTH // ole : no, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_BEZIER_SYMMTR // ole : no, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_BEZIER_ELIMINATE_POINTS // ole : no, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_BEZIER_CLOSE // ole : no, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+}
+
diff --git a/sd/sdi/drgrfob.sdi b/sd/sdi/drgrfob.sdi
new file mode 100644
index 000000000..cf5bc9a2b
--- /dev/null
+++ b/sd/sdi/drgrfob.sdi
@@ -0,0 +1,138 @@
+/*
+ * 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 .
+ */
+
+shell GraphicObjectBar
+{
+ SID_GRFFILTER
+ [
+ ExecMethod = ExecuteFilter;
+ StateMethod = GetFilterState;
+ ]
+ SID_GRFFILTER_INVERT // ole : no, status : no
+ [
+ ExecMethod = ExecuteFilter;
+ StateMethod = GetFilterState ;
+ ]
+ SID_GRFFILTER_SMOOTH // ole : no, status : no
+ [
+ ExecMethod = ExecuteFilter;
+ StateMethod = GetFilterState ;
+ ]
+ SID_GRFFILTER_SHARPEN // ole : no, status : no
+ [
+ ExecMethod = ExecuteFilter;
+ StateMethod = GetFilterState ;
+ ]
+ SID_GRFFILTER_REMOVENOISE // ole : no, status : no
+ [
+ ExecMethod = ExecuteFilter;
+ StateMethod = GetFilterState ;
+ ]
+ SID_GRFFILTER_SOBEL // ole : no, status : no
+ [
+ ExecMethod = ExecuteFilter;
+ StateMethod = GetFilterState;
+ ]
+ SID_GRFFILTER_MOSAIC // ole : no, status : no
+ [
+ ExecMethod = ExecuteFilter;
+ StateMethod = GetFilterState;
+ ]
+ SID_GRFFILTER_EMBOSS // ole : no, status : no
+ [
+ ExecMethod = ExecuteFilter;
+ StateMethod = GetFilterState;
+ ]
+ SID_GRFFILTER_POSTER // ole : no, status : no
+ [
+ ExecMethod = ExecuteFilter;
+ StateMethod = GetFilterState;
+ ]
+ SID_GRFFILTER_POPART // ole : no, status : no
+ [
+ ExecMethod = ExecuteFilter;
+ StateMethod = GetFilterState;
+ ]
+ SID_GRFFILTER_SEPIA // ole : no, status : no
+ [
+ ExecMethod = ExecuteFilter;
+ StateMethod = GetFilterState;
+ ]
+ SID_GRFFILTER_SOLARIZE // ole : no, status : no
+ [
+ ExecMethod = ExecuteFilter;
+ StateMethod = GetFilterState;
+ ]
+
+
+ SID_ATTR_GRAF_MODE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_GRAF_RED
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_GRAF_GREEN
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_GRAF_BLUE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_GRAF_LUMINANCE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_GRAF_CONTRAST
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_GRAF_GAMMA
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_GRAF_TRANSPARENCE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_GRAF_INVERT
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_GRAF_CROP
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_COLOR_SETTINGS
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+}
diff --git a/sd/sdi/drtxtob.sdi b/sd/sdi/drtxtob.sdi
new file mode 100644
index 000000000..e34445f55
--- /dev/null
+++ b/sd/sdi/drtxtob.sdi
@@ -0,0 +1,300 @@
+/*
+ * 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 .
+ */
+
+shell TextObjectBar
+{
+ SID_STYLE_APPLY // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ GroupId = SfxGroupId::Document;
+ AutoUpdate;
+ ]
+
+ SID_ATTR_CHAR_FONT // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_CHAR_FONTHEIGHT // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_CHAR_COLOR // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_CHAR_BACK_COLOR // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_CHAR_WEIGHT // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_CHAR_POSTURE // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_CHAR_UNDERLINE // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ULINE_VAL_NONE
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetAttrState ;
+ ]
+
+ SID_ULINE_VAL_SINGLE
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetAttrState ;
+ ]
+
+ SID_ULINE_VAL_DOUBLE
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetAttrState ;
+ ]
+
+ SID_ULINE_VAL_DOTTED
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetAttrState ;
+ ]
+
+ SID_ATTR_CHAR_OVERLINE // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_CHAR_UNDERLINE // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_CHAR_CONTOUR // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_CHAR_STRIKEOUT // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_CHAR_SHADOWED // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_CHAR_CASEMAP // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_PARA_ADJUST_LEFT // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+// AutoUpdate;
+ ]
+
+ SID_ATTR_PARA_ADJUST_CENTER // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+// AutoUpdate;
+ ]
+
+ SID_ATTR_PARA_ADJUST_RIGHT // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+// AutoUpdate;
+ ]
+
+ SID_ATTR_PARA_ADJUST_BLOCK // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+// AutoUpdate;
+ ]
+
+ SID_ATTR_PARA_LEFT_TO_RIGHT // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+// AutoUpdate;
+ ]
+
+ SID_ATTR_PARA_RIGHT_TO_LEFT // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+// AutoUpdate;
+ ]
+
+ SID_ATTR_PARA_LINESPACE_10 // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+// AutoUpdate;
+ ]
+
+ SID_ATTR_PARA_LINESPACE_15 // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+// AutoUpdate;
+ ]
+
+ SID_ATTR_PARA_LINESPACE_20 // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+// AutoUpdate;
+ ]
+
+ SID_SET_SUPER_SCRIPT // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_SET_SUB_SCRIPT // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_CHAR_KERNING
+ [
+ ExecMethod = Execute;
+ StateMethod = GetCharState;
+ ]
+
+ SID_PARASPACE_INCREASE // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_PARASPACE_DECREASE // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_INC_INDENT
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_DEC_INDENT
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_ATTR_PARA_LRSPACE
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_HANGING_INDENT
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetAttrState;
+ ]
+
+ SID_OUTLINE_LEFT // ole : no, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_OUTLINE_RIGHT // ole : no, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_OUTLINE_UP // ole : no, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_OUTLINE_DOWN // ole : no, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetAttrState ;
+ ]
+ FN_NUM_BULLET_ON // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_TEXTDIRECTION_LEFT_TO_RIGHT // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_TEXTDIRECTION_TOP_TO_BOTTOM // ole : ?, status : ?
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_GROW_FONT_SIZE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_SHRINK_FONT_SIZE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_THES
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetAttrState ;
+ ]
+
+
+}
diff --git a/sd/sdi/drviewsh.sdi b/sd/sdi/drviewsh.sdi
new file mode 100644
index 000000000..84fa9bfa8
--- /dev/null
+++ b/sd/sdi/drviewsh.sdi
@@ -0,0 +1,223 @@
+/*
+ * 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 .
+ */
+interface ImpressEditView : DrawView
+{
+ SID_MODIFYPAGE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ASSIGN_LAYOUT
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ANIMATION_OBJECTS // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ANIMATION_EFFECTS // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EXECUTE_ANIMATION_EFFECT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CUSTOM_ANIMATION_PANEL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SLIDE_TRANSITIONS_PANEL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SLIDE_TRANSITIONS_PANEL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_MASTER_SLIDES_PANEL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_REHEARSE_TIMINGS // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PRESENTATION // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PRESENTATION_CURRENT_SLIDE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PRESENTATION_END // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CLEAR_UNDO_STACK // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_STYLE_FAMILY5 // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ SID_ANIMATOR_INIT // ole : no, status : ?
+ [
+ ExecMethod = ExecAnimationWin ;
+ StateMethod = GetAnimationWinState ;
+ ]
+ SID_ANIMATOR_ADD // ole : no, status : ?
+ [
+ ExecMethod = ExecAnimationWin ;
+ StateMethod = GetAnimationWinState ;
+ ]
+ SID_ANIMATOR_CREATE // ole : no, status : ?
+ [
+ ExecMethod = ExecAnimationWin ;
+ StateMethod = GetAnimationWinState ;
+ ]
+ SID_ANIMATOR_STATE // ole : no, status : ?
+ [
+ ExecMethod = ExecAnimationWin ;
+ StateMethod = GetAnimationWinState ;
+ ]
+ SID_PRESENTATION_DLG
+ [
+ ExecMethod = FuTemporary ;
+ ]
+ SID_REMOTE_DLG
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CUSTOMSHOW_DLG
+ [
+ ExecMethod = FuTemporary ;
+ ]
+ SID_EXPAND_PAGE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ReadOnlyDoc = FALSE;
+ ]
+ SID_SUMMARY_PAGE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_STYLE_FAMILY
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_SEARCH_OPTIONS // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_SEARCH_ITEM // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_TOGGLE_NOTES
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_INSERT_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_EDIT_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_REPLYTO_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_DELETE_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_DELETEALL_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_PREVIOUS_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_NEXT_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_DELETEALLBYAUTHOR_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_PHOTOALBUM
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+}
+
+shell DrawViewShell
+{
+ import ImpressEditView;
+}
+
+
+shell PresentationViewShell
+{
+ import ImpressEditView;
+}
+
+
+shell PreviewViewShell
+{
+ import ImpressEditView;
+}
diff --git a/sd/sdi/grdocsh.sdi b/sd/sdi/grdocsh.sdi
new file mode 100644
index 000000000..961a4c605
--- /dev/null
+++ b/sd/sdi/grdocsh.sdi
@@ -0,0 +1,26 @@
+/*
+ * 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 .
+ */
+
+interface GraphicDocument : DrawDocument
+{
+}
+
+shell GraphicDocShell
+{
+ import GraphicDocument;
+}
diff --git a/sd/sdi/grviewsh.sdi b/sd/sdi/grviewsh.sdi
new file mode 100644
index 000000000..976dfaa5b
--- /dev/null
+++ b/sd/sdi/grviewsh.sdi
@@ -0,0 +1,82 @@
+/*
+ * 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 .
+ */
+
+interface GraphicEditView : DrawView
+{
+ SID_SEARCH_OPTIONS // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_SEARCH_ITEM // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+}
+
+shell GraphicViewShell
+{
+ import GraphicEditView;
+ SID_INSERT_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_EDIT_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_TOGGLE_NOTES
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_REPLYTO_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_DELETE_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_DELETEALL_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_PREVIOUS_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_NEXT_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+ SID_DELETEALLBYAUTHOR_POSTIT
+ [
+ ExecMethod = ExecuteAnnotation;
+ StateMethod = GetAnnotationState;
+ ]
+}
diff --git a/sd/sdi/mediaob.sdi b/sd/sdi/mediaob.sdi
new file mode 100644
index 000000000..9f7392b96
--- /dev/null
+++ b/sd/sdi/mediaob.sdi
@@ -0,0 +1,26 @@
+/*
+ * 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 .
+ */
+
+shell MediaObjectBar
+{
+ SID_AVMEDIA_TOOLBOX
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+}
diff --git a/sd/sdi/outlnvsh.sdi b/sd/sdi/outlnvsh.sdi
new file mode 100644
index 000000000..09957e8a0
--- /dev/null
+++ b/sd/sdi/outlnvsh.sdi
@@ -0,0 +1,557 @@
+/*
+ * 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 .
+ */
+
+interface OutlineView
+{
+ SID_CUT // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_COPY // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PASTE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PASTE_UNFORMATTED // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_DELETE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ Asynchron ;
+ ]
+ SID_DRAWINGMODE // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ZOOM_NEXT // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ZOOM_PREV // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ZOOM_TOOLBOX // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_ATTR_ZOOM // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_ATTR_ZOOMSLIDER // status()
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_ZOOM_OUT // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_ZOOM_IN // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SIZE_REAL // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SIZE_VISAREA // ole : no, status : no
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_HYPERLINK_SETLINK // ole : no, status : no
+ [
+ ExecMethod = FuTemporaryModify ;
+ ]
+ SID_HYPERLINK_GETLINK // ole : no, status : no
+ [
+ StateMethod = GetCtrlState ;
+ ]
+ SID_READONLY_MODE // ole : no, status : no
+ [
+ StateMethod = GetCtrlState ;
+ ]
+ SID_OUTLINE_FORMAT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OUTLINE_COLLAPSE_ALL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OUTLINE_COLLAPSE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OUTLINE_EXPAND_ALL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_OUTLINE_EXPAND // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CHARMAP // ole : no, status : ?
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EMOJI_CONTROL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CHARMAP_CONTROL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ FN_INSERT_SOFT_HYPHEN // status(final|play)
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ FN_INSERT_HARDHYPHEN // status()
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ FN_INSERT_HARD_SPACE // status(final|play)
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ FN_INSERT_NNBSP // status(final|play)
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_RLM
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_LRM
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_ZWSP
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_WJ
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ FN_SVX_SET_BULLET
+ [
+ ExecMethod = FuTemporaryModify ;
+ ]
+ FN_SVX_SET_NUMBER
+ [
+ ExecMethod = FuTemporaryModify ;
+ ]
+ SID_OUTLINE_BULLET // ole : no, status : ?
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CHAR_DLG // ole : no, status : ?
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CHAR_DLG_EFFECT // wj for sym2_1876
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SELECTALL // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_INSERTFILE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PRESENTATION // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PRESENTATION_CURRENT_SLIDE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_EDIT_OUTLINER // ole : no, status : ?
+ [
+ ExecMethod = FuPermanent ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SAVEDOC // ole : no, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetMenuState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_SAVEASDOC // ole : no, status : ?
+ [
+ ExecMethod = Execute ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_RULER // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_STATUS_PAGE // ole : no, status : ?
+ [
+ ExecMethod = ExecStatusBar ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_STATUS_LAYOUT // ole : no, status : ?
+ [
+ ExecMethod = ExecStatusBar ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_SCALE // ole : no, status : ?
+ [
+ ExecMethod = ExecStatusBar ;
+ StateMethod = GetStatusBarState ;
+ ]
+ SID_THESAURUS // ole : no, status : ?
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_COLORVIEW // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SET_DEFAULT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PRESENTATIONOBJECT
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ // Templates
+ // no menu entry
+ SID_STYLE_FAMILY2 // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_STYLE_FAMILY3 // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ // Templates
+ // no menu entry
+ SID_STYLE_FAMILY5 // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ ]
+ // no menu entry
+ SID_STYLE_EDIT // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ // no menu entry
+ SID_STYLE_UPDATE_BY_EXAMPLE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ // no menu entry
+ SID_STYLE_WATERCAN // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ // no menu entry
+ SID_STYLE_NEW_BY_EXAMPLE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ // no menu entry
+ SID_STYLE_NEW // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ // no menu entry
+ SID_STYLE_DELETE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_STYLE_HIDE
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_STYLE_SHOW
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetAttrState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_AUTOSPELL_CHECK // ole : no, status : play rec
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PREVIEW_STATE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PRESENTATION_DLG
+ [
+ ExecMethod = FuTemporary ;
+ ]
+ SID_REMOTE_DLG
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_CUSTOMSHOW_DLG
+ [
+ ExecMethod = FuTemporary ;
+ ]
+ SID_EXPAND_PAGE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_SUMMARY_PAGE // ole : no, status : ?
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_DATE_FIX // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_DATE_VAR // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_TIME_FIX // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_TIME_VAR // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_PAGE_TITLE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_PAGE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_PAGES // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_FILE // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_INSERT_FLD_AUTHOR // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_MODIFY_FIELD // ole : no, status : play rec
+ [
+ ExecMethod = FuTemporaryModify ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_MAIL_SCROLLBODY_PAGEDOWN // ole : no, status : ?
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_STYLE_FAMILY
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_TRANSLITERATE_SENTENCE_CASE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_TITLE_CASE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_TOGGLE_CASE // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_UPPER // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_LOWER // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_HALFWIDTH // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_FULLWIDTH // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_HIRAGANA // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_TRANSLITERATE_KATAKANA // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetCtrlState ;
+ ]
+ SID_OPT_LOCALE_CHANGED // ole : no, status : ?
+ [
+ ExecMethod = ExecCtrl ;
+ StateMethod = GetCtrlState ;
+ ]
+
+ SID_GETUNDOSTRINGS // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_UNDO // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_GETREDOSTRINGS // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_REDO // ole : no, status : ?
+ [
+ ExecMethod = FuSupport ;
+ StateMethod = GetMenuState ;
+ ]
+
+ SID_SEARCH_OPTIONS // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ GroupId = SfxGroupId::Document ;
+ ]
+ SID_SEARCH_ITEM // ole : ?, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetState ;
+ ]
+ SID_SPELL_DIALOG // ole : no, status : ?
+ [
+ ExecMethod = Execute ;
+ StateMethod = GetMenuState ;
+ ]
+ SID_PHOTOALBUM
+ [
+ ExecMethod = FuTemporary ;
+ StateMethod = GetMenuState ;
+ ]
+}
+
+shell OutlineViewShell
+{
+ import OutlineView;
+}
+
diff --git a/sd/sdi/sdgslots.sdi b/sd/sdi/sdgslots.sdi
new file mode 100644
index 000000000..e7c94ab32
--- /dev/null
+++ b/sd/sdi/sdgslots.sdi
@@ -0,0 +1,89 @@
+/*
+ * 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 .
+ */
+module StarDraw
+[
+ SlotIdFile( "sdslots.hrc" )
+]
+{
+ include "sfxitems.sdi"
+ include "sfx.sdi"
+ include "svxitems.sdi"
+ include "xoitems.sdi"
+ include "svx.sdi"
+
+ enum FadeEffect
+ {
+ FADE_EFFECT_NONE ,
+ FADE_EFFECT_FADE_FROM_LEFT ,
+ FADE_EFFECT_FADE_FROM_TOP ,
+ FADE_EFFECT_FADE_FROM_RIGHT ,
+ FADE_EFFECT_FADE_FROM_BOTTOM ,
+ FADE_EFFECT_FADE_TO_CENTER ,
+ FADE_EFFECT_FADE_FROM_CENTER ,
+ FADE_EFFECT_MOVE_FROM_LEFT ,
+ FADE_EFFECT_MOVE_FROM_TOP ,
+ FADE_EFFECT_MOVE_FROM_RIGHT ,
+ FADE_EFFECT_MOVE_FROM_BOTTOM ,
+ FADE_EFFECT_ROLL_FROM_LEFT ,
+ FADE_EFFECT_ROLL_FROM_TOP ,
+ FADE_EFFECT_ROLL_FROM_RIGHT ,
+ FADE_EFFECT_ROLL_FROM_BOTTOM ,
+ FADE_EFFECT_VERTICAL_STRIPES ,
+ FADE_EFFECT_HORIZONTAL_STRIPES ,
+ FADE_EFFECT_OPEN_VERTICAL ,
+ FADE_EFFECT_CLOSE_VERTICAL ,
+ FADE_EFFECT_OPEN_HORIZONTAL ,
+ FADE_EFFECT_CLOSE_HORIZONTAL ,
+ FADE_EFFECT_CLEAR_AWAY ,
+ FADE_EFFECT_OVERLAY
+ }
+
+ enum FadeSpeed
+ {
+ FADE_SPEED_SLOW ,
+ FADE_SPEED_MEDIUM ,
+ FADE_SPEED_FAST
+ }
+
+ enum PresChange
+ {
+ PresChange::Manual,
+ PresChange::Auto,
+ PresChange::SemiAuto
+ };
+
+ // Items
+ item UINT32 DiaTimeItem ;
+ item PresChange DiaAutoItem ;
+ item FadeEffect DiaEffectItem ;
+ item FadeSpeed DiaSpeedItem ;
+
+ include "sdraw.sdi"
+ include "app.sdi"
+ include "_drvwsh.sdi"
+ include "grviewsh.sdi"
+ include "outlnvsh.sdi"
+ include "drtxtob.sdi"
+ include "drbezob.sdi"
+ include "_docsh.sdi"
+ include "grdocsh.sdi"
+ include "drgrfob.sdi"
+ include "mediaob.sdi"
+ include "tables.sdi"
+}
+
diff --git a/sd/sdi/sdraw.sdi b/sd/sdi/sdraw.sdi
new file mode 100644
index 000000000..09124f3f4
--- /dev/null
+++ b/sd/sdi/sdraw.sdi
@@ -0,0 +1,4690 @@
+/*
+ * 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 .
+ */
+
+SfxVoidItem AdvancedMode SID_OBJECT_CHOOSE_MODE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem AnimationEffects SID_ANIMATION_EFFECTS
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem ExecuteAnimationEffect SID_EXECUTE_ANIMATION_EFFECT
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxBoolItem AnimationObjects SID_ANIMATION_OBJECTS
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxBoolItem AnimatorAddObject SID_ANIMATOR_ADD
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxBoolItem AnimatorCreateObject SID_ANIMATOR_CREATE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxBoolItem AnimatorInit SID_ANIMATOR_INIT
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxUInt16Item AnimatorState SID_ANIMATOR_STATE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem Backward SID_MOREBACK
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem ObjectBackOne SID_FRAME_DOWN
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem BeforeObject SID_BEFORE_OBJ
+()
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem BehindObject SID_BEHIND_OBJ
+()
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem Break SID_BREAK
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem CapturePoint SID_CAPTUREPOINT
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem ChangeBezier SID_CHANGEBEZIER
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem ChangePolygon SID_CHANGEPOLYGON
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem ClickChangeRotation SID_CLICK_CHANGE_ROTATION
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem CloseObject SID_OBJECT_CLOSE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem ColorView SID_COLORVIEW
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem TextCombine SID_TEXT_COMBINE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem Combine SID_COMBINE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem Cone SID_3D_CONE
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem Connect SID_CONNECT
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem Connector SID_TOOL_CONNECTOR
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorArrowEnd SID_CONNECTOR_ARROW_END
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorArrows SID_CONNECTOR_ARROWS
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorArrowStart SID_CONNECTOR_ARROW_START
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxVoidItem ConnectorAttributes SID_CONNECTION_DLG
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxBoolItem ConnectorCircleEnd SID_CONNECTOR_CIRCLE_END
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorCircles SID_CONNECTOR_CIRCLES
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorCircleStart SID_CONNECTOR_CIRCLE_START
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorCurve SID_CONNECTOR_CURVE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorCurveArrowEnd SID_CONNECTOR_CURVE_ARROW_END
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorCurveArrows SID_CONNECTOR_CURVE_ARROWS
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorCurveArrowStart SID_CONNECTOR_CURVE_ARROW_START
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorCurveCircleEnd SID_CONNECTOR_CURVE_CIRCLE_END
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorCurveCircles SID_CONNECTOR_CURVE_CIRCLES
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorCurveCircleStart SID_CONNECTOR_CURVE_CIRCLE_START
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLine SID_CONNECTOR_LINE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLineArrowEnd SID_CONNECTOR_LINE_ARROW_END
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLineArrows SID_CONNECTOR_LINE_ARROWS
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLineArrowStart SID_CONNECTOR_LINE_ARROW_START
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLineCircleEnd SID_CONNECTOR_LINE_CIRCLE_END
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLineCircles SID_CONNECTOR_LINE_CIRCLES
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLineCircleStart SID_CONNECTOR_LINE_CIRCLE_START
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLines SID_CONNECTOR_LINES
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLinesArrowEnd SID_CONNECTOR_LINES_ARROW_END
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLinesArrows SID_CONNECTOR_LINES_ARROWS
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLinesArrowStart SID_CONNECTOR_LINES_ARROW_START
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLinesCircleEnd SID_CONNECTOR_LINES_CIRCLE_END
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLinesCircles SID_CONNECTOR_LINES_CIRCLES
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxBoolItem ConnectorLinesCircleStart SID_CONNECTOR_LINES_CIRCLE_START
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Connector;
+]
+
+SfxVoidItem ConnectorToolbox SID_DRAWTBX_CONNECTORS
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem convert_to_contour SID_CONVERT_TO_CONTOUR
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem ConvertInto3D SID_CONVERT_TO_3D
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem ConvertInto3DLathe SID_CONVERT_TO_3D_LATHE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem ConvertInto3DLatheFast SID_CONVERT_TO_3D_LATHE_FAST
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem ConvertIntoBitmap SID_CONVERT_TO_BITMAP
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem ConvertIntoMetaFile SID_CONVERT_TO_METAFILE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem CopyObjects SID_COPYOBJECTS
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxBoolItem CrookRotate SID_OBJECT_CROOK_ROTATE
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem CrookSlant SID_OBJECT_CROOK_SLANT
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem CrookStretch SID_OBJECT_CROOK_STRETCH
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem Cube SID_3D_CUBE
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem CustomShowDialog SID_CUSTOMSHOW_DLG
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxBoolItem Cylinder SID_3D_CYLINDER
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem Cyramid SID_3D_PYRAMID
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem DeleteLayer SID_DELETE_LAYER
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxVoidItem DeletePage SID_DELETE_PAGE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxStringItem DeleteSnapItem SID_DELETE_SNAPITEM
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxVoidItem DeSelect SID_UNSELECT
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxBoolItem DiaMode SID_SLIDE_SORTER_MODE
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem Dismantle SID_DISMANTLE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem DoubleClickTextEdit SID_DOUBLECLICK_TEXTEDIT
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxBoolItem DrawingMode SID_DRAWINGMODE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem DuplicatePage SID_DUPLICATE_PAGE
+(SfxStringItem PageName ID_VAL_PAGENAME,SfxUInt32Item WhatLayout ID_VAL_WHATLAYOUT,SfxBoolItem IsPageBack ID_VAL_ISPAGEBACK,SfxBoolItem IsPageObj ID_VAL_ISPAGEOBJ)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem EditOutline SID_EDIT_OUTLINER
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxBoolItem CustomAnimation SID_CUSTOM_ANIMATION_PANEL
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem EllipseToolbox SID_DRAWTBX_ELLIPSES
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem RedactedExportToolbox SID_DRAWTBX_REDACTED_EXPORT
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem ExpandPage SID_EXPAND_PAGE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxVoidItem SetFillColor SID_SETFILLCOLOR
+(SfxUInt32Item Red ID_VAL_RED,SfxUInt32Item Green ID_VAL_GREEN,SfxUInt32Item Blue ID_VAL_BLUE)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxVoidItem Forward SID_MOREFRONT
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem ObjectForwardOne SID_FRAME_UP
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem GetBlue SID_GETBLUE
+(SfxUInt32Item WhatKind ID_VAL_WHATKIND)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxUInt32Item GetFillStyle SID_GETFILLSTYLE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem GetGreen SID_GETGREEN
+(SfxUInt32Item WhatKind ID_VAL_WHATKIND)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxUInt32Item GetLineStyle SID_GETLINESTYLE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxUInt32Item GetLineWidth SID_GETLINEWIDTH
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem GetRed SID_GETRED
+(SfxUInt32Item WhatKind ID_VAL_WHATKIND)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem GlueEditMode SID_GLUE_EDITMODE
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxUInt16Item GlueEscapeDirection SID_GLUE_ESCDIR
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem GlueEscapeDirectionBottom SID_GLUE_ESCDIR_BOTTOM
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem GlueEscapeDirectionLeft SID_GLUE_ESCDIR_LEFT
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem GlueEscapeDirectionRight SID_GLUE_ESCDIR_RIGHT
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem GlueEscapeDirectionTop SID_GLUE_ESCDIR_TOP
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem GlueHorzAlignCenter SID_GLUE_HORZALIGN_CENTER
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem GlueHorzAlignLeft SID_GLUE_HORZALIGN_LEFT
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem GlueHorzAlignRight SID_GLUE_HORZALIGN_RIGHT
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem GlueInsertPoint SID_GLUE_INSERT_POINT
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem GluePercent SID_GLUE_PERCENT
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = TRUE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem GlueVertAlignBottom SID_GLUE_VERTALIGN_BOTTOM
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem GlueVertAlignCenter SID_GLUE_VERTALIGN_CENTER
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem GlueVertAlignTop SID_GLUE_VERTALIGN_TOP
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem Gradient SID_GRADIENT
+(SfxStringItem Name ID_VAL_INDEX,SfxUInt32Item Style ID_VAL_STYLE,SfxUInt32Item Angle ID_VAL_ANGLE,SfxUInt32Item Border ID_VAL_BORDER,SfxUInt32Item XOffset ID_VAL_CENTER_X,SfxUInt32Item YOffset ID_VAL_CENTER_Y,SfxUInt32Item StartIntens ID_VAL_STARTINTENS,SfxUInt32Item EndIntens ID_VAL_ENDINTENS)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem GradientEndColor SID_SETGRADENDCOLOR
+(SfxStringItem Name ID_VAL_INDEX,SfxUInt32Item Red ID_VAL_RED,SfxUInt32Item Green ID_VAL_GREEN,SfxUInt32Item Blue ID_VAL_BLUE)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxVoidItem GradientStartColor SID_SETGRADSTARTCOLOR
+(SfxStringItem Name ID_VAL_INDEX,SfxUInt32Item Red ID_VAL_RED,SfxUInt32Item Green ID_VAL_GREEN,SfxUInt32Item Blue ID_VAL_BLUE)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxBoolItem GridFront SID_GRID_FRONT
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem HalfSphere SID_3D_HALF_SPHERE
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem HandoutMode SID_HANDOUT_MASTER_MODE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Document;
+]
+
+SfxVoidItem Hatch SID_HATCH
+(SfxStringItem Name ID_VAL_INDEX,SfxUInt32Item Style ID_VAL_STYLE,SfxUInt32Item Distance ID_VAL_DISTANCE,SfxUInt32Item Angle ID_VAL_ANGLE)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem HatchColor SID_SETHATCHCOLOR
+(SfxStringItem Name ID_VAL_INDEX,SfxUInt32Item Red ID_VAL_RED,SfxUInt32Item Green ID_VAL_GREEN,SfxUInt32Item Blue ID_VAL_BLUE)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxBoolItem HelplinesFront SID_HELPLINES_FRONT
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem HelplinesUse SID_HELPLINES_USE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem HelplinesVisible SID_HELPLINES_VISIBLE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem HideSlide SID_HIDE_SLIDE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem ShowSlide SID_SHOW_SLIDE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem Hyphenation SID_HYPHENATION
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = TRUE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem ImportFromFile SID_INSERTFILE
+(SfxStringItem FileName ID_VAL_DUMMY1,SfxStringItem FilterName ID_VAL_DUMMY2)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem InsertAuthorField SID_INSERT_FLD_AUTHOR
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem InsertDateFieldFix SID_INSERT_FLD_DATE_FIX
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem InsertDateFieldVar SID_INSERT_FLD_DATE_VAR
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem InsertFileField SID_INSERT_FLD_FILE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem InsertLayer SID_INSERTLAYER
+(SfxStringItem LayerName ID_VAL_LAYERNAME,SfxBoolItem IsVisible ID_VAL_ISVISIBLE,SfxBoolItem IsLocked ID_VAL_ISLOCKED,SfxBoolItem IsPrintable ID_VAL_ISPRINTABLE)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem InsertPage SID_INSERTPAGE
+(SfxStringItem PageName ID_VAL_PAGENAME,SfxUInt32Item WhatLayout ID_VAL_WHATLAYOUT,SfxBoolItem IsPageBack ID_VAL_ISPAGEBACK,SfxBoolItem IsPageObj ID_VAL_ISPAGEOBJ)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem InsertPageField SID_INSERT_FLD_PAGE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem InsertPageTitleField SID_INSERT_FLD_PAGE_TITLE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem InsertPagesField SID_INSERT_FLD_PAGES
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem InsertPageQuick SID_INSERTPAGE_QUICK
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem InsertTimeFieldFix SID_INSERT_FLD_TIME_FIX
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem InsertTimeFieldVar SID_INSERT_FLD_TIME_VAR
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem InsertToolbox SID_DRAWTBX_INSERT
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem InteractiveGradient SID_OBJECT_GRADIENT
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem InteractiveTransparence SID_OBJECT_TRANSPARENCE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem LayerMode SID_LAYERMODE
+(SfxBoolItem IsActive ID_VAL_ISACTIVE,SfxUInt32Item WhatLayer ID_VAL_WHATLAYER)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxStringItem LayoutStatus SID_STATUS_LAYOUT
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxStringItem Scale SID_SCALE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem LeaveAllGroups SID_LEAVE_ALL_GROUPS
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem LineColor SID_SETLINECOLOR
+(SfxUInt32Item Red ID_VAL_RED,SfxUInt32Item Green ID_VAL_GREEN,SfxUInt32Item Blue ID_VAL_BLUE)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxVoidItem LineEndPolygon SID_LINEEND_POLYGON
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem LineTo SID_LINETO
+(SfxUInt32Item MouseEndX ID_VAL_MOUSEEND_X,SfxUInt32Item MouseEndY ID_VAL_MOUSEEND_Y)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem ManageLinks SID_MANAGE_LINKS
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxBoolItem MasterPage SID_MASTERPAGE
+(SfxBoolItem Isactive ID_VAL_ISACTIVE)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem MirrorHorz SID_HORIZONTAL
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem MirrorVert SID_VERTICAL
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem ModifyField SID_MODIFY_FIELD
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxVoidItem ModifyLayer SID_MODIFYLAYER
+(SfxStringItem LayerName ID_VAL_LAYERNAME,SfxBoolItem IsVisible ID_VAL_ISVISIBLE,SfxBoolItem IsLocked ID_VAL_ISLOCKED,SfxBoolItem IsPrintable ID_VAL_ISPRINTABLE)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem ModifyPage SID_MODIFYPAGE
+(SfxStringItem PageName ID_VAL_PAGENAME,SfxUInt32Item WhatLayout ID_VAL_WHATLAYOUT,SfxBoolItem IsPageBack ID_VAL_ISPAGEBACK,SfxBoolItem IsPageObj ID_VAL_ISPAGEOBJ)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem AssignLayout SID_ASSIGN_LAYOUT
+(SfxUInt32Item WhatPage ID_VAL_WHATPAGE, SfxUInt32Item WhatLayout ID_VAL_WHATLAYOUT)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Modify;
+]
+
+
+SfxBoolItem ToggleTabBarVisibility SID_TOGGLE_TABBAR_VISIBILITY
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = TRUE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+
+SfxVoidItem DisplayMode SID_DISPLAY_MODE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem ModifyPresentationObject SID_PRESENTATIONOBJECT
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem Morphing SID_POLYGON_MORPHING
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem MoveTo SID_MOVETO
+(SfxUInt32Item MouseStartX ID_VAL_MOUSESTART_X,SfxUInt32Item MouseStartY ID_VAL_MOUSESTART_Y)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem NameGroup SID_NAME_GROUP
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+//-#i68101#------------------------------------------------------------------------
+SfxVoidItem ObjectTitleDescription SID_OBJECT_TITLE_DESCRIPTION
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem NavigatorInit SID_NAVIGATOR_INIT
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxStringItem NavigatorObject SID_NAVIGATOR_OBJECT
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxUInt16Item NavigatorPage SID_NAVIGATOR_PAGE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxStringItem NavigatorPageName SID_NAVIGATOR_PAGENAME
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxUInt32Item NavigatorState SID_NAVIGATOR_STATE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxBoolItem NewRouting SID_CONNECTION_NEW_ROUTING
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem NotesMasterPage SID_NOTES_MASTER_MODE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem NotesMode SID_NOTES_MODE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem ObjectPosition SID_POSITION
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem Objects3DToolbox SID_DRAWTBX_3D_OBJECTS
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem OriginalSize SID_ORIGINAL_SIZE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem OutlineMode SID_OUTLINE_MODE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem OutputQualityBlackWhite SID_OUTPUT_QUALITY_BLACKWHITE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem OutputQualityColor SID_OUTPUT_QUALITY_COLOR
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem OutputQualityContrast SID_OUTPUT_QUALITY_CONTRAST
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem OutputQualityGrayscale SID_OUTPUT_QUALITY_GRAYSCALE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem PageMargin SID_PAGEMARGIN
+(SfxUInt32Item PageLeft ID_VAL_PAGELEFT,SfxUInt32Item PageRight ID_VAL_PAGERIGHT,SfxUInt32Item PageTop ID_VAL_PAGETOP,SfxUInt32Item PageBottom ID_VAL_PAGEBOTTOM,SfxBoolItem ScaleObjects ID_VAL_SCALEOBJECTS)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem PageMode SID_PAGEMODE
+(SfxBoolItem IsActive ID_VAL_ISACTIVE,SfxUInt32Item WhatKind ID_VAL_WHATKIND)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem PageSetup SID_PAGESETUP
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem PageSize SID_PAGESIZE
+(SfxUInt32Item PageWidth ID_VAL_PAGEWIDTH,SfxUInt32Item PageHeight ID_VAL_PAGEHEIGHT,SfxBoolItem ScaleObjects ID_VAL_SCALEOBJECTS)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Application;
+]
+
+SfxUInt16Item PagesPerRow SID_PAGES_PER_ROW
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxStringItem PageStatus SID_STATUS_PAGE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem PickThrough SID_PICK_THROUGH
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem Presentation SID_PRESENTATION
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem PresentationCurrentSlide SID_PRESENTATION_CURRENT_SLIDE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem PresentationDialog SID_PRESENTATION_DLG
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem Remote SID_REMOTE_DLG
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+ AccelConfig = FALSE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem PresentationEnd SID_PRESENTATION_END
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem ClearUndoStack SID_CLEAR_UNDO_STACK
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem PresentationLayout SID_PRESENTATION_LAYOUT
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxUInt32Item PreviewState SID_PREVIEW_STATE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem QuickEdit SID_QUICKEDIT
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem RectangleToolbox SID_DRAWTBX_RECTANGLES
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem RehearseTimings SID_REHEARSE_TIMINGS
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem RenameLayer SID_RENAMELAYER
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxVoidItem RenamePage SID_RENAMEPAGE
+(SfxStringItem Name SID_RENAMEPAGE)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxVoidItem RenamePageQuick SID_RENAMEPAGE_QUICK
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxVoidItem ReverseOrder SID_REVERSE_ORDER
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SvxObjectItem RulerObject SID_RULER_OBJECT
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = ;
+]
+
+SfxVoidItem SelectGradient SID_SELECTGRADIENT
+(SfxStringItem Name ID_VAL_INDEX)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxVoidItem SelectHatch SID_SELECTHATCH
+(SfxStringItem Name ID_VAL_INDEX)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Edit;
+]
+
+SfxVoidItem SetFillStyle SID_SETFILLSTYLE
+(SfxUInt32Item Style ID_VAL_STYLE)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxVoidItem SetLineStyle SID_SETLINESTYLE
+(SfxUInt32Item Style ID_VAL_STYLE)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxVoidItem SetLineWidth SID_SETLINEWIDTH
+(SfxUInt32Item Width ID_VAL_WIDTH)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxStringItem SetSnapItem SID_SET_SNAPITEM
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem Shear SID_OBJECT_SHEAR
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem Shell3D SID_3D_SHELL
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem SlideChangeWindow SID_SLIDE_TRANSITIONS_PANEL
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem MasterSlidesPanel SID_MASTER_SLIDES_PANEL
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem SlideMasterPage SID_SLIDE_MASTER_MODE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem SnapBorder SID_SNAP_BORDER
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem SnapFrame SID_SNAP_FRAME
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem SnapPoints SID_SNAP_POINTS
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem SolidCreate SID_SOLID_CREATE
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem Sphere SID_3D_SPHERE
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem SummaryPage SID_SUMMARY_PAGE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem SwitchLayer SID_SWITCHLAYER
+(SfxUInt32Item WhatLayer ID_VAL_WHATLAYER)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem SwitchPage SID_SWITCHPAGE
+(SfxUInt32Item WhatPage ID_VAL_WHATPAGE,SfxUInt32Item WhatKind ID_VAL_WHATKIND)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem SwitchPointEdit SID_SWITCH_POINTEDIT
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem TextAttributes SID_TEXTATTR_DLG
+(SfxBoolItem IsAutoGrow ID_VAL_DUMMY0,SfxBoolItem IsCenter ID_VAL_DUMMY1,SfxBoolItem IsFitToSize ID_VAL_DUMMY2,SfxUInt32Item LeftBorder ID_VAL_DUMMY3,SfxUInt32Item RightBorder ID_VAL_DUMMY4,SfxUInt32Item TopBorder ID_VAL_DUMMY5,SfxUInt32Item BottomBorder ID_VAL_DUMMY6)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxBoolItem TextFitToSizeTool SID_TEXT_FITTOSIZE
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxBoolItem TextAutoFitToSize SID_OUTLINE_TEXT_AUTOFIT
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxVoidItem TextToolbox SID_DRAWTBX_TEXT
+
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem Torus SID_3D_TORUS
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem VerticalTextFitToSizeTool SID_TEXT_FITTOSIZE_VERTICAL
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxVoidItem ZoomPanning SID_ZOOM_PANNING
+()
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem ZoomMode SID_ZOOM_MODE
+()
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem Mirror SID_OBJECT_MIRROR
+( SfxBoolItem MirrorVert ID_VAL_MIRRORVERT )
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Document ;
+]
+
+SfxVoidItem HeaderAndFooter SID_HEADER_AND_FOOTER
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem InsertPageNumber SID_INSERT_PAGE_NUMBER
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem InsertDateAndTime SID_INSERT_DATE_TIME
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem MasterLayouts SID_MASTER_LAYOUTS
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem DrawFontwork SID_DRAW_FONTWORK
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxBoolItem DrawFontworkVertical SID_DRAW_FONTWORK_VERTICAL
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Drawing;
+]
+
+SfxVoidItem InsertMasterPage SID_INSERT_MASTER_PAGE(
+SfxStringItem PageName ID_VAL_PAGENAME,
+SfxUInt32Item WhatLayout ID_VAL_WHATLAYOUT,
+SfxBoolItem IsPageBack ID_VAL_ISPAGEBACK,
+SfxBoolItem IsPageObj ID_VAL_ISPAGEOBJ)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+SfxVoidItem DeleteMasterPage SID_DELETE_MASTER_PAGE()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Edit;
+]
+SfxVoidItem RenameMasterPage SID_RENAME_MASTER_PAGE()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxVoidItem CloseMasterView SID_CLOSE_MASTER_VIEW()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxVoidItem SelectBackground SID_SELECT_BACKGROUND
+(SfxStringItem FileName SID_SELECT_BACKGROUND,SfxStringItem FilterName FN_PARAM_FILTER,SfxBoolItem AsLink FN_PARAM_1,SfxStringItem Style FN_PARAM_2)
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem SaveBackground SID_SAVE_BACKGROUND
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxBoolItem DisplayMasterBackground SID_DISPLAY_MASTER_BACKGROUND
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::View;
+]
+SfxBoolItem DisplayMasterObjects SID_DISPLAY_MASTER_OBJECTS
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxVoidItem SetMinimalColumnWidth SID_TABLE_MINIMAL_COLUMN_WIDTH
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Table;
+]
+
+SfxVoidItem SetOptimalColumnWidth SID_TABLE_OPTIMAL_COLUMN_WIDTH
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Table;
+]
+
+SfxVoidItem DistributeColumns SID_TABLE_DISTRIBUTE_COLUMNS
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Table;
+]
+
+SfxVoidItem SetMinimalRowHeight SID_TABLE_MINIMAL_ROW_HEIGHT
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Table;
+]
+
+SfxVoidItem SetOptimalRowHeight SID_TABLE_OPTIMAL_ROW_HEIGHT
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Table;
+]
+
+SfxVoidItem DistributeRows SID_TABLE_DISTRIBUTE_ROWS
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Table;
+]
+
+SfxVoidItem TaskPaneInsertPage SID_INSERTPAGE_LAYOUT_MENU
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Insert;
+]
+
+/** This item holds the requested type of view shell when calling the
+ SID_SWITCH_SHELL slot.
+*/
+SfxInt32Item SwitchViewShell SID_SWITCH_SHELL
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem LeftPaneImpress SID_LEFT_PANE_IMPRESS
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem LeftPaneDraw SID_LEFT_PANE_DRAW
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem NotesChildWindow SID_NOTES_WINDOW
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = TRUE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::View;
+]
+
+SfxBoolItem NormalMultiPaneGUI SID_NORMAL_MULTI_PANE_GUI
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem SlideSorterMultiPaneGUI SID_SLIDE_SORTER_MULTI_PANE_GUI
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+ Asynchron;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem PhotoAlbumDialog SID_PHOTOALBUM
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem PresentationMinimizer SID_PRESENTATION_MINIMIZER
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = TRUE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerItem;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem HideLastLevel SID_HIDE_LAST_LEVEL
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem ShowNextLevel SID_SHOW_NEXT_LEVEL
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = FALSE,
+ ToolBoxConfig = FALSE,
+ GroupId = SfxGroupId::Options;
+]
+
+SfxVoidItem NextPage SID_GO_TO_NEXT_PAGE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem PreviousPage SID_GO_TO_PREVIOUS_PAGE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem FirstPage SID_GO_TO_FIRST_PAGE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem LastPage SID_GO_TO_LAST_PAGE
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = TRUE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = FALSE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem MovePageUp SID_MOVE_PAGE_UP
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem MovePageDown SID_MOVE_PAGE_DOWN
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem MovePageFirst SID_MOVE_PAGE_FIRST
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxVoidItem MovePageLast SID_MOVE_PAGE_LAST
+()
+[
+ AutoUpdate = FALSE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Modify;
+]
+
+SfxBoolItem UnderlineNone SID_ULINE_VAL_NONE
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxBoolItem UnderlineSingle SID_ULINE_VAL_SINGLE
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxBoolItem UnderlineDouble SID_ULINE_VAL_DOUBLE
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
+
+SfxBoolItem UnderlineDotted SID_ULINE_VAL_DOTTED
+
+[
+ AutoUpdate = TRUE,
+ FastCall = FALSE,
+ ReadOnlyDoc = FALSE,
+ Toggle = FALSE,
+ Container = FALSE,
+ RecordAbsolute = FALSE,
+ RecordPerSet;
+
+
+ AccelConfig = TRUE,
+ MenuConfig = TRUE,
+ ToolBoxConfig = TRUE,
+ GroupId = SfxGroupId::Format;
+]
diff --git a/sd/sdi/sdslots.hrc b/sd/sdi/sdslots.hrc
new file mode 100644
index 000000000..64760097e
--- /dev/null
+++ b/sd/sdi/sdslots.hrc
@@ -0,0 +1,27 @@
+/* -*- 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 <sfx2/sfxsids.hrc>
+#include <editeng/editids.hrc>
+#include <editeng/memberids.h>
+#include <svx/svxids.hrc>
+#include <svx/unomid.hxx>
+#include <app.hrc>
+#include <sdattr.hrc>
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/sdi/sdslots.sdi b/sd/sdi/sdslots.sdi
new file mode 100644
index 000000000..751c09901
--- /dev/null
+++ b/sd/sdi/sdslots.sdi
@@ -0,0 +1,91 @@
+/*
+ * 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 .
+ */
+
+module StarDraw
+[
+ SlotIdFile( "sdslots.hrc" )
+]
+{
+ include "sfxitems.sdi"
+ include "sfx.sdi"
+ include "svxitems.sdi"
+ include "xoitems.sdi"
+ include "svx.sdi"
+
+ enum FadeEffect
+ {
+ FADE_EFFECT_NONE ,
+ FADE_EFFECT_FADE_FROM_LEFT ,
+ FADE_EFFECT_FADE_FROM_TOP ,
+ FADE_EFFECT_FADE_FROM_RIGHT ,
+ FADE_EFFECT_FADE_FROM_BOTTOM ,
+ FADE_EFFECT_FADE_TO_CENTER ,
+ FADE_EFFECT_FADE_FROM_CENTER ,
+ FADE_EFFECT_MOVE_FROM_LEFT ,
+ FADE_EFFECT_MOVE_FROM_TOP ,
+ FADE_EFFECT_MOVE_FROM_RIGHT ,
+ FADE_EFFECT_MOVE_FROM_BOTTOM ,
+ FADE_EFFECT_ROLL_FROM_LEFT ,
+ FADE_EFFECT_ROLL_FROM_TOP ,
+ FADE_EFFECT_ROLL_FROM_RIGHT ,
+ FADE_EFFECT_ROLL_FROM_BOTTOM ,
+ FADE_EFFECT_VERTICAL_STRIPES ,
+ FADE_EFFECT_HORIZONTAL_STRIPES ,
+ FADE_EFFECT_OPEN_VERTICAL ,
+ FADE_EFFECT_CLOSE_VERTICAL ,
+ FADE_EFFECT_OPEN_HORIZONTAL ,
+ FADE_EFFECT_CLOSE_HORIZONTAL ,
+ FADE_EFFECT_CLEAR_AWAY ,
+ FADE_EFFECT_OVERLAY
+ }
+
+ enum FadeSpeed
+ {
+ FADE_SPEED_SLOW ,
+ FADE_SPEED_MEDIUM ,
+ FADE_SPEED_FAST
+ }
+
+ enum PresChange
+ {
+ PresChange::Manual,
+ PresChange::Auto,
+ PresChange::SemiAuto
+ };
+
+ // Items
+ item UINT32 DiaTimeItem ;
+ item PresChange DiaAutoItem ;
+ item FadeEffect DiaEffectItem ;
+ item FadeSpeed DiaSpeedItem ;
+
+ include "sdraw.sdi"
+ include "app.sdi"
+ include "_drvwsh.sdi"
+ include "drviewsh.sdi"
+ include "outlnvsh.sdi"
+ include "drtxtob.sdi"
+ include "drbezob.sdi"
+ include "_docsh.sdi"
+ include "docshell.sdi"
+ include "drgrfob.sdi"
+ include "SlideSorterController.sdi"
+ include "ViewShellBase.sdi"
+ include "mediaob.sdi"
+ include "tables.sdi"
+ }
diff --git a/sd/sdi/tables.sdi b/sd/sdi/tables.sdi
new file mode 100644
index 000000000..9943ce719
--- /dev/null
+++ b/sd/sdi/tables.sdi
@@ -0,0 +1,193 @@
+/*
+ * 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 .
+ */
+
+shell TableObjectBar
+{
+ SID_FRAME_LINESTYLE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_FRAME_LINECOLOR
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_ATTR_BORDER
+ [
+ ExecMethod = Execute;
+ StateMethod = GetAttrState;
+ ]
+ SID_TABLE_MERGE_CELLS
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_SPLIT_CELLS
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_OPTIMIZE_TABLE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_VERT_BOTTOM
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_VERT_CENTER
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_VERT_NONE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_INSERT_ROW
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_INSERT_COL
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_INSERT_ROW_DLG
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_INSERT_ROW_BEFORE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_INSERT_ROW_AFTER
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_INSERT_COL_DLG
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_INSERT_COL_BEFORE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_INSERT_COL_AFTER
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_DELETE_ROW
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_DELETE_COL
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_DELETE_TABLE
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_SELECT_ALL
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_SELECT_COL
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_SELECT_ROW
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_FORMAT_TABLE_DLG
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_SORT_DIALOG
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_AUTOSUM
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+
+ SID_TABLE_MINIMAL_COLUMN_WIDTH
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+
+ SID_TABLE_OPTIMAL_COLUMN_WIDTH
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+
+ SID_TABLE_DISTRIBUTE_COLUMNS
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+
+ SID_TABLE_MINIMAL_ROW_HEIGHT
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+
+ SID_TABLE_OPTIMAL_ROW_HEIGHT
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+
+ SID_TABLE_DISTRIBUTE_ROWS
+ [
+ ExecMethod = Execute;
+ StateMethod = GetState;
+ ]
+ SID_TABLE_CHANGE_CURRENT_BORDER_POSITION
+ [
+ ExecMethod = Execute;
+ ]
+
+}
+
diff --git a/sd/source/core/CustomAnimationCloner.cxx b/sd/source/core/CustomAnimationCloner.cxx
new file mode 100644
index 000000000..ea42e3bac
--- /dev/null
+++ b/sd/source/core/CustomAnimationCloner.cxx
@@ -0,0 +1,307 @@
+/* -*- 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 <com/sun/star/animations/XAnimate.hpp>
+#include <com/sun/star/animations/XAnimationNode.hpp>
+#include <com/sun/star/animations/Event.hpp>
+#include <com/sun/star/animations/XCommand.hpp>
+#include <com/sun/star/animations/XIterateContainer.hpp>
+#include <com/sun/star/animations/XAudio.hpp>
+#include <com/sun/star/animations/AnimationNodeType.hpp>
+#include <com/sun/star/animations/ValuePair.hpp>
+#include <com/sun/star/util/XCloneable.hpp>
+#include <com/sun/star/presentation/ParagraphTarget.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/beans/NamedValue.hpp>
+
+#include <map>
+
+#include <tools/debug.hxx>
+#include <tools/diagnose_ex.h>
+#include <animations/animationnodehelper.hxx>
+
+#include <svx/svditer.hxx>
+
+#include <CustomAnimationCloner.hxx>
+#include <sdpage.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::animations;
+using namespace ::com::sun::star::presentation;
+using namespace ::com::sun::star::container;
+
+using ::com::sun::star::drawing::XShape;
+using ::com::sun::star::beans::NamedValue;
+
+namespace sd
+{
+ namespace {
+
+ class CustomAnimationClonerImpl
+ {
+ public:
+ CustomAnimationClonerImpl();
+ Reference< XAnimationNode > Clone( const Reference< XAnimationNode >& xSourceNode, const SdPage* pSource, const SdPage* pTarget );
+
+ private:
+ void transformNode( const Reference< XAnimationNode >& xNode );
+ Any transformValue( const Any& rValue );
+
+ Reference< XShape > getClonedShape( const Reference< XShape >& xSource ) const;
+ Reference< XAnimationNode > getClonedNode( const Reference< XAnimationNode >& xSource ) const;
+
+ mutable ::std::map< Reference< XShape >, Reference< XShape > > maShapeMap;
+ std::vector< Reference< XAnimationNode > > maSourceNodeVector;
+ std::vector< Reference< XAnimationNode > > maCloneNodeVector;
+ };
+
+ }
+
+ CustomAnimationClonerImpl::CustomAnimationClonerImpl()
+ {
+ }
+
+ Reference< XAnimationNode > Clone( const Reference< XAnimationNode >& xSourceNode, const SdPage* pSource, const SdPage* pTarget )
+ {
+ CustomAnimationClonerImpl aCloner;
+ return aCloner.Clone( xSourceNode, pSource, pTarget );
+ }
+
+ Reference< XAnimationNode > CustomAnimationClonerImpl::Clone( const Reference< XAnimationNode >& xSourceNode, const SdPage* pSourcePage, const SdPage* pTargetPage )
+ {
+ try
+ {
+ // clone animation hierarchy
+ Reference< css::util::XCloneable > xClonable( xSourceNode, UNO_QUERY_THROW );
+ Reference< XAnimationNode > xCloneNode( xClonable->createClone(), UNO_QUERY_THROW );
+
+ // create a dictionary to map source to cloned shapes
+ if( pSourcePage && pTargetPage )
+ {
+ SdrObjListIter aSourceIter( pSourcePage, SdrIterMode::DeepWithGroups );
+ SdrObjListIter aTargetIter( pTargetPage, SdrIterMode::DeepWithGroups );
+
+ while( aSourceIter.IsMore() && aTargetIter.IsMore() )
+ {
+ SdrObject* pSource = aSourceIter.Next();
+ SdrObject* pTarget = aTargetIter.Next();
+
+ if( pSource && pTarget)
+ {
+ Reference< XShape > xSource( pSource->getUnoShape(), UNO_QUERY );
+ Reference< XShape > xTarget( pTarget->getUnoShape(), UNO_QUERY );
+ if( xSource.is() && xTarget.is() )
+ {
+ maShapeMap[xSource] = xTarget;
+ }
+ }
+ }
+ }
+
+ // create a dictionary to map source to cloned nodes
+ ::anim::create_deep_vector( xSourceNode, maSourceNodeVector );
+ ::anim::create_deep_vector( xCloneNode, maCloneNodeVector );
+
+ transformNode( xCloneNode );
+
+ return xCloneNode;
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationClonerImpl::Clone()" );
+ Reference< XAnimationNode > xEmpty;
+ return xEmpty;
+ }
+ }
+
+ void CustomAnimationClonerImpl::transformNode( const Reference< XAnimationNode >& xNode )
+ {
+ try
+ {
+ xNode->setBegin( transformValue( xNode->getBegin() ) );
+ xNode->setEnd( transformValue( xNode->getEnd() ) );
+
+ sal_Int16 nNodeType( xNode->getType() );
+ switch( nNodeType )
+ {
+ case AnimationNodeType::ITERATE:
+ {
+ Reference< XIterateContainer > xIter( xNode, UNO_QUERY_THROW );
+ xIter->setTarget( transformValue( xIter->getTarget() ) );
+ [[fallthrough]];
+ }
+ case AnimationNodeType::PAR:
+ case AnimationNodeType::SEQ:
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
+ transformNode( xChildNode );
+ }
+ }
+ break;
+
+ case AnimationNodeType::ANIMATE:
+ case AnimationNodeType::SET:
+ case AnimationNodeType::ANIMATEMOTION:
+ case AnimationNodeType::ANIMATEPHYSICS:
+ case AnimationNodeType::ANIMATECOLOR:
+ case AnimationNodeType::ANIMATETRANSFORM:
+ case AnimationNodeType::TRANSITIONFILTER:
+ {
+ Reference< XAnimate > xAnimate( xNode, UNO_QUERY_THROW );
+ xAnimate->setTarget( transformValue( xAnimate->getTarget() ) );
+ }
+ break;
+
+ case AnimationNodeType::COMMAND:
+ {
+ Reference< XCommand > xCommand( xNode, UNO_QUERY_THROW );
+ xCommand->setTarget( transformValue( xCommand->getTarget() ) );
+ }
+ break;
+
+ case AnimationNodeType::AUDIO:
+ {
+ Reference< XAudio > xAudio( xNode, UNO_QUERY_THROW );
+ xAudio->setSource( transformValue( xAudio->getSource() ) );
+ }
+ break;
+ }
+
+ Sequence< NamedValue > aUserData( xNode->getUserData() );
+ if( aUserData.hasElements() )
+ {
+ for( NamedValue & namedValue : asNonConstRange(aUserData) )
+ {
+ namedValue.Value = transformValue( namedValue.Value );
+ }
+
+ xNode->setUserData( aUserData );
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationClonerImpl::transformNode()" );
+ }
+ }
+
+ Any CustomAnimationClonerImpl::transformValue( const Any& rValue )
+ {
+ if( rValue.hasValue() ) try
+ {
+ if( rValue.getValueType() == cppu::UnoType<ValuePair>::get() )
+ {
+ ValuePair aValuePair;
+ rValue >>= aValuePair;
+
+ aValuePair.First = transformValue( aValuePair.First );
+ aValuePair.Second = transformValue( aValuePair.Second );
+
+ return Any( aValuePair );
+ }
+ else if( rValue.getValueType() == cppu::UnoType< Sequence<Any> >::get() )
+ {
+ Sequence<Any> aSequence;
+ rValue >>= aSequence;
+
+ for( Any& rAny : asNonConstRange(aSequence) )
+ rAny = transformValue( rAny );
+
+ return Any( aSequence );
+ }
+ else if( rValue.getValueTypeClass() == TypeClass_INTERFACE )
+ {
+ Reference< XShape > xShape;
+ rValue >>= xShape;
+ if( xShape.is() )
+ {
+ return Any( getClonedShape( xShape ) );
+ }
+ else
+ {
+ Reference< XAnimationNode > xNode;
+ rValue >>= xNode;
+ if( xNode.is() )
+ return Any( getClonedNode( xNode ) );
+ }
+ }
+ else if( rValue.getValueType() == cppu::UnoType<ParagraphTarget>::get() )
+ {
+ ParagraphTarget aParaTarget;
+ rValue >>= aParaTarget;
+
+ aParaTarget.Shape = getClonedShape( aParaTarget.Shape );
+
+ return Any( aParaTarget );
+ }
+ else if( rValue.getValueType() == cppu::UnoType<Event>::get() )
+ {
+ Event aEvent;
+ rValue >>= aEvent;
+
+ aEvent.Source = transformValue( aEvent.Source );
+
+ return Any( aEvent );
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationClonerImpl::transformValue()" );
+ }
+
+ return rValue;
+ }
+
+ Reference< XShape > CustomAnimationClonerImpl::getClonedShape( const Reference< XShape >& xSource ) const
+ {
+ if( xSource.is() )
+ {
+ if( maShapeMap.find(xSource) != maShapeMap.end() )
+ {
+ return maShapeMap[xSource];
+ }
+
+ DBG_ASSERT( maShapeMap.empty(), "sd::CustomAnimationClonerImpl::getClonedShape() failed!" );
+ }
+ return xSource;
+ }
+
+ Reference< XAnimationNode > CustomAnimationClonerImpl::getClonedNode( const Reference< XAnimationNode >& xSource ) const
+ {
+ std::size_t nNodeCount = maSourceNodeVector.size();
+ std::size_t nCloneNodeCount = maCloneNodeVector.size();
+
+ if (nNodeCount != nCloneNodeCount)
+ SAL_WARN("sd.core", "Sizes of maSourceNodeVector and maCloneNodeVector mismatch!");
+
+ for( std::size_t nNode = 0; nNode < nNodeCount && nNode < nCloneNodeCount; ++nNode )
+ {
+ if( maSourceNodeVector[nNode] == xSource )
+ return maCloneNodeVector[nNode];
+ }
+
+ OSL_FAIL( "sd::CustomAnimationClonerImpl::getClonedNode() failed!" );
+ return xSource;
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/CustomAnimationEffect.cxx b/sd/source/core/CustomAnimationEffect.cxx
new file mode 100644
index 000000000..b1816784f
--- /dev/null
+++ b/sd/source/core/CustomAnimationEffect.cxx
@@ -0,0 +1,3559 @@
+/* -*- 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 <tools/debug.hxx>
+#include <tools/diagnose_ex.h>
+#include <sal/log.hxx>
+#include <com/sun/star/animations/AnimationNodeType.hpp>
+#include <com/sun/star/animations/AnimateColor.hpp>
+#include <com/sun/star/animations/AnimateMotion.hpp>
+#include <com/sun/star/animations/AnimateSet.hpp>
+#include <com/sun/star/animations/AnimationFill.hpp>
+#include <com/sun/star/animations/Audio.hpp>
+#include <com/sun/star/animations/Command.hpp>
+#include <com/sun/star/animations/Event.hpp>
+#include <com/sun/star/animations/EventTrigger.hpp>
+#include <com/sun/star/animations/IterateContainer.hpp>
+#include <com/sun/star/animations/ParallelTimeContainer.hpp>
+#include <com/sun/star/animations/SequenceTimeContainer.hpp>
+#include <com/sun/star/animations/XCommand.hpp>
+#include <com/sun/star/animations/XIterateContainer.hpp>
+#include <com/sun/star/animations/XAnimateTransform.hpp>
+#include <com/sun/star/animations/XAnimateMotion.hpp>
+#include <com/sun/star/animations/XAnimate.hpp>
+#include <com/sun/star/animations/AnimationRestart.hpp>
+#include <com/sun/star/beans/NamedValue.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/presentation/EffectNodeType.hpp>
+#include <com/sun/star/presentation/EffectCommands.hpp>
+#include <com/sun/star/presentation/EffectPresetClass.hpp>
+#include <com/sun/star/presentation/ParagraphTarget.hpp>
+#include <com/sun/star/presentation/ShapeAnimationSubType.hpp>
+#include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/util/XCloneable.hpp>
+#include <com/sun/star/util/XChangesNotifier.hpp>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/sequence.hxx>
+#include <com/sun/star/lang/Locale.hpp>
+#include <com/sun/star/i18n/BreakIterator.hpp>
+#include <com/sun/star/i18n/CharacterIteratorMode.hpp>
+#include <com/sun/star/i18n/WordType.hpp>
+#include <com/sun/star/presentation/TextAnimationType.hpp>
+
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
+#include <basegfx/range/b2drange.hxx>
+#include <basegfx/matrix/b2dhommatrixtools.hxx>
+
+#include <algorithm>
+#include <deque>
+#include <numeric>
+
+#include <cppuhelper/implbase.hxx>
+
+#include <drawinglayer/geometry/viewinformation2d.hxx>
+#include <o3tl/safeint.hxx>
+#include <svx/sdr/contact/viewcontact.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/svdpage.hxx>
+#include <CustomAnimationEffect.hxx>
+#include <CustomAnimationPreset.hxx>
+#include <animations.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::presentation;
+using namespace ::com::sun::star::animations;
+
+using ::com::sun::star::container::XEnumerationAccess;
+using ::com::sun::star::container::XEnumeration;
+using ::com::sun::star::beans::NamedValue;
+using ::com::sun::star::container::XChild;
+using ::com::sun::star::drawing::XShape;
+using ::com::sun::star::lang::XInitialization;
+using ::com::sun::star::text::XText;
+using ::com::sun::star::text::XTextRange;
+using ::com::sun::star::beans::XPropertySet;
+using ::com::sun::star::util::XCloneable;
+using ::com::sun::star::lang::Locale;
+using ::com::sun::star::util::XChangesNotifier;
+using ::com::sun::star::util::XChangesListener;
+
+namespace sd
+{
+class MainSequenceChangeGuard
+{
+public:
+ explicit MainSequenceChangeGuard( EffectSequenceHelper* pSequence )
+ {
+ mpMainSequence = dynamic_cast< MainSequence* >( pSequence );
+ if( mpMainSequence == nullptr )
+ {
+ InteractiveSequence* pI = dynamic_cast< InteractiveSequence* >( pSequence );
+ if( pI )
+ mpMainSequence = pI->mpMainSequence;
+ }
+ DBG_ASSERT( mpMainSequence, "sd::MainSequenceChangeGuard::MainSequenceChangeGuard(), no main sequence to guard!" );
+
+ if( mpMainSequence )
+ mpMainSequence->mbIgnoreChanges++;
+ }
+
+ ~MainSequenceChangeGuard()
+ {
+ if( mpMainSequence )
+ mpMainSequence->mbIgnoreChanges++;
+ }
+
+private:
+ MainSequence* mpMainSequence;
+};
+
+CustomAnimationEffect::CustomAnimationEffect( const css::uno::Reference< css::animations::XAnimationNode >& xNode )
+: mnNodeType(-1),
+ mnPresetClass(-1),
+ mnFill(AnimationFill::HOLD),
+ mfBegin(-1.0),
+ mfDuration(-1.0),
+ mfAbsoluteDuration(-1.0),
+ mnGroupId(-1),
+ mnIterateType(0),
+ mfIterateInterval(0.0),
+ mnParaDepth( -1 ),
+ mbHasText(false),
+ mfAcceleration( 1.0 ),
+ mfDecelerate( 1.0 ),
+ mbAutoReverse(false),
+ mnTargetSubItem(0),
+ mnCommand(0),
+ mpEffectSequence( nullptr ),
+ mbHasAfterEffect(false),
+ mbAfterEffectOnNextEffect(false)
+{
+ setNode( xNode );
+}
+
+void CustomAnimationEffect::setNode( const css::uno::Reference< css::animations::XAnimationNode >& xNode )
+{
+ mxNode = xNode;
+ mxAudio.clear();
+ mnCommand = 0;
+
+ const Sequence< NamedValue > aUserData( mxNode->getUserData() );
+
+ for( const NamedValue& rProp : aUserData )
+ {
+ if ( rProp.Name == "node-type" )
+ {
+ rProp.Value >>= mnNodeType;
+ }
+ else if ( rProp.Name == "preset-id" )
+ {
+ rProp.Value >>= maPresetId;
+ }
+ else if ( rProp.Name == "preset-sub-type" )
+ {
+ rProp.Value >>= maPresetSubType;
+ }
+ else if ( rProp.Name == "preset-class" )
+ {
+ rProp.Value >>= mnPresetClass;
+ }
+ else if ( rProp.Name == "preset-property" )
+ {
+ rProp.Value >>= maProperty;
+ }
+ else if ( rProp.Name == "group-id" )
+ {
+ rProp.Value >>= mnGroupId;
+ }
+ }
+
+ // get effect start time
+ mxNode->getBegin() >>= mfBegin;
+
+ mfAcceleration = mxNode->getAcceleration();
+ mfDecelerate = mxNode->getDecelerate();
+ mbAutoReverse = mxNode->getAutoReverse();
+
+ mnFill = mxNode->getFill();
+
+ // get iteration data
+ Reference< XIterateContainer > xIter( mxNode, UNO_QUERY );
+ if( xIter.is() )
+ {
+ mfIterateInterval = xIter->getIterateInterval();
+ mnIterateType = xIter->getIterateType();
+ maTarget = xIter->getTarget();
+ mnTargetSubItem = xIter->getSubItem();
+ }
+ else
+ {
+ mfIterateInterval = 0.0f;
+ mnIterateType = 0;
+ }
+
+ // calculate effect duration and get target shape
+ Reference< XEnumerationAccess > xEnumerationAccess( mxNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY );
+ if( !xChildNode.is() )
+ continue;
+
+ if( xChildNode->getType() == AnimationNodeType::AUDIO )
+ {
+ mxAudio.set( xChildNode, UNO_QUERY );
+ }
+ else if( xChildNode->getType() == AnimationNodeType::COMMAND )
+ {
+ Reference< XCommand > xCommand( xChildNode, UNO_QUERY );
+ if( xCommand.is() )
+ {
+ mnCommand = xCommand->getCommand();
+ if( !maTarget.hasValue() )
+ maTarget = xCommand->getTarget();
+ }
+ }
+ else
+ {
+ double fBegin = 0.0;
+ double fDuration = 0.0;
+ xChildNode->getBegin() >>= fBegin;
+ xChildNode->getDuration() >>= fDuration;
+
+ fDuration += fBegin;
+ if( fDuration > mfDuration )
+ mfDuration = fDuration;
+
+ // no target shape yet?
+ if( !maTarget.hasValue() )
+ {
+ // go get it boys!
+ Reference< XAnimate > xAnimate( xChildNode, UNO_QUERY );
+ if( xAnimate.is() )
+ {
+ maTarget = xAnimate->getTarget();
+ mnTargetSubItem = xAnimate->getSubItem();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ mfAbsoluteDuration = mfDuration;
+ double fRepeatCount = 1.0;
+ if( (mxNode->getRepeatCount()) >>= fRepeatCount )
+ mfAbsoluteDuration *= fRepeatCount;
+
+ checkForText();
+}
+
+sal_Int32 CustomAnimationEffect::getNumberOfSubitems( const Any& aTarget, sal_Int16 nIterateType )
+{
+ sal_Int32 nSubItems = 0;
+
+ try
+ {
+ // first get target text
+ sal_Int32 nOnlyPara = -1;
+
+ Reference< XText > xShape;
+ aTarget >>= xShape;
+ if( !xShape.is() )
+ {
+ ParagraphTarget aParaTarget;
+ if( aTarget >>= aParaTarget )
+ {
+ xShape.set( aParaTarget.Shape, UNO_QUERY );
+ nOnlyPara = aParaTarget.Paragraph;
+ }
+ }
+
+ // now use the break iterator to iterate over the given text
+ // and count the sub items
+
+ if( xShape.is() )
+ {
+ // TODO/LATER: Optimize this, don't create a break iterator each time
+ Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
+ Reference < i18n::XBreakIterator > xBI = i18n::BreakIterator::create(xContext);
+
+ Reference< XEnumerationAccess > xEA( xShape, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEA->createEnumeration(), UNO_SET_THROW );
+ css::lang::Locale aLocale;
+ static const OUStringLiteral aStrLocaleName( u"CharLocale" );
+ Reference< XTextRange > xParagraph;
+
+ sal_Int32 nPara = 0;
+ while( xEnumeration->hasMoreElements() )
+ {
+ xEnumeration->nextElement() >>= xParagraph;
+
+ // skip this if it's not the only paragraph we want to count
+ if( (nOnlyPara != -1) && (nOnlyPara != nPara ) )
+ continue;
+
+ if( nIterateType == TextAnimationType::BY_PARAGRAPH )
+ {
+ nSubItems++;
+ }
+ else
+ {
+ const OUString aText( xParagraph->getString() );
+ Reference< XPropertySet > xSet( xParagraph, UNO_QUERY_THROW );
+ xSet->getPropertyValue( aStrLocaleName ) >>= aLocale;
+
+ sal_Int32 nPos;
+ const sal_Int32 nEndPos = aText.getLength();
+
+ if( nIterateType == TextAnimationType::BY_WORD )
+ {
+ for( nPos = 0; nPos < nEndPos; nPos++ )
+ {
+ nPos = xBI->getWordBoundary(aText, nPos, aLocale, i18n::WordType::ANY_WORD, true).endPos;
+ nSubItems++;
+ }
+ break;
+ }
+ else
+ {
+ sal_Int32 nDone;
+ for( nPos = 0; nPos < nEndPos; nPos++ )
+ {
+ nPos = xBI->nextCharacters(aText, nPos, aLocale, i18n::CharacterIteratorMode::SKIPCELL, 0, nDone);
+ nSubItems++;
+ }
+ }
+ }
+
+ if( nPara == nOnlyPara )
+ break;
+
+ nPara++;
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ nSubItems = 0;
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::getNumberOfSubitems(), exception caught!" );
+ }
+
+ return nSubItems;
+}
+
+CustomAnimationEffect::~CustomAnimationEffect()
+{
+}
+
+CustomAnimationEffectPtr CustomAnimationEffect::clone() const
+{
+ Reference< XCloneable > xCloneable( mxNode, UNO_QUERY_THROW );
+ Reference< XAnimationNode > xNode( xCloneable->createClone(), UNO_QUERY_THROW );
+ CustomAnimationEffectPtr pEffect = std::make_shared<CustomAnimationEffect>( xNode );
+ pEffect->setEffectSequence( getEffectSequence() );
+ return pEffect;
+}
+
+sal_Int32 CustomAnimationEffect::get_node_type( const Reference< XAnimationNode >& xNode )
+{
+ sal_Int16 nNodeType = -1;
+
+ if( xNode.is() )
+ {
+ const Sequence< NamedValue > aUserData( xNode->getUserData() );
+ if( aUserData.hasElements() )
+ {
+ const NamedValue* pProp = std::find_if(aUserData.begin(), aUserData.end(),
+ [](const NamedValue& rProp) { return rProp.Name == "node-type"; });
+ if (pProp != aUserData.end())
+ pProp->Value >>= nNodeType;
+ }
+ }
+
+ return nNodeType;
+}
+
+void CustomAnimationEffect::setPresetClassAndId( sal_Int16 nPresetClass, const OUString& rPresetId )
+{
+ if( mnPresetClass == nPresetClass && maPresetId == rPresetId )
+ return;
+
+ mnPresetClass = nPresetClass;
+ maPresetId = rPresetId;
+ if( !mxNode.is() )
+ return;
+
+ // first try to find a "preset-class" entry in the user data
+ // and change it
+ Sequence< NamedValue > aUserData( mxNode->getUserData() );
+ sal_Int32 nLength = aUserData.getLength();
+ bool bFoundPresetClass = false;
+ bool bFoundPresetId = false;
+ if( nLength )
+ {
+ auto [begin, end] = asNonConstRange(aUserData);
+ NamedValue* pProp = std::find_if(begin, end,
+ [](const NamedValue& rProp) { return rProp.Name == "preset-class"; });
+ if (pProp != end)
+ {
+ pProp->Value <<= mnPresetClass;
+ bFoundPresetClass = true;
+ }
+
+ pProp = std::find_if(begin, end,
+ [](const NamedValue& rProp) { return rProp.Name == "preset-id"; });
+ if (pProp != end)
+ {
+ pProp->Value <<= mnPresetClass;
+ bFoundPresetId = true;
+ }
+ }
+
+ // no "preset-class" entry inside user data, so add it
+ if( !bFoundPresetClass )
+ {
+ aUserData.realloc( nLength + 1);
+ auto& el = aUserData.getArray()[nLength];
+ el.Name = "preset-class";
+ el.Value <<= mnPresetClass;
+ ++nLength;
+ }
+
+ if( !bFoundPresetId && maPresetId.getLength() > 0 )
+ {
+ aUserData.realloc( nLength + 1);
+ auto& el = aUserData.getArray()[nLength];
+ el.Name = "preset-id";
+ el.Value <<= maPresetId;
+ }
+
+ mxNode->setUserData( aUserData );
+}
+
+void CustomAnimationEffect::setNodeType( sal_Int16 nNodeType )
+{
+ if( mnNodeType == nNodeType )
+ return;
+
+ mnNodeType = nNodeType;
+ if( !mxNode.is() )
+ return;
+
+ // first try to find a "node-type" entry in the user data
+ // and change it
+ Sequence< NamedValue > aUserData( mxNode->getUserData() );
+ sal_Int32 nLength = aUserData.getLength();
+ bool bFound = false;
+ if( nLength )
+ {
+ auto [begin, end] = asNonConstRange(aUserData);
+ NamedValue* pProp = std::find_if(begin, end,
+ [](const NamedValue& rProp) { return rProp.Name == "node-type"; });
+ if (pProp != end)
+ {
+ pProp->Value <<= mnNodeType;
+ bFound = true;
+ }
+ }
+
+ // no "node-type" entry inside user data, so add it
+ if( !bFound )
+ {
+ aUserData.realloc( nLength + 1);
+ auto& el = aUserData.getArray()[nLength];
+ el.Name = "node-type";
+ el.Value <<= mnNodeType;
+ }
+
+ mxNode->setUserData( aUserData );
+}
+
+void CustomAnimationEffect::setGroupId( sal_Int32 nGroupId )
+{
+ mnGroupId = nGroupId;
+ if( !mxNode.is() )
+ return;
+
+ // first try to find a "group-id" entry in the user data
+ // and change it
+ Sequence< NamedValue > aUserData( mxNode->getUserData() );
+ sal_Int32 nLength = aUserData.getLength();
+ bool bFound = false;
+ if( nLength )
+ {
+ auto [begin, end] = asNonConstRange(aUserData);
+ NamedValue* pProp = std::find_if(begin, end,
+ [](const NamedValue& rProp) { return rProp.Name == "group-id"; });
+ if (pProp != end)
+ {
+ pProp->Value <<= mnGroupId;
+ bFound = true;
+ }
+ }
+
+ // no "group-id" entry inside user data, so add it
+ if( !bFound )
+ {
+ aUserData.realloc( nLength + 1);
+ auto& el = aUserData.getArray()[nLength];
+ el.Name = "group-id";
+ el.Value <<= mnGroupId;
+ }
+
+ mxNode->setUserData( aUserData );
+}
+
+/** checks if the text for this effect has changed and updates internal flags.
+ returns true if something changed.
+*/
+bool CustomAnimationEffect::checkForText( const std::vector<sal_Int32>* paragraphNumberingLevel )
+{
+ bool bChange = false;
+
+ Reference< XText > xText;
+
+ if( maTarget.getValueType() == ::cppu::UnoType<ParagraphTarget>::get() )
+ {
+ // calc para depth
+ ParagraphTarget aParaTarget;
+ maTarget >>= aParaTarget;
+
+ xText.set( aParaTarget.Shape, UNO_QUERY );
+
+ // get paragraph
+ if( xText.is() )
+ {
+ sal_Int32 nPara = aParaTarget.Paragraph;
+
+ bool bHasText = false;
+ sal_Int32 nParaDepth = 0;
+
+ if ( paragraphNumberingLevel )
+ {
+ bHasText = !paragraphNumberingLevel->empty();
+ if (nPara >= 0 && o3tl::make_unsigned(nPara) < paragraphNumberingLevel->size())
+ nParaDepth = paragraphNumberingLevel->at(nPara);
+ }
+ else
+ {
+ Reference< XEnumerationAccess > xEA( xText, UNO_QUERY );
+ if( xEA.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEA->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ bHasText = xEnumeration->hasMoreElements();
+
+ while( xEnumeration->hasMoreElements() && nPara-- )
+ xEnumeration->nextElement();
+
+ if( xEnumeration->hasMoreElements() )
+ {
+ Reference< XPropertySet > xParaSet;
+ xEnumeration->nextElement() >>= xParaSet;
+ if( xParaSet.is() )
+ {
+ xParaSet->getPropertyValue( "NumberingLevel" ) >>= nParaDepth;
+ }
+ }
+ }
+ }
+ }
+
+ if( bHasText )
+ {
+ bChange |= bHasText != mbHasText;
+ mbHasText = bHasText;
+
+ bChange |= nParaDepth != mnParaDepth;
+ mnParaDepth = nParaDepth;
+ }
+ }
+ }
+ else
+ {
+ maTarget >>= xText;
+ bool bHasText = xText.is() && !xText->getString().isEmpty();
+ bChange |= bHasText != mbHasText;
+ mbHasText = bHasText;
+ }
+
+ bChange |= calculateIterateDuration();
+ return bChange;
+}
+
+bool CustomAnimationEffect::calculateIterateDuration()
+{
+ bool bChange = false;
+
+ // if we have an iteration, we must also calculate the
+ // 'true' container duration, that is
+ // ( ( is form animated ) ? [contained effects duration] : 0 ) +
+ // ( [number of animated children] - 1 ) * [interval-delay] + [contained effects duration]
+ Reference< XIterateContainer > xIter( mxNode, UNO_QUERY );
+ if( xIter.is() )
+ {
+ double fDuration = mfDuration;
+ const double fSubEffectDuration = mfDuration;
+
+ if( mnTargetSubItem != ShapeAnimationSubType::ONLY_BACKGROUND ) // does not make sense for iterate container but better check
+ {
+ const sal_Int32 nSubItems = getNumberOfSubitems( maTarget, mnIterateType );
+ if( nSubItems )
+ {
+ const double f = (nSubItems-1) * mfIterateInterval;
+ fDuration += f;
+ }
+ }
+
+ // if we also animate the form first, we have to add the
+ // sub effect duration to the whole effect duration
+ if( mnTargetSubItem == ShapeAnimationSubType::AS_WHOLE )
+ fDuration += fSubEffectDuration;
+
+ bChange |= fDuration != mfAbsoluteDuration;
+ mfAbsoluteDuration = fDuration;
+ }
+
+ return bChange;
+}
+
+void CustomAnimationEffect::setTarget( const css::uno::Any& rTarget )
+{
+ try
+ {
+ maTarget = rTarget;
+
+ // first, check special case for random node
+ Reference< XInitialization > xInit( mxNode, UNO_QUERY );
+ if( xInit.is() )
+ {
+ const Sequence< Any > aArgs( &maTarget, 1 );
+ xInit->initialize( aArgs );
+ }
+ else
+ {
+ Reference< XIterateContainer > xIter( mxNode, UNO_QUERY );
+ if( xIter.is() )
+ {
+ xIter->setTarget(maTarget);
+ }
+ else
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( mxNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() )
+ {
+ const Any aElem( xEnumeration->nextElement() );
+ Reference< XAnimate > xAnimate( aElem, UNO_QUERY );
+ if( xAnimate.is() )
+ xAnimate->setTarget( rTarget );
+ else
+ {
+ Reference< XCommand > xCommand( aElem, UNO_QUERY );
+ if( xCommand.is() )
+ xCommand->setTarget( rTarget );
+ }
+ }
+ }
+ }
+ }
+ }
+ checkForText();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setTarget()" );
+ }
+}
+
+void CustomAnimationEffect::setTargetSubItem( sal_Int16 nSubItem )
+{
+ try
+ {
+ mnTargetSubItem = nSubItem;
+
+ Reference< XIterateContainer > xIter( mxNode, UNO_QUERY );
+ if( xIter.is() )
+ {
+ xIter->setSubItem(mnTargetSubItem);
+ }
+ else
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( mxNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimate > xAnimate( xEnumeration->nextElement(), UNO_QUERY );
+ if( xAnimate.is() )
+ xAnimate->setSubItem( mnTargetSubItem );
+ }
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setTargetSubItem()" );
+ }
+}
+
+void CustomAnimationEffect::setDuration( double fDuration )
+{
+ if( (mfDuration == -1.0) || (mfDuration == fDuration) )
+ return;
+
+ try
+ {
+ double fScale = fDuration / mfDuration;
+ mfDuration = fDuration;
+ double fRepeatCount = 1.0;
+ getRepeatCount() >>= fRepeatCount;
+ mfAbsoluteDuration = mfDuration * fRepeatCount;
+
+ // calculate effect duration and get target shape
+ Reference< XEnumerationAccess > xEnumerationAccess( mxNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY );
+ if( !xChildNode.is() )
+ continue;
+
+ double fChildBegin = 0.0;
+ xChildNode->getBegin() >>= fChildBegin;
+ if( fChildBegin != 0.0 )
+ {
+ fChildBegin *= fScale;
+ xChildNode->setBegin( Any( fChildBegin ) );
+ }
+
+ double fChildDuration = 0.0;
+ xChildNode->getDuration() >>= fChildDuration;
+ if( fChildDuration != 0.0 )
+ {
+ fChildDuration *= fScale;
+ xChildNode->setDuration( Any( fChildDuration ) );
+ }
+ }
+ }
+ }
+ calculateIterateDuration();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setDuration()" );
+ }
+}
+
+void CustomAnimationEffect::setBegin( double fBegin )
+{
+ if( mxNode.is() ) try
+ {
+ mfBegin = fBegin;
+ mxNode->setBegin( Any( fBegin ) );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setBegin()" );
+ }
+}
+
+void CustomAnimationEffect::setAcceleration( double fAcceleration )
+{
+ if( mxNode.is() ) try
+ {
+ mfAcceleration = fAcceleration;
+ mxNode->setAcceleration( fAcceleration );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setAcceleration()" );
+ }
+}
+
+void CustomAnimationEffect::setDecelerate( double fDecelerate )
+{
+ if( mxNode.is() ) try
+ {
+ mfDecelerate = fDecelerate;
+ mxNode->setDecelerate( fDecelerate );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setDecelerate()" );
+ }
+}
+
+void CustomAnimationEffect::setAutoReverse( bool bAutoReverse )
+{
+ if( mxNode.is() ) try
+ {
+ mbAutoReverse = bAutoReverse;
+ mxNode->setAutoReverse( bAutoReverse );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setAutoReverse()" );
+ }
+}
+
+void CustomAnimationEffect::replaceNode( const css::uno::Reference< css::animations::XAnimationNode >& xNode )
+{
+ sal_Int16 nNodeType = mnNodeType;
+ Any aTarget = maTarget;
+
+ sal_Int16 nFill = mnFill;
+ double fBegin = mfBegin;
+ double fDuration = mfDuration;
+ double fAcceleration = mfAcceleration;
+ double fDecelerate = mfDecelerate ;
+ bool bAutoReverse = mbAutoReverse;
+ Reference< XAudio > xAudio( mxAudio );
+ sal_Int16 nIterateType = mnIterateType;
+ double fIterateInterval = mfIterateInterval;
+ sal_Int16 nSubItem = mnTargetSubItem;
+
+ setNode( xNode );
+
+ setAudio( xAudio );
+ setNodeType( nNodeType );
+ setTarget( aTarget );
+ setTargetSubItem( nSubItem );
+ setDuration( fDuration );
+ setBegin( fBegin );
+ setFill( nFill );
+
+ setAcceleration( fAcceleration );
+ setDecelerate( fDecelerate );
+ setAutoReverse( bAutoReverse );
+
+ if( nIterateType != mnIterateType )
+ setIterateType( nIterateType );
+
+ if( mnIterateType && ( fIterateInterval != mfIterateInterval ) )
+ setIterateInterval( fIterateInterval );
+}
+
+Reference< XShape > CustomAnimationEffect::getTargetShape() const
+{
+ Reference< XShape > xShape;
+ maTarget >>= xShape;
+ if( !xShape.is() )
+ {
+ ParagraphTarget aParaTarget;
+ if( maTarget >>= aParaTarget )
+ xShape = aParaTarget.Shape;
+ }
+
+ return xShape;
+}
+
+Any CustomAnimationEffect::getRepeatCount() const
+{
+ if( mxNode.is() )
+ {
+ return mxNode->getRepeatCount();
+ }
+ else
+ {
+ Any aAny;
+ return aAny;
+ }
+}
+
+Any CustomAnimationEffect::getEnd() const
+{
+ if( mxNode.is() )
+ {
+ return mxNode->getEnd();
+ }
+ else
+ {
+ Any aAny;
+ return aAny;
+ }
+}
+
+void CustomAnimationEffect::setRepeatCount( const Any& rRepeatCount )
+{
+ if( mxNode.is() )
+ {
+ mxNode->setRepeatCount( rRepeatCount );
+ double fRepeatCount = 1.0;
+ rRepeatCount >>= fRepeatCount;
+ mfAbsoluteDuration = mfDuration * fRepeatCount;
+ }
+}
+
+void CustomAnimationEffect::setEnd( const Any& rEnd )
+{
+ if( mxNode.is() )
+ mxNode->setEnd( rEnd );
+}
+
+void CustomAnimationEffect::setFill( sal_Int16 nFill )
+{
+ if (mxNode.is())
+ {
+ mnFill = nFill;
+ mxNode->setFill( nFill );
+ }
+}
+
+Reference< XAnimationNode > CustomAnimationEffect::createAfterEffectNode() const
+{
+ DBG_ASSERT( mbHasAfterEffect, "sd::CustomAnimationEffect::createAfterEffectNode(), this node has no after effect!" );
+
+ Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
+
+ Reference< XAnimate > xAnimate;
+ if( maDimColor.hasValue() )
+ xAnimate = AnimateColor::create( xContext );
+ else
+ xAnimate = AnimateSet::create( xContext );
+
+ Any aTo;
+ OUString aAttributeName;
+
+ if( maDimColor.hasValue() )
+ {
+ aTo = maDimColor;
+ aAttributeName = "DimColor";
+ }
+ else
+ {
+ aTo <<= false;
+ aAttributeName = "Visibility";
+ }
+
+ Any aBegin;
+ if( !mbAfterEffectOnNextEffect ) // sameClick
+ {
+ Event aEvent;
+
+ aEvent.Source <<= getNode();
+ aEvent.Trigger = EventTrigger::END_EVENT;
+ aEvent.Repeat = 0;
+
+ aBegin <<= aEvent;
+ }
+ else
+ {
+ aBegin <<= 0.0;
+ }
+
+ xAnimate->setBegin( aBegin );
+ xAnimate->setTo( aTo );
+ xAnimate->setAttributeName( aAttributeName );
+
+ xAnimate->setDuration( Any( 0.001 ) );
+ xAnimate->setFill( AnimationFill::HOLD );
+ xAnimate->setTarget( maTarget );
+
+ return xAnimate;
+}
+
+void CustomAnimationEffect::setIterateType( sal_Int16 nIterateType )
+{
+ if( mnIterateType == nIterateType )
+ return;
+
+ try
+ {
+ // do we need to exchange the container node?
+ if( (mnIterateType == 0) || (nIterateType == 0) )
+ {
+ sal_Int16 nTargetSubItem = mnTargetSubItem;
+
+ Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
+ Reference< XTimeContainer > xNewContainer;
+ if(nIterateType)
+ {
+ xNewContainer.set( IterateContainer::create( xContext ) );
+ }
+ else
+ xNewContainer.set( ParallelTimeContainer::create( xContext ), UNO_QUERY_THROW );
+
+ Reference< XTimeContainer > xOldContainer( mxNode, UNO_QUERY_THROW );
+ Reference< XEnumerationAccess > xEnumerationAccess( mxNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
+ xOldContainer->removeChild( xChildNode );
+ xNewContainer->appendChild( xChildNode );
+ }
+
+ xNewContainer->setBegin( mxNode->getBegin() );
+ xNewContainer->setDuration( mxNode->getDuration() );
+ xNewContainer->setEnd( mxNode->getEnd() );
+ xNewContainer->setEndSync( mxNode->getEndSync() );
+ xNewContainer->setRepeatCount( mxNode->getRepeatCount() );
+ xNewContainer->setFill( mxNode->getFill() );
+ xNewContainer->setFillDefault( mxNode->getFillDefault() );
+ xNewContainer->setRestart( mxNode->getRestart() );
+ xNewContainer->setRestartDefault( mxNode->getRestartDefault() );
+ xNewContainer->setAcceleration( mxNode->getAcceleration() );
+ xNewContainer->setDecelerate( mxNode->getDecelerate() );
+ xNewContainer->setAutoReverse( mxNode->getAutoReverse() );
+ xNewContainer->setRepeatDuration( mxNode->getRepeatDuration() );
+ xNewContainer->setEndSync( mxNode->getEndSync() );
+ xNewContainer->setRepeatCount( mxNode->getRepeatCount() );
+ xNewContainer->setUserData( mxNode->getUserData() );
+
+ mxNode = xNewContainer;
+
+ Any aTarget;
+ if( nIterateType )
+ {
+ Reference< XIterateContainer > xIter( mxNode, UNO_QUERY_THROW );
+ xIter->setTarget(maTarget);
+ xIter->setSubItem( nTargetSubItem );
+ }
+ else
+ {
+ aTarget = maTarget;
+ }
+
+ Reference< XEnumerationAccess > xEA( mxNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xE( xEA->createEnumeration(), UNO_SET_THROW );
+ while( xE->hasMoreElements() )
+ {
+ Reference< XAnimate > xAnimate( xE->nextElement(), UNO_QUERY );
+ if( xAnimate.is() )
+ {
+ xAnimate->setTarget( aTarget );
+ xAnimate->setSubItem( nTargetSubItem );
+ }
+ }
+ }
+
+ mnIterateType = nIterateType;
+
+ // if we have an iteration container, we must set its type
+ if( mnIterateType )
+ {
+ Reference< XIterateContainer > xIter( mxNode, UNO_QUERY_THROW );
+ xIter->setIterateType( nIterateType );
+ }
+
+ checkForText();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setIterateType()" );
+ }
+}
+
+void CustomAnimationEffect::setIterateInterval( double fIterateInterval )
+{
+ if( mfIterateInterval == fIterateInterval )
+ return;
+
+ Reference< XIterateContainer > xIter( mxNode, UNO_QUERY );
+
+ DBG_ASSERT( xIter.is(), "sd::CustomAnimationEffect::setIterateInterval(), not an iteration node" );
+ if( xIter.is() )
+ {
+ mfIterateInterval = fIterateInterval;
+ xIter->setIterateInterval( fIterateInterval );
+ }
+
+ calculateIterateDuration();
+}
+
+OUString CustomAnimationEffect::getPath() const
+{
+ OUString aPath;
+
+ if( mxNode.is() ) try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( mxNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimateMotion > xMotion( xEnumeration->nextElement(), UNO_QUERY );
+ if( xMotion.is() )
+ {
+ xMotion->getPath() >>= aPath;
+ break;
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::getPath()" );
+ }
+
+ return aPath;
+}
+
+void CustomAnimationEffect::setPath( const OUString& rPath )
+{
+ if( !mxNode.is() )
+ return;
+
+ try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( mxNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimateMotion > xMotion( xEnumeration->nextElement(), UNO_QUERY );
+ if( xMotion.is() )
+ {
+
+ MainSequenceChangeGuard aGuard( mpEffectSequence );
+ xMotion->setPath( Any( rPath ) );
+ break;
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setPath()" );
+ }
+}
+
+Any CustomAnimationEffect::getProperty( sal_Int32 nNodeType, std::u16string_view rAttributeName, EValue eValue )
+{
+ Any aProperty;
+ if( mxNode.is() ) try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( mxNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() && !aProperty.hasValue() )
+ {
+ Reference< XAnimate > xAnimate( xEnumeration->nextElement(), UNO_QUERY );
+ if( !xAnimate.is() )
+ continue;
+
+ if( xAnimate->getType() == nNodeType )
+ {
+ if( xAnimate->getAttributeName() == rAttributeName )
+ {
+ switch( eValue )
+ {
+ case EValue::To: aProperty = xAnimate->getTo(); break;
+ case EValue::By: aProperty = xAnimate->getBy(); break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::getProperty()" );
+ }
+
+ return aProperty;
+}
+
+bool CustomAnimationEffect::setProperty( sal_Int32 nNodeType, std::u16string_view rAttributeName, EValue eValue, const Any& rValue )
+{
+ bool bChanged = false;
+ if( mxNode.is() ) try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( mxNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimate > xAnimate( xEnumeration->nextElement(), UNO_QUERY );
+ if( !xAnimate.is() )
+ continue;
+
+ if( xAnimate->getType() == nNodeType )
+ {
+ if( xAnimate->getAttributeName() == rAttributeName )
+ {
+ switch( eValue )
+ {
+ case EValue::To:
+ if( xAnimate->getTo() != rValue )
+ {
+ xAnimate->setTo( rValue );
+ bChanged = true;
+ }
+ break;
+ case EValue::By:
+ if( xAnimate->getTo() != rValue )
+ {
+ xAnimate->setBy( rValue );
+ bChanged = true;
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setProperty()" );
+ }
+
+ return bChanged;
+}
+
+static bool implIsColorAttribute( std::u16string_view rAttributeName )
+{
+ return rAttributeName == u"FillColor" || rAttributeName == u"LineColor" || rAttributeName == u"CharColor";
+}
+
+Any CustomAnimationEffect::getColor( sal_Int32 nIndex )
+{
+ Any aColor;
+ if( mxNode.is() ) try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( mxNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() && !aColor.hasValue() )
+ {
+ Reference< XAnimate > xAnimate( xEnumeration->nextElement(), UNO_QUERY );
+ if( !xAnimate.is() )
+ continue;
+
+ switch( xAnimate->getType() )
+ {
+ case AnimationNodeType::SET:
+ case AnimationNodeType::ANIMATE:
+ if( !implIsColorAttribute( xAnimate->getAttributeName() ) )
+ break;
+ [[fallthrough]];
+ case AnimationNodeType::ANIMATECOLOR:
+ Sequence<Any> aValues( xAnimate->getValues() );
+ if( aValues.hasElements() )
+ {
+ if( aValues.getLength() > nIndex )
+ aColor = aValues[nIndex];
+ }
+ else if( nIndex == 0 )
+ aColor = xAnimate->getFrom();
+ else
+ aColor = xAnimate->getTo();
+ }
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::getColor()" );
+ }
+
+ return aColor;
+}
+
+void CustomAnimationEffect::setColor( sal_Int32 nIndex, const Any& rColor )
+{
+ if( !mxNode.is() )
+ return;
+
+ try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( mxNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimate > xAnimate( xEnumeration->nextElement(), UNO_QUERY );
+ if( !xAnimate.is() )
+ continue;
+
+ switch( xAnimate->getType() )
+ {
+ case AnimationNodeType::SET:
+ case AnimationNodeType::ANIMATE:
+ if( !implIsColorAttribute( xAnimate->getAttributeName() ) )
+ break;
+ [[fallthrough]];
+ case AnimationNodeType::ANIMATECOLOR:
+ {
+ Sequence<Any> aValues( xAnimate->getValues() );
+ if( aValues.hasElements() )
+ {
+ if( aValues.getLength() > nIndex )
+ {
+ aValues.getArray()[nIndex] = rColor;
+ xAnimate->setValues( aValues );
+ }
+ }
+ else if( (nIndex == 0) && xAnimate->getFrom().hasValue() )
+ xAnimate->setFrom(rColor);
+ else if( (nIndex == 1) && xAnimate->getTo().hasValue() )
+ xAnimate->setTo(rColor);
+ }
+ break;
+
+ }
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setColor()" );
+ }
+}
+
+Any CustomAnimationEffect::getTransformationProperty( sal_Int32 nTransformType, EValue eValue )
+{
+ Any aProperty;
+ if( mxNode.is() ) try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( mxNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() && !aProperty.hasValue() )
+ {
+ Reference< XAnimateTransform > xTransform( xEnumeration->nextElement(), UNO_QUERY );
+ if( !xTransform.is() )
+ continue;
+
+ if( xTransform->getTransformType() == nTransformType )
+ {
+ switch( eValue )
+ {
+ case EValue::To: aProperty = xTransform->getTo(); break;
+ case EValue::By: aProperty = xTransform->getBy(); break;
+ }
+ }
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::getTransformationProperty()" );
+ }
+
+ return aProperty;
+}
+
+bool CustomAnimationEffect::setTransformationProperty( sal_Int32 nTransformType, EValue eValue, const Any& rValue )
+{
+ bool bChanged = false;
+ if( mxNode.is() ) try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( mxNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimateTransform > xTransform( xEnumeration->nextElement(), UNO_QUERY );
+ if( !xTransform.is() )
+ continue;
+
+ if( xTransform->getTransformType() == nTransformType )
+ {
+ switch( eValue )
+ {
+ case EValue::To:
+ if( xTransform->getTo() != rValue )
+ {
+ xTransform->setTo( rValue );
+ bChanged = true;
+ }
+ break;
+ case EValue::By:
+ if( xTransform->getBy() != rValue )
+ {
+ xTransform->setBy( rValue );
+ bChanged = true;
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setTransformationProperty()" );
+ }
+
+ return bChanged;
+}
+
+void CustomAnimationEffect::createAudio( const css::uno::Any& rSource )
+{
+ DBG_ASSERT( !mxAudio.is(), "sd::CustomAnimationEffect::createAudio(), node already has an audio!" );
+
+ if( mxAudio.is() )
+ return;
+
+ try
+ {
+ Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
+ Reference< XAudio > xAudio( Audio::create( xContext ) );
+ xAudio->setSource( rSource );
+ xAudio->setVolume( 1.0 );
+ setAudio( xAudio );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::createAudio()" );
+ }
+}
+
+static Reference< XCommand > findCommandNode( const Reference< XAnimationNode >& xRootNode )
+{
+ Reference< XCommand > xCommand;
+
+ if( xRootNode.is() ) try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( xRootNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ while( !xCommand.is() && xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xNode( xEnumeration->nextElement(), UNO_QUERY );
+ if( xNode.is() && (xNode->getType() == AnimationNodeType::COMMAND) )
+ xCommand.set( xNode, UNO_QUERY_THROW );
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::findCommandNode()" );
+ }
+
+ return xCommand;
+}
+
+void CustomAnimationEffect::removeAudio()
+{
+ try
+ {
+ Reference< XAnimationNode > xChild;
+
+ if( mxAudio.is() )
+ {
+ xChild = mxAudio;
+ mxAudio.clear();
+ }
+ else if( mnCommand == EffectCommands::STOPAUDIO )
+ {
+ xChild = findCommandNode( mxNode );
+ mnCommand = 0;
+ }
+
+ if( xChild.is() )
+ {
+ Reference< XTimeContainer > xContainer( mxNode, UNO_QUERY );
+ if( xContainer.is() )
+ xContainer->removeChild( xChild );
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::removeAudio()" );
+ }
+
+}
+
+void CustomAnimationEffect::setAudio( const Reference< css::animations::XAudio >& xAudio )
+{
+ if( mxAudio == xAudio )
+ return;
+
+ try
+ {
+ removeAudio();
+ mxAudio = xAudio;
+ Reference< XTimeContainer > xContainer( mxNode, UNO_QUERY );
+ if( xContainer.is() && mxAudio.is() )
+ xContainer->appendChild( mxAudio );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setAudio()" );
+ }
+}
+
+void CustomAnimationEffect::setStopAudio()
+{
+ if( mnCommand == EffectCommands::STOPAUDIO )
+ return;
+
+ try
+ {
+ if( mxAudio.is() )
+ removeAudio();
+
+ Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
+ Reference< XCommand > xCommand( Command::create( xContext ) );
+
+ xCommand->setCommand( EffectCommands::STOPAUDIO );
+
+ Reference< XTimeContainer > xContainer( mxNode, UNO_QUERY_THROW );
+ xContainer->appendChild( xCommand );
+
+ mnCommand = EffectCommands::STOPAUDIO;
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationEffect::setStopAudio()" );
+ }
+}
+
+bool CustomAnimationEffect::getStopAudio() const
+{
+ return mnCommand == EffectCommands::STOPAUDIO;
+}
+
+SdrPathObj* CustomAnimationEffect::createSdrPathObjFromPath(SdrModel& rTargetModel)
+{
+ SdrPathObj * pPathObj = new SdrPathObj(rTargetModel, SdrObjKind::PathLine);
+ updateSdrPathObjFromPath( *pPathObj );
+ return pPathObj;
+}
+
+void CustomAnimationEffect::updateSdrPathObjFromPath( SdrPathObj& rPathObj )
+{
+ ::basegfx::B2DPolyPolygon aPolyPoly;
+ if( ::basegfx::utils::importFromSvgD( aPolyPoly, getPath(), true, nullptr ) )
+ {
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape(getTargetShape());
+ if( pObj )
+ {
+ SdrPage* pPage = pObj->getSdrPageFromSdrObject();
+ if( pPage )
+ {
+ const Size aPageSize( pPage->GetSize() );
+ aPolyPoly.transform(basegfx::utils::createScaleB2DHomMatrix(static_cast<double>(aPageSize.Width()), static_cast<double>(aPageSize.Height())));
+ }
+
+ const ::tools::Rectangle aBoundRect( pObj->GetCurrentBoundRect() );
+ const Point aCenter( aBoundRect.Center() );
+ aPolyPoly.transform(basegfx::utils::createTranslateB2DHomMatrix(aCenter.X(), aCenter.Y()));
+ }
+ }
+
+ rPathObj.SetPathPoly( aPolyPoly );
+}
+
+void CustomAnimationEffect::updatePathFromSdrPathObj( const SdrPathObj& rPathObj )
+{
+ ::basegfx::B2DPolyPolygon aPolyPoly( rPathObj.GetPathPoly() );
+
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape(getTargetShape());
+ if( pObj )
+ {
+ ::tools::Rectangle aBoundRect(0,0,0,0);
+
+ drawinglayer::primitive2d::Primitive2DContainer xPrimitives;
+ pObj->GetViewContact().getViewIndependentPrimitive2DContainer(xPrimitives);
+ const drawinglayer::geometry::ViewInformation2D aViewInformation2D;
+ const basegfx::B2DRange aRange(xPrimitives.getB2DRange(aViewInformation2D));
+
+ if(!aRange.isEmpty())
+ {
+ aBoundRect = ::tools::Rectangle(
+ static_cast<sal_Int32>(floor(aRange.getMinX())), static_cast<sal_Int32>(floor(aRange.getMinY())),
+ static_cast<sal_Int32>(ceil(aRange.getMaxX())), static_cast<sal_Int32>(ceil(aRange.getMaxY())));
+ }
+
+ const Point aCenter( aBoundRect.Center() );
+
+ aPolyPoly.transform(basegfx::utils::createTranslateB2DHomMatrix(-aCenter.X(), -aCenter.Y()));
+
+ SdrPage* pPage = pObj->getSdrPageFromSdrObject();
+ if( pPage )
+ {
+ const Size aPageSize( pPage->GetSize() );
+ aPolyPoly.transform(basegfx::utils::createScaleB2DHomMatrix(
+ 1.0 / static_cast<double>(aPageSize.Width()), 1.0 / static_cast<double>(aPageSize.Height())));
+ }
+ }
+
+ setPath( ::basegfx::utils::exportToSvgD( aPolyPoly, true, true, true) );
+}
+
+EffectSequenceHelper::EffectSequenceHelper()
+: mnSequenceType( EffectNodeType::DEFAULT )
+{
+}
+
+EffectSequenceHelper::EffectSequenceHelper( const css::uno::Reference< css::animations::XTimeContainer >& xSequenceRoot )
+: mxSequenceRoot( xSequenceRoot ), mnSequenceType( EffectNodeType::DEFAULT )
+{
+ Reference< XAnimationNode > xNode( mxSequenceRoot, UNO_QUERY_THROW );
+ create( xNode );
+}
+
+EffectSequenceHelper::~EffectSequenceHelper()
+{
+ reset();
+}
+
+void EffectSequenceHelper::reset()
+{
+ for( CustomAnimationEffectPtr& pEffect : maEffects )
+ {
+ pEffect->setEffectSequence(nullptr);
+ }
+ maEffects.clear();
+}
+
+Reference< XAnimationNode > EffectSequenceHelper::getRootNode()
+{
+ return mxSequenceRoot;
+}
+
+void EffectSequenceHelper::append( const CustomAnimationEffectPtr& pEffect )
+{
+ pEffect->setEffectSequence( this );
+ maEffects.push_back(pEffect);
+ rebuild();
+}
+
+CustomAnimationEffectPtr EffectSequenceHelper::append( const CustomAnimationPresetPtr& pPreset, const Any& rTarget, double fDuration /* = -1.0 */ )
+{
+ CustomAnimationEffectPtr pEffect;
+
+ if( pPreset )
+ {
+ Reference< XAnimationNode > xNode( pPreset->create( "" ) );
+ if( xNode.is() )
+ {
+ // first, filter all only ui relevant user data
+ std::vector< NamedValue > aNewUserData;
+ Sequence< NamedValue > aUserData( xNode->getUserData() );
+
+ std::copy_if(std::cbegin(aUserData), std::cend(aUserData), std::back_inserter(aNewUserData),
+ [](const NamedValue& rProp) { return rProp.Name != "text-only" && rProp.Name != "preset-property"; });
+
+ if( !aNewUserData.empty() )
+ {
+ aUserData = ::comphelper::containerToSequence( aNewUserData );
+ xNode->setUserData( aUserData );
+ }
+
+ // check target, maybe we need to force it to text
+ sal_Int16 nSubItem = ShapeAnimationSubType::AS_WHOLE;
+
+ if( rTarget.getValueType() == ::cppu::UnoType<ParagraphTarget>::get() )
+ {
+ nSubItem = ShapeAnimationSubType::ONLY_TEXT;
+ }
+ else if( pPreset->isTextOnly() )
+ {
+ Reference< XShape > xShape;
+ rTarget >>= xShape;
+ if( xShape.is() )
+ {
+ // that's bad, we target a shape here but the effect is only for text
+ // so change subitem
+ nSubItem = ShapeAnimationSubType::ONLY_TEXT;
+ }
+ }
+
+ // now create effect from preset
+ pEffect = std::make_shared<CustomAnimationEffect>( xNode );
+ pEffect->setEffectSequence( this );
+ pEffect->setTarget( rTarget );
+ pEffect->setTargetSubItem( nSubItem );
+ if( fDuration != -1.0 )
+ pEffect->setDuration( fDuration );
+
+ maEffects.push_back(pEffect);
+
+ rebuild();
+ }
+ }
+
+ DBG_ASSERT( pEffect, "sd::EffectSequenceHelper::append(), failed!" );
+ return pEffect;
+}
+
+CustomAnimationEffectPtr EffectSequenceHelper::append( const SdrPathObj& rPathObj, const Any& rTarget, double fDuration /* = -1.0 */, const OUString& rPresetId )
+{
+ CustomAnimationEffectPtr pEffect;
+
+ if( fDuration <= 0.0 )
+ fDuration = 2.0;
+
+ try
+ {
+ Reference< XTimeContainer > xEffectContainer( ParallelTimeContainer::create( ::comphelper::getProcessComponentContext() ), UNO_QUERY_THROW );
+ Reference< XAnimationNode > xAnimateMotion( AnimateMotion::create( ::comphelper::getProcessComponentContext() ) );
+
+ xAnimateMotion->setDuration( Any( fDuration ) );
+ xAnimateMotion->setFill( AnimationFill::HOLD );
+ xEffectContainer->appendChild( xAnimateMotion );
+
+ sal_Int16 nSubItem = ShapeAnimationSubType::AS_WHOLE;
+
+ if( rTarget.getValueType() == ::cppu::UnoType<ParagraphTarget>::get() )
+ nSubItem = ShapeAnimationSubType::ONLY_TEXT;
+
+ pEffect = std::make_shared<CustomAnimationEffect>( xEffectContainer );
+ pEffect->setEffectSequence( this );
+ pEffect->setTarget( rTarget );
+ pEffect->setTargetSubItem( nSubItem );
+ pEffect->setNodeType( css::presentation::EffectNodeType::ON_CLICK );
+ pEffect->setPresetClassAndId( css::presentation::EffectPresetClass::MOTIONPATH, rPresetId );
+ pEffect->setAcceleration( 0.5 );
+ pEffect->setDecelerate( 0.5 );
+ pEffect->setFill( AnimationFill::HOLD );
+ pEffect->setBegin( 0.0 );
+ pEffect->updatePathFromSdrPathObj( rPathObj );
+ if( fDuration != -1.0 )
+ pEffect->setDuration( fDuration );
+
+ maEffects.push_back(pEffect);
+
+ rebuild();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::EffectSequenceHelper::append()" );
+ }
+
+ return pEffect;
+}
+
+void EffectSequenceHelper::replace( const CustomAnimationEffectPtr& pEffect, const CustomAnimationPresetPtr& pPreset, const OUString& rPresetSubType, double fDuration /* = -1.0 */ )
+{
+ if( !(pEffect && pPreset) )
+ return;
+
+ try
+ {
+ Reference< XAnimationNode > xNewNode( pPreset->create( rPresetSubType ) );
+ if( xNewNode.is() )
+ {
+ pEffect->replaceNode( xNewNode );
+ if( fDuration != -1.0 )
+ pEffect->setDuration( fDuration );
+ }
+
+ rebuild();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::EffectSequenceHelper::replace()" );
+ }
+}
+
+void EffectSequenceHelper::replace( const CustomAnimationEffectPtr& pEffect, const CustomAnimationPresetPtr& pPreset, double fDuration /* = -1.0 */ )
+{
+ replace( pEffect, pPreset, "", fDuration );
+}
+
+void EffectSequenceHelper::remove( const CustomAnimationEffectPtr& pEffect )
+{
+ if( pEffect )
+ {
+ pEffect->setEffectSequence( nullptr );
+ maEffects.remove( pEffect );
+ }
+
+ rebuild();
+}
+
+void EffectSequenceHelper::moveToBeforeEffect( const CustomAnimationEffectPtr& pEffect, const CustomAnimationEffectPtr& pInsertBefore)
+{
+ if ( pEffect )
+ {
+ maEffects.remove( pEffect );
+ EffectSequence::iterator aInsertIter( find( pInsertBefore ) );
+
+ // aInsertIter being end() is OK: pInsertBefore could be null, so put at end.
+ maEffects.insert( aInsertIter, pEffect );
+
+ rebuild();
+ }
+}
+
+void EffectSequenceHelper::rebuild()
+{
+ implRebuild();
+}
+
+void EffectSequenceHelper::implRebuild()
+{
+ try
+ {
+ // first we delete all time containers on the first two levels
+ Reference< XEnumerationAccess > xEnumerationAccess( mxSequenceRoot, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
+ Reference< XTimeContainer > xChildContainer( xChildNode, UNO_QUERY_THROW );
+
+ Reference< XEnumerationAccess > xChildEnumerationAccess( xChildNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xChildEnumeration( xChildEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ while( xChildEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xNode( xChildEnumeration->nextElement(), UNO_QUERY_THROW );
+ xChildContainer->removeChild( xNode );
+ }
+
+ mxSequenceRoot->removeChild( xChildNode );
+ }
+
+ // second, rebuild main sequence
+ EffectSequence::iterator aIter( maEffects.begin() );
+ EffectSequence::iterator aEnd( maEffects.end() );
+ if( aIter != aEnd )
+ {
+ std::vector< sd::AfterEffectNode > aAfterEffects;
+
+ CustomAnimationEffectPtr pEffect = *aIter++;
+
+ bool bFirst = true;
+ do
+ {
+ // create a par container for the next click node and all following with and after effects
+ Reference< XTimeContainer > xOnClickContainer( ParallelTimeContainer::create( ::comphelper::getProcessComponentContext() ), UNO_QUERY_THROW );
+
+ Event aEvent;
+ if( mxEventSource.is() )
+ {
+ aEvent.Source <<= mxEventSource;
+ aEvent.Trigger = EventTrigger::ON_CLICK;
+ }
+ else
+ {
+ aEvent.Trigger = EventTrigger::ON_NEXT;
+ }
+ aEvent.Repeat = 0;
+
+ Any aBegin( aEvent );
+ if( bFirst )
+ {
+ // if the first node is not a click action, this click container
+ // must not have INDEFINITE begin but start at 0s
+ bFirst = false;
+ if( pEffect->getNodeType() != EffectNodeType::ON_CLICK )
+ aBegin <<= 0.0;
+ }
+
+ xOnClickContainer->setBegin( aBegin );
+
+ mxSequenceRoot->appendChild( xOnClickContainer );
+
+ double fBegin = 0.0;
+
+ do
+ {
+ // create a par container for the current click or after effect node and all following with effects
+ Reference< XTimeContainer > xWithContainer( ParallelTimeContainer::create( ::comphelper::getProcessComponentContext() ), UNO_QUERY_THROW );
+ xWithContainer->setBegin( Any( fBegin ) );
+ xOnClickContainer->appendChild( xWithContainer );
+
+ double fDuration = 0.0;
+ do
+ {
+ Reference< XAnimationNode > xEffectNode( pEffect->getNode() );
+ xWithContainer->appendChild( xEffectNode );
+
+ if( pEffect->hasAfterEffect() )
+ {
+ Reference< XAnimationNode > xAfterEffect( pEffect->createAfterEffectNode() );
+ AfterEffectNode a( xAfterEffect, xEffectNode, pEffect->IsAfterEffectOnNext() );
+ aAfterEffects.push_back( a );
+ }
+
+ double fTemp = pEffect->getBegin() + pEffect->getAbsoluteDuration();
+ if( fTemp > fDuration )
+ fDuration = fTemp;
+
+ if( aIter != aEnd )
+ pEffect = *aIter++;
+ else
+ pEffect.reset();
+ }
+ while( pEffect && (pEffect->getNodeType() == EffectNodeType::WITH_PREVIOUS) );
+
+ fBegin += fDuration;
+ }
+ while( pEffect && (pEffect->getNodeType() != EffectNodeType::ON_CLICK) );
+ }
+ while( pEffect );
+
+ // process after effect nodes
+ std::for_each( aAfterEffects.begin(), aAfterEffects.end(), stl_process_after_effect_node_func );
+
+ updateTextGroups();
+
+ // reset duration, might have been altered (see below)
+ mxSequenceRoot->setDuration( Any() );
+ }
+ else
+ {
+ // empty sequence, set duration to 0.0 explicitly
+ // (otherwise, this sequence will never end)
+ mxSequenceRoot->setDuration( Any(0.0) );
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::EffectSequenceHelper::rebuild()" );
+ }
+}
+
+stl_CustomAnimationEffect_search_node_predict::stl_CustomAnimationEffect_search_node_predict( const css::uno::Reference< css::animations::XAnimationNode >& xSearchNode )
+: mxSearchNode( xSearchNode )
+{
+}
+
+bool stl_CustomAnimationEffect_search_node_predict::operator()( const CustomAnimationEffectPtr& pEffect ) const
+{
+ return pEffect->getNode() == mxSearchNode;
+}
+
+/// @throws Exception
+static bool implFindNextContainer( Reference< XTimeContainer > const & xParent, Reference< XTimeContainer > const & xCurrent, Reference< XTimeContainer >& xNext )
+{
+ Reference< XEnumerationAccess > xEnumerationAccess( xParent, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration() );
+ if( xEnumeration.is() )
+ {
+ Reference< XInterface > x;
+ while( xEnumeration->hasMoreElements() && !xNext.is() )
+ {
+ if( (xEnumeration->nextElement() >>= x) && (x == xCurrent) )
+ {
+ if( xEnumeration->hasMoreElements() )
+ xEnumeration->nextElement() >>= xNext;
+ }
+ }
+ }
+ return xNext.is();
+}
+
+void stl_process_after_effect_node_func(AfterEffectNode const & rNode)
+{
+ try
+ {
+ if( rNode.mxNode.is() && rNode.mxMaster.is() )
+ {
+ // set master node
+ Reference< XAnimationNode > xMasterNode( rNode.mxMaster, UNO_SET_THROW );
+ Sequence< NamedValue > aUserData( rNode.mxNode->getUserData() );
+ sal_Int32 nSize = aUserData.getLength();
+ aUserData.realloc(nSize+1);
+ auto pUserData = aUserData.getArray();
+ pUserData[nSize].Name = "master-element";
+ pUserData[nSize].Value <<= xMasterNode;
+ rNode.mxNode->setUserData( aUserData );
+
+ // insert after effect node into timeline
+ Reference< XTimeContainer > xContainer( rNode.mxMaster->getParent(), UNO_QUERY_THROW );
+
+ if( !rNode.mbOnNextEffect ) // sameClick
+ {
+ // insert the aftereffect after its effect is animated
+ xContainer->insertAfter( rNode.mxNode, rNode.mxMaster );
+ }
+ else // nextClick
+ {
+ Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
+ // insert the aftereffect in the next group
+
+ Reference< XTimeContainer > xClickContainer( xContainer->getParent(), UNO_QUERY_THROW );
+ Reference< XTimeContainer > xSequenceContainer( xClickContainer->getParent(), UNO_QUERY_THROW );
+
+ Reference< XTimeContainer > xNextContainer;
+
+ // first try if we have an after effect container
+ if( !implFindNextContainer( xClickContainer, xContainer, xNextContainer ) )
+ {
+ Reference< XTimeContainer > xNextClickContainer;
+ // if not, try to find the next click effect container
+ if( implFindNextContainer( xSequenceContainer, xClickContainer, xNextClickContainer ) )
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( xNextClickContainer, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ if( xEnumeration->hasMoreElements() )
+ {
+ // the next container is the first child container
+ xEnumeration->nextElement() >>= xNextContainer;
+ }
+ else
+ {
+ // this does not yet have a child container, create one
+ xNextContainer.set( ParallelTimeContainer::create(xContext), UNO_QUERY_THROW );
+
+ xNextContainer->setBegin( Any( 0.0 ) );
+ xNextClickContainer->appendChild( xNextContainer );
+ }
+ DBG_ASSERT( xNextContainer.is(), "ppt::stl_process_after_effect_node_func::operator(), could not find/create container!" );
+ }
+ }
+
+ // if we don't have a next container, we add one to the sequence container
+ if( !xNextContainer.is() )
+ {
+ Reference< XTimeContainer > xNewClickContainer( ParallelTimeContainer::create( xContext ), UNO_QUERY_THROW );
+
+ Event aEvent;
+ aEvent.Trigger = EventTrigger::ON_NEXT;
+ aEvent.Repeat = 0;
+ xNewClickContainer->setBegin( Any( aEvent ) );
+
+ xSequenceContainer->insertAfter( xNewClickContainer, xClickContainer );
+
+ xNextContainer.set( ParallelTimeContainer::create( xContext ), UNO_QUERY_THROW );
+
+ xNextContainer->setBegin( Any( 0.0 ) );
+ xNewClickContainer->appendChild( xNextContainer );
+ }
+
+ if( xNextContainer.is() )
+ {
+ // find begin time of first element
+ Reference< XEnumerationAccess > xEnumerationAccess( xNextContainer, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ if( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChild;
+ // the next container is the first child container
+ xEnumeration->nextElement() >>= xChild;
+ if( xChild.is() )
+ {
+ Any aBegin( xChild->getBegin() );
+ double fBegin = 0.0;
+ if( (aBegin >>= fBegin) && (fBegin >= 0.0))
+ rNode.mxNode->setBegin( aBegin );
+ }
+ }
+
+ xNextContainer->appendChild( rNode.mxNode );
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "ppt::stl_process_after_effect_node_func::operator()" );
+ }
+}
+
+EffectSequence::iterator EffectSequenceHelper::find( const CustomAnimationEffectPtr& pEffect )
+{
+ return std::find( maEffects.begin(), maEffects.end(), pEffect );
+}
+
+CustomAnimationEffectPtr EffectSequenceHelper::findEffect( const css::uno::Reference< css::animations::XAnimationNode >& xNode ) const
+{
+ CustomAnimationEffectPtr pEffect;
+
+ EffectSequence::const_iterator aIter = std::find_if(maEffects.begin(), maEffects.end(),
+ [&xNode](const CustomAnimationEffectPtr& rxEffect) { return rxEffect->getNode() == xNode; });
+ if (aIter != maEffects.end())
+ pEffect = *aIter;
+
+ return pEffect;
+}
+
+sal_Int32 EffectSequenceHelper::getOffsetFromEffect( const CustomAnimationEffectPtr& xEffect ) const
+{
+ auto aIter = std::find(maEffects.begin(), maEffects.end(), xEffect);
+ if (aIter != maEffects.end())
+ return static_cast<sal_Int32>(std::distance(maEffects.begin(), aIter));
+
+ return -1;
+}
+
+CustomAnimationEffectPtr EffectSequenceHelper::getEffectFromOffset( sal_Int32 nOffset ) const
+{
+ EffectSequence::const_iterator aIter( maEffects.begin() );
+ nOffset = std::min(nOffset, static_cast<sal_Int32>(maEffects.size()));
+ std::advance(aIter, nOffset);
+
+ CustomAnimationEffectPtr pEffect;
+ if( aIter != maEffects.end() )
+ pEffect = *aIter;
+
+ return pEffect;
+}
+
+bool EffectSequenceHelper::disposeShape( const Reference< XShape >& xShape )
+{
+ bool bChanges = false;
+
+ EffectSequence::iterator aIter( maEffects.begin() );
+ while( aIter != maEffects.end() )
+ {
+ if( (*aIter)->getTargetShape() == xShape )
+ {
+ (*aIter)->setEffectSequence( nullptr );
+ bChanges = true;
+ aIter = maEffects.erase( aIter );
+ }
+ else
+ {
+ ++aIter;
+ }
+ }
+
+ return bChanges;
+}
+
+bool EffectSequenceHelper::hasEffect( const css::uno::Reference< css::drawing::XShape >& xShape )
+{
+ return std::any_of(maEffects.begin(), maEffects.end(),
+ [&xShape](const CustomAnimationEffectPtr& rxEffect) { return rxEffect->getTargetShape() == xShape; });
+}
+
+bool EffectSequenceHelper::getParagraphNumberingLevels( const Reference< XShape >& xShape, std::vector< sal_Int32 >& rParagraphNumberingLevel )
+{
+ rParagraphNumberingLevel.clear();
+
+ if( !hasEffect( xShape ) )
+ return false;
+
+ Reference< XText > xText( xShape, UNO_QUERY );
+ if( xText.is() )
+ {
+ Reference< XEnumerationAccess > xEA( xText, UNO_QUERY );
+ if( xEA.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEA->createEnumeration();
+
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XPropertySet > xParaSet;
+ xEnumeration->nextElement() >>= xParaSet;
+
+ sal_Int32 nParaDepth = 0;
+ if( xParaSet.is() )
+ {
+ xParaSet->getPropertyValue( "NumberingLevel" ) >>= nParaDepth;
+ }
+
+ rParagraphNumberingLevel.push_back( nParaDepth );
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+void EffectSequenceHelper::insertTextRange( const css::uno::Any& aTarget )
+{
+ ParagraphTarget aParaTarget;
+ if( !(aTarget >>= aParaTarget ) )
+ return;
+
+ // get map [paragraph index] -> [NumberingLevel]
+ // for following reusage inside all animation effects
+ std::vector< sal_Int32 > paragraphNumberingLevel;
+ std::vector< sal_Int32 >* paragraphNumberingLevelParam = nullptr;
+ if ( getParagraphNumberingLevels( aParaTarget.Shape, paragraphNumberingLevel ) )
+ paragraphNumberingLevelParam = &paragraphNumberingLevel;
+
+ // update internal flags for each animation effect
+ const bool bChanges = std::accumulate(maEffects.begin(), maEffects.end(), false,
+ [&aParaTarget, &paragraphNumberingLevelParam](const bool bCheck, const CustomAnimationEffectPtr& rxEffect) {
+ bool bRes = bCheck;
+ if (rxEffect->getTargetShape() == aParaTarget.Shape)
+ bRes |= rxEffect->checkForText( paragraphNumberingLevelParam );
+ return bRes;
+ });
+
+ if( bChanges )
+ rebuild();
+}
+
+static bool isParagraphTargetTextEmpty( ParagraphTarget aParaTarget )
+{
+ // get paragraph
+ Reference< XText > xText ( aParaTarget.Shape, UNO_QUERY );
+ if( xText.is() )
+ {
+ Reference< XEnumerationAccess > xEA( xText, UNO_QUERY );
+ if( xEA.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEA->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ // advance to the Nth paragraph
+ sal_Int32 nPara = aParaTarget.Paragraph;
+ while( xEnumeration->hasMoreElements() && nPara-- )
+ xEnumeration->nextElement();
+
+ // get Nth paragraph's text and check if it's empty
+ if( xEnumeration->hasMoreElements() )
+ {
+ Reference< XTextRange > xRange( xEnumeration->nextElement(), UNO_QUERY );
+ if( xRange.is() )
+ {
+ OUString text = xRange->getString();
+ return text.isEmpty();
+ }
+ }
+ }
+ }
+ }
+ return false;
+}
+
+void EffectSequenceHelper::disposeTextRange( const css::uno::Any& aTarget )
+{
+ ParagraphTarget aParaTarget;
+ if( !(aTarget >>= aParaTarget ) )
+ return;
+
+ bool bChanges = false;
+
+ // building list of effects for target shape; process effects not on target shape
+ EffectSequence aTargetParagraphEffects;
+ for( const auto &pEffect : maEffects )
+ {
+ Any aIterTarget( pEffect->getTarget() );
+ if( aIterTarget.getValueType() == ::cppu::UnoType<ParagraphTarget>::get() )
+ {
+ ParagraphTarget aIterParaTarget;
+ if( (aIterTarget >>= aIterParaTarget) && (aIterParaTarget.Shape == aParaTarget.Shape) )
+ {
+ aTargetParagraphEffects.push_back(pEffect);
+ }
+ }
+ else if( pEffect->getTargetShape() == aParaTarget.Shape )
+ {
+ bChanges |= pEffect->checkForText();
+ }
+ }
+
+ // select effect to delete:
+ // if paragraph before target is blank, then delete its animation effect (if any) instead
+ ParagraphTarget aPreviousParagraph = aParaTarget;
+ --aPreviousParagraph.Paragraph;
+ bool bIsPreviousParagraphEmpty = isParagraphTargetTextEmpty( aPreviousParagraph );
+ sal_Int16 anParaNumToDelete = bIsPreviousParagraphEmpty ? aPreviousParagraph.Paragraph : aParaTarget.Paragraph;
+
+ // update effects
+ for( const auto &pEffect : aTargetParagraphEffects )
+ {
+ Any aIterTarget( pEffect->getTarget() );
+
+ ParagraphTarget aIterParaTarget;
+ aIterTarget >>= aIterParaTarget;
+
+ // delete effect for target paragraph (may have effects in more than one text group)
+ if( aIterParaTarget.Paragraph == anParaNumToDelete )
+ {
+ auto aItr = find( pEffect );
+ DBG_ASSERT( aItr != maEffects.end(), "sd::EffectSequenceHelper::disposeTextRange(), Expected effect missing.");
+ if( aItr != maEffects.end() )
+ {
+ (*aItr)->setEffectSequence( nullptr );
+ maEffects.erase(aItr);
+ bChanges = true;
+ }
+ }
+
+ // shift all paragraphs after disposed paragraph
+ if( aIterParaTarget.Paragraph > anParaNumToDelete )
+ {
+ --aIterParaTarget.Paragraph;
+ pEffect->setTarget( Any( aIterParaTarget ) );
+ bChanges = true;
+ }
+ }
+
+ if( bChanges )
+ {
+ rebuild();
+ }
+}
+
+CustomAnimationTextGroup::CustomAnimationTextGroup( const Reference< XShape >& rTarget, sal_Int32 nGroupId )
+: maTarget( rTarget ),
+ mnGroupId( nGroupId )
+{
+ reset();
+}
+
+void CustomAnimationTextGroup::reset()
+{
+ mnTextGrouping = -1;
+ mbAnimateForm = false;
+ mbTextReverse = false;
+ mfGroupingAuto = -1.0;
+ mnLastPara = -1; // used to check for TextReverse
+
+ for (sal_Int8 & rn : mnDepthFlags)
+ {
+ rn = 0;
+ }
+
+ maEffects.clear();
+}
+
+void CustomAnimationTextGroup::addEffect( CustomAnimationEffectPtr const & pEffect )
+{
+ maEffects.push_back( pEffect );
+
+ Any aTarget( pEffect->getTarget() );
+ if( aTarget.getValueType() == ::cppu::UnoType<ParagraphTarget>::get() )
+ {
+ // now look at the paragraph
+ ParagraphTarget aParaTarget;
+ aTarget >>= aParaTarget;
+
+ if( mnLastPara != -1 )
+ mbTextReverse = mnLastPara > aParaTarget.Paragraph;
+
+ mnLastPara = aParaTarget.Paragraph;
+
+ const sal_Int32 nParaDepth = pEffect->getParaDepth();
+
+ // only look at the first PARA_LEVELS levels
+ if( nParaDepth < PARA_LEVELS )
+ {
+ // our first paragraph with this level?
+ if( mnDepthFlags[nParaDepth] == 0 )
+ {
+ // so set it to the first found
+ mnDepthFlags[nParaDepth] = static_cast<sal_Int8>(pEffect->getNodeType());
+ }
+ else if( mnDepthFlags[nParaDepth] != pEffect->getNodeType() )
+ {
+ mnDepthFlags[nParaDepth] = -1;
+ }
+
+ if( pEffect->getNodeType() == EffectNodeType::AFTER_PREVIOUS )
+ mfGroupingAuto = pEffect->getBegin();
+
+ mnTextGrouping = PARA_LEVELS;
+ while( (mnTextGrouping > 0)
+ && (mnDepthFlags[mnTextGrouping - 1] <= 0) )
+ --mnTextGrouping;
+ }
+ }
+ else
+ {
+ // if we have an effect with the shape as a target, we animate the background
+ mbAnimateForm = pEffect->getTargetSubItem() != ShapeAnimationSubType::ONLY_TEXT;
+ }
+}
+
+CustomAnimationTextGroupPtr EffectSequenceHelper::findGroup( sal_Int32 nGroupId )
+{
+ CustomAnimationTextGroupPtr aPtr;
+
+ CustomAnimationTextGroupMap::iterator aIter( maGroupMap.find( nGroupId ) );
+ if( aIter != maGroupMap.end() )
+ aPtr = (*aIter).second;
+
+ return aPtr;
+}
+
+void EffectSequenceHelper::updateTextGroups()
+{
+ maGroupMap.clear();
+
+ // first create all the groups
+ for( const CustomAnimationEffectPtr& pEffect : maEffects )
+ {
+ const sal_Int32 nGroupId = pEffect->getGroupId();
+
+ if( nGroupId == -1 )
+ continue; // trivial case, no group
+
+ CustomAnimationTextGroupPtr pGroup = findGroup( nGroupId );
+ if( !pGroup )
+ {
+ pGroup = std::make_shared<CustomAnimationTextGroup>( pEffect->getTargetShape(), nGroupId );
+ maGroupMap[nGroupId] = pGroup;
+ }
+
+ pGroup->addEffect( pEffect );
+ }
+
+ // Now that all the text groups have been cleared up and rebuilt, we need to update its
+ // text grouping. addEffect() already make mnTextGrouping the last possible level,
+ // so just continue to find the last level that is not EffectNodeType::WITH_PREVIOUS.
+ for(const auto &rGroupMapItem: maGroupMap)
+ {
+ const CustomAnimationTextGroupPtr &pGroup = rGroupMapItem.second;
+ while(pGroup->mnTextGrouping > 0 && pGroup->mnDepthFlags[pGroup->mnTextGrouping - 1] == EffectNodeType::WITH_PREVIOUS)
+ --pGroup->mnTextGrouping;
+ }
+}
+
+CustomAnimationTextGroupPtr
+EffectSequenceHelper::createTextGroup(const CustomAnimationEffectPtr& pEffect,
+ sal_Int32 nTextGrouping, double fTextGroupingAuto,
+ bool bAnimateForm, bool bTextReverse)
+{
+ // first find a free group-id
+ sal_Int32 nGroupId = 0;
+
+ CustomAnimationTextGroupMap::iterator aIter( maGroupMap.begin() );
+ const CustomAnimationTextGroupMap::iterator aEnd( maGroupMap.end() );
+ while( aIter != aEnd )
+ {
+ if( (*aIter).first == nGroupId )
+ {
+ nGroupId++;
+ aIter = maGroupMap.begin();
+ }
+ else
+ {
+ ++aIter;
+ }
+ }
+
+ Reference< XShape > xTarget( pEffect->getTargetShape() );
+
+ CustomAnimationTextGroupPtr pTextGroup = std::make_shared<CustomAnimationTextGroup>( xTarget, nGroupId );
+ maGroupMap[nGroupId] = pTextGroup;
+
+ bool bUsed = false;
+
+ // do we need to target the shape?
+ if( (nTextGrouping == 0) || bAnimateForm )
+ {
+ sal_Int16 nSubItem;
+ if( nTextGrouping == 0)
+ nSubItem = bAnimateForm ? ShapeAnimationSubType::AS_WHOLE : ShapeAnimationSubType::ONLY_TEXT;
+ else
+ nSubItem = ShapeAnimationSubType::ONLY_BACKGROUND;
+
+ pEffect->setTarget( Any( xTarget ) );
+ pEffect->setTargetSubItem( nSubItem );
+ pEffect->setEffectSequence( this );
+ pEffect->setGroupId( nGroupId );
+
+ pTextGroup->addEffect( pEffect );
+ bUsed = true;
+ }
+
+ pTextGroup->mnTextGrouping = nTextGrouping;
+ pTextGroup->mfGroupingAuto = fTextGroupingAuto;
+ pTextGroup->mbTextReverse = bTextReverse;
+
+ // now add an effect for each paragraph
+ createTextGroupParagraphEffects( pTextGroup, pEffect, bUsed );
+
+ notify_listeners();
+
+ return pTextGroup;
+}
+
+void EffectSequenceHelper::createTextGroupParagraphEffects( const CustomAnimationTextGroupPtr& pTextGroup, const CustomAnimationEffectPtr& pEffect, bool bUsed )
+{
+ Reference< XShape > xTarget( pTextGroup->maTarget );
+
+ sal_Int32 nTextGrouping = pTextGroup->mnTextGrouping;
+ double fTextGroupingAuto = pTextGroup->mfGroupingAuto;
+ bool bTextReverse = pTextGroup->mbTextReverse;
+
+ // now add an effect for each paragraph
+ if( nTextGrouping < 0 )
+ return;
+
+ try
+ {
+ EffectSequence::iterator aInsertIter( find( pEffect ) );
+
+ Reference< XEnumerationAccess > xText( xTarget, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xText->createEnumeration(), UNO_SET_THROW );
+
+ std::deque< sal_Int16 > aParaList;
+ sal_Int16 nPara;
+
+ // fill the list with all valid paragraphs
+ for( nPara = 0; xEnumeration->hasMoreElements(); nPara++ )
+ {
+ Reference< XTextRange > xRange( xEnumeration->nextElement(), UNO_QUERY );
+ if( xRange.is() && !xRange->getString().isEmpty() )
+ {
+ if( bTextReverse ) // sort them
+ aParaList.push_front( nPara );
+ else
+ aParaList.push_back( nPara );
+ }
+ }
+
+ ParagraphTarget aTarget;
+ aTarget.Shape = xTarget;
+
+ for( const auto i : aParaList )
+ {
+ aTarget.Paragraph = i;
+
+ CustomAnimationEffectPtr pNewEffect;
+ if( bUsed )
+ {
+ // clone a new effect from first effect
+ pNewEffect = pEffect->clone();
+ ++aInsertIter;
+ aInsertIter = maEffects.insert( aInsertIter, pNewEffect );
+ }
+ else
+ {
+ // reuse first effect if it's not yet used
+ pNewEffect = pEffect;
+ bUsed = true;
+ aInsertIter = find( pNewEffect );
+ }
+
+ // set target and group-id
+ pNewEffect->setTarget( Any( aTarget ) );
+ pNewEffect->setTargetSubItem( ShapeAnimationSubType::ONLY_TEXT );
+ pNewEffect->setGroupId( pTextGroup->mnGroupId );
+ pNewEffect->setEffectSequence( this );
+
+ // set correct node type
+ if( pNewEffect->getParaDepth() < nTextGrouping )
+ {
+ if( fTextGroupingAuto == -1.0 )
+ {
+ pNewEffect->setNodeType( EffectNodeType::ON_CLICK );
+ pNewEffect->setBegin( 0.0 );
+ }
+ else
+ {
+ pNewEffect->setNodeType( EffectNodeType::AFTER_PREVIOUS );
+ pNewEffect->setBegin( fTextGroupingAuto );
+ }
+ }
+ else
+ {
+ pNewEffect->setNodeType( EffectNodeType::WITH_PREVIOUS );
+ pNewEffect->setBegin( 0.0 );
+ }
+
+ pTextGroup->addEffect( pNewEffect );
+ }
+ notify_listeners();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::EffectSequenceHelper::createTextGroup()" );
+ }
+}
+
+void EffectSequenceHelper::setTextGrouping( const CustomAnimationTextGroupPtr& pTextGroup, sal_Int32 nTextGrouping )
+{
+ if( pTextGroup->mnTextGrouping == nTextGrouping )
+ {
+ // first case, trivial case, do nothing
+ }
+ else if( (pTextGroup->mnTextGrouping == -1) && (nTextGrouping >= 0) )
+ {
+ // second case, we need to add new effects for each paragraph
+
+ CustomAnimationEffectPtr pEffect( pTextGroup->maEffects.front() );
+
+ pTextGroup->mnTextGrouping = nTextGrouping;
+ createTextGroupParagraphEffects( pTextGroup, pEffect, true );
+ notify_listeners();
+ }
+ else if( (pTextGroup->mnTextGrouping >= 0) && (nTextGrouping == -1 ) )
+ {
+ // third case, we need to remove effects for each paragraph
+
+ EffectSequence aEffects( pTextGroup->maEffects );
+ pTextGroup->reset();
+
+ for( const CustomAnimationEffectPtr& pEffect : aEffects )
+ {
+ if( pEffect->getTarget().getValueType() == ::cppu::UnoType<ParagraphTarget>::get() )
+ remove( pEffect );
+ else
+ pTextGroup->addEffect( pEffect );
+ }
+ notify_listeners();
+ }
+ else
+ {
+ // fourth case, we need to change the node types for the text nodes
+ double fTextGroupingAuto = pTextGroup->mfGroupingAuto;
+
+ EffectSequence aEffects( pTextGroup->maEffects );
+ pTextGroup->reset();
+
+ for( CustomAnimationEffectPtr& pEffect : aEffects )
+ {
+ if( pEffect->getTarget().getValueType() == ::cppu::UnoType<ParagraphTarget>::get() )
+ {
+ // set correct node type
+ if( pEffect->getParaDepth() < nTextGrouping )
+ {
+ if( fTextGroupingAuto == -1.0 )
+ {
+ pEffect->setNodeType( EffectNodeType::ON_CLICK );
+ pEffect->setBegin( 0.0 );
+ }
+ else
+ {
+ pEffect->setNodeType( EffectNodeType::AFTER_PREVIOUS );
+ pEffect->setBegin( fTextGroupingAuto );
+ }
+ }
+ else
+ {
+ pEffect->setNodeType( EffectNodeType::WITH_PREVIOUS );
+ pEffect->setBegin( 0.0 );
+ }
+ }
+
+ pTextGroup->addEffect( pEffect );
+
+ }
+ notify_listeners();
+ }
+}
+
+void EffectSequenceHelper::setAnimateForm( const CustomAnimationTextGroupPtr& pTextGroup, bool bAnimateForm )
+{
+ if( pTextGroup->mbAnimateForm == bAnimateForm )
+ {
+ // trivial case, do nothing
+ }
+ else
+ {
+ EffectSequence aEffects( pTextGroup->maEffects );
+ pTextGroup->reset();
+
+ SAL_WARN_IF(aEffects.empty(), "sd", "EffectSequenceHelper::setAnimateForm effects empty" );
+
+ if (aEffects.empty())
+ return;
+
+ EffectSequence::iterator aIter( aEffects.begin() );
+ const EffectSequence::iterator aEnd( aEffects.end() );
+
+ // first insert if we have to
+ if( bAnimateForm )
+ {
+ EffectSequence::iterator aInsertIter( find( *aIter ) );
+
+ CustomAnimationEffectPtr pEffect;
+ if( (aEffects.size() == 1) && ((*aIter)->getTarget().getValueType() != ::cppu::UnoType<ParagraphTarget>::get() ) )
+ {
+ // special case, only one effect and that targets whole text,
+ // convert this to target whole shape
+ pEffect = *aIter++;
+ pEffect->setTargetSubItem( ShapeAnimationSubType::AS_WHOLE );
+ }
+ else
+ {
+ pEffect = (*aIter)->clone();
+ pEffect->setTarget( Any( (*aIter)->getTargetShape() ) );
+ pEffect->setTargetSubItem( ShapeAnimationSubType::ONLY_BACKGROUND );
+ maEffects.insert( aInsertIter, pEffect );
+ }
+
+ pTextGroup->addEffect( pEffect );
+ }
+
+ if( !bAnimateForm && (aEffects.size() == 1) )
+ {
+ CustomAnimationEffectPtr pEffect( *aIter );
+ pEffect->setTarget( Any( (*aIter)->getTargetShape() ) );
+ pEffect->setTargetSubItem( ShapeAnimationSubType::ONLY_TEXT );
+ pTextGroup->addEffect( pEffect );
+ }
+ else
+ {
+ // read the rest to the group again
+ while( aIter != aEnd )
+ {
+ CustomAnimationEffectPtr pEffect( *aIter++ );
+
+ if( pEffect->getTarget().getValueType() == ::cppu::UnoType<ParagraphTarget>::get() )
+ {
+ pTextGroup->addEffect( pEffect );
+ }
+ else
+ {
+ DBG_ASSERT( !bAnimateForm, "sd::EffectSequenceHelper::setAnimateForm(), something is wrong here!" );
+ remove( pEffect );
+ }
+ }
+ }
+ notify_listeners();
+ }
+}
+
+void EffectSequenceHelper::setTextGroupingAuto( const CustomAnimationTextGroupPtr& pTextGroup, double fTextGroupingAuto )
+{
+ sal_Int32 nTextGrouping = pTextGroup->mnTextGrouping;
+
+ EffectSequence aEffects( pTextGroup->maEffects );
+ pTextGroup->reset();
+
+ for( CustomAnimationEffectPtr& pEffect : aEffects )
+ {
+ if( pEffect->getTarget().getValueType() == ::cppu::UnoType<ParagraphTarget>::get() )
+ {
+ // set correct node type
+ if( pEffect->getParaDepth() < nTextGrouping )
+ {
+ if( fTextGroupingAuto == -1.0 )
+ {
+ pEffect->setNodeType( EffectNodeType::ON_CLICK );
+ pEffect->setBegin( 0.0 );
+ }
+ else
+ {
+ pEffect->setNodeType( EffectNodeType::AFTER_PREVIOUS );
+ pEffect->setBegin( fTextGroupingAuto );
+ }
+ }
+ else
+ {
+ pEffect->setNodeType( EffectNodeType::WITH_PREVIOUS );
+ pEffect->setBegin( 0.0 );
+ }
+ }
+
+ pTextGroup->addEffect( pEffect );
+
+ }
+ notify_listeners();
+}
+
+namespace {
+
+struct ImplStlTextGroupSortHelper
+{
+ explicit ImplStlTextGroupSortHelper( bool bReverse ) : mbReverse( bReverse ) {};
+ bool operator()( const CustomAnimationEffectPtr& p1, const CustomAnimationEffectPtr& p2 );
+ bool mbReverse;
+ sal_Int32 getTargetParagraph( const CustomAnimationEffectPtr& p1 );
+};
+
+}
+
+sal_Int32 ImplStlTextGroupSortHelper::getTargetParagraph( const CustomAnimationEffectPtr& p1 )
+{
+ const Any aTarget(p1->getTarget());
+ if( aTarget.hasValue() && aTarget.getValueType() == ::cppu::UnoType<ParagraphTarget>::get() )
+ {
+ ParagraphTarget aParaTarget;
+ aTarget >>= aParaTarget;
+ return aParaTarget.Paragraph;
+ }
+ else
+ {
+ return mbReverse ? 0x7fffffff : -1;
+ }
+}
+
+bool ImplStlTextGroupSortHelper::operator()( const CustomAnimationEffectPtr& p1, const CustomAnimationEffectPtr& p2 )
+{
+ if( mbReverse )
+ {
+ return getTargetParagraph( p2 ) < getTargetParagraph( p1 );
+ }
+ else
+ {
+ return getTargetParagraph( p1 ) < getTargetParagraph( p2 );
+ }
+}
+
+void EffectSequenceHelper::setTextReverse( const CustomAnimationTextGroupPtr& pTextGroup, bool bTextReverse )
+{
+ if( pTextGroup->mbTextReverse == bTextReverse )
+ {
+ // do nothing
+ }
+ else
+ {
+ std::vector< CustomAnimationEffectPtr > aSortedVector( pTextGroup->maEffects.begin(), pTextGroup->maEffects.end() );
+ ImplStlTextGroupSortHelper aSortHelper( bTextReverse );
+ std::sort( aSortedVector.begin(), aSortedVector.end(), aSortHelper );
+
+ pTextGroup->reset();
+
+ std::vector< CustomAnimationEffectPtr >::iterator aIter( aSortedVector.begin() );
+ const std::vector< CustomAnimationEffectPtr >::iterator aEnd( aSortedVector.end() );
+
+ if( aIter != aEnd )
+ {
+ pTextGroup->addEffect( *aIter );
+ EffectSequence::iterator aInsertIter( find( *aIter++ ) );
+ while( aIter != aEnd )
+ {
+ CustomAnimationEffectPtr pEffect( *aIter++ );
+ maEffects.erase( find( pEffect ) );
+ aInsertIter = maEffects.insert( ++aInsertIter, pEffect );
+ pTextGroup->addEffect( pEffect );
+ }
+ }
+ notify_listeners();
+ }
+}
+
+void EffectSequenceHelper::addListener( ISequenceListener* pListener )
+{
+ if( std::find( maListeners.begin(), maListeners.end(), pListener ) == maListeners.end() )
+ maListeners.push_back( pListener );
+}
+
+void EffectSequenceHelper::removeListener( ISequenceListener* pListener )
+{
+ maListeners.remove( pListener );
+}
+
+namespace {
+
+struct stl_notify_listeners_func
+{
+ stl_notify_listeners_func() {}
+ void operator()(ISequenceListener* pListener) { pListener->notify_change(); }
+};
+
+}
+
+void EffectSequenceHelper::notify_listeners()
+{
+ stl_notify_listeners_func aFunc;
+ std::for_each( maListeners.begin(), maListeners.end(), aFunc );
+}
+
+void EffectSequenceHelper::create( const css::uno::Reference< css::animations::XAnimationNode >& xNode )
+{
+ DBG_ASSERT( xNode.is(), "sd::EffectSequenceHelper::create(), illegal argument" );
+
+ if( !xNode.is() )
+ return;
+
+ try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
+ createEffectsequence( xChildNode );
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::EffectSequenceHelper::create()" );
+ }
+}
+
+void EffectSequenceHelper::createEffectsequence( const Reference< XAnimationNode >& xNode )
+{
+ DBG_ASSERT( xNode.is(), "sd::EffectSequenceHelper::createEffectsequence(), illegal argument" );
+
+ if( !xNode.is() )
+ return;
+
+ try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
+
+ createEffects( xChildNode );
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::EffectSequenceHelper::createEffectsequence()" );
+ }
+}
+
+void EffectSequenceHelper::createEffects( const Reference< XAnimationNode >& xNode )
+{
+ DBG_ASSERT( xNode.is(), "sd::EffectSequenceHelper::createEffects(), illegal argument" );
+
+ if( !xNode.is() )
+ return;
+
+ try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
+
+ switch( xChildNode->getType() )
+ {
+ // found an effect
+ case AnimationNodeType::PAR:
+ case AnimationNodeType::ITERATE:
+ {
+ CustomAnimationEffectPtr pEffect = std::make_shared<CustomAnimationEffect>( xChildNode );
+
+ if( pEffect->mnNodeType != -1 )
+ {
+ pEffect->setEffectSequence( this );
+ maEffects.push_back(pEffect);
+ }
+ }
+ break;
+
+ // found an after effect
+ case AnimationNodeType::SET:
+ case AnimationNodeType::ANIMATECOLOR:
+ {
+ processAfterEffect( xChildNode );
+ }
+ break;
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::EffectSequenceHelper::createEffects()" );
+ }
+}
+
+void EffectSequenceHelper::processAfterEffect( const Reference< XAnimationNode >& xNode )
+{
+ try
+ {
+ Reference< XAnimationNode > xMaster;
+
+ const Sequence< NamedValue > aUserData( xNode->getUserData() );
+ const NamedValue* pProp = std::find_if(aUserData.begin(), aUserData.end(),
+ [](const NamedValue& rProp) { return rProp.Name == "master-element"; });
+
+ if (pProp != aUserData.end())
+ pProp->Value >>= xMaster;
+
+ // only process if this is a valid after effect
+ if( xMaster.is() )
+ {
+ CustomAnimationEffectPtr pMasterEffect;
+
+ // find the master effect
+ stl_CustomAnimationEffect_search_node_predict aSearchPredict( xMaster );
+ EffectSequence::iterator aIter( std::find_if( maEffects.begin(), maEffects.end(), aSearchPredict ) );
+ if( aIter != maEffects.end() )
+ pMasterEffect = *aIter;
+
+ if( pMasterEffect )
+ {
+ pMasterEffect->setHasAfterEffect( true );
+
+ // find out what kind of after effect this is
+ if( xNode->getType() == AnimationNodeType::ANIMATECOLOR )
+ {
+ // it's a dim
+ Reference< XAnimate > xAnimate( xNode, UNO_QUERY_THROW );
+ pMasterEffect->setDimColor( xAnimate->getTo() );
+ pMasterEffect->setAfterEffectOnNext( true );
+ }
+ else
+ {
+ // it's a hide
+ pMasterEffect->setAfterEffectOnNext( xNode->getParent() != xMaster->getParent() );
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::EffectSequenceHelper::processAfterEffect()" );
+ }
+}
+
+namespace {
+
+class AnimationChangeListener : public cppu::WeakImplHelper< XChangesListener >
+{
+public:
+ explicit AnimationChangeListener( MainSequence* pMainSequence ) : mpMainSequence( pMainSequence ) {}
+
+ virtual void SAL_CALL changesOccurred( const css::util::ChangesEvent& Event ) override;
+ virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
+private:
+ MainSequence* mpMainSequence;
+};
+
+}
+
+void SAL_CALL AnimationChangeListener::changesOccurred( const css::util::ChangesEvent& )
+{
+ if( mpMainSequence )
+ mpMainSequence->startRecreateTimer();
+}
+
+void SAL_CALL AnimationChangeListener::disposing( const css::lang::EventObject& )
+{
+}
+
+MainSequence::MainSequence()
+ : mxTimingRootNode(SequenceTimeContainer::create(::comphelper::getProcessComponentContext()))
+ , maTimer("sd MainSequence maTimer")
+ , mbTimerMode(false)
+ , mbRebuilding( false )
+ , mnRebuildLockGuard( 0 )
+ , mbPendingRebuildRequest( false )
+ , mbIgnoreChanges( 0 )
+{
+ if( mxTimingRootNode.is() )
+ {
+ Sequence< css::beans::NamedValue > aUserData
+ { { "node-type", css::uno::Any(css::presentation::EffectNodeType::MAIN_SEQUENCE) } };
+ mxTimingRootNode->setUserData( aUserData );
+ }
+ init();
+}
+
+MainSequence::MainSequence( const css::uno::Reference< css::animations::XAnimationNode >& xNode )
+ : mxTimingRootNode( xNode, UNO_QUERY )
+ , maTimer("sd MainSequence maTimer")
+ , mbTimerMode( false )
+ , mbRebuilding( false )
+ , mnRebuildLockGuard( 0 )
+ , mbPendingRebuildRequest( false )
+ , mbIgnoreChanges( 0 )
+{
+ init();
+}
+
+MainSequence::~MainSequence()
+{
+ reset();
+}
+
+void MainSequence::init()
+{
+ mnSequenceType = EffectNodeType::MAIN_SEQUENCE;
+
+ maTimer.SetInvokeHandler( LINK(this, MainSequence, onTimerHdl) );
+ maTimer.SetTimeout(50);
+
+ mxChangesListener.set( new AnimationChangeListener( this ) );
+
+ createMainSequence();
+}
+
+void MainSequence::reset( const css::uno::Reference< css::animations::XAnimationNode >& xTimingRootNode )
+{
+ reset();
+
+ mxTimingRootNode.set( xTimingRootNode, UNO_QUERY );
+
+ createMainSequence();
+}
+
+Reference< css::animations::XAnimationNode > MainSequence::getRootNode()
+{
+ DBG_ASSERT( mnRebuildLockGuard == 0, "MainSequence::getRootNode(), rebuild is locked, is this really what you want?" );
+
+ if( maTimer.IsActive() && mbTimerMode )
+ {
+ // force a rebuild NOW if one is pending
+ maTimer.Stop();
+ implRebuild();
+ }
+
+ return EffectSequenceHelper::getRootNode();
+}
+
+void MainSequence::createMainSequence()
+{
+ if( mxTimingRootNode.is() ) try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( mxTimingRootNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
+ sal_Int32 nNodeType = CustomAnimationEffect::get_node_type( xChildNode );
+ if( nNodeType == EffectNodeType::MAIN_SEQUENCE )
+ {
+ mxSequenceRoot.set( xChildNode, UNO_QUERY );
+ EffectSequenceHelper::create( xChildNode );
+ }
+ else if( nNodeType == EffectNodeType::INTERACTIVE_SEQUENCE )
+ {
+ Reference< XTimeContainer > xInteractiveRoot( xChildNode, UNO_QUERY_THROW );
+ InteractiveSequencePtr pIS = std::make_shared<InteractiveSequence>( xInteractiveRoot, this );
+ pIS->addListener( this );
+ maInteractiveSequenceVector.push_back( pIS );
+ }
+ }
+
+ // see if we have a mainsequence at all. if not, create one...
+ if( !mxSequenceRoot.is() )
+ {
+ mxSequenceRoot = SequenceTimeContainer::create( ::comphelper::getProcessComponentContext() );
+
+ uno::Sequence< css::beans::NamedValue > aUserData
+ { { "node-type", css::uno::Any(css::presentation::EffectNodeType::MAIN_SEQUENCE) } };
+ mxSequenceRoot->setUserData( aUserData );
+
+ // empty sequence until now, set duration to 0.0
+ // explicitly (otherwise, this sequence will never
+ // end)
+ mxSequenceRoot->setDuration( Any(0.0) );
+
+ Reference< XAnimationNode > xMainSequenceNode( mxSequenceRoot, UNO_QUERY_THROW );
+ mxTimingRootNode->appendChild( xMainSequenceNode );
+ }
+
+ updateTextGroups();
+
+ notify_listeners();
+
+ Reference< XChangesNotifier > xNotifier( mxTimingRootNode, UNO_QUERY );
+ if( xNotifier.is() )
+ xNotifier->addChangesListener( mxChangesListener );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::MainSequence::create()" );
+ return;
+ }
+
+ DBG_ASSERT( mxSequenceRoot.is(), "sd::MainSequence::create(), found no main sequence!" );
+}
+
+void MainSequence::reset()
+{
+ EffectSequenceHelper::reset();
+
+ for (auto const& interactiveSequence : maInteractiveSequenceVector)
+ interactiveSequence->reset();
+ maInteractiveSequenceVector.clear();
+
+ try
+ {
+ Reference< XChangesNotifier > xNotifier( mxTimingRootNode, UNO_QUERY );
+ if( xNotifier.is() )
+ xNotifier->removeChangesListener( mxChangesListener );
+ }
+ catch( Exception& )
+ {
+
+ }
+}
+
+InteractiveSequencePtr MainSequence::createInteractiveSequence( const css::uno::Reference< css::drawing::XShape >& xShape )
+{
+ InteractiveSequencePtr pIS;
+
+ // create a new interactive sequence container
+ Reference< XTimeContainer > xISRoot = SequenceTimeContainer::create( ::comphelper::getProcessComponentContext() );
+
+ uno::Sequence< css::beans::NamedValue > aUserData
+ { { "node-type", css::uno::Any(css::presentation::EffectNodeType::INTERACTIVE_SEQUENCE) } };
+ xISRoot->setUserData( aUserData );
+ xISRoot->setRestart( css::animations::AnimationRestart::WHEN_NOT_ACTIVE );
+
+ Reference< XChild > xChild( mxSequenceRoot, UNO_QUERY_THROW );
+ Reference< XTimeContainer > xParent( xChild->getParent(), UNO_QUERY_THROW );
+ xParent->appendChild( xISRoot );
+
+ pIS = std::make_shared<InteractiveSequence>( xISRoot, this);
+ pIS->setTriggerShape( xShape );
+ pIS->addListener( this );
+ maInteractiveSequenceVector.push_back( pIS );
+ return pIS;
+}
+
+CustomAnimationEffectPtr MainSequence::findEffect( const css::uno::Reference< css::animations::XAnimationNode >& xNode ) const
+{
+ CustomAnimationEffectPtr pEffect = EffectSequenceHelper::findEffect( xNode );
+
+ if( !pEffect )
+ {
+ for (auto const& interactiveSequence : maInteractiveSequenceVector)
+ {
+ pEffect = interactiveSequence->findEffect( xNode );
+ if (pEffect)
+ break;
+ }
+ }
+ return pEffect;
+}
+
+sal_Int32 MainSequence::getOffsetFromEffect( const CustomAnimationEffectPtr& pEffect ) const
+{
+ sal_Int32 nOffset = EffectSequenceHelper::getOffsetFromEffect( pEffect );
+
+ if( nOffset != -1 )
+ return nOffset;
+
+ nOffset = EffectSequenceHelper::getCount();
+
+ for (auto const& interactiveSequence : maInteractiveSequenceVector)
+ {
+ sal_Int32 nTemp = interactiveSequence->getOffsetFromEffect( pEffect );
+ if( nTemp != -1 )
+ return nOffset + nTemp;
+
+ nOffset += interactiveSequence->getCount();
+ }
+
+ return -1;
+}
+
+CustomAnimationEffectPtr MainSequence::getEffectFromOffset( sal_Int32 nOffset ) const
+{
+ if( nOffset >= 0 )
+ {
+ if( nOffset < getCount() )
+ return EffectSequenceHelper::getEffectFromOffset( nOffset );
+
+ nOffset -= getCount();
+
+ auto aIter( maInteractiveSequenceVector.begin() );
+
+ while( (aIter != maInteractiveSequenceVector.end()) && (nOffset > (*aIter)->getCount()) )
+ nOffset -= (*aIter++)->getCount();
+
+ if( (aIter != maInteractiveSequenceVector.end()) && (nOffset >= 0) )
+ return (*aIter)->getEffectFromOffset( nOffset );
+ }
+
+ CustomAnimationEffectPtr pEffect;
+ return pEffect;
+}
+
+bool MainSequence::disposeShape( const Reference< XShape >& xShape )
+{
+ bool bChanges = EffectSequenceHelper::disposeShape( xShape );
+
+ for (auto const& iterativeSequence : maInteractiveSequenceVector)
+ {
+ bChanges |= iterativeSequence->disposeShape( xShape );
+ }
+
+ if( bChanges )
+ startRebuildTimer();
+
+ return bChanges;
+}
+
+bool MainSequence::hasEffect( const css::uno::Reference< css::drawing::XShape >& xShape )
+{
+ if( EffectSequenceHelper::hasEffect( xShape ) )
+ return true;
+
+ for (auto const& iterativeSequence : maInteractiveSequenceVector)
+ {
+ if( iterativeSequence->getTriggerShape() == xShape )
+ return true;
+
+ if( iterativeSequence->hasEffect( xShape ) )
+ return true;
+ }
+
+ return false;
+}
+
+void MainSequence::insertTextRange( const css::uno::Any& aTarget )
+{
+ EffectSequenceHelper::insertTextRange( aTarget );
+
+ for (auto const& iterativeSequence : maInteractiveSequenceVector)
+ {
+ iterativeSequence->insertTextRange( aTarget );
+ }
+}
+
+void MainSequence::disposeTextRange( const css::uno::Any& aTarget )
+{
+ EffectSequenceHelper::disposeTextRange( aTarget );
+
+ for (auto const& iterativeSequence : maInteractiveSequenceVector)
+ {
+ iterativeSequence->disposeTextRange( aTarget );
+ }
+}
+
+/** callback from the sd::View when an object just left text edit mode */
+void MainSequence::onTextChanged( const Reference< XShape >& xShape )
+{
+ EffectSequenceHelper::onTextChanged( xShape );
+
+ for (auto const& iterativeSequence : maInteractiveSequenceVector)
+ {
+ iterativeSequence->onTextChanged( xShape );
+ }
+}
+
+void EffectSequenceHelper::onTextChanged( const Reference< XShape >& xShape )
+{
+ // get map [paragraph index] -> [NumberingLevel]
+ // for following reusage inside all animation effects
+ std::vector< sal_Int32 > paragraphNumberingLevel;
+ std::vector< sal_Int32 >* paragraphNumberingLevelParam = nullptr;
+ if ( getParagraphNumberingLevels( xShape, paragraphNumberingLevel ) )
+ paragraphNumberingLevelParam = &paragraphNumberingLevel;
+
+ // update internal flags for each animation effect
+ const bool bChanges = std::accumulate(maEffects.begin(), maEffects.end(), false,
+ [&xShape, &paragraphNumberingLevelParam](const bool bCheck, const CustomAnimationEffectPtr& rxEffect) {
+ bool bRes = bCheck;
+ if (rxEffect->getTargetShape() == xShape)
+ bRes |= rxEffect->checkForText( paragraphNumberingLevelParam );
+ return bRes;
+ });
+
+ if( bChanges )
+ rebuild();
+}
+
+void MainSequence::rebuild()
+{
+ startRebuildTimer();
+}
+
+void MainSequence::lockRebuilds()
+{
+ mnRebuildLockGuard++;
+}
+
+void MainSequence::unlockRebuilds()
+{
+ DBG_ASSERT( mnRebuildLockGuard, "sd::MainSequence::unlockRebuilds(), no corresponding lockRebuilds() call!" );
+ if( mnRebuildLockGuard )
+ mnRebuildLockGuard--;
+
+ if( (mnRebuildLockGuard == 0) && mbPendingRebuildRequest )
+ {
+ mbPendingRebuildRequest = false;
+ startRebuildTimer();
+ }
+}
+
+void MainSequence::implRebuild()
+{
+ if( mnRebuildLockGuard )
+ {
+ mbPendingRebuildRequest = true;
+ return;
+ }
+
+ mbRebuilding = true;
+
+ EffectSequenceHelper::implRebuild();
+
+ auto aIter( maInteractiveSequenceVector.begin() );
+ while( aIter != maInteractiveSequenceVector.end() )
+ {
+ InteractiveSequencePtr pIS( *aIter );
+ if( pIS->maEffects.empty() )
+ {
+ // remove empty interactive sequences
+ aIter = maInteractiveSequenceVector.erase( aIter );
+
+ Reference< XChild > xChild( mxSequenceRoot, UNO_QUERY_THROW );
+ Reference< XTimeContainer > xParent( xChild->getParent(), UNO_QUERY_THROW );
+ Reference< XAnimationNode > xISNode( pIS->mxSequenceRoot, UNO_QUERY_THROW );
+ xParent->removeChild( xISNode );
+ }
+ else
+ {
+ pIS->implRebuild();
+ ++aIter;
+ }
+ }
+
+ notify_listeners();
+ mbRebuilding = false;
+}
+
+void MainSequence::notify_change()
+{
+ notify_listeners();
+}
+
+bool MainSequence::setTrigger( const CustomAnimationEffectPtr& pEffect, const css::uno::Reference< css::drawing::XShape >& xTriggerShape )
+{
+ EffectSequenceHelper* pOldSequence = pEffect->getEffectSequence();
+
+ EffectSequenceHelper* pNewSequence = nullptr;
+ if( xTriggerShape.is() )
+ {
+ for (InteractiveSequencePtr const& pIS : maInteractiveSequenceVector)
+ {
+ if( pIS->getTriggerShape() == xTriggerShape )
+ {
+ pNewSequence = pIS.get();
+ break;
+ }
+ }
+
+ if( !pNewSequence )
+ pNewSequence = createInteractiveSequence( xTriggerShape ).get();
+ }
+ else
+ {
+ pNewSequence = this;
+ }
+
+ if( pOldSequence != pNewSequence )
+ {
+ if( pOldSequence )
+ pOldSequence->maEffects.remove( pEffect );
+ if( pNewSequence )
+ pNewSequence->maEffects.push_back( pEffect );
+ pEffect->setEffectSequence( pNewSequence );
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+
+}
+
+IMPL_LINK_NOARG(MainSequence, onTimerHdl, Timer *, void)
+{
+ if( mbTimerMode )
+ {
+ implRebuild();
+ }
+ else
+ {
+ reset();
+ createMainSequence();
+ }
+}
+
+/** starts a timer that recreates the internal structure from the API core */
+void MainSequence::startRecreateTimer()
+{
+ if( !mbRebuilding && (mbIgnoreChanges == 0) )
+ {
+ mbTimerMode = false;
+ maTimer.Start();
+ }
+}
+
+/**
+ * starts a timer that rebuilds the API core from the internal structure
+ * This is used to reduce the number of screen redraws due to animation changes.
+*/
+void MainSequence::startRebuildTimer()
+{
+ mbTimerMode = true;
+ maTimer.Start();
+}
+
+InteractiveSequence::InteractiveSequence( const Reference< XTimeContainer >& xSequenceRoot, MainSequence* pMainSequence )
+: EffectSequenceHelper( xSequenceRoot ), mpMainSequence( pMainSequence )
+{
+ mnSequenceType = EffectNodeType::INTERACTIVE_SEQUENCE;
+
+ try
+ {
+ if( mxSequenceRoot.is() )
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( mxSequenceRoot, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), UNO_SET_THROW );
+ while( !mxEventSource.is() && xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
+
+ Event aEvent;
+ if( (xChildNode->getBegin() >>= aEvent) && (aEvent.Trigger == EventTrigger::ON_CLICK) )
+ aEvent.Source >>= mxEventSource;
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::InteractiveSequence::InteractiveSequence()" );
+ return;
+ }
+}
+
+void InteractiveSequence::rebuild()
+{
+ mpMainSequence->rebuild();
+}
+
+void InteractiveSequence::implRebuild()
+{
+ EffectSequenceHelper::implRebuild();
+}
+
+MainSequenceRebuildGuard::MainSequenceRebuildGuard( const MainSequencePtr& pMainSequence )
+: mpMainSequence( pMainSequence )
+{
+ if( mpMainSequence )
+ mpMainSequence->lockRebuilds();
+}
+
+MainSequenceRebuildGuard::~MainSequenceRebuildGuard()
+{
+ if( mpMainSequence )
+ mpMainSequence->unlockRebuilds();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/CustomAnimationPreset.cxx b/sd/source/core/CustomAnimationPreset.cxx
new file mode 100644
index 000000000..d7c19401d
--- /dev/null
+++ b/sd/source/core/CustomAnimationPreset.cxx
@@ -0,0 +1,514 @@
+/* -*- 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 <com/sun/star/util/XCloneable.hpp>
+#include <com/sun/star/animations/XAnimationNodeSupplier.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/configuration/theDefaultProvider.hpp>
+#include <com/sun/star/xml/sax/InputSource.hpp>
+#include <com/sun/star/xml/sax/XFastParser.hpp>
+#include <com/sun/star/presentation/EffectPresetClass.hpp>
+#include <com/sun/star/beans/NamedValue.hpp>
+#include <unotools/streamwrap.hxx>
+#include <comphelper/getexpandeduri.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertysequence.hxx>
+#include <comphelper/random.hxx>
+#include <comphelper/lok.hxx>
+#include <unotools/syslocaleoptions.hxx>
+#include <tools/stream.hxx>
+#include <tools/diagnose_ex.h>
+#include <o3tl/string_view.hxx>
+
+#include <vcl/svapp.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#include <CustomAnimationPreset.hxx>
+
+#include <algorithm>
+#include <vector>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::animations;
+using namespace ::com::sun::star::presentation;
+
+using ::com::sun::star::io::XInputStream;
+using ::com::sun::star::lang::XMultiServiceFactory;
+using ::com::sun::star::container::XNameAccess;
+using ::com::sun::star::util::XCloneable;
+using ::com::sun::star::beans::NamedValue;
+
+namespace sd {
+
+static Reference< XNameAccess > getNodeAccess( const Reference< XMultiServiceFactory >& xConfigProvider, const OUString& rNodePath )
+{
+ Reference< XNameAccess > xConfigAccess;
+
+ try
+ {
+ Sequence<Any> aArgs(comphelper::InitAnyPropertySequence(
+ {
+ {"nodepath", uno::Any(rNodePath)}
+ }));
+
+ xConfigAccess.set(
+ xConfigProvider->createInstanceWithArguments( "com.sun.star.configuration.ConfigurationAccess", aArgs ),
+ UNO_QUERY);
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::getNodeAccess()" );
+ }
+
+ return xConfigAccess;
+}
+
+void implImportLabels( const Reference< XMultiServiceFactory >& xConfigProvider, const OUString& rNodePath, UStringMap& rStringMap )
+{
+ try
+ {
+ Reference< XNameAccess > xConfigAccess( getNodeAccess( xConfigProvider, rNodePath ) );
+ if( xConfigAccess.is() )
+ {
+ Reference< XNameAccess > xNameAccess;
+ const Sequence< OUString > aNames( xConfigAccess->getElementNames() );
+ for(const OUString& rName : aNames)
+ {
+ xConfigAccess->getByName( rName ) >>= xNameAccess;
+ if( xNameAccess.is() )
+ {
+ OUString aUIName;
+ xNameAccess->getByName( "Label" ) >>= aUIName;
+ if( !aUIName.isEmpty() )
+ {
+ rStringMap[ rName ] = aUIName;
+ }
+ }
+ }
+ }
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::implImportLabels()" );
+ }
+}
+
+CustomAnimationPreset::CustomAnimationPreset( const CustomAnimationEffectPtr& pEffect )
+{
+ maPresetId = pEffect->getPresetId();
+ maProperty = pEffect->getProperty();
+
+ add( pEffect );
+
+ mfDuration = pEffect->getDuration();
+ maDefaultSubTyp = pEffect->getPresetSubType();
+
+ const Sequence< NamedValue > aUserData( pEffect->getNode()->getUserData() );
+
+ mbIsTextOnly = std::any_of(aUserData.begin(), aUserData.end(),
+ [](const NamedValue& rProp) { return rProp.Name == "text-only"; });
+}
+
+void CustomAnimationPreset::add( const CustomAnimationEffectPtr& pEffect )
+{
+ maSubTypes[ pEffect->getPresetSubType() ] = pEffect;
+}
+
+std::vector<OUString> CustomAnimationPreset::getSubTypes()
+{
+ std::vector<OUString> aSubTypes;
+
+ if( maSubTypes.size() > 1 )
+ {
+ std::transform(maSubTypes.begin(), maSubTypes.end(), std::back_inserter(aSubTypes),
+ [](EffectsSubTypeMap::value_type& rEntry) -> OUString { return rEntry.first; });
+ }
+
+ return aSubTypes;
+}
+
+Reference< XAnimationNode > CustomAnimationPreset::create( const OUString& rstrSubType )
+{
+ try
+ {
+ OUString strSubType( rstrSubType );
+ if( strSubType.isEmpty() )
+ strSubType = maDefaultSubTyp;
+
+ CustomAnimationEffectPtr pEffect = maSubTypes[strSubType];
+ if( pEffect )
+ {
+ Reference< XCloneable > xCloneable( pEffect->getNode(), UNO_QUERY_THROW );
+ Reference< XAnimationNode > xNode( xCloneable->createClone(), UNO_QUERY_THROW );
+ return xNode;
+ }
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPresets::create()" );
+ }
+
+ Reference< XAnimationNode > xNode;
+ return xNode;
+}
+
+std::vector<OUString> CustomAnimationPreset::getProperties() const
+{
+ std::vector<OUString> aPropertyList;
+ if (!maProperty.isEmpty())
+ {
+ sal_Int32 nPos = 0;
+ do
+ {
+ aPropertyList.push_back(maProperty.getToken(0, ';', nPos));
+ }
+ while (nPos >= 0);
+ }
+ return aPropertyList;
+}
+
+bool CustomAnimationPreset::hasProperty( std::u16string_view rProperty )const
+{
+ if (maProperty.isEmpty())
+ return false;
+
+ sal_Int32 nPos = 0;
+ do
+ {
+ if (o3tl::getToken(maProperty, 0, ';', nPos) == rProperty)
+ return true;
+ }
+ while (nPos >= 0);
+
+ return false;
+}
+
+CustomAnimationPresets::CustomAnimationPresets()
+{
+}
+
+CustomAnimationPresets::~CustomAnimationPresets()
+{
+}
+
+Reference< XAnimationNode > implImportEffects( const Reference< XMultiServiceFactory >& xServiceFactory, const OUString& rPath )
+{
+ Reference< XAnimationNode > xRootNode;
+
+ try
+ {
+ // create stream
+ std::unique_ptr<SvStream> pIStm = ::utl::UcbStreamHelper::CreateStream( rPath, StreamMode::READ );
+ Reference<XInputStream> xInputStream( new utl::OInputStreamWrapper( std::move(pIStm) ) );
+
+ // prepare ParserInputSource
+ xml::sax::InputSource aParserInput;
+ aParserInput.sSystemId = rPath;
+ aParserInput.aInputStream = xInputStream;
+
+ // get filter
+ Reference< xml::sax::XFastParser > xFilter( xServiceFactory->createInstance("com.sun.star.comp.Xmloff.AnimationsImport" ), UNO_QUERY_THROW );
+
+ xFilter->parseStream( aParserInput );
+
+ Reference< XAnimationNodeSupplier > xAnimationNodeSupplier( xFilter, UNO_QUERY_THROW );
+ xRootNode = xAnimationNodeSupplier->getAnimationNode();
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION("sd", "");
+ }
+
+ return xRootNode;
+}
+
+void CustomAnimationPresets::importEffects()
+{
+ try
+ {
+ uno::Reference< uno::XComponentContext > xContext(
+ comphelper::getProcessComponentContext() );
+ Reference< XMultiServiceFactory > xServiceFactory(
+ xContext->getServiceManager(), UNO_QUERY_THROW );
+
+ Reference< XMultiServiceFactory > xConfigProvider =
+ configuration::theDefaultProvider::get( xContext );
+
+ // read path to transition effects files from config
+ uno::Sequence<uno::Any> aArgs(comphelper::InitAnyPropertySequence(
+ {
+ {"nodepath", uno::Any(OUString("/org.openoffice.Office.Impress/Misc"))}
+ }));
+ Reference<container::XNameAccess> xNameAccess(
+ xConfigProvider->createInstanceWithArguments(
+ "com.sun.star.configuration.ConfigurationAccess",
+ aArgs ), UNO_QUERY_THROW );
+ uno::Sequence< OUString > aFiles;
+ xNameAccess->getByName( "EffectFiles" ) >>= aFiles;
+
+ for( const auto& rFile : std::as_const(aFiles) )
+ {
+ OUString aURL = comphelper::getExpandedUri(xContext, rFile);
+
+ mxRootNode = implImportEffects( xServiceFactory, aURL );
+
+ if( mxRootNode.is() )
+ {
+ Reference< XTimeContainer > xRootContainer( mxRootNode, UNO_QUERY_THROW );
+ EffectSequenceHelper aSequence( xRootContainer );
+
+ EffectSequence::iterator aIter( aSequence.getBegin() );
+ const EffectSequence::iterator aEnd( aSequence.getEnd() );
+
+ while( aIter != aEnd )
+ {
+ CustomAnimationEffectPtr pEffect = *aIter;
+
+ const OUString aPresetId( pEffect->getPresetId() );
+ CustomAnimationPresetPtr pDescriptor = getEffectDescriptor( aPresetId );
+ if( pDescriptor )
+ pDescriptor->add( pEffect );
+ else
+ {
+ pDescriptor = std::make_shared<CustomAnimationPreset>( pEffect );
+ pDescriptor->maLabel = getUINameForPresetId( pEffect->getPresetId() );
+ maEffectDescriptorMap[aPresetId] = pDescriptor;
+ }
+
+ ++aIter;
+ }
+ }
+ }
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPresets::importEffects()" );
+ }
+}
+
+void CustomAnimationPresets::importResources()
+{
+ try
+ {
+ // Get service factory
+ Reference< XComponentContext > xContext( comphelper::getProcessComponentContext() );
+
+ Reference< XMultiServiceFactory > xConfigProvider =
+ configuration::theDefaultProvider::get( xContext );
+
+ implImportLabels( xConfigProvider, "/org.openoffice.Office.UI.Effects/UserInterface/Properties", maPropertyNameMap );
+
+ implImportLabels( xConfigProvider, "/org.openoffice.Office.UI.Effects/UserInterface/Effects", maEffectNameMap );
+
+ importEffects();
+
+ importPresets( xConfigProvider, "/org.openoffice.Office.UI.Effects/Presets/Entrance", maEntrancePresets );
+
+ importPresets( xConfigProvider, "/org.openoffice.Office.UI.Effects/Presets/Emphasis", maEmphasisPresets );
+
+ importPresets( xConfigProvider, "/org.openoffice.Office.UI.Effects/Presets/Exit", maExitPresets );
+
+ importPresets( xConfigProvider, "/org.openoffice.Office.UI.Effects/Presets/MotionPaths", maMotionPathsPresets );
+
+ importPresets( xConfigProvider, "/org.openoffice.Office.UI.Effects/Presets/Misc", maMiscPresets );
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPresets::importResources()" );
+ }
+}
+
+void CustomAnimationPresets::importPresets( const Reference< XMultiServiceFactory >& xConfigProvider, const OUString& rNodePath, PresetCategoryList& rPresetMap )
+{
+#ifdef DEBUG
+ OUString aMissedPresetIds;
+#endif
+
+ try
+ {
+ Reference< XNameAccess > xTypeAccess( getNodeAccess( xConfigProvider, rNodePath ) );
+ if( xTypeAccess.is() )
+ {
+ Reference< XNameAccess > xCategoryAccess;
+
+ const Sequence< OUString > aNames( xTypeAccess->getElementNames() );
+ for(const OUString& rName : aNames)
+ {
+ xTypeAccess->getByName( rName ) >>= xCategoryAccess;
+
+ if( xCategoryAccess.is() && xCategoryAccess->hasByName( "Label" ) && xCategoryAccess->hasByName( "Effects" ) )
+ {
+ OUString aLabel;
+ xCategoryAccess->getByName( "Label" ) >>= aLabel;
+
+ Sequence< OUString > aEffects;
+ xCategoryAccess->getByName( "Effects" ) >>= aEffects;
+
+ EffectDescriptorList aEffectsList;
+
+ for( const OUString& rEffectName : std::as_const(aEffects) )
+ {
+ CustomAnimationPresetPtr pEffect = getEffectDescriptor( rEffectName );
+ if( pEffect )
+ {
+ aEffectsList.push_back( pEffect );
+ }
+#ifdef DEBUG
+ else
+ {
+ aMissedPresetIds += OUString(rEffectName);
+ aMissedPresetIds += "\n";
+ }
+#endif
+ }
+ rPresetMap.push_back( std::make_shared<PresetCategory>( aLabel, std::move(aEffectsList) ) );
+ }
+ }
+ }
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPresets::importPresets()" );
+ }
+
+#ifdef DEBUG
+ SAL_WARN_IF(!aMissedPresetIds.isEmpty(), "sd", "sd::CustomAnimationPresets::importPresets(), invalid preset id: "
+ << aMissedPresetIds);
+#endif
+}
+
+CustomAnimationPresetPtr CustomAnimationPresets::getEffectDescriptor( const OUString& rPresetId ) const
+{
+ EffectDescriptorMap::const_iterator aIter( maEffectDescriptorMap.find( rPresetId ) );
+
+ if( aIter != maEffectDescriptorMap.end() )
+ {
+ return (*aIter).second;
+ }
+ else
+ {
+ return CustomAnimationPresetPtr(nullptr);
+ }
+}
+
+const OUString& CustomAnimationPresets::getUINameForPresetId( const OUString& rPresetId ) const
+{
+ return translateName( rPresetId, maEffectNameMap );
+}
+
+const OUString& CustomAnimationPresets::getUINameForProperty( const OUString& rPresetId ) const
+{
+ return translateName( rPresetId, maPropertyNameMap );
+}
+
+const OUString& CustomAnimationPresets::translateName( const OUString& rId, const UStringMap& rNameMap )
+{
+ UStringMap::const_iterator aIter( rNameMap.find( rId ) );
+
+ if( aIter != rNameMap.end() )
+ {
+ return (*aIter).second;
+ }
+ else
+ {
+ return rId;
+ }
+}
+void CustomAnimationPresets::changePresetSubType( const CustomAnimationEffectPtr& pEffect, const OUString& rPresetSubType ) const
+{
+ if( pEffect && pEffect->getPresetSubType() != rPresetSubType )
+ {
+ CustomAnimationPresetPtr pDescriptor( getEffectDescriptor( pEffect->getPresetId() ) );
+
+ if( pDescriptor )
+ {
+ Reference< XAnimationNode > xNewNode( pDescriptor->create( rPresetSubType ) );
+ if( xNewNode.is() )
+ pEffect->replaceNode( xNewNode );
+ }
+ }
+}
+
+std::map<OUString, CustomAnimationPresets> CustomAnimationPresets::mPresetsMap;
+
+const CustomAnimationPresets& CustomAnimationPresets::getCustomAnimationPresets()
+{
+ // Support localization per-view. Currently not useful for Desktop
+ // but very much critical for LOK. The cache now is per-language.
+ const OUString aLang = comphelper::LibreOfficeKit::isActive()
+ ? comphelper::LibreOfficeKit::getLanguageTag().getBcp47()
+ : SvtSysLocaleOptions().GetLanguageTag().getBcp47();
+
+ SolarMutexGuard aGuard;
+ const auto it = mPresetsMap.find(aLang);
+ if (it != mPresetsMap.end())
+ return it->second;
+
+ CustomAnimationPresets& rPresets = mPresetsMap[aLang];
+ rPresets.importResources();
+ return rPresets;
+}
+
+Reference< XAnimationNode > CustomAnimationPresets::getRandomPreset( sal_Int16 nPresetClass ) const
+{
+ Reference< XAnimationNode > xNode;
+
+ const PresetCategoryList* pCategoryList = nullptr;
+ switch( nPresetClass )
+ {
+ case EffectPresetClass::ENTRANCE: pCategoryList = &maEntrancePresets; break;
+ case EffectPresetClass::EXIT: pCategoryList = &maExitPresets; break;
+ case EffectPresetClass::EMPHASIS: pCategoryList = &maEmphasisPresets; break;
+ case EffectPresetClass::MOTIONPATH: pCategoryList = &maMotionPathsPresets; break;
+ default:
+ pCategoryList = nullptr;
+ }
+
+ if( pCategoryList && !pCategoryList->empty() )
+ {
+ sal_Int32 nCategory = comphelper::rng::uniform_size_distribution(0, pCategoryList->size()-1);
+
+ PresetCategoryPtr pCategory = (*pCategoryList)[nCategory];
+ if( pCategory && !pCategory->maEffects.empty() )
+ {
+ sal_Int32 nDescriptor = comphelper::rng::uniform_size_distribution(0, pCategory->maEffects.size()-1);
+ CustomAnimationPresetPtr pPreset = pCategory->maEffects[nDescriptor];
+ if( pPreset )
+ {
+ std::vector<OUString> aSubTypes = pPreset->getSubTypes();
+
+ OUString aSubType;
+ if( !aSubTypes.empty() )
+ {
+ size_t nSubType = comphelper::rng::uniform_size_distribution(0, aSubTypes.size()-1);
+ aSubType = aSubTypes[nSubType];
+ }
+ xNode = pPreset->create( aSubType );
+ }
+ }
+ }
+
+ return xNode;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/EffectMigration.cxx b/sd/source/core/EffectMigration.cxx
new file mode 100644
index 000000000..8dd9d0905
--- /dev/null
+++ b/sd/source/core/EffectMigration.cxx
@@ -0,0 +1,1439 @@
+/* -*- 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 <com/sun/star/presentation/EffectNodeType.hpp>
+#include <com/sun/star/presentation/ShapeAnimationSubType.hpp>
+#include <com/sun/star/presentation/TextAnimationType.hpp>
+#include <com/sun/star/presentation/ParagraphTarget.hpp>
+#include <comphelper/processfactory.hxx>
+#include <com/sun/star/animations/AnimationFill.hpp>
+#include <com/sun/star/animations/XAnimate.hpp>
+#include <com/sun/star/beans/NamedValue.hpp>
+#include <o3tl/string_view.hxx>
+#include <tools/debug.hxx>
+#include <svx/unoshape.hxx>
+#include <svx/svdotext.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/svdogrp.hxx>
+#include <svx/svditer.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <CustomAnimationPreset.hxx>
+#include <TransitionPreset.hxx>
+#include <EffectMigration.hxx>
+#include <anminfo.hxx>
+
+using namespace ::sd;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::animations;
+using namespace ::com::sun::star::presentation;
+using ::com::sun::star::drawing::XShape;
+using ::com::sun::star::lang::XMultiServiceFactory;
+using ::com::sun::star::drawing::XShape;
+using ::com::sun::star::beans::NamedValue;
+
+namespace {
+
+struct deprecated_FadeEffect_conversion_table_entry
+{
+ FadeEffect meFadeEffect;
+ const char* mpPresetId;
+};
+
+}
+
+deprecated_FadeEffect_conversion_table_entry const deprecated_FadeEffect_conversion_table[] =
+{
+// OOo 1.x transitions
+ { FadeEffect_FADE_FROM_LEFT, "wipe-right" },
+ { FadeEffect_FADE_FROM_TOP, "wipe-down" },
+ { FadeEffect_FADE_FROM_RIGHT, "wipe-left" },
+ { FadeEffect_FADE_FROM_BOTTOM, "wipe-up" },
+
+ { FadeEffect_CLOCKWISE, "wheel-clockwise-1-spoke" },
+
+ { FadeEffect_UNCOVER_TO_LEFT, "uncover-left" },
+ { FadeEffect_UNCOVER_TO_UPPERLEFT, "uncover-left-up" },
+ { FadeEffect_UNCOVER_TO_TOP, "uncover-up" },
+ { FadeEffect_UNCOVER_TO_UPPERRIGHT, "uncover-right-up" },
+ { FadeEffect_UNCOVER_TO_RIGHT, "uncover-right" },
+ { FadeEffect_UNCOVER_TO_LOWERRIGHT, "uncover-right-down" },
+ { FadeEffect_UNCOVER_TO_BOTTOM, "uncover-down" },
+ { FadeEffect_UNCOVER_TO_LOWERLEFT, "uncover-left-down" },
+
+ { FadeEffect_VERTICAL_LINES, "random-bars-vertical" },
+ { FadeEffect_HORIZONTAL_LINES, "random-bars-horizontal" },
+
+ { FadeEffect_VERTICAL_CHECKERBOARD, "checkerboard-down" },
+ { FadeEffect_HORIZONTAL_CHECKERBOARD, "checkerboard-across" },
+
+ { FadeEffect_FADE_TO_CENTER, "box-in" },
+ { FadeEffect_FADE_FROM_CENTER, "box-out" },
+
+ { FadeEffect_VERTICAL_STRIPES, "venetian-blinds-vertical" },
+ { FadeEffect_HORIZONTAL_STRIPES, "venetian-blinds-horizontal" },
+
+ { FadeEffect_MOVE_FROM_LEFT, "cover-right" },
+ { FadeEffect_MOVE_FROM_TOP, "cover-down" },
+ { FadeEffect_MOVE_FROM_RIGHT, "cover-left" },
+ { FadeEffect_MOVE_FROM_BOTTOM, "cover-up" },
+ { FadeEffect_MOVE_FROM_UPPERLEFT, "cover-right-down" },
+ { FadeEffect_MOVE_FROM_UPPERRIGHT, "cover-left-down" },
+ { FadeEffect_MOVE_FROM_LOWERRIGHT, "cover-left-up" },
+ { FadeEffect_MOVE_FROM_LOWERLEFT, "cover-right-up" },
+
+ { FadeEffect_DISSOLVE, "dissolve" },
+
+ { FadeEffect_RANDOM, "random-transition" },
+
+ { FadeEffect_ROLL_FROM_LEFT, "push-right" },
+ { FadeEffect_ROLL_FROM_TOP, "push-down" },
+ { FadeEffect_ROLL_FROM_RIGHT, "push-left" },
+ { FadeEffect_ROLL_FROM_BOTTOM, "push-up" },
+
+ { FadeEffect_CLOSE_VERTICAL, "split-horizontal-in" },
+ { FadeEffect_CLOSE_HORIZONTAL, "split-vertical-in" },
+ { FadeEffect_OPEN_VERTICAL, "split-horizontal-out" },
+ { FadeEffect_OPEN_HORIZONTAL, "split-vertical-out" },
+
+ { FadeEffect_FADE_FROM_UPPERLEFT, "diagonal-squares-right-down" },
+ { FadeEffect_FADE_FROM_UPPERRIGHT, "diagonal-squares-left-down" },
+ { FadeEffect_FADE_FROM_LOWERLEFT, "diagonal-squares-right-up" },
+ { FadeEffect_FADE_FROM_LOWERRIGHT, "diagonal-squares-left-up" },
+
+// OOo 1.x transitions not in OOo 2.x
+ { FadeEffect_CLOCKWISE, "clock-wipe-twelve" },
+ { FadeEffect_COUNTERCLOCKWISE, "reverse-clock-wipe-twelve" },
+ { FadeEffect_SPIRALIN_LEFT, "spiral-wipe-top-left-clockwise" },
+ { FadeEffect_SPIRALIN_RIGHT, "spiral-wipe-top-right-counter-clockwise" },
+ { FadeEffect_SPIRALOUT_LEFT, "spiral-wipe-out-to-bottom-right-clockwise" },
+ { FadeEffect_SPIRALOUT_RIGHT, "spiral-wipe-out-to-bottom-left-counter-clockwise" },
+ { FadeEffect_WAVYLINE_FROM_LEFT, "snake-wipe-top-left-vertical" },
+ { FadeEffect_WAVYLINE_FROM_TOP, "snake-wipe-top-left-horizontal" },
+ { FadeEffect_WAVYLINE_FROM_RIGHT, "snake-wipe-bottom-right-vertical" },
+ { FadeEffect_WAVYLINE_FROM_BOTTOM, "snake-wipe-bottom-right-horizontal" },
+ { FadeEffect_STRETCH_FROM_LEFT, "wipe-right" }, // todo
+ { FadeEffect_STRETCH_FROM_TOP, "wipe-down" }, // todo
+ { FadeEffect_STRETCH_FROM_RIGHT, "wipe-left" }, // todo
+ { FadeEffect_STRETCH_FROM_BOTTOM, "wipe-up" }, // todo
+
+// OOo 1.x not available transitions
+
+ { FadeEffect_CLOCKWISE, "wheel-clockwise-2-spokes" },
+ { FadeEffect_CLOCKWISE, "wheel-clockwise-3-spokes" },
+ { FadeEffect_CLOCKWISE, "wheel-clockwise-4-spokes" },
+ { FadeEffect_CLOCKWISE, "wheel-clockwise-8-spokes" },
+
+ { FadeEffect_FADE_FROM_CENTER, "shape-circle" },
+ { FadeEffect_FADE_FROM_CENTER, "shape-diamond" },
+ { FadeEffect_FADE_FROM_CENTER, "shape-plus" },
+
+ { FadeEffect_CLOCKWISE, "wedge" },
+
+ { FadeEffect_DISSOLVE, "fade-through-black" },
+
+ { FadeEffect_CLOCKWISE, "zoom-rotate-in" },
+
+ { FadeEffect_HORIZONTAL_LINES, "comb-horizontal" },
+ { FadeEffect_VERTICAL_LINES, "comb-vertical" },
+
+ { FadeEffect_DISSOLVE, "fade-smoothly" },
+
+ { FadeEffect_NONE, nullptr }
+};
+
+/* todo
+cut cut (same as NONE?)
+cut-through-black cut toBlack
+wedge wedge
+*/
+
+void EffectMigration::SetFadeEffect( SdPage* pPage, css::presentation::FadeEffect eNewEffect)
+{
+ deprecated_FadeEffect_conversion_table_entry const * pEntry = deprecated_FadeEffect_conversion_table;
+ while( (pEntry->meFadeEffect != FadeEffect_NONE) && (pEntry->meFadeEffect != eNewEffect) )
+ pEntry++;
+
+ if( pEntry->mpPresetId )
+ {
+ const OUString aPresetId( OUString::createFromAscii( pEntry->mpPresetId ) );
+
+ const TransitionPresetList& rPresetList = TransitionPreset::getTransitionPresetList();
+
+ auto aIt = std::find_if(rPresetList.begin(), rPresetList.end(),
+ [&aPresetId](const TransitionPresetPtr& rxPreset) { return rxPreset->getPresetId() == aPresetId; });
+ if (aIt != rPresetList.end())
+ {
+ pPage->setTransitionType( (*aIt)->getTransition() );
+ pPage->setTransitionSubtype( (*aIt)->getSubtype() );
+ pPage->setTransitionDirection( (*aIt)->getDirection() );
+ pPage->setTransitionFadeColor( (*aIt)->getFadeColor() );
+ }
+ }
+ else
+ {
+ pPage->setTransitionType( 0 );
+ pPage->setTransitionSubtype( 0 );
+ pPage->setTransitionDirection( false );
+ pPage->setTransitionFadeColor( 0 );
+ }
+}
+
+FadeEffect EffectMigration::GetFadeEffect( const SdPage* pPage )
+{
+ const TransitionPresetList & rPresetList = TransitionPreset::getTransitionPresetList();
+ auto aIt = std::find_if(rPresetList.begin(), rPresetList.end(),
+ [&pPage](const TransitionPresetPtr& rxPreset) {
+ return (rxPreset->getTransition() == pPage->getTransitionType())
+ && (rxPreset->getSubtype() == pPage->getTransitionSubtype())
+ && (rxPreset->getDirection() == pPage->getTransitionDirection())
+ && (rxPreset->getFadeColor() == pPage->getTransitionFadeColor());
+ });
+ if (aIt != rPresetList.end())
+ {
+ const OUString& aPresetId = (*aIt)->getPresetId();
+
+ deprecated_FadeEffect_conversion_table_entry const * pEntry = deprecated_FadeEffect_conversion_table;
+ while( (pEntry->meFadeEffect != FadeEffect_NONE) && (!aPresetId.equalsAscii( pEntry->mpPresetId ) ) )
+ pEntry++;
+
+ return pEntry->meFadeEffect;
+ }
+ return FadeEffect_NONE;
+}
+
+namespace {
+
+struct deprecated_AnimationEffect_conversion_table_entry
+{
+ AnimationEffect meEffect;
+ const char* mpPresetId;
+ const char* mpPresetSubType;
+};
+
+}
+
+deprecated_AnimationEffect_conversion_table_entry const deprecated_AnimationEffect_conversion_table[] =
+{
+// OOo 1.x entrance effects
+ { AnimationEffect_APPEAR, "ooo-entrance-appear",nullptr },
+
+ { AnimationEffect_FADE_TO_CENTER, "ooo-entrance-box","in" },
+ { AnimationEffect_FADE_FROM_CENTER, "ooo-entrance-box","out" },
+
+ { AnimationEffect_VERTICAL_CHECKERBOARD, "ooo-entrance-checkerboard","downward" },
+ { AnimationEffect_HORIZONTAL_CHECKERBOARD, "ooo-entrance-checkerboard","across" },
+
+ { AnimationEffect_FADE_FROM_UPPERLEFT, "ooo-entrance-diagonal-squares","right-to-bottom" },
+ { AnimationEffect_FADE_FROM_UPPERRIGHT, "ooo-entrance-diagonal-squares","left-to-bottom" },
+ { AnimationEffect_FADE_FROM_LOWERLEFT, "ooo-entrance-diagonal-squares","right-to-top" },
+ { AnimationEffect_FADE_FROM_LOWERRIGHT, "ooo-entrance-diagonal-squares","left-to-top" },
+
+ { AnimationEffect_DISSOLVE, "ooo-entrance-dissolve-in",nullptr },
+
+ { AnimationEffect_MOVE_FROM_LEFT, "ooo-entrance-fly-in","from-left" },
+ { AnimationEffect_MOVE_FROM_TOP, "ooo-entrance-fly-in","from-top" },
+ { AnimationEffect_MOVE_FROM_RIGHT, "ooo-entrance-fly-in","from-right" },
+ { AnimationEffect_MOVE_FROM_BOTTOM, "ooo-entrance-fly-in","from-bottom" },
+ { AnimationEffect_MOVE_FROM_UPPERLEFT, "ooo-entrance-fly-in","from-top-left" },
+ { AnimationEffect_MOVE_FROM_UPPERRIGHT, "ooo-entrance-fly-in","from-top-right" },
+ { AnimationEffect_MOVE_FROM_LOWERRIGHT, "ooo-entrance-fly-in","from-bottom-right" },
+ { AnimationEffect_MOVE_FROM_LOWERLEFT, "ooo-entrance-fly-in","from-bottom-left" },
+
+ { AnimationEffect_MOVE_FROM_BOTTOM, "ooo-entrance-fly-in-slow", "from-bottom" },
+ { AnimationEffect_MOVE_FROM_LEFT, "ooo-entrance-fly-in-slow", "from-left" },
+ { AnimationEffect_MOVE_FROM_RIGHT, "ooo-entrance-fly-in-slow", "from-right" },
+ { AnimationEffect_MOVE_FROM_TOP, "ooo-entrance-fly-in-slow", "from-top" },
+
+ { AnimationEffect_MOVE_SHORT_FROM_LEFT, "ooo-entrance-peek-in","from-left" },
+ { AnimationEffect_MOVE_SHORT_FROM_TOP, "ooo-entrance-peek-in","from-top" },
+ { AnimationEffect_MOVE_SHORT_FROM_RIGHT, "ooo-entrance-peek-in","from-right" },
+ { AnimationEffect_MOVE_SHORT_FROM_BOTTOM, "ooo-entrance-peek-in","from-bottom" },
+
+ { AnimationEffect_VERTICAL_LINES, "ooo-entrance-random-bars","horizontal" },
+ { AnimationEffect_HORIZONTAL_LINES, "ooo-entrance-random-bars","vertical" },
+
+ { AnimationEffect_RANDOM, "ooo-entrance-random",nullptr },
+
+ { AnimationEffect_CLOSE_VERTICAL, "ooo-entrance-split","horizontal-in" },
+ { AnimationEffect_CLOSE_HORIZONTAL, "ooo-entrance-split","vertical-in" },
+ { AnimationEffect_OPEN_VERTICAL, "ooo-entrance-split","horizontal-out" },
+ { AnimationEffect_OPEN_HORIZONTAL, "ooo-entrance-split","vertical-out" },
+
+ { AnimationEffect_VERTICAL_STRIPES, "ooo-entrance-venetian-blinds","horizontal" },
+ { AnimationEffect_HORIZONTAL_STRIPES, "ooo-entrance-venetian-blinds","vertical" },
+
+ { AnimationEffect_FADE_FROM_LEFT, "ooo-entrance-wipe","from-left" },
+ { AnimationEffect_FADE_FROM_TOP, "ooo-entrance-wipe","from-bottom" },
+ { AnimationEffect_FADE_FROM_RIGHT, "ooo-entrance-wipe","from-right" },
+ { AnimationEffect_FADE_FROM_BOTTOM, "ooo-entrance-wipe","from-top" },
+
+ { AnimationEffect_HORIZONTAL_ROTATE, "ooo-entrance-swivel","vertical" },
+ { AnimationEffect_VERTICAL_ROTATE, "ooo-entrance-swivel","horizontal" },
+
+ { AnimationEffect_STRETCH_FROM_LEFT, "ooo-entrance-stretchy","from-left" },
+ { AnimationEffect_STRETCH_FROM_UPPERLEFT, "ooo-entrance-stretchy","from-top-left" },
+ { AnimationEffect_STRETCH_FROM_TOP, "ooo-entrance-stretchy","from-top" },
+ { AnimationEffect_STRETCH_FROM_UPPERRIGHT, "ooo-entrance-stretchy","from-top-right" },
+ { AnimationEffect_STRETCH_FROM_RIGHT, "ooo-entrance-stretchy","from-right" },
+ { AnimationEffect_STRETCH_FROM_LOWERRIGHT, "ooo-entrance-stretchy","from-bottom-right" },
+ { AnimationEffect_STRETCH_FROM_BOTTOM, "ooo-entrance-stretchy","from-bottom" },
+ { AnimationEffect_STRETCH_FROM_LOWERLEFT, "ooo-entrance-stretchy","from-bottom-left" },
+
+ { AnimationEffect_HORIZONTAL_STRETCH, "ooo-entrance-expand", nullptr },
+
+ { AnimationEffect_CLOCKWISE, "ooo-entrance-wheel","1" },
+ { AnimationEffect_COUNTERCLOCKWISE, "ooo-entrance-clock-wipe","counter-clockwise" },
+
+ { AnimationEffect_SPIRALIN_LEFT, "ooo-entrance-spiral-wipe", "from-top-left-clockwise" },
+ { AnimationEffect_SPIRALIN_RIGHT, "ooo-entrance-spiral-wipe", "from-top-right-counter-clockwise" },
+ { AnimationEffect_SPIRALOUT_LEFT, "ooo-entrance-spiral-wipe", "from-center-clockwise" },
+ { AnimationEffect_SPIRALOUT_RIGHT, "ooo-entrance-spiral-wipe", "from-center-counter-clockwise" },
+
+ { AnimationEffect_WAVYLINE_FROM_LEFT, "ooo-entrance-snake-wipe","from-top-left-vertical" },
+ { AnimationEffect_WAVYLINE_FROM_TOP, "ooo-entrance-snake-wipe","from-top-left-horizontal" },
+ { AnimationEffect_WAVYLINE_FROM_RIGHT, "ooo-entrance-snake-wipe","from-bottom-right-vertical" },
+ { AnimationEffect_WAVYLINE_FROM_BOTTOM, "ooo-entrance-snake-wipe","from-bottom-right-horizontal" },
+
+// ooo 1.x exit effects
+ { AnimationEffect_HIDE, "ooo-exit-disappear",nullptr },
+ { AnimationEffect_MOVE_TO_LEFT, "ooo-exit-fly-out", "from-right" },
+ { AnimationEffect_MOVE_TO_TOP, "ooo-exit-fly-out", "from-bottom" },
+ { AnimationEffect_MOVE_TO_RIGHT, "ooo-exit-fly-out", "from-left" },
+ { AnimationEffect_MOVE_TO_BOTTOM, "ooo-exit-fly-out", "from-top" },
+ { AnimationEffect_MOVE_TO_UPPERLEFT, "ooo-exit-fly-out", "from-top-right" },
+ { AnimationEffect_MOVE_TO_UPPERRIGHT, "ooo-exit-fly-out", "from-top-left" },
+ { AnimationEffect_MOVE_TO_LOWERRIGHT, "ooo-exit-fly-out", "from-bottom-left" },
+ { AnimationEffect_MOVE_TO_LOWERLEFT, "ooo-exit-fly-out", "from-bottom-right" },
+ { AnimationEffect_MOVE_SHORT_TO_LEFT, "ooo-exit-peek-out", "from-right" },
+ { AnimationEffect_MOVE_SHORT_TO_UPPERLEFT, "ooo-exit-peek-out", "from-right" },
+ { AnimationEffect_MOVE_SHORT_TO_TOP, "ooo-exit-peek-out", "from-bottom" },
+ { AnimationEffect_MOVE_SHORT_TO_UPPERRIGHT, "ooo-exit-peek-out", "from-bottom" },
+ { AnimationEffect_MOVE_SHORT_TO_RIGHT, "ooo-exit-peek-out", "from-left" },
+ { AnimationEffect_MOVE_SHORT_TO_LOWERRIGHT, "ooo-exit-peek-out","from-left" },
+ { AnimationEffect_MOVE_SHORT_TO_BOTTOM, "ooo-exit-peek-out", "from-top" },
+ { AnimationEffect_MOVE_SHORT_TO_LOWERLEFT, "ooo-exit-peek-out", "from-top" },
+
+// no matching in OOo 2.x
+ { AnimationEffect_MOVE_SHORT_FROM_UPPERLEFT, "ooo-entrance-peek-in","from-left" },
+ { AnimationEffect_MOVE_SHORT_FROM_UPPERRIGHT, "ooo-entrance-peek-in","from-top" },
+ { AnimationEffect_MOVE_SHORT_FROM_LOWERRIGHT, "ooo-entrance-peek-in","from-right" },
+ { AnimationEffect_MOVE_SHORT_FROM_LOWERLEFT, "ooo-entrance-peek-in","from-bottom" },
+ { AnimationEffect_LASER_FROM_LEFT, "ooo-entrance-fly-in","from-left" },
+ { AnimationEffect_LASER_FROM_TOP, "ooo-entrance-fly-in","from-top" },
+ { AnimationEffect_LASER_FROM_RIGHT, "ooo-entrance-fly-in","from-right" },
+ { AnimationEffect_LASER_FROM_BOTTOM, "ooo-entrance-fly-in","from-bottom" },
+ { AnimationEffect_LASER_FROM_UPPERLEFT, "ooo-entrance-fly-in","from-top-left" },
+ { AnimationEffect_LASER_FROM_UPPERRIGHT, "ooo-entrance-fly-in","from-top-right" },
+ { AnimationEffect_LASER_FROM_LOWERLEFT, "ooo-entrance-fly-in","from-bottom-left" },
+ { AnimationEffect_LASER_FROM_LOWERRIGHT, "ooo-entrance-fly-in","from-bottom-right" },
+
+// no matching in OOo 1.x
+
+ { AnimationEffect_FADE_TO_CENTER, "ooo-entrance-circle", "in" },
+ { AnimationEffect_FADE_FROM_CENTER, "ooo-entrance-circle", "out" },
+ { AnimationEffect_FADE_TO_CENTER, "ooo-entrance-diamond", "in" },
+ { AnimationEffect_FADE_FROM_CENTER, "ooo-entrance-diamond", "out" },
+ { AnimationEffect_FADE_TO_CENTER, "ooo-entrance-plus", "in" },
+ { AnimationEffect_FADE_FROM_CENTER, "ooo-entrance-plus", "out" },
+ { AnimationEffect_CLOCKWISE, "ooo-entrance-wedge", nullptr },
+ { AnimationEffect_CLOCKWISE, "ooo-entrance-wheel", "2" },
+ { AnimationEffect_CLOCKWISE, "ooo-entrance-wheel", "3" },
+ { AnimationEffect_CLOCKWISE, "ooo-entrance-wheel", "4" },
+ { AnimationEffect_CLOCKWISE, "ooo-entrance-wheel", "8" },
+
+ { AnimationEffect_MOVE_FROM_RIGHT, "ooo-entrance-boomerang", nullptr },
+ { AnimationEffect_MOVE_FROM_UPPERRIGHT, "ooo-entrance-bounce", nullptr },
+ { AnimationEffect_MOVE_FROM_BOTTOM, "ooo-entrance-curve-up", nullptr },
+ { AnimationEffect_MOVE_FROM_TOP, "ooo-entrance-float", nullptr },
+ { AnimationEffect_MOVE_FROM_LEFT, "ooo-entrance-glide", nullptr },
+ { AnimationEffect_MOVE_FROM_BOTTOM, "ooo-entrance-magnify", nullptr },
+ { AnimationEffect_HORIZONTAL_ROTATE, "ooo-entrance-pinwheel", nullptr },
+ { AnimationEffect_MOVE_FROM_LEFT, "ooo-entrance-breaks", nullptr },
+ { AnimationEffect_MOVE_FROM_LEFT, "ooo-entrance-sling", nullptr },
+ { AnimationEffect_MOVE_FROM_LEFT, "ooo-entrance-spiral-in", nullptr },
+ { AnimationEffect_MOVE_FROM_LEFT, "ooo-entrance-thread", nullptr },
+ { AnimationEffect_MOVE_FROM_BOTTOM, "ooo-entrance-ascend", nullptr },
+ { AnimationEffect_MOVE_FROM_BOTTOM, "ooo-entrance-center-revolve", nullptr },
+ { AnimationEffect_APPEAR, "ooo-entrance-compress", nullptr },
+ { AnimationEffect_MOVE_SHORT_FROM_TOP, "ooo-entrance-descend", nullptr },
+ { AnimationEffect_MOVE_SHORT_FROM_LEFT, "ooo-entrance-ease-in", nullptr },
+ { AnimationEffect_MOVE_FROM_BOTTOM, "ooo-entrance-rise-up", nullptr },
+ { AnimationEffect_HORIZONTAL_ROTATE, "ooo-entrance-spin-in", nullptr },
+ { AnimationEffect_STRETCH_FROM_LEFT, "ooo-entrance-stretchy", "across" },
+ { AnimationEffect_STRETCH_FROM_TOP, "ooo-entrance-stretchy", "downward" },
+
+ { AnimationEffect_FADE_FROM_CENTER, "ooo-entrance-zoom","in" },
+ { AnimationEffect_FADE_FROM_CENTER, "ooo-entrance-zoom","in-slightly" },
+ { AnimationEffect_FADE_FROM_CENTER, "ooo-entrance-zoom","in-from-screen-center" },
+ { AnimationEffect_FADE_TO_CENTER, "ooo-entrance-zoom","out" },
+ { AnimationEffect_FADE_TO_CENTER, "ooo-entrance-zoom","out-slightly" },
+ { AnimationEffect_FADE_TO_CENTER, "ooo-entrance-zoom","out-from-screen-center" },
+
+ { AnimationEffect_DISSOLVE, "ooo-entrance-fade-in", nullptr },
+ { AnimationEffect_DISSOLVE, "ooo-entrance-fade-in-and-zoom", nullptr },
+ { AnimationEffect_DISSOLVE, "ooo-entrance-fade-in-and-swivel", nullptr },
+
+ // still open (no matching effect: AnimationEffect_ZOOM_IN_FROM_*,
+ // AnimationEffect_ZOOM_OUT_FROM_*, AnimationEffect_PATH
+
+ { AnimationEffect_NONE, nullptr, nullptr }
+};
+
+static EffectSequence::iterator ImplFindEffect( MainSequencePtr const & pMainSequence, const Reference< XShape >& rShape, sal_Int16 nSubItem )
+{
+ return std::find_if(pMainSequence->getBegin(), pMainSequence->getEnd(),
+ [&rShape, &nSubItem](const CustomAnimationEffectPtr& pEffect) {
+ return (pEffect->getTargetShape() == rShape)
+ && (pEffect->getTargetSubItem() == nSubItem);
+ });
+}
+
+static bool implIsInsideGroup( SdrObject const * pObj )
+{
+ // TTTT for current state of transition, SdrObject has a parent*
+ // to a SdrObjList. That may be a SdrPage or a SdrObjGroup, both
+ // are already derived from SdrObjList. To finally check, use
+ // the method 'getSdrObjectFromSdrObjList' - if it's not a SdrPage,
+ // it will return SdrObjGroup or E3dScene -> SdrObject.
+ // For future states, test for SdrObject. Trying to get the SdrPage
+ // will in the future depend on the Object(this) to be inserted to a
+ // SdrPage, regardless of e.g. being a group member.
+ if(nullptr == pObj)
+ {
+ return false;
+ }
+
+ SdrObjList* pSdrObjList(pObj->getParentSdrObjListFromSdrObject());
+
+ if(nullptr == pSdrObjList)
+ {
+ return false;
+ }
+
+ return (nullptr != pSdrObjList->getSdrObjectFromSdrObjList());
+}
+
+void EffectMigration::SetAnimationEffect( SvxShape* pShape, AnimationEffect eEffect )
+{
+ DBG_ASSERT( pShape && pShape->GetSdrObject() && pShape->GetSdrObject()->getSdrPageFromSdrObject(),
+ "sd::EffectMigration::SetAnimationEffect(), invalid argument!" );
+ if( !pShape || !pShape->GetSdrObject() || !pShape->GetSdrObject()->getSdrPageFromSdrObject() )
+ return;
+
+ SdrObject* pObj = pShape->GetSdrObject();
+ if( implIsInsideGroup( pObj ) )
+ return;
+
+ OUString aPresetId;
+ OUString aPresetSubType;
+
+ if( !ConvertAnimationEffect( eEffect, aPresetId, aPresetSubType ) )
+ {
+ OSL_FAIL( "sd::EffectMigration::SetAnimationEffect(), no mapping for given AnimationEffect value" );
+ return;
+ }
+
+ const CustomAnimationPresets& rPresets = CustomAnimationPresets::getCustomAnimationPresets();
+
+ CustomAnimationPresetPtr pPreset( rPresets.getEffectDescriptor( aPresetId ) );
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ if( !(pPreset && pMainSequence) )
+ return;
+
+ const Reference< XShape > xShape( pShape );
+
+ EffectSequence::iterator aIterOnlyBackground( ImplFindEffect( pMainSequence, xShape, ShapeAnimationSubType::ONLY_BACKGROUND ) );
+ EffectSequence::iterator aIterAsWhole( ImplFindEffect( pMainSequence, xShape, ShapeAnimationSubType::AS_WHOLE ) );
+ const EffectSequence::iterator aEnd( pMainSequence->getEnd() );
+
+ if( (aIterOnlyBackground == aEnd) && (aIterAsWhole == aEnd) )
+ {
+ bool bEffectCreated = false;
+
+ // check if there is already a text effect for this shape
+ EffectSequence::iterator aIterOnlyText( ImplFindEffect( pMainSequence, xShape, ShapeAnimationSubType::ONLY_TEXT ) );
+ if( aIterOnlyText != aEnd )
+ {
+ // check if this is an animation text group
+ sal_Int32 nGroupId = (*aIterOnlyText)->getGroupId();
+ if( nGroupId >= 0 )
+ {
+ CustomAnimationTextGroupPtr pGroup = pMainSequence->findGroup( nGroupId );
+ if( pGroup )
+ {
+ // add an effect to animate the shape
+ pMainSequence->setAnimateForm( pGroup, true );
+
+ // find this effect
+ EffectSequence::iterator aIter( ImplFindEffect( pMainSequence, xShape, ShapeAnimationSubType::ONLY_BACKGROUND ) );
+
+ if( aIter != aEnd )
+ {
+ if( ((*aIter)->getPresetId() != aPresetId) ||
+ ((*aIter)->getPresetSubType() != aPresetSubType) )
+ {
+ (*aIter)->replaceNode( pPreset->create( aPresetSubType ) );
+ pMainSequence->rebuild();
+ bEffectCreated = true;
+ }
+ }
+ }
+ }
+ }
+
+ if( !bEffectCreated )
+ {
+ // if there is not yet an effect that target this shape, we generate one
+ // we insert the shape effect before it
+ Reference< XAnimationNode > xNode( pPreset->create( aPresetSubType ) );
+ DBG_ASSERT( xNode.is(), "EffectMigration::SetAnimationEffect(), could not create preset!" );
+ if( xNode.is() )
+ {
+ CustomAnimationEffectPtr pEffect = std::make_shared<CustomAnimationEffect>( xNode );
+ pEffect->setTarget( Any( xShape ) );
+ SdPage* pPage = dynamic_cast< SdPage* >( pObj->getSdrPageFromSdrObject() );
+ const bool bManual = (pPage == nullptr) || (pPage->GetPresChange() == PresChange::Manual);
+ if( !bManual )
+ pEffect->setNodeType( EffectNodeType::AFTER_PREVIOUS );
+
+ pMainSequence->append( pEffect );
+
+ if( ( pObj->GetObjInventor() == SdrInventor::Default ) && ( pObj->GetObjIdentifier() == SdrObjKind::OutlineText ) )
+ {
+ // special case for outline text, effects are always mapped to text group effect
+ pMainSequence->
+ createTextGroup( pEffect, 10, bManual ? -1 : 0.0, false, false );
+ }
+ }
+ }
+ }
+ else
+ {
+ // if there is already an effect targeting this shape
+ // just replace it
+ CustomAnimationEffectPtr pEffect;
+ if( aIterAsWhole != aEnd )
+ {
+ pEffect = *aIterAsWhole;
+ }
+ else
+ {
+ pEffect = *aIterOnlyBackground;
+ }
+
+ if( pEffect )
+ {
+ if( (pEffect->getPresetId() != aPresetId) ||
+ (pEffect->getPresetSubType() != aPresetSubType) )
+ {
+ pMainSequence->replace( pEffect, pPreset, aPresetSubType, -1.0 );
+ }
+ }
+ }
+}
+
+AnimationEffect EffectMigration::GetAnimationEffect( SvxShape* pShape )
+{
+ OUString aPresetId;
+ OUString aPresetSubType;
+
+ SdrObject* pObj = pShape->GetSdrObject();
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ if( pMainSequence )
+ {
+ const Reference< XShape > xShape( pShape );
+
+ EffectSequence::iterator aIter = std::find_if(pMainSequence->getBegin(), pMainSequence->getEnd(),
+ [&xShape](const CustomAnimationEffectPtr& pEffect) {
+ return (pEffect->getTargetShape() == xShape)
+ && ((pEffect->getTargetSubItem() == ShapeAnimationSubType::ONLY_BACKGROUND)
+ || (pEffect->getTargetSubItem() == ShapeAnimationSubType::AS_WHOLE))
+ && (pEffect->getDuration() != 0.1); // ignore appear effects created from old text effect import
+ });
+
+ if (aIter != pMainSequence->getEnd())
+ {
+ aPresetId = (*aIter)->getPresetId();
+ aPresetSubType = (*aIter)->getPresetSubType();
+ }
+ }
+
+ // now find old effect
+ AnimationEffect eEffect = AnimationEffect_NONE;
+
+ if( !ConvertPreset( aPresetId, &aPresetSubType, eEffect ) )
+ ConvertPreset( aPresetId, nullptr, eEffect );
+
+ return eEffect;
+}
+
+void EffectMigration::SetTextAnimationEffect( SvxShape* pShape, AnimationEffect eEffect )
+{
+ DBG_ASSERT( pShape && pShape->GetSdrObject() && pShape->GetSdrObject()->getSdrPageFromSdrObject(),
+ "sd::EffectMigration::SetAnimationEffect(), invalid argument!" );
+ if( !pShape || !pShape->GetSdrObject() || !pShape->GetSdrObject()->getSdrPageFromSdrObject() )
+ return;
+
+ SdrObject* pObj = pShape->GetSdrObject();
+ if( implIsInsideGroup( pObj ) )
+ return;
+
+ // first map the deprecated AnimationEffect to a preset and subtype
+ OUString aPresetId;
+ OUString aPresetSubType;
+
+ if( !ConvertAnimationEffect( eEffect, aPresetId, aPresetSubType ) )
+ {
+ OSL_FAIL( "sd::EffectMigration::SetAnimationEffect(), no mapping for given AnimationEffect value" );
+ return;
+ }
+
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
+
+ // ignore old text effects on shape without text
+ if( (pTextObj == nullptr) || (!pTextObj->HasText()) )
+ return;
+
+ const CustomAnimationPresets& rPresets = CustomAnimationPresets::getCustomAnimationPresets();
+
+ // create an effect from this preset
+ CustomAnimationPresetPtr pPreset( rPresets.getEffectDescriptor( aPresetId ) );
+
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ if( !(pPreset && pMainSequence) )
+ return;
+
+ const Reference< XShape > xShape( pShape );
+
+ EffectSequence::iterator aIterOnlyText( ImplFindEffect( pMainSequence, xShape, ShapeAnimationSubType::ONLY_TEXT ) );
+ const EffectSequence::iterator aEnd( pMainSequence->getEnd() );
+
+ CustomAnimationTextGroupPtr pGroup;
+
+ // is there already an animation text group for this shape?
+ if( aIterOnlyText != aEnd )
+ {
+ const sal_Int32 nGroupId = (*aIterOnlyText)->getGroupId();
+ if( nGroupId >= 0 )
+ pGroup = pMainSequence->findGroup( nGroupId );
+ }
+
+ // if there is not yet a group, create it
+ if( !pGroup )
+ {
+ CustomAnimationEffectPtr pShapeEffect;
+
+ EffectSequence::iterator aIterOnlyBackground( ImplFindEffect( pMainSequence, xShape, ShapeAnimationSubType::ONLY_BACKGROUND ) );
+ if( aIterOnlyBackground != aEnd )
+ {
+ pShapeEffect = *aIterOnlyBackground;
+ }
+ else
+ {
+ EffectSequence::iterator aIterAsWhole( ImplFindEffect( pMainSequence, xShape, ShapeAnimationSubType::AS_WHOLE ) );
+ if( aIterAsWhole != aEnd )
+ {
+ pShapeEffect = *aIterAsWhole;
+ }
+ else
+ {
+ Reference< XAnimationNode > xNode( pPreset->create( "" ) );
+ DBG_ASSERT( xNode.is(), "EffectMigration::SetTextAnimationEffect(), could not create preset!" );
+ if( xNode.is() )
+ {
+ pShapeEffect = std::make_shared<CustomAnimationEffect>( xNode );
+ pShapeEffect->setTarget( Any( xShape ) );
+ pShapeEffect->setDuration( 0.1 );
+ pMainSequence->append( pShapeEffect );
+
+ SdPage* pPage = dynamic_cast< SdPage* >( pObj->getSdrPageFromSdrObject() );
+ if( pPage && pPage->GetPresChange() != PresChange::Manual )
+ pShapeEffect->setNodeType( EffectNodeType::AFTER_PREVIOUS );
+ }
+ }
+ }
+
+ if( pShapeEffect )
+ {
+ SdPage* pPage = dynamic_cast< SdPage* >( pObj->getSdrPageFromSdrObject() );
+ const bool bManual = (pPage == nullptr) || (pPage->GetPresChange() == PresChange::Manual);
+
+ // now create effects for each paragraph
+ pGroup =
+ pMainSequence->
+ createTextGroup( pShapeEffect, 10, bManual ? -1 : 0.0, true, false );
+ }
+ }
+
+ if( pGroup )
+ {
+ const bool bLaserEffect = (eEffect >= AnimationEffect_LASER_FROM_LEFT) && (eEffect <= AnimationEffect_LASER_FROM_LOWERRIGHT);
+
+ // now we have a group, so check if all effects are same as we like to have them
+ const EffectSequence& rEffects = pGroup->getEffects();
+
+ for( auto& rxEffect : rEffects )
+ {
+ // only work on paragraph targets
+ if( rxEffect->getTarget().getValueType() == ::cppu::UnoType<ParagraphTarget>::get() )
+ {
+ if( (rxEffect->getPresetId() != aPresetId) ||
+ (rxEffect->getPresetSubType() != aPresetSubType) )
+ {
+ rxEffect->replaceNode( pPreset->create( aPresetSubType ) );
+ }
+
+ if( bLaserEffect )
+ {
+ rxEffect->setIterateType( TextAnimationType::BY_LETTER );
+ rxEffect->setIterateInterval( 0.5 );// TODO:
+ // Determine
+ // interval
+ // according
+ // to
+ // total
+ // effect
+ // duration
+ }
+ }
+ }
+ }
+ pMainSequence->rebuild();
+}
+
+AnimationEffect EffectMigration::GetTextAnimationEffect( SvxShape* pShape )
+{
+ OUString aPresetId;
+ OUString aPresetSubType;
+
+ SdrObject* pObj = pShape->GetSdrObject();
+ if( pObj )
+ {
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ if( pMainSequence )
+ {
+ const Reference< XShape > xShape( pShape );
+ EffectSequence::iterator aIter( ImplFindEffect( pMainSequence, xShape, ShapeAnimationSubType::ONLY_TEXT ) );
+ if( aIter != pMainSequence->getEnd() )
+ {
+ aPresetId = (*aIter)->getPresetId();
+ aPresetSubType = (*aIter)->getPresetSubType();
+ }
+ }
+ }
+
+ // now find old effect
+ AnimationEffect eEffect = AnimationEffect_NONE;
+
+ if( !ConvertPreset( aPresetId, &aPresetSubType, eEffect ) )
+ ConvertPreset( aPresetId, nullptr, eEffect );
+
+ return eEffect;
+}
+
+bool EffectMigration::ConvertPreset( std::u16string_view rPresetId, const OUString* pPresetSubType, AnimationEffect& rEffect )
+{
+ rEffect = AnimationEffect_NONE;
+ if( !rPresetId.empty() )
+ {
+ // first try a match for preset id and subtype
+ deprecated_AnimationEffect_conversion_table_entry const * p = deprecated_AnimationEffect_conversion_table;
+ while( p->mpPresetId )
+ {
+ if( o3tl::equalsAscii( rPresetId, p->mpPresetId ) &&
+ (( p->mpPresetSubType == nullptr ) ||
+ ( pPresetSubType == nullptr) ||
+ ( pPresetSubType->equalsAscii( p->mpPresetSubType )) ) )
+ {
+ rEffect = p->meEffect;
+ return true;
+ }
+ p++;
+ }
+ return false;
+ }
+ else
+ {
+ // empty preset id means AnimationEffect_NONE
+ return true;
+ }
+}
+
+bool EffectMigration::ConvertAnimationEffect( const AnimationEffect& rEffect, OUString& rPresetId, OUString& rPresetSubType )
+{
+ deprecated_AnimationEffect_conversion_table_entry const * p = deprecated_AnimationEffect_conversion_table;
+ while( p->mpPresetId )
+ {
+ if( p->meEffect == rEffect )
+ {
+ rPresetId = OUString::createFromAscii( p->mpPresetId );
+ rPresetSubType = OUString::createFromAscii( p->mpPresetSubType );
+ return true;
+ }
+ p++;
+ }
+
+ return false;
+}
+
+double EffectMigration::ConvertAnimationSpeed( AnimationSpeed eSpeed )
+{
+ double fDuration;
+ switch( eSpeed )
+ {
+ case AnimationSpeed_SLOW: fDuration = 2.0; break;
+ case AnimationSpeed_FAST: fDuration = 0.5; break;
+ default:
+ fDuration = 1.0; break;
+ }
+ return fDuration;
+}
+
+void EffectMigration::SetAnimationSpeed( SvxShape* pShape, AnimationSpeed eSpeed )
+{
+ DBG_ASSERT( pShape && pShape->GetSdrObject() && pShape->GetSdrObject()->getSdrPageFromSdrObject(),
+ "sd::EffectMigration::SetAnimationEffect(), invalid argument!" );
+ if( !pShape || !pShape->GetSdrObject() || !pShape->GetSdrObject()->getSdrPageFromSdrObject() )
+ return;
+
+ SdrObject* pObj = pShape->GetSdrObject();
+ if( implIsInsideGroup( pObj ) )
+ return;
+
+ double fDuration = ConvertAnimationSpeed( eSpeed );
+
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ const Reference< XShape > xShape( pShape );
+
+ EffectSequence::iterator aIter;
+ bool bNeedRebuild = false;
+
+ for( aIter = pMainSequence->getBegin(); aIter != pMainSequence->getEnd(); ++aIter )
+ {
+ CustomAnimationEffectPtr pEffect( *aIter );
+ if( pEffect->getTargetShape() == xShape )
+ {
+ if( pEffect->getDuration() != 0.1 )
+ pEffect->setDuration( fDuration );
+ bNeedRebuild = true;
+ }
+ }
+
+ if( bNeedRebuild )
+ pMainSequence->rebuild();
+}
+
+AnimationSpeed EffectMigration::GetAnimationSpeed( SvxShape* pShape )
+{
+ SdrObject* pObj = pShape->GetSdrObject();
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ const Reference< XShape > xShape( pShape );
+
+ double fDuration = 1.0;
+
+ EffectSequence::iterator aIter = std::find_if(pMainSequence->getBegin(), pMainSequence->getEnd(),
+ [&xShape](const CustomAnimationEffectPtr& pEffect) {
+ return (pEffect->getTargetShape() == xShape)
+ && (pEffect->getDuration() != 0.1);
+ });
+ if (aIter != pMainSequence->getEnd())
+ {
+ CustomAnimationEffectPtr pEffect( *aIter );
+ fDuration = pEffect->getDuration();
+ }
+
+ return ConvertDuration( fDuration );
+}
+
+AnimationSpeed EffectMigration::ConvertDuration( double fDuration )
+{
+ AnimationSpeed eSpeed;
+
+ if( fDuration < 1.0 )
+ eSpeed = AnimationSpeed_FAST;
+ else if( fDuration > 1.5 )
+ eSpeed = AnimationSpeed_SLOW;
+ else
+ eSpeed = AnimationSpeed_MEDIUM;
+
+ return eSpeed;
+}
+
+void EffectMigration::SetDimColor( SvxShape* pShape, sal_Int32 nColor )
+{
+ DBG_ASSERT( pShape && pShape->GetSdrObject() && pShape->GetSdrObject()->getSdrPageFromSdrObject(),
+ "sd::EffectMigration::SetAnimationEffect(), invalid argument!" );
+ if( !pShape || !pShape->GetSdrObject() || !pShape->GetSdrObject()->getSdrPageFromSdrObject() )
+ return;
+
+ SdrObject* pObj = pShape->GetSdrObject();
+ if( implIsInsideGroup( pObj ) )
+ return;
+
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ const Reference< XShape > xShape( pShape );
+
+ EffectSequence::iterator aIter;
+ bool bNeedRebuild = false;
+
+ for( aIter = pMainSequence->getBegin(); aIter != pMainSequence->getEnd(); ++aIter )
+ {
+ CustomAnimationEffectPtr pEffect( *aIter );
+ if( pEffect->getTargetShape() == xShape )
+ {
+ pEffect->setHasAfterEffect( true );
+ pEffect->setDimColor( Any( nColor ) );
+ pEffect->setAfterEffectOnNext( true );
+ bNeedRebuild = true;
+ }
+ }
+
+ if( bNeedRebuild )
+ pMainSequence->rebuild();
+}
+
+sal_Int32 EffectMigration::GetDimColor( SvxShape* pShape )
+{
+ sal_Int32 nColor = 0;
+ if( pShape )
+ {
+ SdrObject* pObj = pShape->GetSdrObject();
+ if( pObj && pObj->getSdrPageFromSdrObject() )
+ {
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ const Reference< XShape > xShape( pShape );
+ EffectSequence::iterator aIter = std::find_if(pMainSequence->getBegin(), pMainSequence->getEnd(),
+ [&xShape](const CustomAnimationEffectPtr& pEffect) {
+ return (pEffect->getTargetShape() == xShape)
+ && pEffect->getDimColor().hasValue()
+ && pEffect->hasAfterEffect();
+ });
+ if (aIter != pMainSequence->getEnd())
+ {
+ CustomAnimationEffectPtr pEffect( *aIter );
+ pEffect->getDimColor() >>= nColor;
+ }
+ }
+ }
+
+ return nColor;
+}
+
+void EffectMigration::SetDimHide( SvxShape* pShape, bool bDimHide )
+{
+ DBG_ASSERT( pShape && pShape->GetSdrObject() && pShape->GetSdrObject()->getSdrPageFromSdrObject(),
+ "sd::EffectMigration::SetAnimationEffect(), invalid argument!" );
+ if( !pShape || !pShape->GetSdrObject() || !pShape->GetSdrObject()->getSdrPageFromSdrObject() )
+ return;
+
+ SdrObject* pObj = pShape->GetSdrObject();
+ if( implIsInsideGroup( pObj ) )
+ return;
+
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ const Reference< XShape > xShape( pShape );
+
+ EffectSequence::iterator aIter;
+ bool bNeedRebuild = false;
+
+ for( aIter = pMainSequence->getBegin(); aIter != pMainSequence->getEnd(); ++aIter )
+ {
+ CustomAnimationEffectPtr pEffect( *aIter );
+ if( pEffect->getTargetShape() == xShape )
+ {
+ pEffect->setHasAfterEffect( bDimHide );
+ if( bDimHide ) {
+ Any aEmpty;
+ pEffect->setDimColor( aEmpty );
+ }
+ pEffect->setAfterEffectOnNext( false );
+ bNeedRebuild = true;
+ }
+ }
+
+ if( bNeedRebuild )
+ pMainSequence->rebuild();
+}
+
+bool EffectMigration::GetDimHide( SvxShape* pShape )
+{
+ bool bRet = false;
+ if( pShape )
+ {
+ SdrObject* pObj = pShape->GetSdrObject();
+ if( pObj && pObj->getSdrPageFromSdrObject() )
+ {
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ const Reference< XShape > xShape( pShape );
+
+ EffectSequence::iterator aIter = std::find_if(pMainSequence->getBegin(), pMainSequence->getEnd(),
+ [&xShape](const CustomAnimationEffectPtr& pEffect) { return pEffect->getTargetShape() == xShape; });
+ if (aIter != pMainSequence->getEnd())
+ {
+ CustomAnimationEffectPtr pEffect( *aIter );
+ bRet = pEffect->hasAfterEffect() &&
+ !pEffect->getDimColor().hasValue() &&
+ (!pEffect->IsAfterEffectOnNext());
+ }
+ }
+ }
+
+ return bRet;
+}
+
+void EffectMigration::SetDimPrevious( SvxShape* pShape, bool bDimPrevious )
+{
+ DBG_ASSERT( pShape && pShape->GetSdrObject() && pShape->GetSdrObject()->getSdrPageFromSdrObject(),
+ "sd::EffectMigration::SetAnimationEffect(), invalid argument!" );
+ if( !pShape || !pShape->GetSdrObject() || !pShape->GetSdrObject()->getSdrPageFromSdrObject() )
+ return;
+
+ SdrObject* pObj = pShape->GetSdrObject();
+ if( implIsInsideGroup( pObj ) )
+ return;
+
+ Any aColor;
+
+ if( bDimPrevious )
+ aColor <<= COL_LIGHTGRAY;
+
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ const Reference< XShape > xShape( pShape );
+
+ EffectSequence::iterator aIter;
+ bool bNeedRebuild = false;
+
+ for( aIter = pMainSequence->getBegin(); aIter != pMainSequence->getEnd(); ++aIter )
+ {
+ CustomAnimationEffectPtr pEffect( *aIter );
+ if( pEffect->getTargetShape() == xShape )
+ {
+ pEffect->setHasAfterEffect( bDimPrevious );
+ if( !bDimPrevious || !pEffect->getDimColor().hasValue() )
+ pEffect->setDimColor( aColor );
+ pEffect->setAfterEffectOnNext( true );
+ bNeedRebuild = true;
+ }
+ }
+
+ if( bNeedRebuild )
+ pMainSequence->rebuild();
+}
+
+bool EffectMigration::GetDimPrevious( SvxShape* pShape )
+{
+ bool bRet = false;
+ if( pShape )
+ {
+ SdrObject* pObj = pShape->GetSdrObject();
+ if( pObj && pObj->getSdrPageFromSdrObject() )
+ {
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ const Reference< XShape > xShape( pShape );
+
+ EffectSequence::iterator aIter = std::find_if(pMainSequence->getBegin(), pMainSequence->getEnd(),
+ [&xShape](const CustomAnimationEffectPtr& pEffect) { return pEffect->getTargetShape() == xShape; });
+ if (aIter != pMainSequence->getEnd())
+ {
+ CustomAnimationEffectPtr pEffect( *aIter );
+ bRet = pEffect->hasAfterEffect() &&
+ pEffect->getDimColor().hasValue() &&
+ pEffect->IsAfterEffectOnNext();
+ }
+ }
+ }
+
+ return bRet;
+}
+
+void EffectMigration::SetPresentationOrder( SvxShape* pShape, sal_Int32 nNewPos )
+{
+ if( !pShape || !pShape->GetSdrObject() || !pShape->GetSdrObject()->getSdrPageFromSdrObject() )
+ return;
+
+ SdrObject* pObj = pShape->GetSdrObject();
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ EffectSequence& rSequence = pMainSequence->getSequence();
+ sal_Int32 nPos;
+ sal_Int32 nCurrentPos = -1;
+ std::vector< std::vector< EffectSequence::iterator > > aEffectVector(1);
+
+ if( !rSequence.empty() )
+ {
+ Reference< XShape > xThis( pShape );
+ Reference< XShape > xCurrent;
+
+ EffectSequence::iterator aIter( rSequence.begin() );
+ EffectSequence::iterator aEnd( rSequence.end() );
+ for( nPos = 0; aIter != aEnd; ++aIter )
+ {
+ CustomAnimationEffectPtr pEffect = *aIter;
+
+ if( !xCurrent.is() )
+ {
+ xCurrent = pEffect->getTargetShape();
+ }
+ else if( pEffect->getTargetShape() != xCurrent )
+ {
+ nPos++;
+ xCurrent = pEffect->getTargetShape();
+ aEffectVector.resize( nPos+1 );
+ }
+
+ // is this the first effect for xThis shape?
+ if(( nCurrentPos == -1 ) && ( xCurrent == xThis ) )
+ {
+ nCurrentPos = nPos;
+ }
+
+ aEffectVector[nPos].push_back( aIter );
+ }
+ }
+
+ // check if there is at least one effect for xThis
+ if( nCurrentPos == -1 )
+ {
+ OSL_FAIL("sd::EffectMigration::SetPresentationOrder() failed cause this shape has no effect" );
+ return;
+ }
+
+ // check trivial case
+ if( nCurrentPos == nNewPos )
+ return;
+
+ std::vector< CustomAnimationEffectPtr > aEffects;
+
+ for( const auto& rIter : aEffectVector[nCurrentPos] )
+ {
+ aEffects.push_back( *rIter );
+ rSequence.erase( rIter );
+ }
+
+ if( nNewPos > nCurrentPos )
+ nNewPos++;
+
+ if( nNewPos == static_cast<sal_Int32>(aEffectVector.size()) )
+ {
+ rSequence.insert( rSequence.end(), aEffects.begin(), aEffects.end() );
+ }
+ else
+ {
+ EffectSequence::iterator aPos( aEffectVector[nNewPos][0] );
+ for( const auto& rEffect : aEffects )
+ {
+ rSequence.insert( aPos, rEffect );
+ }
+ }
+}
+
+/** Returns the position of the given SdrObject in the Presentation order.
+ * This function returns -1 if the SdrObject is not in the Presentation order
+ * or if it's the path-object.
+ */
+sal_Int32 EffectMigration::GetPresentationOrder( SvxShape* pShape )
+{
+ sal_Int32 nPos = -1, nFound = -1;
+
+ SdrObject* pObj = pShape->GetSdrObject();
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ EffectSequence& rSequence = pMainSequence->getSequence();
+
+ Reference< XShape > xThis( pShape );
+ Reference< XShape > xCurrent;
+
+ for( const CustomAnimationEffectPtr& pEffect : rSequence )
+ {
+ if( !xCurrent.is() || pEffect->getTargetShape() != xCurrent )
+ {
+ nPos++;
+ xCurrent = pEffect->getTargetShape();
+
+ // is this the first effect for xThis shape?
+ if( xCurrent == xThis )
+ {
+ nFound = nPos;
+ break;
+ }
+ }
+ }
+
+ return nFound;
+}
+
+void EffectMigration::UpdateSoundEffect( SvxShape* pShape, SdAnimationInfo const * pInfo )
+{
+ if( !pInfo )
+ return;
+
+ SdrObject* pObj = pShape->GetSdrObject();
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ const Reference< XShape > xShape( pShape );
+
+ EffectSequence::iterator aIter;
+ bool bNeedRebuild = false;
+
+ OUString aSoundFile;
+ if( pInfo->mbSoundOn )
+ aSoundFile = pInfo->maSoundFile;
+
+ for( aIter = pMainSequence->getBegin(); aIter != pMainSequence->getEnd(); ++aIter )
+ {
+ CustomAnimationEffectPtr pEffect( *aIter );
+ if( pEffect->getTargetShape() == xShape )
+ {
+ if( !aSoundFile.isEmpty() )
+ {
+ pEffect->createAudio( Any( aSoundFile ) );
+ }
+ else
+ {
+ pEffect->removeAudio();
+ }
+ bNeedRebuild = true;
+ }
+ }
+
+ if( bNeedRebuild )
+ pMainSequence->rebuild();
+}
+
+OUString EffectMigration::GetSoundFile( SvxShape* pShape )
+{
+ OUString aSoundFile;
+
+ if( pShape )
+ {
+ SdrObject* pObj = pShape->GetSdrObject();
+ if( pObj && pObj->getSdrPageFromSdrObject() )
+ {
+ sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+
+ const Reference< XShape > xShape( pShape );
+
+ EffectSequence::iterator aIter;
+
+ for( aIter = pMainSequence->getBegin();
+ (aSoundFile.isEmpty()) && (aIter != pMainSequence->getEnd());
+ ++aIter )
+ {
+ CustomAnimationEffectPtr pEffect( *aIter );
+ if( pEffect->getTargetShape() == xShape )
+ {
+ if( pEffect->getAudio().is() )
+ pEffect->getAudio()->getSource() >>= aSoundFile;
+ }
+ }
+ }
+ }
+ return aSoundFile;
+}
+
+bool EffectMigration::GetSoundOn( SvxShape* pShape )
+{
+ return !GetSoundFile( pShape ).isEmpty();
+}
+
+void EffectMigration::SetAnimationPath( SvxShape* pShape, SdrPathObj const * pPathObj )
+{
+ if( !(pShape && pPathObj) )
+ return;
+
+ SdrObject* pObj = pShape->GetSdrObject();
+
+ if( pObj )
+ {
+ const Reference< XShape > xShape( pShape );
+ SdPage* pPage = dynamic_cast< SdPage* >(pPathObj->getSdrPageFromSdrObject());
+ if( pPage )
+ {
+ std::shared_ptr< sd::MainSequence > pMainSequence( pPage->getMainSequence() );
+ if( pMainSequence )
+ pMainSequence->append( *pPathObj, Any( xShape ), -1.0, "" );
+ }
+ }
+}
+
+// #i42894# helper which creates the needed XAnimate for changing visibility and all the (currently) needed embeddings
+static void createVisibilityOnOffNode(Reference< XTimeContainer > const & rxParentContainer, SdrObject& rCandidate, bool bVisible, bool bOnClick, double fDuration)
+{
+ Reference< XMultiServiceFactory > xMsf(::comphelper::getProcessServiceFactory());
+
+ // create par container node
+ Reference< XAnimationNode > xOuterSeqTimeContainer(xMsf->createInstance("com.sun.star.animations.ParallelTimeContainer"), UNO_QUERY_THROW);
+
+ // set begin
+ xOuterSeqTimeContainer->setBegin(Any(0.0));
+
+ // set fill
+ xOuterSeqTimeContainer->setFill(AnimationFill::HOLD);
+
+ // set named values
+ Sequence< NamedValue > aUserDataSequence{
+ { /* Name */ "node-type",
+ /* Value */ Any(bOnClick ? EffectNodeType::ON_CLICK : EffectNodeType::AFTER_PREVIOUS) }
+ };
+
+ xOuterSeqTimeContainer->setUserData(aUserDataSequence);
+
+ // create animate set to change visibility for rCandidate
+ Reference< XAnimationNode > xAnimateSetForLast(xMsf->createInstance("com.sun.star.animations.AnimateSet"), UNO_QUERY_THROW);
+
+ // set begin
+ xAnimateSetForLast->setBegin(Any(0.0));
+
+ // set duration
+ xAnimateSetForLast->setDuration(Any(fDuration));
+
+ // set fill
+ xAnimateSetForLast->setFill(AnimationFill::HOLD);
+
+ // set target
+ Reference< XAnimate > xAnimate(xAnimateSetForLast, UNO_QUERY);
+ Reference< XShape > xTargetShape(rCandidate.getUnoShape(), UNO_QUERY);
+ xAnimate->setTarget(Any(xTargetShape));
+
+ // set AttributeName
+ xAnimate->setAttributeName("Visibility");
+
+ // set attribute value
+ xAnimate->setTo(Any(bVisible));
+
+ // ad set node to par node
+ Reference< XTimeContainer > xParentContainer(xOuterSeqTimeContainer, UNO_QUERY_THROW);
+ xParentContainer->appendChild(xAnimateSetForLast);
+
+ // add node
+ rxParentContainer->appendChild(xOuterSeqTimeContainer);
+}
+
+// #i42894# older native formats supported animated group objects, that means all members of the group
+// were shown animated by showing one after the other. This is no longer supported, but the following
+// fallback will create the needed SMIL animation stuff. Unfortunately the members of the group
+// have to be moved directly to the page, else the (explained to be generic, thus I expected this to
+// work) animations will not work in slideshow
+void EffectMigration::CreateAnimatedGroup(SdrObjGroup const & rGroupObj, SdPage& rPage)
+{
+ // aw080 will give a vector immediately
+ SdrObjListIter aIter(rGroupObj);
+
+ if(!aIter.Count())
+ return;
+
+ std::shared_ptr< sd::MainSequence > pMainSequence(rPage.getMainSequence());
+
+ if(!pMainSequence)
+ return;
+
+ std::vector< SdrObject* > aObjects;
+ aObjects.reserve(aIter.Count());
+
+ while(aIter.IsMore())
+ {
+ // do move to page rough with old/current stuff, will be different in aw080 anyways
+ SdrObject* pCandidate = aIter.Next();
+ rGroupObj.GetSubList()->NbcRemoveObject(pCandidate->GetOrdNum());
+ rPage.NbcInsertObject(pCandidate);
+ aObjects.push_back(pCandidate);
+ }
+
+ // create main node
+ Reference< XMultiServiceFactory > xMsf(::comphelper::getProcessServiceFactory());
+ Reference< XAnimationNode > xOuterSeqTimeContainer(xMsf->createInstance("com.sun.star.animations.ParallelTimeContainer"), UNO_QUERY_THROW);
+
+ // set begin
+ xOuterSeqTimeContainer->setBegin(Any(0.0));
+
+ // prepare parent container
+ Reference< XTimeContainer > xParentContainer(xOuterSeqTimeContainer, UNO_QUERY_THROW);
+
+ // prepare loop over objects
+ SdrObject* pNext = nullptr;
+ const double fDurationShow(0.2);
+ const double fDurationHide(0.001);
+
+ for(size_t a(0); a < aObjects.size(); a++)
+ {
+ SdrObject* pLast = pNext;
+ pNext = aObjects[a];
+
+ // create node
+ if(pLast)
+ {
+ createVisibilityOnOffNode(xParentContainer, *pLast, false, false, fDurationHide);
+ }
+
+ if(pNext)
+ {
+ createVisibilityOnOffNode(xParentContainer, *pNext, true, !a, fDurationShow);
+ }
+ }
+
+ // create end node
+ if(pNext)
+ {
+ createVisibilityOnOffNode(xParentContainer, *pNext, false, false, fDurationHide);
+ }
+
+ // add to main sequence and rebuild
+ pMainSequence->createEffects(xOuterSeqTimeContainer);
+ pMainSequence->rebuild();
+}
+
+void EffectMigration::DocumentLoaded(SdDrawDocument & rDoc)
+{
+ if (DocumentType::Draw == rDoc.GetDocumentType())
+ return; // no animations in Draw
+ for (sal_uInt16 n = 0; n < rDoc.GetSdPageCount(PageKind::Standard); ++n)
+ {
+ SdPage *const pPage = rDoc.GetSdPage(n, PageKind::Standard);
+ if (pPage->hasAnimationNode())
+ {
+ // this will force the equivalent of the MainSequence::onTimerHdl
+ // so that the animations are present in export-able representation
+ // *before* the import is finished
+ pPage->getMainSequence()->getRootNode();
+ }
+ }
+ for (sal_uInt16 n = 0; n < rDoc.GetMasterSdPageCount(PageKind::Standard); ++n)
+ {
+ SdPage *const pPage = rDoc.GetMasterSdPage(n, PageKind::Standard);
+ if (pPage->hasAnimationNode())
+ {
+ pPage->getMainSequence()->getRootNode();
+ }
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/PageListWatcher.cxx b/sd/source/core/PageListWatcher.cxx
new file mode 100644
index 000000000..c3d8846fc
--- /dev/null
+++ b/sd/source/core/PageListWatcher.cxx
@@ -0,0 +1,217 @@
+/* -*- 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 "PageListWatcher.hxx"
+
+#include <sdpage.hxx>
+#include <tools/debug.hxx>
+#include <svx/svdmodel.hxx>
+#include <sal/log.hxx>
+
+void ImpPageListWatcher::ImpRecreateSortedPageListOnDemand()
+{
+ // clear vectors
+ maPageVectorStandard.clear();
+ maPageVectorNotes.clear();
+ mpHandoutPage = nullptr;
+
+ // build up vectors again
+ const sal_uInt32 nPageCount(ImpGetPageCount());
+
+ for(sal_uInt32 a(0); a < nPageCount; a++)
+ {
+ SdPage* pCandidate = ImpGetPage(a);
+ DBG_ASSERT(pCandidate, "ImpPageListWatcher::ImpRecreateSortedPageListOnDemand: Invalid PageList in Model (!)");
+
+ switch(pCandidate->GetPageKind())
+ {
+ case PageKind::Standard:
+ {
+ maPageVectorStandard.push_back(pCandidate);
+ break;
+ }
+ case PageKind::Notes:
+ {
+ maPageVectorNotes.push_back(pCandidate);
+ break;
+ }
+ case PageKind::Handout:
+ {
+ DBG_ASSERT(!mpHandoutPage, "ImpPageListWatcher::ImpRecreateSortedPageListOnDemand: Two Handout pages in PageList of Model (!)");
+ mpHandoutPage = pCandidate;
+ break;
+ }
+ }
+ }
+
+ // set to valid
+ mbPageListValid = true;
+}
+
+ImpPageListWatcher::ImpPageListWatcher(const SdrModel& rModel)
+ : mrModel(rModel)
+ , mpHandoutPage(nullptr)
+ , mbPageListValid(false)
+{
+}
+
+ImpPageListWatcher::~ImpPageListWatcher()
+{
+}
+
+SdPage* ImpPageListWatcher::GetSdPage(PageKind ePgKind, sal_uInt32 nPgNum)
+{
+ SdPage* pRetval(nullptr);
+
+ if(!mbPageListValid)
+ {
+ ImpRecreateSortedPageListOnDemand();
+ }
+
+ switch(ePgKind)
+ {
+ case PageKind::Standard:
+ {
+ if( nPgNum < static_cast<sal_uInt32>(maPageVectorStandard.size()) )
+ pRetval = maPageVectorStandard[nPgNum];
+ else
+ {
+ SAL_INFO( "sd.core",
+ "ImpPageListWatcher::GetSdPage(PageKind::Standard): page number " << nPgNum << " >= " << maPageVectorStandard.size() );
+ }
+ break;
+ }
+ case PageKind::Notes:
+ {
+ if( nPgNum < static_cast<sal_uInt32>(maPageVectorNotes.size()) )
+ pRetval = maPageVectorNotes[nPgNum];
+ else
+ {
+ SAL_INFO( "sd.core",
+ "ImpPageListWatcher::GetSdPage(PageKind::Notes): page number " << nPgNum << " >= " << maPageVectorNotes.size() );
+ }
+ break;
+ }
+ case PageKind::Handout:
+ {
+ // #11420# for models used to transfer drawing shapes via clipboard it's ok to not have a handout page
+ DBG_ASSERT(nPgNum == 0, "ImpPageListWatcher::GetSdPage: access to non existing handout page (!)");
+ if (nPgNum == 0)
+ pRetval = mpHandoutPage;
+ else
+ {
+ DBG_ASSERT(nPgNum == 0,
+ "ImpPageListWatcher::GetSdPage: access to non existing handout page (!)");
+ }
+ break;
+ }
+ }
+
+ return pRetval;
+}
+
+sal_uInt32 ImpPageListWatcher::GetSdPageCount(PageKind ePgKind)
+{
+ sal_uInt32 nRetval(0);
+
+ if(!mbPageListValid)
+ {
+ ImpRecreateSortedPageListOnDemand();
+ }
+
+ switch(ePgKind)
+ {
+ case PageKind::Standard:
+ {
+ nRetval = maPageVectorStandard.size();
+ break;
+ }
+ case PageKind::Notes:
+ {
+ nRetval = maPageVectorNotes.size();
+ break;
+ }
+ case PageKind::Handout:
+ {
+ if(mpHandoutPage)
+ {
+ nRetval = 1;
+ }
+
+ break;
+ }
+ }
+
+ return nRetval;
+}
+
+sal_uInt32 ImpPageListWatcher::GetVisibleSdPageCount() const
+{
+ sal_uInt32 nVisiblePageCount = 0;
+
+ // build up vectors again
+ const sal_uInt32 nPageCount(ImpGetPageCount());
+
+ for(sal_uInt32 a(0); a < nPageCount; a++)
+ {
+ SdPage* pCandidate = ImpGetPage(a);
+ if ((pCandidate->GetPageKind() == PageKind::Standard)&&(!pCandidate->IsExcluded())) nVisiblePageCount++;
+ }
+ return nVisiblePageCount;
+}
+
+sal_uInt32 ImpDrawPageListWatcher::ImpGetPageCount() const
+{
+ return static_cast<sal_uInt32>(mrModel.GetPageCount());
+}
+
+SdPage* ImpDrawPageListWatcher::ImpGetPage(sal_uInt32 nIndex) const
+{
+ return const_cast<SdPage*>(static_cast<const SdPage*>(mrModel.GetPage(static_cast<sal_uInt16>(nIndex))));
+}
+
+ImpDrawPageListWatcher::ImpDrawPageListWatcher(const SdrModel& rModel)
+: ImpPageListWatcher(rModel)
+{
+}
+
+ImpDrawPageListWatcher::~ImpDrawPageListWatcher()
+{
+}
+
+sal_uInt32 ImpMasterPageListWatcher::ImpGetPageCount() const
+{
+ return static_cast<sal_uInt32>(mrModel.GetMasterPageCount());
+}
+
+SdPage* ImpMasterPageListWatcher::ImpGetPage(sal_uInt32 nIndex) const
+{
+ return const_cast<SdPage*>(static_cast<const SdPage*>(mrModel.GetMasterPage(static_cast<sal_uInt16>(nIndex))));
+}
+
+ImpMasterPageListWatcher::ImpMasterPageListWatcher(const SdrModel& rModel)
+: ImpPageListWatcher(rModel)
+{
+}
+
+ImpMasterPageListWatcher::~ImpMasterPageListWatcher()
+{
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/PageListWatcher.hxx b/sd/source/core/PageListWatcher.hxx
new file mode 100644
index 000000000..252d18615
--- /dev/null
+++ b/sd/source/core/PageListWatcher.hxx
@@ -0,0 +1,87 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <pres.hxx>
+#include <sal/types.h>
+#include <vector>
+
+class SdPage;
+class SdrModel;
+
+/** Maintain a map of page indices to page objects for faster access that
+ remains valid during deletions and insertions of pages (#109538#).
+*/
+class ImpPageListWatcher
+{
+protected:
+ // typedefs for a vector of SdPages
+ typedef ::std::vector< SdPage* > SdPageVector;
+
+ const SdrModel& mrModel;
+
+ SdPageVector maPageVectorStandard;
+ SdPageVector maPageVectorNotes;
+ SdPage* mpHandoutPage;
+
+ bool mbPageListValid;
+
+ void ImpRecreateSortedPageListOnDemand();
+ virtual sal_uInt32 ImpGetPageCount() const = 0;
+
+ /** Return the page with the given index.
+ @param nIndex
+ When given an invalid index then NULL is returned.
+ */
+ virtual SdPage* ImpGetPage (sal_uInt32 nIndex) const = 0;
+
+public:
+ explicit ImpPageListWatcher(const SdrModel& rModel);
+ virtual ~ImpPageListWatcher();
+
+ void Invalidate() { mbPageListValid = false; }
+ SdPage* GetSdPage(PageKind ePgKind, sal_uInt32 nPgNum);
+ sal_uInt32 GetSdPageCount(PageKind ePgKind);
+ sal_uInt32 GetVisibleSdPageCount() const;
+};
+
+class ImpDrawPageListWatcher : public ImpPageListWatcher
+{
+protected:
+ virtual sal_uInt32 ImpGetPageCount() const override;
+ virtual SdPage* ImpGetPage(sal_uInt32 nIndex) const override;
+
+public:
+ explicit ImpDrawPageListWatcher(const SdrModel& rModel);
+ virtual ~ImpDrawPageListWatcher() override;
+};
+
+class ImpMasterPageListWatcher : public ImpPageListWatcher
+{
+protected:
+ virtual sal_uInt32 ImpGetPageCount() const override;
+ virtual SdPage* ImpGetPage(sal_uInt32 nIndex) const override;
+
+public:
+ explicit ImpMasterPageListWatcher(const SdrModel& rModel);
+ virtual ~ImpMasterPageListWatcher() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/TransitionPreset.cxx b/sd/source/core/TransitionPreset.cxx
new file mode 100644
index 000000000..8d3a9d1d1
--- /dev/null
+++ b/sd/source/core/TransitionPreset.cxx
@@ -0,0 +1,385 @@
+/* -*- 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 <set>
+
+#include <com/sun/star/animations/XTransitionFilter.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/configuration/theDefaultProvider.hpp>
+#include <com/sun/star/beans/NamedValue.hpp>
+#include <com/sun/star/animations/AnimationNodeType.hpp>
+#include <com/sun/star/animations/TransitionType.hpp>
+#include <com/sun/star/animations/TransitionSubType.hpp>
+#include <unotools/configmgr.hxx>
+#include <comphelper/getexpandeduri.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertysequence.hxx>
+#include <comphelper/lok.hxx>
+#include <unotools/syslocaleoptions.hxx>
+#include <officecfg/Office/UI/Effects.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <sal/log.hxx>
+#include <vcl/svapp.hxx>
+
+#include <CustomAnimationPreset.hxx>
+#include <TransitionPreset.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::animations;
+
+using ::com::sun::star::uno::UNO_QUERY_THROW;
+using ::com::sun::star::uno::Any;
+using ::com::sun::star::uno::Sequence;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::Exception;
+using ::com::sun::star::lang::XMultiServiceFactory;
+using ::com::sun::star::container::XEnumerationAccess;
+using ::com::sun::star::container::XEnumeration;
+using ::com::sun::star::beans::NamedValue;
+
+namespace sd {
+
+TransitionPreset::TransitionPreset( const css::uno::Reference< css::animations::XAnimationNode >& xNode )
+{
+ // first locate preset id
+ const Sequence< NamedValue > aUserData( xNode->getUserData() );
+ const NamedValue* pProp = std::find_if(aUserData.begin(), aUserData.end(),
+ [](const NamedValue& rProp) { return rProp.Name == "preset-id"; });
+ if (pProp != aUserData.end())
+ pProp->Value >>= maPresetId;
+
+ // second, locate transition filter element
+ Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), css::uno::UNO_SET_THROW );
+ Reference< XTransitionFilter > xTransition( xEnumeration->nextElement(), UNO_QUERY_THROW );
+
+ mnTransition = xTransition->getTransition();
+ mnSubtype = xTransition->getSubtype();
+ mbDirection = xTransition->getDirection();
+ mnFadeColor = xTransition->getFadeColor();
+}
+
+bool TransitionPreset::importTransitionsFile( TransitionPresetList& rList,
+ Reference< XMultiServiceFactory > const & xServiceFactory,
+ const OUString& aURL )
+{
+ SAL_INFO("sd.transitions", "Importing " << aURL);
+
+ Reference< container::XNameAccess > xTransitionSets( officecfg::Office::UI::Effects::UserInterface::TransitionSets::get() );
+ Reference< container::XNameAccess > xTransitionGroups( officecfg::Office::UI::Effects::UserInterface::TransitionGroups::get() );
+ Reference< container::XNameAccess > xTransitionVariants( officecfg::Office::UI::Effects::UserInterface::TransitionVariants::get() );
+ Reference< container::XNameAccess > xTransitions( officecfg::Office::UI::Effects::UserInterface::Transitions::get() );
+
+ // import transition presets
+ Reference< XAnimationNode > xAnimationNode;
+
+ const std::set<sal_Int16> LOKSupportedTransitionTypes = {
+ TransitionType::BARWIPE,
+ TransitionType::BOXWIPE,
+ TransitionType::FOURBOXWIPE,
+ TransitionType::ELLIPSEWIPE,
+ TransitionType::CLOCKWIPE,
+ TransitionType::PINWHEELWIPE,
+ TransitionType::PUSHWIPE,
+ TransitionType::SLIDEWIPE,
+ TransitionType::FADE,
+ TransitionType::RANDOMBARWIPE,
+ TransitionType::CHECKERBOARDWIPE,
+ TransitionType::DISSOLVE,
+ TransitionType::SNAKEWIPE,
+ TransitionType::PARALLELSNAKESWIPE,
+ TransitionType::IRISWIPE,
+ TransitionType::BARNDOORWIPE,
+ TransitionType::VEEWIPE,
+ TransitionType::ZIGZAGWIPE,
+ TransitionType::BARNZIGZAGWIPE,
+ TransitionType::FANWIPE,
+ TransitionType::SINGLESWEEPWIPE,
+ TransitionType::WATERFALLWIPE,
+ TransitionType::SPIRALWIPE,
+ TransitionType::MISCDIAGONALWIPE,
+ TransitionType::BOXSNAKESWIPE
+ };
+
+ const std::set<sal_Int16> LOKSupportedTransitionSubTypes = {
+ TransitionSubType::DEFAULT,
+ TransitionSubType::LEFTTORIGHT,
+ TransitionSubType::TOPTOBOTTOM,
+ TransitionSubType::CORNERSIN,
+ TransitionSubType::CORNERSOUT,
+ TransitionSubType::VERTICAL,
+ TransitionSubType::HORIZONTAL,
+ TransitionSubType::DOWN,
+ TransitionSubType::CIRCLE,
+ TransitionSubType::CLOCKWISETWELVE,
+ TransitionSubType::CLOCKWISETHREE,
+ TransitionSubType::CLOCKWISESIX,
+ TransitionSubType::CLOCKWISENINE,
+ TransitionSubType::TWOBLADEVERTICAL,
+ TransitionSubType::TWOBLADEHORIZONTAL,
+ TransitionSubType::FOURBLADE,
+ TransitionSubType::FROMLEFT,
+ TransitionSubType::FROMTOP,
+ TransitionSubType::FROMRIGHT,
+ TransitionSubType::FROMBOTTOM,
+ TransitionSubType::CROSSFADE,
+ TransitionSubType::FADETOCOLOR,
+ TransitionSubType::FADEFROMCOLOR,
+ TransitionSubType::FADEOVERCOLOR,
+ TransitionSubType::THREEBLADE,
+ TransitionSubType::EIGHTBLADE,
+ TransitionSubType::ONEBLADE,
+ TransitionSubType::ACROSS,
+ TransitionSubType::TOPLEFTVERTICAL,
+ TransitionSubType::TOPLEFTHORIZONTAL,
+ TransitionSubType::TOPLEFTDIAGONAL,
+ TransitionSubType::TOPRIGHTDIAGONAL,
+ TransitionSubType::BOTTOMRIGHTDIAGONAL,
+ TransitionSubType::BOTTOMLEFTDIAGONAL,
+ TransitionSubType::RECTANGLE,
+ TransitionSubType::DIAMOND,
+ TransitionSubType::TOPLEFT,
+ TransitionSubType::TOPRIGHT,
+ TransitionSubType::BOTTOMRIGHT,
+ TransitionSubType::BOTTOMLEFT,
+ TransitionSubType::TOPCENTER,
+ TransitionSubType::RIGHTCENTER,
+ TransitionSubType::BOTTOMCENTER,
+ TransitionSubType::LEFTCENTER,
+ TransitionSubType::LEFT,
+ TransitionSubType::UP,
+ TransitionSubType::RIGHT,
+ TransitionSubType::DIAGONALBOTTOMLEFT,
+ TransitionSubType::DIAGONALTOPLEFT,
+ TransitionSubType::CENTERTOP,
+ TransitionSubType::CENTERRIGHT,
+ TransitionSubType::TOP,
+ TransitionSubType::BOTTOM,
+ TransitionSubType::CLOCKWISETOP,
+ TransitionSubType::CLOCKWISERIGHT,
+ TransitionSubType::CLOCKWISEBOTTOM,
+ TransitionSubType::CLOCKWISELEFT,
+ TransitionSubType::CLOCKWISETOPLEFT,
+ TransitionSubType::COUNTERCLOCKWISEBOTTOMLEFT,
+ TransitionSubType::CLOCKWISEBOTTOMRIGHT,
+ TransitionSubType::COUNTERCLOCKWISETOPRIGHT,
+ TransitionSubType::VERTICALLEFT,
+ TransitionSubType::VERTICALRIGHT,
+ TransitionSubType::HORIZONTALLEFT,
+ TransitionSubType::HORIZONTALRIGHT,
+ TransitionSubType::TOPLEFTCLOCKWISE,
+ TransitionSubType::TOPRIGHTCLOCKWISE,
+ TransitionSubType::BOTTOMRIGHTCLOCKWISE,
+ TransitionSubType::BOTTOMLEFTCLOCKWISE,
+ TransitionSubType::TOPLEFTCOUNTERCLOCKWISE,
+ TransitionSubType::TOPRIGHTCOUNTERCLOCKWISE,
+ TransitionSubType::BOTTOMRIGHTCOUNTERCLOCKWISE,
+ TransitionSubType::BOTTOMLEFTCOUNTERCLOCKWISE,
+ TransitionSubType::DOUBLEBARNDOOR,
+ TransitionSubType::DOUBLEDIAMOND,
+ TransitionSubType::VERTICALTOPSAME,
+ TransitionSubType::VERTICALBOTTOMSAME,
+ TransitionSubType::VERTICALTOPLEFTOPPOSITE,
+ TransitionSubType::VERTICALBOTTOMLEFTOPPOSITE,
+ TransitionSubType::HORIZONTALLEFTSAME,
+ TransitionSubType::HORIZONTALRIGHTSAME,
+ TransitionSubType::HORIZONTALTOPLEFTOPPOSITE,
+ TransitionSubType::HORIZONTALTOPRIGHTOPPOSITE,
+ TransitionSubType::DIAGONALBOTTOMLEFTOPPOSITE,
+ TransitionSubType::DIAGONALTOPLEFTOPPOSITE,
+ TransitionSubType::TWOBOXTOP,
+ TransitionSubType::TWOBOXBOTTOM,
+ TransitionSubType::TWOBOXLEFT,
+ TransitionSubType::TWOBOXRIGHT,
+ TransitionSubType::FOURBOXVERTICAL,
+ TransitionSubType::FOURBOXHORIZONTAL
+ };
+
+ try {
+ xAnimationNode = implImportEffects( xServiceFactory, aURL );
+ Reference< XEnumerationAccess > xEnumerationAccess( xAnimationNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), css::uno::UNO_SET_THROW );
+
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
+ if( xChildNode->getType() == AnimationNodeType::PAR )
+ {
+ TransitionPresetPtr pPreset( new TransitionPreset( xChildNode ) );
+
+ if( comphelper::LibreOfficeKit::isActive() )
+ {
+ sal_Int16 eTransitionType = pPreset->getTransition();
+ sal_Int16 eTransitionSubType = pPreset->getSubtype();
+ if( LOKSupportedTransitionTypes.find(eTransitionType) == LOKSupportedTransitionTypes.end()
+ || LOKSupportedTransitionSubTypes.find(eTransitionSubType) == LOKSupportedTransitionSubTypes.end() )
+ {
+ continue;
+ }
+ }
+
+ OUString aPresetId( pPreset->getPresetId() );
+
+ if( !aPresetId.isEmpty() )
+ {
+ Reference< container::XNameAccess > xTransitionNode;
+
+ if (xTransitions->hasByName( aPresetId ) &&
+ (xTransitions->getByName( aPresetId ) >>= xTransitionNode) &&
+ xTransitionNode.is() )
+ {
+ OUString sSet;
+ OUString sVariant;
+
+ xTransitionNode->getByName( "Set" ) >>= sSet;
+ xTransitionNode->getByName( "Variant" ) >>= sVariant;
+
+ Reference< container::XNameAccess > xSetNode;
+
+ xTransitionSets->getByName( sSet ) >>= xSetNode;
+ if( xSetNode.is() )
+ {
+ pPreset->maSetId = sSet;
+ xSetNode->getByName( "Label" ) >>= sSet;
+ pPreset->maSetLabel = sSet;
+
+ OUString sGroup;
+
+ xSetNode->getByName( "Group" ) >>= sGroup;
+
+ Reference< container::XNameAccess > xGroupNode;
+ xTransitionGroups->getByName( sGroup ) >>= xGroupNode;
+
+ if( xGroupNode.is() )
+ {
+ xGroupNode->getByName( "Label" ) >>= sGroup;
+ if( !sVariant.isEmpty() )
+ {
+ Reference< container::XNameAccess > xVariantNode;
+ xTransitionVariants->getByName( sVariant ) >>= xVariantNode;
+ if( xVariantNode.is() )
+ {
+ xVariantNode->getByName( "Label" ) >>= sVariant;
+ pPreset->maVariantLabel = sVariant;
+ }
+ }
+
+ pPreset->maSetLabel = sSet;
+ SAL_INFO("sd.transitions", aPresetId << ": " << sGroup << "/" << sSet << (sVariant.isEmpty() ? OUString() : OUString("/" + sVariant)));
+
+ rList.push_back( pPreset );
+ }
+ else
+ SAL_WARN("sd.transitions", "group node " << sGroup << " not found");
+ }
+ else
+ SAL_WARN("sd.transitions", "set node " << sSet << " not found");
+ }
+ else
+ SAL_WARN("sd.transitions", "transition node " << aPresetId << " not found");
+ }
+ }
+ else
+ {
+ SAL_WARN("sd.transitions", " malformed xml configuration file " << aURL );
+ break;
+ }
+ }
+ } catch( Exception& ) {
+ return false;
+ }
+
+ return true;
+}
+
+bool TransitionPreset::importTransitionPresetList( TransitionPresetList& rList )
+{
+ if (utl::ConfigManager::IsFuzzing())
+ return false;
+
+ bool bRet = false;
+
+ try
+ {
+ uno::Reference< uno::XComponentContext > xContext(
+ comphelper::getProcessComponentContext() );
+ Reference< XMultiServiceFactory > xServiceFactory(
+ xContext->getServiceManager(), UNO_QUERY_THROW );
+
+ // import ui strings
+ Reference< XMultiServiceFactory > xConfigProvider =
+ configuration::theDefaultProvider::get( xContext );
+
+ // read path to transition effects files from config
+ uno::Sequence<uno::Any> aArgs(comphelper::InitAnyPropertySequence(
+ {
+ {"nodepath", uno::Any(OUString("/org.openoffice.Office.Impress/Misc"))}
+ }));
+ Reference<container::XNameAccess> xNameAccess(
+ xConfigProvider->createInstanceWithArguments(
+ "com.sun.star.configuration.ConfigurationAccess",
+ aArgs),
+ UNO_QUERY_THROW );
+ uno::Sequence< OUString > aFiles;
+ xNameAccess->getByName("TransitionFiles") >>= aFiles;
+
+ for( const auto& rFile : std::as_const(aFiles) )
+ {
+ OUString aURL = comphelper::getExpandedUri(xContext, rFile);
+
+ bRet |= importTransitionsFile( rList,
+ xServiceFactory,
+ aURL );
+ }
+
+ return bRet;
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::TransitionPreset::importResources()" );
+ }
+
+ return bRet;
+}
+
+std::map<OUString, TransitionPresetList> sd::TransitionPreset::mPresetsMap;
+
+const TransitionPresetList& TransitionPreset::getTransitionPresetList()
+{
+ // Support localization per-view. Currently not useful for Desktop
+ // but very much critical for LOK. The cache now is per-language.
+ const OUString aLang = comphelper::LibreOfficeKit::isActive()
+ ? comphelper::LibreOfficeKit::getLanguageTag().getBcp47()
+ : SvtSysLocaleOptions().GetLanguageTag().getBcp47();
+
+ SolarMutexGuard aGuard;
+ const auto it = mPresetsMap.find(aLang);
+ if (it != mPresetsMap.end())
+ return it->second;
+
+ TransitionPresetList& rList = mPresetsMap[aLang];
+ sd::TransitionPreset::importTransitionPresetList(rList);
+ return rList;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/anminfo.cxx b/sd/source/core/anminfo.cxx
new file mode 100644
index 000000000..5f763708c
--- /dev/null
+++ b/sd/source/core/anminfo.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/.
+ *
+ * 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 <editeng/flditem.hxx>
+#include <editeng/eeitem.hxx>
+#include <tools/debug.hxx>
+
+#include <anminfo.hxx>
+#include <glob.hxx>
+
+using namespace ::com::sun::star;
+
+SdAnimationInfo::SdAnimationInfo(SdrObject& rObject)
+ : SdrObjUserData(SdrInventor::StarDrawUserData, SD_ANIMATIONINFO_ID),
+ mePresObjKind (PresObjKind::NONE),
+ meEffect (presentation::AnimationEffect_NONE),
+ meTextEffect (presentation::AnimationEffect_NONE),
+ meSpeed (presentation::AnimationSpeed_SLOW),
+ mbActive (true),
+ mbDimPrevious (false),
+ mbIsMovie (false),
+ mbDimHide (false),
+ mbSoundOn (false),
+ mbPlayFull (false),
+ meClickAction (presentation::ClickAction_NONE),
+ meSecondEffect (presentation::AnimationEffect_NONE),
+ meSecondSpeed (presentation::AnimationSpeed_SLOW),
+ mbSecondSoundOn (false),
+ mbSecondPlayFull (false),
+ mnVerb (0),
+ mrObject (rObject)
+{
+ maBlueScreen = COL_LIGHTMAGENTA;
+ maDimColor = COL_LIGHTGRAY;
+}
+
+SdAnimationInfo::SdAnimationInfo(const SdAnimationInfo& rAnmInfo, SdrObject& rObject)
+ : SdrObjUserData (rAnmInfo),
+ mePresObjKind (PresObjKind::NONE),
+ meEffect (rAnmInfo.meEffect),
+ meTextEffect (rAnmInfo.meTextEffect),
+ meSpeed (rAnmInfo.meSpeed),
+ mbActive (rAnmInfo.mbActive),
+ mbDimPrevious (rAnmInfo.mbDimPrevious),
+ mbIsMovie (rAnmInfo.mbIsMovie),
+ mbDimHide (rAnmInfo.mbDimHide),
+ maBlueScreen (rAnmInfo.maBlueScreen),
+ maDimColor (rAnmInfo.maDimColor),
+ maSoundFile (rAnmInfo.maSoundFile),
+ mbSoundOn (rAnmInfo.mbSoundOn),
+ mbPlayFull (rAnmInfo.mbPlayFull),
+ meClickAction (rAnmInfo.meClickAction),
+ meSecondEffect (rAnmInfo.meSecondEffect),
+ meSecondSpeed (rAnmInfo.meSecondSpeed),
+ maSecondSoundFile (rAnmInfo.maSecondSoundFile),
+ mbSecondSoundOn (rAnmInfo.mbSecondSoundOn),
+ mbSecondPlayFull (rAnmInfo.mbSecondPlayFull),
+ mnVerb (rAnmInfo.mnVerb),
+ mrObject (rObject)
+{
+ // can not be copied
+ if(meEffect == presentation::AnimationEffect_PATH)
+ meEffect = presentation::AnimationEffect_NONE;
+}
+
+SdAnimationInfo::~SdAnimationInfo()
+{
+}
+
+std::unique_ptr<SdrObjUserData> SdAnimationInfo::Clone(SdrObject* pObject) const
+{
+ DBG_ASSERT( pObject, "SdAnimationInfo::Clone(), pObject must not be null!" );
+ if( pObject == nullptr )
+ pObject = &mrObject;
+
+ return std::unique_ptr<SdrObjUserData>(new SdAnimationInfo(*this, *pObject ));
+}
+
+void SdAnimationInfo::SetBookmark( const OUString& rBookmark )
+{
+ if( meClickAction == css::presentation::ClickAction_BOOKMARK )
+ {
+ OUString sURL = "#" + rBookmark;
+ SvxFieldItem aURLItem( SvxURLField( sURL, sURL ), EE_FEATURE_FIELD );
+ mrObject.SetMergedItem( aURLItem );
+ }
+ else
+ {
+ SvxFieldItem aURLItem( SvxURLField( rBookmark, rBookmark ), EE_FEATURE_FIELD );
+ mrObject.SetMergedItem( aURLItem );
+ }
+}
+
+OUString SdAnimationInfo::GetBookmark() const
+{
+ OUString sBookmark;
+
+ const SvxFieldItem* pFldItem = &mrObject.GetMergedItem( EE_FEATURE_FIELD );
+ if( pFldItem )
+ {
+ SvxURLField* pURLField = const_cast< SvxURLField* >( dynamic_cast<const SvxURLField*>( pFldItem->GetField() ) );
+ if( pURLField )
+ sBookmark = pURLField->GetURL();
+ }
+
+ if( (meClickAction == css::presentation::ClickAction_BOOKMARK) && sBookmark.startsWith("#") )
+ sBookmark = sBookmark.copy( 1 );
+
+ return sBookmark;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/annotations/Annotation.cxx b/sd/source/core/annotations/Annotation.cxx
new file mode 100644
index 000000000..991412f06
--- /dev/null
+++ b/sd/source/core/annotations/Annotation.cxx
@@ -0,0 +1,480 @@
+/* -*- 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 <Annotation.hxx>
+#include <drawdoc.hxx>
+
+#include <com/sun/star/drawing/XDrawPage.hpp>
+
+#include <comphelper/processfactory.hxx>
+#include <comphelper/lok.hxx>
+
+#include <unotools/datetime.hxx>
+
+#include <sfx2/viewsh.hxx>
+#include <svx/svdundo.hxx>
+
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+
+#include <notifydocumentevent.hxx>
+
+#include <tools/json_writer.hxx>
+
+using namespace css;
+
+namespace com::sun::star::uno { class XComponentContext; }
+
+namespace sd {
+
+namespace {
+
+class UndoInsertOrRemoveAnnotation : public SdrUndoAction
+{
+public:
+ UndoInsertOrRemoveAnnotation( Annotation& rAnnotation, bool bInsert );
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+protected:
+ rtl::Reference< Annotation > mxAnnotation;
+ bool mbInsert;
+ int mnIndex;
+};
+
+struct AnnotationData
+{
+ geometry::RealPoint2D m_Position;
+ geometry::RealSize2D m_Size;
+ OUString m_Author;
+ OUString m_Initials;
+ util::DateTime m_DateTime;
+ OUString m_Text;
+
+ void get( const rtl::Reference< Annotation >& xAnnotation )
+ {
+ m_Position = xAnnotation->getPosition();
+ m_Size = xAnnotation->getSize();
+ m_Author = xAnnotation->getAuthor();
+ m_Initials = xAnnotation->getInitials();
+ m_DateTime = xAnnotation->getDateTime();
+ uno::Reference<text::XText> xText(xAnnotation->getTextRange());
+ m_Text = xText->getString();
+ }
+
+ void set( const rtl::Reference< Annotation >& xAnnotation )
+ {
+ xAnnotation->setPosition(m_Position);
+ xAnnotation->setSize(m_Size);
+ xAnnotation->setAuthor(m_Author);
+ xAnnotation->setInitials(m_Initials);
+ xAnnotation->setDateTime(m_DateTime);
+ uno::Reference<text::XText> xText(xAnnotation->getTextRange());
+ xText->setString(m_Text);
+ }
+};
+
+class UndoAnnotation : public SdrUndoAction
+{
+public:
+ explicit UndoAnnotation( Annotation& rAnnotation );
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+protected:
+ rtl::Reference< Annotation > mxAnnotation;
+ AnnotationData maUndoData;
+ AnnotationData maRedoData;
+};
+
+}
+
+void createAnnotation(uno::Reference<office::XAnnotation>& xAnnotation, SdPage* pPage )
+{
+ xAnnotation.set(
+ new Annotation(comphelper::getProcessComponentContext(), pPage));
+ pPage->addAnnotation(xAnnotation, -1);
+}
+
+sal_uInt32 Annotation::m_nLastId = 1;
+
+Annotation::Annotation( const uno::Reference<uno::XComponentContext>& context, SdPage* pPage )
+: ::cppu::WeakComponentImplHelper<office::XAnnotation>(m_aMutex)
+, ::cppu::PropertySetMixin<office::XAnnotation>(context, IMPLEMENTS_PROPERTY_SET, uno::Sequence<OUString>())
+, m_nId( m_nLastId++ )
+, mpPage( pPage )
+{
+}
+
+// override WeakComponentImplHelperBase::disposing()
+// This function is called upon disposing the component,
+// if your component needs special work when it becomes
+// disposed, do it here.
+void SAL_CALL Annotation::disposing()
+{
+ mpPage = nullptr;
+ if( m_TextRange.is() )
+ {
+ m_TextRange->dispose();
+ m_TextRange.clear();
+ }
+}
+
+uno::Any Annotation::queryInterface(css::uno::Type const & type)
+{
+ return ::cppu::WeakComponentImplHelper<office::XAnnotation>::queryInterface(type);
+}
+
+// com.sun.star.beans.XPropertySet:
+uno::Reference<beans::XPropertySetInfo> SAL_CALL Annotation::getPropertySetInfo()
+{
+ return ::cppu::PropertySetMixin<office::XAnnotation>::getPropertySetInfo();
+}
+
+void SAL_CALL Annotation::setPropertyValue(const OUString & aPropertyName, const uno::Any & aValue)
+{
+ ::cppu::PropertySetMixin<office::XAnnotation>::setPropertyValue(aPropertyName, aValue);
+}
+
+uno::Any SAL_CALL Annotation::getPropertyValue(const OUString & aPropertyName)
+{
+ return ::cppu::PropertySetMixin<office::XAnnotation>::getPropertyValue(aPropertyName);
+}
+
+void SAL_CALL Annotation::addPropertyChangeListener(const OUString & aPropertyName, const uno::Reference<beans::XPropertyChangeListener> & xListener)
+{
+ ::cppu::PropertySetMixin<office::XAnnotation>::addPropertyChangeListener(aPropertyName, xListener);
+}
+
+void SAL_CALL Annotation::removePropertyChangeListener(const OUString & aPropertyName, const uno::Reference<beans::XPropertyChangeListener> & xListener)
+{
+ ::cppu::PropertySetMixin<office::XAnnotation>::removePropertyChangeListener(aPropertyName, xListener);
+}
+
+void SAL_CALL Annotation::addVetoableChangeListener(const OUString & aPropertyName, const uno::Reference<beans::XVetoableChangeListener> & xListener)
+{
+ ::cppu::PropertySetMixin<office::XAnnotation>::addVetoableChangeListener(aPropertyName, xListener);
+}
+
+void SAL_CALL Annotation::removeVetoableChangeListener(const OUString & aPropertyName, const uno::Reference<beans::XVetoableChangeListener> & xListener)
+{
+ ::cppu::PropertySetMixin<office::XAnnotation>::removeVetoableChangeListener(aPropertyName, xListener);
+}
+
+uno::Any SAL_CALL Annotation::getAnchor()
+{
+ osl::MutexGuard g(m_aMutex);
+ uno::Any aRet;
+ if( mpPage )
+ {
+ uno::Reference<drawing::XDrawPage> xPage( mpPage->getUnoPage(), uno::UNO_QUERY );
+ aRet <<= xPage;
+ }
+ return aRet;
+}
+
+// css::office::XAnnotation:
+geometry::RealPoint2D SAL_CALL Annotation::getPosition()
+{
+ osl::MutexGuard g(m_aMutex);
+ return m_Position;
+}
+
+void SAL_CALL Annotation::setPosition(const geometry::RealPoint2D & the_value)
+{
+ prepareSet("Position", uno::Any(), uno::Any(), nullptr);
+ {
+ osl::MutexGuard g(m_aMutex);
+ createChangeUndo();
+ m_Position = the_value;
+ }
+}
+
+// css::office::XAnnotation:
+geometry::RealSize2D SAL_CALL Annotation::getSize()
+{
+ osl::MutexGuard g(m_aMutex);
+ return m_Size;
+}
+
+void SAL_CALL Annotation::setSize(const geometry::RealSize2D & the_value)
+{
+ prepareSet("Size", uno::Any(), uno::Any(), nullptr);
+ {
+ osl::MutexGuard g(m_aMutex);
+ createChangeUndo();
+ m_Size = the_value;
+ }
+}
+
+OUString SAL_CALL Annotation::getAuthor()
+{
+ osl::MutexGuard g(m_aMutex);
+ return m_Author;
+}
+
+void SAL_CALL Annotation::setAuthor(const OUString & the_value)
+{
+ prepareSet("Author", uno::Any(), uno::Any(), nullptr);
+ {
+ osl::MutexGuard g(m_aMutex);
+ createChangeUndo();
+ m_Author = the_value;
+ }
+}
+
+OUString SAL_CALL Annotation::getInitials()
+{
+ osl::MutexGuard g(m_aMutex);
+ return m_Initials;
+}
+
+void SAL_CALL Annotation::setInitials(const OUString & the_value)
+{
+ prepareSet("Initials", uno::Any(), uno::Any(), nullptr);
+ {
+ osl::MutexGuard g(m_aMutex);
+ createChangeUndo();
+ m_Initials = the_value;
+ }
+}
+
+util::DateTime SAL_CALL Annotation::getDateTime()
+{
+ osl::MutexGuard g(m_aMutex);
+ return m_DateTime;
+}
+
+void SAL_CALL Annotation::setDateTime(const util::DateTime & the_value)
+{
+ prepareSet("DateTime", uno::Any(), uno::Any(), nullptr);
+ {
+ osl::MutexGuard g(m_aMutex);
+ createChangeUndo();
+ m_DateTime = the_value;
+ }
+}
+
+void Annotation::createChangeUndo()
+{
+ SdrModel* pModel = GetModel(); // TTTT should use reference
+ if( pModel && pModel->IsUndoEnabled() )
+ pModel->AddUndo( std::make_unique<UndoAnnotation>( *this ) );
+
+ if( pModel )
+ {
+ pModel->SetChanged();
+ uno::Reference< XInterface > xSource( static_cast<uno::XWeak*>( this ) );
+ NotifyDocumentEvent(
+ static_cast< SdDrawDocument& >( *pModel ),
+ "OnAnnotationChanged" ,
+ xSource );
+ }
+}
+
+uno::Reference<text::XText> SAL_CALL Annotation::getTextRange()
+{
+ osl::MutexGuard g(m_aMutex);
+ if( !m_TextRange.is() && (mpPage != nullptr) )
+ {
+ m_TextRange = TextApiObject::create( static_cast< SdDrawDocument* >( &mpPage->getSdrModelFromSdrPage() ) );
+ }
+ return m_TextRange;
+}
+
+std::unique_ptr<SdrUndoAction> CreateUndoInsertOrRemoveAnnotation( const uno::Reference<office::XAnnotation>& xAnnotation, bool bInsert )
+{
+ Annotation* pAnnotation = dynamic_cast< Annotation* >( xAnnotation.get() );
+ if( pAnnotation )
+ {
+ return std::make_unique< UndoInsertOrRemoveAnnotation >( *pAnnotation, bInsert );
+ }
+ else
+ {
+ return nullptr;
+ }
+}
+
+void CreateChangeUndo(const uno::Reference<office::XAnnotation>& xAnnotation)
+{
+ Annotation* pAnnotation = dynamic_cast<Annotation*>(xAnnotation.get());
+ if (pAnnotation)
+ pAnnotation->createChangeUndo();
+}
+
+sal_uInt32 getAnnotationId(const uno::Reference<office::XAnnotation>& xAnnotation)
+{
+ Annotation* pAnnotation = dynamic_cast<Annotation*>(xAnnotation.get());
+ sal_uInt32 nId = 0;
+ if (pAnnotation)
+ nId = pAnnotation->GetId();
+ return nId;
+}
+
+const SdPage* getAnnotationPage(const uno::Reference<office::XAnnotation>& xAnnotation)
+{
+ Annotation* pAnnotation = dynamic_cast<Annotation*>(xAnnotation.get());
+ if (pAnnotation)
+ return pAnnotation->GetPage();
+ return nullptr;
+}
+
+namespace
+{
+std::string lcl_LOKGetCommentPayload(CommentNotificationType nType, uno::Reference<office::XAnnotation> const & rxAnnotation)
+{
+ ::tools::JsonWriter aJsonWriter;
+ {
+ auto aCommentNode = aJsonWriter.startNode("comment");
+
+ aJsonWriter.put("action", (nType == CommentNotificationType::Add ? "Add" :
+ (nType == CommentNotificationType::Remove ? "Remove" :
+ (nType == CommentNotificationType::Modify ? "Modify" : "???"))));
+ aJsonWriter.put("id", sd::getAnnotationId(rxAnnotation));
+
+ if (nType != CommentNotificationType::Remove && rxAnnotation.is())
+ {
+ aJsonWriter.put("id", sd::getAnnotationId(rxAnnotation));
+ aJsonWriter.put("author", rxAnnotation->getAuthor());
+ aJsonWriter.put("dateTime", utl::toISO8601(rxAnnotation->getDateTime()));
+ uno::Reference<text::XText> xText(rxAnnotation->getTextRange());
+ aJsonWriter.put("text", xText->getString());
+ const SdPage* pPage = sd::getAnnotationPage(rxAnnotation);
+ aJsonWriter.put("parthash", pPage ? OString::number(pPage->GetHashCode()) : OString());
+ geometry::RealPoint2D const & rPoint = rxAnnotation->getPosition();
+ geometry::RealSize2D const & rSize = rxAnnotation->getSize();
+ ::tools::Rectangle aRectangle(Point(rPoint.X * 100.0, rPoint.Y * 100.0), Size(rSize.Width * 100.0, rSize.Height * 100.0));
+ aRectangle = OutputDevice::LogicToLogic(aRectangle, MapMode(MapUnit::Map100thMM), MapMode(MapUnit::MapTwip));
+ OString sRectangle = aRectangle.toString();
+ aJsonWriter.put("rectangle", sRectangle.getStr());
+ }
+ }
+ return aJsonWriter.extractData();
+}
+} // anonymous ns
+
+void LOKCommentNotify(CommentNotificationType nType, const SfxViewShell* pViewShell, uno::Reference<office::XAnnotation> const & rxAnnotation)
+{
+ // callbacks only if tiled annotations are explicitly turned off by LOK client
+ if (!comphelper::LibreOfficeKit::isActive() || comphelper::LibreOfficeKit::isTiledAnnotations())
+ return ;
+
+ std::string aPayload = lcl_LOKGetCommentPayload(nType, rxAnnotation);
+ pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_COMMENT, aPayload.c_str());
+}
+
+void LOKCommentNotifyAll(CommentNotificationType nType, uno::Reference<office::XAnnotation> const & rxAnnotation)
+{
+ // callbacks only if tiled annotations are explicitly turned off by LOK client
+ if (!comphelper::LibreOfficeKit::isActive() || comphelper::LibreOfficeKit::isTiledAnnotations())
+ return ;
+
+ std::string aPayload = lcl_LOKGetCommentPayload(nType, rxAnnotation);
+
+ const SfxViewShell* pViewShell = SfxViewShell::GetFirst();
+ while (pViewShell)
+ {
+ pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_COMMENT, aPayload.c_str());
+ pViewShell = SfxViewShell::GetNext(*pViewShell);
+ }
+}
+
+UndoInsertOrRemoveAnnotation::UndoInsertOrRemoveAnnotation( Annotation& rAnnotation, bool bInsert )
+: SdrUndoAction( *rAnnotation.GetModel() )
+, mxAnnotation( &rAnnotation )
+, mbInsert( bInsert )
+, mnIndex( 0 )
+{
+ SdPage* pPage = rAnnotation.GetPage();
+ if( pPage )
+ {
+ uno::Reference<office::XAnnotation> xAnnotation( &rAnnotation );
+
+ const AnnotationVector& rVec = pPage->getAnnotations();
+ auto iter = std::find(rVec.begin(), rVec.end(), xAnnotation);
+ mnIndex += std::distance(rVec.begin(), iter);
+ }
+}
+
+void UndoInsertOrRemoveAnnotation::Undo()
+{
+ SdPage* pPage = mxAnnotation->GetPage();
+ SdrModel* pModel = mxAnnotation->GetModel();
+ if( !(pPage && pModel) )
+ return;
+
+ uno::Reference<office::XAnnotation> xAnnotation( mxAnnotation );
+ if( mbInsert )
+ {
+ pPage->removeAnnotation( xAnnotation );
+ }
+ else
+ {
+ pPage->addAnnotation( xAnnotation, mnIndex );
+ LOKCommentNotifyAll( CommentNotificationType::Add, xAnnotation );
+ }
+}
+
+void UndoInsertOrRemoveAnnotation::Redo()
+{
+ SdPage* pPage = mxAnnotation->GetPage();
+ SdrModel* pModel = mxAnnotation->GetModel();
+ if( !(pPage && pModel) )
+ return;
+
+ uno::Reference<office::XAnnotation> xAnnotation( mxAnnotation );
+
+ if( mbInsert )
+ {
+ pPage->addAnnotation( xAnnotation, mnIndex );
+ LOKCommentNotifyAll( CommentNotificationType::Add, xAnnotation );
+ }
+ else
+ {
+ pPage->removeAnnotation( xAnnotation );
+ }
+}
+
+UndoAnnotation::UndoAnnotation( Annotation& rAnnotation )
+: SdrUndoAction( *rAnnotation.GetModel() )
+, mxAnnotation( &rAnnotation )
+{
+ maUndoData.get( mxAnnotation );
+}
+
+void UndoAnnotation::Undo()
+{
+ maRedoData.get( mxAnnotation );
+ maUndoData.set( mxAnnotation );
+ LOKCommentNotifyAll( CommentNotificationType::Modify, mxAnnotation );
+}
+
+void UndoAnnotation::Redo()
+{
+ maUndoData.get( mxAnnotation );
+ maRedoData.set( mxAnnotation );
+ LOKCommentNotifyAll( CommentNotificationType::Modify, mxAnnotation );
+}
+
+} // namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/annotations/AnnotationEnumeration.cxx b/sd/source/core/annotations/AnnotationEnumeration.cxx
new file mode 100644
index 000000000..5fae2422b
--- /dev/null
+++ b/sd/source/core/annotations/AnnotationEnumeration.cxx
@@ -0,0 +1,85 @@
+/* -*- 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 <cppuhelper/implbase.hxx>
+#include <com/sun/star/container/NoSuchElementException.hpp>
+#include <com/sun/star/office/XAnnotationEnumeration.hpp>
+
+#include <AnnotationEnumeration.hxx>
+#include <sdpage.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::office;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+namespace sd {
+
+namespace {
+
+class AnnotationEnumeration: public ::cppu::WeakImplHelper< css::office::XAnnotationEnumeration >
+{
+public:
+ explicit AnnotationEnumeration( AnnotationVector&& rAnnotations );
+ AnnotationEnumeration(const AnnotationEnumeration&) = delete;
+ AnnotationEnumeration& operator=(const AnnotationEnumeration&) = delete;
+
+ // css::office::XAnnotationEnumeration:
+ virtual sal_Bool SAL_CALL hasMoreElements() override;
+ virtual css::uno::Reference< css::office::XAnnotation > SAL_CALL nextElement() override;
+
+private:
+ // destructor is private and will be called indirectly by the release call virtual ~AnnotationEnumeration() {}
+
+ AnnotationVector maAnnotations;
+ AnnotationVector::iterator maIter;
+};
+
+}
+
+Reference< XAnnotationEnumeration > createAnnotationEnumeration( sd::AnnotationVector&& rAnnotations )
+{
+ return new AnnotationEnumeration( std::move(rAnnotations) );
+}
+
+AnnotationEnumeration::AnnotationEnumeration( AnnotationVector&& rAnnotations )
+: maAnnotations(std::move(rAnnotations))
+{
+ maIter = maAnnotations.begin();
+}
+
+// css::office::XAnnotationEnumeration:
+sal_Bool SAL_CALL AnnotationEnumeration::hasMoreElements()
+{
+ return maIter != maAnnotations.end();
+}
+
+css::uno::Reference< css::office::XAnnotation > SAL_CALL AnnotationEnumeration::nextElement()
+{
+ if( maIter == maAnnotations.end() )
+ throw css::container::NoSuchElementException();
+
+ return (*maIter++);
+}
+
+} // namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/cusshow.cxx b/sd/source/core/cusshow.cxx
new file mode 100644
index 000000000..8b51a613d
--- /dev/null
+++ b/sd/source/core/cusshow.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/.
+ *
+ * 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 <com/sun/star/lang/XComponent.hpp>
+
+#include <createunocustomshow.hxx>
+#include <cusshow.hxx>
+#include <customshowlist.hxx>
+
+using namespace ::com::sun::star;
+
+/*************************************************************************
+|*
+|* Ctor
+|*
+\************************************************************************/
+SdCustomShow::SdCustomShow()
+{
+}
+
+/*************************************************************************
+|*
+|* Copy-Ctor
+|*
+\************************************************************************/
+SdCustomShow::SdCustomShow( const SdCustomShow& rShow )
+ : maPages(rShow.maPages)
+{
+ aName = rShow.GetName();
+}
+
+SdCustomShow::SdCustomShow(css::uno::Reference< css::uno::XInterface > const & xShow )
+ : mxUnoCustomShow( xShow )
+{
+}
+
+/*************************************************************************
+|*
+|* Dtor
+|*
+\************************************************************************/
+SdCustomShow::~SdCustomShow()
+{
+ uno::Reference< uno::XInterface > xShow( mxUnoCustomShow );
+ uno::Reference< lang::XComponent > xComponent( xShow, uno::UNO_QUERY );
+ if( xComponent.is() )
+ xComponent->dispose();
+}
+
+uno::Reference< uno::XInterface > SdCustomShow::getUnoCustomShow()
+{
+ // try weak reference first
+ uno::Reference< uno::XInterface > xShow( mxUnoCustomShow );
+
+ if( !xShow.is() )
+ {
+ xShow = createUnoCustomShow( this );
+ }
+
+ return xShow;
+}
+
+void SdCustomShow::ReplacePage( const SdPage* pOldPage, const SdPage* pNewPage )
+{
+ if( !pNewPage )
+ {
+ maPages.erase(::std::remove(maPages.begin(), maPages.end(), pOldPage), maPages.end());
+ }
+ else
+ {
+ ::std::replace(maPages.begin(), maPages.end(), pOldPage, pNewPage);
+ }
+}
+
+void SdCustomShow::SetName(const OUString& rName)
+{
+ aName = rName;
+}
+
+void SdCustomShowList::erase(std::vector<std::unique_ptr<SdCustomShow>>::iterator it)
+{
+ mShows.erase(it);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/drawdoc.cxx b/sd/source/core/drawdoc.cxx
new file mode 100644
index 000000000..182ffe7f2
--- /dev/null
+++ b/sd/source/core/drawdoc.cxx
@@ -0,0 +1,1206 @@
+/* -*- 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 <libxml/xmlwriter.h>
+
+#include "PageListWatcher.hxx"
+#include <com/sun/star/document/PrinterIndependentLayout.hpp>
+#include <com/sun/star/i18n/ScriptType.hpp>
+#include <com/sun/star/beans/XPropertyContainer.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/document/XDocumentProperties.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <editeng/forbiddencharacterstable.hxx>
+
+#include <svl/srchitem.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/scriptspaceitem.hxx>
+#include <tools/debug.hxx>
+
+#include <unotools/configmgr.hxx>
+#include <unotools/useroptions.hxx>
+#include <officecfg/Office/Impress.hxx>
+
+#include <sfx2/linkmgr.hxx>
+#include <Outliner.hxx>
+#include <sdmod.hxx>
+#include <editeng/editstat.hxx>
+#include <svx/svdotext.hxx>
+#include <editeng/unolingu.hxx>
+#include <svl/itempool.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <editeng/outlobj.hxx>
+#include <comphelper/getexpandeduri.hxx>
+#include <i18nlangtag/mslangid.hxx>
+#include <i18nlangtag/languagetag.hxx>
+#include <unotools/charclass.hxx>
+#include <comphelper/processfactory.hxx>
+#include <unotools/lingucfg.hxx>
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/xml/dom/XDocumentBuilder.hpp>
+#include <com/sun/star/xml/dom/XDocument.hpp>
+#include <com/sun/star/xml/dom/XNodeList.hpp>
+#include <com/sun/star/xml/dom/DocumentBuilder.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <rtl/ustring.hxx>
+
+#include <editeng/outliner.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <strings.hrc>
+#include <glob.hxx>
+#include <stlpool.hxx>
+#include <sdresid.hxx>
+#include <customshowlist.hxx>
+#include <DrawDocShell.hxx>
+#include <GraphicDocShell.hxx>
+#include <sdxfer.hxx>
+#include <optsitem.hxx>
+#include <FrameView.hxx>
+#include <undo/undomanager.hxx>
+#include <sdundogr.hxx>
+#include <undopage.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+#include <unokywds.hxx>
+
+namespace com::sun::star::linguistic2 { class XHyphenator; }
+namespace com::sun::star::linguistic2 { class XSpellChecker1; }
+
+using namespace ::sd;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::linguistic2;
+
+using namespace com::sun::star::xml::dom;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::lang::XMultiServiceFactory;
+
+
+SdDrawDocument* SdDrawDocument::s_pDocLockedInsertingLinks = nullptr;
+
+PresentationSettings::PresentationSettings()
+: mbAll( true ),
+ mbEndless( false ),
+ mbCustomShow(false),
+ mbManual( false ),
+ mbMouseVisible( false ),
+ mbMouseAsPen( false ),
+ mbLockedPages( false ),
+ mbAlwaysOnTop( false ),
+ mbFullScreen( true ),
+ mbAnimationAllowed( true ),
+ mnPauseTimeout( 0 ),
+ mbShowPauseLogo( false ),
+ mbStartCustomShow( false )
+{
+}
+
+SdDrawDocument::SdDrawDocument(DocumentType eType, SfxObjectShell* pDrDocSh)
+: FmFormModel(
+ nullptr,
+ pDrDocSh)
+, mpDocSh(static_cast< ::sd::DrawDocShell*>(pDrDocSh))
+, mpCreatingTransferable( nullptr )
+, mbHasOnlineSpellErrors(false)
+, mbInitialOnlineSpellingEnabled(true)
+, mbNewOrLoadCompleted(false)
+, mbOnlineSpell(false)
+, mbStartWithPresentation( false )
+, mbExitAfterPresenting( false )
+, meLanguage( LANGUAGE_SYSTEM )
+, meLanguageCJK( LANGUAGE_SYSTEM )
+, meLanguageCTL( LANGUAGE_SYSTEM )
+, mePageNumType(SVX_NUM_ARABIC)
+, mbAllocDocSh(false)
+, meDocType(eType)
+, mbEmbedFonts(false)
+, mbEmbedUsedFontsOnly(false)
+, mbEmbedFontScriptLatin(true)
+, mbEmbedFontScriptAsian(true)
+, mbEmbedFontScriptComplex(true)
+, mnImagePreferredDPI(0)
+{
+ mpDrawPageListWatcher.reset(new ImpDrawPageListWatcher(*this));
+ mpMasterPageListWatcher.reset(new ImpMasterPageListWatcher(*this));
+
+ InitLayoutVector();
+ InitObjectVector();
+ SetObjectShell(pDrDocSh); // for VCDrawModel
+
+ if (mpDocSh)
+ {
+ SetSwapGraphics();
+ }
+
+ // Set measuring unit (of the application) and scale (of SdMod)
+ sal_Int32 nX, nY;
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(meDocType);
+ pOptions->GetScale( nX, nY );
+
+ // Allow UI scale only for draw documents.
+ if( eType == DocumentType::Draw )
+ SetUIUnit( static_cast<FieldUnit>(pOptions->GetMetric()), Fraction( nX, nY ) ); // user-defined
+ else
+ SetUIUnit( static_cast<FieldUnit>(pOptions->GetMetric()), Fraction( 1, 1 ) ); // default
+
+ SetScaleUnit(MapUnit::Map100thMM);
+ SetScaleFraction(Fraction(1, 1));
+ SetDefaultFontHeight(o3tl::convert(24, o3tl::Length::pt, o3tl::Length::mm100));
+
+ m_pItemPool->SetDefaultMetric(MapUnit::Map100thMM);
+ m_pItemPool->FreezeIdRanges();
+ SetTextDefaults();
+
+ // DrawingEngine has to know where it is...
+ FmFormModel::SetStyleSheetPool( new SdStyleSheetPool( GetPool(), this ) );
+
+ // Set StyleSheetPool for DrawOutliner, so text objects can be read correctly.
+ // The link to the StyleRequest handler of the document is set later, in
+ // NewOrLoadCompleted, because only then do all the templates exist.
+ SdrOutliner& rOutliner = GetDrawOutliner();
+ rOutliner.SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(GetStyleSheetPool()));
+ SetCalcFieldValueHdl( &rOutliner );
+
+ // set linguistic options
+ if (!utl::ConfigManager::IsFuzzing())
+ {
+ const SvtLinguConfig aLinguConfig;
+ SvtLinguOptions aOptions;
+ aLinguConfig.GetOptions( aOptions );
+
+ SetLanguage( MsLangId::resolveSystemLanguageByScriptType(aOptions.nDefaultLanguage,
+ css::i18n::ScriptType::LATIN), EE_CHAR_LANGUAGE );
+ SetLanguage( MsLangId::resolveSystemLanguageByScriptType(aOptions.nDefaultLanguage_CJK,
+ css::i18n::ScriptType::ASIAN), EE_CHAR_LANGUAGE_CJK );
+ SetLanguage( MsLangId::resolveSystemLanguageByScriptType(aOptions.nDefaultLanguage_CTL,
+ css::i18n::ScriptType::COMPLEX), EE_CHAR_LANGUAGE_CTL );
+
+ mbOnlineSpell = aOptions.bIsSpellAuto;
+ }
+
+ LanguageType eRealLanguage = MsLangId::getRealLanguage( meLanguage );
+ mpCharClass.reset(new CharClass( LanguageTag( eRealLanguage) ));
+
+ // If the current application language is a language that uses right-to-left text...
+ LanguageType eRealCTLLanguage = Application::GetSettings().GetLanguageTag().getLanguageType();
+
+ // for korean and japanese languages we have a different default for apply spacing between asian, latin and ctl text
+ if (MsLangId::isKorean(eRealCTLLanguage) || (LANGUAGE_JAPANESE == eRealCTLLanguage))
+ {
+ GetPool().GetSecondaryPool()->SetPoolDefaultItem( SvxScriptSpaceItem( false, EE_PARA_ASIANCJKSPACING ) );
+ }
+
+ // Set DefTab and SpellOptions for the SD module
+ sal_uInt16 nDefTab = pOptions->GetDefTab();
+ SetDefaultTabulator( nDefTab );
+
+ try
+ {
+ Reference< XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() );
+ if ( xSpellChecker.is() )
+ rOutliner.SetSpeller( xSpellChecker );
+
+ Reference< XHyphenator > xHyphenator( LinguMgr::GetHyphenator() );
+ if( xHyphenator.is() )
+ rOutliner.SetHyphenator( xHyphenator );
+
+ SetForbiddenCharsTable(SvxForbiddenCharactersTable::makeForbiddenCharactersTable(::comphelper::getProcessComponentContext()));
+ }
+ catch(...)
+ {
+ OSL_FAIL("Can't get SpellChecker");
+ }
+
+ rOutliner.SetDefaultLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() );
+
+ if (mpDocSh)
+ {
+ SetLinkManager( new sfx2::LinkManager(mpDocSh) );
+ }
+
+ EEControlBits nCntrl = rOutliner.GetControlWord();
+ nCntrl |= EEControlBits::ALLOWBIGOBJS;
+
+ if (mbOnlineSpell)
+ nCntrl |= EEControlBits::ONLINESPELLING;
+ else
+ nCntrl &= ~EEControlBits::ONLINESPELLING;
+
+ nCntrl &= ~ EEControlBits::ULSPACESUMMATION;
+ if ( meDocType != DocumentType::Impress )
+ SetSummationOfParagraphs( false );
+ else
+ {
+ SetSummationOfParagraphs( pOptions->IsSummationOfParagraphs() );
+ if ( pOptions->IsSummationOfParagraphs() )
+ nCntrl |= EEControlBits::ULSPACESUMMATION;
+ }
+ rOutliner.SetControlWord(nCntrl);
+
+ // Initialize the printer independent layout mode
+ SetPrinterIndependentLayout (pOptions->GetPrinterIndependentLayout());
+
+ // Set the StyleSheetPool for HitTestOutliner.
+ // The link to the StyleRequest handler of the document is set later, in
+ // NewOrLoadCompleted, because only then do all the templates exist.
+ m_pHitTestOutliner->SetStyleSheetPool( static_cast<SfxStyleSheetPool*>(GetStyleSheetPool()) );
+
+ SetCalcFieldValueHdl( m_pHitTestOutliner.get() );
+
+ try
+ {
+ Reference< XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() );
+ if ( xSpellChecker.is() )
+ m_pHitTestOutliner->SetSpeller( xSpellChecker );
+
+ Reference< XHyphenator > xHyphenator( LinguMgr::GetHyphenator() );
+ if( xHyphenator.is() )
+ m_pHitTestOutliner->SetHyphenator( xHyphenator );
+ }
+ catch(...)
+ {
+ OSL_FAIL("Can't get SpellChecker");
+ }
+
+ m_pHitTestOutliner->SetDefaultLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() );
+
+ EEControlBits nCntrl2 = m_pHitTestOutliner->GetControlWord();
+ nCntrl2 |= EEControlBits::ALLOWBIGOBJS;
+ nCntrl2 &= ~EEControlBits::ONLINESPELLING;
+
+ nCntrl2 &= ~ EEControlBits::ULSPACESUMMATION;
+ if ( pOptions->IsSummationOfParagraphs() )
+ nCntrl2 |= EEControlBits::ULSPACESUMMATION;
+
+ m_pHitTestOutliner->SetControlWord( nCntrl2 );
+
+ /** Create layers
+ *
+ * We create the following default layers on all pages and master pages:
+ *
+ * sUNO_LayerName_layout; "layout": default layer for drawing objects of normal pages
+ * localized by SdResId(STR_LAYER_LAYOUT)
+ *
+ * sUNO_LayerName_background; "background": background of the master page
+ * localized by SdResId(STR_LAYER_BCKGRND)
+ * (currently unused within normal pages and not visible to users)
+ *
+ * sUNO_LayerName_background_objects; "backgroundobjects": objects on the background of master pages
+ * localized by SdResId(STR_LAYER_BCKGRNDOBJ)
+ * (currently unused within normal pages)
+ *
+ * sUNO_LayerName_controls; "controls": default layer for controls
+ * localized by SdResId(STR_LAYER_CONTROLS)
+ * (currently special handling in regard to z-order)
+ *
+ * sUNO_LayerName_measurelines; "measurelines" : default layer for measure lines
+ * localized by SdResId(STR_LAYER_MEASURELINES)
+ */
+
+ {
+ SdrLayerAdmin& rLayerAdmin = GetLayerAdmin();
+ rLayerAdmin.NewLayer( sUNO_LayerName_layout );
+ rLayerAdmin.NewLayer( sUNO_LayerName_background );
+ rLayerAdmin.NewLayer( sUNO_LayerName_background_objects );
+ rLayerAdmin.NewLayer( sUNO_LayerName_controls);
+ rLayerAdmin.NewLayer( sUNO_LayerName_measurelines );
+
+ rLayerAdmin.SetControlLayerName(sUNO_LayerName_controls);
+ }
+
+}
+
+// Destructor
+SdDrawDocument::~SdDrawDocument()
+{
+ Broadcast(SdrHint(SdrHintKind::ModelCleared));
+
+ if (mpWorkStartupTimer)
+ {
+ if ( mpWorkStartupTimer->IsActive() )
+ mpWorkStartupTimer->Stop();
+
+ mpWorkStartupTimer.reset();
+ }
+
+ StopOnlineSpelling();
+ mpOnlineSearchItem.reset();
+
+ CloseBookmarkDoc();
+ SetAllocDocSh(false);
+
+ ClearModel(true);
+
+ if (m_pLinkManager)
+ {
+ // Release BaseLinks
+ if ( !m_pLinkManager->GetLinks().empty() )
+ {
+ m_pLinkManager->Remove( 0, m_pLinkManager->GetLinks().size() );
+ }
+
+ delete m_pLinkManager;
+ m_pLinkManager = nullptr;
+ }
+
+ maFrameViewList.clear();
+ mpCustomShowList.reset();
+ mpOutliner.reset();
+ mpInternalOutliner.reset();
+ mpCharClass.reset();
+}
+
+void SdDrawDocument::adaptSizeAndBorderForAllPages(
+ const Size& rNewSize,
+ ::tools::Long nLeft,
+ ::tools::Long nRight,
+ ::tools::Long nUpper,
+ ::tools::Long nLower)
+{
+ const sal_uInt16 nMasterPageCnt(GetMasterSdPageCount(PageKind::Standard));
+ const sal_uInt16 nPageCnt(GetSdPageCount(PageKind::Standard));
+
+ if(0 == nMasterPageCnt && 0 == nPageCnt)
+ {
+ return;
+ }
+
+ SdPage* pPage(0 != nPageCnt ? GetSdPage(0, PageKind::Standard) : GetMasterSdPage(0, PageKind::Standard));
+
+ // call fully implemented local version, including getting
+ // some more information from one of the Pages (1st one)
+ AdaptPageSizeForAllPages(
+ rNewSize,
+ PageKind::Standard,
+ nullptr,
+ nLeft,
+ nRight,
+ nUpper,
+ nLower,
+ true,
+ pPage->GetOrientation(),
+ pPage->GetPaperBin(),
+ pPage->IsBackgroundFullSize());
+
+ // adjust handout page to new format of the standard page
+ if(0 != nPageCnt)
+ {
+ GetSdPage(0, PageKind::Handout)->CreateTitleAndLayout(true);
+ }
+}
+
+void SdDrawDocument::AdaptPageSizeForAllPages(
+ const Size& rNewSize,
+ PageKind ePageKind,
+ SdUndoGroup* pUndoGroup,
+ ::tools::Long nLeft,
+ ::tools::Long nRight,
+ ::tools::Long nUpper,
+ ::tools::Long nLower,
+ bool bScaleAll,
+ Orientation eOrientation,
+ sal_uInt16 nPaperBin,
+ bool bBackgroundFullSize)
+{
+ sal_uInt16 i;
+ const sal_uInt16 nMasterPageCnt(GetMasterSdPageCount(ePageKind));
+ const sal_uInt16 nPageCnt(GetSdPageCount(ePageKind));
+
+ if(0 == nMasterPageCnt && 0 == nPageCnt)
+ {
+ return;
+ }
+
+ for (i = 0; i < nMasterPageCnt; i++)
+ {
+ // first, handle all master pages
+ SdPage* pPage(GetMasterSdPage(i, ePageKind));
+
+ if(pUndoGroup)
+ {
+ SdUndoAction* pUndo(
+ new SdPageFormatUndoAction(
+ this,
+ pPage,
+ pPage->GetSize(),
+ pPage->GetLeftBorder(), pPage->GetRightBorder(),
+ pPage->GetUpperBorder(), pPage->GetLowerBorder(),
+ pPage->GetOrientation(),
+ pPage->GetPaperBin(),
+ pPage->IsBackgroundFullSize(),
+ rNewSize,
+ nLeft, nRight,
+ nUpper, nLower,
+ bScaleAll,
+ eOrientation,
+ nPaperBin,
+ bBackgroundFullSize));
+ pUndoGroup->AddAction(pUndo);
+ }
+
+ if (rNewSize.Width() > 0 || nLeft >= 0 || nRight >= 0 || nUpper >= 0 || nLower >= 0)
+ {
+ ::tools::Rectangle aNewBorderRect(nLeft, nUpper, nRight, nLower);
+ pPage->ScaleObjects(rNewSize, aNewBorderRect, bScaleAll);
+
+ if (rNewSize.Width() > 0)
+ {
+ pPage->SetSize(rNewSize);
+ }
+ }
+
+ if( nLeft >= 0 || nRight >= 0 || nUpper >= 0 || nLower >= 0 )
+ {
+ pPage->SetBorder(nLeft, nUpper, nRight, nLower);
+ }
+
+ pPage->SetOrientation(eOrientation);
+ pPage->SetPaperBin( nPaperBin );
+ pPage->SetBackgroundFullSize( bBackgroundFullSize );
+
+ if ( ePageKind == PageKind::Standard )
+ {
+ GetMasterSdPage(i, PageKind::Notes)->CreateTitleAndLayout();
+ }
+
+ pPage->CreateTitleAndLayout();
+ }
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ // then, handle all pages
+ SdPage* pPage(GetSdPage(i, ePageKind));
+
+ if(pUndoGroup)
+ {
+ SdUndoAction* pUndo(
+ new SdPageFormatUndoAction(
+ this,
+ pPage,
+ pPage->GetSize(),
+ pPage->GetLeftBorder(), pPage->GetRightBorder(),
+ pPage->GetUpperBorder(), pPage->GetLowerBorder(),
+ pPage->GetOrientation(),
+ pPage->GetPaperBin(),
+ pPage->IsBackgroundFullSize(),
+ rNewSize,
+ nLeft, nRight,
+ nUpper, nLower,
+ bScaleAll,
+ eOrientation,
+ nPaperBin,
+ bBackgroundFullSize));
+ pUndoGroup->AddAction(pUndo);
+ }
+
+ if (rNewSize.Width() > 0 || nLeft >= 0 || nRight >= 0 || nUpper >= 0 || nLower >= 0)
+ {
+ ::tools::Rectangle aNewBorderRect(nLeft, nUpper, nRight, nLower);
+ pPage->ScaleObjects(rNewSize, aNewBorderRect, bScaleAll);
+
+ if (rNewSize.Width() > 0)
+ {
+ pPage->SetSize(rNewSize);
+ }
+ }
+
+ if( nLeft >= 0 || nRight >= 0 || nUpper >= 0 || nLower >= 0 )
+ {
+ pPage->SetBorder(nLeft, nUpper, nRight, nLower);
+ }
+
+ pPage->SetOrientation(eOrientation);
+ pPage->SetPaperBin( nPaperBin );
+ pPage->SetBackgroundFullSize( bBackgroundFullSize );
+
+ if ( ePageKind == PageKind::Standard )
+ {
+ SdPage* pNotesPage = GetSdPage(i, PageKind::Notes);
+ pNotesPage->SetAutoLayout( pNotesPage->GetAutoLayout() );
+ }
+
+ pPage->SetAutoLayout( pPage->GetAutoLayout() );
+ }
+}
+
+SdrModel* SdDrawDocument::AllocModel() const
+{
+ return AllocSdDrawDocument();
+}
+
+namespace
+{
+
+/// Copies all user-defined properties from pSource to pDestination.
+void lcl_copyUserDefinedProperties(const SfxObjectShell* pSource, const SfxObjectShell* pDestination)
+{
+ if (!pSource || !pDestination)
+ return;
+
+ uno::Reference<document::XDocumentProperties> xSource = pSource->getDocProperties();
+ uno::Reference<document::XDocumentProperties> xDestination = pDestination->getDocProperties();
+ uno::Reference<beans::XPropertyContainer> xSourcePropertyContainer = xSource->getUserDefinedProperties();
+ uno::Reference<beans::XPropertyContainer> xDestinationPropertyContainer = xDestination->getUserDefinedProperties();
+ uno::Reference<beans::XPropertySet> xSourcePropertySet(xSourcePropertyContainer, uno::UNO_QUERY);
+ const uno::Sequence<beans::Property> aProperties = xSourcePropertySet->getPropertySetInfo()->getProperties();
+
+ for (const beans::Property& rProperty : aProperties)
+ {
+ const OUString& rKey = rProperty.Name;
+ uno::Any aValue = xSourcePropertySet->getPropertyValue(rKey);
+ // We know that pDestination was just created, so has no properties: addProperty() will never throw.
+ xDestinationPropertyContainer->addProperty(rKey, beans::PropertyAttribute::REMOVABLE, aValue);
+ }
+}
+
+}
+
+// This method creates a new document (SdDrawDocument) and returns a pointer to
+// said document. The drawing engine uses this method to put the document (or
+// parts of it) into the clipboard/DragServer.
+SdDrawDocument* SdDrawDocument::AllocSdDrawDocument() const
+{
+ SdDrawDocument* pNewModel = nullptr;
+
+ if( mpCreatingTransferable )
+ {
+ // Document is created for drag & drop/clipboard. To be able to
+ // do this, the document has to know a DocShell (SvPersist).
+ SfxObjectShell* pObj = nullptr;
+ ::sd::DrawDocShell* pNewDocSh = nullptr;
+
+ if( meDocType == DocumentType::Impress )
+ mpCreatingTransferable->SetDocShell( new ::sd::DrawDocShell(
+ SfxObjectCreateMode::EMBEDDED, true, meDocType ) );
+ else
+ mpCreatingTransferable->SetDocShell( new ::sd::GraphicDocShell(
+ SfxObjectCreateMode::EMBEDDED ) );
+
+ pObj = mpCreatingTransferable->GetDocShell().get();
+ pNewDocSh = static_cast< ::sd::DrawDocShell*>( pObj );
+ pNewDocSh->DoInitNew();
+ pNewModel = pNewDocSh->GetDoc();
+
+ // Only necessary for clipboard -
+ // for drag & drop this is handled by DragServer
+ SdStyleSheetPool* pOldStylePool = static_cast<SdStyleSheetPool*>( GetStyleSheetPool() );
+ SdStyleSheetPool* pNewStylePool = static_cast<SdStyleSheetPool*>( pNewModel->GetStyleSheetPool() );
+
+ pNewStylePool->CopyGraphicSheets(*pOldStylePool);
+ pNewStylePool->CopyCellSheets(*pOldStylePool);
+ pNewStylePool->CopyTableStyles(*pOldStylePool);
+
+ for (sal_uInt16 i = 0; i < GetMasterSdPageCount(PageKind::Standard); i++)
+ {
+ // Move with all of the master page's layouts
+ OUString aOldLayoutName(const_cast<SdDrawDocument*>(this)->GetMasterSdPage(i, PageKind::Standard)->GetLayoutName());
+ aOldLayoutName = aOldLayoutName.copy( 0, aOldLayoutName.indexOf( SD_LT_SEPARATOR ) );
+ StyleSheetCopyResultVector aCreatedSheets;
+ pNewStylePool->CopyLayoutSheets(aOldLayoutName, *pOldStylePool, aCreatedSheets );
+ }
+
+ lcl_copyUserDefinedProperties(GetDocSh(), pNewDocSh);
+
+ pNewModel->NewOrLoadCompleted( DocCreationMode::Loaded ); // loaded from source document
+ }
+ else if( mbAllocDocSh )
+ {
+ // Create a DocShell which is then returned with GetAllocedDocSh()
+ SdDrawDocument* pDoc = const_cast<SdDrawDocument*>(this);
+ pDoc->SetAllocDocSh(false);
+ pDoc->mxAllocedDocShRef = new ::sd::DrawDocShell(
+ SfxObjectCreateMode::EMBEDDED, true, meDocType);
+ pDoc->mxAllocedDocShRef->DoInitNew();
+ pNewModel = pDoc->mxAllocedDocShRef->GetDoc();
+ }
+ else
+ {
+ pNewModel = new SdDrawDocument(meDocType, nullptr);
+ }
+
+ return pNewModel;
+}
+
+rtl::Reference<SdPage> SdDrawDocument::AllocSdPage(bool bMasterPage)
+{
+ return new SdPage(*this, bMasterPage);
+}
+
+// This method creates a new page (SdPage) and returns a pointer to said page.
+// The drawing engine uses this method to create pages (whose types it does
+// not know, as they are _derivatives_ of SdrPage) when loading.
+rtl::Reference<SdrPage> SdDrawDocument::AllocPage(bool bMasterPage)
+{
+ return AllocSdPage(bMasterPage);
+}
+
+// When the model has changed
+void SdDrawDocument::SetChanged(bool bFlag)
+{
+ if (mpDocSh)
+ {
+ if (mbNewOrLoadCompleted && mpDocSh->IsEnableSetModified())
+ {
+ // Pass on to base class
+ FmFormModel::SetChanged(bFlag);
+
+ // Forward to ObjectShell
+ mpDocSh->SetModified(bFlag);
+ }
+ }
+ else
+ {
+ // Pass on to base class
+ FmFormModel::SetChanged(bFlag);
+ }
+}
+
+// The model changed, don't call anything else
+void SdDrawDocument::NbcSetChanged(bool bFlag)
+{
+ // forward to baseclass
+ FmFormModel::SetChanged(bFlag);
+}
+
+// NewOrLoadCompleted is called when the document is loaded, or when it is clear
+// it won't load any more.
+void SdDrawDocument::NewOrLoadCompleted(DocCreationMode eMode)
+{
+ if (eMode == DocCreationMode::New)
+ {
+ // New document:
+ // create slideshow and default templates,
+ // create pool for virtual controls
+ CreateLayoutTemplates();
+ CreateDefaultCellStyles();
+
+ static_cast< SdStyleSheetPool* >( mxStyleSheetPool.get() )->CreatePseudosIfNecessary();
+ }
+ else if (eMode == DocCreationMode::Loaded)
+ {
+ // Document has finished loading
+
+ CheckMasterPages();
+
+ if ( GetMasterSdPageCount(PageKind::Standard) > 1 )
+ RemoveUnnecessaryMasterPages( nullptr, true, false );
+
+ for ( sal_uInt16 i = 0; i < GetPageCount(); i++ )
+ {
+ // Check for correct layout names
+ SdPage* pPage = static_cast<SdPage*>( GetPage( i ) );
+
+ if(pPage->TRG_HasMasterPage())
+ {
+ SdPage& rMaster = static_cast<SdPage&>(pPage->TRG_GetMasterPage() );
+
+ if(rMaster.GetLayoutName() != pPage->GetLayoutName())
+ {
+ pPage->SetLayoutName(rMaster.GetLayoutName());
+ }
+ }
+ }
+
+ for ( sal_uInt16 nPage = 0; nPage < GetMasterPageCount(); nPage++)
+ {
+ // LayoutName and PageName must be the same
+ SdPage* pPage = static_cast<SdPage*>( GetMasterPage( nPage ) );
+
+ OUString aName( pPage->GetLayoutName() );
+ aName = aName.copy( 0, aName.indexOf( SD_LT_SEPARATOR ) );
+
+ if( aName != pPage->GetName() )
+ pPage->SetName( aName );
+ }
+
+ // Create names of the styles in the user's language
+ static_cast<SdStyleSheetPool*>(mxStyleSheetPool.get())->UpdateStdNames();
+
+ // Create any missing styles - eg. formerly, there was no Subtitle style
+ static_cast<SdStyleSheetPool*>(mxStyleSheetPool.get())->CreatePseudosIfNecessary();
+ }
+
+ // Set default style of Drawing Engine
+ OUString aName( SdResId(STR_STANDARD_STYLESHEET_NAME));
+ SetDefaultStyleSheet(static_cast<SfxStyleSheet*>(mxStyleSheetPool->Find(aName, SfxStyleFamily::Para)));
+
+ // #i119287# Set default StyleSheet for SdrGrafObj and SdrOle2Obj
+ SetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj(static_cast<SfxStyleSheet*>(mxStyleSheetPool->Find(SdResId(STR_POOLSHEET_OBJNOLINENOFILL), SfxStyleFamily::Para)));
+
+ // Initialize DrawOutliner and DocumentOutliner, but don't initialize the
+ // global outliner, as it is not document specific like StyleSheetPool and
+ // StyleRequestHandler are.
+ ::Outliner& rDrawOutliner = GetDrawOutliner();
+ rDrawOutliner.SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(GetStyleSheetPool()));
+ EEControlBits nCntrl = rDrawOutliner.GetControlWord();
+ if (mbOnlineSpell)
+ nCntrl |= EEControlBits::ONLINESPELLING;
+ else
+ nCntrl &= ~EEControlBits::ONLINESPELLING;
+ rDrawOutliner.SetControlWord(nCntrl);
+
+ // Initialize HitTestOutliner and DocumentOutliner, but don't initialize the
+ // global outliner, as it is not document specific like StyleSheetPool and
+ // StyleRequestHandler are.
+ m_pHitTestOutliner->SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(GetStyleSheetPool()));
+
+ if(mpOutliner)
+ {
+ mpOutliner->SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(GetStyleSheetPool()));
+ }
+ if(mpInternalOutliner)
+ {
+ mpInternalOutliner->SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(GetStyleSheetPool()));
+ }
+
+ if ( eMode == DocCreationMode::Loaded )
+ {
+ // Make presentation objects listeners of the appropriate styles
+ SdStyleSheetPool* pSPool = static_cast<SdStyleSheetPool*>( GetStyleSheetPool() );
+ sal_uInt16 nPage, nPageCount;
+
+ // create missing layout style sheets for broken documents
+ // that were created with the 5.2
+ nPageCount = GetMasterSdPageCount( PageKind::Standard );
+ for (nPage = 0; nPage < nPageCount; nPage++)
+ {
+ SdPage* pPage = GetMasterSdPage(nPage, PageKind::Standard);
+ pSPool->CreateLayoutStyleSheets( pPage->GetName(), true );
+ }
+
+ // Default and notes pages:
+ for (nPage = 0; nPage < GetPageCount(); nPage++)
+ {
+ SdPage* pPage = static_cast<SdPage*>(GetPage(nPage));
+ NewOrLoadCompleted( pPage, pSPool );
+ }
+
+ // Master pages:
+ for (nPage = 0; nPage < GetMasterPageCount(); nPage++)
+ {
+ SdPage* pPage = static_cast<SdPage*>(GetMasterPage(nPage));
+
+ NewOrLoadCompleted( pPage, pSPool );
+ }
+ }
+
+ mbNewOrLoadCompleted = true;
+ UpdateAllLinks();
+ SetChanged( false );
+}
+
+/** updates all links, only links in this document should by resolved */
+void SdDrawDocument::UpdateAllLinks()
+{
+ if (s_pDocLockedInsertingLinks || !m_pLinkManager || m_pLinkManager->GetLinks().empty())
+ return;
+
+ s_pDocLockedInsertingLinks = this; // lock inserting links. only links in this document should by resolved
+
+ if (mpDocSh)
+ {
+ comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = mpDocSh->getEmbeddedObjectContainer();
+ rEmbeddedObjectContainer.setUserAllowsLinkUpdate(true);
+ }
+
+ m_pLinkManager->UpdateAllLinks(true, false, nullptr); // query box: update all links?
+
+ if (s_pDocLockedInsertingLinks == this)
+ s_pDocLockedInsertingLinks = nullptr; // unlock inserting links
+}
+
+/** this loops over the presentation objects of a page and repairs some new settings
+ from old binary files and resets all default strings for empty presentation objects.
+*/
+void SdDrawDocument::NewOrLoadCompleted( SdPage* pPage, SdStyleSheetPool* pSPool )
+{
+ sd::ShapeList& rPresentationShapes( pPage->GetPresentationShapeList() );
+ if(rPresentationShapes.isEmpty())
+ return;
+
+ // Create lists of title and outline styles
+ OUString aName = pPage->GetLayoutName();
+ aName = aName.copy( 0, aName.indexOf( SD_LT_SEPARATOR ) );
+
+ std::vector<SfxStyleSheetBase*> aOutlineList;
+ pSPool->CreateOutlineSheetList(aName,aOutlineList);
+
+ SfxStyleSheet* pTitleSheet = static_cast<SfxStyleSheet*>(pSPool->GetTitleSheet(aName));
+
+ SdrObject* pObj = nullptr;
+ rPresentationShapes.seekShape(0);
+
+ // Now look for title and outline text objects, then make those objects
+ // listeners.
+ while( (pObj = rPresentationShapes.getNextShape()) )
+ {
+ if (pObj->GetObjInventor() == SdrInventor::Default)
+ {
+ OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject();
+ SdrObjKind nId = pObj->GetObjIdentifier();
+
+ if (nId == SdrObjKind::TitleText)
+ {
+ if( pOPO && pOPO->GetOutlinerMode() == OutlinerMode::DontKnow )
+ pOPO->SetOutlinerMode( OutlinerMode::TitleObject );
+
+ // sal_True: don't delete "hard" attributes when doing this.
+ if (pTitleSheet)
+ pObj->SetStyleSheet(pTitleSheet, true);
+ }
+ else if (nId == SdrObjKind::OutlineText)
+ {
+ if( pOPO && pOPO->GetOutlinerMode() == OutlinerMode::DontKnow )
+ pOPO->SetOutlinerMode( OutlinerMode::OutlineObject );
+
+ std::vector<SfxStyleSheetBase*>::iterator iter;
+ for (iter = aOutlineList.begin(); iter != aOutlineList.end(); ++iter)
+ {
+ SfxStyleSheet* pSheet = static_cast<SfxStyleSheet*>(*iter);
+
+ if (pSheet)
+ {
+ pObj->StartListening(*pSheet);
+
+ if( iter == aOutlineList.begin())
+ // text frame listens to stylesheet of layer 1
+ pObj->NbcSetStyleSheet(pSheet, true);
+ }
+ }
+ }
+
+ if( auto pTextObj = dynamic_cast<SdrTextObj *>( pObj ) )
+ if (pTextObj->IsEmptyPresObj())
+ {
+ PresObjKind ePresObjKind = pPage->GetPresObjKind(pObj);
+ OUString aString( pPage->GetPresObjText(ePresObjKind) );
+
+ if (!aString.isEmpty())
+ {
+ SdOutliner* pInternalOutl = GetInternalOutliner();
+ pPage->SetObjText( pTextObj, pInternalOutl, ePresObjKind, aString );
+ pObj->NbcSetStyleSheet( pPage->GetStyleSheetForPresObj( ePresObjKind ), true );
+ pInternalOutl->Clear();
+ }
+ }
+ }
+ }
+}
+
+// Local outliner that is used for outline mode. In this outliner, OutlinerViews
+// may be inserted.
+SdOutliner* SdDrawDocument::GetOutliner(bool bCreateOutliner)
+{
+ if (!mpOutliner && bCreateOutliner)
+ {
+ mpOutliner.reset(new SdOutliner( this, OutlinerMode::TextObject ));
+
+ if (mpDocSh)
+ mpOutliner->SetRefDevice( SD_MOD()->GetVirtualRefDevice() );
+
+ mpOutliner->SetDefTab( m_nDefaultTabulator );
+ mpOutliner->SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(GetStyleSheetPool()));
+ }
+
+ return mpOutliner.get();
+}
+
+// Internal outliner that is used to create text objects. We don't insert any
+// OutlinerViews into this outliner!
+SdOutliner* SdDrawDocument::GetInternalOutliner(bool bCreateOutliner)
+{
+ if ( !mpInternalOutliner && bCreateOutliner )
+ {
+ mpInternalOutliner.reset( new SdOutliner( this, OutlinerMode::TextObject ) );
+
+ // This outliner is only used to create special text objects. As no
+ // information about portions is saved in this outliner, the update mode
+ // can/should always remain sal_False.
+ mpInternalOutliner->SetUpdateLayout( false );
+ mpInternalOutliner->EnableUndo( false );
+
+ if (mpDocSh)
+ mpInternalOutliner->SetRefDevice( SD_MOD()->GetVirtualRefDevice() );
+
+ mpInternalOutliner->SetDefTab( m_nDefaultTabulator );
+ mpInternalOutliner->SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(GetStyleSheetPool()));
+ }
+
+ DBG_ASSERT( !mpInternalOutliner || ( ! mpInternalOutliner->IsUpdateLayout() ) , "InternalOutliner: UpdateMode = sal_True !" );
+ DBG_ASSERT( !mpInternalOutliner || ( ! mpInternalOutliner->IsUndoEnabled() ), "InternalOutliner: Undo = sal_True !" );
+
+ // If you add stuff here, always clear it out.
+ // Advantages:
+ // a) no unnecessary Clear calls
+ // b) no wasted memory
+ DBG_ASSERT( !mpInternalOutliner || ( ( mpInternalOutliner->GetParagraphCount() == 1 ) && ( mpInternalOutliner->GetText( mpInternalOutliner->GetParagraph( 0 ) ).isEmpty() ) ), "InternalOutliner: not empty!" );
+
+ return mpInternalOutliner.get();
+}
+
+// OnlineSpelling on/off
+void SdDrawDocument::SetOnlineSpell(bool bIn)
+{
+ mbOnlineSpell = bIn;
+ EEControlBits nCntrl;
+
+ if(mpOutliner)
+ {
+ nCntrl = mpOutliner->GetControlWord();
+
+ if(mbOnlineSpell)
+ nCntrl |= EEControlBits::ONLINESPELLING;
+ else
+ nCntrl &= ~EEControlBits::ONLINESPELLING;
+
+ mpOutliner->SetControlWord(nCntrl);
+ }
+
+ if (mpInternalOutliner)
+ {
+ nCntrl = mpInternalOutliner->GetControlWord();
+
+ if (mbOnlineSpell)
+ nCntrl |= EEControlBits::ONLINESPELLING;
+ else
+ nCntrl &= ~EEControlBits::ONLINESPELLING;
+
+ mpInternalOutliner->SetControlWord(nCntrl);
+ }
+
+ ::Outliner& rOutliner = GetDrawOutliner();
+
+ nCntrl = rOutliner.GetControlWord();
+
+ if (mbOnlineSpell)
+ nCntrl |= EEControlBits::ONLINESPELLING;
+ else
+ nCntrl &= ~EEControlBits::ONLINESPELLING;
+
+ rOutliner.SetControlWord(nCntrl);
+
+ if (mbOnlineSpell)
+ {
+ StartOnlineSpelling();
+ }
+ else
+ {
+ StopOnlineSpelling();
+ }
+}
+
+// OnlineSpelling: highlighting on/off
+uno::Reference< uno::XInterface > SdDrawDocument::createUnoModel()
+{
+ uno::Reference< uno::XInterface > xModel;
+
+ try
+ {
+ if ( mpDocSh )
+ xModel = mpDocSh->GetModel();
+ }
+ catch( uno::RuntimeException& )
+ {
+ }
+
+ return xModel;
+}
+
+SvxNumType SdDrawDocument::GetPageNumType() const
+{
+ return mePageNumType;
+}
+
+void SdDrawDocument::SetPrinterIndependentLayout (sal_Int32 nMode)
+{
+ switch (nMode)
+ {
+ case css::document::PrinterIndependentLayout::DISABLED:
+ case css::document::PrinterIndependentLayout::ENABLED:
+ // Just store supported modes and inform the doc shell
+ mnPrinterIndependentLayout = nMode;
+
+ // Since it is possible that a SdDrawDocument is constructed without a
+ // SdDrawDocShell the pointer member mpDocSh needs to be tested
+ // before the call is executed. This is e. g. used for copy/paste.
+ if(mpDocSh)
+ {
+ mpDocSh->UpdateRefDevice ();
+ }
+
+ break;
+
+ default:
+ // Ignore unknown values
+ break;
+ }
+}
+
+void SdDrawDocument::SetStartWithPresentation( bool bStartWithPresentation )
+{
+ mbStartWithPresentation = bStartWithPresentation;
+}
+
+void SdDrawDocument::SetExitAfterPresenting( bool bExitAfterPresenting )
+{
+ mbExitAfterPresenting = bExitAfterPresenting;
+}
+
+void SdDrawDocument::PageListChanged()
+{
+ mpDrawPageListWatcher->Invalidate();
+}
+
+void SdDrawDocument::MasterPageListChanged()
+{
+ mpMasterPageListWatcher->Invalidate();
+}
+
+void SdDrawDocument::SetCalcFieldValueHdl(::Outliner* pOutliner)
+{
+ pOutliner->SetCalcFieldValueHdl(LINK(SD_MOD(), SdModule, CalcFieldValueHdl));
+}
+
+sal_uInt16 SdDrawDocument::GetAnnotationAuthorIndex( const OUString& rAuthor )
+{
+ // force current user to have first color
+ if( maAnnotationAuthors.empty() )
+ {
+ SvtUserOptions aUserOptions;
+ maAnnotationAuthors.push_back( aUserOptions.GetFullName() );
+ }
+
+ auto iter = std::find(maAnnotationAuthors.begin(), maAnnotationAuthors.end(), rAuthor);
+ sal_uInt16 idx = static_cast<sal_uInt16>(std::distance(maAnnotationAuthors.begin(), iter));
+
+ if( idx == maAnnotationAuthors.size() )
+ {
+ maAnnotationAuthors.push_back( rAuthor );
+ }
+
+ return idx;
+}
+
+void SdDrawDocument::InitLayoutVector()
+{
+ if (utl::ConfigManager::IsFuzzing())
+ return;
+
+ const Reference<css::uno::XComponentContext> xContext(
+ ::comphelper::getProcessComponentContext() );
+
+ // get file list from configuration
+ const Sequence< OUString > aFiles(
+ officecfg::Office::Impress::Misc::LayoutListFiles::get() );
+
+ if (aFiles.getLength() == 0)
+ return;
+ const Reference<XDocumentBuilder> xDocBuilder = DocumentBuilder::create( xContext );
+
+ for( const auto& rFile : aFiles )
+ {
+ OUString sFilename = comphelper::getExpandedUri(xContext, rFile);
+
+ // load layout file into DOM
+
+ try
+ {
+ // loop over every layout entry in current file
+ const Reference<XDocument> xDoc = xDocBuilder->parseURI( sFilename );
+ const Reference<XNodeList> layoutlist = xDoc->getElementsByTagName("layout");
+ const int nElements = layoutlist->getLength();
+ for(int index=0; index < nElements; index++)
+ maLayoutInfo.push_back( layoutlist->item(index) );
+ }
+ catch (const uno::Exception &)
+ {
+ // skip missing config. files
+ }
+ }
+}
+
+void SdDrawDocument::InitObjectVector()
+{
+ if (utl::ConfigManager::IsFuzzing())
+ return;
+
+ const Reference<css::uno::XComponentContext> xContext(
+ ::comphelper::getProcessComponentContext() );
+
+ // get file list from configuration
+ const Sequence< OUString > aFiles(
+ officecfg::Office::Impress::Misc::PresObjListFiles::get() );
+
+ if (aFiles.getLength() == 0)
+ return;
+ const Reference<XDocumentBuilder> xDocBuilder = DocumentBuilder::create( xContext );
+ for( const auto& rFile : aFiles )
+ {
+ OUString sFilename = comphelper::getExpandedUri(xContext, rFile);
+
+ // load presentation object file into DOM
+
+ try
+ {
+ // loop over every object entry in current file
+ const Reference<XDocument> xDoc = xDocBuilder->parseURI( sFilename );
+ const Reference<XNodeList> objectlist = xDoc->getElementsByTagName("object");
+ const int nElements = objectlist->getLength();
+ for(int index=0; index < nElements; index++)
+ maPresObjectInfo.push_back( objectlist->item(index) );
+ }
+ catch (const uno::Exception &)
+ {
+ // skip missing config. files
+ }
+ }
+}
+
+void SdDrawDocument::dumpAsXml(xmlTextWriterPtr pWriter) const
+{
+ bool bOwns = false;
+ if (!pWriter)
+ {
+ pWriter = xmlNewTextWriterFilename("model.xml", 0);
+ xmlTextWriterSetIndent(pWriter,1);
+ (void)xmlTextWriterSetIndentString(pWriter, BAD_CAST(" "));
+ (void)xmlTextWriterStartDocument(pWriter, nullptr, nullptr, nullptr);
+ bOwns = true;
+ }
+ (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SdDrawDocument"));
+ (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", this);
+
+ if (mpOutliner)
+ mpOutliner->dumpAsXml(pWriter);
+ FmFormModel::dumpAsXml(pWriter);
+ if (GetUndoManager())
+ GetUndoManager()->dumpAsXml(pWriter);
+
+ (void)xmlTextWriterEndElement(pWriter);
+ if (bOwns)
+ {
+ (void)xmlTextWriterEndDocument(pWriter);
+ xmlFreeTextWriter(pWriter);
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/drawdoc2.cxx b/sd/source/core/drawdoc2.cxx
new file mode 100644
index 000000000..d0187bab0
--- /dev/null
+++ b/sd/source/core/drawdoc2.cxx
@@ -0,0 +1,1382 @@
+/* -*- 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 <vcl/settings.hxx>
+
+#include <sal/log.hxx>
+#include <tools/debug.hxx>
+#include <sfx2/printer.hxx>
+#include <editeng/paperinf.hxx>
+#include <svx/svdopage.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdundo.hxx>
+#include <vcl/svapp.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/langitem.hxx>
+#include <svl/itempool.hxx>
+#include <editeng/flditem.hxx>
+
+#include <sfx2/linkmgr.hxx>
+#include <svx/svdoutl.hxx>
+#include <svx/svdlayer.hxx>
+
+#include <svx/svditer.hxx>
+#include <comphelper/lok.hxx>
+#include <xmloff/autolayout.hxx>
+
+#include <sdresid.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <strings.hrc>
+#include <glob.hxx>
+#include <stlpool.hxx>
+#include <anminfo.hxx>
+#include <undo/undomanager.hxx>
+#include <sfx2/lokhelper.hxx>
+#include <unomodel.hxx>
+
+#include <DrawDocShell.hxx>
+
+#include "PageListWatcher.hxx"
+#include <unokywds.hxx>
+
+using namespace ::sd;
+
+const ::tools::Long PRINT_OFFSET = 30; // see /svx/source/dialog/page.cxx
+
+using namespace com::sun::star;
+
+// Looks up an object by name
+SdrObject* SdDrawDocument::GetObj(std::u16string_view rObjName) const
+{
+ SdrObject* pObj = nullptr;
+ SdrObject* pObjFound = nullptr;
+ const SdPage* pPage = nullptr;
+
+ // First search in all pages
+ sal_uInt16 nPage = 0;
+ const sal_uInt16 nMaxPages = GetPageCount();
+
+ while (nPage < nMaxPages && !pObjFound)
+ {
+ pPage = static_cast<const SdPage*>( GetPage(nPage) );
+ SdrObjListIter aIter(pPage, SdrIterMode::DeepWithGroups);
+
+ while (aIter.IsMore() && !pObjFound)
+ {
+ pObj = aIter.Next();
+
+ if( ( pObj->GetName() == rObjName ) ||
+ ( SdrInventor::Default == pObj->GetObjInventor() &&
+ SdrObjKind::OLE2 == pObj->GetObjIdentifier() &&
+ rObjName == static_cast< SdrOle2Obj* >( pObj )->GetPersistName() ) )
+ {
+ pObjFound = pObj;
+ }
+ }
+
+ nPage++;
+ }
+
+ // If it couldn't be found, look through all master pages
+ nPage = 0;
+ const sal_uInt16 nMaxMasterPages = GetMasterPageCount();
+
+ while (nPage < nMaxMasterPages && !pObjFound)
+ {
+ pPage = static_cast<const SdPage*>( GetMasterPage(nPage) );
+ SdrObjListIter aIter(pPage, SdrIterMode::DeepWithGroups);
+
+ while (aIter.IsMore() && !pObjFound)
+ {
+ pObj = aIter.Next();
+
+ if( ( pObj->GetName() == rObjName ) ||
+ ( SdrInventor::Default == pObj->GetObjInventor() &&
+ SdrObjKind::OLE2 == pObj->GetObjIdentifier() &&
+ rObjName == static_cast< SdrOle2Obj* >( pObj )->GetPersistName() ) )
+ {
+ pObjFound = pObj;
+ }
+ }
+
+ nPage++;
+ }
+
+ return pObjFound;
+}
+
+// Find SdPage by name
+sal_uInt16 SdDrawDocument::GetPageByName(std::u16string_view rPgName, bool& rbIsMasterPage) const
+{
+ SdPage* pPage = nullptr;
+ sal_uInt16 nPage = 0;
+ const sal_uInt16 nMaxPages = GetPageCount();
+ sal_uInt16 nPageNum = SDRPAGE_NOTFOUND;
+
+ rbIsMasterPage = false;
+
+ // Search all regular pages and all notes pages (handout pages are
+ // ignored)
+ while (nPage < nMaxPages && nPageNum == SDRPAGE_NOTFOUND)
+ {
+ pPage = const_cast<SdPage*>(static_cast<const SdPage*>(
+ GetPage(nPage)));
+
+ if (pPage != nullptr
+ && pPage->GetPageKind() != PageKind::Handout
+ && pPage->GetName() == rPgName)
+ {
+ nPageNum = nPage;
+ }
+
+ nPage++;
+ }
+
+ // Search all master pages when not found among non-master pages
+ const sal_uInt16 nMaxMasterPages = GetMasterPageCount();
+ nPage = 0;
+
+ while (nPage < nMaxMasterPages && nPageNum == SDRPAGE_NOTFOUND)
+ {
+ pPage = const_cast<SdPage*>(static_cast<const SdPage*>(
+ GetMasterPage(nPage)));
+
+ if (pPage && pPage->GetName() == rPgName)
+ {
+ nPageNum = nPage;
+ rbIsMasterPage = true;
+ }
+
+ nPage++;
+ }
+
+ return nPageNum;
+}
+
+bool SdDrawDocument::IsPageNameUnique( std::u16string_view rPgName ) const
+{
+ sal_uInt16 nCount = 0;
+ SdPage* pPage = nullptr;
+
+ // Search all regular pages and all notes pages (handout pages are ignored)
+ sal_uInt16 nPage = 0;
+ sal_uInt16 nMaxPages = GetPageCount();
+ while (nPage < nMaxPages)
+ {
+ pPage = const_cast<SdPage*>(static_cast<const SdPage*>(GetPage(nPage)));
+
+ if (pPage && pPage->GetName() == rPgName && pPage->GetPageKind() != PageKind::Handout)
+ nCount++;
+
+ nPage++;
+ }
+
+ // Search all master pages
+ nPage = 0;
+ nMaxPages = GetMasterPageCount();
+ while (nPage < nMaxPages)
+ {
+ pPage = const_cast<SdPage*>(static_cast<const SdPage*>(GetMasterPage(nPage)));
+
+ if (pPage && pPage->GetName() == rPgName)
+ nCount++;
+
+ nPage++;
+ }
+
+ return nCount == 1;
+}
+
+SdPage* SdDrawDocument::GetSdPage(sal_uInt16 nPgNum, PageKind ePgKind) const
+{
+ return mpDrawPageListWatcher->GetSdPage(ePgKind, sal_uInt32(nPgNum));
+}
+
+sal_uInt16 SdDrawDocument::GetSdPageCount(PageKind ePgKind) const
+{
+ return static_cast<sal_uInt16>(mpDrawPageListWatcher->GetSdPageCount(ePgKind));
+}
+
+SdPage* SdDrawDocument::GetMasterSdPage(sal_uInt16 nPgNum, PageKind ePgKind)
+{
+ return mpMasterPageListWatcher->GetSdPage(ePgKind, sal_uInt32(nPgNum));
+}
+
+sal_uInt16 SdDrawDocument::GetMasterSdPageCount(PageKind ePgKind) const
+{
+ return static_cast<sal_uInt16>(mpMasterPageListWatcher->GetSdPageCount(ePgKind));
+}
+
+sal_uInt16 SdDrawDocument::GetActiveSdPageCount() const
+{
+ return static_cast<sal_uInt16>(mpDrawPageListWatcher->GetVisibleSdPageCount());
+}
+
+// Adapt the page numbers that are registered in the page objects of the notes
+// pages
+void SdDrawDocument::UpdatePageObjectsInNotes(sal_uInt16 nStartPos)
+{
+ sal_uInt16 nPageCount = GetPageCount();
+ SdPage* pPage = nullptr;
+
+ for (sal_uInt16 nPage = nStartPos; nPage < nPageCount; nPage++)
+ {
+ pPage = static_cast<SdPage*>( GetPage(nPage) );
+
+ // If this is a notes page, find its page object and correct the page
+ // number
+ if (pPage && pPage->GetPageKind() == PageKind::Notes)
+ {
+ const size_t nObjCount = pPage->GetObjCount();
+ for (size_t nObj = 0; nObj < nObjCount; ++nObj)
+ {
+ SdrObject* pObj = pPage->GetObj(nObj);
+ if (pObj->GetObjIdentifier() == SdrObjKind::Page &&
+ pObj->GetObjInventor() == SdrInventor::Default)
+ {
+ // The page object is the preceding page (drawing page)
+ SAL_WARN_IF(!nStartPos, "sd", "Position of notes page must not be 0.");
+
+ SAL_WARN_IF(nPage <= 1, "sd", "Page object must not be a handout.");
+
+ if (nStartPos > 0 && nPage > 1)
+ static_cast<SdrPageObj*>(pObj)->SetReferencedPage(GetPage(nPage - 1));
+ }
+ }
+ }
+ }
+}
+
+void SdDrawDocument::UpdatePageRelativeURLs(const OUString& rOldName, std::u16string_view rNewName)
+{
+ if (rNewName.empty())
+ return;
+
+ SfxItemPool& rPool(GetPool());
+ for (const SfxPoolItem* pItem : rPool.GetItemSurrogates(EE_FEATURE_FIELD))
+ {
+ const SvxFieldItem* pFldItem = dynamic_cast< const SvxFieldItem * > (pItem);
+
+ if(pFldItem)
+ {
+ SvxURLField* pURLField = const_cast< SvxURLField* >( dynamic_cast<const SvxURLField*>( pFldItem->GetField() ) );
+
+ if(pURLField)
+ {
+ OUString aURL = pURLField->GetURL();
+
+ if (!aURL.isEmpty() && (aURL[0] == 35) && (aURL.indexOf(rOldName, 1) == 1))
+ {
+ if (aURL.getLength() == rOldName.getLength() + 1) // standard page name
+ {
+ aURL = aURL.replaceAt(1, aURL.getLength() - 1, u"") +
+ rNewName;
+ pURLField->SetURL(aURL);
+ }
+ else
+ {
+ const OUString sNotes(SdResId(STR_NOTES));
+ if (aURL.getLength() == rOldName.getLength() + 2 + sNotes.getLength()
+ && aURL.indexOf(sNotes, rOldName.getLength() + 2) == rOldName.getLength() + 2)
+ {
+ aURL = aURL.replaceAt(1, aURL.getLength() - 1, u"") +
+ rNewName + " " + sNotes;
+ pURLField->SetURL(aURL);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void SdDrawDocument::UpdatePageRelativeURLs(SdPage const * pPage, sal_uInt16 nPos, sal_Int32 nIncrement)
+{
+ bool bNotes = (pPage->GetPageKind() == PageKind::Notes);
+
+ SfxItemPool& rPool(GetPool());
+ for (const SfxPoolItem* pItem : rPool.GetItemSurrogates(EE_FEATURE_FIELD))
+ {
+ const SvxFieldItem* pFldItem;
+
+ if ((pFldItem = dynamic_cast< const SvxFieldItem * > (pItem)) != nullptr)
+ {
+ SvxURLField* pURLField = const_cast< SvxURLField* >( dynamic_cast<const SvxURLField*>( pFldItem->GetField() ) );
+
+ if(pURLField)
+ {
+ OUString aURL = pURLField->GetURL();
+
+ if (!aURL.isEmpty() && (aURL[0] == 35))
+ {
+ OUString aHashSlide = "#" + SdResId(STR_PAGE);
+
+ if (aURL.startsWith(aHashSlide))
+ {
+ OUString aURLCopy = aURL;
+ const OUString sNotes(SdResId(STR_NOTES));
+
+ aURLCopy = aURLCopy.replaceAt(0, aHashSlide.getLength(), u"");
+
+ bool bNotesLink = ( aURLCopy.getLength() >= sNotes.getLength() + 3
+ && aURLCopy.endsWith(sNotes) );
+
+ if (bNotesLink != bNotes)
+ continue; // no compatible link and page
+
+ if (bNotes)
+ aURLCopy = aURLCopy.replaceAt(aURLCopy.getLength() - sNotes.getLength(), sNotes.getLength(), u"");
+
+ sal_Int32 number = aURLCopy.toInt32();
+ sal_uInt16 realPageNumber = (nPos + 1)/ 2;
+
+ if ( number >= realPageNumber )
+ {
+ // update link page number
+ number += nIncrement;
+ aURL = aURL.replaceAt(aHashSlide.getLength() + 1, aURL.getLength() - aHashSlide.getLength() - 1, u"") +
+ OUString::number(number);
+ if (bNotes)
+ {
+ aURL += " " + sNotes;
+ }
+ pURLField->SetURL(aURL);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+// Move page
+void SdDrawDocument::MovePage(sal_uInt16 nPgNum, sal_uInt16 nNewPos)
+{
+ FmFormModel::MovePage(nPgNum, nNewPos);
+
+ sal_uInt16 nMin = std::min(nPgNum, nNewPos);
+
+ UpdatePageObjectsInNotes(nMin);
+}
+
+// Insert page
+void SdDrawDocument::InsertPage(SdrPage* pPage, sal_uInt16 nPos)
+{
+ bool bLast = (nPos == GetPageCount());
+
+ FmFormModel::InsertPage(pPage, nPos);
+
+ static_cast<SdPage*>(pPage)->ConnectLink();
+
+ UpdatePageObjectsInNotes(nPos);
+
+ if (!bLast)
+ UpdatePageRelativeURLs(static_cast<SdPage*>( pPage ), nPos, 1);
+
+ if (comphelper::LibreOfficeKit::isActive() && static_cast<SdPage*>(pPage)->GetPageKind() == PageKind::Standard)
+ {
+ SdXImpressDocument* pDoc = comphelper::getFromUnoTunnel<SdXImpressDocument>(this->getUnoModel());
+ SfxLokHelper::notifyDocumentSizeChangedAllViews(pDoc);
+ }
+}
+
+// Delete page
+void SdDrawDocument::DeletePage(sal_uInt16 nPgNum)
+{
+ FmFormModel::DeletePage(nPgNum);
+
+ UpdatePageObjectsInNotes(nPgNum);
+}
+
+// Remove page
+rtl::Reference<SdrPage> SdDrawDocument::RemovePage(sal_uInt16 nPgNum)
+{
+ rtl::Reference<SdrPage> pPage = FmFormModel::RemovePage(nPgNum);
+
+ bool bLast = ((nPgNum+1)/2 == (GetPageCount()+1)/2);
+
+ auto pSdPage = static_cast<SdPage*>(pPage.get());
+ pSdPage->DisconnectLink();
+ ReplacePageInCustomShows( pSdPage, nullptr );
+ UpdatePageObjectsInNotes(nPgNum);
+
+ if (!bLast)
+ UpdatePageRelativeURLs(pSdPage, nPgNum, -1);
+
+ if (comphelper::LibreOfficeKit::isActive() && pSdPage->GetPageKind() == PageKind::Standard)
+ {
+ SdXImpressDocument* pDoc = comphelper::getFromUnoTunnel<SdXImpressDocument>(this->getUnoModel());
+ SfxLokHelper::notifyDocumentSizeChangedAllViews(pDoc);
+ }
+
+ return pPage;
+}
+
+// Warning: This is not called for new master pages created from SdrModel::Merge,
+// you also have to modify code in SdDrawDocument::Merge!
+void SdDrawDocument::InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos )
+{
+ FmFormModel::InsertMasterPage( pPage, nPos );
+ if( pPage->IsMasterPage() && (static_cast<SdPage*>(pPage)->GetPageKind() == PageKind::Standard) )
+ {
+ // new master page created, add its style family
+ SdStyleSheetPool* pStylePool = static_cast<SdStyleSheetPool*>( GetStyleSheetPool() );
+ if( pStylePool )
+ pStylePool->AddStyleFamily( static_cast<SdPage*>(pPage) );
+ }
+}
+
+rtl::Reference<SdrPage> SdDrawDocument::RemoveMasterPage(sal_uInt16 nPgNum)
+{
+ SdPage* pPage = static_cast<SdPage*>(GetMasterPage(nPgNum ));
+ if( pPage && pPage->IsMasterPage() && (pPage->GetPageKind() == PageKind::Standard) )
+ {
+ // master page removed, remove its style family
+ SdStyleSheetPool* pStylePool = static_cast<SdStyleSheetPool*>( GetStyleSheetPool() );
+ if( pStylePool )
+ pStylePool->RemoveStyleFamily( pPage );
+ }
+
+ return FmFormModel::RemoveMasterPage(nPgNum);
+}
+
+//Select pages
+void SdDrawDocument::SetSelected(SdPage* pPage, bool bSelect)
+{
+ PageKind ePageKind = pPage->GetPageKind();
+
+ if (ePageKind == PageKind::Standard)
+ {
+ pPage->SetSelected(bSelect);
+
+ const sal_uInt16 nDestPageNum(pPage->GetPageNum() + 1);
+ SdPage* pNotesPage = nullptr;
+
+ if(nDestPageNum < GetPageCount())
+ {
+ pNotesPage = static_cast<SdPage*>(GetPage(nDestPageNum));
+ }
+
+ if (pNotesPage && pNotesPage->GetPageKind() == PageKind::Notes)
+ {
+ pNotesPage->SetSelected(bSelect);
+ }
+ }
+ else if (ePageKind == PageKind::Notes)
+ {
+ pPage->SetSelected(bSelect);
+ SdPage* pStandardPage = static_cast<SdPage*>( GetPage( pPage->GetPageNum() - 1 ) );
+
+ if (pStandardPage && pStandardPage->GetPageKind() == PageKind::Standard)
+ pStandardPage->SetSelected(bSelect);
+ }
+}
+
+// If no pages exist yet, create them now
+void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = 0 */ )
+{
+ // If no page exists yet in the model, (File -> New), insert a page
+ sal_uInt16 nPageCount = GetPageCount();
+
+ if (nPageCount > 1)
+ return;
+
+ // #i57181# Paper size depends on Language, like in Writer
+ Size aDefSize = SvxPaperInfo::GetDefaultPaperSize( MapUnit::Map100thMM );
+
+ // Insert handout page
+ rtl::Reference<SdPage> pHandoutPage = AllocSdPage(false);
+
+ SdPage* pRefPage = nullptr;
+
+ if( pRefDocument )
+ pRefPage = pRefDocument->GetSdPage( 0, PageKind::Handout );
+
+ if( pRefPage )
+ {
+ pHandoutPage->SetSize(pRefPage->GetSize());
+ pHandoutPage->SetBorder( pRefPage->GetLeftBorder(), pRefPage->GetUpperBorder(), pRefPage->GetRightBorder(), pRefPage->GetLowerBorder() );
+ }
+ else
+ {
+ pHandoutPage->SetSize(aDefSize);
+ pHandoutPage->SetBorder(0, 0, 0, 0);
+ }
+
+ pHandoutPage->SetPageKind(PageKind::Handout);
+ pHandoutPage->SetName( SdResId(STR_HANDOUT) );
+ InsertPage(pHandoutPage.get(), 0);
+
+ // Insert master page and register this with the handout page
+ rtl::Reference<SdPage> pHandoutMPage = AllocSdPage(true);
+ pHandoutMPage->SetSize( pHandoutPage->GetSize() );
+ pHandoutMPage->SetPageKind(PageKind::Handout);
+ pHandoutMPage->SetBorder( pHandoutPage->GetLeftBorder(),
+ pHandoutPage->GetUpperBorder(),
+ pHandoutPage->GetRightBorder(),
+ pHandoutPage->GetLowerBorder() );
+ InsertMasterPage(pHandoutMPage.get(), 0);
+ pHandoutPage->TRG_SetMasterPage( *pHandoutMPage );
+
+ // Insert page
+ // If nPageCount==1 is, the model for the clipboard was created, thus a
+ // default page must already exist
+ rtl::Reference<SdPage> pPage;
+ bool bClipboard = false;
+
+ if( pRefDocument )
+ pRefPage = pRefDocument->GetSdPage( 0, PageKind::Standard );
+
+ if (nPageCount == 0)
+ {
+ pPage = AllocSdPage(false);
+
+ if( pRefPage )
+ {
+ pPage->SetSize( pRefPage->GetSize() );
+ pPage->SetBorder( pRefPage->GetLeftBorder(), pRefPage->GetUpperBorder(), pRefPage->GetRightBorder(), pRefPage->GetLowerBorder() );
+ }
+ else if (meDocType == DocumentType::Draw)
+ {
+ // Draw: always use default size with margins
+ pPage->SetSize(aDefSize);
+
+ SfxPrinter* pPrinter = mpDocSh->GetPrinter(false);
+ if (pPrinter && pPrinter->IsValid())
+ {
+ Size aOutSize(pPrinter->GetOutputSize());
+ Point aPageOffset(pPrinter->GetPageOffset());
+ aPageOffset -= pPrinter->PixelToLogic( Point() );
+ ::tools::Long nOffset = !aPageOffset.X() && !aPageOffset.Y() ? 0 : PRINT_OFFSET;
+
+ sal_uLong nTop = aPageOffset.Y();
+ sal_uLong nLeft = aPageOffset.X();
+ sal_uLong nBottom = std::max(::tools::Long(aDefSize.Height() - aOutSize.Height() - nTop + nOffset), ::tools::Long(0));
+ sal_uLong nRight = std::max(::tools::Long(aDefSize.Width() - aOutSize.Width() - nLeft + nOffset), ::tools::Long(0));
+
+ pPage->SetBorder(nLeft, nTop, nRight, nBottom);
+ }
+ else
+ {
+ // The printer is not available. Use a border of 10mm
+ // on each side instead.
+ // This has to be kept synchronized with the border
+ // width set in the
+ // SvxPageDescPage::PaperSizeSelect_Impl callback.
+ pPage->SetBorder(1000, 1000, 1000, 1000);
+ }
+ }
+ else
+ {
+ // Impress: always use screen format, landscape.
+ Size aSz( SvxPaperInfo::GetPaperSize(PAPER_SCREEN_16_9, MapUnit::Map100thMM) );
+ pPage->SetSize( Size( aSz.Height(), aSz.Width() ) );
+ pPage->SetBorder(0, 0, 0, 0);
+ }
+
+ InsertPage(pPage.get(), 1);
+ }
+ else
+ {
+ bClipboard = true;
+ pPage = static_cast<SdPage*>( GetPage(1) );
+ }
+
+ // Insert master page, then register this with the page
+ rtl::Reference<SdPage> pMPage = AllocSdPage(true);
+ pMPage->SetSize( pPage->GetSize() );
+ pMPage->SetBorder( pPage->GetLeftBorder(),
+ pPage->GetUpperBorder(),
+ pPage->GetRightBorder(),
+ pPage->GetLowerBorder() );
+ InsertMasterPage(pMPage.get(), 1);
+ pPage->TRG_SetMasterPage( *pMPage );
+ if( bClipboard )
+ pMPage->SetLayoutName( pPage->GetLayoutName() );
+
+ // Insert notes page
+ rtl::Reference<SdPage> pNotesPage = AllocSdPage(false);
+
+ if( pRefDocument )
+ pRefPage = pRefDocument->GetSdPage( 0, PageKind::Notes );
+
+ if( pRefPage )
+ {
+ pNotesPage->SetSize( pRefPage->GetSize() );
+ pNotesPage->SetBorder( pRefPage->GetLeftBorder(), pRefPage->GetUpperBorder(), pRefPage->GetRightBorder(), pRefPage->GetLowerBorder() );
+ }
+ else
+ {
+ // Always use portrait format
+ if (aDefSize.Height() >= aDefSize.Width())
+ {
+ pNotesPage->SetSize(aDefSize);
+ }
+ else
+ {
+ pNotesPage->SetSize( Size(aDefSize.Height(), aDefSize.Width()) );
+ }
+
+ pNotesPage->SetBorder(0, 0, 0, 0);
+ }
+ pNotesPage->SetPageKind(PageKind::Notes);
+ InsertPage(pNotesPage.get(), 2);
+ if( bClipboard )
+ pNotesPage->SetLayoutName( pPage->GetLayoutName() );
+
+ // Insert master page, then register this with the notes page
+ rtl::Reference<SdPage> pNotesMPage = AllocSdPage(true);
+ pNotesMPage->SetSize( pNotesPage->GetSize() );
+ pNotesMPage->SetPageKind(PageKind::Notes);
+ pNotesMPage->SetBorder( pNotesPage->GetLeftBorder(),
+ pNotesPage->GetUpperBorder(),
+ pNotesPage->GetRightBorder(),
+ pNotesPage->GetLowerBorder() );
+ InsertMasterPage(pNotesMPage.get(), 2);
+ pNotesPage->TRG_SetMasterPage( *pNotesMPage );
+ if( bClipboard )
+ pNotesMPage->SetLayoutName( pPage->GetLayoutName() );
+
+ if( !pRefPage && (meDocType != DocumentType::Draw) )
+ pPage->SetAutoLayout( AUTOLAYOUT_TITLE, true, true );
+
+ mpWorkStartupTimer.reset( new Timer("DrawWorkStartupTimer") );
+ mpWorkStartupTimer->SetInvokeHandler( LINK(this, SdDrawDocument, WorkStartupHdl) );
+ mpWorkStartupTimer->SetTimeout(2000);
+ mpWorkStartupTimer->Start();
+
+ SetChanged(false);
+}
+
+// Creates missing notes and handout pages (after PowerPoint import).
+// We assume that at least one default page and one default master page exist.
+
+bool SdDrawDocument::CreateMissingNotesAndHandoutPages()
+{
+ bool bOK = false;
+ sal_uInt16 nPageCount = GetPageCount();
+
+ if (nPageCount != 0)
+ {
+ // Set PageKind
+ SdPage* pHandoutMPage = static_cast<SdPage*>( GetMasterPage(0) );
+ pHandoutMPage->SetPageKind(PageKind::Handout);
+
+ SdPage* pHandoutPage = static_cast<SdPage*>( GetPage(0) );
+ pHandoutPage->SetPageKind(PageKind::Handout);
+ pHandoutPage->TRG_SetMasterPage( *pHandoutMPage );
+
+ for (sal_uInt16 i = 1; i < nPageCount; i = i + 2)
+ {
+ SdPage* pPage = static_cast<SdPage*>( GetPage(i) );
+
+ if(!pPage->TRG_HasMasterPage())
+ {
+ // No master page set -> use first default master page
+ // (If there was no default page in the PPT)
+ pPage->TRG_SetMasterPage(*GetMasterPage(1));
+ }
+
+ SdPage* pNotesPage = static_cast<SdPage*>( GetPage(i+1) );
+ pNotesPage->SetPageKind(PageKind::Notes);
+
+ // Set notes master page
+ sal_uInt16 nMasterPageAfterPagesMasterPage = pPage->TRG_GetMasterPage().GetPageNum() + 1;
+ pNotesPage->TRG_SetMasterPage(*GetMasterPage(nMasterPageAfterPagesMasterPage));
+ }
+
+ bOK = true;
+ StopWorkStartupDelay();
+ SetChanged(false);
+ }
+
+ return bOK;
+}
+
+void SdDrawDocument::UnselectAllPages()
+{
+ sal_uInt16 nNoOfPages = GetSdPageCount(PageKind::Standard);
+ for (sal_uInt16 nPage = 0; nPage < nNoOfPages; ++nPage)
+ {
+ SdPage* pPage = GetSdPage(nPage, PageKind::Standard);
+ pPage->SetSelected(false);
+ }
+}
+
+// + Move selected pages after said page
+// (nTargetPage = (sal_uInt16)-1 --> move before first page)
+// + Returns sal_True when the page has been moved
+bool SdDrawDocument::MovePages(sal_uInt16 nTargetPage)
+{
+ SdPage* pPage = nullptr;
+ sal_uInt16 nPage;
+ sal_uInt16 nNoOfPages = GetSdPageCount(PageKind::Standard);
+ bool bSomethingHappened = false;
+
+ const bool bUndo = IsUndoEnabled();
+
+ if( bUndo )
+ BegUndo(SdResId(STR_UNDO_MOVEPAGES));
+
+ // List of selected pages
+ std::vector<SdPage*> aPageList;
+ for (nPage = 0; nPage < nNoOfPages; nPage++)
+ {
+ pPage = GetSdPage(nPage, PageKind::Standard);
+
+ if (pPage->IsSelected()) {
+ aPageList.push_back(pPage);
+ }
+ }
+
+ // If necessary, look backwards, until we find a page that wasn't selected
+ nPage = nTargetPage;
+
+ if (nPage != sal_uInt16(-1))
+ {
+ pPage = GetSdPage(nPage, PageKind::Standard);
+ while (nPage > 0 && pPage->IsSelected())
+ {
+ nPage--;
+ pPage = GetSdPage(nPage, PageKind::Standard);
+ }
+
+ if (pPage->IsSelected())
+ {
+ nPage = sal_uInt16(-1);
+ }
+ }
+
+ // Insert before the first page
+ if (nPage == sal_uInt16(-1))
+ {
+ std::vector<SdPage*>::reverse_iterator iter;
+ for (iter = aPageList.rbegin(); iter != aPageList.rend(); ++iter)
+ {
+ nPage = (*iter)->GetPageNum();
+ if (nPage != 0)
+ {
+ SdrPage* pPg = GetPage(nPage);
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage, 1));
+ MovePage(nPage, 1);
+ pPg = GetPage(nPage+1);
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage+1, 2));
+ MovePage(nPage+1, 2);
+ bSomethingHappened = true;
+ }
+ }
+ }
+ // Insert after <nPage>
+ else
+ {
+ nTargetPage = 2 * nPage + 1; // PageKind::Standard --> absolute
+
+ for (const auto& rpPage : aPageList)
+ {
+ nPage = rpPage->GetPageNum();
+ if (nPage > nTargetPage)
+ {
+ nTargetPage += 2; // Insert _after_ the page
+
+ if (nPage != nTargetPage)
+ {
+ SdrPage* pPg = GetPage(nPage);
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage, nTargetPage));
+ MovePage(nPage, nTargetPage);
+ pPg = GetPage(nPage+1);
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage+1, nTargetPage+1));
+ MovePage(nPage+1, nTargetPage+1);
+ bSomethingHappened = true;
+ }
+ }
+ else
+ {
+ if (nPage != nTargetPage)
+ {
+ SdrPage* pPg = GetPage(nPage+1);
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage+1, nTargetPage+1));
+ MovePage(nPage+1, nTargetPage+1);
+ pPg = GetPage(nPage);
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage, nTargetPage));
+ MovePage(nPage, nTargetPage);
+ bSomethingHappened = true;
+ }
+ }
+ nTargetPage = rpPage->GetPageNum();
+ }
+ }
+
+ if( bUndo )
+ EndUndo();
+
+ return bSomethingHappened;
+}
+
+// Return number of links in sfx2::LinkManager
+sal_uLong SdDrawDocument::GetLinkCount() const
+{
+ return m_pLinkManager->GetLinks().size();
+}
+
+// Set Language
+void SdDrawDocument::SetLanguage( const LanguageType eLang, const sal_uInt16 nId )
+{
+ bool bChanged = false;
+
+ if( nId == EE_CHAR_LANGUAGE && meLanguage != eLang )
+ {
+ meLanguage = eLang;
+ bChanged = true;
+ }
+ else if( nId == EE_CHAR_LANGUAGE_CJK && meLanguageCJK != eLang )
+ {
+ meLanguageCJK = eLang;
+ bChanged = true;
+ }
+ else if( nId == EE_CHAR_LANGUAGE_CTL && meLanguageCTL != eLang )
+ {
+ meLanguageCTL = eLang;
+ bChanged = true;
+ }
+
+ if( bChanged )
+ {
+ GetDrawOutliner().SetDefaultLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() );
+ m_pHitTestOutliner->SetDefaultLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() );
+ m_pItemPool->SetPoolDefaultItem( SvxLanguageItem( eLang, nId ) );
+ SetChanged( bChanged );
+ }
+}
+
+// Return language
+LanguageType SdDrawDocument::GetLanguage( const sal_uInt16 nId ) const
+{
+ LanguageType eLangType = meLanguage;
+
+ if( nId == EE_CHAR_LANGUAGE_CJK )
+ eLangType = meLanguageCJK;
+ else if( nId == EE_CHAR_LANGUAGE_CTL )
+ eLangType = meLanguageCTL;
+
+ return eLangType;
+}
+
+// Initiate WorkStartup
+IMPL_LINK_NOARG(SdDrawDocument, WorkStartupHdl, Timer *, void)
+{
+ if (IsTransportContainer())
+ return;
+
+ if( mpDocSh )
+ mpDocSh->SetWaitCursor( true );
+
+ bool bChanged = IsChanged(); // remember this
+
+ // Initialize Autolayouts
+ SdPage* pHandoutMPage = GetMasterSdPage(0, PageKind::Handout);
+
+ if (pHandoutMPage->GetAutoLayout() == AUTOLAYOUT_NONE)
+ {
+ // No AutoLayout yet -> initialize
+ pHandoutMPage->SetAutoLayout(AUTOLAYOUT_HANDOUT6, true, true);
+ }
+
+ SdPage* pPage = GetSdPage(0, PageKind::Standard);
+
+ if (pPage->GetAutoLayout() == AUTOLAYOUT_NONE)
+ {
+ // No AutoLayout yet -> initialize
+ pPage->SetAutoLayout(AUTOLAYOUT_NONE, true, true);
+ }
+
+ SdPage* pNotesPage = GetSdPage(0, PageKind::Notes);
+
+ if (pNotesPage->GetAutoLayout() == AUTOLAYOUT_NONE)
+ {
+ // No AutoLayout yet -> initialize
+ pNotesPage->SetAutoLayout(AUTOLAYOUT_NOTES, true, true);
+ }
+
+ SetChanged(bChanged);
+
+ if( mpDocSh )
+ mpDocSh->SetWaitCursor( false );
+}
+
+// When the WorkStartupTimer has been created (this only happens in
+// SdDrawViewShell::Construct() ), the timer may be stopped and the WorkStartup
+// may be initiated.
+void SdDrawDocument::StopWorkStartupDelay()
+{
+ if (mpWorkStartupTimer)
+ {
+ if ( mpWorkStartupTimer->IsActive() )
+ {
+ // Timer not yet expired -> initiate WorkStartup
+ mpWorkStartupTimer->Stop();
+ WorkStartupHdl(nullptr);
+ }
+
+ mpWorkStartupTimer.reset();
+ }
+}
+
+// When the WorkStartupTimer has been created (this only happens in
+// SdDrawViewShell::Construct() ), the timer may be stopped and the WorkStartup
+// may be initiated.
+SdAnimationInfo* SdDrawDocument::GetAnimationInfo(SdrObject* pObject)
+{
+ DBG_ASSERT(pObject, "sd::SdDrawDocument::GetAnimationInfo(), invalid argument!");
+ if( pObject )
+ return GetShapeUserData( *pObject );
+ else
+ return nullptr;
+}
+
+SdAnimationInfo* SdDrawDocument::GetShapeUserData(SdrObject& rObject, bool bCreate /* = false */ )
+{
+ sal_uInt16 nUD = 0;
+ sal_uInt16 nUDCount = rObject.GetUserDataCount();
+ SdAnimationInfo* pRet = nullptr;
+
+ // Can we find animation information within the user data?
+ for (nUD = 0; nUD < nUDCount; nUD++)
+ {
+ SdrObjUserData* pUD = rObject.GetUserData(nUD);
+ if((pUD->GetInventor() == SdrInventor::StarDrawUserData) && (pUD->GetId() == SD_ANIMATIONINFO_ID))
+ {
+ pRet = dynamic_cast<SdAnimationInfo*>(pUD);
+ break;
+ }
+ }
+
+ if( (pRet == nullptr) && bCreate )
+ {
+ pRet = new SdAnimationInfo( rObject );
+ rObject.AppendUserData( std::unique_ptr<SdrObjUserData>(pRet) );
+ }
+
+ return pRet;
+}
+
+/** this method enforces that the masterpages are in the correct order,
+ that is at position 1 is a PageKind::Standard masterpage followed by a
+ PageKind::Notes masterpage and so on. #
+*/
+void SdDrawDocument::CheckMasterPages()
+{
+ sal_uInt16 nMaxPages = GetMasterPageCount();
+
+ // we need at least a handout master and one master page
+ if( nMaxPages < 2 )
+ {
+ return;
+ }
+
+ SdPage* pPage = nullptr;
+
+ sal_uInt16 nPage;
+
+ // first see if the page order is correct
+ for( nPage = 1; nPage < nMaxPages; nPage++ )
+ {
+ pPage = static_cast<SdPage*> (GetMasterPage( nPage ));
+ // if an odd page is not a standard page or an even page is not a notes page
+ if( ((1 == (nPage & 1)) && (pPage->GetPageKind() != PageKind::Standard) ) ||
+ ((0 == (nPage & 1)) && (pPage->GetPageKind() != PageKind::Notes) ) )
+ break; // then we have a fatal error
+ }
+
+ if( nPage >= nMaxPages )
+ return;
+
+ SdPage* pNotesPage = nullptr;
+
+ // there is a fatal error in the master page order,
+ // we need to repair the document
+ bool bChanged = false;
+
+ nPage = 1;
+ while( nPage < nMaxPages )
+ {
+ pPage = static_cast<SdPage*> (GetMasterPage( nPage ));
+ if( pPage->GetPageKind() != PageKind::Standard )
+ {
+ bChanged = true;
+ sal_uInt16 nFound = nPage + 1;
+ while( nFound < nMaxPages )
+ {
+ pPage = static_cast<SdPage*>(GetMasterPage( nFound ));
+ if( PageKind::Standard == pPage->GetPageKind() )
+ {
+ MoveMasterPage( nFound, nPage );
+ pPage->SetInserted();
+ break;
+
+ }
+
+ nFound++;
+ }
+
+ // if we don't have any more standard pages, were done
+ if( nMaxPages == nFound )
+ break;
+ }
+
+ nPage++;
+
+ if( nPage < nMaxPages )
+ pNotesPage = static_cast<SdPage*>(GetMasterPage( nPage ));
+ else
+ pNotesPage = nullptr;
+
+ if( (nullptr == pNotesPage) || (pNotesPage->GetPageKind() != PageKind::Notes) || ( pPage->GetLayoutName() != pNotesPage->GetLayoutName() ) )
+ {
+ bChanged = true;
+
+ sal_uInt16 nFound = nPage + 1;
+ while( nFound < nMaxPages )
+ {
+ pNotesPage = static_cast<SdPage*>(GetMasterPage( nFound ));
+ if( (PageKind::Notes == pNotesPage->GetPageKind()) && ( pPage->GetLayoutName() == pNotesPage->GetLayoutName() ) )
+ {
+ MoveMasterPage( nFound, nPage );
+ pNotesPage->SetInserted();
+ break;
+ }
+
+ nFound++;
+ }
+
+ // looks like we lost a notes page
+ if( nMaxPages == nFound )
+ {
+ // so create one
+
+ // first find a reference notes page for size
+ SdPage* pRefNotesPage = nullptr;
+ nFound = 0;
+ while( nFound < nMaxPages )
+ {
+ pRefNotesPage = static_cast<SdPage*>(GetMasterPage( nFound ));
+ if( PageKind::Notes == pRefNotesPage->GetPageKind() )
+ break;
+ nFound++;
+ }
+ if( nFound == nMaxPages )
+ pRefNotesPage = nullptr;
+
+ rtl::Reference<SdPage> pNewNotesPage = AllocSdPage(true);
+ pNewNotesPage->SetPageKind(PageKind::Notes);
+ if( pRefNotesPage )
+ {
+ pNewNotesPage->SetSize( pRefNotesPage->GetSize() );
+ pNewNotesPage->SetBorder( pRefNotesPage->GetLeftBorder(),
+ pRefNotesPage->GetUpperBorder(),
+ pRefNotesPage->GetRightBorder(),
+ pRefNotesPage->GetLowerBorder() );
+ }
+ InsertMasterPage(pNewNotesPage.get(), nPage );
+ pNewNotesPage->SetLayoutName( pPage->GetLayoutName() );
+ pNewNotesPage->SetAutoLayout(AUTOLAYOUT_NOTES, true, true );
+ nMaxPages++;
+ }
+ }
+
+ nPage++;
+ }
+
+ // now remove all remaining and unused non PageKind::Standard slides
+ while( nPage < nMaxPages )
+ {
+ bChanged = true;
+
+ RemoveMasterPage( nPage );
+ nMaxPages--;
+ }
+
+ if( bChanged )
+ {
+ OSL_FAIL( "master pages where in a wrong order" );
+ RecalcPageNums( true);
+ }
+}
+
+sal_uInt16 SdDrawDocument::CreatePage (
+ SdPage* pActualPage,
+ PageKind ePageKind,
+ const OUString& sStandardPageName,
+ const OUString& sNotesPageName,
+ AutoLayout eStandardLayout,
+ AutoLayout eNotesLayout,
+ bool bIsPageBack,
+ bool bIsPageObj,
+ const sal_Int32 nInsertPosition)
+{
+ SdPage* pPreviousStandardPage;
+ SdPage* pPreviousNotesPage;
+ rtl::Reference<SdPage> pStandardPage;
+ rtl::Reference<SdPage> pNotesPage;
+
+ // From the given page determine the standard page and notes page of which
+ // to take the layout and the position where to insert the new pages.
+ if (ePageKind == PageKind::Notes)
+ {
+ pPreviousNotesPage = pActualPage;
+ sal_uInt16 nNotesPageNum = pPreviousNotesPage->GetPageNum() + 2;
+ pPreviousStandardPage = static_cast<SdPage*>( GetPage(nNotesPageNum - 3) );
+ eStandardLayout = pPreviousStandardPage->GetAutoLayout();
+ }
+ else
+ {
+ pPreviousStandardPage = pActualPage;
+ sal_uInt16 nStandardPageNum = pPreviousStandardPage->GetPageNum() + 2;
+ pPreviousNotesPage = static_cast<SdPage*>( GetPage(nStandardPageNum - 1) );
+ eNotesLayout = pPreviousNotesPage->GetAutoLayout();
+ }
+
+ // Create new standard page and set it up
+ pStandardPage = AllocSdPage(false);
+
+ // Set the size here since else the presobj autolayout
+ // will be wrong.
+ pStandardPage->SetSize( pPreviousStandardPage->GetSize() );
+ pStandardPage->SetBorder( pPreviousStandardPage->GetLeftBorder(),
+ pPreviousStandardPage->GetUpperBorder(),
+ pPreviousStandardPage->GetRightBorder(),
+ pPreviousStandardPage->GetLowerBorder() );
+
+ // Use master page of current page.
+ pStandardPage->TRG_SetMasterPage(pPreviousStandardPage->TRG_GetMasterPage());
+
+ // User layout of current standard page
+ pStandardPage->SetLayoutName( pPreviousStandardPage->GetLayoutName() );
+ pStandardPage->SetAutoLayout(eStandardLayout, true);
+ pStandardPage->setHeaderFooterSettings( pPreviousStandardPage->getHeaderFooterSettings() );
+
+ // transition settings of current page
+ pStandardPage->setTransitionType( pPreviousStandardPage->getTransitionType() );
+ pStandardPage->setTransitionSubtype( pPreviousStandardPage->getTransitionSubtype() );
+ pStandardPage->setTransitionDirection( pPreviousStandardPage->getTransitionDirection() );
+ pStandardPage->setTransitionFadeColor( pPreviousStandardPage->getTransitionFadeColor() );
+ pStandardPage->setTransitionDuration( pPreviousStandardPage->getTransitionDuration() );
+
+ // apply previous animation timing
+ pStandardPage->SetPresChange( pPreviousStandardPage->GetPresChange() );
+ pStandardPage->SetTime( pPreviousStandardPage->GetTime() );
+
+ // Create new notes page and set it up
+ pNotesPage = AllocSdPage(false);
+ pNotesPage->SetPageKind(PageKind::Notes);
+
+ // Use master page of current page
+ pNotesPage->TRG_SetMasterPage(pPreviousNotesPage->TRG_GetMasterPage());
+
+ // Use layout of current notes page
+ pNotesPage->SetLayoutName( pPreviousNotesPage->GetLayoutName() );
+ pNotesPage->SetAutoLayout(eNotesLayout, true);
+ pNotesPage->setHeaderFooterSettings( pPreviousNotesPage->getHeaderFooterSettings() );
+
+ return InsertPageSet (
+ pActualPage,
+ ePageKind,
+ sStandardPageName,
+ sNotesPageName,
+ bIsPageBack,
+ bIsPageObj,
+ pStandardPage.get(),
+ pNotesPage.get(),
+ nInsertPosition);
+}
+
+sal_uInt16 SdDrawDocument::DuplicatePage (sal_uInt16 nPageNum)
+{
+ PageKind ePageKind = PageKind::Standard;
+
+ // Get current page
+ SdPage* pActualPage = GetSdPage(nPageNum, ePageKind);
+
+ // Get background flags
+ SdrLayerAdmin& rLayerAdmin = GetLayerAdmin();
+ SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background);
+ SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects);
+ SdrLayerIDSet aVisibleLayers = pActualPage->TRG_GetMasterPageVisibleLayers();
+
+ return DuplicatePage (
+ pActualPage, ePageKind,
+ // No names for the new slides
+ OUString(), OUString(),
+ aVisibleLayers.IsSet(aBckgrnd),
+ aVisibleLayers.IsSet(aBckgrndObj), -1);
+}
+
+sal_uInt16 SdDrawDocument::DuplicatePage (
+ SdPage* pActualPage,
+ PageKind ePageKind,
+ const OUString& sStandardPageName,
+ const OUString& sNotesPageName,
+ bool bIsPageBack,
+ bool bIsPageObj,
+ const sal_Int32 nInsertPosition)
+{
+ SdPage* pPreviousStandardPage;
+ SdPage* pPreviousNotesPage;
+ rtl::Reference<SdPage> pStandardPage;
+ rtl::Reference<SdPage> pNotesPage;
+
+ // From the given page determine the standard page and the notes page
+ // of which to make copies.
+ if (ePageKind == PageKind::Notes)
+ {
+ pPreviousNotesPage = pActualPage;
+ sal_uInt16 nNotesPageNum = pPreviousNotesPage->GetPageNum() + 2;
+ pPreviousStandardPage = static_cast<SdPage*>( GetPage(nNotesPageNum - 3) );
+ }
+ else
+ {
+ pPreviousStandardPage = pActualPage;
+ sal_uInt16 nStandardPageNum = pPreviousStandardPage->GetPageNum() + 2;
+ pPreviousNotesPage = static_cast<SdPage*>( GetPage(nStandardPageNum - 1) );
+ }
+
+ // Create duplicates of a standard page and the associated notes page
+ pStandardPage = static_cast<SdPage*>( pPreviousStandardPage->CloneSdrPage(*this).get() );
+ pNotesPage = static_cast<SdPage*>( pPreviousNotesPage->CloneSdrPage(*this).get() );
+
+ return InsertPageSet (
+ pActualPage,
+ ePageKind,
+ sStandardPageName,
+ sNotesPageName,
+ bIsPageBack,
+ bIsPageObj,
+ pStandardPage.get(),
+ pNotesPage.get(),
+ nInsertPosition);
+}
+
+sal_uInt16 SdDrawDocument::InsertPageSet (
+ SdPage* pActualPage,
+ PageKind ePageKind,
+ const OUString& sStandardPageName,
+ const OUString& sNotesPageName,
+ bool bIsPageBack,
+ bool bIsPageObj,
+ SdPage* pStandardPage,
+ SdPage* pNotesPage,
+ sal_Int32 nInsertPosition)
+{
+ SdPage* pPreviousStandardPage;
+ SdPage* pPreviousNotesPage;
+ sal_uInt16 nStandardPageNum;
+ sal_uInt16 nNotesPageNum;
+ OUString aNotesPageName(sNotesPageName);
+
+ // Gather some information about the standard page and the notes page
+ // that are to be inserted. This makes sure that there is always one
+ // standard page followed by one notes page.
+ if (ePageKind == PageKind::Notes)
+ {
+ pPreviousNotesPage = pActualPage;
+ nNotesPageNum = pPreviousNotesPage->GetPageNum() + 2;
+ pPreviousStandardPage = static_cast<SdPage*>( GetPage(nNotesPageNum - 3) );
+ nStandardPageNum = nNotesPageNum - 1;
+ }
+ else
+ {
+ pPreviousStandardPage = pActualPage;
+ nStandardPageNum = pPreviousStandardPage->GetPageNum() + 2;
+ pPreviousNotesPage = static_cast<SdPage*>( GetPage(nStandardPageNum - 1) );
+ nNotesPageNum = nStandardPageNum + 1;
+ aNotesPageName = sStandardPageName;
+ }
+
+ OSL_ASSERT(nNotesPageNum==nStandardPageNum+1);
+ if (nInsertPosition < 0)
+ nInsertPosition = nStandardPageNum;
+
+ // Set up and insert the standard page
+ SetupNewPage (
+ pPreviousStandardPage,
+ pStandardPage,
+ sStandardPageName,
+ nInsertPosition,
+ bIsPageBack,
+ bIsPageObj);
+
+ // Set up and insert the notes page
+ pNotesPage->SetPageKind(PageKind::Notes);
+ SetupNewPage (
+ pPreviousNotesPage,
+ pNotesPage,
+ aNotesPageName,
+ nInsertPosition+1,
+ bIsPageBack,
+ bIsPageObj);
+
+ // Return an index that allows the caller to access the newly inserted
+ // pages by using GetSdPage()
+ return pStandardPage->GetPageNum() / 2;
+}
+
+void SdDrawDocument::SetupNewPage (
+ SdPage const * pPreviousPage,
+ SdPage* pPage,
+ const OUString& sPageName,
+ sal_uInt16 nInsertionPoint,
+ bool bIsPageBack,
+ bool bIsPageObj)
+{
+ if (pPreviousPage != nullptr)
+ {
+ pPage->SetSize( pPreviousPage->GetSize() );
+ pPage->SetBorder( pPreviousPage->GetLeftBorder(),
+ pPreviousPage->GetUpperBorder(),
+ pPreviousPage->GetRightBorder(),
+ pPreviousPage->GetLowerBorder() );
+ }
+ pPage->SetName(sPageName);
+
+ InsertPage(pPage, nInsertionPoint);
+
+ if (pPreviousPage != nullptr)
+ {
+ SdrLayerAdmin& rLayerAdmin = GetLayerAdmin();
+ SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background);
+ SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects);
+ SdrLayerIDSet aVisibleLayers = pPreviousPage->TRG_GetMasterPageVisibleLayers();
+ aVisibleLayers.Set(aBckgrnd, bIsPageBack);
+ aVisibleLayers.Set(aBckgrndObj, bIsPageObj);
+ pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+ }
+}
+
+sd::UndoManager* SdDrawDocument::GetUndoManager() const
+{
+ return mpDocSh ? dynamic_cast< sd::UndoManager* >(mpDocSh->GetUndoManager()) : nullptr;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/drawdoc3.cxx b/sd/source/core/drawdoc3.cxx
new file mode 100644
index 000000000..e25e8199d
--- /dev/null
+++ b/sd/source/core/drawdoc3.cxx
@@ -0,0 +1,1873 @@
+/* -*- 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 <memory>
+#include <string_view>
+
+#include <sfx2/docfile.hxx>
+#include <sfx2/docfilt.hxx>
+#include <sfx2/app.hxx>
+#include <svl/itemset.hxx>
+#include <tools/debug.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <sfx2/fcontnr.hxx>
+#include <svl/style.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdundo.hxx>
+#include <vcl/stdtext.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <xmloff/autolayout.hxx>
+
+#include <strings.hrc>
+#include <drawdoc.hxx>
+#include <sdmod.hxx>
+#include <sdpage.hxx>
+#include <stlpool.hxx>
+#include <sdresid.hxx>
+#include <customshowlist.hxx>
+#include <sdxfer.hxx>
+
+#include <unmovss.hxx>
+#include <unchss.hxx>
+#include <unprlout.hxx>
+#include <DrawDocShell.hxx>
+#include <GraphicDocShell.hxx>
+#include <ViewShell.hxx>
+#include <View.hxx>
+#include <ViewShellBase.hxx>
+#include <strings.hxx>
+
+using namespace ::com::sun::star;
+
+/** Concrete incarnations get called by lcl_IterateBookmarkPages, for
+ every page in the bookmark document/list
+ */
+
+namespace {
+
+class InsertBookmarkAsPage_FindDuplicateLayouts
+{
+public:
+ explicit InsertBookmarkAsPage_FindDuplicateLayouts( std::vector<OUString> &rLayoutsToTransfer )
+ : mrLayoutsToTransfer(rLayoutsToTransfer) {}
+ void operator()( SdDrawDocument&, SdPage const *, bool, SdDrawDocument* );
+private:
+ std::vector<OUString> &mrLayoutsToTransfer;
+};
+
+}
+
+void InsertBookmarkAsPage_FindDuplicateLayouts::operator()( SdDrawDocument& rDoc, SdPage const * pBMMPage, bool bRenameDuplicates, SdDrawDocument* pBookmarkDoc )
+{
+ // now check for duplicate masterpage and layout names
+
+ OUString aLayout( pBMMPage->GetLayoutName() );
+ sal_Int32 nIndex = aLayout.indexOf( SD_LT_SEPARATOR );
+ if( nIndex != -1 )
+ aLayout = aLayout.copy(0, nIndex);
+
+ std::vector<OUString>::const_iterator pIter =
+ find(mrLayoutsToTransfer.begin(),mrLayoutsToTransfer.end(),aLayout);
+
+ bool bFound = pIter != mrLayoutsToTransfer.end();
+
+ const sal_uInt16 nMPageCount = rDoc.GetMasterPageCount();
+ for (sal_uInt16 nMPage = 0; nMPage < nMPageCount && !bFound; nMPage++)
+ {
+ // Do the layouts already exist within the document?
+ SdPage* pTestPage = static_cast<SdPage*>( rDoc.GetMasterPage(nMPage) );
+ OUString aTest(pTestPage->GetLayoutName());
+ sal_Int32 nIndex2 = aTest.indexOf( SD_LT_SEPARATOR );
+ if( nIndex2 != -1 )
+ aTest = aTest.copy(0, nIndex2);
+
+ if (aTest == aLayout && pBMMPage->GetPageKind() == pTestPage->GetPageKind())
+ {
+ // Ignore Layouts with "Default" these seem to be special - in the sense that there are lot of assumption all over Impress
+ // about this
+ if( bRenameDuplicates && aTest != SdResId( STR_LAYOUT_DEFAULT_NAME ) && !(pTestPage->Equals(*pBMMPage)) )
+ {
+ pBookmarkDoc->RenameLayoutTemplate(
+ pBMMPage->GetLayoutName(), pBMMPage->GetName() + "_");
+ aLayout = pBMMPage->GetName();
+
+ break;
+ }
+ else
+ bFound = true;
+ }
+ }
+
+ if (!bFound)
+ mrLayoutsToTransfer.push_back(aLayout);
+}
+
+// Inserts a bookmark as a page
+static void lcl_IterateBookmarkPages( SdDrawDocument &rDoc, SdDrawDocument* pBookmarkDoc,
+ const std::vector<OUString> &rBookmarkList, sal_uInt16 nBMSdPageCount,
+ InsertBookmarkAsPage_FindDuplicateLayouts& rPageIterator, bool bRenameDuplicates )
+{
+
+ // Refactored copy'n'pasted layout name collection from InsertBookmarkAsPage
+
+ int nPos, nEndPos;
+
+ if( rBookmarkList.empty() )
+ {
+ // no list? whole source document
+ nEndPos = nBMSdPageCount;
+ }
+ else
+ {
+ // bookmark list? number of entries
+ nEndPos = rBookmarkList.size();
+ }
+
+ SdPage* pBMPage;
+
+ // iterate over number of pages to insert
+ for (nPos = 0; nPos < nEndPos; ++nPos)
+ {
+ // the master page associated to the nPos'th page to insert
+ SdPage* pBMMPage = nullptr;
+
+ if( rBookmarkList.empty() )
+ {
+ // simply take master page of nPos'th page in source document
+ pBMMPage = static_cast<SdPage*>(&(pBookmarkDoc->GetSdPage(static_cast<sal_uInt16>(nPos), PageKind::Standard)->TRG_GetMasterPage()));
+ }
+ else
+ {
+ // fetch nPos'th entry from bookmark list, and determine master page
+ OUString aBMPgName(rBookmarkList[nPos]);
+ bool bIsMasterPage;
+
+ sal_uInt16 nBMPage = pBookmarkDoc->GetPageByName( aBMPgName, bIsMasterPage );
+
+ if (nBMPage != SDRPAGE_NOTFOUND)
+ {
+ pBMPage = static_cast<SdPage*>( pBookmarkDoc->GetPage(nBMPage) );
+ }
+ else
+ {
+ pBMPage = nullptr;
+ }
+
+ // enforce that bookmarked page is a standard page and not already a master page
+ if (pBMPage && pBMPage->GetPageKind()==PageKind::Standard && !pBMPage->IsMasterPage())
+ {
+ const sal_uInt16 nBMSdPage = (nBMPage - 1) / 2;
+ pBMMPage = static_cast<SdPage*> (&(pBookmarkDoc->GetSdPage(nBMSdPage, PageKind::Standard)->TRG_GetMasterPage()));
+ }
+ }
+
+ // successfully determined valid (bookmarked) page?
+ if( pBMMPage )
+ {
+ // yes, call functor
+ rPageIterator( rDoc, pBMMPage, bRenameDuplicates, pBookmarkDoc );
+ }
+ }
+}
+
+// Opens a bookmark document
+SdDrawDocument* SdDrawDocument::OpenBookmarkDoc(SfxMedium* pMedium)
+{
+ bool bOK = true;
+ SdDrawDocument* pBookmarkDoc = nullptr;
+ OUString aBookmarkName = pMedium->GetName();
+ std::shared_ptr<const SfxFilter> pFilter = pMedium->GetFilter();
+ if ( !pFilter )
+ {
+ pMedium->UseInteractionHandler( true );
+ SfxGetpApp()->GetFilterMatcher().GuessFilter(*pMedium, pFilter);
+ }
+
+ if ( !pFilter )
+ {
+ bOK = false;
+ }
+ else if ( !aBookmarkName.isEmpty() && maBookmarkFile != aBookmarkName )
+ {
+ bool bCreateGraphicShell = pFilter->GetServiceName() == "com.sun.star.drawing.DrawingDocument";
+ bool bCreateImpressShell = pFilter->GetServiceName() == "com.sun.star.presentation.PresentationDocument";
+ if ( bCreateGraphicShell || bCreateImpressShell )
+ {
+ CloseBookmarkDoc();
+
+ // Create a DocShell, as OLE objects might be contained in the
+ // document. (Persist)
+ // If that wasn't the case, we could load the model directly.
+ if ( bCreateGraphicShell )
+ // Draw
+ mxBookmarkDocShRef = new ::sd::GraphicDocShell(SfxObjectCreateMode::STANDARD);
+ else
+ // Impress
+ mxBookmarkDocShRef = new ::sd::DrawDocShell(SfxObjectCreateMode::STANDARD, true, DocumentType::Impress);
+
+ bOK = mxBookmarkDocShRef->DoLoad(pMedium);
+ if( bOK )
+ {
+ maBookmarkFile = aBookmarkName;
+ pBookmarkDoc = mxBookmarkDocShRef->GetDoc();
+ }
+ }
+ }
+
+ DBG_ASSERT(!aBookmarkName.isEmpty(), "Empty document name!");
+
+ if (!bOK)
+ {
+ std::unique_ptr<weld::MessageDialog> xErrorBox(Application::CreateMessageDialog(nullptr,
+ VclMessageType::Warning, VclButtonsType::Ok, SdResId(STR_READ_DATA_ERROR)));
+ xErrorBox->run();
+
+ CloseBookmarkDoc();
+ pBookmarkDoc = nullptr;
+ }
+ else if (mxBookmarkDocShRef.is())
+ {
+ pBookmarkDoc = mxBookmarkDocShRef->GetDoc();
+ }
+
+ return pBookmarkDoc;
+}
+
+// Opens a bookmark document
+SdDrawDocument* SdDrawDocument::OpenBookmarkDoc(const OUString& rBookmarkFile)
+{
+ SdDrawDocument* pBookmarkDoc = nullptr;
+
+ if (!rBookmarkFile.isEmpty() && maBookmarkFile != rBookmarkFile)
+ {
+ std::unique_ptr<SfxMedium> xMedium(new SfxMedium(rBookmarkFile, StreamMode::READ));
+ pBookmarkDoc = OpenBookmarkDoc(xMedium.release());
+ }
+ else if (mxBookmarkDocShRef.is())
+ {
+ pBookmarkDoc = mxBookmarkDocShRef->GetDoc();
+ }
+
+ return pBookmarkDoc;
+}
+
+// Inserts a bookmark (page or object)
+void SdDrawDocument::InsertBookmark(
+ const std::vector<OUString> &rBookmarkList, // List of names of the bookmarks to be inserted
+ std::vector<OUString> &rExchangeList, // List of the names to be used
+ bool bLink, // Insert bookmarks as links?
+ sal_uInt16 nInsertPos, // Insertion position of pages
+ ::sd::DrawDocShell* pBookmarkDocSh, // If set, this is the source document
+ Point const * pObjPos) // Insertion position of objects
+{
+ bool bOK = true;
+ bool bInsertPages = false;
+
+ if (rBookmarkList.empty())
+ {
+ // Insert all pages
+ bInsertPages = true;
+ }
+ else
+ {
+ SdDrawDocument* pBookmarkDoc = nullptr;
+
+ if (pBookmarkDocSh)
+ {
+ pBookmarkDoc = pBookmarkDocSh->GetDoc();
+ }
+ else if ( mxBookmarkDocShRef.is() )
+ {
+ pBookmarkDoc = mxBookmarkDocShRef->GetDoc();
+ }
+ else
+ bOK = false;
+
+ bInsertPages = bOK && std::any_of(rBookmarkList.begin(), rBookmarkList.end(),
+ [&pBookmarkDoc](const OUString& rBookmark) {
+ // Is there a page name in the bookmark list?
+ bool bIsMasterPage;
+ return pBookmarkDoc->GetPageByName(rBookmark, bIsMasterPage) != SDRPAGE_NOTFOUND;
+ });
+ }
+
+ bool bCalcObjCount = !rExchangeList.empty();
+
+ if ( bOK && bInsertPages )
+ {
+ // Insert all page bookmarks
+ bOK = InsertBookmarkAsPage(rBookmarkList, &rExchangeList, bLink, false/*bReplace*/,
+ nInsertPos, false/*bNoDialogs*/, pBookmarkDocSh, true/*bCopy*/, true, false);
+ }
+
+ if ( bOK && !rBookmarkList.empty() )
+ {
+ // Insert all object bookmarks
+ InsertBookmarkAsObject(rBookmarkList, rExchangeList,
+ pBookmarkDocSh, pObjPos, bCalcObjCount);
+ }
+}
+
+namespace
+{
+
+void
+lcl_removeUnusedStyles(SfxStyleSheetBasePool* const pStyleSheetPool, StyleSheetCopyResultVector& rStyles)
+{
+ StyleSheetCopyResultVector aUsedStyles;
+ aUsedStyles.reserve(rStyles.size());
+ for (const auto& a : rStyles)
+ {
+ if (a.m_xStyleSheet->IsUsed())
+ aUsedStyles.push_back(a);
+ else
+ pStyleSheetPool->Remove(a.m_xStyleSheet.get());
+ }
+ rStyles = aUsedStyles;
+}
+
+SfxStyleSheet *lcl_findStyle(StyleSheetCopyResultVector& rStyles, std::u16string_view aStyleName)
+{
+ for (const auto& a : rStyles)
+ {
+ if (a.m_xStyleSheet->GetName().startsWith(aStyleName))
+ return a.m_xStyleSheet.get();
+ }
+ return nullptr;
+}
+
+}
+
+bool SdDrawDocument::InsertBookmarkAsPage(
+ const std::vector<OUString> &rBookmarkList,
+ std::vector<OUString> *pExchangeList, // List of names to be used
+ bool bLink,
+ bool bReplace,
+ sal_uInt16 nInsertPos,
+ bool bNoDialogs,
+ ::sd::DrawDocShell* pBookmarkDocSh,
+ bool bCopy,
+ bool bMergeMasterPages,
+ bool bPreservePageNames)
+{
+ bool bContinue = true;
+ bool bScaleObjects = false;
+ sal_uInt16 nReplacedStandardPages = 0;
+
+ SdDrawDocument* pBookmarkDoc = nullptr;
+ OUString aBookmarkName;
+
+ if (pBookmarkDocSh)
+ {
+ pBookmarkDoc = pBookmarkDocSh->GetDoc();
+
+ if (pBookmarkDocSh->GetMedium())
+ {
+ aBookmarkName = pBookmarkDocSh->GetMedium()->GetName();
+ }
+ }
+ else if ( mxBookmarkDocShRef.is() )
+ {
+ pBookmarkDoc = mxBookmarkDocShRef->GetDoc();
+ aBookmarkName = maBookmarkFile;
+ }
+ else
+ {
+ return false;
+ }
+
+ const sal_uInt16 nSdPageCount = GetSdPageCount(PageKind::Standard);
+ const sal_uInt16 nBMSdPageCount = pBookmarkDoc->GetSdPageCount(PageKind::Standard);
+ const sal_uInt16 nMPageCount = GetMasterPageCount();
+
+ if (nSdPageCount==0 || nBMSdPageCount==0 || nMPageCount==0)
+ {
+ return false;
+ }
+
+ // Store the size and some other properties of the first page and notes
+ // page so that inserted pages can be properly scaled even when inserted
+ // before the first page.
+ // Note that the pointers are used later on as general page pointers.
+ SdPage* pRefPage = GetSdPage(0, PageKind::Standard);
+ Size aSize(pRefPage->GetSize());
+ sal_Int32 nLeft = pRefPage->GetLeftBorder();
+ sal_Int32 nRight = pRefPage->GetRightBorder();
+ sal_Int32 nUpper = pRefPage->GetUpperBorder();
+ sal_Int32 nLower = pRefPage->GetLowerBorder();
+ Orientation eOrient = pRefPage->GetOrientation();
+
+ SdPage* pNPage = GetSdPage(0, PageKind::Notes);
+ Size aNSize(pNPage->GetSize());
+ sal_Int32 nNLeft = pNPage->GetLeftBorder();
+ sal_Int32 nNRight = pNPage->GetRightBorder();
+ sal_Int32 nNUpper = pNPage->GetUpperBorder();
+ sal_Int32 nNLower = pNPage->GetLowerBorder();
+ Orientation eNOrient = pNPage->GetOrientation();
+
+ // Adapt page size and margins to those of the later pages?
+ pRefPage = GetSdPage(nSdPageCount - 1, PageKind::Standard);
+
+ if( bNoDialogs )
+ {
+ // If this is clipboard, then no need to scale objects:
+ // this will make copied masters to differ from the originals,
+ // and thus InsertBookmarkAsPage_FindDuplicateLayouts will
+ // duplicate masters on insert to same document
+ m_bTransportContainer = (SD_MOD()->pTransferClip &&
+ SD_MOD()->pTransferClip->GetWorkDocument() == this);
+ if (!m_bTransportContainer)
+ {
+ if (rBookmarkList.empty())
+ bScaleObjects = pRefPage->IsScaleObjects();
+ else
+ bScaleObjects = true;
+ }
+ }
+ else
+ {
+ SdPage* pBMPage = pBookmarkDoc->GetSdPage(0,PageKind::Standard);
+
+ if (pBMPage->GetSize() != pRefPage->GetSize() ||
+ pBMPage->GetLeftBorder() != pRefPage->GetLeftBorder() ||
+ pBMPage->GetRightBorder() != pRefPage->GetRightBorder() ||
+ pBMPage->GetUpperBorder() != pRefPage->GetUpperBorder() ||
+ pBMPage->GetLowerBorder() != pRefPage->GetLowerBorder())
+ {
+ OUString aStr(SdResId(STR_SCALE_OBJECTS));
+ std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(nullptr,
+ VclMessageType::Question, VclButtonsType::YesNo,
+ aStr));
+ xQueryBox->add_button(GetStandardText(StandardButtonType::Cancel), RET_CANCEL);
+ sal_uInt16 nBut = xQueryBox->run();
+
+ bScaleObjects = nBut == RET_YES;
+ bContinue = nBut != RET_CANCEL;
+
+ if (!bContinue)
+ {
+ return bContinue;
+ }
+ }
+ }
+
+ // Get the necessary presentation stylesheets and transfer them before
+ // the pages, else, the text objects won't reference their styles anymore.
+ SfxUndoManager* pUndoMgr = nullptr;
+ if( mpDocSh )
+ {
+ pUndoMgr = mpDocSh->GetUndoManager();
+ ViewShellId nViewShellId(-1);
+ if (sd::ViewShell* pViewShell = mpDocSh->GetViewShell())
+ nViewShellId = pViewShell->GetViewShellBase().GetViewShellId();
+ pUndoMgr->EnterListAction(SdResId(STR_UNDO_INSERTPAGES), "", 0, nViewShellId);
+ }
+
+ // Refactored copy'n'pasted layout name collection into IterateBookmarkPages
+
+ std::vector<OUString> aLayoutsToTransfer;
+ InsertBookmarkAsPage_FindDuplicateLayouts aSearchFunctor( aLayoutsToTransfer );
+ lcl_IterateBookmarkPages( *this, pBookmarkDoc, rBookmarkList, nBMSdPageCount, aSearchFunctor, ( rBookmarkList.empty() && pBookmarkDoc != this ) );
+
+ // Copy the style that we actually need.
+ SdStyleSheetPool& rBookmarkStyleSheetPool = dynamic_cast<SdStyleSheetPool&>(*pBookmarkDoc->GetStyleSheetPool());
+ SdStyleSheetPool& rStyleSheetPool = dynamic_cast<SdStyleSheetPool&>(*GetStyleSheetPool());
+
+ // When copying styles, also copy the master pages!
+ if( !aLayoutsToTransfer.empty() )
+ bMergeMasterPages = true;
+
+ for ( const OUString& layoutName : aLayoutsToTransfer )
+ {
+ StyleSheetCopyResultVector aCreatedStyles;
+
+ rStyleSheetPool.CopyLayoutSheets(layoutName, rBookmarkStyleSheetPool,aCreatedStyles);
+
+ if(!aCreatedStyles.empty())
+ {
+ if( pUndoMgr )
+ {
+ pUndoMgr->AddUndoAction(std::make_unique<SdMoveStyleSheetsUndoAction>(this, aCreatedStyles, true));
+ }
+ }
+ }
+
+ // Copy styles. This unconditionally copies all styles, even those
+ // that are not used in any of the inserted pages. The unused styles
+ // are then removed at the end of the function, where we also create
+ // undo records for the inserted styles.
+ StyleSheetCopyResultVector aNewGraphicStyles;
+ OUString aRenameStr;
+ if(!bReplace && !bNoDialogs)
+ aRenameStr = "_";
+ rStyleSheetPool.RenameAndCopyGraphicSheets(rBookmarkStyleSheetPool, aNewGraphicStyles, aRenameStr);
+ StyleSheetCopyResultVector aNewCellStyles;
+ rStyleSheetPool.CopyCellSheets(rBookmarkStyleSheetPool, aNewCellStyles);
+
+ // TODO handle undo of table styles too
+ rStyleSheetPool.CopyTableStyles(rBookmarkStyleSheetPool);
+
+ // Insert document
+
+ const bool bUndo = IsUndoEnabled();
+
+ if( bUndo )
+ BegUndo(SdResId(STR_UNDO_INSERTPAGES));
+
+ if (rBookmarkList.empty())
+ {
+ if (nInsertPos >= GetPageCount())
+ {
+ // Add pages to the end
+ nInsertPos = GetPageCount();
+ }
+
+ sal_uInt16 nActualInsertPos = nInsertPos;
+
+ sal_uInt16 nBMSdPage;
+ std::set<sal_uInt16> aRenameSet;
+ std::map<sal_uInt16,OUString> aNameMap;
+
+ for (nBMSdPage=0; nBMSdPage < nBMSdPageCount; nBMSdPage++)
+ {
+ SdPage* pBMPage = pBookmarkDoc->GetSdPage(nBMSdPage, PageKind::Standard);
+ OUString sName(pBMPage->GetName());
+ bool bIsMasterPage;
+
+ if (bLink)
+ {
+ // Remember the names of all pages
+ aNameMap.insert(std::make_pair(nBMSdPage,sName));
+ }
+
+ // Have to check for duplicate names here, too
+ // don't change name if source and dest model are the same!
+ if( pBookmarkDoc != this &&
+ GetPageByName(sName, bIsMasterPage ) != SDRPAGE_NOTFOUND )
+ {
+ // delay renaming *after* pages are copied (might destroy source otherwise)
+ aRenameSet.insert(nBMSdPage);
+ }
+ }
+
+ Merge(*pBookmarkDoc,
+ 1, // Not the handout page
+ 0xFFFF, // But all others
+ nActualInsertPos, // Insert at position ...
+ bMergeMasterPages, // Move master pages?
+ false, // But only the master pages used
+ true, // Create an undo action
+ bCopy); // Copy (or merge) pages?
+
+ for (nBMSdPage=0; nBMSdPage < nBMSdPageCount; nBMSdPage++)
+ {
+ SdPage* pPage = static_cast<SdPage*>( GetPage(nActualInsertPos) );
+ SdPage* pNotesPage = static_cast<SdPage*>( GetPage(nActualInsertPos+1) );
+
+ // delay renaming *after* pages are copied (might destroy source otherwise)
+ if( aRenameSet.find(nBMSdPage) != aRenameSet.end() )
+ {
+ // Page name already in use -> Use default name for default and
+ // notes page
+ pPage->SetName(OUString());
+ pNotesPage->SetName(OUString());
+ }
+
+ if (bLink)
+ {
+ OUString aName(aNameMap[nBMSdPage]);
+
+ // Assemble all link names
+ pPage->SetFileName(aBookmarkName);
+ pPage->SetBookmarkName(aName);
+ }
+
+ nActualInsertPos += 2;
+ }
+ }
+ else
+ {
+ // Insert selected pages
+ SdPage* pBMPage;
+
+ if (nInsertPos >= GetPageCount())
+ {
+ // Add pages to the end
+ bReplace = false;
+ nInsertPos = GetPageCount();
+ }
+
+ sal_uInt16 nActualInsertPos = nInsertPos;
+
+ // Collect the bookmarked pages
+ ::std::vector<SdPage*> aBookmarkedPages (rBookmarkList.size(), nullptr);
+ for ( size_t nPos = 0, n = rBookmarkList.size(); nPos < n; ++nPos)
+ {
+ OUString aPgName(rBookmarkList[nPos]);
+ bool bIsMasterPage;
+ sal_uInt16 nBMPage = pBookmarkDoc->GetPageByName( aPgName, bIsMasterPage );
+
+ if (nBMPage != SDRPAGE_NOTFOUND)
+ {
+ aBookmarkedPages[nPos] = dynamic_cast<SdPage*>(pBookmarkDoc->GetPage(nBMPage));
+ }
+ }
+
+ for ( size_t nPos = 0, n = rBookmarkList.size(); nPos < n; ++nPos)
+ {
+ pBMPage = aBookmarkedPages[nPos];
+ sal_uInt16 nBMPage = pBMPage!=nullptr ? pBMPage->GetPageNum() : SDRPAGE_NOTFOUND;
+
+ if (pBMPage && pBMPage->GetPageKind()==PageKind::Standard && !pBMPage->IsMasterPage())
+ {
+ // It has to be a default page
+ bool bMustRename = false;
+
+ // delay renaming *after* pages are copied (might destroy source otherwise)
+ // don't change name if source and dest model are the same!
+ // avoid renaming if replacing the same page
+ OUString aPgName(rBookmarkList[nPos]);
+ bool bIsMasterPage;
+ sal_uInt16 nPageSameName = GetPageByName(aPgName, bIsMasterPage);
+ if( pBookmarkDoc != this &&
+ nPageSameName != SDRPAGE_NOTFOUND &&
+ ( !bReplace ||
+ nPageSameName != nActualInsertPos ) )
+ {
+ bMustRename = true;
+ }
+
+ SdPage* pBookmarkPage = pBMPage;
+ if (bReplace )
+ {
+ ReplacePageInCustomShows( dynamic_cast< SdPage* >( GetPage( nActualInsertPos ) ), pBookmarkPage );
+ }
+
+ Merge(*pBookmarkDoc,
+ nBMPage, // From page (default page)
+ nBMPage+1, // To page (notes page)
+ nActualInsertPos, // Insert at position
+ bMergeMasterPages, // Move master pages?
+ false, // But only the master pages used
+ true, // Create undo action
+ bCopy); // Copy (or merge) pages?
+
+ if( bReplace )
+ {
+ if( GetPage( nActualInsertPos ) != pBookmarkPage )
+ {
+ // bookmark page was not moved but cloned, so update custom shows again
+ ReplacePageInCustomShows( pBookmarkPage, dynamic_cast< SdPage* >( GetPage( nActualInsertPos ) ) );
+ }
+ }
+
+ if( bMustRename )
+ {
+ // Page name already in use -> use default name for default and
+ // notes page
+ SdPage* pPage = static_cast<SdPage*>( GetPage(nActualInsertPos) );
+ pPage->SetName(OUString());
+ SdPage* pNotesPage = static_cast<SdPage*>( GetPage(nActualInsertPos+1) );
+ pNotesPage->SetName(OUString());
+ }
+
+ if (bLink)
+ {
+ SdPage* pPage = static_cast<SdPage*>( GetPage(nActualInsertPos) );
+ pPage->SetFileName(aBookmarkName);
+ pPage->SetBookmarkName(aPgName);
+ }
+
+ if (bReplace)
+ {
+ // Remove page and notes page.
+ const sal_uInt16 nDestPageNum(nActualInsertPos + 2);
+ SdPage* pStandardPage = nullptr;
+
+ if(nDestPageNum < GetPageCount())
+ {
+ pStandardPage = static_cast<SdPage*>(GetPage(nDestPageNum));
+ }
+
+ if (pStandardPage)
+ {
+ if( bPreservePageNames )
+ {
+ // Take old slide names for inserted pages
+ SdPage* pPage = static_cast<SdPage*>( GetPage(nActualInsertPos) );
+ pPage->SetName( pStandardPage->GetRealName() );
+ }
+
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoDeletePage(*pStandardPage));
+
+ RemovePage(nDestPageNum);
+ }
+
+ SdPage* pNotesPage = nullptr;
+
+ if(nDestPageNum < GetPageCount())
+ {
+ pNotesPage = static_cast<SdPage*>(GetPage(nDestPageNum));
+ }
+
+ if (pNotesPage)
+ {
+ if( bPreservePageNames )
+ {
+ // Take old slide names for inserted pages
+ SdPage* pNewNotesPage = static_cast<SdPage*>( GetPage(nActualInsertPos+1));
+ if( pNewNotesPage )
+ pNewNotesPage->SetName( pStandardPage->GetRealName() );
+ }
+
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoDeletePage(*pNotesPage));
+
+ RemovePage(nDestPageNum);
+ }
+
+ nReplacedStandardPages++;
+ }
+
+ nActualInsertPos += 2;
+ }
+ }
+ }
+
+ // We might have duplicate master pages now, as the drawing engine does not
+ // recognize duplicates. Remove these now.
+ sal_uInt16 nNewMPageCount = GetMasterPageCount();
+
+ // Go backwards, so the numbers don't become messed up
+ for (sal_uInt16 nPage = nNewMPageCount - 1; nPage >= nMPageCount; nPage--)
+ {
+ pRefPage = static_cast<SdPage*>( GetMasterPage(nPage) );
+ OUString aMPLayout(pRefPage->GetLayoutName());
+ PageKind eKind = pRefPage->GetPageKind();
+
+ // Does this already exist?
+ for (sal_uInt16 nTest = 0; nTest < nMPageCount; nTest++)
+ {
+ SdPage* pTest = static_cast<SdPage*>( GetMasterPage(nTest) );
+ OUString aTest(pTest->GetLayoutName());
+
+ // nInsertPos > 2 is always true when inserting into non-empty models
+ if ( nInsertPos > 2 &&
+ aTest == aMPLayout &&
+ eKind == pTest->GetPageKind() )
+ {
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoDeletePage(*pRefPage));
+
+ RemoveMasterPage(nPage);
+
+ nNewMPageCount--;
+ break;
+ }
+ }
+ }
+
+ // nInsertPos > 2 is always true when inserting into non-empty models
+ if (nInsertPos > 0)
+ {
+ sal_uInt16 nSdPageStart = (nInsertPos - 1) / 2;
+ sal_uInt16 nSdPageEnd = bReplace
+ ? nSdPageStart + nReplacedStandardPages - 1
+ : GetSdPageCount(PageKind::Standard) - nSdPageCount + nSdPageStart - 1;
+ const bool bRemoveEmptyPresObj =
+ (pBookmarkDoc->GetDocumentType() == DocumentType::Impress) &&
+ (GetDocumentType() == DocumentType::Draw);
+
+ std::vector<OUString>::iterator pExchangeIter;
+
+ if (pExchangeList)
+ pExchangeIter = pExchangeList->begin();
+
+ for (sal_uInt16 nSdPage = nSdPageStart; nSdPage <= nSdPageEnd; nSdPage++)
+ {
+ pRefPage = GetSdPage(nSdPage, PageKind::Standard);
+
+ if (pExchangeList && pExchangeIter != pExchangeList->end())
+ {
+ // Get the name to use from Exchange list
+ OUString aExchangeName(*pExchangeIter);
+ pRefPage->SetName(aExchangeName);
+ Broadcast(SdrHint(SdrHintKind::PageOrderChange, pRefPage));
+
+ SdPage* pNewNotesPage = GetSdPage(nSdPage, PageKind::Notes);
+ pNewNotesPage->SetName(aExchangeName);
+ Broadcast(SdrHint(SdrHintKind::PageOrderChange, pNewNotesPage));
+
+ ++pExchangeIter;
+ }
+
+ OUString aLayout(pRefPage->GetLayoutName());
+ sal_Int32 nIndex = aLayout.indexOf( SD_LT_SEPARATOR );
+ if( nIndex != -1 )
+ aLayout = aLayout.copy(0, nIndex);
+
+ // update layout and referred master page
+ pRefPage->SetPresentationLayout(aLayout);
+ if( bUndo )
+ AddUndo( GetSdrUndoFactory().CreateUndoPageChangeMasterPage( *pRefPage ) );
+
+ if (bScaleObjects)
+ {
+ ::tools::Rectangle aBorderRect(nLeft, nUpper, nRight, nLower);
+ pRefPage->ScaleObjects(aSize, aBorderRect, true);
+ }
+ pRefPage->SetSize(aSize);
+ pRefPage->SetBorder(nLeft, nUpper, nRight, nLower);
+ pRefPage->SetOrientation( eOrient );
+
+ if( bRemoveEmptyPresObj )
+ pRefPage->RemoveEmptyPresentationObjects();
+
+ pRefPage = GetSdPage(nSdPage, PageKind::Notes);
+
+ // update layout and referred master page
+ pRefPage->SetPresentationLayout(aLayout);
+ if( bUndo )
+ AddUndo( GetSdrUndoFactory().CreateUndoPageChangeMasterPage( *pRefPage ) );
+
+ if (bScaleObjects)
+ {
+ ::tools::Rectangle aBorderRect(nNLeft, nNUpper, nNRight, nNLower);
+ pRefPage->ScaleObjects(aNSize, aBorderRect, true);
+ }
+
+ pRefPage->SetSize(aNSize);
+ pRefPage->SetBorder(nNLeft, nNUpper, nNRight, nNLower);
+ pRefPage->SetOrientation( eNOrient );
+
+ if( bRemoveEmptyPresObj )
+ pRefPage->RemoveEmptyPresentationObjects();
+ }
+
+ ///Remove processed elements, to avoid doing hacks in InsertBookmarkAsObject
+ if ( pExchangeList )
+ pExchangeList->erase(pExchangeList->begin(),pExchangeIter);
+
+ for (sal_uInt16 nPage = nMPageCount; nPage < nNewMPageCount; nPage++)
+ {
+ pRefPage = static_cast<SdPage*>( GetMasterPage(nPage) );
+ if (pRefPage->GetPageKind() == PageKind::Standard)
+ {
+ if (bScaleObjects)
+ {
+ ::tools::Rectangle aBorderRect(nLeft, nUpper, nRight, nLower);
+ pRefPage->ScaleObjects(aSize, aBorderRect, true);
+ }
+ pRefPage->SetSize(aSize);
+ pRefPage->SetBorder(nLeft, nUpper, nRight, nLower);
+ pRefPage->SetOrientation( eOrient );
+ }
+ else // Can only be notes
+ {
+ if (bScaleObjects)
+ {
+ ::tools::Rectangle aBorderRect(nNLeft, nNUpper, nNRight, nNLower);
+ pRefPage->ScaleObjects(aNSize, aBorderRect, true);
+ }
+ pRefPage->SetSize(aNSize);
+ pRefPage->SetBorder(nNLeft, nNUpper, nNRight, nNLower);
+ pRefPage->SetOrientation( eNOrient );
+ }
+
+ if( bRemoveEmptyPresObj )
+ pRefPage->RemoveEmptyPresentationObjects();
+ }
+ }
+
+ // Make absolutely sure no double masterpages are there
+ RemoveUnnecessaryMasterPages(nullptr, true);
+
+ // Rename object styles if necessary
+ if(!aRenameStr.isEmpty())
+ {
+ try
+ {
+ for(sal_uInt32 p = nInsertPos; p < sal_uInt32(nInsertPos) + sal_uInt32(nBMSdPageCount); p++)
+ {
+ SdPage *pPg = static_cast<SdPage *>( GetPage(p) );
+ for(size_t i = 0; pPg && (i < pPg->GetObjCount()); ++i)
+ {
+ if(pPg->GetObj(i)->GetStyleSheet())
+ {
+ OUString aStyleName = pPg->GetObj(i)->GetStyleSheet()->GetName();
+ SfxStyleSheet *pSheet = lcl_findStyle(aNewGraphicStyles, OUStringConcatenation(aStyleName + aRenameStr));
+ if(pSheet != nullptr)
+ pPg->GetObj(i)->SetStyleSheet(pSheet, true);
+ }
+ }
+ }
+ }
+ catch(...)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "Exception while renaming styles @ SdDrawDocument::InsertBookmarkAsPage");
+ }
+ }
+ // remove copied styles not used on any inserted page and create
+ // undo records
+ // WARNING: SdMoveStyleSheetsUndoAction clears the passed list of
+ // styles, so it cannot be used after this point
+ lcl_removeUnusedStyles(GetStyleSheetPool(), aNewGraphicStyles);
+ if (!aNewGraphicStyles.empty() && pUndoMgr)
+ pUndoMgr->AddUndoAction(std::make_unique<SdMoveStyleSheetsUndoAction>(this, aNewGraphicStyles, true));
+ lcl_removeUnusedStyles(GetStyleSheetPool(), aNewCellStyles);
+ if (!aNewCellStyles.empty() && pUndoMgr)
+ pUndoMgr->AddUndoAction(std::make_unique<SdMoveStyleSheetsUndoAction>(this, aNewCellStyles, true));
+
+ if( bUndo )
+ EndUndo();
+
+ if (pUndoMgr)
+ pUndoMgr->LeaveListAction();
+
+ return bContinue;
+}
+
+// Inserts a bookmark as an object
+bool SdDrawDocument::InsertBookmarkAsObject(
+ const std::vector<OUString> &rBookmarkList,
+ const std::vector<OUString> &rExchangeList, // List of names to use
+ ::sd::DrawDocShell* pBookmarkDocSh,
+ Point const * pObjPos,
+ bool bCalcObjCount)
+{
+ bool bOK = true;
+ bool bOLEObjFound = false;
+ std::unique_ptr<::sd::View> pBMView;
+
+ SdDrawDocument* pBookmarkDoc = nullptr;
+
+ if (pBookmarkDocSh)
+ {
+ pBookmarkDoc = pBookmarkDocSh->GetDoc();
+ }
+ else if ( mxBookmarkDocShRef.is() )
+ {
+ pBookmarkDoc = mxBookmarkDocShRef->GetDoc();
+ }
+ else
+ {
+ return false;
+ }
+
+ if (rBookmarkList.empty())
+ {
+ pBMView.reset(new ::sd::View(*pBookmarkDoc, nullptr));
+ pBMView->EndListening(*pBookmarkDoc);
+ pBMView->MarkAll();
+ }
+ else
+ {
+ SdrPage* pPage;
+ SdrPageView* pPV;
+
+ for ( const auto& rBookmark : rBookmarkList )
+ {
+ // Get names of bookmarks from the list
+ SdrObject* pObj = pBookmarkDoc->GetObj(rBookmark);
+
+ if (pObj)
+ {
+ // Found an object
+ if (pObj->GetObjInventor() == SdrInventor::Default &&
+ pObj->GetObjIdentifier() == SdrObjKind::OLE2)
+ {
+ bOLEObjFound = true;
+ }
+
+ if (!pBMView)
+ {
+ // Create View for the first time
+ pBMView.reset(new ::sd::View(*pBookmarkDoc, nullptr));
+ pBMView->EndListening(*pBookmarkDoc);
+ }
+
+ pPage = pObj->getSdrPageFromSdrObject();
+
+ if (pPage->IsMasterPage())
+ {
+ pPV = pBMView->ShowSdrPage(pBMView->GetModel()->GetMasterPage(pPage->GetPageNum()));
+ }
+ else
+ {
+ pPV = pBMView->GetSdrPageView();
+ if( !pPV || (pPV->GetPage() != pPage))
+ pPV = pBMView->ShowSdrPage(pPage);
+ }
+
+ pBMView->MarkObj(pObj, pPV);
+ }
+ }
+ }
+
+ if (pBMView)
+ {
+ // Insert selected objects
+ std::optional<::sd::View> pView(std::in_place, *this, nullptr);
+ pView->EndListening(*this);
+
+ // Look for the page into which the objects are supposed to be inserted
+ SdrPage* pPage = GetSdPage(0, PageKind::Standard);
+
+ if (mpDocSh)
+ {
+ ::sd::ViewShell* pViewSh = mpDocSh->GetViewShell();
+
+ if (pViewSh)
+ {
+ // Which page is currently in view?
+ SdrPageView* pPV = pViewSh->GetView()->GetSdrPageView();
+
+ if (pPV)
+ {
+ pPage = pPV->GetPage();
+ }
+ else if (pViewSh->GetActualPage())
+ {
+ pPage = pViewSh->GetActualPage();
+ }
+ }
+ }
+
+ Point aObjPos;
+
+ if (pObjPos)
+ {
+ aObjPos = *pObjPos;
+ }
+ else
+ {
+ aObjPos = ::tools::Rectangle(Point(), pPage->GetSize()).Center();
+ }
+
+ size_t nCountBefore = 0;
+
+ if (!rExchangeList.empty() || bCalcObjCount)
+ {
+ // Sort OrdNums and get the number of objects before inserting
+ pPage->RecalcObjOrdNums();
+ nCountBefore = pPage->GetObjCount();
+ }
+
+ if (bOLEObjFound)
+ pBMView->GetDoc().SetAllocDocSh(true);
+
+ SdDrawDocument* pTmpDoc = static_cast<SdDrawDocument*>( pBMView->CreateMarkedObjModel().release() );
+ bOK = pView->Paste(*pTmpDoc, aObjPos, pPage, SdrInsertFlags::NONE);
+
+ if (bOLEObjFound)
+ pBMView->GetDoc().SetAllocDocSh(false);
+
+ if (!bOLEObjFound)
+ delete pTmpDoc; // Would otherwise be destroyed by DocShell
+
+ pView.reset();
+
+ // Get number of objects after inserting.
+ const size_t nCount = pPage->GetObjCount();
+ if (nCountBefore < nCount)
+ {
+ size_t nObj = nCountBefore;
+ for (const auto& rExchange : rExchangeList)
+ {
+ // Get the name to use from the Exchange list
+ if (pPage->GetObj(nObj))
+ {
+ pPage->GetObj(nObj)->SetName(rExchange);
+ }
+
+ ++nObj;
+ if (nObj >= nCount)
+ break;
+ }
+ }
+ }
+
+ return bOK;
+}
+
+// Stops the bookmark insertion
+void SdDrawDocument::CloseBookmarkDoc()
+{
+ if (mxBookmarkDocShRef.is())
+ {
+ mxBookmarkDocShRef->DoClose();
+ }
+
+ mxBookmarkDocShRef.clear();
+ maBookmarkFile.clear();
+}
+
+// Is this document read-only?
+bool SdDrawDocument::IsReadOnly() const
+{
+ return false;
+}
+
+// In the subsequent AllocModel() a DocShell (xAllocedDocShRef) is created.
+// Any pre-existing DocShell is deleted
+void SdDrawDocument::SetAllocDocSh(bool bAlloc)
+{
+ mbAllocDocSh = bAlloc;
+
+ if(mxAllocedDocShRef.is())
+ {
+ mxAllocedDocShRef->DoClose();
+ }
+
+ mxAllocedDocShRef.clear();
+}
+
+// Return list of CustomShows (create it, too, if necessary)
+SdCustomShowList* SdDrawDocument::GetCustomShowList(bool bCreate)
+{
+ if (!mpCustomShowList && bCreate)
+ {
+ mpCustomShowList.reset(new SdCustomShowList);
+ }
+
+ return mpCustomShowList.get();
+}
+
+// Remove unused master pages and layouts
+void SdDrawDocument::RemoveUnnecessaryMasterPages(SdPage* pMasterPage, bool bOnlyDuplicatePages, bool bUndo)
+{
+ ::sd::View* pView = nullptr;
+ SfxUndoManager* pUndoMgr = nullptr;
+
+ if( bUndo && !IsUndoEnabled() )
+ bUndo = false;
+
+ if (mpDocSh)
+ {
+ pUndoMgr = mpDocSh->GetUndoManager();
+
+ if (mpDocSh->GetViewShell())
+ pView = mpDocSh->GetViewShell()->GetView();
+ }
+
+ // Check all master pages
+ sal_uInt16 nSdMasterPageCount = GetMasterSdPageCount( PageKind::Standard );
+ for (sal_Int32 nMPage = nSdMasterPageCount - 1; nMPage >= 0; nMPage--)
+ {
+ SdPage* pMaster = pMasterPage;
+ SdPage* pNotesMaster = nullptr;
+
+ if (!pMaster)
+ {
+ pMaster = GetMasterSdPage( static_cast<sal_uInt16>(nMPage), PageKind::Standard );
+ pNotesMaster = GetMasterSdPage( static_cast<sal_uInt16>(nMPage), PageKind::Notes );
+ }
+ else
+ {
+ for ( sal_uInt16 nMPg = 0; nMPg < GetMasterPageCount(); nMPg++ )
+ {
+ if ( pMaster == GetMasterPage( nMPg ) )
+ {
+ pNotesMaster = static_cast<SdPage*>( GetMasterPage( ++nMPg ) );
+ break;
+ }
+ }
+ }
+
+ DBG_ASSERT( pMaster->GetPageKind() == PageKind::Standard, "wrong page kind" );
+
+ if ( pMaster->GetPageKind() == PageKind::Standard &&
+ GetMasterPageUserCount( pMaster ) == 0 &&
+ pNotesMaster )
+ {
+ // Do not delete master pages that have their precious flag set
+ bool bDeleteMaster = !pMaster->IsPrecious();
+ OUString aLayoutName = pMaster->GetLayoutName();
+
+ if(bOnlyDuplicatePages )
+ {
+ // remove only duplicate pages
+ bDeleteMaster = false;
+ for (sal_uInt16 i = 0; i < GetMasterSdPageCount( PageKind::Standard ); i++)
+ {
+ SdPage* pMPg = GetMasterSdPage( i, PageKind::Standard );
+ if( pMPg != pMaster &&
+ pMPg->GetLayoutName() == aLayoutName )
+ {
+ // duplicate page found -> remove it
+ bDeleteMaster = true;
+ }
+ }
+ }
+
+ if( bDeleteMaster )
+ {
+ if (pView)
+ {
+ // if MasterPage is visible hide on pageview
+ SdrPageView* pPgView = pView->GetSdrPageView();
+ if (pPgView)
+ {
+ SdrPage* pShownPage = pPgView->GetPage();
+ if( (pShownPage == pMaster) || (pShownPage == pNotesMaster) )
+ {
+ pView->HideSdrPage();
+ pView->ShowSdrPage( GetSdPage( 0, PageKind::Standard ) );
+ }
+ }
+ }
+
+ if( bUndo )
+ {
+ BegUndo();
+ AddUndo( GetSdrUndoFactory().CreateUndoDeletePage( *pNotesMaster ) );
+ }
+
+ RemoveMasterPage( pNotesMaster->GetPageNum() );
+
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoDeletePage(*pMaster));
+
+ RemoveMasterPage( pMaster->GetPageNum() );
+
+ if( bUndo )
+ EndUndo(); // do this here already, so Joe's actions happen _between_ our own
+
+ // Delete old, unused layout stylesheets
+ bool bDeleteOldStyleSheets = true;
+ for ( sal_uInt16 nMPg = 0;
+ nMPg < GetMasterPageCount() && bDeleteOldStyleSheets;
+ nMPg++ )
+ {
+ SdPage* pMPg = static_cast<SdPage*>( GetMasterPage(nMPg) );
+ if (pMPg->GetLayoutName() == aLayoutName)
+ {
+ bDeleteOldStyleSheets = false;
+ }
+ }
+
+ if (bDeleteOldStyleSheets)
+ {
+ SdStyleSheetVector aRemove;
+ static_cast<SdStyleSheetPool*>( mxStyleSheetPool.get())->CreateLayoutSheetList( aLayoutName, aRemove );
+
+ if( bUndo )
+ {
+ StyleSheetCopyResultVector aUndoRemove;
+ aUndoRemove.reserve(aRemove.size());
+ for (const auto& a : aRemove)
+ aUndoRemove.emplace_back(a.get(), true);
+
+ if (pUndoMgr)
+ pUndoMgr->AddUndoAction(std::make_unique<SdMoveStyleSheetsUndoAction>(this, aUndoRemove, false));
+ }
+
+ for( const auto& a : aRemove )
+ static_cast<SdStyleSheetPool*>( mxStyleSheetPool.get())->Remove(a.get());
+ }
+ }
+ }
+
+ if (pMasterPage)
+ break; // Just this one master page!
+ }
+}
+
+/** Exchange master page
+ *
+ * Either the nSdPageNum gets a new, own master page or the master page is
+ * exchanged completely (which then applies to all pages).
+ *
+ * nSdPageNum : page number that the new master page should get.
+ * rLayoutName : LayoutName of the new master page
+ * pSourceDoc : document (template) to get the master page from
+ * bMaster : exchange the master page of nSdPageNum
+ * bCheckMasters: remove unused master pages
+ *
+ * If pSourceDoc == NULL, an empty master page is applied.
+ * If rLayoutName is empty, the first master page is used.
+ */
+// #i121863# factored out functionality
+static bool isMasterPageLayoutNameUnique(const SdDrawDocument& rDoc, std::u16string_view rCandidate)
+{
+ if (rCandidate.empty())
+ {
+ return false;
+ }
+
+ const sal_uInt16 nPageCount(rDoc.GetMasterPageCount());
+
+ for(sal_uInt16 a(0); a < nPageCount; a++)
+ {
+ const SdrPage* pCandidate = rDoc.GetMasterPage(a);
+ OUString aPageLayoutName(pCandidate->GetLayoutName());
+ sal_Int32 nIndex = aPageLayoutName.indexOf(SD_LT_SEPARATOR);
+ if( nIndex != -1 )
+ aPageLayoutName = aPageLayoutName.copy(0, nIndex);
+
+ if(aPageLayoutName == rCandidate)
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+// #i121863# factored out functionality
+static OUString createNewMasterPageLayoutName(const SdDrawDocument& rDoc)
+{
+ const OUString aBaseName(SdResId(STR_LAYOUT_DEFAULT_NAME));
+ sal_uInt16 nCount(0);
+ for (;;)
+ {
+ OUString aRetval = aBaseName;
+ if(nCount)
+ {
+ aRetval += OUString::number(nCount);
+ }
+ if (isMasterPageLayoutNameUnique(rDoc, aRetval))
+ return aRetval;
+ nCount++;
+ }
+}
+
+void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum,
+ std::u16string_view rLayoutName,
+ SdDrawDocument* pSourceDoc,
+ bool bMaster,
+ bool bCheckMasters)
+{
+ SfxUndoManager* pUndoMgr = nullptr;
+
+ if( mpDocSh )
+ {
+ mpDocSh->SetWaitCursor( true );
+ pUndoMgr = mpDocSh->GetUndoManager();
+ }
+
+ const bool bUndo = pUndoMgr && IsUndoEnabled();
+
+ if (bUndo)
+ {
+ ViewShellId nViewShellId(-1);
+ if (sd::ViewShell* pViewShell = mpDocSh->GetViewShell())
+ nViewShellId = pViewShell->GetViewShellBase().GetViewShellId();
+ pUndoMgr->EnterListAction(SdResId(STR_UNDO_SET_PRESLAYOUT), OUString(), 0, nViewShellId);
+ }
+
+ SdPage* pSelectedPage = GetSdPage(nSdPageNum, PageKind::Standard);
+ SdPage* pNotes = static_cast<SdPage*>( GetPage(pSelectedPage->GetPageNum()+1) );
+ SdPage& rOldMaster = static_cast<SdPage&>(pSelectedPage->TRG_GetMasterPage());
+ SdPage& rOldNotesMaster = static_cast<SdPage&>(pNotes->TRG_GetMasterPage());
+ rtl::Reference<SdPage> pMaster;
+ rtl::Reference<SdPage> pNotesMaster;
+ OUString aOldPageLayoutName(pSelectedPage->GetLayoutName());
+ OUString aOldLayoutName(aOldPageLayoutName);
+ sal_Int32 nIndex = aOldLayoutName.indexOf( SD_LT_SEPARATOR );
+ if( nIndex != -1 )
+ aOldLayoutName = aOldLayoutName.copy(0, nIndex);
+
+ if (pSourceDoc)
+ {
+ std::vector<StyleReplaceData> aReplList; // List of replaced stylesheets
+ bool bLayoutReloaded = false; // Was ex. layout reloaded?
+
+ // LayoutName, Page and Notes page
+ if (rLayoutName.empty())
+ {
+ // No LayoutName: take first MasterPage
+ pMaster = pSourceDoc->GetMasterSdPage(0, PageKind::Standard);
+ pNotesMaster = pSourceDoc->GetMasterSdPage(0, PageKind::Notes);
+ }
+ else
+ {
+ OUString aSearchFor
+ = OUString::Concat(rLayoutName) + SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE;
+
+ for (sal_uInt16 nMP = 0; nMP < pSourceDoc->GetMasterPageCount(); ++nMP)
+ {
+ SdPage* pMP = static_cast<SdPage*>( pSourceDoc->GetMasterPage(nMP) );
+
+ if (pMP->GetLayoutName() == aSearchFor)
+ {
+ if (pMP->GetPageKind() == PageKind::Standard)
+ pMaster = pMP;
+ if (pMP->GetPageKind() == PageKind::Notes)
+ pNotesMaster = pMP;
+ }
+ if (pMaster && pNotesMaster)
+ break;
+ }
+ DBG_ASSERT(pMaster, "MasterPage (Standard page) not found");
+ DBG_ASSERT(pNotesMaster, "MasterPage (Notes page) not found");
+
+ // this should not happen, but looking at crash reports, it does
+ if( (pMaster == nullptr) || (pNotesMaster == nullptr) )
+ {
+ // so take the first MasterPage
+ pMaster = pSourceDoc->GetMasterSdPage(0, PageKind::Standard);
+ pNotesMaster = pSourceDoc->GetMasterSdPage(0, PageKind::Notes);
+ }
+ }
+
+ // we should never reach this, but one never knows...
+ if( (pMaster == nullptr) || (pNotesMaster == nullptr) )
+ {
+ if (bUndo)
+ pUndoMgr->LeaveListAction();
+
+ if( mpDocSh )
+ mpDocSh->SetWaitCursor( false );
+
+ OSL_FAIL( "SdDrawDocument::SetMasterPage() failed!" );
+
+ return;
+ }
+
+ const OUString aOriginalNewLayoutName( pMaster->GetName() );
+ OUString aTargetNewLayoutName(aOriginalNewLayoutName);
+
+ if (pSourceDoc != this)
+ {
+ // #i121863# clone masterpages, they are from another model (!)
+ rtl::Reference<SdPage> pNewNotesMaster(dynamic_cast< SdPage* >(pNotesMaster->CloneSdrPage(*this).get()));
+ rtl::Reference<SdPage> pNewMaster(dynamic_cast< SdPage* >(pMaster->CloneSdrPage(*this).get()));
+
+ if(!pNewNotesMaster || !pNewMaster)
+ {
+ OSL_FAIL("SdDrawDocument::SetMasterPage() cloning of MasterPage/NoteAmsterPage failed!" );
+ return;
+ }
+
+ pNotesMaster = pNewNotesMaster;
+ pMaster = pNewMaster;
+
+ // layout name needs to be unique
+ aTargetNewLayoutName = pMaster->GetLayoutName();
+ sal_Int32 nIndex2 = aTargetNewLayoutName.indexOf(SD_LT_SEPARATOR);
+ if( nIndex2 != -1 )
+ aTargetNewLayoutName = aTargetNewLayoutName.copy(0, nIndex2);
+
+ if(!isMasterPageLayoutNameUnique(*this, aTargetNewLayoutName))
+ {
+ aTargetNewLayoutName = createNewMasterPageLayoutName(*this);
+
+ OUString aTemp = aTargetNewLayoutName + SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE;
+
+ pMaster->SetName(aTargetNewLayoutName);
+ pMaster->SetLayoutName(aTemp);
+
+ pNotesMaster->SetName(aTargetNewLayoutName);
+ pNotesMaster->SetLayoutName(aTemp);
+ }
+ }
+
+ if (pSourceDoc != this)
+ {
+ const sal_uInt16 nMasterPageCount = GetMasterPageCount();
+ for ( sal_uInt16 nMPage = 0; nMPage < nMasterPageCount; nMPage++ )
+ {
+ SdPage* pCheckMaster = static_cast<SdPage*>(GetMasterPage(nMPage));
+ if( pCheckMaster->GetName() == aTargetNewLayoutName )
+ {
+ bLayoutReloaded = true;
+ break;
+ }
+ }
+
+ // Correct or create presentation templates --
+ // only worry about presentation templates
+ OUString aName;
+ SdStyleSheetPool* pSourceStyleSheetPool = static_cast<SdStyleSheetPool*>( pSourceDoc->GetStyleSheetPool() );
+
+ StyleSheetCopyResultVector aCreatedStyles; // List of created stylesheets
+ SfxStyleSheetBase* pHisSheet = pSourceStyleSheetPool->First(SfxStyleFamily::Page);
+
+ while (pHisSheet)
+ {
+ aName = pHisSheet->GetName();
+
+ // #i121863# search in source styles with original style name from source of
+ // evtl. cloned master (not-cloned, renamed for uniqueness)
+ if( aName.startsWith( aOriginalNewLayoutName ) )
+ {
+ // #i121863# build name of evtl. cloned master style to search for
+ if(aOriginalNewLayoutName != aTargetNewLayoutName)
+ {
+ const sal_Int32 nPos(aName.indexOf(SD_LT_SEPARATOR));
+ aName = aTargetNewLayoutName + aName.subView(nPos);
+ }
+
+ SfxStyleSheet* pMySheet = static_cast<SfxStyleSheet*>( mxStyleSheetPool->Find(aName, SfxStyleFamily::Page) );
+
+ if (pMySheet)
+ {
+ // A stylesheet of the same name already exists -> overwrite contents
+ bool bTest = pMySheet->SetName(pHisSheet->GetName());
+ DBG_ASSERT(bTest, "Renaming StyleSheet failed.");
+ pMySheet->GetItemSet().ClearItem(); // Delete all
+
+ if (bUndo)
+ {
+ pUndoMgr->AddUndoAction(std::make_unique<StyleSheetUndoAction>(this,
+ pMySheet, &pHisSheet->GetItemSet()));
+ }
+ pMySheet->GetItemSet().Put(pHisSheet->GetItemSet());
+ pMySheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+ }
+ else
+ {
+ // create new style
+ OUString aHelpFile;
+ pMySheet = static_cast<SfxStyleSheet*>( &mxStyleSheetPool->Make(aName, SfxStyleFamily::Page, pHisSheet->GetMask()) );
+ pMySheet->SetHelpId( aHelpFile, pHisSheet->GetHelpId(aHelpFile) );
+ pMySheet->GetItemSet().ClearItem(); // Delete all
+ pMySheet->GetItemSet().Put(pHisSheet->GetItemSet());
+
+ aCreatedStyles.emplace_back(static_cast<SdStyleSheet*>(pMySheet), true);
+ }
+
+ StyleReplaceData aReplData;
+ aReplData.nNewFamily = pMySheet->GetFamily();
+ aReplData.nFamily = pMySheet->GetFamily();
+ aReplData.aNewName = pMySheet->GetName();
+
+ // #i121863# re-create original name of style used at page where to replace with
+ // this new style
+ OUString aTemp(pMySheet->GetName());
+ const sal_Int32 nPos(aTemp.indexOf(SD_LT_SEPARATOR));
+ aTemp = aOldLayoutName + aTemp.subView(nPos);
+ aReplData.aName = aTemp;
+ aReplList.push_back(aReplData);
+ }
+
+ pHisSheet = pSourceStyleSheetPool->Next();
+ }
+
+ // If new styles were created: re-create parent chaining of the item
+ // sets in the styles.
+ if(!aCreatedStyles.empty())
+ {
+ for ( const auto& rRData : aReplList )
+ {
+ SfxStyleSheetBase* pSOld = mxStyleSheetPool->Find(rRData.aName, SfxStyleFamily::Page);
+ SfxStyleSheetBase* pSNew = mxStyleSheetPool->Find(rRData.aNewName, SfxStyleFamily::Page);
+
+ if (pSOld && pSNew)
+ {
+ const OUString& rParentOfOld = pSOld->GetParent();
+ const OUString& rParentOfNew = pSNew->GetParent();
+
+ if (!rParentOfOld.isEmpty() && rParentOfNew.isEmpty())
+ {
+ std::vector<StyleReplaceData>::iterator pRDIter = std::find_if(aReplList.begin(), aReplList.end(),
+ [&rParentOfOld](const StyleReplaceData& rRD) { return (rRD.aName == rParentOfOld) && (rRD.aName != rRD.aNewName); });
+ if (pRDIter != aReplList.end())
+ {
+ OUString aParentOfNew(pRDIter->aNewName);
+ pSNew->SetParent(aParentOfNew);
+ }
+ }
+ }
+ }
+ }
+
+ if (bUndo && !aCreatedStyles.empty())
+ {
+ // Add UndoAction for creating and inserting the stylesheets to
+ // the top of the UndoManager
+ pUndoMgr->AddUndoAction(std::make_unique<SdMoveStyleSheetsUndoAction>( this, aCreatedStyles, true));
+ }
+ }
+
+ // Create layout name based upon the name of the page layout of the
+ // master page
+ OUString aPageLayoutName(pMaster->GetLayoutName());
+ OUString aLayoutName = aPageLayoutName;
+ sal_Int32 nIndex2 = aLayoutName.indexOf( SD_LT_SEPARATOR );
+ if( nIndex2 != -1 )
+ aLayoutName = aLayoutName.copy( 0, nIndex2);
+
+ // #i121863# Do *not* remove from original document any longer, it is potentially used there
+ // and would lead to crashes. Rely on the automatic process of removing unused masterpages
+ // (see RemoveUnnecessaryMasterPages)
+ //if (pSourceDoc != this)
+ //{
+ // // Remove from the source document
+ // pSourceDoc->RemoveMasterPage(pNotesMaster->GetPageNum());
+ // pSourceDoc->RemoveMasterPage(pMaster->GetPageNum());
+ //}
+
+ // Register the new master pages with the document and then use
+ // the new presentation layout for the default and notes pages
+ if (pSourceDoc != this)
+ {
+ // Insert the master pages:
+ // Insert master pages from new layouts at the end.
+ // If a layout is being replaced, however, insert them before the
+ // position of the old master page, so from now on the new master
+ // page will be found when searching (e.g.
+ // SdPage::SetPresentationLayout).
+ sal_uInt16 nInsertPos = rOldMaster.GetPageNum();
+ BegUndo();
+
+ if (!bLayoutReloaded)
+ nInsertPos = 0xFFFF;
+ InsertMasterPage(pMaster.get(), nInsertPos);
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pMaster));
+
+ nInsertPos++;
+ if (!bLayoutReloaded)
+ nInsertPos = 0xFFFF;
+ InsertMasterPage(pNotesMaster.get(), nInsertPos);
+ if( bUndo )
+ {
+ AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pNotesMaster));
+
+ EndUndo(); // do this here already, so Joe's actions happen _between_ our own.
+ }
+ }
+
+ // Fill list with pages
+ std::vector<rtl::Reference<SdPage>> aPageList;
+
+// #98456, this has to be removed according to CL (KA 07/08/2002)
+// #109884# but we need them again to restore the styles of the presentation objects while undo
+ aPageList.push_back(pMaster);
+ aPageList.push_back(pNotesMaster);
+
+ if (bMaster || bLayoutReloaded)
+ {
+ for (sal_uInt16 nPage = 1; nPage < GetPageCount(); nPage++)
+ {
+ SdPage* pPage = static_cast<SdPage*>( GetPage(nPage) );
+ OUString aTest = pPage->GetLayoutName();
+ if (aTest == aOldPageLayoutName)
+ {
+ aPageList.push_back(pPage);
+ }
+ }
+
+ }
+ else
+ {
+ aPageList.push_back(pSelectedPage);
+ aPageList.push_back(pNotes);
+ }
+
+ for (rtl::Reference<SdPage>& pPage : aPageList)
+ {
+ AutoLayout eAutoLayout = pPage->GetAutoLayout();
+
+ if( bUndo )
+ {
+ pUndoMgr->AddUndoAction(std::make_unique<SdPresentationLayoutUndoAction>
+ (this,
+ pPage->IsMasterPage() ? aLayoutName : aOldLayoutName,
+ aLayoutName,
+ eAutoLayout, eAutoLayout, false, pPage.get()));
+ }
+ pPage->SetPresentationLayout(aLayoutName);
+ pPage->SetAutoLayout(eAutoLayout);
+ }
+
+ // Adapt new master pages
+ if (pSourceDoc != this)
+ {
+ Size aSize(rOldMaster.GetSize());
+ ::tools::Rectangle aBorderRect(rOldMaster.GetLeftBorder(),
+ rOldMaster.GetUpperBorder(),
+ rOldMaster.GetRightBorder(),
+ rOldMaster.GetLowerBorder());
+ pMaster->ScaleObjects(aSize, aBorderRect, true);
+ pMaster->SetSize(aSize);
+ pMaster->SetBorder(rOldMaster.GetLeftBorder(),
+ rOldMaster.GetUpperBorder(),
+ rOldMaster.GetRightBorder(),
+ rOldMaster.GetLowerBorder());
+ pMaster->SetOrientation( rOldMaster.GetOrientation() );
+ pMaster->SetAutoLayout(pMaster->GetAutoLayout());
+
+ aSize = rOldNotesMaster.GetSize();
+ ::tools::Rectangle aNotesBorderRect(rOldNotesMaster.GetLeftBorder(),
+ rOldNotesMaster.GetUpperBorder(),
+ rOldNotesMaster.GetRightBorder(),
+ rOldNotesMaster.GetLowerBorder());
+ pNotesMaster->ScaleObjects(aSize, aNotesBorderRect, true);
+ pNotesMaster->SetSize(aSize);
+ pNotesMaster->SetBorder(rOldNotesMaster.GetLeftBorder(),
+ rOldNotesMaster.GetUpperBorder(),
+ rOldNotesMaster.GetRightBorder(),
+ rOldNotesMaster.GetLowerBorder());
+ pNotesMaster->SetOrientation( rOldNotesMaster.GetOrientation() );
+ pNotesMaster->SetAutoLayout(pNotesMaster->GetAutoLayout());
+
+ if( (pSourceDoc->GetDocumentType() == DocumentType::Impress) &&
+ (GetDocumentType() == DocumentType::Draw) )
+ {
+ pMaster->RemoveEmptyPresentationObjects();
+ pNotesMaster->RemoveEmptyPresentationObjects();
+ }
+ }
+ }
+ else
+ {
+ // Find a new name for the layout
+ OUString aName(createNewMasterPageLayoutName(*this));
+ OUString aPageLayoutName(aName + SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE);
+
+ // Generate new stylesheets
+ static_cast<SdStyleSheetPool*>( mxStyleSheetPool.get())->CreateLayoutStyleSheets(aName);
+ SdStyleSheetVector aCreatedStyles;
+ static_cast<SdStyleSheetPool*>( mxStyleSheetPool.get())->CreateLayoutSheetList(aName, aCreatedStyles);
+
+ if( bUndo )
+ {
+ StyleSheetCopyResultVector aUndoInsert;
+ aUndoInsert.reserve(aCreatedStyles.size());
+ for (const auto& a : aCreatedStyles)
+ aUndoInsert.emplace_back(a.get(), true);
+ pUndoMgr->AddUndoAction(std::make_unique<SdMoveStyleSheetsUndoAction>(this, aUndoInsert, true));
+ // Generate new master pages and register them with the document
+ BegUndo();
+ }
+
+ pMaster = AllocSdPage(true);
+ pMaster->SetSize(pSelectedPage->GetSize());
+ pMaster->SetBorder(pSelectedPage->GetLeftBorder(),
+ pSelectedPage->GetUpperBorder(),
+ pSelectedPage->GetRightBorder(),
+ pSelectedPage->GetLowerBorder() );
+ pMaster->SetName(aName);
+ pMaster->SetLayoutName(aPageLayoutName);
+ InsertMasterPage(pMaster.get());
+
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pMaster));
+
+ pMaster->SetAutoLayout(AUTOLAYOUT_NONE, true, true);
+
+ pNotesMaster = AllocSdPage(true);
+ pNotesMaster->SetPageKind(PageKind::Notes);
+ pNotesMaster->SetSize(pNotes->GetSize());
+ pNotesMaster->SetBorder(pNotes->GetLeftBorder(),
+ pNotes->GetUpperBorder(),
+ pNotes->GetRightBorder(),
+ pNotes->GetLowerBorder() );
+ pNotesMaster->SetName(aName);
+ pNotesMaster->SetLayoutName(aPageLayoutName);
+ InsertMasterPage(pNotesMaster.get());
+
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pNotesMaster));
+
+ pNotesMaster->SetAutoLayout(AUTOLAYOUT_NOTES, true, true);
+
+ if( bUndo )
+ EndUndo();
+
+ // Create a list of affected default and notes pages
+ std::vector<SdPage*> aPageList;
+ if (bMaster)
+ {
+ for (sal_uInt16 nPage = 1; nPage < GetPageCount(); nPage++)
+ {
+ SdPage* pPage = static_cast<SdPage*>( GetPage(nPage) );
+ if (pPage->GetLayoutName() == aOldPageLayoutName)
+ {
+ aPageList.push_back(pPage);
+ }
+ }
+ }
+ else
+ {
+ aPageList.push_back(pSelectedPage);
+ aPageList.push_back(pNotes);
+ }
+
+ // Set presentation layout and AutoLayout for the affected pages
+ for ( auto& rpPage : aPageList )
+ {
+ AutoLayout eOldAutoLayout = rpPage->GetAutoLayout();
+ AutoLayout eNewAutoLayout =
+ rpPage->GetPageKind() == PageKind::Standard ? AUTOLAYOUT_NONE : AUTOLAYOUT_NOTES;
+
+ if( bUndo )
+ {
+ pUndoMgr->AddUndoAction(std::make_unique<SdPresentationLayoutUndoAction>
+ (this, aOldLayoutName, aName,
+ eOldAutoLayout, eNewAutoLayout, true,
+ rpPage));
+ }
+
+ rpPage->SetPresentationLayout(aName);
+ rpPage->SetAutoLayout(eNewAutoLayout);
+ }
+ }
+
+ // If the old master pages aren't used anymore, they and their styles have
+ // to be removed.
+ if (bCheckMasters)
+ {
+ // Check all
+ RemoveUnnecessaryMasterPages();
+ }
+ else
+ {
+ // Check only the master page that was replaced
+ RemoveUnnecessaryMasterPages(&rOldMaster);
+ }
+
+ if( bUndo )
+ pUndoMgr->LeaveListAction();
+
+ if( mpDocSh )
+ mpDocSh->SetWaitCursor( false );
+}
+
+void SdDrawDocument::Merge(SdrModel& rSourceModel,
+ sal_uInt16 nFirstPageNum, sal_uInt16 nLastPageNum,
+ sal_uInt16 nDestPos,
+ bool bMergeMasterPages, bool bAllMasterPages,
+ bool bUndo, bool bTreadSourceAsConst)
+{
+ sal_uInt16 nMasterPageCount = GetMasterPageCount();
+ SdrModel::Merge( rSourceModel, nFirstPageNum, nLastPageNum, nDestPos, bMergeMasterPages, bAllMasterPages, bUndo, bTreadSourceAsConst );
+
+ // add style family for each new master page
+ for( sal_uInt16 nMaster = nMasterPageCount; nMaster < GetMasterPageCount(); nMaster++ )
+ {
+ SdPage* pPage = static_cast< SdPage* >( GetMasterPage( nMaster ) );
+ if( pPage && pPage->IsMasterPage() && (pPage->GetPageKind() == PageKind::Standard) )
+ {
+ // new master page created, add its style family
+ SdStyleSheetPool* pStylePool = static_cast<SdStyleSheetPool*>( GetStyleSheetPool() );
+ if( pStylePool )
+ pStylePool->AddStyleFamily( pPage );
+ }
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/drawdoc4.cxx b/sd/source/core/drawdoc4.cxx
new file mode 100644
index 000000000..590450568
--- /dev/null
+++ b/sd/source/core/drawdoc4.cxx
@@ -0,0 +1,1399 @@
+/* -*- 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 <com/sun/star/style/XStyle.hpp>
+#include <com/sun/star/drawing/LineStyle.hpp>
+#include <i18nlangtag/languagetag.hxx>
+#include <i18nlangtag/mslangid.hxx>
+#include <sfx2/dispatch.hxx>
+#include <Outliner.hxx>
+#include <editeng/outliner.hxx>
+
+#include <DrawDocShell.hxx>
+#include <editeng/eeitem.hxx>
+#include <tools/diagnose_ex.h>
+#include <tools/UnitConversion.hxx>
+
+#include <vcl/idle.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+
+#include <editeng/autokernitem.hxx>
+
+#include <svx/svxids.hrc>
+#include <svl/srchitem.hxx>
+#include <editeng/lrspitem.hxx>
+#include <editeng/ulspitem.hxx>
+#include <editeng/lspcitem.hxx>
+#include <editeng/adjustitem.hxx>
+#include <editeng/numdef.hxx>
+#include <svx/strings.hrc>
+#include <svx/dialmgr.hxx>
+#include <editeng/bulletitem.hxx>
+#include <editeng/borderline.hxx>
+#include <editeng/boxitem.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/sdshitm.hxx>
+#include <svx/svdotext.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/sdshcitm.hxx>
+#include <editeng/editstat.hxx>
+#include <editeng/colritem.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/wghtitem.hxx>
+#include <editeng/postitem.hxx>
+#include <editeng/crossedoutitem.hxx>
+#include <editeng/udlnitem.hxx>
+#include <editeng/contouritem.hxx>
+#include <editeng/emphasismarkitem.hxx>
+#include <editeng/fontitem.hxx>
+#include <editeng/shdditem.hxx>
+#include <editeng/cmapitem.hxx>
+#include <svx/xbtmpit.hxx>
+#include <svx/xflhtit.hxx>
+#include <svx/xflgrit.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xlnedcit.hxx>
+#include <svx/xlnstcit.hxx>
+#include <svx/xlnedwit.hxx>
+#include <svx/xlnstwit.hxx>
+#include <svx/xlnedit.hxx>
+#include <editeng/charreliefitem.hxx>
+#include <svx/xlnstit.hxx>
+#include <svx/xlndsit.hxx>
+#include <svx/xlnwtit.hxx>
+#include <svx/xlnclit.hxx>
+#include <svx/svditer.hxx>
+#include <svx/svdogrp.hxx>
+#include <svx/sdsxyitm.hxx>
+#include <svx/sdtditm.hxx>
+#include <svx/sdtaitm.hxx>
+#include <svx/sdynitm.hxx>
+#include <editeng/numitem.hxx>
+#include <editeng/unolingu.hxx>
+#include <svl/itempool.hxx>
+#include <editeng/outlobj.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <editeng/frmdiritem.hxx>
+#include <svx/sdasitm.hxx>
+
+#include <sdresid.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <strings.hrc>
+#include <glob.hxx>
+#include <stlpool.hxx>
+#include <shapelist.hxx>
+#include <basegfx/point/b2dpoint.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <svl/itemset.hxx>
+#include <app.hrc>
+#include <strings.hxx>
+
+namespace com::sun::star::linguistic2 { class XHyphenator; }
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::style;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::linguistic2;
+using namespace ::sd;
+
+// CreateLayoutTemplates
+// At the moment (31.03.1995), the StyleSheetPool only saves styleheets that
+// have an ItemSet. To save all stylesheets, we force the creation of an ItemSet
+// with a GetItemSet call.
+// We can remove this behavior once the pool saves styleheets even without an ItemSet
+void SdDrawDocument::CreateLayoutTemplates()
+{
+ SdStyleSheetPool* pSSPool = static_cast<SdStyleSheetPool*>(GetStyleSheetPool());
+ SfxStyleSheetBase* pSheet = nullptr;
+ const OUString aHelpFile;
+ OUString aStdName(SdResId(STR_STANDARD_STYLESHEET_NAME));
+
+ // Default style
+
+ SfxStyleSearchBits nMask = SfxStyleSearchBits::Auto;
+
+ OUString aName(aStdName);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetHelpId( aHelpFile, HID_STANDARD_STYLESHEET_NAME );
+ SfxItemSet& rISet = pSheet->GetItemSet();
+
+ ::basegfx::B2DPolyPolygon aNullPolyPolygon;
+ Color aNullCol(COL_DEFAULT_SHAPE_STROKE);
+
+ XDash aNullDash;
+ XGradient aNullGrad(aNullCol,COL_WHITE);
+ aNullGrad.SetStartIntens( 100 );
+ aNullGrad.SetEndIntens( 100 );
+ XHatch aNullHatch(aNullCol);
+
+ // Line attributes (Extended OutputDevice)
+ rISet.Put(XLineStyleItem(drawing::LineStyle_SOLID));
+ rISet.Put(XLineColorItem(OUString(), COL_DEFAULT_SHAPE_STROKE));
+ rISet.Put(XLineWidthItem(0));
+ rISet.Put(XLineDashItem(aNullDash));
+ rISet.Put(XLineStartItem(aNullPolyPolygon));
+ rISet.Put(XLineEndItem(aNullPolyPolygon));
+ rISet.Put(XLineStartWidthItem(200));
+ rISet.Put(XLineEndWidthItem(200));
+ rISet.Put(XLineStartCenterItem());
+ rISet.Put(XLineEndCenterItem());
+ rISet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_BLOCK));
+
+ // Fill attributes (Extended OutputDevice)
+ rISet.Put(XFillStyleItem(drawing::FillStyle_SOLID));
+ rISet.Put(XFillColorItem(OUString(), COL_DEFAULT_SHAPE_FILLING));
+
+ rISet.Put( XFillGradientItem( aNullGrad) );
+ rISet.Put(XFillHatchItem(aNullHatch));
+ Size aNullSize( 32, 32 );
+ Bitmap aNullBmp(aNullSize, vcl::PixelFormat::N8_BPP);
+ aNullBmp.Erase( COL_WHITE );
+ rISet.Put(XFillBitmapItem(Graphic(BitmapEx(aNullBmp))));
+
+ // Shadow attributes (Drawing Engine)
+ rISet.Put(makeSdrShadowItem(false));
+ rISet.Put(makeSdrShadowColorItem(COL_GRAY));
+ rISet.Put(makeSdrShadowXDistItem(200)); // 3 mm Shadow distance
+ rISet.Put(makeSdrShadowYDistItem(200));
+
+ vcl::Font aLatinFont, aCJKFont, aCTLFont;
+
+ getDefaultFonts( aLatinFont, aCJKFont, aCTLFont );
+
+ SvxFontItem aSvxFontItem( aLatinFont.GetFamilyType(), aLatinFont.GetFamilyName(), aLatinFont.GetStyleName(), aLatinFont.GetPitch(),
+ aLatinFont.GetCharSet(), EE_CHAR_FONTINFO );
+
+ SvxFontItem aSvxFontItemCJK( aCJKFont.GetFamilyType(), aCJKFont.GetFamilyName(), aCJKFont.GetStyleName(), aCJKFont.GetPitch(),
+ aCJKFont.GetCharSet(), EE_CHAR_FONTINFO_CJK );
+
+ SvxFontItem aSvxFontItemCTL( aCTLFont.GetFamilyType(), aCTLFont.GetFamilyName(), aCTLFont.GetStyleName(), aCTLFont.GetPitch(),
+ aCTLFont.GetCharSet(), EE_CHAR_FONTINFO_CTL );
+
+ rISet.Put( aSvxFontItem );
+ rISet.Put( aSvxFontItemCJK );
+ rISet.Put( aSvxFontItemCTL );
+
+ rISet.Put( SvxFontHeightItem( 635, 100, EE_CHAR_FONTHEIGHT ) ); // sj: (i33745) changed default from 24 to 18 pt
+ rISet.Put( SvxFontHeightItem( 635, 100, EE_CHAR_FONTHEIGHT_CJK ) ); // 18 pt
+ rISet.Put( SvxFontHeightItem( convertFontHeightToCTL( 635 ), 100, EE_CHAR_FONTHEIGHT_CTL ) ); // 18 pt
+
+ rISet.Put( SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
+ rISet.Put( SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CJK ) );
+ rISet.Put( SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CTL ) );
+
+ rISet.Put( SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC ) );
+ rISet.Put( SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CJK ) );
+ rISet.Put( SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CTL ) );
+
+ rISet.Put(SvxContourItem(false, EE_CHAR_OUTLINE ));
+ rISet.Put(SvxShadowedItem(false, EE_CHAR_SHADOW ));
+ rISet.Put(SvxUnderlineItem(LINESTYLE_NONE, EE_CHAR_UNDERLINE));
+ rISet.Put(SvxOverlineItem(LINESTYLE_NONE, EE_CHAR_OVERLINE));
+ rISet.Put(SvxCrossedOutItem(STRIKEOUT_NONE, EE_CHAR_STRIKEOUT ));
+ rISet.Put(SvxCaseMapItem(SvxCaseMap::NotMapped, EE_CHAR_CASEMAP ));
+ rISet.Put(SvxEmphasisMarkItem(FontEmphasisMark::NONE, EE_CHAR_EMPHASISMARK));
+ rISet.Put(SvxCharReliefItem(FontRelief::NONE, EE_CHAR_RELIEF));
+ rISet.Put(SvxColorItem(COL_AUTO, EE_CHAR_COLOR ));
+
+ // Paragraph attributes (Edit Engine)
+ rISet.Put(SvxLRSpaceItem(EE_PARA_LRSPACE));
+ rISet.Put(SvxULSpaceItem(EE_PARA_ULSPACE));
+
+ rISet.Put( makeSdrTextLeftDistItem( 250 ) ); // sj: (i33745) using text frame distances seems to be a better default
+ rISet.Put( makeSdrTextRightDistItem( 250 ) );
+ rISet.Put( makeSdrTextUpperDistItem( 125 ) );
+ rISet.Put( makeSdrTextLowerDistItem( 125 ) );
+
+ // Set Word-wrap to true by default
+ rISet.Put( makeSdrTextWordWrapItem(true) );
+
+ rISet.Put( SvxLineSpacingItem( LINE_SPACE_DEFAULT_HEIGHT, EE_PARA_SBL ) );
+
+ // #i16874# enable kerning by default but only for new documents
+ rISet.Put( SvxAutoKernItem( true, EE_CHAR_PAIRKERNING ) );
+
+ // Bullet
+ // BulletItem and BulletFont for title and outline
+ SvxBulletItem aBulletItem(EE_PARA_BULLET);
+ // Identical in all layers
+ aBulletItem.SetStyle(SvxBulletStyle::BULLET);
+ aBulletItem.SetStart(1);
+ aBulletItem.SetScale(45); // In percent
+
+ vcl::Font aBulletFont( SdStyleSheetPool::GetBulletFont() );
+
+ aBulletFont.SetFontSize(Size(0,635)); // sj: (i33745) changed default from 24 to 18 pt
+
+ aBulletItem.SetFont(aBulletFont);
+ aBulletItem.SetSymbol( 0x25CF ); // In points
+ rISet.Put(aBulletItem);
+
+ // New BulletItem
+ SdStyleSheetPool::PutNumBulletItem( pSheet, aBulletFont );
+
+ SfxItemSet* pISet = nullptr;
+
+ // Default > Object without filling
+ {
+ aName = SdResId(STR_POOLSHEET_OBJWITHOUTFILL);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aStdName);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_OBJWITHOUTFILL );
+ pISet = &pSheet->GetItemSet();
+
+ pISet->Put(XFillStyleItem(drawing::FillStyle_NONE));
+ }
+ // Default > Object no fill no line
+ {
+ aName = SdResId(STR_POOLSHEET_OBJNOLINENOFILL);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aStdName);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_OBJNOLINENOFILL );
+ pISet = &pSheet->GetItemSet();
+
+ pISet->Put(XFillStyleItem(drawing::FillStyle_NONE));
+ pISet->Put(XLineStyleItem(drawing::LineStyle_NONE));
+ }
+
+ // tdf#94369
+
+ // Text
+ OUString aTextName;
+ {
+ aTextName = SdResId(STR_POOLSHEET_TEXT);
+ pSheet = &(pSSPool->Make(aTextName, SfxStyleFamily::Para, nMask));
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_TEXT );
+ pISet = &pSheet->GetItemSet();
+ aSvxFontItem.SetFamilyName("Noto Sans");
+ pISet->Put( aSvxFontItem ); // Noto Sans
+ pISet->Put(XFillStyleItem(drawing::FillStyle_SOLID)); // solid fill
+ pISet->Put(XFillColorItem(OUString(), Color(0xeeeeee))); // light gray 5
+ pISet->Put(XLineStyleItem(drawing::LineStyle_SOLID)); // solid fill
+ pISet->Put(XLineColorItem(OUString(), Color(0xcccccc))); // light gray 3
+ }
+ // Text > A4
+ OUString aA4Name;
+ {
+ aA4Name = SdResId(STR_POOLSHEET_A4);
+ pSheet = &(pSSPool->Make(aA4Name, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent( aTextName );
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_A4 );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put(SvxFontHeightItem(635, 100, EE_CHAR_FONTHEIGHT )); // 18 pt
+ pISet->Put(XFillStyleItem(drawing::FillStyle_NONE)); // no filling
+ }
+ // Text > A4 > Title
+ {
+
+ aName = SdResId(STR_POOLSHEET_A4_TITLE);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent( aA4Name );
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_A4_TITLE );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put(SvxFontHeightItem(1551, 100, EE_CHAR_FONTHEIGHT )); // 44 pt
+ pISet->Put(XLineStyleItem(drawing::LineStyle_NONE)); // no border
+ }
+ // Text > A4 > Headline
+ {
+ aName = SdResId(STR_POOLSHEET_A4_HEADLINE);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent( aA4Name );
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_A4_HEADLINE );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put(SvxFontHeightItem(847, 100, EE_CHAR_FONTHEIGHT )); // 24 pt
+ pISet->Put(XLineStyleItem(drawing::LineStyle_NONE)); // no border
+ }
+ // Text > A4 > Text
+ {
+ aName = SdResId(STR_POOLSHEET_A4_TEXT);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aA4Name);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_A4_TEXT );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put(XLineStyleItem(drawing::LineStyle_NONE)); // no border
+ }
+ // Text > A0
+ OUString aA0Name;
+ {
+ aA0Name = SdResId(STR_POOLSHEET_A0);
+ pSheet = &(pSSPool->Make(aA0Name, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aTextName);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_A0 );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put(SvxFontHeightItem(1692, 100, EE_CHAR_FONTHEIGHT )); // 48 pt
+ pISet->Put(XFillStyleItem(drawing::FillStyle_NONE)); // no filling
+ }
+ // Text > A0 > Title
+ {
+ aName = SdResId(STR_POOLSHEET_A0_TITLE);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aA0Name);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_A0_TITLE );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put(SvxFontHeightItem(3385, 100, EE_CHAR_FONTHEIGHT )); // 96 pt
+ pISet->Put(XLineStyleItem(drawing::LineStyle_NONE)); // no border
+ }
+ // Text > A0 > Headline
+ {
+ aName = SdResId(STR_POOLSHEET_A0_HEADLINE);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aA0Name);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_A0_HEADLINE );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put(SvxFontHeightItem(2538, 100, EE_CHAR_FONTHEIGHT )); // 72 pt
+ pISet->Put(XLineStyleItem(drawing::LineStyle_NONE)); // no border
+ }
+ // Text > A0 > Text
+ {
+ aName = SdResId(STR_POOLSHEET_A0_TEXT);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aA0Name);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_A0_TEXT );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put(XLineStyleItem(drawing::LineStyle_NONE)); // no border
+ }
+
+ // Graphic
+ OUString aGraphicName;
+ XFillGradientItem aFillGradient;
+ XGradient aGradient;
+
+ {
+ aGraphicName = SdResId(STR_POOLSHEET_GRAPHIC);
+ pSheet = &(pSSPool->Make(aGraphicName, SfxStyleFamily::Para, nMask));
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_GRAPHIC );
+ pISet = &pSheet->GetItemSet();
+ aSvxFontItem.SetFamilyName("Liberation Sans"); // Liberation Sans
+ pISet->Put( aSvxFontItem );
+ pISet->Put( SvxFontHeightItem(635, 100, EE_CHAR_FONTHEIGHT) ); // 18 pt
+ pISet->Put( XFillStyleItem(drawing::FillStyle_SOLID) ); // solid fill
+ pISet->Put( XFillColorItem(OUString(), COL_WHITE) ); // filled white
+
+ }
+ // Graphic > Shapes
+ OUString aShapesName;
+ {
+ aShapesName = SdResId(STR_POOLSHEET_SHAPES);
+ pSheet = &(pSSPool->Make(aShapesName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent( aGraphicName );
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_SHAPES);
+ pISet = &pSheet->GetItemSet();
+ pISet->Put(XFillStyleItem(drawing::FillStyle_GRADIENT)); // fill with gradient
+ aGradient.SetGradientStyle( ::awt::GradientStyle_RECT); // square type
+ aGradient.SetAngle( 0_deg10 ); // 0° angle
+ aGradient.SetStartColor( Color(0xcccccc) ); // white
+ aGradient.SetEndColor( COL_WHITE ); // light gray 3
+ aFillGradient.SetName( aShapesName );
+ aFillGradient.SetGradientValue(aGradient);
+ pISet->Put( aFillGradient );
+ pISet->Put( XLineStyleItem(drawing::LineStyle_NONE) ); // no border
+ pISet->Put( SvxFontHeightItem(494, 100, EE_CHAR_FONTHEIGHT) ); // 14 pt
+ pISet->Put( SvxWeightItem(WEIGHT_BOLD, EE_CHAR_WEIGHT) ); // bold
+ }
+ // Graphic > Shapes > Filled
+ OUString aFilledName(SdResId(STR_POOLSHEET_FILLED));
+ {
+ aName = aFilledName;
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_FILLED );
+ pSheet->SetParent( aShapesName );
+ pISet = &pSheet->GetItemSet();
+
+ aGradient.SetGradientStyle( ::awt::GradientStyle_LINEAR );
+ aGradient.SetAngle( 300_deg10 );
+ aGradient.SetStartColor( COL_WHITE ); // white
+ aGradient.SetEndColor( Color(0xcccccc) ); // light gray 3
+ aFillGradient.SetName( aName );
+ aFillGradient.SetGradientValue(aGradient);
+ pISet->Put( XFillStyleItem(drawing::FillStyle_GRADIENT) );
+ pISet->Put( aFillGradient );
+ }
+ // Graphic > Shapes > Filled > Blue
+ {
+ aName =SdResId(STR_POOLSHEET_FILLED_BLUE);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aFilledName);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_FILLED_BLUE );
+ pISet = &pSheet->GetItemSet();
+
+ aGradient.SetStartColor( Color(0x00729fcf) ); // light blue 2
+ aGradient.SetEndColor( Color(0x00355269) ); // dark blue 2
+ aFillGradient.SetName( aName );
+ aFillGradient.SetGradientValue(aGradient);
+ pISet->Put( aFillGradient );
+ pISet->Put( SvxColorItem(COL_WHITE, EE_CHAR_COLOR )); // font white
+ }
+ // Graphic > Shapes > Filled > Green
+ {
+ aName =SdResId(STR_POOLSHEET_FILLED_GREEN);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aFilledName);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_FILLED_GREEN );
+ pISet = &pSheet->GetItemSet();
+
+ aGradient.SetStartColor( Color(0x0077bc65) ); // light green 2
+ aGradient.SetEndColor( Color(0x00127622) ); // dark green 2
+ aFillGradient.SetName( aName );
+ aFillGradient.SetGradientValue(aGradient);
+ pISet->Put( aFillGradient );
+ pISet->Put( aSvxFontItem ); // font name
+ pISet->Put( SvxColorItem(COL_WHITE, EE_CHAR_COLOR )); // font white
+ }
+ // Graphic > Shapes > Filled > Red
+ {
+ aName =SdResId(STR_POOLSHEET_FILLED_RED);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aFilledName);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_FILLED_RED );
+ pISet = &pSheet->GetItemSet();
+
+ aGradient.SetStartColor( Color(0x00ff6d6d) ); // light red 2
+ aGradient.SetEndColor( Color(0x00c9211e) ); // dark red 2
+ aFillGradient.SetName( aName );
+ aFillGradient.SetGradientValue(aGradient);
+ pISet->Put( aFillGradient );
+ pISet->Put( SvxColorItem(COL_WHITE, EE_CHAR_COLOR )); // font white
+ }
+ // Graphic > Shapes > Filled > Yellow
+ {
+ aName =SdResId(STR_POOLSHEET_FILLED_YELLOW);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aFilledName);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_FILLED_YELLOW );
+ pISet = &pSheet->GetItemSet();
+
+ aGradient.SetStartColor( Color(0x00ffde59) ); // light gold 2
+ aGradient.SetEndColor( Color(0x00b47804) ); // dark gold 2
+ aFillGradient.SetName( aName );
+ aFillGradient.SetGradientValue(aGradient);
+ pISet->Put( aFillGradient );
+ pISet->Put( SvxColorItem(COL_WHITE, EE_CHAR_COLOR )); // font white
+ }
+ // Graphic > Shapes > Outlines
+ OUString aOutlineName(SdResId(STR_POOLSHEET_OUTLINE));
+ {
+ aName = aOutlineName;
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_OUTLINE );
+ pSheet->SetParent( aShapesName );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put( XFillStyleItem(drawing::FillStyle_NONE) ); // clear
+ pISet->Put( XLineStyleItem(drawing::LineStyle_SOLID) ); // solide line
+ pISet->Put( XLineWidthItem(81) ); // 2.3 pt
+ pISet->Put( XLineColorItem(OUString(), COL_BLACK) ); // b/w
+ }
+ // Graphic > Shapes > Outlines > Blue
+ {
+ aName =SdResId(STR_POOLSHEET_OUTLINE_BLUE);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aOutlineName);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_OUTLINE_BLUE );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put( XLineColorItem(OUString(), Color(0x00355269)) ); // dark blue 2
+ pISet->Put( SvxColorItem(Color(0x00355269), EE_CHAR_COLOR )); // font color
+ }
+ // Graphic > Shapes > Outlines > Green
+ {
+ aName =SdResId(STR_POOLSHEET_OUTLINE_GREEN);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aOutlineName);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_OUTLINE_GREEN );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put( XLineColorItem(OUString(), Color(0x00127622)) ); // dark green 2
+ pISet->Put( SvxColorItem(Color(0x00127622), EE_CHAR_COLOR )); // font color
+ }
+ // Graphic > Shapes > Outlines > Red
+ {
+ aName =SdResId(STR_POOLSHEET_OUTLINE_RED);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aOutlineName);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_OUTLINE_RED );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put( XLineColorItem(OUString(), Color(0x00c9211e)) ); // dark red 2
+ pISet->Put( SvxColorItem(Color(0x00c9211e), EE_CHAR_COLOR )); // font color
+ }
+ // Graphic > Shapes > Outlines > Yellow
+ {
+ aName =SdResId(STR_POOLSHEET_OUTLINE_YELLOW);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aOutlineName);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_OUTLINE_YELLOW );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put( XLineStyleItem(drawing::LineStyle_SOLID));
+ pISet->Put( XLineColorItem(OUString(), Color(0x00b47804)) ); // dark gold 2
+ pISet->Put( SvxColorItem(Color(0x00b47804), EE_CHAR_COLOR )); // font color
+ }
+ // Graphic > Lines
+ OUString aLinesName;
+ {
+ aLinesName = SdResId(STR_POOLSHEET_LINES);
+ pSheet = &(pSSPool->Make(aLinesName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent( aGraphicName );
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_LINES);
+ pISet = &pSheet->GetItemSet();
+ pISet->Put( XFillStyleItem(drawing::FillStyle_NONE) ); // clear
+ pISet->Put( XLineStyleItem(drawing::LineStyle_SOLID) ); // solide line
+ pISet->Put( XLineColorItem(OUString(), COL_BLACK) ); // b/w
+ }
+ // Graphic > Lines > Measurements
+ {
+ aName = SdResId(STR_POOLSHEET_MEASURE);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aLinesName);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_MEASURE );
+ pISet = &pSheet->GetItemSet();
+
+ ::basegfx::B2DPolygon aArrow; // arrows
+ aArrow.append(::basegfx::B2DPoint(10.0, 0.0));
+ aArrow.append(::basegfx::B2DPoint(0.0, 30.0));
+ aArrow.append(::basegfx::B2DPoint(20.0, 30.0));
+ aArrow.setClosed(true);
+
+ pISet->Put(XLineStartItem(SvxResId(RID_SVXSTR_ARROW),::basegfx::B2DPolyPolygon(aArrow)));
+ pISet->Put(XLineStartWidthItem(200));
+ pISet->Put(XLineEndItem(SvxResId(RID_SVXSTR_ARROW),::basegfx::B2DPolyPolygon(aArrow)));
+ pISet->Put(XLineEndWidthItem(200));
+ pISet->Put(SdrYesNoItem(SDRATTR_MEASURESHOWUNIT, true));
+ }
+ // Graphic > Lines > Dashed
+ {
+ aName = SdResId(STR_POOLSHEET_LINES_DASHED);
+ pSheet = &(pSSPool->Make(aName, SfxStyleFamily::Para, nMask));
+ pSheet->SetParent(aLinesName);
+ pSheet->SetHelpId( aHelpFile, HID_POOLSHEET_LINES_DASHED );
+ pISet = &pSheet->GetItemSet();
+ pISet->Put( XLineStyleItem(drawing::LineStyle_DASH) ); // dashed line
+ }
+
+ // Generate presentation templates for default layout.
+ OUString aPrefix = SdResId(STR_LAYOUT_DEFAULT_NAME);
+ pSSPool->CreateLayoutStyleSheets(aPrefix);
+}
+
+static Any implMakeSolidCellStyle( SdStyleSheetPool* pSSPool, const OUString& rName, const OUString& rParent, const Color& rColor )
+{
+ SfxStyleSheetBase* pSheet = &(pSSPool->Make(rName, SfxStyleFamily::Frame, SfxStyleSearchBits::Auto));
+ pSheet->SetParent(rParent);
+ SfxItemSet* pISet = &pSheet->GetItemSet();
+ pISet->Put(XFillStyleItem(drawing::FillStyle_SOLID));
+ pISet->Put(XFillColorItem(OUString(), rColor));
+
+ return Any( Reference< XStyle >( static_cast< XWeak* >( pSheet ), UNO_QUERY ) );
+}
+
+static void implCreateTableTemplate( const Reference< XNameContainer >& xTableFamily, const OUString& rName, const Any& rBody, const Any& rHeading, const Any& rBanding )
+{
+ if( !xTableFamily.is() )
+ return;
+
+ try
+ {
+ if( !xTableFamily->hasByName( rName ) )
+ {
+ Reference< XSingleServiceFactory > xFactory( xTableFamily, UNO_QUERY_THROW );
+ Reference< XNameReplace > xDefaultTableStyle( xFactory->createInstance(), UNO_QUERY_THROW );
+ xTableFamily->insertByName( rName, Any( xDefaultTableStyle ) );
+
+ xDefaultTableStyle->replaceByName( "body", rBody );
+ xDefaultTableStyle->replaceByName( "odd-rows" , rBanding );
+ xDefaultTableStyle->replaceByName( "odd-columns" , rBanding );
+ xDefaultTableStyle->replaceByName( "first-row" , rHeading );
+ xDefaultTableStyle->replaceByName( "first-column" , rHeading );
+ xDefaultTableStyle->replaceByName( "last-row" , rHeading );
+ xDefaultTableStyle->replaceByName( "last-column" , rHeading );
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::implCreateTableTemplate()");
+ }
+}
+
+void SdDrawDocument::CreateDefaultCellStyles()
+{
+ SdStyleSheetPool* pSSPool = static_cast< SdStyleSheetPool* >(GetStyleSheetPool());
+ SfxStyleSheetBase* pSheet = nullptr;
+
+ Reference< XNameContainer > xTableFamily( pSSPool->getByName( "table" ), UNO_QUERY );
+
+ // ---- Default -----------------------------------------------
+
+ OUString aDefaultCellStyleName( "default" );
+
+ pSheet = &(pSSPool->Make(aDefaultCellStyleName, SfxStyleFamily::Frame, SfxStyleSearchBits::Auto));
+ pSheet->SetHelpId( OUString(), HID_SD_CELL_STYLE_DEFAULT );
+ SfxItemSet& rISet = pSheet->GetItemSet();
+
+ rISet.Put(XFillStyleItem(drawing::FillStyle_SOLID));
+ rISet.Put(XFillColorItem(OUString(), Color(0x00ccccff)));
+
+ vcl::Font aLatinFont, aCJKFont, aCTLFont;
+
+ getDefaultFonts( aLatinFont, aCJKFont, aCTLFont );
+
+ SvxFontItem aSvxFontItem( aLatinFont.GetFamilyType(), aLatinFont.GetFamilyName(), aLatinFont.GetStyleName(), aLatinFont.GetPitch(),
+ aLatinFont.GetCharSet(), EE_CHAR_FONTINFO );
+
+ SvxFontItem aSvxFontItemCJK( aCJKFont.GetFamilyType(), aCJKFont.GetFamilyName(), aCJKFont.GetStyleName(), aCJKFont.GetPitch(),
+ aCJKFont.GetCharSet(), EE_CHAR_FONTINFO_CJK );
+
+ SvxFontItem aSvxFontItemCTL( aCTLFont.GetFamilyType(), aCTLFont.GetFamilyName(), aCTLFont.GetStyleName(), aCTLFont.GetPitch(),
+ aCTLFont.GetCharSet(), EE_CHAR_FONTINFO_CTL );
+
+ rISet.Put( aSvxFontItem );
+ rISet.Put( aSvxFontItemCJK );
+ rISet.Put( aSvxFontItemCTL );
+
+ rISet.Put( SvxFontHeightItem( 635, 100, EE_CHAR_FONTHEIGHT ) ); // sj: (i33745) changed default from 24 to 18 pt
+ rISet.Put( SvxFontHeightItem( 635, 100, EE_CHAR_FONTHEIGHT_CJK ) ); // 18 pt
+ rISet.Put( SvxFontHeightItem( convertFontHeightToCTL( 635 ), 100, EE_CHAR_FONTHEIGHT_CTL ) ); // 18 pt
+
+ rISet.Put(SvxColorItem(COL_AUTO, EE_CHAR_COLOR ));
+
+ // Paragraph attributes (Edit Engine)
+ rISet.Put(SvxLRSpaceItem(EE_PARA_LRSPACE));
+ rISet.Put(SvxULSpaceItem(EE_PARA_ULSPACE));
+
+ rISet.Put( makeSdrTextLeftDistItem( 250 ) );
+ rISet.Put( makeSdrTextRightDistItem( 250 ) );
+ rISet.Put( makeSdrTextUpperDistItem( 130 ) );
+ rISet.Put( makeSdrTextLowerDistItem( 130 ) );
+
+ rISet.Put( SvxLineSpacingItem( LINE_SPACE_DEFAULT_HEIGHT, EE_PARA_SBL ) );
+ rISet.Put( SvxAutoKernItem( true, EE_CHAR_PAIRKERNING ) );
+ rISet.Put( SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP) );
+ rISet.Put( SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_LEFT) );
+
+ Color aWhite( COL_WHITE );
+ ::editeng::SvxBorderLine aBorderLine(
+ &aWhite, 1, SvxBorderLineStyle::SOLID);
+
+ SvxBoxItem aBoxItem( SDRATTR_TABLE_BORDER );
+ aBoxItem.SetLine( &aBorderLine, SvxBoxItemLine::TOP );
+ aBoxItem.SetLine( &aBorderLine, SvxBoxItemLine::BOTTOM );
+ aBoxItem.SetLine( &aBorderLine, SvxBoxItemLine::LEFT );
+ aBoxItem.SetLine( &aBorderLine, SvxBoxItemLine::RIGHT );
+
+ rISet.Put( aBoxItem );
+
+ // ---- default --------------------------------------------------
+
+ Any aGray1( implMakeSolidCellStyle( pSSPool, "gray1" , aDefaultCellStyleName, Color(230,230,230)));
+ Any aGray2( implMakeSolidCellStyle( pSSPool, "gray2" , aDefaultCellStyleName, Color(204,204,204)));
+ Any aGray3( implMakeSolidCellStyle( pSSPool, "gray3" , aDefaultCellStyleName, Color(179,179,179)));
+
+ implCreateTableTemplate( xTableFamily, "default" , aGray1, aGray3, aGray2 );
+
+ // ---- BW ------------------------------------------------
+
+ Any aBW1( implMakeSolidCellStyle( pSSPool, "bw1" , aDefaultCellStyleName, Color(255,255,255)));
+ Any aBW2( implMakeSolidCellStyle( pSSPool, "bw2" , aDefaultCellStyleName, Color(230,230,230)));
+ Any aBW3( implMakeSolidCellStyle( pSSPool, "bw3" , aDefaultCellStyleName, Color(0,0,0)));
+
+ implCreateTableTemplate( xTableFamily, "bw" , aBW1, aBW3, aBW2 );
+
+ // ---- Orange --------------------------------------------------
+
+ Any aOrange1( implMakeSolidCellStyle( pSSPool, "orange1" , aDefaultCellStyleName, Color(255,204,153)));
+ Any aOrange2( implMakeSolidCellStyle( pSSPool, "orange2" , aDefaultCellStyleName, Color(255,153,102)));
+ Any aOrange3( implMakeSolidCellStyle( pSSPool, "orange3" , aDefaultCellStyleName, Color(255,102,51)));
+
+ implCreateTableTemplate( xTableFamily, "orange" , aOrange1, aOrange3, aOrange2 );
+
+ // ---- Turquoise --------------------------------------------------
+
+ Any aTurquoise1( implMakeSolidCellStyle( pSSPool, "turquoise1" , aDefaultCellStyleName, Color(71,184,184)));
+ Any aTurquoise2( implMakeSolidCellStyle( pSSPool, "turquoise2" , aDefaultCellStyleName, Color(51,163,163)));
+ Any aTurquoise3( implMakeSolidCellStyle( pSSPool, "turquoise3" , aDefaultCellStyleName, Color(25,138,138)));
+
+ implCreateTableTemplate( xTableFamily, "turquoise" , aTurquoise1, aTurquoise3, aTurquoise2 );
+
+ // ---- Gray ------------------------------------------------
+
+ Any aBlue1( implMakeSolidCellStyle( pSSPool, "blue1" , aDefaultCellStyleName, Color(153,204,255)));
+ Any aBlue2( implMakeSolidCellStyle( pSSPool, "blue2" , aDefaultCellStyleName, Color(0,153,255)));
+ Any aBlue3( implMakeSolidCellStyle( pSSPool, "blue3" , aDefaultCellStyleName, Color(0,102,204)));
+
+ implCreateTableTemplate( xTableFamily, "blue" , aBlue1, aBlue3, aBlue2 );
+
+ // ---- Sun ------------------------------------------------
+
+ Any aSun1( implMakeSolidCellStyle( pSSPool, "sun1" , aDefaultCellStyleName, Color(230,230,255)));
+ Any aSun2( implMakeSolidCellStyle( pSSPool, "sun2" , aDefaultCellStyleName, Color(204,204,255)));
+ Any aSun3( implMakeSolidCellStyle( pSSPool, "sun3" , aDefaultCellStyleName, Color(153,153,255)));
+
+ implCreateTableTemplate( xTableFamily, "sun" , aSun1, aSun3, aSun2 );
+
+ // ---- Earth ----------------------------------------------
+
+ Any aEarth1( implMakeSolidCellStyle( pSSPool, "earth1" , aDefaultCellStyleName, Color(255,255,204)));
+ Any aEarth2( implMakeSolidCellStyle( pSSPool, "earth2" , aDefaultCellStyleName, Color(255,204,153)));
+ Any aEarth3( implMakeSolidCellStyle( pSSPool, "earth3" , aDefaultCellStyleName, Color(204,102,51)));
+
+ implCreateTableTemplate( xTableFamily, "earth" , aEarth1, aEarth3, aEarth2 );
+
+ // ---- Green ----------------------------------------------
+
+ Any aGreen1( implMakeSolidCellStyle( pSSPool, "green1" , aDefaultCellStyleName, Color(255,255,204)));
+ Any aGreen2( implMakeSolidCellStyle( pSSPool, "green2" , aDefaultCellStyleName, Color(148,189,94)));
+ Any aGreen3( implMakeSolidCellStyle( pSSPool, "green3" , aDefaultCellStyleName, Color(92,133,38)));
+
+ implCreateTableTemplate( xTableFamily, "green" , aGreen1, aGreen3, aGreen2 );
+
+ // ---- Seaweed ----------------------------------------------
+
+ Any aSeetang1( implMakeSolidCellStyle( pSSPool, "seetang1" , aDefaultCellStyleName, Color(204,255,255)));
+ Any aSeetang2( implMakeSolidCellStyle( pSSPool, "seetang2" , aDefaultCellStyleName, Color(71,184,184)));
+ Any aSeetang3( implMakeSolidCellStyle( pSSPool, "seetang3" , aDefaultCellStyleName, Color(51,163,163)));
+
+ implCreateTableTemplate( xTableFamily, "seetang" , aSeetang1, aSeetang3, aSeetang2 );
+
+ // ---- LightBlue ----------------------------------------------
+
+ Any aLightBlue1( implMakeSolidCellStyle( pSSPool, "lightblue1" , aDefaultCellStyleName, Color(255,255,255)));
+ Any aLightBlue2( implMakeSolidCellStyle( pSSPool, "lightblue2" , aDefaultCellStyleName, Color(230,230,255)));
+ Any aLightBlue3( implMakeSolidCellStyle( pSSPool, "lightblue3" , aDefaultCellStyleName, Color(153,153,204)));
+
+ implCreateTableTemplate( xTableFamily, "lightblue" , aLightBlue1, aLightBlue3, aLightBlue2 );
+
+ // ---- Yellow ----------------------------------------------
+
+ Any aYellow1( implMakeSolidCellStyle( pSSPool, "yellow1" , aDefaultCellStyleName, Color(255,255,204)));
+ Any aYellow2( implMakeSolidCellStyle( pSSPool, "yellow2" , aDefaultCellStyleName, Color(255,255,153)));
+ Any aYellow3( implMakeSolidCellStyle( pSSPool, "yellow3" , aDefaultCellStyleName, Color(255,204,153)));
+
+ implCreateTableTemplate( xTableFamily, "yellow" , aYellow1, aYellow3, aYellow2 );
+}
+
+// Number of pages that reference a master page
+sal_uInt16 SdDrawDocument::GetMasterPageUserCount(SdrPage const * pMaster) const
+{
+ sal_uInt16 nResult = 0;
+ sal_uInt16 nPage;
+ sal_uInt16 nPageCount = GetPageCount();
+
+ for (nPage = 0; nPage < nPageCount; nPage++)
+ {
+ const SdrPage* pPage = GetPage(nPage);
+
+ if(pPage->TRG_HasMasterPage())
+ {
+ if(&(pPage->TRG_GetMasterPage()) == pMaster)
+ {
+ nResult++;
+ }
+ }
+ }
+ return nResult;
+}
+
+// Finish OnlineSpelling in the background
+
+void SdDrawDocument::StopOnlineSpelling()
+{
+ if (mpOnlineSpellingIdle && mpOnlineSpellingIdle->IsActive())
+ {
+ mpOnlineSpellingIdle->Stop();
+ }
+
+ mpOnlineSpellingIdle.reset();
+ mpOnlineSpellingList.reset();
+}
+
+// Start OnlineSpelling in the background
+void SdDrawDocument::StartOnlineSpelling(bool bForceSpelling)
+{
+ if ( !mbOnlineSpell || !(bForceSpelling || mbInitialOnlineSpellingEnabled) ||
+ !mpDocSh || mpDocSh->IsReadOnly() )
+ return;
+
+ StopOnlineSpelling();
+
+ SdOutliner* pOutl = GetInternalOutliner();
+
+ Reference< XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() );
+ if ( xSpellChecker.is() )
+ pOutl->SetSpeller( xSpellChecker );
+
+ Reference< XHyphenator > xHyphenator( LinguMgr::GetHyphenator() );
+ if( xHyphenator.is() )
+ pOutl->SetHyphenator( xHyphenator );
+
+ pOutl->SetDefaultLanguage( meLanguage );
+
+ mpOnlineSpellingList.reset(new ShapeList);
+ sal_uInt16 nPage;
+
+ for ( nPage = 0; nPage < GetPageCount(); nPage++ )
+ {
+ // Search in all pages
+ FillOnlineSpellingList(static_cast<SdPage*>(GetPage(nPage)));
+ }
+
+ for (nPage = 0; nPage < GetMasterPageCount(); nPage++)
+ {
+ // Search all master pages
+ FillOnlineSpellingList(static_cast<SdPage*>( GetMasterPage(nPage) ));
+ }
+
+ mpOnlineSpellingList->seekShape(0);
+ mpOnlineSpellingIdle.reset(new Idle("OnlineSpelling"));
+ mpOnlineSpellingIdle->SetInvokeHandler( LINK(this, SdDrawDocument, OnlineSpellingHdl) );
+ mpOnlineSpellingIdle->SetPriority(TaskPriority::LOWEST);
+ mpOnlineSpellingIdle->Start();
+}
+
+// Fill OnlineSpelling list
+void SdDrawDocument::FillOnlineSpellingList(SdPage const * pPage)
+{
+ SdrObjListIter aIter(pPage, SdrIterMode::Flat);
+
+ while (aIter.IsMore())
+ {
+ SdrObject* pObj = aIter.Next();
+
+ if( !pObj )
+ continue;
+
+ if (pObj->GetOutlinerParaObject())
+ {
+ // Found a text object
+ mpOnlineSpellingList->addShape(*pObj);
+ }
+ else if (pObj->GetObjIdentifier() == SdrObjKind::Group)
+ {
+ // Found a group object
+ SdrObjListIter aGroupIter(static_cast< SdrObjGroup* >(pObj)->GetSubList(), SdrIterMode::DeepNoGroups);
+
+ bool bSubTextObjFound = false;
+
+ while (aGroupIter.IsMore() && !bSubTextObjFound)
+ {
+ if (aGroupIter.Next()->GetOutlinerParaObject())
+ {
+ // Found a text object in a group object
+ bSubTextObjFound = true;
+ }
+ }
+
+ if (bSubTextObjFound)
+ {
+ mpOnlineSpellingList->addShape(*pObj);
+ }
+ }
+ }
+}
+
+// OnlineSpelling in the background
+IMPL_LINK_NOARG(SdDrawDocument, OnlineSpellingHdl, Timer *, void)
+{
+ if (mpOnlineSpellingList!=nullptr
+ && ( !mbOnlineSpell || mpOnlineSpellingList->hasMore()))
+ {
+ // Spell next object
+ SdrObject* pObj = mpOnlineSpellingList->getNextShape();
+
+ if (pObj)
+ {
+ if (pObj->GetOutlinerParaObject() && dynamic_cast< const SdrTextObj *>( pObj ) != nullptr)
+ {
+ // Spell text object
+ SpellObject(static_cast<SdrTextObj*>(pObj));
+ }
+ else if (pObj->GetObjIdentifier() == SdrObjKind::Group)
+ {
+ // Found a group object
+ SdrObjListIter aGroupIter(static_cast< SdrObjGroup* >(pObj)->GetSubList(), SdrIterMode::DeepNoGroups);
+
+
+ while (aGroupIter.IsMore())
+ {
+ SdrObject* pSubObj = aGroupIter.Next();
+
+ if (pSubObj->GetOutlinerParaObject())
+ if (auto pTextObj = dynamic_cast< SdrTextObj *>( pSubObj ))
+ // Found a text object in a group object
+ SpellObject(pTextObj);
+ }
+ }
+ }
+
+ // Continue search
+ mpOnlineSpellingIdle->Start();
+ }
+ else
+ {
+ // Initial spelling has finished
+ mbInitialOnlineSpellingEnabled = false;
+
+ // Stop search
+ StopOnlineSpelling();
+
+ mpOnlineSearchItem.reset();
+ }
+}
+
+// Spell object (for OnlineSpelling)
+void SdDrawDocument::SpellObject(SdrTextObj* pObj)
+{
+ if (!(pObj && pObj->GetOutlinerParaObject()) /* && pObj != pView->GetTextEditObject() */)
+ return;
+
+ mbHasOnlineSpellErrors = false;
+ SdOutliner* pOutl = GetInternalOutliner();
+ pOutl->SetUpdateLayout(true);
+ Link<EditStatus&,void> aEvtHdl = pOutl->GetStatusEventHdl();
+ pOutl->SetStatusEventHdl(LINK(this, SdDrawDocument, OnlineSpellEventHdl));
+
+ OutlinerMode nOldOutlMode = pOutl->GetOutlinerMode();
+ OutlinerMode nOutlMode = OutlinerMode::TextObject;
+ if (pObj->GetObjInventor() == SdrInventor::Default &&
+ pObj->GetObjIdentifier() == SdrObjKind::OutlineText)
+ {
+ nOutlMode = OutlinerMode::OutlineObject;
+ }
+ pOutl->Init( nOutlMode );
+
+ // Put text into the outliner
+ pOutl->SetText(*pObj->GetOutlinerParaObject());
+
+ if (!mpOnlineSearchItem || pOutl->HasText(*mpOnlineSearchItem))
+ {
+ // Spelling
+ pOutl->CompleteOnlineSpelling();
+
+ if (mbHasOnlineSpellErrors)
+ {
+ std::optional<OutlinerParaObject> pOPO = pOutl->CreateParaObject();
+ if (pOPO)
+ {
+ if ( *pOPO != *pObj->GetOutlinerParaObject() ||
+ !pObj->GetOutlinerParaObject()->isWrongListEqual( *pOPO ))
+ {
+ sd::ModifyGuard aGuard( this );
+
+ // taking text from the outliner
+ // use non-broadcasting version to avoid O(n^2)
+ pObj->NbcSetOutlinerParaObject( std::move(pOPO) );
+ }
+ }
+ }
+ }
+
+ pOutl->SetStatusEventHdl(aEvtHdl);
+ pOutl->SetUpdateLayout(false);
+ pOutl->Init( nOldOutlMode );
+ mbHasOnlineSpellErrors = false;
+}
+
+// Object was inserted into model
+void SdDrawDocument::InsertObject(SdrObject* pObj)
+{
+ if(mpOnlineSpellingList && pObj)
+ {
+ if (pObj->GetOutlinerParaObject() || (pObj->GetObjIdentifier() == SdrObjKind::Group))
+ {
+ // Add object to OnlineSpelling list
+ mpOnlineSpellingList->addShape(*pObj);
+ }
+ }
+}
+
+// Object removed from model
+void SdDrawDocument::RemoveObject(SdrObject* pObj)
+{
+ if(mpOnlineSpellingList && pObj)
+ {
+ if (pObj->GetOutlinerParaObject() || (pObj->GetObjIdentifier() == SdrObjKind::Group))
+ {
+ // Replace object in OnlineSpelling list by 0 pointer
+ mpOnlineSpellingList->removeShape(*pObj);
+ }
+ }
+}
+
+// Callback for ExecuteSpellPopup()
+IMPL_LINK(SdDrawDocument, OnlineSpellEventHdl, EditStatus&, rEditStat, void)
+{
+ EditStatusFlags nStat = rEditStat.GetStatusWord();
+ mbHasOnlineSpellErrors = bool(nStat & EditStatusFlags::WRONGWORDCHANGED);
+}
+
+// Callback for ExecuteSpellPopup()
+
+// removed link and replaced with Imp method
+void SdDrawDocument::ImpOnlineSpellCallback(SpellCallbackInfo const * pInfo, SdrObject* pObj, SdrOutliner const * pOutl)
+{
+ mpOnlineSearchItem.reset();
+
+ SpellCallbackCommand nCommand = pInfo->nCommand;
+
+ if (nCommand == SpellCallbackCommand::IGNOREWORD
+ // restart when add to dictionary takes place, too.
+ || nCommand == SpellCallbackCommand::ADDTODICTIONARY)
+ {
+ if(pOutl)
+ if (auto pTextObj = dynamic_cast<SdrTextObj *>( pObj ))
+ {
+ bool bModified(IsChanged());
+ pTextObj->SetOutlinerParaObject(pOutl->CreateParaObject());
+ SetChanged(bModified);
+ pObj->BroadcastObjectChange();
+ }
+
+ mpOnlineSearchItem.reset(new SvxSearchItem( SID_SEARCH_ITEM ) );
+ mpOnlineSearchItem->SetSearchString(pInfo->aWord);
+ StartOnlineSpelling();
+ }
+ else if (nCommand == SpellCallbackCommand::STARTSPELLDLG)
+ {
+ if (SfxViewFrame* pViewFrame = SfxViewFrame::Current())
+ pViewFrame->GetDispatcher()->Execute( SID_SPELL_DIALOG, SfxCallMode::ASYNCHRON );
+ }
+ else if (nCommand == SpellCallbackCommand::AUTOCORRECT_OPTIONS)
+ {
+ if (SfxViewFrame* pViewFrame = SfxViewFrame::Current())
+ pViewFrame->GetDispatcher()->Execute( SID_AUTO_CORRECT_DLG, SfxCallMode::ASYNCHRON );
+ }
+}
+
+// Return formatted page number (1, I, i, a, etc.)
+OUString SdDrawDocument::CreatePageNumValue(sal_uInt16 nNum) const
+{
+ OUString aPageNumValue;
+ bool bUpper = false;
+
+ switch (mePageNumType)
+ {
+ case css::style::NumberingType::CHARS_UPPER_LETTER:
+ aPageNumValue += OUStringChar( sal_Unicode((nNum - 1) % 26 + 'A') );
+ break;
+ case css::style::NumberingType::CHARS_LOWER_LETTER:
+ aPageNumValue += OUStringChar( sal_Unicode((nNum - 1) % 26 + 'a') );
+ break;
+ case css::style::NumberingType::ROMAN_UPPER:
+ bUpper = true;
+ [[fallthrough]];
+ case css::style::NumberingType::ROMAN_LOWER:
+ aPageNumValue += SvxNumberFormat::CreateRomanString(nNum, bUpper);
+ break;
+ case css::style::NumberingType::NUMBER_NONE:
+ aPageNumValue = " ";
+ break;
+ default:
+ aPageNumValue += OUString::number(nNum);
+ }
+
+ return aPageNumValue;
+}
+
+// Rename layout template
+// Keep in mind that rOldLayoutName contains the _complete_ name of the layout
+// (including ~LT~). This is unlike rNewName.
+void SdDrawDocument::RenameLayoutTemplate(const OUString& rOldLayoutName, const OUString& rNewName)
+{
+ OUString aSep(SD_LT_SEPARATOR);
+ OUString aOldName(rOldLayoutName);
+ sal_Int32 nPos = aOldName.indexOf( aSep );
+
+ // erase everything after '~LT~'
+ if (nPos != -1)
+ aOldName = aOldName.copy(0, nPos + aSep.getLength());
+
+ std::vector<StyleReplaceData> aReplList;
+ SfxStyleSheetIterator aIter(mxStyleSheetPool.get(), SfxStyleFamily::Page);
+ SfxStyleSheetBase* pSheet = aIter.First();
+
+ while (pSheet)
+ {
+ OUString aSheetName = pSheet->GetName();
+
+ // if the sheetname starts with aOldName + "~LT~"
+ if (aSheetName.startsWith(aOldName))
+ {
+ aSheetName = aSheetName.replaceAt(0, aOldName.getLength() - aSep.getLength(), rNewName);
+
+ StyleReplaceData aReplData;
+ aReplData.nFamily = pSheet->GetFamily();
+ aReplData.nNewFamily = pSheet->GetFamily();
+ aReplData.aName = pSheet->GetName();
+ aReplData.aNewName = aSheetName;
+ aReplList.push_back(aReplData);
+
+ pSheet->SetName(aSheetName);
+ }
+
+ pSheet = aIter.Next();
+ }
+
+ // Now set the layout name of the drawing and the notes page, as well as
+ // their master pages.
+ OUString aPageLayoutName = rNewName + aSep + STR_LAYOUT_OUTLINE;
+
+ // Inform all text objects on pages that use the renamed layout and set the
+ // new name.
+ sal_uInt16 nPage;
+ for (nPage = 0; nPage < GetPageCount(); nPage++)
+ {
+ SdPage* pPage = static_cast<SdPage*>(GetPage(nPage));
+ OUString aTemp(pPage->GetLayoutName());
+
+ if (aTemp == rOldLayoutName)
+ {
+ pPage->SetLayoutName(aPageLayoutName);
+
+ for (size_t nObj = 0; nObj < pPage->GetObjCount(); ++nObj)
+ {
+ SdrObject* pObj = pPage->GetObj(nObj);
+
+ if (pObj->GetObjInventor() == SdrInventor::Default)
+ {
+ switch( pObj->GetObjIdentifier() )
+ {
+ case SdrObjKind::Text:
+ case SdrObjKind::OutlineText:
+ case SdrObjKind::TitleText:
+ {
+ OutlinerParaObject* pOPO = static_cast<SdrTextObj*>(pObj)->GetOutlinerParaObject();
+
+ if (pOPO)
+ {
+ for (const auto& rRepl : aReplList)
+ pOPO->ChangeStyleSheets( rRepl.aName, rRepl.nFamily, rRepl.aNewName, rRepl.nNewFamily );
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Now do this again for all master pages.
+ // The affected master pages get the name of the layout as their page name.
+ for (nPage = 0; nPage < GetMasterPageCount(); nPage++)
+ {
+ SdPage* pPage = static_cast<SdPage*>( GetMasterPage(nPage) );
+ OUString aTemp(pPage->GetLayoutName());
+
+ if (aTemp == rOldLayoutName)
+ {
+ pPage->SetLayoutName(aPageLayoutName);
+ pPage->SetName(rNewName);
+
+ for (size_t nObj = 0; nObj < pPage->GetObjCount(); ++nObj)
+ {
+ SdrObject* pObj = pPage->GetObj(nObj);
+
+ if (pObj->GetObjInventor() == SdrInventor::Default)
+ {
+ switch(pObj->GetObjIdentifier())
+ {
+ case SdrObjKind::Text:
+ case SdrObjKind::OutlineText:
+ case SdrObjKind::TitleText:
+ {
+ OutlinerParaObject* pOPO = static_cast<SdrTextObj*>(pObj)->GetOutlinerParaObject();
+
+ if (pOPO)
+ {
+ for (const auto& rRepl : aReplList)
+ pOPO->ChangeStyleSheets( rRepl.aName, rRepl.nFamily, rRepl.aNewName, rRepl.nNewFamily );
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+}
+
+// Set outliner defaults (pool defaults)
+void SdDrawDocument::SetTextDefaults() const
+{
+ // BulletItem and BulletFont for Title and Outline
+ SvxBulletItem aBulletItem(EE_PARA_BULLET);
+ vcl::Font aBulletFont( SdStyleSheetPool::GetBulletFont() );
+ aBulletFont.SetFontSize(Size(0,846)); // 24 pt
+ aBulletItem.SetFont(aBulletFont);
+ aBulletItem.SetStyle(SvxBulletStyle::BULLET);
+ aBulletItem.SetStart(1);
+ aBulletItem.SetScale(45); // In percent
+ aBulletItem.SetSymbol( 0x25CF ); // In points
+ m_pItemPool->SetPoolDefaultItem( aBulletItem );
+
+ // New BulletItem
+ SvxNumberFormat aNumberFormat(SVX_NUM_CHAR_SPECIAL);
+ aNumberFormat.SetBulletFont(&aBulletFont);
+ aNumberFormat.SetBulletChar( 0x25CF ); // StarBats: 0xF000 + 34
+ aNumberFormat.SetBulletRelSize(45);
+ aNumberFormat.SetBulletColor(COL_AUTO);
+ aNumberFormat.SetStart(1);
+ aNumberFormat.SetNumAdjust(SvxAdjust::Left);
+
+ SvxNumRule aNumRule( SvxNumRuleFlags::BULLET_REL_SIZE | SvxNumRuleFlags::BULLET_COLOR, SVX_MAX_NUM, false);
+
+ //aNumberFormat.SetAbsLSpace( 0 );
+ //aNumberFormat.SetFirstLineOffset( 0 );
+ //aNumRule.SetLevel( 0, aNumberFormat );
+
+ for( sal_uInt16 i = 0; i < aNumRule.GetLevelCount(); i++ )
+ {
+ const auto nLSpace = (i + 1) * 600;
+ aNumberFormat.SetAbsLSpace(nLSpace);
+ aNumberFormat.SetFirstLineOffset(-600);
+ aNumRule.SetLevel( i, aNumberFormat );
+ }
+
+ SvxNumBulletItem aNumBulletItem( std::move(aNumRule), EE_PARA_NUMBULLET );
+ m_pItemPool->SetPoolDefaultItem( aNumBulletItem );
+}
+
+css::text::WritingMode SdDrawDocument::GetDefaultWritingMode() const
+{
+ const SfxPoolItem* pItem = ( m_pItemPool ? m_pItemPool->GetPoolDefaultItem( EE_PARA_WRITINGDIR ) : nullptr );
+ css::text::WritingMode eRet = css::text::WritingMode_LR_TB;
+
+ if( pItem )
+ {
+ switch( static_cast<const SvxFrameDirectionItem&>( *pItem ).GetValue() )
+ {
+ case SvxFrameDirection::Horizontal_LR_TB: eRet = css::text::WritingMode_LR_TB; break;
+ case SvxFrameDirection::Horizontal_RL_TB: eRet = css::text::WritingMode_RL_TB; break;
+ case SvxFrameDirection::Vertical_RL_TB: eRet = css::text::WritingMode_TB_RL; break;
+
+ default:
+ OSL_FAIL( "Frame direction not supported yet" );
+ break;
+ }
+ }
+
+ return eRet;
+}
+
+void SdDrawDocument::SetDefaultWritingMode(css::text::WritingMode eMode )
+{
+ if( !m_pItemPool )
+ return;
+
+ SvxFrameDirection nVal;
+ switch( eMode )
+ {
+ case css::text::WritingMode_LR_TB: nVal = SvxFrameDirection::Horizontal_LR_TB; break;
+ case css::text::WritingMode_RL_TB: nVal = SvxFrameDirection::Horizontal_RL_TB; break;
+ case css::text::WritingMode_TB_RL: nVal = SvxFrameDirection::Vertical_RL_TB; break;
+ default:
+ OSL_FAIL( "Frame direction not supported yet" );
+ return;
+ }
+
+ SvxFrameDirectionItem aModeItem( nVal, EE_PARA_WRITINGDIR );
+ m_pItemPool->SetPoolDefaultItem( aModeItem );
+
+ SvxAdjustItem aAdjust( SvxAdjust::Left, EE_PARA_JUST );
+
+ if( eMode == css::text::WritingMode_RL_TB )
+ aAdjust.SetAdjust( SvxAdjust::Right );
+
+ m_pItemPool->SetPoolDefaultItem( aAdjust );
+}
+
+void SdDrawDocument::getDefaultFonts( vcl::Font& rLatinFont, vcl::Font& rCJKFont, vcl::Font& rCTLFont )
+{
+ LanguageType eLatin = GetLanguage( EE_CHAR_LANGUAGE );
+
+ // If the UI language is Korean, the default Latin font has to
+ // be queried for Korean, too (the Latin language from the document can't be Korean).
+ // This is the same logic as in SwDocShell::InitNew.
+ LanguageType eUiLanguage = Application::GetSettings().GetUILanguageTag().getLanguageType();
+ if (MsLangId::isKorean(eUiLanguage))
+ eLatin = eUiLanguage;
+
+ rLatinFont = OutputDevice::GetDefaultFont( DefaultFontType::LATIN_PRESENTATION, eLatin, GetDefaultFontFlags::OnlyOne );
+ rCJKFont = OutputDevice::GetDefaultFont( DefaultFontType::CJK_PRESENTATION, GetLanguage( EE_CHAR_LANGUAGE_CJK ), GetDefaultFontFlags::OnlyOne );
+ rCTLFont = OutputDevice::GetDefaultFont( DefaultFontType::CTL_PRESENTATION, GetLanguage( EE_CHAR_LANGUAGE_CTL ), GetDefaultFontFlags::OnlyOne ) ;
+}
+
+/* converts the given western font height to a corresponding ctl font height, depending on the system language */
+sal_uInt32 SdDrawDocument::convertFontHeightToCTL( sal_uInt32 nWesternFontHeight )
+{
+ LanguageType eRealCTLLanguage = Application::GetSettings().GetLanguageTag().getLanguageType();
+ if( LANGUAGE_THAI == eRealCTLLanguage )
+ {
+ // http://specs.openoffice.org/g11n/font_sizes/42775_42725_Individual_configurable_font_size_for_default_fonts.odt
+ double fTemp = double(nWesternFontHeight) * 1.333;
+ nWesternFontHeight = static_cast<sal_uInt32>(fTemp);
+ // make some nice values for UI that displays PT instead of 1/100th mm
+ nWesternFontHeight = convertPointToMm100(convertMm100ToPoint(nWesternFontHeight));
+ }
+ return nWesternFontHeight;
+}
+
+SdStyleSheetPool* SdDrawDocument::GetSdStyleSheetPool() const
+{
+ return dynamic_cast< SdStyleSheetPool* >( GetStyleSheetPool() );
+}
+
+ModifyGuard::ModifyGuard( SdDrawDocument* pDoc )
+: mpDocShell( nullptr ), mpDoc( pDoc )
+{
+ init();
+}
+
+void ModifyGuard::init()
+{
+ if( mpDocShell )
+ {
+ mpDoc = mpDocShell->GetDoc();
+ }
+ else if( mpDoc )
+ {
+ mpDocShell = mpDoc->GetDocSh();
+ }
+
+ mbIsEnableSetModified = mpDocShell && mpDocShell->IsEnableSetModified();
+ mbIsDocumentChanged = mpDoc && mpDoc->IsChanged();
+
+ if( mbIsEnableSetModified )
+ mpDocShell->EnableSetModified( false );
+}
+
+ModifyGuard::~ModifyGuard()
+{
+ if( mbIsEnableSetModified )
+ mpDocShell->EnableSetModified();
+
+ if( mpDoc && (mpDoc->IsChanged() != mbIsDocumentChanged) )
+ mpDoc->SetChanged(mbIsDocumentChanged);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/drawdoc_animations.cxx b/sd/source/core/drawdoc_animations.cxx
new file mode 100644
index 000000000..b7f1bd557
--- /dev/null
+++ b/sd/source/core/drawdoc_animations.cxx
@@ -0,0 +1,54 @@
+/* -*- 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 <createpresentation.hxx>
+#include <drawdoc.hxx>
+#include <cusshow.hxx>
+#include <customshowlist.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::presentation;
+
+/** replaces a slide from all custom shows with a new one or removes a slide from
+ all custom shows if pNewPage is 0.
+*/
+void SdDrawDocument::ReplacePageInCustomShows(const SdPage* pOldPage, const SdPage* pNewPage)
+{
+ if (mpCustomShowList)
+ {
+ for (size_t i = 0; i < mpCustomShowList->size(); i++)
+ {
+ SdCustomShow* pCustomShow = (*mpCustomShowList)[i].get();
+ pCustomShow->ReplacePage(pOldPage, pNewPage);
+ }
+ }
+}
+
+const Reference<XPresentation2>& SdDrawDocument::getPresentation() const
+{
+ if (!mxPresentation.is())
+ {
+ const_cast<SdDrawDocument*>(this)->mxPresentation = CreatePresentation(*this);
+ }
+ return mxPresentation;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/pglink.cxx b/sd/source/core/pglink.cxx
new file mode 100644
index 000000000..358012df9
--- /dev/null
+++ b/sd/source/core/pglink.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/.
+ *
+ * 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 <sfx2/linkmgr.hxx>
+
+#include <pglink.hxx>
+#include <sdpage.hxx>
+#include <drawdoc.hxx>
+
+/*************************************************************************
+|*
+|* Ctor
+|*
+\************************************************************************/
+
+SdPageLink::SdPageLink(SdPage* pPg, const OUString& rFileName,
+ const OUString& rBookmarkName) :
+ ::sfx2::SvBaseLink( ::SfxLinkUpdateMode::ONCALL, SotClipboardFormatId::SIMPLE_FILE),
+ pPage(pPg)
+{
+ pPage->SetFileName(rFileName);
+ pPage->SetBookmarkName(rBookmarkName);
+}
+
+/*************************************************************************
+|*
+|* Dtor
+|*
+\************************************************************************/
+
+SdPageLink::~SdPageLink()
+{
+}
+
+/*************************************************************************
+|*
+|* Date have changed
+|*
+\************************************************************************/
+
+::sfx2::SvBaseLink::UpdateResult SdPageLink::DataChanged(
+ const OUString&, const css::uno::Any& )
+{
+ SdDrawDocument* pDoc = static_cast<SdDrawDocument*>( &pPage->getSdrModelFromSdrPage() );
+ sfx2::LinkManager* pLinkManager = pDoc!=nullptr ? pDoc->GetLinkManager() : nullptr;
+
+ if (pLinkManager)
+ {
+ /**********************************************************************
+ * Only standard pages are allowed to be linked
+ * The corresponding note pages are updated automatically
+ **********************************************************************/
+ OUString aFileName;
+ OUString aBookmarkName;
+ OUString aFilterName;
+ sfx2::LinkManager::GetDisplayNames( this,nullptr, &aFileName, &aBookmarkName,
+ &aFilterName);
+ pPage->SetFileName(aFileName);
+ pPage->SetBookmarkName(aBookmarkName);
+
+ SdDrawDocument* pBookmarkDoc = pDoc->OpenBookmarkDoc(aFileName);
+
+ if (pBookmarkDoc)
+ {
+ /******************************************************************
+ * the linked page is replaced in the model
+ ******************************************************************/
+ if (aBookmarkName.isEmpty())
+ {
+ // no page name specified: we assume it is the first page
+ aBookmarkName = pBookmarkDoc->GetSdPage(0, PageKind::Standard)->GetName();
+ pPage->SetBookmarkName(aBookmarkName);
+ }
+
+ std::vector<OUString> aBookmarkList { aBookmarkName };
+ sal_uInt16 nInsertPos = pPage->GetPageNum();
+ bool bNoDialogs = false;
+ bool bCopy = false;
+
+ if (SdDrawDocument::s_pDocLockedInsertingLinks)
+ {
+ // resolving links while loading pDoc
+ bNoDialogs = true;
+ bCopy = true;
+ }
+
+ pDoc->InsertBookmarkAsPage(aBookmarkList, nullptr, true/*bLink*/, true/*bReplace*/,
+ nInsertPos, bNoDialogs, nullptr, bCopy, true, true);
+
+ if (!SdDrawDocument::s_pDocLockedInsertingLinks)
+ pDoc->CloseBookmarkDoc();
+ }
+ }
+ return SUCCESS;
+}
+
+/*************************************************************************
+|*
+|* Connect or disconnect link
+|*
+\************************************************************************/
+
+void SdPageLink::Closed()
+{
+ // the connection is closed
+ pPage->SetFileName(OUString());
+ pPage->SetBookmarkName(OUString());
+
+ SvBaseLink::Closed();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/sdiocmpt.cxx b/sd/source/core/sdiocmpt.cxx
new file mode 100644
index 000000000..67de6a64d
--- /dev/null
+++ b/sd/source/core/sdiocmpt.cxx
@@ -0,0 +1,117 @@
+/* -*- 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 <tools/debug.hxx>
+
+#include <sdiocmpt.hxx>
+
+old_SdrDownCompat::old_SdrDownCompat(SvStream& rNewStream, StreamMode nNewMode)
+: rStream(rNewStream),
+ nSubRecSiz(0),
+ nSubRecPos(0),
+ nMode(nNewMode),
+ bOpen(false)
+{
+ OpenSubRecord();
+}
+
+old_SdrDownCompat::~old_SdrDownCompat()
+{
+ if(bOpen)
+ CloseSubRecord();
+}
+
+void old_SdrDownCompat::Write()
+{
+ rStream.WriteUInt32( nSubRecSiz );
+}
+
+void old_SdrDownCompat::OpenSubRecord()
+{
+ if(rStream.GetError())
+ return;
+
+ nSubRecPos = rStream.Tell();
+
+ if(nMode == StreamMode::READ)
+ {
+ rStream.ReadUInt32( nSubRecSiz );
+ }
+ else if(nMode == StreamMode::WRITE)
+ {
+ Write();
+ }
+
+ bOpen = true;
+}
+
+void old_SdrDownCompat::CloseSubRecord()
+{
+ if(rStream.GetError())
+ return;
+
+ sal_uInt32 nCurrentPos(rStream.Tell());
+
+ if(nMode == StreamMode::READ)
+ {
+ sal_uInt32 nReadCnt(nCurrentPos - nSubRecPos);
+ if(nReadCnt != nSubRecSiz)
+ {
+ rStream.Seek(nSubRecPos + nSubRecSiz);
+ }
+ }
+ else if(nMode == StreamMode::WRITE)
+ {
+ nSubRecSiz = nCurrentPos - nSubRecPos;
+ rStream.Seek(nSubRecPos);
+ Write();
+ rStream.Seek(nCurrentPos);
+ }
+
+ bOpen = false;
+}
+
+/*************************************************************************
+|*
+|* Constructor, writes and reads version number
+|*
+\************************************************************************/
+
+SdIOCompat::SdIOCompat(SvStream& rNewStream, StreamMode nNewMode, sal_uInt16 nVersion)
+: old_SdrDownCompat(rNewStream, nNewMode)
+{
+ if (nNewMode == StreamMode::WRITE)
+ {
+ DBG_ASSERT(nVersion != SDIOCOMPAT_VERSIONDONTKNOW,
+ "can't write unknown version");
+ rNewStream.WriteUInt16( nVersion );
+ }
+ else if (nNewMode == StreamMode::READ)
+ {
+ DBG_ASSERT(nVersion == SDIOCOMPAT_VERSIONDONTKNOW,
+ "referring to the version while reading is silly!");
+ rNewStream.ReadUInt16( nVersion );
+ }
+}
+
+SdIOCompat::~SdIOCompat()
+{
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/sdpage.cxx b/sd/source/core/sdpage.cxx
new file mode 100644
index 000000000..38318f294
--- /dev/null
+++ b/sd/source/core/sdpage.cxx
@@ -0,0 +1,3157 @@
+/* -*- 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 <algorithm>
+#include <array>
+
+#include <comphelper/classids.hxx>
+#include <comphelper/embeddedobjectcontainer.hxx>
+
+#include <sfx2/viewsh.hxx>
+#include <vcl/svapp.hxx>
+#include <editeng/outliner.hxx>
+#include <editeng/eeitem.hxx>
+#include <svx/svdoutl.hxx>
+#include <editeng/editdata.hxx>
+#include <editeng/lrspitem.hxx>
+#include <editeng/bulletitem.hxx>
+#include <svx/svdpagv.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/outlobj.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdopage.hxx>
+#include <editeng/pbinitem.hxx>
+#include <svx/svdundo.hxx>
+#include <svl/hint.hxx>
+#include <editeng/adjustitem.hxx>
+#include <editeng/editobj.hxx>
+#include <svx/unopage.hxx>
+#include <editeng/flditem.hxx>
+#include <svx/sdr/contact/displayinfo.hxx>
+#include <svx/svditer.hxx>
+#include <svx/svdlayer.hxx>
+#include <svx/sdtmfitm.hxx>
+#include <svx/sdtagitm.hxx>
+#include <svx/sdtcfitm.hxx>
+#include <svx/xfillit0.hxx>
+#include <tools/diagnose_ex.h>
+#include <com/sun/star/animations/XAnimationNode.hpp>
+#include <com/sun/star/animations/XTimeContainer.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/embed/XEmbeddedObject.hpp>
+#include <com/sun/star/xml/dom/XNode.hpp>
+#include <com/sun/star/xml/dom/XNodeList.hpp>
+#include <com/sun/star/xml/dom/XNamedNodeMap.hpp>
+#include <rtl/ustring.hxx>
+#include <sal/log.hxx>
+#include <o3tl/enumarray.hxx>
+#include <o3tl/safeint.hxx>
+#include <o3tl/sorted_vector.hxx>
+#include <xmloff/autolayout.hxx>
+
+#include <Outliner.hxx>
+#include <app.hrc>
+#include <createunopageimpl.hxx>
+#include <drawdoc.hxx>
+#include <sdmod.hxx>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <stlsheet.hxx>
+#include <strings.hrc>
+#include <strings.hxx>
+#include <bitmaps.hlst>
+#include <glob.hxx>
+#include <anminfo.hxx>
+#include <undo/undomanager.hxx>
+#include <undo/undoobjects.hxx>
+#include <svx/sdr/contact/viewobjectcontact.hxx>
+#include <svx/sdr/contact/viewcontact.hxx>
+#include <svx/sdr/contact/objectcontact.hxx>
+#include <svx/unoapi.hxx>
+#include <unokywds.hxx>
+
+using namespace ::sd;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace com::sun::star::xml::dom;
+using ::com::sun::star::uno::Reference;
+
+
+sal_uInt16 SdPage::mnLastPageId = 1;
+
+/*************************************************************************
+|*
+|* Ctor
+|*
+\************************************************************************/
+
+SdPage::SdPage(SdDrawDocument& rNewDoc, bool bMasterPage)
+: FmFormPage(rNewDoc, bMasterPage)
+, SdrObjUserCall()
+, mePageKind(PageKind::Standard)
+, meAutoLayout(AUTOLAYOUT_NONE)
+, mbSelected(false)
+, mePresChange(PresChange::Manual)
+, mfTime(1.0)
+, mbSoundOn(false)
+, mbExcluded(false)
+, mbLoopSound(false)
+, mbStopSound(false)
+, mbScaleObjects(true)
+, meCharSet(osl_getThreadTextEncoding())
+, mnPaperBin(PAPERBIN_PRINTER_SETTINGS)
+, mpPageLink(nullptr)
+, mnTransitionType(0)
+, mnTransitionSubtype(0)
+, mbTransitionDirection(true)
+, mnTransitionFadeColor(0)
+, mfTransitionDuration(2.0)
+, mbIsPrecious(true)
+, mnPageId(mnLastPageId++)
+{
+ // The name of the layout of the page is used by SVDRAW to determine the
+ // presentation template of the outline objects. Therefore, it already
+ // contains the designator for the outline (STR_LAYOUT_OUTLINE).
+ maLayoutName = SdResId(STR_LAYOUT_DEFAULT_NAME)+ SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE;
+
+ // Stuff that former SetModel did also:
+ ConnectLink();
+}
+
+namespace
+{
+ void clearChildNodes(css::uno::Reference<css::animations::XAnimationNode> const & rAnimationNode)
+ {
+ css::uno::Reference<css::container::XEnumerationAccess > xEnumerationAccess(rAnimationNode, UNO_QUERY);
+ if (!xEnumerationAccess.is())
+ return;
+ css::uno::Reference<css::container::XEnumeration> xEnumeration = xEnumerationAccess->createEnumeration();
+ if (!xEnumeration.is())
+ return;
+ while (xEnumeration->hasMoreElements())
+ {
+ css::uno::Reference<css::animations::XAnimationNode> xChildNode(xEnumeration->nextElement(), UNO_QUERY);
+ if (!xChildNode.is())
+ continue;
+ clearChildNodes(xChildNode);
+ css::uno::Reference<css::animations::XTimeContainer> xAnimationNode(rAnimationNode, UNO_QUERY);
+ if (!xAnimationNode.is())
+ {
+ SAL_WARN("sd.core", "can't remove node child, possible leak");
+ continue;
+ }
+ xAnimationNode->removeChild(xChildNode);
+ }
+ }
+}
+
+/*************************************************************************
+|*
+|* Dtor
+|*
+\************************************************************************/
+
+SdPage::~SdPage()
+{
+ DisconnectLink();
+
+ EndListenOutlineText();
+
+ clearChildNodes(mxAnimationNode);
+
+ // disconnect the UserCall link
+ SdrObjListIter aIter( this, SdrIterMode::DeepWithGroups );
+ while( aIter.IsMore() )
+ {
+ SdrObject* pChild = aIter.Next();
+ if( pChild->GetUserCall() == this )
+ pChild->SetUserCall(nullptr);
+ }
+
+ // clear SdrObjects with broadcasting
+ ClearSdrObjList();
+}
+
+namespace {
+
+struct OrdNumSorter
+{
+ bool operator()( SdrObject const * p1, SdrObject const * p2 )
+ {
+ return p1->GetOrdNum() < p2->GetOrdNum();
+ }
+};
+
+}
+
+/** returns the nIndex'th object from the given PresObjKind, index starts with 1 */
+SdrObject* SdPage::GetPresObj(PresObjKind eObjKind, int nIndex, bool bFuzzySearch /* = false */ )
+{
+ // first sort all matching shapes with z-order
+ std::vector< SdrObject* > aMatches;
+
+ SdrObject* pObj = nullptr;
+ maPresentationShapeList.seekShape(0);
+
+ while( (pObj = maPresentationShapeList.getNextShape()) )
+ {
+ SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pObj);
+ if( pInfo )
+ {
+ bool bFound = false;
+ if( pInfo->mePresObjKind == eObjKind )
+ {
+ bFound = true;
+ }
+ else if( bFuzzySearch && (eObjKind == PresObjKind::Outline) )
+ {
+ switch( pInfo->mePresObjKind )
+ {
+ case PresObjKind::Graphic:
+ case PresObjKind::Object:
+ case PresObjKind::Chart:
+ case PresObjKind::OrgChart:
+ case PresObjKind::Table:
+ case PresObjKind::Calc:
+ case PresObjKind::Media:
+ bFound = true;
+ break;
+ default:
+ break;
+ }
+ }
+ if( bFound )
+ {
+ aMatches.push_back( pObj );
+ }
+ }
+ }
+
+ if( nIndex > 0 )
+ nIndex--;
+
+ if( (nIndex >= 0) && ( aMatches.size() > o3tl::make_unsigned(nIndex)) )
+ {
+ if( aMatches.size() > 1 )
+ std::nth_element( aMatches.begin(), aMatches.begin() + nIndex, aMatches.end(),
+ OrdNumSorter() );
+ return aMatches[nIndex];
+ }
+
+ return nullptr;
+}
+
+/** create background properties */
+void SdPage::EnsureMasterPageDefaultBackground()
+{
+ if(!mbMaster)
+ return;
+
+ // no hard attributes on MasterPage attributes
+ getSdrPageProperties().ClearItem();
+ SfxStyleSheet* pSheetForPresObj = GetStyleSheetForMasterPageBackground();
+
+ if(pSheetForPresObj)
+ {
+ // set StyleSheet for background fill attributes
+ getSdrPageProperties().SetStyleSheet(pSheetForPresObj);
+ }
+ else
+ {
+ // no style found, assert and set at least drawing::FillStyle_NONE
+ OSL_FAIL("No Style for MasterPageBackground fill found (!)");
+ getSdrPageProperties().PutItem(XFillStyleItem(drawing::FillStyle_NONE));
+ }
+}
+
+/** creates a presentation object with the given PresObjKind on this page. A user call will be set
+*/
+SdrObject* SdPage::CreatePresObj(PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect )
+{
+ SfxUndoManager* pUndoManager(static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetUndoManager());
+ const bool bUndo = pUndoManager && pUndoManager->IsInListAction() && IsInserted();
+
+ SdrObject* pSdrObj = nullptr;
+
+ bool bForceText = false; // forces the shape text to be set even if it's empty
+ bool bEmptyPresObj = true;
+
+ switch( eObjKind )
+ {
+ case PresObjKind::Title:
+ {
+ pSdrObj = new SdrRectObj(getSdrModelFromSdrPage(), SdrObjKind::TitleText);
+
+ if (mbMaster)
+ {
+ pSdrObj->SetNotVisibleAsMaster(true);
+ }
+ }
+ break;
+
+ case PresObjKind::Outline:
+ {
+ pSdrObj = new SdrRectObj(getSdrModelFromSdrPage(), SdrObjKind::OutlineText);
+
+ if (mbMaster)
+ {
+ pSdrObj->SetNotVisibleAsMaster(true);
+ }
+ }
+ break;
+
+ case PresObjKind::Notes:
+ {
+ pSdrObj = new SdrRectObj(getSdrModelFromSdrPage(), SdrObjKind::Text);
+
+ if (mbMaster)
+ {
+ pSdrObj->SetNotVisibleAsMaster(true);
+ }
+ }
+ break;
+
+ case PresObjKind::Text:
+ {
+ pSdrObj = new SdrRectObj(getSdrModelFromSdrPage(), SdrObjKind::Text);
+ }
+ break;
+
+ case PresObjKind::Graphic:
+ {
+ BitmapEx aBmpEx(BMP_PRESOBJ_GRAPHIC);
+ Graphic aGraphic( aBmpEx );
+ OutputDevice &aOutDev = *Application::GetDefaultDevice();
+ aOutDev.Push();
+
+ aOutDev.SetMapMode( aGraphic.GetPrefMapMode() );
+ Size aSizePix = aOutDev.LogicToPixel( aGraphic.GetPrefSize() );
+ aOutDev.SetMapMode(MapMode(MapUnit::Map100thMM));
+
+ Size aSize = aOutDev.PixelToLogic(aSizePix);
+ Point aPnt (0, 0);
+ ::tools::Rectangle aRect (aPnt, aSize);
+ pSdrObj = new SdrGrafObj(getSdrModelFromSdrPage(), aGraphic, aRect);
+ aOutDev.Pop();
+ }
+ break;
+
+ case PresObjKind::Media:
+ case PresObjKind::Object:
+ {
+ pSdrObj = new SdrOle2Obj(getSdrModelFromSdrPage());
+ BitmapEx aBmpEx(BMP_PRESOBJ_OBJECT);
+ Graphic aGraphic( aBmpEx );
+ static_cast<SdrOle2Obj*>(pSdrObj)->SetGraphic(aGraphic);
+ }
+ break;
+
+ case PresObjKind::Chart:
+ {
+ pSdrObj = new SdrOle2Obj(getSdrModelFromSdrPage());
+ static_cast<SdrOle2Obj*>(pSdrObj)->SetProgName( "StarChart" );
+ BitmapEx aBmpEx(BMP_PRESOBJ_CHART);
+ Graphic aGraphic( aBmpEx );
+ static_cast<SdrOle2Obj*>(pSdrObj)->SetGraphic(aGraphic);
+ }
+ break;
+
+ case PresObjKind::OrgChart:
+ {
+ pSdrObj = new SdrOle2Obj(getSdrModelFromSdrPage());
+ static_cast<SdrOle2Obj*>(pSdrObj)->SetProgName( "StarOrg" );
+ BitmapEx aBmpEx(BMP_PRESOBJ_ORGCHART);
+ Graphic aGraphic( aBmpEx );
+ static_cast<SdrOle2Obj*>(pSdrObj)->SetGraphic(aGraphic);
+ }
+ break;
+
+ case PresObjKind::Table:
+ case PresObjKind::Calc:
+ {
+ pSdrObj = new SdrOle2Obj(getSdrModelFromSdrPage());
+ static_cast<SdrOle2Obj*>(pSdrObj)->SetProgName( "StarCalc" );
+ BitmapEx aBmpEx(BMP_PRESOBJ_TABLE);
+ Graphic aGraphic( aBmpEx );
+ static_cast<SdrOle2Obj*>(pSdrObj)->SetGraphic(aGraphic);
+ }
+ break;
+
+ case PresObjKind::Handout:
+ {
+ // Save the first standard page at SdrPageObj
+ // #i105146# We want no content to be displayed for PageKind::Handout,
+ // so just never set a page as content
+ pSdrObj = new SdrPageObj(getSdrModelFromSdrPage(), nullptr);
+ }
+ break;
+
+ case PresObjKind::Page:
+ {
+ // Save note pages at SdrPageObj
+ sal_uInt16 nDestPageNum(GetPageNum());
+
+ if(nDestPageNum)
+ {
+ // decrement only when != 0, else we get a 0xffff
+ nDestPageNum -= 1;
+ }
+
+ if (nDestPageNum < getSdrModelFromSdrPage().GetPageCount())
+ {
+ pSdrObj = new SdrPageObj(getSdrModelFromSdrPage(), getSdrModelFromSdrPage().GetPage(nDestPageNum));
+ }
+ else
+ {
+ pSdrObj = new SdrPageObj(getSdrModelFromSdrPage());
+ }
+
+ pSdrObj->SetResizeProtect(true);
+ }
+ break;
+
+ case PresObjKind::Header:
+ case PresObjKind::Footer:
+ case PresObjKind::DateTime:
+ case PresObjKind::SlideNumber:
+ {
+ pSdrObj = new SdrRectObj(getSdrModelFromSdrPage(), SdrObjKind::Text);
+ bEmptyPresObj = false;
+ bForceText = true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (pSdrObj)
+ {
+ pSdrObj->SetEmptyPresObj(bEmptyPresObj);
+ pSdrObj->SetLogicRect(rRect);
+
+ InsertObject(pSdrObj);
+
+ if ( auto pTextObj = dynamic_cast<SdrTextObj *>( pSdrObj ) )
+ {
+ // Tell the object EARLY that it is vertical to have the
+ // defaults for AutoGrowWidth/Height reversed
+ if(bVertical)
+ pTextObj->SetVerticalWriting(true);
+
+ SfxItemSet aTempAttr(static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetPool());
+ if( bVertical )
+ aTempAttr.Put( makeSdrTextMinFrameWidthItem( rRect.GetSize().Width() ) );
+ else
+ aTempAttr.Put( makeSdrTextMinFrameHeightItem( rRect.GetSize().Height() ) );
+
+ if (mbMaster)
+ {
+ // The size of presentation objects on the master page have to
+ // be freely selectable by the user.
+
+ // potential problem: This action was still NOT
+ // adapted for vertical text. This sure needs to be done.
+ if(bVertical)
+ aTempAttr.Put(makeSdrTextAutoGrowWidthItem(false));
+ else
+ aTempAttr.Put(makeSdrTextAutoGrowHeightItem(false));
+ }
+
+ // check if we need another vertical adjustment than the default
+ SdrTextVertAdjust eV = SDRTEXTVERTADJUST_TOP;
+
+ if( (eObjKind == PresObjKind::Footer) && (mePageKind != PageKind::Standard) )
+ {
+ eV = SDRTEXTVERTADJUST_BOTTOM;
+ }
+ else if( (eObjKind == PresObjKind::SlideNumber) && (mePageKind != PageKind::Standard) )
+ {
+ eV = SDRTEXTVERTADJUST_BOTTOM;
+ }
+
+ if( eV != SDRTEXTVERTADJUST_TOP )
+ aTempAttr.Put(SdrTextVertAdjustItem(eV));
+
+ pSdrObj->SetMergedItemSet(aTempAttr);
+
+ pSdrObj->SetLogicRect(rRect);
+ }
+
+ OUString aString = GetPresObjText(eObjKind);
+ if(!aString.isEmpty() || bForceText)
+ if (auto pTextObj = dynamic_cast<SdrTextObj *>( pSdrObj ) )
+ {
+ SdrOutliner* pOutliner = static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetInternalOutliner();
+
+ OutlinerMode nOutlMode = pOutliner->GetOutlinerMode();
+ pOutliner->Init( OutlinerMode::TextObject );
+ pOutliner->SetStyleSheet( 0, nullptr );
+ pOutliner->SetVertical( bVertical );
+
+ SetObjText( pTextObj, pOutliner, eObjKind, aString );
+
+ pOutliner->Init( nOutlMode );
+ pOutliner->SetStyleSheet( 0, nullptr );
+ }
+
+ if( (eObjKind == PresObjKind::Header) || (eObjKind == PresObjKind::Footer) || (eObjKind == PresObjKind::SlideNumber) || (eObjKind == PresObjKind::DateTime) )
+ {
+ SfxItemSet aTempAttr(static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetPool());
+ aTempAttr.Put( SvxFontHeightItem( 493, 100, EE_CHAR_FONTHEIGHT ) );
+ aTempAttr.Put( SvxFontHeightItem( 493, 100, EE_CHAR_FONTHEIGHT_CTL ) );
+ aTempAttr.Put( SvxFontHeightItem( 493, 100, EE_CHAR_FONTHEIGHT_CJK ) );
+
+ SvxAdjust eH = SvxAdjust::Left;
+
+ if( (eObjKind == PresObjKind::DateTime) && (mePageKind != PageKind::Standard ) )
+ {
+ eH = SvxAdjust::Right;
+ }
+ else if( (eObjKind == PresObjKind::Footer) && (mePageKind == PageKind::Standard ) )
+ {
+ eH = SvxAdjust::Center;
+ }
+ else if( eObjKind == PresObjKind::SlideNumber )
+ {
+ eH = SvxAdjust::Right;
+ }
+
+ if( eH != SvxAdjust::Left )
+ aTempAttr.Put(SvxAdjustItem(eH, EE_PARA_JUST ));
+
+ pSdrObj->SetMergedItemSet(aTempAttr);
+ }
+
+ if (mbMaster)
+ {
+ SdrLayerAdmin& rLayerAdmin(getSdrModelFromSdrPage().GetLayerAdmin());
+
+ // background objects of the master page
+ pSdrObj->SetLayer( rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects) );
+ }
+
+ // Subscribe object at the style sheet
+ // Set style only when one was found (as in 5.2)
+ if( mePageKind != PageKind::Handout )
+ {
+ SfxStyleSheet* pSheetForPresObj = GetStyleSheetForPresObj(eObjKind);
+ if(pSheetForPresObj)
+ pSdrObj->SetStyleSheet(pSheetForPresObj, false);
+ }
+
+ if (eObjKind == PresObjKind::Outline)
+ {
+ for (sal_uInt16 nLevel = 1; nLevel < 10; nLevel++)
+ {
+ OUString aName( maLayoutName + " " + OUString::number( nLevel ) );
+ SfxStyleSheet* pSheet = static_cast<SfxStyleSheet*>(getSdrModelFromSdrPage().GetStyleSheetPool()->Find(aName, SfxStyleFamily::Page));
+ DBG_ASSERT(pSheet, "StyleSheet for outline object not found");
+ if (pSheet)
+ pSdrObj->StartListening(*pSheet, DuplicateHandling::Allow);
+ }
+ }
+
+ if ( eObjKind == PresObjKind::Object ||
+ eObjKind == PresObjKind::Chart ||
+ eObjKind == PresObjKind::OrgChart ||
+ eObjKind == PresObjKind::Calc ||
+ eObjKind == PresObjKind::Graphic )
+ {
+ SfxItemSet aSet( static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetPool() );
+ aSet.Put( makeSdrTextContourFrameItem( true ) );
+ aSet.Put( SvxAdjustItem( SvxAdjust::Center, EE_PARA_JUST ) );
+
+ pSdrObj->SetMergedItemSet(aSet);
+ }
+
+ if( bUndo )
+ {
+ pUndoManager->AddUndoAction(getSdrModelFromSdrPage().GetSdrUndoFactory().CreateUndoNewObject(*pSdrObj));
+
+ pUndoManager->AddUndoAction( std::make_unique<UndoObjectPresentationKind>( *pSdrObj ) );
+ pUndoManager->AddUndoAction( std::make_unique<UndoObjectUserCall>(*pSdrObj) );
+ }
+
+ InsertPresObj(pSdrObj, eObjKind);
+ pSdrObj->SetUserCall(this);
+
+ pSdrObj->RecalcBoundRect();
+ }
+
+ return pSdrObj;
+}
+
+/*************************************************************************
+|*
+|* Creates presentation objects on the master page.
+|* All presentation objects get a UserCall to the page.
+|*
+\************************************************************************/
+
+SfxStyleSheet* SdPage::GetStyleSheetForMasterPageBackground() const
+{
+ OUString aName(GetLayoutName());
+ OUString aSep( SD_LT_SEPARATOR );
+ sal_Int32 nPos = aName.indexOf(aSep);
+
+ if (nPos != -1)
+ {
+ nPos = nPos + aSep.getLength();
+ aName = aName.copy(0, nPos);
+ }
+
+ aName += STR_LAYOUT_BACKGROUND;
+
+ SfxStyleSheetBasePool* pStShPool = getSdrModelFromSdrPage().GetStyleSheetPool();
+ SfxStyleSheetBase* pResult = pStShPool->Find(aName, SfxStyleFamily::Page);
+ return static_cast<SfxStyleSheet*>(pResult);
+}
+
+SfxStyleSheet* SdPage::GetStyleSheetForPresObj(PresObjKind eObjKind) const
+{
+ OUString aName(GetLayoutName());
+ OUString aSep( SD_LT_SEPARATOR );
+ sal_Int32 nPos = aName.indexOf(aSep);
+ if (nPos != -1)
+ {
+ nPos = nPos + aSep.getLength();
+ aName = aName.copy(0, nPos);
+ }
+
+ switch (eObjKind)
+ {
+ case PresObjKind::Outline:
+ {
+ aName = GetLayoutName() + " " + OUString::number( 1 );
+ }
+ break;
+
+ case PresObjKind::Title:
+ aName += STR_LAYOUT_TITLE;
+ break;
+
+ case PresObjKind::Notes:
+ aName += STR_LAYOUT_NOTES;
+ break;
+
+ case PresObjKind::Text:
+ aName += STR_LAYOUT_SUBTITLE;
+ break;
+
+ case PresObjKind::Header:
+ case PresObjKind::Footer:
+ case PresObjKind::DateTime:
+ case PresObjKind::SlideNumber:
+ aName += STR_LAYOUT_BACKGROUNDOBJECTS;
+ break;
+
+ default:
+ break;
+ }
+
+ SfxStyleSheetBasePool* pStShPool = getSdrModelFromSdrPage().GetStyleSheetPool();
+ SfxStyleSheetBase* pResult = pStShPool->Find(aName, SfxStyleFamily::Page);
+ return static_cast<SfxStyleSheet*>(pResult);
+}
+
+/** returns the presentation style with the given helpid from this masterpage or this
+ slides masterpage */
+SdStyleSheet* SdPage::getPresentationStyle( sal_uInt32 nHelpId ) const
+{
+ OUString aStyleName( GetLayoutName() );
+ const OUString aSep( SD_LT_SEPARATOR );
+ sal_Int32 nIndex = aStyleName.indexOf(aSep);
+ if( nIndex != -1 )
+ aStyleName = aStyleName.copy(0, nIndex + aSep.getLength());
+
+ OUString pNameId;
+ bool bOutline = false;
+ switch( nHelpId )
+ {
+ case HID_PSEUDOSHEET_TITLE: pNameId = STR_LAYOUT_TITLE; break;
+ case HID_PSEUDOSHEET_SUBTITLE: pNameId = STR_LAYOUT_SUBTITLE; break;
+ case HID_PSEUDOSHEET_OUTLINE1:
+ case HID_PSEUDOSHEET_OUTLINE2:
+ case HID_PSEUDOSHEET_OUTLINE3:
+ case HID_PSEUDOSHEET_OUTLINE4:
+ case HID_PSEUDOSHEET_OUTLINE5:
+ case HID_PSEUDOSHEET_OUTLINE6:
+ case HID_PSEUDOSHEET_OUTLINE7:
+ case HID_PSEUDOSHEET_OUTLINE8:
+ case HID_PSEUDOSHEET_OUTLINE9: pNameId = STR_LAYOUT_OUTLINE; bOutline = true; break;
+ case HID_PSEUDOSHEET_BACKGROUNDOBJECTS: pNameId = STR_LAYOUT_BACKGROUNDOBJECTS; break;
+ case HID_PSEUDOSHEET_BACKGROUND: pNameId = STR_LAYOUT_BACKGROUND; break;
+ case HID_PSEUDOSHEET_NOTES: pNameId = STR_LAYOUT_NOTES; break;
+
+ default:
+ OSL_FAIL( "SdPage::getPresentationStyle(), illegal argument!" );
+ return nullptr;
+ }
+ aStyleName += pNameId;
+ if (bOutline)
+ {
+ aStyleName += " " +
+ OUString::number( sal_Int32( nHelpId - HID_PSEUDOSHEET_OUTLINE ));
+ }
+
+ SfxStyleSheetBasePool* pStShPool = getSdrModelFromSdrPage().GetStyleSheetPool();
+ SfxStyleSheetBase* pResult = pStShPool->Find(aStyleName, SfxStyleFamily::Page);
+ return dynamic_cast<SdStyleSheet*>(pResult);
+}
+
+/*************************************************************************
+|*
+|* The presentation object rObj has changed and is no longer referenced by the
+|* presentation object of the master page.
+|* The UserCall is deleted.
+|*
+\************************************************************************/
+
+void SdPage::Changed(const SdrObject& rObj, SdrUserCallType eType, const ::tools::Rectangle& )
+{
+ if (maLockAutoLayoutArrangement.isLocked())
+ return;
+
+ switch (eType)
+ {
+ case SdrUserCallType::MoveOnly:
+ case SdrUserCallType::Resize:
+ {
+ if ( getSdrModelFromSdrPage().isLocked())
+ break;
+
+ if (!mbMaster)
+ {
+ if (rObj.GetUserCall())
+ {
+ SdrObject& _rObj = const_cast<SdrObject&>(rObj);
+ SfxUndoManager* pUndoManager
+ = static_cast<SdDrawDocument&>(getSdrModelFromSdrPage())
+ .GetUndoManager();
+ const bool bUndo
+ = pUndoManager && pUndoManager->IsInListAction() && IsInserted();
+
+ if (bUndo)
+ pUndoManager->AddUndoAction(
+ std::make_unique<UndoObjectUserCall>(_rObj));
+
+ // Object was resized by user and does not listen to its slide anymore
+ _rObj.SetUserCall(nullptr);
+ }
+ }
+ else
+ {
+ // Object of the master page changed, therefore adjust
+ // object on all pages
+ sal_uInt16 nPageCount = static_cast<SdDrawDocument&>(getSdrModelFromSdrPage())
+ .GetSdPageCount(mePageKind);
+
+ for (sal_uInt16 i = 0; i < nPageCount; i++)
+ {
+ SdPage* pLoopPage = static_cast<SdDrawDocument&>(getSdrModelFromSdrPage())
+ .GetSdPage(i, mePageKind);
+
+ if (pLoopPage && this == &(pLoopPage->TRG_GetMasterPage()))
+ {
+ // Page listens to this master page, therefore
+ // adjust AutoLayout
+ pLoopPage->SetAutoLayout(pLoopPage->GetAutoLayout());
+ }
+ }
+ }
+ }
+ break;
+
+ case SdrUserCallType::Delete:
+ case SdrUserCallType::Removed:
+ default:
+ break;
+ }
+}
+
+/*************************************************************************
+|*
+|* Creates on a master page: background, title- and layout area
+|*
+\************************************************************************/
+
+void SdPage::CreateTitleAndLayout(bool bInit, bool bCreate )
+{
+ SfxUndoManager* pUndoManager(static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetUndoManager());
+ const bool bUndo = pUndoManager && pUndoManager->IsInListAction() && IsInserted();
+
+ SdPage* pMasterPage = this;
+
+ if (!mbMaster)
+ {
+ pMasterPage = static_cast<SdPage*>(&(TRG_GetMasterPage()));
+ }
+
+ if (!pMasterPage)
+ {
+ return;
+ }
+
+ /**************************************************************************
+ * create background, title- and layout area
+ **************************************************************************/
+ if( mePageKind == PageKind::Standard )
+ {
+ pMasterPage->EnsureMasterPageDefaultBackground();
+ }
+
+ if (static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetDocumentType() != DocumentType::Impress)
+ return;
+
+ if( mePageKind == PageKind::Handout && bInit )
+ {
+ // handout template
+
+ // delete all available handout presentation objects
+ SdrObject *pObj=nullptr;
+ while( (pObj = pMasterPage->GetPresObj(PresObjKind::Handout)) != nullptr )
+ {
+ pMasterPage->RemoveObject(pObj->GetOrdNum());
+
+ if( bUndo )
+ {
+ pUndoManager->AddUndoAction(getSdrModelFromSdrPage().GetSdrUndoFactory().CreateUndoDeleteObject(*pObj));
+ }
+ else
+ {
+ SdrObject::Free( pObj );
+ }
+ }
+
+ std::vector< ::tools::Rectangle > aAreas;
+ CalculateHandoutAreas( static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()), pMasterPage->GetAutoLayout(), false, aAreas );
+
+ const bool bSkip = pMasterPage->GetAutoLayout() == AUTOLAYOUT_HANDOUT3;
+ std::vector< ::tools::Rectangle >::iterator iter( aAreas.begin() );
+
+ while( iter != aAreas.end() )
+ {
+ SdrPageObj* pPageObj = static_cast<SdrPageObj*>(pMasterPage->CreatePresObj(PresObjKind::Handout, false, (*iter++)) );
+ // #i105146# We want no content to be displayed for PageKind::Handout,
+ // so just never set a page as content
+ pPageObj->SetReferencedPage(nullptr);
+
+ if( bSkip && iter != aAreas.end() )
+ ++iter;
+ }
+ }
+
+ if( mePageKind != PageKind::Handout )
+ {
+ SdrObject* pMasterTitle = pMasterPage->GetPresObj( PresObjKind::Title );
+ if( pMasterTitle == nullptr )
+ pMasterPage->CreateDefaultPresObj(PresObjKind::Title);
+
+ SdrObject* pMasterOutline = pMasterPage->GetPresObj( mePageKind==PageKind::Notes ? PresObjKind::Notes : PresObjKind::Outline );
+ if( pMasterOutline == nullptr )
+ pMasterPage->CreateDefaultPresObj( mePageKind == PageKind::Standard ? PresObjKind::Outline : PresObjKind::Notes );
+ }
+
+ // create header&footer objects
+
+ if( !bCreate )
+ return;
+
+ if( mePageKind != PageKind::Standard )
+ {
+ SdrObject* pHeader = pMasterPage->GetPresObj( PresObjKind::Header );
+ if( pHeader == nullptr )
+ pMasterPage->CreateDefaultPresObj( PresObjKind::Header );
+ }
+
+ SdrObject* pDate = pMasterPage->GetPresObj( PresObjKind::DateTime );
+ if( pDate == nullptr )
+ pMasterPage->CreateDefaultPresObj( PresObjKind::DateTime );
+
+ SdrObject* pFooter = pMasterPage->GetPresObj( PresObjKind::Footer );
+ if( pFooter == nullptr )
+ pMasterPage->CreateDefaultPresObj( PresObjKind::Footer );
+
+ SdrObject* pNumber = pMasterPage->GetPresObj( PresObjKind::SlideNumber );
+ if( pNumber == nullptr )
+ pMasterPage->CreateDefaultPresObj( PresObjKind::SlideNumber );
+}
+
+namespace {
+
+const o3tl::enumarray<PageKind, char const *> PageKindVector = {
+ "PageKind::Standard", "PageKind::Notes", "PageKind::Handout"
+};
+
+const o3tl::enumarray<PresObjKind, const char*> PresObjKindVector = {
+ "PRESOBJ_NONE", "PRESOBJ_TITLE", "PRESOBJ_OUTLINE",
+ "PRESOBJ_TEXT" ,"PRESOBJ_GRAPHIC" , "PRESOBJ_OBJECT",
+ "PRESOBJ_CHART", "PRESOBJ_ORGCHART", "PRESOBJ_TABLE",
+ "PRESOBJ_PAGE", "PRESOBJ_HANDOUT",
+ "PRESOBJ_NOTES","PRESOBJ_HEADER", "PRESOBJ_FOOTER",
+ "PRESOBJ_DATETIME", "PRESOBJ_SLIDENUMBER", "PRESOBJ_CALC",
+ "PRESOBJ_MEDIA"
+};
+
+void getPresObjProp( const SdPage& rPage, const char* sObjKind, const char* sPageKind, double presObjPropValue[] )
+{
+ bool bNoObjectFound = true; //used to break from outer loop
+
+ const std::vector< Reference<XNode> >& objectInfo = static_cast< const SdDrawDocument& >(rPage.getSdrModelFromSdrPage()).GetObjectVector();
+ for( const Reference<XNode>& objectNode : objectInfo )
+ {
+ if(bNoObjectFound)
+ {
+ Reference<XNamedNodeMap> objectattrlist = objectNode->getAttributes();
+ Reference<XNode> objectattr = objectattrlist->getNamedItem("type");
+ OUString sObjType = objectattr->getNodeValue();
+
+ if (sObjType.equalsAscii(sObjKind))
+ {
+ Reference<XNodeList> objectChildren = objectNode->getChildNodes();
+ const int objSize = objectChildren->getLength();
+
+ for( int j=0; j< objSize; j++)
+ {
+ Reference<XNode> obj = objectChildren->item(j);
+ OUString nodename = obj->getNodeName();
+
+ //check whether child is blank 'text-node' or 'object-prop' node
+ if(nodename == "object-prop")
+ {
+ Reference<XNamedNodeMap> ObjAttributes = obj->getAttributes();
+ Reference<XNode> ObjPageKind = ObjAttributes->getNamedItem("pagekind");
+ OUString sObjPageKind = ObjPageKind->getNodeValue();
+
+ if (sObjPageKind.equalsAscii(sPageKind))
+ {
+ Reference<XNode> ObjSizeHeight = ObjAttributes->getNamedItem("relative-height");
+ OUString sValue = ObjSizeHeight->getNodeValue();
+ presObjPropValue[0] = sValue.toDouble();
+
+ Reference<XNode> ObjSizeWidth = ObjAttributes->getNamedItem("relative-width");
+ sValue = ObjSizeWidth->getNodeValue();
+ presObjPropValue[1] = sValue.toDouble();
+
+ Reference<XNode> ObjPosX = ObjAttributes->getNamedItem("relative-posX");
+ sValue = ObjPosX->getNodeValue();
+ presObjPropValue[2] = sValue.toDouble();
+
+ Reference<XNode> ObjPosY = ObjAttributes->getNamedItem("relative-posY");
+ sValue = ObjPosY->getNodeValue();
+ presObjPropValue[3] = sValue.toDouble();
+
+ bNoObjectFound = false;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ break;
+ }
+}
+
+}
+
+SdrObject* SdPage::CreateDefaultPresObj(PresObjKind eObjKind)
+{
+ if( eObjKind == PresObjKind::Title )
+ {
+ ::tools::Rectangle aTitleRect( GetTitleRect() );
+ return CreatePresObj(PresObjKind::Title, false, aTitleRect);
+ }
+ else if( eObjKind == PresObjKind::Outline )
+ {
+ ::tools::Rectangle aLayoutRect( GetLayoutRect() );
+ return CreatePresObj( PresObjKind::Outline, false, aLayoutRect);
+ }
+ else if( eObjKind == PresObjKind::Notes )
+ {
+ ::tools::Rectangle aLayoutRect( GetLayoutRect() );
+ return CreatePresObj( PresObjKind::Notes, false, aLayoutRect);
+ }
+ else if( (eObjKind == PresObjKind::Footer) || (eObjKind == PresObjKind::DateTime) || (eObjKind == PresObjKind::SlideNumber) || (eObjKind == PresObjKind::Header ) )
+ {
+ double propvalue[] = {0,0,0,0};
+ const char* sObjKind = PresObjKindVector[eObjKind];
+ const char* sPageKind = PageKindVector[mePageKind];
+ // create footer objects for standard master page
+ if( mePageKind == PageKind::Standard )
+ {
+ const ::tools::Long nLftBorder = GetLeftBorder();
+ const ::tools::Long nUppBorder = GetUpperBorder();
+
+ Point aPos ( nLftBorder, nUppBorder );
+ Size aSize ( GetSize() );
+
+ aSize.AdjustWidth( -(nLftBorder + GetRightBorder()) );
+ aSize.AdjustHeight( -(nUppBorder + GetLowerBorder()) );
+
+ getPresObjProp( *this, sObjKind, sPageKind, propvalue);
+ aPos.AdjustX(::tools::Long( aSize.Width() * propvalue[2] ) );
+ aPos.AdjustY(::tools::Long( aSize.Height() * propvalue[3] ) );
+ aSize.setWidth( ::tools::Long( aSize.Width() * propvalue[1] ) );
+ aSize.setHeight( ::tools::Long( aSize.Height() * propvalue[0] ) );
+
+ if(eObjKind == PresObjKind::Header )
+ {
+ OSL_FAIL( "SdPage::CreateDefaultPresObj() - can't create a header placeholder for a master slide" );
+ return nullptr;
+ }
+ else
+ {
+ ::tools::Rectangle aRect( aPos, aSize );
+ return CreatePresObj( eObjKind, false, aRect );
+ }
+ }
+ else
+ {
+ // create header&footer objects for handout and notes master
+ Size aPageSize ( GetSize() );
+ aPageSize.AdjustWidth( -(GetLeftBorder() + GetRightBorder()) );
+ aPageSize.AdjustHeight( -(GetUpperBorder() + GetLowerBorder()) );
+
+ Point aPosition ( GetLeftBorder(), GetUpperBorder() );
+
+ getPresObjProp( *this, sObjKind, sPageKind, propvalue);
+ int NOTES_HEADER_FOOTER_WIDTH = ::tools::Long(aPageSize.Width() * propvalue[1]);
+ int NOTES_HEADER_FOOTER_HEIGHT = ::tools::Long(aPageSize.Height() * propvalue[0]);
+ Size aSize( NOTES_HEADER_FOOTER_WIDTH, NOTES_HEADER_FOOTER_HEIGHT );
+ Point aPos ( 0 ,0 );
+ if( propvalue[2] == 0 )
+ aPos.setX( aPosition.X() );
+ else
+ aPos.setX( aPosition.X() + ::tools::Long( aPageSize.Width() - NOTES_HEADER_FOOTER_WIDTH ) );
+ if( propvalue[3] == 0 )
+ aPos.setY( aPosition.Y() );
+ else
+ aPos.setY( aPosition.Y() + ::tools::Long( aPageSize.Height() - NOTES_HEADER_FOOTER_HEIGHT ) );
+
+ ::tools::Rectangle aRect( aPos, aSize );
+ return CreatePresObj( eObjKind, false, aRect );
+ }
+ }
+ else
+ {
+ OSL_FAIL("SdPage::CreateDefaultPresObj() - unknown PRESOBJ kind" );
+ return nullptr;
+ }
+}
+
+void SdPage::DestroyDefaultPresObj(PresObjKind eObjKind)
+{
+ SdrObject* pObject = GetPresObj( eObjKind );
+
+ if( pObject )
+ {
+ SdDrawDocument* pDoc(static_cast< SdDrawDocument* >(&getSdrModelFromSdrPage()));
+ const bool bUndo = pDoc->IsUndoEnabled();
+ if( bUndo )
+ pDoc->AddUndo(pDoc->GetSdrUndoFactory().CreateUndoDeleteObject(*pObject));
+ SdrObjList* pOL = pObject->getParentSdrObjListFromSdrObject();
+ pOL->RemoveObject(pObject->GetOrdNumDirect());
+
+ if( !bUndo )
+ SdrObject::Free(pObject);
+ }
+}
+
+/*************************************************************************
+|*
+|* return title area
+|*
+\************************************************************************/
+
+::tools::Rectangle SdPage::GetTitleRect() const
+{
+ ::tools::Rectangle aTitleRect;
+
+ if (mePageKind != PageKind::Handout)
+ {
+ double propvalue[] = {0,0,0,0};
+
+ /******************************************************************
+ * standard- or note page: title area
+ ******************************************************************/
+ Point aTitlePos ( GetLeftBorder(), GetUpperBorder() );
+ Size aTitleSize ( GetSize() );
+ aTitleSize.AdjustWidth( -(GetLeftBorder() + GetRightBorder()) );
+ aTitleSize.AdjustHeight( -(GetUpperBorder() + GetLowerBorder()) );
+ const char* sPageKind = PageKindVector[mePageKind];
+
+ if (mePageKind == PageKind::Standard)
+ {
+ getPresObjProp( *this , "PRESOBJ_TITLE" ,sPageKind, propvalue);
+ aTitlePos.AdjustX(::tools::Long( aTitleSize.Width() * propvalue[2] ) );
+ aTitlePos.AdjustY(::tools::Long( aTitleSize.Height() * propvalue[3] ) );
+ aTitleSize.setWidth( ::tools::Long( aTitleSize.Width() * propvalue[1] ) );
+ aTitleSize.setHeight( ::tools::Long( aTitleSize.Height() * propvalue[0] ) );
+ }
+ else if (mePageKind == PageKind::Notes)
+ {
+ Point aPos = aTitlePos;
+ getPresObjProp( *this, "PRESOBJ_TITLE" ,sPageKind, propvalue);
+ aPos.AdjustX(::tools::Long( aTitleSize.Width() * propvalue[2] ) );
+ aPos.AdjustY(::tools::Long( aTitleSize.Height() * propvalue[3] ) );
+
+ // limit height
+ aTitleSize.setHeight( ::tools::Long( aTitleSize.Height() * propvalue[0] ) );
+ aTitleSize.setWidth( ::tools::Long( aTitleSize.Width() * propvalue[1] ) );
+
+ Size aPartArea = aTitleSize;
+ Size aSize;
+ sal_uInt16 nDestPageNum(GetPageNum());
+ SdrPage* pRefPage = nullptr;
+
+ if(nDestPageNum)
+ {
+ // only decrement if != 0, else we get 0xffff
+ nDestPageNum -= 1;
+ }
+
+ if(nDestPageNum < getSdrModelFromSdrPage().GetPageCount())
+ {
+ pRefPage = getSdrModelFromSdrPage().GetPage(nDestPageNum);
+ }
+
+ if ( pRefPage )
+ {
+ // scale actually page size into handout rectangle
+ double fH = pRefPage->GetWidth() == 0
+ ? 0 : static_cast<double>(aPartArea.Width()) / pRefPage->GetWidth();
+ double fV = pRefPage->GetHeight() == 0
+ ? 0 : static_cast<double>(aPartArea.Height()) / pRefPage->GetHeight();
+
+ if ( fH > fV )
+ fH = fV;
+ aSize.setWidth( static_cast<::tools::Long>(fH * pRefPage->GetWidth()) );
+ aSize.setHeight( static_cast<::tools::Long>(fH * pRefPage->GetHeight()) );
+
+ aPos.AdjustX((aPartArea.Width() - aSize.Width()) / 2 );
+ aPos.AdjustY((aPartArea.Height()- aSize.Height())/ 2 );
+ }
+
+ aTitlePos = aPos;
+ aTitleSize = aSize;
+ }
+
+ aTitleRect.SetPos(aTitlePos);
+ aTitleRect.SetSize(aTitleSize);
+ }
+
+ return aTitleRect;
+}
+
+/*************************************************************************
+|*
+|* return outline area
+|*
+\************************************************************************/
+
+::tools::Rectangle SdPage::GetLayoutRect() const
+{
+ ::tools::Rectangle aLayoutRect;
+
+ if (mePageKind != PageKind::Handout)
+ {
+ double propvalue[] = {0,0,0,0};
+
+ Point aLayoutPos ( GetLeftBorder(), GetUpperBorder() );
+ Size aLayoutSize ( GetSize() );
+ aLayoutSize.AdjustWidth( -(GetLeftBorder() + GetRightBorder()) );
+ aLayoutSize.AdjustHeight( -(GetUpperBorder() + GetLowerBorder()) );
+ const char* sPageKind = PageKindVector[mePageKind];
+
+ if (mePageKind == PageKind::Standard)
+ {
+ getPresObjProp( *this ,"PRESOBJ_OUTLINE", sPageKind, propvalue);
+ aLayoutPos.AdjustX(::tools::Long( aLayoutSize.Width() * propvalue[2] ) );
+ aLayoutPos.AdjustY(::tools::Long( aLayoutSize.Height() * propvalue[3] ) );
+ aLayoutSize.setWidth( ::tools::Long( aLayoutSize.Width() * propvalue[1] ) );
+ aLayoutSize.setHeight( ::tools::Long( aLayoutSize.Height() * propvalue[0] ) );
+ aLayoutRect.SetPos(aLayoutPos);
+ aLayoutRect.SetSize(aLayoutSize);
+ }
+ else if (mePageKind == PageKind::Notes)
+ {
+ getPresObjProp( *this, "PRESOBJ_NOTES", sPageKind, propvalue);
+ aLayoutPos.AdjustX(::tools::Long( aLayoutSize.Width() * propvalue[2] ) );
+ aLayoutPos.AdjustY(::tools::Long( aLayoutSize.Height() * propvalue[3] ) );
+ aLayoutSize.setWidth( ::tools::Long( aLayoutSize.Width() * propvalue[1] ) );
+ aLayoutSize.setHeight( ::tools::Long( aLayoutSize.Height() * propvalue[0] ) );
+ aLayoutRect.SetPos(aLayoutPos);
+ aLayoutRect.SetSize(aLayoutSize);
+ }
+ }
+
+ return aLayoutRect;
+}
+
+/**************************************************************************
+|*
+|* assign an AutoLayout
+|*
+\*************************************************************************/
+
+const int MAX_PRESOBJS = 7; // maximum number of presentation objects per layout
+const int VERTICAL = 0x8000;
+
+static constexpr PresObjKind operator|(PresObjKind e, int x)
+{
+ return static_cast<PresObjKind>(static_cast<int>(e) | x);
+}
+
+namespace {
+
+struct LayoutDescriptor
+{
+ PresObjKind meKind[MAX_PRESOBJS];
+ bool mbVertical[MAX_PRESOBJS];
+
+ LayoutDescriptor( PresObjKind k0 = PresObjKind::NONE, PresObjKind k1 = PresObjKind::NONE, PresObjKind k2 = PresObjKind::NONE, PresObjKind k3 = PresObjKind::NONE, PresObjKind k4 = PresObjKind::NONE, PresObjKind k5 = PresObjKind::NONE, PresObjKind k6 = PresObjKind::NONE );
+};
+
+}
+
+LayoutDescriptor::LayoutDescriptor( PresObjKind k0, PresObjKind k1, PresObjKind k2, PresObjKind k3, PresObjKind k4, PresObjKind k5, PresObjKind k6 )
+{
+ auto removeVertical = [] (PresObjKind k) { return static_cast<PresObjKind>(static_cast<int>(k) & ~VERTICAL); };
+ auto isVertical = [] (PresObjKind k) { return bool(static_cast<int>(k) & VERTICAL); };
+ meKind[0] = removeVertical(k0); mbVertical[0] = isVertical(k0);
+ meKind[1] = removeVertical(k1); mbVertical[1] = isVertical(k1);
+ meKind[2] = removeVertical(k2); mbVertical[2] = isVertical(k2);
+ meKind[3] = removeVertical(k3); mbVertical[3] = isVertical(k3);
+ meKind[4] = removeVertical(k4); mbVertical[4] = isVertical(k4);
+ meKind[5] = removeVertical(k5); mbVertical[5] = isVertical(k5);
+ meKind[6] = removeVertical(k6); mbVertical[6] = isVertical(k6);
+}
+
+static const LayoutDescriptor& GetLayoutDescriptor( AutoLayout eLayout )
+{
+ static const LayoutDescriptor aLayouts[AUTOLAYOUT_END-AUTOLAYOUT_START] =
+ {
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Text ), // AUTOLAYOUT_TITLE
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline ), // AUTOLAYOUT_TITLE_CONTENT
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline ), // AUTOLAYOUT_CHART
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline ), // AUTOLAYOUT_TITLE_2CONTENT
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline ), // AUTOLAYOUT_TEXTCHART
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline ), // AUTOLAYOUT_ORG
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline ), // AUTOLAYOUT_TEXTCLbIP
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline ), // AUTOLAYOUT_CHARTTEXT
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline ), // AUTOLAYOUT_TAB
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline ), // AUTOLAYOUT_CLIPTEXT
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline ), // AUTOLAYOUT_TEXTOBJ
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Object ), // AUTOLAYOUT_OBJ
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline, PresObjKind::Outline ), // AUTOLAYOUT_TITLE_CONTENT_2CONTENT
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline ), // AUTOLAYOUT_TEXTOBJ
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline ), // AUTOLAYOUT_TITLE_CONTENT_OVER_CONTENT
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline, PresObjKind::Outline ), // AUTOLAYOUT_TITLE_2CONTENT_CONTENT
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline, PresObjKind::Outline ), // AUTOLAYOUT_TITLE_2CONTENT_OVER_CONTENT
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline ), // AUTOLAYOUT_TEXTOVEROBJ
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline, // AUTOLAYOUT_TITLE_4CONTENT
+ PresObjKind::Outline, PresObjKind::Outline ),
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::NONE ), // AUTOLAYOUT_TITLE_ONLY
+ LayoutDescriptor( PresObjKind::NONE ), // AUTOLAYOUT_NONE
+ LayoutDescriptor( PresObjKind::Page, PresObjKind::Notes ), // AUTOLAYOUT_NOTES
+ LayoutDescriptor( ), // AUTOLAYOUT_HANDOUT1
+ LayoutDescriptor( ), // AUTOLAYOUT_HANDOUT2
+ LayoutDescriptor( ), // AUTOLAYOUT_HANDOUT3
+ LayoutDescriptor( ), // AUTOLAYOUT_HANDOUT4
+ LayoutDescriptor( ), // AUTOLAYOUT_HANDOUT6
+ LayoutDescriptor( PresObjKind::Title|VERTICAL, PresObjKind::Outline|VERTICAL, PresObjKind::Outline ),// AUTOLAYOUT_VTITLE_VCONTENT_OVER_VCONTENT
+ LayoutDescriptor( PresObjKind::Title|VERTICAL, PresObjKind::Outline|VERTICAL ), // AUTOLAYOUT_VTITLE_VCONTENT
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline|VERTICAL ), // AUTOLAYOUT_TITLE_VCONTENT
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline|VERTICAL, PresObjKind::Outline|VERTICAL ), // AUTOLAYOUT_TITLE_2VTEXT
+ LayoutDescriptor( ), // AUTOLAYOUT_HANDOUT9
+ LayoutDescriptor( PresObjKind::Text, PresObjKind::NONE ), // AUTOLAYOUT_ONLY_TEXT
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline, // AUTOLAYOUT_4CLIPART
+ PresObjKind::Graphic, PresObjKind::Graphic ),
+ LayoutDescriptor( PresObjKind::Title, PresObjKind::Outline, PresObjKind::Outline, // AUTOLAYOUT_TITLE_6CONTENT
+ PresObjKind::Outline, PresObjKind::Outline, PresObjKind::Outline, PresObjKind::Outline )
+ };
+
+ if( (eLayout < AUTOLAYOUT_START) || (eLayout >= AUTOLAYOUT_END) )
+ eLayout = AUTOLAYOUT_NONE;
+
+ return aLayouts[ eLayout - AUTOLAYOUT_START ];
+}
+
+static OUString enumtoString(AutoLayout aut)
+{
+ OUString retstr;
+ switch (aut)
+ {
+ case AUTOLAYOUT_TITLE_CONTENT:
+ retstr="AUTOLAYOUT_TITLE_CONTENT";
+ break;
+ case AUTOLAYOUT_TITLE_CONTENT_OVER_CONTENT:
+ retstr="AUTOLAYOUT_TITLE_CONTENT_OVER_CONTENT";
+ break;
+ case AUTOLAYOUT_TITLE_CONTENT_2CONTENT:
+ retstr="AUTOLAYOUT_TITLE_CONTENT_2CONTENT";
+ break;
+ case AUTOLAYOUT_TITLE_4CONTENT:
+ retstr="AUTOLAYOUT_TITLE_4CONTENT";
+ break;
+ case AUTOLAYOUT_ONLY_TEXT:
+ retstr="AUTOLAYOUT_ONLY_TEXT";
+ break;
+ case AUTOLAYOUT_TITLE_ONLY:
+ retstr="AUTOLAYOUT_TITLE_ONLY";
+ break;
+ case AUTOLAYOUT_TITLE_6CONTENT:
+ retstr="AUTOLAYOUT_TITLE_6CONTENT";
+ break;
+ case AUTOLAYOUT_START:
+ retstr="AUTOLAYOUT_START";
+ break;
+ case AUTOLAYOUT_TITLE_2CONTENT_CONTENT:
+ retstr="AUTOLAYOUT_TITLE_2CONTENT_CONTENT";
+ break;
+ case AUTOLAYOUT_TITLE_2CONTENT_OVER_CONTENT:
+ retstr="AUTOLAYOUT_TITLE_2CONTENT_OVER_CONTENT";
+ break;
+ case AUTOLAYOUT_TITLE_2CONTENT:
+ retstr="AUTOLAYOUT_TITLE_2CONTENT";
+ break;
+ case AUTOLAYOUT_VTITLE_VCONTENT:
+ retstr="AUTOLAYOUT_VTITLE_VCONTENT";
+ break;
+ case AUTOLAYOUT_VTITLE_VCONTENT_OVER_VCONTENT:
+ retstr="AUTOLAYOUT_VTITLE_VCONTENT_OVER_VCONTENT";
+ break;
+ case AUTOLAYOUT_TITLE_VCONTENT:
+ retstr="AUTOLAYOUT_TITLE_VCONTENT";
+ break;
+ case AUTOLAYOUT_TITLE_2VTEXT:
+ retstr="AUTOLAYOUT_TITLE_2VTEXT";
+ break;
+ default:
+ retstr="unknown";
+ break;
+ // case AUTOLAYOUT_TITLE_4SCONTENT: return "AUTOLAYOUT_TITLE_4SCONTENT";
+ }
+ return retstr;
+}
+
+static void CalcAutoLayoutRectangles( SdPage const & rPage,::tools::Rectangle* rRectangle ,const OUString& sLayoutType )
+{
+ ::tools::Rectangle aTitleRect;
+ ::tools::Rectangle aLayoutRect;
+
+ if( rPage.GetPageKind() != PageKind::Handout )
+ {
+ SdPage& rMasterPage = static_cast<SdPage&>(rPage.TRG_GetMasterPage());
+ SdrObject* pMasterTitle = rMasterPage.GetPresObj( PresObjKind::Title );
+ SdrObject* pMasterSubTitle = rMasterPage.GetPresObj( PresObjKind::Text );
+ SdrObject* pMasterOutline = rMasterPage.GetPresObj( rPage.GetPageKind()==PageKind::Notes ? PresObjKind::Notes : PresObjKind::Outline );
+
+ if( pMasterTitle )
+ aTitleRect = pMasterTitle->GetLogicRect();
+
+ if (aTitleRect.IsEmpty() )
+ aTitleRect = rPage.GetTitleRect();
+ if( pMasterSubTitle )
+ aLayoutRect = pMasterSubTitle->GetLogicRect();
+ else if( pMasterOutline )
+ aLayoutRect = pMasterOutline->GetLogicRect();
+
+ if (aLayoutRect.IsEmpty() )
+ aLayoutRect = rPage.GetLayoutRect();
+ }
+
+ rRectangle[0] = aTitleRect;
+ for( int i = 1; i < MAX_PRESOBJS; i++ )
+ rRectangle[i] = aLayoutRect;
+
+ const Point aTitlePos( aTitleRect.TopLeft() );
+ const Size aLayoutSize( aLayoutRect.GetSize() );
+ const Point aLayoutPos( aLayoutRect.TopLeft() );
+ double propvalue[] = {0,0,0,0};
+
+ const std::vector< Reference<XNode> >& layoutInfo = static_cast< const SdDrawDocument& >(rPage.getSdrModelFromSdrPage()).GetLayoutVector();
+ auto aIter = std::find_if(layoutInfo.begin(), layoutInfo.end(),
+ [&sLayoutType](const Reference<XNode>& layoutNode) {
+ Reference<XNamedNodeMap> layoutAttrList = layoutNode->getAttributes();
+
+ // get the attribute value of layout (i.e it's type)
+ OUString sLayoutAttName = layoutAttrList->getNamedItem("type")->getNodeValue();
+ return sLayoutAttName == sLayoutType;
+ });
+ if (aIter == layoutInfo.end())
+ return;
+
+ int count=0;
+ Reference<XNode> layoutNode = *aIter;
+ Reference<XNodeList> layoutChildren = layoutNode->getChildNodes();
+ const int presobjsize = layoutChildren->getLength();
+ for( int j=0; j< presobjsize ; j++)
+ {
+ OUString nodename;
+ Reference<XNode> presobj = layoutChildren->item(j);
+ nodename=presobj->getNodeName();
+
+ //check whether child is blank 'text-node' or 'presobj' node
+ if(nodename == "presobj")
+ {
+ // TODO: rework sd to permit arbitrary number of presentation objects
+ assert(count < MAX_PRESOBJS);
+
+ Reference<XNamedNodeMap> presObjAttributes = presobj->getAttributes();
+
+ Reference<XNode> presObjSizeHeight = presObjAttributes->getNamedItem("relative-height");
+ OUString sValue = presObjSizeHeight->getNodeValue();
+ propvalue[0] = sValue.toDouble();
+
+ Reference<XNode> presObjSizeWidth = presObjAttributes->getNamedItem("relative-width");
+ sValue = presObjSizeWidth->getNodeValue();
+ propvalue[1] = sValue.toDouble();
+
+ Reference<XNode> presObjPosX = presObjAttributes->getNamedItem("relative-posX");
+ sValue = presObjPosX->getNodeValue();
+ propvalue[2] = sValue.toDouble();
+
+ Reference<XNode> presObjPosY = presObjAttributes->getNamedItem("relative-posY");
+ sValue = presObjPosY->getNodeValue();
+ propvalue[3] = sValue.toDouble();
+
+ if(count == 0)
+ {
+ Size aSize ( aTitleRect.GetSize() );
+ aSize.setHeight( basegfx::fround(aSize.Height() * propvalue[0]) );
+ aSize.setWidth( basegfx::fround(aSize.Width() * propvalue[1]) );
+ Point aPos( basegfx::fround(aTitlePos.X() +(aSize.Width() * propvalue[2])),
+ basegfx::fround(aTitlePos.Y() + (aSize.Height() * propvalue[3])) );
+ rRectangle[count] = ::tools::Rectangle(aPos, aSize);
+ count = count+1;
+ }
+ else
+ {
+ Size aSize( basegfx::fround(aLayoutSize.Width() * propvalue[1]),
+ basegfx::fround(aLayoutSize.Height() * propvalue[0]) );
+ Point aPos( basegfx::fround(aLayoutPos.X() +(aSize.Width() * propvalue[2])),
+ basegfx::fround(aLayoutPos.Y() + (aSize.Height() * propvalue[3])) );
+ rRectangle[count] = ::tools::Rectangle (aPos, aSize);
+ count = count+1;
+ }
+ }
+ }
+}
+
+static void findAutoLayoutShapesImpl( SdPage& rPage, const LayoutDescriptor& rDescriptor, std::array<SdrObject*, MAX_PRESOBJS>& rShapes, bool bInit, bool bSwitchLayout )
+{
+ // init list of indexes for each presentation shape kind
+ // this is used to find subsequent shapes with the same presentation shape kind
+ o3tl::enumarray<PresObjKind,int> PresObjIndex;
+ PresObjIndex.fill(1);
+
+ bool bMissing = false;
+
+ // for each entry in the layoutdescriptor, arrange a presentation shape
+ for (int i = 0; (i < MAX_PRESOBJS) && (rDescriptor.meKind[i] != PresObjKind::NONE); i++)
+ {
+ PresObjKind eKind = rDescriptor.meKind[i];
+ SdrObject* pObj = nullptr;
+ while( (pObj = rPage.GetPresObj( eKind, PresObjIndex[eKind], true )) != nullptr )
+ {
+ PresObjIndex[eKind]++; // on next search for eKind, find next shape with same eKind
+
+ if( !bSwitchLayout || !pObj->IsEmptyPresObj() )
+ {
+ rShapes[i] = pObj;
+ break;
+ }
+ }
+
+ if( !pObj )
+ bMissing = true;
+ }
+
+ if( !(bMissing && bInit) )
+ return;
+
+ // for each entry in the layoutdescriptor, look for an alternative shape
+ for (int i = 0; (i < MAX_PRESOBJS) && (rDescriptor.meKind[i] != PresObjKind::NONE); i++)
+ {
+ if( rShapes[i] )
+ continue;
+
+ PresObjKind eKind = rDescriptor.meKind[i];
+
+ SdrObject* pObj = nullptr;
+ bool bFound = false;
+
+ const size_t nShapeCount = rPage.GetObjCount();
+ for(size_t nShapeIndex = 0; nShapeIndex < nShapeCount && !bFound; ++nShapeIndex )
+ {
+ pObj = rPage.GetObj(nShapeIndex);
+
+ if( pObj->IsEmptyPresObj() )
+ continue;
+
+ if( pObj->GetObjInventor() != SdrInventor::Default )
+ continue;
+
+ // do not reuse shapes that are already part of the layout
+ if( std::find( rShapes.begin(), rShapes.end(), pObj ) != rShapes.end() )
+ continue;
+
+ bool bPresStyle = pObj->GetStyleSheet() && (pObj->GetStyleSheet()->GetFamily() == SfxStyleFamily::Page);
+ SdrObjKind eSdrObjKind = pObj->GetObjIdentifier();
+
+ switch( eKind )
+ {
+ case PresObjKind::Title:
+ bFound = eSdrObjKind == SdrObjKind::TitleText;
+ break;
+ case PresObjKind::Table:
+ bFound = eSdrObjKind == SdrObjKind::Table;
+ break;
+ case PresObjKind::Media:
+ bFound = eSdrObjKind == SdrObjKind::Media;
+ break;
+ case PresObjKind::Outline:
+ bFound = (eSdrObjKind == SdrObjKind::OutlineText) ||
+ ((eSdrObjKind == SdrObjKind::Text) && bPresStyle) ||
+ (eSdrObjKind == SdrObjKind::Table) || (eSdrObjKind == SdrObjKind::Media) || (eSdrObjKind == SdrObjKind::Graphic) || (eSdrObjKind == SdrObjKind::OLE2);
+ break;
+ case PresObjKind::Graphic:
+ bFound = eSdrObjKind == SdrObjKind::Graphic;
+ break;
+ case PresObjKind::Object:
+ if( eSdrObjKind == SdrObjKind::OLE2 )
+ {
+ SdrOle2Obj* pOle2 = dynamic_cast< SdrOle2Obj* >( pObj );
+ if( pOle2 )
+ {
+ if( pOle2->IsEmpty() )
+ bFound = true;
+ else
+ {
+ ::comphelper::IEmbeddedHelper* pPersist(rPage.getSdrModelFromSdrPage().GetPersist());
+
+ if( pPersist )
+ {
+ uno::Reference < embed::XEmbeddedObject > xObject = pPersist->getEmbeddedObjectContainer().
+ GetEmbeddedObject( pOle2->GetPersistName() );
+
+ // TODO CL->KA: Why is this not working anymore?
+ if( xObject.is() )
+ {
+ SvGlobalName aClassId( xObject->getClassID() );
+
+ const SvGlobalName aAppletClassId( SO3_APPLET_CLASSID );
+ const SvGlobalName aPluginClassId( SO3_PLUGIN_CLASSID );
+ const SvGlobalName aIFrameClassId( SO3_IFRAME_CLASSID );
+
+ if( aPluginClassId != aClassId && aAppletClassId != aClassId && aIFrameClassId != aClassId )
+ {
+ bFound = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ break;
+ case PresObjKind::Chart:
+ case PresObjKind::Calc:
+ if( eSdrObjKind == SdrObjKind::OLE2 )
+ {
+ SdrOle2Obj* pOle2 = dynamic_cast< SdrOle2Obj* >( pObj );
+ if( pOle2 )
+ {
+ if(
+ ((eKind == PresObjKind::Chart) &&
+ ( pOle2->GetProgName() == "StarChart" || pOle2->IsChart() ) )
+ ||
+ ((eKind == PresObjKind::Calc) &&
+ ( pOle2->GetProgName() == "StarCalc" || pOle2->IsCalc() ) ) )
+ {
+ bFound = true;
+ }
+ }
+ break;
+ }
+ else if( eSdrObjKind == SdrObjKind::Table )
+ {
+ bFound = true;
+ }
+ break;
+ case PresObjKind::Page:
+ case PresObjKind::Handout:
+ bFound = eSdrObjKind == SdrObjKind::Page;
+ break;
+ case PresObjKind::Notes:
+ case PresObjKind::Text:
+ bFound = (bPresStyle && (eSdrObjKind == SdrObjKind::Text)) || (eSdrObjKind == SdrObjKind::OutlineText);
+ break;
+ default:
+ break;
+ }
+ }
+
+ if( bFound )
+ rShapes[i] = pObj;
+ }
+}
+
+void SdPage::SetAutoLayout(AutoLayout eLayout, bool bInit, bool bCreate )
+{
+ sd::ScopeLockGuard aGuard( maLockAutoLayoutArrangement );
+
+ const bool bSwitchLayout = eLayout != GetAutoLayout();
+
+ SfxUndoManager* pUndoManager(static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetUndoManager());
+ const bool bUndo = pUndoManager && pUndoManager->IsInListAction() && IsInserted();
+
+ meAutoLayout = eLayout;
+
+ // if needed, creates and initialises the presentation shapes on this slides master page
+ CreateTitleAndLayout(bInit, bCreate);
+
+ if((meAutoLayout == AUTOLAYOUT_NONE && maPresentationShapeList.isEmpty()) || mbMaster)
+ {
+ // MasterPage or no layout and no presentation shapes available, nothing to do
+ return;
+ }
+
+ ::tools::Rectangle aRectangle[MAX_PRESOBJS];
+ const LayoutDescriptor& aDescriptor = GetLayoutDescriptor( meAutoLayout );
+ OUString sLayoutName( enumtoString(meAutoLayout) );
+ CalcAutoLayoutRectangles( *this, aRectangle, sLayoutName);
+
+ o3tl::sorted_vector< SdrObject* > aUsedPresentationObjects;
+
+ std::array<SdrObject*, MAX_PRESOBJS > aLayoutShapes;
+ aLayoutShapes.fill(nullptr);
+ findAutoLayoutShapesImpl( *this, aDescriptor, aLayoutShapes, bInit, bSwitchLayout );
+
+ // for each entry in the layoutdescriptor, arrange a presentation shape
+ for (int i = 0; (i < MAX_PRESOBJS) && (aDescriptor.meKind[i] != PresObjKind::NONE); i++)
+ {
+ PresObjKind eKind = aDescriptor.meKind[i];
+ SdrObject* pObj = InsertAutoLayoutShape( aLayoutShapes[i], eKind, aDescriptor.mbVertical[i], aRectangle[i], bInit );
+ if( pObj )
+ aUsedPresentationObjects.insert(pObj); // remember that we used this empty shape
+ }
+
+ // now delete all empty presentation objects that are no longer used by the new layout
+ if( !bInit )
+ return;
+
+ SdrObject* pObj = nullptr;
+ maPresentationShapeList.seekShape(0);
+
+ while( (pObj = maPresentationShapeList.getNextShape()) )
+ {
+ if( aUsedPresentationObjects.count(pObj) == 0 )
+ {
+
+ if( pObj->IsEmptyPresObj() )
+ {
+ if( bUndo )
+ pUndoManager->AddUndoAction(getSdrModelFromSdrPage().GetSdrUndoFactory().CreateUndoDeleteObject(*pObj));
+
+ RemoveObject( pObj->GetOrdNum() );
+
+ if( !bUndo )
+ SdrObject::Free( pObj );
+ }
+/* #i108541# keep non empty pres obj as pres obj even if they are not part of the current layout */
+ }
+ }
+}
+
+/*************************************************************************
+|*
+|* insert object
+|*
+\************************************************************************/
+
+void SdPage::NbcInsertObject(SdrObject* pObj, size_t nPos)
+{
+ FmFormPage::NbcInsertObject(pObj, nPos);
+
+ static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).InsertObject(pObj);
+
+ SdrLayerID nId = pObj->GetLayer();
+ if( mbMaster )
+ {
+ if( nId == SdrLayerID(0) )
+ pObj->NbcSetLayer( SdrLayerID(2) ); // wrong layer. corrected to BackgroundObj layer
+ }
+ else
+ {
+ if( nId == SdrLayerID(2) )
+ pObj->NbcSetLayer( SdrLayerID(0) ); // wrong layer. corrected to layout layer
+ }
+}
+
+/*************************************************************************
+|*
+|* remove object
+|*
+\************************************************************************/
+
+SdrObject* SdPage::RemoveObject(size_t nObjNum)
+{
+ onRemoveObject(GetObj( nObjNum ));
+ return FmFormPage::RemoveObject(nObjNum);
+}
+
+/*************************************************************************
+|*
+|* remove object without broadcast
+|*
+\************************************************************************/
+
+SdrObject* SdPage::NbcRemoveObject(size_t nObjNum)
+{
+ onRemoveObject(GetObj( nObjNum ));
+ return FmFormPage::NbcRemoveObject(nObjNum);
+}
+
+// Also override ReplaceObject methods to realize when
+// objects are removed with this mechanism instead of RemoveObject
+SdrObject* SdPage::ReplaceObject(SdrObject* pNewObj, size_t nObjNum)
+{
+ onRemoveObject(GetObj( nObjNum ));
+ return FmFormPage::ReplaceObject(pNewObj, nObjNum);
+}
+
+// called after a shape is removed or replaced from this slide
+
+void SdPage::onRemoveObject( SdrObject* pObject )
+{
+ if( pObject )
+ {
+ RemovePresObj(pObject);
+
+ static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).RemoveObject(pObject);
+
+ removeAnimations( pObject );
+ }
+}
+
+void SdPage::SetSize(const Size& aSize)
+{
+ Size aOldSize = GetSize();
+
+ if (aSize != aOldSize)
+ {
+ FmFormPage::SetSize(aSize);
+ }
+}
+
+void SdPage::SetBorder(sal_Int32 nLft, sal_Int32 nUpp, sal_Int32 nRgt, sal_Int32 nLwr)
+{
+ if (nLft != GetLeftBorder() || nUpp != GetUpperBorder() ||
+ nRgt != GetRightBorder() || nLwr != GetLowerBorder() )
+ {
+ FmFormPage::SetBorder(nLft, nUpp, nRgt, nLwr);
+ }
+}
+
+void SdPage::SetLeftBorder(sal_Int32 nBorder)
+{
+ if (nBorder != GetLeftBorder() )
+ {
+ FmFormPage::SetLeftBorder(nBorder);
+ }
+}
+
+void SdPage::SetRightBorder(sal_Int32 nBorder)
+{
+ if (nBorder != GetRightBorder() )
+ {
+ FmFormPage::SetRightBorder(nBorder);
+ }
+}
+
+void SdPage::SetUpperBorder(sal_Int32 nBorder)
+{
+ if (nBorder != GetUpperBorder() )
+ {
+ FmFormPage::SetUpperBorder(nBorder);
+ }
+}
+
+void SdPage::SetLowerBorder(sal_Int32 nBorder)
+{
+ if (nBorder != GetLowerBorder() )
+ {
+ FmFormPage::SetLowerBorder(nBorder);
+ }
+}
+
+/*************************************************************************
+|*
+|* Adjust all objects to new page size.
+|*
+|* bScaleAllObj: all objects are scaled into the new area within the page
+|* margins. We scale the position and size. For presentation objects on the
+|* master page, we also scale the font height of the presentation template.
+|*
+\************************************************************************/
+
+void SdPage::ScaleObjects(const Size& rNewPageSize, const ::tools::Rectangle& rNewBorderRect, bool bScaleAllObj)
+{
+ sd::ScopeLockGuard aGuard( maLockAutoLayoutArrangement );
+
+ mbScaleObjects = bScaleAllObj;
+ SdrObject* pObj = nullptr;
+ Point aRefPnt(0, 0);
+ Size aNewPageSize(rNewPageSize);
+ sal_Int32 nLeft = rNewBorderRect.Left();
+ sal_Int32 nRight = rNewBorderRect.Right();
+ sal_Int32 nUpper = rNewBorderRect.Top();
+ sal_Int32 nLower = rNewBorderRect.Bottom();
+
+ // negative values are fixed values
+ // -> use up to date values
+ if (aNewPageSize.Width() < 0)
+ {
+ aNewPageSize.setWidth( GetWidth() );
+ }
+ if (aNewPageSize.Height() < 0)
+ {
+ aNewPageSize.setHeight( GetHeight() );
+ }
+ if (nLeft < 0)
+ {
+ nLeft = GetLeftBorder();
+ }
+ if (nRight < 0)
+ {
+ nRight = GetRightBorder();
+ }
+ if (nUpper < 0)
+ {
+ nUpper = GetUpperBorder();
+ }
+ if (nLower < 0)
+ {
+ nLower = GetLowerBorder();
+ }
+
+ Size aBackgroundSize(aNewPageSize);
+
+ if (mbScaleObjects)
+ {
+ aBackgroundSize.AdjustWidth( -(nLeft + nRight) );
+ aBackgroundSize.AdjustHeight( -(nUpper + nLower) );
+ aNewPageSize = aBackgroundSize;
+ }
+
+ ::tools::Long nOldWidth = GetWidth() - GetLeftBorder() - GetRightBorder();
+ ::tools::Long nOldHeight = GetHeight() - GetUpperBorder() - GetLowerBorder();
+
+ Fraction aFractX(aNewPageSize.Width(), nOldWidth);
+ Fraction aFractY(aNewPageSize.Height(), nOldHeight);
+
+ const size_t nObjCnt = (mbScaleObjects ? GetObjCount() : 0);
+
+ for (size_t nObj = 0; nObj < nObjCnt; ++nObj)
+ {
+ bool bIsPresObjOnMaster = false;
+
+ // all Objects
+ pObj = GetObj(nObj);
+
+ if (mbMaster && IsPresObj(pObj))
+ {
+ // There is a presentation object on the master page
+ bIsPresObjOnMaster = true;
+ }
+
+ if (pObj)
+ {
+ // remember aTopLeft as original TopLeft
+ Point aTopLeft(pObj->GetCurrentBoundRect().TopLeft());
+
+ if (!pObj->IsEdgeObj())
+ {
+ /**************************************************************
+ * Scale objects
+ **************************************************************/
+ if (mbScaleObjects)
+ {
+ // use aTopLeft as original TopLeft
+ aRefPnt = aTopLeft;
+ }
+
+ pObj->Resize(aRefPnt, aFractX, aFractY);
+
+ if (mbScaleObjects)
+ {
+ SdrObjKind eObjKind = pObj->GetObjIdentifier();
+
+ if (bIsPresObjOnMaster)
+ {
+ /**********************************************************
+ * presentation template: adjust test height
+ **********************************************************/
+
+ if (pObj == GetPresObj(PresObjKind::Title, 0))
+ {
+ SfxStyleSheet* pTitleSheet = GetStyleSheetForPresObj(PresObjKind::Title);
+
+ if (pTitleSheet)
+ {
+ SfxItemSet& rSet = pTitleSheet->GetItemSet();
+
+ const SvxFontHeightItem& rOldHgt = rSet.Get(EE_CHAR_FONTHEIGHT);
+ sal_uLong nFontHeight = rOldHgt.GetHeight();
+ nFontHeight = ::tools::Long(nFontHeight * static_cast<double>(aFractY));
+ rSet.Put(SvxFontHeightItem(nFontHeight, 100, EE_CHAR_FONTHEIGHT));
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( EE_CHAR_FONTHEIGHT_CJK ) )
+ {
+ const SvxFontHeightItem& rOldHgt2 = rSet.Get(EE_CHAR_FONTHEIGHT_CJK);
+ nFontHeight = rOldHgt2.GetHeight();
+ nFontHeight = ::tools::Long(nFontHeight * static_cast<double>(aFractY));
+ rSet.Put(SvxFontHeightItem(nFontHeight, 100, EE_CHAR_FONTHEIGHT_CJK));
+ }
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( EE_CHAR_FONTHEIGHT_CTL ) )
+ {
+ const SvxFontHeightItem& rOldHgt2 = rSet.Get(EE_CHAR_FONTHEIGHT_CTL);
+ nFontHeight = rOldHgt2.GetHeight();
+ nFontHeight = ::tools::Long(nFontHeight * static_cast<double>(aFractY));
+ rSet.Put(SvxFontHeightItem(nFontHeight, 100, EE_CHAR_FONTHEIGHT_CTL));
+ }
+
+ pTitleSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+ }
+ }
+ else if (pObj == GetPresObj(PresObjKind::Outline, 0))
+ {
+ OUString aName(GetLayoutName() + " ");
+
+ for (sal_Int32 i=1; i<=9; i++)
+ {
+ OUString sLayoutName( aName + OUString::number( i ) );
+ SfxStyleSheet* pOutlineSheet = static_cast<SfxStyleSheet*>(static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetStyleSheetPool()->Find(sLayoutName, SfxStyleFamily::Page));
+
+ if (pOutlineSheet)
+ {
+ // Calculate new font height
+ SfxItemSet aTempSet(pOutlineSheet->GetItemSet());
+
+ const SvxFontHeightItem& rOldHgt = aTempSet.Get(EE_CHAR_FONTHEIGHT);
+ sal_uLong nFontHeight = rOldHgt.GetHeight();
+ nFontHeight = ::tools::Long(nFontHeight * static_cast<double>(aFractY));
+ aTempSet.Put(SvxFontHeightItem(nFontHeight, 100, EE_CHAR_FONTHEIGHT));
+
+ if( SfxItemState::DEFAULT == aTempSet.GetItemState( EE_CHAR_FONTHEIGHT_CJK ) )
+ {
+ const SvxFontHeightItem& rOldHgt2 = aTempSet.Get(EE_CHAR_FONTHEIGHT_CJK);
+ nFontHeight = rOldHgt2.GetHeight();
+ nFontHeight = ::tools::Long(nFontHeight * static_cast<double>(aFractY));
+ aTempSet.Put(SvxFontHeightItem(nFontHeight, 100, EE_CHAR_FONTHEIGHT_CJK));
+ }
+
+ if( SfxItemState::DEFAULT == aTempSet.GetItemState( EE_CHAR_FONTHEIGHT_CTL ) )
+ {
+ const SvxFontHeightItem& rOldHgt2 = aTempSet.Get(EE_CHAR_FONTHEIGHT_CTL);
+ nFontHeight = rOldHgt2.GetHeight();
+ nFontHeight = ::tools::Long(nFontHeight * static_cast<double>(aFractY));
+ aTempSet.Put(SvxFontHeightItem(nFontHeight, 100, EE_CHAR_FONTHEIGHT_CTL));
+ }
+
+ // adjust bullet
+ static_cast<SdStyleSheet*>(pOutlineSheet)->AdjustToFontHeight(aTempSet, false);
+
+ // Special treatment: reset the INVALIDS to
+ // NULL pointer (otherwise we have INVALID's
+ // or pointer to the DefaultItems in the
+ // template; both would suppress the
+ // attribute inheritance)
+ aTempSet.ClearInvalidItems();
+
+ // Special treatment: only the valid parts
+ // of the BulletItems
+ if (aTempSet.GetItemState(EE_PARA_BULLET) == SfxItemState::DEFAULT)
+ {
+ SvxBulletItem aOldBulItem( pOutlineSheet->GetItemSet().Get(EE_PARA_BULLET) );
+ const SvxBulletItem& rNewBulItem = aTempSet.Get(EE_PARA_BULLET);
+ aOldBulItem.CopyValidProperties(rNewBulItem);
+ aTempSet.Put(aOldBulItem);
+ }
+
+ pOutlineSheet->GetItemSet().Put(aTempSet);
+ pOutlineSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+ }
+ }
+ }
+ else if (pObj == GetPresObj(PresObjKind::Notes, 0))
+ {
+ SfxStyleSheet* pNotesSheet = GetStyleSheetForPresObj(PresObjKind::Notes);
+
+ if (pNotesSheet)
+ {
+ sal_uLong nHeight = pObj->GetLogicRect().GetSize().Height();
+ sal_uLong nFontHeight = static_cast<sal_uLong>(nHeight * 0.0741);
+ SfxItemSet& rSet = pNotesSheet->GetItemSet();
+ rSet.Put( SvxFontHeightItem(nFontHeight, 100, EE_CHAR_FONTHEIGHT ));
+ rSet.Put( SvxFontHeightItem(nFontHeight, 100, EE_CHAR_FONTHEIGHT_CJK ));
+ rSet.Put( SvxFontHeightItem(nFontHeight, 100, EE_CHAR_FONTHEIGHT_CTL ));
+ pNotesSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+ }
+ }
+ }
+ else if ( eObjKind != SdrObjKind::TitleText &&
+ eObjKind != SdrObjKind::OutlineText &&
+ dynamic_cast< const SdrTextObj *>( pObj ) != nullptr &&
+ pObj->GetOutlinerParaObject() )
+ {
+ /******************************************************
+ * normal text object: adjust text height
+ ******************************************************/
+ SvtScriptType nScriptType = pObj->GetOutlinerParaObject()->GetTextObject().GetScriptType();
+ sal_uInt16 nWhich = EE_CHAR_FONTHEIGHT;
+ if ( nScriptType == SvtScriptType::ASIAN )
+ nWhich = EE_CHAR_FONTHEIGHT_CJK;
+ else if ( nScriptType == SvtScriptType::COMPLEX )
+ nWhich = EE_CHAR_FONTHEIGHT_CTL;
+
+ // use more modern method to scale the text height
+ sal_uInt32 nFontHeight = static_cast<const SvxFontHeightItem&>(pObj->GetMergedItem(nWhich)).GetHeight();
+ sal_uInt32 nNewFontHeight = sal_uInt32(static_cast<double>(nFontHeight) * static_cast<double>(aFractY));
+
+ pObj->SetMergedItem(SvxFontHeightItem(nNewFontHeight, 100, nWhich));
+ }
+ }
+ }
+
+ if (mbScaleObjects && !pObj->IsEdgeObj())
+ {
+ /**************************************************************
+ * scale object position
+ **************************************************************/
+ Point aNewPos;
+
+ // corrected scaling; only distances may be scaled
+ // use aTopLeft as original TopLeft
+ aNewPos.setX( ::tools::Long((aTopLeft.X() - GetLeftBorder()) * static_cast<double>(aFractX)) + nLeft );
+ aNewPos.setY( ::tools::Long((aTopLeft.Y() - GetUpperBorder()) * static_cast<double>(aFractY)) + nUpper );
+
+ Size aVec(aNewPos.X() - aTopLeft.X(), aNewPos.Y() - aTopLeft.Y());
+
+ if (aVec.Height() != 0 || aVec.Width() != 0)
+ {
+ pObj->NbcMove(aVec);
+ }
+
+ pObj->SetChanged();
+ pObj->BroadcastObjectChange();
+ }
+ }
+ }
+}
+
+static SdrObject* convertPresentationObjectImpl(SdPage& rPage, SdrObject* pSourceObj, PresObjKind& eObjKind, bool bVertical, const ::tools::Rectangle& rRect)
+{
+ SdDrawDocument& rModel(static_cast< SdDrawDocument& >(rPage.getSdrModelFromSdrPage()));
+ if( !pSourceObj )
+ return pSourceObj;
+
+ SfxUndoManager* pUndoManager = rModel.GetUndoManager();
+ const bool bUndo = pUndoManager && pUndoManager->IsInListAction() && rPage.IsInserted();
+
+ SdrObject* pNewObj = pSourceObj;
+ if((eObjKind == PresObjKind::Outline) && (pSourceObj->GetObjIdentifier() == SdrObjKind::Text) )
+ {
+ pNewObj = rPage.CreatePresObj(PresObjKind::Outline, bVertical, rRect);
+
+ // Set text of the subtitle into PRESOBJ_OUTLINE
+ OutlinerParaObject* pOutlParaObj = pSourceObj->GetOutlinerParaObject();
+
+ if(pOutlParaObj)
+ {
+ // assign text
+ SdOutliner* pOutl = rModel.GetInternalOutliner();
+ pOutl->Clear();
+ pOutl->SetText( *pOutlParaObj );
+ pNewObj->SetOutlinerParaObject( pOutl->CreateParaObject() );
+ pOutlParaObj = pNewObj->GetOutlinerParaObject();
+ pOutl->Clear();
+ pNewObj->SetEmptyPresObj(false);
+
+ for (sal_uInt16 nLevel = 1; nLevel < 10; nLevel++)
+ {
+ // assign new template
+ OUString aName( rPage.GetLayoutName() + " " + OUString::number( nLevel ) );
+ SfxStyleSheet* pSheet = static_cast<SfxStyleSheet*>( rModel.GetStyleSheetPool()->Find(aName, SfxStyleFamily::Page) );
+
+ if (pSheet && nLevel == 1)
+ {
+ SfxStyleSheet* pSubtitleSheet = rPage.GetStyleSheetForPresObj(PresObjKind::Text);
+
+ if (pSubtitleSheet)
+ pOutlParaObj->ChangeStyleSheetName(SfxStyleFamily::Page, pSubtitleSheet->GetName(), pSheet->GetName());
+ }
+ }
+
+ // Remove LRSpace item
+ SfxItemSetFixed<EE_PARA_LRSPACE, EE_PARA_LRSPACE> aSet(rModel.GetPool());
+
+ aSet.Put(pNewObj->GetMergedItemSet());
+
+ aSet.ClearItem(EE_PARA_LRSPACE);
+
+ pNewObj->SetMergedItemSet(aSet);
+
+ if( bUndo )
+ pUndoManager->AddUndoAction( rModel.GetSdrUndoFactory().CreateUndoDeleteObject(*pSourceObj) );
+
+ // Remove outline shape from page
+ rPage.RemoveObject( pSourceObj->GetOrdNum() );
+
+ if( !bUndo )
+ SdrObject::Free( pSourceObj );
+ }
+ }
+ else if((eObjKind == PresObjKind::Text) && (pSourceObj->GetObjIdentifier() == SdrObjKind::OutlineText) )
+ {
+ // is there an outline shape we can use to replace empty subtitle shape?
+ pNewObj = rPage.CreatePresObj(PresObjKind::Text, bVertical, rRect);
+
+ // Set text of the outline object into PRESOBJ_TITLE
+ OutlinerParaObject* pOutlParaObj = pSourceObj->GetOutlinerParaObject();
+
+ if(pOutlParaObj)
+ {
+ // assign text
+ SdOutliner* pOutl = rModel.GetInternalOutliner();
+ pOutl->Clear();
+ pOutl->SetText( *pOutlParaObj );
+ pNewObj->SetOutlinerParaObject( pOutl->CreateParaObject() );
+ pOutl->Clear();
+ pNewObj->SetEmptyPresObj(false);
+
+ // reset left indent
+ SfxItemSetFixed<EE_PARA_LRSPACE, EE_PARA_LRSPACE> aSet(rModel.GetPool());
+
+ aSet.Put(pNewObj->GetMergedItemSet());
+
+ const SvxLRSpaceItem& rLRItem = aSet.Get(EE_PARA_LRSPACE);
+ SvxLRSpaceItem aNewLRItem(rLRItem);
+ aNewLRItem.SetTextLeft(0);
+ aSet.Put(aNewLRItem);
+
+ pNewObj->SetMergedItemSet(aSet);
+
+ SfxStyleSheet* pSheet = rPage.GetStyleSheetForPresObj(PresObjKind::Text);
+ if (pSheet)
+ pNewObj->SetStyleSheet(pSheet, true);
+
+ // Remove subtitle shape from page
+ if( bUndo )
+ pUndoManager->AddUndoAction(rModel.GetSdrUndoFactory().CreateUndoDeleteObject(*pSourceObj));
+
+ rPage.RemoveObject( pSourceObj->GetOrdNum() );
+
+ if( !bUndo )
+ SdrObject::Free( pSourceObj );
+ }
+ }
+ else if((eObjKind == PresObjKind::Outline) && (pSourceObj->GetObjIdentifier() != SdrObjKind::OutlineText) )
+ {
+ switch( pSourceObj->GetObjIdentifier() )
+ {
+ case SdrObjKind::Table: eObjKind = PresObjKind::Table; break;
+ case SdrObjKind::Media: eObjKind = PresObjKind::Media; break;
+ case SdrObjKind::Graphic: eObjKind = PresObjKind::Graphic; break;
+ case SdrObjKind::OLE2: eObjKind = PresObjKind::Object; break;
+ default: break;
+ }
+ }
+
+ return pNewObj;
+}
+
+/** reuses or creates a presentation shape for an auto layout that fits the given parameter
+
+ @param eObjKind
+ The kind of presentation shape we like to have
+ @param nIndex
+ If > 1 we skip the first nIndex-1 shapes with the presentation shape kind eObjKind while
+ looking for an existing presentation shape
+ @param bVertical
+ If true, the shape is created vertical if bInit is true
+ @param rRect
+ The rectangle that should be used to transform the shape
+ @param bInit
+ If true the shape is created if not found
+ @returns
+ A presentation shape that was either found or created with the given parameters
+*/
+SdrObject* SdPage::InsertAutoLayoutShape(SdrObject* pObj, PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect, bool bInit)
+{
+ SfxUndoManager* pUndoManager(static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetUndoManager());
+ const bool bUndo = pUndoManager && pUndoManager->IsInListAction() && IsInserted();
+
+ if (!pObj && bInit)
+ {
+ pObj = CreatePresObj(eObjKind, bVertical, rRect);
+ }
+ else if ( pObj && (pObj->GetUserCall() || bInit) )
+ {
+ // convert object if shape type does not match kind (f.e. converting outline text to subtitle text)
+ if( bInit )
+ pObj = convertPresentationObjectImpl(*this, pObj, eObjKind, bVertical, rRect);
+
+ if( bUndo )
+ {
+ pUndoManager->AddUndoAction( getSdrModelFromSdrPage().GetSdrUndoFactory().CreateUndoGeoObject( *pObj ) );
+ pUndoManager->AddUndoAction( getSdrModelFromSdrPage().GetSdrUndoFactory().CreateUndoAttrObject( *pObj, true, true ) );
+ pUndoManager->AddUndoAction( std::make_unique<UndoObjectUserCall>( *pObj ) );
+ }
+
+ pObj->AdjustToMaxRect(rRect);
+
+ pObj->SetUserCall(this);
+
+ SdrTextObj* pTextObject = dynamic_cast< SdrTextObj* >(pObj);
+ if( pTextObject )
+ {
+ if( pTextObject->IsVerticalWriting() != bVertical )
+ {
+ pTextObject->SetVerticalWriting( bVertical );
+
+ // here make sure the correct anchoring is used when the object
+ // is re-used but orientation is changed
+ if(PresObjKind::Outline == eObjKind)
+ pTextObject->SetMergedItem(SdrTextHorzAdjustItem( bVertical ? SDRTEXTHORZADJUST_RIGHT : SDRTEXTHORZADJUST_BLOCK ));
+ }
+
+ if( !mbMaster && (pTextObject->GetObjIdentifier() != SdrObjKind::Table) )
+ {
+ if ( pTextObject->IsAutoGrowHeight() )
+ {
+ // switch off AutoGrowHeight, set new MinHeight
+ SfxItemSet aTempAttr( static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetPool() );
+ SdrMetricItem aMinHeight( makeSdrTextMinFrameHeightItem(rRect.GetSize().Height()) );
+ aTempAttr.Put( aMinHeight );
+ aTempAttr.Put( makeSdrTextAutoGrowHeightItem(false) );
+ pTextObject->SetMergedItemSet(aTempAttr);
+ pTextObject->SetLogicRect(rRect);
+
+ // switch on AutoGrowHeight
+ SfxItemSet aAttr( static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetPool() );
+ aAttr.Put( makeSdrTextAutoGrowHeightItem(true) );
+
+ pTextObject->SetMergedItemSet(aAttr);
+ }
+
+ if ( pTextObject->IsAutoGrowWidth() )
+ {
+ // switch off AutoGrowWidth , set new MinWidth
+ SfxItemSet aTempAttr( static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetPool() );
+ SdrMetricItem aMinWidth( makeSdrTextMinFrameWidthItem(rRect.GetSize().Width()) );
+ aTempAttr.Put( aMinWidth );
+ aTempAttr.Put( makeSdrTextAutoGrowWidthItem(false) );
+ pTextObject->SetMergedItemSet(aTempAttr);
+ pTextObject->SetLogicRect(rRect);
+
+ // switch on AutoGrowWidth
+ SfxItemSet aAttr( static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetPool() );
+ aAttr.Put( makeSdrTextAutoGrowWidthItem(true) );
+ pTextObject->SetMergedItemSet(aAttr);
+ }
+ }
+ }
+ }
+
+ if(pObj && bInit )
+ {
+ if( !IsPresObj( pObj ) )
+ {
+ if( bUndo )
+ pUndoManager->AddUndoAction( std::make_unique<UndoObjectPresentationKind>( *pObj ) );
+
+ InsertPresObj( pObj, eObjKind );
+ }
+
+ // make adjustments for vertical title and outline shapes
+ if( bVertical && (( eObjKind == PresObjKind::Title) || (eObjKind == PresObjKind::Outline)))
+ {
+ SfxItemSet aNewSet(pObj->GetMergedItemSet());
+ aNewSet.Put( makeSdrTextAutoGrowWidthItem(true) );
+ aNewSet.Put( makeSdrTextAutoGrowHeightItem(false) );
+ if( eObjKind == PresObjKind::Outline )
+ {
+ aNewSet.Put( SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP) );
+ aNewSet.Put( SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT) );
+ }
+ pObj->SetMergedItemSet(aNewSet);
+ }
+ }
+
+ if ( pObj && (pObj->GetUserCall() || bInit) && ( pObj->IsEmptyPresObj() || dynamic_cast< const SdrGrafObj *>( pObj ) == nullptr ) )
+ pObj->AdjustToMaxRect(rRect);
+
+ return pObj;
+}
+
+/*************************************************************************
+|*
+|* Returns the PresObjKind of an object
+|*
+\************************************************************************/
+
+PresObjKind SdPage::GetPresObjKind(SdrObject* pObj) const
+{
+ PresObjKind eKind = PresObjKind::NONE;
+ if( (pObj != nullptr) && (maPresentationShapeList.hasShape(*pObj)) )
+ {
+ SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pObj);
+ if( pInfo )
+ eKind = pInfo->mePresObjKind;
+ }
+
+ return eKind;
+}
+
+bool SdPage::IsPresObj(const SdrObject* pObj)
+{
+ return pObj && maPresentationShapeList.hasShape( const_cast<SdrObject&>(*pObj) );
+}
+
+void SdPage::RemovePresObj(const SdrObject* pObj)
+{
+ if( pObj && maPresentationShapeList.hasShape(const_cast<SdrObject&>(*pObj)) )
+ {
+ SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(const_cast<SdrObject&>(*pObj));
+ if( pInfo )
+ pInfo->mePresObjKind = PresObjKind::NONE;
+ maPresentationShapeList.removeShape(const_cast<SdrObject&>(*pObj));
+ }
+}
+
+void SdPage::InsertPresObj(SdrObject* pObj, PresObjKind eKind )
+{
+ DBG_ASSERT( pObj, "sd::SdPage::InsertPresObj(), invalid presentation object inserted!" );
+ DBG_ASSERT( !IsPresObj(pObj), "sd::SdPage::InsertPresObj(), presentation object inserted twice!" );
+ if( pObj )
+ {
+ SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pObj, true);
+ if( pInfo )
+ pInfo->mePresObjKind = eKind;
+ maPresentationShapeList.addShape(*pObj);
+ }
+}
+
+/*************************************************************************
+|*
+|* Set the text of an object
+|*
+\************************************************************************/
+
+void SdPage::SetObjText(SdrTextObj* pObj, SdrOutliner* pOutliner, PresObjKind eObjKind, std::u16string_view rString )
+{
+ if ( !pObj )
+ return;
+
+ ::Outliner* pOutl = pOutliner;
+
+ if (!pOutliner)
+ {
+ SfxItemPool* pPool(static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetDrawOutliner().GetEmptyItemSet().GetPool());
+ pOutl = new ::Outliner( pPool, OutlinerMode::OutlineObject );
+ pOutl->SetRefDevice( SD_MOD()->GetVirtualRefDevice() );
+ pOutl->SetEditTextObjectPool(pPool);
+ pOutl->SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(getSdrModelFromSdrPage().GetStyleSheetPool()));
+ pOutl->EnableUndo(false);
+ pOutl->SetUpdateLayout( false );
+ }
+
+ OutlinerMode nOutlMode = pOutl->GetOutlinerMode();
+ Size aPaperSize = pOutl->GetPaperSize();
+ bool bUpdateMode = pOutl->SetUpdateLayout(false);
+ pOutl->SetParaAttribs( 0, pOutl->GetEmptyItemSet() );
+
+ // Always set the object's StyleSheet at the Outliner to
+ // use the current objects StyleSheet. Thus it's the same as in
+ // SetText(...).
+ // Moved this implementation from where SetObjText(...) was called
+ // to inside this method to work even when outliner is fetched here.
+ pOutl->SetStyleSheet(0, pObj->GetStyleSheet());
+
+ OUString aString;
+
+ switch( eObjKind )
+ {
+ case PresObjKind::Outline:
+ {
+ pOutl->Init( OutlinerMode::OutlineObject );
+
+ aString += OUString::Concat("\t") + rString;
+
+ if (mbMaster)
+ {
+ pOutl->SetStyleSheet( 0, GetStyleSheetForPresObj(eObjKind) );
+ aString += "\n\t\t" +
+ SdResId(STR_PRESOBJ_MPOUTLLAYER2) +
+ "\n\t\t\t" +
+ SdResId(STR_PRESOBJ_MPOUTLLAYER3) +
+ "\n\t\t\t\t" +
+ SdResId(STR_PRESOBJ_MPOUTLLAYER4) +
+ "\n\t\t\t\t\t" +
+ SdResId(STR_PRESOBJ_MPOUTLLAYER5) +
+ "\n\t\t\t\t\t\t" +
+ SdResId(STR_PRESOBJ_MPOUTLLAYER6) +
+ "\n\t\t\t\t\t\t\t" +
+ SdResId(STR_PRESOBJ_MPOUTLLAYER7);
+
+ }
+ }
+ break;
+
+ case PresObjKind::Title:
+ {
+ pOutl->Init( OutlinerMode::TitleObject );
+ aString += rString;
+ }
+ break;
+
+ default:
+ {
+ pOutl->Init( OutlinerMode::TextObject );
+ aString += rString;
+
+ // check if we need to add a text field
+ std::unique_ptr<SvxFieldData> pData;
+
+ switch( eObjKind )
+ {
+ case PresObjKind::Header:
+ pData.reset(new SvxHeaderField());
+ break;
+ case PresObjKind::Footer:
+ pData .reset(new SvxFooterField());
+ break;
+ case PresObjKind::SlideNumber:
+ pData.reset(new SvxPageField());
+ break;
+ case PresObjKind::DateTime:
+ pData.reset(new SvxDateTimeField());
+ break;
+ default:
+ break;
+ }
+
+ if( pData )
+ {
+ ESelection e;
+ SvxFieldItem aField( *pData, EE_FEATURE_FIELD );
+ pOutl->QuickInsertField(aField,e);
+ }
+ }
+ break;
+ }
+
+ pOutl->SetPaperSize( pObj->GetLogicRect().GetSize() );
+
+ if( !aString.isEmpty() )
+ pOutl->SetText( aString, pOutl->GetParagraph( 0 ) );
+
+ pObj->SetOutlinerParaObject( pOutl->CreateParaObject() );
+
+ if (!pOutliner)
+ {
+ delete pOutl;
+ pOutl = nullptr;
+ }
+ else
+ {
+ // restore the outliner
+ pOutl->Init( nOutlMode );
+ pOutl->SetParaAttribs( 0, pOutl->GetEmptyItemSet() );
+ pOutl->SetUpdateLayout( bUpdateMode );
+ pOutl->SetPaperSize( aPaperSize );
+ }
+}
+
+/*************************************************************************
+|*
+|* Set the name of the layout
+|*
+\************************************************************************/
+void SdPage::SetLayoutName(const OUString& aName)
+{
+ maLayoutName = aName;
+
+ if( mbMaster )
+ {
+ sal_Int32 nPos = maLayoutName.indexOf(SD_LT_SEPARATOR);
+ if (nPos != -1)
+ FmFormPage::SetName(maLayoutName.copy(0, nPos));
+ }
+}
+
+/*************************************************************************
+|*
+|* Return the page name and generates it if necessary
+|*
+\************************************************************************/
+
+const OUString& SdPage::GetName() const
+{
+ OUString aCreatedPageName( maCreatedPageName );
+ if (GetRealName().isEmpty())
+ {
+ if ((mePageKind == PageKind::Standard || mePageKind == PageKind::Notes) && !mbMaster)
+ {
+ // default name for handout pages
+ sal_uInt16 nNum = (GetPageNum() + 1) / 2;
+
+ aCreatedPageName = SdResId(STR_PAGE) + " ";
+ if (static_cast<SdDrawDocument&>(getSdrModelFromSdrPage()).GetDocumentType() == DocumentType::Draw )
+ aCreatedPageName = SdResId(STR_PAGE_NAME) + " ";
+
+ if( getSdrModelFromSdrPage().GetPageNumType() == css::style::NumberingType::NUMBER_NONE )
+ {
+ // if the document has number none as a formatting
+ // for page numbers we still default to arabic numbering
+ // to keep the default page names unique
+ aCreatedPageName += OUString::number( static_cast<sal_Int32>(nNum) );
+ }
+ else
+ {
+ aCreatedPageName += static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).CreatePageNumValue(nNum);
+ }
+ }
+ else
+ {
+ /******************************************************************
+ * default name for note pages
+ ******************************************************************/
+ aCreatedPageName = SdResId(STR_LAYOUT_DEFAULT_NAME);
+ }
+ }
+ else
+ {
+ aCreatedPageName = GetRealName();
+ }
+
+ if (mePageKind == PageKind::Notes)
+ {
+ aCreatedPageName += " " + SdResId(STR_NOTES);
+ }
+ else if (mePageKind == PageKind::Handout && mbMaster)
+ {
+ aCreatedPageName += " (" + SdResId(STR_HANDOUT) + ")";
+ }
+
+ const_cast< SdPage* >(this)->maCreatedPageName = aCreatedPageName;
+ return maCreatedPageName;
+}
+
+void SdPage::SetOrientation( Orientation /*eOrient*/)
+{
+ // Do nothing
+}
+
+Orientation SdPage::GetOrientation() const
+{
+ Size aSize = GetSize();
+ if ( aSize.getWidth() > aSize.getHeight() )
+ {
+ return Orientation::Landscape;
+ }
+ else
+ {
+ return Orientation::Portrait;
+ }
+}
+
+/*************************************************************************
+|*
+|* returns the default text of a PresObjektes
+|*
+\************************************************************************/
+
+OUString SdPage::GetPresObjText(PresObjKind eObjKind) const
+{
+ OUString aString;
+
+#if defined(IOS) || defined(ANDROID)
+ bool isMobileDevice = true;
+#else
+ bool isMobileDevice = false;
+ if (const SfxViewShell* pCurrentViewShell = SfxViewShell::Current())
+ isMobileDevice = pCurrentViewShell->isLOKMobilePhone() || pCurrentViewShell->isLOKTablet();
+#endif
+
+ if (eObjKind == PresObjKind::Title)
+ {
+ if (mbMaster)
+ {
+ if (mePageKind != PageKind::Notes)
+ {
+ if (isMobileDevice)
+ aString = SdResId(STR_PRESOBJ_MPTITLE_MOBILE);
+ else
+ aString = SdResId(STR_PRESOBJ_MPTITLE);
+ }
+ else
+ {
+ if (isMobileDevice)
+ aString = SdResId(STR_PRESOBJ_MPNOTESTITLE_MOBILE);
+ else
+ aString = SdResId(STR_PRESOBJ_MPNOTESTITLE);
+ }
+ }
+ else if (isMobileDevice)
+ aString = SdResId(STR_PRESOBJ_TITLE_MOBILE);
+ else
+ aString = SdResId(STR_PRESOBJ_TITLE);
+ }
+ else if (eObjKind == PresObjKind::Outline)
+ {
+ if (mbMaster)
+ {
+ if (isMobileDevice)
+ aString = SdResId(STR_PRESOBJ_MPOUTLINE_MOBILE);
+ else
+ aString = SdResId(STR_PRESOBJ_MPOUTLINE);
+ }
+ else if (isMobileDevice)
+ aString = SdResId(STR_PRESOBJ_OUTLINE_MOBILE);
+ else
+ aString = SdResId(STR_PRESOBJ_OUTLINE);
+ }
+ else if (eObjKind == PresObjKind::Notes)
+ {
+ if (mbMaster)
+ {
+ if (isMobileDevice)
+ aString = SdResId(STR_PRESOBJ_MPNOTESTEXT_MOBILE);
+ else
+ aString = SdResId(STR_PRESOBJ_MPNOTESTEXT);
+ }
+ else if (isMobileDevice)
+ aString = SdResId(STR_PRESOBJ_NOTESTEXT_MOBILE);
+ else
+ aString = SdResId(STR_PRESOBJ_NOTESTEXT);
+ }
+ else if (eObjKind == PresObjKind::Text)
+ {
+ if (isMobileDevice)
+ aString = SdResId(STR_PRESOBJ_TEXT_MOBILE);
+ else
+ aString = SdResId(STR_PRESOBJ_TEXT);
+ }
+ else if (eObjKind == PresObjKind::Graphic)
+ {
+ aString = SdResId( STR_PRESOBJ_GRAPHIC );
+ }
+ else if (eObjKind == PresObjKind::Object)
+ {
+ aString = SdResId( STR_PRESOBJ_OBJECT );
+ }
+ else if (eObjKind == PresObjKind::Chart)
+ {
+ aString = SdResId( STR_PRESOBJ_CHART );
+ }
+ else if (eObjKind == PresObjKind::OrgChart)
+ {
+ aString = SdResId( STR_PRESOBJ_ORGCHART );
+ }
+ else if (eObjKind == PresObjKind::Calc)
+ {
+ aString = SdResId( STR_PRESOBJ_TABLE );
+ }
+
+ return aString;
+}
+
+uno::Reference< uno::XInterface > SdPage::createUnoPage()
+{
+ return createUnoPageImpl( this );
+}
+
+/** returns the SdPage implementation for the given XDrawPage or 0 if not available */
+SdPage* SdPage::getImplementation( const css::uno::Reference< css::drawing::XDrawPage >& xPage )
+{
+ try
+ {
+ auto pUnoPage = comphelper::getFromUnoTunnel<SvxDrawPage>(xPage);
+ if( pUnoPage )
+ return static_cast< SdPage* >( pUnoPage->GetSdrPage() );
+ }
+ catch( css::uno::Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SdPage::getImplementation()" );
+ }
+
+ return nullptr;
+}
+
+sal_Int64 SdPage::GetHashCode() const
+{
+ return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
+}
+
+void SdPage::SetName (const OUString& rName)
+{
+ OUString aOldName( GetName() );
+ FmFormPage::SetName (rName);
+ static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).UpdatePageRelativeURLs(aOldName, rName);
+ ActionChanged();
+}
+
+const HeaderFooterSettings& SdPage::getHeaderFooterSettings() const
+{
+ if( mePageKind == PageKind::Handout && !mbMaster )
+ {
+ return static_cast<SdPage&>(TRG_GetMasterPage()).maHeaderFooterSettings;
+ }
+ else
+ {
+ return maHeaderFooterSettings;
+ }
+}
+
+void SdPage::setHeaderFooterSettings( const sd::HeaderFooterSettings& rNewSettings )
+{
+ if( mePageKind == PageKind::Handout && !mbMaster )
+ {
+ static_cast<SdPage&>(TRG_GetMasterPage()).maHeaderFooterSettings = rNewSettings;
+ }
+ else
+ {
+ maHeaderFooterSettings = rNewSettings;
+ }
+
+ SetChanged();
+
+ if(!TRG_HasMasterPage())
+ return;
+
+ TRG_GetMasterPageDescriptorViewContact().ActionChanged();
+
+ // #i119056# For HeaderFooterSettings SdrObjects are used, but the properties
+ // used are not part of their model data, but kept in SD. This data is applied
+ // using a 'backdoor' on primitive creation. Thus, the normal mechanism to detect
+ // object changes does not work here. It is necessary to trigger updates here
+ // directly. BroadcastObjectChange used for PagePreview invalidations,
+ // flushViewObjectContacts used to invalidate and flush all visualizations in
+ // edit views.
+ SdPage* pMasterPage = dynamic_cast< SdPage* >(&TRG_GetMasterPage());
+
+ if(!pMasterPage)
+ return;
+
+ SdrObject* pCandidate = pMasterPage->GetPresObj( PresObjKind::Header );
+
+ if(pCandidate)
+ {
+ pCandidate->BroadcastObjectChange();
+ pCandidate->GetViewContact().flushViewObjectContacts();
+ }
+
+ pCandidate = pMasterPage->GetPresObj( PresObjKind::DateTime );
+
+ if(pCandidate)
+ {
+ pCandidate->BroadcastObjectChange();
+ pCandidate->GetViewContact().flushViewObjectContacts();
+ }
+
+ pCandidate = pMasterPage->GetPresObj( PresObjKind::Footer );
+
+ if(pCandidate)
+ {
+ pCandidate->BroadcastObjectChange();
+ pCandidate->GetViewContact().flushViewObjectContacts();
+ }
+
+ pCandidate = pMasterPage->GetPresObj( PresObjKind::SlideNumber );
+
+ if(pCandidate)
+ {
+ pCandidate->BroadcastObjectChange();
+ pCandidate->GetViewContact().flushViewObjectContacts();
+ }
+}
+
+bool SdPage::checkVisibility(
+ const sdr::contact::ViewObjectContact& rOriginal,
+ const sdr::contact::DisplayInfo& rDisplayInfo,
+ bool bEdit )
+{
+ if( !FmFormPage::checkVisibility( rOriginal, rDisplayInfo, bEdit ) )
+ return false;
+
+ SdrObject* pObj = rOriginal.GetViewContact().TryToGetSdrObject();
+ if( pObj == nullptr )
+ return false;
+
+ const SdrPage* pVisualizedPage = GetSdrPageFromXDrawPage(rOriginal.GetObjectContact().getViewInformation2D().getVisualizedPage());
+ const bool bIsPrinting(rOriginal.GetObjectContact().isOutputToPrinter() || rOriginal.GetObjectContact().isOutputToPDFFile());
+ const SdrPageView* pPageView = rOriginal.GetObjectContact().TryToGetSdrPageView();
+ const bool bIsInsidePageObj(pPageView && pPageView->GetPage() != pVisualizedPage);
+
+ // empty presentation objects only visible during edit mode
+ if( (bIsPrinting || !bEdit || bIsInsidePageObj ) && pObj->IsEmptyPresObj() )
+ {
+ if( (pObj->GetObjInventor() != SdrInventor::Default) || ( (pObj->GetObjIdentifier() != SdrObjKind::Rectangle) && (pObj->GetObjIdentifier() != SdrObjKind::Page) ) )
+ return false;
+ }
+
+ if( ( pObj->GetObjInventor() == SdrInventor::Default ) && ( pObj->GetObjIdentifier() == SdrObjKind::Text ) )
+ {
+ const SdPage* pCheckPage = dynamic_cast< const SdPage* >(pObj->getSdrPageFromSdrObject());
+
+ if( pCheckPage )
+ {
+ PresObjKind eKind = pCheckPage->GetPresObjKind(pObj);
+
+ if((eKind == PresObjKind::Footer) || (eKind == PresObjKind::Header) || (eKind == PresObjKind::DateTime) || (eKind == PresObjKind::SlideNumber) )
+ {
+ const bool bSubContentProcessing(rDisplayInfo.GetSubContentActive());
+
+ if( bSubContentProcessing || ( pCheckPage->GetPageKind() == PageKind::Handout && bIsPrinting ) )
+ {
+ // use the page that is currently processed
+ const SdPage* pVisualizedSdPage = dynamic_cast< const SdPage* >(pVisualizedPage);
+
+ if( pVisualizedSdPage )
+ {
+ // if we are not on a masterpage, see if we have to draw this header&footer object at all
+ const sd::HeaderFooterSettings& rSettings = pVisualizedSdPage->getHeaderFooterSettings();
+
+ switch( eKind )
+ {
+ case PresObjKind::Footer:
+ return rSettings.mbFooterVisible;
+ case PresObjKind::Header:
+ return rSettings.mbHeaderVisible;
+ case PresObjKind::DateTime:
+ return rSettings.mbDateTimeVisible;
+ case PresObjKind::SlideNumber:
+ return rSettings.mbSlideNumberVisible;
+ default:
+ break;
+ }
+ }
+ }
+ } // check for placeholders on master
+ else if( (eKind != PresObjKind::NONE) && pCheckPage->IsMasterPage() && ( pVisualizedPage != pCheckPage ) )
+ {
+ // presentation objects on master slide are always invisible if slide is shown.
+ return false;
+ }
+ }
+ }
+
+ // i63977, do not print SdrpageObjs from master pages
+ if( ( pObj->GetObjInventor() == SdrInventor::Default ) && ( pObj->GetObjIdentifier() == SdrObjKind::Page ) )
+ {
+ if( pObj->getSdrPageFromSdrObject() && pObj->getSdrPageFromSdrObject()->IsMasterPage() )
+ return false;
+ }
+
+ return true;
+}
+
+bool SdPage::RestoreDefaultText( SdrObject* pObj )
+{
+ bool bRet = false;
+
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
+
+ if( pTextObj )
+ {
+ PresObjKind ePresObjKind = GetPresObjKind(pTextObj);
+
+ if (ePresObjKind == PresObjKind::Title ||
+ ePresObjKind == PresObjKind::Outline ||
+ ePresObjKind == PresObjKind::Notes ||
+ ePresObjKind == PresObjKind::Text)
+ {
+ OUString aString( GetPresObjText(ePresObjKind) );
+
+ if (!aString.isEmpty())
+ {
+ bool bVertical = false;
+ OutlinerParaObject* pOldPara = pTextObj->GetOutlinerParaObject();
+ if( pOldPara )
+ bVertical = pOldPara->IsEffectivelyVertical(); // is old para object vertical?
+
+ SetObjText( pTextObj, nullptr, ePresObjKind, aString );
+
+ if( pOldPara )
+ {
+ // Here, only the vertical flag for the
+ // OutlinerParaObjects needs to be changed. The
+ // AutoGrowWidth/Height items still exist in the
+ // not changed object.
+ if(pTextObj->GetOutlinerParaObject()
+ && pTextObj->GetOutlinerParaObject()->IsEffectivelyVertical() != bVertical)
+ {
+ ::tools::Rectangle aObjectRect = pTextObj->GetSnapRect();
+ pTextObj->GetOutlinerParaObject()->SetVertical(bVertical);
+ pTextObj->SetSnapRect(aObjectRect);
+ }
+ }
+
+ pTextObj->SetTextEditOutliner( nullptr ); // to make stylesheet settings work
+ pTextObj->NbcSetStyleSheet( GetStyleSheetForPresObj(ePresObjKind), true );
+ pTextObj->SetEmptyPresObj(true);
+ bRet = true;
+ }
+ }
+ }
+ return bRet;
+}
+
+void SdPage::CalculateHandoutAreas( SdDrawDocument& rModel, AutoLayout eLayout, bool bHorizontal, std::vector< ::tools::Rectangle >& rAreas )
+{
+ SdPage& rHandoutMaster = *rModel.GetMasterSdPage( 0, PageKind::Handout );
+
+ static const sal_uInt16 aOffsets[5][9] =
+ {
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, // AUTOLAYOUT_HANDOUT9, Portrait, Horizontal order
+ { 0, 2, 4, 1, 3, 5, 0, 0, 0 }, // AUTOLAYOUT_HANDOUT3, Landscape, Vertical
+ { 0, 2, 1, 3, 0, 0, 0, 0, 0 }, // AUTOLAYOUT_HANDOUT4, Landscape, Vertical
+ { 0, 3, 1, 4, 2, 5, 0, 0, 0 }, // AUTOLAYOUT_HANDOUT4, Portrait, Vertical
+ { 0, 3, 6, 1, 4, 7, 2, 5, 8 }, // AUTOLAYOUT_HANDOUT9, Landscape, Vertical
+ };
+
+ const sal_uInt16* pOffsets = aOffsets[0];
+
+ Size aArea = rHandoutMaster.GetSize();
+ const bool bLandscape = aArea.Width() > aArea.Height();
+
+ if( eLayout == AUTOLAYOUT_NONE )
+ {
+ // use layout from handout master
+ SdrObjListIter aShapeIter(&rHandoutMaster);
+
+ std::vector< ::tools::Rectangle > vSlidesAreas;
+ while ( aShapeIter.IsMore() )
+ {
+ SdrPageObj* pPageObj = dynamic_cast<SdrPageObj*>( aShapeIter.Next() );
+ // get slide rectangles
+ if (pPageObj)
+ vSlidesAreas.push_back( pPageObj->GetCurrentBoundRect() );
+ }
+
+ if ( !bHorizontal || vSlidesAreas.size() < 4 )
+ { // top to bottom, then right
+ rAreas.swap( vSlidesAreas );
+ }
+ else
+ { // left to right, then down
+ switch ( vSlidesAreas.size() )
+ {
+ case 4:
+ pOffsets = aOffsets[2];
+ break;
+
+ default:
+ [[fallthrough]];
+ case 6:
+ pOffsets = aOffsets[ bLandscape ? 3 : 1 ];
+ break;
+
+ case 9:
+ pOffsets = aOffsets[4];
+ break;
+ }
+
+ rAreas.resize( static_cast<size_t>(vSlidesAreas.size()) );
+
+ for( const ::tools::Rectangle& rRect : vSlidesAreas )
+ {
+ rAreas[*pOffsets++] = rRect;
+ }
+ }
+ }
+ else
+ {
+ const ::tools::Long nGapW = 1000; // gap is 1cm
+ const ::tools::Long nGapH = 1000;
+
+ ::tools::Long nLeftBorder = rHandoutMaster.GetLeftBorder();
+ ::tools::Long nRightBorder = rHandoutMaster.GetRightBorder();
+ ::tools::Long nTopBorder = rHandoutMaster.GetUpperBorder();
+ ::tools::Long nBottomBorder = rHandoutMaster.GetLowerBorder();
+
+ const ::tools::Long nHeaderFooterHeight = static_cast< ::tools::Long >( (aArea.Height() - nTopBorder - nLeftBorder) * 0.05 );
+
+ nTopBorder += nHeaderFooterHeight;
+ nBottomBorder += nHeaderFooterHeight;
+
+ ::tools::Long nX = nGapW + nLeftBorder;
+ ::tools::Long nY = nGapH + nTopBorder;
+
+ aArea.AdjustWidth( -(nGapW * 2 + nLeftBorder + nRightBorder) );
+ aArea.AdjustHeight( -(nGapH * 2 + nTopBorder + nBottomBorder) );
+
+ sal_uInt16 nColCnt = 0, nRowCnt = 0;
+ switch ( eLayout )
+ {
+ case AUTOLAYOUT_HANDOUT1:
+ nColCnt = 1; nRowCnt = 1;
+ break;
+
+ case AUTOLAYOUT_HANDOUT2:
+ if( bLandscape )
+ {
+ nColCnt = 2; nRowCnt = 1;
+ }
+ else
+ {
+ nColCnt = 1; nRowCnt = 2;
+ }
+ break;
+
+ case AUTOLAYOUT_HANDOUT3:
+ if( bLandscape )
+ {
+ nColCnt = 3; nRowCnt = 2;
+ }
+ else
+ {
+ nColCnt = 2; nRowCnt = 3;
+ }
+ pOffsets = aOffsets[ bLandscape ? 1 : 0 ];
+ break;
+
+ case AUTOLAYOUT_HANDOUT4:
+ nColCnt = 2; nRowCnt = 2;
+ pOffsets = aOffsets[ bHorizontal ? 0 : 2 ];
+ break;
+
+ case AUTOLAYOUT_HANDOUT6:
+ if( bLandscape )
+ {
+ nColCnt = 3; nRowCnt = 2;
+ }
+ else
+ {
+ nColCnt = 2; nRowCnt = 3;
+ }
+ if( !bHorizontal )
+ pOffsets = aOffsets[ bLandscape ? 1 : 3 ];
+ break;
+
+ default:
+ case AUTOLAYOUT_HANDOUT9:
+ nColCnt = 3; nRowCnt = 3;
+
+ if( !bHorizontal )
+ pOffsets = aOffsets[4];
+ break;
+ }
+
+ rAreas.resize(static_cast<size_t>(nColCnt) * nRowCnt);
+
+ Size aPartArea, aSize;
+ aPartArea.setWidth( (aArea.Width() - ((nColCnt-1) * nGapW) ) / nColCnt );
+ aPartArea.setHeight( (aArea.Height() - ((nRowCnt-1) * nGapH) ) / nRowCnt );
+
+ SdrPage* pFirstPage = rModel.GetMasterSdPage(0, PageKind::Standard);
+ if (pFirstPage && pFirstPage->GetWidth() && pFirstPage->GetHeight())
+ {
+ // scale actual size into handout rect
+ double fScale = static_cast<double>(aPartArea.Width()) / static_cast<double>(pFirstPage->GetWidth());
+
+ aSize.setHeight( static_cast<::tools::Long>(fScale * pFirstPage->GetHeight() ) );
+ if( aSize.Height() > aPartArea.Height() )
+ {
+ fScale = static_cast<double>(aPartArea.Height()) / static_cast<double>(pFirstPage->GetHeight());
+ aSize.setHeight( aPartArea.Height() );
+ aSize.setWidth( static_cast<::tools::Long>(fScale * pFirstPage->GetWidth()) );
+ }
+ else
+ {
+ aSize.setWidth( aPartArea.Width() );
+ }
+
+ nX += (aPartArea.Width() - aSize.Width()) / 2;
+ nY += (aPartArea.Height()- aSize.Height())/ 2;
+ }
+ else
+ {
+ aSize = aPartArea;
+ }
+
+ Point aPos( nX, nY );
+
+ const bool bRTL = rModel.GetDefaultWritingMode() == css::text::WritingMode_RL_TB;
+
+ const ::tools::Long nOffsetX = (aPartArea.Width() + nGapW) * (bRTL ? -1 : 1);
+ const ::tools::Long nOffsetY = aPartArea.Height() + nGapH;
+ const ::tools::Long nStartX = bRTL ? nOffsetX*(1 - nColCnt) + nX : nX;
+
+ for(sal_uInt16 nRow = 0; nRow < nRowCnt; nRow++)
+ {
+ aPos.setX( nStartX );
+ for(sal_uInt16 nCol = 0; nCol < nColCnt; nCol++)
+ {
+ rAreas[*pOffsets++] = ::tools::Rectangle(aPos, aSize);
+ aPos.AdjustX(nOffsetX );
+ }
+
+ aPos.AdjustY(nOffsetY );
+ }
+ }
+}
+
+void SdPage::SetPrecious (const bool bIsPrecious)
+{
+ mbIsPrecious = bIsPrecious;
+}
+
+HeaderFooterSettings::HeaderFooterSettings()
+{
+ mbHeaderVisible = true;
+ mbFooterVisible = true;
+ mbSlideNumberVisible = false;
+ mbDateTimeVisible = true;
+ mbDateTimeIsFixed = true;
+ meDateFormat = SvxDateFormat::A;
+ meTimeFormat = SvxTimeFormat::AppDefault;
+}
+
+bool HeaderFooterSettings::operator==( const HeaderFooterSettings& rSettings ) const
+{
+ return (mbHeaderVisible == rSettings.mbHeaderVisible) &&
+ (maHeaderText == rSettings.maHeaderText) &&
+ (mbFooterVisible == rSettings.mbFooterVisible) &&
+ (maFooterText == rSettings.maFooterText) &&
+ (mbSlideNumberVisible == rSettings.mbSlideNumberVisible) &&
+ (mbDateTimeVisible == rSettings.mbDateTimeVisible) &&
+ (mbDateTimeIsFixed == rSettings.mbDateTimeIsFixed) &&
+ (meDateFormat == rSettings.meDateFormat) &&
+ (meTimeFormat == rSettings.meTimeFormat) &&
+ (maDateTimeText == rSettings.maDateTimeText);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/sdpage2.cxx b/sd/source/core/sdpage2.cxx
new file mode 100644
index 000000000..a5c8d1d5f
--- /dev/null
+++ b/sd/source/core/sdpage2.cxx
@@ -0,0 +1,651 @@
+/* -*- 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 <vector>
+#include <libxml/xmlwriter.h>
+#include <sfx2/docfile.hxx>
+#include <sfx2/linkmgr.hxx>
+#include <svx/svdundo.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/xmlcnitm.hxx>
+#include <svx/svditer.hxx>
+#include <com/sun/star/text/XTextCopy.hpp>
+#include <tools/debug.hxx>
+#include <svx/svddef.hxx>
+#include <rtl/math.hxx>
+#include <svx/svdograf.hxx>
+
+#include <Annotation.hxx>
+#include <notifydocumentevent.hxx>
+#include <sdresid.hxx>
+#include <sdpage.hxx>
+#include <glob.hxx>
+#include <strings.hrc>
+#include <drawdoc.hxx>
+#include <stlpool.hxx>
+#include <pglink.hxx>
+
+#include <strings.hxx>
+#include <DrawDocShell.hxx>
+
+#include <svl/itemset.hxx>
+
+using namespace ::sd;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::office;
+
+/*************************************************************************
+|*
+|* Sets: names of layout, master page links and templates for presentation
+|* objects
+|*
+|* Preconditions: - The page has to know the correct model!
+|* - The corresponding master page has to be in the model.
+|* - The corresponding style sheets have to be in the style sheet
+|* pool.
+|*
+|* bReplaceStyleSheets = sal_True : Named style sheets are replaced
+|* sal_False: All style sheets are reassigned
+|*
+|* bSetMasterPage = sal_True : search and assign master page
+|*
+|* bReverseOrder = sal_False: search master page from head to tail
+|* sal_True : search master page from tail to head
+|* (for undo operations)
+|*
+\************************************************************************/
+
+void SdPage::SetPresentationLayout(std::u16string_view rLayoutName,
+ bool bReplaceStyleSheets,
+ bool bSetMasterPage,
+ bool bReverseOrder)
+{
+ /*********************************************************************
+ |* Name of the layout of the page
+ \********************************************************************/
+ OUString aOldLayoutName(maLayoutName); // memorize
+ maLayoutName = OUString::Concat(rLayoutName) + SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE;
+
+ /*********************************************************************
+ |* search and replace master page if necessary
+ \********************************************************************/
+ if (bSetMasterPage && !IsMasterPage())
+ {
+ SdPage* pMaster;
+ SdPage* pFoundMaster = nullptr;
+ sal_uInt16 nMaster = 0;
+ sal_uInt16 nMasterCount = getSdrModelFromSdrPage().GetMasterPageCount();
+
+ if( !bReverseOrder )
+ {
+ for ( nMaster = 0; nMaster < nMasterCount; nMaster++ )
+ {
+ pMaster = static_cast<SdPage*>(getSdrModelFromSdrPage().GetMasterPage(nMaster));
+ if (pMaster->GetPageKind() == mePageKind && pMaster->GetLayoutName() == maLayoutName)
+ {
+ pFoundMaster = pMaster;
+ break;
+ }
+ }
+ }
+ else
+ {
+ for ( nMaster = nMasterCount; nMaster > 0; nMaster-- )
+ {
+ pMaster = static_cast<SdPage*>(getSdrModelFromSdrPage().GetMasterPage(nMaster - 1));
+ if (pMaster->GetPageKind() == mePageKind && pMaster->GetLayoutName() == maLayoutName)
+ {
+ pFoundMaster = pMaster;
+ break;
+ }
+ }
+ }
+
+ DBG_ASSERT(pFoundMaster, "Masterpage for presentation layout not found!");
+
+ // this should never happen, but we play failsafe here
+ if( pFoundMaster == nullptr )
+ pFoundMaster = static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetSdPage( 0, mePageKind );
+
+ if( pFoundMaster )
+ TRG_SetMasterPage(*pFoundMaster);
+ }
+
+ /*********************************************************************
+ |* templates for presentation objects
+ \********************************************************************/
+ // list with:
+ // - pointer to templates for outline text object (old and new templates)
+ // - replace-data for OutlinerParaObject
+ std::vector<SfxStyleSheetBase*> aOutlineStyles;
+ std::vector<SfxStyleSheetBase*> aOldOutlineStyles;
+ std::vector<StyleReplaceData> aReplList;
+ bool bListsFilled = false;
+
+ const size_t nObjCount = GetObjCount();
+
+ for (size_t nObj = 0; nObj < nObjCount; ++nObj)
+ {
+ auto pObj = GetObj(nObj);
+
+ if (pObj->GetObjInventor() == SdrInventor::Default &&
+ pObj->GetObjIdentifier() == SdrObjKind::OutlineText)
+ {
+ if (!bListsFilled || !bReplaceStyleSheets)
+ {
+ OUString aFullName;
+ OUString aOldFullName;
+ SfxStyleSheetBase* pSheet = nullptr;
+ SfxStyleSheetBasePool* pStShPool = getSdrModelFromSdrPage().GetStyleSheetPool();
+
+ for (sal_Int16 i = -1; i < 9; i++)
+ {
+ aOldFullName = aOldLayoutName + " " +
+ OUString::number( (i <= 0 ) ? 1 : i + 1 );
+ aFullName = maLayoutName + " " +
+ OUString::number( (i <= 0 ) ? 1 : i + 1);
+ pSheet = pStShPool->Find(aOldFullName, SfxStyleFamily::Page);
+ DBG_ASSERT(pSheet, "Old outline style sheet not found");
+ aOldOutlineStyles.push_back(pSheet);
+
+ pSheet = pStShPool->Find(aFullName, SfxStyleFamily::Page);
+ DBG_ASSERT(pSheet, "New outline style sheet not found");
+ aOutlineStyles.push_back(pSheet);
+
+ if (bReplaceStyleSheets && pSheet)
+ {
+ // Replace instead Set
+ StyleReplaceData aReplData;
+ aReplData.nNewFamily = pSheet->GetFamily();
+ aReplData.nFamily = pSheet->GetFamily();
+ aReplData.aNewName = aFullName;
+ aReplData.aName = aOldFullName;
+ aReplList.push_back(aReplData);
+ }
+ else
+ {
+ OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject();
+
+ if( pOPO )
+ pOPO->SetStyleSheets( i, aFullName, SfxStyleFamily::Page );
+ }
+ }
+
+ bListsFilled = true;
+ }
+
+
+ std::vector<SfxStyleSheetBase*>::iterator iterOldOut = aOldOutlineStyles.begin();
+
+ for (const auto& rpOut : aOutlineStyles)
+ {
+ SfxStyleSheet* pSheet = static_cast<SfxStyleSheet*>(rpOut);
+ SfxStyleSheet* pOldSheet = static_cast<SfxStyleSheet*>(*iterOldOut);
+
+ if (pSheet != pOldSheet)
+ {
+ if (pOldSheet)
+ pObj->EndListening(*pOldSheet);
+
+ if (pSheet && !pObj->IsListening(*pSheet))
+ pObj->StartListening(*pSheet);
+ }
+
+ ++iterOldOut;
+ }
+
+ OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject();
+ if ( bReplaceStyleSheets && pOPO )
+ {
+ for (const auto& rRepl : aReplList)
+ {
+ pOPO->ChangeStyleSheets( rRepl.aName, rRepl.nFamily, rRepl.aNewName, rRepl.nNewFamily );
+ }
+ }
+ }
+ else if (pObj->GetObjInventor() == SdrInventor::Default &&
+ pObj->GetObjIdentifier() == SdrObjKind::TitleText)
+ {
+ // We do not get PresObjKind via GetPresObjKind() since there are
+ // only PresObjListe considered. But we want to consider all "Title
+ // objects" here (paste from clipboard etc.)
+ SfxStyleSheet* pSheet = GetStyleSheetForPresObj(PresObjKind::Title);
+
+ if (pSheet)
+ pObj->SetStyleSheet(pSheet, true);
+ }
+ else
+ {
+ SfxStyleSheet* pSheet = GetStyleSheetForPresObj(GetPresObjKind(pObj));
+
+ if (pSheet)
+ pObj->SetStyleSheet(pSheet, true);
+ }
+ }
+}
+
+/*************************************************************************
+|*
+|* disconnect outline text object from templates for outline levels
+|*
+\************************************************************************/
+
+void SdPage::EndListenOutlineText()
+{
+ SdrObject* pOutlineTextObj = GetPresObj(PresObjKind::Outline);
+
+ if (!pOutlineTextObj)
+ return;
+
+ SdStyleSheetPool* pSPool = static_cast<SdStyleSheetPool*>(getSdrModelFromSdrPage().GetStyleSheetPool());
+ DBG_ASSERT(pSPool, "StyleSheetPool missing");
+ OUString aTrueLayoutName(maLayoutName);
+ sal_Int32 nIndex = aTrueLayoutName.indexOf( SD_LT_SEPARATOR );
+ if( nIndex != -1 )
+ aTrueLayoutName = aTrueLayoutName.copy(0, nIndex);
+
+ std::vector<SfxStyleSheetBase*> aOutlineStyles;
+ pSPool->CreateOutlineSheetList(aTrueLayoutName,aOutlineStyles);
+
+ for (const auto& rpStyle : aOutlineStyles)
+ {
+ SfxStyleSheet *pSheet = static_cast<SfxStyleSheet*>(rpStyle);
+ pOutlineTextObj->EndListening(*pSheet);
+ }
+}
+
+/*************************************************************************
+|*
+|* Is this page read-only?
+|*
+\************************************************************************/
+
+bool SdPage::IsReadOnly() const
+{
+ return false;
+}
+
+/*************************************************************************
+|*
+|* Connect to sfx2::LinkManager
+|*
+\************************************************************************/
+
+void SdPage::ConnectLink()
+{
+ sfx2::LinkManager* pLinkManager(getSdrModelFromSdrPage().GetLinkManager());
+
+ if (!(pLinkManager && !mpPageLink && !maFileName.isEmpty() && !maBookmarkName.isEmpty() &&
+ mePageKind==PageKind::Standard && !IsMasterPage() &&
+ static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).IsNewOrLoadCompleted()))
+ return;
+
+ /**********************************************************************
+ * Connect
+ * Only standard pages are allowed to be linked
+ **********************************************************************/
+ ::sd::DrawDocShell* pDocSh = static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()).GetDocSh();
+
+ if (!pDocSh || pDocSh->GetMedium()->GetOrigURL() != maFileName)
+ {
+ // No links to document owned pages!
+ mpPageLink = new SdPageLink(this, maFileName, maBookmarkName);
+ OUString aFilterName(SdResId(STR_IMPRESS));
+ pLinkManager->InsertFileLink(*mpPageLink, sfx2::SvBaseLinkObjectType::ClientFile,
+ maFileName, &aFilterName, &maBookmarkName);
+ mpPageLink->Connect();
+ }
+}
+
+/*************************************************************************
+|*
+|* Disconnect from sfx2::LinkManager
+|*
+\************************************************************************/
+
+void SdPage::DisconnectLink()
+{
+ sfx2::LinkManager* pLinkManager(getSdrModelFromSdrPage().GetLinkManager());
+
+ if (pLinkManager && mpPageLink)
+ {
+ /**********************************************************************
+ * Disconnect
+ * (remove deletes *pGraphicLink implicit)
+ **********************************************************************/
+ pLinkManager->Remove(mpPageLink);
+ mpPageLink=nullptr;
+ }
+}
+
+void SdPage::lateInit(const SdPage& rSrcPage)
+{
+ // call parent
+ FmFormPage::lateInit(rSrcPage);
+
+ // copy local variables (former stuff from copy constructor)
+ mePageKind = rSrcPage.mePageKind;
+ meAutoLayout = rSrcPage.meAutoLayout;
+ mbSelected = false;
+ mnTransitionType = rSrcPage.mnTransitionType;
+ mnTransitionSubtype = rSrcPage.mnTransitionSubtype;
+ mbTransitionDirection = rSrcPage.mbTransitionDirection;
+ mnTransitionFadeColor = rSrcPage.mnTransitionFadeColor;
+ mfTransitionDuration = rSrcPage.mfTransitionDuration;
+ mePresChange = rSrcPage.mePresChange;
+ mfTime = rSrcPage.mfTime;
+ mbSoundOn = rSrcPage.mbSoundOn;
+ mbExcluded = rSrcPage.mbExcluded;
+ maLayoutName = rSrcPage.maLayoutName;
+ maSoundFile = rSrcPage.maSoundFile;
+ mbLoopSound = rSrcPage.mbLoopSound;
+ mbStopSound = rSrcPage.mbStopSound;
+ maCreatedPageName.clear();
+ maFileName = rSrcPage.maFileName;
+ maBookmarkName = rSrcPage.maBookmarkName;
+ mbScaleObjects = rSrcPage.mbScaleObjects;
+ meCharSet = rSrcPage.meCharSet;
+ mnPaperBin = rSrcPage.mnPaperBin;
+ mpPageLink = nullptr; // is set when inserting via ConnectLink()
+ mbIsPrecious = false;
+
+ // use shape list directly to preserve constness of rSrcPage
+ const std::list< SdrObject* >& rShapeList = rSrcPage.maPresentationShapeList.getList();
+ const size_t nObjCount = GetObjCount();
+ for( SdrObject* pObj : rShapeList )
+ {
+ size_t nOrdNum = pObj->GetOrdNum();
+ InsertPresObj(nOrdNum < nObjCount ? GetObj(nOrdNum) : nullptr, rSrcPage.GetPresObjKind(pObj));
+ }
+
+ // header footer
+ setHeaderFooterSettings( rSrcPage.getHeaderFooterSettings() );
+
+ // animations
+ rSrcPage.cloneAnimations(*this);
+
+ // annotations
+ for(const Reference< XAnnotation >& srcAnnotation : rSrcPage.maAnnotations)
+ {
+ Reference< XAnnotation > ref;
+ createAnnotation(ref);
+ ref->setPosition(srcAnnotation->getPosition());
+ ref->setSize(srcAnnotation->getSize());
+ ref->setAuthor(srcAnnotation->getAuthor());
+ ref->setInitials(srcAnnotation->getInitials());
+ ref->setDateTime(srcAnnotation->getDateTime());
+ Reference< ::css::text::XTextCopy > srcRange ( srcAnnotation->getTextRange(), uno::UNO_QUERY);
+ Reference< ::css::text::XTextCopy > range ( ref->getTextRange(), uno::UNO_QUERY);
+ if(srcRange.is() && range.is())
+ range->copyText( srcRange );
+ }
+
+ // fix user calls for duplicated slide
+ SdrObjListIter aSourceIter( &rSrcPage, SdrIterMode::DeepWithGroups );
+ SdrObjListIter aTargetIter( this, SdrIterMode::DeepWithGroups );
+
+ while( aSourceIter.IsMore() && aTargetIter.IsMore() )
+ {
+ SdrObject* pSource = aSourceIter.Next();
+ SdrObject* pTarget = aTargetIter.Next();
+
+ if( pSource->GetUserCall() )
+ pTarget->SetUserCall(this);
+ }
+}
+
+/*************************************************************************
+|*
+|* Clone
+|*
+\************************************************************************/
+
+rtl::Reference<SdrPage> SdPage::CloneSdrPage(SdrModel& rTargetModel) const
+{
+ SdDrawDocument& rSdDrawDocument(static_cast< SdDrawDocument& >(rTargetModel));
+ rtl::Reference<SdPage> pClonedSdPage(
+ new SdPage(
+ rSdDrawDocument,
+ IsMasterPage()));
+ pClonedSdPage->lateInit(*this);
+ return pClonedSdPage;
+}
+
+/*************************************************************************
+|*
+|* GetTextStyleSheetForObject
+|*
+\************************************************************************/
+
+SfxStyleSheet* SdPage::GetTextStyleSheetForObject( SdrObject* pObj ) const
+{
+ const PresObjKind eKind = GetPresObjKind(pObj);
+ if( eKind != PresObjKind::NONE )
+ {
+ return GetStyleSheetForPresObj(eKind);
+ }
+
+ return FmFormPage::GetTextStyleSheetForObject( pObj );
+}
+
+SfxItemSet* SdPage::getOrCreateItems()
+{
+ if( mpItems == nullptr )
+ mpItems = std::make_unique<SfxItemSetFixed<SDRATTR_XMLATTRIBUTES, SDRATTR_XMLATTRIBUTES>>( getSdrModelFromSdrPage().GetItemPool());
+
+ return mpItems.get();
+}
+
+bool SdPage::setAlienAttributes( const css::uno::Any& rAttributes )
+{
+ SfxItemSet* pSet = getOrCreateItems();
+
+ SvXMLAttrContainerItem aAlienAttributes( SDRATTR_XMLATTRIBUTES );
+ if( aAlienAttributes.PutValue( rAttributes, 0 ) )
+ {
+ pSet->Put( aAlienAttributes );
+ return true;
+ }
+
+ return false;
+}
+
+void SdPage::getAlienAttributes( css::uno::Any& rAttributes )
+{
+ const SvXMLAttrContainerItem* pItem;
+
+ if( (mpItems == nullptr) || !( pItem = mpItems->GetItemIfSet( SDRATTR_XMLATTRIBUTES, false ) ) )
+ {
+ SvXMLAttrContainerItem aAlienAttributes;
+ aAlienAttributes.QueryValue( rAttributes );
+ }
+ else
+ {
+ pItem->QueryValue( rAttributes );
+ }
+}
+
+void SdPage::RemoveEmptyPresentationObjects()
+{
+ SdrObjListIter aShapeIter( this, SdrIterMode::DeepWithGroups );
+
+ for (SdrObject* pShape = aShapeIter.Next(); pShape; pShape = aShapeIter.Next())
+ {
+ if (pShape->IsEmptyPresObj())
+ {
+ RemoveObject( pShape->GetOrdNum() );
+ SdrObject::Free( pShape );
+ }
+ }
+}
+
+void SdPage::setTransitionType( sal_Int16 nTransitionType )
+{
+ mnTransitionType = nTransitionType;
+ ActionChanged();
+}
+
+void SdPage::setTransitionSubtype ( sal_Int16 nTransitionSubtype )
+{
+ mnTransitionSubtype = nTransitionSubtype;
+ ActionChanged();
+}
+
+void SdPage::setTransitionDirection ( bool bTransitionbDirection )
+{
+ mbTransitionDirection = bTransitionbDirection;
+ ActionChanged();
+}
+
+void SdPage::setTransitionFadeColor ( sal_Int32 nTransitionFadeColor )
+{
+ mnTransitionFadeColor = nTransitionFadeColor;
+ ActionChanged();
+}
+
+void SdPage::setTransitionDuration ( double fTransitionDuration )
+{
+ mfTransitionDuration = fTransitionDuration;
+ ActionChanged();
+}
+
+bool SdPage::Equals(const SdPage& rOtherPage) const
+{
+ if (GetObjCount() != rOtherPage.GetObjCount() ||
+ mePageKind != rOtherPage.mePageKind ||
+ meAutoLayout != rOtherPage.meAutoLayout ||
+ mePresChange != rOtherPage.mePresChange ||
+ !rtl::math::approxEqual(mfTime, rOtherPage.mfTime) ||
+ mbSoundOn != rOtherPage.mbSoundOn ||
+ mbExcluded != rOtherPage.mbExcluded ||
+ maLayoutName != rOtherPage.maLayoutName ||
+ maSoundFile != rOtherPage.maSoundFile ||
+ mbLoopSound != rOtherPage.mbLoopSound ||
+ mbStopSound != rOtherPage.mbStopSound ||
+ maBookmarkName != rOtherPage.maBookmarkName ||
+ mbScaleObjects != rOtherPage.mbScaleObjects ||
+ IsBackgroundFullSize() != rOtherPage.IsBackgroundFullSize() || // ???
+ meCharSet != rOtherPage.meCharSet ||
+ mnPaperBin != rOtherPage.mnPaperBin ||
+ mnTransitionType != rOtherPage.mnTransitionType ||
+ mnTransitionSubtype != rOtherPage.mnTransitionSubtype ||
+ mbTransitionDirection != rOtherPage.mbTransitionDirection ||
+ mnTransitionFadeColor != rOtherPage.mnTransitionFadeColor ||
+ !rtl::math::approxEqual(mfTransitionDuration, rOtherPage.mfTransitionDuration))
+ return false;
+
+ for(size_t i = 0; i < GetObjCount(); ++i)
+ if (!GetObj(i)->Equals(*(rOtherPage.GetObj(i))))
+ return false;
+
+ return true;
+ }
+
+void SdPage::createAnnotation( css::uno::Reference< css::office::XAnnotation >& xAnnotation )
+{
+ sd::createAnnotation( xAnnotation, this );
+}
+
+void SdPage::addAnnotation( const Reference< XAnnotation >& xAnnotation, int nIndex )
+{
+ if( (nIndex == -1) || (nIndex > static_cast<int>(maAnnotations.size())) )
+ {
+ maAnnotations.push_back( xAnnotation );
+ }
+ else
+ {
+ maAnnotations.insert( maAnnotations.begin() + nIndex, xAnnotation );
+ }
+
+ if( getSdrModelFromSdrPage().IsUndoEnabled() )
+ {
+ std::unique_ptr<SdrUndoAction> pAction = CreateUndoInsertOrRemoveAnnotation( xAnnotation, true );
+ if( pAction )
+ getSdrModelFromSdrPage().AddUndo( std::move(pAction) );
+ }
+
+ SetChanged();
+ getSdrModelFromSdrPage().SetChanged();
+ NotifyDocumentEvent(
+ static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()),
+ "OnAnnotationInserted",
+ Reference<XInterface>(xAnnotation, UNO_QUERY));
+}
+
+void SdPage::removeAnnotation( const Reference< XAnnotation >& xAnnotation )
+{
+ if( getSdrModelFromSdrPage().IsUndoEnabled() )
+ {
+ std::unique_ptr<SdrUndoAction> pAction = CreateUndoInsertOrRemoveAnnotation( xAnnotation, false );
+ if( pAction )
+ getSdrModelFromSdrPage().AddUndo( std::move(pAction) );
+ }
+
+ AnnotationVector::iterator iter = std::find( maAnnotations.begin(), maAnnotations.end(), xAnnotation );
+ if( iter != maAnnotations.end() )
+ maAnnotations.erase( iter );
+
+ getSdrModelFromSdrPage().SetChanged();
+ NotifyDocumentEvent(
+ static_cast< SdDrawDocument& >( getSdrModelFromSdrPage() ),
+ "OnAnnotationRemoved",
+ Reference<XInterface>( xAnnotation, UNO_QUERY ) );
+}
+
+void SdPage::getGraphicsForPrefetch(std::vector<Graphic*>& graphics) const
+{
+ for( size_t i = 0; i < GetObjCount(); ++i)
+ {
+ SdrObject* obj = GetObj(i);
+ if( SdrGrafObj* grafObj = dynamic_cast<SdrGrafObj*>(obj))
+ if(!grafObj->GetGraphic().isAvailable())
+ graphics.push_back( const_cast<Graphic*>(&grafObj->GetGraphic()));
+ if( const Graphic* fillGraphic = obj->getFillGraphic())
+ if(!fillGraphic->isAvailable())
+ graphics.push_back( const_cast<Graphic*>(fillGraphic));
+ }
+}
+
+void SdPage::dumpAsXml(xmlTextWriterPtr pWriter) const
+{
+ (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SdPage"));
+
+ const char* pPageKind = nullptr;
+ switch (mePageKind)
+ {
+ case PageKind::Standard:
+ pPageKind = "PageKind::Standard";
+ break;
+ case PageKind::Notes:
+ pPageKind = "PageKind::Notes";
+ break;
+ case PageKind::Handout:
+ pPageKind = "PageKind::Handout";
+ break;
+ }
+ if (pPageKind)
+ (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("mePageKind"), BAD_CAST(pPageKind));
+
+
+ FmFormPage::dumpAsXml(pWriter);
+ (void)xmlTextWriterEndElement(pWriter);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/sdpage_animations.cxx b/sd/source/core/sdpage_animations.cxx
new file mode 100644
index 000000000..c52938fd8
--- /dev/null
+++ b/sd/source/core/sdpage_animations.cxx
@@ -0,0 +1,160 @@
+/* -*- 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 <com/sun/star/animations/ParallelTimeContainer.hpp>
+#include <com/sun/star/presentation/EffectNodeType.hpp>
+#include <com/sun/star/presentation/ParagraphTarget.hpp>
+#include <comphelper/processfactory.hxx>
+#include <editeng/outliner.hxx>
+#include <CustomAnimationCloner.hxx>
+#include <CustomAnimationEffect.hxx>
+#include <sdpage.hxx>
+#include <EffectMigration.hxx>
+
+using namespace ::sd;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::animations;
+using namespace ::com::sun::star::presentation;
+
+using ::com::sun::star::drawing::XShape;
+
+/** returns a helper class to manipulate effects inside the main sequence */
+std::shared_ptr< sd::MainSequence > const & SdPage::getMainSequence()
+{
+ if (nullptr == mpMainSequence)
+ mpMainSequence = std::make_shared<sd::MainSequence>( getAnimationNode() );
+
+ return mpMainSequence;
+}
+
+/** returns the main animation node */
+Reference< XAnimationNode > const & SdPage::getAnimationNode()
+{
+ if( !mxAnimationNode.is() )
+ {
+ mxAnimationNode.set( ParallelTimeContainer::create( ::comphelper::getProcessComponentContext() ), UNO_QUERY_THROW );
+ Sequence< css::beans::NamedValue > aUserData
+ { { "node-type", css::uno::Any(css::presentation::EffectNodeType::TIMING_ROOT) } };
+ mxAnimationNode->setUserData( aUserData );
+ }
+
+ return mxAnimationNode;
+}
+
+void SdPage::setAnimationNode( Reference< XAnimationNode > const & xNode )
+{
+ mxAnimationNode = xNode;
+ if( mpMainSequence )
+ mpMainSequence->reset( xNode );
+}
+
+/** removes all custom animations for the given shape */
+void SdPage::removeAnimations( const SdrObject* pObj )
+{
+ if( mxAnimationNode.is() )
+ {
+ getMainSequence();
+
+ Reference< XShape > xShape( const_cast<SdrObject*>(pObj)->getUnoShape(), UNO_QUERY );
+
+ if( mpMainSequence->hasEffect( xShape ) )
+ mpMainSequence->disposeShape( xShape );
+ }
+}
+
+/** Notify that the object has been renamed and the animation effect has to update. */
+void SdPage::notifyObjectRenamed(const SdrObject* pObj)
+{
+ if (pObj && hasAnimationNode())
+ {
+ Reference<XShape> xShape(const_cast<SdrObject*>(pObj)->getUnoShape(), UNO_QUERY);
+
+ if (xShape.is() && getMainSequence()->hasEffect(xShape))
+ getMainSequence()->notify_change();
+ }
+}
+
+bool SdPage::hasAnimationNode() const
+{
+ return mxAnimationNode.is();
+}
+
+void SdPage::SetFadeEffect(css::presentation::FadeEffect eNewEffect)
+{
+ EffectMigration::SetFadeEffect( this, eNewEffect );
+}
+
+FadeEffect SdPage::GetFadeEffect() const
+{
+ return EffectMigration::GetFadeEffect( this );
+}
+
+/** callback from the sd::View when a new paragraph for one object on this page is created */
+void SdPage::onParagraphInserted( const ::Outliner* pOutliner, Paragraph const * pPara, SdrObject* pObj )
+{
+ if( mxAnimationNode.is() )
+ {
+ ParagraphTarget aTarget;
+ aTarget.Shape.set( pObj->getUnoShape(), UNO_QUERY );
+ /* FIXME: Paragraph should be sal_Int32, though more than 64k
+ * paragraphs at a shape are unlikely... */
+ aTarget.Paragraph = static_cast<sal_Int16>(pOutliner->GetAbsPos( pPara ));
+
+ getMainSequence()->insertTextRange( Any( aTarget ) );
+ }
+}
+
+/** callback from the sd::View when a paragraph from one object on this page is removed */
+void SdPage::onParagraphRemoving( const ::Outliner* pOutliner, Paragraph const * pPara, SdrObject* pObj )
+{
+ if( mxAnimationNode.is() )
+ {
+ ParagraphTarget aTarget;
+ aTarget.Shape.set( pObj->getUnoShape(), UNO_QUERY );
+ /* FIXME: Paragraph should be sal_Int32, though more than 64k
+ * paragraphs at a shape are unlikely... */
+ aTarget.Paragraph = static_cast<sal_Int16>(pOutliner->GetAbsPos( pPara ));
+
+ getMainSequence()->disposeTextRange( Any( aTarget ) );
+ }
+}
+
+/** callback from the sd::View when an object just left text edit mode */
+void SdPage::onEndTextEdit( SdrObject* pObj )
+{
+ if( pObj && mxAnimationNode.is() )
+ {
+ Reference< XShape > xObj( pObj->getUnoShape(), UNO_QUERY );
+ getMainSequence()->onTextChanged( xObj );
+ }
+}
+
+void SdPage::cloneAnimations( SdPage& rTargetPage ) const
+{
+ if( mxAnimationNode.is() )
+ {
+ Reference< XAnimationNode > xClonedNode(
+ ::sd::Clone( mxAnimationNode, this, &rTargetPage ) );
+
+ if( xClonedNode.is() )
+ rTargetPage.setAnimationNode( xClonedNode );
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/shapelist.cxx b/sd/source/core/shapelist.cxx
new file mode 100644
index 000000000..613286c9b
--- /dev/null
+++ b/sd/source/core/shapelist.cxx
@@ -0,0 +1,140 @@
+/* -*- 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 <svx/svdobj.hxx>
+#include <osl/diagnose.h>
+#include <shapelist.hxx>
+
+#include <algorithm>
+
+using namespace sd;
+
+ShapeList::ShapeList()
+{
+ maIter = maShapeList.end();
+}
+
+ShapeList::~ShapeList()
+{
+ clear();
+}
+
+/** adds the given shape to this list */
+void ShapeList::addShape( SdrObject& rObject )
+{
+ ListImpl::iterator aIter( std::find( maShapeList.begin(), maShapeList.end(), &rObject ) );
+ if( aIter == maShapeList.end() )
+ {
+ maShapeList.push_back(&rObject);
+ rObject.AddObjectUser( *this );
+ }
+ else
+ {
+ OSL_FAIL("sd::ShapeList::addShape(), given shape already part of list!");
+ }
+}
+
+/** removes the given shape from this list */
+void ShapeList::removeShape( SdrObject& rObject )
+{
+ ListImpl::iterator aIter( std::find( maShapeList.begin(), maShapeList.end(), &rObject ) );
+ if( aIter != maShapeList.end() )
+ {
+ bool bIterErased = aIter == maIter;
+
+ (*aIter)->RemoveObjectUser(*this);
+ aIter = maShapeList.erase( aIter );
+
+ if( bIterErased )
+ maIter = aIter;
+ }
+ else
+ {
+ OSL_FAIL("sd::ShapeList::removeShape(), given shape not part of list!");
+ }
+}
+
+/** removes all shapes from this list
+ NOTE: iterators will become invalid */
+void ShapeList::clear()
+{
+ ListImpl aShapeList;
+ aShapeList.swap( maShapeList );
+
+ for( auto& rpShape : aShapeList )
+ rpShape->RemoveObjectUser(*this);
+
+ maIter = maShapeList.end();
+}
+
+/** returns true if this list is empty */
+bool ShapeList::isEmpty() const
+{
+ return maShapeList.empty();
+}
+
+/** returns true if given shape is part of this list */
+bool ShapeList::hasShape( SdrObject& rObject ) const
+{
+ return std::find( maShapeList.begin(), maShapeList.end(), &rObject ) != maShapeList.end();
+}
+
+void ShapeList::ObjectInDestruction(const SdrObject& rObject)
+{
+ ListImpl::iterator aIter( std::find( maShapeList.begin(), maShapeList.end(), &rObject ) );
+ if( aIter != maShapeList.end() )
+ {
+ bool bIterErased = aIter == maIter;
+
+ aIter = maShapeList.erase( aIter );
+
+ if( bIterErased )
+ maIter = aIter;
+ }
+ else
+ {
+ OSL_FAIL("sd::ShapeList::ObjectInDestruction(), got a call from an unknown friend!");
+ }
+}
+
+SdrObject* ShapeList::getNextShape()
+{
+ if( maIter != maShapeList.end() )
+ {
+ return (*maIter++);
+ }
+ else
+ {
+ return nullptr;
+ }
+}
+
+void ShapeList::seekShape( sal_uInt32 nIndex )
+{
+ maIter = maShapeList.begin();
+ nIndex = std::min(nIndex, static_cast<sal_uInt32>(maShapeList.size()));
+ std::advance(maIter, nIndex);
+}
+
+bool ShapeList::hasMore() const
+{
+ return maIter != maShapeList.end();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/stlfamily.cxx b/sd/source/core/stlfamily.cxx
new file mode 100644
index 000000000..a396bd170
--- /dev/null
+++ b/sd/source/core/stlfamily.cxx
@@ -0,0 +1,513 @@
+/* -*- 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 <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/lang/IllegalAccessException.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <cppuhelper/supportsservice.hxx>
+
+#include <vcl/svapp.hxx>
+
+#include <svl/style.hxx>
+
+#include <tools/debug.hxx>
+#include <unotools/weakref.hxx>
+
+#include <strings.hrc>
+#include <stlfamily.hxx>
+#include <stlsheet.hxx>
+#include <sdresid.hxx>
+#include <sdpage.hxx>
+#include <glob.hxx>
+
+#include <map>
+#include <memory>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::style;
+using namespace ::com::sun::star::beans;
+
+typedef std::map< OUString, rtl::Reference< SdStyleSheet > > PresStyleMap;
+
+struct SdStyleFamilyImpl
+{
+ unotools::WeakReference<SdPage> mxMasterPage;
+ OUString maLayoutName;
+
+ PresStyleMap& getStyleSheets();
+ rtl::Reference< SfxStyleSheetPool > mxPool;
+
+private:
+ PresStyleMap maStyleSheets;
+};
+
+PresStyleMap& SdStyleFamilyImpl::getStyleSheets()
+{
+ auto pMasterPage = mxMasterPage.get();
+ if (!pMasterPage)
+ return maStyleSheets;
+
+ if (pMasterPage->GetLayoutName() != maLayoutName )
+ {
+ maLayoutName = pMasterPage->GetLayoutName();
+
+ OUString aLayoutName( maLayoutName );
+ const sal_Int32 nLen = aLayoutName.indexOf(SD_LT_SEPARATOR ) + 4;
+ aLayoutName = aLayoutName.copy(0, nLen );
+
+ if( (maStyleSheets.empty()) || !(*maStyleSheets.begin()).second->GetName().startsWith( aLayoutName) )
+ {
+ maStyleSheets.clear();
+
+ // The iterator will return only style sheets of family master page
+ std::shared_ptr<SfxStyleSheetIterator> aSSSIterator = std::make_shared<SfxStyleSheetIterator>(mxPool.get(), SfxStyleFamily::Page);
+ for ( SfxStyleSheetBase* pStyle = aSSSIterator->First(); pStyle;
+ pStyle = aSSSIterator->Next() )
+ {
+ // we assume that we have only SdStyleSheets
+ SdStyleSheet* pSdStyle = static_cast< SdStyleSheet* >( pStyle );
+ if (pSdStyle->GetName().startsWith(aLayoutName))
+ {
+ maStyleSheets[ pSdStyle->GetApiName() ].set( pSdStyle );
+ }
+ }
+ }
+ }
+
+ return maStyleSheets;
+}
+
+SdStyleFamily::SdStyleFamily( const rtl::Reference< SfxStyleSheetPool >& xPool, SfxStyleFamily nFamily )
+: mnFamily( nFamily )
+, mxPool( xPool )
+{
+}
+
+SdStyleFamily::SdStyleFamily( const rtl::Reference< SfxStyleSheetPool >& xPool, const SdPage* pMasterPage )
+: mnFamily( SfxStyleFamily::Page )
+, mxPool( xPool )
+, mpImpl( new SdStyleFamilyImpl )
+{
+ mpImpl->mxMasterPage = const_cast< SdPage* >( pMasterPage );
+ mpImpl->mxPool = xPool;
+}
+
+SdStyleFamily::~SdStyleFamily()
+{
+ DBG_ASSERT( !mxPool.is(), "SdStyleFamily::~SdStyleFamily(), dispose me first!" );
+}
+
+void SdStyleFamily::throwIfDisposed() const
+{
+ if( !mxPool.is() )
+ throw DisposedException();
+}
+
+SdStyleSheet* SdStyleFamily::GetValidNewSheet( const Any& rElement )
+{
+ Reference< XStyle > xStyle( rElement, UNO_QUERY );
+ SdStyleSheet* pStyle = static_cast< SdStyleSheet* >( xStyle.get() );
+
+ if( pStyle == nullptr || (pStyle->GetFamily() != mnFamily) || (pStyle->GetPool() != mxPool.get()) || (mxPool->Find( pStyle->GetName(), mnFamily) != nullptr) )
+ throw IllegalArgumentException();
+
+ return pStyle;
+}
+
+SdStyleSheet* SdStyleFamily::GetSheetByName( const OUString& rName )
+{
+ SdStyleSheet* pRet = nullptr;
+ if( !rName.isEmpty() )
+ {
+ if( mnFamily == SfxStyleFamily::Page )
+ {
+ PresStyleMap& rStyleMap = mpImpl->getStyleSheets();
+ PresStyleMap::iterator iter( rStyleMap.find(rName) );
+ if( iter != rStyleMap.end() )
+ pRet = (*iter).second.get();
+ }
+ else
+ {
+ std::shared_ptr<SfxStyleSheetIterator> aSSSIterator = std::make_shared<SfxStyleSheetIterator>(mxPool.get(), mnFamily);
+ for ( SfxStyleSheetBase* pStyle = aSSSIterator->First(); pStyle;
+ pStyle = aSSSIterator->Next() )
+ {
+ // we assume that we have only SdStyleSheets
+ SdStyleSheet* pSdStyle = static_cast< SdStyleSheet* >( pStyle );
+ if (pSdStyle->GetApiName() == rName)
+ {
+ pRet = pSdStyle;
+ break;
+ }
+ }
+ }
+ }
+ if( pRet )
+ return pRet;
+
+ throw NoSuchElementException();
+}
+
+// XServiceInfo
+OUString SAL_CALL SdStyleFamily::getImplementationName()
+{
+ return "SdStyleFamily";
+}
+
+sal_Bool SAL_CALL SdStyleFamily::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+Sequence< OUString > SAL_CALL SdStyleFamily::getSupportedServiceNames()
+{
+ return { "com.sun.star.style.StyleFamily" };
+}
+
+// XNamed
+OUString SAL_CALL SdStyleFamily::getName()
+{
+ if( mnFamily == SfxStyleFamily::Page )
+ {
+ rtl::Reference<SdPage> pPage = mpImpl->mxMasterPage.get();
+ if( pPage == nullptr )
+ throw DisposedException();
+
+ OUString aLayoutName( pPage->GetLayoutName() );
+ sal_Int32 nIndex = aLayoutName.indexOf(SD_LT_SEPARATOR);
+ if( nIndex != -1 )
+ aLayoutName = aLayoutName.copy(0, nIndex);
+
+ return aLayoutName;
+ }
+ else
+ {
+ return SdStyleSheet::GetFamilyString( mnFamily );
+ }
+}
+
+void SAL_CALL SdStyleFamily::setName( const OUString& )
+{
+}
+
+// XNameAccess
+
+Any SAL_CALL SdStyleFamily::getByName( const OUString& rName )
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+ return Any( Reference< XStyle >( static_cast<SfxUnoStyleSheet*>(GetSheetByName( rName )) ) );
+}
+
+Sequence< OUString > SAL_CALL SdStyleFamily::getElementNames()
+{
+ SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ if( mnFamily == SfxStyleFamily::Page )
+ {
+ PresStyleMap& rStyleMap = mpImpl->getStyleSheets();
+ Sequence< OUString > aNames( rStyleMap.size() );
+
+ OUString* pNames = aNames.getArray();
+ for( const auto& rEntry : rStyleMap )
+ {
+ rtl::Reference< SdStyleSheet > xStyle( rEntry.second );
+ if( xStyle.is() )
+ {
+ *pNames++ = xStyle->GetApiName();
+ }
+ }
+
+ return aNames;
+ }
+ else
+ {
+ std::vector< OUString > aNames;
+ std::shared_ptr<SfxStyleSheetIterator> aSSSIterator = std::make_shared<SfxStyleSheetIterator>(mxPool.get(), mnFamily);
+ for ( SfxStyleSheetBase* pStyle = aSSSIterator->First(); pStyle;
+ pStyle = aSSSIterator->Next() )
+ {
+ // we assume that we have only SdStyleSheets
+ SdStyleSheet* pSdStyle = static_cast< SdStyleSheet* >( pStyle );
+ aNames.push_back(pSdStyle->GetApiName());
+ }
+ return Sequence< OUString >( &(*aNames.begin()), aNames.size() );
+ }
+}
+
+sal_Bool SAL_CALL SdStyleFamily::hasByName( const OUString& aName )
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ if( !aName.isEmpty() )
+ {
+ if( mnFamily == SfxStyleFamily::Page )
+ {
+ PresStyleMap& rStyleSheets = mpImpl->getStyleSheets();
+ PresStyleMap::iterator iter( rStyleSheets.find(aName) );
+ return iter != rStyleSheets.end();
+ }
+ else
+ {
+ std::shared_ptr<SfxStyleSheetIterator> aSSSIterator = std::make_shared<SfxStyleSheetIterator>(mxPool.get(), mnFamily);
+ for ( SfxStyleSheetBase* pStyle = aSSSIterator->First(); pStyle;
+ pStyle = aSSSIterator->Next() )
+ {
+ // we assume that we have only SdStyleSheets
+ SdStyleSheet* pSdStyle = static_cast< SdStyleSheet* >( pStyle );
+ if (pSdStyle->GetApiName() == aName)
+ {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+// XElementAccess
+
+Type SAL_CALL SdStyleFamily::getElementType()
+{
+ return cppu::UnoType<XStyle>::get();
+}
+
+sal_Bool SAL_CALL SdStyleFamily::hasElements()
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ if( mnFamily == SfxStyleFamily::Page )
+ {
+ return true;
+ }
+ else
+ {
+ std::shared_ptr<SfxStyleSheetIterator> aSSSIterator = std::make_shared<SfxStyleSheetIterator>(mxPool.get(), mnFamily);
+ if (aSSSIterator->First())
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// XIndexAccess
+
+sal_Int32 SAL_CALL SdStyleFamily::getCount()
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ sal_Int32 nCount = 0;
+ if( mnFamily == SfxStyleFamily::Page )
+ {
+ return mpImpl->getStyleSheets().size();
+ }
+ else
+ {
+ std::shared_ptr<SfxStyleSheetIterator> aSSSIterator = std::make_shared<SfxStyleSheetIterator>(mxPool.get(), mnFamily);
+ for ( SfxStyleSheetBase* pStyle = aSSSIterator->First(); pStyle;
+ pStyle = aSSSIterator->Next() )
+ {
+ nCount++;
+ }
+ }
+
+ return nCount;
+}
+
+Any SAL_CALL SdStyleFamily::getByIndex( sal_Int32 Index )
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ if( Index >= 0 )
+ {
+ if( mnFamily == SfxStyleFamily::Page )
+ {
+ PresStyleMap& rStyleSheets = mpImpl->getStyleSheets();
+ if( Index < static_cast<sal_Int32>(rStyleSheets.size()) )
+ {
+ PresStyleMap::iterator iter( rStyleSheets.begin() );
+ std::advance(iter, Index);
+ return Any( Reference< XStyle >( (*iter).second ) );
+ }
+ }
+ else
+ {
+ std::shared_ptr<SfxStyleSheetIterator> aSSSIterator = std::make_shared<SfxStyleSheetIterator>(mxPool.get(), mnFamily);
+ for ( SfxStyleSheetBase* pStyle = aSSSIterator->First(); pStyle;
+ pStyle = aSSSIterator->Next() )
+ {
+ // we assume that we have only SdStyleSheets
+ SdStyleSheet* pSdStyle = static_cast< SdStyleSheet* >( pStyle );
+ if( Index-- == 0 )
+ {
+ return Any( Reference< XStyle >( pSdStyle ) );
+ }
+ }
+ }
+ }
+
+ throw IndexOutOfBoundsException();
+}
+
+// XNameContainer
+
+void SAL_CALL SdStyleFamily::insertByName( const OUString& rName, const Any& rElement )
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ if(rName.isEmpty())
+ throw IllegalArgumentException();
+
+ SdStyleSheet* pStyle = GetValidNewSheet( rElement );
+ if( !pStyle->SetName( rName ) )
+ throw ElementExistException();
+
+ pStyle->SetApiName( rName );
+ mxPool->Insert( pStyle );
+}
+
+void SAL_CALL SdStyleFamily::removeByName( const OUString& rName )
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ SdStyleSheet* pStyle = GetSheetByName( rName );
+
+ if( !pStyle->IsUserDefined() )
+ throw WrappedTargetException();
+
+ mxPool->Remove( pStyle );
+}
+
+// XNameReplace
+
+void SAL_CALL SdStyleFamily::replaceByName( const OUString& rName, const Any& aElement )
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ SdStyleSheet* pOldStyle = GetSheetByName( rName );
+ SdStyleSheet* pNewStyle = GetValidNewSheet( aElement );
+
+ mxPool->Remove( pOldStyle );
+ mxPool->Insert( pNewStyle );
+}
+
+// XSingleServiceFactory
+
+Reference< XInterface > SAL_CALL SdStyleFamily::createInstance()
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ if( mnFamily == SfxStyleFamily::Page )
+ {
+ throw IllegalAccessException();
+ }
+ return Reference<XInterface>(
+ static_cast<XStyle*>(SdStyleSheet::CreateEmptyUserStyle(*mxPool, mnFamily).get()));
+}
+
+Reference< XInterface > SAL_CALL SdStyleFamily::createInstanceWithArguments( const Sequence< Any >& )
+{
+ return createInstance();
+}
+
+// XComponent
+
+void SAL_CALL SdStyleFamily::dispose( )
+{
+ if( mxPool.is() )
+ mxPool.clear();
+
+ mpImpl.reset();
+}
+
+void SAL_CALL SdStyleFamily::addEventListener( const Reference< XEventListener >& )
+{
+}
+
+void SAL_CALL SdStyleFamily::removeEventListener( const Reference< XEventListener >& )
+{
+}
+
+// XPropertySet
+
+Reference<XPropertySetInfo> SdStyleFamily::getPropertySetInfo()
+{
+ OSL_FAIL( "###unexpected!" );
+ return Reference<XPropertySetInfo>();
+}
+
+void SdStyleFamily::setPropertyValue( const OUString& , const Any& )
+{
+ OSL_FAIL( "###unexpected!" );
+}
+
+Any SdStyleFamily::getPropertyValue( const OUString& PropertyName )
+{
+ if ( PropertyName != "DisplayName" )
+ {
+ throw UnknownPropertyException( "unknown property: " + PropertyName, static_cast<OWeakObject *>(this) );
+ }
+
+ SolarMutexGuard aGuard;
+ OUString sDisplayName;
+ switch( mnFamily )
+ {
+ case SfxStyleFamily::Page: sDisplayName = getName(); break;
+ case SfxStyleFamily::Frame: sDisplayName = SdResId(STR_CELL_STYLE_FAMILY); break;
+ default: sDisplayName = SdResId(STR_GRAPHICS_STYLE_FAMILY); break;
+ }
+ return Any( sDisplayName );
+}
+
+void SdStyleFamily::addPropertyChangeListener( const OUString& , const Reference<XPropertyChangeListener>& )
+{
+ OSL_FAIL( "###unexpected!" );
+}
+
+void SdStyleFamily::removePropertyChangeListener( const OUString& , const Reference<XPropertyChangeListener>& )
+{
+ OSL_FAIL( "###unexpected!" );
+}
+
+void SdStyleFamily::addVetoableChangeListener( const OUString& , const Reference<XVetoableChangeListener>& )
+{
+ OSL_FAIL( "###unexpected!" );
+}
+
+void SdStyleFamily::removeVetoableChangeListener( const OUString& , const Reference<XVetoableChangeListener>& )
+{
+ OSL_FAIL( "###unexpected!" );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/stlpool.cxx b/sd/source/core/stlpool.cxx
new file mode 100644
index 000000000..12891698a
--- /dev/null
+++ b/sd/source/core/stlpool.cxx
@@ -0,0 +1,1395 @@
+/* -*- 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 <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <cppuhelper/supportsservice.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/colritem.hxx>
+#include <editeng/contouritem.hxx>
+#include <editeng/shdditem.hxx>
+#include <editeng/crossedoutitem.hxx>
+#include <editeng/udlnitem.hxx>
+#include <editeng/wghtitem.hxx>
+#include <editeng/postitem.hxx>
+#include <editeng/fontitem.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/sdtaitm.hxx>
+#include <svx/sdtfsitm.hxx>
+#include <svx/sdtagitm.hxx>
+#include <svx/sdshitm.hxx>
+#include <svx/sdshcitm.hxx>
+#include <svx/sdsxyitm.hxx>
+#include <editeng/ulspitem.hxx>
+#include <editeng/numitem.hxx>
+#include <editeng/cmapitem.hxx>
+#include <svl/hint.hxx>
+#include <editeng/charreliefitem.hxx>
+#include <editeng/emphasismarkitem.hxx>
+#include <svx/sdr/table/tabledesign.hxx>
+#include <editeng/autokernitem.hxx>
+#include <tools/diagnose_ex.h>
+#include <tools/UnitConversion.hxx>
+
+#include <editeng/lrspitem.hxx>
+#include <editeng/adjustitem.hxx>
+#include <editeng/numdef.hxx>
+#include <svl/itempool.hxx>
+#include <svl/IndexedStyleSheets.hxx>
+
+#include <stlpool.hxx>
+#include <sdresid.hxx>
+#include <stlsheet.hxx>
+#include <strings.hrc>
+#include <glob.hxx>
+#include <drawdoc.hxx>
+#include <svl/itemset.hxx>
+#include <app.hrc>
+#include <strings.hxx>
+
+#include <com/sun/star/drawing/LineStyle.hpp>
+#include <com/sun/star/drawing/TextFitToSizeType.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::style;
+using namespace ::com::sun::star::container;
+
+namespace
+{
+
+OUString lcl_findRenamedStyleName(std::vector< std::pair< OUString, OUString > > &rRenamedList, OUString const & aOriginalName )
+{
+ auto aIter = std::find_if(rRenamedList.begin(), rRenamedList.end(),
+ [&aOriginalName](const std::pair<OUString, OUString>& rItem) { return rItem.first == aOriginalName; });
+ if (aIter != rRenamedList.end())
+ return (*aIter).second;
+ return OUString();
+}
+
+SfxStyleSheet *lcl_findStyle(StyleSheetCopyResultVector& rStyles, std::u16string_view aStyleName)
+{
+ if( aStyleName.empty() )
+ return nullptr;
+ for (const auto& a : rStyles)
+ {
+ if (a.m_xStyleSheet->GetName() == aStyleName)
+ return a.m_xStyleSheet.get();
+ }
+ return nullptr;
+}
+
+}
+
+SdStyleSheetPool::SdStyleSheetPool(SfxItemPool const& _rPool, SdDrawDocument* pDocument)
+: SdStyleSheetPoolBase( _rPool )
+, mpActualStyleSheet(nullptr)
+, mpDoc(pDocument)
+{
+ if( !mpDoc )
+ return;
+
+ rtl::Reference< SfxStyleSheetPool > xPool( this );
+
+ // create graphics family
+ mxGraphicFamily = new SdStyleFamily( xPool, SfxStyleFamily::Para );
+ mxCellFamily = new SdStyleFamily( xPool, SfxStyleFamily::Frame );
+
+ mxTableFamily = sdr::table::CreateTableDesignFamily();
+ Reference< XNamed > xNamed( mxTableFamily, UNO_QUERY );
+ if( xNamed.is() )
+ msTableFamilyName = xNamed->getName();
+
+ // create presentation families, one for each master page
+ const sal_uInt16 nCount = mpDoc->GetMasterSdPageCount(PageKind::Standard);
+ for( sal_uInt16 nPage = 0; nPage < nCount; ++nPage )
+ AddStyleFamily( mpDoc->GetMasterSdPage(nPage,PageKind::Standard) );
+}
+
+SdStyleSheetPool::~SdStyleSheetPool()
+{
+ DBG_ASSERT( mpDoc == nullptr, "sd::SdStyleSheetPool::~SdStyleSheetPool(), dispose me first!" );
+}
+
+rtl::Reference<SfxStyleSheetBase> SdStyleSheetPool::Create(const OUString& rName, SfxStyleFamily eFamily, SfxStyleSearchBits _nMask )
+{
+ return new SdStyleSheet(rName, *this, eFamily, _nMask);
+}
+
+SfxStyleSheetBase* SdStyleSheetPool::GetTitleSheet(std::u16string_view rLayoutName)
+{
+ OUString aName = OUString::Concat(rLayoutName) + SD_LT_SEPARATOR + STR_LAYOUT_TITLE;
+ SfxStyleSheetBase* pResult = Find(aName, SfxStyleFamily::Page);
+ return pResult;
+}
+
+/*************************************************************************
+|*
+|* Create a list of outline text templates for a presentation layout.
+|* The caller has to delete the list.
+|*
+\************************************************************************/
+
+void SdStyleSheetPool::CreateOutlineSheetList (std::u16string_view rLayoutName, std::vector<SfxStyleSheetBase*> &rOutlineStyles)
+{
+ OUString aName = OUString::Concat(rLayoutName) + SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE;
+
+ for (sal_Int32 nSheet = 1; nSheet < 10; nSheet++)
+ {
+ OUString aFullName(aName + " " + OUString::number( nSheet ) );
+ SfxStyleSheetBase* pSheet = Find(aFullName, SfxStyleFamily::Page);
+
+ if (pSheet)
+ rOutlineStyles.push_back(pSheet);
+ }
+}
+
+/*************************************************************************
+|*
+|* Create style sheets with default values for the named presentation layout
+|*
+\************************************************************************/
+
+void SdStyleSheetPool::CreateLayoutStyleSheets(std::u16string_view rLayoutName, bool bCheck /*= sal_False*/ )
+{
+ const SfxStyleSearchBits nUsedMask = SfxStyleSearchBits::All & ~SfxStyleSearchBits::UserDefined;
+
+ bool bCreated = false;
+
+ SfxStyleSheetBase* pSheet = nullptr;
+
+ OUString aPrefix(OUString::Concat(rLayoutName) + SD_LT_SEPARATOR);
+
+ vcl::Font aLatinFont, aCJKFont, aCTLFont;
+
+ mpDoc->getDefaultFonts( aLatinFont, aCJKFont, aCTLFont );
+
+ // Font for title and outline
+ SvxFontItem aSvxFontItem( aLatinFont.GetFamilyType(), aLatinFont.GetFamilyName(), aLatinFont.GetStyleName(), aLatinFont.GetPitch(),
+ aLatinFont.GetCharSet(), EE_CHAR_FONTINFO );
+
+ SvxFontItem aSvxFontItemCJK( aCJKFont.GetFamilyType(), aCJKFont.GetFamilyName(), aCJKFont.GetStyleName(), aCJKFont.GetPitch(),
+ aCJKFont.GetCharSet(), EE_CHAR_FONTINFO_CJK );
+
+ SvxFontItem aSvxFontItemCTL( aCTLFont.GetFamilyType(), aCTLFont.GetFamilyName(), aCTLFont.GetStyleName(), aCTLFont.GetPitch(),
+ aCTLFont.GetCharSet(), EE_CHAR_FONTINFO_CTL );
+
+ vcl::Font aBulletFont( GetBulletFont() );
+
+ /**************************************************************************
+ * outline levels
+ **************************************************************************/
+ OUString aName(STR_LAYOUT_OUTLINE);
+ const OUString aHelpFile;
+
+ SvxLRSpaceItem aSvxLRSpaceItem( EE_PARA_LRSPACE );
+ SvxULSpaceItem aSvxULSpaceItem( EE_PARA_ULSPACE );
+
+ for( sal_Int32 nLevel = 1; nLevel < 10; nLevel++)
+ {
+ OUString aLevelName( aPrefix + aName + " " + OUString::number( nLevel ) ) ;
+
+ if (!Find(aLevelName, SfxStyleFamily::Page))
+ {
+ bCreated = true;
+ pSheet = &Make(aLevelName, SfxStyleFamily::Page,nUsedMask);
+ pSheet->SetHelpId( aHelpFile, HID_PSEUDOSHEET_OUTLINE + nLevel );
+
+ pSheet->SetParent( OUString() );
+
+ // attributing for level 1, the others levels inherit
+ if (nLevel == 1)
+ {
+ SfxItemSet& rSet = pSheet->GetItemSet();
+
+ rSet.Put(aSvxFontItem);
+ rSet.Put(aSvxFontItemCJK);
+ rSet.Put(aSvxFontItemCTL);
+ rSet.Put( SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC ) );
+ rSet.Put( SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CJK ) );
+ rSet.Put( SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CTL ) );
+ rSet.Put( SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
+ rSet.Put( SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CJK ) );
+ rSet.Put( SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CTL ) );
+ rSet.Put( SvxUnderlineItem(LINESTYLE_NONE, EE_CHAR_UNDERLINE ) );
+ rSet.Put( SvxOverlineItem(LINESTYLE_NONE, EE_CHAR_OVERLINE ) );
+ rSet.Put( SvxCrossedOutItem(STRIKEOUT_NONE, EE_CHAR_STRIKEOUT ) );
+ rSet.Put( SvxCaseMapItem(SvxCaseMap::NotMapped, EE_CHAR_CASEMAP ) );
+ rSet.Put( SvxShadowedItem(false, EE_CHAR_SHADOW ) );
+ rSet.Put( SvxContourItem(false, EE_CHAR_OUTLINE ) );
+ rSet.Put( SvxEmphasisMarkItem(FontEmphasisMark::NONE, EE_CHAR_EMPHASISMARK ) );
+ rSet.Put( SvxCharReliefItem(FontRelief::NONE, EE_CHAR_RELIEF) );
+ rSet.Put( SvxColorItem( COL_AUTO, EE_CHAR_COLOR) );
+ rSet.Put( SvxColorItem( COL_AUTO, EE_CHAR_BKGCOLOR ) );
+ rSet.Put( XLineStyleItem(css::drawing::LineStyle_NONE) );
+ rSet.Put( XFillStyleItem(drawing::FillStyle_NONE) );
+ rSet.Put( SdrTextFitToSizeTypeItem(drawing::TextFitToSizeType_AUTOFIT) );
+ rSet.Put( makeSdrTextAutoGrowHeightItem(false) );
+ // #i16874# enable kerning by default but only for new documents
+ rSet.Put( SvxAutoKernItem( true, EE_CHAR_PAIRKERNING ) );
+
+ vcl::Font f( GetBulletFont() );
+ PutNumBulletItem( pSheet, f );
+ }
+
+ sal_uLong nFontSize = 20;
+ sal_uInt16 nUpper = 100;
+
+ switch (nLevel)
+ {
+ case 1:
+ {
+ nFontSize = 32;
+ nUpper = 500;
+ }
+ break;
+
+ case 2:
+ {
+ nFontSize = 28;
+ nUpper = 400;
+ }
+ break;
+
+ case 3:
+ {
+ nFontSize = 24;
+ nUpper = 300;
+ }
+ break;
+
+ case 4:
+ {
+ nUpper = 200;
+ }
+ break;
+ }
+
+ // FontSize
+ nFontSize = static_cast<sal_uInt16>(convertPointToMm100(nFontSize));
+ SfxItemSet& rOutlineSet = pSheet->GetItemSet();
+ rOutlineSet.Put( SvxFontHeightItem( nFontSize, 100, EE_CHAR_FONTHEIGHT ) );
+ rOutlineSet.Put( SvxFontHeightItem( nFontSize, 100, EE_CHAR_FONTHEIGHT_CJK ) );
+ rOutlineSet.Put( SvxFontHeightItem( SdDrawDocument::convertFontHeightToCTL( nFontSize ), 100, EE_CHAR_FONTHEIGHT_CTL ) );
+
+ // Line distance (upwards). Stuff around here cleaned up in i35937
+ aSvxULSpaceItem.SetUpper(nUpper);
+ pSheet->GetItemSet().Put(aSvxULSpaceItem);
+ }
+ }
+
+ // if we created outline styles, we need to chain them
+ if( bCreated )
+ {
+ SfxStyleSheetBase* pParent = nullptr;
+ for (sal_Int32 nLevel = 1; nLevel < 10; nLevel++)
+ {
+ OUString aLevelName( aPrefix + aName + " " + OUString::number( nLevel ) );
+
+ pSheet = Find(aLevelName, SfxStyleFamily::Page);
+
+ DBG_ASSERT( pSheet, "missing layout style!");
+
+ if( pSheet )
+ {
+ if (pParent)
+ pSheet->SetParent(pParent->GetName());
+ pParent = pSheet;
+ }
+ }
+ }
+
+ /**************************************************************************
+ * Title
+ **************************************************************************/
+ aName = aPrefix + STR_LAYOUT_TITLE;
+
+ if (!Find(aName, SfxStyleFamily::Page))
+ {
+ bCreated = true;
+
+ pSheet = &Make(aName, SfxStyleFamily::Page,nUsedMask);
+ pSheet->SetHelpId( aHelpFile, HID_PSEUDOSHEET_TITLE );
+ pSheet->SetParent( OUString() );
+ SfxItemSet& rTitleSet = pSheet->GetItemSet();
+ rTitleSet.Put(XLineStyleItem(drawing::LineStyle_NONE));
+ rTitleSet.Put(XFillStyleItem(drawing::FillStyle_NONE));
+ rTitleSet.Put(aSvxFontItem);
+ rTitleSet.Put(aSvxFontItemCJK);
+ rTitleSet.Put(aSvxFontItemCTL);
+ rTitleSet.Put(SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC ) );
+ rTitleSet.Put(SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CJK ) );
+ rTitleSet.Put(SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CTL ) );
+ rTitleSet.Put(SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
+ rTitleSet.Put(SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CJK ) );
+ rTitleSet.Put(SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CTL ) );
+ rTitleSet.Put(SvxFontHeightItem( 1552, 100, EE_CHAR_FONTHEIGHT ) ); // 44 pt
+ rTitleSet.Put(SvxFontHeightItem( 1552, 100, EE_CHAR_FONTHEIGHT_CJK ) ); // 44 pt
+ rTitleSet.Put(SvxFontHeightItem( SdDrawDocument::convertFontHeightToCTL( 1552 ), 100, EE_CHAR_FONTHEIGHT_CTL ) ); // 44 pt
+ rTitleSet.Put(SvxUnderlineItem(LINESTYLE_NONE, EE_CHAR_UNDERLINE ));
+ rTitleSet.Put(SvxOverlineItem(LINESTYLE_NONE, EE_CHAR_OVERLINE ));
+ rTitleSet.Put(SvxCrossedOutItem(STRIKEOUT_NONE, EE_CHAR_STRIKEOUT ));
+ rTitleSet.Put(SvxCaseMapItem(SvxCaseMap::NotMapped, EE_CHAR_CASEMAP ));
+ rTitleSet.Put(SvxShadowedItem(false, EE_CHAR_SHADOW ));
+ rTitleSet.Put(SvxContourItem(false, EE_CHAR_OUTLINE ));
+ rTitleSet.Put( SvxEmphasisMarkItem(FontEmphasisMark::NONE, EE_CHAR_EMPHASISMARK ) );
+ rTitleSet.Put( SvxCharReliefItem(FontRelief::NONE, EE_CHAR_RELIEF ) );
+ rTitleSet.Put(SvxColorItem( COL_AUTO, EE_CHAR_COLOR ));
+ rTitleSet.Put(SvxColorItem( COL_AUTO, EE_CHAR_BKGCOLOR ));
+ rTitleSet.Put(SvxAdjustItem(SvxAdjust::Center, EE_PARA_JUST ));
+ rTitleSet.Put( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_CENTER ) );
+ // #i16874# enable kerning by default but only for new documents
+ rTitleSet.Put( SvxAutoKernItem( true, EE_CHAR_PAIRKERNING ) );
+
+ aBulletFont.SetFontSize(Size(0,1552)); // 44 pt
+ PutNumBulletItem( pSheet, aBulletFont );
+ }
+
+ /**************************************************************************
+ * Subtitle
+ **************************************************************************/
+ aName = aPrefix + STR_LAYOUT_SUBTITLE;
+
+ if (!Find(aName, SfxStyleFamily::Page))
+ {
+ bCreated = true;
+
+ pSheet = &Make(aName, SfxStyleFamily::Page,nUsedMask);
+ pSheet->SetHelpId( aHelpFile, HID_PSEUDOSHEET_SUBTITLE );
+ pSheet->SetParent( OUString() );
+ SfxItemSet& rSubtitleSet = pSheet->GetItemSet();
+ rSubtitleSet.Put(XLineStyleItem(drawing::LineStyle_NONE));
+ rSubtitleSet.Put(XFillStyleItem(drawing::FillStyle_NONE));
+ rSubtitleSet.Put(aSvxFontItem);
+ rSubtitleSet.Put(aSvxFontItemCJK);
+ rSubtitleSet.Put(aSvxFontItemCTL);
+ rSubtitleSet.Put(SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC ) );
+ rSubtitleSet.Put(SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CJK ) );
+ rSubtitleSet.Put(SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CTL ) );
+ rSubtitleSet.Put(SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
+ rSubtitleSet.Put(SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CJK ) );
+ rSubtitleSet.Put(SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CTL ) );
+ rSubtitleSet.Put( SvxFontHeightItem( 1129, 100, EE_CHAR_FONTHEIGHT ) ); // 32 pt
+ rSubtitleSet.Put( SvxFontHeightItem( 1129, 100, EE_CHAR_FONTHEIGHT_CJK ) ); // 32 pt
+ rSubtitleSet.Put( SvxFontHeightItem( SdDrawDocument::convertFontHeightToCTL( 1129 ), 100, EE_CHAR_FONTHEIGHT_CTL ) ); // 32 pt
+ rSubtitleSet.Put(SvxUnderlineItem(LINESTYLE_NONE, EE_CHAR_UNDERLINE ));
+ rSubtitleSet.Put(SvxOverlineItem(LINESTYLE_NONE, EE_CHAR_OVERLINE ));
+ rSubtitleSet.Put(SvxCrossedOutItem(STRIKEOUT_NONE, EE_CHAR_STRIKEOUT ));
+ rSubtitleSet.Put(SvxCaseMapItem(SvxCaseMap::NotMapped, EE_CHAR_CASEMAP ));
+ rSubtitleSet.Put(SvxShadowedItem(false, EE_CHAR_SHADOW ));
+ rSubtitleSet.Put(SvxContourItem(false, EE_CHAR_OUTLINE ));
+ rSubtitleSet.Put( SvxEmphasisMarkItem(FontEmphasisMark::NONE, EE_CHAR_EMPHASISMARK ) );
+ rSubtitleSet.Put( SvxCharReliefItem(FontRelief::NONE, EE_CHAR_RELIEF ) );
+ rSubtitleSet.Put(SvxColorItem( COL_AUTO, EE_CHAR_COLOR ));
+ rSubtitleSet.Put(SvxColorItem( COL_AUTO, EE_CHAR_BKGCOLOR ));
+ rSubtitleSet.Put(SvxAdjustItem(SvxAdjust::Center, EE_PARA_JUST ));
+ rSubtitleSet.Put( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_CENTER ) );
+ // #i16874# enable kerning by default but only for new documents
+ rSubtitleSet.Put( SvxAutoKernItem( true, EE_CHAR_PAIRKERNING ) );
+ aSvxLRSpaceItem.SetTextLeft(0);
+ rSubtitleSet.Put(aSvxLRSpaceItem);
+
+ vcl::Font aTmpFont( GetBulletFont() );
+ aTmpFont.SetFontSize(Size(0, 1129)); // 32 pt
+ PutNumBulletItem( pSheet, aTmpFont );
+ }
+
+ /**************************************************************************
+ * Notes
+ **************************************************************************/
+ aName = aPrefix + STR_LAYOUT_NOTES;
+
+ if (!Find(aName, SfxStyleFamily::Page))
+ {
+ bCreated = true;
+
+ pSheet = &Make(aName, SfxStyleFamily::Page,nUsedMask);
+ pSheet->SetHelpId( aHelpFile, HID_PSEUDOSHEET_NOTES );
+ pSheet->SetParent( OUString() );
+ SfxItemSet& rNotesSet = pSheet->GetItemSet();
+ rNotesSet.Put(XLineStyleItem(drawing::LineStyle_NONE));
+ rNotesSet.Put(XFillStyleItem(drawing::FillStyle_NONE));
+ rNotesSet.Put(aSvxFontItem);
+ rNotesSet.Put(aSvxFontItemCJK);
+ rNotesSet.Put(aSvxFontItemCTL);
+ rNotesSet.Put( SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC ) );
+ rNotesSet.Put( SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CJK ) );
+ rNotesSet.Put( SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CTL ) );
+ rNotesSet.Put( SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
+ rNotesSet.Put( SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CJK ) );
+ rNotesSet.Put( SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CTL ) );
+ rNotesSet.Put( SvxFontHeightItem( 705, 100, EE_CHAR_FONTHEIGHT ) ); // 20 pt
+ rNotesSet.Put( SvxFontHeightItem( 705, 100, EE_CHAR_FONTHEIGHT_CJK ) ); // 20 pt
+ rNotesSet.Put( SvxFontHeightItem( SdDrawDocument::convertFontHeightToCTL( 705 ), 100, EE_CHAR_FONTHEIGHT_CTL ) ); // 20 pt
+ rNotesSet.Put( SvxUnderlineItem(LINESTYLE_NONE, EE_CHAR_UNDERLINE ) );
+ rNotesSet.Put( SvxOverlineItem(LINESTYLE_NONE, EE_CHAR_OVERLINE ) );
+ rNotesSet.Put( SvxCrossedOutItem(STRIKEOUT_NONE, EE_CHAR_STRIKEOUT ) );
+ rNotesSet.Put( SvxCaseMapItem(SvxCaseMap::NotMapped, EE_CHAR_CASEMAP ) );
+ rNotesSet.Put( SvxShadowedItem(false, EE_CHAR_SHADOW ) );
+ rNotesSet.Put( SvxContourItem(false, EE_CHAR_OUTLINE ) );
+ rNotesSet.Put( SvxEmphasisMarkItem(FontEmphasisMark::NONE, EE_CHAR_EMPHASISMARK ) );
+ rNotesSet.Put( SvxCharReliefItem(FontRelief::NONE, EE_CHAR_RELIEF) );
+ rNotesSet.Put( SvxColorItem( COL_AUTO, EE_CHAR_COLOR ) );
+ rNotesSet.Put( SvxColorItem( COL_AUTO, EE_CHAR_BKGCOLOR ) );
+ rNotesSet.Put( SvxLRSpaceItem( 0, 0, 600, -600, EE_PARA_LRSPACE ) );
+ // #i16874# enable kerning by default but only for new documents
+ rNotesSet.Put( SvxAutoKernItem( true, EE_CHAR_PAIRKERNING ) );
+
+/* #i35937# */
+
+ }
+
+ /**************************************************************************
+ * Background objects
+ **************************************************************************/
+ aName = aPrefix + STR_LAYOUT_BACKGROUNDOBJECTS;
+
+ if (!Find(aName, SfxStyleFamily::Page))
+ {
+ bCreated = true;
+
+ pSheet = &Make(aName, SfxStyleFamily::Page,nUsedMask);
+ pSheet->SetHelpId( aHelpFile, HID_PSEUDOSHEET_BACKGROUNDOBJECTS );
+ pSheet->SetParent( OUString() );
+ SfxItemSet& rBackgroundObjectsSet = pSheet->GetItemSet();
+ rBackgroundObjectsSet.Put(makeSdrShadowItem(false));
+ rBackgroundObjectsSet.Put(makeSdrShadowColorItem(COL_GRAY));
+ rBackgroundObjectsSet.Put(makeSdrShadowXDistItem(200)); // 3 mm shadow distance
+ rBackgroundObjectsSet.Put(makeSdrShadowYDistItem(200));
+ // #i16874# enable kerning by default but only for new documents
+ rBackgroundObjectsSet.Put( SvxAutoKernItem( true, EE_CHAR_PAIRKERNING ) );
+ rBackgroundObjectsSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_BLOCK));
+ }
+
+ /**************************************************************************
+ * Background
+ **************************************************************************/
+ aName = aPrefix + STR_LAYOUT_BACKGROUND;
+
+ if (!Find(aName, SfxStyleFamily::Page))
+ {
+ bCreated = true;
+
+ pSheet = &Make(aName, SfxStyleFamily::Page,nUsedMask);
+ pSheet->SetHelpId( aHelpFile, HID_PSEUDOSHEET_BACKGROUND );
+ pSheet->SetParent( OUString() );
+ SfxItemSet& rBackgroundSet = pSheet->GetItemSet();
+ rBackgroundSet.Put(XLineStyleItem(drawing::LineStyle_NONE));
+ rBackgroundSet.Put(XFillStyleItem(drawing::FillStyle_NONE));
+ // #i16874# enable kerning by default but only for new documents
+ rBackgroundSet.Put( SvxAutoKernItem( true, EE_CHAR_PAIRKERNING ) );
+ }
+
+ DBG_ASSERT( !bCheck || !bCreated, "missing layout style sheets detected!" );
+}
+
+/*************************************************************************
+|*
+|* Copy graphic style sheets from source pool into this pool
+|*
+|* (rSourcePool can not be const since SfxStyleSheetPoolBase::Find isn't const)
+|*
+\************************************************************************/
+
+void SdStyleSheetPool::CopyGraphicSheets(SdStyleSheetPool& rSourcePool)
+{
+ CopySheets( rSourcePool, SfxStyleFamily::Para );
+}
+
+void SdStyleSheetPool::CopyCellSheets(SdStyleSheetPool& rSourcePool)
+{
+ CopySheets( rSourcePool, SfxStyleFamily::Frame );
+}
+
+void SdStyleSheetPool::CopyTableStyles(SdStyleSheetPool const & rSourcePool)
+{
+ Reference< XIndexAccess > xSource( rSourcePool.mxTableFamily, UNO_QUERY );
+ Reference< XNameContainer > xTarget( mxTableFamily, UNO_QUERY );
+ Reference< XSingleServiceFactory > xFactory( mxTableFamily, UNO_QUERY );
+
+ if( !(xSource.is() && xFactory.is() && mxTableFamily.is()) )
+ return;
+
+ for( sal_Int32 nIndex = 0; nIndex < xSource->getCount(); nIndex++ ) try
+ {
+ Reference< XStyle > xSourceTableStyle( xSource->getByIndex( nIndex ), UNO_QUERY );
+ if( xSourceTableStyle.is() )
+ {
+ Reference< XStyle > xNewTableStyle( xFactory->createInstance(), UNO_QUERY );
+ if( xNewTableStyle.is() )
+ {
+ Reference< XNameAccess> xSourceNames( xSourceTableStyle, UNO_QUERY_THROW );
+
+ const Sequence< OUString > aStyleNames( xSourceNames->getElementNames() );
+
+ Reference< XNameReplace > xTargetNames( xNewTableStyle, UNO_QUERY );
+
+ for( const OUString& aName : aStyleNames )
+ {
+ Reference< XStyle > xSourceStyle( xSourceNames->getByName( aName ), UNO_QUERY );
+ Reference< XStyle > xTargetStyle;
+ if( xSourceStyle.is() ) try
+ {
+ mxCellFamily->getByName( xSourceStyle->getName() ) >>= xTargetStyle;
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SdStyleSheetPool::CopyTableStyles()" );
+ }
+
+ if( xTargetStyle.is() )
+ xTargetNames->replaceByName( aName, Any( xTargetStyle ) );
+ }
+ }
+
+ OUString sName( xSourceTableStyle->getName() );
+ if( xTarget->hasByName( sName ) )
+ xTarget->replaceByName( sName, Any( xNewTableStyle ) );
+ else
+ xTarget->insertByName( sName, Any( xNewTableStyle ) );
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SdStyleSheetPool::CopyTableStyles()");
+ }
+}
+
+void SdStyleSheetPool::CopyCellSheets(SdStyleSheetPool& rSourcePool, StyleSheetCopyResultVector& rCreatedSheets)
+{
+ CopySheets( rSourcePool, SfxStyleFamily::Frame, rCreatedSheets );
+}
+
+void SdStyleSheetPool::RenameAndCopyGraphicSheets(SdStyleSheetPool& rSourcePool, StyleSheetCopyResultVector& rCreatedSheets, std::u16string_view rRenameSuffix)
+{
+ CopySheets( rSourcePool, SfxStyleFamily::Para, rCreatedSheets, rRenameSuffix );
+}
+
+void SdStyleSheetPool::CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily eFamily )
+{
+ StyleSheetCopyResultVector aTmpSheets;
+ CopySheets(rSourcePool, eFamily, aTmpSheets);
+}
+
+void SdStyleSheetPool::CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily eFamily, StyleSheetCopyResultVector& rCreatedSheets)
+{
+ CopySheets(rSourcePool, eFamily, rCreatedSheets, u"");
+}
+
+namespace
+{
+
+struct HasFamilyPredicate : svl::StyleSheetPredicate
+{
+ explicit HasFamilyPredicate(SfxStyleFamily eFamily)
+ : meFamily(eFamily) {}
+
+ bool Check(const SfxStyleSheetBase& sheet) override
+ {
+ return sheet.GetFamily() == meFamily;
+ }
+ SfxStyleFamily meFamily;
+};
+
+}
+
+void SdStyleSheetPool::CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily eFamily, StyleSheetCopyResultVector& rCreatedSheets, std::u16string_view rRenameSuffix)
+{
+ std::vector< std::pair< rtl::Reference< SfxStyleSheetBase >, OUString > > aNewStyles;
+ std::vector< std::pair< OUString, OUString > > aRenamedList;
+
+ // find all style sheets of the source pool which have the same family
+ HasFamilyPredicate aHasFamilyPredicate(eFamily);
+ std::vector<sal_Int32> aSheetsWithFamily = rSourcePool.GetIndexedStyleSheets().FindPositionsByPredicate(aHasFamilyPredicate);
+
+ for (const auto& rPos : aSheetsWithFamily)
+ {
+ SfxStyleSheetBase* pSheet = rSourcePool.GetStyleSheetByPositionInIndex( rPos );
+ if( !pSheet )
+ continue;
+ OUString aName( pSheet->GetName() );
+
+ // now check whether we already have a sheet with the same name
+ std::vector<sal_Int32> aSheetsWithName = GetIndexedStyleSheets().FindPositionsByName(aName);
+ bool bAddToList = false;
+ SfxStyleSheetBase * pExistingSheet = nullptr;
+ if (!aSheetsWithName.empty())
+ {
+ // if we have a rename suffix, try to find a new name
+ pExistingSheet =
+ GetStyleSheetByPositionInIndex(aSheetsWithName.front());
+ if (!rRenameSuffix.empty() &&
+ !pExistingSheet->GetItemSet().Equals(pSheet->GetItemSet(), false))
+ {
+ // we have found a sheet with the same name, but different contents. Try to find a new name.
+ // If we already have a sheet with the new name, and it is equal to the one in the source pool,
+ // do nothing.
+ OUString aTmpName = aName + rRenameSuffix;
+ sal_Int32 nSuffix = 1;
+ do
+ {
+ aTmpName = aName + rRenameSuffix + OUString::number(nSuffix);
+ pExistingSheet = Find(aTmpName, eFamily);
+ nSuffix++;
+ } while (pExistingSheet &&
+ !pExistingSheet->GetItemSet().Equals(pSheet->GetItemSet(), false));
+ aName = aTmpName;
+ bAddToList = true;
+ }
+ }
+ // we do not already have a sheet with the same name and contents. Create a new one.
+ if (!pExistingSheet)
+ {
+ assert(!Find(aName, eFamily));
+ rtl::Reference< SfxStyleSheetBase > xNewSheet( &Make( aName, eFamily ) );
+
+ xNewSheet->SetMask( pSheet->GetMask() );
+
+ // Also set parent relation for copied style sheets
+ OUString aParent( pSheet->GetParent() );
+ if( !aParent.isEmpty() )
+ aNewStyles.emplace_back( xNewSheet, aParent );
+
+ if( !bAddToList )
+ {
+ OUString aHelpFile;
+ xNewSheet->SetHelpId( aHelpFile, pSheet->GetHelpId( aHelpFile ) );
+ }
+ xNewSheet->GetItemSet().Put( pSheet->GetItemSet() );
+
+ rCreatedSheets.emplace_back(static_cast<SdStyleSheet*>(xNewSheet.get()), true);
+ aRenamedList.emplace_back( pSheet->GetName(), aName );
+ }
+ else if (bAddToList)
+ {
+ // Add to list - used for renaming
+ rCreatedSheets.emplace_back(static_cast<SdStyleSheet*>(pExistingSheet), false);
+ aRenamedList.emplace_back( pSheet->GetName(), aName );
+ }
+ }
+
+ // set parents on newly added stylesheets
+ for( auto& rStyle : aNewStyles )
+ {
+ if( !rRenameSuffix.empty() )
+ {
+ SfxStyleSheet *pParent = lcl_findStyle(rCreatedSheets, lcl_findRenamedStyleName(aRenamedList, rStyle.second));
+ if( pParent )
+ {
+ rStyle.first->SetParent( pParent->GetName() );
+ continue;
+ }
+ }
+ DBG_ASSERT( rSourcePool.Find( rStyle.second, eFamily ), "StyleSheet has invalid parent: Family mismatch" );
+ rStyle.first->SetParent( rStyle.second );
+ }
+ // we have changed names of style sheets. Trigger reindexing.
+ Reindex();
+}
+
+/*************************************************************************
+|*
+|* Copy style sheets of the named presentation layout from the source pool into
+|* this pool. Copies only the style sheets which aren't yet in this pool.
+|* If not NULL, pCreatedSheets is filled with pointers to the created style
+|* sheets.
+|*
+|* (rSourcePool can not be const since SfxStyleSheetPoolBase::Find isn't const)
+|*
+\************************************************************************/
+
+void SdStyleSheetPool::CopyLayoutSheets(std::u16string_view rLayoutName, SdStyleSheetPool& rSourcePool, StyleSheetCopyResultVector& rCreatedSheets)
+{
+ SfxStyleSheetBase* pSheet = nullptr;
+
+ std::vector<OUString> aNameList;
+ CreateLayoutSheetNames(rLayoutName,aNameList);
+
+ for (const auto& rName : aNameList)
+ {
+ pSheet = Find(rName, SfxStyleFamily::Page);
+ if (!pSheet)
+ {
+ SfxStyleSheetBase* pSourceSheet = rSourcePool.Find(rName, SfxStyleFamily::Page);
+ DBG_ASSERT(pSourceSheet, "CopyLayoutSheets: Style sheet missing");
+ if (pSourceSheet)
+ {
+ // In the case one comes with Methusalem-Docs.
+ SfxStyleSheetBase& rNewSheet = Make(rName, SfxStyleFamily::Page);
+ OUString file;
+ rNewSheet.SetHelpId( file, pSourceSheet->GetHelpId( file ) );
+ rNewSheet.GetItemSet().Put(pSourceSheet->GetItemSet());
+ rCreatedSheets.emplace_back(static_cast<SdStyleSheet*>(&rNewSheet), true);
+ }
+ }
+ }
+
+ // Special treatment for outline templates: create parent relation
+ std::vector<SfxStyleSheetBase*> aOutlineSheets;
+ CreateOutlineSheetList(rLayoutName,aOutlineSheets);
+
+ if( aOutlineSheets.empty() )
+ return;
+
+ std::vector<SfxStyleSheetBase*>::iterator it = aOutlineSheets.begin();
+ SfxStyleSheetBase* pParent = *it;
+ ++it;
+
+ while (it != aOutlineSheets.end())
+ {
+ pSheet = *it;
+
+ if (!pSheet)
+ break;
+
+ if (pSheet->GetParent().isEmpty())
+ pSheet->SetParent(pParent->GetName());
+
+ pParent = pSheet;
+
+ ++it;
+ }
+}
+
+/*************************************************************************
+|*
+|* Create list with names of the presentation templates of a layout.
+|* The list and the containing strings are owned by the caller!
+|*
+\************************************************************************/
+
+void SdStyleSheetPool::CreateLayoutSheetNames(std::u16string_view rLayoutName, std::vector<OUString> &aNameList)
+{
+ OUString aPrefix(OUString::Concat(rLayoutName) + SD_LT_SEPARATOR);
+
+ for (sal_Int32 nLevel = 1; nLevel < 10; nLevel++)
+ aNameList.emplace_back(aPrefix + STR_LAYOUT_OUTLINE + " " + OUString::number( nLevel ) );
+
+ aNameList.emplace_back(aPrefix + STR_LAYOUT_TITLE);
+ aNameList.emplace_back(aPrefix + STR_LAYOUT_SUBTITLE);
+ aNameList.emplace_back(aPrefix + STR_LAYOUT_NOTES);
+ aNameList.emplace_back(aPrefix + STR_LAYOUT_BACKGROUNDOBJECTS);
+ aNameList.emplace_back(aPrefix + STR_LAYOUT_BACKGROUND);
+}
+
+/*************************************************************************
+|*
+|* Create a list with pointer to presentation templates of a layout.
+|* The list is owned by the caller!
+|*
+\************************************************************************/
+
+void SdStyleSheetPool::CreateLayoutSheetList(std::u16string_view rLayoutName, SdStyleSheetVector& rLayoutSheets )
+{
+ OUString aLayoutNameWithSep(OUString::Concat(rLayoutName) + SD_LT_SEPARATOR);
+
+ SfxStyleSheetIterator aIter(this, SfxStyleFamily::Page);
+ SfxStyleSheetBase* pSheet = aIter.First();
+
+ while (pSheet)
+ {
+ if (pSheet->GetName().startsWith(aLayoutNameWithSep))
+ rLayoutSheets.emplace_back( static_cast< SdStyleSheet* >( pSheet ) );
+ pSheet = aIter.Next();
+ }
+}
+
+/*************************************************************************
+|*
+|* Create pseudo style sheets if necessary
+|*
+\************************************************************************/
+
+void SdStyleSheetPool::CreatePseudosIfNecessary()
+{
+ OUString aName;
+ const OUString aHelpFile;
+ SfxStyleSheetBase* pSheet = nullptr;
+ SfxStyleSheetBase* pParent = nullptr;
+
+ SfxStyleSearchBits nUsedMask = SfxStyleSearchBits::Used;
+
+ aName = SdResId(STR_PSEUDOSHEET_TITLE);
+ if( (pSheet = Find(aName, SfxStyleFamily::Pseudo)) == nullptr )
+ {
+ pSheet = &Make(aName, SfxStyleFamily::Pseudo, nUsedMask);
+ pSheet->SetParent( OUString() );
+ static_cast<SfxStyleSheet*>(pSheet)->StartListening(*this);
+ }
+ pSheet->SetHelpId( aHelpFile, HID_PSEUDOSHEET_TITLE );
+
+ aName = SdResId(STR_PSEUDOSHEET_SUBTITLE);
+ if( (pSheet = Find(aName, SfxStyleFamily::Pseudo)) == nullptr )
+ {
+ pSheet = &Make(aName, SfxStyleFamily::Pseudo, nUsedMask);
+ pSheet->SetParent( OUString() );
+ static_cast<SfxStyleSheet*>(pSheet)->StartListening(*this);
+ }
+ pSheet->SetHelpId( aHelpFile, HID_PSEUDOSHEET_SUBTITLE );
+
+ aName = SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS);
+ if( (pSheet = Find(aName, SfxStyleFamily::Pseudo)) == nullptr )
+ {
+ pSheet = &Make(aName, SfxStyleFamily::Pseudo, nUsedMask);
+ pSheet->SetParent( OUString() );
+ static_cast<SfxStyleSheet*>(pSheet)->StartListening(*this);
+ }
+ pSheet->SetHelpId( aHelpFile, HID_PSEUDOSHEET_BACKGROUNDOBJECTS );
+
+ aName = SdResId(STR_PSEUDOSHEET_BACKGROUND);
+ if( (pSheet = Find(aName, SfxStyleFamily::Pseudo)) == nullptr )
+ {
+ pSheet = &Make(aName, SfxStyleFamily::Pseudo, nUsedMask);
+ pSheet->SetParent( OUString() );
+ static_cast<SfxStyleSheet*>(pSheet)->StartListening(*this);
+ }
+ pSheet->SetHelpId( aHelpFile, HID_PSEUDOSHEET_BACKGROUND );
+
+ aName = SdResId(STR_PSEUDOSHEET_NOTES);
+ if( (pSheet = Find(aName, SfxStyleFamily::Pseudo)) == nullptr )
+ {
+ pSheet = &Make(aName, SfxStyleFamily::Pseudo, nUsedMask);
+ pSheet->SetParent( OUString() );
+ static_cast<SfxStyleSheet*>(pSheet)->StartListening(*this);
+ }
+ pSheet->SetHelpId( aHelpFile, HID_PSEUDOSHEET_NOTES );
+
+ pParent = nullptr;
+ aName = SdResId(STR_PSEUDOSHEET_OUTLINE);
+ for (sal_Int32 nLevel = 1; nLevel < 10; nLevel++)
+ {
+ OUString aLevelName( aName + " " + OUString::number( nLevel ) );
+
+ if( (pSheet = Find(aLevelName, SfxStyleFamily::Pseudo)) == nullptr )
+ {
+ pSheet = &Make(aLevelName, SfxStyleFamily::Pseudo, nUsedMask);
+
+ if (pParent)
+ pSheet->SetParent(pParent->GetName());
+ pParent = pSheet;
+ static_cast<SfxStyleSheet*>(pSheet)->StartListening(*this);
+ }
+ pSheet->SetHelpId( aHelpFile, HID_PSEUDOSHEET_OUTLINE + nLevel );
+ }
+}
+
+/*************************************************************************
+|*
+|* Set the correct name in the program language to the standard styles
+|*
+\************************************************************************/
+
+namespace
+{
+struct StyleSheetIsUserDefinedPredicate : svl::StyleSheetPredicate
+{
+ StyleSheetIsUserDefinedPredicate()
+ {}
+
+ bool Check(const SfxStyleSheetBase& sheet) override
+ {
+ return sheet.IsUserDefined();
+ }
+};
+}
+
+void SdStyleSheetPool::UpdateStdNames()
+{
+ OUString aHelpFile;
+ StyleSheetIsUserDefinedPredicate aPredicate;
+ std::vector<SfxStyleSheetBase*> aEraseList;
+ std::vector<sal_Int32> aUserDefinedStyles = GetIndexedStyleSheets().FindPositionsByPredicate(aPredicate);
+ for (const auto& rStyle : aUserDefinedStyles)
+ {
+ SfxStyleSheetBase* pStyle = GetStyleSheetByPositionInIndex(rStyle);
+
+ if( !pStyle->IsUserDefined() )
+ {
+ OUString aOldName = pStyle->GetName();
+ sal_uLong nHelpId = pStyle->GetHelpId( aHelpFile );
+ SfxStyleFamily eFam = pStyle->GetFamily();
+
+ bool bHelpKnown = true;
+ TranslateId pNameId;
+ switch( nHelpId )
+ {
+ case HID_STANDARD_STYLESHEET_NAME: pNameId = STR_STANDARD_STYLESHEET_NAME; break;
+ case HID_POOLSHEET_OBJWITHOUTFILL: pNameId = STR_POOLSHEET_OBJWITHOUTFILL; break;
+ case HID_POOLSHEET_OBJNOLINENOFILL: pNameId = STR_POOLSHEET_OBJNOLINENOFILL;break;
+ case HID_POOLSHEET_TEXT: pNameId = STR_POOLSHEET_TEXT; break;
+ case HID_POOLSHEET_A4: pNameId = STR_POOLSHEET_A4; break;
+ case HID_POOLSHEET_A4_TITLE: pNameId = STR_POOLSHEET_A4_TITLE; break;
+ case HID_POOLSHEET_A4_HEADLINE: pNameId = STR_POOLSHEET_A4_HEADLINE; break;
+ case HID_POOLSHEET_A4_TEXT: pNameId = STR_POOLSHEET_A4_TEXT; break;
+ case HID_POOLSHEET_A0: pNameId = STR_POOLSHEET_A0; break;
+ case HID_POOLSHEET_A0_TITLE: pNameId = STR_POOLSHEET_A0_TITLE; break;
+ case HID_POOLSHEET_A0_HEADLINE: pNameId = STR_POOLSHEET_A0_HEADLINE; break;
+ case HID_POOLSHEET_A0_TEXT: pNameId = STR_POOLSHEET_A0_TEXT; break;
+ case HID_POOLSHEET_GRAPHIC: pNameId = STR_POOLSHEET_GRAPHIC; break;
+ case HID_POOLSHEET_SHAPES: pNameId = STR_POOLSHEET_SHAPES; break;
+ case HID_POOLSHEET_FILLED: pNameId = STR_POOLSHEET_FILLED; break;
+ case HID_POOLSHEET_FILLED_BLUE: pNameId = STR_POOLSHEET_FILLED_BLUE; break;
+ case HID_POOLSHEET_FILLED_GREEN: pNameId = STR_POOLSHEET_FILLED_GREEN; break;
+ case HID_POOLSHEET_FILLED_RED: pNameId = STR_POOLSHEET_FILLED_RED; break;
+ case HID_POOLSHEET_FILLED_YELLOW: pNameId = STR_POOLSHEET_FILLED_YELLOW; break;
+ case HID_POOLSHEET_OUTLINE: pNameId = STR_POOLSHEET_OUTLINE; break;
+ case HID_POOLSHEET_OUTLINE_BLUE: pNameId = STR_POOLSHEET_OUTLINE_BLUE; break;
+ case HID_POOLSHEET_OUTLINE_GREEN: pNameId = STR_POOLSHEET_OUTLINE_GREEN; break;
+ case HID_POOLSHEET_OUTLINE_RED: pNameId = STR_POOLSHEET_OUTLINE_RED; break;
+ case HID_POOLSHEET_OUTLINE_YELLOW: pNameId = STR_POOLSHEET_OUTLINE_YELLOW; break;
+ case HID_POOLSHEET_LINES: pNameId = STR_POOLSHEET_LINES; break;
+ case HID_POOLSHEET_MEASURE: pNameId = STR_POOLSHEET_MEASURE; break;
+ case HID_POOLSHEET_LINES_DASHED: pNameId = STR_POOLSHEET_LINES_DASHED; break;
+
+ case HID_PSEUDOSHEET_OUTLINE1:
+ case HID_PSEUDOSHEET_OUTLINE2:
+ case HID_PSEUDOSHEET_OUTLINE3:
+ case HID_PSEUDOSHEET_OUTLINE4:
+ case HID_PSEUDOSHEET_OUTLINE5:
+ case HID_PSEUDOSHEET_OUTLINE6:
+ case HID_PSEUDOSHEET_OUTLINE7:
+ case HID_PSEUDOSHEET_OUTLINE8:
+ case HID_PSEUDOSHEET_OUTLINE9: pNameId = STR_PSEUDOSHEET_OUTLINE; break;
+ case HID_PSEUDOSHEET_BACKGROUNDOBJECTS: pNameId = STR_PSEUDOSHEET_BACKGROUNDOBJECTS; break;
+ case HID_PSEUDOSHEET_BACKGROUND: pNameId = STR_PSEUDOSHEET_BACKGROUND; break;
+ case HID_PSEUDOSHEET_NOTES: pNameId = STR_PSEUDOSHEET_NOTES; break;
+
+ case HID_SD_CELL_STYLE_DEFAULT: pNameId = STR_STANDARD_STYLESHEET_NAME; break;
+ case HID_SD_CELL_STYLE_BANDED: pNameId = STR_POOLSHEET_BANDED_CELL; break;
+ case HID_SD_CELL_STYLE_HEADER: pNameId = STR_POOLSHEET_HEADER; break;
+ case HID_SD_CELL_STYLE_TOTAL: pNameId = STR_POOLSHEET_TOTAL; break;
+ case HID_SD_CELL_STYLE_FIRST_COLUMN: pNameId = STR_POOLSHEET_FIRST_COLUMN; break;
+ case HID_SD_CELL_STYLE_LAST_COLUMN: pNameId = STR_POOLSHEET_LAST_COLUMN; break;
+
+ default:
+ // 0 or wrong (old) HelpId
+ bHelpKnown = false;
+ }
+ if( bHelpKnown )
+ {
+ OUString aNewName;
+ if (pNameId)
+ {
+ if (pNameId == STR_PSEUDOSHEET_OUTLINE)
+ {
+ aNewName += " " + OUString::number( sal_Int32( nHelpId - HID_PSEUDOSHEET_OUTLINE ) );
+ }
+ }
+
+ if( !aNewName.isEmpty() && aNewName != aOldName )
+ {
+ SfxStyleSheetBase* pSheetFound = Find( aNewName, eFam );
+
+ if ( !pSheetFound )
+ {
+ // Sheet does not yet exist: rename old sheet
+ pStyle->SetName( aNewName ); // transform also parents
+ }
+ else
+ {
+ // Sheet does exist: old sheet has to be removed
+ aEraseList.push_back( pStyle );
+ }
+ }
+ }
+ }
+ }
+
+ if (!aEraseList.empty())
+ {
+ // styles that could not be renamed, must be removed
+ for (SfxStyleSheetBase* p : aEraseList)
+ Remove( p );
+ Reindex();
+ }
+}
+
+void SdStyleSheetPool::setDefaultOutlineNumberFormatBulletAndIndent(sal_uInt16 i, SvxNumberFormat &rNumberFormat)
+{
+ rNumberFormat.SetBulletChar( 0x25CF ); // StarBats: 0xF000 + 34
+ rNumberFormat.SetBulletRelSize(45);
+ const auto nLSpace = (i + 1) * 1200;
+ rNumberFormat.SetAbsLSpace(nLSpace);
+ sal_Int32 nFirstLineOffset = -600;
+
+ switch(i)
+ {
+ case 0:
+ {
+ nFirstLineOffset = -900;
+ }
+ break;
+
+ case 1:
+ {
+ rNumberFormat.SetBulletChar( 0x2013 ); // StarBats: 0xF000 + 150
+ rNumberFormat.SetBulletRelSize(75);
+ nFirstLineOffset = -900;
+ }
+ break;
+
+ case 2:
+ {
+ nFirstLineOffset = -800;
+ }
+ break;
+
+ case 3:
+ {
+ rNumberFormat.SetBulletChar( 0x2013 ); // StarBats: 0xF000 + 150
+ rNumberFormat.SetBulletRelSize(75);
+ }
+ break;
+ }
+
+ rNumberFormat.SetFirstLineOffset(nFirstLineOffset);
+}
+
+// Set new SvxNumBulletItem for the respective style sheet
+void SdStyleSheetPool::PutNumBulletItem( SfxStyleSheetBase* pSheet,
+ vcl::Font& rBulletFont )
+{
+ OUString aHelpFile;
+ sal_uLong nHelpId = pSheet->GetHelpId( aHelpFile );
+ SfxItemSet& rSet = pSheet->GetItemSet();
+
+ switch ( nHelpId )
+ {
+ case HID_STANDARD_STYLESHEET_NAME :
+ {
+ // Standard template
+ SvxNumberFormat aNumberFormat(SVX_NUM_CHAR_SPECIAL);
+ aNumberFormat.SetBulletFont(&rBulletFont);
+ aNumberFormat.SetBulletChar( 0x25CF ); // StarBats: 0xF000 + 34
+ aNumberFormat.SetBulletRelSize(45);
+ aNumberFormat.SetBulletColor(COL_AUTO);
+ aNumberFormat.SetStart(1);
+ aNumberFormat.SetNumAdjust(SvxAdjust::Left);
+
+ SvxNumRule aNumRule( SvxNumRuleFlags::BULLET_REL_SIZE | SvxNumRuleFlags::BULLET_COLOR, SVX_MAX_NUM, false);
+
+ for( sal_uInt16 i = 0; i < aNumRule.GetLevelCount(); i++ )
+ {
+ const auto nLSpace = (i + 1) * 600;
+ aNumberFormat.SetAbsLSpace(nLSpace);
+ aNumberFormat.SetFirstLineOffset(-600);
+ aNumRule.SetLevel( i, aNumberFormat );
+ }
+
+ rSet.Put( SvxNumBulletItem( std::move(aNumRule), EE_PARA_NUMBULLET ) );
+ static_cast<SfxStyleSheet*>(pSheet)->Broadcast(SfxHint( SfxHintId::DataChanged ) );
+ }
+ break;
+
+ case HID_PSEUDOSHEET_TITLE:
+ /* title gets same bullet as subtitle and not that page symbol anymore */
+ case HID_PSEUDOSHEET_SUBTITLE :
+ {
+ // Subtitle template
+ SvxNumBulletItem const*const pItem(
+ rSet.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET));
+ const SvxNumRule *const pDefaultRule = pItem ? &pItem->GetNumRule() : nullptr;
+ DBG_ASSERT( pDefaultRule, "Where is my default template? [CL]" );
+
+ if(pDefaultRule)
+ {
+ SvxNumRule aNumRule(pDefaultRule->GetFeatureFlags(), 10, false);
+ for(sal_uInt16 i=0; i < aNumRule.GetLevelCount(); i++)
+ {
+ SvxNumberFormat aFrmt( pDefaultRule->GetLevel(i) );
+ aFrmt.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
+ // #i93908# clear suffix for bullet lists
+ aFrmt.SetPrefix(OUString());
+ aFrmt.SetSuffix(OUString());
+ aFrmt.SetStart(1);
+ aFrmt.SetBulletRelSize(45);
+ aFrmt.SetBulletChar( 0x25CF ); // StarBats: 0xF000 + 34
+ aFrmt.SetBulletFont(&rBulletFont);
+ aNumRule.SetLevel(i, aFrmt);
+ }
+
+ rSet.Put( SvxNumBulletItem( std::move(aNumRule), EE_PARA_NUMBULLET ) );
+ static_cast<SfxStyleSheet*>(pSheet)->Broadcast(SfxHint( SfxHintId::DataChanged ) );
+ }
+ }
+ break;
+
+ case HID_PSEUDOSHEET_OUTLINE + 1 :
+ {
+ // Outline template
+ SvxNumberFormat aNumberFormat(SVX_NUM_CHAR_SPECIAL);
+ aNumberFormat.SetBulletColor(COL_AUTO);
+ aNumberFormat.SetStart(1);
+ aNumberFormat.SetNumAdjust(SvxAdjust::Left);
+
+ SvxNumRule aNumRule( SvxNumRuleFlags::BULLET_REL_SIZE | SvxNumRuleFlags::BULLET_COLOR,
+ SVX_MAX_NUM, false );
+ for( sal_uInt16 i = 0; i < aNumRule.GetLevelCount(); i++ )
+ {
+ setDefaultOutlineNumberFormatBulletAndIndent(i, aNumberFormat);
+ rBulletFont.SetFontSize(Size(0,846)); // 24 pt
+ aNumberFormat.SetBulletFont(&rBulletFont);
+ aNumRule.SetLevel( i, aNumberFormat );
+ }
+
+ rSet.Put( SvxNumBulletItem( std::move(aNumRule), EE_PARA_NUMBULLET ) );
+ static_cast<SfxStyleSheet*>(pSheet)->Broadcast(SfxHint( SfxHintId::DataChanged ) );
+ }
+ break;
+ }
+}
+
+/*************************************************************************
+|*
+|* Create standard bullet font (without size)
+|*
+\************************************************************************/
+
+vcl::Font SdStyleSheetPool::GetBulletFont()
+{
+ vcl::Font aBulletFont( "StarSymbol", Size(0, 1000) );
+ aBulletFont.SetCharSet(RTL_TEXTENCODING_UNICODE);
+ aBulletFont.SetWeight(WEIGHT_NORMAL);
+ aBulletFont.SetUnderline(LINESTYLE_NONE);
+ aBulletFont.SetOverline(LINESTYLE_NONE);
+ aBulletFont.SetStrikeout(STRIKEOUT_NONE);
+ aBulletFont.SetItalic(ITALIC_NONE);
+ aBulletFont.SetOutline(false);
+ aBulletFont.SetShadow(false);
+ aBulletFont.SetColor(COL_AUTO);
+ aBulletFont.SetTransparent(true);
+
+ return aBulletFont;
+}
+
+void SdStyleSheetPool::AddStyleFamily( const SdPage* pPage )
+{
+ rtl::Reference< SfxStyleSheetPool > xPool( this );
+ maStyleFamilyMap[pPage] = new SdStyleFamily( xPool, pPage );
+}
+
+void SdStyleSheetPool::RemoveStyleFamily( const SdPage* pPage )
+{
+ SdStyleFamilyMap::iterator iter( maStyleFamilyMap.find( pPage ) );
+ if( iter == maStyleFamilyMap.end() )
+ return;
+
+ SdStyleFamilyRef xStyle( (*iter).second );
+ maStyleFamilyMap.erase( iter );
+
+ if( xStyle.is() ) try
+ {
+ xStyle->dispose();
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+void SdStyleSheetPool::throwIfDisposed()
+{
+ if( mpDoc == nullptr )
+ throw DisposedException();
+}
+
+// XServiceInfo
+OUString SAL_CALL SdStyleSheetPool::getImplementationName()
+{
+ return "SdStyleSheetPool";
+}
+
+sal_Bool SAL_CALL SdStyleSheetPool::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+Sequence< OUString > SAL_CALL SdStyleSheetPool::getSupportedServiceNames()
+{
+ return { "com.sun.star.style.StyleFamilies" };
+}
+
+// XNameAccess
+Any SAL_CALL SdStyleSheetPool::getByName( const OUString& aName )
+{
+ throwIfDisposed();
+
+ if( mxGraphicFamily->getName() == aName )
+ return Any( Reference< XNameAccess >( static_cast< XNameAccess* >( mxGraphicFamily.get() ) ) );
+
+ if( mxCellFamily->getName() == aName )
+ return Any( Reference< XNameAccess >( static_cast< XNameAccess* >( mxCellFamily.get() ) ) );
+
+ if( msTableFamilyName == aName )
+ return Any( mxTableFamily );
+
+ auto iter = std::find_if(maStyleFamilyMap.begin(), maStyleFamilyMap.end(),
+ [&aName](const SdStyleFamilyMap::value_type& rEntry) { return rEntry.second->getName() == aName; });
+ if (iter != maStyleFamilyMap.end())
+ return Any( Reference< XNameAccess >( static_cast< XNameAccess* >( (*iter).second.get() ) ) );
+
+ throw NoSuchElementException();
+}
+
+Sequence< OUString > SAL_CALL SdStyleSheetPool::getElementNames()
+{
+ throwIfDisposed();
+
+ Sequence< OUString > aNames( maStyleFamilyMap.size() + 3 );
+ OUString* pNames = aNames.getArray();
+
+ *pNames++ = mxGraphicFamily->getName();
+ *pNames++ = mxCellFamily->getName();
+ *pNames++ = msTableFamilyName;
+
+ for( const auto& rEntry : maStyleFamilyMap )
+ {
+ *pNames++ = rEntry.second->getName();
+ }
+
+ return aNames;
+}
+
+sal_Bool SAL_CALL SdStyleSheetPool::hasByName( const OUString& aName )
+{
+ throwIfDisposed();
+
+ if( mxGraphicFamily->getName() == aName )
+ return true;
+
+ if( mxCellFamily->getName() == aName )
+ return true;
+
+ if( msTableFamilyName == aName )
+ return true;
+
+ return std::any_of(maStyleFamilyMap.begin(), maStyleFamilyMap.end(),
+ [&aName](const SdStyleFamilyMap::value_type& rEntry) { return rEntry.second->getName() == aName; });
+}
+
+// XElementAccess
+
+Type SAL_CALL SdStyleSheetPool::getElementType()
+{
+ throwIfDisposed();
+
+ return cppu::UnoType<XNameAccess>::get();
+}
+
+sal_Bool SAL_CALL SdStyleSheetPool::hasElements()
+{
+ return true;
+}
+
+// XIndexAccess
+
+sal_Int32 SAL_CALL SdStyleSheetPool::getCount()
+{
+ throwIfDisposed();
+
+ return maStyleFamilyMap.size() + 3;
+}
+
+Any SAL_CALL SdStyleSheetPool::getByIndex( sal_Int32 Index )
+{
+ switch( Index )
+ {
+ case 0:
+ return Any( Reference< XNameAccess >( static_cast< XNameAccess* >( mxGraphicFamily.get() ) ) );
+
+ case 1:
+ return Any( Reference< XNameAccess >( static_cast< XNameAccess* >( mxCellFamily.get() ) ) );
+
+ case 2:
+ return Any( mxTableFamily );
+
+ default:
+ {
+ Index -= 3;
+ if( (Index < 0) || (Index >= sal::static_int_cast<sal_Int32>(maStyleFamilyMap.size())) )
+ throw IndexOutOfBoundsException();
+ SdStyleFamilyMap::iterator iter( maStyleFamilyMap.begin() );
+ std::advance(iter, Index);
+
+ return Any( Reference< XNameAccess >( static_cast< XNameAccess* >( (*iter).second.get() ) ) );
+ }
+ }
+}
+
+// XComponent
+
+void SAL_CALL SdStyleSheetPool::dispose()
+{
+ if( !mpDoc )
+ return;
+
+ mxGraphicFamily->dispose();
+ mxGraphicFamily.clear();
+ mxCellFamily->dispose();
+ mxCellFamily.clear();
+
+ Reference< XComponent > xComp( mxTableFamily, UNO_QUERY );
+ if( xComp.is() )
+ xComp->dispose();
+ mxTableFamily = nullptr;
+
+ SdStyleFamilyMap aTempMap;
+ aTempMap.swap( maStyleFamilyMap );
+
+ for( auto& rEntry : aTempMap ) try
+ {
+ rEntry.second->dispose();
+ }
+ catch( Exception& )
+ {
+ }
+
+ mpDoc = nullptr;
+
+ Clear();
+}
+
+void SAL_CALL SdStyleSheetPool::addEventListener( const Reference< XEventListener >& /*xListener*/ )
+{
+}
+
+void SAL_CALL SdStyleSheetPool::removeEventListener( const Reference< XEventListener >& /*aListener*/ )
+{
+}
+
+SdStyleSheetVector SdStyleSheetPool::CreateChildList( SdStyleSheet const * pSheet )
+{
+ SdStyleSheetVector aResult;
+
+ const size_t nListenerCount = pSheet->GetSizeOfVector();
+ for (size_t n = 0; n < nListenerCount; ++n)
+ {
+ SdStyleSheet* pChild = dynamic_cast< SdStyleSheet* >( pSheet->GetListener(n) );
+ if(pChild && pChild->GetParent() == pSheet->GetName())
+ {
+ aResult.emplace_back( pChild );
+ }
+ }
+
+ return aResult;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/stlsheet.cxx b/sd/source/core/stlsheet.cxx
new file mode 100644
index 000000000..db061922b
--- /dev/null
+++ b/sd/source/core/stlsheet.cxx
@@ -0,0 +1,1459 @@
+/* -*- 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 <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
+#include <com/sun/star/style/XStyle.hpp>
+#include <com/sun/star/table/BorderLine.hpp>
+#include <com/sun/star/text/XTextColumns.hpp>
+
+#include <o3tl/string_view.hxx>
+#include <osl/mutex.hxx>
+#include <vcl/svapp.hxx>
+#include <cppuhelper/exc_hlp.hxx>
+#include <cppuhelper/supportsservice.hxx>
+
+#include <editeng/eeitem.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/ulspitem.hxx>
+#include <svl/hint.hxx>
+#include <svl/intitem.hxx>
+#include <svl/itemset.hxx>
+
+#include <svx/xflbmtit.hxx>
+#include <svx/xflbstit.hxx>
+#include <editeng/bulletitem.hxx>
+#include <editeng/lrspitem.hxx>
+#include <svx/unoshprp.hxx>
+#include <svx/unoshape.hxx>
+#include <svx/svdpool.hxx>
+#include <svx/sdmetitm.hxx>
+#include <svx/sdtaaitm.hxx>
+#include <svx/sdtacitm.hxx>
+#include <svx/sdtayitm.hxx>
+#include <svx/sdtaiitm.hxx>
+#include <svx/xit.hxx>
+#include <svx/xflclit.hxx>
+#include <tools/diagnose_ex.h>
+#include <stlsheet.hxx>
+#include <sdresid.hxx>
+#include <sdpage.hxx>
+#include <drawdoc.hxx>
+#include <stlpool.hxx>
+#include <strings.hrc>
+#include <app.hrc>
+#include <strings.hxx>
+#include <glob.hxx>
+#include <DrawViewShell.hxx>
+#include <ViewShellBase.hxx>
+
+#include <cstddef>
+#include <memory>
+#include <string_view>
+
+using ::osl::MutexGuard;
+using ::osl::ClearableMutexGuard;
+using ::com::sun::star::table::BorderLine;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::style;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::drawing;
+
+#define WID_STYLE_HIDDEN 7997
+#define WID_STYLE_DISPNAME 7998
+#define WID_STYLE_FAMILY 7999
+
+static SvxItemPropertySet& GetStylePropertySet()
+{
+ static const SfxItemPropertyMapEntry aFullPropertyMap_Impl[] =
+ {
+ { u"Family", WID_STYLE_FAMILY, ::cppu::UnoType<OUString>::get(), PropertyAttribute::READONLY, 0},
+ { u"UserDefinedAttributes", SDRATTR_XMLATTRIBUTES, cppu::UnoType<XNameContainer>::get(), 0, 0},
+ { u"DisplayName", WID_STYLE_DISPNAME, ::cppu::UnoType<OUString>::get(), PropertyAttribute::READONLY, 0},
+ { u"Hidden", WID_STYLE_HIDDEN, cppu::UnoType<bool>::get(), 0, 0},
+
+ SVX_UNOEDIT_NUMBERING_PROPERTY,
+ SHADOW_PROPERTIES
+ LINE_PROPERTIES
+ LINE_PROPERTIES_START_END
+ FILL_PROPERTIES
+ EDGERADIUS_PROPERTIES
+ TEXT_PROPERTIES_DEFAULTS
+ CONNECTOR_PROPERTIES
+ SPECIAL_DIMENSIONING_PROPERTIES_DEFAULTS
+ { u"TopBorder", SDRATTR_TABLE_BORDER, ::cppu::UnoType<BorderLine>::get(), 0, TOP_BORDER },
+ { u"BottomBorder", SDRATTR_TABLE_BORDER, ::cppu::UnoType<BorderLine>::get(), 0, BOTTOM_BORDER },
+ { u"LeftBorder", SDRATTR_TABLE_BORDER, ::cppu::UnoType<BorderLine>::get(), 0, LEFT_BORDER },
+ { u"RightBorder", SDRATTR_TABLE_BORDER, ::cppu::UnoType<BorderLine>::get(), 0, RIGHT_BORDER },
+ { u"", 0, css::uno::Type(), 0, 0 }
+ };
+
+ static SvxItemPropertySet aPropSet( aFullPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
+ return aPropSet;
+}
+
+class ModifyListenerForwarder : public SfxListener
+{
+public:
+ explicit ModifyListenerForwarder( SdStyleSheet* pStyleSheet );
+
+ virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
+
+private:
+ SdStyleSheet* mpStyleSheet;
+};
+
+ModifyListenerForwarder::ModifyListenerForwarder( SdStyleSheet* pStyleSheet )
+: mpStyleSheet( pStyleSheet )
+{
+ if( pStyleSheet )
+ {
+ SfxBroadcaster& rBC = static_cast< SfxBroadcaster& >( *pStyleSheet );
+ StartListening( rBC );
+ }
+}
+
+void ModifyListenerForwarder::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& /*rHint*/)
+{
+ if( mpStyleSheet )
+ mpStyleSheet->notifyModifyListener();
+}
+
+SdStyleSheet::SdStyleSheet(const OUString& rDisplayName, SfxStyleSheetBasePool& _rPool, SfxStyleFamily eFamily, SfxStyleSearchBits _nMask)
+: SdStyleSheetBase( rDisplayName, _rPool, eFamily, _nMask)
+, ::cppu::BaseMutex()
+, msApiName( rDisplayName )
+, mxPool( &_rPool )
+, mrBHelper( m_aMutex )
+{
+}
+
+SdStyleSheet::~SdStyleSheet()
+{
+ delete pSet;
+ pSet = nullptr; // that following destructors also get a change
+}
+
+void SdStyleSheet::SetApiName( const OUString& rApiName )
+{
+ msApiName = rApiName;
+}
+
+OUString const & SdStyleSheet::GetApiName() const
+{
+ if( !msApiName.isEmpty() )
+ return msApiName;
+ else
+ return GetName();
+}
+
+bool SdStyleSheet::SetParent(const OUString& rParentName)
+{
+ bool bResult = false;
+
+ if (SfxStyleSheet::SetParent(rParentName))
+ {
+ // PseudoStyleSheets do not have their own ItemSets
+ if (nFamily != SfxStyleFamily::Pseudo)
+ {
+ if( !rParentName.isEmpty() )
+ {
+ SfxStyleSheetBase* pStyle = m_pPool->Find(rParentName, nFamily);
+ if (pStyle)
+ {
+ bResult = true;
+ SfxItemSet& rParentSet = pStyle->GetItemSet();
+ GetItemSet().SetParent(&rParentSet);
+ Broadcast( SfxHint( SfxHintId::DataChanged ) );
+ }
+ }
+ else
+ {
+ bResult = true;
+ GetItemSet().SetParent(nullptr);
+ Broadcast( SfxHint( SfxHintId::DataChanged ) );
+ }
+ }
+ else
+ {
+ bResult = true;
+ }
+ }
+ return bResult;
+}
+
+/**
+ * create if necessary and return ItemSets
+ */
+SfxItemSet& SdStyleSheet::GetItemSet()
+{
+ if (nFamily == SfxStyleFamily::Para || nFamily == SfxStyleFamily::Page)
+ {
+ // we create the ItemSet 'on demand' if necessary
+ if (!pSet)
+ {
+ pSet = new SfxItemSetFixed<
+ XATTR_LINE_FIRST, XATTR_LINE_LAST,
+ XATTR_FILL_FIRST, XATTR_FILL_LAST,
+ SDRATTR_SHADOW_FIRST, SDRATTR_SHADOW_LAST,
+ SDRATTR_TEXT_MINFRAMEHEIGHT, SDRATTR_TEXT_WORDWRAP,
+ SDRATTR_EDGE_FIRST, SDRATTR_MEASURE_LAST,
+ SDRATTR_3D_FIRST, SDRATTR_3D_LAST,
+ EE_PARA_START, EE_CHAR_END>(GetPool()->GetPool());
+ bMySet = true;
+ }
+
+ return *pSet;
+ }
+
+ else if( nFamily == SfxStyleFamily::Frame )
+ {
+ if (!pSet)
+ {
+ pSet = new SfxItemSetFixed<
+ XATTR_LINE_FIRST, XATTR_LINE_LAST,
+ XATTR_FILL_FIRST, XATTR_FILL_LAST,
+ SDRATTR_SHADOW_FIRST, SDRATTR_SHADOW_LAST,
+ SDRATTR_TEXT_MINFRAMEHEIGHT, SDRATTR_XMLATTRIBUTES,
+ SDRATTR_TEXT_WORDWRAP, SDRATTR_TEXT_WORDWRAP,
+ SDRATTR_TABLE_FIRST, SDRATTR_TABLE_LAST,
+ EE_PARA_START, EE_CHAR_END>(GetPool()->GetPool());
+
+ bMySet = true;
+ }
+
+ return *pSet;
+ }
+
+ // this is a dummy template for the internal template of the
+ // current presentation layout; return the ItemSet of that template
+ else
+ {
+
+ SdStyleSheet* pSdSheet = GetRealStyleSheet();
+
+ if (pSdSheet)
+ {
+ return pSdSheet->GetItemSet();
+ }
+ else
+ {
+ if (!pSet)
+ {
+ pSet = new SfxItemSetFixed<
+ XATTR_LINE_FIRST, XATTR_LINE_LAST,
+ XATTR_FILL_FIRST, XATTR_FILL_LAST,
+ SDRATTR_SHADOW_FIRST, SDRATTR_SHADOW_LAST,
+ SDRATTR_TEXT_MINFRAMEHEIGHT, SDRATTR_TEXT_WORDWRAP,
+ SDRATTR_EDGE_FIRST, SDRATTR_MEASURE_LAST,
+ SDRATTR_3D_FIRST, SDRATTR_3D_LAST,
+ EE_PARA_START, EE_CHAR_END>(GetPool()->GetPool());
+ bMySet = true;
+ }
+
+ return(*pSet);
+ }
+ }
+}
+
+/**
+ * A template is used when it is referenced by inserted object or by a used
+ * template.
+ */
+bool SdStyleSheet::IsUsed() const
+{
+ bool bResult = false;
+
+ const size_t nListenerCount = GetSizeOfVector();
+ for (size_t n = 0; n < nListenerCount; ++n)
+ {
+ SfxListener* pListener = GetListener(n);
+ if( pListener == this )
+ continue;
+
+ const svl::StyleSheetUser* const pUser(dynamic_cast<svl::StyleSheetUser*>(pListener));
+ if (pUser)
+ bResult = pUser->isUsedByModel();
+ if (bResult)
+ break;
+ }
+
+ if( !bResult )
+ {
+ MutexGuard aGuard( mrBHelper.rMutex );
+
+ cppu::OInterfaceContainerHelper * pContainer = mrBHelper.getContainer( cppu::UnoType<XModifyListener>::get() );
+ if( pContainer )
+ {
+ const Sequence< Reference< XInterface > > aModifyListeners( pContainer->getElements() );
+ bResult = std::any_of(aModifyListeners.begin(), aModifyListeners.end(),
+ [](const Reference<XInterface>& rListener) {
+ Reference< XStyle > xStyle( rListener, UNO_QUERY );
+ return xStyle.is() && xStyle->isInUse();
+ });
+ }
+ }
+ return bResult;
+}
+
+/**
+ * Determine the style sheet for which this dummy is for.
+ */
+SdStyleSheet* SdStyleSheet::GetRealStyleSheet() const
+{
+ OUString aRealStyle;
+ OUString aSep( SD_LT_SEPARATOR );
+ SdStyleSheet* pRealStyle = nullptr;
+ SdDrawDocument* pDoc = static_cast<SdStyleSheetPool*>(m_pPool)->GetDoc();
+
+ ::sd::DrawViewShell* pDrawViewShell = nullptr;
+
+ ::sd::ViewShellBase* pBase = dynamic_cast< ::sd::ViewShellBase* >( SfxViewShell::Current() );
+ if( pBase )
+ pDrawViewShell = dynamic_cast< ::sd::DrawViewShell* >( pBase->GetMainViewShell().get() );
+
+ if (pDrawViewShell && pDrawViewShell->GetDoc() == pDoc)
+ {
+ SdPage* pPage = pDrawViewShell->getCurrentPage();
+ if( pPage )
+ {
+ aRealStyle = pPage->GetLayoutName();
+ // cut after separator string
+
+ if( aRealStyle.indexOf(aSep) >= 0)
+ {
+ aRealStyle = aRealStyle.copy(0,(aRealStyle.indexOf(aSep) + aSep.getLength()));
+ }
+ }
+ }
+ if (aRealStyle.isEmpty())
+ {
+ SdPage* pPage = pDoc->GetSdPage(0, PageKind::Standard);
+
+ if (pPage)
+ {
+ aRealStyle = pDoc->GetSdPage(0, PageKind::Standard)->GetLayoutName();
+ }
+ else
+ {
+ /* no page available yet. This can happen when actualizing the
+ document templates. */
+ SfxStyleSheetIterator aIter(m_pPool, SfxStyleFamily::Page);
+ SfxStyleSheetBase* pSheet = aIter.First();
+ if( pSheet )
+ aRealStyle = pSheet->GetName();
+ }
+
+ if( aRealStyle.indexOf(aSep) >= 0)
+ {
+ aRealStyle = aRealStyle.copy(0,(aRealStyle.indexOf(aSep) + aSep.getLength()));
+ }
+ }
+
+ /* now map from the name (specified for country language) to the internal
+ name (independent of the country language) */
+ OUString aInternalName;
+ OUString aStyleName(aName);
+
+ if (aStyleName == SdResId(STR_PSEUDOSHEET_TITLE))
+ {
+ aInternalName = STR_LAYOUT_TITLE;
+ }
+ else if (aStyleName == SdResId(STR_PSEUDOSHEET_SUBTITLE))
+ {
+ aInternalName = STR_LAYOUT_SUBTITLE;
+ }
+ else if (aStyleName == SdResId(STR_PSEUDOSHEET_BACKGROUND))
+ {
+ aInternalName = STR_LAYOUT_BACKGROUND;
+ }
+ else if (aStyleName == SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS))
+ {
+ aInternalName = STR_LAYOUT_BACKGROUNDOBJECTS;
+ }
+ else if (aStyleName == SdResId(STR_PSEUDOSHEET_NOTES))
+ {
+ aInternalName = STR_LAYOUT_NOTES;
+ }
+ else
+ {
+ OUString aOutlineStr(SdResId(STR_PSEUDOSHEET_OUTLINE));
+ sal_Int32 nPos = aStyleName.indexOf(aOutlineStr);
+ if (nPos >= 0)
+ {
+ std::u16string_view aNumStr(aStyleName.subView(aOutlineStr.getLength()));
+ aInternalName = STR_LAYOUT_OUTLINE + aNumStr;
+ }
+ }
+
+ aRealStyle += aInternalName;
+ pRealStyle = static_cast< SdStyleSheet* >( m_pPool->Find(aRealStyle, SfxStyleFamily::Page) );
+
+#ifdef DBG_UTIL
+ if( !pRealStyle )
+ {
+ SfxStyleSheetIterator aIter(m_pPool, SfxStyleFamily::Page);
+ if( aIter.Count() > 0 )
+ // StyleSheet not found, but pool already loaded
+ DBG_ASSERT(pRealStyle, "Internal StyleSheet not found");
+ }
+#endif
+
+ return pRealStyle;
+}
+
+/**
+ * Determine pseudo style sheet which stands for this style sheet.
+ */
+SdStyleSheet* SdStyleSheet::GetPseudoStyleSheet() const
+{
+ SdStyleSheet* pPseudoStyle = nullptr;
+ OUString aSep( SD_LT_SEPARATOR );
+ OUString aStyleName(aName);
+ // without layout name and separator
+
+ if( aStyleName.indexOf(aSep) >=0 )
+ {
+ aStyleName = aStyleName.copy (aStyleName.indexOf(aSep) + aSep.getLength());
+ }
+
+ if (aStyleName == STR_LAYOUT_TITLE)
+ {
+ aStyleName = SdResId(STR_PSEUDOSHEET_TITLE);
+ }
+ else if (aStyleName == STR_LAYOUT_SUBTITLE)
+ {
+ aStyleName = SdResId(STR_PSEUDOSHEET_SUBTITLE);
+ }
+ else if (aStyleName == STR_LAYOUT_BACKGROUND)
+ {
+ aStyleName = SdResId(STR_PSEUDOSHEET_BACKGROUND);
+ }
+ else if (aStyleName == STR_LAYOUT_BACKGROUNDOBJECTS)
+ {
+ aStyleName = SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS);
+ }
+ else if (aStyleName == STR_LAYOUT_NOTES)
+ {
+ aStyleName = SdResId(STR_PSEUDOSHEET_NOTES);
+ }
+ else
+ {
+ OUString aOutlineStr(STR_LAYOUT_OUTLINE);
+ sal_Int32 nPos = aStyleName.indexOf(aOutlineStr);
+ if (nPos != -1)
+ {
+ std::u16string_view aNumStr(aStyleName.subView(aOutlineStr.getLength()));
+ aStyleName = SdResId(STR_PSEUDOSHEET_OUTLINE) + aNumStr;
+ }
+ }
+
+ pPseudoStyle = static_cast<SdStyleSheet*>(m_pPool->Find(aStyleName, SfxStyleFamily::Pseudo));
+ DBG_ASSERT(pPseudoStyle, "PseudoStyleSheet missing");
+
+ return pPseudoStyle;
+}
+
+void SdStyleSheet::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
+{
+ // first, base class functionality
+ SfxStyleSheet::Notify(rBC, rHint);
+
+ if (nFamily != SfxStyleFamily::Pseudo)
+ return;
+
+ /* if the dummy gets a notify about a changed attribute, he takes care that
+ the actual meant style sheet sends broadcasts. */
+ if (rHint.GetId() == SfxHintId::DataChanged)
+ {
+ SdStyleSheet* pRealStyle = GetRealStyleSheet();
+ if (pRealStyle)
+ pRealStyle->Broadcast(rHint);
+ }
+}
+
+/**
+ * Adjust the bullet width and the left text indent of the provided ItemSets to
+ * their font height. The new values are calculated that the ratio to the font
+ * height is as in the style sheet.
+ *
+ * @param bOnlyMissingItems If sal_True, only not set items are completed. With
+ * sal_False, are items are overwritten.
+ */
+void SdStyleSheet::AdjustToFontHeight(SfxItemSet& rSet, bool bOnlyMissingItems)
+{
+ /* If not explicit set, adjust bullet width and text indent to new font
+ height. */
+ SfxStyleFamily eFamily = nFamily;
+ OUString aStyleName(aName);
+ if (eFamily == SfxStyleFamily::Pseudo)
+ {
+ SfxStyleSheet* pRealStyle = GetRealStyleSheet();
+ eFamily = pRealStyle->GetFamily();
+ aStyleName = pRealStyle->GetName();
+ }
+
+ if (!(eFamily == SfxStyleFamily::Page &&
+ aStyleName.indexOf(STR_LAYOUT_OUTLINE) != -1 &&
+ rSet.GetItemState(EE_CHAR_FONTHEIGHT) == SfxItemState::SET))
+ return;
+
+ const SfxItemSet* pCurSet = &GetItemSet();
+ sal_uInt32 nNewHeight = rSet.Get(EE_CHAR_FONTHEIGHT).GetHeight();
+ sal_uInt32 nOldHeight = pCurSet->Get(EE_CHAR_FONTHEIGHT).GetHeight();
+
+ if (rSet.GetItemState(EE_PARA_BULLET) != SfxItemState::SET || !bOnlyMissingItems)
+ {
+ const SvxBulletItem& rBItem = pCurSet->Get(EE_PARA_BULLET);
+ double fBulletFraction = double(rBItem.GetWidth()) / nOldHeight;
+ SvxBulletItem aNewBItem(rBItem);
+ aNewBItem.SetWidth(static_cast<sal_uInt32>(fBulletFraction * nNewHeight));
+ rSet.Put(aNewBItem);
+ }
+
+ if (rSet.GetItemState(EE_PARA_LRSPACE) != SfxItemState::SET || !bOnlyMissingItems)
+ {
+ const SvxLRSpaceItem& rLRItem = pCurSet->Get(EE_PARA_LRSPACE);
+ double fIndentFraction = double(rLRItem.GetTextLeft()) / nOldHeight;
+ SvxLRSpaceItem aNewLRItem(rLRItem);
+ aNewLRItem.SetTextLeft(fIndentFraction * nNewHeight);
+ double fFirstIndentFraction = double(rLRItem.GetTextFirstLineOffset()) / nOldHeight;
+ aNewLRItem.SetTextFirstLineOffset(static_cast<short>(fFirstIndentFraction * nNewHeight));
+ rSet.Put(aNewLRItem);
+ }
+
+ if (rSet.GetItemState(EE_PARA_ULSPACE) != SfxItemState::SET || !bOnlyMissingItems)
+ {
+ const SvxULSpaceItem& rULItem = pCurSet->Get(EE_PARA_ULSPACE);
+ SvxULSpaceItem aNewULItem(rULItem);
+ double fLowerFraction = double(rULItem.GetLower()) / nOldHeight;
+ aNewULItem.SetLower(static_cast<sal_uInt16>(fLowerFraction * nNewHeight));
+ double fUpperFraction = double(rULItem.GetUpper()) / nOldHeight;
+ aNewULItem.SetUpper(static_cast<sal_uInt16>(fUpperFraction * nNewHeight));
+ rSet.Put(aNewULItem);
+ }
+}
+
+bool SdStyleSheet::HasFollowSupport() const
+{
+ return false;
+}
+
+bool SdStyleSheet::HasParentSupport() const
+{
+ return true;
+}
+
+bool SdStyleSheet::HasClearParentSupport() const
+{
+ return true;
+}
+
+namespace
+{
+struct ApiNameMap
+{
+ std::u16string_view mpApiName;
+ sal_uInt32 mnHelpId;
+} const pApiNameMap[]
+ = { { std::u16string_view(u"title"), HID_PSEUDOSHEET_TITLE },
+ { std::u16string_view(u"subtitle"), HID_PSEUDOSHEET_SUBTITLE },
+ { std::u16string_view(u"background"), HID_PSEUDOSHEET_BACKGROUND },
+ { std::u16string_view(u"backgroundobjects"), HID_PSEUDOSHEET_BACKGROUNDOBJECTS },
+ { std::u16string_view(u"notes"), HID_PSEUDOSHEET_NOTES },
+ { std::u16string_view(u"standard"), HID_STANDARD_STYLESHEET_NAME },
+ { std::u16string_view(u"objectwithoutfill"), HID_POOLSHEET_OBJWITHOUTFILL },
+
+ { std::u16string_view(u"Text"), HID_POOLSHEET_TEXT },
+ { std::u16string_view(u"A4"), HID_POOLSHEET_A4 },
+ { std::u16string_view(u"Title A4"), HID_POOLSHEET_A4_TITLE },
+ { std::u16string_view(u"Heading A4"), HID_POOLSHEET_A4_HEADLINE },
+ { std::u16string_view(u"Text A4"), HID_POOLSHEET_A4_TEXT },
+ { std::u16string_view(u"A0"), HID_POOLSHEET_A0 },
+ { std::u16string_view(u"Title A0"), HID_POOLSHEET_A0_TITLE },
+ { std::u16string_view(u"Heading A0"), HID_POOLSHEET_A0_HEADLINE },
+ { std::u16string_view(u"Text A0"), HID_POOLSHEET_A0_TEXT },
+
+ { std::u16string_view(u"Graphic"), HID_POOLSHEET_GRAPHIC },
+ { std::u16string_view(u"Shapes"), HID_POOLSHEET_SHAPES },
+ { std::u16string_view(u"Filled"), HID_POOLSHEET_FILLED },
+ { std::u16string_view(u"Filled Blue"), HID_POOLSHEET_FILLED_BLUE },
+ { std::u16string_view(u"Filled Green"), HID_POOLSHEET_FILLED_GREEN },
+ { std::u16string_view(u"Filled Red"), HID_POOLSHEET_FILLED_RED },
+ { std::u16string_view(u"Filled Yellow"), HID_POOLSHEET_FILLED_YELLOW },
+ { std::u16string_view(u"Outlined"), HID_POOLSHEET_OUTLINE },
+ { std::u16string_view(u"Outlined Blue"), HID_POOLSHEET_OUTLINE_BLUE },
+ { std::u16string_view(u"Outlined Green"), HID_POOLSHEET_OUTLINE_GREEN },
+ { std::u16string_view(u"Outlined Red"), HID_POOLSHEET_OUTLINE_RED },
+ { std::u16string_view(u"Outlined Yellow"), HID_POOLSHEET_OUTLINE_YELLOW },
+ { std::u16string_view(u"Lines"), HID_POOLSHEET_LINES },
+ { std::u16string_view(u"Arrow Line"), HID_POOLSHEET_MEASURE },
+ { std::u16string_view(u"Arrow Dashed"), HID_POOLSHEET_LINES_DASHED }
+ };
+
+OUString GetApiNameForHelpId(sal_uLong nId)
+{
+ if ((nId >= HID_PSEUDOSHEET_OUTLINE1) && (nId <= HID_PSEUDOSHEET_OUTLINE9))
+ return "outline" + OUStringChar(sal_Unicode('1' + (nId - HID_PSEUDOSHEET_OUTLINE1)));
+
+ for (const auto& i : pApiNameMap)
+ if (nId == i.mnHelpId)
+ return OUString(i.mpApiName);
+
+ return OUString();
+}
+
+sal_uInt32 GetHelpIdForApiName(std::u16string_view sName)
+{
+ std::u16string_view sRest;
+ if (o3tl::starts_with(sName, u"outline", &sRest))
+ {
+ if (sRest.length() == 1)
+ {
+ sal_Unicode ch = sRest.front();
+ if ('1' <= ch && ch <= '9')
+ return HID_PSEUDOSHEET_OUTLINE1 + ch - '1';
+ }
+ // No other pre-defined names start with "outline"
+ return 0;
+ }
+
+ for (const auto& i : pApiNameMap)
+ if (sName == i.mpApiName)
+ return i.mnHelpId;
+
+ return 0;
+}
+}
+
+void SdStyleSheet::SetHelpId( const OUString& r, sal_uLong nId )
+{
+ SfxStyleSheet::SetHelpId( r, nId );
+
+ const OUString sNewApiName = GetApiNameForHelpId(nId);
+ if (!sNewApiName.isEmpty())
+ msApiName = sNewApiName;
+}
+
+OUString SdStyleSheet::GetFamilyString( SfxStyleFamily eFamily )
+{
+ switch( eFamily )
+ {
+ case SfxStyleFamily::Frame:
+ return "cell";
+ default:
+ OSL_FAIL( "SdStyleSheet::GetFamilyString(), illegal family!" );
+ [[fallthrough]];
+ case SfxStyleFamily::Para:
+ return "graphics";
+ }
+}
+
+void SdStyleSheet::throwIfDisposed()
+{
+ if( !mxPool.is() )
+ throw DisposedException();
+}
+
+rtl::Reference<SdStyleSheet> SdStyleSheet::CreateEmptyUserStyle( SfxStyleSheetBasePool& rPool, SfxStyleFamily eFamily )
+{
+ OUString aName;
+ sal_Int32 nIndex = 1;
+ do
+ {
+ aName = "user" + OUString::number( nIndex++ );
+ }
+ while( rPool.Find( aName, eFamily ) != nullptr );
+
+ return new SdStyleSheet(aName, rPool, eFamily, SfxStyleSearchBits::UserDefined);
+}
+
+// XInterface
+
+void SAL_CALL SdStyleSheet::release( ) noexcept
+{
+ if (osl_atomic_decrement( &m_refCount ) != 0)
+ return;
+
+ // restore reference count:
+ osl_atomic_increment( &m_refCount );
+ if (! mrBHelper.bDisposed) try
+ {
+ dispose();
+ }
+ catch (RuntimeException const&)
+ {
+ // don't break throw ()
+ TOOLS_WARN_EXCEPTION( "sd", "" );
+ }
+ OSL_ASSERT( mrBHelper.bDisposed );
+ SdStyleSheetBase::release();
+}
+
+// XComponent
+
+void SAL_CALL SdStyleSheet::dispose( )
+{
+ {
+ MutexGuard aGuard(mrBHelper.rMutex);
+ if (mrBHelper.bDisposed || mrBHelper.bInDispose)
+ return;
+
+ mrBHelper.bInDispose = true;
+ }
+ try
+ {
+ // side effect: keeping a reference to this
+ EventObject aEvt( static_cast< OWeakObject * >( this ) );
+ try
+ {
+ mrBHelper.aLC.disposeAndClear( aEvt );
+ disposing();
+ }
+ catch (...)
+ {
+ MutexGuard aGuard2( mrBHelper.rMutex );
+ // bDisposed and bInDispose must be set in this order:
+ mrBHelper.bDisposed = true;
+ mrBHelper.bInDispose = false;
+ throw;
+ }
+ MutexGuard aGuard2( mrBHelper.rMutex );
+ // bDisposed and bInDispose must be set in this order:
+ mrBHelper.bDisposed = true;
+ mrBHelper.bInDispose = false;
+ }
+ catch (RuntimeException &)
+ {
+ throw;
+ }
+ catch (const Exception & exc)
+ {
+ css::uno::Any anyEx = cppu::getCaughtException();
+ throw css::lang::WrappedTargetRuntimeException(
+ "unexpected UNO exception caught: " + exc.Message ,
+ nullptr, anyEx );
+ }
+}
+
+void SdStyleSheet::disposing()
+{
+ SolarMutexGuard aGuard;
+ if (bMySet)
+ {
+ delete pSet;
+ }
+ pSet = nullptr;
+ m_pPool = nullptr;
+ mxPool.clear();
+}
+
+void SAL_CALL SdStyleSheet::addEventListener( const Reference< XEventListener >& xListener )
+{
+ ClearableMutexGuard aGuard( mrBHelper.rMutex );
+ if (mrBHelper.bDisposed || mrBHelper.bInDispose)
+ {
+ aGuard.clear();
+ EventObject aEvt( static_cast< OWeakObject * >( this ) );
+ xListener->disposing( aEvt );
+ }
+ else
+ {
+ mrBHelper.addListener( cppu::UnoType<decltype(xListener)>::get(), xListener );
+ }
+}
+
+void SAL_CALL SdStyleSheet::removeEventListener( const Reference< XEventListener >& xListener )
+{
+ mrBHelper.removeListener( cppu::UnoType<decltype(xListener)>::get(), xListener );
+}
+
+// XModifyBroadcaster
+
+void SAL_CALL SdStyleSheet::addModifyListener( const Reference< XModifyListener >& xListener )
+{
+ ClearableMutexGuard aGuard( mrBHelper.rMutex );
+ if (mrBHelper.bDisposed || mrBHelper.bInDispose)
+ {
+ aGuard.clear();
+ EventObject aEvt( static_cast< OWeakObject * >( this ) );
+ xListener->disposing( aEvt );
+ }
+ else
+ {
+ if (!mpModifyListenerForwarder)
+ mpModifyListenerForwarder.reset( new ModifyListenerForwarder( this ) );
+ mrBHelper.addListener( cppu::UnoType<XModifyListener>::get(), xListener );
+ }
+}
+
+void SAL_CALL SdStyleSheet::removeModifyListener( const Reference< XModifyListener >& xListener )
+{
+ mrBHelper.removeListener( cppu::UnoType<XModifyListener>::get(), xListener );
+}
+
+void SdStyleSheet::notifyModifyListener()
+{
+ MutexGuard aGuard( mrBHelper.rMutex );
+
+ cppu::OInterfaceContainerHelper * pContainer = mrBHelper.getContainer( cppu::UnoType<XModifyListener>::get() );
+ if( pContainer )
+ {
+ EventObject aEvt( static_cast< OWeakObject * >( this ) );
+ pContainer->forEach<XModifyListener>(
+ [&] (Reference<XModifyListener> const& xListener) {
+ return xListener->modified(aEvt);
+ } );
+ }
+}
+
+// XServiceInfo
+OUString SAL_CALL SdStyleSheet::getImplementationName()
+{
+ return "SdStyleSheet";
+}
+
+sal_Bool SAL_CALL SdStyleSheet::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+Sequence< OUString > SAL_CALL SdStyleSheet::getSupportedServiceNames()
+{
+ return { "com.sun.star.style.Style",
+ "com.sun.star.drawing.FillProperties",
+ "com.sun.star.drawing.LineProperties",
+ "com.sun.star.drawing.ShadowProperties",
+ "com.sun.star.drawing.ConnectorProperties",
+ "com.sun.star.drawing.MeasureProperties",
+ "com.sun.star.style.ParagraphProperties",
+ "com.sun.star.style.CharacterProperties",
+ "com.sun.star.drawing.TextProperties",
+ "com.sun.star.drawing.Text" };
+}
+
+bool SdStyleSheet::SetName(const OUString& rNewName, bool bReindexNow)
+{
+ const bool bResult = SfxUnoStyleSheet::SetName(rNewName, bReindexNow);
+ // Don't overwrite predefined API names
+ if (bResult && GetHelpIdForApiName(msApiName) == 0)
+ {
+ msApiName = rNewName;
+ Broadcast(SfxHint(SfxHintId::DataChanged));
+ }
+ return bResult;
+}
+
+// XNamed
+OUString SAL_CALL SdStyleSheet::getName()
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+ return GetApiName();
+}
+
+void SAL_CALL SdStyleSheet::setName( const OUString& rName )
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+ SetName(rName);
+}
+
+// XStyle
+
+sal_Bool SAL_CALL SdStyleSheet::isUserDefined()
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+ return IsUserDefined();
+}
+
+sal_Bool SAL_CALL SdStyleSheet::isInUse()
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+ return IsUsed();
+}
+
+OUString SAL_CALL SdStyleSheet::getParentStyle()
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ if( !GetParent().isEmpty() )
+ {
+ SdStyleSheet* pParentStyle = static_cast< SdStyleSheet* >( mxPool->Find( GetParent(), nFamily ) );
+ if( pParentStyle )
+ return pParentStyle->GetApiName();
+ }
+ return OUString();
+}
+
+void SAL_CALL SdStyleSheet::setParentStyle( const OUString& rParentName )
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ if( !rParentName.isEmpty() )
+ {
+ OUString const name(GetName());
+ sal_Int32 const sep(name.indexOf(SD_LT_SEPARATOR));
+ OUString const master((sep == -1) ? OUString() : name.copy(0, sep));
+ std::shared_ptr<SfxStyleSheetIterator> aSSSI = std::make_shared<SfxStyleSheetIterator>(mxPool.get(), nFamily);
+ for (SfxStyleSheetBase *pStyle = aSSSI->First(); pStyle; pStyle = aSSSI->Next())
+ {
+ // we hope that we have only sd style sheets
+ SdStyleSheet* pSdStyleSheet = static_cast<SdStyleSheet*>(pStyle);
+ OUString const curName(pStyle->GetName());
+ sal_Int32 const curSep(curName.indexOf(SD_LT_SEPARATOR));
+ OUString const curMaster((curSep == -1)
+ ? OUString() : curName.copy(0, curSep));
+ // check that the master matches, as msApiName exists once per
+ // master page
+ if (pSdStyleSheet->msApiName == rParentName && master == curMaster)
+ {
+ if( pStyle != this )
+ {
+ SetParent(curName);
+ }
+ return;
+ }
+ }
+ throw NoSuchElementException();
+ }
+ else
+ {
+ SetParent( rParentName );
+ }
+}
+
+// XPropertySet/XMultiPropertySet utility functions
+
+// Does not broadcast
+// Must be guarded by solar mutex; must not be disposed
+void SdStyleSheet::setPropertyValue_Impl(const OUString& aPropertyName, const css::uno::Any& aValue)
+{
+ const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry( aPropertyName );
+ if( pEntry == nullptr )
+ {
+ throw UnknownPropertyException( aPropertyName, static_cast<cppu::OWeakObject*>(this));
+ }
+
+ if( pEntry->nWID == WID_STYLE_HIDDEN )
+ {
+ bool bValue = false;
+ if ( aValue >>= bValue )
+ SetHidden( bValue );
+ return;
+ }
+ if( pEntry->nWID == SDRATTR_TEXTDIRECTION )
+ return; // not yet implemented for styles
+
+ if( pEntry->nWID == WID_STYLE_FAMILY )
+ throw PropertyVetoException();
+
+ if( (pEntry->nWID == EE_PARA_NUMBULLET) && (GetFamily() == SfxStyleFamily::Page) )
+ {
+ OUString aStr;
+ const sal_uInt32 nTempHelpId = GetHelpId( aStr );
+
+ if( (nTempHelpId >= HID_PSEUDOSHEET_OUTLINE2) && (nTempHelpId <= HID_PSEUDOSHEET_OUTLINE9) )
+ return;
+ }
+
+ SfxItemSet &rStyleSet = GetItemSet();
+
+ if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
+ {
+ BitmapMode eMode;
+ if( aValue >>= eMode )
+ {
+ rStyleSet.Put( XFillBmpStretchItem( eMode == BitmapMode_STRETCH ) );
+ rStyleSet.Put( XFillBmpTileItem( eMode == BitmapMode_REPEAT ) );
+ return;
+ }
+ throw IllegalArgumentException();
+ }
+
+ if (pEntry->nWID == OWN_ATTR_TEXTCOLUMNS)
+ {
+ if (css::uno::Reference<css::text::XTextColumns> xColumns; aValue >>= xColumns)
+ {
+ rStyleSet.Put(SfxInt16Item(SDRATTR_TEXTCOLUMNS_NUMBER, xColumns->getColumnCount()));
+ if (css::uno::Reference<css::beans::XPropertySet> xPropSet{ xColumns,
+ css::uno::UNO_QUERY })
+ {
+ auto aVal = xPropSet->getPropertyValue("AutomaticDistance");
+ if (sal_Int32 nSpacing; aVal >>= nSpacing)
+ rStyleSet.Put(SdrMetricItem(SDRATTR_TEXTCOLUMNS_SPACING, nSpacing));
+ }
+ return;
+ }
+ throw IllegalArgumentException();
+ }
+
+ SfxItemSet aSet( GetPool()->GetPool(), pEntry->nWID, pEntry->nWID);
+ aSet.Put( rStyleSet );
+
+ if( !aSet.Count() )
+ {
+ if( EE_PARA_NUMBULLET == pEntry->nWID )
+ {
+ vcl::Font aBulletFont;
+ SdStyleSheetPool::PutNumBulletItem( this, aBulletFont );
+ aSet.Put( rStyleSet );
+ }
+ else
+ {
+ aSet.Put( GetPool()->GetPool().GetDefaultItem( pEntry->nWID ) );
+ }
+ }
+
+ if( pEntry->nMemberId == MID_NAME &&
+ ( pEntry->nWID == XATTR_FILLBITMAP || pEntry->nWID == XATTR_FILLGRADIENT ||
+ pEntry->nWID == XATTR_FILLHATCH || pEntry->nWID == XATTR_FILLFLOATTRANSPARENCE ||
+ pEntry->nWID == XATTR_LINESTART || pEntry->nWID == XATTR_LINEEND || pEntry->nWID == XATTR_LINEDASH) )
+ {
+ OUString aTempName;
+ if(!(aValue >>= aTempName ))
+ throw IllegalArgumentException();
+
+ SvxShape::SetFillAttribute( pEntry->nWID, aTempName, aSet );
+ }
+ else if(!SvxUnoTextRangeBase::SetPropertyValueHelper( pEntry, aValue, aSet ))
+ {
+ SvxItemPropertySet_setPropertyValue( pEntry, aValue, aSet );
+ }
+
+ rStyleSet.Put( aSet );
+}
+
+// Must be guarded by solar mutex; must not be disposed
+css::uno::Any SdStyleSheet::getPropertyValue_Impl(const OUString& PropertyName)
+{
+ const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry( PropertyName );
+ if( pEntry == nullptr )
+ {
+ throw UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this));
+ }
+
+ Any aAny;
+
+ if( pEntry->nWID == WID_STYLE_FAMILY )
+ {
+ if( nFamily == SfxStyleFamily::Page )
+ {
+ const OUString aLayoutName( GetName() );
+ aAny <<= aLayoutName.copy( 0, aLayoutName.indexOf( SD_LT_SEPARATOR) );
+ }
+ else
+ {
+ aAny <<= GetFamilyString(nFamily);
+ }
+ }
+ else if( pEntry->nWID == WID_STYLE_DISPNAME )
+ {
+ OUString aDisplayName;
+ if ( nFamily == SfxStyleFamily::Page )
+ {
+ const SdStyleSheet* pStyleSheet = GetPseudoStyleSheet();
+ if (pStyleSheet != nullptr)
+ aDisplayName = pStyleSheet->GetName();
+ }
+
+ if (aDisplayName.isEmpty())
+ aDisplayName = GetName();
+
+ aAny <<= aDisplayName;
+ }
+ else if( pEntry->nWID == SDRATTR_TEXTDIRECTION )
+ {
+ aAny <<= false;
+ }
+ else if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
+ {
+ SfxItemSet &rStyleSet = GetItemSet();
+
+ const XFillBmpStretchItem* pStretchItem = rStyleSet.GetItem<XFillBmpStretchItem>(XATTR_FILLBMP_STRETCH);
+ const XFillBmpTileItem* pTileItem = rStyleSet.GetItem<XFillBmpTileItem>(XATTR_FILLBMP_TILE);
+
+ if( pStretchItem && pTileItem )
+ {
+ if( pTileItem->GetValue() )
+ aAny <<= BitmapMode_REPEAT;
+ else if( pStretchItem->GetValue() )
+ aAny <<= BitmapMode_STRETCH;
+ else
+ aAny <<= BitmapMode_NO_REPEAT;
+ }
+ }
+ else if( pEntry->nWID == WID_STYLE_HIDDEN )
+ {
+ aAny <<= IsHidden( );
+ }
+ else
+ {
+ SfxItemSet aSet( GetPool()->GetPool(), pEntry->nWID, pEntry->nWID);
+
+ const SfxPoolItem* pItem;
+ SfxItemSet& rStyleSet = GetItemSet();
+
+ if( rStyleSet.GetItemState( pEntry->nWID, true, &pItem ) == SfxItemState::SET )
+ aSet.Put( *pItem );
+
+ if( !aSet.Count() )
+ aSet.Put( GetPool()->GetPool().GetDefaultItem( pEntry->nWID ) );
+
+ if(SvxUnoTextRangeBase::GetPropertyValueHelper( aSet, pEntry, aAny ))
+ return aAny;
+
+ // Get value of ItemSet
+ aAny = SvxItemPropertySet_getPropertyValue( pEntry, aSet );
+ }
+
+ if( pEntry->aType != aAny.getValueType() )
+ {
+ // since the sfx uint16 item now exports a sal_Int32, we may have to fix this here
+ if( ( pEntry->aType == ::cppu::UnoType<sal_Int16>::get()) && aAny.getValueType() == ::cppu::UnoType<sal_Int32>::get() )
+ {
+ sal_Int32 nValue = 0;
+ aAny >>= nValue;
+ aAny <<= static_cast<sal_Int16>(nValue);
+ }
+ else
+ {
+ OSL_FAIL("SvxShape::GetAnyForItem() Returnvalue has wrong Type!" );
+ }
+ }
+
+ return aAny;
+}
+
+// XPropertySet
+
+Reference< XPropertySetInfo > SdStyleSheet::getPropertySetInfo()
+{
+ throwIfDisposed();
+ static Reference< XPropertySetInfo > xInfo = GetStylePropertySet().getPropertySetInfo();
+ return xInfo;
+}
+
+void SAL_CALL SdStyleSheet::setPropertyValue( const OUString& aPropertyName, const Any& aValue )
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ setPropertyValue_Impl(aPropertyName, aValue);
+ Broadcast(SfxHint(SfxHintId::DataChanged));
+}
+
+Any SAL_CALL SdStyleSheet::getPropertyValue( const OUString& PropertyName )
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ return getPropertyValue_Impl(PropertyName);
+}
+
+void SAL_CALL SdStyleSheet::addPropertyChangeListener( const OUString& , const Reference< XPropertyChangeListener >& ) {}
+void SAL_CALL SdStyleSheet::removePropertyChangeListener( const OUString& , const Reference< XPropertyChangeListener >& ) {}
+void SAL_CALL SdStyleSheet::addVetoableChangeListener( const OUString& , const Reference< XVetoableChangeListener >& ) {}
+void SAL_CALL SdStyleSheet::removeVetoableChangeListener( const OUString& , const Reference< XVetoableChangeListener >& ) {}
+
+// XMultiPropertySet
+
+void SAL_CALL SdStyleSheet::setPropertyValues(const css::uno::Sequence<OUString>& aPropertyNames,
+ const css::uno::Sequence<css::uno::Any>& aValues)
+{
+ const sal_Int32 nCount = aPropertyNames.getLength();
+
+ if (nCount != aValues.getLength())
+ throw css::lang::IllegalArgumentException();
+
+ if (!nCount)
+ return;
+
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ for (sal_Int32 i = 0; i < nCount; ++i)
+ {
+ try
+ {
+ setPropertyValue_Impl(aPropertyNames[i], aValues[i]);
+ }
+ catch (const css::beans::UnknownPropertyException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+ }
+
+ Broadcast(SfxHint(SfxHintId::DataChanged));
+}
+
+css::uno::Sequence<css::uno::Any>
+SAL_CALL SdStyleSheet::getPropertyValues(const css::uno::Sequence<OUString>& aPropertyNames)
+{
+ SolarMutexGuard aGuard;
+ throwIfDisposed();
+
+ const sal_Int32 nCount = aPropertyNames.getLength();
+ css::uno::Sequence<css::uno::Any> aValues(nCount);
+ Any* pAny = aValues.getArray();
+
+ for (sal_Int32 i = 0; i < nCount; ++i)
+ pAny[i] = getPropertyValue_Impl(aPropertyNames[i]);
+
+ return aValues;
+}
+
+void SAL_CALL SdStyleSheet::addPropertiesChangeListener(const css::uno::Sequence<OUString>&, const css::uno::Reference<css::beans::XPropertiesChangeListener>&) {}
+void SAL_CALL SdStyleSheet::removePropertiesChangeListener(const css::uno::Reference<css::beans::XPropertiesChangeListener>&) {}
+void SAL_CALL SdStyleSheet::firePropertiesChangeEvent(const css::uno::Sequence<OUString>&, const css::uno::Reference<css::beans::XPropertiesChangeListener>&) {}
+
+// XPropertyState
+
+PropertyState SAL_CALL SdStyleSheet::getPropertyState( const OUString& PropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry( PropertyName );
+
+ if( pEntry == nullptr )
+ throw UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this));
+
+ if( pEntry->nWID == WID_STYLE_FAMILY )
+ {
+ return PropertyState_DIRECT_VALUE;
+ }
+ else if( pEntry->nWID == SDRATTR_TEXTDIRECTION )
+ {
+ return PropertyState_DEFAULT_VALUE;
+ }
+ else if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
+ {
+ const SfxItemSet& rSet = GetItemSet();
+
+ if( rSet.GetItemState( XATTR_FILLBMP_STRETCH, false ) == SfxItemState::SET ||
+ rSet.GetItemState( XATTR_FILLBMP_TILE, false ) == SfxItemState::SET )
+ {
+ return PropertyState_DIRECT_VALUE;
+ }
+ else
+ {
+ return PropertyState_AMBIGUOUS_VALUE;
+ }
+ }
+ else if (pEntry->nWID == OWN_ATTR_TEXTCOLUMNS)
+ {
+ const SfxItemSet& rSet = GetItemSet();
+
+ const auto eState1 = rSet.GetItemState(SDRATTR_TEXTCOLUMNS_NUMBER, false);
+ const auto eState2 = rSet.GetItemState(SDRATTR_TEXTCOLUMNS_SPACING, false);
+ if (eState1 == SfxItemState::SET || eState2 == SfxItemState::SET)
+ return PropertyState_DIRECT_VALUE;
+ else if (eState1 == SfxItemState::DEFAULT && eState2 == SfxItemState::DEFAULT)
+ return PropertyState_DEFAULT_VALUE;
+ else
+ return PropertyState_AMBIGUOUS_VALUE;
+ }
+ else
+ {
+ SfxItemSet &rStyleSet = GetItemSet();
+
+ PropertyState eState;
+
+ switch( rStyleSet.GetItemState( pEntry->nWID, false ) )
+ {
+ case SfxItemState::SET:
+ eState = PropertyState_DIRECT_VALUE;
+ break;
+ case SfxItemState::DEFAULT:
+ eState = PropertyState_DEFAULT_VALUE;
+ break;
+ default:
+ eState = PropertyState_AMBIGUOUS_VALUE;
+ break;
+ }
+
+ // if an item is set, this doesn't mean we want it :)
+ if( PropertyState_DIRECT_VALUE == eState )
+ {
+ switch( pEntry->nWID )
+ {
+ case XATTR_FILLBITMAP:
+ case XATTR_FILLGRADIENT:
+ case XATTR_FILLHATCH:
+ case XATTR_FILLFLOATTRANSPARENCE:
+ case XATTR_LINEEND:
+ case XATTR_LINESTART:
+ case XATTR_LINEDASH:
+ {
+ const NameOrIndex* pItem = rStyleSet.GetItem<NameOrIndex>(pEntry->nWID);
+ if( ( pItem == nullptr ) || pItem->GetName().isEmpty() )
+ eState = PropertyState_DEFAULT_VALUE;
+ }
+ break;
+ case XATTR_FILLCOLOR:
+ if (pEntry->nMemberId == MID_COLOR_THEME_INDEX)
+ {
+ const XFillColorItem* pColor = rStyleSet.GetItem<XFillColorItem>(pEntry->nWID);
+ if (pColor->GetThemeColor().GetThemeIndex() == -1)
+ {
+ eState = PropertyState_DEFAULT_VALUE;
+ }
+ }
+ else if (pEntry->nMemberId == MID_COLOR_LUM_MOD)
+ {
+ const XFillColorItem* pColor = rStyleSet.GetItem<XFillColorItem>(pEntry->nWID);
+ if (pColor->GetThemeColor().GetLumMod() == 10000)
+ {
+ eState = PropertyState_DEFAULT_VALUE;
+ }
+ }
+ else if (pEntry->nMemberId == MID_COLOR_LUM_OFF)
+ {
+ const XFillColorItem* pColor = rStyleSet.GetItem<XFillColorItem>(pEntry->nWID);
+ if (pColor->GetThemeColor().GetLumOff() == 0)
+ {
+ eState = PropertyState_DEFAULT_VALUE;
+ }
+ }
+ break;
+ }
+ }
+
+ return eState;
+ }
+}
+
+Sequence< PropertyState > SAL_CALL SdStyleSheet::getPropertyStates( const Sequence< OUString >& aPropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ sal_Int32 nCount = aPropertyName.getLength();
+
+ Sequence< PropertyState > aPropertyStateSequence( nCount );
+
+ std::transform(aPropertyName.begin(), aPropertyName.end(), aPropertyStateSequence.getArray(),
+ [this](const OUString& rName) -> PropertyState { return getPropertyState(rName); });
+
+ return aPropertyStateSequence;
+}
+
+void SAL_CALL SdStyleSheet::setPropertyToDefault( const OUString& PropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry( PropertyName );
+ if( pEntry == nullptr )
+ throw UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this));
+
+ SfxItemSet &rStyleSet = GetItemSet();
+
+ if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
+ {
+ rStyleSet.ClearItem( XATTR_FILLBMP_STRETCH );
+ rStyleSet.ClearItem( XATTR_FILLBMP_TILE );
+ }
+ else
+ {
+ rStyleSet.ClearItem( pEntry->nWID );
+ }
+ Broadcast(SfxHint(SfxHintId::DataChanged));
+}
+
+Any SAL_CALL SdStyleSheet::getPropertyDefault( const OUString& aPropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry( aPropertyName );
+ if( pEntry == nullptr )
+ throw UnknownPropertyException( aPropertyName, static_cast<cppu::OWeakObject*>(this));
+ Any aRet;
+ if( pEntry->nWID == WID_STYLE_FAMILY )
+ {
+ aRet <<= GetFamilyString(nFamily);
+ }
+ else if( pEntry->nWID == SDRATTR_TEXTDIRECTION )
+ {
+ aRet <<= false;
+ }
+ else if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
+ {
+ aRet <<= BitmapMode_REPEAT;
+ }
+ else
+ {
+ SfxItemPool& rMyPool = GetPool()->GetPool();
+ SfxItemSet aSet( rMyPool, pEntry->nWID, pEntry->nWID);
+ aSet.Put( rMyPool.GetDefaultItem( pEntry->nWID ) );
+ aRet = SvxItemPropertySet_getPropertyValue( pEntry, aSet );
+ }
+ return aRet;
+}
+
+/** this is used because our property map is not sorted yet */
+const SfxItemPropertyMapEntry* SdStyleSheet::getPropertyMapEntry( std::u16string_view rPropertyName )
+{
+ return GetStylePropertySet().getPropertyMapEntry(rPropertyName);
+}
+
+//Broadcast that a SdStyleSheet has changed, taking into account outline sublevels
+//which need to be explicitly broadcast as changing if their parent style was
+//the one that changed
+void SdStyleSheet::BroadcastSdStyleSheetChange(SfxStyleSheetBase const * pStyleSheet,
+ PresentationObjects ePO, SfxStyleSheetBasePool* pSSPool)
+{
+ SdStyleSheet* pRealSheet = static_cast<SdStyleSheet const *>(pStyleSheet)->GetRealStyleSheet();
+ pRealSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+
+ if( (ePO < PresentationObjects::Outline_1) || (ePO > PresentationObjects::Outline_8) )
+ return;
+
+ OUString sStyleName(SdResId(STR_PSEUDOSHEET_OUTLINE) + " ");
+
+ for( sal_uInt16 n = static_cast<sal_uInt16>(ePO) - static_cast<sal_uInt16>(PresentationObjects::Outline_1) + 2; n < 10; n++ )
+ {
+ OUString aName( sStyleName + OUString::number(n) );
+
+ SfxStyleSheetBase* pSheet = pSSPool->Find( aName, SfxStyleFamily::Pseudo);
+
+ if(pSheet)
+ {
+ SdStyleSheet* pRealStyleSheet = static_cast<SdStyleSheet*>(pSheet)->GetRealStyleSheet();
+ pRealStyleSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+ }
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/text/textapi.cxx b/sd/source/core/text/textapi.cxx
new file mode 100644
index 000000000..2499588f8
--- /dev/null
+++ b/sd/source/core/text/textapi.cxx
@@ -0,0 +1,278 @@
+/* -*- 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 <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/lang/Locale.hpp>
+#include <com/sun/star/text/XTextField.hpp>
+
+#include <textapi.hxx>
+#include <drawdoc.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/editeng.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/unoforou.hxx>
+#include <editeng/unoprnms.hxx>
+#include <editeng/unoipset.hxx>
+#include <Outliner.hxx>
+#include <svx/svdpool.hxx>
+#include <svx/svdundo.hxx>
+
+namespace com::sun::star::container { class XNameContainer; }
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::text;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+
+namespace sd {
+
+namespace {
+
+class UndoTextAPIChanged : public SdrUndoAction
+{
+public:
+ UndoTextAPIChanged( SdrModel& rModel, TextApiObject* pTextObj );
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+protected:
+ std::optional<OutlinerParaObject> mpOldText;
+ std::optional<OutlinerParaObject> mpNewText;
+ rtl::Reference< TextApiObject > mxTextObj;
+};
+
+}
+
+UndoTextAPIChanged::UndoTextAPIChanged(SdrModel& rModel, TextApiObject* pTextObj )
+: SdrUndoAction( rModel )
+, mpOldText( pTextObj->CreateText() )
+, mxTextObj( pTextObj )
+{
+}
+
+void UndoTextAPIChanged::Undo()
+{
+ if( !mpNewText )
+ mpNewText = mxTextObj->CreateText();
+
+ mxTextObj->SetText( *mpOldText );
+}
+
+void UndoTextAPIChanged::Redo()
+{
+ if( mpNewText )
+ {
+ mxTextObj->SetText( *mpNewText );
+ }
+}
+
+namespace {
+
+struct TextAPIEditSource_Impl
+{
+ SdDrawDocument* mpDoc;
+ Outliner* mpOutliner;
+ SvxOutlinerForwarder* mpTextForwarder;
+};
+
+}
+
+class TextAPIEditSource : public SvxEditSource
+{
+ // refcounted
+ std::shared_ptr<TextAPIEditSource_Impl> m_xImpl;
+
+ virtual std::unique_ptr<SvxEditSource> Clone() const override;
+ virtual SvxTextForwarder* GetTextForwarder() override;
+ virtual void UpdateData() override;
+ explicit TextAPIEditSource( const TextAPIEditSource& rSource );
+
+public:
+ explicit TextAPIEditSource(SdDrawDocument* pDoc);
+
+ void Dispose();
+ void SetText( OutlinerParaObject const & rText );
+ std::optional<OutlinerParaObject> CreateText();
+ OUString GetText() const;
+ SdDrawDocument* GetDoc() { return m_xImpl->mpDoc; }
+};
+
+static const SvxItemPropertySet* ImplGetSdTextPortionPropertyMap()
+{
+ static const SfxItemPropertyMapEntry aSdTextPortionPropertyEntries[] =
+ {
+ SVX_UNOEDIT_CHAR_PROPERTIES,
+ SVX_UNOEDIT_FONT_PROPERTIES,
+ SVX_UNOEDIT_OUTLINER_PROPERTIES,
+ SVX_UNOEDIT_PARA_PROPERTIES,
+ {u"TextField", EE_FEATURE_FIELD, cppu::UnoType<XTextField>::get(), PropertyAttribute::READONLY, 0 },
+ {u"TextPortionType", WID_PORTIONTYPE, ::cppu::UnoType<OUString>::get(), PropertyAttribute::READONLY, 0 },
+ {u"TextUserDefinedAttributes", EE_CHAR_XMLATTRIBS, cppu::UnoType<XNameContainer>::get(), 0, 0},
+ {u"ParaUserDefinedAttributes", EE_PARA_XMLATTRIBS, cppu::UnoType<XNameContainer>::get(), 0, 0},
+ { u"", 0, css::uno::Type(), 0, 0 }
+ };
+ static SvxItemPropertySet aSdTextPortionPropertyMap( aSdTextPortionPropertyEntries, SdrObject::GetGlobalDrawObjectItemPool() );
+
+ return &aSdTextPortionPropertyMap;
+}
+
+TextApiObject::TextApiObject( std::unique_ptr<TextAPIEditSource> pEditSource )
+: SvxUnoText( pEditSource.get(), ImplGetSdTextPortionPropertyMap(), Reference < XText >() )
+, mpSource(std::move(pEditSource))
+{
+}
+
+TextApiObject::~TextApiObject() noexcept
+{
+ dispose();
+}
+
+rtl::Reference< TextApiObject > TextApiObject::create( SdDrawDocument* pDoc )
+{
+ rtl::Reference< TextApiObject > xRet( new TextApiObject( std::make_unique<TextAPIEditSource>( pDoc ) ) );
+ return xRet;
+}
+
+void TextApiObject::dispose()
+{
+ if( mpSource )
+ {
+ mpSource->Dispose();
+ mpSource.reset();
+ }
+
+}
+
+std::optional<OutlinerParaObject> TextApiObject::CreateText()
+{
+ return mpSource->CreateText();
+}
+
+void TextApiObject::SetText( OutlinerParaObject const & rText )
+{
+ SdrModel* pModel = mpSource->GetDoc();
+ if( pModel && pModel->IsUndoEnabled() )
+ pModel->AddUndo( std::make_unique<UndoTextAPIChanged>( *pModel, this ) );
+
+ mpSource->SetText( rText );
+ maSelection.nStartPara = EE_PARA_MAX_COUNT;
+}
+
+OUString TextApiObject::GetText() const
+{
+ return mpSource->GetText();
+}
+
+TextApiObject* TextApiObject::getImplementation( const css::uno::Reference< css::text::XText >& xText )
+{
+ TextApiObject* pImpl = dynamic_cast< TextApiObject* >( xText.get() );
+
+ if( !pImpl )
+ pImpl = dynamic_cast< TextApiObject* >( comphelper::getFromUnoTunnel<SvxUnoTextBase>( xText ) );
+
+ return pImpl;
+}
+
+TextAPIEditSource::TextAPIEditSource(const TextAPIEditSource& rSource)
+ : SvxEditSource(*this)
+ , m_xImpl(rSource.m_xImpl) // shallow copy; uses internal refcounting
+{
+}
+
+std::unique_ptr<SvxEditSource> TextAPIEditSource::Clone() const
+{
+ return std::unique_ptr<SvxEditSource>(new TextAPIEditSource( *this ));
+}
+
+void TextAPIEditSource::UpdateData()
+{
+ // data is kept in outliner all the time
+}
+
+TextAPIEditSource::TextAPIEditSource(SdDrawDocument* pDoc)
+: m_xImpl(std::make_shared<TextAPIEditSource_Impl>())
+{
+ m_xImpl->mpDoc = pDoc;
+ m_xImpl->mpOutliner = nullptr;
+ m_xImpl->mpTextForwarder = nullptr;
+}
+
+void TextAPIEditSource::Dispose()
+{
+ m_xImpl->mpDoc=nullptr;
+ delete m_xImpl->mpTextForwarder;
+ m_xImpl->mpTextForwarder = nullptr;
+
+ delete m_xImpl->mpOutliner;
+ m_xImpl->mpOutliner = nullptr;
+}
+
+SvxTextForwarder* TextAPIEditSource::GetTextForwarder()
+{
+ if(!m_xImpl->mpDoc)
+ return nullptr; // mpDoc == 0 can be used to flag this as disposed
+
+ if (!m_xImpl->mpOutliner)
+ {
+ //init draw model first
+ m_xImpl->mpOutliner = new SdOutliner(m_xImpl->mpDoc, OutlinerMode::TextObject);
+ SdDrawDocument::SetCalcFieldValueHdl(m_xImpl->mpOutliner);
+ }
+
+ if (!m_xImpl->mpTextForwarder)
+ m_xImpl->mpTextForwarder = new SvxOutlinerForwarder(*m_xImpl->mpOutliner, false);
+
+ return m_xImpl->mpTextForwarder;
+}
+
+void TextAPIEditSource::SetText( OutlinerParaObject const & rText )
+{
+ if (m_xImpl->mpDoc)
+ {
+ if (!m_xImpl->mpOutliner)
+ {
+ //init draw model first
+ m_xImpl->mpOutliner = new SdOutliner(m_xImpl->mpDoc, OutlinerMode::TextObject);
+ SdDrawDocument::SetCalcFieldValueHdl(m_xImpl->mpOutliner);
+ }
+
+ m_xImpl->mpOutliner->SetText( rText );
+ }
+}
+
+std::optional<OutlinerParaObject> TextAPIEditSource::CreateText()
+{
+ if (m_xImpl->mpDoc && m_xImpl->mpOutliner)
+ return m_xImpl->mpOutliner->CreateParaObject();
+ else
+ return std::nullopt;
+}
+
+OUString TextAPIEditSource::GetText() const
+{
+ if (m_xImpl->mpDoc && m_xImpl->mpOutliner)
+ return m_xImpl->mpOutliner->GetEditEngine().GetText();
+ else
+ return OUString();
+}
+
+} // namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/typemap.cxx b/sd/source/core/typemap.cxx
new file mode 100644
index 000000000..4378ad2d2
--- /dev/null
+++ b/sd/source/core/typemap.cxx
@@ -0,0 +1,143 @@
+/* -*- 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 <config_options.h>
+
+#include <editeng/cmapitem.hxx>
+#include <editeng/langitem.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/colritem.hxx>
+#include <editeng/contouritem.hxx>
+#include <editeng/shdditem.hxx>
+#include <editeng/crossedoutitem.hxx>
+#include <editeng/udlnitem.hxx>
+#include <editeng/wghtitem.hxx>
+#include <editeng/postitem.hxx>
+#include <editeng/fontitem.hxx>
+#include <editeng/tstpitem.hxx>
+#include <editeng/kernitem.hxx>
+#include <editeng/lspcitem.hxx>
+#include <editeng/ulspitem.hxx>
+#include <editeng/lrspitem.hxx>
+#include <editeng/protitem.hxx>
+#include <svx/chrtitem.hxx>
+#include <sfx2/msg.hxx>
+#include <svl/globalnameitem.hxx>
+#include <svx/hlnkitem.hxx>
+#include <svx/postattr.hxx>
+#include <svx/rulritem.hxx>
+#include <svx/clipfmtitem.hxx>
+#include <svl/srchitem.hxx>
+#include <editeng/sizeitem.hxx>
+#include <sfx2/zoomitem.hxx>
+#include <svx/pageitem.hxx>
+#include <svx/sdooitm.hxx>
+#include <svx/sdtfsitm.hxx>
+#include <svx/sdprcitm.hxx>
+#include <svx/sdmetitm.hxx>
+#include <editeng/boxitem.hxx>
+#include <editeng/lineitem.hxx>
+#include <svx/zoomslideritem.hxx>
+#include <editeng/memberids.h>
+#include <svx/unomid.hxx>
+#include <svx/xftstit.hxx>
+#include <svx/xlnwtit.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/xlnclit.hxx>
+#include <svx/xlndsit.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xlnedit.hxx>
+#include <svx/xlnstit.hxx>
+#include <svx/xflhtit.hxx>
+#include <svx/xbtmpit.hxx>
+#include <svx/xtextit0.hxx>
+#include <svx/xftadit.hxx>
+#include <svx/xftdiit.hxx>
+#include <svx/xftmrit.hxx>
+#include <svx/xftouit.hxx>
+#include <svx/xftshit.hxx>
+#include <svx/xftshcit.hxx>
+#include <svx/xftshxy.hxx>
+#include <avmedia/mediaitem.hxx>
+#include <svx/drawitem.hxx>
+
+// #UndoRedo#
+#include <svl/slstitm.hxx>
+
+#include <svl/lckbitem.hxx>
+
+#define avmedia_MediaItem ::avmedia::MediaItem
+#include <sfx2/tplpitem.hxx>
+#include <svl/ptitem.hxx>
+#include <svl/rectitem.hxx>
+
+#include <sfx2/frame.hxx>
+#include <svx/xlncapit.hxx>
+#include <svx/xflftrit.hxx>
+#include <svx/xlinjoit.hxx>
+#include <svx/galleryitem.hxx>
+#include <svx/sdangitm.hxx>
+
+#ifdef DISABLE_DYNLOADING
+/* Avoid clash with the ones from svx/source/form/typemap.cxx */
+#define aSfxBoolItem_Impl sd_source_core_typemap_aSfxBoolItem_Impl
+#define aSfxInt32Item_Impl sd_source_core_typemap_aSfxInt32Item_Impl
+#define aSfxStringItem_Impl sd_source_core_typemap_aSfxStringItem_Impl
+#define aSfxUInt16Item_Impl sd_source_core_typemap_aSfxUInt16Item_Impl
+#define aSfxUInt32Item_Impl sd_source_core_typemap_aSfxUInt32Item_Impl
+#define aSfxVoidItem_Impl sd_source_core_typemap_aSfxVoidItem_Impl
+#define aSvxClipboardFormatItem_Impl sd_source_core_typemap_aSvxClipboardFormatItem_Impl
+#define aSvxColorItem_Impl sd_source_core_typemap_aSvxColorItem_Impl
+#define aSvxContourItem_Impl sd_source_core_typemap_aSvxContourItem_Impl
+#define aSvxCrossedOutItem_Impl sd_source_core_typemap_aSvxCrossedOutItem_Impl
+#define aSvxFontHeightItem_Impl sd_source_core_typemap_aSvxFontHeightItem_Impl
+#define aSvxFontItem_Impl sd_source_core_typemap_aSvxFontItem_Impl
+#define aSvxLanguageItem_Impl sd_source_core_typemap_aSvxLanguageItem_Impl
+#define aSvxPostureItem_Impl sd_source_core_typemap_aSvxPostureItem_Impl
+#define aSvxShadowedItem_Impl sd_source_core_typemap_aSvxShadowedItem_Impl
+#define aSvxUnderlineItem_Impl sd_source_core_typemap_aSvxUnderlineItem_Impl
+#define aSvxOverlineItem_Impl sd_source_core_typemap_aSvxOverlineItem_Impl
+#define aSvxWeightItem_Impl sd_source_core_typemap_aSvxWeightItem_Impl
+#endif
+
+#define SFX_TYPEMAP
+#include <sdslots.hxx>
+
+#ifdef DISABLE_DYNLOADING
+#undef aSfxBoolItem_Impl
+#undef aSfxInt32Item_Impl
+#undef aSfxStringItem_Impl
+#undef aSfxUInt16Item_Impl
+#undef aSfxUInt32Item_Impl
+#undef aSfxVoidItem_Impl
+#undef aSvxClipboardFormatItem_Impl
+#undef aSvxColorItem_Impl
+#undef aSvxContourItem_Impl
+#undef aSvxCrossedOutItem_Impl
+#undef aSvxFontHeightItem_Impl
+#undef aSvxFontItem_Impl
+#undef aSvxLanguageItem_Impl
+#undef aSvxPostureItem_Impl
+#undef aSvxShadowedItem_Impl
+#undef aSvxTextLineItem_Impl
+#undef aSvxWeightItem_Impl
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/undo/undofactory.cxx b/sd/source/core/undo/undofactory.cxx
new file mode 100644
index 000000000..c87433b81
--- /dev/null
+++ b/sd/source/core/undo/undofactory.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/.
+ *
+ * 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 <undo/undofactory.hxx>
+#include <undo/undoobjects.hxx>
+
+using namespace sd;
+
+std::unique_ptr<SdrUndoAction> UndoFactory::CreateUndoRemoveObject(SdrObject& rObject)
+{
+ return std::make_unique<UndoRemoveObject>(rObject);
+}
+
+std::unique_ptr<SdrUndoAction> UndoFactory::CreateUndoDeleteObject( SdrObject& rObject, bool bOrdNumDirect )
+{
+ return std::make_unique<UndoDeleteObject>( rObject, bOrdNumDirect );
+}
+
+std::unique_ptr<SdrUndoAction> UndoFactory::CreateUndoObjectSetText( SdrObject& rNewObj, sal_Int32 nText )
+{
+ return std::make_unique<UndoObjectSetText>( rNewObj, nText );
+}
+
+std::unique_ptr<SdrUndoAction> UndoFactory::CreateUndoReplaceObject( SdrObject& rOldObject, SdrObject& rNewObject )
+{
+ return std::make_unique<UndoReplaceObject>( rOldObject, rNewObject );
+}
+
+std::unique_ptr<SdrUndoAction> UndoFactory::CreateUndoGeoObject( SdrObject& rObject )
+{
+ return std::make_unique<UndoGeoObject>( rObject );
+}
+
+std::unique_ptr<SdrUndoAction> UndoFactory::CreateUndoAttrObject( SdrObject& rObject, bool bStyleSheet1, bool bSaveText )
+{
+ return std::make_unique<UndoAttrObject>( rObject, bStyleSheet1, bSaveText );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/undo/undomanager.cxx b/sd/source/core/undo/undomanager.cxx
new file mode 100644
index 000000000..672fe00e1
--- /dev/null
+++ b/sd/source/core/undo/undomanager.cxx
@@ -0,0 +1,58 @@
+/* -*- 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 <undo/undomanager.hxx>
+
+using namespace sd;
+
+UndoManager::UndoManager()
+ : mpLinkedUndoManager(nullptr)
+{
+}
+
+void UndoManager::EnterListAction(const OUString &rComment, const OUString& rRepeatComment, sal_uInt16 nId, ViewShellId nViewShellId)
+{
+ if( !IsDoing() )
+ {
+ ClearLinkedRedoActions();
+ SdrUndoManager::EnterListAction( rComment, rRepeatComment, nId, nViewShellId );
+ }
+}
+
+void UndoManager::AddUndoAction( std::unique_ptr<SfxUndoAction> pAction, bool bTryMerg /* = sal_False */ )
+{
+ if( !IsDoing() )
+ {
+ ClearLinkedRedoActions();
+ SdrUndoManager::AddUndoAction( std::move(pAction), bTryMerg );
+ }
+}
+
+void UndoManager::SetLinkedUndoManager (SfxUndoManager* pLinkedUndoManager)
+{
+ mpLinkedUndoManager = pLinkedUndoManager;
+}
+
+void UndoManager::ClearLinkedRedoActions()
+{
+ if (mpLinkedUndoManager != nullptr)
+ mpLinkedUndoManager->ClearRedo();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/undo/undoobjects.cxx b/sd/source/core/undo/undoobjects.cxx
new file mode 100644
index 000000000..f586dac21
--- /dev/null
+++ b/sd/source/core/undo/undoobjects.cxx
@@ -0,0 +1,392 @@
+/* -*- 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 <tools/debug.hxx>
+#include <undo/undoobjects.hxx>
+#include <sdpage.hxx>
+#include <CustomAnimationEffect.hxx>
+#include <drawdoc.hxx>
+#include <undoanim.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <DrawDocShell.hxx>
+
+using namespace sd;
+
+SdUndoAction::SdUndoAction(SdDrawDocument* pSdDrawDocument)
+ : mpDoc(pSdDrawDocument),
+ mnViewShellId(-1)
+{
+ sd::DrawDocShell* pDocShell = pSdDrawDocument ? pSdDrawDocument->GetDocSh() : nullptr;
+ sd::ViewShell* pViewShell = pDocShell ? pDocShell->GetViewShell() : nullptr;
+ if (pViewShell)
+ mnViewShellId = pViewShell->GetViewShellBase().GetViewShellId();
+}
+
+ViewShellId SdUndoAction::GetViewShellId() const
+{
+ return mnViewShellId;
+}
+
+UndoRemovePresObjectImpl::UndoRemovePresObjectImpl( SdrObject& rObject )
+{
+ SdPage* pPage = dynamic_cast< SdPage* >( rObject.getSdrPageFromSdrObject() );
+ if( !pPage )
+ return;
+
+ if( pPage->IsPresObj(&rObject) )
+ mpUndoPresObj.reset( new UndoObjectPresentationKind( rObject ) );
+ if( rObject.GetUserCall() )
+ mpUndoUsercall.reset( new UndoObjectUserCall(rObject) );
+
+ if( pPage->hasAnimationNode() )
+ {
+ css::uno::Reference< css::drawing::XShape > xShape( rObject.getUnoShape(), css::uno::UNO_QUERY );
+ if( pPage->getMainSequence()->hasEffect( xShape ) )
+ {
+ mpUndoAnimation.reset(
+ new UndoAnimation( // TTTT may use ref? Or just *SdrPage?
+ static_cast< SdDrawDocument* >(&pPage->getSdrModelFromSdrPage()),
+ pPage));
+ }
+ }
+}
+
+UndoRemovePresObjectImpl::~UndoRemovePresObjectImpl()
+{
+}
+
+void UndoRemovePresObjectImpl::Undo()
+{
+ if( mpUndoUsercall )
+ mpUndoUsercall->Undo();
+ if( mpUndoPresObj )
+ mpUndoPresObj->Undo();
+ if( mpUndoAnimation )
+ mpUndoAnimation->Undo();
+}
+
+void UndoRemovePresObjectImpl::Redo()
+{
+ if( mpUndoAnimation )
+ mpUndoAnimation->Redo();
+ if( mpUndoPresObj )
+ mpUndoPresObj->Redo();
+ if( mpUndoUsercall )
+ mpUndoUsercall->Redo();
+}
+
+UndoRemoveObject::UndoRemoveObject( SdrObject& rObject )
+: SdrUndoRemoveObj( rObject ), UndoRemovePresObjectImpl( rObject )
+, mxSdrObject(&rObject)
+{
+}
+
+void UndoRemoveObject::Undo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoRemoveObject::Undo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ SdrUndoRemoveObj::Undo();
+ UndoRemovePresObjectImpl::Undo();
+ }
+}
+
+void UndoRemoveObject::Redo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoRemoveObject::Redo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ UndoRemovePresObjectImpl::Redo();
+ SdrUndoRemoveObj::Redo();
+ }
+}
+
+UndoDeleteObject::UndoDeleteObject( SdrObject& rObject, bool bOrdNumDirect )
+: SdrUndoDelObj( rObject, bOrdNumDirect )
+, UndoRemovePresObjectImpl( rObject )
+, mxSdrObject(&rObject)
+{
+}
+
+void UndoDeleteObject::Undo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoDeleteObject::Undo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ SdrUndoDelObj::Undo();
+ UndoRemovePresObjectImpl::Undo();
+ }
+}
+
+void UndoDeleteObject::Redo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoDeleteObject::Redo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ UndoRemovePresObjectImpl::Redo();
+ SdrUndoDelObj::Redo();
+ }
+}
+
+UndoReplaceObject::UndoReplaceObject( SdrObject& rOldObject, SdrObject& rNewObject )
+: SdrUndoReplaceObj( rOldObject, rNewObject )
+, UndoRemovePresObjectImpl( rOldObject )
+, mxSdrObject( &rOldObject )
+{
+}
+
+void UndoReplaceObject::Undo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoReplaceObject::Undo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ SdrUndoReplaceObj::Undo();
+ UndoRemovePresObjectImpl::Undo();
+ }
+}
+
+void UndoReplaceObject::Redo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoReplaceObject::Redo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ UndoRemovePresObjectImpl::Redo();
+ SdrUndoReplaceObj::Redo();
+ }
+}
+
+UndoObjectSetText::UndoObjectSetText( SdrObject& rObject, sal_Int32 nText )
+: SdrUndoObjSetText( rObject, nText )
+, mbNewEmptyPresObj(false)
+, mxSdrObject( &rObject )
+{
+ SdPage* pPage = dynamic_cast< SdPage* >( rObject.getSdrPageFromSdrObject() );
+ if( pPage && pPage->hasAnimationNode() )
+ {
+ css::uno::Reference< css::drawing::XShape > xShape( rObject.getUnoShape(), css::uno::UNO_QUERY );
+ if( pPage->getMainSequence()->hasEffect( xShape ) )
+ {
+ mpUndoAnimation.reset(
+ new UndoAnimation(
+ static_cast< SdDrawDocument* >(&pPage->getSdrModelFromSdrPage()),
+ pPage));
+ }
+ }
+}
+
+UndoObjectSetText::~UndoObjectSetText()
+{
+}
+
+void UndoObjectSetText::Undo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoObjectSetText::Undo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ mbNewEmptyPresObj = mxSdrObject->IsEmptyPresObj();
+ SdrUndoObjSetText::Undo();
+ if( mpUndoAnimation )
+ mpUndoAnimation->Undo();
+ }
+}
+
+void UndoObjectSetText::Redo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoObjectSetText::Redo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ if( mpUndoAnimation )
+ mpUndoAnimation->Redo();
+ SdrUndoObjSetText::Redo();
+ mxSdrObject->SetEmptyPresObj(mbNewEmptyPresObj);
+ }
+}
+
+// Undo for SdrObject::SetUserCall()
+
+UndoObjectUserCall::UndoObjectUserCall(SdrObject& rObject)
+: SdrUndoObj(rObject)
+, mpOldUserCall(static_cast<SdPage*>(rObject.GetUserCall()))
+, mpNewUserCall(nullptr)
+, mxSdrObject( &rObject )
+{
+}
+
+void UndoObjectUserCall::Undo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoObjectUserCall::Undo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ mpNewUserCall = mxSdrObject->GetUserCall();
+ mxSdrObject->SetUserCall(mpOldUserCall);
+ }
+}
+
+void UndoObjectUserCall::Redo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoObjectUserCall::Redo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ mxSdrObject->SetUserCall(mpNewUserCall);
+ }
+}
+
+// Undo for SdPage::InsertPresObj() and SdPage::RemovePresObj()
+
+UndoObjectPresentationKind::UndoObjectPresentationKind(SdrObject& rObject)
+: SdrUndoObj(rObject)
+, meOldKind(PresObjKind::NONE)
+, meNewKind(PresObjKind::NONE)
+, mxPage( static_cast<SdPage*>(rObject.getSdrPageFromSdrObject()) )
+, mxSdrObject( &rObject )
+{
+ DBG_ASSERT( mxPage.get(), "sd::UndoObjectPresentationKind::UndoObjectPresentationKind(), does not work for shapes without a slide!" );
+
+ if( auto pPage = mxPage.get() )
+ meOldKind = pPage->GetPresObjKind( &rObject );
+}
+
+void UndoObjectPresentationKind::Undo()
+{
+ if( !mxSdrObject.is() )
+ return;
+ if( rtl::Reference<SdPage> pPage = mxPage.get() )
+ {
+ meNewKind = pPage->GetPresObjKind( mxSdrObject.get() );
+ if( meNewKind != PresObjKind::NONE )
+ pPage->RemovePresObj( mxSdrObject.get() );
+ if( meOldKind != PresObjKind::NONE )
+ pPage->InsertPresObj( mxSdrObject.get(), meOldKind );
+ }
+}
+
+void UndoObjectPresentationKind::Redo()
+{
+ if( !mxSdrObject.is() )
+ return;
+ if( rtl::Reference<SdPage> pPage = mxPage.get() )
+ {
+ if( meOldKind != PresObjKind::NONE )
+ pPage->RemovePresObj( mxSdrObject.get() );
+ if( meNewKind != PresObjKind::NONE )
+ pPage->InsertPresObj( mxSdrObject.get(), meNewKind );
+ }
+}
+
+UndoAutoLayoutPosAndSize::UndoAutoLayoutPosAndSize( SdPage& rPage )
+: mxPage( &rPage )
+{
+}
+
+void UndoAutoLayoutPosAndSize::Undo()
+{
+ // do nothing
+}
+
+void UndoAutoLayoutPosAndSize::Redo()
+{
+ rtl::Reference<SdPage> pPage = mxPage.get();
+ if( pPage )
+ pPage->SetAutoLayout( pPage->GetAutoLayout() );
+}
+
+UndoGeoObject::UndoGeoObject( SdrObject& rNewObj )
+: SdrUndoGeoObj( rNewObj )
+, mxPage( static_cast<SdPage*>(rNewObj.getSdrPageFromSdrObject()) )
+, mxSdrObject( &rNewObj )
+{
+}
+
+void UndoGeoObject::Undo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoGeoObject::Undo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ if( auto pPage = mxPage.get() )
+ {
+ ScopeLockGuard aGuard( pPage->maLockAutoLayoutArrangement );
+ SdrUndoGeoObj::Undo();
+ }
+ else
+ {
+ SdrUndoGeoObj::Undo();
+ }
+ }
+}
+
+void UndoGeoObject::Redo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoGeoObject::Redo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ if( auto pPage = mxPage.get() )
+ {
+ ScopeLockGuard aGuard( pPage->maLockAutoLayoutArrangement );
+ SdrUndoGeoObj::Redo();
+ }
+ else
+ {
+ SdrUndoGeoObj::Redo();
+ }
+ }
+}
+
+UndoAttrObject::UndoAttrObject( SdrObject& rObject, bool bStyleSheet1, bool bSaveText )
+: SdrUndoAttrObj( rObject, bStyleSheet1, bSaveText )
+, mxPage( static_cast<SdPage*>(rObject.getSdrPageFromSdrObject()) )
+, mxSdrObject( &rObject )
+{
+}
+
+void UndoAttrObject::Undo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoAttrObject::Undo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ if( auto pPage = mxPage.get() )
+ {
+ ScopeLockGuard aGuard( pPage->maLockAutoLayoutArrangement );
+ SdrUndoAttrObj::Undo();
+ }
+ else
+ {
+ SdrUndoAttrObj::Undo();
+ }
+ }
+}
+
+void UndoAttrObject::Redo()
+{
+ DBG_ASSERT( mxSdrObject.is(), "sd::UndoAttrObject::Redo(), object already dead!" );
+ if( mxSdrObject.is() )
+ {
+ if( auto pPage = mxPage.get() )
+ {
+ ScopeLockGuard aGuard( pPage->maLockAutoLayoutArrangement );
+ SdrUndoAttrObj::Redo();
+ }
+ else
+ {
+ SdrUndoAttrObj::Redo();
+ }
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/core/undoanim.cxx b/sd/source/core/undoanim.cxx
new file mode 100644
index 000000000..64b233322
--- /dev/null
+++ b/sd/source/core/undoanim.cxx
@@ -0,0 +1,280 @@
+/* -*- 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 <CustomAnimationCloner.hxx>
+
+#include <undoanim.hxx>
+#include <strings.hrc>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <CustomAnimationEffect.hxx>
+#include <drawdoc.hxx>
+#include <tools/diagnose_ex.h>
+
+namespace com::sun::star::animations { class XAnimationNode; }
+
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::Exception;
+using namespace ::com::sun::star::animations;
+
+namespace sd
+{
+
+struct UndoAnimationImpl
+{
+ SdPage* mpPage;
+ Reference< XAnimationNode > mxOldNode;
+ Reference< XAnimationNode > mxNewNode;
+ bool mbNewNodeSet;
+};
+
+UndoAnimation::UndoAnimation( SdDrawDocument* pDoc, SdPage* pThePage )
+: SdrUndoAction( *pDoc ), mpImpl( new UndoAnimationImpl )
+{
+ mpImpl->mpPage = pThePage;
+ mpImpl->mbNewNodeSet = false;
+
+ try
+ {
+ if( pThePage->mxAnimationNode.is() )
+ mpImpl->mxOldNode = ::sd::Clone( pThePage->getAnimationNode() );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::UndoAnimation::UndoAnimation()");
+ }
+}
+
+UndoAnimation::~UndoAnimation()
+{
+}
+
+void UndoAnimation::Undo()
+{
+ try
+ {
+ if( !mpImpl->mbNewNodeSet )
+ {
+ if( mpImpl->mpPage->mxAnimationNode.is() )
+ mpImpl->mxNewNode.set( ::sd::Clone( mpImpl->mpPage->mxAnimationNode ) );
+ mpImpl->mbNewNodeSet = true;
+ }
+
+ Reference< XAnimationNode > xOldNode;
+ if( mpImpl->mxOldNode.is() )
+ xOldNode = ::sd::Clone( mpImpl->mxOldNode );
+
+ mpImpl->mpPage->setAnimationNode( xOldNode );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::UndoAnimation::Undo()");
+ }
+}
+
+void UndoAnimation::Redo()
+{
+ try
+ {
+ Reference< XAnimationNode > xNewNode;
+ if( mpImpl->mxNewNode.is() )
+ xNewNode = ::sd::Clone( mpImpl->mxNewNode );
+ mpImpl->mpPage->setAnimationNode( xNewNode );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::UndoAnimation::Redo()");
+ }
+}
+
+OUString UndoAnimation::GetComment() const
+{
+ return SdResId(STR_UNDO_ANIMATION);
+}
+
+struct UndoAnimationPathImpl
+{
+ SdPage* mpPage;
+ sal_Int32 mnEffectOffset;
+ OUString msUndoPath;
+ OUString msRedoPath;
+
+ UndoAnimationPathImpl( SdPage* pThePage, const css::uno::Reference< css::animations::XAnimationNode >& xNode )
+ : mpPage( pThePage )
+ , mnEffectOffset( -1 )
+ {
+ if( !(mpPage && xNode.is()) )
+ return;
+
+ std::shared_ptr< sd::MainSequence > pMainSequence( mpPage->getMainSequence() );
+ if( pMainSequence )
+ {
+ CustomAnimationEffectPtr pEffect( pMainSequence->findEffect( xNode ) );
+ if( pEffect )
+ {
+ mnEffectOffset = pMainSequence->getOffsetFromEffect( pEffect );
+ msUndoPath = pEffect->getPath();
+ }
+ }
+ }
+ UndoAnimationPathImpl(const UndoAnimationPathImpl&) = delete;
+ UndoAnimationPathImpl& operator=(const UndoAnimationPathImpl&) = delete;
+
+ CustomAnimationEffectPtr getEffect() const
+ {
+ CustomAnimationEffectPtr pEffect;
+ if( mpPage && (mnEffectOffset >= 0) )
+ {
+ std::shared_ptr< sd::MainSequence > pMainSequence( mpPage->getMainSequence() );
+ if( pMainSequence )
+ pEffect = pMainSequence->getEffectFromOffset( mnEffectOffset );
+ }
+ return pEffect;
+ }
+};
+
+UndoAnimationPath::UndoAnimationPath( SdDrawDocument* pDoc, SdPage* pThePage, const css::uno::Reference< css::animations::XAnimationNode >& xNode )
+: SdrUndoAction( *pDoc )
+, mpImpl( new UndoAnimationPathImpl( pThePage, xNode ) )
+{
+}
+
+UndoAnimationPath::~UndoAnimationPath()
+{
+}
+
+void UndoAnimationPath::Undo()
+{
+ CustomAnimationEffectPtr pEffect = mpImpl->getEffect();
+ if( pEffect )
+ {
+ mpImpl->msRedoPath = pEffect->getPath();
+ pEffect->setPath( mpImpl->msUndoPath );
+ }
+}
+
+void UndoAnimationPath::Redo()
+{
+ CustomAnimationEffectPtr pEffect = mpImpl->getEffect();
+ if( pEffect )
+ {
+ pEffect->setPath( mpImpl->msRedoPath );
+ }
+}
+
+OUString UndoAnimationPath::GetComment() const
+{
+ return SdResId(STR_UNDO_ANIMATION);
+}
+
+struct UndoTransitionImpl
+{
+ SdPage* mpPage;
+
+ sal_Int16 mnNewTransitionType;
+ sal_Int16 mnNewTransitionSubtype;
+ bool mbNewTransitionDirection;
+ sal_Int32 mnNewTransitionFadeColor;
+ double mfNewTransitionDuration;
+ OUString maNewSoundFile;
+ bool mbNewSoundOn;
+ bool mbNewLoopSound;
+ bool mbNewStopSound;
+
+ sal_Int16 mnOldTransitionType;
+ sal_Int16 mnOldTransitionSubtype;
+ bool mbOldTransitionDirection;
+ sal_Int32 mnOldTransitionFadeColor;
+ double mfOldTransitionDuration;
+ OUString maOldSoundFile;
+ bool mbOldSoundOn;
+ bool mbOldLoopSound;
+ bool mbOldStopSound;
+};
+
+UndoTransition::UndoTransition( SdDrawDocument* _pDoc, SdPage* pThePage )
+: SdUndoAction( _pDoc ), mpImpl( new UndoTransitionImpl )
+{
+ mpImpl->mpPage = pThePage;
+
+ mpImpl->mnNewTransitionType = -1;
+ mpImpl->mnOldTransitionType = pThePage->mnTransitionType;
+ mpImpl->mnOldTransitionSubtype = pThePage->mnTransitionSubtype;
+ mpImpl->mbOldTransitionDirection = pThePage->mbTransitionDirection;
+ mpImpl->mnOldTransitionFadeColor = pThePage->mnTransitionFadeColor;
+ mpImpl->mfOldTransitionDuration = pThePage->mfTransitionDuration;
+ mpImpl->maOldSoundFile = pThePage->maSoundFile;
+ mpImpl->mbOldSoundOn = pThePage->mbSoundOn;
+ mpImpl->mbOldLoopSound = pThePage->mbLoopSound;
+ mpImpl->mbOldStopSound = pThePage->mbStopSound;
+}
+
+UndoTransition::~UndoTransition()
+{
+}
+
+void UndoTransition::Undo()
+{
+ if( mpImpl->mnNewTransitionType == -1 )
+ {
+ mpImpl->mnNewTransitionType = mpImpl->mpPage->mnTransitionType;
+ mpImpl->mnNewTransitionSubtype = mpImpl->mpPage->mnTransitionSubtype;
+ mpImpl->mbNewTransitionDirection = mpImpl->mpPage->mbTransitionDirection;
+ mpImpl->mnNewTransitionFadeColor = mpImpl->mpPage->mnTransitionFadeColor;
+ mpImpl->mfNewTransitionDuration = mpImpl->mpPage->mfTransitionDuration;
+ mpImpl->maNewSoundFile = mpImpl->mpPage->maSoundFile;
+ mpImpl->mbNewSoundOn = mpImpl->mpPage->mbSoundOn;
+ mpImpl->mbNewLoopSound = mpImpl->mpPage->mbLoopSound;
+ mpImpl->mbNewStopSound = mpImpl->mpPage->mbStopSound;
+ }
+
+ mpImpl->mpPage->mnTransitionType = mpImpl->mnOldTransitionType;
+ mpImpl->mpPage->mnTransitionSubtype = mpImpl->mnOldTransitionSubtype;
+ mpImpl->mpPage->mbTransitionDirection = mpImpl->mbOldTransitionDirection;
+ mpImpl->mpPage->mnTransitionFadeColor = mpImpl->mnOldTransitionFadeColor;
+ mpImpl->mpPage->mfTransitionDuration = mpImpl->mfOldTransitionDuration;
+ mpImpl->mpPage->maSoundFile = mpImpl->maOldSoundFile;
+ mpImpl->mpPage->mbSoundOn = mpImpl->mbOldSoundOn;
+ mpImpl->mpPage->mbLoopSound = mpImpl->mbOldLoopSound;
+ mpImpl->mpPage->mbStopSound = mpImpl->mbOldStopSound;
+}
+
+void UndoTransition::Redo()
+{
+ mpImpl->mpPage->mnTransitionType = mpImpl->mnNewTransitionType;
+ mpImpl->mpPage->mnTransitionSubtype = mpImpl->mnNewTransitionSubtype;
+ mpImpl->mpPage->mbTransitionDirection = mpImpl->mbNewTransitionDirection;
+ mpImpl->mpPage->mnTransitionFadeColor = mpImpl->mnNewTransitionFadeColor;
+ mpImpl->mpPage->mfTransitionDuration = mpImpl->mfNewTransitionDuration;
+ mpImpl->mpPage->maSoundFile = mpImpl->maNewSoundFile;
+ mpImpl->mpPage->mbSoundOn = mpImpl->mbNewSoundOn;
+ mpImpl->mpPage->mbLoopSound = mpImpl->mbNewLoopSound;
+ mpImpl->mpPage->mbStopSound = mpImpl->mbNewStopSound;
+}
+
+OUString UndoTransition::GetComment() const
+{
+ return SdResId(STR_UNDO_SLIDE_PARAMS);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/cgm/sdcgmfilter.cxx b/sd/source/filter/cgm/sdcgmfilter.cxx
new file mode 100644
index 000000000..80b11519d
--- /dev/null
+++ b/sd/source/filter/cgm/sdcgmfilter.cxx
@@ -0,0 +1,137 @@
+/* -*- 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 <memory>
+#include <tools/urlobj.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#include <sfx2/docfile.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xfillit0.hxx>
+
+#include <sddll.hxx>
+#include <sdpage.hxx>
+#include <drawdoc.hxx>
+#include <sdcgmfilter.hxx>
+
+#include <DrawDocShell.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::task;
+using namespace ::com::sun::star::frame;
+
+typedef sal_uInt32 ( *ImportCGMPointer )(SvStream&, Reference< XModel > const &, Reference< XStatusIndicator > const &);
+
+#ifdef DISABLE_DYNLOADING
+
+extern "C" sal_uInt32 ImportCGM(SvStream&, Reference< XModel > const &, Reference< XStatusIndicator > const &);
+
+#endif
+
+SdCGMFilter::SdCGMFilter( SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell ) :
+ SdFilter( rMedium, rDocShell )
+{
+}
+
+SdCGMFilter::~SdCGMFilter()
+{
+}
+
+namespace
+{
+ class CGMPointer
+ {
+ ImportCGMPointer m_pPointer;
+ public:
+ CGMPointer()
+ {
+#ifdef DISABLE_DYNLOADING
+ m_pPointer = ImportCGM;
+#else
+ m_pPointer = reinterpret_cast<ImportCGMPointer>(
+ SdFilter::GetLibrarySymbol("icg", "ImportCGM"));
+#endif
+ }
+ ImportCGMPointer get() { return m_pPointer; }
+ };
+}
+
+bool SdCGMFilter::Import()
+{
+ bool bRet = false;
+
+ CGMPointer aPointer;
+ ImportCGMPointer FncImportCGM = aPointer.get();
+ if (FncImportCGM && mxModel.is())
+ {
+ OUString aFileURL( mrMedium.GetURLObject().GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
+ sal_uInt32 nRetValue;
+
+ if( mrDocument.GetPageCount() == 0 )
+ mrDocument.CreateFirstPages();
+
+ CreateStatusIndicator();
+ std::unique_ptr<SvStream> xIn(::utl::UcbStreamHelper::CreateStream(aFileURL, StreamMode::READ));
+ nRetValue = xIn ? FncImportCGM(*xIn, mxModel, mxStatusIndicator) : 0;
+
+ if( nRetValue )
+ {
+ bRet = true;
+
+ if( ( nRetValue &~0xff000000 ) != 0xffffff ) // maybe the backgroundcolor is already white
+ { // so we must not set a master page
+ mrDocument.StopWorkStartupDelay();
+ SdPage* pSdPage = mrDocument.GetMasterSdPage(0, PageKind::Standard);
+
+ if(pSdPage)
+ {
+ // set PageFill to given color
+ const Color aColor(static_cast<sal_uInt8>(nRetValue >> 16), static_cast<sal_uInt8>(nRetValue >> 8), static_cast<sal_uInt8>(nRetValue >> 16));
+ pSdPage->getSdrPageProperties().PutItem(XFillColorItem(OUString(), aColor));
+ pSdPage->getSdrPageProperties().PutItem(XFillStyleItem(drawing::FillStyle_SOLID));
+ }
+ }
+ }
+ }
+ return bRet;
+}
+
+bool SdCGMFilter::Export()
+{
+ // No ExportCGM function exists(!)
+ return false;
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT bool TestImportCGM(SvStream &rStream)
+{
+ SdDLL::Init();
+
+ ::sd::DrawDocShellRef xDocShRef = new ::sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Impress);
+
+ CGMPointer aPointer;
+
+ xDocShRef->GetDoc()->EnableUndo(false);
+ bool bRet = aPointer.get()(rStream, xDocShRef->GetModel(), css::uno::Reference<css::task::XStatusIndicator>()) == 0;
+
+ xDocShRef->DoClose();
+
+ return bRet;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/eppt.cxx b/sd/source/filter/eppt/eppt.cxx
new file mode 100644
index 000000000..6f58d919e
--- /dev/null
+++ b/sd/source/filter/eppt/eppt.cxx
@@ -0,0 +1,1464 @@
+/* -*- 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 "eppt.hxx"
+#include "epptdef.hxx"
+#include "pptexanimations.hxx"
+#include <o3tl/any.hxx>
+#include <tools/globname.hxx>
+#include <rtl/ustring.hxx>
+#include <tools/stream.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdoole2.hxx>
+#include <com/sun/star/container/XIndexContainer.hpp>
+#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <com/sun/star/office/XAnnotation.hpp>
+#include <com/sun/star/office/XAnnotationAccess.hpp>
+#include <com/sun/star/office/XAnnotationEnumeration.hpp>
+#include <com/sun/star/presentation/AnimationSpeed.hpp>
+#include <com/sun/star/presentation/XPresentationSupplier.hpp>
+#include <com/sun/star/presentation/XCustomPresentationSupplier.hpp>
+#include <com/sun/star/geometry/RealPoint2D.hpp>
+#include <com/sun/star/util/DateTime.hpp>
+#include <com/sun/star/task/XStatusIndicator.hpp>
+#include <comphelper/sequence.hxx>
+#include <tools/zcodec.hxx>
+#include <filter/msfilter/classids.hxx>
+#include <filter/msfilter/msoleexp.hxx>
+#include <filter/msfilter/msdffimp.hxx>
+#include <filter/msfilter/svxmsbas.hxx>
+#include <editeng/flditem.hxx>
+#include <sfx2/docinf.hxx>
+#include <oox/export/utils.hxx>
+#include <oox/ole/olehelper.hxx>
+#include <memory>
+
+class SfxObjectShell;
+ // complete SfxObjectShell for SaveVBA under -fsanitize=function
+
+using namespace com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::presentation;
+
+using ::com::sun::star::beans::XPropertySet;
+
+//============================ PPTWriter ==================================
+
+PPTWriter::PPTWriter( tools::SvRef<SotStorage> const & rSvStorage,
+ css::uno::Reference< css::frame::XModel > const & rXModel,
+ css::uno::Reference< css::task::XStatusIndicator > const & rXStatInd,
+ SvMemoryStream* pVBA, sal_uInt32 nCnvrtFlags ) :
+ PPTWriterBase ( rXModel, rXStatInd ),
+ mnCnvrtFlags ( nCnvrtFlags ),
+ mbStatus ( false ),
+ mnStatMaxValue ( 0 ),
+ mnLatestStatValue ( 0 ),
+ mnTextStyle( 0 ),
+ mbFontIndependentLineSpacing( false ),
+ mnTextSize( 0 ),
+ mrStg ( rSvStorage ),
+ mnVBAOleOfs ( 0 ),
+ mpVBA ( pVBA ),
+ mnExEmbed ( 0 ),
+ mpExEmbed ( new SvMemoryStream ),
+ mnPagesWritten ( 0 ),
+ mnTxId ( 0x7a2f64 ),
+ mnDiaMode ( 0 ),
+ mnShapeMasterTitle ( 0 ),
+ mnShapeMasterBody ( 0 )
+{
+}
+
+void PPTWriter::exportPPTPre( const std::vector< css::beans::PropertyValue >& rMediaData )
+{
+ if ( !mrStg.is() )
+ return;
+
+ if ( mXStatusIndicator.is() )
+ {
+ mbStatusIndicator = true;
+ mnStatMaxValue = ( mnPages + mnMasterPages ) * 5;
+ mXStatusIndicator->start( "PowerPoint Export", mnStatMaxValue + ( mnStatMaxValue >> 3 ) );
+ }
+
+ SvGlobalName aGName(MSO_PPT8_CLASSID);
+ mrStg->SetClass( aGName, SotClipboardFormatId::NONE, "MS PowerPoint 97" );
+
+ if ( !ImplCreateCurrentUserStream() )
+ return;
+
+ mpStrm = mrStg->OpenSotStream( "PowerPoint Document" );
+ if ( !mpStrm )
+ return;
+
+ if ( !mpPicStrm )
+ mpPicStrm = mrStg->OpenSotStream( "Pictures" );
+
+ auto aIter = std::find_if(rMediaData.begin(), rMediaData.end(),
+ [](const css::beans::PropertyValue& rProp) { return rProp.Name == "BaseURI"; });
+ if (aIter != rMediaData.end())
+ (*aIter).Value >>= maBaseURI;
+ mpPptEscherEx.reset( new PptEscherEx( *mpStrm, maBaseURI ) );
+}
+
+void PPTWriter::exportPPTPost( )
+{
+ if ( !ImplCloseDocument() )
+ return;
+
+ if ( mbStatusIndicator )
+ {
+ mXStatusIndicator->setText( "PowerPoint Export" );
+ sal_uInt32 nValue = mnStatMaxValue + ( mnStatMaxValue >> 3 );
+ if ( nValue > mnLatestStatValue )
+ {
+ mXStatusIndicator->setValue( nValue );
+ mnLatestStatValue = nValue;
+ }
+ }
+
+ ImplWriteOLE();
+
+ ImplWriteVBA();
+
+ ImplWriteAtomEnding();
+
+ ImplCreateDocumentSummaryInformation();
+
+ mbStatus = true;
+};
+
+static void ImplExportComments( const uno::Reference< drawing::XDrawPage >& xPage, SvMemoryStream& rBinaryTagData10Atom );
+
+void PPTWriter::ImplWriteSlide( sal_uInt32 nPageNum, sal_uInt32 nMasterNum, sal_uInt16 nMode,
+ bool bHasBackground, Reference< XPropertySet > const & aXBackgroundPropSet )
+{
+ Any aAny;
+
+ const PHLayout& rLayout = GetLayout( mXPagePropSet );
+ mpPptEscherEx->PtReplaceOrInsert( EPP_Persist_Slide | nPageNum, mpStrm->Tell() );
+ mpPptEscherEx->OpenContainer( EPP_Slide );
+ mpPptEscherEx->AddAtom( 24, EPP_SlideAtom, 2 );
+ mpStrm->WriteInt32( static_cast<sal_Int32>(rLayout.nLayout) );
+ mpStrm->WriteBytes(rLayout.nPlaceHolder, 8); // placeholderIDs (8 parts)
+ mpStrm->WriteUInt32( nMasterNum | 0x80000000 ) // master ID (equals 0x80000000 on a master page)
+ .WriteUInt32( nPageNum + 0x100 ) // notes ID (equals null if no notes are present)
+ .WriteUInt16( nMode )
+ .WriteUInt16( 0 ); // padword
+
+ mnDiaMode = 0;
+ bool bVisible = true;
+ css::presentation::FadeEffect eFe = css::presentation::FadeEffect_NONE;
+
+ if ( GetPropertyValue( aAny, mXPagePropSet, "Visible" ) )
+ aAny >>= bVisible;
+ if ( GetPropertyValue( aAny, mXPagePropSet, "Change" ) )
+ {
+ switch ( *o3tl::doAccess<sal_Int32>(aAny) )
+ {
+ case 1 : // automatic
+ mnDiaMode++;
+ [[fallthrough]];
+ case 2 : // semi-automatic
+ mnDiaMode++;
+ break;
+ default :
+ case 0 : // manual
+ break;
+ }
+ }
+ if ( GetPropertyValue( aAny, mXPagePropSet, "Effect" ) )
+ aAny >>= eFe;
+
+ sal_uInt32 nSoundRef = 0;
+ bool bIsSound = false;
+ bool bStopSound = false;
+ bool bLoopSound = false;
+
+ if ( GetPropertyValue( aAny, mXPagePropSet, "Sound" ) )
+ {
+ OUString aSoundURL;
+ if ( aAny >>= aSoundURL )
+ {
+ nSoundRef = maSoundCollection.GetId( aSoundURL );
+ bIsSound = true;
+ }
+ else
+ aAny >>= bStopSound;
+ }
+ if ( GetPropertyValue( aAny, mXPagePropSet, "LoopSound" ) )
+ aAny >>= bLoopSound;
+
+ bool bNeedsSSSlideInfoAtom = !bVisible
+ || ( mnDiaMode == 2 )
+ || bIsSound
+ || bStopSound
+ || ( eFe != css::presentation::FadeEffect_NONE );
+ if ( bNeedsSSSlideInfoAtom )
+ {
+ sal_uInt8 nDirection = 0;
+ sal_uInt8 nTransitionType = 0;
+ sal_uInt16 nBuildFlags = 1; // advance by mouseclick
+ sal_Int32 nSlideTime = 0; // still has to !!!
+ sal_uInt8 nSpeed = 1;
+
+ if ( GetPropertyValue( aAny, mXPagePropSet, "TransitionDuration" ) )
+ {
+ css::presentation::AnimationSpeed aAs;
+ double fTransitionDuration = -1.0;
+ aAny >>= fTransitionDuration;
+
+ if (fTransitionDuration >= 0)
+ {
+ if (fTransitionDuration <= 0.5)
+ {
+ aAs = css::presentation::AnimationSpeed::AnimationSpeed_FAST;
+ }
+ else if (fTransitionDuration >= 1.0)
+ {
+ aAs = css::presentation::AnimationSpeed::AnimationSpeed_SLOW;
+ }
+ else
+ {
+ aAs = css::presentation::AnimationSpeed::AnimationSpeed_MEDIUM;
+ }
+ }
+ else
+ aAs = css::presentation::AnimationSpeed::AnimationSpeed_MEDIUM;
+
+ nSpeed = static_cast<sal_uInt8>(aAs);
+ }
+ sal_Int16 nTT = 0;
+ if ( GetPropertyValue( aAny, mXPagePropSet, "TransitionType" )
+ && ( aAny >>= nTT ) )
+ {
+ sal_Int16 nTST = 0;
+ if ( GetPropertyValue( aAny, mXPagePropSet, "TransitionSubtype" )
+ && ( aAny >>= nTST ) )
+ nTransitionType = GetTransition( nTT, nTST, eFe, 0, nDirection );
+
+ }
+ if ( !nTransitionType )
+ nTransitionType = GetTransition( eFe, nDirection );
+ if ( mnDiaMode == 2 ) // automatic ?
+ nBuildFlags |= 0x400;
+ if ( !bVisible )
+ nBuildFlags |= 4;
+ if ( bIsSound )
+ nBuildFlags |= 16;
+ if ( bLoopSound )
+ nBuildFlags |= 64;
+ if ( bStopSound )
+ nBuildFlags |= 256;
+
+ if ( GetPropertyValue( aAny, mXPagePropSet, "Duration" ) )// duration of this slide
+ nSlideTime = *o3tl::doAccess<sal_Int32>(aAny) << 10; // in ticks
+
+ mpPptEscherEx->AddAtom( 16, EPP_SSSlideInfoAtom );
+ mpStrm->WriteInt32( nSlideTime ) // standtime in ticks
+ .WriteUInt32( nSoundRef )
+ .WriteUChar( nDirection )
+ .WriteUChar( nTransitionType )
+ .WriteUInt16( nBuildFlags )
+ .WriteUChar( nSpeed )
+ .WriteUChar( 0 ).WriteUChar( 0 ).WriteUChar( 0 );
+ }
+
+ ImplCreateHeaderFooters( mXPagePropSet );
+
+ EscherSolverContainer aSolverContainer;
+ mpPptEscherEx->OpenContainer( EPP_PPDrawing );
+ mpPptEscherEx->OpenContainer( ESCHER_DgContainer );
+ mpPptEscherEx->EnterGroup(nullptr,nullptr);
+ ImplWritePage( rLayout, aSolverContainer, NORMAL, false, nPageNum ); // the shapes of the pages are created in the PPT document
+ mpPptEscherEx->LeaveGroup();
+
+ if ( bHasBackground )
+ ImplWriteBackground( aXBackgroundPropSet );
+ else
+ {
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle,
+ ShapeFlag::Background | ShapeFlag::HaveShapeProperty );
+ EscherPropertyContainer aPropOpt;
+ aPropOpt.AddOpt( ESCHER_Prop_fillRectRight, PPTtoEMU( maDestPageSize.Width ) );
+ aPropOpt.AddOpt( ESCHER_Prop_fillRectBottom, PPTtoEMU( maDestPageSize.Width ) );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x120012 );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
+ aPropOpt.AddOpt( ESCHER_Prop_bWMode, ESCHER_wDontShow );
+ aPropOpt.AddOpt( ESCHER_Prop_fBackground, 0x10001 ); // if true, this is the background shape
+ aPropOpt.Commit( *mpStrm );
+ mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
+ }
+
+ aSolverContainer.WriteSolver( *mpStrm );
+
+ mpPptEscherEx->CloseContainer(); // ESCHER_DgContainer
+ mpPptEscherEx->CloseContainer(); // EPP_Drawing
+ mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 1 );
+ mpStrm->WriteUInt32( 0xffffff ).WriteUInt32( 0x000000 ).WriteUInt32( 0x808080 ).WriteUInt32( 0x000000 ).WriteUInt32( 0x99cc00 ).WriteUInt32( 0xcc3333 ).WriteUInt32( 0xffcccc ).WriteUInt32( 0xb2b2b2 );
+
+ SvMemoryStream aBinaryTagData10Atom;
+ ImplExportComments( mXDrawPage, aBinaryTagData10Atom );
+ SvMemoryStream amsofbtAnimGroup;
+ ppt::AnimationExporter aExporter( aSolverContainer, maSoundCollection );
+ aExporter.doexport( mXDrawPage, amsofbtAnimGroup );
+ sal_uInt32 nmsofbtAnimGroupSize = amsofbtAnimGroup.Tell();
+ if ( nmsofbtAnimGroupSize )
+ {
+ {
+ EscherExAtom aMagic2( aBinaryTagData10Atom, 0x2eeb );
+ aBinaryTagData10Atom.WriteUInt32( 0x01c45df9 )
+ .WriteUInt32( 0xe1471b30 );
+ }
+ {
+ EscherExAtom aMagic( aBinaryTagData10Atom, 0x2b00 );
+ aBinaryTagData10Atom.WriteUInt32( 0 );
+ }
+ aBinaryTagData10Atom.WriteBytes(amsofbtAnimGroup.GetData(), amsofbtAnimGroup.Tell());
+ {
+ EscherExContainer aMagic2( aBinaryTagData10Atom, 0x2b02 );
+ }
+ }
+ if ( aBinaryTagData10Atom.Tell() )
+ {
+ EscherExContainer aProgTags ( *mpStrm, EPP_ProgTags );
+ EscherExContainer aProgBinaryTag( *mpStrm, EPP_ProgBinaryTag );
+ {
+ EscherExAtom aCString( *mpStrm, EPP_CString );
+ mpStrm->WriteUInt32( 0x5f005f )
+ .WriteUInt32( 0x50005f )
+ .WriteUInt32( 0x540050 )
+ .WriteUInt16( 0x31 )
+ .WriteUInt16( 0x30 );
+ }
+ {
+ EscherExAtom aBinaryTagData( *mpStrm, EPP_BinaryTagData );
+ mpStrm->WriteBytes(aBinaryTagData10Atom.GetData(), aBinaryTagData10Atom.Tell());
+ }
+ }
+ mpPptEscherEx->CloseContainer(); // EPP_Slide
+}
+
+void PPTWriter::ImplWriteSlideMaster( sal_uInt32 nPageNum, Reference< XPropertySet > const & aXBackgroundPropSet )
+{
+ if (!aXBackgroundPropSet)
+ return;
+ mpPptEscherEx->PtReplaceOrInsert( EPP_Persist_MainMaster | nPageNum, mpStrm->Tell() );
+ mpPptEscherEx->OpenContainer( EPP_MainMaster );
+ mpPptEscherEx->AddAtom( 24, EPP_SlideAtom, 2 );
+ mpStrm->WriteInt32( static_cast<sal_Int32>(EppLayout::TITLEANDBODYSLIDE) ) // slide layout -> title and body slide
+ .WriteUChar( 1 ).WriteUChar( 2 ).WriteUChar( 0 ).WriteUChar( 0 ).WriteUChar( 0 ).WriteUChar( 0 ).WriteUChar( 0 ).WriteUChar( 0 ) // placeholderID
+ .WriteUInt32( 0 ) // master ID (equals null at a master page)
+ .WriteUInt32( 0 ) // notes ID (equals null if no notes are present)
+ .WriteUInt16( 0 ) // Bit 1: Follow master objects, Bit 2: Follow master scheme, Bit 3: Follow master background
+ .WriteUInt16( 0 ); // padword
+
+ mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 );
+ mpStrm->WriteUInt32( 0xffffff ).WriteUInt32( 0x000000 ).WriteUInt32( 0x808080 ).WriteUInt32( 0x000000 ).WriteUInt32( 0x99cc00 ).WriteUInt32( 0xcc3333 ).WriteUInt32( 0xffcccc ).WriteUInt32( 0xb2b2b2 );
+ mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 );
+ mpStrm->WriteUInt32( 0xff0000 ).WriteUInt32( 0xffffff ).WriteUInt32( 0x000000 ).WriteUInt32( 0x00ffff ).WriteUInt32( 0x0099ff ).WriteUInt32( 0xffff00 ).WriteUInt32( 0x0000ff ).WriteUInt32( 0x969696 );
+ mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 );
+ mpStrm->WriteUInt32( 0xccffff ).WriteUInt32( 0x000000 ).WriteUInt32( 0x336666 ).WriteUInt32( 0x008080 ).WriteUInt32( 0x339933 ).WriteUInt32( 0x000080 ).WriteUInt32( 0xcc3300 ).WriteUInt32( 0x66ccff );
+ mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 );
+ mpStrm->WriteUInt32( 0xffffff ).WriteUInt32( 0x000000 ).WriteUInt32( 0x333333 ).WriteUInt32( 0x000000 ).WriteUInt32( 0xdddddd ).WriteUInt32( 0x808080 ).WriteUInt32( 0x4d4d4d ).WriteUInt32( 0xeaeaea );
+ mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 );
+ mpStrm->WriteUInt32( 0xffffff ).WriteUInt32( 0x000000 ).WriteUInt32( 0x808080 ).WriteUInt32( 0x000000 ).WriteUInt32( 0x66ccff ).WriteUInt32( 0xff0000 ).WriteUInt32( 0xcc00cc ).WriteUInt32( 0xc0c0c0 );
+ mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 );
+ mpStrm->WriteUInt32( 0xffffff ).WriteUInt32( 0x000000 ).WriteUInt32( 0x808080 ).WriteUInt32( 0x000000 ).WriteUInt32( 0xc0c0c0 ).WriteUInt32( 0xff6600 ).WriteUInt32( 0x0000ff ).WriteUInt32( 0x009900 );
+ mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 );
+ mpStrm->WriteUInt32( 0xffffff ).WriteUInt32( 0x000000 ).WriteUInt32( 0x808080 ).WriteUInt32( 0x000000 ).WriteUInt32( 0xff9933 ).WriteUInt32( 0xccff99 ).WriteUInt32( 0xcc00cc ).WriteUInt32( 0xb2b2b2 );
+
+ for ( int nInstance = EPP_TEXTTYPE_Title; nInstance <= EPP_TEXTTYPE_QuarterBody; nInstance++ )
+ {
+ if ( nInstance == EPP_TEXTTYPE_notUsed )
+ continue;
+
+ // the auto color is dependent to the page background,so we have to set a page that is in the right context
+ if ( nInstance == EPP_TEXTTYPE_Notes )
+ (void)GetPageByIndex(0, NOTICE);
+ else
+ (void)GetPageByIndex(0, MASTER);
+
+ mpPptEscherEx->BeginAtom();
+
+ bool bSimpleText = false;
+
+ mpStrm->WriteUInt16( 5 ); // paragraph count
+
+ for ( sal_uInt16 nLev = 0; nLev < 5; nLev++ )
+ {
+ if ( nInstance >= EPP_TEXTTYPE_CenterBody )
+ {
+ bSimpleText = true;
+ mpStrm->WriteUInt16( nLev );
+ }
+ mpStyleSheet->mpParaSheet[ nInstance ]->Write( *mpStrm, nLev, bSimpleText, mXPagePropSet );
+ mpStyleSheet->mpCharSheet[ nInstance ]->Write( *mpStrm, nLev, bSimpleText, mXPagePropSet );
+ }
+ mpPptEscherEx->EndAtom( EPP_TxMasterStyleAtom, 0, nInstance );
+ }
+ GetPageByIndex( nPageNum, MASTER );
+
+ EscherSolverContainer aSolverContainer;
+
+ mpPptEscherEx->OpenContainer( EPP_PPDrawing );
+ mpPptEscherEx->OpenContainer( ESCHER_DgContainer );
+
+ mpPptEscherEx->EnterGroup(nullptr,nullptr);
+ ImplWritePage( GetLayout( 0 ), aSolverContainer, MASTER, true ); // the shapes of the pages are created in the PPT document
+ mpPptEscherEx->LeaveGroup();
+
+ ImplWriteBackground( aXBackgroundPropSet );
+
+ aSolverContainer.WriteSolver( *mpStrm );
+
+ mpPptEscherEx->CloseContainer(); // ESCHER_DgContainer
+ mpPptEscherEx->CloseContainer(); // EPP_Drawing
+ mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 1 );
+ mpStrm->WriteUInt32( 0xffffff ).WriteUInt32( 0x000000 ).WriteUInt32( 0x808080 ).WriteUInt32( 0x000000 ).WriteUInt32( 0x99cc00 ).WriteUInt32( 0xcc3333 ).WriteUInt32( 0xffcccc ).WriteUInt32( 0xb2b2b2 );
+
+ if ( aBuExMasterStream.Tell() )
+ {
+ ImplProgTagContainer( mpStrm.get(), &aBuExMasterStream );
+ }
+ mpPptEscherEx->CloseContainer(); // EPP_MainMaster
+};
+
+PPTWriter::~PPTWriter()
+{
+ mpExEmbed.reset();
+ mpPptEscherEx.reset();
+ mpCurUserStrm.clear();
+ mpPicStrm.clear();
+ mpStrm.clear();
+ maStyleSheetList.clear();
+ maExOleObj.clear();
+ if ( mbStatusIndicator )
+ mXStatusIndicator->end();
+}
+
+bool PPTWriter::ImplCreateCurrentUserStream()
+{
+ mpCurUserStrm = mrStg->OpenSotStream( "Current User" );
+ if ( !mpCurUserStrm )
+ return false;
+ char pUserName[] = "Current User";
+ sal_uInt32 nLenOfUserName = strlen( pUserName );
+ sal_uInt32 nSizeOfRecord = 0x14 + ( ( nLenOfUserName + 4 ) & ~ 3 );
+
+ mpCurUserStrm->WriteUInt16( 0 ).WriteUInt16( EPP_CurrentUserAtom ).WriteUInt32( nSizeOfRecord );
+ mpCurUserStrm->WriteUInt32( 0x14 ) // Len
+ .WriteUInt32( 0xe391c05f ); // Magic
+
+ sal_uInt32 nEditPos = mpCurUserStrm->Tell();
+ mpCurUserStrm->WriteUInt32( 0x0 ) // OffsetToCurrentEdit;
+ .WriteUInt16( nLenOfUserName )
+ .WriteUInt16( 0x3f4 ) // DocFileVersion
+ .WriteUChar( 3 ) // MajorVersion
+ .WriteUChar( 0 ) // MinorVersion
+ .WriteUInt16( 0 ); // Pad Word
+ pUserName[ nLenOfUserName ] = 8;
+ mpCurUserStrm->WriteBytes(pUserName, nLenOfUserName + 1);
+ for ( sal_uInt32 i = 0x15 + nLenOfUserName; i < nSizeOfRecord; i++ )
+ {
+ mpCurUserStrm->WriteUChar( 0 ); // pad bytes
+ }
+ mpCurUserStrm->Seek( nEditPos );
+ return true;
+};
+
+void PPTWriter::ImplCreateDocumentSummaryInformation()
+{
+ uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
+ mXModel, uno::UNO_QUERY_THROW);
+ uno::Reference<document::XDocumentProperties> xDocProps(
+ xDPS->getDocumentProperties());
+
+ if (!xDocProps.is())
+ return;
+
+ // no idea what this is...
+ static const sal_Int8 aGuid[ 0x52 ] =
+ {
+ 0x4e, 0x00, 0x00, 0x00,
+ '{',0,'D',0,'B',0,'1',0,'A',0,'C',0,'9',0,'6',0,'4',0,'-',0,
+ 'E',0,'3',0,'9',0,'C',0,'-',0,'1',0,'1',0,'D',0,'2',0,'-',0,
+ 'A',0,'1',0,'E',0,'F',0,'-',0,'0',0,'0',0,'6',0,'0',0,'9',0,
+ '7',0,'D',0,'A',0,'5',0,'6',0,'8',0,'9',0,'}',0
+ };
+ // coverity[overrun-buffer-arg : FALSE] - coverity has difficulty with css::uno::Sequence
+ uno::Sequence<sal_Int8> aGuidSeq(aGuid, 0x52);
+
+ SvMemoryStream aHyperBlob;
+ ImplCreateHyperBlob( aHyperBlob );
+
+ auto nHyperLength = static_cast<sal_Int32>(aHyperBlob.Tell());
+ const sal_Int8* pBlob(
+ static_cast<const sal_Int8*>(aHyperBlob.GetData()));
+ auto aHyperSeq = comphelper::arrayToSequence<sal_Int8>(pBlob, nHyperLength);
+
+ if ( mnCnvrtFlags & 0x8000 )
+ {
+ uno::Sequence<sal_Int8> aThumbSeq;
+ if ( GetPageByIndex( 0, NORMAL ) && ImplGetPropertyValue( mXPagePropSet, "PreviewBitmap" ) )
+ {
+ aThumbSeq = *o3tl::doAccess<uno::Sequence<sal_Int8>>(mAny);
+ }
+ sfx2::SaveOlePropertySet( xDocProps, mrStg.get(),
+ &aThumbSeq, &aGuidSeq, &aHyperSeq);
+ }
+ else
+ {
+ sfx2::SaveOlePropertySet( xDocProps, mrStg.get(),
+ nullptr, &aGuidSeq, &aHyperSeq );
+ }
+}
+
+void PPTWriter::ImplWriteExtParaHeader( SvMemoryStream& rSt, sal_uInt32 nRef, sal_uInt32 nInstance, sal_uInt32 nSlideId )
+{
+ if ( rSt.Tell() )
+ {
+ aBuExOutlineStream.WriteUInt32( ( EPP_PST_ExtendedParagraphHeaderAtom << 16 )
+ | ( nRef << 4 ) )
+ .WriteUInt32( 8 )
+ .WriteUInt32( nSlideId )
+ .WriteUInt32( nInstance );
+ aBuExOutlineStream.WriteBytes(rSt.GetData(), rSt.Tell());
+ }
+}
+
+void PPTWriter::ImplCreateHeaderFooterStrings( SvStream& rStrm, css::uno::Reference< css::beans::XPropertySet > const & rXPagePropSet )
+{
+ if ( !rXPagePropSet.is() )
+ return;
+
+ OUString aString;
+ css::uno::Any aAny;
+ if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, "HeaderText", true ) )
+ {
+ if ( aAny >>= aString )
+ PPTWriter::WriteCString( rStrm, aString, 1 );
+ }
+ if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, "FooterText", true ) )
+ {
+ if ( aAny >>= aString )
+ PPTWriter::WriteCString( rStrm, aString, 2 );
+ }
+ if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, "DateTimeText", true ) )
+ {
+ if ( aAny >>= aString )
+ PPTWriter::WriteCString( rStrm, aString );
+ }
+}
+
+void PPTWriter::ImplCreateHeaderFooters( css::uno::Reference< css::beans::XPropertySet > const & rXPagePropSet )
+{
+ if ( !rXPagePropSet.is() )
+ return;
+
+ bool bVal = false;
+ sal_uInt32 nVal = 0;
+ css::uno::Any aAny;
+ if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, "IsHeaderVisible", true ) )
+ {
+ if ( ( aAny >>= bVal ) && bVal )
+ nVal |= 0x100000;
+ }
+ if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, "IsFooterVisible", true ) )
+ {
+ if ( ( aAny >>= bVal ) && bVal )
+ nVal |= 0x200000;
+ }
+ if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, "IsDateTimeVisible", true ) )
+ {
+ if ( ( aAny >>= bVal ) && bVal )
+ nVal |= 0x010000;
+ }
+ if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, "IsPageNumberVisible", true ) )
+ {
+ if ( ( aAny >>= bVal ) && bVal )
+ nVal |= 0x080000;
+ }
+ if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, "IsDateTimeFixed", true ) )
+ {
+ if ( ( aAny >>= bVal ) && !bVal )
+ nVal |= 0x20000;
+ else
+ nVal |= 0x40000;
+ }
+ if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, "DateTimeFormat", true ) )
+ {
+ sal_Int32 nFormat = *o3tl::doAccess<sal_Int32>(aAny);
+ SvxDateFormat eDateFormat = static_cast<SvxDateFormat>( nFormat & 0xf );
+ SvxTimeFormat eTimeFormat = static_cast<SvxTimeFormat>( ( nFormat >> 4 ) & 0xf );
+ switch( eDateFormat )
+ {
+ case SvxDateFormat::F :
+ nFormat = 1;
+ break;
+ case SvxDateFormat::D :
+ nFormat = 2;
+ break;
+ case SvxDateFormat::C :
+ nFormat = 4;
+ break;
+ default:
+ case SvxDateFormat::A :
+ nFormat = 0;
+ }
+ switch( eTimeFormat )
+ {
+ case SvxTimeFormat::HH24_MM :
+ nFormat = 9;
+ break;
+ case SvxTimeFormat::HH12_MM :
+ nFormat = 11;
+ break;
+ case SvxTimeFormat::HH24_MM_SS :
+ nFormat = 10;
+ break;
+ case SvxTimeFormat::HH12_MM_SS :
+ nFormat = 12;
+ break;
+ default:
+ break;
+ }
+ nVal |= nFormat;
+ }
+
+ mpPptEscherEx->OpenContainer( EPP_HeadersFooters );
+ mpPptEscherEx->AddAtom( 4, EPP_HeadersFootersAtom );
+ mpStrm->WriteUInt32( nVal );
+ ImplCreateHeaderFooterStrings( *mpStrm, rXPagePropSet );
+ mpPptEscherEx->CloseContainer();
+}
+
+bool PPTWriter::ImplCreateDocument()
+{
+ sal_uInt32 i;
+ sal_uInt16 nSlideType = EPP_SLIDESIZE_TYPECUSTOM;
+
+ sal_uInt32 nWidth = maDestPageSize.Width;
+ sal_uInt32 nHeight = maDestPageSize.Height;
+
+ if ( ( nWidth == 0x1680 ) && ( nHeight == 0x10e0 ) )
+ nSlideType = EPP_SLIDESIZE_TYPEONSCREEN;
+ else if ( ( nWidth == 0x1200 ) && ( nHeight == 0x240 ) )
+ nSlideType = EPP_SLIDESIZE_TYPEBANNER;
+ else if ( ( nWidth == 0x1950 ) && ( nHeight == 0x10e0 ) )
+ nSlideType = EPP_SLIDESIZE_TYPE35MM;
+ else if ( ( nWidth == 0x1860 ) && ( nHeight == 0x10e0 ) )
+ nSlideType = EPP_SLIDESIZE_TYPEA4PAPER;
+
+ mpPptEscherEx->OpenContainer( EPP_Document );
+ // CREATE DOCUMENT ATOM
+ mpPptEscherEx->AddAtom( 40, EPP_DocumentAtom, 1 );
+ mpStrm->WriteUInt32( nWidth ) // Slide Size in Master coordinates X
+ .WriteUInt32( nHeight ) // " " " " " Y
+ .WriteInt32( maNotesPageSize.Width ) // Notes Page Size X
+ .WriteInt32( maNotesPageSize.Height ) // " " " Y
+ .WriteInt32( 1 ).WriteInt32( 2 ); // the scale used when the Powerpoint document is embedded. the default is 1:2
+ mpPptEscherEx->InsertPersistOffset( EPP_MAINNOTESMASTER_PERSIST_KEY, mpStrm->Tell() );
+ mpStrm->WriteUInt32( 0 ) // Reference to NotesMaster ( 0 if none );
+ .WriteUInt32( 0 ) // Reference to HandoutMaster ( 0 if none );
+ .WriteInt16( 1 ) // Number of the first slide;
+ .WriteUInt16( nSlideType ) // Size of the document slides ( default: EPP_SLIDESIZETYPEONSCREEN )
+ .WriteUChar( 0 ) // bool1 indicates if document was saved with embedded true type fonts
+ .WriteUChar( 0 ) // bool1 indicates if the placeholders on the title slide are omitted
+ .WriteUChar( 0 ) // bool1 right to left ( flag for Bidi version )
+ .WriteUChar( 1 ); // bool1 visibility of comments shapes
+
+ mpPptEscherEx->PtInsert( EPP_Persist_Document, mpStrm->Tell() );
+
+ mpPptEscherEx->OpenContainer( EPP_HeadersFooters, 3 ); //Master footer (default)
+ mpPptEscherEx->AddAtom( 4, EPP_HeadersFootersAtom );
+ mpStrm->WriteUInt32( 0x25000d );
+ if ( GetPageByIndex( 0, MASTER ) )
+ ImplCreateHeaderFooterStrings( *mpStrm, mXPagePropSet );
+ mpPptEscherEx->CloseContainer();
+ mpPptEscherEx->OpenContainer( EPP_HeadersFooters, 4 ); //NotesMaster footer (default)
+ mpPptEscherEx->AddAtom( 4, EPP_HeadersFootersAtom );
+ mpStrm->WriteUInt32( 0x3d000d );
+ if ( GetPageByIndex( 0, NOTICE ) )
+ ImplCreateHeaderFooterStrings( *mpStrm, mXPagePropSet );
+ mpPptEscherEx->CloseContainer();
+
+ mpPptEscherEx->OpenContainer( EPP_SlideListWithText ); // animation information for the slides
+
+ for ( i = 0; i < mnPages; i++ )
+ {
+ mpPptEscherEx->AddAtom( 20, EPP_SlidePersistAtom );
+ mpPptEscherEx->InsertPersistOffset( EPP_MAINSLIDE_PERSIST_KEY | i, mpStrm->Tell() );
+ mpStrm->WriteUInt32( 0 ) // psrReference - logical reference to the slide persist object ( EPP_MAINSLIDE_PERSIST_KEY )
+ .WriteUInt32( 4 ) // flags - only bit 3 used, if set then slide contains shapes other than placeholders
+ .WriteInt32( 0 ) // numberTexts - number of placeholder texts stored with the persist object. Allows to display outline view without loading the slide persist objects
+ .WriteInt32( i + 0x100 ) // slideId - Unique slide identifier, used for OLE link monikers for example
+ .WriteUInt32( 0 ); // reserved, usually 0
+
+ if ( !GetPageByIndex( i, NORMAL ) ) // very exciting: once again through all pages
+ return false;
+ SetCurrentStyleSheet( GetMasterIndex( NORMAL ) );
+
+ css::uno::Reference< css::container::XNamed >
+ aXName( mXDrawPage, css::uno::UNO_QUERY );
+
+ if ( aXName.is() )
+ maSlideNameList.push_back( aXName->getName() );
+ else
+ maSlideNameList.emplace_back( );
+ }
+ mpPptEscherEx->CloseContainer(); // EPP_SlideListWithText
+
+ mpPptEscherEx->OpenContainer( EPP_SlideListWithText, 2 ); // animation information for the notes
+ for( i = 0; i < mnPages; i++ )
+ {
+ mpPptEscherEx->AddAtom( 20, EPP_SlidePersistAtom );
+ mpPptEscherEx->InsertPersistOffset( EPP_MAINNOTES_PERSIST_KEY | i, mpStrm->Tell() );
+ mpStrm->WriteUInt32( 0 )
+ .WriteUInt32( 4 )
+ .WriteInt32( 0 )
+ .WriteInt32( i + 0x100 )
+ .WriteUInt32( 0 );
+ }
+ mpPptEscherEx->CloseContainer(); // EPP_SlideListWithText
+
+ css::uno::Reference< css::presentation::XPresentationSupplier >
+ aXPresSupplier( mXModel, css::uno::UNO_QUERY );
+ if ( aXPresSupplier.is() )
+ {
+ css::uno::Reference< css::presentation::XPresentation > aXPresentation( aXPresSupplier->getPresentation() );
+ if ( aXPresentation.is() )
+ {
+ mXPropSet.set( aXPresentation, css::uno::UNO_QUERY );
+ if ( mXPropSet.is() )
+ {
+ OUString aCustomShow;
+ sal_uInt32 const nPenColor = 0x1000000;
+ sal_Int32 const nRestartTime = 0x7fffffff;
+ sal_Int16 nStartSlide = 0;
+ sal_Int16 nEndSlide = 0;
+ sal_uInt32 nFlags = 0; // Bit 0: Auto advance
+ // Bit 1 Skip builds ( do not allow slide effects )
+ // Bit 2 Use slide range
+ // Bit 3 Use named show
+ // Bit 4 Browse mode on
+ // Bit 5 Kiosk mode on
+ // Bit 6 Skip narration
+ // Bit 7 loop continuously
+ // Bit 8 show scrollbar
+
+ if ( ImplGetPropertyValue( "CustomShow" ) )
+ {
+ aCustomShow = *o3tl::doAccess<OUString>(mAny);
+ if ( !aCustomShow.isEmpty() )
+ {
+ nFlags |= 8;
+ }
+ }
+ if ( ( nFlags & 8 ) == 0 )
+ {
+ if ( ImplGetPropertyValue( "FirstPage" ) )
+ {
+ auto aSlideName = o3tl::doAccess<OUString>(mAny);
+
+ std::vector<OUString>::const_iterator pIter = std::find(
+ maSlideNameList.begin(),maSlideNameList.end(), *aSlideName);
+
+ if (pIter != maSlideNameList.end())
+ {
+ nStartSlide = pIter - maSlideNameList.begin() + 1;
+ nFlags |= 4;
+ nEndSlide = static_cast<sal_uInt16>(mnPages);
+ }
+ }
+ }
+
+ if ( ImplGetPropertyValue( "IsAutomatic" ) )
+ {
+ bool bBool = false;
+ mAny >>= bBool;
+ if ( !bBool )
+ nFlags |= 1;
+ }
+
+ if ( ImplGetPropertyValue( "IsEndless" ) )
+ {
+ bool bBool = false;
+ mAny >>= bBool;
+ if ( bBool )
+ nFlags |= 0x80;
+ }
+ if ( ImplGetPropertyValue( "IsFullScreen" ) )
+ {
+ bool bBool = false;
+ mAny >>= bBool;
+ if ( !bBool )
+ nFlags |= 0x11;
+ }
+
+ mpPptEscherEx->AddAtom( 80, EPP_SSDocInfoAtom, 1 );
+ mpStrm->WriteUInt32( nPenColor ).WriteInt32( nRestartTime ).WriteInt16( nStartSlide ).WriteInt16( nEndSlide );
+
+ sal_uInt32 nCustomShowNameLen = aCustomShow.getLength();
+ if ( nCustomShowNameLen > 31 )
+ nCustomShowNameLen = 31;
+ if ( nCustomShowNameLen ) // named show identifier
+ {
+ const sal_Unicode* pCustomShow = aCustomShow.getStr();
+ for ( i = 0; i < nCustomShowNameLen; i++ )
+ {
+ mpStrm->WriteUInt16( pCustomShow[ i ] );
+ }
+ }
+ for ( i = nCustomShowNameLen; i < 32; i++, mpStrm->WriteUInt16( 0 ) ) ;
+
+ mpStrm->WriteUInt32( nFlags );
+ css::uno::Reference< css::presentation::XCustomPresentationSupplier > aXCPSup( mXModel, css::uno::UNO_QUERY );
+ if ( aXCPSup.is() )
+ {
+ css::uno::Reference< css::container::XNameContainer > aXCont( aXCPSup->getCustomPresentations() );
+ if ( aXCont.is() )
+ {
+ const css::uno::Sequence< OUString> aNameSeq( aXCont->getElementNames() );
+ if ( aNameSeq.hasElements() )
+ {
+ mpPptEscherEx->OpenContainer( EPP_NamedShows );
+ sal_uInt32 nCustomShowIndex = 0;
+ for( OUString const & customShowName : aNameSeq )
+ {
+ if ( !customShowName.isEmpty() )
+ {
+ mpPptEscherEx->OpenContainer( EPP_NamedShow, nCustomShowIndex++ );
+
+ sal_uInt32 nNamedShowLen = customShowName.getLength();
+ if ( nNamedShowLen > 31 )
+ nNamedShowLen = 31;
+ mpPptEscherEx->AddAtom( nNamedShowLen << 1, EPP_CString );
+ const sal_Unicode* pCustomShowName = customShowName.getStr();
+ for ( sal_uInt32 k = 0; k < nNamedShowLen; ++k )
+ mpStrm->WriteUInt16( pCustomShowName[ k ] );
+ mAny = aXCont->getByName( customShowName );
+ css::uno::Reference< css::container::XIndexContainer > aXIC;
+ if ( mAny >>= aXIC )
+ {
+ mpPptEscherEx->BeginAtom();
+
+ sal_Int32 nSlideCount = aXIC->getCount();
+ for ( sal_Int32 j = 0; j < nSlideCount; j++ ) // number of slides
+ {
+ mAny = aXIC->getByIndex( j );
+ css::uno::Reference< css::drawing::XDrawPage > aXDrawPage;
+ if ( mAny >>= aXDrawPage )
+ {
+ css::uno::Reference< css::container::XNamed > aXName( aXDrawPage, css::uno::UNO_QUERY );
+ if ( aXName.is() )
+ {
+ OUString aSlideName( aXName->getName() );
+ std::vector<OUString>::const_iterator pIter = std::find(
+ maSlideNameList.begin(),maSlideNameList.end(),aSlideName);
+
+ if (pIter != maSlideNameList.end())
+ {
+ sal_uInt32 nPageNumber = pIter - maSlideNameList.begin();
+ mpStrm->WriteUInt32( nPageNumber + 0x100 ); // unique slide id
+ }
+ }
+ }
+ }
+ mpPptEscherEx->EndAtom( EPP_NamedShowSlides );
+ }
+ mpPptEscherEx->CloseContainer(); // EPP_NamedShow
+ }
+ }
+ mpPptEscherEx->CloseContainer(); // EPP_NamedShows
+ }
+ }
+ }
+ }
+ }
+ }
+ mpPptEscherEx->AddAtom( 0, EPP_EndDocument );
+ mpPptEscherEx->CloseContainer(); // EPP_Document
+ return true;
+};
+
+void PPTWriter::ImplCreateHyperBlob( SvMemoryStream& rStrm )
+{
+ sal_uInt32 nCurrentOfs, nParaOfs, nParaCount = 0;
+
+ nParaOfs = rStrm.Tell();
+ rStrm.WriteUInt32( 0 ); // property size
+ rStrm.WriteUInt32( 0 ); // property count
+
+ for ( const auto& rHyperlink : maHyperlink )
+ {
+ nParaCount += 6;
+ rStrm .WriteUInt32( 3 ) // Type VT_I4
+ .WriteUInt32( 7 ) // (VTI4 - Private1)
+ .WriteUInt32( 3 ) // Type VT_I4
+ .WriteUInt32( 6 ) // (VTI4 - Private2)
+ .WriteUInt32( 3 ) // Type VT_I4
+ .WriteUInt32( 0 ); // (VTI4 - Private3)
+
+ // INFO
+ // HIWORD: = 0 : do not change anything
+ // = 1 : replace the hyperlink with the target and subaddress in the following two VTLPWSTR
+ // = 2 : delete the hyperlink
+ // LOWORD: = 0 : graphic shown as background (link)
+ // = 1 : graphic shown as shape (link)
+ // = 2 : graphic is used to fill a shape
+ // = 3 : graphic used to fill a shape outline (future use)
+ // = 4 : hyperlink attached to a shape
+ // = 5 : " " " " (Word) field
+ // = 6 : " " " " (Excel) range
+ // = 7 : " " " " (PPT) text range
+ // = 8 : " " " " (Project) task
+
+ sal_Int32 nUrlLen = rHyperlink.aURL.getLength();
+ const OUString& rUrl = rHyperlink.aURL;
+
+ sal_uInt32 const nInfo = 7;
+
+ rStrm .WriteUInt32( 3 ) // Type VT_I4
+ .WriteUInt32( nInfo ); // Info
+
+ switch( rHyperlink.nType & 0xff )
+ {
+ case 1 : // click action to slidenumber
+ {
+ rStrm.WriteUInt32( 0x1f ).WriteUInt32( 1 ).WriteUInt32( 0 ); // path
+ rStrm.WriteUInt32( 0x1f ).WriteUInt32( nUrlLen + 1 );
+ for ( sal_Int32 i = 0; i < nUrlLen; i++ )
+ {
+ rStrm.WriteUInt16( rUrl[ i ] );
+ }
+ rStrm.WriteUInt16( 0 );
+ }
+ break;
+ case 2 :
+ {
+ sal_Int32 i;
+
+ rStrm .WriteUInt32( 0x1f )
+ .WriteUInt32( nUrlLen + 1 );
+ for ( i = 0; i < nUrlLen; i++ )
+ {
+ rStrm.WriteUInt16( rUrl[ i ] );
+ }
+ if ( ! ( i & 1 ) )
+ rStrm.WriteUInt16( 0 );
+ rStrm .WriteUInt16( 0 )
+ .WriteUInt32( 0x1f )
+ .WriteUInt32( 1 )
+ .WriteUInt32( 0 );
+ }
+ break;
+ }
+ }
+ nCurrentOfs = rStrm.Tell();
+ rStrm.Seek( nParaOfs );
+ rStrm.WriteUInt32( nCurrentOfs - ( nParaOfs + 4 ) );
+ rStrm.WriteUInt32( nParaCount );
+ rStrm.Seek( nCurrentOfs );
+}
+
+bool PPTWriter::ImplCreateMainNotes()
+{
+ EscherSolverContainer aSolverContainer;
+
+ mpPptEscherEx->PtReplaceOrInsert( EPP_Persist_MainNotes, mpStrm->Tell() );
+ mpPptEscherEx->OpenContainer( EPP_Notes );
+ mpPptEscherEx->AddAtom( 8, EPP_NotesAtom, 1 );
+ mpStrm->WriteUInt32( 0x80000001 ) // Number that identifies this slide
+ .WriteUInt32( 0 ); // follow nothing
+ mpPptEscherEx->OpenContainer( EPP_PPDrawing );
+ mpPptEscherEx->OpenContainer( ESCHER_DgContainer );
+ mpPptEscherEx->EnterGroup(nullptr,nullptr);
+
+ ImplWritePage( GetLayout( 20 ), aSolverContainer, NOTICE, true );
+
+ mpPptEscherEx->LeaveGroup();
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, ShapeFlag::Background | ShapeFlag::HaveShapeProperty );
+ EscherPropertyContainer aPropOpt;
+ aPropOpt.AddOpt( ESCHER_Prop_fillColor, 0xffffff ); // stock valued fill color
+ aPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0 );
+ aPropOpt.AddOpt( ESCHER_Prop_fillRectRight, 0x68bdde );
+ aPropOpt.AddOpt( ESCHER_Prop_fillRectBottom, 0x8b9f8e );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x120012 );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0 );
+ aPropOpt.AddOpt( ESCHER_Prop_bWMode, ESCHER_wDontShow );
+ aPropOpt.AddOpt( ESCHER_Prop_fBackground, 0x10001 ); // if true, this is the background shape
+ aPropOpt.Commit( *mpStrm );
+ mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
+
+ aSolverContainer.WriteSolver( *mpStrm );
+
+ mpPptEscherEx->CloseContainer(); // ESCHER_DgContainer
+ mpPptEscherEx->CloseContainer(); // EPP_Drawing
+ mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 1 );
+ mpStrm->WriteUInt32( 0xffffff ).WriteUInt32( 0x000000 ).WriteUInt32( 0x808080 ).WriteUInt32( 0x000000 ).WriteUInt32( 0x99cc00 ).WriteUInt32( 0xcc3333 ).WriteUInt32( 0xffcccc ).WriteUInt32( 0xb2b2b2 );
+ mpPptEscherEx->CloseContainer(); // EPP_Notes
+ return true;
+}
+
+static OUString getInitials( const OUString& rName )
+{
+ OUStringBuffer sInitials;
+
+ const sal_Unicode * pStr = rName.getStr();
+ sal_Int32 nLength = rName.getLength();
+
+ while( nLength )
+ {
+ // skip whitespace
+ while( nLength && (*pStr <= ' ') )
+ {
+ nLength--; pStr++;
+ }
+
+ // take letter
+ if( nLength )
+ {
+ sInitials.append( *pStr );
+ nLength--; pStr++;
+ }
+
+ // skip letters until whitespace
+ while( nLength && (*pStr > ' ') )
+ {
+ nLength--; pStr++;
+ }
+ }
+
+ return sInitials.makeStringAndClear();
+}
+
+void ImplExportComments( const uno::Reference< drawing::XDrawPage >& xPage, SvMemoryStream& rBinaryTagData10Atom )
+{
+ try
+ {
+ uno::Reference< office::XAnnotationAccess > xAnnotationAccess( xPage, uno::UNO_QUERY_THROW );
+ uno::Reference< office::XAnnotationEnumeration > xAnnotationEnumeration( xAnnotationAccess->createAnnotationEnumeration() );
+
+ sal_Int32 nIndex = 1;
+
+ while( xAnnotationEnumeration->hasMoreElements() )
+ {
+ EscherExContainer aComment10( rBinaryTagData10Atom, EPP_Comment10 );
+ {
+ uno::Reference< office::XAnnotation > xAnnotation( xAnnotationEnumeration->nextElement() );
+
+ geometry::RealPoint2D aRealPoint2D( xAnnotation->getPosition() );
+ Point aPoint(o3tl::convert(aRealPoint2D.X, o3tl::Length::mm, o3tl::Length::master),
+ o3tl::convert(aRealPoint2D.Y, o3tl::Length::mm, o3tl::Length::master));
+
+ OUString sAuthor( xAnnotation->getAuthor() );
+ uno::Reference< text::XText > xText( xAnnotation->getTextRange() );
+ OUString sText( xText->getString() );
+ OUString sInitials( getInitials( sAuthor ) );
+ util::DateTime aDateTime( xAnnotation->getDateTime() );
+ if ( !sAuthor.isEmpty() )
+ PPTWriter::WriteCString( rBinaryTagData10Atom, sAuthor );
+ if ( !sText.isEmpty() )
+ PPTWriter::WriteCString( rBinaryTagData10Atom, sText, 1 );
+ if ( !sInitials.isEmpty() )
+ PPTWriter::WriteCString( rBinaryTagData10Atom, sInitials, 2 );
+
+ sal_Int16 nMilliSeconds = static_cast<sal_Int16>(::rtl::math::round(static_cast<double>(aDateTime.NanoSeconds) / 1000000000.0));
+ EscherExAtom aCommentAtom10( rBinaryTagData10Atom, EPP_CommentAtom10 );
+ rBinaryTagData10Atom.WriteInt32( nIndex++ )
+ .WriteInt16( aDateTime.Year )
+ .WriteUInt16( aDateTime.Month )
+ .WriteUInt16( aDateTime.Day ) // todo: day of week
+ .WriteUInt16( aDateTime.Day )
+ .WriteUInt16( aDateTime.Hours )
+ .WriteUInt16( aDateTime.Minutes )
+ .WriteUInt16( aDateTime.Seconds )
+ .WriteInt16( nMilliSeconds )
+ .WriteInt32( aPoint.X() )
+ .WriteInt32( aPoint.Y() );
+ }
+ }
+ }
+ catch ( uno::Exception& )
+ {
+ }
+}
+
+void PPTWriter::ImplWriteNotes( sal_uInt32 nPageNum )
+{
+ mpPptEscherEx->PtReplaceOrInsert( EPP_Persist_Notes | nPageNum, mpStrm->Tell() );
+ mpPptEscherEx->OpenContainer( EPP_Notes );
+ mpPptEscherEx->AddAtom( 8, EPP_NotesAtom, 1 );
+ mpStrm->WriteUInt32( nPageNum + 0x100 )
+ .WriteUInt16( 3 ) // follow master...
+ .WriteUInt16( 0 );
+
+ ImplCreateHeaderFooters( mXPagePropSet );
+
+ EscherSolverContainer aSolverContainer;
+
+ mpPptEscherEx->OpenContainer( EPP_PPDrawing );
+ mpPptEscherEx->OpenContainer( ESCHER_DgContainer );
+ mpPptEscherEx->EnterGroup(nullptr,nullptr);
+
+ ImplWritePage( GetLayout( 20 ), aSolverContainer, NOTICE, false ); // the shapes of the pages are created in the PPT document
+
+ mpPptEscherEx->LeaveGroup();
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, ShapeFlag::Background | ShapeFlag::HaveShapeProperty );
+ EscherPropertyContainer aPropOpt;
+ aPropOpt.AddOpt( ESCHER_Prop_fillColor, 0xffffff ); // stock valued fill color
+ aPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0 );
+ aPropOpt.AddOpt( ESCHER_Prop_fillRectRight, 0x8b9f8e );
+ aPropOpt.AddOpt( ESCHER_Prop_fillRectBottom, 0x68bdde );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x120012 );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
+ aPropOpt.AddOpt( ESCHER_Prop_bWMode, ESCHER_wDontShow );
+ aPropOpt.AddOpt( ESCHER_Prop_fBackground, 0x10001 );
+ aPropOpt.Commit( *mpStrm );
+ mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
+
+ aSolverContainer.WriteSolver( *mpStrm );
+
+ mpPptEscherEx->CloseContainer(); // ESCHER_DgContainer
+ mpPptEscherEx->CloseContainer(); // EPP_Drawing
+ mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 1 );
+ mpStrm->WriteUInt32( 0xffffff ).WriteUInt32( 0x000000 ).WriteUInt32( 0x808080 ).WriteUInt32( 0x000000 ).WriteUInt32( 0x99cc00 ).WriteUInt32( 0xcc3333 ).WriteUInt32( 0xffcccc ).WriteUInt32( 0xb2b2b2 );
+ mpPptEscherEx->CloseContainer(); // EPP_Notes
+};
+
+void PPTWriter::ImplWriteBackground( css::uno::Reference< css::beans::XPropertySet > const & rXPropSet )
+{
+ //************************ ******
+ //** DEFAULT BACKGROUND SHAPE **
+
+ sal_uInt32 nFillColor = 0xffffff;
+ sal_uInt32 nFillBackColor = 0;
+
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, ShapeFlag::Background | ShapeFlag::HaveShapeProperty );
+
+ // #i121183# Use real PageSize in 100th mm
+ ::tools::Rectangle aRect(Point(0, 0), Size(maPageSize.Width, maPageSize.Height));
+
+ EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm.get(), aRect );
+ aPropOpt.AddOpt( ESCHER_Prop_fillType, ESCHER_FillSolid );
+ css::drawing::FillStyle aFS( css::drawing::FillStyle_NONE );
+ if ( ImplGetPropertyValue( rXPropSet, "FillStyle" ) )
+ mAny >>= aFS;
+
+ switch( aFS )
+ {
+ case css::drawing::FillStyle_GRADIENT :
+ {
+ aPropOpt.CreateGradientProperties( rXPropSet );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x1f001e );
+ aPropOpt.GetOpt( ESCHER_Prop_fillColor, nFillColor );
+ aPropOpt.GetOpt( ESCHER_Prop_fillBackColor, nFillBackColor );
+ }
+ break;
+
+ case css::drawing::FillStyle_BITMAP :
+ aPropOpt.CreateGraphicProperties( rXPropSet, "FillBitmap", true );
+ break;
+
+ case css::drawing::FillStyle_HATCH :
+ aPropOpt.CreateGraphicProperties( rXPropSet, "FillHatch", true );
+ break;
+
+ case css::drawing::FillStyle_SOLID :
+ {
+ if ( ImplGetPropertyValue( rXPropSet, "FillColor" ) )
+ {
+ nFillColor = EscherEx::GetColor( *o3tl::doAccess<sal_uInt32>(mAny) );
+ nFillBackColor = nFillColor ^ 0xffffff;
+ }
+ [[fallthrough]];
+ }
+ case css::drawing::FillStyle_NONE :
+ default:
+ aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x120012 );
+ break;
+ }
+ aPropOpt.AddOpt( ESCHER_Prop_fillColor, nFillColor );
+ aPropOpt.AddOpt( ESCHER_Prop_fillBackColor, nFillBackColor );
+ aPropOpt.AddOpt( ESCHER_Prop_fillRectRight, PPTtoEMU( maDestPageSize.Width ) );
+ aPropOpt.AddOpt( ESCHER_Prop_fillRectBottom, PPTtoEMU( maDestPageSize.Height ) );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
+ aPropOpt.AddOpt( ESCHER_Prop_bWMode, ESCHER_bwWhite );
+ aPropOpt.AddOpt( ESCHER_Prop_fBackground, 0x10001 );
+ aPropOpt.Commit( *mpStrm );
+ mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
+}
+
+void PPTWriter::ImplWriteVBA()
+{
+ if ( mpVBA )
+ {
+ sal_uInt32 nLen = mpVBA->TellEnd();
+ if ( nLen > 8 )
+ {
+ nLen -= 8;
+ mnVBAOleOfs = mpStrm->Tell();
+ mpPptEscherEx->BeginAtom();
+ mpStrm->WriteBytes(static_cast<sal_Int8 const *>(mpVBA->GetData()) + 8, nLen);
+ mpPptEscherEx->EndAtom( EPP_ExOleObjStg, 0, 1 );
+ }
+ }
+}
+
+void PPTWriter::ImplWriteOLE( )
+{
+
+ SvxMSExportOLEObjects aOleExport( mnCnvrtFlags );
+
+ for ( const auto& rxExOleObjEntry : maExOleObj )
+ {
+ PPTExOleObjEntry* pPtr = rxExOleObjEntry.get();
+ std::unique_ptr<SvMemoryStream> pStrm;
+ pPtr->nOfsB = mpStrm->Tell();
+ switch ( pPtr->eType )
+ {
+ case NORMAL_OLE_OBJECT :
+ {
+ SdrObject* pSdrObj = SdrObject::getSdrObjectFromXShape(pPtr->xShape);
+ if ( auto pSdrOle2Obj = dynamic_cast< SdrOle2Obj* >(pSdrObj) )
+ {
+ const ::uno::Reference < embed::XEmbeddedObject >& xObj( pSdrOle2Obj->GetObjRef() );
+ if( xObj.is() )
+ {
+ tools::SvRef<SotStorage> xTempStorage( new SotStorage( new SvMemoryStream(), true ) );
+ aOleExport.ExportOLEObject( xObj, *xTempStorage );
+
+ //TODO/MBA: testing
+ SvMemoryStream aStream;
+ tools::SvRef<SotStorage> xCleanStorage( new SotStorage( false, aStream ) );
+ xTempStorage->CopyTo( xCleanStorage.get() );
+ // create a dummy content stream, the dummy content is necessary for ppt, but not for
+ // doc files, so we can't share code.
+ tools::SvRef<SotStorageStream> xStm = xCleanStorage->OpenSotStream( SVEXT_PERSIST_STREAM );
+ xStm->WriteUInt32( 0 ) // no ClipboardId
+ .WriteUInt32( 4 ) // no target device
+ .WriteUInt32( 1 ) // aspect ratio
+ .WriteInt32( -1 ) // L-Index
+ .WriteUInt32( 0 ) // Advanced Flags
+ .WriteUInt32( 0 ) // compression
+ .WriteUInt32( 0 ) // Size
+ .WriteUInt32( 0 ) // "
+ .WriteUInt32( 0 );
+ pStrm = xCleanStorage->CreateMemoryStream();
+ }
+ }
+ }
+ break;
+
+ case OCX_CONTROL :
+ {
+ if ( pPtr->xControlModel.is() )
+ {
+ OUString aName;
+ //Initialize the graphic size which will be used on export
+ css::awt::Size aSize( pPtr->xShape->getSize() );
+ tools::SvRef<SotStorage> xDest( new SotStorage( new SvMemoryStream(), true ) );
+ bool bOk = oox::ole::MSConvertOCXControls::WriteOCXStream( mXModel, xDest, pPtr->xControlModel, aSize, aName );
+ if ( bOk )
+ pStrm = xDest->CreateMemoryStream();
+ }
+ }
+ }
+ if ( pStrm )
+ {
+ mpPptEscherEx->BeginAtom();
+ pStrm->Seek( STREAM_SEEK_TO_END );
+ sal_uInt32 npStrmSize = pStrm->Tell();
+ mpStrm->WriteUInt32( npStrmSize ); // uncompressed size
+
+ pStrm->Seek( 0 );
+ ZCodec aZCodec( 0x8000, 0x8000 );
+ aZCodec.BeginCompression();
+ aZCodec.Compress( *pStrm, *mpStrm );
+ aZCodec.EndCompression();
+ pStrm.reset();
+ mpPptEscherEx->EndAtom( EPP_ExOleObjStg, 0, 1 );
+ }
+ }
+}
+
+// write PersistantTable and UserEditAtom
+
+void PPTWriter::ImplWriteAtomEnding()
+{
+
+#define EPP_LastViewTypeSlideView 1
+
+ sal_uInt32 i, nPos, nOfs, nPersistOfs = mpStrm->Tell();
+ sal_uInt32 nPersistEntrys = 0;
+ mpStrm->WriteUInt32( 0 ).WriteUInt32( 0 ).WriteUInt32( 0 ); // skip record header and first entry
+
+ // write document persist
+ nPersistEntrys++;
+ mpStrm->WriteUInt32( 0 );
+ // write MasterPages persists
+ for ( i = 0; i < mnMasterPages; i++ )
+ {
+ nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_MainMaster | i );
+ if ( nOfs )
+ {
+ mpStrm->WriteUInt32( nOfs );
+ mpPptEscherEx->InsertAtPersistOffset( EPP_MAINMASTER_PERSIST_KEY | i, ++nPersistEntrys );
+ }
+ }
+ // write MainNotesMaster persist
+ nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_MainNotes );
+ if ( nOfs )
+ {
+ mpStrm->WriteUInt32( nOfs );
+ mpPptEscherEx->InsertAtPersistOffset( EPP_MAINNOTESMASTER_PERSIST_KEY, ++nPersistEntrys );
+ }
+ // write slide persists -> we have to write a valid value into EPP_SlidePersistAtome too
+ for ( i = 0; i < mnPages; i++ )
+ {
+ nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_Slide | i );
+ if ( nOfs )
+ {
+ mpStrm->WriteUInt32( nOfs );
+ mpPptEscherEx->InsertAtPersistOffset( EPP_MAINSLIDE_PERSIST_KEY | i, ++nPersistEntrys );
+ }
+ }
+ // write Notes persists
+ for ( i = 0; i < mnPages; i++ )
+ {
+ nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_Notes | i );
+ if ( nOfs )
+ {
+ mpStrm->WriteUInt32( nOfs );
+ mpPptEscherEx->InsertAtPersistOffset( EPP_MAINNOTES_PERSIST_KEY | i, ++nPersistEntrys );
+ }
+ }
+ // Ole persists
+ for ( const auto& rxExOleObjEntry : maExOleObj )
+ {
+ PPTExOleObjEntry* pPtr = rxExOleObjEntry.get();
+ nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_ExObj );
+ if ( nOfs )
+ {
+ nPersistEntrys++;
+ mpStrm->WriteUInt32( pPtr->nOfsB );
+ sal_uInt32 nOldPos, nPersOfs = nOfs + pPtr->nOfsA + 16 + 8; // 8 bytes atom header, +16 to the persist entry
+ nOldPos = mpStrm->Tell();
+ mpStrm->Seek( nPersOfs );
+ mpStrm->WriteUInt32( nPersistEntrys );
+ mpStrm->Seek( nOldPos );
+ }
+ }
+ // VB persist
+ if ( mnVBAOleOfs && mpVBA )
+ {
+ nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_VBAInfoAtom );
+ if ( nOfs )
+ {
+ nPersistEntrys++;
+ sal_uInt32 n1, n2;
+
+ mpVBA->Seek( 0 );
+ mpVBA->ReadUInt32( n1 )
+ .ReadUInt32( n2 );
+
+ mpStrm->WriteUInt32( mnVBAOleOfs );
+ sal_uInt32 nOldPos = mpStrm->Tell();
+ mpStrm->Seek( nOfs ); // Fill the VBAInfoAtom with the correct index to the persisttable
+ mpStrm->WriteUInt32( nPersistEntrys )
+ .WriteUInt32( n1 )
+ .WriteInt32( 2 );
+ mpStrm->Seek( nOldPos );
+
+ }
+ }
+ nPos = mpStrm->Tell();
+ mpStrm->Seek( nPersistOfs );
+ mpPptEscherEx->AddAtom( ( nPersistEntrys + 1 ) << 2, EPP_PersistPtrIncrementalBlock ); // insert Record Header
+ mpStrm->WriteUInt32( ( nPersistEntrys << 20 ) | 1 );
+ mpStrm->Seek( nPos );
+
+ mpCurUserStrm->WriteUInt32( nPos ); // set offset to current edit
+ mpPptEscherEx->AddAtom( 28, EPP_UserEditAtom );
+ mpStrm->WriteInt32( 0x100 ) // last slide ID
+ .WriteUInt32( 0x03000dbc ) // minor and major app version that did the save
+ .WriteUInt32( 0 ) // offset last save, 0 after a full save
+ .WriteUInt32( nPersistOfs ) // File offset to persist pointers for this save operation
+ .WriteUInt32( 1 ) // Persist reference to the document persist object
+ .WriteUInt32( nPersistEntrys ) // max persists written, Seed value for persist object id management
+ .WriteInt16( EPP_LastViewTypeSlideView ) // last view type
+ .WriteInt16( 0x12 ); // padword
+}
+
+// - exported function -
+
+extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool ExportPPT( const std::vector< css::beans::PropertyValue >& rMediaData,
+ tools::SvRef<SotStorage> const & rSvStorage,
+ css::uno::Reference< css::frame::XModel > const & rXModel,
+ css::uno::Reference< css::task::XStatusIndicator > const & rXStatInd,
+ SvMemoryStream* pVBA,
+ sal_uInt32 nCnvrtFlags )
+{
+ PPTWriter aPPTWriter( rSvStorage, rXModel, rXStatInd, pVBA, nCnvrtFlags );
+ aPPTWriter.exportPPT(rMediaData);
+ bool bStatus = aPPTWriter.IsValid();
+ return bStatus;
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SaveVBA( SfxObjectShell& rDocShell, SvMemoryStream*& pBas )
+{
+ tools::SvRef<SotStorage> xDest( new SotStorage( new SvMemoryStream(), true ) );
+ SvxImportMSVBasic aMSVBas( rDocShell, *xDest );
+ aMSVBas.SaveOrDelMSVBAStorage( true, "_MS_VBA_Overhead" );
+
+ tools::SvRef<SotStorage> xOverhead = xDest->OpenSotStorage( "_MS_VBA_Overhead" );
+ if ( xOverhead.is() && ( xOverhead->GetError() == ERRCODE_NONE ) )
+ {
+ tools::SvRef<SotStorage> xOverhead2 = xOverhead->OpenSotStorage( "_MS_VBA_Overhead" );
+ if ( xOverhead2.is() && ( xOverhead2->GetError() == ERRCODE_NONE ) )
+ {
+ tools::SvRef<SotStorageStream> xTemp = xOverhead2->OpenSotStream( "_MS_VBA_Overhead2" );
+ if ( xTemp.is() && ( xTemp->GetError() == ERRCODE_NONE ) )
+ {
+ sal_uInt32 nLen = xTemp->GetSize();
+ if ( nLen )
+ {
+ char* pTemp = new char[ nLen ];
+ xTemp->Seek( STREAM_SEEK_TO_BEGIN );
+ xTemp->ReadBytes(pTemp, nLen);
+ pBas = new SvMemoryStream( pTemp, nLen, StreamMode::READ );
+ pBas->ObjectOwnsMemory( true );
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/eppt.hxx b/sd/source/filter/eppt/eppt.hxx
new file mode 100644
index 000000000..eec839290
--- /dev/null
+++ b/sd/source/filter/eppt/eppt.hxx
@@ -0,0 +1,232 @@
+/* -*- 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 .
+ */
+
+#pragma once
+#include <memory>
+#include <vector>
+#include "escherex.hxx"
+#include <sal/types.h>
+#include <sot/storage.hxx>
+#include "pptexsoundcollection.hxx"
+
+#include "text.hxx"
+
+#include <com/sun/star/presentation/AnimationEffect.hpp>
+#include <com/sun/star/presentation/ClickAction.hpp>
+
+#include "epptbase.hxx"
+
+namespace com::sun::star::awt { class XControlModel; }
+namespace com::sun::star::beans { class XPropertySet; }
+namespace com::sun::star::beans { struct PropertyValue; }
+namespace com::sun::star::drawing { class XShape; }
+namespace com::sun::star::frame { class XModel; }
+namespace com::sun::star::task { class XStatusIndicator; }
+namespace com::sun::star::text { class XSimpleText; }
+
+class SotStorage;
+
+#define EPP_MAINMASTER_PERSIST_KEY 0x80010000
+#define EPP_MAINNOTESMASTER_PERSIST_KEY 0x80020000
+#define EPP_MAINSLIDE_PERSIST_KEY 0x80030000
+#define EPP_MAINNOTES_PERSIST_KEY 0x80040000
+
+#define EPP_Persist_Document 0x80080000
+#define EPP_Persist_MainMaster 0x80100000
+#define EPP_Persist_MainNotes 0x80200000
+#define EPP_Persist_Slide 0x80400000
+#define EPP_Persist_Notes 0x80800000
+#define EPP_Persist_CurrentPos 0x81000000
+#define EPP_Persist_VBAInfoAtom 0x84000000
+#define EPP_Persist_ExObj 0x88000000
+
+#define EPP_TEXTSTYLE_NORMAL 0x00000001
+#define EPP_TEXTSTYLE_TITLE 0x00000010
+#define EPP_TEXTSTYLE_BODY 0x00000100
+#define EPP_TEXTSTYLE_TEXT 0x00001000
+
+struct EPPTHyperlink
+{
+ OUString aURL;
+ sal_uInt32 nType; // bit 0-7 : type ( 1: click action to a slide )
+ // ( 2: hyperlink url )
+ // bit 8-23: index
+ // bit 31 : hyperlink is attached to a shape
+
+ EPPTHyperlink( const OUString& rURL, sal_uInt32 nT ) :
+ aURL ( rURL ),
+ nType ( nT ){};
+};
+
+enum PPTExOleObjEntryType
+{
+ NORMAL_OLE_OBJECT, OCX_CONTROL
+};
+
+struct PPTExOleObjEntry
+{
+ PPTExOleObjEntryType eType;
+ sal_uInt32 nOfsA; ///< offset to the EPP_ExOleObjAtom in mpExEmbed (set at creation)
+ sal_uInt32 nOfsB; ///< offset to the EPP_ExOleObjStg
+
+ css::uno::Reference< css::awt::XControlModel > xControlModel;
+ css::uno::Reference< css::drawing::XShape > xShape;
+
+ PPTExOleObjEntry(PPTExOleObjEntryType eT, sal_uInt32 nOfs)
+ : eType(eT)
+ , nOfsA(nOfs)
+ , nOfsB(0)
+ {}
+};
+
+struct TextRuleEntry
+{
+ std::unique_ptr<SvMemoryStream> pOut;
+};
+
+class TextObjBinary : public TextObj
+{
+public:
+ TextObjBinary( css::uno::Reference< css::text::XSimpleText > const & rXText,
+ int nInstance, FontCollection& rFontCollection, PPTExBulletProvider& rBuProv ) : TextObj( rXText, nInstance, rFontCollection, rBuProv ) {}
+ void Write( SvStream* pStrm );
+ void WriteTextSpecInfo( SvStream* pStrm );
+};
+
+struct CellBorder;
+class PPTWriter final : public PPTWriterBase, public PPTExBulletProvider
+{
+ sal_uInt32 mnCnvrtFlags;
+ bool mbStatus;
+ sal_uInt32 mnStatMaxValue;
+ sal_uInt32 mnLatestStatValue;
+
+ std::vector<OUString> maSlideNameList;
+ OUString maBaseURI;
+
+ css::uno::Reference< css::text::XSimpleText > mXText; // TextRef of the global text
+ sal_uInt32 mnTextStyle;
+
+ bool mbFontIndependentLineSpacing;
+ sal_uInt32 mnTextSize;
+
+ tools::SvRef<SotStorage> mrStg;
+ tools::SvRef<SotStorageStream> mpCurUserStrm;
+ tools::SvRef<SotStorageStream> mpStrm;
+ tools::SvRef<SotStorageStream> mpPicStrm;
+ std::unique_ptr<PptEscherEx> mpPptEscherEx;
+
+ std::vector<std::unique_ptr<PPTExOleObjEntry>> maExOleObj;
+ sal_uInt32 mnVBAOleOfs;
+ SvMemoryStream* mpVBA;
+ sal_uInt32 mnExEmbed;
+ std::unique_ptr<SvMemoryStream> mpExEmbed;
+
+ sal_uInt32 mnPagesWritten;
+ sal_uInt32 mnTxId; // Identifier determined by the HOST (PP) ????
+ sal_uInt32 mnDiaMode; // 0 -> manual
+ // 1 -> semi-automatic
+ // 2 -> automatic
+
+ sal_uInt32 mnShapeMasterTitle;
+ sal_uInt32 mnShapeMasterBody;
+
+ std::vector<EPPTHyperlink> maHyperlink;
+
+ ppt::ExSoundCollection maSoundCollection;
+
+ void ImplWriteExtParaHeader( SvMemoryStream& rSt, sal_uInt32 nRef, sal_uInt32 nInstance, sal_uInt32 nSlideId );
+
+ sal_uInt32 ImplProgBinaryTag( SvStream* pOutStrm );
+ sal_uInt32 ImplProgBinaryTagContainer( SvStream* pOutStrm, SvMemoryStream* pBinTag );
+ sal_uInt32 ImplProgTagContainer( SvStream* pOutStrm, SvMemoryStream* pBinTag = nullptr );
+ static sal_uInt32 ImplOutlineViewInfoContainer( SvStream* pOutStrm );
+ static sal_uInt32 ImplSlideViewInfoContainer( sal_uInt32 nInstance, SvStream* pOutStrm );
+ sal_uInt32 ImplVBAInfoContainer( SvStream* pOutStrm );
+ sal_uInt32 ImplDocumentListContainer( SvStream* pOutStrm );
+ sal_uInt32 ImplMasterSlideListContainer( SvStream* pOutStrm );
+
+ public:
+ static void WriteCString( SvStream&, const OUString&, sal_uInt32 nInstance = 0 );
+
+ private:
+
+ void ImplCreateDocumentSummaryInformation();
+ bool ImplCreateCurrentUserStream();
+ static void ImplCreateHeaderFooterStrings( SvStream& rOut,
+ css::uno::Reference< css::beans::XPropertySet > const & rXPagePropSet );
+ void ImplCreateHeaderFooters( css::uno::Reference< css::beans::XPropertySet > const & rXPagePropSet );
+ virtual bool ImplCreateDocument() override;
+ void ImplCreateHyperBlob( SvMemoryStream& rStream );
+ sal_uInt32 ImplInsertBookmarkURL( const OUString& rBookmark, const sal_uInt32 nType,
+ const OUString& rStringVer0, const OUString& rStringVer1, const OUString& rStringVer2, const OUString& rStringVer3 );
+ virtual bool ImplCreateMainNotes() override;
+ void ImplWriteBackground( css::uno::Reference< css::beans::XPropertySet > const & rXBackgroundPropSet );
+ void ImplWriteVBA();
+ void ImplWriteOLE();
+ void ImplWriteAtomEnding();
+
+ void ImplFlipBoundingBox( EscherPropertyContainer& rPropOpt );
+ bool ImplGetText();
+ bool ImplCreatePresentationPlaceholder( const bool bMaster,
+ const sal_uInt32 StyleInstance, const sal_uInt8 PlaceHolderId );
+ static bool ImplGetEffect( const css::uno::Reference< css::beans::XPropertySet > &,
+ css::presentation::AnimationEffect& eEffect,
+ css::presentation::AnimationEffect& eTextEffect,
+ bool& bHasSound );
+ void ImplWriteClickAction( SvStream& rSt, css::presentation::ClickAction eAction, bool bMediaClickAction );
+ void ImplWriteParagraphs( SvStream& rOutStrm, TextObj& rTextObj );
+ void ImplWritePortions( SvStream& rOutStrm, TextObj& rTextObj );
+ void ImplWriteTextStyleAtom( SvStream& rOut, int nTextInstance, sal_uInt32 nAtomInstance,
+ TextRuleEntry* pTextRule, SvStream& rExtBu, EscherPropertyContainer* );
+ void ImplAdjustFirstLineLineSpacing( TextObj& rTextObj, EscherPropertyContainer& rPropOpt );
+ void ImplCreateShape( sal_uInt32 nType, ShapeFlag nFlags, EscherSolverContainer& );
+ void ImplCreateTextShape( EscherPropertyContainer&, EscherSolverContainer&, bool bFill );
+
+ void ImplWritePage( const PHLayout& rLayout,
+ EscherSolverContainer& rSolver,
+ PageType ePageType,
+ bool bMaster,
+ int nPageNumber = 0 );
+ bool ImplCreateCellBorder( const CellBorder* pCellBorder, sal_Int32 nX1, sal_Int32 nY1, sal_Int32 nX2, sal_Int32 nY2 );
+ void ImplCreateTable( css::uno::Reference< css::drawing::XShape > const & rXShape, EscherSolverContainer& aSolverContainer,
+ EscherPropertyContainer& aPropOpt );
+
+ bool ImplCloseDocument(); // we write the font, hyper and sound list
+
+ virtual void ImplWriteSlide( sal_uInt32 nPageNum, sal_uInt32 nMasterID, sal_uInt16 nMode,
+ bool bHasBackground, css::uno::Reference< css::beans::XPropertySet > const & aXBackgroundPropSet ) override;
+ virtual void ImplWriteNotes( sal_uInt32 nPageNum ) override;
+ virtual void ImplWriteSlideMaster( sal_uInt32 nPageNum, css::uno::Reference< css::beans::XPropertySet > const & aXBackgroundPropSet ) override;
+
+ public:
+ PPTWriter( tools::SvRef<SotStorage> const & rSvStorage,
+ css::uno::Reference< css::frame::XModel > const & rModel,
+ css::uno::Reference< css::task::XStatusIndicator > const & rStatInd,
+ SvMemoryStream* pVBA, sal_uInt32 nCnvrtFlags );
+
+ virtual ~PPTWriter() override;
+
+ bool IsValid() const { return mbStatus; };
+
+ virtual void exportPPTPre( const std::vector< css::beans::PropertyValue >& ) override;
+ virtual void exportPPTPost( ) override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/epptbase.hxx b/sd/source/filter/eppt/epptbase.hxx
new file mode 100644
index 000000000..e8ac992e3
--- /dev/null
+++ b/sd/source/filter/eppt/epptbase.hxx
@@ -0,0 +1,412 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <vector>
+
+#include <vcl/mapmod.hxx>
+#include <tools/stream.hxx>
+#include <tools/fract.hxx>
+#include <tools/gen.hxx>
+#include <com/sun/star/awt/Size.hpp>
+#include <com/sun/star/awt/Point.hpp>
+#include <com/sun/star/presentation/FadeEffect.hpp>
+#include <com/sun/star/beans/PropertyState.hpp>
+#include <vcl/vclptr.hxx>
+#include <vcl/graph.hxx>
+
+#include "grouptable.hxx"
+
+namespace com::sun::star::task { class XStatusIndicator; }
+namespace com::sun::star::frame { class XModel; }
+namespace com::sun::star::awt { struct Rectangle; }
+namespace com::sun::star::drawing { class XMasterPagesSupplier; }
+namespace com::sun::star::drawing { class XDrawPage; }
+namespace com::sun::star::drawing { class XDrawPages; }
+namespace com::sun::star::drawing { class XDrawPagesSupplier; }
+namespace com::sun::star::beans { struct PropertyValue; }
+namespace com::sun::star::beans { class XPropertySet; }
+namespace com::sun::star::drawing { class XShape; }
+namespace com::sun::star::drawing { class XShapes; }
+
+class VirtualDevice;
+
+// PLACEMENT_ID
+enum class EppLayout
+{
+ TITLESLIDE = 0, /* The slide is a title slide */
+ TITLEANDBODYSLIDE = 1, /* Title and body slide */
+ TITLEMASTERSLIDE = 2, /* Title master slide */
+ MASTERSLIDE = 3, /* Master slide layout */
+ MASTERNOTES = 4, /* Master notes layout */
+ NOTESTITLEBODY = 5, /* Notes title/body layout */
+ HANDOUTLAYOUT = 6, /* Handout layout, therefore it doesn't have placeholders except header, footer, and date */
+ ONLYTITLE = 7, /* Only title placeholder */
+ TWOCOLUMNSANDTITLE = 8, /* Body of the slide has 2 columns and a title */
+ TWOROWSANDTITLE = 9, /* Slide's body has 2 rows and a title */
+ RIGHTCOLUMN2ROWS = 10, /* Body contains 2 columns, right column has 2 rows */
+ LEFTCOLUMN2ROWS = 11, /* Body contains 2 columns, left column has 2 rows */
+ BOTTOMROW2COLUMNS = 12, /* Body contains 2 rows, bottom row has 2 columns */
+ TOPROW2COLUMN = 13, /* Body contains 2 rows, top row has 2 columns */
+ FOUROBJECTS = 14, /* 4 objects */
+ BIGOBJECT = 15, /* Big object */
+ BLANKSLIDE = 16, /* Blank slide */
+ TITLERIGHTBODYLEFT = 17, /* Vertical title on the right, body on the left */
+ TITLERIGHT2BODIESLEFT = 18 /* Vertical title on the right, body on the left split into 2 rows */
+};
+
+#define EPP_LAYOUT_SIZE 25
+
+struct PHLayout
+{
+ EppLayout nLayout;
+ sal_uInt8 nPlaceHolder[ 8 ];
+
+ sal_uInt8 nUsedObjectPlaceHolder;
+ sal_uInt8 nTypeOfTitle;
+ sal_uInt8 nTypeOfOutliner;
+
+ bool bTitlePossible;
+ bool bOutlinerPossible;
+ bool bSecOutlinerPossible;
+};
+
+enum PageType { NORMAL = 0, MASTER = 1, NOTICE = 2, UNDEFINED = 3, LAYOUT = 4 };
+
+class PropValue
+{
+ protected:
+
+ css::uno::Any mAny;
+ css::uno::Reference< css::beans::XPropertySet > mXPropSet;
+
+ bool ImplGetPropertyValue( const OUString& rString );
+ bool ImplGetPropertyValue( const css::uno::Reference
+ < css::beans::XPropertySet > &, const OUString& );
+
+ public:
+
+ PropValue() {}
+
+ static bool GetPropertyValue(
+ css::uno::Any& rAny,
+ const css::uno::Reference< css::beans::XPropertySet > &,
+ const OUString& rPropertyName,
+ bool bTestPropertyAvailability = false );
+
+ static css::beans::PropertyState GetPropertyState(
+ const css::uno::Reference < css::beans::XPropertySet > &,
+ const OUString& rPropertyName );
+};
+
+class EscherGraphicProvider;
+class PPTExBulletProvider
+{
+ friend struct PPTExParaSheet;
+
+ protected:
+
+ SvMemoryStream aBuExPictureStream;
+ SvMemoryStream aBuExOutlineStream;
+ SvMemoryStream aBuExMasterStream;
+
+ std::unique_ptr<EscherGraphicProvider>
+ pGraphicProv;
+
+ public:
+
+ sal_uInt16 GetId(Graphic const & rGraphic, Size& rGraphicSize);
+
+ PPTExBulletProvider();
+ ~PPTExBulletProvider();
+};
+
+struct FontCollectionEntry
+{
+ OUString Name;
+ double Scaling;
+ sal_Int16 Family;
+ sal_Int16 Pitch;
+ sal_Int16 CharSet;
+
+ OUString Original;
+
+ FontCollectionEntry( const OUString& rName, sal_Int16 nFamily, sal_Int16 nPitch, sal_Int16 nCharSet ) :
+ Scaling ( 1.0 ),
+ Family ( nFamily ),
+ Pitch ( nPitch ),
+ CharSet ( nCharSet ),
+ Original( rName )
+ {
+ ImplInit( rName );
+ };
+
+ explicit FontCollectionEntry( const OUString& rName ) :
+ Scaling ( 1.0 ),
+ Family ( 0 ),
+ Pitch ( 0 ),
+ CharSet ( 0 ),
+ Original( rName )
+ {
+ ImplInit( rName );
+ };
+
+ private:
+
+ void ImplInit( const OUString& rName );
+};
+
+class FontCollection
+{
+public:
+
+ FontCollection();
+
+ ~FontCollection();
+
+ static short GetScriptDirection( std::u16string_view rText );
+
+ sal_uInt32 GetId( FontCollectionEntry& rFontDescriptor );
+
+ sal_uInt32 GetCount() const { return maFonts.size(); };
+
+ const FontCollectionEntry* GetById( sal_uInt32 nId );
+
+ FontCollectionEntry& GetLast() { return *(maFonts.rbegin()); };
+
+private:
+
+ VclPtr<VirtualDevice> pVDev;
+ std::vector<FontCollectionEntry> maFonts;
+};
+
+#define PPTEX_STYLESHEETENTRIES 9
+
+enum PPTExTextAttr
+{
+ ParaAttr_BulletOn,
+ ParaAttr_BuHardFont,
+ ParaAttr_BuHardColor,
+ ParaAttr_BuHardHeight,
+ ParaAttr_BulletChar,
+ ParaAttr_BulletFont,
+ ParaAttr_BulletHeight,
+ ParaAttr_BulletColor,
+ ParaAttr_Adjust,
+ ParaAttr_LineFeed,
+ ParaAttr_UpperDist,
+ ParaAttr_LowerDist,
+ ParaAttr_TextOfs,
+ ParaAttr_BulletOfs,
+ ParaAttr_DefaultTab,
+ ParaAttr_BiDi,
+ CharAttr_Bold,
+ CharAttr_Italic,
+ CharAttr_Underline,
+ CharAttr_Shadow,
+ CharAttr_Strikeout,
+ CharAttr_Embossed,
+ CharAttr_Font,
+ CharAttr_AsianOrComplexFont,
+ CharAttr_Symbol,
+ CharAttr_FontHeight,
+ CharAttr_FontColor,
+ CharAttr_Escapement
+};
+
+struct PPTExCharLevel
+{
+ sal_uInt16 mnFlags;
+ sal_uInt16 mnFont;
+ sal_uInt16 mnAsianOrComplexFont;
+ sal_uInt16 mnFontHeight;
+ sal_uInt16 mnEscapement;
+ Color mnFontColor;
+};
+
+struct PPTExCharSheet
+{
+ PPTExCharLevel maCharLevel[ 5 ];
+
+ explicit PPTExCharSheet( int nInstance );
+
+ void SetStyleSheet( const css::uno::Reference< css::beans::XPropertySet > &,
+ FontCollection& rFontCollection, int nLevel );
+ void Write( SvStream& rSt, sal_uInt16 nLev, bool bSimpleText,
+ const css::uno::Reference< css::beans::XPropertySet > & rPagePropSet );
+
+};
+
+struct PPTExParaLevel
+{
+ bool mbIsBullet;
+ sal_uInt16 mnBulletChar;
+ sal_uInt16 mnBulletFont;
+ sal_uInt16 mnBulletHeight;
+ sal_uInt32 mnBulletColor;
+
+ sal_uInt16 mnAdjust;
+ sal_uInt16 mnLineFeed;
+ sal_uInt16 mnUpperDist;
+ sal_uInt16 mnLowerDist;
+ sal_uInt16 mnTextOfs;
+ sal_uInt16 mnBulletOfs;
+ sal_uInt16 mnDefaultTab;
+
+ bool mbExtendedBulletsUsed;
+ sal_uInt16 mnBulletId;
+ sal_uInt16 mnBulletStart;
+ sal_uInt32 mnMappedNumType;
+ sal_uInt32 mnNumberingType;
+ sal_uInt16 mnAsianSettings;
+ sal_uInt16 mnBiDi;
+};
+
+struct PPTExParaSheet
+{
+ PPTExBulletProvider* pBuProv;
+
+ sal_uInt32 mnInstance;
+
+ PPTExParaLevel maParaLevel[ 5 ];
+ PPTExParaSheet( int nInstance, sal_uInt16 nDefaultTab, PPTExBulletProvider* pProv );
+
+ void SetStyleSheet( const css::uno::Reference< css::beans::XPropertySet > &,
+ FontCollection& rFontCollection, int nLevel, const PPTExCharLevel& rCharLevel );
+ void Write( SvStream& rSt, sal_uInt16 nLev, bool bSimpleText,
+ const css::uno::Reference< css::beans::XPropertySet > & rPagePropSet );
+};
+
+class PPTExStyleSheet
+{
+
+ public:
+
+ std::unique_ptr<PPTExCharSheet> mpCharSheet[ PPTEX_STYLESHEETENTRIES ];
+ std::unique_ptr<PPTExParaSheet> mpParaSheet[ PPTEX_STYLESHEETENTRIES ];
+
+ PPTExStyleSheet( sal_uInt16 nDefaultTab, PPTExBulletProvider* pBuProv );
+ ~PPTExStyleSheet();
+
+ PPTExParaSheet& GetParaSheet( int nInstance ) { return *mpParaSheet[ nInstance ]; };
+
+ void SetStyleSheet( const css::uno::Reference< css::beans::XPropertySet > &,
+ FontCollection& rFontCollection, int nInstance, int nLevel );
+ bool IsHardAttribute( sal_uInt32 nInstance, sal_uInt32 nLevel, PPTExTextAttr eAttr, sal_uInt32 nValue );
+
+ static sal_uInt32 SizeOfTxCFStyleAtom() { return 24; }
+ void WriteTxCFStyleAtom( SvStream& rSt );
+};
+
+class PPTWriterBase : public PropValue, public GroupTable
+{
+protected:
+ css::uno::Reference< css::frame::XModel > mXModel;
+ css::uno::Reference< css::task::XStatusIndicator > mXStatusIndicator;
+
+ bool mbStatusIndicator;
+
+ css::uno::Reference< css::drawing::XDrawPagesSupplier > mXDrawPagesSupplier;
+ css::uno::Reference< css::drawing::XMasterPagesSupplier > mXMasterPagesSupplier;
+ css::uno::Reference< css::drawing::XDrawPages > mXDrawPages;
+ css::uno::Reference< css::drawing::XDrawPage > mXDrawPage;
+ css::uno::Reference< css::beans::XPropertySet > mXPagePropSet;
+ css::uno::Reference< css::beans::XPropertySet > mXBackgroundPropSet;
+ css::uno::Reference< css::drawing::XShapes > mXShapes;
+ css::uno::Reference< css::drawing::XShape > mXShape;
+ css::awt::Size maSize;
+ css::awt::Point maPosition;
+ ::tools::Rectangle maRect;
+ OString mType;
+ bool mbPresObj;
+ bool mbEmptyPresObj;
+ bool mbIsBackgroundDark;
+ sal_Int32 mnAngle;
+
+ sal_uInt32 mnPages; ///< number of Slides ( w/o master pages & notes & handout )
+ sal_uInt32 mnMasterPages;
+
+ Fraction maFraction;
+ MapMode maMapModeSrc;
+ MapMode maMapModeDest;
+ css::awt::Size maDestPageSize;
+ css::awt::Size maPageSize; // #i121183# Keep size in logic coordinates (100th mm)
+ css::awt::Size maNotesPageSize;
+
+ PageType meLatestPageType;
+ std::vector< std::unique_ptr<PPTExStyleSheet> > maStyleSheetList;
+ PPTExStyleSheet* mpStyleSheet;
+
+ FontCollection maFontCollection;
+
+ virtual void ImplWriteSlide( sal_uInt32 /* nPageNum */, sal_uInt32 /* nMasterNum */, sal_uInt16 /* nMode */,
+ bool /* bHasBackground */, css::uno::Reference< css::beans::XPropertySet > const & /* aXBackgroundPropSet */ ) {}
+ virtual void ImplWriteNotes( sal_uInt32 nPageNum ) = 0;
+ virtual void ImplWriteSlideMaster( sal_uInt32 /* nPageNum */, css::uno::Reference< css::beans::XPropertySet > const & /* aXBackgroundPropSet */ ) {}
+
+ virtual void exportPPTPre( const std::vector< css::beans::PropertyValue >& ) {}
+ virtual void exportPPTPost() {}
+
+ virtual bool ImplCreateDocument()=0;
+ virtual bool ImplCreateMainNotes()=0;
+
+ bool GetStyleSheets();
+ bool GetShapeByIndex( sal_uInt32 nIndex, bool bGroup );
+
+ bool CreateMainNotes();
+
+ css::awt::Size MapSize( const css::awt::Size& );
+ css::awt::Point MapPoint( const css::awt::Point& );
+ ::tools::Rectangle MapRectangle( const css::awt::Rectangle& );
+
+ bool ContainsOtherShapeThanPlaceholders();
+
+public:
+ PPTWriterBase();
+ PPTWriterBase( const css::uno::Reference< css::frame::XModel > & rModel,
+ const css::uno::Reference< css::task::XStatusIndicator > & rStatInd );
+
+ virtual ~PPTWriterBase();
+
+ void exportPPT(const std::vector< css::beans::PropertyValue >&);
+
+ bool InitSOIface();
+ bool GetPageByIndex( sal_uInt32 nIndex, PageType );
+ sal_uInt32 GetMasterIndex( PageType ePageType );
+ void SetCurrentStyleSheet( sal_uInt32 nPageNum );
+
+ bool GetPresObj() const { return mbPresObj; }
+
+ static PHLayout const & GetLayout( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
+ static PHLayout const & GetLayout( sal_Int32 nOffset );
+ static sal_Int32 GetLayoutOffset( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
+ static sal_Int32 GetLayoutOffsetFixed( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
+
+ bool CreateSlide( sal_uInt32 nPageNum );
+ bool CreateSlideMaster( sal_uInt32 nPageNum );
+ bool CreateNotes( sal_uInt32 nPageNum );
+
+ static sal_Int8 GetTransition( sal_Int16 nTransitionType, sal_Int16 nTransitionSubtype, css::presentation::FadeEffect eEffect,
+ sal_Int32 nTransitionFadeColor, sal_uInt8& nDirection );
+ static sal_Int8 GetTransition( css::presentation::FadeEffect eEffect, sal_uInt8& nDirection );
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/epptdef.hxx b/sd/source/filter/eppt/epptdef.hxx
new file mode 100644
index 000000000..f5059681c
--- /dev/null
+++ b/sd/source/filter/eppt/epptdef.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#define EPP_Document 1000
+#define EPP_DocumentAtom 1001
+#define EPP_EndDocument 1002
+#define EPP_Slide 1006
+#define EPP_SlideAtom 1007
+#define EPP_Notes 1008
+#define EPP_NotesAtom 1009
+#define EPP_Environment 1010
+#define EPP_SlidePersistAtom 1011 //0x03F3
+#define EPP_MainMaster 1016
+#define EPP_SSSlideInfoAtom 1017
+#define EPP_SlideViewInfo 1018
+#define EPP_GuideAtom 1019
+#define EPP_ViewInfoAtom 1021
+#define EPP_SlideViewInfoAtom 1022
+#define EPP_VBAInfo 1023
+#define EPP_VBAInfoAtom 1024
+#define EPP_SSDocInfoAtom 1025
+#define EPP_OutlineViewInfo 1031
+#define EPP_ExObjList 1033
+#define EPP_ExObjListAtom 1034
+#define EPP_PPDrawingGroup 1035
+#define EPP_PPDrawing 1036
+#define EPP_NamedShows 1040
+#define EPP_NamedShow 1041
+#define EPP_NamedShowSlides 1042
+#define EPP_List 2000
+#define EPP_FontCollection 2005
+#define EPP_SoundCollection 2020
+#define EPP_SoundCollAtom 2021
+#define EPP_Sound 2022
+#define EPP_SoundData 2023
+#define EPP_ColorSchemeAtom 2032
+
+// these atoms first was seen in ppt2000 in a private Tag atom
+#define EPP_PST_ExtendedBuGraContainer 2040 // consist of 4041
+
+#define EPP_ExObjRefAtom 3009
+#define EPP_OEPlaceholderAtom 3011
+#define EPP_TextHeaderAtom 3999
+#define EPP_TextCharsAtom 4000
+#define EPP_StyleTextPropAtom 4001
+#define EPP_BaseTextPropAtom 4002
+#define EPP_TxMasterStyleAtom 4003
+#define EPP_TxCFStyleAtom 4004
+#define EPP_TextRulerAtom 4006
+#define EPP_TxSIStyleAtom 4009
+#define EPP_TextSpecInfoAtom 4010
+
+// these atoms first was seen in ppt2000 in a private Tag atom
+#define EPP_PST_ExtendedParagraphAtom 4012
+#define EPP_PST_ExtendedParagraphMasterAtom 4013
+#define EPP_PST_ExtendedPresRuleContainer 4014 // consist of 4012, 4015,
+#define EPP_PST_ExtendedParagraphHeaderAtom 4015 // the instance of this atom indices the current presobj
+ // the first sal_uInt32 in this atom indices the current slideId
+
+#define EPP_FontEnityAtom 4023
+#define EPP_CString 4026
+#define EPP_ExOleObjAtom 4035
+#define EPP_SrKinsoku 4040
+#define EPP_ExEmbed 4044
+#define EPP_ExEmbedAtom 4045
+#define EPP_SrKinsokuAtom 4050
+#define EPP_ExHyperlinkAtom 4051
+#define EPP_ExHyperlink 4055
+#define EPP_SlideNumberMCAtom 4056
+#define EPP_HeadersFooters 4057
+#define EPP_HeadersFootersAtom 4058
+#define EPP_TxInteractiveInfoAtom 4063
+#define EPP_ExControl 4078
+#define EPP_ExControlAtom 4091
+#define EPP_SlideListWithText 4080 // 0x0FF0
+#define EPP_AnimationInfoAtom 4081
+#define EPP_InteractiveInfo 4082
+#define EPP_InteractiveInfoAtom 4083
+#define EPP_UserEditAtom 4085
+#define EPP_CurrentUserAtom 4086
+#define EPP_DateTimeMCAtom 4087
+#define EPP_GenericDateMCAtom 4088
+#define EPP_HeaderMCAtom 4089
+#define EPP_FooterMCAtom 4090
+#define EPP_ExMediaAtom 4100
+#define EPP_ExVideo 4101
+#define EPP_ExMCIMovie 4103
+#define EPP_ExOleObjStg 4113
+#define EPP_AnimationInfo 4116
+#define EPP_ProgTags 5000
+#define EPP_ProgBinaryTag 5002
+#define EPP_BinaryTagData 5003
+#define EPP_PersistPtrIncrementalBlock 6002
+#define EPP_Comment10 12000
+#define EPP_CommentAtom10 12001
+
+#define EPP_PLACEHOLDER_NONE 0 // 0 None
+#define EPP_PLACEHOLDER_MASTERTITLE 1 // 1 Master title
+#define EPP_PLACEHOLDER_MASTERBODY 2 // 2 Master body
+#define EPP_PLACEHOLDER_MASTERSUBTITLE 4 // 10 Master subtitle
+#define EPP_PLACEHOLDER_MASTERNOTESSLIDEIMAGE 5 // 4 Master notes slide image
+#define EPP_PLACEHOLDER_MASTERNOTESBODYIMAGE 6 // 5 Master notes body image
+#define EPP_PLACEHOLDER_MASTERDATE 7 // 6 Master date
+#define EPP_PLACEHOLDER_MASTERSLIDENUMBER 8 // 7 Master slide number
+#define EPP_PLACEHOLDER_MASTERFOOTER 9 // 8 Master footer
+#define EPP_PLACEHOLDER_MASTERHEADER 10 // 9 Master header
+#define EPP_PLACEHOLDER_GENERICTEXTOBJECT // 11 Generic text object
+#define EPP_PLACEHOLDER_NOTESBODY 12 // 14 Notes body
+#define EPP_PLACEHOLDER_NOTESSLIDEIMAGE 11 // 19 Notes slide image
+
+#define EPP_TEXTTYPE_Title 0
+#define EPP_TEXTTYPE_Body 1
+#define EPP_TEXTTYPE_Notes 2
+#define EPP_TEXTTYPE_notUsed 3
+#define EPP_TEXTTYPE_Other 4 // ( Text in a shape )
+#define EPP_TEXTTYPE_CenterBody 5 // ( subtitle in title slide )
+#define EPP_TEXTTYPE_CenterTitle 6 // ( title in title slide )
+#define EPP_TEXTTYPE_HalfBody 7 // ( body in two-column slide )
+#define EPP_TEXTTYPE_QuarterBody 8 // ( body in four-body slide )
+
+#define EPP_SLIDESIZE_TYPEONSCREEN 0
+#define EPP_SLIDESIZE_TYPEA4PAPER 2
+#define EPP_SLIDESIZE_TYPE35MM 3
+#define EPP_SLIDESIZE_TYPEBANNER 5
+#define EPP_SLIDESIZE_TYPECUSTOM 6
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/epptooxml.hxx b/sd/source/filter/eppt/epptooxml.hxx
new file mode 100644
index 000000000..5ee3248ec
--- /dev/null
+++ b/sd/source/filter/eppt/epptooxml.hxx
@@ -0,0 +1,189 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <oox/core/xmlfilterbase.hxx>
+#include <oox/vml/vmldrawing.hxx>
+#include <oox/export/shapes.hxx>
+#include "epptbase.hxx"
+
+using ::sax_fastparser::FSHelperPtr;
+
+namespace svx
+{
+class Theme;
+}
+
+namespace oox::core {
+
+struct LayoutInfo
+{
+ std::vector< sal_Int32 > mnFileIdArray;
+};
+
+enum PlaceholderType
+{
+ None,
+ SlideImage,
+ Notes,
+ Header,
+ Footer,
+ SlideNumber,
+ DateAndTime,
+ Outliner,
+ Title,
+ Subtitle
+};
+
+class PowerPointShapeExport;
+
+class PowerPointExport final : public XmlFilterBase, public PPTWriterBase
+{
+ friend class PowerPointShapeExport;
+public:
+
+ PowerPointExport(const css::uno::Reference<css::uno::XComponentContext> & rContext, const css::uno::Sequence<css::uno::Any>& rArguments);
+
+ virtual ~PowerPointExport() override;
+
+ // from FilterBase
+ virtual bool importDocument() noexcept override;
+ virtual bool exportDocument() override;
+
+ // only needed for import, leave them empty, refactor later XmlFilterBase to export and import base?
+ virtual oox::vml::Drawing* getVmlDrawing() override { return nullptr; }
+ virtual const oox::drawingml::Theme* getCurrentTheme() const override { return nullptr; }
+ virtual oox::drawingml::table::TableStyleListPtr getTableStyles() override { return oox::drawingml::table::TableStyleListPtr(); }
+ virtual oox::drawingml::chart::ChartConverter* getChartConverter() override { return nullptr; }
+
+ static const char* GetSideDirection( sal_uInt8 nDirection );
+ static const char* GetCornerDirection( sal_uInt8 nDirection );
+ static const char* Get8Direction( sal_uInt8 nDirection );
+ static int GetPPTXLayoutId( int nOffset );
+
+ sal_Int32 GetShapeID(const css::uno::Reference<css::drawing::XShape>& rXShape);
+ sal_Int32 GetNextAnimationNodeID();
+
+ void embedEffectAudio(const FSHelperPtr& pFS, const OUString& sUrl, OUString& sRelId, OUString& sName);
+
+private:
+
+ virtual void ImplWriteSlide( sal_uInt32 nPageNum, sal_uInt32 nMasterNum, sal_uInt16 nMode,
+ bool bHasBackground, css::uno::Reference< css::beans::XPropertySet > const & aXBackgroundPropSet ) override;
+ virtual void ImplWriteNotes( sal_uInt32 nPageNum ) override;
+ virtual void ImplWriteSlideMaster( sal_uInt32 nPageNum, css::uno::Reference< css::beans::XPropertySet > const & aXBackgroundPropSet ) override;
+ void ImplWritePPTXLayout( sal_Int32 nOffset, sal_uInt32 nMasterNum );
+
+ /// Export the color set part of a theme.
+ static bool WriteColorSets(const FSHelperPtr& pFS, svx::Theme* pTheme);
+
+ /// Same as WriteColorSets(), but works from a grab-bag.
+ bool WriteColorSchemes(const FSHelperPtr& pFS, const OUString& rThemePath);
+
+ static void WriteDefaultColorSchemes(const FSHelperPtr& pFS);
+ void WriteTheme( sal_Int32 nThemeNum, svx::Theme* pTheme );
+
+ virtual bool ImplCreateDocument() override;
+ virtual bool ImplCreateMainNotes() override;
+ virtual ::oox::ole::VbaProject* implCreateVbaProject() const override;
+ void WriteNotesMaster();
+
+ bool WriteComments( sal_uInt32 nPageNum );
+ void ImplWriteBackground( const ::sax_fastparser::FSHelperPtr& pFS, const css::uno::Reference< css::beans::XPropertySet >& aXBackgroundPropSet );
+ void WriteTransition( const ::sax_fastparser::FSHelperPtr& pFS );
+
+ sal_Int32 GetLayoutFileId( sal_Int32 nOffset, sal_uInt32 nMasterNum );
+
+ // shapes
+ void WriteShapeTree( const ::sax_fastparser::FSHelperPtr& pFS, PageType ePageType, bool bMaster );
+
+ sal_uInt32 GetNewSlideId() { return mnSlideIdMax ++; }
+ sal_uInt32 GetNewSlideMasterId() { return mnSlideMasterIdMax ++; }
+ sal_Int32 GetAuthorIdAndLastIndex( const OUString& sAuthor, sal_Int32& nLastIndex );
+
+ // Write docProps/core.xml and docprops/custom.xml and docprops/app.xml
+ void writeDocumentProperties();
+
+ void WriteCustomSlideShow();
+
+ void AddLayoutIdAndRelation( const ::sax_fastparser::FSHelperPtr& pFS, sal_Int32 nLayoutFileId );
+
+ virtual OUString SAL_CALL getImplementationName() override;
+
+ static void WriteDiagram(const FSHelperPtr& pFS, PowerPointShapeExport& rDML, const css::uno::Reference<css::drawing::XShape>& rXShape, int nDiagramId);
+
+ /** Create a new placeholder index for a master placeholder shape
+
+ @param rXShape Master placeholder shape
+ @returns Placeholder index
+ */
+ sal_Int32 CreateNewPlaceholderIndex(const css::uno::Reference<css::drawing::XShape>& rXShape);
+ css::uno::Reference<css::drawing::XShape> GetReferencedPlaceholderXShape(const PlaceholderType eType, PageType ePageType) const;
+ void WritePlaceholderReferenceShapes(PowerPointShapeExport& rDML, PageType ePageType);
+
+ /// Should we export as .pptm, ie. do we contain macros?
+ bool mbPptm;
+
+ // Export as a template
+ bool mbExportTemplate;
+
+ ::sax_fastparser::FSHelperPtr mPresentationFS;
+
+ LayoutInfo mLayoutInfo[EPP_LAYOUT_SIZE];
+ std::vector< ::sax_fastparser::FSHelperPtr > mpSlidesFSArray;
+ sal_Int32 mnLayoutFileIdMax;
+
+ sal_uInt32 mnSlideIdMax;
+ sal_uInt32 mnSlideMasterIdMax;
+ sal_uInt32 mnAnimationNodeIdMax;
+
+ sal_uInt32 mnDiagramId;
+
+ std::vector<OUString> maRelId;
+
+ bool mbCreateNotes;
+
+ ::oox::drawingml::ShapeExport::ShapeHashMap maShapeMap;
+
+ sal_Int32 mnPlaceholderIndexMax; ///< Last used placeholder index
+ /// Map of placeholder indexes for Master placeholders
+ std::unordered_map< css::uno::Reference<css::drawing::XShape>, sal_Int32 > maPlaceholderShapeToIndexMap;
+
+ struct AuthorComments {
+ sal_Int32 nId;
+ sal_Int32 nLastIndex;
+ };
+ typedef std::unordered_map< OUString, struct AuthorComments > AuthorsMap;
+ AuthorsMap maAuthors;
+
+ void WriteAuthors();
+
+ void WritePresentationProps();
+
+ /// If this is PPTM, output the VBA stream.
+ void WriteVBA();
+
+ void WriteModifyVerifier();
+};
+
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/epptso.cxx b/sd/source/filter/eppt/epptso.cxx
new file mode 100644
index 000000000..41126aedf
--- /dev/null
+++ b/sd/source/filter/eppt/epptso.cxx
@@ -0,0 +1,3361 @@
+/* -*- 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 <memory>
+#include <sal/config.h>
+
+#include <basegfx/numeric/ftools.hxx>
+#include <o3tl/any.hxx>
+#include "eppt.hxx"
+#include "text.hxx"
+#include "epptdef.hxx"
+#include "escherex.hxx"
+#include <tools/poly.hxx>
+#include <tools/stream.hxx>
+#include <tools/fontenum.hxx>
+#include <tools/UnitConversion.hxx>
+#include <sot/storage.hxx>
+#include <vcl/graph.hxx>
+#include <editeng/svxenum.hxx>
+#include <svx/svdobj.hxx>
+#include <com/sun/star/awt/FontFamily.hpp>
+#include <com/sun/star/awt/FontPitch.hpp>
+#include <com/sun/star/awt/Rectangle.hpp>
+#include <com/sun/star/awt/FontDescriptor.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <com/sun/star/style/TabStop.hpp>
+#include <com/sun/star/drawing/CircleKind.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/drawing/XShapes.hpp>
+#include <com/sun/star/beans/XPropertyState.hpp>
+#include <com/sun/star/drawing/XControlShape.hpp>
+#include <com/sun/star/embed/Aspects.hpp>
+#include <tools/urlobj.hxx>
+#include <com/sun/star/text/XSimpleText.hpp>
+#include <com/sun/star/task/XStatusIndicator.hpp>
+#include <com/sun/star/table/XTable.hpp>
+#include <com/sun/star/table/XMergeableCell.hpp>
+#include <com/sun/star/table/BorderLine.hpp>
+#include <com/sun/star/table/XColumnRowRange.hpp>
+#include <com/sun/star/table/XCellRange.hpp>
+#include <oox/ole/olehelper.hxx>
+#include <i18nlangtag/languagetag.hxx>
+
+using namespace ::com::sun::star;
+
+#define ANSI_CHARSET 0
+#define SYMBOL_CHARSET 2
+
+/* Font Families */
+#define FF_ROMAN 0x10
+#define FF_SWISS 0x20
+#define FF_MODERN 0x30
+#define FF_SCRIPT 0x40
+#define FF_DECORATIVE 0x50
+
+#define DEFAULT_PITCH 0x00
+#define FIXED_PITCH 0x01
+
+PPTExBulletProvider::PPTExBulletProvider()
+ : pGraphicProv( new EscherGraphicProvider( EscherGraphicProviderFlags::UseInstances ) )
+{
+}
+
+PPTExBulletProvider::~PPTExBulletProvider()
+{
+}
+
+sal_uInt16 PPTExBulletProvider::GetId(Graphic const & rGraphic, Size& rGraphicSize )
+{
+ sal_uInt16 nRetValue = 0xffff;
+
+ if (!rGraphic.IsNone())
+ {
+ Graphic aMappedGraphic, aGraphic(rGraphic);
+ GraphicObject aGraphicObject(aGraphic);
+ Size aPrefSize( aGraphic.GetPrefSize() );
+ BitmapEx aBmpEx( aGraphic.GetBitmapEx() );
+
+ if ( rGraphicSize.Width() && rGraphicSize.Height() )
+ {
+ if (aPrefSize.IsEmpty())
+ {
+ aBmpEx.Scale(aPrefSize);
+ }
+ else
+ {
+ double fQ1 = static_cast<double>(aPrefSize.Width()) / static_cast<double>(aPrefSize.Height());
+ double fQ2 = static_cast<double>(rGraphicSize.Width()) / static_cast<double>(rGraphicSize.Height());
+ double fXScale = 1;
+ double fYScale = 1;
+
+ if ( fQ1 > fQ2 )
+ fYScale = fQ1 / fQ2;
+ else if ( fQ1 < fQ2 )
+ fXScale = fQ2 / fQ1;
+
+ if ( ( fXScale != 1.0 ) || ( fYScale != 1.0 ) )
+ {
+ aBmpEx.Scale( fXScale, fYScale );
+ rGraphicSize = Size( static_cast<sal_Int32>(static_cast<double>(rGraphicSize.Width()) / fXScale + 0.5 ),
+ static_cast<sal_Int32>(static_cast<double>(rGraphicSize.Height()) / fYScale + 0.5 ) );
+
+ aMappedGraphic = Graphic( aBmpEx );
+ aGraphicObject.SetGraphic(aMappedGraphic);
+ }
+ }
+ }
+ sal_uInt32 nId = pGraphicProv->GetBlibID(aBuExPictureStream, aGraphicObject);
+
+ if ( nId && ( nId < 0x10000 ) )
+ nRetValue = static_cast<sal_uInt16>(nId) - 1;
+ }
+ return nRetValue;
+}
+
+sal_uInt32 PPTWriter::ImplVBAInfoContainer( SvStream* pStrm )
+{
+ sal_uInt32 nSize = 28;
+ if ( pStrm )
+ {
+ pStrm->WriteUInt32( 0x1f | ( EPP_VBAInfo << 16 ) )
+ .WriteUInt32( nSize - 8 )
+ .WriteUInt32( 2 | ( EPP_VBAInfoAtom << 16 ) )
+ .WriteUInt32( 12 );
+ mpPptEscherEx->InsertPersistOffset( EPP_Persist_VBAInfoAtom, pStrm->Tell() );
+ pStrm->WriteUInt32( 0 )
+ .WriteUInt32( 0 )
+ .WriteUInt32( 1 );
+ }
+ return nSize;
+}
+
+sal_uInt32 PPTWriter::ImplSlideViewInfoContainer( sal_uInt32 nInstance, SvStream* pStrm )
+{
+ sal_uInt32 nSize = 111;
+ if ( pStrm )
+ {
+ sal_uInt8 bShowGuides = 0;
+ sal_uInt8 const bSnapToGrid = 1;
+ sal_uInt8 const bSnapToShape = 0;
+
+ sal_Int32 nScaling = 85;
+ sal_Int32 nMasterCoordinate = 0xdda;
+ sal_Int32 nXOrigin = -780;
+ sal_Int32 nYOrigin = -84;
+
+ sal_Int32 nPosition1 = 0x870;
+ sal_Int32 nPosition2 = 0xb40;
+
+ if ( nInstance )
+ {
+ bShowGuides = 1;
+ nScaling = 0x3b;
+ nMasterCoordinate = 0xf0c;
+ nXOrigin = -1752;
+ nYOrigin = -72;
+ nPosition1 = 0xb40;
+ nPosition2 = 0x870;
+ }
+ pStrm->WriteUInt32( 0xf | ( EPP_SlideViewInfo << 16 ) | ( nInstance << 4 ) )
+ .WriteUInt32( nSize - 8 )
+ .WriteUInt32( EPP_SlideViewInfoAtom << 16 ).WriteUInt32( 3 )
+ .WriteUChar( bShowGuides ).WriteUChar( bSnapToGrid ).WriteUChar( bSnapToShape )
+ .WriteUInt32( EPP_ViewInfoAtom << 16 ).WriteUInt32( 52 )
+ .WriteInt32( nScaling ).WriteInt32( 100 ).WriteInt32( nScaling ).WriteInt32( 100 ) // scaling atom - Keeps the current scale
+ .WriteInt32( nScaling ).WriteInt32( 100 ).WriteInt32( nScaling ).WriteInt32( 100 ) // scaling atom - Keeps the previous scale
+ .WriteInt32( 0x17ac ).WriteInt32( nMasterCoordinate )// Origin - Keeps the origin in master coordinates
+ .WriteInt32( nXOrigin ).WriteInt32( nYOrigin ) // Origin
+ .WriteUChar( 1 ) // Bool1 varScale - Set if zoom to fit is set
+ .WriteUChar( 0 ) // bool1 draftMode - Not used
+ .WriteUInt16( 0 ) // padword
+ .WriteUInt32( ( 7 << 4 ) | ( EPP_GuideAtom << 16 ) ).WriteUInt32( 8 )
+ .WriteUInt32( 0 ) // Type of the guide. If the guide is horizontal this value is zero. If it's vertical, it's one.
+ .WriteInt32( nPosition1 ) // Position of the guide in master coordinates. X coordinate if it's vertical, and Y coordinate if it's horizontal.
+ .WriteUInt32( ( 7 << 4 ) | ( EPP_GuideAtom << 16 ) ).WriteUInt32( 8 )
+ .WriteInt32( 1 ) // Type of the guide. If the guide is horizontal this value is zero. If it's vertical, it's one.
+ .WriteInt32( nPosition2 ); // Position of the guide in master coordinates. X coordinate if it's vertical, and Y coordinate if it's horizontal.
+ }
+ return nSize;
+}
+
+sal_uInt32 PPTWriter::ImplOutlineViewInfoContainer( SvStream* pStrm )
+{
+ sal_uInt32 nSize = 68;
+ if ( pStrm )
+ {
+ pStrm->WriteUInt32( 0xf | ( EPP_OutlineViewInfo << 16 ) ).WriteUInt32( nSize - 8 )
+ .WriteUInt32( EPP_ViewInfoAtom << 16 ).WriteUInt32( 52 )
+ .WriteInt32( 170 ).WriteInt32( 200 ).WriteInt32( 170 ).WriteInt32( 200 ) // scaling atom - Keeps the current scale
+ .WriteInt32( 170 ).WriteInt32( 200 ).WriteInt32( 170 ).WriteInt32( 200 ) // scaling atom - Keeps the previous scale
+ .WriteInt32( 0x17ac ).WriteInt32( 0xdda ) // Origin - Keeps the origin in master coordinates
+ .WriteInt32( -780 ).WriteInt32( -84 ) // Origin
+ .WriteUChar( 1 ) // bool1 varScale - Set if zoom to fit is set
+ .WriteUChar( 0 ) // bool1 draftMode - Not used
+ .WriteUInt16( 0 ); // padword
+ }
+ return nSize;
+}
+
+sal_uInt32 PPTWriter::ImplProgBinaryTag( SvStream* pStrm )
+{
+ sal_uInt32 nPictureStreamSize, nOutlineStreamSize, nSize = 8;
+
+ nPictureStreamSize = aBuExPictureStream.Tell();
+ if ( nPictureStreamSize )
+ nSize += nPictureStreamSize + 8;
+
+ nOutlineStreamSize = aBuExOutlineStream.Tell();
+ if ( nOutlineStreamSize )
+ nSize += nOutlineStreamSize + 8;
+
+ if ( pStrm )
+ {
+ pStrm->WriteUInt32( EPP_BinaryTagData << 16 ).WriteUInt32( nSize - 8 );
+ if ( nPictureStreamSize )
+ {
+ pStrm->WriteUInt32( 0xf | ( EPP_PST_ExtendedBuGraContainer << 16 ) ).WriteUInt32( nPictureStreamSize );
+ pStrm->WriteBytes(aBuExPictureStream.GetData(), nPictureStreamSize);
+ }
+ if ( nOutlineStreamSize )
+ {
+ pStrm->WriteUInt32( 0xf | ( EPP_PST_ExtendedPresRuleContainer << 16 ) ).WriteUInt32( nOutlineStreamSize );
+ pStrm->WriteBytes(aBuExOutlineStream.GetData(), nOutlineStreamSize);
+ }
+ }
+ return nSize;
+}
+
+sal_uInt32 PPTWriter::ImplProgBinaryTagContainer( SvStream* pStrm, SvMemoryStream* pBinTagStrm )
+{
+ sal_uInt32 nSize = 8 + 8 + 14;
+ if ( pStrm )
+ {
+ pStrm->WriteUInt32( 0xf | ( EPP_ProgBinaryTag << 16 ) ).WriteUInt32( 0 )
+ .WriteUInt32( EPP_CString << 16 ).WriteUInt32( 14 )
+ .WriteUInt32( 0x5f005f ).WriteUInt32( 0x50005f )
+ .WriteUInt32( 0x540050 ).WriteUInt16( 0x39 );
+ }
+ if ( pStrm && pBinTagStrm )
+ {
+ sal_uInt32 nLen = pBinTagStrm->Tell();
+ nSize += nLen + 8;
+ pStrm->WriteUInt32( EPP_BinaryTagData << 16 ).WriteUInt32( nLen );
+ pStrm->WriteBytes(pBinTagStrm->GetData(), nLen);
+ }
+ else
+ nSize += ImplProgBinaryTag( pStrm );
+
+ if ( pStrm )
+ {
+ pStrm->SeekRel( - ( static_cast<sal_Int32>(nSize) - 4 ) );
+ pStrm->WriteUInt32( nSize - 8 );
+ pStrm->SeekRel( nSize - 8 );
+ }
+ return nSize;
+}
+
+sal_uInt32 PPTWriter::ImplProgTagContainer( SvStream* pStrm, SvMemoryStream* pBinTagStrm )
+{
+ sal_uInt32 nSize = 0;
+ if ( aBuExPictureStream.Tell() || aBuExOutlineStream.Tell() || pBinTagStrm )
+ {
+ nSize = 8;
+ if ( pStrm )
+ {
+ pStrm->WriteUInt32( 0xf | ( EPP_ProgTags << 16 ) ).WriteUInt32( 0 );
+ }
+ nSize += ImplProgBinaryTagContainer( pStrm, pBinTagStrm );
+ if ( pStrm )
+ {
+ pStrm->SeekRel( - ( static_cast<sal_Int32>(nSize) - 4 ) );
+ pStrm->WriteUInt32( nSize - 8 );
+ pStrm->SeekRel( nSize - 8 );
+ }
+ }
+ return nSize;
+}
+
+sal_uInt32 PPTWriter::ImplDocumentListContainer( SvStream* pStrm )
+{
+ sal_uInt32 nSize = 8;
+ if ( pStrm )
+ {
+ pStrm->WriteUInt32( ( EPP_List << 16 ) | 0xf ).WriteUInt32( 0 );
+ }
+
+ nSize += ImplVBAInfoContainer( pStrm );
+ nSize += ImplSlideViewInfoContainer( 0, pStrm );
+ nSize += ImplOutlineViewInfoContainer( pStrm );
+ nSize += ImplSlideViewInfoContainer( 1, pStrm );
+ nSize += ImplProgTagContainer( pStrm );
+
+ if ( pStrm )
+ {
+ pStrm->SeekRel( - ( static_cast<sal_Int32>(nSize) - 4 ) );
+ pStrm->WriteUInt32( nSize - 8 );
+ pStrm->SeekRel( nSize - 8 );
+ }
+ return nSize;
+}
+
+sal_uInt32 PPTWriter::ImplMasterSlideListContainer( SvStream* pStrm )
+{
+ sal_uInt32 i, nSize = 28 * mnMasterPages + 8;
+ if ( pStrm )
+ {
+ pStrm->WriteUInt32( 0x1f | ( EPP_SlideListWithText << 16 ) ).WriteUInt32( nSize - 8 );
+
+ for ( i = 0; i < mnMasterPages; i++ )
+ {
+ pStrm->WriteUInt32( EPP_SlidePersistAtom << 16 ).WriteUInt32( 20 );
+ mpPptEscherEx->InsertPersistOffset( EPP_MAINMASTER_PERSIST_KEY | i, pStrm->Tell() );
+ pStrm->WriteUInt32( 0 ) // psrReference - logical reference to the slide persist object ( EPP_MAINMASTER_PERSIST_KEY )
+ .WriteUInt32( 0 ) // flags - only bit 3 used, if set then slide contains shapes other than placeholders
+ .WriteInt32( 0 ) // numberTexts - number of placeholder texts stored with the persist object. Allows to display outline view without loading the slide persist objects
+ .WriteInt32( 0x80000000 | i ) // slideId - Unique slide identifier, used for OLE link monikers for example
+ .WriteUInt32( 0 ); // reserved, usually 0
+ }
+ }
+ return nSize;
+}
+
+sal_uInt32 PPTWriter::ImplInsertBookmarkURL( const OUString& rBookmarkURL, const sal_uInt32 nType,
+ const OUString& rStringVer0, const OUString& rStringVer1, const OUString& rStringVer2, const OUString& rStringVer3 )
+{
+ sal_uInt32 nHyperId = ++mnExEmbed;
+
+ OUString sBookmarkURL( rBookmarkURL );
+ INetURLObject aBaseURI( maBaseURI );
+ INetURLObject aBookmarkURI( rBookmarkURL );
+ if( aBaseURI.GetProtocol() == aBookmarkURI.GetProtocol() )
+ {
+ OUString aRelUrl( INetURLObject::GetRelURL( maBaseURI, rBookmarkURL ) );
+ if ( !aRelUrl.isEmpty() )
+ sBookmarkURL = aRelUrl;
+ }
+ maHyperlink.emplace_back( sBookmarkURL, nType );
+
+ mpExEmbed->WriteUInt16( 0xf )
+ .WriteUInt16( EPP_ExHyperlink )
+ .WriteUInt32( 0 );
+ sal_uInt32 nHyperSize, nHyperStart = mpExEmbed->Tell();
+ mpExEmbed->WriteUInt16( 0 )
+ .WriteUInt16( EPP_ExHyperlinkAtom )
+ .WriteUInt32( 4 )
+ .WriteUInt32( nHyperId );
+
+ PPTWriter::WriteCString( *mpExEmbed, rStringVer0 );
+ PPTWriter::WriteCString( *mpExEmbed, rStringVer1, 1 );
+ PPTWriter::WriteCString( *mpExEmbed, rStringVer2, 2 );
+ PPTWriter::WriteCString( *mpExEmbed, rStringVer3, 3 );
+
+ nHyperSize = mpExEmbed->Tell() - nHyperStart;
+ mpExEmbed->SeekRel( - ( static_cast<sal_Int32>(nHyperSize) + 4 ) );
+ mpExEmbed->WriteUInt32( nHyperSize );
+ mpExEmbed->SeekRel( nHyperSize );
+ return nHyperId;
+}
+
+bool PPTWriter::ImplCloseDocument()
+{
+ sal_uInt32 nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_Document );
+ if ( nOfs )
+ {
+ mpPptEscherEx->PtReplaceOrInsert( EPP_Persist_CurrentPos, mpStrm->Tell() );
+ mpStrm->Seek( nOfs );
+
+ // creating the TxMasterStyleAtom
+ SvMemoryStream aTxMasterStyleAtomStrm( 0x200, 0x200 );
+ {
+ EscherExAtom aTxMasterStyleAtom( aTxMasterStyleAtomStrm, EPP_TxMasterStyleAtom, EPP_TEXTTYPE_Other );
+ aTxMasterStyleAtomStrm.WriteUInt16( 5 ); // paragraph count
+ sal_uInt16 nLev;
+ for ( nLev = 0; nLev < 5; nLev++ )
+ {
+ mpStyleSheet->mpParaSheet[ EPP_TEXTTYPE_Other ]->Write( aTxMasterStyleAtomStrm, nLev, false, mXPagePropSet );
+ mpStyleSheet->mpCharSheet[ EPP_TEXTTYPE_Other ]->Write( aTxMasterStyleAtomStrm, nLev, false, mXPagePropSet );
+ }
+ }
+
+ sal_uInt32 nExEmbedSize = mpExEmbed->TellEnd();
+
+ // nEnvironment : whole size of the environment container
+ sal_uInt32 nEnvironment = maFontCollection.GetCount() * 76 // 68 bytes per Fontenityatom and 8 Bytes per header
+ + 8 // 1 FontCollection container
+ + 20 // SrKinsoku container
+ + 18 // 1 TxSiStyleAtom
+ + aTxMasterStyleAtomStrm.Tell() // 1 TxMasterStyleAtom;
+ + PPTExStyleSheet::SizeOfTxCFStyleAtom();
+
+ sal_uInt32 nBytesToInsert = nEnvironment + 8;
+
+ if ( nExEmbedSize )
+ nBytesToInsert += nExEmbedSize + 8 + 12;
+
+ nBytesToInsert += maSoundCollection.GetSize();
+ nBytesToInsert += mpPptEscherEx->DrawingGroupContainerSize();
+ nBytesToInsert += ImplMasterSlideListContainer(nullptr);
+ nBytesToInsert += ImplDocumentListContainer(nullptr);
+
+ // insert nBytes into stream and adjust depending container
+ mpPptEscherEx->InsertAtCurrentPos( nBytesToInsert );
+
+ // CREATE HYPERLINK CONTAINER
+ if ( nExEmbedSize )
+ {
+ mpStrm->WriteUInt16( 0xf )
+ .WriteUInt16( EPP_ExObjList )
+ .WriteUInt32( nExEmbedSize + 12 )
+ .WriteUInt16( 0 )
+ .WriteUInt16( EPP_ExObjListAtom )
+ .WriteUInt32( 4 )
+ .WriteUInt32( mnExEmbed );
+ mpPptEscherEx->InsertPersistOffset( EPP_Persist_ExObj, mpStrm->Tell() );
+ mpStrm->WriteBytes(mpExEmbed->GetData(), nExEmbedSize);
+ }
+
+ // CREATE ENVIRONMENT
+ mpStrm->WriteUInt16( 0xf ).WriteUInt16( EPP_Environment ).WriteUInt32( nEnvironment );
+
+ // Open Container ( EPP_SrKinsoku )
+ mpStrm->WriteUInt16( 0x2f ).WriteUInt16( EPP_SrKinsoku ).WriteUInt32( 12 );
+ mpPptEscherEx->AddAtom( 4, EPP_SrKinsokuAtom, 0, 3 );
+ mpStrm->WriteInt32( 0 ); // SrKinsoku Level 0
+
+ // Open Container ( EPP_FontCollection )
+ mpStrm->WriteUInt16( 0xf ).WriteUInt16( EPP_FontCollection ).WriteUInt32( maFontCollection.GetCount() * 76 );
+
+ for ( sal_uInt32 i = 0; i < maFontCollection.GetCount(); i++ )
+ {
+ mpPptEscherEx->AddAtom( 68, EPP_FontEnityAtom, 0, i );
+ const FontCollectionEntry* pDesc = maFontCollection.GetById( i );
+ sal_Int32 nFontLen = pDesc->Name.getLength();
+ if ( nFontLen > 31 )
+ nFontLen = 31;
+ for ( sal_Int32 n = 0; n < 32; n++ )
+ {
+ sal_Unicode nUniCode = 0;
+ if ( n < nFontLen )
+ nUniCode = pDesc->Name[n];
+ mpStrm->WriteUInt16( nUniCode );
+ }
+ sal_uInt8 lfCharSet = ANSI_CHARSET;
+ sal_uInt8 const lfClipPrecision = 0;
+ sal_uInt8 const lfQuality = 6;
+ sal_uInt8 lfPitchAndFamily = 0;
+
+ if ( pDesc->CharSet == RTL_TEXTENCODING_SYMBOL )
+ lfCharSet = SYMBOL_CHARSET;
+
+ switch( pDesc->Family )
+ {
+ case css::awt::FontFamily::ROMAN :
+ lfPitchAndFamily |= FF_ROMAN;
+ break;
+
+ case css::awt::FontFamily::SWISS :
+ lfPitchAndFamily |= FF_SWISS;
+ break;
+
+ case css::awt::FontFamily::MODERN :
+ lfPitchAndFamily |= FF_MODERN;
+ break;
+
+ case css::awt::FontFamily::SCRIPT:
+ lfPitchAndFamily |= FF_SCRIPT;
+ break;
+
+ case css::awt::FontFamily::DECORATIVE:
+ lfPitchAndFamily |= FF_DECORATIVE;
+ break;
+
+ default:
+ lfPitchAndFamily |= FAMILY_DONTKNOW;
+ break;
+ }
+ switch( pDesc->Pitch )
+ {
+ case css::awt::FontPitch::FIXED:
+ lfPitchAndFamily |= FIXED_PITCH;
+ break;
+
+ default:
+ lfPitchAndFamily |= DEFAULT_PITCH;
+ break;
+ }
+ mpStrm->WriteUChar( lfCharSet )
+ .WriteUChar( lfClipPrecision )
+ .WriteUChar( lfQuality )
+ .WriteUChar( lfPitchAndFamily );
+ }
+ mpStyleSheet->WriteTxCFStyleAtom( *mpStrm ); // create style that is used for new standard objects
+ mpPptEscherEx->AddAtom( 10, EPP_TxSIStyleAtom );
+ mpStrm->WriteUInt32( 7 ) // ?
+ .WriteInt16( 2 ) // ?
+ .WriteUChar( 9 ) // ?
+ .WriteUChar( 8 ) // ?
+ .WriteInt16( 0 ); // ?
+
+ mpStrm->WriteBytes(aTxMasterStyleAtomStrm.GetData(), aTxMasterStyleAtomStrm.Tell());
+ maSoundCollection.Write( *mpStrm );
+ mpPptEscherEx->WriteDrawingGroupContainer( *mpStrm );
+ ImplMasterSlideListContainer( mpStrm.get() );
+ ImplDocumentListContainer( mpStrm.get() );
+
+ sal_uInt32 nOldPos = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_CurrentPos );
+ if ( nOldPos )
+ {
+ mpStrm->Seek( nOldPos );
+ return true;
+ }
+ }
+ return false;
+}
+
+bool PropValue::GetPropertyValue(
+ css::uno::Any& rAny,
+ const css::uno::Reference< css::beans::XPropertySet > & rXPropSet,
+ const OUString& rString,
+ bool bTestPropertyAvailability )
+{
+ bool bRetValue = true;
+ if ( bTestPropertyAvailability )
+ {
+ bRetValue = false;
+ try
+ {
+ css::uno::Reference< css::beans::XPropertySetInfo > aXPropSetInfo( rXPropSet->getPropertySetInfo() );
+ if ( aXPropSetInfo.is() )
+ bRetValue = aXPropSetInfo->hasPropertyByName( rString );
+ }
+ catch( css::uno::Exception& )
+ {
+ bRetValue = false;
+ }
+ }
+ if ( bRetValue )
+ {
+ try
+ {
+ rAny = rXPropSet->getPropertyValue( rString );
+ if ( !rAny.hasValue() )
+ bRetValue = false;
+ }
+ catch( css::uno::Exception& )
+ {
+ bRetValue = false;
+ }
+ }
+ return bRetValue;
+}
+
+css::beans::PropertyState PropValue::GetPropertyState(
+ const css::uno::Reference< css::beans::XPropertySet > & rXPropSet,
+ const OUString& rPropertyName )
+{
+ css::beans::PropertyState eRetValue = css::beans::PropertyState_AMBIGUOUS_VALUE;
+ try
+ {
+ css::uno::Reference< css::beans::XPropertyState > aXPropState( rXPropSet, css::uno::UNO_QUERY );
+ if ( aXPropState.is() )
+ eRetValue = aXPropState->getPropertyState( rPropertyName );
+ }
+ catch( css::uno::Exception& )
+ {
+
+ }
+ return eRetValue;
+}
+
+bool PropValue::ImplGetPropertyValue( const OUString& rString )
+{
+ return GetPropertyValue( mAny, mXPropSet, rString );
+}
+
+bool PropValue::ImplGetPropertyValue( const css::uno::Reference< css::beans::XPropertySet > & aXPropSet, const OUString& rString )
+{
+ return GetPropertyValue( mAny, aXPropSet, rString );
+}
+
+bool PropStateValue::ImplGetPropertyValue( const OUString& rString, bool bGetPropertyState )
+{
+ ePropState = css::beans::PropertyState_AMBIGUOUS_VALUE;
+ bool bRetValue = true;
+#ifdef UNX
+ css::uno::Reference< css::beans::XPropertySetInfo >
+ aXPropSetInfo( mXPropSet->getPropertySetInfo() );
+ if ( !aXPropSetInfo.is() )
+ return false;
+#endif
+ try
+ {
+ mAny = mXPropSet->getPropertyValue( rString );
+ if ( !mAny.hasValue() )
+ bRetValue = false;
+ else if ( bGetPropertyState )
+ ePropState = mXPropState->getPropertyState( rString );
+ else
+ ePropState = css::beans::PropertyState_DIRECT_VALUE;
+ }
+ catch( css::uno::Exception& )
+ {
+ bRetValue = false;
+ }
+ return bRetValue;
+}
+
+void PPTWriter::ImplWriteParagraphs( SvStream& rOut, TextObj& rTextObj )
+{
+ bool bFirstParagraph = true;
+ sal_uInt32 nCharCount;
+ sal_uInt32 nPropertyFlags = 0;
+ sal_Int16 nLineSpacing;
+ int nInstance = rTextObj.GetInstance();
+
+ for ( sal_uInt32 i = 0; i < rTextObj.ParagraphCount(); ++i, bFirstParagraph = false )
+ {
+ ParagraphObj* pPara = rTextObj.GetParagraph(i);
+ const PortionObj& rPortion = pPara->front();
+ nCharCount = pPara->CharacterCount();
+
+ if ( ( pPara->meTextAdjust == css::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_Adjust, pPara->mnTextAdjust ) ) )
+ nPropertyFlags |= 0x00000800;
+ nLineSpacing = pPara->mnLineSpacing;
+
+ const FontCollectionEntry* pDesc = maFontCollection.GetById( rPortion.mnFont );
+ sal_Int16 nNormalSpacing = 100;
+ if ( !mbFontIndependentLineSpacing && pDesc )
+ {
+ double fN = 100.0;
+ fN *= pDesc->Scaling;
+ nNormalSpacing = static_cast<sal_Int16>( fN + 0.5 );
+ }
+ if ( !mbFontIndependentLineSpacing && bFirstParagraph && ( nLineSpacing > nNormalSpacing ) ) // sj: i28747, no replacement for fixed linespacing
+ {
+ nLineSpacing = nNormalSpacing;
+ nPropertyFlags |= 0x00001000;
+ }
+ else
+ {
+ if ( nLineSpacing > 0 )
+ {
+ if ( !mbFontIndependentLineSpacing && pDesc )
+ nLineSpacing = static_cast<sal_Int16>( static_cast<double>(nLineSpacing) * pDesc->Scaling + 0.5 );
+ }
+ else
+ {
+ if ( !pPara->mbFixedLineSpacing && rPortion.mnCharHeight > static_cast<sal_uInt16>( static_cast<double>(-nLineSpacing) * 0.001 * 72.0 / 2.54 ) ) // 1/100mm to point
+ nLineSpacing = nNormalSpacing;
+ else
+ nLineSpacing = static_cast<sal_Int16>( convertMm100ToMasterUnit(nLineSpacing) );
+ }
+ if ( ( pPara->meLineSpacing == css::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_LineFeed, nLineSpacing ) ) )
+ nPropertyFlags |= 0x00001000;
+ }
+ if ( ( pPara->meLineSpacingTop == css::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_UpperDist, pPara->mnLineSpacingTop ) ) )
+ nPropertyFlags |= 0x00002000;
+ if ( ( pPara->meLineSpacingBottom == css::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_LowerDist, pPara->mnLineSpacingBottom ) ) )
+ nPropertyFlags |= 0x00004000;
+ if ( ( pPara->meForbiddenRules == css::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_UpperDist, pPara->mbForbiddenRules ? 1 : 0 ) ) )
+ nPropertyFlags |= 0x00020000;
+ if ( ( pPara->meParagraphPunctation == css::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_UpperDist, pPara->mbParagraphPunctation ? 1 : 0 ) ) )
+ nPropertyFlags |= 0x00080000;
+ if ( ( pPara->meBiDi == css::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_BiDi, pPara->mnBiDi ) ) )
+ nPropertyFlags |= 0x00200000;
+
+ sal_Int32 nBuRealSize = pPara->nBulletRealSize;
+ sal_Int16 nBulletFlags = pPara->nBulletFlags;
+
+ if ( pPara->bExtendedParameters )
+ nPropertyFlags |= pPara->nParaFlags;
+ else
+ {
+ nPropertyFlags |= 1; // turn off bullet explicit
+ nBulletFlags = 0;
+ }
+
+ // Write nTextOfs and nBullets
+ if ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_TextOfs, pPara->nTextOfs ) )
+ nPropertyFlags |= 0x100;
+ if ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_BulletOfs, pPara->nBulletOfs ))
+ nPropertyFlags |= 0x400;
+
+ FontCollectionEntry aFontDescEntry( pPara->aFontDesc.Name, pPara->aFontDesc.Family, pPara->aFontDesc.Pitch, pPara->aFontDesc.CharSet );
+ sal_uInt16 nFontId = static_cast<sal_uInt16>(maFontCollection.GetId( aFontDescEntry ));
+
+ rOut.WriteUInt32( nCharCount )
+ .WriteUInt16( pPara->nDepth ) // Level
+ .WriteUInt32( nPropertyFlags ); // Paragraph Attribute Set
+
+ if ( nPropertyFlags & 0xf )
+ rOut.WriteInt16( nBulletFlags );
+ if ( nPropertyFlags & 0x80 )
+ rOut.WriteUInt16( pPara->cBulletId );
+ if ( nPropertyFlags & 0x10 )
+ rOut.WriteUInt16( nFontId );
+ if ( nPropertyFlags & 0x40 )
+ rOut.WriteInt16( nBuRealSize );
+ if ( nPropertyFlags & 0x20 )
+ {
+ sal_uInt32 nBulletColor = pPara->nBulletColor;
+ if ( nBulletColor == sal_uInt32(COL_AUTO) )
+ {
+ bool bIsDark = false;
+ css::uno::Any aAny;
+ if ( PropValue::GetPropertyValue( aAny, mXPagePropSet, "IsBackgroundDark", true ) )
+ aAny >>= bIsDark;
+ nBulletColor = bIsDark ? 0xffffff : 0x000000;
+ }
+ nBulletColor &= 0xffffff;
+ nBulletColor |= 0xfe000000;
+ rOut.WriteUInt32( nBulletColor );
+ }
+ if ( nPropertyFlags & 0x00000800 )
+ rOut.WriteUInt16( pPara->mnTextAdjust );
+ if ( nPropertyFlags & 0x00001000 )
+ rOut.WriteUInt16( nLineSpacing );
+ if ( nPropertyFlags & 0x00002000 )
+ rOut.WriteUInt16( pPara->mnLineSpacingTop );
+ if ( nPropertyFlags & 0x00004000 )
+ rOut.WriteUInt16( pPara->mnLineSpacingBottom );
+ if ( nPropertyFlags & 0x100 )
+ rOut.WriteUInt16( pPara->nTextOfs );
+ if ( nPropertyFlags & 0x400 )
+ rOut.WriteUInt16( pPara->nBulletOfs );
+ if ( nPropertyFlags & 0x000e0000 )
+ {
+ sal_uInt16 nAsianSettings = 0;
+ if ( pPara->mbForbiddenRules )
+ nAsianSettings |= 1;
+ if ( pPara->mbParagraphPunctation )
+ nAsianSettings |= 4;
+ rOut.WriteUInt16( nAsianSettings );
+ }
+ if ( nPropertyFlags & 0x200000 )
+ rOut.WriteUInt16( pPara->mnBiDi );
+ }
+}
+
+void PPTWriter::ImplWritePortions( SvStream& rOut, TextObj& rTextObj )
+{
+ sal_uInt32 nPropertyFlags;
+ int nInstance = rTextObj.GetInstance();
+
+ for ( sal_uInt32 i = 0; i < rTextObj.ParagraphCount(); ++i )
+ {
+ ParagraphObj* pPara = rTextObj.GetParagraph(i);
+ for ( std::vector<std::unique_ptr<PortionObj> >::const_iterator it = pPara->begin(); it != pPara->end(); ++it )
+ {
+ const PortionObj& rPortion = **it;
+ nPropertyFlags = 0;
+ sal_uInt32 nCharAttr = rPortion.mnCharAttr;
+ sal_uInt32 nCharColor = rPortion.mnCharColor;
+
+ if ( nCharColor == sal_uInt32(COL_AUTO) ) // nCharColor depends to the background color
+ {
+ bool bIsDark = false;
+ css::uno::Any aAny;
+ if ( PropValue::GetPropertyValue( aAny, mXPagePropSet, "IsBackgroundDark", true ) )
+ aAny >>= bIsDark;
+ nCharColor = bIsDark ? 0xffffff : 0x000000;
+ }
+
+ nCharColor &= 0xffffff;
+
+ /* the portion is using the embossed or engraved attribute, which we want to map to the relief feature of PPT.
+ Because the relief feature of PPT is dependent to the background color, such a mapping can not always be used. */
+ if ( nCharAttr & 0x200 )
+ {
+ sal_uInt32 nBackgroundColor = 0xffffff;
+
+ if ( !nCharColor ) // special treatment for
+ nCharColor = 0xffffff; // black fontcolor
+
+ css::uno::Any aAny;
+ css::drawing::FillStyle aFS( css::drawing::FillStyle_NONE );
+ if ( PropValue::GetPropertyValue( aAny, mXPropSet, "FillStyle" ) )
+ aAny >>= aFS;
+ switch( aFS )
+ {
+ case css::drawing::FillStyle_GRADIENT :
+ {
+ ::tools::Rectangle aRect( Point(), Size( 28000, 21000 ) );
+ EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm.get(), aRect );
+ aPropOpt.CreateGradientProperties( mXPropSet );
+ aPropOpt.GetOpt( ESCHER_Prop_fillColor, nBackgroundColor );
+ }
+ break;
+ case css::drawing::FillStyle_SOLID :
+ {
+ if ( PropValue::GetPropertyValue( aAny, mXPropSet, "FillColor" ) )
+ nBackgroundColor = EscherEx::GetColor( *o3tl::doAccess<sal_uInt32>(aAny) );
+ }
+ break;
+ case css::drawing::FillStyle_NONE :
+ {
+ css::uno::Any aBackAny;
+ css::drawing::FillStyle aBackFS( css::drawing::FillStyle_NONE );
+ if ( PropValue::GetPropertyValue( aBackAny, mXBackgroundPropSet, "FillStyle" ) )
+ aBackAny >>= aBackFS;
+ switch( aBackFS )
+ {
+ case css::drawing::FillStyle_GRADIENT :
+ {
+ ::tools::Rectangle aRect( Point(), Size( 28000, 21000 ) );
+ EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm.get(), aRect );
+ aPropOpt.CreateGradientProperties( mXBackgroundPropSet );
+ aPropOpt.GetOpt( ESCHER_Prop_fillColor, nBackgroundColor );
+ }
+ break;
+ case css::drawing::FillStyle_SOLID :
+ {
+ if ( PropValue::GetPropertyValue( aAny, mXBackgroundPropSet, "FillColor" ) )
+ nBackgroundColor = EscherEx::GetColor( *o3tl::doAccess<sal_uInt32>(aAny) );
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ sal_Int32 nB = nBackgroundColor & 0xff;
+ nB += static_cast<sal_uInt8>( nBackgroundColor >> 8 );
+ nB += static_cast<sal_uInt8>( nBackgroundColor >> 16 );
+ // if the background color is nearly black, relief can't been used, because the text would not be visible
+ if ( nB < 0x60 || ( nBackgroundColor != nCharColor ) )
+ {
+ nCharAttr &=~ 0x200;
+
+ // now check if the text is part of a group, and if the previous object has the same color than the fontcolor
+ // ( and if fillcolor is not available the background color ), it is sometimes
+ // not possible to export the 'embossed' flag
+ if ( ( GetCurrentGroupLevel() > 0 ) && ( GetCurrentGroupIndex() >= 1 ) )
+ {
+ css::uno::Reference< css::drawing::XShape > aGroupedShape( GetCurrentGroupAccess()->getByIndex( GetCurrentGroupIndex() - 1 ), uno::UNO_QUERY );
+ if( aGroupedShape.is() )
+ {
+ css::uno::Reference< css::beans::XPropertySet > aPropSetOfNextShape
+ ( aGroupedShape, css::uno::UNO_QUERY );
+ if ( aPropSetOfNextShape.is() )
+ {
+ if ( PropValue::GetPropertyValue( aAny, aPropSetOfNextShape,
+ "FillColor", true ) )
+ {
+ if ( nCharColor == EscherEx::GetColor( *o3tl::doAccess<sal_uInt32>(aAny) ) )
+ {
+ nCharAttr |= 0x200;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ nCharColor |= 0xfe000000;
+ if ( nInstance == 4 ) // special handling for normal textobjects:
+ nPropertyFlags |= nCharAttr & 0x217; // not all attributes are inherited
+ else
+ {
+ if ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Bold, nCharAttr ) )
+ nPropertyFlags |= 1;
+ if ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Italic, nCharAttr ) )
+ nPropertyFlags |= 2;
+ if ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Underline, nCharAttr ) )
+ nPropertyFlags |= 4;
+ if ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Shadow, nCharAttr ) )
+ nPropertyFlags |= 0x10;
+ if ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Embossed, nCharAttr ) )
+ nPropertyFlags |= 512;
+ }
+ if ( rTextObj.HasExtendedBullets() )
+ {
+ nPropertyFlags |= ( i & 0x3f ) << 10 ;
+ nCharAttr |= ( i & 0x3f ) << 10;
+ }
+ if ( ( rPortion.meFontName == css::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Font, rPortion.mnFont ) ) )
+ nPropertyFlags |= 0x00010000;
+ if ( ( rPortion.meAsianOrComplexFont == css::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_AsianOrComplexFont, rPortion.mnAsianOrComplexFont ) ) )
+ nPropertyFlags |= 0x00200000;
+ if ( ( rPortion.meCharHeight == css::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_FontHeight, rPortion.mnCharHeight ) ) )
+ nPropertyFlags |= 0x00020000;
+ if ( ( rPortion.meCharColor == css::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_FontColor, nCharColor & 0xffffff ) ) )
+ nPropertyFlags |= 0x00040000;
+ if ( ( rPortion.meCharEscapement == css::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Escapement, rPortion.mnCharEscapement ) ) )
+ nPropertyFlags |= 0x00080000;
+
+ sal_uInt32 nCharCount = rPortion.Count();
+
+ rOut.WriteUInt32( nCharCount )
+ .WriteUInt32( nPropertyFlags ); //PropertyFlags
+
+ if ( nPropertyFlags & 0xffff )
+ rOut.WriteUInt16( nCharAttr );
+ if ( nPropertyFlags & 0x00010000 )
+ rOut.WriteUInt16( rPortion.mnFont );
+ if ( nPropertyFlags & 0x00200000 )
+ rOut.WriteUInt16( rPortion.mnAsianOrComplexFont );
+ if ( nPropertyFlags & 0x00020000 )
+ rOut.WriteUInt16( rPortion.mnCharHeight );
+ if ( nPropertyFlags & 0x00040000 )
+ rOut.WriteUInt32( nCharColor );
+ if ( nPropertyFlags & 0x00080000 )
+ rOut.WriteInt16( rPortion.mnCharEscapement );
+ }
+ }
+}
+
+/**
+ * Loads and converts text from shape, value is stored in mnTextSize.
+ */
+bool PPTWriter::ImplGetText()
+{
+ mnTextSize = 0;
+ mbFontIndependentLineSpacing = false;
+ mXText.set( mXShape, css::uno::UNO_QUERY );
+
+ if ( mXText.is() )
+ {
+ mnTextSize = mXText->getString().getLength();
+ css::uno::Any aAny;
+ if ( GetPropertyValue( aAny, mXPropSet, "FontIndependentLineSpacing", true ) )
+ aAny >>= mbFontIndependentLineSpacing;
+ }
+ return ( mnTextSize != 0 );
+}
+
+void PPTWriter::ImplFlipBoundingBox( EscherPropertyContainer& rPropOpt )
+{
+ if ( mnAngle < 0 )
+ mnAngle = ( 36000 + mnAngle ) % 36000;
+ else
+ mnAngle = ( 36000 - ( mnAngle % 36000 ) );
+
+ double fCos = cos( basegfx::deg2rad<100>(mnAngle) );
+ double fSin = sin( basegfx::deg2rad<100>(mnAngle) );
+
+ double fWidthHalf = maRect.GetWidth() / 2.0;
+ double fHeightHalf = maRect.GetHeight() / 2.0;
+
+ double fXDiff = fCos * fWidthHalf + fSin * (-fHeightHalf);
+ double fYDiff = - ( fSin * fWidthHalf - fCos * ( -fHeightHalf ) );
+
+ maRect.Move( static_cast<sal_Int32>( -( fWidthHalf - fXDiff ) ), static_cast<sal_Int32>( - ( fHeightHalf + fYDiff ) ) );
+ mnAngle *= 655;
+ mnAngle += 0x8000;
+ mnAngle &=~0xffff; // round nAngle to full grads
+ rPropOpt.AddOpt( ESCHER_Prop_Rotation, mnAngle );
+
+ if ( ( mnAngle >= ( 45 << 16 ) && mnAngle < ( 135 << 16 ) ) ||
+ ( mnAngle >= ( 225 << 16 ) && mnAngle < ( 315 << 16 ) ) )
+ {
+ // Maddeningly, in those two areas of PPT is the BoundingBox already
+ // vertical. Therefore, we need to put down it BEFORE THE ROTATION.
+ css::awt::Point aTopLeft( static_cast<sal_Int32>( maRect.Left() + fWidthHalf - fHeightHalf ), static_cast<sal_Int32>( maRect.Top() + fHeightHalf - fWidthHalf ) );
+ const tools::Long nRotatedWidth(maRect.GetHeight());
+ const tools::Long nRotatedHeight(maRect.GetWidth());
+ const Size aNewSize(nRotatedWidth, nRotatedHeight);
+ maRect = ::tools::Rectangle( Point( aTopLeft.X, aTopLeft.Y ), aNewSize );
+ }
+}
+
+void PPTWriter::ImplAdjustFirstLineLineSpacing( TextObj& rTextObj, EscherPropertyContainer& rPropOpt )
+{
+ if ( mbFontIndependentLineSpacing )
+ return;
+
+ if ( !rTextObj.ParagraphCount() )
+ return;
+
+ ParagraphObj* pPara = rTextObj.GetParagraph(0);
+ if ( pPara->empty() )
+ return;
+
+ const PortionObj& rPortion = pPara->front();
+ sal_Int16 nLineSpacing = pPara->mnLineSpacing;
+ const FontCollectionEntry* pDesc = maFontCollection.GetById( rPortion.mnFont );
+ if ( pDesc )
+ nLineSpacing = static_cast<sal_Int16>( static_cast<double>(nLineSpacing) * pDesc->Scaling + 0.5 );
+
+ if ( ( nLineSpacing > 0 ) && ( nLineSpacing < 100 ) )
+ {
+ double fCharHeight = convertPointToMm100<double>(rPortion.mnCharHeight);
+ fCharHeight *= 100 - nLineSpacing;
+ fCharHeight /= 100;
+
+ sal_uInt32 nUpperDistance = 0;
+ rPropOpt.GetOpt( ESCHER_Prop_dyTextTop, nUpperDistance );
+ nUpperDistance += static_cast< sal_uInt32 >( fCharHeight * 360.0 );
+ rPropOpt.AddOpt( ESCHER_Prop_dyTextTop, nUpperDistance );
+ }
+}
+
+void PPTWriter::ImplWriteTextStyleAtom( SvStream& rOut, int nTextInstance, sal_uInt32 nAtomInstance,
+ TextRuleEntry* pTextRule, SvStream& rExtBuStr, EscherPropertyContainer* pPropOpt )
+{
+ PPTExParaSheet& rParaSheet = mpStyleSheet->GetParaSheet( nTextInstance );
+
+ rOut.WriteUInt32( ( EPP_TextHeaderAtom << 16 ) | ( nAtomInstance << 4 ) ).WriteUInt32( 4 )
+ .WriteInt32( nTextInstance );
+
+ if ( mbEmptyPresObj )
+ mnTextSize = 0;
+ if ( mbEmptyPresObj )
+ return;
+
+ ParagraphObj* pPara;
+ TextObjBinary aTextObj( mXText, nTextInstance, maFontCollection, static_cast<PPTExBulletProvider&>(*this) );
+
+ // leaving out EPP_TextCharsAtom w/o text - still write out
+ // attribute info though
+ if ( mnTextSize )
+ aTextObj.Write( &rOut );
+
+ if ( pPropOpt && mType != "drawing.Table" )
+ ImplAdjustFirstLineLineSpacing( aTextObj, *pPropOpt );
+
+ sal_uInt32 nSize, nPos = rOut.Tell();
+
+ rOut.WriteUInt32( EPP_StyleTextPropAtom << 16 ).WriteUInt32( 0 );
+ ImplWriteParagraphs( rOut, aTextObj );
+ ImplWritePortions( rOut, aTextObj );
+ nSize = rOut.Tell() - nPos;
+ rOut.SeekRel( - ( static_cast<sal_Int32>(nSize) - 4 ) );
+ rOut.WriteUInt32( nSize - 8 );
+ rOut.SeekRel( nSize - 8 );
+
+ for ( sal_uInt32 i = 0; i < aTextObj.ParagraphCount(); ++i )
+ {
+ pPara = aTextObj.GetParagraph(i);
+ for ( std::vector<std::unique_ptr<PortionObj> >::const_iterator it = pPara->begin(); it != pPara->end(); ++it )
+ {
+ const PortionObj& rPortion = **it;
+ if ( rPortion.mpFieldEntry )
+ {
+ const FieldEntry* pFieldEntry = rPortion.mpFieldEntry.get();
+
+ switch ( pFieldEntry->nFieldType >> 28 )
+ {
+ case 1 :
+ case 2 :
+ {
+ rOut.WriteUInt32( EPP_DateTimeMCAtom << 16 ).WriteUInt32( 8 )
+ .WriteUInt32( pFieldEntry->nFieldStartPos ) // TxtOffset to TxtField;
+ .WriteUChar( pFieldEntry->nFieldType & 0xff ) // Type
+ .WriteUChar( 0 ).WriteUInt16( 0 ); // PadBytes
+ }
+ break;
+ case 3 :
+ {
+ rOut.WriteUInt32( EPP_SlideNumberMCAtom << 16 ).WriteUInt32( 4 )
+ .WriteUInt32( pFieldEntry->nFieldStartPos );
+ }
+ break;
+ case 4 :
+ {
+ sal_uInt32 nPageIndex = 0;
+ OUString aPageUrl;
+ OUString aFile( pFieldEntry->aFieldUrl );
+ OUString aTarget( pFieldEntry->aFieldUrl );
+ INetURLObject aUrl( pFieldEntry->aFieldUrl );
+ if ( INetProtocol::File == aUrl.GetProtocol() )
+ aFile = aUrl.PathToFileName();
+ else if ( INetProtocol::Smb == aUrl.GetProtocol() )
+ {
+ // Convert smb notation to '\\' and skip the 'smb:' part
+ aFile = aUrl.GetMainURL(INetURLObject::DecodeMechanism::NONE).copy(4);
+ aFile = aFile.replaceAll( "/", "\\" );
+ aTarget = aFile;
+ }
+ else if ( pFieldEntry->aFieldUrl.startsWith("#") )
+ {
+ OUString aPage( INetURLObject::decode( pFieldEntry->aFieldUrl, INetURLObject::DecodeMechanism::WithCharset ) );
+ aPage = aPage.copy( 1 );
+
+ std::vector<OUString>::const_iterator pIter = std::find(
+ maSlideNameList.begin(),maSlideNameList.end(),aPage);
+
+ if ( pIter != maSlideNameList.end() )
+ {
+ nPageIndex = pIter - maSlideNameList.begin();
+ aPageUrl = OUString::number(256 + nPageIndex) +
+ "," +
+ OUString::number(nPageIndex + 1) +
+ ",Slide " +
+ OUString::number(nPageIndex + 1);
+ }
+ }
+ sal_uInt32 nHyperId(0);
+ if ( !aPageUrl.isEmpty() )
+ nHyperId = ImplInsertBookmarkURL( aPageUrl, 1 | ( nPageIndex << 8 ) | ( 1U << 31 ), pFieldEntry->aRepresentation, "", "", aPageUrl );
+ else
+ nHyperId = ImplInsertBookmarkURL( pFieldEntry->aFieldUrl, 2 | ( nHyperId << 8 ), aFile, aTarget, "", "" );
+
+ rOut.WriteUInt32( ( EPP_InteractiveInfo << 16 ) | 0xf ).WriteUInt32( 24 )
+ .WriteUInt32( EPP_InteractiveInfoAtom << 16 ).WriteUInt32( 16 )
+ .WriteUInt32( 0 ) // soundref
+ .WriteUInt32( nHyperId ) // hyperlink id
+ .WriteUChar( 4 ) // hyperlink action
+ .WriteUChar( 0 ) // ole verb
+ .WriteUChar( 0 ) // jump
+ .WriteUChar( 0 ) // flags
+ .WriteUChar( 8 ) // hyperlink type ?
+ .WriteUChar( 0 ).WriteUChar( 0 ).WriteUChar( 0 )
+ .WriteUInt32( EPP_TxInteractiveInfoAtom << 16 ).WriteUInt32( 8 )
+ .WriteUInt32( pFieldEntry->nFieldStartPos )
+ .WriteUInt32( pFieldEntry->nFieldEndPos );
+ }
+ break;
+ case 5 :
+ {
+ rOut.WriteUInt32( EPP_GenericDateMCAtom << 16 ).WriteUInt32( 4 )
+ .WriteUInt32( pFieldEntry->nFieldStartPos );
+ }
+ break;
+ case 6 :
+ {
+ rOut.WriteUInt32( EPP_HeaderMCAtom << 16 ).WriteUInt32( 4 )
+ .WriteUInt32( pFieldEntry->nFieldStartPos );
+ }
+ break;
+ case 7 :
+ {
+ rOut.WriteUInt32( EPP_FooterMCAtom << 16 ).WriteUInt32( 4 )
+ .WriteUInt32( pFieldEntry->nFieldStartPos );
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ aTextObj.WriteTextSpecInfo( &rOut );
+
+ // write Star Office Default TabSizes (if necessary)
+ if ( aTextObj.ParagraphCount() )
+ {
+ pPara = aTextObj.GetParagraph(0);
+ sal_uInt32 nParaFlags = 0x1f;
+ sal_Int16 nMask, nNumberingRule[ 10 ];
+ const sal_uInt32 nTabs = pPara->maTabStop.getLength();
+ const auto& rTabStops = pPara->maTabStop;
+
+ for ( sal_uInt32 i = 0; i < aTextObj.ParagraphCount(); ++i )
+ {
+ pPara = aTextObj.GetParagraph(i);
+ if ( pPara->bExtendedParameters )
+ {
+ nMask = 1 << pPara->nDepth;
+ if ( nParaFlags & nMask )
+ {
+ nParaFlags &=~ nMask;
+ if ( ( rParaSheet.maParaLevel[ pPara->nDepth ].mnTextOfs != pPara->nTextOfs ) ||
+ ( rParaSheet.maParaLevel[ pPara->nDepth ].mnBulletOfs != pPara->nBulletOfs ) )
+ {
+ nParaFlags |= nMask << 16;
+ nNumberingRule[ pPara->nDepth << 1 ] = pPara->nTextOfs;
+ nNumberingRule[ ( pPara->nDepth << 1 ) + 1 ] = static_cast<sal_Int16>(pPara->nBulletOfs);
+ }
+ }
+ }
+ }
+ nParaFlags >>= 16;
+
+ sal_Int32 nDefaultTabSizeSrc = 2011; // I've no idea where this number came from, honestly
+ const uno::Reference< beans::XPropertySet > xPropSet( mXModel, uno::UNO_QUERY );
+ if ( xPropSet.is() )
+ {
+ if(ImplGetPropertyValue( xPropSet, "TabStop" ))
+ {
+ sal_Int32 nTabStop( 0 );
+ if ( mAny >>= nTabStop )
+ nDefaultTabSizeSrc = nTabStop;
+ }
+ }
+ const sal_uInt32 nDefaultTabSize = MapSize( awt::Size( nDefaultTabSizeSrc, 1 ) ).Width;
+ sal_uInt32 nDefaultTabs = std::abs( maRect.GetWidth() ) / nDefaultTabSize;
+ if ( nTabs )
+ nDefaultTabs -= static_cast<sal_Int32>( convertMm100ToMasterUnit(rTabStops[ nTabs - 1 ].Position) / nDefaultTabSize );
+ if ( static_cast<sal_Int32>(nDefaultTabs) < 0 )
+ nDefaultTabs = 0;
+
+ sal_uInt32 nTabCount = nTabs + nDefaultTabs;
+ sal_uInt32 i, nTextRulerAtomFlags = 0;
+
+ if ( nTabCount )
+ nTextRulerAtomFlags |= 4;
+ if ( nParaFlags )
+ nTextRulerAtomFlags |= ( ( nParaFlags << 3 ) | ( nParaFlags << 8 ) );
+
+ if ( nTextRulerAtomFlags )
+ {
+ SvStream* pRuleOut = &rOut;
+ if ( pTextRule )
+ {
+ pTextRule->pOut.reset( new SvMemoryStream( 0x100, 0x100 ) );
+ pRuleOut = pTextRule->pOut.get();
+ }
+
+ sal_uInt32 nRulePos = pRuleOut->Tell();
+ pRuleOut->WriteUInt32( EPP_TextRulerAtom << 16 ).WriteUInt32( 0 );
+ pRuleOut->WriteUInt32( nTextRulerAtomFlags );
+ if ( nTextRulerAtomFlags & 4 )
+ {
+ pRuleOut->WriteUInt16( nTabCount );
+ for ( const css::style::TabStop& rTabStop : rTabStops )
+ {
+ sal_uInt16 nPosition = static_cast<sal_uInt16>( convertMm100ToMasterUnit(rTabStop.Position) );
+ sal_uInt16 nType;
+ switch ( rTabStop.Alignment )
+ {
+ case css::style::TabAlign_DECIMAL : nType = 3; break;
+ case css::style::TabAlign_RIGHT : nType = 2; break;
+ case css::style::TabAlign_CENTER : nType = 1; break;
+
+ case css::style::TabAlign_LEFT :
+ default: nType = 0;
+ }
+ pRuleOut->WriteUInt16( nPosition )
+ .WriteUInt16( nType );
+ }
+
+ sal_uInt32 nWidth = 1;
+ if ( nTabs )
+ nWidth += static_cast<sal_Int32>( convertMm100ToMasterUnit(rTabStops[ nTabs - 1 ].Position) / nDefaultTabSize );
+ nWidth *= nDefaultTabSize;
+ for ( i = 0; i < nDefaultTabs; i++, nWidth += nDefaultTabSize )
+ pRuleOut->WriteUInt32( nWidth );
+ }
+ for ( i = 0; i < 5; i++ )
+ {
+ if ( nTextRulerAtomFlags & ( 8 << i ) )
+ pRuleOut->WriteInt16( nNumberingRule[ i << 1 ] );
+ if ( nTextRulerAtomFlags & ( 256 << i ) )
+ pRuleOut->WriteInt16( nNumberingRule[ ( i << 1 ) + 1 ] );
+ }
+ sal_uInt32 nBufSize = pRuleOut->Tell() - nRulePos;
+ pRuleOut->SeekRel( - ( static_cast<sal_Int32>(nBufSize) - 4 ) );
+ pRuleOut->WriteUInt32( nBufSize - 8 );
+ pRuleOut->SeekRel( nBufSize - 8 );
+ }
+ }
+ if ( !aTextObj.HasExtendedBullets() )
+ return;
+
+ if ( !aTextObj.ParagraphCount() )
+ return;
+
+ sal_uInt32 nNumberingType = 0, nPos2 = rExtBuStr.Tell();
+
+ rExtBuStr.WriteUInt32( EPP_PST_ExtendedParagraphAtom << 16 ).WriteUInt32( 0 );
+
+ for ( sal_uInt32 i = 0; i < aTextObj.ParagraphCount(); ++i )
+ {
+ ParagraphObj* pBulletPara = aTextObj.GetParagraph(i);
+ sal_uInt32 nBulletFlags = 0;
+ sal_uInt16 nBulletId = pBulletPara->nBulletId;
+
+ if ( pBulletPara->bExtendedBulletsUsed )
+ {
+ nBulletFlags = 0x800000;
+ if ( pBulletPara->nNumberingType != SVX_NUM_BITMAP )
+ nBulletFlags = 0x3000000;
+ }
+ rExtBuStr.WriteUInt32( nBulletFlags );
+
+ if ( nBulletFlags & 0x800000 )
+ rExtBuStr.WriteUInt16( nBulletId );
+ if ( nBulletFlags & 0x1000000 )
+ {
+ switch( pBulletPara->nNumberingType )
+ {
+ case SVX_NUM_NUMBER_NONE :
+ case SVX_NUM_CHAR_SPECIAL :
+ nNumberingType = 0;
+ break;
+ case SVX_NUM_CHARS_UPPER_LETTER :
+ case SVX_NUM_CHARS_UPPER_LETTER_N :
+ case SVX_NUM_CHARS_LOWER_LETTER :
+ case SVX_NUM_CHARS_LOWER_LETTER_N :
+ case SVX_NUM_ROMAN_UPPER :
+ case SVX_NUM_ROMAN_LOWER :
+ case SVX_NUM_ARABIC :
+ case SVX_NUM_NUMBER_UPPER_ZH:
+ case SVX_NUM_CIRCLE_NUMBER:
+ case SVX_NUM_NUMBER_UPPER_ZH_TW:
+ case SVX_NUM_NUMBER_LOWER_ZH:
+ case SVX_NUM_FULL_WIDTH_ARABIC:
+ nNumberingType = pBulletPara->nMappedNumType;
+ break;
+
+ case SVX_NUM_BITMAP :
+ nNumberingType = 0;
+ break;
+ default: break;
+ }
+ rExtBuStr.WriteUInt32( nNumberingType );
+ }
+ if ( nBulletFlags & 0x2000000 )
+ rExtBuStr.WriteUInt16( pBulletPara->nStartWith );
+ rExtBuStr.WriteUInt32( 0 ).WriteUInt32( 0 );
+ }
+ sal_uInt32 nBulletSize = ( rExtBuStr.Tell() - nPos2 ) - 8;
+ rExtBuStr.SeekRel( - ( static_cast<sal_Int32>(nBulletSize) + 4 ) );
+ rExtBuStr.WriteUInt32( nBulletSize );
+ rExtBuStr.SeekRel( nBulletSize );
+}
+
+void PPTWriter::ImplWriteClickAction( SvStream& rSt, css::presentation::ClickAction eCa, bool bMediaClickAction )
+{
+ sal_uInt32 nSoundRef = 0; // a reference to a sound in the sound collection, or NULL.
+ sal_uInt32 nHyperLinkID = 0;// a persistent unique identifier to an external hyperlink object (only valid when action == HyperlinkAction).
+ sal_uInt8 nAction = 0; // Action See Action Table
+ sal_uInt8 const nOleVerb = 0; // OleVerb Only valid when action == OLEAction. OLE verb to use, 0 = first verb, 1 = second verb, etc.
+ sal_uInt8 nJump = 0; // Jump See Jump Table
+ sal_uInt8 const nFlags = 0; // Bit 1: Animated. If 1, then button is animated
+ // Bit 2: Stop sound. If 1, then stop current sound when button is pressed.
+ // Bit 3: CustomShowReturn. If 1, and this is a jump to custom show, then return to this slide after custom show.
+ sal_uInt8 nHyperLinkType = 0;// HyperlinkType a value from the LinkTo enum, such as LT_URL (only valid when action == HyperlinkAction).
+
+ OUString aFile;
+
+ /*
+ Action Table: Action Value
+ NoAction 0
+ MacroAction 1
+ RunProgramAction 2
+ JumpAction 3
+ HyperlinkAction 4
+ OLEAction 5
+ MediaAction 6
+ CustomShowAction 7
+
+ Jump Table: Jump Value
+ NoJump 0
+ NextSlide, 1
+ PreviousSlide, 2
+ FirstSlide, 3
+ LastSlide, 4
+ LastSlideViewed 5
+ EndShow 6
+ */
+
+ if ( bMediaClickAction )
+ nAction = 6;
+ else switch( eCa )
+ {
+ case css::presentation::ClickAction_STOPPRESENTATION :
+ nJump += 2;
+ [[fallthrough]];
+ case css::presentation::ClickAction_LASTPAGE :
+ nJump++;
+ [[fallthrough]];
+ case css::presentation::ClickAction_FIRSTPAGE :
+ nJump++;
+ [[fallthrough]];
+ case css::presentation::ClickAction_PREVPAGE :
+ nJump++;
+ [[fallthrough]];
+ case css::presentation::ClickAction_NEXTPAGE :
+ {
+ nJump++;
+ nAction = 3;
+ }
+ break;
+ case css::presentation::ClickAction_SOUND :
+ {
+ if ( ImplGetPropertyValue( "Bookmark" ) )
+ nSoundRef = maSoundCollection.GetId( *o3tl::doAccess<OUString>(mAny) );
+ }
+ break;
+ case css::presentation::ClickAction_PROGRAM :
+ {
+ if ( ImplGetPropertyValue( "Bookmark" ) )
+ {
+ INetURLObject aUrl( *o3tl::doAccess<OUString>(mAny) );
+ if ( INetProtocol::File == aUrl.GetProtocol() )
+ {
+ aFile = aUrl.PathToFileName();
+ nAction = 2;
+ }
+ }
+ }
+ break;
+
+ case css::presentation::ClickAction_BOOKMARK :
+ {
+ if ( ImplGetPropertyValue( "Bookmark" ) )
+ {
+ OUString aBookmark( *o3tl::doAccess<OUString>(mAny) );
+ sal_uInt32 nIndex = 0;
+ for ( const auto& rSlideName : maSlideNameList )
+ {
+ if ( rSlideName == aBookmark )
+ {
+ // Bookmark is a link to a document page
+ nAction = 4;
+ nHyperLinkType = 7;
+
+ OUString aHyperString = OUString::number(256 + nIndex) +
+ "," +
+ OUString::number(nIndex + 1) +
+ ",Slide " +
+ OUString::number(nIndex + 1);
+ nHyperLinkID = ImplInsertBookmarkURL( aHyperString, 1 | ( nIndex << 8 ) | ( 1U << 31 ), aBookmark, "", "", aHyperString );
+ }
+ nIndex++;
+ }
+ }
+ }
+ break;
+
+ case css::presentation::ClickAction_DOCUMENT :
+ {
+ if ( ImplGetPropertyValue( "Bookmark" ) )
+ {
+ OUString aBookmark( *o3tl::doAccess<OUString>(mAny) );
+ if ( !aBookmark.isEmpty() )
+ {
+ nAction = 4;
+ nHyperLinkType = 8;
+
+ OUString aBookmarkFile( aBookmark );
+ INetURLObject aUrl( aBookmark );
+ if ( INetProtocol::File == aUrl.GetProtocol() )
+ aBookmarkFile = aUrl.PathToFileName();
+ nHyperLinkID = ImplInsertBookmarkURL( aBookmark, sal_uInt32(2 | ( 1U << 31 )), aBookmarkFile, aBookmark, "", "" );
+ }
+ }
+ }
+ break;
+
+ case css::presentation::ClickAction_INVISIBLE :
+ case css::presentation::ClickAction_VERB :
+ case css::presentation::ClickAction_VANISH :
+ case css::presentation::ClickAction_MACRO :
+ default :
+ break;
+ }
+
+ sal_uInt32 nContainerSize = 24;
+ if ( nAction == 2 )
+ nContainerSize += ( aFile.getLength() * 2 ) + 8;
+ rSt.WriteUInt32( ( EPP_InteractiveInfo << 16 ) | 0xf ).WriteUInt32( nContainerSize )
+ .WriteUInt32( EPP_InteractiveInfoAtom << 16 ).WriteUInt32( 16 )
+ .WriteUInt32( nSoundRef )
+ .WriteUInt32( nHyperLinkID )
+ .WriteUChar( nAction )
+ .WriteUChar( nOleVerb )
+ .WriteUChar( nJump )
+ .WriteUChar( nFlags )
+ .WriteUInt32( nHyperLinkType );
+
+ if ( nAction == 2 ) // run program Action
+ {
+ sal_Int32 nLen = aFile.getLength();
+ rSt.WriteUInt32( ( EPP_CString << 16 ) | 0x20 ).WriteUInt32( nLen * 2 );
+ for ( sal_Int32 i = 0; i < nLen; i++ )
+ rSt.WriteUInt16( aFile[i] );
+ }
+
+ rSt.WriteUInt32( ( EPP_InteractiveInfo << 16 ) | 0x1f ).WriteUInt32( 24 ) // Mouse Over Action
+ .WriteUInt32( EPP_InteractiveInfo << 16 ).WriteUInt32( 16 );
+ for ( int i = 0; i < 4; i++, rSt.WriteUInt32( 0 ) ) ;
+}
+
+bool PPTWriter::ImplGetEffect( const css::uno::Reference< css::beans::XPropertySet > & rPropSet,
+ css::presentation::AnimationEffect& eEffect,
+ css::presentation::AnimationEffect& eTextEffect,
+ bool& bIsSound )
+{
+ css::uno::Any aAny;
+ if ( GetPropertyValue( aAny, rPropSet, "Effect" ) )
+ aAny >>= eEffect;
+ else
+ eEffect = css::presentation::AnimationEffect_NONE;
+
+ if ( GetPropertyValue( aAny, rPropSet, "TextEffect" ) )
+ aAny >>= eTextEffect;
+ else
+ eTextEffect = css::presentation::AnimationEffect_NONE;
+ if ( GetPropertyValue( aAny, rPropSet, "SoundOn" ) )
+ aAny >>= bIsSound;
+ else
+ bIsSound = false;
+
+ bool bHasEffect = ( ( eEffect != css::presentation::AnimationEffect_NONE )
+ || ( eTextEffect != css::presentation::AnimationEffect_NONE )
+ || bIsSound );
+ return bHasEffect;
+};
+
+bool PPTWriter::ImplCreatePresentationPlaceholder( const bool bMasterPage,
+ const sal_uInt32 nStyleInstance, const sal_uInt8 nPlaceHolderId )
+{
+ bool bRet = ImplGetText();
+ if ( bRet && bMasterPage )
+ {
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ sal_uInt32 nPresShapeID = mpPptEscherEx->GenerateShapeId();
+ mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty, nPresShapeID );
+ EscherPropertyContainer aPropOpt;
+ aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x50001 );
+ mnTxId += 0x60;
+ aPropOpt.AddOpt( ESCHER_Prop_lTxid, mnTxId );
+ aPropOpt.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x110001 );
+ aPropOpt.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
+ aPropOpt.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
+ aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
+ sal_uInt32 nLineFlags = 0x90001;
+ if ( aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ) )
+ nLineFlags |= 0x10001; // draw dashed line if no line
+ aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags );
+
+ SvMemoryStream aExtBu( 0x200, 0x200 );
+ SvMemoryStream aClientTextBox( 0x200, 0x200 );
+ ImplWriteTextStyleAtom( aClientTextBox, nStyleInstance, 0, nullptr, aExtBu, &aPropOpt );
+
+ mnTxId += 0x60;
+ aPropOpt.CreateTextProperties( mXPropSet, mnTxId );
+ aPropOpt.CreateShapeProperties( mXShape );
+ aPropOpt.Commit( *mpStrm );
+ mpPptEscherEx->AddAtom( 8, ESCHER_ClientAnchor );
+ mpStrm->WriteInt16( maRect.Top() ).WriteInt16( maRect.Left() ).WriteInt16( maRect.Right() ).WriteInt16( maRect.Bottom() ); // top, left, right, bottom ????
+ mpPptEscherEx->OpenContainer( ESCHER_ClientData );
+ mpPptEscherEx->AddAtom( 8, EPP_OEPlaceholderAtom );
+ mpStrm->WriteUInt32( 0 ) // PlacementID
+ .WriteUChar( nPlaceHolderId ) // PlaceHolderID
+ .WriteUChar( 0 ) // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
+ .WriteUInt16( 0 ); // padword
+ mpPptEscherEx->CloseContainer(); // ESCHER_ClientData
+
+ if ( aClientTextBox.Tell() )
+ {
+ mpStrm->WriteUInt32( ( ESCHER_ClientTextbox << 16 ) | 0xf )
+ .WriteUInt32( aClientTextBox.Tell() );
+
+ mpStrm->WriteBytes(aClientTextBox.GetData(), aClientTextBox.Tell());
+ }
+ mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
+ }
+ else
+ bRet = false;
+ return bRet;
+}
+
+void PPTWriter::ImplCreateShape( sal_uInt32 nType, ShapeFlag nFlags, EscherSolverContainer& rSolver )
+{
+ sal_uInt32 nId = mpPptEscherEx->GenerateShapeId();
+ mpPptEscherEx->AddShape( nType, nFlags, nId );
+ rSolver.AddShape( mXShape, nId );
+}
+
+void PPTWriter::ImplCreateTextShape( EscherPropertyContainer& rPropOpt, EscherSolverContainer& rSolver, bool bFill )
+{
+ mnTextStyle = EPP_TEXTSTYLE_TEXT;
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ImplCreateShape( ESCHER_ShpInst_TextBox, ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty, rSolver );
+ if ( bFill )
+ rPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
+ if ( ImplGetText() )
+ {
+ mnTxId += 0x60;
+ rPropOpt.CreateTextProperties( mXPropSet, mnTxId );
+ }
+}
+
+void PPTWriter::ImplWritePage( const PHLayout& rLayout, EscherSolverContainer& aSolverContainer, PageType ePageType, bool bMasterPage, int nPageNumber )
+{
+ // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
+ // sal_uInt32 nGroupLevel = 0;
+
+ sal_uInt32 nGroups, nShapes, nShapeCount, nPer, nLastPer, nIndices, nOlePictureId;
+ css::awt::Point aTextRefPoint;
+
+ nShapes = mXShapes->getCount();
+ ResetGroupTable( nShapes );
+
+ nIndices = nLastPer = nShapeCount = 0;
+
+ bool bIsTitlePossible = true; // powerpoint is not able to handle more than one title
+
+ sal_uInt32 nOutlinerCount = 0; // the outline objects have to conform to the layout,
+ sal_uInt32 nPrevTextStyle = 0; // there are no more than two allowed
+
+ nOlePictureId = 0;
+
+ bool bAdditionalText = false;
+
+ bool bSecOutl = false;
+ sal_uInt32 nPObjects = 0;
+
+ std::unique_ptr<SvMemoryStream> pClientTextBox;
+ std::unique_ptr<SvMemoryStream> pClientData;
+
+ while( GetNextGroupEntry() )
+ {
+ nShapeCount++;
+
+ nPer = ( 5 * nShapeCount ) / nShapes;
+ if ( nPer != nLastPer )
+ {
+ nLastPer = nPer;
+ sal_uInt32 nValue = mnPagesWritten * 5 + nPer;
+ if ( nValue > mnStatMaxValue )
+ nValue = mnStatMaxValue;
+ if ( mbStatusIndicator && ( nValue > mnLatestStatValue ) )
+ {
+ mXStatusIndicator->setValue( nValue );
+ mnLatestStatValue = nValue;
+ }
+ }
+ nGroups = GetGroupsClosed();
+ for ( sal_uInt32 i = 0; i < nGroups; i++, mpPptEscherEx->LeaveGroup() ) ;
+
+ if ( GetShapeByIndex( GetCurrentGroupIndex(), true ) )
+ {
+ bool bIsSound;
+ bool bMediaClickAction = false;
+ css::presentation::AnimationEffect eAe;
+ css::presentation::AnimationEffect eTe;
+
+ bool bEffect = ImplGetEffect( mXPropSet, eAe, eTe, bIsSound );
+ css::presentation::ClickAction eCa = css::presentation::ClickAction_NONE;
+ if ( ImplGetPropertyValue( "OnClick" ) )
+ mAny >>= eCa;
+
+ bool bGroup = mType == "drawing.Group";
+ bool bOpenBezier = mType == "drawing.OpenBezier";
+ bool bClosedBezier = mType == "drawing.ClosedBezier";
+ bool bPolyPolygon = mType == "drawing.PolyPolygon";
+ bool bPolyLine = mType == "drawing.PolyLine";
+ OUString aGraphicPropertyName("Graphic");
+
+ const css::awt::Size aSize100thmm( mXShape->getSize() );
+ const css::awt::Point aPoint100thmm( mXShape->getPosition() );
+ ::tools::Rectangle aRect100thmm( Point( aPoint100thmm.X, aPoint100thmm.Y ), Size( aSize100thmm.Width, aSize100thmm.Height ) );
+ EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm.get(), aRect100thmm );
+
+ if ( bGroup )
+ {
+ css::uno::Reference< css::container::XIndexAccess >
+ aXIndexAccess( mXShape, css::uno::UNO_QUERY );
+ if ( EnterGroup( aXIndexAccess ) )
+ {
+ std::unique_ptr<SvMemoryStream> pTmp;
+ if ( eCa != css::presentation::ClickAction_NONE )
+ {
+ pTmp.reset(new SvMemoryStream(0x200, 0x200));
+ ImplWriteClickAction( *pTmp, eCa, bMediaClickAction );
+ }
+ sal_uInt32 nShapeId = mpPptEscherEx->EnterGroup(&maRect, pTmp.get());
+ aSolverContainer.AddShape( mXShape, nShapeId );
+ }
+ }
+ else
+ {
+ bool bIsFontwork = false;
+ bool bIsHatching = false;
+ css::uno::Any aAny;
+ if ( GetPropertyValue( aAny, mXPropSet, "IsFontwork", true ) )
+ aAny >>= bIsFontwork;
+ if ( GetPropertyValue( aAny, mXPropSet, "FillStyle", true ) )
+ {
+ css::drawing::FillStyle eFS;
+ aAny >>= eFS;
+ bIsHatching = eFS == css::drawing::FillStyle_HATCH;
+ if (mType == "drawing.Custom" && eFS == drawing::FillStyle_BITMAP)
+ {
+ ShapeFlag nMirrorFlags;
+ OUString sCustomShapeType;
+ MSO_SPT eShapeType = EscherPropertyContainer::GetCustomShapeType(
+ mXShape, nMirrorFlags, sCustomShapeType);
+ if (eShapeType == mso_sptMax)
+ {
+ // We can't map this custom shape to a PPT preset and it has a bitmap
+ // fill. Make sure that at least the bitmap fill is not lost.
+ mType = "drawing.GraphicObject";
+ aGraphicPropertyName = "Bitmap";
+ }
+ }
+ }
+ if ( bIsHatching || bIsFontwork || ( mType == "drawing.Measure" ) || ( mType == "drawing.Caption" ) )
+ {
+ if ( ImplGetPropertyValue( "BoundRect" ) )
+ {
+ auto aRect = o3tl::doAccess<css::awt::Rectangle>(mAny);
+ maPosition = MapPoint( css::awt::Point( aRect->X, aRect->Y ) );
+ maSize = MapSize( css::awt::Size( aRect->Width, aRect->Height ) );
+ maRect = ::tools::Rectangle( Point( maPosition.X, maPosition.Y ), Size( maSize.Width, maSize.Height ) );
+ }
+ mType = "drawing.dontknow";
+ }
+ }
+ sal_uInt8 nPlaceHolderAtom = EPP_PLACEHOLDER_NONE;
+
+ mnTextSize = 0;
+ mnTextStyle = EPP_TEXTSTYLE_NORMAL;
+
+ if ( mType == "drawing.Custom" )
+ {
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ShapeFlag nMirrorFlags;
+ OUString sCustomShapeType;
+ MSO_SPT eShapeType = EscherPropertyContainer::GetCustomShapeType( mXShape, nMirrorFlags, sCustomShapeType );
+ if ( sCustomShapeType == "col-502ad400" || sCustomShapeType == "col-60da8460" )
+ { // sj: creating metafile for customshapes that can't be saved to ms format properly
+ ImplCreateShape( ESCHER_ShpInst_PictureFrame,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+ if ( aPropOpt.CreateGraphicProperties( mXPropSet, "MetaFile", false ) )
+ {
+ aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape(mXShape);
+ if ( pObj )
+ {
+ ::tools::Rectangle aBound = pObj->GetCurrentBoundRect();
+ maPosition = MapPoint( css::awt::Point( aBound.Left(), aBound.Top() ) );
+ maSize = MapSize( css::awt::Size ( aBound.GetWidth(), aBound.GetHeight() ) );
+ maRect = ::tools::Rectangle( Point( maPosition.X, maPosition.Y ), Size( maSize.Width, maSize.Height ) );
+ mnAngle = 0;
+ }
+ }
+ }
+ else
+ {
+ ImplCreateShape( eShapeType,
+ nMirrorFlags | ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+ aPropOpt.CreateCustomShapeProperties( eShapeType, mXShape );
+ aPropOpt.CreateFillProperties( mXPropSet, true, mXShape);
+ if ( ImplGetText() )
+ {
+ if ( !aPropOpt.IsFontWork() )
+ {
+ mnTxId += 0x60;
+ aPropOpt.CreateTextProperties( mXPropSet, mnTxId, true );
+ }
+ }
+ }
+ }
+ else if ( mType == "drawing.Rectangle" )
+ {
+ sal_Int32 nRadius = 0;
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ if ( ImplGetPropertyValue( "CornerRadius" ) )
+ {
+ mAny >>= nRadius;
+ nRadius = MapSize( css::awt::Size( nRadius, 0 ) ).Width;
+ }
+ if ( nRadius )
+ {
+ ImplCreateShape( ESCHER_ShpInst_RoundRectangle,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+ sal_Int32 nLength = maRect.GetWidth();
+ if ( nLength > maRect.GetHeight() )
+ nLength = maRect.GetHeight();
+ nLength >>= 1;
+ if ( nRadius >= nLength )
+ nRadius = 0x2a30; // 0x2a30 is PPTs maximum radius
+ else
+ {
+ if (nLength != 0)
+ nRadius = ( 0x2a30 * nRadius ) / nLength;
+ else
+ nRadius = 0x2a30; // 0x2a30 is PPTs maximum radius
+ }
+ aPropOpt.AddOpt( ESCHER_Prop_adjustValue, nRadius );
+ }
+ else
+ {
+ ImplCreateShape( ESCHER_ShpInst_Rectangle,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+ }
+ aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
+ if ( ImplGetText() )
+ {
+ mnTxId += 0x60;
+ aPropOpt.CreateTextProperties( mXPropSet, mnTxId, false, false );
+ }
+ }
+ else if ( mType == "drawing.Ellipse" )
+ {
+ css::drawing::CircleKind eCircleKind( css::drawing::CircleKind_FULL );
+ PolyStyle ePolyKind = PolyStyle::Chord;
+ if ( ImplGetPropertyValue( "CircleKind" ) )
+ {
+ mAny >>= eCircleKind;
+ switch ( eCircleKind )
+ {
+ case css::drawing::CircleKind_SECTION :
+ {
+ ePolyKind = PolyStyle::Pie;
+ }
+ break;
+ case css::drawing::CircleKind_ARC :
+ {
+ ePolyKind = PolyStyle::Arc;
+ }
+ break;
+
+ case css::drawing::CircleKind_CUT :
+ {
+ ePolyKind = PolyStyle::Chord;
+ }
+ break;
+
+ default:
+ eCircleKind = css::drawing::CircleKind_FULL;
+ }
+ }
+ if ( eCircleKind == css::drawing::CircleKind_FULL )
+ {
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ImplCreateShape( ESCHER_ShpInst_Ellipse,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+ aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
+ if ( ImplGetText() )
+ {
+ mnTxId += 0x60;
+ aPropOpt.CreateTextProperties( mXPropSet, mnTxId, false, false );
+ }
+ }
+ else
+ {
+ sal_Int32 nStartAngle, nEndAngle;
+ if ( !ImplGetPropertyValue( "CircleStartAngle" ) )
+ continue;
+ nStartAngle = *o3tl::doAccess<sal_Int32>(mAny);
+ if( !ImplGetPropertyValue( "CircleEndAngle" ) )
+ continue;
+ nEndAngle = *o3tl::doAccess<sal_Int32>(mAny);
+ css::awt::Point aPoint( mXShape->getPosition() );
+ css::awt::Size aSize( mXShape->getSize() );
+ css::awt::Point aStart, aEnd, aCenter;
+ ::tools::Rectangle aRect( Point( aPoint.X, aPoint.Y ), Size( aSize.Width, aSize.Height ) );
+ aStart.X = static_cast<sal_Int32>( cos( basegfx::deg2rad<100>(nStartAngle) ) * 100.0 );
+ aStart.Y = - static_cast<sal_Int32>( sin( basegfx::deg2rad<100>(nStartAngle) ) * 100.0 );
+ aEnd.X = static_cast<sal_Int32>( cos( basegfx::deg2rad<100>(nEndAngle) ) * 100.0 );
+ aEnd.Y = - static_cast<sal_Int32>( sin( basegfx::deg2rad<100>(nEndAngle) ) * 100.0 );
+ aCenter.X = aPoint.X + ( aSize.Width / 2 );
+ aCenter.Y = aPoint.Y + ( aSize.Height / 2 );
+ aStart.X += aCenter.X;
+ aStart.Y += aCenter.Y;
+ aEnd.X += aCenter.X;
+ aEnd.Y += aCenter.Y;
+ tools::Polygon aPolygon( aRect, Point( aStart.X, aStart.Y ), Point( aEnd.X, aEnd.Y ), ePolyKind );
+ bool bNeedText = true;
+ if ( mnAngle )
+ {
+ aPolygon.Rotate( aRect.TopLeft(), Degree10(static_cast<sal_Int16>( mnAngle / 10 )) );
+ if ( ImplGetText() )
+ {
+ // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
+ // mpPptEscherEx->EnterGroup( 0,0 );
+ // nGroupLevel = mpPptEscherEx->GetGroupLevel();
+ bNeedText = false;
+ bAdditionalText = true;
+ mnTextSize = 0;
+ }
+ mnAngle = 0;
+ }
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ImplCreateShape( ESCHER_ShpInst_NotPrimitive,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+ css::awt::Rectangle aNewRect;
+ switch ( ePolyKind )
+ {
+ case PolyStyle::Pie :
+ case PolyStyle::Chord :
+ {
+ if ( aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, false, aNewRect, &aPolygon ) )
+ aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
+ }
+ break;
+
+ case PolyStyle::Arc :
+ {
+ if ( aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, false, aNewRect, &aPolygon ) )
+ aPropOpt.CreateLineProperties( mXPropSet, false );
+ }
+ break;
+ }
+ maRect = MapRectangle( aNewRect );
+ maPosition = css::awt::Point( maRect.Left(), maRect.Top() );
+ maSize = css::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
+ if ( bNeedText && ImplGetText() )
+ {
+ mnTxId += 0x60;
+ aPropOpt.CreateTextProperties( mXPropSet, mnTxId, false, false );
+ }
+ }
+ }
+ else if ( mType == "drawing.Control" )
+ {
+ css::uno::Reference< css::drawing::XControlShape > aXControlShape( mXShape, css::uno::UNO_QUERY );
+ if ( !aXControlShape.is() )
+ continue;
+ css::uno::Reference< css::awt::XControlModel > aXControlModel( aXControlShape->getControl() );
+ if ( !aXControlModel.is() )
+ continue;
+
+ sal_Int64 nAspect = css::embed::Aspects::MSOLE_CONTENT;
+ try
+ {
+ // try to get the aspect when available
+ css::uno::Reference< css::beans::XPropertySet > xShapeProps( mXShape, css::uno::UNO_QUERY_THROW );
+ xShapeProps->getPropertyValue("Aspect") >>= nAspect;
+ }
+ catch( css::uno::Exception& )
+ {}
+
+ mpExEmbed->WriteUInt32( 0xf | ( EPP_ExControl << 16 ) )
+ .WriteUInt32( 0 ); // Size of this container
+
+ sal_uInt32 nSize, nOldPos = mpExEmbed->Tell();
+
+ sal_uInt32 nPageId = nPageNumber;
+ if ( ePageType == MASTER )
+ nPageId |= 0x80000000;
+ else
+ nPageId += 0x100;
+ mpExEmbed->WriteUInt32( EPP_ExControlAtom << 16 )
+ .WriteUInt32( 4 )
+ .WriteUInt32( nPageId );
+ std::unique_ptr<PPTExOleObjEntry> pEntry( new PPTExOleObjEntry( OCX_CONTROL, mpExEmbed->Tell() ) );
+ pEntry->xControlModel = aXControlModel;
+ pEntry->xShape = mXShape;
+ maExOleObj.push_back( std::move(pEntry) );
+
+ mnExEmbed++;
+
+ mpExEmbed->WriteUInt32( 1 | ( EPP_ExOleObjAtom << 16 ) )
+ .WriteUInt32( 24 )
+ .WriteUInt32( nAspect )
+ .WriteUInt32( 2 )
+ .WriteUInt32( mnExEmbed )
+ .WriteUInt32( 0 )
+ .WriteUInt32( 4 ) // index to the persist table
+ .WriteUInt32( 0x0012de00 );
+
+ css::awt::Size aSize;
+ OUString aControlName;
+ tools::SvRef<SotStorage> xTemp( new SotStorage( new SvMemoryStream(), true ) );
+ if ( oox::ole::MSConvertOCXControls::WriteOCXStream( mXModel, xTemp, aXControlModel, aSize, aControlName ) )
+ {
+ OUString aUserName( xTemp->GetUserName() );
+ OUString aOleIdentifier;
+ if ( !aUserName.isEmpty() )
+ {
+ tools::SvRef<SotStorageStream> xCompObj = xTemp->OpenSotStream(
+ "\1CompObj",
+ StreamMode::READ | StreamMode::NOCREATE | StreamMode::SHARE_DENYALL );
+ sal_uInt32 const nStreamLen = xCompObj->remainingSize();
+ sal_Int16 nVersion, nByteOrder;
+ sal_Int32 nWinVersion, nVal, nStringLen;
+ xCompObj->ReadInt16( nVersion )
+ .ReadInt16( nByteOrder )
+ .ReadInt32( nWinVersion )
+ .ReadInt32( nVal );
+ xCompObj->SeekRel( 16 ); // skipping clsid
+ xCompObj->ReadInt32( nStringLen );
+ if ( ( xCompObj->Tell() + nStringLen ) < nStreamLen )
+ {
+ xCompObj->SeekRel( nStringLen ); // now skipping the UserName;
+ xCompObj->ReadInt32( nStringLen );
+ if ( ( xCompObj->Tell() + nStringLen ) < nStreamLen )
+ {
+ xCompObj->SeekRel( nStringLen ); // now skipping the clipboard formatname
+ xCompObj->ReadInt32( nStringLen );
+ if ( ( nStringLen > 1 ) && ( ( xCompObj->Tell() + nStringLen ) < nStreamLen ) )
+ { // i think that the OleIdentifier will follow
+ OString aTemp = read_uInt8s_ToOString(*xCompObj, nStringLen - 1);
+ aOleIdentifier = OStringToOUString(aTemp, RTL_TEXTENCODING_MS_1252);
+ }
+ }
+ }
+ }
+
+ PPTWriter::WriteCString( *mpExEmbed, aControlName, 1 );
+ PPTWriter::WriteCString( *mpExEmbed, aOleIdentifier, 2 );
+ PPTWriter::WriteCString( *mpExEmbed, aUserName, 3 );
+ }
+ nSize = mpExEmbed->Tell() - nOldPos;
+ mpExEmbed->Seek( nOldPos - 4 );
+ mpExEmbed->WriteUInt32( nSize );
+ mpExEmbed->Seek( STREAM_SEEK_TO_END );
+ nOlePictureId = mnExEmbed;
+
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ShapeFlag const nSpFlags = ShapeFlag::HaveShapeProperty | ShapeFlag::HaveAnchor | ShapeFlag::OLEShape;
+ ImplCreateShape( ESCHER_ShpInst_HostControl, nSpFlags, aSolverContainer );
+ if ( aPropOpt.CreateGraphicProperties( mXPropSet, "MetaFile", false ) )
+ aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
+ //export form control graphic
+ else if ( aPropOpt.CreateBlipPropertiesforOLEControl(mXPropSet,mXShape))
+ aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
+ aPropOpt.AddOpt( ESCHER_Prop_pictureId, mnExEmbed );
+ aPropOpt.AddOpt( ESCHER_Prop_pictureActive, 0x10000 );
+
+ if ( !aControlName.isEmpty() )
+ {
+ aPropOpt.AddOpt(ESCHER_Prop_wzName, aControlName);
+ }
+ }
+ else if ( mType == "drawing.Connector" )
+ {
+ sal_uInt16 nSpType;
+ ShapeFlag nSpFlags;
+ css::awt::Rectangle aNewRect;
+ if ( !aPropOpt.CreateConnectorProperties( mXShape, aSolverContainer, aNewRect, nSpType, nSpFlags ) )
+ continue;
+
+ maRect = MapRectangle( aNewRect );
+ maPosition = css::awt::Point( maRect.Left(), maRect.Top() );
+ maSize = css::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
+
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ImplCreateShape( nSpType, nSpFlags, aSolverContainer );
+
+ // #119459# for connector shape, the start point and end point is fixed, and should not be rotated.
+ mnAngle = 0;
+ }
+ else if ( mType == "drawing.Measure" )
+ {
+ continue;
+ }
+ else if ( mType == "drawing.Line" )
+ {
+ css::awt::Rectangle aNewRect;
+ aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_LINE, false, aNewRect );
+ maRect = MapRectangle( aNewRect );
+ maPosition = css::awt::Point( maRect.Left(), maRect.Top() );
+ maSize = css::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
+ if ( ImplGetText() )
+ {
+ aTextRefPoint = css::awt::Point( maRect.Left(), maRect.Top() );
+ mnTextSize = 0;
+ bAdditionalText = true;
+ // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
+ // mpPptEscherEx->EnterGroup( &maRect,0 );
+ }
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ShapeFlag nFlags = ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty;
+
+ if ( maRect.Top() > maRect.Bottom() )
+ nFlags |= ShapeFlag::FlipV;
+ if ( maRect.Left() > maRect.Right() )
+ nFlags |= ShapeFlag::FlipH;
+
+ ImplCreateShape( ESCHER_ShpInst_Line, nFlags, aSolverContainer );
+ aPropOpt.AddOpt( ESCHER_Prop_shapePath, ESCHER_ShapeComplex );
+ aPropOpt.CreateLineProperties( mXPropSet, false );
+ mnAngle = 0;
+ }
+ else if ( bPolyPolygon )
+ {
+ if ( ImplGetText() )
+ {
+ // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
+ // mpPptEscherEx->EnterGroup( 0,0 );
+ // nGroupLevel = mpPptEscherEx->GetGroupLevel();
+ bAdditionalText = true;
+ mnTextSize = 0;
+ }
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ImplCreateShape( ESCHER_ShpInst_NotPrimitive,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+ css::awt::Rectangle aNewRect;
+ aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, false, aNewRect );
+ maRect = MapRectangle( aNewRect );
+ maPosition = css::awt::Point( maRect.Left(), maRect.Top() );
+ maSize = css::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
+ aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
+ mnAngle = 0;
+ }
+ else if ( bPolyLine )
+ {
+ if ( ImplGetText() )
+ {
+ // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
+ // mpPptEscherEx->EnterGroup( 0,0 );
+ // nGroupLevel = mpPptEscherEx->GetGroupLevel();
+ bAdditionalText = true;
+ mnTextSize = 0;
+ }
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ImplCreateShape( ESCHER_ShpInst_NotPrimitive,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+ css::awt::Rectangle aNewRect;
+ aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, false, aNewRect );
+ maRect = MapRectangle( aNewRect );
+ maPosition = css::awt::Point( maRect.Left(), maRect.Top() );
+ maSize = css::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
+ aPropOpt.CreateLineProperties( mXPropSet, false );
+ mnAngle = 0;
+ }
+ else if ( bOpenBezier )
+ {
+ if ( ImplGetText() )
+ {
+ // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
+ // mpPptEscherEx->EnterGroup( 0,0 );
+ // nGroupLevel = mpPptEscherEx->GetGroupLevel();
+ bAdditionalText = true;
+ mnTextSize = 0;
+ }
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ImplCreateShape( ESCHER_ShpInst_NotPrimitive,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+ css::awt::Rectangle aNewRect;
+ aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, true, aNewRect );
+ maRect = MapRectangle( aNewRect );
+ maPosition = css::awt::Point( maRect.Left(), maRect.Top() );
+ maSize = css::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
+ aPropOpt.CreateLineProperties( mXPropSet, false );
+ mnAngle = 0;
+ }
+ else if ( bClosedBezier )
+ {
+ if ( ImplGetText() )
+ {
+ // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
+ // mpPptEscherEx->EnterGroup( 0,0 );
+ // nGroupLevel = mpPptEscherEx->GetGroupLevel();
+ bAdditionalText = true;
+ mnTextSize = 0;
+ }
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ImplCreateShape( ESCHER_ShpInst_NotPrimitive,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+ css::awt::Rectangle aNewRect;
+ aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, true, aNewRect );
+ maRect = MapRectangle( aNewRect );
+ maPosition = css::awt::Point( maRect.Left(), maRect.Top() );
+ maSize = css::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
+ aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
+ mnAngle = 0;
+ }
+ else if ( ( mType == "drawing.GraphicObject" ) || ( mType == "presentation.GraphicObject" ) )
+ {
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+
+ // a GraphicObject can also be a ClickMe element
+ if ( mbEmptyPresObj && ( ePageType == NORMAL ) )
+ {
+ nPlaceHolderAtom = rLayout.nUsedObjectPlaceHolder;
+ ImplCreateShape( ESCHER_ShpInst_Rectangle, ShapeFlag::HaveAnchor | ShapeFlag::HaveMaster, aSolverContainer );
+ mnTxId += 0x60;
+ aPropOpt.AddOpt( ESCHER_Prop_lTxid, mnTxId );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x10001 );
+ aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody );
+ }
+ else
+ {
+ mXText.set( mXShape, css::uno::UNO_QUERY );
+
+ if ( mXText.is() )
+ mnTextSize = mXText->getString().getLength();
+
+ if ( mnTextSize ) // graphic object or area fill
+ {
+ /* SJ #i34951#: because M. documents are not allowing GraphicObjects containing text, we
+ have to create a simple Rectangle with fill bitmap instead (while not allowing BitmapMode_Repeat).
+ */
+ ImplCreateShape( ESCHER_ShpInst_Rectangle,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+ if ( aPropOpt.CreateGraphicProperties( mXPropSet, "Graphic", true, true, false ) )
+ {
+ aPropOpt.AddOpt( ESCHER_Prop_WrapText, ESCHER_WrapNone );
+ aPropOpt.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x140014 );
+ aPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0x8000000 );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
+ if ( ImplGetText() )
+ {
+ mnTxId += 0x60;
+ aPropOpt.CreateTextProperties( mXPropSet, mnTxId, false, false );
+ }
+ }
+ }
+ else
+ {
+ ImplCreateShape( ESCHER_ShpInst_PictureFrame,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+
+ if (aPropOpt.CreateGraphicProperties(mXPropSet, aGraphicPropertyName, false,
+ true))
+ {
+ aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
+ }
+ }
+ }
+ }
+ else if ( ( mType == "drawing.Text" ) || ( mType == "presentation.Notes" ) )
+ {
+ if ( ( ePageType == NOTICE ) && mbPresObj )
+ {
+ if ( ImplCreatePresentationPlaceholder( bMasterPage, EPP_TEXTTYPE_Notes, EPP_PLACEHOLDER_MASTERNOTESBODYIMAGE ) )
+ continue;
+ else
+ nPlaceHolderAtom = EPP_PLACEHOLDER_NOTESBODY;
+ }
+ ImplCreateTextShape( aPropOpt, aSolverContainer, true );
+ }
+ else if ( mType == "presentation.TitleText" )
+ {
+ if ( mbPresObj )
+ {
+ if ( ( ePageType == NOTICE ) && mbEmptyPresObj )
+ {
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ nPlaceHolderAtom = EPP_PLACEHOLDER_MASTERNOTESBODYIMAGE;
+ ImplCreateShape( ESCHER_ShpInst_Rectangle, ShapeFlag::HaveAnchor, aSolverContainer );
+ aPropOpt.CreateLineProperties( mXPropSet, false );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 );
+ }
+ else if ( rLayout.bTitlePossible && bIsTitlePossible )
+ {
+ bIsTitlePossible = false;
+
+ ImplGetText();
+ TextObjBinary aTextObj( mXText, EPP_TEXTTYPE_Title, maFontCollection, static_cast<PPTExBulletProvider&>(*this) );
+ if ( ePageType == MASTER )
+ {
+ if ( mnTextSize )
+ {
+ OUString aUString( mXText->getString() );
+ sal_uInt16 nChar;
+
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ mnShapeMasterTitle = mpPptEscherEx->GenerateShapeId();
+ mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ mnShapeMasterTitle );
+ EscherPropertyContainer aPropertyOptions;
+ aPropertyOptions.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x50001 );
+ mnTxId += 0x60;
+ aPropertyOptions.AddOpt( ESCHER_Prop_lTxid, mnTxId );
+ aPropertyOptions.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
+ aPropertyOptions.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x110001 );
+ aPropertyOptions.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
+ aPropertyOptions.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
+ aPropertyOptions.CreateFillProperties( mXPropSet, true, mXShape );
+ sal_uInt32 nLineFlags = 0x90001;
+ if ( aPropertyOptions.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ) )
+ nLineFlags |= 0x10001; // draw dashed line if no line
+ aPropertyOptions.AddOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags );
+ mnTxId += 0x60;
+ aPropertyOptions.CreateTextProperties( mXPropSet, mnTxId );
+ ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt );
+ aPropertyOptions.Commit( *mpStrm );
+ mpPptEscherEx->AddAtom( 8, ESCHER_ClientAnchor );
+ mpStrm->WriteInt16( maRect.Top() ).WriteInt16( maRect.Left() ).WriteInt16( maRect.Right() ).WriteInt16( maRect.Bottom() ); // top, left, right, bottom ????
+ mpPptEscherEx->OpenContainer( ESCHER_ClientData );
+ mpPptEscherEx->AddAtom( 8, EPP_OEPlaceholderAtom );
+ mpStrm->WriteUInt32( 0 ) // PlacementID
+ .WriteUChar( EPP_PLACEHOLDER_MASTERTITLE ) // PlaceHolderID
+ .WriteUChar( 0 ) // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
+ .WriteUInt16( 0 ); // padword
+ mpPptEscherEx->CloseContainer(); // ESCHER_ClientData
+ mpPptEscherEx->OpenContainer( ESCHER_ClientTextbox );
+ mpPptEscherEx->AddAtom( 4, EPP_TextHeaderAtom );
+ mpStrm->WriteUInt32( EPP_TEXTTYPE_Title );
+ mpPptEscherEx->AddAtom( mnTextSize << 1, EPP_TextCharsAtom );
+ const sal_Unicode* pString = aUString.getStr();
+ for ( sal_uInt32 i = 0; i < mnTextSize; i++ )
+ {
+ nChar = pString[ i ]; // 0xa -> 0xb soft newline
+ if ( nChar == 0xa )
+ nChar++; // 0xd -> 0xd hard newline
+ mpStrm->WriteUInt16( nChar );
+ }
+ mpPptEscherEx->AddAtom( 6, EPP_BaseTextPropAtom );
+ mpStrm->WriteUInt32( mnTextSize + 1 ).WriteUInt16( 0 );
+ mpPptEscherEx->AddAtom( 10, EPP_TextSpecInfoAtom );
+ mpStrm->WriteUInt32( mnTextSize + 1 ).WriteUInt32( 1 ).WriteUInt16( 0 );
+ mpPptEscherEx->CloseContainer(); // ESCHER_ClientTextBox
+ mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
+ }
+ continue;
+ }
+ else
+ {
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ mnTextStyle = EPP_TEXTSTYLE_TITLE;
+ nPlaceHolderAtom = rLayout.nTypeOfTitle;
+ ImplCreateShape( ESCHER_ShpInst_Rectangle,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveMaster,
+ aSolverContainer );
+ aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterTitle );
+ aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
+ mnTxId += 0x60;
+ aPropOpt.CreateTextProperties( mXPropSet, mnTxId );
+ ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt );
+ if ( mbEmptyPresObj )
+ {
+ sal_uInt32 nNoLineDrawDash = 0;
+ aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
+ nNoLineDrawDash |= 0x10001;
+ aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
+ }
+ }
+ }
+ else
+ mbPresObj = false;
+ }
+ if ( !mbPresObj )
+ {
+ mType = "drawing.Text";
+ ImplCreateTextShape( aPropOpt, aSolverContainer, true );
+ }
+ }
+ else if ( ( mType == "presentation.Outliner" ) || ( mType == "presentation.Subtitle" ) )
+ {
+ if ( mbPresObj )
+ {
+ nOutlinerCount++;
+ if ( (rLayout.bOutlinerPossible && ( nOutlinerCount == 1 )) ||
+ (( rLayout.bSecOutlinerPossible && ( nOutlinerCount == 2 ) ) && ( nPrevTextStyle == EPP_TEXTSTYLE_BODY ))
+ )
+ {
+ ImplGetText();
+ TextObjBinary aTextObj( mXText, EPP_TEXTTYPE_Body, maFontCollection, static_cast<PPTExBulletProvider&>(*this) );
+ if ( ePageType == MASTER )
+ {
+ nPrevTextStyle = EPP_TEXTSTYLE_TITLE;
+ if ( mnTextSize )
+ {
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ mnShapeMasterBody = mpPptEscherEx->GenerateShapeId();
+ mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ mnShapeMasterBody );
+ EscherPropertyContainer aPropOpt2;
+ aPropOpt2.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x50001 );
+ mnTxId += 0x60;
+ aPropOpt2.AddOpt( ESCHER_Prop_lTxid, mnTxId );
+ aPropOpt2.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x110001 );
+ aPropOpt2.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
+ aPropOpt2.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90001 );
+ aPropOpt2.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
+ aPropOpt2.CreateFillProperties( mXPropSet, true, mXShape );
+ sal_uInt32 nLineFlags = 0x90001;
+ if ( aPropOpt2.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ) )
+ nLineFlags |= 0x10001; // draw dashed line if no line
+ aPropOpt2.AddOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags );
+ mnTxId += 0x60;
+ aPropOpt2.CreateTextProperties( mXPropSet, mnTxId );
+ ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt2 );
+ aPropOpt2.Commit( *mpStrm );
+ mpPptEscherEx->AddAtom( 8, ESCHER_ClientAnchor );
+ mpStrm->WriteInt16( maRect.Top() ).WriteInt16( maRect.Left() ).WriteInt16( maRect.Right() ).WriteInt16( maRect.Bottom() ); // top, left, right, bottom ????
+ mpPptEscherEx->OpenContainer( ESCHER_ClientData );
+ mpPptEscherEx->AddAtom( 8, EPP_OEPlaceholderAtom );
+ sal_uInt8 PlaceHolderID = ( mType == "presentation.Subtitle") ? EPP_PLACEHOLDER_MASTERSUBTITLE:EPP_PLACEHOLDER_MASTERBODY;
+ mpStrm->WriteUInt32( 1 ) // PlacementID
+ .WriteUChar( PlaceHolderID )/*(sal_uInt8)EPP_PLACEHOLDER_MASTERBODY */ // PlaceHolderID
+ .WriteUChar( 0 ) // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
+ .WriteUInt16( 0 ); // padword
+ mpPptEscherEx->CloseContainer(); // ESCHER_ClientData
+ mpPptEscherEx->OpenContainer( ESCHER_ClientTextbox ); // printf
+ mpPptEscherEx->AddAtom( 4, EPP_TextHeaderAtom );
+ if ( mType == "presentation.Subtitle")
+ mpStrm->WriteUInt32( EPP_TEXTTYPE_CenterBody );
+ else
+ mpStrm->WriteUInt32( EPP_TEXTTYPE_Body );
+ mnTextSize = aTextObj.Count();
+ aTextObj.Write( mpStrm.get() );
+ mpPptEscherEx->BeginAtom();
+ for ( sal_uInt32 i = 0; i < aTextObj.ParagraphCount() ; ++i )
+ {
+ ParagraphObj* pPara = aTextObj.GetParagraph(i);
+ mpStrm->WriteUInt32( pPara->CharacterCount() )
+ .WriteUInt16( pPara->nDepth );
+ }
+ mpPptEscherEx->EndAtom( EPP_BaseTextPropAtom );
+ mpPptEscherEx->AddAtom( 10, EPP_TextSpecInfoAtom );
+ mpStrm->WriteUInt32( mnTextSize ).WriteUInt32( 1 ).WriteUInt16( 0 );
+
+ mpPptEscherEx->CloseContainer(); // ESCHER_ClientTextBox
+ mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
+ }
+ continue;
+ }
+ else
+ {
+ mnTextStyle = EPP_TEXTSTYLE_BODY;
+ nPlaceHolderAtom = rLayout.nTypeOfOutliner;
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ImplCreateShape( ESCHER_ShpInst_Rectangle,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveMaster,
+ aSolverContainer );
+ aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody );
+ aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
+ mnTxId += 0x60;
+ aPropOpt.CreateTextProperties( mXPropSet, mnTxId );
+ ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt );
+ if ( mbEmptyPresObj )
+ {
+ sal_uInt32 nNoLineDrawDash = 0;
+ aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
+ nNoLineDrawDash |= 0x10001;
+ aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
+ }
+ }
+ }
+ else
+ mbPresObj = false;
+ }
+ if ( !mbPresObj )
+ {
+ if (ePageType == MASTER )
+ {
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape(mXShape);
+ if (pObj && pObj->IsNotVisibleAsMaster())
+ continue;
+ }
+
+ mType = "drawing.Text";
+ ImplCreateTextShape( aPropOpt, aSolverContainer, true );
+ }
+ }
+ else if ( ( mType == "drawing.Page" ) || ( mType == "presentation.Page" ) )
+ {
+ if ( ( ePageType == NOTICE ) && mbPresObj )
+ {
+ if ( ImplCreatePresentationPlaceholder( bMasterPage, EPP_TEXTTYPE_Notes, EPP_PLACEHOLDER_MASTERNOTESSLIDEIMAGE ) )
+ continue;
+ else
+ nPlaceHolderAtom = EPP_PLACEHOLDER_NOTESSLIDEIMAGE;
+ }
+ ImplCreateTextShape( aPropOpt, aSolverContainer, true );
+ }
+ else if ( mType == "drawing.Frame" )
+ {
+ continue;
+ }
+ else if ( ( mType == "drawing.OLE2" ) || ( mType == "presentation.OLE2" )
+ || ( mType == "presentation.Chart" ) || ( mType == "presentation.Calc" )
+ || ( mType == "presentation.OrgChart" ) )
+ {
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ if ( mbEmptyPresObj && ( ePageType == NORMAL ) )
+ {
+ nPlaceHolderAtom = rLayout.nUsedObjectPlaceHolder;
+ ImplCreateShape( ESCHER_ShpInst_Rectangle,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveMaster,
+ aSolverContainer );
+ mnTxId += 0x60;
+ aPropOpt.AddOpt( ESCHER_Prop_lTxid, mnTxId );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x10001 );
+ aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody );
+ }
+ else
+ {
+ mpExEmbed->WriteUInt32( 0xf | ( EPP_ExEmbed << 16 ) )
+ .WriteUInt32( 0 ); // Size of this container
+
+ sal_uInt32 nSize, nOldPos = mpExEmbed->Tell();
+
+ mpExEmbed->WriteUInt32( EPP_ExEmbedAtom << 16 )
+ .WriteUInt32( 8 )
+ .WriteUInt32( 0 ) // follow colorscheme : 0->do not follow
+ // 1->follow colorscheme
+ // 2->follow text and background scheme
+ .WriteUChar( 1 ) // (bool)set if embedded server can not be locked
+ .WriteUChar( 0 ) // (bool)do not need to send dimension
+ .WriteUChar( 0 ) // (bool)is object a world table
+ .WriteUChar( 0 ); // pad byte
+
+ std::unique_ptr<PPTExOleObjEntry> pE( new PPTExOleObjEntry( NORMAL_OLE_OBJECT, mpExEmbed->Tell() ) );
+ pE->xShape = mXShape;
+ maExOleObj.push_back( std::move(pE) );
+
+ mnExEmbed++;
+
+ sal_Int64 nAspect = css::embed::Aspects::MSOLE_CONTENT;
+ try
+ {
+ // try to get the aspect when available
+ css::uno::Reference< css::beans::XPropertySet > xShapeProps( mXShape, css::uno::UNO_QUERY_THROW );
+ xShapeProps->getPropertyValue("Aspect") >>= nAspect;
+ }
+ catch( css::uno::Exception& )
+ {}
+
+ mpExEmbed->WriteUInt32( 1 | ( EPP_ExOleObjAtom << 16 ) )
+ .WriteUInt32( 24 )
+ .WriteUInt32( nAspect ) // Aspect
+ .WriteUInt32( 0 )
+ .WriteUInt32( mnExEmbed ) // index to the persist table
+ .WriteUInt32( 0 ) // subtype
+ .WriteUInt32( 0 )
+ .WriteUInt32( 0x0012b600 );
+
+ nSize = mpExEmbed->Tell() - nOldPos;
+ mpExEmbed->Seek( nOldPos - 4 );
+ mpExEmbed->WriteUInt32( nSize );
+ mpExEmbed->Seek( STREAM_SEEK_TO_END );
+ nOlePictureId = mnExEmbed;
+
+ ShapeFlag nSpFlags = ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty;
+ if ( nOlePictureId )
+ nSpFlags |= ShapeFlag::OLEShape;
+ ImplCreateShape( ESCHER_ShpInst_PictureFrame, nSpFlags, aSolverContainer );
+ if ( aPropOpt.CreateOLEGraphicProperties( mXShape ) )
+ aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
+ if ( nOlePictureId )
+ aPropOpt.AddOpt( ESCHER_Prop_pictureId, nOlePictureId );
+ }
+ }
+ else if ( mType == "presentation.Header" )
+ {
+ if ( ImplCreatePresentationPlaceholder( bMasterPage, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERHEADER ) )
+ continue;
+ else
+ {
+ mbPresObj = false;
+ mType = "drawing.Text";
+ ImplCreateTextShape( aPropOpt, aSolverContainer, true );
+ }
+ }
+ else if ( mType == "presentation.Footer" )
+ {
+ if ( ImplCreatePresentationPlaceholder( bMasterPage, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERFOOTER ) )
+ continue;
+ else
+ {
+ mbPresObj = false;
+ mType = "drawing.Text";
+ ImplCreateTextShape( aPropOpt, aSolverContainer, true );
+ }
+ }
+ else if ( mType == "presentation.DateTime" )
+ {
+ if ( ImplCreatePresentationPlaceholder( bMasterPage, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERDATE ) )
+ continue;
+ else
+ {
+ mbPresObj = false;
+ mType = "drawing.Text";
+ ImplCreateTextShape( aPropOpt, aSolverContainer, true );
+ }
+ }
+ else if ( mType == "presentation.SlideNumber" )
+ {
+ if ( ImplCreatePresentationPlaceholder( bMasterPage, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERSLIDENUMBER ) )
+ continue;
+ else
+ {
+ mbPresObj = false;
+ mType = "drawing.Text";
+ ImplCreateTextShape( aPropOpt, aSolverContainer, true );
+ }
+ }
+ else if ( (mType.getLength() > 9) && (mType[8] == '3') && (mType[9] == 'D') ) // drawing.3D
+ {
+ // SceneObject, CubeObject, SphereObject, LatheObject, ExtrudeObject, PolygonObject
+ if ( !ImplGetPropertyValue( "Bitmap" ) )
+ continue;
+
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ImplCreateShape( ESCHER_ShpInst_PictureFrame,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+
+ if ( aPropOpt.CreateGraphicProperties( mXPropSet, "Bitmap", false ) )
+ aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
+ }
+ else if ( mType == "drawing.Media" )
+ {
+ mnAngle = 0;
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ImplCreateShape( ESCHER_ShpInst_PictureFrame,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+ if ( aPropOpt.CreateMediaGraphicProperties( mXShape ) )
+ aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
+ css::uno::Any aAny;
+ if ( PropValue::GetPropertyValue( aAny, mXPropSet, "MediaURL", true ) )
+ {
+ OUString aMediaURL;
+ if ( (aAny >>= aMediaURL ) && !aMediaURL.isEmpty() )
+ {
+ // SJ: creating the Media RefObj
+ sal_uInt32 nRefId = ++mnExEmbed;
+
+ mpExEmbed->WriteUInt16( 0xf )
+ .WriteUInt16( EPP_ExMCIMovie ) // PPT_PST_ExAviMovie
+ .WriteUInt32( 0 );
+ sal_uInt32 nSize, nStart = mpExEmbed->Tell();
+ mpExEmbed->WriteUInt16( 0 )
+ .WriteUInt16( EPP_ExObjRefAtom )
+ .WriteUInt32( 4 )
+ .WriteUInt32( nRefId );
+ mpExEmbed->WriteUInt16( 0xf )
+ .WriteUInt16( EPP_ExVideo )
+ .WriteUInt32( 0 );
+
+ mpExEmbed->WriteUInt16( 0 )
+ .WriteUInt16( EPP_ExMediaAtom )
+ .WriteUInt32( 8 )
+ .WriteUInt32( nRefId )
+ .WriteUInt16( 0 )
+ .WriteUInt16( 0x435 );
+
+ sal_uInt16 i, nStringLen = static_cast<sal_uInt16>(aMediaURL.getLength());
+ mpExEmbed->WriteUInt32( EPP_CString << 16 ).WriteUInt32( nStringLen * 2 );
+ for ( i = 0; i < nStringLen; i++ )
+ {
+ sal_Unicode nChar = aMediaURL[ i ];
+ mpExEmbed->WriteUInt16( nChar );
+ }
+ nSize = mpExEmbed->Tell() - nStart;
+ mpExEmbed->SeekRel( - ( static_cast<sal_Int32>(nSize) + 4 ) );
+ mpExEmbed->WriteUInt32( nSize ); // size of PPT_PST_ExMCIMovie
+ mpExEmbed->SeekRel( 0x10 );
+ nSize -= 20;
+ mpExEmbed->WriteUInt32( nSize ); // PPT_PST_ExMediaAtom
+ mpExEmbed->SeekRel( nSize );
+
+ if ( !pClientData )
+ pClientData.reset(new SvMemoryStream( 0x200, 0x200 ));
+ pClientData->WriteUInt16( 0 )
+ .WriteUInt16( EPP_ExObjRefAtom )
+ .WriteUInt32( 4 )
+ .WriteUInt32( nRefId );
+ // write EPP_InteractiveInfo container for no_action
+ pClientData->WriteUInt32( ( EPP_InteractiveInfo << 16 ) | 0xf ).WriteUInt32( 24 );
+ pClientData->WriteUInt16( 0 )
+ .WriteUInt16( EPP_InteractiveInfoAtom )
+ .WriteUInt32( 16 )
+ .WriteUInt32( 0 )
+ .WriteUInt32( 0 )
+ .WriteUChar( 6 )
+ .WriteUChar( 0 )
+ .WriteUChar( 0 )
+ .WriteUChar( 0 )
+ .WriteUInt32( 0 );
+ }
+ }
+ }
+ else if ( (mType == "drawing.Table") || (mType == "presentation.Table") )
+ {
+ if ( eCa != css::presentation::ClickAction_NONE )
+ {
+ SvMemoryStream aTmp(0x200, 0x200);
+ ImplWriteClickAction( aTmp, eCa, bMediaClickAction );
+ }
+ ImplCreateTable( mXShape, aSolverContainer, aPropOpt );
+ continue;
+ }
+ else if ( mType == "drawing.dontknow" )
+ {
+ mnAngle = 0;
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ ImplCreateShape( ESCHER_ShpInst_PictureFrame,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
+ aSolverContainer );
+ if ( aPropOpt.CreateGraphicProperties( mXPropSet, "MetaFile", false ) )
+ aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
+ }
+ else
+ {
+ continue;
+ }
+
+ bool bClientData = ( bEffect || ( eCa != css::presentation::ClickAction_NONE ) ||
+ nPlaceHolderAtom || nOlePictureId );
+ if ( bClientData )
+ {
+ if ( nPlaceHolderAtom )
+ {
+ sal_Int32 nPlacementID = -1;
+ if ( ( mnTextStyle == EPP_TEXTSTYLE_TITLE ) || ( mnTextStyle == EPP_TEXTSTYLE_BODY ) )
+ nPlacementID = nIndices++;
+ else
+ {
+ switch ( nPlaceHolderAtom )
+ {
+ default :
+ {
+ if ( nPlaceHolderAtom < 19 )
+ break;
+ [[fallthrough]];
+ }
+ case EPP_PLACEHOLDER_NOTESBODY :
+ case EPP_PLACEHOLDER_MASTERDATE :
+ case EPP_PLACEHOLDER_NOTESSLIDEIMAGE :
+ case EPP_PLACEHOLDER_MASTERNOTESBODYIMAGE :
+ nPlacementID = nIndices++;
+ }
+ }
+ if ( !pClientData )
+ pClientData.reset(new SvMemoryStream( 0x200, 0x200 ));
+
+ pClientData->WriteUInt32( EPP_OEPlaceholderAtom << 16 ).WriteUInt32( 8 )
+ .WriteInt32( nPlacementID ) // PlacementID
+ .WriteUChar( nPlaceHolderAtom ) // PlaceHolderID
+ .WriteUChar( 0 ) // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
+ .WriteUInt16( 0 ); // padword
+ }
+ if ( nOlePictureId )
+ {
+ if ( !pClientData )
+ pClientData.reset(new SvMemoryStream( 0x200, 0x200 ));
+
+ pClientData->WriteUInt32( EPP_ExObjRefAtom << 16 ).WriteUInt32( 4 )
+ .WriteUInt32( nOlePictureId );
+ nOlePictureId = 0;
+ }
+ if ( bEffect && !pClientData )
+ {
+ pClientData.reset(new SvMemoryStream( 0x200, 0x200 ));
+ }
+
+ if ( eCa != css::presentation::ClickAction_NONE )
+ {
+ if ( !pClientData )
+ pClientData.reset(new SvMemoryStream( 0x200, 0x200 ));
+ ImplWriteClickAction( *pClientData, eCa, bMediaClickAction );
+ }
+ }
+ if ( ( mnTextStyle == EPP_TEXTSTYLE_TITLE ) || ( mnTextStyle == EPP_TEXTSTYLE_BODY ) )
+ {
+ if ( !pClientTextBox )
+ pClientTextBox.reset(new SvMemoryStream( 0x200, 0x200 ));
+
+ if ( !mbEmptyPresObj )
+ {
+ if ( ( ePageType == NORMAL ) && !bMasterPage )
+ {
+ sal_uInt32 nTextType = EPP_TEXTTYPE_Body;
+ if ( mnTextStyle == EPP_TEXTSTYLE_BODY )
+ {
+ if ( bSecOutl )
+ nTextType = EPP_TEXTTYPE_HalfBody;
+ else if ( mType == "presentation.Subtitle" )
+ nTextType = EPP_TEXTTYPE_CenterBody;
+ bSecOutl = true;
+ }
+ else
+ nTextType = EPP_TEXTTYPE_Title;
+
+ TextRuleEntry aTextRule;
+ SvMemoryStream aExtBu( 0x200, 0x200 );
+ ImplGetText();
+ ImplWriteTextStyleAtom( *pClientTextBox, nTextType, nPObjects, &aTextRule, aExtBu, nullptr );
+ ImplWriteExtParaHeader( aExtBu, nPObjects++, nTextType, nPageNumber + 0x100 );
+ SvMemoryStream* pOut = aTextRule.pOut.get();
+ if ( pOut )
+ {
+ pClientTextBox->WriteBytes(pOut->GetData(), pOut->Tell());
+ aTextRule.pOut.reset();
+ }
+ if ( aExtBu.Tell() )
+ {
+ if ( !pClientData )
+ pClientData.reset(new SvMemoryStream( 0x200, 0x200 ));
+ ImplProgTagContainer( pClientData.get(), &aExtBu );
+ }
+ }
+ }
+ }
+ else
+ {
+ if ( !aPropOpt.IsFontWork() )
+ {
+ if ( mnTextSize || ( nPlaceHolderAtom == EPP_PLACEHOLDER_MASTERDATE ) || ( nPlaceHolderAtom == EPP_PLACEHOLDER_NOTESBODY ) )
+ {
+ int nInstance2;
+ if ( ( nPlaceHolderAtom == EPP_PLACEHOLDER_MASTERDATE ) || ( nPlaceHolderAtom == EPP_PLACEHOLDER_NOTESBODY ) )
+ nInstance2 = 2;
+ else
+ nInstance2 = EPP_TEXTTYPE_Other; // Text in a Shape
+
+ if ( !pClientTextBox )
+ pClientTextBox.reset(new SvMemoryStream( 0x200, 0x200 ));
+
+ SvMemoryStream aExtBu( 0x200, 0x200 );
+ ImplWriteTextStyleAtom( *pClientTextBox, nInstance2, 0, nullptr, aExtBu, &aPropOpt );
+ if ( aExtBu.Tell() )
+ {
+ if ( !pClientData )
+ pClientData.reset(new SvMemoryStream( 0x200, 0x200 ));
+ ImplProgTagContainer( pClientData.get(), &aExtBu );
+ }
+ }
+ else if ( nPlaceHolderAtom >= 19 )
+ {
+ if ( !pClientTextBox )
+ pClientTextBox.reset(new SvMemoryStream( 12 ));
+
+ pClientTextBox->WriteUInt32( EPP_TextHeaderAtom << 16 ).WriteUInt32( 4 )
+ .WriteUInt32( 7 );
+ }
+ }
+ }
+
+ aPropOpt.CreateShadowProperties( mXPropSet );
+ maRect.Justify();
+ if ( mnAngle )
+ ImplFlipBoundingBox( aPropOpt );
+ aPropOpt.CreateShapeProperties( mXShape );
+ aPropOpt.Commit( *mpStrm );
+ if ( GetCurrentGroupLevel() > 0 )
+ mpPptEscherEx->AddChildAnchor( maRect );
+ else
+ mpPptEscherEx->AddClientAnchor( maRect );
+
+ if ( pClientData )
+ {
+ mpStrm->WriteUInt32( ( ESCHER_ClientData << 16 ) | 0xf )
+ .WriteUInt32( pClientData->Tell() );
+
+ mpStrm->WriteBytes(pClientData->GetData(), pClientData->Tell());
+ pClientData.reset();
+ }
+ if ( pClientTextBox )
+ {
+ mpStrm->WriteUInt32( ( ESCHER_ClientTextbox << 16 ) | 0xf )
+ .WriteUInt32( pClientTextBox->Tell() );
+
+ mpStrm->WriteBytes(pClientTextBox->GetData(), pClientTextBox->Tell());
+ pClientTextBox.reset();
+ }
+ mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
+ }
+ nPrevTextStyle = mnTextStyle;
+
+ if ( bAdditionalText )
+ {
+ bAdditionalText = false;
+
+ css::uno::Any aAny;
+ EscherPropertyContainer aPropOpt;
+ mnAngle = ( PropValue::GetPropertyValue( aAny,
+ mXPropSet, "RotateAngle", true ) )
+ ? *o3tl::doAccess<sal_Int32>(aAny)
+ : 0;
+
+ aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90000 );
+ aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100000 );
+ if ( mType == "drawing.Line" )
+ {
+ double fDist = hypot( maRect.GetWidth(), maRect.GetHeight() );
+ maRect = ::tools::Rectangle( Point( aTextRefPoint.X, aTextRefPoint.Y ),
+ Point( static_cast<sal_Int32>( aTextRefPoint.X + fDist ), aTextRefPoint.Y - 1 ) );
+ ImplCreateTextShape( aPropOpt, aSolverContainer, false );
+ aPropOpt.AddOpt( ESCHER_Prop_FitTextToShape, 0x60006 ); // Size Shape To Fit Text
+ if ( mnAngle < 0 )
+ mnAngle = ( 36000 + mnAngle ) % 36000;
+ if ( mnAngle )
+ ImplFlipBoundingBox( aPropOpt );
+ }
+ else
+ {
+ ImplCreateTextShape( aPropOpt, aSolverContainer, false );
+ if ( mnAngle < 0 )
+ mnAngle = ( 36000 + mnAngle ) % 36000;
+ else
+ mnAngle = ( 36000 - ( mnAngle % 36000 ) );
+
+ mnAngle *= 655;
+ mnAngle += 0x8000;
+ mnAngle &=~0xffff; // round nAngle to full grad
+ aPropOpt.AddOpt( ESCHER_Prop_Rotation, mnAngle );
+
+ // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
+ // mpPptEscherEx->SetGroupSnapRect( nGroupLevel, maRect );
+ // mpPptEscherEx->SetGroupLogicRect( nGroupLevel, maRect );
+ }
+ if ( !pClientTextBox )
+ pClientTextBox.reset(new SvMemoryStream( 0x200, 0x200 ));
+
+ SvMemoryStream aExtBu( 0x200, 0x200 );
+ ImplWriteTextStyleAtom( *pClientTextBox, EPP_TEXTTYPE_Other, 0, nullptr, aExtBu, &aPropOpt );
+
+ aPropOpt.CreateShapeProperties( mXShape );
+ aPropOpt.Commit( *mpStrm );
+ if ( GetCurrentGroupLevel() > 0 )
+ mpPptEscherEx->AddChildAnchor( maRect );
+ else
+ mpPptEscherEx->AddClientAnchor( maRect );
+
+ mpStrm->WriteUInt32( ( ESCHER_ClientTextbox << 16 ) | 0xf )
+ .WriteUInt32( pClientTextBox->Tell() );
+
+ mpStrm->WriteBytes(pClientTextBox->GetData(), pClientTextBox->Tell());
+ pClientTextBox.reset();
+
+ mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
+
+ // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
+ // mpPptEscherEx->LeaveGroup();
+ }
+ }
+ ClearGroupTable(); // storing groups if any are still open, which should not be the case
+ nGroups = GetGroupsClosed();
+ for ( sal_uInt32 i = 0; i < nGroups; i++, mpPptEscherEx->LeaveGroup() ) ;
+ mnPagesWritten++;
+}
+
+struct CellBorder
+{
+ sal_Int32 mnPos; // specifies the distance to the top/left position of the table
+ table::BorderLine maCellBorder;
+
+ CellBorder() : mnPos ( 0 ) {};
+};
+
+bool PPTWriter::ImplCreateCellBorder( const CellBorder* pCellBorder, sal_Int32 nX1, sal_Int32 nY1, sal_Int32 nX2, sal_Int32 nY2)
+{
+ sal_Int32 nLineWidth = pCellBorder->maCellBorder.OuterLineWidth + pCellBorder->maCellBorder.InnerLineWidth;
+ if ( nLineWidth )
+ {
+ nLineWidth *= 2;
+ mnAngle = 0;
+ mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
+ EscherPropertyContainer aPropOptSp;
+
+ sal_uInt32 nId = mpPptEscherEx->GenerateShapeId();
+ mpPptEscherEx->AddShape( ESCHER_ShpInst_Line,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty | ShapeFlag::Child,
+ nId );
+ aPropOptSp.AddOpt( ESCHER_Prop_shapePath, ESCHER_ShapeComplex );
+ aPropOptSp.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0xa0008 );
+ aPropOptSp.AddOpt( ESCHER_Prop_fshadowObscured, 0x20000 );
+
+ sal_uInt32 nBorderColor = pCellBorder->maCellBorder.Color & 0xff00; // green
+ nBorderColor |= static_cast< sal_uInt8 >( pCellBorder->maCellBorder.Color ) << 16; // red
+ nBorderColor |= static_cast< sal_uInt8 >( pCellBorder->maCellBorder.Color >> 16 ); // blue
+ aPropOptSp.AddOpt( ESCHER_Prop_lineColor, nBorderColor );
+
+ aPropOptSp.AddOpt( ESCHER_Prop_lineWidth, nLineWidth * 360 );
+ aPropOptSp.AddOpt( ESCHER_Prop_fc3DLightFace, 0x80000 );
+ aPropOptSp.Commit( *mpStrm );
+ mpPptEscherEx->AddAtom( 16, ESCHER_ChildAnchor );
+ mpStrm ->WriteInt32( nX1 )
+ .WriteInt32( nY1 )
+ .WriteInt32( nX2 )
+ .WriteInt32( nY2 );
+ mpPptEscherEx->CloseContainer();
+ return true;
+ }
+ return false;
+}
+
+//get merged cell's width
+static sal_Int32 GetCellRight( sal_Int32 nColumn,
+ ::tools::Rectangle const & rect,
+ std::vector< std::pair< sal_Int32, sal_Int32 > >& aColumns,
+ uno::Reference< table::XMergeableCell > const & xCell )
+{
+ sal_Int32 nRight = aColumns[ nColumn ].first + aColumns[ nColumn ].second;
+ for ( sal_Int32 nColumnSpan = 1; nColumnSpan < xCell->getColumnSpan(); nColumnSpan++ )
+ {
+ sal_uInt32 nC = nColumnSpan + nColumn;
+ if ( nC < aColumns.size() )
+ nRight += aColumns[ nC ].second;
+ else
+ nRight = rect.Right();
+ }
+ return nRight;
+}
+//get merged cell's height
+static sal_Int32 GetCellBottom( sal_Int32 nRow,
+ ::tools::Rectangle const & rect,
+ std::vector< std::pair< sal_Int32, sal_Int32 > >& aRows,
+ uno::Reference< table::XMergeableCell > const & xCell )
+{
+ sal_Int32 nBottom = aRows[nRow].first + aRows[nRow].second;
+ for ( sal_Int32 nRowSpan = 1; nRowSpan < xCell->getRowSpan(); nRowSpan++ )
+ {
+ sal_uInt32 nR = nRowSpan + nRow;
+ if ( nR < aRows.size() )
+ nBottom += aRows[ nR ].second;
+ else
+ nBottom = rect.Bottom();
+ }
+ return nBottom;
+}
+
+void PPTWriter::WriteCString( SvStream& rSt, const OUString& rString, sal_uInt32 nInstance )
+{
+ sal_Int32 nLen = rString.getLength();
+ if ( nLen )
+ {
+ rSt.WriteUInt32( ( nInstance << 4 ) | ( EPP_CString << 16 ) )
+ .WriteUInt32( nLen << 1 );
+ for ( sal_Int32 i = 0; i < nLen; i++ )
+ rSt.WriteUInt16( rString[i] );
+ }
+}
+
+namespace {
+
+class ContainerGuard
+{
+private:
+ PptEscherEx* m_pPptEscherEx;
+public:
+ ContainerGuard(PptEscherEx* pPptEscherEx, sal_uInt16 nRecord)
+ : m_pPptEscherEx(pPptEscherEx)
+ {
+ m_pPptEscherEx->OpenContainer(nRecord);
+ }
+ ~ContainerGuard()
+ {
+ m_pPptEscherEx->CloseContainer();
+ }
+};
+
+}
+
+void PPTWriter::ImplCreateTable( uno::Reference< drawing::XShape > const & rXShape, EscherSolverContainer& aSolverContainer,
+ EscherPropertyContainer& aPropOpt )
+{
+ try
+ {
+ uno::Reference< table::XTable > xTable;
+ if ( mXPropSet->getPropertyValue( "Model" ) >>= xTable )
+ {
+ uno::Reference< table::XColumnRowRange > xColumnRowRange( xTable, uno::UNO_QUERY_THROW );
+ uno::Reference< container::XIndexAccess > xColumns( xColumnRowRange->getColumns(), uno::UNO_QUERY_THROW );
+ uno::Reference< container::XIndexAccess > xRows( xColumnRowRange->getRows(), uno::UNO_QUERY_THROW );
+ sal_uInt16 nRowCount = static_cast< sal_uInt16 >( xRows->getCount() );
+ sal_uInt16 nColumnCount = static_cast< sal_uInt16 >( xColumns->getCount() );
+
+ std::vector< std::pair< sal_Int32, sal_Int32 > > aColumns;
+ std::vector< std::pair< sal_Int32, sal_Int32 > > aRows;
+
+ awt::Point aPosition( MapPoint( rXShape->getPosition() ) );
+ sal_Int32 nPosition = aPosition.X;
+ for ( sal_Int32 x = 0; x < nColumnCount; x++ )
+ {
+ uno::Reference< beans::XPropertySet > xPropSet( xColumns->getByIndex( x ), uno::UNO_QUERY_THROW );
+ awt::Size aS( 0, 0 );
+ xPropSet->getPropertyValue( "Width" ) >>= aS.Width;
+ awt::Size aM( MapSize( aS ) );
+ aColumns.emplace_back( nPosition, aM.Width );
+ nPosition += aM.Width;
+ if ( x == nColumnCount - 1 && nPosition != maRect.Right() )
+ maRect.SetRight( nPosition );
+ }
+
+ nPosition = aPosition.Y;
+ for ( sal_Int32 y = 0; y < nRowCount; y++ )
+ {
+ uno::Reference< beans::XPropertySet > xPropSet( xRows->getByIndex( y ), uno::UNO_QUERY_THROW );
+ awt::Size aS( 0, 0 );
+ xPropSet->getPropertyValue( "Height" ) >>= aS.Height;
+ awt::Size aM( MapSize( aS ) );
+ aRows.emplace_back( nPosition, aM.Height );
+ nPosition += aM.Height;
+ if ( y == nRowCount - 1 && nPosition != maRect.Bottom())
+ maRect.SetBottom( nPosition );
+ }
+ std::optional<ContainerGuard> xSpgrContainer(std::in_place, mpPptEscherEx.get(), ESCHER_SpgrContainer);
+ std::optional<ContainerGuard> xSpContainer(std::in_place, mpPptEscherEx.get(), ESCHER_SpContainer);
+ mpPptEscherEx->AddAtom( 16, ESCHER_Spgr, 1 );
+ mpStrm ->WriteInt32( maRect.Left() ) // Bounding box for the grouped shapes to which they are attached
+ .WriteInt32( maRect.Top() )
+ .WriteInt32( maRect.Right() )
+ .WriteInt32( maRect.Bottom() );
+
+ sal_uInt32 nShapeId = mpPptEscherEx->GenerateShapeId();
+ mpPptEscherEx->AddShape( ESCHER_ShpInst_Min, ShapeFlag::HaveAnchor | ShapeFlag::Group, nShapeId );
+ // TODO: check flags, comment does not match code // Flags: Group | Patriarch
+ aSolverContainer.AddShape( rXShape, nShapeId );
+ EscherPropertyContainer aPropOpt2;
+
+ SvMemoryStream aMemStrm;
+ aMemStrm.WriteUInt16( nRowCount )
+ .WriteUInt16( nRowCount )
+ .WriteUInt16( 4 );
+
+ for( const auto& rRow : aRows )
+ aMemStrm.WriteInt32( rRow.second );
+
+ aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x1000100 );
+ aPropOpt2.AddOpt( ESCHER_Prop_tableProperties, 1 );
+ aPropOpt2.AddOpt(ESCHER_Prop_tableRowProperties, true, 0, aMemStrm);
+ aPropOpt.CreateShapeProperties( rXShape );
+ aPropOpt.Commit( *mpStrm );
+ aPropOpt2.Commit( *mpStrm, 3, ESCHER_UDefProp );
+ if ( GetCurrentGroupLevel() > 0 )
+ mpPptEscherEx->AddChildAnchor( maRect );
+ else
+ mpPptEscherEx->AddClientAnchor( maRect );
+ xSpContainer.reset(); //ESCHER_SpContainer
+
+ uno::Reference< table::XCellRange > xCellRange( xTable, uno::UNO_QUERY_THROW );
+ for( sal_Int32 nRow = 0; nRow < xRows->getCount(); nRow++ )
+ {
+ for( sal_Int32 nColumn = 0; nColumn < xColumns->getCount(); nColumn++ )
+ {
+ uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn, nRow ), uno::UNO_QUERY_THROW );
+ if ( !xCell->isMerged() )
+ {
+ sal_Int32 nLeft = aColumns[ nColumn ].first;
+ sal_Int32 nTop = aRows[ nRow ].first;
+ sal_Int32 nRight = GetCellRight( nColumn, maRect,aColumns,xCell );
+ sal_Int32 nBottom = GetCellBottom( nRow, maRect,aRows,xCell );
+
+ mbFontIndependentLineSpacing = false;
+ mXPropSet.set( xCell, uno::UNO_QUERY_THROW );
+ mXText.set( xCell, uno::UNO_QUERY_THROW );
+ mnTextSize = mXText->getString().getLength();
+
+ css::uno::Any aAny;
+ if ( GetPropertyValue( aAny, mXPropSet, "FontIndependentLineSpacing", true ) )
+ aAny >>= mbFontIndependentLineSpacing;
+
+ EscherPropertyContainer aPropOptSp;
+ std::optional<ContainerGuard> xCellContainer(std::in_place, mpPptEscherEx.get(), ESCHER_SpContainer);
+ ImplCreateShape( ESCHER_ShpInst_Rectangle,
+ ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty | ShapeFlag::Child,
+ aSolverContainer );
+ aPropOptSp.CreateFillProperties( mXPropSet, true );
+ aPropOptSp.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90000 );
+ mnTxId += 0x60;
+ aPropOptSp.CreateTextProperties( mXPropSet, mnTxId );
+ aPropOptSp.AddOpt( ESCHER_Prop_WrapText, ESCHER_WrapSquare );
+
+ SvMemoryStream aClientTextBox( 0x200, 0x200 );
+ SvMemoryStream aExtBu( 0x200, 0x200 );
+
+ ImplWriteTextStyleAtom( aClientTextBox, EPP_TEXTTYPE_Other, 0, nullptr, aExtBu, &aPropOptSp );
+
+ // need write client data for extend bullet
+ if ( aExtBu.Tell() )
+ {
+ SvMemoryStream aClientData( 0x200, 0x200 );
+ ImplProgTagContainer( &aClientData, &aExtBu );
+ mpStrm->WriteUInt32( ( ESCHER_ClientData << 16 ) | 0xf )
+ .WriteUInt32( aClientData.Tell() );
+
+ mpStrm->WriteBytes(aClientData.GetData(), aClientData.Tell());
+ }
+
+ aPropOptSp.Commit( *mpStrm );
+ mpPptEscherEx->AddAtom( 16, ESCHER_ChildAnchor );
+ mpStrm ->WriteInt32( nLeft )
+ .WriteInt32( nTop )
+ .WriteInt32( nRight )
+ .WriteInt32( nBottom );
+
+ mpStrm->WriteUInt32( ( ESCHER_ClientTextbox << 16 ) | 0xf )
+ .WriteUInt32( aClientTextBox.Tell() );
+
+ mpStrm->WriteBytes(aClientTextBox.GetData(), aClientTextBox.Tell());
+ xCellContainer.reset();
+ }
+ }
+ }
+
+ // creating horz lines
+ for( sal_Int32 nLine = 0; nLine < ( xRows->getCount() + 1 ); nLine++ )
+ {
+ for( sal_Int32 nColumn = 0; nColumn < xColumns->getCount(); nColumn++ )
+ {
+ CellBorder aCellBorder;
+ aCellBorder.mnPos = aColumns[ nColumn ].first;
+ bool bTop = false;
+ //write nLine*nColumn cell's top border
+ if ( nLine < xRows->getCount() )
+ { // top border
+ uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn, nLine ), uno::UNO_QUERY_THROW );
+ if ( !xCell->isMerged() )
+ {
+ uno::Reference< beans::XPropertySet > xPropSet2( xCell, uno::UNO_QUERY_THROW );
+ table::BorderLine aBorderLine;
+ if ( xPropSet2->getPropertyValue( "TopBorder" ) >>= aBorderLine )
+ aCellBorder.maCellBorder = aBorderLine;
+ sal_Int32 nRight = GetCellRight( nColumn, maRect,aColumns,xCell );
+ bTop = ImplCreateCellBorder( &aCellBorder, aCellBorder.mnPos,
+ aRows[ nLine ].first, nRight, aRows[ nLine ].first );
+ }
+ }
+
+ //if nLine*nColumn cell's top border is empty, check (nLine-1)*nColumn cell's bottom border
+ //and write the last row's bottom border
+ if (( nLine && !bTop ) || (nLine == xRows->getCount()))
+ { // bottom border
+ sal_Int32 nRow = nLine;
+
+ while( nRow )
+ { //find last no merged cell
+ uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn, nRow - 1 ), uno::UNO_QUERY_THROW );
+ if ( !xCell->isMerged() )
+ {
+ sal_Int32 nRight = GetCellRight( nColumn, maRect,aColumns,xCell );
+ sal_Int32 nBottom = GetCellBottom( nRow - 1, maRect,aRows,xCell );
+ if ( nBottom == ( aRows[ nLine-1 ].first + aRows[ nLine-1 ].second ) )
+ {
+ uno::Reference< table::XMergeableCell > xCellOwn( xCellRange->getCellByPosition( nColumn, nRow - 1 ), uno::UNO_QUERY_THROW );
+ uno::Reference< beans::XPropertySet > xPropSet2( xCellOwn, uno::UNO_QUERY_THROW );
+ table::BorderLine aBorderLine;
+ if ( xPropSet2->getPropertyValue( "BottomBorder" ) >>= aBorderLine )
+ aCellBorder.maCellBorder = aBorderLine;
+ ImplCreateCellBorder( &aCellBorder, aCellBorder.mnPos,
+ nBottom, nRight, nBottom);
+ }
+ nRow=0;
+ }
+ else
+ nRow--;
+ }
+ }
+ }
+ }
+
+ // creating vertical lines
+ for( sal_Int32 nLine = 0; nLine < ( xColumns->getCount() + 1 ); nLine++ )
+ {
+ for( sal_Int32 nRow = 0; nRow < xRows->getCount(); nRow++ )
+ {
+
+ CellBorder aCellBorder;
+ aCellBorder.mnPos = aRows[ nRow].first;
+ bool bLeft = false;
+ if ( nLine < xColumns->getCount() )
+ { // left border
+ uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nLine, nRow ), uno::UNO_QUERY_THROW );
+ if (!xCell->isMerged() )
+ {
+ uno::Reference< beans::XPropertySet > xCellSet( xCell, uno::UNO_QUERY_THROW );
+ table::BorderLine aBorderLine;
+ if ( xCellSet->getPropertyValue( "LeftBorder" ) >>= aBorderLine )
+ aCellBorder.maCellBorder = aBorderLine;
+ sal_Int32 nBottom = GetCellBottom( nRow, maRect, aRows,xCell );
+ bLeft = ImplCreateCellBorder( &aCellBorder, aColumns[nLine].first, aCellBorder.mnPos,
+ aColumns[nLine].first, nBottom );
+ }
+ }
+ if ( ( nLine && !bLeft )||(nLine == xColumns->getCount()))
+ { // right border
+ sal_Int32 nColumn = nLine;
+ while ( nColumn )
+ {
+ uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn - 1, nRow ), uno::UNO_QUERY_THROW );
+ if (!xCell->isMerged() )
+ {
+ sal_Int32 nRight = GetCellRight( nColumn-1, maRect, aColumns,xCell );
+ sal_Int32 nBottom = GetCellBottom( nRow, maRect, aRows, xCell );
+ if ( nRight == (aColumns[nLine-1].first + aColumns[nLine-1].second) )
+ {
+ uno::Reference< table::XMergeableCell > xCellOwn( xCellRange->getCellByPosition( nColumn - 1, nRow ), uno::UNO_QUERY_THROW );
+ uno::Reference< beans::XPropertySet > xCellSet( xCellOwn, uno::UNO_QUERY_THROW );
+ table::BorderLine aBorderLine;
+ if ( xCellSet->getPropertyValue( "RightBorder" ) >>= aBorderLine )
+ aCellBorder.maCellBorder = aBorderLine;
+ ImplCreateCellBorder( &aCellBorder, nRight, aCellBorder.mnPos,
+ nRight, nBottom );
+ }
+ nColumn = 0;
+ }
+ else
+ nColumn --;
+ }
+ }
+ }
+ }
+
+ xSpgrContainer.reset(); //ESCHER_SpgrContainer
+ }
+ }
+ catch( uno::Exception& )
+ {
+ }
+}
+
+void TextObjBinary::Write( SvStream* pStrm )
+{
+ sal_uInt32 nSize, nPos = pStrm->Tell();
+ pStrm->WriteUInt32( EPP_TextCharsAtom << 16 ).WriteUInt32( 0 );
+ for ( sal_uInt32 i = 0; i < ParagraphCount(); ++i )
+ GetParagraph(i)->Write( pStrm );
+ nSize = pStrm->Tell() - nPos;
+ pStrm->SeekRel( - ( static_cast<sal_Int32>(nSize) - 4 ) );
+ pStrm->WriteUInt32( nSize - 8 );
+ pStrm->SeekRel( nSize - 8 );
+}
+
+void TextObjBinary::WriteTextSpecInfo( SvStream* pStrm )
+{
+ sal_uInt32 nCharactersLeft( Count() );
+ if ( nCharactersLeft < 1 )
+ return;
+
+ EscherExAtom aAnimationInfoAtom( *pStrm, EPP_TextSpecInfoAtom, 0, 0 );
+ for ( sal_uInt32 i = 0; nCharactersLeft && i < ParagraphCount(); ++i )
+ {
+ ParagraphObj* pPtr = GetParagraph(i);
+ for ( std::vector<std::unique_ptr<PortionObj> >::const_iterator it = pPtr->begin(); nCharactersLeft && it != pPtr->end(); ++it )
+ {
+ const PortionObj& rPortion = **it;
+ sal_Int32 nPortionSize = rPortion.mnTextSize >= nCharactersLeft ? nCharactersLeft : rPortion.mnTextSize;
+ sal_Int32 const nFlags = 7;
+ nCharactersLeft -= nPortionSize;
+ pStrm ->WriteUInt32( nPortionSize )
+ .WriteInt32( nFlags )
+ .WriteInt16( 1 ) // spellinfo -> needs rechecking
+ .WriteInt16( static_cast<sal_uInt16>(LanguageTag( rPortion.meCharLocale ).makeFallback().getLanguageType()) )
+ .WriteInt16( 0 ); // alt language
+ }
+ }
+ if ( nCharactersLeft )
+ pStrm->WriteUInt32( nCharactersLeft ).WriteInt32( 1 ).WriteInt16( 1 );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/escherex.cxx b/sd/source/filter/eppt/escherex.cxx
new file mode 100644
index 000000000..5032c2721
--- /dev/null
+++ b/sd/source/filter/eppt/escherex.cxx
@@ -0,0 +1,266 @@
+/* -*- 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 "escherex.hxx"
+
+PptEscherEx::PptEscherEx( SvStream& rOutStrm, const OUString& rBaseURI ) :
+ EscherEx( std::make_shared<EscherExGlobal>( ), &rOutStrm )
+{
+ mxGlobal->SetBaseURI( rBaseURI );
+ mnCurrentDg = 0;
+}
+
+sal_uInt32 PptEscherEx::DrawingGroupContainerSize()
+{
+ return ImplDggContainerSize() + 8;
+}
+
+void PptEscherEx::WriteDrawingGroupContainer( SvStream& rSt )
+{
+ sal_uInt32 nSize = DrawingGroupContainerSize();
+ rSt.WriteUInt32( 0xf | ( 1035 << 16 ) ) // EPP_PPDrawingGroup
+ .WriteUInt32( nSize - 8 );
+
+ ImplWriteDggContainer( rSt );
+}
+
+sal_uInt32 PptEscherEx::ImplDggContainerSize()
+{
+ sal_uInt32 nSize;
+
+ nSize = mxGlobal->GetDggAtomSize();
+ nSize += mxGlobal->GetBlibStoreContainerSize();
+ nSize += ImplOptAtomSize();
+ nSize += ImplSplitMenuColorsAtomSize();
+
+ return nSize + 8;
+}
+
+void PptEscherEx::ImplWriteDggContainer( SvStream& rSt )
+{
+ sal_uInt32 nSize = ImplDggContainerSize();
+ if ( nSize )
+ {
+ rSt.WriteUInt32( 0xf | ( ESCHER_DggContainer << 16 ) )
+ .WriteUInt32( nSize - 8 );
+
+ mxGlobal->SetDggContainer();
+ mxGlobal->WriteDggAtom( rSt );
+ mxGlobal->WriteBlibStoreContainer( rSt );
+ ImplWriteOptAtom( rSt );
+ ImplWriteSplitMenuColorsAtom( rSt );
+ }
+}
+
+#define ESCHER_OPT_COUNT 6
+
+sal_uInt32 PptEscherEx::ImplOptAtomSize()
+{
+ sal_uInt32 nSize = 0;
+ if ( ESCHER_OPT_COUNT != 0 )
+ nSize = ( ESCHER_OPT_COUNT * 6 ) + 8;
+ return nSize;
+}
+
+void PptEscherEx::ImplWriteOptAtom( SvStream& rSt )
+{
+ sal_uInt32 nSize = ImplOptAtomSize();
+ if ( nSize )
+ {
+ rSt.WriteUInt32( ( ESCHER_OPT << 16 ) | ( ESCHER_OPT_COUNT << 4 ) | 0x3 )
+ .WriteUInt32( nSize - 8 )
+ .WriteUInt16( ESCHER_Prop_fillColor ) .WriteUInt32( 0xffb800 )
+ .WriteUInt16( ESCHER_Prop_fillBackColor ) .WriteUInt32( 0 )
+ .WriteUInt16( ESCHER_Prop_fNoFillHitTest ) .WriteUInt32( 0x00100010 )
+ .WriteUInt16( ESCHER_Prop_lineColor ) .WriteUInt32( 0x8000001 )
+ .WriteUInt16( ESCHER_Prop_fNoLineDrawDash ) .WriteUInt32( 0x00080008 )
+ .WriteUInt16( ESCHER_Prop_shadowColor ) .WriteUInt32( 0x8000002 );
+ }
+}
+
+#define ESCHER_SPLIT_MENU_COLORS_COUNT 4
+
+sal_uInt32 PptEscherEx::ImplSplitMenuColorsAtomSize()
+{
+ sal_uInt32 nSize = 0;
+ if ( ESCHER_SPLIT_MENU_COLORS_COUNT != 0 )
+ nSize = ( ESCHER_SPLIT_MENU_COLORS_COUNT << 2 ) + 8;
+ return nSize;
+}
+
+void PptEscherEx::ImplWriteSplitMenuColorsAtom( SvStream& rSt )
+{
+ sal_uInt32 nSize = ImplSplitMenuColorsAtomSize();
+ if ( nSize )
+ {
+ rSt.WriteUInt32( ( ESCHER_SplitMenuColors << 16 ) | ( ESCHER_SPLIT_MENU_COLORS_COUNT << 4 ) )
+ .WriteUInt32( nSize - 8 )
+ .WriteUInt32( 0x08000004 )
+ .WriteUInt32( 0x08000001 )
+ .WriteUInt32( 0x08000002 )
+ .WriteUInt32( 0x100000f7 );
+ }
+
+}
+
+PptEscherEx::~PptEscherEx()
+{
+}
+
+void PptEscherEx::OpenContainer( sal_uInt16 n_EscherContainer, int nRecInstance )
+{
+ mpOutStrm->WriteUInt16( ( nRecInstance << 4 ) | 0xf ).WriteUInt16( n_EscherContainer ).WriteUInt32( 0 );
+ mOffsets.push_back( mpOutStrm->Tell() - 4 );
+ mRecTypes.push_back( n_EscherContainer );
+
+ switch( n_EscherContainer )
+ {
+ case ESCHER_DgContainer :
+ {
+ if ( !mbEscherDg )
+ {
+ mbEscherDg = true;
+ mnCurrentDg = mxGlobal->GenerateDrawingId();
+ AddAtom( 8, ESCHER_Dg, 0, mnCurrentDg );
+ PtReplaceOrInsert( ESCHER_Persist_Dg | mnCurrentDg, mpOutStrm->Tell() );
+ mpOutStrm->WriteUInt32( 0 ) // The number of shapes in this drawing
+ .WriteUInt32( 0 ); // The last MSOSPID given to an SP in this DG
+ }
+ }
+ break;
+
+ case ESCHER_SpgrContainer :
+ {
+ if ( mbEscherDg )
+ {
+ mbEscherSpgr = true;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void PptEscherEx::CloseContainer()
+{
+ /* SJ: #Issue 26747#
+ not creating group objects with a depth higher than 16, because then
+ PPT is having a big performance problem when starting a slide show
+ */
+ if ( ( mRecTypes.back() == ESCHER_SpgrContainer ) && ( mnGroupLevel >= 12 ) )
+ return;
+
+ sal_uInt32 nSize, nPos = mpOutStrm->Tell();
+ nSize = ( nPos - mOffsets.back() ) - 4;
+ mpOutStrm->Seek( mOffsets.back() );
+ mpOutStrm->WriteUInt32( nSize );
+
+ switch( mRecTypes.back() )
+ {
+ case ESCHER_DgContainer :
+ {
+ if ( mbEscherDg )
+ {
+ mbEscherDg = false;
+ if ( DoSeek( ESCHER_Persist_Dg | mnCurrentDg ) )
+ mpOutStrm->WriteUInt32( mxGlobal->GetDrawingShapeCount( mnCurrentDg ) ).WriteUInt32( mxGlobal->GetLastShapeId( mnCurrentDg ) );
+ }
+ }
+ break;
+
+ case ESCHER_SpgrContainer :
+ {
+ if ( mbEscherSpgr )
+ {
+ mbEscherSpgr = false;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ mOffsets.pop_back();
+ mRecTypes.pop_back();
+ mpOutStrm->Seek( nPos );
+}
+
+sal_uInt32 PptEscherEx::EnterGroup( ::tools::Rectangle const * pBoundRect, SvMemoryStream* pClientData )
+{
+ sal_uInt32 nShapeId = 0;
+ /* SJ: #Issue 26747#
+ not creating group objects with a depth higher than 16, because then
+ PPT is having a big performance problem when starting a slide show
+ */
+ if ( mnGroupLevel < 12 )
+ {
+ ::tools::Rectangle aRect;
+ if ( pBoundRect )
+ aRect = *pBoundRect;
+
+ OpenContainer( ESCHER_SpgrContainer );
+ OpenContainer( ESCHER_SpContainer );
+ AddAtom( 16, ESCHER_Spgr, 1 );
+ PtReplaceOrInsert( ESCHER_Persist_Grouping_Snap | mnGroupLevel, mpOutStrm->Tell() );
+ mpOutStrm ->WriteInt32( aRect.Left() ) // bounding box for the grouped shapes to which they are attached
+ .WriteInt32( aRect.Top() )
+ .WriteInt32( aRect.Right() )
+ .WriteInt32( aRect.Bottom() );
+
+ nShapeId = GenerateShapeId();
+ if ( !mnGroupLevel )
+ AddShape( ESCHER_ShpInst_Min, ShapeFlag::Group | ShapeFlag::Patriarch, nShapeId );
+ else
+ {
+ AddShape( ESCHER_ShpInst_Min, ShapeFlag::HaveAnchor | ShapeFlag::Group, nShapeId );
+ if ( mnGroupLevel == 1 )
+ {
+ AddAtom( 8, ESCHER_ClientAnchor );
+ PtReplaceOrInsert( ESCHER_Persist_Grouping_Logic | mnGroupLevel, mpOutStrm->Tell() );
+ mpOutStrm->WriteInt16( aRect.Top() ).WriteInt16( aRect.Left() ).WriteInt16( aRect.Right() ).WriteInt16( aRect.Bottom() );
+ }
+ else
+ {
+ AddAtom( 16, ESCHER_ChildAnchor );
+ PtReplaceOrInsert( ESCHER_Persist_Grouping_Snap | mnGroupLevel, mpOutStrm->Tell() );
+ mpOutStrm ->WriteInt32( aRect.Left() )
+ .WriteInt32( aRect.Top() )
+ .WriteInt32( aRect.Right() )
+ .WriteInt32( aRect.Bottom() );
+ }
+ }
+ if ( pClientData )
+ {
+ sal_uInt32 nSize = pClientData->TellEnd();
+ if ( nSize )
+ {
+ mpOutStrm->WriteUInt32( ( ESCHER_ClientData << 16 ) | 0xf )
+ .WriteUInt32( nSize );
+ mpOutStrm->WriteBytes(pClientData->GetData(), nSize);
+ }
+ }
+ CloseContainer(); // ESCHER_SpContainer
+ }
+ mnGroupLevel++;
+ return nShapeId;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/escherex.hxx b/sd/source/filter/eppt/escherex.hxx
new file mode 100644
index 000000000..8f64419f4
--- /dev/null
+++ b/sd/source/filter/eppt/escherex.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+#include <filter/msfilter/escherex.hxx>
+
+/// Values for the sal_uLong in PPT_PST_TextHeaderAtom.
+enum PPT_TextHeader
+{
+ PPTTH_TITLE,
+ PPTTH_BODY,
+ PPTTH_NOTES,
+ PPTTH_NOTUSED,
+ PPTTH_OTHER, ///< Text in a Shape
+ PPTTH_CENTERBODY, ///< Subtitle in Title-Slide
+ PPTTH_CENTERTITLE, ///< Title in Title-Slide
+ PPTTH_HALFBODY, ///< Body in two-column slide
+ PPTTH_QUARTERBODY ///< Body in four-body slide
+};
+
+class PptEscherEx : public EscherEx
+{
+ sal_uInt32 ImplDggContainerSize();
+ void ImplWriteDggContainer( SvStream& rSt );
+
+ static sal_uInt32 ImplOptAtomSize();
+ static void ImplWriteOptAtom( SvStream& rSt );
+
+ static sal_uInt32 ImplSplitMenuColorsAtomSize();
+ static void ImplWriteSplitMenuColorsAtom( SvStream& rSt );
+
+ public:
+
+ PptEscherEx( SvStream& rOut, const OUString& );
+ virtual ~PptEscherEx() override;
+
+ void OpenContainer( sal_uInt16 n_EscherContainer, int nRecInstance = 0 ) override;
+ void CloseContainer() override;
+
+ sal_uInt32 EnterGroup( ::tools::Rectangle const * pBoundRect, SvMemoryStream* pClientData );
+
+ sal_uInt32 DrawingGroupContainerSize();
+ void WriteDrawingGroupContainer( SvStream& rSt );
+
+ using EscherEx::EnterGroup;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/grouptable.hxx b/sd/source/filter/eppt/grouptable.hxx
new file mode 100644
index 000000000..885f95741
--- /dev/null
+++ b/sd/source/filter/eppt/grouptable.hxx
@@ -0,0 +1,69 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/container/XIndexAccess.hpp>
+#include <memory>
+#include <vector>
+
+struct GroupEntry
+{
+ sal_uInt32 mnCurrentPos;
+ sal_uInt32 mnCount;
+ css::uno::Reference< css::container::XIndexAccess > mXIndexAccess;
+
+ explicit GroupEntry( css::uno::Reference< css::container::XIndexAccess > const & rIndex )
+ : mnCurrentPos(0),
+ mnCount(rIndex->getCount()),
+ mXIndexAccess(rIndex)
+ {
+ };
+
+ explicit GroupEntry( sal_uInt32 nCount )
+ : mnCurrentPos(0),
+ mnCount(nCount)
+ {
+ };
+};
+
+class GroupTable
+{
+ protected:
+
+ sal_uInt32 mnIndex;
+ sal_uInt32 mnGroupsClosed;
+ std::vector<GroupEntry> mvGroupEntry;
+
+ public:
+
+ sal_uInt32 GetCurrentGroupIndex() const { return mnIndex; };
+ sal_Int32 GetCurrentGroupLevel() const { return mvGroupEntry.size() - 1; };
+ const css::uno::Reference< css::container::XIndexAccess > &
+ GetCurrentGroupAccess() const { return mvGroupEntry.back().mXIndexAccess; };
+ sal_uInt32 GetGroupsClosed();
+ void ResetGroupTable( sal_uInt32 nCount );
+ void ClearGroupTable();
+ bool EnterGroup( css::uno::Reference< css::container::XIndexAccess > const & rIndex );
+ bool GetNextGroupEntry();
+ GroupTable();
+ ~GroupTable();
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptexanimations.cxx b/sd/source/filter/eppt/pptexanimations.cxx
new file mode 100644
index 000000000..99fe0b443
--- /dev/null
+++ b/sd/source/filter/eppt/pptexanimations.cxx
@@ -0,0 +1,2150 @@
+/* -*- 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 <com/sun/star/animations/XAnimationNodeSupplier.hpp>
+#include <com/sun/star/animations/AnimationFill.hpp>
+#include <com/sun/star/animations/AnimationRestart.hpp>
+#include <com/sun/star/animations/Timing.hpp>
+#include <com/sun/star/animations/Event.hpp>
+#include <com/sun/star/animations/AnimationEndSync.hpp>
+#include <com/sun/star/animations/EventTrigger.hpp>
+#include <com/sun/star/presentation/EffectNodeType.hpp>
+#include <com/sun/star/presentation/EffectPresetClass.hpp>
+#include <com/sun/star/animations/AnimationNodeType.hpp>
+#include <com/sun/star/animations/AnimationTransformType.hpp>
+#include <com/sun/star/animations/AnimationCalcMode.hpp>
+#include <com/sun/star/util/XCloneable.hpp>
+#include <com/sun/star/animations/AnimationAdditiveMode.hpp>
+#include <com/sun/star/animations/XAnimateSet.hpp>
+#include <com/sun/star/animations/XAudio.hpp>
+#include <com/sun/star/animations/XTransitionFilter.hpp>
+#include <com/sun/star/animations/XAnimateColor.hpp>
+#include <com/sun/star/animations/XAnimateMotion.hpp>
+#include <com/sun/star/animations/XAnimateTransform.hpp>
+#include <com/sun/star/animations/ValuePair.hpp>
+#include <com/sun/star/animations/AnimationColorSpace.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/drawing/LineStyle.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
+#include <com/sun/star/awt/FontUnderline.hpp>
+#include <com/sun/star/awt/FontSlant.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/presentation/ParagraphTarget.hpp>
+#include <com/sun/star/text/XSimpleText.hpp>
+#include <com/sun/star/animations/XIterateContainer.hpp>
+#include <com/sun/star/presentation/TextAnimationType.hpp>
+
+#include <oox/ppt/pptfilterhelpers.hxx>
+#include "pptexanimations.hxx"
+#include "pptexsoundcollection.hxx"
+#include "../ppt/pptanimations.hxx"
+#include <filter/msfilter/escherex.hxx>
+#include <osl/diagnose.h>
+#include <tools/debug.hxx>
+#include <tools/diagnose_ex.h>
+#include <o3tl/string_view.hxx>
+
+#include <algorithm>
+
+using ::com::sun::star::uno::Any;
+using ::com::sun::star::util::XCloneable;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::UNO_QUERY;
+using ::com::sun::star::uno::UNO_QUERY_THROW;
+using ::com::sun::star::uno::Sequence;
+using ::com::sun::star::uno::Exception;
+using ::com::sun::star::beans::NamedValue;
+using ::com::sun::star::container::XEnumerationAccess;
+using ::com::sun::star::container::XEnumeration;
+
+using namespace ::com::sun::star::text;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::animations;
+using namespace ::com::sun::star::presentation;
+
+namespace ppt
+{
+
+static void ImplTranslateAttribute( OUString& rString, const TranslateMode eTranslateMode )
+{
+ if ( eTranslateMode == TRANSLATE_NONE )
+ return;
+
+ if ( ( eTranslateMode & TRANSLATE_VALUE ) || ( eTranslateMode & TRANSLATE_ATTRIBUTE ) )
+ {
+ const oox::ppt::ImplAttributeNameConversion* p = oox::ppt::getAttributeConversionList();
+ while( p->mpAPIName )
+ {
+ if( rString.equalsAscii( p->mpAPIName ) )
+ break;
+ p++;
+ }
+ if( p->mpMSName )
+ {
+ if ( eTranslateMode & TRANSLATE_VALUE )
+ {
+ rString = "#";
+ rString += OUString::createFromAscii( p->mpMSName );
+ }
+ else
+ rString = OUString::createFromAscii( p->mpMSName );
+ }
+ }
+ else if ( eTranslateMode & TRANSLATE_MEASURE )
+ {
+ const char* pDest[] = { "#ppt_x", "#ppt_y", "#ppt_w", "#ppt_h", nullptr };
+ const char* pSource[] = { "x", "y", "width", "height", nullptr };
+ sal_Int32 nIndex = 0;
+
+ const char** ps = pSource;
+ const char** pd = pDest;
+
+ while( *ps )
+ {
+ const OUString aSearch( OUString::createFromAscii( *ps ) );
+ while( (nIndex = rString.indexOf( aSearch, nIndex )) != -1 )
+ {
+ sal_Int32 nLength = aSearch.getLength();
+ if( nIndex && ( rString[nIndex-1] == '#' ) )
+ {
+ nIndex--;
+ nLength++;
+ }
+
+ const OUString aNew( OUString::createFromAscii( *pd ) );
+ rString = rString.replaceAt( nIndex, nLength, aNew );
+ nIndex += aNew.getLength();
+ }
+ ps++;
+ pd++;
+ }
+ }
+}
+
+sal_uInt32 AnimationExporter::TranslatePresetSubType( const sal_uInt32 nPresetClass, const sal_uInt32 nPresetId, std::u16string_view rPresetSubType )
+{
+ sal_uInt32 nPresetSubType = 0;
+ bool bTranslated = false;
+
+ if ( ( nPresetClass == sal_uInt32(EffectPresetClass::ENTRANCE) ) || ( nPresetClass == sal_uInt32(EffectPresetClass::EXIT) ) )
+ {
+ if ( nPresetId != 21 )
+ {
+ switch( nPresetId )
+ {
+ case 5 :
+ {
+ if ( rPresetSubType == u"downward" )
+ {
+ nPresetSubType = 5;
+ bTranslated = true;
+ }
+ else if ( rPresetSubType == u"across" )
+ {
+ nPresetSubType = 10;
+ bTranslated = true;
+ }
+ }
+ break;
+ case 17 :
+ {
+ if ( rPresetSubType == u"across" )
+ {
+ nPresetSubType = 10;
+ bTranslated = true;
+ }
+ }
+ break;
+ case 18 :
+ {
+ if ( rPresetSubType == u"right-to-top" )
+ {
+ nPresetSubType = 3;
+ bTranslated = true;
+ }
+ else if ( rPresetSubType == u"right-to-bottom" )
+ {
+ nPresetSubType = 6;
+ bTranslated = true;
+ }
+ else if ( rPresetSubType == u"left-to-top" )
+ {
+ nPresetSubType = 9;
+ bTranslated = true;
+ }
+ else if ( rPresetSubType == u"left-to-bottom" )
+ {
+ nPresetSubType = 12;
+ bTranslated = true;
+ }
+ }
+ break;
+ }
+ }
+ if ( !bTranslated )
+ {
+ const oox::ppt::convert_subtype* p = oox::ppt::convert_subtype::getList();
+ while( p->mpStrSubType )
+ {
+ if ( o3tl::equalsAscii( rPresetSubType, p->mpStrSubType ) )
+ {
+ nPresetSubType = p->mnID;
+ bTranslated = true;
+ break;
+ }
+ p++;
+ }
+ }
+ }
+ if ( !bTranslated )
+ nPresetSubType = o3tl::toUInt32(rPresetSubType);
+ return nPresetSubType;
+}
+
+const char* AnimationExporter::FindTransitionName( const sal_Int16 nType, const sal_Int16 nSubType, const bool bDirection )
+{
+ const char* pRet = nullptr;
+ int nFit = 0;
+
+ const oox::ppt::transition* p = oox::ppt::transition::getList();
+ while( p->mpName )
+ {
+ int nF = 0;
+ if ( nType == p->mnType )
+ nF += 4;
+ if ( nSubType == p->mnSubType )
+ nF += 2;
+ if ( bDirection == p->mbDirection )
+ nF += 1;
+ if ( nF > nFit )
+ {
+ pRet = p->mpName;
+ nFit = nF;
+ }
+ if ( nFit == 7 ) // maximum
+ break;
+ p++;
+ }
+ return pRet;
+}
+
+SvStream& WriteAnimationNode(SvStream& rOut, AnimationNode const & rNode )
+{
+ rOut.WriteInt32( rNode.mnU1 );
+ rOut.WriteInt32( rNode.mnRestart );
+ rOut.WriteInt32( rNode.mnGroupType );
+ rOut.WriteInt32( rNode.mnFill );
+ rOut.WriteInt32( rNode.mnU3 );
+ rOut.WriteInt32( rNode.mnU4 );
+ rOut.WriteInt32( rNode.mnDuration );
+ rOut.WriteInt32( rNode.mnNodeType );
+
+ return rOut;
+}
+
+AnimationExporter::AnimationExporter( const EscherSolverContainer& rSolverContainer, ppt::ExSoundCollection& rExSoundCollection ) :
+ mrSolverContainer ( rSolverContainer ),
+ mrExSoundCollection ( rExSoundCollection ),
+ mnCurrentGroup(0)
+{
+}
+
+sal_Int16 AnimationExporter::GetFillMode( const Reference< XAnimationNode >& xNode, const sal_Int16 nFillDefault )
+{
+ sal_Int16 nFill = xNode->getFill();
+ //#i119699 <Animation> The animation effect "Emphasis->FlashBulb" play incorrectly in Aoo saves a .ppt to another .ppt and plays the saved one.
+ //#i119740 <Animation> The animation effect "Entrance->Flash Once" fails to play in Aoo while Aoo saves a .ppt to another .ppt and plays the saved one.
+ if ((xNode->getType() == AnimationNodeType::ANIMATE)
+ ||(xNode->getType() == AnimationNodeType::SET)
+ ||(xNode->getType() == AnimationNodeType::TRANSITIONFILTER))
+ {
+ if ( nFill == AnimationFill::DEFAULT )
+ return nFill;
+ }
+
+ if ( nFill == AnimationFill::DEFAULT )
+ {
+ nFill = nFillDefault;
+ }
+ if( nFill == AnimationFill::AUTO )
+ {
+ nFill = AnimationFill::REMOVE;
+ bool bIsIndefiniteTiming = true;
+ Any aAny = xNode->getDuration();
+ if( aAny.hasValue() )
+ {
+ Timing eTiming;
+ if( aAny >>= eTiming )
+ bIsIndefiniteTiming = eTiming == Timing_INDEFINITE;
+ }
+ if ( bIsIndefiniteTiming )
+ {
+ aAny = xNode->getEnd();
+ if( aAny.hasValue() )
+ {
+ Timing eTiming;
+ if( aAny >>= eTiming )
+ bIsIndefiniteTiming = eTiming == Timing_INDEFINITE;
+ }
+ if ( bIsIndefiniteTiming )
+ {
+ if ( !xNode->getRepeatCount().hasValue() )
+ {
+ aAny = xNode->getRepeatDuration();
+ if( aAny.hasValue() )
+ {
+ Timing eTiming;
+ if( aAny >>= eTiming )
+ bIsIndefiniteTiming = eTiming == Timing_INDEFINITE;
+ }
+ if ( bIsIndefiniteTiming )
+ nFill = AnimationFill::FREEZE;
+ }
+ }
+ }
+ }
+ return nFill;
+}
+
+void AnimationExporter::doexport( const Reference< XDrawPage >& xPage, SvStream& rStrm )
+{
+ Reference< XAnimationNodeSupplier > xNodeSupplier( xPage, UNO_QUERY );
+ if( xNodeSupplier.is() )
+ {
+ const Reference< XAnimationNode > xRootNode( xNodeSupplier->getAnimationNode() );
+ if( xRootNode.is() )
+ {
+ processAfterEffectNodes( xRootNode );
+ exportNode( rStrm, xRootNode, DFF_msofbtAnimGroup, 1, 0, false, AnimationFill::AUTO );
+ }
+ }
+}
+
+void AnimationExporter::processAfterEffectNodes( const Reference< XAnimationNode >& xRootNode )
+{
+ try
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( xRootNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), css::uno::UNO_SET_THROW );
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
+
+ Reference< XEnumerationAccess > xEnumerationAccess2( xNode, UNO_QUERY );
+ if ( xEnumerationAccess2.is() )
+ {
+ Reference< XEnumeration > xEnumeration2( xEnumerationAccess2->createEnumeration(), css::uno::UNO_SET_THROW );
+ while( xEnumeration2->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration2->nextElement(), UNO_QUERY_THROW );
+
+ Reference< XEnumerationAccess > xEnumerationAccess3( xChildNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration3( xEnumerationAccess3->createEnumeration(), css::uno::UNO_SET_THROW );
+ while( xEnumeration3->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode2( xEnumeration3->nextElement(), UNO_QUERY_THROW );
+
+ Reference< XEnumerationAccess > xEnumerationAccess4( xChildNode2, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration4( xEnumerationAccess4->createEnumeration(), css::uno::UNO_SET_THROW );
+ while( xEnumeration4->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode3( xEnumeration4->nextElement(), UNO_QUERY_THROW );
+
+ switch( xChildNode3->getType() )
+ {
+ // found an after effect
+ case AnimationNodeType::SET:
+ case AnimationNodeType::ANIMATECOLOR:
+ {
+ Reference< XAnimationNode > xMaster;
+
+ const Sequence< NamedValue > aUserData( xChildNode3->getUserData() );
+ const NamedValue* p = std::find_if(aUserData.begin(), aUserData.end(),
+ [](const NamedValue& rProp) { return rProp.Name == "master-element"; });
+
+ if (p != aUserData.end())
+ p->Value >>= xMaster;
+
+ AfterEffectNodePtr pAfterEffectNode = std::make_shared<AfterEffectNode>( xChildNode3, xMaster );
+ maAfterEffectNodes.push_back( pAfterEffectNode );
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "(@CL)AnimationExporter::processAfterEffectNodes()" );
+ }
+}
+
+bool AnimationExporter::isAfterEffectNode( const Reference< XAnimationNode >& xNode ) const
+{
+ return std::any_of(maAfterEffectNodes.begin(), maAfterEffectNodes.end(),
+ [&xNode](const AfterEffectNodePtr& rxNode) { return rxNode->mxNode == xNode; });
+}
+
+bool AnimationExporter::hasAfterEffectNode( const Reference< XAnimationNode >& xNode, Reference< XAnimationNode >& xAfterEffectNode ) const
+{
+ auto aIter = std::find_if(maAfterEffectNodes.begin(), maAfterEffectNodes.end(),
+ [&xNode](const AfterEffectNodePtr& rxNode) { return rxNode->mxMaster == xNode; });
+ if (aIter != maAfterEffectNodes.end())
+ {
+ xAfterEffectNode = (*aIter)->mxNode;
+ return true;
+ }
+
+ return false;
+}
+
+// check if this group only contain empty groups. this may happen when
+// after effect nodes are not exported at their original position
+bool AnimationExporter::isEmptyNode( const Reference< XAnimationNode >& xNode ) const
+{
+ if( xNode.is() ) switch( xNode->getType() )
+ {
+ case AnimationNodeType::PAR :
+ case AnimationNodeType::SEQ :
+ case AnimationNodeType::ITERATE :
+ {
+ Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY );
+ if( xChildNode.is() && !isEmptyNode( xChildNode ) )
+ return false;
+ }
+ }
+ }
+ }
+ break;
+
+ case AnimationNodeType::SET :
+ case AnimationNodeType::ANIMATECOLOR :
+ return isAfterEffectNode( xNode );
+ default:
+ return false;
+ }
+
+ return true;
+}
+
+void AnimationExporter::exportNode( SvStream& rStrm, Reference< XAnimationNode > const & xNode_in, const sal_uInt16 nContainerRecType,
+ const sal_uInt16 nInstance, const sal_Int32 nGroupLevel, const bool bTakeBackInteractiveSequenceTiming, const sal_Int16 nFDef )
+{
+ auto xNode = xNode_in;
+
+ if( (nGroupLevel == 4) && isEmptyNode( xNode ) )
+ return;
+
+ if ( ( nContainerRecType == DFF_msofbtAnimGroup ) && ( nGroupLevel == 2 ) && isEmptyNode( xNode ) )
+ return;
+
+ if( nContainerRecType == DFF_msofbtAnimGroup )
+ mnCurrentGroup++;
+
+ bool bTakeBackInteractiveSequenceTimingForChild = false;
+ sal_Int16 nFillDefault = GetFillMode( xNode, nFDef );
+
+ Reference< XAnimationNode > xAudioNode;
+ static sal_uInt32 nAudioGroup;
+
+ {
+ bool bSkipChildren = false;
+ EscherExContainer aContainer( rStrm, nContainerRecType, nInstance );
+ switch( xNode->getType() )
+ {
+ case AnimationNodeType::CUSTOM :
+ {
+ exportAnimNode( rStrm, xNode, nFillDefault );
+ exportAnimPropertySet( rStrm, xNode );
+ exportAnimEvent( rStrm, xNode );
+ exportAnimValue( rStrm, xNode, false );
+ }
+ break;
+
+ case AnimationNodeType::PAR :
+ {
+ exportAnimNode( rStrm, xNode, nFillDefault );
+ exportAnimPropertySet( rStrm, xNode );
+ sal_Int32 nFlags = nGroupLevel == 2 ? 0x10 : 0;
+ if ( bTakeBackInteractiveSequenceTiming )
+ nFlags |= 0x40;
+ exportAnimEvent( rStrm, xNode, nFlags );
+ exportAnimValue( rStrm, xNode, nGroupLevel == 4 );
+ }
+ break;
+
+ case AnimationNodeType::SEQ :
+ {
+ exportAnimNode( rStrm, xNode, nFillDefault );
+ sal_Int16 nNodeType = exportAnimPropertySet( rStrm, xNode );
+ sal_Int32 nFlags = 12;
+ if ( ( nGroupLevel == 1 ) && ( nNodeType == css::presentation::EffectNodeType::INTERACTIVE_SEQUENCE ) )
+ {
+ nFlags |= 0x20;
+ bTakeBackInteractiveSequenceTimingForChild = true;
+ }
+ exportAnimAction( rStrm, xNode );
+ exportAnimEvent( rStrm, xNode, nFlags );
+ exportAnimValue( rStrm, xNode, false );
+ }
+ break;
+
+ case AnimationNodeType::ITERATE :
+ {
+ {
+ EscherExAtom aAnimNodeExAtom( rStrm, DFF_msofbtAnimNode );
+ AnimationNode aAnim;
+ aAnim.mnGroupType = mso_Anim_GroupType_PAR;
+ aAnim.mnNodeType = 1;
+ // attribute Restart
+ switch( xNode->getRestart() )
+ {
+ default:
+ case AnimationRestart::DEFAULT : aAnim.mnRestart = 0; break;
+ case AnimationRestart::ALWAYS : aAnim.mnRestart = 1; break;
+ case AnimationRestart::WHEN_NOT_ACTIVE : aAnim.mnRestart = 2; break;
+ case AnimationRestart::NEVER : aAnim.mnRestart = 3; break;
+ }
+ // attribute Fill
+ switch( xNode->getFill() )
+ {
+ default:
+ case AnimationFill::DEFAULT : aAnim.mnFill = 0; break;
+ case AnimationFill::REMOVE : aAnim.mnFill = 1; break;
+ case AnimationFill::FREEZE : aAnim.mnFill = 2; break;
+ case AnimationFill::HOLD : aAnim.mnFill = 3; break;
+ case AnimationFill::TRANSITION : aAnim.mnFill = 4; break;
+ }
+ WriteAnimationNode( rStrm, aAnim );
+ }
+ exportIterate( rStrm, xNode );
+ exportAnimPropertySet( rStrm, xNode );
+ exportAnimEvent( rStrm, xNode );
+ exportAnimValue( rStrm, xNode, false );
+ }
+ break;
+
+ case AnimationNodeType::ANIMATE :
+ {
+ exportAnimNode( rStrm, xNode, nFillDefault );
+ exportAnimPropertySet( rStrm, xNode );
+ exportAnimEvent( rStrm, xNode );
+ exportAnimValue( rStrm, xNode, false );
+ exportAnimate( rStrm, xNode );
+ }
+ break;
+
+ case AnimationNodeType::SET :
+ {
+ bool bIsAfterEffectNode( isAfterEffectNode( xNode ) );
+ if( (nGroupLevel != 4) || !bIsAfterEffectNode )
+ {
+ exportAnimNode( rStrm, xNode, nFillDefault );
+ exportAnimPropertySet( rStrm, xNode );
+ exportAnimateSet( rStrm, xNode, bIsAfterEffectNode ? AFTEREFFECT_SET : AFTEREFFECT_NONE );
+ exportAnimEvent( rStrm, xNode );
+ exportAnimValue( rStrm, xNode, false );
+ }
+ else
+ {
+ bSkipChildren = true;
+ }
+ }
+ break;
+
+ case AnimationNodeType::ANIMATEMOTION :
+ {
+ exportAnimNode( rStrm, xNode, nFillDefault );
+ exportAnimPropertySet( rStrm, xNode );
+ exportAnimateMotion( rStrm, xNode );
+ exportAnimEvent( rStrm, xNode );
+ exportAnimValue( rStrm, xNode, false );
+ }
+ break;
+
+ case AnimationNodeType::ANIMATECOLOR :
+ {
+ bool bIsAfterEffectNode( isAfterEffectNode( xNode ) );
+ if( (nGroupLevel != 4) || !bIsAfterEffectNode )
+ {
+ if( bIsAfterEffectNode )
+ xNode = createAfterEffectNodeClone( xNode );
+
+ exportAnimNode( rStrm, xNode, nFillDefault );
+ exportAnimPropertySet( rStrm, xNode );
+ exportAnimateColor( rStrm, xNode, bIsAfterEffectNode ? AFTEREFFECT_COLOR : AFTEREFFECT_NONE );
+ exportAnimEvent( rStrm, xNode );
+ exportAnimValue( rStrm, xNode, false );
+ }
+ else
+ {
+ bSkipChildren = true;
+ }
+ }
+ break;
+
+ case AnimationNodeType::ANIMATETRANSFORM :
+ {
+ exportAnimNode( rStrm, xNode, nFillDefault );
+ exportAnimPropertySet( rStrm, xNode );
+ exportAnimateTransform( rStrm, xNode );
+ exportAnimEvent( rStrm, xNode );
+ exportAnimValue( rStrm, xNode, false );
+ }
+ break;
+
+ case AnimationNodeType::TRANSITIONFILTER :
+ {
+ exportAnimNode( rStrm, xNode, nFillDefault );
+ exportAnimPropertySet( rStrm, xNode );
+ exportAnimEvent( rStrm, xNode );
+ exportAnimValue( rStrm, xNode, false );
+ exportTransitionFilter( rStrm, xNode );
+ }
+ break;
+
+ case AnimationNodeType::AUDIO : // #i58428#
+ {
+ exportAnimNode( rStrm, xNode, nFillDefault );
+ exportAnimPropertySet( rStrm, xNode );
+
+ Reference< XAudio > xAudio( xNode, UNO_QUERY );
+ if( xAudio.is() )
+ {
+ Any aAny( xAudio->getSource() );
+ OUString aURL;
+
+ if ( ( aAny >>= aURL) && !aURL.isEmpty() )
+ {
+ sal_Int32 nU1 = 2;
+ sal_Int32 nTrigger = 3;
+ sal_Int32 nU3 = nAudioGroup;
+ sal_Int32 nBegin = 0;
+ {
+ EscherExContainer aAnimEvent( rStrm, DFF_msofbtAnimEvent, 1 );
+ {
+ EscherExAtom aAnimTrigger( rStrm, DFF_msofbtAnimTrigger );
+ rStrm.WriteInt32( nU1 ).WriteInt32( nTrigger ).WriteInt32( nU3 ).WriteInt32( nBegin );
+ }
+ }
+ nU1 = 1;
+ nTrigger = 0xb;
+ nU3 = 0;
+ {
+ EscherExContainer aAnimEvent( rStrm, DFF_msofbtAnimEvent, 2 );
+ {
+ EscherExAtom aAnimTrigger( rStrm, DFF_msofbtAnimTrigger );
+ rStrm.WriteInt32( nU1 ).WriteInt32( nTrigger ).WriteInt32( nU3 ).WriteInt32( nBegin );
+ }
+ }
+ EscherExContainer aAnimateTargetElement( rStrm, DFF_msofbtAnimateTargetElement );
+ {
+ sal_uInt32 const nRefMode = 3;
+ sal_uInt32 const nRefType = 2;
+ sal_uInt32 nRefId = mrExSoundCollection.GetId( aURL );
+ sal_Int32 const begin = -1;
+ sal_Int32 const end = -1;
+
+ EscherExAtom aAnimReference( rStrm, DFF_msofbtAnimReference );
+ rStrm.WriteUInt32( nRefMode ).WriteUInt32( nRefType ).WriteUInt32( nRefId ).WriteInt32( begin ).WriteInt32( end );
+ }
+ }
+ }
+ exportAnimValue( rStrm, xNode, false );
+ }
+ break;
+ }
+ if( !bSkipChildren )
+ {
+ // export after effect node if one exists for this node
+ Reference< XAnimationNode > xAfterEffectNode;
+ if( hasAfterEffectNode( xNode, xAfterEffectNode ) )
+ {
+ exportNode( rStrm, xAfterEffectNode, DFF_msofbtAnimSubGoup, 1, nGroupLevel + 1, bTakeBackInteractiveSequenceTimingForChild, nFillDefault );
+ }
+
+ Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY );
+ if( xChildNode.is() )
+ {
+ if ( xChildNode->getType() == AnimationNodeType::AUDIO )
+ {
+ xAudioNode = xChildNode;
+ nAudioGroup = mnCurrentGroup;
+ }
+ else
+ exportNode( rStrm, xChildNode, DFF_msofbtAnimGroup, 1, nGroupLevel + 1, bTakeBackInteractiveSequenceTimingForChild, nFillDefault );
+ }
+ }
+ }
+ }
+ }
+ }
+ if ( xAudioNode.is() )
+ exportNode( rStrm, xAudioNode, DFF_msofbtAnimGroup, 1, nGroupLevel, bTakeBackInteractiveSequenceTimingForChild, nFillDefault );
+
+ if( xNode->getType() == AnimationNodeType::ITERATE )
+ aTarget = Any();
+}
+
+Reference< XAnimationNode > AnimationExporter::createAfterEffectNodeClone( const Reference< XAnimationNode >& xNode )
+{
+ try
+ {
+ Reference< css::util::XCloneable > xClonable( xNode, UNO_QUERY_THROW );
+ Reference< XAnimationNode > xCloneNode( xClonable->createClone(), UNO_QUERY_THROW );
+
+ Any aEmpty;
+ xCloneNode->setBegin( aEmpty );
+
+ return xCloneNode;
+ }
+ catch( Exception& )
+ {
+ OSL_FAIL("(@CL)sd::ppt::AnimationExporter::createAfterEffectNodeClone(), could not create clone!" );
+ }
+ return xNode;
+}
+
+bool AnimationExporter::GetNodeType( const Reference< XAnimationNode >& xNode, sal_Int16& nType )
+{
+ // trying to get the nodetype
+ const Sequence< NamedValue > aUserData = xNode->getUserData();
+ for( const NamedValue& rProp : aUserData )
+ {
+ if ( rProp.Name == "node-type" )
+ {
+ if ( rProp.Value >>= nType )
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void AnimationExporter::exportAnimNode( SvStream& rStrm, const Reference< XAnimationNode >& xNode,
+ const sal_Int16 nFillDefault )
+{
+ EscherExAtom aAnimNodeExAtom( rStrm, DFF_msofbtAnimNode );
+ AnimationNode aAnim;
+
+ // attribute Restart
+ switch( xNode->getRestart() )
+ {
+ default:
+ case AnimationRestart::DEFAULT : aAnim.mnRestart = 0; break;
+ case AnimationRestart::ALWAYS : aAnim.mnRestart = 1; break;
+ case AnimationRestart::WHEN_NOT_ACTIVE : aAnim.mnRestart = 2; break;
+ case AnimationRestart::NEVER : aAnim.mnRestart = 3; break;
+ }
+
+ switch( nFillDefault )
+ {
+ default:
+ case AnimationFill::DEFAULT : aAnim.mnFill = 0; break;
+ case AnimationFill::REMOVE : aAnim.mnFill = 1; break;
+ case AnimationFill::FREEZE :
+ case AnimationFill::HOLD : aAnim.mnFill = 3; break;
+ case AnimationFill::TRANSITION : aAnim.mnFill = 4; break;
+ }
+ // attribute Duration
+ double fDuration = 0.0;
+ css::animations::Timing eTiming;
+ if ( xNode->getDuration() >>= eTiming )
+ {
+ if ( eTiming == Timing_INDEFINITE )
+ aAnim.mnDuration = -1;
+ }
+ else if ( xNode->getDuration() >>= fDuration )
+ {
+ aAnim.mnDuration = static_cast<sal_Int32>( fDuration * 1000.0 );
+ }
+ else
+ aAnim.mnDuration = -1;
+
+ // NodeType, NodeGroup
+ aAnim.mnNodeType = 1;
+ aAnim.mnGroupType = mso_Anim_GroupType_SEQ;
+ switch( xNode->getType() )
+ {
+ case AnimationNodeType::PAR :
+ aAnim.mnGroupType = mso_Anim_GroupType_PAR;
+ [[fallthrough]];
+ case AnimationNodeType::SEQ :
+ {
+ sal_Int16 nType = 0;
+ if( GetNodeType( xNode, nType ) )
+ switch( nType )
+ {
+ case css::presentation::EffectNodeType::TIMING_ROOT : aAnim.mnNodeType = 0x12; break;
+ case css::presentation::EffectNodeType::MAIN_SEQUENCE : aAnim.mnNodeType = 0x18; break;
+ }
+ }
+ break;
+
+ case AnimationNodeType::ANIMATE :
+ case AnimationNodeType::SET :
+
+ case AnimationNodeType::CUSTOM :
+ case AnimationNodeType::ITERATE :
+ case AnimationNodeType::ANIMATEMOTION :
+ case AnimationNodeType::ANIMATECOLOR :
+ case AnimationNodeType::ANIMATETRANSFORM :
+ {
+ aAnim.mnGroupType = mso_Anim_GroupType_NODE;
+ aAnim.mnNodeType = mso_Anim_Behaviour_ANIMATION;
+ }
+ break;
+
+ case AnimationNodeType::AUDIO :
+ {
+ aAnim.mnGroupType = mso_Anim_GroupType_MEDIA;
+ aAnim.mnNodeType = mso_Anim_Behaviour_ANIMATION;
+ }
+ break;
+
+ case AnimationNodeType::TRANSITIONFILTER :
+ {
+ aAnim.mnGroupType = mso_Anim_GroupType_NODE;
+ aAnim.mnNodeType = mso_Anim_Behaviour_FILTER;
+ }
+ break;
+ }
+
+ WriteAnimationNode( rStrm, aAnim );
+}
+
+void AnimationExporter::GetUserData( const Sequence< NamedValue >& rUserData, const Any ** pAny, std::size_t nLen )
+{
+ // storing user data into pAny, to allow direct access later
+ memset( pAny, 0, nLen );
+ if ( !rUserData.hasElements() )
+ return;
+
+ for( const NamedValue& rProp : rUserData )
+ {
+ if ( rProp.Name == "node-type" )
+ {
+ pAny[ DFF_ANIM_NODE_TYPE ] = &(rProp.Value);
+ }
+ else if ( rProp.Name == "preset-class" )
+ {
+ pAny[ DFF_ANIM_PRESET_CLASS ] = &(rProp.Value);
+ }
+ else if ( rProp.Name == "preset-id" )
+ {
+ pAny[ DFF_ANIM_PRESET_ID ] = &(rProp.Value);
+ }
+ else if ( rProp.Name == "preset-sub-type" )
+ {
+ pAny[ DFF_ANIM_PRESET_SUB_TYPE ] = &(rProp.Value);
+ }
+ else if ( rProp.Name == "master-element" )
+ {
+ pAny[ DFF_ANIM_AFTEREFFECT ] = &(rProp.Value);
+ }
+ }
+}
+
+sal_uInt32 AnimationExporter::GetPresetID( const OUString& rPreset, sal_uInt32 nAPIPresetClass, bool& bPresetId )
+{
+ sal_uInt32 nPresetId = 0;
+ bPresetId = false;
+
+ if ( rPreset.match("ppt_", 0) )
+ {
+ sal_Int32 nLast = rPreset.lastIndexOf( '_' );
+ if ( ( nLast != -1 ) && ( ( nLast + 1 ) < rPreset.getLength() ) )
+ {
+ std::u16string_view aNumber( rPreset.subView( nLast + 1 ) );
+ nPresetId = o3tl::toUInt32(aNumber);
+ bPresetId = true;
+ }
+ }
+ else
+ {
+ const oox::ppt::preset_mapping* p = oox::ppt::preset_mapping::getList();
+ while( p->mpStrPresetId && ((p->mnPresetClass != static_cast<sal_Int32>(nAPIPresetClass)) || !rPreset.equalsAscii( p->mpStrPresetId )) )
+ p++;
+
+ if( p->mpStrPresetId )
+ {
+ nPresetId = p->mnPresetId;
+ bPresetId = true;
+ }
+ }
+
+ return nPresetId;
+}
+
+sal_Int16 AnimationExporter::exportAnimPropertySet( SvStream& rStrm, const Reference< XAnimationNode >& xNode )
+{
+ sal_Int16 nNodeType = css::presentation::EffectNodeType::DEFAULT;
+
+ EscherExContainer aAnimPropertySet( rStrm, DFF_msofbtAnimPropertySet );
+
+ Reference< XAnimationNode > xMaster;
+
+ Any aMasterRel, aOverride, aRunTimeContext;
+
+ // storing user data into pAny, to allow direct access later
+ const Sequence< NamedValue > aUserData = xNode->getUserData();
+ const css::uno::Any* pAny[ DFF_ANIM_PROPERTY_ID_COUNT ];
+ GetUserData( aUserData, pAny, sizeof( pAny ) );
+
+ if( pAny[ DFF_ANIM_AFTEREFFECT ] )
+ ( *pAny[ DFF_ANIM_AFTEREFFECT ] ) >>= xMaster;
+
+ // calculate master-rel
+ if( xMaster.is() )
+ {
+ sal_Int32 nMasterRel = 2;
+ if( xNode.is() && xMaster.is() && (xNode->getParent() == xMaster->getParent() ) )
+ nMasterRel = 0;
+
+ aMasterRel <<= nMasterRel;
+
+ pAny[ DFF_ANIM_MASTERREL ] = &aMasterRel;
+
+ aOverride <<= sal_Int32(1);
+ pAny[ DFF_ANIM_OVERRIDE ] = &aOverride;
+
+ aRunTimeContext <<= sal_Int32(1);
+ pAny[ DFF_ANIM_RUNTIMECONTEXT ] = &aRunTimeContext;
+ }
+
+ // the order is important
+ if ( pAny[ DFF_ANIM_NODE_TYPE ] )
+ {
+ if ( *pAny[ DFF_ANIM_NODE_TYPE ] >>= nNodeType )
+ {
+ sal_uInt32 nPPTNodeType = DFF_ANIM_NODE_TYPE_ON_CLICK;
+ switch( nNodeType )
+ {
+ case css::presentation::EffectNodeType::ON_CLICK : nPPTNodeType = DFF_ANIM_NODE_TYPE_ON_CLICK; break;
+ case css::presentation::EffectNodeType::WITH_PREVIOUS : nPPTNodeType = DFF_ANIM_NODE_TYPE_WITH_PREVIOUS; break;
+ case css::presentation::EffectNodeType::AFTER_PREVIOUS : nPPTNodeType = DFF_ANIM_NODE_TYPE_AFTER_PREVIOUS; break;
+ case css::presentation::EffectNodeType::MAIN_SEQUENCE : nPPTNodeType = DFF_ANIM_NODE_TYPE_MAIN_SEQUENCE; break;
+ case css::presentation::EffectNodeType::TIMING_ROOT : nPPTNodeType = DFF_ANIM_NODE_TYPE_TIMING_ROOT; break;
+ case css::presentation::EffectNodeType::INTERACTIVE_SEQUENCE: nPPTNodeType = DFF_ANIM_NODE_TYPE_INTERACTIVE_SEQ; break;
+ }
+ exportAnimPropertyuInt32( rStrm, DFF_ANIM_NODE_TYPE, nPPTNodeType );
+ }
+ }
+ sal_uInt32 nPresetId = 0;
+ sal_uInt32 nPresetSubType = 0;
+ sal_uInt32 nAPIPresetClass = EffectPresetClass::CUSTOM;
+ sal_uInt32 nPresetClass = DFF_ANIM_PRESS_CLASS_USER_DEFINED;
+ bool bPresetClass, bPresetId, bPresetSubType;
+ bPresetId = bPresetClass = bPresetSubType = false;
+
+ if ( pAny[ DFF_ANIM_PRESET_CLASS ] )
+ {
+ if ( *pAny[ DFF_ANIM_PRESET_CLASS ] >>= nAPIPresetClass )
+ {
+ sal_uInt8 nPPTPresetClass;
+ switch( nAPIPresetClass )
+ {
+ case EffectPresetClass::ENTRANCE : nPPTPresetClass = DFF_ANIM_PRESS_CLASS_ENTRANCE; break;
+ case EffectPresetClass::EXIT : nPPTPresetClass = DFF_ANIM_PRESS_CLASS_EXIT; break;
+ case EffectPresetClass::EMPHASIS : nPPTPresetClass = DFF_ANIM_PRESS_CLASS_EMPHASIS; break;
+ case EffectPresetClass::MOTIONPATH : nPPTPresetClass = DFF_ANIM_PRESS_CLASS_MOTIONPATH; break;
+ case EffectPresetClass::OLEACTION : nPPTPresetClass = DFF_ANIM_PRESS_CLASS_OLE_ACTION; break;
+ case EffectPresetClass::MEDIACALL : nPPTPresetClass = DFF_ANIM_PRESS_CLASS_MEDIACALL; break;
+ default :
+ nPPTPresetClass = DFF_ANIM_PRESS_CLASS_USER_DEFINED;
+ }
+ nPresetClass = nPPTPresetClass;
+ bPresetClass = true;
+ }
+ }
+ if ( pAny[ DFF_ANIM_PRESET_ID ] )
+ {
+ OUString sPreset;
+ if ( *pAny[ DFF_ANIM_PRESET_ID ] >>= sPreset )
+ nPresetId = GetPresetID( sPreset, nAPIPresetClass, bPresetId );
+ }
+
+ if ( pAny[ DFF_ANIM_PRESET_SUB_TYPE ] )
+ {
+ OUString sPresetSubType;
+ if ( *pAny[ DFF_ANIM_PRESET_SUB_TYPE ] >>= sPresetSubType )
+ {
+ nPresetSubType = TranslatePresetSubType( nPresetClass, nPresetId, sPresetSubType );
+ bPresetSubType = true;
+ }
+ }
+ if ( bPresetId )
+ exportAnimPropertyuInt32( rStrm, DFF_ANIM_PRESET_ID, nPresetId );
+ if ( bPresetSubType )
+ exportAnimPropertyuInt32( rStrm, DFF_ANIM_PRESET_SUB_TYPE, nPresetSubType );
+ if ( bPresetClass )
+ exportAnimPropertyuInt32( rStrm, DFF_ANIM_PRESET_CLASS, nPresetClass );
+
+ if ( pAny[ DFF_ANIM_ID ] )
+ {
+ // TODO DFF_ANIM_ID
+ }
+
+ if ( pAny[ DFF_ANIM_AFTEREFFECT ] )
+ {
+ bool bAfterEffect = false;
+ if ( *pAny[ DFF_ANIM_AFTEREFFECT ] >>= bAfterEffect )
+ exportAnimPropertyByte( rStrm, DFF_ANIM_AFTEREFFECT, int(bAfterEffect) );
+ }
+
+ if ( pAny[ DFF_ANIM_RUNTIMECONTEXT ] )
+ {
+ sal_Int32 nRunTimeContext = 0;
+ if ( *pAny[ DFF_ANIM_RUNTIMECONTEXT ] >>= nRunTimeContext )
+ exportAnimPropertyuInt32( rStrm, DFF_ANIM_RUNTIMECONTEXT, nRunTimeContext );
+ }
+ if ( pAny[ DFF_ANIM_PATH_EDIT_MODE ] )
+ {
+ // TODO DFF_ANIM_ID
+ }
+
+ if( !xMaster.is() )
+ {
+ Reference< XAnimateColor > xColor( xNode, UNO_QUERY );
+ if( xColor.is() )
+ {
+
+ bool bDirection = !xColor->getDirection();
+ exportAnimPropertyuInt32( rStrm, DFF_ANIM_DIRECTION, bDirection ? 1 : 0 );
+ }
+ }
+
+ if ( pAny[ DFF_ANIM_OVERRIDE ] )
+ {
+ sal_Int32 nOverride = 0;
+ if ( *pAny[ DFF_ANIM_OVERRIDE ] >>= nOverride )
+ exportAnimPropertyuInt32( rStrm, DFF_ANIM_OVERRIDE, nOverride );
+ }
+
+ if ( pAny[ DFF_ANIM_MASTERREL ] )
+ {
+ sal_Int32 nMasterRel = 0;
+ if ( *pAny[ DFF_ANIM_MASTERREL ] >>= nMasterRel )
+ exportAnimPropertyuInt32( rStrm, DFF_ANIM_MASTERREL, nMasterRel );
+ }
+
+/* todo
+ Reference< XAudio > xAudio( xNode, UNO_QUERY );
+ if( xAudio.is() )
+ {
+ sal_Int16 nEndAfterSlide = 0;
+ nEndAfterSlide = xAudio->getEndAfterSlide();
+ exportAnimPropertyuInt32( rStrm, DFF_ANIM_ENDAFTERSLIDE, nEndAfterSlide, TRANSLATE_NONE );
+ }
+*/
+ Reference< XAnimate > xAnim( xNode, UNO_QUERY );
+ if( xAnim.is() )
+ {
+ // TODO: DFF_ANIM_TIMEFILTER
+ }
+ if ( pAny[ DFF_ANIM_EVENT_FILTER ] )
+ {
+ // TODO DFF_ANIM_EVENT_FILTER
+ }
+ if ( pAny[ DFF_ANIM_VOLUME ] )
+ {
+ // TODO DFF_ANIM_VOLUME
+ }
+ return nNodeType;
+}
+
+bool AnimationExporter::exportAnimProperty( SvStream& rStrm, const sal_uInt16 nPropertyId, const css::uno::Any& rAny, const TranslateMode eTranslateMode )
+{
+ bool bRet = false;
+ if ( rAny.hasValue() )
+ {
+ switch( rAny.getValueType().getTypeClass() )
+ {
+ case css::uno::TypeClass_UNSIGNED_SHORT :
+ case css::uno::TypeClass_SHORT :
+ case css::uno::TypeClass_UNSIGNED_LONG :
+ case css::uno::TypeClass_LONG :
+ {
+ sal_Int32 nVal = 0;
+ if ( rAny >>= nVal )
+ {
+ exportAnimPropertyuInt32( rStrm, nPropertyId, nVal );
+ bRet = true;
+ }
+ }
+ break;
+
+ case css::uno::TypeClass_DOUBLE :
+ {
+ double fVal = 0.0;
+ if ( rAny >>= fVal )
+ {
+ exportAnimPropertyFloat( rStrm, nPropertyId, fVal );
+ bRet = true;
+ }
+ }
+ break;
+ case css::uno::TypeClass_FLOAT :
+ {
+ float fVal = 0.0;
+ if ( rAny >>= fVal )
+ {
+ if ( eTranslateMode & TRANSLATE_NUMBER_TO_STRING )
+ {
+ OUString aNumber( OUString::number( fVal ) );
+ exportAnimPropertyString( rStrm, nPropertyId, aNumber, eTranslateMode );
+ }
+ else
+ {
+ exportAnimPropertyFloat( rStrm, nPropertyId, fVal );
+ bRet = true;
+ }
+ }
+ }
+ break;
+ case css::uno::TypeClass_STRING :
+ {
+ OUString aStr;
+ if ( rAny >>= aStr )
+ {
+ exportAnimPropertyString( rStrm, nPropertyId, aStr, eTranslateMode );
+ bRet = true;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ return bRet;
+}
+void AnimationExporter::exportAnimPropertyString( SvStream& rStrm, const sal_uInt16 nPropertyId, const OUString& rVal, const TranslateMode eTranslateMode )
+{
+ EscherExAtom aExAtom( rStrm, DFF_msofbtAnimAttributeValue, nPropertyId );
+ rStrm.WriteUChar( DFF_ANIM_PROP_TYPE_UNISTRING );
+ OUString aStr( rVal );
+ if ( eTranslateMode != TRANSLATE_NONE )
+ ImplTranslateAttribute( aStr, eTranslateMode );
+ writeZString( rStrm, aStr );
+}
+
+void AnimationExporter::exportAnimPropertyFloat( SvStream& rStrm, const sal_uInt16 nPropertyId, const double& rVal )
+{
+ EscherExAtom aExAtom( rStrm, DFF_msofbtAnimAttributeValue, nPropertyId );
+ float fFloat = static_cast<float>(rVal);
+ rStrm.WriteUChar( DFF_ANIM_PROP_TYPE_FLOAT )
+ .WriteFloat( fFloat );
+}
+
+void AnimationExporter::exportAnimPropertyuInt32( SvStream& rStrm, const sal_uInt16 nPropertyId, const sal_uInt32 nVal )
+{
+ EscherExAtom aExAtom( rStrm, DFF_msofbtAnimAttributeValue, nPropertyId );
+ rStrm.WriteUChar( DFF_ANIM_PROP_TYPE_INT32 )
+ .WriteUInt32( nVal );
+}
+
+void AnimationExporter::exportAnimPropertyByte( SvStream& rStrm, const sal_uInt16 nPropertyId, const sal_uInt8 nVal )
+{
+ EscherExAtom aExAtom( rStrm, DFF_msofbtAnimAttributeValue, nPropertyId );
+ rStrm.WriteUChar( DFF_ANIM_PROP_TYPE_BYTE )
+ .WriteUChar( nVal );
+}
+
+void AnimationExporter::writeZString( SvStream& rStrm, const OUString& rVal )
+{
+ sal_Int32 i;
+ for ( i = 0; i < rVal.getLength(); i++ )
+ rStrm.WriteUInt16( rVal[ i ] );
+ rStrm.WriteUInt16( 0 );
+}
+
+void AnimationExporter::exportAnimAction( SvStream& rStrm, const Reference< XAnimationNode >& xNode )
+{
+ EscherExAtom aExAtom( rStrm, DFF_msofbtAnimAction );
+
+ sal_Int32 const nConcurrent = 1;
+ sal_Int32 const nNextAction = 1;
+ sal_Int32 nEndSync = 0;
+ sal_Int32 const nU4 = 0;
+ sal_Int32 const nU5 = 3;
+
+ sal_Int16 nAnimationEndSync = 0;
+ if ( xNode->getEndSync() >>= nAnimationEndSync )
+ {
+ if ( nAnimationEndSync == AnimationEndSync::ALL )
+ nEndSync = 1;
+ }
+ rStrm.WriteInt32( nConcurrent )
+ .WriteInt32( nNextAction )
+ .WriteInt32( nEndSync )
+ .WriteInt32( nU4 )
+ .WriteInt32( nU5 );
+
+}
+
+// nFlags Bit 6 = fixInteractiveSequenceTiming (for child)
+// nFlags Bit 5 = fixInteractiveSequenceTiming (for root)
+// nFlags Bit 4 = first node of main sequence -> begin event next has to be replaced to indefinite
+void AnimationExporter::exportAnimEvent( SvStream& rStrm, const Reference< XAnimationNode >& xNode, const sal_Int32 nFlags )
+{
+ sal_uInt16 i;
+ for ( i = 0; i < 4; i++ )
+ {
+ sal_Int32 nU1 = 0;
+ sal_Int32 nTrigger = 0;
+ sal_Int32 nU3 = 0;
+ sal_Int32 nBegin = 0;
+
+ bool bCreateEvent = false;
+ Any aSource;
+
+ switch( i )
+ {
+ case 0 :
+ case 1 :
+ {
+ Any aAny;
+ Event aEvent;
+ css::animations::Timing eTiming;
+ if ( i == 0 )
+ {
+ if ( nFlags & 0x20 )
+ {
+ // taking the first child
+ Reference< XEnumerationAccess > xEA( xNode, UNO_QUERY_THROW );
+ Reference< XEnumeration > xE( xEA->createEnumeration(), css::uno::UNO_SET_THROW );
+ if ( xE->hasMoreElements() )
+ {
+ Reference< XAnimationNode > xClickNode( xE->nextElement(), UNO_QUERY );
+ aAny = xClickNode->getBegin();
+ }
+ }
+ else if ( nFlags & 0x40 )
+ {
+ // begin has to be replaced with void, so don't do anything
+ }
+ else
+ {
+ aAny = xNode->getBegin();
+ if ( nFlags & 0x10 ) // replace ON_NEXT with INDEFINITE
+ {
+ if ( ( aAny >>= aEvent ) && ( aEvent.Trigger == EventTrigger::ON_NEXT ) )
+ {
+ eTiming = Timing_INDEFINITE;
+ aAny <<= eTiming;
+ }
+ }
+ }
+ }
+ else
+ aAny = xNode->getEnd();
+
+ double fTiming = 0.0;
+ if ( aAny >>= aEvent )
+ {
+ bCreateEvent = true;
+ switch( aEvent.Trigger )
+ {
+ case EventTrigger::NONE : nTrigger = 0; break;
+ case EventTrigger::ON_BEGIN : nTrigger = 1; break;
+ case EventTrigger::ON_END : nTrigger = 2; break;
+ case EventTrigger::BEGIN_EVENT : nTrigger = 3; break;
+ case EventTrigger::END_EVENT : nTrigger = 4; nU1 = 2; nU3 = mnCurrentGroup; break;
+ case EventTrigger::ON_CLICK : nTrigger = 5; break;
+ case EventTrigger::ON_DBL_CLICK : nTrigger = 6; break;
+ case EventTrigger::ON_MOUSE_ENTER : nTrigger = 7; break;
+ case EventTrigger::ON_MOUSE_LEAVE : nTrigger = 8; break;
+ case EventTrigger::ON_NEXT : nTrigger = 9; break;
+ case EventTrigger::ON_PREV : nTrigger = 10; break;
+ case EventTrigger::ON_STOP_AUDIO : nTrigger = 11; break;
+ }
+ if ( aEvent.Offset.hasValue() )
+ {
+ if ( aEvent.Offset >>= eTiming )
+ {
+ if ( eTiming == Timing_INDEFINITE )
+ nBegin = -1;
+ }
+ else if ( aEvent.Offset >>= fTiming )
+ nBegin = static_cast<sal_Int32>( fTiming * 1000.0 );
+ }
+ aSource = aEvent.Source;
+ }
+ else if ( aAny >>= eTiming )
+ {
+ bCreateEvent = true;
+ if ( eTiming == Timing_INDEFINITE )
+ nBegin = -1;
+ }
+ else if ( aAny >>= fTiming )
+ {
+ bCreateEvent = true;
+ nBegin = static_cast<sal_Int32>( fTiming * 1000.0 );
+ }
+ }
+ break;
+
+ case 2 :
+ {
+ if ( nFlags & ( 1 << i ) )
+ {
+ bCreateEvent = true;
+ nU1 = 1;
+ nTrigger = 9;
+ }
+ }
+ break;
+ case 3 :
+ {
+ if ( nFlags & ( 1 << i ) )
+ {
+ bCreateEvent = true;
+ nU1 = 1;
+ nTrigger = 10;
+ }
+ }
+ break;
+ }
+ if ( bCreateEvent )
+ {
+ EscherExContainer aAnimEvent( rStrm, DFF_msofbtAnimEvent, i + 1 );
+ {
+ EscherExAtom aAnimTrigger( rStrm, DFF_msofbtAnimTrigger );
+ rStrm.WriteInt32( nU1 )
+ .WriteInt32( nTrigger )
+ .WriteInt32( nU3 )
+ .WriteInt32( nBegin );
+ }
+ exportAnimateTargetElement( rStrm, aSource, ( nFlags & ( 1 << i ) ) != 0 );
+ }
+ }
+}
+
+Any AnimationExporter::convertAnimateValue( const Any& rSourceValue, std::u16string_view rAttributeName )
+{
+ OUString aDest;
+ if ( rAttributeName == u"X"
+ || rAttributeName == u"Y"
+ || rAttributeName == u"Width"
+ || rAttributeName == u"Height"
+ )
+ {
+ OUString aStr;
+ if ( rSourceValue >>= aStr )
+ {
+ ImplTranslateAttribute( aStr, TRANSLATE_MEASURE );
+ aDest += aStr;
+ }
+ }
+ else if ( rAttributeName == u"Rotate" // "r" or "style.rotation" ?
+ || rAttributeName == u"Opacity"
+ || rAttributeName == u"CharHeight"
+ || rAttributeName == u"SkewX"
+ )
+ {
+ double fNumber = 0.0;
+ if ( rSourceValue >>= fNumber )
+ aDest += OUString::number( fNumber );
+ }
+ else if ( rAttributeName == u"Color"
+ || rAttributeName == u"FillColor" // "Fillcolor" or "FillColor" ?
+ || rAttributeName == u"LineColor"
+ || rAttributeName == u"CharColor"
+ )
+ {
+ sal_Int32 nColor = 0;
+ Sequence< double > aHSL( 3 );
+ OUString aP( "," );
+ if ( rSourceValue >>= aHSL )
+ {
+ aDest += "hsl("
+ + OUString::number( static_cast<sal_Int32>( aHSL[ 0 ] / ( 360.0 / 255 ) ) )
+ + aP
+ + OUString::number( static_cast<sal_Int32>( aHSL[ 1 ] * 255.0 ) )
+ + aP
+ + OUString::number( static_cast<sal_Int32>( aHSL[ 2 ] * 255.0 ) )
+ + ")";
+ }
+ else if ( rSourceValue >>= nColor )
+ {
+ aDest += "rgb("
+ + OUString::number( static_cast<sal_Int8>(nColor) )
+ + aP
+ + OUString::number( static_cast<sal_Int8>( nColor >> 8 ) )
+ + aP
+ + OUString::number( static_cast<sal_Int8>( nColor >> 16 ) )
+ + ")";
+ }
+ }
+ else if ( rAttributeName == u"FillStyle" )
+ {
+ css::drawing::FillStyle eFillStyle;
+ if ( rSourceValue >>= eFillStyle )
+ {
+ if ( eFillStyle == css::drawing::FillStyle_NONE )
+ aDest += "none"; // ?
+ else
+ aDest += "solid";
+ }
+ }
+ else if (rAttributeName == u"FillOn")
+ {
+ bool bFillOn;
+ if ( rSourceValue >>= bFillOn )
+ {
+ if ( bFillOn )
+ aDest += "true";
+ else
+ aDest += "false";
+ }
+ }
+ else if ( rAttributeName == u"LineStyle" )
+ {
+ css::drawing::LineStyle eLineStyle;
+ if ( rSourceValue >>= eLineStyle )
+ {
+ if ( eLineStyle == css::drawing::LineStyle_NONE )
+ aDest += "false";
+ else
+ aDest += "true";
+ }
+ }
+ else if ( rAttributeName == u"CharWeight" )
+ {
+ float fFontWeight = 0.0;
+ if ( rSourceValue >>= fFontWeight )
+ {
+ if ( fFontWeight == css::awt::FontWeight::BOLD )
+ aDest += "bold";
+ else
+ aDest += "normal";
+ }
+ }
+ else if ( rAttributeName == u"CharUnderline" )
+ {
+ sal_Int16 nFontUnderline = 0;
+ if ( rSourceValue >>= nFontUnderline )
+ {
+ if ( nFontUnderline == css::awt::FontUnderline::NONE )
+ aDest += "false";
+ else
+ aDest += "true";
+ }
+ }
+ else if ( rAttributeName == u"CharPosture" )
+ {
+ css::awt::FontSlant eFontSlant;
+ if ( rSourceValue >>= eFontSlant )
+ {
+ if ( eFontSlant == css::awt::FontSlant_ITALIC )
+ aDest += "italic";
+ else
+ aDest += "normal"; // ?
+ }
+ }
+ else if ( rAttributeName == u"Visibility" )
+ {
+ bool bVisible = true;
+ if ( rSourceValue >>= bVisible )
+ {
+ if ( bVisible )
+ aDest += "visible";
+ else
+ aDest += "hidden";
+ }
+ }
+ Any aRet;
+ if ( !aDest.isEmpty() )
+ aRet <<= aDest;
+ else
+ aRet = rSourceValue;
+ return aRet;
+}
+
+void AnimationExporter::exportAnimateSet( SvStream& rStrm, const Reference< XAnimationNode >& xNode, int nAfterEffectType )
+{
+ Reference< XAnimateSet > xSet( xNode, UNO_QUERY );
+ if( !xSet.is() )
+ return;
+
+ EscherExContainer aAnimateSet( rStrm, DFF_msofbtAnimateSet, 0 );
+ {
+ EscherExAtom aAnimateSetData( rStrm, DFF_msofbtAnimateSetData );
+ sal_uInt32 const nId1 = 1; // ??
+ sal_uInt32 const nId2 = 1; // ??
+ rStrm.WriteUInt32( nId1 ).WriteUInt32( nId2 );
+ }
+ Any aConvertedValue( convertAnimateValue( xSet->getTo(), xSet->getAttributeName() ) );
+ if ( aConvertedValue.hasValue() )
+ exportAnimProperty( rStrm, 1, aConvertedValue, TRANSLATE_NONE );
+ exportAnimateTarget( rStrm, xNode, 0, nAfterEffectType );
+}
+
+sal_uInt32 AnimationExporter::GetValueTypeForAttributeName( const OUString& rAttributeName )
+{
+ sal_uInt32 nValueType = 0;
+
+ struct Entry
+ {
+ const char* pName;
+ sal_uInt8 nType;
+ };
+ static const Entry lcl_attributeMap[] =
+ {
+ { "charcolor", 2 },
+ { "charfontname", 0 },
+ { "charheight", 1 },
+ { "charposture", 0 },
+ // TODO(Q1): This should prolly be changed in PPT import
+ // { "charrotation", ATTRIBUTE_CHAR_ROTATION },
+ { "charrotation", 1 },
+ { "charunderline", 0 },
+ { "charweight", 0 },
+ { "color", 2 },
+ { "dimcolor", 2 },
+ { "fillcolor", 2 },
+ { "fillstyle", 0 },
+ { "height", 1 },
+ { "linecolor", 2 },
+ { "linestyle", 0 },
+ { "opacity", 0 },
+ { "rotate", 1 },
+ { "skewx", 1 },
+ { "skewy", 1 },
+ { "visibility", 1 },
+ { "width", 1 },
+ { "x", 1 },
+ { "y", 1 },
+ { nullptr, 0 }
+ };
+ const Entry* pPtr = &lcl_attributeMap[ 0 ];
+ while( pPtr->pName )
+ {
+ if ( rAttributeName.equalsIgnoreAsciiCaseAscii( pPtr->pName ) )
+ {
+ nValueType = pPtr->nType;
+ break;
+ }
+ pPtr++;
+ }
+ DBG_ASSERT( pPtr->pName, "GetValueTypeForAttributeName, unknown property value!" );
+ return nValueType;
+}
+
+void AnimationExporter::exportAnimate( SvStream& rStrm, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XAnimate > xAnimate( xNode, UNO_QUERY );
+ if ( !xAnimate.is() )
+ return;
+
+ Any aBy ( xAnimate->getBy() );
+ Any aFrom( xAnimate->getFrom() );
+ Any aTo ( xAnimate->getTo() );
+
+ EscherExContainer aContainer( rStrm, DFF_msofbtAnimate, 0 );
+ {
+ EscherExAtom aAnimateData( rStrm, DFF_msofbtAnimateData );
+ sal_uInt32 nBits = 0x38;
+ sal_Int16 nTmp = xAnimate->getCalcMode();
+ sal_uInt32 nCalcMode = /* (nTmp == AnimationCalcMode::FORMULA) ? 2 : */ (nTmp == AnimationCalcMode::LINEAR) ? 1 : 0;
+ sal_uInt32 nValueType = GetValueTypeForAttributeName( xAnimate->getAttributeName() );
+
+ if ( aBy.hasValue() )
+ nBits |= 1;
+ if ( aFrom.hasValue() )
+ nBits |= 2;
+ if ( aTo.hasValue() )
+ nBits |= 4;
+
+ rStrm.WriteUInt32( nCalcMode )
+ .WriteUInt32( nBits )
+ .WriteUInt32( nValueType );
+ }
+ if ( aBy.hasValue() )
+ exportAnimProperty( rStrm, 1, aBy, TRANSLATE_NUMBER_TO_STRING | TRANSLATE_MEASURE );
+ if ( aFrom.hasValue() )
+ exportAnimProperty( rStrm, 2, aFrom, TRANSLATE_NUMBER_TO_STRING | TRANSLATE_MEASURE );
+ if ( aTo.hasValue() )
+ exportAnimProperty( rStrm, 3, aTo, TRANSLATE_NUMBER_TO_STRING | TRANSLATE_MEASURE );
+
+ exportAnimateKeyPoints( rStrm, xAnimate );
+ exportAnimateTarget( rStrm, xNode );
+}
+
+void AnimationExporter::exportAnimateTarget( SvStream& rStrm, const Reference< XAnimationNode >& xNode, const sal_uInt32 nForceAttributeNames, int nAfterEffectType )
+{
+ EscherExContainer aAnimateTarget( rStrm, DFF_msofbtAnimateTarget, 0 );
+ Reference< XAnimate > xAnimate( xNode, UNO_QUERY );
+ if ( !xAnimate.is() )
+ return;
+
+ {
+ EscherExAtom aAnimateTargetSettings( rStrm, DFF_msofbtAnimateTargetSettings, 0 );
+ // nBits %0001: additive, %0010: accumulate, %0100: attributeName, %1000: transformtype
+ // nAdditive 0 = base, 1 = sum, 2 = replace, 3 = multiply, 4 = none
+ // nAccumulate 0 = none, 1 = always
+ // nTransformType 0: "property" else "image"
+ sal_uInt32 nBits = 0;
+ sal_uInt32 nAdditive = 0;
+ sal_uInt32 nAccumulate = 0;
+ sal_uInt32 const nTransformType = 0;
+ if ( xAnimate.is() )
+ {
+ if ( !xAnimate->getAttributeName().isEmpty() )
+ nBits |= 4; // what is attributeName ?, maybe this is set if a DFF_msofbtAnimateAttributeNames is written
+ sal_Int16 nAdditiveMode = xAnimate->getAdditive();
+ if ( nAdditiveMode != AnimationAdditiveMode::BASE )
+ {
+ nBits |= 1;
+ switch( nAdditiveMode )
+ {
+ case AnimationAdditiveMode::SUM : nAdditive = 1; break;
+ case AnimationAdditiveMode::REPLACE : nAdditive = 2; break;
+ case AnimationAdditiveMode::MULTIPLY : nAdditive = 3; break;
+ case AnimationAdditiveMode::NONE : nAdditive = 4; break;
+ }
+ }
+ if ( xAnimate->getAccumulate() )
+ {
+ nBits |= 2;
+ nAccumulate = 1;
+ }
+ }
+ rStrm.WriteUInt32( nBits )
+ .WriteUInt32( nAdditive )
+ .WriteUInt32( nAccumulate )
+ .WriteUInt32( nTransformType );
+ }
+ if ( !xAnimate->getAttributeName().isEmpty() || nForceAttributeNames )
+ {
+ EscherExContainer aAnimateAttributeNames( rStrm, DFF_msofbtAnimateAttributeNames, 1 );
+ OUString aAttributeName( xAnimate->getAttributeName() );
+ if ( nForceAttributeNames )
+ {
+ if( nForceAttributeNames == 1 )
+ {
+ aAttributeName = "r";
+ }
+ }
+ sal_Int32 nIndex = 0;
+ do
+ {
+ OUString aToken( aAttributeName.getToken( 0, ';', nIndex ) );
+ exportAnimPropertyString( rStrm, 0, aToken, TRANSLATE_ATTRIBUTE );
+ }
+ while ( nIndex >= 0 );
+ }
+
+ if( nAfterEffectType != AFTEREFFECT_NONE )
+ {
+ EscherExContainer aAnimPropertySet( rStrm, DFF_msofbtAnimPropertySet );
+ exportAnimPropertyuInt32( rStrm, 6, 1 );
+ if( nAfterEffectType == AFTEREFFECT_COLOR )
+ {
+ exportAnimPropertyuInt32( rStrm, 4, 0 );
+ exportAnimPropertyuInt32( rStrm, 5, 0 );
+ }
+ }
+ exportAnimateTargetElement( rStrm, aTarget.hasValue() ? aTarget : xAnimate->getTarget(), false );
+}
+
+Reference< XShape > AnimationExporter::getTargetElementShape( const Any& rAny, sal_Int32& rBegin, sal_Int32& rEnd, bool& rParagraphTarget )
+{
+ Reference< XShape > xShape;
+ rAny >>= xShape;
+
+ rParagraphTarget = false;
+
+ if( xShape.is() )
+ return xShape;
+
+ ParagraphTarget aParaTarget;
+ if( rAny >>= aParaTarget )
+ xShape = aParaTarget.Shape;
+ if ( !xShape.is() )
+ return xShape;
+
+ // now calculating the character range for the paragraph
+ sal_Int16 nParagraph = aParaTarget.Paragraph;
+ Reference< XSimpleText > xText( xShape, UNO_QUERY );
+ if ( !xText.is() )
+ return xShape;
+
+ rParagraphTarget = true;
+ Reference< XEnumerationAccess > xTextParagraphEnumerationAccess( xText, UNO_QUERY );
+ if ( !xTextParagraphEnumerationAccess.is() )
+ return xShape;
+
+ Reference< XEnumeration > xTextParagraphEnumeration( xTextParagraphEnumerationAccess->createEnumeration() );
+ if ( !xTextParagraphEnumeration.is() )
+ return xShape;
+
+ sal_Int16 nCurrentParagraph;
+ rBegin = rEnd = nCurrentParagraph = 0;
+ while ( xTextParagraphEnumeration->hasMoreElements() )
+ {
+ Reference< XTextRange > xTextRange( xTextParagraphEnumeration->nextElement(), UNO_QUERY );
+ if ( xTextRange.is() )
+ {
+ OUString aParaText( xTextRange->getString() );
+ sal_Int32 nLength = aParaText.getLength() + 1;
+ rEnd += nLength;
+ if ( nCurrentParagraph == nParagraph )
+ break;
+ nCurrentParagraph++;
+ rBegin += nLength;
+ }
+ }
+
+ return xShape;
+}
+
+void AnimationExporter::exportAnimateTargetElement( SvStream& rStrm, const Any& rAny, const bool bCreate2b01Atom )
+{
+ sal_uInt32 nRefMode = 0; // nRefMode == 2 -> Paragraph
+ sal_Int32 begin = -1;
+ sal_Int32 end = -1;
+ bool bParagraphTarget;
+
+ Reference< XShape > xShape = getTargetElementShape(rAny, begin, end, bParagraphTarget);
+
+ if( bParagraphTarget )
+ nRefMode = 2;
+
+ if ( !(xShape.is() || bCreate2b01Atom) )
+ return;
+
+ EscherExContainer aAnimateTargetElement( rStrm, DFF_msofbtAnimateTargetElement );
+ if ( xShape.is() )
+ {
+ EscherExAtom aAnimReference( rStrm, DFF_msofbtAnimReference );
+
+ sal_uInt32 const nRefType = 1; // TODO: nRefType == 2 -> Sound;
+ sal_uInt32 nRefId = mrSolverContainer.GetShapeId( xShape );
+
+ rStrm.WriteUInt32( nRefMode )
+ .WriteUInt32( nRefType )
+ .WriteUInt32( nRefId )
+ .WriteInt32( begin )
+ .WriteInt32( end );
+ }
+ if ( bCreate2b01Atom )
+ {
+ EscherExAtom a2b01Atom( rStrm, 0x2b01 );
+ rStrm.WriteUInt32( 1 ); // ?
+ }
+}
+
+void AnimationExporter::exportAnimateKeyPoints( SvStream& rStrm, const Reference< XAnimate >& xAnimate )
+{
+ Sequence< double > aKeyTimes( xAnimate->getKeyTimes() );
+ Sequence< Any > aValues( xAnimate->getValues() );
+ OUString aFormula( xAnimate->getFormula() );
+ if ( !aKeyTimes.hasElements() )
+ return;
+
+ EscherExContainer aAnimKeyPoints( rStrm, DFF_msofbtAnimKeyPoints );
+ sal_Int32 i;
+ for ( i = 0; i < aKeyTimes.getLength(); i++ )
+ {
+ {
+ EscherExAtom aAnimKeyTime( rStrm, DFF_msofbtAnimKeyTime );
+ sal_Int32 nKeyTime = static_cast<sal_Int32>( aKeyTimes[ i ] * 1000.0 );
+ rStrm.WriteInt32( nKeyTime );
+ }
+ Any aAny[ 2 ];
+ if ( aValues[ i ].hasValue() )
+ {
+ ValuePair aPair;
+ if ( aValues[ i ] >>= aPair )
+ {
+ aAny[ 0 ] = convertAnimateValue( aPair.First, xAnimate->getAttributeName() );
+ aAny[ 1 ] = convertAnimateValue( aPair.Second, xAnimate->getAttributeName() );
+ }
+ else
+ {
+ aAny[ 0 ] = convertAnimateValue( aValues[ i ], xAnimate->getAttributeName() );
+ }
+ if ( !i && !aFormula.isEmpty() )
+ {
+ ImplTranslateAttribute( aFormula, TRANSLATE_MEASURE );
+ aAny[ 1 ] <<= aFormula;
+ }
+ exportAnimProperty( rStrm, 0, aAny[ 0 ], TRANSLATE_NONE );
+ exportAnimProperty( rStrm, 1, aAny[ 1 ], TRANSLATE_NONE );
+ }
+ }
+}
+
+void AnimationExporter::exportAnimValue( SvStream& rStrm, const Reference< XAnimationNode >& xNode, const bool bExportAlways )
+{
+ Any aAny;
+ // repeat count (0)
+ double fRepeat = 0.0;
+ float fRepeatCount = 0.0;
+ css::animations::Timing eTiming;
+ aAny = xNode->getRepeatCount();
+ if ( aAny >>= eTiming )
+ {
+ if ( eTiming == Timing_INDEFINITE )
+ fRepeatCount = (float(3.40282346638528860e+38));
+ }
+ else if ( aAny >>= fRepeat )
+ fRepeatCount = static_cast<float>(fRepeat);
+ if ( fRepeatCount != 0.0 )
+ {
+ EscherExAtom aExAtom( rStrm, DFF_msofbtAnimValue );
+ sal_uInt32 const nType = 0;
+ rStrm.WriteUInt32( nType )
+ .WriteFloat( fRepeatCount );
+ }
+ // accelerate (3)
+ float fAccelerate = static_cast<float>(xNode->getAcceleration());
+ if ( bExportAlways || ( fAccelerate != 0.0 ) )
+ {
+ EscherExAtom aExAtom( rStrm, DFF_msofbtAnimValue );
+ sal_uInt32 const nType = 3;
+ rStrm.WriteUInt32( nType )
+ .WriteFloat( fAccelerate );
+ }
+
+ // decelerate (4)
+ float fDecelerate = static_cast<float>(xNode->getDecelerate());
+ if ( bExportAlways || ( fDecelerate != 0.0 ) )
+ {
+ EscherExAtom aExAtom( rStrm, DFF_msofbtAnimValue );
+ sal_uInt32 const nType = 4;
+ rStrm.WriteUInt32( nType )
+ .WriteFloat( fDecelerate );
+ }
+
+ // autoreverse (5)
+ bool bAutoReverse = xNode->getAutoReverse();
+ if ( bExportAlways || bAutoReverse )
+ {
+ EscherExAtom aExAtom( rStrm, DFF_msofbtAnimValue );
+ sal_uInt32 const nType = 5;
+ sal_uInt32 nVal = bAutoReverse ? 1 : 0;
+ rStrm.WriteUInt32( nType )
+ .WriteUInt32( nVal );
+ }
+}
+
+void AnimationExporter::exportTransitionFilter( SvStream& rStrm, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XTransitionFilter > xFilter( xNode, UNO_QUERY );
+ if ( !xFilter.is() )
+ return;
+
+ EscherExContainer aAnimateFilter( rStrm, DFF_msofbtAnimateFilter );
+ {
+ EscherExAtom aAnimateFilterData( rStrm, DFF_msofbtAnimateFilterData );
+ sal_uInt32 const nBits = 3; // bit 0 -> use AnimAttributeValue
+ // bit 1 -> use nTransition
+
+ sal_uInt32 nTransition = xFilter->getMode() ? 0 : 1;
+ rStrm.WriteUInt32( nBits )
+ .WriteUInt32( nTransition );
+ }
+ const char* pFilter = FindTransitionName( xFilter->getTransition(), xFilter->getSubtype(), xFilter->getDirection() );
+ if ( pFilter )
+ {
+ const OUString aStr( OUString::createFromAscii( pFilter ) );
+ exportAnimPropertyString( rStrm, 1, aStr, TRANSLATE_NONE );
+ }
+ exportAnimateTarget( rStrm, xNode );
+}
+
+void AnimationExporter::exportAnimateMotion( SvStream& rStrm, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XAnimateMotion > xMotion( xNode, UNO_QUERY );
+ if ( !xMotion.is() )
+ return;
+
+ EscherExContainer aAnimateMotion( rStrm, DFF_msofbtAnimateMotion );
+ {
+ { //SJ: Ignored from import filter
+ EscherExAtom aAnimateMotionData( rStrm, DFF_msofbtAnimateMotionData );
+ sal_uInt32 const nBits = 0x98;
+ sal_uInt32 const nOrigin = 0x2;
+ float const fByX = 100.0; // nBits&1
+ float const fByY = 100.0; // nBits&1
+ float const fFromX = 0.0; // nBits&2
+ float const fFromY = 0.0; // nBits&2
+ float const fToX = 100.0; // nBits&4
+ float const fToY = 100.0; // nBits&4
+ rStrm.WriteUInt32( nBits ).WriteFloat( fByX ).WriteFloat( fByY ).WriteFloat( fFromX ).WriteFloat( fFromY ).WriteFloat( fToX ).WriteFloat( fToY ).WriteUInt32( nOrigin );
+ }
+
+ OUString aStr;
+ if ( xMotion->getPath() >>= aStr )
+ {
+ if ( !aStr.isEmpty() )
+ exportAnimPropertyString( rStrm, 1, aStr, TRANSLATE_NONE );
+ }
+ exportAnimateTarget( rStrm, xNode );
+ }
+}
+
+void AnimationExporter::exportAnimateTransform( SvStream& rStrm, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XAnimateTransform > xTransform( xNode, UNO_QUERY );
+ if ( !xTransform.is() )
+ return;
+
+ if ( xTransform->getTransformType() == AnimationTransformType::SCALE )
+ {
+ EscherExContainer aAnimateScale( rStrm, DFF_msofbtAnimateScale );
+ {
+ EscherExAtom aAnimateScaleData( rStrm, DFF_msofbtAnimateScaleData );
+ sal_uInt32 nBits = 0;
+ sal_uInt32 const nZoomContents = 1;
+ float fByX = 100.0;
+ float fByY = 100.0;
+ float fFromX = 0.0;
+ float fFromY = 0.0;
+ float fToX = 100.0;
+ float fToY = 100.0;
+
+ double fX = 0.0, fY = 0.0;
+ ValuePair aPair;
+ if ( xTransform->getBy() >>= aPair )
+ {
+ if ( ( aPair.First >>= fX ) && ( aPair.Second >>= fY ) )
+ {
+ nBits |= 1;
+ fByX = static_cast<float>( fX * 100 );
+ fByY = static_cast<float>( fY * 100 );
+ }
+ }
+ if ( xTransform->getFrom() >>= aPair )
+ {
+ if ( ( aPair.First >>= fX ) && ( aPair.Second >>= fY ) )
+ {
+ nBits |= 2;
+ fFromX = static_cast<float>( fX * 100 );
+ fFromY = static_cast<float>( fY * 100 );
+ }
+ }
+ if( xTransform->getTo() >>= aPair )
+ {
+ if ( ( aPair.First >>= fX ) && ( aPair.Second >>= fY ) )
+ {
+ nBits |= 4;
+ fToX = static_cast<float>( fX * 100 );
+ fToY = static_cast<float>( fY * 100 );
+ }
+ }
+
+ // TODO: ZoomContents:
+ //if( nBits & 8 )
+ //( fprintf( mpFile, " zoomContents=\"%s\"", nZoomContents ? "true" : "false" );
+
+ rStrm.WriteUInt32( nBits ).WriteFloat( fByX ).WriteFloat( fByY ).WriteFloat( fFromX ).WriteFloat( fFromY ).WriteFloat( fToX ).WriteFloat( fToY ).WriteUInt32( nZoomContents );
+ }
+ exportAnimateTarget( rStrm, xNode );
+ }
+ else if ( xTransform->getTransformType() == AnimationTransformType::ROTATE )
+ {
+ EscherExContainer aAnimateRotation( rStrm, DFF_msofbtAnimateRotation );
+ {
+ EscherExAtom aAnimateRotationData( rStrm, DFF_msofbtAnimateRotationData );
+ sal_uInt32 nBits = 0;
+ sal_uInt32 const nU1 = 0;
+ float fBy = 360.0;
+ float fFrom = 0.0;
+ float fTo = 360.0;
+
+ double fVal = 0.0;
+ if ( xTransform->getBy() >>= fVal )
+ {
+ nBits |= 1;
+ fBy = static_cast<float>(fVal);
+ }
+ if ( xTransform->getFrom() >>= fVal )
+ {
+ nBits |= 2;
+ fFrom = static_cast<float>(fVal);
+ }
+ if ( xTransform->getTo() >>= fVal )
+ {
+ nBits |= 4;
+ fTo = static_cast<float>(fVal);
+ }
+ rStrm.WriteUInt32( nBits ).WriteFloat( fBy ).WriteFloat( fFrom ).WriteFloat( fTo ).WriteUInt32( nU1 );
+ }
+ exportAnimateTarget( rStrm, xNode, 1 );
+ }
+}
+
+bool AnimationExporter::getColorAny( const Any& rAny, const sal_Int16 nColorSpace, sal_Int32& rMode, sal_Int32& rA, sal_Int32& rB, sal_Int32& rC )
+{
+ bool bIsColor = true;
+
+ rMode = 0;
+ if ( nColorSpace == AnimationColorSpace::HSL )
+ rMode = 1;
+
+ sal_Int32 nColor = 0;
+ Sequence< double > aHSL( 3 );
+ if ( rAny >>= nColor ) // RGB color
+ {
+ rA = static_cast<sal_uInt8>( nColor >> 16 );
+ rB = static_cast<sal_uInt8>( nColor >> 8 );
+ rC = static_cast<sal_uInt8>(nColor);
+ }
+ else if ( rAny >>= aHSL ) // HSL
+ {
+ rA = static_cast<sal_Int32>( aHSL[ 0 ] * 255.0 / 360.0 );
+ rB = static_cast<sal_Int32>( aHSL[ 1 ] * 255.0 );
+ rC = static_cast<sal_Int32>( aHSL[ 2 ] * 255.0 );
+ }
+ else
+ bIsColor = false;
+ return bIsColor;
+}
+
+void AnimationExporter::exportAnimateColor( SvStream& rStrm, const Reference< XAnimationNode >& xNode, int nAfterEffectType )
+{
+ Reference< XAnimateColor > xColor( xNode, UNO_QUERY );
+ if ( !xColor.is() )
+ return;
+
+ EscherExContainer aAnimateColor( rStrm, DFF_msofbtAnimateColor );
+ {
+ EscherExAtom aAnimateColorData( rStrm, DFF_msofbtAnimateColorData );
+ sal_uInt32 nBits = 8;
+
+ sal_Int32 nByMode, nByA, nByB, nByC;
+ nByMode = nByA = nByB = nByC = 0;
+
+ sal_Int32 nFromMode, nFromA, nFromB, nFromC;
+ nFromMode = nFromA = nFromB = nFromC = 0;
+
+ sal_Int32 nToMode, nToA, nToB, nToC;
+ nToMode = nToA = nToB = nToC = 0;
+
+ sal_Int16 nColorSpace = xColor->getColorInterpolation();
+
+ Any aAny( xColor->getBy() );
+ if ( aAny.hasValue() )
+ {
+ if ( getColorAny( aAny, nColorSpace, nByMode, nByA, nByB, nByC ) )
+ nBits |= 0x11;
+ }
+ aAny = xColor->getFrom();
+ if ( aAny.hasValue() )
+ {
+ if ( getColorAny( aAny, nColorSpace, nFromMode, nFromA, nFromB, nFromC ) )
+ nBits |= 0x12;
+ }
+ aAny = xColor->getTo();
+ if ( aAny.hasValue() )
+ {
+ if ( getColorAny( aAny, nColorSpace, nToMode, nToA, nToB, nToC ) )
+ nBits |= 0x14;
+ }
+ rStrm .WriteUInt32( nBits )
+ .WriteInt32( nByMode ).WriteInt32( nByA ).WriteInt32( nByB ).WriteInt32( nByC )
+ .WriteInt32( nFromMode ).WriteInt32( nFromA ).WriteInt32( nFromB ).WriteInt32( nFromC )
+ .WriteInt32( nToMode ).WriteInt32( nToA ).WriteInt32( nToB ).WriteInt32( nToC );
+ }
+ exportAnimateTarget( rStrm, xNode, 0, nAfterEffectType );
+}
+
+void AnimationExporter::exportIterate( SvStream& rStrm, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XIterateContainer > xIterate( xNode, UNO_QUERY );
+ if ( !xIterate.is() )
+ return;
+
+ EscherExAtom aAnimIteration( rStrm, DFF_msofbtAnimIteration );
+
+ float fInterval = 10.0;
+ sal_Int32 nTextUnitEffect = 0;
+ sal_Int32 const nU1 = 1;
+ sal_Int32 const nU2 = 1;
+ sal_Int32 const nU3 = 0xe;
+
+ sal_Int16 nIterateType = xIterate->getIterateType();
+ switch( nIterateType )
+ {
+ case TextAnimationType::BY_WORD : nTextUnitEffect = 1; break;
+ case TextAnimationType::BY_LETTER : nTextUnitEffect = 2; break;
+ }
+
+ fInterval = static_cast<float>(xIterate->getIterateInterval());
+
+ // convert interval from absolute to percentage
+ double fDuration = 0.0;
+
+ Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimate > xChildNode( xEnumeration->nextElement(), UNO_QUERY );
+ if( xChildNode.is() )
+ {
+ double fChildBegin = 0.0;
+ double fChildDuration = 0.0;
+ xChildNode->getBegin() >>= fChildBegin;
+ xChildNode->getDuration() >>= fChildDuration;
+
+ fChildDuration += fChildBegin;
+ if( fChildDuration > fDuration )
+ fDuration = fChildDuration;
+ }
+ }
+ }
+ }
+
+ if( fDuration )
+ fInterval = static_cast<float>(100.0 * fInterval / fDuration);
+
+ rStrm.WriteFloat( fInterval ).WriteInt32( nTextUnitEffect ).WriteInt32( nU1 ).WriteInt32( nU2 ).WriteInt32( nU3 );
+ aTarget = xIterate->getTarget();
+}
+
+} // namespace ppt;
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptexanimations.hxx b/sd/source/filter/eppt/pptexanimations.hxx
new file mode 100644
index 000000000..daa54d85b
--- /dev/null
+++ b/sd/source/filter/eppt/pptexanimations.hxx
@@ -0,0 +1,134 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#ifdef DBG_ANIM_LOG
+#include <stdio.h>
+#endif
+
+#include <rtl/ustring.hxx>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/uno/Reference.h>
+
+#include <memory>
+#include <vector>
+
+namespace com::sun::star::animations { class XAnimate; }
+namespace com::sun::star::animations { class XAnimationNode; }
+namespace com::sun::star::beans { struct NamedValue; }
+namespace com::sun::star::drawing { class XDrawPage; }
+namespace com::sun::star::drawing { class XShape; }
+namespace ppt { class ExSoundCollection; }
+
+class SvStream;
+class EscherSolverContainer;
+
+namespace ppt
+{
+
+ struct AfterEffectNode
+ {
+ css::uno::Reference< css::animations::XAnimationNode > mxNode;
+ css::uno::Reference< css::animations::XAnimationNode > mxMaster;
+
+ AfterEffectNode( const css::uno::Reference< css::animations::XAnimationNode >& xNode,
+ const css::uno::Reference< css::animations::XAnimationNode >& xMaster )
+ : mxNode( xNode ), mxMaster( xMaster ) {}
+ };
+
+ typedef std::shared_ptr< AfterEffectNode > AfterEffectNodePtr;
+
+typedef sal_uInt32 TranslateMode;
+#define TRANSLATE_NONE 0
+#define TRANSLATE_VALUE 1
+#define TRANSLATE_ATTRIBUTE 2
+#define TRANSLATE_MEASURE 4
+#define TRANSLATE_NUMBER_TO_STRING 8
+
+const int AFTEREFFECT_NONE = 0;
+const int AFTEREFFECT_COLOR = 1;
+const int AFTEREFFECT_SET = 2;
+
+class AnimationExporter
+{
+ css::uno::Any aTarget;
+ const EscherSolverContainer& mrSolverContainer;
+ ppt::ExSoundCollection& mrExSoundCollection;
+ std::vector< AfterEffectNodePtr > maAfterEffectNodes;
+ sal_Int32 mnCurrentGroup;
+
+ static void writeZString( SvStream& rStrm, const OUString& rVal );
+ static bool getColorAny( const css::uno::Any& rAny, const sal_Int16 nColorSpace, sal_Int32& rMode, sal_Int32& rA, sal_Int32& rB, sal_Int32& rC );
+ static bool exportAnimProperty( SvStream& rStrm, const sal_uInt16 nPropertyId, const css::uno::Any& rAny, const TranslateMode eTranslateMode );
+ static void exportAnimPropertyString( SvStream& rStrm, const sal_uInt16 nPropertyId, const OUString& rVal, const TranslateMode eTranslateMode );
+ static void exportAnimPropertyFloat( SvStream& rStrm, const sal_uInt16 nPropertyId, const double& rVal );
+ static void exportAnimPropertyuInt32( SvStream& rStrm, const sal_uInt16 nPropertyId, const sal_uInt32 nVal );
+ static void exportAnimPropertyByte( SvStream& rStrm, const sal_uInt16 nPropertyId, const sal_uInt8 nVal );
+
+ /** if available exportAnimPropertySet
+ @return the css::presentation::EffectNodeType*/
+ static sal_Int16 exportAnimPropertySet( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ static void exportAnimNode( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimationNode >& xNode,
+ const sal_Int16 nFillDefault );
+ void exportAnimate( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void exportAnimateTarget( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimationNode >& xNode, const sal_uInt32 nForceAttributeName = 0, int nAfterEffectType = AFTEREFFECT_NONE );
+ void exportAnimateSet( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimationNode >& xNode, int nAfterEffectType );
+ static void exportAnimAction( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void exportAnimEvent( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimationNode >& xNode, const sal_Int32 nFlags = 0 );
+ void exportNode( SvStream& rStrm, css::uno::Reference< css::animations::XAnimationNode > const & xNode,
+ const sal_uInt16 nContainerRecType, const sal_uInt16 nInstance, const sal_Int32 nGroupLevel, const bool bTakeBackInteractiveSequenceTiming,
+ const sal_Int16 nFillDefault );
+ void exportAnimateTargetElement( SvStream& rStrm, const css::uno::Any& rAny, const bool bCreate2b01Atom );
+ static void exportAnimateKeyPoints( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimate >& xAnimate );
+ static void exportAnimValue( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimationNode >& xNode, const bool bExportAlways );
+ void exportTransitionFilter( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void exportAnimateMotion( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void exportAnimateTransform( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void exportAnimateColor( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimationNode >& xNode, int nAfterEffectType );
+ void exportIterate( SvStream& rStrm, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+
+ void processAfterEffectNodes( const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+
+ bool isAfterEffectNode( const css::uno::Reference< css::animations::XAnimationNode >& xNode ) const;
+ bool hasAfterEffectNode( const css::uno::Reference< css::animations::XAnimationNode >& xNode, css::uno::Reference< css::animations::XAnimationNode >& xAfterEffectNode ) const;
+ bool isEmptyNode( const css::uno::Reference< css::animations::XAnimationNode >& xNode ) const;
+
+ static css::uno::Reference< css::animations::XAnimationNode > createAfterEffectNodeClone( const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+
+public:
+ AnimationExporter( const EscherSolverContainer& rSolverContainer, ppt::ExSoundCollection& rExSoundCollection );
+
+ void doexport( const css::uno::Reference< css::drawing::XDrawPage >& xPage, SvStream& rStrm );
+
+ // helper methods also used in ooxml export
+ static css::uno::Any convertAnimateValue( const css::uno::Any& rSource, std::u16string_view rAttributeName );
+ static bool GetNodeType( const css::uno::Reference< css::animations::XAnimationNode >& xNode, sal_Int16& nType );
+ static sal_Int16 GetFillMode( const css::uno::Reference< css::animations::XAnimationNode >& xNode, const sal_Int16 nFillDefault );
+ static void GetUserData( const css::uno::Sequence< css::beans::NamedValue >& rUserData, const css::uno::Any ** pAny, std::size_t nLen );
+ static sal_uInt32 TranslatePresetSubType( const sal_uInt32 nPresetClass, const sal_uInt32 nPresetId, std::u16string_view rPresetSubType );
+ static sal_uInt32 GetPresetID( const OUString& rPreset, sal_uInt32 nAPIPresetClass, bool& bPresetId );
+ static sal_uInt32 GetValueTypeForAttributeName( const OUString& rAttributeName );
+
+ static const char* FindTransitionName( const sal_Int16 nType, const sal_Int16 nSubType, const bool bDirection );
+ static css::uno::Reference< css::drawing::XShape > getTargetElementShape( const css::uno::Any& rAny, sal_Int32& rBegin, sal_Int32& rEnd, bool& rParagraphTarget );
+};
+} // namespace ppt
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptexsoundcollection.cxx b/sd/source/filter/eppt/pptexsoundcollection.cxx
new file mode 100644
index 000000000..c4770e644
--- /dev/null
+++ b/sd/source/filter/eppt/pptexsoundcollection.cxx
@@ -0,0 +1,213 @@
+/* -*- 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 <memory>
+#include "pptexsoundcollection.hxx"
+#include "epptdef.hxx"
+#include <tools/stream.hxx>
+#include <tools/urlobj.hxx>
+#include <ucbhelper/content.hxx>
+#include <comphelper/processfactory.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+
+namespace ppt
+{
+
+ExSoundEntry::ExSoundEntry(const OUString& rString)
+ : nFileSize(0)
+ , aSoundURL(rString)
+{
+ try
+ {
+ ::ucbhelper::Content aCnt( aSoundURL,
+ css::uno::Reference< css::ucb::XCommandEnvironment >(),
+ comphelper::getProcessComponentContext() );
+ sal_Int64 nVal = 0;
+ aCnt.getPropertyValue("Size") >>= nVal;
+ nFileSize = static_cast<sal_uInt32>(nVal);
+ }
+ catch( css::uno::Exception& )
+ {
+
+ }
+};
+
+OUString ExSoundEntry::ImplGetName() const
+{
+ INetURLObject aTmp( aSoundURL );
+ return aTmp.GetLastName();
+}
+
+OUString ExSoundEntry::ImplGetExtension() const
+{
+ INetURLObject aTmp( aSoundURL );
+ OUString aExtension(aTmp.GetFileExtension());
+ if ( !aExtension.isEmpty() )
+ {
+ aExtension = "." + aExtension;
+ }
+ return aExtension;
+}
+
+bool ExSoundEntry::IsSameURL(std::u16string_view rURL) const
+{
+ return ( rURL == aSoundURL );
+}
+
+sal_uInt32 ExSoundEntry::GetSize( sal_uInt32 nId ) const
+{
+ OUString aName( ImplGetName() );
+ OUString aExtension( ImplGetExtension() );
+
+ sal_uInt32 nSize = 8; // SoundContainer Header
+ if ( !aName.isEmpty() ) // String Atom ( instance 0 - name of sound )
+ nSize += aName.getLength() * 2 + 8;
+ if ( !aExtension.isEmpty() ) // String Atom ( instance 1 - extension of sound )
+ nSize += aExtension.getLength() * 2 + 8;
+
+ OUString aId( OUString::number(nId) ); // String Atom ( instance 2 - reference id )
+ nSize += 2 * aId.getLength() + 8;
+
+ nSize += nFileSize + 8; // SoundData Atom
+
+ return nSize;
+}
+
+void ExSoundEntry::Write( SvStream& rSt, sal_uInt32 nId ) const
+{
+ try
+ {
+ ::ucbhelper::Content aLoadContentIfExists( aSoundURL,
+ css::uno::Reference< css::ucb::XCommandEnvironment >(),
+ comphelper::getProcessComponentContext() );
+
+ // create SoundContainer
+ rSt.WriteUInt32( ( EPP_Sound << 16 ) | 0xf ).WriteUInt32( GetSize( nId ) - 8 );
+
+ OUString aSoundName( ImplGetName() );
+ sal_Int32 i, nSoundNameLen = aSoundName.getLength();
+ if ( nSoundNameLen )
+ {
+ // name of sound ( instance 0 )
+ rSt.WriteUInt32( EPP_CString << 16 ).WriteUInt32( nSoundNameLen * 2 );
+ for ( i = 0; i < nSoundNameLen; ++i )
+ rSt.WriteUInt16( aSoundName[i] );
+ }
+ OUString aExtension( ImplGetExtension() );
+ sal_Int32 nExtensionLen = aExtension.getLength();
+ if ( nExtensionLen )
+ {
+ // extension of sound ( instance 1 )
+ rSt.WriteUInt32( ( EPP_CString << 16 ) | 16 ).WriteUInt32( nExtensionLen * 2 );
+ for ( i = 0; i < nExtensionLen; ++i )
+ rSt.WriteUInt16( aExtension[i] );
+ }
+ // id of sound ( instance 2 )
+ OUString aId( OUString::number(nId ) );
+ sal_Int32 nIdLen = aId.getLength();
+ rSt.WriteUInt32( ( EPP_CString << 16 ) | 32 ).WriteUInt32( nIdLen * 2 );
+ for ( i = 0; i < nIdLen; ++i )
+ rSt.WriteUInt16( aId[i] );
+
+ rSt.WriteUInt32( EPP_SoundData << 16 ).WriteUInt32( nFileSize );
+ sal_uInt32 nBytesLeft = nFileSize;
+ std::unique_ptr<SvStream> pSourceFile = ::utl::UcbStreamHelper::CreateStream( aSoundURL, StreamMode::READ );
+ if ( pSourceFile )
+ {
+ std::unique_ptr<sal_uInt8[]> pBuf( new sal_uInt8[ 0x10000 ] ); // 64 kB Buffer
+ while ( nBytesLeft )
+ {
+ sal_uInt32 nToDo = std::min<sal_uInt32>( nBytesLeft, 0x10000 );
+ pSourceFile->ReadBytes(pBuf.get(), nToDo);
+ rSt.WriteBytes(pBuf.get(), nToDo);
+ nBytesLeft -= nToDo;
+ }
+ }
+ }
+ catch( css::uno::Exception& )
+ {
+
+ }
+}
+
+sal_uInt32 ExSoundCollection::GetId(const OUString& rString)
+{
+ sal_uInt32 nSoundId = 0;
+ if (!rString.isEmpty())
+ {
+ const sal_uInt32 nSoundCount = maEntries.size();
+
+ auto iter = std::find_if(maEntries.begin(), maEntries.end(),
+ [&rString](const ExSoundEntry& rEntry) { return rEntry.IsSameURL(rString); });
+ nSoundId = static_cast<sal_uInt32>(std::distance(maEntries.begin(), iter));
+
+ if ( nSoundId++ == nSoundCount )
+ {
+ ExSoundEntry aEntry( rString );
+ if ( aEntry.GetFileSize() )
+ maEntries.push_back(aEntry);
+ else
+ {
+ nSoundId = 0; // only insert sounds that are accessible
+ }
+ }
+ }
+ return nSoundId;
+}
+
+sal_uInt32 ExSoundCollection::GetSize() const
+{
+ sal_uInt32 nSize = 0;
+ if (!maEntries.empty())
+ {
+ nSize += 8 + 12; // size of SoundCollectionContainerHeader + SoundCollAtom
+ sal_uInt32 i = 1;
+ for ( const auto& rEntry : maEntries )
+ {
+ nSize += rEntry.GetSize(i);
+ ++i;
+ }
+ }
+ return nSize;
+}
+
+void ExSoundCollection::Write( SvStream& rSt ) const
+{
+ if (maEntries.empty())
+ return;
+
+ sal_uInt32 i = 1;
+ sal_uInt32 nSoundCount = maEntries.size();
+
+ // create SoundCollection Container
+ rSt.WriteUInt16( 0xf ).WriteUInt16( EPP_SoundCollection ).WriteUInt32( GetSize() - 8 );
+
+ // create SoundCollAtom ( reference to the next free SoundId );
+ rSt.WriteUInt32( EPP_SoundCollAtom << 16 ).WriteUInt32( 4 ).WriteUInt32( nSoundCount );
+
+ for ( const auto& rEntry : maEntries )
+ {
+ rEntry.Write(rSt,i);
+ ++i;
+ }
+}
+
+} // namespace ppt;
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptexsoundcollection.hxx b/sd/source/filter/eppt/pptexsoundcollection.hxx
new file mode 100644
index 000000000..d81bb8118
--- /dev/null
+++ b/sd/source/filter/eppt/pptexsoundcollection.hxx
@@ -0,0 +1,71 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vector>
+
+#ifdef DBG_ANIM_LOG
+#include <stdio.h>
+#endif
+#include <rtl/ustring.hxx>
+
+class SvStream;
+
+namespace ppt
+{
+
+class ExSoundEntry
+{
+ sal_uInt32 nFileSize;
+ OUString aSoundURL;
+
+ OUString ImplGetName() const;
+ OUString ImplGetExtension() const;
+
+ public:
+
+ bool IsSameURL(std::u16string_view rURL) const;
+ sal_uInt32 GetFileSize( ) const { return nFileSize; };
+
+ ExSoundEntry(const OUString& rSoundURL);
+
+ /// @return size of a complete SoundContainer.
+ sal_uInt32 GetSize( sal_uInt32 nId ) const;
+ void Write( SvStream& rSt, sal_uInt32 nId ) const;
+};
+
+class ExSoundCollection
+{
+ public:
+
+ sal_uInt32 GetId(const OUString&);
+
+ /// @return size of a complete SoundCollectionContainer.
+ sal_uInt32 GetSize() const;
+ void Write( SvStream& rSt ) const;
+
+private:
+
+ std::vector<ExSoundEntry> maEntries;
+};
+
+} // namespace ppt
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptx-animations.cxx b/sd/source/filter/eppt/pptx-animations.cxx
new file mode 100644
index 000000000..1c901573c
--- /dev/null
+++ b/sd/source/filter/eppt/pptx-animations.cxx
@@ -0,0 +1,1539 @@
+/* -*- 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 <o3tl/any.hxx>
+#include <oox/token/tokens.hxx>
+#include "epptooxml.hxx"
+#include <sax/fshelper.hxx>
+#include <sal/log.hxx>
+#include <rtl/math.hxx>
+#include <comphelper/sequenceashashmap.hxx>
+
+#include <com/sun/star/animations/AnimationAdditiveMode.hpp>
+#include <com/sun/star/animations/AnimationCalcMode.hpp>
+#include <com/sun/star/animations/AnimationFill.hpp>
+#include <com/sun/star/animations/AnimationNodeType.hpp>
+#include <com/sun/star/animations/AnimationRestart.hpp>
+#include <com/sun/star/animations/AnimationTransformType.hpp>
+#include <com/sun/star/animations/AnimationValueType.hpp>
+#include <com/sun/star/animations/AnimationColorSpace.hpp>
+#include <com/sun/star/animations/Event.hpp>
+#include <com/sun/star/animations/EventTrigger.hpp>
+#include <com/sun/star/animations/Timing.hpp>
+#include <com/sun/star/animations/ValuePair.hpp>
+#include <com/sun/star/animations/XAnimateMotion.hpp>
+#include <com/sun/star/animations/XAnimateTransform.hpp>
+#include <com/sun/star/animations/XAnimationNode.hpp>
+#include <com/sun/star/animations/XAnimationNodeSupplier.hpp>
+#include <com/sun/star/animations/XAnimateColor.hpp>
+#include <com/sun/star/animations/XCommand.hpp>
+#include <com/sun/star/animations/XAudio.hpp>
+#include <com/sun/star/animations/XTransitionFilter.hpp>
+#include <com/sun/star/animations/XIterateContainer.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/presentation/EffectCommands.hpp>
+#include <com/sun/star/presentation/EffectNodeType.hpp>
+#include <com/sun/star/presentation/EffectPresetClass.hpp>
+#include <com/sun/star/presentation/ParagraphTarget.hpp>
+#include <com/sun/star/presentation/TextAnimationType.hpp>
+#include <com/sun/star/text/XSimpleText.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <oox/export/utils.hxx>
+#include <oox/ppt/pptfilterhelpers.hxx>
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
+
+#include "pptexanimations.hxx"
+#include "pptx-animations.hxx"
+#include "../ppt/pptanimations.hxx"
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::animations;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::presentation;
+using namespace ::com::sun::star::uno;
+using namespace ::ppt;
+using namespace oox::drawingml;
+using namespace oox::core;
+using namespace oox;
+
+using ::com::sun::star::beans::NamedValue;
+using ::com::sun::star::drawing::XDrawPage;
+using ::com::sun::star::drawing::XShape;
+using ::com::sun::star::text::XSimpleText;
+using ::sax_fastparser::FSHelperPtr;
+
+namespace
+{
+void WriteAnimationProperty(const FSHelperPtr& pFS, const Any& rAny, sal_Int32 nToken = 0)
+{
+ if (!rAny.hasValue())
+ return;
+
+ ValuePair aPair;
+
+ if (rAny >>= aPair)
+ {
+ double x, y;
+ if ((aPair.First >>= x) && (aPair.Second >>= y))
+ {
+ if (nToken == XML_by)
+ {
+ // MS needs ending values but we have offset values.
+ x += 1.0;
+ y += 1.0;
+ }
+ pFS->singleElementNS(XML_p, nToken, XML_x, OString::number(x * 100000), XML_y,
+ OString::number(y * 100000));
+ }
+ return;
+ }
+
+ sal_Int32 nRgb = {}; // spurious -Werror=maybe-uninitialized
+ double fDouble = {}; // spurious -Werror=maybe-uninitialized
+
+ TypeClass aClass = rAny.getValueType().getTypeClass();
+ bool bWriteToken
+ = nToken
+ && (aClass == TypeClass_LONG || aClass == TypeClass_DOUBLE || aClass == TypeClass_STRING);
+
+ if (bWriteToken)
+ pFS->startElementNS(XML_p, nToken);
+
+ switch (rAny.getValueType().getTypeClass())
+ {
+ case TypeClass_LONG:
+ if (!(rAny >>= nRgb))
+ {
+ assert(false);
+ }
+ pFS->singleElementNS(XML_a, XML_srgbClr, XML_val, I32SHEX(nRgb));
+ break;
+ case TypeClass_DOUBLE:
+ if (!(rAny >>= fDouble))
+ {
+ assert(false);
+ }
+ pFS->singleElementNS(XML_p, XML_fltVal, XML_val, OString::number(fDouble));
+ break;
+ case TypeClass_STRING:
+ pFS->singleElementNS(XML_p, XML_strVal, XML_val, *o3tl::doAccess<OUString>(rAny));
+ break;
+ default:
+ break;
+ }
+
+ if (bWriteToken)
+ pFS->endElementNS(XML_p, nToken);
+}
+
+void WriteAnimateColorColor(const FSHelperPtr& pFS, const Any& rAny, sal_Int32 nToken)
+{
+ if (!rAny.hasValue())
+ return;
+
+ sal_Int32 nColor = 0;
+ if (rAny >>= nColor)
+ {
+ pFS->startElementNS(XML_p, nToken);
+
+ if (nToken == XML_by)
+ {
+ // CT_TLByRgbColorTransform
+ SAL_WARN("sd.eppt", "Export p:rgb in p:by of animClr isn't implemented yet.");
+ }
+ else
+ {
+ // CT_Color
+ pFS->singleElementNS(XML_a, XML_srgbClr, XML_val, I32SHEX(nColor));
+ }
+
+ pFS->endElementNS(XML_p, nToken);
+ }
+
+ Sequence<double> aHSL(3);
+ if (!(rAny >>= aHSL))
+ return;
+
+ pFS->startElementNS(XML_p, nToken);
+
+ if (nToken == XML_by)
+ {
+ // CT_TLByHslColorTransform
+ pFS->singleElementNS(XML_p, XML_hsl, XML_h, OString::number(aHSL[0] * 60000), // ST_Angel
+ XML_s, OString::number(aHSL[1] * 100000), XML_l,
+ OString::number(aHSL[2] * 100000));
+ }
+ else
+ {
+ // CT_Color
+ SAL_WARN("sd.eppt", "Export p:hsl in p:from or p:to of animClr isn't implemented yet.");
+ }
+
+ pFS->endElementNS(XML_p, nToken);
+}
+
+void WriteAnimateTo(const FSHelperPtr& pFS, const Any& rValue, const OUString& rAttributeName)
+{
+ if (!rValue.hasValue())
+ return;
+
+ SAL_INFO("sd.eppt", "to attribute name: " << rAttributeName.toUtf8());
+
+ WriteAnimationProperty(pFS, AnimationExporter::convertAnimateValue(rValue, rAttributeName),
+ XML_to);
+}
+
+void WriteAnimateValues(const FSHelperPtr& pFS, const Reference<XAnimate>& rXAnimate)
+{
+ const Sequence<double> aKeyTimes = rXAnimate->getKeyTimes();
+ if (!aKeyTimes.hasElements())
+ return;
+ const Sequence<Any> aValues = rXAnimate->getValues();
+ const OUString& sFormula = rXAnimate->getFormula();
+ const OUString& rAttributeName = rXAnimate->getAttributeName();
+
+ SAL_INFO("sd.eppt", "animate values, formula: " << sFormula.toUtf8());
+
+ assert(aValues.getLength() == aKeyTimes.getLength());
+
+ pFS->startElementNS(XML_p, XML_tavLst);
+
+ for (int i = 0; i < aKeyTimes.getLength(); i++)
+ {
+ SAL_INFO("sd.eppt", "animate value " << i << ": " << aKeyTimes[i]);
+ if (aValues[i].hasValue())
+ {
+ pFS->startElementNS(XML_p, XML_tav, XML_fmla,
+ sax_fastparser::UseIf(sFormula, !sFormula.isEmpty()), XML_tm,
+ OString::number(static_cast<sal_Int32>(aKeyTimes[i] * 100000.0)));
+ pFS->startElementNS(XML_p, XML_val);
+ ValuePair aPair;
+ if (aValues[i] >>= aPair)
+ {
+ WriteAnimationProperty(
+ pFS, AnimationExporter::convertAnimateValue(aPair.First, rAttributeName));
+ WriteAnimationProperty(
+ pFS, AnimationExporter::convertAnimateValue(aPair.Second, rAttributeName));
+ }
+ else
+ WriteAnimationProperty(
+ pFS, AnimationExporter::convertAnimateValue(aValues[i], rAttributeName));
+
+ pFS->endElementNS(XML_p, XML_val);
+ pFS->endElementNS(XML_p, XML_tav);
+ }
+ }
+
+ pFS->endElementNS(XML_p, XML_tavLst);
+}
+
+// Write condition list ( either prevCondlst or nextCondlst ) of Seq.
+void WriteAnimationCondListForSeq(const FSHelperPtr& pFS, sal_Int32 nToken)
+{
+ const char* pEvent = (nToken == XML_prevCondLst) ? "onPrev" : "onNext";
+
+ pFS->startElementNS(XML_p, nToken);
+ pFS->startElementNS(XML_p, XML_cond, XML_evt, pEvent);
+ pFS->startElementNS(XML_p, XML_tgtEl);
+ pFS->singleElementNS(XML_p, XML_sldTgt);
+ pFS->endElementNS(XML_p, XML_tgtEl);
+ pFS->endElementNS(XML_p, XML_cond);
+ pFS->endElementNS(XML_p, nToken);
+}
+
+const char* convertEventTrigger(sal_Int16 nTrigger)
+{
+ const char* pEvent = nullptr;
+ switch (nTrigger)
+ {
+ case EventTrigger::ON_NEXT:
+ pEvent = "onNext";
+ break;
+ case EventTrigger::ON_PREV:
+ pEvent = "onPrev";
+ break;
+ case EventTrigger::BEGIN_EVENT:
+ pEvent = "begin";
+ break;
+ case EventTrigger::END_EVENT:
+ pEvent = "end";
+ break;
+ case EventTrigger::ON_BEGIN:
+ pEvent = "onBegin";
+ break;
+ case EventTrigger::ON_END:
+ pEvent = "onEnd";
+ break;
+ case EventTrigger::ON_CLICK:
+ pEvent = "onClick";
+ break;
+ case EventTrigger::ON_DBL_CLICK:
+ pEvent = "onDblClick";
+ break;
+ case EventTrigger::ON_STOP_AUDIO:
+ pEvent = "onStopAudio";
+ break;
+ case EventTrigger::ON_MOUSE_ENTER:
+ pEvent = "onMouseOver"; // not exact?
+ break;
+ case EventTrigger::ON_MOUSE_LEAVE:
+ pEvent = "onMouseOut";
+ break;
+ }
+ return pEvent;
+}
+
+void WriteAnimationAttributeName(const FSHelperPtr& pFS, const OUString& rAttributeName)
+{
+ if (rAttributeName.isEmpty())
+ return;
+
+ pFS->startElementNS(XML_p, XML_attrNameLst);
+
+ SAL_INFO("sd.eppt", "write attribute name: " << rAttributeName.toUtf8());
+
+ if (rAttributeName == "X;Y")
+ {
+ pFS->startElementNS(XML_p, XML_attrName);
+ pFS->writeEscaped("ppt_x");
+ pFS->endElementNS(XML_p, XML_attrName);
+
+ pFS->startElementNS(XML_p, XML_attrName);
+ pFS->writeEscaped("ppt_y");
+ pFS->endElementNS(XML_p, XML_attrName);
+ }
+ else
+ {
+ const oox::ppt::ImplAttributeNameConversion* attrConv
+ = oox::ppt::getAttributeConversionList();
+ const char* pAttribute = nullptr;
+
+ while (attrConv->mpAPIName != nullptr)
+ {
+ if (rAttributeName.equalsAscii(attrConv->mpAPIName))
+ {
+ pAttribute = attrConv->mpMSName;
+ break;
+ }
+ attrConv++;
+ }
+
+ if (pAttribute)
+ {
+ pFS->startElementNS(XML_p, XML_attrName);
+ pFS->writeEscaped(pAttribute);
+ pFS->endElementNS(XML_p, XML_attrName);
+ }
+ else
+ {
+ SAL_WARN("sd.eppt", "unhandled animation attribute name: " << rAttributeName);
+ }
+ }
+
+ pFS->endElementNS(XML_p, XML_attrNameLst);
+}
+
+bool isValidTarget(const Any& rTarget)
+{
+ Reference<XShape> xShape;
+
+ if ((rTarget >>= xShape) && xShape.is())
+ return true;
+
+ ParagraphTarget aParagraphTarget;
+
+ return (rTarget >>= aParagraphTarget) && aParagraphTarget.Shape.is();
+}
+
+/// extract ooxml node type from a XAnimationNode.
+sal_Int32 extractNodeType(const Reference<XAnimationNode>& rXNode)
+{
+ sal_Int16 nType = rXNode->getType();
+ sal_Int32 xmlNodeType = -1;
+ switch (nType)
+ {
+ case AnimationNodeType::ITERATE:
+ case AnimationNodeType::PAR:
+ xmlNodeType = XML_par;
+ break;
+ case AnimationNodeType::SEQ:
+ xmlNodeType = XML_seq;
+ break;
+ case AnimationNodeType::ANIMATE:
+ xmlNodeType = XML_anim;
+ break;
+ case AnimationNodeType::ANIMATEMOTION:
+ xmlNodeType = XML_animMotion;
+ break;
+ case AnimationNodeType::ANIMATETRANSFORM:
+ {
+ Reference<XAnimateTransform> xTransform(rXNode, UNO_QUERY);
+ if (xTransform.is())
+ {
+ if (xTransform->getTransformType() == AnimationTransformType::SCALE)
+ xmlNodeType = XML_animScale;
+ else if (xTransform->getTransformType() == AnimationTransformType::ROTATE)
+ xmlNodeType = XML_animRot;
+ }
+ break;
+ }
+ case AnimationNodeType::ANIMATECOLOR:
+ xmlNodeType = XML_animClr;
+ break;
+ case AnimationNodeType::SET:
+ xmlNodeType = XML_set;
+ break;
+ case AnimationNodeType::TRANSITIONFILTER:
+ xmlNodeType = XML_animEffect;
+ break;
+ case AnimationNodeType::COMMAND:
+ xmlNodeType = XML_cmd;
+ break;
+ case AnimationNodeType::AUDIO:
+ xmlNodeType = XML_audio;
+ break;
+ default:
+ SAL_WARN("sd.eppt", "unhandled animation node: " << nType);
+ break;
+ }
+ return xmlNodeType;
+}
+
+/// Convert AnimationRestart to ST_TLTimeNodeRestartType value.
+const char* convertAnimationRestart(sal_Int16 nRestart)
+{
+ const char* pRestart = nullptr;
+ switch (nRestart)
+ {
+ case AnimationRestart::ALWAYS:
+ pRestart = "always";
+ break;
+ case AnimationRestart::WHEN_NOT_ACTIVE:
+ pRestart = "whenNotActive";
+ break;
+ case AnimationRestart::NEVER:
+ pRestart = "never";
+ break;
+ }
+ return pRestart;
+}
+
+/// Convert EffectNodeType to ST_TLTimeNodeType
+const char* convertEffectNodeType(sal_Int16 nType)
+{
+ const char* pNodeType = nullptr;
+ switch (nType)
+ {
+ case EffectNodeType::TIMING_ROOT:
+ pNodeType = "tmRoot";
+ break;
+ case EffectNodeType::MAIN_SEQUENCE:
+ pNodeType = "mainSeq";
+ break;
+ case EffectNodeType::ON_CLICK:
+ pNodeType = "clickEffect";
+ break;
+ case EffectNodeType::AFTER_PREVIOUS:
+ pNodeType = "afterEffect";
+ break;
+ case EffectNodeType::WITH_PREVIOUS:
+ pNodeType = "withEffect";
+ break;
+ case EffectNodeType::INTERACTIVE_SEQUENCE:
+ pNodeType = "interactiveSeq";
+ break;
+ }
+ return pNodeType;
+}
+
+/// Convert EffectPresetClass to ST_TLTimeNodePresetClassType
+const char* convertEffectPresetClass(sal_Int16 nPresetClass)
+{
+ const char* pPresetClass = nullptr;
+ switch (nPresetClass)
+ {
+ case EffectPresetClass::ENTRANCE:
+ pPresetClass = "entr";
+ break;
+ case EffectPresetClass::EXIT:
+ pPresetClass = "exit";
+ break;
+ case EffectPresetClass::EMPHASIS:
+ pPresetClass = "emph";
+ break;
+ case EffectPresetClass::MOTIONPATH:
+ pPresetClass = "path";
+ break;
+ case EffectPresetClass::OLEACTION:
+ pPresetClass = "verb"; // ?
+ break;
+ case EffectPresetClass::MEDIACALL:
+ pPresetClass = "mediacall";
+ break;
+ }
+ return pPresetClass;
+}
+
+/// convert AnimationFill to ST_TLTimeNodeFillType.
+const char* convertAnimationFill(sal_Int16 nFill)
+{
+ const char* pFill = nullptr;
+ switch (nFill)
+ {
+ case AnimationFill::FREEZE:
+ pFill = "hold";
+ break;
+ case AnimationFill::HOLD:
+ pFill = "hold";
+ break;
+ case AnimationFill::REMOVE:
+ pFill = "remove";
+ break;
+ case AnimationFill::TRANSITION:
+ pFill = "transition";
+ break;
+ }
+ return pFill;
+}
+
+/// Convert TextAnimationType to ST_IterateType.
+const char* convertTextAnimationType(sal_Int16 nType)
+{
+ const char* sType = nullptr;
+ switch (nType)
+ {
+ case TextAnimationType::BY_PARAGRAPH:
+ sType = "el";
+ break;
+ case TextAnimationType::BY_LETTER:
+ sType = "lt";
+ break;
+ case TextAnimationType::BY_WORD:
+ default:
+ sType = "wd";
+ break;
+ }
+ return sType;
+}
+
+class NodeContext;
+
+typedef std::unique_ptr<NodeContext> NodeContextPtr;
+
+class NodeContext
+{
+ const Reference<XAnimationNode> mxNode;
+ const bool mbMainSeqChild;
+
+ std::vector<NodeContextPtr> maChildNodes;
+ // if the node has valid target or contains at least one valid target.
+ bool mbValid;
+
+ // Attributes initialized from mxNode->getUserData().
+ sal_Int16 mnEffectNodeType;
+ sal_Int16 mnEffectPresetClass;
+ OUString msEffectPresetId;
+ OUString msEffectPresetSubType;
+
+ /// constructor helper for initializing user data.
+ void initUserData();
+
+ /// constructor helper to initialize maChildNodes.
+ /// return true if at least one childnode is valid.
+ bool initChildNodes();
+
+ /// constructor helper to initialize mbValid
+ void initValid(bool bHasValidChild, bool bIsIterateChild);
+
+public:
+ NodeContext(const Reference<XAnimationNode>& xNode, bool bMainSeqChild, bool bIsIterateChild);
+ const Reference<XAnimationNode>& getNode() const { return mxNode; }
+ bool isMainSeqChild() const { return mbMainSeqChild; }
+ sal_Int16 getEffectNodeType() const { return mnEffectNodeType; }
+ sal_Int16 getEffectPresetClass() const { return mnEffectPresetClass; }
+ const OUString& getEffectPresetId() const { return msEffectPresetId; }
+ const OUString& getEffectPresetSubType() const { return msEffectPresetSubType; }
+ bool isValid() const { return mbValid; }
+ const std::vector<NodeContextPtr>& getChildNodes() const { return maChildNodes; };
+ Any getCondition(bool bBegin) const;
+};
+
+struct Cond
+{
+ OString msDelay;
+ const char* mpEvent;
+ Reference<XShape> mxShape;
+ Reference<XAnimationNode> mxNode;
+
+ Cond(const Any& rAny, bool bIsMainSeqChild);
+
+ bool isValid() const { return msDelay.getLength() || mpEvent; }
+ const char* getDelay() const { return msDelay.getLength() ? msDelay.getStr() : nullptr; }
+};
+
+Cond::Cond(const Any& rAny, bool bIsMainSeqChild)
+ : mpEvent(nullptr)
+{
+ bool bHasFDelay = false;
+ double fDelay = 0;
+ Timing eTiming;
+ Event aEvent;
+
+ if (rAny >>= eTiming)
+ {
+ if (eTiming == Timing_INDEFINITE)
+ msDelay = "indefinite";
+ }
+ else if (rAny >>= aEvent)
+ {
+ if (aEvent.Trigger == EventTrigger::ON_NEXT && bIsMainSeqChild)
+ msDelay = "indefinite";
+ else
+ {
+ mpEvent = convertEventTrigger(aEvent.Trigger);
+ if (!(aEvent.Source >>= mxShape))
+ aEvent.Source >>= mxNode;
+
+ if (aEvent.Offset >>= fDelay)
+ bHasFDelay = true;
+ }
+ }
+ else if (rAny >>= fDelay)
+ bHasFDelay = true;
+
+ if (bHasFDelay)
+ {
+ sal_Int32 nDelay = static_cast<sal_uInt32>(fDelay * 1000.0);
+ msDelay = OString::number(nDelay);
+ }
+}
+
+class PPTXAnimationExport
+{
+ void WriteAnimationNode(const NodeContextPtr& pContext);
+ void WriteAnimationNodeAnimate(sal_Int32 nXmlNodeType);
+ void WriteAnimationNodeAnimateInside(bool bSimple, bool bWriteTo = true);
+ void WriteAnimationNodeSeq();
+ void WriteAnimationNodeEffect();
+ void WriteAnimationNodeCommand();
+ void WriteAnimationNodeAudio();
+ void WriteAnimationNodeCommonPropsStart();
+ void WriteAnimationTarget(const Any& rTarget);
+ void WriteAnimationCondList(const Any& rAny, sal_Int32 nToken);
+ void WriteAnimationCond(const Cond& rCond);
+ bool isMainSeqChild() const;
+ const Reference<XAnimationNode>& getCurrentNode() const;
+
+ PowerPointExport& mrPowerPointExport;
+ const FSHelperPtr& mpFS;
+ const NodeContext* mpContext;
+
+ std::map<Reference<XAnimationNode>, sal_Int32> maAnimationNodeIdMap;
+ sal_Int32 GetNextAnimationNodeId(const Reference<XAnimationNode>& rNode);
+ sal_Int32 GetAnimationNodeId(const Reference<XAnimationNode>& rNode);
+
+public:
+ PPTXAnimationExport(PowerPointExport& rExport, const FSHelperPtr& pFS);
+ void WriteAnimations(const Reference<XDrawPage>& rXDrawPage);
+};
+
+/// Returns if rURL has an extension which is an audio format.
+bool IsAudioURL(const OUString& rURL)
+{
+ return rURL.endsWithIgnoreAsciiCase(".wav") || rURL.endsWithIgnoreAsciiCase(".m4a");
+}
+
+/// Returns if rURL has an extension which is a video format.
+bool IsVideoURL(const OUString& rURL) { return rURL.endsWithIgnoreAsciiCase(".mp4"); }
+}
+
+namespace oox::core
+{
+void WriteAnimations(const FSHelperPtr& pFS, const Reference<XDrawPage>& rXDrawPage,
+ PowerPointExport& rExport)
+{
+ PPTXAnimationExport aAnimationExport(rExport, pFS);
+ aAnimationExport.WriteAnimations(rXDrawPage);
+}
+}
+
+PPTXAnimationExport::PPTXAnimationExport(PowerPointExport& rExport, const FSHelperPtr& pFS)
+ : mrPowerPointExport(rExport)
+ , mpFS(pFS)
+ , mpContext(nullptr)
+{
+}
+
+bool PPTXAnimationExport::isMainSeqChild() const
+{
+ assert(mpContext);
+ return mpContext->isMainSeqChild();
+}
+
+const Reference<XAnimationNode>& PPTXAnimationExport::getCurrentNode() const
+{
+ assert(mpContext);
+ return mpContext->getNode();
+}
+
+void PPTXAnimationExport::WriteAnimationTarget(const Any& rTarget)
+{
+ sal_Int32 nParagraph = -1;
+ bool bParagraphTarget = false;
+
+ Reference<XShape> rXShape;
+ rTarget >>= rXShape;
+
+ if (!rXShape.is())
+ {
+ ParagraphTarget aParagraphTarget;
+ if (rTarget >>= aParagraphTarget)
+ rXShape = aParagraphTarget.Shape;
+ if (rXShape.is())
+ {
+ nParagraph = static_cast<sal_Int32>(aParagraphTarget.Paragraph);
+ Reference<XSimpleText> xText(rXShape, UNO_QUERY);
+ if (xText.is())
+ {
+ bParagraphTarget = true;
+ }
+ }
+ }
+
+ if (!rXShape.is())
+ return;
+
+ sal_Int32 nShapeID = mrPowerPointExport.GetShapeID(rXShape);
+
+ mpFS->startElementNS(XML_p, XML_tgtEl);
+ mpFS->startElementNS(XML_p, XML_spTgt, XML_spid, OString::number(nShapeID));
+ if (bParagraphTarget)
+ {
+ mpFS->startElementNS(XML_p, XML_txEl);
+ mpFS->singleElementNS(XML_p, XML_pRg, XML_st, OString::number(nParagraph), XML_end,
+ OString::number(nParagraph));
+ mpFS->endElementNS(XML_p, XML_txEl);
+ }
+ mpFS->endElementNS(XML_p, XML_spTgt);
+ mpFS->endElementNS(XML_p, XML_tgtEl);
+}
+
+void PPTXAnimationExport::WriteAnimationCondList(const Any& rAny, sal_Int32 nToken)
+{
+ if (!rAny.hasValue())
+ return;
+
+ std::vector<Cond> aList;
+
+ bool bIsMainSeqChild = isMainSeqChild();
+
+ Sequence<Any> aCondSeq;
+ if (rAny >>= aCondSeq)
+ {
+ for (const auto& rCond : std::as_const(aCondSeq))
+ {
+ Cond aCond(rCond, bIsMainSeqChild);
+ if (aCond.isValid())
+ aList.push_back(aCond);
+ }
+ }
+ else
+ {
+ Cond aCond(rAny, bIsMainSeqChild);
+ if (aCond.isValid())
+ aList.push_back(aCond);
+ }
+
+ if (aList.size() > 0)
+ {
+ mpFS->startElementNS(XML_p, nToken);
+
+ for (const Cond& rCond : aList)
+ WriteAnimationCond(rCond);
+
+ mpFS->endElementNS(XML_p, nToken);
+ }
+}
+
+void PPTXAnimationExport::WriteAnimationCond(const Cond& rCond)
+{
+ if (rCond.mpEvent)
+ {
+ sal_Int32 nId = -1;
+ if (rCond.mxShape.is())
+ {
+ mpFS->startElementNS(XML_p, XML_cond, XML_delay, rCond.getDelay(), XML_evt,
+ rCond.mpEvent);
+ WriteAnimationTarget(Any(rCond.mxShape));
+ mpFS->endElementNS(XML_p, XML_cond);
+ }
+ else if (rCond.mxNode.is() && (nId = GetAnimationNodeId(rCond.mxNode)) != -1)
+ {
+ mpFS->startElementNS(XML_p, XML_cond, XML_delay, rCond.getDelay(), XML_evt,
+ rCond.mpEvent);
+ mpFS->singleElementNS(XML_p, XML_tn, XML_val, OString::number(nId));
+ mpFS->endElementNS(XML_p, XML_cond);
+ }
+ else
+ {
+ mpFS->singleElementNS(XML_p, XML_cond, XML_delay, rCond.getDelay(), XML_evt,
+ rCond.mpEvent);
+ }
+ }
+ else
+ mpFS->singleElementNS(XML_p, XML_cond, XML_delay, rCond.getDelay());
+}
+
+void PPTXAnimationExport::WriteAnimationNodeAnimate(sal_Int32 nXmlNodeType)
+{
+ const Reference<XAnimationNode>& rXNode = getCurrentNode();
+ Reference<XAnimate> rXAnimate(rXNode, UNO_QUERY);
+ if (!rXAnimate.is())
+ return;
+
+ const char* pCalcMode = nullptr;
+ const char* pValueType = nullptr;
+ bool bSimple = (nXmlNodeType != XML_anim);
+ bool bTo = true;
+
+ if (!bSimple)
+ {
+ switch (rXAnimate->getCalcMode())
+ {
+ case AnimationCalcMode::DISCRETE:
+ pCalcMode = "discrete";
+ break;
+ case AnimationCalcMode::LINEAR:
+ pCalcMode = "lin";
+ break;
+ }
+
+ switch (AnimationExporter::GetValueTypeForAttributeName(rXAnimate->getAttributeName()))
+ {
+ case AnimationValueType::STRING:
+ pValueType = "str";
+ break;
+ case AnimationValueType::NUMBER:
+ pValueType = "num";
+ break;
+ case AnimationValueType::COLOR:
+ pValueType = "clr";
+ break;
+ }
+ }
+
+ if (nXmlNodeType == XML_animMotion)
+ {
+ OUString aPath;
+ Reference<XAnimateMotion> xMotion(rXNode, UNO_QUERY);
+ if (xMotion.is())
+ {
+ xMotion->getPath() >>= aPath;
+ ::basegfx::B2DPolyPolygon aPolyPoly;
+ if (::basegfx::utils::importFromSvgD(aPolyPoly, aPath, true, nullptr))
+ aPath = ::basegfx::utils::exportToSvgD(aPolyPoly, false, false, true, true);
+ }
+
+ mpFS->startElementNS(XML_p, nXmlNodeType, XML_origin, "layout", XML_path, aPath);
+ }
+ else if (nXmlNodeType == XML_animRot)
+ {
+ // when const char* is nullptr, the attribute is completely omitted in the output
+ const char* pBy = nullptr;
+ const char* pFrom = nullptr;
+ const char* pTo = nullptr;
+ OString aBy, aFrom, aTo;
+
+ Reference<XAnimateTransform> xTransform(rXNode, UNO_QUERY);
+ if (xTransform.is())
+ {
+ double value;
+ if (xTransform->getBy() >>= value)
+ {
+ aBy = OString::number(static_cast<int>(value * PER_DEGREE));
+ pBy = aBy.getStr();
+ }
+
+ if (xTransform->getFrom() >>= value)
+ {
+ aFrom = OString::number(static_cast<int>(value * PER_DEGREE));
+ pFrom = aFrom.getStr();
+ }
+
+ if (xTransform->getTo() >>= value)
+ {
+ aTo = OString::number(static_cast<int>(value * PER_DEGREE));
+ pTo = aTo.getStr();
+ }
+ }
+
+ mpFS->startElementNS(XML_p, nXmlNodeType, XML_by, pBy, XML_from, pFrom, XML_to, pTo);
+ }
+ else if (nXmlNodeType == XML_animClr)
+ {
+ Reference<XAnimateColor> xColor(rXNode, UNO_QUERY);
+ const char* pColorSpace = "rgb";
+ const char* pDirection = nullptr;
+ if (xColor.is() && xColor->getColorInterpolation() == AnimationColorSpace::HSL)
+ {
+ // Note: from, to, by can still be specified in any supported format.
+ pColorSpace = "hsl";
+ pDirection = xColor->getDirection() ? "cw" : "ccw";
+ }
+ mpFS->startElementNS(XML_p, nXmlNodeType, XML_clrSpc, pColorSpace, XML_dir, pDirection,
+ XML_calcmode, pCalcMode, XML_valueType, pValueType);
+ }
+ else
+ {
+ OUString sFrom, sTo, sBy;
+ if (rXAnimate.is() && nXmlNodeType == XML_anim)
+ {
+ OUString sAttributeName = rXAnimate->getAttributeName();
+ Any aFrom
+ = AnimationExporter::convertAnimateValue(rXAnimate->getFrom(), sAttributeName);
+ aFrom >>= sFrom;
+ Any aTo = AnimationExporter::convertAnimateValue(rXAnimate->getTo(), sAttributeName);
+ aTo >>= sTo;
+ Any aBy = AnimationExporter::convertAnimateValue(rXAnimate->getBy(), sAttributeName);
+ aBy >>= sBy;
+ }
+
+ mpFS->startElementNS(XML_p, nXmlNodeType, XML_calcmode, pCalcMode, XML_valueType,
+ pValueType, XML_from, sax_fastparser::UseIf(sFrom, !sFrom.isEmpty()),
+ XML_to, sax_fastparser::UseIf(sTo, !sTo.isEmpty()), XML_by,
+ sax_fastparser::UseIf(sBy, !sBy.isEmpty()));
+ bTo = sTo.isEmpty() && sFrom.isEmpty() && sBy.isEmpty();
+ }
+
+ WriteAnimationNodeAnimateInside(bSimple, bTo);
+ mpFS->endElementNS(XML_p, nXmlNodeType);
+}
+
+void PPTXAnimationExport::WriteAnimationNodeAnimateInside(bool bSimple, bool bWriteTo)
+{
+ const Reference<XAnimationNode>& rXNode = getCurrentNode();
+ Reference<XAnimate> rXAnimate(rXNode, UNO_QUERY);
+ if (!rXAnimate.is())
+ return;
+
+ const char* pAdditive = nullptr;
+
+ if (!bSimple)
+ {
+ switch (rXAnimate->getAdditive())
+ {
+ case AnimationAdditiveMode::BASE:
+ pAdditive = "base";
+ break;
+ case AnimationAdditiveMode::SUM:
+ pAdditive = "sum";
+ break;
+ case AnimationAdditiveMode::REPLACE:
+ pAdditive = "repl";
+ break;
+ case AnimationAdditiveMode::MULTIPLY:
+ pAdditive = "mult";
+ break;
+ case AnimationAdditiveMode::NONE:
+ pAdditive = "none";
+ break;
+ }
+ }
+
+ mpFS->startElementNS(XML_p, XML_cBhvr, XML_additive, pAdditive);
+ WriteAnimationNodeCommonPropsStart();
+
+ Reference<XIterateContainer> xIterate(rXNode->getParent(), UNO_QUERY);
+ WriteAnimationTarget(xIterate.is() ? xIterate->getTarget() : rXAnimate->getTarget());
+
+ Reference<XAnimateTransform> xTransform(rXNode, UNO_QUERY);
+
+ // The attribute name of AnimateTransform is "Transform", we have to fix it.
+ OUString sNewAttr;
+ if (xTransform.is() && xTransform->getTransformType() == AnimationTransformType::ROTATE)
+ sNewAttr = "Rotate";
+
+ WriteAnimationAttributeName(mpFS, xTransform.is() ? sNewAttr : rXAnimate->getAttributeName());
+
+ mpFS->endElementNS(XML_p, XML_cBhvr);
+ WriteAnimateValues(mpFS, rXAnimate);
+
+ Reference<XAnimateColor> xColor(rXNode, UNO_QUERY);
+
+ if (xColor.is())
+ {
+ WriteAnimateColorColor(mpFS, xColor->getBy(), XML_by);
+ WriteAnimateColorColor(mpFS, xColor->getFrom(), XML_from);
+ WriteAnimateColorColor(mpFS, xColor->getTo(), XML_to);
+ }
+ else if (xTransform.is() && xTransform->getTransformType() == AnimationTransformType::SCALE)
+ {
+ WriteAnimationProperty(mpFS, rXAnimate->getBy(), XML_by);
+ WriteAnimationProperty(mpFS, rXAnimate->getFrom(), XML_from);
+ WriteAnimationProperty(mpFS, rXAnimate->getTo(), XML_to);
+ }
+ else if (bWriteTo)
+ WriteAnimateTo(mpFS, rXAnimate->getTo(), rXAnimate->getAttributeName());
+}
+
+void PPTXAnimationExport::WriteAnimationNodeCommonPropsStart()
+{
+ const Reference<XAnimationNode>& rXNode = getCurrentNode();
+ std::optional<OString> sDuration;
+ std::optional<OString> sRepeatCount;
+ const char* pRestart = nullptr;
+ const char* pNodeType = nullptr;
+ const char* pPresetClass = nullptr;
+ const char* pFill = nullptr;
+ double fDuration = 0;
+ double fRepeatCount = 0;
+ Any aAny;
+ assert(mpContext);
+
+ aAny = rXNode->getDuration();
+ if (aAny.hasValue())
+ {
+ Timing eTiming;
+
+ if (aAny >>= eTiming)
+ {
+ if (eTiming == Timing_INDEFINITE)
+ sDuration = "indefinite";
+ }
+ else
+ aAny >>= fDuration;
+ }
+
+ pRestart = convertAnimationRestart(rXNode->getRestart());
+
+ sal_Int16 nType = mpContext->getEffectNodeType();
+ if (nType != -1)
+ {
+ pNodeType = convertEffectNodeType(nType);
+ if (nType == EffectNodeType::TIMING_ROOT)
+ {
+ if (!sDuration)
+ sDuration = "indefinite";
+ if (!pRestart)
+ pRestart = "never";
+ }
+ else if (nType == EffectNodeType::MAIN_SEQUENCE)
+ {
+ sDuration = "indefinite";
+ }
+ }
+
+ if (fDuration != 0)
+ sDuration = OString::number(static_cast<sal_Int32>(fDuration * 1000.0));
+
+ sal_uInt32 nPresetClass = mpContext->getEffectPresetClass();
+ if (nPresetClass != DFF_ANIM_PRESS_CLASS_USER_DEFINED)
+ pPresetClass = convertEffectPresetClass(nPresetClass);
+
+ sal_uInt32 nPresetId = 0;
+ bool bPresetId = false;
+ const OUString& rPresetId = mpContext->getEffectPresetId();
+ if (rPresetId.getLength() > 0)
+ {
+ nPresetId = AnimationExporter::GetPresetID(rPresetId, nPresetClass, bPresetId);
+ bPresetId = true;
+ }
+
+ sal_uInt32 nPresetSubType = 0;
+ bool bPresetSubType = false;
+ const OUString& sPresetSubType = mpContext->getEffectPresetSubType();
+ if (sPresetSubType.getLength() > 0)
+ {
+ nPresetSubType
+ = AnimationExporter::TranslatePresetSubType(nPresetClass, nPresetId, sPresetSubType);
+ bPresetSubType = true;
+ }
+
+ if (nType != EffectNodeType::TIMING_ROOT && nType != EffectNodeType::MAIN_SEQUENCE)
+ {
+ // it doesn't seem to work right on root and mainseq nodes
+ sal_Int16 nFill = AnimationExporter::GetFillMode(rXNode, AnimationFill::AUTO);
+ pFill = convertAnimationFill(nFill);
+ }
+
+ bool bAutoReverse = rXNode->getAutoReverse();
+
+ aAny = rXNode->getRepeatCount();
+ if (aAny.hasValue())
+ {
+ Timing eTiming;
+
+ if (aAny >>= eTiming)
+ {
+ if (eTiming == Timing_INDEFINITE)
+ sRepeatCount = "indefinite";
+ }
+ else
+ aAny >>= fRepeatCount;
+ }
+
+ if (fRepeatCount != 0)
+ sRepeatCount = OString::number(static_cast<sal_Int32>(fRepeatCount * 1000.0));
+
+ mpFS->startElementNS(
+ XML_p, XML_cTn, XML_id, OString::number(GetNextAnimationNodeId(rXNode)), XML_dur, sDuration,
+ XML_autoRev, sax_fastparser::UseIf("1", bAutoReverse), XML_restart, pRestart, XML_nodeType,
+ pNodeType, XML_fill, pFill, XML_presetClass, pPresetClass, XML_presetID,
+ sax_fastparser::UseIf(OString::number(nPresetId), bPresetId), XML_presetSubtype,
+ sax_fastparser::UseIf(OString::number(nPresetSubType), bPresetSubType), XML_repeatCount,
+ sRepeatCount);
+
+ WriteAnimationCondList(mpContext->getCondition(true), XML_stCondLst);
+ WriteAnimationCondList(mpContext->getCondition(false), XML_endCondLst);
+
+ if (rXNode->getType() == AnimationNodeType::ITERATE)
+ {
+ Reference<XIterateContainer> xIterate(rXNode, UNO_QUERY);
+ if (xIterate.is())
+ {
+ const char* sType = convertTextAnimationType(xIterate->getIterateType());
+
+ mpFS->startElementNS(XML_p, XML_iterate, XML_type, sType);
+ mpFS->singleElementNS(XML_p, XML_tmAbs, XML_val,
+ OString::number(xIterate->getIterateInterval() * 1000));
+ mpFS->endElementNS(XML_p, XML_iterate);
+ }
+ }
+
+ const std::vector<NodeContextPtr>& aChildNodes = mpContext->getChildNodes();
+ if (!aChildNodes.empty())
+ {
+ mpFS->startElementNS(XML_p, XML_childTnLst);
+ for (const NodeContextPtr& pChildContext : aChildNodes)
+ {
+ if (pChildContext->isValid())
+ WriteAnimationNode(pChildContext);
+ }
+ mpFS->endElementNS(XML_p, XML_childTnLst);
+ }
+ mpFS->endElementNS(XML_p, XML_cTn);
+}
+
+void PPTXAnimationExport::WriteAnimationNodeSeq()
+{
+ SAL_INFO("sd.eppt", "write animation node SEQ");
+
+ mpFS->startElementNS(XML_p, XML_seq);
+
+ WriteAnimationNodeCommonPropsStart();
+
+ WriteAnimationCondListForSeq(mpFS, XML_prevCondLst);
+ WriteAnimationCondListForSeq(mpFS, XML_nextCondLst);
+
+ mpFS->endElementNS(XML_p, XML_seq);
+}
+
+void PPTXAnimationExport::WriteAnimationNodeEffect()
+{
+ SAL_INFO("sd.eppt", "write animation node FILTER");
+ Reference<XTransitionFilter> xFilter(getCurrentNode(), UNO_QUERY);
+ if (xFilter.is())
+ {
+ const char* pFilter = ::ppt::AnimationExporter::FindTransitionName(
+ xFilter->getTransition(), xFilter->getSubtype(), xFilter->getDirection());
+ const char* pMode = xFilter->getMode() ? "in" : "out";
+ mpFS->startElementNS(XML_p, XML_animEffect, XML_filter, pFilter, XML_transition, pMode);
+
+ WriteAnimationNodeAnimateInside(false);
+
+ mpFS->endElementNS(XML_p, XML_animEffect);
+ }
+}
+
+void PPTXAnimationExport::WriteAnimationNodeCommand()
+{
+ SAL_INFO("sd.eppt", "write animation node COMMAND");
+ Reference<XCommand> xCommand(getCurrentNode(), UNO_QUERY);
+ if (!xCommand.is())
+ return;
+
+ const char* pType = "call";
+ OString aCommand;
+ switch (xCommand->getCommand())
+ {
+ case EffectCommands::VERB:
+ pType = "verb";
+ aCommand = "1"; /* FIXME hardcoded viewing */
+ break;
+ case EffectCommands::PLAY:
+ {
+ aCommand = "play";
+ uno::Sequence<beans::NamedValue> aParamSeq;
+ xCommand->getParameter() >>= aParamSeq;
+ comphelper::SequenceAsHashMap aMap(aParamSeq);
+ auto it = aMap.find("MediaTime");
+ if (it != aMap.end())
+ {
+ double fMediaTime = 0;
+ it->second >>= fMediaTime;
+ // PowerPoint represents 0 as 0.0, so just use a single decimal.
+ OString aMediaTime
+ = rtl::math::doubleToString(fMediaTime, rtl_math_StringFormat_F, 1, '.');
+ aCommand += "From(" + aMediaTime + ")";
+ }
+ break;
+ }
+ case EffectCommands::TOGGLEPAUSE:
+ aCommand = "togglePause";
+ break;
+ case EffectCommands::STOP:
+ aCommand = "stop";
+ break;
+ default:
+ SAL_WARN("sd.eppt", "unknown command: " << xCommand->getCommand());
+ break;
+ }
+
+ mpFS->startElementNS(XML_p, XML_cmd, XML_type, pType, XML_cmd, aCommand.getStr());
+
+ WriteAnimationNodeAnimateInside(false);
+ mpFS->startElementNS(XML_p, XML_cBhvr);
+ WriteAnimationNodeCommonPropsStart();
+ WriteAnimationTarget(xCommand->getTarget());
+ mpFS->endElementNS(XML_p, XML_cBhvr);
+
+ mpFS->endElementNS(XML_p, XML_cmd);
+}
+
+void PPTXAnimationExport::WriteAnimationNodeAudio()
+{
+ SAL_INFO("sd.eppt", "write animation node audio");
+ Reference<XAudio> xAudio(getCurrentNode(), UNO_QUERY);
+
+ OUString sUrl;
+ uno::Reference<drawing::XShape> xShape;
+ OUString sRelId;
+ OUString sName;
+
+ if (!xAudio.is())
+ {
+ return;
+ }
+
+ bool bValid = false;
+ if ((xAudio->getSource() >>= sUrl) && !sUrl.isEmpty() && IsAudioURL(sUrl))
+ {
+ bValid = true;
+ }
+
+ bool bVideo = false;
+ if (!bValid)
+ {
+ if (xAudio->getSource() >>= xShape)
+ {
+ uno::Reference<beans::XPropertySet> xShapeProps(xShape, uno::UNO_QUERY);
+ bool bHasMediaURL = xShapeProps->getPropertySetInfo()->hasPropertyByName("MediaURL");
+ if (bHasMediaURL && (xShapeProps->getPropertyValue("MediaURL") >>= sUrl))
+ {
+ bVideo = IsVideoURL(sUrl);
+ bValid = IsAudioURL(sUrl) || bVideo;
+ }
+ }
+ }
+
+ if (!bValid)
+ return;
+
+ if (!xShape.is())
+ {
+ mrPowerPointExport.embedEffectAudio(mpFS, sUrl, sRelId, sName);
+ }
+
+ if (bVideo)
+ {
+ mpFS->startElementNS(XML_p, XML_video);
+ mpFS->startElementNS(XML_p, XML_cMediaNode);
+ }
+ else
+ {
+ bool bNarration = xAudio->getNarration();
+ mpFS->startElementNS(XML_p, XML_audio, XML_isNarration, bNarration ? "1" : "0");
+ bool bHideDuringShow = xAudio->getHideDuringShow();
+ mpFS->startElementNS(XML_p, XML_cMediaNode, XML_showWhenStopped,
+ bHideDuringShow ? "0" : "1");
+ }
+
+ animations::Timing eTiming{};
+ bool bLooping
+ = (xAudio->getRepeatCount() >>= eTiming) && eTiming == animations::Timing_INDEFINITE;
+ if (bVideo && bLooping)
+ {
+ mpFS->startElementNS(XML_p, XML_cTn, XML_repeatCount, "indefinite");
+ }
+ else
+ {
+ mpFS->startElementNS(XML_p, XML_cTn);
+ }
+ WriteAnimationCondList(mpContext->getCondition(true), XML_stCondLst);
+ WriteAnimationCondList(mpContext->getCondition(false), XML_endCondLst);
+ mpFS->endElementNS(XML_p, XML_cTn);
+
+ mpFS->startElementNS(XML_p, XML_tgtEl);
+ if (xShape.is())
+ {
+ sal_Int32 nShapeID = mrPowerPointExport.GetShapeID(xShape);
+ mpFS->singleElementNS(XML_p, XML_spTgt, XML_spid, OString::number(nShapeID));
+ }
+ else
+ {
+ mpFS->singleElementNS(XML_p, XML_sndTgt, FSNS(XML_r, XML_embed),
+ sax_fastparser::UseIf(sRelId, !sRelId.isEmpty()), XML_name,
+ sax_fastparser::UseIf(sName, !sUrl.isEmpty()));
+ }
+ mpFS->endElementNS(XML_p, XML_tgtEl);
+
+ mpFS->endElementNS(XML_p, XML_cMediaNode);
+ if (bVideo)
+ {
+ mpFS->endElementNS(XML_p, XML_video);
+ }
+ else
+ {
+ mpFS->endElementNS(XML_p, XML_audio);
+ }
+}
+
+void PPTXAnimationExport::WriteAnimationNode(const NodeContextPtr& pContext)
+{
+ const NodeContext* pSavedContext = mpContext;
+ mpContext = pContext.get();
+
+ const Reference<XAnimationNode>& rXNode = getCurrentNode();
+
+ SAL_INFO("sd.eppt", "export node type: " << rXNode->getType());
+ sal_Int32 xmlNodeType = extractNodeType(rXNode);
+
+ switch (xmlNodeType)
+ {
+ case XML_par:
+ mpFS->startElementNS(XML_p, xmlNodeType);
+ WriteAnimationNodeCommonPropsStart();
+ mpFS->endElementNS(XML_p, xmlNodeType);
+ break;
+ case XML_seq:
+ WriteAnimationNodeSeq();
+ break;
+ case XML_animScale:
+ case XML_animRot:
+ case XML_anim:
+ case XML_animMotion:
+ case XML_animClr:
+ case XML_set:
+ WriteAnimationNodeAnimate(xmlNodeType);
+ break;
+ case XML_animEffect:
+ WriteAnimationNodeEffect();
+ break;
+ case XML_cmd:
+ WriteAnimationNodeCommand();
+ break;
+ case XML_audio:
+ WriteAnimationNodeAudio();
+ break;
+ default:
+ SAL_WARN("sd.eppt", "export ooxml node type: " << xmlNodeType);
+ break;
+ }
+
+ mpContext = pSavedContext;
+}
+
+void PPTXAnimationExport::WriteAnimations(const Reference<XDrawPage>& rXDrawPage)
+{
+ Reference<XAnimationNodeSupplier> xNodeSupplier(rXDrawPage, UNO_QUERY);
+ if (!xNodeSupplier.is())
+ return;
+
+ const Reference<XAnimationNode> xNode(xNodeSupplier->getAnimationNode());
+ if (!xNode.is())
+ return;
+
+ Reference<XEnumerationAccess> xEnumerationAccess(xNode, UNO_QUERY);
+ if (!xEnumerationAccess.is())
+ return;
+
+ Reference<XEnumeration> xEnumeration = xEnumerationAccess->createEnumeration();
+ if (!(xEnumeration.is() && xEnumeration->hasMoreElements()))
+ return;
+
+ auto pNodeContext = std::make_unique<NodeContext>(xNode, false, false);
+ if (pNodeContext->isValid())
+ {
+ mpFS->startElementNS(XML_p, XML_timing);
+ mpFS->startElementNS(XML_p, XML_tnLst);
+
+ WriteAnimationNode(pNodeContext);
+
+ mpFS->endElementNS(XML_p, XML_tnLst);
+ mpFS->endElementNS(XML_p, XML_timing);
+ }
+}
+
+sal_Int32 PPTXAnimationExport::GetNextAnimationNodeId(const Reference<XAnimationNode>& xNode)
+{
+ sal_Int32 nId = mrPowerPointExport.GetNextAnimationNodeID();
+ maAnimationNodeIdMap[xNode] = nId;
+ return nId;
+}
+
+sal_Int32 PPTXAnimationExport::GetAnimationNodeId(const Reference<XAnimationNode>& xNode)
+{
+ sal_Int32 nId = -1;
+ const auto& aIter = maAnimationNodeIdMap.find(xNode);
+ if (aIter != maAnimationNodeIdMap.end())
+ {
+ nId = aIter->second;
+ }
+ return nId;
+}
+
+NodeContext::NodeContext(const Reference<XAnimationNode>& xNode, bool bMainSeqChild,
+ bool bIsIterateChild)
+ : mxNode(xNode)
+ , mbMainSeqChild(bMainSeqChild)
+ , mbValid(true)
+ , mnEffectNodeType(-1)
+ , mnEffectPresetClass(DFF_ANIM_PRESS_CLASS_USER_DEFINED)
+{
+ assert(xNode.is());
+
+ initUserData();
+
+ initValid(initChildNodes(), bIsIterateChild);
+}
+
+void NodeContext::initUserData()
+{
+ assert(mxNode.is());
+
+ Sequence<NamedValue> aUserData = mxNode->getUserData();
+ const Any* aIndexedData[DFF_ANIM_PROPERTY_ID_COUNT];
+ AnimationExporter::GetUserData(aUserData, aIndexedData, sizeof(aIndexedData));
+
+ const Any* pAny = aIndexedData[DFF_ANIM_NODE_TYPE];
+ if (pAny)
+ *pAny >>= mnEffectNodeType;
+
+ pAny = aIndexedData[DFF_ANIM_PRESET_CLASS];
+ if (pAny)
+ *pAny >>= mnEffectPresetClass;
+
+ pAny = aIndexedData[DFF_ANIM_PRESET_ID];
+ if (pAny)
+ *pAny >>= msEffectPresetId;
+
+ pAny = aIndexedData[DFF_ANIM_PRESET_SUB_TYPE];
+ if (pAny)
+ *pAny >>= msEffectPresetSubType;
+}
+
+void NodeContext::initValid(bool bHasValidChild, bool bIsIterateChild)
+{
+ sal_Int16 nType = mxNode->getType();
+
+ if (nType == AnimationNodeType::ITERATE)
+ {
+ Reference<XIterateContainer> xIterate(mxNode, UNO_QUERY);
+ mbValid = xIterate.is() && (bIsIterateChild || isValidTarget(xIterate->getTarget()))
+ && !maChildNodes.empty();
+ }
+ else if (nType == AnimationNodeType::COMMAND)
+ {
+ Reference<XCommand> xCommand(mxNode, UNO_QUERY);
+ mbValid = xCommand.is() && (bIsIterateChild || isValidTarget(xCommand->getTarget()));
+ }
+ else if (nType == AnimationNodeType::PAR || nType == AnimationNodeType::SEQ)
+ {
+ mbValid = bHasValidChild;
+ }
+ else if (nType == AnimationNodeType::AUDIO)
+ {
+ Reference<XAudio> xAudio(mxNode, UNO_QUERY);
+ OUString sURL;
+ uno::Reference<drawing::XShape> xShape;
+ mbValid = false;
+ if (xAudio.is())
+ {
+ if (xAudio->getSource() >>= sURL)
+ {
+ mbValid = IsAudioURL(sURL);
+ }
+ else if (xAudio->getSource() >>= xShape)
+ {
+ uno::Reference<beans::XPropertySet> xShapeProps(xShape, uno::UNO_QUERY);
+ bool bHasMediaURL
+ = xShapeProps->getPropertySetInfo()->hasPropertyByName("MediaURL");
+ if (bHasMediaURL && (xShapeProps->getPropertyValue("MediaURL") >>= sURL))
+ {
+ mbValid = IsAudioURL(sURL) || IsVideoURL(sURL);
+ }
+ }
+ }
+ }
+ else
+ {
+ Reference<XAnimate> xAnimate(mxNode, UNO_QUERY);
+ mbValid = xAnimate.is() && (bIsIterateChild || isValidTarget(xAnimate->getTarget()));
+ }
+}
+
+bool NodeContext::initChildNodes()
+{
+ bool bValid = false;
+ Reference<XEnumerationAccess> xEnumerationAccess(mxNode, UNO_QUERY);
+ if (xEnumerationAccess.is())
+ {
+ Reference<XEnumeration> xEnumeration = xEnumerationAccess->createEnumeration();
+ bool bIsMainSeq = mnEffectNodeType == EffectNodeType::MAIN_SEQUENCE;
+ bool bIsIterateChild = mxNode->getType() == AnimationNodeType::ITERATE;
+ if (xEnumeration.is())
+ {
+ while (xEnumeration->hasMoreElements())
+ {
+ Reference<XAnimationNode> xChildNode(xEnumeration->nextElement(), UNO_QUERY);
+ if (xChildNode.is())
+ {
+ auto pChildContext
+ = std::make_unique<NodeContext>(xChildNode, bIsMainSeq, bIsIterateChild);
+ if (pChildContext->isValid())
+ bValid = true;
+ maChildNodes.push_back(std::move(pChildContext));
+ }
+ }
+ }
+ }
+ return bValid;
+}
+
+Any NodeContext::getCondition(bool bBegin) const
+{
+ const bool bParent
+ = (mnEffectNodeType != EffectNodeType::INTERACTIVE_SEQUENCE || maChildNodes.empty());
+ const Reference<XAnimationNode>& rNode = bParent ? mxNode : maChildNodes[0]->getNode();
+
+ return bBegin ? rNode->getBegin() : rNode->getEnd();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptx-animations.hxx b/sd/source/filter/eppt/pptx-animations.hxx
new file mode 100644
index 000000000..24654abb8
--- /dev/null
+++ b/sd/source/filter/eppt/pptx-animations.hxx
@@ -0,0 +1,25 @@
+/* -*- 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/.
+ */
+#pragma once
+
+#include <sax/fshelper.hxx>
+
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/uno/Reference.hxx>
+
+#include "epptooxml.hxx"
+
+namespace oox::core
+{
+void WriteAnimations(const ::sax_fastparser::FSHelperPtr& pFS,
+ const css::uno::Reference<css::drawing::XDrawPage>& rXDrawPage,
+ PowerPointExport& rExport);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptx-epptbase.cxx b/sd/source/filter/eppt/pptx-epptbase.cxx
new file mode 100644
index 000000000..690738996
--- /dev/null
+++ b/sd/source/filter/eppt/pptx-epptbase.cxx
@@ -0,0 +1,1000 @@
+/* -*- 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 "epptbase.hxx"
+#include "epptdef.hxx"
+#include "../ppt/pptanimations.hxx"
+
+#include <o3tl/any.hxx>
+#include <vcl/outdev.hxx>
+#include <rtl/ustring.hxx>
+#include <rtl/strbuf.hxx>
+#include <sal/log.hxx>
+#include <tools/UnitConversion.hxx>
+#include <com/sun/star/awt/Rectangle.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/XMasterPageTarget.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XDrawPages.hpp>
+#include <com/sun/star/animations/TransitionType.hpp>
+#include <com/sun/star/animations/TransitionSubType.hpp>
+#include <com/sun/star/awt/FontFamily.hpp>
+#include <com/sun/star/awt/FontPitch.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <com/sun/star/presentation/XPresentationPage.hpp>
+#include <com/sun/star/text/XSimpleText.hpp>
+#include <com/sun/star/style/XStyle.hpp>
+#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
+#include <com/sun/star/task/XStatusIndicator.hpp>
+
+
+using namespace com::sun::star;
+
+using namespace ::com::sun::star::animations;
+using namespace ::com::sun::star::awt::FontFamily;
+using namespace ::com::sun::star::awt::FontPitch;
+using namespace ::com::sun::star::presentation;
+
+using ::com::sun::star::beans::XPropertySet;
+using ::com::sun::star::container::XNameAccess;
+using ::com::sun::star::container::XNamed;
+using ::com::sun::star::drawing::XMasterPageTarget;
+using ::com::sun::star::drawing::XDrawPage;
+using ::com::sun::star::frame::XModel;
+using ::com::sun::star::style::XStyleFamiliesSupplier;
+using ::com::sun::star::style::XStyle;
+using ::com::sun::star::task::XStatusIndicator;
+using ::com::sun::star::text::XSimpleText;
+using ::com::sun::star::uno::Any;
+using ::com::sun::star::uno::Exception;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::UNO_QUERY;
+
+PHLayout const pPHLayout[] =
+{
+ { EppLayout::TITLESLIDE, { 0x0d, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x0d, 0x10, true, true, false },
+ { EppLayout::TITLEANDBODYSLIDE, { 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x0d, 0x0e, true, true, false },
+ { EppLayout::TITLEANDBODYSLIDE, { 0x0d, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x14, 0x0d, 0x0e, true, true, false },
+ { EppLayout::TWOCOLUMNSANDTITLE, { 0x0d, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x0d, 0x0e, true, true, true },
+ { EppLayout::TWOCOLUMNSANDTITLE, { 0x0d, 0x0e, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x14, 0x0d, 0x0e, true, true, false },
+ { EppLayout::BLANKSLIDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x0d, 0x0e, false, false, false },
+ { EppLayout::TWOCOLUMNSANDTITLE, { 0x0d, 0x0e, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x16, 0x0d, 0x0e, true, true, false },
+ { EppLayout::TWOCOLUMNSANDTITLE, { 0x0d, 0x14, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x14, 0x0d, 0x0e, true, true, false },
+ { EppLayout::TITLEANDBODYSLIDE, { 0x0d, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x15, 0x0d, 0x0e, true, false, false },
+ { EppLayout::TWOCOLUMNSANDTITLE, { 0x0d, 0x16, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x16, 0x0d, 0x0e, true, true, false },
+ { EppLayout::TWOCOLUMNSANDTITLE, { 0x0d, 0x0e, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x13, 0x0d, 0x0e, true, true, false },
+ { EppLayout::TITLEANDBODYSLIDE, { 0x0d, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x13, 0x0d, 0x0e, true, false, false },
+ { EppLayout::RIGHTCOLUMN2ROWS, { 0x0d, 0x0e, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00 }, 0x13, 0x0d, 0x0e, true, true, false },
+ { EppLayout::TWOCOLUMNSANDTITLE, { 0x0d, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x13, 0x0d, 0x0e, true, true, false },
+ { EppLayout::TWOROWSANDTITLE, { 0x0d, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x13, 0x0d, 0x0e, true, true, false },
+ { EppLayout::LEFTCOLUMN2ROWS, { 0x0d, 0x13, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x00 }, 0x13, 0x0d, 0x0e, true, true, false },
+ { EppLayout::TOPROW2COLUMN, { 0x0d, 0x13, 0x13, 0x0e, 0x00, 0x00, 0x00, 0x00 }, 0x13, 0x0d, 0x0e, true, true, false },
+ { EppLayout::TWOROWSANDTITLE, { 0x0d, 0x0e, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x13, 0x0d, 0x0e, true, true, false },
+ { EppLayout::FOUROBJECTS, { 0x0d, 0x13, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00 }, 0x13, 0x0d, 0x0e, true, false, false },
+ { EppLayout::ONLYTITLE, { 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x0d, 0x0e, true, false, false },
+ { EppLayout::BLANKSLIDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x0d, 0x0e, false, false, false },
+ { EppLayout::TITLERIGHT2BODIESLEFT, { 0x11, 0x12, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x14, 0x11, 0x12, true, true, false },
+ { EppLayout::TITLERIGHTBODYLEFT, { 0x11, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x11, 0x12, true, true, false },
+ { EppLayout::TITLEANDBODYSLIDE, { 0x0d, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x0d, 0x12, true, true, false },
+ { EppLayout::TWOCOLUMNSANDTITLE, { 0x0d, 0x16, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x16, 0x0d, 0x12, true, true, false }
+};
+
+PPTWriterBase::PPTWriterBase()
+ : mbStatusIndicator(false)
+ , mbPresObj(false)
+ , mbEmptyPresObj(false)
+ , mbIsBackgroundDark(false)
+ , mnAngle(0)
+ , mnPages(0)
+ , mnMasterPages(0)
+ , maFraction(1, 576)
+ , maMapModeSrc(MapUnit::Map100thMM)
+ , maMapModeDest(MapUnit::MapInch, Point(), maFraction, maFraction)
+ , meLatestPageType(NORMAL)
+ , mpStyleSheet(nullptr)
+{
+ SAL_INFO("sd.eppt", "PPTWriterBase::PPTWriterBase()");
+}
+
+PPTWriterBase::PPTWriterBase( const Reference< XModel > & rXModel,
+ const Reference< XStatusIndicator > & rXStatInd )
+ : mXModel(rXModel)
+ , mXStatusIndicator(rXStatInd)
+ , mbStatusIndicator(false)
+ , mbPresObj(false)
+ , mbEmptyPresObj(false)
+ , mbIsBackgroundDark(false)
+ , mnAngle(0)
+ , mnPages(0)
+ , mnMasterPages(0)
+ , maFraction(1, 576)
+ , maMapModeSrc(MapUnit::Map100thMM)
+ , maMapModeDest(MapUnit::MapInch, Point(), maFraction, maFraction)
+ , meLatestPageType (NORMAL)
+ , mpStyleSheet(nullptr)
+{
+}
+
+PPTWriterBase::~PPTWriterBase()
+{
+ // Possibly unnecessary sanity check for mXStatusIndicator.is().
+ // In 3.3 we had a bug report of a crash where it was null,
+ // https://bugzilla.novell.com/show_bug.cgi?id=694119 (non-public,
+ // bug report, sorry).
+ if ( mbStatusIndicator && mXStatusIndicator.is() )
+ mXStatusIndicator->end();
+}
+
+void PPTWriterBase::exportPPT( const std::vector< css::beans::PropertyValue >& rMediaData )
+{
+ if ( !InitSOIface() )
+ return;
+
+ FontCollectionEntry aDefaultFontDesc( "Times New Roman",
+ ROMAN,
+ awt::FontPitch::VARIABLE,
+ RTL_TEXTENCODING_MS_1252 );
+ maFontCollection.GetId( aDefaultFontDesc ); // default is always times new roman
+
+ if ( !GetPageByIndex( 0, NOTICE ) )
+ return;
+
+ sal_Int32 nWidth = 21000;
+ if ( ImplGetPropertyValue( mXPagePropSet, "Width" ) )
+ mAny >>= nWidth;
+ sal_Int32 nHeight = 29700;
+ if ( ImplGetPropertyValue( mXPagePropSet, "Height" ) )
+ mAny >>= nHeight;
+
+ maNotesPageSize = MapSize( awt::Size( nWidth, nHeight ) );
+
+ if ( !GetPageByIndex( 0, MASTER ) )
+ return;
+
+ nWidth = 28000;
+ if ( ImplGetPropertyValue( mXPagePropSet, "Width" ) )
+ mAny >>= nWidth;
+ nHeight = 21000;
+ if ( ImplGetPropertyValue( mXPagePropSet, "Height" ) )
+ mAny >>= nHeight;
+ maDestPageSize = MapSize( awt::Size( nWidth, nHeight ) );
+ maPageSize = awt::Size(nWidth, nHeight);
+
+ SAL_INFO("sd.eppt", "call exportDocumentPre()");
+ exportPPTPre(rMediaData);
+
+ if ( !GetStyleSheets() )
+ return;
+
+ if ( !ImplCreateDocument() )
+ return;
+
+ sal_uInt32 i;
+
+ for ( i = 0; i < mnMasterPages; i++ )
+ {
+ if ( !CreateSlideMaster( i ) )
+ return;
+ }
+ if ( !CreateMainNotes() )
+ return;
+
+ for ( i = 0; i < mnPages; i++ )
+ {
+ SAL_INFO("sd.eppt", "call ImplCreateSlide( " << i << " )");
+ if ( !CreateSlide( i ) )
+ return;
+ }
+
+ for ( i = 0; i < mnPages; i++ )
+ {
+ if ( !CreateNotes( i ) )
+ return;
+ }
+
+ SAL_INFO("sd.eppt", "call exportDocumentPost()");
+ exportPPTPost();
+}
+
+bool PPTWriterBase::InitSOIface()
+{
+ while( true )
+ {
+ mXDrawPagesSupplier.set( mXModel, UNO_QUERY );
+ if ( !mXDrawPagesSupplier.is() )
+ break;
+
+ mXMasterPagesSupplier.set( mXModel, UNO_QUERY );
+ if ( !mXMasterPagesSupplier.is() )
+ break;
+ mXDrawPages = mXMasterPagesSupplier->getMasterPages();
+ if ( !mXDrawPages.is() )
+ break;
+ mnMasterPages = mXDrawPages->getCount();
+ mXDrawPages = mXDrawPagesSupplier->getDrawPages();
+ if( !mXDrawPages.is() )
+ break;
+ mnPages = mXDrawPages->getCount();
+ if ( !GetPageByIndex( 0, NORMAL ) )
+ break;
+
+ return true;
+ }
+ return false;
+}
+
+bool PPTWriterBase::GetPageByIndex( sal_uInt32 nIndex, PageType ePageType )
+{
+ while( true )
+ {
+ if ( ePageType != meLatestPageType )
+ {
+ switch( ePageType )
+ {
+ case NORMAL :
+ case NOTICE :
+ {
+ mXDrawPages = mXDrawPagesSupplier->getDrawPages();
+ if( !mXDrawPages.is() )
+ return false;
+ }
+ break;
+
+ case MASTER :
+ {
+ mXDrawPages = mXMasterPagesSupplier->getMasterPages();
+ if( !mXDrawPages.is() )
+ return false;
+ }
+ break;
+ default:
+ break;
+ }
+ meLatestPageType = ePageType;
+ }
+ Any aAny( mXDrawPages->getByIndex( nIndex ) );
+ aAny >>= mXDrawPage;
+ if ( !mXDrawPage.is() )
+ break;
+ if ( ePageType == NOTICE )
+ {
+ Reference< XPresentationPage > aXPresentationPage( mXDrawPage, UNO_QUERY );
+ if ( !aXPresentationPage.is() )
+ break;
+ mXDrawPage = aXPresentationPage->getNotesPage();
+ if ( !mXDrawPage.is() )
+ break;
+ }
+ mXPagePropSet.set( mXDrawPage, UNO_QUERY );
+ if ( !mXPagePropSet.is() )
+ break;
+
+ if (GetPropertyValue( aAny, mXPagePropSet, "IsBackgroundDark" ) )
+ aAny >>= mbIsBackgroundDark;
+
+ mXShapes = mXDrawPage;
+ if ( !mXShapes.is() )
+ break;
+
+ /* try to get the "real" background PropertySet. If the normal page is not supporting this property, it is
+ taken the property from the master */
+ bool bHasBackground = GetPropertyValue( aAny, mXPagePropSet, "Background", true );
+ if ( bHasBackground )
+ bHasBackground = ( aAny >>= mXBackgroundPropSet );
+ if ( !bHasBackground )
+ {
+ Reference< XMasterPageTarget > aXMasterPageTarget( mXDrawPage, UNO_QUERY );
+ if ( aXMasterPageTarget.is() )
+ {
+ Reference< XDrawPage > aXMasterDrawPage = aXMasterPageTarget->getMasterPage();
+ if ( aXMasterDrawPage.is() )
+ {
+ Reference< XPropertySet > aXMasterPagePropSet;
+ aXMasterPagePropSet.set( aXMasterDrawPage, UNO_QUERY );
+ if ( aXMasterPagePropSet.is() )
+ {
+ bool bBackground = GetPropertyValue( aAny, aXMasterPagePropSet, "Background" );
+ if ( bBackground )
+ {
+ aAny >>= mXBackgroundPropSet;
+ }
+ }
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+bool PPTWriterBase::CreateSlide( sal_uInt32 nPageNum )
+{
+ Any aAny;
+
+ if ( !GetPageByIndex( nPageNum, NORMAL ) )
+ return false;
+
+ sal_uInt32 nMasterNum = GetMasterIndex( NORMAL );
+ SetCurrentStyleSheet( nMasterNum );
+
+ Reference< XPropertySet > aXBackgroundPropSet;
+ bool bHasBackground = GetPropertyValue( aAny, mXPagePropSet, "Background" );
+ if ( bHasBackground )
+ bHasBackground = ( aAny >>= aXBackgroundPropSet );
+
+ sal_uInt16 nMode = 7; // Bit 1: Follow master objects, Bit 2: Follow master scheme, Bit 3: Follow master background
+ if ( bHasBackground )
+ nMode &=~4;
+
+/* sj: Don't know what's IsBackgroundVisible for, have to ask cl
+ if ( GetPropertyValue( aAny, mXPagePropSet, OUString( "IsBackgroundVisible" ) ) )
+ {
+ bool bBackgroundVisible;
+ if ( aAny >>= bBackgroundVisible )
+ {
+ if ( bBackgroundVisible )
+ nMode &= ~4;
+ }
+ }
+*/
+ if ( GetPropertyValue( aAny, mXPagePropSet, "IsBackgroundObjectsVisible" ) )
+ {
+ bool bBackgroundObjectsVisible = false;
+ if ( aAny >>= bBackgroundObjectsVisible )
+ {
+ if ( !bBackgroundObjectsVisible )
+ nMode &= ~1;
+ }
+ }
+
+ ImplWriteSlide( nPageNum, nMasterNum, nMode, bHasBackground, aXBackgroundPropSet );
+
+ return true;
+};
+
+bool PPTWriterBase::CreateNotes( sal_uInt32 nPageNum )
+{
+ if ( !GetPageByIndex( nPageNum, NOTICE ) )
+ return false;
+ SetCurrentStyleSheet( GetMasterIndex( NORMAL ) );
+
+ ImplWriteNotes( nPageNum );
+
+ return true;
+};
+
+bool PPTWriterBase::CreateSlideMaster( sal_uInt32 nPageNum )
+{
+ if ( !GetPageByIndex( nPageNum, MASTER ) )
+ return false;
+ SetCurrentStyleSheet( nPageNum );
+
+ css::uno::Reference< css::beans::XPropertySet > aXBackgroundPropSet;
+ if (ImplGetPropertyValue(mXPagePropSet, "Background")) // load background shape
+ mAny >>= aXBackgroundPropSet;
+
+ ImplWriteSlideMaster( nPageNum, aXBackgroundPropSet );
+
+ return true;
+};
+
+sal_Int32 PPTWriterBase::GetLayoutOffset( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet )
+{
+ css::uno::Any aAny;
+ sal_Int32 nLayout = 20;
+ if ( GetPropertyValue( aAny, rXPropSet, "Layout", true ) )
+ aAny >>= nLayout;
+
+ SAL_INFO("sd.eppt", "GetLayoutOffset " << nLayout);
+
+ return nLayout;
+}
+
+sal_Int32 PPTWriterBase::GetLayoutOffsetFixed( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet )
+{
+ sal_Int32 nLayout = GetLayoutOffset( rXPropSet );
+
+ if ( ( nLayout >= 21 ) && ( nLayout <= 26 ) ) // NOTES _> HANDOUT6
+ nLayout = 20;
+ if ( ( nLayout >= 27 ) && ( nLayout <= 30 ) ) // VERTICAL LAYOUT
+ nLayout -= 6;
+ else if ( nLayout > 30 )
+ nLayout = 20;
+
+ return nLayout;
+}
+
+PHLayout const & PPTWriterBase::GetLayout( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet )
+{
+ return pPHLayout[ GetLayoutOffsetFixed( rXPropSet ) ];
+}
+
+PHLayout const & PPTWriterBase::GetLayout( sal_Int32 nOffset )
+{
+ if( nOffset >= 0 && nOffset < EPP_LAYOUT_SIZE )
+ return pPHLayout[ nOffset ];
+
+ SAL_INFO("sd.eppt", "asked " << nOffset << " for layout outside of 0, " << EPP_LAYOUT_SIZE << " array scope");
+
+ return pPHLayout[ 0 ];
+}
+
+sal_uInt32 PPTWriterBase::GetMasterIndex( PageType ePageType )
+{
+ sal_uInt32 nRetValue = 0;
+ css::uno::Reference< css::drawing::XMasterPageTarget >aXMasterPageTarget( mXDrawPage, css::uno::UNO_QUERY );
+
+ if ( aXMasterPageTarget.is() )
+ {
+ css::uno::Reference< css::drawing::XDrawPage >aXDrawPage = aXMasterPageTarget->getMasterPage();
+ if ( aXDrawPage.is() )
+ {
+ css::uno::Reference< css::beans::XPropertySet > aXPropertySet( aXDrawPage, css::uno::UNO_QUERY );
+ if ( aXPropertySet.is() )
+ {
+ if ( ImplGetPropertyValue( aXPropertySet, "Number" ) )
+ nRetValue |= *o3tl::doAccess<sal_Int16>(mAny);
+ if ( nRetValue & 0xffff ) // avoid overflow
+ nRetValue--;
+ }
+ }
+ }
+ if ( ePageType == NOTICE )
+ nRetValue += mnMasterPages;
+ return nRetValue;
+}
+
+void PPTWriterBase::SetCurrentStyleSheet( sal_uInt32 nPageNum )
+{
+ if ( nPageNum >= maStyleSheetList.size() )
+ nPageNum = 0;
+ mpStyleSheet = maStyleSheetList[ nPageNum ].get();
+}
+
+bool PPTWriterBase::GetStyleSheets()
+{
+ int nInstance, nLevel;
+ bool bRetValue = false;
+ sal_uInt32 nPageNum;
+
+ for ( nPageNum = 0; nPageNum < mnMasterPages; nPageNum++ )
+ {
+ Reference< XNamed >
+ aXNamed;
+
+ Reference< XNameAccess >
+ aXNameAccess;
+
+ Reference< XStyleFamiliesSupplier >
+ aXStyleFamiliesSupplier( mXModel, UNO_QUERY );
+
+ Reference< XPropertySet >
+ aXPropSet( mXModel, UNO_QUERY );
+
+ sal_uInt16 nDefaultTab = ( aXPropSet.is() && ImplGetPropertyValue( aXPropSet, "TabStop" ) )
+ ? static_cast<sal_uInt16>( convertMm100ToMasterUnit(*o3tl::doAccess<sal_Int32>(mAny)) )
+ : 1250;
+
+ maStyleSheetList.emplace_back( new PPTExStyleSheet( nDefaultTab, dynamic_cast<PPTExBulletProvider*>(this) ) );
+ SetCurrentStyleSheet( nPageNum );
+ if ( GetPageByIndex( nPageNum, MASTER ) )
+ aXNamed.set( mXDrawPage, UNO_QUERY );
+
+ if ( aXStyleFamiliesSupplier.is() )
+ aXNameAccess = aXStyleFamiliesSupplier->getStyleFamilies();
+
+ bRetValue = aXNamed.is() && aXNameAccess.is() && aXStyleFamiliesSupplier.is();
+ if ( bRetValue )
+ {
+ for ( nInstance = EPP_TEXTTYPE_Title; nInstance <= EPP_TEXTTYPE_CenterTitle; nInstance++ )
+ {
+ OUString aStyle;
+ OUString aFamily;
+ switch ( nInstance )
+ {
+ case EPP_TEXTTYPE_CenterTitle :
+ case EPP_TEXTTYPE_Title :
+ {
+ aStyle = "title";
+ aFamily = aXNamed->getName();
+ }
+ break;
+ case EPP_TEXTTYPE_Body :
+ {
+ aStyle = "outline1"; // SD_LT_SEPARATOR
+ aFamily = aXNamed->getName();
+ }
+ break;
+ case EPP_TEXTTYPE_Other :
+ {
+ aStyle = "standard";
+ aFamily = "graphics";
+ }
+ break;
+ case EPP_TEXTTYPE_CenterBody :
+ {
+ aStyle = "subtitle";
+ aFamily = aXNamed->getName();
+ }
+ break;
+ }
+ if ( !aStyle.isEmpty() && !aFamily.isEmpty() )
+ {
+ try
+ {
+ Reference< XNameAccess >xNameAccess;
+ if ( aXNameAccess->hasByName( aFamily ) )
+ {
+ Any aAny( aXNameAccess->getByName( aFamily ) );
+ xNameAccess.set(aAny, css::uno::UNO_QUERY);
+ if( xNameAccess.is() )
+ {
+ Reference< XNameAccess > aXFamily;
+ if ( aAny >>= aXFamily )
+ {
+ if ( aXFamily->hasByName( aStyle ) )
+ {
+ aAny = aXFamily->getByName( aStyle );
+ Reference< XStyle > xStyle(
+ aAny, css::uno::UNO_QUERY);
+ if( xStyle.is() )
+ {
+ Reference< XStyle > aXStyle;
+ aAny >>= aXStyle;
+ Reference< XPropertySet >
+ xPropSet( aXStyle, UNO_QUERY );
+ if( xPropSet.is() )
+ mpStyleSheet->SetStyleSheet( xPropSet, maFontCollection, nInstance, 0 );
+ for ( nLevel = 1; nLevel < 5; nLevel++ )
+ {
+ if ( nInstance == EPP_TEXTTYPE_Body )
+ {
+ sal_Unicode cTemp = aStyle[aStyle.getLength() - 1];
+ aStyle = aStyle.subView(0, aStyle.getLength() - 1) + OUStringChar(++cTemp);
+ if ( aXFamily->hasByName( aStyle ) )
+ {
+ aXFamily->getByName( aStyle ) >>= xStyle;
+ if( xStyle.is() )
+ {
+ Reference< XPropertySet >
+ xPropertySet( xStyle, UNO_QUERY );
+ if ( xPropertySet.is() )
+ mpStyleSheet->SetStyleSheet( xPropertySet, maFontCollection, nInstance, nLevel );
+ }
+ }
+ }
+ else
+ mpStyleSheet->SetStyleSheet( xPropSet, maFontCollection, nInstance, nLevel );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+
+ }
+ }
+ }
+ for ( ; nInstance <= EPP_TEXTTYPE_QuarterBody; nInstance++ )
+ {
+
+ }
+ }
+ }
+ return bRetValue;
+}
+
+bool PPTWriterBase::CreateMainNotes()
+{
+ if ( !GetPageByIndex( 0, NOTICE ) )
+ return false;
+ SetCurrentStyleSheet( 0 );
+
+ css::uno::Reference< css::drawing::XMasterPageTarget > aXMasterPageTarget( mXDrawPage, css::uno::UNO_QUERY );
+
+ if ( !aXMasterPageTarget.is() )
+ return false;
+
+ mXDrawPage = aXMasterPageTarget->getMasterPage();
+ if ( !mXDrawPage.is() )
+ return false;
+
+ mXPropSet.set( mXDrawPage, css::uno::UNO_QUERY );
+ if ( !mXPropSet.is() )
+ return false;
+
+ mXShapes = mXDrawPage;
+ if ( !mXShapes.is() )
+ return false;
+
+ return ImplCreateMainNotes();
+}
+
+awt::Size PPTWriterBase::MapSize( const awt::Size& rSize )
+{
+ Size aRetSize( OutputDevice::LogicToLogic( Size( rSize.Width, rSize.Height ), maMapModeSrc, maMapModeDest ) );
+
+ if ( !aRetSize.Width() )
+ aRetSize.AdjustWidth( 1 );
+ if ( !aRetSize.Height() )
+ aRetSize.AdjustHeight( 1 );
+ return awt::Size( aRetSize.Width(), aRetSize.Height() );
+}
+
+awt::Point PPTWriterBase::MapPoint( const awt::Point& rPoint )
+{
+ Point aRet( OutputDevice::LogicToLogic( Point( rPoint.X, rPoint.Y ), maMapModeSrc, maMapModeDest ) );
+ return awt::Point( aRet.X(), aRet.Y() );
+}
+
+::tools::Rectangle PPTWriterBase::MapRectangle( const awt::Rectangle& rRect )
+{
+ css::awt::Point aPoint( rRect.X, rRect.Y );
+ css::awt::Size aSize( rRect.Width, rRect.Height );
+ css::awt::Point aP( MapPoint( aPoint ) );
+ css::awt::Size aS( MapSize( aSize ) );
+ return ::tools::Rectangle( Point( aP.X, aP.Y ), Size( aS.Width, aS.Height ) );
+}
+
+bool PPTWriterBase::GetShapeByIndex( sal_uInt32 nIndex, bool bGroup )
+{
+ while(true)
+ {
+ if ( !bGroup || ( GetCurrentGroupLevel() == 0 ) )
+ {
+ Any aAny( mXShapes->getByIndex( nIndex ) );
+ aAny >>= mXShape;
+ }
+ else
+ {
+ Any aAny( GetCurrentGroupAccess()->getByIndex( GetCurrentGroupIndex() ) );
+ aAny >>= mXShape;
+ }
+ if ( !mXShape.is() )
+ break;
+
+ Any aAny( mXShape->queryInterface( cppu::UnoType<XPropertySet>::get()));
+ aAny >>= mXPropSet;
+
+ if ( !mXPropSet.is() )
+ break;
+ maPosition = MapPoint( mXShape->getPosition() );
+ maSize = MapSize( mXShape->getSize() );
+ maRect = ::tools::Rectangle( Point( maPosition.X, maPosition.Y ), Size( maSize.Width, maSize.Height ) );
+
+ OStringBuffer aTypeBuffer(OUStringToOString(
+ mXShape->getShapeType(), RTL_TEXTENCODING_UTF8));
+ // remove "com.sun.star."
+ aTypeBuffer.remove(0, RTL_CONSTASCII_LENGTH("com.sun.star."));
+
+ sal_Int32 nPos = aTypeBuffer.toString().indexOf("Shape");
+ aTypeBuffer.remove(nPos, RTL_CONSTASCII_LENGTH("Shape"));
+ mType = aTypeBuffer.makeStringAndClear();
+
+ mbPresObj = mbEmptyPresObj = false;
+ if ( ImplGetPropertyValue( "IsPresentationObject" ) )
+ mAny >>= mbPresObj;
+
+ if ( mbPresObj && ImplGetPropertyValue( "IsEmptyPresentationObject" ) )
+ mAny >>= mbEmptyPresObj;
+
+ mnAngle = ( PropValue::GetPropertyValue( aAny,
+ mXPropSet, "RotateAngle", true ) )
+ ? *o3tl::doAccess<sal_Int32>(aAny)
+ : 0;
+
+ return true;
+ }
+ return false;
+}
+
+sal_Int8 PPTWriterBase::GetTransition( sal_Int16 nTransitionType, sal_Int16 nTransitionSubtype, FadeEffect eEffect,
+ sal_Int32 nTransitionFadeColor, sal_uInt8& nDirection )
+{
+ sal_Int8 nPPTTransitionType = 0;
+ nDirection = 0;
+
+ switch( nTransitionType )
+ {
+ case TransitionType::FADE :
+ {
+ if ( nTransitionSubtype == TransitionSubType::CROSSFADE )
+ nPPTTransitionType = PPT_TRANSITION_TYPE_SMOOTHFADE;
+ else if ( nTransitionSubtype == TransitionSubType::FADEOVERCOLOR )
+ {
+ if( nTransitionFadeColor == static_cast<sal_Int32>(COL_WHITE) )
+ nPPTTransitionType = PPT_TRANSITION_TYPE_FLASH;
+ else
+ nPPTTransitionType = PPT_TRANSITION_TYPE_FADE;
+ }
+ }
+ break;
+ case TransitionType::PUSHWIPE :
+ {
+ if (nTransitionSubtype == TransitionSubType::COMBVERTICAL ||
+ nTransitionSubtype == TransitionSubType::COMBHORIZONTAL)
+ {
+ nPPTTransitionType = PPT_TRANSITION_TYPE_COMB;
+ }
+ else
+ {
+ nPPTTransitionType = PPT_TRANSITION_TYPE_PUSH;
+ }
+ switch (nTransitionSubtype)
+ {
+ case TransitionSubType::FROMRIGHT: nDirection = 0; break;
+ case TransitionSubType::FROMBOTTOM: nDirection = 1; break;
+ case TransitionSubType::FROMLEFT: nDirection = 2; break;
+ case TransitionSubType::FROMTOP: nDirection = 3; break;
+ case TransitionSubType::COMBHORIZONTAL: nDirection = 0; break;
+ case TransitionSubType::COMBVERTICAL: nDirection = 1; break;
+ }
+ }
+ break;
+ case TransitionType::PINWHEELWIPE :
+ {
+ nPPTTransitionType = PPT_TRANSITION_TYPE_WHEEL;
+ switch( nTransitionSubtype )
+ {
+ case TransitionSubType::ONEBLADE: nDirection = 1; break;
+ case TransitionSubType::TWOBLADEVERTICAL : nDirection = 2; break;
+ case TransitionSubType::THREEBLADE : nDirection = 3; break;
+ case TransitionSubType::FOURBLADE: nDirection = 4; break;
+ case TransitionSubType::EIGHTBLADE: nDirection = 8; break;
+ }
+ }
+ break;
+ case TransitionType::FANWIPE :
+ {
+ nPPTTransitionType = PPT_TRANSITION_TYPE_WEDGE;
+ }
+ break;
+ case TransitionType::ELLIPSEWIPE :
+ {
+ switch( nTransitionSubtype ) {
+ case TransitionSubType::VERTICAL:
+ case TransitionSubType::HORIZONTAL:
+ // no ellipse or oval in PPT or OOXML, fallback to circle
+ default:
+ nPPTTransitionType = PPT_TRANSITION_TYPE_CIRCLE;
+ }
+ }
+ break;
+ case TransitionType::FOURBOXWIPE :
+ {
+ nPPTTransitionType = PPT_TRANSITION_TYPE_PLUS;
+ }
+ break;
+ case TransitionType::IRISWIPE :
+ {
+ switch( nTransitionSubtype ) {
+ case TransitionSubType::RECTANGLE:
+ nPPTTransitionType = PPT_TRANSITION_TYPE_ZOOM;
+ nDirection = (eEffect == FadeEffect_FADE_FROM_CENTER) ? 0 : 1;
+ break;
+ default:
+ nPPTTransitionType = PPT_TRANSITION_TYPE_DIAMOND;
+ break;
+ }
+ }
+ break;
+ case TransitionType::ZOOM:
+ {
+ switch(nTransitionSubtype)
+ {
+ case TransitionSubType::ROTATEIN:
+ nPPTTransitionType = PPT_TRANSITION_TYPE_NEWSFLASH;
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ }
+
+ return nPPTTransitionType;
+}
+
+sal_Int8 PPTWriterBase::GetTransition( FadeEffect eEffect, sal_uInt8& nDirection )
+{
+ sal_Int8 nPPTTransitionType = 0;
+
+ switch ( eEffect )
+ {
+ default :
+ case FadeEffect_RANDOM :
+ nPPTTransitionType = PPT_TRANSITION_TYPE_RANDOM;
+ break;
+
+ case FadeEffect_HORIZONTAL_STRIPES :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_VERTICAL_STRIPES :
+ nPPTTransitionType = PPT_TRANSITION_TYPE_BLINDS;
+ break;
+
+ case FadeEffect_VERTICAL_CHECKERBOARD :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_HORIZONTAL_CHECKERBOARD :
+ nPPTTransitionType = PPT_TRANSITION_TYPE_CHECKER;
+ break;
+
+ case FadeEffect_MOVE_FROM_UPPERLEFT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_MOVE_FROM_UPPERRIGHT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_MOVE_FROM_LOWERLEFT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_MOVE_FROM_LOWERRIGHT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_MOVE_FROM_TOP :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_MOVE_FROM_LEFT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_MOVE_FROM_BOTTOM :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_MOVE_FROM_RIGHT :
+ nPPTTransitionType = PPT_TRANSITION_TYPE_COVER;
+ break;
+
+ case FadeEffect_DISSOLVE :
+ nPPTTransitionType = PPT_TRANSITION_TYPE_DISSOLVE;
+ break;
+
+ case FadeEffect_VERTICAL_LINES :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_HORIZONTAL_LINES :
+ nPPTTransitionType = PPT_TRANSITION_TYPE_RANDOM_BARS;
+ break;
+
+ case FadeEffect_CLOSE_HORIZONTAL :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_OPEN_HORIZONTAL :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_CLOSE_VERTICAL :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_OPEN_VERTICAL :
+ nPPTTransitionType = PPT_TRANSITION_TYPE_SPLIT;
+ break;
+
+ case FadeEffect_FADE_FROM_UPPERLEFT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_FADE_FROM_UPPERRIGHT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_FADE_FROM_LOWERLEFT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_FADE_FROM_LOWERRIGHT :
+ nDirection += 4;
+ nPPTTransitionType = PPT_TRANSITION_TYPE_STRIPS;
+ break;
+
+ case FadeEffect_UNCOVER_TO_LOWERRIGHT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_UNCOVER_TO_LOWERLEFT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_UNCOVER_TO_UPPERRIGHT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_UNCOVER_TO_UPPERLEFT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_UNCOVER_TO_BOTTOM :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_UNCOVER_TO_RIGHT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_UNCOVER_TO_TOP :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_UNCOVER_TO_LEFT :
+ nPPTTransitionType = PPT_TRANSITION_TYPE_PULL;
+ break;
+
+ case FadeEffect_FADE_FROM_TOP :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_FADE_FROM_LEFT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_FADE_FROM_BOTTOM :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_FADE_FROM_RIGHT :
+ nPPTTransitionType = PPT_TRANSITION_TYPE_WIPE;
+ break;
+
+ case FadeEffect_ROLL_FROM_TOP :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_ROLL_FROM_LEFT :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_ROLL_FROM_BOTTOM :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_ROLL_FROM_RIGHT :
+ nPPTTransitionType = PPT_TRANSITION_TYPE_WIPE;
+ break;
+
+ case FadeEffect_FADE_TO_CENTER :
+ nDirection++;
+ [[fallthrough]];
+ case FadeEffect_FADE_FROM_CENTER :
+ nPPTTransitionType = PPT_TRANSITION_TYPE_ZOOM;
+ break;
+
+ case FadeEffect_NONE :
+ nDirection = 2;
+ break;
+ }
+
+ return nPPTTransitionType;
+}
+
+bool PPTWriterBase::ContainsOtherShapeThanPlaceholders()
+{
+ sal_uInt32 nShapes = mXShapes->getCount();
+ bool bOtherThanPlaceHolders = false;
+
+ if ( nShapes )
+ for ( sal_uInt32 nIndex = 0; ( nIndex < nShapes ) && !bOtherThanPlaceHolders; nIndex++ )
+ {
+ if ( GetShapeByIndex( nIndex, false ) && mType != "drawing.Page" )
+ {
+ if( mType == "presentation.Page" || mType == "presentation.Notes" )
+ {
+ Reference< XSimpleText > rXText( mXShape, UNO_QUERY );
+
+ if( rXText.is() && !rXText->getString().isEmpty() )
+ bOtherThanPlaceHolders = true;
+ }
+ else
+ bOtherThanPlaceHolders = true;
+ }
+ SAL_INFO("sd.eppt", "mType == " << mType);
+ }
+
+ return bOtherThanPlaceHolders;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptx-epptooxml.cxx b/sd/source/filter/eppt/pptx-epptooxml.cxx
new file mode 100644
index 000000000..6a338a6a6
--- /dev/null
+++ b/sd/source/filter/eppt/pptx-epptooxml.cxx
@@ -0,0 +1,2594 @@
+/* -*- 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 <stdio.h>
+#include <oox/drawingml/clrscheme.hxx>
+#include <oox/token/namespaces.hxx>
+#include <oox/token/tokens.hxx>
+#include <oox/token/relationship.hxx>
+#include <oox/ole/vbaproject.hxx>
+#include "epptooxml.hxx"
+#include <oox/export/shapes.hxx>
+
+#include <comphelper/sequenceashashmap.hxx>
+#include <comphelper/storagehelper.hxx>
+#include <comphelper/xmltools.hxx>
+#include <sax/fshelper.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <sal/log.hxx>
+#include <tools/UnitConversion.hxx>
+#include <tools/datetime.hxx>
+#include <com/sun/star/animations/TransitionType.hpp>
+#include <com/sun/star/animations/TransitionSubType.hpp>
+#include <com/sun/star/beans/XPropertySetInfo.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/drawing/XDrawPages.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/embed/ElementModes.hpp>
+#include <com/sun/star/geometry/RealPoint2D.hpp>
+#include <com/sun/star/office/XAnnotationEnumeration.hpp>
+#include <com/sun/star/office/XAnnotationAccess.hpp>
+#include <com/sun/star/presentation/AnimationSpeed.hpp>
+#include <com/sun/star/util/DateTime.hpp>
+#include <com/sun/star/task/XStatusIndicator.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/presentation/XCustomPresentationSupplier.hpp>
+#include <com/sun/star/container/XIndexContainer.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/presentation/XPresentationSupplier.hpp>
+#include <tools/diagnose_ex.h>
+
+#include <oox/export/utils.hxx>
+
+#include "pptx-animations.hxx"
+#include "../ppt/pptanimations.hxx"
+
+#include <i18nlangtag/languagetag.hxx>
+#include <svx/svdpage.hxx>
+#include <svx/unoapi.hxx>
+#include <svx/svdogrp.hxx>
+#include <sdmod.hxx>
+#include <sdpage.hxx>
+
+#include <vcl/svapp.hxx>
+#include <vcl/settings.hxx>
+
+#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+#include <com/sun/star/document/XStorageBasedDocument.hpp>
+#include <utility>
+#if OSL_DEBUG_LEVEL > 1
+#include <com/sun/star/drawing/RectanglePoint.hpp>
+#endif
+
+// presentation namespaces
+#define PNMSS FSNS(XML_xmlns, XML_a), OUStringToOString(this->getNamespaceURL(OOX_NS(dml)), RTL_TEXTENCODING_UTF8).getStr(), \
+ FSNS(XML_xmlns, XML_p), OUStringToOString(this->getNamespaceURL(OOX_NS(ppt)), RTL_TEXTENCODING_UTF8).getStr(), \
+ FSNS(XML_xmlns, XML_r), OUStringToOString(this->getNamespaceURL(OOX_NS(officeRel)), RTL_TEXTENCODING_UTF8).getStr(), \
+ FSNS(XML_xmlns, XML_p14), OUStringToOString(this->getNamespaceURL(OOX_NS(p14)), RTL_TEXTENCODING_UTF8).getStr(), \
+ FSNS(XML_xmlns, XML_p15), OUStringToOString(this->getNamespaceURL(OOX_NS(p15)), RTL_TEXTENCODING_UTF8).getStr(), \
+ FSNS(XML_xmlns, XML_mc), OUStringToOString(this->getNamespaceURL(OOX_NS(mce)), RTL_TEXTENCODING_UTF8).getStr()
+
+// presentationPr namespace
+#define PPRNMSS FSNS(XML_xmlns, XML_a), OUStringToOString(this->getNamespaceURL(OOX_NS(dml)), RTL_TEXTENCODING_UTF8).getStr(), \
+ FSNS(XML_xmlns, XML_r), OUStringToOString(this->getNamespaceURL(OOX_NS(officeRel)), RTL_TEXTENCODING_UTF8).getStr(), \
+ FSNS(XML_xmlns, XML_p), OUStringToOString(this->getNamespaceURL(OOX_NS(ppt)), RTL_TEXTENCODING_UTF8).getStr()
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::animations;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::geometry;
+using namespace ::com::sun::star::presentation;
+using namespace ::com::sun::star::office;
+using namespace ::com::sun::star::text;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::util;
+using namespace ::ppt;
+using ::com::sun::star::beans::XPropertySet;
+using ::com::sun::star::beans::XPropertySetInfo;
+using ::sax_fastparser::FSHelperPtr;
+using namespace oox::drawingml;
+using namespace oox::core;
+
+#if OSL_DEBUG_LEVEL > 1
+void dump_pset(Reference< XPropertySet > const& rXPropSet);
+#endif
+
+namespace oox::core
+{
+
+class PowerPointShapeExport : public ShapeExport
+{
+ PowerPointExport& mrExport;
+ PageType mePageType;
+ bool mbMaster;
+public:
+ PowerPointShapeExport(FSHelperPtr pFS, ShapeHashMap* pShapeMap, PowerPointExport* pFB);
+ void SetMaster(bool bMaster);
+ void SetPageType(PageType ePageType);
+ ShapeExport& WriteNonVisualProperties(const Reference< XShape >& xShape) override;
+ ShapeExport& WriteTextShape(const Reference< XShape >& xShape) override;
+ ShapeExport& WriteUnknownShape(const Reference< XShape >& xShape) override;
+ ShapeExport& WritePlaceholderShape(const Reference< XShape >& xShape, PlaceholderType ePlaceholder);
+ /** Writes a placeholder shape that references the placeholder on the master slide */
+ ShapeExport& WritePlaceholderReferenceShape(PlaceholderType ePlaceholder, sal_Int32 nReferencedPlaceholderIdx, PageType ePageType, const Reference<XPropertySet>& rXPagePropSet);
+ ShapeExport& WritePageShape(const Reference< XShape >& xShape, PageType ePageType, bool bPresObj);
+ /** Writes textbody of a placeholder that references the placeholder on the master slide */
+ ShapeExport& WritePlaceholderReferenceTextBody(PlaceholderType ePlaceholder, PageType ePageType, const Reference<XPropertySet> xPagePropSet);
+
+ // helper parts
+ bool WritePlaceholder(const Reference< XShape >& xShape, PlaceholderType ePlaceholder, bool bMaster);
+};
+
+
+namespace
+{
+void WriteSndAc(const FSHelperPtr& pFS, const OUString& sSoundRelId, const OUString& sSoundName)
+{
+ pFS->startElementNS(XML_p, XML_sndAc);
+ pFS->startElementNS(XML_p, XML_stSnd);
+ pFS->singleElementNS(XML_p, XML_snd, FSNS(XML_r, XML_embed),
+ sax_fastparser::UseIf(sSoundRelId, !sSoundRelId.isEmpty()), XML_name,
+ sax_fastparser::UseIf(sSoundName, !sSoundName.isEmpty()));
+ pFS->endElement(FSNS(XML_p, XML_stSnd));
+ pFS->endElement(FSNS(XML_p, XML_sndAc));
+}
+
+const char* getPlaceholderTypeName(PlaceholderType ePlaceholder)
+{
+ switch (ePlaceholder)
+ {
+ case SlideImage:
+ return "sldImg";
+ case Notes:
+ return "body";
+ case Header:
+ return "hdr";
+ case Footer:
+ return "ftr";
+ case SlideNumber:
+ return "sldNum";
+ case DateAndTime:
+ return "dt";
+ case Outliner:
+ return "body";
+ case Title:
+ return "title";
+ case Subtitle:
+ return "subTitle";
+ default:
+ SAL_INFO("sd.eppt", "warning: unhandled placeholder type: " << ePlaceholder);
+ return "";
+ }
+}
+}
+}
+
+namespace {
+
+enum PPTXLayout
+{
+ LAYOUT_BLANK,
+ LAYOUT_TITLE_SLIDE,
+ LAYOUT_TITLE_CONTENT,
+ LAYOUT_TITLE_2CONTENT,
+ LAYOUT_TITLE,
+ LAYOUT_CENTERED_TEXT,
+ LAYOUT_TITLE_2CONTENT_CONTENT,
+ LAYOUT_TITLE_CONTENT_2CONTENT,
+ LAYOUT_TITLE_2CONTENT_OVER_CONTENT,
+ LAYOUT_TITLE_CONTENT_OVER_CONTENT,
+ LAYOUT_TITLE_4CONTENT,
+ LAYOUT_TITLE_6CONTENT,
+ LAYOUT_SIZE
+};
+
+struct PPTXLayoutInfo
+{
+ int nType;
+ const char* sName;
+ const char* sType;
+};
+
+}
+
+const PPTXLayoutInfo aLayoutInfo[LAYOUT_SIZE] =
+{
+ { 20, "Blank Slide", "blank" },
+ { 0, "Title Slide", "tx" },
+ { 1, "Title, Content", "obj" },
+ { 3, "Title, 2 Content", "twoObj" },
+ { 19, "Title Only", "titleOnly" },
+ { 32, "Centered Text", "objOnly" }, // not exactly, but close
+ { 15, "Title, 2 Content and Content", "twoObjAndObj" },
+ { 12, "Title Content and 2 Content", "objAndTwoObj" },
+ { 16, "Title, 2 Content over Content", "twoObjOverTx" }, // not exactly, but close
+ { 14, "Title, Content over Content", "objOverTx" }, // not exactly, but close
+ { 18, "Title, 4 Content", "fourObj" },
+ { 34, "Title, 6 Content", "blank" } // not defined => blank
+};
+
+int PowerPointExport::GetPPTXLayoutId(int nOffset)
+{
+ int nId = LAYOUT_BLANK;
+
+ SAL_INFO("sd.eppt", "GetPPTXLayoutId " << nOffset);
+
+ switch (nOffset)
+ {
+ case 0:
+ nId = LAYOUT_TITLE_SLIDE;
+ break;
+ case 1:
+ nId = LAYOUT_TITLE_CONTENT;
+ break;
+ case 3:
+ nId = LAYOUT_TITLE_2CONTENT;
+ break;
+ case 19:
+ nId = LAYOUT_TITLE;
+ break;
+ case 15:
+ nId = LAYOUT_TITLE_2CONTENT_CONTENT;
+ break;
+ case 12:
+ nId = LAYOUT_TITLE_CONTENT_2CONTENT;
+ break;
+ case 16:
+ nId = LAYOUT_TITLE_2CONTENT_OVER_CONTENT;
+ break;
+ case 14:
+ nId = LAYOUT_TITLE_CONTENT_OVER_CONTENT;
+ break;
+ case 18:
+ nId = LAYOUT_TITLE_4CONTENT;
+ break;
+ case 32:
+ nId = LAYOUT_CENTERED_TEXT;
+ break;
+ case 34:
+ nId = LAYOUT_TITLE_6CONTENT;
+ break;
+ case 20:
+ default:
+ nId = LAYOUT_BLANK;
+ break;
+ }
+
+ return nId;
+}
+
+PowerPointShapeExport::PowerPointShapeExport(FSHelperPtr pFS, ShapeHashMap* pShapeMap,
+ PowerPointExport* pFB)
+ : ShapeExport(XML_p, std::move(pFS), pShapeMap, pFB)
+ , mrExport(*pFB)
+ , mePageType(UNDEFINED)
+ , mbMaster(false)
+{
+}
+
+void PowerPointShapeExport::SetMaster(bool bMaster)
+{
+ mbMaster = bMaster;
+}
+
+void PowerPointShapeExport::SetPageType(PageType ePageType)
+{
+ mePageType = ePageType;
+}
+
+ShapeExport& PowerPointShapeExport::WriteNonVisualProperties(const Reference< XShape >&)
+{
+ GetFS()->singleElementNS(XML_p, XML_nvPr);
+
+ return *this;
+}
+
+ShapeExport& PowerPointShapeExport::WriteTextShape(const Reference< XShape >& xShape)
+{
+ OUString sShapeType = xShape->getShapeType();
+
+ SAL_INFO("sd.eppt", "shape(text) : " << sShapeType.toUtf8());
+
+ if (sShapeType == "com.sun.star.drawing.TextShape" || sShapeType == "com.sun.star.drawing.GraphicObjectShape")
+ {
+ ShapeExport::WriteTextShape(xShape);
+ }
+ else if (sShapeType == "com.sun.star.presentation.DateTimeShape")
+ {
+ if (!WritePlaceholder(xShape, DateAndTime, mbMaster))
+ ShapeExport::WriteTextShape(xShape);
+ }
+ else if (sShapeType == "com.sun.star.presentation.FooterShape")
+ {
+ if (!WritePlaceholder(xShape, Footer, mbMaster))
+ ShapeExport::WriteTextShape(xShape);
+ }
+ else if (sShapeType == "com.sun.star.presentation.HeaderShape")
+ {
+ if (!WritePlaceholder(xShape, Header, mbMaster))
+ ShapeExport::WriteTextShape(xShape);
+ }
+ else if (sShapeType == "com.sun.star.presentation.NotesShape")
+ {
+ if (mePageType == NOTICE && mrExport.GetPresObj())
+ WritePlaceholderShape(xShape, Notes);
+ else
+ ShapeExport::WriteTextShape(xShape);
+ }
+ else if (sShapeType == "com.sun.star.presentation.OutlinerShape")
+ {
+ if (!WritePlaceholder(xShape, Outliner, mbMaster))
+ ShapeExport::WriteTextShape(xShape);
+ }
+ else if (sShapeType == "com.sun.star.presentation.SlideNumberShape")
+ {
+ if (!WritePlaceholder(xShape, SlideNumber, mbMaster))
+ ShapeExport::WriteTextShape(xShape);
+ }
+ else if (sShapeType == "com.sun.star.presentation.TitleTextShape")
+ {
+ if (!WritePlaceholder(xShape, Title, mbMaster))
+ ShapeExport::WriteTextShape(xShape);
+ }
+ else
+ SAL_WARN("sd.eppt", "PowerPointShapeExport::WriteTextShape: shape of type '" << sShapeType << "' is ignored");
+
+ return *this;
+}
+
+ShapeExport& PowerPointShapeExport::WriteUnknownShape(const Reference< XShape >& xShape)
+{
+ OUString sShapeType = xShape->getShapeType();
+
+ SAL_INFO("sd.eppt", "shape(unknown): " << sShapeType.toUtf8());
+
+ if (sShapeType == "com.sun.star.presentation.PageShape")
+ {
+ WritePageShape(xShape, mePageType, mrExport.GetPresObj());
+ }
+ else if (sShapeType == "com.sun.star.presentation.SubtitleShape")
+ {
+ if(mePageType != MASTER)
+ {
+ if (!WritePlaceholder(xShape, Subtitle, mbMaster))
+ ShapeExport::WriteTextShape(xShape);
+ }
+ }
+ else
+ SAL_WARN("sd.eppt", "unknown shape not handled: " << sShapeType.toUtf8());
+
+ return *this;
+}
+
+PowerPointExport::PowerPointExport(const Reference< XComponentContext >& rContext, const uno::Sequence<uno::Any>& rArguments)
+ : XmlFilterBase(rContext)
+ , mnLayoutFileIdMax(1)
+ , mnSlideIdMax(1 << 8)
+ , mnSlideMasterIdMax(1U << 31)
+ , mnAnimationNodeIdMax(1)
+ , mnDiagramId(1)
+ , mbCreateNotes(false)
+ , mnPlaceholderIndexMax(1)
+{
+ comphelper::SequenceAsHashMap aArgumentsMap(rArguments);
+ mbPptm = aArgumentsMap.getUnpackedValueOrDefault("IsPPTM", false);
+ mbExportTemplate = aArgumentsMap.getUnpackedValueOrDefault("IsTemplate", false);
+}
+
+PowerPointExport::~PowerPointExport()
+{
+}
+
+void PowerPointExport::writeDocumentProperties()
+{
+ uno::Reference<document::XDocumentPropertiesSupplier> xDPS(mXModel, uno::UNO_QUERY);
+ uno::Reference<document::XDocumentProperties> xDocProps = xDPS->getDocumentProperties();
+
+ if (xDocProps.is())
+ {
+ bool bSecurityOptOpenReadOnly = false;
+ uno::Reference< lang::XMultiServiceFactory > xFactory(mXModel, uno::UNO_QUERY);
+ uno::Reference< beans::XPropertySet > xSettings(xFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY);
+ try
+ {
+ xSettings->getPropertyValue("LoadReadonly") >>= bSecurityOptOpenReadOnly;
+ }
+ catch( Exception& )
+ {
+ }
+ exportDocumentProperties(xDocProps, bSecurityOptOpenReadOnly);
+ }
+
+ exportCustomFragments();
+}
+
+bool PowerPointExport::importDocument() noexcept
+{
+ return false;
+}
+
+bool PowerPointExport::exportDocument()
+{
+ DrawingML::PushExportGraphics();
+ maShapeMap.clear();
+
+ mXModel = getModel();
+
+ //write document properties
+ writeDocumentProperties();
+
+ addRelation(oox::getRelationship(Relationship::OFFICEDOCUMENT), u"ppt/presentation.xml");
+
+ OUString aMediaType;
+ if (mbPptm)
+ {
+ if (mbExportTemplate)
+ {
+ aMediaType = "application/vnd.ms-powerpoint.template.macroEnabled.main+xml";
+ }
+ else
+ {
+ aMediaType = "application/vnd.ms-powerpoint.presentation.macroEnabled.main+xml";
+ }
+ }
+ else
+ {
+ if (mbExportTemplate)
+ {
+ aMediaType = "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml";
+ }
+ else
+ {
+ aMediaType = "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml";
+ }
+ }
+
+ mPresentationFS = openFragmentStreamWithSerializer("ppt/presentation.xml", aMediaType);
+
+ addRelation(mPresentationFS->getOutputStream(),
+ oox::getRelationship(Relationship::THEME),
+ u"theme/theme1.xml");
+
+ mPresentationFS->startElementNS(XML_p, XML_presentation, PNMSS);
+
+ mXStatusIndicator = getStatusIndicator();
+
+ std::vector< PropertyValue > aProperties;
+ PropertyValue aProperty;
+ aProperty.Name = "BaseURI";
+ aProperty.Value <<= getFileUrl();
+ aProperties.push_back(aProperty);
+
+ exportPPT(aProperties);
+
+ mPresentationFS->singleElementNS(XML_p, XML_sldSz,
+ XML_cx, OString::number(PPTtoEMU(maDestPageSize.Width)),
+ XML_cy, OString::number(PPTtoEMU(maDestPageSize.Height)));
+ // for some reason if added before slides list it will not load the slides (alas with error reports) in mso
+ mPresentationFS->singleElementNS(XML_p, XML_notesSz,
+ XML_cx, OString::number(PPTtoEMU(maNotesPageSize.Width)),
+ XML_cy, OString::number(PPTtoEMU(maNotesPageSize.Height)));
+
+ WriteCustomSlideShow();
+
+ WritePresentationProps();
+
+ WriteAuthors();
+
+ WriteVBA();
+
+ WriteModifyVerifier();
+
+ mPresentationFS->endElementNS(XML_p, XML_presentation);
+ mPresentationFS.reset();
+ // Free all FSHelperPtr, to flush data before committing storage
+ mpSlidesFSArray.clear();
+
+ commitStorage();
+
+ DrawingML::PopExportGraphics();
+ maShapeMap.clear();
+ maAuthors.clear();
+ maRelId.clear();
+
+ return true;
+}
+
+::oox::ole::VbaProject* PowerPointExport::implCreateVbaProject() const
+{
+ return new ::oox::ole::VbaProject(getComponentContext(), getModel(), u"Impress");
+}
+
+void PowerPointExport::WriteCustomSlideShow()
+{
+ Reference<XCustomPresentationSupplier> aXCPSup(mXModel, css::uno::UNO_QUERY);
+ if (!aXCPSup.is() || !aXCPSup->getCustomPresentations()->hasElements())
+ return;
+
+ mPresentationFS->startElementNS(XML_p, XML_custShowLst);
+
+ Reference<XDrawPagesSupplier> xDPS(getModel(), uno::UNO_QUERY_THROW);
+ Reference<XDrawPages> xDrawPages(xDPS->getDrawPages(), uno::UNO_SET_THROW);
+ Reference<XNameContainer> aXNameCont(aXCPSup->getCustomPresentations());
+ const Sequence<OUString> aNameSeq(aXNameCont->getElementNames());
+
+ OUString sRelId;
+ sal_uInt32 nCustomShowIndex = 0;
+ sal_Int32 nSlideCount = xDrawPages->getCount();
+
+ for (OUString const& customShowName : aNameSeq)
+ {
+ mPresentationFS->startElementNS(XML_p, XML_custShow, XML_name, customShowName, XML_id,
+ OUString::number(nCustomShowIndex++));
+
+ mAny = aXNameCont->getByName(customShowName);
+ Reference<XIndexContainer> aXIContainer;
+ if (mAny >>= aXIContainer)
+ {
+ mPresentationFS->startElementNS(XML_p, XML_sldLst);
+
+ sal_Int32 nCustomShowSlideCount = aXIContainer->getCount();
+ for (sal_Int32 i = 0; i < nCustomShowSlideCount; ++i)
+ {
+ Reference<XDrawPage> aXCustomShowDrawPage;
+ aXIContainer->getByIndex(i) >>= aXCustomShowDrawPage;
+ Reference<XNamed> aXName(aXCustomShowDrawPage, UNO_QUERY_THROW);
+ OUString sCustomShowSlideName = aXName->getName();
+
+ for (sal_Int32 j = 0; j < nSlideCount; ++j)
+ {
+ Reference<XDrawPage> xDrawPage;
+ xDrawPages->getByIndex(j) >>= xDrawPage;
+ Reference<XNamed> xNamed(xDrawPage, UNO_QUERY_THROW);
+ OUString sSlideName = xNamed->getName();
+
+ if (sCustomShowSlideName == sSlideName)
+ {
+ sRelId = maRelId[j];
+ break;
+ }
+ }
+ mPresentationFS->singleElementNS(XML_p, XML_sld, FSNS(XML_r, XML_id), sRelId);
+ }
+ mPresentationFS->endElementNS(XML_p, XML_sldLst);
+ }
+ mPresentationFS->endElementNS(XML_p, XML_custShow);
+ }
+ mPresentationFS->endElementNS(XML_p, XML_custShowLst);
+}
+
+void PowerPointExport::ImplWriteBackground(const FSHelperPtr& pFS, const Reference< XPropertySet >& rXPropSet)
+{
+ FillStyle aFillStyle(FillStyle_NONE);
+ if (ImplGetPropertyValue(rXPropSet, "FillStyle"))
+ mAny >>= aFillStyle;
+
+ if (aFillStyle == FillStyle_NONE ||
+ aFillStyle == FillStyle_HATCH)
+ return;
+
+ pFS->startElementNS(XML_p, XML_bg);
+ pFS->startElementNS(XML_p, XML_bgPr);
+
+ PowerPointShapeExport aDML(pFS, &maShapeMap, this);
+ aDML.SetBackgroundDark(mbIsBackgroundDark);
+ aDML.WriteFill(rXPropSet);
+
+ pFS->endElementNS(XML_p, XML_bgPr);
+ pFS->endElementNS(XML_p, XML_bg);
+}
+
+#define MAIN_GROUP \
+ "<p:nvGrpSpPr>\
+ <p:cNvPr id=\"1\" name=\"\"/>\
+ <p:cNvGrpSpPr/>\
+ <p:nvPr/>\
+ </p:nvGrpSpPr>\
+ <p:grpSpPr>\
+ <a:xfrm>\
+ <a:off x=\"0\" y=\"0\"/>\
+ <a:ext cx=\"0\" cy=\"0\"/>\
+ <a:chOff x=\"0\" y=\"0\"/>\
+ <a:chExt cx=\"0\" cy=\"0\"/>\
+ </a:xfrm>\
+ </p:grpSpPr>"
+
+const char* PowerPointExport::GetSideDirection(sal_uInt8 nDirection)
+{
+ const char* pDirection = nullptr;
+
+ switch (nDirection)
+ {
+ case 0:
+ pDirection = "l";
+ break;
+ case 1:
+ pDirection = "u";
+ break;
+ case 2:
+ pDirection = "r";
+ break;
+ case 3:
+ pDirection = "d";
+ break;
+ }
+
+ return pDirection;
+}
+
+const char* PowerPointExport::GetCornerDirection(sal_uInt8 nDirection)
+{
+ const char* pDirection = nullptr;
+
+ switch (nDirection)
+ {
+ case 4:
+ pDirection = "lu";
+ break;
+ case 5:
+ pDirection = "ru";
+ break;
+ case 6:
+ pDirection = "ld";
+ break;
+ case 7:
+ pDirection = "rd";
+ break;
+ }
+
+ return pDirection;
+}
+
+const char* PowerPointExport::Get8Direction(sal_uInt8 nDirection)
+{
+ const char* pDirection = GetSideDirection(nDirection);
+
+ if (!pDirection)
+ pDirection = GetCornerDirection(nDirection);
+
+ return pDirection;
+}
+
+void PowerPointExport::WriteTransition(const FSHelperPtr& pFS)
+{
+ FadeEffect eFadeEffect = FadeEffect_NONE;
+ if (ImplGetPropertyValue(mXPagePropSet, "Effect"))
+ mAny >>= eFadeEffect;
+
+ sal_Int16 nTransitionType = 0, nTransitionSubtype = 0;
+ sal_Int8 nPPTTransitionType = 0;
+ sal_uInt8 nDirection = 0;
+
+ OUString sSoundUrl;
+ OUString sSoundRelId;
+ OUString sSoundName;
+
+ if (ImplGetPropertyValue(mXPagePropSet, "TransitionType") && (mAny >>= nTransitionType) &&
+ ImplGetPropertyValue(mXPagePropSet, "TransitionSubtype") && (mAny >>= nTransitionSubtype))
+ {
+ // FADEOVERCOLOR with black -> fade, with white -> flash
+ sal_Int32 nTransitionFadeColor = 0;
+ if( ImplGetPropertyValue(mXPagePropSet, "TransitionFadeColor"))
+ mAny >>= nTransitionFadeColor;
+ nPPTTransitionType = GetTransition(nTransitionType, nTransitionSubtype, eFadeEffect, nTransitionFadeColor, nDirection);
+ }
+
+ if (!nPPTTransitionType && eFadeEffect != FadeEffect_NONE)
+ nPPTTransitionType = GetTransition(eFadeEffect, nDirection);
+
+ if (ImplGetPropertyValue(mXPagePropSet, "Sound") && (mAny >>= sSoundUrl))
+ embedEffectAudio(pFS, sSoundUrl, sSoundRelId, sSoundName);
+
+ bool bOOXmlSpecificTransition = false;
+
+ sal_Int32 nTransition = 0;
+ const char* pDirection = nullptr;
+ const char* pOrientation = nullptr;
+ const char* pThruBlk = nullptr;
+ const char* pSpokes = nullptr;
+
+ char pSpokesTmp[2] = "0";
+
+ // p14
+ sal_Int32 nTransition14 = 0;
+ const char* pDirection14 = nullptr;
+ const char* pInverted = nullptr;
+ const char* pPattern = nullptr; // diamond or hexagon
+
+ //p15
+ const char* pPresetTransition = nullptr;
+
+ if (!nPPTTransitionType)
+ {
+ switch (nTransitionType)
+ {
+ case animations::TransitionType::BARWIPE:
+ {
+ if (nTransitionSubtype == animations::TransitionSubType::FADEOVERCOLOR)
+ {
+ nTransition = XML_cut;
+ pThruBlk = "true";
+ bOOXmlSpecificTransition = true;
+ }
+ break;
+ }
+ case animations::TransitionType::MISCSHAPEWIPE:
+ {
+ switch (nTransitionSubtype)
+ {
+ case animations::TransitionSubType::TOPTOBOTTOM: // Turn around
+ nTransition = XML_fade;
+ nTransition14 = XML_flip;
+ pDirection14 = "l";
+ bOOXmlSpecificTransition = true;
+ break;
+ case animations::TransitionSubType::BOTTOMRIGHT: // Rochade
+ nTransition = XML_fade;
+ nTransition14 = XML_switch;
+ pDirection14 = "r";
+ bOOXmlSpecificTransition = true;
+ break;
+ case animations::TransitionSubType::VERTICAL: // Vortex
+ nTransition = XML_fade;
+ nTransition14 = XML_vortex;
+ bOOXmlSpecificTransition = true;
+ break;
+ case animations::TransitionSubType::HORIZONTAL: // Ripple
+ nTransition = XML_fade;
+ nTransition14 = XML_ripple;
+ bOOXmlSpecificTransition = true;
+ break;
+ case animations::TransitionSubType::LEFTTORIGHT: // Fall
+ nTransition = XML_fade;
+ pPresetTransition = "fallOver";
+ bOOXmlSpecificTransition = true;
+ break;
+ case animations::TransitionSubType::CORNERSIN: // Inside turning cube
+ pInverted = "true";
+ [[fallthrough]];
+ case animations::TransitionSubType::CORNERSOUT: // Outside turning cube
+ nTransition = XML_fade;
+ nTransition14 = XML_prism;
+ bOOXmlSpecificTransition = true;
+ break;
+ case animations::TransitionSubType::DIAMOND: // Glitter
+ nTransition = XML_fade;
+ nTransition14 = XML_glitter;
+ pDirection14 = "l";
+ pPattern = "hexagon";
+ bOOXmlSpecificTransition = true;
+ break;
+ case animations::TransitionSubType::HEART: // Honeycomb
+ nTransition = XML_fade;
+ nTransition14 = XML_honeycomb;
+ bOOXmlSpecificTransition = true;
+ break;
+ }
+ break;
+ }
+ }
+ }
+
+ AnimationSpeed animationSpeed = AnimationSpeed_MEDIUM;
+ const char* speed = nullptr;
+ sal_Int32 advanceTiming = -1;
+ sal_Int32 changeType = 0;
+
+ sal_Int32 nTransitionDuration = -1;
+ bool isTransitionDurationSet = false;
+
+ // try to use TransitionDuration instead of old Speed property
+ if (ImplGetPropertyValue(mXPagePropSet, "TransitionDuration"))
+ {
+ double fTransitionDuration = -1.0;
+ mAny >>= fTransitionDuration;
+ if (fTransitionDuration >= 0)
+ {
+ nTransitionDuration = fTransitionDuration * 1000.0;
+
+ // override values because in MS formats meaning of fast/medium/slow is different
+ if (nTransitionDuration <= 500)
+ {
+ // fast is default
+ speed = nullptr;
+ }
+ else if (nTransitionDuration >= 1000)
+ {
+ speed = "slow";
+ }
+ else
+ {
+ speed = "med";
+ }
+
+ bool isStandardValue = nTransitionDuration == 500
+ || nTransitionDuration == 750
+ || nTransitionDuration == 1000;
+
+ if(!isStandardValue)
+ isTransitionDurationSet = true;
+ }
+ }
+ else if (ImplGetPropertyValue(mXPagePropSet, "Speed"))
+ {
+ mAny >>= animationSpeed;
+
+ switch (animationSpeed)
+ {
+ default:
+ case AnimationSpeed_MEDIUM:
+ speed = "med";
+ break;
+ case AnimationSpeed_SLOW:
+ speed = "slow";
+ break;
+ case AnimationSpeed_FAST:
+ break;
+ }
+ }
+
+ // check if we resolved what transition to export or time is set
+ if (!nPPTTransitionType && !bOOXmlSpecificTransition && !isTransitionDurationSet)
+ return;
+
+ if (ImplGetPropertyValue(mXPagePropSet, "Change"))
+ mAny >>= changeType;
+
+ // 1 means automatic, 2 half automatic - not sure what it means - at least I don't see it in UI
+ if (changeType == 1 && ImplGetPropertyValue(mXPagePropSet, "Duration"))
+ mAny >>= advanceTiming;
+
+ if (!bOOXmlSpecificTransition)
+ {
+ switch (nPPTTransitionType)
+ {
+ case PPT_TRANSITION_TYPE_BLINDS:
+ nTransition = XML_blinds;
+ pDirection = (nDirection == 0) ? "vert" : "horz";
+ break;
+ case PPT_TRANSITION_TYPE_CHECKER:
+ nTransition = XML_checker;
+ pDirection = (nDirection == 1) ? "vert" : "horz";
+ break;
+ case PPT_TRANSITION_TYPE_CIRCLE:
+ nTransition = XML_circle;
+ break;
+ case PPT_TRANSITION_TYPE_COMB:
+ nTransition = XML_comb;
+ pDirection = (nDirection == 1) ? "vert" : "horz";
+ break;
+ case PPT_TRANSITION_TYPE_COVER:
+ nTransition = XML_cover;
+ pDirection = Get8Direction(nDirection);
+ break;
+ case PPT_TRANSITION_TYPE_DIAMOND:
+ nTransition = XML_diamond;
+ break;
+ case PPT_TRANSITION_TYPE_DISSOLVE:
+ nTransition = XML_dissolve;
+ break;
+ case PPT_TRANSITION_TYPE_FADE:
+ nTransition = XML_fade;
+ pThruBlk = "true";
+ break;
+ case PPT_TRANSITION_TYPE_SMOOTHFADE:
+ nTransition = XML_fade;
+ break;
+ case PPT_TRANSITION_TYPE_NEWSFLASH:
+ nTransition = XML_newsflash;
+ break;
+ case PPT_TRANSITION_TYPE_PLUS:
+ nTransition = XML_plus;
+ break;
+ case PPT_TRANSITION_TYPE_PULL:
+ nTransition = XML_pull;
+ pDirection = Get8Direction(nDirection);
+ break;
+ case PPT_TRANSITION_TYPE_PUSH:
+ nTransition = XML_push;
+ pDirection = GetSideDirection(nDirection);
+ break;
+ case PPT_TRANSITION_TYPE_RANDOM:
+ nTransition = XML_random;
+ break;
+ case PPT_TRANSITION_TYPE_RANDOM_BARS:
+ nTransition = XML_randomBar;
+ pDirection = (nDirection == 1) ? "vert" : "horz";
+ break;
+ case PPT_TRANSITION_TYPE_SPLIT:
+ nTransition = XML_split;
+ pDirection = (nDirection & 1) ? "in" : "out";
+ pOrientation = (nDirection < 2) ? "horz" : "vert";
+ break;
+ case PPT_TRANSITION_TYPE_STRIPS:
+ nTransition = XML_strips;
+ pDirection = GetCornerDirection(nDirection);
+ break;
+ case PPT_TRANSITION_TYPE_WEDGE:
+ nTransition = XML_wedge;
+ break;
+ case PPT_TRANSITION_TYPE_WHEEL:
+ nTransition = XML_wheel;
+ if (nDirection != 4 && nDirection <= 9)
+ {
+ pSpokesTmp[0] = '0' + nDirection;
+ pSpokes = pSpokesTmp;
+ }
+ break;
+ case PPT_TRANSITION_TYPE_WIPE:
+ nTransition = XML_wipe;
+ pDirection = GetSideDirection(nDirection);
+ break;
+ case PPT_TRANSITION_TYPE_ZOOM:
+ nTransition = XML_zoom;
+ pDirection = (nDirection == 1) ? "in" : "out";
+ break;
+ case PPT_TRANSITION_TYPE_FLASH:
+ nTransition14 = XML_flash;
+ nTransition = XML_fade;
+ bOOXmlSpecificTransition = true;
+ break;
+ // coverity[dead_error_line] - following conditions exist to avoid compiler warning
+ case PPT_TRANSITION_TYPE_NONE:
+ default:
+ nTransition = 0;
+ break;
+ }
+ }
+
+ bool isAdvanceTimingSet = advanceTiming != -1;
+ if (nTransition14 || pPresetTransition || isTransitionDurationSet)
+ {
+ const char* pRequiresNS = (nTransition14 || isTransitionDurationSet) ? "p14" : "p15";
+
+ pFS->startElement(FSNS(XML_mc, XML_AlternateContent));
+ pFS->startElement(FSNS(XML_mc, XML_Choice), XML_Requires, pRequiresNS);
+
+ if(isTransitionDurationSet && isAdvanceTimingSet)
+ {
+ pFS->startElementNS(XML_p, XML_transition,
+ XML_spd, speed,
+ XML_advTm, OString::number(advanceTiming * 1000),
+ FSNS(XML_p14, XML_dur), OString::number(nTransitionDuration));
+ }
+ else if(isTransitionDurationSet)
+ {
+ pFS->startElementNS(XML_p, XML_transition,
+ XML_spd, speed,
+ FSNS(XML_p14, XML_dur), OString::number(nTransitionDuration));
+ }
+ else if(isAdvanceTimingSet)
+ {
+ pFS->startElementNS(XML_p, XML_transition,
+ XML_spd, speed,
+ XML_advTm, OString::number(advanceTiming * 1000));
+ }
+ else
+ {
+ pFS->startElementNS(XML_p, XML_transition, XML_spd, speed);
+ }
+
+ if (nTransition14)
+ {
+ pFS->singleElementNS(XML_p14, nTransition14,
+ XML_isInverted, pInverted,
+ XML_dir, pDirection14,
+ XML_pattern, pPattern);
+ }
+ else if (pPresetTransition)
+ {
+ pFS->singleElementNS(XML_p15, XML_prstTrans,
+ XML_prst, pPresetTransition);
+ }
+ else if (isTransitionDurationSet && nTransition)
+ {
+ pFS->singleElementNS(XML_p, nTransition,
+ XML_dir, pDirection,
+ XML_orient, pOrientation,
+ XML_spokes, pSpokes,
+ XML_thruBlk, pThruBlk);
+ }
+
+ if (!sSoundRelId.isEmpty())
+ WriteSndAc(pFS, sSoundRelId, sSoundName);
+
+ pFS->endElement(FSNS(XML_p, XML_transition));
+
+ pFS->endElement(FSNS(XML_mc, XML_Choice));
+ pFS->startElement(FSNS(XML_mc, XML_Fallback));
+ }
+
+ pFS->startElementNS(XML_p, XML_transition,
+ XML_spd, speed,
+ XML_advTm, sax_fastparser::UseIf(OString::number(advanceTiming * 1000), isAdvanceTimingSet));
+
+ if (nTransition)
+ {
+ pFS->singleElementNS(XML_p, nTransition,
+ XML_dir, pDirection,
+ XML_orient, pOrientation,
+ XML_spokes, pSpokes,
+ XML_thruBlk, pThruBlk);
+ }
+
+ if (!sSoundRelId.isEmpty())
+ WriteSndAc(pFS, sSoundRelId, sSoundName);
+
+ pFS->endElementNS(XML_p, XML_transition);
+
+ if (nTransition14 || pPresetTransition || isTransitionDurationSet)
+ {
+ pFS->endElement(FSNS(XML_mc, XML_Fallback));
+ pFS->endElement(FSNS(XML_mc, XML_AlternateContent));
+ }
+}
+
+static OUString lcl_GetInitials(const OUString& sName)
+{
+ OUStringBuffer sRet;
+
+ if (!sName.isEmpty())
+ {
+ sRet.append(sName[0]);
+ sal_Int32 nStart = 0, nOffset;
+
+ while ((nOffset = sName.indexOf(' ', nStart)) != -1)
+ {
+ if (nOffset + 1 < sName.getLength())
+ sRet.append(sName[ nOffset + 1 ]);
+ nStart = nOffset + 1;
+ }
+ }
+
+ return sRet.makeStringAndClear();
+}
+
+void PowerPointExport::WriteAuthors()
+{
+ if (maAuthors.empty())
+ return;
+
+ FSHelperPtr pFS = openFragmentStreamWithSerializer("ppt/commentAuthors.xml",
+ "application/vnd.openxmlformats-officedocument.presentationml.commentAuthors+xml");
+ addRelation(mPresentationFS->getOutputStream(),
+ oox::getRelationship(Relationship::COMMENTAUTHORS),
+ u"commentAuthors.xml");
+
+ pFS->startElementNS(XML_p, XML_cmAuthorLst,
+ FSNS(XML_xmlns, XML_p), getNamespaceURL(OOX_NS(ppt)));
+
+ for (const AuthorsMap::value_type& i : maAuthors)
+ {
+ pFS->singleElementNS(XML_p, XML_cmAuthor,
+ XML_id, OString::number(i.second.nId),
+ XML_name, i.first,
+ XML_initials, lcl_GetInitials(i.first),
+ XML_lastIdx, OString::number(i.second.nLastIndex),
+ XML_clrIdx, OString::number(i.second.nId));
+ }
+
+ pFS->endElementNS(XML_p, XML_cmAuthorLst);
+}
+
+sal_Int32 PowerPointExport::GetAuthorIdAndLastIndex(const OUString& sAuthor, sal_Int32& nLastIndex)
+{
+ if (maAuthors.count(sAuthor) <= 0)
+ {
+ struct AuthorComments aAuthorComments;
+
+ aAuthorComments.nId = maAuthors.size();
+ aAuthorComments.nLastIndex = 0;
+
+ maAuthors[ sAuthor ] = aAuthorComments;
+ }
+
+ nLastIndex = ++maAuthors[ sAuthor ].nLastIndex;
+
+ return maAuthors[ sAuthor ].nId;
+}
+
+void PowerPointExport::WritePresentationProps()
+{
+ Reference<XPresentationSupplier> xPresentationSupplier(mXModel, uno::UNO_QUERY);
+ if (!xPresentationSupplier.is())
+ return;
+
+ Reference<beans::XPropertySet> xPresentationProps(xPresentationSupplier->getPresentation(),
+ uno::UNO_QUERY);
+ bool bEndlessVal = xPresentationProps->getPropertyValue("IsEndless").get<bool>();
+ bool bChangeManually = xPresentationProps->getPropertyValue("IsAutomatic").get<bool>();
+ OUString sFirstPage = xPresentationProps->getPropertyValue("FirstPage").get<OUString>();
+ OUString sCustomShow = xPresentationProps->getPropertyValue("CustomShow").get<OUString>();
+
+ FSHelperPtr pFS = openFragmentStreamWithSerializer(
+ "ppt/presProps.xml",
+ "application/vnd.openxmlformats-officedocument.presentationml.presProps+xml");
+
+ addRelation(mPresentationFS->getOutputStream(),
+ oox::getRelationship(Relationship::PRESPROPS), u"presProps.xml");
+
+ pFS->startElementNS(XML_p, XML_presentationPr, PPRNMSS);
+
+ pFS->startElementNS(XML_p, XML_showPr, XML_loop, sax_fastparser::UseIf("1", bEndlessVal),
+ XML_useTimings, sax_fastparser::UseIf("0", bChangeManually),
+ XML_showNarration, "1");
+
+ Reference<drawing::XDrawPagesSupplier> xDPS(mXModel, uno::UNO_QUERY_THROW);
+ Reference<drawing::XDrawPages> xDrawPages(xDPS->getDrawPages(), uno::UNO_SET_THROW);
+ if (!sFirstPage.isEmpty())
+ {
+ sal_Int32 nStartSlide = 1;
+ sal_Int32 nEndSlide = xDrawPages->getCount();
+ for (sal_Int32 i = 0; i < nEndSlide; i++)
+ {
+ Reference<drawing::XDrawPage> xDrawPage;
+ xDrawPages->getByIndex(i) >>= xDrawPage;
+ Reference<container::XNamed> xNamed(xDrawPage, uno::UNO_QUERY_THROW);
+ if (xNamed->getName() == sFirstPage)
+ {
+ nStartSlide = i + 1;
+ break;
+ }
+ }
+
+ pFS->singleElementNS(XML_p, XML_sldRg, XML_st, OUString::number(nStartSlide), XML_end,
+ OUString::number(nEndSlide));
+ }
+
+ if (!sCustomShow.isEmpty())
+ {
+ css::uno::Reference<css::presentation::XCustomPresentationSupplier>
+ XCustPresentationSupplier(mXModel, css::uno::UNO_QUERY_THROW);
+ css::uno::Reference<css::container::XNameContainer> mxCustShows;
+ mxCustShows = XCustPresentationSupplier->getCustomPresentations();
+ const css::uno::Sequence<OUString> aNameSeq(mxCustShows->getElementNames());
+
+ sal_Int32 nCustShowIndex = 0;
+ for (sal_Int32 i = 0; i < aNameSeq.getLength(); i++)
+ {
+ if (aNameSeq[i] == sCustomShow)
+ {
+ nCustShowIndex = i;
+ break;
+ }
+ }
+
+ pFS->singleElementNS(XML_p, XML_custShow, XML_id, OUString::number(nCustShowIndex));
+ }
+
+ pFS->endElementNS(XML_p, XML_showPr);
+
+ pFS->endElementNS(XML_p, XML_presentationPr);
+}
+
+bool PowerPointExport::WriteComments(sal_uInt32 nPageNum)
+{
+ Reference< XAnnotationAccess > xAnnotationAccess(mXDrawPage, uno::UNO_QUERY);
+ if (xAnnotationAccess.is())
+ {
+ Reference< XAnnotationEnumeration > xAnnotationEnumeration(xAnnotationAccess->createAnnotationEnumeration());
+
+ if (xAnnotationEnumeration->hasMoreElements())
+ {
+ FSHelperPtr pFS = openFragmentStreamWithSerializer(
+ "ppt/comments/comment" + OUString::number(nPageNum + 1) + ".xml",
+ "application/vnd.openxmlformats-officedocument.presentationml.comments+xml");
+
+ pFS->startElementNS(XML_p, XML_cmLst,
+ FSNS(XML_xmlns, XML_p), this->getNamespaceURL(OOX_NS(ppt)));
+
+ do
+ {
+ Reference< XAnnotation > xAnnotation(xAnnotationEnumeration->nextElement());
+ util::DateTime aDateTime(xAnnotation->getDateTime());
+ RealPoint2D aRealPoint2D(xAnnotation->getPosition());
+ Reference< XText > xText(xAnnotation->getTextRange());
+ sal_Int32 nLastIndex;
+ sal_Int32 nId = GetAuthorIdAndLastIndex(xAnnotation->getAuthor(), nLastIndex);
+ char cDateTime[sizeof("-32768-65535-65535T65535:65535:65535.4294967295")];
+ // reserve enough space for hypothetical max length
+
+ snprintf(cDateTime, sizeof cDateTime, "%02" SAL_PRIdINT32 "-%02" SAL_PRIuUINT32 "-%02" SAL_PRIuUINT32 "T%02" SAL_PRIuUINT32 ":%02" SAL_PRIuUINT32 ":%02" SAL_PRIuUINT32 ".%09" SAL_PRIuUINT32, sal_Int32(aDateTime.Year), sal_uInt32(aDateTime.Month), sal_uInt32(aDateTime.Day), sal_uInt32(aDateTime.Hours), sal_uInt32(aDateTime.Minutes), sal_uInt32(aDateTime.Seconds), aDateTime.NanoSeconds);
+
+ pFS->startElementNS(XML_p, XML_cm,
+ XML_authorId, OString::number(nId),
+ XML_dt, cDateTime,
+ XML_idx, OString::number(nLastIndex));
+
+ pFS->singleElementNS(XML_p, XML_pos,
+ XML_x, OString::number(std::round(convertMm100ToMasterUnit(aRealPoint2D.X * 100))),
+ XML_y, OString::number(std::round(convertMm100ToMasterUnit(aRealPoint2D.Y * 100))));
+
+ pFS->startElementNS(XML_p, XML_text);
+ pFS->write(xText->getString());
+ pFS->endElementNS(XML_p, XML_text);
+
+ pFS->endElementNS(XML_p, XML_cm);
+
+ }
+ while (xAnnotationEnumeration->hasMoreElements());
+
+ pFS->endElementNS(XML_p, XML_cmLst);
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void PowerPointExport::WriteVBA()
+{
+ if (!mbPptm)
+ return;
+
+ uno::Reference<document::XStorageBasedDocument> xStorageBasedDocument(getModel(), uno::UNO_QUERY);
+ if (!xStorageBasedDocument.is())
+ return;
+
+ uno::Reference<embed::XStorage> xDocumentStorage = xStorageBasedDocument->getDocumentStorage();
+ OUString aMacrosName("_MS_VBA_Macros");
+ if (!xDocumentStorage.is() || !xDocumentStorage->hasByName(aMacrosName))
+ return;
+
+ const sal_Int32 nOpenMode = embed::ElementModes::READ;
+ uno::Reference<io::XInputStream> xMacrosStream(xDocumentStorage->openStreamElement(aMacrosName, nOpenMode), uno::UNO_QUERY);
+ if (!xMacrosStream.is())
+ return;
+
+ uno::Reference<io::XOutputStream> xOutputStream = openFragmentStream("ppt/vbaProject.bin", "application/vnd.ms-office.vbaProject");
+ comphelper::OStorageHelper::CopyInputToOutput(xMacrosStream, xOutputStream);
+
+ // Write the relationship.
+ addRelation(mPresentationFS->getOutputStream(), oox::getRelationship(Relationship::VBAPROJECT), u"vbaProject.bin");
+}
+
+void PowerPointExport::WriteModifyVerifier()
+{
+ Sequence<PropertyValue> aInfo;
+
+ try
+ {
+ Reference<lang::XMultiServiceFactory> xFactory(mXModel, UNO_QUERY);
+ Reference<XPropertySet> xDocSettings(
+ xFactory->createInstance("com.sun.star.document.Settings"), UNO_QUERY);
+ xDocSettings->getPropertyValue("ModifyPasswordInfo") >>= aInfo;
+ }
+ catch (const Exception&)
+ {
+ }
+
+ if (aInfo.hasElements())
+ {
+ OUString sAlgorithm, sSalt, sHash;
+ sal_Int32 nCount = 0;
+ for (auto& prop : aInfo)
+ {
+ if (prop.Name == "algorithm-name")
+ prop.Value >>= sAlgorithm;
+ else if (prop.Name == "salt")
+ prop.Value >>= sSalt;
+ else if (prop.Name == "iteration-count")
+ prop.Value >>= nCount;
+ else if (prop.Name == "hash")
+ prop.Value >>= sHash;
+ }
+ if (!sAlgorithm.isEmpty() && !sSalt.isEmpty() && !sHash.isEmpty())
+ {
+ sal_Int32 nAlgorithmSid = 0;
+ if (sAlgorithm == "MD2")
+ nAlgorithmSid = 1;
+ else if (sAlgorithm == "MD4")
+ nAlgorithmSid = 2;
+ else if (sAlgorithm == "MD5")
+ nAlgorithmSid = 3;
+ else if (sAlgorithm == "SHA-1")
+ nAlgorithmSid = 4;
+ else if (sAlgorithm == "MAC")
+ nAlgorithmSid = 5;
+ else if (sAlgorithm == "RIPEMD")
+ nAlgorithmSid = 6;
+ else if (sAlgorithm == "RIPEMD-160")
+ nAlgorithmSid = 7;
+ else if (sAlgorithm == "HMAC")
+ nAlgorithmSid = 9;
+ else if (sAlgorithm == "SHA-256")
+ nAlgorithmSid = 12;
+ else if (sAlgorithm == "SHA-384")
+ nAlgorithmSid = 13;
+ else if (sAlgorithm == "SHA-512")
+ nAlgorithmSid = 14;
+
+ if (nAlgorithmSid != 0)
+ mPresentationFS->singleElementNS(XML_p, XML_modifyVerifier,
+ XML_cryptProviderType, "rsaAES",
+ XML_cryptAlgorithmClass, "hash",
+ XML_cryptAlgorithmType, "typeAny",
+ XML_cryptAlgorithmSid, OString::number(nAlgorithmSid).getStr(),
+ XML_spinCount, OString::number(nCount).getStr(),
+ XML_saltData, sSalt.toUtf8().getStr(),
+ XML_hashData, sHash.toUtf8().getStr());
+ }
+ }
+}
+
+void PowerPointExport::ImplWriteSlide(sal_uInt32 nPageNum, sal_uInt32 nMasterNum, sal_uInt16 /* nMode */,
+ bool bHasBackground, Reference< XPropertySet > const& aXBackgroundPropSet)
+{
+ SAL_INFO("sd.eppt", "write slide: " << nPageNum << "\n----------------");
+
+ // slides list
+ if (nPageNum == 0)
+ mPresentationFS->startElementNS(XML_p, XML_sldIdLst);
+
+ // add explicit relation of presentation to this slide
+ OUString sRelId = addRelation(mPresentationFS->getOutputStream(),
+ oox::getRelationship(Relationship::SLIDE),
+ OUStringConcatenation("slides/slide" + OUString::number(nPageNum + 1) +".xml"));
+
+ mPresentationFS->singleElementNS(XML_p, XML_sldId,
+ XML_id, OString::number(GetNewSlideId()),
+ FSNS(XML_r, XML_id), sRelId);
+
+ maRelId.push_back(sRelId);
+
+ if (nPageNum == mnPages - 1)
+ mPresentationFS->endElementNS(XML_p, XML_sldIdLst);
+
+ FSHelperPtr pFS = openFragmentStreamWithSerializer(
+ "ppt/slides/slide" + OUString::number(nPageNum + 1) + ".xml",
+ "application/vnd.openxmlformats-officedocument.presentationml.slide+xml");
+
+ if (mpSlidesFSArray.size() < mnPages)
+ mpSlidesFSArray.resize(mnPages);
+ mpSlidesFSArray[ nPageNum ] = pFS;
+
+ const char* pShow = nullptr;
+ const char* pShowMasterShape = nullptr;
+
+ if (ImplGetPropertyValue(mXPagePropSet, "Visible"))
+ {
+ bool bShow(false);
+ if ((mAny >>= bShow) && !bShow)
+ pShow = "0";
+ }
+
+ if (ImplGetPropertyValue(mXPagePropSet, "IsBackgroundObjectsVisible"))
+ {
+ bool bShowMasterShape(false);
+ if ((mAny >>= bShowMasterShape) && !bShowMasterShape)
+ pShowMasterShape = "0";
+ }
+
+ pFS->startElementNS(XML_p, XML_sld, PNMSS, XML_show, pShow, XML_showMasterSp, pShowMasterShape);
+
+ pFS->startElementNS(XML_p, XML_cSld);
+
+ // background
+ if (bHasBackground)
+ {
+ ImplWriteBackground(pFS, aXBackgroundPropSet);
+ }
+
+ WriteShapeTree(pFS, NORMAL, false);
+
+ pFS->endElementNS(XML_p, XML_cSld);
+
+ WriteTransition(pFS);
+ WriteAnimations(pFS, mXDrawPage, *this);
+
+ pFS->endElementNS(XML_p, XML_sld);
+
+ // add implicit relation to slide layout
+ addRelation(pFS->getOutputStream(),
+ oox::getRelationship(Relationship::SLIDELAYOUT),
+ OUStringConcatenation("../slideLayouts/slideLayout" +
+ OUString::number(GetLayoutFileId(GetPPTXLayoutId(GetLayoutOffset(mXPagePropSet)), nMasterNum)) +
+ ".xml"));
+
+ if (WriteComments(nPageNum))
+ // add implicit relation to slide comments
+ addRelation(pFS->getOutputStream(),
+ oox::getRelationship(Relationship::COMMENTS),
+ OUStringConcatenation("../comments/comment" + OUString::number(nPageNum + 1) + ".xml"));
+
+ SAL_INFO("sd.eppt", "----------------");
+}
+
+void PowerPointExport::ImplWriteNotes(sal_uInt32 nPageNum)
+{
+ if (!mbCreateNotes || !ContainsOtherShapeThanPlaceholders())
+ return;
+
+ SAL_INFO("sd.eppt", "write Notes " << nPageNum << "\n----------------");
+
+ FSHelperPtr pFS = openFragmentStreamWithSerializer(
+ "ppt/notesSlides/notesSlide" +
+ OUString::number(nPageNum + 1) +
+ ".xml",
+ "application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml");
+
+ pFS->startElementNS(XML_p, XML_notes, PNMSS);
+
+ pFS->startElementNS(XML_p, XML_cSld);
+
+ WriteShapeTree(pFS, NOTICE, false);
+
+ pFS->endElementNS(XML_p, XML_cSld);
+
+ pFS->endElementNS(XML_p, XML_notes);
+
+ // add implicit relation to slide
+ addRelation(pFS->getOutputStream(),
+ oox::getRelationship(Relationship::SLIDE),
+ OUStringConcatenation("../slides/slide" + OUString::number(nPageNum + 1) + ".xml"));
+
+ // add slide implicit relation to notes
+ if (nPageNum < mpSlidesFSArray.size())
+ addRelation(mpSlidesFSArray[ nPageNum ]->getOutputStream(),
+ oox::getRelationship(Relationship::NOTESSLIDE),
+ OUStringConcatenation("../notesSlides/notesSlide" + OUString::number(nPageNum + 1) + ".xml"));
+
+ // add implicit relation to notes master
+ addRelation(pFS->getOutputStream(),
+ oox::getRelationship(Relationship::NOTESMASTER),
+ u"../notesMasters/notesMaster1.xml");
+
+ SAL_INFO("sd.eppt", "-----------------");
+}
+
+void PowerPointExport::AddLayoutIdAndRelation(const FSHelperPtr& pFS, sal_Int32 nLayoutFileId)
+{
+ // add implicit relation of slide master to slide layout
+ OUString sRelId = addRelation(pFS->getOutputStream(),
+ oox::getRelationship(Relationship::SLIDELAYOUT),
+ OUStringConcatenation("../slideLayouts/slideLayout" + OUString::number(nLayoutFileId) + ".xml"));
+
+ pFS->singleElementNS(XML_p, XML_sldLayoutId,
+ XML_id, OString::number(GetNewSlideMasterId()),
+ FSNS(XML_r, XML_id), sRelId);
+}
+
+void PowerPointExport::ImplWriteSlideMaster(sal_uInt32 nPageNum, Reference< XPropertySet > const& aXBackgroundPropSet)
+{
+ SAL_INFO("sd.eppt", "write master slide: " << nPageNum << "\n--------------");
+
+ // slides list
+ if (nPageNum == 0)
+ mPresentationFS->startElementNS(XML_p, XML_sldMasterIdLst);
+
+ OUString sRelId = addRelation(mPresentationFS->getOutputStream(),
+ oox::getRelationship(Relationship::SLIDEMASTER),
+ OUStringConcatenation("slideMasters/slideMaster" + OUString::number(nPageNum + 1) + ".xml"));
+
+ mPresentationFS->singleElementNS(XML_p, XML_sldMasterId,
+ XML_id, OString::number(GetNewSlideMasterId()),
+ FSNS(XML_r, XML_id), sRelId);
+
+ if (nPageNum == mnMasterPages - 1)
+ mPresentationFS->endElementNS(XML_p, XML_sldMasterIdLst);
+
+ FSHelperPtr pFS =
+ openFragmentStreamWithSerializer("ppt/slideMasters/slideMaster" +
+ OUString::number(nPageNum + 1) + ".xml",
+ "application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml");
+
+ SdrPage* pMasterPage = SdPage::getImplementation(mXDrawPage);
+ svx::Theme* pTheme = nullptr;
+ if (pMasterPage)
+ {
+ pTheme = pMasterPage->getSdrPageProperties().GetTheme();
+ }
+
+ // write theme per master
+ WriteTheme(nPageNum, pTheme);
+
+ // add implicit relation to the presentation theme
+ addRelation(pFS->getOutputStream(),
+ oox::getRelationship(Relationship::THEME),
+ OUStringConcatenation("../theme/theme" + OUString::number(nPageNum + 1) + ".xml"));
+
+ pFS->startElementNS(XML_p, XML_sldMaster, PNMSS);
+
+ pFS->startElementNS(XML_p, XML_cSld);
+
+ if (aXBackgroundPropSet)
+ ImplWriteBackground(pFS, aXBackgroundPropSet);
+ WriteShapeTree(pFS, MASTER, true);
+
+ pFS->endElementNS(XML_p, XML_cSld);
+
+ // color map - now it uses colors from hardcoded theme, once we eventually generate theme, this might need update
+ pFS->singleElementNS(XML_p, XML_clrMap,
+ XML_bg1, "lt1",
+ XML_bg2, "lt2",
+ XML_tx1, "dk1",
+ XML_tx2, "dk2",
+ XML_accent1, "accent1",
+ XML_accent2, "accent2",
+ XML_accent3, "accent3",
+ XML_accent4, "accent4",
+ XML_accent5, "accent5",
+ XML_accent6, "accent6",
+ XML_hlink, "hlink",
+ XML_folHlink, "folHlink");
+
+ // use master's id type as they have same range, mso does that as well
+ pFS->startElementNS(XML_p, XML_sldLayoutIdLst);
+
+ for (int i = 0; i < LAYOUT_SIZE; i++)
+ {
+ sal_Int32 nLayoutFileId = GetLayoutFileId(i, nPageNum);
+ if (nLayoutFileId > 0)
+ {
+ AddLayoutIdAndRelation(pFS, nLayoutFileId);
+ }
+ else
+ {
+ ImplWritePPTXLayout(i, nPageNum);
+ AddLayoutIdAndRelation(pFS, GetLayoutFileId(i, nPageNum));
+ }
+ }
+
+ pFS->endElementNS(XML_p, XML_sldLayoutIdLst);
+
+ pFS->endElementNS(XML_p, XML_sldMaster);
+
+ SAL_INFO("sd.eppt", "----------------");
+}
+
+sal_Int32 PowerPointExport::GetLayoutFileId(sal_Int32 nOffset, sal_uInt32 nMasterNum)
+{
+ SAL_INFO("sd.eppt", "GetLayoutFileId offset: " << nOffset << " master: " << nMasterNum);
+ if (mLayoutInfo[ nOffset ].mnFileIdArray.size() <= nMasterNum)
+ return 0;
+
+ return mLayoutInfo[ nOffset ].mnFileIdArray[ nMasterNum ];
+}
+
+void PowerPointExport::ImplWritePPTXLayout(sal_Int32 nOffset, sal_uInt32 nMasterNum)
+{
+ SAL_INFO("sd.eppt", "write layout: " << nOffset);
+
+ Reference< drawing::XDrawPagesSupplier > xDPS(getModel(), uno::UNO_QUERY);
+ Reference< drawing::XDrawPages > xDrawPages = xDPS->getDrawPages();
+ Reference< drawing::XDrawPage > xSlide = xDrawPages->insertNewByIndex(xDrawPages->getCount());
+
+#ifdef DEBUG
+ if (xSlide.is())
+ printf("new page created\n");
+#endif
+
+ Reference< beans::XPropertySet > xPropSet(xSlide, uno::UNO_QUERY);
+ xPropSet->setPropertyValue("Layout", Any(short(aLayoutInfo[ nOffset ].nType)));
+#if OSL_DEBUG_LEVEL > 1
+ dump_pset(xPropSet);
+#endif
+ mXPagePropSet.set(xSlide, UNO_QUERY);
+ mXShapes = xSlide;
+
+ if (mLayoutInfo[ nOffset ].mnFileIdArray.size() < mnMasterPages)
+ {
+ mLayoutInfo[ nOffset ].mnFileIdArray.resize(mnMasterPages);
+ }
+
+ if (mLayoutInfo[ nOffset ].mnFileIdArray[ nMasterNum ] != 0)
+ return;
+
+ FSHelperPtr pFS
+ = openFragmentStreamWithSerializer("ppt/slideLayouts/slideLayout" +
+ OUString::number(mnLayoutFileIdMax) + ".xml",
+ "application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml");
+
+ // add implicit relation of slide layout to slide master
+ addRelation(pFS->getOutputStream(),
+ oox::getRelationship(Relationship::SLIDEMASTER),
+ OUStringConcatenation("../slideMasters/slideMaster" + OUString::number(nMasterNum + 1) + ".xml"));
+
+ pFS->startElementNS(XML_p, XML_sldLayout,
+ PNMSS,
+ XML_type, aLayoutInfo[ nOffset ].sType,
+ XML_preserve, "1");
+
+ pFS->startElementNS(XML_p, XML_cSld,
+ XML_name, aLayoutInfo[ nOffset ].sName);
+ //pFS->write( MINIMAL_SPTREE ); // TODO: write actual shape tree
+ WriteShapeTree(pFS, LAYOUT, true);
+
+ pFS->endElementNS(XML_p, XML_cSld);
+
+ pFS->endElementNS(XML_p, XML_sldLayout);
+
+ mLayoutInfo[ nOffset ].mnFileIdArray[ nMasterNum ] = mnLayoutFileIdMax;
+
+ mnLayoutFileIdMax ++;
+
+ xDrawPages->remove(xSlide);
+}
+
+void PowerPointExport::WriteShapeTree(const FSHelperPtr& pFS, PageType ePageType, bool bMaster)
+{
+ PowerPointShapeExport aDML(pFS, &maShapeMap, this);
+ aDML.SetMaster(bMaster);
+ aDML.SetPageType(ePageType);
+ aDML.SetBackgroundDark(mbIsBackgroundDark);
+
+ pFS->startElementNS(XML_p, XML_spTree);
+ pFS->write(MAIN_GROUP);
+
+ ResetGroupTable(mXShapes->getCount());
+
+ while (GetNextGroupEntry())
+ {
+
+ sal_uInt32 nGroups = GetGroupsClosed();
+ for (sal_uInt32 i = 0; i < nGroups; i++)
+ {
+ SAL_INFO("sd.eppt", "leave group");
+ }
+
+ if (GetShapeByIndex(GetCurrentGroupIndex(), true))
+ {
+ SAL_INFO("sd.eppt", "mType: " << mType);
+ const SdrObjGroup* pDiagramCandidate(dynamic_cast<const SdrObjGroup*>(SdrObject::getSdrObjectFromXShape(mXShape)));
+ const bool bIsDiagram(nullptr != pDiagramCandidate && pDiagramCandidate->isDiagram());
+
+ if (bIsDiagram)
+ WriteDiagram(pFS, aDML, mXShape, mnDiagramId++);
+ else
+ aDML.WriteShape(mXShape);
+ }
+ }
+
+ if ( ePageType == NORMAL || ePageType == LAYOUT )
+ WritePlaceholderReferenceShapes(aDML, ePageType);
+ pFS->endElementNS(XML_p, XML_spTree);
+}
+
+ShapeExport& PowerPointShapeExport::WritePageShape(const Reference< XShape >& xShape, PageType ePageType, bool bPresObj)
+{
+ if ((ePageType == NOTICE && bPresObj) || ePageType == LAYOUT || ePageType == MASTER)
+ return WritePlaceholderShape(xShape, SlideImage);
+
+ return WriteTextShape(xShape);
+}
+
+bool PowerPointShapeExport::WritePlaceholder(const Reference< XShape >& xShape, PlaceholderType ePlaceholder, bool bMaster)
+{
+ SAL_INFO("sd.eppt", "WritePlaceholder " << bMaster << " " << ShapeExport::NonEmptyText(xShape));
+ if (!xShape)
+ return false;
+ try
+ {
+ Reference<XPropertySet> xShapeProps(xShape, UNO_QUERY);
+ if (xShapeProps->getPropertyValue("IsPresentationObject").get<bool>())
+ {
+ WritePlaceholderShape(xShape, ePlaceholder);
+
+ return true;
+ }
+ }
+ catch (Exception&)
+ {
+ return false;
+ }
+ return false;
+}
+
+ShapeExport& PowerPointShapeExport::WritePlaceholderShape(const Reference< XShape >& xShape, PlaceholderType ePlaceholder)
+{
+ Reference<XPropertySet> xProps(xShape, UNO_QUERY);
+ bool bUseBackground(false);
+ if (xProps.is() && xProps->getPropertySetInfo()->hasPropertyByName("FillUseSlideBackground"))
+ xProps->getPropertyValue("FillUseSlideBackground") >>= bUseBackground;
+
+ if (bUseBackground)
+ mpFS->startElementNS(XML_p, XML_sp, XML_useBgFill, "1");
+ else
+ mpFS->startElementNS(XML_p, XML_sp);
+
+ // non visual shape properties
+ mpFS->startElementNS(XML_p, XML_nvSpPr);
+ const OString aPlaceholderID("PlaceHolder " + OString::number(mnShapeIdMax++));
+ WriteNonVisualDrawingProperties(xShape, aPlaceholderID.getStr());
+ mpFS->startElementNS(XML_p, XML_cNvSpPr);
+ mpFS->singleElementNS(XML_a, XML_spLocks, XML_noGrp, "1");
+ mpFS->endElementNS(XML_p, XML_cNvSpPr);
+ mpFS->startElementNS(XML_p, XML_nvPr);
+
+ bool bUsePlaceholderIndex
+ = ePlaceholder == Footer || ePlaceholder == DateAndTime || ePlaceholder == SlideNumber;
+ const char* pType = getPlaceholderTypeName(ePlaceholder);
+
+ SAL_INFO("sd.eppt", "write placeholder " << pType);
+ if (bUsePlaceholderIndex)
+ {
+ mpFS->singleElementNS(
+ XML_p, XML_ph, XML_type, pType, XML_idx,
+ OString::number(
+ static_cast<PowerPointExport*>(GetFB())->CreateNewPlaceholderIndex(xShape)));
+ }
+ else
+ {
+ if ((mePageType == PageType::LAYOUT || mePageType == PageType::NORMAL)
+ && ePlaceholder == Outliner)
+ mpFS->singleElementNS(XML_p, XML_ph);
+ else
+ mpFS->singleElementNS(XML_p, XML_ph, XML_type, pType);
+ }
+ mpFS->endElementNS(XML_p, XML_nvPr);
+ mpFS->endElementNS(XML_p, XML_nvSpPr);
+
+ // visual shape properties
+ mpFS->startElementNS(XML_p, XML_spPr);
+ WriteShapeTransformation(xShape, XML_a);
+ WritePresetShape("rect");
+ if (xProps.is())
+ {
+ WriteBlipFill(xProps, "Graphic");
+ // Do not forget to export the visible properties.
+ WriteFill( xProps );
+ WriteOutline( xProps );
+ WriteShapeEffects( xProps );
+
+ bool bHas3DEffectinShape = false;
+ uno::Sequence<beans::PropertyValue> grabBag;
+ if (xProps->getPropertySetInfo()->hasPropertyByName("InteropGrabBag"))
+ xProps->getPropertyValue("InteropGrabBag") >>= grabBag;
+
+ for (auto const& it : std::as_const(grabBag))
+ if (it.Name == "3DEffectProperties")
+ bHas3DEffectinShape = true;
+
+ if( bHas3DEffectinShape)
+ Write3DEffects( xProps, /*bIsText=*/false );
+ }
+ mpFS->endElementNS(XML_p, XML_spPr);
+
+ WriteTextBox(xShape, XML_p, /*bWritePropertiesAsLstStyles=*/bUsePlaceholderIndex);
+
+ mpFS->endElementNS(XML_p, XML_sp);
+
+ return *this;
+}
+
+ShapeExport& PowerPointShapeExport::WritePlaceholderReferenceShape(
+ PlaceholderType ePlaceholder, sal_Int32 nReferencedPlaceholderIdx, PageType ePageType,
+ const Reference<XPropertySet>& rXPagePropSet)
+{
+ mpFS->startElementNS(XML_p, XML_sp);
+
+ // non visual shape properties
+ mpFS->startElementNS(XML_p, XML_nvSpPr);
+ const OString aPlaceholderID("PlaceHolder " + OString::number(mnShapeIdMax++));
+ GetFS()->singleElementNS(XML_p, XML_cNvPr, XML_id, OString::number(mnShapeIdMax), XML_name,
+ aPlaceholderID.getStr());
+
+ mpFS->startElementNS(XML_p, XML_cNvSpPr);
+ mpFS->singleElementNS(XML_a, XML_spLocks, XML_noGrp, "1");
+ mpFS->endElementNS(XML_p, XML_cNvSpPr);
+ mpFS->startElementNS(XML_p, XML_nvPr);
+
+ const char* pType = getPlaceholderTypeName(ePlaceholder);
+ mpFS->singleElementNS(XML_p, XML_ph, XML_type, pType, XML_idx,
+ OString::number(nReferencedPlaceholderIdx));
+ mpFS->endElementNS(XML_p, XML_nvPr);
+ mpFS->endElementNS(XML_p, XML_nvSpPr);
+
+ // visual shape properties
+ mpFS->startElementNS(XML_p, XML_spPr);
+ mpFS->endElementNS(XML_p, XML_spPr);
+
+ WritePlaceholderReferenceTextBody(ePlaceholder, ePageType, rXPagePropSet);
+
+ mpFS->endElementNS(XML_p, XML_sp);
+
+ return *this;
+}
+
+ShapeExport& PowerPointShapeExport::WritePlaceholderReferenceTextBody(
+ PlaceholderType ePlaceholder, PageType ePageType, const Reference<XPropertySet> xPagePropSet)
+{
+ mpFS->startElementNS(XML_p, XML_txBody);
+ mpFS->singleElementNS(XML_a, XML_bodyPr);
+ mpFS->startElementNS(XML_a, XML_p);
+
+ switch (ePlaceholder)
+ {
+ case Header:
+ break;
+ case Footer:
+ {
+ OUString aFooterText;
+ if (ePageType == LAYOUT)
+ {
+ aFooterText = "Footer";
+ }
+ else
+ {
+ xPagePropSet->getPropertyValue("FooterText") >>= aFooterText;
+ }
+ mpFS->startElementNS(XML_a, XML_r);
+ mpFS->startElementNS(XML_a, XML_t);
+ mpFS->writeEscaped(aFooterText);
+ mpFS->endElementNS(XML_a, XML_t);
+ mpFS->endElementNS(XML_a, XML_r);
+ break;
+ }
+ case SlideNumber:
+ {
+ OUString aSlideNum;
+ sal_Int32 nSlideNum = 0;
+ if (ePageType == LAYOUT)
+ {
+ aSlideNum = "<#>";
+ }
+ else
+ {
+ xPagePropSet->getPropertyValue("Number") >>= nSlideNum;
+ aSlideNum = OUString::number(nSlideNum);
+ }
+ OString aUUID(comphelper::xml::generateGUIDString());
+ mpFS->startElementNS(XML_a, XML_fld, XML_id, aUUID.getStr(), XML_type, "slidenum");
+ mpFS->startElementNS(XML_a, XML_t);
+ mpFS->writeEscaped(aSlideNum);
+ mpFS->endElementNS(XML_a, XML_t);
+ mpFS->endElementNS(XML_a, XML_fld);
+ break;
+ }
+ case DateAndTime:
+ {
+ OUString aDateTimeType = "datetime1";
+ bool bIsDateTimeFixed = false;
+ xPagePropSet->getPropertyValue("IsDateTimeFixed") >>= bIsDateTimeFixed;
+
+ OUString aDateTimeText = "Date";
+ const LanguageTag& rLanguageTag = Application::GetSettings().GetLanguageTag();
+
+ if(ePageType != LAYOUT && !bIsDateTimeFixed)
+ {
+ sal_Int32 nDateTimeFormat = 0;
+ xPagePropSet->getPropertyValue("DateTimeFormat") >>= nDateTimeFormat;
+
+ // 4 LSBs represent the date
+ SvxDateFormat eDate = static_cast<SvxDateFormat>(nDateTimeFormat & 0x0f);
+ // the 4 bits after the date bits represent the time
+ SvxTimeFormat eTime = static_cast<SvxTimeFormat>(nDateTimeFormat >> 4);
+ aDateTimeType = GetDatetimeTypeFromDateTime(eDate, eTime);
+
+ if (aDateTimeType == "datetime")
+ aDateTimeType = "datetime1";
+
+ ::DateTime aDateTime( ::DateTime::SYSTEM );
+
+ aDateTimeText = SvxDateTimeField::GetFormatted(
+ aDateTime, aDateTime, eDate,
+ eTime, *(SD_MOD()->GetNumberFormatter()),
+ rLanguageTag.getLanguageType());
+ }
+
+ if(!bIsDateTimeFixed)
+ {
+ OString aUUID(comphelper::xml::generateGUIDString());
+ mpFS->startElementNS(XML_a, XML_fld, XML_id, aUUID.getStr(), XML_type, aDateTimeType);
+ }
+ else
+ {
+ xPagePropSet->getPropertyValue("DateTimeText") >>= aDateTimeText;
+ mpFS->startElementNS(XML_a, XML_r);
+ }
+
+ mpFS->startElementNS(XML_a, XML_rPr, XML_lang, rLanguageTag.getBcp47MS());
+ mpFS->endElementNS(XML_a, XML_rPr);
+
+ mpFS->startElementNS(XML_a, XML_t);
+ mpFS->writeEscaped(aDateTimeText);
+ mpFS->endElementNS(XML_a, XML_t);
+
+ mpFS->endElementNS(XML_a, bIsDateTimeFixed ? XML_r : XML_fld);
+ break;
+ }
+ default:
+ SAL_INFO("sd.eppt", "warning: no defined textbody for referenced placeholder type: "
+ << ePlaceholder);
+ }
+ mpFS->endElementNS(XML_a, XML_p);
+ mpFS->endElementNS(XML_p, XML_txBody);
+
+ return *this;
+}
+
+#define SYS_COLOR_SCHEMES " <a:dk1>\
+ <a:sysClr val=\"windowText\" lastClr=\"000000\"/>\
+ </a:dk1>\
+ <a:lt1>\
+ <a:sysClr val=\"window\" lastClr=\"FFFFFF\"/>\
+ </a:lt1>"
+
+#define MINIMAL_THEME " <a:fontScheme name=\"Office\">\
+ <a:majorFont>\
+ <a:latin typeface=\"Arial\"/>\
+ <a:ea typeface=\"DejaVu Sans\"/>\
+ <a:cs typeface=\"DejaVu Sans\"/>\
+ </a:majorFont>\
+ <a:minorFont>\
+ <a:latin typeface=\"Arial\"/>\
+ <a:ea typeface=\"DejaVu Sans\"/>\
+ <a:cs typeface=\"DejaVu Sans\"/>\
+ </a:minorFont>\
+ </a:fontScheme>\
+ <a:fmtScheme name=\"Office\">\
+ <a:fillStyleLst>\
+ <a:solidFill>\
+ <a:schemeClr val=\"phClr\"/>\
+ </a:solidFill>\
+ <a:gradFill rotWithShape=\"1\">\
+ <a:gsLst>\
+ <a:gs pos=\"0\">\
+ <a:schemeClr val=\"phClr\">\
+ <a:tint val=\"50000\"/>\
+ <a:satMod val=\"300000\"/>\
+ </a:schemeClr>\
+ </a:gs>\
+ <a:gs pos=\"35000\">\
+ <a:schemeClr val=\"phClr\">\
+ <a:tint val=\"37000\"/>\
+ <a:satMod val=\"300000\"/>\
+ </a:schemeClr>\
+ </a:gs>\
+ <a:gs pos=\"100000\">\
+ <a:schemeClr val=\"phClr\">\
+ <a:tint val=\"15000\"/>\
+ <a:satMod val=\"350000\"/>\
+ </a:schemeClr>\
+ </a:gs>\
+ </a:gsLst>\
+ <a:lin ang=\"16200000\" scaled=\"1\"/>\
+ </a:gradFill>\
+ <a:gradFill rotWithShape=\"1\">\
+ <a:gsLst>\
+ <a:gs pos=\"0\">\
+ <a:schemeClr val=\"phClr\">\
+ <a:shade val=\"51000\"/>\
+ <a:satMod val=\"130000\"/>\
+ </a:schemeClr>\
+ </a:gs>\
+ <a:gs pos=\"80000\">\
+ <a:schemeClr val=\"phClr\">\
+ <a:shade val=\"93000\"/>\
+ <a:satMod val=\"130000\"/>\
+ </a:schemeClr>\
+ </a:gs>\
+ <a:gs pos=\"100000\">\
+ <a:schemeClr val=\"phClr\">\
+ <a:shade val=\"94000\"/>\
+ <a:satMod val=\"135000\"/>\
+ </a:schemeClr>\
+ </a:gs>\
+ </a:gsLst>\
+ <a:lin ang=\"16200000\" scaled=\"0\"/>\
+ </a:gradFill>\
+ </a:fillStyleLst>\
+ <a:lnStyleLst>\
+ <a:ln w=\"6350\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\">\
+ <a:solidFill>\
+ <a:schemeClr val=\"phClr\">\
+ <a:shade val=\"95000\"/>\
+ <a:satMod val=\"105000\"/>\
+ </a:schemeClr>\
+ </a:solidFill>\
+ <a:prstDash val=\"solid\"/>\
+ <a:miter/>\
+ </a:ln>\
+ <a:ln w=\"12700\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\">\
+ <a:solidFill>\
+ <a:schemeClr val=\"phClr\"/>\
+ </a:solidFill>\
+ <a:prstDash val=\"solid\"/>\
+ <a:miter/>\
+ </a:ln>\
+ <a:ln w=\"19050\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\">\
+ <a:solidFill>\
+ <a:schemeClr val=\"phClr\"/>\
+ </a:solidFill>\
+ <a:prstDash val=\"solid\"/>\
+ <a:miter/>\
+ </a:ln>\
+ </a:lnStyleLst>\
+ <a:effectStyleLst>\
+ <a:effectStyle>\
+ <a:effectLst/>\
+ </a:effectStyle>\
+ <a:effectStyle>\
+ <a:effectLst/>\
+ </a:effectStyle>\
+ <a:effectStyle>\
+ <a:effectLst>\
+ <a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\">\
+ <a:srgbClr val=\"000000\">\
+ <a:alpha val=\"35000\"/>\
+ </a:srgbClr>\
+ </a:outerShdw>\
+ </a:effectLst>\
+ <a:scene3d>\
+ <a:camera prst=\"orthographicFront\">\
+ <a:rot lat=\"0\" lon=\"0\" rev=\"0\"/>\
+ </a:camera>\
+ <a:lightRig rig=\"threePt\" dir=\"t\">\
+ <a:rot lat=\"0\" lon=\"0\" rev=\"1200000\"/>\
+ </a:lightRig>\
+ </a:scene3d>\
+ <a:sp3d>\
+ <a:bevelT w=\"63500\" h=\"25400\"/>\
+ </a:sp3d>\
+ </a:effectStyle>\
+ </a:effectStyleLst>\
+ <a:bgFillStyleLst>\
+ <a:solidFill>\
+ <a:schemeClr val=\"phClr\"/>\
+ </a:solidFill>\
+ <a:gradFill rotWithShape=\"1\">\
+ <a:gsLst>\
+ <a:gs pos=\"0\">\
+ <a:schemeClr val=\"phClr\">\
+ <a:tint val=\"40000\"/>\
+ <a:satMod val=\"350000\"/>\
+ </a:schemeClr>\
+ </a:gs>\
+ <a:gs pos=\"40000\">\
+ <a:schemeClr val=\"phClr\">\
+ <a:tint val=\"45000\"/>\
+ <a:shade val=\"99000\"/>\
+ <a:satMod val=\"350000\"/>\
+ </a:schemeClr>\
+ </a:gs>\
+ <a:gs pos=\"100000\">\
+ <a:schemeClr val=\"phClr\">\
+ <a:shade val=\"20000\"/>\
+ <a:satMod val=\"255000\"/>\
+ </a:schemeClr>\
+ </a:gs>\
+ </a:gsLst>\
+ <a:path path=\"circle\">\
+ <a:fillToRect l=\"50000\" t=\"-80000\" r=\"50000\" b=\"180000\"/>\
+ </a:path>\
+ </a:gradFill>\
+ <a:gradFill rotWithShape=\"1\">\
+ <a:gsLst>\
+ <a:gs pos=\"0\">\
+ <a:schemeClr val=\"phClr\">\
+ <a:tint val=\"80000\"/>\
+ <a:satMod val=\"300000\"/>\
+ </a:schemeClr>\
+ </a:gs>\
+ <a:gs pos=\"100000\">\
+ <a:schemeClr val=\"phClr\">\
+ <a:shade val=\"30000\"/>\
+ <a:satMod val=\"200000\"/>\
+ </a:schemeClr>\
+ </a:gs>\
+ </a:gsLst>\
+ <a:path path=\"circle\">\
+ <a:fillToRect l=\"50000\" t=\"50000\" r=\"50000\" b=\"50000\"/>\
+ </a:path>\
+ </a:gradFill>\
+ </a:bgFillStyleLst>\
+ </a:fmtScheme>"
+
+void PowerPointExport::WriteDefaultColorSchemes(const FSHelperPtr& pFS)
+{
+ for (int nId = PredefinedClrSchemeId::dk2; nId != PredefinedClrSchemeId::Count; nId++)
+ {
+ OUString sName = PredefinedClrNames[static_cast<PredefinedClrSchemeId>(nId)];
+ sal_Int32 nColor = 0;
+
+ switch (nId)
+ {
+ case PredefinedClrSchemeId::dk2:
+ nColor = 0x1F497D;
+ break;
+ case PredefinedClrSchemeId::lt2:
+ nColor = 0xEEECE1;
+ break;
+ case PredefinedClrSchemeId::accent1:
+ nColor = 0x4F81BD;
+ break;
+ case PredefinedClrSchemeId::accent2:
+ nColor = 0xC0504D;
+ break;
+ case PredefinedClrSchemeId::accent3:
+ nColor = 0x9BBB59;
+ break;
+ case PredefinedClrSchemeId::accent4:
+ nColor = 0x8064A2;
+ break;
+ case PredefinedClrSchemeId::accent5:
+ nColor = 0x4BACC6;
+ break;
+ case PredefinedClrSchemeId::accent6:
+ nColor = 0xF79646;
+ break;
+ case PredefinedClrSchemeId::hlink:
+ nColor = 0x0000FF;
+ break;
+ case PredefinedClrSchemeId::folHlink:
+ nColor = 0x800080;
+ break;
+ }
+
+ OUString sOpenColorScheme = "<a:" + sName + ">";
+ pFS->write(sOpenColorScheme);
+
+ pFS->singleElementNS(XML_a, XML_srgbClr, XML_val, I32SHEX(nColor));
+
+ OUString sCloseColorScheme = "</a:" + sName + ">";
+ pFS->write(sCloseColorScheme);
+ }
+}
+
+bool PowerPointExport::WriteColorSets(const FSHelperPtr& pFS, svx::Theme* pTheme)
+{
+ static std::map<PredefinedClrSchemeId, sal_Int32> aPredefinedClrTokens =
+ {
+ { dk1, XML_dk1 },
+ { lt1, XML_lt1 },
+ { dk2, XML_dk2 },
+ { lt2, XML_lt2 },
+ { accent1, XML_accent1 },
+ { accent2, XML_accent2 },
+ { accent3, XML_accent3 },
+ { accent4, XML_accent4 },
+ { accent5, XML_accent5 },
+ { accent6, XML_accent6 },
+ { hlink, XML_hlink },
+ { folHlink, XML_folHlink }
+ };
+
+ if (!pTheme)
+ {
+ return false;
+ }
+
+ svx::ColorSet* pColorSet = pTheme->GetColorSet();
+ if (!pColorSet)
+ {
+ return false;
+ }
+
+ for (int nId = PredefinedClrSchemeId::dk1; nId < PredefinedClrSchemeId::Count; nId++)
+ {
+ sal_Int32 nToken = aPredefinedClrTokens[static_cast<PredefinedClrSchemeId>(nId)];
+ pFS->startElementNS(XML_a, nToken);
+ pFS->singleElementNS(XML_a, XML_srgbClr, XML_val, I32SHEX(static_cast<sal_Int32>(pColorSet->getColor(nId))));
+ pFS->endElementNS(XML_a, nToken);
+ }
+
+ return true;
+}
+
+bool PowerPointExport::WriteColorSchemes(const FSHelperPtr& pFS, const OUString& rThemePath)
+{
+ try
+ {
+ uno::Reference<beans::XPropertySet> xDocProps(getModel(), uno::UNO_QUERY);
+ if (xDocProps.is())
+ {
+ uno::Reference<beans::XPropertySetInfo> xPropsInfo = xDocProps->getPropertySetInfo();
+
+ static const OUStringLiteral aGrabBagPropName = u"InteropGrabBag";
+ if (xPropsInfo.is() && xPropsInfo->hasPropertyByName(aGrabBagPropName))
+ {
+ comphelper::SequenceAsHashMap aGrabBag(xDocProps->getPropertyValue(aGrabBagPropName));
+ uno::Sequence<beans::PropertyValue> aCurrentTheme;
+
+ aGrabBag.getValue(rThemePath) >>= aCurrentTheme;
+
+ if (!aCurrentTheme.hasElements())
+ return false;
+
+ // Order is important
+ for (int nId = PredefinedClrSchemeId::dk2; nId != PredefinedClrSchemeId::Count; nId++)
+ {
+ OUString sName = PredefinedClrNames[static_cast<PredefinedClrSchemeId>(nId)];
+ sal_Int32 nColor = 0;
+
+ for (auto aIt = std::cbegin(aCurrentTheme); aIt != std::cend(aCurrentTheme); aIt++)
+ {
+ if (aIt->Name == sName)
+ {
+ aIt->Value >>= nColor;
+ break;
+ }
+ }
+
+ OUString sOpenColorScheme ="<a:" + sName + ">";
+ pFS->write(sOpenColorScheme);
+
+ pFS->singleElementNS(XML_a, XML_srgbClr, XML_val, I32SHEX(nColor));
+
+ OUString sCloseColorScheme = "</a:" + sName + ">";
+ pFS->write(sCloseColorScheme);
+ }
+
+ // TODO: write complete color schemes & only if successful, protection against partial export
+ return true;
+ }
+ }
+ }
+ catch (const uno::Exception&)
+ {
+ SAL_WARN("writerfilter", "Failed to save documents grab bag");
+ }
+
+ return false;
+}
+
+void PowerPointExport::WriteTheme(sal_Int32 nThemeNum, svx::Theme* pTheme)
+{
+ OUString sThemePath = "ppt/theme/theme" + OUString::number(nThemeNum + 1) + ".xml";
+
+ FSHelperPtr pFS = openFragmentStreamWithSerializer(sThemePath,
+ "application/vnd.openxmlformats-officedocument.theme+xml");
+
+ OUString aThemeName("Office Theme");
+ if (pTheme)
+ {
+ aThemeName = pTheme->GetName();
+ }
+ pFS->startElementNS(XML_a, XML_theme,
+ FSNS(XML_xmlns, XML_a), this->getNamespaceURL(OOX_NS(dml)),
+ XML_name, aThemeName);
+
+ pFS->startElementNS(XML_a, XML_themeElements);
+ OUString aColorSchemeName("Office");
+ if (pTheme)
+ {
+ svx::ColorSet* pColorSet = pTheme->GetColorSet();
+ if (pColorSet)
+ {
+ aColorSchemeName = pColorSet->getName();
+ }
+ }
+ pFS->startElementNS(XML_a, XML_clrScheme, XML_name, aColorSchemeName);
+
+ if (!WriteColorSets(pFS, pTheme))
+ {
+ pFS->write(SYS_COLOR_SCHEMES);
+ if (!WriteColorSchemes(pFS, sThemePath))
+ {
+ // if style is not defined, try to use first one
+ if (!WriteColorSchemes(pFS, "ppt/theme/theme1.xml"))
+ {
+ // color schemes are required - use default values
+ WriteDefaultColorSchemes(pFS);
+ }
+ }
+ }
+
+ pFS->endElementNS(XML_a, XML_clrScheme);
+
+ // export remaining part
+ pFS->write(MINIMAL_THEME);
+
+ pFS->endElementNS(XML_a, XML_themeElements);
+ pFS->endElementNS(XML_a, XML_theme);
+}
+
+bool PowerPointExport::ImplCreateDocument()
+{
+ mbCreateNotes = false;
+
+ for (sal_uInt32 i = 0; i < mnPages; i++)
+ {
+ if (!GetPageByIndex(i, NOTICE))
+ return false;
+
+ if (ContainsOtherShapeThanPlaceholders())
+ {
+ mbCreateNotes = true;
+ break;
+ }
+ }
+
+ return true;
+}
+
+void PowerPointExport::WriteNotesMaster()
+{
+ SAL_INFO("sd.eppt", "write Notes master\n---------------");
+
+ mPresentationFS->startElementNS(XML_p, XML_notesMasterIdLst);
+
+ OUString sRelId = addRelation(mPresentationFS->getOutputStream(),
+ oox::getRelationship(Relationship::NOTESMASTER),
+ u"notesMasters/notesMaster1.xml");
+
+ mPresentationFS->singleElementNS(XML_p, XML_notesMasterId,
+ FSNS(XML_r, XML_id), sRelId);
+
+ mPresentationFS->endElementNS(XML_p, XML_notesMasterIdLst);
+
+ FSHelperPtr pFS =
+ openFragmentStreamWithSerializer("ppt/notesMasters/notesMaster1.xml",
+ "application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml");
+ // write theme per master
+ WriteTheme(mnMasterPages, nullptr);
+
+ // add implicit relation to the presentation theme
+ addRelation(pFS->getOutputStream(),
+ oox::getRelationship(Relationship::THEME),
+ OUStringConcatenation("../theme/theme" + OUString::number(mnMasterPages + 1) + ".xml"));
+
+ pFS->startElementNS(XML_p, XML_notesMaster, PNMSS);
+
+ pFS->startElementNS(XML_p, XML_cSld);
+
+ Reference< XPropertySet > aXBackgroundPropSet;
+ if (ImplGetPropertyValue(mXPagePropSet, "Background") &&
+ (mAny >>= aXBackgroundPropSet))
+ ImplWriteBackground(pFS, aXBackgroundPropSet);
+
+ WriteShapeTree(pFS, NOTICE, true);
+
+ pFS->endElementNS(XML_p, XML_cSld);
+
+ // color map - now it uses colors from hardcoded theme, once we eventually generate theme, this might need update
+ pFS->singleElementNS(XML_p, XML_clrMap,
+ XML_bg1, "lt1",
+ XML_bg2, "lt2",
+ XML_tx1, "dk1",
+ XML_tx2, "dk2",
+ XML_accent1, "accent1",
+ XML_accent2, "accent2",
+ XML_accent3, "accent3",
+ XML_accent4, "accent4",
+ XML_accent5, "accent5",
+ XML_accent6, "accent6",
+ XML_hlink, "hlink",
+ XML_folHlink, "folHlink");
+
+ pFS->endElementNS(XML_p, XML_notesMaster);
+
+ SAL_INFO("sd.eppt", "----------------");
+}
+
+void PowerPointExport::embedEffectAudio(const FSHelperPtr& pFS, const OUString& sUrl, OUString& sRelId, OUString& sName)
+{
+ comphelper::LifecycleProxy aProxy;
+
+ if (!sUrl.endsWithIgnoreAsciiCase(".wav"))
+ return;
+
+ uno::Reference<io::XInputStream> xAudioStream;
+ try
+ {
+ if (sUrl.startsWith("vnd.sun.star.Package:"))
+ {
+ uno::Reference<document::XStorageBasedDocument> xStorageBasedDocument(getModel(), uno::UNO_QUERY);
+ if (!xStorageBasedDocument.is())
+ return;
+
+ uno::Reference<embed::XStorage> xDocumentStorage = xStorageBasedDocument->getDocumentStorage();
+ if (!xDocumentStorage.is())
+ return;
+
+ uno::Reference<io::XStream> xStream = comphelper::OStorageHelper::GetStreamAtPackageURL(xDocumentStorage, sUrl,
+ css::embed::ElementModes::READ, aProxy);
+
+ if (xStream.is())
+ xAudioStream = xStream->getInputStream();
+ }
+ else
+ xAudioStream = comphelper::OStorageHelper::GetInputStreamFromURL(sUrl, getComponentContext());
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION("sd", "PowerPointExport::embedEffectAudio");
+ }
+
+ if (!xAudioStream.is())
+ return;
+
+ int nLastSlash = sUrl.lastIndexOf('/');
+ sName = sUrl.copy(nLastSlash >= 0 ? nLastSlash + 1 : 0);
+
+ OUString sPath = "../media/" + sName;
+ sRelId = addRelation(pFS->getOutputStream(),
+ oox::getRelationship(Relationship::AUDIO), sPath);
+
+ uno::Reference<io::XOutputStream> xOutputStream = openFragmentStream(sPath.replaceAt(0, 2, u"/ppt"),
+ "audio/x-wav");
+
+ comphelper::OStorageHelper::CopyInputToOutput(xAudioStream, xOutputStream);
+}
+
+sal_Int32 PowerPointExport::GetShapeID(const Reference<XShape>& rXShape)
+{
+ return ShapeExport::GetShapeID(rXShape, &maShapeMap);
+}
+
+sal_Int32 PowerPointExport::GetNextAnimationNodeID()
+{
+ return mnAnimationNodeIdMax++;
+}
+
+bool PowerPointExport::ImplCreateMainNotes()
+{
+ if (mbCreateNotes)
+ WriteNotesMaster();
+
+ return true;
+}
+
+OUString PowerPointExport::getImplementationName()
+{
+ return "com.sun.star.comp.Impress.oox.PowerPointExport";
+}
+
+void PowerPointExport::WriteDiagram(const FSHelperPtr& pFS, PowerPointShapeExport& rDML, const css::uno::Reference<css::drawing::XShape>& rXShape, int nDiagramId)
+{
+ SAL_INFO("sd.eppt", "writing Diagram " + OUString::number(nDiagramId));
+ pFS->startElementNS(XML_p, XML_graphicFrame);
+ rDML.WriteDiagram(rXShape, nDiagramId);
+ pFS->endElementNS(XML_p, XML_graphicFrame);
+}
+
+void PowerPointExport::WritePlaceholderReferenceShapes(PowerPointShapeExport& rDML, PageType ePageType)
+{
+ bool bCheckProps = ePageType == NORMAL;
+ Reference<XShape> xShape;
+ Any aAny;
+ OUString aText;
+ if (ePageType == LAYOUT
+ || (bCheckProps && PropValue::GetPropertyValue(aAny, mXPagePropSet, "IsFooterVisible", true)
+ && aAny == true && GetPropertyValue(aAny, mXPagePropSet, "FooterText", true)
+ && (aAny >>= aText) && !aText.isEmpty()))
+ {
+ if ((xShape = GetReferencedPlaceholderXShape(Footer, ePageType)))
+ rDML.WritePlaceholderReferenceShape(Footer,
+ maPlaceholderShapeToIndexMap.find(xShape)->second,
+ ePageType, mXPagePropSet);
+ }
+
+ if (ePageType == LAYOUT
+ || (bCheckProps
+ && PropValue::GetPropertyValue(aAny, mXPagePropSet, "IsPageNumberVisible", true)
+ && aAny == true))
+ {
+ if ((xShape = GetReferencedPlaceholderXShape(SlideNumber, ePageType)))
+ rDML.WritePlaceholderReferenceShape(SlideNumber,
+ maPlaceholderShapeToIndexMap.find(xShape)->second,
+ ePageType, mXPagePropSet);
+ }
+
+ if (ePageType == LAYOUT
+ || (bCheckProps
+ && PropValue::GetPropertyValue(aAny, mXPagePropSet, "IsDateTimeVisible", true)
+ && aAny == true
+ && ((GetPropertyValue(aAny, mXPagePropSet, "DateTimeText", true) && (aAny >>= aText)
+ && !aText.isEmpty())
+ || mXPagePropSet->getPropertyValue("IsDateTimeFixed") == false)))
+ {
+ if ((xShape = GetReferencedPlaceholderXShape(DateAndTime, ePageType)))
+ rDML.WritePlaceholderReferenceShape(DateAndTime,
+ maPlaceholderShapeToIndexMap.find(xShape)->second,
+ ePageType, mXPagePropSet);
+ }
+}
+
+sal_Int32 PowerPointExport::CreateNewPlaceholderIndex(const css::uno::Reference<XShape> &rXShape)
+{
+ maPlaceholderShapeToIndexMap.insert({rXShape, mnPlaceholderIndexMax});
+ return mnPlaceholderIndexMax++;
+}
+
+Reference<XShape> PowerPointExport::GetReferencedPlaceholderXShape(const PlaceholderType eType,
+ PageType ePageType) const
+{
+ PresObjKind ePresObjKind = PresObjKind::NONE;
+ switch (eType)
+ {
+ case oox::core::None:
+ break;
+ case oox::core::SlideImage:
+ break;
+ case oox::core::Notes:
+ break;
+ case oox::core::Header:
+ ePresObjKind = PresObjKind::Header;
+ break;
+ case oox::core::Footer:
+ ePresObjKind = PresObjKind::Footer;
+ break;
+ case oox::core::SlideNumber:
+ ePresObjKind = PresObjKind::SlideNumber;
+ break;
+ case oox::core::DateAndTime:
+ ePresObjKind = PresObjKind::DateTime;
+ break;
+ case oox::core::Outliner:
+ break;
+ case oox::core::Title:
+ ePresObjKind = PresObjKind::Title;
+ break;
+ case oox::core::Subtitle:
+ break;
+ }
+ if (ePresObjKind != PresObjKind::NONE)
+ {
+ SdPage* pMasterPage;
+ if (ePageType == LAYOUT)
+ {
+ // since Layout pages do not have drawpages themselves - mXDrawPage is still the master they reference to..
+ pMasterPage = SdPage::getImplementation(mXDrawPage);
+ }
+ else
+ {
+ pMasterPage
+ = &static_cast<SdPage&>(SdPage::getImplementation(mXDrawPage)->TRG_GetMasterPage());
+ }
+ if (SdrObject* pMasterFooter = pMasterPage->GetPresObj(ePresObjKind))
+ return GetXShapeForSdrObject(pMasterFooter);
+ }
+ return nullptr;
+}
+
+// UNO component
+extern "C" SAL_DLLPUBLIC_EXPORT uno::XInterface*
+css_comp_Impress_oox_PowerPointExport(uno::XComponentContext* rxCtxt,
+ uno::Sequence<css::uno::Any> const& rArguments)
+{
+ return cppu::acquire(new PowerPointExport(rxCtxt, rArguments));
+}
+
+#if OSL_DEBUG_LEVEL > 1
+void dump_pset(Reference< XPropertySet > const& rXPropSet)
+{
+ Reference< XPropertySetInfo > info = rXPropSet->getPropertySetInfo();
+ Sequence< beans::Property > props = info->getProperties();
+
+ for (int i=0; i < props.getLength(); i++)
+ {
+ OString name = OUStringToOString(props [i].Name, RTL_TEXTENCODING_UTF8);
+
+ Any value = rXPropSet->getPropertyValue(props [i].Name);
+
+ OUString strValue;
+ sal_Int32 intValue;
+ bool boolValue;
+ RectanglePoint pointValue;
+
+ if (value >>= strValue)
+ SAL_INFO("sd.eppt", name << " = \"" << strValue << "\"");
+ else if (value >>= intValue)
+ SAL_INFO("sd.eppt", name << " = " << intValue << "(hex : " << std::hex << intValue << ")");
+ else if (value >>= boolValue)
+ SAL_INFO("sd.eppt", name << " = " << boolValue << " (bool)");
+ else if (value >>= pointValue)
+ SAL_INFO("sd.eppt", name << " = " << static_cast<int>(pointValue) << " (RectanglePoint)");
+ else
+ SAL_INFO("sd.eppt", "??? <unhandled type>");
+ }
+}
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptx-grouptable.cxx b/sd/source/filter/eppt/pptx-grouptable.cxx
new file mode 100644
index 000000000..bf91f2fb6
--- /dev/null
+++ b/sd/source/filter/eppt/pptx-grouptable.cxx
@@ -0,0 +1,85 @@
+/* -*- 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 "grouptable.hxx"
+
+using ::com::sun::star::container::XIndexAccess;
+
+GroupTable::GroupTable()
+ : mnIndex(0)
+ , mnGroupsClosed(0)
+{
+ mvGroupEntry.reserve(32);
+}
+
+GroupTable::~GroupTable()
+{
+}
+
+bool GroupTable::EnterGroup( css::uno::Reference< css::container::XIndexAccess > const & rXIndexAccessRef )
+{
+ bool bRet = false;
+ if ( rXIndexAccessRef.is() )
+ {
+ GroupEntry aNewGroup( rXIndexAccessRef );
+ if ( aNewGroup.mnCount )
+ {
+ mvGroupEntry.push_back( std::move(aNewGroup) );
+ bRet = true;
+ }
+ }
+ return bRet;
+}
+
+sal_uInt32 GroupTable::GetGroupsClosed()
+{
+ sal_uInt32 nRet = mnGroupsClosed;
+ mnGroupsClosed = 0;
+ return nRet;
+}
+
+void GroupTable::ClearGroupTable()
+{
+ mvGroupEntry.clear();
+}
+
+void GroupTable::ResetGroupTable( sal_uInt32 nCount )
+{
+ ClearGroupTable();
+ mvGroupEntry.push_back( GroupEntry( nCount ) );
+}
+
+bool GroupTable::GetNextGroupEntry()
+{
+ while ( !mvGroupEntry.empty() )
+ {
+ mnIndex = mvGroupEntry.back().mnCurrentPos++;
+
+ if ( mvGroupEntry.back().mnCount > mnIndex )
+ return true;
+
+ mvGroupEntry.pop_back();
+
+ if ( !mvGroupEntry.empty() )
+ mnGroupsClosed++;
+ }
+ return false;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptx-stylesheet.cxx b/sd/source/filter/eppt/pptx-stylesheet.cxx
new file mode 100644
index 000000000..459020278
--- /dev/null
+++ b/sd/source/filter/eppt/pptx-stylesheet.cxx
@@ -0,0 +1,489 @@
+/* -*- 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 "epptbase.hxx"
+#include "epptdef.hxx"
+#include "text.hxx"
+#include <tools/color.hxx>
+#include <tools/UnitConversion.hxx>
+#include <editeng/svxenum.hxx>
+#include <com/sun/star/beans/XPropertySet.hpp>
+
+using namespace ::com::sun::star;
+
+PPTExCharSheet::PPTExCharSheet( int nInstance )
+{
+ sal_uInt16 nFontHeight = 24;
+
+ for ( int nDepth = 0; nDepth < 5; nDepth++ )
+ {
+ PPTExCharLevel& rLev = maCharLevel[ nDepth ];
+ switch ( nInstance )
+ {
+ case EPP_TEXTTYPE_Title :
+ case EPP_TEXTTYPE_CenterTitle :
+ nFontHeight = 44;
+ break;
+ case EPP_TEXTTYPE_Body :
+ case EPP_TEXTTYPE_CenterBody :
+ case EPP_TEXTTYPE_HalfBody :
+ case EPP_TEXTTYPE_QuarterBody :
+ {
+ switch ( nDepth )
+ {
+ case 0 : nFontHeight = 32; break;
+ case 1 : nFontHeight = 28; break;
+ case 2 : nFontHeight = 24; break;
+ default :nFontHeight = 20; break;
+ }
+ }
+ break;
+ case EPP_TEXTTYPE_Notes :
+ nFontHeight = 12;
+ break;
+ case EPP_TEXTTYPE_notUsed :
+ case EPP_TEXTTYPE_Other :
+ nFontHeight = 24;
+ break;
+ }
+ rLev.mnFlags = 0;
+ rLev.mnFont = 0;
+ rLev.mnAsianOrComplexFont = 0xffff;
+ rLev.mnFontHeight = nFontHeight;
+ rLev.mnFontColor = 0;
+ rLev.mnEscapement = 0;
+ }
+}
+
+void PPTExCharSheet::SetStyleSheet( const css::uno::Reference< css::beans::XPropertySet > & rXPropSet,
+ FontCollection& rFontCollection, int nLevel )
+{
+ PortionObj aPortionObj( rXPropSet, rFontCollection );
+
+ PPTExCharLevel& rLev = maCharLevel[ nLevel ];
+
+ if ( aPortionObj.meCharColor == css::beans::PropertyState_DIRECT_VALUE )
+ rLev.mnFontColor = Color(ColorTransparency, aPortionObj.mnCharColor);
+ if ( aPortionObj.meCharEscapement == css::beans::PropertyState_DIRECT_VALUE )
+ rLev.mnEscapement = aPortionObj.mnCharEscapement;
+ if ( aPortionObj.meCharHeight == css::beans::PropertyState_DIRECT_VALUE )
+ rLev.mnFontHeight = aPortionObj.mnCharHeight;
+ if ( aPortionObj.meFontName == css::beans::PropertyState_DIRECT_VALUE )
+ rLev.mnFont = aPortionObj.mnFont;
+ if ( aPortionObj.meAsianOrComplexFont == css::beans::PropertyState_DIRECT_VALUE )
+ rLev.mnAsianOrComplexFont = aPortionObj.mnAsianOrComplexFont;
+ rLev.mnFlags = aPortionObj.mnCharAttr;
+}
+
+void PPTExCharSheet::Write( SvStream& rSt, sal_uInt16 nLev, bool bSimpleText,
+ const css::uno::Reference< css::beans::XPropertySet > & rPagePropSet )
+{
+ const PPTExCharLevel& rLev = maCharLevel[ nLev ];
+
+ sal_uInt32 nCharFlags = 0xefffff;
+ if ( bSimpleText )
+ nCharFlags = 0x7ffff;
+
+ rSt.WriteUInt32( nCharFlags )
+ .WriteUInt16( rLev.mnFlags )
+ .WriteUInt16( rLev.mnFont );
+
+ Color nFontColor = rLev.mnFontColor;
+ if ( nFontColor == COL_AUTO )
+ {
+ bool bIsDark = false;
+ css::uno::Any aAny;
+ if ( PropValue::GetPropertyValue( aAny, rPagePropSet, "IsBackgroundDark", true ) )
+ aAny >>= bIsDark;
+ nFontColor = Color(ColorTransparency, bIsDark ? 0xffffff : 0x000000);
+ }
+ nFontColor.SetAlpha(1);
+ if ( bSimpleText )
+ {
+ rSt.WriteUInt16( rLev.mnFontHeight )
+ .WriteUInt32( sal_uInt32(nFontColor) );
+ }
+ else
+ {
+ rSt.WriteUInt16( rLev.mnAsianOrComplexFont )
+ .WriteUInt16( 0xffff ) // unknown
+ .WriteUInt16( 0xffff ) // unknown
+ .WriteUInt16( rLev.mnFontHeight )
+ .WriteUInt32( sal_uInt32(nFontColor) )
+ .WriteUInt16( rLev.mnEscapement );
+ }
+}
+
+PPTExParaSheet::PPTExParaSheet( int nInstance, sal_uInt16 nDefaultTab, PPTExBulletProvider* pProv ) :
+ pBuProv ( pProv ),
+ mnInstance ( nInstance )
+{
+ bool bHasBullet = false;
+
+ sal_uInt16 nUpperDist = 0;
+ sal_uInt16 nBulletChar = 0x2022;
+ sal_uInt16 nBulletOfs = 0;
+ sal_uInt16 nTextOfs = 0;
+
+ for ( int nDepth = 0; nDepth < 5; nDepth++ )
+ {
+ PPTExParaLevel& rLev = maParaLevel[ nDepth ];
+ switch ( nInstance )
+ {
+ case EPP_TEXTTYPE_Title :
+ case EPP_TEXTTYPE_CenterTitle :
+ break;
+ case EPP_TEXTTYPE_Body :
+ case EPP_TEXTTYPE_CenterBody :
+ case EPP_TEXTTYPE_HalfBody :
+ case EPP_TEXTTYPE_QuarterBody :
+ {
+ bHasBullet = true;
+ nUpperDist = 0x14;
+ }
+ break;
+ case EPP_TEXTTYPE_Notes :
+ nUpperDist = 0x1e;
+ break;
+
+ }
+ switch ( nDepth )
+ {
+ case 0 :
+ {
+ nBulletChar = 0x2022;
+ nBulletOfs = 0;
+ nTextOfs = bHasBullet ? 0xd8 : 0;
+ }
+ break;
+ case 1 :
+ {
+ nBulletChar = 0x2013;
+ nBulletOfs = 0x120;
+ nTextOfs = 0x1d4;
+ }
+ break;
+ case 2 :
+ {
+ nBulletChar = 0x2022;
+ nBulletOfs = 0x240;
+ nTextOfs = 0x2d0;
+ }
+ break;
+ case 3 :
+ {
+ nBulletChar = 0x2013;
+ nBulletOfs = 0x360;
+ nTextOfs = 0x3f0;
+ }
+ break;
+ case 4 :
+ {
+ nBulletChar = 0xbb;
+ nBulletOfs = 0x480;
+ nTextOfs = 0x510;
+ }
+ break;
+ }
+ rLev.mbIsBullet = bHasBullet;
+ rLev.mnBulletChar = nBulletChar;
+ rLev.mnBulletFont = 0;
+ rLev.mnBulletHeight = 100;
+ rLev.mnBulletColor = 0;
+ rLev.mnAdjust = 0;
+ rLev.mnLineFeed = 100;
+ rLev.mnLowerDist = 0;
+ rLev.mnUpperDist = nUpperDist;
+ rLev.mnTextOfs = nTextOfs;
+ rLev.mnBulletOfs = nBulletOfs;
+ rLev.mnDefaultTab = nDefaultTab;
+ rLev.mnAsianSettings = 2;
+ rLev.mnBiDi = 0;
+
+ rLev.mbExtendedBulletsUsed = false;
+ rLev.mnBulletId = 0xffff;
+ rLev.mnBulletStart = 0;
+ rLev.mnMappedNumType = 0;
+ rLev.mnNumberingType = 0;
+ }
+}
+
+void PPTExParaSheet::SetStyleSheet( const css::uno::Reference< css::beans::XPropertySet > & rXPropSet,
+ FontCollection& rFontCollection, int nLevel, const PPTExCharLevel& rCharLevel )
+{
+ ParagraphObj aParagraphObj( rXPropSet, pBuProv );
+ aParagraphObj.CalculateGraphicBulletSize( rCharLevel.mnFontHeight );
+ PPTExParaLevel& rLev = maParaLevel[ nLevel ];
+
+ if ( aParagraphObj.meTextAdjust == css::beans::PropertyState_DIRECT_VALUE )
+ rLev.mnAdjust = aParagraphObj.mnTextAdjust;
+ if ( aParagraphObj.meLineSpacing == css::beans::PropertyState_DIRECT_VALUE )
+ {
+ sal_Int16 nLineSpacing = aParagraphObj.mnLineSpacing;
+ if ( nLineSpacing > 0 ) // if nLinespacing is < 0 the linespacing is an absolute spacing
+ {
+ bool bFixedLineSpacing = false;
+ uno::Any aAny = rXPropSet->getPropertyValue("FontIndependentLineSpacing");
+ if( !(aAny >>= bFixedLineSpacing) || !bFixedLineSpacing )
+ {
+ const FontCollectionEntry* pDesc = rFontCollection.GetById( rCharLevel.mnFont );
+ if ( pDesc )
+ nLineSpacing = static_cast<sal_Int16>( static_cast<double>(nLineSpacing) * pDesc->Scaling + 0.5 );
+ }
+ }
+ else
+ {
+ if ( rCharLevel.mnFontHeight > static_cast<sal_uInt16>( static_cast<double>(-nLineSpacing) * 0.001 * 72.0 / 2.54 ) ) // 1/100mm to point
+ {
+ const FontCollectionEntry* pDesc = rFontCollection.GetById( rCharLevel.mnFont );
+ if ( pDesc )
+ nLineSpacing = static_cast<sal_Int16>( 100.0 * pDesc->Scaling + 0.5 );
+ else
+ nLineSpacing = 100;
+ }
+ else
+ nLineSpacing = static_cast<sal_Int16>(convertMm100ToMasterUnit(nLineSpacing));
+ }
+ rLev.mnLineFeed = nLineSpacing;
+ }
+ if ( aParagraphObj.meLineSpacingBottom == css::beans::PropertyState_DIRECT_VALUE )
+ rLev.mnLowerDist = aParagraphObj.mnLineSpacingBottom;
+ if ( aParagraphObj.meLineSpacingTop == css::beans::PropertyState_DIRECT_VALUE )
+ rLev.mnUpperDist = aParagraphObj.mnLineSpacingTop;
+ if ( aParagraphObj.meForbiddenRules == css::beans::PropertyState_DIRECT_VALUE )
+ {
+ rLev.mnAsianSettings &=~1;
+ if ( aParagraphObj.mbForbiddenRules )
+ rLev.mnAsianSettings |= 1;
+ }
+ if ( aParagraphObj.meParagraphPunctation == css::beans::PropertyState_DIRECT_VALUE )
+ {
+ rLev.mnAsianSettings &=~4;
+ if ( aParagraphObj.mbParagraphPunctation )
+ rLev.mnAsianSettings |= 4;
+ }
+
+ if ( aParagraphObj.meBiDi == css::beans::PropertyState_DIRECT_VALUE )
+ rLev.mnBiDi = aParagraphObj.mnBiDi;
+
+ rLev.mbIsBullet = aParagraphObj.mbIsBullet; //( ( aParagraphObj.nBulletFlags & 1 ) != 0 );
+
+ if ( nLevel )
+ return;
+
+ if (!(aParagraphObj.bExtendedParameters &&
+ aParagraphObj.meBullet == css::beans::PropertyState_DIRECT_VALUE))
+ return;
+
+ for ( sal_Int16 i = 0; i < 5; i++ )
+ {
+ PPTExParaLevel& rLevel = maParaLevel[ i ];
+ if ( i )
+ aParagraphObj.ImplGetNumberingLevel( pBuProv, i, false, false );
+ rLevel.mnTextOfs = aParagraphObj.nTextOfs;
+ rLevel.mnBulletOfs = static_cast<sal_uInt16>(aParagraphObj.nBulletOfs);
+ rLevel.mnBulletChar = aParagraphObj.cBulletId;
+ FontCollectionEntry aFontDescEntry( aParagraphObj.aFontDesc.Name, aParagraphObj.aFontDesc.Family,
+ aParagraphObj.aFontDesc.Pitch, aParagraphObj.aFontDesc.CharSet );
+ rLevel.mnBulletFont = static_cast<sal_uInt16>(rFontCollection.GetId( aFontDescEntry ));
+ rLevel.mnBulletHeight = aParagraphObj.nBulletRealSize;
+ rLevel.mnBulletColor = aParagraphObj.nBulletColor;
+
+ rLevel.mbExtendedBulletsUsed = aParagraphObj.bExtendedBulletsUsed;
+ rLevel.mnBulletId = aParagraphObj.nBulletId;
+ rLevel.mnNumberingType = aParagraphObj.nNumberingType;
+ rLevel.mnBulletStart = aParagraphObj.nStartWith;
+ rLevel.mnMappedNumType = aParagraphObj.nMappedNumType;
+ }
+}
+
+void PPTExParaSheet::Write( SvStream& rSt, sal_uInt16 nLev, bool bSimpleText,
+ const css::uno::Reference< css::beans::XPropertySet > & rPagePropSet )
+{
+ const PPTExParaLevel& rLev = maParaLevel[ nLev ];
+
+ if ( maParaLevel[ 0 ].mbExtendedBulletsUsed || maParaLevel[ 1 ].mbExtendedBulletsUsed ||
+ maParaLevel[ 2 ].mbExtendedBulletsUsed || maParaLevel[ 3 ].mbExtendedBulletsUsed ||
+ maParaLevel[ 4 ].mbExtendedBulletsUsed )
+ {
+ SvStream& rOut = pBuProv->aBuExMasterStream;
+ if ( !nLev )
+ {
+ rOut.WriteUInt32( ( EPP_PST_ExtendedParagraphMasterAtom << 16 ) | ( mnInstance << 4 ) )
+ .WriteUInt32( 5 * 16 + 2 )
+ .WriteUInt16( 5 ); // depth
+ }
+ sal_uInt16 nBulletId = rLev.mnBulletId;
+ if ( rLev.mnNumberingType != SVX_NUM_BITMAP )
+ nBulletId = 0xffff;
+ rOut.WriteUInt32( 0x03800000 )
+ .WriteUInt16( nBulletId )
+ .WriteUInt32( rLev.mnMappedNumType )
+ .WriteUInt16( rLev.mnBulletStart )
+ .WriteUInt32( 0 );
+ }
+
+ sal_uInt32 nParaFlags = 0x3ffdff;
+ sal_uInt16 nBulletFlags = ( rLev.mbIsBullet ) ? 0xf : 0xe;
+
+ if ( nLev )
+ nParaFlags &= 0x207fff;
+ if ( bSimpleText )
+ nParaFlags &= 0x7fff;
+ sal_uInt32 nBulletColor = rLev.mnBulletColor;
+ if ( nBulletColor == sal_uInt32(COL_AUTO) )
+ {
+ bool bIsDark = false;
+ css::uno::Any aAny;
+ if ( PropValue::GetPropertyValue( aAny, rPagePropSet, "IsBackgroundDark", true ) )
+ aAny >>= bIsDark;
+ nBulletColor = bIsDark ? 0xffffff : 0x000000;
+ }
+ nBulletColor &= 0xffffff;
+ nBulletColor |= 0xfe000000;
+ rSt.WriteUInt32( nParaFlags )
+ .WriteUInt16( nBulletFlags )
+ .WriteUInt16( rLev.mnBulletChar )
+ .WriteUInt16( rLev.mnBulletFont )
+ .WriteUInt16( rLev.mnBulletHeight )
+ .WriteUInt32( nBulletColor )
+ .WriteUInt16( rLev.mnAdjust )
+ .WriteUInt16( rLev.mnLineFeed )
+ .WriteUInt16( rLev.mnUpperDist )
+ .WriteUInt16( rLev.mnLowerDist )
+ .WriteUInt16( rLev.mnTextOfs )
+ .WriteUInt16( rLev.mnBulletOfs );
+
+ if ( bSimpleText || nLev )
+ {
+ if ( nParaFlags & 0x200000 )
+ rSt.WriteUInt16( rLev.mnBiDi );
+ }
+ else
+ {
+ rSt.WriteUInt16( rLev.mnDefaultTab )
+ .WriteUInt16( 0 )
+ .WriteUInt16( 0 )
+ .WriteUInt16( rLev.mnAsianSettings )
+ .WriteUInt16( rLev.mnBiDi );
+ }
+}
+
+PPTExStyleSheet::PPTExStyleSheet( sal_uInt16 nDefaultTab, PPTExBulletProvider* pBuProv )
+{
+ for ( int nInstance = EPP_TEXTTYPE_Title; nInstance <= EPP_TEXTTYPE_QuarterBody; nInstance++ )
+ {
+ if (nInstance != EPP_TEXTTYPE_notUsed)
+ {
+ mpParaSheet[ nInstance ].reset(new PPTExParaSheet( nInstance, nDefaultTab, pBuProv ));
+ mpCharSheet[ nInstance ].reset(new PPTExCharSheet( nInstance ));
+ }
+ }
+}
+
+PPTExStyleSheet::~PPTExStyleSheet()
+{
+}
+
+void PPTExStyleSheet::SetStyleSheet( const css::uno::Reference< css::beans::XPropertySet > & rXPropSet,
+ FontCollection& rFontCollection, int nInstance, int nLevel )
+{
+ if ( nInstance == EPP_TEXTTYPE_notUsed )
+ return;
+ mpCharSheet[ nInstance ]->SetStyleSheet( rXPropSet, rFontCollection, nLevel );
+ mpParaSheet[ nInstance ]->SetStyleSheet( rXPropSet, rFontCollection, nLevel, mpCharSheet[ nInstance ]->maCharLevel[ nLevel ] );
+}
+
+bool PPTExStyleSheet::IsHardAttribute( sal_uInt32 nInstance, sal_uInt32 nLevel, PPTExTextAttr eAttr, sal_uInt32 nValue )
+{
+ assert(nInstance < PPTEX_STYLESHEETENTRIES && nLevel < 5);
+
+ const PPTExParaLevel& rPara = mpParaSheet[ nInstance ]->maParaLevel[ nLevel ];
+ const PPTExCharLevel& rChar = mpCharSheet[ nInstance ]->maCharLevel[ nLevel ];
+
+ sal_uInt32 nFlag = 0;
+
+ switch ( eAttr )
+ {
+ case ParaAttr_BulletOn : return ( rPara.mbIsBullet ) ? nValue == 0 : nValue != 0;
+ case ParaAttr_BuHardFont :
+ case ParaAttr_BulletFont : return ( rPara.mnBulletFont != nValue );
+ case ParaAttr_BuHardColor :
+ case ParaAttr_BulletColor : return ( rPara.mnBulletColor != nValue );
+ case ParaAttr_BuHardHeight :
+ case ParaAttr_BulletHeight : return ( rPara.mnBulletHeight != nValue );
+ case ParaAttr_BulletChar : return ( rPara.mnBulletChar != nValue );
+ case ParaAttr_Adjust : return ( rPara.mnAdjust != nValue );
+ case ParaAttr_LineFeed : return ( rPara.mnLineFeed != nValue );
+ case ParaAttr_UpperDist : return ( rPara.mnUpperDist != nValue );
+ case ParaAttr_LowerDist : return ( rPara.mnLowerDist != nValue );
+ case ParaAttr_TextOfs : return ( rPara.mnTextOfs != nValue );
+ case ParaAttr_BulletOfs : return ( rPara.mnBulletOfs != nValue );
+ case ParaAttr_DefaultTab : return ( rPara.mnDefaultTab != nValue );
+ case ParaAttr_BiDi : return ( rPara.mnBiDi != nValue );
+ case CharAttr_Bold : nFlag = 1; break;
+ case CharAttr_Italic : nFlag = 2; break;
+ case CharAttr_Underline : nFlag = 4; break;
+ case CharAttr_Shadow : nFlag = 16; break;
+ case CharAttr_Strikeout : nFlag = 256; break;
+ case CharAttr_Embossed : nFlag = 512; break;
+ case CharAttr_Font : return ( rChar.mnFont != nValue );
+ case CharAttr_AsianOrComplexFont : return ( rChar.mnAsianOrComplexFont != nValue );
+ case CharAttr_Symbol : return true;
+ case CharAttr_FontHeight : return ( rChar.mnFontHeight != nValue );
+ case CharAttr_FontColor : return ( rChar.mnFontColor != Color(ColorTransparency, nValue) );
+ case CharAttr_Escapement : return ( rChar.mnEscapement != nValue );
+ default:
+ break;
+ }
+ if ( nFlag )
+ {
+ if ( rChar.mnFlags & nFlag )
+ return ( ( nValue & nFlag ) == 0 );
+ else
+ return ( ( nValue & nFlag ) != 0 );
+ }
+ return true;
+}
+
+// the TxCFStyleAtom stores the text properties that are used
+// when creating new objects in PowerPoint.
+
+void PPTExStyleSheet::WriteTxCFStyleAtom( SvStream& rSt )
+{
+ const PPTExCharLevel& rCharStyle = mpCharSheet[ EPP_TEXTTYPE_Other ]->maCharLevel[ 0 ];
+
+ sal_uInt16 const nFlags = 0x60 // ??
+ | 0x02 // fontsize;
+ | 0x04; // fontcolor
+
+ sal_uInt32 nCharFlags = rCharStyle.mnFlags;
+ nCharFlags &= CharAttr_Italic | CharAttr_Bold | CharAttr_Underline | CharAttr_Shadow;
+
+ rSt.WriteUInt32( EPP_TxCFStyleAtom << 16 ) // recordheader
+ .WriteUInt32( SizeOfTxCFStyleAtom() - 8 )
+ .WriteUInt16( 0x80 | nCharFlags )
+ .WriteUInt16( nFlags )
+ .WriteUInt16( nCharFlags )
+ .WriteInt32( -1 ) // ?
+ .WriteUInt16( rCharStyle.mnFontHeight )
+ .WriteUInt32( sal_uInt32(rCharStyle.mnFontColor) );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptx-text.cxx b/sd/source/filter/eppt/pptx-text.cxx
new file mode 100644
index 000000000..85c37f77d
--- /dev/null
+++ b/sd/source/filter/eppt/pptx-text.cxx
@@ -0,0 +1,1400 @@
+/* -*- 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 <memory>
+#include "text.hxx"
+
+#include <com/sun/star/awt/CharSet.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
+#include <com/sun/star/awt/FontUnderline.hpp>
+#include <com/sun/star/awt/XBitmap.hpp>
+#include <com/sun/star/beans/XPropertyState.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/container/XIndexReplace.hpp>
+#include <com/sun/star/i18n/BreakIterator.hpp>
+#include <com/sun/star/i18n/ScriptDirection.hpp>
+#include <com/sun/star/i18n/ScriptType.hpp>
+#include <com/sun/star/text/FontRelief.hpp>
+#include <com/sun/star/text/XTextField.hpp>
+#include <com/sun/star/text/XTextRange.hpp>
+#include <com/sun/star/style/LineSpacing.hpp>
+#include <com/sun/star/style/LineSpacingMode.hpp>
+#include <com/sun/star/style/ParagraphAdjust.hpp>
+#include <com/sun/star/style/TabStop.hpp>
+#include <com/sun/star/graphic/XGraphic.hpp>
+
+#include <comphelper/processfactory.hxx>
+#include <editeng/svxenum.hxx>
+#include <editeng/frmdir.hxx>
+#include <filter/msfilter/util.hxx>
+#include <i18nutil/scripttypedetector.hxx>
+#include <o3tl/any.hxx>
+#include <svl/languageoptions.hxx>
+#include <osl/diagnose.h>
+#include <i18nlangtag/languagetag.hxx>
+#include <tools/UnitConversion.hxx>
+
+#include <vcl/settings.hxx>
+#include <vcl/metric.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/svapp.hxx>
+
+using namespace css;
+
+static css::uno::Reference< css::i18n::XBreakIterator > xPPTBreakIter;
+
+PortionObj::PortionObj(const css::uno::Reference< css::beans::XPropertySet > & rXPropSet,
+ FontCollection& rFontCollection)
+ : meCharColor(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meCharHeight(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meFontName(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meAsianOrComplexFont(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meCharEscapement(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , mnCharAttrHard(0)
+ , mnCharColor(0)
+ , mnCharAttr(0)
+ , mnFont(0)
+ , mnAsianOrComplexFont(0xffff)
+ , mnTextSize(0)
+ , mbLastPortion(true)
+{
+ mXPropSet = rXPropSet;
+
+ ImplGetPortionValues( rFontCollection, false );
+}
+
+PortionObj::PortionObj(css::uno::Reference< css::text::XTextRange > & rXTextRange,
+ bool bLast, FontCollection& rFontCollection)
+ : meCharColor(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meCharHeight(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meFontName(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meAsianOrComplexFont(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meCharEscapement(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , mnCharAttrHard(0)
+ , mnCharColor(0)
+ , mnCharAttr(0)
+ , mnCharHeight(0)
+ , mnFont(0)
+ , mnAsianOrComplexFont(0xffff)
+ , mnCharEscapement(0)
+ , mbLastPortion(bLast)
+{
+ OUString aString( rXTextRange->getString() );
+ OUString aURL;
+
+ mnTextSize = aString.getLength();
+ if ( bLast )
+ mnTextSize++;
+
+ if ( !mnTextSize )
+ return;
+
+ bool bRTL_endingParen = false;
+ mpFieldEntry = nullptr;
+ sal_uInt32 nFieldType = 0;
+
+ mXPropSet.set( rXTextRange, css::uno::UNO_QUERY );
+ mXPropState.set( rXTextRange, css::uno::UNO_QUERY );
+
+ bool bPropSetsValid = ( mXPropSet.is() && mXPropState.is() );
+ if ( bPropSetsValid )
+ nFieldType = ImplGetTextField( rXTextRange, mXPropSet, aURL );
+ if ( nFieldType )
+ {
+ mpFieldEntry.reset( new FieldEntry( nFieldType, 0, mnTextSize ) );
+ if ( nFieldType >> 28 == 4 )
+ {
+ mpFieldEntry->aRepresentation = aString;
+ mpFieldEntry->aFieldUrl = aURL;
+ }
+ }
+ bool bSymbol = false;
+
+ if ( bPropSetsValid && ImplGetPropertyValue( "CharFontCharSet", false ) )
+ {
+ sal_Int16 nCharset = 0;
+ mAny >>= nCharset;
+ if ( nCharset == css::awt::CharSet::SYMBOL )
+ bSymbol = true;
+ }
+ if ( mpFieldEntry && ( nFieldType & 0x800000 ) ) // placeholder ?
+ {
+ mnTextSize = 1;
+ if ( bLast )
+ mnTextSize++;
+ mpText.reset( new sal_uInt16[ mnTextSize ] );
+ mpText[ 0 ] = 0x2a;
+ }
+ else
+ {
+ // For i39516 - a closing parenthesis that ends an RTL string is displayed backwards by PPT
+ // Solution: add a Unicode Right-to-Left Mark, following the method described in i18024
+ if (bLast && !aString.isEmpty()
+ && aString[aString.getLength() - 1] == ')'
+ && FontCollection::GetScriptDirection(aString) == css::i18n::ScriptDirection::RIGHT_TO_LEFT)
+ {
+ mnTextSize++;
+ bRTL_endingParen = true;
+ }
+ mpText.reset( new sal_uInt16[ mnTextSize ] );
+ sal_uInt16 nChar;
+ for ( sal_Int32 i = 0; i < aString.getLength(); i++ )
+ {
+ nChar = static_cast<sal_uInt16>(aString[ i ]);
+ if ( nChar == 0xa )
+ nChar++;
+ else if ( !bSymbol )
+ {
+ switch ( nChar )
+ {
+ // Currency
+ case 128: nChar = 0x20AC; break;
+ // Punctuation and other
+ case 130: nChar = 0x201A; break;// SINGLE LOW-9 QUOTATION MARK
+ case 131: nChar = 0x0192; break;// LATIN SMALL LETTER F WITH HOOK
+ case 132: nChar = 0x201E; break;// DOUBLE LOW-9 QUOTATION MARK
+ // LOW DOUBLE PRIME QUOTATION MARK
+ case 133: nChar = 0x2026; break;// HORIZONTAL ELLIPSES
+ case 134: nChar = 0x2020; break;// DAGGER
+ case 135: nChar = 0x2021; break;// DOUBLE DAGGER
+ case 136: nChar = 0x02C6; break;// MODIFIER LETTER CIRCUMFLEX ACCENT
+ case 137: nChar = 0x2030; break;// PER MILLE SIGN
+ case 138: nChar = 0x0160; break;// LATIN CAPITAL LETTER S WITH CARON
+ case 139: nChar = 0x2039; break;// SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ case 140: nChar = 0x0152; break;// LATIN CAPITAL LIGATURE OE
+ case 142: nChar = 0x017D; break;// LATIN CAPITAL LETTER Z WITH CARON
+ case 145: nChar = 0x2018; break;// LEFT SINGLE QUOTATION MARK
+ // MODIFIER LETTER TURNED COMMA
+ case 146: nChar = 0x2019; break;// RIGHT SINGLE QUOTATION MARK
+ // MODIFIER LETTER APOSTROPHE
+ case 147: nChar = 0x201C; break;// LEFT DOUBLE QUOTATION MARK
+ // REVERSED DOUBLE PRIME QUOTATION MARK
+ case 148: nChar = 0x201D; break;// RIGHT DOUBLE QUOTATION MARK
+ // REVERSED DOUBLE PRIME QUOTATION MARK
+ case 149: nChar = 0x2022; break;// BULLET
+ case 150: nChar = 0x2013; break;// EN DASH
+ case 151: nChar = 0x2014; break;// EM DASH
+ case 152: nChar = 0x02DC; break;// SMALL TILDE
+ case 153: nChar = 0x2122; break;// TRADE MARK SIGN
+ case 154: nChar = 0x0161; break;// LATIN SMALL LETTER S WITH CARON
+ case 155: nChar = 0x203A; break;// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ case 156: nChar = 0x0153; break;// LATIN SMALL LIGATURE OE
+ case 158: nChar = 0x017E; break;// LATIN SMALL LETTER Z WITH CARON
+ case 159: nChar = 0x0178; break;// LATIN CAPITAL LETTER Y WITH DIAERESIS
+ }
+ }
+ mpText[ i ] = nChar;
+ }
+ }
+ if ( bRTL_endingParen )
+ mpText[ mnTextSize - 2 ] = 0x200F; // Unicode Right-to-Left mark
+
+ if ( bLast )
+ mpText[ mnTextSize - 1 ] = 0xd;
+
+ if ( bPropSetsValid )
+ ImplGetPortionValues( rFontCollection, true );
+}
+
+PortionObj::PortionObj( const PortionObj& rPortionObj )
+: PropStateValue( rPortionObj )
+{
+ ImplConstruct( rPortionObj );
+}
+
+PortionObj::~PortionObj()
+{
+ ImplClear();
+}
+
+void PortionObj::Write( SvStream* pStrm, bool bLast )
+{
+ sal_uInt32 nCount = mnTextSize;
+ if ( bLast && mbLastPortion )
+ nCount--;
+ for ( sal_uInt32 i = 0; i < nCount; i++ )
+ pStrm->WriteUInt16( mpText[ i ] );
+}
+
+void PortionObj::ImplGetPortionValues( FontCollection& rFontCollection, bool bGetPropStateValue )
+{
+
+ bool bOk = ImplGetPropertyValue( "CharFontName", bGetPropStateValue );
+ meFontName = ePropState;
+ if ( bOk )
+ {
+ FontCollectionEntry aFontDesc( *o3tl::doAccess<OUString>(mAny) );
+ sal_uInt32 nCount = rFontCollection.GetCount();
+ mnFont = static_cast<sal_uInt16>(rFontCollection.GetId( aFontDesc ));
+ if ( mnFont == nCount )
+ {
+ FontCollectionEntry& rFontDesc = rFontCollection.GetLast();
+ if ( ImplGetPropertyValue( "CharFontCharSet", false ) )
+ mAny >>= rFontDesc.CharSet;
+ if ( ImplGetPropertyValue( "CharFontFamily", false ) )
+ mAny >>= rFontDesc.Family;
+ if ( ImplGetPropertyValue( "CharFontPitch", false ) )
+ mAny >>= rFontDesc.Pitch;
+ }
+ }
+
+ sal_Int16 nScriptType = SvtLanguageOptions::FromSvtScriptTypeToI18N( SvtLanguageOptions::GetScriptTypeOfLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() ) );
+ if ( mpText && mnTextSize && xPPTBreakIter.is() )
+ {
+ OUString sT( reinterpret_cast<sal_Unicode *>(mpText.get()), mnTextSize );
+ nScriptType = xPPTBreakIter->getScriptType( sT, 0 );
+ }
+ if ( nScriptType != css::i18n::ScriptType::COMPLEX )
+ {
+ bOk = ImplGetPropertyValue( "CharFontNameAsian", bGetPropStateValue );
+ meAsianOrComplexFont = ePropState;
+ if ( bOk )
+ {
+ FontCollectionEntry aFontDesc( *o3tl::doAccess<OUString>(mAny) );
+ sal_uInt32 nCount = rFontCollection.GetCount();
+ mnAsianOrComplexFont = static_cast<sal_uInt16>(rFontCollection.GetId( aFontDesc ));
+ if ( mnAsianOrComplexFont == nCount )
+ {
+ FontCollectionEntry& rFontDesc = rFontCollection.GetLast();
+ if ( ImplGetPropertyValue( "CharFontCharSetAsian", false ) )
+ mAny >>= rFontDesc.CharSet;
+ if ( ImplGetPropertyValue( "CharFontFamilyAsian", false ) )
+ mAny >>= rFontDesc.Family;
+ if ( ImplGetPropertyValue( "CharFontPitchAsian", false ) )
+ mAny >>= rFontDesc.Pitch;
+ }
+ }
+ }
+ else
+ {
+ bOk = ImplGetPropertyValue( "CharFontNameComplex", bGetPropStateValue );
+ meAsianOrComplexFont = ePropState;
+ if ( bOk )
+ {
+ FontCollectionEntry aFontDesc( *o3tl::doAccess<OUString>(mAny) );
+ sal_uInt32 nCount = rFontCollection.GetCount();
+ mnAsianOrComplexFont = static_cast<sal_uInt16>(rFontCollection.GetId( aFontDesc ));
+ if ( mnAsianOrComplexFont == nCount )
+ {
+ FontCollectionEntry& rFontDesc = rFontCollection.GetLast();
+ if ( ImplGetPropertyValue( "CharFontCharSetComplex", false ) )
+ mAny >>= rFontDesc.CharSet;
+ if ( ImplGetPropertyValue( "CharFontFamilyComplex", false ) )
+ mAny >>= rFontDesc.Family;
+ if ( ImplGetPropertyValue( "CharFontPitchComplex", false ) )
+ mAny >>= rFontDesc.Pitch;
+ }
+ }
+ }
+
+ OUString aCharHeightName, aCharWeightName, aCharLocaleName, aCharPostureName;
+ switch( nScriptType )
+ {
+ case css::i18n::ScriptType::ASIAN :
+ {
+ aCharHeightName = "CharHeightAsian";
+ aCharWeightName = "CharWeightAsian";
+ aCharLocaleName = "CharLocaleAsian";
+ aCharPostureName = "CharPostureAsian";
+ break;
+ }
+ case css::i18n::ScriptType::COMPLEX :
+ {
+ aCharHeightName = "CharHeightComplex";
+ aCharWeightName = "CharWeightComplex";
+ aCharLocaleName = "CharLocaleComplex";
+ aCharPostureName = "CharPostureComplex";
+ break;
+ }
+ default:
+ {
+ aCharHeightName = "CharHeight";
+ aCharWeightName = "CharWeight";
+ aCharLocaleName = "CharLocale";
+ aCharPostureName = "CharPosture";
+ break;
+ }
+ }
+
+ mnCharHeight = 24;
+ if ( GetPropertyValue( mAny, mXPropSet, aCharHeightName ) )
+ {
+ float fVal(0.0);
+ if ( mAny >>= fVal )
+ {
+ mnCharHeight = static_cast<sal_uInt16>( fVal + 0.5 );
+ meCharHeight = GetPropertyState( mXPropSet, aCharHeightName );
+ }
+ }
+ if ( GetPropertyValue( mAny, mXPropSet, aCharWeightName ) )
+ {
+ float fFloat(0.0);
+ if ( mAny >>= fFloat )
+ {
+ if ( fFloat >= css::awt::FontWeight::SEMIBOLD )
+ mnCharAttr |= 1;
+ if ( GetPropertyState( mXPropSet, aCharWeightName ) == css::beans::PropertyState_DIRECT_VALUE )
+ mnCharAttrHard |= 1;
+ }
+ }
+ if ( GetPropertyValue( mAny, mXPropSet, aCharLocaleName ) )
+ {
+ css::lang::Locale eLocale;
+ if ( mAny >>= eLocale )
+ meCharLocale = eLocale;
+ }
+ if ( GetPropertyValue( mAny, mXPropSet, aCharPostureName ) )
+ {
+ css::awt::FontSlant aFS;
+ if ( mAny >>= aFS )
+ {
+ switch( aFS )
+ {
+ case css::awt::FontSlant_OBLIQUE :
+ case css::awt::FontSlant_ITALIC :
+ mnCharAttr |= 2;
+ break;
+ default:
+ break;
+ }
+ if ( GetPropertyState( mXPropSet, aCharPostureName ) == css::beans::PropertyState_DIRECT_VALUE )
+ mnCharAttrHard |= 2;
+ }
+ }
+
+ if ( ImplGetPropertyValue( "CharUnderline", bGetPropStateValue ) )
+ {
+ sal_Int16 nVal(0);
+ mAny >>= nVal;
+ switch ( nVal )
+ {
+ case css::awt::FontUnderline::SINGLE :
+ case css::awt::FontUnderline::DOUBLE :
+ case css::awt::FontUnderline::DOTTED :
+ mnCharAttr |= 4;
+ }
+ }
+ if ( ePropState == css::beans::PropertyState_DIRECT_VALUE )
+ mnCharAttrHard |= 4;
+
+ if ( ImplGetPropertyValue( "CharShadowed", bGetPropStateValue ) )
+ {
+ bool bBool(false);
+ mAny >>= bBool;
+ if ( bBool )
+ mnCharAttr |= 0x10;
+ }
+ if ( ePropState == css::beans::PropertyState_DIRECT_VALUE )
+ mnCharAttrHard |= 16;
+
+ if ( ImplGetPropertyValue( "CharRelief", bGetPropStateValue ) )
+ {
+ sal_Int16 nVal(0);
+ mAny >>= nVal;
+ if ( nVal != css::text::FontRelief::NONE )
+ mnCharAttr |= 512;
+ }
+ if ( ePropState == css::beans::PropertyState_DIRECT_VALUE )
+ mnCharAttrHard |= 512;
+
+ if ( ImplGetPropertyValue( "CharColor", bGetPropStateValue ) )
+ {
+ sal_uInt32 nSOColor = *( o3tl::doAccess<sal_uInt32>(mAny) );
+ mnCharColor = nSOColor & 0xff00ff00; // green and hibyte
+ mnCharColor |= static_cast<sal_uInt8>(nSOColor) << 16; // red and blue is switched
+ mnCharColor |= static_cast<sal_uInt8>( nSOColor >> 16 );
+ }
+ meCharColor = ePropState;
+
+ mnCharEscapement = 0;
+ if ( ImplGetPropertyValue( "CharEscapement", bGetPropStateValue ) )
+ {
+ mAny >>= mnCharEscapement;
+ if ( mnCharEscapement > 100 )
+ mnCharEscapement = 33;
+ else if ( mnCharEscapement < -100 )
+ mnCharEscapement = -33;
+ }
+ meCharEscapement = ePropState;
+}
+
+void PortionObj::ImplClear()
+{
+ mpFieldEntry.reset();
+ mpText.reset();
+}
+
+void PortionObj::ImplConstruct( const PortionObj& rPortionObj )
+{
+ meCharColor = rPortionObj.meCharColor;
+ meCharHeight = rPortionObj.meCharHeight;
+ meFontName = rPortionObj.meFontName;
+ meAsianOrComplexFont = rPortionObj.meAsianOrComplexFont;
+ meCharEscapement = rPortionObj.meCharEscapement;
+ meCharLocale = rPortionObj.meCharLocale;
+ mnCharAttrHard = rPortionObj.mnCharAttrHard;
+
+ mbLastPortion = rPortionObj.mbLastPortion;
+ mnTextSize = rPortionObj.mnTextSize;
+ mnCharColor = rPortionObj.mnCharColor;
+ mnCharEscapement = rPortionObj.mnCharEscapement;
+ mnCharAttr = rPortionObj.mnCharAttr;
+ mnCharHeight = rPortionObj.mnCharHeight;
+ mnFont = rPortionObj.mnFont;
+ mnAsianOrComplexFont = rPortionObj.mnAsianOrComplexFont;
+
+ if ( rPortionObj.mpText )
+ {
+ mpText.reset( new sal_uInt16[ mnTextSize ] );
+ memcpy( mpText.get(), rPortionObj.mpText.get(), mnTextSize << 1 );
+ }
+
+ if ( rPortionObj.mpFieldEntry )
+ mpFieldEntry.reset( new FieldEntry( *( rPortionObj.mpFieldEntry ) ) );
+}
+
+sal_uInt32 PortionObj::ImplCalculateTextPositions( sal_uInt32 nCurrentTextPosition )
+{
+ if ( mpFieldEntry && ( !mpFieldEntry->nFieldStartPos ) )
+ {
+ mpFieldEntry->nFieldStartPos += nCurrentTextPosition;
+ mpFieldEntry->nFieldEndPos += nCurrentTextPosition;
+ }
+ return mnTextSize;
+}
+
+// Return: 0 = no TextField
+// bit28->31 text field type :
+// 1 = Date
+// 2 = Time
+// 3 = SlideNumber
+// 4 = Url
+// 5 = DateTime
+// 6 = header
+// 7 = footer
+// bit24->27 text field sub type (optional)
+// 23-> PPT Textfield needs a placeholder
+
+sal_uInt32 PortionObj::ImplGetTextField( css::uno::Reference< css::text::XTextRange > & ,
+ const css::uno::Reference< css::beans::XPropertySet > & rXPropSet, OUString& rURL )
+{
+ sal_uInt32 nRetValue = 0;
+ sal_Int32 nFormat;
+ css::uno::Any aAny;
+ if ( GetPropertyValue( aAny, rXPropSet, "TextPortionType", true ) )
+ {
+ auto aTextFieldType = o3tl::doAccess<OUString>(aAny);
+ if ( *aTextFieldType == "TextField" )
+ {
+ if ( GetPropertyValue( aAny, rXPropSet, *aTextFieldType, true ) )
+ {
+ css::uno::Reference< css::text::XTextField > aXTextField;
+ if ( aAny >>= aXTextField )
+ {
+ if ( aXTextField.is() )
+ {
+ css::uno::Reference< css::beans::XPropertySet > xFieldPropSet( aXTextField, css::uno::UNO_QUERY );
+ if ( xFieldPropSet.is() )
+ {
+ OUString aFieldKind( aXTextField->getPresentation( true ) );
+ if ( aFieldKind == "Date" )
+ {
+ if ( GetPropertyValue( aAny, xFieldPropSet, "IsFix", true ) )
+ {
+ bool bBool = false;
+ aAny >>= bBool;
+ if ( !bBool ) // Fixed DateFields does not exist in PPT
+ {
+ if ( GetPropertyValue( aAny, xFieldPropSet, "Format", true ) )
+ {
+ nFormat = *o3tl::doAccess<sal_Int32>(aAny);
+ switch ( nFormat )
+ {
+ default:
+ case 5 :
+ case 4 :
+ case 2 : nFormat = 0; break;
+ case 8 :
+ case 9 :
+ case 3 : nFormat = 1; break;
+ case 7 :
+ case 6 : nFormat = 2; break;
+ }
+ nRetValue |= ( ( ( 1 << 4 ) | nFormat ) << 24 ) | 0x800000;
+ }
+ }
+ }
+ }
+ else if ( aFieldKind == "URL" )
+ {
+ if ( GetPropertyValue( aAny, xFieldPropSet, "URL", true ) )
+ rURL = *o3tl::doAccess<OUString>(aAny);
+ nRetValue = 4 << 28;
+ }
+ else if ( aFieldKind == "Page" )
+ {
+ nRetValue = 3 << 28 | 0x800000;
+ }
+ else if ( aFieldKind == "Pages" )
+ {
+
+ }
+ else if ( aFieldKind == "Time" )
+ {
+ if ( GetPropertyValue( aAny, xFieldPropSet, "IsFix", true ) )
+ {
+ bool bBool = false;
+ aAny >>= bBool;
+ if ( !bBool )
+ {
+ if ( GetPropertyValue( aAny, xFieldPropSet, "IsFix", true ) )
+ {
+ nFormat = *o3tl::doAccess<sal_Int32>(aAny);
+ nRetValue |= ( ( ( 2 << 4 ) | nFormat ) << 24 ) | 0x800000;
+ }
+ }
+ }
+ }
+ else if ( aFieldKind == "File" )
+ {
+
+ }
+ else if ( aFieldKind == "Table" )
+ {
+
+ }
+ else if ( aFieldKind == "ExtTime" )
+ {
+ if ( GetPropertyValue( aAny, xFieldPropSet, "IsFix", true ) )
+ {
+ bool bBool = false;
+ aAny >>= bBool;
+ if ( !bBool )
+ {
+ if ( GetPropertyValue( aAny, xFieldPropSet, "Format", true ) )
+ {
+ nFormat = *o3tl::doAccess<sal_Int32>(aAny);
+ switch ( nFormat )
+ {
+ default:
+ case 6 :
+ case 7 :
+ case 8 :
+ case 2 : nFormat = 12; break;
+ case 3 : nFormat = 9; break;
+ case 5 :
+ case 4 : nFormat = 10; break;
+
+ }
+ nRetValue |= ( ( ( 2 << 4 ) | nFormat ) << 24 ) | 0x800000;
+ }
+ }
+ }
+ }
+ else if ( aFieldKind == "ExtFile" )
+ {
+
+ }
+ else if ( aFieldKind == "Author" )
+ {
+
+ }
+ else if ( aFieldKind == "DateTime" )
+ {
+ nRetValue = 5 << 28 | 0x800000;
+ }
+ else if ( aFieldKind == "Header" )
+ {
+ nRetValue = 6 << 28 | 0x800000;
+ }
+ else if ( aFieldKind == "Footer" )
+ {
+ nRetValue = 7 << 28 | 0x800000;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return nRetValue;
+}
+
+PortionObj& PortionObj::operator=( const PortionObj& rPortionObj )
+{
+ if ( this != &rPortionObj )
+ {
+ ImplClear();
+ ImplConstruct( rPortionObj );
+ }
+ return *this;
+}
+
+ParagraphObj::ParagraphObj(const css::uno::Reference< css::beans::XPropertySet > & rXPropSet,
+ PPTExBulletProvider* pProv)
+ : mnTextSize(0)
+ , mbFirstParagraph(false)
+ , mbLastParagraph(false)
+ , meBullet(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , mnTextAdjust(0)
+ , mnLineSpacing(0)
+ , mbFixedLineSpacing(false)
+ , mnLineSpacingTop(0)
+ , mnLineSpacingBottom(0)
+ , mbForbiddenRules(false)
+ , mbParagraphPunctation(false)
+ , mnBiDi(0)
+{
+ mXPropSet = rXPropSet;
+
+ bExtendedParameters = false;
+
+ nDepth = 0;
+ nBulletFlags = 0;
+ nParaFlags = 0;
+
+ ImplGetParagraphValues( pProv, false );
+}
+
+ParagraphObj::ParagraphObj(css::uno::Reference< css::text::XTextContent > const & rXTextContent,
+ ParaFlags aParaFlags, FontCollection& rFontCollection, PPTExBulletProvider& rProv )
+ : mnTextSize(0)
+ , mbIsBullet(false)
+ , mbFirstParagraph( aParaFlags.bFirstParagraph )
+ , mbLastParagraph( aParaFlags.bLastParagraph )
+ , meBullet(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meTextAdjust(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meLineSpacing(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meLineSpacingTop(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meLineSpacingBottom(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meForbiddenRules(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meParagraphPunctation(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , meBiDi(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ , mnTextAdjust(0)
+ , mnLineSpacing(0)
+ , mbFixedLineSpacing(false)
+ , mnLineSpacingTop(0)
+ , mnLineSpacingBottom(0)
+ , mbForbiddenRules(false)
+ , mbParagraphPunctation(false)
+ , mnBiDi(0)
+{
+ bExtendedParameters = false;
+
+ nDepth = 0;
+ nBulletFlags = 0;
+ nParaFlags = 0;
+
+ mXPropSet.set( rXTextContent, css::uno::UNO_QUERY );
+
+ mXPropState.set( rXTextContent, css::uno::UNO_QUERY );
+
+ if ( !(mXPropSet.is() && mXPropState.is()) )
+ return;
+
+ css::uno::Reference< css::container::XEnumerationAccess > aXTextPortionEA( rXTextContent, css::uno::UNO_QUERY );
+ if ( aXTextPortionEA.is() )
+ {
+ css::uno::Reference< css::container::XEnumeration > aXTextPortionE( aXTextPortionEA->createEnumeration() );
+ if ( aXTextPortionE.is() )
+ {
+ while ( aXTextPortionE->hasMoreElements() )
+ {
+ css::uno::Reference< css::text::XTextRange > aXCursorText;
+ css::uno::Any aAny( aXTextPortionE->nextElement() );
+ if ( aAny >>= aXCursorText )
+ {
+ std::unique_ptr<PortionObj> pPortionObj(new PortionObj( aXCursorText, !aXTextPortionE->hasMoreElements(), rFontCollection ));
+ if ( pPortionObj->Count() )
+ mvPortions.push_back( std::move(pPortionObj) );
+ }
+ }
+ }
+ }
+ ImplGetParagraphValues( &rProv, true );
+}
+
+ParagraphObj::~ParagraphObj()
+{
+ ImplClear();
+}
+
+void ParagraphObj::Write( SvStream* pStrm )
+{
+ for ( std::vector<std::unique_ptr<PortionObj> >::iterator it = mvPortions.begin(); it != mvPortions.end(); ++it )
+ (*it)->Write( pStrm, mbLastParagraph );
+}
+
+void ParagraphObj::ImplClear()
+{
+ mvPortions.clear();
+}
+
+void ParagraphObj::CalculateGraphicBulletSize( sal_uInt16 nFontHeight )
+{
+ if ( ( nNumberingType != SVX_NUM_BITMAP ) || ( nBulletId == 0xffff ) )
+ return;
+
+ // calculate the bullet real size for this graphic
+ if ( aBuGraSize.Width() && aBuGraSize.Height() )
+ {
+ double fCharHeight = nFontHeight;
+ double fLen = aBuGraSize.Height();
+ fCharHeight = fCharHeight * 0.2540;
+ double fQuo = fLen / fCharHeight;
+ nBulletRealSize = static_cast<sal_Int16>( fQuo + 0.5 );
+ if ( static_cast<sal_uInt16>(nBulletRealSize) > 400 )
+ nBulletRealSize = 400;
+ }
+}
+
+void ParagraphObj::ImplGetNumberingLevel( PPTExBulletProvider* pBuProv, sal_Int16 nNumberingDepth, bool bIsBullet, bool bGetPropStateValue )
+{
+ css::uno::Any aAny;
+ if ( GetPropertyValue( aAny, mXPropSet, "ParaLeftMargin" ) )
+ {
+ sal_Int32 nVal(0);
+ if ( aAny >>= nVal )
+ nTextOfs = convertMm100ToMasterUnit(nVal);
+ }
+ if ( GetPropertyValue( aAny, mXPropSet, "ParaFirstLineIndent" ) )
+ {
+ if ( aAny >>= nBulletOfs )
+ nBulletOfs = convertMm100ToMasterUnit(nBulletOfs);
+ }
+ if ( GetPropertyValue( aAny, mXPropSet, "NumberingIsNumber" ) )
+ aAny >>= bNumberingIsNumber;
+
+ css::uno::Reference< css::container::XIndexReplace > aXIndexReplace;
+
+ if ( bIsBullet && ImplGetPropertyValue( "NumberingRules", bGetPropStateValue ) )
+ {
+ if ( ( mAny >>= aXIndexReplace ) && nNumberingDepth < aXIndexReplace->getCount() )
+ {
+ mAny = aXIndexReplace->getByIndex( nNumberingDepth );
+ auto aPropertySequence = o3tl::doAccess<css::uno::Sequence<css::beans::PropertyValue>>(mAny);
+
+ if ( aPropertySequence->hasElements() )
+ {
+ bExtendedParameters = true;
+ nBulletRealSize = 100;
+ nMappedNumType = 0;
+
+ uno::Reference<graphic::XGraphic> xGraphic;
+ for ( const css::beans::PropertyValue& rPropValue : *aPropertySequence )
+ {
+ OUString aPropName( rPropValue.Name );
+ if ( aPropName == "NumberingType" )
+ nNumberingType = static_cast<SvxNumType>(*o3tl::doAccess<sal_Int16>(rPropValue.Value));
+ else if ( aPropName == "Adjust" )
+ nHorzAdjust = *o3tl::doAccess<sal_Int16>(rPropValue.Value);
+ else if ( aPropName == "BulletChar" )
+ {
+ OUString aString( *o3tl::doAccess<OUString>(rPropValue.Value) );
+ if ( !aString.isEmpty() )
+ cBulletId = aString[ 0 ];
+ }
+ else if ( aPropName == "BulletFont" )
+ {
+ aFontDesc = *o3tl::doAccess<css::awt::FontDescriptor>(rPropValue.Value);
+
+ // Our numbullet dialog has set the wrong textencoding for our "StarSymbol" font,
+ // instead of a Unicode encoding the encoding RTL_TEXTENCODING_SYMBOL was used.
+ // Because there might exist a lot of damaged documents I added this two lines
+ // which fixes the bullet problem for the export.
+ if ( aFontDesc.Name.equalsIgnoreAsciiCase("StarSymbol") )
+ aFontDesc.CharSet = RTL_TEXTENCODING_MS_1252;
+
+ }
+ else if ( aPropName == "GraphicBitmap" )
+ {
+ auto xBitmap = rPropValue.Value.get<uno::Reference<awt::XBitmap>>();
+ xGraphic.set(xBitmap, uno::UNO_QUERY);
+ }
+ else if ( aPropName == "GraphicSize" )
+ {
+ if (auto aSize = o3tl::tryAccess<css::awt::Size>(rPropValue.Value))
+ {
+ // don't cast awt::Size to Size as on 64-bits they are not the same.
+ aBuGraSize.setWidth( aSize->Width );
+ aBuGraSize.setHeight( aSize->Height );
+ }
+ }
+ else if ( aPropName == "StartWith" )
+ nStartWith = *o3tl::doAccess<sal_Int16>(rPropValue.Value);
+ else if ( aPropName == "LeftMargin" )
+ nTextOfs += convertMm100ToMasterUnit(*o3tl::doAccess<sal_Int32>(rPropValue.Value));
+ else if ( aPropName == "FirstLineOffset" )
+ nBulletOfs += convertMm100ToMasterUnit(*o3tl::doAccess<sal_Int32>(rPropValue.Value));
+ else if ( aPropName == "BulletColor" )
+ {
+ sal_uInt32 nSOColor = *o3tl::doAccess<sal_uInt32>(rPropValue.Value);
+ nBulletColor = nSOColor & 0xff00ff00; // green and hibyte
+ nBulletColor |= static_cast<sal_uInt8>(nSOColor) << 16; // red
+ nBulletColor |= static_cast<sal_uInt8>( nSOColor >> 16 ) | 0xfe000000; // blue
+ }
+ else if ( aPropName == "BulletRelSize" )
+ {
+ nBulletRealSize = *o3tl::doAccess<sal_Int16>(rPropValue.Value);
+ nParaFlags |= 0x40;
+ nBulletFlags |= 8;
+ }
+ else if ( aPropName == "Prefix" )
+ sPrefix = *o3tl::doAccess<OUString>(rPropValue.Value);
+ else if ( aPropName == "Suffix" )
+ sSuffix = *o3tl::doAccess<OUString>(rPropValue.Value);
+#ifdef DBG_UTIL
+ else if ( aPropName != "SymbolTextDistance" && aPropName != "GraphicBitmap" )
+ {
+ OSL_FAIL( "Unknown Property" );
+ }
+#endif
+ }
+
+ if (xGraphic.is())
+ {
+ if ( aBuGraSize.Width() && aBuGraSize.Height() )
+ {
+ nBulletId = pBuProv->GetId(xGraphic, aBuGraSize );
+ if ( nBulletId != 0xffff )
+ bExtendedBulletsUsed = true;
+ }
+ else
+ {
+ nNumberingType = SVX_NUM_NUMBER_NONE;
+ }
+ }
+
+ CalculateGraphicBulletSize( ( mvPortions.empty() ) ? 24 : mvPortions.front()->mnCharHeight );
+
+ switch( nNumberingType )
+ {
+ case SVX_NUM_NUMBER_NONE : nParaFlags |= 0xf; break;
+
+ case SVX_NUM_CHAR_SPECIAL : // Bullet
+ {
+ if ( IsStarSymbol(aFontDesc.Name) )
+ {
+ rtl_TextEncoding eChrSet = aFontDesc.CharSet;
+ cBulletId = msfilter::util::bestFitOpenSymbolToMSFont(cBulletId, eChrSet, aFontDesc.Name);
+ aFontDesc.CharSet = eChrSet;
+ }
+
+ if ( !aFontDesc.Name.isEmpty() )
+ {
+ nParaFlags |= 0x90; // we define the font and charset
+ }
+
+ [[fallthrough]];
+ }
+ case SVX_NUM_CHARS_UPPER_LETTER : // count from a-z, aa - az, ba - bz, ...
+ case SVX_NUM_CHARS_LOWER_LETTER :
+ case SVX_NUM_ROMAN_UPPER :
+ case SVX_NUM_ROMAN_LOWER :
+ case SVX_NUM_ARABIC :
+ case SVX_NUM_PAGEDESC : // numbering from the page template
+ case SVX_NUM_BITMAP :
+ case SVX_NUM_CHARS_UPPER_LETTER_N : // count from a-z, aa-zz, aaa-zzz
+ case SVX_NUM_CHARS_LOWER_LETTER_N :
+ case SVX_NUM_NUMBER_UPPER_ZH:
+ case SVX_NUM_CIRCLE_NUMBER:
+ case SVX_NUM_NUMBER_UPPER_ZH_TW:
+ case SVX_NUM_NUMBER_LOWER_ZH:
+ case SVX_NUM_FULL_WIDTH_ARABIC:
+ {
+ if ( nNumberingType != SVX_NUM_CHAR_SPECIAL )
+ {
+ bExtendedBulletsUsed = true;
+ if ( nNumberingDepth & 1 )
+ cBulletId = 0x2013; // defaulting bullet characters for ppt97
+ else if ( nNumberingDepth == 4 )
+ cBulletId = 0xbb;
+ else
+ cBulletId = 0x2022;
+
+ switch( nNumberingType )
+ {
+ case SVX_NUM_CHARS_UPPER_LETTER :
+ case SVX_NUM_CHARS_UPPER_LETTER_N :
+ {
+ if ( sSuffix == ")" )
+ {
+ if ( sPrefix == "(" )
+ nMappedNumType = 0xa0001; // (A)
+ else
+ nMappedNumType = 0xb0001; // A)
+ }
+ else
+ nMappedNumType = 0x10001; // A.
+ }
+ break;
+ case SVX_NUM_CHARS_LOWER_LETTER :
+ case SVX_NUM_CHARS_LOWER_LETTER_N :
+ {
+ if ( sSuffix == ")" )
+ {
+ if ( sPrefix == "(" )
+ nMappedNumType = 0x80001; // (a)
+ else
+ nMappedNumType = 0x90001; // a)
+ }
+ else
+ nMappedNumType = 0x00001; // a.
+ }
+ break;
+ case SVX_NUM_ROMAN_UPPER :
+ {
+ if ( sSuffix == ")" )
+ {
+ if ( sPrefix == "(" )
+ nMappedNumType = 0xe0001; // (I)
+ else
+ nMappedNumType = 0xf0001; // I)
+ }
+ else
+ nMappedNumType = 0x70001; // I.
+ }
+ break;
+ case SVX_NUM_ROMAN_LOWER :
+ {
+ if ( sSuffix == ")" )
+ {
+ if ( sPrefix == "(" )
+ nMappedNumType = 0x40001; // (i)
+ else
+ nMappedNumType = 0x50001; // i)
+ }
+ else
+ nMappedNumType = 0x60001; // i.
+ }
+ break;
+ case SVX_NUM_ARABIC :
+ {
+ if ( sSuffix == ")" )
+ {
+ if ( sPrefix == "(" )
+ nMappedNumType = 0xc0001; // (1)
+ else
+ nMappedNumType = 0x20001; // 1)
+ }
+ else
+ {
+ if ( sSuffix.isEmpty() && sPrefix.isEmpty() )
+ nMappedNumType = 0xd0001; // 1
+ else
+ nMappedNumType = 0x30001; // 1.
+ }
+ }
+ break;
+ case SVX_NUM_NUMBER_UPPER_ZH :
+ {
+ if ( !sSuffix.isEmpty() )
+ nMappedNumType = 0x110001; // Simplified Chinese with single-byte period.
+ else
+ nMappedNumType = 0x100001; // Simplified Chinese.
+ }
+ break;
+ case SVX_NUM_CIRCLE_NUMBER :
+ {
+ nMappedNumType = 0x120001; // Double byte circle numbers.
+ }
+ break;
+ case SVX_NUM_NUMBER_UPPER_ZH_TW :
+ {
+ if ( !sSuffix.isEmpty() )
+ nMappedNumType = 0x160001; // Traditional Chinese with single-byte period.
+ else
+ nMappedNumType = 0x150001; // Traditional Chinese.
+ }
+ break;
+ case SVX_NUM_NUMBER_LOWER_ZH :
+ {
+ if ( sSuffix == u"\uff0e" )
+ nMappedNumType = 0x260001; // Japanese with double-byte period.
+ else if ( !sSuffix.isEmpty() )
+ nMappedNumType = 0x1B0001; // Japanese/Korean with single-byte period.
+ else
+ nMappedNumType = 0x1A0001; // Japanese/Korean.
+ }
+ break;
+ case SVX_NUM_FULL_WIDTH_ARABIC :
+ {
+ if ( !sSuffix.isEmpty() )
+ nMappedNumType = 0x1D0001; // Double-byte Arabic numbers with double-byte period.
+ else
+ nMappedNumType = 0x1C0001; // Double-byte Arabic numbers.
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ nParaFlags |= 0x2f;
+ nBulletFlags |= 6;
+ if ( mbIsBullet && bNumberingIsNumber )
+ nBulletFlags |= 1;
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+ }
+ nBulletOfs = nTextOfs + nBulletOfs;
+ if ( nBulletOfs < 0 )
+ nBulletOfs = 0;
+}
+
+void ParagraphObj::ImplGetParagraphValues( PPTExBulletProvider* pBuProv, bool bGetPropStateValue )
+{
+ css::uno::Any aAny;
+ if ( GetPropertyValue( aAny, mXPropSet, "NumberingLevel", true ) )
+ {
+ if ( bGetPropStateValue )
+ meBullet = GetPropertyState( mXPropSet, "NumberingLevel" );
+ nDepth = *o3tl::doAccess<sal_Int16>(aAny);
+
+ if ( nDepth < 0 )
+ {
+ mbIsBullet = false;
+ nDepth = 0;
+ }
+ else
+ {
+ if ( nDepth > 4 )
+ nDepth = 4;
+ mbIsBullet = true;
+ }
+ }
+ else
+ {
+ nDepth = 0;
+ mbIsBullet = false;
+ }
+ ImplGetNumberingLevel( pBuProv, nDepth, mbIsBullet, bGetPropStateValue );
+
+ if ( ImplGetPropertyValue( "ParaTabStops", bGetPropStateValue ) )
+ maTabStop = *o3tl::doAccess<css::uno::Sequence<css::style::TabStop>>(mAny);
+ sal_Int16 eTextAdjust = sal_Int16(css::style::ParagraphAdjust_LEFT);
+ if ( GetPropertyValue( aAny, mXPropSet, "ParaAdjust", bGetPropStateValue ) )
+ aAny >>= eTextAdjust;
+ switch ( static_cast<css::style::ParagraphAdjust>(eTextAdjust) )
+ {
+ case css::style::ParagraphAdjust_CENTER :
+ mnTextAdjust = 1;
+ break;
+ case css::style::ParagraphAdjust_RIGHT :
+ mnTextAdjust = 2;
+ break;
+ case css::style::ParagraphAdjust_BLOCK :
+ mnTextAdjust = 3;
+ break;
+ default :
+ case css::style::ParagraphAdjust_LEFT :
+ mnTextAdjust = 0;
+ break;
+ }
+ meTextAdjust = ePropState;
+
+ if ( ImplGetPropertyValue( "ParaLineSpacing", bGetPropStateValue ) )
+ {
+ css::style::LineSpacing aLineSpacing
+ = *o3tl::doAccess<css::style::LineSpacing>(mAny);
+ switch ( aLineSpacing.Mode )
+ {
+ case css::style::LineSpacingMode::FIX :
+ mnLineSpacing = static_cast<sal_Int16>(-( aLineSpacing.Height ) );
+ mbFixedLineSpacing = true;
+ break;
+ case css::style::LineSpacingMode::MINIMUM :
+ case css::style::LineSpacingMode::LEADING :
+ mnLineSpacing = static_cast<sal_Int16>(-( aLineSpacing.Height ) );
+ mbFixedLineSpacing = false;
+ break;
+
+ case css::style::LineSpacingMode::PROP :
+ default:
+ mnLineSpacing = aLineSpacing.Height;
+ break;
+ }
+ }
+ meLineSpacing = ePropState;
+
+ if ( ImplGetPropertyValue( "ParaBottomMargin", bGetPropStateValue ) )
+ {
+ double fSpacing = *o3tl::doAccess<sal_uInt32>(mAny) + convertMasterUnitToMm100(1.0) - 1;
+ mnLineSpacingBottom = std::round(-convertMm100ToMasterUnit(fSpacing));
+ }
+ meLineSpacingBottom = ePropState;
+
+ if ( ImplGetPropertyValue( "ParaTopMargin", bGetPropStateValue ) )
+ {
+ double fSpacing = *o3tl::doAccess<sal_uInt32>(mAny) + convertMasterUnitToMm100(1.0) - 1;
+ mnLineSpacingTop = std::round(-convertMm100ToMasterUnit(fSpacing));
+ }
+ meLineSpacingTop = ePropState;
+
+ if ( ImplGetPropertyValue( "ParaIsForbiddenRules", bGetPropStateValue ) )
+ mAny >>= mbForbiddenRules;
+ meForbiddenRules = ePropState;
+
+ if ( ImplGetPropertyValue( "ParaIsHangingPunctuation", bGetPropStateValue ) )
+ mAny >>= mbParagraphPunctation;
+ meParagraphPunctation = ePropState;
+
+ mnBiDi = 0;
+ if ( ImplGetPropertyValue( "WritingMode", bGetPropStateValue ) )
+ {
+ sal_Int16 nWritingMode = 0;
+ mAny >>= nWritingMode;
+
+ SvxFrameDirection eWritingMode = static_cast<SvxFrameDirection>(nWritingMode);
+ if ( ( eWritingMode == SvxFrameDirection::Horizontal_RL_TB )
+ || ( eWritingMode == SvxFrameDirection::Vertical_RL_TB ) )
+ {
+ mnBiDi = 1;
+ }
+ }
+ meBiDi = ePropState;
+}
+
+void ParagraphObj::ImplConstruct( const ParagraphObj& rParagraphObj )
+{
+ mbIsBullet = rParagraphObj.mbIsBullet;
+ meBullet = rParagraphObj.meBullet;
+ meTextAdjust = rParagraphObj.meTextAdjust;
+ meLineSpacing = rParagraphObj.meLineSpacing;
+ meLineSpacingTop = rParagraphObj.meLineSpacingTop;
+ meLineSpacingBottom = rParagraphObj.meLineSpacingBottom;
+ meForbiddenRules = rParagraphObj.meForbiddenRules;
+ meParagraphPunctation = rParagraphObj.meParagraphPunctation;
+ meBiDi =rParagraphObj.meBiDi;
+ mbFixedLineSpacing = rParagraphObj.mbFixedLineSpacing;
+ mnTextSize = rParagraphObj.mnTextSize;
+ mnTextAdjust = rParagraphObj.mnTextAdjust;
+ mnLineSpacing = rParagraphObj.mnLineSpacing;
+ mnLineSpacingTop = rParagraphObj.mnLineSpacingTop;
+ mnLineSpacingBottom = rParagraphObj.mnLineSpacingBottom;
+ mbFirstParagraph = rParagraphObj.mbFirstParagraph;
+ mbLastParagraph = rParagraphObj.mbLastParagraph;
+ mbParagraphPunctation = rParagraphObj.mbParagraphPunctation;
+ mbForbiddenRules = rParagraphObj.mbForbiddenRules;
+ mnBiDi = rParagraphObj.mnBiDi;
+
+ for ( std::vector<std::unique_ptr<PortionObj> >::const_iterator it = rParagraphObj.begin(); it != rParagraphObj.end(); ++it )
+ mvPortions.push_back( std::make_unique<PortionObj>( **it ) );
+
+ maTabStop = rParagraphObj.maTabStop;
+ bExtendedParameters = rParagraphObj.bExtendedParameters;
+ nParaFlags = rParagraphObj.nParaFlags;
+ nBulletFlags = rParagraphObj.nBulletFlags;
+ sPrefix = rParagraphObj.sPrefix;
+ sSuffix = rParagraphObj.sSuffix;
+ sGraphicUrl = rParagraphObj.sGraphicUrl; // String to a graphic
+ aBuGraSize = rParagraphObj.aBuGraSize;
+ nNumberingType = rParagraphObj.nNumberingType; // this is actually a SvxEnum
+ nHorzAdjust = rParagraphObj.nHorzAdjust;
+ nBulletColor = rParagraphObj.nBulletColor;
+ nBulletOfs = rParagraphObj.nBulletOfs;
+ nStartWith = rParagraphObj.nStartWith; // start of numbering
+ nTextOfs = rParagraphObj.nTextOfs;
+ nBulletRealSize = rParagraphObj.nBulletRealSize; // scale in percent
+ nDepth = rParagraphObj.nDepth; // actual depth
+ cBulletId = rParagraphObj.cBulletId; // if Numbering Type == CharSpecial
+ aFontDesc = rParagraphObj.aFontDesc;
+
+ bExtendedBulletsUsed = rParagraphObj.bExtendedBulletsUsed;
+ nBulletId = rParagraphObj.nBulletId;
+}
+
+sal_uInt32 ParagraphObj::ImplCalculateTextPositions( sal_uInt32 nCurrentTextPosition )
+{
+ mnTextSize = 0;
+ for ( std::vector<std::unique_ptr<PortionObj> >::iterator it = mvPortions.begin(); it != mvPortions.end(); ++it )
+ mnTextSize += (*it)->ImplCalculateTextPositions( nCurrentTextPosition + mnTextSize );
+ return mnTextSize;
+}
+
+ParagraphObj& ParagraphObj::operator=( const ParagraphObj& rParagraphObj )
+{
+ if ( this != &rParagraphObj )
+ {
+ ImplClear();
+ ImplConstruct( rParagraphObj );
+ }
+ return *this;
+}
+
+struct ImplTextObj
+{
+ sal_uInt32 mnTextSize;
+ int mnInstance;
+ std::vector<std::unique_ptr<ParagraphObj>> maList;
+ bool mbHasExtendedBullets;
+
+ explicit ImplTextObj( int nInstance );
+};
+
+ImplTextObj::ImplTextObj( int nInstance )
+ : mnTextSize(0),
+ mnInstance(nInstance),
+ mbHasExtendedBullets(false)
+{
+}
+
+TextObj::TextObj( css::uno::Reference< css::text::XSimpleText > const & rXTextRef,
+ int nInstance, FontCollection& rFontCollection, PPTExBulletProvider& rProv ):
+ mpImplTextObj(std::make_shared<ImplTextObj>(nInstance))
+{
+ css::uno::Reference< css::container::XEnumerationAccess > aXTextParagraphEA( rXTextRef, css::uno::UNO_QUERY );
+
+ if ( aXTextParagraphEA.is() )
+ {
+ css::uno::Reference< css::container::XEnumeration > aXTextParagraphE( aXTextParagraphEA->createEnumeration() );
+ if ( aXTextParagraphE.is() )
+ {
+ ParaFlags aParaFlags;
+ while ( aXTextParagraphE->hasMoreElements() )
+ {
+ css::uno::Reference< css::text::XTextContent > aXParagraph;
+ css::uno::Any aAny( aXTextParagraphE->nextElement() );
+ if ( aAny >>= aXParagraph )
+ {
+ if ( !aXTextParagraphE->hasMoreElements() )
+ aParaFlags.bLastParagraph = true;
+ std::unique_ptr<ParagraphObj> pPara(new ParagraphObj( aXParagraph, aParaFlags, rFontCollection, rProv ));
+ mpImplTextObj->mbHasExtendedBullets |= pPara->bExtendedBulletsUsed;
+ mpImplTextObj->maList.push_back( std::move(pPara) );
+ aParaFlags.bFirstParagraph = false;
+ }
+ }
+ }
+ }
+ ImplCalculateTextPositions();
+}
+
+void TextObj::ImplCalculateTextPositions()
+{
+ mpImplTextObj->mnTextSize = 0;
+ for ( sal_uInt32 i = 0; i < ParagraphCount(); ++i )
+ mpImplTextObj->mnTextSize += GetParagraph(i)->ImplCalculateTextPositions( mpImplTextObj->mnTextSize );
+}
+
+ParagraphObj* TextObj::GetParagraph(int idx)
+{
+ return mpImplTextObj->maList[idx].get();
+}
+
+sal_uInt32 TextObj::ParagraphCount() const
+{
+ return mpImplTextObj->maList.size();
+}
+
+sal_uInt32 TextObj::Count() const
+{
+ return mpImplTextObj->mnTextSize;
+}
+
+int TextObj::GetInstance() const
+{
+ return mpImplTextObj->mnInstance;
+}
+
+bool TextObj::HasExtendedBullets() const
+{
+ return mpImplTextObj->mbHasExtendedBullets;
+}
+
+void FontCollectionEntry::ImplInit( const OUString& rName )
+{
+ OUString aSubstName( GetSubsFontName( rName, SubsFontFlags::ONLYONE | SubsFontFlags::MS ) );
+ if ( !aSubstName.isEmpty() )
+ {
+ Name = aSubstName;
+ }
+ else
+ {
+ Name = rName;
+ }
+}
+
+FontCollection::~FontCollection()
+{
+ pVDev.disposeAndClear();
+ xPPTBreakIter = nullptr;
+}
+
+FontCollection::FontCollection() :
+ pVDev ( nullptr )
+{
+ xPPTBreakIter = css::i18n::BreakIterator::create( ::comphelper::getProcessComponentContext() );
+}
+
+short FontCollection::GetScriptDirection( std::u16string_view rString )
+{
+ short nRet = ScriptTypeDetector::getScriptDirection( rString, 0, css::i18n::ScriptDirection::NEUTRAL );
+ return nRet;
+}
+
+sal_uInt32 FontCollection::GetId( FontCollectionEntry& rEntry )
+{
+ if( !rEntry.Name.isEmpty() )
+ {
+ const sal_uInt32 nFonts = maFonts.size();
+
+ for( sal_uInt32 i = 0; i < nFonts; i++ )
+ {
+ const FontCollectionEntry* pEntry = GetById( i );
+ if( pEntry->Name == rEntry.Name )
+ return i;
+ }
+ vcl::Font aFont;
+ aFont.SetCharSet( rEntry.CharSet );
+ aFont.SetFamilyName( rEntry.Original );
+ aFont.SetFontHeight( 100 );
+
+ if ( !pVDev )
+ pVDev = VclPtr<VirtualDevice>::Create();
+
+ pVDev->SetFont( aFont );
+ FontMetric aMetric( pVDev->GetFontMetric() );
+
+ sal_uInt16 nTxtHeight = static_cast<sal_uInt16>(aMetric.GetAscent()) + static_cast<sal_uInt16>(aMetric.GetDescent());
+
+ if ( nTxtHeight )
+ {
+ double fScaling = static_cast<double>(nTxtHeight) / 120.0;
+ if ( ( fScaling > 0.50 ) && ( fScaling < 1.5 ) )
+ rEntry.Scaling = fScaling;
+ }
+
+ maFonts.push_back(rEntry);
+ return nFonts;
+ }
+ return 0;
+}
+
+const FontCollectionEntry* FontCollection::GetById( sal_uInt32 nId )
+{
+ return nId < maFonts.size() ? &maFonts[nId] : nullptr;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/text.hxx b/sd/source/filter/eppt/text.hxx
new file mode 100644
index 000000000..ee2fc537c
--- /dev/null
+++ b/sd/source/filter/eppt/text.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "epptbase.hxx"
+
+#include <com/sun/star/awt/FontDescriptor.hpp>
+#include <com/sun/star/lang/Locale.hpp>
+#include <editeng/svxenum.hxx>
+#include <vector>
+#include <memory>
+
+namespace com::sun::star {
+ namespace awt { struct FontDescriptor; }
+ namespace beans { class XPropertyState; }
+ namespace text { class XTextRange; class XTextContent; class XSimpleText; }
+ namespace style { struct TabStop; }
+}
+
+struct SOParagraph
+{
+ bool bExtendedParameters;
+ sal_uInt32 nParaFlags;
+ sal_Int16 nBulletFlags;
+ OUString sPrefix;
+ OUString sSuffix;
+ OUString sGraphicUrl; // String to a graphic
+ Size aBuGraSize;
+ SvxNumType nNumberingType;
+ sal_uInt32 nHorzAdjust;
+ sal_uInt32 nBulletColor;
+ sal_Int32 nBulletOfs;
+ sal_Int16 nStartWith; // start of numbering
+ sal_Int16 nTextOfs;
+ sal_Int16 nBulletRealSize; // scale in percent
+ sal_Int16 nDepth; // actual depth
+ sal_Unicode cBulletId; // if Numbering Type == CharSpecial
+ css::awt::FontDescriptor aFontDesc;
+
+ bool bExtendedBulletsUsed;
+ sal_uInt16 nBulletId;
+ sal_uInt32 nMappedNumType;
+ bool bNumberingIsNumber;
+
+ SOParagraph()
+ : bExtendedParameters(false)
+ , nParaFlags(0)
+ , nBulletFlags(0)
+ , nNumberingType(SVX_NUM_NUMBER_NONE)
+ , nHorzAdjust(0)
+ , nBulletColor(0)
+ , nBulletOfs(0)
+ , nStartWith(0)
+ , nTextOfs(0)
+ , nBulletRealSize(0)
+ , nDepth(0)
+ , cBulletId(0)
+ , bExtendedBulletsUsed(false)
+ , nBulletId(0xffff)
+ , nMappedNumType(0)
+ , bNumberingIsNumber(true)
+ {
+ }
+};
+
+class PropStateValue : public PropValue
+{
+public:
+ PropStateValue()
+ : PropValue()
+ , ePropState(css::beans::PropertyState_AMBIGUOUS_VALUE)
+ {
+ }
+protected:
+ css::beans::PropertyState ePropState;
+ css::uno::Reference < css::beans::XPropertyState > mXPropState;
+
+ bool ImplGetPropertyValue( const OUString& rString, bool bGetPropertyState );
+};
+
+struct FieldEntry
+{
+ sal_uInt32 nFieldType;
+ sal_uInt32 nFieldStartPos;
+ sal_uInt32 nFieldEndPos;
+ OUString aRepresentation;
+ OUString aFieldUrl;
+
+ FieldEntry( sal_uInt32 nType, sal_uInt32 nStart, sal_uInt32 nEnd )
+ : nFieldType(nType),
+ nFieldStartPos(nStart),
+ nFieldEndPos(nEnd)
+ {
+ }
+};
+
+class PortionObj final : public PropStateValue
+{
+
+ friend class ParagraphObj;
+
+ void ImplClear();
+ void ImplConstruct( const PortionObj& rPortionObj );
+ static sal_uInt32 ImplGetTextField( css::uno::Reference< css::text::XTextRange > & rXTextRangeRef,
+ const css::uno::Reference< css::beans::XPropertySet > & rXPropSetRef, OUString& rURL );
+ sal_uInt32 ImplCalculateTextPositions( sal_uInt32 nCurrentTextPosition );
+ void ImplGetPortionValues( FontCollection& rFontCollection, bool bGetPropStateValue );
+
+ public:
+
+ css::beans::PropertyState meCharColor;
+ css::beans::PropertyState meCharHeight;
+ css::beans::PropertyState meFontName;
+ css::beans::PropertyState meAsianOrComplexFont;
+ css::beans::PropertyState meCharEscapement;
+ css::lang::Locale meCharLocale;
+ sal_uInt16 mnCharAttrHard;
+
+ sal_uInt32 mnCharColor;
+ sal_uInt16 mnCharAttr;
+ sal_uInt16 mnCharHeight;
+ sal_uInt16 mnFont;
+ sal_uInt16 mnAsianOrComplexFont;
+ sal_Int16 mnCharEscapement;
+
+ sal_uInt32 mnTextSize;
+ bool mbLastPortion;
+
+ std::unique_ptr<sal_uInt16[]> mpText;
+ std::unique_ptr<FieldEntry> mpFieldEntry;
+
+ PortionObj( css::uno::Reference< css::text::XTextRange > & rXTextRangeRef,
+ bool bLast, FontCollection& rFontCollection );
+ PortionObj( const css::uno::Reference< css::beans::XPropertySet > & rXPropSetRef,
+ FontCollection& rFontCollection );
+ PortionObj( const PortionObj& rPortionObj );
+ ~PortionObj();
+
+ void Write( SvStream* pStrm, bool bLast );
+ sal_uInt32 Count() const { return mnTextSize; };
+
+ PortionObj& operator=( const PortionObj& rPortionObj );
+};
+
+struct ParaFlags
+{
+ bool bFirstParagraph : 1;
+ bool bLastParagraph : 1;
+
+ ParaFlags() { bFirstParagraph = true; bLastParagraph = false; };
+};
+
+class ParagraphObj : public PropStateValue, public SOParagraph
+{
+ friend class TextObj;
+ friend struct PPTExParaSheet;
+
+ std::vector<std::unique_ptr<PortionObj> > mvPortions;
+
+ protected:
+
+ void ImplConstruct( const ParagraphObj& rParagraphObj );
+ void ImplClear();
+ sal_uInt32 ImplCalculateTextPositions( sal_uInt32 nCurrentTextPosition );
+ void ImplGetParagraphValues( PPTExBulletProvider* pBuProv, bool bGetPropStateValue );
+ void ImplGetNumberingLevel( PPTExBulletProvider* pBuProv, sal_Int16 nDepth, bool bIsBullet, bool bGetPropStateValue );
+
+ public:
+
+ css::uno::Sequence< css::style::TabStop > maTabStop;
+
+ sal_uInt32 mnTextSize;
+
+ bool mbIsBullet;
+ bool mbFirstParagraph;
+ bool mbLastParagraph;
+
+ css::beans::PropertyState meBullet;
+ css::beans::PropertyState meTextAdjust;
+ css::beans::PropertyState meLineSpacing;
+ css::beans::PropertyState meLineSpacingTop;
+ css::beans::PropertyState meLineSpacingBottom;
+ css::beans::PropertyState meForbiddenRules;
+ css::beans::PropertyState meParagraphPunctation;
+ css::beans::PropertyState meBiDi;
+
+ sal_uInt16 mnTextAdjust;
+ sal_Int16 mnLineSpacing;
+ bool mbFixedLineSpacing;
+ sal_Int16 mnLineSpacingTop;
+ sal_Int16 mnLineSpacingBottom;
+ bool mbForbiddenRules;
+ bool mbParagraphPunctation;
+ sal_uInt16 mnBiDi;
+
+ ParagraphObj( css::uno::Reference< css::text::XTextContent > const & rXTextContentRef,
+ ParaFlags, FontCollection& rFontCollection,
+ PPTExBulletProvider& rBuProv );
+ ParagraphObj( const ParagraphObj& rParargraphObj ) = delete;
+ ParagraphObj( const css::uno::Reference< css::beans::XPropertySet > & rXPropSetRef,
+ PPTExBulletProvider* pBuProv );
+
+ bool empty() const { return mvPortions.empty(); }
+
+ const PortionObj& front() const { return *mvPortions.front(); }
+
+ std::vector<std::unique_ptr<PortionObj> >::const_iterator begin() const { return mvPortions.begin(); }
+ std::vector<std::unique_ptr<PortionObj> >::const_iterator end() const { return mvPortions.end(); }
+
+ void CalculateGraphicBulletSize( sal_uInt16 nFontHeight );
+ ~ParagraphObj();
+
+ void Write( SvStream* pStrm );
+ sal_uInt32 CharacterCount() const { return mnTextSize; };
+
+ ParagraphObj& operator=( const ParagraphObj& rParagraphObj );
+};
+
+struct ImplTextObj;
+
+class TextObj
+{
+ std::shared_ptr<ImplTextObj> mpImplTextObj;
+ void ImplCalculateTextPositions();
+
+public:
+ TextObj( css::uno::Reference< css::text::XSimpleText > const &
+ rXText, int nInstance, FontCollection& rFontCollection, PPTExBulletProvider& rBuProv );
+
+ ParagraphObj* GetParagraph(int idx);
+ sal_uInt32 ParagraphCount() const;
+ sal_uInt32 Count() const;
+ int GetInstance() const;
+ bool HasExtendedBullets() const;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/grf/sdgrffilter.cxx b/sd/source/filter/grf/sdgrffilter.cxx
new file mode 100644
index 000000000..46ed24f3b
--- /dev/null
+++ b/sd/source/filter/grf/sdgrffilter.cxx
@@ -0,0 +1,304 @@
+/* -*- 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 <com/sun/star/drawing/GraphicExportFilter.hpp>
+
+#include <vcl/errinf.hxx>
+#include <vcl/weld.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <sfx2/docfile.hxx>
+#include <sfx2/docfilt.hxx>
+#include <sfx2/sfxuno.hxx>
+#include <svx/svdograf.hxx>
+
+#include <strings.hrc>
+#include <DrawViewShell.hxx>
+#include <DrawDocShell.hxx>
+
+#include <comphelper/processfactory.hxx>
+#include <vcl/graphicfilter.hxx>
+#include <vcl/svapp.hxx>
+
+#include <sdpage.hxx>
+#include <drawdoc.hxx>
+#include <sdresid.hxx>
+#include <sdgrffilter.hxx>
+#include <ViewShellBase.hxx>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/beans/PropertyValues.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/view/XSelectionSupplier.hpp>
+#include <cppuhelper/implbase.hxx>
+#include <com/sun/star/task/XInteractionHandler.hpp>
+#include <com/sun/star/task/XInteractionRequest.hpp>
+#include <com/sun/star/drawing/GraphicFilterRequest.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::graphic;
+using namespace ::com::sun::star::io;
+using namespace ::com::sun::star::ucb;
+using namespace com::sun::star::ui::dialogs;
+using namespace ::sfx2;
+
+namespace {
+
+class SdGRFFilter_ImplInteractionHdl : public ::cppu::WeakImplHelper< css::task::XInteractionHandler >
+{
+ css::uno::Reference< css::task::XInteractionHandler > m_xInter;
+ ErrCode nFilterError;
+
+ public:
+
+ explicit SdGRFFilter_ImplInteractionHdl( css::uno::Reference< css::task::XInteractionHandler > const & xInteraction ) :
+ m_xInter( xInteraction ),
+ nFilterError( ERRCODE_NONE )
+ {}
+
+ ErrCode const & GetErrorCode() const { return nFilterError; };
+
+ virtual void SAL_CALL handle( const css::uno::Reference< css::task::XInteractionRequest >& ) override;
+};
+
+}
+
+void SdGRFFilter_ImplInteractionHdl::handle( const css::uno::Reference< css::task::XInteractionRequest >& xRequest )
+{
+ if( !m_xInter.is() )
+ return;
+
+ css::drawing::GraphicFilterRequest aErr;
+ if ( xRequest->getRequest() >>= aErr )
+ nFilterError = ErrCode(aErr.ErrCode);
+ else
+ m_xInter->handle( xRequest );
+}
+
+
+SdGRFFilter::SdGRFFilter( SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell ) :
+ SdFilter( rMedium, rDocShell )
+{
+}
+
+SdGRFFilter::~SdGRFFilter()
+{
+}
+
+void SdGRFFilter::HandleGraphicFilterError( ErrCode nFilterError, ErrCode nStreamError )
+{
+ if (ERRCODE_NONE != nStreamError)
+ {
+ ErrorHandler::HandleError(nStreamError);
+ return;
+ }
+
+ TranslateId pId;
+
+ if( nFilterError == ERRCODE_GRFILTER_OPENERROR )
+ pId = STR_IMPORT_GRFILTER_OPENERROR;
+ else if( nFilterError == ERRCODE_GRFILTER_IOERROR )
+ pId = STR_IMPORT_GRFILTER_IOERROR;
+ else if( nFilterError == ERRCODE_GRFILTER_FORMATERROR )
+ pId = STR_IMPORT_GRFILTER_FORMATERROR;
+ else if( nFilterError == ERRCODE_GRFILTER_VERSIONERROR )
+ pId = STR_IMPORT_GRFILTER_VERSIONERROR;
+ else if( nFilterError == ERRCODE_GRFILTER_TOOBIG )
+ pId = STR_IMPORT_GRFILTER_TOOBIG;
+ else if( nFilterError == ERRCODE_NONE )
+ ;
+ else
+ pId = STR_IMPORT_GRFILTER_FILTERERROR;
+
+ if (pId && pId == STR_IMPORT_GRFILTER_IOERROR)
+ ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
+ else
+ {
+ std::unique_ptr<weld::MessageDialog> xErrorBox(Application::CreateMessageDialog(nullptr,
+ VclMessageType::Warning, VclButtonsType::Ok, pId ? SdResId(pId) : OUString()));
+ xErrorBox->run();
+ }
+}
+
+bool SdGRFFilter::Import()
+{
+ Graphic aGraphic;
+ const OUString aFileName( mrMedium.GetURLObject().GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
+ GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter();
+ const sal_uInt16 nFilter = rGraphicFilter.GetImportFormatNumberForTypeName( mrMedium.GetFilter()->GetTypeName() );
+ bool bRet = false;
+
+ SvStream* pIStm = mrMedium.GetInStream();
+ ErrCode nReturn = pIStm ? rGraphicFilter.ImportGraphic( aGraphic, aFileName, *pIStm, nFilter ) : ErrCode(1);
+
+ if( nReturn )
+ HandleGraphicFilterError( nReturn, rGraphicFilter.GetLastError() );
+ else
+ {
+ if( mrDocument.GetPageCount() == 0 )
+ mrDocument.CreateFirstPages();
+
+ SdPage* pPage = mrDocument.GetSdPage( 0, PageKind::Standard );
+ Point aPos;
+ Size aPagSize( pPage->GetSize() );
+ Size aGrfSize( OutputDevice::LogicToLogic( aGraphic.GetPrefSize(),
+ aGraphic.GetPrefMapMode(), MapMode(MapUnit::Map100thMM)));
+
+ aPagSize.AdjustWidth( -(pPage->GetLeftBorder() + pPage->GetRightBorder()) );
+ aPagSize.AdjustHeight( -(pPage->GetUpperBorder() + pPage->GetLowerBorder()) );
+
+ // scale to fit page
+ if ( ( ( aGrfSize.Height() > aPagSize.Height() ) || ( aGrfSize.Width() > aPagSize.Width() ) ) &&
+ aGrfSize.Height() && aPagSize.Height() )
+ {
+ double fGrfWH = static_cast<double>(aGrfSize.Width()) / aGrfSize.Height();
+ double fWinWH = static_cast<double>(aPagSize.Width()) / aPagSize.Height();
+
+ // adjust graphic to page size (scales)
+ if( fGrfWH < fWinWH )
+ {
+ aGrfSize.setWidth( static_cast<tools::Long>( aPagSize.Height() * fGrfWH ) );
+ aGrfSize.setHeight( aPagSize.Height() );
+ }
+ else if( fGrfWH > 0.F )
+ {
+ aGrfSize.setWidth( aPagSize.Width() );
+ aGrfSize.setHeight( static_cast<tools::Long>( aPagSize.Width() / fGrfWH ) );
+ }
+ }
+
+ // set output rectangle for graphic
+ aPos.setX( ( ( aPagSize.Width() - aGrfSize.Width() ) >> 1 ) + pPage->GetLeftBorder() );
+ aPos.setY( ( ( aPagSize.Height() - aGrfSize.Height() ) >> 1 ) + pPage->GetUpperBorder() );
+
+ pPage->InsertObject(
+ new SdrGrafObj(
+ pPage->getSdrModelFromSdrPage(),
+ aGraphic,
+ ::tools::Rectangle(aPos, aGrfSize)));
+ bRet = true;
+ }
+
+ return bRet;
+}
+
+bool SdGRFFilter::Export()
+{
+ // SJ: todo: error handling, the GraphicExportFilter does not support proper errorhandling
+ bool bRet = false;
+
+ uno::Reference< uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
+ uno::Reference< drawing::XGraphicExportFilter > xExporter = drawing::GraphicExportFilter::create( xContext );
+
+ SdPage* pPage = nullptr;
+ sd::DrawViewShell* pDrawViewShell = dynamic_cast<::sd::DrawViewShell* >(mrDocShell.GetViewShell() );
+
+ PageKind ePageKind = PageKind::Standard;
+ if( pDrawViewShell )
+ {
+ ePageKind = pDrawViewShell->GetPageKind();
+ if( PageKind::Handout == ePageKind )
+ pPage = mrDocument.GetSdPage( 0, PageKind::Handout );
+ else
+ pPage = pDrawViewShell->GetActualPage();
+ }
+ else
+ pPage = mrDocument.GetSdPage( 0, PageKind::Standard );
+
+ if ( pPage )
+ {
+ // taking the 'correct' page number, seems that there might exist a better method to archive this
+ pPage = mrDocument.GetSdPage( pPage->GetPageNum() ? ( pPage->GetPageNum() - 1 ) >> 1 : 0, ePageKind );
+ if ( pPage )
+ {
+ uno::Reference< lang::XComponent > xSource( pPage->getUnoPage(), uno::UNO_QUERY );
+ SfxItemSet* pSet = mrMedium.GetItemSet();
+ if ( pSet && xSource.is() )
+ {
+ const OUString aTypeName( mrMedium.GetFilter()->GetTypeName() );
+ GraphicFilter &rGraphicFilter = GraphicFilter::GetGraphicFilter();
+ const sal_uInt16 nFilter = rGraphicFilter.GetExportFormatNumberForTypeName( aTypeName );
+ if ( nFilter != GRFILTER_FORMAT_NOTFOUND )
+ {
+ uno::Reference< task::XInteractionHandler > xInteractionHandler;
+
+ beans::PropertyValues aArgs;
+ TransformItems( SID_SAVEASDOC, *pSet, aArgs );
+
+ static const OUStringLiteral sFilterName( u"FilterName" );
+ OUString sShortName( rGraphicFilter.GetExportFormatShortName( nFilter ) );
+
+ bool bFilterNameFound = false;
+ for ( auto& rArg : asNonConstRange(aArgs) )
+ {
+ OUString& rStr = rArg.Name;
+ if ( rStr == sFilterName )
+ {
+ bFilterNameFound = true;
+ rArg.Value <<= sShortName;
+ }
+ else if ( rStr == "InteractionHandler" )
+ {
+ uno::Reference< task::XInteractionHandler > xHdl;
+ if ( rArg.Value >>= xHdl )
+ {
+ xInteractionHandler = new SdGRFFilter_ImplInteractionHdl( xHdl );
+ rArg.Value <<= xInteractionHandler;
+ }
+ }
+ }
+ if ( !bFilterNameFound )
+ {
+ sal_Int32 nCount = aArgs.getLength();
+ aArgs.realloc( nCount + 1 );
+ auto pArgs = aArgs.getArray();
+ pArgs[ nCount ].Name = sFilterName;
+ pArgs[ nCount ].Value <<= sShortName;
+ }
+
+ // take selection if needed
+ if( ( SfxItemState::SET == pSet->GetItemState( SID_SELECTION ) )
+ && pSet->Get( SID_SELECTION ).GetValue()
+ && pDrawViewShell )
+ {
+ uno::Reference< view::XSelectionSupplier > xSelectionSupplier(
+ pDrawViewShell->GetViewShellBase().GetController(), uno::UNO_QUERY );
+ if ( xSelectionSupplier.is() )
+ {
+ uno::Any aSelection( xSelectionSupplier->getSelection() );
+ uno::Reference< lang::XComponent > xSelection;
+ if ( aSelection >>= xSelection )
+ xSource = xSelection;
+ }
+ }
+ xExporter->setSourceDocument( xSource );
+ bRet = xExporter->filter( aArgs );
+ if ( !bRet && xInteractionHandler.is() )
+ SdGRFFilter::HandleGraphicFilterError(
+ static_cast< SdGRFFilter_ImplInteractionHdl* >( xInteractionHandler.get() )->GetErrorCode(),
+ rGraphicFilter.GetLastError() );
+ }
+ }
+ }
+ }
+ return bRet;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/html/HtmlOptionsDialog.cxx b/sd/source/filter/html/HtmlOptionsDialog.cxx
new file mode 100644
index 000000000..78939dc4d
--- /dev/null
+++ b/sd/source/filter/html/HtmlOptionsDialog.cxx
@@ -0,0 +1,203 @@
+/* -*- 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 <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/uno/Any.h>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/beans/XPropertyAccess.hpp>
+#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
+#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
+#include <com/sun/star/document/XExporter.hpp>
+#include <cppuhelper/implbase.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <vcl/svapp.hxx>
+
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::document;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::ui::dialogs;
+
+#include <pres.hxx>
+#include <sdabstdlg.hxx>
+
+namespace {
+
+class SdHtmlOptionsDialog : public cppu::WeakImplHelper
+<
+ XExporter,
+ XExecutableDialog,
+ XPropertyAccess,
+ XInitialization,
+ XServiceInfo
+>
+{
+ Sequence< PropertyValue > maMediaDescriptor;
+ Sequence< PropertyValue > maFilterDataSequence;
+ DocumentType meDocType;
+
+public:
+
+ SdHtmlOptionsDialog();
+
+ // XInterface
+ virtual void SAL_CALL acquire() noexcept override;
+ virtual void SAL_CALL release() noexcept override;
+
+ // XInitialization
+ virtual void SAL_CALL initialize( const Sequence< Any > & aArguments ) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
+ virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
+
+ // XPropertyAccess
+ virtual Sequence< PropertyValue > SAL_CALL getPropertyValues() override;
+ virtual void SAL_CALL setPropertyValues( const css::uno::Sequence< css::beans::PropertyValue > & aProps ) override;
+
+ // XExecuteDialog
+ virtual sal_Int16 SAL_CALL execute() override;
+ virtual void SAL_CALL setTitle( const OUString& aTitle ) override;
+
+ // XExporter
+ virtual void SAL_CALL setSourceDocument( const css::uno::Reference< css::lang::XComponent >& xDoc ) override;
+
+};
+
+}
+
+SdHtmlOptionsDialog::SdHtmlOptionsDialog() :
+ meDocType ( DocumentType::Draw )
+{
+}
+
+void SAL_CALL SdHtmlOptionsDialog::acquire() noexcept
+{
+ OWeakObject::acquire();
+}
+
+void SAL_CALL SdHtmlOptionsDialog::release() noexcept
+{
+ OWeakObject::release();
+}
+
+// XInitialization
+void SAL_CALL SdHtmlOptionsDialog::initialize( const Sequence< Any > & )
+{
+}
+
+// XServiceInfo
+OUString SAL_CALL SdHtmlOptionsDialog::getImplementationName()
+{
+ return "com.sun.star.comp.draw.SdHtmlOptionsDialog";
+}
+
+sal_Bool SAL_CALL SdHtmlOptionsDialog::supportsService( const OUString& rServiceName )
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+Sequence< OUString > SAL_CALL SdHtmlOptionsDialog::getSupportedServiceNames()
+{
+ return { "com.sun.star.ui.dialog.FilterOptionsDialog" };
+}
+
+// XPropertyAccess
+Sequence< PropertyValue > SdHtmlOptionsDialog::getPropertyValues()
+{
+ auto pProp = std::find_if(std::cbegin(maMediaDescriptor), std::cend(maMediaDescriptor),
+ [](const PropertyValue& rProp) { return rProp.Name == "FilterData"; });
+ auto i = static_cast<sal_Int32>(std::distance(std::cbegin(maMediaDescriptor), pProp));
+ sal_Int32 nCount = maMediaDescriptor.getLength();
+ if ( i == nCount )
+ maMediaDescriptor.realloc( ++nCount );
+
+ // the "FilterData" Property is an Any that will contain our PropertySequence of Values
+ auto& el = maMediaDescriptor.getArray()[ i ];
+ el.Name = "FilterData";
+ el.Value <<= maFilterDataSequence;
+ return maMediaDescriptor;
+}
+
+void SdHtmlOptionsDialog::setPropertyValues( const Sequence< PropertyValue > & aProps )
+{
+ maMediaDescriptor = aProps;
+
+ auto pProp = std::find_if(std::cbegin(maMediaDescriptor), std::cend(maMediaDescriptor),
+ [](const PropertyValue& rProp) { return rProp.Name == "FilterData"; });
+ if (pProp != std::cend(maMediaDescriptor))
+ pProp->Value >>= maFilterDataSequence;
+}
+
+// XExecutableDialog
+void SdHtmlOptionsDialog::setTitle( const OUString& )
+{
+}
+
+sal_Int16 SdHtmlOptionsDialog::execute()
+{
+ sal_Int16 nRet = ExecutableDialogResults::CANCEL;
+
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractSdPublishingDlg> pDlg(pFact->CreateSdPublishingDlg(nullptr /*TODO*/, meDocType));
+ if( pDlg->Execute() )
+ {
+ pDlg->GetParameterSequence( maFilterDataSequence );
+ nRet = ExecutableDialogResults::OK;
+ }
+ else
+ {
+ nRet = ExecutableDialogResults::CANCEL;
+ }
+ return nRet;
+}
+
+// XEmporter
+void SdHtmlOptionsDialog::setSourceDocument( const Reference< XComponent >& xDoc )
+{
+ // try to set the corresponding metric unit
+ Reference< XServiceInfo > xServiceInfo(xDoc, UNO_QUERY);
+ if ( xServiceInfo.is() )
+ {
+ if ( xServiceInfo->supportsService( "com.sun.star.presentation.PresentationDocument" ) )
+ {
+ meDocType = DocumentType::Impress;
+ return;
+ }
+ else if ( xServiceInfo->supportsService( "com.sun.star.drawing.DrawingDocument" ) )
+ {
+ meDocType = DocumentType::Draw;
+ return;
+ }
+ }
+ throw IllegalArgumentException();
+}
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_draw_SdHtmlOptionsDialog_get_implementation(css::uno::XComponentContext*,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new SdHtmlOptionsDialog());
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/html/buttonset.cxx b/sd/source/filter/html/buttonset.cxx
new file mode 100644
index 000000000..3929f7422
--- /dev/null
+++ b/sd/source/filter/html/buttonset.cxx
@@ -0,0 +1,290 @@
+/* -*- 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 <com/sun/star/embed/ElementModes.hpp>
+#include <com/sun/star/embed/XStorage.hpp>
+#include <com/sun/star/graphic/GraphicProvider.hpp>
+#include <com/sun/star/graphic/XGraphicProvider.hpp>
+#include <com/sun/star/io/XStream.hpp>
+
+#include <o3tl/safeint.hxx>
+#include <osl/file.hxx>
+#include <comphelper/storagehelper.hxx>
+#include <comphelper/oslfile2streamwrap.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <vcl/graph.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/image.hxx>
+#include <unotools/pathoptions.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <memory>
+
+#include "buttonset.hxx"
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::graphic;
+using namespace ::com::sun::star::embed;
+using namespace ::com::sun::star::io;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::lang;
+
+namespace {
+
+class ButtonsImpl
+{
+public:
+ explicit ButtonsImpl( const OUString& rURL );
+
+ Reference< XInputStream > getInputStream( const OUString& rName );
+
+ bool getGraphic( const Reference< XGraphicProvider >& xGraphicProvider, const OUString& rName, Graphic& rGraphic );
+
+ bool copyGraphic( const OUString& rName, const OUString& rPath );
+
+private:
+ Reference< XStorage > mxStorage;
+};
+
+}
+
+ButtonsImpl::ButtonsImpl( const OUString& rURL )
+{
+ try
+ {
+ mxStorage = comphelper::OStorageHelper::GetStorageOfFormatFromURL( ZIP_STORAGE_FORMAT_STRING, rURL, ElementModes::READ );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::ButtonsImpl::ButtonsImpl()" );
+ }
+}
+
+Reference< XInputStream > ButtonsImpl::getInputStream( const OUString& rName )
+{
+ Reference< XInputStream > xInputStream;
+ if( mxStorage.is() ) try
+ {
+ Reference< XStream > xStream( mxStorage->openStreamElement( rName, ElementModes::READ ) );
+ if( xStream.is() )
+ xInputStream = xStream->getInputStream();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::ButtonsImpl::getInputStream()" );
+ }
+ return xInputStream;
+}
+
+bool ButtonsImpl::getGraphic( const Reference< XGraphicProvider >& xGraphicProvider, const OUString& rName, Graphic& rGraphic )
+{
+ Reference< XInputStream > xInputStream( getInputStream( rName ) );
+ if( xInputStream.is() && xGraphicProvider.is() ) try
+ {
+ Sequence< PropertyValue > aMediaProperties{ comphelper::makePropertyValue(
+ "InputStream", xInputStream) };
+ Reference< XGraphic > xGraphic( xGraphicProvider->queryGraphic( aMediaProperties ) );
+
+ if( xGraphic.is() )
+ {
+ rGraphic = Graphic( xGraphic );
+ return true;
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::ButtonsImpl::getGraphic()" );
+ }
+ return false;
+}
+
+bool ButtonsImpl::copyGraphic( const OUString& rName, const OUString& rPath )
+{
+ Reference< XInputStream > xInput( getInputStream( rName ) );
+ if( xInput.is() ) try
+ {
+ osl::File::remove( rPath );
+ osl::File aOutputFile( rPath );
+ if( aOutputFile.open( osl_File_OpenFlag_Write|osl_File_OpenFlag_Create ) == osl::FileBase::E_None )
+ {
+ Reference< XOutputStream > xOutput( new comphelper::OSLOutputStreamWrapper( aOutputFile ) );
+ comphelper::OStorageHelper::CopyInputToOutput( xInput, xOutput );
+ return true;
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::ButtonsImpl::copyGraphic()" );
+ }
+
+ return false;
+}
+
+class ButtonSetImpl
+{
+public:
+ ButtonSetImpl();
+
+ int getCount() const;
+
+ bool getPreview( int nSet, const std::vector< OUString >& rButtons, Image& rImage );
+ bool exportButton( int nSet, const OUString& rPath, const OUString& rName );
+
+ void scanForButtonSets( const OUString& rPath );
+
+ Reference< XGraphicProvider > const & getGraphicProvider();
+
+ std::vector< std::shared_ptr< ButtonsImpl > > maButtons;
+ Reference< XGraphicProvider > mxGraphicProvider;
+};
+
+ButtonSetImpl::ButtonSetImpl()
+{
+ static const char sSubPath[] = "/wizard/web/buttons" ;
+
+ OUString sSharePath = SvtPathOptions().GetConfigPath() +
+ sSubPath;
+ scanForButtonSets( sSharePath );
+
+ OUString sUserPath = SvtPathOptions().GetUserConfigPath() +
+ sSubPath;
+ scanForButtonSets( sUserPath );
+}
+
+void ButtonSetImpl::scanForButtonSets( const OUString& rPath )
+{
+ osl::Directory aDirectory( rPath );
+ if( aDirectory.open() != osl::FileBase::E_None )
+ return;
+
+ osl::DirectoryItem aItem;
+ while( aDirectory.getNextItem( aItem, 2211 ) == osl::FileBase::E_None )
+ {
+ osl::FileStatus aStatus( osl_FileStatus_Mask_FileName|osl_FileStatus_Mask_FileURL );
+ if( aItem.getFileStatus( aStatus ) == osl::FileBase::E_None )
+ {
+ OUString sFileName( aStatus.getFileName() );
+ if( sFileName.endsWithIgnoreAsciiCase( ".zip" ) )
+ maButtons.push_back( std::make_shared< ButtonsImpl >( aStatus.getFileURL() ) );
+ }
+ }
+}
+
+int ButtonSetImpl::getCount() const
+{
+ return maButtons.size();
+}
+
+bool ButtonSetImpl::getPreview( int nSet, const std::vector< OUString >& rButtons, Image& rImage )
+{
+ if( (nSet >= 0) && (o3tl::make_unsigned(nSet) < maButtons.size()))
+ {
+ ButtonsImpl& rSet = *maButtons[nSet];
+
+ std::vector< Graphic > aGraphics;
+
+ ScopedVclPtrInstance< VirtualDevice > pDev;
+ pDev->SetMapMode(MapMode(MapUnit::MapPixel));
+
+ Size aSize;
+ std::vector< OUString >::const_iterator aIter( rButtons.begin() );
+ while( aIter != rButtons.end() )
+ {
+ Graphic aGraphic;
+ if( !rSet.getGraphic( getGraphicProvider(), (*aIter++), aGraphic ) )
+ return false;
+
+ aGraphics.push_back(aGraphic);
+
+ Size aGraphicSize( aGraphic.GetSizePixel( pDev ) );
+ aSize.AdjustWidth(aGraphicSize.Width() );
+
+ if( aSize.Height() < aGraphicSize.Height() )
+ aSize.setHeight( aGraphicSize.Height() );
+
+ if( aIter != rButtons.end() )
+ aSize.AdjustWidth(3 );
+ }
+
+ pDev->SetOutputSizePixel( aSize );
+
+ Point aPos;
+
+ for( const Graphic& aGraphic : aGraphics )
+ {
+ aGraphic.Draw(*pDev, aPos);
+
+ aPos.AdjustX(aGraphic.GetSizePixel().Width() + 3 );
+ }
+
+ rImage = Image( pDev->GetBitmapEx( Point(), aSize ) );
+ return true;
+ }
+ return false;
+}
+
+bool ButtonSetImpl::exportButton( int nSet, const OUString& rPath, const OUString& rName )
+{
+ if( (nSet >= 0) && (o3tl::make_unsigned(nSet) < maButtons.size()))
+ {
+ ButtonsImpl& rSet = *maButtons[nSet];
+
+ return rSet.copyGraphic( rName, rPath );
+ }
+ return false;
+}
+
+Reference< XGraphicProvider > const & ButtonSetImpl::getGraphicProvider()
+{
+ if( !mxGraphicProvider.is() )
+ {
+ Reference< XComponentContext > xComponentContext = ::comphelper::getProcessComponentContext();
+ mxGraphicProvider = GraphicProvider::create(xComponentContext);
+ }
+ return mxGraphicProvider;
+}
+
+ButtonSet::ButtonSet()
+: mpImpl( new ButtonSetImpl() )
+{
+}
+
+ButtonSet::~ButtonSet()
+{
+}
+
+int ButtonSet::getCount() const
+{
+ return mpImpl->getCount();
+}
+
+bool ButtonSet::getPreview( int nSet, const std::vector< OUString >& rButtons, Image& rImage )
+{
+ return mpImpl->getPreview( nSet, rButtons, rImage );
+}
+
+bool ButtonSet::exportButton( int nSet, const OUString& rPath, const OUString& rName )
+{
+ return mpImpl->exportButton( nSet, rPath, rName );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/html/buttonset.hxx b/sd/source/filter/html/buttonset.hxx
new file mode 100644
index 000000000..4289c10e9
--- /dev/null
+++ b/sd/source/filter/html/buttonset.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sddllapi.h>
+
+#include <rtl/ustring.hxx>
+#include <vector>
+#include <memory>
+
+class Image;
+class ButtonSetImpl;
+
+class SD_DLLPUBLIC ButtonSet
+{
+public:
+ ButtonSet();
+ ~ButtonSet();
+
+ int getCount() const;
+
+ bool getPreview(int nSet, const std::vector<OUString>& rButtons, Image& rImage);
+ bool exportButton(int nSet, const OUString& rPath, const OUString& rName);
+
+private:
+ std::unique_ptr<ButtonSetImpl> mpImpl;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/html/htmlattr.cxx b/sd/source/filter/html/htmlattr.cxx
new file mode 100644
index 000000000..b89ac9b6b
--- /dev/null
+++ b/sd/source/filter/html/htmlattr.cxx
@@ -0,0 +1,72 @@
+/* -*- 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 "htmlattr.hxx"
+#include <sdresid.hxx>
+#include <strings.hrc>
+#include <vcl/outdev.hxx>
+
+SdHtmlAttrPreview::SdHtmlAttrPreview()
+{
+}
+
+SdHtmlAttrPreview::~SdHtmlAttrPreview()
+{
+}
+
+void SdHtmlAttrPreview::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect)
+{
+ ::tools::Rectangle aTextRect;
+ aTextRect.SetSize(GetOutputSizePixel());
+
+ rRenderContext.SetLineColor(m_aBackColor);
+ rRenderContext.SetFillColor(m_aBackColor);
+ rRenderContext.DrawRect(rRect);
+ rRenderContext.SetFillColor();
+
+ int nHeight = (aTextRect.Bottom() - aTextRect.Top()) >> 2;
+ aTextRect.SetBottom( nHeight + aTextRect.Top() );
+
+ rRenderContext.SetTextColor(m_aTextColor);
+ rRenderContext.DrawText(aTextRect, SdResId(STR_HTMLATTR_TEXT), DrawTextFlags::Center | DrawTextFlags::VCenter);
+
+ aTextRect.Move(0,nHeight);
+ rRenderContext.SetTextColor(m_aLinkColor);
+ rRenderContext.DrawText(aTextRect, SdResId(STR_HTMLATTR_LINK), DrawTextFlags::Center | DrawTextFlags::VCenter);
+
+ aTextRect.Move(0,nHeight);
+ rRenderContext.SetTextColor(m_aALinkColor);
+ rRenderContext.DrawText(aTextRect, SdResId(STR_HTMLATTR_ALINK), DrawTextFlags::Center | DrawTextFlags::VCenter);
+
+ aTextRect.Move(0,nHeight);
+ rRenderContext.SetTextColor(m_aVLinkColor);
+ rRenderContext.DrawText(aTextRect, SdResId(STR_HTMLATTR_VLINK), DrawTextFlags::Center | DrawTextFlags::VCenter);
+}
+
+void SdHtmlAttrPreview::SetColors(Color const & aBack, Color const & aText, Color const & aLink,
+ Color const & aVLink, Color const & aALink)
+{
+ m_aBackColor = aBack;
+ m_aTextColor = aText;
+ m_aLinkColor = aLink;
+ m_aVLinkColor = aVLink;
+ m_aALinkColor = aALink;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/html/htmlattr.hxx b/sd/source/filter/html/htmlattr.hxx
new file mode 100644
index 000000000..bf80b9e4b
--- /dev/null
+++ b/sd/source/filter/html/htmlattr.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <vcl/customweld.hxx>
+#include <tools/color.hxx>
+
+class SdHtmlAttrPreview final : public weld::CustomWidgetController
+{
+ Color m_aBackColor, m_aTextColor, m_aLinkColor;
+ Color m_aVLinkColor, m_aALinkColor;
+
+public:
+ SdHtmlAttrPreview();
+ virtual ~SdHtmlAttrPreview() override;
+
+ virtual void Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect) override;
+
+ void SetColors( Color const & aBack, Color const & aText, Color const & aLink,
+ Color const & aVLink, Color const & aALink );
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/html/htmlex.cxx b/sd/source/filter/html/htmlex.cxx
new file mode 100644
index 000000000..072ac3c27
--- /dev/null
+++ b/sd/source/filter/html/htmlex.cxx
@@ -0,0 +1,3186 @@
+/* -*- 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 "htmlex.hxx"
+#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+#include <com/sun/star/drawing/GraphicExportFilter.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <com/sun/star/ucb/SimpleFileAccess.hpp>
+
+#include <sal/log.hxx>
+#include <rtl/tencinfo.h>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <o3tl/safeint.hxx>
+#include <osl/file.hxx>
+#include <unotools/pathoptions.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <sfx2/frmhtmlw.hxx>
+#include <sfx2/progress.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <svx/svditer.hxx>
+#include <vcl/imaprect.hxx>
+#include <vcl/imapcirc.hxx>
+#include <vcl/imappoly.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/editobj.hxx>
+#include <svx/svdopath.hxx>
+#include <svtools/htmlout.hxx>
+#include <svtools/colorcfg.hxx>
+#include <editeng/colritem.hxx>
+#include <editeng/editeng.hxx>
+#include <editeng/wghtitem.hxx>
+#include <editeng/udlnitem.hxx>
+#include <editeng/postitem.hxx>
+#include <editeng/crossedoutitem.hxx>
+#include <editeng/flditem.hxx>
+#include <svl/style.hxx>
+#include <editeng/frmdiritem.hxx>
+#include <svx/svdoutl.hxx>
+#include <svx/svdogrp.hxx>
+#include <svx/svdotable.hxx>
+#include <svx/ImageMapInfo.hxx>
+#include <tools/urlobj.hxx>
+#include <svtools/sfxecode.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <tools/debug.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include "htmlpublishmode.hxx"
+#include <Outliner.hxx>
+#include <sdpage.hxx>
+#include <strings.hrc>
+#include <strings.hxx>
+#include <anminfo.hxx>
+#include <sdresid.hxx>
+#include "buttonset.hxx"
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::document;
+
+using namespace sdr::table;
+
+// get parameter from Itemset
+#define RESTOHTML( res ) StringToHTMLString(SdResId(res))
+
+const char * const pButtonNames[] =
+{
+ "first-inactive.png",
+ "first.png",
+ "left-inactive.png",
+ "left.png",
+ "right-inactive.png",
+ "right.png",
+ "last-inactive.png",
+ "last.png",
+ "home.png",
+ "text.png",
+ "expand.png",
+ "collapse.png",
+};
+
+#define BTN_FIRST_0 0
+#define BTN_FIRST_1 1
+#define BTN_PREV_0 2
+#define BTN_PREV_1 3
+#define BTN_NEXT_0 4
+#define BTN_NEXT_1 5
+#define BTN_LAST_0 6
+#define BTN_LAST_1 7
+#define BTN_INDEX 8
+#define BTN_TEXT 9
+#define BTN_MORE 10
+#define BTN_LESS 11
+
+namespace {
+
+// Helper class for the simple creation of files local/remote
+class EasyFile
+{
+private:
+ std::unique_ptr<SvStream> pOStm;
+ bool bOpen;
+
+public:
+
+ EasyFile();
+ ~EasyFile();
+
+ ErrCode createStream( const OUString& rUrl, SvStream*& rpStr );
+ void createFileName( const OUString& rUrl, OUString& rFileName );
+ void close();
+};
+
+}
+
+// Helper class for the embedding of text attributes into the html output
+class HtmlState
+{
+private:
+ bool mbColor;
+ bool mbWeight;
+ bool mbItalic;
+ bool mbUnderline;
+ bool mbStrike;
+ bool mbLink;
+ Color maColor;
+ Color maDefColor;
+ OUString maLink;
+ OUString maTarget;
+
+public:
+ explicit HtmlState( Color aDefColor );
+
+ OUString SetWeight( bool bWeight );
+ OUString SetItalic( bool bItalic );
+ OUString SetUnderline( bool bUnderline );
+ OUString SetColor( Color aColor );
+ OUString SetStrikeout( bool bStrike );
+ OUString SetLink( const OUString& aLink, const OUString& aTarget );
+ OUString Flush();
+};
+
+// close all still open tags
+OUString HtmlState::Flush()
+{
+ OUString aStr = SetWeight(false)
+ + SetItalic(false)
+ + SetUnderline(false)
+ + SetStrikeout(false)
+ + SetColor(maDefColor)
+ + SetLink("","");
+
+ return aStr;
+}
+
+// c'tor with default color for the page
+HtmlState::HtmlState( Color aDefColor )
+ : mbColor(false),
+ mbWeight(false),
+ mbItalic(false),
+ mbUnderline(false),
+ mbStrike(false),
+ mbLink(false),
+ maDefColor(aDefColor)
+{
+}
+
+// enables/disables bold print
+OUString HtmlState::SetWeight( bool bWeight )
+{
+ OUString aStr;
+
+ if(bWeight && !mbWeight)
+ aStr = "<b>";
+ else if(!bWeight && mbWeight)
+ aStr = "</b>";
+
+ mbWeight = bWeight;
+ return aStr;
+}
+
+// enables/disables italic
+
+OUString HtmlState::SetItalic( bool bItalic )
+{
+ OUString aStr;
+
+ if(bItalic && !mbItalic)
+ aStr = "<i>";
+ else if(!bItalic && mbItalic)
+ aStr = "</i>";
+
+ mbItalic = bItalic;
+ return aStr;
+}
+
+// enables/disables underlines
+
+OUString HtmlState::SetUnderline( bool bUnderline )
+{
+ OUString aStr;
+
+ if(bUnderline && !mbUnderline)
+ aStr = "<u>";
+ else if(!bUnderline && mbUnderline)
+ aStr = "</u>";
+
+ mbUnderline = bUnderline;
+ return aStr;
+}
+
+// enables/disables strike through
+OUString HtmlState::SetStrikeout( bool bStrike )
+{
+ OUString aStr;
+
+ if(bStrike && !mbStrike)
+ aStr = "<strike>";
+ else if(!bStrike && mbStrike)
+ aStr = "</strike>";
+
+ mbStrike = bStrike;
+ return aStr;
+}
+
+// Sets the specified text color
+OUString HtmlState::SetColor( Color aColor )
+{
+ OUString aStr;
+
+ if(mbColor && aColor == maColor)
+ return aStr;
+
+ if(mbColor)
+ {
+ aStr = "</font>";
+ mbColor = false;
+ }
+
+ if(aColor != maDefColor)
+ {
+ maColor = aColor;
+ aStr += "<font color=\"" + HtmlExport::ColorToHTMLString(aColor) + "\">";
+ mbColor = true;
+ }
+
+ return aStr;
+}
+
+// enables/disables a hyperlink
+OUString HtmlState::SetLink( const OUString& aLink, const OUString& aTarget )
+{
+ OUString aStr;
+
+ if(mbLink&&maLink == aLink&&maTarget==aTarget)
+ return aStr;
+
+ if(mbLink)
+ {
+ aStr = "</a>";
+ mbLink = false;
+ }
+
+ if (!aLink.isEmpty())
+ {
+ aStr += "<a href=\"" + aLink;
+ if (!aTarget.isEmpty())
+ {
+ aStr += "\" target=\"" + aTarget;
+ }
+ aStr += "\">";
+ mbLink = true;
+ maLink = aLink;
+ maTarget = aTarget;
+ }
+
+ return aStr;
+}
+namespace
+{
+
+OUString getParagraphStyle( const SdrOutliner* pOutliner, sal_Int32 nPara )
+{
+ SfxItemSet aParaSet( pOutliner->GetParaAttribs( nPara ) );
+
+ OUString sStyle;
+
+ if( aParaSet.GetItem<SvxFrameDirectionItem>( EE_PARA_WRITINGDIR )->GetValue() == SvxFrameDirection::Horizontal_RL_TB )
+ {
+
+ sStyle = "direction: rtl;";
+ }
+ else
+ {
+ // This is the default so don't write it out
+ // sStyle += "direction: ltr;";
+ }
+ return sStyle;
+}
+
+void lclAppendStyle(OUStringBuffer& aBuffer, std::u16string_view aTag, std::u16string_view aStyle)
+{
+ if (aStyle.empty())
+ aBuffer.append(OUString::Concat("<") + aTag + ">");
+ else
+ aBuffer.append(OUString::Concat("<") + aTag + " style=\"" + aStyle + "\">");
+}
+
+} // anonymous namespace
+
+constexpr OUStringLiteral gaHTMLHeader(
+ u"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\r\n"
+ " \"http://www.w3.org/TR/html4/transitional.dtd\">\r\n"
+ "<html>\r\n<head>\r\n" );
+
+constexpr OUStringLiteral gaHTMLExtension = u"" STR_HTMLEXP_DEFAULT_EXTENSION;
+
+// constructor for the html export helper classes
+HtmlExport::HtmlExport(
+ const OUString& aPath,
+ const Sequence< PropertyValue >& rParams,
+ SdDrawDocument* pExpDoc,
+ sd::DrawDocShell* pDocShell )
+ : maPath( aPath ),
+ mpDoc(pExpDoc),
+ mpDocSh( pDocShell ),
+ meMode( PUBLISH_SINGLE_DOCUMENT ),
+ mbContentsPage(false),
+ mnButtonThema(-1),
+ mnWidthPixel( PUB_MEDRES_WIDTH ),
+ meFormat( FORMAT_JPG ),
+ mbNotes(false),
+ mnCompression( -1 ),
+ mbDownload( false ),
+ mbSlideSound(true),
+ mbHiddenSlides(true),
+ mbUserAttr(false),
+ maTextColor(COL_BLACK),
+ maBackColor(COL_WHITE),
+ mbDocColors(false),
+ maIndexUrl("index"),
+ meScript( SCRIPT_ASP ),
+ mpButtonSet( new ButtonSet() )
+{
+ bool bChange = mpDoc->IsChanged();
+
+ maIndexUrl += gaHTMLExtension;
+
+ InitExportParameters( rParams );
+
+ switch( meMode )
+ {
+ case PUBLISH_HTML:
+ case PUBLISH_FRAMES:
+ ExportHtml();
+ break;
+ case PUBLISH_WEBCAST:
+ ExportWebCast();
+ break;
+ case PUBLISH_KIOSK:
+ ExportKiosk();
+ break;
+ case PUBLISH_SINGLE_DOCUMENT:
+ ExportSingleDocument();
+ break;
+ }
+
+ mpDoc->SetChanged(bChange);
+}
+
+HtmlExport::~HtmlExport()
+{
+}
+
+// get common export parameters from item set
+void HtmlExport::InitExportParameters( const Sequence< PropertyValue >& rParams )
+{
+ mbImpress = mpDoc->GetDocumentType() == DocumentType::Impress;
+
+ OUString aStr;
+ for( const PropertyValue& rParam : rParams )
+ {
+ if ( rParam.Name == "PublishMode" )
+ {
+ sal_Int32 temp = 0;
+ rParam.Value >>= temp;
+ meMode = static_cast<HtmlPublishMode>(temp);
+ }
+ else if ( rParam.Name == "IndexURL" )
+ {
+ rParam.Value >>= aStr;
+ maIndexUrl = aStr;
+ }
+ else if ( rParam.Name == "Format" )
+ {
+ sal_Int32 temp = 0;
+ rParam.Value >>= temp;
+ meFormat = static_cast<PublishingFormat>(temp);
+ }
+ else if ( rParam.Name == "Compression" )
+ {
+ rParam.Value >>= aStr;
+ OUString aTmp( aStr );
+ if(!aTmp.isEmpty())
+ {
+ aTmp = aTmp.replaceFirst("%", "");
+ mnCompression = static_cast<sal_Int16>(aTmp.toInt32());
+ }
+ }
+ else if ( rParam.Name == "Width" )
+ {
+ sal_Int32 temp = 0;
+ rParam.Value >>= temp;
+ mnWidthPixel = static_cast<sal_uInt16>(temp);
+ }
+ else if ( rParam.Name == "UseButtonSet" )
+ {
+ sal_Int32 temp = 0;
+ rParam.Value >>= temp;
+ mnButtonThema = static_cast<sal_Int16>(temp);
+ }
+ else if ( rParam.Name == "IsExportNotes" )
+ {
+ if( mbImpress )
+ {
+ bool temp = false;
+ rParam.Value >>= temp;
+ mbNotes = temp;
+ }
+ }
+ else if ( rParam.Name == "IsExportContentsPage" )
+ {
+ bool temp = false;
+ rParam.Value >>= temp;
+ mbContentsPage = temp;
+ }
+ else if ( rParam.Name == "Author" )
+ {
+ rParam.Value >>= aStr;
+ maAuthor = aStr;
+ }
+ else if ( rParam.Name == "EMail" )
+ {
+ rParam.Value >>= aStr;
+ maEMail = aStr;
+ }
+ else if ( rParam.Name == "HomepageURL" )
+ {
+ rParam.Value >>= aStr;
+ maHomePage = aStr;
+ }
+ else if ( rParam.Name == "UserText" )
+ {
+ rParam.Value >>= aStr;
+ maInfo = aStr;
+ }
+ else if ( rParam.Name == "EnableDownload" )
+ {
+ bool temp = false;
+ rParam.Value >>= temp;
+ mbDownload = temp;
+ }
+ else if ( rParam.Name == "SlideSound" )
+ {
+ bool temp = true;
+ rParam.Value >>= temp;
+ mbSlideSound = temp;
+ }
+ else if ( rParam.Name == "HiddenSlides" )
+ {
+ bool temp = true;
+ rParam.Value >>= temp;
+ mbHiddenSlides = temp;
+ }
+ else if ( rParam.Name == "BackColor" )
+ {
+ Color temp;
+ rParam.Value >>= temp;
+ maBackColor = temp;
+ mbUserAttr = true;
+ }
+ else if ( rParam.Name == "TextColor" )
+ {
+ Color temp;
+ rParam.Value >>= temp;
+ maTextColor = temp;
+ mbUserAttr = true;
+ }
+ else if ( rParam.Name == "LinkColor" )
+ {
+ Color temp ;
+ rParam.Value >>= temp;
+ maLinkColor = temp;
+ mbUserAttr = true;
+ }
+ else if ( rParam.Name == "VLinkColor" )
+ {
+ Color temp;
+ rParam.Value >>= temp;
+ maVLinkColor = temp;
+ mbUserAttr = true;
+ }
+ else if ( rParam.Name == "ALinkColor" )
+ {
+ Color temp;
+ rParam.Value >>= temp;
+ maALinkColor = temp;
+ mbUserAttr = true;
+ }
+ else if ( rParam.Name == "IsUseDocumentColors" )
+ {
+ bool temp = false;
+ rParam.Value >>= temp;
+ mbDocColors = temp;
+ }
+ else if ( rParam.Name == "KioskSlideDuration" )
+ {
+ double temp = 0.0;
+ rParam.Value >>= temp;
+ mfSlideDuration = temp;
+ mbAutoSlide = true;
+ }
+ else if ( rParam.Name == "KioskEndless" )
+ {
+ bool temp = false;
+ rParam.Value >>= temp;
+ mbEndless = temp;
+ }
+ else if ( rParam.Name == "WebCastCGIURL" )
+ {
+ rParam.Value >>= aStr;
+ maCGIPath = aStr;
+ }
+ else if ( rParam.Name == "WebCastTargetURL" )
+ {
+ rParam.Value >>= aStr;
+ maURLPath = aStr;
+ }
+ else if ( rParam.Name == "WebCastScriptLanguage" )
+ {
+ rParam.Value >>= aStr;
+ if ( aStr == "asp" )
+ {
+ meScript = SCRIPT_ASP;
+ }
+ else
+ {
+ meScript = SCRIPT_PERL;
+ }
+ }
+ else
+ {
+ OSL_FAIL("Unknown property for html export detected!");
+ }
+ }
+
+ if( meMode == PUBLISH_KIOSK )
+ {
+ mbContentsPage = false;
+ mbNotes = false;
+
+ }
+
+ // calculate image sizes
+ SdPage* pPage = mpDoc->GetSdPage(0, PageKind::Standard);
+ Size aTmpSize( pPage->GetSize() );
+ double dRatio=static_cast<double>(aTmpSize.Width())/aTmpSize.Height();
+
+ mnHeightPixel = static_cast<sal_uInt16>(mnWidthPixel/dRatio);
+
+ // we come up with a destination...
+
+ INetURLObject aINetURLObj( maPath );
+ DBG_ASSERT( aINetURLObj.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
+
+ maExportPath = aINetURLObj.GetPartBeforeLastName(); // with trailing '/'
+ maIndex = aINetURLObj.GetLastName();
+
+ mnSdPageCount = mpDoc->GetSdPageCount( PageKind::Standard );
+ for( sal_uInt16 nPage = 0; nPage < mnSdPageCount; nPage++ )
+ {
+ pPage = mpDoc->GetSdPage( nPage, PageKind::Standard );
+
+ if( mbHiddenSlides || !pPage->IsExcluded() )
+ {
+ maPages.push_back( pPage );
+ maNotesPages.push_back( mpDoc->GetSdPage( nPage, PageKind::Notes ) );
+ }
+ }
+ mnSdPageCount = maPages.size();
+
+ mbFrames = meMode == PUBLISH_FRAMES;
+
+ maDocFileName = maIndex;
+}
+
+void HtmlExport::ExportSingleDocument()
+{
+ SdrOutliner* pOutliner = mpDoc->GetInternalOutliner();
+
+ maPageNames.resize(mnSdPageCount);
+
+ mnPagesWritten = 0;
+ InitProgress(mnSdPageCount);
+
+ OUStringBuffer aStr(gaHTMLHeader);
+ aStr.append(DocumentMetadata());
+ aStr.append("\r\n");
+ aStr.append("</head>\r\n");
+ aStr.append(CreateBodyTag());
+
+ for(sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; ++nSdPage)
+ {
+ SdPage* pPage = maPages[nSdPage];
+ maPageNames[nSdPage] = pPage->GetName();
+
+ if( mbDocColors )
+ {
+ SetDocColors( pPage );
+ }
+
+ // page title
+ OUString sTitleText(CreateTextForTitle(pOutliner, pPage, pPage->GetPageBackgroundColor()));
+ OUString sStyle;
+
+ if (nSdPage != 0) // First page - no need for a page break here
+ sStyle += "page-break-before:always; ";
+ sStyle += getParagraphStyle(pOutliner, 0);
+
+ lclAppendStyle(aStr, u"h1", sStyle);
+
+ aStr.append(sTitleText);
+ aStr.append("</h1>\r\n");
+
+ // write outline text
+ aStr.append(CreateTextForPage( pOutliner, pPage, true, pPage->GetPageBackgroundColor() ));
+
+ // notes
+ if(mbNotes)
+ {
+ SdPage* pNotesPage = maNotesPages[ nSdPage ];
+ OUString aNotesStr( CreateTextForNotesPage( pOutliner, pNotesPage, maBackColor) );
+
+ if (!aNotesStr.isEmpty())
+ {
+ aStr.append("<br>\r\n<h3>");
+ aStr.append(RESTOHTML(STR_HTMLEXP_NOTES));
+ aStr.append(":</h3>\r\n");
+
+ aStr.append(aNotesStr);
+ }
+ }
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ }
+
+ // close page
+ aStr.append("</body>\r\n</html>");
+
+ WriteHtml(maDocFileName, false, aStr.makeStringAndClear());
+
+ pOutliner->Clear();
+ ResetProgress();
+}
+
+// exports the (in the c'tor specified impress document) to html
+void HtmlExport::ExportHtml()
+{
+ if(mbUserAttr)
+ {
+ if( maTextColor == COL_AUTO )
+ {
+ if( !maBackColor.IsDark() )
+ maTextColor = COL_BLACK;
+ }
+ }
+ else if( mbDocColors )
+ {
+ // default colors for the color schema 'From Document'
+ SetDocColors();
+ maFirstPageColor = maBackColor;
+ }
+
+ // get name for downloadable presentation if needed
+ if( mbDownload )
+ {
+ // fade out separator search and extension
+ sal_Int32 nSepPos = maDocFileName.indexOf('.');
+ if (nSepPos != -1)
+ maDocFileName = maDocFileName.copy(0, nSepPos);
+
+ maDocFileName += ".odp";
+ }
+
+ sal_uInt16 nProgrCount = mnSdPageCount;
+ nProgrCount += mbImpress?mnSdPageCount:0;
+ nProgrCount += mbContentsPage?1:0;
+ nProgrCount += (mbFrames && mbNotes)?mnSdPageCount:0;
+ nProgrCount += mbFrames ? 8 : 0;
+ InitProgress( nProgrCount );
+
+ mpDocSh->SetWaitCursor( true );
+
+ // Exceptions are cool...
+
+ CreateFileNames();
+
+ // this is not a true while
+ while( true )
+ {
+ if( checkForExistingFiles() )
+ break;
+
+ if( !CreateImagesForPresPages() )
+ break;
+
+ if( mbContentsPage &&
+ !CreateImagesForPresPages( true ) )
+ break;
+
+ if( !CreateHtmlForPresPages() )
+ break;
+
+ if( mbImpress )
+ if( !CreateHtmlTextForPresPages() )
+ break;
+
+ if( mbFrames )
+ {
+ if( !CreateFrames() )
+ break;
+
+ if( !CreateOutlinePages() )
+ break;
+
+ if( !CreateNavBarFrames() )
+ break;
+
+ if( mbNotes && mbImpress )
+ if( !CreateNotesPages() )
+ break;
+
+ }
+
+ if( mbContentsPage )
+ if( !CreateContentPage() )
+ break;
+
+ CreateBitmaps();
+
+ mpDocSh->SetWaitCursor( false );
+ ResetProgress();
+
+ if( mbDownload )
+ SavePresentation();
+
+ return;
+ }
+
+ // if we get to this point the export was
+ // canceled by the user after an error
+ mpDocSh->SetWaitCursor( false );
+ ResetProgress();
+}
+
+void HtmlExport::SetDocColors( SdPage* pPage )
+{
+ if( pPage == nullptr )
+ pPage = mpDoc->GetSdPage(0, PageKind::Standard);
+
+ svtools::ColorConfig aConfig;
+ maVLinkColor = aConfig.GetColorValue(svtools::LINKSVISITED).nColor;
+ maALinkColor = aConfig.GetColorValue(svtools::LINKS).nColor;
+ maLinkColor = aConfig.GetColorValue(svtools::LINKS).nColor;
+ maTextColor = COL_BLACK;
+
+ SfxStyleSheet* pSheet = nullptr;
+
+ if( mpDoc->GetDocumentType() == DocumentType::Impress )
+ {
+ // default text color from the outline template of the first page
+ pSheet = pPage->GetStyleSheetForPresObj(PresObjKind::Outline);
+ if(pSheet == nullptr)
+ pSheet = pPage->GetStyleSheetForPresObj(PresObjKind::Text);
+ if(pSheet == nullptr)
+ pSheet = pPage->GetStyleSheetForPresObj(PresObjKind::Title);
+ }
+
+ if(pSheet == nullptr)
+ pSheet = mpDoc->GetDefaultStyleSheet();
+
+ if(pSheet)
+ {
+ SfxItemSet& rSet = pSheet->GetItemSet();
+ if(rSet.GetItemState(EE_CHAR_COLOR) == SfxItemState::SET)
+ maTextColor = rSet.GetItem<SvxColorItem>(EE_CHAR_COLOR)->GetValue();
+ }
+
+ // default background from the background of the master page of the first page
+ maBackColor = pPage->GetPageBackgroundColor();
+
+ if( maTextColor == COL_AUTO )
+ {
+ if( !maBackColor.IsDark() )
+ maTextColor = COL_BLACK;
+ }
+}
+
+void HtmlExport::InitProgress( sal_uInt16 nProgrCount )
+{
+ mpProgress.reset(new SfxProgress( mpDocSh, SdResId(STR_CREATE_PAGES), nProgrCount ));
+}
+
+void HtmlExport::ResetProgress()
+{
+ mpProgress.reset();
+}
+
+void HtmlExport::ExportKiosk()
+{
+ mnPagesWritten = 0;
+ InitProgress( 2*mnSdPageCount );
+
+ CreateFileNames();
+ if( !checkForExistingFiles() )
+ {
+ if( CreateImagesForPresPages() )
+ CreateHtmlForPresPages();
+ }
+
+ ResetProgress();
+}
+
+// Export Document with WebCast (TM) Technology
+void HtmlExport::ExportWebCast()
+{
+ mnPagesWritten = 0;
+ InitProgress( mnSdPageCount + 9 );
+
+ mpDocSh->SetWaitCursor( true );
+
+ CreateFileNames();
+
+ if (maCGIPath.isEmpty())
+ maCGIPath = ".";
+
+ if (!maCGIPath.endsWith("/"))
+ maCGIPath += "/";
+
+ if( meScript == SCRIPT_ASP )
+ {
+ maURLPath = "./";
+ }
+ else
+ {
+ if (maURLPath.isEmpty())
+ maURLPath = ".";
+
+ if (!maURLPath.endsWith("/"))
+ maURLPath += "/";
+ }
+
+ // this is not a true while
+ while(true)
+ {
+ if( checkForExistingFiles() )
+ break;
+
+ if(!CreateImagesForPresPages())
+ break;
+
+ if( meScript == SCRIPT_ASP )
+ {
+ if(!CreateASPScripts())
+ break;
+ }
+ else
+ {
+ if(!CreatePERLScripts())
+ break;
+ }
+
+ if(!CreateImageFileList())
+ break;
+
+ if(!CreateImageNumberFile())
+ break;
+
+ break;
+ }
+
+ mpDocSh->SetWaitCursor( false );
+ ResetProgress();
+}
+
+// Save the presentation as a downloadable file in the dest directory
+bool HtmlExport::SavePresentation()
+{
+ meEC.SetContext( STR_HTMLEXP_ERROR_CREATE_FILE, maDocFileName );
+
+ OUString aURL(maExportPath + maDocFileName);
+
+ mpDocSh->EnableSetModified();
+
+ try
+ {
+ uno::Reference< frame::XStorable > xStorable( mpDoc->getUnoModel(), uno::UNO_QUERY );
+ if( xStorable.is() )
+ {
+ uno::Sequence< beans::PropertyValue > aProperties{
+ comphelper::makePropertyValue("Overwrite", true),
+ comphelper::makePropertyValue("FilterName", OUString("impress8"))
+ };
+ xStorable->storeToURL( aURL, aProperties );
+
+ mpDocSh->EnableSetModified( false );
+
+ return true;
+ }
+ }
+ catch( Exception& )
+ {
+ }
+
+ mpDocSh->EnableSetModified( false );
+
+ return false;
+}
+
+// create image files
+bool HtmlExport::CreateImagesForPresPages( bool bThumbnail)
+{
+ try
+ {
+ Reference < XComponentContext > xContext = ::comphelper::getProcessComponentContext();
+
+ Reference< drawing::XGraphicExportFilter > xGraphicExporter = drawing::GraphicExportFilter::create( xContext );
+
+ Sequence< PropertyValue > aFilterData(((meFormat==FORMAT_JPG)&&(mnCompression != -1))? 3 : 2);
+ auto pFilterData = aFilterData.getArray();
+ pFilterData[0].Name = "PixelWidth";
+ pFilterData[0].Value <<= static_cast<sal_Int32>(bThumbnail ? PUB_THUMBNAIL_WIDTH : mnWidthPixel );
+ pFilterData[1].Name = "PixelHeight";
+ pFilterData[1].Value <<= static_cast<sal_Int32>(bThumbnail ? PUB_THUMBNAIL_HEIGHT : mnHeightPixel);
+ if((meFormat==FORMAT_JPG)&&(mnCompression != -1))
+ {
+ pFilterData[2].Name = "Quality";
+ pFilterData[2].Value <<= static_cast<sal_Int32>(mnCompression);
+ }
+
+ OUString sFormat;
+ if( meFormat == FORMAT_PNG )
+ sFormat = "PNG";
+ else if( meFormat == FORMAT_GIF )
+ sFormat = "GIF";
+ else
+ sFormat = "JPG";
+
+ Sequence< PropertyValue > aDescriptor{
+ comphelper::makePropertyValue("URL", Any()),
+ comphelper::makePropertyValue("FilterName", sFormat),
+ comphelper::makePropertyValue("FilterData", aFilterData)
+ };
+ auto pDescriptor = aDescriptor.getArray();
+
+ for (sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
+ {
+ SdPage* pPage = maPages[ nSdPage ];
+
+ OUString aFull(maExportPath);
+ if (bThumbnail)
+ aFull += maThumbnailFiles[nSdPage];
+ else
+ aFull += maImageFiles[nSdPage];
+
+ pDescriptor[0].Value <<= aFull;
+
+ Reference< XComponent > xPage( pPage->getUnoPage(), UNO_QUERY );
+ xGraphicExporter->setSourceDocument( xPage );
+ xGraphicExporter->filter( aDescriptor );
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+ }
+ }
+ catch( Exception& )
+ {
+ return false;
+ }
+
+ return true;
+}
+
+// get SdrTextObject with layout text of this page
+SdrTextObj* HtmlExport::GetLayoutTextObject(SdrPage const * pPage)
+{
+ const size_t nObjectCount = pPage->GetObjCount();
+ SdrTextObj* pResult = nullptr;
+
+ for (size_t nObject = 0; nObject < nObjectCount; ++nObject)
+ {
+ SdrObject* pObject = pPage->GetObj(nObject);
+ if (pObject->GetObjInventor() == SdrInventor::Default &&
+ pObject->GetObjIdentifier() == SdrObjKind::OutlineText)
+ {
+ pResult = static_cast<SdrTextObj*>(pObject);
+ break;
+ }
+ }
+ return pResult;
+}
+
+// create HTML text version of impress pages
+OUString HtmlExport::CreateMetaCharset()
+{
+ OUString aStr;
+ const char *pCharSet = rtl_getBestMimeCharsetFromTextEncoding( RTL_TEXTENCODING_UTF8 );
+ if ( pCharSet )
+ {
+ aStr = " <meta HTTP-EQUIV=CONTENT-TYPE CONTENT=\"text/html; charset=" +
+ OUString::createFromAscii(pCharSet) + "\">\r\n";
+ }
+ return aStr;
+}
+
+OUString HtmlExport::DocumentMetadata() const
+{
+ SvMemoryStream aStream;
+
+ uno::Reference<document::XDocumentProperties> xDocProps;
+ if (mpDocSh)
+ {
+ uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
+ mpDocSh->GetModel(), uno::UNO_QUERY_THROW);
+ xDocProps.set(xDPS->getDocumentProperties());
+ }
+
+ SfxFrameHTMLWriter::Out_DocInfo(aStream, maDocFileName, xDocProps,
+ " ");
+
+ const sal_uInt64 nLen = aStream.GetSize();
+ OSL_ENSURE(nLen < o3tl::make_unsigned(SAL_MAX_INT32), "Stream can't fit in OString");
+ OString aData(static_cast<const char*>(aStream.GetData()), static_cast<sal_Int32>(nLen));
+
+ return OStringToOUString(aData, RTL_TEXTENCODING_UTF8);
+}
+
+bool HtmlExport::CreateHtmlTextForPresPages()
+{
+ bool bOk = true;
+
+ SdrOutliner* pOutliner = mpDoc->GetInternalOutliner();
+
+ for(sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount && bOk; nSdPage++)
+ {
+ SdPage* pPage = maPages[ nSdPage ];
+
+ if( mbDocColors )
+ {
+ SetDocColors( pPage );
+ }
+
+ // HTML head
+ OUStringBuffer aStr(gaHTMLHeader);
+ aStr.append(CreateMetaCharset());
+ aStr.append(" <title>");
+ aStr.append(StringToHTMLString(maPageNames[nSdPage]));
+ aStr.append("</title>\r\n");
+ aStr.append("</head>\r\n");
+ aStr.append(CreateBodyTag());
+
+ // navigation bar
+ aStr.append(CreateNavBar(nSdPage, true));
+
+ // page title
+ OUString sTitleText( CreateTextForTitle(pOutliner,pPage, pPage->GetPageBackgroundColor()) );
+ lclAppendStyle(aStr, u"h1", getParagraphStyle(pOutliner, 0));
+ aStr.append(sTitleText);
+ aStr.append("</h1>\r\n");
+
+ // write outline text
+ aStr.append(CreateTextForPage( pOutliner, pPage, true, pPage->GetPageBackgroundColor() ));
+
+ // notes
+ if(mbNotes)
+ {
+ SdPage* pNotesPage = maNotesPages[ nSdPage ];
+ OUString aNotesStr( CreateTextForNotesPage( pOutliner, pNotesPage, maBackColor) );
+
+ if (!aNotesStr.isEmpty())
+ {
+ aStr.append("<br>\r\n<h3>");
+ aStr.append(RESTOHTML(STR_HTMLEXP_NOTES));
+ aStr.append(":</h3>\r\n");
+
+ aStr.append(aNotesStr);
+ }
+ }
+
+ // close page
+ aStr.append("</body>\r\n</html>");
+
+ bOk = WriteHtml(maTextFiles[nSdPage], false, aStr.makeStringAndClear());
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ }
+
+ pOutliner->Clear();
+
+ return bOk;
+}
+
+/** exports the given html data into a non unicode file in the current export path with
+ the given filename */
+bool HtmlExport::WriteHtml( const OUString& rFileName, bool bAddExtension, std::u16string_view rHtmlData )
+{
+ ErrCode nErr = ERRCODE_NONE;
+
+ OUString aFileName( rFileName );
+ if( bAddExtension )
+ aFileName += gaHTMLExtension;
+
+ meEC.SetContext( STR_HTMLEXP_ERROR_CREATE_FILE, rFileName );
+ EasyFile aFile;
+ SvStream* pStr;
+ OUString aFull(maExportPath + aFileName);
+ nErr = aFile.createStream(aFull , pStr);
+ if(nErr == ERRCODE_NONE)
+ {
+ OString aStr(OUStringToOString(rHtmlData, RTL_TEXTENCODING_UTF8));
+ pStr->WriteOString( aStr );
+ aFile.close();
+ }
+
+ if( nErr != ERRCODE_NONE )
+ ErrorHandler::HandleError(nErr);
+
+ return nErr == ERRCODE_NONE;
+}
+
+/** creates an outliner text for the title objects of a page
+ */
+OUString HtmlExport::CreateTextForTitle( SdrOutliner* pOutliner, SdPage* pPage, const Color& rBackgroundColor )
+{
+ SdrTextObj* pTO = static_cast<SdrTextObj*>(pPage->GetPresObj(PresObjKind::Title));
+ if(!pTO)
+ pTO = GetLayoutTextObject(pPage);
+
+ if (pTO && !pTO->IsEmptyPresObj())
+ {
+ OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
+ if(pOPO && pOutliner->GetParagraphCount() != 0)
+ {
+ pOutliner->Clear();
+ pOutliner->SetText(*pOPO);
+ return ParagraphToHTMLString(pOutliner,0, rBackgroundColor);
+ }
+ }
+
+ return OUString();
+}
+
+// creates an outliner text for a page
+OUString HtmlExport::CreateTextForPage(SdrOutliner* pOutliner, SdPage const * pPage,
+ bool bHeadLine, const Color& rBackgroundColor)
+{
+ OUStringBuffer aStr;
+
+ for (size_t i = 0; i <pPage->GetObjCount(); ++i )
+ {
+ SdrObject* pObject = pPage->GetObj(i);
+ PresObjKind eKind = pPage->GetPresObjKind(pObject);
+
+ switch (eKind)
+ {
+ case PresObjKind::NONE:
+ {
+ if (pObject->GetObjIdentifier() == SdrObjKind::Group)
+ {
+ SdrObjGroup* pObjectGroup = static_cast<SdrObjGroup*>(pObject);
+ WriteObjectGroup(aStr, pObjectGroup, pOutliner, rBackgroundColor, false);
+ }
+ else if (pObject->GetObjIdentifier() == SdrObjKind::Table)
+ {
+ SdrTableObj* pTableObject = static_cast<SdrTableObj*>(pObject);
+ WriteTable(aStr, pTableObject, pOutliner, rBackgroundColor);
+ }
+ else
+ {
+ if (pObject->GetOutlinerParaObject())
+ {
+ WriteOutlinerParagraph(aStr, pOutliner, pObject->GetOutlinerParaObject(), rBackgroundColor, false);
+ }
+ }
+ }
+ break;
+
+ case PresObjKind::Table:
+ {
+ SdrTableObj* pTableObject = static_cast<SdrTableObj*>(pObject);
+ WriteTable(aStr, pTableObject, pOutliner, rBackgroundColor);
+ }
+ break;
+
+ case PresObjKind::Text:
+ case PresObjKind::Outline:
+ {
+ SdrTextObj* pTextObject = static_cast<SdrTextObj*>(pObject);
+ if (pTextObject->IsEmptyPresObj())
+ continue;
+ WriteOutlinerParagraph(aStr, pOutliner, pTextObject->GetOutlinerParaObject(), rBackgroundColor, bHeadLine);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ return aStr.makeStringAndClear();
+}
+
+void HtmlExport::WriteTable(OUStringBuffer& aStr, SdrTableObj const * pTableObject, SdrOutliner* pOutliner, const Color& rBackgroundColor)
+{
+ CellPos aStart, aEnd;
+
+ aStart = SdrTableObj::getFirstCell();
+ aEnd = pTableObject->getLastCell();
+
+ sal_Int32 nColCount = pTableObject->getColumnCount();
+ aStr.append("<table>\r\n");
+ for (sal_Int32 nRow = aStart.mnRow; nRow <= aEnd.mnRow; nRow++)
+ {
+ aStr.append(" <tr>\r\n");
+ for (sal_Int32 nCol = aStart.mnCol; nCol <= aEnd.mnCol; nCol++)
+ {
+ aStr.append(" <td>\r\n");
+ sal_Int32 nCellIndex = nRow * nColCount + nCol;
+ SdrText* pText = pTableObject->getText(nCellIndex);
+
+ if (pText == nullptr)
+ continue;
+ WriteOutlinerParagraph(aStr, pOutliner, pText->GetOutlinerParaObject(), rBackgroundColor, false);
+ aStr.append(" </td>\r\n");
+ }
+ aStr.append(" </tr>\r\n");
+ }
+ aStr.append("</table>\r\n");
+}
+
+void HtmlExport::WriteObjectGroup(OUStringBuffer& aStr, SdrObjGroup const * pObjectGroup, SdrOutliner* pOutliner,
+ const Color& rBackgroundColor, bool bHeadLine)
+{
+ SdrObjListIter aGroupIterator(pObjectGroup->GetSubList(), SdrIterMode::DeepNoGroups);
+ while (aGroupIterator.IsMore())
+ {
+ SdrObject* pCurrentObject = aGroupIterator.Next();
+ if (pCurrentObject->GetObjIdentifier() == SdrObjKind::Group)
+ {
+ SdrObjGroup* pCurrentGroupObject = static_cast<SdrObjGroup*>(pCurrentObject);
+ WriteObjectGroup(aStr, pCurrentGroupObject, pOutliner, rBackgroundColor, bHeadLine);
+ }
+ else
+ {
+ OutlinerParaObject* pOutlinerParagraphObject = pCurrentObject->GetOutlinerParaObject();
+ if (pOutlinerParagraphObject != nullptr)
+ {
+ WriteOutlinerParagraph(aStr, pOutliner, pOutlinerParagraphObject, rBackgroundColor, bHeadLine);
+ }
+ }
+ }
+}
+
+void HtmlExport::WriteOutlinerParagraph(OUStringBuffer& aStr, SdrOutliner* pOutliner,
+ OutlinerParaObject const * pOutlinerParagraphObject,
+ const Color& rBackgroundColor, bool bHeadLine)
+{
+ if (pOutlinerParagraphObject == nullptr)
+ return;
+
+ pOutliner->SetText(*pOutlinerParagraphObject);
+
+ sal_Int32 nCount = pOutliner->GetParagraphCount();
+
+
+ sal_Int16 nCurrentDepth = -1;
+
+ for (sal_Int32 nIndex = 0; nIndex < nCount; nIndex++)
+ {
+ Paragraph* pParagraph = pOutliner->GetParagraph(nIndex);
+ if(pParagraph == nullptr)
+ continue;
+
+ const sal_Int16 nDepth = static_cast<sal_uInt16>(pOutliner->GetDepth(nIndex));
+ OUString aParaText = ParagraphToHTMLString(pOutliner, nIndex, rBackgroundColor);
+
+ if (aParaText.isEmpty())
+ continue;
+
+ if (nDepth < 0)
+ {
+ OUString aTag = bHeadLine ? OUString("h2") : OUString("p");
+ lclAppendStyle(aStr, aTag, getParagraphStyle(pOutliner, nIndex));
+
+ aStr.append(aParaText);
+ aStr.append("</" + aTag + ">\r\n");
+ }
+ else
+ {
+ while(nCurrentDepth < nDepth)
+ {
+ aStr.append("<ul>\r\n");
+ nCurrentDepth++;
+ }
+ while(nCurrentDepth > nDepth)
+ {
+ aStr.append("</ul>\r\n");
+ nCurrentDepth--;
+ }
+ lclAppendStyle(aStr, u"li", getParagraphStyle(pOutliner, nIndex));
+ aStr.append(aParaText);
+ aStr.append("</li>\r\n");
+ }
+ }
+ while(nCurrentDepth >= 0)
+ {
+ aStr.append("</ul>\r\n");
+ nCurrentDepth--;
+ }
+ pOutliner->Clear();
+}
+
+// creates an outliner text for a note page
+OUString HtmlExport::CreateTextForNotesPage( SdrOutliner* pOutliner,
+ SdPage* pPage,
+ const Color& rBackgroundColor )
+{
+ OUStringBuffer aStr;
+
+ SdrTextObj* pTO = static_cast<SdrTextObj*>(pPage->GetPresObj(PresObjKind::Notes));
+
+ if (pTO && !pTO->IsEmptyPresObj())
+ {
+ OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
+ if (pOPO)
+ {
+ pOutliner->Clear();
+ pOutliner->SetText( *pOPO );
+
+ sal_Int32 nCount = pOutliner->GetParagraphCount();
+ for (sal_Int32 nPara = 0; nPara < nCount; nPara++)
+ {
+ lclAppendStyle(aStr, u"p", getParagraphStyle(pOutliner, nPara));
+ aStr.append(ParagraphToHTMLString(pOutliner, nPara, rBackgroundColor));
+ aStr.append("</p>\r\n");
+ }
+ }
+ }
+
+ return aStr.makeStringAndClear();
+}
+
+// converts a paragraph of the outliner to html
+OUString HtmlExport::ParagraphToHTMLString( SdrOutliner const * pOutliner, sal_Int32 nPara, const Color& rBackgroundColor )
+{
+ OUStringBuffer aStr;
+
+ if(nullptr == pOutliner)
+ return OUString();
+
+ // TODO: MALTE!!!
+ EditEngine& rEditEngine = *const_cast<EditEngine*>(&pOutliner->GetEditEngine());
+ bool bOldUpdateMode = rEditEngine.SetUpdateLayout(true);
+
+ Paragraph* pPara = pOutliner->GetParagraph(nPara);
+ if(nullptr == pPara)
+ return OUString();
+
+ HtmlState aState( (mbUserAttr || mbDocColors) ? maTextColor : COL_BLACK );
+ std::vector<sal_Int32> aPortionList;
+ rEditEngine.GetPortions( nPara, aPortionList );
+
+ sal_Int32 nPos1 = 0;
+ for( sal_Int32 nPos2 : aPortionList )
+ {
+ ESelection aSelection( nPara, nPos1, nPara, nPos2);
+
+ SfxItemSet aSet( rEditEngine.GetAttribs( aSelection ) );
+
+ OUString aPortion(StringToHTMLString(rEditEngine.GetText( aSelection )));
+
+ aStr.append(TextAttribToHTMLString( &aSet, &aState, rBackgroundColor ));
+ aStr.append(aPortion);
+
+ nPos1 = nPos2;
+ }
+ aStr.append(aState.Flush());
+ rEditEngine.SetUpdateLayout(bOldUpdateMode);
+
+ return aStr.makeStringAndClear();
+}
+
+// Depending on the attributes of the specified set and the specified
+// HtmlState, it creates the needed html tags in order to get the
+// attributes
+OUString HtmlExport::TextAttribToHTMLString( SfxItemSet const * pSet, HtmlState* pState, const Color& rBackgroundColor )
+{
+ OUStringBuffer aStr;
+
+ if(nullptr == pSet)
+ return OUString();
+
+ OUString aLink, aTarget;
+ if ( pSet->GetItemState( EE_FEATURE_FIELD ) == SfxItemState::SET )
+ {
+ const SvxFieldItem* pItem = pSet->GetItem<SvxFieldItem>( EE_FEATURE_FIELD );
+ if(pItem)
+ {
+ const SvxURLField* pURL = dynamic_cast<const SvxURLField*>( pItem->GetField() );
+ if(pURL)
+ {
+ aLink = pURL->GetURL();
+ aTarget = pURL->GetTargetFrame();
+ }
+ }
+ }
+
+ bool bTemp;
+ OUString aTemp;
+
+ if ( pSet->GetItemState( EE_CHAR_WEIGHT ) == SfxItemState::SET )
+ {
+ bTemp = pSet->Get( EE_CHAR_WEIGHT ).GetWeight() == WEIGHT_BOLD;
+ aTemp = pState->SetWeight( bTemp );
+ if( bTemp )
+ aStr.insert(0, aTemp);
+ else
+ aStr.append(aTemp);
+ }
+
+ if ( pSet->GetItemState( EE_CHAR_UNDERLINE ) == SfxItemState::SET )
+ {
+ bTemp = pSet->Get( EE_CHAR_UNDERLINE ).GetLineStyle() != LINESTYLE_NONE;
+ aTemp = pState->SetUnderline( bTemp );
+ if( bTemp )
+ aStr.insert(0, aTemp);
+ else
+ aStr.append(aTemp);
+ }
+
+ if ( pSet->GetItemState( EE_CHAR_STRIKEOUT ) == SfxItemState::SET )
+ {
+ bTemp = pSet->Get( EE_CHAR_STRIKEOUT ).GetStrikeout() != STRIKEOUT_NONE;
+ aTemp = pState->SetStrikeout( bTemp );
+ if( bTemp )
+ aStr.insert(0, aTemp);
+ else
+ aStr.append(aTemp);
+ }
+
+ if ( pSet->GetItemState( EE_CHAR_ITALIC ) == SfxItemState::SET )
+ {
+ bTemp = pSet->Get( EE_CHAR_ITALIC ).GetPosture() != ITALIC_NONE;
+ aTemp = pState->SetItalic( bTemp );
+ if( bTemp )
+ aStr.insert(0, aTemp);
+ else
+ aStr.append(aTemp);
+ }
+
+ if(mbDocColors)
+ {
+ if ( pSet->GetItemState( EE_CHAR_COLOR ) == SfxItemState::SET )
+ {
+ Color aTextColor = pSet->Get( EE_CHAR_COLOR ).GetValue();
+ if( aTextColor == COL_AUTO )
+ {
+ if( !rBackgroundColor.IsDark() )
+ aTextColor = COL_BLACK;
+ }
+ aStr.append(pState->SetColor( aTextColor ));
+ }
+ }
+
+ if (!aLink.isEmpty())
+ aStr.insert(0, pState->SetLink(aLink, aTarget));
+ else
+ aStr.append(pState->SetLink(aLink, aTarget));
+
+ return aStr.makeStringAndClear();
+}
+
+// create HTML wrapper for picture files
+bool HtmlExport::CreateHtmlForPresPages()
+{
+ bool bOk = true;
+
+ std::vector<SdrObject*> aClickableObjects;
+
+ for(sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount && bOk; nSdPage++)
+ {
+ // find clickable objects (also on the master page) and put it in the
+ // list. This in reverse order character order since in html the first
+ // area is taken in the case they overlap.
+ SdPage* pPage = maPages[ nSdPage ];
+
+ if( mbDocColors )
+ {
+ SetDocColors( pPage );
+ }
+
+ bool bMasterDone = false;
+
+ while (!bMasterDone)
+ {
+ // sal_True = backwards
+ SdrObjListIter aIter(pPage, SdrIterMode::DeepWithGroups, true);
+
+ SdrObject* pObject = aIter.Next();
+ while (pObject)
+ {
+ SdAnimationInfo* pInfo = SdDrawDocument::GetAnimationInfo(pObject);
+ SvxIMapInfo* pIMapInfo = SvxIMapInfo::GetIMapInfo(pObject);
+
+ if ((pInfo &&
+ (pInfo->meClickAction == presentation::ClickAction_BOOKMARK ||
+ pInfo->meClickAction == presentation::ClickAction_DOCUMENT ||
+ pInfo->meClickAction == presentation::ClickAction_PREVPAGE ||
+ pInfo->meClickAction == presentation::ClickAction_NEXTPAGE ||
+ pInfo->meClickAction == presentation::ClickAction_FIRSTPAGE ||
+ pInfo->meClickAction == presentation::ClickAction_LASTPAGE)) ||
+ pIMapInfo)
+ {
+ aClickableObjects.push_back(pObject);
+ }
+
+ pObject = aIter.Next();
+ }
+ // now to the master page or finishing
+ if (!pPage->IsMasterPage())
+ pPage = static_cast<SdPage*>(&(pPage->TRG_GetMasterPage()));
+ else
+ bMasterDone = true;
+ }
+
+ // HTML Head
+ OUStringBuffer aStr(gaHTMLHeader);
+ aStr.append(CreateMetaCharset());
+ aStr.append(" <title>" + StringToHTMLString(maPageNames[nSdPage]) + "</title>\r\n");
+
+ // insert timing information
+ pPage = maPages[ nSdPage ];
+ if( meMode == PUBLISH_KIOSK )
+ {
+ double fSecs = 0;
+ bool bEndless = false;
+ if( !mbAutoSlide )
+ {
+ if( pPage->GetPresChange() != PresChange::Manual )
+ {
+ fSecs = pPage->GetTime();
+ bEndless = mpDoc->getPresentationSettings().mbEndless;
+ }
+ }
+ else
+ {
+ fSecs = mfSlideDuration;
+ bEndless = mbEndless;
+ }
+
+ if( fSecs != 0 )
+ {
+ if( nSdPage < (mnSdPageCount-1) || bEndless )
+ {
+ aStr.append("<meta http-equiv=\"refresh\" content=\"");
+ aStr.append(fSecs);
+ aStr.append("; URL=");
+
+ int nPage = nSdPage + 1;
+ if( nPage == mnSdPageCount )
+ nPage = 0;
+
+ aStr.append(maHTMLFiles[nPage]);
+
+ aStr.append("\">\r\n");
+ }
+ }
+ }
+
+ aStr.append("</head>\r\n");
+
+ // HTML Body
+ aStr.append(CreateBodyTag());
+
+ if( mbSlideSound && pPage->IsSoundOn() )
+ aStr.append(InsertSound(pPage->GetSoundFile()));
+
+ // navigation bar
+ if(!mbFrames )
+ aStr.append(CreateNavBar(nSdPage, false));
+ // Image
+ aStr.append("<center>");
+ aStr.append("<img src=\"");
+ aStr.append(maImageFiles[nSdPage]);
+ aStr.append("\" alt=\"\"");
+
+ if (!aClickableObjects.empty())
+ aStr.append(" USEMAP=\"#map0\"");
+
+ aStr.append("></center>\r\n");
+
+ // notes
+ if(mbNotes && !mbFrames)
+ {
+ SdrOutliner* pOutliner = mpDoc->GetInternalOutliner();
+ SdPage* pNotesPage = maNotesPages[ nSdPage ];
+ OUString aNotesStr( CreateTextForNotesPage( pOutliner, pNotesPage, maBackColor) );
+ pOutliner->Clear();
+
+ if (!aNotesStr.isEmpty())
+ {
+ aStr.append("<h3>");
+ aStr.append(RESTOHTML(STR_HTMLEXP_NOTES));
+ aStr.append(":</h3><br>\r\n\r\n<p>");
+
+ aStr.append(aNotesStr);
+ aStr.append("\r\n</p>\r\n");
+ }
+ }
+
+ // create Imagemap if necessary
+ if (!aClickableObjects.empty())
+ {
+ aStr.append("<map name=\"map0\">\r\n");
+
+ for (SdrObject* pObject : aClickableObjects)
+ {
+ SdAnimationInfo* pInfo = SdDrawDocument::GetAnimationInfo(pObject);
+ SvxIMapInfo* pIMapInfo = SvxIMapInfo::GetIMapInfo(pObject);
+
+ ::tools::Rectangle aRect(pObject->GetCurrentBoundRect());
+ Point aLogPos(aRect.TopLeft());
+ bool bIsSquare = aRect.GetWidth() == aRect.GetHeight();
+
+ sal_uLong nPageWidth = pPage->GetSize().Width() - pPage->GetLeftBorder() -
+ pPage->GetRightBorder();
+
+ // BoundRect is relative to the physical page origin, not the
+ // origin of ordinates
+ aRect.Move(-pPage->GetLeftBorder(), -pPage->GetUpperBorder());
+
+ double fLogicToPixel = static_cast<double>(mnWidthPixel) / nPageWidth;
+ aRect.SetLeft( static_cast<tools::Long>(aRect.Left() * fLogicToPixel) );
+ aRect.SetTop( static_cast<tools::Long>(aRect.Top() * fLogicToPixel) );
+ aRect.SetRight( static_cast<tools::Long>(aRect.Right() * fLogicToPixel) );
+ aRect.SetBottom( static_cast<tools::Long>(aRect.Bottom() * fLogicToPixel) );
+ tools::Long nRadius = aRect.GetWidth() / 2;
+
+ /**
+ insert areas into Imagemap of the object, if the object has
+ such an Imagemap
+ */
+ if (pIMapInfo)
+ {
+ const ImageMap& rIMap = pIMapInfo->GetImageMap();
+ sal_uInt16 nAreaCount = rIMap.GetIMapObjectCount();
+ for (sal_uInt16 nArea = 0; nArea < nAreaCount; nArea++)
+ {
+ IMapObject* pArea = rIMap.GetIMapObject(nArea);
+ IMapObjectType nType = pArea->GetType();
+ OUString aURL( pArea->GetURL() );
+
+ // if necessary, convert page and object names into the
+ // corresponding names of the html file
+ bool bIsMasterPage;
+ sal_uInt16 nPgNum = mpDoc->GetPageByName( aURL, bIsMasterPage );
+
+ if (nPgNum == SDRPAGE_NOTFOUND)
+ {
+ // is the bookmark an object?
+ SdrObject* pObj = mpDoc->GetObj( aURL );
+ if (pObj)
+ nPgNum = pObj->getSdrPageFromSdrObject()->GetPageNum();
+ }
+ if (nPgNum != SDRPAGE_NOTFOUND)
+ {
+ nPgNum = (nPgNum - 1) / 2; // SdrPageNum --> SdPageNum
+ aURL = CreatePageURL(nPgNum);
+ }
+
+ switch(nType)
+ {
+ case IMapObjectType::Rectangle:
+ {
+ ::tools::Rectangle aArea(static_cast<IMapRectangleObject*>(pArea)->
+ GetRectangle(false));
+
+ // conversion into pixel coordinates
+ aArea.Move(aLogPos.X() - pPage->GetLeftBorder(),
+ aLogPos.Y() - pPage->GetUpperBorder());
+ aArea.SetLeft( static_cast<tools::Long>(aArea.Left() * fLogicToPixel) );
+ aArea.SetTop( static_cast<tools::Long>(aArea.Top() * fLogicToPixel) );
+ aArea.SetRight( static_cast<tools::Long>(aArea.Right() * fLogicToPixel) );
+ aArea.SetBottom( static_cast<tools::Long>(aArea.Bottom() * fLogicToPixel) );
+
+ aStr.append(CreateHTMLRectArea(aArea, aURL));
+ }
+ break;
+
+ case IMapObjectType::Circle:
+ {
+ Point aCenter(static_cast<IMapCircleObject*>(pArea)->
+ GetCenter(false));
+ aCenter += Point(aLogPos.X() - pPage->GetLeftBorder(),
+ aLogPos.Y() - pPage->GetUpperBorder());
+ aCenter.setX( static_cast<tools::Long>(aCenter.X() * fLogicToPixel) );
+ aCenter.setY( static_cast<tools::Long>(aCenter.Y() * fLogicToPixel) );
+
+ sal_uLong nCircleRadius = static_cast<IMapCircleObject*>(pArea)->
+ GetRadius(false);
+ nCircleRadius = static_cast<sal_uLong>(nCircleRadius * fLogicToPixel);
+ aStr.append(CreateHTMLCircleArea(nCircleRadius,
+ aCenter.X(), aCenter.Y(),
+ aURL));
+ }
+ break;
+
+ case IMapObjectType::Polygon:
+ {
+ tools::Polygon aArea(static_cast<IMapPolygonObject*>(pArea)->GetPolygon(false));
+ aStr.append(CreateHTMLPolygonArea(::basegfx::B2DPolyPolygon(aArea.getB2DPolygon()),
+ Size(aLogPos.X() - pPage->GetLeftBorder(),
+ aLogPos.Y() - pPage->GetUpperBorder()),
+ fLogicToPixel, aURL));
+ }
+ break;
+
+ default:
+ {
+ SAL_INFO("sd", "unknown IMapObjectType");
+ }
+ break;
+ }
+ }
+ }
+
+ /**
+ if there is a presentation::ClickAction, determine bookmark
+ and create area for the whole object
+ */
+ if( pInfo )
+ {
+ OUString aHRef;
+ presentation::ClickAction eClickAction = pInfo->meClickAction;
+
+ switch( eClickAction )
+ {
+ case presentation::ClickAction_BOOKMARK:
+ {
+ bool bIsMasterPage;
+ sal_uInt16 nPgNum = mpDoc->GetPageByName( pInfo->GetBookmark(), bIsMasterPage );
+
+ if( nPgNum == SDRPAGE_NOTFOUND )
+ {
+ // is the bookmark an object?
+ SdrObject* pObj = mpDoc->GetObj(pInfo->GetBookmark());
+ if (pObj)
+ nPgNum = pObj->getSdrPageFromSdrObject()->GetPageNum();
+ }
+
+ if( SDRPAGE_NOTFOUND != nPgNum )
+ aHRef = CreatePageURL(( nPgNum - 1 ) / 2 );
+ }
+ break;
+
+ case presentation::ClickAction_DOCUMENT:
+ aHRef = pInfo->GetBookmark();
+ break;
+
+ case presentation::ClickAction_PREVPAGE:
+ {
+ sal_uLong nPage;
+
+ if (nSdPage == 0)
+ nPage = 0;
+ else
+ nPage = nSdPage - 1;
+
+ aHRef = CreatePageURL( static_cast<sal_uInt16>(nPage));
+ }
+ break;
+
+ case presentation::ClickAction_NEXTPAGE:
+ {
+ sal_uLong nPage;
+ if (nSdPage == mnSdPageCount - 1)
+ nPage = mnSdPageCount - 1;
+ else
+ nPage = nSdPage + 1;
+
+ aHRef = CreatePageURL( static_cast<sal_uInt16>(nPage));
+ }
+ break;
+
+ case presentation::ClickAction_FIRSTPAGE:
+ aHRef = CreatePageURL(0);
+ break;
+
+ case presentation::ClickAction_LASTPAGE:
+ aHRef = CreatePageURL(mnSdPageCount - 1);
+ break;
+
+ default:
+ break;
+ }
+
+ // and now the areas
+ if (!aHRef.isEmpty())
+ {
+ // a circle?
+ if (pObject->GetObjInventor() == SdrInventor::Default &&
+ pObject->GetObjIdentifier() == SdrObjKind::CircleOrEllipse &&
+ bIsSquare )
+ {
+ aStr.append(CreateHTMLCircleArea(aRect.GetWidth() / 2,
+ aRect.Left() + nRadius,
+ aRect.Top() + nRadius,
+ aHRef));
+ }
+ // a polygon?
+ else if (pObject->GetObjInventor() == SdrInventor::Default &&
+ (pObject->GetObjIdentifier() == SdrObjKind::PathLine ||
+ pObject->GetObjIdentifier() == SdrObjKind::PolyLine ||
+ pObject->GetObjIdentifier() == SdrObjKind::Polygon))
+ {
+ aStr.append(CreateHTMLPolygonArea(static_cast<SdrPathObj*>(pObject)->GetPathPoly(), Size(-pPage->GetLeftBorder(), -pPage->GetUpperBorder()), fLogicToPixel, aHRef));
+ }
+ // something completely different: use the BoundRect
+ else
+ {
+ aStr.append(CreateHTMLRectArea(aRect, aHRef));
+ }
+
+ }
+ }
+ }
+
+ aStr.append("</map>\r\n");
+ }
+ aClickableObjects.clear();
+
+ aStr.append("</body>\r\n</html>");
+
+ bOk = WriteHtml(maHTMLFiles[nSdPage], false, aStr.makeStringAndClear());
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+ }
+
+ return bOk;
+}
+
+// create overview pages
+bool HtmlExport::CreateContentPage()
+{
+ if( mbDocColors )
+ SetDocColors();
+
+ // html head
+ OUStringBuffer aStr(gaHTMLHeader);
+ aStr.append(CreateMetaCharset());
+ aStr.append(" <title>");
+ aStr.append(StringToHTMLString(maPageNames[0]));
+ aStr.append("</title>\r\n</head>\r\n");
+ aStr.append(CreateBodyTag());
+
+ // page head
+ aStr.append("<center>\r\n");
+
+ if(mbHeader)
+ {
+ aStr.append("<h1>");
+ aStr.append(getDocumentTitle());
+ aStr.append("</h1><br>\r\n");
+ }
+
+ aStr.append("<h2>");
+
+ // Solaris compiler bug workaround
+ if( mbFrames )
+ aStr.append(CreateLink(maFramePage,
+ RESTOHTML(STR_HTMLEXP_CLICKSTART)));
+ else
+ aStr.append(CreateLink(StringToHTMLString(maHTMLFiles[0]),
+ RESTOHTML(STR_HTMLEXP_CLICKSTART)));
+
+ aStr.append("</h2>\r\n</center>\r\n");
+
+ aStr.append("<center><table width=\"90%\"><tr>\r\n");
+
+ // table of content
+ aStr.append("<td valign=\"top\" align=\"left\" width=\"25%\">\r\n");
+ aStr.append("<h3>");
+ aStr.append(RESTOHTML(STR_HTMLEXP_CONTENTS));
+ aStr.append("</h3>");
+
+ for(sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
+ {
+ OUString aPageName = maPageNames[nSdPage];
+ aStr.append("<div align=\"left\">");
+ if(mbFrames)
+ aStr.append(StringToHTMLString(aPageName));
+ else
+ aStr.append(CreateLink(maHTMLFiles[nSdPage], aPageName));
+ aStr.append("</div>\r\n");
+ }
+ aStr.append("</td>\r\n");
+
+ // document information
+ aStr.append("<td valign=\"top\" align=\"left\" width=\"75%\">\r\n");
+
+ if (!maAuthor.isEmpty())
+ {
+ aStr.append("<p><strong>");
+ aStr.append(RESTOHTML(STR_HTMLEXP_AUTHOR));
+ aStr.append(":</strong> ");
+ aStr.append(StringToHTMLString(maAuthor));
+ aStr.append("</p>\r\n");
+ }
+
+ if (!maEMail.isEmpty())
+ {
+ aStr.append("<p><strong>");
+ aStr.append(RESTOHTML(STR_HTMLEXP_EMAIL));
+ aStr.append(":</strong> <a href=\"mailto:");
+ aStr.append(maEMail);
+ aStr.append("\">");
+ aStr.append(StringToHTMLString(maEMail));
+ aStr.append("</a></p>\r\n");
+ }
+
+ if (!maHomePage.isEmpty())
+ {
+ aStr.append("<p><strong>");
+ aStr.append(RESTOHTML(STR_HTMLEXP_HOMEPAGE));
+ aStr.append(":</strong> <a href=\"");
+ aStr.append(maHomePage);
+ aStr.append("\">");
+ aStr.append(StringToHTMLString(maHomePage));
+ aStr.append("</a> </p>\r\n");
+ }
+
+ if (!maInfo.isEmpty())
+ {
+ aStr.append("<p><strong>");
+ aStr.append(RESTOHTML(STR_HTMLEXP_INFO));
+ aStr.append(":</strong><br>\r\n");
+ aStr.append(StringToHTMLString(maInfo));
+ aStr.append("</p>\r\n");
+ }
+
+ if(mbDownload)
+ {
+ aStr.append("<p><a href=\"");
+ aStr.append(maDocFileName);
+ aStr.append("\">");
+ aStr.append(RESTOHTML(STR_HTMLEXP_DOWNLOAD));
+ aStr.append("</a></p>\r\n");
+ }
+
+ for(sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
+ {
+ OUString aText(
+ "<img src=\"" +
+ maThumbnailFiles[nSdPage] +
+ "\" width=\"256\" height=\"192\" alt=\"" +
+ StringToHTMLString(maPageNames[nSdPage]) +
+ "\">");
+
+ aStr.append(CreateLink(maHTMLFiles[nSdPage], aText));
+ aStr.append("\r\n");
+ }
+
+ aStr.append("</td></tr></table></center>\r\n");
+
+ aStr.append("</body>\r\n</html>");
+
+ bool bOk = WriteHtml(maIndex, false, aStr.makeStringAndClear());
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ return bOk;
+}
+
+// create note pages (for frames)
+
+bool HtmlExport::CreateNotesPages()
+{
+ bool bOk = true;
+
+ SdrOutliner* pOutliner = mpDoc->GetInternalOutliner();
+ for( sal_uInt16 nSdPage = 0; bOk && nSdPage < mnSdPageCount; nSdPage++ )
+ {
+ SdPage* pPage = maNotesPages[nSdPage];
+ if( mbDocColors )
+ SetDocColors( pPage );
+
+ // Html head
+ OUStringBuffer aStr(gaHTMLHeader);
+ aStr.append(CreateMetaCharset());
+ aStr.append(" <title>");
+ aStr.append(StringToHTMLString(maPageNames[0]));
+ aStr.append("</title>\r\n</head>\r\n");
+ aStr.append(CreateBodyTag());
+
+ if(pPage)
+ aStr.append(CreateTextForNotesPage( pOutliner, pPage, maBackColor ));
+
+ aStr.append("</body>\r\n</html>");
+
+ OUString aFileName("note" + OUString::number(nSdPage));
+ bOk = WriteHtml(aFileName, true, aStr.makeStringAndClear());
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+ }
+
+ pOutliner->Clear();
+
+ return bOk;
+}
+
+// create outline pages (for frames)
+
+bool HtmlExport::CreateOutlinePages()
+{
+ bool bOk = true;
+
+ if( mbDocColors )
+ {
+ SetDocColors();
+ }
+
+ // page 0 will be the closed outline, page 1 the opened
+ for (sal_Int32 nPage = 0; nPage < (mbImpress?2:1) && bOk; ++nPage)
+ {
+ // Html head
+ OUStringBuffer aStr(gaHTMLHeader);
+ aStr.append(CreateMetaCharset());
+ aStr.append(" <title>");
+ aStr.append(StringToHTMLString(maPageNames[0]));
+ aStr.append("</title>\r\n</head>\r\n");
+ aStr.append(CreateBodyTag());
+
+ SdrOutliner* pOutliner = mpDoc->GetInternalOutliner();
+ for(sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
+ {
+ SdPage* pPage = maPages[ nSdPage ];
+
+ aStr.append("<div align=\"left\">");
+ OUString aLink("JavaScript:parent.NavigateAbs(" +
+ OUString::number(nSdPage) + ")");
+
+ OUString aTitle = CreateTextForTitle(pOutliner, pPage, maBackColor);
+ if (aTitle.isEmpty())
+ aTitle = maPageNames[nSdPage];
+
+ lclAppendStyle(aStr, u"p", getParagraphStyle(pOutliner, 0));
+ aStr.append(CreateLink(aLink, aTitle));
+ aStr.append("</p>");
+
+ if(nPage==1)
+ {
+ aStr.append(CreateTextForPage( pOutliner, pPage, false, maBackColor ));
+ }
+ aStr.append("</div>\r\n");
+ }
+ pOutliner->Clear();
+
+ aStr.append("</body>\r\n</html>");
+
+ OUString aFileName("outline" + OUString::number(nPage));
+ bOk = WriteHtml(aFileName, true, aStr.makeStringAndClear());
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+ }
+
+ return bOk;
+}
+
+// set file name
+void HtmlExport::CreateFileNames()
+{
+ // create lists with new file names
+ maHTMLFiles.resize(mnSdPageCount);
+ maImageFiles.resize(mnSdPageCount);
+ maThumbnailFiles.resize(mnSdPageCount);
+ maPageNames.resize(mnSdPageCount);
+ maTextFiles.resize(mnSdPageCount);
+
+ mbHeader = false; // headline on overview page?
+
+ for (sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
+ {
+ OUString aHTMLFileName;
+ if(nSdPage == 0 && !mbContentsPage && !mbFrames )
+ aHTMLFileName = maIndex;
+ else
+ {
+ aHTMLFileName = "img" + OUString::number(nSdPage) + gaHTMLExtension;
+ }
+
+ maHTMLFiles[nSdPage] = aHTMLFileName;
+
+ OUString aImageFileName = "img" + OUString::number(nSdPage);
+ if( meFormat==FORMAT_GIF )
+ aImageFileName += ".gif";
+ else if( meFormat==FORMAT_JPG )
+ aImageFileName += ".jpg";
+ else
+ aImageFileName += ".png";
+
+ maImageFiles[nSdPage] = aImageFileName;
+
+ OUString aThumbnailFileName = "thumb" + OUString::number(nSdPage);
+ if( meFormat!=FORMAT_JPG )
+ aThumbnailFileName += ".png";
+ else
+ aThumbnailFileName += ".jpg";
+
+ maThumbnailFiles[nSdPage] = aThumbnailFileName;
+
+ maTextFiles[nSdPage] = "text" + OUString::number(nSdPage) + gaHTMLExtension;
+
+ SdPage* pSdPage = maPages[ nSdPage ];
+
+ // get slide title from page name
+ maPageNames[nSdPage] = pSdPage->GetName();
+ }
+
+ if(!mbContentsPage && mbFrames)
+ maFramePage = maIndex;
+ else
+ {
+ maFramePage = "siframes" + gaHTMLExtension;
+ }
+}
+
+OUString const & HtmlExport::getDocumentTitle()
+{
+ // check for a title object in this page, if it's the first
+ // title it becomes this documents title for the content
+ // page
+ if( !mbHeader )
+ {
+ if(mbImpress)
+ {
+ // if there is a non-empty title object, use their first passage
+ // as page title
+ SdPage* pSdPage = mpDoc->GetSdPage(0, PageKind::Standard);
+ SdrObject* pTitleObj = pSdPage->GetPresObj(PresObjKind::Title);
+ if (pTitleObj && !pTitleObj->IsEmptyPresObj())
+ {
+ OutlinerParaObject* pParaObject = pTitleObj->GetOutlinerParaObject();
+ if (pParaObject)
+ {
+ const EditTextObject& rEditTextObject =
+ pParaObject->GetTextObject();
+ OUString aTest(rEditTextObject.GetText(0));
+ if (!aTest.isEmpty())
+ mDocTitle = aTest;
+ }
+ }
+
+ mDocTitle = mDocTitle.replace(0xff, ' ');
+ }
+
+ if (mDocTitle.isEmpty())
+ {
+ mDocTitle = maDocFileName;
+ sal_Int32 nDot = mDocTitle.indexOf('.');
+ if (nDot > 0)
+ mDocTitle = mDocTitle.copy(0, nDot);
+ }
+ mbHeader = true;
+ }
+
+ return mDocTitle;
+}
+
+constexpr OUStringLiteral JS_NavigateAbs =
+ u"function NavigateAbs( nPage )\r\n"
+ "{\r\n"
+ " frames[\"show\"].location.href = \"img\" + nPage + \".$EXT\";\r\n"
+ " //frames[\"notes\"].location.href = \"note\" + nPage + \".$EXT\";\r\n"
+ " nCurrentPage = nPage;\r\n"
+ " if(nCurrentPage==0)\r\n"
+ " {\r\n"
+ " frames[\"navbar1\"].location.href = \"navbar0.$EXT\";\r\n"
+ " }\r\n"
+ " else if(nCurrentPage==nPageCount-1)\r\n"
+ " {\r\n"
+ " frames[\"navbar1\"].location.href = \"navbar2.$EXT\";\r\n"
+ " }\r\n"
+ " else\r\n"
+ " {\r\n"
+ " frames[\"navbar1\"].location.href = \"navbar1.$EXT\";\r\n"
+ " }\r\n"
+ "}\r\n\r\n";
+
+constexpr OUStringLiteral JS_NavigateRel =
+ u"function NavigateRel( nDelta )\r\n"
+ "{\r\n"
+ " var nPage = parseInt(nCurrentPage) + parseInt(nDelta);\r\n"
+ " if( (nPage >= 0) && (nPage < nPageCount) )\r\n"
+ " {\r\n"
+ " NavigateAbs( nPage );\r\n"
+ " }\r\n"
+ "}\r\n\r\n";
+
+constexpr OUStringLiteral JS_ExpandOutline =
+ u"function ExpandOutline()\r\n"
+ "{\r\n"
+ " frames[\"navbar2\"].location.href = \"navbar4.$EXT\";\r\n"
+ " frames[\"outline\"].location.href = \"outline1.$EXT\";\r\n"
+ "}\r\n\r\n";
+
+constexpr OUStringLiteral JS_CollapseOutline =
+ u"function CollapseOutline()\r\n"
+ "{\r\n"
+ " frames[\"navbar2\"].location.href = \"navbar3.$EXT\";\r\n"
+ " frames[\"outline\"].location.href = \"outline0.$EXT\";\r\n"
+ "}\r\n\r\n";
+
+// create page with the frames
+
+bool HtmlExport::CreateFrames()
+{
+ OUString aTmp;
+ OUStringBuffer aStr(
+ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\"\r\n"
+ " \"http://www.w3.org/TR/html4/frameset.dtd\">\r\n"
+ "<html>\r\n<head>\r\n");
+
+ aStr.append(CreateMetaCharset());
+ aStr.append(" <title>");
+ aStr.append(StringToHTMLString(maPageNames[0]));
+ aStr.append("</title>\r\n");
+
+ aStr.append("<script type=\"text/javascript\">\r\n<!--\r\n");
+
+ aStr.append("var nCurrentPage = 0;\r\nvar nPageCount = ");
+ aStr.append(static_cast<sal_Int32>(mnSdPageCount));
+ aStr.append(";\r\n\r\n");
+
+ OUString aFunction = JS_NavigateAbs;
+
+ if(mbNotes)
+ {
+ aFunction = aFunction.replaceAll("//", "");
+ }
+
+ // substitute HTML file extension
+ OUString aPlaceHolder(".$EXT");
+ aFunction = aFunction.replaceAll(aPlaceHolder, gaHTMLExtension);
+ aStr.append(aFunction);
+
+ aTmp = JS_NavigateRel;
+ aTmp = aTmp.replaceAll(aPlaceHolder, gaHTMLExtension);
+ aStr.append(aTmp);
+
+ if(mbImpress)
+ {
+ aTmp = JS_ExpandOutline;
+ aTmp = aTmp.replaceAll(aPlaceHolder, gaHTMLExtension);
+ aStr.append(aTmp);
+
+ aTmp = JS_CollapseOutline;
+ aTmp = aTmp.replaceAll(aPlaceHolder, gaHTMLExtension);
+ aStr.append(aTmp);
+ }
+ aStr.append("// -->\r\n</script>\r\n");
+
+ aStr.append("</head>\r\n");
+
+ aStr.append("<frameset cols=\"*,");
+ aStr.append(static_cast<sal_Int32>(mnWidthPixel + 16));
+ aStr.append("\">\r\n");
+ if(mbImpress)
+ {
+ aStr.append(" <frameset rows=\"42,*\">\r\n");
+ aStr.append(" <frame src=\"navbar3");
+ aStr.append(gaHTMLExtension);
+ aStr.append("\" name=\"navbar2\" marginwidth=\"4\" marginheight=\"4\" scrolling=\"no\">\r\n");
+ }
+ aStr.append(" <frame src=\"outline0");
+ aStr.append(gaHTMLExtension);
+ aStr.append("\" name=\"outline\">\r\n");
+ if(mbImpress)
+ aStr.append(" </frameset>\r\n");
+
+ if(mbNotes)
+ {
+ aStr.append(" <frameset rows=\"42,");
+ aStr.append(static_cast<sal_Int32>(static_cast<double>(mnWidthPixel) * 0.75) + 16);
+ aStr.append(",*\">\r\n");
+ }
+ else
+ aStr.append(" <frameset rows=\"42,*\">\r\n");
+
+ aStr.append(" <frame src=\"navbar0");
+ aStr.append(gaHTMLExtension);
+ aStr.append("\" name=\"navbar1\" marginwidth=\"4\" marginheight=\"4\" scrolling=\"no\">\r\n");
+
+ aStr.append(" <frame src=\"");
+ aStr.append(maHTMLFiles[0]);
+ aStr.append("\" name=\"show\" marginwidth=\"4\" marginheight=\"4\">\r\n");
+
+ if(mbNotes)
+ {
+ aStr.append(" <frame src=\"note0");
+ aStr.append(gaHTMLExtension);
+ aStr.append("\" name=\"notes\">\r\n");
+ }
+ aStr.append(" </frameset>\r\n");
+
+ aStr.append("<noframes>\r\n");
+ aStr.append(CreateBodyTag());
+ aStr.append(RESTOHTML(STR_HTMLEXP_NOFRAMES));
+ aStr.append("\r\n</noframes>\r\n</frameset>\r\n</html>");
+
+ bool bOk = WriteHtml(maFramePage, false, aStr.makeStringAndClear());
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ return bOk;
+}
+
+// create button bar for standard
+// we create the following html files
+// navbar0.htm navigation bar graphic for the first page
+// navbar1.htm navigation bar graphic for the second until second last page
+// navbar2.htm navigation bar graphic for the last page
+// navbar3.htm navigation outline closed
+// navbar4.htm navigation outline open
+bool HtmlExport::CreateNavBarFrames()
+{
+ bool bOk = true;
+ OUString aButton;
+
+ if( mbDocColors )
+ {
+ SetDocColors();
+ maBackColor = maFirstPageColor;
+ }
+
+ for( int nFile = 0; nFile < 3 && bOk; nFile++ )
+ {
+ OUStringBuffer aStr(gaHTMLHeader);
+ aStr.append(CreateMetaCharset());
+ aStr.append(" <title>");
+ aStr.append(StringToHTMLString(maPageNames[0]));
+ aStr.append("</title>\r\n</head>\r\n");
+ aStr.append(CreateBodyTag());
+ aStr.append("<center>\r\n");
+
+ // first page
+ aButton = SdResId(STR_HTMLEXP_FIRSTPAGE);
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName(nFile == 0 || mnSdPageCount == 1 ? BTN_FIRST_0 : BTN_FIRST_1),
+ aButton);
+
+ if(nFile != 0 && mnSdPageCount > 1)
+ aButton = CreateLink(u"JavaScript:parent.NavigateAbs(0)", aButton);
+
+ aStr.append(aButton);
+ aStr.append("\r\n");
+
+ // to the previous page
+ aButton = SdResId(STR_PUBLISH_BACK);
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName(nFile == 0 || mnSdPageCount == 1?
+ BTN_PREV_0:BTN_PREV_1),
+ aButton);
+
+ if(nFile != 0 && mnSdPageCount > 1)
+ aButton = CreateLink(u"JavaScript:parent.NavigateRel(-1)", aButton);
+
+ aStr.append(aButton);
+ aStr.append("\r\n");
+
+ // to the next page
+ aButton = SdResId(STR_PUBLISH_NEXT);
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName(nFile ==2 || mnSdPageCount == 1?
+ BTN_NEXT_0:BTN_NEXT_1),
+ aButton);
+
+ if(nFile != 2 && mnSdPageCount > 1)
+ aButton = CreateLink(u"JavaScript:parent.NavigateRel(1)", aButton);
+
+ aStr.append(aButton);
+ aStr.append("\r\n");
+
+ // to the last page
+ aButton = SdResId(STR_HTMLEXP_LASTPAGE);
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName(nFile ==2 || mnSdPageCount == 1?
+ BTN_LAST_0:BTN_LAST_1),
+ aButton);
+
+ if(nFile != 2 && mnSdPageCount > 1)
+ {
+ OUString aLink("JavaScript:parent.NavigateAbs(" +
+ OUString::number(mnSdPageCount-1) + ")");
+
+ aButton = CreateLink(aLink, aButton);
+ }
+
+ aStr.append(aButton);
+ aStr.append("\r\n");
+
+ // content
+ if (mbContentsPage)
+ {
+ aButton = SdResId(STR_PUBLISH_OUTLINE);
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName(BTN_INDEX), aButton);
+
+ // to the overview
+ aStr.append(CreateLink(maIndex, aButton, u"_top"));
+ aStr.append("\r\n");
+ }
+
+ // text mode
+ if(mbImpress)
+ {
+ aButton = SdResId(STR_HTMLEXP_SETTEXT);
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName(BTN_TEXT), aButton);
+
+ OUString aText0("text0" + gaHTMLExtension);
+ aStr.append(CreateLink(aText0, aButton, u"_top"));
+ aStr.append("\r\n");
+ }
+
+ // and finished...
+ aStr.append("</center>\r\n");
+ aStr.append("</body>\r\n</html>");
+
+ OUString aFileName("navbar" + OUString::number(nFile));
+
+ bOk = WriteHtml(aFileName, true, aStr.makeStringAndClear());
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+ }
+
+ // the navigation bar outliner closed...
+ if(bOk)
+ {
+ aButton = SdResId(STR_HTMLEXP_OUTLINE);
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName(BTN_MORE), aButton);
+
+ bOk = WriteHtml(
+ "navbar3", true,
+ OUStringConcatenation(
+ gaHTMLHeader + CreateMetaCharset() + " <title>"
+ + StringToHTMLString(maPageNames[0]) + "</title>\r\n</head>\r\n" + CreateBodyTag()
+ + CreateLink(u"JavaScript:parent.ExpandOutline()", aButton)
+ + "</body>\r\n</html>"));
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+ }
+
+ // ... and the outliner open
+ if( bOk )
+ {
+ aButton = SdResId(STR_HTMLEXP_NOOUTLINE);
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName(BTN_LESS), aButton);
+
+ bOk = WriteHtml(
+ "navbar4", true,
+ OUStringConcatenation(
+ gaHTMLHeader + CreateMetaCharset() + " <title>"
+ + StringToHTMLString(maPageNames[0]) + "</title>\r\n</head>\r\n" + CreateBodyTag()
+ + CreateLink(u"JavaScript:parent.CollapseOutline()", aButton)
+ + "</body>\r\n</html>"));
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ }
+
+ return bOk;
+}
+
+// create button bar for standard
+OUString HtmlExport::CreateNavBar( sal_uInt16 nSdPage, bool bIsText ) const
+{
+ // prepare button bar
+ OUString aStrNavFirst(SdResId(STR_HTMLEXP_FIRSTPAGE));
+ OUString aStrNavPrev(SdResId(STR_PUBLISH_BACK));
+ OUString aStrNavNext(SdResId(STR_PUBLISH_NEXT));
+ OUString aStrNavLast(SdResId(STR_HTMLEXP_LASTPAGE));
+ OUString aStrNavContent(SdResId(STR_PUBLISH_OUTLINE));
+ OUString aStrNavText;
+ if( bIsText )
+ {
+ aStrNavText = SdResId(STR_HTMLEXP_SETGRAPHIC);
+ }
+ else
+ {
+ aStrNavText = SdResId(STR_HTMLEXP_SETTEXT);
+ }
+
+ if(!bIsText && mnButtonThema != -1)
+ {
+ if(nSdPage<1 || mnSdPageCount == 1)
+ {
+ aStrNavFirst = CreateImage(GetButtonName(BTN_FIRST_0), aStrNavFirst);
+ aStrNavPrev = CreateImage(GetButtonName(BTN_PREV_0), aStrNavPrev);
+ }
+ else
+ {
+ aStrNavFirst = CreateImage(GetButtonName(BTN_FIRST_1), aStrNavFirst);
+ aStrNavPrev = CreateImage(GetButtonName(BTN_PREV_1), aStrNavPrev);
+ }
+
+ if(nSdPage == mnSdPageCount-1 || mnSdPageCount == 1)
+ {
+ aStrNavNext = CreateImage(GetButtonName(BTN_NEXT_0), aStrNavNext);
+ aStrNavLast = CreateImage(GetButtonName(BTN_LAST_0), aStrNavLast);
+ }
+ else
+ {
+ aStrNavNext = CreateImage(GetButtonName(BTN_NEXT_1), aStrNavNext);
+ aStrNavLast = CreateImage(GetButtonName(BTN_LAST_1), aStrNavLast);
+ }
+
+ aStrNavContent = CreateImage(GetButtonName(BTN_INDEX), aStrNavContent);
+ aStrNavText = CreateImage(GetButtonName(BTN_TEXT), aStrNavText);
+ }
+
+ OUStringBuffer aStr("<center>\r\n"); //<table><tr>\r\n");
+
+ // first page
+ if(nSdPage > 0)
+ aStr.append(CreateLink( bIsText ? maTextFiles[0] : maHTMLFiles[0],aStrNavFirst));
+ else
+ aStr.append(aStrNavFirst);
+ aStr.append(' ');
+
+ // to Previous page
+ if(nSdPage > 0)
+ aStr.append(CreateLink( bIsText ? maTextFiles[nSdPage-1]
+ : maHTMLFiles[nSdPage-1], aStrNavPrev));
+ else
+ aStr.append(aStrNavPrev);
+ aStr.append(' ');
+
+ // to Next page
+ if(nSdPage < mnSdPageCount-1)
+ aStr.append(CreateLink( bIsText ? maTextFiles[nSdPage+1]
+ : maHTMLFiles[nSdPage+1], aStrNavNext));
+ else
+ aStr.append(aStrNavNext);
+ aStr.append(' ');
+
+ // to Last page
+ if(nSdPage < mnSdPageCount-1)
+ aStr.append(CreateLink( bIsText ? maTextFiles[mnSdPageCount-1]
+ : maHTMLFiles[mnSdPageCount-1],
+ aStrNavLast));
+ else
+ aStr.append(aStrNavLast);
+ aStr.append(' ');
+
+ // to Index page
+ if (mbContentsPage)
+ {
+ aStr.append(CreateLink(maIndex, aStrNavContent));
+ aStr.append(' ');
+ }
+
+ // Text/Graphics
+ if(mbImpress)
+ {
+ aStr.append(CreateLink( bIsText ? (mbFrames ? maFramePage : maHTMLFiles[nSdPage])
+ : maTextFiles[nSdPage], aStrNavText));
+
+ }
+
+ aStr.append("</center><br>\r\n");
+
+ return aStr.makeStringAndClear();
+}
+
+// export navigation graphics from button set
+void HtmlExport::CreateBitmaps()
+{
+ if(mnButtonThema == -1 || !mpButtonSet)
+ return;
+
+ for( int nButton = 0; nButton != SAL_N_ELEMENTS(pButtonNames); nButton++ )
+ {
+ if(!mbFrames && (nButton == BTN_MORE || nButton == BTN_LESS))
+ continue;
+
+ if(!mbImpress && (nButton == BTN_TEXT || nButton == BTN_MORE || nButton == BTN_LESS ))
+ continue;
+
+ OUString aFull = maExportPath + GetButtonName(nButton);
+ mpButtonSet->exportButton( mnButtonThema, aFull, GetButtonName(nButton) );
+ }
+}
+
+// creates the <body> tag, including the specified color attributes
+OUString HtmlExport::CreateBodyTag() const
+{
+ OUStringBuffer aStr( "<body" );
+
+ if( mbUserAttr || mbDocColors )
+ {
+ Color aTextColor( maTextColor );
+ if( (aTextColor == COL_AUTO) && (!maBackColor.IsDark()) )
+ aTextColor = COL_BLACK;
+
+ aStr.append(" text=\"");
+ aStr.append(ColorToHTMLString( aTextColor ));
+ aStr.append("\" bgcolor=\"");
+ aStr.append(ColorToHTMLString( maBackColor ));
+ aStr.append("\" link=\"");
+ aStr.append(ColorToHTMLString( maLinkColor ));
+ aStr.append("\" vlink=\"");
+ aStr.append(ColorToHTMLString( maVLinkColor ));
+ aStr.append("\" alink=\"");
+ aStr.append(ColorToHTMLString( maALinkColor ));
+ aStr.append("\"");
+ }
+
+ aStr.append(">\r\n");
+
+ return aStr.makeStringAndClear();
+}
+
+// creates a hyperlink
+OUString HtmlExport::CreateLink( std::u16string_view aLink,
+ std::u16string_view aText,
+ std::u16string_view aTarget )
+{
+ OUStringBuffer aStr( "<a href=\"" );
+ aStr.append(aLink);
+ if (!aTarget.empty())
+ {
+ aStr.append("\" target=\"");
+ aStr.append(aTarget);
+ }
+ aStr.append("\">");
+ aStr.append(aText);
+ aStr.append("</a>");
+
+ return aStr.makeStringAndClear();
+}
+
+// creates an image tag
+OUString HtmlExport::CreateImage( std::u16string_view aImage, std::u16string_view aAltText )
+{
+ OUStringBuffer aStr( "<img src=\"");
+ aStr.append(aImage);
+ aStr.append("\" border=0");
+
+ if (!aAltText.empty())
+ {
+ aStr.append(" alt=\"");
+ aStr.append(aAltText);
+ aStr.append('"');
+ }
+ else
+ {
+ // Agerskov: HTML 4.01 has to have an alt attribute even if it is an empty string
+ aStr.append(" alt=\"\"");
+ }
+
+ aStr.append('>');
+
+ return aStr.makeStringAndClear();
+}
+
+// create area for a circle; we expect pixel coordinates
+OUString HtmlExport::ColorToHTMLString( Color aColor )
+{
+ static const char hex[] = "0123456789ABCDEF";
+ OUStringBuffer aStr( "#xxxxxx" );
+ aStr[1] = hex[(aColor.GetRed() >> 4) & 0xf];
+ aStr[2] = hex[aColor.GetRed() & 0xf];
+ aStr[3] = hex[(aColor.GetGreen() >> 4) & 0xf];
+ aStr[4] = hex[aColor.GetGreen() & 0xf];
+ aStr[5] = hex[(aColor.GetBlue() >> 4) & 0xf];
+ aStr[6] = hex[aColor.GetBlue() & 0xf];
+
+ return aStr.makeStringAndClear();
+}
+
+// create area for a circle; we expect pixel coordinates
+OUString HtmlExport::CreateHTMLCircleArea( sal_uLong nRadius,
+ sal_uLong nCenterX,
+ sal_uLong nCenterY,
+ std::u16string_view rHRef )
+{
+ OUString aStr(
+ "<area shape=\"circle\" alt=\"\" coords=\"" +
+ OUString::number(nCenterX) + "," +
+ OUString::number(nCenterY) + "," +
+ OUString::number(nRadius) +
+ "\" href=\"" + rHRef + "\">\n");
+
+ return aStr;
+}
+
+// create area for a polygon; we expect pixel coordinates
+OUString HtmlExport::CreateHTMLPolygonArea( const ::basegfx::B2DPolyPolygon& rPolyPolygon,
+ Size aShift, double fFactor, std::u16string_view rHRef )
+{
+ OUStringBuffer aStr;
+ const sal_uInt32 nNoOfPolygons(rPolyPolygon.count());
+
+ for ( sal_uInt32 nXPoly = 0; nXPoly < nNoOfPolygons; nXPoly++ )
+ {
+ const ::basegfx::B2DPolygon& aPolygon = rPolyPolygon.getB2DPolygon(nXPoly);
+ const sal_uInt32 nNoOfPoints(aPolygon.count());
+
+ aStr.append("<area shape=\"polygon\" alt=\"\" coords=\"");
+
+ for ( sal_uInt32 nPoint = 0; nPoint < nNoOfPoints; nPoint++ )
+ {
+ const ::basegfx::B2DPoint aB2DPoint(aPolygon.getB2DPoint(nPoint));
+ Point aPnt(FRound(aB2DPoint.getX()), FRound(aB2DPoint.getY()));
+ // coordinates are relative to the physical page origin, not the
+ // origin of ordinates
+ aPnt.Move(aShift.Width(), aShift.Height());
+
+ aPnt.setX( static_cast<tools::Long>(aPnt.X() * fFactor) );
+ aPnt.setY( static_cast<tools::Long>(aPnt.Y() * fFactor) );
+ aStr.append( OUString::number(aPnt.X()) + "," + OUString::number(aPnt.Y()) );
+
+ if (nPoint < nNoOfPoints - 1)
+ aStr.append(',');
+ }
+ aStr.append(OUString::Concat("\" href=\"") + rHRef + "\">\n");
+ }
+
+ return aStr.makeStringAndClear();
+}
+
+// create area for a rectangle; we expect pixel coordinates
+OUString HtmlExport::CreateHTMLRectArea( const ::tools::Rectangle& rRect,
+ std::u16string_view rHRef )
+{
+ OUString aStr(
+ "<area shape=\"rect\" alt=\"\" coords=\"" +
+ OUString::number(rRect.Left()) + "," +
+ OUString::number(rRect.Top()) + "," +
+ OUString::number(rRect.Right()) + "," +
+ OUString::number(rRect.Bottom()) +
+ "\" href=\"" + rHRef + "\">\n");
+
+ return aStr;
+}
+
+// escapes a string for html
+OUString HtmlExport::StringToHTMLString( const OUString& rString )
+{
+ SvMemoryStream aMemStm;
+ HTMLOutFuncs::Out_String( aMemStm, rString );
+ aMemStm.WriteChar( char(0) );
+ sal_Int32 nLength = strlen(static_cast<char const *>(aMemStm.GetData()));
+ return OUString( static_cast<char const *>(aMemStm.GetData()), nLength, RTL_TEXTENCODING_UTF8 );
+}
+
+// creates a URL for a specific page
+OUString HtmlExport::CreatePageURL( sal_uInt16 nPgNum )
+{
+ if(mbFrames)
+ {
+ return OUString("JavaScript:parent.NavigateAbs(" +
+ OUString::number(nPgNum) + ")");
+ }
+ else
+ return maHTMLFiles[nPgNum];
+}
+
+bool HtmlExport::CopyScript( std::u16string_view rPath, const OUString& rSource, const OUString& rDest, bool bUnix /* = false */ )
+{
+ INetURLObject aURL( SvtPathOptions().GetConfigPath() );
+ OUStringBuffer aScriptBuf;
+
+ aURL.Append( u"webcast" );
+ aURL.Append( rSource );
+
+ meEC.SetContext( STR_HTMLEXP_ERROR_OPEN_FILE, rSource );
+
+ ErrCode nErr = ERRCODE_NONE;
+ std::unique_ptr<SvStream> pIStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ), StreamMode::READ );
+
+ if( pIStm )
+ {
+ OStringBuffer aLine;
+
+ while( pIStm->ReadLine( aLine ) )
+ {
+ aScriptBuf.appendAscii( aLine.getStr(), aLine.getLength() );
+ if( bUnix )
+ {
+ aScriptBuf.append("\n");
+ }
+ else
+ {
+ aScriptBuf.append("\r\n");
+ }
+ }
+
+ nErr = pIStm->GetError();
+ pIStm.reset();
+ }
+
+ if( nErr != ERRCODE_NONE )
+ {
+ ErrorHandler::HandleError( nErr );
+ return static_cast<bool>(nErr);
+ }
+
+ OUString aScript(aScriptBuf.makeStringAndClear());
+ aScript = aScript.replaceAll("$$1", getDocumentTitle());
+ aScript = aScript.replaceAll("$$2", RESTOHTML(STR_WEBVIEW_SAVE));
+ aScript = aScript.replaceAll("$$3", maCGIPath);
+ aScript = aScript.replaceAll("$$4", OUString::number(mnWidthPixel));
+ aScript = aScript.replaceAll("$$5", OUString::number(mnHeightPixel));
+
+ OUString aDest(rPath + rDest);
+
+ meEC.SetContext( STR_HTMLEXP_ERROR_CREATE_FILE, rDest );
+ // write script file
+ {
+ EasyFile aFile;
+ SvStream* pStr;
+ nErr = aFile.createStream(aDest, pStr);
+ if(nErr == ERRCODE_NONE)
+ {
+ OString aStr(OUStringToOString(aScript, RTL_TEXTENCODING_UTF8));
+ pStr->WriteOString( aStr );
+ aFile.close();
+ }
+ }
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ if( nErr != ERRCODE_NONE )
+ ErrorHandler::HandleError( nErr );
+
+ return nErr == ERRCODE_NONE;
+}
+
+static const char * ASP_Scripts[] = { "common.inc", "webcast.asp", "show.asp", "savepic.asp", "poll.asp", "editpic.asp" };
+
+/** creates and saves the ASP scripts for WebShow */
+bool HtmlExport::CreateASPScripts()
+{
+ for(const char * p : ASP_Scripts)
+ {
+ OUString aScript = OUString::createFromAscii(p);
+
+ if(!CopyScript(maExportPath, aScript, aScript))
+ return false;
+ }
+
+ return CopyScript(maExportPath, "edit.asp", maIndex);
+}
+
+static const char *PERL_Scripts[] = { "webcast.pl", "common.pl", "editpic.pl", "poll.pl", "savepic.pl", "show.pl" };
+
+// creates and saves the PERL scripts for WebShow
+bool HtmlExport::CreatePERLScripts()
+{
+ for(const char * p : PERL_Scripts)
+ {
+ OUString aScript = OUString::createFromAscii(p);
+
+ if(!CopyScript(maExportPath, aScript, aScript, true))
+ return false;
+ }
+
+ if (!CopyScript(maExportPath, "edit.pl", maIndex, true))
+ return false;
+
+ if (!CopyScript(maExportPath, "index.pl", maIndexUrl, true))
+ return false;
+
+ return true;
+}
+
+// creates a list with names of the saved images
+bool HtmlExport::CreateImageFileList()
+{
+ OUStringBuffer aStr;
+ for( sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
+ {
+ aStr.append(static_cast<sal_Int32>(nSdPage + 1));
+ aStr.append(';');
+ aStr.append(maURLPath);
+ aStr.append(maImageFiles[nSdPage]);
+ aStr.append("\r\n");
+ }
+
+ bool bOk = WriteHtml("picture.txt", false, aStr.makeStringAndClear());
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ return bOk;
+}
+
+// creates a file with the actual page number
+bool HtmlExport::CreateImageNumberFile()
+{
+ OUString aFileName("currpic.txt");
+ OUString aFull(maExportPath + aFileName);
+
+ meEC.SetContext( STR_HTMLEXP_ERROR_CREATE_FILE, aFileName );
+ EasyFile aFile;
+ SvStream* pStr;
+ ErrCode nErr = aFile.createStream(aFull, pStr);
+ if(nErr == ERRCODE_NONE)
+ {
+ pStr->WriteCharPtr( "1" );
+ aFile.close();
+ }
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ if( nErr != ERRCODE_NONE )
+ ErrorHandler::HandleError( nErr );
+
+ return nErr == ERRCODE_NONE;
+}
+
+OUString HtmlExport::InsertSound( const OUString& rSoundFile )
+{
+ if (rSoundFile.isEmpty())
+ return rSoundFile;
+
+ INetURLObject aURL( rSoundFile );
+ OUString aSoundFileName = aURL.getName();
+
+ DBG_ASSERT( aURL.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
+
+ OUString aStr("<embed src=\"" + aSoundFileName +
+ "\" hidden=\"true\" autostart=\"true\">");
+
+ CopyFile(rSoundFile, maExportPath + aSoundFileName);
+
+ return aStr;
+}
+
+bool HtmlExport::CopyFile( const OUString& rSourceFile, const OUString& rDestFile )
+{
+ meEC.SetContext( STR_HTMLEXP_ERROR_COPY_FILE, rSourceFile, rDestFile );
+ osl::FileBase::RC Error = osl::File::copy( rSourceFile, rDestFile );
+
+ if( Error != osl::FileBase::E_None )
+ {
+ ErrorHandler::HandleError(ErrCode(Error));
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+bool HtmlExport::checkFileExists( Reference< css::ucb::XSimpleFileAccess3 > const & xFileAccess, std::u16string_view aFileName )
+{
+ try
+ {
+ OUString url = maExportPath + aFileName;
+ return xFileAccess->exists( url );
+ }
+ catch( css::uno::Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::HtmlExport::checkFileExists()" );
+ }
+
+ return false;
+}
+
+bool HtmlExport::checkForExistingFiles()
+{
+ bool bFound = false;
+
+ try
+ {
+ Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
+ uno::Reference<ucb::XSimpleFileAccess3> xFA(ucb::SimpleFileAccess::create(xContext));
+
+ sal_uInt16 nSdPage;
+ for( nSdPage = 0; !bFound && (nSdPage < mnSdPageCount); nSdPage++)
+ {
+ if( checkFileExists( xFA, maImageFiles[nSdPage] ) ||
+ checkFileExists( xFA, maHTMLFiles[nSdPage] ) ||
+ checkFileExists( xFA, maThumbnailFiles[nSdPage] ) ||
+ checkFileExists( xFA, maPageNames[nSdPage] ) ||
+ checkFileExists( xFA, maTextFiles[nSdPage] ) )
+ {
+ bFound = true;
+ }
+ }
+
+ if( !bFound && mbDownload )
+ bFound = checkFileExists( xFA, maDocFileName );
+
+ if( !bFound && mbFrames )
+ bFound = checkFileExists( xFA, maFramePage );
+
+ if( bFound )
+ {
+ OUString aSystemPath;
+ osl::FileBase::getSystemPathFromFileURL( maExportPath, aSystemPath );
+ OUString aMsg(SdResId(STR_OVERWRITE_WARNING));
+ aMsg = aMsg.replaceFirst( "%FILENAME", aSystemPath );
+
+ std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(nullptr,
+ VclMessageType::Warning, VclButtonsType::YesNo,
+ aMsg));
+ xWarn->set_default_response(RET_YES);
+ bFound = (RET_NO == xWarn->run());
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::HtmlExport::checkForExistingFiles()" );
+ bFound = false;
+ }
+
+ return bFound;
+}
+
+OUString HtmlExport::GetButtonName( int nButton )
+{
+ return OUString::createFromAscii(pButtonNames[nButton]);
+}
+
+EasyFile::EasyFile() : bOpen(false)
+{
+}
+
+EasyFile::~EasyFile()
+{
+ if( bOpen )
+ close();
+}
+
+ErrCode EasyFile::createStream( const OUString& rUrl, SvStream* &rpStr )
+{
+ if(bOpen)
+ close();
+
+ OUString aFileName;
+ createFileName( rUrl, aFileName );
+
+ ErrCode nErr = ERRCODE_NONE;
+ pOStm = ::utl::UcbStreamHelper::CreateStream( aFileName, StreamMode::WRITE | StreamMode::TRUNC );
+ if( pOStm )
+ {
+ bOpen = true;
+ nErr = pOStm->GetError();
+ }
+ else
+ {
+ nErr = ERRCODE_SFX_CANTCREATECONTENT;
+ }
+
+ if( nErr != ERRCODE_NONE )
+ {
+ bOpen = false;
+ pOStm.reset();
+ }
+
+ rpStr = pOStm.get();
+
+ return nErr;
+}
+
+void EasyFile::createFileName( const OUString& rURL, OUString& rFileName )
+{
+ if( bOpen )
+ close();
+
+ INetURLObject aURL( rURL );
+
+ if( aURL.GetProtocol() == INetProtocol::NotValid )
+ {
+ OUString aURLStr;
+ osl::FileBase::getFileURLFromSystemPath( rURL, aURLStr );
+ aURL = INetURLObject( aURLStr );
+ }
+ DBG_ASSERT( aURL.GetProtocol() != INetProtocol::NotValid, "invalid URL" );
+ rFileName = aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE );
+}
+
+void EasyFile::close()
+{
+ pOStm.reset();
+ bOpen = false;
+}
+
+// This class helps reporting errors during file i/o
+HtmlErrorContext::HtmlErrorContext()
+ : ErrorContext(nullptr)
+{
+}
+
+bool HtmlErrorContext::GetString( ErrCode, OUString& rCtxStr )
+{
+ DBG_ASSERT(mpResId, "No error context set");
+ if (!mpResId)
+ return false;
+
+ rCtxStr = SdResId(mpResId);
+
+ rCtxStr = rCtxStr.replaceAll( "$(URL1)", maURL1 );
+ rCtxStr = rCtxStr.replaceAll( "$(URL2)", maURL2 );
+
+ return true;
+}
+
+void HtmlErrorContext::SetContext(TranslateId pResId, const OUString& rURL)
+{
+ mpResId = pResId;
+ maURL1 = rURL;
+ maURL2.clear();
+}
+
+void HtmlErrorContext::SetContext(TranslateId pResId, const OUString& rURL1, const OUString& rURL2 )
+{
+ mpResId = pResId;
+ maURL1 = rURL1;
+ maURL2 = rURL2;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/html/htmlex.hxx b/sd/source/filter/html/htmlex.hxx
new file mode 100644
index 000000000..5f6f06e49
--- /dev/null
+++ b/sd/source/filter/html/htmlex.hxx
@@ -0,0 +1,237 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <resltn.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <tools/color.hxx>
+#include <tools/solar.h>
+#include <vcl/errinf.hxx>
+#include <unotools/resmgr.hxx>
+
+#include "htmlpublishmode.hxx"
+
+#include <memory>
+#include <string_view>
+#include <vector>
+
+namespace basegfx { class B2DPolyPolygon; }
+namespace com::sun::star::beans { struct PropertyValue; }
+namespace com::sun::star::ucb { class XSimpleFileAccess3; }
+namespace sd { class DrawDocShell; }
+namespace tools { class Rectangle; }
+
+#define PUB_LOWRES_WIDTH 640
+#define PUB_MEDRES_WIDTH 800
+#define PUB_HIGHRES_WIDTH 1024
+#define PUB_FHDRES_WIDTH 1920
+
+#define PUB_THUMBNAIL_WIDTH 256
+#define PUB_THUMBNAIL_HEIGHT 192
+
+class ErrCode;
+class OutlinerParaObject;
+class SfxItemSet;
+class Size;
+class SfxProgress;
+class SdrOutliner;
+class SdPage;
+class HtmlState;
+class SdrTextObj;
+class SdrObjGroup;
+namespace sdr::table { class SdrTableObj; }
+class SdrPage;
+class SdDrawDocument;
+class ButtonSet;
+
+class HtmlErrorContext : public ErrorContext
+{
+private:
+ TranslateId mpResId;
+ OUString maURL1;
+ OUString maURL2;
+
+public:
+ explicit HtmlErrorContext();
+
+ virtual bool GetString( ErrCode nErrId, OUString& rCtxStr ) override;
+
+ void SetContext(TranslateId pResId, const OUString& rURL);
+ void SetContext(TranslateId pResId, const OUString& rURL1, const OUString& rURL2);
+};
+
+/// this class exports an Impress Document as a HTML Presentation.
+class HtmlExport final
+{
+ std::vector< SdPage* > maPages;
+ std::vector< SdPage* > maNotesPages;
+
+ OUString maPath;
+
+ SdDrawDocument* mpDoc;
+ ::sd::DrawDocShell* mpDocSh;
+
+ HtmlErrorContext meEC;
+
+ HtmlPublishMode meMode;
+ std::unique_ptr<SfxProgress> mpProgress;
+ bool mbImpress;
+ sal_uInt16 mnSdPageCount;
+ sal_uInt16 mnPagesWritten;
+ bool mbContentsPage;
+ sal_Int16 mnButtonThema;
+ sal_uInt16 mnWidthPixel;
+ sal_uInt16 mnHeightPixel;
+ PublishingFormat meFormat;
+ bool mbHeader;
+ bool mbNotes;
+ bool mbFrames;
+ OUString maIndex;
+ OUString maEMail;
+ OUString maAuthor;
+ OUString maHomePage;
+ OUString maInfo;
+ sal_Int16 mnCompression;
+ OUString maDocFileName;
+ OUString maFramePage;
+ OUString mDocTitle;
+ bool mbDownload;
+
+ bool mbAutoSlide;
+ double mfSlideDuration;
+ bool mbSlideSound;
+ bool mbHiddenSlides;
+ bool mbEndless;
+
+ bool mbUserAttr;
+ Color maTextColor; ///< The following colors are used for the <body> tag if mbUserAttr is true.
+ Color maBackColor;
+ Color maLinkColor;
+ Color maVLinkColor;
+ Color maALinkColor;
+ Color maFirstPageColor;
+ bool mbDocColors;
+
+ std::vector<OUString> maHTMLFiles;
+ std::vector<OUString> maImageFiles;
+ std::vector<OUString> maThumbnailFiles;
+ std::vector<OUString> maPageNames;
+ std::vector<OUString> maTextFiles;
+
+ OUString maExportPath; ///< output directory or URL.
+ OUString maIndexUrl;
+ OUString maURLPath;
+ OUString maCGIPath;
+ PublishingScript meScript;
+
+ std::unique_ptr< ButtonSet > mpButtonSet;
+
+ static SdrTextObj* GetLayoutTextObject(SdrPage const * pPage);
+
+ void SetDocColors( SdPage* pPage = nullptr );
+
+ bool CreateImagesForPresPages( bool bThumbnails = false );
+ bool CreateHtmlTextForPresPages();
+ bool CreateHtmlForPresPages();
+ bool CreateContentPage();
+ void CreateFileNames();
+ void CreateBitmaps();
+ bool CreateOutlinePages();
+ bool CreateFrames();
+ bool CreateNotesPages();
+ bool CreateNavBarFrames();
+
+ bool CreateASPScripts();
+ bool CreatePERLScripts();
+ bool CreateImageFileList();
+ bool CreateImageNumberFile();
+
+ bool checkForExistingFiles();
+ bool checkFileExists( css::uno::Reference< css::ucb::XSimpleFileAccess3 > const & xFileAccess, std::u16string_view aFileName );
+
+ OUString const & getDocumentTitle();
+ bool SavePresentation();
+
+ static OUString CreateLink( std::u16string_view aLink, std::u16string_view aText,
+ std::u16string_view aTarget = std::u16string_view());
+ static OUString CreateImage( std::u16string_view aImage, std::u16string_view aAltText );
+ OUString CreateNavBar( sal_uInt16 nSdPage, bool bIsText ) const;
+ OUString CreateBodyTag() const;
+
+ OUString ParagraphToHTMLString( SdrOutliner const * pOutliner, sal_Int32 nPara, const Color& rBackgroundColor );
+ OUString TextAttribToHTMLString( SfxItemSet const * pSet, HtmlState* pState, const Color& rBackgroundColor );
+
+ OUString CreateTextForTitle( SdrOutliner* pOutliner, SdPage* pPage, const Color& rBackgroundColor );
+ OUString CreateTextForPage( SdrOutliner* pOutliner, SdPage const * pPage, bool bHeadLine, const Color& rBackgroundColor );
+ OUString CreateTextForNotesPage( SdrOutliner* pOutliner, SdPage* pPage, const Color& rBackgroundColor );
+
+ static OUString CreateHTMLCircleArea( sal_uLong nRadius, sal_uLong nCenterX,
+ sal_uLong nCenterY, std::u16string_view rHRef );
+ static OUString CreateHTMLPolygonArea( const ::basegfx::B2DPolyPolygon& rPolyPoly, Size aShift, double fFactor, std::u16string_view rHRef );
+ static OUString CreateHTMLRectArea( const ::tools::Rectangle& rRect,
+ std::u16string_view rHRef );
+
+ OUString CreatePageURL( sal_uInt16 nPgNum );
+
+ OUString InsertSound( const OUString& rSoundFile );
+ bool CopyFile( const OUString& rSourceFile, const OUString& rDestFile );
+ bool CopyScript( std::u16string_view rPath, const OUString& rSource, const OUString& rDest, bool bUnix = false );
+
+ void InitProgress( sal_uInt16 nProgrCount );
+ void ResetProgress();
+
+ /// Output only the charset metadata, title etc. will be handled separately.
+ static OUString CreateMetaCharset();
+
+ /// Output document metadata.
+ OUString DocumentMetadata() const;
+
+ void InitExportParameters( const css::uno::Sequence< css::beans::PropertyValue >& rParams);
+ void ExportHtml();
+ void ExportKiosk();
+ void ExportWebCast();
+ void ExportSingleDocument();
+
+ bool WriteHtml( const OUString& rFileName, bool bAddExtension, std::u16string_view rHtmlData );
+ static OUString GetButtonName( int nButton );
+
+ void WriteOutlinerParagraph(OUStringBuffer& aStr, SdrOutliner* pOutliner,
+ OutlinerParaObject const * pOutlinerParagraphObject,
+ const Color& rBackgroundColor, bool bHeadLine);
+
+ void WriteObjectGroup(OUStringBuffer& aStr, SdrObjGroup const * pObjectGroup,
+ SdrOutliner* pOutliner, const Color& rBackgroundColor, bool bHeadLine);
+
+ void WriteTable(OUStringBuffer& aStr, sdr::table::SdrTableObj const * pTableObject,
+ SdrOutliner* pOutliner, const Color& rBackgroundColor);
+
+ public:
+ HtmlExport(const OUString& aPath,
+ const css::uno::Sequence<css::beans::PropertyValue>& rParams,
+ SdDrawDocument* pExpDoc,
+ sd::DrawDocShell* pDocShell);
+
+ ~HtmlExport();
+
+ static OUString ColorToHTMLString( Color aColor );
+ static OUString StringToHTMLString( const OUString& rString );
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/html/htmlpublishmode.hxx b/sd/source/filter/html/htmlpublishmode.hxx
new file mode 100644
index 000000000..3ba7eeb80
--- /dev/null
+++ b/sd/source/filter/html/htmlpublishmode.hxx
@@ -0,0 +1,31 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+enum HtmlPublishMode
+{
+ PUBLISH_HTML,
+ PUBLISH_FRAMES,
+ PUBLISH_WEBCAST,
+ PUBLISH_KIOSK,
+ PUBLISH_SINGLE_DOCUMENT
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/html/pubdlg.cxx b/sd/source/filter/html/pubdlg.cxx
new file mode 100644
index 000000000..257021d96
--- /dev/null
+++ b/sd/source/filter/html/pubdlg.cxx
@@ -0,0 +1,1539 @@
+/* -*- 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 <com/sun/star/beans/PropertyValue.hpp>
+#include <comphelper/sequence.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#include <vcl/FilterConfigItem.hxx>
+#include <vcl/image.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <sal/log.hxx>
+#include <svtools/valueset.hxx>
+#include <svtools/colrdlg.hxx>
+#include <tools/debug.hxx>
+#include <tools/urlobj.hxx>
+#include <tools/GenericTypeSerializer.hxx>
+#include <sdiocmpt.hxx>
+#include <sfx2/docfile.hxx>
+#include <pres.hxx>
+#include <unotools/useroptions.hxx>
+#include <unotools/pathoptions.hxx>
+
+#include <sdresid.hxx>
+#include <strings.hrc>
+#include <pubdlg.hxx>
+#include "htmlattr.hxx"
+#include "htmlex.hxx"
+#include "htmlpublishmode.hxx"
+#include <helpids.h>
+#include "buttonset.hxx"
+#include <strings.hxx>
+
+using namespace com::sun::star::uno;
+using namespace com::sun::star::beans;
+
+#define NOOFPAGES 6
+
+//ID for the config-data with the HTML-settings
+const sal_uInt16 nMagic = sal_uInt16(0x1977);
+
+// Key for the soffice.ini
+constexpr OUStringLiteral KEY_QUALITY = u"JPG-EXPORT-QUALITY";
+
+// The Help-IDs of the pages
+const char* const aPageHelpIds[NOOFPAGES] =
+{
+ HID_SD_HTMLEXPORT_PAGE1,
+ HID_SD_HTMLEXPORT_PAGE2,
+ HID_SD_HTMLEXPORT_PAGE3,
+ HID_SD_HTMLEXPORT_PAGE4,
+ HID_SD_HTMLEXPORT_PAGE5,
+ HID_SD_HTMLEXPORT_PAGE6
+};
+
+static SvStream& operator >> (SvStream& rIn, SdPublishingDesign& rDesign);
+
+static SvStream& WriteSdPublishingDesign(SvStream& rOut, const SdPublishingDesign& rDesign);
+
+// This class has all the settings for the HTML-export autopilot
+class SdPublishingDesign
+{
+public:
+ OUString m_aDesignName;
+
+ HtmlPublishMode m_eMode;
+
+ // special WebCast options
+ PublishingScript m_eScript;
+ OUString m_aCGI;
+ OUString m_aURL;
+
+ // special Kiosk options
+ bool m_bAutoSlide;
+ sal_uInt32 m_nSlideDuration;
+ bool m_bEndless;
+
+ // special HTML options
+ bool m_bContentPage;
+ bool m_bNotes;
+
+ // misc options
+ sal_uInt16 m_nResolution;
+ OUString m_aCompression;
+ PublishingFormat m_eFormat;
+ bool m_bSlideSound;
+ bool m_bHiddenSlides;
+
+ // title page information
+ OUString m_aAuthor;
+ OUString m_aEMail;
+ OUString m_aWWW;
+ OUString m_aMisc;
+ bool m_bDownload;
+ bool m_bCreated; // not used
+
+ // buttons and colorscheme
+ sal_Int16 m_nButtonThema;
+ bool m_bUserAttr;
+ Color m_aBackColor;
+ Color m_aTextColor;
+ Color m_aLinkColor;
+ Color m_aVLinkColor;
+ Color m_aALinkColor;
+ bool m_bUseAttribs;
+ bool m_bUseColor;
+
+ SdPublishingDesign();
+
+ bool operator ==(const SdPublishingDesign & rDesign) const;
+ friend SvStream& operator >> (SvStream& rIn, SdPublishingDesign& rDesign);
+ friend SvStream& WriteSdPublishingDesign(SvStream& rOut, const SdPublishingDesign& rDesign);
+};
+
+// load Default-settings
+SdPublishingDesign::SdPublishingDesign()
+ : m_eMode(PUBLISH_HTML)
+ , m_eScript(SCRIPT_ASP)
+ , m_bAutoSlide(true)
+ , m_nSlideDuration(15)
+ , m_bEndless(true)
+ , m_bContentPage(true)
+ , m_bNotes(true)
+ , m_nResolution(PUB_LOWRES_WIDTH)
+ , m_eFormat(FORMAT_PNG)
+ , m_bSlideSound(true)
+ , m_bHiddenSlides(false)
+ , m_bDownload(false)
+ , m_bCreated(false)
+ , m_nButtonThema(-1)
+ , m_bUserAttr(false)
+ , m_aBackColor(COL_WHITE)
+ , m_aTextColor(COL_BLACK)
+ , m_aLinkColor(COL_BLUE)
+ , m_aVLinkColor(COL_LIGHTGRAY)
+ , m_aALinkColor(COL_GRAY)
+ , m_bUseAttribs(true)
+ , m_bUseColor(true)
+{
+ FilterConfigItem aFilterConfigItem(u"Office.Common/Filter/Graphic/Export/JPG");
+ sal_Int32 nCompression = aFilterConfigItem.ReadInt32( KEY_QUALITY, 75 );
+ m_aCompression = OUString::number(nCompression) + "%";
+
+ SvtUserOptions aUserOptions;
+ m_aAuthor = aUserOptions.GetFirstName();
+ if (!m_aAuthor.isEmpty() && !aUserOptions.GetLastName().isEmpty())
+ m_aAuthor += " ";
+ m_aAuthor += aUserOptions.GetLastName();
+ m_aEMail = aUserOptions.GetEmail();
+}
+
+// Compares the values without paying attention to the name
+bool SdPublishingDesign::operator ==(const SdPublishingDesign & rDesign) const
+{
+ return
+ (
+ m_eMode == rDesign.m_eMode &&
+ m_nResolution == rDesign.m_nResolution &&
+ m_aCompression == rDesign.m_aCompression &&
+ m_eFormat == rDesign.m_eFormat &&
+ m_bHiddenSlides == rDesign.m_bHiddenSlides &&
+ ( // compare html options
+ (m_eMode != PUBLISH_HTML && m_eMode != PUBLISH_FRAMES) ||
+ (
+ m_bContentPage == rDesign.m_bContentPage &&
+ m_bNotes == rDesign.m_bNotes &&
+ m_aAuthor == rDesign.m_aAuthor &&
+ m_aEMail == rDesign.m_aEMail &&
+ m_aWWW == rDesign.m_aWWW &&
+ m_aMisc == rDesign.m_aMisc &&
+ m_bDownload == rDesign.m_bDownload &&
+ m_nButtonThema == rDesign.m_nButtonThema &&
+ m_bUserAttr == rDesign.m_bUserAttr &&
+ m_aBackColor == rDesign.m_aBackColor &&
+ m_aTextColor == rDesign.m_aTextColor &&
+ m_aLinkColor == rDesign.m_aLinkColor &&
+ m_aVLinkColor == rDesign.m_aVLinkColor &&
+ m_aALinkColor == rDesign.m_aALinkColor &&
+ m_bUseAttribs == rDesign.m_bUseAttribs &&
+ m_bSlideSound == rDesign.m_bSlideSound &&
+ m_bUseColor == rDesign.m_bUseColor
+ )
+ ) &&
+ ( // compare kiosk options
+ (m_eMode != PUBLISH_KIOSK) ||
+ (
+ m_bAutoSlide == rDesign.m_bAutoSlide &&
+ m_bSlideSound == rDesign.m_bSlideSound &&
+ (
+ !m_bAutoSlide ||
+ (
+ m_nSlideDuration == rDesign.m_nSlideDuration &&
+ m_bEndless == rDesign.m_bEndless
+ )
+ )
+ )
+ ) &&
+ ( // compare WebCast options
+ (m_eMode != PUBLISH_WEBCAST) ||
+ (
+ m_eScript == rDesign.m_eScript &&
+ (
+ m_eScript != SCRIPT_PERL ||
+ (
+ m_aURL == rDesign.m_aURL &&
+ m_aCGI == rDesign.m_aCGI
+ )
+ )
+ )
+ )
+ );
+}
+
+// Load the design from the stream
+SvStream& operator >> (SvStream& rIn, SdPublishingDesign& rDesign)
+{
+ SdIOCompat aIO(rIn, StreamMode::READ);
+
+ sal_uInt16 nTemp16;
+ tools::GenericTypeSerializer aSerializer(rIn);
+
+ rDesign.m_aDesignName = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn,
+ RTL_TEXTENCODING_UTF8);
+ rIn.ReadUInt16( nTemp16 );
+ rDesign.m_eMode = static_cast<HtmlPublishMode>(nTemp16);
+ rIn.ReadCharAsBool( rDesign.m_bContentPage );
+ rIn.ReadCharAsBool( rDesign.m_bNotes );
+ rIn.ReadUInt16( rDesign.m_nResolution );
+ rDesign.m_aCompression = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn,
+ RTL_TEXTENCODING_UTF8);
+ rIn.ReadUInt16( nTemp16 );
+ rDesign.m_eFormat = static_cast<PublishingFormat>(nTemp16);
+ rDesign.m_aAuthor = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn,
+ RTL_TEXTENCODING_UTF8);
+ rDesign.m_aEMail = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn,
+ RTL_TEXTENCODING_UTF8);
+ rDesign.m_aWWW = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn,
+ RTL_TEXTENCODING_UTF8);
+ rDesign.m_aMisc = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn,
+ RTL_TEXTENCODING_UTF8);
+ rIn.ReadCharAsBool( rDesign.m_bDownload );
+ rIn.ReadCharAsBool( rDesign.m_bCreated ); // not used
+ rIn.ReadInt16( rDesign.m_nButtonThema );
+ rIn.ReadCharAsBool( rDesign.m_bUserAttr );
+ aSerializer.readColor(rDesign.m_aBackColor);
+ aSerializer.readColor(rDesign.m_aTextColor);
+ aSerializer.readColor(rDesign.m_aLinkColor);
+ aSerializer.readColor(rDesign.m_aVLinkColor);
+ aSerializer.readColor(rDesign.m_aALinkColor);
+ rIn.ReadCharAsBool( rDesign.m_bUseAttribs );
+ rIn.ReadCharAsBool( rDesign.m_bUseColor );
+
+ rIn.ReadUInt16( nTemp16 );
+ rDesign.m_eScript = static_cast<PublishingScript>(nTemp16);
+ rDesign.m_aURL = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn,
+ RTL_TEXTENCODING_UTF8);
+ rDesign.m_aCGI = read_uInt16_lenPrefixed_uInt8s_ToOUString(rIn,
+ RTL_TEXTENCODING_UTF8);
+
+ rIn.ReadCharAsBool( rDesign.m_bAutoSlide );
+ rIn.ReadUInt32( rDesign.m_nSlideDuration );
+ rIn.ReadCharAsBool( rDesign.m_bEndless );
+ rIn.ReadCharAsBool( rDesign.m_bSlideSound );
+ rIn.ReadCharAsBool( rDesign.m_bHiddenSlides );
+
+ return rIn;
+}
+
+// Set the design to the stream
+SvStream& WriteSdPublishingDesign(SvStream& rOut, const SdPublishingDesign& rDesign)
+{
+ // The last parameter is the versionnumber of the code
+ SdIOCompat aIO(rOut, StreamMode::WRITE, 0);
+
+ tools::GenericTypeSerializer aSerializer(rOut);
+
+ // Name
+ write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aDesignName,
+ RTL_TEXTENCODING_UTF8);
+
+ rOut.WriteUInt16( rDesign.m_eMode );
+ rOut.WriteBool( rDesign.m_bContentPage );
+ rOut.WriteBool( rDesign.m_bNotes );
+ rOut.WriteUInt16( rDesign.m_nResolution );
+ write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aCompression,
+ RTL_TEXTENCODING_UTF8);
+ rOut.WriteUInt16( rDesign.m_eFormat );
+ write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aAuthor,
+ RTL_TEXTENCODING_UTF8);
+ write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aEMail,
+ RTL_TEXTENCODING_UTF8);
+ write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aWWW,
+ RTL_TEXTENCODING_UTF8);
+ write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aMisc,
+ RTL_TEXTENCODING_UTF8);
+ rOut.WriteBool( rDesign.m_bDownload );
+ rOut.WriteBool( rDesign.m_bCreated ); // not used
+ rOut.WriteInt16( rDesign.m_nButtonThema );
+ rOut.WriteBool( rDesign.m_bUserAttr );
+ aSerializer.writeColor(rDesign.m_aBackColor);
+ aSerializer.writeColor(rDesign.m_aTextColor);
+ aSerializer.writeColor(rDesign.m_aLinkColor);
+ aSerializer.writeColor(rDesign.m_aVLinkColor);
+ aSerializer.writeColor(rDesign.m_aALinkColor);
+ rOut.WriteBool( rDesign.m_bUseAttribs );
+ rOut.WriteBool( rDesign.m_bUseColor );
+
+ rOut.WriteUInt16( rDesign.m_eScript );
+ write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aURL,
+ RTL_TEXTENCODING_UTF8);
+ write_uInt16_lenPrefixed_uInt8s_FromOUString(rOut, rDesign.m_aCGI,
+ RTL_TEXTENCODING_UTF8);
+
+ rOut.WriteBool( rDesign.m_bAutoSlide );
+ rOut.WriteUInt32( rDesign.m_nSlideDuration );
+ rOut.WriteBool( rDesign.m_bEndless );
+ rOut.WriteBool( rDesign.m_bSlideSound );
+ rOut.WriteBool( rDesign.m_bHiddenSlides );
+
+ return rOut;
+}
+
+namespace {
+
+// Dialog for the entry of the name of the design
+class SdDesignNameDlg : public weld::GenericDialogController
+{
+private:
+ std::unique_ptr<weld::Entry> m_xEdit;
+ std::unique_ptr<weld::Button> m_xBtnOK;
+
+public:
+ SdDesignNameDlg(weld::Window* pWindow, const OUString& aName );
+ OUString GetDesignName() const;
+ DECL_LINK(ModifyHdl, weld::Entry&, void);
+};
+
+}
+
+// SdPublishingDlg Methods
+
+SdPublishingDlg::SdPublishingDlg(weld::Window* pWindow, DocumentType eDocType)
+ : GenericDialogController(pWindow, "modules/simpress/ui/publishingdialog.ui", "PublishingDialog")
+ , m_xPage1_Designs(m_xBuilder->weld_tree_view("designsTreeview"))
+ , m_xPage2_Standard_FB(m_xBuilder->weld_image("standardFBImage"))
+ , m_xPage2_Frames_FB(m_xBuilder->weld_image("framesFBImage"))
+ , m_xPage2_Kiosk_FB(m_xBuilder->weld_image("kioskFBImage"))
+ , m_xPage2_WebCast_FB(m_xBuilder->weld_image("webCastFBImage"))
+ , m_xPage4_Misc(m_xBuilder->weld_text_view("miscTextview"))
+ , m_xButtonSet(new ButtonSet())
+ , m_xLastPageButton(m_xBuilder->weld_button("lastPageButton"))
+ , m_xNextPageButton(m_xBuilder->weld_button("nextPageButton"))
+ , m_xFinishButton(m_xBuilder->weld_button("finishButton"))
+ , aAssistentFunc(NOOFPAGES)
+ , m_bButtonsDirty(true)
+ , m_bDesignListDirty(false)
+ , m_pDesign(nullptr)
+{
+ m_bImpress = eDocType == DocumentType::Impress;
+
+ Size aSize(m_xPage2_Standard_FB->get_approximate_digit_width() * 12,
+ m_xPage2_Standard_FB->get_text_height() * 6);
+ m_xPage2_Standard_FB->set_size_request(aSize.Width(), aSize.Height());
+ m_xPage2_Frames_FB->set_size_request(aSize.Width(), aSize.Height());
+ m_xPage2_Kiosk_FB->set_size_request(aSize.Width(), aSize.Height());
+ m_xPage2_WebCast_FB->set_size_request(aSize.Width(), aSize.Height());
+
+ m_xPage4_Misc->set_size_request(m_xPage4_Misc->get_approximate_digit_width() * 40,
+ m_xPage4_Misc->get_height_rows(8));
+
+ m_xPage1_Designs->set_size_request(m_xPage4_Misc->get_approximate_digit_width() * 40,
+ m_xPage4_Misc->get_height_rows(8));
+
+ //Lock down the preferred size based on the
+ //initial max-size configuration
+ aSize = m_xDialog->get_preferred_size();
+ m_xDialog->set_size_request(aSize.Width(), aSize.Height());
+
+ CreatePages();
+ Load();
+
+ // sets the output page
+ aAssistentFunc.GotoPage(1);
+ m_xLastPageButton->set_sensitive(false);
+
+ // button assignment
+ m_xFinishButton->connect_clicked(LINK(this,SdPublishingDlg,FinishHdl));
+ m_xLastPageButton->connect_clicked(LINK(this,SdPublishingDlg,LastPageHdl));
+ m_xNextPageButton->connect_clicked(LINK(this,SdPublishingDlg,NextPageHdl));
+
+ m_xPage1_NewDesign->connect_toggled(LINK(this,SdPublishingDlg,DesignHdl));
+ m_xPage1_OldDesign->connect_toggled(LINK(this,SdPublishingDlg,DesignHdl));
+ m_xPage1_Designs->connect_changed(LINK(this,SdPublishingDlg,DesignSelectHdl));
+ m_xPage1_DelDesign->connect_clicked(LINK(this,SdPublishingDlg,DesignDeleteHdl));
+
+ m_xPage2_Standard->connect_toggled(LINK(this,SdPublishingDlg,BaseHdl));
+ m_xPage2_Frames->connect_toggled(LINK(this,SdPublishingDlg,BaseHdl));
+ m_xPage2_SingleDocument->connect_toggled(LINK(this,SdPublishingDlg,BaseHdl));
+ m_xPage2_Kiosk->connect_toggled(LINK(this,SdPublishingDlg,BaseHdl));
+ m_xPage2_WebCast->connect_toggled(LINK(this,SdPublishingDlg,BaseHdl));
+
+ m_xPage2_Content->connect_toggled(LINK(this,SdPublishingDlg,ContentHdl));
+
+ m_xPage2_ASP->connect_toggled(LINK(this,SdPublishingDlg,WebServerHdl));
+ m_xPage2_PERL->connect_toggled(LINK(this,SdPublishingDlg,WebServerHdl));
+ m_xPage2_Index->set_text("index" STR_HTMLEXP_DEFAULT_EXTENSION);
+ m_xPage2_CGI->set_text("/cgi-bin/");
+
+ m_xPage3_Png->connect_toggled(LINK(this,SdPublishingDlg, GfxFormatHdl));
+ m_xPage3_Gif->connect_toggled(LINK(this,SdPublishingDlg, GfxFormatHdl));
+ m_xPage3_Jpg->connect_toggled(LINK(this,SdPublishingDlg, GfxFormatHdl));
+ m_xPage3_Quality->set_sensitive(false);
+
+ m_xPage3_Resolution_1->connect_toggled(LINK(this,SdPublishingDlg, ResolutionHdl ));
+ m_xPage3_Resolution_2->connect_toggled(LINK(this,SdPublishingDlg, ResolutionHdl ));
+ m_xPage3_Resolution_3->connect_toggled(LINK(this,SdPublishingDlg, ResolutionHdl ));
+ m_xPage3_Resolution_4->connect_toggled(LINK(this, SdPublishingDlg, ResolutionHdl));
+
+ m_xPage2_ChgDefault->connect_toggled(LINK(this,SdPublishingDlg, SlideChgHdl));
+ m_xPage2_ChgAuto->connect_toggled(LINK(this,SdPublishingDlg, SlideChgHdl));
+
+ m_xPage5_Buttons->SetSelectHdl(LINK(this,SdPublishingDlg, ButtonsHdl ));
+ m_xPage5_Buttons->SetStyle( m_xPage5_Buttons->GetStyle() | WB_VSCROLL );
+
+ m_xPage6_Back->connect_clicked(LINK(this,SdPublishingDlg, ColorHdl ));
+ m_xPage6_Text->connect_clicked(LINK(this,SdPublishingDlg, ColorHdl ));
+ m_xPage6_Link->connect_clicked(LINK(this,SdPublishingDlg, ColorHdl ));
+ m_xPage6_VLink->connect_clicked(LINK(this,SdPublishingDlg, ColorHdl ));
+ m_xPage6_ALink->connect_clicked(LINK(this,SdPublishingDlg, ColorHdl ));
+
+ m_xPage6_DocColors->set_active(true);
+
+ m_xPage3_Quality->append_text( "25%" );
+ m_xPage3_Quality->append_text( "50%" );
+ m_xPage3_Quality->append_text( "75%" );
+ m_xPage3_Quality->append_text( "100%" );
+
+ m_xPage5_Buttons->SetColCount();
+ m_xPage5_Buttons->SetLineCount( 4 );
+ m_xPage5_Buttons->SetExtraSpacing( 1 );
+
+ for( const auto& rDesign : m_aDesignList )
+ m_xPage1_Designs->append_text(rDesign.m_aDesignName);
+
+ SetDefaults();
+
+ m_xDialog->set_help_id(aPageHelpIds[0]);
+
+ m_xNextPageButton->grab_focus();
+}
+
+SdPublishingDlg::~SdPublishingDlg()
+{
+}
+
+// Generate dialog controls and embed them in the pages
+void SdPublishingDlg::CreatePages()
+{
+ // Page 1
+ m_xPage1 = m_xBuilder->weld_container("page1");
+ m_xPage1_Title = m_xBuilder->weld_label("assignLabel");
+ m_xPage1_NewDesign = m_xBuilder->weld_radio_button("newDesignRadiobutton");
+ m_xPage1_OldDesign = m_xBuilder->weld_radio_button("oldDesignRadiobutton");
+ m_xPage1_DelDesign = m_xBuilder->weld_button("delDesingButton");
+ m_xPage1_Desc = m_xBuilder->weld_label("descLabel");
+ aAssistentFunc.InsertControl(1, m_xPage1.get());
+ aAssistentFunc.InsertControl(1, m_xPage1_Title.get());
+ aAssistentFunc.InsertControl(1, m_xPage1_NewDesign.get());
+ aAssistentFunc.InsertControl(1, m_xPage1_OldDesign.get());
+ aAssistentFunc.InsertControl(1, m_xPage1_Designs.get());
+ aAssistentFunc.InsertControl(1, m_xPage1_DelDesign.get());
+ aAssistentFunc.InsertControl(1, m_xPage1_Desc.get());
+
+ // Page 2
+ m_xPage2 = m_xBuilder->weld_container("page2");
+ m_xPage2Frame2 = m_xBuilder->weld_container("page2.2");
+ m_xPage2Frame3 = m_xBuilder->weld_container("page2.3");
+ m_xPage2Frame4 = m_xBuilder->weld_container("page2.4");
+ m_xPage2_Title = m_xBuilder->weld_label("publicationLabel");
+ m_xPage2_Standard = m_xBuilder->weld_radio_button("standardRadiobutton");
+ m_xPage2_Frames = m_xBuilder->weld_radio_button("framesRadiobutton");
+ m_xPage2_SingleDocument = m_xBuilder->weld_radio_button("singleDocumentRadiobutton");
+ m_xPage2_Kiosk = m_xBuilder->weld_radio_button("kioskRadiobutton");
+ m_xPage2_WebCast = m_xBuilder->weld_radio_button("webCastRadiobutton");
+ aAssistentFunc.InsertControl(2, m_xPage2.get());
+ aAssistentFunc.InsertControl(2, m_xPage2Frame2.get());
+ aAssistentFunc.InsertControl(2, m_xPage2Frame3.get());
+ aAssistentFunc.InsertControl(2, m_xPage2Frame4.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Title.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Standard.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Frames.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_SingleDocument.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Kiosk.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_WebCast.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Standard_FB.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Frames_FB.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Kiosk_FB.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_WebCast_FB.get());
+
+ m_xPage2_Title_Html = m_xBuilder->weld_label( "htmlOptionsLabel");
+ m_xPage2_Content = m_xBuilder->weld_check_button("contentCheckbutton");
+ m_xPage2_Notes = m_xBuilder->weld_check_button("notesCheckbutton");
+ aAssistentFunc.InsertControl(2, m_xPage2_Title_Html.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Content.get());
+ if (m_bImpress)
+ aAssistentFunc.InsertControl(2, m_xPage2_Notes.get());
+
+ m_xPage2_Title_WebCast = m_xBuilder->weld_label("webCastLabel");
+ m_xPage2_ASP = m_xBuilder->weld_radio_button("ASPRadiobutton");
+ m_xPage2_PERL = m_xBuilder->weld_radio_button("perlRadiobutton");
+ m_xPage2_URL_txt = m_xBuilder->weld_label("URLTxtLabel");
+ m_xPage2_URL = m_xBuilder->weld_entry("URLEntry");
+ m_xPage2_CGI_txt = m_xBuilder->weld_label("CGITxtLabel");
+ m_xPage2_CGI = m_xBuilder->weld_entry("CGIEntry");
+ m_xPage2_Index_txt = m_xBuilder->weld_label("indexTxtLabel");
+ m_xPage2_Index = m_xBuilder->weld_entry("indexEntry");
+ m_xPage2_Title_Kiosk = m_xBuilder->weld_label("kioskLabel");
+ m_xPage2_ChgDefault = m_xBuilder->weld_radio_button("chgDefaultRadiobutton");
+ m_xPage2_ChgAuto = m_xBuilder->weld_radio_button("chgAutoRadiobutton");
+ m_xPage2_Duration_txt = m_xBuilder->weld_label("durationTxtLabel");
+ m_xPage2_Duration = m_xBuilder->weld_formatted_spin_button("durationSpinbutton");
+ m_xFormatter.reset(new weld::TimeFormatter(*m_xPage2_Duration));
+ m_xFormatter->SetExtFormat(ExtTimeFieldFormat::LongDuration);
+ m_xPage2_Endless = m_xBuilder->weld_check_button("endlessCheckbutton");
+ aAssistentFunc.InsertControl(2, m_xPage2_Title_WebCast.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Index_txt.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Index.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_ASP.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_PERL.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_URL_txt.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_URL.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_CGI_txt.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_CGI.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Title_Kiosk.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_ChgDefault.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_ChgAuto.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Duration_txt.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Duration.get());
+ aAssistentFunc.InsertControl(2, m_xPage2_Endless.get());
+
+ // Page 3
+ m_xPage3 = m_xBuilder->weld_container("page3");
+ m_xPage3_Title1 = m_xBuilder->weld_label("saveImgAsLabel");
+ m_xPage3_Png = m_xBuilder->weld_radio_button("pngRadiobutton");
+ m_xPage3_Gif = m_xBuilder->weld_radio_button("gifRadiobutton");
+ m_xPage3_Jpg = m_xBuilder->weld_radio_button("jpgRadiobutton");
+ m_xPage3_Quality_txt = m_xBuilder->weld_label("qualityTxtLabel");
+ m_xPage3_Quality= m_xBuilder->weld_combo_box("qualityCombobox");
+ m_xPage3_Title2 = m_xBuilder->weld_label("monitorResolutionLabel");
+ m_xPage3_Resolution_1 = m_xBuilder->weld_radio_button("resolution1Radiobutton");
+ m_xPage3_Resolution_2 = m_xBuilder->weld_radio_button("resolution2Radiobutton");
+ m_xPage3_Resolution_3 = m_xBuilder->weld_radio_button("resolution3Radiobutton");
+ m_xPage3_Resolution_4 = m_xBuilder->weld_radio_button("resolution4Radiobutton");
+ m_xPage3_Title3 = m_xBuilder->weld_label("effectsLabel");
+ m_xPage3_SldSound = m_xBuilder->weld_check_button("sldSoundCheckbutton");
+ m_xPage3_HiddenSlides = m_xBuilder->weld_check_button("hiddenSlidesCheckbutton");
+ aAssistentFunc.InsertControl(3, m_xPage3.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_Title1.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_Png.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_Gif.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_Jpg.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_Quality_txt.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_Quality.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_Title2.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_Resolution_1.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_Resolution_2.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_Resolution_3.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_Resolution_4.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_Title3.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_SldSound.get());
+ aAssistentFunc.InsertControl(3, m_xPage3_HiddenSlides.get());
+
+ // Page 4
+ m_xPage4 = m_xBuilder->weld_container("page4");
+ m_xPage4_Title1 = m_xBuilder->weld_label("infTitlePageLabel");
+ m_xPage4_Author_txt = m_xBuilder->weld_label("authorTxtLabel");
+ m_xPage4_Author = m_xBuilder->weld_entry("authorEntry");
+ m_xPage4_Email_txt = m_xBuilder->weld_label("emailTxtLabel");
+ m_xPage4_Email = m_xBuilder->weld_entry("emailEntry");
+ m_xPage4_WWW_txt = m_xBuilder->weld_label("wwwTxtLabel");
+ m_xPage4_WWW = m_xBuilder->weld_entry("wwwEntry");
+ m_xPage4_Title2 = m_xBuilder->weld_label("addInformLabel");
+ m_xPage4_Download = m_xBuilder->weld_check_button("downloadCheckbutton");
+ aAssistentFunc.InsertControl(4, m_xPage4.get());
+ aAssistentFunc.InsertControl(4, m_xPage4_Title1.get());
+ aAssistentFunc.InsertControl(4, m_xPage4_Author_txt.get());
+ aAssistentFunc.InsertControl(4, m_xPage4_Author.get());
+ aAssistentFunc.InsertControl(4, m_xPage4_Email_txt.get());
+ aAssistentFunc.InsertControl(4, m_xPage4_Email.get());
+ aAssistentFunc.InsertControl(4, m_xPage4_WWW_txt.get());
+ aAssistentFunc.InsertControl(4, m_xPage4_WWW.get());
+ aAssistentFunc.InsertControl(4, m_xPage4_Title2.get());
+ aAssistentFunc.InsertControl(4, m_xPage4_Misc.get());
+ if(m_bImpress)
+ aAssistentFunc.InsertControl(4, m_xPage4_Download.get());
+
+ // Page 5
+ m_xPage5 = m_xBuilder->weld_container("page5");
+ m_xPage5_Title = m_xBuilder->weld_label("buttonStyleLabel");
+ m_xPage5_TextOnly = m_xBuilder->weld_check_button("textOnlyCheckbutton");
+ m_xPage5_Buttons.reset(new ValueSet(m_xBuilder->weld_scrolled_window("buttonsDrawingareawin", true)));
+ m_xPage5_ButtonsWnd.reset(new weld::CustomWeld(*m_xBuilder, "buttonsDrawingarea", *m_xPage5_Buttons));
+ aAssistentFunc.InsertControl(5, m_xPage5.get());
+ aAssistentFunc.InsertControl(5, m_xPage5_Title.get());
+ aAssistentFunc.InsertControl(5, m_xPage5_TextOnly.get());
+ aAssistentFunc.InsertControl(5, m_xPage5_Buttons->GetDrawingArea());
+
+ // Page 6
+ m_xPage6 = m_xBuilder->weld_container("page6");
+ m_xPage6_Title = m_xBuilder->weld_label("selectColorLabel");
+ m_xPage6_Default = m_xBuilder->weld_radio_button("defaultRadiobutton");
+ m_xPage6_User = m_xBuilder->weld_radio_button("userRadiobutton");
+ m_xPage6_Back = m_xBuilder->weld_button("backButton");
+ m_xPage6_Text = m_xBuilder->weld_button("textButton");
+ m_xPage6_Link = m_xBuilder->weld_button("linkButton");
+ m_xPage6_VLink = m_xBuilder->weld_button("vLinkButton");
+ m_xPage6_ALink = m_xBuilder->weld_button("aLinkButton");
+ m_xPage6_DocColors = m_xBuilder->weld_radio_button("docColorsRadiobutton");
+ m_xPage6_Preview.reset(new SdHtmlAttrPreview);
+ m_xPage6_PreviewWnd.reset(new weld::CustomWeld(*m_xBuilder, "previewDrawingarea", *m_xPage6_Preview));
+ aAssistentFunc.InsertControl(6, m_xPage6.get());
+ aAssistentFunc.InsertControl(6, m_xPage6_Title.get());
+ aAssistentFunc.InsertControl(6, m_xPage6_DocColors.get());
+ aAssistentFunc.InsertControl(6, m_xPage6_Default.get());
+ aAssistentFunc.InsertControl(6, m_xPage6_User.get());
+ aAssistentFunc.InsertControl(6, m_xPage6_Text.get());
+ aAssistentFunc.InsertControl(6, m_xPage6_Link.get());
+ aAssistentFunc.InsertControl(6, m_xPage6_ALink.get());
+ aAssistentFunc.InsertControl(6, m_xPage6_VLink.get());
+ aAssistentFunc.InsertControl(6, m_xPage6_Back.get());
+ aAssistentFunc.InsertControl(6, m_xPage6_Preview->GetDrawingArea());
+}
+
+// Initialize dialog with default-values
+void SdPublishingDlg::SetDefaults()
+{
+ SdPublishingDesign aDefault;
+ SetDesign(&aDefault);
+
+ m_xPage1_NewDesign->set_active(true);
+ m_xPage1_OldDesign->set_active(false);
+ UpdatePage();
+}
+
+// Feed the SfxItemSet with the settings of the dialog
+void SdPublishingDlg::GetParameterSequence( Sequence< PropertyValue >& rParams )
+{
+ std::vector< PropertyValue > aProps;
+
+ PropertyValue aValue;
+
+ // Page 2
+ aValue.Name = "PublishMode";
+
+ HtmlPublishMode ePublishMode;
+ if (m_xPage2_Frames->get_active())
+ ePublishMode = PUBLISH_FRAMES;
+ else if (m_xPage2_SingleDocument->get_active())
+ ePublishMode = PUBLISH_SINGLE_DOCUMENT;
+ else if (m_xPage2_Kiosk->get_active())
+ ePublishMode = PUBLISH_KIOSK;
+ else if (m_xPage2_WebCast->get_active())
+ ePublishMode = PUBLISH_WEBCAST;
+ else
+ ePublishMode = PUBLISH_HTML;
+
+ aValue.Value <<= static_cast<sal_Int32>(ePublishMode);
+ aProps.push_back( aValue );
+
+ aValue.Name = "IsExportContentsPage";
+ aValue.Value <<= m_xPage2_Content->get_active();
+ aProps.push_back( aValue );
+
+ if(m_bImpress)
+ {
+ aValue.Name = "IsExportNotes";
+ aValue.Value <<= m_xPage2_Notes->get_active();
+ aProps.push_back( aValue );
+ }
+
+ if( m_xPage2_WebCast->get_active() )
+ {
+ aValue.Name = "WebCastScriptLanguage";
+ if( m_xPage2_ASP->get_active() )
+ aValue.Value <<= OUString( "asp" );
+ else
+ aValue.Value <<= OUString( "perl" );
+ aProps.push_back( aValue );
+
+ aValue.Name = "WebCastCGIURL";
+ aValue.Value <<= m_xPage2_CGI->get_text();
+ aProps.push_back( aValue );
+
+ aValue.Name = "WebCastTargetURL";
+ aValue.Value <<= m_xPage2_URL->get_text();
+ aProps.push_back( aValue );
+ }
+ aValue.Name = "IndexURL";
+ aValue.Value <<= m_xPage2_Index->get_text();
+ aProps.push_back( aValue );
+
+ if( m_xPage2_Kiosk->get_active() && m_xPage2_ChgAuto->get_active() )
+ {
+ aValue.Name = "KioskSlideDuration";
+ aValue.Value <<= static_cast<sal_uInt32>(m_xFormatter->GetTime().GetMSFromTime()) / 1000;
+ aProps.push_back( aValue );
+
+ aValue.Name = "KioskEndless";
+ aValue.Value <<= m_xPage2_Endless->get_active();
+ aProps.push_back( aValue );
+ }
+
+ // Page 3
+
+ aValue.Name = "Width";
+ sal_Int32 nTmpWidth = PUB_LOWRES_WIDTH;
+ if( m_xPage3_Resolution_2->get_active() )
+ nTmpWidth = PUB_MEDRES_WIDTH;
+ else if( m_xPage3_Resolution_3->get_active() )
+ nTmpWidth = PUB_HIGHRES_WIDTH;
+ else if (m_xPage3_Resolution_4->get_active())
+ nTmpWidth = PUB_FHDRES_WIDTH;
+
+ aValue.Value <<= nTmpWidth;
+ aProps.push_back( aValue );
+
+ aValue.Name = "Compression";
+ aValue.Value <<= m_xPage3_Quality->get_active_text();
+ aProps.push_back( aValue );
+
+ aValue.Name = "Format";
+ sal_Int32 nFormat;
+ if( m_xPage3_Png->get_active() )
+ nFormat = static_cast<sal_Int32>(FORMAT_PNG);
+ else if( m_xPage3_Gif->get_active() )
+ nFormat = static_cast<sal_Int32>(FORMAT_GIF);
+ else
+ nFormat = static_cast<sal_Int32>(FORMAT_JPG);
+ aValue.Value <<= nFormat;
+ aProps.push_back( aValue );
+
+ aValue.Name = "SlideSound";
+ aValue.Value <<= m_xPage3_SldSound->get_active();
+ aProps.push_back( aValue );
+
+ aValue.Name = "HiddenSlides";
+ aValue.Value <<= m_xPage3_HiddenSlides->get_active();
+ aProps.push_back( aValue );
+
+ // Page 4
+ aValue.Name = "Author";
+ aValue.Value <<= m_xPage4_Author->get_text();
+ aProps.push_back( aValue );
+
+ aValue.Name = "EMail";
+ aValue.Value <<= m_xPage4_Email->get_text();
+ aProps.push_back( aValue );
+
+ // try to guess protocol for user's homepage
+ INetURLObject aHomeURL( m_xPage4_WWW->get_text(),
+ INetProtocol::Http, // default proto is HTTP
+ INetURLObject::EncodeMechanism::All );
+
+ aValue.Name = "HomepageURL";
+ aValue.Value <<= aHomeURL.GetMainURL( INetURLObject::DecodeMechanism::NONE );
+ aProps.push_back( aValue );
+
+ aValue.Name = "UserText";
+ aValue.Value <<= m_xPage4_Misc->get_text();
+ aProps.push_back( aValue );
+
+ if( m_bImpress )
+ {
+ aValue.Name = "EnableDownload";
+ aValue.Value <<= m_xPage4_Download->get_active();
+ aProps.push_back( aValue );
+ }
+
+ // Page 5
+ if( !m_xPage5_TextOnly->get_active() )
+ {
+ aValue.Name = "UseButtonSet";
+ aValue.Value <<= static_cast<sal_Int32>(m_xPage5_Buttons->GetSelectedItemId() - 1);
+ aProps.push_back( aValue );
+ }
+
+ // Page 6
+ if( m_xPage6_User->get_active() )
+ {
+ aValue.Name = "BackColor";
+ aValue.Value <<= m_aBackColor;
+ aProps.push_back( aValue );
+
+ aValue.Name = "TextColor";
+ aValue.Value <<= m_aTextColor;
+ aProps.push_back( aValue );
+
+ aValue.Name = "LinkColor";
+ aValue.Value <<= m_aLinkColor;
+ aProps.push_back( aValue );
+
+ aValue.Name = "VLinkColor";
+ aValue.Value <<= m_aVLinkColor;
+ aProps.push_back( aValue );
+
+ aValue.Name = "ALinkColor";
+ aValue.Value <<= m_aALinkColor;
+ aProps.push_back( aValue );
+ }
+
+ if( m_xPage6_DocColors->get_active() )
+ {
+ aValue.Name = "IsUseDocumentColors";
+ aValue.Value <<= true;
+ aProps.push_back( aValue );
+ }
+
+ rParams = comphelper::containerToSequence(aProps);
+}
+
+// Clickhandler for the radiobuttons of the design-selection
+IMPL_LINK( SdPublishingDlg, DesignHdl, weld::Toggleable&, rButton, void )
+{
+ if (!rButton.get_active())
+ return;
+
+ if (m_xPage1_NewDesign->get_active())
+ {
+ m_xPage1_NewDesign->set_active(true); // because of DesignDeleteHdl
+ m_xPage1_OldDesign->set_active(false);
+ m_xPage1_Designs->set_sensitive(false);
+ m_xPage1_DelDesign->set_sensitive(false);
+ m_pDesign = nullptr;
+
+ SdPublishingDesign aDefault;
+ SetDesign(&aDefault);
+ }
+ else
+ {
+ m_xPage1_NewDesign->set_active(false);
+ m_xPage1_Designs->set_sensitive(true);
+ m_xPage1_DelDesign->set_sensitive(true);
+
+ if (m_xPage1_Designs->get_selected_index() == -1)
+ m_xPage1_Designs->select(0);
+
+ const sal_Int32 nPos = m_xPage1_Designs->get_selected_index();
+ m_pDesign = &m_aDesignList[nPos];
+ DBG_ASSERT(m_pDesign, "No Design? That's not allowed (CL)");
+
+ if(m_pDesign)
+ SetDesign(m_pDesign);
+ }
+}
+
+// Clickhandler for the choice of one design
+IMPL_LINK_NOARG(SdPublishingDlg, DesignSelectHdl, weld::TreeView&, void)
+{
+ const sal_Int32 nPos = m_xPage1_Designs->get_selected_index();
+ m_pDesign = &m_aDesignList[nPos];
+ DBG_ASSERT(m_pDesign, "No Design? That's not allowed (CL)");
+
+ if(m_pDesign)
+ SetDesign(m_pDesign);
+
+ UpdatePage();
+}
+
+// Clickhandler for the delete of one design
+IMPL_LINK_NOARG(SdPublishingDlg, DesignDeleteHdl, weld::Button&, void)
+{
+ const sal_Int32 nPos = m_xPage1_Designs->get_selected_index();
+
+ std::vector<SdPublishingDesign>::iterator iter = m_aDesignList.begin()+nPos;
+
+ DBG_ASSERT(iter != m_aDesignList.end(), "No Design? That's not allowed (CL)");
+
+ m_xPage1_Designs->remove(nPos);
+
+ if(m_pDesign == &(*iter))
+ DesignHdl(*m_xPage1_NewDesign);
+
+ m_aDesignList.erase(iter);
+
+ m_bDesignListDirty = true;
+
+ UpdatePage();
+}
+
+// Clickhandler for the other servertypes
+IMPL_LINK(SdPublishingDlg, WebServerHdl, weld::Toggleable&, rButton, void)
+{
+ if (!rButton.get_active())
+ return;
+
+ bool bASP = m_xPage2_ASP->get_active();
+ m_xPage2_ASP->set_sensitive( bASP );
+ m_xPage2_PERL->set_sensitive( !bASP );
+ UpdatePage();
+}
+
+// Clickhandler for the Radiobuttons of the graphicformat choice
+IMPL_LINK(SdPublishingDlg, GfxFormatHdl, weld::Toggleable&, rButton, void)
+{
+ if (!rButton.get_active())
+ return;
+
+ m_xPage3_Png->set_sensitive(m_xPage3_Png->get_active());
+ m_xPage3_Gif->set_sensitive(m_xPage3_Gif->get_active());
+ m_xPage3_Jpg->set_sensitive(m_xPage3_Jpg->get_active());
+ m_xPage3_Quality->set_sensitive(m_xPage3_Jpg->get_active());
+}
+
+// Clickhandler for the Radiobuttons Standard/Frames
+IMPL_LINK(SdPublishingDlg, BaseHdl, weld::Toggleable&, rButton, void)
+{
+ if (!rButton.get_active())
+ return;
+
+ UpdatePage();
+}
+
+// Clickhandler for the Checkbox of the Title page
+IMPL_LINK_NOARG(SdPublishingDlg, ContentHdl, weld::Toggleable&, void)
+{
+ if(m_xPage2_Content->get_active())
+ {
+ if(!aAssistentFunc.IsEnabled(4))
+ {
+ aAssistentFunc.EnablePage(4);
+ UpdatePage();
+ }
+ }
+ else
+ {
+ if(aAssistentFunc.IsEnabled(4))
+ {
+ aAssistentFunc.DisablePage(4);
+ UpdatePage();
+ }
+ }
+}
+
+// Clickhandler for the Resolution Radiobuttons
+IMPL_LINK( SdPublishingDlg, ResolutionHdl, weld::Toggleable&, rButton, void )
+{
+ if (!rButton.get_active())
+ return;
+ m_xPage3_Resolution_1->set_sensitive(m_xPage3_Resolution_1->get_active());
+ m_xPage3_Resolution_2->set_sensitive(m_xPage3_Resolution_2->get_active());
+ m_xPage3_Resolution_3->set_sensitive(m_xPage3_Resolution_3->get_active());
+ m_xPage3_Resolution_4->set_sensitive(m_xPage3_Resolution_4->get_active());
+}
+
+// Clickhandler for the ValueSet with the bitmap-buttons
+IMPL_LINK_NOARG(SdPublishingDlg, ButtonsHdl, ValueSet*, void)
+{
+ // if one bitmap-button is chosen, then disable TextOnly
+ m_xPage5_TextOnly->set_active(false);
+}
+
+// Fill the SfxItemSet with the settings of the dialog
+IMPL_LINK( SdPublishingDlg, ColorHdl, weld::Button&, rButton, void)
+{
+ SvColorDialog aDlg;
+
+ if (&rButton == m_xPage6_Back.get())
+ {
+ aDlg.SetColor( m_aBackColor );
+ if(aDlg.Execute(m_xDialog.get()) == RET_OK )
+ m_aBackColor = aDlg.GetColor();
+ }
+ else if (&rButton == m_xPage6_Text.get())
+ {
+ aDlg.SetColor( m_aTextColor );
+ if(aDlg.Execute(m_xDialog.get()) == RET_OK )
+ m_aTextColor = aDlg.GetColor();
+ }
+ else if (&rButton == m_xPage6_Link.get())
+ {
+ aDlg.SetColor( m_aLinkColor );
+ if(aDlg.Execute(m_xDialog.get()) == RET_OK )
+ m_aLinkColor = aDlg.GetColor();
+ }
+ else if (&rButton == m_xPage6_VLink.get())
+ {
+ aDlg.SetColor( m_aVLinkColor );
+ if(aDlg.Execute(m_xDialog.get()) == RET_OK )
+ m_aVLinkColor = aDlg.GetColor();
+ }
+ else if (&rButton == m_xPage6_ALink.get())
+ {
+ aDlg.SetColor( m_aALinkColor );
+ if(aDlg.Execute(m_xDialog.get()) == RET_OK )
+ m_aALinkColor = aDlg.GetColor();
+ }
+
+ m_xPage6_User->set_active(true);
+ m_xPage6_Preview->SetColors( m_aBackColor, m_aTextColor, m_aLinkColor,
+ m_aVLinkColor, m_aALinkColor );
+ m_xPage6_Preview->Invalidate();
+}
+
+IMPL_LINK(SdPublishingDlg, SlideChgHdl, weld::Toggleable&, rButton, void)
+{
+ if (!rButton.get_active())
+ return;
+ UpdatePage();
+}
+
+// Clickhandler for the Ok Button
+IMPL_LINK_NOARG(SdPublishingDlg, FinishHdl, weld::Button&, void)
+{
+ //End
+ SdPublishingDesign aDesign;
+ GetDesign(&aDesign);
+
+ bool bSave = false;
+
+ if(m_xPage1_OldDesign->get_active() && m_pDesign)
+ {
+ // are there changes?
+ if(!(aDesign == *m_pDesign))
+ bSave = true;
+ }
+ else
+ {
+ SdPublishingDesign aDefaultDesign;
+ if(!(aDefaultDesign == aDesign))
+ bSave = true;
+ }
+
+ if(bSave)
+ {
+ OUString aName;
+ if(m_pDesign)
+ aName = m_pDesign->m_aDesignName;
+
+ bool bRetry;
+ do
+ {
+ bRetry = false;
+
+ SdDesignNameDlg aDlg(m_xDialog.get(), aName);
+
+ if (aDlg.run() == RET_OK)
+ {
+ aDesign.m_aDesignName = aDlg.GetDesignName();
+
+ auto iter = std::find_if(m_aDesignList.begin(), m_aDesignList.end(),
+ [&aDesign](const SdPublishingDesign& rDesign) { return rDesign.m_aDesignName == aDesign.m_aDesignName; });
+
+ if (iter != m_aDesignList.end())
+ {
+ std::unique_ptr<weld::MessageDialog> xErrorBox(Application::CreateMessageDialog(m_xDialog.get(),
+ VclMessageType::Error, VclButtonsType::YesNo,
+ SdResId(STR_PUBDLG_SAMENAME)));
+ bRetry = xErrorBox->run() == RET_NO;
+
+ if(!bRetry)
+ m_aDesignList.erase(iter);
+ }
+
+ if(!bRetry)
+ {
+ m_aDesignList.push_back(aDesign);
+ m_bDesignListDirty = true;
+ }
+ }
+ }
+ while(bRetry);
+ }
+
+ if(m_bDesignListDirty)
+ Save();
+
+ m_xDialog->response(RET_OK);
+}
+
+// Refresh the dialogs when changing from pages
+void SdPublishingDlg::ChangePage()
+{
+ int nPage = aAssistentFunc.GetCurrentPage();
+ m_xDialog->set_help_id(aPageHelpIds[nPage-1]);
+
+ UpdatePage();
+
+ if (m_xNextPageButton->get_sensitive())
+ m_xNextPageButton->grab_focus();
+ else
+ m_xFinishButton->grab_focus();
+}
+
+void SdPublishingDlg::UpdatePage()
+{
+ m_xNextPageButton->set_sensitive(!aAssistentFunc.IsLastPage());
+ m_xLastPageButton->set_sensitive(!aAssistentFunc.IsFirstPage());
+
+ int nPage = aAssistentFunc.GetCurrentPage();
+
+ switch( nPage )
+ {
+ case 1:
+ if(m_xPage1_NewDesign->get_active())
+ {
+ m_xPage1_Designs->set_sensitive(false);
+ m_xPage1_DelDesign->set_sensitive(false);
+ }
+
+ if(m_aDesignList.empty())
+ m_xPage1_OldDesign->set_sensitive(false);
+ break;
+ case 2:
+ m_xPage2_Frames_FB->set_visible(m_xPage2_Frames->get_active());
+ m_xPage2_Standard_FB->set_visible(m_xPage2_Standard->get_active());
+ m_xPage2_Kiosk_FB->set_visible(m_xPage2_Kiosk->get_active());
+ m_xPage2_WebCast_FB->set_visible(m_xPage2_WebCast->get_active());
+
+ if( m_xPage2_WebCast->get_active() )
+ {
+ m_xPage2Frame4->show();
+ m_xPage2_Title_WebCast->show();
+ m_xPage2_ASP->show();
+ m_xPage2_PERL->show();
+ m_xPage2_URL_txt->show();
+ m_xPage2_URL->show();
+ m_xPage2_CGI_txt->show();
+ m_xPage2_CGI->show();
+ m_xPage2_Index_txt->show();
+ m_xPage2_Index->show();
+
+ bool bPerl = m_xPage2_PERL->get_active();
+ m_xPage2_Index->set_sensitive(bPerl);
+ m_xPage2_Index_txt->set_sensitive(bPerl);
+ m_xPage2_URL_txt->set_sensitive(bPerl);
+ m_xPage2_URL->set_sensitive(bPerl);
+ m_xPage2_CGI_txt->set_sensitive(bPerl);
+ m_xPage2_CGI->set_sensitive(bPerl);
+ }
+ else
+ {
+ m_xPage2Frame4->hide();
+ m_xPage2_Title_WebCast->hide();
+ m_xPage2_ASP->hide();
+ m_xPage2_PERL->hide();
+ m_xPage2_URL_txt->hide();
+ m_xPage2_URL->hide();
+ m_xPage2_CGI_txt->hide();
+ m_xPage2_CGI->hide();
+ m_xPage2_Index->hide();
+ m_xPage2_Index_txt->hide();
+ }
+
+ if( m_xPage2_Kiosk->get_active() )
+ {
+ m_xPage2Frame3->show();
+ m_xPage2_Title_Kiosk->show();
+ m_xPage2_ChgDefault->show();
+ m_xPage2_ChgAuto->show();
+ m_xPage2_Duration_txt->show();
+ m_xPage2_Duration->show();
+ m_xPage2_Endless->show();
+ bool bAuto = m_xPage2_ChgAuto->get_active();
+ m_xPage2_Duration->set_sensitive(bAuto);
+ m_xPage2_Endless->set_sensitive(bAuto);
+ }
+ else
+ {
+ m_xPage2Frame3->hide();
+ m_xPage2_Title_Kiosk->hide();
+ m_xPage2_ChgDefault->hide();
+ m_xPage2_ChgAuto->hide();
+ m_xPage2_Duration->hide();
+ m_xPage2_Duration_txt->hide();
+ m_xPage2_Endless->hide();
+ }
+
+ if( m_xPage2_Standard->get_active() || m_xPage2_Frames->get_active() )
+ {
+ m_xPage2Frame2->show();
+ m_xPage2_Title_Html->show();
+ m_xPage2_Content->show();
+ if(m_bImpress)
+ m_xPage2_Notes->show();
+ }
+ else
+ {
+ m_xPage2Frame2->hide();
+ m_xPage2_Title_Html->hide();
+ m_xPage2_Content->hide();
+ if(m_bImpress)
+ m_xPage2_Notes->hide();
+ }
+ break;
+ case 3:
+ if( m_xPage2_Kiosk->get_active() || m_xPage2_WebCast->get_active() )
+ m_xNextPageButton->set_sensitive(false);
+
+ if( m_xPage2_WebCast->get_active() )
+ m_xPage3_SldSound->set_sensitive(false);
+
+ m_xPage3_Quality->set_sensitive(m_xPage3_Jpg->get_active());
+
+ break;
+ case 5:
+ if( m_bButtonsDirty )
+ LoadPreviewButtons();
+ break;
+ }
+}
+
+/** loads the html buttons from the button sets, creates a preview and fills the
+ itemset for page 5
+ */
+void SdPublishingDlg::LoadPreviewButtons()
+{
+ if (!m_xButtonSet)
+ return;
+
+ const int nButtonCount = 8;
+ static const char *pButtonNames[nButtonCount] =
+ {
+ "first.png",
+ "left.png",
+ "right.png",
+ "last.png",
+ "home.png",
+ "text.png",
+ "expand.png",
+ "collapse.png",
+ };
+
+ std::vector< OUString > aButtonNames;
+ for(const char * p : pButtonNames)
+ aButtonNames.push_back( OUString::createFromAscii( p ) );
+
+ int nSetCount = m_xButtonSet->getCount();
+
+ int nHeight = 32;
+ Image aImage;
+ for( int nSet = 0; nSet < nSetCount; ++nSet )
+ {
+ if( m_xButtonSet->getPreview( nSet, aButtonNames, aImage ) )
+ {
+ m_xPage5_Buttons->InsertItem( static_cast<sal_uInt16>(nSet)+1, aImage );
+ if( nHeight < aImage.GetSizePixel().Height() )
+ nHeight = aImage.GetSizePixel().Height();
+ }
+ }
+
+ m_xPage5_Buttons->SetItemHeight( nHeight );
+ m_bButtonsDirty = false;
+}
+
+// Clickhandler for the Forward Button
+IMPL_LINK_NOARG(SdPublishingDlg, NextPageHdl, weld::Button&, void)
+{
+ aAssistentFunc.NextPage();
+ ChangePage();
+}
+
+// Sets the Controls in the dialog to the settings in the design
+void SdPublishingDlg::SetDesign( SdPublishingDesign const * pDesign )
+{
+ if(!pDesign)
+ return;
+
+ m_xPage2_Standard->set_sensitive(pDesign->m_eMode == PUBLISH_HTML);
+ m_xPage2_Frames->set_sensitive(pDesign->m_eMode == PUBLISH_FRAMES);
+ m_xPage2_Kiosk->set_sensitive(pDesign->m_eMode == PUBLISH_KIOSK );
+ m_xPage2_WebCast->set_sensitive(pDesign->m_eMode == PUBLISH_WEBCAST );
+
+ m_xPage2_Content->set_sensitive(pDesign->m_bContentPage);
+ if(pDesign->m_bContentPage)
+ aAssistentFunc.EnablePage(4);
+ else
+ aAssistentFunc.DisablePage(4);
+
+ if(m_bImpress)
+ m_xPage2_Notes->set_sensitive(pDesign->m_bNotes);
+
+ m_xPage2_ASP->set_sensitive(pDesign->m_eScript == SCRIPT_ASP);
+ m_xPage2_PERL->set_sensitive(pDesign->m_eScript == SCRIPT_PERL);
+ m_xPage2_CGI->set_text(pDesign->m_aCGI);
+ m_xPage2_URL->set_text(pDesign->m_aURL);
+
+ m_xPage2_ChgDefault->set_sensitive( !pDesign->m_bAutoSlide );
+ m_xPage2_ChgAuto->set_sensitive( pDesign->m_bAutoSlide );
+
+ tools::Time aTime( tools::Time::EMPTY );
+ aTime.MakeTimeFromMS( pDesign->m_nSlideDuration * 1000 );
+ m_xFormatter->SetTime(aTime);
+
+ m_xPage2_Endless->set_sensitive( pDesign->m_bEndless );
+
+ m_xPage3_Png->set_sensitive(pDesign->m_eFormat == FORMAT_PNG);
+ m_xPage3_Gif->set_sensitive(pDesign->m_eFormat == FORMAT_GIF);
+ m_xPage3_Jpg->set_sensitive(pDesign->m_eFormat == FORMAT_JPG);
+ m_xPage3_Quality->set_sensitive(pDesign->m_eFormat == FORMAT_JPG);
+
+ m_xPage3_Quality->set_entry_text(pDesign->m_aCompression);
+ m_xPage3_Resolution_1->set_sensitive(pDesign->m_nResolution == PUB_LOWRES_WIDTH);
+ m_xPage3_Resolution_2->set_sensitive(pDesign->m_nResolution == PUB_MEDRES_WIDTH);
+ m_xPage3_Resolution_3->set_sensitive(pDesign->m_nResolution == PUB_HIGHRES_WIDTH);
+ m_xPage3_Resolution_4->set_sensitive(pDesign->m_nResolution == PUB_FHDRES_WIDTH);
+
+ m_xPage3_SldSound->set_sensitive( pDesign->m_bSlideSound );
+ m_xPage3_HiddenSlides->set_sensitive( pDesign->m_bHiddenSlides );
+
+ m_xPage4_Author->set_text(pDesign->m_aAuthor);
+ m_xPage4_Email->set_text(pDesign->m_aEMail);
+ m_xPage4_WWW->set_text(pDesign->m_aWWW);
+ m_xPage4_Misc->set_text(pDesign->m_aMisc);
+ if(m_bImpress)
+ m_xPage4_Download->set_sensitive(pDesign->m_bDownload);
+
+ m_xPage5_TextOnly->set_sensitive(pDesign->m_nButtonThema == -1);
+ if(pDesign->m_nButtonThema != -1)
+ {
+ if(m_bButtonsDirty)
+ LoadPreviewButtons();
+ m_xPage5_Buttons->SelectItem(pDesign->m_nButtonThema + 1);
+ }
+ else
+ m_xPage5_Buttons->SetNoSelection();
+
+ m_xPage6_User->set_sensitive(pDesign->m_bUserAttr);
+ m_aBackColor = pDesign->m_aBackColor;
+ m_aTextColor = pDesign->m_aTextColor;
+ m_aLinkColor = pDesign->m_aLinkColor;
+ m_aVLinkColor = pDesign->m_aVLinkColor;
+ m_aALinkColor = pDesign->m_aALinkColor;
+
+ m_xPage6_DocColors->set_sensitive(pDesign->m_bUseColor);
+
+ m_xPage6_Preview->SetColors( m_aBackColor, m_aTextColor, m_aLinkColor,
+ m_aVLinkColor, m_aALinkColor );
+ m_xPage6_Preview->Invalidate();
+
+ UpdatePage();
+}
+
+// Transfer the status of the Design Dialog Controls
+void SdPublishingDlg::GetDesign( SdPublishingDesign* pDesign )
+{
+ if(!pDesign)
+ return;
+
+ pDesign->m_eMode = m_xPage2_Standard->get_active()?PUBLISH_HTML:
+ m_xPage2_Frames->get_active()?PUBLISH_FRAMES:
+ m_xPage2_Kiosk->get_active()?PUBLISH_KIOSK:
+ PUBLISH_WEBCAST;
+
+ pDesign->m_bContentPage = m_xPage2_Content->get_active();
+ if(m_bImpress)
+ pDesign->m_bNotes = m_xPage2_Notes->get_active();
+
+ if( m_xPage3_Gif->get_active() )
+ pDesign->m_eFormat = FORMAT_GIF;
+ else if( m_xPage3_Jpg->get_active() )
+ pDesign->m_eFormat = FORMAT_JPG;
+ else
+ pDesign->m_eFormat = FORMAT_PNG;
+
+ pDesign->m_aCompression = m_xPage3_Quality->get_active_text();
+
+ if (m_xPage3_Resolution_1->get_active())
+ pDesign->m_nResolution = PUB_LOWRES_WIDTH;
+ else if (m_xPage3_Resolution_2->get_active())
+ pDesign->m_nResolution = PUB_MEDRES_WIDTH;
+ else if (m_xPage3_Resolution_3->get_active())
+ pDesign->m_nResolution = PUB_HIGHRES_WIDTH;
+ else
+ pDesign->m_nResolution = PUB_FHDRES_WIDTH;
+
+ pDesign->m_bSlideSound = m_xPage3_SldSound->get_active();
+ pDesign->m_bHiddenSlides = m_xPage3_HiddenSlides->get_active();
+
+ pDesign->m_aAuthor = m_xPage4_Author->get_text();
+ pDesign->m_aEMail = m_xPage4_Email->get_text();
+ pDesign->m_aWWW = m_xPage4_WWW->get_text();
+ pDesign->m_aMisc = m_xPage4_Misc->get_text();
+ pDesign->m_bDownload = m_bImpress && m_xPage4_Download->get_active();
+
+ if(m_xPage5_TextOnly->get_active())
+ pDesign->m_nButtonThema = -1;
+ else
+ pDesign->m_nButtonThema = m_xPage5_Buttons->GetSelectedItemId() - 1;
+
+ pDesign->m_bUserAttr = m_xPage6_User->get_active();
+ pDesign->m_aBackColor = m_aBackColor;
+ pDesign->m_aTextColor = m_aTextColor;
+ pDesign->m_aLinkColor = m_aLinkColor;
+ pDesign->m_aVLinkColor = m_aVLinkColor;
+ pDesign->m_aALinkColor = m_aALinkColor;
+ pDesign->m_bUseColor = m_xPage6_DocColors->get_active();
+
+ pDesign->m_eScript = m_xPage2_ASP->get_active()?SCRIPT_ASP:SCRIPT_PERL;
+ pDesign->m_aCGI = m_xPage2_CGI->get_text();
+ pDesign->m_aURL = m_xPage2_URL->get_text();
+
+ pDesign->m_bAutoSlide = m_xPage2_ChgAuto->get_active();
+ pDesign->m_nSlideDuration = static_cast<sal_uInt32>(m_xFormatter->GetTime().GetMSFromTime()) / 1000;
+ pDesign->m_bEndless = m_xPage2_Endless->get_active();
+}
+
+// Clickhandler for the back Button
+IMPL_LINK_NOARG(SdPublishingDlg, LastPageHdl, weld::Button&, void)
+{
+ aAssistentFunc.PreviousPage();
+ ChangePage();
+}
+
+// Load Designs
+void SdPublishingDlg::Load()
+{
+ m_bDesignListDirty = false;
+
+ INetURLObject aURL( SvtPathOptions().GetUserConfigPath() );
+ aURL.Append( u"designs.sod" );
+
+ // check if file exists, SfxMedium shows an errorbox else
+ {
+ std::unique_ptr<SvStream> pIStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ), StreamMode::READ );
+
+ bool bOk = pIStm && ( pIStm->GetError() == ERRCODE_NONE);
+
+ if( !bOk )
+ return;
+ }
+
+ SfxMedium aMedium( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ), StreamMode::READ | StreamMode::NOCREATE );
+
+ SvStream* pStream = aMedium.GetInStream();
+
+ if( !pStream )
+ return;
+
+ sal_uInt16 aCheck;
+ pStream->ReadUInt16( aCheck );
+
+ if(aCheck != nMagic)
+ return;
+
+ SdIOCompat aIO(*pStream, StreamMode::READ);
+
+ sal_uInt16 nDesigns(0);
+ pStream->ReadUInt16(nDesigns);
+
+ // there has to at least be a sal_uInt16 header in each design
+ const size_t nMaxRecords = pStream->remainingSize() / sizeof(sal_uInt16);
+ if (nDesigns > nMaxRecords)
+ {
+ SAL_WARN("sd", "Parsing error: " << nMaxRecords <<
+ " max possible entries, but " << nDesigns << " claimed, truncating");
+ nDesigns = nMaxRecords;
+ }
+
+ for( sal_uInt16 nIndex = 0;
+ pStream->GetError() == ERRCODE_NONE && nIndex < nDesigns;
+ nIndex++ )
+ {
+ SdPublishingDesign aDesign;
+ *pStream >> aDesign;
+
+ m_aDesignList.push_back(aDesign);
+ }
+}
+
+// Save Designs
+bool SdPublishingDlg::Save()
+{
+ INetURLObject aURL( SvtPathOptions().GetUserConfigPath() );
+ aURL.Append( u"designs.sod" );
+ SfxMedium aMedium( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ), StreamMode::WRITE | StreamMode::TRUNC );
+
+ SvStream* pStream = aMedium.GetOutStream();
+
+ if( !pStream )
+ return false;
+
+ pStream->WriteUInt16( nMagic );
+
+ // Destroys the SdIOCompat before the Stream is being distributed
+ {
+ SdIOCompat aIO(*pStream, StreamMode::WRITE, 0);
+
+ sal_uInt16 nDesigns = static_cast<sal_uInt16>(m_aDesignList.size());
+ pStream->WriteUInt16( nDesigns );
+
+ for( sal_uInt16 nIndex = 0;
+ pStream->GetError() == ERRCODE_NONE && nIndex < nDesigns;
+ nIndex++ )
+ WriteSdPublishingDesign( *pStream, m_aDesignList[nIndex] );
+ }
+
+ aMedium.Close();
+ aMedium.Commit();
+
+ return( aMedium.GetError() == ERRCODE_NONE );
+}
+
+// SdDesignNameDlg Methods
+SdDesignNameDlg::SdDesignNameDlg(weld::Window* pWindow, const OUString& rName)
+ : GenericDialogController(pWindow, "modules/sdraw/ui/namedesign.ui", "NameDesignDialog")
+ , m_xEdit(m_xBuilder->weld_entry("entry"))
+ , m_xBtnOK(m_xBuilder->weld_button("ok"))
+{
+ m_xEdit->connect_changed(LINK(this, SdDesignNameDlg, ModifyHdl ));
+ m_xEdit->set_text(rName);
+ m_xBtnOK->set_sensitive(!rName.isEmpty());
+}
+
+OUString SdDesignNameDlg::GetDesignName() const
+{
+ return m_xEdit->get_text();
+}
+
+IMPL_LINK_NOARG(SdDesignNameDlg, ModifyHdl, weld::Entry&, void)
+{
+ m_xBtnOK->set_sensitive(!m_xEdit->get_text().isEmpty());
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/html/sdhtmlfilter.cxx b/sd/source/filter/html/sdhtmlfilter.cxx
new file mode 100644
index 000000000..f7a3bc10f
--- /dev/null
+++ b/sd/source/filter/html/sdhtmlfilter.cxx
@@ -0,0 +1,51 @@
+/* -*- 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 <sfx2/docfile.hxx>
+#include <sfx2/frame.hxx>
+#include <sfx2/sfxsids.hrc>
+
+#include "htmlex.hxx"
+#include <sdhtmlfilter.hxx>
+
+SdHTMLFilter::SdHTMLFilter(SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell)
+ : SdFilter(rMedium, rDocShell)
+{
+}
+
+SdHTMLFilter::~SdHTMLFilter() {}
+
+bool SdHTMLFilter::Export()
+{
+ mrMedium.Close();
+ mrMedium.Commit();
+
+ SfxItemSet* pSet = mrMedium.GetItemSet();
+
+ css::uno::Sequence<css::beans::PropertyValue> aParams;
+
+ if (const SfxUnoAnyItem* pItem = pSet->GetItemIfSet(SID_FILTER_DATA, false))
+ pItem->GetValue() >>= aParams;
+
+ HtmlExport aExport(mrMedium.GetName(), aParams, &mrDocument, &mrDocShell);
+
+ return true;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/pdf/sdpdffilter.cxx b/sd/source/filter/pdf/sdpdffilter.cxx
new file mode 100644
index 000000000..002c1c5db
--- /dev/null
+++ b/sd/source/filter/pdf/sdpdffilter.cxx
@@ -0,0 +1,201 @@
+/* -*- 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 <sfx2/docfile.hxx>
+#include <svx/svdograf.hxx>
+#include <o3tl/safeint.hxx>
+
+#include <sdpage.hxx>
+#include <drawdoc.hxx>
+#include <sdpdffilter.hxx>
+
+#include <vcl/graph.hxx>
+#include <vcl/pdfread.hxx>
+
+#include <Annotation.hxx>
+
+#include <com/sun/star/office/XAnnotation.hpp>
+#include <com/sun/star/text/XText.hpp>
+
+#include <basegfx/polygon/b2dpolygontools.hxx>
+
+using namespace css;
+
+SdPdfFilter::SdPdfFilter(SfxMedium& rMedium, sd::DrawDocShell& rDocShell)
+ : SdFilter(rMedium, rDocShell)
+{
+}
+
+SdPdfFilter::~SdPdfFilter() {}
+
+bool SdPdfFilter::Import()
+{
+ const OUString aFileName(
+ mrMedium.GetURLObject().GetMainURL(INetURLObject::DecodeMechanism::NONE));
+
+ std::vector<vcl::PDFGraphicResult> aGraphics;
+ if (vcl::ImportPDFUnloaded(aFileName, aGraphics) == 0)
+ return false;
+
+ bool bWasLocked = mrDocument.isLocked();
+ mrDocument.setLock(true);
+ const bool bSavedUndoEnabled = mrDocument.IsUndoEnabled();
+ mrDocument.EnableUndo(false);
+
+ // Add as many pages as we need up-front.
+ mrDocument.CreateFirstPages();
+ for (size_t i = 0; i < aGraphics.size() - 1; ++i)
+ {
+ mrDocument.DuplicatePage(0);
+ }
+
+ for (vcl::PDFGraphicResult const& rPDFGraphicResult : aGraphics)
+ {
+ const Graphic& rGraphic = rPDFGraphicResult.GetGraphic();
+ const Size& aSizeHMM = rPDFGraphicResult.GetSize();
+
+ const sal_Int32 nPageNumber = rGraphic.getPageNumber();
+ assert(nPageNumber >= 0 && o3tl::make_unsigned(nPageNumber) < aGraphics.size());
+
+ // Create the page and insert the Graphic.
+ SdPage* pPage = mrDocument.GetSdPage(nPageNumber, PageKind::Standard);
+ if (!pPage) // failed to duplicate page, out of memory?
+ return false;
+
+ // Make the page size match the rendered image.
+ pPage->SetSize(aSizeHMM);
+
+ SdrGrafObj* pSdrGrafObj = new SdrGrafObj(pPage->getSdrModelFromSdrPage(), rGraphic,
+ tools::Rectangle(Point(), aSizeHMM));
+
+ pSdrGrafObj->SetResizeProtect(true);
+ pSdrGrafObj->SetMoveProtect(true);
+
+ pPage->InsertObject(pSdrGrafObj);
+
+ for (auto const& rPDFAnnotation : rPDFGraphicResult.GetAnnotations())
+ {
+ uno::Reference<office::XAnnotation> xAnnotation;
+ pPage->createAnnotation(xAnnotation);
+
+ xAnnotation->setAuthor(rPDFAnnotation.maAuthor);
+
+ uno::Reference<text::XText> xText(xAnnotation->getTextRange());
+ xText->setString(rPDFAnnotation.maText);
+ // position is in mm not 100thmm
+ geometry::RealPoint2D aUnoPosition(rPDFAnnotation.maRectangle.getMinX() / 100.0,
+ rPDFAnnotation.maRectangle.getMinY() / 100.00);
+ geometry::RealSize2D aUnoSize(rPDFAnnotation.maRectangle.getWidth() / 100.0,
+ rPDFAnnotation.maRectangle.getHeight() / 100.00);
+ xAnnotation->setPosition(aUnoPosition);
+ xAnnotation->setSize(aUnoSize);
+ xAnnotation->setDateTime(rPDFAnnotation.maDateTime);
+
+ if (rPDFAnnotation.mpMarker)
+ {
+ auto* pAnnotation = static_cast<sd::Annotation*>(xAnnotation.get());
+ pAnnotation->createCustomAnnotationMarker();
+ sd::CustomAnnotationMarker& rCustomAnnotationMarker
+ = pAnnotation->getCustomAnnotationMarker();
+
+ rCustomAnnotationMarker.maLineColor = rPDFAnnotation.maColor;
+
+ if (rPDFAnnotation.meSubType == vcl::pdf::PDFAnnotationSubType::Polygon)
+ {
+ auto* pMarker = static_cast<vcl::pdf::PDFAnnotationMarkerPolygon*>(
+ rPDFAnnotation.mpMarker.get());
+ rCustomAnnotationMarker.mnLineWidth = pMarker->mnWidth;
+ rCustomAnnotationMarker.maFillColor = pMarker->maFillColor;
+ rCustomAnnotationMarker.maPolygons.push_back(pMarker->maPolygon);
+ }
+ else if (rPDFAnnotation.meSubType == vcl::pdf::PDFAnnotationSubType::Square)
+ {
+ auto* pMarker = static_cast<vcl::pdf::PDFAnnotationMarkerSquare*>(
+ rPDFAnnotation.mpMarker.get());
+ basegfx::B2DPolygon aPoly
+ = basegfx::utils::createPolygonFromRect(rPDFAnnotation.maRectangle);
+ rCustomAnnotationMarker.mnLineWidth = pMarker->mnWidth;
+ rCustomAnnotationMarker.maFillColor = pMarker->maFillColor;
+ rCustomAnnotationMarker.maPolygons.push_back(aPoly);
+ }
+ else if (rPDFAnnotation.meSubType == vcl::pdf::PDFAnnotationSubType::Circle)
+ {
+ auto* pMarker = static_cast<vcl::pdf::PDFAnnotationMarkerCircle*>(
+ rPDFAnnotation.mpMarker.get());
+
+ basegfx::B2DPoint rCenter = rPDFAnnotation.maRectangle.getCenter();
+ double fRadiusX = rPDFAnnotation.maRectangle.getWidth() / 2;
+ double fRadiusY = rPDFAnnotation.maRectangle.getHeight() / 2;
+
+ basegfx::B2DPolygon aPoly
+ = basegfx::utils::createPolygonFromEllipse(rCenter, fRadiusX, fRadiusY);
+ rCustomAnnotationMarker.mnLineWidth = pMarker->mnWidth;
+ rCustomAnnotationMarker.maFillColor = pMarker->maFillColor;
+ rCustomAnnotationMarker.maPolygons.push_back(aPoly);
+ }
+ else if (rPDFAnnotation.meSubType == vcl::pdf::PDFAnnotationSubType::Ink)
+ {
+ auto* pMarker = static_cast<vcl::pdf::PDFAnnotationMarkerInk*>(
+ rPDFAnnotation.mpMarker.get());
+ rCustomAnnotationMarker.maPolygons.insert(
+ rCustomAnnotationMarker.maPolygons.end(), pMarker->maStrokes.begin(),
+ pMarker->maStrokes.end());
+ rCustomAnnotationMarker.mnLineWidth = pMarker->mnWidth;
+ rCustomAnnotationMarker.maFillColor = pMarker->maFillColor;
+ }
+ else if (rPDFAnnotation.meSubType == vcl::pdf::PDFAnnotationSubType::Highlight)
+ {
+ if (!rCustomAnnotationMarker.maLineColor.IsTransparent())
+ rCustomAnnotationMarker.maLineColor.SetAlpha(255 - 0x90);
+ auto* pMarker = static_cast<vcl::pdf::PDFAnnotationMarkerHighlight*>(
+ rPDFAnnotation.mpMarker.get());
+ rCustomAnnotationMarker.maPolygons.insert(
+ rCustomAnnotationMarker.maPolygons.end(), pMarker->maQuads.begin(),
+ pMarker->maQuads.end());
+ rCustomAnnotationMarker.mnLineWidth = 1;
+ rCustomAnnotationMarker.maFillColor = rPDFAnnotation.maColor;
+ if (!rCustomAnnotationMarker.maFillColor.IsTransparent())
+ rCustomAnnotationMarker.maFillColor.SetAlpha(255 - 0x90);
+ }
+ else if (rPDFAnnotation.meSubType == vcl::pdf::PDFAnnotationSubType::Line)
+ {
+ auto* pMarker = static_cast<vcl::pdf::PDFAnnotationMarkerLine*>(
+ rPDFAnnotation.mpMarker.get());
+
+ basegfx::B2DPolygon aPoly;
+ aPoly.append(pMarker->maLineStart);
+ aPoly.append(pMarker->maLineEnd);
+ rCustomAnnotationMarker.maPolygons.push_back(aPoly);
+
+ rCustomAnnotationMarker.mnLineWidth = pMarker->mnWidth;
+ rCustomAnnotationMarker.maFillColor = COL_TRANSPARENT;
+ }
+ }
+ }
+ }
+ mrDocument.setLock(bWasLocked);
+ mrDocument.EnableUndo(bSavedUndoEnabled);
+ return true;
+}
+
+bool SdPdfFilter::Export() { return false; }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/ppt/ppt97animations.cxx b/sd/source/filter/ppt/ppt97animations.cxx
new file mode 100644
index 000000000..db3a960a7
--- /dev/null
+++ b/sd/source/filter/ppt/ppt97animations.cxx
@@ -0,0 +1,682 @@
+/* -*- 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 "ppt97animations.hxx"
+
+#include <svx/svdobj.hxx>
+#include <sdpage.hxx>
+#include <tools/stream.hxx>
+#include <svx/unoapi.hxx>
+#include <sal/log.hxx>
+#include <osl/diagnose.h>
+#include <CustomAnimationPreset.hxx>
+#include <com/sun/star/presentation/TextAnimationType.hpp>
+#include <com/sun/star/presentation/EffectNodeType.hpp>
+#include <com/sun/star/presentation/ShapeAnimationSubType.hpp>
+
+using namespace ::com::sun::star;
+
+void Ppt97AnimationInfoAtom::ReadStream( SvStream& rIn )
+{
+ sal_uInt32 nTmp;
+ rIn.ReadUInt32( nTmp );
+ nDimColor = Color(ColorTransparency, nTmp);
+ rIn.ReadUInt32( nFlags );
+ rIn.ReadUInt32( nSoundRef );
+ rIn.ReadInt32( nDelayTime );
+ rIn.ReadUInt16( nOrderID );
+ rIn.ReadUInt16( nSlideCount );
+ rIn.ReadUChar( nBuildType );
+ rIn.ReadUChar( nFlyMethod );
+ rIn.ReadUChar( nFlyDirection );
+ rIn.ReadUChar( nAfterEffect );
+ rIn.ReadUChar( nSubEffect );
+ rIn.ReadUChar( nOLEVerb );
+ rIn.ReadUChar( nUnknown1 );
+ rIn.ReadUChar( nUnknown2 );
+}
+
+Ppt97Animation::Ppt97Animation( SvStream& rInputStream )
+ : m_aAtom()
+ , m_bDirtyCache(true)
+ , m_bHasSpecialDuration(false)
+ , m_fDurationInSeconds(0.001)
+{
+ m_aAtom.ReadStream( rInputStream );
+}
+
+bool Ppt97Animation::operator < ( const Ppt97Animation& rAnimation ) const
+{
+ return m_aAtom.nOrderID < rAnimation.m_aAtom.nOrderID;
+}
+bool Ppt97Animation::operator > ( const Ppt97Animation& rAnimation ) const
+{
+ return m_aAtom.nOrderID > rAnimation.m_aAtom.nOrderID;
+}
+bool Ppt97Animation::HasEffect() const
+{
+ return m_aAtom.nBuildType != 0;
+}
+bool Ppt97Animation::HasParagraphEffect() const
+{
+ return m_aAtom.nBuildType > 1;
+}
+sal_Int32 Ppt97Animation::GetParagraphLevel() const
+{
+ sal_Int32 nParagraphLevel = 0;
+ if(m_aAtom.nBuildType>1)
+ nParagraphLevel = m_aAtom.nBuildType-1;
+ return nParagraphLevel;
+}
+bool Ppt97Animation::HasSoundEffect() const
+{
+ return m_aAtom.nSoundRef && m_aAtom.nFlags & 0x0010;
+}
+bool Ppt97Animation::HasStopPreviousSound() const
+{
+ return m_aAtom.nFlags & 0x0040;
+}
+bool Ppt97Animation::HasReverseOrder() const
+{
+ return m_aAtom.nFlags & 0x001;
+}
+bool Ppt97Animation::HasAnimateAssociatedShape() const
+{
+ return m_aAtom.nFlags & 0x004000;
+}
+bool Ppt97Animation::HasAfterEffect() const
+{
+ return m_aAtom.nAfterEffect != 0;
+}
+bool Ppt97Animation::HasAfterEffect_ChangeColor() const
+{
+ return m_aAtom.nAfterEffect == 1;
+}
+bool Ppt97Animation::HasAfterEffect_DimAtNextEffect() const
+{
+ return m_aAtom.nAfterEffect == 2;
+}
+#ifdef FUTURE
+bool Ppt97Animation::HasAfterEffect_DimAfterEffect() const
+{
+ return m_aAtom.nAfterEffect == 3;
+}
+#endif
+void Ppt97Animation::SetSoundFileUrl( const OUString& rSoundFileUrl )
+{
+ m_aSoundFileUrl = rSoundFileUrl;
+}
+
+double Ppt97Animation::GetDelayTimeInSeconds() const
+{
+ return m_aAtom.nDelayTime != 0X7FFFFFFF ? m_aAtom.nDelayTime/1000.0 : 0.0;
+}
+
+bool Ppt97Animation::GetSpecialDuration( double& rfDurationInSeconds ) const
+{
+ UpdateCacheData();
+ if( m_bHasSpecialDuration )
+ rfDurationInSeconds = m_fDurationInSeconds;
+ return m_bHasSpecialDuration;
+}
+
+bool Ppt97Animation::GetSpecialTextIterationDelay( double& rfTextIterationDelay ) const
+{
+ bool bRet = false;
+ switch(GetTextAnimationType())
+ {
+ case presentation::TextAnimationType::BY_LETTER:
+ rfTextIterationDelay = 0.075;
+ bRet = true;
+ break;
+ case presentation::TextAnimationType::BY_WORD:
+ rfTextIterationDelay = 0.3;
+ bRet = true;
+ break;
+ default:
+ break;
+ }
+ return bRet;
+}
+
+void Ppt97Animation::SetDimColor( Color nDimColor )
+{
+ m_aAtom.nDimColor = nDimColor;
+}
+void Ppt97Animation::SetAnimateAssociatedShape( bool bAnimate )
+{
+ if( !bAnimate )
+ {
+ //the appear effect cannot be animated without text
+ if( GetPresetId() == "ooo-entrance-appear" )
+ return;
+ //the random effect may be the appear effect and then has the same problem
+ if( GetPresetId() == "ooo-entrance-random" )
+ {
+ //this case is not 100% correct -> feel free to complete
+ //i consider this case as seldom and not that problematic and a simple correct fix is not in sight
+ SAL_INFO("sd", "you tried to deselect the animation of the form for random animation-> this has been refused");
+ return;
+ }
+
+ }
+
+ if(bAnimate)
+ m_aAtom.nFlags = m_aAtom.nFlags | 0x004000;
+ else if( HasAnimateAssociatedShape() )
+ {
+ m_aAtom.nFlags = m_aAtom.nFlags ^ 0x004000;
+ }
+}
+
+sal_Int16 Ppt97Animation::GetEffectNodeType() const //see css::presentation::EffectNodeType
+{
+ sal_Int16 nRet = presentation::EffectNodeType::ON_CLICK;
+ if( m_aAtom.nFlags & 0x04 )
+ {
+ nRet = presentation::EffectNodeType::AFTER_PREVIOUS;
+ }
+ return nRet;
+}
+
+sal_Int16 Ppt97Animation::GetTextAnimationType() const
+{
+ sal_Int16 nRet = presentation::TextAnimationType::BY_PARAGRAPH;
+ switch( m_aAtom.nSubEffect )
+ {
+ case 0:
+ break;
+ case 2:
+ nRet = presentation::TextAnimationType::BY_LETTER;
+ break;
+ default:
+ nRet = presentation::TextAnimationType::BY_WORD;
+ break;
+ }
+ return nRet;
+}
+OUString const & Ppt97Animation::GetPresetId() const
+{
+ UpdateCacheData();
+ return m_aPresetId;
+}
+OUString const & Ppt97Animation::GetPresetSubType() const
+{
+ UpdateCacheData();
+ return m_aSubType;
+}
+
+void Ppt97Animation::ClearCacheData() const
+{
+ m_aPresetId.clear();
+ m_aSubType.clear();
+ m_bHasSpecialDuration = false;
+ m_fDurationInSeconds = 0.001;
+}
+void Ppt97Animation::UpdateCacheData() const
+{
+ if( !m_bDirtyCache )
+ return;
+
+ ClearCacheData();
+
+ if( !HasEffect() )
+ {
+ m_bDirtyCache = false;
+ return;
+ }
+
+ switch( m_aAtom.nFlyMethod )
+ {
+ case 0x0:
+ m_aPresetId = "ooo-entrance-appear"; // --- appear ---
+ break;
+ case 0x01:
+ m_aPresetId = "ooo-entrance-random"; // --- random ---
+ break;
+ case 0x02: // --- blinds effect ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = "ooo-entrance-venetian-blinds";
+ m_aSubType = "horizontal"; // horizontal
+ break;
+ case 0x1:
+ m_aPresetId = "ooo-entrance-venetian-blinds";
+ m_aSubType = "vertical"; // vertical
+ break;
+ }
+ }
+ break;
+ case 0x03: // --- (hor/ver) shifted appear ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = "ooo-entrance-checkerboard";
+ m_aSubType = "across"; // vertical ???
+ break;
+ case 0x1:
+ m_aPresetId = "ooo-entrance-checkerboard";
+ m_aSubType = "downward"; // horizontal ???
+ break;
+ }
+ }
+ break;
+ case 0x05:
+ m_aPresetId = "ooo-entrance-dissolve-in";
+ break;
+ case 0x08: // --- (hor/ver) lines ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = "ooo-entrance-random-bars";
+ m_aSubType = "vertical"; // horizontal ???
+ break;
+ case 0x1:
+ m_aPresetId = "ooo-entrance-random-bars";
+ m_aSubType = "horizontal"; // vertical ???
+ break;
+ }
+ }
+ break;
+ case 0x09: // --- diagonal ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x4:
+ m_aPresetId = "ooo-entrance-diagonal-squares";
+ m_aSubType = "left-to-top"; // to left top
+ break;
+ case 0x5:
+ m_aPresetId = "ooo-entrance-diagonal-squares";
+ m_aSubType = "right-to-top"; // to right top
+ break;
+ case 0x6:
+ m_aPresetId = "ooo-entrance-diagonal-squares";
+ m_aSubType = "left-to-bottom"; // to left bottom
+ break;
+ case 0x7:
+ m_aPresetId = "ooo-entrance-diagonal-squares";
+ m_aSubType = "right-to-bottom"; // to right bottom
+ break;
+ }
+ }
+ break;
+ case 0x0a: // --- roll/wipe ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = "ooo-entrance-wipe";
+ m_aSubType = "from-right"; // from right
+ break;
+ case 0x1:
+ m_aPresetId = "ooo-entrance-wipe";
+ m_aSubType = "from-bottom"; // from bottom
+ break;
+ case 0x2:
+ m_aPresetId = "ooo-entrance-wipe";
+ m_aSubType = "from-left"; // from left
+ break;
+ case 0x3:
+ m_aPresetId = "ooo-entrance-wipe";
+ m_aSubType = "from-top"; // from top
+ break;
+ }
+ }
+ break;
+ case 0x0b: //--- fade in ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = "ooo-entrance-box";
+ m_aSubType = "out"; // from center
+ break;
+ case 0x1:
+ m_aPresetId = "ooo-entrance-box";
+ m_aSubType = "in"; // to center
+ break;
+ }
+ }
+ break;
+ case 0x0c: // --- text effects ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = "ooo-entrance-fly-in";
+ m_aSubType = "from-left";
+
+ break;
+ case 0x1:
+ m_aPresetId = "ooo-entrance-fly-in";
+ m_aSubType = "from-top";
+ break;
+ case 0x2:
+ m_aPresetId = "ooo-entrance-fly-in";
+ m_aSubType = "from-right";
+ break;
+ case 0x3:
+ m_aPresetId = "ooo-entrance-fly-in";
+ m_aSubType = "from-bottom";
+ break;
+ case 0x4:
+ m_aPresetId = "ooo-entrance-fly-in";
+ m_aSubType = "from-top-left";
+ break;
+ case 0x5:
+ m_aPresetId = "ooo-entrance-fly-in";
+ m_aSubType = "from-top-right";
+ break;
+ case 0x6:
+ m_aPresetId = "ooo-entrance-fly-in";
+ m_aSubType = "from-bottom-left";
+ break;
+ case 0x7:
+ m_aPresetId = "ooo-entrance-fly-in";
+ m_aSubType = "from-bottom-right";
+ break;
+ case 0x8: // -- short text effects --
+ m_aPresetId = "ooo-entrance-peek-in";
+ m_aSubType = "from-left";
+ break;
+ case 0x9:
+ m_aPresetId = "ooo-entrance-peek-in";
+ m_aSubType = "from-bottom";
+ break;
+ case 0xa:
+ m_aPresetId = "ooo-entrance-peek-in";
+ m_aSubType = "from-right";
+ break;
+ case 0xb:
+ m_aPresetId = "ooo-entrance-peek-in";
+ m_aSubType = "from-top";
+ break;
+ case 0xc: // -- slow text effects --
+ {
+ m_aPresetId = "ooo-entrance-fly-in-slow";
+ m_aSubType = "from-left";
+ }
+ break;
+ case 0xd:
+ {
+ m_aPresetId = "ooo-entrance-fly-in-slow";
+ m_aSubType = "from-top";
+ }
+ break;
+ case 0xe:
+ {
+ m_aPresetId = "ooo-entrance-fly-in-slow";
+ m_aSubType = "from-right";
+ }
+ break;
+ case 0xf:
+ {
+ m_aPresetId = "ooo-entrance-fly-in-slow";
+ m_aSubType = "from-bottom";
+ }
+ break;
+ case 0x10: // --- zoom ---
+ m_aPresetId = "ooo-entrance-zoom";
+ m_aSubType = "in";
+ break;
+ case 0x11:
+ m_aPresetId = "ooo-entrance-zoom";
+ m_aSubType = "in-slightly";
+ break;
+ case 0x12:
+ m_aPresetId = "ooo-entrance-zoom";
+ m_aSubType = "out";
+ break;
+ case 0x13:
+ m_aPresetId = "ooo-entrance-zoom";
+ m_aSubType = "out-slightly";
+ break;
+ case 0x14:
+ m_aPresetId = "ooo-entrance-zoom";
+ m_aSubType = "in-from-screen-center";
+ break;
+ case 0x15:
+ m_aPresetId = "ooo-entrance-zoom";
+ m_aSubType = "out-from-screen-center";
+ break;
+ case 0x16: // --- stretch ---
+ m_aPresetId = "ooo-entrance-stretchy";
+ m_aSubType = "across";
+ break;
+ case 0x17:
+ m_aPresetId = "ooo-entrance-stretchy";
+ m_aSubType = "from-left";
+ break;
+ case 0x18:
+ m_aPresetId = "ooo-entrance-stretchy";
+ m_aSubType = "from-top";
+ break;
+ case 0x19:
+ m_aPresetId = "ooo-entrance-stretchy";
+ m_aSubType = "from-right";
+ break;
+ case 0x1a:
+ m_aPresetId = "ooo-entrance-stretchy";
+ m_aSubType = "from-bottom";
+ break;
+ case 0x1b: // --- rotate ---
+ m_aPresetId = "ooo-entrance-swivel";
+ m_aSubType = "vertical";
+ break;
+ case 0x1c: // --- spirale ---
+ m_aPresetId = "ooo-entrance-spiral-in";
+ break;
+ }
+ }
+ break;
+ case 0x0d: // --- open/close ---
+ {
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0:
+ m_aPresetId = "ooo-entrance-split";
+ m_aSubType = "horizontal-out"; //horizontal open
+ break;
+ case 0x1:
+ m_aPresetId = "ooo-entrance-split";
+ m_aSubType = "horizontal-in"; //horizontal close
+ break;
+ case 0x2:
+ m_aPresetId = "ooo-entrance-split";
+ m_aSubType = "vertical-out"; // vertical open
+ break;
+ case 0x3:
+ m_aPresetId = "ooo-entrance-split";
+ m_aSubType = "vertical-in"; // vertical close
+ break;
+ }
+ }
+ break;
+ case 0x0e: // --- blink ---
+ {
+ m_aPresetId = "ooo-entrance-flash-once";
+ switch ( m_aAtom.nFlyDirection )
+ {
+ case 0x0: //fast
+ m_fDurationInSeconds = 0.075;
+ m_bHasSpecialDuration = true;
+ break;
+ case 0x1: //medium
+ m_fDurationInSeconds = 0.5;
+ m_bHasSpecialDuration = true;
+ break;
+ case 0x2: //slow
+ m_fDurationInSeconds = 1.0;
+ m_bHasSpecialDuration = true;
+ break;
+ }
+ }
+ break;
+ default:
+ {
+ m_aPresetId = "ooo-entrance-appear";
+ OSL_FAIL("no effect mapped");
+ }
+ break;
+ }
+ m_bDirtyCache = false;
+}
+
+void Ppt97Animation::createAndSetCustomAnimationEffect( SdrObject* pObj )
+{
+
+ if( !HasEffect() )
+ return;
+ if( !pObj || !pObj->getSdrPageFromSdrObject() )
+ {
+ OSL_FAIL("no valid SdrObject or page found for ppt import");
+ return;
+ }
+
+ uno::Reference< drawing::XShape > xShape = GetXShapeForSdrObject( pObj );
+ if( !xShape.is() )
+ {
+ OSL_FAIL("no XShape interface found for ppt import");
+ return;
+ }
+ ::sd::MainSequencePtr pMainSequence = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject())->getMainSequence();
+ if( !pMainSequence )
+ {
+ OSL_FAIL("no MainSequence found for ppt import");
+ return;
+ }
+
+ const ::sd::CustomAnimationPresets& rPresets( ::sd::CustomAnimationPresets::getCustomAnimationPresets() );
+ ::sd::CustomAnimationPresetPtr pPreset( rPresets.getEffectDescriptor( GetPresetId() ) );
+ if( !pPreset )
+ {
+ OSL_FAIL("no suitable preset found for ppt import");
+ return;
+ }
+
+ //--------------start doing something
+
+ //1. ------ create an effect from the presets ------
+ ::sd::CustomAnimationEffectPtr pEffect = std::make_shared<::sd::CustomAnimationEffect>( pPreset->create( GetPresetSubType() ) );
+
+ //2. ------ adapt the created effect ------
+
+ // set the shape targeted by this effect
+ pEffect->setTarget( css::uno::Any( xShape ) );
+
+ pEffect->setBegin( GetDelayTimeInSeconds() );
+
+ // some effects need a different duration than that of the mapped preset effect
+ double fDurationInSeconds = 1.0; //in seconds
+ if( GetSpecialDuration( fDurationInSeconds ) )
+ pEffect->setDuration( fDurationInSeconds );
+
+ // set after effect
+ if( HasAfterEffect() )
+ {
+ pEffect->setHasAfterEffect( true );
+ if( HasAfterEffect_ChangeColor() )
+ pEffect->setDimColor( uno::Any( GetDimColor() ) );
+ else
+ pEffect->setAfterEffectOnNext( HasAfterEffect_DimAtNextEffect() );
+ }
+
+ // set sound effect
+ if( HasSoundEffect() )
+ pEffect->createAudio( uno::Any( m_aSoundFileUrl ) );
+
+ // text iteration
+ pEffect->setIterateType( GetTextAnimationType() );
+
+ // some effects need a different delay between text iteration than that of the mapped preset effect
+ double fTextIterationDelay = 1.0;
+ if( GetSpecialTextIterationDelay( fTextIterationDelay ) )
+ pEffect->setIterateInterval( fTextIterationDelay );
+
+ // is the effect started on click or after the last effect (Another possible value is EffectNodeType::WITH_PREVIOUS )
+ pEffect->setNodeType( GetEffectNodeType() );
+
+ //set stop sound effect
+ if( HasStopPreviousSound() )
+ pEffect->setStopAudio();
+
+ // append the effect to the main sequence
+ if( !HasParagraphEffect() )
+ {
+ // TODO: !HasAnimateAssociatedShape() can possibly have this set to ONLY_TEXT - see i#42737
+ pEffect->setTargetSubItem( presentation::ShapeAnimationSubType::AS_WHOLE );
+ }
+
+ //3. ------ put the created effect to the model and do some last changes fro paragraph effects ------
+ pMainSequence->append( pEffect );
+ if( HasParagraphEffect() )
+ {
+ sal_Int32 nParagraphLevel = GetParagraphLevel();
+ double fDelaySeconds = GetDelayTimeInSeconds();
+ bool bAnimateAssociatedShape = HasAnimateAssociatedShape();//or only text
+ bool bTextReverse = HasReverseOrder();
+
+ // now create effects for each paragraph
+ ::sd::CustomAnimationTextGroupPtr pGroup = pMainSequence->
+ createTextGroup( pEffect, nParagraphLevel, fDelaySeconds, bAnimateAssociatedShape, bTextReverse );
+
+ if( pGroup )
+ {
+ const ::sd::EffectSequence& rEffects = pGroup->getEffects();
+
+ ::sd::CustomAnimationEffectPtr pLastEffect;
+ sal_Int32 nIndex = 0;
+ for( const auto& rxEffect : rEffects )
+ {
+ ::sd::CustomAnimationEffectPtr pGroupEffect(rxEffect);
+
+ ////todo? if( nIndex > 1 && pLastEffect && HasSoundEffect() )
+ //// pLastEffect->setStopAudio();
+ if( nIndex < 2 )
+ {
+ pGroupEffect->setNodeType( GetEffectNodeType() );
+ }
+ else if( nIndex > 0 )
+ {
+ bool bAtParagraphBegin = false;
+ if(!bTextReverse)
+ bAtParagraphBegin = pGroupEffect->getParaDepth() < nParagraphLevel;
+ else
+ bAtParagraphBegin = !pLastEffect || pLastEffect->getParaDepth() < nParagraphLevel;
+ if( bAtParagraphBegin )
+ pGroupEffect->setNodeType( GetEffectNodeType() );
+ else if( GetTextAnimationType() == presentation::TextAnimationType::BY_PARAGRAPH )
+ pGroupEffect->setNodeType( presentation::EffectNodeType::WITH_PREVIOUS );
+ else
+ pGroupEffect->setNodeType( presentation::EffectNodeType::AFTER_PREVIOUS );
+ }
+ pLastEffect = pGroupEffect;
+ nIndex++;
+ }
+ }
+ }
+ pMainSequence->rebuild();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/ppt/ppt97animations.hxx b/sd/source/filter/ppt/ppt97animations.hxx
new file mode 100644
index 000000000..1811d93a3
--- /dev/null
+++ b/sd/source/filter/ppt/ppt97animations.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <rtl/ustring.hxx>
+#include <sal/types.h>
+#include <tools/color.hxx>
+
+class SdrObject;
+class SvStream;
+
+/// helper class for reading PPT AnimationInfoAtom
+class Ppt97AnimationInfoAtom
+{
+ friend class Ppt97Animation;
+
+//-- member
+ Color nDimColor;
+ sal_uInt32 nFlags; ///< 0x0004: time instead of click
+ sal_uInt32 nSoundRef;
+ sal_Int32 nDelayTime; ///< 1/1000 sec
+ sal_uInt16 nOrderID;
+ sal_uInt16 nSlideCount;
+ sal_uInt8 nBuildType;
+ sal_uInt8 nFlyMethod;
+ sal_uInt8 nFlyDirection;
+ sal_uInt8 nAfterEffect; ///< nAfterEffect: 0: none; 1: change color; 2: dim on next effect; 3: dim after effect;
+ sal_uInt8 nSubEffect;
+ sal_uInt8 nOLEVerb;
+
+ // unknown, because whole size needs to be 28
+ sal_uInt8 nUnknown1;
+ sal_uInt8 nUnknown2;
+
+//-- methods
+ void ReadStream( SvStream& rIn );
+/*
+ nFlags:
+ decimal / hexadecimal / binary
+ 1040 0x00000410 10000010000 mouseclick
+ 17428 0x00004414 100010000010100 after previous 0 sec (animate form)
+ 17412 0x00004404 100010000000100 after previous 0 sec
+ 1088 0x00000440 10001000000 stop previous sound and mouseclick
+ 1044 0x00000414 10000010100 play sound automatic
+ 1041 0x00000411 10000010001
+ | | | | | |
+ | | | | | reverse order
+ | | | | after previous
+ | | | sound
+ | | stop previous sound
+ | ?
+ animate form
+
+ nAfterEffect:
+ 1: color
+ 0: nothing
+ 3: hide after animation
+ 2: hide at next mouse click
+*/
+};
+
+/** this is a helping class for import of PPT 97 animations
+ 1. use the constructor Ppt97Animation( SvStream& rIn ) to import information from the stream
+ 2. use the set methods to modify and complete the data
+ 3. use the method createAndSetCustomAnimationEffect( ) to create an effect in sd model
+ */
+class Ppt97Animation
+{
+
+public: //public methods
+ explicit Ppt97Animation( SvStream& rIn );
+
+ bool operator < ( const Ppt97Animation& rAnimation ) const;//later is greater
+ bool operator > ( const Ppt97Animation& rAnimation ) const;//later is greater
+
+ //get methods
+ bool HasEffect() const;
+ bool HasParagraphEffect() const;
+ bool HasSoundEffect() const;
+ sal_Int32 GetDimColor() const { return static_cast<sal_Int32>(m_aAtom.nDimColor);}
+ sal_uInt32 GetSoundRef() const { return m_aAtom.nSoundRef;}
+ /// @return true if the shape should be animated in addition to the text
+ bool HasAnimateAssociatedShape() const;
+
+ //set methods
+ void SetDimColor( Color nDimColor );
+ void SetSoundFileUrl( const OUString& rSoundFileUrl );
+ void SetAnimateAssociatedShape( bool bAnimate ); //true if the shape should be animated in addition to the text
+
+ //action methods
+ /** this method creates a CustomAnimationEffect for the given SdrObject
+ from internal data and stores the created effect at the draw model
+ */
+ void createAndSetCustomAnimationEffect( SdrObject* pObj );
+
+private: //private methods
+
+ //read methods
+ OUString const & GetPresetId() const;
+ OUString const & GetPresetSubType() const;
+ bool HasAfterEffect() const;
+ bool HasAfterEffect_ChangeColor() const;
+ bool HasAfterEffect_DimAtNextEffect() const;
+ bool HasStopPreviousSound() const;
+
+ /// @return true if the text paragraphs should be animated in reverse order
+ bool HasReverseOrder() const;
+
+ ///paragraph level that is animated ( that paragraph and higher levels )
+ sal_Int32 GetParagraphLevel() const;
+
+ ///@see css::presentation::TextAnimationType
+ sal_Int16 GetTextAnimationType() const;
+
+ ///@see css::presentation::EffectNodeType
+ sal_Int16 GetEffectNodeType() const;
+
+ /// @return -1 for start on mouseclick or >= 0 for a delay in seconds for automatic start
+ double GetDelayTimeInSeconds() const;
+ bool GetSpecialDuration( double& rfDurationInSeconds ) const;
+ bool GetSpecialTextIterationDelay( double& rfTextIterationDelay ) const;
+
+ void UpdateCacheData() const;
+ void ClearCacheData() const;
+
+private: //private member
+ //input information:
+ Ppt97AnimationInfoAtom m_aAtom; ///< pure input from stream
+ OUString m_aSoundFileUrl; ///< this needs to be set in addition from outside as this class has not the knowledge to translate the sound bits to a file url
+
+ //cached generated output information:
+ mutable bool m_bDirtyCache;
+ mutable OUString m_aPresetId; // m_aPresetId and m_aSubType match to the values in sd/xml/effects.xml
+ mutable OUString m_aSubType;
+ mutable bool m_bHasSpecialDuration;
+ mutable double m_fDurationInSeconds;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/ppt/pptanimations.hxx b/sd/source/filter/ppt/pptanimations.hxx
new file mode 100644
index 000000000..7fda1bb68
--- /dev/null
+++ b/sd/source/filter/ppt/pptanimations.hxx
@@ -0,0 +1,209 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Any.h>
+
+#include <map>
+#include <sal/types.h>
+
+class SvStream;
+
+namespace ppt
+{
+
+// old transition types
+#define PPT_TRANSITION_TYPE_NONE 0
+#define PPT_TRANSITION_TYPE_RANDOM 1
+#define PPT_TRANSITION_TYPE_BLINDS 2
+#define PPT_TRANSITION_TYPE_CHECKER 3
+#define PPT_TRANSITION_TYPE_COVER 4
+#define PPT_TRANSITION_TYPE_DISSOLVE 5
+#define PPT_TRANSITION_TYPE_FADE 6
+#define PPT_TRANSITION_TYPE_PULL 7 // Uncover in MS-PPT Specs
+#define PPT_TRANSITION_TYPE_RANDOM_BARS 8
+#define PPT_TRANSITION_TYPE_STRIPS 9
+#define PPT_TRANSITION_TYPE_WIPE 10
+#define PPT_TRANSITION_TYPE_ZOOM 11 // Box In/Out in MS-PPT Specs
+#define PPT_TRANSITION_TYPE_SPLIT 13
+
+// effects, new in xp
+#define PPT_TRANSITION_TYPE_DIAMOND 17
+#define PPT_TRANSITION_TYPE_PLUS 18
+#define PPT_TRANSITION_TYPE_WEDGE 19
+#define PPT_TRANSITION_TYPE_PUSH 20
+#define PPT_TRANSITION_TYPE_COMB 21
+#define PPT_TRANSITION_TYPE_NEWSFLASH 22
+#define PPT_TRANSITION_TYPE_SMOOTHFADE 23 // Alpha Fade in MS-PPT Specs
+#define PPT_TRANSITION_TYPE_WHEEL 26
+#define PPT_TRANSITION_TYPE_CIRCLE 27
+
+// undocumented(?)
+#define PPT_TRANSITION_TYPE_FLASH 30
+
+// atoms
+#define DFF_msofbtAnimEvent 0xf125
+#define DFF_msofbtAnimNode 0xf127
+#define DFF_msofbtAnimTrigger 0xf128
+#define DFF_msofbtAnimValue 0xf129
+#define DFF_msofbtAnimateTarget 0xf12a
+#define DFF_msofbtAnimate 0xf12b
+#define DFF_msofbtAnimateColor 0xf12c
+#define DFF_msofbtAnimateFilter 0xf12d
+#define DFF_msofbtAnimateMotion 0xf12e
+#define DFF_msofbtAnimateRotation 0xf12f
+#define DFF_msofbtAnimateScale 0xf130
+#define DFF_msofbtAnimateSet 0xf131
+#define DFF_msofbtAnimCommand 0xf132
+#define DFF_msofbtAnimateTargetSettings 0xf133
+#define DFF_msofbtAnimateData 0xf134
+#define DFF_msofbtAnimateColorData 0xf135
+#define DFF_msofbtAnimateFilterData 0xf136
+#define DFF_msofbtAnimateMotionData 0xf137
+#define DFF_msofbtAnimateScaleData 0xf139
+#define DFF_msofbtAnimateSetData 0xf13a
+#define DFF_msofbtCommandData 0xf13b
+#define DFF_msofbtAnimateTargetElement 0xf13c
+#define DFF_msofbtAnimPropertySet 0xf13d
+#define DFF_msofbtAnimateAttributeNames 0xf13e
+#define DFF_msofbtAnimKeyPoints 0xf13f
+#define DFF_msofbtAnimIteration 0xf140
+#define DFF_msofbtAnimAction 0xf141 // correct name??
+#define DFF_msofbtAnimAttributeValue 0xf142
+#define DFF_msofbtAnimKeyTime 0xf143
+#define DFF_msofbtAnimGroup 0xf144
+#define DFF_msofbtAnimSubGoup 0xf145
+#define DFF_msofbtAnimateRotationData 0xf138
+#define DFF_msofbtAnimReference 0x2afb
+
+// property ids
+#define DFF_ANIM_ID 1
+#define DFF_ANIM_RUNTIMECONTEXT 2
+#define DFF_ANIM_PATH_EDIT_MODE 3
+#define DFF_ANIM_COLORSPACE 4
+#define DFF_ANIM_DIRECTION 5 // TODO: Conflict?
+#define DFF_ANIM_MASTERREL 5 // TODO: Conflict?
+#define DFF_ANIM_OVERRIDE 6
+#define DFF_ANIM_PRESET_ID 9
+#define DFF_ANIM_PRESET_SUB_TYPE 10
+#define DFF_ANIM_PRESET_CLASS 11
+#define DFF_ANIM_AFTEREFFECT 13
+#define DFF_ANIM_ENDAFTERSLIDE 15
+#define DFF_ANIM_TIMEFILTER 16
+#define DFF_ANIM_EVENT_FILTER 17
+#define DFF_ANIM_GROUP_ID 19
+#define DFF_ANIM_NODE_TYPE 20
+#define DFF_ANIM_VOLUME 22
+#define DFF_ANIM_PROPERTY_ID_COUNT (DFF_ANIM_VOLUME + 1)
+
+// property types
+#define DFF_ANIM_PROP_TYPE_BYTE 0
+#define DFF_ANIM_PROP_TYPE_INT32 1
+#define DFF_ANIM_PROP_TYPE_FLOAT 2
+#define DFF_ANIM_PROP_TYPE_UNISTRING 3
+
+#define DFF_ANIM_PRESS_CLASS_USER_DEFINED 0
+#define DFF_ANIM_PRESS_CLASS_ENTRANCE 1
+#define DFF_ANIM_PRESS_CLASS_EXIT 2
+#define DFF_ANIM_PRESS_CLASS_EMPHASIS 3
+#define DFF_ANIM_PRESS_CLASS_MOTIONPATH 4
+#define DFF_ANIM_PRESS_CLASS_OLE_ACTION 5
+#define DFF_ANIM_PRESS_CLASS_MEDIACALL 6
+
+// Effect node type.
+#define DFF_ANIM_NODE_TYPE_ON_CLICK 1
+#define DFF_ANIM_NODE_TYPE_WITH_PREVIOUS 2
+#define DFF_ANIM_NODE_TYPE_AFTER_PREVIOUS 3
+#define DFF_ANIM_NODE_TYPE_MAIN_SEQUENCE 4
+#define DFF_ANIM_NODE_TYPE_INTERACTIVE_SEQ 5
+#define DFF_ANIM_NODE_TYPE_CLICK_PARALLEL 6
+#define DFF_ANIM_NODE_TYPE_WITH_GROUP 7
+#define DFF_ANIM_NODE_TYPE_AFTER_GROUP 8
+#define DFF_ANIM_NODE_TYPE_TIMING_ROOT 9
+
+/* constants for fill entry in AnimationNode */
+const sal_Int32 mso_Anim_GroupType_PAR = 0;
+const sal_Int32 mso_Anim_GroupType_SEQ = 1;
+const sal_Int32 mso_Anim_GroupType_NODE = 3;
+const sal_Int32 mso_Anim_GroupType_MEDIA = 4;
+
+/* constants for fill entry in AnimationNode */
+const sal_Int32 mso_Anim_Fill_ALWAYS = 1;
+const sal_Int32 mso_Anim_Fill_WHENOFF = 2;
+const sal_Int32 mso_Anim_Fill_NEVER = 3;
+
+/* constants for fill entry in AnimationNode */
+const sal_Int32 mso_Anim_Fill_REMOVE = 1;
+const sal_Int32 mso_Anim_Fill_FREEZE = 2;
+const sal_Int32 mso_Anim_Fill_HOLD = 3;
+
+/* constants for behaviour entry in PPTAnimationNode */
+const sal_Int32 mso_Anim_Behaviour_FILTER = 24;
+const sal_Int32 mso_Anim_Behaviour_ANIMATION= 25;
+
+typedef ::std::map< sal_Int32, css::uno::Any > PropertySetMap_t;
+
+class PropertySet
+{
+public:
+ PropertySetMap_t maProperties;
+
+ bool hasProperty( sal_Int32 nProperty ) const;
+ css::uno::Any getProperty( sal_Int32 nProperty ) const;
+};
+
+/** this atom is the first entry in each animation group */
+struct AnimationNode
+{
+public:
+ /** see mso_Anim_GroupType_? */
+ sal_Int32 mnGroupType;
+
+ /** see mso_Anim_Restart_? */
+ sal_Int32 mnRestart;
+
+ /** see mso_Anim_Fill_? */
+ sal_Int32 mnFill;
+
+ /** see mso_Anim_Behaviour_? */
+ sal_Int32 mnNodeType;
+
+ /** duration of this group in 1000th seconds */
+ sal_Int32 mnDuration;
+
+ sal_Int32 mnU1, mnU3, mnU4;
+
+ AnimationNode()
+ : mnGroupType(0)
+ , mnRestart(0)
+ , mnFill(0)
+ , mnNodeType(0)
+ , mnDuration(0)
+ , mnU1(0), mnU3(0), mnU4(0)
+ {
+ }
+public:
+
+ friend SvStream& WriteAnimationNode(SvStream& rOut, AnimationNode const & rAtom);
+};
+
+} // namespace ppt
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/ppt/pptatom.cxx b/sd/source/filter/ppt/pptatom.cxx
new file mode 100644
index 000000000..24d87f040
--- /dev/null
+++ b/sd/source/filter/ppt/pptatom.cxx
@@ -0,0 +1,104 @@
+/* -*- 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 <tools/stream.hxx>
+#include "pptatom.hxx"
+
+using namespace ppt;
+
+Atom::Atom( const DffRecordHeader& rRecordHeader, SvStream& rStream )
+: mrStream( rStream )
+, maRecordHeader( rRecordHeader )
+, mpFirstChild( nullptr )
+, mpNextAtom( nullptr )
+{
+ if( isContainer() )
+ {
+ if( seekToContent() )
+ {
+ DffRecordHeader aChildHeader;
+
+ Atom* pLastAtom = nullptr;
+
+ // retrieve file size (to allow sanity checks)
+ sal_uInt64 const nStreamSize = mrStream.TellEnd();
+
+ while( mrStream.good()
+ && ( mrStream.Tell() < nStreamSize )
+ && ( mrStream.Tell() < maRecordHeader.GetRecEndFilePos() ) )
+ {
+ if (ReadDffRecordHeader(mrStream, aChildHeader))
+ {
+ Atom* pAtom = new Atom( aChildHeader, mrStream );
+
+ if( pLastAtom )
+ pLastAtom->mpNextAtom = pAtom;
+ if( mpFirstChild == nullptr )
+ mpFirstChild = pAtom;
+
+ pLastAtom = pAtom;
+ }
+ }
+ }
+ }
+
+ if (!maRecordHeader.SeekToEndOfRecord(mrStream))
+ mrStream.SetError(SVSTREAM_FILEFORMAT_ERROR);
+}
+
+Atom::~Atom()
+{
+ Atom* pChild = mpFirstChild;
+ while( pChild )
+ {
+ Atom* pNextChild = pChild->mpNextAtom;
+ delete pChild;
+ pChild = pNextChild;
+ }
+}
+
+/** imports this atom and its child atoms */
+Atom* Atom::import( const DffRecordHeader& rRootRecordHeader, SvStream& rStCtrl )
+{
+ Atom* pRootAtom = new Atom( rRootRecordHeader, rStCtrl );
+
+ if( rStCtrl.GetError() == ERRCODE_NONE )
+ {
+ return pRootAtom;
+ }
+ else
+ {
+ delete pRootAtom;
+ return nullptr;
+ }
+}
+
+/** returns the next child atom after pLast with nRecType or NULL */
+const Atom* Atom::findNextChildAtom( sal_uInt16 nRecType, const Atom* pLast ) const
+{
+ Atom* pChild = pLast != nullptr ? pLast->mpNextAtom : mpFirstChild;
+ while( pChild && pChild->maRecordHeader.nRecType != nRecType )
+ {
+ pChild = pChild->mpNextAtom;
+ }
+
+ return pChild;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/ppt/pptatom.hxx b/sd/source/filter/ppt/pptatom.hxx
new file mode 100644
index 000000000..55ee7f687
--- /dev/null
+++ b/sd/source/filter/ppt/pptatom.hxx
@@ -0,0 +1,106 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <filter/msfilter/dffrecordheader.hxx>
+
+namespace ppt
+{
+class Atom
+{
+public:
+ ~Atom();
+
+ /** imports this atom and its child atoms */
+ static Atom* import(const DffRecordHeader& rRootRecordHeader, SvStream& rStCtrl);
+
+ /** @return true if at least one atom with the given nRecType is found */
+ inline bool hasChildAtom(sal_uInt16 nRecType) const;
+
+ /** @return the first child atom with nRecType or NULL */
+ inline const Atom* findFirstChildAtom(sal_uInt16 nRecType) const;
+
+ /** @return the next child atom after pLast with nRecType or NULL */
+ const Atom* findNextChildAtom(sal_uInt16 nRecType, const Atom* pLast) const;
+
+ /** @return the first child atom or NULL */
+ inline const Atom* findFirstChildAtom() const;
+
+ /** @return the next child atom after pLast or NULL */
+ static inline const Atom* findNextChildAtom(const Atom* pLast);
+
+ /** @return true if this atom is a container */
+ inline bool isContainer() const;
+
+ /** seeks to the contents of this atom */
+ inline bool seekToContent() const;
+
+ /** @return the record type */
+ inline sal_uInt16 getType() const;
+
+ /** @return the record instance */
+ inline sal_uInt16 getInstance() const;
+
+ /** @return the record length */
+ inline sal_uInt32 getLength() const;
+
+private:
+ Atom(const DffRecordHeader& rRecordHeader, SvStream& rStCtrl);
+
+ SvStream& mrStream;
+ DffRecordHeader maRecordHeader;
+ Atom* mpFirstChild;
+ Atom* mpNextAtom;
+};
+
+inline bool Atom::hasChildAtom(sal_uInt16 nRecType) const
+{
+ return findFirstChildAtom(nRecType) != nullptr;
+}
+
+inline const Atom* Atom::findFirstChildAtom(sal_uInt16 nRecType) const
+{
+ return findNextChildAtom(nRecType, nullptr);
+}
+
+inline const Atom* Atom::findFirstChildAtom() const { return mpFirstChild; }
+
+inline const Atom* Atom::findNextChildAtom(const Atom* pLast)
+{
+ return pLast ? pLast->mpNextAtom : pLast;
+}
+
+inline bool Atom::isContainer() const { return maRecordHeader.IsContainer(); }
+
+inline bool Atom::seekToContent() const
+{
+ maRecordHeader.SeekToContent(mrStream);
+ return mrStream.GetError() == ERRCODE_NONE;
+}
+
+inline sal_uInt16 Atom::getType() const { return maRecordHeader.nRecType; }
+
+inline sal_uInt16 Atom::getInstance() const { return maRecordHeader.nRecInstance; }
+
+inline sal_uInt32 Atom::getLength() const { return maRecordHeader.nRecLen; }
+
+} // namespace ppt
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/ppt/pptin.cxx b/sd/source/filter/ppt/pptin.cxx
new file mode 100644
index 000000000..305e1813a
--- /dev/null
+++ b/sd/source/filter/ppt/pptin.cxx
@@ -0,0 +1,2821 @@
+/* -*- 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 <osl/file.hxx>
+#include <sal/log.hxx>
+#include <unotools/configmgr.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#include <svl/urihelper.hxx>
+#include <svx/svxids.hrc>
+#include <filter/msfilter/svdfppt.hxx>
+#include <svx/svditer.hxx>
+#include <sfx2/docfile.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdlayer.hxx>
+#include <svx/sdmetitm.hxx>
+#include <svx/sdtmfitm.hxx>
+#include <svx/sdtagitm.hxx>
+#include <svl/style.hxx>
+#include <svl/intitem.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/editeng.hxx>
+#include <svx/svdoutl.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xlineit0.hxx>
+
+#include <sfx2/docinf.hxx>
+#include <o3tl/string_view.hxx>
+
+#include <strings.hrc>
+#include <strings.hxx>
+#include "pptin.hxx"
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <pres.hxx>
+#include <stlpool.hxx>
+#include <anminfo.hxx>
+#include <svx/gallery.hxx>
+#include <tools/debug.hxx>
+#include <tools/urlobj.hxx>
+#include <svx/svdopage.hxx>
+#include <svx/svdomedia.hxx>
+#include <svx/svdogrp.hxx>
+#include "propread.hxx"
+#include <cusshow.hxx>
+#include <xmloff/autolayout.hxx>
+
+#include <customshowlist.hxx>
+#include <sddll.hxx>
+
+#include <DrawDocShell.hxx>
+#include <FrameView.hxx>
+#include <unokywds.hxx>
+
+#include <unotools/fltrcfg.hxx>
+#include <sfx2/progress.hxx>
+#include <editeng/editstat.hxx>
+#include <unotools/pathoptions.hxx>
+
+#define MAX_USER_MOVE 2
+
+#include "pptanimations.hxx"
+#include "pptinanimations.hxx"
+#include "ppt97animations.hxx"
+
+#include <com/sun/star/animations/TransitionSubType.hpp>
+#include <com/sun/star/animations/TransitionType.hpp>
+#include <com/sun/star/document/XDocumentProperties.hpp>
+#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+#include <com/sun/star/drawing/LineStyle.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <comphelper/string.hxx>
+#include <oox/ole/olehelper.hxx>
+
+#include <optional>
+
+#include <cassert>
+#include <memory>
+#include <string_view>
+
+using namespace ::com::sun::star;
+
+SdPPTImport::SdPPTImport( SdDrawDocument* pDocument, SvStream& rDocStream, SotStorage& rStorage, SfxMedium& rMedium )
+ : maParam(rDocStream)
+{
+#ifdef DBG_UTIL
+ std::unique_ptr<PropRead> pSummaryInformation(new PropRead( rStorage, "\005SummaryInformation" ));
+ if ( pSummaryInformation->IsValid() )
+ {
+ pSummaryInformation->Read();
+ sal_uInt8 const aPropSetGUID[ 16 ]
+ {
+ 0xe0, 0x85, 0x9f, 0xf2, 0xf9, 0x4f, 0x68, 0x10, 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9
+ };
+ Section* pSection = const_cast<Section*>(pSummaryInformation->GetSection( aPropSetGUID ));
+ if ( pSection )
+ {
+ PropItem aPropItem;
+ if ( pSection->GetProperty( PID_COMMENTS, aPropItem ) )
+ {
+ OUString aComment;
+ aPropItem.Read( aComment );
+ if ( aComment.indexOf( "Applixware" ) >= 0 )
+ {
+ maParam.nImportFlags |= PPT_IMPORTFLAGS_NO_TEXT_ASSERT;
+ }
+ }
+ }
+ }
+ pSummaryInformation.reset();
+#endif
+
+ tools::SvRef<SotStorageStream> pCurrentUserStream(rStorage.OpenSotStream("Current User", StreamMode::STD_READ));
+ if (pCurrentUserStream)
+ {
+ ReadPptCurrentUserAtom(*pCurrentUserStream, maParam.aCurrentUserAtom);
+ }
+
+ if( pDocument )
+ {
+ // iterate over all styles
+ SdStyleSheetPool* pStyleSheetPool = pDocument->GetSdStyleSheetPool();
+ std::shared_ptr<SfxStyleSheetIterator> aIter =
+ std::make_shared<SfxStyleSheetIterator>(pStyleSheetPool, SfxStyleFamily::All);
+
+ for (SfxStyleSheetBase *pSheet = aIter->First(); pSheet; pSheet = aIter->Next())
+ {
+ SfxItemSet& rSet = pSheet->GetItemSet();
+ // if autokerning is set in style, override it, ppt has no autokerning
+ if( rSet.GetItemState( EE_CHAR_PAIRKERNING, false ) == SfxItemState::SET )
+ rSet.ClearItem( EE_CHAR_PAIRKERNING );
+ }
+ }
+
+ pFilter.reset(new ImplSdPPTImport(pDocument, rStorage, rMedium, maParam));
+}
+
+bool SdPPTImport::Import()
+{
+ return pFilter->Import();
+}
+
+SdPPTImport::~SdPPTImport()
+{
+}
+
+ImplSdPPTImport::ImplSdPPTImport( SdDrawDocument* pDocument, SotStorage& rStorage_, SfxMedium& rMedium, PowerPointImportParam& rParam )
+ : SdrPowerPointImport(rParam, rMedium.GetBaseURL())
+ , mrMed(rMedium)
+ , mrStorage(rStorage_)
+ , mbDocumentFound(false)
+ , mnFilterOptions(0)
+ , mpDoc(pDocument)
+ , mePresChange(PresChange::Manual)
+ , mnBackgroundObjectsLayerID(0)
+{
+ if ( !m_bOk )
+ return;
+
+ mbDocumentFound = SeekToDocument( &maDocHd ); // maDocHd = the latest DocumentHeader
+ while ( SeekToRec( rStCtrl, PPT_PST_Document, nStreamLen, &maDocHd ) )
+ mbDocumentFound = true;
+
+ sal_uInt32 nDggContainerOfs = 0;
+
+ if ( mbDocumentFound )
+ {
+ sal_uInt64 nOldPos = rStCtrl.Tell();
+
+ mxPicturesStream = rStorage_.OpenSotStream( "Pictures", StreamMode::STD_READ );
+ pStData = mxPicturesStream.get();
+
+ rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 );
+ sal_uLong nDocLen = maDocHd.GetRecEndFilePos();
+ DffRecordHeader aPPDGHd;
+ if ( SeekToRec( rStCtrl, PPT_PST_PPDrawingGroup, nDocLen, &aPPDGHd ) )
+ {
+ sal_uLong nPPDGLen = aPPDGHd.GetRecEndFilePos();
+ if ( SeekToRec( rStCtrl, DFF_msofbtDggContainer, nPPDGLen ) )
+ nDggContainerOfs = rStCtrl.Tell();
+ }
+ rStCtrl.Seek( nOldPos );
+ }
+ sal_uInt32 nSvxMSDffOLEConvFlags2 = 0;
+
+ const SvtFilterOptions& rBasOpt = SvtFilterOptions::Get();
+ if ( rBasOpt.IsLoadPPointBasicCode() )
+ mnFilterOptions |= 1;
+ if ( rBasOpt.IsMathType2Math() )
+ nSvxMSDffOLEConvFlags2 |= OLE_MATHTYPE_2_STARMATH;
+ if ( rBasOpt.IsWinWord2Writer() )
+ nSvxMSDffOLEConvFlags2 |= OLE_WINWORD_2_STARWRITER;
+ if ( rBasOpt.IsExcel2Calc() )
+ nSvxMSDffOLEConvFlags2 |= OLE_EXCEL_2_STARCALC;
+ if ( rBasOpt.IsPowerPoint2Impress() )
+ nSvxMSDffOLEConvFlags2 |= OLE_POWERPOINT_2_STARIMPRESS;
+
+ InitSvxMSDffManager( nDggContainerOfs, pStData, nSvxMSDffOLEConvFlags2 );
+ SetSvxMSDffSettings( SVXMSDFF_SETTINGS_CROP_BITMAPS
+ | SVXMSDFF_SETTINGS_IMPORT_PPT );
+ SetModel( mpDoc, 576 );
+}
+
+// Dtor
+ImplSdPPTImport::~ImplSdPPTImport()
+{
+ pStData = nullptr;
+ mxPicturesStream.clear();
+}
+
+// Import
+bool ImplSdPPTImport::Import()
+{
+ if ( !m_bOk )
+ return false;
+
+ bool bWasLocked = pSdrModel->isLocked();
+ pSdrModel->setLock(true);
+ const bool bSavedUndoEnabled = pSdrModel->IsUndoEnabled();
+ pSdrModel->EnableUndo(false);
+
+ SdrOutliner& rOutl = mpDoc->GetDrawOutliner();
+ EEControlBits nControlWord = rOutl.GetEditEngine().GetControlWord();
+ nControlWord |= EEControlBits::ULSPACESUMMATION;
+ const_cast<EditEngine&>(rOutl.GetEditEngine()).SetControlWord( nControlWord );
+
+ SdrLayerAdmin& rAdmin = mpDoc->GetLayerAdmin();
+ mnBackgroundObjectsLayerID = rAdmin.GetLayerID( sUNO_LayerName_background_objects );
+
+ ::sd::DrawDocShell* pDocShell = mpDoc->GetDocSh();
+ if ( pDocShell )
+ SeekOle( pDocShell, mnFilterOptions );
+
+ // hyperlinks
+ std::unique_ptr<PropRead> pDInfoSec2(new PropRead( mrStorage, "\005DocumentSummaryInformation" ));
+ if ( pDInfoSec2->IsValid() )
+ {
+ PropItem aPropItem;
+
+ sal_uInt32 nType(0), nPropCount(0);
+
+ pDInfoSec2->Read();
+
+ sal_uInt8 const aPropSetGUID[ 16 ]
+ {
+ 0x02, 0xd5, 0xcd, 0xd5, 0x9c, 0x2e, 0x1b, 0x10, 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae
+ };
+ Section* pSection = const_cast<Section*>(pDInfoSec2->GetSection( aPropSetGUID ));
+ if ( pSection )
+ {
+ if ( pSection->GetProperty( PID_SLIDECOUNT, aPropItem ) )
+ {
+ aPropItem.ReadUInt32( nType );
+ if ( ( nType == VT_I4 ) || ( nType == VT_UI4 ) )
+ {
+ // examine PID_HEADINGPAIR to get the correct entry for PID_DOCPARTS
+ sal_uInt32 nSlideCount(0), nVecCount(0);
+ aPropItem.ReadUInt32( nSlideCount );
+ if ( nSlideCount && pSection->GetProperty( PID_HEADINGPAIR, aPropItem ) )
+ {
+ sal_uInt32 nSlideTitleIndex = 0, nSlideTitleCount = 0;
+
+ OUString aUString;
+
+ aPropItem.ReadUInt32( nType )
+ .ReadUInt32( nVecCount );
+
+ if ( ( nType == ( VT_VARIANT | VT_VECTOR ) ) && ( nVecCount ^ 1 ) )
+ {
+ nVecCount >>= 1;
+ sal_uInt32 nEntryCount = 0;
+ for (sal_uInt32 i = 0; i < nVecCount; ++i)
+ {
+ if ( !aPropItem.Read( aUString, VT_EMPTY, false ) )
+ break;
+ aPropItem.ReadUInt32( nType );
+ if ( ( nType != VT_I4 ) && ( nType != VT_UI4 ) )
+ break;
+ sal_uInt32 nTemp(0);
+ aPropItem.ReadUInt32( nTemp );
+ if ( aUString == "Slide Titles" || aUString == "Folientitel" )
+ {
+ nSlideTitleCount = nTemp;
+ nSlideTitleIndex = nEntryCount;
+ }
+ nEntryCount += nTemp;
+ }
+ }
+ if ( ( nSlideCount == nSlideTitleCount ) && pSection->GetProperty( PID_DOCPARTS, aPropItem ) )
+ {
+ aPropItem.ReadUInt32( nType )
+ .ReadUInt32( nVecCount );
+
+ bool bVecOk = ( ( nVecCount >= (nSlideTitleIndex + nSlideTitleCount) )
+ && ( nType == ( VT_LPSTR | VT_VECTOR ) ) );
+
+ if (bVecOk)
+ {
+ for (sal_uInt32 i = 0; i != nSlideTitleIndex; ++i)
+ {
+ sal_uInt32 nTemp(0);
+ aPropItem.ReadUInt32(nTemp);
+ if (!aPropItem.good())
+ {
+ bVecOk = false;
+ break;
+ }
+ auto nPos = aPropItem.Tell() + nTemp;
+ if (!checkSeek(aPropItem, nPos))
+ {
+ bVecOk = false;
+ break;
+ }
+ }
+ }
+ if (bVecOk)
+ {
+ for (sal_uInt32 i = 0; i < nSlideTitleCount; ++i)
+ {
+ if (!aPropItem.Read(aUString, nType, false))
+ break;
+
+ OUString aString( aUString );
+ if ( aString == "No Slide Title" )
+ aString.clear();
+ else
+ {
+ std::vector<OUString>::const_iterator pIter =
+ std::find(maSlideNameList.begin(),maSlideNameList.end(),aString);
+
+ if (pIter != maSlideNameList.end())
+ aString.clear();
+ }
+ maSlideNameList.push_back( aString );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ sal_uInt8 const aUserPropSetGUID[ 16 ]
+ {
+ 0x05, 0xd5, 0xcd, 0xd5, 0x9c, 0x2e, 0x1b, 0x10, 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae
+ };
+ pSection = const_cast<Section*>(pDInfoSec2->GetSection( aUserPropSetGUID ));
+ if ( pSection )
+ {
+ PropDictionary aDict;
+ pSection->GetDictionary(aDict);
+ if (!aDict.empty())
+ {
+ auto iter = aDict.find( OUString("_PID_HLINKS") );
+
+ if ( iter != aDict.end() )
+ {
+ if ( pSection->GetProperty( iter->second, aPropItem ) )
+ {
+ aPropItem.Seek( STREAM_SEEK_TO_BEGIN );
+ aPropItem.ReadUInt32( nType );
+ if ( nType == VT_BLOB )
+ {
+ sal_uInt32 nPropSize;
+ aPropItem.ReadUInt32( nPropSize )
+ .ReadUInt32( nPropCount );
+
+ if ( ! ( nPropCount % 6 ) )
+ {
+ sal_uInt32 i;
+
+ nPropCount /= 6; // 6 properties per hyperlink
+
+ for ( i = 0; i < nPropCount; i++ )
+ {
+ SdHyperlinkEntry aHyperlink;
+ aHyperlink.nIndex = 0;
+ aPropItem.ReadUInt32( nType );
+ if ( nType != VT_I4 )
+ break;
+ aPropItem.ReadInt32( aHyperlink.nPrivate1 )
+ .ReadUInt32( nType );
+ if ( nType != VT_I4 )
+ break;
+ aPropItem.ReadInt32( aHyperlink.nPrivate2 )
+ .ReadUInt32( nType );
+ if ( nType != VT_I4 )
+ break;
+ aPropItem.ReadInt32( aHyperlink.nPrivate3 )
+ .ReadUInt32( nType );
+ if ( nType != VT_I4 )
+ break;
+ aPropItem.ReadInt32( aHyperlink.nInfo );
+ if ( !aPropItem.Read( aHyperlink.aTarget ) )
+ break;
+
+ // Convert '\\' notation to 'smb://'
+ INetURLObject aUrl( aHyperlink.aTarget, INetProtocol::File );
+ aHyperlink.aTarget = aUrl.GetMainURL( INetURLObject::DecodeMechanism::NONE );
+
+ if ( !aPropItem.Read( aHyperlink.aSubAddress ) )
+ break;
+
+ if ( !aHyperlink.aSubAddress.isEmpty() ) // get the converted subaddress
+ {
+ sal_uInt32 nPageNumber = 0;
+ OUString aString( aHyperlink.aSubAddress );
+ OString aStringAry[ 3 ];
+ size_t nTokenCount = 0;
+ sal_Int32 nPos = 0;
+ do
+ {
+ aStringAry[nTokenCount] =
+ OUStringToOString(o3tl::getToken(aString, 0, ',', nPos ), RTL_TEXTENCODING_UTF8);
+ }
+ while ( ++nTokenCount < SAL_N_ELEMENTS(aStringAry) && nPos >= 0 );
+
+ bool bDocInternalSubAddress = false;
+
+ // first pass, searching for a SlideId
+ for( size_t nToken = 0; nToken < nTokenCount; ++nToken )
+ {
+ if (comphelper::string::isdigitAsciiString(aStringAry[nToken]))
+ {
+ sal_Int32 nNumber = aStringAry[ nToken ].toInt32();
+ if ( nNumber & ~0xff )
+ {
+ PptSlidePersistList* pPageList = GetPageList( PPT_SLIDEPAGE );
+ if ( pPageList )
+ {
+ sal_uInt16 nPage = pPageList->FindPage( nNumber );
+ if ( nPage != PPTSLIDEPERSIST_ENTRY_NOTFOUND )
+ {
+ nPageNumber = nPage;
+ bDocInternalSubAddress = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if ( !bDocInternalSubAddress )
+ { // second pass, searching for a SlideName
+ for ( size_t nToken = 0; nToken < nTokenCount; ++nToken )
+ {
+ OUString aToken(OStringToOUString(aStringAry[nToken], RTL_TEXTENCODING_UTF8));
+ std::vector<OUString>::const_iterator pIter =
+ std::find(maSlideNameList.begin(),maSlideNameList.end(),aToken);
+
+ if (pIter != maSlideNameList.end())
+ {
+ nPageNumber = pIter - maSlideNameList.begin();
+ bDocInternalSubAddress = true;
+ }
+ }
+ }
+ if ( !bDocInternalSubAddress )
+ { // third pass, searching for a slide number
+ for ( size_t nToken = 0; nToken < nTokenCount; ++nToken )
+ {
+ if (comphelper::string::isdigitAsciiString(aStringAry[nToken]))
+ {
+ sal_Int32 nNumber = aStringAry[ nToken ].toInt32();
+ if ( ( nNumber & ~0xff ) == 0 )
+ {
+ nPageNumber = static_cast<sal_uInt32>(nNumber) - 1;
+ bDocInternalSubAddress = true;
+ break;
+ }
+ }
+ }
+ }
+ // if a document internal sub address
+ if ( bDocInternalSubAddress )
+ {
+ if ( nPageNumber < maSlideNameList.size() )
+ aHyperlink.aConvSubString = maSlideNameList[ nPageNumber ];
+ if ( aHyperlink.aConvSubString.isEmpty() )
+ {
+ aHyperlink.aConvSubString = SdResId( STR_PAGE ) + " " + mpDoc->CreatePageNumValue( static_cast<sal_uInt16>(nPageNumber) + 1 );
+ }
+ } else {
+ // if sub address is given but not internal, use it as it is
+ if ( aHyperlink.aConvSubString.isEmpty() )
+ {
+ aHyperlink.aConvSubString = aString;
+ }
+ }
+ }
+ m_aHyperList.push_back( aHyperlink );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ pDInfoSec2.reset();
+
+ if ( mbDocumentFound )
+ {
+ rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 );
+ // read hyperlist / set indices of the entries
+ DffRecordHeader aHyperHd;
+ if ( SeekToRec( rStCtrl, PPT_PST_ExObjList, maDocHd.GetRecEndFilePos(), &aHyperHd ) )
+ {
+ sal_uInt32 nExObjHyperListLen = aHyperHd.GetRecEndFilePos();
+ for (SdHyperlinkEntry & entry : m_aHyperList)
+ {
+ DffRecordHeader aHyperE;
+ if ( !SeekToRec( rStCtrl, PPT_PST_ExHyperlink, nExObjHyperListLen, &aHyperE ) )
+ break;
+ if ( !SeekToRec( rStCtrl, PPT_PST_ExHyperlinkAtom, nExObjHyperListLen ) )
+ break;
+ rStCtrl.SeekRel( 8 );
+ rStCtrl.ReadUInt32( entry.nIndex );
+ if (!aHyperE.SeekToEndOfRecord(rStCtrl))
+ break;
+ }
+
+ if (m_aHyperList.size() == 0)
+ {
+ while(true)
+ {
+
+ DffRecordHeader aHyperE;
+ if (!SeekToRec(rStCtrl, PPT_PST_ExHyperlink, nExObjHyperListLen, &aHyperE))
+ break;
+ if (!SeekToRec(rStCtrl, PPT_PST_ExHyperlinkAtom, nExObjHyperListLen))
+ continue;
+
+ SdHyperlinkEntry aHyperlink;
+
+ OUString aURLText;
+ OUString aURLLink;
+ rStCtrl.SeekRel(8);
+ rStCtrl.ReadUInt32(aHyperlink.nIndex);
+
+ ReadString(aURLText);
+ ReadString(aURLLink);
+ aHyperlink.aTarget = aURLLink;
+ m_aHyperList.push_back(aHyperlink);
+ }
+ }
+ }
+ }
+
+ if (pDocShell)
+ {
+ Size aVisAreaSize;
+ switch ( m_aUserEditAtom.eLastViewType )
+ {
+ case PptViewTypeEnum::Notes:
+ case PptViewTypeEnum::NotesMaster:
+ aVisAreaSize = aDocAtom.GetNotesPageSize();
+ break;
+ default :
+ aVisAreaSize = aDocAtom.GetSlidesPageSize();
+ }
+ Scale( aVisAreaSize );
+ pDocShell->SetVisArea( ::tools::Rectangle( Point(), aVisAreaSize ) );
+ }
+
+ // create master pages:
+
+ std::unique_ptr<SfxProgress> xStbMgr;
+ if (!utl::ConfigManager::IsFuzzing())
+ {
+ xStbMgr.reset(new SfxProgress(pDocShell,
+ SdResId( STR_POWERPOINT_IMPORT),
+ m_pMasterPages->size() +
+ m_pSlidePages->size() + m_pNotePages->size()));
+ }
+
+ sal_uInt32 nImportedPages = 0;
+ {
+ sal_uInt16 nMasterCnt = GetPageCount( PPT_MASTERPAGE );
+
+ for ( sal_uInt16 nMasterNum = 0; nMasterNum < nMasterCnt; nMasterNum++ )
+ {
+ SetPageNum( nMasterNum, PPT_MASTERPAGE );
+ rtl::Reference<SdPage> pPage = static_cast<SdPage*>(MakeBlankPage( true ).get());
+ if ( pPage )
+ {
+ bool bNotesMaster = (*GetPageList( m_eCurrentPageKind ) )[ m_nCurrentPageNum ].bNotesMaster;
+ bool bStarDrawFiller = (*GetPageList( m_eCurrentPageKind ) )[ m_nCurrentPageNum ].bStarDrawFiller;
+
+ PageKind ePgKind = bNotesMaster ? PageKind::Notes : PageKind::Standard;
+ bool bHandout = (*GetPageList( m_eCurrentPageKind ) )[ m_nCurrentPageNum ].bHandoutMaster;
+ if ( bHandout )
+ ePgKind = PageKind::Handout;
+
+ pPage->SetPageKind( ePgKind );
+ pSdrModel->InsertMasterPage( pPage.get() );
+ if ( bNotesMaster && bStarDrawFiller )
+ pPage->SetAutoLayout( AUTOLAYOUT_NOTES, true );
+ if ( nMasterNum )
+ {
+ std::optional< sal_Int16 > oStartNumbering;
+ SfxStyleSheet* pSheet;
+ if ( nMasterNum == 1 )
+ {
+ // standardsheet
+ pSheet = static_cast<SfxStyleSheet*>(mpDoc->GetStyleSheetPool()->Find(SdResId(STR_STANDARD_STYLESHEET_NAME), SfxStyleFamily::Para ));
+ if ( pSheet )
+ {
+ SfxItemSet& rItemSet = pSheet->GetItemSet();
+ PPTParagraphObj aParagraph( *m_pPPTStyleSheet, TSS_Type::TextInShape, 0 );
+ PPTPortionObj aPortion( *m_pPPTStyleSheet, TSS_Type::TextInShape, 0 );
+ aParagraph.AppendPortion( aPortion );
+ aParagraph.ApplyTo( rItemSet, oStartNumbering, static_cast<SdrPowerPointImport&>(*this), TSS_Type::Unknown );
+ aPortion.ApplyTo( rItemSet, static_cast<SdrPowerPointImport&>(*this), TSS_Type::Unknown );
+ }
+ }
+
+ // PSEUDO
+ pSheet = static_cast<SfxStyleSheet*>(mpDoc->GetStyleSheetPool()->Find(SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS), SfxStyleFamily::Pseudo ));
+ if ( pSheet )
+ {
+ SfxItemSet& rItemSet = pSheet->GetItemSet();
+ PPTParagraphObj aParagraph( *m_pPPTStyleSheet, TSS_Type::TextInShape, 0 );
+ PPTPortionObj aPortion( *m_pPPTStyleSheet, TSS_Type::TextInShape, 0 );
+ aParagraph.AppendPortion( aPortion );
+ aParagraph.ApplyTo( rItemSet, oStartNumbering, static_cast<SdrPowerPointImport&>(*this), TSS_Type::Unknown );
+ aPortion.ApplyTo( rItemSet, static_cast<SdrPowerPointImport&>(*this), TSS_Type::Unknown );
+ }
+
+ // create layoutstylesheets, set layoutname and stylesheet
+ // (only on standard and not pages)
+
+ OUString aLayoutName( SdResId( STR_LAYOUT_DEFAULT_NAME ) );
+ if ( nMasterNum > 2 )
+ {
+ if ( ePgKind == PageKind::Standard )
+ { // standard page: create new presentation layout
+ aLayoutName = SdResId( STR_LAYOUT_DEFAULT_TITLE_NAME ) +
+ OUString::number( static_cast<sal_Int32>( ( nMasterNum + 1 ) / 2 - 1 ) );
+ static_cast<SdStyleSheetPool*>( mpDoc->GetStyleSheetPool() )->CreateLayoutStyleSheets( aLayoutName );
+ }
+ else // note page: use presentation layout of standard page
+ aLayoutName = static_cast<SdPage*>( mpDoc->GetMasterPage( nMasterNum - 1 ) )->GetName();
+ }
+ pPage->SetName( aLayoutName );
+ aLayoutName += SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE;
+ pPage->SetLayoutName( aLayoutName );
+
+ // set stylesheets
+ if ( pPage->GetPageKind() == PageKind::Standard )
+ {
+ TSS_Type nTitleInstance = TSS_Type::PageTitle;
+ TSS_Type nOutlinerInstance = TSS_Type::Body;
+ const PptSlideLayoutAtom* pSlideLayout = GetSlideLayoutAtom();
+ bool bSwapStyleSheet = pSlideLayout->eLayout == PptSlideLayout::TITLEMASTERSLIDE;
+ if ( bSwapStyleSheet )
+ {
+ nTitleInstance = TSS_Type::Title;
+ nOutlinerInstance = TSS_Type::Subtitle;
+ }
+
+ // titlestylesheet
+ pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Title );
+ if ( pSheet )
+ {
+ SfxItemSet& rItemSet = pSheet->GetItemSet();
+ PPTParagraphObj aParagraph( *m_pPPTStyleSheet, nTitleInstance, 0 );
+ PPTPortionObj aPortion( *m_pPPTStyleSheet, nTitleInstance, 0 );
+ aParagraph.AppendPortion( aPortion );
+ aParagraph.ApplyTo( rItemSet, oStartNumbering, static_cast<SdrPowerPointImport&>(*this), TSS_Type::Unknown );
+ aPortion.ApplyTo( rItemSet, static_cast<SdrPowerPointImport&>(*this), TSS_Type::Unknown );
+ }
+
+ // outlinerstylesheet
+ sal_uInt16 nLevel;
+ PPTParagraphObj* pParagraphs[ 9 ];
+
+ for ( nLevel = 0; nLevel < 9; nLevel++ )
+ {
+ OUString aName = pPage->GetLayoutName() +
+ " " + OUString::number( nLevel + 1 );
+ SfxStyleSheet* pOutlineSheet = static_cast<SfxStyleSheet*>( mpDoc->GetStyleSheetPool()->Find( aName, SfxStyleFamily::Page ) );
+ DBG_ASSERT( pOutlineSheet, "Template for outline object not found" );
+ if ( pOutlineSheet )
+ {
+ pParagraphs[ nLevel ] = new PPTParagraphObj( *m_pPPTStyleSheet, nOutlinerInstance, nLevel );
+ SfxItemSet& rItemSet = pOutlineSheet->GetItemSet();
+ PPTPortionObj aPortion( *m_pPPTStyleSheet, nOutlinerInstance, nLevel );
+ pParagraphs[ nLevel ]->AppendPortion( aPortion );
+ pParagraphs[ nLevel ]->ApplyTo( rItemSet, oStartNumbering, static_cast<SdrPowerPointImport&>(*this), TSS_Type::Unknown );
+ aPortion.ApplyTo( rItemSet, static_cast<SdrPowerPointImport&>(*this), TSS_Type::Unknown );
+ }
+ else
+ pParagraphs[ nLevel ] = nullptr;
+ }
+ for ( nLevel = 0; nLevel < 9; delete pParagraphs[ nLevel++ ] ) ;
+
+ // subtitle stylesheet
+ pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Text );
+ if ( pSheet )
+ {
+ SfxItemSet& rItemSet = pSheet->GetItemSet();
+ PPTParagraphObj aParagraph( *m_pPPTStyleSheet, TSS_Type::Subtitle, 0 );
+ PPTPortionObj aPortion( *m_pPPTStyleSheet, TSS_Type::Subtitle, 0 );
+ aParagraph.AppendPortion( aPortion );
+ aParagraph.ApplyTo( rItemSet, oStartNumbering, static_cast<SdrPowerPointImport&>(*this), TSS_Type::Unknown );
+ aPortion.ApplyTo( rItemSet, static_cast<SdrPowerPointImport&>(*this), TSS_Type::Unknown );
+ }
+ }
+ else if ( ePgKind == PageKind::Notes )
+ {
+ pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Notes );
+ if ( pSheet )
+ {
+ SfxItemSet& rItemSet = pSheet->GetItemSet();
+ PPTParagraphObj aParagraph( *m_pPPTStyleSheet, TSS_Type::Notes, 0 );
+ PPTPortionObj aPortion( *m_pPPTStyleSheet, TSS_Type::Notes, 0 );
+ aParagraph.AppendPortion( aPortion );
+ aParagraph.ApplyTo( rItemSet, oStartNumbering, static_cast<SdrPowerPointImport&>(*this), TSS_Type::Unknown );
+ aPortion.ApplyTo( rItemSet, static_cast<SdrPowerPointImport&>(*this), TSS_Type::Unknown );
+ }
+ }
+ }
+ }
+ }
+ }
+ for (sal_uInt16 i = 0; i < mpDoc->GetMasterPageCount(); ++i)
+ {
+ SdPage *const pMPage(static_cast<SdPage*>(mpDoc->GetMasterPage(i)));
+ if (pMPage == nullptr)
+ break;
+ SetPageNum( i, PPT_MASTERPAGE );
+
+ // importing master page objects
+ PptSlidePersistList* pList = GetPageList( m_eCurrentPageKind );
+ PptSlidePersistEntry* pPersist = ( pList && ( m_nCurrentPageNum < pList->size() ) )
+ ? &(*pList)[ m_nCurrentPageNum ] : nullptr;
+ if ( pPersist )
+ {
+ if ( pPersist->bStarDrawFiller && pPersist->bNotesMaster && ( m_nCurrentPageNum > 2 ) && ( ( m_nCurrentPageNum & 1 ) == 0 ) )
+ {
+ pSdrModel->DeleteMasterPage( m_nCurrentPageNum );
+ SdPage* pMasterPage2 = static_cast<SdPage*>(pSdrModel->GetMasterPage( 2 ));
+ rtl::Reference<SdPage> pNotesClone = static_cast<SdPage*>(pMasterPage2->CloneSdrPage(*pSdrModel).get());
+ pSdrModel->InsertMasterPage( pNotesClone.get(), m_nCurrentPageNum );
+ if ( pNotesClone )
+ {
+ OUString aLayoutName( static_cast<SdPage*>(pSdrModel->GetMasterPage( m_nCurrentPageNum - 1 ))->GetLayoutName() );
+ pNotesClone->SetPresentationLayout( aLayoutName, false, false );
+ pNotesClone->SetLayoutName( aLayoutName );
+ }
+ }
+ else if ( !pPersist->bStarDrawFiller )
+ {
+ PptSlidePersistEntry* pE = pPersist;
+ while( ( pE->aSlideAtom.nFlags & 4 ) && pE->aSlideAtom.nMasterId )
+ {
+ auto nOrigMasterId = pE->aSlideAtom.nMasterId;
+ sal_uInt16 nNextMaster = m_pMasterPages->FindPage(nOrigMasterId);
+ if ( nNextMaster == PPTSLIDEPERSIST_ENTRY_NOTFOUND )
+ break;
+ else
+ pE = &(*pList)[ nNextMaster ];
+ if (pE->aSlideAtom.nMasterId == nOrigMasterId)
+ {
+ SAL_WARN("filter.ms", "loop in atom chain");
+ break;
+ }
+ }
+ SdrObject* pObj = ImportPageBackgroundObject( *pMPage, pE->nBackgroundOffset ); // import background
+ if ( pObj )
+ pMPage->NbcInsertObject( pObj );
+
+ bool bNewAnimationsUsed = false;
+ ProcessData aProcessData( (*pList)[ m_nCurrentPageNum ], SdPageCapsule(pMPage) );
+ sal_uInt32 nOldFPos = rStCtrl.Tell();
+ DffRecordHeader aPageHd;
+ if ( SeekToCurrentPage( &aPageHd ) )
+ {
+ auto nEndRecPos = SanitizeEndPos(rStCtrl, aPageHd.GetRecEndFilePos());
+ while( ( rStCtrl.GetError() == ERRCODE_NONE ) && ( rStCtrl.Tell() < nEndRecPos ) )
+ {
+ DffRecordHeader aHd;
+ if (!ReadDffRecordHeader( rStCtrl, aHd ))
+ break;
+ switch( aHd.nRecType )
+ {
+ case PPT_PST_PPDrawing :
+ {
+ aHd.SeekToBegOfRecord( rStCtrl );
+ DffRecordHeader aPPDrawHd;
+ if ( SeekToRec( rStCtrl, PPT_PST_PPDrawing, aHd.GetRecEndFilePos(), &aPPDrawHd ) )
+ {
+ sal_uInt32 nPPDrawEnd = aPPDrawHd.GetRecEndFilePos();
+ DffRecordHeader aEscherF002Hd;
+ if ( SeekToRec( rStCtrl, DFF_msofbtDgContainer, nPPDrawEnd, &aEscherF002Hd ) )
+ {
+ sal_uInt32 nEscherF002End = aEscherF002Hd.GetRecEndFilePos();
+ DffRecordHeader aEscherObjListHd;
+ if ( SeekToRec( rStCtrl, DFF_msofbtSpgrContainer, nEscherF002End, &aEscherObjListHd ) )
+ {
+ sal_uInt32 nObjCount = 0;
+ auto nListEndRecPos = SanitizeEndPos(rStCtrl, aEscherObjListHd.GetRecEndFilePos());
+ while( ( rStCtrl.GetError() == ERRCODE_NONE ) && ( rStCtrl.Tell() < nListEndRecPos ) )
+ {
+ DffRecordHeader aHd2;
+ ReadDffRecordHeader( rStCtrl, aHd2 );
+ if ( ( aHd2.nRecType == DFF_msofbtSpContainer ) || ( aHd2.nRecType == DFF_msofbtSpgrContainer ) )
+ {
+ if ( nObjCount++ ) // skipping the first object
+ {
+ ::tools::Rectangle aEmpty;
+ if (!aHd2.SeekToBegOfRecord(rStCtrl))
+ break;
+ SdrObject* pImpObj = ImportObj( rStCtrl, aProcessData, aEmpty, aEmpty, /*nCalledByGroup*/0, /*pShapeId*/ nullptr );
+ if ( pImpObj )
+ {
+ pImpObj->SetLayer( mnBackgroundObjectsLayerID );
+ pMPage->NbcInsertObject( pImpObj );
+ }
+ }
+ }
+ if (!aHd2.SeekToEndOfRecord(rStCtrl))
+ break;
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ case PPT_PST_ProgTags :
+ {
+ DffRecordHeader aProgTagHd;
+ if ( SeekToContentOfProgTag( 10, rStCtrl, aPageHd, aProgTagHd ) )
+ {
+ auto nTagEndRecPos = SanitizeEndPos(rStCtrl, aProgTagHd.GetRecEndFilePos());
+ while ( ( rStCtrl.GetError() == ERRCODE_NONE ) && ( rStCtrl.Tell() < nTagEndRecPos ) )
+ {
+ DffRecordHeader aProgTagContentHd;
+ ReadDffRecordHeader( rStCtrl, aProgTagContentHd );
+ switch( aProgTagContentHd.nRecType )
+ {
+ case DFF_msofbtAnimGroup :
+ {
+ css::uno::Reference< css::drawing::XDrawPage > xPage( pMPage->getUnoPage(), css::uno::UNO_QUERY );
+ ppt::AnimationImporter aImporter( this, rStCtrl );
+ bNewAnimationsUsed = aImporter.import( xPage, aProgTagContentHd ) > 0;
+ }
+ break;
+ }
+ if (!aProgTagContentHd.SeekToEndOfRecord(rStCtrl))
+ break;
+ }
+ }
+ }
+ break;
+ }
+ bool bSuccess = aHd.SeekToEndOfRecord(rStCtrl);
+ if (!bSuccess)
+ {
+ SAL_WARN("filter.ms", "Could not seek to end of record");
+ break;
+ }
+ }
+ }
+ rStCtrl.Seek( nOldFPos );
+ ImportPageEffect( pMPage, bNewAnimationsUsed );
+
+ // background object
+ pObj = pMPage->GetObj( 0 );
+ if ( pObj && pObj->GetObjIdentifier() == SdrObjKind::Rectangle )
+ {
+ if ( pMPage->GetPageKind() == PageKind::Standard )
+ {
+ // transform data from imported background object to new form
+ // and delete the object. It was used as container to transport
+ // the attributes of the MasterPage background fill
+ SfxStyleSheet* pSheet = pMPage->GetStyleSheetForMasterPageBackground();
+
+ if(pSheet)
+ {
+ // if we have a StyleSheet (for Masterpages), set attributes there and use it
+ pSheet->GetItemSet().ClearItem();
+ pSheet->GetItemSet().Put(pObj->GetMergedItemSet());
+ pMPage->getSdrPageProperties().ClearItem();
+ pMPage->getSdrPageProperties().SetStyleSheet(pSheet);
+ }
+ else
+ {
+ // without StyleSheet, set attributes directly. This
+ // should not be done at all and is an error (will be asserted by SdrPage)
+ pMPage->getSdrPageProperties().ClearItem();
+ pMPage->getSdrPageProperties().PutItemSet(pObj->GetMergedItemSet());
+ }
+
+ pMPage->RemoveObject(pObj->GetOrdNum());
+ SdrObject::Free(pObj);
+ }
+ }
+ }
+ }
+ if (xStbMgr)
+ xStbMgr->SetState( nImportedPages++ );
+ }
+
+ // importing slide pages
+ {
+ sal_uInt32 nOldFPos = rStCtrl.Tell();
+ PptPageKind ePageKind = m_eCurrentPageKind;
+ sal_uInt16 nPageNum = m_nCurrentPageNum;
+
+ rtl::Reference<SdPage> pHandoutPage = static_cast<SdPage*>(MakeBlankPage( false ).get());
+ pHandoutPage->SetPageKind( PageKind::Handout );
+ pSdrModel->InsertPage( pHandoutPage.get() );
+
+ sal_uInt16 nPageCnt = GetPageCount();
+ if ( nPageCnt )
+ {
+ for ( sal_uInt16 nPage = 0; nPage < nPageCnt; nPage++ )
+ {
+ mePresChange = PresChange::SemiAuto;
+ SetPageNum( nPage );
+ rtl::Reference<SdPage> pPage = static_cast<SdPage*>(MakeBlankPage( false ).get());
+ PptSlidePersistEntry* pMasterPersist = nullptr;
+ if ( HasMasterPage( nPage ) ) // try to get the LayoutName from the masterpage
+ {
+ sal_uInt16 nMasterNum = GetMasterPageIndex( m_nCurrentPageNum, m_eCurrentPageKind );
+ pPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nMasterNum));
+ PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE );
+ if ( pPageList && nMasterNum < pPageList->size() )
+ pMasterPersist = &(*pPageList)[ nMasterNum ];
+ pPage->SetLayoutName(static_cast<SdPage&>(pPage->TRG_GetMasterPage()).GetLayoutName());
+ }
+ pPage->SetPageKind( PageKind::Standard );
+ pSdrModel->InsertPage( pPage.get() ); // SJ: #i29625# because of form controls, the
+ ImportPage( pPage.get(), pMasterPersist ); // page must be inserted before importing
+ SetHeaderFooterPageSettings( pPage.get(), pMasterPersist );
+ // CWS preseng01: pPage->SetPageKind( PageKind::Standard );
+
+ DffRecordHeader aPageHd;
+ if ( SeekToCurrentPage( &aPageHd ) )
+ {
+ bool bNewAnimationsUsed = false;
+
+ aPageHd.SeekToContent( rStCtrl );
+ auto nEndRecPos = SanitizeEndPos(rStCtrl, aPageHd.GetRecEndFilePos());
+ while ( ( rStCtrl.GetError() == ERRCODE_NONE ) && ( rStCtrl.Tell() < nEndRecPos ) )
+ {
+ DffRecordHeader aHd;
+ ReadDffRecordHeader( rStCtrl, aHd );
+ switch ( aHd.nRecType )
+ {
+ case PPT_PST_ProgTags :
+ {
+ DffRecordHeader aProgTagHd;
+ if ( SeekToContentOfProgTag( 10, rStCtrl, aPageHd, aProgTagHd ) )
+ {
+ auto nHdEndRecPos = SanitizeEndPos(rStCtrl, aProgTagHd.GetRecEndFilePos());
+ while ( ( rStCtrl.GetError() == ERRCODE_NONE ) && ( rStCtrl.Tell() < nHdEndRecPos ) )
+ {
+ DffRecordHeader aProgTagContentHd;
+ ReadDffRecordHeader( rStCtrl, aProgTagContentHd );
+ switch( aProgTagContentHd.nRecType )
+ {
+ case DFF_msofbtAnimGroup :
+ {
+ css::uno::Reference< css::drawing::XDrawPage > xPage( pPage->getUnoPage(), css::uno::UNO_QUERY );
+ ppt::AnimationImporter aImporter( this, rStCtrl );
+ bNewAnimationsUsed = aImporter.import( xPage, aProgTagContentHd ) > 0;
+ }
+ break;
+
+ case PPT_PST_HashCodeAtom : // ???
+ break;
+
+ case PPT_PST_SlideTime10Atom : // ??? don't know, this atom is always 8 bytes big
+ break; // and is appearing in nearly every l10 progtag
+ }
+ if (!aProgTagContentHd.SeekToEndOfRecord(rStCtrl))
+ break;
+ }
+ }
+ }
+ break;
+
+ case PPT_PST_HeadersFooters :
+ case PPT_PST_PPDrawing :
+ default:
+ break;
+ }
+
+ if (!aHd.SeekToEndOfRecord(rStCtrl))
+ break;
+ }
+ ImportPageEffect( pPage.get(), bNewAnimationsUsed );
+ }
+
+ // creating the corresponding note page
+ m_eCurrentPageKind = PPT_NOTEPAGE;
+ rtl::Reference<SdPage> pNotesPage = static_cast<SdPage*>(MakeBlankPage( false ).get());
+ sal_uInt16 nNotesMasterNum = GetMasterPageIndex( nPage ) + 1;
+ sal_uInt32 nNotesPageId = GetNotesPageId( nPage );
+ if ( nNotesPageId )
+ {
+ nImportedPages++;
+ sal_uInt16 nNotesPageIndex = m_pNotePages->FindPage( nNotesPageId );
+ if ( nNotesPageIndex == PPTSLIDEPERSIST_ENTRY_NOTFOUND )
+ nNotesPageIndex = 0;
+ SetPageNum( nNotesPageIndex, PPT_NOTEPAGE );
+ PptSlidePersistEntry* pMasterPersist2 = nullptr;
+ if ( HasMasterPage( nNotesPageIndex, PPT_NOTEPAGE ) ) // try to get the LayoutName from the masterpage
+ {
+ pNotesPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nNotesMasterNum));
+ PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE );
+ if ( pPageList && nNotesMasterNum < pPageList->size() )
+ pMasterPersist2 = &(*pPageList)[ nNotesMasterNum ];
+ pNotesPage->SetLayoutName( static_cast<SdPage&>(pNotesPage->TRG_GetMasterPage()).GetLayoutName() );
+ }
+ pNotesPage->SetPageKind( PageKind::Notes );
+ pNotesPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nNotesMasterNum));
+ pSdrModel->InsertPage( pNotesPage.get() ); // SJ: #i29625# because of form controls, the
+ ImportPage( pNotesPage.get(), pMasterPersist2 ); // page must be inserted before importing
+ SetHeaderFooterPageSettings( pNotesPage.get(), pMasterPersist2 );
+ pNotesPage->SetAutoLayout( AUTOLAYOUT_NOTES );
+ }
+ else
+ {
+ pNotesPage->SetPageKind( PageKind::Notes );
+ pNotesPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nNotesMasterNum));
+ pNotesPage->SetAutoLayout( AUTOLAYOUT_NOTES, true );
+ pSdrModel->InsertPage( pNotesPage.get() );
+ SdrObject* pPageObj = pNotesPage->GetPresObj( PresObjKind::Page );
+ if ( pPageObj )
+ static_cast<SdrPageObj*>(pPageObj)->SetReferencedPage(pSdrModel->GetPage(( nPage << 1 ) + 1));
+ }
+
+ if (xStbMgr)
+ xStbMgr->SetState( nImportedPages++ );
+ }
+ }
+ else
+ {
+ // that can happen by document templates
+ m_eCurrentPageKind = PPT_SLIDEPAGE;
+ rtl::Reference<SdPage> pPage = static_cast<SdPage*>(MakeBlankPage( false ).get());
+ pSdrModel->InsertPage( pPage.get() );
+
+ // #i37397#, trying to set the title master for the first page
+ sal_uInt16 nMaster, nMasterCount = pSdrModel->GetMasterPageCount();
+ SdPage* pFoundMaster = nullptr;
+ for ( nMaster = 1; nMaster < nMasterCount; nMaster++ )
+ {
+ SdPage* pMaster = static_cast<SdPage*>( pSdrModel->GetMasterPage( nMaster ) );
+ if ( pMaster->GetPageKind() == PageKind::Standard )
+ {
+ SetPageNum( nMaster, PPT_MASTERPAGE );
+ if ( !pFoundMaster )
+ pFoundMaster = pMaster;
+ else if ( GetSlideLayoutAtom()->eLayout == PptSlideLayout::TITLEMASTERSLIDE )
+ pFoundMaster = pMaster;
+ if ( GetSlideLayoutAtom()->eLayout == PptSlideLayout::TITLEMASTERSLIDE )
+ break;
+ }
+ }
+ if ( pFoundMaster )
+ {
+ pPage->TRG_SetMasterPage( *pFoundMaster );
+ pPage->SetLayoutName( pFoundMaster->GetLayoutName() );
+ }
+ pPage->SetAutoLayout( AUTOLAYOUT_TITLE, true, true );
+
+ m_eCurrentPageKind = PPT_NOTEPAGE;
+ rtl::Reference<SdrPage> pNPage = MakeBlankPage( false );
+ pSdrModel->InsertPage( pNPage.get() );
+ }
+ SetPageNum( nPageNum, ePageKind );
+ rStCtrl.Seek( nOldFPos );
+ }
+
+ // create handout and note pages
+ m_bOk = mpDoc->CreateMissingNotesAndHandoutPages();
+ if ( m_bOk )
+ {
+ for ( sal_uInt16 i = 0; i < mpDoc->GetSdPageCount( PageKind::Standard ); i++ )
+ {
+
+ // set AutoLayout
+ SetPageNum( i );
+ SdPage* pPage = mpDoc->GetSdPage( i, PageKind::Standard );
+ AutoLayout eAutoLayout = AUTOLAYOUT_NONE;
+ const PptSlideLayoutAtom* pSlideLayout = GetSlideLayoutAtom();
+ if ( pSlideLayout )
+ {
+ switch ( pSlideLayout->eLayout ) // presentation layout for standard pages
+ {
+ case PptSlideLayout::TITLEANDBODYSLIDE :
+ {
+ eAutoLayout = AUTOLAYOUT_TITLE_CONTENT;
+ PptPlaceholder nID1 = pSlideLayout->aPlaceholderId[ 1 ];
+ switch ( nID1 )
+ {
+ case PptPlaceholder::BODY :
+ eAutoLayout = AUTOLAYOUT_TITLE_CONTENT;
+ break;
+ case PptPlaceholder::TABLE :
+ eAutoLayout = AUTOLAYOUT_TAB;
+ break;
+ case PptPlaceholder::ORGANISZATIONCHART :
+ eAutoLayout = AUTOLAYOUT_ORG;
+ break;
+ case PptPlaceholder::GRAPH :
+ eAutoLayout = AUTOLAYOUT_CHART;
+ break;
+ case PptPlaceholder::OBJECT :
+ eAutoLayout = AUTOLAYOUT_OBJ;
+ break;
+ case PptPlaceholder::VERTICALTEXTBODY :
+ eAutoLayout = AUTOLAYOUT_TITLE_VCONTENT;
+ break;
+ default: break;
+ }
+ }
+ break;
+
+ case PptSlideLayout::TWOCOLUMNSANDTITLE :
+ {
+ eAutoLayout = AUTOLAYOUT_TITLE_2CONTENT;
+ PptPlaceholder nID1 = pSlideLayout->aPlaceholderId[ 1 ];
+ PptPlaceholder nID2 = pSlideLayout->aPlaceholderId[ 2 ];
+ if ( nID1 == PptPlaceholder::BODY && nID2 == PptPlaceholder::GRAPH )
+ eAutoLayout = AUTOLAYOUT_TEXTCHART;
+ else if ( nID1 == PptPlaceholder::GRAPH && nID2 == PptPlaceholder::BODY )
+ eAutoLayout = AUTOLAYOUT_CHARTTEXT;
+ else if ( nID1 == PptPlaceholder::BODY && nID2 == PptPlaceholder::CLIPART )
+ eAutoLayout = AUTOLAYOUT_TEXTCLIP;
+ else if ( nID1 == PptPlaceholder::CLIPART && nID2 == PptPlaceholder::BODY )
+ eAutoLayout = AUTOLAYOUT_CLIPTEXT;
+ else if ( nID1 == PptPlaceholder::CLIPART && nID2 == PptPlaceholder::VERTICALTEXTBODY )
+ eAutoLayout = AUTOLAYOUT_TITLE_2VTEXT;
+ else if ( ( nID1 == PptPlaceholder::BODY )
+ && ( ( nID2 == PptPlaceholder::OBJECT ) || ( nID2 == PptPlaceholder::MEDIACLIP ) ) )
+ eAutoLayout = AUTOLAYOUT_TEXTOBJ;
+ else if ( ( nID2 == PptPlaceholder::BODY )
+ && ( ( nID1 == PptPlaceholder::OBJECT ) || ( nID1 == PptPlaceholder::MEDIACLIP ) ) )
+ eAutoLayout = AUTOLAYOUT_OBJTEXT;
+ else if ( ( nID1 == PptPlaceholder::OBJECT ) && ( nID2 == PptPlaceholder::OBJECT ) )
+ eAutoLayout = AUTOLAYOUT_OBJ;
+ }
+ break;
+
+ case PptSlideLayout::TWOROWSANDTITLE :
+ {
+ eAutoLayout = AUTOLAYOUT_TITLE_2CONTENT;
+ PptPlaceholder nID1 = pSlideLayout->aPlaceholderId[ 1 ];
+ PptPlaceholder nID2 = pSlideLayout->aPlaceholderId[ 2 ];
+ if ( nID1 == PptPlaceholder::BODY && nID2 == PptPlaceholder::OBJECT )
+ eAutoLayout = AUTOLAYOUT_TEXTOVEROBJ;
+ else if ( nID1 == PptPlaceholder::OBJECT && nID2 == PptPlaceholder::BODY )
+ eAutoLayout = AUTOLAYOUT_TITLE_CONTENT_OVER_CONTENT;
+ }
+ break;
+
+ case PptSlideLayout::TITLESLIDE :
+ eAutoLayout = AUTOLAYOUT_TITLE;
+ break;
+ case PptSlideLayout::ONLYTITLE :
+ eAutoLayout = AUTOLAYOUT_TITLE_ONLY;
+ break;
+ case PptSlideLayout::RIGHTCOLUMN2ROWS :
+ eAutoLayout = AUTOLAYOUT_TITLE_CONTENT_2CONTENT;
+ break;
+ case PptSlideLayout::LEFTCOLUMN2ROWS :
+ eAutoLayout = AUTOLAYOUT_TITLE_2CONTENT_CONTENT;
+ break;
+ case PptSlideLayout::TOPROW2COLUMN :
+ eAutoLayout = AUTOLAYOUT_TITLE_2CONTENT_OVER_CONTENT;
+ break;
+ case PptSlideLayout::FOUROBJECTS :
+ eAutoLayout = AUTOLAYOUT_TITLE_4CONTENT;
+ break;
+ case PptSlideLayout::BIGOBJECT :
+ eAutoLayout = AUTOLAYOUT_OBJ;
+ break;
+ case PptSlideLayout::TITLERIGHTBODYLEFT :
+ eAutoLayout = AUTOLAYOUT_VTITLE_VCONTENT;
+ break;
+ case PptSlideLayout::TITLERIGHT2BODIESLEFT :
+ eAutoLayout = AUTOLAYOUT_VTITLE_VCONTENT_OVER_VCONTENT;
+ break;
+
+ case PptSlideLayout::BOTTOMROW2COLUMNS :
+ case PptSlideLayout::BLANKSLIDE :
+ case PptSlideLayout::MASTERSLIDE : // layout of the standard and title master page
+ case PptSlideLayout::TITLEMASTERSLIDE :
+ case PptSlideLayout::MASTERNOTES : // layout of the note master page
+ case PptSlideLayout::NOTESTITLEBODY : // presentation layout for note pages
+ case PptSlideLayout::HANDOUTLAYOUT : // presentation layout for handout
+ eAutoLayout = AUTOLAYOUT_NONE;
+ break;
+ }
+ if ( eAutoLayout != AUTOLAYOUT_NONE )
+ pPage->SetAutoLayout( eAutoLayout );
+ }
+ }
+
+ // handout master page: auto layout
+ SdPage* pHandoutMPage = mpDoc->GetMasterSdPage( 0, PageKind::Handout );
+ pHandoutMPage->SetAutoLayout( AUTOLAYOUT_HANDOUT6, true, true );
+ }
+
+ sal_uInt32 nSlideCount = GetPageCount();
+ for ( sal_uInt32 i = 0; ( i < nSlideCount) && ( i < maSlideNameList.size() ); i++ )
+ {
+ SdPage* pPage = mpDoc->GetSdPage( i, PageKind::Standard );
+ OUString &aName = maSlideNameList[ i ];
+ if ( pPage )
+ {
+ if ( !aName.isEmpty() )
+ pPage->SetName( aName );
+ else
+ aName = pPage->GetName();
+ }
+ }
+ if ( mbDocumentFound )
+ {
+ mpDoc->SetSummationOfParagraphs();
+ if ( pDocShell )
+ {
+ ::sd::FrameView* pFrameView = mpDoc->GetFrameView( 0 );
+ if ( !pFrameView )
+ {
+ std::vector<std::unique_ptr<sd::FrameView>> &rViews = mpDoc->GetFrameViewList();
+ pFrameView = new ::sd::FrameView( mpDoc );
+ rViews.push_back( std::unique_ptr<sd::FrameView>(pFrameView) );
+ }
+ sal_uInt16 nSelectedPage = 0;
+ PageKind ePageKind = PageKind::Standard;
+ EditMode eEditMode = EditMode::Page;
+
+ switch ( m_aUserEditAtom.eLastViewType )
+ {
+ case PptViewTypeEnum::Outline:
+ {
+ SfxItemSet* pSet = mrMed.GetItemSet();
+ if ( pSet )
+ pSet->Put( SfxUInt16Item( SID_VIEW_ID, 3 ) );
+ }
+ break;
+ case PptViewTypeEnum::SlideSorter:
+ {
+ SfxItemSet* pSet = mrMed.GetItemSet();
+ if ( pSet )
+ pSet->Put( SfxUInt16Item( SID_VIEW_ID, 2 ) );
+ }
+ break;
+ case PptViewTypeEnum::TitleMaster:
+ nSelectedPage = 1;
+ [[fallthrough]];
+ case PptViewTypeEnum::SlideMaster:
+ {
+ ePageKind = PageKind::Standard;
+ eEditMode = EditMode::MasterPage;
+ }
+ break;
+ case PptViewTypeEnum::NotesMaster:
+ eEditMode = EditMode::MasterPage;
+ [[fallthrough]];
+ case PptViewTypeEnum::Notes:
+ ePageKind = PageKind::Notes;
+ break;
+ case PptViewTypeEnum::Handout:
+ ePageKind = PageKind::Handout;
+ break;
+ default :
+ case PptViewTypeEnum::Slide:
+ break;
+ }
+ pFrameView->SetPageKind( ePageKind );
+ pFrameView->SetSelectedPage( nSelectedPage );
+ pFrameView->SetViewShEditMode( eEditMode );
+ }
+ DffRecordHeader aCustomShowHeader;
+ // read and set custom show
+ rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 );
+ if ( SeekToRec( rStCtrl, PPT_PST_NamedShows, maDocHd.GetRecEndFilePos(), &aCustomShowHeader ) )
+ {
+ DffRecordHeader aCuHeader;
+ while( SeekToRec( rStCtrl, PPT_PST_NamedShow, aCustomShowHeader.GetRecEndFilePos(), &aCuHeader ) )
+ {
+ DffRecordHeader aContent;
+ if ( SeekToRec( rStCtrl, PPT_PST_CString, aCuHeader.GetRecEndFilePos(), &aContent ) )
+ {
+ OUString aCuShow;
+ aContent.SeekToBegOfRecord( rStCtrl );
+ if ( ReadString( aCuShow ) )
+ {
+ if ( SeekToRec( rStCtrl, PPT_PST_NamedShowSlides, aCuHeader.GetRecEndFilePos(), &aContent ) )
+ {
+ PptSlidePersistList* pPageList = GetPageList( PPT_SLIDEPAGE );
+ const auto nRemainingSize = rStCtrl.remainingSize();
+ sal_uInt32 nBCount = aContent.nRecLen;
+ if (nBCount > nRemainingSize)
+ {
+ SAL_WARN("filter.ms", "page number data len longer than remaining stream size");
+ nBCount = nRemainingSize;
+ }
+ sal_uInt32 nSCount = nBCount >> 2;
+
+ if ( pPageList && nSCount )
+ {
+ SdCustomShowList* pList = mpDoc->GetCustomShowList( true );
+ if ( pList )
+ {
+ std::unique_ptr<SdCustomShow> pSdCustomShow(new SdCustomShow);
+ pSdCustomShow->SetName( aCuShow );
+ sal_uInt32 nFound = 0;
+ for ( sal_uInt32 nS = 0; nS < nSCount; nS++ )
+ {
+ sal_uInt32 nPageNumber;
+ rStCtrl.ReadUInt32( nPageNumber );
+ sal_uInt16 nPage = pPageList->FindPage( nPageNumber );
+ if ( nPage != PPTSLIDEPERSIST_ENTRY_NOTFOUND )
+ {
+ SdPage* pPage = mpDoc->GetSdPage( nPage, PageKind::Standard );
+ if ( pPage )
+ {
+ pSdCustomShow->PagesVector().push_back( pPage );
+ nFound++;
+ }
+ }
+ }
+ if ( nFound )
+ pList->push_back( std::move(pSdCustomShow) );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ // this is defaulted, maybe there is no SSDocInfoAtom
+ OUStringBuffer aCustomShow;
+ sal_uInt32 nFlags = 1; // Bit 0: Auto advance
+ sal_uInt16 nStartSlide = 0;
+
+ // read the pres. configuration
+ rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 );
+ if ( SeekToRec( rStCtrl, PPT_PST_SSDocInfoAtom, maDocHd.GetRecEndFilePos(), &aCustomShowHeader ) )
+ {
+ sal_uInt32 nPenColor = 0x1000000;
+ sal_Int32 nRestartTime = 0x7fffffff;
+ sal_Int16 nEndSlide = 0;
+ rStCtrl.ReadUInt32( nPenColor )
+ .ReadInt32( nRestartTime )
+ .ReadUInt16( nStartSlide )
+ .ReadInt16( nEndSlide );
+
+ sal_Unicode nChar;
+ for ( sal_uInt32 i2 = 0; i2 < 32; i2++ )
+ {
+ rStCtrl.ReadUtf16( nChar );
+ if ( nChar )
+ aCustomShow.append( nChar );
+ else
+ {
+ rStCtrl.SeekRel( ( 31 - i2 ) << 1 );
+ break;
+ }
+ }
+ rStCtrl.ReadUInt32( nFlags );
+ }
+ // set the current custom show
+ if ( !aCustomShow.isEmpty() )
+ {
+ SdCustomShowList* pList = mpDoc->GetCustomShowList();
+ if ( pList )
+ {
+ SdCustomShow* pPtr = nullptr;
+ OUString aCustomShowStr = aCustomShow.makeStringAndClear();
+ for( pPtr = pList->First(); pPtr; pPtr = pList->Next() )
+ {
+ if ( pPtr->GetName() == aCustomShowStr )
+ break;
+ }
+ if ( !pPtr )
+ pList->First();
+ }
+ }
+ sd::PresentationSettings& rPresSettings = mpDoc->getPresentationSettings();
+
+ rPresSettings.mbManual = ( nFlags & 1 ) == 0;
+ rPresSettings.mbAnimationAllowed = ( nFlags & 2 ) == 0;
+ rPresSettings.mbAll = ( nFlags & 4 ) == 0;
+ rPresSettings.mbCustomShow = ( nFlags & 8 ) != 0;
+ rPresSettings.mbEndless = ( nFlags & 0x80 ) != 0;
+ rPresSettings.mbFullScreen = ( nFlags & 0x10 ) == 0;
+
+ if ( nStartSlide && ( nStartSlide <= GetPageCount() ) )
+ {
+ SdPage* pPage = mpDoc->GetSdPage( nStartSlide - 1, PageKind::Standard );
+ if ( pPage )
+ rPresSettings.maPresPage = pPage->GetName();
+ }
+ }
+
+ xStbMgr.reset();
+
+ // read DocumentProperties
+ uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
+ mpDoc->GetObjectShell()->GetModel(), uno::UNO_QUERY_THROW);
+ uno::Reference<document::XDocumentProperties> xDocProps
+ = xDPS->getDocumentProperties();
+ sfx2::LoadOlePropertySet(xDocProps, &mrStorage);
+ xDocProps->setTemplateName(OUString());
+
+ pSdrModel->setLock(bWasLocked);
+ pSdrModel->EnableUndo(bSavedUndoEnabled);
+ return m_bOk;
+}
+
+void ImplSdPPTImport::SetHeaderFooterPageSettings( SdPage* pPage, const PptSlidePersistEntry* pMasterPersist )
+{
+ sal_uInt32 i;
+ PptSlidePersistList* pList = GetPageList( m_eCurrentPageKind );
+ if ( ( !pList ) || ( pList->size() <= m_nCurrentPageNum ) )
+ return;
+ PptSlidePersistEntry& rSlidePersist = (*pList)[ m_nCurrentPageNum ];
+ HeaderFooterEntry* pHFE = rSlidePersist.xHeaderFooterEntry.get();
+ if (!pHFE)
+ return;
+
+ for ( i = 0; i < 4; i++ )
+ {
+ bool bVisible = pHFE->IsToDisplay( i );
+ if ( ( m_eCurrentPageKind == PPT_SLIDEPAGE )
+ && ( rSlidePersist.aSlideAtom.aLayout.eLayout == PptSlideLayout::TITLESLIDE )
+ && ( aDocAtom.bTitlePlaceholdersOmitted ) )
+ {
+ bVisible = false;
+ }
+ if ( bVisible && pMasterPersist )
+ {
+ sal_uInt32 nPosition = pHFE->NeedToImportInstance( i, rSlidePersist );
+ if ( nPosition )
+ {
+ ::tools::Rectangle aEmpty;
+ bVisible = false;
+ rStCtrl.Seek( nPosition );
+ ProcessData aProcessData( rSlidePersist, SdPageCapsule(pPage) );
+ SdrObject* pObj = ImportObj( rStCtrl, aProcessData, aEmpty, aEmpty, /*nCalledByGroup*/0, /*pShapeId*/nullptr );
+ if ( pObj )
+ pPage->NbcInsertObject( pObj, 0 );
+ }
+ }
+ OUString aPlaceHolderString = pHFE->pPlaceholder[ i ];
+
+ sd::HeaderFooterSettings rHeaderFooterSettings( pPage->getHeaderFooterSettings() );
+ switch( i )
+ {
+ case 0 :
+ {
+ rHeaderFooterSettings.mbDateTimeVisible = bVisible;
+ rHeaderFooterSettings.mbDateTimeIsFixed = ( pHFE->nAtom & 0x20000 ) == 0;
+ rHeaderFooterSettings.maDateTimeText = aPlaceHolderString;
+ SvxDateFormat eDateFormat;
+ SvxTimeFormat eTimeFormat;
+ PPTFieldEntry::GetDateTime( pHFE->nAtom & 0xff, eDateFormat, eTimeFormat );
+ rHeaderFooterSettings.meDateFormat = eDateFormat;
+ rHeaderFooterSettings.meTimeFormat = eTimeFormat;
+ }
+ break;
+ case 1 :
+ {
+ rHeaderFooterSettings.mbHeaderVisible = bVisible;
+ rHeaderFooterSettings.maHeaderText = aPlaceHolderString;
+ }
+ break;
+ case 2 :
+ {
+ rHeaderFooterSettings.mbFooterVisible = bVisible;
+ rHeaderFooterSettings.maFooterText = aPlaceHolderString;
+ }
+ break;
+ case 3 :
+ {
+ rHeaderFooterSettings.mbSlideNumberVisible = bVisible;
+ }
+ break;
+ }
+ pPage->setHeaderFooterSettings( rHeaderFooterSettings );
+ }
+}
+
+namespace {
+
+// Import of pages
+struct Ppt97AnimationStlSortHelper
+{
+ bool operator()( const std::pair< SdrObject*, Ppt97AnimationPtr >& p1, const std::pair< SdrObject*, Ppt97AnimationPtr >& p2 );
+};
+
+}
+
+bool Ppt97AnimationStlSortHelper::operator()( const std::pair< SdrObject*, Ppt97AnimationPtr >& p1, const std::pair< SdrObject*, Ppt97AnimationPtr >& p2 )
+{
+ if( !p1.second || !p2.second )
+ return p1.second.get() < p2.second.get();
+ if( *p1.second < *p2.second )
+ return true;
+ if( *p1.second > *p2.second )
+ return false;
+ return p1.first->GetOrdNum() < p2.first->GetOrdNum();
+}
+
+void ImplSdPPTImport::ImportPageEffect( SdPage* pPage, const bool bNewAnimationsUsed )
+{
+ sal_uInt64 nOldFilePos = rStCtrl.Tell();
+
+ // set PageKind at page (up to now only PageKind::Standard or PageKind::Notes)
+ if ( pPage->GetPageKind() == PageKind::Standard )
+ {
+ PptSlidePersistList* pPersistList = GetPageList( m_eCurrentPageKind );
+ PptSlidePersistEntry* pActualSlidePersist = ( pPersistList && ( m_nCurrentPageNum < pPersistList->size() ) )
+ ? &(*pPersistList)[ m_nCurrentPageNum ] : nullptr;
+
+ if ( pActualSlidePersist && ( m_eCurrentPageKind == PPT_SLIDEPAGE ) )
+ {
+ if ( ! ( pActualSlidePersist->aSlideAtom.nFlags & 1 ) ) // do not follow master objects ?
+ {
+ if(pPage->TRG_HasMasterPage())
+ {
+ SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
+ aVisibleLayers.Set(mnBackgroundObjectsLayerID, false);
+ pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+ }
+ }
+ }
+ DffRecordHeader aPageRecHd;
+ if ( SeekToCurrentPage( &aPageRecHd ) )
+ {
+ sal_uLong nPageRecEnd = SanitizeEndPos(rStCtrl, aPageRecHd.GetRecEndFilePos());
+
+ bool bTryTwice = ( m_eCurrentPageKind == PPT_SLIDEPAGE );
+ bool bSSSlideInfoAtom = false;
+ while ( true )
+ {
+ while ( ( rStCtrl.GetError() == ERRCODE_NONE ) && ( rStCtrl.Tell() < nPageRecEnd ) )
+ {
+ DffRecordHeader aHd;
+ ReadDffRecordHeader( rStCtrl, aHd );
+ switch ( aHd.nRecType )
+ {
+ case PPT_PST_SSSlideInfoAtom:
+ {
+ bSSSlideInfoAtom = true;
+ if ( m_eCurrentPageKind == PPT_MASTERPAGE )
+ {
+ if ( pActualSlidePersist )
+ pActualSlidePersist->aPersistAtom.nReserved = aHd.GetRecBegFilePos();
+ }
+ else
+ {
+ sal_Int8 nDirection, nTransitionType, nByteDummy, nSpeed;
+ sal_Int16 nBuildFlags;
+ sal_Int32 nSlideTime, nSoundRef;
+ rStCtrl.ReadInt32( nSlideTime ) // time to show (in Ticks)
+ .ReadInt32( nSoundRef ) // Index of SoundCollection
+ .ReadSChar( nDirection ) // direction of fade effect
+ .ReadSChar( nTransitionType ) // fade effect
+ .ReadInt16( nBuildFlags ) // Buildflags (s.u.)
+ .ReadSChar( nSpeed ) // speed (slow, medium, fast)
+ .ReadSChar( nByteDummy ).ReadSChar( nByteDummy ).ReadSChar( nByteDummy );
+
+ switch ( nTransitionType )
+ {
+ case PPT_TRANSITION_TYPE_BLINDS :
+ {
+ if ( nDirection == 0 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_VERTICAL_STRIPES ); // fade vertical
+ else if ( nDirection == 1 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_HORIZONTAL_STRIPES ); // fade horizontal
+ }
+ break;
+ case PPT_TRANSITION_TYPE_CHECKER :
+ {
+ if ( nDirection == 0 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_HORIZONTAL_CHECKERBOARD ); // fade vertical with offset ??
+ else if ( nDirection == 1 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_VERTICAL_CHECKERBOARD ); // fade horizontal with offset ??
+ }
+ break;
+ case PPT_TRANSITION_TYPE_COVER :
+ {
+ if ( nDirection == 0 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_RIGHT ); // overlay from right
+ else if ( nDirection == 1 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_BOTTOM ); // overlay from bottom
+ else if ( nDirection == 2 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_LEFT ); // overlay from left
+ else if ( nDirection == 3 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_TOP ); // overlay from top
+ else if ( nDirection == 4 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_LOWERRIGHT ); // overlay from bottom right ??
+ else if ( nDirection == 5 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_LOWERLEFT ); // overlay from bottom left ??
+ else if ( nDirection == 6 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_UPPERRIGHT ); // overlay from top right
+ else if ( nDirection == 7 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_MOVE_FROM_UPPERLEFT ); // overlay from top left ??
+ }
+ break;
+ case PPT_TRANSITION_TYPE_NONE :
+ {
+ if ( nBuildFlags )
+ {
+ if ( nDirection == 0 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_NONE ); // direct
+ else if ( nDirection == 1 )
+ {
+ pPage->setTransitionType( animations::TransitionType::BARWIPE );
+ pPage->setTransitionSubtype( animations::TransitionSubType::FADEOVERCOLOR );
+ pPage->setTransitionFadeColor( 0 );
+ }
+ }
+ else
+ pPage->setTransitionType( 0 );
+ }
+ break;
+ case PPT_TRANSITION_TYPE_DISSOLVE :
+ pPage->SetFadeEffect(css::presentation::FadeEffect_DISSOLVE); // dissolve
+ break;
+ case PPT_TRANSITION_TYPE_RANDOM_BARS :
+ {
+ if ( nDirection == 0 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_HORIZONTAL_LINES ); // horizontal lines
+ else if ( nDirection == 1 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_VERTICAL_LINES ); // vertical lines
+ }
+ break;
+ case PPT_TRANSITION_TYPE_SPLIT :
+ {
+ if ( nDirection == 0 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_OPEN_VERTICAL ); // open horizontal ??
+ else if ( nDirection == 1 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_CLOSE_VERTICAL ); // close horizontal ??
+ else if ( nDirection == 2 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_OPEN_HORIZONTAL ); // open vertical ??
+ else if ( nDirection == 3 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_CLOSE_HORIZONTAL ); // close vertical ??
+ }
+ break;
+ case PPT_TRANSITION_TYPE_STRIPS :
+ {
+ if ( nDirection == 4 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_LOWERRIGHT ); // diagonal to top left
+ else if ( nDirection == 5 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_LOWERLEFT ); // diagonal to top right
+ else if ( nDirection == 6 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_UPPERRIGHT ); // diagonal to bottom left
+ else if ( nDirection == 7 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_UPPERLEFT ); // diagonal to bottom right
+ }
+ break;
+ case PPT_TRANSITION_TYPE_PULL :
+ {
+ if ( nDirection == 0 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_LEFT ); // uncover to left
+ else if ( nDirection == 1 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_TOP ); // uncover to top
+ else if ( nDirection == 2 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_RIGHT ); // uncover to right
+ else if ( nDirection == 3 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_BOTTOM ); // uncover to bottom
+ else if ( nDirection == 4 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_UPPERLEFT ); // uncover to top left
+ else if ( nDirection == 5 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_UPPERRIGHT ); // uncover to top right
+ else if ( nDirection == 6 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_LOWERLEFT ); // uncover to bottom left
+ else if ( nDirection == 7 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_UNCOVER_TO_LOWERRIGHT ); // uncover to bottom right
+ }
+ break;
+ case PPT_TRANSITION_TYPE_WIPE :
+ {
+ if ( nDirection == 0 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_RIGHT ); // roll from right
+ else if ( nDirection == 1 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_BOTTOM ); // roll from bottom
+ else if ( nDirection == 2 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_LEFT ); // roll from left
+ else if ( nDirection == 3 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_TOP ); // roll from top
+ }
+ break;
+ case PPT_TRANSITION_TYPE_RANDOM :
+ pPage->SetFadeEffect( css::presentation::FadeEffect_RANDOM ); // automatic
+ break;
+ case PPT_TRANSITION_TYPE_FADE :
+ {
+ pPage->setTransitionType( animations::TransitionType::FADE );
+ pPage->setTransitionSubtype( animations::TransitionSubType::FADEOVERCOLOR );
+ pPage->setTransitionFadeColor( 0 );
+ }
+ break;
+ case PPT_TRANSITION_TYPE_ZOOM :
+ {
+ if ( nDirection == 0 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_FROM_CENTER ); // fade from center
+ else if ( nDirection == 1 )
+ pPage->SetFadeEffect( css::presentation::FadeEffect_FADE_TO_CENTER ); // fade from the outside
+ }
+ break;
+ case PPT_TRANSITION_TYPE_DIAMOND :
+ {
+ pPage->setTransitionType( animations::TransitionType::IRISWIPE );
+ pPage->setTransitionSubtype( animations::TransitionSubType::DIAMOND );
+ }
+ break;
+ case PPT_TRANSITION_TYPE_PLUS :
+ {
+ pPage->setTransitionType( animations::TransitionType::FOURBOXWIPE );
+ pPage->setTransitionSubtype( animations::TransitionSubType::CORNERSOUT );
+ }
+ break;
+ case PPT_TRANSITION_TYPE_CIRCLE :
+ {
+ pPage->setTransitionType( animations::TransitionType::ELLIPSEWIPE );
+ pPage->setTransitionSubtype( animations::TransitionSubType::CIRCLE );
+ }
+ break;
+ case PPT_TRANSITION_TYPE_WEDGE :
+ {
+ pPage->setTransitionType( animations::TransitionType::FANWIPE );
+ pPage->setTransitionSubtype( animations::TransitionSubType::CENTERTOP );
+ }
+ break;
+ case PPT_TRANSITION_TYPE_WHEEL :
+ {
+ pPage->setTransitionType( animations::TransitionType::PINWHEELWIPE );
+ sal_Int16 nSubType;
+ switch( nDirection )
+ {
+ default:
+ case 1 : nSubType = animations::TransitionSubType::ONEBLADE; break;
+ case 2 : nSubType = animations::TransitionSubType::TWOBLADEVERTICAL; break;
+ case 3 : nSubType = animations::TransitionSubType::THREEBLADE; break;
+ case 4 : nSubType = animations::TransitionSubType::FOURBLADE; break;
+ case 8 : nSubType = animations::TransitionSubType::EIGHTBLADE; break;
+ }
+ pPage->setTransitionSubtype( nSubType );
+ }
+ break;
+ case PPT_TRANSITION_TYPE_PUSH :
+ {
+ pPage->setTransitionType( animations::TransitionType::PUSHWIPE );
+ sal_Int16 nSubType;
+ switch( nDirection )
+ {
+ default:
+ case 0 : nSubType = animations::TransitionSubType::FROMRIGHT; break;
+ case 1 : nSubType = animations::TransitionSubType::FROMBOTTOM; break;
+ case 2 : nSubType = animations::TransitionSubType::FROMLEFT; break;
+ case 3 : nSubType = animations::TransitionSubType::FROMTOP; break;
+ }
+ pPage->setTransitionSubtype( nSubType );
+ }
+ break;
+ case PPT_TRANSITION_TYPE_COMB :
+ {
+ pPage->setTransitionType( animations::TransitionType::PUSHWIPE );
+ pPage->setTransitionSubtype( nDirection ? animations::TransitionSubType::COMBVERTICAL : animations::TransitionSubType::COMBHORIZONTAL );
+ }
+ break;
+ case PPT_TRANSITION_TYPE_NEWSFLASH :
+ {
+ pPage->setTransitionType( animations::TransitionType::ZOOM );
+ pPage->setTransitionSubtype( animations::TransitionSubType::ROTATEIN );
+ }
+ break;
+ case PPT_TRANSITION_TYPE_SMOOTHFADE :
+ {
+ pPage->setTransitionType( animations::TransitionType::FADE );
+ pPage->setTransitionSubtype( animations::TransitionSubType::CROSSFADE );
+ }
+ break;
+ }
+
+ if ( nSpeed == 0 )
+ pPage->setTransitionDuration( 1.0 ); // slow
+ else if ( nSpeed == 1 )
+ pPage->setTransitionDuration( 0.75 ); // medium
+ else if ( nSpeed == 2 )
+ pPage->setTransitionDuration( 0.5 ); // fast
+
+ if ( nBuildFlags & 0x400 ) // slidechange by time
+ { // time to show (in Ticks)
+ pPage->SetPresChange( PresChange::Auto );
+ pPage->SetTime( nSlideTime / 1000.0 );
+ }
+ else
+ pPage->SetPresChange( mePresChange );
+
+ if ( nBuildFlags & 4 )
+ pPage->SetExcluded( true ); // don't show slide
+ if ( nBuildFlags & 16 )
+ { // slide with sound effect
+ pPage->SetSound( true );
+ OUString aSoundFile( ReadSound( nSoundRef ) );
+ pPage->SetSoundFile( aSoundFile );
+ }
+ if ( nBuildFlags & ( 1 << 6 ) ) // Loop until next sound
+ pPage->SetLoopSound( true );
+ if ( nBuildFlags & ( 1 << 8 ) ) // Stop the previous sound
+ pPage->SetStopSound( true );
+ break;
+ }
+ }
+ }
+ if (!aHd.SeekToEndOfRecord(rStCtrl))
+ break;
+ }
+ if ( bTryTwice && !bSSSlideInfoAtom )
+ {
+ bTryTwice = false;
+ if ( HasMasterPage( m_nCurrentPageNum, m_eCurrentPageKind ) )
+ {
+ sal_uInt16 nMasterNum = GetMasterPageIndex( m_nCurrentPageNum, m_eCurrentPageKind );
+ PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE );
+ if ( pPageList && ( nMasterNum < pPageList->size() ) )
+ {
+ assert( !pPageList->is_null( nMasterNum ) );
+ const PptSlidePersistEntry& rE = (*pPageList)[ nMasterNum ];
+ sal_uInt32 nOfs = rE.aPersistAtom.nReserved;
+ if ( nOfs )
+ {
+ rStCtrl.Seek( nOfs );
+ nPageRecEnd = nOfs + 16;
+ continue;
+ }
+ }
+
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ if ( !bNewAnimationsUsed )
+ {
+ std::vector< std::pair< SdrObject*, Ppt97AnimationPtr > > aAnimationsOnThisPage;
+
+ // add effects from page in correct order
+ SdrObjListIter aSdrIter( pPage, SdrIterMode::Flat );
+ while ( aSdrIter.IsMore() )
+ {
+ SdrObject* pObj = aSdrIter.Next();
+ tAnimationMap::iterator aFound = maAnimations.find( pObj );
+ if( aFound != maAnimations.end() )
+ {
+ std::pair< SdrObject*, Ppt97AnimationPtr > aPair( (*aFound).first, (*aFound).second );
+ aAnimationsOnThisPage.push_back( aPair );
+ }
+ }
+
+ std::sort( aAnimationsOnThisPage.begin(), aAnimationsOnThisPage.end(), Ppt97AnimationStlSortHelper() );
+
+ for( auto& rEntry : aAnimationsOnThisPage )
+ {
+ Ppt97AnimationPtr pPpt97Animation = rEntry.second;
+ if( pPpt97Animation )
+ pPpt97Animation->createAndSetCustomAnimationEffect( rEntry.first );
+ }
+ }
+ rStCtrl.Seek( nOldFilePos );
+}
+
+// import of sounds
+
+// Not only the sounds are imported as string, they are also inserted to
+// the gallery if they are not already there.
+OUString ImplSdPPTImport::ReadSound(sal_uInt32 nSoundRef) const
+{
+ OUString aRetval;
+ sal_uInt32 nOldPos = rStCtrl.Tell();
+ DffRecordHeader aDocHd;
+ if ( SeekToDocument( &aDocHd ) )
+ {
+ sal_uInt32 nSoundLen = aDocHd.GetRecEndFilePos();
+ DffRecordHeader aSoundBlockRecHd;
+ if( SeekToRec( rStCtrl, PPT_PST_SoundCollection, nSoundLen, &aSoundBlockRecHd ) )
+ {
+ sal_uInt32 nDataLen = aSoundBlockRecHd.GetRecEndFilePos();
+ DffRecordHeader aSoundRecHd;
+ bool bRefStrValid = false;
+ bool bDone = false;
+
+ while( !bDone && SeekToRec( rStCtrl, PPT_PST_Sound, nDataLen, &aSoundRecHd ) )
+ {
+ sal_uInt32 nStrLen = aSoundRecHd.GetRecEndFilePos();
+ OUString aRefStr;
+ sal_uInt32 nOldPos2 = rStCtrl.Tell();
+ if ( SeekToRec( rStCtrl, PPT_PST_CString, nStrLen, nullptr, 2 ) )
+ {
+ if ( ReadString( aRefStr ) )
+ bRefStrValid = true;
+ }
+ if ( bRefStrValid )
+ {
+ if ( std::u16string_view(OUString::number(nSoundRef)) == aRefStr )
+ {
+ rStCtrl.Seek( nOldPos2 );
+ if ( SeekToRec( rStCtrl, PPT_PST_CString, nStrLen ) )
+ {
+ ReadString( aRetval );
+ bDone = true;
+ }
+ }
+ }
+ if ( bDone )
+ {
+ // Check if this sound file already exists.
+ // If not, it is exported to our local sound directory.
+ bool bSoundExists = false;
+ ::std::vector< OUString > aSoundList;
+
+ GalleryExplorer::FillObjList( GALLERY_THEME_SOUNDS, aSoundList );
+ GalleryExplorer::FillObjList( GALLERY_THEME_USERSOUNDS, aSoundList );
+
+ for( size_t n = 0; ( n < aSoundList.size() ) && !bSoundExists; ++n )
+ {
+ INetURLObject aURL( aSoundList[ n ] );
+
+ if (aURL.GetLastName() == aRetval)
+ {
+ aRetval = aSoundList[ n ];
+ bSoundExists = true;
+ }
+ }
+
+ aSoundList.clear();
+
+ if ( !bSoundExists )
+ {
+ rStCtrl.Seek( nOldPos2 );
+ DffRecordHeader aSoundDataRecHd;
+ if ( SeekToRec( rStCtrl, PPT_PST_SoundData, nStrLen, &aSoundDataRecHd ) )
+ {
+ OUString aGalleryDir;
+ if (utl::ConfigManager::IsFuzzing())
+ osl_getTempDirURL(&aGalleryDir.pData);
+ else
+ aGalleryDir = SvtPathOptions().GetGalleryPath();
+ // Use last token delimited by ';'. copy(lastIndexOf+1) works whether
+ // string is empty or not and whether ';' is there or not.
+ INetURLObject aGalleryUserSound( aGalleryDir.subView(aGalleryDir.lastIndexOf(';')+1) );
+
+ aGalleryUserSound.Append( aRetval );
+ const auto nRemainingSize = rStCtrl.remainingSize();
+ sal_uInt32 nSoundDataLen = aSoundDataRecHd.nRecLen;
+ if (nSoundDataLen > nRemainingSize)
+ {
+ SAL_WARN("filter.ms", "sound data len longer than remaining stream size");
+ nSoundDataLen = nRemainingSize;
+ }
+ std::vector<sal_uInt8> aBuf(nSoundDataLen);
+
+ rStCtrl.ReadBytes(aBuf.data(), nSoundDataLen);
+ std::unique_ptr<SvStream> pOStm = ::utl::UcbStreamHelper::CreateStream( aGalleryUserSound.GetMainURL( INetURLObject::DecodeMechanism::NONE ), StreamMode::WRITE | StreamMode::TRUNC );
+
+ if( pOStm )
+ {
+ pOStm->WriteBytes(aBuf.data(), nSoundDataLen);
+
+ if( pOStm->GetError() == ERRCODE_NONE )
+ {
+ GalleryExplorer::InsertURL( GALLERY_THEME_USERSOUNDS, aGalleryUserSound.GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
+ aRetval = aGalleryUserSound.GetMainURL( INetURLObject::DecodeMechanism::NONE );
+ }
+ }
+ }
+ }
+ }
+ if ( !bDone )
+ {
+ if (!aSoundRecHd.SeekToEndOfRecord(rStCtrl))
+ break;
+ }
+ }
+ }
+ }
+ rStCtrl.Seek( nOldPos );
+ return aRetval;
+}
+
+// media object import, the return value is the url to the media object
+OUString ImplSdPPTImport::ReadMedia( sal_uInt32 nMediaRef ) const
+{
+ OUString aRetVal;
+ DffRecordHeader* pHd( const_cast<ImplSdPPTImport*>(this)->aDocRecManager.GetRecordHeader( PPT_PST_ExObjList ) );
+ if ( pHd )
+ {
+ pHd->SeekToContent( rStCtrl );
+ auto nEndRecPos = SanitizeEndPos(rStCtrl, pHd->GetRecEndFilePos());
+ while ( ( rStCtrl.Tell() < nEndRecPos ) && aRetVal.isEmpty() )
+ {
+ DffRecordHeader aHdMovie;
+ ReadDffRecordHeader( rStCtrl, aHdMovie );
+ switch( aHdMovie.nRecType )
+ {
+ case PPT_PST_ExAviMovie :
+ case PPT_PST_ExMCIMovie :
+ {
+ DffRecordHeader aExVideoHd;
+ if ( SeekToRec( rStCtrl, PPT_PST_ExVideo, aHdMovie.GetRecEndFilePos(), &aExVideoHd ) )
+ {
+ DffRecordHeader aExMediaAtomHd;
+ if ( SeekToRec( rStCtrl, PPT_PST_ExMediaAtom, aExVideoHd.GetRecEndFilePos(), &aExMediaAtomHd ) )
+ {
+ sal_uInt32 nRef;
+ rStCtrl.ReadUInt32( nRef );
+ if ( nRef == nMediaRef )
+ {
+ aExVideoHd.SeekToContent( rStCtrl );
+ auto nHdEndRecPos = SanitizeEndPos(rStCtrl, aExVideoHd.GetRecEndFilePos());
+ while (rStCtrl.Tell() < nHdEndRecPos)
+ {
+ DffRecordHeader aHd;
+ ReadDffRecordHeader( rStCtrl, aHd );
+ switch( aHd.nRecType )
+ {
+ case PPT_PST_CString :
+ {
+ aHd.SeekToBegOfRecord( rStCtrl );
+ OUString aStr;
+ if ( ReadString( aStr ) )
+ {
+ if( osl::FileBase::getFileURLFromSystemPath( aStr, aRetVal )
+ == osl::FileBase::E_None )
+ {
+ aRetVal = INetURLObject( aRetVal ).GetMainURL( INetURLObject::DecodeMechanism::Unambiguous );
+ }else{
+ aRetVal = aStr;
+ }
+ }
+ }
+ break;
+ }
+ if (!aHd.SeekToEndOfRecord(rStCtrl))
+ break;
+ }
+ break;
+ }
+ }
+ }
+ }
+ break;
+ }
+ if (!aHdMovie.SeekToEndOfRecord(rStCtrl))
+ break;
+ }
+ }
+ return aRetVal;
+}
+
+// import of objects
+void ImplSdPPTImport::FillSdAnimationInfo( SdAnimationInfo* pInfo, PptInteractiveInfoAtom const * pIAtom, const OUString& aMacroName )
+{
+ // set local information into pInfo
+ if( pIAtom->nSoundRef )
+ {
+ pInfo->SetBookmark( ReadSound( pIAtom->nSoundRef ) ); // path to sound file in MS DOS notation
+ pInfo->meClickAction = css::presentation::ClickAction_SOUND; // RunProgramAction
+ }
+
+ switch ( pIAtom->nAction )
+ {
+
+ case 0x02 : // RunProgramAction
+ {
+ pInfo->meClickAction = css::presentation::ClickAction_PROGRAM;
+ pInfo->SetBookmark( aMacroName ); // program name in aBookmark
+ }
+ break;
+ case 0x03 : // JumpAction
+ {
+ switch( pIAtom->nJump )
+ {
+ case 0x01 :
+ pInfo->meClickAction = css::presentation::ClickAction_NEXTPAGE; // Next slide
+ break;
+ case 0x02 :
+ pInfo->meClickAction = css::presentation::ClickAction_PREVPAGE; // Previous slide
+ break;
+ case 0x03 :
+ pInfo->meClickAction = css::presentation::ClickAction_FIRSTPAGE; // First slide
+ break;
+ case 0x04 :
+ pInfo->meClickAction = css::presentation::ClickAction_LASTPAGE; // last Slide
+ break;
+ case 0x05 :
+ pInfo->meClickAction = css::presentation::ClickAction_PREVPAGE; // Last slide viewed
+ break;
+ case 0x06 :
+ pInfo->meClickAction = css::presentation::ClickAction_STOPPRESENTATION; // End show
+ break;
+ default :
+ pInfo->meClickAction = css::presentation::ClickAction_NONE; // 0x00: no action, else unknown
+ break;
+ }
+ }
+ break;
+ case 0x04 :
+ {
+ SdHyperlinkEntry* pPtr = nullptr;
+ for (SdHyperlinkEntry & entry : m_aHyperList) {
+ if ( entry.nIndex == pIAtom->nExHyperlinkId ) {
+ pPtr = &entry;
+ break;
+ }
+ }
+ if ( pPtr )
+ {
+ switch( pIAtom->nHyperlinkType )
+ {
+ case 9:
+ case 8: // hyperlink : URL
+ {
+ if ( !pPtr->aTarget.isEmpty() )
+ {
+ ::sd::DrawDocShell* pDocShell = mpDoc->GetDocSh();
+ SfxMedium* pMedium = pDocShell ? pDocShell->GetMedium() : nullptr;
+ if (pMedium)
+ {
+ OUString aBaseURL = pMedium->GetBaseURL();
+ OUString aBookmarkURL( pInfo->GetBookmark() );
+ INetURLObject aURL( pPtr->aTarget );
+ if( INetProtocol::NotValid == aURL.GetProtocol()
+ && (osl::FileBase::getFileURLFromSystemPath(
+ pPtr->aTarget, aBookmarkURL)
+ != osl::FileBase::E_None) )
+ aBookmarkURL.clear();
+ if( aBookmarkURL.isEmpty() )
+ aBookmarkURL = URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), pPtr->aTarget, URIHelper::GetMaybeFileHdl() );
+ pInfo->SetBookmark( aBookmarkURL );
+ pInfo->meClickAction = css::presentation::ClickAction_PROGRAM;
+ }
+ }
+ }
+ break;
+
+ case 10:
+ break;
+
+ case 7: // hyperlink to a page
+ {
+ if ( !pPtr->aConvSubString.isEmpty() )
+ {
+ pInfo->meClickAction = css::presentation::ClickAction_BOOKMARK;
+ pInfo->SetBookmark( pPtr->aConvSubString );
+ }
+ }
+ break;
+ }
+ }
+ }
+ break;
+ case 0x05 : // OLEAction ( OLEVerb to use, 0==first, 1==second, .. )
+ case 0x06 : // MediaAction
+ case 0x07 : // CustomShowAction
+ default : // 0x00: no action, else unknown action
+ break;
+ }
+}
+
+SdrObject* ImplSdPPTImport::ApplyTextObj( PPTTextObj* pTextObj, SdrTextObj* pObj, SdPageCapsule pPageCapsule,
+ SfxStyleSheet* pSheet, SfxStyleSheet** ppStyleSheetAry ) const
+{
+ SdPage * pPage = static_cast<SdPage *>(pPageCapsule.page);
+ SfxStyleSheet* pStyleSheetAry[ 9 ];
+ SdrTextObj* pText = pObj;
+ SdrObject* pRet = pText;
+
+ ppStyleSheetAry = nullptr;
+
+ PresObjKind ePresKind = PresObjKind::NONE;
+ PptOEPlaceholderAtom* pPlaceHolder = pTextObj->GetOEPlaceHolderAtom();
+ OUString aPresentationText;
+ if ( pPlaceHolder )
+ {
+ switch( pPlaceHolder->nPlaceholderId )
+ {
+ case PptPlaceholder::MASTERNOTESSLIDEIMAGE :
+ case PptPlaceholder::MASTERCENTEREDTITLE :
+ case PptPlaceholder::MASTERTITLE :
+ {
+ ePresKind = PresObjKind::Title;
+ aPresentationText = pPage->GetPresObjText( ePresKind );
+ }
+ break;
+ case PptPlaceholder::MASTERBODY :
+ {
+ ePresKind = PresObjKind::Outline;
+ aPresentationText = pPage->GetPresObjText( ePresKind );
+ }
+ break;
+ case PptPlaceholder::MASTERSUBTITLE :
+ {
+ ePresKind = PresObjKind::Text;
+ aPresentationText = pPage->GetPresObjText( ePresKind );
+ }
+ break;
+ case PptPlaceholder::MASTERNOTESBODYIMAGE :
+ {
+ ePresKind = PresObjKind::Notes;
+ aPresentationText = pPage->GetPresObjText( ePresKind );
+ }
+ break;
+ case PptPlaceholder::MASTERDATE : ePresKind = PresObjKind::DateTime; break;
+ case PptPlaceholder::MASTERSLIDENUMBER : ePresKind = PresObjKind::SlideNumber;break;
+ case PptPlaceholder::MASTERFOOTER : ePresKind = PresObjKind::Footer; break;
+ case PptPlaceholder::MASTERHEADER : ePresKind = PresObjKind::Header; break;
+ default: break;
+ }
+ }
+ switch ( pTextObj->GetDestinationInstance() )
+ {
+ case TSS_Type::PageTitle :
+ case TSS_Type::Title :
+ {
+ pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Title );
+ if ( pSheet )
+ static_cast<SdrAttrObj*>(pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true );
+ DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for titleobject (SJ)" );
+ }
+ break;
+ case TSS_Type::Subtitle :
+ {
+ pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Text );
+ if ( pSheet )
+ static_cast<SdrAttrObj*>(pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true );
+ DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for subtitleobject (SJ)" );
+ }
+ break;
+ case TSS_Type::Body :
+ case TSS_Type::HalfBody :
+ case TSS_Type::QuarterBody :
+ {
+ for ( sal_uInt16 nLevel = 9; nLevel; nLevel-- )
+ {
+ OUString aName = pPage->GetLayoutName() + " " + OUString::number( nLevel );
+ pSheet = static_cast<SfxStyleSheet*>(mpDoc->GetStyleSheetPool()->Find( aName, SfxStyleFamily::Page ));
+ if ( pSheet )
+ pText->StartListening( *pSheet );
+ pStyleSheetAry[ nLevel - 1 ] = pSheet;
+ }
+ DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for outlinerobject (SJ)" );
+ if ( pSheet )
+ static_cast<SdrAttrObj*>(pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true );
+ ppStyleSheetAry = &pStyleSheetAry[ 0 ];
+ }
+ break;
+ case TSS_Type::Notes :
+ {
+ if ( pPlaceHolder && ( ( pPlaceHolder->nPlaceholderId == PptPlaceholder::NOTESSLIDEIMAGE )
+ || ( pPlaceHolder->nPlaceholderId == PptPlaceholder::MASTERNOTESSLIDEIMAGE ) ) )
+ {
+ pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Title );
+ if ( pSheet )
+ static_cast<SdrAttrObj*>(pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true );
+ DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for titleobject (SJ)" );
+ }
+ else
+ {
+ pSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Notes );
+ DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for notesobj (SJ)" );
+ if ( pSheet )
+ static_cast<SdrAttrObj*>(pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true );
+ }
+ }
+ break;
+ case TSS_Type::Unused :
+ case TSS_Type::TextInShape :
+ {
+ switch( ePresKind )
+ {
+ case PresObjKind::DateTime :
+ case PresObjKind::SlideNumber :
+ case PresObjKind::Footer :
+ case PresObjKind::Header :
+ pSheet = static_cast<SfxStyleSheet*>(mpDoc->GetStyleSheetPool()->Find(SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS), SfxStyleFamily::Pseudo ));
+ break;
+ default :
+ pSheet = static_cast<SfxStyleSheet*>(mpDoc->GetStyleSheetPool()->Find(SdResId(STR_STANDARD_STYLESHEET_NAME), SfxStyleFamily::Para ));
+ }
+ }
+ break;
+ default: break;
+ }
+
+ pText = static_cast<SdrTextObj*>(SdrPowerPointImport::ApplyTextObj( pTextObj, pText, pPageCapsule, pSheet, ppStyleSheetAry ));
+
+ if ( pPlaceHolder && pPlaceHolder->nPlaceholderId != PptPlaceholder::NONE )
+ {
+ if ( m_eCurrentPageKind == PPT_MASTERPAGE )
+ {
+ bool bCreatePlaceHolder = ( pTextObj->GetInstance() != TSS_Type::Unused );
+ bool bIsHeaderFooter = ( ePresKind == PresObjKind::Header) || (ePresKind == PresObjKind::Footer)
+ || (ePresKind == PresObjKind::DateTime) || (ePresKind == PresObjKind::SlideNumber);
+ if ( bCreatePlaceHolder && ( pTextObj->GetInstance() == TSS_Type::TextInShape ) )
+ bCreatePlaceHolder = bIsHeaderFooter;
+ if ( bCreatePlaceHolder )
+ {
+ if ( !bIsHeaderFooter )
+ {
+ pText->SetNotVisibleAsMaster( true );
+ pText->SetEmptyPresObj( true );
+ }
+ pText->SetUserCall( pPage );
+ pPage->InsertPresObj( pText, ePresKind );
+ SdrOutliner* pOutl = nullptr;
+ if ( pTextObj->GetInstance() == TSS_Type::Notes )
+ pOutl = GetDrawOutliner( pText );
+ if ( !aPresentationText.isEmpty() )
+ pPage->SetObjText( pText, pOutl, ePresKind, aPresentationText );
+
+ if ( pPage->GetPageKind() != PageKind::Notes && pPage->GetPageKind() != PageKind::Handout)
+ {
+ SfxStyleSheet* pSheet2( pPage->GetStyleSheetForPresObj( ePresKind ) );
+ if ( pSheet2 )
+ {
+ SfxItemSet& rItemSet = pSheet2->GetItemSet();
+ rItemSet.Put( pText->GetMergedItem( SDRATTR_TEXT_LEFTDIST ) );
+ rItemSet.Put( pText->GetMergedItem( SDRATTR_TEXT_RIGHTDIST ) );
+ rItemSet.Put( pText->GetMergedItem( SDRATTR_TEXT_UPPERDIST ) );
+ rItemSet.Put( pText->GetMergedItem( SDRATTR_TEXT_LOWERDIST ) );
+ rItemSet.Put( pText->GetMergedItem( SDRATTR_TEXT_VERTADJUST ) );
+ rItemSet.Put( pText->GetMergedItem( SDRATTR_TEXT_HORZADJUST ) );
+ if ( pTextObj->GetInstance() == TSS_Type::Title
+ || pTextObj->GetInstance() == TSS_Type::Subtitle)
+ {
+ rItemSet.Put( pText->GetMergedItemSet() );
+ }
+ }
+ }
+
+ SfxItemSet aTempAttr( mpDoc->GetPool() );
+ SdrMetricItem aMinHeight( makeSdrTextMinFrameHeightItem(pText->GetLogicRect().GetSize().Height()) );
+ aTempAttr.Put( aMinHeight );
+ SdrOnOffItem aAutoGrowHeight( makeSdrTextAutoGrowHeightItem(false) );
+ aTempAttr.Put( aAutoGrowHeight );
+ pText->SetMergedItemSet(aTempAttr);
+ }
+ else
+ {
+ pRet = nullptr;
+ }
+ }
+ else
+ {
+ const PptSlideLayoutAtom* pSlideLayout = GetSlideLayoutAtom();
+ if ( pSlideLayout || ( m_eCurrentPageKind == PPT_NOTEPAGE ) )
+ {
+ sal_uInt32 nPlacementId = pPlaceHolder->nPlacementId;
+ PptPlaceholder nPlaceholderId = pPlaceHolder->nPlaceholderId;
+ PresObjKind ePresObjKind = PresObjKind::NONE;
+ bool bEmptyPresObj = true;
+ bool bVertical = false;
+ if ( ( pTextObj->GetShapeType() == mso_sptRectangle ) || ( pTextObj->GetShapeType() == mso_sptTextBox ) )
+ {
+ //if a placeholder with some custom attribute,the pTextObj will keep those attr,whose text size is zero,
+ //so sdPage should renew a PresObj to process placeholder.
+ bEmptyPresObj = ( pTextObj->Count() == 0 ) || ( pTextObj->Count() == 1 && pTextObj->First()->GetTextSize() == 0 );
+ switch ( nPlaceholderId )
+ {
+ case PptPlaceholder::NOTESBODY : ePresObjKind = PresObjKind::Notes; break;
+ case PptPlaceholder::VERTICALTEXTTITLE :
+ bVertical = true;
+ [[fallthrough]];
+ case PptPlaceholder::TITLE : ePresObjKind = PresObjKind::Title; break;
+ case PptPlaceholder::VERTICALTEXTBODY :
+ bVertical = true;
+ [[fallthrough]];
+ case PptPlaceholder::BODY : ePresObjKind = PresObjKind::Outline; break;
+ case PptPlaceholder::CENTEREDTITLE : ePresObjKind = PresObjKind::Title; break;
+ case PptPlaceholder::SUBTITLE : ePresObjKind = PresObjKind::Text; break; // PresObjKind::Outline
+
+ default :
+ {
+ if ( pTextObj->Count() == 0 )
+ {
+ switch ( nPlaceholderId )
+ {
+ case PptPlaceholder::MEDIACLIP :
+ case PptPlaceholder::OBJECT : ePresObjKind = PresObjKind::Object; break;
+ case PptPlaceholder::GRAPH : ePresObjKind = PresObjKind::Chart; break;
+ case PptPlaceholder::TABLE : ePresObjKind = PresObjKind::Table; break;
+ case PptPlaceholder::CLIPART : ePresObjKind = PresObjKind::Graphic; break;
+ case PptPlaceholder::ORGANISZATIONCHART : ePresObjKind = PresObjKind::OrgChart; break;
+ default: break;
+ }
+ }
+ };
+ }
+ }
+ else if ( pTextObj->GetShapeType() == mso_sptPictureFrame )
+ {
+ if ( !pTextObj->Count() && dynamic_cast< const SdrGrafObj *>( pObj ) != nullptr )
+ {
+ bEmptyPresObj = false;
+ switch ( nPlaceholderId )
+ {
+ case PptPlaceholder::MEDIACLIP :
+ case PptPlaceholder::OBJECT : ePresObjKind = PresObjKind::Object; break;
+ case PptPlaceholder::GRAPH : ePresObjKind = PresObjKind::Chart; break;
+ case PptPlaceholder::TABLE : ePresObjKind = PresObjKind::Calc; break;
+ case PptPlaceholder::CLIPART : ePresObjKind = PresObjKind::Graphic; break;
+ case PptPlaceholder::ORGANISZATIONCHART : ePresObjKind = PresObjKind::OrgChart; break;
+ default: break;
+ }
+ }
+ }
+ if ( ePresObjKind != PresObjKind::NONE )
+ {
+ if ( !bEmptyPresObj )
+ {
+ pPage->InsertPresObj( pRet, ePresObjKind );
+ }
+ else
+ {
+ SdrObject* pPresObj = pPage->CreatePresObj( ePresObjKind, bVertical, pText->GetLogicRect() );
+ pPresObj->SetUserCall( pPage );
+
+ SfxItemSet aSet( pSdrModel->GetItemPool() );
+ ApplyAttributes( rStCtrl, aSet );
+ pPresObj->SetLogicRect(pText->GetLogicRect());
+ ApplyTextAnchorAttributes( *pTextObj, aSet );
+ //set custom font attribute of the placeholder
+ if ( pTextObj->Count() == 1 )
+ {
+ PPTParagraphObj* pPara = pTextObj->First();
+ if ( pPara && pPara->GetTextSize() == 0 )
+ {
+ if ( PPTPortionObj * pPor = pPara->First() )
+ {
+ pPor->ApplyTo(aSet, const_cast<SdrPowerPointImport&>(static_cast<SdrPowerPointImport const &>(*this)), pTextObj->GetDestinationInstance());
+ }
+ }
+ }
+ pPresObj->SetMergedItemSet(aSet);
+
+ if ((m_eCurrentPageKind != PPT_NOTEPAGE) && (nPlacementId != 0xffffffff) && pPage->TRG_HasMasterPage())
+ {
+ SdrObject* pTitleObj = static_cast<SdPage&>(pPage->TRG_GetMasterPage()).GetPresObj( PresObjKind::Title );
+ SdrObject* pOutlineObj = static_cast<SdPage&>(pPage->TRG_GetMasterPage()).GetPresObj( PresObjKind::Outline );
+
+ ::tools::Rectangle aTitleRect;
+ ::tools::Rectangle aOutlineRect;
+ Size aOutlineSize;
+
+ if ( pTitleObj )
+ aTitleRect = pTitleObj->GetLogicRect();
+ if ( pOutlineObj )
+ {
+ aOutlineRect = pOutlineObj->GetLogicRect();
+ aOutlineSize = aOutlineRect.GetSize();
+ }
+ ::tools::Rectangle aLogicRect( pPresObj->GetLogicRect() );
+ Size aLogicSize( aLogicRect.GetSize() );
+
+ switch ( nPlacementId )
+ {
+ case 0 : // position in title area
+ {
+ if ( aLogicRect != aTitleRect )
+ pPresObj->SetUserCall( nullptr );
+ }
+ break;
+
+ case 1:
+ {
+ if ( pSlideLayout->eLayout == PptSlideLayout::TITLEANDBODYSLIDE )
+ { // position in outline area
+ if ( aLogicRect != aOutlineRect )
+ pPresObj->SetUserCall( nullptr );
+ }
+ else if ( pSlideLayout->eLayout == PptSlideLayout::TWOCOLUMNSANDTITLE )
+ { // position in outline area left
+ if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE ||
+ std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE ||
+ std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE ||
+ aOutlineSize.Width() == 0 ||
+ static_cast<double>(aLogicSize.Width()) / aOutlineSize.Width() < 0.48 ||
+ static_cast<double>(aLogicSize.Width()) / aOutlineSize.Width() > 0.5)
+ {
+ pPresObj->SetUserCall(nullptr);
+ }
+ }
+ else if ( pSlideLayout->eLayout == PptSlideLayout::TWOROWSANDTITLE )
+ { // position in outline area top
+ if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE ||
+ std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE ||
+ std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE)
+ {
+ pPresObj->SetUserCall( nullptr );
+ }
+ }
+ else if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE ||
+ std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE)
+ { // position in outline area top left
+ pPresObj->SetUserCall( nullptr );
+ }
+ }
+ break;
+
+ case 2:
+ {
+ if ( pSlideLayout->eLayout == PptSlideLayout::TWOCOLUMNSANDTITLE )
+ { // position in outline area right
+ if (std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE ||
+ std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE ||
+ std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE ||
+ aOutlineSize.Width() == 0 ||
+ static_cast<double>(aLogicSize.Width()) / aOutlineSize.Width() < 0.48 ||
+ static_cast<double>(aLogicSize.Width()) / aOutlineSize.Width() > 0.5)
+ {
+ pPresObj->SetUserCall( nullptr );
+ }
+ }
+ else if ( pSlideLayout->eLayout == PptSlideLayout::TWOROWSANDTITLE )
+ { // position in outline area bottom
+ if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE ||
+ std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE ||
+ std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE)
+ {
+ pPresObj->SetUserCall( nullptr );
+ }
+ }
+ else if (std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE ||
+ std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE)
+ { // position in outline area top right
+ pPresObj->SetUserCall(nullptr);
+ }
+ }
+ break;
+
+ case 3:
+ { // position in outline area bottom left
+ if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE ||
+ std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE)
+ {
+ pPresObj->SetUserCall( nullptr );
+ }
+ }
+ break;
+
+ case 4:
+ { // position in outline area bottom right
+ if (std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE ||
+ std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE)
+ {
+ pObj->SetUserCall( nullptr );
+ }
+ }
+ break;
+ }
+ }
+ pRet = nullptr; // return zero cause this obj was already inserted by CreatePresObj
+ }
+ }
+ else if ( !pTextObj->Count() )
+ pRet = nullptr;
+ }
+ }
+ }
+ if ( pRet != pText )
+ {
+ SdrObject* pFree( pText );
+ SdrObject::Free( pFree );
+ }
+ return pRet;
+}
+
+SdrObject* ImplSdPPTImport::ProcessObj( SvStream& rSt, DffObjData& rData, SvxMSDffClientData& rClientData, ::tools::Rectangle& rTextRect, SdrObject* pRet )
+{
+ SdrObject* pObj = SdrPowerPointImport::ProcessObj( rSt, rData, rClientData, rTextRect, pRet );
+
+ // read animation effect of object
+ if ( pObj )
+ {
+ // further setup placeholder objects
+ if (dynamic_cast<const SdrPageObj*>(pObj))
+ {
+ const ProcessData& rProcessData=static_cast<const ProcessData&>(rClientData);
+ if(rProcessData.pPage.page)
+ static_cast<SdPage *>(rProcessData.pPage.page)->InsertPresObj(
+ pObj, PresObjKind::Page );
+ }
+
+ DffRecordHeader aMasterShapeHd;
+
+ if ( maShapeRecords.SeekToContent( rSt, DFF_msofbtClientData, SEEK_FROM_CURRENT_AND_RESTART ) )
+ {
+ bool bInhabitanceChecked = false;
+ bool bAnimationInfoFound = false;
+
+ DffRecordHeader& rHdClientData = *maShapeRecords.Current();
+ while( true )
+ {
+ sal_uInt32 nClientDataLen = SanitizeEndPos(rSt, rHdClientData.GetRecEndFilePos());
+ DffRecordHeader aHd;
+ do
+ {
+ ReadDffRecordHeader( rSt, aHd );
+ sal_uInt32 nHdRecEnd = aHd.GetRecEndFilePos();
+ switch ( aHd.nRecType )
+ {
+ case PPT_PST_AnimationInfo :
+ {
+ DffRecordHeader aHdAnimInfoAtom;
+ if ( SeekToRec( rSt, PPT_PST_AnimationInfoAtom, nHdRecEnd, &aHdAnimInfoAtom ) )
+ {
+ // read data from stream
+ Ppt97AnimationPtr pAnimation = std::make_shared<Ppt97Animation>( rSt );
+ // store animation information
+ if( pAnimation->HasEffect() )
+ {
+ // translate color to RGB
+ pAnimation->SetDimColor( MSO_CLR_ToColor(pAnimation->GetDimColor()) );
+ // translate sound bits to file url
+ if( pAnimation->HasSoundEffect() )
+ pAnimation->SetSoundFileUrl( ReadSound( pAnimation->GetSoundRef() ) );
+
+ bool bDontAnimateInvisibleShape = false;
+ {
+ SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(pObj);
+
+ if( pTextObj && pTextObj->HasText() &&
+ dynamic_cast< SdrObjGroup *>( pObj ) == nullptr &&
+ pAnimation->HasAnimateAssociatedShape() )
+ {
+ const SfxItemSet& rObjItemSet = pObj->GetMergedItemSet();
+
+ drawing::FillStyle eFillStyle = rObjItemSet.Get(XATTR_FILLSTYLE).GetValue();
+ drawing::LineStyle eLineStyle = rObjItemSet.Get(XATTR_LINESTYLE).GetValue();
+
+ if ( ( eFillStyle == drawing::FillStyle_NONE ) && ( eLineStyle == drawing::LineStyle_NONE ) )
+ bDontAnimateInvisibleShape = true;
+ }
+ }
+ if( bDontAnimateInvisibleShape )
+ pAnimation->SetAnimateAssociatedShape(false);
+
+ //maybe some actions necessary to ensure that animations on master pages are played before animations on normal pages
+ //maybe todo in future: bool bIsEffectOnMasterPage = !bInhabitanceChecked;?
+
+ maAnimations[pObj] = pAnimation;
+
+ bAnimationInfoFound = true;
+ }
+ }
+ }
+ break;
+ case PPT_PST_InteractiveInfo:
+ {
+ sal_uInt32 nOldFilePos2 = rSt.Tell();
+ OUString aMacroName;
+
+ if(SeekToRec( rSt, PPT_PST_CString, nHdRecEnd ) )
+ ReadString(aMacroName);
+
+ rSt.Seek( nOldFilePos2 );
+ DffRecordHeader aHdInteractiveInfoAtom;
+ if ( SeekToRec( rSt, PPT_PST_InteractiveInfoAtom, nHdRecEnd, &aHdInteractiveInfoAtom ) )
+ {
+ PptInteractiveInfoAtom aInteractiveInfoAtom;
+ ReadPptInteractiveInfoAtom( rSt, aInteractiveInfoAtom );
+
+ // interactive object
+ SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pObj, true);
+
+ FillSdAnimationInfo( pInfo, &aInteractiveInfoAtom, aMacroName );
+ if ( aInteractiveInfoAtom.nAction == 6 ) // Sj -> media action
+ {
+ rHdClientData.SeekToContent( rStCtrl );
+ DffRecordHeader aObjRefAtomHd;
+ if ( SeekToRec( rSt, PPT_PST_ExObjRefAtom, nHdRecEnd, &aObjRefAtomHd ) )
+ {
+ sal_uInt32 nRef;
+ rSt.ReadUInt32( nRef );
+ OUString aMediaURL( ReadMedia( nRef ) );
+ if ( aMediaURL.isEmpty() )
+ aMediaURL = ReadSound( nRef );
+ if ( !aMediaURL.isEmpty() )
+ {
+ SdrMediaObj* pMediaObj = new SdrMediaObj(
+ pObj->getSdrModelFromSdrObject(),
+ pObj->GetSnapRect());
+ pMediaObj->SetMergedItemSet( pObj->GetMergedItemSet() );
+
+ //--remove object from maAnimations list and add the new object instead
+ Ppt97AnimationPtr pAnimation;
+ {
+ tAnimationMap::iterator aFound = maAnimations.find( pObj );
+ if( aFound != maAnimations.end() )
+ {
+ pAnimation = (*aFound).second;
+ maAnimations.erase(aFound);
+ }
+ maAnimations[pMediaObj] = pAnimation;
+ }
+
+ SdrObject::Free( pObj );
+ pObj = pMediaObj; // SJ: hoping that pObj is not inserted in any list
+ pMediaObj->setURL( aMediaURL, ""/*TODO?*/ );
+ }
+ }
+ }
+ }
+ }
+ break;
+ }
+ if (!aHd.SeekToEndOfRecord(rSt))
+ break;
+ }
+ while( ( rSt.GetError() == ERRCODE_NONE ) && ( rSt.Tell() < nClientDataLen ) );
+
+ if ( bInhabitanceChecked || bAnimationInfoFound )
+ break;
+ bInhabitanceChecked = true;
+ if ( ! ( IsProperty( DFF_Prop_hspMaster ) && SeekToShape( rSt, &rClientData, GetPropertyValue( DFF_Prop_hspMaster, 0 ) ) ) )
+ break;
+ ReadDffRecordHeader( rSt, aMasterShapeHd );
+ if ( !SeekToRec( rSt, DFF_msofbtClientData, aMasterShapeHd.GetRecEndFilePos(), &aMasterShapeHd ) )
+ break;
+ aMasterShapeHd.SeekToContent( rSt );
+ rHdClientData = aMasterShapeHd;
+ }
+ }
+ }
+ return pObj;
+}
+
+bool
+ImplSdPPTImport::ReadFormControl( tools::SvRef<SotStorage>& rSrc1, css::uno::Reference< css::form::XFormComponent > & rFormComp ) const
+{
+ uno::Reference< frame::XModel > xModel;
+ if ( mpDoc->GetDocSh() )
+ {
+ xModel = mpDoc->GetDocSh()->GetModel();
+ oox::ole::MSConvertOCXControls aCtrlImporter( xModel );
+ return aCtrlImporter.ReadOCXStorage( rSrc1, rFormComp );
+ }
+ return false;
+}
+
+// exported function
+extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool ImportPPT(
+ SdDrawDocument* pDocument, SvStream& rDocStream, SotStorage& rStorage, SfxMedium& rMedium )
+{
+ std::unique_ptr<SdPPTImport> pImport( new SdPPTImport( pDocument, rDocStream, rStorage, rMedium ));
+ return pImport->Import();
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT bool TestImportPPT(SvStream &rStream)
+{
+ bool bRet = false;
+ try
+ {
+ tools::SvRef<SotStorage> xStorage(new SotStorage(rStream));
+ if (xStorage->GetError())
+ return false;
+
+ tools::SvRef<SotStorageStream> xDocStream(xStorage->OpenSotStream( "PowerPoint Document", StreamMode::STD_READ));
+ if ( !xDocStream.is() )
+ return false;
+
+ SdDLL::Init();
+
+ SfxMedium aSrcMed("", StreamMode::STD_READ);
+
+ xDocStream->SetVersion(xStorage->GetVersion());
+ xDocStream->SetCryptMaskKey(xStorage->GetKey());
+
+ ::sd::DrawDocShellRef xDocShRef = new ::sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Impress);
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+
+ try
+ {
+ bRet = ImportPPT(pDoc, *xDocStream, *xStorage, aSrcMed);
+ }
+ catch (...)
+ {
+ }
+
+ xDocShRef->DoClose();
+ }
+ catch (...)
+ {
+ }
+ return bRet;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/ppt/pptin.hxx b/sd/source/filter/ppt/pptin.hxx
new file mode 100644
index 000000000..39eff2890
--- /dev/null
+++ b/sd/source/filter/ppt/pptin.hxx
@@ -0,0 +1,92 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <filter/msfilter/svdfppt.hxx>
+#include <diadef.h>
+#include <sot/storage.hxx>
+#include <svx/svdtypes.hxx>
+#include <memory>
+
+class SdDrawDocument;
+class SfxMedium;
+
+/*************************************************************************
+|*
+|* local import
+|*
+\************************************************************************/
+
+class SdPage;
+class SdAnimationInfo;
+class Ppt97Animation;
+
+typedef std::shared_ptr< Ppt97Animation > Ppt97AnimationPtr;
+typedef ::std::map < SdrObject*, Ppt97AnimationPtr > tAnimationMap;
+
+class ImplSdPPTImport : public SdrPowerPointImport
+{
+ tools::SvRef<SotStorageStream> mxPicturesStream;
+ SfxMedium& mrMed;
+ SotStorage& mrStorage;
+ DffRecordHeader maDocHd;
+ std::vector<OUString> maSlideNameList;
+ bool mbDocumentFound;
+ sal_uInt32 mnFilterOptions;
+ SdDrawDocument* mpDoc;
+ PresChange mePresChange;
+ SdrLayerID mnBackgroundObjectsLayerID;
+
+ tAnimationMap maAnimations;
+ void SetHeaderFooterPageSettings( SdPage* pPage, const PptSlidePersistEntry* pMasterPersist );
+ void ImportPageEffect( SdPage* pPage, const bool bNewAnimationsUsed );
+
+ void FillSdAnimationInfo( SdAnimationInfo* pInfo, PptInteractiveInfoAtom const * pIAtom, const OUString& aMacroName );
+
+ virtual SdrObject* ProcessObj( SvStream& rSt, DffObjData& rData, SvxMSDffClientData& rClientData, ::tools::Rectangle& rTextRect, SdrObject* pObj ) override;
+ virtual SdrObject* ApplyTextObj( PPTTextObj* pTextObj, SdrTextObj* pText, SdPageCapsule pPage,
+ SfxStyleSheet*, SfxStyleSheet** ) const override;
+
+public:
+
+ OUString ReadSound( sal_uInt32 nSoundRef ) const;
+ OUString ReadMedia( sal_uInt32 nMediaRef ) const;
+
+ ImplSdPPTImport( SdDrawDocument* pDoc, SotStorage& rStorage, SfxMedium& rMed, PowerPointImportParam& );
+ virtual ~ImplSdPPTImport() override;
+
+ bool Import();
+ virtual bool ReadFormControl( tools::SvRef<SotStorage>& rSrc1, css::uno::Reference< css::form::XFormComponent > & rFormComp ) const override;
+};
+
+class SdPPTImport
+{
+ PowerPointImportParam maParam;
+ std::unique_ptr<ImplSdPPTImport> pFilter;
+
+public:
+
+ SdPPTImport( SdDrawDocument* pDoc, SvStream& rDocStream, SotStorage& rStorage, SfxMedium& rMed );
+ ~SdPPTImport();
+
+ bool Import();
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/ppt/pptinanimations.cxx b/sd/source/filter/ppt/pptinanimations.cxx
new file mode 100644
index 000000000..ff49054dd
--- /dev/null
+++ b/sd/source/filter/ppt/pptinanimations.cxx
@@ -0,0 +1,3294 @@
+/* -*- 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 <com/sun/star/animations/XAnimationNodeSupplier.hpp>
+#include <com/sun/star/animations/AnimationFill.hpp>
+#include <com/sun/star/animations/AnimationRestart.hpp>
+#include <com/sun/star/animations/Timing.hpp>
+#include <com/sun/star/animations/Event.hpp>
+#include <com/sun/star/animations/AnimationEndSync.hpp>
+#include <com/sun/star/animations/Command.hpp>
+#include <com/sun/star/animations/EventTrigger.hpp>
+#include <com/sun/star/animations/AnimationNodeType.hpp>
+#include <com/sun/star/animations/AnimationTransformType.hpp>
+#include <com/sun/star/animations/AnimationCalcMode.hpp>
+#include <com/sun/star/animations/AnimationValueType.hpp>
+#include <com/sun/star/animations/AnimationAdditiveMode.hpp>
+#include <com/sun/star/animations/XIterateContainer.hpp>
+#include <com/sun/star/animations/XAnimateSet.hpp>
+#include <com/sun/star/animations/XAnimationNode.hpp>
+#include <com/sun/star/animations/XAudio.hpp>
+#include <com/sun/star/animations/XCommand.hpp>
+#include <com/sun/star/animations/XTransitionFilter.hpp>
+#include <com/sun/star/animations/XAnimateColor.hpp>
+#include <com/sun/star/animations/XAnimateMotion.hpp>
+#include <com/sun/star/animations/XAnimateTransform.hpp>
+#include <com/sun/star/animations/ValuePair.hpp>
+#include <com/sun/star/animations/AnimationColorSpace.hpp>
+#include <com/sun/star/presentation/EffectNodeType.hpp>
+#include <com/sun/star/presentation/EffectPresetClass.hpp>
+#include <com/sun/star/presentation/ShapeAnimationSubType.hpp>
+#include <com/sun/star/presentation/EffectCommands.hpp>
+#include <com/sun/star/beans/NamedValue.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/io/WrongFormatException.hpp>
+#include <com/sun/star/presentation/ParagraphTarget.hpp>
+#include <com/sun/star/presentation/TextAnimationType.hpp>
+#include <comphelper/processfactory.hxx>
+#include <oox/helper/addtosequence.hxx>
+#include <oox/ppt/pptfilterhelpers.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <rtl/math.hxx>
+#include <sal/log.hxx>
+#include <tools/debug.hxx>
+#include <osl/diagnose.h>
+#include <o3tl/string_view.hxx>
+
+#include <svx/svdotext.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/editobj.hxx>
+#include <animations.hxx>
+#include "pptanimations.hxx"
+#include "pptinanimations.hxx"
+#include "pptatom.hxx"
+#include "pptin.hxx"
+#include <randomnode.hxx>
+
+#include <algorithm>
+#include <memory>
+
+using ::com::sun::star::beans::NamedValue;
+using ::com::sun::star::container::XEnumerationAccess;
+using ::com::sun::star::container::XEnumeration;
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::animations;
+using namespace ::com::sun::star::presentation;
+
+namespace ppt
+{
+
+static SvStream& operator>>(SvStream& rIn, AnimationNode& rNode )
+{
+ rIn.ReadInt32( rNode.mnU1 );
+ rIn.ReadInt32( rNode.mnRestart );
+ rIn.ReadInt32( rNode.mnGroupType );
+ rIn.ReadInt32( rNode.mnFill );
+ rIn.ReadInt32( rNode.mnU3 );
+ rIn.ReadInt32( rNode.mnU4 );
+ rIn.ReadInt32( rNode.mnDuration );
+ rIn.ReadInt32( rNode.mnNodeType );
+
+ return rIn;
+}
+
+bool PropertySet::hasProperty( sal_Int32 nProperty ) const
+{
+ return maProperties.find( nProperty ) != maProperties.end();
+}
+
+Any PropertySet::getProperty( sal_Int32 nProperty ) const
+{
+ PropertySetMap_t::const_iterator aIter( maProperties.find( nProperty ) );
+ if( aIter != maProperties.end() )
+ return (*aIter).second;
+ else
+ return Any();
+}
+
+AnimationImporter::AnimationImporter( ImplSdPPTImport* pPPTImport, SvStream& rStCtrl )
+: mpPPTImport( pPPTImport ), mrStCtrl( rStCtrl )
+{
+}
+
+int AnimationImporter::import( const Reference< XDrawPage >& xPage, const DffRecordHeader& rProgTagContentHd )
+{
+ int nNodes = 0;
+
+#ifdef DBG_ANIM_LOG
+ static int ppt_anim_debug_stream_number = 1;
+ OUString ppt_anim_debug_filename("ppt-animation-import-debug-output-");
+ ppt_anim_debug_filename += OUString::number(ppt_anim_debug_stream_number++);
+ ppt_anim_debug_filename += ".xml";
+ mpFile = fopen( OUStringToOString( ppt_anim_debug_filename, RTL_TEXTENCODING_UTF8).getStr() , "w+" );
+#endif
+ dump("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+
+ Reference< XAnimationNodeSupplier > xNodeSupplier( xPage, UNO_QUERY );
+ if( xNodeSupplier.is() )
+ {
+ mxRootNode = xNodeSupplier->getAnimationNode();
+ if( mxRootNode.is() )
+ {
+ Reference< XAnimationNode > xParent;
+
+ std::unique_ptr<Atom> pAtom(Atom::import( rProgTagContentHd, mrStCtrl ));
+ if( pAtom )
+ {
+ nNodes = importAnimationContainer( pAtom.get(), xParent );
+ }
+
+ std::for_each( maAfterEffectNodes.begin(), maAfterEffectNodes.end(),
+ sd::stl_process_after_effect_node_func );
+ }
+ }
+
+#ifdef DBG_ANIM_LOG
+ fclose( mpFile );
+#endif
+
+ return nNodes;
+}
+
+Reference< XAnimationNode > AnimationImporter::createNode( const Atom* pAtom, const AnimationNode& rNode )
+{
+ const char* pServiceName = nullptr;
+
+ switch( rNode.mnGroupType )
+ {
+ case mso_Anim_GroupType_PAR:
+ if( pAtom->hasChildAtom( DFF_msofbtAnimIteration ) )
+ pServiceName = "com.sun.star.animations.IterateContainer";
+ else
+ pServiceName = "com.sun.star.animations.ParallelTimeContainer";
+ break;
+ case mso_Anim_GroupType_SEQ:
+ pServiceName = "com.sun.star.animations.SequenceTimeContainer";
+ break;
+ case mso_Anim_GroupType_NODE:
+ {
+ switch( rNode.mnNodeType )
+ {
+ case mso_Anim_Behaviour_FILTER:
+ case mso_Anim_Behaviour_ANIMATION:
+ if( pAtom->hasChildAtom( DFF_msofbtAnimateSet ) )
+ pServiceName = "com.sun.star.animations.AnimateSet";
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateColor ) )
+ pServiceName = "com.sun.star.animations.AnimateColor";
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateScale ) )
+ pServiceName = "com.sun.star.animations.AnimateTransform";
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateRotation ) )
+ pServiceName = "com.sun.star.animations.AnimateTransform";
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateMotion ) )
+ pServiceName = "com.sun.star.animations.AnimateMotion";
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateFilter ) )
+ pServiceName = "com.sun.star.animations.TransitionFilter";
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimCommand ) )
+ pServiceName = "com.sun.star.animations.Command";
+ else
+ pServiceName = "com.sun.star.animations.Animate";
+ break;
+ }
+ break;
+ }
+ case mso_Anim_GroupType_MEDIA:
+ pServiceName = "com.sun.star.animations.Audio";
+ break;
+
+ default:
+ pServiceName = "com.sun.star.animations.Animate";
+ break;
+ }
+
+ Reference< XAnimationNode > xNode;
+ if( pServiceName )
+ {
+ Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext();
+ const OUString aServiceName( OUString::createFromAscii(pServiceName) );
+ Reference< XInterface > xFac( xContext->getServiceManager()->createInstanceWithContext(aServiceName, xContext) );
+ xNode.set(xFac , UNO_QUERY );
+ }
+
+ DBG_ASSERT( xNode.is(), "sd::AnimationImporter::createNode(), node creation failed!" );
+ return xNode;
+}
+
+static bool is_random( const AnimationNode& rNode, const PropertySet& rSet, sal_Int32& rPresetClass )
+{
+ if( rNode.mnGroupType != mso_Anim_GroupType_PAR )
+ return false;
+
+ if( !rSet.hasProperty( DFF_ANIM_PRESET_ID ) || !rSet.hasProperty( DFF_ANIM_PRESET_CLASS ) )
+ return false;
+
+ sal_Int32 nPresetId = 0;
+ if( !(rSet.getProperty( DFF_ANIM_PRESET_ID ) >>= nPresetId) || (nPresetId != 24) )
+ return false;
+
+ sal_Int32 nPresetClass = 0;
+ if( !(rSet.getProperty( DFF_ANIM_PRESET_CLASS ) >>= nPresetClass) )
+ return false;
+
+ switch( nPresetClass )
+ {
+ case DFF_ANIM_PRESS_CLASS_ENTRANCE: rPresetClass = EffectPresetClass::ENTRANCE; return true;
+ case DFF_ANIM_PRESS_CLASS_EXIT: rPresetClass = EffectPresetClass::EXIT; return true;
+ }
+ return false;
+}
+
+int AnimationImporter::importAnimationContainer( const Atom* pAtom, const Reference< XAnimationNode >& xParent )
+{
+ int nNodes = 0;
+ if( pAtom->seekToContent() )
+ {
+ AnimationNode aNode;
+ const Atom* pAnimationNodeAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimNode );
+ if( pAnimationNodeAtom && pAnimationNodeAtom->seekToContent() )
+ mrStCtrl >> aNode;
+
+ PropertySet aSet;
+ const Atom* pAnimationPropertySetAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimPropertySet );
+ if( pAnimationPropertySetAtom )
+ importPropertySetContainer( pAnimationPropertySetAtom, aSet );
+
+ Reference< XAnimationNode > xNode;
+
+ if( xParent.is() )
+ {
+ sal_Int32 nPresetClass;
+ if( is_random( aNode, aSet, nPresetClass ) )
+ {
+ // create a random animation node with the given preset class
+ xNode.set( sd::RandomAnimationNode_createInstance( static_cast<sal_Int16>(nPresetClass) ), UNO_QUERY );
+ }
+
+ if( !xNode.is() )
+ {
+ // create a node for the given atom
+ xNode = createNode( pAtom, aNode );
+ }
+ }
+ else
+ {
+ // if we have no parent we fill the root node
+ xNode = mxRootNode;
+ }
+
+ // import if we have a node and it's not random
+ if( xNode.is() )
+ {
+ fillNode( xNode, aNode, aSet );
+
+ switch( aNode.mnGroupType )
+ {
+ case mso_Anim_GroupType_PAR:
+ {
+ dump( "<par" );
+ dump( aNode );
+ dump( aSet );
+ nNodes += importTimeContainer( pAtom, xNode );
+ dump( "</par>\n" );
+
+ // for iteration containers, map target from children to iteration
+ Reference< XIterateContainer > xIter( xNode, UNO_QUERY );
+ if( xIter.is() )
+ {
+ double fDuration = 0.0;
+ Any aTarget, aEmpty;
+ Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY );
+ if( xEnumerationAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimate > xChildNode( xEnumeration->nextElement(), UNO_QUERY );
+ if( xChildNode.is() )
+ {
+ double fChildBegin = 0.0;
+ double fChildDuration = 0.0;
+ xChildNode->getBegin() >>= fChildBegin;
+ xChildNode->getDuration() >>= fChildDuration;
+
+ fChildDuration += fChildBegin;
+ if( fChildDuration > fDuration )
+ fDuration = fChildDuration;
+
+ if( !aTarget.hasValue() )
+ aTarget = xChildNode->getTarget();
+
+ xChildNode->setTarget( aEmpty );
+ }
+ }
+ }
+ }
+
+ xIter->setTarget( aTarget );
+
+ double fIterateInterval = xIter->getIterateInterval() * fDuration / 100;
+ xIter->setIterateInterval( fIterateInterval );
+ }
+ }
+ break;
+
+ case mso_Anim_GroupType_SEQ:
+ {
+ dump( "<seq" );
+ dump( aNode );
+ dump( aSet );
+ nNodes += importTimeContainer( pAtom, xNode );
+ dump( "</seq>\n" );
+
+ if( aSet.hasProperty( DFF_ANIM_NODE_TYPE ) )
+ {
+ sal_Int32 nPPTNodeType = 0;
+ if( aSet.getProperty( DFF_ANIM_NODE_TYPE ) >>= nPPTNodeType )
+ {
+ switch(nPPTNodeType)
+ {
+ case DFF_ANIM_NODE_TYPE_MAIN_SEQUENCE:
+ oox::ppt::fixMainSequenceTiming( xNode );
+ break;
+ case DFF_ANIM_NODE_TYPE_INTERACTIVE_SEQ:
+ oox::ppt::fixInteractiveSequenceTiming( xNode );
+ break;
+ }
+ }
+ }
+ }
+ break;
+
+ case mso_Anim_GroupType_NODE:
+ {
+#ifdef DBG_ANIM_LOG
+ if( pAtom->hasChildAtom( DFF_msofbtAnimateSet ) )
+ {
+ dump( "<set" );
+ }
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateColor ) )
+ {
+ dump( "<animateColor" );
+ }
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateScale ) )
+ {
+ dump( "<animateScale" );
+ }
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateRotation ) )
+ {
+ dump( "<animateRotation" );
+ }
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateMotion ) )
+ {
+ dump( "<animateMotion" );
+ }
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimate ) )
+ {
+ dump( "<animate" );
+ }
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateFilter ) )
+ {
+ dump( "<animateFilter" );
+ }
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimCommand ) )
+ {
+ dump( "<command" );
+ }
+ else
+ {
+ OSL_FAIL( "unknown node atom!" );
+ dump_atom_header( pAtom, true, false );
+ dump_atom( pAtom );
+ dump_atom_header( pAtom, false, false );
+ break;
+ }
+ dump( aNode );
+ dump( aSet );
+#endif
+ int nANCNodes = importAnimationNodeContainer( pAtom, xNode );
+ if( !convertAnimationNode( xNode, xParent ) )
+ xNode = nullptr;
+ else
+ nNodes += nANCNodes;
+ dump( "/>\n");
+
+ }
+ break;
+
+ case mso_Anim_GroupType_MEDIA:
+ {
+ dump( "<audio" );
+ dump( aNode );
+ dump( aSet );
+ nNodes += importAudioContainer( pAtom, xNode );
+ dump( "</audio>\n" );
+ }
+ break;
+
+ default:
+ OSL_FAIL( "unknown group atom!" );
+
+ dump_atom_header( pAtom, true, false );
+ dump_atom( pAtom );
+ dump_atom_header( pAtom, false, false );
+ break;
+
+ }
+ }
+
+ if( xParent.is() && xNode.is() )
+ {
+ Reference< XTimeContainer > xParentContainer( xParent, UNO_QUERY );
+ DBG_ASSERT( xParentContainer.is(), "parent is no container, then why do I have a child here?" );
+ if( xParentContainer.is() )
+ {
+ xParentContainer->appendChild( xNode );
+ }
+ }
+ }
+
+ return nNodes;
+}
+
+bool AnimationImporter::convertAnimationNode( const Reference< XAnimationNode >& xNode, const Reference< XAnimationNode >& xParent )
+{
+ Reference< XAnimate > xAnimate( xNode, UNO_QUERY );
+ if( !xAnimate.is() )
+ return true;
+
+ if( !xAnimate->getTarget().hasValue() )
+ return false;
+
+ const sal_Int16 nNodeType = xNode->getType();
+
+ if( nNodeType == AnimationNodeType::TRANSITIONFILTER )
+ return true;
+
+ OUString aAttributeName( xAnimate->getAttributeName() );
+
+ if( (nNodeType == AnimationNodeType::SET) && aAttributeName == "fill.on" )
+ return false;
+
+ const oox::ppt::ImplAttributeNameConversion* p = oox::ppt::getAttributeConversionList();
+
+ oox::ppt::AnimationAttributeEnum eAttribute = oox::ppt::AnimationAttributeEnum::UNKNOWN;
+
+ if( (nNodeType == AnimationNodeType::ANIMATEMOTION) ||
+ (nNodeType == AnimationNodeType::ANIMATETRANSFORM) )
+ {
+ aAttributeName.clear();
+ }
+ else
+ {
+ while( p->mpMSName )
+ {
+ if( aAttributeName.equalsAscii( p->mpMSName ) )
+ break;
+
+ p++;
+ }
+
+ DBG_ASSERT( p->mpMSName || aAttributeName.isEmpty(), "sd::AnimationImporter::convertAnimationNode(), unknown attribute!" );
+#ifdef DBG_ANIM_LOG
+ if( p->mpMSName == 0 ) dump( "<error text=\"sd::AnimationImporter::convertAnimationNode(), unknown attribute!\"/>\n" );
+#endif
+
+ eAttribute = p->meAttribute;
+
+ if( p->mpAPIName )
+ aAttributeName = OUString::createFromAscii( p->mpAPIName );
+ }
+
+ xAnimate->setAttributeName( aAttributeName );
+
+ if(eAttribute != oox::ppt::AnimationAttributeEnum::UNKNOWN)
+ {
+ Any aAny( xAnimate->getFrom() );
+ if( aAny.hasValue() )
+ {
+ if(oox::ppt::convertAnimationValue(eAttribute, aAny))
+ xAnimate->setFrom( aAny );
+ }
+
+ aAny = xAnimate->getBy();
+ if( aAny.hasValue() )
+ {
+ if(oox::ppt::convertAnimationValue(eAttribute, aAny))
+ xAnimate->setBy( aAny );
+ }
+
+ aAny = xAnimate->getTo();
+ if( aAny.hasValue() )
+ {
+ if(oox::ppt::convertAnimationValue(eAttribute, aAny))
+ xAnimate->setTo( aAny );
+ }
+
+ Sequence< Any > aValues( xAnimate->getValues() );
+ if( aValues.hasElements() )
+ {
+ for( Any& rValue : asNonConstRange(aValues) )
+ oox::ppt::convertAnimationValue(eAttribute, rValue);
+
+ xAnimate->setValues( aValues );
+ }
+
+ OUString aFormula( xAnimate->getFormula() );
+ if( !aFormula.isEmpty() )
+ {
+ if(oox::ppt::convertMeasure(aFormula))
+ xAnimate->setFormula( aFormula );
+ }
+ }
+
+ // check for after-effect
+ Sequence< NamedValue > aUserData( xNode->getUserData() );
+ NamedValue* pLastValue = aUserData.getArray();
+ sal_Int32 nRemoved = 0;
+
+ bool bAfterEffect = false;
+ sal_Int32 nMasterRel = 0;
+ for( const NamedValue& rValue : std::as_const(aUserData) )
+ {
+ if ( rValue.Name == "after-effect" )
+ {
+ rValue.Value >>= bAfterEffect;
+ nRemoved++;
+ }
+ else if ( rValue.Name == "master-rel" )
+ {
+ rValue.Value >>= nMasterRel;
+ nRemoved++;
+ }
+ else
+ {
+ if( nRemoved )
+ *pLastValue = rValue;
+ pLastValue++;
+ }
+ }
+
+ if( nRemoved )
+ {
+ aUserData.realloc( aUserData.getLength() - nRemoved );
+ xNode->setUserData( aUserData );
+ }
+
+ // if it's an after effect node, add it to the list for
+ // later processing
+ // after effect nodes are not inserted at their import
+ // position, so return false in this case
+ if( bAfterEffect )
+ {
+ if( nMasterRel != 2 )
+ {
+ Event aEvent;
+
+ aEvent.Source <<= xParent;
+ aEvent.Trigger = EventTrigger::END_EVENT;
+ aEvent.Repeat = 0;
+
+ xNode->setBegin( Any( aEvent ) );
+ }
+
+ // add to after effect nodes for later processing
+ sd::AfterEffectNode aNode( xNode, xParent, nMasterRel == 2 );
+ maAfterEffectNodes.push_back( aNode );
+ return false;
+ }
+
+ return true;
+}
+
+void AnimationImporter::fillNode( Reference< XAnimationNode > const & xNode, const AnimationNode& rNode, const PropertySet& rSet )
+{
+ bool bAfterEffect = false;
+
+ // attribute Restart
+ if( rNode.mnRestart )
+ {
+ sal_Int16 nRestart = AnimationRestart::DEFAULT;
+ switch( rNode.mnRestart )
+ {
+ case 1: nRestart = AnimationRestart::ALWAYS; break;
+ case 2: nRestart = AnimationRestart::WHEN_NOT_ACTIVE; break;
+ case 3: nRestart = AnimationRestart::NEVER; break;
+ }
+ xNode->setRestart( nRestart );
+ }
+
+ // attribute Fill
+ if( rNode.mnFill )
+ {
+ sal_Int16 nFill = AnimationFill::DEFAULT;
+ switch( rNode.mnFill )
+ {
+ case 1: nFill = AnimationFill::REMOVE; break;
+ case 2: nFill = AnimationFill::FREEZE; break;
+ case 3: nFill = AnimationFill::HOLD; break;
+ case 4: nFill = AnimationFill::TRANSITION; break;
+ }
+ xNode->setFill( nFill );
+ }
+
+ // attribute Duration
+ if( rNode.mnDuration )
+ {
+ Any aDuration;
+ if( rNode.mnDuration > 0 )
+ {
+ aDuration <<= rNode.mnDuration / 1000.0;
+ }
+ else if( rNode.mnDuration < 0 )
+ {
+ aDuration <<= Timing_INDEFINITE;
+ }
+ xNode->setDuration( aDuration );
+ }
+
+ // TODO: DFF_ANIM_PATH_EDIT_MODE
+
+ // set user data
+ Sequence< NamedValue > aUserData;
+
+ // attribute Type
+ if( rSet.hasProperty( DFF_ANIM_NODE_TYPE ) )
+ {
+ sal_Int32 nPPTNodeType = 0;
+ if( rSet.getProperty( DFF_ANIM_NODE_TYPE ) >>= nPPTNodeType )
+ {
+ sal_Int16 nNodeType = css::presentation::EffectNodeType::DEFAULT;
+ switch( nPPTNodeType )
+ {
+ case DFF_ANIM_NODE_TYPE_CLICK_PARALLEL: [[fallthrough]];
+ case DFF_ANIM_NODE_TYPE_ON_CLICK: nNodeType = css::presentation::EffectNodeType::ON_CLICK; break;
+ case DFF_ANIM_NODE_TYPE_WITH_GROUP: [[fallthrough]];
+ case DFF_ANIM_NODE_TYPE_WITH_PREVIOUS: nNodeType = css::presentation::EffectNodeType::WITH_PREVIOUS; break;
+ case DFF_ANIM_NODE_TYPE_AFTER_GROUP: [[fallthrough]];
+ case DFF_ANIM_NODE_TYPE_AFTER_PREVIOUS: nNodeType = css::presentation::EffectNodeType::AFTER_PREVIOUS; break;
+ case DFF_ANIM_NODE_TYPE_MAIN_SEQUENCE: nNodeType = css::presentation::EffectNodeType::MAIN_SEQUENCE; break;
+ case DFF_ANIM_NODE_TYPE_TIMING_ROOT: nNodeType = css::presentation::EffectNodeType::TIMING_ROOT; break;
+ case DFF_ANIM_NODE_TYPE_INTERACTIVE_SEQ:nNodeType = css::presentation::EffectNodeType::INTERACTIVE_SEQUENCE; break;
+ }
+
+ sal_Int32 nSize = aUserData.getLength();
+ aUserData.realloc(nSize+1);
+ auto pUserData = aUserData.getArray();
+ pUserData[nSize].Name = "node-type";
+ pUserData[nSize].Value <<= nNodeType;
+ }
+ }
+
+ if( rSet.hasProperty( DFF_ANIM_GROUP_ID ) )
+ {
+ sal_Int32 nGroupId;
+ if( rSet.getProperty( DFF_ANIM_GROUP_ID ) >>= nGroupId )
+ {
+ sal_Int32 nSize = aUserData.getLength();
+ aUserData.realloc(nSize+1);
+ auto pUserData = aUserData.getArray();
+ pUserData[nSize].Name = "group-id";
+ pUserData[nSize].Value <<= nGroupId;
+ }
+ }
+
+ sal_Int16 nEffectPresetClass = EffectPresetClass::CUSTOM;
+ sal_Int32 nPresetId = 0;
+
+ if( rSet.hasProperty( DFF_ANIM_PRESET_CLASS ) )
+ {
+ sal_Int32 nPresetClass = 0;
+ if ( rSet.getProperty( DFF_ANIM_PRESET_CLASS ) >>= nPresetClass )
+ {
+ switch( nPresetClass )
+ {
+ case DFF_ANIM_PRESS_CLASS_ENTRANCE: nEffectPresetClass = EffectPresetClass::ENTRANCE; break;
+ case DFF_ANIM_PRESS_CLASS_EXIT: nEffectPresetClass = EffectPresetClass::EXIT; break;
+ case DFF_ANIM_PRESS_CLASS_EMPHASIS: nEffectPresetClass = EffectPresetClass::EMPHASIS; break;
+ case DFF_ANIM_PRESS_CLASS_MOTIONPATH: nEffectPresetClass = EffectPresetClass::MOTIONPATH; break;
+ case DFF_ANIM_PRESS_CLASS_OLE_ACTION: nEffectPresetClass = EffectPresetClass::OLEACTION; break;
+ case DFF_ANIM_PRESS_CLASS_MEDIACALL: nEffectPresetClass = EffectPresetClass::MEDIACALL; break;
+ }
+ sal_Int32 nSize = aUserData.getLength();
+ aUserData.realloc(nSize+1);
+ auto pUserData = aUserData.getArray();
+ pUserData[nSize].Name = "preset-class";
+ pUserData[nSize].Value <<= nEffectPresetClass;
+ }
+ }
+
+ if( rSet.hasProperty( DFF_ANIM_PRESET_ID ) )
+ {
+ if( rSet.getProperty( DFF_ANIM_PRESET_ID ) >>= nPresetId )
+ {
+ sal_Int32 nSize = aUserData.getLength();
+ aUserData.realloc(nSize+1);
+ auto pUserData = aUserData.getArray();
+ pUserData[nSize].Name = "preset-id";
+
+ const oox::ppt::preset_mapping* p = oox::ppt::preset_mapping::getList();
+ while( p->mpStrPresetId && ((p->mnPresetClass != nEffectPresetClass) || (p->mnPresetId != nPresetId )) )
+ p++;
+
+ if( p->mpStrPresetId )
+ {
+ pUserData[nSize].Value <<= OUString::createFromAscii( p->mpStrPresetId );
+ }
+ else
+ {
+ OUStringBuffer sBuffer;
+ sBuffer.append( "ppt_" );
+ switch( nEffectPresetClass )
+ {
+ case EffectPresetClass::ENTRANCE: sBuffer.append( "entrance_" ); break;
+ case EffectPresetClass::EXIT: sBuffer.append( "exit_" ); break;
+ case EffectPresetClass::EMPHASIS: sBuffer.append( "emphasis_" ); break;
+ case EffectPresetClass::MOTIONPATH: sBuffer.append( "motionpath_" ); break;
+ case EffectPresetClass::OLEACTION: sBuffer.append( "oleaction_" ); break;
+ case EffectPresetClass::MEDIACALL: sBuffer.append( "mediacall_" ); break;
+ }
+ sBuffer.append( nPresetId );
+
+ pUserData[nSize].Value <<= sBuffer.makeStringAndClear();
+ }
+ }
+ }
+
+ if( rSet.hasProperty( DFF_ANIM_PRESET_SUB_TYPE ) )
+ {
+ sal_Int32 nPresetSubType = 0;
+ if( rSet.getProperty( DFF_ANIM_PRESET_SUB_TYPE ) >>= nPresetSubType )
+ {
+ if( nPresetSubType )
+ {
+ sal_Int32 nSize = aUserData.getLength();
+ aUserData.realloc(nSize+1);
+ auto pUserData = aUserData.getArray();
+ pUserData[nSize].Name = "preset-sub-type";
+ pUserData[nSize].Value <<= oox::ppt::getConvertedSubType( nEffectPresetClass, nPresetId, nPresetSubType );
+ }
+ }
+ }
+
+ if( rSet.hasProperty( DFF_ANIM_AFTEREFFECT ) )
+ {
+ if( rSet.getProperty( DFF_ANIM_AFTEREFFECT ) >>= bAfterEffect )
+ {
+ sal_Int32 nSize = aUserData.getLength();
+ aUserData.realloc(nSize+1);
+ auto pUserData = aUserData.getArray();
+ pUserData[nSize].Name = "after-effect";
+ pUserData[nSize].Value <<= bAfterEffect;
+ }
+ }
+
+ if( bAfterEffect && rSet.hasProperty( DFF_ANIM_MASTERREL ) )
+ {
+ sal_Int32 nMasterRel = 2;
+ if( rSet.getProperty( DFF_ANIM_MASTERREL ) >>= nMasterRel )
+ {
+ sal_Int32 nSize = aUserData.getLength();
+ aUserData.realloc(nSize+1);
+ auto pUserData = aUserData.getArray();
+ pUserData[nSize].Name = "master-rel";
+ pUserData[nSize].Value <<= nMasterRel;
+ }
+ }
+
+ xNode->setUserData( aUserData );
+
+ // TODO: DFF_ANIM_ID
+ if( rSet.hasProperty( DFF_ANIM_ID ) )
+ {
+ OUString aString;
+ rSet.getProperty( DFF_ANIM_ID ) >>= aString;
+ //if( !aString.isEmpty() )
+ //{
+ //}
+ }
+
+ // TODO: DFF_ANIM_EVENT_FILTER
+ if( rSet.hasProperty( DFF_ANIM_EVENT_FILTER ) )
+ {
+ OUString aString;
+ rSet.getProperty( DFF_ANIM_EVENT_FILTER ) >>= aString;
+ //if( !aString.isEmpty() )
+ //{
+ //}
+ }
+
+ // DFF_ANIM_TIMEFILTER
+ if( rSet.hasProperty( DFF_ANIM_TIMEFILTER ) )
+ {
+ Reference< XAnimate > xAnim( xNode, UNO_QUERY );
+ if( xAnim.is() )
+ {
+ OUString aString;
+ rSet.getProperty( DFF_ANIM_TIMEFILTER ) >>= aString;
+ if( !aString.isEmpty() )
+ {
+ sal_Int32 nElements = 1; // a non empty string has at least one value
+
+ sal_Int32 fromIndex = 0;
+ while(true)
+ {
+ fromIndex = aString.indexOf( ';', fromIndex );
+ if( fromIndex == -1 )
+ break;
+
+ fromIndex++;
+ nElements++;
+ }
+
+ Sequence< TimeFilterPair > aTimeFilter( nElements );
+
+ TimeFilterPair* pValues = aTimeFilter.getArray();
+ sal_Int32 nIndex = 0;
+ while( (nElements--) && (nIndex >= 0) )
+ {
+ const std::u16string_view aToken( o3tl::getToken(aString, 0, ';', nIndex ) );
+
+ size_t nPos = aToken.find( ',' );
+ if( nPos != std::u16string_view::npos )
+ {
+ pValues->Time = o3tl::toDouble(aToken.substr( 0, nPos ));
+ pValues->Progress = o3tl::toDouble(aToken.substr( nPos+1 ));
+ }
+ pValues++;
+ }
+
+ xAnim->setTimeFilter( aTimeFilter );
+ }
+ }
+ }
+
+// TODO: DFF_ANIM_ENDAFTERSLIDE / DFF_ANIM_VOLUME handling. git history has sample code
+ Reference< XAnimateColor > xColor( xNode, UNO_QUERY );
+ if( !xColor.is() )
+ return;
+
+ if( rSet.hasProperty( DFF_ANIM_DIRECTION ) )
+ {
+ bool bDirection = false;
+ if( rSet.getProperty( DFF_ANIM_DIRECTION ) >>= bDirection )
+ xColor->setDirection( !bDirection );
+ }
+
+ if( rSet.hasProperty( DFF_ANIM_COLORSPACE ) )
+ {
+ sal_Int32 nColorSpace = 0;
+ rSet.getProperty( DFF_ANIM_COLORSPACE ) >>= nColorSpace;
+ xColor->setColorInterpolation( (nColorSpace == 0) ? AnimationColorSpace::RGB : AnimationColorSpace::HSL );
+ }
+}
+
+int AnimationImporter::importTimeContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ int nNodes = 0;
+
+ DBG_ASSERT( pAtom && xNode.is(), "invalid call to ppt::AnimationImporter::importTimeContainer()!");
+ if( pAtom && xNode.is() )
+ {
+ importAnimationEvents( pAtom, xNode );
+ importAnimationValues( pAtom, xNode );
+ importAnimationActions( pAtom, xNode );
+
+ dump(">\n");
+
+ // import sub containers
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+
+ while( pChildAtom )
+ {
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtAnimNode:
+ case DFF_msofbtAnimEvent:
+ case DFF_msofbtAnimValue:
+ case DFF_msofbtAnimAction:
+ case DFF_msofbtAnimPropertySet:
+ break;
+
+ case DFF_msofbtAnimSubGoup :
+ {
+ if( pChildAtom->hasChildAtom( DFF_msofbtAnimCommand ) )
+ {
+ Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext();
+ Reference< XAnimationNode > xChildNode( Command::create(xContext), UNO_QUERY_THROW );
+ nNodes += importAnimationNodeContainer( pChildAtom, xChildNode );
+ Reference< XTimeContainer > xParentContainer( xNode, UNO_QUERY );
+ if( xParentContainer.is() && xChildNode.is() )
+ xParentContainer->appendChild( xChildNode );
+ }
+ else
+ {
+ nNodes += importAnimationContainer( pChildAtom, xNode );
+ }
+ }
+ break;
+ case DFF_msofbtAnimGroup :
+ {
+ nNodes += importAnimationContainer( pChildAtom, xNode );
+ }
+ break;
+ case DFF_msofbtAnimIteration:
+ {
+ if( pChildAtom->seekToContent() )
+ {
+ float fInterval(0.0);
+ sal_Int32 nTextUnitEffect(0), nU1(0), nU2(0), nU3(0);
+
+ mrStCtrl.ReadFloat( fInterval ).ReadInt32( nTextUnitEffect ).ReadInt32( nU1 ).ReadInt32( nU2 ).ReadInt32( nU3 );
+
+ Reference< XIterateContainer > xIter( xNode, UNO_QUERY );
+ if( xIter.is() )
+ {
+ sal_Int16 nIterateType = TextAnimationType::BY_PARAGRAPH;
+ switch( nTextUnitEffect )
+ {
+ case 1: nIterateType = TextAnimationType::BY_WORD; break;
+ case 2: nIterateType = TextAnimationType::BY_LETTER; break;
+ }
+ xIter->setIterateType( nIterateType );
+ xIter->setIterateInterval( static_cast<double>(fInterval) );
+ }
+
+ nNodes++;
+
+ dump( "<iterate" );
+ dump( " iterateType=\"%s\"", (nTextUnitEffect == 0) ? "byElement" : (nTextUnitEffect == 1) ? "byWord" : "byLetter" );
+ dump( " iterateInterval=\"%g\"", fInterval );
+ dump( " u1=\"%ld\"", nU1 );
+ dump( " u2=\"%ld\"", nU2 );
+ dump( " u3=\"%ld\"/>\n", nU3 );
+ }
+ }
+ break;
+
+ case 0xf136:
+ {
+#ifdef DBG_ANIM_LOG
+ sal_uInt32 nU1, nU2;
+ mrStCtrl.ReadUInt32(nU1).ReadUInt32(nU2);
+
+ fprintf( mpFile, "<unknown_0xf136 nU1=\"%" SAL_PRIdINT32 "\" nU2=\"%" SAL_PRIdINT32 "\"/>\n", nU1, nU2 );
+#endif
+ }
+ break;
+
+ default:
+ {
+ dump_atom_header( pChildAtom, true, false );
+ dump_atom( pChildAtom );
+ dump_atom_header( pChildAtom, false, false );
+ }
+ break;
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+ }
+
+ return nNodes;
+}
+
+int AnimationImporter::importAnimationNodeContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ int nNodes = 0;
+
+ DBG_ASSERT( pAtom && xNode.is(), "invalid call to ppt::AnimationImporter::importAnimationNodeContainer()!");
+ if( pAtom && xNode.is() )
+ {
+ importAnimationEvents( pAtom, xNode );
+ importAnimationValues( pAtom, xNode );
+ importAnimationActions( pAtom, xNode );
+
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+
+ while( pChildAtom )
+ {
+ nNodes ++;
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtAnimNode:
+ case DFF_msofbtAnimEvent:
+ case DFF_msofbtAnimValue:
+ case DFF_msofbtAnimAction:
+ case DFF_msofbtAnimPropertySet:
+ break;
+
+ case DFF_msofbtAnimateFilter:
+ importAnimateFilterContainer( pChildAtom, xNode );
+ break;
+
+ case DFF_msofbtAnimateSet:
+ importAnimateSetContainer( pChildAtom, xNode );
+ break;
+
+ case DFF_msofbtAnimate:
+ importAnimateContainer( pChildAtom, xNode );
+ break;
+
+ case DFF_msofbtAnimateScale:
+ importAnimateScaleContainer( pChildAtom, xNode );
+ break;
+
+ case DFF_msofbtAnimateColor:
+ importAnimateColorContainer( pChildAtom, xNode );
+ break;
+
+ case DFF_msofbtAnimateRotation:
+ importAnimateRotationContainer( pChildAtom, xNode );
+ break;
+
+ case DFF_msofbtAnimateMotion:
+ importAnimateMotionContainer( pChildAtom, xNode );
+ break;
+
+ case DFF_msofbtAnimCommand:
+ importCommandContainer( pChildAtom, xNode );
+ break;
+
+ default:
+ {
+ nNodes --;
+ dump_atom_header( pChildAtom, true, false );
+ dump_atom( pChildAtom );
+ dump_atom_header( pChildAtom, false, false );
+ }
+ break;
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+ }
+
+ return nNodes;
+}
+
+void AnimationImporter::importAnimateFilterContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XTransitionFilter > xFilter( xNode, UNO_QUERY );
+
+ DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateFilter && xFilter.is(), "invalid call to ppt::AnimationImporter::importAnimateFilterContainer()!");
+ if( !(pAtom && xFilter.is()) )
+ return;
+
+ sal_uInt32 nBits = 0;
+
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+
+ while( pChildAtom )
+ {
+ if( !pChildAtom->isContainer() )
+ {
+ if( !pChildAtom->seekToContent() )
+ break;
+ }
+
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtAnimateFilterData:
+ {
+ sal_uInt32 transition(0);
+ mrStCtrl.ReadUInt32( nBits );
+ mrStCtrl.ReadUInt32( transition );
+
+ if( nBits & 1 )
+ xFilter->setMode( transition == 0 );
+
+ dump( " transition=\"%s\"", (transition == 0) ? "in" : "out" );
+ }
+ break;
+
+ case DFF_msofbtAnimAttributeValue:
+ {
+ if( (nBits & 2 ) && ( pChildAtom->getInstance() == 1 ) )
+ {
+ Any aAny;
+ if ( importAttributeValue( pChildAtom, aAny ) )
+ {
+ OUString filter;
+ aAny >>= filter;
+
+ dump( " filter=\"%s\"", filter );
+
+ const oox::ppt::transition* pTransition = oox::ppt::transition::find( filter );
+ if( pTransition )
+ {
+ xFilter->setTransition( pTransition->mnType );
+ xFilter->setSubtype( pTransition->mnSubType );
+ xFilter->setDirection( pTransition->mbDirection );
+ }
+ else
+ {
+ OSL_FAIL( "unknown transition!" );
+ }
+ }
+ }
+ }
+ break;
+
+ case DFF_msofbtAnimateTarget:
+ importAnimateAttributeTargetContainer( pChildAtom, xNode );
+ break;
+
+ default:
+ dump( " unknown_atom=\"%ld\"", static_cast<sal_Int32>(pChildAtom->getType()) );
+ break;
+
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+}
+
+void AnimationImporter::importAnimateAttributeTargetContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateTarget, "invalid call to ppt::AnimationImporter::importAnimateAttributeTargetContainer()!");
+
+ Any aTarget;
+
+ Reference< XAnimate > xAnimate( xNode, UNO_QUERY );
+
+ bool bWrongContext = false;
+
+ if( pAtom )
+ {
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+
+ while( pChildAtom )
+ {
+ if( !pChildAtom->isContainer() )
+ {
+ if( !pChildAtom->seekToContent() )
+ break;
+ }
+
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtAnimPropertySet:
+ {
+ PropertySet aSet;
+ importPropertySetContainer( pChildAtom, aSet );
+ if( aSet.hasProperty( DFF_ANIM_RUNTIMECONTEXT ) )
+ {
+ OUString aContext;
+ if( aSet.getProperty( DFF_ANIM_RUNTIMECONTEXT ) >>= aContext )
+ {
+ if( aContext != "PPT" )
+ bWrongContext = true;
+ }
+ }
+
+ dump( aSet );
+ }
+ break;
+
+ case DFF_msofbtAnimateTargetSettings:
+ {
+ if( xAnimate.is() )
+ {
+ sal_uInt32 nBits(0);
+ sal_uInt32 nAdditive(0);
+ sal_uInt32 nAccumulate(0);
+ sal_uInt32 nTransformType(0);
+
+ mrStCtrl.ReadUInt32( nBits ).ReadUInt32( nAdditive ).ReadUInt32( nAccumulate ).ReadUInt32( nTransformType );
+
+ // nBits %0001: additive, %0010: accumulate, %0100: attributeName, %1000: transformtype
+ // nAdditive 0 = base, 1 = sum, 2 = replace, 3 = multiply, 4 = none
+ // nAccumulate 0 = none, 1 = always
+ // nTransformType 0: "property" else "image"
+
+ if( nBits & 3 && xAnimate.is() )
+ {
+ if( nBits & 1 )
+ {
+ sal_Int16 nTemp = AnimationAdditiveMode::BASE;
+ switch( nAdditive )
+ {
+ case 1: nTemp = AnimationAdditiveMode::SUM; break;
+ case 2: nTemp = AnimationAdditiveMode::REPLACE; break;
+ case 3: nTemp = AnimationAdditiveMode::MULTIPLY; break;
+ case 4: nTemp = AnimationAdditiveMode::NONE; break;
+ }
+ xAnimate->setAdditive( nTemp );
+ }
+
+ if( nBits & 2 )
+ {
+ xAnimate->setAccumulate( nAccumulate == 0 );
+ }
+ }
+#ifdef DBG_ANIM_LOG
+ if( nBits & 1 )
+ fprintf( mpFile, " additive=\"%s\"", (nAdditive == 0) ? "base" : (nAdditive == 2) ? "replace" : (nAdditive == 1) ? "sum" : (nAdditive == 3 ) ? "multiply" : (nAdditive == 4) ? "none" : "unknown" );
+
+ if( nBits & 2 )
+ fprintf( mpFile, " accumulate=\"%s\"", (nAccumulate == 0) ? "none" : "always" );
+
+ if( nBits & 8 )
+ fprintf( mpFile, " transformType=\"%s\"", (nTransformType == 0) ? "property" : "image" );
+#endif
+ }
+ }
+ break;
+
+ case DFF_msofbtAnimateAttributeNames:
+ {
+ if( xAnimate.is() )
+ {
+ OUString aAttributeName;
+ importAttributeNamesContainer( pChildAtom, aAttributeName );
+ if( xAnimate.is() )
+ xAnimate->setAttributeName( aAttributeName );
+ dump( " attributeName=\"%s\"", aAttributeName );
+ }
+ }
+ break;
+
+ case DFF_msofbtAnimateTargetElement:
+ {
+ sal_Int16 nSubType;
+ importTargetElementContainer( pChildAtom, aTarget, nSubType );
+ if( xAnimate.is() )
+ xAnimate->setSubItem( nSubType );
+
+ dump( " target=\"" );
+ dump_target( aTarget );
+ dump( "\"" );
+ }
+ break;
+
+ default:
+ dump( " unknown_atom=\"%ld\"", static_cast<sal_Int32>(pChildAtom->getType()) );
+ break;
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+ }
+
+ if( bWrongContext )
+ aTarget.clear();
+
+ if( xAnimate.is() )
+ xAnimate->setTarget( aTarget );
+ else
+ {
+ Reference< XCommand > xCommand( xNode, UNO_QUERY );
+ if( xCommand.is() )
+ xCommand->setTarget( aTarget );
+ }
+}
+
+sal_Int16 AnimationImporter::implGetColorSpace( sal_Int32 nMode, sal_Int32 /*nA*/, sal_Int32 /*nB*/, sal_Int32 /*nC*/ )
+{
+ switch( nMode )
+ {
+ case 2: // index
+ default:
+ case 0: // rgb
+ return AnimationColorSpace::RGB;
+
+ case 1: // hsl
+ return AnimationColorSpace::HSL;
+ }
+}
+
+Any AnimationImporter::implGetColorAny( sal_Int32 nMode, sal_Int32 nA, sal_Int32 nB, sal_Int32 nC )
+{
+ switch( nMode )
+ {
+ case 0: // rgb
+ {
+ dump( "rgb(%ld", nA );
+ dump( ",%ld", nB );
+ dump( ",%ld)", nC );
+ Color aColor( static_cast<sal_uInt8>(nA), static_cast<sal_uInt8>(nB), static_cast<sal_uInt8>(nC) );
+ return Any( static_cast<sal_Int32>(aColor.GetRGBColor()) );
+ }
+ case 1: // hsl
+ {
+ dump( "hsl(%ld", nA );
+ dump( ",%ld", nB );
+ dump( ",%ld)", nC );
+ Sequence< double > aHSL{ nA * 360.0/255.0,
+ nB / 255.0,
+ nC / 255.0 };
+ return Any( aHSL );
+ }
+
+ case 2: // index
+ {
+ Color aColor;
+ mpPPTImport->GetColorFromPalette(static_cast<sal_uInt16>(nA), aColor );
+ dump( "index(%ld", nA );
+ dump( " [%ld", static_cast<sal_Int32>(aColor.GetRed()) );
+ dump( ",%ld", static_cast<sal_Int32>(aColor.GetGreen()) );
+ dump( ",%ld])", static_cast<sal_Int32>(aColor.GetBlue()) );
+ return Any( static_cast<sal_Int32>(aColor.GetRGBColor()) );
+ }
+
+ default:
+ {
+ dump( "unknown_%ld(", nMode );
+ dump( "%ld", nA );
+ dump( ",%ld", nB );
+ dump( ",%ld)", nC );
+ OSL_FAIL( "ppt::implGetColorAny(), unhandled color type" );
+
+ Any aAny;
+ return aAny;
+ }
+ }
+}
+
+void AnimationImporter::importAnimateColorContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XAnimateColor > xColor( xNode, UNO_QUERY );
+
+ DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateColor && xColor.is(), "invalid call to ppt::AnimationImporter::importAnimateColorContainer()!");
+ if( !(pAtom && xColor.is()) )
+ return;
+
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+
+ while( pChildAtom )
+ {
+ if( !pChildAtom->isContainer() )
+ {
+ if( !pChildAtom->seekToContent() )
+ break;
+ }
+
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtAnimateColorData:
+ {
+ sal_uInt32 nBits;
+ sal_Int32 nByMode, nByA, nByB, nByC;
+ sal_Int32 nFromMode, nFromA, nFromB, nFromC;
+ sal_Int32 nToMode, nToA, nToB, nToC;
+ mrStCtrl.ReadUInt32( nBits );
+ mrStCtrl.ReadInt32( nByMode ).ReadInt32( nByA ).ReadInt32( nByB ).ReadInt32( nByC );
+ mrStCtrl.ReadInt32( nFromMode ).ReadInt32( nFromA ).ReadInt32( nFromB ).ReadInt32( nFromC );
+ mrStCtrl.ReadInt32( nToMode ).ReadInt32( nToA ).ReadInt32( nToB ).ReadInt32( nToC );
+
+ if (!mrStCtrl.good())
+ {
+ SAL_WARN("filter.ms", "DFF_msofbtAnimateColorData: short read");
+ break;
+ }
+
+ if( nBits & 1 )
+ {
+ dump( " by=\"" );
+ xColor->setBy( implGetColorAny( nByMode, nByA, nByB, nByC ) );
+ xColor->setColorInterpolation( implGetColorSpace( nByMode, nByA, nByB, nByC ) );
+ dump( "\"");
+ }
+
+ if( nBits & 2 )
+ {
+ dump( " from=\"" );
+ xColor->setFrom( implGetColorAny( nFromMode, nFromA, nFromB, nFromC ) );
+ xColor->setColorInterpolation( implGetColorSpace( nFromMode, nFromA, nFromB, nFromC ) );
+ dump( "\"");
+ }
+
+ if( nBits & 4 )
+ {
+ dump( " to=\"" );
+ xColor->setTo( implGetColorAny( nToMode, nToA, nToB, nToC ) );
+ xColor->setColorInterpolation( implGetColorSpace( nToMode, nToA, nToB, nToC ) );
+ dump( "\"");
+ }
+ }
+ break;
+
+ case DFF_msofbtAnimateTarget:
+ importAnimateAttributeTargetContainer( pChildAtom, xNode );
+ break;
+
+ default:
+ dump( " unknown_atom=\"%ld\"", static_cast<sal_Int32>(pChildAtom->getType()) );
+ break;
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+}
+
+void AnimationImporter::importAnimateSetContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XAnimateSet > xSet( xNode, UNO_QUERY );
+
+ DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateSet && xSet.is(), "invalid call to ppt::AnimationImporter::importAnimateSetContainer()!");
+ if( !(pAtom && xSet.is()) )
+ return;
+
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+
+ while( pChildAtom )
+ {
+ if( !pChildAtom->isContainer() )
+ {
+ if( !pChildAtom->seekToContent() )
+ break;
+ }
+
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtAnimateSetData:
+ {
+ sal_Int32 nU1, nU2;
+ mrStCtrl.ReadInt32( nU1 ).ReadInt32( nU2 );
+
+ dump( " set_1=\"%ld\"", nU1 );
+ dump( " set_2=\"%ld\"", nU2 );
+ }
+ break;
+
+ case DFF_msofbtAnimAttributeValue:
+ {
+ Any aTo;
+ if ( importAttributeValue( pChildAtom, aTo ) )
+ {
+ xSet->setTo( aTo );
+
+ dump( " value=\"" );
+ dump( aTo );
+ dump( "\"" );
+ }
+ }
+ break;
+
+ case DFF_msofbtAnimateTarget:
+ importAnimateAttributeTargetContainer( pChildAtom, xNode );
+ break;
+
+ default:
+ dump( " unknown_atom=\"%ld\"", static_cast<sal_Int32>(pChildAtom->getType()) );
+ break;
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+}
+
+void AnimationImporter::importAnimateContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XAnimate > xAnim( xNode, UNO_QUERY );
+
+ DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimate && xAnim.is(), "invalid call to ppt::AnimationImporter::importAnimateContainer()!");
+ if( !(pAtom && xAnim.is()) )
+ return;
+
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+
+ while( pChildAtom )
+ {
+ if( !pChildAtom->isContainer() )
+ {
+ if( !pChildAtom->seekToContent() )
+ break;
+ }
+
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtAnimateData:
+ {
+ sal_uInt32 nCalcmode(0), nBits(0), nValueType(0);
+ mrStCtrl.ReadUInt32( nCalcmode ).ReadUInt32( nBits ).ReadUInt32( nValueType );
+
+ if( nBits & 0x08 )
+ {
+ sal_Int16 n = (nCalcmode == 1) ? AnimationCalcMode::LINEAR : /* (nCalcmode == 2) ? AnimationCalcMode::FORMULA : */ AnimationCalcMode::DISCRETE;
+ xAnim->setCalcMode( n );
+ dump( " calcmode=\"%s\"", (nCalcmode == 0) ? "discrete" : (nCalcmode == 1) ? "linear" : (nCalcmode == 2) ? "formula" : "unknown" );
+ }
+
+ if( nBits & 0x30 )
+ {
+ sal_Int16 n = (nValueType == 1) ? AnimationValueType::NUMBER : (nValueType == 2 ) ? AnimationValueType::COLOR : AnimationValueType::STRING;
+ xAnim->setValueType( n );
+ dump( " valueType=\"%s\"", (nValueType == 0) ? "string" : (nValueType == 1) ? "number" : (nValueType == 2) ? "color" : "unknown" );
+ }
+ }
+ break;
+
+ case DFF_msofbtAnimateTarget:
+ importAnimateAttributeTargetContainer( pChildAtom, xNode );
+ break;
+
+ case DFF_msofbtAnimKeyPoints:
+ importAnimateKeyPoints( pChildAtom, xNode );
+ break;
+
+ case DFF_msofbtAnimAttributeValue:
+ {
+ Any a;
+ if ( importAttributeValue( pChildAtom, a ) )
+ {
+ switch( pChildAtom->getInstance() )
+ {
+ case 1: xAnim->setBy( a ); dump( " by=\"" ); break;
+ case 2: xAnim->setFrom( a ); dump( " from=\"" ); break;
+ case 3: xAnim->setTo( a ); dump( " to=\"" ); break;
+ default:
+ dump( " unknown_value=\"" );
+ }
+
+ dump( a );
+ dump( "\"" );
+ }
+ }
+ break;
+ default:
+ dump( " unknown_atom=\"%ld\"", static_cast<sal_Int32>(pChildAtom->getType()) );
+ break;
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+}
+
+void AnimationImporter::importAnimateMotionContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XAnimateMotion > xMotion( xNode, UNO_QUERY );
+
+ DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateMotion && xMotion.is(), "invalid call to ppt::AnimationImporter::importAnimateMotionContainer()!");
+ if( !(pAtom && xMotion.is()) )
+ return;
+
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+
+ while( pChildAtom )
+ {
+ if( !pChildAtom->isContainer() )
+ {
+ if( !pChildAtom->seekToContent() )
+ break;
+ }
+
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtAnimateMotionData:
+ {
+ sal_uInt32 nBits, nOrigin;
+ float fByX, fByY, fFromX, fFromY, fToX, fToY;
+
+ mrStCtrl.ReadUInt32( nBits ).ReadFloat( fByX ).ReadFloat( fByY ).ReadFloat( fFromX ).ReadFloat( fFromY ).ReadFloat( fToX ).ReadFloat( fToY ).ReadUInt32( nOrigin );
+
+#ifdef DBG_ANIM_LOG
+ if( nBits & 1 )
+ fprintf( mpFile, " by=\"%g,%g\"", (double)fByX, (double)fByY );
+
+ if( nBits & 2 )
+ fprintf( mpFile, " from=\"%g,%g\"", (double)fFromX, (double)fFromY );
+
+ if( nBits & 4 )
+ fprintf( mpFile, " to=\"%g,%g\"", (double)fToX, (double)fToY );
+
+ if( nBits & 8 )
+ fprintf( mpFile, " origin=\"%s\"", (nOrigin == 1) ? "parent" : (nOrigin == 2) ? "layout" : "unknown" );
+
+#endif
+ }
+ break;
+
+ case DFF_msofbtAnimAttributeValue:
+ {
+ Any aPath;
+ if ( importAttributeValue( pChildAtom, aPath ) )
+ {
+ OUString aStr;
+ if ( aPath >>= aStr )
+ {
+ // E can appear inside a number, so we only check for its presence at the end
+ aStr = aStr.trim();
+ if (aStr.endsWith("E"))
+ aStr = aStr.copy(0, aStr.getLength() - 1);
+ aStr = aStr.trim();
+ aPath <<= aStr;
+ xMotion->setPath( aPath );
+ dump( " path=\"" );
+ dump( aPath );
+ dump( "\"" );
+ }
+ }
+ }
+ break;
+
+ case DFF_msofbtAnimateTarget:
+ importAnimateAttributeTargetContainer( pChildAtom, xNode );
+ break;
+
+ default:
+ dump( " unknown_atom=\"%ld\"", static_cast<sal_Int32>(pChildAtom->getType()) );
+ break;
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+}
+
+void AnimationImporter::importCommandContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XCommand > xCommand( xNode, UNO_QUERY );
+ DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimCommand && xCommand.is(), "invalid call to ppt::AnimationImporter::importCommandContainer()!");
+ if( !(pAtom && xCommand.is()) )
+ return;
+
+ sal_Int32 nBits = 0;
+ Any aValue;
+
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+
+ while( pChildAtom )
+ {
+ if( !pChildAtom->isContainer() )
+ {
+ if( !pChildAtom->seekToContent() )
+ break;
+ }
+
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtCommandData:
+ {
+ sal_Int32 nCommandType;
+ // looks like U1 is a bitset, bit 1 enables the type and bit 2 enables
+ // a propertyvalue that follows
+ mrStCtrl.ReadInt32( nBits );
+ mrStCtrl.ReadInt32( nCommandType );
+
+ if( nBits & 1 )
+ {
+ dump( " type=\"%s\"", (nCommandType == 0) ? "event" : ( nCommandType == 1) ? "call" : "verb" );
+ }
+ }
+ break;
+
+ case DFF_msofbtAnimAttributeValue:
+ {
+ if ( importAttributeValue( pChildAtom, aValue ) )
+ {
+ if( nBits & 2 )
+ {
+ dump( " cmd=\"" );
+ dump( aValue );
+ dump( "\"" );
+ }
+ }
+ }
+ break;
+
+ case DFF_msofbtAnimateTarget:
+ importAnimateAttributeTargetContainer( pChildAtom, xNode );
+ break;
+
+ default:
+ dump( " unknown_atom=\"%ld\"", static_cast<sal_Int32>(pChildAtom->getType()) );
+ break;
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+
+ if( !(nBits & 3) )
+ return;
+
+ OUString aParam;
+ aValue >>= aParam;
+
+ sal_Int16 nCommand = EffectCommands::CUSTOM;
+
+ NamedValue aParamValue;
+
+ if ( aParam == "onstopaudio" )
+ {
+ nCommand = EffectCommands::STOPAUDIO;
+ }
+ else if ( aParam == "play" )
+ {
+ nCommand = EffectCommands::PLAY;
+ }
+ else if( aParam.startsWith( "playFrom" ) )
+ {
+ const std::u16string_view aMediaTime( aParam.subView( 9, aParam.getLength() - 10 ) );
+ rtl_math_ConversionStatus eStatus;
+ double fMediaTime = ::rtl::math::stringToDouble( aMediaTime, u'.', u',', &eStatus );
+ if( eStatus == rtl_math_ConversionStatus_Ok )
+ {
+ aParamValue.Name = "MediaTime";
+ aParamValue.Value <<= fMediaTime;
+ }
+ nCommand = EffectCommands::PLAY;
+ }
+ else if ( aParam == "togglePause" )
+ {
+ nCommand = EffectCommands::TOGGLEPAUSE;
+ }
+ else if ( aParam == "stop" )
+ {
+ nCommand = EffectCommands::STOP;
+ }
+
+ xCommand->setCommand( nCommand );
+ if( nCommand == EffectCommands::CUSTOM )
+ {
+ OSL_FAIL("sd::AnimationImporter::importCommandContainer(), unknown command!");
+ aParamValue.Name = "UserDefined";
+ aParamValue.Value <<= aParam;
+ }
+
+ if( aParamValue.Value.hasValue() )
+ {
+ Sequence< NamedValue > aParamSeq( &aParamValue, 1 );
+ xCommand->setParameter( Any( aParamSeq ) );
+ }
+}
+
+int AnimationImporter::importAudioContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ int nNodes = 0;
+
+ Reference< XAudio > xAudio( xNode, UNO_QUERY );
+ DBG_ASSERT( pAtom && xAudio.is() &&
+ ( (pAtom->getType() == DFF_msofbtAnimGroup) ||
+ (pAtom->getType() == DFF_msofbtAnimSubGoup) ), "invalid call to ppt::AnimationImporter::importAudioContainer()!");
+ if( pAtom && xAudio.is() )
+ {
+ importAnimationEvents( pAtom, xNode );
+ importAnimationValues( pAtom, xNode );
+ importAnimationActions( pAtom, xNode );
+
+ dump(">\n");
+
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+
+ while( pChildAtom )
+ {
+ if( !pChildAtom->isContainer() )
+ {
+ if( !pChildAtom->seekToContent() )
+ break;
+ }
+
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtAnimNode:
+ case DFF_msofbtAnimEvent:
+ case DFF_msofbtAnimValue:
+ case DFF_msofbtAnimAction:
+ case DFF_msofbtAnimPropertySet:
+ break;
+
+ case DFF_msofbtAnimAttributeValue:
+ {
+ Any aValue;
+ if ( importAttributeValue( pChildAtom, aValue ) )
+ {
+ nNodes ++;
+ dump( " value=\"" );
+ dump( aValue );
+ dump( "\"" );
+ }
+ }
+ break;
+
+ case DFF_msofbtAnimateTargetElement:
+ {
+ sal_Int16 nSubType;
+ Any aSource;
+ importTargetElementContainer( pChildAtom, aSource, nSubType );
+ if( xAudio.is() ) {
+ xAudio->setSource( aSource );
+ nNodes ++;
+ }
+ }
+ break;
+
+ default:
+ dump( " unknown_atom=\"%ld\"", static_cast<sal_Int32>(pChildAtom->getType()) );
+ break;
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+
+ // TODO: What to do with them?
+ Any aEmpty;
+ xAudio->setBegin( aEmpty );
+ xAudio->setEnd( aEmpty );
+ }
+
+ return nNodes;
+}
+
+void AnimationImporter::importAnimateScaleContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XAnimateTransform > xTransform( xNode, UNO_QUERY );
+
+ DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateScale && xTransform.is(), "invalid call to ppt::AnimationImporter::importAnimateScaleContainer()!");
+ if( !(pAtom && xTransform.is()) )
+ return;
+
+ xTransform->setTransformType( AnimationTransformType::SCALE );
+
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+
+ while( pChildAtom )
+ {
+ if( !pChildAtom->isContainer() )
+ {
+ if( !pChildAtom->seekToContent() )
+ break;
+ }
+
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtAnimateScaleData:
+ {
+ sal_uInt32 nBits(0), nZoomContents(0);
+ float fByX(0.0), fByY(0.0), fFromX(0.0), fFromY(0.0), fToX(0.0), fToY(0.0);
+
+ // nBits %001: by, %010: from, %100: to, %1000: zoomContents(bool)
+ mrStCtrl.ReadUInt32( nBits ).ReadFloat( fByX ).ReadFloat( fByY ).ReadFloat( fFromX ).ReadFloat( fFromY ).ReadFloat( fToX ).ReadFloat( fToY ).ReadUInt32( nZoomContents );
+
+ ValuePair aPair;
+ // 'from' value
+ if( nBits & 2 )
+ {
+ aPair.First <<= static_cast<double>(fFromX) / 100.0;
+ aPair.Second <<= static_cast<double>(fFromY) / 100.0;
+ xTransform->setFrom( Any( aPair ) );
+ }
+
+ // 'to' value
+ if( nBits & 4 )
+ {
+ aPair.First <<= static_cast<double>(fToX) / 100.0;
+ aPair.Second <<= static_cast<double>(fToY) / 100.0;
+ xTransform->setTo( Any( aPair ) );
+ }
+
+ // 'by' value
+ if( nBits & 1 )
+ {
+ aPair.First <<= static_cast<double>(fByX) / 100.0;
+ aPair.Second <<= static_cast<double>(fByY) / 100.0;
+
+ if( nBits & 2 )
+ {
+ // 'from' value given, import normally
+ xTransform->setBy( Any( aPair ) );
+ }
+ else
+ {
+ // mapping 'by' to 'to', if no 'from' is
+ // given. This is due to a non-conformity in
+ // PPT, which exports animateScale effects
+ // with a sole 'by' value, but with the
+ // semantics of a sole 'to' animation
+ xTransform->setTo( Any( aPair ) );
+ }
+ }
+
+#ifdef DBG_ANIM_LOG
+ if( nBits & 1 )
+ fprintf( mpFile, " by=\"%g,%g\"", (double)fByX, (double)fByY );
+
+ if( nBits & 2 )
+ fprintf( mpFile, " from=\"%g,%g\"", (double)fFromX, (double)fFromY );
+
+ if( nBits & 4 )
+ fprintf( mpFile, " to=\"%g,%g\"", (double)fToX, (double)fToY );
+
+ if( nBits & 8 )
+ fprintf( mpFile, " zoomContents=\"%s\"", nZoomContents ? "true" : "false" );
+#endif
+ }
+ break;
+
+ case DFF_msofbtAnimateTarget:
+ importAnimateAttributeTargetContainer( pChildAtom, xNode );
+ break;
+
+ default:
+ dump( " unknown_atom=\"%ld\"", static_cast<sal_Int32>(pChildAtom->getType()) );
+ break;
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+}
+
+void AnimationImporter::importAnimateRotationContainer( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XAnimateTransform > xTransform( xNode, UNO_QUERY );
+
+ DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimateRotation && xTransform.is(), "invalid call to ppt::AnimationImporter::importAnimateRotationContainer()!");
+ if( !(pAtom && xTransform.is()) )
+ return;
+
+ xTransform->setTransformType( AnimationTransformType::ROTATE );
+
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+
+ while( pChildAtom )
+ {
+ if( !pChildAtom->isContainer() )
+ {
+ if( !pChildAtom->seekToContent() )
+ break;
+ }
+
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtAnimateRotationData:
+ {
+ sal_uInt32 nBits(0), nU1(0);
+ float fBy(0.0), fFrom(0.0), fTo(0.0);
+
+ // nBits %001: by, %010: from, %100: to, %1000: zoomContents(bool)
+ mrStCtrl.ReadUInt32( nBits ).ReadFloat( fBy ).ReadFloat( fFrom ).ReadFloat( fTo ).ReadUInt32( nU1 );
+
+ if( nBits & 1 )
+ xTransform->setBy( Any( static_cast<double>(fBy) ) );
+
+ if( nBits & 2 )
+ xTransform->setFrom( Any( static_cast<double>(fFrom) ) );
+
+ if( nBits & 4 )
+ xTransform->setTo( Any( static_cast<double>(fTo) ) );
+
+#ifdef DBG_ANIM_LOG
+ if( nBits & 1 )
+ fprintf( mpFile, " by=\"%g\"", (double)fBy );
+
+ if( nBits & 2 )
+ fprintf( mpFile, " from=\"%g\"", (double)fFrom );
+
+ if( nBits & 4 )
+ fprintf( mpFile, " to=\"%g\"", (double)fTo );
+
+ if( nU1 )
+ fprintf( mpFile, " rotation_1=\"%" SAL_PRIdINT32 "\"", nU1 );
+#endif
+ }
+ break;
+
+ case DFF_msofbtAnimateTarget:
+ importAnimateAttributeTargetContainer( pChildAtom, xNode );
+ break;
+
+ default:
+ dump( " unknown_atom=\"%ld\"", static_cast<sal_Int32>(pChildAtom->getType()) );
+ break;
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+}
+
+void AnimationImporter::importAttributeNamesContainer( const Atom* pAtom, OUString& rAttributeNames )
+{
+ OUStringBuffer aNames;
+
+ DBG_ASSERT( pAtom && (pAtom->getType() == DFF_msofbtAnimateAttributeNames), "invalid call to ppt::AnimationImporter::importAttributeName()!" );
+ if( pAtom )
+ {
+ const Atom* pAttributeValueAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimAttributeValue );
+
+ while( pAttributeValueAtom )
+ {
+ Any aAny;
+ if ( importAttributeValue( pAttributeValueAtom, aAny ) )
+ {
+ OUString aName;
+ if( aAny >>= aName )
+ {
+ if( !aNames.isEmpty() )
+ aNames.append( ';' );
+
+ aNames.append( aName );
+ }
+ }
+ else
+ {
+ OSL_FAIL( "error during ppt::AnimationImporter::importAttributeName()!" );
+ }
+
+ pAttributeValueAtom = pAtom->findNextChildAtom( DFF_msofbtAnimAttributeValue, pAttributeValueAtom );
+ }
+ }
+
+ rAttributeNames = aNames.makeStringAndClear();
+}
+
+void AnimationImporter::importAnimationValues( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ DBG_ASSERT( pAtom, "invalid call to ppt::AnimationImporter::importAnimationValues()!" );
+
+ if( !pAtom )
+ return;
+
+ const Atom* pValueAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimValue );
+
+ while( pValueAtom && pValueAtom->seekToContent() )
+ {
+ sal_uInt32 nType(0);
+ mrStCtrl.ReadUInt32( nType );
+ switch( nType )
+ {
+ case 0:
+ {
+ float fRepeat(0.0);
+ mrStCtrl.ReadFloat( fRepeat );
+ xNode->setRepeatCount( (fRepeat < (float(3.40282346638528860e+38))) ? Any( static_cast<double>(fRepeat) ) : Any( Timing_INDEFINITE ) );
+
+#ifdef DBG_ANIM_LOG
+ if( (fRepeat < ((float)3.40282346638528860e+38)) )
+ {
+ dump( " repeat=\"%g\"", (double)fRepeat );
+ }
+ else
+ {
+ dump( " repeat=\"indefinite\"" );
+ }
+#endif
+ }
+ break;
+
+ case 3:
+ {
+ float faccelerate(0.0);
+ mrStCtrl.ReadFloat( faccelerate );
+ xNode->setAcceleration( faccelerate );
+ dump( " accelerate=\"%g\"", static_cast<double>(faccelerate) );
+ }
+ break;
+
+ case 4:
+ {
+ float fdecelerate(0.0);
+ mrStCtrl.ReadFloat( fdecelerate );
+ xNode->setDecelerate( fdecelerate );
+ dump( " decelerate=\"%g\"", static_cast<double>(fdecelerate) );
+ }
+ break;
+
+ case 5:
+ {
+ sal_Int32 nAutoreverse(0);
+ mrStCtrl.ReadInt32( nAutoreverse );
+ xNode->setAutoReverse( nAutoreverse != 0 );
+ dump( " autoreverse=\"%#lx\"", nAutoreverse );
+ }
+ break;
+
+ default:
+ {
+ sal_uInt32 nUnknown;
+ mrStCtrl.ReadUInt32( nUnknown );
+#ifdef DBG_ANIM_LOG
+ fprintf(mpFile, " attribute_%d=\"%#lx\"", nType, nUnknown );
+#endif
+ }
+ break;
+ }
+
+ pValueAtom = pAtom->findNextChildAtom( DFF_msofbtAnimValue, pValueAtom );
+ }
+}
+
+void AnimationImporter::importAnimateKeyPoints( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ Reference< XAnimate > xAnim( xNode, UNO_QUERY );
+
+ DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimKeyPoints && xAnim.is(), "invalid call to ppt::AnimationImporter::importAnimateKeyPoints()!" );
+
+ if( !(pAtom && xAnim.is()) )
+ return;
+
+ // first count keytimes
+ const Atom* pIter = nullptr;
+ int nKeyTimes = 0;
+
+ while( (pIter = pAtom->findNextChildAtom( DFF_msofbtAnimKeyTime, pIter )) != nullptr )
+ nKeyTimes++;
+
+ Sequence< double > aKeyTimes( nKeyTimes );
+ auto aKeyTimesRange = asNonConstRange(aKeyTimes);
+ Sequence< Any > aValues( nKeyTimes );
+ auto aValuesRange = asNonConstRange(aValues);
+ OUString aFormula;
+
+ pIter = pAtom->findFirstChildAtom(DFF_msofbtAnimKeyTime);
+ bool bToNormalize = false;
+ for( int nKeyTime = 0; (nKeyTime < nKeyTimes) && pIter; nKeyTime++ )
+ {
+ if( pIter->seekToContent() )
+ {
+ sal_Int32 nTemp(0);
+ mrStCtrl.ReadInt32(nTemp);
+ double fTemp = static_cast<double>(nTemp) / 1000.0;
+ aKeyTimesRange[nKeyTime] = fTemp;
+ if( fTemp == -1 )
+ bToNormalize = true;
+
+ const Atom* pValue = Atom::findNextChildAtom(pIter);
+ if( pValue && pValue->getType() == DFF_msofbtAnimAttributeValue )
+ {
+ Any aValue1, aValue2;
+ if( importAttributeValue( pValue, aValue1 ) )
+ {
+ pValue = Atom::findNextChildAtom(pValue);
+ if( pValue && pValue->getType() == DFF_msofbtAnimAttributeValue )
+ {
+ // Any occurrence of the formula becomes the formula of the whole list.
+ if (importAttributeValue(pValue, aValue2) && aFormula.isEmpty())
+ aValue2 >>= aFormula;
+ }
+ aValuesRange[nKeyTime] = aValue1;
+ }
+ }
+ }
+ pIter = pAtom->findNextChildAtom(DFF_msofbtAnimKeyTime, pIter);
+ }
+
+#ifdef DBG_ANIM_LOG
+ dump( " keyTimes=\"" );
+ for( int i=0; i<nKeyTimes; ++i )
+ dump( "%f;", aKeyTimes[i] );
+
+ if( !aFormula.isEmpty() )
+ {
+ dump( "formula=\"%s", aFormula );
+ }
+
+ dump( "\" values=\"" );
+ double nVal;
+ OUString aStr;
+ for( int i=0; i<nKeyTimes; ++i )
+ {
+ if( i != 0 )
+ dump( ";" );
+
+ if( aValues[i] >>= aStr )
+ dump( "%s",
+ OUStringToOString( aStr,
+ RTL_TEXTENCODING_ASCII_US ).getStr() );
+ else if( aValues[i] >>= nVal )
+ dump( "%f", nVal );
+ else
+ {
+ ValuePair aValuePair;
+
+ if( aValues[i] >>= aValuePair )
+ {
+ if( aValuePair.First >>= aStr )
+ dump( "%s",
+ OUStringToOString( aStr,
+ RTL_TEXTENCODING_ASCII_US ).getStr() );
+ else if( aValuePair.First >>= nVal )
+ dump( "%f", nVal );
+ else
+ dump( "%X", (sal_Int64)&aValuePair.First );
+
+ if( aValuePair.Second >>= aStr )
+ dump( ",%s",
+ OUStringToOString( aStr,
+ RTL_TEXTENCODING_ASCII_US ).getStr() );
+ else if( aValuePair.Second >>= nVal )
+ dump( ",%f", nVal );
+ else
+ dump( ",%X", (sal_Int64)&aValuePair.Second );
+ }
+ }
+ }
+ dump( "\"" );
+#endif
+ if( bToNormalize && nKeyTimes >= 2 )
+ {
+ // if TimeAnimationValueList contains time -1000, key points must be evenly distributed between 0 and 1 ([MS-PPT] 2.8.31)
+ for( int nKeyTime = 0; nKeyTime < nKeyTimes; ++nKeyTime )
+ {
+ aKeyTimesRange[nKeyTime] = static_cast<double>(nKeyTime) / static_cast<double>(nKeyTimes - 1);
+ }
+ }
+
+ if (aValues.getLength() != aKeyTimes.getLength())
+ throw css::io::WrongFormatException();
+
+ xAnim->setKeyTimes( aKeyTimes );
+ xAnim->setValues( aValues );
+ xAnim->setFormula( aFormula );
+}
+
+bool AnimationImporter::importAttributeValue( const Atom* pAtom, Any& rAny )
+{
+ DBG_ASSERT( pAtom && pAtom->getType() == DFF_msofbtAnimAttributeValue, "invalid call to ppt::AnimationImporter::importAttributeValue()!" );
+
+ bool bOk = false;
+
+ if( pAtom && pAtom->seekToContent() )
+ {
+ sal_uInt32 nRecLen = pAtom->getLength();
+ if ( nRecLen >= 1 )
+ {
+ sal_Int8 nType(0);
+ mrStCtrl.ReadSChar( nType );
+ switch( nType )
+ {
+ case DFF_ANIM_PROP_TYPE_BYTE :
+ {
+ if ( nRecLen == 2 )
+ {
+ sal_uInt8 nByte(0);
+ mrStCtrl.ReadUChar( nByte );
+ rAny <<= nByte;
+
+ bOk = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_PROP_TYPE_INT32 :
+ {
+ if ( nRecLen == 5 )
+ {
+ sal_uInt32 nInt32(0);
+ mrStCtrl.ReadUInt32( nInt32 );
+ rAny <<= nInt32;
+
+ bOk = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_PROP_TYPE_FLOAT:
+ {
+ if( nRecLen == 5 )
+ {
+ float fFloat(0.0);
+ mrStCtrl.ReadFloat( fFloat );
+ rAny <<= static_cast<double>(fFloat);
+
+ bOk = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_PROP_TYPE_UNISTRING :
+ {
+ if ( ( nRecLen & 1 ) && ( nRecLen > 1 ) )
+ {
+ OUString aOUString = SvxMSDffManager::MSDFFReadZString( mrStCtrl, nRecLen - 1, true );
+ rAny <<= aOUString;
+
+ bOk = true;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ DBG_ASSERT( bOk, "invalid value inside ppt::AnimationImporter::importAttributeValue()!" );
+ return bOk;
+}
+
+void AnimationImporter::importAnimationEvents( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ DBG_ASSERT( xNode.is() && pAtom, "invalid call to ppt::AnimationImporter::importAnimationEvents()!" );
+
+ Any aBegin, aEnd, aNext, aPrev;
+
+ const Atom* pEventAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimEvent );
+ while( pEventAtom )
+ {
+ Any* pEvents = nullptr;
+
+ switch( pEventAtom->getInstance() )
+ {
+ case 1: pEvents = &aBegin; break;
+ case 2: pEvents = &aEnd; break;
+ case 3: pEvents = &aNext; break;
+ case 4: pEvents = &aPrev; break;
+ }
+
+ if( pEvents )
+ {
+ Event aEvent;
+ aEvent.Trigger = EventTrigger::NONE;
+ aEvent.Repeat = 0;
+
+ const Atom* pChildAtom = pEventAtom->findFirstChildAtom();
+
+ while( pChildAtom && pChildAtom->seekToContent() )
+ {
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtAnimTrigger:
+ {
+ sal_Int32 nU1(0), nTrigger(0), nU3(0), nBegin(0);
+ mrStCtrl.ReadInt32( nU1 );
+ mrStCtrl.ReadInt32( nTrigger );
+ mrStCtrl.ReadInt32( nU3 );
+ mrStCtrl.ReadInt32( nBegin );
+
+ switch( nTrigger )
+ {
+ case 0: aEvent.Trigger = EventTrigger::NONE; break;
+ case 1: aEvent.Trigger = EventTrigger::ON_BEGIN; break;
+ case 2: aEvent.Trigger = EventTrigger::ON_END; break;
+ case 3: aEvent.Trigger = EventTrigger::BEGIN_EVENT; break;
+ case 4: aEvent.Trigger = EventTrigger::END_EVENT; break;
+ case 5: aEvent.Trigger = EventTrigger::ON_CLICK; break;
+ case 6: aEvent.Trigger = EventTrigger::ON_DBL_CLICK; break;
+ case 7: aEvent.Trigger = EventTrigger::ON_MOUSE_ENTER; break;
+ case 8: aEvent.Trigger = EventTrigger::ON_MOUSE_LEAVE; break;
+ case 9: aEvent.Trigger = EventTrigger::ON_NEXT; break;
+ case 10: aEvent.Trigger = EventTrigger::ON_PREV; break;
+ case 11: aEvent.Trigger = EventTrigger::ON_STOP_AUDIO; break;
+ }
+
+ if( (nBegin != 0) || (aEvent.Trigger == EventTrigger::NONE) )
+ aEvent.Offset = (nBegin == -1) ? Any( Timing_INDEFINITE ) : Any( nBegin / 1000.0 );
+ }
+ break;
+ case DFF_msofbtAnimateTargetElement:
+ {
+ sal_Int16 nSubType;
+ importTargetElementContainer( pChildAtom, aEvent.Source, nSubType );
+ }
+ break;
+ default:
+ {
+ OSL_FAIL("unknown atom inside ppt::AnimationImporter::importAnimationEvents()!");
+ }
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+
+ *pEvents = oox::addToSequence( *pEvents, (aEvent.Trigger == EventTrigger::NONE) ? aEvent.Offset : Any( aEvent ) );
+ }
+
+ pEventAtom = pAtom->findNextChildAtom( DFF_msofbtAnimEvent, pEventAtom );
+ }
+
+ xNode->setBegin( aBegin );
+ xNode->setEnd( aEnd );
+ // TODO: xNode->setNext( aNext );
+ // TODO: xNode->setPrev( aNext );
+
+#ifdef DBG_ANIM_LOG
+ if( aBegin.hasValue() )
+ {
+ dump( " begin=\"" );
+ dump( aBegin );
+ dump( "\"" );
+ }
+
+ if( aEnd.hasValue() )
+ {
+ dump( " end=\"" );
+ dump( aEnd );
+ dump( "\"" );
+ }
+
+ if( aNext.hasValue() )
+ {
+ dump( " next=\"" );
+ dump( aNext );
+ dump( "\"" );
+ }
+
+ if( aPrev.hasValue() )
+ {
+ dump( " prev=\"" );
+ dump( aPrev );
+ dump( "\"" );
+ }
+#endif
+}
+
+void AnimationImporter::importAnimationActions( const Atom* pAtom, const Reference< XAnimationNode >& xNode )
+{
+ DBG_ASSERT( pAtom && xNode.is(), "invalid call to ppt::AnimationImporter::importAnimationActions()!");
+
+ if( !pAtom )
+ return;
+
+ const Atom* pActionAtom = pAtom->findFirstChildAtom( DFF_msofbtAnimAction );
+
+ if( !(pActionAtom && pActionAtom->seekToContent()) )
+ return;
+
+ sal_Int32 nConcurrent(0), nNextAction(0), nEndSync(0), nU4(0), nU5(0);
+ mrStCtrl.ReadInt32( nConcurrent );
+ mrStCtrl.ReadInt32( nNextAction );
+ mrStCtrl.ReadInt32( nEndSync );
+ mrStCtrl.ReadInt32( nU4 );
+ mrStCtrl.ReadInt32( nU5 );
+
+ if( nEndSync == 1 )
+ xNode->setEndSync( Any( AnimationEndSync::ALL ) );
+
+#ifdef DBG_ANIM_LOG
+ dump( " concurrent=\"%s\"", nConcurrent == 0 ? "disabled" : (nConcurrent == 1 ? "enabled" : "unknown") );
+
+ dump( " nextAction=\"%s\"", nNextAction == 0 ? "none" : (nNextAction == 1 ? "seek" : "unknown") );
+
+ if( nEndSync != 0 )
+ {
+ dump( " endSync=\"%s\"", nEndSync == 1 ? "all" : "unknown" );
+ }
+
+ dump( " action_4=\"%#lx\"", nU4 );
+ dump( " action_5=\"%#lx\"", nU5 );
+#endif
+}
+
+void AnimationImporter::importTargetElementContainer( const Atom* pAtom, Any& rTarget, sal_Int16& rSubType )
+{
+ rSubType = ShapeAnimationSubType::AS_WHOLE;
+ sal_Int32 nRefMode = -1;
+
+ DBG_ASSERT( pAtom && (pAtom->getType() == DFF_msofbtAnimateTargetElement), "invalid call to ppt::AnimationImporter::importTargetElementContainer()!" );
+ if( !pAtom )
+ return;
+
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+ while( pChildAtom && pChildAtom->seekToContent() )
+ {
+ switch( pChildAtom->getType() )
+ {
+ case DFF_msofbtAnimReference:
+ {
+ sal_Int32 nRefType(0), nRefId(0);
+ sal_Int32 begin(0), end(0);
+ mrStCtrl.ReadInt32( nRefMode );
+ mrStCtrl.ReadInt32( nRefType );
+ mrStCtrl.ReadInt32( nRefId );
+ mrStCtrl.ReadInt32( begin );
+ mrStCtrl.ReadInt32( end );
+
+ switch( nRefType )
+ {
+ case 1: // shape
+ {
+ SdrObject* pSdrObject = mpPPTImport->getShapeForId( nRefId );
+ if( pSdrObject == nullptr )
+ break;
+
+ rTarget <<= pSdrObject->getUnoShape();
+
+ switch( nRefMode )
+ {
+ case 6: rSubType = ShapeAnimationSubType::ONLY_BACKGROUND; break;
+ case 8: rSubType = ShapeAnimationSubType::ONLY_TEXT; break;
+ case 2: // one paragraph
+ {
+ if((begin == -1) && (end == -1))
+ break;
+
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pSdrObject );
+ if(!pTextObj)
+ break;
+
+ const OutlinerParaObject* pOPO = pTextObj->GetOutlinerParaObject();
+ if( pOPO == nullptr )
+ break;
+
+ const EditTextObject& rEditTextObject = pOPO->GetTextObject();
+
+ const sal_Int32 nParaCount = rEditTextObject.GetParagraphCount();
+
+ sal_Int32 nPara = 0;
+
+ while( (nPara < nParaCount) && (begin > 0) )
+ {
+ sal_Int32 nParaLength = rEditTextObject.GetText( nPara ).getLength() + 1;
+ begin -= nParaLength;
+ end -= nParaLength;
+ nPara++;
+ }
+
+ if( nPara < nParaCount )
+ {
+ ParagraphTarget aParaTarget;
+ rTarget >>= aParaTarget.Shape;
+ /* FIXME: Paragraph should be sal_Int32 as well */
+ aParaTarget.Paragraph = static_cast<sal_Int16>(nPara);
+ rTarget <<= aParaTarget;
+
+ rSubType = ShapeAnimationSubType::ONLY_TEXT;
+ dump( " paragraph %d,", nPara);
+ dump( " %d characters", end );
+ }
+ }
+ }
+ }
+ break;
+
+ case 2: // sound
+ {
+ OUString aSoundURL( mpPPTImport->ReadSound( nRefId ) );
+ rTarget <<= aSoundURL;
+ dump( " srcRef=\"%s\"", aSoundURL );
+ }
+ break;
+ case 3: // audio object
+ case 4: // video object
+ {
+ SdrObject* pSdrObject = mpPPTImport->getShapeForId( nRefId );
+ if( pSdrObject == nullptr )
+ break;
+
+ rTarget <<= pSdrObject->getUnoShape();
+ }
+ break;
+ default:
+ OSL_FAIL("unknown reference type");
+ }
+
+ }
+ break;
+ case 0x2b01:
+ {
+ sal_Int32 nU1;
+ mrStCtrl.ReadInt32( nU1 );
+ }
+ break;
+ default:
+ OSL_FAIL("unknown atom inside ppt::AnimationImporter::importTargetElementContainer()!");
+ break;
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+
+ }
+}
+
+void AnimationImporter::importPropertySetContainer( const Atom* pAtom, PropertySet& rSet )
+{
+ DBG_ASSERT( pAtom && (pAtom->getType() == DFF_msofbtAnimPropertySet), "invalid call to ppt::AnimationImporter::importPropertySetContainer()!" );
+
+ if( !pAtom )
+ return;
+
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+ while( pChildAtom )
+ {
+ if( pChildAtom->getType() == DFF_msofbtAnimAttributeValue )
+ {
+ Any aAny;
+ (void)importAttributeValue( pChildAtom, aAny );
+ rSet.maProperties[ pChildAtom->getInstance() ] = aAny;
+ }
+ else
+ {
+ OSL_FAIL("unknown atom inside ppt::AnimationImporter::importPropertySetContainer()!");
+ }
+
+ pChildAtom = Atom::findNextChildAtom( pChildAtom );
+ }
+}
+
+#ifdef DBG_ANIM_LOG
+void AnimationImporter::dump_atom_header( const Atom* pAtom, bool bOpen, bool bAppend )
+{
+ if( pAtom )
+ {
+ const char* pTitle;
+
+ switch( pAtom->getType() )
+ {
+ case DFF_msofbtAnimEvent: pTitle = "AnimEvent"; break;
+ case DFF_msofbtAnimTrigger: pTitle = "AnimTrigger"; break;
+ case DFF_msofbtAnimateMotion: pTitle = "AnimateMotion"; break;
+ case DFF_msofbtAnimPropertySet: pTitle = "AnimPropertySet"; break;
+ case DFF_msofbtAnimateAttributeNames: pTitle = "AnimAttributeName"; break;
+ case DFF_msofbtAnimAttributeValue: pTitle = "AnimAttributeValue"; break;
+ case DFF_msofbtAnimGroup: pTitle = "AnimGroup"; break;
+ case DFF_msofbtAnimNode: pTitle = "AnimNode"; break;
+ case DFF_msofbtAnimValue: pTitle = "AnimValue"; break;
+ case DFF_msofbtAnimateFilter: pTitle = "animateFilter"; break;
+ case DFF_msofbtAnimate: pTitle = "animate"; break;
+ case DFF_msofbtAnimateSet: pTitle = "set"; break;
+ case DFF_msofbtAnimKeyTime: pTitle = "AnimKeyTime"; break;
+ case DFF_msofbtAnimKeyPoints: pTitle = "AnimKeyPoints"; break;
+ case DFF_msofbtAnimReference: pTitle = "AnimReference"; break;
+ case DFF_msofbtAnimateTargetElement: pTitle = "AnimTargetElementContainer"; break;
+ case DFF_msofbtAnimAction: pTitle = "AnimAction"; break;
+ case DFF_msofbtAnimCommand: pTitle = "AnimCommand"; break;
+ case DFF_msofbtAnimateTarget: pTitle = "TransformationTarget"; break;
+ case DFF_msofbtAnimateTargetSettings: pTitle = "TransformationTargetSettings"; break;
+ case DFF_msofbtAnimIteration: pTitle = "iterate"; break;
+ case DFF_msofbtAnimateColorData: pTitle = "colorData"; break;
+ case DFF_msofbtAnimateScaleData: pTitle = "scaleData"; break;
+ case DFF_msofbtAnimateSetData: pTitle = "setData"; break;
+
+ default:
+ {
+ static char buffer[128];
+ sprintf( buffer, "unknown_%#x", pAtom->getType() );
+ pTitle = buffer;
+ }
+ }
+
+ if( bOpen )
+ {
+ fprintf(mpFile, "<%s", pTitle );
+
+ fprintf(mpFile, " instance=\"%hu\"%s",
+ pAtom->getInstance(),
+ bAppend ? "" : ">\n");
+ }
+ else
+ {
+ if( bAppend )
+ fprintf(mpFile,"/>\n");
+ else
+ fprintf(mpFile, "</%s>\n", pTitle );
+ }
+ }
+}
+
+void AnimationImporter::dump( sal_uInt32 nLen, bool bNewLine )
+{
+ char * faul = "0123456789abcdef";
+
+ sal_uInt32 i = 0;
+ int b = 0;
+ char nData;
+
+ for( i = 0; i < nLen; i++ )
+ {
+ mrStCtrl.ReadChar(nData);
+
+ fprintf( mpFile, "%c%c ", faul[ (nData >> 4) & 0x0f ], faul[ nData & 0x0f ] );
+
+ b++;
+ if( bNewLine && (b == 32) )
+ {
+ fprintf(mpFile,"\n");
+ b = 0;
+ }
+ }
+ if( (b != 0) && bNewLine )
+ fprintf(mpFile,"\n");
+}
+
+void AnimationImporter::dump_atom( const Atom* pAtom, bool bNewLine )
+{
+ if( pAtom )
+ {
+ if( pAtom->isContainer() )
+ {
+ const Atom* pChildAtom = pAtom->findFirstChildAtom();
+ while( pChildAtom )
+ {
+ if( pChildAtom->getType() == DFF_msofbtAnimAttributeValue )
+ {
+ fprintf(mpFile, "<attributeValue instance=\"%hu\"", pChildAtom->getInstance() );
+
+ Any aValue;
+ if( importAttributeValue( pChildAtom, aValue ) )
+ {
+ sal_Int32 nInt;
+ OUString aString;
+ double fDouble;
+
+ if( aValue >>= nInt )
+ {
+ fprintf(mpFile, " value=\"%" SAL_PRIdINT32 "\"", nInt );
+ }
+ else if( aValue >>= aString )
+ {
+ fprintf(mpFile, " value=\"%s\"",
+ OUStringToOString(aString,
+ RTL_TEXTENCODING_UTF8).getStr());
+ }
+ else if( aValue >>= fDouble )
+ {
+ fprintf(mpFile, " value=\"%g\"", fDouble );
+ }
+ }
+ else
+ {
+ if( pChildAtom->seekToContent() )
+ {
+ fprintf(mpFile, " value=\"" );
+ dump_atom( pChildAtom, false );
+ fprintf(mpFile, "\"");
+ }
+ }
+
+ fprintf(mpFile, "/>\n" );
+ }
+ else
+ {
+ dump_atom_header( pChildAtom, true, pChildAtom->getType() == DFF_msofbtAnimAttributeValue );
+ dump_atom( pChildAtom );
+ dump_atom_header( pChildAtom, false, pChildAtom->getType() == DFF_msofbtAnimAttributeValue );
+ }
+
+ pChildAtom = Atom::findNextChildAtom(pChildAtom);
+ }
+ }
+ else if( pAtom->seekToContent() )
+ {
+ dump( pAtom->getLength(), bNewLine );
+ }
+ }
+}
+
+void AnimationImporter::dump_anim_group( const Atom* pAtom, const AnimationNode& rNode, const PropertySet& rSet, bool bOpen )
+{
+ fprintf( mpFile, bOpen ? "<" : "</" );
+
+ switch( rNode.mnGroupType )
+ {
+ case mso_Anim_GroupType_PAR:
+ fprintf( mpFile, "par" );
+ break;
+ case mso_Anim_GroupType_SEQ:
+ fprintf( mpFile, "seq" );
+ break;
+ case mso_Anim_GroupType_NODE:
+ switch( rNode.mnNodeType )
+ {
+ case mso_Anim_Behaviour_FILTER:
+ fprintf( mpFile, "animateFilter" );
+ break;
+ case mso_Anim_Behaviour_ANIMATION:
+ if( pAtom->hasChildAtom( DFF_msofbtAnimateSet ) )
+ fprintf( mpFile, "set" );
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateColor ) )
+ fprintf( mpFile, "animateColor" );
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateScale ) )
+ fprintf( mpFile, "animateScale" );
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateRotation ) )
+ fprintf( mpFile, "animateRotation" );
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimateMotion ) )
+ fprintf( mpFile, "animateMotion" );
+ else if( pAtom->hasChildAtom( DFF_msofbtAnimCommand ) )
+ fprintf( mpFile, "command" );
+ else
+ fprintf( mpFile, "animation" );
+ break;
+ default:
+ {
+ fprintf( mpFile, "unknown_node_%#lx", rNode.mnNodeType );
+ }
+ break;
+ }
+ break;
+ case mso_Anim_GroupType_MEDIA:
+ fprintf( mpFile, "media" );
+ break;
+ default:
+ fprintf( mpFile, "unknown_group_%#lx", rNode.mnGroupType );
+ break;
+ }
+
+ if( bOpen )
+ {
+ dump( rNode );
+ dump( rSet );
+ }
+
+ fprintf(mpFile,">\n");
+}
+
+void AnimationImporter::dump( const AnimationNode& rNode )
+{
+ // dump animation node
+ if( rNode.mnRestart != 0 )
+ {
+ fprintf(mpFile," restart=\"%s\"",
+ rNode.mnRestart == 1 ? "always" : (rNode.mnRestart == 2 ? "whenOff" : (rNode.mnRestart == 3 ? "never" : "unknown")) );
+ }
+
+ if( rNode.mnFill )
+ {
+ fprintf(mpFile," fill=\"%s\"",
+ rNode.mnFill == 1 ? "remove" : (rNode.mnFill == 3 ? "hold" : (rNode.mnFill == 2 ? "freeze" : "unknown")) );
+ }
+
+ if( rNode.mnDuration > 0 )
+ {
+ double fSeconds = rNode.mnDuration;
+ fSeconds /= 1000.0;
+ fprintf(mpFile, " dur=\"%g\"", fSeconds);
+ }
+ else if( rNode.mnDuration < 0 )
+ {
+ fprintf(mpFile, " dur=\"indefinite\"" );
+ }
+
+ if( rNode.mnU1 ) fprintf(mpFile," u1=\"%#lx\"", rNode.mnU1);
+ if( rNode.mnU3 ) fprintf(mpFile," u3=\"%#lx\"", rNode.mnU3);
+ if( rNode.mnU4 ) fprintf(mpFile," u4=\"%#lx\"", rNode.mnU4);
+}
+
+void AnimationImporter::dump( Any& rAny )
+{
+ Sequence< Any > aSeq;
+ sal_Int32 nInt;
+ double fDouble;
+ OUString aString;
+ sal_Bool bBool;
+ Event aEvent;
+ Timing aTiming;
+
+ if( rAny >>= aSeq )
+ {
+ const sal_Int32 nSize = aSeq.getLength();
+ sal_Int32 nIndex = 0;
+ while( nIndex < nSize )
+ {
+ dump( aSeq[nIndex++] );
+ if(nIndex < nSize)
+ fprintf( mpFile, "," );
+ }
+ }
+ else if( rAny >>= aString )
+ {
+ fprintf( mpFile, "%s", OUStringToOString(aString,
+ RTL_TEXTENCODING_UTF8).getStr() );
+ }
+ else if( rAny >>= nInt )
+ {
+ fprintf( mpFile, "%" SAL_PRIdINT32, nInt );
+ }
+ else if( rAny >>= bBool )
+ {
+ fprintf( mpFile, "%s", bBool ? "true" : "false" );
+ }
+ else if( rAny >>= fDouble )
+ {
+ fprintf( mpFile, "%g", fDouble );
+ }
+ else if( rAny >>= aTiming )
+ {
+ fprintf( mpFile, "%s", aTiming == (Timing_INDEFINITE) ? "indefinite" : "media" );
+ }
+ else if( rAny >>= aEvent )
+ {
+ if( aEvent.Trigger != EventTrigger::NONE )
+ {
+ static const char* triggers[] =
+ {
+ "none","onbegin","onend","begin",
+ "end","onclick","ondoubleclick","onmouseenter",
+ "onmouseleave","onpptnext","onpptprev","onstopaudio"
+ };
+
+ if( aEvent.Source.hasValue() )
+ {
+ dump_target( aEvent.Source );
+ dump( "." );
+ }
+
+ dump( triggers[ aEvent.Trigger ] );
+ }
+
+ if( aEvent.Offset.hasValue() )
+ {
+ double fOffset;
+ if( aEvent.Offset >>= fOffset )
+ fprintf( mpFile, "%g", fOffset );
+ else
+ dump( "indefinite" );
+ }
+ }
+}
+
+void AnimationImporter::dump( const PropertySet& rSet )
+{
+ // dump property set
+
+ for( const auto& rProp : rSet.maProperties )
+ {
+ bool bKnown = false;
+
+ const sal_Int32 nInstance = rProp.first;
+ Any aAny( rProp.second );
+
+ switch ( nInstance )
+ {
+ case DFF_ANIM_COLORSPACE:
+ {
+ sal_Int32 nColorSpace;
+ if( aAny >>= nColorSpace )
+ {
+ fprintf( mpFile, " colorSpace=\"%s\"", (nColorSpace == 0) ? "rgb" : (nColorSpace == 1) ? "hsl" : "unknown" );
+ bKnown = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_DIRECTION:
+ {
+ sal_Bool bDirection;
+ if( aAny >>= bDirection )
+ {
+ fprintf( mpFile, " direction=\"%s\"", bDirection ? "cclockwise" : "clockwise" );
+ bKnown = true;
+ }
+ else
+ {
+ sal_Int32 nMasterRel;
+ if( aAny >>= nMasterRel )
+ {
+ fprintf( mpFile, " direction=\"%s\"", nMasterRel == 0 ? "sameClick" : ( nMasterRel == 2 ? "nextClick" : "lastClick" ) );
+ bKnown = true;
+ }
+ }
+ }
+ break;
+
+ case DFF_ANIM_OVERRIDE: // TODO
+ {
+ sal_Int32 nOverride;
+ if( aAny >>= nOverride )
+ {
+ fprintf( mpFile, " override=\"%s\"", (nOverride == 1) ? "childStyle" : (nOverride == 0) ? "normal" : "unknown" );
+ bKnown = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_PATH_EDIT_MODE:
+ {
+ sal_Bool bPathEditMode;
+ if( aAny >>= bPathEditMode )
+ {
+ fprintf( mpFile, " pptPathEditMode=\"%s\"", bPathEditMode ? "relative" : "fixed" );
+ bKnown = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_PRESET_ID :
+ {
+ sal_Int32 nPresetId ;
+ if( aAny >>= nPresetId )
+ {
+ fprintf(mpFile, " presetid=\"%" SAL_PRIdINT32 "\"", nPresetId );
+ bKnown = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_PRESET_SUB_TYPE :
+ {
+ sal_Int32 nPointsType ;
+ if( aAny >>= nPointsType )
+ {
+ fprintf(mpFile, " presetSubType=\"%" SAL_PRIdINT32 "\"", nPointsType );
+ bKnown = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_PRESET_CLASS :
+ {
+ sal_Int32 nPresetClass;
+ if ( aAny >>= nPresetClass )
+ {
+ const char* pMode;
+ switch( nPresetClass )
+ {
+ case DFF_ANIM_PRESS_CLASS_USER_DEFINED: pMode = "userdefined"; break;
+ case DFF_ANIM_PRESS_CLASS_ENTRANCE: pMode = "entrance"; break;
+ case DFF_ANIM_PRESS_CLASS_EXIT: pMode = "exit"; break;
+ case DFF_ANIM_PRESS_CLASS_EMPHASIS: pMode = "emphasis"; break;
+ case DFF_ANIM_PRESS_CLASS_MOTIONPATH: pMode = "motionpath"; break;
+ case DFF_ANIM_PRESS_CLASS_OLE_ACTION: pMode = "oleaction"; break;
+ case DFF_ANIM_PRESS_CLASS_MEDIACALL: pMode = "mediacall"; break;
+ default:
+ pMode = nullptr;
+ break;
+ }
+
+ if (pMode)
+ fprintf(mpFile, " class=\"%s\"", pMode);
+ else
+ fprintf(mpFile, " class =\"%" SAL_PRIdINT32 "\"", nPresetClass);
+ bKnown = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_NODE_TYPE :
+ {
+ sal_Int32 nNodeType;
+ if ( aAny >>= nNodeType )
+ {
+ const char* pNode;
+ switch( nNodeType )
+ {
+ case DFF_ANIM_NODE_TYPE_ON_CLICK: pNode = "onclick"; break;
+ case DFF_ANIM_NODE_TYPE_WITH_PREVIOUS: pNode = "withprevious"; break;
+ case DFF_ANIM_NODE_TYPE_AFTER_PREVIOUS: pNode = "afterprevious"; break;
+ case DFF_ANIM_NODE_TYPE_MAIN_SEQUENCE: pNode = "mainsequence"; break;
+ case DFF_ANIM_NODE_TYPE_TIMING_ROOT: pNode = "timingroot"; break;
+ case DFF_ANIM_NODE_TYPE_INTERACTIVE_SEQ:pNode = "interactivesequence"; break;
+ default :
+ {
+ static char buffer[128];
+ sprintf( buffer, "%" SAL_PRIdINT32, nNodeType );
+ pNode = buffer;
+ }
+ break;
+ }
+
+ fprintf(mpFile, " nodeType=\"%s\"", pNode);
+ bKnown = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_GROUP_ID:
+ {
+ sal_Int32 nGroupId;
+ if ( aAny >>= nGroupId )
+ {
+ fprintf( mpFile, " groupId=\"%" SAL_PRIdINT32 "\"", nGroupId );
+ bKnown = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_ID:
+ {
+ OUString aString;
+ if( aAny >>= aString )
+ {
+ fprintf( mpFile, " id=\"%s\"",
+ OUStringToOString(aString,
+ RTL_TEXTENCODING_UTF8).getStr() );
+ bKnown = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_EVENT_FILTER:
+ {
+ OUString aString;
+ if( aAny >>= aString )
+ {
+ fprintf( mpFile, " eventFilter=\"%s\"",
+ OUStringToOString(aString,
+ RTL_TEXTENCODING_UTF8).getStr() );
+ bKnown = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_ENDAFTERSLIDE:
+ {
+ sal_Int32 nEndAfterSlide;
+ if( aAny >>= nEndAfterSlide )
+ {
+ fprintf(mpFile, " endAfterSlide=\"%" SAL_PRIdINT32 "\"", nEndAfterSlide );
+ bKnown = true;
+ }
+ }
+
+ case DFF_ANIM_TIMEFILTER:
+ {
+ OUString aString;
+ if( aAny >>= aString )
+ {
+ fprintf( mpFile, " timeFilter=\"%s\"",
+ OUStringToOString(aString,
+ RTL_TEXTENCODING_UTF8).getStr() );
+ bKnown = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_RUNTIMECONTEXT:
+ {
+ OUString aString;
+ if( aAny >>= aString )
+ {
+ fprintf( mpFile, " runtimeContext=\"%s\"",
+ OUStringToOString(aString,
+ RTL_TEXTENCODING_UTF8).getStr() );
+ bKnown = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_VOLUME:
+ {
+ double fVolume(0.0);
+ if( aAny >>= fVolume )
+ {
+ fprintf( mpFile, " volume=\"%g%%\"", (double)(fVolume * 100.0) );
+ bKnown = true;
+ }
+ }
+ break;
+
+ case DFF_ANIM_AFTEREFFECT:
+ {
+ sal_Bool bAfterEffect;
+ if( aAny >>= bAfterEffect )
+ {
+ fprintf( mpFile, "afterEffect=\"%s\"", bAfterEffect ? "true" : "false" );
+ bKnown = true;
+ }
+ }
+ break;
+
+ }
+
+ if( !bKnown )
+ {
+ fprintf( mpFile, " unknown_%" SAL_PRIdINT32 "=\"", nInstance );
+ dump( aAny );
+ fprintf( mpFile, "\"" );
+ }
+ }
+}
+
+void AnimationImporter::dump_target( Any& rAny )
+{
+ Any aSource, aSourceData;
+ Sequence< Any > aSeq;
+ if( rAny >>= aSeq )
+ {
+ if( aSeq.getLength() >= 1 ) aSource = aSeq[0];
+ if( aSeq.getLength() >= 2 ) aSourceData = aSeq[1];
+ }
+ else
+ {
+ aSource = rAny;
+ }
+
+ Reference< XShape > xShape;
+ aSource >>= xShape;
+ if( xShape.is() )
+ {
+ OUString aStr( xShape->getShapeType() );
+ dump( aStr );
+
+ if( aSourceData.hasValue() )
+ {
+ dump( "(" );
+ dump( aSourceData );
+ dump( ")" );
+ }
+ }
+}
+
+void AnimationImporter::dump( const char * pText )
+{
+ fprintf( mpFile, "%s", pText );
+}
+
+void AnimationImporter::dump( const OUString& rString )
+{
+ fprintf( mpFile, OUStringToOString(rString,
+ RTL_TEXTENCODING_UTF8).getStr() );
+}
+
+void AnimationImporter::dump( const char * pText, sal_Int64 nInt )
+{
+ fprintf( mpFile, pText, nInt );
+}
+
+void AnimationImporter::dump( const char * pText, sal_Int32 nInt )
+{
+ fprintf( mpFile, pText, nInt );
+}
+
+void AnimationImporter::dump( const char * pText, double fDouble )
+{
+ fprintf( mpFile, pText, fDouble );
+}
+
+void AnimationImporter::dump( const char * pText, const char * pText2 )
+{
+ fprintf( mpFile, pText, pText2 );
+}
+
+void AnimationImporter::dump( const char * pText, const OUString& rString )
+{
+ fprintf( mpFile, pText, OUStringToOString(rString,
+ RTL_TEXTENCODING_UTF8).getStr() );
+}
+
+#else
+
+void AnimationImporter::dump_atom_header( const Atom* , bool , bool )
+{
+}
+
+void AnimationImporter::dump_atom( const Atom* , bool )
+{
+}
+
+void AnimationImporter::dump_target( css::uno::Any& )
+{
+}
+
+void AnimationImporter::dump( css::uno::Any& )
+{
+}
+
+void AnimationImporter::dump( const PropertySet& )
+{
+}
+
+void AnimationImporter::dump( const AnimationNode& )
+{
+}
+
+void AnimationImporter::dump( const char * )
+{
+}
+
+void AnimationImporter::dump( const char * , sal_Int32 )
+{
+}
+
+void AnimationImporter::dump( const char * , double )
+{
+}
+
+void AnimationImporter::dump( const char * , const char * )
+{
+}
+
+void AnimationImporter::dump( const char * , std::u16string_view )
+{
+}
+
+#endif
+
+} // namespace ppt;
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/ppt/pptinanimations.hxx b/sd/source/filter/ppt/pptinanimations.hxx
new file mode 100644
index 000000000..ed79144b9
--- /dev/null
+++ b/sd/source/filter/ppt/pptinanimations.hxx
@@ -0,0 +1,115 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Reference.hxx>
+
+#include <vector>
+#include <animations.hxx>
+
+#ifdef DBG_ANIM_LOG
+#include <stdio.h>
+#endif
+
+namespace com::sun::star::animations { class XAnimationNode; }
+namespace com::sun::star::drawing { class XDrawPage; }
+namespace ppt { struct AnimationNode; }
+
+class DffRecordHeader;
+class SvStream;
+class ImplSdPPTImport;
+
+namespace ppt
+{
+class PropertySet;
+class Atom;
+
+class AnimationImporter
+{
+public:
+ AnimationImporter( ImplSdPPTImport* pPPTImport, SvStream& rStCtrl );
+
+ int import( const css::uno::Reference< css::drawing::XDrawPage >& xPage, const DffRecordHeader& rProgTagContentHd );
+
+private:
+ int importAnimationContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xParent );
+ int importTimeContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ int importAnimationNodeContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+
+ void importAnimateSetContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void importAnimateFilterContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void importAnimateContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void importAnimateScaleContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void importAnimateColorContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void importAnimateRotationContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void importAnimateMotionContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void importCommandContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ int importAudioContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+
+ void importAnimationEvents( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void importAnimationValues( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void importAnimationActions( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void importAnimateAttributeTargetContainer( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+
+ void importAnimateKeyPoints( const Atom* pAtom, const css::uno::Reference< css::animations::XAnimationNode >& xNode );
+ void importPropertySetContainer( const Atom* pAtom,PropertySet& rSet );
+ bool importAttributeValue( const Atom* pAtom, css::uno::Any& rAny );
+ void importAttributeNamesContainer( const Atom* pAtom, OUString& rAttributeNames );
+ void importTargetElementContainer( const Atom* pAtom, css::uno::Any& rTarget, sal_Int16& nSubType );
+
+ static void fillNode( css::uno::Reference< css::animations::XAnimationNode > const & xTiming, const AnimationNode& rNode, const PropertySet& rSet );
+ static css::uno::Reference< css::animations::XAnimationNode > createNode( const Atom* pAtom, const AnimationNode& rNode );
+
+ bool convertAnimationNode( const css::uno::Reference< css::animations::XAnimationNode >& xNode, const css::uno::Reference< css::animations::XAnimationNode >& xParent );
+ css::uno::Any implGetColorAny( sal_Int32 nMode, sal_Int32 nA, sal_Int32 nB, sal_Int32 nC );
+ static sal_Int16 implGetColorSpace( sal_Int32 nMode, sal_Int32 nA, sal_Int32 nB, sal_Int32 nC );
+
+private:
+ css::uno::Reference< css::animations::XAnimationNode > mxRootNode;
+
+ ImplSdPPTImport* mpPPTImport;
+ SvStream& mrStCtrl;
+
+ std::vector< sd::AfterEffectNode > maAfterEffectNodes;
+
+#ifdef DBG_ANIM_LOG
+ FILE * mpFile;
+ void dump_anim_group( const Atom* pAtom, const AnimationNode& rNode, const PropertySet& rSet, bool bOpen );
+ void dump( const OUString& rString );
+ void dump( sal_uInt32 nLen, bool bNewLine = true );
+#endif
+
+ static void dump_atom_header( const Atom* pAtom, bool bOpen, bool bAppend );
+ static void dump_atom( const Atom* pAtom, bool bNewLine = true );
+ static void dump_target( css::uno::Any& rAny );
+ static void dump( css::uno::Any& rAny );
+ static void dump( const PropertySet& rSet );
+ static void dump( const AnimationNode& rNode );
+ static void dump( const char * pText );
+ static void dump( const char * pText, sal_Int32 nInt );
+ void dump( const char * pText, sal_Int64 nInt );
+ static void dump( const char * pText, double fDouble );
+ static void dump( const char * pText, const char * pText2 );
+ static void dump( const char * pText, std::u16string_view rString );
+};
+
+} // namespace ppt
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/ppt/propread.cxx b/sd/source/filter/ppt/propread.cxx
new file mode 100644
index 000000000..c82c0d791
--- /dev/null
+++ b/sd/source/filter/ppt/propread.cxx
@@ -0,0 +1,615 @@
+/* -*- 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 "propread.hxx"
+#include <rtl/tencinfo.h>
+#include <rtl/textenc.h>
+#include <sal/log.hxx>
+#include <o3tl/sorted_vector.hxx>
+#include <osl/diagnose.h>
+#include <memory>
+
+PropEntry::PropEntry( sal_uInt32 nId, const sal_uInt8* pBuf, sal_uInt32 nBufSize ) :
+ mnId ( nId ),
+ mnSize ( nBufSize ),
+ mpBuf ( new sal_uInt8[ nBufSize ] )
+{
+ memcpy( mpBuf.get(), pBuf, nBufSize );
+};
+
+PropEntry::PropEntry( const PropEntry& rProp ) :
+ mnId ( rProp.mnId ),
+ mnSize ( rProp.mnSize ),
+ mpBuf ( new sal_uInt8[ mnSize ] )
+{
+ memcpy( mpBuf.get(), rProp.mpBuf.get(), mnSize );
+};
+
+PropEntry& PropEntry::operator=(const PropEntry& rPropEntry)
+{
+ if ( this != &rPropEntry )
+ {
+ mnId = rPropEntry.mnId;
+ mnSize = rPropEntry.mnSize;
+ mpBuf.reset( new sal_uInt8[ mnSize ] );
+ memcpy( mpBuf.get(), rPropEntry.mpBuf.get(), mnSize );
+ }
+ return *this;
+}
+
+void PropItem::Clear()
+{
+ Seek( STREAM_SEEK_TO_BEGIN );
+ delete[] static_cast<sal_uInt8*>(SwitchBuffer());
+}
+
+static sal_Int32 lcl_getMaxSafeStrLen(sal_uInt32 nSize)
+{
+ nSize -= 1; //Drop NULL terminator
+
+ //If it won't fit in a string, clip it to the max size that does
+ if (nSize > SAL_MAX_INT32)
+ nSize = SAL_MAX_INT32;
+
+ return static_cast< sal_Int32 >( nSize );
+}
+
+bool PropItem::Read( OUString& rString, sal_uInt32 nStringType, bool bAlign )
+{
+ sal_uInt32 nType, nItemPos;
+ bool bRetValue = false;
+
+ nItemPos = Tell();
+
+ if ( nStringType == VT_EMPTY )
+ {
+ nType = VT_NULL; // Initialize in case stream fails.
+ ReadUInt32( nType );
+ }
+ else
+ nType = nStringType & VT_TYPEMASK;
+
+ sal_uInt32 nItemSize(0); // Initialize in case stream fails.
+ ReadUInt32(nItemSize);
+
+ switch( nType )
+ {
+ case VT_LPSTR :
+ {
+ if (nItemSize)
+ {
+ auto nMaxSizePossible = remainingSize();
+ if (nItemSize > nMaxSizePossible)
+ {
+ SAL_WARN("sd.filter", "String of Len " << nItemSize << " claimed, only " << nMaxSizePossible << " possible");
+ nItemSize = nMaxSizePossible;
+ }
+ }
+
+ if (nItemSize)
+ {
+ try
+ {
+ std::unique_ptr<char[]> pString( new char[ nItemSize ] );
+ if ( mnTextEnc == RTL_TEXTENCODING_UCS2 )
+ {
+ nItemSize >>= 1;
+ if ( nItemSize > 1 )
+ {
+ sal_Unicode* pWString = reinterpret_cast<sal_Unicode*>(pString.get());
+ for (sal_uInt32 i = 0; i < nItemSize; ++i)
+ ReadUtf16( pWString[ i ] );
+ rString = OUString(pWString, lcl_getMaxSafeStrLen(nItemSize));
+ }
+ else
+ rString.clear();
+ bRetValue = true;
+ }
+ else
+ {
+ SvMemoryStream::ReadBytes(pString.get(), nItemSize);
+ if ( pString[ nItemSize - 1 ] == 0 )
+ {
+ if ( nItemSize > 1 )
+ rString = OUString(pString.get(), rtl_str_getLength(pString.get()), mnTextEnc);
+ else
+ rString.clear();
+ bRetValue = true;
+ }
+ }
+ }
+ catch( const std::bad_alloc& )
+ {
+ OSL_FAIL( "sd PropItem::Read bad alloc" );
+ }
+ }
+ if ( bAlign )
+ SeekRel( ( 4 - ( nItemSize & 3 ) ) & 3 ); // dword align
+ }
+ break;
+
+ case VT_LPWSTR :
+ {
+ if (nItemSize)
+ {
+ auto nMaxSizePossible = remainingSize() / sizeof(sal_Unicode);
+ if (nItemSize > nMaxSizePossible)
+ {
+ SAL_WARN("sd.filter", "String of Len " << nItemSize << " claimed, only " << nMaxSizePossible << " possible");
+ nItemSize = nMaxSizePossible;
+ }
+ }
+
+ if (nItemSize)
+ {
+ try
+ {
+ std::unique_ptr<sal_Unicode[]> pString( new sal_Unicode[ nItemSize ] );
+ for (sal_uInt32 i = 0; i < nItemSize; ++i)
+ ReadUtf16( pString[ i ] );
+ if ( pString[ nItemSize - 1 ] == 0 )
+ {
+ if ( static_cast<sal_uInt16>(nItemSize) > 1 )
+ rString = OUString(pString.get(), lcl_getMaxSafeStrLen(nItemSize));
+ else
+ rString.clear();
+ bRetValue = true;
+ }
+ }
+ catch( const std::bad_alloc& )
+ {
+ OSL_FAIL( "sd PropItem::Read bad alloc" );
+ }
+ }
+ if ( bAlign && ( nItemSize & 1 ) )
+ SeekRel( 2 ); // dword align
+ }
+ break;
+ }
+ if ( !bRetValue )
+ Seek( nItemPos );
+ return bRetValue;
+}
+
+PropItem& PropItem::operator=( PropItem& rPropItem )
+{
+ if ( this != &rPropItem )
+ {
+ Seek( STREAM_SEEK_TO_BEGIN );
+ delete[] static_cast<sal_uInt8*>(SwitchBuffer());
+
+ mnTextEnc = rPropItem.mnTextEnc;
+ SvMemoryStream::WriteBytes(rPropItem.GetData(), rPropItem.TellEnd());
+ }
+ return *this;
+}
+
+Section::Section( const Section& rSection )
+ : mnTextEnc(rSection.mnTextEnc)
+{
+ for ( int i = 0; i < 16; i++ )
+ aFMTID[ i ] = rSection.aFMTID[ i ];
+ for(const std::unique_ptr<PropEntry>& rEntry : rSection.maEntries)
+ maEntries.push_back(std::make_unique<PropEntry>(*rEntry));
+}
+
+Section::Section( const sal_uInt8* pFMTID ) : mnTextEnc(RTL_TEXTENCODING_MS_1252)
+{
+ for ( int i = 0; i < 16; i++ )
+ aFMTID[ i ] = pFMTID[ i ];
+}
+
+bool Section::GetProperty( sal_uInt32 nId, PropItem& rPropItem )
+{
+ if ( nId )
+ {
+ auto iter = std::find_if(maEntries.begin(), maEntries.end(),
+ [nId](const std::unique_ptr<PropEntry>& rxEntry) { return rxEntry->mnId == nId; });
+
+ if (iter != maEntries.end())
+ {
+ rPropItem.Clear();
+ rPropItem.SetTextEncoding( mnTextEnc );
+ rPropItem.WriteBytes( (*iter)->mpBuf.get(), (*iter)->mnSize );
+ rPropItem.Seek( STREAM_SEEK_TO_BEGIN );
+ return true;
+ }
+ }
+ return false;
+}
+
+void Section::AddProperty( sal_uInt32 nId, const sal_uInt8* pBuf, sal_uInt32 nBufSize )
+{
+ // just a simple id check
+
+ if ( !nId )
+ return;
+ if ( nId == 0xffffffff )
+ nId = 0;
+
+ // do not allow same PropId's, sort
+ auto iter = std::find_if(maEntries.begin(), maEntries.end(),
+ [nId](const std::unique_ptr<PropEntry>& rxEntry) { return rxEntry->mnId >= nId; });
+ if (iter != maEntries.end())
+ {
+ if ( (*iter)->mnId == nId )
+ (*iter).reset(new PropEntry( nId, pBuf, nBufSize ));
+ else
+ maEntries.insert( iter, std::make_unique<PropEntry>( nId, pBuf, nBufSize ));
+ }
+ else
+ {
+ maEntries.push_back( std::make_unique<PropEntry>( nId, pBuf, nBufSize ) );
+ }
+}
+
+void Section::GetDictionary(PropDictionary& rDict)
+{
+ auto iter = std::find_if(maEntries.begin(), maEntries.end(),
+ [](const std::unique_ptr<PropEntry>& rxEntry) { return rxEntry->mnId == 0; });
+
+ if (iter == maEntries.end())
+ return;
+
+ SvMemoryStream aStream( (*iter)->mpBuf.get(), (*iter)->mnSize, StreamMode::READ );
+ aStream.Seek( STREAM_SEEK_TO_BEGIN );
+ sal_uInt32 nDictCount(0);
+ aStream.ReadUInt32( nDictCount );
+ for (sal_uInt32 i = 0; i < nDictCount; ++i)
+ {
+ sal_uInt32 nId(0), nSize(0);
+ aStream.ReadUInt32(nId).ReadUInt32(nSize);
+ if (!aStream.good() || nSize > aStream.remainingSize())
+ break;
+ if (mnTextEnc == RTL_TEXTENCODING_UCS2)
+ nSize >>= 1;
+ if (!nSize)
+ continue;
+ OUString aString;
+ try
+ {
+ if ( mnTextEnc == RTL_TEXTENCODING_UCS2 )
+ {
+ std::unique_ptr<sal_Unicode[]> pWString( new sal_Unicode[nSize] );
+ for (sal_uInt32 j = 0; j < nSize; ++j)
+ aStream.ReadUtf16(pWString[j]);
+ aString = OUString(pWString.get(), lcl_getMaxSafeStrLen(nSize));
+ }
+ else
+ {
+ std::unique_ptr<char[]> pString( new char[nSize] );
+ aStream.ReadBytes(pString.get(), nSize);
+ aString = OUString(pString.get(), lcl_getMaxSafeStrLen(nSize), mnTextEnc);
+ }
+ }
+ catch( const std::bad_alloc& )
+ {
+ OSL_FAIL( "sd Section::GetDictionary bad alloc" );
+ }
+ if (aString.isEmpty())
+ break;
+ rDict.insert( std::make_pair(aString,nId) );
+ }
+}
+
+void Section::Read( SotStorageStream *pStrm )
+{
+ sal_uInt32 nSecOfs = pStrm->Tell();
+ sal_uInt32 nStrmSize = pStrm->remainingSize();
+
+ mnTextEnc = RTL_TEXTENCODING_MS_1252;
+ sal_uInt32 nSecSize(0), nPropCount(0);
+ pStrm->ReadUInt32(nSecSize).ReadUInt32(nPropCount);
+ if (nSecSize > nStrmSize)
+ {
+ SAL_WARN("sd.filter", "Section Len " << nSecSize << " claimed, only " << nStrmSize << " possible");
+ nSecSize = nStrmSize;
+ }
+
+ while (nPropCount--)
+ {
+ sal_uInt32 nPropId(0), nPropOfs(0);
+ pStrm->ReadUInt32(nPropId).ReadUInt32(nPropOfs);
+ if (!pStrm->good())
+ break;
+ auto nCurrent = pStrm->Tell();
+ sal_uInt64 nOffset = nPropOfs + nSecOfs;
+ if (!checkSeek(*pStrm, nOffset))
+ break;
+ if ( nPropId ) // do not read dictionary
+ {
+ sal_uInt32 nPropType(0), nVectorCount(0);
+ pStrm->ReadUInt32(nPropType);
+
+ sal_uInt32 nPropSize = 4;
+ if ( nPropType & VT_VECTOR )
+ {
+ pStrm->ReadUInt32( nVectorCount );
+ nPropType &=~VT_VECTOR;
+ nPropSize += 4;
+ }
+ else
+ nVectorCount = 1;
+
+ bool bVariant = ( nPropType == VT_VARIANT );
+
+ o3tl::sorted_vector<sal_uInt64> aVisitedOffsets;
+
+ for (sal_uInt32 i = 0; nPropSize && i < nVectorCount && pStrm->good(); ++i)
+ {
+ if ( bVariant )
+ {
+ pStrm->ReadUInt32( nPropType );
+ nPropSize += 4;
+ }
+ sal_uInt32 nTemp(0);
+ switch( nPropType )
+ {
+ case VT_UI1 :
+ nPropSize++;
+ break;
+
+ case VT_I2 :
+ case VT_UI2 :
+ case VT_BOOL :
+ nPropSize += 2;
+ break;
+
+ case VT_I4 :
+ case VT_R4 :
+ case VT_UI4 :
+ case VT_ERROR :
+ nPropSize += 4;
+ break;
+
+ case VT_I8 :
+ case VT_R8 :
+ case VT_CY :
+ case VT_UI8 :
+ case VT_DATE :
+ case VT_FILETIME :
+ nPropSize += 8;
+ break;
+
+ case VT_BSTR :
+ pStrm->ReadUInt32( nTemp );
+ nPropSize += ( nTemp + 4 );
+ break;
+
+ case VT_LPSTR :
+ pStrm->ReadUInt32( nTemp );
+ nPropSize += ( nTemp + 4 );
+ break;
+
+ case VT_LPWSTR :
+ {
+ pStrm->ReadUInt32( nTemp );
+ // looks like these are aligned to 4 bytes
+ sal_uInt32 nLength = nPropOfs + nSecOfs + nPropSize + ( nTemp << 1 ) + 4;
+ nPropSize += ( nTemp << 1 ) + 4 + (nLength % 4);
+ }
+ break;
+
+ case VT_BLOB_OBJECT :
+ case VT_BLOB :
+ case VT_CF :
+ pStrm->ReadUInt32( nTemp );
+ nPropSize += ( nTemp + 4 );
+ break;
+
+ case VT_CLSID :
+ case VT_STREAM :
+ case VT_STORAGE :
+ case VT_STREAMED_OBJECT :
+ case VT_STORED_OBJECT :
+ case VT_VARIANT :
+ case VT_VECTOR :
+ default :
+ nPropSize = 0;
+ }
+ if ( nPropSize )
+ {
+ if ( ( nVectorCount - i ) > 1 )
+ {
+ nOffset = nPropOfs + nSecOfs + nPropSize;
+ if (!checkSeek(*pStrm, nOffset))
+ break;
+ // inserts returns false if an equivalent element already existed
+ if (!aVisitedOffsets.insert(nOffset).second)
+ {
+ SAL_WARN("sd.filter", "loop in Section::Read property list");
+ break;
+ }
+ }
+ }
+ else
+ break;
+ }
+ if ( nPropSize )
+ {
+ if ( nPropSize > nStrmSize )
+ {
+ break;
+ }
+ pStrm->Seek( nPropOfs + nSecOfs );
+ // make sure we don't overflow the section size
+ if( nPropSize > nSecSize - nSecOfs )
+ nPropSize = nSecSize - nSecOfs;
+ std::unique_ptr<sal_uInt8[]> pBuf( new sal_uInt8[ nPropSize ] );
+ nPropSize = pStrm->ReadBytes(pBuf.get(), nPropSize);
+ AddProperty( nPropId, pBuf.get(), nPropSize );
+ }
+ if ( nPropId == 1 )
+ {
+ PropItem aPropItem;
+ if ( GetProperty( 1, aPropItem ) )
+ {
+ aPropItem.ReadUInt32( nPropType );
+ if ( nPropType == VT_I2 )
+ {
+ sal_uInt16 nCodePage(0);
+ aPropItem.ReadUInt16(nCodePage);
+
+ if ( nCodePage == 1200 )
+ {
+ mnTextEnc = RTL_TEXTENCODING_UCS2;
+ }
+ else
+ {
+ mnTextEnc = rtl_getTextEncodingFromWindowsCodePage( nCodePage );
+ if ( mnTextEnc == RTL_TEXTENCODING_DONTKNOW )
+ mnTextEnc = RTL_TEXTENCODING_MS_1252;
+ }
+ }
+ else
+ {
+ mnTextEnc = RTL_TEXTENCODING_MS_1252;
+ }
+ }
+ }
+ }
+ else
+ {
+ sal_uInt32 nDictCount(0);
+ pStrm->ReadUInt32(nDictCount);
+ auto nMaxRecordsPossible = pStrm->remainingSize() / (sizeof(sal_uInt32)*2);
+ if (nDictCount > nMaxRecordsPossible)
+ {
+ SAL_WARN("sd.filter", "Dictionary count of " << nDictCount << " claimed, only " << nMaxRecordsPossible << " possible");
+ nDictCount = nMaxRecordsPossible;
+ }
+ for (sal_uInt32 i = 0; i < nDictCount; ++i)
+ {
+ sal_uInt32 nSize(0);
+ pStrm->ReadUInt32( nSize ).ReadUInt32( nSize );
+ if (!pStrm->good())
+ break;
+ sal_uInt64 nPos = pStrm->Tell() + nSize;
+ if (!checkSeek(*pStrm, nPos))
+ break;
+ }
+ sal_uInt32 nSize = pStrm->Tell();
+ pStrm->Seek( nPropOfs + nSecOfs );
+ nSize -= pStrm->Tell();
+ if ( nSize > nStrmSize )
+ {
+ break;
+ }
+ std::unique_ptr<sal_uInt8[]> pBuf( new sal_uInt8[ nSize ] );
+ nSize = pStrm->ReadBytes(pBuf.get(), nSize);
+ AddProperty( 0xffffffff, pBuf.get(), nSize );
+ }
+ pStrm->Seek(nCurrent);
+ }
+ pStrm->Seek(nSecOfs + nSecSize);
+}
+
+Section& Section::operator=( const Section& rSection )
+{
+ if ( this != &rSection )
+ {
+ memcpy( static_cast<void*>(aFMTID), static_cast<void const *>(rSection.aFMTID), 16 );
+
+ for(const std::unique_ptr<PropEntry>& rEntry : rSection.maEntries)
+ maEntries.push_back(std::make_unique<PropEntry>(*rEntry));
+ }
+ return *this;
+}
+
+PropRead::PropRead( SotStorage& rStorage, const OUString& rName ) :
+ mbStatus ( false ),
+ mnByteOrder ( 0xfffe )
+{
+ if ( rStorage.IsStream( rName ) )
+ {
+ mpSvStream = rStorage.OpenSotStream( rName, StreamMode::STD_READ );
+ if ( mpSvStream.is() )
+ {
+ mpSvStream->SetEndian( SvStreamEndian::LITTLE );
+ memset( mApplicationCLSID, 0, 16 );
+ mbStatus = true;
+ }
+ }
+}
+
+const Section* PropRead::GetSection( const sal_uInt8* pFMTID )
+{
+ auto it = std::find_if(maSections.begin(), maSections.end(),
+ [&pFMTID](const std::unique_ptr<Section>& rxSection) { return memcmp( rxSection->GetFMTID(), pFMTID, 16 ) == 0; });
+ if (it != maSections.end())
+ return it->get();
+ return nullptr;
+}
+
+void PropRead::Read()
+{
+ maSections.clear();
+
+ if ( !mbStatus )
+ return;
+
+ sal_uInt16 mnVersionLo;
+ sal_uInt16 mnVersionHi;
+ sal_uInt16 mnFormat;
+ mpSvStream->ReadUInt16( mnByteOrder ).ReadUInt16( mnFormat ).ReadUInt16( mnVersionLo ).ReadUInt16( mnVersionHi );
+ if ( mnByteOrder != 0xfffe )
+ return;
+
+ std::vector<sal_uInt8> aSectCLSID(16);
+ mpSvStream->ReadBytes(mApplicationCLSID, 16);
+ sal_uInt32 nSections(0);
+ mpSvStream->ReadUInt32(nSections);
+ if ( nSections > 2 ) // sj: PowerPoint documents are containing max 2 sections
+ {
+ mbStatus = false;
+ }
+ else
+ for ( sal_uInt32 i = 0; i < nSections; i++ )
+ {
+ mpSvStream->ReadBytes(aSectCLSID.data(), aSectCLSID.size());
+ sal_uInt32 nSectionOfs(0);
+ mpSvStream->ReadUInt32( nSectionOfs );
+ sal_uInt32 nCurrent = mpSvStream->Tell();
+ if (checkSeek(*mpSvStream, nSectionOfs))
+ {
+ Section aSection(aSectCLSID.data());
+ aSection.Read(mpSvStream.get());
+ maSections.push_back(std::make_unique<Section>(aSection));
+ }
+ mpSvStream->Seek( nCurrent );
+ }
+}
+
+PropRead& PropRead::operator=( const PropRead& rPropRead )
+{
+ if ( this != &rPropRead )
+ {
+ mbStatus = rPropRead.mbStatus;
+ mpSvStream = rPropRead.mpSvStream;
+
+ mnByteOrder = rPropRead.mnByteOrder;
+ memcpy( mApplicationCLSID, rPropRead.mApplicationCLSID, 16 );
+
+ for(const std::unique_ptr<Section>& rSection : rPropRead.maSections)
+ maSections.push_back(std::make_unique<Section>(*rSection));
+ }
+ return *this;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/ppt/propread.hxx b/sd/source/filter/ppt/propread.hxx
new file mode 100644
index 000000000..402a04624
--- /dev/null
+++ b/sd/source/filter/ppt/propread.hxx
@@ -0,0 +1,151 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <map>
+#include <vector>
+#include <memory>
+
+#include <sal/types.h>
+#include <sot/storage.hxx>
+#include <tools/stream.hxx>
+
+// SummaryInformation
+#define PID_TITLE 0x02
+#define PID_SUBJECT 0x03
+#define PID_AUTHOR 0x04
+#define PID_KEYWORDS 0x05
+#define PID_COMMENTS 0x06
+#define PID_TEMPLATE 0x07
+#define PID_LASTAUTHOR 0x08
+#define PID_REVNUMBER 0x09
+#define PID_CREATE_DTM 0x0c
+
+// DocumentSummaryInformation
+#define PID_SLIDECOUNT 0x07
+#define PID_HEADINGPAIR 0x0c
+#define PID_DOCPARTS 0x0d
+
+#define VT_EMPTY 0
+#define VT_NULL 1
+#define VT_I2 2
+#define VT_I4 3
+#define VT_R4 4
+#define VT_R8 5
+#define VT_CY 6
+#define VT_DATE 7
+#define VT_BSTR 8
+#define VT_UI4 9
+#define VT_ERROR 10
+#define VT_BOOL 11
+#define VT_VARIANT 12
+#define VT_DECIMAL 14
+#define VT_I1 16
+#define VT_UI1 17
+#define VT_UI2 18
+#define VT_I8 20
+#define VT_UI8 21
+#define VT_INT 22
+#define VT_UINT 23
+#define VT_LPSTR 30
+#define VT_LPWSTR 31
+#define VT_FILETIME 64
+#define VT_BLOB 65
+#define VT_STREAM 66
+#define VT_STORAGE 67
+#define VT_STREAMED_OBJECT 68
+#define VT_STORED_OBJECT 69
+#define VT_BLOB_OBJECT 70
+#define VT_CF 71
+#define VT_CLSID 72
+#define VT_VECTOR 0x1000
+#define VT_ARRAY 0x2000
+#define VT_BYREF 0x4000
+#define VT_TYPEMASK 0xFFF
+
+typedef std::map<OUString,sal_uInt32> PropDictionary;
+
+struct PropEntry
+{
+ sal_uInt32 mnId;
+ sal_uInt32 mnSize;
+ std::unique_ptr<sal_uInt8[]> mpBuf;
+
+ PropEntry( sal_uInt32 nId, const sal_uInt8* pBuf, sal_uInt32 nBufSize );
+ PropEntry( const PropEntry& rProp );
+
+ PropEntry& operator=(const PropEntry& rPropEntry);
+};
+
+class PropItem : public SvMemoryStream
+{
+ sal_uInt16 mnTextEnc;
+
+public:
+ PropItem()
+ : mnTextEnc(RTL_TEXTENCODING_DONTKNOW)
+ {
+ }
+ void Clear();
+
+ void SetTextEncoding( sal_uInt16 nTextEnc ){ mnTextEnc = nTextEnc; };
+ bool Read( OUString& rString, sal_uInt32 nType = VT_EMPTY, bool bDwordAlign = true );
+ PropItem& operator=( PropItem& rPropItem );
+};
+
+class Section final
+{
+ sal_uInt16 mnTextEnc;
+ std::vector<std::unique_ptr<PropEntry> > maEntries;
+
+ sal_uInt8 aFMTID[ 16 ];
+
+ void AddProperty( sal_uInt32 nId, const sal_uInt8* pBuf, sal_uInt32 nBufSize );
+
+ public:
+ explicit Section( const sal_uInt8* pFMTID );
+ Section( const Section& rSection );
+
+ Section& operator=( const Section& rSection );
+ bool GetProperty( sal_uInt32 nId, PropItem& rPropItem );
+ void GetDictionary( PropDictionary& rDict );
+ const sal_uInt8* GetFMTID() const { return aFMTID; };
+ void Read( SotStorageStream* pStrm );
+};
+
+class PropRead
+{
+ bool mbStatus;
+ tools::SvRef<SotStorageStream> mpSvStream;
+
+ sal_uInt16 mnByteOrder;
+ sal_uInt8 mApplicationCLSID[ 16 ];
+ std::vector<std::unique_ptr<Section> > maSections;
+
+ public:
+ PropRead( SotStorage& rSvStorage, const OUString& rName );
+
+ PropRead& operator=( const PropRead& rPropRead );
+ const Section* GetSection( const sal_uInt8* pFMTID );
+ bool IsValid() const { return mbStatus; };
+ void Read();
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/sdfilter.cxx b/sd/source/filter/sdfilter.cxx
new file mode 100644
index 000000000..11ad11d76
--- /dev/null
+++ b/sd/source/filter/sdfilter.cxx
@@ -0,0 +1,108 @@
+/* -*- 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 <memory>
+#include <map>
+
+#include <osl/module.hxx>
+#include <tools/svlibrary.h>
+#include <sfx2/docfile.hxx>
+#include <sfx2/frame.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <svl/itemset.hxx>
+
+#include <DrawDocShell.hxx>
+
+#include <pres.hxx>
+#include <sdfilter.hxx>
+
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::task;
+
+
+SdFilter::SdFilter( SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell )
+: mxModel( rDocShell.GetModel() )
+, mrMedium( rMedium )
+, mrDocShell( rDocShell )
+, mrDocument( *rDocShell.GetDoc() )
+, mbIsDraw( rDocShell.GetDocumentType() == DocumentType::Draw )
+{
+}
+
+SdFilter::~SdFilter()
+{
+}
+
+OUString SdFilter::ImplGetFullLibraryName( std::u16string_view rLibraryName )
+{
+ return OUString(SVLIBRARY("?")).replaceFirst( "?", rLibraryName );
+}
+
+#ifndef DISABLE_DYNLOADING
+
+static std::map<OUString, std::unique_ptr<osl::Module>> g_SdModuleMap;
+
+extern "C" { static void thisModule() {} }
+
+oslGenericFunction SdFilter::GetLibrarySymbol( const OUString& rLibraryName, const OUString &rFnSymbol )
+{
+ osl::Module *pMod = nullptr;
+ auto it = g_SdModuleMap.find(rLibraryName);
+ if (it != g_SdModuleMap.end())
+ pMod = it->second.get();
+
+ if (!pMod)
+ {
+ pMod = new osl::Module;
+ if (pMod->loadRelative(&thisModule, ImplGetFullLibraryName(rLibraryName),
+ SAL_LOADMODULE_GLOBAL | SAL_LOADMODULE_LAZY))
+ g_SdModuleMap[rLibraryName] = std::unique_ptr<osl::Module>(pMod);
+ else
+ {
+ delete pMod;
+ pMod = nullptr;
+ }
+ }
+ if (!pMod)
+ return nullptr;
+ else
+ return pMod->getFunctionSymbol(rFnSymbol);
+}
+
+void SdFilter::Preload()
+{
+ (void)GetLibrarySymbol("sdfilt", "ImportPPT");
+ (void)GetLibrarySymbol("icg", "ImportCGM");
+}
+
+#endif
+
+void SdFilter::CreateStatusIndicator()
+{
+ // The status indicator must be retrieved from the provided medium arguments
+ const SfxUnoAnyItem* pStatusBarItem =
+ mrMedium.GetItemSet()->GetItem(SID_PROGRESS_STATUSBAR_CONTROL);
+
+ if ( pStatusBarItem )
+ pStatusBarItem->GetValue() >>= mxStatusIndicator;
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/sdpptwrp.cxx b/sd/source/filter/sdpptwrp.cxx
new file mode 100644
index 000000000..59829f854
--- /dev/null
+++ b/sd/source/filter/sdpptwrp.cxx
@@ -0,0 +1,377 @@
+/* -*- 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 <sfx2/docfile.hxx>
+#include <sfx2/docfilt.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <filter/msfilter/msoleexp.hxx>
+#include <svx/svxerr.hxx>
+#include <unotools/fltrcfg.hxx>
+#include <unotools/streamwrap.hxx>
+#include <sot/storage.hxx>
+#include <comphelper/sequenceashashmap.hxx>
+#include <comphelper/processfactory.hxx>
+
+#include <com/sun/star/packages/XPackageEncryption.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <sdpptwrp.hxx>
+#include <DrawDocShell.hxx>
+#include <sfx2/frame.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::task;
+using namespace ::com::sun::star::frame;
+
+typedef sal_Bool ( *ExportPPTPointer )( const std::vector< css::beans::PropertyValue >&, tools::SvRef<SotStorage> const&,
+ Reference< XModel > const &,
+ Reference< XStatusIndicator > const &,
+ SvMemoryStream*, sal_uInt32 nCnvrtFlags );
+
+typedef sal_Bool ( *ImportPPTPointer )( SdDrawDocument*, SvStream&, SotStorage&, SfxMedium& );
+
+typedef sal_Bool ( *SaveVBAPointer )( SfxObjectShell&, SvMemoryStream*& );
+
+#ifdef DISABLE_DYNLOADING
+
+extern "C" sal_Bool ExportPPT( const std::vector< css::beans::PropertyValue >&, tools::SvRef<SotStorage> const&,
+ Reference< XModel > const &,
+ Reference< XStatusIndicator > const &,
+ SvMemoryStream*, sal_uInt32 nCnvrtFlags );
+
+extern "C" sal_Bool ImportPPT( SdDrawDocument*, SvStream&, SotStorage&, SfxMedium& );
+
+extern "C" sal_Bool SaveVBA( SfxObjectShell&, SvMemoryStream*& );
+
+#endif
+
+
+SdPPTFilter::SdPPTFilter( SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell ) :
+ SdFilter( rMedium, rDocShell ),
+ pBas ( nullptr )
+{
+}
+
+SdPPTFilter::~SdPPTFilter()
+{
+ delete pBas; // deleting the compressed basic storage
+}
+
+static void lcl_getListOfStreams(SotStorage * pStorage, comphelper::SequenceAsHashMap& aStreamsData, const OUString& sPrefix)
+{
+ SvStorageInfoList aElements;
+ pStorage->FillInfoList(&aElements);
+ for (const auto & aElement : aElements)
+ {
+ OUString sStreamFullName = sPrefix.getLength() ? sPrefix + "/" + aElement.GetName() : aElement.GetName();
+ if (aElement.IsStorage())
+ {
+ tools::SvRef<SotStorage> xSubStorage = pStorage->OpenSotStorage(aElement.GetName(), StreamMode::STD_READ | StreamMode::SHARE_DENYALL);
+ lcl_getListOfStreams(xSubStorage.get(), aStreamsData, sStreamFullName);
+ }
+ else
+ {
+ // Read stream
+ tools::SvRef<SotStorageStream> rStream = pStorage->OpenSotStream(aElement.GetName(), StreamMode::READ | StreamMode::SHARE_DENYALL);
+ if (rStream.is())
+ {
+ sal_Int32 nStreamSize = rStream->GetSize();
+ Sequence< sal_Int8 > oData;
+ oData.realloc(nStreamSize);
+ sal_Int32 nReadBytes = rStream->ReadBytes(oData.getArray(), nStreamSize);
+ if (nStreamSize == nReadBytes)
+ aStreamsData[sStreamFullName] <<= oData;
+ }
+ }
+ }
+}
+
+static tools::SvRef<SotStorage> lcl_DRMDecrypt(const SfxMedium& rMedium, const tools::SvRef<SotStorage>& rStorage, std::shared_ptr<SvStream>& rNewStorageStrm)
+{
+ tools::SvRef<SotStorage> aNewStorage;
+
+ // We have DRM encrypted storage. We should try to decrypt it first, if we can
+ Sequence< Any > aArguments;
+ Reference<XComponentContext> xComponentContext(comphelper::getProcessComponentContext());
+ Reference< css::packages::XPackageEncryption > xPackageEncryption(
+ xComponentContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+ "com.sun.star.comp.oox.crypto.DRMDataSpace", aArguments, xComponentContext), UNO_QUERY);
+
+ if (!xPackageEncryption.is())
+ {
+ // We do not know how to decrypt this
+ return aNewStorage;
+ }
+
+ comphelper::SequenceAsHashMap aStreamsData;
+ lcl_getListOfStreams(rStorage.get(), aStreamsData, "");
+
+ try {
+ Sequence<NamedValue> aStreams = aStreamsData.getAsConstNamedValueList();
+ if (!xPackageEncryption->readEncryptionInfo(aStreams))
+ {
+ // We failed with decryption
+ return aNewStorage;
+ }
+
+ tools::SvRef<SotStorageStream> rContentStream = rStorage->OpenSotStream("\011DRMContent", StreamMode::READ | StreamMode::SHARE_DENYALL);
+ if (!rContentStream.is())
+ {
+ return aNewStorage;
+ }
+
+ rNewStorageStrm = std::make_shared<SvMemoryStream>();
+
+ Reference<css::io::XInputStream > xInputStream(new utl::OSeekableInputStreamWrapper(rContentStream.get(), false));
+ Reference<css::io::XOutputStream > xDecryptedStream(new utl::OSeekableOutputStreamWrapper(*rNewStorageStrm));
+
+ if (!xPackageEncryption->decrypt(xInputStream, xDecryptedStream))
+ {
+ // We failed with decryption
+ return aNewStorage;
+ }
+
+ rNewStorageStrm->Seek(0);
+
+ // Further reading is done from new document
+ aNewStorage = new SotStorage(*rNewStorageStrm);
+
+ // Set the media descriptor data
+ Sequence<NamedValue> aEncryptionData = xPackageEncryption->createEncryptionData("");
+ rMedium.GetItemSet()->Put(SfxUnoAnyItem(SID_ENCRYPTIONDATA, Any(aEncryptionData)));
+ }
+ catch (const std::exception&)
+ {
+ return aNewStorage;
+ }
+
+ return aNewStorage;
+}
+
+bool SdPPTFilter::Import()
+{
+ bool bRet = false;
+ std::shared_ptr<SvStream> aDecryptedStorageStrm;
+ tools::SvRef<SotStorage> pStorage = new SotStorage( mrMedium.GetInStream(), false );
+ if( !pStorage->GetError() )
+ {
+ /* check if there is a dualstorage, then the
+ document is probably a PPT95 containing PPT97 */
+ tools::SvRef<SotStorage> xDualStorage;
+ OUString sDualStorage( "PP97_DUALSTORAGE" );
+ if ( pStorage->IsContained( sDualStorage ) )
+ {
+ xDualStorage = pStorage->OpenSotStorage( sDualStorage, StreamMode::STD_READ );
+ pStorage = xDualStorage;
+ }
+ if (pStorage->IsContained("\011DRMContent"))
+ {
+ // Document is DRM encrypted
+ pStorage = lcl_DRMDecrypt(mrMedium, pStorage, aDecryptedStorageStrm);
+ }
+ tools::SvRef<SotStorageStream> pDocStream(pStorage->OpenSotStream( "PowerPoint Document" , StreamMode::STD_READ ));
+ if( pDocStream )
+ {
+ pDocStream->SetVersion( pStorage->GetVersion() );
+ pDocStream->SetCryptMaskKey(pStorage->GetKey());
+
+ if ( pStorage->IsStream( "EncryptedSummary" ) )
+ mrMedium.SetError(ERRCODE_SVX_READ_FILTER_PPOINT);
+ else
+ {
+#ifdef DISABLE_DYNLOADING
+ ImportPPTPointer pPPTImport = ImportPPT;
+#else
+ ImportPPTPointer pPPTImport = reinterpret_cast< ImportPPTPointer >(
+ SdFilter::GetLibrarySymbol(mrMedium.GetFilter()->GetUserData(), "ImportPPT"));
+#endif
+
+ if ( pPPTImport )
+ bRet = pPPTImport( &mrDocument, *pDocStream, *pStorage, mrMedium );
+
+ if ( !bRet )
+ mrMedium.SetError(SVSTREAM_WRONGVERSION);
+ }
+ }
+ }
+
+ return bRet;
+}
+
+bool SdPPTFilter::Export()
+{
+ bool bRet = false;
+
+ if( mxModel.is() )
+ {
+#ifdef DISABLE_DYNLOADING
+ ExportPPTPointer PPTExport = ExportPPT;
+#else
+ ExportPPTPointer PPTExport = reinterpret_cast< ExportPPTPointer >(
+ SdFilter::GetLibrarySymbol(mrMedium.GetFilter()->GetUserData(), "ExportPPT"));
+#endif
+
+ if( PPTExport)
+ {
+ sal_uInt32 nCnvrtFlags = 0;
+ const SvtFilterOptions& rFilterOptions = SvtFilterOptions::Get();
+ if ( rFilterOptions.IsMath2MathType() )
+ nCnvrtFlags |= OLE_STARMATH_2_MATHTYPE;
+ if ( rFilterOptions.IsWriter2WinWord() )
+ nCnvrtFlags |= OLE_STARWRITER_2_WINWORD;
+ if ( rFilterOptions.IsCalc2Excel() )
+ nCnvrtFlags |= OLE_STARCALC_2_EXCEL;
+ if ( rFilterOptions.IsImpress2PowerPoint() )
+ nCnvrtFlags |= OLE_STARIMPRESS_2_POWERPOINT;
+ if ( rFilterOptions.IsEnablePPTPreview() )
+ nCnvrtFlags |= 0x8000;
+
+ CreateStatusIndicator();
+
+ //OUString sBaseURI( "BaseURI");
+ std::vector< PropertyValue > aProperties;
+ PropertyValue aProperty;
+ aProperty.Name = "BaseURI";
+ aProperty.Value <<= mrMedium.GetBaseURL( true );
+ aProperties.push_back( aProperty );
+
+ SvStream * pOutputStrm = mrMedium.GetOutStream();
+
+ Sequence< NamedValue > aEncryptionData;
+ Reference< css::packages::XPackageEncryption > xPackageEncryption;
+ const SfxUnoAnyItem* pEncryptionDataItem = SfxItemSet::GetItem<SfxUnoAnyItem>(mrMedium.GetItemSet(), SID_ENCRYPTIONDATA, false);
+ std::shared_ptr<SvStream> pMediaStrm;
+ if (pEncryptionDataItem && (pEncryptionDataItem->GetValue() >>= aEncryptionData))
+ {
+ ::comphelper::SequenceAsHashMap aHashData(aEncryptionData);
+ OUString sCryptoType = aHashData.getUnpackedValueOrDefault("CryptoType", OUString());
+
+ if (sCryptoType.getLength())
+ {
+ Reference<XComponentContext> xComponentContext(comphelper::getProcessComponentContext());
+ Sequence<Any> aArguments{
+ Any(NamedValue("Binary", Any(true))) };
+ xPackageEncryption.set(
+ xComponentContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+ "com.sun.star.comp.oox.crypto." + sCryptoType, aArguments, xComponentContext), UNO_QUERY);
+
+ if (xPackageEncryption.is())
+ {
+ // We have an encryptor. Export document into memory stream and encrypt it later
+ pMediaStrm = std::make_shared<SvMemoryStream>();
+ pOutputStrm = pMediaStrm.get();
+
+ // Temp removal of EncryptionData to avoid password protection triggering
+ mrMedium.GetItemSet()->ClearItem(SID_ENCRYPTIONDATA);
+ }
+ }
+ }
+
+ tools::SvRef<SotStorage> xStorRef = new SotStorage(pOutputStrm, false);
+
+ if (xStorRef.is())
+ {
+ bRet = PPTExport(aProperties, xStorRef, mxModel, mxStatusIndicator, pBas, nCnvrtFlags);
+ xStorRef->Commit();
+
+ if (xPackageEncryption.is())
+ {
+ // Perform DRM encryption
+ pOutputStrm->Seek(0);
+
+ xPackageEncryption->setupEncryption(aEncryptionData);
+
+ Reference<css::io::XInputStream > xInputStream(new utl::OSeekableInputStreamWrapper(pOutputStrm, false));
+ Sequence<NamedValue> aStreams = xPackageEncryption->encrypt(xInputStream);
+
+ tools::SvRef<SotStorage> xEncryptedRootStrg = new SotStorage(mrMedium.GetOutStream(), false);
+ for (const NamedValue & aStreamData : std::as_const(aStreams))
+ {
+ // To avoid long paths split and open substorages recursively
+ // Splitting paths manually, since comphelper::string::split is trimming special characters like \0x01, \0x09
+ tools::SvRef<SotStorage> pStorage = xEncryptedRootStrg.get();
+ OUString sFileName;
+ sal_Int32 idx = 0;
+ do
+ {
+ OUString sPathElem = aStreamData.Name.getToken(0, L'/', idx);
+ if (!sPathElem.isEmpty())
+ {
+ if (idx < 0)
+ {
+ sFileName = sPathElem;
+ }
+ else
+ {
+ pStorage = pStorage->OpenSotStorage(sPathElem);
+ }
+ }
+ } while (pStorage && idx >= 0);
+
+ if (!pStorage)
+ {
+ bRet = false;
+ break;
+ }
+
+ tools::SvRef<SotStorageStream> pStream = pStorage->OpenSotStream(sFileName);
+ if (!pStream)
+ {
+ bRet = false;
+ break;
+ }
+ Sequence<sal_Int8> aStreamContent;
+ aStreamData.Value >>= aStreamContent;
+ size_t nBytesWritten = pStream->WriteBytes(aStreamContent.getConstArray(), aStreamContent.getLength());
+ if (nBytesWritten != static_cast<size_t>(aStreamContent.getLength()))
+ {
+ bRet = false;
+ break;
+ }
+ }
+ xEncryptedRootStrg->Commit();
+
+ // Restore encryption data
+ mrMedium.GetItemSet()->Put(SfxUnoAnyItem(SID_ENCRYPTIONDATA, Any(aEncryptionData)));
+ }
+ }
+ }
+ }
+
+ return bRet;
+}
+
+void SdPPTFilter::PreSaveBasic()
+{
+ const SvtFilterOptions& rFilterOptions = SvtFilterOptions::Get();
+ if( rFilterOptions.IsLoadPPointBasicStorage() )
+ {
+#ifdef DISABLE_DYNLOADING
+ SaveVBAPointer pSaveVBA= SaveVBA;
+#else
+ SaveVBAPointer pSaveVBA = reinterpret_cast< SaveVBAPointer >(
+ SdFilter::GetLibrarySymbol(mrMedium.GetFilter()->GetUserData(), "SaveVBA"));
+#endif
+ if( pSaveVBA )
+ pSaveVBA( static_cast<SfxObjectShell&>(mrDocShell), pBas );
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/xml/sdtransform.cxx b/sd/source/filter/xml/sdtransform.cxx
new file mode 100644
index 000000000..4e296eaf6
--- /dev/null
+++ b/sd/source/filter/xml/sdtransform.cxx
@@ -0,0 +1,368 @@
+/* -*- 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 <svl/style.hxx>
+#include <svl/itemset.hxx>
+#include <svl/whiter.hxx>
+
+#include <svx/svdoutl.hxx>
+#include <editeng/xmlcnitm.hxx>
+#include <svx/svdotext.hxx>
+#include <svx/svdogrp.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/lrspitem.hxx>
+#include <editeng/outlobj.hxx>
+
+#include <drawdoc.hxx>
+#include "sdtransform.hxx"
+
+using namespace ::com::sun::star::style;
+
+namespace {
+
+class SdTransformOOo2xDocument
+{
+public:
+ explicit SdTransformOOo2xDocument( SdDrawDocument& rDocument );
+
+ void transform();
+
+ void transformMasterPages();
+ void transformDrawPages();
+
+ void transformStyles();
+ void transformStyles( SfxStyleFamily eFam );
+ void transformStyle( SfxStyleSheetBase& rSheet );
+
+ void transformShapes( SdrObjList const & rShapes );
+ void transformShape( SdrObject& rObj );
+
+ void transformTextShape( SdrTextObj& rTextShape );
+
+ bool getBulletState( const SfxItemSet& rSet, SfxStyleSheetBase* pSheet, bool& rState );
+ static bool getBulletState( const SfxItemSet& rSet, sal_uInt16 nWhich, bool& rState );
+
+ static bool transformItemSet( SfxItemSet& rSet, bool bNumbering );
+
+ static bool removeAlienAttributes( SfxItemSet& rSet );
+ static bool removeAlienAttributes( SfxItemSet& rSet, sal_uInt16 nWhich );
+
+ SdDrawDocument& mrDocument;
+ SdrOutliner& mrOutliner;
+};
+
+}
+
+/** transforms the given model from OOo 2.x to OOo 3.x. This maps
+ the deprecated EE_PARA_BULLETSTATE and clears the EE_PARA_LRSPACE
+ if used together with a EE_PARA_NUMBULLET */
+void TransformOOo2xDocument( SdDrawDocument* pDocument )
+{
+ if( pDocument )
+ {
+ SdTransformOOo2xDocument aTransformer( *pDocument );
+ aTransformer.transform();
+ }
+}
+
+constexpr OUStringLiteral gsEnableNumbering( u"enable-numbering" );
+constexpr OUStringLiteral gsTextNamespace( u"urn:oasis:names:tc:opendocument:xmlns:text:1.0" );
+constexpr OUStringLiteral gsTrue( u"true" );
+
+SdTransformOOo2xDocument::SdTransformOOo2xDocument( SdDrawDocument& rDocument )
+: mrDocument( rDocument )
+, mrOutliner( rDocument.GetDrawOutliner() )
+{
+}
+
+void SdTransformOOo2xDocument::transform()
+{
+ transformMasterPages();
+ transformDrawPages();
+ transformStyles();
+}
+
+void SdTransformOOo2xDocument::transformMasterPages()
+{
+ sal_uInt16 nMasterPageCount = mrDocument.GetMasterPageCount();
+ for( sal_uInt16 nMasterPage = 0; nMasterPage < nMasterPageCount; nMasterPage++ )
+ {
+ SdrObjList* pPage = mrDocument.GetMasterPage( nMasterPage );
+ if( pPage )
+ transformShapes( *pPage );
+ }
+}
+
+void SdTransformOOo2xDocument::transformDrawPages()
+{
+ sal_uInt16 nPageCount = mrDocument.GetPageCount();
+ for( sal_uInt16 nPage = 0; nPage < nPageCount; nPage++ )
+ {
+ SdrObjList* pPage = mrDocument.GetPage( nPage );
+ if( pPage )
+ transformShapes( *pPage );
+ }
+}
+
+void SdTransformOOo2xDocument::transformStyles()
+{
+ transformStyles( SfxStyleFamily::Para );
+ transformStyles( SfxStyleFamily::Page );
+}
+
+void SdTransformOOo2xDocument::transformStyles( SfxStyleFamily eFam )
+{
+
+ rtl::Reference< SfxStyleSheetBasePool > xStyleSheetPool( mrDocument.GetStyleSheetPool() );
+
+ SfxStyleSheetIterator aIter( xStyleSheetPool.get(), eFam );
+
+ SfxStyleSheetBase* pSheet = aIter.First();
+ while( pSheet )
+ {
+ transformStyle( *pSheet );
+ pSheet = aIter.Next();
+ }
+}
+
+void SdTransformOOo2xDocument::transformStyle( SfxStyleSheetBase& rSheet )
+{
+ SfxItemSet& rSet = rSheet.GetItemSet();
+
+ bool bState = false;
+ getBulletState( rSheet.GetItemSet(), rSheet.GetPool()->Find( rSheet.GetParent(), rSheet.GetFamily() ), bState );
+
+ transformItemSet( rSet, bState );
+ removeAlienAttributes( rSet );
+}
+
+void SdTransformOOo2xDocument::transformShapes( SdrObjList const & rShapes )
+{
+ const size_t nShapeCount = rShapes.GetObjCount();
+ for( size_t nShape = 0; nShape < nShapeCount; ++nShape )
+ {
+ SdrObject* pObj = rShapes.GetObj( nShape );
+ if( pObj )
+ transformShape( *pObj );
+ }
+}
+
+void SdTransformOOo2xDocument::transformShape( SdrObject& rObj )
+{
+ SdrTextObj* pTextShape = dynamic_cast< SdrTextObj* >( &rObj );
+ if( pTextShape )
+ {
+ transformTextShape( *pTextShape );
+ return;
+ }
+
+ SdrObjGroup* pGroupShape = dynamic_cast< SdrObjGroup* >( &rObj );
+ if( pGroupShape )
+ {
+ SdrObjList* pObjList = pGroupShape->GetSubList();
+ if( pObjList )
+ transformShapes( *pObjList );
+ return;
+ }
+}
+
+void SdTransformOOo2xDocument::transformTextShape( SdrTextObj& rTextShape )
+{
+
+ if(rTextShape.IsEmptyPresObj())
+ return;
+
+ OutlinerParaObject* pOPO = rTextShape.GetOutlinerParaObject();
+ if (!pOPO)
+ return;
+
+ mrOutliner.SetText( *pOPO );
+
+ sal_Int32 nCount = mrOutliner.GetParagraphCount();
+
+ bool bChange = false;
+
+ for(sal_Int32 nPara = 0; nPara < nCount; nPara++)
+ {
+ SfxItemSet aParaSet( mrOutliner.GetParaAttribs( nPara ) );
+
+ bool bItemChange = false;
+
+ bool bState = false;
+ const sal_Int16 nDepth = mrOutliner.GetDepth( nPara );
+ if( (nDepth != -1) && (!getBulletState( aParaSet, mrOutliner.GetStyleSheet( nPara ), bState ) || !bState) )
+ {
+ // disable bullet if text::enable-bullet="false" is found
+ if( (nDepth > 0 ) && (rTextShape.GetObjInventor() == SdrInventor::Default) && (rTextShape.GetObjIdentifier() == SdrObjKind::OutlineText) )
+ {
+ // for outline object and level > 0 burn in the style sheet because it will be changed to "outline 1"
+ SfxStyleSheet* pStyleSheet = mrOutliner.GetStyleSheet( nPara );
+
+ if( pStyleSheet )
+ {
+ // optimize me: only put items hard into paragraph that are not equal to "outline 1" style!
+ SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
+
+ SfxWhichIter aIter(aParaSet);
+ sal_uInt16 nWhich(aIter.FirstWhich());
+
+ // now set all none hard attributes from the style
+ while(nWhich)
+ {
+ if(SfxItemState::SET != aIter.GetItemState())
+ {
+ aParaSet.Put(rStyleSet.Get(nWhich));
+ bItemChange = true;
+ }
+
+ nWhich = aIter.NextWhich();
+ }
+ }
+ }
+
+ mrOutliner.SetDepth( mrOutliner.GetParagraph( nPara ), -1 );
+
+ bChange = true;
+ }
+
+ bItemChange |= transformItemSet( aParaSet, bState );
+
+ bItemChange |= removeAlienAttributes( aParaSet );
+
+ if( bItemChange )
+ {
+ mrOutliner.SetParaAttribs( nPara, aParaSet );
+ bChange = true;
+ }
+ }
+
+ if( bChange )
+ rTextShape.SetOutlinerParaObject(mrOutliner.CreateParaObject());
+
+ mrOutliner.Clear();
+}
+
+bool SdTransformOOo2xDocument::getBulletState( const SfxItemSet& rSet, SfxStyleSheetBase* pSheet, bool& rState )
+{
+ if( getBulletState( rSet, EE_PARA_XMLATTRIBS, rState ) )
+ return true;
+
+ if( getBulletState( rSet, SDRATTR_XMLATTRIBUTES, rState ) )
+ return true;
+
+ if( pSheet && getBulletState( pSheet->GetItemSet(), pSheet->GetPool()->Find( pSheet->GetParent(), pSheet->GetFamily() ), rState ) )
+ return true;
+
+ return false;
+}
+
+bool SdTransformOOo2xDocument::getBulletState( const SfxItemSet& rSet, sal_uInt16 nWhich, bool& rState )
+{
+ if( rSet.GetItemState( nWhich ) == SfxItemState::SET )
+ {
+ const SvXMLAttrContainerItem& rAttr = *rSet.GetItem<SvXMLAttrContainerItem>( nWhich );
+
+ const sal_uInt16 nCount = rAttr.GetAttrCount();
+ for( sal_uInt16 nItem = 0; nItem < nCount; nItem++ )
+ {
+ if( ( rAttr.GetAttrLName( nItem ) == gsEnableNumbering ) && ( rAttr.GetAttrNamespace( nItem ) == gsTextNamespace ) )
+ {
+ const OUString& sValue( rAttr.GetAttrValue( nItem ) );
+ rState = sValue == gsTrue;
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+bool SdTransformOOo2xDocument::transformItemSet( SfxItemSet& rSet, bool bNumbering )
+{
+ bool bRet = false;
+ const SvxLRSpaceItem* pItem = bNumbering ? rSet.GetItem<SvxLRSpaceItem>(EE_PARA_LRSPACE) : nullptr;
+ if (pItem)
+ {
+ SvxLRSpaceItem aItem(*pItem);
+ if( (aItem.GetLeft() != 0) || (aItem.GetTextFirstLineOffset() != 0) )
+ {
+ aItem.SetLeftValue( 0 );
+ aItem.SetTextFirstLineOffset( 0 );
+ rSet.Put( aItem );
+ bRet = true;
+ }
+ }
+
+ return bRet;
+}
+
+bool SdTransformOOo2xDocument::removeAlienAttributes( SfxItemSet& rSet )
+{
+ bool b = removeAlienAttributes( rSet, EE_PARA_XMLATTRIBS );
+ b |= removeAlienAttributes( rSet, SDRATTR_XMLATTRIBUTES );
+ return b;
+}
+
+bool SdTransformOOo2xDocument::removeAlienAttributes( SfxItemSet& rSet, sal_uInt16 nWhich )
+{
+ if( rSet.GetItemState( nWhich ) == SfxItemState::SET )
+ {
+ const SvXMLAttrContainerItem& rAttr = *rSet.GetItem<SvXMLAttrContainerItem>( nWhich );
+
+ const sal_uInt16 nCount = rAttr.GetAttrCount();
+ for( sal_uInt16 nItem = 0; nItem < nCount; nItem++ )
+ {
+ if( ( rAttr.GetAttrLName( nItem ) == gsEnableNumbering ) && ( rAttr.GetAttrNamespace( nItem ) == gsTextNamespace ) )
+ {
+ if( nCount == 1 )
+ {
+ rSet.ClearItem( nWhich );
+ }
+ else
+ {
+ SvXMLAttrContainerItem aNewItem( nWhich );
+
+ const sal_uInt16 nFound = nItem;
+ for( nItem = 0; nItem < nCount; nItem++ )
+ {
+ if( nItem != nFound )
+ {
+ OUString const& rNamespace(rAttr.GetAttrNamespace(nItem));
+ OUString const& rPrefix(rAttr.GetAttrPrefix(nItem));
+ if (rPrefix.isEmpty())
+ {
+ aNewItem.AddAttr(rAttr.GetAttrLName(nItem), rAttr.GetAttrValue(nItem));
+ }
+ else
+ {
+ aNewItem.AddAttr(rPrefix, rNamespace, rAttr.GetAttrLName(nItem), rAttr.GetAttrValue(nItem));
+ }
+ }
+ }
+
+ rSet.Put( aNewItem );
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/xml/sdtransform.hxx b/sd/source/filter/xml/sdtransform.hxx
new file mode 100644
index 000000000..64bb1c0a1
--- /dev/null
+++ b/sd/source/filter/xml/sdtransform.hxx
@@ -0,0 +1,28 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <drawdoc.hxx>
+
+void TransformOOo2xDocument(SdDrawDocument* pDocument);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/xml/sdxmlwrp.cxx b/sd/source/filter/xml/sdxmlwrp.cxx
new file mode 100644
index 000000000..90ef68e35
--- /dev/null
+++ b/sd/source/filter/xml/sdxmlwrp.cxx
@@ -0,0 +1,1056 @@
+/* -*- 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 <officecfg/Office/Common.hxx>
+#include <vcl/errinf.hxx>
+#include <sal/log.hxx>
+#include <com/sun/star/container/XChild.hpp>
+#include <com/sun/star/beans/XPropertySetInfo.hpp>
+#include <com/sun/star/embed/ElementModes.hpp>
+#include <com/sun/star/xml/sax/SAXParseException.hpp>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertysequence.hxx>
+#include <o3tl/string_view.hxx>
+#include <editeng/outlobj.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/docfilt.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <Outliner.hxx>
+#include <unotools/streamwrap.hxx>
+#include <svx/dialmgr.hxx>
+#include <svx/strings.hrc>
+#include <svx/xmlgrhlp.hxx>
+
+#include <DrawDocShell.hxx>
+
+#include <sdxmlwrp.hxx>
+#include <svx/xmleohlp.hxx>
+#include <com/sun/star/xml/sax/Parser.hpp>
+#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
+#include <com/sun/star/xml/sax/XFastParser.hpp>
+#include <com/sun/star/document/XFilter.hpp>
+#include <com/sun/star/document/XImporter.hpp>
+#include <com/sun/star/document/XExporter.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/packages/WrongPasswordException.hpp>
+#include <com/sun/star/packages/zip/ZipIOException.hpp>
+
+#include <com/sun/star/xml/sax/InputSource.hpp>
+#include <com/sun/star/xml/sax/Writer.hpp>
+#include <comphelper/genericpropertyset.hxx>
+#include <comphelper/propertysetinfo.hxx>
+#include <editeng/eeitem.hxx>
+
+// include necessary for XML progress bar at load time
+#include <svl/itemset.hxx>
+#include <svl/stritem.hxx>
+#include <svtools/sfxecode.hxx>
+
+#include <sddll.hxx>
+#include <sderror.hxx>
+#include <sdresid.hxx>
+#include "sdtransform.hxx"
+#include <strings.hrc>
+
+#include <sfx2/frame.hxx>
+#include <tools/debug.hxx>
+#include <tools/diagnose_ex.h>
+
+using namespace com::sun::star;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::document;
+using namespace comphelper;
+
+#define SD_XML_READERROR ErrCode(1234)
+
+char const sXML_export_impress_meta_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisMetaExporter";
+char const sXML_export_impress_styles_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisStylesExporter";
+char const sXML_export_impress_content_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisContentExporter";
+char const sXML_export_impress_settings_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisSettingsExporter";
+
+char const sXML_export_draw_meta_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisMetaExporter";
+char const sXML_export_draw_styles_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisStylesExporter";
+char const sXML_export_draw_content_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisContentExporter";
+char const sXML_export_draw_settings_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisSettingsExporter";
+
+char const sXML_import_impress_meta_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisMetaImporter";
+char const sXML_import_impress_styles_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisStylesImporter";
+char const sXML_import_impress_content_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisContentImporter";
+char const sXML_import_impress_settings_oasis_service[] = "com.sun.star.comp.Impress.XMLOasisSettingsImporter";
+
+char const sXML_import_draw_meta_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisMetaImporter";
+char const sXML_import_draw_styles_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisStylesImporter";
+char const sXML_import_draw_content_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisContentImporter";
+char const sXML_import_draw_settings_oasis_service[] = "com.sun.star.comp.Draw.XMLOasisSettingsImporter";
+
+// OOo
+char const sXML_import_impress_meta_ooo_service[] = "com.sun.star.comp.Impress.XMLMetaImporter";
+char const sXML_import_impress_styles_ooo_service[] = "com.sun.star.comp.Impress.XMLStylesImporter";
+char const sXML_import_impress_content_ooo_service[] = "com.sun.star.comp.Impress.XMLContentImporter";
+char const sXML_import_impress_settings_ooo_service[] = "com.sun.star.comp.Impress.XMLSettingsImporter";
+
+char const sXML_import_draw_meta_ooo_service[] = "com.sun.star.comp.Draw.XMLMetaImporter";
+char const sXML_import_draw_styles_ooo_service[] = "com.sun.star.comp.Draw.XMLStylesImporter";
+char const sXML_import_draw_content_ooo_service[] = "com.sun.star.comp.Draw.XMLContentImporter";
+char const sXML_import_draw_settings_ooo_service[] = "com.sun.star.comp.Draw.XMLSettingsImporter";
+
+namespace {
+
+struct XML_SERVICEMAP
+{
+ const char* mpService;
+ const char* mpStream;
+};
+
+struct XML_SERVICES
+{
+ const char* mpMeta;
+ const char* mpStyles;
+ const char* mpContent;
+ const char* mpSettings;
+};
+
+}
+
+static XML_SERVICES const * getServices( bool bImport, bool bDraw, sal_uLong nStoreVer )
+{
+ // Expect that export always sets nStoreVer to SOFFICE_FILEFORMAT_8.
+ assert(bImport || nStoreVer != SOFFICE_FILEFORMAT_60);
+
+ static XML_SERVICES const gServices[] =
+ {
+ { sXML_import_impress_meta_oasis_service, sXML_import_impress_styles_oasis_service, sXML_import_impress_content_oasis_service, sXML_import_impress_settings_oasis_service },
+ { sXML_import_draw_meta_oasis_service, sXML_import_draw_styles_oasis_service, sXML_import_draw_content_oasis_service, sXML_import_draw_settings_oasis_service },
+ { sXML_export_impress_meta_oasis_service, sXML_export_impress_styles_oasis_service, sXML_export_impress_content_oasis_service, sXML_export_impress_settings_oasis_service },
+ { sXML_export_draw_meta_oasis_service, sXML_export_draw_styles_oasis_service, sXML_export_draw_content_oasis_service, sXML_export_draw_settings_oasis_service },
+
+ { sXML_import_impress_meta_ooo_service, sXML_import_impress_styles_ooo_service, sXML_import_impress_content_ooo_service, sXML_import_impress_settings_ooo_service },
+ { sXML_import_draw_meta_ooo_service, sXML_import_draw_styles_ooo_service, sXML_import_draw_content_ooo_service, sXML_import_draw_settings_ooo_service },
+ };
+
+ return &gServices[ (bImport ? 0 : 2) + ((nStoreVer == SOFFICE_FILEFORMAT_60) ? 4 : 0) + (bDraw ? 1 : 0 ) ];
+}
+
+
+SdXMLFilter::SdXMLFilter( SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell, SdXMLFilterMode eFilterMode, sal_uLong nStoreVer ) :
+ SdFilter( rMedium, rDocShell ), meFilterMode( eFilterMode ), mnStoreVer( nStoreVer )
+{
+}
+
+SdXMLFilter::~SdXMLFilter()
+{
+}
+
+namespace
+{
+
+ErrCode ReadThroughComponent(
+ const Reference<io::XInputStream>& xInputStream,
+ const Reference<XComponent>& xModelComponent,
+ const OUString& rStreamName,
+ Reference<uno::XComponentContext> const & rxContext,
+ const char* pFilterName,
+ const Sequence<Any>& rFilterArguments,
+ const OUString& rName,
+ bool bMustBeSuccessful,
+ bool bEncrypted )
+{
+ DBG_ASSERT(xInputStream.is(), "input stream missing");
+ DBG_ASSERT(xModelComponent.is(), "document missing");
+ DBG_ASSERT(rxContext.is(), "factory missing");
+ DBG_ASSERT(nullptr != pFilterName,"I need a service name for the component!");
+
+ SAL_INFO( "sd.filter", "ReadThroughComponent" );
+
+ // prepare ParserInputSource
+ xml::sax::InputSource aParserInput;
+ aParserInput.sSystemId = rName;
+ aParserInput.aInputStream = xInputStream;
+
+ // get filter
+ OUString aFilterName(OUString::createFromAscii(pFilterName));
+ // the underlying SvXMLImport implements XFastParser, XImporter, XFastDocumentHandler
+ Reference< XInterface > xFilter(
+ rxContext->getServiceManager()->createInstanceWithArgumentsAndContext(aFilterName, rFilterArguments, rxContext),
+ UNO_QUERY );
+ SAL_WARN_IF(!xFilter.is(), "sd.filter", "Can't instantiate filter component: " << aFilterName);
+ if( !xFilter.is() )
+ return SD_XML_READERROR;
+ Reference< xml::sax::XFastParser > xFastParser(xFilter, UNO_QUERY);
+ Reference< xml::sax::XDocumentHandler > xDocumentHandler;
+ if (!xFastParser)
+ xDocumentHandler.set(xFilter, UNO_QUERY);
+ if (!xFastParser && !xDocumentHandler)
+ {
+ SAL_WARN("sd", "service does not implement XFastParser or XDocumentHandler");
+ assert(false);
+ return SD_XML_READERROR;
+ }
+ SAL_INFO( "sd.filter", "" << pFilterName << " created" );
+
+ // connect model and filter
+ Reference < XImporter > xImporter( xFilter, UNO_QUERY );
+ xImporter->setTargetDocument( xModelComponent );
+
+ // finally, parser the stream
+ SAL_INFO( "sd.filter", "parsing stream" );
+ try
+ {
+ if (xFastParser)
+ xFastParser->parseStream( aParserInput );
+ else
+ {
+ Reference< xml::sax::XParser > xParser = xml::sax::Parser::create(rxContext);
+ // connect parser and filter
+ xParser->setDocumentHandler( xDocumentHandler );
+ xParser->parseStream( aParserInput );
+ }
+ }
+ catch (const xml::sax::SAXParseException& r)
+ {
+ css::uno::Any ex( cppu::getCaughtException() );
+ // sax parser sends wrapped exceptions,
+ // try to find the original one
+ xml::sax::SAXException aSaxEx = *static_cast<xml::sax::SAXException const *>(&r);
+ bool bTryChild = true;
+
+ while( bTryChild )
+ {
+ xml::sax::SAXException aTmp;
+ if ( aSaxEx.WrappedException >>= aTmp )
+ aSaxEx = aTmp;
+ else
+ bTryChild = false;
+ }
+
+ packages::zip::ZipIOException aBrokenPackage;
+ if ( aSaxEx.WrappedException >>= aBrokenPackage )
+ return ERRCODE_IO_BROKENPACKAGE;
+
+ if( bEncrypted )
+ return ERRCODE_SFX_WRONGPASSWORD;
+
+ SAL_WARN( "sd.filter", "SAX parse exception caught while importing: " << exceptionToString(ex));
+
+ OUString sErr = OUString::number( r.LineNumber ) +
+ "," + OUString::number( r.ColumnNumber );
+
+ if (!rStreamName.isEmpty())
+ {
+ return *new TwoStringErrorInfo(
+ (bMustBeSuccessful ? ERR_FORMAT_FILE_ROWCOL
+ : WARN_FORMAT_FILE_ROWCOL),
+ rStreamName, sErr,
+ DialogMask::ButtonsOk | DialogMask::MessageError );
+ }
+ else
+ {
+ DBG_ASSERT( bMustBeSuccessful, "Warnings are not supported" );
+ return *new StringErrorInfo( ERR_FORMAT_ROWCOL, sErr,
+ DialogMask::ButtonsOk | DialogMask::MessageError );
+ }
+ }
+ catch (const xml::sax::SAXException& r)
+ {
+ css::uno::Any ex( cppu::getCaughtException() );
+ packages::zip::ZipIOException aBrokenPackage;
+ if ( r.WrappedException >>= aBrokenPackage )
+ return ERRCODE_IO_BROKENPACKAGE;
+
+ if( bEncrypted )
+ return ERRCODE_SFX_WRONGPASSWORD;
+
+ SAL_WARN( "sd.filter", "SAX exception caught while importing: " << exceptionToString(ex));
+ return SD_XML_READERROR;
+ }
+ catch (const packages::zip::ZipIOException&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd.filter", "Zip exception caught while importing");
+ return ERRCODE_IO_BROKENPACKAGE;
+ }
+ catch (const io::IOException&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd.filter", "IO exception caught while importing");
+ return SD_XML_READERROR;
+ }
+ catch (const uno::Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd.filter", "uno exception caught while importing");
+ return SD_XML_READERROR;
+ }
+
+ // success!
+ return ERRCODE_NONE;
+}
+
+ErrCode ReadThroughComponent(
+ const uno::Reference < embed::XStorage >& xStorage,
+ const Reference<XComponent>& xModelComponent,
+ const char* pStreamName,
+ Reference<uno::XComponentContext> const & rxContext,
+ const char* pFilterName,
+ const Sequence<Any>& rFilterArguments,
+ const OUString& rName,
+ bool bMustBeSuccessful )
+{
+ DBG_ASSERT(xStorage.is(), "Need storage!");
+ DBG_ASSERT(nullptr != pStreamName, "Please, please, give me a name!");
+
+ // open stream (and set parser input)
+ OUString sStreamName = OUString::createFromAscii(pStreamName);
+ bool bContainsStream = false;
+ try
+ {
+ bContainsStream = xStorage->isStreamElement(sStreamName);
+ }
+ catch (const container::NoSuchElementException&)
+ {
+ }
+
+ if (!bContainsStream )
+ {
+ // stream name not found! return immediately with OK signal
+ return ERRCODE_NONE;
+ }
+
+ // set Base URL
+ uno::Reference< beans::XPropertySet > xInfoSet;
+ if( rFilterArguments.hasElements() )
+ rFilterArguments.getConstArray()[0] >>= xInfoSet;
+ DBG_ASSERT( xInfoSet.is(), "missing property set" );
+ if( xInfoSet.is() )
+ {
+ xInfoSet->setPropertyValue( "StreamName", Any( sStreamName ) );
+ }
+
+ try
+ {
+ // get input stream
+ Reference <io::XStream> xStream =
+ xStorage->openStreamElement( sStreamName, embed::ElementModes::READ );
+ Reference <beans::XPropertySet > xProps( xStream, uno::UNO_QUERY );
+ if ( !xStream.is() || ! xProps.is() )
+ return SD_XML_READERROR;
+
+ Any aAny = xProps->getPropertyValue( "Encrypted" );
+
+ bool bEncrypted = false;
+ aAny >>= bEncrypted;
+
+ Reference <io::XInputStream> xInputStream = xStream->getInputStream();
+
+ // read from the stream
+ return ReadThroughComponent(
+ xInputStream, xModelComponent, sStreamName, rxContext,
+ pFilterName, rFilterArguments,
+ rName, bMustBeSuccessful, bEncrypted );
+ }
+ catch (const packages::WrongPasswordException&)
+ {
+ return ERRCODE_SFX_WRONGPASSWORD;
+ }
+ catch (const packages::zip::ZipIOException&)
+ {
+ return ERRCODE_IO_BROKENPACKAGE;
+ }
+ catch (const uno::Exception&)
+ {}
+
+ return SD_XML_READERROR;
+}
+
+}
+
+//PresObjKind::Outlines in master pages are the preview of the outline styles
+//numbering format. Since fdo#78151 toggling bullets on and off changes
+//the style they are a preview of, previously toggling bullets on and off
+//would only affect the preview paragraph itself without an effect on the
+//style. i.e. previews of numbering which don't match the real numbering
+//they are supposed to be a preview of.
+//
+//But there exist documents which were saved previous to that modification
+//so here we detect such cases and fix them up to ensure the previews
+//numbering level matches that of the outline level it previews
+static void fixupOutlinePlaceholderNumberingDepths(SdDrawDocument* pDoc)
+{
+ for (sal_uInt16 i = 0; i < pDoc->GetMasterSdPageCount(PageKind::Standard); ++i)
+ {
+ SdPage *pMasterPage = pDoc->GetMasterSdPage(i, PageKind::Standard);
+ SdrObject* pMasterOutline = pMasterPage->GetPresObj(PresObjKind::Outline);
+ if (!pMasterOutline)
+ continue;
+ OutlinerParaObject* pOutlParaObj = pMasterOutline->GetOutlinerParaObject();
+ if (!pOutlParaObj)
+ continue;
+ SdOutliner* pOutliner = pDoc->GetInternalOutliner();
+ pOutliner->Clear();
+ pOutliner->SetText(*pOutlParaObj);
+ bool bInconsistent = false;
+ const sal_Int32 nParaCount = pOutliner->GetParagraphCount();
+ for (sal_Int32 j = 0; j < nParaCount; ++j)
+ {
+ //Make sure the depth of the paragraph matches that of the outline style it previews
+ const sal_Int16 nExpectedDepth = j;
+ if (nExpectedDepth != pOutliner->GetDepth(j))
+ {
+ Paragraph* p = pOutliner->GetParagraph(j);
+ pOutliner->SetDepth(p, nExpectedDepth);
+ bInconsistent = true;
+ }
+
+ //If the preview has hard-coded bullets/numbering then they must
+ //be stripped to reveal the true underlying styles attributes
+ SfxItemSet aAttrs(pOutliner->GetParaAttribs(j));
+ if (aAttrs.GetItemState(EE_PARA_NUMBULLET) == SfxItemState::SET)
+ {
+ aAttrs.ClearItem(EE_PARA_NUMBULLET);
+ pOutliner->SetParaAttribs(j, aAttrs);
+ bInconsistent = true;
+ }
+
+ }
+ if (bInconsistent)
+ {
+ SAL_WARN("sd.filter", "Fixing inconsistent outline numbering placeholder preview");
+ pMasterOutline->SetOutlinerParaObject(pOutliner->CreateParaObject(0, nParaCount));
+ }
+ pOutliner->Clear();
+ }
+}
+
+bool SdXMLFilter::Import( ErrCode& nError )
+{
+ ErrCode nRet = ERRCODE_NONE;
+
+ // Get service factory
+ Reference< uno::XComponentContext > rxContext =
+ comphelper::getProcessComponentContext();
+
+ SdDrawDocument* pDoc = mrDocShell.GetDoc();
+ bool const bWasUndo(pDoc->IsUndoEnabled());
+ pDoc->EnableUndo(false);
+ pDoc->NewOrLoadCompleted( DocCreationMode::New );
+ pDoc->CreateFirstPages();
+ pDoc->StopWorkStartupDelay();
+
+ mxModel->lockControllers();
+
+ /** property map for import info set */
+ static PropertyMapEntry const aImportInfoMap[] =
+ {
+ // necessary properties for XML progress bar at load time
+ { OUString("ProgressRange"), 0, cppu::UnoType<sal_Int32>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},
+ { OUString("ProgressMax"), 0, cppu::UnoType<sal_Int32>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},
+ { OUString("ProgressCurrent"), 0, cppu::UnoType<sal_Int32>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},
+ { OUString("Preview"), 0, cppu::UnoType<sal_Bool>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},
+ { OUString("PageLayouts"), 0, cppu::UnoType<container::XNameAccess>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},
+ { OUString("PrivateData"), 0, cppu::UnoType<XInterface>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 },
+ { OUString("BaseURI"), 0, cppu::UnoType<OUString>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 },
+ { OUString("StreamRelPath"), 0, cppu::UnoType<OUString>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 },
+ { OUString("StreamName"), 0, cppu::UnoType<OUString>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 },
+ { OUString("BuildId"), 0, cppu::UnoType<OUString>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 },
+ { OUString("OrganizerMode"), 0, cppu::UnoType<bool>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 },
+ { OUString("SourceStorage"), 0, cppu::UnoType<embed::XStorage>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 },
+ };
+
+ uno::Reference< beans::XPropertySet > xInfoSet( GenericPropertySet_CreateInstance( new PropertySetInfo( aImportInfoMap ) ) );
+ xInfoSet->setPropertyValue( "Preview" , uno::Any( mrDocShell.GetDoc()->IsStarDrawPreviewMode() ) );
+
+ // ---- get BuildId from parent container if available
+
+ uno::Reference< container::XChild > xChild( mxModel, uno::UNO_QUERY );
+ if( xChild.is() )
+ {
+ uno::Reference< beans::XPropertySet > xParentSet( xChild->getParent(), uno::UNO_QUERY );
+ if( xParentSet.is() )
+ {
+ uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xParentSet->getPropertySetInfo() );
+ OUString sPropName( "BuildId" );
+ if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(sPropName) )
+ {
+ xInfoSet->setPropertyValue( sPropName, xParentSet->getPropertyValue(sPropName) );
+ }
+ }
+ }
+
+ uno::Reference<document::XGraphicStorageHandler> xGraphicStorageHandler;
+ rtl::Reference<SvXMLGraphicHelper> xGraphicHelper;
+ Reference< document::XEmbeddedObjectResolver > xObjectResolver;
+ rtl::Reference<SvXMLEmbeddedObjectHelper> xObjectHelper;
+
+ Reference< lang::XComponent > xModelComp = mxModel;
+
+ // try to get an XStatusIndicator from the Medium
+ {
+ SfxItemSet* pSet = mrMedium.GetItemSet();
+ if(pSet)
+ {
+ const SfxUnoAnyItem* pItem = pSet->GetItem(SID_PROGRESS_STATUSBAR_CONTROL);
+ if (pItem)
+ {
+ pItem->GetValue() >>= mxStatusIndicator;
+ }
+ }
+
+ if(mxStatusIndicator.is())
+ {
+ sal_Int32 nProgressRange(1000000);
+ OUString aMsg(SvxResId(RID_SVXSTR_DOC_LOAD));
+ mxStatusIndicator->start(aMsg, nProgressRange);
+
+ // set ProgressRange
+ uno::Any aProgRange;
+ aProgRange <<= nProgressRange;
+ xInfoSet->setPropertyValue( "ProgressRange" , aProgRange);
+
+ // set ProgressCurrent
+ uno::Any aProgCurrent;
+ aProgCurrent <<= sal_Int32(0);
+ xInfoSet->setPropertyValue( "ProgressCurrent" , aProgCurrent);
+ }
+ }
+
+ // get the input stream (storage or stream)
+
+ uno::Reference < embed::XStorage > xStorage = mrMedium.GetStorage();
+
+ xInfoSet->setPropertyValue( "SourceStorage", Any( xStorage ) );
+
+ if( !xStorage.is() )
+ nRet = SD_XML_READERROR;
+
+ if( ERRCODE_NONE == nRet )
+ {
+ xGraphicHelper = SvXMLGraphicHelper::Create( xStorage,
+ SvXMLGraphicHelperMode::Read );
+ xGraphicStorageHandler = xGraphicHelper.get();
+ xObjectHelper = SvXMLEmbeddedObjectHelper::Create(
+ xStorage, *pDoc->GetPersist(),
+ SvXMLEmbeddedObjectHelperMode::Read );
+ xObjectResolver = xObjectHelper.get();
+ }
+
+ // Set base URI
+ OUString const baseURI(mrMedium.GetBaseURL());
+ // needed for relative URLs, but in clipboard copy/paste there may be none
+ SAL_INFO_IF(baseURI.isEmpty(), "sd.filter", "SdXMLFilter: no base URL");
+ xInfoSet->setPropertyValue("BaseURI", Any(baseURI));
+
+ if( ERRCODE_NONE == nRet && SfxObjectCreateMode::EMBEDDED == mrDocShell.GetCreateMode() )
+ {
+ OUString aName;
+ if ( mrMedium.GetItemSet() )
+ {
+ const SfxStringItem* pDocHierarchItem =
+ mrMedium.GetItemSet()->GetItem(SID_DOC_HIERARCHICALNAME);
+ if ( pDocHierarchItem )
+ aName = pDocHierarchItem->GetValue();
+ }
+ else
+ aName = "dummyObjectName" ;
+
+ if( !aName.isEmpty() )
+ xInfoSet->setPropertyValue( "StreamRelPath", Any( aName ) );
+ }
+
+ if (SdXMLFilterMode::Organizer == meFilterMode)
+ xInfoSet->setPropertyValue("OrganizerMode", uno::Any(true));
+
+ if( ERRCODE_NONE == nRet )
+ {
+
+ // prepare filter arguments
+ Sequence<Any> aFilterArgs( 4 );
+ Any *pArgs = aFilterArgs.getArray();
+ *pArgs++ <<= xInfoSet;
+ *pArgs++ <<= xGraphicStorageHandler;
+ *pArgs++ <<= xObjectResolver;
+ *pArgs++ <<= mxStatusIndicator;
+
+ Sequence<Any> aEmptyArgs( 2 );
+ pArgs = aEmptyArgs.getArray();
+ *pArgs++ <<= xInfoSet;
+ *pArgs++ <<= mxStatusIndicator;
+
+ const OUString aName( mrMedium.GetName() );
+
+ XML_SERVICES const * pServices = getServices( true, IsDraw(), mnStoreVer );
+
+ ErrCode nWarn = ERRCODE_NONE;
+ ErrCode nWarn2 = ERRCODE_NONE;
+ // read storage streams
+ // #i103539#: always read meta.xml for generator
+ nWarn = ReadThroughComponent(
+ xStorage, xModelComp, "meta.xml", rxContext,
+ pServices->mpMeta,
+ aEmptyArgs, aName, false );
+
+ if( meFilterMode != SdXMLFilterMode::Organizer )
+ {
+ nWarn2 = ReadThroughComponent(
+ xStorage, xModelComp, "settings.xml", rxContext,
+ pServices->mpSettings,
+ aFilterArgs, aName, false );
+ }
+
+ nRet = ReadThroughComponent(
+ xStorage, xModelComp, "styles.xml", rxContext,
+ pServices->mpStyles,
+ aFilterArgs, aName, true );
+
+ if( !nRet && (meFilterMode != SdXMLFilterMode::Organizer) )
+ nRet = ReadThroughComponent(
+ xStorage, xModelComp, "content.xml", rxContext,
+ pServices->mpContent,
+ aFilterArgs, aName, true );
+
+ if( !nRet )
+ {
+ if( nWarn )
+ nRet = nWarn;
+ else if( nWarn2 )
+ nRet = nWarn2;
+ }
+ }
+
+ if( xGraphicHelper )
+ xGraphicHelper->dispose();
+ xGraphicHelper.clear();
+ xGraphicStorageHandler = nullptr;
+ if( xObjectHelper.is() )
+ xObjectHelper->dispose();
+ xObjectHelper.clear();
+ xObjectResolver = nullptr;
+
+ if( mxStatusIndicator.is() )
+ mxStatusIndicator->end();
+
+ if( mxModel.is() )
+ mxModel->unlockControllers();
+
+ if( nRet == ERRCODE_NONE )
+ pDoc->UpdateAllLinks();
+
+ if( nRet.anyOf( ERRCODE_NONE, SD_XML_READERROR ) )
+ ;
+ else if( nRet == ERRCODE_IO_BROKENPACKAGE && xStorage.is() )
+ nError = ERRCODE_IO_BROKENPACKAGE;
+ else
+ {
+ // TODO/LATER: this is completely wrong! Filter code should never call ErrorHandler directly!
+ ErrorHandler::HandleError( nRet );
+ if( nRet.IsWarning() )
+ nRet = ERRCODE_NONE;
+ }
+
+ // clear unused named items from item pool
+
+ ::svx::DropUnusedNamedItems(mxModel);
+
+ // set BuildId on XModel for later OLE object loading
+ if( xInfoSet.is() )
+ {
+ uno::Reference< beans::XPropertySet > xModelSet( mxModel, uno::UNO_QUERY );
+ if( xModelSet.is() )
+ {
+ uno::Reference< beans::XPropertySetInfo > xModelSetInfo( xModelSet->getPropertySetInfo() );
+ static const OUStringLiteral sPropName( u"BuildId" );
+
+ OUString sBuildId;
+ xInfoSet->getPropertyValue(sPropName) >>= sBuildId;
+
+ if( xModelSetInfo.is() && xModelSetInfo->hasPropertyByName(sPropName) )
+ {
+ xModelSet->setPropertyValue( sPropName, Any( sBuildId ) );
+ }
+
+ bool bTransform = false;
+
+ if( nRet == ERRCODE_NONE )
+ {
+ if( !sBuildId.isEmpty() )
+ {
+ sal_Int32 nIndex = sBuildId.indexOf('$');
+ if( nIndex != -1 )
+ {
+ sal_Int32 nUPD = o3tl::toInt32(sBuildId.subView( 0, nIndex ));
+
+ if( nUPD == 300 )
+ {
+ sal_Int32 nBuildId = o3tl::toInt32(sBuildId.subView( nIndex+1 ));
+ if( (nBuildId > 0) && (nBuildId < 9316) )
+ bTransform = true; // treat OOo 3.0 beta1 as OOo 2.x
+ }
+ else if( (nUPD == 680) || ( nUPD >= 640 && nUPD <= 645 ) )
+ bTransform = true;
+ }
+ }
+ else
+ {
+ // check for binary formats
+ std::shared_ptr<const SfxFilter> pFilter = mrMedium.GetFilter();
+ if( pFilter )
+ {
+ OUString typeName(pFilter->GetRealTypeName());
+ if( typeName.startsWith( "impress_StarImpress" ) ||
+ typeName.startsWith( "draw_StarDraw" ) )
+ {
+ bTransform = true;
+ }
+ }
+ }
+ }
+
+ if( bTransform )
+ TransformOOo2xDocument( pDoc );
+ }
+ }
+
+ fixupOutlinePlaceholderNumberingDepths(pDoc);
+
+ pDoc->EnableUndo(bWasUndo);
+ mrDocShell.ClearUndoBuffer();
+ return nRet == ERRCODE_NONE;
+}
+
+bool SdXMLFilter::Export()
+{
+ rtl::Reference<SvXMLEmbeddedObjectHelper> xObjectHelper;
+ rtl::Reference<SvXMLGraphicHelper> xGraphicHelper;
+ bool bDocRet = false;
+
+ if( !mxModel.is() )
+ {
+ SAL_WARN( "sd.filter","Got NO Model in XMLExport");
+ return false;
+ }
+
+ bool bLocked = mxModel->hasControllersLocked();
+
+ try
+ {
+ mxModel->lockControllers();
+
+ uno::Reference< lang::XServiceInfo > xServiceInfo( mxModel, uno::UNO_QUERY );
+
+ if( !xServiceInfo.is() || !xServiceInfo->supportsService( "com.sun.star.drawing.GenericDrawingDocument" ) )
+ {
+ SAL_WARN( "sd.filter", "Model is no DrawingDocument in XMLExport" );
+ return false;
+ }
+
+ uno::Reference<uno::XComponentContext> xContext( ::comphelper::getProcessComponentContext() );
+
+ uno::Reference< xml::sax::XWriter > xWriter = xml::sax::Writer::create( xContext );
+
+ /** property map for export info set */
+ static PropertyMapEntry const aExportInfoMap[] =
+ {
+ { OUString("ProgressRange"), 0, cppu::UnoType<sal_Int32>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},
+ { OUString("ProgressMax"), 0, cppu::UnoType<sal_Int32>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},
+ { OUString("ProgressCurrent"), 0, cppu::UnoType<sal_Int32>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},
+ { OUString("UsePrettyPrinting"),0, cppu::UnoType<bool>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},
+ { OUString("PageLayoutNames"), 0, cppu::UnoType<OUString>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},
+ { OUString("BaseURI"), 0, cppu::UnoType<OUString>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 },
+ { OUString("StreamRelPath"), 0, cppu::UnoType<OUString>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 },
+ { OUString("StreamName"), 0, cppu::UnoType<OUString>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 },
+ { OUString("StyleNames"), 0, cppu::UnoType<Sequence<OUString>>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 },
+ { OUString("StyleFamilies"), 0, cppu::UnoType<Sequence<sal_Int32>>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 },
+ { OUString("TargetStorage"), 0, cppu::UnoType<embed::XStorage>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0 },
+ };
+
+ uno::Reference< beans::XPropertySet > xInfoSet( GenericPropertySet_CreateInstance( new PropertySetInfo( aExportInfoMap ) ) );
+
+ bool bUsePrettyPrinting = officecfg::Office::Common::Save::Document::PrettyPrinting::get();
+ xInfoSet->setPropertyValue( "UsePrettyPrinting", Any( bUsePrettyPrinting ) );
+
+ const uno::Reference < embed::XStorage >& xStorage = mrMedium.GetOutputStorage();
+
+ // Set base URI
+ OUString sPropName( "BaseURI" );
+ xInfoSet->setPropertyValue( sPropName, Any( mrMedium.GetBaseURL( true ) ) );
+
+ xInfoSet->setPropertyValue( "TargetStorage", Any( xStorage ) );
+
+ if( SfxObjectCreateMode::EMBEDDED == mrDocShell.GetCreateMode() )
+ {
+ OUString aName;
+ if ( mrMedium.GetItemSet() )
+ {
+ const SfxStringItem* pDocHierarchItem =
+ mrMedium.GetItemSet()->GetItem(SID_DOC_HIERARCHICALNAME);
+ if ( pDocHierarchItem )
+ aName = pDocHierarchItem->GetValue();
+ }
+
+ if( !aName.isEmpty() )
+ {
+ sPropName = "StreamRelPath";
+ xInfoSet->setPropertyValue( sPropName, Any( aName ) );
+ }
+ }
+
+ // initialize descriptor
+ uno::Sequence< beans::PropertyValue > aDescriptor( 1 );
+ beans::PropertyValue* pProps = aDescriptor.getArray();
+
+ pProps[0].Name = "FileName";
+ pProps[0].Value <<= mrMedium.GetName();
+
+ {
+ uno::Reference< document::XEmbeddedObjectResolver > xObjectResolver;
+ uno::Reference<document::XGraphicStorageHandler> xGraphicStorageHandler;
+
+ // create helper for graphic and ole export if we have a storage
+ if( xStorage.is() )
+ {
+ xObjectHelper = SvXMLEmbeddedObjectHelper::Create( xStorage, *mrDocShell.GetDoc()->GetPersist(), SvXMLEmbeddedObjectHelperMode::Write );
+ xObjectResolver = xObjectHelper.get();
+
+ xGraphicHelper = SvXMLGraphicHelper::Create( xStorage, SvXMLGraphicHelperMode::Write );
+ xGraphicStorageHandler = xGraphicHelper.get();
+ }
+
+ CreateStatusIndicator();
+ if(mxStatusIndicator.is())
+ {
+ sal_Int32 nProgressRange(1000000);
+ OUString aMsg(SdResId(STR_SAVE_DOC));
+ mxStatusIndicator->start(aMsg, nProgressRange);
+
+ // set ProgressRange
+ uno::Any aProgRange;
+ aProgRange <<= nProgressRange;
+ xInfoSet->setPropertyValue( "ProgressRange" , aProgRange);
+
+ // set ProgressCurrent
+ uno::Any aProgCurrent;
+ aProgCurrent <<= sal_Int32(0);
+ xInfoSet->setPropertyValue( "ProgressCurrent" , aProgCurrent);
+ }
+
+ XML_SERVICES const * pServiceNames = getServices( false, IsDraw(), mnStoreVer );
+
+ XML_SERVICEMAP aServices[5]; sal_uInt16 i = 0;
+ aServices[i ].mpService = pServiceNames->mpStyles;
+ aServices[i++].mpStream = "styles.xml";
+
+ aServices[i ].mpService = pServiceNames->mpContent;
+ aServices[i++].mpStream = "content.xml";
+
+ aServices[i ].mpService = pServiceNames->mpSettings;
+ aServices[i++].mpStream = "settings.xml";
+
+ if( mrDocShell.GetCreateMode() != SfxObjectCreateMode::EMBEDDED )
+ {
+ aServices[i ].mpService = pServiceNames->mpMeta;
+ aServices[i++].mpStream = "meta.xml";
+ };
+
+ aServices[i].mpService = nullptr;
+ aServices[i].mpStream = nullptr;
+
+ XML_SERVICEMAP* pServices = aServices;
+
+ // doc export
+ do
+ {
+ SAL_INFO( "sd.filter", "exporting substream " << pServices->mpStream );
+
+ uno::Reference<io::XOutputStream> xDocOut;
+ if( xStorage.is() )
+ {
+ const OUString sDocName( OUString::createFromAscii( pServices->mpStream ) );
+ uno::Reference<io::XStream> xStream =
+ xStorage->openStreamElement( sDocName,
+ embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE );
+
+ DBG_ASSERT(xStream.is(), "Can't create output stream in package!");
+ if( !xStream.is() )
+ return false;
+
+ xDocOut = xStream->getOutputStream();
+ Reference <beans::XPropertySet > xProps( xStream, uno::UNO_QUERY );
+ if( !xDocOut.is() || !xProps.is() )
+ return false;
+
+ xProps->setPropertyValue( "MediaType", Any(OUString( "text/xml")));
+
+ // encrypt all streams
+ xProps->setPropertyValue( "UseCommonStoragePasswordEncryption",
+ uno::Any( true ) );
+
+ xInfoSet->setPropertyValue( "StreamName", Any( sDocName ) );
+ }
+
+ xWriter->setOutputStream( xDocOut );
+
+ uno::Sequence< uno::Any > aArgs( 2 + ( mxStatusIndicator.is() ? 1 : 0 ) + ( xGraphicStorageHandler.is() ? 1 : 0 ) + ( xObjectResolver.is() ? 1 : 0 ) );
+ uno::Any* pArgs = aArgs.getArray();
+ *pArgs++ <<= xInfoSet;
+ if (xGraphicStorageHandler.is())
+ *pArgs++ <<= xGraphicStorageHandler;
+ if (xObjectResolver.is())
+ *pArgs++ <<= xObjectResolver;
+ if (mxStatusIndicator.is())
+ *pArgs++ <<= mxStatusIndicator;
+
+ *pArgs <<= xWriter;
+
+ uno::Reference< document::XFilter > xFilter( xContext->getServiceManager()->createInstanceWithArgumentsAndContext( OUString::createFromAscii( pServices->mpService ), aArgs, xContext ), uno::UNO_QUERY );
+ if( xFilter.is() )
+ {
+ uno::Reference< document::XExporter > xExporter( xFilter, uno::UNO_QUERY );
+ if( xExporter.is() )
+ {
+ xExporter->setSourceDocument( mxModel );
+ // outputstream will be closed by SAX parser
+ bDocRet = xFilter->filter( aDescriptor );
+ }
+ }
+
+ pServices++;
+ }
+ while( bDocRet && pServices->mpService );
+
+ if(mxStatusIndicator.is())
+ mxStatusIndicator->end();
+ }
+ }
+ catch (const uno::Exception &)
+ {
+ TOOLS_WARN_EXCEPTION( "sd.filter", "uno Exception caught while exporting");
+ bDocRet = false;
+ }
+ if ( !bLocked )
+ mxModel->unlockControllers();
+
+ if( xGraphicHelper )
+ xGraphicHelper->dispose();
+ xGraphicHelper.clear();
+
+ if( xObjectHelper )
+ xObjectHelper->dispose();
+ xObjectHelper.clear();
+
+ return bDocRet;
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT bool TestImportFODP(SvStream &rStream)
+{
+ SdDLL::Init();
+
+ sd::DrawDocShellRef xDocSh(new sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Impress));
+ xDocSh->DoInitNew();
+ uno::Reference<frame::XModel> xModel(xDocSh->GetModel());
+
+ uno::Reference<lang::XMultiServiceFactory> xMultiServiceFactory(comphelper::getProcessServiceFactory());
+ uno::Reference<io::XInputStream> xStream(new ::utl::OSeekableInputStreamWrapper(rStream));
+ uno::Reference<uno::XInterface> xInterface(xMultiServiceFactory->createInstance("com.sun.star.comp.Writer.XmlFilterAdaptor"), uno::UNO_SET_THROW);
+
+ css::uno::Sequence<OUString> aUserData
+ {
+ "com.sun.star.comp.filter.OdfFlatXml",
+ "",
+ "com.sun.star.comp.Impress.XMLOasisImporter",
+ "com.sun.star.comp.Impress.XMLOasisExporter",
+ "",
+ "",
+ "true"
+ };
+ uno::Sequence<beans::PropertyValue> aAdaptorArgs(comphelper::InitPropertySequence(
+ {
+ { "UserData", uno::Any(aUserData) },
+ }));
+ css::uno::Sequence<uno::Any> aOuterArgs{ uno::Any(aAdaptorArgs) };
+
+ uno::Reference<lang::XInitialization> xInit(xInterface, uno::UNO_QUERY_THROW);
+ xInit->initialize(aOuterArgs);
+
+ uno::Reference<document::XImporter> xImporter(xInterface, uno::UNO_QUERY_THROW);
+ uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence(
+ {
+ { "InputStream", uno::Any(xStream) },
+ { "URL", uno::Any(OUString("private:stream")) },
+ }));
+ xImporter->setTargetDocument(xModel);
+
+ uno::Reference<document::XFilter> xFilter(xInterface, uno::UNO_QUERY_THROW);
+ //SetLoading hack because the document properties will be re-initted
+ //by the xml filter and during the init, while it's considered uninitialized,
+ //setting a property will inform the document it's modified, which attempts
+ //to update the properties, which throws cause the properties are uninitialized
+ xDocSh->SetLoading(SfxLoadedFlags::NONE);
+ bool ret = xFilter->filter(aArgs);
+ xDocSh->SetLoading(SfxLoadedFlags::ALL);
+
+ xDocSh->DoClose();
+
+ return ret;
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT bool TestImportPPTX(SvStream &rStream)
+{
+ SdDLL::Init();
+
+ sd::DrawDocShellRef xDocSh(new sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Impress));
+ xDocSh->DoInitNew();
+ uno::Reference<frame::XModel> xModel(xDocSh->GetModel());
+
+ uno::Reference<lang::XMultiServiceFactory> xMultiServiceFactory(comphelper::getProcessServiceFactory());
+ uno::Reference<io::XInputStream> xStream(new utl::OSeekableInputStreamWrapper(rStream));
+
+ uno::Reference<document::XFilter> xFilter(xMultiServiceFactory->createInstance("com.sun.star.comp.oox.ppt.PowerPointImport"), uno::UNO_QUERY_THROW);
+
+ uno::Reference<document::XImporter> xImporter(xFilter, uno::UNO_QUERY_THROW);
+ uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence(
+ {
+ { "InputStream", uno::Any(xStream) },
+ { "InputMode", uno::Any(true) },
+ }));
+ xImporter->setTargetDocument(xModel);
+
+ //SetLoading hack because the document properties will be re-initted
+ //by the xml filter and during the init, while it's considered uninitialized,
+ //setting a property will inform the document it's modified, which attempts
+ //to update the properties, which throws cause the properties are uninitialized
+ xDocSh->SetLoading(SfxLoadedFlags::NONE);
+ bool ret = false;
+ try
+ {
+ ret = xFilter->filter(aArgs);
+ }
+ catch (...)
+ {
+ }
+ xDocSh->SetLoading(SfxLoadedFlags::ALL);
+
+ xDocSh->DoClose();
+
+ return ret;
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/helper/simplereferencecomponent.cxx b/sd/source/helper/simplereferencecomponent.cxx
new file mode 100644
index 000000000..740c2629b
--- /dev/null
+++ b/sd/source/helper/simplereferencecomponent.cxx
@@ -0,0 +1,72 @@
+/* -*- 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 <helper/simplereferencecomponent.hxx>
+
+#include <com/sun/star/uno/RuntimeException.hpp>
+#include <osl/diagnose.h>
+#include <tools/diagnose_ex.h>
+
+using com::sun::star::uno::RuntimeException;
+using sd::SimpleReferenceComponent;
+
+SimpleReferenceComponent::SimpleReferenceComponent()
+ : m_nCount(0)
+ , mbDisposed(false)
+{
+}
+
+SimpleReferenceComponent::~SimpleReferenceComponent()
+{
+ OSL_ASSERT(m_nCount == 0);
+ OSL_ASSERT(mbDisposed);
+}
+
+void SimpleReferenceComponent::acquire() { osl_atomic_increment(&m_nCount); }
+
+void SimpleReferenceComponent::release()
+{
+ if ((1 == m_nCount) && !mbDisposed)
+ {
+ try
+ {
+ Dispose();
+ }
+ catch (RuntimeException const&) // don't break throw ()
+ {
+ TOOLS_WARN_EXCEPTION("sd", "");
+ }
+ }
+
+ if (osl_atomic_decrement(&m_nCount) == 0)
+ delete this;
+}
+
+void SimpleReferenceComponent::Dispose()
+{
+ if (!mbDisposed)
+ {
+ mbDisposed = true;
+ disposing();
+ }
+}
+
+void SimpleReferenceComponent::disposing() {}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx b/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx
new file mode 100644
index 000000000..c297184fa
--- /dev/null
+++ b/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx
@@ -0,0 +1,773 @@
+/* -*- 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 <AccessibleDocumentViewBase.hxx>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/document/XShapeEventBroadcaster.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <rtl/ustrbuf.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <sfx2/objsh.hxx>
+#include <tools/debug.hxx>
+
+#include <cppuhelper/queryinterface.hxx>
+#include <svx/svdobj.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <Window.hxx>
+#include <OutlineViewShell.hxx>
+
+#include <svx/svdlayer.hxx>
+#include <editeng/editobj.hxx>
+#include <LayerTabBar.hxx>
+#include <svtools/colorcfg.hxx>
+#include <ViewShell.hxx>
+#include <View.hxx>
+#include <drawdoc.hxx>
+#include <editeng/outlobj.hxx>
+#include <sdpage.hxx>
+#include <DrawViewShell.hxx>
+#include <PresentationViewShell.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::accessibility;
+using ::com::sun::star::uno::Reference;
+
+namespace accessibility {
+
+//===== internal ============================================================
+AccessibleDocumentViewBase::AccessibleDocumentViewBase (
+ ::sd::Window* pSdWindow,
+ ::sd::ViewShell* pViewShell,
+ const uno::Reference<frame::XController>& rxController,
+ const uno::Reference<XAccessible>& rxParent)
+ : AccessibleContextBase (rxParent,
+ pViewShell->GetDoc()->GetDocumentType() == DocumentType::Impress ?
+ AccessibleRole::DOCUMENT_PRESENTATION :
+ AccessibleRole::DOCUMENT),
+ mxController (rxController),
+ maViewForwarder (
+ static_cast<SdrPaintView*>(pViewShell->GetView()),
+ *pSdWindow->GetOutDev())
+{
+ if (mxController.is())
+ mxModel = mxController->getModel();
+
+ // Fill the shape tree info.
+ maShapeTreeInfo.SetModelBroadcaster (
+ uno::Reference<document::XShapeEventBroadcaster>(
+ mxModel, uno::UNO_QUERY_THROW));
+ maShapeTreeInfo.SetController (mxController);
+ maShapeTreeInfo.SetSdrView (pViewShell->GetView());
+ maShapeTreeInfo.SetWindow (pSdWindow);
+ maShapeTreeInfo.SetViewForwarder (&maViewForwarder);
+
+ mxWindow = ::VCLUnoHelper::GetInterface (pSdWindow);
+ mpViewShell = pViewShell;
+}
+
+AccessibleDocumentViewBase::~AccessibleDocumentViewBase()
+{
+ // At this place we should be disposed. You may want to add a
+ // corresponding assertion into the destructor of a derived class.
+}
+
+void AccessibleDocumentViewBase::Init()
+{
+ // Finish the initialization of the shape tree info container.
+ maShapeTreeInfo.SetDocumentWindow (this);
+
+ // Register as window listener to stay up to date with its size and
+ // position.
+ mxWindow->addWindowListener (this);
+ // Register as focus listener to
+ mxWindow->addFocusListener (this);
+
+ // Determine the list of shapes on the current page.
+ uno::Reference<drawing::XShapes> xShapeList;
+ uno::Reference<drawing::XDrawView> xView (mxController, uno::UNO_QUERY);
+ if (xView.is())
+ xShapeList = xView->getCurrentPage();
+
+ // Register this object as dispose event listener at the model.
+ if (mxModel.is())
+ mxModel->addEventListener (
+ static_cast<awt::XWindowListener*>(this));
+
+ // Register as property change listener at the controller.
+ uno::Reference<beans::XPropertySet> xSet (mxController, uno::UNO_QUERY);
+ if (xSet.is())
+ xSet->addPropertyChangeListener (
+ "",
+ static_cast<beans::XPropertyChangeListener*>(this));
+
+ // Register this object as dispose event listener at the controller.
+ if (mxController.is())
+ mxController->addEventListener (
+ static_cast<awt::XWindowListener*>(this));
+
+ // Register at VCL Window to be informed of activated and deactivated
+ // OLE objects.
+ vcl::Window* pWindow = maShapeTreeInfo.GetWindow();
+ if (pWindow != nullptr)
+ {
+ maWindowLink = LINK(
+ this, AccessibleDocumentViewBase, WindowChildEventListener);
+
+ pWindow->AddChildEventListener (maWindowLink);
+
+ sal_uInt16 nCount = pWindow->GetChildCount();
+ for (sal_uInt16 i=0; i<nCount; i++)
+ {
+ vcl::Window* pChildWindow = pWindow->GetChild (i);
+ if (pChildWindow &&
+ (AccessibleRole::EMBEDDED_OBJECT
+ ==pChildWindow->GetAccessibleRole()))
+ {
+ SetAccessibleOLEObject (pChildWindow->GetAccessible());
+ }
+ }
+ }
+ SfxObjectShell* pObjShell = mpViewShell->GetViewFrame()->GetObjectShell();
+ if(!pObjShell->IsReadOnly())
+ SetState(AccessibleStateType::EDITABLE);
+}
+
+IMPL_LINK(AccessibleDocumentViewBase, WindowChildEventListener,
+ VclWindowEvent&, rEvent, void)
+{
+ // DBG_ASSERT( pVclEvent->GetWindow(), "Window???" );
+ switch (rEvent.GetId())
+ {
+ case VclEventId::ObjectDying:
+ {
+ // Window is dying. Unregister from VCL Window.
+ // This is also attempted in the disposing() method.
+ vcl::Window* pWindow = maShapeTreeInfo.GetWindow();
+ vcl::Window* pDyingWindow = rEvent.GetWindow();
+ if (pWindow==pDyingWindow && pWindow!=nullptr && maWindowLink.IsSet())
+ {
+ pWindow->RemoveChildEventListener (maWindowLink);
+ maWindowLink = Link<VclWindowEvent&,void>();
+ }
+ }
+ break;
+
+ case VclEventId::WindowShow:
+ {
+ // A new window has been created. Is it an OLE object?
+ vcl::Window* pChildWindow = static_cast<vcl::Window*>(
+ rEvent.GetData());
+ if (pChildWindow!=nullptr
+ && (pChildWindow->GetAccessibleRole()
+ == AccessibleRole::EMBEDDED_OBJECT))
+ {
+ SetAccessibleOLEObject (pChildWindow->GetAccessible());
+ }
+ }
+ break;
+
+ case VclEventId::WindowHide:
+ {
+ // A window has been destroyed. Has that been an OLE
+ // object?
+ vcl::Window* pChildWindow = static_cast<vcl::Window*>(
+ rEvent.GetData());
+ if (pChildWindow!=nullptr
+ && (pChildWindow->GetAccessibleRole()
+ == AccessibleRole::EMBEDDED_OBJECT))
+ {
+ SetAccessibleOLEObject (nullptr);
+ }
+ }
+ break;
+
+ default: break;
+ }
+}
+
+//===== IAccessibleViewForwarderListener ====================================
+
+void AccessibleDocumentViewBase::ViewForwarderChanged()
+{
+ // Empty
+}
+
+//===== XAccessibleContext ==================================================
+
+Reference<XAccessible> SAL_CALL
+ AccessibleDocumentViewBase::getAccessibleParent()
+{
+ ThrowIfDisposed ();
+
+ return AccessibleContextBase::getAccessibleParent();
+}
+
+sal_Int32 SAL_CALL
+ AccessibleDocumentViewBase::getAccessibleChildCount()
+{
+ ThrowIfDisposed ();
+
+ if (mxAccessibleOLEObject.is())
+ return 1;
+ else
+ return 0;
+}
+
+Reference<XAccessible> SAL_CALL
+ AccessibleDocumentViewBase::getAccessibleChild (sal_Int32 nIndex)
+{
+ ThrowIfDisposed ();
+
+ ::osl::MutexGuard aGuard (m_aMutex);
+ if (mxAccessibleOLEObject.is())
+ if (nIndex == 0)
+ return mxAccessibleOLEObject;
+
+ throw lang::IndexOutOfBoundsException ( "no child with index " + OUString::number(nIndex) );
+}
+
+//===== XAccessibleComponent ================================================
+
+/** Iterate over all children and test whether the specified point lies
+ within one of their bounding boxes. Return the first child for which
+ this is true.
+*/
+uno::Reference<XAccessible > SAL_CALL
+ AccessibleDocumentViewBase::getAccessibleAtPoint (
+ const awt::Point& aPoint)
+{
+ ThrowIfDisposed ();
+
+ ::osl::MutexGuard aGuard (m_aMutex);
+ uno::Reference<XAccessible> xChildAtPosition;
+
+ sal_Int32 nChildCount = getAccessibleChildCount ();
+ for (sal_Int32 i=nChildCount-1; i>=0; --i)
+ {
+ Reference<XAccessible> xChild (getAccessibleChild (i));
+ if (xChild.is())
+ {
+ Reference<XAccessibleComponent> xChildComponent (
+ xChild->getAccessibleContext(), uno::UNO_QUERY);
+ if (xChildComponent.is())
+ {
+ awt::Rectangle aBBox (xChildComponent->getBounds());
+ if ( (aPoint.X >= aBBox.X)
+ && (aPoint.Y >= aBBox.Y)
+ && (aPoint.X < aBBox.X+aBBox.Width)
+ && (aPoint.Y < aBBox.Y+aBBox.Height) )
+ {
+ xChildAtPosition = xChild;
+ break;
+ }
+ }
+ }
+ }
+
+ // Have not found a child under the given point. Returning empty
+ // reference to indicate this.
+ return xChildAtPosition;
+}
+
+awt::Rectangle SAL_CALL
+ AccessibleDocumentViewBase::getBounds()
+{
+ ThrowIfDisposed ();
+
+ // Transform visible area into screen coordinates.
+ ::tools::Rectangle aVisibleArea (
+ maShapeTreeInfo.GetViewForwarder()->GetVisibleArea());
+ ::Point aPixelTopLeft (
+ maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
+ aVisibleArea.TopLeft()));
+ ::Point aPixelSize (
+ maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
+ aVisibleArea.BottomRight())
+ - aPixelTopLeft);
+
+ // Prepare to subtract the parent position to transform into relative
+ // coordinates.
+ awt::Point aParentPosition;
+ Reference<XAccessible> xParent = getAccessibleParent ();
+ if (xParent.is())
+ {
+ Reference<XAccessibleComponent> xParentComponent (
+ xParent->getAccessibleContext(), uno::UNO_QUERY);
+ if (xParentComponent.is())
+ aParentPosition = xParentComponent->getLocationOnScreen();
+ }
+
+ return awt::Rectangle (
+ aPixelTopLeft.X() - aParentPosition.X,
+ aPixelTopLeft.Y() - aParentPosition.Y,
+ aPixelSize.X(),
+ aPixelSize.Y());
+}
+
+awt::Point SAL_CALL
+ AccessibleDocumentViewBase::getLocation()
+{
+ ThrowIfDisposed ();
+ awt::Rectangle aBoundingBox (getBounds());
+ return awt::Point (aBoundingBox.X, aBoundingBox.Y);
+}
+
+awt::Point SAL_CALL
+ AccessibleDocumentViewBase::getLocationOnScreen()
+{
+ ThrowIfDisposed ();
+ ::Point aLogicalPoint (maShapeTreeInfo.GetViewForwarder()->GetVisibleArea().TopLeft());
+ ::Point aPixelPoint (maShapeTreeInfo.GetViewForwarder()->LogicToPixel (aLogicalPoint));
+ return awt::Point (aPixelPoint.X(), aPixelPoint.Y());
+}
+
+awt::Size SAL_CALL
+ AccessibleDocumentViewBase::getSize()
+{
+ ThrowIfDisposed ();
+
+ // Transform visible area into screen coordinates.
+ ::tools::Rectangle aVisibleArea (
+ maShapeTreeInfo.GetViewForwarder()->GetVisibleArea());
+ ::Point aPixelTopLeft (
+ maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
+ aVisibleArea.TopLeft()));
+ ::Point aPixelSize (
+ maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
+ aVisibleArea.BottomRight())
+ - aPixelTopLeft);
+
+ return awt::Size (aPixelSize.X(), aPixelSize.Y());
+}
+
+//===== XInterface ==========================================================
+
+uno::Any SAL_CALL
+ AccessibleDocumentViewBase::queryInterface (const uno::Type & rType)
+{
+ uno::Any aReturn = AccessibleContextBase::queryInterface (rType);
+ if ( ! aReturn.hasValue())
+ aReturn = ::cppu::queryInterface (rType,
+ static_cast<XAccessibleComponent*>(this),
+ static_cast<XAccessibleSelection*>(this),
+ static_cast<lang::XEventListener*>(
+ static_cast<awt::XWindowListener*>(this)),
+ static_cast<beans::XPropertyChangeListener*>(this),
+ static_cast<awt::XWindowListener*>(this),
+ static_cast<awt::XFocusListener*>(this)
+ ,static_cast<XAccessibleExtendedAttributes*>(this)
+ );
+ return aReturn;
+}
+
+void SAL_CALL
+ AccessibleDocumentViewBase::acquire()
+ noexcept
+{
+ AccessibleContextBase::acquire ();
+}
+
+void SAL_CALL
+ AccessibleDocumentViewBase::release()
+ noexcept
+{
+ AccessibleContextBase::release ();
+}
+
+// XServiceInfo
+
+OUString SAL_CALL
+ AccessibleDocumentViewBase::getImplementationName()
+{
+ return "AccessibleDocumentViewBase";
+}
+
+css::uno::Sequence< OUString> SAL_CALL
+ AccessibleDocumentViewBase::getSupportedServiceNames()
+{
+ ThrowIfDisposed ();
+ return AccessibleContextBase::getSupportedServiceNames ();
+}
+
+//===== XTypeProvider =======================================================
+
+css::uno::Sequence< css::uno::Type> SAL_CALL
+ AccessibleDocumentViewBase::getTypes()
+{
+ ThrowIfDisposed ();
+
+ return comphelper::concatSequences(
+ // Get list of types from the context base implementation, ...
+ AccessibleContextBase::getTypes(),
+ // ... get list of types from component base implementation, ...
+ AccessibleComponentBase::getTypes(),
+ // ...and add the additional type for the component, ...
+ css::uno::Sequence {
+ cppu::UnoType<lang::XEventListener>::get(),
+ cppu::UnoType<beans::XPropertyChangeListener>::get(),
+ cppu::UnoType<awt::XWindowListener>::get(),
+ cppu::UnoType<awt::XFocusListener>::get(),
+ cppu::UnoType<XAccessibleEventBroadcaster>::get() });
+}
+
+void AccessibleDocumentViewBase::impl_dispose()
+{
+ // Unregister from VCL Window.
+ vcl::Window* pWindow = maShapeTreeInfo.GetWindow();
+ if (maWindowLink.IsSet())
+ {
+ if (pWindow)
+ pWindow->RemoveChildEventListener (maWindowLink);
+ maWindowLink = Link<VclWindowEvent&,void>();
+ }
+ else
+ {
+ DBG_ASSERT (pWindow, "AccessibleDocumentViewBase::disposing");
+ }
+
+ // Unregister from window.
+ if (mxWindow.is())
+ {
+ mxWindow->removeWindowListener (this);
+ mxWindow->removeFocusListener (this);
+ mxWindow = nullptr;
+ }
+
+ // Unregister from the model.
+ if (mxModel.is())
+ mxModel->removeEventListener (
+ static_cast<awt::XWindowListener*>(this));
+
+ // Unregister from the controller.
+ if (mxController.is())
+ {
+ uno::Reference<beans::XPropertySet> xSet (mxController, uno::UNO_QUERY);
+ if (xSet.is())
+ xSet->removePropertyChangeListener ("", static_cast<beans::XPropertyChangeListener*>(this));
+
+ mxController->removeEventListener (
+ static_cast<awt::XWindowListener*>(this));
+ }
+
+ // Propagate change of controller down the shape tree.
+ maShapeTreeInfo.SetModelBroadcaster (nullptr);
+
+ // Reset the model reference.
+ mxModel = nullptr;
+ // Reset the model reference.
+ mxController = nullptr;
+
+ maShapeTreeInfo.SetDocumentWindow (nullptr);
+}
+
+//===== XEventListener ======================================================
+
+void SAL_CALL
+ AccessibleDocumentViewBase::disposing (const lang::EventObject& rEventObject)
+{
+ ThrowIfDisposed ();
+
+ // Register this object as dispose event and document::XEventListener
+ // listener at the model.
+
+ if ( ! rEventObject.Source.is())
+ {
+ // Paranoia. Can this really happen?
+ }
+ else if (rEventObject.Source == mxModel || rEventObject.Source == mxController)
+ {
+ impl_dispose();
+ }
+}
+
+//===== XPropertyChangeListener =============================================
+
+void SAL_CALL AccessibleDocumentViewBase::propertyChange (const beans::PropertyChangeEvent& )
+{
+ // Empty
+}
+
+//===== XWindowListener =====================================================
+
+void SAL_CALL
+ AccessibleDocumentViewBase::windowResized (const css::awt::WindowEvent& )
+{
+ if( IsDisposed() )
+ return;
+
+ ViewForwarderChanged();
+}
+
+void SAL_CALL
+ AccessibleDocumentViewBase::windowMoved (const css::awt::WindowEvent& )
+{
+ if( IsDisposed() )
+ return;
+
+ ViewForwarderChanged();
+}
+
+void SAL_CALL
+ AccessibleDocumentViewBase::windowShown (const css::lang::EventObject& )
+{
+ if( IsDisposed() )
+ return;
+
+ ViewForwarderChanged();
+}
+
+void SAL_CALL
+ AccessibleDocumentViewBase::windowHidden (const css::lang::EventObject& )
+{
+ if( IsDisposed() )
+ return;
+
+ ViewForwarderChanged();
+}
+
+//===== XFocusListener ==================================================
+
+void AccessibleDocumentViewBase::focusGained (const css::awt::FocusEvent& e)
+{
+ ThrowIfDisposed ();
+ if (e.Source == mxWindow)
+ Activated ();
+}
+
+void AccessibleDocumentViewBase::focusLost (const css::awt::FocusEvent& e)
+{
+ ThrowIfDisposed ();
+ if (e.Source == mxWindow)
+ Deactivated ();
+}
+
+//===== protected internal ==================================================
+
+// This method is called from the component helper base class while disposing.
+void SAL_CALL AccessibleDocumentViewBase::disposing()
+{
+ impl_dispose();
+
+ AccessibleContextBase::disposing ();
+}
+
+/// Create a name for this view.
+OUString
+ AccessibleDocumentViewBase::CreateAccessibleName()
+{
+ return "AccessibleDocumentViewBase";
+}
+
+void AccessibleDocumentViewBase::Activated()
+{
+ // Empty. Overwrite to do something useful.
+}
+
+void AccessibleDocumentViewBase::Deactivated()
+{
+ // Empty. Overwrite to do something useful.
+}
+
+void AccessibleDocumentViewBase::SetAccessibleOLEObject (
+ const Reference <XAccessible>& xOLEObject)
+{
+ // Send child event about removed accessible OLE object if necessary.
+ if (mxAccessibleOLEObject != xOLEObject)
+ if (mxAccessibleOLEObject.is())
+ CommitChange (
+ AccessibleEventId::CHILD,
+ uno::Any(),
+ uno::Any (mxAccessibleOLEObject));
+
+ // Assume that the accessible OLE Object disposes itself correctly.
+
+ {
+ ::osl::MutexGuard aGuard (m_aMutex);
+ mxAccessibleOLEObject = xOLEObject;
+ }
+
+ // Send child event about new accessible OLE object if necessary.
+ if (mxAccessibleOLEObject.is())
+ CommitChange (
+ AccessibleEventId::CHILD,
+ uno::Any (mxAccessibleOLEObject),
+ uno::Any());
+}
+
+//===== methods from AccessibleSelectionBase ==================================================
+
+// return the member maMutex;
+::osl::Mutex&
+ AccessibleDocumentViewBase::implGetMutex()
+{
+ return m_aMutex;
+}
+
+// return ourself as context in default case
+uno::Reference< XAccessibleContext >
+ AccessibleDocumentViewBase::implGetAccessibleContext()
+{
+ return this;
+}
+
+// return sal_False in default case
+bool
+ AccessibleDocumentViewBase::implIsSelected( sal_Int32 )
+{
+ return false;
+}
+
+// return nothing in default case
+void
+ AccessibleDocumentViewBase::implSelect( sal_Int32, bool )
+{
+}
+
+uno::Any SAL_CALL AccessibleDocumentViewBase::getExtendedAttributes()
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+
+ uno::Any anyAttribute;
+ OUStringBuffer sValue;
+ if (auto pDrViewSh = dynamic_cast<::sd::DrawViewShell* > (mpViewShell))
+ {
+ OUString sDisplay;
+ OUString sName = "page-name:";
+ // MT IA2: Not used...
+ // SdPage* pCurrPge = pDrViewSh->getCurrentPage();
+ SdDrawDocument* pDoc = pDrViewSh->GetDoc();
+ sDisplay = pDrViewSh->getCurrentPage()->GetName();
+ sDisplay = sDisplay.replaceFirst( "\\", "\\\\" );
+ sDisplay = sDisplay.replaceFirst( "=", "\\=" );
+ sDisplay = sDisplay.replaceFirst( ";", "\\;" );
+ sDisplay = sDisplay.replaceFirst( ",", "\\," );
+ sDisplay = sDisplay.replaceFirst( ":", "\\:" );
+ sValue = sName + sDisplay ;
+ sValue.append(";page-number:");
+ sValue.append(static_cast<sal_Int32>(static_cast<sal_uInt16>((pDrViewSh->getCurrentPage()->GetPageNum()-1)>>1) + 1));
+ sValue.append(";total-pages:");
+ sValue.append(static_cast<sal_Int32>(pDrViewSh->GetPageTabControl().GetPageCount()));
+ sValue.append(";");
+ if(pDrViewSh->IsLayerModeActive() && pDrViewSh->GetLayerTabControl()) // #i87182#
+ {
+ sName = "page-name:";
+ sValue = sName;
+ OUString sLayerName(pDrViewSh->GetLayerTabControl()->GetLayerName(pDrViewSh->GetLayerTabControl()->GetCurPageId()) );
+ sDisplay = pDrViewSh->GetLayerTabControl()->GetPageText(pDrViewSh->GetLayerTabControl()->GetCurPageId());
+ if( pDoc )
+ {
+ SdrLayerAdmin& rLayerAdmin = pDoc->GetLayerAdmin();
+ SdrLayer* aSdrLayer = rLayerAdmin.GetLayer(sLayerName);
+ if( aSdrLayer )
+ {
+ const OUString& layerAltText = aSdrLayer->GetTitle();
+ if (!layerAltText.isEmpty())
+ {
+ sName = " ";
+ sDisplay += sName + layerAltText;
+ }
+ }
+ }
+ sDisplay = sDisplay.replaceFirst( "\\", "\\\\" );
+ sDisplay = sDisplay.replaceFirst( "=", "\\=" );
+ sDisplay = sDisplay.replaceFirst( ";", "\\;" );
+ sDisplay = sDisplay.replaceFirst( ",", "\\," );
+ sDisplay = sDisplay.replaceFirst( ":", "\\:" );
+ sValue.append(sDisplay);
+ sValue.append(";page-number:");
+ sValue.append(static_cast<sal_Int32>(pDrViewSh->GetActiveTabLayerIndex()+1));
+ sValue.append(";total-pages:");
+ sValue.append(static_cast<sal_Int32>(pDrViewSh->GetLayerTabControl()->GetPageCount()));
+ sValue.append(";");
+ }
+ }
+ if (auto pPresViewSh = dynamic_cast<::sd::PresentationViewShell* >(mpViewShell))
+ {
+ SdPage* pCurrPge = pPresViewSh->getCurrentPage();
+ SdDrawDocument* pDoc = pPresViewSh->GetDoc();
+ SdPage* pNotesPge = pDoc->GetSdPage((pCurrPge->GetPageNum()-1)>>1, PageKind::Notes);
+ if (pNotesPge)
+ {
+ SdrObject* pNotesObj = pNotesPge->GetPresObj(PresObjKind::Notes);
+ if (pNotesObj)
+ {
+ OutlinerParaObject* pPara = pNotesObj->GetOutlinerParaObject();
+ if (pPara)
+ {
+ sValue.append("note:");
+ const EditTextObject& rEdit = pPara->GetTextObject();
+ for (sal_Int32 i=0;i<rEdit.GetParagraphCount();i++)
+ {
+ OUString strNote = rEdit.GetText(i);
+ strNote = strNote.replaceFirst( "\\", "\\\\" );
+ strNote = strNote.replaceFirst( "=", "\\=" );
+ strNote = strNote.replaceFirst( ";", "\\;" );
+ strNote = strNote.replaceFirst( ",", "\\," );
+ strNote = strNote.replaceFirst( ":", "\\:" );
+ sValue.append(strNote);
+ sValue.append(";");//to divide each paragraph
+ }
+ }
+ }
+ }
+ }
+ if (dynamic_cast<const ::sd::OutlineViewShell* >(mpViewShell ) != nullptr )
+ {
+ SdPage* pCurrPge = mpViewShell->GetActualPage();
+ SdDrawDocument* pDoc = mpViewShell->GetDoc();
+ if(pCurrPge && pDoc)
+ {
+ OUString sDisplay;
+ sDisplay = pCurrPge->GetName();
+ sDisplay = sDisplay.replaceFirst( "=", "\\=" );
+ sDisplay = sDisplay.replaceFirst( ";", "\\;" );
+ sDisplay = sDisplay.replaceFirst( ",", "\\," );
+ sDisplay = sDisplay.replaceFirst( ":", "\\:" );
+ sValue = "page-name:" + sDisplay;
+ sValue.append(";page-number:");
+ sValue.append(static_cast<sal_Int32>(static_cast<sal_uInt16>((pCurrPge->GetPageNum()-1)>>1) + 1));
+ sValue.append(";total-pages:");
+ sValue.append(static_cast<sal_Int32>(pDoc->GetSdPageCount(PageKind::Standard)));
+ sValue.append(";");
+ }
+ }
+ if (sValue.getLength())
+ anyAttribute <<= sValue.makeStringAndClear();
+ return anyAttribute;
+}
+
+sal_Int32 SAL_CALL AccessibleDocumentViewBase::getForeground( )
+{
+ return sal_Int32(COL_BLACK);
+}
+
+sal_Int32 SAL_CALL AccessibleDocumentViewBase::getBackground( )
+{
+ ThrowIfDisposed ();
+ ::osl::MutexGuard aGuard (m_aMutex);
+ return sal_Int32(mpViewShell->GetView()->getColorConfig().GetColorValue( ::svtools::DOCCOLOR ).nColor);
+}
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx b/sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx
new file mode 100644
index 000000000..f6111962a
--- /dev/null
+++ b/sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx
@@ -0,0 +1,777 @@
+/* -*- 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 <AccessibleDrawDocumentView.hxx>
+#include <com/sun/star/drawing/ShapeCollection.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XShapes.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/view/XSelectionSupplier.hpp>
+#include <cppuhelper/queryinterface.hxx>
+#include <comphelper/processfactory.hxx>
+#include <sal/log.hxx>
+#include <tools/debug.hxx>
+
+#include <svx/AccessibleShape.hxx>
+#include <svx/ChildrenManager.hxx>
+#include <svx/svdobj.hxx>
+#include <vcl/svapp.hxx>
+
+#include <ViewShell.hxx>
+#include <View.hxx>
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <algorithm>
+#include <slideshow.hxx>
+#include <anminfo.hxx>
+#include <AccessiblePageShape.hxx>
+
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <osl/mutex.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::accessibility;
+
+namespace accessibility {
+
+namespace {
+
+struct XShapePosCompareHelper
+{
+ bool operator() ( const uno::Reference<drawing::XShape>& xshape1,
+ const uno::Reference<drawing::XShape>& xshape2 ) const
+ {
+ // modify the compare method to return the Z-Order, not layout order
+ SdrObject* pObj1 = SdrObject::getSdrObjectFromXShape(xshape1);
+ SdrObject* pObj2 = SdrObject::getSdrObjectFromXShape(xshape2);
+ if(pObj1 && pObj2)
+ return pObj1->GetOrdNum() < pObj2->GetOrdNum();
+ else
+ return false;
+ }
+};
+
+}
+
+//===== internal ============================================================
+
+AccessibleDrawDocumentView::AccessibleDrawDocumentView (
+ ::sd::Window* pSdWindow,
+ ::sd::ViewShell* pViewShell,
+ const uno::Reference<frame::XController>& rxController,
+ const uno::Reference<XAccessible>& rxParent)
+ : AccessibleDocumentViewBase (pSdWindow, pViewShell, rxController, rxParent),
+ mpSdViewSh( pViewShell )
+{
+ UpdateAccessibleName();
+}
+
+AccessibleDrawDocumentView::~AccessibleDrawDocumentView()
+{
+ DBG_ASSERT (rBHelper.bDisposed || rBHelper.bInDispose,
+ "~AccessibleDrawDocumentView: object has not been disposed");
+}
+
+void AccessibleDrawDocumentView::Init()
+{
+ AccessibleDocumentViewBase::Init ();
+
+ // Determine the list of shapes on the current page.
+ uno::Reference<drawing::XShapes> xShapeList;
+ uno::Reference<drawing::XDrawView> xView (mxController, uno::UNO_QUERY);
+ if (xView.is())
+ xShapeList = xView->getCurrentPage();
+
+ // Create the children manager.
+ mpChildrenManager.reset(new ChildrenManager(this, xShapeList, maShapeTreeInfo, *this));
+
+ rtl::Reference<AccessiblePageShape> xPage(CreateDrawPageShape());
+ if (xPage.is())
+ {
+ xPage->Init();
+ mpChildrenManager->AddAccessibleShape (xPage);
+ mpChildrenManager->Update ();
+ }
+
+ mpChildrenManager->UpdateSelection ();
+}
+
+void AccessibleDrawDocumentView::ViewForwarderChanged()
+{
+ AccessibleDocumentViewBase::ViewForwarderChanged();
+ if (mpChildrenManager != nullptr)
+ mpChildrenManager->ViewForwarderChanged();
+}
+
+/** The page shape is created on every call at the moment (provided that
+ everything goes well).
+*/
+rtl::Reference<AccessiblePageShape> AccessibleDrawDocumentView::CreateDrawPageShape()
+{
+ rtl::Reference<AccessiblePageShape> xShape;
+
+ // Create a shape that represents the actual draw page.
+ uno::Reference<drawing::XDrawView> xView (mxController, uno::UNO_QUERY);
+ if (xView.is())
+ {
+ uno::Reference<beans::XPropertySet> xSet (
+ uno::Reference<beans::XPropertySet> (xView->getCurrentPage(), uno::UNO_QUERY));
+ if (xSet.is())
+ {
+ // Create a rectangle shape that will represent the draw page.
+ uno::Reference<lang::XMultiServiceFactory> xFactory (mxModel, uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xRectangle;
+ if (xFactory.is())
+ xRectangle.set(xFactory->createInstance ("com.sun.star.drawing.RectangleShape"),
+ uno::UNO_QUERY);
+
+ // Set the shape's size and position.
+ if (xRectangle.is())
+ {
+ uno::Any aValue;
+ awt::Point aPosition;
+ awt::Size aSize;
+
+ // Set size and position of the shape to those of the draw
+ // page.
+ aValue = xSet->getPropertyValue ("BorderLeft");
+ aValue >>= aPosition.X;
+ aValue = xSet->getPropertyValue ("BorderTop");
+ aValue >>= aPosition.Y;
+ xRectangle->setPosition (aPosition);
+
+ aValue = xSet->getPropertyValue ("Width");
+ aValue >>= aSize.Width;
+ aValue = xSet->getPropertyValue ("Height");
+ aValue >>= aSize.Height;
+ xRectangle->setSize (aSize);
+
+ // Create the accessible object for the shape and
+ // initialize it.
+ xShape = new AccessiblePageShape (
+ xView->getCurrentPage(), this, maShapeTreeInfo);
+ }
+ }
+ }
+ return xShape;
+}
+
+//===== XAccessibleContext ==================================================
+
+sal_Int32 SAL_CALL
+ AccessibleDrawDocumentView::getAccessibleChildCount()
+{
+ ThrowIfDisposed ();
+
+ tools::Long nChildCount = AccessibleDocumentViewBase::getAccessibleChildCount();
+
+ // Forward request to children manager.
+ if (mpChildrenManager != nullptr)
+ nChildCount += mpChildrenManager->GetChildCount();
+
+ return nChildCount;
+}
+
+uno::Reference<XAccessible> SAL_CALL
+ AccessibleDrawDocumentView::getAccessibleChild (sal_Int32 nIndex)
+{
+ ThrowIfDisposed ();
+
+ ::osl::ClearableMutexGuard aGuard (m_aMutex);
+
+ // Take care of children of the base class.
+ sal_Int32 nCount = AccessibleDocumentViewBase::getAccessibleChildCount();
+ if (nCount > 0)
+ {
+ if (nIndex < nCount)
+ return AccessibleDocumentViewBase::getAccessibleChild(nIndex);
+ else
+ nIndex -= nCount;
+ }
+
+ // Create a copy of the pointer to the children manager and release the
+ // mutex before calling any of its methods.
+ ChildrenManager* pChildrenManager = mpChildrenManager.get();
+ aGuard.clear();
+
+ // Forward request to children manager.
+ if (pChildrenManager == nullptr)
+ throw lang::IndexOutOfBoundsException (
+ "no accessible child with index " + OUString::number(nIndex),
+ static_cast<uno::XWeak*>(this));
+
+ return pChildrenManager->GetChild (nIndex);
+}
+
+OUString SAL_CALL
+ AccessibleDrawDocumentView::getAccessibleName()
+{
+ SolarMutexGuard g;
+
+ OUString sName = SdResId(SID_SD_A11Y_D_PRESENTATION);
+ ::sd::View* pSdView = static_cast< ::sd::View* >( maShapeTreeInfo.GetSdrView() );
+ if ( pSdView )
+ {
+ SdDrawDocument& rDoc = pSdView->GetDoc();
+ OUString sFileName = rDoc.getDocAccTitle();
+ if ( !sFileName.getLength() )
+ {
+ ::sd::DrawDocShell* pDocSh = pSdView->GetDocSh();
+ if ( pDocSh )
+ {
+ sFileName = pDocSh->GetTitle( SFX_TITLE_APINAME );
+ }
+ }
+
+ OUString sReadOnly;
+ if(rDoc.getDocReadOnly())
+ {
+ sReadOnly = SdResId(SID_SD_A11Y_D_PRESENTATION_READONLY);
+ }
+
+ if ( sFileName.getLength() )
+ {
+ sName = sFileName + sReadOnly + " - " + sName;
+ }
+ }
+
+ return sName;
+}
+
+//===== XEventListener ======================================================
+
+void SAL_CALL
+ AccessibleDrawDocumentView::disposing (const lang::EventObject& rEventObject)
+{
+ ThrowIfDisposed ();
+
+ AccessibleDocumentViewBase::disposing (rEventObject);
+ if (rEventObject.Source == mxModel)
+ {
+ ::osl::Guard< ::osl::Mutex> aGuard (::osl::Mutex::getGlobalMutex());
+ // maShapeTreeInfo has been modified in base class.
+ if (mpChildrenManager != nullptr)
+ mpChildrenManager->SetInfo (maShapeTreeInfo);
+ }
+}
+
+//===== XPropertyChangeListener =============================================
+
+void SAL_CALL
+ AccessibleDrawDocumentView::propertyChange (const beans::PropertyChangeEvent& rEventObject)
+{
+ ThrowIfDisposed ();
+
+ AccessibleDocumentViewBase::propertyChange (rEventObject);
+
+ // add page switch event for slide show mode
+ if (rEventObject.PropertyName == "CurrentPage" ||
+ rEventObject.PropertyName == "PageChange")
+ {
+ // Update the accessible name to reflect the current slide.
+ UpdateAccessibleName();
+
+ // The current page changed. Update the children manager accordingly.
+ uno::Reference<drawing::XDrawView> xView (mxController, uno::UNO_QUERY);
+ if (xView.is() && mpChildrenManager!=nullptr)
+ {
+ // Inform the children manager to forget all children and give
+ // him the new ones.
+ mpChildrenManager->ClearAccessibleShapeList ();
+ mpChildrenManager->SetShapeList (xView->getCurrentPage());
+
+ rtl::Reference<AccessiblePageShape> xPage(CreateDrawPageShape ());
+ if (xPage.is())
+ {
+ xPage->Init();
+ mpChildrenManager->AddAccessibleShape (xPage);
+ mpChildrenManager->Update (false);
+ }
+ }
+ else
+ SAL_WARN("sd", "View invalid");
+ CommitChange(AccessibleEventId::PAGE_CHANGED,rEventObject.NewValue,rEventObject.OldValue);
+ }
+ else if ( rEventObject.PropertyName == "VisibleArea" )
+ {
+ if (mpChildrenManager != nullptr)
+ mpChildrenManager->ViewForwarderChanged();
+ }
+ else if (rEventObject.PropertyName == "ActiveLayer")
+ {
+ CommitChange(AccessibleEventId::PAGE_CHANGED,rEventObject.NewValue,rEventObject.OldValue);
+ }
+ else if (rEventObject.PropertyName == "UpdateAcc")
+ {
+ // The current page changed. Update the children manager accordingly.
+ uno::Reference<drawing::XDrawView> xView (mxController, uno::UNO_QUERY);
+ if (xView.is() && mpChildrenManager!=nullptr)
+ {
+ // Inform the children manager to forget all children and give
+ // him the new ones.
+ mpChildrenManager->ClearAccessibleShapeList ();
+ // update the slide show page's accessible info
+ //mpChildrenManager->SetShapeList (uno::Reference<drawing::XShapes> (
+ // xView->getCurrentPage(), uno::UNO_QUERY));
+ rtl::Reference< sd::SlideShow > xSlideshow( sd::SlideShow::GetSlideShow( mpSdViewSh->GetViewShellBase() ) );
+ if( xSlideshow.is() && xSlideshow->isRunning() && xSlideshow->isFullScreen() )
+ {
+ css::uno::Reference< drawing::XDrawPage > xSlide;
+ // MT IA2: Not used...
+ // sal_Int32 currentPageIndex = xSlideshow->getCurrentPageIndex();
+ css::uno::Reference< css::presentation::XSlideShowController > xSlideController = xSlideshow->getController();
+ if( xSlideController.is() )
+ {
+ xSlide = xSlideController->getCurrentSlide();
+ if (xSlide.is())
+ {
+ mpChildrenManager->SetShapeList (xSlide);
+ }
+ }
+ }
+ rtl::Reference<AccessiblePageShape> xPage(CreateDrawPageShape ());
+ if (xPage.is())
+ {
+ xPage->Init();
+ mpChildrenManager->AddAccessibleShape (xPage);
+ mpChildrenManager->Update (false);
+ }
+ }
+ }
+ else
+ {
+ SAL_INFO("sd", "unhandled");
+ }
+}
+
+// XServiceInfo
+
+OUString SAL_CALL
+ AccessibleDrawDocumentView::getImplementationName()
+{
+ return "AccessibleDrawDocumentView";
+}
+
+css::uno::Sequence< OUString> SAL_CALL
+ AccessibleDrawDocumentView::getSupportedServiceNames()
+{
+ ThrowIfDisposed();
+ const css::uno::Sequence<OUString> vals { "com.sun.star.drawing.AccessibleDrawDocumentView" };
+ uno::Sequence<OUString> aServiceNames =
+ AccessibleDocumentViewBase::getSupportedServiceNames();
+
+ return comphelper::concatSequences(aServiceNames, vals);
+}
+
+//===== XInterface ==========================================================
+
+uno::Any SAL_CALL
+ AccessibleDrawDocumentView::queryInterface (const uno::Type & rType)
+{
+ uno::Any aReturn = AccessibleDocumentViewBase::queryInterface (rType);
+ if ( ! aReturn.hasValue())
+ aReturn = ::cppu::queryInterface (rType,
+ static_cast<XAccessibleGroupPosition*>(this)
+ );
+ return aReturn;
+}
+
+void SAL_CALL
+ AccessibleDrawDocumentView::acquire()
+ noexcept
+{
+ AccessibleDocumentViewBase::acquire ();
+}
+void SAL_CALL
+ AccessibleDrawDocumentView::release()
+ noexcept
+{
+ AccessibleDocumentViewBase::release ();
+}
+//===== XAccessibleGroupPosition =========================================
+uno::Sequence< sal_Int32 > SAL_CALL
+ AccessibleDrawDocumentView::getGroupPosition( const uno::Any& rAny )
+{
+ SolarMutexGuard g;
+
+ // we will return the:
+ // [0] group level(always be 0 now)
+ // [1] similar items counts in the group
+ // [2] the position of the object in the group
+ uno::Sequence< sal_Int32 > aRet( 3 );
+ //get the xShape of the current selected drawing object
+ uno::Reference<XAccessibleContext> xAccContent;
+ rAny >>= xAccContent;
+ if ( !xAccContent.is() )
+ {
+ return aRet;
+ }
+ AccessibleShape* pAcc = comphelper::getFromUnoTunnel<AccessibleShape>( xAccContent );
+ if ( !pAcc )
+ {
+ return aRet;
+ }
+ uno::Reference< drawing::XShape > xCurShape = pAcc->GetXShape();
+ if ( !xCurShape.is() )
+ {
+ return aRet;
+ }
+ //find all the child in the page, insert them into a vector and sort
+ if ( mpChildrenManager == nullptr )
+ {
+ return aRet;
+ }
+ std::vector< uno::Reference<drawing::XShape> > vXShapes;
+ sal_Int32 nCount = mpChildrenManager->GetChildCount();
+ //get pointer of SdView & SdrPageView for further use.
+ SdrPageView* pPV = nullptr;
+ ::sd::View* pSdView = nullptr;
+ if ( mpSdViewSh )
+ {
+ pSdView = mpSdViewSh->GetView();
+ pPV = pSdView->GetSdrPageView();
+ }
+ for ( sal_Int32 i = 0; i < nCount; i++ )
+ {
+ uno::Reference< drawing::XShape > xShape = mpChildrenManager->GetChildShape(i);
+ if ( xShape.is() )
+ {
+ //if the object is visible in the page, we add it into the group list.
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape(xShape);
+ if ( pObj && pPV && pSdView && pSdView->IsObjMarkable( pObj, pPV ) )
+ {
+ vXShapes.push_back( xShape );
+ }
+ }
+ }
+ std::sort( vXShapes.begin(), vXShapes.end(), XShapePosCompareHelper() );
+ //get the index of the selected object in the group
+ auto aIter = std::find_if(vXShapes.begin(), vXShapes.end(),
+ [&xCurShape](const uno::Reference<drawing::XShape>& rxShape) { return rxShape.get() == xCurShape.get(); });
+ if (aIter != vXShapes.end())
+ {
+ sal_Int32* pArray = aRet.getArray();
+ pArray[0] = 1; //it should be 1 based, not 0 based.
+ pArray[1] = vXShapes.size();
+ pArray[2] = static_cast<sal_Int32>(std::distance(vXShapes.begin(), aIter)) + 1; //we start counting position from 1
+ }
+ return aRet;
+}
+
+OUString AccessibleDrawDocumentView::getObjectLink( const uno::Any& rAny )
+{
+ SolarMutexGuard g;
+
+ OUString aRet;
+ //get the xShape of the current selected drawing object
+ uno::Reference<XAccessibleContext> xAccContent;
+ rAny >>= xAccContent;
+ if ( !xAccContent.is() )
+ {
+ return aRet;
+ }
+ AccessibleShape* pAcc = comphelper::getFromUnoTunnel<AccessibleShape>( xAccContent );
+ if ( !pAcc )
+ {
+ return aRet;
+ }
+ uno::Reference< drawing::XShape > xCurShape = pAcc->GetXShape();
+ if ( !xCurShape.is() )
+ {
+ return aRet;
+ }
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape(xCurShape);
+ if (pObj)
+ {
+ SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pObj);
+ if( pInfo && (pInfo->meClickAction == presentation::ClickAction_DOCUMENT) )
+ aRet = pInfo->GetBookmark();
+ }
+ return aRet;
+}
+
+/// Create a name for this view.
+OUString AccessibleDrawDocumentView::CreateAccessibleName()
+{
+ OUString sName;
+
+ uno::Reference<lang::XServiceInfo> xInfo (mxController, uno::UNO_QUERY);
+ if (xInfo.is())
+ {
+ uno::Sequence< OUString > aServices( xInfo->getSupportedServiceNames() );
+ OUString sFirstService = aServices[0];
+ if ( sFirstService == "com.sun.star.drawing.DrawingDocumentDrawView" )
+ {
+ if( aServices.getLength() >= 2 && aServices[1] == "com.sun.star.presentation.PresentationView")
+ {
+ SolarMutexGuard aGuard;
+
+ sName = SdResId(SID_SD_A11Y_I_DRAWVIEW_N);
+ }
+ else
+ {
+ SolarMutexGuard aGuard;
+
+ sName = SdResId(SID_SD_A11Y_D_DRAWVIEW_N);
+ }
+ }
+ else if ( sFirstService == "com.sun.star.presentation.NotesView" )
+ {
+ SolarMutexGuard aGuard;
+
+ sName = SdResId(SID_SD_A11Y_I_NOTESVIEW_N);
+ }
+ else if ( sFirstService == "com.sun.star.presentation.HandoutView" )
+ {
+ SolarMutexGuard aGuard;
+
+ sName = SdResId(SID_SD_A11Y_I_HANDOUTVIEW_N);
+ }
+ else
+ {
+ sName = sFirstService;
+ }
+ }
+ else
+ {
+ sName = "AccessibleDrawDocumentView";
+ }
+ return sName;
+}
+
+/** Return selection state of specified child
+*/
+bool
+ AccessibleDrawDocumentView::implIsSelected( sal_Int32 nAccessibleChildIndex )
+{
+ const SolarMutexGuard aSolarGuard;
+ uno::Reference< view::XSelectionSupplier > xSel( mxController, uno::UNO_QUERY );
+ bool bRet = false;
+
+ OSL_ENSURE( 0 <= nAccessibleChildIndex, "AccessibleDrawDocumentView::implIsSelected: invalid index!" );
+
+ if( xSel.is() && ( 0 <= nAccessibleChildIndex ) )
+ {
+ uno::Any aAny( xSel->getSelection() );
+ uno::Reference< drawing::XShapes > xShapes;
+
+ aAny >>= xShapes;
+
+ if( xShapes.is() )
+ {
+ AccessibleShape* pAcc = comphelper::getFromUnoTunnel<AccessibleShape>( getAccessibleChild( nAccessibleChildIndex ) );
+
+ if( pAcc )
+ {
+ uno::Reference< drawing::XShape > xShape( pAcc->GetXShape() );
+
+ if( xShape.is() )
+ {
+ for( sal_Int32 i = 0, nCount = xShapes->getCount(); ( i < nCount ) && !bRet; ++i )
+ if( xShapes->getByIndex( i ) == xShape )
+ bRet = true;
+ }
+ }
+ }
+ }
+
+ return bRet;
+}
+
+/** Select or deselect the specified shapes. The corresponding accessible
+ shapes are notified over the selection change listeners registered with
+ the XSelectionSupplier of the controller.
+*/
+void
+ AccessibleDrawDocumentView::implSelect( sal_Int32 nAccessibleChildIndex, bool bSelect )
+{
+ const SolarMutexGuard aSolarGuard;
+ uno::Reference< view::XSelectionSupplier > xSel( mxController, uno::UNO_QUERY );
+
+ if( !xSel.is() )
+ return;
+
+ uno::Any aAny;
+
+ if( ACCESSIBLE_SELECTION_CHILD_ALL == nAccessibleChildIndex )
+ {
+ // Select or deselect all children.
+
+ if( !bSelect )
+ xSel->select( aAny );
+ else
+ {
+ uno::Reference< drawing::XShapes > xShapes = drawing::ShapeCollection::create(
+ comphelper::getProcessComponentContext());
+
+ for(sal_Int32 i = 0, nCount = getAccessibleChildCount(); i < nCount; ++i )
+ {
+ AccessibleShape* pAcc = comphelper::getFromUnoTunnel<AccessibleShape>( getAccessibleChild( i ) );
+
+ if( pAcc && pAcc->GetXShape().is() )
+ xShapes->add( pAcc->GetXShape() );
+ }
+
+ if( xShapes->getCount() )
+ {
+ xSel->select( Any(xShapes) );
+ }
+ }
+ }
+ else if( nAccessibleChildIndex >= 0 )
+ {
+ // Select or deselect only the child with index
+ // nAccessibleChildIndex.
+
+ AccessibleShape* pAcc = comphelper::getFromUnoTunnel<AccessibleShape>(
+ getAccessibleChild( nAccessibleChildIndex ));
+
+ // Add or remove the shape that is made accessible from the
+ // selection of the controller.
+ if( pAcc )
+ {
+ uno::Reference< drawing::XShape > xShape( pAcc->GetXShape() );
+
+ if( xShape.is() )
+ {
+ uno::Reference< drawing::XShapes > xShapes;
+ bool bFound = false;
+
+ aAny = xSel->getSelection();
+ aAny >>= xShapes;
+
+ // Search shape to be selected in current selection.
+ if (xShapes.is())
+ {
+ sal_Int32 nCount = xShapes->getCount();
+ for (sal_Int32 i=0; ( i < nCount ) && !bFound; ++i )
+ if( xShapes->getByIndex( i ) == xShape )
+ bFound = true;
+ }
+ else
+ // Create an empty selection to add the shape to.
+ xShapes = drawing::ShapeCollection::create(
+ comphelper::getProcessComponentContext());
+
+ // Update the selection.
+ if( !bFound && bSelect )
+ xShapes->add( xShape );
+ else if( bFound && !bSelect )
+ xShapes->remove( xShape );
+
+ xSel->select( Any(xShapes) );
+ }
+ }
+ }
+}
+
+void AccessibleDrawDocumentView::Activated()
+{
+ if (mpChildrenManager == nullptr)
+ return;
+
+ bool bChange = false;
+ // When none of the children has the focus then claim it for the
+ // view.
+ if ( ! mpChildrenManager->HasFocus())
+ {
+ SetState (AccessibleStateType::FOCUSED);
+ bChange = true;
+ }
+ else
+ ResetState (AccessibleStateType::FOCUSED);
+ mpChildrenManager->UpdateSelection();
+ // if the child gets focus in UpdateSelection(), needs to reset the focus on document.
+ if (mpChildrenManager->HasFocus() && bChange)
+ ResetState (AccessibleStateType::FOCUSED);
+}
+
+void AccessibleDrawDocumentView::Deactivated()
+{
+ if (mpChildrenManager != nullptr)
+ mpChildrenManager->RemoveFocus();
+ ResetState (AccessibleStateType::FOCUSED);
+}
+
+void AccessibleDrawDocumentView::impl_dispose()
+{
+ mpChildrenManager.reset();
+ AccessibleDocumentViewBase::impl_dispose();
+}
+
+/** This method is called from the component helper base class while
+ disposing.
+*/
+void SAL_CALL AccessibleDrawDocumentView::disposing()
+{
+ // Release resources.
+ mpChildrenManager.reset();
+
+ // Forward call to base classes.
+ AccessibleDocumentViewBase::disposing ();
+}
+
+void AccessibleDrawDocumentView::UpdateAccessibleName()
+{
+ OUString sNewName (CreateAccessibleName() + ": ");
+
+ // Add the number of the current slide.
+ uno::Reference<drawing::XDrawView> xView (mxController, uno::UNO_QUERY);
+ if (xView.is())
+ {
+ uno::Reference<beans::XPropertySet> xProperties (xView->getCurrentPage(), UNO_QUERY);
+ if (xProperties.is())
+ try
+ {
+ sal_Int16 nPageNumber (0);
+ if (xProperties->getPropertyValue("Number") >>= nPageNumber)
+ {
+ sNewName += OUString::number(nPageNumber);
+ }
+ }
+ catch (const beans::UnknownPropertyException&)
+ {
+ }
+ }
+
+ // Add the number of pages/slides.
+ Reference<drawing::XDrawPagesSupplier> xPagesSupplier (mxModel, UNO_QUERY);
+ if (xPagesSupplier.is())
+ {
+ Reference<container::XIndexAccess> xPages = xPagesSupplier->getDrawPages();
+ if (xPages.is())
+ {
+ sNewName += " / " + OUString::number(xPages->getCount());
+ }
+ }
+
+ SetAccessibleName (sNewName, AutomaticallyCreated);
+}
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/accessibility/AccessibleOutlineEditSource.cxx b/sd/source/ui/accessibility/AccessibleOutlineEditSource.cxx
new file mode 100644
index 000000000..a1a79a678
--- /dev/null
+++ b/sd/source/ui/accessibility/AccessibleOutlineEditSource.cxx
@@ -0,0 +1,199 @@
+/* -*- 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 <memory>
+#include <editeng/unoedhlp.hxx>
+#include <svx/svdoutl.hxx>
+#include <svx/svdview.hxx>
+#include <vcl/window.hxx>
+#include <AccessibleOutlineEditSource.hxx>
+
+namespace accessibility
+{
+
+ AccessibleOutlineEditSource::AccessibleOutlineEditSource(
+ SdrOutliner& rOutliner,
+ SdrView& rView,
+ OutlinerView& rOutlView,
+ const vcl::Window& rViewWindow )
+ : mrView( rView ),
+ mrWindow( rViewWindow ),
+ mpOutliner( &rOutliner ),
+ mpOutlinerView( &rOutlView ),
+ mTextForwarder( rOutliner, false ),
+ mViewForwarder( rOutlView )
+ {
+ // register as listener - need to broadcast state change messages
+ // Moved to ::GetTextForwarder()
+ //rOutliner.SetNotifyHdl( LINK(this, AccessibleOutlineEditSource, NotifyHdl) );
+ StartListening(rOutliner);
+ }
+
+ AccessibleOutlineEditSource::~AccessibleOutlineEditSource()
+ {
+ if( mpOutliner )
+ mpOutliner->SetNotifyHdl( Link<EENotify&,void>() );
+ Broadcast( TextHint( SfxHintId::Dying ) );
+ }
+
+ std::unique_ptr<SvxEditSource> AccessibleOutlineEditSource::Clone() const
+ {
+ return std::unique_ptr<SvxEditSource>(new AccessibleOutlineEditSource(*mpOutliner, mrView, *mpOutlinerView, mrWindow));
+ }
+
+ SvxTextForwarder* AccessibleOutlineEditSource::GetTextForwarder()
+ {
+ // TODO: maybe suboptimal
+ if( IsValid() )
+ {
+ // Moved here to make sure that
+ // the NotifyHandler was set on the current object.
+ mpOutliner->SetNotifyHdl( LINK(this, AccessibleOutlineEditSource, NotifyHdl) );
+ return &mTextForwarder;
+ }
+ else
+ return nullptr;
+ }
+
+ SvxViewForwarder* AccessibleOutlineEditSource::GetViewForwarder()
+ {
+ // TODO: maybe suboptimal
+ if( IsValid() )
+ return this;
+ else
+ return nullptr;
+ }
+
+ SvxEditViewForwarder* AccessibleOutlineEditSource::GetEditViewForwarder( bool )
+ {
+ // TODO: maybe suboptimal
+ if( IsValid() )
+ {
+ // ignore parameter, we're always in edit mode here
+ return &mViewForwarder;
+ }
+ else
+ return nullptr;
+ }
+
+ void AccessibleOutlineEditSource::UpdateData()
+ {
+ // NOOP, since we're always working on the 'real' outliner,
+ // i.e. changes are immediately reflected on the screen
+ }
+
+ SfxBroadcaster& AccessibleOutlineEditSource::GetBroadcaster() const
+ {
+ return * const_cast< AccessibleOutlineEditSource* > (this);
+ }
+
+ bool AccessibleOutlineEditSource::IsValid() const
+ {
+ if( mpOutliner && mpOutlinerView )
+ {
+ // Our view still on outliner?
+ sal_uLong nCurrView, nViews;
+
+ for( nCurrView=0, nViews=mpOutliner->GetViewCount(); nCurrView<nViews; ++nCurrView )
+ {
+ if( mpOutliner->GetView(nCurrView) == mpOutlinerView )
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ Point AccessibleOutlineEditSource::LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const
+ {
+ if( IsValid() && mrView.GetModel() )
+ {
+ Point aPoint( OutputDevice::LogicToLogic( rPoint, rMapMode,
+ MapMode(mrView.GetModel()->GetScaleUnit()) ) );
+ MapMode aMapMode(mrWindow.GetMapMode());
+ aMapMode.SetOrigin(Point());
+ return mrWindow.LogicToPixel( aPoint, aMapMode );
+ }
+
+ return Point();
+ }
+
+ Point AccessibleOutlineEditSource::PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const
+ {
+ if( IsValid() && mrView.GetModel() )
+ {
+ MapMode aMapMode(mrWindow.GetMapMode());
+ aMapMode.SetOrigin(Point());
+ Point aPoint( mrWindow.PixelToLogic( rPoint, aMapMode ) );
+ return OutputDevice::LogicToLogic( aPoint,
+ MapMode(mrView.GetModel()->GetScaleUnit()),
+ rMapMode );
+ }
+
+ return Point();
+ }
+
+ void AccessibleOutlineEditSource::Notify( SfxBroadcaster& rBroadcaster, const SfxHint& rHint )
+ {
+ bool bDispose = false;
+
+ if( &rBroadcaster == mpOutliner )
+ {
+ if( rHint.GetId() == SfxHintId::Dying )
+ {
+ bDispose = true;
+ mpOutliner = nullptr;
+ }
+ }
+ else
+ {
+ if (rHint.GetId() == SfxHintId::ThisIsAnSdrHint)
+ {
+ const SdrHint* pSdrHint = static_cast< const SdrHint* >( &rHint );
+ if( pSdrHint->GetKind() == SdrHintKind::ModelCleared )
+ {
+ // model is dying under us, going defunc
+ bDispose = true;
+ }
+ }
+ }
+
+ if( bDispose )
+ {
+ if( mpOutliner )
+ mpOutliner->SetNotifyHdl( Link<EENotify&,void>() );
+ mpOutliner = nullptr;
+ mpOutlinerView = nullptr;
+ Broadcast( TextHint( SfxHintId::Dying ) );
+ }
+ }
+
+ IMPL_LINK(AccessibleOutlineEditSource, NotifyHdl, EENotify&, rNotify, void)
+ {
+ ::std::unique_ptr< SfxHint > aHint( SvxEditSourceHelper::EENotification2Hint( &rNotify) );
+
+ if (aHint)
+ {
+ Broadcast(*aHint);
+ }
+ }
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/accessibility/AccessibleOutlineView.cxx b/sd/source/ui/accessibility/AccessibleOutlineView.cxx
new file mode 100644
index 000000000..4e020efef
--- /dev/null
+++ b/sd/source/ui/accessibility/AccessibleOutlineView.cxx
@@ -0,0 +1,238 @@
+/* -*- 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 <com/sun/star/accessibility/AccessibleEventId.hpp>
+
+#include <sal/log.hxx>
+#include <vcl/svapp.hxx>
+#include <Window.hxx>
+#include <OutlineViewShell.hxx>
+#include <DrawDocShell.hxx>
+#include <OutlineView.hxx>
+#include <View.hxx>
+#include <AccessibleOutlineView.hxx>
+#include <AccessibleOutlineEditSource.hxx>
+#include <drawdoc.hxx>
+#include <strings.hrc>
+#include <sdresid.hxx>
+
+#include <memory>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::accessibility;
+
+namespace accessibility {
+
+//===== internal ============================================================
+
+AccessibleOutlineView::AccessibleOutlineView (
+ ::sd::Window* pSdWindow,
+ ::sd::OutlineViewShell* pViewShell,
+ const uno::Reference<frame::XController>& rxController,
+ const uno::Reference<XAccessible>& rxParent)
+ : AccessibleDocumentViewBase (pSdWindow, pViewShell, rxController, rxParent),
+ maTextHelper( ::std::unique_ptr< SvxEditSource >() )
+{
+ SolarMutexGuard aGuard;
+
+ // Beware! Here we leave the paths of the UNO API and descend into the
+ // depths of the core. Necessary for making the edit engine accessible.
+ if (!pSdWindow)
+ return;
+
+ ::sd::View* pView = pViewShell->GetView();
+
+ auto pShellView = dynamic_cast<::sd::OutlineView* >( pView );
+ if(!pShellView)
+ return;
+
+ OutlinerView* pOutlineView = pShellView->GetViewByWindow( pSdWindow );
+ SdrOutliner& rOutliner = pShellView->GetOutliner();
+
+ if( pOutlineView )
+ {
+ maTextHelper.SetEditSource( ::std::unique_ptr< SvxEditSource >( new AccessibleOutlineEditSource(
+ rOutliner, *pView, *pOutlineView, *pSdWindow ) ) );
+ }
+}
+
+AccessibleOutlineView::~AccessibleOutlineView()
+{
+}
+
+void AccessibleOutlineView::Init()
+{
+ // Set event source _before_ starting to listen
+ maTextHelper.SetEventSource(this);
+
+ AccessibleDocumentViewBase::Init ();
+}
+
+void AccessibleOutlineView::ViewForwarderChanged()
+{
+ AccessibleDocumentViewBase::ViewForwarderChanged();
+
+ UpdateChildren();
+}
+
+//===== XAccessibleContext ==================================================
+
+sal_Int32 SAL_CALL
+ AccessibleOutlineView::getAccessibleChildCount()
+{
+ ThrowIfDisposed ();
+
+ // forward
+ return maTextHelper.GetChildCount();
+}
+
+uno::Reference<XAccessible> SAL_CALL
+ AccessibleOutlineView::getAccessibleChild (sal_Int32 nIndex)
+{
+ ThrowIfDisposed ();
+ // Forward request to children manager.
+ return maTextHelper.GetChild(nIndex);
+}
+
+OUString SAL_CALL
+ AccessibleOutlineView::getAccessibleName()
+{
+ SolarMutexGuard g;
+
+ OUString sName = SdResId(SID_SD_A11Y_D_PRESENTATION);
+ ::sd::View* pSdView = static_cast< ::sd::View* >( maShapeTreeInfo.GetSdrView() );
+ if ( pSdView )
+ {
+ SdDrawDocument& rDoc = pSdView->GetDoc();
+ OUString sFileName = rDoc.getDocAccTitle();
+ if (sFileName.isEmpty())
+ {
+ ::sd::DrawDocShell* pDocSh = pSdView->GetDocSh();
+ if ( pDocSh )
+ {
+ sFileName = pDocSh->GetTitle( SFX_TITLE_APINAME );
+ }
+ }
+ if (!sFileName.isEmpty())
+ {
+ sName = sFileName + " - " + sName;
+ }
+ }
+ return sName;
+}
+
+//===== XAccessibleEventBroadcaster ========================================
+
+void SAL_CALL AccessibleOutlineView::addAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener )
+{
+ // delegate listener handling to children manager.
+ if ( ! IsDisposed())
+ maTextHelper.AddEventListener(xListener);
+ AccessibleContextBase::addEventListener(xListener);
+}
+
+void SAL_CALL AccessibleOutlineView::removeAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener )
+{
+ // forward
+ if ( ! IsDisposed())
+ maTextHelper.RemoveEventListener(xListener);
+ AccessibleContextBase::removeEventListener(xListener);
+}
+
+// XServiceInfo
+
+OUString SAL_CALL
+ AccessibleOutlineView::getImplementationName()
+{
+ return "AccessibleOutlineView";
+}
+
+//===== XEventListener ======================================================
+
+//===== protected internal ==================================================
+
+void AccessibleOutlineView::Activated()
+{
+ SolarMutexGuard aGuard;
+
+ // delegate listener handling to children manager.
+ maTextHelper.SetFocus();
+}
+
+void AccessibleOutlineView::Deactivated()
+{
+ SolarMutexGuard aGuard;
+
+ // delegate listener handling to children manager.
+ maTextHelper.SetFocus(false);
+}
+
+void SAL_CALL AccessibleOutlineView::disposing()
+{
+ // dispose children
+ maTextHelper.Dispose();
+
+ AccessibleDocumentViewBase::disposing ();
+}
+
+//===== XPropertyChangeListener =============================================
+
+void SAL_CALL
+ AccessibleOutlineView::propertyChange (const beans::PropertyChangeEvent& rEventObject)
+{
+ ThrowIfDisposed ();
+
+ AccessibleDocumentViewBase::propertyChange (rEventObject);
+
+ //add page switch event for slide show mode
+ if (rEventObject.PropertyName == "CurrentPage" ||
+ rEventObject.PropertyName == "PageChange")
+ {
+ // The current page changed. Update the children accordingly.
+ UpdateChildren();
+ CommitChange(AccessibleEventId::PAGE_CHANGED,rEventObject.NewValue, rEventObject.OldValue);
+ }
+ else if ( rEventObject.PropertyName == "VisibleArea" )
+ {
+ // The visible area changed. Update the children accordingly.
+ UpdateChildren();
+ }
+ else
+ {
+ SAL_INFO("sd", "unhandled");
+ }
+}
+
+/// Create a name for this view.
+OUString AccessibleOutlineView::CreateAccessibleName()
+{
+ return SdResId(SID_SD_A11Y_I_OUTLINEVIEW_N);
+}
+
+void AccessibleOutlineView::UpdateChildren()
+{
+ SolarMutexGuard aGuard;
+
+ // Update visible children
+ maTextHelper.UpdateChildren();
+}
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/accessibility/AccessiblePageShape.cxx b/sd/source/ui/accessibility/AccessiblePageShape.cxx
new file mode 100644
index 000000000..2900019ae
--- /dev/null
+++ b/sd/source/ui/accessibility/AccessiblePageShape.cxx
@@ -0,0 +1,261 @@
+/* -*- 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 <AccessiblePageShape.hxx>
+#include <svx/AccessibleShapeInfo.hxx>
+#include <svx/IAccessibleViewForwarder.hxx>
+#include <tools/diagnose_ex.h>
+#include <tools/gen.hxx>
+#include <sal/log.hxx>
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/XMasterPageTarget.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::accessibility;
+using ::com::sun::star::uno::Reference;
+
+namespace accessibility {
+
+//===== internal ============================================================
+
+AccessiblePageShape::AccessiblePageShape (
+ const uno::Reference<drawing::XDrawPage>& rxPage,
+ const uno::Reference<XAccessible>& rxParent,
+ const AccessibleShapeTreeInfo& rShapeTreeInfo)
+ : AccessibleShape (AccessibleShapeInfo (nullptr, rxParent), rShapeTreeInfo),
+ mxPage (rxPage)
+{
+ // The main part of the initialization is done in the init method which
+ // has to be called from this constructor's caller.
+}
+
+AccessiblePageShape::~AccessiblePageShape()
+{
+}
+
+//===== XAccessibleContext ==================================================
+
+sal_Int32 SAL_CALL
+ AccessiblePageShape::getAccessibleChildCount()
+{
+ return 0;
+}
+
+/** Forward the request to the shape. Return the requested shape or throw
+ an exception for a wrong index.
+*/
+uno::Reference<XAccessible> SAL_CALL
+ AccessiblePageShape::getAccessibleChild( sal_Int32 )
+{
+ throw lang::IndexOutOfBoundsException ("page shape has no children",
+ static_cast<uno::XWeak*>(this));
+}
+
+//===== XAccessibleComponent ================================================
+
+awt::Rectangle SAL_CALL AccessiblePageShape::getBounds()
+{
+ ThrowIfDisposed ();
+
+ awt::Rectangle aBoundingBox;
+
+ if (maShapeTreeInfo.GetViewForwarder() != nullptr)
+ {
+ uno::Reference<beans::XPropertySet> xSet (mxPage, uno::UNO_QUERY);
+ if (xSet.is())
+ {
+ uno::Any aValue;
+
+ aValue = xSet->getPropertyValue ("BorderLeft");
+ aValue >>= aBoundingBox.X;
+ aValue = xSet->getPropertyValue ("BorderTop");
+ aValue >>= aBoundingBox.Y;
+
+ aValue = xSet->getPropertyValue ("Width");
+ aValue >>= aBoundingBox.Width;
+ aValue = xSet->getPropertyValue ("Height");
+ aValue >>= aBoundingBox.Height;
+ }
+
+ // Transform coordinates from internal to pixel.
+ ::Size aPixelSize = maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
+ ::Size (aBoundingBox.Width, aBoundingBox.Height));
+ ::Point aPixelPosition = maShapeTreeInfo.GetViewForwarder()->LogicToPixel (
+ ::Point (aBoundingBox.X, aBoundingBox.Y));
+
+ // Clip the shape's bounding box with the bounding box of its parent.
+ Reference<XAccessibleComponent> xParentComponent (
+ getAccessibleParent(), uno::UNO_QUERY);
+ if (xParentComponent.is())
+ {
+ // Make the coordinates relative to the parent.
+ awt::Point aParentLocation (xParentComponent->getLocationOnScreen());
+ int x = aPixelPosition.getX() - aParentLocation.X;
+ int y = aPixelPosition.getY() - aParentLocation.Y;
+
+ // Clip with parent (with coordinates relative to itself).
+ ::tools::Rectangle aBBox (
+ x, y, x + aPixelSize.getWidth(), y + aPixelSize.getHeight());
+ awt::Size aParentSize (xParentComponent->getSize());
+ ::tools::Rectangle aParentBBox (0,0, aParentSize.Width, aParentSize.Height);
+ aBBox = aBBox.GetIntersection (aParentBBox);
+ aBoundingBox = awt::Rectangle (
+ aBBox.Left(),
+ aBBox.Top(),
+ aBBox.getWidth(),
+ aBBox.getHeight());
+ }
+ else
+ aBoundingBox = awt::Rectangle (
+ aPixelPosition.getX(), aPixelPosition.getY(),
+ aPixelSize.getWidth(), aPixelSize.getHeight());
+ }
+
+ return aBoundingBox;
+}
+
+sal_Int32 SAL_CALL AccessiblePageShape::getForeground()
+{
+ ThrowIfDisposed ();
+ sal_Int32 nColor (0x0ffffffL);
+
+ try
+ {
+ uno::Reference<beans::XPropertySet> aSet (mxPage, uno::UNO_QUERY);
+ if (aSet.is())
+ {
+ uno::Any aColor = aSet->getPropertyValue ("LineColor");
+ aColor >>= nColor;
+ }
+ }
+ catch (const css::beans::UnknownPropertyException&)
+ {
+ // Ignore exception and return default color.
+ }
+ return nColor;
+}
+
+/** Extract the background color from the Background property of the
+ draw page or its master page.
+*/
+sal_Int32 SAL_CALL AccessiblePageShape::getBackground()
+{
+ ThrowIfDisposed ();
+ sal_Int32 nColor (0x01020ffL);
+
+ try
+ {
+ uno::Reference<beans::XPropertySet> xSet (mxPage, uno::UNO_QUERY);
+ if (xSet.is())
+ {
+ uno::Any aBGSet = xSet->getPropertyValue ("Background");
+ Reference<beans::XPropertySet> xBGSet (aBGSet, uno::UNO_QUERY);
+ if ( ! xBGSet.is())
+ {
+ // Draw page has no Background property. Try the master
+ // page instead.
+ Reference<drawing::XMasterPageTarget> xTarget (mxPage, uno::UNO_QUERY);
+ if (xTarget.is())
+ {
+ xSet.set(xTarget->getMasterPage(), uno::UNO_QUERY);
+ aBGSet = xSet->getPropertyValue ("Background");
+ xBGSet.set(aBGSet, uno::UNO_QUERY);
+ }
+ }
+ // Fetch the fill color. Has to be extended to cope with
+ // gradients, hashes, and bitmaps.
+ if (xBGSet.is())
+ {
+ uno::Any aColor = xBGSet->getPropertyValue ("FillColor");
+ aColor >>= nColor;
+ }
+ else
+ SAL_WARN("sd", "no Background property in page");
+ }
+ }
+ catch (const css::beans::UnknownPropertyException&)
+ {
+ TOOLS_WARN_EXCEPTION("sd", "caught exception due to unknown property");
+ // Ignore exception and return default color.
+ }
+ return nColor;
+}
+
+// XServiceInfo
+
+OUString SAL_CALL
+ AccessiblePageShape::getImplementationName()
+{
+ ThrowIfDisposed ();
+ return "AccessiblePageShape";
+}
+
+css::uno::Sequence< OUString> SAL_CALL
+ AccessiblePageShape::getSupportedServiceNames()
+{
+ ThrowIfDisposed ();
+ return AccessibleShape::getSupportedServiceNames();
+}
+
+//===== XComponent ==========================================================
+
+void AccessiblePageShape::dispose()
+{
+ // Cleanup.
+ mxShape = nullptr;
+
+ // Call base classes.
+ AccessibleContextBase::dispose ();
+}
+
+//===== protected internal ==================================================
+
+OUString
+ AccessiblePageShape::CreateAccessibleBaseName()
+{
+ return "PageShape";
+}
+
+OUString
+ AccessiblePageShape::CreateAccessibleName()
+{
+ Reference<beans::XPropertySet> xPageProperties (mxPage, UNO_QUERY);
+
+ // Get name of the current slide.
+ OUString sCurrentSlideName;
+ try
+ {
+ if (xPageProperties.is())
+ {
+ xPageProperties->getPropertyValue( "LinkDisplayName" ) >>= sCurrentSlideName;
+ }
+ }
+ catch (const beans::UnknownPropertyException&)
+ {
+ }
+
+ return CreateAccessibleBaseName()+": "+sCurrentSlideName;
+}
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/accessibility/AccessiblePresentationGraphicShape.cxx b/sd/source/ui/accessibility/AccessiblePresentationGraphicShape.cxx
new file mode 100644
index 000000000..a8c37fa89
--- /dev/null
+++ b/sd/source/ui/accessibility/AccessiblePresentationGraphicShape.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/.
+ *
+ * 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 <AccessiblePresentationGraphicShape.hxx>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
+
+#include <SdShapeTypes.hxx>
+
+#include <svx/ShapeTypeHandler.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::accessibility;
+
+namespace accessibility
+{
+//===== internal ============================================================
+
+AccessiblePresentationGraphicShape::AccessiblePresentationGraphicShape(
+ const AccessibleShapeInfo& rShapeInfo, const AccessibleShapeTreeInfo& rShapeTreeInfo)
+ : AccessibleGraphicShape(rShapeInfo, rShapeTreeInfo)
+{
+}
+
+AccessiblePresentationGraphicShape::~AccessiblePresentationGraphicShape() {}
+
+// XServiceInfo
+
+OUString SAL_CALL AccessiblePresentationGraphicShape::getImplementationName()
+{
+ return "AccessiblePresentationGraphicShape";
+}
+
+/// Set this object's name if is different to the current name.
+OUString AccessiblePresentationGraphicShape::CreateAccessibleBaseName()
+{
+ OUString sName;
+
+ ShapeTypeId nShapeType = ShapeTypeHandler::Instance().GetTypeId(mxShape);
+ switch (nShapeType)
+ {
+ case PRESENTATION_GRAPHIC_OBJECT:
+ sName = "ImpressGraphicObject";
+ break;
+ default:
+ sName = "UnknownAccessibleImpressShape";
+ if (mxShape.is())
+ sName += ": " + mxShape->getShapeType();
+ }
+
+ return sName;
+}
+
+sal_Int16 SAL_CALL AccessiblePresentationGraphicShape::getAccessibleRole()
+{
+ return AccessibleRole::GRAPHIC;
+}
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/accessibility/AccessiblePresentationOLEShape.cxx b/sd/source/ui/accessibility/AccessiblePresentationOLEShape.cxx
new file mode 100644
index 000000000..411d04af1
--- /dev/null
+++ b/sd/source/ui/accessibility/AccessiblePresentationOLEShape.cxx
@@ -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/.
+ *
+ * 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 <AccessiblePresentationOLEShape.hxx>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
+
+#include <SdShapeTypes.hxx>
+
+#include <svx/ShapeTypeHandler.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::accessibility;
+
+namespace accessibility
+{
+//===== internal ============================================================
+
+AccessiblePresentationOLEShape::AccessiblePresentationOLEShape(
+ const AccessibleShapeInfo& rShapeInfo, const AccessibleShapeTreeInfo& rShapeTreeInfo)
+ : AccessibleOLEShape(rShapeInfo, rShapeTreeInfo)
+{
+}
+
+AccessiblePresentationOLEShape::~AccessiblePresentationOLEShape() {}
+
+// XServiceInfo
+
+OUString SAL_CALL AccessiblePresentationOLEShape::getImplementationName()
+{
+ return "AccessiblePresentationOLEShape";
+}
+
+/// Set this object's name if it is different to the current name.
+OUString AccessiblePresentationOLEShape::CreateAccessibleBaseName()
+{
+ OUString sName;
+
+ ShapeTypeId nShapeType = ShapeTypeHandler::Instance().GetTypeId(mxShape);
+ switch (nShapeType)
+ {
+ case PRESENTATION_OLE:
+ sName = "ImpressOLE";
+ break;
+ case PRESENTATION_CHART:
+ sName = "ImpressChart";
+ break;
+ case PRESENTATION_TABLE:
+ sName = "ImpressTable";
+ break;
+ default:
+ sName = "UnknownAccessibleImpressOLEShape";
+ if (mxShape.is())
+ sName += ": " + mxShape->getShapeType();
+ }
+
+ return sName;
+}
+
+// Return this object's role.
+sal_Int16 SAL_CALL AccessiblePresentationOLEShape::getAccessibleRole()
+{
+ return AccessibleRole::EMBEDDED_OBJECT;
+}
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/accessibility/AccessiblePresentationShape.cxx b/sd/source/ui/accessibility/AccessiblePresentationShape.cxx
new file mode 100644
index 000000000..e4afe7e9a
--- /dev/null
+++ b/sd/source/ui/accessibility/AccessiblePresentationShape.cxx
@@ -0,0 +1,146 @@
+/* -*- 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 <AccessiblePresentationShape.hxx>
+
+#include <SdShapeTypes.hxx>
+
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <svx/ShapeTypeHandler.hxx>
+
+#include <com/sun/star/drawing/XShape.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::accessibility;
+
+namespace accessibility
+{
+//===== internal ============================================================
+
+AccessiblePresentationShape::AccessiblePresentationShape(
+ const AccessibleShapeInfo& rShapeInfo, const AccessibleShapeTreeInfo& rShapeTreeInfo)
+ : AccessibleShape(rShapeInfo, rShapeTreeInfo)
+{
+}
+
+AccessiblePresentationShape::~AccessiblePresentationShape() {}
+
+// XServiceInfo
+
+OUString SAL_CALL AccessiblePresentationShape::getImplementationName()
+{
+ return "AccessiblePresentationShape";
+}
+
+/// Set this object's name if is different to the current name.
+OUString AccessiblePresentationShape::CreateAccessibleBaseName()
+{
+ OUString sName;
+
+ ShapeTypeId nShapeType = ShapeTypeHandler::Instance().GetTypeId(mxShape);
+ switch (nShapeType)
+ {
+ case PRESENTATION_TITLE:
+ sName = SdResId(SID_SD_A11Y_P_TITLE_N);
+ break;
+ case PRESENTATION_OUTLINER:
+ sName = SdResId(SID_SD_A11Y_P_OUTLINER_N);
+ break;
+ case PRESENTATION_SUBTITLE:
+ sName = SdResId(SID_SD_A11Y_P_SUBTITLE_N);
+ break;
+ case PRESENTATION_PAGE:
+ sName = SdResId(SID_SD_A11Y_P_PAGE_N);
+ break;
+ case PRESENTATION_NOTES:
+ sName = SdResId(SID_SD_A11Y_P_NOTES_N);
+ break;
+ case PRESENTATION_HANDOUT:
+ sName = SdResId(SID_SD_A11Y_P_HANDOUT_N);
+ break;
+ case PRESENTATION_HEADER:
+ sName = SdResId(SID_SD_A11Y_P_HEADER_N);
+ break;
+ case PRESENTATION_FOOTER:
+ sName = SdResId(SID_SD_A11Y_P_FOOTER_N);
+ break;
+ case PRESENTATION_DATETIME:
+ sName = SdResId(SID_SD_A11Y_P_DATE_N);
+ break;
+ case PRESENTATION_PAGENUMBER:
+ sName = SdResId(SID_SD_A11Y_P_NUMBER_N);
+ break;
+ default:
+ sName = SdResId(SID_SD_A11Y_P_UNKNOWN_N);
+ if (mxShape.is())
+ sName += ": " + mxShape->getShapeType();
+ }
+
+ return sName;
+}
+
+OUString AccessiblePresentationShape::GetStyle() const
+{
+ OUString sName;
+
+ ShapeTypeId nShapeType = ShapeTypeHandler::Instance().GetTypeId(mxShape);
+ switch (nShapeType)
+ {
+ case PRESENTATION_TITLE:
+ sName = SdResId(SID_SD_A11Y_P_TITLE_N_STYLE);
+ break;
+ case PRESENTATION_OUTLINER:
+ sName = SdResId(SID_SD_A11Y_P_OUTLINER_N_STYLE);
+ break;
+ case PRESENTATION_SUBTITLE:
+ sName = SdResId(SID_SD_A11Y_P_SUBTITLE_N_STYLE);
+ break;
+ case PRESENTATION_PAGE:
+ sName = SdResId(SID_SD_A11Y_P_PAGE_N_STYLE);
+ break;
+ case PRESENTATION_NOTES:
+ sName = SdResId(SID_SD_A11Y_P_NOTES_N_STYLE);
+ break;
+ case PRESENTATION_HANDOUT:
+ sName = SdResId(SID_SD_A11Y_P_HANDOUT_N_STYLE);
+ break;
+ case PRESENTATION_FOOTER:
+ sName = SdResId(SID_SD_A11Y_P_FOOTER_N_STYLE);
+ break;
+ case PRESENTATION_HEADER:
+ sName = SdResId(SID_SD_A11Y_P_HEADER_N_STYLE);
+ break;
+ case PRESENTATION_DATETIME:
+ sName = SdResId(SID_SD_A11Y_P_DATE_N_STYLE);
+ break;
+ case PRESENTATION_PAGENUMBER:
+ sName = SdResId(SID_SD_A11Y_P_NUMBER_N_STYLE);
+ break;
+ default:
+ sName = SdResId(SID_SD_A11Y_P_UNKNOWN_N_STYLE);
+ if (mxShape.is())
+ sName += ": " + mxShape->getShapeType();
+ }
+
+ return sName;
+}
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/accessibility/AccessibleSlideSorterObject.cxx b/sd/source/ui/accessibility/AccessibleSlideSorterObject.cxx
new file mode 100644
index 000000000..13fc60db0
--- /dev/null
+++ b/sd/source/ui/accessibility/AccessibleSlideSorterObject.cxx
@@ -0,0 +1,429 @@
+/* -*- 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 <AccessibleSlideSorterObject.hxx>
+
+#include <SlideSorter.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsFocusManager.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsLayouter.hxx>
+#include <view/SlsPageObjectLayouter.hxx>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+#include <com/sun/star/accessibility/IllegalAccessibleComponentStateException.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <comphelper/accessibleeventnotifier.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <unotools/accessiblestatesethelper.hxx>
+#include <sal/log.hxx>
+
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/settings.hxx>
+
+#include <strings.hrc>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::accessibility;
+
+namespace accessibility {
+
+AccessibleSlideSorterObject::AccessibleSlideSorterObject(
+ const Reference<XAccessible>& rxParent,
+ ::sd::slidesorter::SlideSorter& rSlideSorter,
+ sal_uInt16 nPageNumber)
+ : mxParent(rxParent),
+ mnPageNumber(nPageNumber),
+ mrSlideSorter(rSlideSorter),
+ mnClientId(0)
+{
+}
+
+AccessibleSlideSorterObject::~AccessibleSlideSorterObject()
+{
+ if ( ! IsDisposed())
+ dispose();
+}
+
+void AccessibleSlideSorterObject::FireAccessibleEvent (
+ short nEventId,
+ const uno::Any& rOldValue,
+ const uno::Any& rNewValue)
+{
+ if (mnClientId != 0)
+ {
+ AccessibleEventObject aEventObject;
+
+ aEventObject.Source = Reference<XWeak>(this);
+ aEventObject.EventId = nEventId;
+ aEventObject.NewValue = rNewValue;
+ aEventObject.OldValue = rOldValue;
+
+ comphelper::AccessibleEventNotifier::addEvent(mnClientId, aEventObject);
+ }
+}
+
+void AccessibleSlideSorterObject::disposing(std::unique_lock<std::mutex>&)
+{
+ // Send a disposing to all listeners.
+ if (mnClientId != 0)
+ {
+ comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing(mnClientId, *this);
+ mnClientId = 0;
+ }
+}
+
+//===== XAccessible ===========================================================
+
+Reference<XAccessibleContext> SAL_CALL
+ AccessibleSlideSorterObject::getAccessibleContext()
+{
+ ThrowIfDisposed();
+ return this;
+}
+
+//===== XAccessibleContext ====================================================
+
+sal_Int32 SAL_CALL AccessibleSlideSorterObject::getAccessibleChildCount()
+{
+ ThrowIfDisposed();
+ return 0;
+}
+
+Reference<XAccessible> SAL_CALL AccessibleSlideSorterObject::getAccessibleChild (sal_Int32 )
+{
+ ThrowIfDisposed();
+ throw lang::IndexOutOfBoundsException();
+}
+
+Reference<XAccessible> SAL_CALL AccessibleSlideSorterObject::getAccessibleParent()
+{
+ ThrowIfDisposed();
+ return mxParent;
+}
+
+sal_Int32 SAL_CALL AccessibleSlideSorterObject::getAccessibleIndexInParent()
+{
+ ThrowIfDisposed();
+ const SolarMutexGuard aSolarGuard;
+ sal_Int32 nIndexInParent(-1);
+
+ if (mxParent.is())
+ {
+ Reference<XAccessibleContext> xParentContext (mxParent->getAccessibleContext());
+ if (xParentContext.is())
+ {
+ sal_Int32 nChildCount (xParentContext->getAccessibleChildCount());
+ for (sal_Int32 i=0; i<nChildCount; ++i)
+ if (xParentContext->getAccessibleChild(i).get()
+ == static_cast<XAccessible*>(this))
+ {
+ nIndexInParent = i;
+ break;
+ }
+ }
+ }
+
+ return nIndexInParent;
+}
+
+sal_Int16 SAL_CALL AccessibleSlideSorterObject::getAccessibleRole()
+{
+ ThrowIfDisposed();
+ return AccessibleRole::SHAPE;
+}
+
+OUString SAL_CALL AccessibleSlideSorterObject::getAccessibleDescription()
+{
+ ThrowIfDisposed();
+ return SdResId(STR_PAGE);
+}
+
+OUString SAL_CALL AccessibleSlideSorterObject::getAccessibleName()
+{
+ ThrowIfDisposed();
+ const SolarMutexGuard aSolarGuard;
+
+ SdPage* pPage = GetPage();
+ if (pPage != nullptr)
+ return pPage->GetName();
+ else
+ return OUString();
+}
+
+Reference<XAccessibleRelationSet> SAL_CALL
+ AccessibleSlideSorterObject::getAccessibleRelationSet()
+{
+ ThrowIfDisposed();
+ return Reference<XAccessibleRelationSet>();
+}
+
+Reference<XAccessibleStateSet> SAL_CALL
+ AccessibleSlideSorterObject::getAccessibleStateSet()
+{
+ ThrowIfDisposed();
+ const SolarMutexGuard aSolarGuard;
+ rtl::Reference<::utl::AccessibleStateSetHelper> pStateSet = new ::utl::AccessibleStateSetHelper();
+
+ if (mxParent.is())
+ {
+ // Unconditional states.
+ pStateSet->AddState(AccessibleStateType::SELECTABLE);
+ pStateSet->AddState(AccessibleStateType::FOCUSABLE);
+ pStateSet->AddState(AccessibleStateType::ENABLED);
+ pStateSet->AddState(AccessibleStateType::VISIBLE);
+ pStateSet->AddState(AccessibleStateType::SHOWING);
+ pStateSet->AddState(AccessibleStateType::ACTIVE);
+ pStateSet->AddState(AccessibleStateType::SENSITIVE);
+
+ // Conditional states.
+ if (mrSlideSorter.GetController().GetPageSelector().IsPageSelected(mnPageNumber))
+ pStateSet->AddState(AccessibleStateType::SELECTED);
+ if (mrSlideSorter.GetController().GetFocusManager().GetFocusedPageIndex() == mnPageNumber)
+ if (mrSlideSorter.GetController().GetFocusManager().IsFocusShowing())
+ pStateSet->AddState(AccessibleStateType::FOCUSED);
+ }
+
+ return pStateSet;
+}
+
+lang::Locale SAL_CALL AccessibleSlideSorterObject::getLocale()
+{
+ ThrowIfDisposed();
+ // Delegate request to parent.
+ if (mxParent.is())
+ {
+ Reference<XAccessibleContext> xParentContext (mxParent->getAccessibleContext());
+ if (xParentContext.is())
+ return xParentContext->getLocale ();
+ }
+
+ // No locale and no parent. Therefore throw exception to indicate this
+ // cluelessness.
+ throw IllegalAccessibleComponentStateException();
+}
+
+//===== XAccessibleEventBroadcaster ===========================================
+
+void SAL_CALL AccessibleSlideSorterObject::addAccessibleEventListener(
+ const Reference<XAccessibleEventListener>& rxListener)
+{
+ if (!rxListener.is())
+ return;
+
+ const std::unique_lock aGuard(m_aMutex);
+
+ if (IsDisposed())
+ {
+ uno::Reference<uno::XInterface> x (static_cast<lang::XComponent *>(this), uno::UNO_QUERY);
+ rxListener->disposing (lang::EventObject (x));
+ }
+ else
+ {
+ if (mnClientId == 0)
+ mnClientId = comphelper::AccessibleEventNotifier::registerClient();
+ comphelper::AccessibleEventNotifier::addEventListener(mnClientId, rxListener);
+ }
+}
+
+void SAL_CALL AccessibleSlideSorterObject::removeAccessibleEventListener(
+ const Reference<XAccessibleEventListener>& rxListener)
+{
+ ThrowIfDisposed();
+ if (!(rxListener.is() && mnClientId))
+ return;
+
+ const std::unique_lock aGuard(m_aMutex);
+
+ sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( mnClientId, rxListener );
+ if ( !nListenerCount )
+ {
+ // no listeners anymore
+ // -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
+ // and at least to us not firing any events anymore, in case somebody calls
+ // NotifyAccessibleEvent, again
+ comphelper::AccessibleEventNotifier::revokeClient( mnClientId );
+ mnClientId = 0;
+ }
+}
+
+//===== XAccessibleComponent ==================================================
+
+sal_Bool SAL_CALL AccessibleSlideSorterObject::containsPoint(const awt::Point& aPoint)
+{
+ ThrowIfDisposed();
+ const awt::Size aSize (getSize());
+ return (aPoint.X >= 0)
+ && (aPoint.X < aSize.Width)
+ && (aPoint.Y >= 0)
+ && (aPoint.Y < aSize.Height);
+}
+
+Reference<XAccessible> SAL_CALL
+ AccessibleSlideSorterObject::getAccessibleAtPoint(const awt::Point& )
+{
+ return nullptr;
+}
+
+awt::Rectangle SAL_CALL AccessibleSlideSorterObject::getBounds()
+{
+ ThrowIfDisposed ();
+
+ const SolarMutexGuard aSolarGuard;
+
+ ::tools::Rectangle aBBox (
+ mrSlideSorter.GetView().GetLayouter().GetPageObjectLayouter()->GetBoundingBox(
+ mrSlideSorter.GetModel().GetPageDescriptor(mnPageNumber),
+ ::sd::slidesorter::view::PageObjectLayouter::Part::PageObject,
+ ::sd::slidesorter::view::PageObjectLayouter::WindowCoordinateSystem));
+
+ if (mxParent.is())
+ {
+ Reference<XAccessibleComponent> xParentComponent(mxParent->getAccessibleContext(), UNO_QUERY);
+ if (xParentComponent.is())
+ {
+ awt::Rectangle aParentBBox (xParentComponent->getBounds());
+ aBBox.Intersection(::tools::Rectangle(
+ aParentBBox.X,
+ aParentBBox.Y,
+ aParentBBox.Width,
+ aParentBBox.Height));
+ }
+ }
+
+ return awt::Rectangle(
+ aBBox.Left(),
+ aBBox.Top(),
+ aBBox.GetWidth(),
+ aBBox.GetHeight());
+}
+
+awt::Point SAL_CALL AccessibleSlideSorterObject::getLocation ()
+{
+ ThrowIfDisposed ();
+ const awt::Rectangle aBBox (getBounds());
+ return awt::Point(aBBox.X, aBBox.Y);
+}
+
+awt::Point SAL_CALL AccessibleSlideSorterObject::getLocationOnScreen()
+{
+ ThrowIfDisposed ();
+
+ const SolarMutexGuard aSolarGuard;
+
+ awt::Point aLocation (getLocation());
+
+ if (mxParent.is())
+ {
+ Reference<XAccessibleComponent> xParentComponent(mxParent->getAccessibleContext(),UNO_QUERY);
+ if (xParentComponent.is())
+ {
+ const awt::Point aParentLocationOnScreen(xParentComponent->getLocationOnScreen());
+ aLocation.X += aParentLocationOnScreen.X;
+ aLocation.Y += aParentLocationOnScreen.Y;
+ }
+ }
+
+ return aLocation;
+}
+
+awt::Size SAL_CALL AccessibleSlideSorterObject::getSize()
+{
+ ThrowIfDisposed ();
+ const awt::Rectangle aBBox (getBounds());
+ return awt::Size(aBBox.Width,aBBox.Height);
+}
+
+void SAL_CALL AccessibleSlideSorterObject::grabFocus()
+{
+ // nothing to do
+}
+
+sal_Int32 SAL_CALL AccessibleSlideSorterObject::getForeground()
+{
+ ThrowIfDisposed ();
+ svtools::ColorConfig aColorConfig;
+ Color nColor = aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor;
+ return static_cast<sal_Int32>(nColor);
+}
+
+sal_Int32 SAL_CALL AccessibleSlideSorterObject::getBackground()
+{
+ ThrowIfDisposed ();
+ Color nColor = Application::GetSettings().GetStyleSettings().GetWindowColor();
+ return sal_Int32(nColor);
+}
+
+// XServiceInfo
+OUString SAL_CALL
+ AccessibleSlideSorterObject::getImplementationName()
+{
+ return "AccessibleSlideSorterObject";
+}
+
+sal_Bool SAL_CALL AccessibleSlideSorterObject::supportsService (const OUString& sServiceName)
+{
+ return cppu::supportsService(this, sServiceName);
+}
+
+uno::Sequence< OUString> SAL_CALL
+ AccessibleSlideSorterObject::getSupportedServiceNames()
+{
+ ThrowIfDisposed ();
+
+ return uno::Sequence<OUString> {
+ OUString("com.sun.star.accessibility.Accessible"),
+ OUString("com.sun.star.accessibility.AccessibleContext")
+ };
+}
+
+void AccessibleSlideSorterObject::ThrowIfDisposed()
+{
+ if (m_bDisposed)
+ {
+ SAL_WARN("sd", "Calling disposed object. Throwing exception:");
+ throw lang::DisposedException ("object has been already disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+bool AccessibleSlideSorterObject::IsDisposed() const
+{
+ return m_bDisposed;
+}
+
+SdPage* AccessibleSlideSorterObject::GetPage() const
+{
+ ::sd::slidesorter::model::SharedPageDescriptor pDescriptor(
+ mrSlideSorter.GetModel().GetPageDescriptor(mnPageNumber));
+ if (pDescriptor)
+ return pDescriptor->GetPage();
+ else
+ return nullptr;
+}
+
+} // end of namespace ::accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/accessibility/AccessibleSlideSorterView.cxx b/sd/source/ui/accessibility/AccessibleSlideSorterView.cxx
new file mode 100644
index 000000000..87eea89d2
--- /dev/null
+++ b/sd/source/ui/accessibility/AccessibleSlideSorterView.cxx
@@ -0,0 +1,950 @@
+/* -*- 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 <AccessibleSlideSorterView.hxx>
+#include <AccessibleSlideSorterObject.hxx>
+
+#include <SlideSorter.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsFocusManager.hxx>
+#include <controller/SlsSelectionManager.hxx>
+#include <view/SlideSorterView.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageDescriptor.hxx>
+
+#include <ViewShell.hxx>
+#include <ViewShellHint.hxx>
+#include <sdpage.hxx>
+#include <drawdoc.hxx>
+
+#include <sdresid.hxx>
+#include <strings.hrc>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <comphelper/accessibleeventnotifier.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <o3tl/safeint.hxx>
+#include <unotools/accessiblestatesethelper.hxx>
+#include <rtl/ref.hxx>
+#include <sal/log.hxx>
+#include <i18nlangtag/languagetag.hxx>
+
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::accessibility;
+
+namespace accessibility {
+
+/** Inner implementation class of the AccessibleSlideSorterView.
+
+ Note that some event broadcasting is done asynchronously because
+ otherwise it could lead to deadlocks on (at least) some Solaris
+ machines. Probably (but unverified) this can happen on all GTK based
+ systems. The asynchronous broadcasting is just a workaround for a
+ poorly understood problem.
+*/
+class AccessibleSlideSorterView::Implementation
+ : public SfxListener
+{
+public:
+ Implementation (
+ AccessibleSlideSorterView& rAccessibleSlideSorter,
+ ::sd::slidesorter::SlideSorter& rSlideSorter,
+ vcl::Window* pWindow);
+ virtual ~Implementation() override;
+
+ void RequestUpdateChildren();
+ void Clear();
+ sal_Int32 GetVisibleChildCount() const;
+ AccessibleSlideSorterObject* GetAccessibleChild (sal_Int32 nIndex);
+ AccessibleSlideSorterObject* GetVisibleChild (sal_Int32 nIndex);
+
+ void ConnectListeners();
+ void ReleaseListeners();
+ void Notify (SfxBroadcaster& rBroadcaster, const SfxHint& rHint) override;
+ DECL_LINK(WindowEventListener, VclWindowEvent&, void);
+ DECL_LINK(SelectionChangeListener, LinkParamNone*, void);
+ DECL_LINK(BroadcastSelectionChange, void*, void);
+ DECL_LINK(FocusChangeListener, LinkParamNone*, void);
+ DECL_LINK(VisibilityChangeListener, LinkParamNone*, void);
+ DECL_LINK(UpdateChildrenCallback, void*, void);
+
+ void Activated();
+private:
+ AccessibleSlideSorterView& mrAccessibleSlideSorter;
+ ::sd::slidesorter::SlideSorter& mrSlideSorter;
+ typedef ::std::vector<rtl::Reference<AccessibleSlideSorterObject> > PageObjectList;
+ PageObjectList maPageObjects;
+ sal_Int32 mnFirstVisibleChild;
+ sal_Int32 mnLastVisibleChild;
+ bool mbListeningToDocument;
+ VclPtr<vcl::Window> mpWindow;
+ sal_Int32 mnFocusedIndex;
+ bool mbModelChangeLocked;
+ ImplSVEvent * mnUpdateChildrenUserEventId;
+ ImplSVEvent * mnSelectionChangeUserEventId;
+
+ void UpdateChildren();
+};
+
+//===== AccessibleSlideSorterView =============================================
+
+AccessibleSlideSorterView::AccessibleSlideSorterView(
+ ::sd::slidesorter::SlideSorter& rSlideSorter,
+ vcl::Window* pContentWindow)
+ : AccessibleSlideSorterViewBase(m_aMutex),
+ mrSlideSorter(rSlideSorter),
+ mnClientId(0),
+ mpContentWindow(pContentWindow)
+{
+}
+
+void AccessibleSlideSorterView::Init()
+{
+ mpImpl.reset(new Implementation(*this,mrSlideSorter,mpContentWindow));
+}
+
+AccessibleSlideSorterView::~AccessibleSlideSorterView()
+{
+ Destroyed ();
+}
+
+void AccessibleSlideSorterView::FireAccessibleEvent (
+ short nEventId,
+ const uno::Any& rOldValue,
+ const uno::Any& rNewValue )
+{
+ if (mnClientId != 0)
+ {
+ AccessibleEventObject aEventObject;
+
+ aEventObject.Source = Reference<XWeak>(this);
+ aEventObject.EventId = nEventId;
+ aEventObject.NewValue = rNewValue;
+ aEventObject.OldValue = rOldValue;
+
+ comphelper::AccessibleEventNotifier::addEvent (mnClientId, aEventObject);
+ }
+}
+
+void SAL_CALL AccessibleSlideSorterView::disposing()
+{
+ if (mnClientId != 0)
+ {
+ comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this );
+ mnClientId = 0;
+ }
+ mpImpl.reset();
+}
+
+AccessibleSlideSorterObject* AccessibleSlideSorterView::GetAccessibleChildImplementation (
+ sal_Int32 nIndex)
+{
+ AccessibleSlideSorterObject* pResult = nullptr;
+ ::osl::MutexGuard aGuard (m_aMutex);
+
+ if (nIndex>=0 && nIndex<mpImpl->GetVisibleChildCount())
+ pResult = mpImpl->GetVisibleChild(nIndex);
+
+ return pResult;
+}
+
+void AccessibleSlideSorterView::Destroyed()
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+
+ // Send a disposing to all listeners.
+ if (mnClientId != 0)
+ {
+ comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( mnClientId, *this );
+ mnClientId = 0;
+ }
+}
+
+//===== XAccessible =========================================================
+
+Reference<XAccessibleContext > SAL_CALL
+ AccessibleSlideSorterView::getAccessibleContext()
+{
+ ThrowIfDisposed ();
+ return this;
+}
+
+//===== XAccessibleContext ==================================================
+
+sal_Int32 SAL_CALL AccessibleSlideSorterView::getAccessibleChildCount()
+{
+ ThrowIfDisposed();
+ ::osl::MutexGuard aGuard (m_aMutex);
+ return mpImpl->GetVisibleChildCount();
+}
+
+Reference<XAccessible > SAL_CALL
+ AccessibleSlideSorterView::getAccessibleChild (sal_Int32 nIndex)
+{
+ ThrowIfDisposed();
+ ::osl::MutexGuard aGuard (m_aMutex);
+
+ if (nIndex<0 || nIndex>=mpImpl->GetVisibleChildCount())
+ throw lang::IndexOutOfBoundsException();
+
+ return mpImpl->GetVisibleChild(nIndex);
+}
+
+Reference<XAccessible > SAL_CALL AccessibleSlideSorterView::getAccessibleParent()
+{
+ ThrowIfDisposed();
+ const SolarMutexGuard aSolarGuard;
+ Reference<XAccessible> xParent;
+
+ if (mpContentWindow != nullptr)
+ {
+ vcl::Window* pParent = mpContentWindow->GetAccessibleParentWindow();
+ if (pParent != nullptr)
+ xParent = pParent->GetAccessible();
+ }
+
+ return xParent;
+}
+
+sal_Int32 SAL_CALL AccessibleSlideSorterView::getAccessibleIndexInParent()
+{
+ OSL_ASSERT(getAccessibleParent().is());
+ ThrowIfDisposed();
+ const SolarMutexGuard aSolarGuard;
+ sal_Int32 nIndexInParent(-1);
+
+ Reference<XAccessibleContext> xParentContext (getAccessibleParent()->getAccessibleContext());
+ if (xParentContext.is())
+ {
+ sal_Int32 nChildCount (xParentContext->getAccessibleChildCount());
+ for (sal_Int32 i=0; i<nChildCount; ++i)
+ if (xParentContext->getAccessibleChild(i).get()
+ == static_cast<XAccessible*>(this))
+ {
+ nIndexInParent = i;
+ break;
+ }
+ }
+
+ return nIndexInParent;
+}
+
+sal_Int16 SAL_CALL AccessibleSlideSorterView::getAccessibleRole()
+{
+ ThrowIfDisposed();
+ return AccessibleRole::DOCUMENT;
+}
+
+OUString SAL_CALL AccessibleSlideSorterView::getAccessibleDescription()
+{
+ ThrowIfDisposed();
+ SolarMutexGuard aGuard;
+
+ return SdResId(SID_SD_A11Y_I_SLIDEVIEW_D);
+}
+
+OUString SAL_CALL AccessibleSlideSorterView::getAccessibleName()
+{
+ ThrowIfDisposed();
+ SolarMutexGuard aGuard;
+
+ return SdResId(SID_SD_A11Y_I_SLIDEVIEW_N);
+}
+
+Reference<XAccessibleRelationSet> SAL_CALL
+ AccessibleSlideSorterView::getAccessibleRelationSet()
+{
+ return Reference<XAccessibleRelationSet>();
+}
+
+Reference<XAccessibleStateSet > SAL_CALL
+ AccessibleSlideSorterView::getAccessibleStateSet()
+{
+ ThrowIfDisposed();
+ const SolarMutexGuard aSolarGuard;
+ rtl::Reference<::utl::AccessibleStateSetHelper> pStateSet = new ::utl::AccessibleStateSetHelper();
+
+ pStateSet->AddState(AccessibleStateType::FOCUSABLE);
+ pStateSet->AddState(AccessibleStateType::SELECTABLE);
+ pStateSet->AddState(AccessibleStateType::ENABLED);
+ pStateSet->AddState(AccessibleStateType::ACTIVE);
+ pStateSet->AddState(AccessibleStateType::MULTI_SELECTABLE);
+ pStateSet->AddState(AccessibleStateType::OPAQUE);
+ if (mpContentWindow!=nullptr)
+ {
+ if (mpContentWindow->IsVisible())
+ pStateSet->AddState(AccessibleStateType::VISIBLE);
+ if (mpContentWindow->IsReallyVisible())
+ pStateSet->AddState(AccessibleStateType::SHOWING);
+ }
+
+ return pStateSet;
+}
+
+lang::Locale SAL_CALL AccessibleSlideSorterView::getLocale()
+{
+ ThrowIfDisposed ();
+ Reference<XAccessibleContext> xParentContext;
+ Reference<XAccessible> xParent (getAccessibleParent());
+ if (xParent.is())
+ xParentContext = xParent->getAccessibleContext();
+
+ if (xParentContext.is())
+ return xParentContext->getLocale();
+ else
+ // Strange, no parent! Anyway, return the default locale.
+ return Application::GetSettings().GetLanguageTag().getLocale();
+}
+
+void SAL_CALL AccessibleSlideSorterView::addAccessibleEventListener(
+ const Reference<XAccessibleEventListener >& rxListener)
+{
+ if (!rxListener.is())
+ return;
+
+ const osl::MutexGuard aGuard(m_aMutex);
+
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ uno::Reference<uno::XInterface> x (static_cast<lang::XComponent *>(this), uno::UNO_QUERY);
+ rxListener->disposing (lang::EventObject (x));
+ }
+ else
+ {
+ if ( ! mnClientId)
+ mnClientId = comphelper::AccessibleEventNotifier::registerClient();
+ comphelper::AccessibleEventNotifier::addEventListener(mnClientId, rxListener);
+ }
+}
+
+void SAL_CALL AccessibleSlideSorterView::removeAccessibleEventListener(
+ const Reference<XAccessibleEventListener >& rxListener)
+{
+ ThrowIfDisposed();
+ if (!rxListener.is())
+ return;
+
+ const osl::MutexGuard aGuard(m_aMutex);
+
+ if (mnClientId == 0)
+ return;
+
+ sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener(
+ mnClientId, rxListener );
+ if ( !nListenerCount )
+ {
+ // no listeners anymore -> revoke ourself. This may lead to
+ // the notifier thread dying (if we were the last client),
+ // and at least to us not firing any events anymore, in case
+ // somebody calls NotifyAccessibleEvent, again
+ comphelper::AccessibleEventNotifier::revokeClient( mnClientId );
+ mnClientId = 0;
+ }
+}
+
+//===== XAccessibleComponent ==================================================
+
+sal_Bool SAL_CALL AccessibleSlideSorterView::containsPoint (const awt::Point& aPoint)
+{
+ ThrowIfDisposed();
+ const awt::Rectangle aBBox (getBounds());
+ return (aPoint.X >= 0)
+ && (aPoint.X < aBBox.Width)
+ && (aPoint.Y >= 0)
+ && (aPoint.Y < aBBox.Height);
+}
+
+Reference<XAccessible> SAL_CALL
+ AccessibleSlideSorterView::getAccessibleAtPoint (const awt::Point& aPoint)
+{
+ ThrowIfDisposed();
+ Reference<XAccessible> xAccessible;
+ const SolarMutexGuard aSolarGuard;
+
+ const Point aTestPoint (aPoint.X, aPoint.Y);
+ ::sd::slidesorter::model::SharedPageDescriptor pHitDescriptor (
+ mrSlideSorter.GetController().GetPageAt(aTestPoint));
+ if (pHitDescriptor)
+ xAccessible = mpImpl->GetAccessibleChild(
+ (pHitDescriptor->GetPage()->GetPageNum()-1)/2);
+
+ return xAccessible;
+}
+
+awt::Rectangle SAL_CALL AccessibleSlideSorterView::getBounds()
+{
+ ThrowIfDisposed();
+ const SolarMutexGuard aSolarGuard;
+ awt::Rectangle aBBox;
+
+ if (mpContentWindow != nullptr)
+ {
+ const Point aPosition (mpContentWindow->GetPosPixel());
+ const Size aSize (mpContentWindow->GetOutputSizePixel());
+
+ aBBox.X = aPosition.X();
+ aBBox.Y = aPosition.Y();
+ aBBox.Width = aSize.Width();
+ aBBox.Height = aSize.Height();
+ }
+
+ return aBBox;
+}
+
+awt::Point SAL_CALL AccessibleSlideSorterView::getLocation()
+{
+ ThrowIfDisposed();
+ awt::Point aLocation;
+
+ if (mpContentWindow != nullptr)
+ {
+ const Point aPosition (mpContentWindow->GetPosPixel());
+ aLocation.X = aPosition.X();
+ aLocation.Y = aPosition.Y();
+ }
+
+ return aLocation;
+}
+
+/** Calculate the location on screen from the parent's location on screen
+ and our own relative location.
+*/
+awt::Point SAL_CALL AccessibleSlideSorterView::getLocationOnScreen()
+{
+ ThrowIfDisposed();
+ const SolarMutexGuard aSolarGuard;
+ awt::Point aParentLocationOnScreen;
+
+ Reference<XAccessible> xParent (getAccessibleParent());
+ if (xParent.is())
+ {
+ Reference<XAccessibleComponent> xParentComponent (
+ xParent->getAccessibleContext(), uno::UNO_QUERY);
+ if (xParentComponent.is())
+ aParentLocationOnScreen = xParentComponent->getLocationOnScreen();
+ }
+
+ awt::Point aLocationOnScreen (getLocation());
+ aLocationOnScreen.X += aParentLocationOnScreen.X;
+ aLocationOnScreen.Y += aParentLocationOnScreen.Y;
+
+ return aLocationOnScreen;
+}
+
+awt::Size SAL_CALL AccessibleSlideSorterView::getSize()
+{
+ ThrowIfDisposed();
+ awt::Size aSize;
+
+ if (mpContentWindow != nullptr)
+ {
+ const Size aOutputSize (mpContentWindow->GetOutputSizePixel());
+ aSize.Width = aOutputSize.Width();
+ aSize.Height = aOutputSize.Height();
+ }
+
+ return aSize;
+}
+
+void SAL_CALL AccessibleSlideSorterView::grabFocus()
+{
+ ThrowIfDisposed();
+ const SolarMutexGuard aSolarGuard;
+
+ if (mpContentWindow)
+ mpContentWindow->GrabFocus();
+}
+
+sal_Int32 SAL_CALL AccessibleSlideSorterView::getForeground()
+{
+ ThrowIfDisposed();
+ svtools::ColorConfig aColorConfig;
+ Color nColor = aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor;
+ return static_cast<sal_Int32>(nColor);
+}
+
+sal_Int32 SAL_CALL AccessibleSlideSorterView::getBackground()
+{
+ ThrowIfDisposed();
+ Color nColor = Application::GetSettings().GetStyleSettings().GetWindowColor();
+ return sal_Int32(nColor);
+}
+
+//===== XAccessibleSelection ==================================================
+
+void SAL_CALL AccessibleSlideSorterView::selectAccessibleChild (sal_Int32 nChildIndex)
+{
+ ThrowIfDisposed();
+ const SolarMutexGuard aSolarGuard;
+
+ AccessibleSlideSorterObject* pChild = mpImpl->GetAccessibleChild(nChildIndex);
+ if (pChild == nullptr)
+ throw lang::IndexOutOfBoundsException();
+
+ mrSlideSorter.GetController().GetPageSelector().SelectPage(pChild->GetPageNumber());
+}
+
+sal_Bool SAL_CALL AccessibleSlideSorterView::isAccessibleChildSelected (sal_Int32 nChildIndex)
+{
+ ThrowIfDisposed();
+ bool bIsSelected = false;
+ const SolarMutexGuard aSolarGuard;
+
+ AccessibleSlideSorterObject* pChild = mpImpl->GetAccessibleChild(nChildIndex);
+ if (pChild == nullptr)
+ throw lang::IndexOutOfBoundsException();
+
+ bIsSelected = mrSlideSorter.GetController().GetPageSelector().IsPageSelected(
+ pChild->GetPageNumber());
+
+ return bIsSelected;
+}
+
+void SAL_CALL AccessibleSlideSorterView::clearAccessibleSelection()
+{
+ ThrowIfDisposed();
+ const SolarMutexGuard aSolarGuard;
+
+ mrSlideSorter.GetController().GetPageSelector().DeselectAllPages();
+}
+
+void SAL_CALL AccessibleSlideSorterView::selectAllAccessibleChildren()
+{
+ ThrowIfDisposed();
+ const SolarMutexGuard aSolarGuard;
+
+ mrSlideSorter.GetController().GetPageSelector().SelectAllPages();
+}
+
+sal_Int32 SAL_CALL AccessibleSlideSorterView::getSelectedAccessibleChildCount()
+{
+ ThrowIfDisposed ();
+ const SolarMutexGuard aSolarGuard;
+ return mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount();
+}
+
+Reference<XAccessible > SAL_CALL
+ AccessibleSlideSorterView::getSelectedAccessibleChild (sal_Int32 nSelectedChildIndex )
+{
+ ThrowIfDisposed ();
+ const SolarMutexGuard aSolarGuard;
+ Reference<XAccessible> xChild;
+
+ ::sd::slidesorter::controller::PageSelector& rSelector (
+ mrSlideSorter.GetController().GetPageSelector());
+ sal_Int32 nPageCount(rSelector.GetPageCount());
+ sal_Int32 nSelectedCount = 0;
+ for (sal_Int32 i=0; i<nPageCount; i++)
+ if (rSelector.IsPageSelected(i))
+ {
+ if (nSelectedCount == nSelectedChildIndex)
+ {
+ xChild = mpImpl->GetAccessibleChild(i);
+ break;
+ }
+ ++nSelectedCount;
+ }
+
+ if ( ! xChild.is() )
+ throw lang::IndexOutOfBoundsException();
+
+ return xChild;
+}
+
+void SAL_CALL AccessibleSlideSorterView::deselectAccessibleChild (sal_Int32 nChildIndex)
+{
+ ThrowIfDisposed();
+ const SolarMutexGuard aSolarGuard;
+
+ AccessibleSlideSorterObject* pChild = mpImpl->GetAccessibleChild(nChildIndex);
+ if (pChild == nullptr)
+ throw lang::IndexOutOfBoundsException();
+
+ mrSlideSorter.GetController().GetPageSelector().DeselectPage(pChild->GetPageNumber());
+}
+
+// XServiceInfo
+OUString SAL_CALL
+ AccessibleSlideSorterView::getImplementationName()
+{
+ return "AccessibleSlideSorterView";
+}
+
+sal_Bool SAL_CALL AccessibleSlideSorterView::supportsService (const OUString& sServiceName)
+{
+ return cppu::supportsService(this, sServiceName);
+}
+
+uno::Sequence< OUString> SAL_CALL
+ AccessibleSlideSorterView::getSupportedServiceNames()
+{
+ ThrowIfDisposed ();
+
+ return uno::Sequence<OUString> {
+ OUString("com.sun.star.accessibility.Accessible"),
+ OUString("com.sun.star.accessibility.AccessibleContext"),
+ OUString("com.sun.star.drawing.AccessibleSlideSorterView")
+ };
+}
+
+void AccessibleSlideSorterView::ThrowIfDisposed()
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ SAL_WARN("sd", "Calling disposed object. Throwing exception:");
+ throw lang::DisposedException ("object has been already disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+//===== AccessibleSlideSorterView::Implementation =============================
+
+AccessibleSlideSorterView::Implementation::Implementation (
+ AccessibleSlideSorterView& rAccessibleSlideSorter,
+ ::sd::slidesorter::SlideSorter& rSlideSorter,
+ vcl::Window* pWindow)
+ : mrAccessibleSlideSorter(rAccessibleSlideSorter),
+ mrSlideSorter(rSlideSorter),
+ mnFirstVisibleChild(0),
+ mnLastVisibleChild(-1),
+ mbListeningToDocument(false),
+ mpWindow(pWindow),
+ mnFocusedIndex(-1),
+ mbModelChangeLocked(false),
+ mnUpdateChildrenUserEventId(nullptr),
+ mnSelectionChangeUserEventId(nullptr)
+{
+ ConnectListeners();
+ UpdateChildren();
+}
+
+AccessibleSlideSorterView::Implementation::~Implementation()
+{
+ if (mnUpdateChildrenUserEventId != nullptr)
+ Application::RemoveUserEvent(mnUpdateChildrenUserEventId);
+ if (mnSelectionChangeUserEventId != nullptr)
+ Application::RemoveUserEvent(mnSelectionChangeUserEventId);
+ ReleaseListeners();
+ Clear();
+}
+
+void AccessibleSlideSorterView::Implementation::RequestUpdateChildren()
+{
+ if (mnUpdateChildrenUserEventId == nullptr)
+ mnUpdateChildrenUserEventId = Application::PostUserEvent(
+ LINK(this, AccessibleSlideSorterView::Implementation,
+ UpdateChildrenCallback));
+}
+
+void AccessibleSlideSorterView::Implementation::UpdateChildren()
+{
+ //By default, all children should be accessible. So here workaround is to make all children visible.
+ // MT: This was in UpdateVisibility, which has some similarity, and hg merge automatically has put it here. Correct?!
+ // In the IA2 CWS, also setting mnFirst/LastVisibleChild was commented out!
+ mnLastVisibleChild = maPageObjects.size();
+
+ if (mbModelChangeLocked)
+ {
+ // Do nothing right now. When the flag is reset, this method is
+ // called again.
+ return;
+ }
+
+ const Range aRange (mrSlideSorter.GetView().GetVisiblePageRange());
+ mnFirstVisibleChild = aRange.Min();
+ mnLastVisibleChild = aRange.Max();
+
+ // Release all children.
+ Clear();
+
+ // Create new children for the modified visible range.
+ maPageObjects.resize(mrSlideSorter.GetModel().GetPageCount());
+
+ // No Visible children
+ if (mnFirstVisibleChild == -1 && mnLastVisibleChild == -1)
+ return;
+
+ for (sal_Int32 nIndex(mnFirstVisibleChild); nIndex<=mnLastVisibleChild; ++nIndex)
+ GetAccessibleChild(nIndex);
+}
+
+void AccessibleSlideSorterView::Implementation::Clear()
+{
+ for (auto& rxPageObject : maPageObjects)
+ if (rxPageObject != nullptr)
+ {
+ mrAccessibleSlideSorter.FireAccessibleEvent(
+ AccessibleEventId::CHILD,
+ Any(Reference<XAccessible>(rxPageObject)),
+ Any());
+
+ Reference<XComponent> xComponent (Reference<XWeak>(rxPageObject), UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+ rxPageObject = nullptr;
+ }
+ maPageObjects.clear();
+}
+
+sal_Int32 AccessibleSlideSorterView::Implementation::GetVisibleChildCount() const
+{
+ if (mnFirstVisibleChild<=mnLastVisibleChild && mnFirstVisibleChild>=0)
+ return mnLastVisibleChild - mnFirstVisibleChild + 1;
+ else
+ return 0;
+}
+
+AccessibleSlideSorterObject* AccessibleSlideSorterView::Implementation::GetVisibleChild (
+ sal_Int32 nIndex)
+{
+ assert(nIndex>=0 && nIndex<GetVisibleChildCount());
+
+ return GetAccessibleChild(nIndex+mnFirstVisibleChild);
+}
+
+AccessibleSlideSorterObject* AccessibleSlideSorterView::Implementation::GetAccessibleChild (
+ sal_Int32 nIndex)
+{
+ AccessibleSlideSorterObject* pChild = nullptr;
+
+ if (nIndex>=0 && o3tl::make_unsigned(nIndex)<maPageObjects.size())
+ {
+ if (maPageObjects[nIndex] == nullptr)
+ {
+ ::sd::slidesorter::model::SharedPageDescriptor pDescriptor(
+ mrSlideSorter.GetModel().GetPageDescriptor(nIndex));
+ if (pDescriptor)
+ {
+ maPageObjects[nIndex] = new AccessibleSlideSorterObject(
+ &mrAccessibleSlideSorter,
+ mrSlideSorter,
+ (pDescriptor->GetPage()->GetPageNum()-1)/2);
+
+ mrAccessibleSlideSorter.FireAccessibleEvent(
+ AccessibleEventId::CHILD,
+ Any(),
+ Any(Reference<XAccessible>(maPageObjects[nIndex])));
+ }
+
+ }
+
+ pChild = maPageObjects[nIndex].get();
+ }
+ else
+ {
+ OSL_ASSERT(nIndex>=0 && o3tl::make_unsigned(nIndex)<maPageObjects.size());
+ }
+
+ return pChild;
+}
+
+void AccessibleSlideSorterView::Implementation::ConnectListeners()
+{
+ StartListening (*mrSlideSorter.GetModel().GetDocument());
+ if (mrSlideSorter.GetViewShell() != nullptr)
+ StartListening (*mrSlideSorter.GetViewShell());
+ mbListeningToDocument = true;
+
+ if (mpWindow != nullptr)
+ mpWindow->AddEventListener(
+ LINK(this,AccessibleSlideSorterView::Implementation,WindowEventListener));
+
+ mrSlideSorter.GetController().GetSelectionManager()->AddSelectionChangeListener(
+ LINK(this,AccessibleSlideSorterView::Implementation,SelectionChangeListener));
+ mrSlideSorter.GetController().GetFocusManager().AddFocusChangeListener(
+ LINK(this,AccessibleSlideSorterView::Implementation,FocusChangeListener));
+ mrSlideSorter.GetView().AddVisibilityChangeListener(
+ LINK(this,AccessibleSlideSorterView::Implementation,VisibilityChangeListener));
+}
+
+void AccessibleSlideSorterView::Implementation::ReleaseListeners()
+{
+ mrSlideSorter.GetController().GetFocusManager().RemoveFocusChangeListener(
+ LINK(this,AccessibleSlideSorterView::Implementation,FocusChangeListener));
+ mrSlideSorter.GetController().GetSelectionManager()->RemoveSelectionChangeListener(
+ LINK(this,AccessibleSlideSorterView::Implementation,SelectionChangeListener));
+ mrSlideSorter.GetView().RemoveVisibilityChangeListener(
+ LINK(this,AccessibleSlideSorterView::Implementation,VisibilityChangeListener));
+
+ if (mpWindow != nullptr)
+ mpWindow->RemoveEventListener(
+ LINK(this,AccessibleSlideSorterView::Implementation,WindowEventListener));
+
+ if (mbListeningToDocument)
+ {
+ if (mrSlideSorter.GetViewShell() != nullptr && !IsListening(*mrSlideSorter.GetViewShell()))
+ { // ??? is it even possible that ConnectListeners is called with no
+ // view shell and this one with a view shell?
+ StartListening(*mrSlideSorter.GetViewShell());
+ }
+ EndListening (*mrSlideSorter.GetModel().GetDocument());
+ mbListeningToDocument = false;
+ }
+}
+
+void AccessibleSlideSorterView::Implementation::Notify (
+ SfxBroadcaster&,
+ const SfxHint& rHint)
+{
+ if (rHint.GetId() == SfxHintId::ThisIsAnSdrHint)
+ {
+ const SdrHint* pSdrHint = static_cast<const SdrHint*>(&rHint);
+ switch (pSdrHint->GetKind())
+ {
+ case SdrHintKind::PageOrderChange:
+ RequestUpdateChildren();
+ break;
+ default:
+ break;
+ }
+ }
+ else if (auto pViewShellHint = dynamic_cast<const sd::ViewShellHint*>(&rHint))
+ {
+ switch (pViewShellHint->GetHintId())
+ {
+ case sd::ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_START:
+ mbModelChangeLocked = true;
+ break;
+
+ case sd::ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_END:
+ mbModelChangeLocked = false;
+ RequestUpdateChildren();
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+void AccessibleSlideSorterView::SwitchViewActivated()
+{
+ // Firstly, set focus to view
+ FireAccessibleEvent(AccessibleEventId::STATE_CHANGED,
+ Any(),
+ Any(AccessibleStateType::FOCUSED));
+
+ mpImpl->Activated();
+}
+
+void AccessibleSlideSorterView::Implementation::Activated()
+{
+ mrSlideSorter.GetController().GetFocusManager().ShowFocus();
+
+}
+
+IMPL_LINK(AccessibleSlideSorterView::Implementation, WindowEventListener, VclWindowEvent&, rEvent, void)
+{
+ switch (rEvent.GetId())
+ {
+ case VclEventId::WindowMove:
+ case VclEventId::WindowResize:
+ RequestUpdateChildren();
+ break;
+
+ case VclEventId::WindowGetFocus:
+ case VclEventId::WindowLoseFocus:
+ mrAccessibleSlideSorter.FireAccessibleEvent(
+ AccessibleEventId::SELECTION_CHANGED,
+ Any(),
+ Any());
+ break;
+ default:
+ break;
+ }
+}
+
+IMPL_LINK_NOARG(AccessibleSlideSorterView::Implementation, SelectionChangeListener, LinkParamNone*, void)
+{
+ if (mnSelectionChangeUserEventId == nullptr)
+ mnSelectionChangeUserEventId = Application::PostUserEvent(
+ LINK(this, AccessibleSlideSorterView::Implementation, BroadcastSelectionChange));
+}
+
+IMPL_LINK_NOARG(AccessibleSlideSorterView::Implementation, BroadcastSelectionChange, void*, void)
+{
+ mnSelectionChangeUserEventId = nullptr;
+ mrAccessibleSlideSorter.FireAccessibleEvent(
+ AccessibleEventId::SELECTION_CHANGED,
+ Any(),
+ Any());
+}
+
+IMPL_LINK_NOARG(AccessibleSlideSorterView::Implementation, FocusChangeListener, LinkParamNone*, void)
+{
+ sal_Int32 nNewFocusedIndex (
+ mrSlideSorter.GetController().GetFocusManager().GetFocusedPageIndex());
+
+ bool bHasFocus = mrSlideSorter.GetController().GetFocusManager().IsFocusShowing();
+ if (!bHasFocus)
+ nNewFocusedIndex = -1;
+
+ // add a checker whether the focus event is sent out. Only after sent, the mnFocusedIndex should be updated.
+ bool bSentFocus = false;
+ if (nNewFocusedIndex == mnFocusedIndex)
+ return;
+
+ if (mnFocusedIndex >= 0)
+ {
+ AccessibleSlideSorterObject* pObject = GetAccessibleChild(mnFocusedIndex);
+ if (pObject != nullptr)
+ {
+ pObject->FireAccessibleEvent(
+ AccessibleEventId::STATE_CHANGED,
+ Any(AccessibleStateType::FOCUSED),
+ Any());
+ bSentFocus = true;
+ }
+ }
+ if (nNewFocusedIndex >= 0)
+ {
+ AccessibleSlideSorterObject* pObject = GetAccessibleChild(nNewFocusedIndex);
+ if (pObject != nullptr)
+ {
+ pObject->FireAccessibleEvent(
+ AccessibleEventId::STATE_CHANGED,
+ Any(),
+ Any(AccessibleStateType::FOCUSED));
+ bSentFocus = true;
+ }
+ }
+ if (bSentFocus)
+ mnFocusedIndex = nNewFocusedIndex;
+}
+
+IMPL_LINK_NOARG(AccessibleSlideSorterView::Implementation, UpdateChildrenCallback, void*, void)
+{
+ mnUpdateChildrenUserEventId = nullptr;
+ UpdateChildren();
+}
+
+IMPL_LINK_NOARG(AccessibleSlideSorterView::Implementation, VisibilityChangeListener, LinkParamNone*, void)
+{
+ UpdateChildren();
+}
+
+} // end of namespace ::accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/accessibility/AccessibleViewForwarder.cxx b/sd/source/ui/accessibility/AccessibleViewForwarder.cxx
new file mode 100644
index 000000000..09225e27f
--- /dev/null
+++ b/sd/source/ui/accessibility/AccessibleViewForwarder.cxx
@@ -0,0 +1,104 @@
+/* -*- 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 <AccessibleViewForwarder.hxx>
+#include <svx/svdpntv.hxx>
+#include <vcl/window.hxx>
+#include <svx/sdrpaintwindow.hxx>
+#include <osl/diagnose.h>
+
+namespace accessibility
+{
+/** For the time being, the implementation of this class will not use the
+ member mrDevice. Instead the device is retrieved from the view
+ every time it is used. This is necessary because the device has to stay
+ up-to-date with the current view and the class has to stay compatible.
+ May change in the future.
+*/
+
+AccessibleViewForwarder::AccessibleViewForwarder(SdrPaintView* pView, const OutputDevice& rDevice)
+ : mpView(pView)
+ , mnWindowId(0)
+{
+ // Search the output device to determine its id.
+ for (sal_uInt32 a(0); a < mpView->PaintWindowCount(); a++)
+ {
+ SdrPaintWindow* pPaintWindow = mpView->GetPaintWindow(a);
+ OutputDevice& rOutDev = pPaintWindow->GetOutputDevice();
+
+ if (&rOutDev == &rDevice)
+ {
+ mnWindowId = static_cast<sal_uInt16>(a);
+ break;
+ }
+ }
+}
+
+AccessibleViewForwarder::~AccessibleViewForwarder()
+{
+ // empty
+}
+
+::tools::Rectangle AccessibleViewForwarder::GetVisibleArea() const
+{
+ ::tools::Rectangle aVisibleArea;
+
+ if (static_cast<sal_uInt32>(mnWindowId) < mpView->PaintWindowCount())
+ {
+ SdrPaintWindow* pPaintWindow = mpView->GetPaintWindow(static_cast<sal_uInt32>(mnWindowId));
+ aVisibleArea = pPaintWindow->GetVisibleArea();
+ }
+
+ return aVisibleArea;
+}
+
+/** Transform the given point into pixel coordinates. After the pixel
+ coordinates of the window origin are added to make the point coordinates
+ absolute.
+*/
+Point AccessibleViewForwarder::LogicToPixel(const Point& rPoint) const
+{
+ OSL_ASSERT(mpView != nullptr);
+ if (static_cast<sal_uInt32>(mnWindowId) < mpView->PaintWindowCount())
+ {
+ SdrPaintWindow* pPaintWindow = mpView->GetPaintWindow(static_cast<sal_uInt32>(mnWindowId));
+ OutputDevice& rOutDev = pPaintWindow->GetOutputDevice();
+ ::tools::Rectangle aBBox(rOutDev.GetOwnerWindow()->GetWindowExtentsRelative(nullptr));
+ return rOutDev.LogicToPixel(rPoint) + aBBox.TopLeft();
+ }
+ else
+ return Point();
+}
+
+Size AccessibleViewForwarder::LogicToPixel(const Size& rSize) const
+{
+ OSL_ASSERT(mpView != nullptr);
+ if (static_cast<sal_uInt32>(mnWindowId) < mpView->PaintWindowCount())
+ {
+ SdrPaintWindow* pPaintWindow = mpView->GetPaintWindow(static_cast<sal_uInt32>(mnWindowId));
+ OutputDevice& rOutDev = pPaintWindow->GetOutputDevice();
+ return rOutDev.LogicToPixel(rSize);
+ }
+ else
+ return Size();
+}
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/accessibility/SdShapeTypes.cxx b/sd/source/ui/accessibility/SdShapeTypes.cxx
new file mode 100644
index 000000000..7fab0961e
--- /dev/null
+++ b/sd/source/ui/accessibility/SdShapeTypes.cxx
@@ -0,0 +1,132 @@
+/* -*- 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 <svx/ShapeTypeHandler.hxx>
+#include <SdShapeTypes.hxx>
+#include <AccessiblePresentationShape.hxx>
+#include <AccessiblePresentationGraphicShape.hxx>
+#include <AccessiblePresentationOLEShape.hxx>
+
+namespace accessibility {
+
+static rtl::Reference<AccessibleShape>
+ CreateSdAccessibleShape (
+ const AccessibleShapeInfo& rShapeInfo,
+ const AccessibleShapeTreeInfo& rShapeTreeInfo,
+ ShapeTypeId nId)
+{
+ switch (nId)
+ {
+ case PRESENTATION_TITLE:
+ case PRESENTATION_OUTLINER:
+ case PRESENTATION_SUBTITLE:
+ case PRESENTATION_PAGE:
+ case PRESENTATION_NOTES:
+ case PRESENTATION_HANDOUT:
+ case PRESENTATION_HEADER:
+ case PRESENTATION_FOOTER:
+ case PRESENTATION_DATETIME:
+ case PRESENTATION_PAGENUMBER:
+ return new AccessiblePresentationShape (rShapeInfo, rShapeTreeInfo);
+
+ case PRESENTATION_GRAPHIC_OBJECT:
+ return new AccessiblePresentationGraphicShape (rShapeInfo, rShapeTreeInfo);
+
+ case PRESENTATION_OLE:
+ case PRESENTATION_CHART:
+ case PRESENTATION_TABLE:
+ return new AccessiblePresentationOLEShape (rShapeInfo, rShapeTreeInfo);
+
+ default:
+ return new AccessibleShape (rShapeInfo, rShapeTreeInfo);
+ }
+}
+
+void RegisterImpressShapeTypes()
+{
+ /** List of shape type descriptors corresponding to the
+ <type>SdShapeTypes</type> enum.
+ */
+ ShapeTypeDescriptor aSdShapeTypeList[] = {
+ ShapeTypeDescriptor (
+ PRESENTATION_OUTLINER,
+ "com.sun.star.presentation.OutlinerShape",
+ CreateSdAccessibleShape ),
+ ShapeTypeDescriptor (
+ PRESENTATION_SUBTITLE,
+ "com.sun.star.presentation.SubtitleShape",
+ CreateSdAccessibleShape ),
+ ShapeTypeDescriptor (
+ PRESENTATION_GRAPHIC_OBJECT,
+ "com.sun.star.presentation.GraphicObjectShape",
+ CreateSdAccessibleShape ),
+ ShapeTypeDescriptor (
+ PRESENTATION_PAGE,
+ "com.sun.star.presentation.PageShape",
+ CreateSdAccessibleShape ),
+ ShapeTypeDescriptor (
+ PRESENTATION_OLE,
+ "com.sun.star.presentation.OLE2Shape",
+ CreateSdAccessibleShape ),
+ ShapeTypeDescriptor (
+ PRESENTATION_CHART,
+ "com.sun.star.presentation.ChartShape",
+ CreateSdAccessibleShape ),
+ ShapeTypeDescriptor (
+ PRESENTATION_TABLE,
+ "com.sun.star.presentation.TableShape",
+ CreateSdAccessibleShape ),
+ ShapeTypeDescriptor (
+ PRESENTATION_NOTES,
+ "com.sun.star.presentation.NotesShape",
+ CreateSdAccessibleShape ),
+ ShapeTypeDescriptor (
+ PRESENTATION_TITLE,
+ "com.sun.star.presentation.TitleTextShape",
+ CreateSdAccessibleShape ),
+ ShapeTypeDescriptor (
+ PRESENTATION_HANDOUT,
+ "com.sun.star.presentation.HandoutShape",
+ CreateSdAccessibleShape ),
+ ShapeTypeDescriptor (
+ PRESENTATION_HEADER,
+ "com.sun.star.presentation.HeaderShape",
+ CreateSdAccessibleShape ),
+ ShapeTypeDescriptor (
+ PRESENTATION_FOOTER,
+ "com.sun.star.presentation.FooterShape",
+ CreateSdAccessibleShape ),
+ ShapeTypeDescriptor (
+ PRESENTATION_DATETIME,
+ "com.sun.star.presentation.DateTimeShape",
+ CreateSdAccessibleShape ),
+ ShapeTypeDescriptor (
+ PRESENTATION_PAGENUMBER,
+ "com.sun.star.presentation.SlideNumberShape",
+ CreateSdAccessibleShape )
+ };
+
+ ShapeTypeHandler::Instance().AddShapeTypeList (
+ PRESENTATION_PAGENUMBER - PRESENTATION_OUTLINER + 1,
+ aSdShapeTypeList);
+}
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/animations/CustomAnimationDialog.cxx b/sd/source/ui/animations/CustomAnimationDialog.cxx
new file mode 100644
index 000000000..7490a62c5
--- /dev/null
+++ b/sd/source/ui/animations/CustomAnimationDialog.cxx
@@ -0,0 +1,2090 @@
+/* -*- 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 <config_features.h>
+
+#include <com/sun/star/presentation/EffectNodeType.hpp>
+#include <com/sun/star/animations/Timing.hpp>
+#include <com/sun/star/animations/Event.hpp>
+#include <com/sun/star/animations/EventTrigger.hpp>
+#include <com/sun/star/animations/AnimationFill.hpp>
+#include <com/sun/star/presentation/TextAnimationType.hpp>
+#include <com/sun/star/animations/ValuePair.hpp>
+#include <com/sun/star/awt/FontSlant.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
+#include <com/sun/star/awt/FontUnderline.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/media/XPlayer.hpp>
+
+#include <memory>
+
+#include <comphelper/lok.hxx>
+#include <i18nutil/unicode.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/stdtext.hxx>
+#include <vcl/weld.hxx>
+#include <vcl/settings.hxx>
+
+#include <svtools/ctrltool.hxx>
+#include <sfx2/objsh.hxx>
+#include <sfx2/viewsh.hxx>
+#include <tools/debug.hxx>
+#include <tools/urlobj.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <editeng/flstitem.hxx>
+
+#include <svx/colorbox.hxx>
+#include <svx/gallery.hxx>
+
+#include <editeng/editids.hrc>
+#include <sdresid.hxx>
+
+#include "CustomAnimationDialog.hxx"
+#include <CustomAnimationPane.hxx>
+#include "STLPropertySet.hxx"
+#include <CustomAnimationPreset.hxx>
+
+#include <avmedia/mediawindow.hxx>
+
+#include <filedlg.hxx>
+#include <strings.hrc>
+#include <helpids.h>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::animations;
+using namespace ::com::sun::star::presentation;
+
+using ::com::sun::star::uno::UNO_QUERY;
+using ::com::sun::star::uno::Any;
+using ::com::sun::star::uno::Sequence;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::Exception;
+using ::com::sun::star::drawing::XShape;
+using ::com::sun::star::drawing::XDrawPage;
+using ::com::sun::star::beans::XPropertySet;
+
+namespace sd {
+
+SdPropertySubControl::SdPropertySubControl(weld::Container* pParent)
+ : mxBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/customanimationfragment.ui",
+ false, reinterpret_cast<sal_uInt64>(SfxViewShell::Current())))
+ , mxContainer(mxBuilder->weld_container("EffectFragment"))
+ , mpParent(pParent)
+{
+}
+
+SdPropertySubControl::~SdPropertySubControl()
+{
+ mpParent->move(mxContainer.get(), nullptr);
+}
+
+namespace {
+
+class SdPresetPropertyBox : public SdPropertySubControl
+{
+public:
+ SdPresetPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const OUString& aPresetId, const Link<LinkParamNone*,void>& rModifyHdl);
+
+ virtual Any getValue() override;
+ virtual void setValue( const Any& rValue, const OUString& rPresetId ) override;
+
+private:
+ std::vector<OUString> maPropertyValues;
+ Link<LinkParamNone*,void> maModifyLink;
+ std::unique_ptr<weld::ComboBox> mxControl;
+
+ DECL_LINK(OnSelect, weld::ComboBox&, void);
+};
+
+}
+
+SdPresetPropertyBox::SdPresetPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const OUString& aPresetId, const Link<LinkParamNone*,void>& rModifyHdl)
+ : SdPropertySubControl(pParent)
+ , maModifyLink(rModifyHdl)
+ , mxControl(mxBuilder->weld_combo_box("combo"))
+{
+ mxControl->connect_changed(LINK(this, SdPresetPropertyBox, OnSelect));
+ mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_PRESETPROPERTYBOX);
+ mxControl->show();
+ pLabel->set_mnemonic_widget(mxControl.get());
+ setValue(rValue, aPresetId);
+}
+
+IMPL_LINK_NOARG(SdPresetPropertyBox, OnSelect, weld::ComboBox&, void)
+{
+ maModifyLink.Call(nullptr);
+}
+
+void SdPresetPropertyBox::setValue( const Any& rValue, const OUString& rPresetId )
+{
+ if (!mxControl)
+ return;
+
+ mxControl->freeze();
+ mxControl->clear();
+ maPropertyValues.clear();
+ int nPos = -1;
+
+ const CustomAnimationPresets& rPresets = CustomAnimationPresets::getCustomAnimationPresets();
+ CustomAnimationPresetPtr pDescriptor = rPresets.getEffectDescriptor( rPresetId );
+ if( pDescriptor )
+ {
+
+ OUString aPropertyValue;
+ rValue >>= aPropertyValue;
+
+ std::vector<OUString> aSubTypes( pDescriptor->getSubTypes() );
+
+ mxControl->set_sensitive(!aSubTypes.empty());
+
+ for( const auto& aSubType : aSubTypes )
+ {
+ mxControl->append_text(rPresets.getUINameForProperty(aSubType));
+ maPropertyValues.push_back(aSubType);
+ if (aSubType == aPropertyValue)
+ nPos = maPropertyValues.size() - 1;
+ }
+ }
+ else
+ {
+ mxControl->set_sensitive(false);
+ }
+ mxControl->thaw();
+ if (nPos != -1)
+ mxControl->set_active(nPos);
+}
+
+Any SdPresetPropertyBox::getValue()
+{
+ const int nIndex = mxControl->get_active();
+ if (nIndex == -1)
+ return Any();
+ return Any(maPropertyValues[nIndex]);
+}
+
+namespace {
+
+class SdColorPropertyBox : public SdPropertySubControl
+{
+public:
+ SdColorPropertyBox(weld::Label* pLabel, weld::Container* pParent, weld::Window* pTopLevel, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl);
+
+ virtual Any getValue() override;
+ virtual void setValue( const Any& rValue, const OUString& rPresetId ) override;
+
+private:
+ Link<LinkParamNone*,void> maModifyLink;
+ std::unique_ptr<ColorListBox> mxControl;
+
+ DECL_LINK(OnSelect, ColorListBox&, void);
+};
+
+}
+
+SdColorPropertyBox::SdColorPropertyBox(weld::Label* pLabel, weld::Container* pParent, weld::Window* pTopLevel, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl)
+ : SdPropertySubControl(pParent)
+ , maModifyLink(rModifyHdl)
+ , mxControl(new ColorListBox(mxBuilder->weld_menu_button("color"), [pTopLevel]{ return pTopLevel; }))
+{
+ mxControl->SetSelectHdl(LINK(this, SdColorPropertyBox, OnSelect));
+ mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_COLORPROPERTYBOX);
+ pLabel->set_mnemonic_widget(&mxControl->get_widget());
+ mxControl->show();
+
+ Color nColor;
+ rValue >>= nColor;
+ mxControl->SelectEntry(nColor);
+}
+
+IMPL_LINK_NOARG(SdColorPropertyBox, OnSelect, ColorListBox&, void)
+{
+ maModifyLink.Call(nullptr);
+}
+
+void SdColorPropertyBox::setValue( const Any& rValue, const OUString& )
+{
+ if (mxControl)
+ {
+ Color nColor;
+ rValue >>= nColor;
+
+ mxControl->SetNoSelection();
+ mxControl->SelectEntry(nColor);
+ }
+}
+
+Any SdColorPropertyBox::getValue()
+{
+ return Any(sal_Int32(mxControl->GetSelectEntryColor().GetRGBColor()));
+}
+
+namespace {
+
+class SdFontPropertyBox : public SdPropertySubControl
+{
+public:
+ SdFontPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl);
+
+ virtual Any getValue() override;
+ virtual void setValue(const Any& rValue, const OUString& rPresetId) override;
+
+private:
+ Link<LinkParamNone*,void> maModifyHdl;
+ std::unique_ptr<weld::ComboBox> mxControl;
+
+ DECL_LINK(ControlSelectHdl, weld::ComboBox&, void);
+};
+
+}
+
+SdFontPropertyBox::SdFontPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl)
+ : SdPropertySubControl(pParent)
+ , maModifyHdl(rModifyHdl)
+ , mxControl(mxBuilder->weld_combo_box("fontname"))
+{
+ mxControl->connect_changed(LINK(this, SdFontPropertyBox, ControlSelectHdl));
+ mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_FONTPROPERTYBOX);
+ mxControl->show();
+ pLabel->set_mnemonic_widget(mxControl.get());
+
+ const FontList* pFontList = nullptr;
+ bool bMustDelete = false;
+
+ if (SfxObjectShell* pDocSh = SfxObjectShell::Current())
+ {
+ auto pItem = pDocSh->GetItem( SID_ATTR_CHAR_FONTLIST );
+ if (pItem)
+ pFontList = static_cast<const SvxFontListItem*>(pItem)->GetFontList();
+ }
+
+ if (!pFontList)
+ {
+ pFontList = new FontList(Application::GetDefaultDevice(), nullptr);
+ bMustDelete = true;
+ }
+
+ mxControl->freeze();
+
+ sal_uInt16 nFontCount = pFontList->GetFontNameCount();
+ for (sal_uInt16 i = 0; i < nFontCount; ++i)
+ {
+ const FontMetric& rFontMetric = pFontList->GetFontName(i);
+ mxControl->append_text(rFontMetric.GetFamilyName());
+ }
+
+ mxControl->thaw();
+
+ if( bMustDelete )
+ delete pFontList;
+
+ setValue( rValue, OUString() );
+}
+
+IMPL_LINK_NOARG(SdFontPropertyBox, ControlSelectHdl, weld::ComboBox&, void)
+{
+ maModifyHdl.Call(nullptr);
+}
+
+void SdFontPropertyBox::setValue( const Any& rValue, const OUString& )
+{
+ if (mxControl)
+ {
+ OUString aFontName;
+ rValue >>= aFontName;
+ mxControl->set_entry_text(aFontName);
+ }
+}
+
+Any SdFontPropertyBox::getValue()
+{
+ OUString aFontName(mxControl->get_active_text());
+ return Any(aFontName);
+}
+
+namespace {
+
+class SdCharHeightPropertyBox : public SdPropertySubControl
+{
+public:
+ SdCharHeightPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl);
+
+ virtual Any getValue() override;
+ virtual void setValue( const Any& rValue, const OUString& ) override;
+
+ DECL_LINK(implMenuSelectHdl, const OString& rIdent, void);
+
+private:
+ Link<LinkParamNone*,void> maModifyHdl;
+ std::unique_ptr<weld::MetricSpinButton> mxMetric;
+ std::unique_ptr<weld::MenuButton> mxControl;
+
+ DECL_LINK(EditModifyHdl, weld::MetricSpinButton&, void);
+};
+
+}
+
+SdCharHeightPropertyBox::SdCharHeightPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl)
+ : SdPropertySubControl(pParent)
+ , maModifyHdl(rModifyHdl)
+ , mxMetric(mxBuilder->weld_metric_spin_button("fontsize", FieldUnit::PERCENT))
+ , mxControl(mxBuilder->weld_menu_button("fontsizemenu"))
+{
+ mxMetric->connect_value_changed(LINK(this, SdCharHeightPropertyBox, EditModifyHdl));
+ mxMetric->set_help_id(HID_SD_CUSTOMANIMATIONPANE_CHARHEIGHTPROPERTYBOX);
+ mxMetric->show();
+ pLabel->set_mnemonic_widget(&mxMetric->get_widget());
+
+ mxControl->connect_selected(LINK(this, SdCharHeightPropertyBox, implMenuSelectHdl));
+ mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_CHARHEIGHTPROPERTYBOX);
+ mxControl->show();
+
+ setValue(rValue, OUString());
+}
+
+IMPL_LINK_NOARG(SdCharHeightPropertyBox, EditModifyHdl, weld::MetricSpinButton&, void)
+{
+ maModifyHdl.Call(nullptr);
+}
+
+IMPL_LINK(SdCharHeightPropertyBox, implMenuSelectHdl, const OString&, rIdent, void)
+{
+ sal_Int32 nValue = rIdent.toInt32();
+ mxMetric->set_value(nValue, FieldUnit::PERCENT);
+ EditModifyHdl(*mxMetric);
+}
+
+void SdCharHeightPropertyBox::setValue( const Any& rValue, const OUString& )
+{
+ if (mxMetric)
+ {
+ double fValue = 0.0;
+ rValue >>= fValue;
+ mxMetric->set_value(static_cast<::tools::Long>(fValue * 100.0), FieldUnit::PERCENT);
+ }
+}
+
+Any SdCharHeightPropertyBox::getValue()
+{
+ return Any(static_cast<double>(mxMetric->get_value(FieldUnit::PERCENT)) / 100.0);
+}
+
+namespace {
+
+class SdTransparencyPropertyBox : public SdPropertySubControl
+{
+public:
+ SdTransparencyPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl);
+
+ virtual Any getValue() override;
+ virtual void setValue( const Any& rValue, const OUString& rPresetId ) override;
+
+ DECL_LINK(implMenuSelectHdl, const OString&, void);
+ DECL_LINK(implModifyHdl, weld::MetricSpinButton&, void);
+
+ void updateMenu();
+
+private:
+ Link<LinkParamNone*,void> maModifyHdl;
+
+ std::unique_ptr<weld::MetricSpinButton> mxMetric;
+ std::unique_ptr<weld::MenuButton> mxControl;
+};
+
+}
+
+SdTransparencyPropertyBox::SdTransparencyPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl)
+ : SdPropertySubControl(pParent)
+ , maModifyHdl(rModifyHdl)
+ , mxMetric(mxBuilder->weld_metric_spin_button("transparent", FieldUnit::PERCENT))
+ , mxControl(mxBuilder->weld_menu_button("transparentmenu"))
+{
+ for (sal_Int32 i = 25; i < 101; i += 25)
+ {
+ OUString aStr(unicode::formatPercent(i,
+ Application::GetSettings().GetUILanguageTag()));
+ mxControl->append_item_check(OUString::number(i), aStr);
+ }
+
+ mxControl->connect_selected(LINK(this, SdTransparencyPropertyBox, implMenuSelectHdl));
+ mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_TRANSPARENCYPROPERTYBOX);
+ mxControl->show();
+
+ mxMetric->connect_value_changed(LINK(this, SdTransparencyPropertyBox, implModifyHdl));
+ mxMetric->set_help_id(HID_SD_CUSTOMANIMATIONPANE_TRANSPARENCYPROPERTYBOX);
+ mxMetric->show();
+ pLabel->set_mnemonic_widget(&mxMetric->get_widget());
+
+ setValue(rValue, OUString());
+}
+
+void SdTransparencyPropertyBox::updateMenu()
+{
+ sal_Int64 nValue = mxMetric->get_value(FieldUnit::PERCENT);
+ for (sal_uInt16 i = 25; i < 101; i += 25)
+ mxControl->set_item_active(OString::number(i), nValue == i);
+}
+
+IMPL_LINK_NOARG(SdTransparencyPropertyBox, implModifyHdl, weld::MetricSpinButton&, void)
+{
+ updateMenu();
+ maModifyHdl.Call(nullptr);
+}
+
+IMPL_LINK(SdTransparencyPropertyBox, implMenuSelectHdl, const OString&, rIdent, void)
+{
+ auto nValue = rIdent.toInt32();
+ if (nValue != mxMetric->get_value(FieldUnit::PERCENT))
+ {
+ mxMetric->set_value(nValue, FieldUnit::PERCENT);
+ implModifyHdl(*mxMetric);
+ }
+}
+
+void SdTransparencyPropertyBox::setValue(const Any& rValue, const OUString&)
+{
+ if (mxMetric)
+ {
+ double fValue = 0.0;
+ rValue >>= fValue;
+ ::tools::Long nValue = static_cast<::tools::Long>(fValue * 100);
+ mxMetric->set_value(nValue, FieldUnit::PERCENT);
+ updateMenu();
+ }
+}
+
+Any SdTransparencyPropertyBox::getValue()
+{
+ return Any(static_cast<double>(mxMetric->get_value(FieldUnit::PERCENT)) / 100.0);
+}
+
+namespace {
+
+class SdRotationPropertyBox : public SdPropertySubControl
+{
+public:
+ SdRotationPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl);
+
+ virtual Any getValue() override;
+ virtual void setValue( const Any& rValue, const OUString& ) override;
+
+ DECL_LINK(implMenuSelectHdl, const OString&, void);
+ DECL_LINK(implModifyHdl, weld::MetricSpinButton&, void);
+
+ void updateMenu();
+
+private:
+ Link<LinkParamNone*,void> maModifyHdl;
+
+ std::unique_ptr<weld::MetricSpinButton> mxMetric;
+ std::unique_ptr<weld::MenuButton> mxControl;
+};
+
+}
+
+SdRotationPropertyBox::SdRotationPropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl)
+ : SdPropertySubControl(pParent)
+ , maModifyHdl(rModifyHdl)
+ , mxMetric(mxBuilder->weld_metric_spin_button("rotate", FieldUnit::DEGREE))
+ , mxControl(mxBuilder->weld_menu_button("rotatemenu"))
+{
+ mxMetric->connect_value_changed(LINK( this, SdRotationPropertyBox, implModifyHdl));
+ mxMetric->set_help_id(HID_SD_CUSTOMANIMATIONPANE_ROTATIONPROPERTYBOX);
+ mxMetric->show();
+ pLabel->set_mnemonic_widget(&mxMetric->get_widget());
+
+ mxControl->connect_selected(LINK(this, SdRotationPropertyBox, implMenuSelectHdl));
+ mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_ROTATIONPROPERTYBOX);
+ mxControl->show();
+
+ setValue(rValue, OUString());
+}
+
+void SdRotationPropertyBox::updateMenu()
+{
+ sal_Int64 nValue = mxMetric->get_value(FieldUnit::DEGREE);
+ bool bDirection = nValue >= 0;
+ nValue = (nValue < 0 ? -nValue : nValue);
+
+ mxControl->set_item_active("90", nValue == 90);
+ mxControl->set_item_active("180", nValue == 180);
+ mxControl->set_item_active("360", nValue == 360);
+ mxControl->set_item_active("720", nValue == 720);
+
+ mxControl->set_item_active("closewise", bDirection);
+ mxControl->set_item_active("counterclock", !bDirection);
+}
+
+IMPL_LINK_NOARG(SdRotationPropertyBox, implModifyHdl, weld::MetricSpinButton&, void)
+{
+ updateMenu();
+ maModifyHdl.Call(nullptr);
+}
+
+IMPL_LINK(SdRotationPropertyBox, implMenuSelectHdl, const OString&, rIdent, void)
+{
+ auto nValue = mxMetric->get_value(FieldUnit::DEGREE);
+ bool bDirection = nValue >= 0;
+ nValue = (nValue < 0 ? -nValue : nValue);
+
+ if (rIdent == "clockwise")
+ bDirection = true;
+ else if (rIdent == "counterclock")
+ bDirection = false;
+ else
+ nValue = rIdent.toInt32();
+
+ if( !bDirection )
+ nValue = -nValue;
+
+ if (nValue != mxMetric->get_value(FieldUnit::DEGREE))
+ {
+ mxMetric->set_value(nValue, FieldUnit::DEGREE);
+ implModifyHdl(*mxMetric);
+ }
+}
+
+void SdRotationPropertyBox::setValue( const Any& rValue, const OUString& )
+{
+ if (mxMetric)
+ {
+ double fValue = 0.0;
+ rValue >>= fValue;
+ ::tools::Long nValue = static_cast<::tools::Long>(fValue);
+ mxMetric->set_value(nValue, FieldUnit::DEGREE);
+ updateMenu();
+ }
+}
+
+Any SdRotationPropertyBox::getValue()
+{
+ return Any(static_cast<double>(mxMetric->get_value(FieldUnit::DEGREE)));
+}
+
+namespace {
+
+class SdScalePropertyBox : public SdPropertySubControl
+{
+public:
+ SdScalePropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl);
+
+ virtual Any getValue() override;
+ virtual void setValue( const Any& rValue, const OUString& ) override;
+
+ DECL_LINK(implMenuSelectHdl, const OString&, void);
+ DECL_LINK(implModifyHdl, weld::MetricSpinButton&, void);
+
+ void updateMenu();
+
+private:
+ Link<LinkParamNone*,void> maModifyHdl;
+ int mnDirection;
+
+ std::unique_ptr<weld::MetricSpinButton> mxMetric;
+ std::unique_ptr<weld::MenuButton> mxControl;
+};
+
+}
+
+SdScalePropertyBox::SdScalePropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl)
+ : SdPropertySubControl(pParent)
+ , maModifyHdl( rModifyHdl )
+ , mxMetric(mxBuilder->weld_metric_spin_button("scale", FieldUnit::PERCENT))
+ , mxControl(mxBuilder->weld_menu_button("scalemenu"))
+{
+ mxControl->connect_selected(LINK(this, SdScalePropertyBox, implMenuSelectHdl));
+ mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_SCALEPROPERTYBOX);
+ mxControl->show();
+
+ mxMetric->connect_value_changed(LINK(this, SdScalePropertyBox, implModifyHdl));
+ mxMetric->set_help_id(HID_SD_CUSTOMANIMATIONPANE_SCALEPROPERTYBOX);
+ mxMetric->show();
+ pLabel->set_mnemonic_widget(&mxMetric->get_widget());
+
+ setValue(rValue, OUString());
+}
+
+void SdScalePropertyBox::updateMenu()
+{
+ auto nValue = mxMetric->get_value(FieldUnit::PERCENT);
+
+ mxControl->set_item_active("25scale", nValue == 25);
+ mxControl->set_item_active("50scale", nValue == 50);
+ mxControl->set_item_active("150scale", nValue == 150);
+ mxControl->set_item_active("400scale", nValue == 400);
+
+ mxControl->set_item_active("hori", mnDirection == 1);
+ mxControl->set_item_active("vert", mnDirection == 2);
+ mxControl->set_item_active("both", mnDirection == 3);
+}
+
+IMPL_LINK_NOARG(SdScalePropertyBox, implModifyHdl, weld::MetricSpinButton&, void)
+{
+ updateMenu();
+ maModifyHdl.Call(nullptr);
+}
+
+IMPL_LINK(SdScalePropertyBox, implMenuSelectHdl, const OString&, rIdent, void)
+{
+ auto nValue = mxMetric->get_value(FieldUnit::PERCENT);
+
+ int nDirection = mnDirection;
+
+ if (rIdent == "hori")
+ nDirection = 1;
+ else if (rIdent == "vert")
+ nDirection = 2;
+ else if (rIdent == "both")
+ nDirection = 3;
+ else
+ nValue = rIdent.toInt32(); // Getting here indicates a UI bug and should be handled better
+
+ bool bModified = false;
+
+ if( nDirection != mnDirection )
+ {
+ mnDirection = nDirection;
+ bModified = true;
+ }
+
+ if (nValue != mxMetric->get_value(FieldUnit::PERCENT))
+ {
+ mxMetric->set_value(nValue, FieldUnit::PERCENT);
+ bModified = true;
+ }
+
+ if(bModified)
+ {
+ implModifyHdl(*mxMetric);
+ updateMenu();
+ }
+}
+
+void SdScalePropertyBox::setValue(const Any& rValue, const OUString&)
+{
+ if (!mxMetric)
+ return;
+
+ ValuePair aValues;
+ rValue >>= aValues;
+
+ double fValue1 = 0.0;
+ double fValue2 = 0.0;
+
+ aValues.First >>= fValue1;
+ aValues.Second >>= fValue2;
+
+ // 'Size' drop down menu set by mnDirection when loading Grow and Shrink Animation
+ // Shouldn't compare a float directly to zero... should be fixed with delta epsilon compare
+ // Might be better to just have a flag in the content.xml for this
+ if( (fValue1 == 0.0) && (fValue2 == 0.0) )
+ mnDirection = 3; // assume 'Both' scaling option when both are zero
+ else if( (fValue1 != 0.0) && (fValue2 == 0.0) )
+ mnDirection = 1;
+ else if( (fValue1 == 0.0) && (fValue2 != 0.0) )
+ mnDirection = 2;
+ else
+ mnDirection = 3;
+
+ // Grow and Shrink Animation is a relative change with value stored in content.xml under tag
+ // smil:by=*,*
+ // An offset of 1 must be added to properly translate from content.xml to UI value displayed
+ // e.g. if in content.xml smil:by=0.5,0.5 then 1 + (0.5,0.5) = (1.5,1.5) => grow by 150% of the
+ // size horizontal and vertical
+ // e.g. if in content.xml smil:by=-0.5,-0.5 then 1 + (-0.5,-0.5) = (0.5,0.5) => shrink by 50%
+ // of the size horizontal and vertical
+ fValue1 += 1;
+ fValue2 += 1;
+
+ // Determine value from file for UI 'Size' field based on determined mnDirection
+ ::tools::Long nValue;
+ if( mnDirection == 1 )
+ nValue = static_cast<::tools::Long>(fValue1 * 100.0);
+ else if( mnDirection == 2 )
+ nValue = static_cast<::tools::Long>(fValue2 * 100.0);
+ else if( mnDirection == 3 ){
+ if (fValue1 >= fValue2)
+ nValue = static_cast<::tools::Long>(fValue1 * 100.0);
+ else
+ nValue = static_cast<::tools::Long>(fValue2 * 100.0);
+ }
+ else
+ nValue = static_cast<::tools::Long>(100.0); // default to 100% in UI if something goes wrong
+
+ mxMetric->set_value(nValue, FieldUnit::PERCENT);
+ updateMenu();
+}
+
+Any SdScalePropertyBox::getValue()
+{
+ double fValue1 = static_cast<double>(mxMetric->get_value(FieldUnit::PERCENT)) / 100.0;
+
+ // Grow and Shrink Animation is a relative change with value stored in content.xml under tag
+ // smil:by=*,*
+ // An offset of 1 must be subtracted to properly translate UI value displayed and save to
+ // content.xml
+ // e.g. if UI value is 150% then 1.5 - 1 = 0.5 and is set to smil:by=0.5,0.5 in content.xml
+ // e.g. if UI value is 50% then 0.5 - 1 = -0.5 and is set to smil:by=-0.5,-0.5 in content.xml
+ fValue1 -= 1;
+
+ double fValue2 = fValue1;
+
+ // mnDirection set by 'Size' drop down menu and used to zero out either horizontal or vertical
+ // scaling depending on what option is selected
+ if( mnDirection == 1 )
+ fValue2 = 0.0;
+ else if( mnDirection == 2 )
+ fValue1 = 0.0;
+
+ ValuePair aValues;
+ aValues.First <<= fValue1;
+ aValues.Second <<= fValue2;
+
+ return Any( aValues );
+}
+
+namespace {
+
+class SdFontStylePropertyBox : public SdPropertySubControl
+{
+public:
+ SdFontStylePropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl);
+
+ virtual Any getValue() override;
+ virtual void setValue( const Any& rValue, const OUString& ) override;
+
+ DECL_LINK(implMenuSelectHdl, const OString&, void);
+
+ void update();
+
+private:
+ float mfFontWeight;
+ awt::FontSlant meFontSlant;
+ sal_Int16 mnFontUnderline;
+ Link<LinkParamNone*,void> maModifyHdl;
+
+ std::unique_ptr<weld::Entry> mxEdit;
+ std::unique_ptr<weld::MenuButton> mxControl;
+};
+
+}
+
+SdFontStylePropertyBox::SdFontStylePropertyBox(weld::Label* pLabel, weld::Container* pParent, const Any& rValue, const Link<LinkParamNone*,void>& rModifyHdl )
+ : SdPropertySubControl(pParent)
+ , maModifyHdl( rModifyHdl )
+ , mxEdit(mxBuilder->weld_entry("entry"))
+ , mxControl(mxBuilder->weld_menu_button("entrymenu"))
+{
+ mxEdit->set_text(SdResId(STR_CUSTOMANIMATION_SAMPLE));
+ mxEdit->set_help_id(HID_SD_CUSTOMANIMATIONPANE_FONTSTYLEPROPERTYBOX);
+ pLabel->set_mnemonic_widget(mxEdit.get());
+ mxEdit->show();
+
+ mxControl->connect_selected(LINK(this, SdFontStylePropertyBox, implMenuSelectHdl));
+ mxControl->set_help_id(HID_SD_CUSTOMANIMATIONPANE_FONTSTYLEPROPERTYBOX);
+ mxControl->show();
+
+ setValue(rValue, OUString());
+}
+
+void SdFontStylePropertyBox::update()
+{
+ // update menu
+ mxControl->set_item_active("bold", mfFontWeight == awt::FontWeight::BOLD);
+ mxControl->set_item_active("italic", meFontSlant == awt::FontSlant_ITALIC);
+ mxControl->set_item_active("underline", mnFontUnderline != awt::FontUnderline::NONE );
+
+ // update sample edit
+ vcl::Font aFont(mxEdit->get_font());
+ aFont.SetWeight(mfFontWeight == awt::FontWeight::BOLD ? WEIGHT_BOLD : WEIGHT_NORMAL);
+ aFont.SetItalic(meFontSlant == awt::FontSlant_ITALIC ? ITALIC_NORMAL : ITALIC_NONE);
+ aFont.SetUnderline(mnFontUnderline == awt::FontUnderline::NONE ? LINESTYLE_NONE : LINESTYLE_SINGLE);
+ mxEdit->set_font(aFont);
+}
+
+IMPL_LINK(SdFontStylePropertyBox, implMenuSelectHdl, const OString&, rIdent, void)
+{
+ if (rIdent == "bold")
+ {
+ if( mfFontWeight == awt::FontWeight::BOLD )
+ mfFontWeight = awt::FontWeight::NORMAL;
+ else
+ mfFontWeight = awt::FontWeight::BOLD;
+ }
+ else if (rIdent == "italic")
+ {
+ if( meFontSlant == awt::FontSlant_ITALIC )
+ meFontSlant = awt::FontSlant_NONE;
+ else
+ meFontSlant = awt::FontSlant_ITALIC;
+ }
+ else if (rIdent == "underline")
+ {
+ if( mnFontUnderline == awt::FontUnderline::SINGLE )
+ mnFontUnderline = awt::FontUnderline::NONE;
+ else
+ mnFontUnderline = awt::FontUnderline::SINGLE;
+ }
+
+ update();
+ maModifyHdl.Call(nullptr);
+}
+
+void SdFontStylePropertyBox::setValue( const Any& rValue, const OUString& )
+{
+ Sequence<Any> aValues;
+ rValue >>= aValues;
+
+ aValues[0] >>= mfFontWeight;
+ aValues[1] >>= meFontSlant;
+ aValues[2] >>= mnFontUnderline;
+
+ update();
+}
+
+Any SdFontStylePropertyBox::getValue()
+{
+ Sequence<Any> aValues{ Any(mfFontWeight), Any(meFontSlant), Any(mnFontUnderline) };
+ return Any( aValues );
+}
+
+class CustomAnimationEffectTabPage
+{
+public:
+ CustomAnimationEffectTabPage(weld::Container* pParent, weld::Window* pDialog, const STLPropertySet* pSet);
+
+ void update( STLPropertySet* pSet );
+ DECL_LINK(implSelectHdl, weld::ComboBox&, void);
+ DECL_LINK(implClickHdl, weld::Button&, void);
+ void implHdl(const weld::Widget*);
+
+private:
+ void updateControlStates();
+ void fillSoundListBox();
+ void clearSoundListBox();
+ sal_Int32 getSoundObject( std::u16string_view rStr );
+ void openSoundFileDialog();
+ void onSoundPreview();
+ weld::Window* GetFrameWeld() const { return mpDialog; }
+
+private:
+ ::std::vector< OUString > maSoundList;
+ bool mbHasText;
+ const STLPropertySet* mpSet;
+ css::uno::Reference<css::media::XPlayer> mxPlayer;
+
+ weld::Window* mpDialog;
+ std::unique_ptr<weld::Builder> mxBuilder;
+ std::unique_ptr<weld::Container> mxContainer;
+ std::unique_ptr<weld::Widget> mxSettings;
+ std::unique_ptr<weld::Label> mxFTProperty1;
+ std::unique_ptr<weld::Container> mxPlaceholderBox;
+ std::unique_ptr<weld::CheckButton> mxCBSmoothStart;
+ std::unique_ptr<weld::CheckButton> mxCBSmoothEnd;
+ std::unique_ptr<weld::Label> mxFTSound;
+ std::unique_ptr<weld::ComboBox> mxLBSound;
+ std::unique_ptr<weld::Button> mxPBSoundPreview;
+ std::unique_ptr<weld::Label> mxFTAfterEffect;
+ std::unique_ptr<weld::ComboBox> mxLBAfterEffect;
+ std::unique_ptr<weld::Label> mxFTDimColor;
+ std::unique_ptr<ColorListBox> mxCLBDimColor;
+ std::unique_ptr<weld::Label> mxFTTextAnim;
+ std::unique_ptr<weld::ComboBox> mxLBTextAnim;
+ std::unique_ptr<weld::MetricSpinButton> mxMFTextDelay;
+ std::unique_ptr<weld::Label> mxFTTextDelay;
+ std::unique_ptr<SdPropertySubControl> mxLBSubControl;
+};
+
+CustomAnimationEffectTabPage::CustomAnimationEffectTabPage(weld::Container* pParent, weld::Window* pDialog, const STLPropertySet* pSet)
+ : mbHasText(false)
+ , mpSet(pSet)
+ , mpDialog(pDialog)
+ , mxBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/customanimationeffecttab.ui"))
+ , mxContainer(mxBuilder->weld_container("EffectTab"))
+ , mxSettings(mxBuilder->weld_widget("settings"))
+ , mxFTProperty1(mxBuilder->weld_label("prop_label1"))
+ , mxPlaceholderBox(mxBuilder->weld_container("placeholder"))
+ , mxCBSmoothStart(mxBuilder->weld_check_button("smooth_start"))
+ , mxCBSmoothEnd(mxBuilder->weld_check_button("smooth_end"))
+ , mxFTSound(mxBuilder->weld_label("sound_label"))
+ , mxLBSound(mxBuilder->weld_combo_box("sound_list"))
+ , mxPBSoundPreview(mxBuilder->weld_button("sound_preview"))
+ , mxFTAfterEffect(mxBuilder->weld_label("aeffect_label"))
+ , mxLBAfterEffect(mxBuilder->weld_combo_box("aeffect_list"))
+ , mxFTDimColor(mxBuilder->weld_label("dim_color_label"))
+ , mxCLBDimColor(new ColorListBox(mxBuilder->weld_menu_button("dim_color_list"), [pDialog]{ return pDialog; }))
+ , mxFTTextAnim(mxBuilder->weld_label("text_animation_label"))
+ , mxLBTextAnim(mxBuilder->weld_combo_box("text_animation_list"))
+ , mxMFTextDelay(mxBuilder->weld_metric_spin_button("text_delay", FieldUnit::PERCENT))
+ , mxFTTextDelay(mxBuilder->weld_label("text_delay_label"))
+{
+ mxCLBDimColor->SelectEntry(COL_BLACK);
+
+ // fill the soundbox
+ fillSoundListBox();
+
+ mxLBSound->connect_changed(LINK(this, CustomAnimationEffectTabPage, implSelectHdl));
+ mxPBSoundPreview->connect_clicked(LINK(this, CustomAnimationEffectTabPage, implClickHdl));
+
+ // only show settings if all selected effects have the same preset-id
+ if( pSet->getPropertyState( nHandlePresetId ) != STLPropertyState::Ambiguous )
+ {
+ OUString aPresetId;
+ pSet->getPropertyValue( nHandlePresetId ) >>= aPresetId;
+
+ // property 1
+
+ if( pSet->getPropertyState( nHandleProperty1Type ) != STLPropertyState::Ambiguous )
+ {
+ sal_Int32 nType = 0;
+ pSet->getPropertyValue( nHandleProperty1Type ) >>= nType;
+
+ if( nType != nPropertyTypeNone )
+ {
+ // set ui name for property at fixed text
+ OUString aPropertyName( getPropertyName( nType ) );
+
+ if( !aPropertyName.isEmpty() )
+ {
+ mxSettings->show();
+ mxFTProperty1->set_label(aPropertyName);
+ }
+
+ // get property value
+ const Any aValue( pSet->getPropertyValue( nHandleProperty1Value ) );
+
+ // create property sub control
+ mxLBSubControl = SdPropertySubControl::create(nType, mxFTProperty1.get(), mxPlaceholderBox.get(), mpDialog, aValue, aPresetId, Link<LinkParamNone*,void>());
+ }
+ }
+
+ mxFTProperty1->set_sensitive(mxPlaceholderBox->get_sensitive());
+
+ // accelerate & decelerate
+
+ if( pSet->getPropertyState( nHandleAccelerate ) == STLPropertyState::Direct )
+ {
+ mxCBSmoothStart->show();
+ mxCBSmoothEnd->show();
+
+ double fTemp = 0.0;
+ pSet->getPropertyValue( nHandleAccelerate ) >>= fTemp;
+ mxCBSmoothStart->set_active( fTemp > 0.0 );
+
+ pSet->getPropertyValue( nHandleDecelerate ) >>= fTemp;
+ mxCBSmoothEnd->set_active( fTemp > 0.0 );
+ }
+ }
+
+ // init after effect controls
+
+ mxLBAfterEffect->connect_changed(LINK(this, CustomAnimationEffectTabPage, implSelectHdl));
+ mxLBTextAnim->connect_changed(LINK(this, CustomAnimationEffectTabPage, implSelectHdl));
+
+ if( (pSet->getPropertyState( nHandleHasAfterEffect ) != STLPropertyState::Ambiguous) &&
+ (pSet->getPropertyState( nHandleAfterEffectOnNextEffect ) != STLPropertyState::Ambiguous) &&
+ (pSet->getPropertyState( nHandleDimColor ) != STLPropertyState::Ambiguous))
+ {
+ bool bHasAfterEffect = false;
+ pSet->getPropertyValue( nHandleHasAfterEffect ) >>= bHasAfterEffect;
+
+ sal_Int32 nPos = 0;
+ if( bHasAfterEffect )
+ {
+ nPos++;
+
+ bool bAfterEffectOnNextClick = false;
+ pSet->getPropertyValue( nHandleAfterEffectOnNextEffect ) >>= bAfterEffectOnNextClick;
+ Any aDimColor( pSet->getPropertyValue( nHandleDimColor ) );
+
+ if( aDimColor.hasValue() )
+ {
+ Color aColor;
+ aDimColor >>= aColor;
+ mxCLBDimColor->SelectEntry(aColor);
+ }
+ else
+ {
+ nPos++;
+ if( bAfterEffectOnNextClick )
+ nPos++;
+ }
+ }
+
+ mxLBAfterEffect->set_active(nPos);
+ }
+
+ if( pSet->getPropertyState( nHandleHasText ) != STLPropertyState::Ambiguous )
+ pSet->getPropertyValue( nHandleHasText ) >>= mbHasText;
+
+ if( mbHasText )
+ {
+ if( pSet->getPropertyState( nHandleIterateType ) != STLPropertyState::Ambiguous)
+ {
+ int nPos = -1;
+
+ sal_Int32 nIterateType = 0;
+ pSet->getPropertyValue( nHandleIterateType ) >>= nIterateType;
+ switch( nIterateType )
+ {
+ case TextAnimationType::BY_PARAGRAPH: nPos = 0; break;
+ case TextAnimationType::BY_WORD: nPos = 1; break;
+ case TextAnimationType::BY_LETTER: nPos = 2; break;
+ }
+
+ mxLBTextAnim->set_active(nPos);
+ }
+
+ if( pSet->getPropertyState( nHandleIterateInterval ) != STLPropertyState::Default )
+ {
+ double fIterateInterval = 0.0;
+ pSet->getPropertyValue( nHandleIterateInterval ) >>= fIterateInterval;
+ mxMFTextDelay->set_value(static_cast<::tools::Long>(fIterateInterval*10), FieldUnit::NONE);
+ }
+ }
+ else
+ {
+ mxFTTextAnim->set_sensitive(false);
+ mxLBTextAnim->set_sensitive(false);
+ mxMFTextDelay->set_sensitive(false);
+ mxFTTextDelay->set_sensitive(false);
+
+ }
+
+ if( pSet->getPropertyState( nHandleSoundURL ) != STLPropertyState::Ambiguous )
+ {
+ sal_Int32 nPos = 0;
+
+ const Any aValue( pSet->getPropertyValue( nHandleSoundURL ) );
+
+ if( aValue.getValueType() == ::cppu::UnoType<sal_Bool>::get() )
+ {
+ nPos = 1;
+ }
+ else
+ {
+ OUString aSoundURL;
+ aValue >>= aSoundURL;
+
+ if( !aSoundURL.isEmpty() )
+ {
+ sal_uLong i;
+ for( i = 0; i < maSoundList.size(); i++ )
+ {
+ OUString aString = maSoundList[ i ];
+ if( aString == aSoundURL )
+ {
+ nPos = static_cast<sal_Int32>(i)+2;
+ break;
+ }
+ }
+
+ if( nPos == 0 )
+ {
+ nPos = static_cast<sal_Int32>(maSoundList.size())+2;
+ maSoundList.push_back( aSoundURL );
+ INetURLObject aURL( aSoundURL );
+ mxLBSound->insert_text(nPos, aURL.GetBase());
+ }
+ }
+ }
+
+ if( nPos != -1)
+ mxLBSound->set_active(nPos);
+ }
+
+ updateControlStates();
+
+}
+
+void CustomAnimationEffectTabPage::updateControlStates()
+{
+ auto nPos = mxLBAfterEffect->get_active();
+ mxCLBDimColor->set_sensitive( nPos == 1 );
+ mxFTDimColor->set_sensitive( nPos == 1 );
+
+ if( mbHasText )
+ {
+ nPos = mxLBTextAnim->get_active();
+ mxMFTextDelay->set_sensitive( nPos != 0 );
+ mxFTTextDelay->set_sensitive( nPos != 0 );
+ }
+
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ mxFTSound->hide();
+ mxLBSound->hide();
+ mxPBSoundPreview->hide();
+ }
+ else
+ {
+ nPos = mxLBSound->get_active();
+ mxPBSoundPreview->set_sensitive( nPos >= 2 );
+ }
+
+}
+
+IMPL_LINK(CustomAnimationEffectTabPage, implClickHdl, weld::Button&, rBtn, void)
+{
+ implHdl(&rBtn);
+}
+
+IMPL_LINK(CustomAnimationEffectTabPage, implSelectHdl, weld::ComboBox&, rListBox, void)
+{
+ implHdl(&rListBox);
+}
+
+void CustomAnimationEffectTabPage::implHdl(const weld::Widget* pControl)
+{
+ if (pControl == mxLBTextAnim.get())
+ {
+ if (mxMFTextDelay->get_value(FieldUnit::NONE) == 0)
+ mxMFTextDelay->set_value(100, FieldUnit::NONE);
+ }
+ else if (pControl == mxLBSound.get())
+ {
+ auto nPos = mxLBSound->get_active();
+ if (nPos == (mxLBSound->get_count() - 1))
+ {
+ openSoundFileDialog();
+ }
+ }
+ else if (pControl == mxPBSoundPreview.get())
+ {
+ onSoundPreview();
+ }
+
+ updateControlStates();
+}
+
+void CustomAnimationEffectTabPage::update( STLPropertySet* pSet )
+{
+ if (mxLBSubControl)
+ {
+ Any aNewValue(mxLBSubControl->getValue());
+ Any aOldValue;
+ if( mpSet->getPropertyState( nHandleProperty1Value ) != STLPropertyState::Ambiguous)
+ aOldValue = mpSet->getPropertyValue( nHandleProperty1Value );
+
+ if( aOldValue != aNewValue )
+ pSet->setPropertyValue( nHandleProperty1Value, aNewValue );
+ }
+
+ if (mxCBSmoothStart->get_visible())
+ {
+ // set selected value for accelerate if different than in original set
+
+ double fTemp = mxCBSmoothStart->get_active() ? 0.5 : 0.0;
+
+ double fOldTemp = 0.0;
+ if(mpSet->getPropertyState( nHandleAccelerate ) != STLPropertyState::Ambiguous)
+ mpSet->getPropertyValue( nHandleAccelerate ) >>= fOldTemp;
+ else
+ fOldTemp = -2.0;
+
+ if( fOldTemp != fTemp )
+ pSet->setPropertyValue( nHandleAccelerate, Any( fTemp ) );
+
+ // set selected value for decelerate if different than in original set
+ fTemp = mxCBSmoothEnd->get_active() ? 0.5 : 0.0;
+
+ if(mpSet->getPropertyState( nHandleDecelerate ) != STLPropertyState::Ambiguous)
+ mpSet->getPropertyValue( nHandleDecelerate ) >>= fOldTemp;
+ else
+ fOldTemp = -2.0;
+
+ if( fOldTemp != fTemp )
+ pSet->setPropertyValue( nHandleDecelerate, Any( fTemp ) );
+ }
+
+ auto nPos = mxLBAfterEffect->get_active();
+ if (nPos != -1)
+ {
+ bool bAfterEffect = nPos != 0;
+
+ bool bOldAfterEffect = false;
+
+ if(mpSet->getPropertyState( nHandleHasAfterEffect ) != STLPropertyState::Ambiguous)
+ mpSet->getPropertyValue( nHandleHasAfterEffect ) >>= bOldAfterEffect;
+ else
+ bOldAfterEffect = !bAfterEffect;
+
+ if( bOldAfterEffect != bAfterEffect )
+ pSet->setPropertyValue( nHandleHasAfterEffect, Any( bAfterEffect ) );
+
+ Any aDimColor;
+ if( nPos == 1 )
+ {
+ Color aSelectedColor = mxCLBDimColor->GetSelectEntryColor();
+ aDimColor <<= aSelectedColor.GetRGBColor();
+ }
+
+ if( (mpSet->getPropertyState( nHandleDimColor ) == STLPropertyState::Ambiguous) ||
+ (mpSet->getPropertyValue( nHandleDimColor ) != aDimColor) )
+ pSet->setPropertyValue( nHandleDimColor, aDimColor );
+
+ bool bAfterEffectOnNextEffect = nPos != 2;
+ bool bOldAfterEffectOnNextEffect = !bAfterEffectOnNextEffect;
+
+ if( mpSet->getPropertyState( nHandleAfterEffectOnNextEffect ) != STLPropertyState::Ambiguous)
+ mpSet->getPropertyValue( nHandleAfterEffectOnNextEffect ) >>= bOldAfterEffectOnNextEffect;
+
+ if( bAfterEffectOnNextEffect != bOldAfterEffectOnNextEffect )
+ pSet->setPropertyValue( nHandleAfterEffectOnNextEffect, Any( bAfterEffectOnNextEffect ) );
+ }
+
+ nPos = mxLBTextAnim->get_active();
+ if (nPos != -1)
+ {
+ sal_Int16 nIterateType;
+
+ switch( nPos )
+ {
+ case 1: nIterateType = TextAnimationType::BY_WORD; break;
+ case 2: nIterateType = TextAnimationType::BY_LETTER; break;
+ default:
+ nIterateType = TextAnimationType::BY_PARAGRAPH;
+ }
+
+ sal_Int16 nOldIterateType = nIterateType-1;
+
+ if(mpSet->getPropertyState( nHandleIterateType ) != STLPropertyState::Ambiguous)
+ mpSet->getPropertyValue( nHandleIterateType ) >>= nOldIterateType;
+
+ if( nIterateType != nOldIterateType )
+ pSet->setPropertyValue( nHandleIterateType, Any( nIterateType ) );
+ }
+
+ {
+ double fIterateInterval = static_cast<double>(mxMFTextDelay->get_value(FieldUnit::NONE)) / 10;
+ double fOldIterateInterval = -1.0;
+
+ if( mpSet->getPropertyState( nHandleIterateInterval ) != STLPropertyState::Ambiguous )
+ mpSet->getPropertyValue( nHandleIterateInterval ) >>= fOldIterateInterval;
+
+ if( fIterateInterval != fOldIterateInterval )
+ pSet->setPropertyValue( nHandleIterateInterval, Any( fIterateInterval ) );
+ }
+
+ nPos = mxLBSound->get_active();
+ if (nPos == -1)
+ return;
+
+ Any aNewSoundURL, aOldSoundURL( Any( sal_Int32(0) ) );
+
+ if( nPos == 0 )
+ {
+ // 0 means no sound, so leave any empty
+ }
+ else if( nPos == 1 )
+ {
+ // this means stop sound
+ aNewSoundURL <<= true;
+ }
+ else
+ {
+ OUString aSoundURL( maSoundList[ nPos-2 ] );
+ aNewSoundURL <<= aSoundURL;
+ }
+
+ if( mpSet->getPropertyState( nHandleSoundURL ) != STLPropertyState::Ambiguous )
+ aOldSoundURL = mpSet->getPropertyValue( nHandleSoundURL );
+
+ if( aNewSoundURL != aOldSoundURL )
+ pSet->setPropertyValue( nHandleSoundURL, aNewSoundURL );
+}
+
+void CustomAnimationEffectTabPage::fillSoundListBox()
+{
+ GalleryExplorer::FillObjList( GALLERY_THEME_SOUNDS, maSoundList );
+ GalleryExplorer::FillObjList( GALLERY_THEME_USERSOUNDS, maSoundList );
+
+ mxLBSound->append_text( SdResId(STR_CUSTOMANIMATION_NO_SOUND) );
+ mxLBSound->append_text( SdResId(STR_CUSTOMANIMATION_STOP_PREVIOUS_SOUND) );
+ for(const OUString & rString : maSoundList)
+ {
+ INetURLObject aURL( rString );
+ mxLBSound->append_text( aURL.GetBase() );
+ }
+ mxLBSound->append_text( SdResId(STR_CUSTOMANIMATION_BROWSE_SOUND) );
+}
+
+void CustomAnimationEffectTabPage::clearSoundListBox()
+{
+ maSoundList.clear();
+ mxLBSound->clear();
+}
+
+sal_Int32 CustomAnimationEffectTabPage::getSoundObject( std::u16string_view rStr )
+{
+ size_t i;
+ const size_t nCount = maSoundList.size();
+ for( i = 0; i < nCount; i++ )
+ {
+ if( maSoundList[ i ].equalsIgnoreAsciiCase(rStr) )
+ return i+2;
+ }
+
+ return -1;
+}
+
+void CustomAnimationEffectTabPage::openSoundFileDialog()
+{
+ SdOpenSoundFileDialog aFileDialog(GetFrameWeld());
+
+ bool bValidSoundFile = false;
+ bool bQuitLoop = false;
+ ::tools::Long nPos = 0;
+
+ while( !bQuitLoop && (aFileDialog.Execute() == ERRCODE_NONE) )
+ {
+ OUString aFile = aFileDialog.GetPath();
+ nPos = getSoundObject( aFile );
+
+ if( nPos < 0 ) // not in Soundliste
+ {
+ // try to insert in Gallery
+ if( GalleryExplorer::InsertURL( GALLERY_THEME_USERSOUNDS, aFile ) )
+ {
+ clearSoundListBox();
+ fillSoundListBox();
+
+ nPos = getSoundObject( aFile );
+ DBG_ASSERT( nPos >= 0, "sd::CustomAnimationEffectTabPage::openSoundFileDialog(), Recently inserted sound not in list!" );
+
+ bValidSoundFile=true;
+ bQuitLoop=true;
+ }
+ else
+ {
+ OUString aStrWarning(SdResId(STR_WARNING_NOSOUNDFILE));
+ aStrWarning = aStrWarning.replaceFirst("%", aFile);
+ std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(nullptr,
+ VclMessageType::Warning, VclButtonsType::NONE,
+ aStrWarning));
+ xWarn->add_button(GetStandardText(StandardButtonType::Retry), RET_RETRY);
+ xWarn->add_button(GetStandardText(StandardButtonType::Cancel), RET_CANCEL);
+ bQuitLoop = xWarn->run() != RET_RETRY;
+
+ bValidSoundFile=false;
+ }
+ }
+ else
+ {
+ bValidSoundFile=true;
+ bQuitLoop=true;
+ }
+ }
+
+ if( !bValidSoundFile )
+ nPos = 0;
+
+ mxLBSound->set_active(nPos);
+}
+
+void CustomAnimationEffectTabPage::onSoundPreview()
+{
+#if HAVE_FEATURE_AVMEDIA
+ const auto nPos = mxLBSound->get_active();
+
+ if( nPos >= 2 ) try
+ {
+ const OUString aSoundURL( maSoundList[ nPos-2 ] );
+ mxPlayer.set( avmedia::MediaWindow::createPlayer( aSoundURL, "" ), uno::UNO_SET_THROW );
+ mxPlayer->start();
+ }
+ catch( uno::Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "CustomAnimationEffectTabPage::onSoundPreview()" );
+ }
+#endif
+}
+
+class CustomAnimationDurationTabPage
+{
+public:
+ CustomAnimationDurationTabPage(weld::Container* pParent, const STLPropertySet* pSet);
+
+ void update( STLPropertySet* pSet );
+
+ DECL_LINK(implControlHdl, weld::ComboBox&, void);
+ DECL_LINK(DurationModifiedHdl, weld::MetricSpinButton&, void);
+
+private:
+ const STLPropertySet* mpSet;
+
+ std::unique_ptr<weld::Builder> mxBuilder;
+ std::unique_ptr<weld::Container> mxContainer;
+ std::unique_ptr<weld::Label> mxFTStart;
+ std::unique_ptr<weld::ComboBox> mxLBStart;
+ std::unique_ptr<weld::Label> mxFTStartDelay;
+ std::unique_ptr<weld::MetricSpinButton> mxMFStartDelay;
+ std::unique_ptr<weld::Label> mxFTDuration;
+ std::unique_ptr<weld::MetricSpinButton> mxCBXDuration;
+ std::unique_ptr<weld::Label> mxFTRepeat;
+ std::unique_ptr<weld::ComboBox> mxCBRepeat;
+ std::unique_ptr<weld::CheckButton> mxCBXRewind;
+ std::unique_ptr<weld::RadioButton> mxRBClickSequence;
+ std::unique_ptr<weld::RadioButton> mxRBInteractive;
+ std::unique_ptr<weld::ComboBox> mxLBTrigger;
+};
+
+CustomAnimationDurationTabPage::CustomAnimationDurationTabPage(weld::Container* pParent, const STLPropertySet* pSet)
+ : mpSet(pSet)
+ , mxBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/customanimationtimingtab.ui"))
+ , mxContainer(mxBuilder->weld_container("TimingTab"))
+ , mxFTStart(mxBuilder->weld_label("start_label"))
+ , mxLBStart(mxBuilder->weld_combo_box("start_list"))
+ , mxFTStartDelay(mxBuilder->weld_label("delay_label"))
+ , mxMFStartDelay(mxBuilder->weld_metric_spin_button("delay_value", FieldUnit::SECOND))
+ , mxFTDuration(mxBuilder->weld_label("duration_label"))
+ , mxCBXDuration(mxBuilder->weld_metric_spin_button("anim_duration", FieldUnit::SECOND))
+ , mxFTRepeat(mxBuilder->weld_label("repeat_label"))
+ , mxCBRepeat(mxBuilder->weld_combo_box("repeat_list"))
+ , mxCBXRewind(mxBuilder->weld_check_button("rewind"))
+ , mxRBClickSequence(mxBuilder->weld_radio_button("rb_click_sequence"))
+ , mxRBInteractive(mxBuilder->weld_radio_button("rb_interactive"))
+ , mxLBTrigger(mxBuilder->weld_combo_box("trigger_list"))
+{
+ mxLBTrigger->set_size_request(mxLBTrigger->get_approximate_digit_width() * 20, -1);
+
+ fillRepeatComboBox(*mxCBRepeat);
+
+ mxLBTrigger->connect_changed(LINK(this, CustomAnimationDurationTabPage, implControlHdl));
+ mxCBXDuration->connect_value_changed(LINK( this, CustomAnimationDurationTabPage, DurationModifiedHdl));
+
+ if( pSet->getPropertyState( nHandleStart ) != STLPropertyState::Ambiguous )
+ {
+ sal_Int16 nStart = 0;
+ pSet->getPropertyValue( nHandleStart ) >>= nStart;
+ sal_Int32 nPos = 0;
+ switch( nStart )
+ {
+ case EffectNodeType::WITH_PREVIOUS: nPos = 1; break;
+ case EffectNodeType::AFTER_PREVIOUS: nPos = 2; break;
+ }
+ mxLBStart->set_active(nPos);
+ }
+
+ if( pSet->getPropertyState( nHandleBegin ) != STLPropertyState::Ambiguous )
+ {
+ double fBegin = 0.0;
+ pSet->getPropertyValue( nHandleBegin ) >>= fBegin;
+ mxMFStartDelay->set_value(static_cast<::tools::Long>(fBegin*10), FieldUnit::NONE);
+ }
+
+ if( pSet->getPropertyState( nHandleDuration ) != STLPropertyState::Ambiguous )
+ {
+ double fDuration = 0.0;
+ pSet->getPropertyValue( nHandleDuration ) >>= fDuration;
+
+ if( fDuration == 0.001 )
+ {
+ mxFTDuration->set_sensitive(false);
+ mxCBXDuration->set_sensitive(false);
+ mxFTRepeat->set_sensitive(false);
+ mxCBRepeat->set_sensitive(false);
+ mxCBXRewind->set_sensitive(false);
+ }
+ else
+ {
+ mxCBXDuration->set_value(fDuration * 100.0, FieldUnit::NONE);
+ }
+ }
+
+ if( pSet->getPropertyState( nHandleRepeat ) != STLPropertyState::Ambiguous )
+ {
+ Any aRepeatCount( pSet->getPropertyValue( nHandleRepeat ) );
+ if( (aRepeatCount.getValueType() == ::cppu::UnoType<double>::get()) || !aRepeatCount.hasValue() )
+ {
+ double fRepeat = 0.0;
+ if( aRepeatCount.hasValue() )
+ aRepeatCount >>= fRepeat;
+
+ auto nPos = -1;
+
+ if( fRepeat == 0 )
+ nPos = 0;
+ else if( fRepeat == 2.0 )
+ nPos = 1;
+ else if( fRepeat == 3.0 )
+ nPos = 2;
+ else if( fRepeat == 4.0 )
+ nPos = 3;
+ else if( fRepeat == 5.0 )
+ nPos = 4;
+ else if( fRepeat == 10.0 )
+ nPos = 5;
+
+ if (nPos != -1)
+ mxCBRepeat->set_active(nPos);
+ else
+ mxCBRepeat->set_entry_text(OUString::number(fRepeat));
+ }
+ else if( aRepeatCount.getValueType() == ::cppu::UnoType<Timing>::get() )
+ {
+ Any aEnd;
+ if( pSet->getPropertyState( nHandleEnd ) != STLPropertyState::Ambiguous )
+ aEnd = pSet->getPropertyValue( nHandleEnd );
+
+ mxCBRepeat->set_active(aEnd.hasValue() ? 6 : 7);
+ }
+ }
+
+ if( pSet->getPropertyState( nHandleRewind ) != STLPropertyState::Ambiguous )
+ {
+ sal_Int16 nFill = 0;
+ if( pSet->getPropertyValue( nHandleRewind ) >>= nFill )
+ {
+ mxCBXRewind->set_active(nFill == AnimationFill::REMOVE);
+ }
+ else
+ {
+ mxCBXRewind->set_state(TRISTATE_INDET);
+ }
+ }
+
+ Reference< XShape > xTrigger;
+
+ if( pSet->getPropertyState( nHandleTrigger ) != STLPropertyState::Ambiguous )
+ {
+ pSet->getPropertyValue( nHandleTrigger ) >>= xTrigger;
+
+ mxRBInteractive->set_active(xTrigger.is());
+ mxRBClickSequence->set_active(!xTrigger.is());
+ }
+
+ Reference< XDrawPage > xCurrentPage;
+ pSet->getPropertyValue( nHandleCurrentPage ) >>= xCurrentPage;
+ if( !xCurrentPage.is() )
+ return;
+
+ static const OUStringLiteral aStrIsEmptyPresObj( u"IsEmptyPresentationObject" );
+
+ sal_Int32 nShape, nCount = xCurrentPage->getCount();
+ for( nShape = 0; nShape < nCount; nShape++ )
+ {
+ Reference< XShape > xShape( xCurrentPage->getByIndex( nShape ), UNO_QUERY );
+
+ if( !xShape.is() )
+ continue;
+
+ Reference< XPropertySet > xSet( xShape, UNO_QUERY );
+ if( xSet.is() && xSet->getPropertySetInfo()->hasPropertyByName( aStrIsEmptyPresObj ) )
+ {
+ bool bIsEmpty = false;
+ xSet->getPropertyValue( aStrIsEmptyPresObj ) >>= bIsEmpty;
+ if( bIsEmpty )
+ continue;
+ }
+
+ OUString aDescription( getShapeDescription( xShape, true ) );
+ mxLBTrigger->append(OUString::number(nShape), aDescription);
+ auto nPos = mxLBTrigger->get_count() - 1;
+ if (xShape == xTrigger)
+ mxLBTrigger->set_active(nPos);
+ }
+}
+
+IMPL_LINK_NOARG(CustomAnimationDurationTabPage, implControlHdl, weld::ComboBox&, void)
+{
+ mxRBInteractive->set_active(true);
+ assert(!mxRBClickSequence->get_active());
+}
+
+IMPL_LINK_NOARG(CustomAnimationDurationTabPage, DurationModifiedHdl, weld::MetricSpinButton&, void)
+{
+ if (!mxCBXDuration->get_text().isEmpty())
+ {
+ double duration_value = static_cast<double>(mxCBXDuration->get_value(FieldUnit::NONE));
+ if(duration_value <= 0.0)
+ mxCBXDuration->set_value(1, FieldUnit::NONE);
+ else
+ mxCBXDuration->set_value(duration_value, FieldUnit::NONE);
+ }
+}
+
+void CustomAnimationDurationTabPage::update( STLPropertySet* pSet )
+{
+ auto nPos = mxLBStart->get_active();
+ if (nPos != -1)
+ {
+ sal_Int16 nStart;
+ sal_Int16 nOldStart = -1;
+
+ switch( nPos )
+ {
+ case 1: nStart = EffectNodeType::WITH_PREVIOUS; break;
+ case 2: nStart = EffectNodeType::AFTER_PREVIOUS; break;
+ default:
+ nStart = EffectNodeType::ON_CLICK; break;
+ }
+
+ if(mpSet->getPropertyState( nHandleStart ) != STLPropertyState::Ambiguous)
+ mpSet->getPropertyValue( nHandleStart ) >>= nOldStart;
+
+ if( nStart != nOldStart )
+ pSet->setPropertyValue( nHandleStart, Any( nStart ) );
+ }
+
+ {
+ double fBegin = static_cast<double>(mxMFStartDelay->get_value(FieldUnit::NONE)) / 10.0;
+ double fOldBegin = -1.0;
+
+ if( mpSet->getPropertyState( nHandleBegin ) != STLPropertyState::Ambiguous )
+ mpSet->getPropertyValue( nHandleBegin ) >>= fOldBegin;
+
+ if( fBegin != fOldBegin )
+ pSet->setPropertyValue( nHandleBegin, Any( fBegin ) );
+ }
+
+ nPos = mxCBRepeat->get_active();
+ if (nPos != -1 || !mxCBRepeat->get_active_text().isEmpty())
+ {
+ Any aRepeatCount;
+ Any aEnd;
+
+ switch( nPos )
+ {
+ case 0:
+ break;
+
+ case 6:
+ {
+ Event aEvent;
+ aEvent.Trigger = EventTrigger::ON_NEXT;
+ aEvent.Repeat = 0;
+ aEnd <<= aEvent;
+ }
+ [[fallthrough]];
+ case 7:
+ aRepeatCount <<= Timing_INDEFINITE;
+ break;
+ default:
+ {
+ OUString aText(mxCBRepeat->get_text(nPos));
+ if( !aText.isEmpty() )
+ aRepeatCount <<= aText.toDouble();
+ }
+ }
+
+ Any aOldRepeatCount( aRepeatCount );
+ if( mpSet->getPropertyState( nHandleRepeat ) != STLPropertyState::Ambiguous )
+ aOldRepeatCount = mpSet->getPropertyValue( nHandleRepeat );
+
+ if( aRepeatCount != aOldRepeatCount )
+ pSet->setPropertyValue( nHandleRepeat, aRepeatCount );
+
+ Any aOldEnd( aEnd );
+ if( mpSet->getPropertyState( nHandleEnd ) != STLPropertyState::Ambiguous )
+ aOldEnd = mpSet->getPropertyValue( nHandleEnd );
+
+ if( aEnd != aOldEnd )
+ pSet->setPropertyValue( nHandleEnd, aEnd );
+ }
+
+ double fDuration = -1.0;
+
+ if (!mxCBXDuration->get_text().isEmpty())
+ {
+ double duration_value = static_cast<double>(mxCBXDuration->get_value(FieldUnit::NONE));
+
+ if(duration_value > 0)
+ fDuration = duration_value/100.0;
+ }
+
+ if( fDuration != -1.0 )
+ {
+ double fOldDuration = -1;
+
+ if( mpSet->getPropertyState( nHandleDuration ) != STLPropertyState::Ambiguous )
+ mpSet->getPropertyValue( nHandleDuration ) >>= fOldDuration;
+
+ if( fDuration != fOldDuration )
+ pSet->setPropertyValue( nHandleDuration, Any( fDuration ) );
+ }
+
+ if (mxCBXRewind->get_state() != TRISTATE_INDET)
+ {
+ sal_Int16 nFill = mxCBXRewind->get_active() ? AnimationFill::REMOVE : AnimationFill::HOLD;
+
+ bool bSet = true;
+
+ if( mpSet->getPropertyState( nHandleRewind ) != STLPropertyState::Ambiguous )
+ {
+ sal_Int16 nOldFill = 0;
+ mpSet->getPropertyValue( nHandleRewind ) >>= nOldFill;
+ bSet = nFill != nOldFill;
+ }
+
+ if( bSet )
+ pSet->setPropertyValue( nHandleRewind, Any( nFill ) );
+ }
+
+ Reference< XShape > xTrigger;
+
+ if (mxRBInteractive->get_active())
+ {
+ nPos = mxLBTrigger->get_active();
+ if (nPos != -1)
+ {
+ sal_Int32 nShape = mxLBTrigger->get_id(nPos).toInt32();
+
+ Reference< XDrawPage > xCurrentPage;
+ mpSet->getPropertyValue( nHandleCurrentPage ) >>= xCurrentPage;
+
+ if( xCurrentPage.is() && (nShape >= 0) && (nShape < xCurrentPage->getCount()) )
+ xCurrentPage->getByIndex( nShape ) >>= xTrigger;
+ }
+ }
+
+ if (xTrigger.is() || mxRBClickSequence->get_active())
+ {
+ Any aNewValue( xTrigger );
+ Any aOldValue;
+
+ if( mpSet->getPropertyState( nHandleTrigger ) != STLPropertyState::Ambiguous )
+ aOldValue = mpSet->getPropertyValue( nHandleTrigger );
+
+ if( aNewValue != aOldValue )
+ pSet->setPropertyValue( nHandleTrigger, aNewValue );
+ }
+}
+
+class CustomAnimationTextAnimTabPage
+{
+public:
+ CustomAnimationTextAnimTabPage(weld::Container* pParent, const STLPropertySet* pSet);
+
+ void update( STLPropertySet* pSet );
+
+ void updateControlStates();
+ DECL_LINK(implSelectHdl, weld::ComboBox&, void);
+
+private:
+ const STLPropertySet* mpSet;
+ bool mbHasVisibleShapes;
+
+ std::unique_ptr<weld::Builder> mxBuilder;
+ std::unique_ptr<weld::Container> mxContainer;
+ std::unique_ptr<weld::Label> mxFTGroupText;
+ std::unique_ptr<weld::ComboBox> mxLBGroupText;
+ std::unique_ptr<weld::CheckButton> mxCBXGroupAuto;
+ std::unique_ptr<weld::MetricSpinButton> mxMFGroupAuto;
+ std::unique_ptr<weld::CheckButton> mxCBXAnimateForm;
+ std::unique_ptr<weld::CheckButton> mxCBXReverse;
+};
+
+CustomAnimationTextAnimTabPage::CustomAnimationTextAnimTabPage(weld::Container* pParent, const STLPropertySet* pSet)
+ : mpSet(pSet)
+ , mbHasVisibleShapes(true)
+ , mxBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/customanimationtexttab.ui"))
+ , mxContainer(mxBuilder->weld_container("TextAnimationTab"))
+ , mxFTGroupText(mxBuilder->weld_label("group_text_label"))
+ , mxLBGroupText(mxBuilder->weld_combo_box("group_text_list"))
+ , mxCBXGroupAuto(mxBuilder->weld_check_button("auto_after"))
+ , mxMFGroupAuto(mxBuilder->weld_metric_spin_button("auto_after_value",FieldUnit::SECOND))
+ , mxCBXAnimateForm(mxBuilder->weld_check_button("animate_shape"))
+ , mxCBXReverse(mxBuilder->weld_check_button("reverse_order"))
+{
+ mxLBGroupText->connect_changed(LINK(this, CustomAnimationTextAnimTabPage, implSelectHdl));
+
+ if( pSet->getPropertyState( nHandleTextGrouping ) != STLPropertyState::Ambiguous )
+ {
+ sal_Int32 nTextGrouping = 0;
+ if( pSet->getPropertyValue( nHandleTextGrouping ) >>= nTextGrouping )
+ mxLBGroupText->set_active(nTextGrouping + 1);
+ }
+
+ if( pSet->getPropertyState( nHandleHasVisibleShape ) != STLPropertyState::Ambiguous )
+ pSet->getPropertyValue( nHandleHasVisibleShape ) >>= mbHasVisibleShapes;
+
+ if( pSet->getPropertyState( nHandleTextGroupingAuto ) != STLPropertyState::Ambiguous )
+ {
+ double fTextGroupingAuto = 0.0;
+ if( pSet->getPropertyValue( nHandleTextGroupingAuto ) >>= fTextGroupingAuto )
+ {
+ mxCBXGroupAuto->set_active(fTextGroupingAuto >= 0.0);
+ if( fTextGroupingAuto >= 0.0 )
+ mxMFGroupAuto->set_value(static_cast<::tools::Long>(fTextGroupingAuto*10), FieldUnit::NONE);
+ }
+ }
+ else
+ {
+ mxCBXGroupAuto->set_state( TRISTATE_INDET );
+ }
+
+ mxCBXAnimateForm->set_state( TRISTATE_INDET );
+ if( pSet->getPropertyState( nHandleAnimateForm ) != STLPropertyState::Ambiguous )
+ {
+ bool bAnimateForm = false;
+ if( pSet->getPropertyValue( nHandleAnimateForm ) >>= bAnimateForm )
+ {
+ mxCBXAnimateForm->set_active( bAnimateForm );
+ }
+ }
+ else
+ {
+ mxCBXAnimateForm->set_sensitive(false);
+ }
+
+ mxCBXReverse->set_state(TRISTATE_INDET);
+ if( pSet->getPropertyState( nHandleTextReverse ) != STLPropertyState::Ambiguous )
+ {
+ bool bTextReverse = false;
+ if( pSet->getPropertyValue( nHandleTextReverse ) >>= bTextReverse )
+ {
+ mxCBXReverse->set_active( bTextReverse );
+ }
+ }
+
+ if( pSet->getPropertyState( nHandleMaxParaDepth ) == STLPropertyState::Direct )
+ {
+ sal_Int32 nMaxParaDepth = 0;
+ pSet->getPropertyValue( nHandleMaxParaDepth ) >>= nMaxParaDepth;
+ nMaxParaDepth += 1;
+
+ sal_Int32 nPos = 6;
+ while( (nPos > 2) && (nPos > nMaxParaDepth) )
+ {
+ mxLBGroupText->remove(nPos);
+ nPos--;
+ }
+ }
+
+ updateControlStates();
+}
+
+void CustomAnimationTextAnimTabPage::update( STLPropertySet* pSet )
+{
+ auto nPos = mxLBGroupText->get_active();
+ if (nPos != -1)
+ {
+ sal_Int32 nTextGrouping = nPos - 1;
+ sal_Int32 nOldGrouping = -2;
+
+ if(mpSet->getPropertyState( nHandleTextGrouping ) != STLPropertyState::Ambiguous)
+ mpSet->getPropertyValue( nHandleTextGrouping ) >>= nOldGrouping;
+
+ if( nTextGrouping != nOldGrouping )
+ pSet->setPropertyValue( nHandleTextGrouping, Any( nTextGrouping ) );
+ }
+
+ if (nPos != 0)
+ {
+ bool bTextReverse = mxCBXReverse->get_active();
+ bool bOldTextReverse = !bTextReverse;
+
+ if(mpSet->getPropertyState( nHandleTextReverse ) != STLPropertyState::Ambiguous)
+ mpSet->getPropertyValue( nHandleTextReverse ) >>= bOldTextReverse;
+
+ if( bTextReverse != bOldTextReverse )
+ pSet->setPropertyValue( nHandleTextReverse, Any( bTextReverse ) );
+
+ if( nPos > 1 )
+ {
+ double fTextGroupingAuto = mxCBXGroupAuto->get_active() ? mxMFGroupAuto->get_value(FieldUnit::NONE) / 10.0 : -1.0;
+ double fOldTextGroupingAuto = -2.0;
+
+ if(mpSet->getPropertyState( nHandleTextGroupingAuto ) != STLPropertyState::Ambiguous)
+ mpSet->getPropertyValue( nHandleTextGroupingAuto ) >>= fOldTextGroupingAuto;
+
+ if( fTextGroupingAuto != fOldTextGroupingAuto )
+ pSet->setPropertyValue( nHandleTextGroupingAuto, Any( fTextGroupingAuto ) );
+ }
+ }
+ //#i120049# impress crashes when modifying the "Random effects" animation
+ //effect's trigger condition to "Start effect on click of".
+ //If this control is disabled, we should ignore its value
+ if (mxCBXAnimateForm->get_sensitive())
+ {
+ bool bAnimateForm = mxCBXAnimateForm->get_active();
+ bool bOldAnimateForm = !bAnimateForm;
+
+ if(mpSet->getPropertyState( nHandleAnimateForm ) != STLPropertyState::Ambiguous)
+ mpSet->getPropertyValue( nHandleAnimateForm ) >>= bOldAnimateForm;
+
+ if( bAnimateForm != bOldAnimateForm )
+ pSet->setPropertyValue( nHandleAnimateForm, Any( bAnimateForm ) );
+ }
+}
+
+void CustomAnimationTextAnimTabPage::updateControlStates()
+{
+ auto nPos = mxLBGroupText->get_active();
+
+ mxCBXGroupAuto->set_sensitive( nPos > 1 );
+ mxMFGroupAuto->set_sensitive( nPos > 1 );
+ mxCBXReverse->set_sensitive( nPos > 0 );
+
+ if( !mbHasVisibleShapes && nPos > 0 )
+ {
+ mxCBXAnimateForm->set_active(false);
+ mxCBXAnimateForm->set_sensitive(false);
+ }
+ else
+ {
+ mxCBXAnimateForm->set_sensitive(true);
+ }
+}
+
+IMPL_LINK_NOARG(CustomAnimationTextAnimTabPage, implSelectHdl, weld::ComboBox&, void)
+{
+ updateControlStates();
+}
+
+CustomAnimationDialog::CustomAnimationDialog(weld::Window* pParent, std::unique_ptr<STLPropertySet> pSet, const OString& rPage)
+ : GenericDialogController(pParent, "modules/simpress/ui/customanimationproperties.ui", "CustomAnimationProperties")
+ , mxSet(std::move(pSet))
+ , mxTabControl(m_xBuilder->weld_notebook("tabcontrol"))
+ , mxDurationTabPage(new CustomAnimationDurationTabPage(mxTabControl->get_page("timing"), mxSet.get()))
+ , mxEffectTabPage(new CustomAnimationEffectTabPage(mxTabControl->get_page("effect"), m_xDialog.get(), mxSet.get()))
+{
+ bool bHasText = false;
+ if( mxSet->getPropertyState( nHandleHasText ) != STLPropertyState::Ambiguous )
+ mxSet->getPropertyValue( nHandleHasText ) >>= bHasText;
+
+ if( bHasText )
+ {
+ mxTextAnimTabPage.reset(new CustomAnimationTextAnimTabPage(mxTabControl->get_page("textanim"), mxSet.get()));
+ }
+ else
+ {
+ mxTabControl->remove_page("textanim");
+ }
+
+ if (!rPage.isEmpty())
+ mxTabControl->set_current_page(rPage);
+}
+
+CustomAnimationDialog::~CustomAnimationDialog()
+{
+}
+
+STLPropertySet* CustomAnimationDialog::getResultSet()
+{
+ mxResultSet = createDefaultSet();
+
+ mxEffectTabPage->update( mxResultSet.get() );
+ mxDurationTabPage->update( mxResultSet.get() );
+ if (mxTextAnimTabPage)
+ mxTextAnimTabPage->update( mxResultSet.get() );
+
+ return mxResultSet.get();
+}
+
+std::unique_ptr<STLPropertySet> CustomAnimationDialog::createDefaultSet()
+{
+ Any aEmpty;
+
+ std::unique_ptr<STLPropertySet> pSet(new STLPropertySet());
+ pSet->setPropertyDefaultValue( nHandleMaxParaDepth, Any( sal_Int32(-1) ) );
+
+ pSet->setPropertyDefaultValue( nHandleHasAfterEffect, Any( false ) );
+ pSet->setPropertyDefaultValue( nHandleAfterEffectOnNextEffect, Any( false ) );
+ pSet->setPropertyDefaultValue( nHandleDimColor, aEmpty );
+ pSet->setPropertyDefaultValue( nHandleIterateType, Any( sal_Int16(0) ) );
+ pSet->setPropertyDefaultValue( nHandleIterateInterval, Any( 0.0 ) );
+
+ pSet->setPropertyDefaultValue( nHandleStart, Any( sal_Int16(EffectNodeType::ON_CLICK) ) );
+ pSet->setPropertyDefaultValue( nHandleBegin, Any( 0.0 ) );
+ pSet->setPropertyDefaultValue( nHandleDuration, Any( 2.0 ) );
+ pSet->setPropertyDefaultValue( nHandleRepeat, aEmpty );
+ pSet->setPropertyDefaultValue( nHandleRewind, Any( AnimationFill::HOLD ) );
+
+ pSet->setPropertyDefaultValue( nHandleEnd, aEmpty );
+
+ pSet->setPropertyDefaultValue( nHandlePresetId, aEmpty );
+ pSet->setPropertyDefaultValue( nHandleProperty1Type, Any( nPropertyTypeNone ) );
+ pSet->setPropertyDefaultValue( nHandleProperty1Value, aEmpty );
+ pSet->setPropertyDefaultValue( nHandleProperty2Type, Any( nPropertyTypeNone ) );
+ pSet->setPropertyDefaultValue( nHandleProperty2Value, aEmpty );
+ pSet->setPropertyDefaultValue( nHandleAccelerate, aEmpty );
+ pSet->setPropertyDefaultValue( nHandleDecelerate, aEmpty );
+ pSet->setPropertyDefaultValue( nHandleAutoReverse, aEmpty );
+ pSet->setPropertyDefaultValue( nHandleTrigger, aEmpty );
+
+ pSet->setPropertyDefaultValue( nHandleHasText, Any( false ) );
+ pSet->setPropertyDefaultValue( nHandleHasVisibleShape, Any( false ) );
+ pSet->setPropertyDefaultValue( nHandleTextGrouping, Any( sal_Int32(-1) ) );
+ pSet->setPropertyDefaultValue( nHandleAnimateForm, Any( true ) );
+ pSet->setPropertyDefaultValue( nHandleTextGroupingAuto, Any( -1.0 ) );
+ pSet->setPropertyDefaultValue( nHandleTextReverse, Any( false ) );
+
+ pSet->setPropertyDefaultValue( nHandleCurrentPage, aEmpty );
+
+ pSet->setPropertyDefaultValue( nHandleSoundURL, aEmpty );
+ pSet->setPropertyDefaultValue( nHandleSoundVolume, Any( 1.0) );
+ pSet->setPropertyDefaultValue( nHandleSoundEndAfterSlide, Any( sal_Int32(0) ) );
+
+ pSet->setPropertyDefaultValue( nHandleCommand, Any( sal_Int16(0) ) );
+ return pSet;
+}
+
+std::unique_ptr<SdPropertySubControl> SdPropertySubControl::create(sal_Int32 nType, weld::Label* pLabel, weld::Container* pParent, weld::Window* pTopLevel, const Any& rValue, const OUString& rPresetId, const Link<LinkParamNone*,void>& rModifyHdl)
+{
+ std::unique_ptr<SdPropertySubControl> pSubControl;
+ switch( nType )
+ {
+ case nPropertyTypeDirection:
+ case nPropertyTypeSpokes:
+ case nPropertyTypeZoom:
+ pSubControl.reset( new SdPresetPropertyBox( pLabel, pParent, rValue, rPresetId, rModifyHdl ) );
+ break;
+
+ case nPropertyTypeColor:
+ case nPropertyTypeFillColor:
+ case nPropertyTypeFirstColor:
+ case nPropertyTypeCharColor:
+ case nPropertyTypeLineColor:
+ pSubControl.reset( new SdColorPropertyBox( pLabel, pParent, pTopLevel, rValue, rModifyHdl ) );
+ break;
+
+ case nPropertyTypeFont:
+ pSubControl.reset( new SdFontPropertyBox( pLabel, pParent, rValue, rModifyHdl ) );
+ break;
+
+ case nPropertyTypeCharHeight:
+ pSubControl.reset( new SdCharHeightPropertyBox( pLabel, pParent, rValue, rModifyHdl ) );
+ break;
+
+ case nPropertyTypeRotate:
+ pSubControl.reset( new SdRotationPropertyBox( pLabel, pParent, rValue, rModifyHdl ) );
+ break;
+
+ case nPropertyTypeTransparency:
+ pSubControl.reset( new SdTransparencyPropertyBox( pLabel, pParent, rValue, rModifyHdl ) );
+ break;
+
+ case nPropertyTypeScale:
+ pSubControl.reset( new SdScalePropertyBox( pLabel, pParent, rValue, rModifyHdl ) );
+ break;
+
+ case nPropertyTypeCharDecoration:
+ pSubControl.reset( new SdFontStylePropertyBox( pLabel, pParent, rValue, rModifyHdl ) );
+ break;
+ }
+
+ return pSubControl;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/animations/CustomAnimationDialog.hxx b/sd/source/ui/animations/CustomAnimationDialog.hxx
new file mode 100644
index 000000000..b8a8abcff
--- /dev/null
+++ b/sd/source/ui/animations/CustomAnimationDialog.hxx
@@ -0,0 +1,141 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/weld.hxx>
+
+namespace sd {
+
+// property handles
+const sal_Int32 nHandleSound = 0;
+const sal_Int32 nHandleHasAfterEffect = 1;
+const sal_Int32 nHandleIterateType = 2;
+const sal_Int32 nHandleIterateInterval = 3;
+const sal_Int32 nHandleStart = 4;
+const sal_Int32 nHandleBegin = 5;
+const sal_Int32 nHandleDuration = 6;
+const sal_Int32 nHandleRepeat = 7;
+const sal_Int32 nHandleRewind = 8;
+const sal_Int32 nHandleEnd = 9;
+const sal_Int32 nHandleAfterEffectOnNextEffect = 10;
+const sal_Int32 nHandleDimColor = 11;
+const sal_Int32 nHandleMaxParaDepth = 12;
+const sal_Int32 nHandlePresetId = 13;
+const sal_Int32 nHandleProperty1Type = 14;
+const sal_Int32 nHandleProperty1Value = 15;
+const sal_Int32 nHandleProperty2Type = 16;
+const sal_Int32 nHandleProperty2Value = 17;
+
+const sal_Int32 nHandleAccelerate = 18;
+const sal_Int32 nHandleDecelerate = 19;
+const sal_Int32 nHandleAutoReverse = 20;
+const sal_Int32 nHandleTrigger = 21;
+
+const sal_Int32 nHandleHasText = 22;
+const sal_Int32 nHandleTextGrouping = 23;
+const sal_Int32 nHandleAnimateForm = 24;
+const sal_Int32 nHandleTextGroupingAuto = 25;
+const sal_Int32 nHandleTextReverse = 26;
+
+const sal_Int32 nHandleCurrentPage = 27;
+const sal_Int32 nHandleSoundURL = 28;
+const sal_Int32 nHandleSoundVolume = 29;
+const sal_Int32 nHandleSoundEndAfterSlide = 30;
+
+const sal_Int32 nHandleCommand = 31;
+
+const sal_Int32 nHandleHasVisibleShape = 32;
+
+const sal_Int32 nPropertyTypeNone = 0;
+const sal_Int32 nPropertyTypeDirection = 1;
+const sal_Int32 nPropertyTypeSpokes = 2;
+const sal_Int32 nPropertyTypeFirstColor = 3;
+const sal_Int32 nPropertyTypeSecondColor = 4;
+const sal_Int32 nPropertyTypeZoom = 5;
+const sal_Int32 nPropertyTypeFillColor = 6;
+const sal_Int32 nPropertyTypeColorStyle = 7;
+const sal_Int32 nPropertyTypeFont = 8;
+const sal_Int32 nPropertyTypeCharHeight = 9;
+const sal_Int32 nPropertyTypeCharColor = 10;
+const sal_Int32 nPropertyTypeCharHeightStyle = 11;
+const sal_Int32 nPropertyTypeCharDecoration = 12;
+const sal_Int32 nPropertyTypeLineColor = 13;
+const sal_Int32 nPropertyTypeRotate = 14;
+const sal_Int32 nPropertyTypeColor = 15;
+const sal_Int32 nPropertyTypeAccelerate = 16;
+const sal_Int32 nPropertyTypeDecelerate = 17;
+const sal_Int32 nPropertyTypeAutoReverse = 18;
+const sal_Int32 nPropertyTypeTransparency = 19;
+const sal_Int32 nPropertyTypeFontStyle = 20;
+const sal_Int32 nPropertyTypeScale = 21;
+
+class SdPropertySubControl
+{
+public:
+ explicit SdPropertySubControl(weld::Container* pParent);
+ virtual ~SdPropertySubControl();
+
+ virtual css::uno::Any getValue() = 0;
+ virtual void setValue( const css::uno::Any& rValue, const OUString& rPresetId ) = 0;
+
+ static std::unique_ptr<SdPropertySubControl>
+ create( sal_Int32 nType,
+ weld::Label* pLabel,
+ weld::Container* pParent,
+ weld::Window* pTopLevel,
+ const css::uno::Any& rValue,
+ const OUString& rPresetId,
+ const Link<LinkParamNone*,void>& rModifyHdl );
+
+protected:
+ std::unique_ptr<weld::Builder> mxBuilder;
+ std::unique_ptr<weld::Container> mxContainer;
+ weld::Container* mpParent;
+};
+
+class CustomAnimationDurationTabPage;
+class CustomAnimationEffectTabPage;
+class CustomAnimationTextAnimTabPage;
+class STLPropertySet;
+
+class CustomAnimationDialog : public weld::GenericDialogController
+{
+public:
+ CustomAnimationDialog(weld::Window* pParent, std::unique_ptr<STLPropertySet> pSet, const OString& Page);
+ virtual ~CustomAnimationDialog() override;
+
+ STLPropertySet* getResultSet();
+ STLPropertySet* getPropertySet() const { return mxSet.get(); }
+
+ static std::unique_ptr<STLPropertySet> createDefaultSet();
+
+private:
+ std::unique_ptr<STLPropertySet> mxSet;
+ std::unique_ptr<STLPropertySet> mxResultSet;
+
+ std::unique_ptr<weld::Notebook> mxTabControl;
+ std::unique_ptr<CustomAnimationDurationTabPage> mxDurationTabPage;
+ std::unique_ptr<CustomAnimationEffectTabPage> mxEffectTabPage;
+ std::unique_ptr<CustomAnimationTextAnimTabPage> mxTextAnimTabPage;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/animations/CustomAnimationList.cxx b/sd/source/ui/animations/CustomAnimationList.cxx
new file mode 100644
index 000000000..cc85ed74f
--- /dev/null
+++ b/sd/source/ui/animations/CustomAnimationList.cxx
@@ -0,0 +1,1231 @@
+/* -*- 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 <com/sun/star/document/XActionLockable.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/drawing/XShapes.hpp>
+#include <com/sun/star/presentation/ShapeAnimationSubType.hpp>
+#include <com/sun/star/presentation/EffectNodeType.hpp>
+#include <com/sun/star/presentation/ParagraphTarget.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/presentation/EffectPresetClass.hpp>
+#include <com/sun/star/presentation/EffectCommands.hpp>
+#include <com/sun/star/text/XTextRange.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <comphelper/scopeguard.hxx>
+#include <CustomAnimationList.hxx>
+#include <CustomAnimationPreset.hxx>
+#include <vcl/commandevent.hxx>
+#include <vcl/event.hxx>
+#include <vcl/image.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weldutils.hxx>
+#include <tools/debug.hxx>
+#include <tools/gen.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <sdresid.hxx>
+
+#include <strings.hrc>
+#include <bitmaps.hlst>
+
+#include <algorithm>
+#include <memory>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::presentation;
+
+using ::com::sun::star::uno::UNO_QUERY;
+using ::com::sun::star::uno::UNO_QUERY_THROW;
+using ::com::sun::star::uno::Any;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::Exception;
+using ::com::sun::star::uno::XInterface;
+using ::com::sun::star::text::XTextRange;
+using ::com::sun::star::drawing::XShape;
+using ::com::sun::star::drawing::XShapes;
+using ::com::sun::star::drawing::XDrawPage;
+using ::com::sun::star::container::XChild;
+using ::com::sun::star::container::XIndexAccess;
+using ::com::sun::star::container::XEnumerationAccess;
+using ::com::sun::star::container::XEnumeration;
+using ::com::sun::star::beans::XPropertySet;
+using ::com::sun::star::beans::XPropertySetInfo;
+
+namespace sd {
+
+// go recursively through all shapes in the given XShapes collection and return true as soon as the
+// given shape is found. nIndex is incremented for each shape with the same shape type as the given
+// shape is found until the given shape is found.
+static bool getShapeIndex( const Reference< XShapes >& xShapes, const Reference< XShape >& xShape, sal_Int32& nIndex )
+{
+ const sal_Int32 nCount = xShapes->getCount();
+ sal_Int32 n;
+ for( n = 0; n < nCount; n++ )
+ {
+ Reference< XShape > xChild;
+ xShapes->getByIndex( n ) >>= xChild;
+ if( xChild == xShape )
+ return true;
+
+ if( xChild->getShapeType() == xShape->getShapeType() )
+ nIndex++;
+
+ Reference< XShapes > xChildContainer( xChild, UNO_QUERY );
+ if( xChildContainer.is() )
+ {
+ if( getShapeIndex( xChildContainer, xShape, nIndex ) )
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// returns the index of the shape type from the given shape
+static sal_Int32 getShapeIndex( const Reference< XShape >& xShape )
+{
+ Reference< XChild > xChild( xShape, UNO_QUERY );
+ Reference< XShapes > xPage;
+
+ while( xChild.is() && !xPage.is() )
+ {
+ Reference< XInterface > x( xChild->getParent() );
+ xChild.set( x, UNO_QUERY );
+ Reference< XDrawPage > xTestPage( x, UNO_QUERY );
+ if( xTestPage.is() )
+ xPage.set( x, UNO_QUERY );
+ }
+
+ sal_Int32 nIndex = 1;
+
+ if( xPage.is() && getShapeIndex( xPage, xShape, nIndex ) )
+ return nIndex;
+ else
+ return -1;
+}
+
+OUString getShapeDescription( const Reference< XShape >& xShape, bool bWithText )
+{
+ OUString aDescription;
+ Reference< XPropertySet > xSet( xShape, UNO_QUERY );
+ bool bAppendIndex = true;
+
+ if(xSet.is()) try
+ {
+ Reference<XPropertySetInfo> xInfo(xSet->getPropertySetInfo());
+ if (xInfo.is())
+ {
+ static const OUStringLiteral aPropName1(u"Name");
+ if(xInfo->hasPropertyByName(aPropName1))
+ xSet->getPropertyValue(aPropName1) >>= aDescription;
+
+ bAppendIndex = aDescription.isEmpty();
+
+ static const OUStringLiteral aPropName2(u"UINameSingular");
+ if(xInfo->hasPropertyByName(aPropName2))
+ xSet->getPropertyValue(aPropName2) >>= aDescription;
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::getShapeDescription()" );
+ }
+
+ if (bAppendIndex)
+ {
+ aDescription += " " + OUString::number(getShapeIndex(xShape));
+ }
+
+ if( bWithText )
+ {
+ Reference< XTextRange > xText( xShape, UNO_QUERY );
+ if( xText.is() )
+ {
+ OUString aText( xText->getString() );
+ if( !aText.isEmpty() )
+ {
+ aDescription += ": ";
+
+ aText = aText.replace( '\n', ' ' );
+ aText = aText.replace( '\r', ' ' );
+
+ aDescription += aText;
+ }
+ }
+ }
+ return aDescription;
+}
+
+static OUString getDescription( const Any& rTarget, bool bWithText )
+{
+ OUString aDescription;
+
+ if( rTarget.getValueType() == ::cppu::UnoType<ParagraphTarget>::get() )
+ {
+ ParagraphTarget aParaTarget;
+ rTarget >>= aParaTarget;
+
+ css::uno::Reference<css::document::XActionLockable> xLockable(aParaTarget.Shape, css::uno::UNO_QUERY);
+ if (xLockable.is())
+ xLockable->addActionLock();
+ comphelper::ScopeGuard aGuard([&xLockable]()
+ {
+ if (xLockable.is())
+ xLockable->removeActionLock();
+ });
+
+ Reference< XEnumerationAccess > xText( aParaTarget.Shape, UNO_QUERY_THROW );
+ Reference< XEnumeration > xEnumeration( xText->createEnumeration(), css::uno::UNO_SET_THROW );
+ sal_Int32 nPara = aParaTarget.Paragraph;
+
+ while( xEnumeration->hasMoreElements() && nPara )
+ {
+ xEnumeration->nextElement();
+ nPara--;
+ }
+
+ DBG_ASSERT( xEnumeration->hasMoreElements(), "sd::CustomAnimationEffect::prepareText(), paragraph out of range!" );
+
+ if( xEnumeration->hasMoreElements() )
+ {
+ Reference< XTextRange > xParagraph;
+ xEnumeration->nextElement() >>= xParagraph;
+
+ if( xParagraph.is() )
+ aDescription = xParagraph->getString();
+ }
+ }
+ else
+ {
+ Reference< XShape > xShape;
+ rTarget >>= xShape;
+ if( xShape.is() )
+ aDescription = getShapeDescription( xShape, bWithText );
+ }
+
+ return aDescription;
+}
+
+class CustomAnimationListEntryItem
+{
+public:
+ CustomAnimationListEntryItem(const OUString& aDescription,
+ const CustomAnimationEffectPtr& pEffect);
+ const CustomAnimationEffectPtr& getEffect() const { return mpEffect; }
+
+ Size GetSize(const vcl::RenderContext& rRenderContext);
+ void Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect, bool bSelected);
+ void PaintEffect(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect, bool bSelected);
+ void PaintTrigger(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect);
+
+private:
+ OUString msDescription;
+ OUString msEffectName;
+ CustomAnimationEffectPtr mpEffect;
+
+public:
+ static const ::tools::Long nIconWidth = 19;
+ static const ::tools::Long nItemMinHeight = 38;
+};
+
+CustomAnimationListEntryItem::CustomAnimationListEntryItem(const OUString& aDescription, const CustomAnimationEffectPtr& pEffect)
+ : msDescription(aDescription)
+ , mpEffect(pEffect)
+{
+ if (!mpEffect)
+ return;
+ switch (mpEffect->getPresetClass())
+ {
+ case EffectPresetClass::ENTRANCE:
+ msEffectName = SdResId(STR_CUSTOMANIMATION_ENTRANCE); break;
+ case EffectPresetClass::EXIT:
+ msEffectName = SdResId(STR_CUSTOMANIMATION_EXIT); break;
+ case EffectPresetClass::EMPHASIS:
+ msEffectName = SdResId(STR_CUSTOMANIMATION_EMPHASIS); break;
+ case EffectPresetClass::MOTIONPATH:
+ msEffectName = SdResId(STR_CUSTOMANIMATION_MOTION_PATHS); break;
+ default:
+ msEffectName = SdResId(STR_CUSTOMANIMATION_MISC); break;
+ }
+ msEffectName = msEffectName.replaceFirst( "%1" , CustomAnimationPresets::getCustomAnimationPresets().getUINameForPresetId(mpEffect->getPresetId()));
+}
+
+IMPL_STATIC_LINK(CustomAnimationList, CustomRenderHdl, weld::TreeView::render_args, aPayload, void)
+{
+ vcl::RenderContext& rRenderContext = std::get<0>(aPayload);
+ const ::tools::Rectangle& rRect = std::get<1>(aPayload);
+ bool bSelected = std::get<2>(aPayload);
+ const OUString& rId = std::get<3>(aPayload);
+
+ CustomAnimationListEntryItem* pItem = weld::fromId<CustomAnimationListEntryItem*>(rId);
+
+ pItem->Paint(rRenderContext, rRect, bSelected);
+}
+
+IMPL_STATIC_LINK(CustomAnimationList, CustomGetSizeHdl, weld::TreeView::get_size_args, aPayload, Size)
+{
+ vcl::RenderContext& rRenderContext = aPayload.first;
+ const OUString& rId = aPayload.second;
+
+ CustomAnimationListEntryItem* pItem = weld::fromId<CustomAnimationListEntryItem*>(rId);
+ if (!pItem)
+ return Size(CustomAnimationListEntryItem::nIconWidth, CustomAnimationListEntryItem::nItemMinHeight);
+ return pItem->GetSize(rRenderContext);
+}
+
+Size CustomAnimationListEntryItem::GetSize(const vcl::RenderContext& rRenderContext)
+{
+ auto width = rRenderContext.GetTextWidth( msDescription ) + nIconWidth;
+ if (width < (rRenderContext.GetTextWidth( msEffectName ) + 2*nIconWidth))
+ width = rRenderContext.GetTextWidth( msEffectName ) + 2*nIconWidth;
+
+ Size aSize(width, rRenderContext.GetTextHeight());
+ if (aSize.Height() < nItemMinHeight)
+ aSize.setHeight(nItemMinHeight);
+ return aSize;
+}
+
+void CustomAnimationListEntryItem::PaintTrigger(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect)
+{
+ Size aSize(rRect.GetSize());
+
+ ::tools::Rectangle aOutRect(rRect);
+
+ // fill the background
+ Color aColor(rRenderContext.GetSettings().GetStyleSettings().GetDialogColor());
+
+ rRenderContext.Push();
+ rRenderContext.SetFillColor(aColor);
+ rRenderContext.SetLineColor();
+ rRenderContext.DrawRect(aOutRect);
+
+ // Erase the four corner pixels to make the rectangle appear rounded.
+ rRenderContext.SetLineColor(rRenderContext.GetSettings().GetStyleSettings().GetWindowColor());
+ rRenderContext.DrawPixel(aOutRect.TopLeft());
+ rRenderContext.DrawPixel(Point(aOutRect.Right(), aOutRect.Top()));
+ rRenderContext.DrawPixel(Point(aOutRect.Left(), aOutRect.Bottom()));
+ rRenderContext.DrawPixel(Point(aOutRect.Right(), aOutRect.Bottom()));
+
+ // draw the category title
+
+ int nVertBorder = ((aSize.Height() - rRenderContext.GetTextHeight()) >> 1);
+ int nHorzBorder = rRenderContext.LogicToPixel(Size(3, 3), MapMode(MapUnit::MapAppFont)).Width();
+
+ aOutRect.AdjustLeft(nHorzBorder );
+ aOutRect.AdjustRight( -nHorzBorder );
+ aOutRect.AdjustTop( nVertBorder );
+ aOutRect.AdjustBottom( -nVertBorder );
+
+ rRenderContext.DrawText(aOutRect, rRenderContext.GetEllipsisString(msDescription, aOutRect.GetWidth()));
+ rRenderContext.Pop();
+}
+
+void CustomAnimationListEntryItem::PaintEffect(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect, bool bSelected)
+{
+ rRenderContext.Push(vcl::PushFlags::TEXTCOLOR);
+ const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+ if (bSelected)
+ rRenderContext.SetTextColor(rStyleSettings.GetHighlightTextColor());
+ else
+ rRenderContext.SetTextColor(rStyleSettings.GetDialogTextColor());
+
+ Point aPos(rRect.TopLeft());
+ int nItemHeight = rRect.GetHeight();
+
+ sal_Int16 nNodeType = mpEffect->getNodeType();
+ if (nNodeType == EffectNodeType::ON_CLICK )
+ {
+ rRenderContext.DrawImage(aPos, Image(StockImage::Yes, BMP_CUSTOMANIMATION_ON_CLICK));
+ }
+ else if (nNodeType == EffectNodeType::AFTER_PREVIOUS)
+ {
+ rRenderContext.DrawImage(aPos, Image(StockImage::Yes, BMP_CUSTOMANIMATION_AFTER_PREVIOUS));
+ }
+ else if (nNodeType == EffectNodeType::WITH_PREVIOUS)
+ {
+ //FIXME With previous image not defined in CustomAnimation.src
+ }
+
+ aPos.AdjustX(nIconWidth);
+
+ //TODO, full width of widget ?
+ rRenderContext.DrawText(aPos, rRenderContext.GetEllipsisString(msDescription, rRect.GetWidth()));
+
+ aPos.AdjustY(nIconWidth);
+
+ OUString sImage;
+ switch (mpEffect->getPresetClass())
+ {
+ case EffectPresetClass::ENTRANCE:
+ sImage = BMP_CUSTOMANIMATION_ENTRANCE_EFFECT; break;
+ case EffectPresetClass::EXIT:
+ sImage = BMP_CUSTOMANIMATION_EXIT_EFFECT; break;
+ case EffectPresetClass::EMPHASIS:
+ sImage = BMP_CUSTOMANIMATION_EMPHASIS_EFFECT; break;
+ case EffectPresetClass::MOTIONPATH:
+ sImage = BMP_CUSTOMANIMATION_MOTION_PATH; break;
+ case EffectPresetClass::OLEACTION:
+ sImage = BMP_CUSTOMANIMATION_OLE; break;
+ case EffectPresetClass::MEDIACALL:
+ switch (mpEffect->getCommand())
+ {
+ case EffectCommands::TOGGLEPAUSE:
+ sImage = BMP_CUSTOMANIMATION_MEDIA_PAUSE; break;
+ case EffectCommands::STOP:
+ sImage = BMP_CUSTOMANIMATION_MEDIA_STOP; break;
+ case EffectCommands::PLAY:
+ default:
+ sImage = BMP_CUSTOMANIMATION_MEDIA_PLAY; break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (!sImage.isEmpty())
+ {
+ Image aImage(StockImage::Yes, sImage);
+ Point aImagePos(aPos);
+ aImagePos.AdjustY((nItemHeight/2 - aImage.GetSizePixel().Height()) >> 1 );
+ rRenderContext.DrawImage(aImagePos, aImage);
+ }
+
+ aPos.AdjustX(nIconWidth );
+ aPos.AdjustY((nItemHeight/2 - rRenderContext.GetTextHeight()) >> 1 );
+
+ rRenderContext.DrawText(aPos, rRenderContext.GetEllipsisString(msEffectName, rRect.GetWidth()));
+ rRenderContext.Pop();
+}
+
+void CustomAnimationListEntryItem::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect, bool bSelected)
+{
+ if (mpEffect)
+ PaintEffect(rRenderContext, rRect, bSelected);
+ else
+ PaintTrigger(rRenderContext, rRect);
+}
+
+CustomAnimationList::CustomAnimationList(std::unique_ptr<weld::TreeView> xTreeView,
+ std::unique_ptr<weld::Label> xLabel,
+ std::unique_ptr<weld::Widget> xScrolledWindow)
+ : mxTreeView(std::move(xTreeView))
+ , maDropTargetHelper(*this)
+ , mxEmptyLabel(std::move(xLabel))
+ , mxEmptyLabelParent(std::move(xScrolledWindow))
+ , mbIgnorePaint(false)
+ , mpController(nullptr)
+ , mnLastGroupId(0)
+ , mnPostExpandEvent(nullptr)
+ , mnPostCollapseEvent(nullptr)
+{
+ mxEmptyLabel->set_stack_background();
+
+ mxTreeView->set_selection_mode(SelectionMode::Multiple);
+ mxTreeView->connect_changed(LINK(this, CustomAnimationList, SelectHdl));
+ mxTreeView->connect_key_press(LINK(this, CustomAnimationList, KeyInputHdl));
+ mxTreeView->connect_popup_menu(LINK(this, CustomAnimationList, CommandHdl));
+ mxTreeView->connect_row_activated(LINK(this, CustomAnimationList, DoubleClickHdl));
+ mxTreeView->connect_expanding(LINK(this, CustomAnimationList, ExpandHdl));
+ mxTreeView->connect_collapsing(LINK(this, CustomAnimationList, CollapseHdl));
+ mxTreeView->connect_drag_begin(LINK(this, CustomAnimationList, DragBeginHdl));
+ mxTreeView->connect_custom_get_size(LINK(this, CustomAnimationList, CustomGetSizeHdl));
+ mxTreeView->connect_custom_render(LINK(this, CustomAnimationList, CustomRenderHdl));
+ mxTreeView->set_column_custom_renderer(0, true);
+}
+
+CustomAnimationListDropTarget::CustomAnimationListDropTarget(CustomAnimationList& rTreeView)
+ : DropTargetHelper(rTreeView.get_widget().get_drop_target())
+ , m_rTreeView(rTreeView)
+{
+}
+
+sal_Int8 CustomAnimationListDropTarget::AcceptDrop(const AcceptDropEvent& rEvt)
+{
+ sal_Int8 nAccept = m_rTreeView.AcceptDrop(rEvt);
+
+ if (nAccept != DND_ACTION_NONE)
+ {
+ // to enable the autoscroll when we're close to the edges
+ weld::TreeView& rWidget = m_rTreeView.get_widget();
+ rWidget.get_dest_row_at_pos(rEvt.maPosPixel, nullptr, true);
+ }
+
+ return nAccept;
+}
+
+sal_Int8 CustomAnimationListDropTarget::ExecuteDrop(const ExecuteDropEvent& rEvt)
+{
+ return m_rTreeView.ExecuteDrop(rEvt);
+}
+
+// D'n'D #1: Record selected effects for drag'n'drop.
+IMPL_LINK(CustomAnimationList, DragBeginHdl, bool&, rUnsetDragIcon, bool)
+{
+ rUnsetDragIcon = false;
+
+ // Record which effects are selected:
+ // Since NextSelected(..) iterates through the selected items in the order they
+ // were selected, create a sorted list for simpler drag'n'drop algorithms.
+ mDndEffectsSelected.clear();
+ mxTreeView->selected_foreach([this](weld::TreeIter& rEntry){
+ mDndEffectsSelected.emplace_back(mxTreeView->make_iterator(&rEntry));
+ return false;
+ });
+
+ // Note: pEntry is the effect with focus (if multiple effects are selected)
+ mxDndEffectDragging = mxTreeView->make_iterator();
+ if (!mxTreeView->get_cursor(mxDndEffectDragging.get()))
+ mxDndEffectDragging.reset();
+
+ // Allow normal processing.
+ return false;
+}
+
+// D'n'D #3: Called each time mouse moves during drag
+sal_Int8 CustomAnimationList::AcceptDrop( const AcceptDropEvent& rEvt )
+{
+ sal_Int8 ret = DND_ACTION_NONE;
+
+ const bool bIsMove = DND_ACTION_MOVE == rEvt.mnAction;
+ if (mxDndEffectDragging && !rEvt.mbLeaving && bIsMove)
+ ret = DND_ACTION_MOVE;
+ return ret;
+}
+
+// D'n'D #5: Tell model to update effect order.
+sal_Int8 CustomAnimationList::ExecuteDrop(const ExecuteDropEvent& rEvt)
+{
+ std::unique_ptr<weld::TreeIter> xDndEffectInsertBefore(mxTreeView->make_iterator());
+ if (!mxTreeView->get_dest_row_at_pos(rEvt.maPosPixel, xDndEffectInsertBefore.get(), true))
+ xDndEffectInsertBefore.reset();
+
+ const bool bMovingEffect = ( mxDndEffectDragging != nullptr );
+ const bool bMoveNotSelf = !xDndEffectInsertBefore || (mxDndEffectDragging && mxTreeView->iter_compare(*xDndEffectInsertBefore, *mxDndEffectDragging) != 0);
+ const bool bHaveSequence(mpMainSequence);
+
+ if( bMovingEffect && bMoveNotSelf && bHaveSequence )
+ {
+ CustomAnimationListEntryItem* pTarget = xDndEffectInsertBefore ?
+ weld::fromId<CustomAnimationListEntryItem*>(mxTreeView->get_id(*xDndEffectInsertBefore)) :
+ nullptr;
+
+ // Build list of effects
+ std::vector< CustomAnimationEffectPtr > aEffects;
+ for( const auto &pEntry : mDndEffectsSelected )
+ {
+ CustomAnimationListEntryItem* pCustomAnimationEffect = weld::fromId<CustomAnimationListEntryItem*>(mxTreeView->get_id(*pEntry));
+ aEffects.push_back(pCustomAnimationEffect->getEffect());
+ }
+
+ // Callback to observer to have it update the model.
+ // If pTarget is null, pass nullptr to indicate end of list.
+ mpController->onDragNDropComplete(
+ std::move(aEffects),
+ pTarget ? pTarget->getEffect() : nullptr );
+
+ // Reset selection
+ mxTreeView->select(*mxDndEffectDragging);
+ Select();
+ }
+
+ // NOTE: Don't call default handler because all required
+ // move operations have been completed here to update the model.
+ return DND_ACTION_NONE;
+}
+
+CustomAnimationList::~CustomAnimationList()
+{
+ if (mnPostExpandEvent)
+ {
+ Application::RemoveUserEvent(mnPostExpandEvent);
+ mnPostExpandEvent = nullptr;
+ }
+
+ if (mnPostCollapseEvent)
+ {
+ Application::RemoveUserEvent(mnPostCollapseEvent);
+ mnPostCollapseEvent = nullptr;
+ }
+
+ if( mpMainSequence )
+ mpMainSequence->removeListener( this );
+
+ clear();
+}
+
+IMPL_LINK(CustomAnimationList, KeyInputHdl, const KeyEvent&, rKEvt, bool)
+{
+ const int nKeyCode = rKEvt.GetKeyCode().GetCode();
+ switch (nKeyCode)
+ {
+ case KEY_DELETE:
+ mpController->onContextMenu("remove");
+ return true;
+ case KEY_INSERT:
+ mpController->onContextMenu("create");
+ return true;
+ case KEY_SPACE:
+ {
+ std::unique_ptr<weld::TreeIter> xEntry = mxTreeView->make_iterator();
+ if (mxTreeView->get_cursor(xEntry.get()))
+ {
+ auto aRect = mxTreeView->get_row_area(*xEntry);
+ const Point aPos(aRect.getWidth() / 2, aRect.getHeight() / 2);
+ const CommandEvent aCEvt(aPos, CommandEventId::ContextMenu);
+ CommandHdl(aCEvt);
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+/** selects or deselects the given effect.
+ Selections of other effects are not changed */
+void CustomAnimationList::select( const CustomAnimationEffectPtr& pEffect )
+{
+ CustomAnimationListEntryItem* pEntry = nullptr;
+
+ std::unique_ptr<weld::TreeIter> xEntry = mxTreeView->make_iterator();
+ if (mxTreeView->get_iter_first(*xEntry))
+ {
+ do
+ {
+ CustomAnimationListEntryItem* pTestEntry = weld::fromId<CustomAnimationListEntryItem*>(mxTreeView->get_id(*xEntry));
+ if (pTestEntry->getEffect() == pEffect)
+ {
+ mxTreeView->select(*xEntry);
+ mxTreeView->scroll_to_row(*xEntry);
+ pEntry = pTestEntry;
+ break;
+ }
+ } while (mxTreeView->iter_next(*xEntry));
+ }
+
+ if( !pEntry )
+ {
+ append( pEffect );
+ select( pEffect );
+ }
+}
+
+void CustomAnimationList::clear()
+{
+ mxEntries.clear();
+ mxTreeView->clear();
+
+ mxEmptyLabelParent->show();
+ mxTreeView->hide();
+
+ mxLastParentEntry.reset();
+ mxLastTargetShape = nullptr;
+}
+
+void CustomAnimationList::update( const MainSequencePtr& pMainSequence )
+{
+ if( mpMainSequence )
+ mpMainSequence->removeListener( this );
+
+ mpMainSequence = pMainSequence;
+ update();
+
+ if( mpMainSequence )
+ mpMainSequence->addListener( this );
+}
+
+struct stl_append_effect_func
+{
+ explicit stl_append_effect_func( CustomAnimationList& rList ) : mrList( rList ) {}
+ void operator()(const CustomAnimationEffectPtr& pEffect);
+ CustomAnimationList& mrList;
+};
+
+void stl_append_effect_func::operator()(const CustomAnimationEffectPtr& pEffect)
+{
+ mrList.append( pEffect );
+}
+
+void CustomAnimationList::update()
+{
+ mbIgnorePaint = true;
+
+ std::vector< CustomAnimationEffectPtr > aVisible;
+ std::vector< CustomAnimationEffectPtr > aSelected;
+ CustomAnimationEffectPtr aCurrent;
+
+ CustomAnimationEffectPtr pFirstSelEffect;
+ CustomAnimationEffectPtr pLastSelEffect;
+ ::tools::Long nFirstVis = -1;
+ ::tools::Long nLastVis = -1;
+ ::tools::Long nFirstSelOld = -1;
+ ::tools::Long nLastSelOld = -1;
+
+ std::unique_ptr<weld::TreeIter> xEntry = mxTreeView->make_iterator();
+
+ if( mpMainSequence )
+ {
+ std::unique_ptr<weld::TreeIter> xLastSelectedEntry;
+ std::unique_ptr<weld::TreeIter> xLastVisibleEntry;
+
+ // save selection, current, and expand (visible) states
+ mxTreeView->all_foreach([this, &aVisible, &nFirstVis, &xLastVisibleEntry,
+ &aSelected, &nFirstSelOld, &pFirstSelEffect, &xLastSelectedEntry](weld::TreeIter& rEntry){
+ CustomAnimationListEntryItem* pEntry = weld::fromId<CustomAnimationListEntryItem*>(mxTreeView->get_id(rEntry));
+ CustomAnimationEffectPtr pEffect(pEntry->getEffect());
+ if (pEffect)
+ {
+ if (weld::IsEntryVisible(*mxTreeView, rEntry))
+ {
+ aVisible.push_back(pEffect);
+ // save scroll position
+ if (nFirstVis == -1)
+ nFirstVis = weld::GetAbsPos(*mxTreeView, rEntry);
+ if (!xLastVisibleEntry)
+ xLastVisibleEntry = mxTreeView->make_iterator(&rEntry);
+ else
+ mxTreeView->copy_iterator(rEntry, *xLastVisibleEntry);
+ }
+
+ if (mxTreeView->is_selected(rEntry))
+ {
+ aSelected.push_back(pEffect);
+ if (nFirstSelOld == -1)
+ {
+ pFirstSelEffect = pEffect;
+ nFirstSelOld = weld::GetAbsPos(*mxTreeView, rEntry);
+ }
+ if (!xLastSelectedEntry)
+ xLastSelectedEntry = mxTreeView->make_iterator(&rEntry);
+ else
+ mxTreeView->copy_iterator(rEntry, *xLastSelectedEntry);
+ }
+ }
+
+ return false;
+ });
+
+ if (xLastSelectedEntry)
+ {
+ CustomAnimationListEntryItem* pEntry = weld::fromId<CustomAnimationListEntryItem*>(mxTreeView->get_id(*xLastSelectedEntry));
+ pLastSelEffect = pEntry->getEffect();
+ nLastSelOld = weld::GetAbsPos(*mxTreeView, *xLastSelectedEntry);
+ }
+
+ if (xLastVisibleEntry)
+ nLastVis = weld::GetAbsPos(*mxTreeView, *xLastVisibleEntry);
+
+ if (mxTreeView->get_cursor(xEntry.get()))
+ {
+ CustomAnimationListEntryItem* pEntry = weld::fromId<CustomAnimationListEntryItem*>(mxTreeView->get_id(*xEntry));
+ aCurrent = pEntry->getEffect();
+ }
+ }
+
+ // rebuild list
+
+ mxTreeView->freeze();
+
+ clear();
+
+ if (mpMainSequence)
+ {
+ std::for_each( mpMainSequence->getBegin(), mpMainSequence->getEnd(), stl_append_effect_func( *this ) );
+ mxLastParentEntry.reset();
+
+ auto rInteractiveSequenceVector = mpMainSequence->getInteractiveSequenceVector();
+
+ for (InteractiveSequencePtr const& pIS : rInteractiveSequenceVector)
+ {
+ Reference< XShape > xShape( pIS->getTriggerShape() );
+ if( xShape.is() )
+ {
+ OUString aDescription = SdResId(STR_CUSTOMANIMATION_TRIGGER) + ": " +
+ getShapeDescription( xShape, false );
+
+ mxEntries.emplace_back(std::make_unique<CustomAnimationListEntryItem>(aDescription, nullptr));
+
+ OUString sId(weld::toId(mxEntries.back().get()));
+ mxTreeView->insert(nullptr, -1, &aDescription, &sId, nullptr, nullptr, false, nullptr);
+ std::for_each( pIS->getBegin(), pIS->getEnd(), stl_append_effect_func( *this ) );
+ mxLastParentEntry.reset();
+ }
+ }
+ }
+
+ mxTreeView->thaw();
+
+ if (mxTreeView->n_children())
+ {
+ mxEmptyLabelParent->hide();
+ mxTreeView->show();
+ }
+
+ if (mpMainSequence)
+ {
+ ::tools::Long nFirstSelNew = -1;
+ ::tools::Long nLastSelNew = -1;
+
+ std::vector<std::unique_ptr<weld::TreeIter>> aNewSelection;
+
+ // restore selection state, expand state, and current-entry (under cursor)
+ if (mxTreeView->get_iter_first(*xEntry))
+ {
+ do
+ {
+ CustomAnimationListEntryItem* pEntry = weld::fromId<CustomAnimationListEntryItem*>(mxTreeView->get_id(*xEntry));
+
+ CustomAnimationEffectPtr pEffect( pEntry->getEffect() );
+ if (pEffect)
+ {
+ // Any effects that were visible should still be visible, so expand their parents.
+ // (a previously expanded parent may have moved leaving a child to now be the new parent to expand)
+ if( std::find( aVisible.begin(), aVisible.end(), pEffect ) != aVisible.end() )
+ {
+ if (mxTreeView->get_iter_depth(*xEntry))
+ {
+ std::unique_ptr<weld::TreeIter> xParentEntry = mxTreeView->make_iterator(xEntry.get());
+ mxTreeView->iter_parent(*xParentEntry);
+ mxTreeView->expand_row(*xParentEntry);
+ }
+ }
+
+ if( std::find( aSelected.begin(), aSelected.end(), pEffect ) != aSelected.end() )
+ aNewSelection.emplace_back(mxTreeView->make_iterator(xEntry.get()));
+
+ // Restore the cursor, as it may deselect other effects wait until
+ // after the loop to reset the selection
+ if( pEffect == aCurrent )
+ mxTreeView->set_cursor(*xEntry);
+
+ if (pEffect == pFirstSelEffect)
+ nFirstSelNew = weld::GetAbsPos(*mxTreeView, *xEntry);
+
+ if (pEffect == pLastSelEffect)
+ nLastSelNew = weld::GetAbsPos(*mxTreeView, *xEntry);
+ }
+ } while (mxTreeView->iter_next(*xEntry));
+ }
+
+ // tdf#147032 unselect what previous set_cursor may have caused to get selected as a side-effect
+ mxTreeView->unselect_all();
+ for (const auto& rEntry : aNewSelection)
+ mxTreeView->select(*rEntry);
+
+ // Scroll to a selected entry, depending on where the selection moved.
+ const bool bMoved = nFirstSelNew != nFirstSelOld;
+ const bool bMovedUp = nFirstSelNew < nFirstSelOld;
+ const bool bMovedDown = nFirstSelNew > nFirstSelOld;
+
+ if( bMoved && nLastSelOld < nFirstVis && nLastSelNew < nFirstVis )
+ {
+ // The selection is above the visible area.
+ // Scroll up to show the last few selected entries.
+ if( nLastSelNew - (nLastVis - nFirstVis) > nFirstSelNew)
+ {
+ // The entries in the selection range can't fit in view.
+ // Scroll so the last selected entry is last in view.
+ mxTreeView->vadjustment_set_value(nLastSelNew - (nLastVis - nFirstVis));
+ }
+ else
+ mxTreeView->vadjustment_set_value(nFirstSelNew);
+ }
+ else if( bMoved && nFirstSelOld > nLastVis && nFirstSelNew > nLastVis )
+ {
+ // The selection is below the visible area.
+ // Scroll down to the first few selected entries.
+ mxTreeView->vadjustment_set_value(nFirstSelNew);
+ }
+ else if( bMovedUp && nFirstSelOld <= nFirstVis )
+ {
+ // A visible entry has moved up out of view; scroll up one.
+ mxTreeView->vadjustment_set_value(nFirstVis - 1);
+ }
+ else if( bMovedDown && nLastSelOld >= nLastVis )
+ {
+ // An entry has moved down out of view; scroll down one.
+ mxTreeView->vadjustment_set_value(nFirstVis + 1);
+ }
+ else if ( nFirstVis != -1 )
+ {
+ // The selection is still in view, or it hasn't moved.
+ mxTreeView->vadjustment_set_value(nFirstVis);
+ }
+ }
+
+ mbIgnorePaint = false;
+
+ Select();
+}
+
+void CustomAnimationList::append( CustomAnimationEffectPtr pEffect )
+{
+ Any aTarget( pEffect->getTarget() );
+ if( !aTarget.hasValue() )
+ return;
+
+ try
+ {
+ // create a ui description
+ OUString aDescription = getDescription(aTarget, pEffect->getTargetSubItem() != ShapeAnimationSubType::ONLY_BACKGROUND);
+
+ std::unique_ptr<weld::TreeIter> xParentEntry;
+
+ Reference< XShape > xTargetShape( pEffect->getTargetShape() );
+ sal_Int32 nGroupId = pEffect->getGroupId();
+
+ // if this effect has the same target and group-id as the last root effect,
+ // the last root effect is also this effects parent
+ if (mxLastParentEntry && nGroupId != -1 && mxLastTargetShape == xTargetShape && mnLastGroupId == nGroupId)
+ xParentEntry = mxTreeView->make_iterator(mxLastParentEntry.get());
+
+ // create an entry for the effect
+ std::unique_ptr<weld::TreeIter> xEntry = mxTreeView->make_iterator();
+
+ mxEntries.emplace_back(std::make_unique<CustomAnimationListEntryItem>(aDescription, pEffect));
+
+ OUString sId(weld::toId(mxEntries.back().get()));
+
+ if (xParentEntry)
+ {
+ // add a subentry
+ mxTreeView->insert(xParentEntry.get(), -1, &aDescription, &sId, nullptr, nullptr, false, xEntry.get());
+ }
+ else
+ {
+ // add a root entry
+ mxTreeView->insert(nullptr, -1, &aDescription, &sId, nullptr, nullptr, false, xEntry.get());
+
+ // and the new root entry becomes the possible next group header
+ mxLastTargetShape = xTargetShape;
+ mnLastGroupId = nGroupId;
+ mxLastParentEntry = std::move(xEntry);
+ }
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationList::append()" );
+ }
+}
+
+static void selectShape(weld::TreeView* pTreeList, const Reference< XShape >& xShape )
+{
+ std::unique_ptr<weld::TreeIter> xEntry = pTreeList->make_iterator();
+ if (!pTreeList->get_iter_first(*xEntry))
+ return;
+
+ bool bFirstEntry = true;
+
+ do
+ {
+ CustomAnimationListEntryItem* pEntry = weld::fromId<CustomAnimationListEntryItem*>(pTreeList->get_id(*xEntry));
+ CustomAnimationEffectPtr pEffect(pEntry->getEffect());
+ if (pEffect)
+ {
+ if (pEffect->getTarget() == xShape)
+ {
+ pTreeList->select(*xEntry);
+ if (bFirstEntry)
+ {
+ pTreeList->scroll_to_row(*xEntry);
+ bFirstEntry = false;
+ }
+ }
+ }
+ } while (pTreeList->iter_next(*xEntry));
+}
+
+void CustomAnimationList::onSelectionChanged(const Any& rSelection)
+{
+ try
+ {
+ mxTreeView->unselect_all();
+
+ if (rSelection.hasValue())
+ {
+ Reference< XIndexAccess > xShapes(rSelection, UNO_QUERY);
+ if( xShapes.is() )
+ {
+ sal_Int32 nCount = xShapes->getCount();
+ sal_Int32 nIndex;
+ for( nIndex = 0; nIndex < nCount; nIndex++ )
+ {
+ Reference< XShape > xShape( xShapes->getByIndex( nIndex ), UNO_QUERY );
+ if( xShape.is() )
+ selectShape(mxTreeView.get(), xShape);
+ }
+ }
+ else
+ {
+ Reference< XShape > xShape(rSelection, UNO_QUERY);
+ if( xShape.is() )
+ selectShape(mxTreeView.get(), xShape);
+ }
+ }
+
+ Select();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationList::onSelectionChanged()" );
+ }
+}
+
+IMPL_LINK_NOARG(CustomAnimationList, SelectHdl, weld::TreeView&, void)
+{
+ Select();
+}
+
+// Notify controller to refresh UI when we are notified of selection change from base class
+void CustomAnimationList::Select()
+{
+ if( mbIgnorePaint )
+ return;
+ mpController->onSelect();
+}
+
+IMPL_LINK_NOARG(CustomAnimationList, PostExpandHdl, void*, void)
+{
+ std::unique_ptr<weld::TreeIter> xEntry = mxTreeView->make_iterator();
+ if (mxTreeView->get_selected(xEntry.get()))
+ {
+ for (bool bChild = mxTreeView->iter_children(*xEntry); bChild; bChild = mxTreeView->iter_next_sibling(*xEntry))
+ {
+ if (!mxTreeView->is_selected(*xEntry))
+ mxTreeView->select(*xEntry);
+ }
+ }
+
+ // Notify controller that selection has changed (it should update the UI)
+ mpController->onSelect();
+
+ mnPostExpandEvent = nullptr;
+}
+
+IMPL_LINK(CustomAnimationList, ExpandHdl, const weld::TreeIter&, rParent, bool)
+{
+ // If expanded entry is selected, then select its children too afterwards.
+ if (mxTreeView->is_selected(rParent) && !mnPostExpandEvent) {
+ mnPostExpandEvent = Application::PostUserEvent(LINK(this, CustomAnimationList, PostExpandHdl));
+ }
+
+ return true;
+}
+
+IMPL_LINK_NOARG(CustomAnimationList, PostCollapseHdl, void*, void)
+{
+ // Deselect all entries as SvTreeListBox::Collapse selects the last
+ // entry to have focus (or its parent), which is not desired
+ mxTreeView->unselect_all();
+
+ // Restore selection state for entries which are still visible
+ for (const auto &pEntry : lastSelectedEntries)
+ {
+ if (weld::IsEntryVisible(*mxTreeView, *pEntry))
+ mxTreeView->select(*pEntry);
+ }
+
+ lastSelectedEntries.clear();
+
+ // Notify controller that selection has changed (it should update the UI)
+ mpController->onSelect();
+
+ mnPostCollapseEvent = nullptr;
+}
+
+IMPL_LINK_NOARG(CustomAnimationList, CollapseHdl, const weld::TreeIter&, bool)
+{
+ if (!mnPostCollapseEvent)
+ {
+ // weld::TreeView::collapse() discards multi-selection state
+ // of list entries, so first save current selection state
+ mxTreeView->selected_foreach([this](weld::TreeIter& rEntry){
+ lastSelectedEntries.emplace_back(mxTreeView->make_iterator(&rEntry));
+ return false;
+ });
+
+ mnPostCollapseEvent = Application::PostUserEvent(LINK(this, CustomAnimationList, PostCollapseHdl));
+ }
+
+ // Execute collapse on base class
+ return true;
+}
+
+bool CustomAnimationList::isExpanded( const CustomAnimationEffectPtr& pEffect ) const
+{
+ bool bExpanded = true; // we assume expanded by default
+
+ std::unique_ptr<weld::TreeIter> xEntry = mxTreeView->make_iterator();
+ if (mxTreeView->get_iter_first(*xEntry))
+ {
+ do
+ {
+ CustomAnimationListEntryItem* pEntry =
+ weld::fromId<CustomAnimationListEntryItem*>(mxTreeView->get_id(*xEntry));
+ if (pEntry->getEffect() == pEffect)
+ {
+ if (mxTreeView->get_iter_depth(*xEntry)) // no parent, keep expanded default of true
+ {
+ std::unique_ptr<weld::TreeIter> xParentEntry = mxTreeView->make_iterator(xEntry.get());
+ if (mxTreeView->iter_parent(*xParentEntry))
+ bExpanded = mxTreeView->get_row_expanded(*xParentEntry);
+ }
+ break;
+ }
+ } while (mxTreeView->iter_next(*xEntry));
+ }
+
+ return bExpanded;
+}
+
+bool CustomAnimationList::isVisible(const CustomAnimationEffectPtr& pEffect) const
+{
+ std::unique_ptr<weld::TreeIter> xEntry = mxTreeView->make_iterator();
+ if (mxTreeView->get_iter_first(*xEntry))
+ {
+ do
+ {
+ CustomAnimationListEntryItem* pTestEntry = weld::fromId<CustomAnimationListEntryItem*>(mxTreeView->get_id(*xEntry));
+ if (pTestEntry->getEffect() == pEffect)
+ return weld::IsEntryVisible(*mxTreeView, *xEntry);
+ } while (mxTreeView->iter_next(*xEntry));
+ }
+ return true;
+}
+
+EffectSequence CustomAnimationList::getSelection() const
+{
+ EffectSequence aSelection;
+
+ mxTreeView->selected_foreach([this, &aSelection](weld::TreeIter& rEntry){
+ CustomAnimationListEntryItem* pEntry = weld::fromId<CustomAnimationListEntryItem*>(mxTreeView->get_id(rEntry));
+ CustomAnimationEffectPtr pEffect(pEntry->getEffect());
+ if (pEffect)
+ aSelection.push_back(pEffect);
+
+ // if the selected effect is not expanded and has children
+ // we say that the children are automatically selected
+ if (!mxTreeView->get_row_expanded(rEntry) && mxTreeView->iter_has_child(rEntry))
+ {
+ std::unique_ptr<weld::TreeIter> xChild = mxTreeView->make_iterator(&rEntry);
+ (void)mxTreeView->iter_children(*xChild);
+
+ do
+ {
+ if (!mxTreeView->is_selected(*xChild))
+ {
+ CustomAnimationListEntryItem* pChild = weld::fromId<CustomAnimationListEntryItem*>(mxTreeView->get_id(*xChild));
+ const CustomAnimationEffectPtr& pChildEffect( pChild->getEffect() );
+ if( pChildEffect )
+ aSelection.push_back( pChildEffect );
+ }
+ } while (mxTreeView->iter_next_sibling(*xChild));
+ }
+
+ return false;
+ });
+
+ return aSelection;
+}
+
+IMPL_LINK_NOARG(CustomAnimationList, DoubleClickHdl, weld::TreeView&, bool)
+{
+ mpController->onDoubleClick();
+ return false;
+}
+
+IMPL_LINK(CustomAnimationList, CommandHdl, const CommandEvent&, rCEvt, bool)
+{
+ if (rCEvt.GetCommand() != CommandEventId::ContextMenu)
+ return false;
+
+ if (rCEvt.IsMouseEvent())
+ {
+ ::Point aPos = rCEvt.GetMousePosPixel();
+ std::unique_ptr<weld::TreeIter> xIter(mxTreeView->make_iterator());
+ if (mxTreeView->get_dest_row_at_pos(aPos, xIter.get(), false) && !mxTreeView->is_selected(*xIter))
+ {
+ mxTreeView->unselect_all();
+ mxTreeView->set_cursor(*xIter);
+ mxTreeView->select(*xIter);
+ SelectHdl(*mxTreeView);
+ }
+ }
+
+ if (!mxTreeView->get_selected(nullptr))
+ return false;
+
+ std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(mxTreeView.get(), "modules/simpress/ui/effectmenu.ui"));
+ std::unique_ptr<weld::Menu> xMenu = xBuilder->weld_menu("menu");
+
+ sal_Int16 nNodeType = -1;
+ sal_Int16 nEntries = 0;
+
+ mxTreeView->selected_foreach([this, &nNodeType, &nEntries](weld::TreeIter& rEntry){
+ CustomAnimationListEntryItem* pEntry = weld::fromId<CustomAnimationListEntryItem*>(mxTreeView->get_id(rEntry));
+ CustomAnimationEffectPtr pEffect(pEntry->getEffect());
+
+ nEntries++;
+ if (pEffect)
+ {
+ if( nNodeType == -1 )
+ {
+ nNodeType = pEffect->getNodeType();
+ }
+ else
+ {
+ if( nNodeType != pEffect->getNodeType() )
+ {
+ nNodeType = -1;
+ return true;
+ }
+ }
+ }
+
+ return false;
+ });
+
+ xMenu->set_active("onclick", nNodeType == EffectNodeType::ON_CLICK);
+ xMenu->set_active("withprev", nNodeType == EffectNodeType::WITH_PREVIOUS);
+ xMenu->set_active("afterprev", nNodeType == EffectNodeType::AFTER_PREVIOUS);
+ xMenu->set_sensitive("options", nEntries == 1);
+ xMenu->set_sensitive("timing", nEntries == 1);
+
+ OString sCommand = xMenu->popup_at_rect(mxTreeView.get(), ::tools::Rectangle(rCEvt.GetMousePosPixel(), Size(1,1)));
+ if (!sCommand.isEmpty())
+ ExecuteContextMenuAction(sCommand);
+
+ return true;
+}
+
+void CustomAnimationList::ExecuteContextMenuAction(const OString& rIdent)
+{
+ mpController->onContextMenu(rIdent);
+}
+
+void CustomAnimationList::notify_change()
+{
+ update();
+ mpController->onSelect();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/animations/CustomAnimationPane.cxx b/sd/source/ui/animations/CustomAnimationPane.cxx
new file mode 100644
index 000000000..0910ba96e
--- /dev/null
+++ b/sd/source/ui/animations/CustomAnimationPane.cxx
@@ -0,0 +1,2578 @@
+/* -*- 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 <com/sun/star/presentation/EffectPresetClass.hpp>
+#include <com/sun/star/animations/XAnimationNodeSupplier.hpp>
+#include <com/sun/star/animations/AnimationNodeType.hpp>
+#include <com/sun/star/animations/ParallelTimeContainer.hpp>
+#include <com/sun/star/view/XSelectionSupplier.hpp>
+#include <com/sun/star/document/XActionLockable.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/presentation/EffectNodeType.hpp>
+#include <com/sun/star/presentation/EffectCommands.hpp>
+#include <com/sun/star/animations/AnimationTransformType.hpp>
+#include <com/sun/star/text/XTextRangeCompare.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/container/XIndexAccess.hpp>
+#include <com/sun/star/presentation/ParagraphTarget.hpp>
+#include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/drawing/LineStyle.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/scopeguard.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <tools/debug.hxx>
+#include "STLPropertySet.hxx"
+#include <CustomAnimationPane.hxx>
+#include "CustomAnimationDialog.hxx"
+#include <CustomAnimationList.hxx>
+#include "motionpathtag.hxx"
+#include <CustomAnimationPreset.hxx>
+
+#include <comphelper/lok.hxx>
+#include <comphelper/sequence.hxx>
+#include <sfx2/frame.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <svx/svxids.hrc>
+#include <DrawDocShell.hxx>
+#include <ViewShellBase.hxx>
+#include <DrawViewShell.hxx>
+#include <DrawController.hxx>
+#include <sdresid.hxx>
+#include <drawview.hxx>
+#include <slideshow.hxx>
+#include <undoanim.hxx>
+#include <optsitem.hxx>
+#include <sdmod.hxx>
+#include <framework/FrameworkHelper.hxx>
+
+#include <EventMultiplexer.hxx>
+
+#include <strings.hrc>
+#include <sdpage.hxx>
+#include <app.hrc>
+
+#include <svx/strings.hrc>
+#include <svx/dialmgr.hxx>
+
+#include <algorithm>
+#include <memory>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::animations;
+using namespace ::com::sun::star::presentation;
+using namespace ::com::sun::star::text;
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing;
+using ::com::sun::star::view::XSelectionSupplier;
+using ::com::sun::star::beans::XPropertySet;
+using ::com::sun::star::container::XIndexAccess;
+using ::com::sun::star::container::XEnumerationAccess;
+using ::com::sun::star::container::XEnumeration;
+using ::com::sun::star::text::XText;
+using ::sd::framework::FrameworkHelper;
+using ::com::sun::star::uno::UNO_QUERY;
+using ::com::sun::star::uno::UNO_QUERY_THROW;
+using ::com::sun::star::uno::Any;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::Exception;
+
+namespace sd {
+
+void fillRepeatComboBox(weld::ComboBox& rBox)
+{
+ OUString aNone( SdResId( STR_CUSTOMANIMATION_REPEAT_NONE ) );
+ rBox.append_text(aNone);
+ rBox.append_text(OUString::number(2));
+ rBox.append_text(OUString::number(3));
+ rBox.append_text(OUString::number(4));
+ rBox.append_text(OUString::number(5));
+ rBox.append_text(OUString::number(10));
+
+ OUString aUntilClick( SdResId( STR_CUSTOMANIMATION_REPEAT_UNTIL_NEXT_CLICK ) );
+ rBox.append_text(aUntilClick);
+
+ OUString aEndOfSlide( SdResId( STR_CUSTOMANIMATION_REPEAT_UNTIL_END_OF_SLIDE ) );
+ rBox.append_text(aEndOfSlide);
+}
+
+CustomAnimationPane::CustomAnimationPane( weld::Widget* pParent, ViewShellBase& rBase )
+ : PanelLayout(pParent, "CustomAnimationsPanel", "modules/simpress/ui/customanimationspanel.ui")
+ , mrBase(rBase)
+ // load resources
+ , mxFTAnimation(m_xBuilder->weld_label("effectlabel"))
+ , mxCustomAnimationList(new CustomAnimationList(m_xBuilder->weld_tree_view("custom_animation_list"),
+ m_xBuilder->weld_label("custom_animation_label"),
+ m_xBuilder->weld_widget("custom_animation_label_parent")))
+ , mxPBAddEffect(m_xBuilder->weld_button("add_effect"))
+ , mxPBRemoveEffect(m_xBuilder->weld_button("remove_effect"))
+ , mxPBMoveUp(m_xBuilder->weld_button("move_up"))
+ , mxPBMoveDown(m_xBuilder->weld_button("move_down"))
+ , mxFTCategory(m_xBuilder->weld_label("categorylabel"))
+ , mxLBCategory(m_xBuilder->weld_combo_box("categorylb"))
+ , mxFTEffect(m_xBuilder->weld_label("effect_label"))
+ , mxLBAnimation(m_xBuilder->weld_tree_view("effect_list"))
+ , mxFTStart(m_xBuilder->weld_label("start_effect"))
+ , mxLBStart(m_xBuilder->weld_combo_box("start_effect_list"))
+ , mxFTProperty(m_xBuilder->weld_label("effect_property"))
+ , mxPlaceholderBox(m_xBuilder->weld_container("placeholder"))
+ , mxPBPropertyMore(m_xBuilder->weld_button("more_properties"))
+ , mxFTDuration(m_xBuilder->weld_label("effect_duration"))
+ , mxCBXDuration(m_xBuilder->weld_metric_spin_button("anim_duration", FieldUnit::SECOND))
+ , mxFTStartDelay(m_xBuilder->weld_label("delay_label"))
+ , mxMFStartDelay(m_xBuilder->weld_metric_spin_button("delay_value", FieldUnit::SECOND))
+ , mxCBAutoPreview(m_xBuilder->weld_check_button("auto_preview"))
+ , mxPBPlay(m_xBuilder->weld_button("play"))
+ , maIdle("sd idle treeview select")
+ , mnLastSelectedAnimation(-1)
+ , mnPropertyType(nPropertyTypeNone)
+ , mnCurvePathPos(-1)
+ , mnPolygonPathPos(-1)
+ , mnFreeformPathPos(-1)
+ , maLateInitTimer("sd CustomAnimationPane maLateInitTimer")
+{
+ initialize();
+}
+
+css::ui::LayoutSize CustomAnimationPane::GetHeightForWidth(const sal_Int32 /*nWidth*/)
+{
+ sal_Int32 nMinimumHeight = get_preferred_size().Height();
+ return css::ui::LayoutSize(nMinimumHeight, -1, nMinimumHeight);
+}
+
+void CustomAnimationPane::initialize()
+{
+ mxLBAnimation->connect_changed(LINK(this, CustomAnimationPane, AnimationSelectHdl));
+ mxCustomAnimationList->setController( static_cast<ICustomAnimationListController*> ( this ) );
+ mxCustomAnimationList->set_size_request(mxCustomAnimationList->get_approximate_digit_width() * 15,
+ mxCustomAnimationList->get_height_rows(4));
+
+ mxLBAnimation->set_size_request(mxLBAnimation->get_approximate_digit_width() * 15,
+ mxLBAnimation->get_height_rows(4));
+
+ maStrProperty = mxFTProperty->get_label();
+
+ mxPBAddEffect->connect_clicked( LINK( this, CustomAnimationPane, implClickHdl ) );
+ mxPBRemoveEffect->connect_clicked( LINK( this, CustomAnimationPane, implClickHdl ) );
+ mxLBStart->connect_changed( LINK( this, CustomAnimationPane, implControlListBoxHdl ) );
+ mxCBXDuration->connect_value_changed(LINK( this, CustomAnimationPane, DurationModifiedHdl));
+ mxPBPropertyMore->connect_clicked( LINK( this, CustomAnimationPane, implClickHdl ) );
+ mxPBMoveUp->connect_clicked( LINK( this, CustomAnimationPane, implClickHdl ) );
+ mxPBMoveDown->connect_clicked( LINK( this, CustomAnimationPane, implClickHdl ) );
+ mxPBPlay->connect_clicked( LINK( this, CustomAnimationPane, implClickHdl ) );
+ mxCBAutoPreview->connect_toggled( LINK( this, CustomAnimationPane, implToggleHdl ) );
+ mxLBCategory->connect_changed( LINK(this, CustomAnimationPane, UpdateAnimationLB) );
+ mxMFStartDelay->connect_value_changed( LINK(this, CustomAnimationPane, DelayModifiedHdl) );
+ mxMFStartDelay->connect_focus_out(LINK( this, CustomAnimationPane, DelayLoseFocusHdl));
+
+ maIdle.SetPriority(TaskPriority::DEFAULT);
+ maIdle.SetInvokeHandler(LINK(this, CustomAnimationPane, SelectionHandler));
+
+ maStrModify = mxFTEffect->get_label();
+
+ // get current controller and initialize listeners
+ try
+ {
+ mxView.set(mrBase.GetController(), UNO_QUERY);
+ addListener();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPane::CustomAnimationPane()" );
+ }
+
+ // tdf#137637 keep user selection during initialization
+ ScopeLockGuard aGuard(maSelectionLock);
+ // get current page and update custom animation list
+ onChangeCurrentPage();
+
+ // Wait a short time before the presets list is created. This gives the
+ // system time to paint the control.
+ maLateInitTimer.SetTimeout(100);
+ maLateInitTimer.SetInvokeHandler(LINK(this, CustomAnimationPane, lateInitCallback));
+ maLateInitTimer.Start();
+}
+
+CustomAnimationPane::~CustomAnimationPane()
+{
+ maLateInitTimer.Stop();
+
+ removeListener();
+
+ MotionPathTagVector aTags;
+ aTags.swap( maMotionPathTags );
+ for (auto const& tag : aTags)
+ tag->Dispose();
+
+ mxPBAddEffect.reset();
+ mxPBRemoveEffect.reset();
+ mxFTEffect.reset();
+ mxFTStart.reset();
+ mxLBStart.reset();
+ mxLBSubControl.reset();
+ mxFTProperty.reset();
+ mxPlaceholderBox.reset();
+ mxPBPropertyMore.reset();
+ mxFTDuration.reset();
+ mxCBXDuration.reset();
+ mxFTStartDelay.reset();
+ mxMFStartDelay.reset();
+ mxCustomAnimationList.reset();
+ mxPBMoveUp.reset();
+ mxPBMoveDown.reset();
+ mxPBPlay.reset();
+ mxCBAutoPreview.reset();
+ mxFTCategory.reset();
+ mxLBCategory.reset();
+ mxFTAnimation.reset();
+ mxLBAnimation.reset();
+}
+
+void CustomAnimationPane::addUndo()
+{
+ SfxUndoManager* pManager = mrBase.GetDocShell()->GetUndoManager();
+ if( pManager )
+ {
+ SdPage* pPage = SdPage::getImplementation( mxCurrentPage );
+ if( pPage )
+ pManager->AddUndoAction( std::make_unique<UndoAnimation>( mrBase.GetDocShell()->GetDoc(), pPage ) );
+ }
+}
+
+void CustomAnimationPane::addListener()
+{
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,CustomAnimationPane,EventMultiplexerListener) );
+ mrBase.GetEventMultiplexer()->AddEventListener(aLink);
+}
+
+void CustomAnimationPane::removeListener()
+{
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,CustomAnimationPane,EventMultiplexerListener) );
+ mrBase.GetEventMultiplexer()->RemoveEventListener( aLink );
+}
+
+IMPL_LINK(CustomAnimationPane,EventMultiplexerListener,
+ tools::EventMultiplexerEvent&, rEvent, void)
+{
+ switch (rEvent.meEventId)
+ {
+ case EventMultiplexerEventId::EditViewSelection:
+ onSelectionChanged();
+ break;
+
+ case EventMultiplexerEventId::CurrentPageChanged:
+ onChangeCurrentPage();
+ break;
+
+ case EventMultiplexerEventId::MainViewAdded:
+ // At this moment the controller may not yet been set at model
+ // or ViewShellBase. Take it from the view shell passed with
+ // the event.
+ if (mrBase.GetMainViewShell() != nullptr)
+ {
+ if( mrBase.GetMainViewShell()->GetShellType() == ViewShell::ST_IMPRESS )
+ {
+ mxView.set(mrBase.GetDrawController(), UNO_QUERY);
+ onSelectionChanged();
+ onChangeCurrentPage();
+ break;
+ }
+ }
+ [[fallthrough]];
+ case EventMultiplexerEventId::MainViewRemoved:
+ mxView = nullptr;
+ mxCurrentPage = nullptr;
+ updateControls();
+ break;
+
+ case EventMultiplexerEventId::Disposing:
+ mxView.clear();
+ onSelectionChanged();
+ onChangeCurrentPage();
+ break;
+ case EventMultiplexerEventId::EndTextEdit:
+ if (mpMainSequence && rEvent.mpUserData)
+ mxCustomAnimationList->update( mpMainSequence );
+ break;
+ default: break;
+ }
+}
+
+static sal_Int32 getPropertyType( std::u16string_view rProperty )
+{
+ if ( rProperty == u"Direction" )
+ return nPropertyTypeDirection;
+
+ if ( rProperty == u"Spokes" )
+ return nPropertyTypeSpokes;
+
+ if ( rProperty == u"Zoom" )
+ return nPropertyTypeZoom;
+
+ if ( rProperty == u"Accelerate" )
+ return nPropertyTypeAccelerate;
+
+ if ( rProperty == u"Decelerate" )
+ return nPropertyTypeDecelerate;
+
+ if ( rProperty == u"Color1" )
+ return nPropertyTypeFirstColor;
+
+ if ( rProperty == u"Color2" )
+ return nPropertyTypeSecondColor;
+
+ if ( rProperty == u"FillColor" )
+ return nPropertyTypeFillColor;
+
+ if ( rProperty == u"ColorStyle" )
+ return nPropertyTypeColorStyle;
+
+ if ( rProperty == u"AutoReverse" )
+ return nPropertyTypeAutoReverse;
+
+ if ( rProperty == u"FontStyle" )
+ return nPropertyTypeFont;
+
+ if ( rProperty == u"CharColor" )
+ return nPropertyTypeCharColor;
+
+ if ( rProperty == u"CharHeight" )
+ return nPropertyTypeCharHeight;
+
+ if ( rProperty == u"CharDecoration" )
+ return nPropertyTypeCharDecoration;
+
+ if ( rProperty == u"LineColor" )
+ return nPropertyTypeLineColor;
+
+ if ( rProperty == u"Rotate" )
+ return nPropertyTypeRotate;
+
+ if ( rProperty == u"Transparency" )
+ return nPropertyTypeTransparency;
+
+ if ( rProperty == u"Color" )
+ return nPropertyTypeColor;
+
+ if ( rProperty == u"Scale" )
+ return nPropertyTypeScale;
+
+ return nPropertyTypeNone;
+}
+
+OUString getPropertyName( sal_Int32 nPropertyType )
+{
+ switch( nPropertyType )
+ {
+ case nPropertyTypeDirection:
+ return SdResId(STR_CUSTOMANIMATION_DIRECTION_PROPERTY);
+
+ case nPropertyTypeSpokes:
+ return SdResId(STR_CUSTOMANIMATION_SPOKES_PROPERTY);
+
+ case nPropertyTypeFirstColor:
+ return SdResId(STR_CUSTOMANIMATION_FIRST_COLOR_PROPERTY);
+
+ case nPropertyTypeSecondColor:
+ return SdResId(STR_CUSTOMANIMATION_SECOND_COLOR_PROPERTY);
+
+ case nPropertyTypeZoom:
+ return SdResId(STR_CUSTOMANIMATION_ZOOM_PROPERTY);
+
+ case nPropertyTypeFillColor:
+ return SdResId(STR_CUSTOMANIMATION_FILL_COLOR_PROPERTY);
+
+ case nPropertyTypeColorStyle:
+ return SdResId(STR_CUSTOMANIMATION_STYLE_PROPERTY);
+
+ case nPropertyTypeFont:
+ return SdResId(STR_CUSTOMANIMATION_FONT_PROPERTY);
+
+ case nPropertyTypeCharHeight:
+ return SdResId(STR_CUSTOMANIMATION_SIZE_PROPERTY);
+
+ case nPropertyTypeCharColor:
+ return SdResId(STR_CUSTOMANIMATION_FONT_COLOR_PROPERTY);
+
+ case nPropertyTypeCharHeightStyle:
+ return SdResId(STR_CUSTOMANIMATION_FONT_SIZE_STYLE_PROPERTY);
+
+ case nPropertyTypeCharDecoration:
+ return SdResId(STR_CUSTOMANIMATION_FONT_STYLE_PROPERTY);
+
+ case nPropertyTypeLineColor:
+ return SdResId(STR_CUSTOMANIMATION_LINE_COLOR_PROPERTY);
+
+ case nPropertyTypeRotate:
+ return SdResId(STR_CUSTOMANIMATION_AMOUNT_PROPERTY);
+
+ case nPropertyTypeColor:
+ return SdResId(STR_CUSTOMANIMATION_COLOR_PROPERTY);
+
+ case nPropertyTypeTransparency:
+ return SdResId(STR_CUSTOMANIMATION_AMOUNT_PROPERTY);
+
+ case nPropertyTypeScale:
+ return SdResId(STR_CUSTOMANIMATION_SCALE_PROPERTY);
+ }
+
+ return OUString();
+}
+
+void CustomAnimationPane::updateControls()
+{
+ mxFTDuration->set_sensitive(mxView.is());
+ mxCBXDuration->set_sensitive(mxView.is());
+ mxCustomAnimationList->set_sensitive(mxView.is());
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ mxPBPlay->hide();
+ mxCBAutoPreview->set_active(false);
+ mxCBAutoPreview->hide();
+ }
+ else
+ {
+ mxPBPlay->set_sensitive(mxView.is());
+ mxCBAutoPreview->set_sensitive(mxView.is());
+ }
+
+ if (!mxView.is())
+ {
+ mxPBAddEffect->set_sensitive(false);
+ mxPBRemoveEffect->set_sensitive(false);
+ mxFTStart->set_sensitive(false);
+ mxLBStart->set_sensitive(false);
+ mxPBPropertyMore->set_sensitive(false);
+ mxPlaceholderBox->set_sensitive(false);
+ mxFTProperty->set_sensitive(false);
+ mxFTCategory->set_sensitive(false);
+ mxLBCategory->set_sensitive(false);
+ mxFTAnimation->set_sensitive(false);
+ mxLBAnimation->set_sensitive(false);
+ mxFTStartDelay->set_sensitive(false);
+ mxMFStartDelay->set_sensitive(false);
+ mxLBAnimation->clear();
+ mnLastSelectedAnimation = -1;
+ mxCustomAnimationList->clear();
+ return;
+ }
+
+ const int nSelectionCount = maListSelection.size();
+
+ mxPBAddEffect->set_sensitive( maViewSelection.hasValue() );
+ mxPBRemoveEffect->set_sensitive(nSelectionCount != 0);
+ bool bIsSelected = (nSelectionCount > 0);
+
+ if(bIsSelected)
+ {
+ mxFTAnimation->set_sensitive(true);
+ mxLBAnimation->set_sensitive(true);
+ }
+ else
+ {
+ mxFTAnimation->set_sensitive(false);
+ mxLBAnimation->set_sensitive(false);
+ mxLBAnimation->clear();
+ mnLastSelectedAnimation = -1;
+ }
+
+ mxLBCategory->set_sensitive(bIsSelected);
+ mxFTCategory->set_sensitive(bIsSelected);
+
+ mxFTStart->set_sensitive(nSelectionCount > 0);
+ mxLBStart->set_sensitive(nSelectionCount > 0);
+ mxPlaceholderBox->set_sensitive(nSelectionCount > 0);
+ mxPBPropertyMore->set_sensitive(nSelectionCount > 0);
+ mxFTStartDelay->set_sensitive(nSelectionCount > 0);
+ mxMFStartDelay->set_sensitive(nSelectionCount > 0);
+
+ mxFTProperty->set_label(maStrProperty);
+
+ sal_Int32 nOldPropertyType = mnPropertyType;
+
+ mnPropertyType = nPropertyTypeNone;
+
+ if(bIsSelected)
+ {
+ CustomAnimationEffectPtr pEffect = maListSelection.front();
+
+ OUString aUIName( CustomAnimationPresets::getCustomAnimationPresets().getUINameForPresetId( pEffect->getPresetId() ) );
+
+ OUString aTemp( maStrModify );
+
+ if( !aUIName.isEmpty() )
+ {
+ aTemp += " " + aUIName;
+ mxFTEffect->set_label( aTemp );
+ }
+
+ Any aValue;
+ CustomAnimationPresetPtr pDescriptor = CustomAnimationPresets::getCustomAnimationPresets().getEffectDescriptor( pEffect->getPresetId() );
+ if (pDescriptor)
+ {
+ std::vector<OUString> aProperties( pDescriptor->getProperties() );
+ if( !aProperties.empty() )
+ {
+ mnPropertyType = getPropertyType( aProperties.front() );
+
+ mxFTProperty->set_label( getPropertyName( mnPropertyType ) );
+
+ aValue = getProperty1Value( mnPropertyType, pEffect );
+ }
+ }
+
+ sal_Int32 nNewPropertyType = mnPropertyType;
+ // if there is no value, then the control will be disabled, just show a disabled Direction box in that
+ // case to have something to fill the space
+ if (!aValue.hasValue())
+ nNewPropertyType = nPropertyTypeDirection;
+
+ if (!mxLBSubControl || nOldPropertyType != nNewPropertyType)
+ {
+ // for LOK destroy old widgets first
+ mxLBSubControl.reset(nullptr);
+ // then create new control, to keep correct pointers for actions
+ mxLBSubControl = SdPropertySubControl::create(nNewPropertyType, mxFTProperty.get(), mxPlaceholderBox.get(), GetFrameWeld(), aValue, pEffect->getPresetId(), LINK(this, CustomAnimationPane, implPropertyHdl));
+ }
+ else
+ {
+ mxLBSubControl->setValue(aValue, pEffect->getPresetId());
+ }
+
+ bool bEnable = aValue.hasValue();
+ mxPlaceholderBox->set_sensitive( bEnable );
+ mxFTProperty->set_sensitive( bEnable );
+
+ if (!pDescriptor)
+ {
+ mxPBPropertyMore->set_sensitive( false );
+ mxFTStartDelay->set_sensitive( false );
+ mxMFStartDelay->set_sensitive( false );
+ }
+ sal_Int32 nCategoryPos = -1;
+ switch(pEffect->getPresetClass())
+ {
+ case EffectPresetClass::ENTRANCE: nCategoryPos = 0; break;
+ case EffectPresetClass::EMPHASIS: nCategoryPos = 1; break;
+ case EffectPresetClass::EXIT: nCategoryPos = 2; break;
+ case EffectPresetClass::MOTIONPATH: nCategoryPos = 3; break;
+ default:
+ break;
+ }
+ switch(pEffect->getCommand())
+ {
+ case EffectCommands::TOGGLEPAUSE:
+ case EffectCommands::STOP:
+ case EffectCommands::PLAY:
+ nCategoryPos = 4; break;
+ default:
+ break;
+ }
+ mxLBCategory->set_active(nCategoryPos);
+
+ fillAnimationLB( pEffect->hasText() );
+
+ OUString rsPresetId = pEffect->getPresetId();
+ sal_Int32 nAnimationPos = mxLBAnimation->n_children();
+ while( nAnimationPos-- )
+ {
+ auto pEntryData = weld::fromId<CustomAnimationPresetPtr*>(mxLBAnimation->get_id(nAnimationPos));
+ if (pEntryData)
+ {
+ CustomAnimationPresetPtr& pPtr = *pEntryData;
+ if( pPtr && pPtr->getPresetId() == rsPresetId )
+ {
+ mxLBAnimation->select( nAnimationPos );
+ mnLastSelectedAnimation = nAnimationPos;
+ break;
+ }
+ }
+ }
+
+ // If preset id is missing and category is motion path.
+ if (nAnimationPos < 0 && nCategoryPos == 3)
+ {
+ if (rsPresetId == "libo-motionpath-curve")
+ {
+ mxLBAnimation->select(mnCurvePathPos);
+ mnLastSelectedAnimation = mnCurvePathPos;
+ }
+ else if (rsPresetId == "libo-motionpath-polygon")
+ {
+ mxLBAnimation->select(mnPolygonPathPos);
+ mnLastSelectedAnimation = mnPolygonPathPos;
+ }
+ else if (rsPresetId == "libo-motionpath-freeform-line")
+ {
+ mxLBAnimation->select(mnFreeformPathPos);
+ mnLastSelectedAnimation = mnFreeformPathPos;
+ }
+ }
+
+ sal_uInt16 nPos = 0xffff;
+
+ sal_Int16 nNodeType = pEffect->getNodeType();
+ switch( nNodeType )
+ {
+ case EffectNodeType::ON_CLICK: nPos = 0; break;
+ case EffectNodeType::WITH_PREVIOUS: nPos = 1; break;
+ case EffectNodeType::AFTER_PREVIOUS: nPos = 2; break;
+ }
+
+ mxLBStart->set_active( nPos );
+
+ double fDuration = pEffect->getDuration();
+ const bool bHasSpeed = fDuration > 0.001;
+
+ mxFTDuration->set_sensitive(bHasSpeed);
+ mxCBXDuration->set_sensitive(bHasSpeed);
+
+ if( bHasSpeed )
+ {
+ mxCBXDuration->set_value(fDuration*100.0, FieldUnit::NONE);
+ }
+
+ mxPBPropertyMore->set_sensitive(true);
+
+ mxFTStartDelay->set_sensitive(true);
+ mxMFStartDelay->set_sensitive(true);
+ double fBegin = pEffect->getBegin();
+ mxMFStartDelay->set_value(fBegin*10.0, FieldUnit::NONE);
+ }
+ else
+ {
+ // use an empty direction box to fill the space
+ if (!mxLBSubControl || (nOldPropertyType != nPropertyTypeDirection && nOldPropertyType != nPropertyTypeNone))
+ {
+ // for LOK destroy old widgets first
+ mxLBSubControl.reset(nullptr);
+ // then create new control, to keep correct pointers for actions
+ mxLBSubControl = SdPropertySubControl::create(nPropertyTypeDirection, mxFTProperty.get(), mxPlaceholderBox.get(), GetFrameWeld(), uno::Any(), OUString(), LINK(this, CustomAnimationPane, implPropertyHdl));
+ }
+ else
+ mxLBSubControl->setValue(uno::Any(), OUString());
+
+ mxPlaceholderBox->set_sensitive(false);
+ mxFTProperty->set_sensitive(false);
+ mxFTStartDelay->set_sensitive(false);
+ mxMFStartDelay->set_sensitive(false);
+ mxPBPropertyMore->set_sensitive(false);
+ mxFTDuration->set_sensitive(false);
+ mxCBXDuration->set_sensitive(false);
+ mxCBXDuration->set_text(OUString());
+ mxFTEffect->set_label(maStrModify);
+ }
+
+ bool bEnableUp = true;
+ bool bEnableDown = true;
+ if( nSelectionCount == 0 )
+ {
+ bEnableUp = false;
+ bEnableDown = false;
+ }
+ else
+ {
+ if( mpMainSequence->find( maListSelection.front() ) == mpMainSequence->getBegin() )
+ bEnableUp = false;
+
+ EffectSequence::iterator aIter( mpMainSequence->find( maListSelection.back() ) );
+ if( aIter == mpMainSequence->getEnd() )
+ {
+ bEnableDown = false;
+ }
+ else
+ {
+ do
+ {
+ ++aIter;
+ }
+ while( (aIter != mpMainSequence->getEnd()) && !(mxCustomAnimationList->isExpanded(*aIter) ) );
+
+ if( aIter == mpMainSequence->getEnd() )
+ bEnableDown = false;
+ }
+
+ if( bEnableUp || bEnableDown )
+ {
+ MainSequenceRebuildGuard aGuard( mpMainSequence );
+
+ EffectSequenceHelper* pSequence = nullptr;
+ for( const CustomAnimationEffectPtr& pEffect : maListSelection )
+ {
+ if( pEffect )
+ {
+ if( pSequence == nullptr )
+ {
+ pSequence = pEffect->getEffectSequence();
+ }
+ else
+ {
+ if( pSequence != pEffect->getEffectSequence() )
+ {
+ bEnableUp = false;
+ bEnableDown = false;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ mxPBMoveUp->set_sensitive(mxView.is() && bEnableUp);
+ mxPBMoveDown->set_sensitive(mxView.is() && bEnableDown);
+
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress);
+ mxCBAutoPreview->set_active(pOptions->IsPreviewChangedEffects());
+
+ updateMotionPathTags();
+}
+
+static bool updateMotionPathImpl( CustomAnimationPane& rPane, ::sd::View& rView, EffectSequence::iterator aIter, const EffectSequence::iterator& aEnd, MotionPathTagVector& rOldTags, MotionPathTagVector& rNewTags )
+{
+ bool bChanges = false;
+ while( aIter != aEnd )
+ {
+ CustomAnimationEffectPtr pEffect( *aIter++ );
+ if( pEffect && pEffect->getPresetClass() == css::presentation::EffectPresetClass::MOTIONPATH )
+ {
+ rtl::Reference< MotionPathTag > xMotionPathTag;
+ // first try to find if there is already a tag for this
+ auto aMIter = std::find_if(rOldTags.begin(), rOldTags.end(),
+ [&pEffect](const rtl::Reference<MotionPathTag>& xTag) { return xTag->getEffect() == pEffect; });
+ if (aMIter != rOldTags.end())
+ {
+ rtl::Reference< MotionPathTag > xTag( *aMIter );
+ if( !xTag->isDisposed() )
+ {
+ xMotionPathTag = xTag;
+ rOldTags.erase( aMIter );
+ }
+ }
+
+ // if not found, create new one
+ if( !xMotionPathTag.is() )
+ {
+ xMotionPathTag.set( new MotionPathTag( rPane, rView, pEffect ) );
+ bChanges = true;
+ }
+
+ if( xMotionPathTag.is() )
+ rNewTags.push_back( xMotionPathTag );
+ }
+ }
+
+ return bChanges;
+}
+
+void CustomAnimationPane::updateMotionPathTags()
+{
+ bool bChanges = false;
+
+ MotionPathTagVector aTags;
+ aTags.swap( maMotionPathTags );
+
+ ::sd::View* pView = nullptr;
+
+ if( mxView.is() )
+ {
+ std::shared_ptr<ViewShell> xViewShell( mrBase.GetMainViewShell() );
+ if( xViewShell )
+ pView = xViewShell->GetView();
+ }
+
+ if (mpMainSequence && pView)
+ {
+ bChanges = updateMotionPathImpl( *this, *pView, mpMainSequence->getBegin(), mpMainSequence->getEnd(), aTags, maMotionPathTags );
+
+ auto rInteractiveSequenceVector = mpMainSequence->getInteractiveSequenceVector();
+ for (InteractiveSequencePtr const& pIS : rInteractiveSequenceVector)
+ {
+ bChanges |= updateMotionPathImpl( *this, *pView, pIS->getBegin(), pIS->getEnd(), aTags, maMotionPathTags );
+ }
+ }
+
+ if( !aTags.empty() )
+ {
+ bChanges = true;
+ for( rtl::Reference< MotionPathTag >& xTag : aTags )
+ {
+ xTag->Dispose();
+ }
+ }
+
+ if( bChanges && pView )
+ pView->updateHandles();
+}
+
+void CustomAnimationPane::onSelectionChanged()
+{
+ if( maSelectionLock.isLocked() )
+ return;
+
+ ScopeLockGuard aGuard( maSelectionLock );
+
+ if( mxView.is() ) try
+ {
+ Reference< XSelectionSupplier > xSel( mxView, UNO_QUERY_THROW );
+ maViewSelection = xSel->getSelection();
+ mxCustomAnimationList->onSelectionChanged( maViewSelection );
+ updateControls();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPane::onSelectionChanged()" );
+ }
+}
+
+void CustomAnimationPane::onDoubleClick()
+{
+ showOptions();
+}
+
+void CustomAnimationPane::onContextMenu(const OString &rIdent)
+{
+ if (rIdent == "onclick")
+ onChangeStart( EffectNodeType::ON_CLICK );
+ else if (rIdent == "withprev")
+ onChangeStart( EffectNodeType::WITH_PREVIOUS );
+ else if (rIdent == "afterprev")
+ onChangeStart( EffectNodeType::AFTER_PREVIOUS );
+ else if (rIdent == "options")
+ showOptions();
+ else if (rIdent == "timing")
+ showOptions("timing");
+ else if (rIdent == "remove")
+ onRemove();
+ else if (rIdent == "create" && maViewSelection.hasValue())
+ onAdd();
+ updateControls();
+}
+
+static void addValue( const std::unique_ptr<STLPropertySet>& pSet, sal_Int32 nHandle, const Any& rValue )
+{
+ switch( pSet->getPropertyState( nHandle ) )
+ {
+ case STLPropertyState::Ambiguous:
+ // value is already ambiguous, do nothing
+ break;
+ case STLPropertyState::Direct:
+ // set to ambiguous if existing value is different
+ if( rValue != pSet->getPropertyValue( nHandle ) )
+ pSet->setPropertyState( nHandle, STLPropertyState::Ambiguous );
+ break;
+ case STLPropertyState::Default:
+ // just set new value
+ pSet->setPropertyValue( nHandle, rValue );
+ break;
+ }
+}
+
+static sal_Int32 calcMaxParaDepth( const Reference< XShape >& xTargetShape )
+{
+ sal_Int32 nMaxParaDepth = -1;
+
+ if( xTargetShape.is() )
+ {
+ Reference< XEnumerationAccess > xText( xTargetShape, UNO_QUERY );
+ if( xText.is() )
+ {
+ Reference< XPropertySet > xParaSet;
+
+ Reference< XEnumeration > xEnumeration( xText->createEnumeration(), UNO_SET_THROW );
+ while( xEnumeration->hasMoreElements() )
+ {
+ xEnumeration->nextElement() >>= xParaSet;
+ if( xParaSet.is() )
+ {
+ sal_Int32 nParaDepth = 0;
+ xParaSet->getPropertyValue( "NumberingLevel" ) >>= nParaDepth;
+
+ if( nParaDepth > nMaxParaDepth )
+ nMaxParaDepth = nParaDepth;
+ }
+ }
+ }
+ }
+
+ return nMaxParaDepth + 1;
+}
+
+Any CustomAnimationPane::getProperty1Value( sal_Int32 nType, const CustomAnimationEffectPtr& pEffect )
+{
+ switch( nType )
+ {
+ case nPropertyTypeDirection:
+ case nPropertyTypeSpokes:
+ case nPropertyTypeZoom:
+ return Any( pEffect->getPresetSubType() );
+
+ case nPropertyTypeColor:
+ case nPropertyTypeFillColor:
+ case nPropertyTypeFirstColor:
+ case nPropertyTypeSecondColor:
+ case nPropertyTypeCharColor:
+ case nPropertyTypeLineColor:
+ {
+ const sal_Int32 nIndex = (nPropertyTypeFirstColor == nType) ? 0 : 1;
+ return pEffect->getColor( nIndex );
+ }
+
+ case nPropertyTypeFont:
+ return pEffect->getProperty( AnimationNodeType::SET, u"CharFontName" , EValue::To );
+
+ case nPropertyTypeCharHeight:
+ {
+ static const OUStringLiteral aAttributeName( u"CharHeight" );
+ Any aValue( pEffect->getProperty( AnimationNodeType::SET, aAttributeName, EValue::To ) );
+ if( !aValue.hasValue() )
+ aValue = pEffect->getProperty( AnimationNodeType::ANIMATE, aAttributeName, EValue::To );
+ return aValue;
+ }
+
+ case nPropertyTypeRotate:
+ return pEffect->getTransformationProperty( AnimationTransformType::ROTATE, EValue::By);
+
+ case nPropertyTypeTransparency:
+ return pEffect->getProperty( AnimationNodeType::SET, u"Opacity" , EValue::To );
+
+ case nPropertyTypeScale:
+ return pEffect->getTransformationProperty( AnimationTransformType::SCALE, EValue::By );
+
+ case nPropertyTypeCharDecoration:
+ {
+ Sequence< Any > aValues{
+ pEffect->getProperty( AnimationNodeType::SET, u"CharWeight" , EValue::To ),
+ pEffect->getProperty( AnimationNodeType::SET, u"CharPosture" , EValue::To ),
+ pEffect->getProperty( AnimationNodeType::SET, u"CharUnderline" , EValue::To )
+ };
+ return Any( aValues );
+ }
+ }
+
+ Any aAny;
+ return aAny;
+}
+
+bool CustomAnimationPane::setProperty1Value( sal_Int32 nType, const CustomAnimationEffectPtr& pEffect, const Any& rValue )
+{
+ bool bEffectChanged = false;
+ switch( nType )
+ {
+ case nPropertyTypeDirection:
+ case nPropertyTypeSpokes:
+ case nPropertyTypeZoom:
+ {
+ OUString aPresetSubType;
+ rValue >>= aPresetSubType;
+ if( aPresetSubType != pEffect->getPresetSubType() )
+ {
+ CustomAnimationPresets::getCustomAnimationPresets().changePresetSubType( pEffect, aPresetSubType );
+ bEffectChanged = true;
+ }
+ }
+ break;
+
+ case nPropertyTypeFillColor:
+ case nPropertyTypeColor:
+ case nPropertyTypeFirstColor:
+ case nPropertyTypeSecondColor:
+ case nPropertyTypeCharColor:
+ case nPropertyTypeLineColor:
+ {
+ const sal_Int32 nIndex = (nPropertyTypeFirstColor == nType) ? 0 : 1;
+ Any aOldColor( pEffect->getColor( nIndex ) );
+ if( aOldColor != rValue )
+ {
+ pEffect->setColor( nIndex, rValue );
+ bEffectChanged = true;
+ }
+ }
+ break;
+
+ case nPropertyTypeFont:
+ bEffectChanged = pEffect->setProperty( AnimationNodeType::SET, u"CharFontName" , EValue::To, rValue );
+ break;
+
+ case nPropertyTypeCharHeight:
+ {
+ static const OUStringLiteral aAttributeName( u"CharHeight" );
+ bEffectChanged = pEffect->setProperty( AnimationNodeType::SET, aAttributeName, EValue::To, rValue );
+ if( !bEffectChanged )
+ bEffectChanged = pEffect->setProperty( AnimationNodeType::ANIMATE, aAttributeName, EValue::To, rValue );
+ }
+ break;
+ case nPropertyTypeRotate:
+ bEffectChanged = pEffect->setTransformationProperty( AnimationTransformType::ROTATE, EValue::By , rValue );
+ break;
+
+ case nPropertyTypeTransparency:
+ bEffectChanged = pEffect->setProperty( AnimationNodeType::SET, u"Opacity" , EValue::To, rValue );
+ break;
+
+ case nPropertyTypeScale:
+ bEffectChanged = pEffect->setTransformationProperty( AnimationTransformType::SCALE, EValue::By, rValue );
+ break;
+
+ case nPropertyTypeCharDecoration:
+ {
+ Sequence< Any > aValues(3);
+ rValue >>= aValues;
+ bEffectChanged = pEffect->setProperty( AnimationNodeType::SET, u"CharWeight" , EValue::To, aValues[0] );
+ bEffectChanged |= pEffect->setProperty( AnimationNodeType::SET, u"CharPosture" , EValue::To, aValues[1] );
+ bEffectChanged |= pEffect->setProperty( AnimationNodeType::SET, u"CharUnderline" , EValue::To, aValues[2] );
+ }
+ break;
+
+ }
+
+ return bEffectChanged;
+}
+
+static bool hasVisibleShape( const Reference< XShape >& xShape )
+{
+ try
+ {
+ const OUString sShapeType( xShape->getShapeType() );
+
+ if( sShapeType == "com.sun.star.presentation.TitleTextShape" || sShapeType == "com.sun.star.presentation.OutlinerShape" ||
+ sShapeType == "com.sun.star.presentation.SubtitleShape" || sShapeType == "com.sun.star.drawing.TextShape" )
+ {
+ Reference< XPropertySet > xSet( xShape, UNO_QUERY_THROW );
+
+ FillStyle eFillStyle;
+ xSet->getPropertyValue( "FillStyle" ) >>= eFillStyle;
+
+ css::drawing::LineStyle eLineStyle;
+ xSet->getPropertyValue( "LineStyle" ) >>= eLineStyle;
+
+ return eFillStyle != FillStyle_NONE || eLineStyle != css::drawing::LineStyle_NONE;
+ }
+ }
+ catch( Exception& )
+ {
+ }
+ return true;
+}
+
+std::unique_ptr<STLPropertySet> CustomAnimationPane::createSelectionSet()
+{
+ std::unique_ptr<STLPropertySet> pSet = CustomAnimationDialog::createDefaultSet();
+
+ pSet->setPropertyValue( nHandleCurrentPage, Any( mxCurrentPage ) );
+
+ sal_Int32 nMaxParaDepth = 0;
+
+ // get options from selected effects
+ const CustomAnimationPresets& rPresets (CustomAnimationPresets::getCustomAnimationPresets());
+ for( CustomAnimationEffectPtr& pEffect : maListSelection )
+ {
+ EffectSequenceHelper* pEffectSequence = pEffect->getEffectSequence();
+ if( !pEffectSequence )
+ pEffectSequence = mpMainSequence.get();
+
+ if( pEffect->hasText() )
+ {
+ sal_Int32 n = calcMaxParaDepth(pEffect->getTargetShape());
+ if( n > nMaxParaDepth )
+ nMaxParaDepth = n;
+ }
+
+ addValue( pSet, nHandleHasAfterEffect, Any( pEffect->hasAfterEffect() ) );
+ addValue( pSet, nHandleAfterEffectOnNextEffect, Any( pEffect->IsAfterEffectOnNext() ) );
+ addValue( pSet, nHandleDimColor, pEffect->getDimColor() );
+ addValue( pSet, nHandleIterateType, Any( pEffect->getIterateType() ) );
+
+ // convert absolute time to percentage value
+ // This calculation is done in float to avoid some rounding artifacts.
+ float fIterateInterval = static_cast<float>(pEffect->getIterateInterval());
+ if( pEffect->getDuration() )
+ fIterateInterval = static_cast<float>(fIterateInterval / pEffect->getDuration() );
+ fIterateInterval *= 100.0;
+ addValue( pSet, nHandleIterateInterval, Any( static_cast<double>(fIterateInterval) ) );
+
+ addValue( pSet, nHandleBegin, Any( pEffect->getBegin() ) );
+ addValue( pSet, nHandleDuration, Any( pEffect->getDuration() ) );
+ addValue( pSet, nHandleStart, Any( pEffect->getNodeType() ) );
+ addValue( pSet, nHandleRepeat, pEffect->getRepeatCount() );
+ addValue( pSet, nHandleEnd, pEffect->getEnd() );
+ addValue( pSet, nHandleRewind, Any( pEffect->getFill() ) );
+
+ addValue( pSet, nHandlePresetId, Any( pEffect->getPresetId() ) );
+
+ addValue( pSet, nHandleHasText, Any( pEffect->hasText() ) );
+
+ addValue( pSet, nHandleHasVisibleShape, Any( hasVisibleShape( pEffect->getTargetShape() ) ) );
+
+ Any aSoundSource;
+ if( pEffect->getAudio().is() )
+ {
+ aSoundSource = pEffect->getAudio()->getSource();
+ addValue( pSet, nHandleSoundVolume, Any( pEffect->getAudio()->getVolume() ) );
+// todo addValue( pSet, nHandleSoundEndAfterSlide, makeAny( pEffect->getAudio()->getEndAfterSlide() ) );
+// this is now stored at the XCommand parameter sequence
+ }
+ else if( pEffect->getCommand() == EffectCommands::STOPAUDIO )
+ {
+ aSoundSource <<= true;
+ }
+ addValue( pSet, nHandleSoundURL, aSoundSource );
+
+ sal_Int32 nGroupId = pEffect->getGroupId();
+ CustomAnimationTextGroupPtr pTextGroup;
+ if( nGroupId != -1 )
+ pTextGroup = pEffectSequence->findGroup( nGroupId );
+
+ addValue( pSet, nHandleTextGrouping, Any( pTextGroup ? pTextGroup->getTextGrouping() : sal_Int32(-1) ) );
+ addValue( pSet, nHandleAnimateForm, Any( !pTextGroup || pTextGroup->getAnimateForm() ) );
+ addValue( pSet, nHandleTextGroupingAuto, Any( pTextGroup ? pTextGroup->getTextGroupingAuto() : -1.0 ) );
+ addValue( pSet, nHandleTextReverse, Any( pTextGroup && pTextGroup->getTextReverse() ) );
+
+ if( pEffectSequence->getSequenceType() == EffectNodeType::INTERACTIVE_SEQUENCE )
+ {
+ InteractiveSequence* pIS = static_cast< InteractiveSequence* >( pEffectSequence );
+ addValue( pSet, nHandleTrigger, Any( pIS->getTriggerShape() ) );
+ }
+
+ CustomAnimationPresetPtr pDescriptor = rPresets.getEffectDescriptor( pEffect->getPresetId() );
+ if( pDescriptor )
+ {
+ sal_Int32 nType = nPropertyTypeNone;
+
+ std::vector<OUString> aProperties( pDescriptor->getProperties() );
+ if( !aProperties.empty() )
+ nType = getPropertyType( aProperties.front() );
+
+ if( nType != nPropertyTypeNone )
+ {
+ addValue( pSet, nHandleProperty1Type, Any( nType ) );
+ addValue( pSet, nHandleProperty1Value, getProperty1Value( nType, pEffect ) );
+ }
+
+ if( pDescriptor->hasProperty( u"Accelerate" ) )
+ {
+ addValue( pSet, nHandleAccelerate, Any( pEffect->getAcceleration() ) );
+ }
+
+ if( pDescriptor->hasProperty( u"Decelerate" ) )
+ {
+ addValue( pSet, nHandleDecelerate, Any( pEffect->getDecelerate() ) );
+ }
+
+ if( pDescriptor->hasProperty( u"AutoReverse" ) )
+ {
+ addValue( pSet, nHandleAutoReverse, Any( pEffect->getAutoReverse() ) );
+ }
+ }
+ }
+
+ addValue( pSet, nHandleMaxParaDepth, Any( nMaxParaDepth ) );
+
+ return pSet;
+}
+
+void CustomAnimationPane::changeSelection( STLPropertySet const * pResultSet, STLPropertySet const * pOldSet )
+{
+ // change selected effect
+ bool bChanged = false;
+
+ MainSequenceRebuildGuard aGuard( mpMainSequence );
+
+ for( CustomAnimationEffectPtr& pEffect : maListSelection )
+ {
+ DBG_ASSERT( pEffect->getEffectSequence(), "sd::CustomAnimationPane::changeSelection(), dead effect in selection!" );
+ if( !pEffect->getEffectSequence() )
+ continue;
+
+ double fDuration = 0.0; // we might need this for iterate-interval
+ if( pResultSet->getPropertyState( nHandleDuration ) == STLPropertyState::Direct )
+ {
+ pResultSet->getPropertyValue( nHandleDuration ) >>= fDuration;
+ }
+ else
+ {
+ fDuration = pEffect->getDuration();
+ }
+
+ if( pResultSet->getPropertyState( nHandleIterateType ) == STLPropertyState::Direct )
+ {
+ sal_Int16 nIterateType = 0;
+ pResultSet->getPropertyValue( nHandleIterateType ) >>= nIterateType;
+ if( pEffect->getIterateType() != nIterateType )
+ {
+ pEffect->setIterateType( nIterateType );
+ bChanged = true;
+ }
+ }
+
+ if( pEffect->getIterateType() )
+ {
+ if( pResultSet->getPropertyState( nHandleIterateInterval ) == STLPropertyState::Direct )
+ {
+ double fIterateInterval = 0.0;
+ pResultSet->getPropertyValue( nHandleIterateInterval ) >>= fIterateInterval;
+ if( pEffect->getIterateInterval() != fIterateInterval )
+ {
+ const double f = fIterateInterval * pEffect->getDuration() / 100;
+ pEffect->setIterateInterval( f );
+ bChanged = true;
+ }
+ }
+ }
+
+ double fBegin = 0.0;
+
+ if( pResultSet->getPropertyState( nHandleBegin ) == STLPropertyState::Direct )
+ pResultSet->getPropertyValue( nHandleBegin ) >>= fBegin;
+ else
+ fBegin = pEffect->getBegin();
+
+ if( pEffect->getBegin() != fBegin && pResultSet->getPropertyState( nHandleBegin ) == STLPropertyState::Direct)
+ {
+ pEffect->setBegin( fBegin );
+ bChanged = true;
+ }
+
+ if( pResultSet->getPropertyState( nHandleDuration ) == STLPropertyState::Direct )
+ {
+ if( pEffect->getDuration() != fDuration )
+ {
+ pEffect->setDuration( fDuration );
+ bChanged = true;
+ }
+ }
+
+ if( pResultSet->getPropertyState( nHandleStart ) == STLPropertyState::Direct )
+ {
+ sal_Int16 nNodeType = 0;
+ pResultSet->getPropertyValue( nHandleStart ) >>= nNodeType;
+ if( pEffect->getNodeType() != nNodeType )
+ {
+ pEffect->setNodeType( nNodeType );
+ bChanged = true;
+ }
+ }
+
+ if( pResultSet->getPropertyState( nHandleRepeat ) == STLPropertyState::Direct )
+ {
+ Any aRepeatCount( pResultSet->getPropertyValue( nHandleRepeat ) );
+ if( aRepeatCount != pEffect->getRepeatCount() )
+ {
+ pEffect->setRepeatCount( aRepeatCount );
+ bChanged = true;
+ }
+ }
+
+ if( pResultSet->getPropertyState( nHandleEnd ) == STLPropertyState::Direct )
+ {
+ Any aEndValue( pResultSet->getPropertyValue( nHandleEnd ) );
+ if( pEffect->getEnd() != aEndValue )
+ {
+ pEffect->setEnd( aEndValue );
+ bChanged = true;
+ }
+ }
+
+ if( pResultSet->getPropertyState( nHandleRewind ) == STLPropertyState::Direct )
+ {
+ sal_Int16 nFill = 0;
+ pResultSet->getPropertyValue( nHandleRewind ) >>= nFill;
+ if( pEffect->getFill() != nFill )
+ {
+ pEffect->setFill( nFill );
+ bChanged = true;
+ }
+ }
+
+ if( pResultSet->getPropertyState( nHandleHasAfterEffect ) == STLPropertyState::Direct )
+ {
+ bool bHasAfterEffect = false;
+ if( pResultSet->getPropertyValue( nHandleHasAfterEffect ) >>= bHasAfterEffect )
+ {
+ if( pEffect->hasAfterEffect() != bHasAfterEffect )
+ {
+ pEffect->setHasAfterEffect( bHasAfterEffect );
+ bChanged = true;
+ }
+ }
+ }
+
+ if( pResultSet->getPropertyState( nHandleAfterEffectOnNextEffect ) == STLPropertyState::Direct )
+ {
+ bool bAfterEffectOnNextEffect = false;
+ if( (pResultSet->getPropertyValue( nHandleAfterEffectOnNextEffect ) >>= bAfterEffectOnNextEffect)
+ && (pEffect->IsAfterEffectOnNext() != bAfterEffectOnNextEffect) )
+ {
+ pEffect->setAfterEffectOnNext( bAfterEffectOnNextEffect );
+ bChanged = true;
+ }
+ }
+
+ if( pResultSet->getPropertyState( nHandleDimColor ) == STLPropertyState::Direct )
+ {
+ Any aDimColor( pResultSet->getPropertyValue( nHandleDimColor ) );
+ if( pEffect->getDimColor() != aDimColor )
+ {
+ pEffect->setDimColor( aDimColor );
+ bChanged = true;
+ }
+ }
+
+ if( pResultSet->getPropertyState( nHandleAccelerate ) == STLPropertyState::Direct )
+ {
+ double fAccelerate = 0.0;
+ pResultSet->getPropertyValue( nHandleAccelerate ) >>= fAccelerate;
+ if( pEffect->getAcceleration() != fAccelerate )
+ {
+ pEffect->setAcceleration( fAccelerate );
+ bChanged = true;
+ }
+ }
+
+ if( pResultSet->getPropertyState( nHandleDecelerate ) == STLPropertyState::Direct )
+ {
+ double fDecelerate = 0.0;
+ pResultSet->getPropertyValue( nHandleDecelerate ) >>= fDecelerate;
+ if( pEffect->getDecelerate() != fDecelerate )
+ {
+ pEffect->setDecelerate( fDecelerate );
+ bChanged = true;
+ }
+ }
+
+ if( pResultSet->getPropertyState( nHandleAutoReverse ) == STLPropertyState::Direct )
+ {
+ bool bAutoReverse = false;
+ pResultSet->getPropertyValue( nHandleAutoReverse ) >>= bAutoReverse;
+ if( pEffect->getAutoReverse() != bAutoReverse )
+ {
+ pEffect->setAutoReverse( bAutoReverse );
+ bChanged = true;
+ }
+ }
+
+ if( pResultSet->getPropertyState( nHandleProperty1Value ) == STLPropertyState::Direct )
+ {
+ sal_Int32 nType = 0;
+ pOldSet->getPropertyValue( nHandleProperty1Type ) >>= nType;
+
+ bChanged |= setProperty1Value( nType, pEffect, pResultSet->getPropertyValue( nHandleProperty1Value ) );
+ }
+
+ if( pResultSet->getPropertyState( nHandleSoundURL ) == STLPropertyState::Direct )
+ {
+ const Any aSoundSource( pResultSet->getPropertyValue( nHandleSoundURL ) );
+
+ if( aSoundSource.getValueType() == ::cppu::UnoType<sal_Bool>::get() )
+ {
+ pEffect->setStopAudio();
+ bChanged = true;
+ }
+ else
+ {
+ OUString aSoundURL;
+ aSoundSource >>= aSoundURL;
+
+ if( !aSoundURL.isEmpty() )
+ {
+ if( !pEffect->getAudio().is() )
+ {
+ pEffect->createAudio( aSoundSource );
+ bChanged = true;
+ }
+ else
+ {
+ if( pEffect->getAudio()->getSource() != aSoundSource )
+ {
+ pEffect->getAudio()->setSource( aSoundSource );
+ bChanged = true;
+ }
+ }
+ }
+ else
+ {
+ if( pEffect->getAudio().is() || pEffect->getStopAudio() )
+ {
+ pEffect->removeAudio();
+ bChanged = true;
+ }
+ }
+ }
+ }
+
+ if( pResultSet->getPropertyState( nHandleTrigger ) == STLPropertyState::Direct )
+ {
+ Reference< XShape > xTriggerShape;
+ pResultSet->getPropertyValue( nHandleTrigger ) >>= xTriggerShape;
+ bChanged |= mpMainSequence->setTrigger( pEffect, xTriggerShape );
+ }
+ }
+
+ const bool bHasTextGrouping = pResultSet->getPropertyState( nHandleTextGrouping ) == STLPropertyState::Direct;
+ const bool bHasAnimateForm = pResultSet->getPropertyState( nHandleAnimateForm ) == STLPropertyState::Direct;
+ const bool bHasTextGroupingAuto = pResultSet->getPropertyState( nHandleTextGroupingAuto ) == STLPropertyState::Direct;
+ const bool bHasTextReverse = pResultSet->getPropertyState( nHandleTextReverse ) == STLPropertyState::Direct;
+
+ if( bHasTextGrouping || bHasAnimateForm || bHasTextGroupingAuto || bHasTextReverse )
+ {
+ // we need to do a second pass for text grouping options
+ // since changing them can cause effects to be removed
+ // or replaced, we do this after we applied all other options
+ // above
+
+ sal_Int32 nTextGrouping = 0;
+ bool bAnimateForm = true, bTextReverse = false;
+ double fTextGroupingAuto = -1.0;
+
+ if( bHasTextGrouping )
+ pResultSet->getPropertyValue(nHandleTextGrouping) >>= nTextGrouping;
+ else
+ pOldSet->getPropertyValue(nHandleTextGrouping) >>= nTextGrouping;
+
+ if( bHasAnimateForm )
+ pResultSet->getPropertyValue(nHandleAnimateForm) >>= bAnimateForm;
+ else
+ pOldSet->getPropertyValue(nHandleAnimateForm) >>= bAnimateForm;
+
+ if( bHasTextGroupingAuto )
+ pResultSet->getPropertyValue(nHandleTextGroupingAuto) >>= fTextGroupingAuto;
+ else
+ pOldSet->getPropertyValue(nHandleTextGroupingAuto) >>= fTextGroupingAuto;
+
+ if( bHasTextReverse )
+ pResultSet->getPropertyValue(nHandleTextReverse) >>= bTextReverse;
+ else
+ pOldSet->getPropertyValue(nHandleTextReverse) >>= bTextReverse;
+
+ EffectSequence const aSelectedEffects( maListSelection );
+ for( CustomAnimationEffectPtr const& pEffect : aSelectedEffects )
+ {
+ EffectSequenceHelper* pEffectSequence = pEffect->getEffectSequence();
+ if( !pEffectSequence )
+ pEffectSequence = mpMainSequence.get();
+
+ sal_Int32 nGroupId = pEffect->getGroupId();
+ CustomAnimationTextGroupPtr pTextGroup;
+ if( nGroupId != -1 )
+ {
+ // use existing group
+ pTextGroup = pEffectSequence->findGroup( nGroupId );
+ }
+ else
+ {
+ // somethings changed so we need a group now
+ pTextGroup = pEffectSequence->createTextGroup( pEffect, nTextGrouping, fTextGroupingAuto, bAnimateForm, bTextReverse );
+ bChanged = true;
+ }
+
+ //#i119988#
+ /************************************************************************/
+ /*
+ Note, the setAnimateForm means set the animation from TextGroup to Object's Shape
+ And on the UI in means "Animate attached shape" in "Effect Option" dialog
+ The setTextGrouping means set animation to Object's Text,
+ the nTextGrouping is Text Animation Type
+ nTextGrouping = -1 is "As one Object", means no text animation.
+
+ The previous call order first do the setTextGrouping and then do the setAnimateForm,
+ that will cause such defect: in the setTextGrouping, the effect has been removed,
+ but in setAnimateForm still need this effect, then a NULL pointer of that effect will
+ be gotten, and cause crash.
+
+ []bHasAnimateForm means the UI has changed, bAnimateForm is it value
+
+ So if create a new textgroup animation, the following animation will never be run!
+ Since the \A1\B0Animate attached shape\A1\B1 is default checked.
+ And the bHasAnimateForm default is false, and if user uncheck it the value bAnimateForm will be false,
+ it same as the TextGroup\A1\AFs default value, also could not be run setAnimateForm.
+ if( bHasAnimateForm )
+ {
+ if( pTextGroup->getAnimateForm() != bAnimateForm )
+ {
+ pEffectSequence->setAnimateForm( pTextGroup, bAnimateForm );
+ bChanged = true;
+ }
+ }
+
+ In setTextGrouping, there are three case:
+ 1. Create new text effects for empty TextGroup
+ 2. Remove all text effects of TextGroup (nTextGrouping == -1)
+ 3. Change all the text effects\A1\AF start type
+
+ So here is the right logic:
+ If set the animation from text to shape and remove text animation,
+ should do setAnimateForm first, then do setTextGrouping.
+ Other case,do setTextGrouping first, then do setAnimateForm.
+
+ */
+ /************************************************************************/
+
+ bool bDoSetAnimateFormFirst = false;
+ bool bNeedDoSetAnimateForm = false;
+
+ if( bHasAnimateForm )
+ {
+ if( pTextGroup && pTextGroup->getAnimateForm() != bAnimateForm )
+ {
+ if( (pTextGroup->getTextGrouping() >= 0) && (nTextGrouping == -1 ) )
+ {
+ bDoSetAnimateFormFirst = true;
+ }
+ bNeedDoSetAnimateForm = true;
+ }
+ }
+
+ if (bDoSetAnimateFormFirst)
+ {
+ pEffectSequence->setAnimateForm( pTextGroup, bAnimateForm );
+ bChanged = true;
+ }
+
+ if( bHasTextGrouping )
+ {
+ if( pTextGroup && pTextGroup->getTextGrouping() != nTextGrouping )
+ {
+ pEffectSequence->setTextGrouping( pTextGroup, nTextGrouping );
+
+ // All the effects of the outline object is removed so we need to
+ // put it back. OTOH, the shape object that still has effects
+ // in the text group is fine.
+ if (nTextGrouping == -1 && pTextGroup->getEffects().empty())
+ {
+ pEffect->setTarget(Any(pEffect->getTargetShape()));
+ pEffect->setGroupId(-1);
+ mpMainSequence->append(pEffect);
+ }
+
+ bChanged = true;
+ }
+ }
+
+ if (!bDoSetAnimateFormFirst && bNeedDoSetAnimateForm)
+ {
+ if( pTextGroup )
+ {
+ pEffectSequence->setAnimateForm( pTextGroup, bAnimateForm );
+ bChanged = true;
+ }
+ }
+
+ if( bHasTextGroupingAuto )
+ {
+ if( pTextGroup && pTextGroup->getTextGroupingAuto() != fTextGroupingAuto )
+ {
+ pEffectSequence->setTextGroupingAuto( pTextGroup, fTextGroupingAuto );
+ bChanged = true;
+ }
+ }
+
+ if( bHasTextReverse )
+ {
+ if( pTextGroup && pTextGroup->getTextReverse() != bTextReverse )
+ {
+ pEffectSequence->setTextReverse( pTextGroup, bTextReverse );
+ bChanged = true;
+ }
+ }
+ }
+ }
+
+ if( bChanged )
+ {
+ mpMainSequence->rebuild();
+ updateControls();
+ mrBase.GetDocShell()->SetModified();
+ }
+}
+
+void CustomAnimationPane::showOptions(const OString& rPage)
+{
+ std::unique_ptr<STLPropertySet> xSet = createSelectionSet();
+
+ auto xDlg = std::make_shared<CustomAnimationDialog>(GetFrameWeld(), std::move(xSet), rPage);
+
+ weld::DialogController::runAsync(xDlg, [xDlg, this](sal_Int32 nResult){
+ if (nResult )
+ {
+ addUndo();
+ changeSelection(xDlg->getResultSet(), xDlg->getPropertySet());
+ updateControls();
+ }
+ });
+}
+
+void CustomAnimationPane::onChangeCurrentPage()
+{
+ if( !mxView.is() )
+ return;
+
+ try
+ {
+ Reference< XDrawPage > xNewPage( mxView->getCurrentPage() );
+ if( xNewPage != mxCurrentPage )
+ {
+ mxCurrentPage = xNewPage;
+ SdPage* pPage = SdPage::getImplementation( mxCurrentPage );
+ if( pPage )
+ {
+ mpMainSequence = pPage->getMainSequence();
+ mxCustomAnimationList->update( mpMainSequence );
+ }
+ updateControls();
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPane::onChangeCurrentPage()" );
+ }
+}
+
+static bool getTextSelection( const Any& rSelection, Reference< XShape >& xShape, std::vector< sal_Int16 >& rParaList )
+{
+ Reference< XTextRange > xSelectedText;
+ rSelection >>= xSelectedText;
+ if( xSelectedText.is() ) try
+ {
+ xShape.set( xSelectedText->getText(), UNO_QUERY_THROW );
+
+ css::uno::Reference<css::document::XActionLockable> xLockable(xShape, css::uno::UNO_QUERY);
+ if (xLockable.is())
+ xLockable->addActionLock();
+ comphelper::ScopeGuard aGuard([&xLockable]()
+ {
+ if (xLockable.is())
+ xLockable->removeActionLock();
+ });
+
+ Reference< XTextRangeCompare > xTextRangeCompare( xShape, UNO_QUERY_THROW );
+ Reference< XEnumerationAccess > xParaEnumAccess( xShape, UNO_QUERY_THROW );
+ Reference< XEnumeration > xParaEnum( xParaEnumAccess->createEnumeration(), UNO_SET_THROW );
+ Reference< XTextRange > xRange;
+ Reference< XTextRange > xStart( xSelectedText->getStart() );
+ Reference< XTextRange > xEnd( xSelectedText->getEnd() );
+
+ if( xTextRangeCompare->compareRegionEnds( xStart, xEnd ) < 0 )
+ {
+ Reference< XTextRange > xTemp( xStart );
+ xStart = xEnd;
+ xEnd = xTemp;
+ }
+
+ sal_Int16 nPara = 0;
+ while( xParaEnum->hasMoreElements() )
+ {
+ xParaEnum->nextElement() >>= xRange;
+
+ // break if start of selection is prior to end of current paragraph
+ if( xRange.is() && (xTextRangeCompare->compareRegionEnds( xStart, xRange ) >= 0 ) )
+ break;
+
+ nPara++;
+ }
+
+ while( xRange.is() )
+ {
+ if( xRange.is() && !xRange->getString().isEmpty() )
+ rParaList.push_back( nPara );
+
+ // break if end of selection is before or at end of current paragraph
+ if( xRange.is() && xTextRangeCompare->compareRegionEnds( xEnd, xRange ) >= 0 )
+ break;
+
+ nPara++;
+
+ if( xParaEnum->hasMoreElements() )
+ xParaEnum->nextElement() >>= xRange;
+ else
+ xRange.clear();
+ }
+
+ return true;
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPane::getTextSelection()" );
+ }
+
+ return false;
+}
+
+namespace
+{
+ Reference<XShape> getTargetShape(const Any& rTarget)
+ {
+ Reference<XShape> xShape;
+ rTarget >>= xShape;
+ if( !xShape.is() )
+ {
+ ParagraphTarget aParaTarget;
+ if (rTarget >>= aParaTarget)
+ xShape = aParaTarget.Shape;
+ }
+ return xShape;
+ }
+}
+
+void CustomAnimationPane::onAdd()
+{
+ bool bHasText = true;
+
+ // first create vector of targets for dialog preview
+ std::vector< Any > aTargets;
+
+ // gather shapes from the selection
+ Reference< XSelectionSupplier > xSel( mxView, UNO_QUERY_THROW );
+ maViewSelection = xSel->getSelection();
+
+ if( maViewSelection.getValueType() == cppu::UnoType<XShapes>::get())
+ {
+ Reference< XIndexAccess > xShapes;
+ maViewSelection >>= xShapes;
+
+ sal_Int32 nCount = xShapes->getCount();
+ aTargets.reserve( nCount );
+ for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ )
+ {
+ Any aTarget( xShapes->getByIndex( nIndex ) );
+ aTargets.push_back( aTarget );
+ if( bHasText )
+ {
+ Reference< XText > xText;
+ aTarget >>= xText;
+ if( !xText.is() || xText->getString().isEmpty() )
+ bHasText = false;
+ }
+ }
+ }
+ else if ( maViewSelection.getValueType() == cppu::UnoType<XShape>::get())
+ {
+ aTargets.push_back( maViewSelection );
+ Reference< XText > xText;
+ maViewSelection >>= xText;
+ if( !xText.is() || xText->getString().isEmpty() )
+ bHasText = false;
+ }
+ else if ( maViewSelection.getValueType() == cppu::UnoType<XTextCursor>::get())
+ {
+ Reference< XShape > xShape;
+ std::vector< sal_Int16 > aParaList;
+ if( getTextSelection( maViewSelection, xShape, aParaList ) )
+ {
+ ParagraphTarget aParaTarget;
+ aParaTarget.Shape = xShape;
+
+ for( const auto& rPara : aParaList )
+ {
+ aParaTarget.Paragraph = rPara;
+ aTargets.push_back( Any( aParaTarget ) );
+ }
+ }
+ }
+ else
+ {
+ OSL_FAIL("sd::CustomAnimationPane::onAdd(), unknown view selection!" );
+ return;
+ }
+
+ CustomAnimationPresetPtr pDescriptor;
+ mxFTCategory->set_sensitive(true);
+ mxFTAnimation->set_sensitive(true);
+
+ bool bCategoryReset = false;
+
+ if (!mxLBCategory->get_sensitive() || mxLBCategory->get_active() == -1)
+ {
+ mxLBCategory->set_sensitive(true);
+ mxLBCategory->set_active(0);
+ bCategoryReset = true;
+ }
+
+ if (bCategoryReset || !mxLBAnimation->get_sensitive() ||
+ mxLBAnimation->get_selected_index() == -1)
+ {
+ mxLBAnimation->set_sensitive(true);
+
+ sal_Int32 nFirstEffect = fillAnimationLB(bHasText);
+ if (nFirstEffect == -1)
+ return;
+
+ mxLBAnimation->select(nFirstEffect);
+ mnLastSelectedAnimation = nFirstEffect;
+ }
+
+ auto pEntryData = weld::fromId<CustomAnimationPresetPtr*>(mxLBAnimation->get_selected_id());
+ if (pEntryData)
+ pDescriptor = *pEntryData;
+
+ if( pDescriptor )
+ {
+ const double fDuration = pDescriptor->getDuration();
+ mxCBXDuration->set_value(fDuration*100.0, FieldUnit::NONE);
+ bool bHasSpeed = pDescriptor->getDuration() > 0.001;
+ mxCBXDuration->set_sensitive( bHasSpeed );
+ mxFTDuration->set_sensitive( bHasSpeed );
+
+ mxCustomAnimationList->unselect_all();
+
+ // gather shapes from the selection
+ bool bFirst = true;
+ for( const auto& rTarget : aTargets )
+ {
+ css::uno::Reference<css::document::XActionLockable> xLockable(getTargetShape(rTarget), css::uno::UNO_QUERY);
+ if (xLockable.is())
+ xLockable->addActionLock();
+ comphelper::ScopeGuard aGuard([&xLockable]()
+ {
+ if (xLockable.is())
+ xLockable->removeActionLock();
+ });
+
+ CustomAnimationEffectPtr pCreated = mpMainSequence->append( pDescriptor, rTarget, fDuration );
+
+ // if only one shape with text and no fill or outline is selected, animate only by first level paragraphs
+ if( bHasText && (aTargets.size() == 1) )
+ {
+ Reference< XShape > xShape( rTarget, UNO_QUERY );
+ if( xShape.is() && !hasVisibleShape( xShape ) )
+ {
+ mpMainSequence->createTextGroup( pCreated, 1, -1.0, false, false );
+ }
+ }
+
+ if( bFirst )
+ bFirst = false;
+ else
+ pCreated->setNodeType( EffectNodeType::WITH_PREVIOUS );
+
+ if( pCreated )
+ mxCustomAnimationList->select( pCreated );
+ }
+ }
+
+ PathKind ePathKind = getCreatePathKind();
+
+ if (ePathKind != PathKind::NONE)
+ {
+ createPath( ePathKind, aTargets, 0.0 );
+ updateMotionPathTags();
+ }
+
+ addUndo();
+ mrBase.GetDocShell()->SetModified();
+
+ updateControls();
+
+ SlideShow::Stop( mrBase );
+}
+
+void CustomAnimationPane::onRemove()
+{
+ if( maListSelection.empty() )
+ return;
+
+ addUndo();
+
+ MainSequenceRebuildGuard aGuard( mpMainSequence );
+
+ EffectSequence aList( maListSelection );
+
+ for( CustomAnimationEffectPtr& pEffect : aList )
+ {
+ if( pEffect->getEffectSequence() )
+ pEffect->getEffectSequence()->remove( pEffect );
+ }
+
+ maListSelection.clear();
+ mrBase.GetDocShell()->SetModified();
+}
+
+void CustomAnimationPane::remove( CustomAnimationEffectPtr const & pEffect )
+{
+ if( pEffect->getEffectSequence() )
+ {
+ addUndo();
+ pEffect->getEffectSequence()->remove( pEffect );
+ mrBase.GetDocShell()->SetModified();
+ }
+}
+
+void CustomAnimationPane::onChangeStart()
+{
+ sal_Int16 nNodeType;
+ switch( mxLBStart->get_active() )
+ {
+ case 0: nNodeType = EffectNodeType::ON_CLICK; break;
+ case 1: nNodeType = EffectNodeType::WITH_PREVIOUS; break;
+ case 2: nNodeType = EffectNodeType::AFTER_PREVIOUS; break;
+ default:
+ return;
+ }
+
+ onChangeStart( nNodeType );
+}
+
+void CustomAnimationPane::onChangeStart( sal_Int16 nNodeType )
+{
+ addUndo();
+
+ MainSequenceRebuildGuard aGuard( mpMainSequence );
+
+ bool bNeedRebuild = false;
+
+ for( CustomAnimationEffectPtr& pEffect : maListSelection )
+ {
+ if( pEffect->getNodeType() != nNodeType )
+ {
+ pEffect->setNodeType( nNodeType );
+ bNeedRebuild = true;
+ }
+ }
+
+ if( bNeedRebuild )
+ {
+ mpMainSequence->rebuild();
+ updateControls();
+ mrBase.GetDocShell()->SetModified();
+ }
+}
+
+void CustomAnimationPane::onChangeSpeed()
+{
+ double fDuration = getDuration();
+
+ if(fDuration < 0)
+ return;
+ else
+ {
+ addUndo();
+
+ MainSequenceRebuildGuard aGuard( mpMainSequence );
+
+ // change selected effect
+ for( CustomAnimationEffectPtr& pEffect : maListSelection )
+ {
+ pEffect->setDuration( fDuration );
+ }
+
+ mpMainSequence->rebuild();
+ updateControls();
+ mrBase.GetDocShell()->SetModified();
+ }
+}
+
+double CustomAnimationPane::getDuration() const
+{
+ double fDuration = 0;
+
+ if (!mxCBXDuration->get_text().isEmpty())
+ fDuration = mxCBXDuration->get_value(FieldUnit::NONE) / 100.0;
+
+ return fDuration;
+}
+
+PathKind CustomAnimationPane::getCreatePathKind() const
+{
+ PathKind eKind = PathKind::NONE;
+
+ if (mxLBAnimation->count_selected_rows() == 1 &&
+ mxLBCategory->get_active() == gnMotionPathPos)
+ {
+ const sal_Int32 nPos = mxLBAnimation->get_selected_index();
+ if( nPos == mnCurvePathPos )
+ {
+ eKind = PathKind::CURVE;
+ }
+ else if( nPos == mnPolygonPathPos )
+ {
+ eKind = PathKind::POLYGON;
+ }
+ else if( nPos == mnFreeformPathPos )
+ {
+ eKind = PathKind::FREEFORM;
+ }
+ }
+
+ return eKind;
+}
+
+void CustomAnimationPane::createPath( PathKind eKind, std::vector< Any >& rTargets, double fDuration)
+{
+ sal_uInt16 nSID = 0;
+
+ switch( eKind )
+ {
+ case PathKind::CURVE: nSID = SID_DRAW_BEZIER_NOFILL; break;
+ case PathKind::POLYGON: nSID = SID_DRAW_POLYGON_NOFILL; break;
+ case PathKind::FREEFORM: nSID = SID_DRAW_FREELINE_NOFILL; break;
+ default: break;
+ }
+
+ if( !nSID )
+ return;
+
+ DrawViewShell* pViewShell = dynamic_cast< DrawViewShell* >(
+ FrameworkHelper::Instance(mrBase)->GetViewShell(FrameworkHelper::msCenterPaneURL).get());
+
+ if( pViewShell )
+ {
+ DrawView* pView = pViewShell->GetDrawView();
+ if( pView )
+ pView->UnmarkAllObj();
+
+ std::vector< Any > aTargets( 1, Any( fDuration ) );
+ aTargets.insert( aTargets.end(), rTargets.begin(), rTargets.end() );
+ Sequence< Any > aTargetSequence( comphelper::containerToSequence( aTargets ) );
+ const SfxUnoAnyItem aItem( SID_ADD_MOTION_PATH, Any( aTargetSequence ) );
+ pViewShell->GetViewFrame()->GetDispatcher()->ExecuteList( nSID, SfxCallMode::ASYNCHRON, {&aItem} );
+ }
+}
+
+
+/// this link is called when the property box is modified by the user
+IMPL_LINK_NOARG(CustomAnimationPane, implPropertyHdl, LinkParamNone*, void)
+{
+ if (!mxLBSubControl)
+ return;
+
+ addUndo();
+
+ MainSequenceRebuildGuard aGuard( mpMainSequence );
+
+ const Any aValue(mxLBSubControl->getValue());
+
+ bool bNeedUpdate = false;
+
+ // change selected effect
+ for( const CustomAnimationEffectPtr& pEffect : maListSelection )
+ {
+ if( setProperty1Value( mnPropertyType, pEffect, aValue ) )
+ bNeedUpdate = true;
+ }
+
+ if( bNeedUpdate )
+ {
+ mpMainSequence->rebuild();
+ updateControls();
+ mrBase.GetDocShell()->SetModified();
+ }
+
+ onPreview( false );
+}
+
+IMPL_LINK_NOARG(CustomAnimationPane, DelayModifiedHdl, weld::MetricSpinButton&, void)
+{
+ addUndo();
+}
+
+IMPL_LINK_NOARG(CustomAnimationPane, DelayLoseFocusHdl, weld::Widget&, void)
+{
+ double fBegin = mxMFStartDelay->get_value(FieldUnit::NONE);
+
+ //sequence rebuild only when the control loses focus
+ MainSequenceRebuildGuard aGuard( mpMainSequence );
+
+ // change selected effect
+ for( CustomAnimationEffectPtr& pEffect : maListSelection )
+ {
+ pEffect->setBegin( fBegin/10.0 );
+ }
+
+ mpMainSequence->rebuild();
+ updateControls();
+ mrBase.GetDocShell()->SetModified();
+}
+
+IMPL_LINK_NOARG(CustomAnimationPane, AnimationSelectHdl, weld::TreeView&, void)
+{
+ maIdle.Start();
+}
+
+IMPL_LINK_NOARG(CustomAnimationPane, SelectionHandler, Timer*, void)
+{
+ if (mxLBAnimation->has_grab()) // tdf#136474 try again later
+ {
+ maIdle.Start();
+ return;
+ }
+
+ int nSelected = mxLBAnimation->get_selected_index();
+ if (nSelected == -1)
+ return;
+
+ // tdf#99137, the selected entry may also be a subcategory title, so not an effect
+ // just skip it and move to the next one in this case
+ if (mxLBAnimation->get_text_emphasis(nSelected, 0))
+ {
+ if (nSelected == 0 || nSelected > mnLastSelectedAnimation)
+ mxLBAnimation->select(++nSelected);
+ else
+ mxLBAnimation->select(--nSelected);
+ }
+
+ mnLastSelectedAnimation = nSelected;
+
+ CustomAnimationPresetPtr* pPreset = weld::fromId<CustomAnimationPresetPtr*>(mxLBAnimation->get_id(nSelected));
+ PathKind ePathKind = getCreatePathKind();
+
+ if ( ePathKind != PathKind::NONE )
+ {
+ std::vector< Any > aTargets;
+ MainSequenceRebuildGuard aGuard( mpMainSequence );
+
+ for( const CustomAnimationEffectPtr& pEffect : maListSelection )
+ {
+ aTargets.push_back( pEffect->getTarget() );
+
+ EffectSequenceHelper* pEffectSequence = pEffect->getEffectSequence();
+ if( !pEffectSequence )
+ pEffectSequence = mpMainSequence.get();
+
+ // delete the old animation, new one will be appended
+ // by createPath and SID_ADD_MOTION_PATH therein
+ pEffectSequence->remove( pEffect );
+ }
+
+ createPath( ePathKind, aTargets, 0.0 );
+ updateMotionPathTags();
+ return;
+ }
+
+ CustomAnimationPresetPtr pDescriptor(*pPreset);
+ const double fDuration = (*pPreset)->getDuration();
+ MainSequenceRebuildGuard aGuard( mpMainSequence );
+
+ // get selected effect
+ for( const CustomAnimationEffectPtr& pEffect : maListSelection )
+ {
+ // Dispose the deprecated motion path tag. It will be rebuilt later.
+ if (pEffect->getPresetClass() == css::presentation::EffectPresetClass::MOTIONPATH)
+ {
+ for (auto const& xTag: maMotionPathTags)
+ {
+ if(xTag->getEffect() == pEffect && !xTag->isDisposed())
+ xTag->Dispose();
+ }
+ }
+
+ EffectSequenceHelper* pEffectSequence = pEffect->getEffectSequence();
+ if( !pEffectSequence )
+ pEffectSequence = mpMainSequence.get();
+
+ pEffectSequence->replace( pEffect, pDescriptor, fDuration );
+ }
+
+ addUndo();
+ onPreview(false);
+}
+
+IMPL_LINK_NOARG(CustomAnimationPane, UpdateAnimationLB, weld::ComboBox&, void)
+{
+ //FIXME: first effect only? what if there is more?
+ CustomAnimationEffectPtr pEffect = maListSelection.front();
+ fillAnimationLB( pEffect->hasText() );
+}
+
+IMPL_LINK_NOARG(CustomAnimationPane, DurationModifiedHdl, weld::MetricSpinButton&, void)
+{
+ if (!mxCBXDuration->get_text().isEmpty())
+ {
+ double duration_value = static_cast<double>(mxCBXDuration->get_value(FieldUnit::NONE));
+ if(duration_value <= 0.0)
+ {
+ mxCBXDuration->set_value(1, FieldUnit::NONE);
+ }
+ onChangeSpeed();
+ }
+}
+
+namespace
+{
+ void InsertCategory(weld::TreeView& rLBAnimation, const OUString& rMotionPathLabel)
+ {
+ int nRow = rLBAnimation.n_children();
+ rLBAnimation.append_text(rMotionPathLabel);
+ rLBAnimation.set_text_emphasis(nRow, true, 0);
+ rLBAnimation.set_text_align(nRow, 0.5, 0);
+ }
+}
+
+sal_Int32 CustomAnimationPane::fillAnimationLB( bool bHasText )
+{
+ PresetCategoryList rCategoryList;
+ sal_uInt16 nPosition = mxLBCategory->get_active();
+ const CustomAnimationPresets& rPresets (CustomAnimationPresets::getCustomAnimationPresets());
+ switch(nPosition)
+ {
+ case 0:rCategoryList = rPresets.getEntrancePresets();break;
+ case 1:rCategoryList = rPresets.getEmphasisPresets();break;
+ case 2:rCategoryList = rPresets.getExitPresets();break;
+ case 3:rCategoryList = rPresets.getMotionPathsPresets();break;
+ case 4:rCategoryList = rPresets.getMiscPresets();break;
+ }
+
+ sal_Int32 nFirstEffect = -1;
+
+ int nOldEntryCount = mxLBAnimation->n_children();
+ int nOldScrollPos = mxLBAnimation->vadjustment_get_value();
+
+ mxLBAnimation->freeze();
+ mxLBAnimation->clear();
+ mnLastSelectedAnimation = -1;
+
+ if (nPosition == gnMotionPathPos)
+ {
+ OUString sMotionPathLabel( SdResId( STR_CUSTOMANIMATION_USERPATH ) );
+ InsertCategory(*mxLBAnimation, sMotionPathLabel);
+ mnCurvePathPos = mxLBAnimation->n_children();
+ mxLBAnimation->append_text( SvxResId(STR_ObjNameSingulCOMBLINE) );
+ mxLBAnimation->set_text_emphasis(mnCurvePathPos, false, 0);
+ mnPolygonPathPos = mnCurvePathPos + 1;
+ mxLBAnimation->append_text( SvxResId(STR_ObjNameSingulPOLY) );
+ mxLBAnimation->set_text_emphasis(mnPolygonPathPos, false, 0);
+ mnFreeformPathPos = mnPolygonPathPos + 1;
+ mxLBAnimation->append_text( SvxResId(STR_ObjNameSingulFREELINE) );
+ mxLBAnimation->set_text_emphasis(mnFreeformPathPos, false, 0);
+ }
+
+ for (const PresetCategoryPtr& pCategory : rCategoryList)
+ {
+ if( pCategory )
+ {
+ InsertCategory(*mxLBAnimation, pCategory->maLabel);
+
+ int nPos = mxLBAnimation->n_children();
+
+ std::vector< CustomAnimationPresetPtr > aSortedVector =
+ pCategory->maEffects;
+
+ for( const CustomAnimationPresetPtr& pDescriptor : aSortedVector )
+ {
+ // ( !isTextOnly || ( isTextOnly && bHasText ) ) <=> !isTextOnly || bHasText
+ if( pDescriptor && ( !pDescriptor->isTextOnly() || bHasText ) )
+ {
+ auto pCustomPtr = new CustomAnimationPresetPtr(pDescriptor);
+ OUString sId = weld::toId(pCustomPtr);
+ mxLBAnimation->append(sId, pDescriptor->getLabel());
+ mxLBAnimation->set_text_emphasis(nPos, false, 0);
+
+ if (nFirstEffect == -1)
+ nFirstEffect = nPos;
+
+ ++nPos;
+ }
+ }
+ }
+ }
+
+ mxLBAnimation->thaw();
+
+ if (mxLBAnimation->n_children() == nOldEntryCount)
+ mxLBAnimation->vadjustment_set_value(nOldScrollPos);
+
+ return nFirstEffect;
+}
+
+IMPL_LINK(CustomAnimationPane, implToggleHdl, weld::Toggleable&, rBtn, void)
+{
+ implControlHdl(&rBtn);
+}
+
+IMPL_LINK(CustomAnimationPane, implClickHdl, weld::Button&, rBtn, void)
+{
+ implControlHdl(&rBtn);
+}
+
+IMPL_LINK( CustomAnimationPane, implControlListBoxHdl, weld::ComboBox&, rListBox, void )
+{
+ implControlHdl(&rListBox);
+}
+
+/// this link is called when one of the controls is modified
+void CustomAnimationPane::implControlHdl(const weld::Widget* pControl)
+{
+ if (pControl == mxPBAddEffect.get())
+ onAdd();
+ else if (pControl == mxPBRemoveEffect.get())
+ onRemove();
+ else if (pControl == mxLBStart.get())
+ onChangeStart();
+ else if (pControl == mxPBPropertyMore.get())
+ showOptions();
+ else if (pControl == mxPBMoveUp.get())
+ moveSelection( true );
+ else if (pControl == mxPBMoveDown.get())
+ moveSelection( false );
+ else if (pControl == mxPBPlay.get())
+ onPreview( true );
+ else if (pControl == mxCBAutoPreview.get())
+ {
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress);
+ pOptions->SetPreviewChangedEffects(mxCBAutoPreview->get_active());
+ }
+}
+
+IMPL_LINK_NOARG(CustomAnimationPane, lateInitCallback, Timer *, void)
+{
+ // Call getPresets() to initiate the (expensive) construction of the
+ // presets list.
+ CustomAnimationPresets::getCustomAnimationPresets();
+
+ // update selection and control states
+ onSelectionChanged();
+}
+
+void CustomAnimationPane::moveSelection( bool bUp )
+{
+ if( maListSelection.empty() )
+ return;
+
+ EffectSequenceHelper* pSequence = maListSelection.front()->getEffectSequence();
+ if( pSequence == nullptr )
+ return;
+
+ addUndo();
+
+ bool bChanged = false;
+
+ MainSequenceRebuildGuard aGuard( mpMainSequence );
+ EffectSequence& rEffectSequence = pSequence->getSequence();
+
+ if( bUp )
+ {
+ for( const CustomAnimationEffectPtr& pEffect : maListSelection )
+ {
+ EffectSequence::iterator aUpEffectPos( pSequence->find( pEffect ) );
+ // coverity[copy_paste_error : FALSE] - this is correct, checking if it exists
+ if( aUpEffectPos != rEffectSequence.end() )
+ {
+ EffectSequence::iterator aInsertPos( rEffectSequence.erase( aUpEffectPos ) );
+
+ if( aInsertPos != rEffectSequence.begin() )
+ {
+ --aInsertPos;
+ while( (aInsertPos != rEffectSequence.begin()) && !mxCustomAnimationList->isExpanded(*aInsertPos))
+ --aInsertPos;
+ rEffectSequence.insert( aInsertPos, pEffect );
+ }
+ else
+ {
+ rEffectSequence.push_front( pEffect );
+ }
+ bChanged = true;
+ }
+ }
+ }
+ else
+ {
+ EffectSequence::reverse_iterator aIter( maListSelection.rbegin() );
+ const EffectSequence::reverse_iterator aEnd( maListSelection.rend() );
+
+ while( aIter != aEnd )
+ {
+ CustomAnimationEffectPtr pEffect = *aIter++;
+
+ EffectSequence::iterator aDownEffectPos( pSequence->find( pEffect ) );
+ // coverity[copy_paste_error : FALSE] - this is correct, checking if it exists
+ if( aDownEffectPos != rEffectSequence.end() )
+ {
+ EffectSequence::iterator aInsertPos( rEffectSequence.erase( aDownEffectPos ) );
+
+ if( aInsertPos != rEffectSequence.end() )
+ {
+ ++aInsertPos;
+ // Advance over rolled-up (un-expanded) items, unless we just moved it there.
+ while( (aInsertPos != rEffectSequence.end())
+ && !mxCustomAnimationList->isExpanded(*aInsertPos)
+ && (std::find(maListSelection.begin(), maListSelection.end(), *aInsertPos)
+ == maListSelection.end())
+ )
+ ++aInsertPos;
+ rEffectSequence.insert( aInsertPos, pEffect );
+ }
+ else
+ {
+ rEffectSequence.push_back( pEffect );
+ }
+ bChanged = true;
+ }
+ }
+ }
+
+ if( bChanged )
+ {
+ mpMainSequence->rebuild();
+ updateControls();
+ mrBase.GetDocShell()->SetModified();
+ }
+}
+
+void CustomAnimationPane::onPreview( bool bForcePreview )
+{
+ if (!bForcePreview && !mxCBAutoPreview->get_active())
+ return;
+
+ // No preview in LOK.
+ if (comphelper::LibreOfficeKit::isActive())
+ return;
+
+ if( maListSelection.empty() )
+ {
+ rtl::Reference< MotionPathTag > xMotionPathTag;
+ auto aIter = std::find_if(maMotionPathTags.begin(), maMotionPathTags.end(),
+ [](const MotionPathTagVector::value_type& rxMotionPathTag) { return rxMotionPathTag->isSelected(); });
+ if (aIter != maMotionPathTags.end())
+ xMotionPathTag = *aIter;
+
+ if( xMotionPathTag.is() )
+ {
+ MainSequencePtr pSequence = std::make_shared<MainSequence>();
+ pSequence->append( xMotionPathTag->getEffect()->clone() );
+ preview( pSequence->getRootNode() );
+ }
+ else
+ {
+ Reference< XAnimationNodeSupplier > xNodeSupplier( mxCurrentPage, UNO_QUERY );
+ if( !xNodeSupplier.is() )
+ return;
+
+ preview( xNodeSupplier->getAnimationNode() );
+ }
+ }
+ else
+ {
+ MainSequencePtr pSequence = std::make_shared<MainSequence>();
+
+ for( const CustomAnimationEffectPtr& pEffect : maListSelection )
+ {
+ pSequence->append( pEffect->clone() );
+ }
+
+ preview( pSequence->getRootNode() );
+ }
+}
+
+void CustomAnimationPane::preview( const Reference< XAnimationNode >& xAnimationNode )
+{
+ Reference< XParallelTimeContainer > xRoot = ParallelTimeContainer::create( ::comphelper::getProcessComponentContext() );
+ Sequence< css::beans::NamedValue > aUserData
+ { { "node-type", css::uno::Any(css::presentation::EffectNodeType::TIMING_ROOT) } };
+ xRoot->setUserData( aUserData );
+ xRoot->appendChild( xAnimationNode );
+
+ SlideShow::StartPreview( mrBase, mxCurrentPage, xRoot );
+}
+
+// ICustomAnimationListController
+void CustomAnimationPane::onSelect()
+{
+ maListSelection = mxCustomAnimationList->getSelection();
+ updateControls();
+
+ // mark shapes from selected effects
+ if( maSelectionLock.isLocked() )
+ return;
+
+ // tdf#145030 if nothing is selected in the effects list, leave the selection of
+ // objects in the slide untouched
+ if (maListSelection.empty())
+ return;
+
+ ScopeLockGuard aGuard( maSelectionLock );
+ DrawViewShell* pViewShell = dynamic_cast< DrawViewShell* >(
+ FrameworkHelper::Instance(mrBase)->GetViewShell(FrameworkHelper::msCenterPaneURL).get());
+ DrawView* pView = pViewShell ? pViewShell->GetDrawView() : nullptr;
+
+ if( pView )
+ {
+ pView->UnmarkAllObj();
+ for( const CustomAnimationEffectPtr& pEffect : maListSelection )
+ {
+ Reference< XShape > xShape( pEffect->getTargetShape() );
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape(xShape);
+ if( pObj )
+ pView->MarkObj(pObj, pView->GetSdrPageView());
+ }
+ }
+}
+
+// ICustomAnimationListController
+// pEffectInsertBefore may be null if moving to end of list.
+void CustomAnimationPane::onDragNDropComplete(std::vector< CustomAnimationEffectPtr > pEffectsDragged, CustomAnimationEffectPtr pEffectInsertBefore)
+{
+ if ( !mpMainSequence )
+ return;
+
+ addUndo();
+
+ MainSequenceRebuildGuard aGuard( mpMainSequence );
+
+ // Move all selected effects
+ for( auto const& pEffectDragged : pEffectsDragged )
+ {
+ // Move this dragged effect and any hidden sub-effects
+ EffectSequence::iterator aIter = mpMainSequence->find( pEffectDragged );
+ const EffectSequence::iterator aEnd( mpMainSequence->getEnd() );
+
+ while( aIter != aEnd )
+ {
+ CustomAnimationEffectPtr pEffect = *aIter++;
+
+ // Update model with new location (function triggers a rebuild)
+ // target may be null, which will insert at the end.
+ mpMainSequence->moveToBeforeEffect( pEffect, pEffectInsertBefore );
+ // Done moving effect and its hidden sub-effects when *next* effect is visible.
+ if (aIter != aEnd && mxCustomAnimationList->isVisible(*aIter))
+ break;
+ }
+ }
+
+ updateControls();
+ mrBase.GetDocShell()->SetModified();
+}
+
+void CustomAnimationPane::updatePathFromMotionPathTag( const rtl::Reference< MotionPathTag >& xTag )
+{
+ MainSequenceRebuildGuard aGuard( mpMainSequence );
+ if( !xTag.is() )
+ return;
+
+ SdrPathObj* pPathObj = xTag->getPathObj();
+ CustomAnimationEffectPtr pEffect = xTag->getEffect();
+ if( (pPathObj != nullptr) && pEffect )
+ {
+ SfxUndoManager* pManager = mrBase.GetDocShell()->GetUndoManager();
+ if( pManager )
+ {
+ SdPage* pPage = SdPage::getImplementation( mxCurrentPage );
+ if( pPage )
+ pManager->AddUndoAction( std::make_unique<UndoAnimationPath>( mrBase.GetDocShell()->GetDoc(), pPage, pEffect->getNode() ) );
+ }
+
+ pEffect->updatePathFromSdrPathObj( *pPathObj );
+ }
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/animations/STLPropertySet.cxx b/sd/source/ui/animations/STLPropertySet.cxx
new file mode 100644
index 000000000..592d7639c
--- /dev/null
+++ b/sd/source/ui/animations/STLPropertySet.cxx
@@ -0,0 +1,113 @@
+/* -*- 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 "STLPropertySet.hxx"
+#include <sal/log.hxx>
+
+using com::sun::star::uno::Any;
+
+namespace sd
+{
+
+STLPropertySet::STLPropertySet()
+{
+}
+
+STLPropertySet::~STLPropertySet()
+{
+}
+
+void STLPropertySet::setPropertyDefaultValue( sal_Int32 nHandle, const Any& rValue )
+{
+ STLPropertyMapEntry aEntry( rValue );
+ maPropertyMap[ nHandle ] = aEntry;
+}
+
+void STLPropertySet::setPropertyValue( sal_Int32 nHandle, const Any& rValue )
+{
+ PropertyMapIter aIter;
+ if( findProperty( nHandle, aIter ) )
+ {
+ (*aIter).second.mnState = STLPropertyState::Direct;
+ (*aIter).second.maValue = rValue;
+ }
+ else
+ {
+ SAL_WARN("sd", "sd::STLPropertySet::setPropertyValue(), unknown property!");
+ }
+}
+
+Any STLPropertySet::getPropertyValue( sal_Int32 nHandle ) const
+{
+ PropertyMapConstIter aIter;
+ if( findProperty( nHandle, aIter ) )
+ {
+ return (*aIter).second.maValue;
+ }
+ else
+ {
+ SAL_WARN("sd", "sd::STLPropertySet::getPropertyValue(), unknown property!");
+
+ Any aAny;
+ return aAny;
+ }
+}
+
+STLPropertyState STLPropertySet::getPropertyState( sal_Int32 nHandle ) const
+{
+ PropertyMapConstIter aIter;
+ if( findProperty( nHandle, aIter ) )
+ {
+ return (*aIter).second.mnState;
+ }
+ else
+ {
+ SAL_WARN("sd", "sd::STLPropertySet::getPropertyState(), unknown property!");
+ return STLPropertyState::Ambiguous;
+ }
+}
+
+void STLPropertySet::setPropertyState( sal_Int32 nHandle, STLPropertyState nState )
+{
+ PropertyMapIter aIter;
+ if( findProperty( nHandle, aIter ) )
+ {
+ (*aIter).second.mnState = nState;
+ }
+ else
+ {
+ SAL_WARN("sd","sd::STLPropertySet::setPropertyState(), unknown property!");
+ }
+}
+
+bool STLPropertySet::findProperty( sal_Int32 nHandle, PropertyMapIter& rIter )
+{
+ rIter = maPropertyMap.find(nHandle);
+ return( rIter != maPropertyMap.end() );
+}
+
+bool STLPropertySet::findProperty( sal_Int32 nHandle, PropertyMapConstIter& rIter ) const
+{
+ rIter = maPropertyMap.find(nHandle);
+ return( rIter != maPropertyMap.end() );
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/animations/STLPropertySet.hxx b/sd/source/ui/animations/STLPropertySet.hxx
new file mode 100644
index 000000000..3096e7c78
--- /dev/null
+++ b/sd/source/ui/animations/STLPropertySet.hxx
@@ -0,0 +1,73 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <map>
+#include <com/sun/star/uno/Any.hxx>
+
+namespace sd
+{
+
+enum class STLPropertyState {
+ Default = 0,
+ Direct = 1,
+ Ambiguous = 3
+};
+
+struct STLPropertyMapEntry
+{
+ css::uno::Any maValue;
+ STLPropertyState mnState;
+
+ STLPropertyMapEntry()
+ : mnState( STLPropertyState::Ambiguous ) {}
+ explicit STLPropertyMapEntry(css::uno::Any aValue)
+ : maValue( aValue ), mnState( STLPropertyState::Default ) {}
+
+};
+
+typedef std::map<sal_Int32, STLPropertyMapEntry > PropertyMap;
+typedef PropertyMap::iterator PropertyMapIter;
+typedef PropertyMap::const_iterator PropertyMapConstIter;
+
+class STLPropertySet
+{
+public:
+ STLPropertySet();
+ ~STLPropertySet();
+
+ void setPropertyDefaultValue( sal_Int32 nHandle, const css::uno::Any& rValue );
+ void setPropertyValue( sal_Int32 nHandle, const css::uno::Any& rValue );
+ css::uno::Any getPropertyValue( sal_Int32 nHandle ) const;
+
+ STLPropertyState getPropertyState( sal_Int32 nHandle ) const;
+ void setPropertyState( sal_Int32 nHandle, STLPropertyState nState );
+
+private:
+ bool findProperty( sal_Int32 nHandle, PropertyMapIter& rIter );
+ bool findProperty( sal_Int32 nHandle, PropertyMapConstIter& rIter ) const;
+
+private:
+ PropertyMap maPropertyMap;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/animations/SlideTransitionPane.cxx b/sd/source/ui/animations/SlideTransitionPane.cxx
new file mode 100644
index 000000000..846f21c34
--- /dev/null
+++ b/sd/source/ui/animations/SlideTransitionPane.cxx
@@ -0,0 +1,1155 @@
+/* -*- 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 <com/sun/star/drawing/XDrawView.hpp>
+#include <SlideTransitionPane.hxx>
+
+#include <TransitionPreset.hxx>
+#include <sdresid.hxx>
+#include <ViewShellBase.hxx>
+#include <DrawDocShell.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <drawdoc.hxx>
+#include <sdmod.hxx>
+#include <sdpage.hxx>
+#include <filedlg.hxx>
+#include <strings.hrc>
+#include <EventMultiplexer.hxx>
+
+#include <comphelper/lok.hxx>
+#include <sal/log.hxx>
+#include <tools/debug.hxx>
+#include <svx/gallery.hxx>
+#include <vcl/stdtext.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <tools/urlobj.hxx>
+#include <slideshow.hxx>
+#include <sdundogr.hxx>
+#include <undoanim.hxx>
+#include <optsitem.hxx>
+
+#include <o3tl/safeint.hxx>
+
+#include <algorithm>
+
+using namespace ::com::sun::star;
+
+using ::com::sun::star::uno::Reference;
+
+
+namespace sd::impl
+{
+struct TransitionEffect
+{
+ TransitionEffect() :
+ mnType( 0 ),
+ mnSubType( 0 ),
+ mbDirection( true ),
+ mnFadeColor( 0 )
+ {
+ init();
+ }
+ explicit TransitionEffect( const ::sd::TransitionPreset & rPreset ) :
+ mnType( rPreset.getTransition()),
+ mnSubType( rPreset.getSubtype()),
+ mbDirection( rPreset.getDirection()),
+ mnFadeColor( rPreset.getFadeColor())
+ {
+ init();
+ }
+ explicit TransitionEffect( const SdPage & rPage ) :
+ mnType( rPage.getTransitionType() ),
+ mnSubType( rPage.getTransitionSubtype() ),
+ mbDirection( rPage.getTransitionDirection() ),
+ mnFadeColor( rPage.getTransitionFadeColor() )
+ {
+ init();
+
+ mfDuration = rPage.getTransitionDuration();
+ mfTime = rPage.GetTime();
+ mePresChange = rPage.GetPresChange();
+ mbSoundOn = rPage.IsSoundOn();
+ maSound = rPage.GetSoundFile();
+ mbLoopSound = rPage.IsLoopSound();
+ mbStopSound = rPage.IsStopSound();
+ }
+
+ void init()
+ {
+ mfDuration = 2.0;
+ mfTime = 0.0;
+ mePresChange = PresChange::Manual;
+ mbSoundOn = false;
+ mbLoopSound = false;
+ mbStopSound = false;
+
+ mbEffectAmbiguous = false;
+ mbDurationAmbiguous = false;
+ mbTimeAmbiguous = false;
+ mbPresChangeAmbiguous = false;
+ mbSoundAmbiguous = false;
+ mbLoopSoundAmbiguous = false;
+ }
+
+ void setAllAmbiguous()
+ {
+ mbEffectAmbiguous = true;
+ mbDurationAmbiguous = true;
+ mbTimeAmbiguous = true;
+ mbPresChangeAmbiguous = true;
+ mbSoundAmbiguous = true;
+ mbLoopSoundAmbiguous = true;
+ }
+
+ bool operator == ( const ::sd::TransitionPreset & rPreset ) const
+ {
+ return
+ (mnType == rPreset.getTransition()) &&
+ (mnSubType == rPreset.getSubtype()) &&
+ (mbDirection == rPreset.getDirection()) &&
+ (mnFadeColor == rPreset.getFadeColor());
+ }
+
+ void applyTo( SdPage & rOutPage ) const
+ {
+ if( ! mbEffectAmbiguous )
+ {
+ rOutPage.setTransitionType( mnType );
+ rOutPage.setTransitionSubtype( mnSubType );
+ rOutPage.setTransitionDirection( mbDirection );
+ rOutPage.setTransitionFadeColor( mnFadeColor );
+ }
+
+ if( ! mbDurationAmbiguous )
+ rOutPage.setTransitionDuration( mfDuration );
+ if( ! mbTimeAmbiguous )
+ rOutPage.SetTime( mfTime );
+ if( ! mbPresChangeAmbiguous )
+ rOutPage.SetPresChange( mePresChange );
+ if( ! mbSoundAmbiguous )
+ {
+ if( mbStopSound )
+ {
+ rOutPage.SetStopSound( true );
+ rOutPage.SetSound( false );
+ }
+ else
+ {
+ rOutPage.SetStopSound( false );
+ rOutPage.SetSound( mbSoundOn );
+ rOutPage.SetSoundFile( maSound );
+ }
+ }
+ if( ! mbLoopSoundAmbiguous )
+ rOutPage.SetLoopSound( mbLoopSound );
+ }
+
+ void compareWith( const SdPage & rPage )
+ {
+ TransitionEffect aOtherEffect( rPage );
+ mbEffectAmbiguous = mbEffectAmbiguous || aOtherEffect.mbEffectAmbiguous
+ || (mnType != aOtherEffect.mnType)
+ || (mnSubType != aOtherEffect.mnSubType)
+ || (mbDirection != aOtherEffect.mbDirection)
+ || (mnFadeColor != aOtherEffect.mnFadeColor);
+
+ mbDurationAmbiguous = mbDurationAmbiguous || aOtherEffect.mbDurationAmbiguous || mfDuration != aOtherEffect.mfDuration;
+ mbTimeAmbiguous = mbTimeAmbiguous || aOtherEffect.mbTimeAmbiguous || mfTime != aOtherEffect.mfTime;
+ mbPresChangeAmbiguous = mbPresChangeAmbiguous || aOtherEffect.mbPresChangeAmbiguous || mePresChange != aOtherEffect.mePresChange;
+ mbSoundAmbiguous = mbSoundAmbiguous || aOtherEffect.mbSoundAmbiguous || mbSoundOn != aOtherEffect.mbSoundOn;
+#if 0
+ // Weird leftover isolated expression with no effect, introduced in 2007 in
+ // CWS impress122. Ifdeffed out to avoid compiler warning, kept here in case
+ // somebody who understands this code notices and understands what the
+ // "right" thing to do might be.
+ (!mbStopSound && !aOtherEffect.mbStopSound && maSound != aOtherEffect.maSound) || (mbStopSound != aOtherEffect.mbStopSound);
+#endif
+ mbLoopSoundAmbiguous = mbLoopSoundAmbiguous || aOtherEffect.mbLoopSoundAmbiguous || mbLoopSound != aOtherEffect.mbLoopSound;
+ }
+
+ // effect
+ sal_Int16 mnType;
+ sal_Int16 mnSubType;
+ bool mbDirection;
+ sal_Int32 mnFadeColor;
+
+ // other settings
+ double mfDuration;
+ double mfTime;
+ PresChange mePresChange;
+ bool mbSoundOn;
+ OUString maSound;
+ bool mbLoopSound;
+ bool mbStopSound;
+
+ bool mbEffectAmbiguous;
+ bool mbDurationAmbiguous;
+ bool mbTimeAmbiguous;
+ bool mbPresChangeAmbiguous;
+ bool mbSoundAmbiguous;
+ bool mbLoopSoundAmbiguous;
+};
+
+} // namespace sd::impl
+
+// Local Helper Functions
+namespace
+{
+
+void lcl_ApplyToPages(
+ const ::sd::slidesorter::SharedPageSelection& rpPages,
+ const ::sd::impl::TransitionEffect & rEffect )
+{
+ for( const auto& rpPage : *rpPages )
+ {
+ rEffect.applyTo( *rpPage );
+ }
+}
+
+void lcl_CreateUndoForPages(
+ const ::sd::slidesorter::SharedPageSelection& rpPages,
+ ::sd::ViewShellBase const & rBase )
+{
+ ::sd::DrawDocShell* pDocSh = rBase.GetDocShell();
+ if (!pDocSh)
+ return;
+ SfxUndoManager* pManager = pDocSh->GetUndoManager();
+ if (!pManager)
+ return;
+ SdDrawDocument* pDoc = pDocSh->GetDoc();
+ if (!pDoc)
+ return;
+
+ OUString aComment( SdResId(STR_UNDO_SLIDE_PARAMS) );
+ pManager->EnterListAction(aComment, aComment, 0, rBase.GetViewShellId());
+ std::unique_ptr<SdUndoGroup> pUndoGroup(new SdUndoGroup( pDoc ));
+ pUndoGroup->SetComment( aComment );
+
+ for( const auto& rpPage : *rpPages )
+ {
+ pUndoGroup->AddAction( new sd::UndoTransition( pDoc, rpPage ) );
+ }
+
+ pManager->AddUndoAction( std::move(pUndoGroup) );
+ pManager->LeaveListAction();
+}
+
+struct lcl_EqualsSoundFileName
+{
+ explicit lcl_EqualsSoundFileName( const OUString & rStr ) :
+ maStr( rStr )
+ {}
+
+ bool operator() ( const OUString & rStr ) const
+ {
+ // note: formerly this was a case insensitive search for all
+ // platforms. It seems more sensible to do this platform-dependent
+ INetURLObject aURL(rStr);
+#if defined(_WIN32)
+ return maStr.equalsIgnoreAsciiCase( aURL.GetBase() );
+#else
+ return maStr == aURL.GetBase();
+#endif
+ }
+
+private:
+ OUString maStr;
+};
+
+// returns -1 if no object was found
+bool lcl_findSoundInList( const ::std::vector< OUString > & rSoundList,
+ std::u16string_view rFileName,
+ ::std::vector< OUString >::size_type & rOutPosition )
+{
+ INetURLObject aURL(rFileName);
+ ::std::vector< OUString >::const_iterator aIt =
+ ::std::find_if( rSoundList.begin(), rSoundList.end(),
+ lcl_EqualsSoundFileName( aURL.GetBase()));
+ if( aIt != rSoundList.end())
+ {
+ rOutPosition = ::std::distance( rSoundList.begin(), aIt );
+ return true;
+ }
+
+ return false;
+}
+
+OUString lcl_getSoundFileURL(
+ const ::std::vector< OUString > & rSoundList,
+ const weld::ComboBox& rListBox )
+{
+ sal_Int32 nPos = rListBox.get_active();
+ // the first three entries are no actual sounds
+ if( nPos >= 3 )
+ {
+ DBG_ASSERT( static_cast<sal_uInt32>(rListBox.get_count() - 3) == rSoundList.size(),
+ "Sound list-box is not synchronized to sound list" );
+ nPos -= 3;
+ if( rSoundList.size() > o3tl::make_unsigned(nPos) )
+ return rSoundList[ nPos ];
+ }
+
+ return OUString();
+}
+
+struct lcl_AppendSoundToListBox
+{
+ explicit lcl_AppendSoundToListBox(weld::ComboBox& rListBox)
+ : mrListBox( rListBox )
+ {}
+
+ void operator() ( std::u16string_view rString ) const
+ {
+ INetURLObject aURL( rString );
+ mrListBox.append_text( aURL.GetBase() );
+ }
+
+private:
+ weld::ComboBox& mrListBox;
+};
+
+void lcl_FillSoundListBox(
+ const ::std::vector< OUString > & rSoundList,
+ weld::ComboBox& rOutListBox )
+{
+ sal_Int32 nCount = rOutListBox.get_count();
+
+ // keep first three entries
+ for( sal_Int32 i=nCount - 1; i>=3; --i )
+ rOutListBox.remove( i );
+
+ ::std::for_each( rSoundList.begin(), rSoundList.end(),
+ lcl_AppendSoundToListBox( rOutListBox ));
+}
+
+/// Returns an offset into the list of transition presets
+size_t getPresetOffset( const sd::impl::TransitionEffect &rEffect )
+{
+ const sd::TransitionPresetList& rPresetList =
+ sd::TransitionPreset::getTransitionPresetList();
+
+ size_t nIdx = 0;
+ for( const auto& aIt: rPresetList )
+ {
+ if( rEffect.operator==( *aIt ))
+ break;
+ nIdx++;
+ }
+ return nIdx;
+}
+
+} // anonymous namespace
+
+namespace sd
+{
+
+class TransitionPane : public ValueSet
+{
+public:
+ explicit TransitionPane(std::unique_ptr<weld::ScrolledWindow> pScrolledWindow)
+ : ValueSet(std::move(pScrolledWindow))
+ {
+ }
+
+ void Recalculate()
+ {
+ GetScrollBar()->set_vpolicy(VclPolicyType::AUTOMATIC);
+ RecalculateItemSizes();
+ }
+
+ virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override
+ {
+ Size aSize = pDrawingArea->get_ref_device().LogicToPixel(Size(70, 88), MapMode(MapUnit::MapAppFont));
+ pDrawingArea->set_size_request(aSize.Width(), aSize.Height());
+ ValueSet::SetDrawingArea(pDrawingArea);
+ SetOutputSizePixel(aSize);
+
+ SetStyle(GetStyle() | WB_ITEMBORDER | WB_FLATVALUESET | WB_VSCROLL);
+ EnableFullItemMode( false );
+ SetColCount(3);
+ }
+};
+
+// SlideTransitionPane
+SlideTransitionPane::SlideTransitionPane(
+ weld::Widget* pParent,
+ ViewShellBase & rBase) :
+ PanelLayout( pParent, "SlideTransitionsPanel", "modules/simpress/ui/slidetransitionspanel.ui" ),
+ mrBase( rBase ),
+ mpDrawDoc( rBase.GetDocShell() ? rBase.GetDocShell()->GetDoc() : nullptr ),
+ mbHasSelection( false ),
+ mbUpdatingControls( false ),
+ mbIsMainViewChangePending( false ),
+ maLateInitTimer("sd SlideTransitionPane maLateInitTimer")
+{
+ Initialize(mpDrawDoc);
+}
+
+css::ui::LayoutSize SlideTransitionPane::GetHeightForWidth(const sal_Int32 /*nWidth*/)
+{
+ sal_Int32 nMinimumHeight = get_preferred_size().Height();
+ return css::ui::LayoutSize(nMinimumHeight, -1, nMinimumHeight);
+}
+
+constexpr sal_uInt16 nNoneId = std::numeric_limits<sal_uInt16>::max();
+
+void SlideTransitionPane::Initialize(SdDrawDocument* pDoc)
+{
+ mxFT_VARIANT = m_xBuilder->weld_label("variant_label");
+ mxLB_VARIANT = m_xBuilder->weld_combo_box("variant_list");
+ mxFT_duration = m_xBuilder->weld_label("duration_label");
+ mxCBX_duration = m_xBuilder->weld_metric_spin_button("transition_duration", FieldUnit::SECOND);
+ mxFT_SOUND = m_xBuilder->weld_label("sound_label");
+ mxLB_SOUND = m_xBuilder->weld_combo_box("sound_list");
+ mxCB_LOOP_SOUND = m_xBuilder->weld_check_button("loop_sound");
+ mxRB_ADVANCE_ON_MOUSE = m_xBuilder->weld_radio_button("rb_mouse_click");
+ mxRB_ADVANCE_AUTO = m_xBuilder->weld_radio_button("rb_auto_after");
+ mxMF_ADVANCE_AUTO_AFTER = m_xBuilder->weld_metric_spin_button("auto_after_value", FieldUnit::SECOND);
+ mxPB_APPLY_TO_ALL = m_xBuilder->weld_button("apply_to_all");
+ mxPB_PLAY = m_xBuilder->weld_button("play");
+ mxCB_AUTO_PREVIEW = m_xBuilder->weld_check_button("auto_preview");
+
+ auto nMax = mxMF_ADVANCE_AUTO_AFTER->get_max(FieldUnit::SECOND);
+ mxMF_ADVANCE_AUTO_AFTER->set_max(99, FieldUnit::SECOND);
+ int nWidthChars = mxMF_ADVANCE_AUTO_AFTER->get_width_chars();
+ mxMF_ADVANCE_AUTO_AFTER->set_max(nMax, FieldUnit::SECOND);
+ mxMF_ADVANCE_AUTO_AFTER->set_width_chars(nWidthChars);
+ mxCBX_duration->set_width_chars(nWidthChars);
+
+ mxVS_TRANSITION_ICONS.reset(new TransitionPane(m_xBuilder->weld_scrolled_window("transitions_iconswin", true)));
+ mxVS_TRANSITION_ICONSWin.reset(new weld::CustomWeld(*m_xBuilder, "transitions_icons", *mxVS_TRANSITION_ICONS));
+
+ if( pDoc )
+ mxModel.set( pDoc->getUnoModel(), uno::UNO_QUERY );
+ // TODO: get correct view
+ if( mxModel.is())
+ mxView.set( mxModel->getCurrentController(), uno::UNO_QUERY );
+
+ // dummy list box of slide transitions for startup.
+ mxVS_TRANSITION_ICONS->InsertItem(
+ nNoneId, Image( StockImage::Yes, "sd/cmd/transition-none.png" ),
+ SdResId( STR_SLIDETRANSITION_NONE ),
+ VALUESET_APPEND, /* show legend */ true );
+ mxVS_TRANSITION_ICONS->Recalculate();
+
+ // set defaults
+ mxCB_AUTO_PREVIEW->set_active(true); // automatic preview on
+
+ // update control states before adding handlers
+ updateControls();
+
+ // set handlers
+ mxPB_APPLY_TO_ALL->connect_clicked( LINK( this, SlideTransitionPane, ApplyToAllButtonClicked ));
+ mxPB_PLAY->connect_clicked( LINK( this, SlideTransitionPane, PlayButtonClicked ));
+
+ mxVS_TRANSITION_ICONS->SetSelectHdl( LINK( this, SlideTransitionPane, TransitionSelected ));
+
+ mxLB_VARIANT->connect_changed( LINK( this, SlideTransitionPane, VariantListBoxSelected ));
+ mxCBX_duration->connect_value_changed(LINK( this, SlideTransitionPane, DurationModifiedHdl));
+ mxCBX_duration->connect_focus_out(LINK( this, SlideTransitionPane, DurationLoseFocusHdl));
+ mxLB_SOUND->connect_changed( LINK( this, SlideTransitionPane, SoundListBoxSelected ));
+ mxCB_LOOP_SOUND->connect_toggled( LINK( this, SlideTransitionPane, LoopSoundBoxChecked ));
+
+ mxRB_ADVANCE_ON_MOUSE->connect_toggled( LINK( this, SlideTransitionPane, AdvanceSlideRadioButtonToggled ));
+ mxRB_ADVANCE_AUTO->connect_toggled( LINK( this, SlideTransitionPane, AdvanceSlideRadioButtonToggled ));
+ mxMF_ADVANCE_AUTO_AFTER->connect_value_changed( LINK( this, SlideTransitionPane, AdvanceTimeModified ));
+ mxCB_AUTO_PREVIEW->connect_toggled( LINK( this, SlideTransitionPane, AutoPreviewClicked ));
+ addListener();
+
+ maLateInitTimer.SetTimeout(200);
+ maLateInitTimer.SetInvokeHandler(LINK(this, SlideTransitionPane, LateInitCallback));
+ maLateInitTimer.Start();
+}
+
+SlideTransitionPane::~SlideTransitionPane()
+{
+ maLateInitTimer.Stop();
+ removeListener();
+ mxVS_TRANSITION_ICONSWin.reset();
+ mxVS_TRANSITION_ICONS.reset();
+ mxFT_VARIANT.reset();
+ mxLB_VARIANT.reset();
+ mxFT_duration.reset();
+ mxCBX_duration.reset();
+ mxFT_SOUND.reset();
+ mxLB_SOUND.reset();
+ mxCB_LOOP_SOUND.reset();
+ mxRB_ADVANCE_ON_MOUSE.reset();
+ mxRB_ADVANCE_AUTO.reset();
+ mxMF_ADVANCE_AUTO_AFTER.reset();
+ mxPB_APPLY_TO_ALL.reset();
+ mxPB_PLAY.reset();
+ mxCB_AUTO_PREVIEW.reset();
+}
+
+void SlideTransitionPane::onSelectionChanged()
+{
+ updateControls();
+}
+
+void SlideTransitionPane::onChangeCurrentPage()
+{
+ updateControls();
+}
+
+::sd::slidesorter::SharedPageSelection SlideTransitionPane::getSelectedPages() const
+{
+ ::sd::slidesorter::SlideSorterViewShell * pSlideSorterViewShell
+ = ::sd::slidesorter::SlideSorterViewShell::GetSlideSorter(mrBase);
+ std::shared_ptr<sd::slidesorter::SlideSorterViewShell::PageSelection> pSelection;
+
+ if( pSlideSorterViewShell )
+ {
+ pSelection = pSlideSorterViewShell->GetPageSelection();
+ }
+ else
+ {
+ pSelection = std::make_shared<sd::slidesorter::SlideSorterViewShell::PageSelection>();
+ if( mxView.is() )
+ {
+ SdPage* pPage = SdPage::getImplementation( mxView->getCurrentPage() );
+ if( pPage )
+ pSelection->push_back(pPage);
+ }
+ }
+
+ return pSelection;
+}
+
+void SlideTransitionPane::updateControls()
+{
+ ::sd::slidesorter::SharedPageSelection pSelectedPages(getSelectedPages());
+ if( pSelectedPages->empty())
+ {
+ mbHasSelection = false;
+ return;
+ }
+ mbHasSelection = true;
+
+ DBG_ASSERT( ! mbUpdatingControls, "Multiple Control Updates" );
+ mbUpdatingControls = true;
+
+ // get model data for first page
+ SdPage * pFirstPage = pSelectedPages->front();
+ DBG_ASSERT( pFirstPage, "Invalid Page" );
+
+ impl::TransitionEffect aEffect( *pFirstPage );
+
+ // merge with other pages
+
+ // start with second page (note aIt != aEndIt, because ! aSelectedPages.empty())
+ for( const auto& rpPage : *pSelectedPages )
+ {
+ if( rpPage )
+ aEffect.compareWith( *rpPage );
+ }
+
+ // detect current slide effect
+ if( aEffect.mbEffectAmbiguous )
+ {
+ SAL_WARN( "sd.transitions", "Unusual, ambiguous transition effect" );
+ mxVS_TRANSITION_ICONS->SelectItem(nNoneId);
+ }
+ else
+ {
+ // ToDo: That 0 is "no transition" is documented nowhere except in the
+ // CTOR of sdpage
+ if( aEffect.mnType == 0 )
+ mxVS_TRANSITION_ICONS->SelectItem(nNoneId);
+ else
+ updateVariants( getPresetOffset( aEffect ) );
+ }
+
+ if( aEffect.mbDurationAmbiguous )
+ {
+ mxCBX_duration->set_text("");
+//TODO mxCBX_duration->SetNoSelection();
+ }
+ else
+ {
+ mxCBX_duration->set_value( (aEffect.mfDuration)*100.0, FieldUnit::SECOND );
+ }
+
+ if( aEffect.mbSoundAmbiguous )
+ {
+ mxLB_SOUND->set_active(-1);
+ maCurrentSoundFile.clear();
+ }
+ else
+ {
+ maCurrentSoundFile.clear();
+ if( aEffect.mbStopSound )
+ {
+ mxLB_SOUND->set_active( 1 );
+ }
+ else if( aEffect.mbSoundOn && !aEffect.maSound.isEmpty() )
+ {
+ std::vector<OUString>::size_type nPos = 0;
+ if( lcl_findSoundInList( maSoundList, aEffect.maSound, nPos ))
+ {
+ mxLB_SOUND->set_active( nPos + 3 );
+ maCurrentSoundFile = aEffect.maSound;
+ }
+ }
+ else
+ {
+ mxLB_SOUND->set_active( 0 );
+ }
+ }
+
+ if( aEffect.mbLoopSoundAmbiguous )
+ {
+ mxCB_LOOP_SOUND->set_state(TRISTATE_INDET);
+ }
+ else
+ {
+ mxCB_LOOP_SOUND->set_active(aEffect.mbLoopSound);
+ }
+
+ if( aEffect.mbPresChangeAmbiguous )
+ {
+ mxRB_ADVANCE_ON_MOUSE->set_active( false );
+ mxRB_ADVANCE_AUTO->set_active( false );
+ }
+ else
+ {
+ mxRB_ADVANCE_ON_MOUSE->set_active( aEffect.mePresChange == PresChange::Manual );
+ mxRB_ADVANCE_AUTO->set_active( aEffect.mePresChange == PresChange::Auto );
+ mxMF_ADVANCE_AUTO_AFTER->set_value(aEffect.mfTime * 100.0, FieldUnit::SECOND);
+ }
+
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ mxPB_PLAY->hide();
+ mxCB_AUTO_PREVIEW->set_active(false);
+ mxCB_AUTO_PREVIEW->hide();
+ mxFT_SOUND->hide();
+ mxLB_SOUND->hide();
+ mxCB_LOOP_SOUND->hide();
+ }
+ else
+ {
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress);
+ mxCB_AUTO_PREVIEW->set_active( pOptions->IsPreviewTransitions() );
+ }
+
+ mbUpdatingControls = false;
+
+ updateControlState();
+}
+
+void SlideTransitionPane::updateControlState()
+{
+ mxVS_TRANSITION_ICONSWin->set_sensitive( mbHasSelection );
+ mxLB_VARIANT->set_sensitive( mbHasSelection && mxLB_VARIANT->get_count() > 0 );
+ mxCBX_duration->set_sensitive( mbHasSelection );
+ mxLB_SOUND->set_sensitive( mbHasSelection );
+ mxCB_LOOP_SOUND->set_sensitive( mbHasSelection && (mxLB_SOUND->get_active() > 2));
+ mxRB_ADVANCE_ON_MOUSE->set_sensitive( mbHasSelection );
+ mxRB_ADVANCE_AUTO->set_sensitive( mbHasSelection );
+ mxMF_ADVANCE_AUTO_AFTER->set_sensitive( mbHasSelection && mxRB_ADVANCE_AUTO->get_active());
+
+ mxPB_APPLY_TO_ALL->set_sensitive( mbHasSelection );
+ mxPB_PLAY->set_sensitive( mbHasSelection );
+ mxCB_AUTO_PREVIEW->set_sensitive( mbHasSelection );
+}
+
+void SlideTransitionPane::updateSoundList()
+{
+ maSoundList.clear();
+
+ GalleryExplorer::FillObjList( GALLERY_THEME_SOUNDS, maSoundList );
+ GalleryExplorer::FillObjList( GALLERY_THEME_USERSOUNDS, maSoundList );
+
+ lcl_FillSoundListBox( maSoundList, *mxLB_SOUND );
+}
+
+void SlideTransitionPane::openSoundFileDialog()
+{
+ if( ! mxLB_SOUND->get_sensitive())
+ return;
+
+ SdOpenSoundFileDialog aFileDialog(GetFrameWeld());
+
+ DBG_ASSERT( mxLB_SOUND->get_active() == 2,
+ "Dialog should only open when \"Other sound\" is selected" );
+
+ bool bValidSoundFile( false );
+ bool bQuitLoop( false );
+
+ while( ! bQuitLoop &&
+ aFileDialog.Execute() == ERRCODE_NONE )
+ {
+ OUString aFile = aFileDialog.GetPath();
+ std::vector<OUString>::size_type nPos = 0;
+ bValidSoundFile = lcl_findSoundInList( maSoundList, aFile, nPos );
+
+ if( bValidSoundFile )
+ {
+ bQuitLoop = true;
+ }
+ else // not in sound list
+ {
+ // try to insert into gallery
+ if( GalleryExplorer::InsertURL( GALLERY_THEME_USERSOUNDS, aFile ) )
+ {
+ updateSoundList();
+ bValidSoundFile = lcl_findSoundInList( maSoundList, aFile, nPos );
+ DBG_ASSERT( bValidSoundFile, "Adding sound to gallery failed" );
+
+ bQuitLoop = true;
+ }
+ else
+ {
+ OUString aStrWarning(SdResId(STR_WARNING_NOSOUNDFILE));
+ aStrWarning = aStrWarning.replaceFirst("%", aFile);
+ std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(nullptr,
+ VclMessageType::Warning, VclButtonsType::NONE,
+ aStrWarning));
+ xWarn->add_button(GetStandardText(StandardButtonType::Retry), RET_RETRY);
+ xWarn->add_button(GetStandardText(StandardButtonType::Cancel), RET_CANCEL);
+ bQuitLoop = (xWarn->run() != RET_RETRY);
+
+ bValidSoundFile = false;
+ }
+ }
+
+ if( bValidSoundFile )
+ // skip first three entries in list
+ mxLB_SOUND->set_active( nPos + 3 );
+ }
+
+ if( bValidSoundFile )
+ return;
+
+ if( !maCurrentSoundFile.isEmpty() )
+ {
+ std::vector<OUString>::size_type nPos = 0;
+ if( lcl_findSoundInList( maSoundList, maCurrentSoundFile, nPos ))
+ mxLB_SOUND->set_active( nPos + 3 );
+ else
+ mxLB_SOUND->set_active( 0 ); // NONE
+ }
+ else
+ mxLB_SOUND->set_active( 0 ); // NONE
+}
+
+impl::TransitionEffect SlideTransitionPane::getTransitionEffectFromControls() const
+{
+ impl::TransitionEffect aResult;
+ aResult.setAllAmbiguous();
+
+ bool bNoneSelected = mxVS_TRANSITION_ICONS->IsNoSelection() || mxVS_TRANSITION_ICONS->GetSelectedItemId() == nNoneId;
+
+ // check first (aResult might be overwritten)
+ if( mxVS_TRANSITION_ICONSWin->get_sensitive() &&
+ !bNoneSelected &&
+ mxVS_TRANSITION_ICONS->GetSelectedItemId() > 0 )
+ {
+ const sd::TransitionPresetList& rPresetList = sd::TransitionPreset::getTransitionPresetList();
+ auto aSelected = rPresetList.begin();
+ std::advance( aSelected, mxVS_TRANSITION_ICONS->GetSelectedItemId() - 1);
+
+ if (mxLB_VARIANT->get_active() == -1)
+ {
+ // Transition with just one effect.
+ aResult = impl::TransitionEffect( **aSelected );
+ aResult.setAllAmbiguous();
+ }
+ else
+ {
+ int nVariant = 0;
+ bool bFound = false;
+ for( const auto& aIter: rPresetList )
+ {
+ if( aIter->getSetId() == (*aSelected)->getSetId() )
+ {
+ if( mxLB_VARIANT->get_active() == nVariant)
+ {
+ aResult = impl::TransitionEffect( *aIter );
+ aResult.setAllAmbiguous();
+ bFound = true;
+ break;
+ }
+ else
+ {
+ nVariant++;
+ }
+ }
+ }
+ if( !bFound )
+ {
+ aResult.mnType = 0;
+ }
+ }
+ aResult.mbEffectAmbiguous = false;
+ }
+ else if (bNoneSelected)
+ {
+ aResult.mbEffectAmbiguous = false;
+ }
+
+ //duration
+
+ if( mxCBX_duration->get_sensitive() && (!(mxCBX_duration->get_text()).isEmpty()) )
+ {
+ aResult.mfDuration = static_cast<double>(mxCBX_duration->get_value(FieldUnit::SECOND))/100.0;
+ aResult.mbDurationAmbiguous = false;
+ }
+
+ // slide-advance mode
+ if( mxRB_ADVANCE_ON_MOUSE->get_sensitive() && mxRB_ADVANCE_AUTO->get_sensitive() &&
+ (mxRB_ADVANCE_ON_MOUSE->get_active() || mxRB_ADVANCE_AUTO->get_active()))
+ {
+ if( mxRB_ADVANCE_ON_MOUSE->get_active())
+ aResult.mePresChange = PresChange::Manual;
+ else
+ {
+ aResult.mePresChange = PresChange::Auto;
+ if( mxMF_ADVANCE_AUTO_AFTER->get_sensitive())
+ {
+ aResult.mfTime = static_cast<double>(mxMF_ADVANCE_AUTO_AFTER->get_value(FieldUnit::SECOND) ) / 100.0 ;
+ aResult.mbTimeAmbiguous = false;
+ }
+ }
+
+ aResult.mbPresChangeAmbiguous = false;
+ }
+
+ // sound
+ if( mxLB_SOUND->get_sensitive())
+ {
+ maCurrentSoundFile.clear();
+ sal_Int32 nPos = mxLB_SOUND->get_active();
+ if (nPos != -1)
+ {
+ aResult.mbStopSound = nPos == 1;
+ aResult.mbSoundOn = nPos > 1;
+ if( aResult.mbStopSound )
+ {
+ aResult.maSound.clear();
+ aResult.mbSoundAmbiguous = false;
+ }
+ else
+ {
+ aResult.maSound = lcl_getSoundFileURL(maSoundList, *mxLB_SOUND);
+ aResult.mbSoundAmbiguous = false;
+ maCurrentSoundFile = aResult.maSound;
+ }
+ }
+ }
+
+ // sound loop
+ if( mxCB_LOOP_SOUND->get_sensitive() )
+ {
+ aResult.mbLoopSound = mxCB_LOOP_SOUND->get_active();
+ aResult.mbLoopSoundAmbiguous = false;
+ }
+
+ return aResult;
+}
+
+void SlideTransitionPane::applyToSelectedPages(bool bPreview = true)
+{
+ if( mbUpdatingControls )
+ return;
+
+ vcl::Window *pFocusWindow = Application::GetFocusWindow();
+
+ ::sd::slidesorter::SharedPageSelection pSelectedPages( getSelectedPages());
+ impl::TransitionEffect aEffect = getTransitionEffectFromControls();
+ if( ! pSelectedPages->empty())
+ {
+ lcl_CreateUndoForPages( pSelectedPages, mrBase );
+ lcl_ApplyToPages( pSelectedPages, aEffect );
+ mrBase.GetDocShell()->SetModified();
+ }
+ if( mxCB_AUTO_PREVIEW->get_sensitive() &&
+ mxCB_AUTO_PREVIEW->get_active() && bPreview)
+ {
+ if (aEffect.mnType) // mnType = 0 denotes no transition
+ playCurrentEffect();
+ else if( mxView.is() )
+ SlideShow::Stop( mrBase );
+ }
+
+ if (pFocusWindow)
+ pFocusWindow->GrabFocus();
+}
+
+void SlideTransitionPane::playCurrentEffect()
+{
+ if( mxView.is() )
+ {
+
+ Reference< css::animations::XAnimationNode > xNode;
+ SlideShow::StartPreview( mrBase, mxView->getCurrentPage(), xNode );
+ }
+}
+
+void SlideTransitionPane::addListener()
+{
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,SlideTransitionPane,EventMultiplexerListener) );
+ mrBase.GetEventMultiplexer()->AddEventListener( aLink );
+}
+
+void SlideTransitionPane::removeListener()
+{
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,SlideTransitionPane,EventMultiplexerListener) );
+ mrBase.GetEventMultiplexer()->RemoveEventListener( aLink );
+}
+
+IMPL_LINK(SlideTransitionPane,EventMultiplexerListener,
+ tools::EventMultiplexerEvent&, rEvent, void)
+{
+ switch (rEvent.meEventId)
+ {
+ case EventMultiplexerEventId::EditViewSelection:
+ onSelectionChanged();
+ break;
+
+ case EventMultiplexerEventId::CurrentPageChanged:
+ case EventMultiplexerEventId::SlideSortedSelection:
+ onChangeCurrentPage();
+ break;
+
+ case EventMultiplexerEventId::MainViewRemoved:
+ mxView.clear();
+ onSelectionChanged();
+ onChangeCurrentPage();
+ break;
+
+ case EventMultiplexerEventId::MainViewAdded:
+ mbIsMainViewChangePending = true;
+ break;
+
+ case EventMultiplexerEventId::ConfigurationUpdated:
+ if (mbIsMainViewChangePending)
+ {
+ mbIsMainViewChangePending = false;
+
+ // At this moment the controller may not yet been set at
+ // model or ViewShellBase. Take it from the view shell
+ // passed with the event.
+ if (mrBase.GetMainViewShell() != nullptr)
+ {
+ mxView.set(mrBase.GetController(), css::uno::UNO_QUERY);
+ onSelectionChanged();
+ onChangeCurrentPage();
+ }
+ }
+ break;
+
+ default:
+ if (rEvent.meEventId != EventMultiplexerEventId::Disposing)
+ {
+ onSelectionChanged();
+ onChangeCurrentPage();
+ }
+ break;
+ }
+}
+
+IMPL_LINK_NOARG(SlideTransitionPane, ApplyToAllButtonClicked, weld::Button&, void)
+{
+ DBG_ASSERT( mpDrawDoc, "Invalid Draw Document!" );
+ if( !mpDrawDoc )
+ return;
+
+ ::sd::slidesorter::SharedPageSelection pPages =
+ std::make_shared<::sd::slidesorter::SlideSorterViewShell::PageSelection>();
+
+ sal_uInt16 nPageCount = mpDrawDoc->GetSdPageCount( PageKind::Standard );
+ pPages->reserve( nPageCount );
+ for( sal_uInt16 i=0; i<nPageCount; ++i )
+ {
+ SdPage * pPage = mpDrawDoc->GetSdPage( i, PageKind::Standard );
+ if( pPage )
+ pPages->push_back( pPage );
+ }
+
+ if( ! pPages->empty())
+ {
+ lcl_CreateUndoForPages( pPages, mrBase );
+ lcl_ApplyToPages( pPages, getTransitionEffectFromControls() );
+ }
+}
+
+IMPL_LINK_NOARG(SlideTransitionPane, PlayButtonClicked, weld::Button&, void)
+{
+ playCurrentEffect();
+}
+
+IMPL_LINK_NOARG(SlideTransitionPane, TransitionSelected, ValueSet*, void)
+{
+ updateVariants( mxVS_TRANSITION_ICONS->GetSelectedItemId() - 1 );
+ applyToSelectedPages();
+}
+
+/// we use an integer offset into the list of transition presets
+void SlideTransitionPane::updateVariants( size_t nPresetOffset )
+{
+ const sd::TransitionPresetList& rPresetList = sd::TransitionPreset::getTransitionPresetList();
+ mxLB_VARIANT->clear();
+ mxVS_TRANSITION_ICONS->SelectItem(nNoneId);
+
+ if( nPresetOffset >= rPresetList.size() )
+ {
+ mxLB_VARIANT->set_sensitive( false );
+ }
+ else
+ {
+ auto pFound = rPresetList.begin();
+ std::advance( pFound, nPresetOffset );
+
+ // Fill in the variant listbox
+ size_t nFirstItem = 0, nItem = 1;
+ for( const auto& aIt: rPresetList )
+ {
+ if( aIt->getSetId() == (*pFound)->getSetId() )
+ {
+ if (!nFirstItem)
+ nFirstItem = nItem;
+ if( !aIt->getVariantLabel().isEmpty() )
+ {
+ mxLB_VARIANT->append_text( aIt->getVariantLabel() );
+ if( *pFound == aIt )
+ mxLB_VARIANT->set_active( mxLB_VARIANT->get_count()-1 );
+ }
+ }
+ nItem++;
+ }
+
+ if( mxLB_VARIANT->get_count() == 0 )
+ mxLB_VARIANT->set_sensitive( false );
+ else
+ mxLB_VARIANT->set_sensitive(true);
+
+ // item has the id of the first transition from this set.
+ mxVS_TRANSITION_ICONS->SelectItem( nFirstItem );
+ }
+}
+
+IMPL_LINK_NOARG(SlideTransitionPane, AdvanceSlideRadioButtonToggled, weld::Toggleable&, void)
+{
+ updateControlState();
+ applyToSelectedPages(false);
+}
+
+IMPL_LINK_NOARG(SlideTransitionPane, AdvanceTimeModified, weld::MetricSpinButton&, void)
+{
+ applyToSelectedPages(false);
+}
+
+IMPL_LINK_NOARG(SlideTransitionPane, VariantListBoxSelected, weld::ComboBox&, void)
+{
+ applyToSelectedPages();
+}
+
+IMPL_LINK_NOARG(SlideTransitionPane, DurationModifiedHdl, weld::MetricSpinButton&, void)
+{
+ double duration_value = static_cast<double>(mxCBX_duration->get_value(FieldUnit::SECOND));
+ if (duration_value <= 0.0)
+ mxCBX_duration->set_value(0, FieldUnit::SECOND);
+ else
+ mxCBX_duration->set_value(duration_value, FieldUnit::SECOND);
+
+ applyToSelectedPages();
+}
+
+IMPL_LINK_NOARG(SlideTransitionPane, DurationLoseFocusHdl, weld::Widget&, void)
+{
+ applyToSelectedPages();
+}
+
+IMPL_LINK_NOARG(SlideTransitionPane, SoundListBoxSelected, weld::ComboBox&, void)
+{
+ sal_Int32 nPos = mxLB_SOUND->get_active();
+ if( nPos == 2 )
+ {
+ // other sound...
+ openSoundFileDialog();
+ }
+ updateControlState();
+ applyToSelectedPages();
+}
+
+IMPL_LINK_NOARG(SlideTransitionPane, LoopSoundBoxChecked, weld::Toggleable&, void)
+{
+ applyToSelectedPages();
+}
+
+IMPL_LINK_NOARG(SlideTransitionPane, AutoPreviewClicked, weld::Toggleable&, void)
+{
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress);
+ pOptions->SetPreviewTransitions( mxCB_AUTO_PREVIEW->get_active() );
+}
+
+IMPL_LINK_NOARG(SlideTransitionPane, LateInitCallback, Timer *, void)
+{
+ const TransitionPresetList& rPresetList = TransitionPreset::getTransitionPresetList();
+
+ size_t nPresetOffset = 0;
+ for( const TransitionPresetPtr& pPreset: rPresetList )
+ {
+ const OUString sLabel( pPreset->getSetLabel() );
+ if( !sLabel.isEmpty() )
+ {
+ if( m_aNumVariants.find( pPreset->getSetId() ) == m_aNumVariants.end() )
+ {
+ OUString sImageName("sd/cmd/transition-" + pPreset->getSetId() + ".png");
+ BitmapEx aIcon( sImageName );
+ if ( aIcon.IsEmpty() ) // need a fallback
+ sImageName = "sd/cmd/transition-none.png";
+
+ mxVS_TRANSITION_ICONS->InsertItem(
+ nPresetOffset + 1, Image(StockImage::Yes, sImageName), sLabel,
+ VALUESET_APPEND, /* show legend */ true );
+
+ m_aNumVariants[ pPreset->getSetId() ] = 1;
+ }
+ else
+ {
+ m_aNumVariants[ pPreset->getSetId() ]++;
+ }
+ }
+ nPresetOffset++;
+ }
+ mxVS_TRANSITION_ICONS->Recalculate();
+
+ SAL_INFO( "sd.transitions", "Item transition offsets in ValueSet:");
+ for( size_t i = 0; i < mxVS_TRANSITION_ICONS->GetItemCount(); ++i )
+ SAL_INFO( "sd.transitions", i << ":" << mxVS_TRANSITION_ICONS->GetItemId( i ) );
+
+ nPresetOffset = 0;
+ SAL_INFO( "sd.transitions", "Transition presets by offsets:");
+ for( const auto& aIter: rPresetList )
+ {
+ SAL_INFO( "sd.transitions", nPresetOffset++ << " " <<
+ aIter->getPresetId() << ": " << aIter->getSetId() );
+ }
+
+ updateSoundList();
+ updateControls();
+}
+
+} // namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/animations/motionpathtag.cxx b/sd/source/ui/animations/motionpathtag.cxx
new file mode 100644
index 000000000..ced685395
--- /dev/null
+++ b/sd/source/ui/animations/motionpathtag.cxx
@@ -0,0 +1,1200 @@
+/* -*- 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 <com/sun/star/util/XChangesNotifier.hpp>
+
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/matrix/b2dhommatrixtools.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/dispatch.hxx>
+
+#include <svx/svdpagv.hxx>
+#include <svx/sdrpagewindow.hxx>
+#include <svx/sdrpaintwindow.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/xlndsit.hxx>
+#include <svx/xlnclit.hxx>
+#include <svx/xlnstit.hxx>
+#include <svx/xlnedit.hxx>
+#include <svx/xlnstwit.hxx>
+#include <svx/xlnedwit.hxx>
+#include <svx/xlnstcit.hxx>
+#include <svx/xlnedcit.hxx>
+#include <svx/xlntrit.hxx>
+#include <svx/svxids.hrc>
+#include <svx/polypolygoneditor.hxx>
+#include <svx/svddrgmt.hxx>
+
+#include <CustomAnimationPane.hxx>
+#include <View.hxx>
+#include "motionpathtag.hxx"
+#include <ViewShell.hxx>
+#include <Window.hxx>
+
+#include <svx/sdr/contact/viewcontact.hxx>
+#include <svx/sdr/overlay/overlayprimitive2dsequenceobject.hxx>
+
+using sdr::PolyPolygonEditor;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::drawing;
+
+namespace sd
+{
+
+const sal_uInt32 SMART_TAG_HDL_NUM = SAL_MAX_UINT32;
+const int DRGPIX = 2; // Drag MinMove in Pixel
+
+namespace {
+
+class PathDragMove : public SdrDragMove
+{
+private:
+ basegfx::B2DPolyPolygon maPathPolyPolygon;
+
+protected:
+ virtual void createSdrDragEntries() override;
+
+public:
+ PathDragMove(SdrDragView& rNewView,
+ const rtl::Reference <MotionPathTag >& xTag,
+ const basegfx::B2DPolyPolygon& rPathPolyPolygon)
+ : SdrDragMove(rNewView),
+ maPathPolyPolygon(rPathPolyPolygon),
+ mxTag( xTag )
+ {}
+
+ PathDragMove(SdrDragView& rNewView,
+ const rtl::Reference <MotionPathTag >& xTag)
+ : SdrDragMove(rNewView),
+ mxTag( xTag )
+ {}
+
+ virtual bool BeginSdrDrag() override;
+ virtual bool EndSdrDrag(bool bCopy) override;
+
+ rtl::Reference <MotionPathTag > mxTag;
+};
+
+}
+
+void PathDragMove::createSdrDragEntries()
+{
+ // call parent
+ SdrDragMove::createSdrDragEntries();
+
+ if(maPathPolyPolygon.count())
+ {
+ addSdrDragEntry(std::unique_ptr<SdrDragEntry>(new SdrDragEntryPolyPolygon(maPathPolyPolygon)));
+ }
+}
+
+bool PathDragMove::BeginSdrDrag()
+{
+ if( mxTag.is() )
+ {
+ SdrPathObj* pPathObj = mxTag->getPathObj();
+ if( pPathObj )
+ {
+ DragStat().SetActionRect(pPathObj->GetCurrentBoundRect());
+ }
+ }
+ Show();
+ return true;
+}
+
+bool PathDragMove::EndSdrDrag(bool /*bCopy*/)
+{
+ Hide();
+ if( mxTag.is() )
+ mxTag->MovePath( DragStat().GetDX(), DragStat().GetDY() );
+ return true;
+}
+
+namespace {
+
+class PathDragResize : public SdrDragResize
+{
+private:
+ basegfx::B2DPolyPolygon maPathPolyPolygon;
+
+protected:
+ virtual void createSdrDragEntries() override;
+
+public:
+ PathDragResize(SdrDragView& rNewView,
+ const rtl::Reference <MotionPathTag >& xTag,
+ const basegfx::B2DPolyPolygon& rPathPolyPolygon)
+ : SdrDragResize(rNewView),
+ maPathPolyPolygon(rPathPolyPolygon),
+ mxTag( xTag )
+ {}
+
+ PathDragResize(SdrDragView& rNewView,
+ const rtl::Reference <MotionPathTag >& xTag)
+ : SdrDragResize(rNewView),
+ mxTag( xTag )
+ {}
+
+ virtual bool EndSdrDrag(bool bCopy) override;
+ rtl::Reference <MotionPathTag > mxTag;
+};
+
+}
+
+void PathDragResize::createSdrDragEntries()
+{
+ // call parent
+ SdrDragResize::createSdrDragEntries();
+
+ if(maPathPolyPolygon.count())
+ {
+ addSdrDragEntry(std::unique_ptr<SdrDragEntry>(new SdrDragEntryPolyPolygon(maPathPolyPolygon)));
+ }
+}
+
+bool PathDragResize::EndSdrDrag(bool /*bCopy*/)
+{
+ Hide();
+ if( mxTag.is() )
+ {
+ SdrPathObj* pPathObj = mxTag->getPathObj();
+ if( pPathObj )
+ {
+ const Point aRef( DragStat().GetRef1() );
+ basegfx::B2DHomMatrix aTrans(basegfx::utils::createTranslateB2DHomMatrix(-aRef.X(), -aRef.Y()));
+ aTrans.scale(double(aXFact), double(aYFact));
+ aTrans.translate(aRef.X(), aRef.Y());
+ basegfx::B2DPolyPolygon aDragPoly(pPathObj->GetPathPoly());
+ aDragPoly.transform(aTrans);
+ pPathObj->SetPathPoly( aDragPoly );
+ }
+ }
+ return true;
+}
+
+namespace {
+
+class PathDragObjOwn : public SdrDragObjOwn
+{
+private:
+ basegfx::B2DPolyPolygon maPathPolyPolygon;
+
+protected:
+ virtual void createSdrDragEntries() override;
+
+public:
+ PathDragObjOwn(SdrDragView& rNewView,
+ const basegfx::B2DPolyPolygon& rPathPolyPolygon)
+ : SdrDragObjOwn(rNewView),
+ maPathPolyPolygon(rPathPolyPolygon)
+ {}
+
+ explicit PathDragObjOwn(SdrDragView& rNewView)
+ : SdrDragObjOwn(rNewView)
+ {}
+
+ virtual bool EndSdrDrag(bool bCopy) override;
+};
+
+}
+
+void PathDragObjOwn::createSdrDragEntries()
+{
+ // call parent
+ SdrDragObjOwn::createSdrDragEntries();
+
+ if(maPathPolyPolygon.count())
+ {
+ addSdrDragEntry(std::unique_ptr<SdrDragEntry>(new SdrDragEntryPolyPolygon(maPathPolyPolygon)));
+ }
+}
+
+bool PathDragObjOwn::EndSdrDrag(bool /*bCopy*/)
+{
+ Hide();
+
+ SdrObject* pObj = GetDragObj();
+
+ if(pObj && pObj->applySpecialDrag(DragStat()))
+ {
+ pObj->SetChanged();
+ pObj->BroadcastObjectChange();
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+namespace {
+
+class SdPathHdl : public SmartHdl
+{
+public:
+ SdPathHdl( const SmartTagReference& xTag, SdrPathObj* mpPathObj );
+
+ virtual void CreateB2dIAObject() override;
+ virtual bool IsFocusHdl() const override;
+
+private:
+ SdrPathObj* mpPathObj;
+};
+
+}
+
+SdPathHdl::SdPathHdl( const SmartTagReference& xTag, SdrPathObj* pPathObj )
+: SmartHdl( xTag, pPathObj->GetCurrentBoundRect().TopLeft(), SdrHdlKind::SmartTag )
+, mpPathObj( pPathObj )
+{
+}
+
+void SdPathHdl::CreateB2dIAObject()
+{
+ // first throw away old one
+ GetRidOfIAObject();
+
+ if(!pHdlList)
+ return;
+
+ SdrMarkView* pView = pHdlList->GetView();
+
+ if(!pView || pView->areMarkHandlesHidden())
+ return;
+
+ SdrPageView* pPageView = pView->GetSdrPageView();
+
+ if(!pPageView)
+ return;
+
+ for(sal_uInt32 b(0); b < pPageView->PageWindowCount(); b++)
+ {
+ const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
+
+ if(rPageWindow.GetPaintWindow().OutputToWindow())
+ {
+ const rtl::Reference< sdr::overlay::OverlayManager >& xManager = rPageWindow.GetOverlayManager();
+ if (xManager.is() && mpPathObj)
+ {
+ const sdr::contact::ViewContact& rVC = mpPathObj->GetViewContact();
+ drawinglayer::primitive2d::Primitive2DContainer aSequence;
+ rVC.getViewIndependentPrimitive2DContainer(aSequence);
+ std::unique_ptr<sdr::overlay::OverlayObject> pNew(new sdr::overlay::OverlayPrimitive2DSequenceObject(std::move(aSequence)));
+
+ // OVERLAYMANAGER
+ insertNewlyCreatedOverlayObjectForSdrHdl(
+ std::move(pNew),
+ rPageWindow.GetObjectContact(),
+ *xManager);
+ }
+ }
+ }
+}
+
+bool SdPathHdl::IsFocusHdl() const
+{
+ return false;
+}
+
+MotionPathTag::MotionPathTag( CustomAnimationPane& rPane, ::sd::View& rView, const CustomAnimationEffectPtr& pEffect )
+: SmartTag( rView )
+, mrPane( rPane )
+, mpEffect( pEffect )
+, mxOrigin( pEffect->getTargetShape() )
+, msLastPath( pEffect->getPath() )
+, mbInUpdatePath( false )
+{
+ mpPathObj = mpEffect->createSdrPathObjFromPath(rView.getSdrModelFromSdrView());
+ mxPolyPoly = mpPathObj->GetPathPoly();
+ if (mxOrigin.is())
+ maOriginPos = mxOrigin->getPosition();
+
+ XDash aDash( css::drawing::DashStyle_RECT, 1, 80, 1, 80, 80);
+ OUString aEmpty( "?" );
+ mpPathObj->SetMergedItem( XLineDashItem( aEmpty, aDash ) );
+ mpPathObj->SetMergedItem( XLineStyleItem( drawing::LineStyle_DASH ) );
+ mpPathObj->SetMergedItem( XLineColorItem(aEmpty, COL_GRAY) );
+ mpPathObj->SetMergedItem( XFillStyleItem( drawing::FillStyle_NONE ) );
+
+ ::basegfx::B2DPolygon aStartArrow;
+ aStartArrow.append(::basegfx::B2DPoint(20.0, 0.0));
+ aStartArrow.append(::basegfx::B2DPoint(0.0, 0.0));
+ aStartArrow.append(::basegfx::B2DPoint(10.0, 30.0));
+ aStartArrow.setClosed(true);
+ mpPathObj->SetMergedItem(XLineStartItem(aEmpty,::basegfx::B2DPolyPolygon(aStartArrow)));
+ mpPathObj->SetMergedItem(XLineStartWidthItem(400));
+ mpPathObj->SetMergedItem(XLineStartCenterItem(true));
+
+ updatePathAttributes();
+
+ mpPathObj->SetMergedItem(XLineTransparenceItem(50));
+
+ mpMark.reset(new SdrMark( mpPathObj, mrView.GetSdrPageView() ));
+
+ mpPathObj->AddListener( *this );
+
+ Reference< XChangesNotifier > xNotifier( mpEffect->getNode(), UNO_QUERY );
+ if( xNotifier.is() )
+ {
+ xNotifier->addChangesListener( this );
+ }
+}
+
+MotionPathTag::~MotionPathTag()
+{
+ DBG_ASSERT( mpPathObj == nullptr, "sd::MotionPathTag::~MotionPathTag(), dispose me first!" );
+ Dispose();
+}
+
+void MotionPathTag::updatePathAttributes()
+{
+ ::basegfx::B2DPolygon aCandidate;
+ if( mxPolyPoly.count() )
+ {
+ aCandidate = mxPolyPoly.getB2DPolygon(0);
+ ::basegfx::utils::checkClosed( aCandidate );
+ }
+
+ if( !aCandidate.isClosed() )
+ {
+ ::basegfx::B2DPolygon aEndArrow;
+ aEndArrow.append(::basegfx::B2DPoint(10.0, 0.0));
+ aEndArrow.append(::basegfx::B2DPoint(0.0, 30.0));
+ aEndArrow.append(::basegfx::B2DPoint(20.0, 30.0));
+ aEndArrow.setClosed(true);
+ mpPathObj->SetMergedItem(XLineEndItem("?",::basegfx::B2DPolyPolygon(aEndArrow)));
+ mpPathObj->SetMergedItem(XLineEndWidthItem(400));
+ mpPathObj->SetMergedItem(XLineEndCenterItem(true));
+ }
+ else
+ {
+ mpPathObj->SetMergedItem(XLineEndItem());
+ }
+}
+
+void MotionPathTag::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
+{
+ if( !(mpPathObj && !mbInUpdatePath && rHint.GetId() == SfxHintId::ThisIsAnSdrHint && mpEffect) )
+ return;
+
+ if( mxPolyPoly != mpPathObj->GetPathPoly() )
+ {
+ mbInUpdatePath = true;
+ mxPolyPoly = mpPathObj->GetPathPoly();
+ rtl::Reference< MotionPathTag > xTag( this );
+ mrPane.updatePathFromMotionPathTag( xTag );
+ msLastPath = mpEffect->getPath();
+ updatePathAttributes();
+ mbInUpdatePath = false;
+ }
+}
+
+void MotionPathTag::MovePath( int nDX, int nDY )
+{
+ if( mpPathObj )
+ {
+ mpPathObj->Move( Size( nDX, nDY ) );
+ mrView.updateHandles();
+ }
+}
+
+/** returns true if the MotionPathTag handled the event. */
+bool MotionPathTag::MouseButtonDown( const MouseEvent& rMEvt, SmartHdl& rHdl )
+{
+ if( !mpPathObj )
+ return false;
+
+ if( !isSelected() )
+ {
+ SmartTagReference xTag( this );
+ mrView.getSmartTags().select( xTag );
+ selectionChanged();
+ return true;
+ }
+ else
+ {
+ if( rMEvt.IsLeft() && (rMEvt.GetClicks() == 2) )
+ {
+ mrView.GetViewShell()->GetViewFrame()->GetDispatcher()->Execute(SID_BEZIER_EDIT, SfxCallMode::ASYNCHRON);
+ return true;
+ }
+ else if( rMEvt.IsLeft() )
+ {
+ OutputDevice* pOut = mrView.GetViewShell()->GetActiveWindow()->GetOutDev();
+ Point aMDPos( pOut->PixelToLogic( rMEvt.GetPosPixel() ) );
+
+ if( !mrView.IsFrameDragSingles() && mrView.IsInsObjPointMode() && (rHdl.GetObjHdlNum() == SMART_TAG_HDL_NUM) )
+ {
+ // insert a point in edit mode
+ const bool bNewObj = rMEvt.IsMod1();
+
+ mrView.BrkAction();
+
+ Point aPt(aMDPos); // - pMarkedPV->GetOffset());
+
+ if(bNewObj)
+ aPt = mrView.GetSnapPos(aPt,mrView.GetSdrPageView());
+
+ bool bClosed0(mpPathObj->IsClosedObj());
+
+ sal_uInt32 nInsPointNum = mpPathObj->NbcInsPointOld(aPt, bNewObj);
+
+ if(bClosed0 != mpPathObj->IsClosedObj())
+ {
+ // Obj was closed implicit
+ // object changed
+ mpPathObj->SetChanged();
+ mpPathObj->BroadcastObjectChange();
+ }
+
+ if(0xffffffff != nInsPointNum)
+ {
+ mrView.UnmarkAllPoints();
+ mrView.updateHandles();
+
+ bool bRet = mrView.BegDragObj(aMDPos, pOut, mrView.GetHdl(nInsPointNum+1), 0, new PathDragObjOwn( mrView ) );
+
+ if (bRet)
+ {
+ const_cast< SdrDragStat* >( &mrView.GetDragStat() )->SetMinMoved();
+ mrView.MovDragObj(aMDPos);
+ }
+ }
+ return true;
+ }
+ else
+ {
+ SmartHdl* pHdl = &rHdl;
+ if (!mrView.IsPointMarked(*pHdl) || rMEvt.IsShift())
+ {
+ if (!rMEvt.IsShift())
+ {
+ mrView.UnmarkAllPoints();
+ pHdl = dynamic_cast< SmartHdl* >( mrView.PickHandle(aMDPos) );
+ }
+ else
+ {
+ if (mrView.IsPointMarked(*pHdl) )
+ {
+ mrView.UnmarkPoint(*pHdl);
+ pHdl = nullptr;
+ }
+ else
+ {
+ pHdl = dynamic_cast< SmartHdl* >( mrView.PickHandle(aMDPos) );
+ }
+ }
+
+ if (pHdl)
+ mrView.MarkPoint(*pHdl);
+ }
+
+ if( pHdl && !rMEvt.IsRight() )
+ {
+ mrView.BrkAction();
+ const sal_uInt16 nDrgLog = static_cast<sal_uInt16>(pOut->PixelToLogic(Size(DRGPIX,0)).Width());
+
+ rtl::Reference< MotionPathTag > xTag( this );
+ SdrDragMethod* pDragMethod;
+
+ // #i95646# add DragPoly as geometry to each local SdrDragMethod to be able
+ // to create the needed local SdrDragEntry for it in createSdrDragEntries()
+ const basegfx::B2DPolyPolygon aDragPoly(mpPathObj->GetPathPoly());
+
+ if( (pHdl->GetKind() == SdrHdlKind::Move) || (pHdl->GetKind() == SdrHdlKind::SmartTag) )
+ {
+ pDragMethod = new PathDragMove( mrView, xTag, aDragPoly );
+ pHdl->SetPos( aMDPos );
+ }
+ else if( pHdl->GetKind() == SdrHdlKind::Poly )
+ {
+ pDragMethod = new PathDragObjOwn( mrView, aDragPoly );
+ }
+ else
+ {
+ pDragMethod = new PathDragResize( mrView, xTag, aDragPoly );
+ }
+
+ mrView.BegDragObj(aMDPos, nullptr, pHdl, nDrgLog, pDragMethod );
+ }
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+/** returns true if the SmartTag consumes this event. */
+bool MotionPathTag::KeyInput( const KeyEvent& rKEvt )
+{
+ if( !mpPathObj )
+ return false;
+
+ sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
+ switch( nCode )
+ {
+ case KEY_DELETE:
+ return OnDelete();
+
+ case KEY_DOWN:
+ case KEY_UP:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ return OnMove( rKEvt );
+
+ case KEY_ESCAPE:
+ {
+ SmartTagReference xThis( this );
+ mrView.getSmartTags().deselect();
+ return true;
+ }
+
+ case KEY_TAB:
+ return OnTabHandles( rKEvt );
+
+ case KEY_SPACE:
+ return OnMarkHandle( rKEvt );
+
+ default:
+ break;
+ }
+ return false;
+}
+
+bool MotionPathTag::OnDelete()
+{
+ mrPane.remove( mpEffect );
+ return true;
+}
+
+bool MotionPathTag::OnTabHandles( const KeyEvent& rKEvt )
+{
+ if(rKEvt.GetKeyCode().IsMod1() || rKEvt.GetKeyCode().IsMod2())
+ {
+ const SdrHdlList& rHdlList = mrView.GetHdlList();
+ bool bForward(!rKEvt.GetKeyCode().IsShift());
+
+ const_cast<SdrHdlList&>(rHdlList).TravelFocusHdl(bForward);
+
+ // guarantee visibility of focused handle
+ SdrHdl* pHdl = rHdlList.GetFocusHdl();
+
+ if(pHdl)
+ {
+ Window* pWindow = mrView.GetViewShell()->GetActiveWindow();
+ if( pWindow )
+ {
+ Point aHdlPosition(pHdl->GetPos());
+ ::tools::Rectangle aVisRect(aHdlPosition - Point(100, 100), Size(200, 200));
+ mrView.MakeVisible(aVisRect, *pWindow);
+ }
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+bool MotionPathTag::OnMarkHandle( const KeyEvent& rKEvt )
+{
+ const SdrHdlList& rHdlList = mrView.GetHdlList();
+ SdrHdl* pHdl = rHdlList.GetFocusHdl();
+
+ if(pHdl && pHdl->GetKind() == SdrHdlKind::Poly )
+ {
+ // rescue ID of point with focus
+ sal_uInt32 nPol(pHdl->GetPolyNum());
+ sal_uInt32 nPnt(pHdl->GetPointNum());
+
+ if(mrView.IsPointMarked(*pHdl))
+ {
+ if(rKEvt.GetKeyCode().IsShift())
+ {
+ mrView.UnmarkPoint(*pHdl);
+ }
+ }
+ else
+ {
+ if(!rKEvt.GetKeyCode().IsShift())
+ {
+ mrView.UnmarkAllPoints();
+ }
+ mrView.MarkPoint(*pHdl);
+ }
+
+ if(nullptr == rHdlList.GetFocusHdl())
+ {
+ // restore point with focus
+ SdrHdl* pNewOne = nullptr;
+
+ for(size_t a = 0; !pNewOne && a < rHdlList.GetHdlCount(); ++a)
+ {
+ SdrHdl* pAct = rHdlList.GetHdl(a);
+
+ if(pAct && pAct->GetKind() == SdrHdlKind::Poly && pAct->GetPolyNum() == nPol && pAct->GetPointNum() == nPnt)
+ pNewOne = pAct;
+ }
+
+ if(pNewOne)
+ const_cast<SdrHdlList&>(rHdlList).SetFocusHdl(pNewOne);
+ }
+ }
+
+ return true;
+}
+
+bool MotionPathTag::OnMove( const KeyEvent& rKEvt )
+{
+ ::tools::Long nX = 0;
+ ::tools::Long nY = 0;
+
+ switch( rKEvt.GetKeyCode().GetCode() )
+ {
+ case KEY_UP: nY = -1; break;
+ case KEY_DOWN: nY = 1; break;
+ case KEY_LEFT: nX = -1; break;
+ case KEY_RIGHT: nX = 1; break;
+ default: break;
+ }
+
+ if(rKEvt.GetKeyCode().IsMod2())
+ {
+ OutputDevice* pOut = mrView.GetViewShell()->GetActiveWindow()->GetOutDev();
+ Size aLogicSizeOnePixel = pOut ? pOut->PixelToLogic(Size(1,1)) : Size(100, 100);
+ nX *= aLogicSizeOnePixel.Width();
+ nY *= aLogicSizeOnePixel.Height();
+ }
+ else
+ {
+ // old, fixed move distance
+ nX *= 100;
+ nY *= 100;
+ }
+
+ if( nX || nY )
+ {
+ // in point edit mode move the handle with the focus
+ const SdrHdlList& rHdlList = mrView.GetHdlList();
+ SdrHdl* pHdl = rHdlList.GetFocusHdl();
+
+ if(pHdl)
+ {
+ // now move the Handle (nX, nY)
+ Point aStartPoint(pHdl->GetPos());
+ Point aEndPoint(pHdl->GetPos() + Point(nX, nY));
+
+ // start dragging
+ rtl::Reference< MotionPathTag > xTag( this );
+ SdrDragMethod* pDragMethod = nullptr;
+ if( (pHdl->GetKind() == SdrHdlKind::Move) || (pHdl->GetKind() == SdrHdlKind::SmartTag) )
+ {
+ pDragMethod = new PathDragMove( mrView, xTag );
+ }
+ else if( pHdl->GetKind() == SdrHdlKind::Poly )
+ {
+ pDragMethod = new PathDragObjOwn( mrView );
+ }
+ else if( pHdl->GetKind() != SdrHdlKind::BezierWeight )
+ {
+ pDragMethod = new PathDragResize( mrView, xTag );
+ }
+ mrView.BegDragObj(aStartPoint, nullptr, pHdl, 0, pDragMethod);
+
+ if(mrView.IsDragObj())
+ {
+ bool bWasNoSnap = mrView.GetDragStat().IsNoSnap();
+ bool bWasSnapEnabled = mrView.IsSnapEnabled();
+
+ // switch snapping off
+ if(!bWasNoSnap)
+ const_cast<SdrDragStat&>(mrView.GetDragStat()).SetNoSnap();
+ if(bWasSnapEnabled)
+ mrView.SetSnapEnabled(false);
+
+ mrView.MovAction(aEndPoint);
+ mrView.EndDragObj();
+
+ // restore snap
+ if(!bWasNoSnap)
+ const_cast<SdrDragStat&>(mrView.GetDragStat()).SetNoSnap(bWasNoSnap);
+ if(bWasSnapEnabled)
+ mrView.SetSnapEnabled(bWasSnapEnabled);
+ }
+ }
+ else
+ {
+ // move the path
+ MovePath( nX, nY );
+ }
+ }
+
+ return true;
+}
+
+sal_Int32 MotionPathTag::GetMarkablePointCount() const
+{
+ if( mpPathObj && isSelected() )
+ {
+ return mpPathObj->GetPointCount();
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+sal_Int32 MotionPathTag::GetMarkedPointCount() const
+{
+ if( mpMark )
+ {
+ const SdrUShortCont& rPts = mpMark->GetMarkedPoints();
+ return rPts.size();
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+bool MotionPathTag::MarkPoint(SdrHdl& rHdl, bool bUnmark )
+{
+ bool bRet=false;
+ if( mpPathObj && mrView.IsPointMarkable( rHdl ) && (rHdl.GetKind() != SdrHdlKind::SmartTag) )
+ {
+ SmartHdl* pSmartHdl = dynamic_cast< SmartHdl* >( &rHdl );
+ if( pSmartHdl && pSmartHdl->getTag().get() == this )
+ {
+ if (mrView.MarkPointHelper(&rHdl,mpMark.get(),bUnmark))
+ {
+ mrView.MarkListHasChanged();
+ bRet=true;
+ }
+ }
+ }
+ return bRet;
+}
+
+bool MotionPathTag::MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark )
+{
+ bool bChgd=false;
+
+ if( mpPathObj && isSelected() )
+ {
+ size_t nHdlNum = mrView.GetHdlList().GetHdlCount();
+ if ( nHdlNum <= 1 )
+ return false;
+
+ while( --nHdlNum > 0 )
+ {
+ SmartHdl* pHdl = dynamic_cast< SmartHdl* >( mrView.GetHdl( nHdlNum ) );
+
+ if( pHdl && (pHdl->getTag().get() == this) && mrView.IsPointMarkable(*pHdl) && pHdl->IsSelected() == bUnmark)
+ {
+ Point aPos(pHdl->GetPos());
+ if( pRect==nullptr || pRect->Contains(aPos))
+ {
+ if( mrView.MarkPointHelper(pHdl,mpMark.get(),bUnmark) )
+ bChgd=true;
+ }
+ }
+ }
+
+ if(bChgd)
+ mrView.MarkListHasChanged();
+ }
+
+ return bChgd;
+}
+
+bool MotionPathTag::getContext( SdrViewContext& rContext )
+{
+ if( mpPathObj && isSelected() && !mrView.IsFrameDragSingles() )
+ {
+ rContext = SdrViewContext::PointEdit;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+void MotionPathTag::CheckPossibilities()
+{
+ if( !(mpPathObj && isSelected()) )
+ return;
+
+ mrView.SetMoveAllowed( true );
+ mrView.SetMoveProtected( false );
+ mrView.SetResizeFreeAllowed( true );
+ mrView.SetResizePropAllowed( true );
+ mrView.SetResizeProtected( false );
+
+ if( !mrView.IsFrameDragSingles() )
+ {
+ bool b1stSmooth(true);
+ bool b1stSegm(true);
+ bool bCurve(false);
+ bool bSmoothFuz(false);
+ bool bSegmFuz(false);
+ basegfx::B2VectorContinuity eSmooth = basegfx::B2VectorContinuity::NONE;
+
+ mrView.CheckPolyPossibilitiesHelper( mpMark.get(), b1stSmooth, b1stSegm, bCurve, bSmoothFuz, bSegmFuz, eSmooth );
+ }
+}
+
+void MotionPathTag::addCustomHandles( SdrHdlList& rHandlerList )
+{
+ if( !mpPathObj )
+ return;
+
+ css::awt::Point aPos;
+ if (mxOrigin.is())
+ aPos = mxOrigin->getPosition();
+ if( (aPos.X != maOriginPos.X) || (aPos.Y != maOriginPos.Y) )
+ {
+ const basegfx::B2DHomMatrix aTransform(basegfx::utils::createTranslateB2DHomMatrix(
+ aPos.X - maOriginPos.X, aPos.Y - maOriginPos.Y));
+ mxPolyPoly.transform( aTransform );
+ mpPathObj->SetPathPoly( mxPolyPoly );
+ maOriginPos = aPos;
+ }
+
+ SmartTagReference xThis( this );
+ std::unique_ptr<SdPathHdl> pHdl(new SdPathHdl( xThis, mpPathObj ));
+ pHdl->SetObjHdlNum( SMART_TAG_HDL_NUM );
+ pHdl->SetPageView( mrView.GetSdrPageView() );
+ pHdl->SetObj(mpPathObj);
+ rHandlerList.AddHdl( std::move(pHdl) );
+
+ if( !isSelected() )
+ return;
+
+ mrView.GetSdrPageView()->SetHasMarkedObj(true);
+
+ if( !mrView.IsFrameDragSingles() )
+ {
+ SdrHdlList aTemp( rHandlerList.GetView() );
+ mpPathObj->AddToHdlList( aTemp );
+ const SdrUShortCont& rMrkPnts = mpMark->GetMarkedPoints();
+
+ for( size_t nHandle = 0; nHandle < aTemp.GetHdlCount(); ++nHandle )
+ {
+ SdrHdl* pTempHdl = aTemp.GetHdl( nHandle );
+
+ SmartHdl* pSmartHdl = new SmartHdl( xThis, mpPathObj, pTempHdl->GetPos(), pTempHdl->GetKind() );
+ pSmartHdl->SetObjHdlNum( static_cast<sal_uInt32>(nHandle) );
+ pSmartHdl->SetPolyNum( pTempHdl->GetPolyNum() );
+ pSmartHdl->SetPointNum( pTempHdl->GetPointNum() );
+ pSmartHdl->SetPlusHdl( pTempHdl->IsPlusHdl() );
+ pSmartHdl->SetSourceHdlNum( pTempHdl->GetSourceHdlNum() );
+ pSmartHdl->SetPageView( mrView.GetSdrPageView() );
+
+ rHandlerList.AddHdl( std::unique_ptr<SmartHdl>(pSmartHdl) );
+
+ const bool bSelected = rMrkPnts.find( sal_uInt16(nHandle) ) != rMrkPnts.end();
+ pSmartHdl->SetSelected(bSelected);
+
+ if( mrView.IsPlusHandlesAlwaysVisible() || bSelected )
+ {
+ SdrHdlList plusList(nullptr);
+ mpPathObj->AddToPlusHdlList(plusList, *pSmartHdl);
+ sal_uInt32 nPlusHdlCnt=plusList.GetHdlCount();
+ for (sal_uInt32 nPlusNum=0; nPlusNum<nPlusHdlCnt; nPlusNum++)
+ {
+ SdrHdl* pPlusHdl = plusList.GetHdl(nPlusNum);
+ pPlusHdl->SetObj(mpPathObj);
+ pPlusHdl->SetPageView(mrView.GetSdrPageView());
+ pPlusHdl->SetPlusHdl(true);
+ }
+ plusList.MoveTo(rHandlerList);
+ }
+ }
+ }
+ else
+ {
+ ::tools::Rectangle aRect(mpPathObj->GetCurrentBoundRect());
+
+ if(!aRect.IsEmpty())
+ {
+ size_t nCount = rHandlerList.GetHdlCount();
+
+ bool bWdt0=aRect.Left()==aRect.Right();
+ bool bHgt0=aRect.Top()==aRect.Bottom();
+ if (bWdt0 && bHgt0)
+ {
+ rHandlerList.AddHdl(std::make_unique<SmartHdl>( xThis, mpPathObj, aRect.TopLeft(),SdrHdlKind::UpperLeft));
+ }
+ else if (bWdt0 || bHgt0)
+ {
+ rHandlerList.AddHdl(std::make_unique<SmartHdl>( xThis, mpPathObj, aRect.TopLeft() ,SdrHdlKind::UpperLeft));
+ rHandlerList.AddHdl(std::make_unique<SmartHdl>( xThis, mpPathObj, aRect.BottomRight(),SdrHdlKind::LowerRight));
+ }
+ else // !bWdt0 && !bHgt0
+ {
+ rHandlerList.AddHdl(std::make_unique<SmartHdl>( xThis, mpPathObj, aRect.TopLeft() ,SdrHdlKind::UpperLeft));
+ rHandlerList.AddHdl(std::make_unique<SmartHdl>( xThis, mpPathObj, aRect.TopCenter() ,SdrHdlKind::Upper));
+ rHandlerList.AddHdl(std::make_unique<SmartHdl>( xThis, mpPathObj, aRect.TopRight() ,SdrHdlKind::UpperRight));
+ rHandlerList.AddHdl(std::make_unique<SmartHdl>( xThis, mpPathObj, aRect.LeftCenter() ,SdrHdlKind::Left ));
+ rHandlerList.AddHdl(std::make_unique<SmartHdl>( xThis, mpPathObj, aRect.RightCenter() ,SdrHdlKind::Right));
+ rHandlerList.AddHdl(std::make_unique<SmartHdl>( xThis, mpPathObj, aRect.BottomLeft() ,SdrHdlKind::LowerLeft));
+ rHandlerList.AddHdl(std::make_unique<SmartHdl>( xThis, mpPathObj, aRect.BottomCenter(),SdrHdlKind::Lower));
+ rHandlerList.AddHdl(std::make_unique<SmartHdl>( xThis, mpPathObj, aRect.BottomRight() ,SdrHdlKind::LowerRight));
+ }
+
+ while( nCount < rHandlerList.GetHdlCount() )
+ {
+ rHandlerList.GetHdl(nCount++)->SetPageView( mrView.GetSdrPageView() );
+ }
+ }
+ }
+}
+
+void MotionPathTag::disposing()
+{
+ Reference< XChangesNotifier > xNotifier( mpEffect->getNode(), UNO_QUERY );
+ if( xNotifier.is() )
+ {
+ xNotifier->removeChangesListener( this );
+ }
+
+ if( mpPathObj )
+ {
+ SdrObject* pTemp(mpPathObj);
+ mpPathObj = nullptr;
+ mrView.updateHandles();
+
+ // always use SdrObject::Free(...) for SdrObjects (!)
+ SdrObject::Free(pTemp);
+ }
+
+ mpMark.reset();
+
+ SmartTag::disposing();
+}
+
+void MotionPathTag::deselect()
+{
+ SmartTag::deselect();
+
+ if( mpMark )
+ {
+ SdrUShortCont& rPts = mpMark->GetMarkedPoints();
+ rPts.clear();
+ }
+
+ selectionChanged();
+}
+
+void MotionPathTag::selectionChanged()
+{
+ if( mrView.GetViewShell() && mrView.GetViewShell()->GetViewFrame() )
+ {
+ SfxBindings& rBindings = mrView.GetViewShell()->GetViewFrame()->GetBindings();
+ rBindings.InvalidateAll(true);
+ }
+}
+
+// IPolyPolygonEditorController
+
+void MotionPathTag::DeleteMarkedPoints()
+{
+ if( !(mpPathObj && IsDeleteMarkedPointsPossible()) )
+ return;
+
+ mrView.BrkAction();
+
+ SdrUShortCont& rPts = mpMark->GetMarkedPoints();
+ PolyPolygonEditor aEditor( mpPathObj->GetPathPoly());
+ if (aEditor.DeletePoints(rPts))
+ {
+ if( aEditor.GetPolyPolygon().count() )
+ {
+ mpPathObj->SetPathPoly( aEditor.GetPolyPolygon() );
+ }
+
+ mrView.UnmarkAllPoints();
+ mrView.MarkListHasChanged();
+ mrView.updateHandles();
+ }
+}
+
+bool MotionPathTag::IsDeleteMarkedPointsPossible() const
+{
+ return mpPathObj && isSelected() && (GetMarkedPointCount() != 0);
+}
+
+void MotionPathTag::RipUpAtMarkedPoints()
+{
+ // not supported for motion path
+}
+
+bool MotionPathTag::IsRipUpAtMarkedPointsPossible() const
+{
+ // not supported for motion path
+ return false;
+}
+
+bool MotionPathTag::IsSetMarkedSegmentsKindPossible() const
+{
+ if( mpPathObj )
+ return mrView.IsSetMarkedSegmentsKindPossible();
+ else
+ return false;
+}
+
+SdrPathSegmentKind MotionPathTag::GetMarkedSegmentsKind() const
+{
+ if( mpPathObj )
+ return mrView.GetMarkedSegmentsKind();
+ else
+ return SdrPathSegmentKind::Line;
+}
+
+void MotionPathTag::SetMarkedSegmentsKind(SdrPathSegmentKind eKind)
+{
+ if(mpPathObj && isSelected() && (GetMarkedPointCount() != 0))
+ {
+ SdrUShortCont& rPts = mpMark->GetMarkedPoints();
+ PolyPolygonEditor aEditor( mpPathObj->GetPathPoly() );
+ if (aEditor.SetSegmentsKind(eKind, rPts))
+ {
+ mpPathObj->SetPathPoly(aEditor.GetPolyPolygon());
+ mrView.MarkListHasChanged();
+ mrView.updateHandles();
+ }
+ }
+}
+
+bool MotionPathTag::IsSetMarkedPointsSmoothPossible() const
+{
+ if( mpPathObj )
+ return mrView.IsSetMarkedPointsSmoothPossible();
+ else
+ return false;
+}
+
+SdrPathSmoothKind MotionPathTag::GetMarkedPointsSmooth() const
+{
+ if( mpPathObj )
+ return mrView.GetMarkedPointsSmooth();
+ else
+ return SdrPathSmoothKind::Angular;
+}
+
+void MotionPathTag::SetMarkedPointsSmooth(SdrPathSmoothKind eKind)
+{
+ basegfx::B2VectorContinuity eFlags;
+
+ if(SdrPathSmoothKind::Angular == eKind)
+ {
+ eFlags = basegfx::B2VectorContinuity::NONE;
+ }
+ else if(SdrPathSmoothKind::Asymmetric == eKind)
+ {
+ eFlags = basegfx::B2VectorContinuity::C1;
+ }
+ else if(SdrPathSmoothKind::Symmetric == eKind)
+ {
+ eFlags = basegfx::B2VectorContinuity::C2;
+ }
+ else
+ {
+ return;
+ }
+
+ if(mpPathObj && mpMark && isSelected() && (GetMarkedPointCount() != 0))
+ {
+ SdrUShortCont& rPts = mpMark->GetMarkedPoints();
+ PolyPolygonEditor aEditor( mpPathObj->GetPathPoly());
+ if (aEditor.SetPointsSmooth(eFlags, rPts))
+ {
+ mpPathObj->SetPathPoly(aEditor.GetPolyPolygon());
+ mrView.MarkListHasChanged();
+ mrView.updateHandles();
+ }
+ }
+}
+
+bool MotionPathTag::IsOpenCloseMarkedObjectsPossible() const
+{
+ // not supported for motion path
+ return false;
+}
+
+SdrObjClosedKind MotionPathTag::GetMarkedObjectsClosedState() const
+{
+ // not supported for motion path
+ return SdrObjClosedKind::Open;
+}
+
+// XChangesListener
+void SAL_CALL MotionPathTag::changesOccurred( const ChangesEvent& /*Event*/ )
+{
+ if( mpPathObj && !mbInUpdatePath && (mpEffect->getPath() != msLastPath) )
+ {
+ mbInUpdatePath =true;
+ msLastPath = mpEffect->getPath();
+ mpEffect->updateSdrPathObjFromPath( *mpPathObj );
+ mbInUpdatePath = false;
+ updatePathAttributes();
+ mrView.updateHandles();
+ }
+}
+
+void SAL_CALL MotionPathTag::disposing( const EventObject& /*Source*/ )
+{
+ if( mpPathObj )
+ Dispose();
+}
+
+Any SAL_CALL MotionPathTag::queryInterface( const css::uno::Type& aType )
+{
+ if( aType == cppu::UnoType<XChangesListener>::get() )
+ return Any( Reference< XChangesListener >( this ) );
+ if( aType == cppu::UnoType<XEventListener>::get() )
+ return Any( Reference< XEventListener >( this ) );
+ if( aType == cppu::UnoType<XInterface>::get() )
+ return Any( Reference< XInterface >( this ) );
+
+ return Any();
+}
+
+void SAL_CALL MotionPathTag::acquire() noexcept
+{
+ SimpleReferenceComponent::acquire();
+}
+
+void SAL_CALL MotionPathTag::release( ) noexcept
+{
+ SimpleReferenceComponent::release();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/animations/motionpathtag.hxx b/sd/source/ui/animations/motionpathtag.hxx
new file mode 100644
index 000000000..715ce4268
--- /dev/null
+++ b/sd/source/ui/animations/motionpathtag.hxx
@@ -0,0 +1,114 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/util/XChangesListener.hpp>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <smarttag.hxx>
+#include <CustomAnimationList.hxx>
+
+namespace com::sun::star::drawing { class XShape; }
+class SdrPathObj;
+
+namespace sd {
+
+class View;
+class CustomAnimationPane;
+
+/// Base class for all functions.
+class MotionPathTag final : public SmartTag, public IPolyPolygonEditorController, public SfxListener, public css::util::XChangesListener
+{
+public:
+ MotionPathTag( CustomAnimationPane& rPane, ::sd::View& rView, const CustomAnimationEffectPtr& pEffect );
+ virtual ~MotionPathTag() override;
+
+ SdrPathObj* getPathObj() const { return mpPathObj; }
+
+ /// @return true if the SmartTag handled the event.
+ virtual bool MouseButtonDown( const MouseEvent&, SmartHdl& ) override;
+
+ /// @return true if the SmartTag consumes this event.
+ virtual bool KeyInput( const KeyEvent& rKEvt ) override;
+
+ // callbacks from sdr view
+ virtual sal_Int32 GetMarkablePointCount() const override;
+ virtual sal_Int32 GetMarkedPointCount() const override;
+ virtual bool MarkPoint(SdrHdl& rHdl, bool bUnmark) override;
+ virtual void CheckPossibilities() override;
+ virtual bool MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark) override;
+
+ const CustomAnimationEffectPtr& getEffect() const { return mpEffect; }
+
+ virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
+
+ // IPolyPolygonEditorController
+ virtual void DeleteMarkedPoints() override;
+ virtual bool IsDeleteMarkedPointsPossible() const override;
+
+ virtual void RipUpAtMarkedPoints() override;
+ virtual bool IsRipUpAtMarkedPointsPossible() const override;
+
+ virtual bool IsSetMarkedSegmentsKindPossible() const override;
+ virtual SdrPathSegmentKind GetMarkedSegmentsKind() const override;
+ virtual void SetMarkedSegmentsKind(SdrPathSegmentKind eKind) override;
+
+ virtual bool IsSetMarkedPointsSmoothPossible() const override;
+ virtual SdrPathSmoothKind GetMarkedPointsSmooth() const override;
+ virtual void SetMarkedPointsSmooth(SdrPathSmoothKind eKind) override;
+
+ virtual bool IsOpenCloseMarkedObjectsPossible() const override;
+ virtual SdrObjClosedKind GetMarkedObjectsClosedState() const override;
+
+ void MovePath( int nDX, int nDY );
+ bool OnDelete();
+ bool OnTabHandles( const KeyEvent& rKEvt );
+ bool OnMarkHandle( const KeyEvent& rKEvt );
+ bool OnMove( const KeyEvent& rKEvt );
+
+ // XChangesListener
+ virtual void SAL_CALL changesOccurred( const css::util::ChangesEvent& Event ) override;
+ virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
+ virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) override;
+ virtual void SAL_CALL acquire( ) noexcept override;
+ virtual void SAL_CALL release( ) noexcept override;
+
+private:
+ virtual void addCustomHandles( SdrHdlList& rHandlerList ) override;
+ virtual bool getContext( SdrViewContext& rContext ) override;
+ virtual void disposing() override;
+ virtual void deselect() override;
+
+ void updatePathAttributes();
+ void selectionChanged();
+
+ CustomAnimationPane& mrPane;
+ CustomAnimationEffectPtr mpEffect;
+ ::basegfx::B2DPolyPolygon mxPolyPoly;
+ css::uno::Reference< css::drawing::XShape > mxOrigin;
+ SdrPathObj* mpPathObj;
+ css::awt::Point maOriginPos;
+ std::unique_ptr<SdrMark> mpMark;
+ OUString msLastPath;
+ bool mbInUpdatePath;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/annotations/annotationmanager.cxx b/sd/source/ui/annotations/annotationmanager.cxx
new file mode 100644
index 000000000..ab9fe0c1a
--- /dev/null
+++ b/sd/source/ui/annotations/annotationmanager.cxx
@@ -0,0 +1,1220 @@
+/* -*- 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 <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/geometry/RealPoint2D.hpp>
+#include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/document/XEventBroadcaster.hpp>
+#include <com/sun/star/office/XAnnotationAccess.hpp>
+#include <comphelper/lok.hxx>
+#include <svx/svxids.hrc>
+
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+
+#include <sal/macros.h>
+#include <svl/itempool.hxx>
+#include <svl/intitem.hxx>
+#include <unotools/localedatawrapper.hxx>
+#include <unotools/useroptions.hxx>
+#include <unotools/syslocale.hxx>
+#include <unotools/saveopt.hxx>
+
+#include <tools/datetime.hxx>
+#include <tools/UnitConversion.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/dispatch.hxx>
+
+#include <editeng/editeng.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/fontitem.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/postitem.hxx>
+
+#include <svx/postattr.hxx>
+
+#include <annotationmanager.hxx>
+#include "annotationmanagerimpl.hxx"
+#include "annotationwindow.hxx"
+#include <strings.hrc>
+
+#include <Annotation.hxx>
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <sdresid.hxx>
+#include <EventMultiplexer.hxx>
+#include <ViewShellBase.hxx>
+#include <sdpage.hxx>
+#include <drawdoc.hxx>
+#include <textapi.hxx>
+#include <optsitem.hxx>
+#include <sdmod.hxx>
+
+#include <memory>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::document;
+using namespace ::com::sun::star::geometry;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::text;
+using namespace ::com::sun::star::view;
+using namespace ::com::sun::star::style;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::ui;
+using namespace ::com::sun::star::task;
+using namespace ::com::sun::star::office;
+
+namespace sd {
+
+SfxItemPool* GetAnnotationPool()
+{
+ static rtl::Reference<SfxItemPool> s_pAnnotationPool;
+ if( !s_pAnnotationPool )
+ {
+ s_pAnnotationPool = EditEngine::CreatePool();
+ s_pAnnotationPool->SetPoolDefaultItem(SvxFontHeightItem(423,100,EE_CHAR_FONTHEIGHT));
+
+ vcl::Font aAppFont( Application::GetSettings().GetStyleSettings().GetAppFont() );
+ s_pAnnotationPool->SetPoolDefaultItem(SvxFontItem(aAppFont.GetFamilyType(),aAppFont.GetFamilyName(),"",PITCH_DONTKNOW,RTL_TEXTENCODING_DONTKNOW,EE_CHAR_FONTINFO));
+ }
+
+ return s_pAnnotationPool.get();
+}
+
+static SfxBindings* getBindings( ViewShellBase const & rBase )
+{
+ if( rBase.GetMainViewShell() && rBase.GetMainViewShell()->GetViewFrame() )
+ return &rBase.GetMainViewShell()->GetViewFrame()->GetBindings();
+
+ return nullptr;
+}
+
+static SfxDispatcher* getDispatcher( ViewShellBase const & rBase )
+{
+ if( rBase.GetMainViewShell() && rBase.GetMainViewShell()->GetViewFrame() )
+ return rBase.GetMainViewShell()->GetViewFrame()->GetDispatcher();
+
+ return nullptr;
+}
+
+css::util::DateTime getCurrentDateTime()
+{
+ DateTime aCurrentDate( DateTime::SYSTEM );
+ return css::util::DateTime( 0, aCurrentDate.GetSec(),
+ aCurrentDate.GetMin(), aCurrentDate.GetHour(),
+ aCurrentDate.GetDay(), aCurrentDate.GetMonth(),
+ aCurrentDate.GetYear(), false );
+}
+
+OUString getAnnotationDateTimeString( const Reference< XAnnotation >& xAnnotation )
+{
+ OUString sRet;
+ if( xAnnotation.is() )
+ {
+ const SvtSysLocale aSysLocale;
+ const LocaleDataWrapper& rLocalData = aSysLocale.GetLocaleData();
+
+ css::util::DateTime aDateTime( xAnnotation->getDateTime() );
+
+ Date aSysDate( Date::SYSTEM );
+ Date aDate( aDateTime.Day, aDateTime.Month, aDateTime.Year );
+ if (aDate==aSysDate)
+ sRet = SdResId(STR_ANNOTATION_TODAY);
+ else if (aDate == (aSysDate-1))
+ sRet = SdResId(STR_ANNOTATION_YESTERDAY);
+ else if (aDate.IsValidAndGregorian() )
+ sRet = rLocalData.getDate(aDate);
+
+ ::tools::Time aTime( aDateTime );
+ if(aTime.GetTime() != 0)
+ sRet += " " + rLocalData.getTime( aTime,false );
+ }
+ return sRet;
+}
+
+AnnotationManagerImpl::AnnotationManagerImpl( ViewShellBase& rViewShellBase )
+: mrBase( rViewShellBase )
+, mpDoc( rViewShellBase.GetDocument() )
+, mbShowAnnotations( true )
+, mnUpdateTagsEvent( nullptr )
+{
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(mpDoc->GetDocumentType());
+ if( pOptions )
+ mbShowAnnotations = pOptions->IsShowComments();
+}
+
+void AnnotationManagerImpl::init()
+{
+ // get current controller and initialize listeners
+ try
+ {
+ addListener();
+ mxView.set(mrBase.GetController(), UNO_QUERY);
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::AnnotationManagerImpl::AnnotationManagerImpl()" );
+ }
+
+ try
+ {
+ Reference<XEventBroadcaster> xModel (mrBase.GetDocShell()->GetModel(), UNO_QUERY_THROW );
+ Reference<XEventListener> xListener( this );
+ xModel->addEventListener( xListener );
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+// WeakComponentImplHelper
+void AnnotationManagerImpl::disposing (std::unique_lock<std::mutex>&)
+{
+ try
+ {
+ Reference<XEventBroadcaster> xModel (mrBase.GetDocShell()->GetModel(), UNO_QUERY_THROW );
+ Reference<XEventListener> xListener( this );
+ xModel->removeEventListener( xListener );
+ }
+ catch( Exception& )
+ {
+ }
+
+ removeListener();
+ DisposeTags();
+
+ if( mnUpdateTagsEvent )
+ {
+ Application::RemoveUserEvent( mnUpdateTagsEvent );
+ mnUpdateTagsEvent = nullptr;
+ }
+
+ mxView.clear();
+ mxCurrentPage.clear();
+}
+
+// XEventListener
+void SAL_CALL AnnotationManagerImpl::notifyEvent( const css::document::EventObject& aEvent )
+{
+ if( !(aEvent.EventName == "OnAnnotationInserted" || aEvent.EventName == "OnAnnotationRemoved" || aEvent.EventName == "OnAnnotationChanged") )
+ return;
+
+ // AnnotationInsertion and modification is not handled here because when
+ // a new annotation is inserted, it consists of OnAnnotationInserted
+ // followed by a chain of OnAnnotationChanged (called for setting each
+ // of the annotation attributes - author, text etc.). This is not what a
+ // LOK client wants. So only handle removal here as annotation removal
+ // consists of only one event - 'OnAnnotationRemoved'
+ if ( aEvent.EventName == "OnAnnotationRemoved" )
+ {
+ Reference< XAnnotation > xAnnotation( aEvent.Source, uno::UNO_QUERY );
+ if ( xAnnotation.is() )
+ {
+ LOKCommentNotify(CommentNotificationType::Remove, &mrBase, xAnnotation);
+ }
+ }
+
+ UpdateTags();
+}
+
+void SAL_CALL AnnotationManagerImpl::disposing( const css::lang::EventObject& /*Source*/ )
+{
+}
+
+Reference<XAnnotation> AnnotationManagerImpl::GetAnnotationById(sal_uInt32 nAnnotationId)
+{
+ SdPage* pPage = nullptr;
+ do
+ {
+ pPage = GetNextPage(pPage, true);
+ if( pPage && !pPage->getAnnotations().empty() )
+ {
+ AnnotationVector aAnnotations(pPage->getAnnotations());
+ auto iter = std::find_if(aAnnotations.begin(), aAnnotations.end(),
+ [nAnnotationId](const Reference<XAnnotation>& xAnnotation) {
+ return sd::getAnnotationId(xAnnotation) == nAnnotationId;
+ });
+ if (iter != aAnnotations.end())
+ return *iter;
+ }
+ } while( pPage );
+
+ Reference<XAnnotation> xAnnotationEmpty;
+ return xAnnotationEmpty;
+}
+
+void AnnotationManagerImpl::ShowAnnotations( bool bShow )
+{
+ // enforce show annotations if a new annotation is inserted
+ if( mbShowAnnotations != bShow )
+ {
+ mbShowAnnotations = bShow;
+
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(mpDoc->GetDocumentType());
+ if( pOptions )
+ pOptions->SetShowComments( mbShowAnnotations );
+
+ UpdateTags();
+ }
+}
+
+void AnnotationManagerImpl::ExecuteAnnotation(SfxRequest const & rReq )
+{
+ switch( rReq.GetSlot() )
+ {
+ case SID_INSERT_POSTIT:
+ ExecuteInsertAnnotation( rReq );
+ break;
+ case SID_DELETE_POSTIT:
+ case SID_DELETEALL_POSTIT:
+ case SID_DELETEALLBYAUTHOR_POSTIT:
+ ExecuteDeleteAnnotation( rReq );
+ break;
+ case SID_EDIT_POSTIT:
+ ExecuteEditAnnotation( rReq );
+ break;
+ case SID_PREVIOUS_POSTIT:
+ case SID_NEXT_POSTIT:
+ SelectNextAnnotation( rReq.GetSlot() == SID_NEXT_POSTIT );
+ break;
+ case SID_REPLYTO_POSTIT:
+ ExecuteReplyToAnnotation( rReq );
+ break;
+ case SID_TOGGLE_NOTES:
+ ShowAnnotations( !mbShowAnnotations );
+ break;
+ }
+}
+
+void AnnotationManagerImpl::ExecuteInsertAnnotation(SfxRequest const & rReq)
+{
+ if (!comphelper::LibreOfficeKit::isActive() || comphelper::LibreOfficeKit::isTiledAnnotations())
+ ShowAnnotations(true);
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ OUString sText;
+ if (pArgs)
+ {
+ if (const SfxStringItem* pPoolItem = pArgs->GetItemIfSet(SID_ATTR_POSTIT_TEXT))
+ {
+ sText = pPoolItem->GetValue();
+ }
+ }
+
+ InsertAnnotation(sText);
+}
+
+void AnnotationManagerImpl::ExecuteDeleteAnnotation(SfxRequest const & rReq)
+{
+ ShowAnnotations( true );
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ switch( rReq.GetSlot() )
+ {
+ case SID_DELETEALL_POSTIT:
+ DeleteAllAnnotations();
+ break;
+ case SID_DELETEALLBYAUTHOR_POSTIT:
+ if( pArgs )
+ {
+ const SfxPoolItem* pPoolItem = nullptr;
+ if( SfxItemState::SET == pArgs->GetItemState( SID_DELETEALLBYAUTHOR_POSTIT, true, &pPoolItem ) )
+ {
+ OUString sAuthor( static_cast<const SfxStringItem*>( pPoolItem )->GetValue() );
+ DeleteAnnotationsByAuthor( sAuthor );
+ }
+ }
+ break;
+ case SID_DELETE_POSTIT:
+ {
+ Reference< XAnnotation > xAnnotation;
+ sal_uInt32 nId = 0;
+ if( pArgs )
+ {
+ const SfxPoolItem* pPoolItem = nullptr;
+ if( SfxItemState::SET == pArgs->GetItemState( SID_DELETE_POSTIT, true, &pPoolItem ) )
+ static_cast<const SfxUnoAnyItem*>(pPoolItem)->GetValue() >>= xAnnotation;
+ if( SfxItemState::SET == pArgs->GetItemState( SID_ATTR_POSTIT_ID, true, &pPoolItem ) )
+ nId = static_cast<const SvxPostItIdItem*>(pPoolItem)->GetValue().toUInt32();
+ }
+
+ if (nId != 0)
+ xAnnotation = GetAnnotationById(nId);
+ else if( !xAnnotation.is() )
+ GetSelectedAnnotation( xAnnotation );
+
+ DeleteAnnotation( xAnnotation );
+ }
+ break;
+ }
+
+ UpdateTags();
+}
+
+void AnnotationManagerImpl::ExecuteEditAnnotation(SfxRequest const & rReq)
+{
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ Reference< XAnnotation > xAnnotation;
+ OUString sText;
+ sal_Int32 nPositionX = -1;
+ sal_Int32 nPositionY = -1;
+
+ if (!pArgs)
+ return;
+
+ if (mpDoc->IsUndoEnabled())
+ mpDoc->BegUndo(SdResId(STR_ANNOTATION_UNDO_EDIT));
+
+ if (const SvxPostItIdItem* pPoolItem = pArgs->GetItemIfSet(SID_ATTR_POSTIT_ID))
+ {
+ sal_uInt32 nId = pPoolItem->GetValue().toUInt32();
+ xAnnotation = GetAnnotationById(nId);
+ }
+ if (const SfxStringItem* pPoolItem = pArgs->GetItemIfSet(SID_ATTR_POSTIT_TEXT))
+ sText = pPoolItem->GetValue();
+
+ if (const SfxInt32Item* pPoolItem = pArgs->GetItemIfSet(SID_ATTR_POSTIT_POSITION_X))
+ nPositionX = pPoolItem->GetValue();
+
+ if (const SfxInt32Item* pPoolItem = pArgs->GetItemIfSet(SID_ATTR_POSTIT_POSITION_Y))
+ nPositionY = pPoolItem->GetValue();
+
+ if (xAnnotation.is())
+ {
+ CreateChangeUndo(xAnnotation);
+
+ if (nPositionX >= 0 && nPositionY >= 0)
+ {
+ double fX = convertTwipToMm100(nPositionX) / 100.0;
+ double fY = convertTwipToMm100(nPositionY) / 100.0;
+ xAnnotation->setPosition({fX, fY});
+ }
+
+ if (!sText.isEmpty())
+ {
+ // TODO: Not allow other authors to change others' comments ?
+ Reference<XText> xText(xAnnotation->getTextRange());
+ xText->setString(sText);
+ }
+
+ LOKCommentNotifyAll(CommentNotificationType::Modify, xAnnotation);
+ }
+
+ if (mpDoc->IsUndoEnabled())
+ mpDoc->EndUndo();
+
+ UpdateTags(true);
+}
+
+void AnnotationManagerImpl::InsertAnnotation(const OUString& rText)
+{
+ SdPage* pPage = GetCurrentPage();
+ if( !pPage )
+ return;
+
+ if( mpDoc->IsUndoEnabled() )
+ mpDoc->BegUndo( SdResId( STR_ANNOTATION_UNDO_INSERT ) );
+
+ // find free space for new annotation
+ int y = 0, x = 0;
+
+ AnnotationVector aAnnotations( pPage->getAnnotations() );
+ if( !aAnnotations.empty() )
+ {
+ const int page_width = pPage->GetSize().Width();
+ const int width = 1000;
+ const int height = 800;
+ ::tools::Rectangle aTagRect;
+
+ while( true )
+ {
+ ::tools::Rectangle aNewRect( x, y, x + width - 1, y + height - 1 );
+ bool bFree = true;
+
+ for( const auto& rxAnnotation : aAnnotations )
+ {
+ RealPoint2D aPoint( rxAnnotation->getPosition() );
+ aTagRect.SetLeft( sal::static_int_cast< ::tools::Long >( aPoint.X * 100.0 ) );
+ aTagRect.SetTop( sal::static_int_cast< ::tools::Long >( aPoint.Y * 100.0 ) );
+ aTagRect.SetRight( aTagRect.Left() + width - 1 );
+ aTagRect.SetBottom( aTagRect.Top() + height - 1 );
+
+ if( aNewRect.Overlaps( aTagRect ) )
+ {
+ bFree = false;
+ break;
+ }
+ }
+
+ if( !bFree )
+ {
+ x += width;
+ if( x > page_width )
+ {
+ x = 0;
+ y += height;
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+
+ Reference< XAnnotation > xAnnotation;
+ pPage->createAnnotation( xAnnotation );
+
+ OUString sAuthor;
+ if (comphelper::LibreOfficeKit::isActive())
+ sAuthor = mrBase.GetMainViewShell()->GetView()->GetAuthor();
+ else
+ {
+ SvtUserOptions aUserOptions;
+ sAuthor = aUserOptions.GetFullName();
+ xAnnotation->setInitials( aUserOptions.GetID() );
+ }
+
+ if (!rText.isEmpty())
+ {
+ Reference<XText> xText(xAnnotation->getTextRange());
+ xText->setString(rText);
+ }
+
+ // set current author to new annotation
+ xAnnotation->setAuthor( sAuthor );
+ // set current time to new annotation
+ xAnnotation->setDateTime( getCurrentDateTime() );
+
+ // set position
+ RealPoint2D aPos( static_cast<double>(x) / 100.0, static_cast<double>(y) / 100.0 );
+ xAnnotation->setPosition( aPos );
+
+ if( mpDoc->IsUndoEnabled() )
+ mpDoc->EndUndo();
+
+ // Tell our LOK clients about new comment added
+ LOKCommentNotifyAll(CommentNotificationType::Add, xAnnotation);
+
+ UpdateTags(true);
+ SelectAnnotation( xAnnotation, true );
+}
+
+void AnnotationManagerImpl::ExecuteReplyToAnnotation( SfxRequest const & rReq )
+{
+ Reference< XAnnotation > xAnnotation;
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ OUString sReplyText;
+ if( pArgs )
+ {
+ const SfxPoolItem* pPoolItem = nullptr;
+ if( SfxItemState::SET == pArgs->GetItemState( SID_ATTR_POSTIT_ID, true, &pPoolItem ) )
+ {
+ sal_uInt32 nReplyId = 0; // Id of the comment to reply to
+ nReplyId = static_cast<const SvxPostItIdItem*>(pPoolItem)->GetValue().toUInt32();
+ xAnnotation = GetAnnotationById(nReplyId);
+ }
+ else if( SfxItemState::SET == pArgs->GetItemState( rReq.GetSlot(), true, &pPoolItem ) )
+ static_cast<const SfxUnoAnyItem*>( pPoolItem )->GetValue() >>= xAnnotation;
+
+ if( SfxItemState::SET == pArgs->GetItemState( SID_ATTR_POSTIT_TEXT, true, &pPoolItem ) )
+ sReplyText = static_cast<const SvxPostItTextItem*>( pPoolItem )->GetValue();
+ }
+
+ TextApiObject* pTextApi = getTextApiObject( xAnnotation );
+ if( !pTextApi )
+ return;
+
+ ::Outliner aOutliner( GetAnnotationPool(),OutlinerMode::TextObject );
+
+ SdDrawDocument::SetCalcFieldValueHdl( &aOutliner );
+ aOutliner.SetUpdateLayout( true );
+
+ OUString aStr(SdResId(STR_ANNOTATION_REPLY));
+ OUString sAuthor( xAnnotation->getAuthor() );
+ if( sAuthor.isEmpty() )
+ sAuthor = SdResId( STR_ANNOTATION_NOAUTHOR );
+
+ aStr = aStr.replaceFirst("%1", sAuthor) +
+ " (" + getAnnotationDateTimeString( xAnnotation ) + "): \"";
+
+ OUString sQuote( pTextApi->GetText() );
+
+ if( sQuote.isEmpty() )
+ sQuote = "...";
+ aStr += sQuote + "\"\n";
+
+ for( sal_Int32 nIdx = 0; nIdx >= 0; )
+ aOutliner.Insert( aStr.getToken( 0, '\n', nIdx ), EE_PARA_APPEND, -1 );
+
+ if( aOutliner.GetParagraphCount() > 1 )
+ {
+ SfxItemSet aAnswerSet( aOutliner.GetEmptyItemSet() );
+ aAnswerSet.Put(SvxPostureItem(ITALIC_NORMAL,EE_CHAR_ITALIC));
+
+ ESelection aSel;
+ aSel.nEndPara = aOutliner.GetParagraphCount()-2;
+ aSel.nEndPos = aOutliner.GetText( aOutliner.GetParagraph( aSel.nEndPara ) ).getLength();
+
+ aOutliner.QuickSetAttribs( aAnswerSet, aSel );
+ }
+
+ if (!sReplyText.isEmpty())
+ aOutliner.Insert(sReplyText);
+
+ std::optional< OutlinerParaObject > pOPO( aOutliner.CreateParaObject() );
+ pTextApi->SetText(*pOPO);
+
+ OUString sReplyAuthor;
+ if (comphelper::LibreOfficeKit::isActive())
+ sReplyAuthor = mrBase.GetMainViewShell()->GetView()->GetAuthor();
+ else
+ {
+ SvtUserOptions aUserOptions;
+ sReplyAuthor = aUserOptions.GetFullName();
+ xAnnotation->setInitials( aUserOptions.GetID() );
+ }
+
+ xAnnotation->setAuthor( sReplyAuthor );
+ // set current time to reply
+ xAnnotation->setDateTime( getCurrentDateTime() );
+
+ // Tell our LOK clients about this (comment modification)
+ LOKCommentNotifyAll(CommentNotificationType::Modify, xAnnotation);
+
+ UpdateTags(true);
+ SelectAnnotation( xAnnotation, true );
+}
+
+void AnnotationManagerImpl::DeleteAnnotation( const Reference< XAnnotation >& xAnnotation )
+{
+ SdPage* pPage = GetCurrentPage();
+
+ if( xAnnotation.is() && pPage )
+ {
+ if( mpDoc->IsUndoEnabled() )
+ mpDoc->BegUndo( SdResId( STR_ANNOTATION_UNDO_DELETE ) );
+
+ pPage->removeAnnotation( xAnnotation );
+
+ if( mpDoc->IsUndoEnabled() )
+ mpDoc->EndUndo();
+
+ UpdateTags();
+ }
+}
+
+void AnnotationManagerImpl::DeleteAnnotationsByAuthor( std::u16string_view sAuthor )
+{
+ if( mpDoc->IsUndoEnabled() )
+ mpDoc->BegUndo( SdResId( STR_ANNOTATION_UNDO_DELETE ) );
+
+ SdPage* pPage = nullptr;
+ do
+ {
+ pPage = GetNextPage( pPage, true );
+
+ if( pPage && !pPage->getAnnotations().empty() )
+ {
+ AnnotationVector aAnnotations( pPage->getAnnotations() );
+ for( Reference< XAnnotation >& xAnnotation : aAnnotations )
+ {
+ if( xAnnotation->getAuthor() == sAuthor )
+ {
+ if( mxSelectedAnnotation == xAnnotation )
+ mxSelectedAnnotation.clear();
+ pPage->removeAnnotation( xAnnotation );
+ }
+ }
+ }
+ } while( pPage );
+
+ if( mpDoc->IsUndoEnabled() )
+ mpDoc->EndUndo();
+}
+
+void AnnotationManagerImpl::DeleteAllAnnotations()
+{
+ if( mpDoc->IsUndoEnabled() )
+ mpDoc->BegUndo( SdResId( STR_ANNOTATION_UNDO_DELETE ) );
+
+ SdPage* pPage = nullptr;
+ do
+ {
+ pPage = GetNextPage( pPage, true );
+
+ if( pPage && !pPage->getAnnotations().empty() )
+ {
+
+ AnnotationVector aAnnotations( pPage->getAnnotations() );
+ for( const auto& rxAnnotation : aAnnotations )
+ {
+ pPage->removeAnnotation( rxAnnotation );
+ }
+ }
+ }
+ while( pPage );
+
+ mxSelectedAnnotation.clear();
+
+ if( mpDoc->IsUndoEnabled() )
+ mpDoc->EndUndo();
+}
+
+void AnnotationManagerImpl::GetAnnotationState(SfxItemSet& rSet)
+{
+ SdPage* pCurrentPage = GetCurrentPage();
+
+ const bool bReadOnly = mrBase.GetDocShell()->IsReadOnly();
+ const bool bWrongPageKind = (pCurrentPage == nullptr) || (pCurrentPage->GetPageKind() != PageKind::Standard);
+
+ const SvtSaveOptions::ODFSaneDefaultVersion nCurrentODFVersion( GetODFSaneDefaultVersion() );
+
+ if (bReadOnly || bWrongPageKind || (nCurrentODFVersion <= SvtSaveOptions::ODFSVER_012))
+ rSet.DisableItem( SID_INSERT_POSTIT );
+
+ rSet.Put(SfxBoolItem(SID_TOGGLE_NOTES, mbShowAnnotations));
+
+ Reference< XAnnotation > xAnnotation;
+ GetSelectedAnnotation( xAnnotation );
+
+ // Don't disable these slot in case of LOK, as postit doesn't need to
+ // selected before doing an operation on it in LOK
+ if( (!xAnnotation.is() && !comphelper::LibreOfficeKit::isActive()) || bReadOnly )
+ {
+ rSet.DisableItem( SID_DELETE_POSTIT );
+ rSet.DisableItem( SID_EDIT_POSTIT );
+ }
+
+ SdPage* pPage = nullptr;
+
+ bool bHasAnnotations = false;
+ do
+ {
+ pPage = GetNextPage( pPage, true );
+
+ if( pPage && !pPage->getAnnotations().empty() )
+ bHasAnnotations = true;
+ }
+ while( pPage && !bHasAnnotations );
+
+ if( !bHasAnnotations || bReadOnly )
+ {
+ rSet.DisableItem( SID_DELETEALL_POSTIT );
+ }
+
+ if( bWrongPageKind || !bHasAnnotations )
+ {
+ rSet.DisableItem( SID_PREVIOUS_POSTIT );
+ rSet.DisableItem( SID_NEXT_POSTIT );
+ }
+}
+
+void AnnotationManagerImpl::SelectNextAnnotation(bool bForward)
+{
+ ShowAnnotations( true );
+
+ Reference< XAnnotation > xCurrent;
+ GetSelectedAnnotation( xCurrent );
+ SdPage* pPage = GetCurrentPage();
+ if( !pPage )
+ return;
+
+ AnnotationVector aAnnotations( pPage->getAnnotations() );
+
+ if( bForward )
+ {
+ if( xCurrent.is() )
+ {
+ auto iter = std::find(aAnnotations.begin(), aAnnotations.end(), xCurrent);
+ if (iter != aAnnotations.end())
+ {
+ ++iter;
+ if( iter != aAnnotations.end() )
+ {
+ SelectAnnotation( *iter );
+ return;
+ }
+ }
+ }
+ else if( !aAnnotations.empty() )
+ {
+ SelectAnnotation( *(aAnnotations.begin()) );
+ return;
+ }
+ }
+ else
+ {
+ if( xCurrent.is() )
+ {
+ auto iter = std::find(aAnnotations.begin(), aAnnotations.end(), xCurrent);
+ if (iter != aAnnotations.end() && iter != aAnnotations.begin())
+ {
+ --iter;
+ SelectAnnotation( *iter );
+ return;
+ }
+ }
+ else if( !aAnnotations.empty() )
+ {
+ AnnotationVector::iterator iter( aAnnotations.end() );
+ SelectAnnotation( *(--iter) );
+ return;
+ }
+ }
+
+ mxSelectedAnnotation.clear();
+ do
+ {
+ do
+ {
+ pPage = GetNextPage( pPage, bForward );
+
+ if( pPage && !pPage->getAnnotations().empty() )
+ {
+ // switch to next/previous slide with annotations
+ std::shared_ptr<DrawViewShell> pDrawViewShell(std::dynamic_pointer_cast<DrawViewShell>(mrBase.GetMainViewShell()));
+ if (pDrawViewShell != nullptr)
+ {
+ pDrawViewShell->ChangeEditMode(pPage->IsMasterPage() ? EditMode::MasterPage : EditMode::Page, false);
+ pDrawViewShell->SwitchPage((pPage->GetPageNum() - 1) >> 1);
+
+ SfxDispatcher* pDispatcher = getDispatcher( mrBase );
+ if( pDispatcher )
+ pDispatcher->Execute( bForward ? SID_NEXT_POSTIT : SID_PREVIOUS_POSTIT );
+
+ return;
+ }
+ }
+ }
+ while( pPage );
+
+ // The question text depends on the search direction.
+ bool bImpress = mpDoc->GetDocumentType() == DocumentType::Impress;
+ TranslateId pStringId;
+ if(bForward)
+ pStringId = bImpress ? STR_ANNOTATION_WRAP_FORWARD : STR_ANNOTATION_WRAP_FORWARD_DRAW;
+ else
+ pStringId = bImpress ? STR_ANNOTATION_WRAP_BACKWARD : STR_ANNOTATION_WRAP_BACKWARD_DRAW;
+
+ // Pop up question box that asks the user whether to wrap around.
+ // The dialog is made modal with respect to the whole application.
+ std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(nullptr,
+ VclMessageType::Question, VclButtonsType::YesNo,
+ SdResId(pStringId)));
+ xQueryBox->set_default_response(RET_YES);
+ if (xQueryBox->run() != RET_YES)
+ break;
+ }
+ while( true );
+}
+
+void AnnotationManagerImpl::onTagSelected( AnnotationTag const & rTag )
+{
+ mxSelectedAnnotation = rTag.GetAnnotation();
+ invalidateSlots();
+}
+
+void AnnotationManagerImpl::onTagDeselected( AnnotationTag const & rTag )
+{
+ if( rTag.GetAnnotation() == mxSelectedAnnotation )
+ {
+ mxSelectedAnnotation.clear();
+ invalidateSlots();
+ }
+}
+
+void AnnotationManagerImpl::SelectAnnotation( const css::uno::Reference< css::office::XAnnotation >& xAnnotation, bool bEdit /* = sal_False */ )
+{
+ mxSelectedAnnotation = xAnnotation;
+
+ auto iter = std::find_if(maTagVector.begin(), maTagVector.end(),
+ [&xAnnotation](const rtl::Reference<AnnotationTag>& rxTag) { return rxTag->GetAnnotation() == xAnnotation; });
+ if (iter != maTagVector.end())
+ {
+ SmartTagReference xTag( *iter );
+ mrBase.GetMainViewShell()->GetView()->getSmartTags().select( xTag );
+ (*iter)->OpenPopup( bEdit );
+ }
+}
+
+void AnnotationManagerImpl::GetSelectedAnnotation( css::uno::Reference< css::office::XAnnotation >& xAnnotation )
+{
+ xAnnotation = mxSelectedAnnotation;
+}
+
+void AnnotationManagerImpl::invalidateSlots()
+{
+ SfxBindings* pBindings = getBindings( mrBase );
+ if( pBindings )
+ {
+ pBindings->Invalidate( SID_INSERT_POSTIT );
+ pBindings->Invalidate( SID_DELETE_POSTIT );
+ pBindings->Invalidate( SID_DELETEALL_POSTIT );
+ pBindings->Invalidate( SID_PREVIOUS_POSTIT );
+ pBindings->Invalidate( SID_NEXT_POSTIT );
+ pBindings->Invalidate( SID_UNDO );
+ pBindings->Invalidate( SID_REDO );
+ }
+}
+
+void AnnotationManagerImpl::onSelectionChanged()
+{
+ if( !(mxView.is() && mrBase.GetDrawView()) )
+ return;
+
+ try
+ {
+ Reference< XAnnotationAccess > xPage( mxView->getCurrentPage(), UNO_QUERY );
+
+ if( xPage != mxCurrentPage )
+ {
+ mxCurrentPage = xPage;
+
+ UpdateTags(true);
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::AnnotationManagerImpl::onSelectionChanged()" );
+ }
+}
+
+void AnnotationManagerImpl::UpdateTags( bool bSynchron )
+{
+ if( bSynchron )
+ {
+ if( mnUpdateTagsEvent )
+ Application::RemoveUserEvent( mnUpdateTagsEvent );
+
+ UpdateTagsHdl(nullptr);
+ }
+ else
+ {
+ if( !mnUpdateTagsEvent && mxView.is() )
+ mnUpdateTagsEvent = Application::PostUserEvent( LINK( this, AnnotationManagerImpl, UpdateTagsHdl ) );
+ }
+}
+
+IMPL_LINK_NOARG(AnnotationManagerImpl, UpdateTagsHdl, void*, void)
+{
+ mnUpdateTagsEvent = nullptr;
+ DisposeTags();
+
+ if( mbShowAnnotations )
+ CreateTags();
+
+ if( mrBase.GetDrawView() )
+ static_cast< ::sd::View* >( mrBase.GetDrawView() )->updateHandles();
+
+ invalidateSlots();
+}
+
+void AnnotationManagerImpl::CreateTags()
+{
+ if( !(mxCurrentPage.is() && mpDoc) )
+ return;
+
+ auto xViewShell = mrBase.GetMainViewShell();
+ if (!xViewShell)
+ return;
+
+ try
+ {
+ int nIndex = 1;
+ maFont = Application::GetSettings().GetStyleSettings().GetAppFont();
+
+ rtl::Reference< AnnotationTag > xSelectedTag;
+
+ Reference< XAnnotationEnumeration > xEnum( mxCurrentPage->createAnnotationEnumeration() );
+ while( xEnum->hasMoreElements() )
+ {
+ Reference< XAnnotation > xAnnotation( xEnum->nextElement() );
+ Color aColor( GetColorLight( mpDoc->GetAnnotationAuthorIndex( xAnnotation->getAuthor() ) ) );
+ rtl::Reference< AnnotationTag > xTag( new AnnotationTag( *this, *xViewShell->GetView(), xAnnotation, aColor, nIndex++, maFont ) );
+ maTagVector.push_back(xTag);
+
+ if( xAnnotation == mxSelectedAnnotation )
+ {
+ xSelectedTag = xTag;
+ }
+ }
+
+ if( xSelectedTag.is() )
+ {
+ SmartTagReference xTag( xSelectedTag );
+ mrBase.GetMainViewShell()->GetView()->getSmartTags().select( xTag );
+ }
+ else
+ {
+ // no tag, no selection!
+ mxSelectedAnnotation.clear();
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::AnnotationManagerImpl::onSelectionChanged()" );
+ }
+}
+
+void AnnotationManagerImpl::DisposeTags()
+{
+ for (auto& rxTag : maTagVector)
+ {
+ rxTag->Dispose();
+ }
+
+ maTagVector.clear();
+}
+
+void AnnotationManagerImpl::addListener()
+{
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,AnnotationManagerImpl,EventMultiplexerListener) );
+ mrBase.GetEventMultiplexer()->AddEventListener(aLink);
+}
+
+void AnnotationManagerImpl::removeListener()
+{
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,AnnotationManagerImpl,EventMultiplexerListener) );
+ mrBase.GetEventMultiplexer()->RemoveEventListener( aLink );
+}
+
+IMPL_LINK(AnnotationManagerImpl,EventMultiplexerListener,
+ tools::EventMultiplexerEvent&, rEvent, void)
+{
+ switch (rEvent.meEventId)
+ {
+ case EventMultiplexerEventId::CurrentPageChanged:
+ case EventMultiplexerEventId::EditViewSelection:
+ onSelectionChanged();
+ break;
+
+ case EventMultiplexerEventId::MainViewRemoved:
+ mxView.clear();
+ onSelectionChanged();
+ break;
+
+ case EventMultiplexerEventId::MainViewAdded:
+ mxView.set( mrBase.GetController(), UNO_QUERY );
+ onSelectionChanged();
+ break;
+
+ default: break;
+ }
+}
+
+void AnnotationManagerImpl::ExecuteAnnotationTagContextMenu(const Reference<XAnnotation>& xAnnotation, weld::Widget* pParent, const ::tools::Rectangle& rContextRect)
+{
+ SfxDispatcher* pDispatcher( getDispatcher( mrBase ) );
+ if( !pDispatcher )
+ return;
+
+ const bool bReadOnly = mrBase.GetDocShell()->IsReadOnly();
+
+ if (bReadOnly)
+ return;
+
+ std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/annotationtagmenu.ui"));
+ std::unique_ptr<weld::Menu> xMenu(xBuilder->weld_menu("menu"));
+
+ SvtUserOptions aUserOptions;
+ OUString sCurrentAuthor( aUserOptions.GetFullName() );
+ OUString sAuthor( xAnnotation->getAuthor() );
+
+ OUString aStr(xMenu->get_label(".uno:DeleteAllAnnotationByAuthor"));
+ OUString aReplace( sAuthor );
+ if( aReplace.isEmpty() )
+ aReplace = SdResId( STR_ANNOTATION_NOAUTHOR );
+ aStr = aStr.replaceFirst("%1", aReplace);
+ xMenu->set_label(".uno:DeleteAllAnnotationByAuthor", aStr);
+
+ bool bShowReply = sAuthor != sCurrentAuthor;
+ xMenu->set_visible(".uno:ReplyToAnnotation", bShowReply);
+ xMenu->set_visible("separator", bShowReply);
+ xMenu->set_visible(".uno:DeleteAnnotation", xAnnotation.is());
+
+ auto sId = xMenu->popup_at_rect(pParent, rContextRect);
+
+ if (sId == ".uno:ReplyToAnnotation")
+ {
+ const SfxUnoAnyItem aItem( SID_REPLYTO_POSTIT, Any( xAnnotation ) );
+ pDispatcher->ExecuteList(SID_REPLYTO_POSTIT,
+ SfxCallMode::ASYNCHRON, { &aItem });
+ }
+ else if (sId == ".uno:DeleteAnnotation")
+ {
+ const SfxUnoAnyItem aItem( SID_DELETE_POSTIT, Any( xAnnotation ) );
+ pDispatcher->ExecuteList(SID_DELETE_POSTIT, SfxCallMode::ASYNCHRON,
+ { &aItem });
+ }
+ else if (sId == ".uno:DeleteAllAnnotationByAuthor")
+ {
+ const SfxStringItem aItem( SID_DELETEALLBYAUTHOR_POSTIT, sAuthor );
+ pDispatcher->ExecuteList( SID_DELETEALLBYAUTHOR_POSTIT,
+ SfxCallMode::ASYNCHRON, { &aItem });
+ }
+ else if (sId == ".uno:DeleteAllAnnotation")
+ pDispatcher->Execute( SID_DELETEALL_POSTIT );
+}
+
+Color AnnotationManagerImpl::GetColor(sal_uInt16 aAuthorIndex)
+{
+ if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
+ {
+ static const Color aArrayNormal[] = {
+ COL_AUTHOR1_NORMAL, COL_AUTHOR2_NORMAL, COL_AUTHOR3_NORMAL,
+ COL_AUTHOR4_NORMAL, COL_AUTHOR5_NORMAL, COL_AUTHOR6_NORMAL,
+ COL_AUTHOR7_NORMAL, COL_AUTHOR8_NORMAL, COL_AUTHOR9_NORMAL };
+
+ return aArrayNormal[ aAuthorIndex % SAL_N_ELEMENTS( aArrayNormal ) ];
+ }
+
+ return COL_WHITE;
+}
+
+Color AnnotationManagerImpl::GetColorLight(sal_uInt16 aAuthorIndex)
+{
+ if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
+ {
+ static const Color aArrayLight[] = {
+ COL_AUTHOR1_LIGHT, COL_AUTHOR2_LIGHT, COL_AUTHOR3_LIGHT,
+ COL_AUTHOR4_LIGHT, COL_AUTHOR5_LIGHT, COL_AUTHOR6_LIGHT,
+ COL_AUTHOR7_LIGHT, COL_AUTHOR8_LIGHT, COL_AUTHOR9_LIGHT };
+
+ return aArrayLight[ aAuthorIndex % SAL_N_ELEMENTS( aArrayLight ) ];
+ }
+
+ return COL_WHITE;
+}
+
+Color AnnotationManagerImpl::GetColorDark(sal_uInt16 aAuthorIndex)
+{
+ if (!Application::GetSettings().GetStyleSettings().GetHighContrastMode())
+ {
+ static const Color aArrayAnkor[] = {
+ COL_AUTHOR1_DARK, COL_AUTHOR2_DARK, COL_AUTHOR3_DARK,
+ COL_AUTHOR4_DARK, COL_AUTHOR5_DARK, COL_AUTHOR6_DARK,
+ COL_AUTHOR7_DARK, COL_AUTHOR8_DARK, COL_AUTHOR9_DARK };
+
+ return aArrayAnkor[ aAuthorIndex % SAL_N_ELEMENTS( aArrayAnkor ) ];
+ }
+
+ return COL_WHITE;
+}
+
+SdPage* AnnotationManagerImpl::GetNextPage( SdPage const * pPage, bool bForward )
+{
+ if( pPage == nullptr )
+ {
+ if (bForward)
+ return mpDoc->GetSdPage(0, PageKind::Standard ); // first page
+ else
+ return mpDoc->GetMasterSdPage( mpDoc->GetMasterSdPageCount(PageKind::Standard) - 1, PageKind::Standard ); // last page
+ }
+
+ sal_uInt16 nPageNum = (pPage->GetPageNum() - 1) >> 1;
+
+ // first all non master pages
+ if( !pPage->IsMasterPage() )
+ {
+ if( bForward )
+ {
+ if( nPageNum >= mpDoc->GetSdPageCount(PageKind::Standard)-1 )
+ {
+ // we reached end of draw pages, start with master pages (skip handout master for draw)
+ return mpDoc->GetMasterSdPage( (mpDoc->GetDocumentType() == DocumentType::Impress) ? 0 : 1, PageKind::Standard );
+ }
+ nPageNum++;
+ }
+ else
+ {
+ if( nPageNum == 0 )
+ return nullptr; // we are already on the first draw page, finished
+
+ nPageNum--;
+ }
+ return mpDoc->GetSdPage(nPageNum, PageKind::Standard);
+ }
+ else
+ {
+ if( bForward )
+ {
+ if( nPageNum >= mpDoc->GetMasterSdPageCount(PageKind::Standard)-1 )
+ {
+ return nullptr; // we reached the end, there is nothing more to see here
+ }
+ nPageNum++;
+ }
+ else
+ {
+ if( nPageNum == (mpDoc->GetDocumentType() == DocumentType::Impress ? 0 : 1) )
+ {
+ // we reached beginning of master pages, start with end if pages
+ return mpDoc->GetSdPage( mpDoc->GetSdPageCount(PageKind::Standard)-1, PageKind::Standard );
+ }
+
+ nPageNum--;
+ }
+ return mpDoc->GetMasterSdPage(nPageNum,PageKind::Standard);
+ }
+}
+
+SdPage* AnnotationManagerImpl::GetCurrentPage()
+{
+ if (mrBase.GetMainViewShell())
+ return mrBase.GetMainViewShell()->getCurrentPage();
+ return nullptr;
+}
+
+AnnotationManager::AnnotationManager( ViewShellBase& rViewShellBase )
+: mxImpl( new AnnotationManagerImpl( rViewShellBase ) )
+{
+ mxImpl->init();
+}
+
+AnnotationManager::~AnnotationManager()
+{
+ mxImpl->dispose();
+}
+
+void AnnotationManager::ExecuteAnnotation(SfxRequest const & rRequest)
+{
+ mxImpl->ExecuteAnnotation( rRequest );
+}
+
+void AnnotationManager::GetAnnotationState(SfxItemSet& rItemSet)
+{
+ mxImpl->GetAnnotationState(rItemSet);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/annotations/annotationmanagerimpl.hxx b/sd/source/ui/annotations/annotationmanagerimpl.hxx
new file mode 100644
index 000000000..c5871d90c
--- /dev/null
+++ b/sd/source/ui/annotations/annotationmanagerimpl.hxx
@@ -0,0 +1,141 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/document/XEventListener.hpp>
+
+#include <rtl/ustring.hxx>
+
+#include <comphelper/compbase.hxx>
+
+#include "annotationtag.hxx"
+
+namespace com::sun::star::drawing { class XDrawView; }
+namespace com::sun::star::office { class XAnnotationAccess; }
+namespace com::sun::star::office { class XAnnotation; }
+
+class SfxRequest;
+class SdPage;
+class SdDrawDocument;
+struct ImplSVEvent;
+
+namespace sd
+{
+
+class ViewShellBase;
+
+namespace tools {
+class EventMultiplexerEvent;
+}
+
+typedef comphelper::WeakComponentImplHelper <
+ css::document::XEventListener
+ > AnnotationManagerImplBase;
+
+class AnnotationManagerImpl : public AnnotationManagerImplBase
+{
+public:
+ explicit AnnotationManagerImpl( ViewShellBase& rViewShellBase );
+
+ void init();
+
+ // WeakComponentImplHelper
+ virtual void disposing (std::unique_lock<std::mutex>&) override;
+
+ // XEventListener
+ virtual void SAL_CALL notifyEvent( const css::document::EventObject& Event ) override;
+ virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
+
+ void ExecuteAnnotation (SfxRequest const & rRequest);
+ void GetAnnotationState (SfxItemSet& rItemSet);
+
+ void ExecuteInsertAnnotation(SfxRequest const & rReq);
+ void ExecuteDeleteAnnotation(SfxRequest const & rReq);
+ void ExecuteEditAnnotation(SfxRequest const & rReq);
+ void ExecuteReplyToAnnotation(SfxRequest const & rReq);
+
+ void SelectNextAnnotation(bool bForward);
+
+ void SelectAnnotation( const css::uno::Reference< css::office::XAnnotation >& xAnnotation, bool bEdit = false );
+ void GetSelectedAnnotation( css::uno::Reference< css::office::XAnnotation >& xAnnotation );
+
+ void InsertAnnotation(const OUString& rText);
+ void DeleteAnnotation( const css::uno::Reference< css::office::XAnnotation >& xAnnotation );
+ void DeleteAnnotationsByAuthor( std::u16string_view sAuthor );
+ void DeleteAllAnnotations();
+
+ void ExecuteAnnotationTagContextMenu(const css::uno::Reference<css::office::XAnnotation>& xAnnotation, weld::Widget* pParent, const ::tools::Rectangle& rContextRect);
+
+ static Color GetColorDark(sal_uInt16 aAuthorIndex);
+ static Color GetColorLight(sal_uInt16 aAuthorIndex);
+ static Color GetColor(sal_uInt16 aAuthorIndex);
+
+ // callbacks
+ void onTagSelected( AnnotationTag const & rTag );
+ void onTagDeselected( AnnotationTag const & rTag );
+
+ void onSelectionChanged();
+
+ void addListener();
+ void removeListener();
+
+ void invalidateSlots();
+
+ DECL_LINK(EventMultiplexerListener, tools::EventMultiplexerEvent&, void);
+ DECL_LINK(UpdateTagsHdl, void *, void);
+
+ void UpdateTags(bool bSynchron = false);
+ void CreateTags();
+ void DisposeTags();
+
+ SdPage* GetNextPage( SdPage const * pPage, bool bForward );
+
+ SdPage* GetCurrentPage();
+
+ SdDrawDocument* GetDoc() { return mpDoc; }
+
+ void ShowAnnotations(bool bShow);
+
+private:
+ ViewShellBase& mrBase;
+ SdDrawDocument* mpDoc;
+
+ std::vector< rtl::Reference< AnnotationTag > > maTagVector;
+
+ css::uno::Reference< css::drawing::XDrawView > mxView;
+ css::uno::Reference< css::office::XAnnotationAccess > mxCurrentPage;
+ css::uno::Reference< css::office::XAnnotation > mxSelectedAnnotation;
+
+ bool mbShowAnnotations;
+ ImplSVEvent * mnUpdateTagsEvent;
+ vcl::Font maFont;
+
+ css::uno::Reference<css::office::XAnnotation> GetAnnotationById(sal_uInt32 nAnnotationId);
+};
+
+OUString getAnnotationDateTimeString( const css::uno::Reference< css::office::XAnnotation >& xAnnotation );
+
+SfxItemPool* GetAnnotationPool();
+
+css::util::DateTime getCurrentDateTime();
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/annotations/annotationtag.cxx b/sd/source/ui/annotations/annotationtag.cxx
new file mode 100644
index 000000000..cfd632dcc
--- /dev/null
+++ b/sd/source/ui/annotations/annotationtag.cxx
@@ -0,0 +1,662 @@
+/* -*- 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 <com/sun/star/geometry/RealPoint2D.hpp>
+#include <com/sun/star/office/XAnnotation.hpp>
+
+#include <rtl/ustrbuf.hxx>
+
+#include <vcl/commandevent.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/weldutils.hxx>
+
+#include <svx/sdr/overlay/overlayanimatedbitmapex.hxx>
+#include <svx/sdr/overlay/overlaybitmapex.hxx>
+#include <svx/sdr/overlay/overlaypolypolygon.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/sdrpagewindow.hxx>
+#include <svx/sdrpaintwindow.hxx>
+#include <svx/svddrgmt.hxx>
+#include <tools/debug.hxx>
+
+#include <View.hxx>
+#include <sdresid.hxx>
+#include <strings.hrc>
+#include "annotationmanagerimpl.hxx"
+#include "annotationwindow.hxx"
+#include "annotationtag.hxx"
+#include <Annotation.hxx>
+#include <ViewShell.hxx>
+#include <Window.hxx>
+#include <drawdoc.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::office;
+using namespace ::com::sun::star::geometry;
+
+namespace sd
+{
+
+const sal_uInt32 SMART_TAG_HDL_NUM = SAL_MAX_UINT32;
+const int DRGPIX = 2; // Drag MinMove in Pixel
+
+static OUString getInitials( const OUString& rName )
+{
+ OUStringBuffer sInitials;
+
+ const sal_Unicode * pStr = rName.getStr();
+ sal_Int32 nLength = rName.getLength();
+
+ while( nLength )
+ {
+ // skip whitespace
+ while( nLength && (*pStr <= ' ') )
+ {
+ nLength--; pStr++;
+ }
+
+ // take letter
+ if( nLength )
+ {
+ sInitials.append(*pStr);
+ nLength--; pStr++;
+ }
+
+ // skip letters until whitespace
+ while( nLength && (*pStr > ' ') )
+ {
+ nLength--; pStr++;
+ }
+ }
+
+ return sInitials.makeStringAndClear();
+}
+
+namespace {
+
+class AnnotationDragMove : public SdrDragMove
+{
+public:
+ AnnotationDragMove(SdrDragView& rNewView, const rtl::Reference <AnnotationTag >& xTag);
+ virtual bool BeginSdrDrag() override;
+ virtual bool EndSdrDrag(bool bCopy) override;
+ virtual void MoveSdrDrag(const Point& rNoSnapPnt) override;
+ virtual void CancelSdrDrag() override;
+
+private:
+ rtl::Reference <AnnotationTag > mxTag;
+ Point maOrigin;
+};
+
+}
+
+AnnotationDragMove::AnnotationDragMove(SdrDragView& rNewView, const rtl::Reference <AnnotationTag >& xTag)
+: SdrDragMove(rNewView)
+, mxTag( xTag )
+{
+}
+
+bool AnnotationDragMove::BeginSdrDrag()
+{
+ DragStat().SetRef1(GetDragHdl()->GetPos());
+ DragStat().SetShown(!DragStat().IsShown());
+
+ maOrigin = GetDragHdl()->GetPos();
+ DragStat().SetActionRect(::tools::Rectangle(maOrigin,maOrigin));
+
+ return true;
+}
+
+void AnnotationDragMove::MoveSdrDrag(const Point& rNoSnapPnt)
+{
+ Point aPnt(rNoSnapPnt);
+
+ if (DragStat().CheckMinMoved(rNoSnapPnt))
+ {
+ if (aPnt!=DragStat().GetNow())
+ {
+ Hide();
+ DragStat().NextMove(aPnt);
+ GetDragHdl()->SetPos( maOrigin + Point( DragStat().GetDX(), DragStat().GetDY() ) );
+ Show();
+ DragStat().SetActionRect(::tools::Rectangle(aPnt,aPnt));
+ }
+ }
+}
+
+bool AnnotationDragMove::EndSdrDrag(bool /*bCopy*/)
+{
+ Hide();
+ if( mxTag.is() )
+ mxTag->Move( DragStat().GetDX(), DragStat().GetDY() );
+ return true;
+}
+
+void AnnotationDragMove::CancelSdrDrag()
+{
+ Hide();
+}
+
+namespace {
+
+class AnnotationHdl : public SmartHdl
+{
+public:
+ AnnotationHdl( const SmartTagReference& xTag, const Reference< XAnnotation >& xAnnotation, const Point& rPnt );
+
+ virtual void CreateB2dIAObject() override;
+ virtual bool IsFocusHdl() const override;
+
+private:
+ Reference< XAnnotation > mxAnnotation;
+ rtl::Reference< AnnotationTag > mxTag;
+};
+
+}
+
+AnnotationHdl::AnnotationHdl( const SmartTagReference& xTag, const Reference< XAnnotation >& xAnnotation, const Point& rPnt )
+: SmartHdl( xTag, rPnt, SdrHdlKind::SmartTag )
+, mxAnnotation( xAnnotation )
+, mxTag( dynamic_cast< AnnotationTag* >( xTag.get() ) )
+{
+}
+
+void AnnotationHdl::CreateB2dIAObject()
+{
+ // first throw away old one
+ GetRidOfIAObject();
+
+ if (!mxAnnotation.is())
+ return;
+
+ const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+
+ const Point aTagPos( GetPos() );
+ basegfx::B2DPoint aPosition( aTagPos.X(), aTagPos.Y() );
+
+ const bool bFocused = IsFocusHdl() && pHdlList && (pHdlList->GetFocusHdl() == this);
+
+ BitmapEx aBitmapEx( mxTag->CreateAnnotationBitmap(mxTag->isSelected()) );
+ BitmapEx aBitmapEx2;
+ if( bFocused )
+ aBitmapEx2 = mxTag->CreateAnnotationBitmap(!mxTag->isSelected() );
+
+ if(!pHdlList)
+ return;
+
+ SdrMarkView* pView = pHdlList->GetView();
+
+ if(!pView || pView->areMarkHandlesHidden())
+ return;
+
+ SdrPageView* pPageView = pView->GetSdrPageView();
+
+ if(!pPageView)
+ return;
+
+ for(sal_uInt32 b = 0; b < pPageView->PageWindowCount(); b++)
+ {
+ // const SdrPageViewWinRec& rPageViewWinRec = rPageViewWinList[b];
+ const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
+
+ SdrPaintWindow& rPaintWindow = rPageWindow.GetPaintWindow();
+ const rtl::Reference< sdr::overlay::OverlayManager >& xManager = rPageWindow.GetOverlayManager();
+ if(rPaintWindow.OutputToWindow() && xManager.is() )
+ {
+ std::unique_ptr<sdr::overlay::OverlayObject> pOverlayObject;
+
+ auto* pAnnotation = dynamic_cast<sd::Annotation*>(mxAnnotation.get());
+
+ if (pAnnotation && pAnnotation->hasCustomAnnotationMarker())
+ {
+ CustomAnnotationMarker& rCustomAnnotationMarker = pAnnotation->getCustomAnnotationMarker();
+
+ auto& rPolygons = rCustomAnnotationMarker.maPolygons;
+ if (!rPolygons.empty())
+ {
+ basegfx::B2DPolyPolygon aPolyPolygon;
+ for (auto const & rPolygon : rPolygons)
+ aPolyPolygon.append(rPolygon);
+
+ pOverlayObject.reset(new sdr::overlay::OverlayPolyPolygon(
+ aPolyPolygon,
+ rCustomAnnotationMarker.maLineColor,
+ rCustomAnnotationMarker.mnLineWidth,
+ rCustomAnnotationMarker.maFillColor));
+ }
+ }
+ else
+ {
+ // animate focused handles
+ if(bFocused)
+ {
+ const sal_uInt64 nBlinkTime = rStyleSettings.GetCursorBlinkTime();
+
+ pOverlayObject.reset(new sdr::overlay::OverlayAnimatedBitmapEx(aPosition, aBitmapEx, aBitmapEx2, nBlinkTime, 0, 0, 0, 0 ));
+ }
+ else
+ {
+ pOverlayObject.reset(new sdr::overlay::OverlayBitmapEx( aPosition, aBitmapEx, 0, 0 ));
+ }
+ }
+
+ // OVERLAYMANAGER
+ insertNewlyCreatedOverlayObjectForSdrHdl(
+ std::move(pOverlayObject),
+ rPageWindow.GetObjectContact(),
+ *xManager);
+ }
+ }
+}
+
+bool AnnotationHdl::IsFocusHdl() const
+{
+ return true;
+}
+
+AnnotationTag::AnnotationTag( AnnotationManagerImpl& rManager, ::sd::View& rView, const Reference< XAnnotation >& xAnnotation, Color const & rColor, int nIndex, const vcl::Font& rFont )
+: SmartTag( rView )
+, mrManager( rManager )
+, mxAnnotation( xAnnotation )
+, maColor( rColor )
+, mnIndex( nIndex )
+, mrFont( rFont )
+, mpListenWindow( nullptr )
+{
+}
+
+AnnotationTag::~AnnotationTag()
+{
+ DBG_ASSERT( !mxAnnotation.is(), "sd::AnnotationTag::~AnnotationTag(), dispose me first!" );
+ Dispose();
+}
+
+/** returns true if the AnnotationTag handled the event. */
+bool AnnotationTag::MouseButtonDown( const MouseEvent& rMEvt, SmartHdl& /*rHdl*/ )
+{
+ if( !mxAnnotation.is() )
+ return false;
+
+ bool bRet = false;
+ if( !isSelected() )
+ {
+ SmartTagReference xTag( this );
+ mrView.getSmartTags().select( xTag );
+ bRet = true;
+ }
+
+ if( rMEvt.IsLeft() && !rMEvt.IsRight() )
+ {
+ vcl::Window* pWindow = mrView.GetViewShell()->GetActiveWindow();
+ if( pWindow )
+ {
+ maMouseDownPos = pWindow->PixelToLogic( rMEvt.GetPosPixel() );
+
+ if( mpListenWindow )
+ mpListenWindow->RemoveEventListener( LINK(this, AnnotationTag, WindowEventHandler));
+
+ mpListenWindow = pWindow;
+ mpListenWindow->AddEventListener( LINK(this, AnnotationTag, WindowEventHandler));
+ }
+
+ bRet = true;
+ }
+
+ return bRet;
+}
+
+/** returns true if the SmartTag consumes this event. */
+bool AnnotationTag::KeyInput( const KeyEvent& rKEvt )
+{
+ if( !mxAnnotation.is() )
+ return false;
+
+ sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
+ switch( nCode )
+ {
+ case KEY_DELETE:
+ mrManager.DeleteAnnotation( mxAnnotation );
+ return true;
+
+ case KEY_DOWN:
+ case KEY_UP:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ return OnMove( rKEvt );
+
+ case KEY_ESCAPE:
+ {
+ SmartTagReference xThis( this );
+ mrView.getSmartTags().deselect();
+ return true;
+ }
+
+ case KEY_TAB:
+ mrManager.SelectNextAnnotation(!rKEvt.GetKeyCode().IsShift());
+ return true;
+
+ case KEY_RETURN:
+ case KEY_SPACE:
+ OpenPopup( true );
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+/** returns true if the SmartTag consumes this event. */
+bool AnnotationTag::Command( const CommandEvent& rCEvt )
+{
+ if (rCEvt.GetCommand() != CommandEventId::ContextMenu)
+ return false;
+ if (vcl::Window* pWindow = mrView.GetViewShell()->GetActiveWindow())
+ {
+ ::tools::Rectangle aContextRect(rCEvt.GetMousePosPixel(),Size(1,1));
+ weld::Window* pParent = weld::GetPopupParent(*pWindow, aContextRect);
+ mrManager.ExecuteAnnotationTagContextMenu(mxAnnotation, pParent, aContextRect);
+ return true;
+ }
+ return false;
+}
+
+void AnnotationTag::Move( int nDX, int nDY )
+{
+ if( !mxAnnotation.is() )
+ return;
+
+ if( mrManager.GetDoc()->IsUndoEnabled() )
+ mrManager.GetDoc()->BegUndo( SdResId( STR_ANNOTATION_UNDO_MOVE ) );
+
+ RealPoint2D aPosition( mxAnnotation->getPosition() );
+ aPosition.X += static_cast<double>(nDX) / 100.0;
+ aPosition.Y += static_cast<double>(nDY) / 100.0;
+ mxAnnotation->setPosition( aPosition );
+
+ if( mrManager.GetDoc()->IsUndoEnabled() )
+ mrManager.GetDoc()->EndUndo();
+
+ mrView.updateHandles();
+}
+
+bool AnnotationTag::OnMove( const KeyEvent& rKEvt )
+{
+ ::tools::Long nX = 0;
+ ::tools::Long nY = 0;
+
+ switch( rKEvt.GetKeyCode().GetCode() )
+ {
+ case KEY_UP: nY = -1; break;
+ case KEY_DOWN: nY = 1; break;
+ case KEY_LEFT: nX = -1; break;
+ case KEY_RIGHT: nX = 1; break;
+ default: break;
+ }
+
+ if(rKEvt.GetKeyCode().IsMod2())
+ {
+ OutputDevice* pOut = mrView.GetViewShell()->GetActiveWindow()->GetOutDev();
+ Size aLogicSizeOnePixel = pOut ? pOut->PixelToLogic(Size(1,1)) : Size(100, 100);
+ nX *= aLogicSizeOnePixel.Width();
+ nY *= aLogicSizeOnePixel.Height();
+ }
+ else
+ {
+ // old, fixed move distance
+ nX *= 100;
+ nY *= 100;
+ }
+
+ if( nX || nY )
+ {
+ // move the annotation
+ Move( nX, nY );
+ }
+
+ return true;
+}
+
+void AnnotationTag::CheckPossibilities()
+{
+}
+
+sal_Int32 AnnotationTag::GetMarkablePointCount() const
+{
+ return 0;
+}
+
+sal_Int32 AnnotationTag::GetMarkedPointCount() const
+{
+ return 0;
+}
+
+bool AnnotationTag::MarkPoint(SdrHdl& /*rHdl*/, bool /*bUnmark*/ )
+{
+ return false;
+}
+
+bool AnnotationTag::MarkPoints(const ::tools::Rectangle* /*pRect*/, bool /*bUnmark*/ )
+{
+ return false;
+}
+
+bool AnnotationTag::getContext( SdrViewContext& /*rContext*/ )
+{
+ return false;
+}
+
+void AnnotationTag::addCustomHandles( SdrHdlList& rHandlerList )
+{
+ if( !mxAnnotation.is() )
+ return;
+
+ SmartTagReference xThis( this );
+ std::unique_ptr<AnnotationHdl> pHdl(new AnnotationHdl( xThis, mxAnnotation, Point() ));
+ pHdl->SetObjHdlNum( SMART_TAG_HDL_NUM );
+ pHdl->SetPageView( mrView.GetSdrPageView() );
+
+ RealPoint2D aPosition( mxAnnotation->getPosition() );
+ Point aBasePos( static_cast<::tools::Long>(aPosition.X * 100.0), static_cast<::tools::Long>(aPosition.Y * 100.0) );
+ pHdl->SetPos( aBasePos );
+
+ rHandlerList.AddHdl( std::move(pHdl) );
+}
+
+void AnnotationTag::disposing()
+{
+ if( mpListenWindow )
+ {
+ mpListenWindow->RemoveEventListener( LINK(this, AnnotationTag, WindowEventHandler));
+ }
+
+ mxAnnotation.clear();
+ ClosePopup();
+ SmartTag::disposing();
+}
+
+void AnnotationTag::select()
+{
+ SmartTag::select();
+
+ mrManager.onTagSelected( *this );
+
+ vcl::Window* pWindow = mrView.GetViewShell()->GetActiveWindow();
+ if( pWindow )
+ {
+ RealPoint2D aPosition( mxAnnotation->getPosition() );
+ Point aPos( static_cast<::tools::Long>(aPosition.X * 100.0), static_cast<::tools::Long>(aPosition.Y * 100.0) );
+
+ ::tools::Rectangle aVisRect( aPos, pWindow->PixelToLogic(maSize) );
+ mrView.MakeVisible(aVisRect, *pWindow);
+ }
+}
+
+void AnnotationTag::deselect()
+{
+ SmartTag::deselect();
+
+ ClosePopup();
+
+ mrManager.onTagDeselected( *this );
+}
+
+BitmapEx AnnotationTag::CreateAnnotationBitmap( bool bSelected )
+{
+ ScopedVclPtrInstance< VirtualDevice > pVDev;
+
+ OUString sInitials(mxAnnotation->getInitials());
+ if (sInitials.isEmpty())
+ sInitials = getInitials(mxAnnotation->getAuthor());
+
+ OUString sAuthor(sInitials + " " + OUString::number(mnIndex));
+
+ pVDev->SetFont( mrFont );
+
+ const int BORDER_X = 4; // pixels
+ const int BORDER_Y = 4; // pixels
+
+ maSize = Size( pVDev->GetTextWidth( sAuthor ) + 2*BORDER_X, pVDev->GetTextHeight() + 2*BORDER_Y );
+ pVDev->SetOutputSizePixel( maSize, false );
+
+ Color aBorderColor( maColor );
+
+ if( bSelected )
+ {
+ aBorderColor.Invert();
+ }
+ else
+ {
+ if( maColor.IsDark() )
+ {
+ aBorderColor.IncreaseLuminance( 32 );
+ }
+ else
+ {
+ aBorderColor.DecreaseLuminance( 32 );
+ }
+ }
+
+ Point aPos;
+ ::tools::Rectangle aBorderRect( aPos, maSize );
+ pVDev->SetLineColor(aBorderColor);
+ pVDev->SetFillColor(maColor);
+ pVDev->DrawRect( aBorderRect );
+
+ pVDev->SetTextColor( maColor.IsDark() ? COL_WHITE : COL_BLACK );
+ pVDev->DrawText( Point( BORDER_X, BORDER_Y ), sAuthor );
+
+ return pVDev->GetBitmapEx( aPos, maSize );
+}
+
+void AnnotationTag::OpenPopup( bool bEdit )
+{
+ if( !mxAnnotation.is() )
+ return;
+
+ if( !mpAnnotationWindow )
+ {
+ OutputDevice* pOut = getView().GetFirstOutputDevice();
+ vcl::Window* pWindow = pOut ? pOut->GetOwnerWindow() : nullptr;
+ if( pWindow )
+ {
+ RealPoint2D aPosition( mxAnnotation->getPosition() );
+ Point aPos(pWindow->LogicToPixel( Point( static_cast<::tools::Long>(aPosition.X * 100.0), static_cast<::tools::Long>(aPosition.Y * 100.0) ) ) );
+
+ aPos.AdjustX(4 ); // magic!
+ aPos.AdjustY(1 );
+
+ ::tools::Rectangle aRect( aPos, maSize );
+
+ weld::Window* pParent = weld::GetPopupParent(*pWindow, aRect);
+ mpAnnotationWindow.reset(new AnnotationWindow(pParent, aRect, mrView.GetDocSh(), mxAnnotation));
+ mpAnnotationWindow->connect_closed(LINK(this, AnnotationTag, PopupModeEndHdl));
+ }
+ }
+
+ if (bEdit && mpAnnotationWindow)
+ mpAnnotationWindow->StartEdit();
+}
+
+IMPL_LINK_NOARG(AnnotationTag, PopupModeEndHdl, weld::Popover&, void)
+{
+ ClosePopup();
+}
+
+void AnnotationTag::ClosePopup()
+{
+ if (mpAnnotationWindow)
+ {
+ mpAnnotationWindow->SaveToDocument();
+ mpAnnotationWindow.reset();
+ }
+}
+
+IMPL_LINK(AnnotationTag, WindowEventHandler, VclWindowEvent&, rEvent, void)
+{
+ vcl::Window* pWindow = rEvent.GetWindow();
+
+ if( !pWindow )
+ return;
+
+ if( pWindow != mpListenWindow )
+ return;
+
+ switch( rEvent.GetId() )
+ {
+ case VclEventId::WindowMouseButtonUp:
+ {
+ // if we stop pressing the button without a mouse move we open the popup
+ mpListenWindow->RemoveEventListener( LINK(this, AnnotationTag, WindowEventHandler));
+ mpListenWindow = nullptr;
+ if( !mpAnnotationWindow )
+ OpenPopup(false);
+ }
+ break;
+ case VclEventId::WindowMouseMove:
+ {
+ // if we move the mouse after a button down we want to start dragging
+ mpListenWindow->RemoveEventListener( LINK(this, AnnotationTag, WindowEventHandler));
+ mpListenWindow = nullptr;
+
+ SdrHdl* pHdl = mrView.PickHandle(maMouseDownPos);
+ if( pHdl )
+ {
+ mrView.BrkAction();
+ const sal_uInt16 nDrgLog = static_cast<sal_uInt16>(pWindow->PixelToLogic(Size(DRGPIX,0)).Width());
+
+ rtl::Reference< AnnotationTag > xTag( this );
+
+ SdrDragMethod* pDragMethod = new AnnotationDragMove( mrView, xTag );
+ mrView.BegDragObj(maMouseDownPos, nullptr, pHdl, nDrgLog, pDragMethod );
+ }
+ }
+ break;
+ case VclEventId::ObjectDying:
+ mpListenWindow = nullptr;
+ break;
+ default: break;
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/annotations/annotationtag.hxx b/sd/source/ui/annotations/annotationtag.hxx
new file mode 100644
index 000000000..23dcde13a
--- /dev/null
+++ b/sd/source/ui/annotations/annotationtag.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <vcl/vclevent.hxx>
+
+#include <smarttag.hxx>
+#include "annotationwindow.hxx"
+
+namespace com::sun::star::office { class XAnnotation; }
+
+namespace sd {
+
+class View;
+class AnnotationManagerImpl;
+
+class AnnotationTag final : public SmartTag
+{
+public:
+ AnnotationTag( AnnotationManagerImpl& rManager, ::sd::View& rView, const css::uno::Reference< css::office::XAnnotation >& xAnnotation, Color const & rColor, int nIndex, const vcl::Font& rFont );
+ virtual ~AnnotationTag() override;
+
+ /// @return true if the SmartTag handled the event.
+ virtual bool MouseButtonDown( const MouseEvent&, SmartHdl& ) override;
+
+ /// @return true if the SmartTag consumes this event.
+ virtual bool KeyInput( const KeyEvent& rKEvt ) override;
+
+ /// @return true if the SmartTag consumes this event.
+ virtual bool Command( const CommandEvent& rCEvt ) override;
+
+ // callbacks from sdr view
+ virtual sal_Int32 GetMarkablePointCount() const override;
+ virtual sal_Int32 GetMarkedPointCount() const override;
+ virtual bool MarkPoint(SdrHdl& rHdl, bool bUnmark) override;
+ virtual void CheckPossibilities() override;
+ virtual bool MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark) override;
+
+ void Move( int nDX, int nDY );
+ bool OnMove( const KeyEvent& rKEvt );
+
+ BitmapEx CreateAnnotationBitmap(bool);
+
+ const css::uno::Reference< css::office::XAnnotation >& GetAnnotation() const { return mxAnnotation; }
+
+ void OpenPopup( bool bEdit );
+ void ClosePopup();
+
+private:
+ virtual void addCustomHandles( SdrHdlList& rHandlerList ) override;
+ virtual bool getContext( SdrViewContext& rContext ) override;
+ virtual void disposing() override;
+ virtual void select() override;
+ virtual void deselect() override;
+
+ DECL_LINK( WindowEventHandler, VclWindowEvent&, void );
+ DECL_LINK(PopupModeEndHdl, weld::Popover&, void);
+
+ AnnotationManagerImpl& mrManager;
+ css::uno::Reference< css::office::XAnnotation > mxAnnotation;
+ std::unique_ptr<AnnotationWindow> mpAnnotationWindow;
+ Color maColor;
+ int mnIndex;
+ const vcl::Font& mrFont;
+ Size maSize;
+ VclPtr<vcl::Window> mpListenWindow;
+ Point maMouseDownPos;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/annotations/annotationwindow.cxx b/sd/source/ui/annotations/annotationwindow.cxx
new file mode 100644
index 000000000..6c1210575
--- /dev/null
+++ b/sd/source/ui/annotations/annotationwindow.cxx
@@ -0,0 +1,802 @@
+/* -*- 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 <editeng/eeitem.hxx>
+#include <editeng/udlnitem.hxx>
+#include <editeng/langitem.hxx>
+#include <editeng/editview.hxx>
+#include <editeng/editstat.hxx>
+#include <editeng/outliner.hxx>
+#include <editeng/editeng.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/postitem.hxx>
+#include <editeng/wghtitem.hxx>
+#include <editeng/crossedoutitem.hxx>
+#include <svx/svxids.hrc>
+#include <unotools/useroptions.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svl/stritem.hxx>
+
+#include <vcl/commandevent.hxx>
+#include <vcl/commandinfoprovider.hxx>
+#include <vcl/vclenum.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/gradient.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/ptrstyle.hxx>
+
+#include <strings.hrc>
+#include "annotationwindow.hxx"
+#include "annotationmanagerimpl.hxx"
+
+#include <com/sun/star/office/XAnnotation.hpp>
+#include <DrawDocShell.hxx>
+#include <ViewShell.hxx>
+#include <drawdoc.hxx>
+#include <textapi.hxx>
+#include <sdresid.hxx>
+
+#include <memory>
+
+using namespace ::sd;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::office;
+using namespace ::com::sun::star::text;
+
+#define METABUTTON_WIDTH 16
+#define METABUTTON_HEIGHT 18
+#define POSTIT_META_HEIGHT sal_Int32(30)
+
+namespace sd {
+
+void AnnotationTextWindow::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect)
+{
+ Size aSize = GetOutputSizePixel();
+
+ const bool bHighContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
+ if (!bHighContrast)
+ {
+ rRenderContext.DrawGradient(::tools::Rectangle(Point(0,0), rRenderContext.PixelToLogic(aSize)),
+ Gradient(GradientStyle::Linear, mrContents.maColorLight, mrContents.maColor));
+ }
+
+ DoPaint(rRenderContext, rRect);
+}
+
+void AnnotationTextWindow::EditViewScrollStateChange()
+{
+ mrContents.SetScrollbar();
+}
+
+bool AnnotationTextWindow::KeyInput(const KeyEvent& rKeyEvt)
+{
+ const vcl::KeyCode& rKeyCode = rKeyEvt.GetKeyCode();
+ sal_uInt16 nKey = rKeyCode.GetCode();
+
+ bool bDone = false;
+
+ if ((rKeyCode.IsMod1() && rKeyCode.IsMod2()) && ((nKey == KEY_PAGEUP) || (nKey == KEY_PAGEDOWN)))
+ {
+ SfxDispatcher* pDispatcher = mrContents.DocShell()->GetViewShell()->GetViewFrame()->GetDispatcher();
+ if( pDispatcher )
+ pDispatcher->Execute( nKey == KEY_PAGEDOWN ? SID_NEXT_POSTIT : SID_PREVIOUS_POSTIT );
+ bDone = true;
+ }
+ else if (nKey == KEY_INSERT)
+ {
+ if (!rKeyCode.IsMod1() && !rKeyCode.IsMod2())
+ mrContents.ToggleInsMode();
+ bDone = true;
+ }
+ else
+ {
+ ::tools::Long aOldHeight = mrContents.GetPostItTextHeight();
+
+ /// HACK: need to switch off processing of Undo/Redo in Outliner
+ if ( !( (nKey == KEY_Z || nKey == KEY_Y) && rKeyCode.IsMod1()) )
+ {
+ bool bIsProtected = mrContents.IsProtected();
+ if (!bIsProtected || !EditEngine::DoesKeyChangeText(rKeyEvt) )
+ {
+ if (EditView* pEditView = GetEditView())
+ {
+ bDone = pEditView->PostKeyEvent(rKeyEvt);
+ if (!bDone && rKeyEvt.GetKeyCode().IsMod1() && !rKeyEvt.GetKeyCode().IsMod2())
+ {
+ if (nKey == KEY_A)
+ {
+ EditEngine* pEditEngine = GetEditEngine();
+ sal_Int32 nPar = pEditEngine->GetParagraphCount();
+ if (nPar)
+ {
+ sal_Int32 nLen = pEditEngine->GetTextLen(nPar - 1);
+ pEditView->SetSelection(ESelection(0, 0, nPar - 1, nLen));
+ }
+ bDone = true;
+ }
+ }
+ }
+ }
+ }
+ if (bDone)
+ {
+ mrContents.ResizeIfNecessary(aOldHeight, mrContents.GetPostItTextHeight());
+ }
+ }
+
+ return bDone;
+}
+
+AnnotationTextWindow::AnnotationTextWindow(AnnotationWindow& rContents)
+ : mrContents(rContents)
+{
+}
+
+EditView* AnnotationTextWindow::GetEditView() const
+{
+ OutlinerView* pOutlinerView = mrContents.GetOutlinerView();
+ if (!pOutlinerView)
+ return nullptr;
+ return &pOutlinerView->GetEditView();
+}
+
+EditEngine* AnnotationTextWindow::GetEditEngine() const
+{
+ OutlinerView* pOutlinerView = mrContents.GetOutlinerView();
+ if (!pOutlinerView)
+ return nullptr;
+ return pOutlinerView->GetEditView().GetEditEngine();
+}
+
+void AnnotationTextWindow::SetDrawingArea(weld::DrawingArea* pDrawingArea)
+{
+ Size aSize(0, 0);
+ pDrawingArea->set_size_request(aSize.Width(), aSize.Height());
+
+ SetOutputSizePixel(aSize);
+
+ weld::CustomWidgetController::SetDrawingArea(pDrawingArea);
+
+ EnableRTL(false);
+
+ const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+ Color aBgColor = rStyleSettings.GetWindowColor();
+
+ OutputDevice& rDevice = pDrawingArea->get_ref_device();
+
+ rDevice.SetMapMode(MapMode(MapUnit::Map100thMM));
+ rDevice.SetBackground(aBgColor);
+
+ Size aOutputSize(rDevice.PixelToLogic(aSize));
+
+ EditView* pEditView = GetEditView();
+ pEditView->setEditViewCallbacks(this);
+
+ EditEngine* pEditEngine = GetEditEngine();
+ pEditEngine->SetPaperSize(aOutputSize);
+ pEditEngine->SetRefDevice(&rDevice);
+
+ pEditView->SetOutputArea(::tools::Rectangle(Point(0, 0), aOutputSize));
+ pEditView->SetBackgroundColor(aBgColor);
+
+ pDrawingArea->set_cursor(PointerStyle::Text);
+
+ InitAccessible();
+}
+
+// see SwAnnotationWin in sw for something similar
+AnnotationWindow::AnnotationWindow(weld::Window* pParent, const ::tools::Rectangle& rRect,
+ DrawDocShell* pDocShell,
+ const Reference<XAnnotation>& xAnnotation)
+ : mxBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/annotation.ui"))
+ , mxPopover(mxBuilder->weld_popover("Annotation"))
+ , mxContainer(mxBuilder->weld_widget("container"))
+ , mpDocShell(pDocShell)
+ , mpDoc(pDocShell->GetDoc())
+ , mbReadonly(pDocShell->IsReadOnly())
+ , mbProtected(false)
+{
+ mxContainer->set_size_request(320, 240);
+ mxPopover->popup_at_rect(pParent, rRect);
+
+ InitControls();
+ setAnnotation(xAnnotation);
+ FillMenuButton();
+
+ DoResize();
+
+ mxTextControl->GrabFocus();
+}
+
+AnnotationWindow::~AnnotationWindow()
+{
+}
+
+void AnnotationWindow::InitControls()
+{
+ // window control for author and date
+ mxMeta = mxBuilder->weld_label("meta");
+ mxMeta->set_direction(AllSettings::GetLayoutRTL());
+
+ maLabelFont = Application::GetSettings().GetStyleSettings().GetLabelFont();
+ maLabelFont.SetFontHeight(8);
+
+ // we should leave this setting alone, but for this we need a better layout algo
+ // with variable meta size height
+ mxMeta->set_font(maLabelFont);
+
+ mpOutliner.reset( new ::Outliner(GetAnnotationPool(),OutlinerMode::TextObject) );
+ SdDrawDocument::SetCalcFieldValueHdl( mpOutliner.get() );
+ mpOutliner->SetUpdateLayout( true );
+
+ if (OutputDevice* pDev = mpDoc->GetRefDevice())
+ mpOutliner->SetRefDevice( pDev );
+
+ mpOutlinerView.reset( new OutlinerView ( mpOutliner.get(), nullptr) );
+ mpOutliner->InsertView(mpOutlinerView.get() );
+
+ //create Scrollbars
+ mxVScrollbar = mxBuilder->weld_scrolled_window("scrolledwindow", true);
+
+ // actual window which holds the user text
+ mxTextControl.reset(new AnnotationTextWindow(*this));
+ mxTextControlWin.reset(new weld::CustomWeld(*mxBuilder, "editview", *mxTextControl));
+ mxTextControl->SetPointer(PointerStyle::Text);
+
+ Rescale();
+ OutputDevice& rDevice = mxTextControl->GetDrawingArea()->get_ref_device();
+
+ mxVScrollbar->set_direction(false);
+ mxVScrollbar->connect_vadjustment_changed(LINK(this, AnnotationWindow, ScrollHdl));
+
+ mpOutlinerView->SetBackgroundColor(COL_TRANSPARENT);
+ mpOutlinerView->SetOutputArea(rDevice.PixelToLogic(::tools::Rectangle(0, 0, 1, 1)));
+
+ mxMenuButton = mxBuilder->weld_menu_button("menubutton");
+ if (mbReadonly)
+ mxMenuButton->hide();
+ else
+ {
+ mxMenuButton->set_size_request(METABUTTON_WIDTH, METABUTTON_HEIGHT);
+ mxMenuButton->connect_selected(LINK(this, AnnotationWindow, MenuItemSelectedHdl));
+ }
+
+ EEControlBits nCntrl = mpOutliner->GetControlWord();
+ nCntrl |= EEControlBits::PASTESPECIAL | EEControlBits::AUTOCORRECT | EEControlBits::USECHARATTRIBS | EEControlBits::NOCOLORS;
+ mpOutliner->SetControlWord(nCntrl);
+
+ mpOutliner->SetModifyHdl( Link<LinkParamNone*,void>() );
+ mpOutliner->EnableUndo( false );
+
+ mpOutliner->ClearModifyFlag();
+ mpOutliner->GetUndoManager().Clear();
+ mpOutliner->EnableUndo( true );
+
+ SetLanguage(SvxLanguageItem(mpDoc->GetLanguage(EE_CHAR_LANGUAGE), SID_ATTR_LANGUAGE));
+
+ mxTextControl->GrabFocus();
+}
+
+IMPL_LINK(AnnotationWindow, MenuItemSelectedHdl, const OString&, rIdent, void)
+{
+ SfxDispatcher* pDispatcher = mpDocShell->GetViewShell()->GetViewFrame()->GetDispatcher();
+ if (!pDispatcher)
+ return;
+
+ if (rIdent == ".uno:ReplyToAnnotation")
+ {
+ const SfxUnoAnyItem aItem( SID_REPLYTO_POSTIT, Any( mxAnnotation ) );
+ pDispatcher->ExecuteList(SID_REPLYTO_POSTIT,
+ SfxCallMode::ASYNCHRON, { &aItem });
+ }
+ else if (rIdent == ".uno:DeleteAnnotation")
+ {
+ const SfxUnoAnyItem aItem( SID_DELETE_POSTIT, Any( mxAnnotation ) );
+ pDispatcher->ExecuteList(SID_DELETE_POSTIT, SfxCallMode::ASYNCHRON,
+ { &aItem });
+ }
+ else if (rIdent == ".uno:DeleteAllAnnotationByAuthor")
+ {
+ const SfxStringItem aItem( SID_DELETEALLBYAUTHOR_POSTIT, mxAnnotation->getAuthor() );
+ pDispatcher->ExecuteList( SID_DELETEALLBYAUTHOR_POSTIT,
+ SfxCallMode::ASYNCHRON, { &aItem });
+ }
+ else if (rIdent == ".uno:DeleteAllAnnotation")
+ pDispatcher->Execute( SID_DELETEALL_POSTIT );
+}
+
+void AnnotationWindow::FillMenuButton()
+{
+ SvtUserOptions aUserOptions;
+ OUString sCurrentAuthor( aUserOptions.GetFullName() );
+ OUString sAuthor( mxAnnotation->getAuthor() );
+
+ OUString aStr(mxMenuButton->get_item_label(".uno:DeleteAllAnnotationByAuthor"));
+ OUString aReplace( sAuthor );
+ if( aReplace.isEmpty() )
+ aReplace = SdResId( STR_ANNOTATION_NOAUTHOR );
+ aStr = aStr.replaceFirst("%1", aReplace);
+ mxMenuButton->set_item_label(".uno:DeleteAllAnnotationByAuthor", aStr);
+
+ bool bShowReply = sAuthor != sCurrentAuthor && !mbReadonly;
+ mxMenuButton->set_item_visible(".uno:ReplyToAnnotation", bShowReply);
+ mxMenuButton->set_item_visible("separator", bShowReply);
+ mxMenuButton->set_item_visible(".uno:DeleteAnnotation", mxAnnotation.is() && !mbReadonly);
+ mxMenuButton->set_item_visible(".uno:DeleteAllAnnotationByAuthor", !mbReadonly);
+ mxMenuButton->set_item_visible(".uno:DeleteAllAnnotation", !mbReadonly);
+}
+
+void AnnotationWindow::StartEdit()
+{
+ GetOutlinerView()->SetSelection(ESelection(EE_PARA_MAX_COUNT,EE_TEXTPOS_MAX_COUNT,EE_PARA_MAX_COUNT,EE_TEXTPOS_MAX_COUNT));
+ GetOutlinerView()->ShowCursor();
+}
+
+void AnnotationWindow::SetMapMode(const MapMode& rNewMapMode)
+{
+ OutputDevice& rDevice = mxTextControl->GetDrawingArea()->get_ref_device();
+ rDevice.SetMapMode(rNewMapMode);
+}
+
+void AnnotationWindow::Rescale()
+{
+ MapMode aMode(MapUnit::Map100thMM);
+ aMode.SetOrigin( Point() );
+ mpOutliner->SetRefMapMode( aMode );
+ SetMapMode( aMode );
+
+ if (mxMeta)
+ {
+ vcl::Font aFont = maLabelFont;
+ sal_Int32 nHeight = ::tools::Long(aFont.GetFontHeight() * aMode.GetScaleY());
+ aFont.SetFontHeight( nHeight );
+ mxMeta->set_font(aFont);
+ }
+}
+
+void AnnotationWindow::DoResize()
+{
+ OutputDevice& rDevice = mxTextControl->GetDrawingArea()->get_ref_device();
+
+ ::tools::Long aHeight = mxContainer->get_preferred_size().Height();
+ ::tools::ULong aWidth = mxContainer->get_preferred_size().Width();
+
+ aHeight -= POSTIT_META_HEIGHT;
+
+ mpOutliner->SetPaperSize( rDevice.PixelToLogic( Size(aWidth, aHeight) ) ) ;
+ ::tools::Long aTextHeight = rDevice.LogicToPixel(mpOutliner->CalcTextSize()).Height();
+
+ if( aTextHeight > aHeight )
+ {
+ const int nThickness = mxVScrollbar->get_scroll_thickness();
+ if (nThickness)
+ {
+ // we need vertical scrollbars and have to reduce the width
+ aWidth -= nThickness;
+ mpOutliner->SetPaperSize(rDevice.PixelToLogic(Size(aWidth, aHeight)));
+ }
+ mxVScrollbar->set_vpolicy(VclPolicyType::ALWAYS);
+ }
+ else
+ {
+ mxVScrollbar->set_vpolicy(VclPolicyType::NEVER);
+ }
+
+ ::tools::Rectangle aOutputArea = rDevice.PixelToLogic(::tools::Rectangle(0, 0, aWidth, aHeight));
+ if (mxVScrollbar->get_vpolicy() == VclPolicyType::NEVER)
+ {
+ // if we do not have a scrollbar anymore, we want to see the complete text
+ mpOutlinerView->SetVisArea(aOutputArea);
+ }
+ mpOutlinerView->SetOutputArea(aOutputArea);
+ mpOutlinerView->ShowCursor(true, true);
+
+ int nUpper = mpOutliner->GetTextHeight();
+ int nCurrentDocPos = mpOutlinerView->GetVisArea().Top();
+ int nStepIncrement = mpOutliner->GetTextHeight() / 10;
+ int nPageIncrement = rDevice.PixelToLogic(Size(0,aHeight)).Height() * 8 / 10;
+ int nPageSize = rDevice.PixelToLogic(Size(0,aHeight)).Height();
+
+ /* limit the page size to below nUpper because gtk's gtk_scrolled_window_start_deceleration has
+ effectively...
+
+ lower = gtk_adjustment_get_lower
+ upper = gtk_adjustment_get_upper - gtk_adjustment_get_page_size
+
+ and requires that upper > lower or the deceleration animation never ends
+ */
+ nPageSize = std::min(nPageSize, nUpper);
+
+ mxVScrollbar->vadjustment_configure(nCurrentDocPos, 0, nUpper,
+ nStepIncrement, nPageIncrement, nPageSize);
+}
+
+void AnnotationWindow::SetScrollbar()
+{
+ mxVScrollbar->vadjustment_set_value(mpOutlinerView->GetVisArea().Top());
+}
+
+void AnnotationWindow::ResizeIfNecessary(::tools::Long aOldHeight, ::tools::Long aNewHeight)
+{
+ if (aOldHeight != aNewHeight)
+ DoResize();
+ else
+ SetScrollbar();
+}
+
+void AnnotationWindow::SetLanguage(const SvxLanguageItem &aNewItem)
+{
+ mpOutliner->SetModifyHdl( Link<LinkParamNone*,void>() );
+ ESelection aOld = GetOutlinerView()->GetSelection();
+
+ ESelection aNewSelection( 0, 0, mpOutliner->GetParagraphCount()-1, EE_TEXTPOS_ALL );
+ GetOutlinerView()->SetSelection( aNewSelection );
+ SfxItemSet aEditAttr(GetOutlinerView()->GetAttribs());
+ aEditAttr.Put(aNewItem);
+ GetOutlinerView()->SetAttribs( aEditAttr );
+
+ GetOutlinerView()->SetSelection(aOld);
+
+ mxTextControl->Invalidate();
+}
+
+void AnnotationWindow::ToggleInsMode()
+{
+ if( mpOutlinerView )
+ {
+ SfxBindings &rBnd = mpDocShell->GetViewShell()->GetViewFrame()->GetBindings();
+ rBnd.Invalidate(SID_ATTR_INSERT);
+ rBnd.Update(SID_ATTR_INSERT);
+ }
+}
+
+::tools::Long AnnotationWindow::GetPostItTextHeight()
+{
+ OutputDevice& rDevice = mxTextControl->GetDrawingArea()->get_ref_device();
+ return mpOutliner ? rDevice.LogicToPixel(mpOutliner->CalcTextSize()).Height() : 0;
+}
+
+IMPL_LINK(AnnotationWindow, ScrollHdl, weld::ScrolledWindow&, rScrolledWindow, void)
+{
+ ::tools::Long nDiff = GetOutlinerView()->GetEditView().GetVisArea().Top() - rScrolledWindow.vadjustment_get_value();
+ GetOutlinerView()->Scroll( 0, nDiff );
+}
+
+TextApiObject* getTextApiObject( const Reference< XAnnotation >& xAnnotation )
+{
+ if( xAnnotation.is() )
+ {
+ Reference< XText > xText( xAnnotation->getTextRange() );
+ return TextApiObject::getImplementation( xText );
+ }
+ return nullptr;
+}
+
+void AnnotationWindow::setAnnotation( const Reference< XAnnotation >& xAnnotation )
+{
+ if( (xAnnotation == mxAnnotation) || !xAnnotation.is() )
+ return;
+
+ mxAnnotation = xAnnotation;
+
+ SetColor();
+
+ SvtUserOptions aUserOptions;
+ mbProtected = aUserOptions.GetFullName() != xAnnotation->getAuthor();
+
+ mpOutliner->Clear();
+ TextApiObject* pTextApi = getTextApiObject( mxAnnotation );
+
+ if( pTextApi )
+ {
+ std::optional< OutlinerParaObject > pOPO( pTextApi->CreateText() );
+ mpOutliner->SetText(*pOPO);
+ }
+
+ mpOutliner->ClearModifyFlag();
+ mpOutliner->GetUndoManager().Clear();
+
+//TODO Invalidate();
+
+ OUString sMeta( xAnnotation->getAuthor() );
+ OUString sDateTime( getAnnotationDateTimeString(xAnnotation) );
+
+ if( !sDateTime.isEmpty() )
+ {
+ if( !sMeta.isEmpty() )
+ sMeta += "\n";
+
+ sMeta += sDateTime;
+ }
+ mxMeta->set_label(sMeta);
+}
+
+void AnnotationWindow::SetColor()
+{
+ sal_uInt16 nAuthorIdx = mpDoc->GetAnnotationAuthorIndex( mxAnnotation->getAuthor() );
+
+ const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+ const bool bHighContrast = rStyleSettings.GetHighContrastMode();
+ if( bHighContrast )
+ {
+ maColor = rStyleSettings.GetWindowColor();
+ maColorDark = maColor;
+ maColorLight = rStyleSettings.GetWindowTextColor();
+ }
+ else
+ {
+ maColor = AnnotationManagerImpl::GetColor( nAuthorIdx );
+ maColorDark = AnnotationManagerImpl::GetColorDark( nAuthorIdx );
+ maColorLight = AnnotationManagerImpl::GetColorLight( nAuthorIdx );
+ }
+
+ {
+ SvtAccessibilityOptions aOptions;
+ mpOutliner->ForceAutoColor( bHighContrast || aOptions.GetIsAutomaticFontColor() );
+ }
+
+ mxPopover->set_background(maColor);
+ mxMenuButton->set_background(maColor);
+
+ mxMeta->set_font_color(bHighContrast ? maColorLight : maColorDark);
+
+ mxVScrollbar->customize_scrollbars(maColorLight,
+ maColorDark,
+ maColor);
+ mxVScrollbar->set_scroll_thickness(GetPrefScrollbarWidth());
+}
+
+void AnnotationWindow::SaveToDocument()
+{
+ Reference< XAnnotation > xAnnotation( mxAnnotation );
+
+ // write changed text back to annotation
+ if (mpOutliner->IsModified())
+ {
+ TextApiObject* pTextApi = getTextApiObject( xAnnotation );
+
+ if( pTextApi )
+ {
+ std::optional<OutlinerParaObject> pOPO = mpOutliner->CreateParaObject();
+ if( pOPO )
+ {
+ if( mpDoc->IsUndoEnabled() )
+ mpDoc->BegUndo( SdResId( STR_ANNOTATION_UNDO_EDIT ) );
+
+ pTextApi->SetText( *pOPO );
+ pOPO.reset();
+
+ // set current time to changed annotation
+ xAnnotation->setDateTime( getCurrentDateTime() );
+
+ if( mpDoc->IsUndoEnabled() )
+ mpDoc->EndUndo();
+
+ mpDocShell->SetModified();
+ }
+
+ }
+ }
+ mpOutliner->ClearModifyFlag();
+
+ mpOutliner->GetUndoManager().Clear();
+}
+
+bool AnnotationTextWindow::Command(const CommandEvent& rCEvt)
+{
+ if (rCEvt.GetCommand() == CommandEventId::ContextMenu)
+ {
+ const bool bReadOnly = mrContents.DocShell()->IsReadOnly();
+ if (bReadOnly)
+ return true;
+
+ SfxDispatcher* pDispatcher = mrContents.DocShell()->GetViewShell()->GetViewFrame()->GetDispatcher();
+ if( !pDispatcher )
+ return true;
+
+ if (IsMouseCaptured())
+ {
+ // so the menu can capture it and the EditView doesn't get the button release and change its
+ // selection on a successful button click
+ ReleaseMouse();
+ }
+
+ ::tools::Rectangle aRect(rCEvt.GetMousePosPixel(), Size(1, 1));
+ weld::Widget* pPopupParent = GetDrawingArea();
+ std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(pPopupParent, "modules/simpress/ui/annotationtagmenu.ui"));
+ std::unique_ptr<weld::Menu> xMenu(xBuilder->weld_menu("menu"));
+
+ auto xAnnotation = mrContents.getAnnotation();
+
+ SvtUserOptions aUserOptions;
+ OUString sCurrentAuthor( aUserOptions.GetFullName() );
+ OUString sAuthor( xAnnotation->getAuthor() );
+
+ OUString aStr(xMenu->get_label(".uno:DeleteAllAnnotationByAuthor"));
+ OUString aReplace( sAuthor );
+ if( aReplace.isEmpty() )
+ aReplace = SdResId( STR_ANNOTATION_NOAUTHOR );
+ aStr = aStr.replaceFirst("%1", aReplace);
+ xMenu->set_label(".uno:DeleteAllAnnotationByAuthor", aStr);
+
+ bool bShowReply = sAuthor != sCurrentAuthor && !bReadOnly;
+ xMenu->set_visible(".uno:ReplyToAnnotation", bShowReply);
+ xMenu->set_visible("separator", bShowReply);
+ xMenu->set_visible(".uno:DeleteAnnotation", xAnnotation.is() && !bReadOnly);
+ xMenu->set_visible(".uno:DeleteAllAnnotationByAuthor", !bReadOnly);
+ xMenu->set_visible(".uno:DeleteAllAnnotation", !bReadOnly);
+
+ int nInsertPos = 2;
+
+ auto xFrame = mrContents.DocShell()->GetViewShell()->GetViewFrame()->GetFrame().GetFrameInterface();
+ OUString aModuleName(vcl::CommandInfoProvider::GetModuleIdentifier(xFrame));
+
+ bool bEditable = !mrContents.IsProtected() && !bReadOnly;
+ if (bEditable)
+ {
+ SfxItemSet aSet(mrContents.GetOutlinerView()->GetAttribs());
+
+ xMenu->insert(nInsertPos++, ".uno:Bold",
+ vcl::CommandInfoProvider::GetMenuLabelForCommand(
+ vcl::CommandInfoProvider::GetCommandProperties(".uno:Bold", aModuleName)),
+ nullptr, nullptr, vcl::CommandInfoProvider::GetXGraphicForCommand(".uno:Bold", xFrame),
+ TRISTATE_TRUE);
+
+ if ( aSet.GetItemState( EE_CHAR_WEIGHT ) == SfxItemState::SET )
+ {
+ if( aSet.Get( EE_CHAR_WEIGHT ).GetWeight() == WEIGHT_BOLD )
+ xMenu->set_active(".uno:Bold", true);
+ }
+
+ xMenu->insert(nInsertPos++, ".uno:Italic",
+ vcl::CommandInfoProvider::GetMenuLabelForCommand(
+ vcl::CommandInfoProvider::GetCommandProperties(".uno:Italic", aModuleName)),
+ nullptr, nullptr, vcl::CommandInfoProvider::GetXGraphicForCommand(".uno:Italic", xFrame),
+ TRISTATE_TRUE);
+
+ if ( aSet.GetItemState( EE_CHAR_ITALIC ) == SfxItemState::SET )
+ {
+ if( aSet.Get( EE_CHAR_ITALIC ).GetPosture() != ITALIC_NONE )
+ xMenu->set_active(".uno:Italic", true);
+
+ }
+
+ xMenu->insert(nInsertPos++, ".uno:Underline",
+ vcl::CommandInfoProvider::GetMenuLabelForCommand(
+ vcl::CommandInfoProvider::GetCommandProperties(".uno:Underline", aModuleName)),
+ nullptr, nullptr, vcl::CommandInfoProvider::GetXGraphicForCommand(".uno:Underline", xFrame),
+ TRISTATE_TRUE);
+
+ if ( aSet.GetItemState( EE_CHAR_UNDERLINE ) == SfxItemState::SET )
+ {
+ if( aSet.Get( EE_CHAR_UNDERLINE ).GetLineStyle() != LINESTYLE_NONE )
+ xMenu->set_active(".uno:Underline", true);
+ }
+
+ xMenu->insert(nInsertPos++, ".uno:Strikeout",
+ vcl::CommandInfoProvider::GetMenuLabelForCommand(
+ vcl::CommandInfoProvider::GetCommandProperties(".uno:Strikeout", aModuleName)),
+ nullptr, nullptr, vcl::CommandInfoProvider::GetXGraphicForCommand(".uno:Strikeout", xFrame),
+ TRISTATE_TRUE);
+
+ if ( aSet.GetItemState( EE_CHAR_STRIKEOUT ) == SfxItemState::SET )
+ {
+ if( aSet.Get( EE_CHAR_STRIKEOUT ).GetStrikeout() != STRIKEOUT_NONE )
+ xMenu->set_active(".uno:Strikeout", true);
+ }
+
+ xMenu->insert_separator(nInsertPos++, "separator2");
+ }
+
+ xMenu->insert(nInsertPos++, ".uno:Copy",
+ vcl::CommandInfoProvider::GetMenuLabelForCommand(
+ vcl::CommandInfoProvider::GetCommandProperties(".uno:Copy", aModuleName)),
+ nullptr, nullptr, vcl::CommandInfoProvider::GetXGraphicForCommand(".uno:Copy", xFrame),
+ TRISTATE_INDET);
+
+ xMenu->insert(nInsertPos++, ".uno:Paste",
+ vcl::CommandInfoProvider::GetMenuLabelForCommand(
+ vcl::CommandInfoProvider::GetCommandProperties(".uno:Paste", aModuleName)),
+ nullptr, nullptr, vcl::CommandInfoProvider::GetXGraphicForCommand(".uno:Paste", xFrame),
+ TRISTATE_INDET);
+
+ bool bCanPaste = false;
+ if (bEditable)
+ {
+ TransferableDataHelper aDataHelper(TransferableDataHelper::CreateFromClipboard(GetClipboard()));
+ bCanPaste = aDataHelper.GetFormatCount() != 0;
+ }
+
+ xMenu->insert_separator(nInsertPos++, "separator3");
+
+ xMenu->set_sensitive(".uno:Copy", mrContents.GetOutlinerView()->HasSelection());
+ xMenu->set_sensitive(".uno:Paste", bCanPaste);
+
+ auto sId = xMenu->popup_at_rect(pPopupParent, aRect);
+
+ if (sId == ".uno:ReplyToAnnotation")
+ {
+ const SfxUnoAnyItem aItem( SID_REPLYTO_POSTIT, Any( xAnnotation ) );
+ pDispatcher->ExecuteList(SID_REPLYTO_POSTIT,
+ SfxCallMode::ASYNCHRON, { &aItem });
+ }
+ else if (sId == ".uno:DeleteAnnotation")
+ {
+ const SfxUnoAnyItem aItem( SID_DELETE_POSTIT, Any( xAnnotation ) );
+ pDispatcher->ExecuteList(SID_DELETE_POSTIT, SfxCallMode::ASYNCHRON,
+ { &aItem });
+ }
+ else if (sId == ".uno:DeleteAllAnnotationByAuthor")
+ {
+ const SfxStringItem aItem( SID_DELETEALLBYAUTHOR_POSTIT, sAuthor );
+ pDispatcher->ExecuteList( SID_DELETEALLBYAUTHOR_POSTIT,
+ SfxCallMode::ASYNCHRON, { &aItem });
+ }
+ else if (sId == ".uno:DeleteAllAnnotation")
+ pDispatcher->Execute( SID_DELETEALL_POSTIT );
+ else if (sId == ".uno:Copy")
+ {
+ mrContents.GetOutlinerView()->Copy();
+ }
+ else if (sId == ".uno:Paste")
+ {
+ mrContents.GetOutlinerView()->PasteSpecial();
+ mrContents.DoResize();
+ }
+ else if (!sId.isEmpty())
+ {
+ SfxItemSet aEditAttr(mrContents.GetOutlinerView()->GetAttribs());
+ SfxItemSet aNewAttr(mrContents.GetOutliner()->GetEmptyItemSet());
+
+ if (sId == ".uno:Bold")
+ {
+ FontWeight eFW = aEditAttr.Get( EE_CHAR_WEIGHT ).GetWeight();
+ aNewAttr.Put( SvxWeightItem( eFW == WEIGHT_NORMAL ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
+ }
+ else if (sId == ".uno:Italic")
+ {
+ FontItalic eFI = aEditAttr.Get( EE_CHAR_ITALIC ).GetPosture();
+ aNewAttr.Put( SvxPostureItem( eFI == ITALIC_NORMAL ? ITALIC_NONE : ITALIC_NORMAL, EE_CHAR_ITALIC ) );
+ }
+ else if (sId == ".uno:Underline")
+ {
+ FontLineStyle eFU = aEditAttr. Get( EE_CHAR_UNDERLINE ).GetLineStyle();
+ aNewAttr.Put( SvxUnderlineItem( eFU == LINESTYLE_SINGLE ? LINESTYLE_NONE : LINESTYLE_SINGLE, EE_CHAR_UNDERLINE ) );
+ }
+ else if (sId == ".uno:Strikeout")
+ {
+ FontStrikeout eFSO = aEditAttr.Get( EE_CHAR_STRIKEOUT ).GetStrikeout();
+ aNewAttr.Put( SvxCrossedOutItem( eFSO == STRIKEOUT_SINGLE ? STRIKEOUT_NONE : STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT ) );
+ }
+
+ mrContents.GetOutlinerView()->SetAttribs( aNewAttr );
+ }
+
+ return true;
+ }
+ return WeldEditView::Command(rCEvt);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/annotations/annotationwindow.hxx b/sd/source/ui/annotations/annotationwindow.hxx
new file mode 100644
index 000000000..558cc6165
--- /dev/null
+++ b/sd/source/ui/annotations/annotationwindow.hxx
@@ -0,0 +1,143 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/weld.hxx>
+#include <tools/long.hxx>
+#include <svx/weldeditview.hxx>
+
+namespace com::sun::star::office { class XAnnotation; }
+
+class OutlinerView;
+class Outliner;
+class SvxLanguageItem;
+class SdDrawDocument;
+
+namespace sd {
+
+class AnnotationManagerImpl;
+class DrawDocShell;
+class TextApiObject;
+
+class AnnotationWindow;
+
+class AnnotationTextWindow : public WeldEditView
+{
+private:
+ AnnotationWindow& mrContents;
+
+public:
+ AnnotationTextWindow(AnnotationWindow& rContents);
+
+ virtual EditView* GetEditView() const override;
+
+ virtual EditEngine* GetEditEngine() const override;
+
+ virtual void EditViewScrollStateChange() override;
+
+ void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
+
+ virtual void Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect) override;
+ virtual bool KeyInput(const KeyEvent& rKeyEvt) override;
+ virtual bool Command(const CommandEvent& rCEvt) override;
+};
+
+class AnnotationWindow final
+{
+private:
+ std::unique_ptr<weld::Builder> mxBuilder;
+ std::unique_ptr<weld::Popover> mxPopover;
+ std::unique_ptr<weld::Widget> mxContainer;
+
+ DrawDocShell* mpDocShell;
+ SdDrawDocument* mpDoc;
+
+ bool mbReadonly;
+ bool mbProtected;
+
+ css::uno::Reference< css::office::XAnnotation > mxAnnotation;
+
+public:
+ Color maColor;
+ Color maColorDark;
+ Color maColorLight;
+
+private:
+ vcl::Font maLabelFont;
+
+ std::unique_ptr<OutlinerView> mpOutlinerView;
+ std::unique_ptr<::Outliner> mpOutliner;
+
+ std::unique_ptr<weld::ScrolledWindow> mxVScrollbar;
+ std::unique_ptr<WeldEditView> mxTextControl;
+ std::unique_ptr<weld::CustomWeld> mxTextControlWin;
+ std::unique_ptr<weld::Label> mxMeta;
+ std::unique_ptr<weld::MenuButton> mxMenuButton;
+
+ DECL_LINK(ScrollHdl, weld::ScrolledWindow&, void);
+ DECL_LINK(MenuItemSelectedHdl, const OString&, void);
+
+ void FillMenuButton();
+ void InitControls();
+
+ void SetMapMode(const MapMode& rNewMapMode);
+ void setAnnotation(const css::uno::Reference<css::office::XAnnotation>& xAnnotation);
+
+ static sal_Int32 GetPrefScrollbarWidth() { return 16; }
+public:
+ AnnotationWindow(weld::Window* pParent, const ::tools::Rectangle& rRect, DrawDocShell* pDocShell,
+ const css::uno::Reference<css::office::XAnnotation>& xAnnotation);
+
+ void connect_closed(const Link<weld::Popover&, void>& rLink) { mxPopover->connect_closed(rLink); }
+
+ void DoResize();
+ void ResizeIfNecessary(::tools::Long aOldHeight, ::tools::Long aNewHeight);
+ void SetScrollbar();
+ void StartEdit();
+
+ const css::uno::Reference<css::office::XAnnotation>& getAnnotation() const { return mxAnnotation; }
+
+ void SaveToDocument();
+
+ ::tools::Long GetPostItTextHeight();
+
+ DrawDocShell* DocShell() { return mpDocShell; }
+
+ void SetLanguage(const SvxLanguageItem &aNewItem);
+
+ void Rescale();
+
+ void ToggleInsMode();
+
+ bool IsProtected() const { return mbProtected; }
+
+ OutlinerView* GetOutlinerView() { return mpOutlinerView.get();}
+ ::Outliner* GetOutliner() { return mpOutliner.get();}
+ ~AnnotationWindow();
+
+ void SetColor();
+};
+
+TextApiObject* getTextApiObject( const css::uno::Reference< css::office::XAnnotation >& xAnnotation );
+
+
+} // namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/app/optsitem.cxx b/sd/source/ui/app/optsitem.cxx
new file mode 100644
index 000000000..5baff32e2
--- /dev/null
+++ b/sd/source/ui/app/optsitem.cxx
@@ -0,0 +1,1407 @@
+/* -*- 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 <o3tl/any.hxx>
+#include <svx/svdmodel.hxx>
+#include <svx/svxids.hrc>
+#include <tools/debug.hxx>
+#include <tools/helpers.hxx>
+#include <unotools/localedatawrapper.hxx>
+#include <unotools/syslocale.hxx>
+#include <osl/diagnose.h>
+
+#include <optsitem.hxx>
+#include <FrameView.hxx>
+#include <sdattr.hrc>
+
+using namespace ::utl;
+using namespace ::com::sun::star::uno;
+
+template< class T > static T getSafeValue( const Any& rAny )
+{
+ T value = T();
+ bool bOk = (rAny >>= value);
+
+ DBG_ASSERT( bOk, "SdOptionsItem, wrong type from configuration!" );
+
+ return value;
+}
+
+
+SdOptionsItem::SdOptionsItem( const SdOptionsGeneric& rParent, const OUString& rSubTree ) :
+ ConfigItem ( rSubTree ),
+ mrParent ( rParent )
+{
+}
+
+SdOptionsItem::~SdOptionsItem()
+{
+}
+
+void SdOptionsItem::ImplCommit()
+{
+ if( IsModified() )
+ mrParent.Commit( *this );
+};
+
+void SdOptionsItem::Notify( const css::uno::Sequence<OUString>& )
+{}
+
+Sequence< Any > SdOptionsItem::GetProperties( const Sequence< OUString >& rNames )
+{
+ return ConfigItem::GetProperties( rNames );
+}
+
+bool SdOptionsItem::PutProperties( const Sequence< OUString >& rNames, const Sequence< Any>& rValues )
+{
+ return ConfigItem::PutProperties( rNames, rValues );
+}
+
+SdOptionsGeneric::SdOptionsGeneric(bool bImpress, const OUString& rSubTree)
+ : maSubTree(rSubTree)
+ , mbImpress(bImpress)
+ , mbInit(rSubTree.isEmpty())
+ , mbEnableModify(false)
+{
+}
+
+SdOptionsGeneric::SdOptionsGeneric(SdOptionsGeneric const & rSource)
+{
+ operator=(rSource);
+}
+
+SdOptionsGeneric& SdOptionsGeneric::operator=(SdOptionsGeneric const & rSource)
+{
+ if (this != &rSource)
+ {
+ maSubTree = rSource.maSubTree;
+ mpCfgItem.reset(rSource.mpCfgItem ? new SdOptionsItem(*rSource.mpCfgItem) : nullptr );
+ mbImpress = rSource.mbImpress;
+ mbInit = rSource.mbInit;
+ mbEnableModify = rSource.mbEnableModify;
+ }
+ return *this;
+}
+
+void SdOptionsGeneric::Init() const
+{
+ if( mbInit )
+ return;
+
+ SdOptionsGeneric* pThis = const_cast<SdOptionsGeneric*>(this);
+
+ if( !mpCfgItem )
+ pThis->mpCfgItem.reset( new SdOptionsItem( *this, maSubTree ) );
+ assert(mpCfgItem && "mpCfgItem is set by now");
+
+ const Sequence< OUString > aNames( GetPropertyNames() );
+ const Sequence< Any > aValues = mpCfgItem->GetProperties( aNames );
+
+ if( aNames.hasElements() && ( aValues.getLength() == aNames.getLength() ) )
+ {
+ const Any* pValues = aValues.getConstArray();
+
+ pThis->EnableModify( false );
+ pThis->mbInit = pThis->ReadData( pValues );
+ pThis->EnableModify( true );
+ }
+ else
+ pThis->mbInit = true;
+}
+
+SdOptionsGeneric::~SdOptionsGeneric()
+{
+}
+
+void SdOptionsGeneric::Commit( SdOptionsItem& rCfgItem ) const
+{
+ const Sequence< OUString > aNames( GetPropertyNames() );
+ Sequence< Any > aValues( aNames.getLength() );
+
+ if( aNames.hasElements() )
+ {
+ if( WriteData( aValues.getArray() ) )
+ rCfgItem.PutProperties( aNames, aValues );
+ else
+ {
+ OSL_FAIL( "PutProperties failed" );
+ }
+ }
+}
+
+Sequence< OUString > SdOptionsGeneric::GetPropertyNames() const
+{
+ sal_uLong nCount;
+ const char** ppPropNames;
+
+ GetPropNameArray( ppPropNames, nCount );
+
+ Sequence< OUString > aNames( nCount );
+ OUString* pNames = aNames.getArray();
+
+ for( sal_uLong i = 0; i < nCount; i++ )
+ pNames[ i ] = OUString::createFromAscii( ppPropNames[ i ] );
+
+ return aNames;
+}
+
+void SdOptionsGeneric::Store()
+{
+ if( mpCfgItem )
+ mpCfgItem->Commit();
+}
+
+bool SdOptionsGeneric::isMetricSystem()
+{
+ SvtSysLocale aSysLocale;
+ MeasurementSystem eSys = aSysLocale.GetLocaleData().getMeasurementSystemEnum();
+
+ return ( eSys == MeasurementSystem::Metric );
+}
+
+/*************************************************************************
+|*
+|* SdOptionsLayout
+|*
+\************************************************************************/
+
+SdOptionsLayout::SdOptionsLayout(bool bImpress, bool bUseConfig) :
+ SdOptionsGeneric( bImpress, bUseConfig ?
+ ( bImpress ?
+ OUString( "Office.Impress/Layout" ) :
+ OUString( "Office.Draw/Layout" ) ) :
+ OUString() ),
+ bRuler( true ),
+ bMoveOutline( true ),
+ bDragStripes( false ),
+ bHandlesBezier( false ),
+ bHelplines( true ),
+ nMetric(static_cast<sal_uInt16>(isMetricSystem() ? FieldUnit::CM : FieldUnit::INCH)),
+ nDefTab( 1250 )
+{
+ EnableModify( true );
+}
+
+bool SdOptionsLayout::operator==( const SdOptionsLayout& rOpt ) const
+{
+ return( IsRulerVisible() == rOpt.IsRulerVisible() &&
+ IsMoveOutline() == rOpt.IsMoveOutline() &&
+ IsDragStripes() == rOpt.IsDragStripes() &&
+ IsHandlesBezier() == rOpt.IsHandlesBezier() &&
+ IsHelplines() == rOpt.IsHelplines() &&
+ GetMetric() == rOpt.GetMetric() &&
+ GetDefTab() == rOpt.GetDefTab() );
+}
+
+void SdOptionsLayout::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const
+{
+ if( isMetricSystem() )
+ {
+ static const char* aPropNamesMetric[] =
+ {
+ "Display/Ruler",
+ "Display/Bezier",
+ "Display/Contour",
+ "Display/Guide",
+ "Display/Helpline",
+ "Other/MeasureUnit/Metric",
+ "Other/TabStop/Metric"
+ };
+ ppNames = aPropNamesMetric;
+ rCount = SAL_N_ELEMENTS(aPropNamesMetric);
+ }
+ else
+ {
+ static const char* aPropNamesNonMetric[] =
+ {
+ "Display/Ruler",
+ "Display/Bezier",
+ "Display/Contour",
+ "Display/Guide",
+ "Display/Helpline",
+ "Other/MeasureUnit/NonMetric",
+ "Other/TabStop/NonMetric"
+ };
+ ppNames = aPropNamesNonMetric;
+ rCount = SAL_N_ELEMENTS(aPropNamesNonMetric);
+ }
+}
+
+bool SdOptionsLayout::ReadData( const Any* pValues )
+{
+ if( pValues[0].hasValue() ) SetRulerVisible( *o3tl::doAccess<bool>(pValues[ 0 ]) );
+ if( pValues[1].hasValue() ) SetHandlesBezier( *o3tl::doAccess<bool>(pValues[ 1 ]) );
+ if( pValues[2].hasValue() ) SetMoveOutline( *o3tl::doAccess<bool>(pValues[ 2 ]) );
+ if( pValues[3].hasValue() ) SetDragStripes( *o3tl::doAccess<bool>(pValues[ 3 ]) );
+ if( pValues[4].hasValue() ) SetHelplines( *o3tl::doAccess<bool>(pValues[ 4 ]) );
+ if( pValues[5].hasValue() ) SetMetric( static_cast<sal_uInt16>(*o3tl::doAccess<sal_Int32>(pValues[ 5 ])) );
+ if( pValues[6].hasValue() ) SetDefTab( static_cast<sal_uInt16>(*o3tl::doAccess<sal_Int32>(pValues[ 6 ])) );
+
+ return true;
+}
+
+bool SdOptionsLayout::WriteData( Any* pValues ) const
+{
+ pValues[ 0 ] <<= IsRulerVisible();
+ pValues[ 1 ] <<= IsHandlesBezier();
+ pValues[ 2 ] <<= IsMoveOutline();
+ pValues[ 3 ] <<= IsDragStripes();
+ pValues[ 4 ] <<= IsHelplines();
+ pValues[ 5 ] <<= static_cast<sal_Int32>(GetMetric());
+ pValues[ 6 ] <<= static_cast<sal_Int32>(GetDefTab());
+
+ return true;
+}
+
+/*************************************************************************
+|*
+|* SdOptionsLayoutItem
+|*
+\************************************************************************/
+
+SdOptionsLayoutItem::SdOptionsLayoutItem()
+: SfxPoolItem ( ATTR_OPTIONS_LAYOUT )
+, maOptionsLayout ( false, false )
+{
+}
+
+SdOptionsLayoutItem::SdOptionsLayoutItem( SdOptions const * pOpts, ::sd::FrameView const * pView )
+: SfxPoolItem ( ATTR_OPTIONS_LAYOUT )
+, maOptionsLayout ( false, false )
+{
+ if( pOpts )
+ {
+ maOptionsLayout.SetMetric( pOpts->GetMetric() );
+ maOptionsLayout.SetDefTab( pOpts->GetDefTab() );
+ }
+
+ if( pView )
+ {
+ maOptionsLayout.SetRulerVisible( pView->HasRuler() );
+ maOptionsLayout.SetMoveOutline( !pView->IsNoDragXorPolys() );
+ maOptionsLayout.SetDragStripes( pView->IsDragStripes() );
+ maOptionsLayout.SetHandlesBezier( pView->IsPlusHandlesAlwaysVisible() );
+ maOptionsLayout.SetHelplines( pView->IsHlplVisible() );
+ }
+ else if( pOpts )
+ {
+ maOptionsLayout.SetRulerVisible( pOpts->IsRulerVisible() );
+ maOptionsLayout.SetMoveOutline( pOpts->IsMoveOutline() );
+ maOptionsLayout.SetDragStripes( pOpts->IsDragStripes() );
+ maOptionsLayout.SetHandlesBezier( pOpts->IsHandlesBezier() );
+ maOptionsLayout.SetHelplines( pOpts->IsHelplines() );
+ }
+}
+
+SdOptionsLayoutItem* SdOptionsLayoutItem::Clone( SfxItemPool* ) const
+{
+ return new SdOptionsLayoutItem( *this );
+}
+
+bool SdOptionsLayoutItem::operator==( const SfxPoolItem& rAttr ) const
+{
+ assert(SfxPoolItem::operator==(rAttr));
+ return maOptionsLayout == static_cast<const SdOptionsLayoutItem&>(rAttr).maOptionsLayout;
+}
+
+void SdOptionsLayoutItem::SetOptions( SdOptions* pOpts ) const
+{
+ if( pOpts )
+ {
+ pOpts->SetRulerVisible( maOptionsLayout.IsRulerVisible() );
+ pOpts->SetMoveOutline( maOptionsLayout.IsMoveOutline() );
+ pOpts->SetDragStripes( maOptionsLayout.IsDragStripes() );
+ pOpts->SetHandlesBezier( maOptionsLayout.IsHandlesBezier() );
+ pOpts->SetHelplines( maOptionsLayout.IsHelplines() );
+ pOpts->SetMetric( maOptionsLayout.GetMetric() );
+ pOpts->SetDefTab( maOptionsLayout.GetDefTab() );
+ }
+}
+
+/*************************************************************************
+|*
+|* SdOptionsContents
+|*
+\************************************************************************/
+
+SdOptionsContents::SdOptionsContents(bool bImpress) :
+ SdOptionsGeneric( bImpress, bImpress ?
+ OUString( "Office.Impress/Content" ) :
+ OUString( "Office.Draw/Content" ) )
+{
+ EnableModify( true );
+}
+
+bool SdOptionsContents::operator==(const SdOptionsContents&) const
+{
+ return true;
+}
+
+void SdOptionsContents::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const
+{
+ static const char* aPropNames[] =
+ {
+ "Display/PicturePlaceholder",
+ "Display/ContourMode",
+ "Display/LineContour",
+ "Display/TextPlaceholder"
+ };
+
+ rCount = SAL_N_ELEMENTS(aPropNames);
+ ppNames = aPropNames;
+}
+
+bool SdOptionsContents::ReadData(const Any*)
+{
+ return true;
+}
+
+bool SdOptionsContents::WriteData( Any* pValues ) const
+{
+ //#i80528# no draft anymore
+ pValues[ 0 ] <<= false;
+ pValues[ 1 ] <<= false;
+ pValues[ 2 ] <<= false;
+ pValues[ 3 ] <<= false;
+
+ return true;
+}
+/*************************************************************************
+|*
+|* SdOptionsMisc
+|*
+\************************************************************************/
+
+SdOptionsMisc::SdOptionsMisc( bool bImpress, bool bUseConfig ) :
+ SdOptionsGeneric( bImpress, bUseConfig ?
+ ( bImpress ?
+ OUString( "Office.Impress/Misc" ) :
+ OUString( "Office.Draw/Misc" ) ) :
+ OUString() ),
+ nDefaultObjectSizeWidth(8000),
+ nDefaultObjectSizeHeight(5000),
+ bStartWithTemplate( false ),
+ bMarkedHitMovesAlways( true ),
+ bMoveOnlyDragging( false ),
+ bCrookNoContortion( false ),
+ bQuickEdit( IsImpress() ),
+ bMasterPageCache( true ),
+ bDragWithCopy( false ),
+ bPickThrough( true ),
+ bDoubleClickTextEdit( true ),
+ bClickChangeRotation( false ),
+ bEnableSdremote( false ),
+ bEnablePresenterScreen( true),
+ bSolidDragging( true ),
+ bSummationOfParagraphs( false ),
+ bTabBarVisible( true ),
+ bShowUndoDeleteWarning( true ),
+ bSlideshowRespectZOrder( true ),
+ bShowComments( true ),
+ bPreviewNewEffects( true ),
+ bPreviewChangedEffects( false ),
+ bPreviewTransitions( true ),
+ mnDisplay( 0 ),
+ mnPenColor( 0xff0000 ),
+ mnPenWidth( 150.0 ),
+
+ // The default for 6.1-and-above documents is to use printer-independent
+ // formatting.
+ mnPrinterIndependentLayout (1)
+{
+ EnableModify( true );
+}
+
+bool SdOptionsMisc::operator==( const SdOptionsMisc& rOpt ) const
+{
+ return( IsStartWithTemplate() == rOpt.IsStartWithTemplate() &&
+ IsMarkedHitMovesAlways() == rOpt.IsMarkedHitMovesAlways() &&
+ IsMoveOnlyDragging() == rOpt.IsMoveOnlyDragging() &&
+ IsCrookNoContortion() == rOpt.IsCrookNoContortion() &&
+ IsQuickEdit() == rOpt.IsQuickEdit() &&
+ IsMasterPagePaintCaching() == rOpt.IsMasterPagePaintCaching() &&
+ IsDragWithCopy() == rOpt.IsDragWithCopy() &&
+ IsPickThrough() == rOpt.IsPickThrough() &&
+ IsDoubleClickTextEdit() == rOpt.IsDoubleClickTextEdit() &&
+ IsClickChangeRotation() == rOpt.IsClickChangeRotation() &&
+ IsEnableSdremote() == rOpt.IsEnableSdremote() &&
+ IsEnablePresenterScreen() == rOpt.IsEnablePresenterScreen()&&
+ IsSummationOfParagraphs() == rOpt.IsSummationOfParagraphs() &&
+ IsTabBarVisible() == rOpt.IsTabBarVisible() &&
+ IsSolidDragging() == rOpt.IsSolidDragging() &&
+ IsShowUndoDeleteWarning() == rOpt.IsShowUndoDeleteWarning() &&
+ IsSlideshowRespectZOrder() == rOpt.IsSlideshowRespectZOrder() &&
+ GetPrinterIndependentLayout() == rOpt.GetPrinterIndependentLayout() &&
+ GetDefaultObjectSizeWidth() == rOpt.GetDefaultObjectSizeWidth() &&
+ GetDefaultObjectSizeHeight() == rOpt.GetDefaultObjectSizeHeight() &&
+
+ IsPreviewNewEffects() == rOpt.IsPreviewNewEffects() &&
+ IsPreviewChangedEffects() == rOpt.IsPreviewChangedEffects() &&
+ IsPreviewTransitions() == rOpt.IsPreviewTransitions() &&
+ GetDisplay() == rOpt.GetDisplay() &&
+ IsShowComments() == rOpt.IsShowComments() &&
+ GetPresentationPenColor() == rOpt.GetPresentationPenColor() &&
+ GetPresentationPenWidth() == rOpt.GetPresentationPenWidth()
+ );
+}
+
+void SdOptionsMisc::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const
+{
+ static const char* aPropNames[] =
+ {
+ "ObjectMoveable",
+ "NoDistort",
+ "TextObject/QuickEditing",
+ "BackgroundCache",
+ "CopyWhileMoving",
+ "TextObject/Selectable",
+ "DclickTextedit",
+ "RotateClick",
+ "Preview",
+ "ModifyWithAttributes",
+ "DefaultObjectSize/Width",
+ "DefaultObjectSize/Height",
+
+ "Compatibility/PrinterIndependentLayout",
+
+ "ShowComments",
+
+ // just for impress
+ "NewDoc/AutoPilot",
+ "Compatibility/AddBetween",
+ "ShowUndoDeleteWarning",
+ "SlideshowRespectZOrder",
+
+ "PreviewNewEffects",
+ "PreviewChangedEffects",
+ "PreviewTransitions",
+
+ "Display",
+
+ "PenColor",
+ "PenWidth",
+ "Start/EnableSdremote",
+ "Start/EnablePresenterScreen",
+ "TabBarVisible"
+ };
+
+ rCount = ( IsImpress() ? SAL_N_ELEMENTS(aPropNames) : 14 );
+ ppNames = aPropNames;
+}
+
+bool SdOptionsMisc::ReadData( const Any* pValues )
+{
+ if( pValues[0].hasValue() ) SetMarkedHitMovesAlways( *o3tl::doAccess<bool>(pValues[ 0 ]) );
+ if( pValues[1].hasValue() ) SetCrookNoContortion( *o3tl::doAccess<bool>(pValues[ 1 ]) );
+ if( pValues[2].hasValue() ) SetQuickEdit( *o3tl::doAccess<bool>(pValues[ 2 ]) );
+ if( pValues[3].hasValue() ) SetMasterPagePaintCaching( *o3tl::doAccess<bool>(pValues[ 3 ]) );
+ if( pValues[4].hasValue() ) SetDragWithCopy( *o3tl::doAccess<bool>(pValues[ 4 ]) );
+ if( pValues[5].hasValue() ) SetPickThrough( *o3tl::doAccess<bool>(pValues[ 5 ]) );
+ if( pValues[6].hasValue() ) SetDoubleClickTextEdit( *o3tl::doAccess<bool>(pValues[ 6 ]) );
+ if( pValues[7].hasValue() ) SetClickChangeRotation( *o3tl::doAccess<bool>(pValues[ 7 ]) );
+ if( pValues[9].hasValue() ) SetSolidDragging( *o3tl::doAccess<bool>(pValues[ 9 ]) );
+ if( pValues[10].hasValue() ) SetDefaultObjectSizeWidth( *o3tl::doAccess<sal_Int32>(pValues[ 10 ]) );
+ if( pValues[11].hasValue() ) SetDefaultObjectSizeHeight( *o3tl::doAccess<sal_Int32>(pValues[ 11 ]) );
+ if( pValues[12].hasValue() ) SetPrinterIndependentLayout( *o3tl::doAccess<sal_uInt16>(pValues[ 12 ]) );
+
+ if( pValues[13].hasValue() )
+ SetShowComments( *o3tl::doAccess<bool>(pValues[ 13 ]) );
+
+ // just for Impress
+ if (IsImpress())
+ {
+ if( pValues[14].hasValue() )
+ SetStartWithTemplate( *o3tl::doAccess<bool>(pValues[ 14 ]) );
+ if( pValues[15].hasValue() )
+ SetSummationOfParagraphs( *o3tl::doAccess<bool>(pValues[ 15 ]) );
+ if( pValues[16].hasValue() )
+ SetShowUndoDeleteWarning( *o3tl::doAccess<bool>(pValues[ 16 ]) );
+
+ if( pValues[17].hasValue() )
+ SetSlideshowRespectZOrder(*o3tl::doAccess<bool>(pValues[ 17 ]));
+
+ if( pValues[18].hasValue() )
+ SetPreviewNewEffects(*o3tl::doAccess<bool>(pValues[ 18 ]));
+
+ if( pValues[19].hasValue() )
+ SetPreviewChangedEffects(*o3tl::doAccess<bool>(pValues[ 19 ]));
+
+ if( pValues[20].hasValue() )
+ SetPreviewTransitions(*o3tl::doAccess<bool>(pValues[ 20 ]));
+
+ if( pValues[21].hasValue() )
+ SetDisplay(*o3tl::doAccess<sal_Int32>(pValues[ 21 ]));
+
+ if( pValues[22].hasValue() )
+ SetPresentationPenColor( getSafeValue< sal_Int32 >( pValues[ 22 ] ) );
+
+ if( pValues[23].hasValue() )
+ SetPresentationPenWidth( getSafeValue< double >( pValues[ 23 ] ) );
+
+ if( pValues[24].hasValue() )
+ SetEnableSdremote( *o3tl::doAccess<bool>(pValues[ 24 ]) );
+
+ if( pValues[25].hasValue() )
+ SetEnablePresenterScreen( *o3tl::doAccess<bool>(pValues[ 25 ]) );
+
+ if( pValues[26].hasValue() ) {
+ SetTabBarVisible( *o3tl::doAccess<bool>(pValues[ 26 ]) );
+ }
+ }
+
+ return true;
+}
+
+bool SdOptionsMisc::WriteData( Any* pValues ) const
+{
+ pValues[ 0 ] <<= IsMarkedHitMovesAlways();
+ pValues[ 1 ] <<= IsCrookNoContortion();
+ pValues[ 2 ] <<= IsQuickEdit();
+ pValues[ 3 ] <<= IsMasterPagePaintCaching();
+ pValues[ 4 ] <<= IsDragWithCopy();
+ pValues[ 5 ] <<= IsPickThrough();
+ pValues[ 6 ] <<= IsDoubleClickTextEdit();
+ pValues[ 7 ] <<= IsClickChangeRotation();
+ // The preview is not supported anymore. Use a dummy value.
+ pValues[ 8 ] <<= double(0);// GetPreviewQuality();
+ pValues[ 9 ] <<= IsSolidDragging();
+ pValues[ 10 ] <<= GetDefaultObjectSizeWidth();
+ pValues[ 11 ] <<= GetDefaultObjectSizeHeight();
+ pValues[ 12 ] <<= GetPrinterIndependentLayout();
+ pValues[ 13 ] <<= IsShowComments();
+
+ // just for Impress
+ if (IsImpress())
+ {
+ pValues[ 14 ] <<= IsStartWithTemplate();
+ pValues[ 15 ] <<= IsSummationOfParagraphs();
+ pValues[ 16 ] <<= IsShowUndoDeleteWarning();
+ pValues[ 17 ] <<= IsSlideshowRespectZOrder();
+
+ pValues[ 18 ] <<= IsPreviewNewEffects();
+ pValues[ 19 ] <<= IsPreviewChangedEffects();
+ pValues[ 20 ] <<= IsPreviewTransitions();
+
+ pValues[ 21 ] <<= GetDisplay();
+
+ pValues[ 22 ] <<= GetPresentationPenColor();
+ pValues[ 23 ] <<= GetPresentationPenWidth();
+ pValues[ 24 ] <<= IsEnableSdremote();
+ pValues[ 25 ] <<= IsEnablePresenterScreen();
+ pValues[ 26 ] <<= IsTabBarVisible();
+ }
+
+ return true;
+}
+
+/*************************************************************************
+|*
+|* SdOptionsMiscItem
+|*
+\************************************************************************/
+
+SdOptionsMiscItem::SdOptionsMiscItem()
+: SfxPoolItem ( ATTR_OPTIONS_MISC )
+, maOptionsMisc ( false, false )
+{
+}
+
+SdOptionsMiscItem::SdOptionsMiscItem( SdOptions const * pOpts, ::sd::FrameView const * pView )
+: SfxPoolItem ( ATTR_OPTIONS_MISC )
+, maOptionsMisc ( false, false )
+{
+ if( pOpts )
+ {
+ maOptionsMisc.SetStartWithTemplate( pOpts->IsStartWithTemplate() );
+ maOptionsMisc.SetEnableSdremote( pOpts->IsEnableSdremote() );
+ maOptionsMisc.SetEnablePresenterScreen( pOpts->IsEnablePresenterScreen() );
+ maOptionsMisc.SetSummationOfParagraphs( pOpts->IsSummationOfParagraphs() );
+ maOptionsMisc.SetTabBarVisible( pOpts->IsTabBarVisible() );
+ maOptionsMisc.SetShowUndoDeleteWarning( pOpts->IsShowUndoDeleteWarning() );
+ maOptionsMisc.SetPrinterIndependentLayout( pOpts->GetPrinterIndependentLayout() );
+ maOptionsMisc.SetDefaultObjectSizeWidth( pOpts->GetDefaultObjectSizeWidth() );
+ maOptionsMisc.SetDefaultObjectSizeHeight( pOpts->GetDefaultObjectSizeHeight() );
+
+ maOptionsMisc.SetPreviewNewEffects(pOpts->IsPreviewNewEffects());
+ maOptionsMisc.SetPreviewChangedEffects(pOpts->IsPreviewChangedEffects());
+ maOptionsMisc.SetPreviewTransitions(pOpts->IsPreviewTransitions());
+
+ maOptionsMisc.SetDisplay(pOpts->GetDisplay());
+ maOptionsMisc.SetShowComments( pOpts->IsShowComments() );
+
+ maOptionsMisc.SetPresentationPenColor(pOpts->GetPresentationPenColor() );
+ maOptionsMisc.SetPresentationPenWidth(pOpts->GetPresentationPenWidth() );
+ }
+
+ if( pView )
+ {
+ maOptionsMisc.SetMarkedHitMovesAlways( pView->IsMarkedHitMovesAlways() );
+ maOptionsMisc.SetMoveOnlyDragging( pView->IsMoveOnlyDragging() );
+ maOptionsMisc.SetCrookNoContortion( pView->IsCrookNoContortion() );
+ maOptionsMisc.SetQuickEdit( pView->IsQuickEdit() );
+
+ // #i26631#
+ maOptionsMisc.SetMasterPagePaintCaching( pView->IsMasterPagePaintCaching() );
+
+ maOptionsMisc.SetDragWithCopy( pView->IsDragWithCopy() );
+ maOptionsMisc.SetPickThrough( pView->GetModel()->IsPickThroughTransparentTextFrames() );
+ maOptionsMisc.SetDoubleClickTextEdit( pView->IsDoubleClickTextEdit() );
+ maOptionsMisc.SetClickChangeRotation( pView->IsClickChangeRotation() );
+ maOptionsMisc.SetSolidDragging( pView->IsSolidDragging() );
+ }
+ else if( pOpts )
+ {
+ maOptionsMisc.SetMarkedHitMovesAlways( pOpts->IsMarkedHitMovesAlways() );
+ maOptionsMisc.SetMoveOnlyDragging( pOpts->IsMoveOnlyDragging() );
+ maOptionsMisc.SetCrookNoContortion( pOpts->IsCrookNoContortion() );
+ maOptionsMisc.SetQuickEdit( pOpts->IsQuickEdit() );
+ maOptionsMisc.SetMasterPagePaintCaching( pOpts->IsMasterPagePaintCaching() );
+ maOptionsMisc.SetDragWithCopy( pOpts->IsDragWithCopy() );
+ maOptionsMisc.SetPickThrough( pOpts->IsPickThrough() );
+ maOptionsMisc.SetDoubleClickTextEdit( pOpts->IsDoubleClickTextEdit() );
+ maOptionsMisc.SetClickChangeRotation( pOpts->IsClickChangeRotation() );
+ maOptionsMisc.SetSolidDragging( pOpts->IsSolidDragging() );
+ }
+}
+
+SdOptionsMiscItem* SdOptionsMiscItem::Clone( SfxItemPool* ) const
+{
+ return new SdOptionsMiscItem( *this );
+}
+
+bool SdOptionsMiscItem::operator==( const SfxPoolItem& rAttr ) const
+{
+ assert(SfxPoolItem::operator==(rAttr));
+ return maOptionsMisc == static_cast<const SdOptionsMiscItem&>(rAttr).maOptionsMisc;
+}
+
+void SdOptionsMiscItem::SetOptions( SdOptions* pOpts ) const
+{
+ if( !pOpts )
+ return;
+
+ pOpts->SetStartWithTemplate( maOptionsMisc.IsStartWithTemplate() );
+ pOpts->SetMarkedHitMovesAlways( maOptionsMisc.IsMarkedHitMovesAlways() );
+ pOpts->SetMoveOnlyDragging( maOptionsMisc.IsMoveOnlyDragging() );
+ pOpts->SetCrookNoContortion( maOptionsMisc.IsCrookNoContortion() );
+ pOpts->SetQuickEdit( maOptionsMisc.IsQuickEdit() );
+ pOpts->SetMasterPagePaintCaching( maOptionsMisc.IsMasterPagePaintCaching() );
+ pOpts->SetDragWithCopy( maOptionsMisc.IsDragWithCopy() );
+ pOpts->SetPickThrough( maOptionsMisc.IsPickThrough() );
+ pOpts->SetDoubleClickTextEdit( maOptionsMisc.IsDoubleClickTextEdit() );
+ pOpts->SetClickChangeRotation( maOptionsMisc.IsClickChangeRotation() );
+ pOpts->SetEnableSdremote( maOptionsMisc.IsEnableSdremote() );
+ pOpts->SetEnablePresenterScreen( maOptionsMisc.IsEnablePresenterScreen() );
+ pOpts->SetSummationOfParagraphs( maOptionsMisc.IsSummationOfParagraphs() );
+ pOpts->SetTabBarVisible( maOptionsMisc.IsTabBarVisible() );
+
+ pOpts->SetSolidDragging( maOptionsMisc.IsSolidDragging() );
+ pOpts->SetShowUndoDeleteWarning( maOptionsMisc.IsShowUndoDeleteWarning() );
+ pOpts->SetPrinterIndependentLayout( maOptionsMisc.GetPrinterIndependentLayout() );
+ pOpts->SetShowComments( maOptionsMisc.IsShowComments() );
+ pOpts->SetDefaultObjectSizeWidth( maOptionsMisc.GetDefaultObjectSizeWidth() );
+ pOpts->SetDefaultObjectSizeHeight( maOptionsMisc.GetDefaultObjectSizeHeight() );
+
+ pOpts->SetPreviewNewEffects( maOptionsMisc.IsPreviewNewEffects() );
+ pOpts->SetPreviewChangedEffects( maOptionsMisc.IsPreviewChangedEffects() );
+ pOpts->SetPreviewTransitions( maOptionsMisc.IsPreviewTransitions() );
+
+ pOpts->SetDisplay( maOptionsMisc.GetDisplay() );
+
+ pOpts->SetPresentationPenColor( maOptionsMisc.GetPresentationPenColor() );
+ pOpts->SetPresentationPenWidth( maOptionsMisc.GetPresentationPenWidth() );
+}
+
+/*************************************************************************
+|*
+|* SdOptionsSnap
+|*
+\************************************************************************/
+
+SdOptionsSnap::SdOptionsSnap( bool bImpress, bool bUseConfig ) :
+ SdOptionsGeneric( bImpress, bUseConfig ?
+ ( bImpress ?
+ OUString( "Office.Impress/Snap" ) :
+ OUString( "Office.Draw/Snap" ) ) :
+ OUString() ),
+ bSnapHelplines( true ),
+ bSnapBorder( true ),
+ bSnapFrame( false ),
+ bSnapPoints( false ),
+ bOrtho( false ),
+ bBigOrtho( true ),
+ bRotate( false ),
+ nSnapArea( 5 ),
+ nAngle( 1500 ),
+ nBezAngle( 1500 )
+
+{
+ EnableModify( true );
+}
+
+bool SdOptionsSnap::operator==( const SdOptionsSnap& rOpt ) const
+{
+ return( IsSnapHelplines() == rOpt.IsSnapHelplines() &&
+ IsSnapBorder() == rOpt.IsSnapBorder() &&
+ IsSnapFrame() == rOpt.IsSnapFrame() &&
+ IsSnapPoints() == rOpt.IsSnapPoints() &&
+ IsOrtho() == rOpt.IsOrtho() &&
+ IsBigOrtho() == rOpt.IsBigOrtho() &&
+ IsRotate() == rOpt.IsRotate() &&
+ GetSnapArea() == rOpt.GetSnapArea() &&
+ GetAngle() == rOpt.GetAngle() &&
+ GetEliminatePolyPointLimitAngle() == rOpt.GetEliminatePolyPointLimitAngle() );
+}
+
+void SdOptionsSnap::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const
+{
+ static const char* aPropNames[] =
+ {
+ "Object/SnapLine",
+ "Object/PageMargin",
+ "Object/ObjectFrame",
+ "Object/ObjectPoint",
+ "Position/CreatingMoving",
+ "Position/ExtendEdges",
+ "Position/Rotating",
+ "Object/Range",
+ "Position/RotatingValue",
+ "Position/PointReduction"
+ };
+
+ rCount = SAL_N_ELEMENTS(aPropNames);
+ ppNames = aPropNames;
+}
+
+bool SdOptionsSnap::ReadData( const Any* pValues )
+{
+ if( pValues[0].hasValue() ) SetSnapHelplines( *o3tl::doAccess<bool>(pValues[ 0 ]) );
+ if( pValues[1].hasValue() ) SetSnapBorder( *o3tl::doAccess<bool>(pValues[ 1 ]) );
+ if( pValues[2].hasValue() ) SetSnapFrame( *o3tl::doAccess<bool>(pValues[ 2 ]) );
+ if( pValues[3].hasValue() ) SetSnapPoints( *o3tl::doAccess<bool>(pValues[ 3 ]) );
+ if( pValues[4].hasValue() ) SetOrtho( *o3tl::doAccess<bool>(pValues[ 4 ]) );
+ if( pValues[5].hasValue() ) SetBigOrtho( *o3tl::doAccess<bool>(pValues[ 5 ]) );
+ if( pValues[6].hasValue() ) SetRotate( *o3tl::doAccess<bool>(pValues[ 6 ]) );
+ if( pValues[7].hasValue() ) SetSnapArea( static_cast<sal_Int16>(*o3tl::doAccess<sal_Int32>(pValues[ 7 ])) );
+ if( pValues[8].hasValue() ) SetAngle( Degree100(*o3tl::doAccess<sal_Int32>(pValues[ 8 ])) );
+ if( pValues[9].hasValue() ) SetEliminatePolyPointLimitAngle( Degree100(*o3tl::doAccess<sal_Int32>(pValues[ 9 ])) );
+
+ return true;
+}
+
+bool SdOptionsSnap::WriteData( Any* pValues ) const
+{
+ pValues[ 0 ] <<= IsSnapHelplines();
+ pValues[ 1 ] <<= IsSnapBorder();
+ pValues[ 2 ] <<= IsSnapFrame();
+ pValues[ 3 ] <<= IsSnapPoints();
+ pValues[ 4 ] <<= IsOrtho();
+ pValues[ 5 ] <<= IsBigOrtho();
+ pValues[ 6 ] <<= IsRotate();
+ pValues[ 7 ] <<= static_cast<sal_Int32>(GetSnapArea());
+ pValues[ 8 ] <<= static_cast<sal_Int32>(GetAngle().get());
+ pValues[ 9 ] <<= static_cast<sal_Int32>(GetEliminatePolyPointLimitAngle().get());
+
+ return true;
+}
+
+/*************************************************************************
+|*
+|* SdOptionsSnapItem
+|*
+\************************************************************************/
+
+SdOptionsSnapItem::SdOptionsSnapItem()
+: SfxPoolItem ( ATTR_OPTIONS_SNAP )
+, maOptionsSnap ( false, false )
+{
+}
+
+SdOptionsSnapItem::SdOptionsSnapItem( SdOptions const * pOpts, ::sd::FrameView const * pView )
+: SfxPoolItem ( ATTR_OPTIONS_SNAP )
+, maOptionsSnap ( false, false )
+{
+ if( pView )
+ {
+ maOptionsSnap.SetSnapHelplines( pView->IsHlplSnap() );
+ maOptionsSnap.SetSnapBorder( pView->IsBordSnap() );
+ maOptionsSnap.SetSnapFrame( pView->IsOFrmSnap() );
+ maOptionsSnap.SetSnapPoints( pView->IsOPntSnap() );
+ maOptionsSnap.SetOrtho( pView->IsOrtho() );
+ maOptionsSnap.SetBigOrtho( pView->IsBigOrtho() );
+ maOptionsSnap.SetRotate( pView->IsAngleSnapEnabled() );
+ maOptionsSnap.SetSnapArea( pView->GetSnapMagneticPixel() );
+ maOptionsSnap.SetAngle( pView->GetSnapAngle() );
+ maOptionsSnap.SetEliminatePolyPointLimitAngle( pView->GetEliminatePolyPointLimitAngle() );
+ }
+ else if( pOpts )
+ {
+ maOptionsSnap.SetSnapHelplines( pOpts->IsSnapHelplines() );
+ maOptionsSnap.SetSnapBorder( pOpts->IsSnapBorder() );
+ maOptionsSnap.SetSnapFrame( pOpts->IsSnapFrame() );
+ maOptionsSnap.SetSnapPoints( pOpts->IsSnapPoints() );
+ maOptionsSnap.SetOrtho( pOpts->IsOrtho() );
+ maOptionsSnap.SetBigOrtho( pOpts->IsBigOrtho() );
+ maOptionsSnap.SetRotate( pOpts->IsRotate() );
+ maOptionsSnap.SetSnapArea( pOpts->GetSnapArea() );
+ maOptionsSnap.SetAngle( pOpts->GetAngle() );
+ maOptionsSnap.SetEliminatePolyPointLimitAngle( pOpts->GetEliminatePolyPointLimitAngle() );
+ }
+}
+
+SdOptionsSnapItem* SdOptionsSnapItem::Clone( SfxItemPool* ) const
+{
+ return new SdOptionsSnapItem( *this );
+}
+
+bool SdOptionsSnapItem::operator==( const SfxPoolItem& rAttr ) const
+{
+ assert(SfxPoolItem::operator==(rAttr));
+ return maOptionsSnap == static_cast<const SdOptionsSnapItem&>(rAttr).maOptionsSnap;
+}
+
+void SdOptionsSnapItem::SetOptions( SdOptions* pOpts ) const
+{
+ if( !pOpts )
+ return;
+
+ pOpts->SetSnapHelplines( maOptionsSnap.IsSnapHelplines() );
+ pOpts->SetSnapBorder( maOptionsSnap.IsSnapBorder() );
+ pOpts->SetSnapFrame( maOptionsSnap.IsSnapFrame() );
+ pOpts->SetSnapPoints( maOptionsSnap.IsSnapPoints() );
+ pOpts->SetOrtho( maOptionsSnap.IsOrtho() );
+ pOpts->SetBigOrtho( maOptionsSnap.IsBigOrtho() );
+ pOpts->SetRotate( maOptionsSnap.IsRotate() );
+ pOpts->SetSnapArea( maOptionsSnap.GetSnapArea() );
+ pOpts->SetAngle( maOptionsSnap.GetAngle() );
+ pOpts->SetEliminatePolyPointLimitAngle( maOptionsSnap.GetEliminatePolyPointLimitAngle() );
+}
+
+/*************************************************************************
+|*
+|* SdOptionsZoom
+|*
+\************************************************************************/
+
+SdOptionsZoom::SdOptionsZoom( bool bImpress ) :
+ SdOptionsGeneric( bImpress, bImpress ?
+ OUString() :
+ OUString("Office.Draw/Zoom") ),
+ nX( 1 ),
+ nY( 1 )
+
+{
+ EnableModify( true );
+}
+
+void SdOptionsZoom::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const
+{
+ static const char* aPropNames[] =
+ {
+ "ScaleX",
+ "ScaleY"
+ };
+
+ rCount = !IsImpress() ? SAL_N_ELEMENTS(aPropNames) : 0;
+ ppNames = aPropNames;
+}
+
+bool SdOptionsZoom::ReadData( const Any* pValues )
+{
+ sal_Int32 x = 1, y = 1;
+
+ if( pValues[0].hasValue() ) x = *o3tl::doAccess<sal_Int32>(pValues[ 0 ]);
+ if( pValues[1].hasValue() ) y = *o3tl::doAccess<sal_Int32>(pValues[ 1 ]);
+
+ SetScale( x, y );
+
+ return true;
+}
+
+bool SdOptionsZoom::WriteData( Any* pValues ) const
+{
+ sal_Int32 x, y;
+
+ GetScale( x, y );
+
+ pValues[ 0 ] <<= x;
+ pValues[ 1 ] <<= y;
+
+ return true;
+}
+
+/*************************************************************************
+|*
+|* SdOptionsGrid
+|*
+\************************************************************************/
+
+SdOptionsGrid::SdOptionsGrid(bool bImpress) :
+ SdOptionsGeneric( bImpress,
+ bImpress ?
+ OUString( "Office.Impress/Grid" ) :
+ OUString( "Office.Draw/Grid" )
+ )
+{
+ EnableModify( false );
+ SetDefaults();
+ EnableModify( true );
+}
+
+SdOptionsGrid::~SdOptionsGrid()
+{
+}
+
+void SdOptionsGrid::SetDefaults()
+{
+ const sal_uInt32 nVal = 1000;
+
+ SetFieldDivisionX( nVal );
+ SetFieldDivisionY( nVal );
+ SetFieldDrawX( nVal );
+ SetFieldDrawY( nVal );
+ SetFieldSnapX( nVal );
+ SetFieldSnapY( nVal );
+ SetUseGridSnap( false );
+ SetSynchronize( true );
+ SetGridVisible( false );
+ SetEqualGrid( true );
+}
+
+void SdOptionsGrid::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const
+{
+ if( isMetricSystem() )
+ {
+ static const char* aPropNamesMetric[] =
+ {
+ "Resolution/XAxis/Metric",
+ "Resolution/YAxis/Metric",
+ "Subdivision/XAxis",
+ "Subdivision/YAxis",
+ "SnapGrid/XAxis/Metric",
+ "SnapGrid/YAxis/Metric",
+ "Option/SnapToGrid",
+ "Option/Synchronize",
+ "Option/VisibleGrid",
+ "SnapGrid/Size"
+ };
+ ppNames = aPropNamesMetric;
+ rCount = SAL_N_ELEMENTS(aPropNamesMetric);
+ }
+ else
+ {
+ static const char* aPropNamesNonMetric[] =
+ {
+ "Resolution/XAxis/NonMetric",
+ "Resolution/YAxis/NonMetric",
+ "Subdivision/XAxis",
+ "Subdivision/YAxis",
+ "SnapGrid/XAxis/NonMetric",
+ "SnapGrid/YAxis/NonMetric",
+ "Option/SnapToGrid",
+ "Option/Synchronize",
+ "Option/VisibleGrid",
+ "SnapGrid/Size"
+ };
+ ppNames = aPropNamesNonMetric;
+ rCount = SAL_N_ELEMENTS(aPropNamesNonMetric);
+ }
+}
+
+bool SdOptionsGrid::ReadData( const Any* pValues )
+{
+ if( pValues[0].hasValue() ) SetFieldDrawX( *o3tl::doAccess<sal_Int32>(pValues[ 0 ]) );
+ if( pValues[1].hasValue() ) SetFieldDrawY( *o3tl::doAccess<sal_Int32>(pValues[ 1 ]) );
+
+ if( pValues[2].hasValue() )
+ {
+ const sal_uInt32 nDivX = FRound( *o3tl::doAccess<double>(pValues[ 2 ]) );
+ SetFieldDivisionX( SvxOptionsGrid::GetFieldDrawX() / ( nDivX + 1 ) );
+ }
+
+ if( pValues[3].hasValue() )
+ {
+ const sal_uInt32 nDivY = FRound( *o3tl::doAccess<double>(pValues[ 3 ]) );
+ SetFieldDivisionY( SvxOptionsGrid::GetFieldDrawY() / ( nDivY + 1 ) );
+ }
+
+ if( pValues[4].hasValue() ) SetFieldSnapX( *o3tl::doAccess<sal_Int32>(pValues[ 4 ]) );
+ if( pValues[5].hasValue() ) SetFieldSnapY( *o3tl::doAccess<sal_Int32>(pValues[ 5 ]) );
+ if( pValues[6].hasValue() ) SetUseGridSnap( *o3tl::doAccess<bool>(pValues[ 6 ]) );
+ if( pValues[7].hasValue() ) SetSynchronize( *o3tl::doAccess<bool>(pValues[ 7 ]) );
+ if( pValues[8].hasValue() ) SetGridVisible( *o3tl::doAccess<bool>(pValues[ 8 ]) );
+ if( pValues[9].hasValue() ) SetEqualGrid( *o3tl::doAccess<bool>(pValues[ 9 ]) );
+
+ return true;
+}
+
+bool SdOptionsGrid::WriteData( Any* pValues ) const
+{
+ pValues[ 0 ] <<= static_cast<sal_Int32>(GetFieldDrawX());
+ pValues[ 1 ] <<= static_cast<sal_Int32>(GetFieldDrawY());
+ pValues[ 2 ] <<= ( GetFieldDivisionX() ? ( static_cast<double>(GetFieldDrawX()) / GetFieldDivisionX() - 1.0 ) : double(0) );
+ pValues[ 3 ] <<= ( GetFieldDivisionY() ? ( static_cast<double>(GetFieldDrawY()) / GetFieldDivisionY() - 1.0 ) : double(0) );
+ pValues[ 4 ] <<= static_cast<sal_Int32>(GetFieldSnapX());
+ pValues[ 5 ] <<= static_cast<sal_Int32>(GetFieldSnapY());
+ pValues[ 6 ] <<= IsUseGridSnap();
+ pValues[ 7 ] <<= IsSynchronize();
+ pValues[ 8 ] <<= IsGridVisible();
+ pValues[ 9 ] <<= IsEqualGrid();
+
+ return true;
+}
+
+/*************************************************************************
+|*
+|* SdOptionsGridItem
+|*
+\************************************************************************/
+
+SdOptionsGridItem::SdOptionsGridItem( SdOptions const * pOpts ) :
+ SvxGridItem( SID_ATTR_GRID_OPTIONS )
+{
+ SetSynchronize( pOpts->IsSynchronize() );
+ SetEqualGrid( pOpts->IsEqualGrid() );
+
+ SetFieldDrawX( pOpts->GetFieldDrawX() );
+ SetFieldDrawY( pOpts->GetFieldDrawY() );
+ SetFieldDivisionX( pOpts->GetFieldDivisionX() ? ( pOpts->GetFieldDrawX() / pOpts->GetFieldDivisionX() - 1 ) : 0 );
+ SetFieldDivisionY( pOpts->GetFieldDivisionY() ? ( pOpts->GetFieldDrawY() / pOpts->GetFieldDivisionY() - 1 ) : 0 );
+ SetFieldSnapX( pOpts->GetFieldSnapX() );
+ SetFieldSnapY( pOpts->GetFieldSnapY() );
+ SetUseGridSnap( pOpts->IsUseGridSnap() );
+ SetGridVisible( pOpts->IsGridVisible() );
+}
+
+void SdOptionsGridItem::SetOptions( SdOptions* pOpts ) const
+{
+ pOpts->SetFieldDrawX( GetFieldDrawX() );
+ pOpts->SetFieldDivisionX( GetFieldDrawX() / ( GetFieldDivisionX() + 1 ) );
+ pOpts->SetFieldDrawY( GetFieldDrawY() );
+ pOpts->SetFieldDivisionY( GetFieldDrawY() / ( GetFieldDivisionY() + 1 ) );
+ pOpts->SetFieldSnapX( GetFieldSnapX() );
+ pOpts->SetFieldSnapY( GetFieldSnapY() );
+ pOpts->SetUseGridSnap( GetUseGridSnap() );
+ pOpts->SetSynchronize( GetSynchronize() );
+ pOpts->SetGridVisible( GetGridVisible() );
+ pOpts->SetEqualGrid( GetEqualGrid() );
+}
+
+/*************************************************************************
+|*
+|* SdOptionsPrint
+|*
+\************************************************************************/
+
+SdOptionsPrint::SdOptionsPrint( bool bImpress, bool bUseConfig ) :
+ SdOptionsGeneric( bImpress, bUseConfig ?
+ ( bImpress ?
+ OUString( "Office.Impress/Print" ) :
+ OUString( "Office.Draw/Print" ) ) :
+ OUString() ),
+ bDraw( true ),
+ bNotes( false ),
+ bHandout( false ),
+ bOutline( false ),
+ bDate( false ),
+ bTime( false ),
+ bPagename( false ),
+ bHiddenPages( true ),
+ bPagesize( false ),
+ bPagetile( false ),
+ bWarningPrinter( true ),
+ bWarningSize( false ),
+ bWarningOrientation( false ),
+ bBooklet( false ),
+ bFront( true ),
+ bBack( true ),
+ bCutPage( false ),
+ bPaperbin( false ),
+ mbHandoutHorizontal( true ),
+ mnHandoutPages( 6 ),
+ nQuality( 0 )
+{
+ EnableModify( true );
+}
+
+bool SdOptionsPrint::operator==( const SdOptionsPrint& rOpt ) const
+{
+ return( IsDraw() == rOpt.IsDraw() &&
+ IsNotes() == rOpt.IsNotes() &&
+ IsHandout() == rOpt.IsHandout() &&
+ IsOutline() == rOpt.IsOutline() &&
+ IsDate() == rOpt.IsDate() &&
+ IsTime() == rOpt.IsTime() &&
+ IsPagename() == rOpt.IsPagename() &&
+ IsHiddenPages() == rOpt.IsHiddenPages() &&
+ IsPagesize() == rOpt.IsPagesize() &&
+ IsPagetile() == rOpt.IsPagetile() &&
+ IsWarningPrinter() == rOpt.IsWarningPrinter() &&
+ IsWarningSize() == rOpt.IsWarningSize() &&
+ IsWarningOrientation() == rOpt.IsWarningOrientation() &&
+ IsBooklet() == rOpt.IsBooklet() &&
+ IsFrontPage() == rOpt.IsFrontPage() &&
+ IsBackPage() == rOpt.IsBackPage() &&
+ IsCutPage() == rOpt.IsCutPage() &&
+ IsPaperbin() == rOpt.IsPaperbin() &&
+ GetOutputQuality() == rOpt.GetOutputQuality() &&
+ IsHandoutHorizontal() == rOpt.IsHandoutHorizontal() &&
+ GetHandoutPages() == rOpt.GetHandoutPages() );
+}
+
+void SdOptionsPrint::GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const
+{
+ if (IsImpress())
+ {
+ static const char* aImpressPropNames[] =
+ {
+ "Other/Date",
+ "Other/Time",
+ "Other/PageName",
+ "Other/HiddenPage",
+ "Page/PageSize",
+ "Page/PageTile",
+ // bWarningPrinter
+ // bWarningSize
+ // bWarningOrientation
+ "Page/Booklet",
+ "Page/BookletFront",
+ "Page/BookletBack",
+ // bCutPage
+ "Other/FromPrinterSetup",
+ "Other/Quality",
+ "Content/Presentation",
+ "Content/Note",
+ "Content/Handout",
+ "Content/Outline",
+ "Other/HandoutHorizontal",
+ "Other/PagesPerHandout"
+ };
+ rCount = SAL_N_ELEMENTS(aImpressPropNames);
+ ppNames = aImpressPropNames;
+ }
+ else
+ {
+ static const char* aDrawPropNames[] =
+ {
+ "Other/Date",
+ "Other/Time",
+ "Other/PageName",
+ "Other/HiddenPage",
+ "Page/PageSize",
+ "Page/PageTile",
+ // bWarningPrinter
+ // bWarningSize
+ // bWarningOrientation
+ "Page/Booklet",
+ "Page/BookletFront",
+ "Page/BookletBack",
+ // bCutPage
+ "Other/FromPrinterSetup",
+ "Other/Quality",
+ "Content/Drawing",
+ };
+ rCount = SAL_N_ELEMENTS(aDrawPropNames);
+ ppNames = aDrawPropNames;
+ }
+}
+
+bool SdOptionsPrint::ReadData( const Any* pValues )
+{
+ if( pValues[0].hasValue() ) SetDate( *o3tl::doAccess<bool>(pValues[ 0 ]) );
+ if( pValues[1].hasValue() ) SetTime( *o3tl::doAccess<bool>(pValues[ 1 ]) );
+ if( pValues[2].hasValue() ) SetPagename( *o3tl::doAccess<bool>(pValues[ 2 ]) );
+ if( pValues[3].hasValue() ) SetHiddenPages( *o3tl::doAccess<bool>(pValues[ 3 ]) );
+ if( pValues[4].hasValue() ) SetPagesize( *o3tl::doAccess<bool>(pValues[ 4 ]) );
+ if( pValues[5].hasValue() ) SetPagetile( *o3tl::doAccess<bool>(pValues[ 5 ]) );
+ if( pValues[6].hasValue() ) SetBooklet( *o3tl::doAccess<bool>(pValues[ 6 ]) );
+ if( pValues[7].hasValue() ) SetFrontPage( *o3tl::doAccess<bool>(pValues[ 7 ]) );
+ if( pValues[8].hasValue() ) SetBackPage( *o3tl::doAccess<bool>(pValues[ 8 ]) );
+ if( pValues[9].hasValue() ) SetPaperbin( *o3tl::doAccess<bool>(pValues[ 9 ]) );
+ if( pValues[10].hasValue() ) SetOutputQuality( static_cast<sal_uInt16>(*o3tl::doAccess<sal_Int32>(pValues[ 10 ])) );
+ if( pValues[11].hasValue() ) SetDraw( *o3tl::doAccess<bool>(pValues[ 11 ]) );
+
+ // just for impress
+ if (IsImpress())
+ {
+ if( pValues[12].hasValue() ) SetNotes( *o3tl::doAccess<bool>(pValues[ 12 ]) );
+ if( pValues[13].hasValue() ) SetHandout( *o3tl::doAccess<bool>(pValues[ 13 ]) );
+ if( pValues[14].hasValue() ) SetOutline( *o3tl::doAccess<bool>(pValues[ 14 ]) );
+ if( pValues[15].hasValue() ) SetHandoutHorizontal( *o3tl::doAccess<bool>(pValues[15]) );
+ if( pValues[16].hasValue() ) SetHandoutPages( static_cast<sal_uInt16>(*o3tl::doAccess<sal_Int32>(pValues[16])) );
+ }
+
+ return true;
+}
+
+bool SdOptionsPrint::WriteData( Any* pValues ) const
+{
+ pValues[ 0 ] <<= IsDate();
+ pValues[ 1 ] <<= IsTime();
+ pValues[ 2 ] <<= IsPagename();
+ pValues[ 3 ] <<= IsHiddenPages();
+ pValues[ 4 ] <<= IsPagesize();
+ pValues[ 5 ] <<= IsPagetile();
+ pValues[ 6 ] <<= IsBooklet();
+ pValues[ 7 ] <<= IsFrontPage();
+ pValues[ 8 ] <<= IsBackPage();
+ pValues[ 9 ] <<= IsPaperbin();
+ pValues[ 10 ] <<= static_cast<sal_Int32>(GetOutputQuality());
+ pValues[ 11 ] <<= IsDraw();
+
+ // just for impress
+ if (IsImpress())
+ {
+ pValues[ 12 ] <<= IsNotes();
+ pValues[ 13 ] <<= IsHandout();
+ pValues[ 14 ] <<= IsOutline();
+ pValues[ 15 ] <<= IsHandoutHorizontal();
+ pValues[ 16 ] <<= GetHandoutPages();
+ }
+
+ return true;
+}
+
+/*************************************************************************
+|*
+|* SdOptionsPrintItem
+|*
+\************************************************************************/
+
+SdOptionsPrintItem::SdOptionsPrintItem()
+: SfxPoolItem ( ATTR_OPTIONS_PRINT )
+, maOptionsPrint ( false, false )
+{
+}
+
+SdOptionsPrintItem::SdOptionsPrintItem( SdOptions const * pOpts )
+: SfxPoolItem ( ATTR_OPTIONS_PRINT )
+, maOptionsPrint ( false, false )
+{
+ if( !pOpts )
+ return;
+
+ maOptionsPrint.SetDraw( pOpts->IsDraw() );
+ maOptionsPrint.SetNotes( pOpts->IsNotes() );
+ maOptionsPrint.SetHandout( pOpts->IsHandout() );
+ maOptionsPrint.SetOutline( pOpts->IsOutline() );
+ maOptionsPrint.SetDate( pOpts->IsDate() );
+ maOptionsPrint.SetTime( pOpts->IsTime() );
+ maOptionsPrint.SetPagename( pOpts->IsPagename() );
+ maOptionsPrint.SetHiddenPages( pOpts->IsHiddenPages() );
+ maOptionsPrint.SetPagesize( pOpts->IsPagesize() );
+ maOptionsPrint.SetPagetile( pOpts->IsPagetile() );
+ maOptionsPrint.SetWarningPrinter( pOpts->IsWarningPrinter() );
+ maOptionsPrint.SetWarningSize( pOpts->IsWarningSize() );
+ maOptionsPrint.SetWarningOrientation( pOpts->IsWarningOrientation() );
+ maOptionsPrint.SetBooklet( pOpts->IsBooklet() );
+ maOptionsPrint.SetFrontPage( pOpts->IsFrontPage() );
+ maOptionsPrint.SetBackPage( pOpts->IsBackPage() );
+ maOptionsPrint.SetCutPage( pOpts->IsCutPage() );
+ maOptionsPrint.SetPaperbin( pOpts->IsPaperbin() );
+ maOptionsPrint.SetOutputQuality( pOpts->GetOutputQuality() );
+}
+
+SdOptionsPrintItem* SdOptionsPrintItem::Clone( SfxItemPool* ) const
+{
+ return new SdOptionsPrintItem( *this );
+}
+
+bool SdOptionsPrintItem::operator==( const SfxPoolItem& rAttr ) const
+{
+ assert(SfxPoolItem::operator==(rAttr));
+ return maOptionsPrint == static_cast<const SdOptionsPrintItem&>(rAttr).maOptionsPrint;
+}
+
+void SdOptionsPrintItem::SetOptions( SdOptions* pOpts ) const
+{
+ if( !pOpts )
+ return;
+
+ pOpts->SetDraw( maOptionsPrint.IsDraw() );
+ pOpts->SetNotes( maOptionsPrint.IsNotes() );
+ pOpts->SetHandout( maOptionsPrint.IsHandout() );
+ pOpts->SetOutline( maOptionsPrint.IsOutline() );
+ pOpts->SetDate( maOptionsPrint.IsDate() );
+ pOpts->SetTime( maOptionsPrint.IsTime() );
+ pOpts->SetPagename( maOptionsPrint.IsPagename() );
+ pOpts->SetHiddenPages( maOptionsPrint.IsHiddenPages() );
+ pOpts->SetPagesize( maOptionsPrint.IsPagesize() );
+ pOpts->SetPagetile( maOptionsPrint.IsPagetile() );
+ pOpts->SetWarningPrinter( maOptionsPrint.IsWarningPrinter() );
+ pOpts->SetWarningSize( maOptionsPrint.IsWarningSize() );
+ pOpts->SetWarningOrientation( maOptionsPrint.IsWarningOrientation() );
+ pOpts->SetBooklet( maOptionsPrint.IsBooklet() );
+ pOpts->SetFrontPage( maOptionsPrint.IsFrontPage() );
+ pOpts->SetBackPage( maOptionsPrint.IsBackPage() );
+ pOpts->SetCutPage( maOptionsPrint.IsCutPage() );
+ pOpts->SetPaperbin( maOptionsPrint.IsPaperbin() );
+ pOpts->SetOutputQuality( maOptionsPrint.GetOutputQuality() );
+}
+
+/*************************************************************************
+|*
+|* SdOptions
+|*
+\************************************************************************/
+
+SdOptions::SdOptions(bool bImpress) :
+ SdOptionsLayout( bImpress, true ),
+ SdOptionsContents( bImpress ),
+ SdOptionsMisc( bImpress, true ),
+ SdOptionsSnap( bImpress, true ),
+ SdOptionsZoom( bImpress ),
+ SdOptionsGrid( bImpress ),
+ SdOptionsPrint( bImpress, true )
+{
+}
+
+SdOptions::~SdOptions()
+{
+}
+
+void SdOptions::StoreConfig()
+{
+ SdOptionsLayout::Store();
+ SdOptionsContents::Store();
+ SdOptionsMisc::Store();
+ SdOptionsSnap::Store();
+ SdOptionsZoom::Store();
+ SdOptionsGrid::Store();
+ SdOptionsPrint::Store();
+}
+
+sal_Int32 SdOptionsMisc::GetDisplay() const
+{
+ Init();
+ return mnDisplay;
+}
+
+void SdOptionsMisc::SetDisplay( sal_Int32 nDisplay )
+{
+ if( mnDisplay != nDisplay )
+ {
+ OptionsChanged();
+ mnDisplay = nDisplay;
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/app/scalectrl.cxx b/sd/source/ui/app/scalectrl.cxx
new file mode 100644
index 000000000..0444163b5
--- /dev/null
+++ b/sd/source/ui/app/scalectrl.cxx
@@ -0,0 +1,108 @@
+/* -*- 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 <scalectrl.hxx>
+
+#include <vcl/commandevent.hxx>
+#include <vcl/status.hxx>
+#include <vcl/weldutils.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svl/stritem.hxx>
+#include <sfx2/sfxsids.hrc>
+
+#include <ViewShellBase.hxx>
+#include <drawdoc.hxx>
+#include <app.hrc>
+#include <sdresid.hxx>
+#include <strings.hrc>
+
+SFX_IMPL_STATUSBAR_CONTROL(SdScaleControl, SfxStringItem);
+
+// class SdScaleControl ------------------------------------------
+SdScaleControl::SdScaleControl(sal_uInt16 _nSlotId, sal_uInt16 _nId, StatusBar& rStb)
+ : SfxStatusBarControl(_nSlotId, _nId, rStb)
+{
+ GetStatusBar().SetQuickHelpText(GetId(), SdResId(STR_SCALE_TOOLTIP));
+}
+
+SdScaleControl::~SdScaleControl() {}
+
+void SdScaleControl::StateChangedAtStatusBarControl(sal_uInt16 /*nSID*/, SfxItemState eState,
+ const SfxPoolItem* pState)
+{
+ if (eState != SfxItemState::DEFAULT || pState->IsVoidItem())
+ return;
+ auto pStringItem = dynamic_cast<const SfxStringItem*>(pState);
+ GetStatusBar().SetItemText(GetId(), pStringItem->GetValue());
+}
+
+void SdScaleControl::Command(const CommandEvent& rCEvt)
+{
+ if (rCEvt.GetCommand() != CommandEventId::ContextMenu
+ || GetStatusBar().GetItemText(GetId()).isEmpty())
+ return;
+
+ SfxViewFrame* pViewFrame = SfxViewFrame::Current();
+
+ sd::ViewShellBase* pViewShellBase = sd::ViewShellBase::GetViewShellBase(pViewFrame);
+ if (!pViewShellBase)
+ return;
+
+ SdDrawDocument* pDoc = pViewShellBase->GetDocument();
+ if (!pDoc)
+ return;
+
+ std::unique_ptr<weld::Builder> xBuilder(
+ Application::CreateBuilder(nullptr, "modules/simpress/ui/masterpagemenu.ui"));
+ std::unique_ptr<weld::Menu> xPopup(xBuilder->weld_menu("menu"));
+
+ sal_uInt16 aTable[12] = { 1, 2, 4, 5, 8, 10, 16, 20, 30, 40, 50, 100 };
+
+ for (sal_uInt16 i = 11; i > 0; i--)
+ xPopup->append(OUString::number(12 - i), OUString::number(aTable[i]) + ":1");
+ for (sal_uInt16 i = 0; i < 12; i++)
+ xPopup->append(OUString::number(12 + i), "1:" + OUString::number(aTable[i]));
+
+ ::tools::Rectangle aRect(rCEvt.GetMousePosPixel(), Size(1, 1));
+ weld::Window* pParent = weld::GetPopupParent(GetStatusBar(), aRect);
+ OString sResult = xPopup->popup_at_rect(pParent, aRect);
+ if (sResult.isEmpty())
+ return;
+
+ sal_Int32 i = sResult.toUInt32();
+ sal_Int32 nX;
+ sal_Int32 nY;
+ if (i > 11)
+ nX = 1;
+ else
+ nX = aTable[(12 - i) % 12];
+ if (i > 11)
+ nY = aTable[i % 12];
+ else
+ nY = 1;
+ pDoc->SetUIScale(Fraction(nX, nY));
+
+ SfxBindings& pBindings = pViewFrame->GetBindings();
+ pBindings.Invalidate(SID_SCALE); //update statusbar
+ pBindings.Invalidate(SID_ATTR_METRIC); //update sidebar
+ pViewShellBase->UpdateBorder(true); // update ruler
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/app/sddll.cxx b/sd/source/ui/app/sddll.cxx
new file mode 100644
index 000000000..4e20d0997
--- /dev/null
+++ b/sd/source/ui/app/sddll.cxx
@@ -0,0 +1,269 @@
+/* -*- 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 <config_features.h>
+
+#include <avmedia/mediaplayer.hxx>
+#include <avmedia/mediatoolbox.hxx>
+#include <unotools/configmgr.hxx>
+#include <unotools/moduleoptions.hxx>
+#include <svx/fmobjfac.hxx>
+#include <svx/objfac3d.hxx>
+#include <vcl/svapp.hxx>
+
+#include <registerinterfaces.hxx>
+#include <sddll.hxx>
+#include <app.hrc>
+#include <AnimationChildWindow.hxx>
+#include <BezierObjectBar.hxx>
+#include <diactrl.hxx>
+#include <DrawDocShell.hxx>
+#include <FactoryIds.hxx>
+#include <gluectrl.hxx>
+#include <GraphicDocShell.hxx>
+#include <GraphicObjectBar.hxx>
+#include <GraphicViewShell.hxx>
+#include <GraphicViewShellBase.hxx>
+#include <ImpressViewShellBase.hxx>
+#include <PresentationViewShell.hxx>
+#include <PresentationViewShellBase.hxx>
+#include <MediaObjectBar.hxx>
+#include <NavigatorChildWindow.hxx>
+#include <OutlineViewShell.hxx>
+#include <OutlineViewShellBase.hxx>
+#include <PaneChildWindows.hxx>
+#include <SpellDialogChildWindow.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <SlideSorterViewShellBase.hxx>
+#include <SdShapeTypes.hxx>
+#include <TextObjectBar.hxx>
+#include <tmplctrl.hxx>
+#include <scalectrl.hxx>
+
+#include <svx/svxids.hrc>
+#include <svx/bmpmask.hxx>
+#include <svx/clipboardctl.hxx>
+#include <svx/f3dchild.hxx>
+#include <svx/fillctrl.hxx>
+#include <svx/fontwork.hxx>
+#include <svx/formatpaintbrushctrl.hxx>
+#include <svx/grafctrl.hxx>
+#include <svx/hyperdlg.hxx>
+#include <svx/imapdlg.hxx>
+#include <svx/linectrl.hxx>
+#include <svx/modctrl.hxx>
+#include <svx/pszctrl.hxx>
+#include <svx/srchdlg.hxx>
+#include <svx/SvxColorChildWindow.hxx>
+#include <svx/xmlsecctrl.hxx>
+#include <svx/zoomctrl.hxx>
+#include <svx/zoomsliderctrl.hxx>
+#include <svx/tbxctl.hxx>
+#include <sfx2/sidebar/SidebarChildWindow.hxx>
+#include <sfx2/devtools/DevelopmentToolChildWindow.hxx>
+#include <comphelper/lok.hxx>
+#include <sdabstdlg.hxx>
+#include <sdfilter.hxx>
+#include <sdmod.hxx>
+
+using namespace ::com::sun::star;
+
+// Register all Factories
+void SdDLL::RegisterFactorys()
+{
+ if (utl::ConfigManager::IsFuzzing() || SvtModuleOptions().IsImpress())
+ {
+ ::sd::ImpressViewShellBase::RegisterFactory (
+ ::sd::IMPRESS_FACTORY_ID);
+ ::sd::SlideSorterViewShellBase::RegisterFactory (
+ ::sd::SLIDE_SORTER_FACTORY_ID);
+ ::sd::OutlineViewShellBase::RegisterFactory (
+ ::sd::OUTLINE_FACTORY_ID);
+ ::sd::PresentationViewShellBase::RegisterFactory (
+ ::sd::PRESENTATION_FACTORY_ID);
+ }
+ if (!utl::ConfigManager::IsFuzzing() && SvtModuleOptions().IsDraw())
+ {
+ ::sd::GraphicViewShellBase::RegisterFactory (::sd::DRAW_FACTORY_ID);
+ }
+}
+
+// Register all Interfaces
+
+void SdDLL::RegisterInterfaces(const SdModule* pMod)
+{
+ // Module
+ SdModule::RegisterInterface(pMod);
+
+ // View shell base.
+ ::sd::ViewShellBase::RegisterInterface(pMod);
+
+ // DocShells
+ ::sd::DrawDocShell::RegisterInterface(pMod);
+ ::sd::GraphicDocShell::RegisterInterface(pMod);
+
+ // Impress ViewShells
+ ::sd::DrawViewShell::RegisterInterface(pMod);
+ ::sd::OutlineViewShell::RegisterInterface(pMod);
+ ::sd::PresentationViewShell::RegisterInterface(pMod);
+
+ // Draw ViewShell
+ ::sd::GraphicViewShell::RegisterInterface(pMod);
+
+ // Impress ObjectShells
+ ::sd::BezierObjectBar::RegisterInterface(pMod);
+ ::sd::TextObjectBar::RegisterInterface(pMod);
+ ::sd::GraphicObjectBar::RegisterInterface(pMod);
+
+ // Media ObjectShell
+ ::sd::MediaObjectBar::RegisterInterface(pMod);
+
+ // Table ObjectShell
+ ::sd::ui::table::RegisterInterfaces(pMod);
+
+ // View shells for the side panes.
+ ::sd::slidesorter::SlideSorterViewShell::RegisterInterface (pMod);
+}
+
+// Register all Controllers
+
+void SdDLL::RegisterControllers(SdModule* pMod)
+{
+ SdTbxCtlDiaPages::RegisterControl( SID_PAGES_PER_ROW, pMod );
+ SdTbxCtlGlueEscDir::RegisterControl( SID_GLUE_ESCDIR, pMod );
+
+ ::sd::AnimationChildWindow::RegisterChildWindow(false, pMod);
+
+ Svx3DChildWindow::RegisterChildWindow(false, pMod);
+ SvxFontWorkChildWindow::RegisterChildWindow(false, pMod);
+ SvxColorChildWindow::RegisterChildWindow(false, pMod, SfxChildWindowFlags::TASK);
+ SvxSearchDialogWrapper::RegisterChildWindow(false, pMod);
+ SvxBmpMaskChildWindow::RegisterChildWindow(false, pMod);
+ SvxIMapDlgChildWindow::RegisterChildWindow(false, pMod);
+ SvxHlinkDlgWrapper::RegisterChildWindow(false, pMod);
+ ::sd::SpellDialogChildWindow::RegisterChildWindow(
+ false, pMod, comphelper::LibreOfficeKit::isActive() ? SfxChildWindowFlags::NEVERCLONE
+ : SfxChildWindowFlags::NONE);
+#if HAVE_FEATURE_AVMEDIA
+ ::avmedia::MediaPlayer::RegisterChildWindow(false, pMod);
+#endif
+ ::sd::LeftPaneImpressChildWindow::RegisterChildWindow(false, pMod);
+ ::sd::LeftPaneDrawChildWindow::RegisterChildWindow(false, pMod);
+ ::sfx2::sidebar::SidebarChildWindow::RegisterChildWindow(false, pMod);
+ DevelopmentToolChildWindow::RegisterChildWindow(false, pMod);
+
+ ::sd::SdNavigatorWrapper::RegisterChildWindow(false, pMod, SfxChildWindowFlags::NEVERHIDE);
+
+ SvxFillToolBoxControl::RegisterControl(0, pMod);
+ SvxLineWidthToolBoxControl::RegisterControl(0, pMod);
+
+ SvxGrafModeToolBoxControl::RegisterControl( SID_ATTR_GRAF_MODE, pMod );
+ SvxGrafRedToolBoxControl::RegisterControl( SID_ATTR_GRAF_RED, pMod );
+ SvxGrafGreenToolBoxControl::RegisterControl( SID_ATTR_GRAF_GREEN, pMod );
+ SvxGrafBlueToolBoxControl::RegisterControl( SID_ATTR_GRAF_BLUE, pMod );
+ SvxGrafLuminanceToolBoxControl::RegisterControl( SID_ATTR_GRAF_LUMINANCE, pMod );
+ SvxGrafContrastToolBoxControl::RegisterControl( SID_ATTR_GRAF_CONTRAST, pMod );
+ SvxGrafGammaToolBoxControl::RegisterControl( SID_ATTR_GRAF_GAMMA, pMod );
+ SvxGrafTransparenceToolBoxControl::RegisterControl( SID_ATTR_GRAF_TRANSPARENCE, pMod );
+
+ // register StatusBarControls
+ SvxZoomPageStatusBarControl::RegisterControl( SID_ZOOM_ENTIRE_PAGE, pMod );
+ SvxZoomStatusBarControl::RegisterControl( SID_ATTR_ZOOM, pMod );
+ SvxPosSizeStatusBarControl::RegisterControl( SID_ATTR_SIZE, pMod );
+ SvxModifyControl::RegisterControl( SID_DOC_MODIFIED, pMod );
+ SvxZoomSliderControl::RegisterControl( SID_ATTR_ZOOMSLIDER, pMod );
+
+ svx::FormatPaintBrushToolBoxControl::RegisterControl(SID_FORMATPAINTBRUSH, pMod );
+
+ SvxClipBoardControl::RegisterControl( SID_PASTE, pMod );
+ SvxClipBoardControl::RegisterControl( SID_PASTE_UNFORMATTED, pMod );
+
+#if HAVE_FEATURE_AVMEDIA
+ ::avmedia::MediaToolBoxControl::RegisterControl( SID_AVMEDIA_TOOLBOX, pMod );
+#endif
+ XmlSecStatusBarControl::RegisterControl( SID_SIGNATURE, pMod );
+ SdTemplateControl::RegisterControl( SID_STATUS_LAYOUT, pMod );
+ SdScaleControl::RegisterControl( SID_SCALE, pMod );
+ SvxTbxCtlDraw::RegisterControl(SID_INSERT_DRAW, pMod );
+}
+
+void SdDLL::Init()
+{
+ if ( SfxApplication::GetModule(SfxToolsModule::Draw) ) // Module already active
+ return;
+
+ SfxObjectFactory* pDrawFact = nullptr;
+ SfxObjectFactory* pImpressFact = nullptr;
+
+ if (utl::ConfigManager::IsFuzzing() || SvtModuleOptions().IsImpress())
+ pImpressFact = &::sd::DrawDocShell::Factory();
+
+ if (!utl::ConfigManager::IsFuzzing() && SvtModuleOptions().IsDraw())
+ pDrawFact = &::sd::GraphicDocShell::Factory();
+
+ auto pUniqueModule = std::make_unique<SdModule>(pImpressFact, pDrawFact);
+ SdModule* pModule = pUniqueModule.get();
+ SfxApplication::SetModule(SfxToolsModule::Draw, std::move(pUniqueModule));
+
+ if (!utl::ConfigManager::IsFuzzing() && SvtModuleOptions().IsImpress())
+ {
+ // Register the Impress shape types in order to make the shapes accessible.
+ ::accessibility::RegisterImpressShapeTypes ();
+ ::sd::DrawDocShell::Factory().SetDocumentServiceName( "com.sun.star.presentation.PresentationDocument" );
+ }
+
+ if (!utl::ConfigManager::IsFuzzing() && SvtModuleOptions().IsDraw())
+ {
+ ::sd::GraphicDocShell::Factory().SetDocumentServiceName( "com.sun.star.drawing.DrawingDocument" );
+ }
+
+ // register your view-factories here
+ RegisterFactorys();
+
+ // register your shell-interfaces here
+ RegisterInterfaces(pModule);
+
+ // register your controllers here
+ RegisterControllers(pModule);
+
+ // register 3D-object-factory
+ E3dObjFactory();
+
+ // register css::form::component::Form-Object-Factory
+ FmFormObjFactory();
+
+ // register your exotic remote controls here
+#ifdef ENABLE_SDREMOTE
+ if (!utl::ConfigManager::IsFuzzing() && !Application::IsHeadlessModeEnabled())
+ RegisterRemotes();
+#endif
+}
+
+#ifndef DISABLE_DYNLOADING
+
+extern "C" SAL_DLLPUBLIC_EXPORT
+void lok_preload_hook()
+{
+ SdFilter::Preload();
+ SdAbstractDialogFactory::Create();
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/app/sdmod.cxx b/sd/source/ui/app/sdmod.cxx
new file mode 100644
index 000000000..c7d56831d
--- /dev/null
+++ b/sd/source/ui/app/sdmod.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/.
+ *
+ * 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 <unotools/pathoptions.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#include <unotools/resmgr.hxx>
+#include <tools/urlobj.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/svapp.hxx>
+#include <svl/numformat.hxx>
+#include <svl/intitem.hxx>
+#include <sfx2/msg.hxx>
+#include <sfx2/objface.hxx>
+#include <comphelper/processfactory.hxx>
+#include <svtools/ehdl.hxx>
+
+#include <svx/svxids.hrc>
+#include <svl/srchitem.hxx>
+#include <svx/svxerr.hxx>
+
+#include <svtools/colorcfg.hxx>
+
+#include <sdmod.hxx>
+#include <sdresid.hxx>
+#include <optsitem.hxx>
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <errhdl.hrc>
+
+#define ShellClass_SdModule
+#include <sdslots.hxx>
+
+SFX_IMPL_INTERFACE(SdModule, SfxModule)
+
+void SdModule::InitInterface_Impl()
+{
+ GetStaticInterface()->RegisterStatusBar(StatusBarId::DrawStatusBar);
+}
+
+// Ctor
+SdModule::SdModule(SfxObjectFactory* pFact1, SfxObjectFactory* pFact2 )
+: SfxModule("sd", {pFact1, pFact2}),
+ pTransferClip(nullptr),
+ pTransferDrag(nullptr),
+ pTransferSelection(nullptr),
+ pImpressOptions(nullptr),
+ pDrawOptions(nullptr),
+ bWaterCan(false),
+ mbEventListenerAdded(false),
+ mpColorConfig(new svtools::ColorConfig)
+{
+ SetName( "StarDraw" ); // Do not translate!
+ pSearchItem.reset( new SvxSearchItem(SID_SEARCH_ITEM) );
+ pSearchItem->SetAppFlag(SvxSearchApp::DRAW);
+ StartListening( *SfxGetpApp() );
+ SvxErrorHandler::ensure();
+ mpErrorHdl.reset( new SfxErrorHandler(RID_SD_ERRHDL, ErrCodeArea::Sd, ErrCodeArea::Sd, GetResLocale()) );
+
+ // Create a new ref device and (by calling SetReferenceDevice())
+ // set its resolution to 600 DPI. This leads to a visually better
+ // formatting of text in small sizes (6 point and below.)
+ mpVirtualRefDevice.reset(VclPtr<VirtualDevice>::Create());
+ mpVirtualRefDevice->SetMapMode(MapMode(MapUnit::Map100thMM));
+ mpVirtualRefDevice->SetReferenceDevice ( VirtualDevice::RefDevMode::Dpi600 );
+}
+
+OUString SdResId(TranslateId aId)
+{
+ return Translate::get(aId, SD_MOD()->GetResLocale());
+}
+
+OUString SdResId(TranslateNId aContextSingularPlural, int nCardinality)
+{
+ return Translate::nget(aContextSingularPlural, nCardinality, SD_MOD()->GetResLocale());
+}
+
+// Dtor
+SdModule::~SdModule()
+{
+ pSearchItem.reset();
+ pNumberFormatter.reset();
+
+ if (mbEventListenerAdded)
+ {
+ Application::RemoveEventListener( LINK( this, SdModule, EventListenerHdl ) );
+ }
+
+ mpErrorHdl.reset();
+ mpVirtualRefDevice.disposeAndClear();
+}
+
+void SdModule::SetSearchItem(std::unique_ptr<SvxSearchItem> pItem)
+{
+ pSearchItem = std::move(pItem);
+}
+
+/// get notifications
+void SdModule::Notify( SfxBroadcaster&, const SfxHint& rHint )
+{
+ if( rHint.GetId() == SfxHintId::Deinitializing )
+ {
+ delete pImpressOptions;
+ pImpressOptions = nullptr;
+ delete pDrawOptions;
+ pDrawOptions = nullptr;
+ }
+}
+
+/// Return options
+SdOptions* SdModule::GetSdOptions(DocumentType eDocType)
+{
+ SdOptions* pOptions = nullptr;
+
+ if (eDocType == DocumentType::Draw)
+ {
+ if (!pDrawOptions)
+ pDrawOptions = new SdOptions(false);
+
+ pOptions = pDrawOptions;
+ }
+ else if (eDocType == DocumentType::Impress)
+ {
+ if (!pImpressOptions)
+ pImpressOptions = new SdOptions(true);
+
+ pOptions = pImpressOptions;
+ }
+ if( pOptions )
+ {
+ sal_uInt16 nMetric = pOptions->GetMetric();
+
+ ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ SdDrawDocument* pDoc = nullptr;
+ if (pDocSh)
+ pDoc = pDocSh->GetDoc();
+
+ if( nMetric != 0xffff && pDoc && eDocType == pDoc->GetDocumentType() )
+ PutItem( SfxUInt16Item( SID_ATTR_METRIC, nMetric ) );
+ }
+
+ return pOptions;
+}
+
+/**
+ * Open and return option stream for internal options;
+ * if the stream is opened for reading but does not exist, an 'empty'
+ * RefObject is returned
+ */
+tools::SvRef<SotStorageStream> SdModule::GetOptionStream( std::u16string_view rOptionName,
+ SdOptionStreamMode eMode )
+{
+ ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ tools::SvRef<SotStorageStream> xStm;
+
+ if( pDocSh )
+ {
+ DocumentType eType = pDocSh->GetDoc()->GetDocumentType();
+
+ if( !xOptionStorage.is() )
+ {
+ INetURLObject aURL( SvtPathOptions().GetUserConfigPath() );
+
+ aURL.Append( u"drawing.cfg" );
+
+ std::unique_ptr<SvStream> pStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ), StreamMode::READWRITE );
+
+ if( pStm )
+ xOptionStorage = new SotStorage( pStm.release(), true );
+ }
+
+ OUString aStmName;
+
+ if( DocumentType::Draw == eType )
+ aStmName = "Draw_";
+ else
+ aStmName = "Impress_";
+
+ aStmName += rOptionName;
+
+ if( SdOptionStreamMode::Store == eMode || xOptionStorage->IsContained( aStmName ) )
+ xStm = xOptionStorage->OpenSotStream( aStmName );
+ }
+
+ return xStm;
+}
+
+SvNumberFormatter* SdModule::GetNumberFormatter()
+{
+ if( !pNumberFormatter )
+ pNumberFormatter.reset( new SvNumberFormatter( ::comphelper::getProcessComponentContext(), LANGUAGE_SYSTEM ) );
+
+ return pNumberFormatter.get();
+}
+
+svtools::ColorConfig& SdModule::GetColorConfig()
+{
+ return *mpColorConfig;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/app/sdmod1.cxx b/sd/source/ui/app/sdmod1.cxx
new file mode 100644
index 000000000..573ee8530
--- /dev/null
+++ b/sd/source/ui/app/sdmod1.cxx
@@ -0,0 +1,638 @@
+/* -*- 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 <svl/lckbitem.hxx>
+#include <svl/intitem.hxx>
+#include <sfx2/frame.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <unotools/moduleoptions.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <osl/diagnose.h>
+#include <vcl/commandevent.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/errinf.hxx>
+#include <editeng/langitem.hxx>
+#include <vcl/weld.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/templatedlg.hxx>
+#include <editeng/eeitem.hxx>
+
+#include <svx/svxids.hrc>
+#include <strings.hrc>
+
+#include <sdmod.hxx>
+#include <pres.hxx>
+#include <optsitem.hxx>
+#include <ViewShell.hxx>
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <sdresid.hxx>
+#include <OutlineView.hxx>
+#include <OutlineViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <FactoryIds.hxx>
+#include <memory>
+#include <slideshow.hxx>
+
+using ::sd::framework::FrameworkHelper;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::frame::XFrame;
+
+namespace {
+
+class OutlineToImpressFinalizer final
+{
+public:
+ OutlineToImpressFinalizer (
+ ::sd::ViewShellBase& rBase,
+ SdDrawDocument& rDocument,
+ SvLockBytes const & rBytes);
+ void operator() (bool bEventSeen);
+private:
+ ::sd::ViewShellBase& mrBase;
+ SdDrawDocument& mrDocument;
+ std::shared_ptr<SvMemoryStream> mpStream;
+};
+
+} //end of anonymous namespace
+
+void SdModule::Execute(SfxRequest& rReq)
+{
+ const SfxItemSet* pSet = rReq.GetArgs();
+ sal_uLong nSlotId = rReq.GetSlot();
+
+ switch ( nSlotId )
+ {
+ case SID_NEWDOC:
+ {
+ SfxGetpApp()->ExecuteSlot(rReq, SfxGetpApp()->GetInterface());
+ }
+ break;
+
+ case SID_AUTOSPELL_CHECK:
+ {
+ // automatic spell checker
+ const SfxBoolItem* pItem;
+ if( pSet && (pItem = pSet->GetItemIfSet( SID_AUTOSPELL_CHECK, false ) ) )
+ {
+ bool bOnlineSpelling = pItem->GetValue();
+ // save at document:
+ ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ if( pDocSh )
+ {
+ SdDrawDocument* pDoc = pDocSh->GetDoc();
+ pDoc->SetOnlineSpell( bOnlineSpelling );
+ }
+ }
+ }
+ break;
+
+ case SID_ATTR_METRIC:
+ {
+ const SfxUInt16Item* pItem;
+ if ( pSet && (pItem = pSet->GetItemIfSet( SID_ATTR_METRIC ) ) )
+ {
+ FieldUnit eUnit = static_cast<FieldUnit>(pItem->GetValue());
+ switch( eUnit )
+ {
+ case FieldUnit::MM: // only the units which are also in the dialog
+ case FieldUnit::CM:
+ case FieldUnit::INCH:
+ case FieldUnit::PICA:
+ case FieldUnit::POINT:
+ {
+ ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ if(pDocSh)
+ {
+ DocumentType eDocType = pDocSh->GetDoc()->GetDocumentType();
+
+ PutItem( *pItem );
+ SdOptions* pOptions = GetSdOptions( eDocType );
+ if(pOptions)
+ pOptions->SetMetric( static_cast<sal_uInt16>(eUnit) );
+ rReq.Done();
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ }
+ break;
+
+ case SID_ATTR_LANGUAGE:
+ case SID_ATTR_CHAR_CJK_LANGUAGE:
+ case SID_ATTR_CHAR_CTL_LANGUAGE:
+ {
+ const SfxPoolItem* pItem;
+ if( pSet &&
+ (
+ SfxItemState::SET == pSet->GetItemState(SID_ATTR_LANGUAGE, false, &pItem ) ||
+ SfxItemState::SET == pSet->GetItemState(SID_ATTR_CHAR_CJK_LANGUAGE, false, &pItem ) ||
+ SfxItemState::SET == pSet->GetItemState(SID_ATTR_CHAR_CTL_LANGUAGE, false, &pItem )
+ )
+ )
+ {
+ // save at the document:
+ ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ if ( pDocSh )
+ {
+ LanguageType eLanguage = static_cast<const SvxLanguageItem*>(pItem)->GetValue();
+ SdDrawDocument* pDoc = pDocSh->GetDoc();
+
+ if( nSlotId == sal_uInt16(SID_ATTR_CHAR_CJK_LANGUAGE) )
+ pDoc->SetLanguage( eLanguage, EE_CHAR_LANGUAGE_CJK );
+ else if( nSlotId == sal_uInt16(SID_ATTR_CHAR_CTL_LANGUAGE) )
+ pDoc->SetLanguage( eLanguage, EE_CHAR_LANGUAGE_CTL );
+ else
+ pDoc->SetLanguage( eLanguage, EE_CHAR_LANGUAGE );
+
+ if( pDoc->GetOnlineSpell() )
+ {
+ pDoc->StopOnlineSpelling();
+ pDoc->StartOnlineSpelling();
+ }
+ }
+ }
+ }
+ break;
+
+ case SID_NEWSD:
+ {
+ SfxFrame* pFrame = ExecuteNewDocument( rReq );
+ // if a frame was created, set it as return value
+ if(pFrame)
+ rReq.SetReturnValue(SfxFrameItem(0, pFrame));
+ }
+
+ break;
+
+ case SID_OPENHYPERLINK:
+ case SID_OPENDOC:
+ {
+ bool bIntercept = false;
+ ::sd::DrawDocShell* pDocShell = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ if (pDocShell)
+ {
+ ::sd::ViewShell* pViewShell = pDocShell->GetViewShell();
+ if (pViewShell)
+ {
+ if( sd::SlideShow::IsRunning( pViewShell->GetViewShellBase() ) )
+ {
+ // Prevent documents from opening while the slide
+ // show is running, except when this request comes
+ // from a shape interaction.
+ if (rReq.GetArgs() == nullptr)
+ {
+ bIntercept = true;
+ }
+ }
+ }
+ }
+
+ if (!bIntercept)
+ {
+ SfxGetpApp()->ExecuteSlot(rReq, SfxGetpApp()->GetInterface());
+ }
+ else
+ {
+ std::unique_ptr<weld::MessageDialog> xErrorBox(Application::CreateMessageDialog(nullptr,
+ VclMessageType::Warning, VclButtonsType::Ok, SdResId(STR_CANT_PERFORM_IN_LIVEMODE)));
+
+ xErrorBox->run();
+
+ const SfxLinkItem* pLinkItem = rReq.GetArg<SfxLinkItem>(SID_DONELINK);
+ if( pLinkItem )
+ pLinkItem->GetValue().Call( nullptr );
+ }
+ }
+ break;
+
+ case SID_OUTLINE_TO_IMPRESS:
+ OutlineToImpress (rReq);
+ break;
+
+ default:
+ break;
+ }
+}
+
+bool SdModule::OutlineToImpress(SfxRequest const & rRequest)
+{
+ const SfxItemSet* pSet = rRequest.GetArgs();
+
+ if (pSet)
+ {
+ SvLockBytes* pBytes = static_cast<const SfxLockBytesItem&>(pSet->Get(SID_OUTLINE_TO_IMPRESS)).GetValue();
+
+ if (pBytes)
+ {
+ SfxObjectShellLock xDocShell;
+ ::sd::DrawDocShell* pDocSh;
+ xDocShell = pDocSh = new ::sd::DrawDocShell(
+ SfxObjectCreateMode::STANDARD, false, DocumentType::Impress);
+
+ pDocSh->DoInitNew();
+ SdDrawDocument* pDoc = pDocSh->GetDoc();
+ if(pDoc)
+ {
+ pDoc->CreateFirstPages();
+ pDoc->StopWorkStartupDelay();
+ }
+
+ const SfxFrameItem* pFrmItem = rRequest.GetArg<SfxFrameItem>(SID_DOCFRAME);
+ SfxViewFrame::LoadDocumentIntoFrame( *pDocSh, pFrmItem, ::sd::OUTLINE_FACTORY_ID );
+
+ ::sd::ViewShell* pViewSh = pDocSh->GetViewShell();
+
+ if (pViewSh && pDoc)
+ {
+ // AutoLayouts have to be finished
+ pDoc->StopWorkStartupDelay();
+
+ SfxViewFrame* pViewFrame = pViewSh->GetViewFrame();
+
+ // When the view frame has not been just created we have
+ // to switch synchronously to the outline view.
+ // (Otherwise the request will be ignored anyway.)
+ ::sd::ViewShellBase* pBase
+ = dynamic_cast< ::sd::ViewShellBase*>(pViewFrame->GetViewShell());
+ if (pBase != nullptr)
+ {
+ std::shared_ptr<FrameworkHelper> pHelper (
+ FrameworkHelper::Instance(*pBase));
+ pHelper->RequestView(
+ FrameworkHelper::msOutlineViewURL,
+ FrameworkHelper::msCenterPaneURL);
+
+ pHelper->RunOnResourceActivation(
+ FrameworkHelper::CreateResourceId(
+ FrameworkHelper::msOutlineViewURL,
+ FrameworkHelper::msCenterPaneURL),
+ OutlineToImpressFinalizer(*pBase, *pDoc, *pBytes));
+ }
+ }
+ }
+ }
+
+ return rRequest.IsDone();
+}
+
+void SdModule::GetState(SfxItemSet& rItemSet)
+{
+ if( SfxItemState::DEFAULT == rItemSet.GetItemState( SID_ATTR_METRIC ) )
+ {
+ ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ if(pDocSh)
+ {
+ DocumentType eDocType = pDocSh->GetDoc()->GetDocumentType();
+
+ SdOptions* pOptions = GetSdOptions(eDocType);
+ rItemSet.Put( SfxUInt16Item( SID_ATTR_METRIC, pOptions->GetMetric() ) );
+ }
+ }
+
+ // state of SID_OPENDOC is determined by the base class
+ if (rItemSet.GetItemState(SID_OPENDOC) != SfxItemState::UNKNOWN)
+ {
+ const SfxPoolItem* pItem = SfxGetpApp()->GetSlotState(SID_OPENDOC, SfxGetpApp()->GetInterface());
+ if (pItem)
+ rItemSet.Put(*pItem);
+ }
+
+ // state of SID_OPENHYPERLINK is determined by the base class
+ if (rItemSet.GetItemState(SID_OPENHYPERLINK) != SfxItemState::UNKNOWN)
+ {
+ const SfxPoolItem* pItem = SfxGetpApp()->GetSlotState(SID_OPENHYPERLINK, SfxGetpApp()->GetInterface());
+ if (pItem)
+ rItemSet.Put(*pItem);
+ }
+
+ if( SfxItemState::DEFAULT == rItemSet.GetItemState( SID_AUTOSPELL_CHECK ) )
+ {
+ ::sd::DrawDocShell* pDocSh =
+ dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ if( pDocSh )
+ {
+ SdDrawDocument* pDoc = pDocSh->GetDoc();
+ rItemSet.Put( SfxBoolItem( SID_AUTOSPELL_CHECK, pDoc->GetOnlineSpell() ) );
+ }
+ }
+
+ if( SfxItemState::DEFAULT == rItemSet.GetItemState( SID_ATTR_LANGUAGE ) )
+ {
+ ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ if( pDocSh )
+ rItemSet.Put( SvxLanguageItem( pDocSh->GetDoc()->GetLanguage( EE_CHAR_LANGUAGE ), SID_ATTR_LANGUAGE ) );
+ }
+
+ if( SfxItemState::DEFAULT == rItemSet.GetItemState( SID_ATTR_CHAR_CJK_LANGUAGE ) )
+ {
+ ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ if( pDocSh )
+ rItemSet.Put( SvxLanguageItem( pDocSh->GetDoc()->GetLanguage( EE_CHAR_LANGUAGE_CJK ), SID_ATTR_CHAR_CJK_LANGUAGE ) );
+ }
+
+ if( SfxItemState::DEFAULT == rItemSet.GetItemState( SID_ATTR_CHAR_CTL_LANGUAGE ) )
+ {
+ ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ if( pDocSh )
+ rItemSet.Put( SvxLanguageItem( pDocSh->GetDoc()->GetLanguage( EE_CHAR_LANGUAGE_CTL ), SID_ATTR_CHAR_CTL_LANGUAGE ) );
+ }
+
+ if ( mbEventListenerAdded )
+ return;
+
+ ::sd::DrawDocShell* pDocShell = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ if( pDocShell ) // Impress or Draw ?
+ {
+ ::sd::ViewShell* pViewShell = pDocShell->GetViewShell();
+
+ if( pViewShell && (pDocShell->GetDocumentType() == DocumentType::Impress) )
+ {
+ // add our event listener as soon as possible
+ Application::AddEventListener( LINK( this, SdModule, EventListenerHdl ) );
+ mbEventListenerAdded = true;
+ }
+ }
+}
+
+IMPL_STATIC_LINK( SdModule, EventListenerHdl, VclSimpleEvent&, rSimpleEvent, void )
+{
+ if( !((rSimpleEvent.GetId() == VclEventId::WindowCommand) && static_cast<VclWindowEvent*>(&rSimpleEvent)->GetData()) )
+ return;
+
+ const CommandEvent& rEvent = *static_cast<const CommandEvent*>(static_cast<VclWindowEvent*>(&rSimpleEvent)->GetData());
+
+ if( rEvent.GetCommand() != CommandEventId::Media )
+ return;
+
+ CommandMediaData* pMediaData = rEvent.GetMediaData();
+ pMediaData->SetPassThroughToOS(false);
+ switch (pMediaData->GetMediaId())
+ {
+ case MediaCommand::Play:
+ {
+ ::sd::DrawDocShell* pDocShell = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ if( pDocShell ) // Impress or Draw ?
+ {
+ ::sd::ViewShell* pViewShell = pDocShell->GetViewShell();
+
+ // #i97925# start the presentation if and only if an Impress document is focused
+ if( pViewShell && (pDocShell->GetDocumentType() == DocumentType::Impress) )
+ pViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_PRESENTATION );
+ }
+ break;
+ }
+ default:
+ pMediaData->SetPassThroughToOS(true);
+ break;
+ }
+}
+
+
+SfxFrame* SdModule::CreateFromTemplate(const OUString& rTemplatePath, const Reference<XFrame>& i_rFrame,
+ const bool bReplaceable)
+{
+ SfxFrame* pFrame = nullptr;
+
+ SfxObjectShellLock xDocShell;
+
+ std::unique_ptr<SfxItemSet> pSet(new SfxAllItemSet( SfxGetpApp()->GetPool() ));
+ pSet->Put( SfxBoolItem( SID_TEMPLATE, true ) );
+
+ ErrCode lErr = SfxGetpApp()->LoadTemplate( xDocShell, rTemplatePath, std::move(pSet) );
+
+ SfxObjectShell* pDocShell = xDocShell;
+
+ if( lErr )
+ {
+ ErrorHandler::HandleError(lErr);
+ }
+ else if( pDocShell )
+ {
+ if (pDocShell->GetMedium() && pDocShell->GetMedium()->GetItemSet())
+ pDocShell->GetMedium()->GetItemSet()->Put(SfxBoolItem(SID_REPLACEABLE, bReplaceable));
+ SfxViewFrame* pViewFrame = SfxViewFrame::LoadDocumentIntoFrame( *pDocShell, i_rFrame );
+ OSL_ENSURE( pViewFrame, "SdModule::CreateFromTemplate: no view frame - was the document really loaded?" );
+ pFrame = pViewFrame ? &pViewFrame->GetFrame() : nullptr;
+ }
+
+ return pFrame;
+
+}
+
+SfxFrame* SdModule::ExecuteNewDocument( SfxRequest const & rReq )
+{
+ SfxFrame* pFrame = nullptr;
+ if ( SvtModuleOptions().IsImpress() )
+ {
+ Reference< XFrame > xTargetFrame;
+ const SfxUnoFrameItem* pFrmItem = rReq.GetArg<SfxUnoFrameItem>(SID_FILLFRAME);
+ if ( pFrmItem )
+ xTargetFrame = pFrmItem->GetFrame();
+
+ SdOptions* pOpt = GetSdOptions(DocumentType::Impress);
+ bool bStartWithTemplate = pOpt->IsStartWithTemplate();
+
+ bool bNewDocDirect = rReq.GetSlot() == SID_NEWSD;
+
+ if( bNewDocDirect )
+ {
+ //we start without wizard
+
+ //check whether we should load a template document
+ OUString aStandardTemplate( SfxObjectFactory::GetStandardTemplate( u"com.sun.star.presentation.PresentationDocument" ) );
+
+ if( !aStandardTemplate.isEmpty() )
+ {
+ //load a template document
+ pFrame = CreateFromTemplate(aStandardTemplate, xTargetFrame, true);
+ }
+ else
+ {
+ //create an empty document
+ pFrame = CreateEmptyDocument( xTargetFrame );
+ }
+ }
+
+ if (bStartWithTemplate)
+ {
+ //Launch TemplateSelectionDialog
+ SfxTemplateSelectionDlg aTemplDlg(SfxGetpApp()->GetTopWindow());
+ aTemplDlg.run();
+
+ //check to disable the dialog
+ pOpt->SetStartWithTemplate( aTemplDlg.IsStartWithTemplate() );
+
+ //pFrame is loaded with the desired template
+ if (!aTemplDlg.getTemplatePath().isEmpty())
+ pFrame = CreateFromTemplate(aTemplDlg.getTemplatePath(), xTargetFrame, false);
+
+ // show tip-of-the-day dialog if it was deferred because SfxTemplateSelectionDlg
+ // was open
+ if (pFrame && SfxApplication::IsTipOfTheDayDue() && !SfxApplication::IsHeadlessOrUITest())
+ {
+ if (SfxDispatcher* pDispatcher = GetDispatcher())
+ {
+ // tdf#127946 pass in argument for dialog parent
+ SfxUnoFrameItem aDocFrame(SID_FILLFRAME, pFrame->GetFrameInterface());
+ pDispatcher->ExecuteList(SID_TIPOFTHEDAY, SfxCallMode::SLOT, {}, { &aDocFrame });
+ }
+ }
+ }
+ }
+
+ return pFrame;
+}
+
+SfxFrame* SdModule::CreateEmptyDocument( const Reference< XFrame >& i_rFrame )
+{
+ SfxFrame* pFrame = nullptr;
+
+ SfxObjectShellLock xDocShell;
+ ::sd::DrawDocShell* pNewDocSh;
+ xDocShell = pNewDocSh = new ::sd::DrawDocShell(SfxObjectCreateMode::STANDARD,false,DocumentType::Impress);
+ pNewDocSh->DoInitNew();
+ SdDrawDocument* pDoc = pNewDocSh->GetDoc();
+ if (pDoc)
+ {
+ pDoc->CreateFirstPages();
+ pDoc->StopWorkStartupDelay();
+ }
+ if (pNewDocSh->GetMedium() && pNewDocSh->GetMedium()->GetItemSet())
+ pNewDocSh->GetMedium()->GetItemSet()->Put(SfxBoolItem(SID_REPLACEABLE, true));
+
+ SfxViewFrame* pViewFrame = SfxViewFrame::LoadDocumentIntoFrame( *pNewDocSh, i_rFrame );
+ OSL_ENSURE( pViewFrame, "SdModule::CreateEmptyDocument: no view frame - was the document really loaded?" );
+ pFrame = pViewFrame ? &pViewFrame->GetFrame() : nullptr;
+
+ return pFrame;
+}
+
+//===== OutlineToImpressFinalize ==============================================
+
+namespace {
+
+OutlineToImpressFinalizer::OutlineToImpressFinalizer (
+ ::sd::ViewShellBase& rBase,
+ SdDrawDocument& rDocument,
+ SvLockBytes const & rBytes)
+ : mrBase(rBase),
+ mrDocument(rDocument)
+{
+ // The given stream has a lifetime shorter than this new
+ // OutlineToImpressFinalizer object. Therefore a local copy of the
+ // stream is created.
+ const SvStream* pStream (rBytes.GetStream());
+ if (pStream == nullptr)
+ return;
+
+ // Create a memory stream and prepare to fill it with the content of
+ // the original stream.
+ mpStream = std::make_shared<SvMemoryStream>();
+ static const std::size_t nBufferSize = 4096;
+ ::std::unique_ptr<sal_Int8[]> pBuffer (new sal_Int8[nBufferSize]);
+
+ sal_uInt64 nReadPosition(0);
+ bool bLoop (true);
+ while (bLoop)
+ {
+ // Read the next part of the original stream.
+ std::size_t nReadByteCount (0);
+ const ErrCode nErrorCode (
+ rBytes.ReadAt(
+ nReadPosition,
+ pBuffer.get(),
+ nBufferSize,
+ &nReadByteCount));
+
+ // Check the error code and stop copying the stream data when an
+ // error has occurred.
+ if (nErrorCode == ERRCODE_NONE)
+ {
+ if (nReadByteCount == 0)
+ bLoop = false;
+ }
+ else if (nErrorCode == ERRCODE_IO_PENDING)
+ ;
+ else
+ {
+ bLoop = false;
+ nReadByteCount = 0;
+ }
+
+ // Append the read bytes to the end of the memory stream.
+ if (nReadByteCount > 0)
+ {
+ mpStream->WriteBytes(pBuffer.get(), nReadByteCount);
+ nReadPosition += nReadByteCount;
+ }
+ }
+
+ // Rewind the memory stream so that in the operator() method its
+ // content is properly read.
+ mpStream->Seek(STREAM_SEEK_TO_BEGIN);
+}
+
+void OutlineToImpressFinalizer::operator() (bool)
+{
+ // Fetch the new outline view shell.
+ ::sd::OutlineViewShell* pOutlineShell
+ = dynamic_cast<sd::OutlineViewShell*>(FrameworkHelper::Instance(mrBase)->GetViewShell(FrameworkHelper::msCenterPaneURL).get());
+
+ if (pOutlineShell != nullptr && mpStream != nullptr)
+ {
+ sd::OutlineView* pView = static_cast<sd::OutlineView*>(pOutlineShell->GetView());
+ // mba: the stream can't contain any relative URLs, because we don't
+ // have any information about a BaseURL!
+ pOutlineShell->ReadRtf(*mpStream);
+
+ // Call UpdatePreview once for every slide to resync the
+ // document with the outliner of the OutlineViewShell.
+ sal_uInt16 nPageCount (mrDocument.GetSdPageCount(PageKind::Standard));
+ for (sal_uInt16 nIndex=0; nIndex<nPageCount; nIndex++)
+ {
+ SdPage* pPage = mrDocument.GetSdPage(nIndex, PageKind::Standard);
+ // Make the page the actual page so that the
+ // following UpdatePreview() call accesses the
+ // correct paragraphs.
+ pView->SetActualPage(pPage);
+ pOutlineShell->UpdatePreview(pPage);
+ }
+ // Select the first slide.
+ SdPage* pPage = mrDocument.GetSdPage(0, PageKind::Standard);
+ pView->SetActualPage(pPage);
+ pOutlineShell->UpdatePreview(pPage);
+ }
+
+ // Undo-Stack needs to be cleared, else the user may remove the
+ // only drawpage and this is a state we cannot handle ATM.
+ ::sd::DrawDocShell* pDocShell = mrDocument.GetDocSh();
+ if( pDocShell )
+ pDocShell->ClearUndoBuffer();
+}
+
+} // end of anonymous namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/app/sdmod2.cxx b/sd/source/ui/app/sdmod2.cxx
new file mode 100644
index 000000000..cccf42517
--- /dev/null
+++ b/sd/source/ui/app/sdmod2.cxx
@@ -0,0 +1,809 @@
+/* -*- 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 <editeng/flditem.hxx>
+#include <editeng/CustomPropertyField.hxx>
+#include <sfx2/printer.hxx>
+#include <sfx2/styfitem.hxx>
+#include <svl/inethist.hxx>
+#include <svl/poolitem.hxx>
+#include <svl/flagitem.hxx>
+#include <unotools/useroptions.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/docfile.hxx>
+#include <osl/diagnose.h>
+
+#include <editeng/measfld.hxx>
+#include <editeng/editstat.hxx>
+
+#include <svx/svxids.hrc>
+#include <svx/dialogs.hrc>
+#include <svx/svdotext.hxx>
+
+#include <sfx2/sfxdlg.hxx>
+
+#include <sdmod.hxx>
+#include <app.hrc>
+#include <family.hrc>
+#include <strings.hrc>
+#include <sdattr.hrc>
+
+#include <bitmaps.hlst>
+#include <ViewShell.hxx>
+#include <FrameView.hxx>
+#include <optsitem.hxx>
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <Outliner.hxx>
+#include <sdresid.hxx>
+#include <pres.hxx>
+#include <OutlineViewShell.hxx>
+#include <OutlineView.hxx>
+#include <ViewShellBase.hxx>
+#include <sdpage.hxx>
+#include <sdabstdlg.hxx>
+#include <svl/intitem.hxx>
+
+/** retrieves the page that is currently painted. This will only be the master page
+ if the current drawn view only shows the master page*/
+static SdPage* GetCurrentPage( sd::ViewShell const * pViewSh, EditFieldInfo const * pInfo, bool& bMasterView )
+{
+ if( !pInfo )
+ return nullptr;
+
+ bMasterView = false;
+ SdPage* pPage = dynamic_cast< SdPage* >( pInfo->GetSdrPage() );
+ SdrOutliner* pOutliner = dynamic_cast< SdrOutliner* >( pInfo->GetOutliner() );
+
+ // special case, someone already set the current page on the EditFieldInfo
+ // This is used from the svx::UnoGraphicsExporter f.e.
+ if( pPage )
+ {
+ bMasterView = false;
+ return pPage;
+ }
+
+ // first try to check if we are inside the outline view
+ sd::OutlineView* pSdView = nullptr;
+ if( auto pOutlineViewShell = dynamic_cast<const sd::OutlineViewShell* >(pViewSh) )
+ pSdView = static_cast<sd::OutlineView*>(pOutlineViewShell->GetView());
+
+ if (pSdView != nullptr && (pOutliner == &pSdView->GetOutliner()))
+ {
+ // outline mode
+ int nPgNum = 0;
+ Outliner& rOutl = pSdView->GetOutliner();
+ tools::Long nPos = pInfo->GetPara();
+ sal_Int32 nParaPos = 0;
+
+ for( Paragraph* pPara = rOutl.GetParagraph( 0 ); pPara && nPos >= 0; pPara = rOutl.GetParagraph( ++nParaPos ), nPos-- )
+ {
+ if( Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) )
+ nPgNum++;
+ }
+
+ pPage = pViewSh->GetDoc()->GetSdPage( static_cast<sal_uInt16>(nPgNum), PageKind::Standard );
+ }
+ else
+ {
+ // draw mode, slide mode and preview. Get the processed page from the outliner
+ if(pOutliner)
+ {
+ pPage = dynamic_cast< SdPage* >(const_cast< SdrPage* >(pOutliner->getVisualizedPage()));
+ }
+
+ // The path using GetPaintingPageView() and GetCurrentPaintingDisplayInfo()
+ // is no longer needed. I debugged and checked all usages of PageNumber decompositions
+ // which all use the new possibility of setting the visualized page at the SdrOutliner.
+
+ // if all else failed, geht the current page from the object that is
+ // currently formatted from the document
+ if(!pPage)
+ {
+ const SdrTextObj* pTextObj = (pViewSh && pViewSh->GetDoc()) ? pViewSh->GetDoc()->GetFormattingTextObj() : nullptr;
+
+ if( pTextObj )
+ {
+ pPage = dynamic_cast< SdPage* >( pTextObj->getSdrPageFromSdrObject() );
+ }
+ }
+
+ if(pPage)
+ {
+ bMasterView = pPage->IsMasterPage();
+ }
+ }
+
+ return pPage;
+}
+
+/**
+ * Link for CalcFieldValue of Outliners
+ */
+IMPL_LINK(SdModule, CalcFieldValueHdl, EditFieldInfo*, pInfo, void)
+{
+ if (!pInfo)
+ return;
+
+ const SvxFieldData* pField = pInfo->GetField().GetField();
+ ::sd::DrawDocShell* pDocShell = nullptr;
+ SdDrawDocument* pDoc = nullptr;
+
+ SdrOutliner* pSdrOutliner = dynamic_cast< SdrOutliner* >( pInfo->GetOutliner() );
+ if( pSdrOutliner )
+ {
+ const SdrTextObj* pTextObj = pSdrOutliner->GetTextObj();
+
+ if( pTextObj )
+ pDoc = dynamic_cast< SdDrawDocument* >( &pTextObj->getSdrModelFromSdrObject() );
+
+ if( pDoc )
+ pDocShell = pDoc->GetDocSh();
+ }
+
+ if( !pDocShell )
+ pDocShell = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+
+ const SvxDateField* pDateField = nullptr;
+ const SvxExtTimeField* pExtTimeField = nullptr;
+ const SvxExtFileField* pExtFileField = nullptr;
+ const SvxAuthorField* pAuthorField = nullptr;
+ const SvxURLField* pURLField = nullptr;
+
+ const editeng::CustomPropertyField* pCustomPropertyField = nullptr;
+
+ if( (pDateField = dynamic_cast< const SvxDateField* >(pField)) != nullptr )
+ {
+ LanguageType eLang = pInfo->GetOutliner()->GetLanguage( pInfo->GetPara(), pInfo->GetPos() );
+ pInfo->SetRepresentation( pDateField->GetFormatted( *GetNumberFormatter(), eLang ) );
+ }
+ else if( (pExtTimeField = dynamic_cast< const SvxExtTimeField *>(pField)) != nullptr )
+ {
+ LanguageType eLang = pInfo->GetOutliner()->GetLanguage( pInfo->GetPara(), pInfo->GetPos() );
+ pInfo->SetRepresentation( pExtTimeField->GetFormatted( *GetNumberFormatter(), eLang ) );
+ }
+ else if( (pExtFileField = dynamic_cast< const SvxExtFileField * >(pField)) != nullptr )
+ {
+ if( pDocShell && (pExtFileField->GetType() != SvxFileType::Fix) )
+ {
+ OUString aName;
+ if( pDocShell->HasName() )
+ aName = pDocShell->GetMedium()->GetName();
+ else
+ aName = pDocShell->GetName();
+
+ const_cast< SvxExtFileField* >(pExtFileField)->SetFile( aName );
+ }
+ pInfo->SetRepresentation( pExtFileField->GetFormatted() );
+
+ }
+ else if( (pAuthorField = dynamic_cast< const SvxAuthorField* >( pField )) != nullptr )
+ {
+ if( pAuthorField->GetType() != SvxAuthorType::Fix )
+ {
+ SvtUserOptions aUserOptions;
+ SvxAuthorField aAuthorField(
+ aUserOptions.GetFirstName(), aUserOptions.GetLastName(), aUserOptions.GetID(),
+ pAuthorField->GetType(), pAuthorField->GetFormat() );
+
+ *const_cast< SvxAuthorField* >(pAuthorField) = aAuthorField;
+ }
+ pInfo->SetRepresentation( pAuthorField->GetFormatted() );
+
+ }
+ else if( dynamic_cast< const SvxPageField* >(pField) )
+ {
+ OUString aRepresentation(" ");
+
+ ::sd::ViewShell* pViewSh = pDocShell ? pDocShell->GetViewShell() : nullptr;
+ if(pViewSh == nullptr)
+ {
+ ::sd::ViewShellBase* pBase = dynamic_cast< ::sd::ViewShellBase *>( SfxViewShell::Current() );
+ if(pBase)
+ pViewSh = pBase->GetMainViewShell().get();
+ }
+ if( !pDoc && pViewSh )
+ pDoc = pViewSh->GetDoc();
+
+ bool bMasterView;
+ SdPage* pPage = GetCurrentPage( pViewSh, pInfo, bMasterView );
+
+ if( pPage && pDoc && !bMasterView )
+ {
+ int nPgNum;
+
+ if( (pPage->GetPageKind() == PageKind::Handout) && pViewSh )
+ {
+ nPgNum = pViewSh->GetPrintedHandoutPageNum();
+ }
+ else
+ {
+ nPgNum = (pPage->GetPageNum() - 1) / 2 + 1;
+ }
+ aRepresentation = pDoc->CreatePageNumValue(static_cast<sal_uInt16>(nPgNum));
+ }
+ else
+ aRepresentation = SdResId(STR_FIELD_PLACEHOLDER_NUMBER);
+
+ pInfo->SetRepresentation( aRepresentation );
+ }
+ else if( dynamic_cast< const SvxPageTitleField* >(pField) )
+ {
+ OUString aRepresentation(" ");
+
+ ::sd::ViewShell* pViewSh = pDocShell ? pDocShell->GetViewShell() : nullptr;
+ if(pViewSh == nullptr)
+ {
+ ::sd::ViewShellBase* pBase = dynamic_cast< ::sd::ViewShellBase *>( SfxViewShell::Current() );
+ if(pBase)
+ pViewSh = pBase->GetMainViewShell().get();
+ }
+ if( !pDoc && pViewSh )
+ pDoc = pViewSh->GetDoc();
+
+ bool bMasterView;
+ SdPage* pPage = GetCurrentPage( pViewSh, pInfo, bMasterView );
+
+ if( pPage && pDoc && !bMasterView )
+ {
+ aRepresentation = pPage->GetName();
+ }
+ else
+ {
+ DocumentType eDocType = pDoc ? pDoc->GetDocumentType() : DocumentType::Impress;
+ aRepresentation = ( ( eDocType == DocumentType::Impress )
+ ? SdResId(STR_FIELD_PLACEHOLDER_SLIDENAME)
+ : SdResId(STR_FIELD_PLACEHOLDER_PAGENAME) );
+ }
+
+ pInfo->SetRepresentation( aRepresentation );
+ }
+ else if( dynamic_cast< const SvxPagesField* >(pField) )
+ {
+ OUString aRepresentation(" ");
+
+ ::sd::ViewShell* pViewSh = pDocShell ? pDocShell->GetViewShell() : nullptr;
+ if(pViewSh == nullptr)
+ {
+ ::sd::ViewShellBase* pBase = dynamic_cast< ::sd::ViewShellBase *>( SfxViewShell::Current() );
+ if(pBase)
+ pViewSh = pBase->GetMainViewShell().get();
+ }
+ if( !pDoc && pViewSh )
+ pDoc = pViewSh->GetDoc();
+
+ bool bMasterView;
+ SdPage* pPage = GetCurrentPage( pViewSh, pInfo, bMasterView );
+
+ sal_uInt16 nPageCount = 0;
+
+ if( !bMasterView )
+ {
+ if( pPage && (pPage->GetPageKind() == PageKind::Handout) && pViewSh )
+ {
+ nPageCount = pViewSh->GetPrintedHandoutPageCount();
+ }
+ else if( pDoc )
+ {
+ nPageCount = pDoc->GetActiveSdPageCount();
+ }
+ }
+
+ if( nPageCount > 0 )
+ aRepresentation = pDoc->CreatePageNumValue(nPageCount);
+ else
+ aRepresentation = SdResId(STR_FIELD_PLACEHOLDER_COUNT);
+
+ pInfo->SetRepresentation( aRepresentation );
+ }
+ else if( (pURLField = dynamic_cast< const SvxURLField* >(pField)) != nullptr )
+ {
+ switch ( pURLField->GetFormat() )
+ {
+ case SvxURLFormat::AppDefault: //!!! adjustable at App???
+ case SvxURLFormat::Repr:
+ pInfo->SetRepresentation( pURLField->GetRepresentation() );
+ break;
+
+ case SvxURLFormat::Url:
+ pInfo->SetRepresentation( pURLField->GetURL() );
+ break;
+ }
+
+ const OUString& aURL = pURLField->GetURL();
+
+ svtools::ColorConfig aConfig;
+ svtools::ColorConfigEntry eEntry =
+ INetURLHistory::GetOrCreate()->QueryUrl( aURL ) ? svtools::LINKSVISITED : svtools::LINKS;
+ pInfo->SetTextColor( aConfig.GetColorValue(eEntry).nColor );
+ }
+ else if ( dynamic_cast< const SdrMeasureField* >(pField))
+ {
+ pInfo->SetFieldColor(std::optional<Color>()); // clear the field color
+ }
+ else if ((pCustomPropertyField = dynamic_cast<const editeng::CustomPropertyField*>(pField)) != nullptr)
+ {
+ try
+ {
+ SfxObjectShell* pObjSh = SfxObjectShell::Current();
+ if (pObjSh && pObjSh->IsLoadingFinished())
+ {
+ auto pNonConstCustomPropertyField = const_cast<editeng::CustomPropertyField*>(pCustomPropertyField);
+ OUString sCurrent = pNonConstCustomPropertyField->GetFormatted(pObjSh->getDocProperties());
+ pInfo->SetRepresentation(sCurrent);
+ }
+ else
+ pInfo->SetRepresentation(pCustomPropertyField->GetCurrentPresentation());
+ }
+ catch (...)
+ {
+ pInfo->SetRepresentation(pCustomPropertyField->GetCurrentPresentation());
+ }
+ }
+ else
+ {
+ OUString aRepresentation;
+
+ bool bHeaderField = dynamic_cast< const SvxHeaderField* >( pField ) != nullptr;
+ bool bFooterField = !bHeaderField && (dynamic_cast< const SvxFooterField* >( pField ) != nullptr );
+ bool bDateTimeField = !bHeaderField && !bFooterField && (dynamic_cast< const SvxDateTimeField* >( pField ) != nullptr);
+
+ if( bHeaderField || bFooterField || bDateTimeField )
+ {
+ sd::ViewShell* pViewSh = pDocShell ? pDocShell->GetViewShell() : nullptr;
+ bool bMasterView = false;
+ SdPage* pPage = GetCurrentPage( pViewSh, pInfo, bMasterView );
+
+ if( (pPage == nullptr) || bMasterView )
+ {
+ if( bHeaderField )
+ aRepresentation = SdResId(STR_FIELD_PLACEHOLDER_HEADER);
+ else if (bFooterField )
+ aRepresentation = SdResId(STR_FIELD_PLACEHOLDER_FOOTER);
+ else if (bDateTimeField )
+ aRepresentation = SdResId(STR_FIELD_PLACEHOLDER_DATETIME);
+ }
+ else
+ {
+ const sd::HeaderFooterSettings &rSettings = pPage->getHeaderFooterSettings();
+
+ if( bHeaderField )
+ {
+ aRepresentation = rSettings.maHeaderText;
+ }
+ else if( bFooterField )
+ {
+ aRepresentation = rSettings.maFooterText;
+ }
+ else if( bDateTimeField )
+ {
+ if( rSettings.mbDateTimeIsFixed )
+ {
+ aRepresentation = rSettings.maDateTimeText;
+ }
+ else
+ {
+ DateTime aDateTime( DateTime::SYSTEM );
+ LanguageType eLang = pInfo->GetOutliner()->GetLanguage( pInfo->GetPara(), pInfo->GetPos() );
+ aRepresentation = SvxDateTimeField::GetFormatted( aDateTime, aDateTime,
+ rSettings.meDateFormat, rSettings.meTimeFormat, *GetNumberFormatter(), eLang );
+ }
+ }
+ }
+ }
+ else
+ {
+ OSL_FAIL("sd::SdModule::CalcFieldValueHdl(), unknown field type!");
+ }
+
+ if( aRepresentation.isEmpty() ) // TODO: Edit engine doesn't handle empty fields?
+ aRepresentation = " ";
+ pInfo->SetRepresentation( aRepresentation );
+ }
+}
+
+/**
+ * virtual methods for option dialog
+ */
+std::optional<SfxItemSet> SdModule::CreateItemSet( sal_uInt16 nSlot )
+{
+ ::sd::FrameView* pFrameView = nullptr;
+ ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ SdDrawDocument* pDoc = nullptr;
+
+ // Here we set the DocType of the option dialog (not document!)
+ DocumentType eDocType = DocumentType::Impress;
+ if( nSlot == SID_SD_GRAPHIC_OPTIONS )
+ eDocType = DocumentType::Draw;
+
+ if (pDocSh)
+ {
+ pDoc = pDocSh->GetDoc();
+
+ // If the option dialog is identical to the document type,
+ // we can pass the FrameView too:
+ if( pDoc && eDocType == pDoc->GetDocumentType() )
+ pFrameView = pDocSh->GetFrameView();
+
+ ::sd::ViewShell* pViewShell = pDocSh->GetViewShell();
+ if (pViewShell != nullptr)
+ pViewShell->WriteFrameViewData();
+ }
+
+ SdOptions* pOptions = GetSdOptions(eDocType);
+
+ // Pool has by default MapUnit Twips (Awgh!)
+ SfxItemPool& rPool = GetPool();
+ rPool.SetDefaultMetric( MapUnit::Map100thMM );
+
+ SfxItemSetFixed<
+ SID_ATTR_GRID_OPTIONS, SID_ATTR_GRID_OPTIONS,
+ SID_ATTR_METRIC, SID_ATTR_METRIC,
+ SID_ATTR_DEFTABSTOP, SID_ATTR_DEFTABSTOP,
+ ATTR_OPTIONS_LAYOUT, ATTR_OPTIONS_SCALE_END> aRet(rPool);
+
+ // TP_OPTIONS_LAYOUT:
+ aRet.Put( SdOptionsLayoutItem( pOptions, pFrameView ) );
+
+ sal_uInt16 nDefTab = 0;
+ if( pFrameView)
+ nDefTab = pDoc->GetDefaultTabulator();
+ else
+ nDefTab = pOptions->GetDefTab();
+ aRet.Put( SfxUInt16Item( SID_ATTR_DEFTABSTOP, nDefTab ) );
+
+ FieldUnit nMetric = FieldUnit(0xffff);
+ if( pFrameView)
+ nMetric = pDoc->GetUIUnit();
+ else
+ nMetric = static_cast<FieldUnit>(pOptions->GetMetric());
+
+ if( nMetric == FieldUnit(0xffff) )
+ nMetric = GetFieldUnit();
+
+ aRet.Put( SfxUInt16Item( SID_ATTR_METRIC, static_cast<sal_uInt16>(nMetric) ) );
+
+ // TP_OPTIONS_MISC:
+ SdOptionsMiscItem aSdOptionsMiscItem( pOptions, pFrameView );
+ if ( pFrameView )
+ {
+ aSdOptionsMiscItem.GetOptionsMisc().SetSummationOfParagraphs( pDoc->IsSummationOfParagraphs() );
+ aSdOptionsMiscItem.GetOptionsMisc().SetPrinterIndependentLayout (
+ static_cast<sal_uInt16>(pDoc->GetPrinterIndependentLayout()));
+ }
+ aRet.Put( aSdOptionsMiscItem );
+
+ // TP_OPTIONS_SNAP:
+ aRet.Put( SdOptionsSnapItem( pOptions, pFrameView ) );
+
+ // TP_SCALE:
+ sal_uInt32 nW = 10;
+ sal_uInt32 nH = 10;
+ sal_Int32 nX;
+ sal_Int32 nY;
+ if( pDocSh )
+ {
+ SdrPage* pPage = pDoc->GetSdPage(0, PageKind::Standard);
+ Size aSize(pPage->GetSize());
+ nW = aSize.Width();
+ nH = aSize.Height();
+ }
+
+ if(pFrameView)
+ {
+ const Fraction& rFraction = pDoc->GetUIScale();
+ nX=rFraction.GetNumerator();
+ nY=rFraction.GetDenominator();
+ }
+ else
+ {
+ // Get options from configuration file
+ pOptions->GetScale( nX, nY );
+ }
+
+ aRet.Put( SfxInt32Item( ATTR_OPTIONS_SCALE_X, nX ) );
+ aRet.Put( SfxInt32Item( ATTR_OPTIONS_SCALE_Y, nY ) );
+ aRet.Put( SfxUInt32Item( ATTR_OPTIONS_SCALE_WIDTH, nW ) );
+ aRet.Put( SfxUInt32Item( ATTR_OPTIONS_SCALE_HEIGHT, nH ) );
+
+ // TP_OPTIONS_PRINT:
+ aRet.Put( SdOptionsPrintItem( pOptions ) );
+
+ // RID_SVXPAGE_GRID:
+ aRet.Put( SdOptionsGridItem( pOptions ) );
+
+ return aRet;
+}
+
+void SdModule::ApplyItemSet( sal_uInt16 nSlot, const SfxItemSet& rSet )
+{
+ bool bNewDefTab = false;
+ bool bNewPrintOptions = false;
+ bool bMiscOptions = false;
+
+ ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ SdDrawDocument* pDoc = nullptr;
+ // Here we set the DocType of the option dialog (not document!)
+ DocumentType eDocType = DocumentType::Impress;
+ if( nSlot == SID_SD_GRAPHIC_OPTIONS )
+ eDocType = DocumentType::Draw;
+
+ ::sd::ViewShell* pViewShell = nullptr;
+
+ if (pDocSh)
+ {
+ pDoc = pDocSh->GetDoc();
+
+ pViewShell = pDocSh->GetViewShell();
+ if (pViewShell != nullptr)
+ pViewShell->WriteFrameViewData();
+ }
+ SdOptions* pOptions = GetSdOptions(eDocType);
+ // Grid
+ if( const SdOptionsGridItem* pGridItem = static_cast<const SdOptionsGridItem*>(rSet.GetItemIfSet( SID_ATTR_GRID_OPTIONS, false )) )
+ {
+ pGridItem->SetOptions( pOptions );
+ }
+
+ // Layout
+ if( const SdOptionsLayoutItem* pLayoutItem = rSet.GetItemIfSet( ATTR_OPTIONS_LAYOUT, false ))
+ {
+ pLayoutItem->SetOptions( pOptions );
+ }
+
+ // Metric
+ if( const SfxUInt16Item* pItem = rSet.GetItemIfSet( SID_ATTR_METRIC, false ) )
+ {
+ if( pDoc && eDocType == pDoc->GetDocumentType() )
+ PutItem( *pItem );
+ pOptions->SetMetric( pItem->GetValue() );
+ }
+ sal_uInt16 nDefTab = pOptions->GetDefTab();
+ // Default-Tabulator
+ if( const SfxUInt16Item* pItem = rSet.GetItemIfSet( SID_ATTR_DEFTABSTOP, false ) )
+ {
+ nDefTab = pItem->GetValue();
+ pOptions->SetDefTab( nDefTab );
+
+ bNewDefTab = true;
+ }
+
+ // Scale
+ if( const SfxInt32Item* pItem = rSet.GetItemIfSet( ATTR_OPTIONS_SCALE_X, false ) )
+ {
+ sal_Int32 nX = pItem->GetValue();
+ pItem = rSet.GetItemIfSet( ATTR_OPTIONS_SCALE_Y, false );
+ if( pItem )
+ {
+ sal_Int32 nY = pItem->GetValue();
+ pOptions->SetScale( nX, nY );
+
+ // Apply to document only if doc type match
+ if( pDocSh && pDoc && eDocType == pDoc->GetDocumentType() )
+ {
+ pDoc->SetUIScale( Fraction( nX, nY ) );
+ if( pViewShell )
+ pViewShell->SetRuler( pViewShell->HasRuler() );
+ }
+ }
+ }
+
+ // Misc
+ const SdOptionsMiscItem* pMiscItem = rSet.GetItemIfSet( ATTR_OPTIONS_MISC, false);
+ if( pMiscItem )
+ {
+ pMiscItem->SetOptions( pOptions );
+ bMiscOptions = true;
+ }
+
+ // Snap
+ const SdOptionsSnapItem* pSnapItem = rSet.GetItemIfSet( ATTR_OPTIONS_SNAP, false );
+ if( pSnapItem )
+ {
+ pSnapItem->SetOptions( pOptions );
+ }
+
+ SfxItemSetFixed<SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN,
+ SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC,
+ ATTR_OPTIONS_PRINT, ATTR_OPTIONS_PRINT> aPrintSet( GetPool() );
+
+ // Print
+ const SdOptionsPrintItem* pPrintItem = rSet.GetItemIfSet( ATTR_OPTIONS_PRINT, false);
+ if( pPrintItem )
+ {
+ pPrintItem->SetOptions( pOptions );
+
+ // set PrintOptionsSet
+ SdOptionsPrintItem aPrintItem( pOptions );
+ SfxFlagItem aFlagItem( SID_PRINTER_CHANGESTODOC );
+ SfxPrinterChangeFlags nFlags =
+ (aPrintItem.GetOptionsPrint().IsWarningSize() ? SfxPrinterChangeFlags::CHG_SIZE : SfxPrinterChangeFlags::NONE) |
+ (aPrintItem.GetOptionsPrint().IsWarningOrientation() ? SfxPrinterChangeFlags::CHG_ORIENTATION : SfxPrinterChangeFlags::NONE);
+ aFlagItem.SetValue( static_cast<int>(nFlags) );
+
+ aPrintSet.Put( aPrintItem );
+ aPrintSet.Put( SfxBoolItem( SID_PRINTER_NOTFOUND_WARN, aPrintItem.GetOptionsPrint().IsWarningPrinter() ) );
+ aPrintSet.Put( aFlagItem );
+
+ bNewPrintOptions = true;
+ }
+
+ // Only if also the document type matches...
+ if( pDocSh && pDoc && eDocType == pDoc->GetDocumentType() )
+ {
+ if( bNewPrintOptions )
+ {
+ pDocSh->GetPrinter(true)->SetOptions( aPrintSet );
+ }
+
+ // set DefTab at Model
+ if( bNewDefTab )
+ {
+ SdDrawDocument* pDocument = pDocSh->GetDoc();
+ pDocument->SetDefaultTabulator( nDefTab );
+
+ SdOutliner* pOutl = pDocument->GetOutliner( false );
+ if( pOutl )
+ pOutl->SetDefTab( nDefTab );
+
+ SdOutliner* pInternalOutl = pDocument->GetInternalOutliner( false );
+ if( pInternalOutl )
+ pInternalOutl->SetDefTab( nDefTab );
+ }
+ if ( bMiscOptions )
+ {
+ pDoc->SetSummationOfParagraphs( pMiscItem->GetOptionsMisc().IsSummationOfParagraphs() );
+ EEControlBits nSum = pMiscItem->GetOptionsMisc().IsSummationOfParagraphs() ? EEControlBits::ULSPACESUMMATION : EEControlBits::NONE;
+ EEControlBits nCntrl;
+
+ SdDrawDocument* pDocument = pDocSh->GetDoc();
+ SdrOutliner& rOutl = pDocument->GetDrawOutliner();
+ nCntrl = rOutl.GetControlWord() &~ EEControlBits::ULSPACESUMMATION;
+ rOutl.SetControlWord( nCntrl | nSum );
+ SdOutliner* pOutl = pDocument->GetOutliner( false );
+ if( pOutl )
+ {
+ nCntrl = pOutl->GetControlWord() &~ EEControlBits::ULSPACESUMMATION;
+ pOutl->SetControlWord( nCntrl | nSum );
+ }
+ pOutl = pDocument->GetInternalOutliner( false );
+ if( pOutl )
+ {
+ nCntrl = pOutl->GetControlWord() &~ EEControlBits::ULSPACESUMMATION;
+ pOutl->SetControlWord( nCntrl | nSum );
+ }
+
+ // Set printer independent layout mode.
+ if( pDoc->GetPrinterIndependentLayout() != pMiscItem->GetOptionsMisc().GetPrinterIndependentLayout() )
+ pDoc->SetPrinterIndependentLayout (pMiscItem->GetOptionsMisc().GetPrinterIndependentLayout());
+ }
+ }
+
+ pOptions->StoreConfig();
+
+ // Only if also the document type matches...
+ if( pDocSh && pDoc && eDocType == pDoc->GetDocumentType() )
+ {
+ FieldUnit eUIUnit = static_cast<FieldUnit>(pOptions->GetMetric());
+ pDoc->SetUIUnit(eUIUnit);
+
+ if (pViewShell)
+ {
+ // make sure no one is in text edit mode, cause there
+ // are some pointers remembered else (!)
+ if(pViewShell->GetView())
+ pViewShell->GetView()->SdrEndTextEdit();
+
+ ::sd::FrameView* pFrame = pViewShell->GetFrameView();
+ pFrame->Update(pOptions);
+ pViewShell->ReadFrameViewData(pFrame);
+ pViewShell->SetUIUnit(eUIUnit);
+ pViewShell->SetDefTabHRuler( nDefTab );
+ }
+ }
+
+ if( pViewShell && pViewShell->GetViewFrame() )
+ pViewShell->GetViewFrame()->GetBindings().InvalidateAll( true );
+}
+
+std::unique_ptr<SfxTabPage> SdModule::CreateTabPage( sal_uInt16 nId, weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rSet )
+{
+ std::unique_ptr<SfxTabPage> xRet;
+ SfxAllItemSet aSet(*(rSet.GetPool()));
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+
+ switch(nId)
+ {
+ case SID_SD_TP_CONTENTS:
+ case SID_SI_TP_CONTENTS:
+ {
+ ::CreateTabPage fnCreatePage = pFact->GetSdOptionsContentsTabPageCreatorFunc();
+ if( fnCreatePage )
+ xRet = (*fnCreatePage)( pPage, pController, &rSet );
+ }
+ break;
+ case SID_SD_TP_SNAP:
+ case SID_SI_TP_SNAP:
+ {
+ ::CreateTabPage fnCreatePage = pFact->GetSdOptionsSnapTabPageCreatorFunc();
+ if( fnCreatePage )
+ xRet = (*fnCreatePage)( pPage, pController, &rSet );
+ }
+ break;
+ case SID_SD_TP_PRINT:
+ case SID_SI_TP_PRINT:
+ {
+ ::CreateTabPage fnCreatePage = pFact->GetSdPrintOptionsTabPageCreatorFunc();
+ if( fnCreatePage )
+ {
+ xRet = (*fnCreatePage)( pPage, pController, &rSet );
+ if(SID_SD_TP_PRINT == nId)
+ aSet.Put (SfxUInt32Item(SID_SDMODE_FLAG,SD_DRAW_MODE));
+ xRet->PageCreated(aSet);
+ }
+ }
+ break;
+ case SID_SI_TP_MISC:
+ case SID_SD_TP_MISC:
+ {
+ ::CreateTabPage fnCreatePage = pFact->GetSdOptionsMiscTabPageCreatorFunc();
+ if( fnCreatePage )
+ {
+ xRet = (*fnCreatePage)( pPage, pController, &rSet );
+ if(SID_SD_TP_MISC == nId)
+ aSet.Put (SfxUInt32Item(SID_SDMODE_FLAG,SD_DRAW_MODE));
+ else
+ aSet.Put (SfxUInt32Item(SID_SDMODE_FLAG,SD_IMPRESS_MODE));
+ xRet->PageCreated(aSet);
+ }
+ }
+ break;
+ case RID_SVXPAGE_TEXTANIMATION :
+ {
+ SfxAbstractDialogFactory* pSfxFact = SfxAbstractDialogFactory::Create();
+ ::CreateTabPage fnCreatePage = pSfxFact->GetTabPageCreatorFunc( nId );
+ if ( fnCreatePage )
+ xRet = (*fnCreatePage)( pPage, pController, &rSet );
+ }
+ break;
+ }
+ DBG_ASSERT( xRet, "SdModule::CreateTabPage(): no valid ID for TabPage!" );
+
+ return xRet;
+}
+
+std::optional<SfxStyleFamilies> SdModule::CreateStyleFamilies()
+{
+ SfxStyleFamilies aStyleFamilies;
+
+ aStyleFamilies.emplace_back(SfxStyleFamily::Para,
+ SdResId(STR_GRAPHICS_STYLE_FAMILY),
+ BMP_STYLES_FAMILY_GRAPHICS,
+ RID_GRAPHICSTYLEFAMILY, SD_MOD()->GetResLocale());
+
+ aStyleFamilies.emplace_back(SfxStyleFamily::Pseudo,
+ SdResId(STR_PRESENTATIONS_STYLE_FAMILY),
+ BMP_STYLES_FAMILY_PRESENTATIONS,
+ RID_PRESENTATIONSTYLEFAMILY, SD_MOD()->GetResLocale());
+
+ return aStyleFamilies;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/app/sdpopup.cxx b/sd/source/ui/app/sdpopup.cxx
new file mode 100644
index 000000000..4aafd2848
--- /dev/null
+++ b/sd/source/ui/app/sdpopup.cxx
@@ -0,0 +1,318 @@
+/* -*- 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 <string_view>
+
+#include <editeng/flditem.hxx>
+#include <sfx2/objsh.hxx>
+#include <sfx2/docfile.hxx>
+#include <unotools/useroptions.hxx>
+#include <vcl/svapp.hxx>
+
+#include <strings.hrc>
+#include <sdpopup.hxx>
+#include <sdresid.hxx>
+#include <sdmod.hxx>
+#include <DrawDocShell.hxx>
+
+/*
+ * Popup menu for editing of field command
+ */
+SdFieldPopup::SdFieldPopup(const SvxFieldData* pInField, LanguageType eLanguage)
+ : m_xBuilder(Application::CreateBuilder(nullptr, "modules/simpress/ui/fieldmenu.ui"))
+ , m_xPopup(m_xBuilder->weld_menu("menu"))
+ , m_pField(pInField)
+{
+ Fill(eLanguage);
+}
+
+SdFieldPopup::~SdFieldPopup()
+{
+}
+
+void SdFieldPopup::Fill( LanguageType eLanguage )
+{
+ sal_uInt16 nID = 1;
+ m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_FIX));
+ m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_VAR));
+ m_xPopup->append_separator("separator1");
+
+ if( auto pDateField = dynamic_cast< const SvxDateField *>( m_pField ) )
+ {
+ SvxDateField aDateField( *pDateField );
+
+ if (pDateField->GetType() == SvxDateType::Fix)
+ m_xPopup->set_active("1", true);
+ else
+ m_xPopup->set_active("2", true);
+
+ //SvxDateFormat::AppDefault, // is not used
+ //SvxDateFormat::System, // is not used
+ m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_STANDARD_SMALL));
+ m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_STANDARD_BIG));
+
+ SvNumberFormatter* pNumberFormatter = SD_MOD()->GetNumberFormatter();
+ aDateField.SetFormat( SvxDateFormat::A ); // 13.02.96
+ m_xPopup->append_radio(OUString::number(nID++), aDateField.GetFormatted(*pNumberFormatter, eLanguage));
+ aDateField.SetFormat( SvxDateFormat::B ); // 13.02.1996
+ m_xPopup->append_radio(OUString::number(nID++), aDateField.GetFormatted(*pNumberFormatter, eLanguage));
+ aDateField.SetFormat( SvxDateFormat::C ); // 13.Feb 1996
+ m_xPopup->append_radio(OUString::number(nID++), aDateField.GetFormatted(*pNumberFormatter, eLanguage));
+
+ aDateField.SetFormat( SvxDateFormat::D ); // 13.Februar 1996
+ m_xPopup->append_radio(OUString::number(nID++), aDateField.GetFormatted(*pNumberFormatter, eLanguage));
+ aDateField.SetFormat( SvxDateFormat::E ); // Die, 13.Februar 1996
+ m_xPopup->append_radio(OUString::number(nID++), aDateField.GetFormatted(*pNumberFormatter, eLanguage));
+ aDateField.SetFormat( SvxDateFormat::F ); // Dienstag, 13.Februar 1996
+ m_xPopup->append_radio(OUString::number(nID++), aDateField.GetFormatted(*pNumberFormatter, eLanguage));
+
+ m_xPopup->set_active(OString::number(static_cast<sal_uInt16>( pDateField->GetFormat() ) + 1), true); // - 2 + 3 !
+ }
+ else if( auto pTimeField = dynamic_cast< const SvxExtTimeField *>( m_pField ) )
+ {
+ SvxExtTimeField aTimeField( *pTimeField );
+
+ if( pTimeField->GetType() == SvxTimeType::Fix )
+ m_xPopup->set_active("1", true);
+ else
+ m_xPopup->set_active("2", true);
+
+ //SvxTimeFormat::AppDefault, // is not used
+ //SvxTimeFormat::System, // is not used
+ m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_STANDARD_NORMAL));
+
+ SvNumberFormatter* pNumberFormatter = SD_MOD()->GetNumberFormatter();
+ aTimeField.SetFormat( SvxTimeFormat::HH24_MM ); // 13:49
+ m_xPopup->append_radio(OUString::number(nID++), aTimeField.GetFormatted(*pNumberFormatter, eLanguage));
+ aTimeField.SetFormat( SvxTimeFormat::HH24_MM_SS ); // 13:49:38
+ m_xPopup->append_radio(OUString::number(nID++), aTimeField.GetFormatted(*pNumberFormatter, eLanguage));
+ aTimeField.SetFormat( SvxTimeFormat::HH24_MM_SS_00 ); // 13:49:38.78
+ m_xPopup->append_radio(OUString::number(nID++), aTimeField.GetFormatted(*pNumberFormatter, eLanguage));
+
+ aTimeField.SetFormat( SvxTimeFormat::HH12_MM ); // 01:49
+ m_xPopup->append_radio(OUString::number(nID++), aTimeField.GetFormatted(*pNumberFormatter, eLanguage));
+ aTimeField.SetFormat( SvxTimeFormat::HH12_MM_SS ); // 01:49:38
+ m_xPopup->append_radio(OUString::number(nID++), aTimeField.GetFormatted(*pNumberFormatter, eLanguage));
+ aTimeField.SetFormat( SvxTimeFormat::HH12_MM_SS_00 ); // 01:49:38.78
+ m_xPopup->append_radio(OUString::number(nID++), aTimeField.GetFormatted(*pNumberFormatter, eLanguage));
+ //SvxTimeFormat::HH12_MM_AMPM, // 01:49 PM
+ //SvxTimeFormat::HH12_MM_SS_AMPM, // 01:49:38 PM
+ //SvxTimeFormat::HH12_MM_SS_00_AMPM // 01:49:38.78 PM
+
+ m_xPopup->set_active(OString::number(static_cast<sal_uInt16>( pTimeField->GetFormat() ) + 1), true); // - 2 + 3 !
+ }
+ else if( auto pFileField = dynamic_cast< const SvxExtFileField *>( m_pField ) )
+ {
+ //SvxExtFileField aFileField( *pFileField );
+
+ if( pFileField->GetType() == SvxFileType::Fix )
+ m_xPopup->set_active("1", true);
+ else
+ m_xPopup->set_active("2", true);
+
+ m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_FILEFORMAT_NAME_EXT));
+ m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_FILEFORMAT_FULLPATH));
+ m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_FILEFORMAT_PATH));
+ m_xPopup->append_radio(OUString::number(nID++), SdResId(STR_FILEFORMAT_NAME));
+
+ m_xPopup->set_active(OString::number(static_cast<sal_uInt16>( pFileField->GetFormat() ) + 3), true);
+ }
+ else if( auto pAuthorField = dynamic_cast< const SvxAuthorField *>( m_pField ) )
+ {
+ SvxAuthorField aAuthorField( *pAuthorField );
+
+ if( pAuthorField->GetType() == SvxAuthorType::Fix )
+ m_xPopup->set_active("1", true);
+ else
+ m_xPopup->set_active("2", true);
+
+ for( sal_uInt16 i = 0; i < 4; i++ )
+ {
+ aAuthorField.SetFormat( static_cast<SvxAuthorFormat>(i) );
+ m_xPopup->append_radio(OUString::number(nID++), aAuthorField.GetFormatted());
+ }
+ m_xPopup->set_active(OString::number(static_cast<sal_uInt16>( pAuthorField->GetFormat() ) + 3), true);
+ }
+}
+
+void SdFieldPopup::Execute(weld::Window* pParent, const tools::Rectangle& rRect)
+{
+ OString sIdent = m_xPopup->popup_at_rect(pParent, rRect);
+ if (sIdent.isEmpty())
+ return;
+
+ if (sIdent == "1" || sIdent == "2")
+ {
+ m_xPopup->set_active("1", sIdent == "1");
+ m_xPopup->set_active("2", sIdent == "2");
+ }
+ else
+ {
+ int nCount = m_xPopup->n_children();
+ for (int i = 3; i < nCount; i++)
+ m_xPopup->set_active(
+ OString::number(i), sIdent == std::string_view(OString::number(i)));
+ }
+}
+
+/**
+ * Returns a new field, owned by caller.
+ * Returns NULL if nothing changed.
+ */
+SvxFieldData* SdFieldPopup::GetField()
+{
+ SvxFieldData* pNewField = nullptr;
+
+ sal_uInt16 nCount = m_xPopup->n_children();
+
+ if( auto pDateField = dynamic_cast< const SvxDateField *>( m_pField ) )
+ {
+ SvxDateType eType;
+ SvxDateFormat eFormat;
+ sal_uInt16 i;
+
+ if (m_xPopup->get_active("1"))
+ eType = SvxDateType::Fix;
+ else
+ eType = SvxDateType::Var;
+
+ for( i = 3; i < nCount; i++ )
+ {
+ if (m_xPopup->get_active(OString::number(i)))
+ break;
+ }
+ eFormat = static_cast<SvxDateFormat>( i - 1 );
+
+ if( pDateField->GetFormat() != eFormat ||
+ pDateField->GetType() != eType )
+ {
+ pNewField = new SvxDateField( *pDateField );
+ static_cast<SvxDateField*>( pNewField )->SetType( eType );
+ static_cast<SvxDateField*>( pNewField )->SetFormat( eFormat );
+
+ if( (pDateField->GetType() == SvxDateType::Var) && (eType == SvxDateType::Fix) )
+ {
+ Date aDate( Date::SYSTEM );
+ static_cast<SvxDateField*>( pNewField )->SetFixDate( aDate );
+ }
+ }
+ }
+ else if( auto pTimeField = dynamic_cast< const SvxExtTimeField *>( m_pField ) )
+ {
+ SvxTimeType eType;
+ SvxTimeFormat eFormat;
+ sal_uInt16 i;
+
+ if (m_xPopup->get_active("1"))
+ eType = SvxTimeType::Fix;
+ else
+ eType = SvxTimeType::Var;
+
+ for( i = 3; i < nCount; i++ )
+ {
+ if (m_xPopup->get_active(OString::number(i)))
+ break;
+ }
+ eFormat = static_cast<SvxTimeFormat>( i - 1 );
+
+ if( pTimeField->GetFormat() != eFormat ||
+ pTimeField->GetType() != eType )
+ {
+ pNewField = new SvxExtTimeField( *pTimeField );
+ static_cast<SvxExtTimeField*>( pNewField )->SetType( eType );
+ static_cast<SvxExtTimeField*>( pNewField )->SetFormat( eFormat );
+
+ if( (pTimeField->GetType() == SvxTimeType::Var) && (eType == SvxTimeType::Fix) )
+ {
+ tools::Time aTime( tools::Time::SYSTEM );
+ static_cast<SvxExtTimeField*>( pNewField )->SetFixTime( aTime );
+ }
+
+ }
+ }
+ else if( auto pFileField = dynamic_cast< const SvxExtFileField *>( m_pField ) )
+ {
+ SvxFileType eType;
+ SvxFileFormat eFormat;
+ sal_uInt16 i;
+
+ if (m_xPopup->get_active("1"))
+ eType = SvxFileType::Fix;
+ else
+ eType = SvxFileType::Var;
+
+ for( i = 3; i < nCount; i++ )
+ {
+ if (m_xPopup->get_active(OString::number(i)))
+ break;
+ }
+ eFormat = static_cast<SvxFileFormat>( i - 3 );
+
+ if( pFileField->GetFormat() != eFormat ||
+ pFileField->GetType() != eType )
+ {
+ ::sd::DrawDocShell* pDocSh = dynamic_cast<::sd::DrawDocShell* >( SfxObjectShell::Current() );
+
+ if( pDocSh )
+ {
+ OUString aName;
+ if( pDocSh->HasName() )
+ aName = pDocSh->GetMedium()->GetName();
+
+ // Get current filename, not the one stored in the old field
+ pNewField = new SvxExtFileField( aName );
+ static_cast<SvxExtFileField*>( pNewField )->SetType( eType );
+ static_cast<SvxExtFileField*>( pNewField )->SetFormat( eFormat );
+ }
+ }
+ }
+ else if( auto pAuthorField = dynamic_cast< const SvxAuthorField *>( m_pField ) )
+ {
+ SvxAuthorType eType;
+ SvxAuthorFormat eFormat;
+ sal_uInt16 i;
+
+ if (m_xPopup->get_active("1"))
+ eType = SvxAuthorType::Fix;
+ else
+ eType = SvxAuthorType::Var;
+
+ for( i = 3; i < nCount; i++ )
+ {
+ if (m_xPopup->get_active(OString::number(i)))
+ break;
+ }
+ eFormat = static_cast<SvxAuthorFormat>( i - 3 );
+
+ if( pAuthorField->GetFormat() != eFormat ||
+ pAuthorField->GetType() != eType )
+ {
+ // Get current state of address, not the old one
+ SvtUserOptions aUserOptions;
+ pNewField = new SvxAuthorField( aUserOptions.GetFirstName(), aUserOptions.GetLastName(), aUserOptions.GetID() );
+ static_cast<SvxAuthorField*>( pNewField )->SetType( eType );
+ static_cast<SvxAuthorField*>( pNewField )->SetFormat( eFormat );
+ }
+ }
+ return pNewField;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/app/sdxfer.cxx b/sd/source/ui/app/sdxfer.cxx
new file mode 100644
index 000000000..67016fd19
--- /dev/null
+++ b/sd/source/ui/app/sdxfer.cxx
@@ -0,0 +1,807 @@
+/* -*- 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 <com/sun/star/embed/XEmbeddedObject.hpp>
+#include <com/sun/star/embed/XTransactedObject.hpp>
+#include <com/sun/star/embed/XEmbedPersist.hpp>
+#include <com/sun/star/embed/ElementModes.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <comphelper/fileformat.h>
+#include <unotools/ucbstreamhelper.hxx>
+#include <unotools/tempfile.hxx>
+#include <editeng/flditem.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdotext.hxx>
+#include <editeng/outlobj.hxx>
+#include <sot/storage.hxx>
+#include <editeng/editobj.hxx>
+#include <o3tl/safeint.hxx>
+#include <svx/svdobjkind.hxx>
+#include <svx/svdouno.hxx>
+#include <svx/ImageMapInfo.hxx>
+#include <sot/formats.hxx>
+#include <svl/urlbmk.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <com/sun/star/form/FormButtonType.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <unotools/streamwrap.hxx>
+
+#include <svx/svdotable.hxx>
+#include <svx/unomodel.hxx>
+#include <svx/svditer.hxx>
+#include <sfx2/docfile.hxx>
+#include <comphelper/storagehelper.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <svtools/embedtransfer.hxx>
+#include <DrawDocShell.hxx>
+#include <View.hxx>
+#include <sdmod.hxx>
+#include <sdpage.hxx>
+#include <drawdoc.hxx>
+#include <stlpool.hxx>
+#include <sdxfer.hxx>
+#include <unomodel.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/svapp.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::io;
+using namespace ::com::sun::star::datatransfer;
+using namespace ::com::sun::star::datatransfer::clipboard;
+
+constexpr sal_uInt32 SDTRANSFER_OBJECTTYPE_DRAWMODEL = 1;
+constexpr sal_uInt32 SDTRANSFER_OBJECTTYPE_DRAWOLE = 2;
+
+SdTransferable::SdTransferable( SdDrawDocument* pSrcDoc, ::sd::View* pWorkView, bool bInitOnGetData )
+: mpPageDocShell( nullptr )
+, mpSdView( pWorkView )
+, mpSdViewIntern( pWorkView )
+, mpSdDrawDocument( nullptr )
+, mpSdDrawDocumentIntern( nullptr )
+, mpSourceDoc( pSrcDoc )
+, mpVDev( nullptr )
+, mbInternalMove( false )
+, mbOwnDocument( false )
+, mbOwnView( false )
+, mbLateInit( bInitOnGetData )
+, mbPageTransferable( false )
+, mbPageTransferablePersistent( false )
+{
+ if( mpSourceDoc )
+ StartListening( *mpSourceDoc );
+
+ if( pWorkView )
+ StartListening( *pWorkView );
+
+ if( !mbLateInit )
+ CreateData();
+}
+
+SdTransferable::~SdTransferable()
+{
+ SolarMutexGuard g;
+
+ if( mpSourceDoc )
+ EndListening( *mpSourceDoc );
+
+ if( mpSdView )
+ EndListening( *const_cast< sd::View *>( mpSdView) );
+
+ ObjectReleased();
+
+ if( mbOwnView )
+ delete mpSdViewIntern;
+
+ mpOLEDataHelper.reset();
+
+ if( maDocShellRef.is() )
+ {
+ SfxObjectShell* pObj = maDocShellRef.get();
+ ::sd::DrawDocShell* pDocSh = static_cast< ::sd::DrawDocShell*>(pObj);
+ pDocSh->DoClose();
+ }
+
+ maDocShellRef.clear();
+
+ if( mbOwnDocument )
+ delete mpSdDrawDocumentIntern;
+
+ mpGraphic.reset();
+ mpBookmark.reset();
+ mpImageMap.reset();
+
+ mpVDev.disposeAndClear();
+ mpObjDesc.reset();
+
+ //call explicitly at end of dtor to be covered by above SolarMutex
+ maUserData.clear();
+}
+
+void SdTransferable::CreateObjectReplacement( SdrObject* pObj )
+{
+ if( !pObj )
+ return;
+
+ mpOLEDataHelper.reset();
+ mpGraphic.reset();
+ mpBookmark.reset();
+ mpImageMap.reset();
+
+ if( auto pOleObj = dynamic_cast< SdrOle2Obj* >( pObj ) )
+ {
+ try
+ {
+ uno::Reference < embed::XEmbeddedObject > xObj = pOleObj->GetObjRef();
+ uno::Reference < embed::XEmbedPersist > xPersist( xObj, uno::UNO_QUERY );
+ if( xObj.is() && xPersist.is() && xPersist->hasEntry() )
+ {
+ mpOLEDataHelper.reset( new TransferableDataHelper( new SvEmbedTransferHelper( xObj, pOleObj->GetGraphic(), pOleObj->GetAspect() ) ) );
+
+ // TODO/LATER: the standalone handling of the graphic should not be used any more in future
+ // The EmbedDataHelper should bring the graphic in future
+ const Graphic* pObjGr = pOleObj->GetGraphic();
+ if ( pObjGr )
+ mpGraphic.reset( new Graphic( *pObjGr ) );
+ }
+ }
+ catch( uno::Exception& )
+ {}
+ }
+ else if( dynamic_cast< const SdrGrafObj *>( pObj ) != nullptr && (mpSourceDoc && !SdDrawDocument::GetAnimationInfo( pObj )) )
+ {
+ mpGraphic.reset( new Graphic( static_cast< SdrGrafObj* >( pObj )->GetTransformedGraphic() ) );
+ }
+ else if( pObj->IsUnoObj() && SdrInventor::FmForm == pObj->GetObjInventor() && ( pObj->GetObjIdentifier() == SdrObjKind::FormButton ) )
+ {
+ SdrUnoObj* pUnoCtrl = static_cast< SdrUnoObj* >( pObj );
+
+ if (SdrInventor::FmForm == pUnoCtrl->GetObjInventor())
+ {
+ const Reference< css::awt::XControlModel >& xControlModel( pUnoCtrl->GetUnoControlModel() );
+
+ if( !xControlModel.is() )
+ return;
+
+ Reference< css::beans::XPropertySet > xPropSet( xControlModel, UNO_QUERY );
+
+ if( !xPropSet.is() )
+ return;
+
+ css::form::FormButtonType eButtonType;
+ Any aTmp( xPropSet->getPropertyValue( "ButtonType" ) );
+
+ if( aTmp >>= eButtonType )
+ {
+ OUString aLabel, aURL;
+
+ xPropSet->getPropertyValue( "Label" ) >>= aLabel;
+ xPropSet->getPropertyValue( "TargetURL" ) >>= aURL;
+
+ mpBookmark.reset( new INetBookmark( aURL, aLabel ) );
+ }
+ }
+ }
+ else if( auto pTextObj = dynamic_cast< SdrTextObj *>( pObj ) )
+ {
+ const OutlinerParaObject* pPara;
+
+ if( (pPara = pTextObj->GetOutlinerParaObject()) != nullptr )
+ {
+ const SvxFieldItem* pField;
+
+ if( (pField = pPara->GetTextObject().GetField()) != nullptr )
+ {
+ const SvxFieldData* pData = pField->GetField();
+
+ if( auto pURL = dynamic_cast< const SvxURLField *>( pData ) )
+ {
+ // #i63399# This special code identifies TextFrames which have just a URL
+ // as content and directly add this to the clipboard, probably to avoid adding
+ // an unnecessary DrawObject to the target where paste may take place. This is
+ // wanted only for SdrObjects with no fill and no line, else it is necessary to
+ // use the whole SdrObject. Test here for Line/FillStyle and take shortcut only
+ // when both are unused
+ if(!pObj->HasFillStyle() && !pObj->HasLineStyle())
+ {
+ mpBookmark.reset( new INetBookmark( pURL->GetURL(), pURL->GetRepresentation() ) );
+ }
+ }
+ }
+ }
+ }
+
+ SvxIMapInfo* pInfo = SvxIMapInfo::GetIMapInfo( pObj );
+
+ if( pInfo )
+ mpImageMap.reset( new ImageMap( pInfo->GetImageMap() ) );
+}
+
+void SdTransferable::CreateData()
+{
+ if( mpSdDrawDocument && !mpSdViewIntern )
+ {
+ mbOwnView = true;
+
+ SdPage* pPage = mpSdDrawDocument->GetSdPage(0, PageKind::Standard);
+
+ if( pPage && 1 == pPage->GetObjCount() )
+ CreateObjectReplacement( pPage->GetObj( 0 ) );
+
+ mpVDev = VclPtr<VirtualDevice>::Create( *Application::GetDefaultDevice() );
+ mpVDev->SetMapMode( MapMode( mpSdDrawDocumentIntern->GetScaleUnit(), Point(), mpSdDrawDocumentIntern->GetScaleFraction(), mpSdDrawDocumentIntern->GetScaleFraction() ) );
+ mpSdViewIntern = new ::sd::View( *mpSdDrawDocumentIntern, mpVDev );
+ mpSdViewIntern->EndListening(*mpSdDrawDocumentIntern );
+ mpSdViewIntern->hideMarkHandles();
+ SdrPageView* pPageView = mpSdViewIntern->ShowSdrPage(pPage);
+ mpSdViewIntern->MarkAllObj(pPageView);
+ }
+ else if( mpSdView && !mpSdDrawDocumentIntern )
+ {
+ const SdrMarkList& rMarkList = mpSdView->GetMarkedObjectList();
+
+ if( rMarkList.GetMarkCount() == 1 )
+ CreateObjectReplacement( rMarkList.GetMark( 0 )->GetMarkedSdrObj() );
+
+ if( mpSourceDoc )
+ mpSourceDoc->CreatingDataObj(this);
+ mpSdDrawDocumentIntern = static_cast<SdDrawDocument*>( mpSdView->CreateMarkedObjModel().release() );
+ if( mpSourceDoc )
+ mpSourceDoc->CreatingDataObj(nullptr);
+
+ if( !maDocShellRef.is() && mpSdDrawDocumentIntern->GetDocSh() )
+ maDocShellRef = mpSdDrawDocumentIntern->GetDocSh();
+
+ if( !maDocShellRef.is() )
+ {
+ OSL_FAIL( "SdTransferable::CreateData(), failed to create a model with persist, clipboard operation will fail for OLE objects!" );
+ mbOwnDocument = true;
+ }
+
+ // Use dimension of source page
+ SdrPageView* pPgView = mpSdView->GetSdrPageView();
+ SdPage* pOldPage = static_cast<SdPage*>( pPgView->GetPage() );
+ SdrModel* pOldModel = mpSdView->GetModel();
+ SdStyleSheetPool* pOldStylePool = static_cast<SdStyleSheetPool*>( pOldModel->GetStyleSheetPool() );
+ SdStyleSheetPool* pNewStylePool = static_cast<SdStyleSheetPool*>( mpSdDrawDocumentIntern->GetStyleSheetPool() );
+ SdPage* pPage = mpSdDrawDocumentIntern->GetSdPage( 0, PageKind::Standard );
+ OUString aOldLayoutName( pOldPage->GetLayoutName() );
+
+ pPage->SetSize( pOldPage->GetSize() );
+ pPage->SetLayoutName( aOldLayoutName );
+ pNewStylePool->CopyGraphicSheets( *pOldStylePool );
+ pNewStylePool->CopyCellSheets( *pOldStylePool );
+ pNewStylePool->CopyTableStyles( *pOldStylePool );
+ sal_Int32 nPos = aOldLayoutName.indexOf( SD_LT_SEPARATOR );
+ if( nPos != -1 )
+ aOldLayoutName = aOldLayoutName.copy( 0, nPos );
+ StyleSheetCopyResultVector aCreatedSheets;
+ pNewStylePool->CopyLayoutSheets( aOldLayoutName, *pOldStylePool, aCreatedSheets );
+ }
+
+ // set VisArea and adjust objects if necessary
+ if( !(maVisArea.IsEmpty() &&
+ mpSdDrawDocumentIntern && mpSdViewIntern &&
+ mpSdDrawDocumentIntern->GetPageCount()) )
+ return;
+
+ SdPage* pPage = mpSdDrawDocumentIntern->GetSdPage( 0, PageKind::Standard );
+
+ if( 1 == mpSdDrawDocumentIntern->GetPageCount() )
+ {
+ // #112978# need to use GetAllMarkedBoundRect instead of GetAllMarkedRect to get
+ // fat lines correctly
+ maVisArea = mpSdViewIntern->GetAllMarkedBoundRect();
+ Point aOrigin( maVisArea.TopLeft() );
+ Size aVector( -aOrigin.X(), -aOrigin.Y() );
+
+ for( size_t nObj = 0, nObjCount = pPage->GetObjCount(); nObj < nObjCount; ++nObj )
+ {
+ SdrObject* pObj = pPage->GetObj( nObj );
+ pObj->NbcMove( aVector );
+ }
+ }
+ else
+ maVisArea.SetSize( pPage->GetSize() );
+
+ // output is at the zero point
+ maVisArea.SetPos( Point() );
+}
+
+static bool lcl_HasOnlyControls( SdrModel* pModel )
+{
+ bool bOnlyControls = false; // default if there are no objects
+
+ if ( pModel )
+ {
+ SdrPage* pPage = pModel->GetPage(0);
+ if (pPage)
+ {
+ SdrObjListIter aIter( pPage, SdrIterMode::DeepNoGroups );
+ SdrObject* pObj = aIter.Next();
+ if ( pObj )
+ {
+ bOnlyControls = true; // only set if there are any objects at all
+ while ( pObj )
+ {
+ if (dynamic_cast< const SdrUnoObj *>( pObj ) == nullptr)
+ {
+ bOnlyControls = false;
+ break;
+ }
+ pObj = aIter.Next();
+ }
+ }
+ }
+ }
+
+ return bOnlyControls;
+}
+
+static bool lcl_HasOnlyOneTable( SdrModel* pModel )
+{
+ if ( pModel )
+ {
+ SdrPage* pPage = pModel->GetPage(0);
+ if (pPage && pPage->GetObjCount() == 1 )
+ {
+ if( dynamic_cast< sdr::table::SdrTableObj* >( pPage->GetObj(0) ) != nullptr )
+ return true;
+ }
+ }
+ return false;
+}
+
+void SdTransferable::AddSupportedFormats()
+{
+ if( mbPageTransferable && !mbPageTransferablePersistent )
+ return;
+
+ if( !mbLateInit )
+ CreateData();
+
+ if( mpObjDesc )
+ AddFormat( SotClipboardFormatId::OBJECTDESCRIPTOR );
+
+ if( mpOLEDataHelper )
+ {
+ AddFormat( SotClipboardFormatId::EMBED_SOURCE );
+
+ DataFlavorExVector aVector( mpOLEDataHelper->GetDataFlavorExVector() );
+
+ for( const auto& rItem : aVector )
+ AddFormat( rItem );
+ }
+ else if( mpGraphic )
+ {
+ // #i25616#
+ AddFormat( SotClipboardFormatId::DRAWING );
+
+ AddFormat( SotClipboardFormatId::SVXB );
+
+ if( mpGraphic->GetType() == GraphicType::Bitmap )
+ {
+ AddFormat( SotClipboardFormatId::PNG );
+ AddFormat( SotClipboardFormatId::BITMAP );
+ AddFormat( SotClipboardFormatId::GDIMETAFILE );
+ }
+ else
+ {
+ AddFormat( SotClipboardFormatId::GDIMETAFILE );
+ AddFormat( SotClipboardFormatId::PNG );
+ AddFormat( SotClipboardFormatId::BITMAP );
+ }
+ }
+ else if( mpBookmark )
+ {
+ AddFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK );
+ AddFormat( SotClipboardFormatId::STRING );
+ }
+ else
+ {
+ AddFormat( SotClipboardFormatId::EMBED_SOURCE );
+ AddFormat( SotClipboardFormatId::DRAWING );
+ if( !mpSdDrawDocument || !lcl_HasOnlyControls( mpSdDrawDocument ) )
+ {
+ AddFormat( SotClipboardFormatId::GDIMETAFILE );
+ AddFormat( SotClipboardFormatId::PNG );
+ AddFormat( SotClipboardFormatId::BITMAP );
+ }
+
+ if( lcl_HasOnlyOneTable( mpSdDrawDocument ) ) {
+ AddFormat( SotClipboardFormatId::RTF );
+ AddFormat( SotClipboardFormatId::RICHTEXT );
+ }
+ }
+
+ if( mpImageMap )
+ AddFormat( SotClipboardFormatId::SVIM );
+}
+
+bool SdTransferable::GetData( const DataFlavor& rFlavor, const OUString& rDestDoc )
+{
+ if (SD_MOD()==nullptr)
+ return false;
+
+ SotClipboardFormatId nFormat = SotExchange::GetFormat( rFlavor );
+ bool bOK = false;
+
+ CreateData();
+
+ if( nFormat == SotClipboardFormatId::RTF && lcl_HasOnlyOneTable( mpSdDrawDocument ) )
+ {
+ bOK = SetTableRTF( mpSdDrawDocument );
+ }
+ else if( mpOLEDataHelper && mpOLEDataHelper->HasFormat( rFlavor ) )
+ {
+ // TODO/LATER: support all the graphical formats, the embedded object scenario should not have separated handling
+ if( nFormat == SotClipboardFormatId::GDIMETAFILE && mpGraphic )
+ bOK = SetGDIMetaFile( mpGraphic->GetGDIMetaFile() );
+ else
+ bOK = SetAny( mpOLEDataHelper->GetAny(rFlavor, rDestDoc) );
+ }
+ else if( HasFormat( nFormat ) )
+ {
+ if( ( nFormat == SotClipboardFormatId::LINKSRCDESCRIPTOR || nFormat == SotClipboardFormatId::OBJECTDESCRIPTOR ) && mpObjDesc )
+ {
+ bOK = SetTransferableObjectDescriptor( *mpObjDesc );
+ }
+ else if( nFormat == SotClipboardFormatId::DRAWING )
+ {
+ SfxObjectShellRef aOldRef( maDocShellRef );
+
+ maDocShellRef.clear();
+
+ if( mpSdViewIntern )
+ {
+ SdDrawDocument& rInternDoc = mpSdViewIntern->GetDoc();
+ rInternDoc.CreatingDataObj(this);
+ SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( mpSdViewIntern->CreateMarkedObjModel().release() );
+ rInternDoc.CreatingDataObj(nullptr);
+
+ bOK = SetObject( pDoc, SDTRANSFER_OBJECTTYPE_DRAWMODEL, rFlavor );
+
+ if( maDocShellRef.is() )
+ {
+ maDocShellRef->DoClose();
+ }
+ else
+ {
+ delete pDoc;
+ }
+ }
+
+ maDocShellRef = aOldRef;
+ }
+ else if( nFormat == SotClipboardFormatId::GDIMETAFILE )
+ {
+ if (mpSdViewIntern)
+ {
+ const bool bToggleOnlineSpell = mpSdDrawDocumentIntern && mpSdDrawDocumentIntern->GetOnlineSpell();
+ if (bToggleOnlineSpell)
+ mpSdDrawDocumentIntern->SetOnlineSpell(false);
+ bOK = SetGDIMetaFile( mpSdViewIntern->GetMarkedObjMetaFile( true ) );
+ if (bToggleOnlineSpell)
+ mpSdDrawDocumentIntern->SetOnlineSpell(true);
+ }
+ }
+ else if( SotClipboardFormatId::BITMAP == nFormat || SotClipboardFormatId::PNG == nFormat )
+ {
+ if (mpSdViewIntern)
+ {
+ const bool bToggleOnlineSpell = mpSdDrawDocumentIntern && mpSdDrawDocumentIntern->GetOnlineSpell();
+ if (bToggleOnlineSpell)
+ mpSdDrawDocumentIntern->SetOnlineSpell(false);
+ bOK = SetBitmapEx( mpSdViewIntern->GetMarkedObjBitmapEx(true), rFlavor );
+ if (bToggleOnlineSpell)
+ mpSdDrawDocumentIntern->SetOnlineSpell(true);
+ }
+ }
+ else if( ( nFormat == SotClipboardFormatId::STRING ) && mpBookmark )
+ {
+ bOK = SetString( mpBookmark->GetURL() );
+ }
+ else if( ( nFormat == SotClipboardFormatId::SVXB ) && mpGraphic )
+ {
+ bOK = SetGraphic( *mpGraphic );
+ }
+ else if( ( nFormat == SotClipboardFormatId::SVIM ) && mpImageMap )
+ {
+ bOK = SetImageMap( *mpImageMap );
+ }
+ else if( mpBookmark )
+ {
+ bOK = SetINetBookmark( *mpBookmark, rFlavor );
+ }
+ else if( nFormat == SotClipboardFormatId::EMBED_SOURCE )
+ {
+ if( mpSdDrawDocumentIntern )
+ {
+ if( !maDocShellRef.is() )
+ {
+ maDocShellRef = new ::sd::DrawDocShell(
+ mpSdDrawDocumentIntern,
+ SfxObjectCreateMode::EMBEDDED,
+ true,
+ mpSdDrawDocumentIntern->GetDocumentType());
+ mbOwnDocument = false;
+ maDocShellRef->DoInitNew();
+ }
+
+ maDocShellRef->SetVisArea( maVisArea );
+ bOK = SetObject( maDocShellRef.get(), SDTRANSFER_OBJECTTYPE_DRAWOLE, rFlavor );
+ }
+ }
+ }
+
+ return bOK;
+}
+
+bool SdTransferable::WriteObject( tools::SvRef<SotTempStream>& rxOStm, void* pObject, sal_uInt32 nObjectType, const DataFlavor& )
+{
+ bool bRet = false;
+
+ switch( nObjectType )
+ {
+ case SDTRANSFER_OBJECTTYPE_DRAWMODEL:
+ {
+ try
+ {
+ static const bool bDontBurnInStyleSheet = ( getenv( "AVOID_BURN_IN_FOR_GALLERY_THEME" ) != nullptr );
+ SdDrawDocument* pDoc = static_cast<SdDrawDocument*>(pObject);
+ if ( !bDontBurnInStyleSheet )
+ pDoc->BurnInStyleSheetAttributes();
+ rxOStm->SetBufferSize( 16348 );
+
+ Reference< XComponent > xComponent( new SdXImpressDocument( pDoc, true ) );
+ pDoc->setUnoModel( Reference< XInterface >::query( xComponent ) );
+
+ {
+ css::uno::Reference<css::io::XOutputStream> xDocOut( new utl::OOutputStreamWrapper( *rxOStm ) );
+ SvxDrawingLayerExport( pDoc, xDocOut, xComponent, (pDoc->GetDocumentType() == DocumentType::Impress) ? "com.sun.star.comp.Impress.XMLClipboardExporter" : "com.sun.star.comp.DrawingLayer.XMLExporter" );
+ }
+
+ xComponent->dispose();
+ bRet = ( rxOStm->GetError() == ERRCODE_NONE );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SdTransferable::WriteObject()" );
+ bRet = false;
+ }
+ }
+ break;
+
+ case SDTRANSFER_OBJECTTYPE_DRAWOLE:
+ {
+ SfxObjectShell* pEmbObj = static_cast<SfxObjectShell*>(pObject);
+ ::utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+
+ try
+ {
+ uno::Reference< embed::XStorage > xWorkStore =
+ ::comphelper::OStorageHelper::GetStorageFromURL( aTempFile.GetURL(), embed::ElementModes::READWRITE );
+
+ // write document storage
+ pEmbObj->SetupStorage( xWorkStore, SOFFICE_FILEFORMAT_CURRENT, false );
+ // mba: no relative URLs for clipboard!
+ SfxMedium aMedium( xWorkStore, OUString() );
+ pEmbObj->DoSaveObjectAs( aMedium, false );
+ pEmbObj->DoSaveCompleted();
+
+ uno::Reference< embed::XTransactedObject > xTransact( xWorkStore, uno::UNO_QUERY );
+ if ( xTransact.is() )
+ xTransact->commit();
+
+ std::unique_ptr<SvStream> pSrcStm = ::utl::UcbStreamHelper::CreateStream( aTempFile.GetURL(), StreamMode::READ );
+ if( pSrcStm )
+ {
+ rxOStm->SetBufferSize( 0xff00 );
+ rxOStm->WriteStream( *pSrcStm );
+ pSrcStm.reset();
+ }
+
+ bRet = true;
+ }
+ catch ( Exception& )
+ {}
+ }
+
+ break;
+
+ default:
+ break;
+ }
+
+ return bRet;
+}
+
+void SdTransferable::DragFinished( sal_Int8 nDropAction )
+{
+ if( mpSdView )
+ const_cast< ::sd::View* >(mpSdView)->DragFinished( nDropAction );
+}
+
+void SdTransferable::ObjectReleased()
+{
+ SdModule *pModule = SD_MOD();
+ if (!pModule)
+ return;
+
+ if( this == pModule->pTransferClip )
+ pModule->pTransferClip = nullptr;
+
+ if( this == pModule->pTransferDrag )
+ pModule->pTransferDrag = nullptr;
+
+ if( this == pModule->pTransferSelection )
+ pModule->pTransferSelection = nullptr;
+}
+
+void SdTransferable::SetObjectDescriptor( std::unique_ptr<TransferableObjectDescriptor> pObjDesc )
+{
+ mpObjDesc = std::move(pObjDesc);
+ PrepareOLE( *mpObjDesc );
+}
+
+void SdTransferable::SetPageBookmarks( std::vector<OUString> && rPageBookmarks, bool bPersistent )
+{
+ if( !mpSourceDoc )
+ return;
+
+ if( mpSdViewIntern )
+ mpSdViewIntern->HideSdrPage();
+
+ mpSdDrawDocument->ClearModel(false);
+
+ mpPageDocShell = nullptr;
+
+ maPageBookmarks.clear();
+
+ if( bPersistent )
+ {
+ mpSdDrawDocument->CreateFirstPages(mpSourceDoc);
+ mpSdDrawDocument->InsertBookmarkAsPage( rPageBookmarks, nullptr, false, true, 1, true,
+ mpSourceDoc->GetDocSh(), true, true, false );
+ }
+ else
+ {
+ mpPageDocShell = mpSourceDoc->GetDocSh();
+ maPageBookmarks = std::move(rPageBookmarks);
+ }
+
+ if( mpSdViewIntern )
+ {
+ SdPage* pPage = mpSdDrawDocument->GetSdPage( 0, PageKind::Standard );
+
+ if( pPage )
+ {
+ mpSdViewIntern->MarkAllObj( mpSdViewIntern->ShowSdrPage( pPage ) );
+ }
+ }
+
+ // set flags for page transferable; if ( mbPageTransferablePersistent == sal_False ),
+ // don't offer any formats => it's just for internal purposes
+ mbPageTransferable = true;
+ mbPageTransferablePersistent = bPersistent;
+}
+
+sal_Int64 SAL_CALL SdTransferable::getSomething( const css::uno::Sequence< sal_Int8 >& rId )
+{
+ return comphelper::getSomethingImpl(rId, this);
+}
+
+void SdTransferable::AddUserData (const std::shared_ptr<UserData>& rpData)
+{
+ maUserData.push_back(rpData);
+}
+
+sal_Int32 SdTransferable::GetUserDataCount() const
+{
+ return maUserData.size();
+}
+
+std::shared_ptr<SdTransferable::UserData> SdTransferable::GetUserData (const sal_Int32 nIndex) const
+{
+ if (nIndex>=0 && o3tl::make_unsigned(nIndex)<maUserData.size())
+ return maUserData[nIndex];
+ else
+ return std::shared_ptr<UserData>();
+}
+
+const css::uno::Sequence< sal_Int8 >& SdTransferable::getUnoTunnelId()
+{
+ static const comphelper::UnoIdInit theSdTransferableUnoTunnelId;
+ return theSdTransferableUnoTunnelId.getSeq();
+}
+
+SdTransferable* SdTransferable::getImplementation( const Reference< XInterface >& rxData ) noexcept
+{
+ try
+ {
+ return comphelper::getFromUnoTunnel<SdTransferable>(rxData);
+ }
+ catch( const css::uno::Exception& )
+ {
+ }
+ return nullptr;
+}
+
+void SdTransferable::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
+{
+ if (rHint.GetId() == SfxHintId::ThisIsAnSdrHint)
+ {
+ const SdrHint* pSdrHint = static_cast< const SdrHint* >( &rHint );
+ if( SdrHintKind::ModelCleared == pSdrHint->GetKind() )
+ {
+ EndListening(*mpSourceDoc);
+ mpSourceDoc = nullptr;
+ }
+ }
+ else
+ {
+ if( rHint.GetId() == SfxHintId::Dying )
+ {
+ if( &rBC == mpSourceDoc )
+ mpSourceDoc = nullptr;
+ if( &rBC == mpSdViewIntern )
+ mpSdViewIntern = nullptr;
+ if( &rBC == mpSdView )
+ mpSdView = nullptr;
+ }
+ }
+}
+
+void SdTransferable::SetView(const ::sd::View* pView)
+{
+ if (mpSdView)
+ EndListening(*const_cast<sd::View*>(mpSdView));
+ mpSdView = pView;
+ if (mpSdView)
+ StartListening(*const_cast<sd::View*>(mpSdView));
+}
+
+bool SdTransferable::SetTableRTF( SdDrawDocument* pModel )
+{
+ if ( pModel )
+ {
+ SdrPage* pPage = pModel->GetPage(0);
+ if (pPage && pPage->GetObjCount() == 1 )
+ {
+ sdr::table::SdrTableObj* pTableObj = dynamic_cast< sdr::table::SdrTableObj* >( pPage->GetObj(0) );
+ if( pTableObj )
+ {
+ SvMemoryStream aMemStm( 65535, 65535 );
+ sdr::table::ExportAsRTF( aMemStm, *pTableObj );
+ return SetAny( Any( Sequence< sal_Int8 >( static_cast< const sal_Int8* >( aMemStm.GetData() ), aMemStm.TellEnd() ) ) );
+ }
+ }
+ }
+
+ return false;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/app/tmplctrl.cxx b/sd/source/ui/app/tmplctrl.cxx
new file mode 100644
index 000000000..1f645bf66
--- /dev/null
+++ b/sd/source/ui/app/tmplctrl.cxx
@@ -0,0 +1,110 @@
+/* -*- 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 <vcl/commandevent.hxx>
+#include <vcl/status.hxx>
+#include <vcl/weldutils.hxx>
+#include <svl/stritem.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+
+#include <tmplctrl.hxx>
+#include <ViewShellBase.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <sdattr.hrc>
+#include <app.hrc>
+#include <sdresid.hxx>
+#include <strings.hrc>
+
+SFX_IMPL_STATUSBAR_CONTROL( SdTemplateControl, SfxStringItem );
+
+// class SdTemplateControl ------------------------------------------
+SdTemplateControl::SdTemplateControl( sal_uInt16 _nSlotId,
+ sal_uInt16 _nId,
+ StatusBar& rStb ) :
+ SfxStatusBarControl( _nSlotId, _nId, rStb )
+{
+ GetStatusBar().SetQuickHelpText(GetId(), SdResId(STR_STATUSBAR_MASTERPAGE));
+}
+
+SdTemplateControl::~SdTemplateControl()
+{
+}
+
+void SdTemplateControl::StateChangedAtStatusBarControl(
+ sal_uInt16 /*nSID*/, SfxItemState eState, const SfxPoolItem* pState )
+{
+ if( eState != SfxItemState::DEFAULT || pState->IsVoidItem() )
+ GetStatusBar().SetItemText( GetId(), OUString() );
+ else if ( auto pStringItem = dynamic_cast< const SfxStringItem *>( pState ) )
+ {
+ msTemplate = pStringItem->GetValue();
+ GetStatusBar().SetItemText( GetId(), msTemplate );
+ }
+}
+
+void SdTemplateControl::Paint( const UserDrawEvent& )
+{
+}
+
+void SdTemplateControl::Command( const CommandEvent& rCEvt )
+{
+ if ( rCEvt.GetCommand() != CommandEventId::ContextMenu || GetStatusBar().GetItemText( GetId() ).isEmpty() )
+ return;
+
+ SfxViewFrame* pViewFrame = SfxViewFrame::Current();
+
+ sd::ViewShellBase* pViewShellBase = sd::ViewShellBase::GetViewShellBase( pViewFrame );
+ if( !pViewShellBase )
+ return;
+
+ SdDrawDocument* pDoc = pViewShellBase->GetDocument();
+ if( !pDoc )
+ return;
+
+ std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(nullptr, "modules/simpress/ui/masterpagemenu.ui"));
+ std::unique_ptr<weld::Menu> xPopup(xBuilder->weld_menu("menu"));
+
+ const sal_uInt16 nMasterCount = pDoc->GetMasterSdPageCount(PageKind::Standard);
+
+ for (sal_uInt16 nPage = 0; nPage < nMasterCount; ++nPage)
+ {
+ SdPage* pMaster = pDoc->GetMasterSdPage(nPage, PageKind::Standard);
+ if (!pMaster)
+ continue;
+ xPopup->append(OUString::number(nPage), pMaster->GetName());
+ }
+
+ ::tools::Rectangle aRect(rCEvt.GetMousePosPixel(), Size(1, 1));
+ weld::Window* pParent = weld::GetPopupParent(GetStatusBar(), aRect);
+ OString sResult = xPopup->popup_at_rect(pParent, aRect);
+ if (!sResult.isEmpty())
+ {
+ sal_uInt16 nCurrId = sResult.toUInt32();
+ SdPage* pMaster = pDoc->GetMasterSdPage(nCurrId, PageKind::Standard);
+ SfxStringItem aStyle( ATTR_PRESLAYOUT_NAME, pMaster->GetName() );
+ pViewFrame->GetDispatcher()->ExecuteList(
+ SID_PRESENTATION_LAYOUT, SfxCallMode::SLOT, { &aStyle });
+ pViewFrame->GetBindings().Invalidate(SID_PRESENTATION_LAYOUT);
+ pViewFrame->GetBindings().Invalidate(SID_STATUS_LAYOUT);
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/controller/displaymodecontroller.cxx b/sd/source/ui/controller/displaymodecontroller.cxx
new file mode 100644
index 000000000..81ad2d19e
--- /dev/null
+++ b/sd/source/ui/controller/displaymodecontroller.cxx
@@ -0,0 +1,264 @@
+/* -*- 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 <svtools/popupwindowcontroller.hxx>
+#include <svtools/toolbarmenu.hxx>
+#include <svtools/valueset.hxx>
+#include <vcl/toolbox.hxx>
+
+#include <strings.hrc>
+
+#include <bitmaps.hlst>
+#include <sdresid.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::beans;
+
+namespace sd
+{
+
+// Component to select which display mode has to be used.
+// Composed of a dropdown button in the toolbar and a
+// popup menu to select the value
+
+namespace {
+
+class DisplayModeController : public svt::PopupWindowController
+{
+public:
+ explicit DisplayModeController( const css::uno::Reference< css::uno::XComponentContext >& rxContext );
+
+ virtual std::unique_ptr<WeldToolbarPopup> weldPopupWindow() override;
+ virtual VclPtr<vcl::Window> createVclPopupWindow( vcl::Window* pParent ) override;
+
+ // XInitialization
+ virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
+
+ void setToolboxItemImage(const OUString& rImage);
+};
+
+class DisplayModeToolbarMenu final : public WeldToolbarPopup
+{
+public:
+ DisplayModeToolbarMenu(DisplayModeController* pControl, weld::Widget* pParent);
+ virtual void GrabFocus() override
+ {
+ mxDisplayModeSet1->GrabFocus();
+ }
+
+private:
+ rtl::Reference<DisplayModeController> mxControl;
+ std::unique_ptr<weld::Frame> mxFrame1;
+ std::unique_ptr<ValueSet> mxDisplayModeSet1;
+ std::unique_ptr<weld::CustomWeld> mxDisplayModeSetWin1;
+ std::unique_ptr<weld::Frame> mxFrame2;
+ std::unique_ptr<ValueSet> mxDisplayModeSet2;
+ std::unique_ptr<weld::CustomWeld> mxDisplayModeSetWin2;
+
+ DECL_LINK(SelectValueSetHdl, ValueSet*, void);
+};
+
+struct snew_slide_value_info
+{
+ sal_uInt16 mnId;
+ OUString msBmpResId;
+ TranslateId mpStrResId;
+ const char* msUnoCommand;
+};
+
+}
+
+const snew_slide_value_info editmodes[] =
+{
+ {1,
+ BMP_DISPLAYMODE_SLIDE,
+ STR_NORMAL_MODE,
+ ".uno:NormalMultiPaneGUI" },
+ {2,
+ BMP_DISPLAYMODE_OUTLINE,
+ STR_OUTLINE_MODE,
+ ".uno:OutlineMode" },
+ {3,
+ BMP_DISPLAYMODE_NOTES,
+ STR_NOTES_MODE,
+ ".uno:NotesMode" },
+ {4,
+ BMP_DISPLAYMODE_SLIDE_SORTER,
+ STR_SLIDE_SORTER_MODE,
+ ".uno:DiaMode" },
+ {0, "", {}, "" }
+};
+
+const snew_slide_value_info mastermodes[] =
+{
+ {5,
+ BMP_DISPLAYMODE_SLIDE_MASTER,
+ STR_SLIDE_MASTER_MODE,
+ ".uno:SlideMasterPage" },
+ {6,
+ BMP_DISPLAYMODE_NOTES_MASTER,
+ STR_NOTES_MASTER_MODE,
+ ".uno:NotesMasterPage" },
+ {7,
+ BMP_DISPLAYMODE_HANDOUT_MASTER,
+ STR_HANDOUT_MASTER_MODE,
+ ".uno:HandoutMode" },
+ {0, "", {}, "" }
+};
+
+
+static void fillLayoutValueSet(ValueSet* pValue, const snew_slide_value_info* pInfo)
+{
+ Size aLayoutItemSize;
+ for( ; pInfo->mnId; pInfo++ )
+ {
+ OUString aText(SdResId(pInfo->mpStrResId));
+ BitmapEx aBmp(pInfo->msBmpResId);
+
+ pValue->InsertItem(pInfo->mnId, Image(aBmp), aText);
+
+ aLayoutItemSize.setWidth( std::max( aLayoutItemSize.Width(), aBmp.GetSizePixel().Width() ) );
+ aLayoutItemSize.setHeight( std::max( aLayoutItemSize.Height(), aBmp.GetSizePixel().Height() ) );
+ }
+
+ aLayoutItemSize = pValue->CalcItemSizePixel( aLayoutItemSize );
+ Size aSize(pValue->CalcWindowSizePixel(aLayoutItemSize));
+
+ const sal_Int32 LAYOUT_BORDER_PIX = 7;
+ aSize.AdjustWidth((pValue->GetColCount() + 1) * LAYOUT_BORDER_PIX );
+ aSize.AdjustHeight((pValue->GetLineCount() +1) * LAYOUT_BORDER_PIX );
+
+ pValue->GetDrawingArea()->set_size_request(aSize.Width(), aSize.Height());
+ pValue->SetOutputSizePixel(aSize);
+}
+
+DisplayModeToolbarMenu::DisplayModeToolbarMenu(DisplayModeController* pControl, weld::Widget* pParent)
+ : WeldToolbarPopup(pControl->getFrameInterface(), pParent, "modules/simpress/ui/displaywindow.ui", "DisplayWindow")
+ , mxControl(pControl)
+ , mxFrame1(m_xBuilder->weld_frame("editframe"))
+ , mxDisplayModeSet1(new ValueSet(nullptr))
+ , mxDisplayModeSetWin1(new weld::CustomWeld(*m_xBuilder, "valueset1", *mxDisplayModeSet1))
+ , mxFrame2(m_xBuilder->weld_frame("masterframe"))
+ , mxDisplayModeSet2(new ValueSet(nullptr))
+ , mxDisplayModeSetWin2(new weld::CustomWeld(*m_xBuilder, "valueset2", *mxDisplayModeSet2))
+{
+ mxDisplayModeSet1->SetStyle(WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NOBORDER | WB_NO_DIRECTSELECT);
+ mxDisplayModeSet1->SetStyle(WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NOBORDER | WB_NO_DIRECTSELECT);
+
+ mxDisplayModeSet1->SetSelectHdl( LINK( this, DisplayModeToolbarMenu, SelectValueSetHdl ) );
+ mxDisplayModeSet2->SetSelectHdl( LINK( this, DisplayModeToolbarMenu, SelectValueSetHdl ) );
+
+ sal_Int16 nColCount = 2;
+
+ mxDisplayModeSet1->SetColCount( nColCount );
+ fillLayoutValueSet( mxDisplayModeSet1.get(), &editmodes[0] );
+
+ mxDisplayModeSet2->SetColCount( nColCount );
+ fillLayoutValueSet( mxDisplayModeSet2.get(), &mastermodes[0] );
+}
+
+IMPL_LINK( DisplayModeToolbarMenu, SelectValueSetHdl, ValueSet*, pControl, void )
+{
+ OUString sCommandURL;
+ OUString sImage;
+
+ if( pControl == mxDisplayModeSet1.get() ) {
+ sCommandURL = OUString::createFromAscii(editmodes[mxDisplayModeSet1->GetSelectedItemId() - 1 ].msUnoCommand);
+ sImage = editmodes[mxDisplayModeSet1->GetSelectedItemId() - 1 ].msBmpResId;
+ }
+ else if( pControl == mxDisplayModeSet2.get() ) {
+ sCommandURL = OUString::createFromAscii(mastermodes[mxDisplayModeSet2->GetSelectedItemId() - 5 ].msUnoCommand);
+ sImage = mastermodes[mxDisplayModeSet2->GetSelectedItemId() - 5 ].msBmpResId;
+ }
+
+ if (!sCommandURL.isEmpty())
+ mxControl->dispatchCommand( sCommandURL, Sequence< PropertyValue >() );
+
+ mxControl->setToolboxItemImage(sImage);
+ mxControl->EndPopupMode();
+}
+
+DisplayModeController::DisplayModeController( const css::uno::Reference< css::uno::XComponentContext >& rxContext )
+: svt::PopupWindowController( rxContext, Reference< frame::XFrame >(), OUString() )
+{
+}
+
+void SAL_CALL DisplayModeController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
+{
+ svt::PopupWindowController::initialize( aArguments );
+ ToolBox* pToolBox = nullptr;
+ ToolBoxItemId nId;
+ if ( getToolboxId( nId, &pToolBox ) )
+ pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ToolBoxItemBits::DROPDOWNONLY );
+ setToolboxItemImage(BMP_DISPLAYMODE_SLIDE);
+}
+
+std::unique_ptr<WeldToolbarPopup> DisplayModeController::weldPopupWindow()
+{
+ return std::make_unique<sd::DisplayModeToolbarMenu>(this, m_pToolbar);
+}
+
+VclPtr<vcl::Window> DisplayModeController::createVclPopupWindow( vcl::Window* pParent )
+{
+ mxInterimPopover = VclPtr<InterimToolbarPopup>::Create(getFrameInterface(), pParent,
+ std::make_unique<sd::DisplayModeToolbarMenu>(this, pParent->GetFrameWeld()));
+
+ mxInterimPopover->Show();
+
+ return mxInterimPopover;
+}
+
+void DisplayModeController::setToolboxItemImage(const OUString& rImage)
+{
+ ToolBoxItemId nId;
+ ToolBox* pToolBox = nullptr;
+ if (!getToolboxId( nId, &pToolBox ))
+ return;
+
+ BitmapEx aBmp(rImage);
+ int targetSize = (pToolBox->GetToolboxButtonSize() == ToolBoxButtonSize::Large) ? 32 : 16;
+ double scale = 1.0f;
+ Size size = aBmp.GetSizePixel();
+ if (size.Width() > targetSize)
+ scale = static_cast<double>(targetSize) / static_cast<double>(size.Width());
+ if (size.Height() > targetSize)
+ scale = ::std::min( scale, static_cast<double>(targetSize) / static_cast<double>(size.Height()) );
+ aBmp.Scale( scale, scale );
+ pToolBox->SetItemImage( nId, Image( aBmp ) );
+}
+
+// XServiceInfo
+
+OUString SAL_CALL DisplayModeController::getImplementationName()
+{
+ return "com.sun.star.comp.sd.DisplayModeController";
+}
+
+Sequence< OUString > SAL_CALL DisplayModeController::getSupportedServiceNames( )
+{
+ css::uno::Sequence<OUString> aRet { "com.sun.star.frame.ToolbarController" };
+ return aRet;
+}
+
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT ::com::sun::star::uno::XInterface*
+com_sun_star_comp_sd_DisplayModeController_get_implementation( css::uno::XComponentContext* context,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::DisplayModeController(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/controller/slidelayoutcontroller.cxx b/sd/source/ui/controller/slidelayoutcontroller.cxx
new file mode 100644
index 000000000..251548a22
--- /dev/null
+++ b/sd/source/ui/controller/slidelayoutcontroller.cxx
@@ -0,0 +1,380 @@
+/* -*- 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 <com/sun/star/frame/XFrame.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/DrawViewMode.hpp>
+
+#include <comphelper/propertyvalue.hxx>
+#include <vcl/commandinfoprovider.hxx>
+#include <vcl/toolbox.hxx>
+
+#include <svl/cjkoptions.hxx>
+
+#include <svtools/toolbarmenu.hxx>
+#include <svtools/valueset.hxx>
+
+#include <xmloff/autolayout.hxx>
+
+#include <strings.hrc>
+
+#include <bitmaps.hlst>
+#include <sdresid.hxx>
+#include "slidelayoutcontroller.hxx"
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::beans;
+
+namespace sd
+{
+
+namespace {
+
+class LayoutToolbarMenu : public WeldToolbarPopup
+{
+public:
+ LayoutToolbarMenu(SlideLayoutController* pController, weld::Widget* pParent, const bool bInsertPage, const OUString& rCommand);
+ virtual void GrabFocus() override
+ {
+ mxLayoutSet1->GrabFocus();
+ }
+
+protected:
+ DECL_LINK(SelectToolbarMenuHdl, weld::Button&, void);
+ DECL_LINK(SelectValueSetHdl, ValueSet*, void);
+ void SelectHdl(AutoLayout eLayout);
+private:
+ rtl::Reference<SlideLayoutController> mxControl;
+ bool const mbInsertPage;
+ std::unique_ptr<weld::Frame> mxFrame1;
+ std::unique_ptr<ValueSet> mxLayoutSet1;
+ std::unique_ptr<weld::CustomWeld> mxLayoutSetWin1;
+ std::unique_ptr<weld::Frame> mxFrame2;
+ std::unique_ptr<ValueSet> mxLayoutSet2;
+ std::unique_ptr<weld::CustomWeld> mxLayoutSetWin2;
+ std::unique_ptr<weld::Button> mxMoreButton;
+};
+
+struct snew_slide_value_info_layout
+{
+ rtl::OUStringConstExpr msBmpResId;
+ TranslateId mpStrResId;
+ AutoLayout maAutoLayout;
+};
+
+}
+
+constexpr OUStringLiteral EMPTY = u"";
+
+const snew_slide_value_info_layout notes[] =
+{
+ {BMP_SLIDEN_01, STR_AUTOLAYOUT_NOTES, AUTOLAYOUT_NOTES},
+ {EMPTY, {}, AUTOLAYOUT_NONE},
+};
+
+const snew_slide_value_info_layout handout[] =
+{
+ {BMP_SLIDEH_01, STR_AUTOLAYOUT_HANDOUT1, AUTOLAYOUT_HANDOUT1},
+ {BMP_SLIDEH_02, STR_AUTOLAYOUT_HANDOUT2, AUTOLAYOUT_HANDOUT2},
+ {BMP_SLIDEH_03, STR_AUTOLAYOUT_HANDOUT3, AUTOLAYOUT_HANDOUT3},
+ {BMP_SLIDEH_04, STR_AUTOLAYOUT_HANDOUT4, AUTOLAYOUT_HANDOUT4},
+ {BMP_SLIDEH_06, STR_AUTOLAYOUT_HANDOUT6, AUTOLAYOUT_HANDOUT6},
+ {BMP_SLIDEH_09, STR_AUTOLAYOUT_HANDOUT9, AUTOLAYOUT_HANDOUT9},
+ {EMPTY, {}, AUTOLAYOUT_NONE},
+};
+
+const snew_slide_value_info_layout standard[] =
+{
+ {BMP_LAYOUT_EMPTY, STR_AUTOLAYOUT_NONE, AUTOLAYOUT_NONE },
+ {BMP_LAYOUT_HEAD03, STR_AUTOLAYOUT_TITLE, AUTOLAYOUT_TITLE },
+ {BMP_LAYOUT_HEAD02, STR_AUTOLAYOUT_CONTENT, AUTOLAYOUT_TITLE_CONTENT },
+ {BMP_LAYOUT_HEAD02A, STR_AUTOLAYOUT_2CONTENT, AUTOLAYOUT_TITLE_2CONTENT },
+ {BMP_LAYOUT_HEAD01, STR_AUTOLAYOUT_ONLY_TITLE, AUTOLAYOUT_TITLE_ONLY },
+ {BMP_LAYOUT_TEXTONLY, STR_AUTOLAYOUT_ONLY_TEXT, AUTOLAYOUT_ONLY_TEXT },
+ {BMP_LAYOUT_HEAD03B, STR_AUTOLAYOUT_2CONTENT_CONTENT, AUTOLAYOUT_TITLE_2CONTENT_CONTENT },
+ {BMP_LAYOUT_HEAD03C, STR_AUTOLAYOUT_CONTENT_2CONTENT, AUTOLAYOUT_TITLE_CONTENT_2CONTENT },
+ {BMP_LAYOUT_HEAD03A, STR_AUTOLAYOUT_2CONTENT_OVER_CONTENT,AUTOLAYOUT_TITLE_2CONTENT_OVER_CONTENT },
+ {BMP_LAYOUT_HEAD02B, STR_AUTOLAYOUT_CONTENT_OVER_CONTENT, AUTOLAYOUT_TITLE_CONTENT_OVER_CONTENT },
+ {BMP_LAYOUT_HEAD04, STR_AUTOLAYOUT_4CONTENT, AUTOLAYOUT_TITLE_4CONTENT },
+ {BMP_LAYOUT_HEAD06, STR_AUTOLAYOUT_6CONTENT, AUTOLAYOUT_TITLE_6CONTENT },
+ {EMPTY, {}, AUTOLAYOUT_NONE}
+};
+
+const snew_slide_value_info_layout v_standard[] =
+{
+ // vertical
+ {BMP_LAYOUT_VERTICAL02, STR_AL_VERT_TITLE_TEXT_CHART, AUTOLAYOUT_VTITLE_VCONTENT_OVER_VCONTENT },
+ {BMP_LAYOUT_VERTICAL01, STR_AL_VERT_TITLE_VERT_OUTLINE, AUTOLAYOUT_VTITLE_VCONTENT },
+ {BMP_LAYOUT_HEAD02, STR_AL_TITLE_VERT_OUTLINE, AUTOLAYOUT_TITLE_VCONTENT },
+ {BMP_LAYOUT_HEAD02A, STR_AL_TITLE_VERT_OUTLINE_CLIPART, AUTOLAYOUT_TITLE_2VTEXT },
+ {EMPTY, {}, AUTOLAYOUT_NONE}
+};
+
+static void fillLayoutValueSet( ValueSet* pValue, const snew_slide_value_info_layout* pInfo )
+{
+ Size aLayoutItemSize;
+ for( ; pInfo->mpStrResId; pInfo++ )
+ {
+ OUString aText(SdResId(pInfo->mpStrResId));
+ Image aImg(StockImage::Yes, pInfo->msBmpResId);
+ pValue->InsertItem(static_cast<sal_uInt16>(pInfo->maAutoLayout)+1, aImg, aText);
+ aLayoutItemSize.setWidth( std::max( aLayoutItemSize.Width(), aImg.GetSizePixel().Width() ) );
+ aLayoutItemSize.setHeight( std::max( aLayoutItemSize.Height(), aImg.GetSizePixel().Height() ) );
+ }
+
+ aLayoutItemSize = pValue->CalcItemSizePixel( aLayoutItemSize );
+ Size aSize(pValue->CalcWindowSizePixel(aLayoutItemSize));
+
+ const sal_Int32 LAYOUT_BORDER_PIX = 7;
+
+ aSize.AdjustWidth((pValue->GetColCount() + 1) * LAYOUT_BORDER_PIX);
+ aSize.AdjustHeight((pValue->GetLineCount() +1) * LAYOUT_BORDER_PIX);
+
+ pValue->GetDrawingArea()->set_size_request(aSize.Width(), aSize.Height());
+ pValue->SetOutputSizePixel(aSize);
+}
+
+LayoutToolbarMenu::LayoutToolbarMenu(SlideLayoutController* pControl, weld::Widget* pParent, const bool bInsertPage, const OUString& rCommand)
+ : WeldToolbarPopup(pControl->getFrameInterface(), pParent, "modules/simpress/ui/layoutwindow.ui", "LayoutWindow")
+ , mxControl(pControl)
+ , mbInsertPage(bInsertPage)
+ , mxFrame1(m_xBuilder->weld_frame("horiframe"))
+ , mxLayoutSet1(new ValueSet(nullptr))
+ , mxLayoutSetWin1(new weld::CustomWeld(*m_xBuilder, "valueset1", *mxLayoutSet1))
+ , mxFrame2(m_xBuilder->weld_frame("vertframe"))
+ , mxLayoutSet2(new ValueSet(nullptr))
+ , mxLayoutSetWin2(new weld::CustomWeld(*m_xBuilder, "valueset2", *mxLayoutSet2))
+ , mxMoreButton(m_xBuilder->weld_button("more"))
+{
+ mxLayoutSet1->SetStyle(WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NOBORDER | WB_NO_DIRECTSELECT);
+ mxLayoutSet2->SetStyle(WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NOBORDER | WB_NO_DIRECTSELECT);
+
+ DrawViewMode eMode = DrawViewMode_DRAW;
+
+ // find out which view is running
+ if( m_xFrame.is() ) try
+ {
+ Reference< XPropertySet > xControllerSet( m_xFrame->getController(), UNO_QUERY_THROW );
+ xControllerSet->getPropertyValue( "DrawViewMode" ) >>= eMode;
+ }
+ catch( Exception& )
+ {
+ OSL_ASSERT(false);
+ }
+
+ const bool bVerticalEnabled = SvtCJKOptions::IsVerticalTextEnabled();
+
+ mxLayoutSet1->SetSelectHdl( LINK( this, LayoutToolbarMenu, SelectValueSetHdl ) );
+
+ const snew_slide_value_info_layout* pInfo = nullptr;
+ sal_Int16 nColCount = 4;
+ switch( eMode )
+ {
+ case DrawViewMode_DRAW: pInfo = &standard[0]; break;
+ case DrawViewMode_HANDOUT: pInfo = &handout[0]; nColCount = 2; break;
+ case DrawViewMode_NOTES: pInfo = &notes[0]; nColCount = 1; break;
+ default: assert(false); // can't happen, will crash later otherwise
+ }
+
+ mxLayoutSet1->SetColCount( nColCount );
+
+ fillLayoutValueSet( mxLayoutSet1.get(), pInfo );
+
+ bool bUseUILabel = (bVerticalEnabled && eMode == DrawViewMode_DRAW);
+ if (!bUseUILabel)
+ {
+ auto aProperties = vcl::CommandInfoProvider::GetCommandProperties(rCommand, mxControl->getModuleName());
+ mxFrame1->set_label(vcl::CommandInfoProvider::GetLabelForCommand(aProperties));
+ }
+
+ if (bVerticalEnabled && eMode == DrawViewMode_DRAW)
+ {
+ mxLayoutSet2->SetSelectHdl( LINK( this, LayoutToolbarMenu, SelectValueSetHdl ) );
+ mxLayoutSet2->SetColCount( 4 );
+ mxLayoutSet2->EnableFullItemMode( false );
+
+ fillLayoutValueSet( mxLayoutSet2.get(), &v_standard[0] );
+
+ mxFrame2->show();
+ }
+
+ if( eMode != DrawViewMode_DRAW )
+ return;
+
+ if( !m_xFrame.is() )
+ return;
+
+ OUString sSlotStr;
+
+ if( bInsertPage )
+ sSlotStr = ".uno:DuplicatePage";
+ else
+ sSlotStr = ".uno:Undo";
+
+ css::uno::Reference<css::graphic::XGraphic> xSlotImage = vcl::CommandInfoProvider::GetXGraphicForCommand(sSlotStr, m_xFrame);
+
+ OUString sSlotTitle;
+ if( bInsertPage )
+ {
+ auto aProperties = vcl::CommandInfoProvider::GetCommandProperties(sSlotStr, mxControl->getModuleName());
+ sSlotTitle = vcl::CommandInfoProvider::GetLabelForCommand(aProperties);
+ }
+ else
+ sSlotTitle = SdResId( STR_RESET_LAYOUT );
+
+ mxMoreButton->set_label(sSlotTitle);
+ mxMoreButton->set_image(xSlotImage);
+ mxMoreButton->connect_clicked(LINK(this, LayoutToolbarMenu, SelectToolbarMenuHdl));
+ mxMoreButton->show();
+}
+
+IMPL_LINK(LayoutToolbarMenu, SelectValueSetHdl, ValueSet*, pLayoutSet, void)
+{
+ SelectHdl(static_cast<AutoLayout>(pLayoutSet->GetSelectedItemId()-1));
+}
+
+IMPL_LINK_NOARG(LayoutToolbarMenu, SelectToolbarMenuHdl, weld::Button&, void)
+{
+ SelectHdl(AUTOLAYOUT_END);
+}
+
+void LayoutToolbarMenu::SelectHdl(AutoLayout eLayout)
+{
+ Sequence< PropertyValue > aArgs;
+
+ OUString sCommandURL( mxControl->getCommandURL() );
+
+ if( eLayout != AUTOLAYOUT_END )
+ {
+ aArgs = { comphelper::makePropertyValue("WhatLayout", static_cast<sal_Int32>(eLayout)) };
+ }
+ else if( mbInsertPage )
+ {
+ sCommandURL = ".uno:DuplicatePage";
+ }
+
+ mxControl->dispatchCommand( sCommandURL, aArgs );
+
+ mxControl->EndPopupMode();
+}
+
+
+/// @throws css::uno::RuntimeException
+static OUString SlideLayoutController_getImplementationName()
+{
+ return "com.sun.star.comp.sd.SlideLayoutController";
+}
+
+/// @throws RuntimeException
+static Sequence< OUString > SlideLayoutController_getSupportedServiceNames()
+{
+ Sequence<OUString> aSNS { "com.sun.star.frame.ToolbarController" };
+ return aSNS;
+}
+
+/// @throws css::uno::RuntimeException
+static OUString InsertSlideController_getImplementationName()
+{
+ return "com.sun.star.comp.sd.InsertSlideController";
+}
+
+/// @throws RuntimeException
+static Sequence< OUString > InsertSlideController_getSupportedServiceNames()
+{
+ Sequence<OUString> aSNS { "com.sun.star.frame.ToolbarController" };
+ return aSNS;
+}
+
+SlideLayoutController::SlideLayoutController(const Reference< uno::XComponentContext >& rxContext, bool bInsertPage)
+ : svt::PopupWindowController(rxContext, nullptr, OUString())
+ , mbInsertPage(bInsertPage)
+{
+}
+
+void SAL_CALL SlideLayoutController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
+{
+ svt::PopupWindowController::initialize( aArguments );
+
+ ToolBox* pToolBox = nullptr;
+ ToolBoxItemId nId;
+ if ( getToolboxId( nId, &pToolBox ) )
+ {
+ if ( mbInsertPage )
+ pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ToolBoxItemBits::DROPDOWN );
+ else
+ pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ToolBoxItemBits::DROPDOWNONLY );
+ }
+}
+
+std::unique_ptr<WeldToolbarPopup> SlideLayoutController::weldPopupWindow()
+{
+ return std::make_unique<sd::LayoutToolbarMenu>(this, m_pToolbar, mbInsertPage, m_aCommandURL);
+}
+
+VclPtr<vcl::Window> SlideLayoutController::createVclPopupWindow( vcl::Window* pParent )
+{
+ mxInterimPopover = VclPtr<InterimToolbarPopup>::Create(getFrameInterface(), pParent,
+ std::make_unique<sd::LayoutToolbarMenu>(this, pParent->GetFrameWeld(), mbInsertPage, m_aCommandURL));
+
+ mxInterimPopover->Show();
+
+ return mxInterimPopover;
+}
+
+// XServiceInfo
+
+OUString SAL_CALL SlideLayoutController::getImplementationName()
+{
+ if( mbInsertPage )
+ return InsertSlideController_getImplementationName();
+ else
+ return SlideLayoutController_getImplementationName();
+}
+
+Sequence< OUString > SAL_CALL SlideLayoutController::getSupportedServiceNames( )
+{
+ if( mbInsertPage )
+ return InsertSlideController_getSupportedServiceNames();
+ else
+ return SlideLayoutController_getSupportedServiceNames();
+}
+
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_sd_SlideLayoutController_get_implementation(css::uno::XComponentContext* context,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::SlideLayoutController(context, false));
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_sd_InsertSlideController_get_implementation(css::uno::XComponentContext* context,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::SlideLayoutController(context, true));
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/controller/slidelayoutcontroller.hxx b/sd/source/ui/controller/slidelayoutcontroller.hxx
new file mode 100644
index 000000000..ae4a3a09f
--- /dev/null
+++ b/sd/source/ui/controller/slidelayoutcontroller.hxx
@@ -0,0 +1,47 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svtools/popupwindowcontroller.hxx>
+
+namespace sd
+{
+class SlideLayoutController : public svt::PopupWindowController
+{
+public:
+ SlideLayoutController(const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ bool bInsertPage);
+
+ virtual std::unique_ptr<WeldToolbarPopup> weldPopupWindow() override;
+ virtual VclPtr<vcl::Window> createVclPopupWindow(vcl::Window* pParent) override;
+
+ // XInitialization
+ virtual void SAL_CALL initialize(const css::uno::Sequence<css::uno::Any>& aArguments) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ bool mbInsertPage;
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/AnimationChildWindow.cxx b/sd/source/ui/dlg/AnimationChildWindow.cxx
new file mode 100644
index 000000000..2f221fc9e
--- /dev/null
+++ b/sd/source/ui/dlg/AnimationChildWindow.cxx
@@ -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/.
+ *
+ * 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 <AnimationChildWindow.hxx>
+
+#include <app.hrc>
+#include <animobjs.hxx>
+#include <sfx2/childwin.hxx>
+
+namespace sd {
+
+SFX_IMPL_DOCKINGWINDOW_WITHID(AnimationChildWindow, SID_ANIMATION_OBJECTS)
+
+/**
+ * Derivative from SfxChildWindow as "container" for animator
+ */
+AnimationChildWindow::AnimationChildWindow(
+ vcl::Window* _pParent,
+ sal_uInt16 nId,
+ SfxBindings* pBindings,
+ SfxChildWinInfo* pInfo )
+ : SfxChildWindow( _pParent, nId )
+{
+ VclPtr<AnimationWindow> pAnimWin = VclPtr<AnimationWindow>::Create(pBindings, this, _pParent);
+ SetWindow(pAnimWin);
+
+ pAnimWin->Initialize( pInfo );
+
+ SetHideNotDelete( true );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/BulletAndPositionDlg.cxx b/sd/source/ui/dlg/BulletAndPositionDlg.cxx
new file mode 100644
index 000000000..384b477e4
--- /dev/null
+++ b/sd/source/ui/dlg/BulletAndPositionDlg.cxx
@@ -0,0 +1,1293 @@
+/* -*- 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 <tools/mapunit.hxx>
+#include <tools/urlobj.hxx>
+#include <editeng/numitem.hxx>
+#include <svl/eitem.hxx>
+#include <svl/itempool.hxx>
+#include <svx/colorbox.hxx>
+#include <svx/strarray.hxx>
+#include <svx/gallery.hxx>
+#include <editeng/brushitem.hxx>
+#include <svl/intitem.hxx>
+#include <vcl/graph.hxx>
+#include <svtools/unitconv.hxx>
+#include <svx/svxids.hrc>
+
+#include <algorithm>
+#include <memory>
+#include <vector>
+#include <sfx2/opengrf.hxx>
+
+#include <strings.hrc>
+#include <svl/stritem.hxx>
+#include <sal/log.hxx>
+#include <vcl/virdev.hxx>
+#include <svx/SvxNumOptionsTabPageHelper.hxx>
+#include <View.hxx>
+#include <drawdoc.hxx>
+#include <cui/cuicharmap.hxx>
+#include <BulletAndPositionDlg.hxx>
+#include <sdresid.hxx>
+#include <DrawViewShell.hxx>
+
+#define SHOW_NUMBERING 0
+#define SHOW_BULLET 1
+#define SHOW_BITMAP 2
+
+#define MAX_BMP_WIDTH 16
+#define MAX_BMP_HEIGHT 16
+
+static bool bLastRelative = false;
+
+static const vcl::Font& lcl_GetDefaultBulletFont()
+{
+ static vcl::Font aDefBulletFont = []() {
+ vcl::Font tmp("OpenSymbol", "", Size(0, 14));
+ tmp.SetCharSet(RTL_TEXTENCODING_SYMBOL);
+ tmp.SetFamily(FAMILY_DONTKNOW);
+ tmp.SetPitch(PITCH_DONTKNOW);
+ tmp.SetWeight(WEIGHT_DONTKNOW);
+ tmp.SetTransparent(true);
+ return tmp;
+ }();
+ return aDefBulletFont;
+}
+
+class SdDrawDocument;
+
+SvxBulletAndPositionDlg::SvxBulletAndPositionDlg(weld::Window* pWindow, const SfxItemSet& rSet,
+ const ::sd::View* pView)
+ : GenericDialogController(pWindow, "cui/ui/bulletandposition.ui", "BulletAndPosition")
+ , aInvalidateTimer("sd SvxBulletAndPositionDlg aInvalidateTimer")
+ , rFirstStateSet(rSet)
+ , bLastWidthModified(false)
+ , bModified(false)
+ , bInInitControl(false)
+ , bLabelAlignmentPosAndSpaceModeActive(false)
+ , bApplyToMaster(false)
+ , nBullet(0xff)
+ , nActNumLvl(1)
+ , p_Window(pWindow)
+ , nNumItemId(SID_ATTR_NUMBERING_RULE)
+ , m_xGrid(m_xBuilder->weld_widget("grid2"))
+ , m_xLevelLB(m_xBuilder->weld_tree_view("levellb"))
+ , m_xFmtLB(m_xBuilder->weld_combo_box("numfmtlb"))
+ , m_xPrefixFT(m_xBuilder->weld_label("prefixft"))
+ , m_xPrefixED(m_xBuilder->weld_entry("prefix"))
+ , m_xSuffixFT(m_xBuilder->weld_label("suffixft"))
+ , m_xSuffixED(m_xBuilder->weld_entry("suffix"))
+ , m_xBeforeAfter(m_xBuilder->weld_frame("beforeafter"))
+ , m_xBulColorFT(m_xBuilder->weld_label("colorft"))
+ , m_xBulColLB(new ColorListBox(m_xBuilder->weld_menu_button("color"),
+ [this] { return m_xDialog.get(); }))
+ , m_xBulRelSizeFT(m_xBuilder->weld_label("relsizeft"))
+ , m_xBulRelSizeMF(m_xBuilder->weld_metric_spin_button("relsize", FieldUnit::PERCENT))
+ , m_xStartFT(m_xBuilder->weld_label("startatft"))
+ , m_xStartED(m_xBuilder->weld_spin_button("startat"))
+ , m_xBulletFT(m_xBuilder->weld_label("bulletft"))
+ , m_xBulletPB(m_xBuilder->weld_button("bullet"))
+ , m_xBitmapMB(m_xBuilder->weld_menu_button("bitmap"))
+ , m_xWidthFT(m_xBuilder->weld_label("widthft"))
+ , m_xWidthMF(m_xBuilder->weld_metric_spin_button("widthmf", FieldUnit::CM))
+ , m_xHeightFT(m_xBuilder->weld_label("heightft"))
+ , m_xHeightMF(m_xBuilder->weld_metric_spin_button("heightmf", FieldUnit::CM))
+ , m_xRatioCB(m_xBuilder->weld_check_button("keepratio"))
+ , m_xPreviewWIN(new weld::CustomWeld(*m_xBuilder, "preview", m_aPreviewWIN))
+ , m_xDistBorderFT(m_xBuilder->weld_label("indent"))
+ , m_xDistBorderMF(m_xBuilder->weld_metric_spin_button("indentmf", FieldUnit::CM))
+ , m_xRelativeCB(m_xBuilder->weld_check_button("relative"))
+ , m_xIndentFT(m_xBuilder->weld_label("numberingwidth"))
+ , m_xIndentMF(m_xBuilder->weld_metric_spin_button("numberingwidthmf", FieldUnit::CM))
+ , m_xLeftTB(m_xBuilder->weld_toggle_button("left"))
+ , m_xCenterTB(m_xBuilder->weld_toggle_button("center"))
+ , m_xRightTB(m_xBuilder->weld_toggle_button("right"))
+ , m_xSlideRB(m_xBuilder->weld_radio_button("sliderb"))
+ , m_xSelectionRB(m_xBuilder->weld_radio_button("selectionrb"))
+ , m_xApplyToMaster(m_xBuilder->weld_toggle_button("applytomaster"))
+ , m_xReset(m_xBuilder->weld_button("reset"))
+{
+ m_xBulColLB->SetSlotId(SID_ATTR_CHAR_COLOR);
+ m_xBulRelSizeMF->set_min(SVX_NUM_REL_SIZE_MIN, FieldUnit::PERCENT);
+ m_xBulRelSizeMF->set_increments(5, 50, FieldUnit::PERCENT);
+ aActBulletFont = lcl_GetDefaultBulletFont();
+
+ m_xBulletPB->connect_clicked(LINK(this, SvxBulletAndPositionDlg, BulletHdl_Impl));
+ m_xFmtLB->connect_changed(LINK(this, SvxBulletAndPositionDlg, NumberTypeSelectHdl_Impl));
+ m_xBitmapMB->connect_selected(LINK(this, SvxBulletAndPositionDlg, GraphicHdl_Impl));
+ m_xBitmapMB->connect_toggled(LINK(this, SvxBulletAndPositionDlg, PopupActivateHdl_Impl));
+ m_xLevelLB->set_selection_mode(SelectionMode::Multiple);
+ m_xLevelLB->connect_changed(LINK(this, SvxBulletAndPositionDlg, LevelHdl_Impl));
+ m_xWidthMF->connect_value_changed(LINK(this, SvxBulletAndPositionDlg, SizeHdl_Impl));
+ m_xHeightMF->connect_value_changed(LINK(this, SvxBulletAndPositionDlg, SizeHdl_Impl));
+ m_xRatioCB->connect_toggled(LINK(this, SvxBulletAndPositionDlg, RatioHdl_Impl));
+ m_xStartED->connect_value_changed(LINK(this, SvxBulletAndPositionDlg, SpinModifyHdl_Impl));
+ m_xPrefixED->connect_changed(LINK(this, SvxBulletAndPositionDlg, EditModifyHdl_Impl));
+ m_xSuffixED->connect_changed(LINK(this, SvxBulletAndPositionDlg, EditModifyHdl_Impl));
+ m_xBulRelSizeMF->connect_value_changed(LINK(this, SvxBulletAndPositionDlg, BulRelSizeHdl_Impl));
+ m_xBulColLB->SetSelectHdl(LINK(this, SvxBulletAndPositionDlg, BulColorHdl_Impl));
+ m_xLeftTB->connect_toggled(LINK(this, SvxBulletAndPositionDlg, SelectLeftAlignmentHdl_Impl));
+ m_xCenterTB->connect_toggled(
+ LINK(this, SvxBulletAndPositionDlg, SelectCenterAlignmentHdl_Impl));
+ m_xRightTB->connect_toggled(LINK(this, SvxBulletAndPositionDlg, SelectRightAlignmentHdl_Impl));
+ m_xApplyToMaster->connect_toggled(LINK(this, SvxBulletAndPositionDlg, ApplyToMasterHdl_Impl));
+ m_xReset->connect_clicked(LINK(this, SvxBulletAndPositionDlg, ResetHdl_Impl));
+
+ aInvalidateTimer.SetInvokeHandler(
+ LINK(this, SvxBulletAndPositionDlg, PreviewInvalidateHdl_Impl));
+ aInvalidateTimer.SetTimeout(50);
+
+ eCoreUnit = rSet.GetPool()->GetMetric(rSet.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE));
+
+ // Fill ListBox with predefined / translated numbering types.
+ sal_uInt32 nCount = SvxNumberingTypeTable::Count();
+ for (sal_uInt32 i = 0; i < nCount; ++i)
+ {
+ m_xFmtLB->append(OUString::number(SvxNumberingTypeTable::GetValue(i)),
+ SvxNumberingTypeTable::GetString(i));
+ }
+
+ // Get advanced numbering types from the component.
+ // Watch out for the ugly
+ // 136 == 0x88 == SVX_NUM_BITMAP|0x80 == SVX_NUM_BITMAP|LINK_TOKEN
+ // to not remove that.
+ SvxNumOptionsTabPageHelper::GetI18nNumbering(*m_xFmtLB, (SVX_NUM_BITMAP | LINK_TOKEN));
+
+ m_xFmtLB->set_active(0);
+ m_xRelativeCB->set_active(true);
+
+ Link<weld::MetricSpinButton&, void> aLk3
+ = LINK(this, SvxBulletAndPositionDlg, DistanceHdl_Impl);
+ m_xDistBorderMF->connect_value_changed(aLk3);
+ m_xIndentMF->connect_value_changed(aLk3);
+
+ m_xRelativeCB->connect_toggled(LINK(this, SvxBulletAndPositionDlg, RelativeHdl_Impl));
+ m_xRelativeCB->set_active(bLastRelative);
+
+ Size aSize(m_xGrid->get_preferred_size());
+ m_xGrid->set_size_request(aSize.Width(), -1);
+
+ // PageCreated
+ FieldUnit eMetric = pView->GetDoc().GetUIUnit();
+ SfxAllItemSet aSet(*(rSet.GetPool()));
+ aSet.Put(SfxUInt16Item(SID_METRIC_ITEM, static_cast<sal_uInt16>(eMetric)));
+
+ const SfxStringItem* pNumCharFmt = aSet.GetItem<SfxStringItem>(SID_NUM_CHAR_FMT, false);
+ const SfxUInt16Item* pMetricItem = aSet.GetItem<SfxUInt16Item>(SID_METRIC_ITEM, false);
+
+ if (pNumCharFmt)
+ SetCharFmt(pNumCharFmt->GetValue());
+
+ if (pMetricItem)
+ SetMetric(static_cast<FieldUnit>(pMetricItem->GetValue()));
+
+ // tdf#130526: Hide "Apply To Master"-button in Draw and rename "Slide" to "Page"
+ DocumentType aDocumentType = pView->GetDoc().GetDocumentType();
+ if (aDocumentType == DocumentType::Draw)
+ {
+ m_xApplyToMaster->hide();
+ m_xSlideRB->set_label(SdResId(STR_PAGE_NAME));
+ }
+ // tdf#137406: Crash when clicking "Apply to Master" in Slide Master mode on Bullets and Numbering dialog
+ EditMode aEditmode = static_cast<::sd::DrawViewShell*>(pView->GetViewShell())->GetEditMode();
+ if (aDocumentType == DocumentType::Impress && aEditmode == EditMode::MasterPage)
+ m_xApplyToMaster->hide();
+
+ // End PageCreated
+
+ Reset(&rSet);
+
+ // ActivatePage part
+
+ const SfxItemSet* pExampleSet = &rSet;
+ sal_uInt16 nTmpNumLvl = 1;
+ bool bPreset = false;
+ if (pExampleSet)
+ {
+ if (const SfxBoolItem* pItem = pExampleSet->GetItemIfSet(SID_PARAM_NUM_PRESET, false))
+ bPreset = pItem->GetValue();
+ if (const SfxUInt16Item* pItem = pExampleSet->GetItemIfSet(SID_PARAM_CUR_NUM_LEVEL, false))
+ nTmpNumLvl = pItem->GetValue();
+ }
+ if (const SvxNumBulletItem* pItem = rSet.GetItemIfSet(nNumItemId, false))
+ {
+ pSaveNum.reset(new SvxNumRule(pItem->GetNumRule()));
+ }
+
+ bModified = (!pActNum->Get(0) || bPreset);
+ if (*pActNum != *pSaveNum || nActNumLvl != nTmpNumLvl)
+ {
+ nActNumLvl = nTmpNumLvl;
+ sal_uInt16 nMask = 1;
+ if (nActNumLvl == SAL_MAX_UINT16)
+ m_xLevelLB->select(pActNum->GetLevelCount());
+ if (nActNumLvl != SAL_MAX_UINT16)
+ {
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ if (nActNumLvl & nMask)
+ m_xLevelLB->select(i);
+ nMask <<= 1;
+ }
+ }
+ *pActNum = *pSaveNum;
+
+ m_xRelativeCB->set_sensitive(nActNumLvl != 1);
+
+ InitPosAndSpaceMode();
+ InitControls();
+ }
+
+ m_aPreviewWIN.SetLevel(nActNumLvl);
+ m_aPreviewWIN.Invalidate();
+
+ // End of the ActivatePage part
+}
+
+SvxBulletAndPositionDlg::~SvxBulletAndPositionDlg() {}
+
+void SvxBulletAndPositionDlg::SetMetric(FieldUnit eMetric)
+{
+ if (eMetric == FieldUnit::MM)
+ {
+ m_xWidthMF->set_digits(1);
+ m_xHeightMF->set_digits(1);
+ m_xDistBorderMF->set_digits(1);
+ m_xIndentMF->set_digits(1);
+ }
+ m_xWidthMF->set_unit(eMetric);
+ m_xHeightMF->set_unit(eMetric);
+ m_xDistBorderMF->set_unit(eMetric);
+ m_xIndentMF->set_unit(eMetric);
+}
+
+SfxItemSet* SvxBulletAndPositionDlg::GetOutputItemSet(SfxItemSet* pSet)
+{
+ pSet->Put(SfxUInt16Item(SID_PARAM_CUR_NUM_LEVEL, nActNumLvl));
+ if (bModified && pActNum)
+ {
+ *pSaveNum = *pActNum;
+ pSet->Put(SvxNumBulletItem(*pSaveNum, nNumItemId));
+ pSet->Put(SfxBoolItem(SID_PARAM_NUM_PRESET, false));
+ }
+ return pSet;
+};
+
+bool SvxBulletAndPositionDlg::IsApplyToMaster() const { return bApplyToMaster; }
+bool SvxBulletAndPositionDlg::IsSlideScope() const { return m_xSlideRB->get_active(); }
+
+void SvxBulletAndPositionDlg::Reset(const SfxItemSet* rSet)
+{
+ const SvxNumBulletItem* pItem = rSet->GetItemIfSet(SID_ATTR_NUMBERING_RULE, false);
+ // in Draw the item exists as WhichId, in Writer only as SlotId
+ if (!pItem)
+ {
+ nNumItemId = rSet->GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE);
+ pItem = rSet->GetItemIfSet(nNumItemId, false);
+
+ if (!pItem)
+ {
+ pItem = &rSet->Get(nNumItemId);
+ }
+ }
+ DBG_ASSERT(pItem, "no item found!");
+ pSaveNum.reset(new SvxNumRule(pItem->GetNumRule()));
+
+ // insert levels
+ if (!m_xLevelLB->n_children())
+ {
+ for (sal_uInt16 i = 1; i <= pSaveNum->GetLevelCount(); i++)
+ m_xLevelLB->append_text(OUString::number(i));
+ if (pSaveNum->GetLevelCount() > 1)
+ {
+ OUString sEntry = "1 - " + OUString::number(pSaveNum->GetLevelCount());
+ m_xLevelLB->append_text(sEntry);
+ m_xLevelLB->select_text(sEntry);
+ }
+ else
+ m_xLevelLB->select(0);
+ }
+ else
+ m_xLevelLB->select(m_xLevelLB->n_children() - 1);
+
+ sal_uInt16 nMask = 1;
+ m_xLevelLB->unselect_all();
+ if (nActNumLvl == SAL_MAX_UINT16)
+ {
+ m_xLevelLB->select(pSaveNum->GetLevelCount());
+ }
+ else
+ {
+ for (sal_uInt16 i = 0; i < pSaveNum->GetLevelCount(); i++)
+ {
+ if (nActNumLvl & nMask)
+ m_xLevelLB->select(i);
+ nMask <<= 1;
+ }
+ }
+
+ if (!pActNum)
+ pActNum.reset(new SvxNumRule(*pSaveNum));
+ else if (*pSaveNum != *pActNum)
+ *pActNum = *pSaveNum;
+ m_aPreviewWIN.SetNumRule(pActNum.get());
+
+ bool bContinuous = pActNum->IsFeatureSupported(SvxNumRuleFlags::CONTINUOUS);
+
+ // again misusage: in Draw there is numeration only until the bitmap
+ // without SVX_NUM_NUMBER_NONE
+ //remove types that are unsupported by Draw/Impress
+ if (!bContinuous)
+ {
+ sal_Int32 nFmtCount = m_xFmtLB->get_count();
+ for (sal_Int32 i = nFmtCount; i; i--)
+ {
+ sal_uInt16 nEntryData = m_xFmtLB->get_id(i - 1).toUInt32();
+ if (/*SVX_NUM_NUMBER_NONE == nEntryData ||*/
+ (SVX_NUM_BITMAP | LINK_TOKEN) == nEntryData)
+ m_xFmtLB->remove(i - 1);
+ }
+ }
+ //one must be enabled
+ if (!pActNum->IsFeatureSupported(SvxNumRuleFlags::ENABLE_LINKED_BMP))
+ {
+ auto nPos = m_xFmtLB->find_id(OUString::number(SVX_NUM_BITMAP | LINK_TOKEN));
+ if (nPos != -1)
+ m_xFmtLB->remove(nPos);
+ }
+ else if (!pActNum->IsFeatureSupported(SvxNumRuleFlags::ENABLE_EMBEDDED_BMP))
+ {
+ auto nPos = m_xFmtLB->find_id(OUString::number(SVX_NUM_BITMAP));
+ if (nPos != -1)
+ m_xFmtLB->remove(nPos);
+ }
+
+ // MegaHack: because of a not-fixable 'design mistake/error' in Impress
+ // delete all kinds of numeric enumerations
+ if (pActNum->IsFeatureSupported(SvxNumRuleFlags::NO_NUMBERS))
+ {
+ sal_Int32 nFmtCount = m_xFmtLB->get_count();
+ for (sal_Int32 i = nFmtCount; i; i--)
+ {
+ sal_uInt16 nEntryData = m_xFmtLB->get_id(i - 1).toUInt32();
+ if (/*nEntryData >= SVX_NUM_CHARS_UPPER_LETTER &&*/ nEntryData <= SVX_NUM_NUMBER_NONE)
+ m_xFmtLB->remove(i - 1);
+ }
+ }
+
+ InitPosAndSpaceMode();
+
+ InitControls();
+ bModified = false;
+}
+
+void SvxBulletAndPositionDlg::InitControls()
+{
+ bInInitControl = true;
+
+ const bool bRelative = !bLabelAlignmentPosAndSpaceModeActive && m_xRelativeCB->get_sensitive()
+ && m_xRelativeCB->get_active();
+ const bool bSingleSelection
+ = m_xLevelLB->count_selected_rows() == 1 && SAL_MAX_UINT16 != nActNumLvl;
+
+ m_xDistBorderMF->set_sensitive(!bLabelAlignmentPosAndSpaceModeActive
+ && (bSingleSelection || bRelative));
+ m_xDistBorderFT->set_sensitive(!bLabelAlignmentPosAndSpaceModeActive
+ && (bSingleSelection || bRelative));
+
+ bool bShowBullet = true;
+ bool bShowBitmap = true;
+ bool bSameType = true;
+ bool bSameStart = true;
+ bool bSamePrefix = true;
+ bool bSameSuffix = true;
+ bool bSameSize = true;
+ bool bSameBulColor = true;
+ bool bSameBulRelSize = true;
+ bool bSameDistBorderNum = !bLabelAlignmentPosAndSpaceModeActive;
+ bool bSetDistEmpty = false;
+ bool bSameIndent = !bLabelAlignmentPosAndSpaceModeActive;
+
+ const SvxNumberFormat* aNumFmtArr[SVX_MAX_NUM];
+ SvxAdjust eFirstAdjust = SvxAdjust::Left;
+ Size aFirstSize(0, 0);
+ sal_uInt16 nMask = 1;
+ sal_uInt16 nLvl = SAL_MAX_UINT16;
+
+ bool bBullColor = pActNum->IsFeatureSupported(SvxNumRuleFlags::BULLET_COLOR);
+ bool bBullRelSize = pActNum->IsFeatureSupported(SvxNumRuleFlags::BULLET_REL_SIZE);
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ aNumFmtArr[i] = &pActNum->GetLevel(i);
+
+ if (nActNumLvl & nMask)
+ {
+ bShowBullet &= aNumFmtArr[i]->GetNumberingType() == SVX_NUM_CHAR_SPECIAL;
+ bShowBitmap &= (aNumFmtArr[i]->GetNumberingType() & (~LINK_TOKEN)) == SVX_NUM_BITMAP;
+ eFirstAdjust = aNumFmtArr[i]->GetNumAdjust();
+ if (SAL_MAX_UINT16 == nLvl)
+ {
+ nLvl = i;
+ if (bShowBitmap)
+ aFirstSize = aNumFmtArr[i]->GetGraphicSize();
+ }
+ if (i > nLvl)
+ {
+ bSameType
+ &= aNumFmtArr[i]->GetNumberingType() == aNumFmtArr[nLvl]->GetNumberingType();
+ bSameStart = aNumFmtArr[i]->GetStart() == aNumFmtArr[nLvl]->GetStart();
+
+ bSamePrefix = aNumFmtArr[i]->GetPrefix() == aNumFmtArr[nLvl]->GetPrefix();
+ bSameSuffix = aNumFmtArr[i]->GetSuffix() == aNumFmtArr[nLvl]->GetSuffix();
+ //bSameAdjust &= eFirstAdjust == aNumFmtArr[i]->GetNumAdjust();
+ if (bShowBitmap && bSameSize)
+ bSameSize &= aNumFmtArr[i]->GetGraphicSize() == aFirstSize;
+ bSameBulColor
+ &= aNumFmtArr[i]->GetBulletColor() == aNumFmtArr[nLvl]->GetBulletColor();
+ bSameBulRelSize
+ &= aNumFmtArr[i]->GetBulletRelSize() == aNumFmtArr[nLvl]->GetBulletRelSize();
+ bSameIndent //?
+ &= aNumFmtArr[i]->GetFirstLineOffset()
+ == aNumFmtArr[nLvl]->GetFirstLineOffset();
+ }
+ }
+
+ nMask <<= 1;
+ }
+ SwitchNumberType(bShowBullet ? 1 : bShowBitmap ? 2 : 0);
+
+ sal_uInt16 nNumberingType;
+ if (nLvl != SAL_MAX_UINT16)
+ nNumberingType = aNumFmtArr[nLvl]->GetNumberingType();
+ else
+ {
+ nNumberingType = SVX_NUM_NUMBER_NONE;
+ bSameDistBorderNum = false;
+ bSameIndent = false;
+ bSameBulRelSize = false;
+ bSameBulColor = false;
+ bSameStart = false;
+ bSamePrefix = false;
+ bSameSuffix = false;
+ }
+
+ CheckForStartValue_Impl(nNumberingType);
+
+ if (bShowBitmap)
+ {
+ if (bSameSize)
+ {
+ SetMetricValue(*m_xHeightMF, aFirstSize.Height(), eCoreUnit);
+ SetMetricValue(*m_xWidthMF, aFirstSize.Width(), eCoreUnit);
+ }
+ else
+ {
+ m_xHeightMF->set_text("");
+ m_xWidthMF->set_text("");
+ }
+ }
+
+ if (bSameType)
+ {
+ sal_uInt16 nLBData = nNumberingType;
+ m_xFmtLB->set_active_id(OUString::number(nLBData));
+ }
+ else
+ m_xFmtLB->set_active(-1);
+
+ if (bBullRelSize)
+ {
+ if (bSameBulRelSize)
+ m_xBulRelSizeMF->set_value(aNumFmtArr[nLvl]->GetBulletRelSize(), FieldUnit::PERCENT);
+ else
+ m_xBulRelSizeMF->set_text("");
+ }
+ if (bBullColor)
+ {
+ if (bSameBulColor)
+ m_xBulColLB->SelectEntry(aNumFmtArr[nLvl]->GetBulletColor());
+ else
+ m_xBulColLB->SetNoSelection();
+ }
+ switch (nBullet)
+ {
+ case SHOW_NUMBERING:
+ if (bSameStart)
+ {
+ m_xStartED->set_value(aNumFmtArr[nLvl]->GetStart());
+ }
+ else
+ m_xStartED->set_text("");
+ break;
+ case SHOW_BULLET:
+ break;
+ case SHOW_BITMAP:
+ break;
+ }
+
+ switch (eFirstAdjust)
+ {
+ case SvxAdjust::Left:
+ m_xLeftTB->set_active(true);
+ m_xCenterTB->set_active(false);
+ m_xRightTB->set_active(false);
+ break;
+ case SvxAdjust::Center:
+ m_xLeftTB->set_active(false);
+ m_xCenterTB->set_active(true);
+ m_xRightTB->set_active(false);
+ break;
+ case SvxAdjust::Right:
+ m_xLeftTB->set_active(false);
+ m_xCenterTB->set_active(false);
+ m_xRightTB->set_active(true);
+ break;
+ default:
+ break;
+ }
+
+ if (bSamePrefix)
+ m_xPrefixED->set_text(aNumFmtArr[nLvl]->GetPrefix());
+ else
+ m_xPrefixED->set_text("");
+ if (bSameSuffix)
+ m_xSuffixED->set_text(aNumFmtArr[nLvl]->GetSuffix());
+ else
+ m_xSuffixED->set_text("");
+
+ if (bSameDistBorderNum)
+ {
+ tools::Long nDistBorderNum;
+ if (bRelative)
+ {
+ nDistBorderNum = static_cast<tools::Long>(aNumFmtArr[nLvl]->GetAbsLSpace())
+ + aNumFmtArr[nLvl]->GetFirstLineOffset();
+ if (nLvl)
+ nDistBorderNum -= static_cast<tools::Long>(aNumFmtArr[nLvl - 1]->GetAbsLSpace())
+ + aNumFmtArr[nLvl - 1]->GetFirstLineOffset();
+ }
+ else
+ {
+ nDistBorderNum = static_cast<tools::Long>(aNumFmtArr[nLvl]->GetAbsLSpace())
+ + aNumFmtArr[nLvl]->GetFirstLineOffset();
+ }
+ SetMetricValue(*m_xDistBorderMF, nDistBorderNum, eCoreUnit);
+ }
+ else
+ bSetDistEmpty = true;
+
+ if (bSetDistEmpty)
+ m_xDistBorderMF->set_text("");
+
+ if (bSameIndent)
+ SetMetricValue(*m_xIndentMF, -aNumFmtArr[nLvl]->GetFirstLineOffset(), eCoreUnit);
+ else
+ m_xIndentMF->set_text("");
+
+ m_xSelectionRB->set_active(true);
+
+ m_aPreviewWIN.SetLevel(nActNumLvl);
+ m_aPreviewWIN.Invalidate();
+ bInInitControl = false;
+}
+
+// 0 - Number; 1 - Bullet; 2 - Bitmap
+void SvxBulletAndPositionDlg::SwitchNumberType(sal_uInt8 nType)
+{
+ if (nBullet == nType)
+ return;
+ nBullet = nType;
+ bool bBullet = (nType == SHOW_BULLET);
+ bool bBitmap = (nType == SHOW_BITMAP);
+ bool bEnableBitmap = (nType == SHOW_BITMAP);
+ bool bNumeric = !(bBitmap || bBullet);
+ m_xPrefixFT->set_visible(bNumeric);
+ m_xPrefixED->set_visible(bNumeric);
+ m_xSuffixFT->set_visible(bNumeric);
+ m_xSuffixED->set_visible(bNumeric);
+ m_xBeforeAfter->set_visible(bNumeric);
+
+ m_xStartFT->set_visible(!(bBullet || bBitmap));
+ m_xStartED->set_visible(!(bBullet || bBitmap));
+
+ m_xBulletFT->set_visible(bBullet);
+ m_xBulletPB->set_visible(bBullet);
+ bool bBullColor = pActNum->IsFeatureSupported(SvxNumRuleFlags::BULLET_COLOR);
+ m_xBulColorFT->set_visible(!bBitmap && bBullColor);
+ m_xBulColLB->set_visible(!bBitmap && bBullColor);
+ bool bBullResSize = pActNum->IsFeatureSupported(SvxNumRuleFlags::BULLET_REL_SIZE);
+ m_xBulRelSizeFT->set_visible(!bBitmap && bBullResSize);
+ m_xBulRelSizeMF->set_visible(!bBitmap && bBullResSize);
+
+ m_xBitmapMB->set_visible(bBitmap);
+
+ m_xWidthFT->set_visible(bBitmap);
+ m_xWidthMF->set_visible(bBitmap);
+ m_xHeightFT->set_visible(bBitmap);
+ m_xHeightMF->set_visible(bBitmap);
+ m_xRatioCB->set_visible(bBitmap);
+
+ m_xWidthFT->set_sensitive(bEnableBitmap);
+ m_xWidthMF->set_sensitive(bEnableBitmap);
+ m_xHeightFT->set_sensitive(bEnableBitmap);
+ m_xHeightMF->set_sensitive(bEnableBitmap);
+ m_xRatioCB->set_sensitive(bEnableBitmap);
+}
+
+void SvxBulletAndPositionDlg::CheckForStartValue_Impl(sal_uInt16 nNumberingType)
+{
+ bool bIsNull = m_xStartED->get_value() == 0;
+ bool bNoZeroAllowed = nNumberingType < SVX_NUM_ARABIC
+ || SVX_NUM_CHARS_UPPER_LETTER_N == nNumberingType
+ || SVX_NUM_CHARS_LOWER_LETTER_N == nNumberingType;
+ m_xStartED->set_min(bNoZeroAllowed ? 1 : 0);
+ if (bIsNull && bNoZeroAllowed)
+ SpinModifyHdl_Impl(*m_xStartED);
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, LevelHdl_Impl, weld::TreeView&, rBox, void)
+{
+ sal_uInt16 nSaveNumLvl = nActNumLvl;
+ nActNumLvl = 0;
+ auto aSelectedRows = rBox.get_selected_rows();
+ if (std::find(aSelectedRows.begin(), aSelectedRows.end(), pActNum->GetLevelCount())
+ != aSelectedRows.end()
+ && (aSelectedRows.size() == 1 || nSaveNumLvl != 0xffff))
+ {
+ nActNumLvl = 0xFFFF;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ rBox.unselect(i);
+ }
+ else if (!aSelectedRows.empty())
+ {
+ sal_uInt16 nMask = 1;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ if (std::find(aSelectedRows.begin(), aSelectedRows.end(), i) != aSelectedRows.end())
+ nActNumLvl |= nMask;
+ nMask <<= 1;
+ }
+ rBox.unselect(pActNum->GetLevelCount());
+ }
+ else
+ nActNumLvl = nSaveNumLvl;
+
+ InitControls();
+}
+
+IMPL_LINK_NOARG(SvxBulletAndPositionDlg, PreviewInvalidateHdl_Impl, Timer*, void)
+{
+ m_aPreviewWIN.Invalidate();
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, NumberTypeSelectHdl_Impl, weld::ComboBox&, rBox, void)
+{
+ bool bBmp = false;
+ sal_uInt16 nMask = 1;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ if (nActNumLvl & nMask)
+ {
+ SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
+ // PAGEDESC does not exist
+ SvxNumType nNumType = static_cast<SvxNumType>(rBox.get_active_id().toUInt32());
+ aNumFmt.SetNumberingType(nNumType);
+ sal_uInt16 nNumberingType = aNumFmt.GetNumberingType();
+ if (SVX_NUM_BITMAP == (nNumberingType & (~LINK_TOKEN)))
+ {
+ bBmp |= nullptr != aNumFmt.GetBrush();
+ aNumFmt.SetIncludeUpperLevels(0);
+ aNumFmt.SetListFormat("", "", i);
+ if (!bBmp)
+ aNumFmt.SetGraphic("");
+ pActNum->SetLevel(i, aNumFmt);
+ SwitchNumberType(SHOW_BITMAP);
+ }
+ else if (SVX_NUM_CHAR_SPECIAL == nNumberingType)
+ {
+ aNumFmt.SetIncludeUpperLevels(0);
+ aNumFmt.SetListFormat("", "", i);
+ if (!aNumFmt.GetBulletFont())
+ aNumFmt.SetBulletFont(&aActBulletFont);
+ if (!aNumFmt.GetBulletChar())
+ aNumFmt.SetBulletChar(SVX_DEF_BULLET);
+ pActNum->SetLevel(i, aNumFmt);
+ SwitchNumberType(SHOW_BULLET);
+ // allocation of the drawing pattern is automatic
+ }
+ else
+ {
+ aNumFmt.SetListFormat(m_xPrefixED->get_text(), m_xSuffixED->get_text(), i);
+ SwitchNumberType(SHOW_NUMBERING);
+ pActNum->SetLevel(i, aNumFmt);
+ CheckForStartValue_Impl(nNumberingType);
+
+ // allocation of the drawing pattern is automatic
+ }
+ }
+ nMask <<= 1;
+ }
+
+ SetModified();
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, BulColorHdl_Impl, ColorListBox&, rColorBox, void)
+{
+ Color nSetColor = rColorBox.GetSelectEntryColor();
+
+ sal_uInt16 nMask = 1;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ if (nActNumLvl & nMask)
+ {
+ SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
+ aNumFmt.SetBulletColor(nSetColor);
+ pActNum->SetLevel(i, aNumFmt);
+ }
+ nMask <<= 1;
+ }
+ SetModified();
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, BulRelSizeHdl_Impl, weld::MetricSpinButton&, rField, void)
+{
+ sal_uInt16 nRelSize = rField.get_value(FieldUnit::PERCENT);
+
+ sal_uInt16 nMask = 1;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ if (nActNumLvl & nMask)
+ {
+ SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
+ aNumFmt.SetBulletRelSize(nRelSize);
+ pActNum->SetLevel(i, aNumFmt);
+ }
+ nMask <<= 1;
+ }
+ SetModified();
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, GraphicHdl_Impl, const OString&, rIdent, void)
+{
+ OUString aGrfName;
+ Size aSize;
+ bool bSucc(false);
+ SvxOpenGraphicDialog aGrfDlg(SdResId(RID_SVXSTR_EDIT_GRAPHIC), p_Window);
+
+ OString sNumber;
+ if (rIdent.startsWith("gallery", &sNumber))
+ {
+ auto idx = sNumber.toUInt32();
+ if (idx < aGrfNames.size())
+ {
+ aGrfName = aGrfNames[idx];
+ Graphic aGraphic;
+ if (GalleryExplorer::GetGraphicObj(GALLERY_THEME_BULLETS, idx, &aGraphic))
+ {
+ aSize = SvxNumberFormat::GetGraphicSizeMM100(&aGraphic);
+ bSucc = true;
+ }
+ }
+ }
+ else if (rIdent == "fromfile")
+ {
+ aGrfDlg.EnableLink(false);
+ aGrfDlg.AsLink(false);
+ if (!aGrfDlg.Execute())
+ {
+ // memorize selected filter
+ aGrfName = aGrfDlg.GetPath();
+
+ Graphic aGraphic;
+ if (!aGrfDlg.GetGraphic(aGraphic))
+ {
+ aSize = SvxNumberFormat::GetGraphicSizeMM100(&aGraphic);
+ bSucc = true;
+ }
+ }
+ }
+ if (!bSucc)
+ return;
+
+ aSize = OutputDevice::LogicToLogic(aSize, MapMode(MapUnit::Map100thMM), MapMode(eCoreUnit));
+
+ sal_uInt16 nMask = 1;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ if (nActNumLvl & nMask)
+ {
+ SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
+ aNumFmt.SetCharFormatName(m_sNumCharFmtName);
+ aNumFmt.SetGraphic(aGrfName);
+
+ // set size for a later comparison
+ const SvxBrushItem* pBrushItem = aNumFmt.GetBrush();
+ // initiate asynchronous loading
+ sal_Int16 eOrient = aNumFmt.GetVertOrient();
+ aNumFmt.SetGraphicBrush(pBrushItem, &aSize, &eOrient);
+ aInitSize[i] = aNumFmt.GetGraphicSize();
+
+ pActNum->SetLevel(i, aNumFmt);
+ }
+ nMask <<= 1;
+ }
+ m_xRatioCB->set_sensitive(true);
+ m_xWidthFT->set_sensitive(true);
+ m_xHeightFT->set_sensitive(true);
+ m_xWidthMF->set_sensitive(true);
+ m_xHeightMF->set_sensitive(true);
+ SetMetricValue(*m_xWidthMF, aSize.Width(), eCoreUnit);
+ SetMetricValue(*m_xHeightMF, aSize.Height(), eCoreUnit);
+
+ SetModified();
+ //needed due to asynchronous loading of graphics in the SvxBrushItem
+ aInvalidateTimer.Start();
+}
+
+IMPL_LINK_NOARG(SvxBulletAndPositionDlg, PopupActivateHdl_Impl, weld::Toggleable&, void)
+{
+ if (m_xGalleryMenu)
+ return;
+
+ m_xGalleryMenu = m_xBuilder->weld_menu("gallerysubmenu");
+ weld::WaitObject aWait(p_Window);
+
+ if (!GalleryExplorer::FillObjList(GALLERY_THEME_BULLETS, aGrfNames))
+ return;
+
+ GalleryExplorer::BeginLocking(GALLERY_THEME_BULLETS);
+
+ Graphic aGraphic;
+ OUString sGrfName;
+ ScopedVclPtrInstance<VirtualDevice> pVD;
+ size_t i = 0;
+ for (const auto& grfName : aGrfNames)
+ {
+ sGrfName = grfName;
+ OUString sItemId = "gallery" + OUString::number(i);
+ INetURLObject aObj(sGrfName);
+ if (aObj.GetProtocol() == INetProtocol::File)
+ sGrfName = aObj.PathToFileName();
+ if (GalleryExplorer::GetGraphicObj(GALLERY_THEME_BULLETS, i, &aGraphic))
+ {
+ BitmapEx aBitmap(aGraphic.GetBitmapEx());
+ Size aSize(aBitmap.GetSizePixel());
+ if (aSize.Width() > MAX_BMP_WIDTH || aSize.Height() > MAX_BMP_HEIGHT)
+ {
+ bool bWidth = aSize.Width() > aSize.Height();
+ double nScale = bWidth
+ ? double(MAX_BMP_WIDTH) / static_cast<double>(aSize.Width())
+ : double(MAX_BMP_HEIGHT) / static_cast<double>(aSize.Height());
+ aBitmap.Scale(nScale, nScale);
+ }
+ pVD->SetOutputSizePixel(aBitmap.GetSizePixel(), false);
+ pVD->DrawBitmapEx(Point(), aBitmap);
+
+ // We want to show only icon names not full path.
+ aObj.removeExtension();
+ OUString sIconName = aObj.GetLastName(INetURLObject::DecodeMechanism::WithCharset);
+
+ m_xGalleryMenu->append(sItemId, sIconName, *pVD);
+ }
+ else
+ {
+ m_xGalleryMenu->append(sItemId, sGrfName);
+ }
+ ++i;
+ }
+ GalleryExplorer::EndLocking(GALLERY_THEME_BULLETS);
+}
+
+IMPL_LINK_NOARG(SvxBulletAndPositionDlg, BulletHdl_Impl, weld::Button&, void)
+{
+ SvxCharacterMap aMap(p_Window, nullptr, nullptr);
+
+ sal_uInt16 nMask = 1;
+ std::optional<vcl::Font> pFmtFont;
+ bool bSameBullet = true;
+ sal_UCS4 cBullet = 0;
+ bool bFirst = true;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ if (nActNumLvl & nMask)
+ {
+ const SvxNumberFormat& rCurFmt = pActNum->GetLevel(i);
+ if (bFirst)
+ {
+ cBullet = rCurFmt.GetBulletChar();
+ }
+ else if (rCurFmt.GetBulletChar() != cBullet)
+ {
+ bSameBullet = false;
+ break;
+ }
+ if (!pFmtFont)
+ pFmtFont = rCurFmt.GetBulletFont();
+ bFirst = false;
+ }
+ nMask <<= 1;
+ }
+
+ if (pFmtFont)
+ aMap.SetCharFont(*pFmtFont);
+ else
+ aMap.SetCharFont(aActBulletFont);
+ if (bSameBullet)
+ aMap.SetChar(cBullet);
+ if (aMap.run() != RET_OK)
+ return;
+
+ // change Font Numrules
+ aActBulletFont = aMap.GetCharFont();
+
+ sal_uInt16 _nMask = 1;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ if (nActNumLvl & _nMask)
+ {
+ SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
+ aNumFmt.SetBulletFont(&aActBulletFont);
+ aNumFmt.SetBulletChar(aMap.GetChar());
+ pActNum->SetLevel(i, aNumFmt);
+ }
+ _nMask <<= 1;
+ }
+
+ SetModified();
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, SizeHdl_Impl, weld::MetricSpinButton&, rField, void)
+{
+ bool bWidth = &rField == m_xWidthMF.get();
+ bLastWidthModified = bWidth;
+ bool bRatio = m_xRatioCB->get_active();
+ tools::Long nWidthVal = static_cast<tools::Long>(
+ m_xWidthMF->denormalize(m_xWidthMF->get_value(FieldUnit::MM_100TH)));
+ tools::Long nHeightVal = static_cast<tools::Long>(
+ m_xHeightMF->denormalize(m_xHeightMF->get_value(FieldUnit::MM_100TH)));
+ nWidthVal = OutputDevice::LogicToLogic(nWidthVal, MapUnit::Map100thMM, eCoreUnit);
+ nHeightVal = OutputDevice::LogicToLogic(nHeightVal, MapUnit::Map100thMM, eCoreUnit);
+ double fSizeRatio;
+
+ bool bRepaint = false;
+ sal_uInt16 nMask = 1;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ if (nActNumLvl & nMask)
+ {
+ SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
+ if (SVX_NUM_BITMAP == (aNumFmt.GetNumberingType() & (~LINK_TOKEN)))
+ {
+ Size aSize(aNumFmt.GetGraphicSize());
+ Size aSaveSize(aSize);
+
+ if (aInitSize[i].Height())
+ fSizeRatio = static_cast<double>(aInitSize[i].Width())
+ / static_cast<double>(aInitSize[i].Height());
+ else
+ fSizeRatio = double(1);
+
+ if (bWidth)
+ {
+ tools::Long nDelta = nWidthVal - aInitSize[i].Width();
+ aSize.setWidth(nWidthVal);
+ if (bRatio)
+ {
+ aSize.setHeight(
+ aInitSize[i].Height()
+ + static_cast<tools::Long>(static_cast<double>(nDelta) / fSizeRatio));
+ m_xHeightMF->set_value(m_xHeightMF->normalize(OutputDevice::LogicToLogic(
+ aSize.Height(), eCoreUnit, MapUnit::Map100thMM)),
+ FieldUnit::MM_100TH);
+ }
+ }
+ else
+ {
+ tools::Long nDelta = nHeightVal - aInitSize[i].Height();
+ aSize.setHeight(nHeightVal);
+ if (bRatio)
+ {
+ aSize.setWidth(
+ aInitSize[i].Width()
+ + static_cast<tools::Long>(static_cast<double>(nDelta) * fSizeRatio));
+ m_xWidthMF->set_value(m_xWidthMF->normalize(OutputDevice::LogicToLogic(
+ aSize.Width(), eCoreUnit, MapUnit::Map100thMM)),
+ FieldUnit::MM_100TH);
+ }
+ }
+ const SvxBrushItem* pBrushItem = aNumFmt.GetBrush();
+ sal_Int16 eOrient = aNumFmt.GetVertOrient();
+ if (aSize != aSaveSize)
+ bRepaint = true;
+ aNumFmt.SetGraphicBrush(pBrushItem, &aSize, &eOrient);
+ pActNum->SetLevel(i, aNumFmt);
+ }
+ }
+ nMask <<= 1;
+ }
+ SetModified(bRepaint);
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, RatioHdl_Impl, weld::Toggleable&, rBox, void)
+{
+ if (rBox.get_active())
+ {
+ if (bLastWidthModified)
+ SizeHdl_Impl(*m_xWidthMF);
+ else
+ SizeHdl_Impl(*m_xHeightMF);
+ }
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, SelectLeftAlignmentHdl_Impl, weld::Toggleable&, rButton, void)
+{
+ if (rButton.get_active())
+ {
+ SetAlignmentHdl_Impl(SvxAdjust::Left);
+
+ m_xCenterTB->set_active(false);
+ m_xRightTB->set_active(false);
+
+ SetModified();
+ }
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, SelectCenterAlignmentHdl_Impl, weld::Toggleable&, rButton, void)
+{
+ if (rButton.get_active())
+ {
+ SetAlignmentHdl_Impl(SvxAdjust::Center);
+
+ m_xLeftTB->set_active(false);
+ m_xRightTB->set_active(false);
+
+ SetModified();
+ }
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, SelectRightAlignmentHdl_Impl, weld::Toggleable&, rButton, void)
+{
+ if (rButton.get_active())
+ {
+ SetAlignmentHdl_Impl(SvxAdjust::Right);
+
+ m_xLeftTB->set_active(false);
+ m_xCenterTB->set_active(false);
+
+ SetModified();
+ }
+}
+
+void SvxBulletAndPositionDlg::SetAlignmentHdl_Impl(SvxAdjust eAdjust)
+{
+ sal_uInt16 nMask = 1;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ if (nActNumLvl & nMask)
+ {
+ SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
+ aNumFmt.SetNumAdjust(eAdjust);
+ pActNum->SetLevel(i, aNumFmt);
+ }
+ nMask <<= 1;
+ }
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, ApplyToMasterHdl_Impl, weld::Toggleable&, rButton, void)
+{
+ bApplyToMaster = rButton.get_active();
+}
+
+IMPL_LINK_NOARG(SvxBulletAndPositionDlg, ResetHdl_Impl, weld::Button&, void)
+{
+ Reset(&rFirstStateSet);
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, EditModifyHdl_Impl, weld::Entry&, rEdit, void)
+{
+ EditModifyHdl_Impl(&rEdit);
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, SpinModifyHdl_Impl, weld::SpinButton&, rSpinButton, void)
+{
+ EditModifyHdl_Impl(&rSpinButton);
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, DistanceHdl_Impl, weld::MetricSpinButton&, rFld, void)
+{
+ if (bInInitControl)
+ return;
+ tools::Long nValue = GetCoreValue(rFld, eCoreUnit);
+ sal_uInt16 nMask = 1;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ if (nActNumLvl & nMask)
+ {
+ SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
+ if (&rFld == m_xDistBorderMF.get())
+ {
+ if (m_xRelativeCB->get_active())
+ {
+ if (0 == i)
+ {
+ auto const nTmp = aNumFmt.GetFirstLineOffset();
+ aNumFmt.SetAbsLSpace(nValue - nTmp);
+ }
+ else
+ {
+ tools::Long nTmp = pActNum->GetLevel(i - 1).GetAbsLSpace()
+ + pActNum->GetLevel(i - 1).GetFirstLineOffset()
+ - pActNum->GetLevel(i).GetFirstLineOffset();
+
+ aNumFmt.SetAbsLSpace(nValue + nTmp);
+ }
+ }
+ else
+ {
+ aNumFmt.SetAbsLSpace(nValue - aNumFmt.GetFirstLineOffset());
+ }
+ }
+ else if (&rFld == m_xIndentMF.get())
+ {
+ // together with the FirstLineOffset the AbsLSpace must be changed, too
+ tools::Long nDiff = nValue + aNumFmt.GetFirstLineOffset();
+ auto const nAbsLSpace = aNumFmt.GetAbsLSpace();
+ aNumFmt.SetAbsLSpace(nAbsLSpace + nDiff);
+ aNumFmt.SetFirstLineOffset(-nValue);
+ }
+
+ pActNum->SetLevel(i, aNumFmt);
+ }
+ nMask <<= 1;
+ }
+
+ SetModified();
+ if (!m_xDistBorderMF->get_sensitive())
+ {
+ m_xDistBorderMF->set_text("");
+ }
+
+ sal_Int32 aLastLevelLSpace
+ = pActNum->GetLevel(pActNum->GetLevelCount() - 1).GetAbsLSpace() / 40;
+ m_aPreviewWIN.set_size_request(aLastLevelLSpace, 300);
+}
+
+IMPL_LINK(SvxBulletAndPositionDlg, RelativeHdl_Impl, weld::Toggleable&, rBox, void)
+{
+ bool bOn = rBox.get_active();
+ bool bSingleSelection = m_xLevelLB->count_selected_rows() == 1 && SAL_MAX_UINT16 != nActNumLvl;
+ bool bSetValue = false;
+ tools::Long nValue = 0;
+ if (bOn || bSingleSelection)
+ {
+ sal_uInt16 nMask = 1;
+ bool bFirst = true;
+ bSetValue = true;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ if (nActNumLvl & nMask)
+ {
+ const SvxNumberFormat& rNumFmt = pActNum->GetLevel(i);
+ if (bFirst)
+ {
+ nValue = rNumFmt.GetAbsLSpace() + rNumFmt.GetFirstLineOffset();
+ if (bOn && i)
+ nValue -= (pActNum->GetLevel(i - 1).GetAbsLSpace()
+ + pActNum->GetLevel(i - 1).GetFirstLineOffset());
+ }
+ else
+ bSetValue = nValue
+ == (rNumFmt.GetAbsLSpace() + rNumFmt.GetFirstLineOffset())
+ - (pActNum->GetLevel(i - 1).GetAbsLSpace()
+ + pActNum->GetLevel(i - 1).GetFirstLineOffset());
+ bFirst = false;
+ }
+ nMask <<= 1;
+ }
+ }
+ if (bSetValue)
+ SetMetricValue(*m_xDistBorderMF, nValue, eCoreUnit);
+ else
+ m_xDistBorderMF->set_text("");
+ m_xDistBorderMF->set_sensitive(bOn || bSingleSelection);
+ m_xDistBorderFT->set_sensitive(bOn || bSingleSelection);
+ bLastRelative = bOn;
+}
+
+void SvxBulletAndPositionDlg::EditModifyHdl_Impl(const weld::Entry* pEdit)
+{
+ bool bPrefixOrSuffix = (pEdit == m_xPrefixED.get()) || (pEdit == m_xSuffixED.get());
+ bool bStart = pEdit == m_xStartED.get();
+ sal_uInt16 nMask = 1;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
+ {
+ if (nActNumLvl & nMask)
+ {
+ SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
+ if (bPrefixOrSuffix)
+ aNumFmt.SetListFormat(m_xPrefixED->get_text(), m_xSuffixED->get_text(), i);
+ else if (bStart)
+ aNumFmt.SetStart(m_xStartED->get_value());
+ pActNum->SetLevel(i, aNumFmt);
+ }
+ nMask <<= 1;
+ }
+ SetModified();
+}
+
+void SvxBulletAndPositionDlg::SetModified(bool bRepaint)
+{
+ bModified = true;
+ if (bRepaint)
+ {
+ m_aPreviewWIN.SetLevel(nActNumLvl);
+ m_aPreviewWIN.Invalidate();
+ }
+}
+
+void SvxBulletAndPositionDlg::InitPosAndSpaceMode()
+{
+ if (pActNum == nullptr)
+ {
+ SAL_WARN("cui.tabpages", "<SvxNumPositionTabPage::InitPosAndSpaceMode()> - misusage of "
+ "method -> <pAktNum> has to be already set!");
+ return;
+ }
+
+ SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode = SvxNumberFormat::LABEL_ALIGNMENT;
+ sal_uInt16 nMask = 1;
+ for (sal_uInt16 i = 0; i < pActNum->GetLevelCount(); ++i)
+ {
+ if (nActNumLvl & nMask)
+ {
+ SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
+ ePosAndSpaceMode = aNumFmt.GetPositionAndSpaceMode();
+ if (ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT)
+ {
+ break;
+ }
+ }
+ nMask <<= 1;
+ }
+
+ bLabelAlignmentPosAndSpaceModeActive = ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/LayerTabBar.cxx b/sd/source/ui/dlg/LayerTabBar.cxx
new file mode 100644
index 000000000..41cc90ac7
--- /dev/null
+++ b/sd/source/ui/dlg/LayerTabBar.cxx
@@ -0,0 +1,437 @@
+/* -*- 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 <LayerTabBar.hxx>
+#include <svx/svdlayer.hxx>
+#include <svx/svdpagv.hxx>
+#include <vcl/commandevent.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+
+#include <helpids.h>
+#include <app.hrc>
+#include <strings.hrc>
+
+#include <DrawViewShell.hxx>
+#include <View.hxx>
+#include <drawdoc.hxx>
+#include <sdresid.hxx>
+#include <unokywds.hxx>
+#include <DrawDocShell.hxx>
+#include <drawview.hxx>
+#include <undolayer.hxx>
+
+namespace sd {
+
+/**
+ * default constructor
+ */
+LayerTabBar::LayerTabBar(DrawViewShell* pViewSh, vcl::Window* pParent)
+ : TabBar( pParent, WinBits( WB_BORDER | WB_3DLOOK | WB_SCROLL ) ),
+ DropTargetHelper( this ),
+ pDrViewSh(pViewSh)
+{
+ EnableEditMode();
+ SetSizePixel(Size(0, 0));
+ SetMaxPageWidth( 150 );
+ SetHelpId( HID_SD_TABBAR_LAYERS );
+}
+
+LayerTabBar::~LayerTabBar()
+{
+ disposeOnce();
+}
+
+void LayerTabBar::dispose()
+{
+ DropTargetHelper::dispose();
+ TabBar::dispose();
+}
+
+OUString LayerTabBar::convertToLocalizedName(const OUString& rName)
+{
+ if ( rName == sUNO_LayerName_background )
+ return SdResId( STR_LAYER_BCKGRND );
+
+ if ( rName == sUNO_LayerName_background_objects )
+ return SdResId( STR_LAYER_BCKGRNDOBJ );
+
+ if ( rName == sUNO_LayerName_layout )
+ return SdResId( STR_LAYER_LAYOUT );
+
+ if ( rName == sUNO_LayerName_controls )
+ return SdResId( STR_LAYER_CONTROLS );
+
+ if ( rName == sUNO_LayerName_measurelines )
+ return SdResId( STR_LAYER_MEASURELINES );
+
+ return rName;
+}
+
+// Use a method name, that is specific to LayerTabBar to make code better readable
+OUString LayerTabBar::GetLayerName(sal_uInt16 nPageId) const
+{
+ return GetAuxiliaryText(nPageId);
+}
+
+void LayerTabBar::SetLayerName( sal_uInt16 nPageId, const OUString& rText )
+{
+ SetAuxiliaryText(nPageId, rText);
+}
+
+// Here "Page" is a tab in the LayerTabBar.
+void LayerTabBar::InsertPage( sal_uInt16 nPageId, const OUString& rText,
+ TabBarPageBits nBits, sal_uInt16 nPos)
+{
+ OUString sLocalizedName(convertToLocalizedName(rText));
+ TabBar::InsertPage(nPageId, sLocalizedName, nBits, nPos );
+ SetLayerName(nPageId, rText);
+}
+
+void LayerTabBar::SetPageText( sal_uInt16 nPageId, const OUString& rText )
+{
+ OUString sLocalizedName(convertToLocalizedName(rText));
+ SetLayerName(nPageId, rText);
+ TabBar::SetPageText(nPageId, sLocalizedName);
+}
+
+bool LayerTabBar::IsLocalizedNameOfStandardLayer(std::u16string_view rName)
+{
+ return ( rName == SdResId(STR_LAYER_LAYOUT)
+ || rName == SdResId(STR_LAYER_CONTROLS)
+ || rName == SdResId(STR_LAYER_MEASURELINES)
+ || rName == SdResId(STR_LAYER_BCKGRND)
+ || rName == SdResId(STR_LAYER_BCKGRNDOBJ) );
+}
+
+bool LayerTabBar::IsRealNameOfStandardLayer(std::u16string_view rName)
+{
+ return ( rName == sUNO_LayerName_layout
+ || rName == sUNO_LayerName_controls
+ || rName == sUNO_LayerName_measurelines
+ || rName == sUNO_LayerName_background
+ || rName == sUNO_LayerName_background_objects );
+}
+
+void LayerTabBar::Select()
+{
+ SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
+ pDispatcher->Execute(SID_SWITCHLAYER, SfxCallMode::ASYNCHRON);
+}
+
+void LayerTabBar::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ bool bSetPageID=false;
+
+ if (rMEvt.IsLeft())
+ {
+ Point aPosPixel = rMEvt.GetPosPixel();
+ sal_uInt16 aTabId = GetPageId( PixelToLogic(aPosPixel) );
+ if (aTabId == 0)
+ {
+ SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
+ pDispatcher->Execute(SID_INSERTLAYER, SfxCallMode::SYNCHRON);
+
+ bSetPageID=true;
+ }
+ else if (rMEvt.IsMod2())
+ {
+ // direct editing of tab text
+ // make sure the clicked tab is the current tab otherwise Edit() acts on the wrong tab
+ if ( aTabId != GetCurPageId())
+ {
+ MouseEvent aSyntheticEvent (rMEvt.GetPosPixel(), 1, MouseEventModifiers::SYNTHETIC, MOUSE_LEFT, 0);
+ TabBar::MouseButtonDown(aSyntheticEvent);
+ }
+ }
+ else if (rMEvt.IsMod1() || rMEvt.IsShift())
+ {
+ // keyboard Shortcuts to change layer attributes
+
+ OUString aName(GetLayerName(aTabId));
+ SdrPageView* pPV = pDrViewSh->GetView()->GetSdrPageView();
+
+ // Save old state
+
+ bool bOldPrintable = pPV->IsLayerPrintable(aName);
+ bool bOldVisible = pPV->IsLayerVisible(aName);
+ bool bOldLocked = pPV->IsLayerLocked(aName);
+
+ bool bNewPrintable = bOldPrintable;
+ bool bNewVisible = bOldVisible;
+ bool bNewLocked = bOldLocked;
+
+ if (rMEvt.IsMod1() && rMEvt.IsShift())
+ {
+ // Shift+Ctrl: Toggle between layer printable / not printable
+ bNewPrintable = !bOldPrintable;
+ pPV->SetLayerPrintable(aName, bNewPrintable);
+ }
+ else if (rMEvt.IsShift())
+ {
+ // Shift: Toggle between layer visible / hidden
+ bNewVisible = !bOldVisible;
+ pPV->SetLayerVisible(aName, bNewVisible);
+ }
+ else // if (rMEvt.IsMod1())
+ {
+ // Ctrl: Toggle between layer locked / unlocked
+ bNewLocked = !bOldLocked;
+ pPV->SetLayerLocked(aName, bNewLocked);
+ }
+
+ pDrViewSh->ResetActualLayer();
+
+ // Add Undo action
+
+ ::sd::View* pView = pDrViewSh->GetView();
+ DrawView* pDrView = dynamic_cast<DrawView*>(pView);
+
+ SdDrawDocument& rDoc = pView->GetDoc();
+ SdrLayer* pLayer = rDoc.GetLayerAdmin().GetLayer(aName);
+
+ if (pLayer)
+ {
+ assert (pDrView && "Change layer attribute undo action is only working with a SdDrawView");
+ if(pDrView)
+ {
+ SfxUndoManager* pManager = rDoc.GetDocSh()->GetUndoManager();
+ std::unique_ptr<SdLayerModifyUndoAction> pAction(new SdLayerModifyUndoAction(
+ &rDoc,
+ pLayer,
+ aName,
+ pLayer->GetTitle(),
+ pLayer->GetDescription(),
+ bOldVisible,
+ bOldLocked,
+ bOldPrintable,
+ aName,
+ pLayer->GetTitle(),
+ pLayer->GetDescription(),
+ bNewVisible,
+ bNewLocked,
+ bNewPrintable
+ ));
+ pManager->AddUndoAction(std::move(pAction));
+ }
+ }
+
+ // Mark document changed
+
+ pView->GetDoc().SetChanged();
+ }
+ }
+
+ // If you insert a new layer you must not call TabBar::MouseButtonDown(rMEvt);
+ // because you want to activate the new layer
+ if( !bSetPageID )
+ TabBar::MouseButtonDown(rMEvt);
+}
+
+void LayerTabBar::DoubleClick()
+{
+ if (GetCurPageId() != 0)
+ {
+ SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
+ pDispatcher->Execute( SID_MODIFYLAYER, SfxCallMode::SYNCHRON );
+ }
+}
+
+/**
+ * AcceptDrop-Event
+ */
+
+sal_Int8 LayerTabBar::AcceptDrop( const AcceptDropEvent& rEvt )
+{
+ sal_Int8 nRet = DND_ACTION_NONE;
+
+ if( rEvt.mbLeaving )
+ EndSwitchPage();
+
+ if( !pDrViewSh->GetDocSh()->IsReadOnly() )
+ {
+ Point aPos( PixelToLogic( rEvt.maPosPixel ) );
+ OUString sLayerName( GetLayerName(GetPageId(aPos)) );
+ SdrLayerID nLayerId = pDrViewSh->GetView()->GetDoc().GetLayerAdmin().GetLayerID(sLayerName);
+
+ nRet = pDrViewSh->AcceptDrop( rEvt, *this, nullptr, SDRPAGE_NOTFOUND, nLayerId );
+
+ SwitchPage( aPos );
+ }
+
+ return nRet;
+}
+
+/**
+ * ExecuteDrop-Event
+ */
+sal_Int8 LayerTabBar::ExecuteDrop( const ExecuteDropEvent& rEvt )
+{
+ Point aPos( PixelToLogic(rEvt.maPosPixel) );
+ OUString sLayerName( GetLayerName(GetPageId(aPos)) );
+ SdrLayerID nLayerId = pDrViewSh->GetView()->GetDoc().GetLayerAdmin().GetLayerID(sLayerName);
+
+ sal_Int8 nRet = pDrViewSh->ExecuteDrop( rEvt, *this, nullptr, SDRPAGE_NOTFOUND, nLayerId );
+
+ EndSwitchPage();
+
+ return nRet;
+
+}
+
+void LayerTabBar::Command(const CommandEvent& rCEvt)
+{
+ if ( rCEvt.GetCommand() == CommandEventId::ContextMenu )
+ {
+ SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
+ pDispatcher->ExecutePopup("layertab");
+ }
+}
+
+bool LayerTabBar::StartRenaming()
+{
+ bool bOK = true;
+ OUString aLayerName = GetLayerName( GetEditPageId() );
+
+ if ( IsRealNameOfStandardLayer(aLayerName))
+ {
+ // It is not allowed to change these names
+ bOK = false;
+ }
+ else
+ {
+ ::sd::View* pView = pDrViewSh->GetView();
+
+ if ( pView->IsTextEdit() )
+ {
+ pView->SdrEndTextEdit();
+ }
+ }
+
+ return bOK;
+}
+
+TabBarAllowRenamingReturnCode LayerTabBar::AllowRenaming()
+{
+ bool bOK = true;
+
+ // Check if names already exists
+ ::sd::View* pView = pDrViewSh->GetView();
+ SdDrawDocument& rDoc = pView->GetDoc();
+ OUString aLayerName = pView->GetActiveLayer();
+ SdrLayerAdmin& rLayerAdmin = rDoc.GetLayerAdmin();
+ OUString aNewName( GetEditText() );
+
+ if (aNewName.isEmpty() ||
+ (rLayerAdmin.GetLayer( aNewName ) && aLayerName != aNewName) )
+ {
+ // Name already exists.
+ std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(pDrViewSh->GetViewFrame()->GetFrameWeld(),
+ VclMessageType::Warning, VclButtonsType::Ok,
+ SdResId(STR_WARN_NAME_DUPLICATE)));
+ xWarn->run();
+ bOK = false;
+ }
+
+ if (bOK)
+ {
+ if ( IsLocalizedNameOfStandardLayer(aNewName) || IsRealNameOfStandardLayer(aNewName) )
+ {
+ // Standard layer names may not be changed.
+ bOK = false;
+ }
+ }
+
+ return bOK ? TABBAR_RENAMING_YES : TABBAR_RENAMING_NO;
+}
+
+void LayerTabBar::EndRenaming()
+{
+ if( IsEditModeCanceled() )
+ return;
+
+ ::sd::View* pView = pDrViewSh->GetView();
+ DrawView* pDrView = dynamic_cast<DrawView*>( pView );
+
+ SdDrawDocument& rDoc = pView->GetDoc();
+ OUString aLayerName = pView->GetActiveLayer();
+ SdrLayerAdmin& rLayerAdmin = rDoc.GetLayerAdmin();
+ SdrLayer* pLayer = rLayerAdmin.GetLayer(aLayerName);
+
+ if (!pLayer)
+ return;
+
+ OUString aNewName( GetEditText() );
+ assert (pDrView && "Rename layer undo action is only working with a SdDrawView");
+ if( pDrView )
+ {
+ SfxUndoManager* pManager = rDoc.GetDocSh()->GetUndoManager();
+ std::unique_ptr<SdLayerModifyUndoAction> pAction(new SdLayerModifyUndoAction(
+ &rDoc,
+ pLayer,
+ aLayerName,
+ pLayer->GetTitle(),
+ pLayer->GetDescription(),
+ pDrView->IsLayerVisible(aLayerName),
+ pDrView->IsLayerLocked(aLayerName),
+ pDrView->IsLayerPrintable(aLayerName),
+ aNewName,
+ pLayer->GetTitle(),
+ pLayer->GetDescription(),
+ pDrView->IsLayerVisible(aLayerName),
+ pDrView->IsLayerLocked(aLayerName),
+ pDrView->IsLayerPrintable(aLayerName)
+ ));
+ pManager->AddUndoAction( std::move(pAction) );
+ }
+
+ // First notify View since SetName() calls ResetActualLayer() and
+ // the View then already has to know the Layer
+ pView->SetActiveLayer(aNewName);
+ pLayer->SetName(aNewName);
+ rDoc.SetChanged();
+}
+
+void LayerTabBar::ActivatePage()
+{
+ if (pDrViewSh!=nullptr)
+ {
+
+ SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
+ pDispatcher->Execute(SID_SWITCHLAYER, SfxCallMode::ASYNCHRON);
+ }
+}
+
+void LayerTabBar::SendActivatePageEvent()
+{
+ CallEventListeners (VclEventId::TabbarPageActivated,
+ reinterpret_cast<void*>(GetCurPageId()));
+}
+
+void LayerTabBar::SendDeactivatePageEvent()
+{
+ CallEventListeners (VclEventId::TabbarPageDeactivated,
+ reinterpret_cast<void*>(GetCurPageId()));
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/NavigatorChildWindow.cxx b/sd/source/ui/dlg/NavigatorChildWindow.cxx
new file mode 100644
index 000000000..6055c238a
--- /dev/null
+++ b/sd/source/ui/dlg/NavigatorChildWindow.cxx
@@ -0,0 +1,100 @@
+/* -*- 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 <NavigatorChildWindow.hxx>
+#include <navigatr.hxx>
+#include <app.hrc>
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <svl/eitem.hxx>
+
+namespace sd {
+
+static void RequestNavigatorUpdate (SfxBindings const * pBindings)
+{
+ if (pBindings != nullptr
+ && pBindings->GetDispatcher() != nullptr)
+ {
+ SfxBoolItem aItem (SID_NAVIGATOR_INIT, true);
+ pBindings->GetDispatcher()->ExecuteList(
+ SID_NAVIGATOR_INIT,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aItem });
+ }
+}
+
+SdNavigatorFloat::SdNavigatorFloat(SfxBindings* _pBindings, SfxChildWindow* _pMgr,
+ vcl::Window* _pParent, SfxChildWinInfo* pInfo)
+ : SfxNavigator(_pBindings, _pMgr, _pParent, pInfo)
+ , m_xNavWin(std::make_unique<SdNavigatorWin>(m_xContainer.get(), _pBindings, this))
+ , m_bSetInitialFocusOnActivate(true)
+{
+ m_xNavWin->SetUpdateRequestFunctor(
+ [_pBindings] () { return RequestNavigatorUpdate(_pBindings); });
+
+ SetMinOutputSizePixel(GetOptimalSize());
+}
+
+void SdNavigatorFloat::Activate()
+{
+ SfxNavigator::Activate();
+ // tdf#141708 defer grabbing focus to preferred widget until the float is
+ // first activated
+ if (m_bSetInitialFocusOnActivate)
+ {
+ m_xNavWin->FirstFocus();
+ m_bSetInitialFocusOnActivate = false;
+ }
+}
+
+void SdNavigatorFloat::InitTreeLB(const SdDrawDocument* pDoc)
+{
+ m_xNavWin->InitTreeLB(pDoc);
+}
+
+void SdNavigatorFloat::FreshTree(const SdDrawDocument* pDoc)
+{
+ m_xNavWin->FreshTree(pDoc);
+}
+
+void SdNavigatorFloat::dispose()
+{
+ m_xNavWin.reset();
+ SfxNavigator::dispose();
+}
+
+SdNavigatorFloat::~SdNavigatorFloat()
+{
+ disposeOnce();
+}
+
+SFX_IMPL_DOCKINGWINDOW(SdNavigatorWrapper, SID_NAVIGATOR);
+
+SdNavigatorWrapper::SdNavigatorWrapper(vcl::Window *_pParent, sal_uInt16 nId,
+ SfxBindings* pBindings, SfxChildWinInfo* pInfo)
+ : SfxNavigatorWrapper(_pParent, nId)
+{
+ SetWindow(VclPtr<SdNavigatorFloat>::Create(pBindings, this, _pParent, pInfo));
+ Initialize();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/PaneChildWindows.cxx b/sd/source/ui/dlg/PaneChildWindows.cxx
new file mode 100644
index 000000000..7f73e005b
--- /dev/null
+++ b/sd/source/ui/dlg/PaneChildWindows.cxx
@@ -0,0 +1,107 @@
+/* -*- 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 <PaneChildWindows.hxx>
+#include <PaneDockingWindow.hxx>
+#include <ViewShellBase.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <app.hrc>
+#include <strings.hrc>
+#include <sdresid.hxx>
+
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+
+namespace sd {
+
+
+SFX_IMPL_DOCKINGWINDOW_WITHID(LeftPaneImpressChildWindow, SID_LEFT_PANE_IMPRESS)
+SFX_IMPL_DOCKINGWINDOW_WITHID(LeftPaneDrawChildWindow, SID_LEFT_PANE_DRAW)
+
+//===== PaneChildWindow =======================================================
+PaneChildWindow::PaneChildWindow (
+ vcl::Window* pParentWindow,
+ sal_uInt16 nId,
+ SfxBindings* pBindings,
+ SfxChildWinInfo* pInfo,
+ TranslateId pTitleBarResId)
+ : SfxChildWindow (pParentWindow, nId)
+{
+ SetWindow( VclPtr<PaneDockingWindow>::Create(
+ pBindings,
+ this,
+ pParentWindow,
+ SdResId(pTitleBarResId)));
+ SetAlignment(SfxChildAlignment::LEFT);
+ SfxDockingWindow* pDockingWindow = static_cast<SfxDockingWindow*>(GetWindow());
+ pDockingWindow->EnableInput();
+ pDockingWindow->Initialize(pInfo);
+ SetHideNotDelete(true);
+
+ ViewShellBase* pBase = ViewShellBase::GetViewShellBase(pBindings->GetDispatcher()->GetFrame());
+ if (pBase != nullptr)
+ {
+ framework::FrameworkHelper::Instance(*pBase)->UpdateConfiguration();
+ }
+}
+
+PaneChildWindow::~PaneChildWindow()
+{
+ ViewShellBase* pBase = nullptr;
+ PaneDockingWindow* pDockingWindow = dynamic_cast<PaneDockingWindow*>(GetWindow());
+ if (pDockingWindow != nullptr)
+ pBase = ViewShellBase::GetViewShellBase(
+ pDockingWindow->GetBindings().GetDispatcher()->GetFrame());
+ if (pBase != nullptr)
+ framework::FrameworkHelper::Instance(*pBase)->UpdateConfiguration();
+}
+
+//===== LeftPaneImpressChildWindow ============================================
+LeftPaneImpressChildWindow::LeftPaneImpressChildWindow (
+ vcl::Window* pParentWindow,
+ sal_uInt16 nId,
+ SfxBindings* pBindings,
+ SfxChildWinInfo* pInfo)
+ : PaneChildWindow(
+ pParentWindow,
+ nId,
+ pBindings,
+ pInfo,
+ STR_LEFT_PANE_IMPRESS_TITLE)
+{
+}
+
+//===== LeftPaneDrawChildWindow ===============================================
+LeftPaneDrawChildWindow::LeftPaneDrawChildWindow (
+ vcl::Window* pParentWindow,
+ sal_uInt16 nId,
+ SfxBindings* pBindings,
+ SfxChildWinInfo* pInfo)
+ : PaneChildWindow(
+ pParentWindow,
+ nId,
+ pBindings,
+ pInfo,
+ STR_LEFT_PANE_DRAW_TITLE)
+{
+}
+
+} // end of namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/PaneDockingWindow.cxx b/sd/source/ui/dlg/PaneDockingWindow.cxx
new file mode 100644
index 000000000..6f7332ad9
--- /dev/null
+++ b/sd/source/ui/dlg/PaneDockingWindow.cxx
@@ -0,0 +1,127 @@
+/* -*- 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 <PaneDockingWindow.hxx>
+#include <ViewShellBase.hxx>
+#include <framework/FrameworkHelper.hxx>
+
+#include <sfx2/dispatch.hxx>
+#include <vcl/splitwin.hxx>
+#include <tools/wintypes.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+using ::sd::TitledDockingWindow;
+
+namespace sd {
+
+PaneDockingWindow::PaneDockingWindow(
+ SfxBindings *_pBindings, SfxChildWindow *pChildWindow, vcl::Window* pParent,
+ const OUString& rsTitle )
+ : TitledDockingWindow(_pBindings, pChildWindow, pParent)
+{
+ SetTitle(rsTitle);
+ SetSizePixel(LogicToPixel(Size(80,200), MapMode(MapUnit::MapAppFont)));
+}
+
+PaneDockingWindow::~PaneDockingWindow()
+{
+}
+
+void PaneDockingWindow::StateChanged( StateChangedType nType )
+{
+ switch (nType)
+ {
+ case StateChangedType::InitShow:
+ Resize();
+ GetContentWindow().SetStyle(GetContentWindow().GetStyle() | WB_DIALOGCONTROL);
+ break;
+
+ case StateChangedType::Visible:
+ {
+ // The visibility of the docking window has changed. Tell the
+ // ConfigurationController so that it can activate or deactivate
+ // a/the view for the pane.
+ // Without this the side panes remain empty after closing an
+ // in-place slide show.
+ ViewShellBase* pBase = ViewShellBase::GetViewShellBase(
+ GetBindings().GetDispatcher()->GetFrame());
+ if (pBase != nullptr)
+ {
+ framework::FrameworkHelper::Instance(*pBase)->UpdateConfiguration();
+ }
+ }
+ break;
+
+ default:;
+ }
+ SfxDockingWindow::StateChanged (nType);
+}
+
+void PaneDockingWindow::MouseButtonDown (const MouseEvent& rEvent)
+{
+ if (rEvent.GetButtons() == MOUSE_LEFT)
+ {
+ // For some strange reason we have to set the WB_DIALOGCONTROL at
+ // the content window in order to have it pass focus to its content
+ // window. Without setting this flag here that works only on views
+ // that have not been taken from the cash and relocated to this pane
+ // docking window.
+ GetContentWindow().SetStyle(GetContentWindow().GetStyle() | WB_DIALOGCONTROL);
+ GetContentWindow().GrabFocus();
+ }
+ SfxDockingWindow::MouseButtonDown(rEvent);
+}
+
+void PaneDockingWindow::SetValidSizeRange (const Range& rValidSizeRange)
+{
+ SplitWindow* pSplitWindow = dynamic_cast<SplitWindow*>(GetParent());
+ if (pSplitWindow == nullptr)
+ return;
+
+ const sal_uInt16 nId (pSplitWindow->GetItemId(static_cast< vcl::Window*>(this)));
+ const sal_uInt16 nSetId (pSplitWindow->GetSet(nId));
+ // Because the PaneDockingWindow paints its own decoration, we have
+ // to compensate the valid size range for that.
+ const SvBorder aBorder (GetDecorationBorder());
+ sal_Int32 nCompensation (pSplitWindow->IsHorizontal()
+ ? aBorder.Top() + aBorder.Bottom()
+ : aBorder.Left() + aBorder.Right());
+ pSplitWindow->SetItemSizeRange(
+ nSetId,
+ Range(
+ rValidSizeRange.Min() + nCompensation,
+ rValidSizeRange.Max() + nCompensation));
+}
+
+PaneDockingWindow::Orientation PaneDockingWindow::GetOrientation() const
+{
+ SplitWindow* pSplitWindow = dynamic_cast<SplitWindow*>(GetParent());
+ if (pSplitWindow == nullptr)
+ return UnknownOrientation;
+ else if (pSplitWindow->IsHorizontal())
+ return HorizontalOrientation;
+ else
+ return VerticalOrientation;
+}
+
+} // end of namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/PaneShells.cxx b/sd/source/ui/dlg/PaneShells.cxx
new file mode 100644
index 000000000..8870d1186
--- /dev/null
+++ b/sd/source/ui/dlg/PaneShells.cxx
@@ -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/.
+ *
+ * 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 <PaneShells.hxx>
+
+#include <PaneChildWindows.hxx>
+
+#include <sfx2/msg.hxx>
+#include <sfx2/objface.hxx>
+
+namespace sd {
+
+//===== LeftImpressPaneShell ==================================================
+
+static SfxSlot aLeftImpressPaneShellSlots_Impl[] =
+{
+ { 0, SfxGroupId::NONE, SfxSlotMode::NONE, 0, 0, nullptr, nullptr, nullptr, nullptr, nullptr, 0, SfxDisableFlags::NONE, nullptr }
+};
+
+SFX_IMPL_INTERFACE(LeftImpressPaneShell, SfxShell)
+
+void LeftImpressPaneShell::InitInterface_Impl()
+{
+ GetStaticInterface()->RegisterChildWindow(::sd::LeftPaneImpressChildWindow::GetChildWindowId());
+}
+
+
+LeftImpressPaneShell::LeftImpressPaneShell()
+{
+ SetName("LeftImpressPane");
+}
+
+LeftImpressPaneShell::~LeftImpressPaneShell()
+{
+}
+
+//===== LeftDrawPaneShell =====================================================
+
+static SfxSlot aLeftDrawPaneShellSlots_Impl[] =
+{
+ { 0, SfxGroupId::NONE, SfxSlotMode::NONE, 0, 0, nullptr, nullptr, nullptr, nullptr, nullptr, 0, SfxDisableFlags::NONE, nullptr }
+};
+
+SFX_IMPL_INTERFACE(LeftDrawPaneShell, SfxShell)
+
+void LeftDrawPaneShell::InitInterface_Impl()
+{
+ GetStaticInterface()->RegisterChildWindow(::sd::LeftPaneDrawChildWindow::GetChildWindowId());
+}
+
+
+LeftDrawPaneShell::LeftDrawPaneShell()
+{
+ SetName("LeftDrawPane");
+}
+
+LeftDrawPaneShell::~LeftDrawPaneShell()
+{
+}
+
+} // end of namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/PhotoAlbumDialog.cxx b/sd/source/ui/dlg/PhotoAlbumDialog.cxx
new file mode 100644
index 000000000..f63afe7bb
--- /dev/null
+++ b/sd/source/ui/dlg/PhotoAlbumDialog.cxx
@@ -0,0 +1,775 @@
+/* -*- 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 <comphelper/namedvaluecollection.hxx>
+#include <comphelper/processfactory.hxx>
+#include <svl/itemset.hxx>
+#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
+#include <com/sun/star/graphic/GraphicProvider.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+
+#include <sfx2/filedlghelper.hxx>
+#include <tools/urlobj.hxx>
+
+#include <unotools/ucbstreamhelper.hxx>
+#include <vcl/graphicfilter.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xfltrit.hxx>
+#include <svx/xflclit.hxx>
+#include <tools/diagnose_ex.h>
+#include <xmloff/autolayout.hxx>
+
+#include "PhotoAlbumDialog.hxx"
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+
+namespace sd
+{
+
+SdPhotoAlbumDialog::SdPhotoAlbumDialog(weld::Window* pWindow, SdDrawDocument* pActDoc)
+ : GenericDialogController(pWindow, "modules/simpress/ui/photoalbum.ui", "PhotoAlbumCreatorDialog")
+ , m_pDoc(pActDoc)
+ , m_aImg(m_xDialog.get())
+ , m_xCancelBtn(m_xBuilder->weld_button("cancel"))
+ , m_xCreateBtn(m_xBuilder->weld_button("ok"))
+ , m_xAddBtn(m_xBuilder->weld_button("add_btn"))
+ , m_xUpBtn(m_xBuilder->weld_button("up_btn"))
+ , m_xDownBtn(m_xBuilder->weld_button("down_btn"))
+ , m_xRemoveBtn(m_xBuilder->weld_button("rem_btn"))
+ , m_xImagesLst(m_xBuilder->weld_tree_view("images_tree"))
+ , m_xImg(new weld::CustomWeld(*m_xBuilder, "preview_img", m_aImg))
+ , m_xInsTypeCombo(m_xBuilder->weld_combo_box("opt_combo"))
+ , m_xASRCheck(m_xBuilder->weld_check_button("asr_check"))
+ , m_xASRCheckCrop(m_xBuilder->weld_check_button("asr_check_crop"))
+ , m_xCapCheck(m_xBuilder->weld_check_button("cap_check"))
+ , m_xInsertAsLinkCheck(m_xBuilder->weld_check_button("insert_as_link_check"))
+{
+ m_xCancelBtn->connect_clicked(LINK(this, SdPhotoAlbumDialog, CancelHdl));
+ m_xCreateBtn->connect_clicked(LINK(this, SdPhotoAlbumDialog, CreateHdl));
+
+ m_xAddBtn->connect_clicked(LINK(this, SdPhotoAlbumDialog, FileHdl));
+ m_xUpBtn->connect_clicked(LINK(this, SdPhotoAlbumDialog, UpHdl));
+ m_xUpBtn->set_sensitive(false);
+ m_xDownBtn->connect_clicked(LINK(this, SdPhotoAlbumDialog, DownHdl));
+ m_xDownBtn->set_sensitive(false);
+ m_xRemoveBtn->connect_clicked(LINK(this, SdPhotoAlbumDialog, RemoveHdl));
+ m_xRemoveBtn->set_sensitive(false);
+ m_xImagesLst->connect_changed(LINK(this, SdPhotoAlbumDialog, SelectHdl));
+ m_xInsTypeCombo->connect_changed(LINK(this, SdPhotoAlbumDialog, TypeSelectHdl));
+
+ m_pGraphicFilter = new GraphicFilter;
+ m_xAddBtn->grab_focus();
+}
+
+SdPhotoAlbumDialog::~SdPhotoAlbumDialog()
+{
+}
+
+IMPL_LINK_NOARG(SdPhotoAlbumDialog, CancelHdl, weld::Button&, void)
+{
+ m_xDialog->response(RET_CANCEL);
+}
+
+IMPL_LINK_NOARG(SdPhotoAlbumDialog, CreateHdl, weld::Button&, void)
+{
+ if (m_xImagesLst->n_children() == 0)
+ {
+ std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(m_xDialog.get(),
+ VclMessageType::Warning, VclButtonsType::Ok,
+ SdResId(STR_PHOTO_ALBUM_EMPTY_WARNING)));
+ xWarn->run();
+ }
+ else
+ {
+ Reference< drawing::XDrawPagesSupplier > xDPS( m_pDoc->getUnoModel(), uno::UNO_QUERY );
+ Reference< drawing::XDrawPages > xDrawPages = xDPS->getDrawPages();
+ Reference< lang::XMultiServiceFactory > xShapeFactory( m_pDoc->getUnoModel(), uno::UNO_QUERY );
+
+ Reference< XComponentContext > xContext(::comphelper::getProcessComponentContext());
+ Reference< graphic::XGraphicProvider> xProvider(graphic::GraphicProvider::create(xContext));
+
+ // determine if to use Captions (use TitleObject) and choose the correct AutoLayout
+ // from the beginning
+ const bool bCreateCaptions(m_xCapCheck->get_active());
+ const bool bInsertAsLink(m_xInsertAsLinkCheck->get_active());
+ const AutoLayout aAutoLayout(bCreateCaptions ? AUTOLAYOUT_TITLE_ONLY : AUTOLAYOUT_NONE);
+
+ // get the option
+ const int nOpt = m_xInsTypeCombo->get_active();
+ if (nOpt == ONE_IMAGE)
+ {
+ for( sal_Int32 i = 0; i < m_xImagesLst->n_children(); ++i )
+ {
+ OUString sUrl = m_xImagesLst->get_id(i);
+
+ Reference< drawing::XDrawPage > xSlide = appendNewSlide(aAutoLayout, xDrawPages);
+ Reference< beans::XPropertySet > xSlideProps( xSlide, uno::UNO_QUERY );
+ Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl, xProvider);
+
+ Graphic aGraphic(xGraphic);
+ if (bInsertAsLink)
+ aGraphic.setOriginURL(sUrl);
+
+ // Save the original size, multiplied with 100
+ ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100);
+
+ Reference< drawing::XShape > xShape(
+ xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"),
+ uno::UNO_QUERY);
+
+ Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
+ xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic));
+
+ ::awt::Size aPageSize;
+
+ xSlideProps->getPropertyValue(
+ "Width") >>= aPageSize.Width;
+ xSlideProps->getPropertyValue(
+ "Height") >>= aPageSize.Height;
+
+ ::awt::Point aPicPos;
+
+ if (m_xASRCheck->get_active() && !m_xASRCheckCrop->get_active())
+ {
+ // Resize the image, with keeping ASR
+ aPicSize = createASRSize(aPicSize, aPageSize);
+ }
+ else if (m_xASRCheckCrop->get_active())
+ {
+ aPicSize = createASRSizeCrop(aPicSize, aPageSize);
+ }
+
+ xShape->setSize(aPicSize);
+ aPicPos.X = (aPageSize.Width - aPicSize.Width)/2;
+ aPicPos.Y = (aPageSize.Height - aPicSize.Height)/2;
+
+ xShape->setPosition(aPicPos);
+ try
+ {
+ xSlide->add(xShape);
+ if (bCreateCaptions)
+ createCaption( aPageSize );
+ }
+ catch (const css::uno::Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "" );
+ }
+ }
+ }
+ else if( nOpt == TWO_IMAGES )
+ {
+ for( sal_Int32 i = 0; i < m_xImagesLst->n_children(); i+=2 )
+ {
+ // create the slide
+ Reference< drawing::XDrawPage > xSlide = appendNewSlide(aAutoLayout, xDrawPages);
+ Reference< beans::XPropertySet > xSlideProps( xSlide, uno::UNO_QUERY );
+ //Slide dimensions
+ ::awt::Size aPageSize;
+
+ xSlideProps->getPropertyValue(
+ "Width") >>= aPageSize.Width;
+ xSlideProps->getPropertyValue(
+ "Height") >>= aPageSize.Height;
+
+ // grab the left one
+ OUString sUrl1 = m_xImagesLst->get_id(i);
+ // grab the right one
+ OUString sUrl2 = m_xImagesLst->get_id(i+1);
+
+ if( !sUrl1.isEmpty() )
+ {
+ Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl1, xProvider);
+
+ Graphic aGraphic(xGraphic);
+ if (bInsertAsLink)
+ aGraphic.setOriginURL(sUrl1);
+ // Save the original size, multiplied with 100
+ ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100);
+
+ Reference< drawing::XShape > xShape(
+ xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"),
+ uno::UNO_QUERY);
+
+ Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
+ xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic));
+
+ ::awt::Point aPicPos;
+
+ if (m_xASRCheck->get_active())
+ {
+ // Resize the image, with keeping ASR
+ aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2 - 100, aPageSize.Height/2 - 100));
+ }
+ else
+ {
+ aPicSize.Width = aPageSize.Width/2 - 100;
+ aPicSize.Height = aPageSize.Height/2 - 100;
+ }
+ xShape->setSize(aPicSize);
+ aPicPos.X = (aPageSize.Width/4 - aPicSize.Width/2);
+ aPicPos.Y = aPageSize.Height/2 - aPicSize.Height/2;
+
+ xShape->setPosition(aPicPos);
+ try
+ {
+ xSlide->add(xShape);
+ }
+ catch (const css::uno::Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "" );
+ }
+ }
+
+ if( !sUrl2.isEmpty() )
+ {
+ Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl2, xProvider);
+
+ Graphic aGraphic(xGraphic);
+ if (bInsertAsLink)
+ aGraphic.setOriginURL(sUrl2);
+ // Save the original size, multiplied with 100
+ ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100);
+
+ Reference< drawing::XShape > xShape(
+ xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"),
+ uno::UNO_QUERY);
+
+ Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
+ xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic));
+
+ ::awt::Point aPicPos;
+
+ if (m_xASRCheck->get_active())
+ {
+ // Resize the image, with keeping ASR
+ aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2 - 100, aPageSize.Height/2 - 100));
+ }
+ else
+ {
+ aPicSize.Width = aPageSize.Width/2 - 100;
+ aPicSize.Height = aPageSize.Height/2 - 100;
+ }
+ xShape->setSize(aPicSize);
+ aPicPos.X = (aPageSize.Width/4 - aPicSize.Width/2) + aPageSize.Width/2;
+ aPicPos.Y = aPageSize.Height/2 - aPicSize.Height/2;
+
+ xShape->setPosition(aPicPos);
+
+ try
+ {
+ xSlide->add(xShape);
+ if(bCreateCaptions)
+ createCaption( aPageSize );
+ }
+ catch (const css::uno::Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "" );
+ }
+ }
+ }
+ }
+ else if( nOpt == FOUR_IMAGES )
+ {
+ for( sal_Int32 i = 0; i < m_xImagesLst->n_children(); i+=4 )
+ {
+ // create the slide
+ Reference< drawing::XDrawPage > xSlide = appendNewSlide(aAutoLayout, xDrawPages);
+ Reference< beans::XPropertySet > xSlideProps( xSlide, uno::UNO_QUERY );
+ //Slide dimensions
+ ::awt::Size aPageSize;
+
+ xSlideProps->getPropertyValue(
+ "Width") >>= aPageSize.Width;
+ xSlideProps->getPropertyValue(
+ "Height") >>= aPageSize.Height;
+
+ // grab the upper left one
+ OUString sUrl1 = m_xImagesLst->get_id(i);
+
+ // grab the upper right one
+ OUString sUrl2 = m_xImagesLst->get_id(i+1);
+
+ // grab the lower left one
+ OUString sUrl3 = m_xImagesLst->get_id(i+2);
+
+ // grab the lower right one
+ OUString sUrl4 = m_xImagesLst->get_id(i+3);
+
+ if( !sUrl1.isEmpty() )
+ {
+ Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl1, xProvider);
+
+ Graphic aGraphic(xGraphic);
+ if (bInsertAsLink)
+ aGraphic.setOriginURL(sUrl1);
+ // Save the original size, multiplied with 100
+ ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100);
+
+ Reference< drawing::XShape > xShape(
+ xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"),
+ uno::UNO_QUERY);
+
+ Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
+ xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic));
+
+ ::awt::Point aPicPos;
+
+ if (m_xASRCheck->get_active())
+ {
+ // Resize the image, with keeping ASR
+ aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2 - 100, aPageSize.Height/2 - 100));
+ }
+ else
+ {
+ aPicSize.Width = aPageSize.Width/2 - 100;
+ aPicSize.Height = aPageSize.Height/2 - 100;
+ }
+ xShape->setSize(aPicSize);
+ aPicPos.X = (aPageSize.Width/4 - aPicSize.Width/2);
+ aPicPos.Y = aPageSize.Height/4 - aPicSize.Height/2;
+
+ xShape->setPosition(aPicPos);
+ try
+ {
+ xSlide->add(xShape);
+ }
+ catch (const css::uno::Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "" );
+ }
+ }
+ if( !sUrl2.isEmpty() )
+ {
+ Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl2, xProvider);
+
+ Graphic aGraphic(xGraphic);
+ if (bInsertAsLink)
+ aGraphic.setOriginURL(sUrl2);
+ // Save the original size, multiplied with 100
+ ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100);
+
+ Reference< drawing::XShape > xShape(
+ xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"),
+ uno::UNO_QUERY);
+
+ Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
+ xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic));
+
+ ::awt::Point aPicPos;
+
+ if (m_xASRCheck->get_active())
+ {
+ // Resize the image, with keeping ASR
+ aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2 - 100, aPageSize.Height/2 - 100));
+ }
+ else
+ {
+ aPicSize.Width = aPageSize.Width/2 - 100;
+ aPicSize.Height = aPageSize.Height/2 - 100;
+ }
+ xShape->setSize(aPicSize);
+ aPicPos.X = (aPageSize.Width/4 - aPicSize.Width/2) + aPageSize.Width/2;
+ aPicPos.Y = aPageSize.Height/4 - aPicSize.Height/2;
+
+ xShape->setPosition(aPicPos);
+ try
+ {
+ xSlide->add(xShape);
+ }
+ catch (const css::uno::Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "" );
+ }
+ }
+ if( !sUrl3.isEmpty() )
+ {
+ Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl3, xProvider);
+
+ Graphic aGraphic(xGraphic);
+ if (bInsertAsLink)
+ aGraphic.setOriginURL(sUrl3);
+ // Save the original size, multiplied with 100
+ ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100);
+
+ Reference< drawing::XShape > xShape(
+ xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"),
+ uno::UNO_QUERY);
+
+ Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
+ xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic));
+
+ ::awt::Point aPicPos;
+
+ if (m_xASRCheck->get_active())
+ {
+ // Resize the image, with keeping ASR
+ aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2 - 100, aPageSize.Height/2 - 100));
+ }
+ else
+ {
+ aPicSize.Width = aPageSize.Width/2 - 100;
+ aPicSize.Height = aPageSize.Height/2 - 100;
+ }
+ xShape->setSize(aPicSize);
+ aPicPos.X = (aPageSize.Width/4 - aPicSize.Width/2);
+ aPicPos.Y = aPageSize.Height/4 - aPicSize.Height/2 + aPageSize.Height/2;
+
+ xShape->setPosition(aPicPos);
+ try
+ {
+ xSlide->add(xShape);
+ }
+ catch (const css::uno::Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "" );
+ }
+ }
+ if( !sUrl4.isEmpty() )
+ {
+ Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl4, xProvider);
+
+ Graphic aGraphic(xGraphic);
+ if (bInsertAsLink)
+ aGraphic.setOriginURL(sUrl4);
+ // Save the original size, multiplied with 100
+ ::awt::Size aPicSize(aGraphic.GetSizePixel().Width()*100, aGraphic.GetSizePixel().Height()*100);
+
+ Reference< drawing::XShape > xShape(
+ xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"),
+ uno::UNO_QUERY);
+
+ Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
+ xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic));
+
+ ::awt::Point aPicPos;
+
+ if (m_xASRCheck->get_active())
+ {
+ // Resize the image, with keeping ASR
+ aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2 - 100, aPageSize.Height/2 - 100));
+ }
+ else
+ {
+ aPicSize.Width = aPageSize.Width/2 - 100;
+ aPicSize.Height = aPageSize.Height/2 - 100;
+ }
+ xShape->setSize(aPicSize);
+ aPicPos.X = (aPageSize.Width/4 - aPicSize.Width/2) + aPageSize.Width/2;
+ aPicPos.Y = aPageSize.Height/4 - aPicSize.Height/2 + aPageSize.Height/2;
+
+ xShape->setPosition(aPicPos);
+ try
+ {
+ xSlide->add(xShape);
+ if(bCreateCaptions)
+ createCaption( aPageSize );
+ }
+ catch (const css::uno::Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "" );
+ }
+ }
+ }
+ }
+ else
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(m_xDialog.get(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ "Function is not implemented!"));
+ xInfoBox->run();
+ }
+ m_xDialog->response(RET_OK);
+ }
+}
+
+IMPL_LINK_NOARG(SdPhotoAlbumDialog, FileHdl, weld::Button&, void)
+{
+ ::sfx2::FileDialogHelper aDlg(
+ css::ui::dialogs::TemplateDescription::FILEOPEN_PREVIEW,
+ FileDialogFlags::Graphic | FileDialogFlags::MultiSelection, m_xDialog.get());
+ aDlg.SetContext(sfx2::FileDialogHelper::ImpressPhotoDialog);
+
+ if ( aDlg.Execute() == ERRCODE_NONE )
+ {
+ const Sequence< OUString > aFilesArr = aDlg.GetSelectedFiles();
+ for ( const auto& rFile : aFilesArr )
+ {
+ // Store full path, show filename only. Use INetURLObject to display spaces in filename correctly
+ INetURLObject aUrl(rFile);
+ m_xImagesLst->append(aUrl.GetMainURL(INetURLObject::DecodeMechanism::NONE), aUrl.GetLastName(INetURLObject::DecodeMechanism::WithCharset), "");
+ }
+ }
+ EnableDisableButtons();
+}
+
+IMPL_LINK_NOARG(SdPhotoAlbumDialog, UpHdl, weld::Button&, void)
+{
+ const int nActPos = m_xImagesLst->get_selected_index();
+ if (nActPos != -1 && nActPos != 0)
+ {
+ OUString sActEntry(m_xImagesLst->get_text(nActPos));
+ // actual data
+ OUString sAct(m_xImagesLst->get_id(nActPos));
+
+ OUString sUpperEntry(m_xImagesLst->get_text(nActPos - 1));
+ // upper data
+ OUString sUpper(m_xImagesLst->get_id(nActPos - 1));
+
+ m_xImagesLst->remove_text(sActEntry);
+ m_xImagesLst->remove_text(sUpperEntry);
+
+ m_xImagesLst->insert(nActPos - 1, sActEntry, &sAct, nullptr, nullptr);
+ m_xImagesLst->insert(nActPos, sUpperEntry, &sUpper, nullptr, nullptr);
+
+ m_xImagesLst->select(nActPos - 1);
+ }
+
+ EnableDisableButtons();
+}
+
+IMPL_LINK_NOARG(SdPhotoAlbumDialog, DownHdl, weld::Button&, void)
+{
+ const int nActPos = m_xImagesLst->get_selected_index();
+ if (!m_xImagesLst->get_text(nActPos + 1).isEmpty())
+ {
+ OUString sActEntry(m_xImagesLst->get_selected_text());
+ OUString sAct(m_xImagesLst->get_selected_id());
+
+ OUString sDownEntry(m_xImagesLst->get_text(nActPos + 1));
+ OUString sDown(m_xImagesLst->get_id(nActPos + 1));
+
+ m_xImagesLst->remove_text(sActEntry);
+ m_xImagesLst->remove_text(sDownEntry);
+
+ m_xImagesLst->insert(nActPos, sDownEntry, &sDown, nullptr, nullptr);
+ m_xImagesLst->insert(nActPos + 1, sActEntry, &sAct, nullptr, nullptr);
+
+ m_xImagesLst->select(nActPos + 1);
+ }
+ EnableDisableButtons();
+}
+
+IMPL_LINK_NOARG(SdPhotoAlbumDialog, RemoveHdl, weld::Button&, void)
+{
+ m_xImagesLst->remove(m_xImagesLst->get_selected_index());
+ m_aImg.SetGraphic(Graphic());
+
+ EnableDisableButtons();
+}
+
+IMPL_LINK_NOARG(SdPhotoAlbumDialog, SelectHdl, weld::TreeView&, void)
+{
+ OUString sImgUrl = m_xImagesLst->get_selected_id();
+
+ if (sImgUrl != SdResId(STR_PHOTO_ALBUM_TEXTBOX))
+ {
+ Graphic aGraphic;
+ INetURLObject aURLObj( sImgUrl );
+
+ sal_uInt16 nFilter = GRFILTER_FORMAT_DONTKNOW;
+
+ if ( aURLObj.HasError() || INetProtocol::NotValid == aURLObj.GetProtocol() )
+ {
+ aURLObj.SetSmartProtocol( INetProtocol::File );
+ aURLObj.SetSmartURL( sImgUrl );
+ }
+
+ GraphicFilterImportFlags nFilterImportFlags = GraphicFilterImportFlags::SetLogsizeForJpeg;
+ // remote?
+ if ( INetProtocol::File != aURLObj.GetProtocol() )
+ {
+ std::unique_ptr<SvStream> pStream = ::utl::UcbStreamHelper::CreateStream( sImgUrl, StreamMode::READ );
+
+ if( pStream )
+ m_pGraphicFilter->ImportGraphic( aGraphic, sImgUrl, *pStream, nFilter, nullptr, nFilterImportFlags );
+ else
+ m_pGraphicFilter->ImportGraphic( aGraphic, aURLObj, nFilter, nullptr, nFilterImportFlags );
+ }
+ else
+ {
+ m_pGraphicFilter->ImportGraphic( aGraphic, aURLObj, nFilter, nullptr, nFilterImportFlags );
+ }
+
+ BitmapEx aBmp = aGraphic.GetBitmapEx();
+ sal_Int32 nBmpWidth = aBmp.GetSizePixel().Width();
+ sal_Int32 nBmpHeight = aBmp.GetSizePixel().Height();
+
+ double nXRatio = double(200) / nBmpWidth;
+ double nYRatio = double(150) / nBmpHeight;
+ if ( nXRatio < nYRatio )
+ aBmp.Scale( nXRatio, nXRatio );
+ else
+ aBmp.Scale( nYRatio, nYRatio );
+
+ aBmp.Convert( BmpConversion::N24Bit );
+ m_aImg.SetGraphic(Graphic(aBmp));
+ }
+ else
+ {
+ m_aImg.SetGraphic(Graphic());
+ }
+ EnableDisableButtons();
+}
+
+IMPL_LINK_NOARG(SdPhotoAlbumDialog, TypeSelectHdl, weld::ComboBox&, void)
+{
+ // Enable "Fill Slide" only for one image
+ // If we want to have it for other images too, we need to implement the actual cropping.
+ bool const bEnable = m_xInsTypeCombo->get_active() == ONE_IMAGE;
+ m_xASRCheckCrop->set_sensitive(bEnable);
+ if (!bEnable)
+ m_xASRCheckCrop->set_active(false);
+}
+
+Reference< drawing::XDrawPage > SdPhotoAlbumDialog::appendNewSlide(AutoLayout aLayout,
+ const Reference< drawing::XDrawPages >& xDrawPages
+)
+{
+ // Create the slide
+ Reference< drawing::XDrawPage > xSlide = xDrawPages->insertNewByIndex( xDrawPages->getCount() );
+ SdPage* pSlide = m_pDoc->GetSdPage( m_pDoc->GetSdPageCount(PageKind::Standard)-1, PageKind::Standard);
+ pSlide->SetAutoLayout(aLayout, true); // Set the layout here
+ return xSlide;
+}
+
+awt::Size SdPhotoAlbumDialog::createASRSize(const awt::Size& aPicSize, const awt::Size& aMaxSize)
+{
+ double resizeWidth = aPicSize.Width;
+ double resizeHeight = aPicSize.Height;
+ double aspect = resizeWidth/resizeHeight;
+
+ if( resizeWidth > aMaxSize.Width )
+ {
+ resizeWidth = aMaxSize.Width;
+ resizeHeight = resizeWidth / aspect;
+ }
+
+ if( resizeHeight > aMaxSize.Height )
+ {
+ aspect = resizeWidth/resizeHeight;
+ resizeHeight = aMaxSize.Height;
+ resizeWidth = resizeHeight * aspect;
+ }
+ return awt::Size(resizeWidth, resizeHeight);
+}
+
+awt::Size SdPhotoAlbumDialog::createASRSizeCrop(const awt::Size& aPicSize, const awt::Size& aMaxSize)
+{
+ double resizeWidth = aPicSize.Width;
+ double resizeHeight = aPicSize.Height;
+ double imgAspect = resizeWidth / resizeHeight;
+ double windowAspectRatio = static_cast<double>(aMaxSize.Width) / aMaxSize.Height ;
+
+
+ //When both sides of an image are bigger than canvas size, image would be downscaled.
+ if( resizeWidth > aMaxSize.Width && resizeHeight > aMaxSize.Height )
+ {
+ if( imgAspect > windowAspectRatio )
+ {
+ resizeHeight = aMaxSize.Height;
+ resizeWidth = aMaxSize.Height * imgAspect;
+ }
+ else
+ {
+ resizeHeight = aMaxSize.Width / imgAspect;
+ resizeWidth = aMaxSize.Width;
+ }
+
+ }
+ //In all other cases image is upscaled
+ else
+ {
+ if( imgAspect > windowAspectRatio )
+ {
+ resizeHeight = aMaxSize.Height;
+ resizeWidth = aMaxSize.Height * imgAspect;
+ }
+ else
+ {
+ resizeWidth = aMaxSize.Width;
+ resizeHeight = aMaxSize.Width / imgAspect;
+ }
+ }
+ return awt::Size(resizeWidth, resizeHeight);
+}
+
+void SdPhotoAlbumDialog::createCaption(const awt::Size& aPageSize )
+{
+ Point CapPos;
+ Size CapSize;
+
+ CapSize.setWidth( aPageSize.Width );
+ CapSize.setHeight( aPageSize.Height/6 );
+ CapPos.setX( 0 );
+ CapPos.setY( aPageSize.Height - CapSize.Height() );
+ SdPage* pSlide = m_pDoc->GetSdPage( m_pDoc->GetSdPageCount(PageKind::Standard)-1, PageKind::Standard );
+
+ // try to get existing PresObj
+ const ::tools::Rectangle rRect(CapPos,CapSize);
+ SdrObject* pSdrObj = pSlide->GetPresObj(PresObjKind::Title);
+
+ if(!pSdrObj)
+ {
+ // if not exists, create. Beware: It is already inserted to the SdPage
+ pSdrObj = pSlide->CreatePresObj(PresObjKind::Title,false,rRect);
+ }
+ else
+ {
+ // if exists, bring to front and position it
+ const size_t nObjNum(pSlide->GetObjCount());
+
+ if(nObjNum)
+ {
+ pSlide->SetObjectOrdNum(pSdrObj->GetOrdNum(), nObjNum - 1);
+ }
+
+ pSdrObj->SetSnapRect(rRect);
+ }
+
+ if(pSdrObj)
+ {
+ // set color, style and some transparency
+ SfxItemSet aSet(m_pDoc->GetItemPool() );
+
+ aSet.Put( XFillStyleItem(drawing::FillStyle_SOLID) );
+ aSet.Put( XFillColorItem( "", COL_BLACK ) );
+ aSet.Put( XFillTransparenceItem( 20 ) );
+ pSdrObj->SetMergedItemSetAndBroadcast(aSet);
+ }
+}
+
+Reference< graphic::XGraphic> SdPhotoAlbumDialog::createXGraphicFromUrl(const OUString& sUrl,
+ const Reference< graphic::XGraphicProvider>& xProvider
+)
+{
+ // The same as above, except this returns an XGraphic from the image URL
+ ::comphelper::NamedValueCollection aMediaProperties;
+ aMediaProperties.put( "URL", sUrl );
+ Reference< graphic::XGraphic> xGraphic =
+ xProvider->queryGraphic( aMediaProperties.getPropertyValues() );
+ return xGraphic;
+}
+
+void SdPhotoAlbumDialog::EnableDisableButtons()
+{
+ m_xRemoveBtn->set_sensitive(m_xImagesLst->count_selected_rows() > 0);
+ m_xUpBtn->set_sensitive(m_xImagesLst->count_selected_rows() > 0 &&
+ m_xImagesLst->get_selected_index() != 0);
+ m_xDownBtn->set_sensitive(m_xImagesLst->count_selected_rows() > 0 &&
+ m_xImagesLst->get_selected_index() < m_xImagesLst->n_children() - 1);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/PhotoAlbumDialog.hxx b/sd/source/ui/dlg/PhotoAlbumDialog.hxx
new file mode 100644
index 000000000..f84ff5cc3
--- /dev/null
+++ b/sd/source/ui/dlg/PhotoAlbumDialog.hxx
@@ -0,0 +1,91 @@
+/* -*- 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/.
+*/
+
+#pragma once
+
+#include <tools/link.hxx>
+
+#include <vcl/weld.hxx>
+#include <svx/graphctl.hxx>
+#include <xmloff/autolayout.hxx>
+
+#include <com/sun/star/awt/Size.hpp>
+
+namespace com::sun::star::drawing { class XDrawPage; }
+namespace com::sun::star::drawing { class XDrawPages; }
+namespace com::sun::star::graphic { class XGraphicProvider; }
+
+class SdDrawDocument;
+class GraphicFilter;
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd
+{
+
+class SdPhotoAlbumDialog : public weld::GenericDialogController
+{
+public:
+ SdPhotoAlbumDialog(weld::Window* pWindow, SdDrawDocument* pActDoc);
+ virtual ~SdPhotoAlbumDialog() override;
+
+private:
+ SdDrawDocument* m_pDoc;
+ GraphicFilter* m_pGraphicFilter;
+
+ GraphCtrl m_aImg;
+
+ std::unique_ptr<weld::Button> m_xCancelBtn;
+ std::unique_ptr<weld::Button> m_xCreateBtn;
+ std::unique_ptr<weld::Button> m_xAddBtn;
+ std::unique_ptr<weld::Button> m_xUpBtn;
+ std::unique_ptr<weld::Button> m_xDownBtn;
+ std::unique_ptr<weld::Button> m_xRemoveBtn;
+ std::unique_ptr<weld::TreeView> m_xImagesLst;
+ std::unique_ptr<weld::CustomWeld> m_xImg;
+ std::unique_ptr<weld::ComboBox> m_xInsTypeCombo;
+ std::unique_ptr<weld::CheckButton> m_xASRCheck;
+ std::unique_ptr<weld::CheckButton> m_xASRCheckCrop;
+ std::unique_ptr<weld::CheckButton> m_xCapCheck;
+ std::unique_ptr<weld::CheckButton> m_xInsertAsLinkCheck;
+
+ DECL_LINK(CancelHdl, weld::Button&, void);
+ DECL_LINK(CreateHdl, weld::Button&, void);
+
+ DECL_LINK(FileHdl, weld::Button&, void);
+ DECL_LINK(UpHdl, weld::Button&, void);
+ DECL_LINK(DownHdl, weld::Button&, void);
+ DECL_LINK(RemoveHdl, weld::Button&, void);
+
+ DECL_LINK(SelectHdl, weld::TreeView&, void);
+ DECL_LINK(TypeSelectHdl, weld::ComboBox&, void);
+
+ Reference< drawing::XDrawPage > appendNewSlide(AutoLayout aLayout,
+ const Reference< drawing::XDrawPages >& xDrawPages);
+
+ static awt::Size createASRSize(const awt::Size& aPicSize, const awt::Size& aMaxSize);
+ static awt::Size createASRSizeCrop(const awt::Size& aPicSize, const awt::Size& aMaxSize);
+ void createCaption(const awt::Size& aPageSize);
+ static Reference< graphic::XGraphic> createXGraphicFromUrl(const OUString& sUrl,
+ const Reference< graphic::XGraphicProvider>& xProvider);
+
+ void EnableDisableButtons();
+
+ enum SlideImageLayout
+ {
+ ONE_IMAGE=0,
+ TWO_IMAGES,
+ FOUR_IMAGES
+ };
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/RemoteDialog.cxx b/sd/source/ui/dlg/RemoteDialog.cxx
new file mode 100644
index 000000000..e28f57ecd
--- /dev/null
+++ b/sd/source/ui/dlg/RemoteDialog.cxx
@@ -0,0 +1,49 @@
+/* -*- 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 "RemoteDialog.hxx"
+#include <RemoteServer.hxx>
+
+using namespace ::sd;
+using namespace ::std;
+
+RemoteDialog::RemoteDialog(weld::Window* pWindow)
+ : GenericDialogController(pWindow, "modules/simpress/ui/remotedialog.ui", "RemoteDialog")
+ , m_xButtonConnect(m_xBuilder->weld_button("ok"))
+ , m_xClientBox(new sd::ClientBox(m_xBuilder->weld_scrolled_window("scroll"),
+ m_xBuilder->weld_container("tree")))
+{
+ m_xButtonConnect->connect_clicked(LINK(this, RemoteDialog, HandleConnectButton));
+}
+
+RemoteDialog::~RemoteDialog() {}
+
+IMPL_LINK_NOARG(RemoteDialog, HandleConnectButton, weld::Button&, void)
+{
+ weld::WaitObject(m_xDialog.get());
+#if defined(ENABLE_SDREMOTE)
+ auto xEntry = m_xClientBox->GetActiveEntry();
+ if (!xEntry)
+ return;
+ OUString aPin = xEntry->m_xPinBox->get_text();
+ if (RemoteServer::connectClient(xEntry->m_xClientInfo, aPin))
+ m_xDialog->response(RET_OK);
+#endif
+}
+
+short RemoteDialog::run()
+{
+ short nRet = weld::GenericDialogController::run();
+#ifdef ENABLE_SDREMOTE
+ RemoteServer::restoreDiscoverable();
+#endif
+ return nRet;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/RemoteDialog.hxx b/sd/source/ui/dlg/RemoteDialog.hxx
new file mode 100644
index 000000000..6c3f94ff8
--- /dev/null
+++ b/sd/source/ui/dlg/RemoteDialog.hxx
@@ -0,0 +1,32 @@
+/* -*- 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/.
+ */
+#pragma once
+
+#include <vcl/weld.hxx>
+
+#include "RemoteDialogClientBox.hxx"
+
+namespace sd
+{
+class RemoteDialog : public weld::GenericDialogController
+{
+private:
+ std::unique_ptr<weld::Button> m_xButtonConnect;
+ std::unique_ptr<ClientBox> m_xClientBox;
+
+ DECL_LINK(HandleConnectButton, weld::Button&, void);
+
+public:
+ explicit RemoteDialog(weld::Window* pWindow);
+ virtual short run() override;
+ virtual ~RemoteDialog() override;
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/RemoteDialogClientBox.cxx b/sd/source/ui/dlg/RemoteDialogClientBox.cxx
new file mode 100644
index 000000000..2371c4fb8
--- /dev/null
+++ b/sd/source/ui/dlg/RemoteDialogClientBox.cxx
@@ -0,0 +1,134 @@
+/* -*- 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 <vector>
+
+#include "RemoteDialogClientBox.hxx"
+#include <RemoteServer.hxx>
+
+#include <vcl/svapp.hxx>
+
+namespace sd {
+
+// struct ClientBoxEntry
+
+ClientBoxEntry::ClientBoxEntry(ClientBox* pClientBox,
+ const std::shared_ptr<ClientInfo>& pClientInfo)
+ : m_xBuilder(Application::CreateBuilder(pClientBox->GetContainer(), "modules/simpress/ui/clientboxfragment.ui"))
+ , m_xContainer(m_xBuilder->weld_container("ClientboxFragment"))
+ , m_xDeviceName(m_xBuilder->weld_label("name"))
+ , m_xPinLabel(m_xBuilder->weld_label("pinlabel"))
+ , m_xPinBox(m_xBuilder->weld_entry("pin"))
+ , m_xDeauthoriseButton(m_xBuilder->weld_button("button"))
+ , m_xClientInfo(pClientInfo)
+ , m_pClientBox(pClientBox)
+{
+ m_xDeviceName->set_label(m_xClientInfo->mName);
+ m_xDeauthoriseButton->connect_clicked(LINK(this, ClientBoxEntry, DeauthoriseHdl));
+ m_xDeauthoriseButton->set_visible(m_xClientInfo->mbIsAlreadyAuthorised);
+ m_xPinBox->set_visible(!m_xClientInfo->mbIsAlreadyAuthorised);
+ m_xPinLabel->set_visible(!m_xClientInfo->mbIsAlreadyAuthorised);
+
+ m_xDeauthoriseButton->connect_focus_in(LINK(this, ClientBoxEntry, FocusHdl));
+ m_xPinBox->connect_focus_in(LINK(this, ClientBoxEntry, FocusHdl));
+}
+
+ClientBoxEntry::~ClientBoxEntry()
+{
+ m_pClientBox->GetContainer()->move(m_xContainer.get(), nullptr);
+}
+
+// ClientBox
+ClientBox::ClientBox(std::unique_ptr<weld::ScrolledWindow> xScroll,
+ std::unique_ptr<weld::Container> xContents)
+ : m_xScroll(std::move(xScroll))
+ , m_xContents(std::move(xContents))
+ , m_pActive(nullptr)
+{
+ Size aSize(m_xScroll->get_approximate_digit_width() * 40,
+ m_xScroll->get_text_height() * 16);
+ m_xScroll->set_size_request(aSize.Width(), aSize.Height());
+
+ m_xContents->set_stack_background();
+
+ populateEntries();
+}
+
+ClientBox::~ClientBox()
+{
+}
+
+ClientBoxEntry* ClientBox::GetActiveEntry()
+{
+ return m_pActive;
+}
+
+void ClientBox::addEntry( const std::shared_ptr<ClientInfo>& pClientInfo )
+{
+ TClientBoxEntry xEntry = std::make_shared<ClientBoxEntry>(this, pClientInfo);
+ m_vEntries.push_back(xEntry);
+}
+
+void ClientBox::setActive(ClientBoxEntry* pClientEntry)
+{
+ m_pActive = pClientEntry;
+}
+
+void ClientBox::clearEntries()
+{
+ m_vEntries.clear();
+ m_pActive = nullptr;
+}
+
+void ClientBox::populateEntries()
+{
+ clearEntries();
+
+#ifdef ENABLE_SDREMOTE
+ RemoteServer::ensureDiscoverable();
+
+ std::vector< std::shared_ptr< ClientInfo > > aClients( RemoteServer::getClients() );
+
+ for ( const auto& rxClient : aClients )
+ {
+ addEntry( rxClient );
+ }
+#endif
+
+}
+
+IMPL_LINK_NOARG(ClientBoxEntry, DeauthoriseHdl, weld::Button&, void)
+{
+#ifdef ENABLE_SDREMOTE
+ RemoteServer::deauthoriseClient(m_xClientInfo);
+#endif
+ m_pClientBox->populateEntries();
+}
+
+IMPL_LINK_NOARG(ClientBoxEntry, FocusHdl, weld::Widget&, void)
+{
+ if (ClientBoxEntry* pOldEntry = m_pClientBox->GetActiveEntry())
+ pOldEntry->m_xContainer->set_stack_background();
+ m_pClientBox->setActive(this);
+ m_xContainer->set_highlight_background();
+}
+
+} //namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/RemoteDialogClientBox.hxx b/sd/source/ui/dlg/RemoteDialogClientBox.hxx
new file mode 100644
index 000000000..c7a916dc9
--- /dev/null
+++ b/sd/source/ui/dlg/RemoteDialogClientBox.hxx
@@ -0,0 +1,85 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/weld.hxx>
+
+#include <memory>
+
+namespace sd {
+
+#define SMALL_ICON_SIZE 16
+#define TOP_OFFSET 5
+#define ICON_HEIGHT 42
+#define ICON_WIDTH 47
+#define ICON_OFFSET 72
+#define RIGHT_ICON_OFFSET 5
+#define SPACE_BETWEEN 3
+
+class ClientBox;
+struct ClientBoxEntry;
+struct ClientInfo;
+
+typedef std::shared_ptr<ClientBoxEntry> TClientBoxEntry;
+
+struct ClientBoxEntry
+{
+ std::unique_ptr<weld::Builder> m_xBuilder;
+ std::unique_ptr<weld::Container> m_xContainer;
+ std::unique_ptr<weld::Label> m_xDeviceName;
+ std::unique_ptr<weld::Label> m_xPinLabel;
+ std::unique_ptr<weld::Entry> m_xPinBox;
+ std::unique_ptr<weld::Button> m_xDeauthoriseButton;
+
+ std::shared_ptr<ClientInfo> m_xClientInfo;
+ ClientBox* m_pClientBox;
+
+ DECL_LINK(DeauthoriseHdl, weld::Button&, void);
+ DECL_LINK(FocusHdl, weld::Widget&, void);
+
+ ClientBoxEntry(ClientBox* pClientBox, const std::shared_ptr<ClientInfo>& pClientInfo);
+ ~ClientBoxEntry();
+};
+
+class ClientBox
+{
+ std::unique_ptr<weld::ScrolledWindow> m_xScroll;
+ std::unique_ptr<weld::Container> m_xContents;
+
+ std::vector< TClientBoxEntry > m_vEntries;
+ ClientBoxEntry* m_pActive;
+
+public:
+ ClientBox(std::unique_ptr<weld::ScrolledWindow> xScroll, std::unique_ptr<weld::Container> xContents);
+ weld::Container* GetContainer() { return m_xContents.get(); }
+ ~ClientBox();
+
+ ClientBoxEntry* GetActiveEntry();
+
+ void addEntry(const std::shared_ptr<ClientInfo>& pClientInfo);
+ void setActive(ClientBoxEntry* pClientData);
+ void clearEntries();
+
+ void populateEntries();
+};
+
+} // end namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/SpellDialogChildWindow.cxx b/sd/source/ui/dlg/SpellDialogChildWindow.cxx
new file mode 100644
index 000000000..c87919346
--- /dev/null
+++ b/sd/source/ui/dlg/SpellDialogChildWindow.cxx
@@ -0,0 +1,172 @@
+/* -*- 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 <SpellDialogChildWindow.hxx>
+#include <svx/svxids.hrc>
+
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <DrawViewShell.hxx>
+#include <OutlineViewShell.hxx>
+#include <Outliner.hxx>
+#include <drawdoc.hxx>
+
+namespace sd {
+
+SFX_IMPL_CHILDWINDOW_WITHID(SpellDialogChildWindow, SID_SPELL_DIALOG)
+
+SpellDialogChildWindow::SpellDialogChildWindow (
+ vcl::Window* _pParent,
+ sal_uInt16 nId,
+ SfxBindings* pBindings,
+ SAL_UNUSED_PARAMETER SfxChildWinInfo* /*pInfo*/)
+ : svx::SpellDialogChildWindow (_pParent, nId, pBindings),
+ mpSdOutliner (nullptr),
+ mbOwnOutliner (false)
+{
+ ProvideOutliner();
+}
+
+SpellDialogChildWindow::~SpellDialogChildWindow()
+{
+ EndSpellingAndClearOutliner();
+}
+
+SfxChildWinInfo SpellDialogChildWindow::GetInfo() const
+{
+ return svx::SpellDialogChildWindow::GetInfo();
+}
+
+void SpellDialogChildWindow::InvalidateSpellDialog()
+{
+ svx::SpellDialogChildWindow::InvalidateSpellDialog();
+}
+
+svx::SpellPortions SpellDialogChildWindow::GetNextWrongSentence( bool /*bRecheck*/ )
+{
+ svx::SpellPortions aResult;
+
+ if (mpSdOutliner != nullptr)
+ {
+ ProvideOutliner();
+ aResult = mpSdOutliner->GetNextSpellSentence();
+ }
+ return aResult;
+}
+
+void SpellDialogChildWindow::ApplyChangedSentence (
+ const svx::SpellPortions& rChanged, bool bRecheck )
+{
+ if (mpSdOutliner != nullptr)
+ {
+ OutlinerView* pOutlinerView = mpSdOutliner->GetView(0);
+ if (pOutlinerView != nullptr)
+ mpSdOutliner->ApplyChangedSentence (
+ pOutlinerView->GetEditView(),
+ rChanged, bRecheck);
+ }
+}
+
+void SpellDialogChildWindow::GetFocus()
+{
+ // In order to detect a cursor movement we could compare the
+ // currently selected text shape with the one that was selected
+ // when LoseFocus() was called the last time.
+ // For the time being we instead rely on the DetectChange() method
+ // in the SdOutliner class.
+}
+
+void SpellDialogChildWindow::LoseFocus()
+{
+}
+
+void SpellDialogChildWindow::EndSpellingAndClearOutliner()
+{
+ if (!mpSdOutliner)
+ return;
+ EndListening(*mpSdOutliner->GetDoc());
+ mpSdOutliner->EndSpelling();
+ if (mbOwnOutliner)
+ delete mpSdOutliner;
+ mpSdOutliner = nullptr;
+ mbOwnOutliner = false;
+}
+
+void SpellDialogChildWindow::Notify(SfxBroadcaster&, const SfxHint& rHint)
+{
+ if (rHint.GetId() != SfxHintId::ThisIsAnSdrHint)
+ return;
+ const SdrHint* pSdrHint = static_cast<const SdrHint*>(&rHint);
+ if (SdrHintKind::ModelCleared == pSdrHint->GetKind())
+ {
+ EndSpellingAndClearOutliner();
+ }
+}
+
+void SpellDialogChildWindow::ProvideOutliner()
+{
+ ViewShellBase* pViewShellBase = dynamic_cast<ViewShellBase*>( SfxViewShell::Current() );
+
+ if (pViewShellBase == nullptr)
+ return;
+
+ ViewShell* pViewShell = pViewShellBase->GetMainViewShell().get();
+ // If there already exists an outliner that has been created
+ // for another view shell then destroy it first.
+ if (mpSdOutliner != nullptr)
+ if(( dynamic_cast< const DrawViewShell *>( pViewShell ) != nullptr && ! mbOwnOutliner)
+ || (dynamic_cast< const OutlineViewShell *>( pViewShell ) != nullptr && mbOwnOutliner))
+ {
+ EndSpellingAndClearOutliner();
+ }
+
+ // Now create/get an outliner if none is present.
+ if (mpSdOutliner != nullptr)
+ return;
+
+ if( dynamic_cast< const DrawViewShell *>( pViewShell ) != nullptr)
+ {
+ // We need an outliner for the spell check so we have
+ // to create one.
+ mbOwnOutliner = true;
+ SdDrawDocument *pDoc = pViewShell->GetDoc();
+ mpSdOutliner = new SdOutliner(pDoc, OutlinerMode::TextObject);
+ StartListening(*pDoc);
+ }
+ else if( dynamic_cast< const OutlineViewShell *>( pViewShell ) != nullptr)
+ {
+ // An outline view is already visible. The SdOutliner
+ // will use it instead of creating its own.
+ mbOwnOutliner = false;
+ SdDrawDocument *pDoc = pViewShell->GetDoc();
+ mpSdOutliner = pDoc->GetOutliner();
+ StartListening(*pDoc);
+ }
+
+ // Initialize spelling.
+ if (mpSdOutliner != nullptr)
+ {
+ mpSdOutliner->PrepareSpelling();
+ mpSdOutliner->StartSpelling();
+ }
+}
+
+} // end of namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/TemplateScanner.cxx b/sd/source/ui/dlg/TemplateScanner.cxx
new file mode 100644
index 000000000..afd23ff85
--- /dev/null
+++ b/sd/source/ui/dlg/TemplateScanner.cxx
@@ -0,0 +1,342 @@
+/* -*- 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 <TemplateScanner.hxx>
+
+#include <comphelper/processfactory.hxx>
+#include <comphelper/documentconstants.hxx>
+
+#include <sfx2/doctempl.hxx>
+#include <com/sun/star/frame/DocumentTemplates.hpp>
+#include <com/sun/star/frame/XDocumentTemplates.hpp>
+#include <com/sun/star/ucb/XContentAccess.hpp>
+#include <com/sun/star/sdbc/XResultSet.hpp>
+#include <com/sun/star/sdbc/XRow.hpp>
+
+#include <set>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace {
+
+constexpr OUStringLiteral TITLE = u"Title";
+
+class FolderDescriptor
+{
+public:
+ FolderDescriptor (
+ int nPriority,
+ const OUString& rsContentIdentifier,
+ const Reference<css::ucb::XCommandEnvironment>& rxFolderEnvironment)
+ : mnPriority(nPriority),
+ msContentIdentifier(rsContentIdentifier),
+ mxFolderEnvironment(rxFolderEnvironment)
+ { }
+ int mnPriority;
+ OUString msContentIdentifier;
+ // Reference<sdbc::XResultSet> mxFolderResultSet;
+ Reference<css::ucb::XCommandEnvironment> mxFolderEnvironment;
+
+ class Comparator
+ {
+ public:
+ bool operator() (const FolderDescriptor& r1, const FolderDescriptor& r2) const
+ { return r1.mnPriority < r2.mnPriority; }
+ };
+};
+
+/** Use a heuristic based on the URL of a top-level template folder to
+ assign a priority that is used to sort the folders.
+*/
+int Classify (std::u16string_view rsURL)
+{
+ int nPriority (0);
+
+ if (rsURL.empty())
+ nPriority = 100;
+ else if (rsURL.find(u"presnt") != std::u16string_view::npos)
+ {
+ nPriority = 30;
+ }
+ else if (rsURL.find(u"layout") != std::u16string_view::npos)
+ {
+ nPriority = 20;
+ }
+ else if (rsURL.find(u"educate") != std::u16string_view::npos)
+ {
+ nPriority = 40;
+ }
+ else if (rsURL.find(u"finance") != std::u16string_view::npos)
+ {
+ nPriority = 40;
+ }
+ else
+ {
+ // All other folders are taken for user supplied and have the
+ // highest priority.
+ nPriority = 10;
+ }
+
+ return nPriority;
+}
+
+} // end of anonymous namespace
+
+namespace sd
+{
+
+class TemplateScanner::FolderDescriptorList
+ : public ::std::multiset<FolderDescriptor,FolderDescriptor::Comparator>
+{
+};
+
+TemplateScanner::TemplateScanner()
+ : meState(INITIALIZE_SCANNING),
+ mpFolderDescriptors(new FolderDescriptorList)
+{
+ // empty;
+}
+
+TemplateScanner::~TemplateScanner()
+{
+}
+
+TemplateScanner::State TemplateScanner::GetTemplateRoot()
+{
+ Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext();
+ Reference<frame::XDocumentTemplates> xTemplates = frame::DocumentTemplates::create(xContext);
+ mxTemplateRoot = xTemplates->getContent();
+
+ return INITIALIZE_FOLDER_SCANNING;
+}
+
+TemplateScanner::State TemplateScanner::InitializeEntryScanning()
+{
+ State eNextState (SCAN_ENTRY);
+
+ if (maFolderContent.isFolder())
+ {
+ mxEntryEnvironment.clear();
+
+ // Create a cursor to iterate over the templates in this folders.
+ // We are interested only in three properties: the entry's name,
+ // its URL, and its content type.
+ mxEntryResultSet.set( maFolderContent.createCursor({ TITLE, "TargetURL", "TypeDescription" }, ::ucbhelper::INCLUDE_DOCUMENTS_ONLY));
+ }
+ else
+ eNextState = ERROR;
+
+ return eNextState;
+}
+
+TemplateScanner::State TemplateScanner::ScanEntry()
+{
+ State eNextState (ERROR);
+
+ Reference<css::ucb::XContentAccess> xContentAccess (mxEntryResultSet, UNO_QUERY);
+ Reference<css::sdbc::XRow> xRow (mxEntryResultSet, UNO_QUERY);
+
+ if (xContentAccess.is() && xRow.is() && mxEntryResultSet.is())
+ {
+ if (mxEntryResultSet->next())
+ {
+ OUString sTitle (xRow->getString (1));
+ OUString sTargetURL (xRow->getString (2));
+ OUString sContentType (xRow->getString (3));
+
+ OUString aId = xContentAccess->queryContentIdentifierString();
+ ::ucbhelper::Content aContent(aId, mxEntryEnvironment, comphelper::getProcessComponentContext());
+ if (aContent.isDocument ())
+ {
+ // Check whether the entry is an impress template. If so
+ // add a new entry to the resulting list (which is created
+ // first if necessary).
+ // These strings are used to find impress templates in the tree of
+ // template files. Should probably be determined dynamically.
+ if ( (sContentType == MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION_TEMPLATE_ASCII)
+ || (sContentType == MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION_ASCII)
+ || (sContentType == "application/vnd.stardivision.impress")
+ || (sContentType == MIMETYPE_VND_SUN_XML_IMPRESS_ASCII)
+ // The following id comes from the bugdoc in #i2764#.
+ || (sContentType == "Impress 2.0"))
+ {
+ OUString sLocalisedTitle = SfxDocumentTemplates::ConvertResourceString(sTitle);
+ mpTemplateEntries.push_back(std::make_unique<TemplateEntry>(sLocalisedTitle, sTargetURL));
+ }
+ }
+
+ // Continue scanning entries.
+ eNextState = SCAN_ENTRY;
+ }
+ else
+ {
+ // Continue with scanning the next folder.
+ eNextState = SCAN_FOLDER;
+ }
+ }
+
+ return eNextState;
+}
+
+TemplateScanner::State TemplateScanner::InitializeFolderScanning()
+{
+ State eNextState (ERROR);
+
+ mxFolderResultSet.clear();
+
+ try
+ {
+ // Create content for template folders.
+ mxFolderEnvironment.clear();
+ ::ucbhelper::Content aTemplateDir (mxTemplateRoot, mxFolderEnvironment, comphelper::getProcessComponentContext());
+
+ // Create a cursor to iterate over the template folders.
+ mxFolderResultSet.set( aTemplateDir.createCursor({ TITLE, "TargetDirURL" }, ::ucbhelper::INCLUDE_FOLDERS_ONLY));
+ if (mxFolderResultSet.is())
+ eNextState = GATHER_FOLDER_LIST;
+ }
+ catch (css::uno::Exception&)
+ {
+ eNextState = ERROR;
+ }
+
+ return eNextState;
+}
+
+TemplateScanner::State TemplateScanner::GatherFolderList()
+{
+ State eNextState (ERROR);
+
+ Reference<css::ucb::XContentAccess> xContentAccess (mxFolderResultSet, UNO_QUERY);
+ if (xContentAccess.is() && mxFolderResultSet.is())
+ {
+ while (mxFolderResultSet->next())
+ {
+ Reference<sdbc::XRow> xRow (mxFolderResultSet, UNO_QUERY);
+ if (xRow.is())
+ {
+ OUString sTargetDir (xRow->getString (2));
+ OUString aId = xContentAccess->queryContentIdentifierString();
+
+ mpFolderDescriptors->insert(
+ FolderDescriptor(
+ Classify(sTargetDir),
+ aId,
+ mxFolderEnvironment));
+ }
+ }
+
+ eNextState = SCAN_FOLDER;
+ }
+
+ return eNextState;
+}
+
+TemplateScanner::State TemplateScanner::ScanFolder()
+{
+ State eNextState (ERROR);
+
+ if (!mpFolderDescriptors->empty())
+ {
+ FolderDescriptor aDescriptor (*mpFolderDescriptors->begin());
+ mpFolderDescriptors->erase(mpFolderDescriptors->begin());
+
+ OUString aId (aDescriptor.msContentIdentifier);
+
+ maFolderContent = ::ucbhelper::Content (aId, aDescriptor.mxFolderEnvironment, comphelper::getProcessComponentContext());
+ if (maFolderContent.isFolder())
+ {
+ // Scan the folder and insert it into the list of template
+ // folders.
+ // Continue with scanning all entries in the folder.
+ mpTemplateEntries.clear();
+ eNextState = INITIALIZE_ENTRY_SCAN;
+ }
+ }
+ else
+ {
+ eNextState = DONE;
+ }
+
+ return eNextState;
+}
+
+void TemplateScanner::RunNextStep()
+{
+ switch (meState)
+ {
+ case INITIALIZE_SCANNING:
+ meState = GetTemplateRoot();
+ break;
+
+ case INITIALIZE_FOLDER_SCANNING:
+ meState = InitializeFolderScanning();
+ break;
+
+ case SCAN_FOLDER:
+ meState = ScanFolder();
+ break;
+
+ case GATHER_FOLDER_LIST:
+ meState = GatherFolderList();
+ break;
+
+ case INITIALIZE_ENTRY_SCAN:
+ meState = InitializeEntryScanning();
+ break;
+
+ case SCAN_ENTRY:
+ meState = ScanEntry();
+ break;
+ default:
+ break;
+ }
+
+ switch (meState)
+ {
+ case DONE:
+ case ERROR:
+ mxTemplateRoot.clear();
+ mxFolderEnvironment.clear();
+ mxEntryEnvironment.clear();
+ mxFolderResultSet.clear();
+ mxEntryResultSet.clear();
+ break;
+ default:
+ break;
+ }
+}
+
+bool TemplateScanner::HasNextStep()
+{
+ switch (meState)
+ {
+ case DONE:
+ case ERROR:
+ return false;
+
+ default:
+ return true;
+ }
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/animobjs.cxx b/sd/source/ui/dlg/animobjs.cxx
new file mode 100644
index 000000000..b70848e23
--- /dev/null
+++ b/sd/source/ui/dlg/animobjs.cxx
@@ -0,0 +1,1134 @@
+/* -*- 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 <time.h>
+#include <svl/eitem.hxx>
+#include <svl/intitem.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdogrp.hxx>
+#include <svx/svdpagv.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/progress.hxx>
+#include <vcl/help.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <vcl/virdev.hxx>
+
+#include <anminfo.hxx>
+#include <animobjs.hxx>
+#include <app.hrc>
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <View.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+
+#include <ViewShell.hxx>
+
+#include <vcl/settings.hxx>
+
+#include <EffectMigration.hxx>
+
+#include <algorithm>
+
+using namespace ::com::sun::star;
+
+namespace sd {
+
+/**
+ * SdDisplay - Control
+ */
+SdDisplay::SdDisplay()
+ : aScale(1, 1)
+{
+}
+
+SdDisplay::~SdDisplay()
+{
+}
+
+void SdDisplay::SetBitmapEx( BitmapEx const * pBmpEx )
+{
+ if( pBmpEx )
+ {
+ aBitmapEx = *pBmpEx;
+ }
+ else
+ {
+ const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
+ const Color aFillColor = rStyles.GetFieldColor();
+ aBitmapEx.Erase(aFillColor);
+ }
+}
+
+void SdDisplay::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle&)
+{
+ rRenderContext.Push(vcl::PushFlags::MAPMODE);
+
+ rRenderContext.SetMapMode(MapMode(MapUnit::MapPixel));
+ const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
+ rRenderContext.SetBackground( Wallpaper( rStyles.GetFieldColor() ) );
+ rRenderContext.Erase();
+
+ Point aPt;
+ Size aSize = GetOutputSizePixel();
+
+ Size aBmpSize = aBitmapEx.GetBitmap().GetSizePixel();
+ aBmpSize.setWidth( static_cast<::tools::Long>( static_cast<double>(aBmpSize.Width()) * static_cast<double>(aScale) ) );
+ aBmpSize.setHeight( static_cast<::tools::Long>( static_cast<double>(aBmpSize.Height()) * static_cast<double>(aScale) ) );
+
+ if( aBmpSize.Width() < aSize.Width() )
+ aPt.setX( ( aSize.Width() - aBmpSize.Width() ) / 2 );
+ if( aBmpSize.Height() < aSize.Height() )
+ aPt.setY( ( aSize.Height() - aBmpSize.Height() ) / 2 );
+
+ aBitmapEx.Draw(&rRenderContext, aPt, aBmpSize);
+
+ rRenderContext.Pop();
+}
+
+void SdDisplay::SetScale( const Fraction& rFrac )
+{
+ aScale = rFrac;
+}
+
+void SdDisplay::SetDrawingArea(weld::DrawingArea* pDrawingArea)
+{
+ CustomWidgetController::SetDrawingArea(pDrawingArea);
+ Size aSize(pDrawingArea->get_ref_device().LogicToPixel(Size(147, 87), MapMode(MapUnit::MapAppFont)));
+ pDrawingArea->set_size_request(aSize.Width(), aSize.Height());
+ SetOutputSizePixel(aSize);
+}
+
+const size_t AnimationWindow::EMPTY_FRAMELIST = std::numeric_limits<size_t>::max();
+
+/**
+ * AnimationWindow - FloatingWindow
+ */
+AnimationWindow::AnimationWindow(SfxBindings* pInBindings, SfxChildWindow *pCW, vcl::Window* pParent)
+ : SfxDockingWindow(pInBindings, pCW, pParent,
+ "DockingAnimation", "modules/simpress/ui/dockinganimation.ui")
+ , m_xCtlDisplay(new SdDisplay)
+ , m_xCtlDisplayWin(new weld::CustomWeld(*m_xBuilder, "preview", *m_xCtlDisplay))
+ , m_xBtnFirst(m_xBuilder->weld_button("first"))
+ , m_xBtnReverse(m_xBuilder->weld_button("prev"))
+ , m_xBtnStop(m_xBuilder->weld_button("stop"))
+ , m_xBtnPlay(m_xBuilder->weld_button("next"))
+ , m_xBtnLast(m_xBuilder->weld_button("last"))
+ , m_xNumFldBitmap(m_xBuilder->weld_spin_button("numbitmap"))
+ , m_xTimeField(m_xBuilder->weld_formatted_spin_button("duration"))
+ , m_xFormatter(new weld::TimeFormatter(*m_xTimeField))
+ , m_xLbLoopCount(m_xBuilder->weld_combo_box("loopcount"))
+ , m_xBtnGetOneObject(m_xBuilder->weld_button("getone"))
+ , m_xBtnGetAllObjects(m_xBuilder->weld_button("getall"))
+ , m_xBtnRemoveBitmap(m_xBuilder->weld_button("delone"))
+ , m_xBtnRemoveAll(m_xBuilder->weld_button("delall"))
+ , m_xFiCount(m_xBuilder->weld_label("count"))
+ , m_xRbtGroup(m_xBuilder->weld_radio_button("group"))
+ , m_xRbtBitmap(m_xBuilder->weld_radio_button("bitmap"))
+ , m_xFtAdjustment(m_xBuilder->weld_label("alignmentft"))
+ , m_xLbAdjustment(m_xBuilder->weld_combo_box("alignment"))
+ , m_xBtnCreateGroup(m_xBuilder->weld_button("create"))
+ , m_xBtnHelp(m_xBuilder->weld_button("help"))
+ , m_nCurrentFrame(EMPTY_FRAMELIST)
+ , bMovie(false)
+ , bAllObjects(false)
+{
+ SetText(SdResId(STR_ANIMATION_DIALOG_TITLE));
+
+ m_xFormatter->SetDuration(true);
+ m_xFormatter->SetTimeFormat(TimeFieldFormat::F_SEC_CS);
+ m_xFormatter->EnableEmptyField(false);
+
+ // create new document with page
+ pMyDoc.reset( new SdDrawDocument(DocumentType::Impress, nullptr) );
+ rtl::Reference<SdPage> pPage = pMyDoc->AllocSdPage(false);
+ pMyDoc->InsertPage(pPage.get());
+
+ pControllerItem.reset( new AnimationControllerItem( SID_ANIMATOR_STATE, this, pInBindings ) );
+
+ m_xBtnFirst->connect_clicked( LINK( this, AnimationWindow, ClickFirstHdl ) );
+ m_xBtnReverse->connect_clicked( LINK( this, AnimationWindow, ClickPlayHdl ) );
+ m_xBtnStop->connect_clicked( LINK( this, AnimationWindow, ClickStopHdl ) );
+ m_xBtnPlay->connect_clicked( LINK( this, AnimationWindow, ClickPlayHdl ) );
+ m_xBtnLast->connect_clicked( LINK( this, AnimationWindow, ClickLastHdl ) );
+
+ m_xBtnGetOneObject->connect_clicked( LINK( this, AnimationWindow, ClickGetObjectHdl ) );
+ m_xBtnGetAllObjects->connect_clicked( LINK( this, AnimationWindow, ClickGetObjectHdl ) );
+ m_xBtnRemoveBitmap->connect_clicked( LINK( this, AnimationWindow, ClickRemoveBitmapHdl ) );
+ m_xBtnRemoveAll->connect_clicked( LINK( this, AnimationWindow, ClickRemoveBitmapHdl ) );
+
+ m_xRbtGroup->connect_toggled( LINK( this, AnimationWindow, ClickRbtHdl ) );
+ m_xRbtBitmap->connect_toggled( LINK( this, AnimationWindow, ClickRbtHdl ) );
+ m_xBtnCreateGroup->connect_clicked( LINK( this, AnimationWindow, ClickCreateGroupHdl ) );
+ m_xBtnHelp->connect_clicked( LINK( this, AnimationWindow, ClickHelpHdl ) );
+ m_xNumFldBitmap->connect_value_changed( LINK( this, AnimationWindow, ModifyBitmapHdl ) );
+ m_xTimeField->connect_value_changed( LINK( this, AnimationWindow, ModifyTimeHdl ) );
+
+ SetMinOutputSizePixel(GetOptimalSize());
+
+ ResetAttrs();
+
+ // the animator is empty; no animation group can be created
+ m_xBtnCreateGroup->set_sensitive(false);
+}
+
+AnimationWindow::~AnimationWindow()
+{
+ disposeOnce();
+}
+
+void AnimationWindow::dispose()
+{
+ pControllerItem.reset();
+
+ m_FrameList.clear();
+ m_nCurrentFrame = EMPTY_FRAMELIST;
+
+ // delete the clones
+ pMyDoc.reset();
+
+ m_xCtlDisplayWin.reset();
+ m_xCtlDisplay.reset();
+ m_xBtnFirst.reset();
+ m_xBtnReverse.reset();
+ m_xBtnStop.reset();
+ m_xBtnPlay.reset();
+ m_xBtnLast.reset();
+ m_xNumFldBitmap.reset();
+ m_xFormatter.reset();
+ m_xTimeField.reset();
+ m_xLbLoopCount.reset();
+ m_xBtnGetOneObject.reset();
+ m_xBtnGetAllObjects.reset();
+ m_xBtnRemoveBitmap.reset();
+ m_xBtnRemoveAll.reset();
+ m_xFiCount.reset();
+ m_xRbtGroup.reset();
+ m_xRbtBitmap.reset();
+ m_xFtAdjustment.reset();
+ m_xLbAdjustment.reset();
+ m_xBtnCreateGroup.reset();
+ m_xBtnHelp.reset();
+ SfxDockingWindow::dispose();
+}
+
+IMPL_LINK_NOARG(AnimationWindow, ClickFirstHdl, weld::Button&, void)
+{
+ m_nCurrentFrame = (m_FrameList.empty()) ? EMPTY_FRAMELIST : 0;
+ UpdateControl();
+}
+
+IMPL_LINK_NOARG(AnimationWindow, ClickStopHdl, weld::Button&, void)
+{
+ bMovie = false;
+}
+
+IMPL_LINK( AnimationWindow, ClickPlayHdl, weld::Button&, rButton, void )
+{
+ ScopeLockGuard aGuard( maPlayLock );
+
+ bMovie = true;
+ bool bDisableCtrls = false;
+ size_t const nCount = m_FrameList.size();
+ bool bReverse = &rButton == m_xBtnReverse.get();
+
+ // it is difficult to find it later on
+ bool bRbtGroupEnabled = m_xRbtGroup->get_sensitive();
+ bool bBtnGetAllObjectsEnabled = m_xBtnGetAllObjects->get_sensitive();
+ bool bBtnGetOneObjectEnabled = m_xBtnGetOneObject->get_sensitive();
+
+ // calculate overall time
+ ::tools::Time aTime( 0 );
+ ::tools::Long nFullTime;
+ if( m_xRbtBitmap->get_active() )
+ {
+ for (size_t i = 0; i < nCount; ++i)
+ {
+ aTime += m_FrameList[i].second;
+ }
+ nFullTime = aTime.GetMSFromTime();
+ }
+ else
+ {
+ nFullTime = nCount * 100;
+ aTime.MakeTimeFromMS( nFullTime );
+ }
+
+ // StatusBarManager from 1 second
+ std::unique_ptr<SfxProgress> pProgress;
+ if( nFullTime >= 1000 )
+ {
+ bDisableCtrls = true;
+ m_xBtnStop->set_sensitive(true);
+ pProgress.reset(new SfxProgress( nullptr, "Animator:", nFullTime )); // "Animator:" here we should think about something smart
+ }
+
+ sal_uLong nTmpTime = 0;
+ size_t i = 0;
+ bool bCount = i < nCount;
+ if( bReverse )
+ {
+ i = nCount - 1;
+ }
+ while( bCount && bMovie )
+ {
+ // make list and view consistent
+ assert(i < m_FrameList.size());
+ m_nCurrentFrame = i;
+
+ UpdateControl(bDisableCtrls);
+
+ if( m_xRbtBitmap->get_active() )
+ {
+ ::tools::Time const & rTime = m_FrameList[i].second;
+
+ m_xFormatter->SetTime( rTime );
+ sal_uLong nTime = rTime.GetMSFromTime();
+
+ WaitInEffect( nTime, nTmpTime, pProgress.get() );
+ nTmpTime += nTime;
+ }
+ else
+ {
+ WaitInEffect( 100, nTmpTime, pProgress.get() );
+ nTmpTime += 100;
+ }
+ if( bReverse )
+ {
+ if (i == 0)
+ {
+ // Terminate loop.
+ bCount = false;
+ }
+ else
+ {
+ --i;
+ }
+ }
+ else
+ {
+ i++;
+ if (i >= nCount)
+ {
+ // Terminate loop.
+ bCount = false;
+ // Move i back into valid range.
+ i = nCount - 1;
+ }
+ }
+ }
+
+ // to re-enable the controls
+ bMovie = false;
+ if (nCount > 0)
+ {
+ assert(i == m_nCurrentFrame);
+ UpdateControl();
+ }
+
+ if( pProgress )
+ {
+ pProgress.reset();
+ m_xBtnStop->set_sensitive(false);
+ }
+
+ m_xRbtGroup->set_sensitive( bRbtGroupEnabled );
+ m_xBtnGetAllObjects->set_sensitive( bBtnGetAllObjectsEnabled );
+ m_xBtnGetOneObject->set_sensitive( bBtnGetOneObjectEnabled );
+}
+
+IMPL_LINK_NOARG(AnimationWindow, ClickLastHdl, weld::Button&, void)
+{
+ m_nCurrentFrame =
+ (m_FrameList.empty()) ? EMPTY_FRAMELIST : m_FrameList.size() - 1 ;
+ UpdateControl();
+}
+
+IMPL_LINK_NOARG(AnimationWindow, ClickRbtHdl, weld::Toggleable&, void)
+{
+ if (m_FrameList.empty() || m_xRbtGroup->get_active())
+ {
+ m_xTimeField->set_text( OUString() );
+ m_xTimeField->set_sensitive( false );
+ m_xLbLoopCount->set_sensitive( false );
+ }
+ else if (m_xRbtBitmap->get_active())
+ {
+ sal_uLong n = m_xNumFldBitmap->get_value();
+ if( n > 0 )
+ {
+ ::tools::Time const & rTime = m_FrameList[n - 1].second;
+ m_xFormatter->SetTime( rTime );
+ m_xFormatter->ReFormat();
+ }
+ m_xTimeField->set_sensitive(true);
+ m_xLbLoopCount->set_sensitive(true);
+ }
+}
+
+IMPL_LINK(AnimationWindow, ClickHelpHdl, weld::Button&, rButton, void)
+{
+ if (Help* pHelp = Application::GetHelp())
+ pHelp->Start(OUString::fromUtf8(m_xContainer->get_help_id()), &rButton);
+}
+
+IMPL_LINK( AnimationWindow, ClickGetObjectHdl, weld::Button&, rBtn, void )
+{
+ bAllObjects = &rBtn == m_xBtnGetAllObjects.get();
+
+ // Code now in AddObj()
+ SfxBoolItem aItem( SID_ANIMATOR_ADD, true );
+
+ GetBindings().GetDispatcher()->ExecuteList(
+ SID_ANIMATOR_ADD, SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem });
+}
+
+IMPL_LINK( AnimationWindow, ClickRemoveBitmapHdl, weld::Button&, rBtn, void )
+{
+ SdPage* pPage = pMyDoc->GetSdPage(0, PageKind::Standard);
+ SdrObject* pObject;
+
+ // tdf#95298 check m_nCurrentFrame for EMPTY_FRAMELIST to avoid out-of-bound array access
+ if (&rBtn == m_xBtnRemoveBitmap.get() && EMPTY_FRAMELIST != m_nCurrentFrame)
+ {
+ m_FrameList.erase(m_FrameList.begin() + m_nCurrentFrame);
+
+ pObject = pPage->GetObj(m_nCurrentFrame);
+ // Through acquisition of the AnimatedGIFs, objects does not need to
+ // exist.
+ if( pObject )
+ {
+ pObject = pPage->RemoveObject(m_nCurrentFrame);
+ DBG_ASSERT(pObject, "Clone not found during deletion");
+ SdrObject::Free( pObject );
+ pPage->RecalcObjOrdNums();
+ }
+
+ if (m_nCurrentFrame >= m_FrameList.size())
+ {
+ // tdf#95298 last frame was deleted, try to use the one before it or go on empty state
+ m_nCurrentFrame = m_FrameList.empty() ? EMPTY_FRAMELIST : m_FrameList.size() - 1;
+ }
+ }
+ else // delete everything
+ {
+ std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Warning, VclButtonsType::YesNo,
+ SdResId(STR_ASK_DELETE_ALL_PICTURES)));
+ short nReturn = xWarn->run();
+
+ if( nReturn == RET_YES )
+ {
+ // clear frame list
+ for (size_t i = m_FrameList.size(); i > 0; )
+ {
+ --i;
+ pObject = pPage->GetObj( i );
+ if( pObject )
+ {
+ pObject = pPage->RemoveObject( i );
+ DBG_ASSERT(pObject, "Clone not found during deletion");
+ SdrObject::Free( pObject );
+ //pPage->RecalcObjOrdNums();
+ }
+ }
+ m_FrameList.clear();
+ m_nCurrentFrame = EMPTY_FRAMELIST;
+ }
+ }
+
+ // can we create an animation group
+ if (m_FrameList.empty())
+ {
+ m_xBtnCreateGroup->set_sensitive(false);
+ // if previous disabled by acquisition of AnimatedGIFs:
+ //m_xRbtBitmap->set_sensitive(true);
+ m_xRbtGroup->set_sensitive(true);
+ }
+
+ // calculate and set zoom for DisplayWin
+ Fraction aFrac(GetScale());
+ m_xCtlDisplay->SetScale(aFrac);
+
+ UpdateControl();
+}
+
+IMPL_LINK_NOARG(AnimationWindow, ClickCreateGroupHdl, weld::Button&, void)
+{
+ // Code now in CreatePresObj()
+ SfxBoolItem aItem( SID_ANIMATOR_CREATE, true );
+
+ GetBindings().GetDispatcher()->ExecuteList(SID_ANIMATOR_CREATE,
+ SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem });
+}
+
+IMPL_LINK_NOARG(AnimationWindow, ModifyBitmapHdl, weld::SpinButton&, void)
+{
+ sal_uLong nBmp = m_xNumFldBitmap->get_value();
+
+ if (nBmp > m_FrameList.size())
+ {
+ nBmp = m_FrameList.size();
+ }
+
+ m_nCurrentFrame = nBmp - 1;
+
+ UpdateControl();
+}
+
+IMPL_LINK_NOARG(AnimationWindow, ModifyTimeHdl, weld::FormattedSpinButton&, void)
+{
+ sal_uLong nPos = m_xNumFldBitmap->get_value() - 1;
+
+ ::tools::Time & rTime = m_FrameList[nPos].second;
+
+ rTime = m_xFormatter->GetTime();
+}
+
+void AnimationWindow::UpdateControl(bool const bDisableCtrls)
+{
+ // tdf#95298 check m_nCurrentFrame for EMPTY_FRAMELIST to avoid out-of-bound array access
+ if (!m_FrameList.empty() && EMPTY_FRAMELIST != m_nCurrentFrame)
+ {
+ BitmapEx & rBmp(m_FrameList[m_nCurrentFrame].first);
+
+ SdPage* pPage = pMyDoc->GetSdPage(0, PageKind::Standard);
+ SdrObject *const pObject = pPage->GetObj(m_nCurrentFrame);
+ if( pObject )
+ {
+ ScopedVclPtrInstance< VirtualDevice > pVD;
+ ::tools::Rectangle aObjRect( pObject->GetCurrentBoundRect() );
+ Size aObjSize( aObjRect.GetSize() );
+ Point aOrigin( Point( -aObjRect.Left(), -aObjRect.Top() ) );
+ MapMode aMap( pVD->GetMapMode() );
+ aMap.SetMapUnit( MapUnit::Map100thMM );
+ aMap.SetOrigin( aOrigin );
+ pVD->SetMapMode( aMap );
+ pVD->SetOutputSize( aObjSize );
+ const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
+ pVD->SetBackground( Wallpaper( rStyles.GetFieldColor() ) );
+ pVD->SetDrawMode( rStyles.GetHighContrastMode()
+ ? sd::OUTPUT_DRAWMODE_CONTRAST
+ : sd::OUTPUT_DRAWMODE_COLOR );
+ pVD->Erase();
+ pObject->SingleObjectPainter( *pVD );
+ rBmp = pVD->GetBitmapEx( aObjRect.TopLeft(), aObjSize );
+ }
+
+ m_xCtlDisplay->SetBitmapEx(&rBmp);
+ }
+ else
+ {
+ m_xCtlDisplay->SetBitmapEx(nullptr);
+ }
+
+ m_xCtlDisplay->Invalidate();
+
+ m_xFiCount->set_label(OUString::number(
+ m_FrameList.size()));
+
+ if (!m_FrameList.empty() && !bMovie)
+ {
+ size_t nIndex = m_nCurrentFrame + 1;
+ m_xNumFldBitmap->set_value(nIndex);
+
+ // if there is at least 1 object in the list
+ m_xBtnFirst->set_sensitive(true);
+ m_xBtnReverse->set_sensitive(true);
+ m_xBtnPlay->set_sensitive(true);
+ m_xBtnLast->set_sensitive(true);
+ m_xNumFldBitmap->set_sensitive(true);
+ m_xTimeField->set_sensitive(true);
+ m_xLbLoopCount->set_sensitive(true);
+ m_xBtnRemoveBitmap->set_sensitive(true);
+ m_xBtnRemoveAll->set_sensitive(true);
+ }
+ else
+ {
+ // if no object is in the list
+ m_xBtnFirst->set_sensitive( false );
+ m_xBtnReverse->set_sensitive( false );
+ m_xBtnPlay->set_sensitive( false );
+ m_xBtnLast->set_sensitive( false );
+ m_xNumFldBitmap->set_sensitive( false );
+ m_xTimeField->set_sensitive( false );
+ m_xLbLoopCount->set_sensitive( false );
+ m_xBtnRemoveBitmap->set_sensitive( false );
+ m_xBtnRemoveAll->set_sensitive( false );
+ }
+
+ if( bMovie && bDisableCtrls )
+ {
+ m_xBtnGetOneObject->set_sensitive( false );
+ m_xBtnGetAllObjects->set_sensitive( false );
+ m_xRbtGroup->set_sensitive( false );
+ m_xRbtBitmap->set_sensitive( false );
+ m_xBtnCreateGroup->set_sensitive( false );
+ m_xFtAdjustment->set_sensitive( false );
+ m_xLbAdjustment->set_sensitive( false );
+ }
+ else
+ {
+ // enable 'group object' only if it is not an Animated GIF
+ if (m_FrameList.empty())
+ {
+ m_xRbtGroup->set_sensitive(true);
+ }
+
+ m_xRbtBitmap->set_sensitive(true);
+ m_xBtnCreateGroup->set_sensitive(!m_FrameList.empty());
+ m_xFtAdjustment->set_sensitive(true);
+ m_xLbAdjustment->set_sensitive(true);
+ }
+
+ ClickRbtHdl(*m_xRbtGroup);
+}
+
+void AnimationWindow::ResetAttrs()
+{
+ m_xRbtGroup->set_active(true);
+ m_xLbAdjustment->set_active( BA_CENTER );
+ // LoopCount
+ m_xLbLoopCount->set_active( m_xLbLoopCount->get_count() - 1);
+
+ UpdateControl();
+}
+
+void AnimationWindow::WaitInEffect( sal_uLong nMilliSeconds, sal_uLong nTime,
+ SfxProgress* pProgress ) const
+{
+ sal_uInt64 aEnd = ::tools::Time::GetSystemTicks() + nMilliSeconds;
+ sal_uInt64 aCurrent = ::tools::Time::GetSystemTicks();
+ while (aCurrent < aEnd)
+ {
+ aCurrent = ::tools::Time::GetSystemTicks();
+
+ if( pProgress )
+ pProgress->SetState( nTime + nMilliSeconds + aCurrent - aEnd );
+
+ Application::Reschedule();
+
+ if( !bMovie )
+ return;
+ }
+}
+
+Fraction AnimationWindow::GetScale()
+{
+ Fraction aFrac;
+ size_t const nCount = m_FrameList.size();
+ if (nCount > 0)
+ {
+ Size aBmpSize(0, 0);
+ for (size_t i = 0; i < nCount; i++)
+ {
+ BitmapEx const & rBitmap = m_FrameList[i].first;
+ Size aTempSize( rBitmap.GetBitmap().GetSizePixel() );
+ aBmpSize.setWidth( std::max( aBmpSize.Width(), aTempSize.Width() ) );
+ aBmpSize.setHeight( std::max( aBmpSize.Height(), aTempSize.Height() ) );
+ }
+
+ aBmpSize.AdjustWidth(10 );
+ aBmpSize.AdjustHeight(10 );
+
+ Size aDisplaySize(m_xCtlDisplay->GetOutputSizePixel());
+
+ aFrac = Fraction( std::min( static_cast<double>(aDisplaySize.Width()) / static_cast<double>(aBmpSize.Width()),
+ static_cast<double>(aDisplaySize.Height()) / static_cast<double>(aBmpSize.Height()) ) );
+ }
+ return aFrac;
+}
+
+void AnimationWindow::Resize()
+{
+ SfxDockingWindow::Resize();
+ Fraction aFrac(GetScale());
+ m_xCtlDisplay->SetScale(aFrac);
+}
+
+bool AnimationWindow::Close()
+{
+ if( maPlayLock.isLocked() )
+ {
+ return false;
+ }
+ else
+ {
+ SfxBoolItem aItem( SID_ANIMATION_OBJECTS, false );
+
+ GetBindings().GetDispatcher()->ExecuteList(
+ SID_ANIMATION_OBJECTS, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aItem });
+
+ SfxDockingWindow::Close();
+
+ return true;
+ }
+}
+
+void AnimationWindow::AddObj (::sd::View& rView )
+{
+ // finish text entry mode to ensure that bitmap is identical with object
+ if( rView.IsTextEdit() )
+ rView.SdrEndTextEdit();
+
+ // clone object(s) and insert the clone(s) into the list
+ const SdrMarkList& rMarkList = rView.GetMarkedObjectList();
+ const size_t nMarkCount = rMarkList.GetMarkCount();
+ SdPage* pPage = pMyDoc->GetSdPage(0, PageKind::Standard);
+ const size_t nCloneCount = pPage->GetObjCount();
+
+ if (nMarkCount <= 0)
+ return;
+
+ // If it is ONE animation object or one group object, which was
+ // 'individually taken', we insert the objects separately
+ bool bAnimObj = false;
+ if( nMarkCount == 1 )
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObject = pMark->GetMarkedSdrObj();
+ SdAnimationInfo* pAnimInfo = SdDrawDocument::GetAnimationInfo( pObject );
+ SdrInventor nInv = pObject->GetObjInventor();
+ SdrObjKind nId = pObject->GetObjIdentifier();
+
+ // Animated Bitmap (GIF)
+ if( nInv == SdrInventor::Default && nId == SdrObjKind::Graphic && static_cast<SdrGrafObj*>( pObject )->IsAnimated() )
+ {
+ const SdrGrafObj* pGrafObj = static_cast<SdrGrafObj*>(pObject);
+ Graphic aGraphic( pGrafObj->GetTransformedGraphic() );
+ sal_uInt16 nCount = 0;
+
+ if( aGraphic.IsAnimated() )
+ nCount = aGraphic.GetAnimation().Count();
+
+ if( nCount > 0 )
+ {
+ const Animation aAnimation( aGraphic.GetAnimation() );
+
+ for( sal_uInt16 i = 0; i < nCount; i++ )
+ {
+ const AnimationBitmap& rAnimationBitmap = aAnimation.Get( i );
+
+ // LoopCount
+ if( i == 0 )
+ {
+ sal_uInt32 nLoopCount = aAnimation.GetLoopCount();
+
+ if( !nLoopCount ) // endless
+ m_xLbLoopCount->set_active( m_xLbLoopCount->get_count() - 1);
+ else
+ m_xLbLoopCount->set_active_text(OUString::number( nLoopCount ) );
+ }
+
+ ::tools::Long nTime = rAnimationBitmap.mnWait;
+ ::tools::Time aTime( 0, 0, nTime / 100, nTime % 100 );
+ size_t nIndex = m_nCurrentFrame + 1;
+ m_FrameList.insert(
+ m_FrameList.begin() + nIndex,
+ ::std::make_pair(rAnimationBitmap.maBitmapEx, aTime));
+
+ // increment => next one inserted after this one
+ ++m_nCurrentFrame;
+ }
+ // if an animated GIF is taken, only such one can be created
+ m_xRbtBitmap->set_active(true);
+ m_xRbtGroup->set_sensitive( false );
+ bAnimObj = true;
+ }
+ }
+ else if( bAllObjects || ( pAnimInfo && pAnimInfo->mbIsMovie ) )
+ {
+ // several objects
+ SdrObjList* pObjList = static_cast<SdrObjGroup*>(pObject)->GetSubList();
+
+ for( size_t nObject = 0; nObject < pObjList->GetObjCount(); ++nObject )
+ {
+ SdrObject* pSnapShot(pObjList->GetObj(nObject));
+ BitmapEx aBitmapEx(SdrExchangeView::GetObjGraphic(*pSnapShot).GetBitmapEx());
+ size_t nIndex = m_nCurrentFrame + 1;
+ m_FrameList.insert(
+ m_FrameList.begin() + nIndex,
+ ::std::make_pair(aBitmapEx, m_xFormatter->GetTime()));
+
+ // increment => next one inserted after this one
+ ++m_nCurrentFrame;
+
+ // Clone
+ pPage->InsertObject(
+ pSnapShot->CloneSdrObject(pPage->getSdrModelFromSdrPage()),
+ m_nCurrentFrame);
+ }
+ bAnimObj = true;
+ }
+ }
+ // also one single animated object
+ if( !bAnimObj && !( bAllObjects && nMarkCount > 1 ) )
+ {
+ BitmapEx aBitmapEx(rView.GetAllMarkedGraphic().GetBitmapEx());
+
+ ::tools::Time aTime( m_xFormatter->GetTime() );
+
+ size_t nIndex = m_nCurrentFrame + 1;
+ m_FrameList.insert(
+ m_FrameList.begin() + nIndex,
+ ::std::make_pair(aBitmapEx, aTime));
+ }
+
+ // one single object
+ if( nMarkCount == 1 && !bAnimObj )
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObject = pMark->GetMarkedSdrObj();
+ SdrObject* pClone(pObject->CloneSdrObject(pPage->getSdrModelFromSdrPage()));
+ size_t nIndex = m_nCurrentFrame + 1;
+ pPage->InsertObject(pClone, nIndex);
+ }
+ // several objects: group the clones
+ else if (nMarkCount > 1)
+ {
+ // take objects separately
+ if( bAllObjects )
+ {
+ for( size_t nObject= 0; nObject < nMarkCount; ++nObject )
+ {
+ // Clone
+ SdrObject* pObject(rMarkList.GetMark(nObject)->GetMarkedSdrObj());
+ BitmapEx aBitmapEx(SdrExchangeView::GetObjGraphic(*pObject).GetBitmapEx());
+ size_t nIndex = m_nCurrentFrame + 1;
+ m_FrameList.insert(
+ m_FrameList.begin() + nIndex,
+ ::std::make_pair(aBitmapEx, m_xFormatter->GetTime()));
+
+ // increment => next one inserted after this one
+ ++m_nCurrentFrame;
+
+ pPage->InsertObject(
+ pObject->CloneSdrObject(pPage->getSdrModelFromSdrPage()),
+ m_nCurrentFrame);
+ }
+ bAnimObj = true; // that we don't change again
+ }
+ else
+ {
+ SdrObjGroup* pCloneGroup = new SdrObjGroup(rView.getSdrModelFromSdrView());
+ SdrObjList* pObjList = pCloneGroup->GetSubList();
+
+ for (size_t nObject= 0; nObject < nMarkCount; ++nObject)
+ {
+ pObjList->InsertObject(
+ rMarkList.GetMark(nObject)->GetMarkedSdrObj()->CloneSdrObject(
+ pPage->getSdrModelFromSdrPage()));
+ }
+
+ size_t nIndex = m_nCurrentFrame + 1;
+ pPage->InsertObject(pCloneGroup, nIndex);
+ }
+ }
+
+ if( !bAnimObj )
+ {
+ ++m_nCurrentFrame;
+ }
+
+ // if there was nothing in the animator before but now is something
+ // there, we can create an animation group
+ if (nCloneCount == 0 && !m_FrameList.empty())
+ {
+ m_xBtnCreateGroup->set_sensitive(true);
+ }
+
+ // calculate and set zoom for DisplayWin
+ Fraction aFrac( GetScale() );
+ m_xCtlDisplay->SetScale(aFrac);
+
+ UpdateControl();
+}
+
+void AnimationWindow::CreateAnimObj (::sd::View& rView )
+{
+ vcl::Window* pOutWin = rView.GetFirstOutputDevice()->GetOwnerWindow(); // GetWin( 0 );
+ DBG_ASSERT( pOutWin, "Window does not exist!" );
+
+ // find window center
+ const MapMode aMap100( MapUnit::Map100thMM );
+ Size aMaxSizeLog;
+ Size aMaxSizePix;
+ Size aTemp( pOutWin->GetOutputSizePixel() );
+ const Point aWindowCenter( pOutWin->PixelToLogic( Point( aTemp.Width() >> 1, aTemp.Height() >> 1 ) ) );
+ const OutputDevice* pDefDev = Application::GetDefaultDevice();
+ const size_t nCount = m_FrameList.size();
+ BitmapAdjustment eBA = static_cast<BitmapAdjustment>(m_xLbAdjustment->get_active());
+
+ // find biggest bitmap
+ for (size_t i = 0; i < nCount; ++i)
+ {
+ const BitmapEx& rBmpEx = m_FrameList[i].first;
+ const Graphic aGraphic( rBmpEx );
+ Size aTmpSizeLog;
+ const Size aTmpSizePix( rBmpEx.GetSizePixel() );
+
+ if ( aGraphic.GetPrefMapMode().GetMapUnit() == MapUnit::MapPixel )
+ aTmpSizeLog = pDefDev->PixelToLogic( aGraphic.GetPrefSize(), aMap100 );
+ else
+ aTmpSizeLog = OutputDevice::LogicToLogic( aGraphic.GetPrefSize(), aGraphic.GetPrefMapMode(), aMap100 );
+
+ aMaxSizeLog.setWidth( std::max( aMaxSizeLog.Width(), aTmpSizeLog.Width() ) );
+ aMaxSizeLog.setHeight( std::max( aMaxSizeLog.Height(), aTmpSizeLog.Height() ) );
+
+ aMaxSizePix.setWidth( std::max( aMaxSizePix.Width(), aTmpSizePix.Width() ) );
+ aMaxSizePix.setHeight( std::max( aMaxSizePix.Height(), aTmpSizePix.Height() ) );
+ }
+
+ SdrPageView* pPV = rView.GetSdrPageView();
+
+ if( m_xRbtBitmap->get_active() )
+ {
+ // create bitmap group (Animated GIF)
+ Animation aAnimation;
+ Point aPt;
+
+ for (size_t i = 0; i < nCount; ++i)
+ {
+ ::tools::Time const & rTime = m_FrameList[i].second;
+ ::tools::Long nTime = rTime.GetNanoSec();
+ nTime += rTime.GetSec() * 100;
+
+ BitmapEx const & rBitmapEx = m_FrameList[i].first;
+
+ // calculate offset for the specified direction
+ const Size aBitmapSize( rBitmapEx.GetSizePixel() );
+
+ switch( eBA )
+ {
+ case BA_LEFT_UP:
+ break;
+
+ case BA_LEFT:
+ aPt.setY( (aMaxSizePix.Height() - aBitmapSize.Height()) >> 1 );
+ break;
+
+ case BA_LEFT_DOWN:
+ aPt.setY( aMaxSizePix.Height() - aBitmapSize.Height() );
+ break;
+
+ case BA_UP:
+ aPt.setX( (aMaxSizePix.Width() - aBitmapSize.Width()) >> 1 );
+ break;
+
+ case BA_CENTER:
+ aPt.setX( (aMaxSizePix.Width() - aBitmapSize.Width()) >> 1 );
+ aPt.setY( (aMaxSizePix.Height() - aBitmapSize.Height()) >> 1 );
+ break;
+
+ case BA_DOWN:
+ aPt.setX( (aMaxSizePix.Width() - aBitmapSize.Width()) >> 1 );
+ aPt.setY( aMaxSizePix.Height() - aBitmapSize.Height() );
+ break;
+
+ case BA_RIGHT_UP:
+ aPt.setX( aMaxSizePix.Width() - aBitmapSize.Width() );
+ break;
+
+ case BA_RIGHT:
+ aPt.setX( aMaxSizePix.Width() - aBitmapSize.Width() );
+ aPt.setY( (aMaxSizePix.Height() - aBitmapSize.Height()) >> 1 );
+ break;
+
+ case BA_RIGHT_DOWN:
+ aPt.setX( aMaxSizePix.Width() - aBitmapSize.Width() );
+ aPt.setY( aMaxSizePix.Height() - aBitmapSize.Height() );
+ break;
+
+ }
+
+ // find LoopCount (number of passes)
+ AnimationBitmap aAnimationBitmap;
+ sal_uInt32 nLoopCount = 0;
+ sal_Int32 nPos = m_xLbLoopCount->get_active();
+
+ if( nPos != -1 && nPos != m_xLbLoopCount->get_count() - 1 ) // endless
+ nLoopCount = m_xLbLoopCount->get_active_text().toUInt32();
+
+ aAnimationBitmap.maBitmapEx = rBitmapEx;
+ aAnimationBitmap.maPositionPixel = aPt;
+ aAnimationBitmap.maSizePixel = aBitmapSize;
+ aAnimationBitmap.mnWait = nTime;
+ aAnimationBitmap.meDisposal = Disposal::Back;
+ aAnimationBitmap.mbUserInput = false;
+
+ aAnimation.Insert( aAnimationBitmap );
+ aAnimation.SetDisplaySizePixel( aMaxSizePix );
+ aAnimation.SetLoopCount( nLoopCount );
+ }
+
+ SdrGrafObj* pGrafObj = new SdrGrafObj(
+ rView.getSdrModelFromSdrView(),
+ Graphic(aAnimation));
+ const Point aOrg( aWindowCenter.X() - ( aMaxSizeLog.Width() >> 1 ), aWindowCenter.Y() - ( aMaxSizeLog.Height() >> 1 ) );
+
+ pGrafObj->SetLogicRect( ::tools::Rectangle( aOrg, aMaxSizeLog ) );
+ rView.InsertObjectAtView( pGrafObj, *pPV, SdrInsertFlags::SETDEFLAYER);
+ }
+ else
+ {
+ // calculate offset for the specified direction
+ Size aOffset;
+ SdrObject * pClone = nullptr;
+ SdPage* pPage = pMyDoc->GetSdPage(0, PageKind::Standard);
+
+ for (size_t i = 0; i < nCount; ++i)
+ {
+ pClone = pPage->GetObj(i);
+ ::tools::Rectangle aRect( pClone->GetSnapRect() );
+
+ switch( eBA )
+ {
+ case BA_LEFT_UP:
+ break;
+
+ case BA_LEFT:
+ aOffset.setHeight( (aMaxSizeLog.Height() - aRect.GetHeight()) / 2 );
+ break;
+
+ case BA_LEFT_DOWN:
+ aOffset.setHeight( aMaxSizeLog.Height() - aRect.GetHeight() );
+ break;
+
+ case BA_UP:
+ aOffset.setWidth( (aMaxSizeLog.Width() - aRect.GetWidth()) / 2 );
+ break;
+
+ case BA_CENTER:
+ aOffset.setWidth( (aMaxSizeLog.Width() - aRect.GetWidth()) / 2 );
+ aOffset.setHeight( (aMaxSizeLog.Height() - aRect.GetHeight()) / 2 );
+ break;
+
+ case BA_DOWN:
+ aOffset.setWidth( (aMaxSizeLog.Width() - aRect.GetWidth()) / 2 );
+ aOffset.setHeight( aMaxSizeLog.Height() - aRect.GetHeight() );
+ break;
+
+ case BA_RIGHT_UP:
+ aOffset.setWidth( aMaxSizeLog.Width() - aRect.GetWidth() );
+ break;
+
+ case BA_RIGHT:
+ aOffset.setWidth( aMaxSizeLog.Width() - aRect.GetWidth() );
+ aOffset.setHeight( (aMaxSizeLog.Height() - aRect.GetHeight()) / 2 );
+ break;
+
+ case BA_RIGHT_DOWN:
+ aOffset.setWidth( aMaxSizeLog.Width() - aRect.GetWidth() );
+ aOffset.setHeight( aMaxSizeLog.Height() - aRect.GetHeight() );
+ break;
+
+ }
+ // Unfortunately, SetSnapRect is not implemented for ellipses !!!
+ Point aMovePt( aWindowCenter + Point( aOffset.Width(), aOffset.Height() ) - aRect.TopLeft() );
+ Size aMoveSize( aMovePt.X(), aMovePt.Y() );
+ pClone->NbcMove( aMoveSize );
+ }
+
+ // #i42894# Caution(!) variable pPage looks right, but it is a page from the local
+ // document the dialog is using (!), so get the target page from the target view
+ SdPage* pTargetSdPage = dynamic_cast< SdPage* >(rView.GetSdrPageView() ? rView.GetSdrPageView()->GetPage() : nullptr);
+
+ if(pTargetSdPage)
+ {
+ // create animation group
+ SdrObjGroup* pGroup = new SdrObjGroup(rView.getSdrModelFromSdrView());
+ SdrObjList* pObjList = pGroup->GetSubList();
+
+ for (size_t i = 0; i < nCount; ++i)
+ {
+ // the clone remains in the animation; we insert a clone of the
+ // clone into the group
+ pClone = pPage->GetObj(i);
+ SdrObject* pCloneOfClone(pClone->CloneSdrObject(pTargetSdPage->getSdrModelFromSdrPage()));
+ //SdrObject* pCloneOfClone = pPage->GetObj(i)->Clone();
+ pObjList->InsertObject(pCloneOfClone);
+ }
+
+ // until now the top left corner of the group is in the window center;
+ // correct the position by half of the size of the group
+ aTemp = aMaxSizeLog;
+ aTemp.setHeight( - aTemp.Height() / 2 );
+ aTemp.setWidth( - aTemp.Width() / 2 );
+ pGroup->NbcMove(aTemp);
+
+ // #i42894# create needed SMIL stuff and move child objects to page directly (see
+ // comments at EffectMigration::CreateAnimatedGroup why this has to be done).
+ EffectMigration::CreateAnimatedGroup(*pGroup, *pTargetSdPage);
+
+ // #i42894# if that worked, delete the group again
+ if(!pGroup->GetSubList()->GetObjCount())
+ {
+ // always use SdrObject::Free(...) for SdrObjects (!)
+ SdrObject* pTemp(pGroup);
+ SdrObject::Free(pTemp);
+ }
+ }
+ }
+
+ ClickFirstHdl(*m_xBtnFirst);
+}
+
+void AnimationWindow::DataChanged( const DataChangedEvent& rDCEvt )
+{
+ SfxDockingWindow::DataChanged( rDCEvt );
+
+ if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) && (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
+ {
+ UpdateControl();
+ }
+}
+
+/**
+ * ControllerItem for Animator
+ */
+AnimationControllerItem::AnimationControllerItem(
+ sal_uInt16 _nId,
+ AnimationWindow* pAnimWin,
+ SfxBindings* _pBindings)
+ : SfxControllerItem( _nId, *_pBindings ),
+ pAnimationWin( pAnimWin )
+{
+}
+
+void AnimationControllerItem::StateChangedAtToolBoxControl( sal_uInt16 nSId,
+ SfxItemState eState, const SfxPoolItem* pItem )
+{
+ if( eState >= SfxItemState::DEFAULT && nSId == SID_ANIMATOR_STATE )
+ {
+ const SfxUInt16Item* pStateItem = dynamic_cast< const SfxUInt16Item*>( pItem );
+ assert(pStateItem); //SfxUInt16Item expected
+ if (pStateItem)
+ {
+ sal_uInt16 nState = pStateItem->GetValue();
+ pAnimationWin->m_xBtnGetOneObject->set_sensitive( nState & 1 );
+ pAnimationWin->m_xBtnGetAllObjects->set_sensitive( nState & 2 );
+ }
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/assclass.cxx b/sd/source/ui/dlg/assclass.cxx
new file mode 100644
index 000000000..4d48a327f
--- /dev/null
+++ b/sd/source/ui/dlg/assclass.cxx
@@ -0,0 +1,160 @@
+/* -*- 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 <tools/debug.hxx>
+#include <vcl/weld.hxx>
+
+#include <assclass.hxx>
+
+Assistent::Assistent(int nNoOfPages)
+ : mnPages(nNoOfPages), mnCurrentPage(1)
+{
+ if(mnPages > MAX_PAGES)
+ mnPages = MAX_PAGES;
+
+ mpPageStatus.reset(new bool[mnPages]);
+
+ for(int i=0; i < mnPages; ++i)
+ mpPageStatus[i] = true;
+}
+
+bool Assistent::InsertControl(int nDestPage, weld::Widget* pUsedControl)
+{
+ DBG_ASSERT( (nDestPage > 0) && (nDestPage <= mnPages), "Page not available!");
+
+ if((nDestPage>0)&&(nDestPage<=mnPages))
+ {
+ maPages[nDestPage-1].emplace_back(pUsedControl);
+ pUsedControl->hide();
+ pUsedControl->set_sensitive(false);
+ return true;
+ }
+
+ return false;
+}
+
+void Assistent::NextPage()
+{
+ if(mnCurrentPage<mnPages)
+ {
+ int nPage = mnCurrentPage+1;
+ while(nPage <= mnPages && !mpPageStatus[nPage-1])
+ nPage++;
+
+ if(nPage <= mnPages)
+ GotoPage(nPage);
+ }
+}
+
+void Assistent::PreviousPage()
+{
+ if(mnCurrentPage>1)
+ {
+ int nPage = mnCurrentPage-1;
+ while(nPage >= 0 && !mpPageStatus[nPage-1])
+ nPage--;
+
+ if(nPage >= 0)
+ GotoPage(nPage);
+ }
+}
+
+bool Assistent::GotoPage(const int nPageToGo)
+{
+ DBG_ASSERT( (nPageToGo > 0) && (nPageToGo <= mnPages), "Page not available!");
+
+ if((nPageToGo>0)&&(nPageToGo<=mnPages)&&mpPageStatus[nPageToGo-1])
+ {
+ int nIndex=mnCurrentPage-1;
+
+ for(auto& rxPage : maPages[nIndex])
+ {
+ rxPage->set_sensitive(false);
+ rxPage->hide();
+ }
+
+ mnCurrentPage=nPageToGo;
+ nIndex=mnCurrentPage-1;
+
+ for(auto& rxPage : maPages[nIndex])
+ {
+ rxPage->set_sensitive(true);
+ rxPage->show();
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+bool Assistent::IsLastPage() const
+{
+ if(mnCurrentPage == mnPages)
+ return true;
+
+ int nPage = mnCurrentPage+1;
+ while(nPage <= mnPages && !mpPageStatus[nPage-1])
+ nPage++;
+
+ return nPage > mnPages;
+}
+
+bool Assistent::IsFirstPage() const
+{
+ if(mnCurrentPage == 1)
+ return true;
+
+ int nPage = mnCurrentPage-1;
+ while(nPage > 0 && !mpPageStatus[nPage-1])
+ nPage--;
+
+ return nPage == 0;
+}
+
+bool Assistent::IsEnabled( int nPage ) const
+{
+ DBG_ASSERT( (nPage>0) && (nPage <= mnPages), "Page not available!" );
+
+ return (nPage>0) && (nPage <= mnPages && mpPageStatus[nPage-1]);
+}
+
+void Assistent::EnablePage( int nPage )
+{
+ DBG_ASSERT( (nPage>0) && (nPage <= mnPages), "Page not available!" );
+
+ if((nPage>0) && (nPage < mnPages && !mpPageStatus[nPage-1]))
+ {
+ mpPageStatus[nPage-1] = true;
+ }
+}
+
+void Assistent::DisablePage( int nPage )
+{
+ DBG_ASSERT( (nPage>0) && (nPage <= mnPages), "Page not available!" );
+
+ if((nPage>0) && (nPage <= mnPages && mpPageStatus[nPage-1]))
+ {
+ mpPageStatus[nPage-1] = false;
+ if(mnCurrentPage == nPage)
+ GotoPage(1);
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/brkdlg.cxx b/sd/source/ui/dlg/brkdlg.cxx
new file mode 100644
index 000000000..bc1d0f5cf
--- /dev/null
+++ b/sd/source/ui/dlg/brkdlg.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/.
+ *
+ * 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 <BreakDlg.hxx>
+#include <sfx2/progress.hxx>
+
+#include <svx/svdetc.hxx>
+#include <vcl/scheduler.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+
+#include <sdresid.hxx>
+#include <drawview.hxx>
+#include <strings.hrc>
+#include <DrawDocShell.hxx>
+
+namespace sd {
+
+/**
+ * dialog to split metafiles
+ */
+
+BreakDlg::BreakDlg(weld::Window* pWindow, DrawView* pDrView, DrawDocShell* pShell,
+ sal_uLong nSumActionCount, sal_uLong nObjCount)
+ : SfxDialogController(pWindow, "modules/sdraw/ui/breakdialog.ui", "BreakDialog")
+ , m_xFiObjInfo(m_xBuilder->weld_label("metafiles"))
+ , m_xFiActInfo(m_xBuilder->weld_label("metaobjects"))
+ , m_xFiInsInfo(m_xBuilder->weld_label("drawingobjects"))
+ , m_xBtnCancel(m_xBuilder->weld_button("cancel"))
+ , m_pDrView(pDrView)
+ , m_bCancel(false)
+ , m_aUpdateIdle( "sd::BreakDlg m_aUpdateIdle" )
+{
+ m_aUpdateIdle.SetPriority( TaskPriority::REPAINT );
+ m_aUpdateIdle.SetInvokeHandler( LINK( this, BreakDlg, InitialUpdate ) );
+
+ m_xBtnCancel->connect_clicked(LINK(this, BreakDlg, CancelButtonHdl));
+
+ m_xProgress.reset(new SfxProgress(pShell, SdResId(STR_BREAK_METAFILE), nSumActionCount*3));
+
+ m_xProgrInfo.reset(new SvdProgressInfo(LINK(this, BreakDlg, UpDate)));
+ // every action is edited 3 times in DoImport()
+ m_xProgrInfo->Init( nObjCount );
+}
+
+// Control-Handler for cancel button
+IMPL_LINK_NOARG(BreakDlg, CancelButtonHdl, weld::Button&, void)
+{
+ m_bCancel = true;
+ m_xBtnCancel->set_sensitive(false);
+}
+
+/**
+ * The working function has to call the UpDate method periodically.
+ * With the first call, the overall number of actions is provided.
+ * Every following call should contain the finished actions since the
+ * last call of UpDate.
+ */
+IMPL_LINK( BreakDlg, UpDate, void*, nInit, bool )
+{
+ if (!m_xProgrInfo)
+ return true;
+
+ // update status bar or show an error message?
+ if(nInit == reinterpret_cast<void*>(1))
+ {
+ std::unique_ptr<weld::MessageDialog> xErrBox(Application::CreateMessageDialog(m_xDialog.get(),
+ VclMessageType::Warning, VclButtonsType::Ok,
+ SdResId(STR_BREAK_FAIL)));
+ xErrBox->run();
+ }
+ else
+ {
+ if (m_xProgress)
+ m_xProgress->SetState(m_xProgrInfo->GetSumCurAction());
+ }
+
+ // which object is shown at the moment?
+ OUString info = OUString::number(m_xProgrInfo->GetCurObj())
+ + "/"
+ + OUString::number(m_xProgrInfo->GetObjCount());
+ m_xFiObjInfo->set_label(info);
+
+ // how many actions are started?
+ if (m_xProgrInfo->GetActionCount() == 0)
+ {
+ m_xFiActInfo->set_label( OUString() );
+ }
+ else
+ {
+ info = OUString::number(m_xProgrInfo->GetCurAction())
+ + "/"
+ + OUString::number(m_xProgrInfo->GetActionCount());
+ m_xFiActInfo->set_label(info);
+ }
+
+ // and inserted????
+ if (m_xProgrInfo->GetInsertCount() == 0)
+ {
+ m_xFiInsInfo->set_label( OUString() );
+ }
+ else
+ {
+ info = OUString::number(m_xProgrInfo->GetCurInsert())
+ + "/"
+ + OUString::number(m_xProgrInfo->GetInsertCount());
+ m_xFiInsInfo->set_label(info);
+ }
+
+ // make sure dialog gets painted, it is intended to
+ // show the progress to the user. Also necessary to
+ // provide a clickable cancel button
+ Scheduler::ProcessEventsToIdle();
+
+ // return okay-value (-> !cancel)
+ return !m_bCancel;
+}
+
+/**
+ * open a modal dialog and start a timer which calls the working function after
+ * the opening of the dialog
+ */
+short BreakDlg::run()
+{
+ m_aUpdateIdle.Start();
+ return SfxDialogController::run();
+}
+
+/**
+ * link-method which starts the working function
+ */
+IMPL_LINK_NOARG(BreakDlg, InitialUpdate, Timer *, void)
+{
+ m_pDrView->DoImportMarkedMtf(m_xProgrInfo.get());
+ m_xDialog->response(RET_OK);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/copydlg.cxx b/sd/source/ui/dlg/copydlg.cxx
new file mode 100644
index 000000000..1fa8c2dab
--- /dev/null
+++ b/sd/source/ui/dlg/copydlg.cxx
@@ -0,0 +1,263 @@
+/* -*- 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 <copydlg.hxx>
+#include <svx/colorbox.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/sdangitm.hxx>
+#include <sfx2/module.hxx>
+#include <svx/xcolit.hxx>
+#include <svl/intitem.hxx>
+
+#include <unotools/viewoptions.hxx>
+#include <svtools/unitconv.hxx>
+#include <o3tl/string_view.hxx>
+
+#include <sdattr.hrc>
+#include <View.hxx>
+#include <drawdoc.hxx>
+
+
+namespace sd {
+
+constexpr char TOKEN = ';';
+
+CopyDlg::CopyDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, ::sd::View* pInView)
+ : SfxDialogController(pWindow, "modules/sdraw/ui/copydlg.ui", "DuplicateDialog")
+ , mrOutAttrs(rInAttrs)
+ , maUIScale(pInView->GetDoc().GetUIScale())
+ , mpView(pInView)
+ , m_xNumFldCopies(m_xBuilder->weld_spin_button("copies"))
+ , m_xBtnSetViewData(m_xBuilder->weld_button("viewdata"))
+ , m_xMtrFldMoveX(m_xBuilder->weld_metric_spin_button("x", FieldUnit::CM))
+ , m_xMtrFldMoveY(m_xBuilder->weld_metric_spin_button("y", FieldUnit::CM))
+ , m_xMtrFldAngle(m_xBuilder->weld_metric_spin_button("angle", FieldUnit::DEGREE))
+ , m_xMtrFldWidth(m_xBuilder->weld_metric_spin_button("width", FieldUnit::CM))
+ , m_xMtrFldHeight(m_xBuilder->weld_metric_spin_button("height", FieldUnit::CM))
+ , m_xFtEndColor(m_xBuilder->weld_label("endlabel"))
+ , m_xBtnSetDefault(m_xBuilder->weld_button("default"))
+ , m_xLbStartColor(new ColorListBox(m_xBuilder->weld_menu_button("start"), [this]{ return m_xDialog.get(); } ))
+ , m_xLbEndColor(new ColorListBox(m_xBuilder->weld_menu_button("end"), [this]{ return m_xDialog.get(); } ))
+{
+ m_xLbStartColor->SetSelectHdl( LINK( this, CopyDlg, SelectColorHdl ) );
+ m_xBtnSetViewData->connect_clicked( LINK( this, CopyDlg, SetViewData ) );
+ m_xBtnSetDefault->connect_clicked( LINK( this, CopyDlg, SetDefault ) );
+
+ FieldUnit eFUnit( SfxModule::GetCurrentFieldUnit() );
+
+ SetFieldUnit( *m_xMtrFldMoveX, eFUnit, true );
+ SetFieldUnit( *m_xMtrFldMoveY, eFUnit, true );
+ SetFieldUnit( *m_xMtrFldWidth, eFUnit, true );
+ SetFieldUnit( *m_xMtrFldHeight, eFUnit, true );
+
+ Reset();
+}
+
+CopyDlg::~CopyDlg()
+{
+ SvtViewOptions aDlgOpt(EViewType::Dialog, OStringToOUString(m_xDialog->get_help_id(), RTL_TEXTENCODING_UTF8));
+ OUString sStr =
+ OUString::number(m_xNumFldCopies->get_value()) + OUStringChar(TOKEN) +
+ OUString::number(m_xMtrFldMoveX->get_value(FieldUnit::NONE)) + OUStringChar(TOKEN) +
+ OUString::number(m_xMtrFldMoveY->get_value(FieldUnit::NONE)) + OUStringChar(TOKEN) +
+ OUString::number(m_xMtrFldAngle->get_value(FieldUnit::NONE)) + OUStringChar(TOKEN) +
+ OUString::number(m_xMtrFldWidth->get_value(FieldUnit::NONE)) + OUStringChar(TOKEN) +
+ OUString::number(m_xMtrFldHeight->get_value(FieldUnit::NONE)) + OUStringChar(TOKEN) +
+ OUString::number(static_cast<sal_uInt32>(m_xLbStartColor->GetSelectEntryColor())) + OUStringChar(TOKEN) +
+ OUString::number(static_cast<sal_uInt32>(m_xLbEndColor->GetSelectEntryColor()));
+ aDlgOpt.SetUserItem("UserItem", css::uno::Any(sStr));
+}
+
+/**
+ * reads provided item set or evaluate ini string
+ */
+void CopyDlg::Reset()
+{
+ // Set Min/Max values
+ ::tools::Rectangle aRect = mpView->GetAllMarkedRect();
+ Size aPageSize = mpView->GetSdrPageView()->GetPage()->GetSize();
+
+ // tdf#125011 draw/impress sizes are in mm_100th already, "normalize" to
+ // decimal shift by number of decimal places the widgets are using (2) then
+ // scale by the ui scaling factor
+ auto nPageWidth = tools::Long(m_xMtrFldMoveX->normalize(aPageSize.Width()) / maUIScale);
+ auto nPageHeight = tools::Long(m_xMtrFldMoveX->normalize(aPageSize.Height()) / maUIScale);
+ auto nRectWidth = tools::Long(m_xMtrFldMoveX->normalize(aRect.GetWidth()) / maUIScale);
+ auto nRectHeight = tools::Long(m_xMtrFldMoveX->normalize(aRect.GetHeight()) / maUIScale);
+
+ m_xMtrFldMoveX->set_range(-nPageWidth, nPageWidth, FieldUnit::MM_100TH);
+ m_xMtrFldMoveY->set_range(-nPageHeight, nPageHeight, FieldUnit::MM_100TH);
+ m_xMtrFldWidth->set_range(-nRectWidth, nPageWidth, FieldUnit::MM_100TH);
+ m_xMtrFldHeight->set_range(-nRectHeight, nPageHeight, FieldUnit::MM_100TH);
+
+ OUString aStr;
+ SvtViewOptions aDlgOpt(EViewType::Dialog, OStringToOUString(m_xDialog->get_help_id(), RTL_TEXTENCODING_UTF8));
+ if (aDlgOpt.Exists())
+ {
+ css::uno::Any aUserItem = aDlgOpt.GetUserItem("UserItem");
+ aUserItem >>= aStr;
+ }
+
+ if (aStr.isEmpty())
+ {
+ if( const SfxUInt16Item* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_NUMBER ) )
+ m_xNumFldCopies->set_value(pPoolItem->GetValue());
+ else
+ m_xNumFldCopies->set_value(1);
+
+ tools::Long nMoveX = 500;
+ if( const SfxInt32Item* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_MOVE_X ) )
+ nMoveX = pPoolItem->GetValue();
+ SetMetricValue( *m_xMtrFldMoveX, tools::Long(nMoveX / maUIScale), MapUnit::Map100thMM);
+
+ tools::Long nMoveY = 500;
+ if( const SfxInt32Item* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_MOVE_Y ) )
+ nMoveY = pPoolItem->GetValue();
+ SetMetricValue( *m_xMtrFldMoveY, tools::Long(nMoveY / maUIScale), MapUnit::Map100thMM);
+
+ if( const SdrAngleItem* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_ANGLE ) )
+ m_xMtrFldAngle->set_value( pPoolItem->GetValue().get(), FieldUnit::NONE);
+ else
+ m_xMtrFldAngle->set_value(0, FieldUnit::NONE);
+
+ tools::Long nWidth = 0;
+ if( const SfxInt32Item* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_WIDTH ) )
+ nWidth = pPoolItem->GetValue();
+ SetMetricValue( *m_xMtrFldWidth, tools::Long(nWidth / maUIScale), MapUnit::Map100thMM);
+
+ tools::Long nHeight = 0;
+ if( const SfxInt32Item* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_HEIGHT ) )
+ nHeight = pPoolItem->GetValue();
+ SetMetricValue( *m_xMtrFldHeight, tools::Long(nHeight / maUIScale), MapUnit::Map100thMM);
+
+ if( const XColorItem* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_START_COLOR ) )
+ {
+ Color aColor = pPoolItem->GetColorValue();
+ m_xLbStartColor->SelectEntry( aColor );
+ m_xLbEndColor->SelectEntry( aColor );
+ }
+ else
+ {
+ m_xLbStartColor->SetNoSelection();
+ m_xLbEndColor->SetNoSelection();
+ m_xLbEndColor->set_sensitive(false);
+ m_xFtEndColor->set_sensitive(false);
+ }
+ }
+ else
+ {
+ sal_Int32 nIdx {0};
+ m_xNumFldCopies->set_value(o3tl::toInt64(o3tl::getToken(aStr, 0, TOKEN, nIdx)));
+ m_xMtrFldMoveX->set_value(o3tl::toInt64(o3tl::getToken(aStr, 0, TOKEN, nIdx)), FieldUnit::NONE);
+ m_xMtrFldMoveY->set_value(o3tl::toInt64(o3tl::getToken(aStr, 0, TOKEN, nIdx)), FieldUnit::NONE);
+ m_xMtrFldAngle->set_value(o3tl::toInt64(o3tl::getToken(aStr, 0, TOKEN, nIdx)), FieldUnit::NONE);
+ m_xMtrFldWidth->set_value(o3tl::toInt64(o3tl::getToken(aStr, 0, TOKEN, nIdx)), FieldUnit::NONE);
+ m_xMtrFldHeight->set_value(o3tl::toInt64(o3tl::getToken(aStr, 0, TOKEN, nIdx)), FieldUnit::NONE);
+ m_xLbStartColor->SelectEntry( Color( ColorTransparency, o3tl::toUInt32(o3tl::getToken(aStr, 0, TOKEN, nIdx)) ) );
+ m_xLbEndColor->SelectEntry( Color( ColorTransparency, o3tl::toUInt32(o3tl::getToken(aStr, 0, TOKEN, nIdx)) ) );
+ }
+
+}
+
+/**
+ * fills provided item set with dialog box attributes
+ */
+void CopyDlg::GetAttr( SfxItemSet& rOutAttrs )
+{
+ tools::Long nMoveX = tools::Long( GetCoreValue( *m_xMtrFldMoveX, MapUnit::Map100thMM) * maUIScale);
+ tools::Long nMoveY = tools::Long( GetCoreValue( *m_xMtrFldMoveY, MapUnit::Map100thMM) * maUIScale);
+ tools::Long nHeight = tools::Long( GetCoreValue( *m_xMtrFldHeight, MapUnit::Map100thMM) * maUIScale);
+ tools::Long nWidth = tools::Long( GetCoreValue( *m_xMtrFldWidth, MapUnit::Map100thMM) * maUIScale);
+
+ rOutAttrs.Put( SfxUInt16Item( ATTR_COPY_NUMBER, static_cast<sal_uInt16>(m_xNumFldCopies->get_value()) ) );
+ rOutAttrs.Put( SfxInt32Item( ATTR_COPY_MOVE_X, nMoveX ) );
+ rOutAttrs.Put( SfxInt32Item( ATTR_COPY_MOVE_Y, nMoveY ) );
+ rOutAttrs.Put( SdrAngleItem( ATTR_COPY_ANGLE, Degree100(static_cast<sal_Int32>(m_xMtrFldAngle->get_value(FieldUnit::DEGREE))) ) );
+ rOutAttrs.Put( SfxInt32Item( ATTR_COPY_WIDTH, nWidth ) );
+ rOutAttrs.Put( SfxInt32Item( ATTR_COPY_HEIGHT, nHeight ) );
+
+ NamedColor aColor = m_xLbStartColor->GetSelectedEntry();
+ rOutAttrs.Put(XColorItem(ATTR_COPY_START_COLOR, aColor.second, aColor.first));
+ aColor = m_xLbEndColor->GetSelectedEntry();
+ rOutAttrs.Put(XColorItem(ATTR_COPY_END_COLOR, aColor.second, aColor.first));
+}
+
+/**
+ * enables and selects end color LB
+ */
+IMPL_LINK_NOARG(CopyDlg, SelectColorHdl, ColorListBox&, void)
+{
+ const Color aColor = m_xLbStartColor->GetSelectEntryColor();
+
+ if (!m_xLbEndColor->get_sensitive())
+ {
+ m_xLbEndColor->SelectEntry(aColor);
+ m_xLbEndColor->set_sensitive(true);
+ m_xFtEndColor->set_sensitive(true);
+ }
+}
+
+/**
+ * sets values of selection
+ */
+IMPL_LINK_NOARG(CopyDlg, SetViewData, weld::Button&, void)
+{
+ ::tools::Rectangle aRect = mpView->GetAllMarkedRect();
+
+ SetMetricValue( *m_xMtrFldMoveX, tools::Long( aRect.GetWidth() /
+ maUIScale ), MapUnit::Map100thMM);
+ SetMetricValue( *m_xMtrFldMoveY, tools::Long( aRect.GetHeight() /
+ maUIScale ), MapUnit::Map100thMM);
+
+ // sets color attribute
+ if( const XColorItem* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_START_COLOR ) )
+ {
+ Color aColor = pPoolItem->GetColorValue();
+ m_xLbStartColor->SelectEntry( aColor );
+ }
+}
+
+/**
+ * resets values to default
+ */
+IMPL_LINK_NOARG(CopyDlg, SetDefault, weld::Button&, void)
+{
+ m_xNumFldCopies->set_value(1);
+
+ tools::Long nValue = 500;
+ SetMetricValue( *m_xMtrFldMoveX, tools::Long(nValue / maUIScale), MapUnit::Map100thMM);
+ SetMetricValue( *m_xMtrFldMoveY, tools::Long(nValue / maUIScale), MapUnit::Map100thMM);
+
+ nValue = 0;
+ m_xMtrFldAngle->set_value(nValue, FieldUnit::DEGREE);
+ SetMetricValue( *m_xMtrFldWidth, tools::Long(nValue / maUIScale), MapUnit::Map100thMM);
+ SetMetricValue( *m_xMtrFldHeight, tools::Long(nValue / maUIScale), MapUnit::Map100thMM);
+
+ // set color attribute
+ if( const XColorItem* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_COPY_START_COLOR ) )
+ {
+ Color aColor = pPoolItem->GetColorValue();
+ m_xLbStartColor->SelectEntry( aColor );
+ m_xLbEndColor->SelectEntry( aColor );
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/custsdlg.cxx b/sd/source/ui/dlg/custsdlg.cxx
new file mode 100644
index 000000000..bc421d7e4
--- /dev/null
+++ b/sd/source/ui/dlg/custsdlg.cxx
@@ -0,0 +1,478 @@
+/* -*- 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 <custsdlg.hxx>
+
+#include <strings.hrc>
+#include <sdresid.hxx>
+
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <cusshow.hxx>
+#include <customshowlist.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <unotools/charclass.hxx>
+#include <tools/debug.hxx>
+
+// SdCustomShowDlg
+SdCustomShowDlg::SdCustomShowDlg(weld::Window* pWindow, SdDrawDocument& rDrawDoc)
+ : GenericDialogController(pWindow, "modules/simpress/ui/customslideshows.ui", "CustomSlideShows")
+ , rDoc(rDrawDoc)
+ , pCustomShowList(nullptr)
+ , m_xLbCustomShows(m_xBuilder->weld_tree_view("customshowlist"))
+ , m_xBtnNew(m_xBuilder->weld_button("new"))
+ , m_xBtnEdit(m_xBuilder->weld_button("edit"))
+ , m_xBtnRemove(m_xBuilder->weld_button("delete"))
+ , m_xBtnCopy(m_xBuilder->weld_button("copy"))
+ , m_xBtnHelp(m_xBuilder->weld_button("help"))
+ , m_xBtnStartShow(m_xBuilder->weld_button("startshow"))
+ , m_xBtnOK(m_xBuilder->weld_button("ok"))
+{
+ m_xLbCustomShows->set_size_request(m_xLbCustomShows->get_approximate_digit_width() * 32,
+ m_xLbCustomShows->get_height_rows(8));
+
+ Link<weld::Button&,void> aLink( LINK( this, SdCustomShowDlg, ClickButtonHdl ) );
+ m_xBtnNew->connect_clicked( aLink );
+ m_xBtnEdit->connect_clicked( aLink );
+ m_xBtnRemove->connect_clicked( aLink );
+ m_xBtnCopy->connect_clicked( aLink );
+ m_xLbCustomShows->connect_changed( LINK( this, SdCustomShowDlg, SelectListBoxHdl ) );
+
+ m_xBtnStartShow->connect_clicked( LINK( this, SdCustomShowDlg, StartShowHdl ) ); // for test
+
+ // get CustomShow list of docs
+ pCustomShowList = rDoc.GetCustomShowList();
+ if( pCustomShowList )
+ {
+ tools::Long nPosToSelect = pCustomShowList->GetCurPos();
+ // fill ListBox with CustomShows
+ for( SdCustomShow* pCustomShow = pCustomShowList->First();
+ pCustomShow != nullptr;
+ pCustomShow = pCustomShowList->Next() )
+ {
+ m_xLbCustomShows->append_text(pCustomShow->GetName());
+ }
+ m_xLbCustomShows->select(nPosToSelect);
+ pCustomShowList->Seek( nPosToSelect );
+ }
+
+ CheckState();
+}
+
+SdCustomShowDlg::~SdCustomShowDlg()
+{
+}
+
+void SdCustomShowDlg::CheckState()
+{
+ int nPos = m_xLbCustomShows->get_selected_index();
+
+ bool bEnable = nPos != -1;
+ m_xBtnEdit->set_sensitive( bEnable );
+ m_xBtnRemove->set_sensitive( bEnable );
+ m_xBtnCopy->set_sensitive( bEnable );
+ m_xBtnStartShow->set_sensitive(bEnable);
+
+ if (bEnable && pCustomShowList)
+ pCustomShowList->Seek( nPos );
+}
+
+IMPL_LINK( SdCustomShowDlg, ClickButtonHdl, weld::Button&, r, void )
+{
+ SelectHdl(&r);
+}
+
+IMPL_LINK( SdCustomShowDlg, SelectListBoxHdl, weld::TreeView&, rListBox, void )
+{
+ SelectHdl(&rListBox);
+}
+
+void SdCustomShowDlg::SelectHdl(void const *p)
+{
+ // new CustomShow
+ if (p == m_xBtnNew.get())
+ {
+ std::unique_ptr<SdCustomShow> pCustomShow;
+ SdDefineCustomShowDlg aDlg(m_xDialog.get(), rDoc, pCustomShow);
+ if (aDlg.run() == RET_OK)
+ {
+ if( pCustomShow )
+ {
+ if( !pCustomShowList )
+ pCustomShowList = rDoc.GetCustomShowList( true );
+
+ SdCustomShow* pCustomShowTmp = pCustomShow.get();
+ pCustomShowList->push_back( std::move(pCustomShow) );
+ pCustomShowList->Last();
+ m_xLbCustomShows->append_text( pCustomShowTmp->GetName() );
+ m_xLbCustomShows->select_text( pCustomShowTmp->GetName() );
+ }
+ }
+ }
+ // edit CustomShow
+ else if( p == m_xBtnEdit.get() )
+ {
+ int nPos = m_xLbCustomShows->get_selected_index();
+ if (nPos != -1)
+ {
+ DBG_ASSERT( pCustomShowList, "pCustomShowList does not exist" );
+ std::unique_ptr<SdCustomShow>& pCustomShow = (*pCustomShowList)[ nPos ];
+ SdDefineCustomShowDlg aDlg(m_xDialog.get(), rDoc, pCustomShow);
+
+ if (aDlg.run() == RET_OK)
+ {
+ pCustomShowList->Seek(nPos);
+ m_xLbCustomShows->remove(nPos);
+ m_xLbCustomShows->insert_text(nPos, pCustomShow->GetName());
+ m_xLbCustomShows->select(nPos);
+ }
+ }
+ }
+ // delete CustomShow
+ else if( p == m_xBtnRemove.get() )
+ {
+ int nPos = m_xLbCustomShows->get_selected_index();
+ if (nPos != -1)
+ {
+ pCustomShowList->erase( pCustomShowList->begin() + nPos );
+ m_xLbCustomShows->remove(nPos);
+ m_xLbCustomShows->select(nPos == 0 ? nPos : nPos - 1);
+ }
+ }
+ // copy CustomShow
+ else if( p == m_xBtnCopy.get() )
+ {
+ int nPos = m_xLbCustomShows->get_selected_index();
+ if (nPos != -1)
+ {
+ std::unique_ptr<SdCustomShow> pShow(new SdCustomShow( *(*pCustomShowList)[nPos] ));
+ OUString aStr( pShow->GetName() );
+ OUString aStrCopy( SdResId( STR_COPY_CUSTOMSHOW ) );
+
+ sal_Int32 nStrPos = aStr.indexOf( aStrCopy );
+ sal_Int32 nNum = 1;
+ if( nStrPos < 0 )
+ {
+ aStr += " (" + aStrCopy + OUString::number( nNum ) + ")";
+ nStrPos = aStr.indexOf( aStrCopy );
+ }
+ nStrPos = nStrPos + aStrCopy.getLength();
+ // that we do not access into the nirvana (--> endless loop)
+ if( nStrPos >= aStr.getLength() )
+ {
+ aStr += " " + OUString::number( nNum );
+ }
+
+ // check name...
+ bool bDifferent = false;
+ //long nPosToSelect = pCustomShowList->GetCurPos();
+ while( !bDifferent )
+ {
+ bDifferent = true;
+ for( SdCustomShow* pCustomShow = pCustomShowList->First();
+ pCustomShow != nullptr && bDifferent;
+ pCustomShow = pCustomShowList->Next() )
+ {
+ if( aStr == pCustomShow->GetName() )
+ bDifferent = false;
+ }
+ if( !bDifferent )
+ {
+ // replace number by a number increased by 1
+
+ const CharClass* pCharClass = rDoc.GetCharClass();
+ while( pCharClass->isDigit( aStr, nStrPos ) )
+ aStr = aStr.replaceAt( nStrPos, 1, u"" );
+ aStr = aStr.subView( 0, nStrPos) + OUString::number( ++nNum ) + aStr.subView( nStrPos);
+ }
+
+ }
+ //pCustomShowList->Seek( nPosToSelect );
+ pShow->SetName( aStr );
+
+ auto pShowTmp = pShow.get();
+ pCustomShowList->push_back( std::move(pShow) );
+ pCustomShowList->Last();
+ m_xLbCustomShows->append_text(pShowTmp->GetName());
+ m_xLbCustomShows->select_text(pShowTmp->GetName());
+ }
+ }
+ else if( p == m_xLbCustomShows.get() )
+ {
+ int nPos = m_xLbCustomShows->get_selected_index();
+ if (nPos != -1)
+ pCustomShowList->Seek(nPos);
+ }
+
+ CheckState();
+}
+
+// StartShow-Hdl
+IMPL_LINK_NOARG(SdCustomShowDlg, StartShowHdl, weld::Button&, void)
+{
+ m_xDialog->response(RET_YES);
+}
+
+// CheckState
+bool SdCustomShowDlg::IsCustomShow() const
+{
+ if (!pCustomShowList->empty())
+ return true;
+ else
+ return false;
+}
+
+// SdDefineCustomShowDlg
+SdDefineCustomShowDlg::SdDefineCustomShowDlg(weld::Window* pWindow, SdDrawDocument& rDrawDoc, std::unique_ptr<SdCustomShow>& rpCS)
+ : GenericDialogController(pWindow, "modules/simpress/ui/definecustomslideshow.ui", "DefineCustomSlideShow")
+ , rDoc(rDrawDoc)
+ , rpCustomShow(rpCS)
+ , bModified(false)
+ , m_xEdtName(m_xBuilder->weld_entry("customname"))
+ , m_xLbPages(m_xBuilder->weld_tree_view("pages"))
+ , m_xBtnAdd(m_xBuilder->weld_button("add"))
+ , m_xBtnRemove(m_xBuilder->weld_button("remove"))
+ , m_xLbCustomPages(m_xBuilder->weld_tree_view("custompages"))
+ , m_xDropTargetHelper(new weld::ReorderingDropTarget(*m_xLbCustomPages))
+ , m_xBtnOK(m_xBuilder->weld_button("ok"))
+ , m_xBtnCancel(m_xBuilder->weld_button("cancel"))
+ , m_xBtnHelp(m_xBuilder->weld_button("help"))
+{
+ Link<weld::Button&,void> aLink = LINK( this, SdDefineCustomShowDlg, ClickButtonHdl );
+ m_xBtnAdd->connect_clicked( aLink );
+ m_xBtnRemove->connect_clicked( aLink );
+ m_xEdtName->connect_changed( LINK( this, SdDefineCustomShowDlg, ClickButtonEditHdl ) );
+ m_xLbPages->connect_changed( LINK( this, SdDefineCustomShowDlg, ClickButtonHdl4 ) ); // because of status
+ m_xLbCustomPages->connect_changed( LINK( this, SdDefineCustomShowDlg, ClickButtonHdl3 ) ); // because of status
+
+ m_xBtnOK->connect_clicked( LINK( this, SdDefineCustomShowDlg, OKHdl ) );
+
+ m_xLbPages->set_selection_mode(SelectionMode::Multiple);
+
+ // shape 'em a bit
+ m_xLbPages->set_size_request(m_xLbPages->get_approximate_digit_width() * 24, m_xLbPages->get_height_rows(10));
+ m_xLbCustomPages->set_size_request(m_xLbPages->get_approximate_digit_width() * 24, m_xLbCustomPages->get_height_rows(10));
+
+ // fill Listbox with page names of Docs
+ for( tools::Long nPage = 0;
+ nPage < rDoc.GetSdPageCount( PageKind::Standard );
+ nPage++ )
+ {
+ SdPage* pPage = rDoc.GetSdPage( static_cast<sal_uInt16>(nPage), PageKind::Standard );
+ m_xLbPages->append_text(pPage->GetName());
+ }
+ // aLbPages.SelectEntryPos( 0 );
+
+ if( rpCustomShow )
+ {
+ aOldName = rpCustomShow->GetName();
+ m_xEdtName->set_text( aOldName );
+
+ // fill ListBox with CustomShow pages
+ for( const auto& rpPage : rpCustomShow->PagesVector() )
+ {
+ m_xLbCustomPages->append(weld::toId(rpPage), rpPage->GetName(), "");
+ }
+ }
+ else
+ {
+ rpCustomShow.reset(new SdCustomShow);
+ m_xEdtName->set_text( SdResId( STR_NEW_CUSTOMSHOW ) );
+ m_xEdtName->select_region(0, -1);
+ rpCustomShow->SetName( m_xEdtName->get_text() );
+ }
+
+ m_xBtnOK->set_sensitive( false );
+ CheckState();
+}
+
+SdDefineCustomShowDlg::~SdDefineCustomShowDlg()
+{
+}
+
+// CheckState
+void SdDefineCustomShowDlg::CheckState()
+{
+ bool bPages = m_xLbPages->count_selected_rows() > 0;
+ bool bCSPages = m_xLbCustomPages->get_selected_index() != -1;
+ bool bCount = m_xLbCustomPages->n_children() > 0;
+
+ m_xBtnOK->set_sensitive( bCount );
+ m_xBtnAdd->set_sensitive( bPages );
+ m_xBtnRemove->set_sensitive( bCSPages );
+}
+
+IMPL_LINK( SdDefineCustomShowDlg, ClickButtonHdl, weld::Button&, rWidget, void )
+{
+ ClickButtonHdl2(&rWidget);
+}
+
+IMPL_LINK( SdDefineCustomShowDlg, ClickButtonHdl3, weld::TreeView&, rWidget, void )
+{
+ ClickButtonHdl2(&rWidget);
+}
+
+IMPL_LINK( SdDefineCustomShowDlg, ClickButtonHdl4, weld::TreeView&, rListBox, void )
+{
+ ClickButtonHdl2(&rListBox);
+}
+
+IMPL_LINK( SdDefineCustomShowDlg, ClickButtonEditHdl, weld::Entry&, rEdit, void )
+{
+ ClickButtonHdl2(&rEdit);
+}
+
+// ButtonHdl()
+void SdDefineCustomShowDlg::ClickButtonHdl2(void const * p)
+{
+ if( p == m_xBtnAdd.get() )
+ {
+ auto aRows = m_xLbPages->get_selected_rows();
+ if (!aRows.empty())
+ {
+ int nPosCP = m_xLbCustomPages->get_selected_index();
+ if (nPosCP != -1)
+ ++nPosCP;
+
+ for (auto i : aRows)
+ {
+ OUString aStr = m_xLbPages->get_text(i);
+ SdPage* pPage = rDoc.GetSdPage(i, PageKind::Standard);
+ OUString sId(weld::toId(pPage));
+ m_xLbCustomPages->insert(nPosCP, aStr, &sId, nullptr, nullptr);
+ m_xLbCustomPages->select(nPosCP != -1 ? nPosCP : m_xLbCustomPages->n_children() - 1);
+
+ if (nPosCP != -1)
+ ++nPosCP;
+ }
+ bModified = true;
+ }
+ }
+ else if (p == m_xBtnRemove.get())
+ {
+ int nPos = m_xLbCustomPages->get_selected_index();
+ if (nPos != -1)
+ {
+ m_xLbCustomPages->remove(nPos);
+ m_xLbCustomPages->select(nPos == 0 ? nPos : nPos - 1);
+ bModified = true;
+ }
+ }
+ else if( p == m_xEdtName.get() )
+ {
+ bModified = true;
+ }
+
+ CheckState();
+}
+
+/**
+ * Checks the page pointer of the Show since entries can be moved and copied
+ * by TreeLB.
+ */
+void SdDefineCustomShowDlg::CheckCustomShow()
+{
+ bool bDifferent = false;
+
+ // compare count
+ size_t nCount = m_xLbCustomPages->n_children();
+ if (rpCustomShow->PagesVector().size() != nCount)
+ {
+ rpCustomShow->PagesVector().clear();
+ bDifferent = true;
+ }
+
+ // compare page pointer
+ if( !bDifferent )
+ {
+ size_t i = 0;
+ for (const auto& rpPage : rpCustomShow->PagesVector())
+ {
+ SdPage* pPage = weld::fromId<SdPage*>(m_xLbCustomPages->get_id(i));
+ if (rpPage != pPage)
+ {
+ rpCustomShow->PagesVector().clear();
+ bDifferent = true;
+ break;
+ }
+
+ ++i;
+ }
+ }
+
+ // set new page pointer
+ if( bDifferent )
+ {
+ for (size_t i = 0; i < nCount; ++i)
+ {
+ SdPage* pPage = weld::fromId<SdPage*>(m_xLbCustomPages->get_id(i));
+ rpCustomShow->PagesVector().push_back(pPage);
+ }
+ bModified = true;
+ }
+
+ // compare name and set name if necessary
+ OUString aStr( m_xEdtName->get_text() );
+ if( rpCustomShow->GetName() != aStr )
+ {
+ rpCustomShow->SetName( aStr );
+ bModified = true;
+ }
+}
+
+// OK-Hdl
+IMPL_LINK_NOARG(SdDefineCustomShowDlg, OKHdl, weld::Button&, void)
+{
+ // check name...
+ bool bDifferent = true;
+ SdCustomShowList* pCustomShowList = rDoc.GetCustomShowList();
+ if( pCustomShowList )
+ {
+ OUString aName( m_xEdtName->get_text() );
+ SdCustomShow* pCustomShow;
+
+ tools::Long nPosToSelect = pCustomShowList->GetCurPos();
+ for( pCustomShow = pCustomShowList->First();
+ pCustomShow != nullptr;
+ pCustomShow = pCustomShowList->Next() )
+ {
+ if( aName == pCustomShow->GetName() && aName != aOldName )
+ bDifferent = false;
+ }
+ pCustomShowList->Seek( nPosToSelect );
+ }
+
+ if( bDifferent )
+ {
+ CheckCustomShow();
+
+ m_xDialog->response(RET_OK);
+ }
+ else
+ {
+ std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(m_xDialog.get(),
+ VclMessageType::Warning, VclButtonsType::Ok,
+ SdResId(STR_WARN_NAME_DUPLICATE)));
+ xWarn->run();
+ m_xEdtName->grab_focus();
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/diactrl.cxx b/sd/source/ui/dlg/diactrl.cxx
new file mode 100644
index 000000000..233550809
--- /dev/null
+++ b/sd/source/ui/dlg/diactrl.cxx
@@ -0,0 +1,185 @@
+/* -*- 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 <comphelper/propertyvalue.hxx>
+#include <vcl/fieldvalues.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/toolbox.hxx>
+#include <svl/intitem.hxx>
+
+#include <strings.hrc>
+
+#include <diactrl.hxx>
+
+#include <sdresid.hxx>
+#include <app.hrc>
+
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/frame/XFrame.hpp>
+
+using namespace ::com::sun::star;
+
+SFX_IMPL_TOOLBOX_CONTROL( SdTbxCtlDiaPages, SfxUInt16Item )
+
+namespace
+{
+ OUString format_number(int nSlides)
+ {
+ OUString aSlides(SdResId(STR_SLIDES, nSlides));
+ return aSlides.replaceFirst("%1", OUString::number(nSlides));
+ }
+}
+
+// SdPagesField
+SdPagesField::SdPagesField( vcl::Window* pParent,
+ const uno::Reference< frame::XFrame >& rFrame )
+ : InterimItemWindow(pParent, "modules/simpress/ui/pagesfieldbox.ui", "PagesFieldBox")
+ , m_xWidget(m_xBuilder->weld_spin_button("pagesfield"))
+ , m_xFrame(rFrame)
+{
+ InitControlBase(m_xWidget.get());
+
+ // set parameter of MetricFields
+ m_xWidget->set_digits(0);
+ m_xWidget->set_range(1, 15);
+ m_xWidget->set_increments(1, 5);
+ m_xWidget->connect_value_changed(LINK(this, SdPagesField, ModifyHdl));
+ m_xWidget->connect_output(LINK(this, SdPagesField, OutputHdl));
+ m_xWidget->connect_input(LINK(this, SdPagesField, spin_button_input));
+ m_xWidget->connect_key_press(LINK(this, SdPagesField, KeyInputHdl));
+
+ auto width = std::max(m_xWidget->get_pixel_size(format_number(1)).Width(),
+ m_xWidget->get_pixel_size(format_number(15)).Width());
+ int chars = ceil(width / m_xWidget->get_approximate_digit_width());
+ m_xWidget->set_width_chars(chars);
+
+ SetSizePixel(m_xWidget->get_preferred_size());
+}
+
+IMPL_LINK(SdPagesField, KeyInputHdl, const KeyEvent&, rKEvt, bool)
+{
+ return ChildKeyInput(rKEvt);
+}
+
+void SdPagesField::dispose()
+{
+ m_xWidget.reset();
+ InterimItemWindow::dispose();
+}
+
+SdPagesField::~SdPagesField()
+{
+ disposeOnce();
+}
+
+void SdPagesField::set_sensitive(bool bSensitive)
+{
+ Enable(bSensitive);
+ m_xWidget->set_sensitive(bSensitive);
+ if (!bSensitive)
+ m_xWidget->set_text("");
+}
+
+void SdPagesField::UpdatePagesField( const SfxUInt16Item* pItem )
+{
+ if (pItem)
+ m_xWidget->set_value(pItem->GetValue());
+ else
+ m_xWidget->set_text(OUString());
+}
+
+IMPL_STATIC_LINK(SdPagesField, OutputHdl, weld::SpinButton&, rSpinButton, void)
+{
+ rSpinButton.set_text(format_number(rSpinButton.get_value()));
+}
+
+IMPL_LINK(SdPagesField, spin_button_input, int*, result, bool)
+{
+ const LocaleDataWrapper& rLocaleData = Application::GetSettings().GetLocaleDataWrapper();
+ double fResult(0.0);
+ bool bRet = vcl::TextToValue(m_xWidget->get_text(), fResult, 0, m_xWidget->get_digits(), rLocaleData, FieldUnit::NONE);
+ if (bRet)
+ {
+ if (fResult > SAL_MAX_INT32)
+ fResult = SAL_MAX_INT32;
+ else if (fResult < SAL_MIN_INT32)
+ fResult = SAL_MIN_INT32;
+ *result = fResult;
+ }
+ return bRet;
+}
+
+IMPL_LINK_NOARG(SdPagesField, ModifyHdl, weld::SpinButton&, void)
+{
+ SfxUInt16Item aItem(SID_PAGES_PER_ROW, m_xWidget->get_value());
+
+ uno::Any a;
+ aItem.QueryValue( a );
+ uno::Sequence< beans::PropertyValue > aArgs{ comphelper::makePropertyValue("PagesPerRow", a) };
+ SfxToolBoxControl::Dispatch( ::uno::Reference< ::frame::XDispatchProvider >( m_xFrame->getController(), ::uno::UNO_QUERY ),
+ ".uno:PagesPerRow",
+ aArgs );
+}
+
+SdTbxCtlDiaPages::SdTbxCtlDiaPages( sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx ) :
+ SfxToolBoxControl( nSlotId, nId, rTbx )
+{
+}
+
+SdTbxCtlDiaPages::~SdTbxCtlDiaPages()
+{
+}
+
+void SdTbxCtlDiaPages::StateChangedAtToolBoxControl( sal_uInt16,
+ SfxItemState eState, const SfxPoolItem* pState )
+{
+ SdPagesField* pFld = static_cast<SdPagesField*>( GetToolBox().GetItemWindow( GetId() ) );
+ DBG_ASSERT( pFld, "Window not found" );
+
+ if ( eState == SfxItemState::DISABLED )
+ {
+ pFld->set_sensitive(false);
+ }
+ else
+ {
+ pFld->set_sensitive(true);
+
+ const SfxUInt16Item* pItem = nullptr;
+ if ( eState == SfxItemState::DEFAULT )
+ {
+ pItem = dynamic_cast< const SfxUInt16Item* >( pState );
+ DBG_ASSERT( pItem, "sd::SdTbxCtlDiaPages::StateChanged(), wrong item type!" );
+ }
+
+ pFld->UpdatePagesField( pItem );
+ }
+}
+
+VclPtr<InterimItemWindow> SdTbxCtlDiaPages::CreateItemWindow( vcl::Window* pParent )
+{
+ VclPtr<SdPagesField> pWindow = VclPtr<SdPagesField>::Create(pParent, m_xFrame);
+ pWindow->Show();
+
+ return pWindow;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/dlgchar.cxx b/sd/source/ui/dlg/dlgchar.cxx
new file mode 100644
index 000000000..df1b24179
--- /dev/null
+++ b/sd/source/ui/dlg/dlgchar.cxx
@@ -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/.
+ *
+ * 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 <svx/dialogs.hrc>
+#include <editeng/flstitem.hxx>
+#include <svx/flagsdef.hxx>
+#include <sfx2/objsh.hxx>
+#include <sfx2/sfxdlg.hxx>
+
+#include <dlg_char.hxx>
+#include <svx/svxids.hrc>
+#include <svl/intitem.hxx>
+
+/**
+ * Constructor of tab dialog: append pages to dialog
+ */
+SdCharDlg::SdCharDlg(weld::Window* pParent, const SfxItemSet* pAttr,
+ const SfxObjectShell* pDocShell)
+ : SfxTabDialogController(pParent, "modules/sdraw/ui/drawchardialog.ui",
+ "DrawCharDialog", pAttr)
+ , rDocShell(*pDocShell)
+{
+ SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
+
+ AddTabPage("RID_SVXPAGE_CHAR_NAME", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_CHAR_NAME), nullptr);
+ AddTabPage("RID_SVXPAGE_CHAR_EFFECTS", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_CHAR_EFFECTS), nullptr);
+ AddTabPage("RID_SVXPAGE_CHAR_POSITION", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_CHAR_POSITION), nullptr);
+ AddTabPage("RID_SVXPAGE_BKG", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_BKG), nullptr);
+}
+
+void SdCharDlg::PageCreated(const OString& rId, SfxTabPage &rPage)
+{
+ SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool()));
+ if (rId == "RID_SVXPAGE_CHAR_NAME")
+ {
+ SvxFontListItem aItem(* static_cast<const SvxFontListItem*>( rDocShell.GetItem( SID_ATTR_CHAR_FONTLIST) ) );
+
+ aSet.Put (SvxFontListItem( aItem.GetFontList(), SID_ATTR_CHAR_FONTLIST));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "RID_SVXPAGE_CHAR_EFFECTS")
+ {
+ // Opt in for character transparency.
+ aSet.Put(SfxUInt32Item(SID_FLAG_TYPE, SVX_ENABLE_CHAR_TRANSPARENCY));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "RID_SVXPAGE_BKG")
+ {
+ aSet.Put(SfxUInt32Item(SID_FLAG_TYPE,static_cast<sal_uInt32>(SvxBackgroundTabFlags::SHOW_CHAR_BKGCOLOR)));
+ rPage.PageCreated(aSet);
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/dlgfield.cxx b/sd/source/ui/dlg/dlgfield.cxx
new file mode 100644
index 000000000..75263a17c
--- /dev/null
+++ b/sd/source/ui/dlg/dlgfield.cxx
@@ -0,0 +1,301 @@
+/* -*- 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 <editeng/eeitem.hxx>
+#include <editeng/flditem.hxx>
+#include <sfx2/objsh.hxx>
+#include <sfx2/docfile.hxx>
+#include <svl/itemset.hxx>
+#include <svx/langbox.hxx>
+#include <editeng/langitem.hxx>
+#include <unotools/useroptions.hxx>
+
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <sdmod.hxx>
+#include <dlgfield.hxx>
+#include <DrawDocShell.hxx>
+
+/**
+ * dialog to edit field commands
+ */
+SdModifyFieldDlg::SdModifyFieldDlg(weld::Window* pWindow, const SvxFieldData* pInField, const SfxItemSet& rSet)
+ : GenericDialogController(pWindow, "modules/simpress/ui/dlgfield.ui", "EditFieldsDialog")
+ , m_aInputSet(rSet)
+ , m_pField(pInField)
+ , m_xRbtFix(m_xBuilder->weld_radio_button("fixedRB"))
+ , m_xRbtVar(m_xBuilder->weld_radio_button("varRB"))
+ , m_xLbLanguage(new SvxLanguageBox(m_xBuilder->weld_combo_box("languageLB")))
+ , m_xLbFormat(m_xBuilder->weld_combo_box("formatLB"))
+{
+ m_xLbLanguage->SetLanguageList( SvxLanguageListFlags::ALL|SvxLanguageListFlags::ONLY_KNOWN, false );
+ m_xLbLanguage->connect_changed(LINK(this, SdModifyFieldDlg, LanguageChangeHdl));
+ FillControls();
+}
+
+SdModifyFieldDlg::~SdModifyFieldDlg()
+{
+}
+
+/**
+ * Returns the new field, owned by caller.
+ * Returns NULL if nothing has changed.
+ */
+SvxFieldData* SdModifyFieldDlg::GetField()
+{
+ SvxFieldData* pNewField = nullptr;
+
+ if( m_xRbtFix->get_state_changed_from_saved() ||
+ m_xRbtVar->get_state_changed_from_saved() ||
+ m_xLbFormat->get_value_changed_from_saved() )
+ {
+ if( auto pDateField = dynamic_cast< const SvxDateField *>( m_pField ) )
+ {
+ SvxDateType eType;
+ SvxDateFormat eFormat;
+
+ if( m_xRbtFix->get_active() )
+ eType = SvxDateType::Fix;
+ else
+ eType = SvxDateType::Var;
+
+ eFormat = static_cast<SvxDateFormat>( m_xLbFormat->get_active() + 2 );
+
+ pNewField = new SvxDateField( *pDateField );
+ static_cast<SvxDateField*>( pNewField )->SetType( eType );
+ static_cast<SvxDateField*>( pNewField )->SetFormat( eFormat );
+ }
+ else if( auto pTimeField = dynamic_cast< const SvxExtTimeField *>( m_pField ) )
+ {
+ SvxTimeType eType;
+ SvxTimeFormat eFormat;
+
+ if( m_xRbtFix->get_active() )
+ eType = SvxTimeType::Fix;
+ else
+ eType = SvxTimeType::Var;
+
+ eFormat = static_cast<SvxTimeFormat>( m_xLbFormat->get_active() + 2 );
+
+ pNewField = new SvxExtTimeField( *pTimeField );
+ static_cast<SvxExtTimeField*>( pNewField )->SetType( eType );
+ static_cast<SvxExtTimeField*>( pNewField )->SetFormat( eFormat );
+ }
+ else if( dynamic_cast< const SvxExtFileField *>( m_pField ) != nullptr )
+ {
+ SvxFileType eType;
+ SvxFileFormat eFormat;
+
+ if( m_xRbtFix->get_active() )
+ eType = SvxFileType::Fix;
+ else
+ eType = SvxFileType::Var;
+
+ eFormat = static_cast<SvxFileFormat>( m_xLbFormat->get_active() );
+
+ ::sd::DrawDocShell* pDocSh = dynamic_cast< ::sd::DrawDocShell* >(SfxObjectShell::Current() );
+
+ if( pDocSh )
+ {
+ OUString aName;
+ if( pDocSh->HasName() )
+ aName = pDocSh->GetMedium()->GetName();
+
+ // Get current filename, not the one stored in the old field
+ pNewField = new SvxExtFileField( aName );
+ static_cast<SvxExtFileField*>( pNewField )->SetType( eType );
+ static_cast<SvxExtFileField*>( pNewField )->SetFormat( eFormat );
+ }
+ }
+ else if( dynamic_cast< const SvxAuthorField *>( m_pField ) != nullptr )
+ {
+ SvxAuthorType eType;
+ SvxAuthorFormat eFormat;
+
+ if( m_xRbtFix->get_active() )
+ eType = SvxAuthorType::Fix;
+ else
+ eType = SvxAuthorType::Var;
+
+ eFormat = static_cast<SvxAuthorFormat>( m_xLbFormat->get_active() );
+
+ // Get current state of address, not the old one
+ SvtUserOptions aUserOptions;
+ pNewField = new SvxAuthorField( aUserOptions.GetFirstName(), aUserOptions.GetLastName(), aUserOptions.GetID() );
+ static_cast<SvxAuthorField*>( pNewField )->SetType( eType );
+ static_cast<SvxAuthorField*>( pNewField )->SetFormat( eFormat );
+ }
+ }
+
+ return pNewField;
+}
+
+void SdModifyFieldDlg::FillFormatList()
+{
+ LanguageType eLangType = m_xLbLanguage->get_active_id();
+
+ m_xLbFormat->clear();
+
+ if( auto pDateField = dynamic_cast< const SvxDateField *>( m_pField ) )
+ {
+ SvxDateField aDateField( *pDateField );
+
+ //SvxDateFormat::AppDefault, // not used
+ //SvxDateFormat::System, // not used
+ m_xLbFormat->append_text( SdResId( STR_STANDARD_SMALL ) );
+ m_xLbFormat->append_text( SdResId( STR_STANDARD_BIG ) );
+
+ SvNumberFormatter* pNumberFormatter = SD_MOD()->GetNumberFormatter();
+ aDateField.SetFormat( SvxDateFormat::A ); // 13.02.96
+ m_xLbFormat->append_text( aDateField.GetFormatted( *pNumberFormatter, eLangType ) );
+ aDateField.SetFormat( SvxDateFormat::B ); // 13.02.1996
+ m_xLbFormat->append_text( aDateField.GetFormatted( *pNumberFormatter, eLangType ) );
+ aDateField.SetFormat( SvxDateFormat::C ); // 13.Feb 1996
+ m_xLbFormat->append_text( aDateField.GetFormatted( *pNumberFormatter, eLangType ) );
+ aDateField.SetFormat( SvxDateFormat::D ); // 13.Februar 1996
+ m_xLbFormat->append_text( aDateField.GetFormatted( *pNumberFormatter, eLangType ) );
+ aDateField.SetFormat( SvxDateFormat::E ); // Die, 13.Februar 1996
+ m_xLbFormat->append_text( aDateField.GetFormatted( *pNumberFormatter, eLangType ) );
+ aDateField.SetFormat( SvxDateFormat::F ); // Dienstag, 13.Februar 1996
+ m_xLbFormat->append_text( aDateField.GetFormatted( *pNumberFormatter, eLangType ) );
+
+ m_xLbFormat->set_active( static_cast<sal_uInt16>(pDateField->GetFormat()) - 2 );
+ }
+ else if( auto pTimeField = dynamic_cast< const SvxExtTimeField *>( m_pField ) )
+ {
+ SvxExtTimeField aTimeField( *pTimeField );
+
+ //SvxTimeFormat::AppDefault, // not used
+ //SvxTimeFormat::System, // not used
+ m_xLbFormat->append_text( SdResId( STR_STANDARD_NORMAL ) );
+
+ SvNumberFormatter* pNumberFormatter = SD_MOD()->GetNumberFormatter();
+ aTimeField.SetFormat( SvxTimeFormat::HH24_MM ); // 13:49
+ m_xLbFormat->append_text( aTimeField.GetFormatted( *pNumberFormatter, eLangType ) );
+ aTimeField.SetFormat( SvxTimeFormat::HH24_MM_SS ); // 13:49:38
+ m_xLbFormat->append_text( aTimeField.GetFormatted( *pNumberFormatter, eLangType ) );
+ aTimeField.SetFormat( SvxTimeFormat::HH24_MM_SS_00 ); // 13:49:38.78
+ m_xLbFormat->append_text( aTimeField.GetFormatted( *pNumberFormatter, eLangType ) );
+ aTimeField.SetFormat( SvxTimeFormat::HH12_MM ); // 01:49
+ m_xLbFormat->append_text( aTimeField.GetFormatted( *pNumberFormatter, eLangType ) );
+ aTimeField.SetFormat( SvxTimeFormat::HH12_MM_SS ); // 01:49:38
+ m_xLbFormat->append_text( aTimeField.GetFormatted( *pNumberFormatter, eLangType ) );
+ aTimeField.SetFormat( SvxTimeFormat::HH12_MM_SS_00 ); // 01:49:38.78
+ m_xLbFormat->append_text( aTimeField.GetFormatted( *pNumberFormatter, eLangType ) );
+ //SvxTimeFormat::HH12_MM_AMPM, // 01:49 PM
+ //SvxTimeFormat::HH12_MM_SS_AMPM, // 01:49:38 PM
+ //SvxTimeFormat::HH12_MM_SS_00_AMPM // 01:49:38.78 PM
+
+ m_xLbFormat->set_active( static_cast<sal_uInt16>(pTimeField->GetFormat()) - 2 );
+ }
+ else if( auto pFileField = dynamic_cast< const SvxExtFileField *>( m_pField ) )
+ {
+ m_xLbFormat->append_text( SdResId( STR_FILEFORMAT_NAME_EXT ) );
+ m_xLbFormat->append_text( SdResId( STR_FILEFORMAT_FULLPATH ) );
+ m_xLbFormat->append_text( SdResId( STR_FILEFORMAT_PATH ) );
+ m_xLbFormat->append_text( SdResId( STR_FILEFORMAT_NAME ) );
+
+ m_xLbFormat->set_active( static_cast<sal_uInt16>( pFileField->GetFormat() ) );
+ }
+ else if( auto pAuthorField = dynamic_cast< const SvxAuthorField *>( m_pField ) )
+ {
+ SvxAuthorField aAuthorField( *pAuthorField );
+
+ for( sal_uInt16 i = 0; i < 4; i++ )
+ {
+ aAuthorField.SetFormat( static_cast<SvxAuthorFormat>(i) );
+ m_xLbFormat->append_text( aAuthorField.GetFormatted() );
+ }
+
+ m_xLbFormat->set_active( static_cast<sal_uInt16>( pAuthorField->GetFormat() ) );
+
+ }
+
+}
+
+void SdModifyFieldDlg::FillControls()
+{
+ m_xLbFormat->clear();
+
+ if( auto pDateField = dynamic_cast< const SvxDateField *>( m_pField ) )
+ {
+ if( pDateField->GetType() == SvxDateType::Fix )
+ m_xRbtFix->set_active(true);
+ else
+ m_xRbtVar->set_active(true);
+ }
+ else if( auto pTimeField = dynamic_cast< const SvxExtTimeField *>( m_pField ) )
+ {
+ if( pTimeField->GetType() == SvxTimeType::Fix )
+ m_xRbtFix->set_active(true);
+ else
+ m_xRbtVar->set_active(true);
+ }
+ else if( auto pFileField = dynamic_cast< const SvxExtFileField *>( m_pField ) )
+ {
+ if( pFileField->GetType() == SvxFileType::Fix )
+ m_xRbtFix->set_active(true);
+ else
+ m_xRbtVar->set_active(true);
+ }
+ else if( auto pAuthorField = dynamic_cast< const SvxAuthorField *>( m_pField ) )
+ {
+ if( pAuthorField->GetType() == SvxAuthorType::Fix )
+ m_xRbtFix->set_active(true);
+ else
+ m_xRbtVar->set_active(true);
+ }
+ m_xRbtFix->save_state();
+ m_xRbtVar->save_state();
+
+ if( const SvxLanguageItem* pItem = m_aInputSet.GetItemIfSet(EE_CHAR_LANGUAGE ) )
+ m_xLbLanguage->set_active_id(pItem->GetLanguage());
+
+ m_xLbLanguage->save_active_id();
+
+ FillFormatList();
+ m_xLbFormat->save_value();
+}
+
+IMPL_LINK_NOARG(SdModifyFieldDlg, LanguageChangeHdl, weld::ComboBox&, void)
+{
+ FillFormatList();
+}
+
+SfxItemSet SdModifyFieldDlg::GetItemSet() const
+{
+ SfxItemSet aOutput( *m_aInputSet.GetPool(), svl::Items<EE_CHAR_LANGUAGE, EE_CHAR_LANGUAGE_CTL> );
+
+ if (m_xLbLanguage->get_active_id_changed_from_saved())
+ {
+ LanguageType eLangType = m_xLbLanguage->get_active_id();
+ SvxLanguageItem aItem( eLangType, EE_CHAR_LANGUAGE );
+ aOutput.Put( aItem );
+
+ SvxLanguageItem aItemCJK( eLangType, EE_CHAR_LANGUAGE_CJK );
+ aOutput.Put( aItemCJK );
+
+ SvxLanguageItem aItemCTL( eLangType, EE_CHAR_LANGUAGE_CTL );
+ aOutput.Put( aItemCTL );
+ }
+
+ return aOutput;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/dlgolbul.cxx b/sd/source/ui/dlg/dlgolbul.cxx
new file mode 100644
index 000000000..41c00efa8
--- /dev/null
+++ b/sd/source/ui/dlg/dlgolbul.cxx
@@ -0,0 +1,172 @@
+/* -*- 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 <memory>
+#include <OutlineBulletDlg.hxx>
+
+#include <svx/svxids.hrc>
+#include <editeng/eeitem.hxx>
+
+#include <editeng/numitem.hxx>
+
+#include <tools/debug.hxx>
+#include <svx/dialogs.hrc>
+#include <svx/svdmark.hxx>
+#include <View.hxx>
+#include <svx/svdobj.hxx>
+#include <svl/style.hxx>
+#include <svl/intitem.hxx>
+#include <drawdoc.hxx>
+
+#include <strings.hxx>
+#include <bulmaper.hxx>
+#include <DrawDocShell.hxx>
+
+namespace sd {
+
+/**
+ * Constructor of tab dialog: append pages to the dialog
+ */
+OutlineBulletDlg::OutlineBulletDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView)
+ : SfxTabDialogController(pParent, "modules/sdraw/ui/bulletsandnumbering.ui", "BulletsAndNumberingDialog")
+ , m_aInputSet(*pAttr)
+ , m_bTitle(false)
+ , m_pSdView(pView)
+{
+ m_aInputSet.MergeRange(SID_PARAM_NUM_PRESET, SID_PARAM_CUR_NUM_LEVEL);
+ m_aInputSet.Put(*pAttr);
+
+ m_xOutputSet.reset( new SfxItemSet( *pAttr ) );
+ m_xOutputSet->ClearItem();
+
+ bool bOutliner = false;
+
+ // special treatment if a title object is selected
+ if (pView)
+ {
+ const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
+ const size_t nCount = rMarkList.GetMarkCount();
+ for(size_t nNum = 0; nNum < nCount; ++nNum)
+ {
+ SdrObject* pObj = rMarkList.GetMark(nNum)->GetMarkedSdrObj();
+ if( pObj->GetObjInventor() == SdrInventor::Default )
+ {
+ switch(pObj->GetObjIdentifier())
+ {
+ case SdrObjKind::TitleText:
+ m_bTitle = true;
+ break;
+ case SdrObjKind::OutlineText:
+ bOutliner = true;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ if( SfxItemState::SET != m_aInputSet.GetItemState(EE_PARA_NUMBULLET))
+ {
+ const SvxNumBulletItem *pItem = nullptr;
+ if(bOutliner)
+ {
+ SfxStyleSheetBasePool* pSSPool = pView->GetDocSh()->GetStyleSheetPool();
+ SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( STR_LAYOUT_OUTLINE + " 1", SfxStyleFamily::Pseudo);
+ if( pFirstStyleSheet )
+ pItem = pFirstStyleSheet->GetItemSet().GetItemIfSet(EE_PARA_NUMBULLET, false);
+ }
+
+ if( pItem == nullptr )
+ pItem = m_aInputSet.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET);
+
+ DBG_ASSERT( pItem, "No EE_PARA_NUMBULLET in Pool! [CL]" );
+
+ m_aInputSet.Put(pItem->CloneSetWhich(EE_PARA_NUMBULLET));
+ }
+
+ if (m_bTitle && m_aInputSet.GetItemState(EE_PARA_NUMBULLET) == SfxItemState::SET )
+ {
+ const SvxNumBulletItem* pItem = m_aInputSet.GetItem<SvxNumBulletItem>(EE_PARA_NUMBULLET);
+ const SvxNumRule& rRule = pItem->GetNumRule();
+ SvxNumRule aNewRule( rRule );
+ aNewRule.SetFeatureFlag( SvxNumRuleFlags::NO_NUMBERS );
+
+ SvxNumBulletItem aNewItem( std::move(aNewRule), EE_PARA_NUMBULLET );
+ m_aInputSet.Put(aNewItem);
+ }
+
+ SetInputSet(&m_aInputSet);
+
+ if (m_bTitle)
+ RemoveTabPage("singlenum");
+
+ AddTabPage("customize", RID_SVXPAGE_NUM_OPTIONS);
+ AddTabPage("position", RID_SVXPAGE_NUM_POSITION);
+}
+
+OutlineBulletDlg::~OutlineBulletDlg()
+{
+}
+
+void OutlineBulletDlg::PageCreated(const OString& rId, SfxTabPage &rPage)
+{
+ if (!m_pSdView)
+ return;
+ if (rId == "customize")
+ {
+ FieldUnit eMetric = m_pSdView->GetDoc().GetUIUnit();
+ SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool()));
+ aSet.Put ( SfxUInt16Item(SID_METRIC_ITEM,static_cast<sal_uInt16>(eMetric)));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "position")
+ {
+ FieldUnit eMetric = m_pSdView->GetDoc().GetUIUnit();
+ SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool()));
+ aSet.Put ( SfxUInt16Item(SID_METRIC_ITEM,static_cast<sal_uInt16>(eMetric)));
+ rPage.PageCreated(aSet);
+ }
+}
+
+const SfxItemSet* OutlineBulletDlg::GetBulletOutputItemSet() const
+{
+ SfxItemSet aSet(*GetOutputItemSet());
+ m_xOutputSet->Put(aSet);
+
+ const SfxPoolItem *pItem = nullptr;
+ if( SfxItemState::SET == m_xOutputSet->GetItemState(m_xOutputSet->GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE), false, &pItem ))
+ {
+ SdBulletMapper::MapFontsInNumRule(const_cast<SvxNumRule&>(static_cast<const SvxNumBulletItem*>(pItem)->GetNumRule()), *m_xOutputSet);
+ // #i35937 - removed EE_PARA_BULLETSTATE setting
+ }
+
+ if (m_bTitle && m_xOutputSet->GetItemState(EE_PARA_NUMBULLET) == SfxItemState::SET)
+ {
+ const SvxNumBulletItem* pBulletItem = m_xOutputSet->GetItem<SvxNumBulletItem>(EE_PARA_NUMBULLET);
+ SvxNumRule& rRule = const_cast<SvxNumRule&>(pBulletItem->GetNumRule());
+ rRule.SetFeatureFlag( SvxNumRuleFlags::NO_NUMBERS, false );
+ }
+
+ return m_xOutputSet.get();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/dlgpage.cxx b/sd/source/ui/dlg/dlgpage.cxx
new file mode 100644
index 000000000..e3bc5978b
--- /dev/null
+++ b/sd/source/ui/dlg/dlgpage.cxx
@@ -0,0 +1,116 @@
+/* -*- 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 <svl/intitem.hxx>
+#include <svx/dialogs.hrc>
+#include <svx/svxids.hrc>
+#include <svx/drawitem.hxx>
+#include <i18nutil/paper.hxx>
+#include <sfx2/objsh.hxx>
+#include <sfx2/sfxdlg.hxx>
+
+#include <dlgpage.hxx>
+#include <sdresid.hxx>
+#include <strings.hrc>
+
+#include <svl/eitem.hxx>
+#include <svx/flagsdef.hxx>
+
+/**
+ * Constructor of tab dialog: appends pages to the dialog
+ */
+SdPageDlg::SdPageDlg(SfxObjectShell const* pDocSh, weld::Window* pParent, const SfxItemSet* pAttr,
+ bool bAreaPage, bool bIsImpressDoc, bool bIsImpressMaster)
+ : SfxTabDialogController(pParent, "modules/sdraw/ui/drawpagedialog.ui", "DrawPageDialog", pAttr)
+ , mbIsImpressDoc(bIsImpressDoc)
+{
+ SvxColorListItem const* pColorListItem = pDocSh->GetItem(SID_COLOR_TABLE);
+ SvxGradientListItem const* pGradientListItem = pDocSh->GetItem(SID_GRADIENT_LIST);
+ SvxBitmapListItem const* pBitmapListItem = pDocSh->GetItem(SID_BITMAP_LIST);
+ SvxPatternListItem const* pPatternListItem = pDocSh->GetItem(SID_PATTERN_LIST);
+ SvxHatchListItem const* pHatchListItem = pDocSh->GetItem(SID_HATCH_LIST);
+
+ mpColorList = pColorListItem->GetColorList();
+ mpGradientList = pGradientListItem->GetGradientList();
+ mpHatchingList = pHatchListItem->GetHatchList();
+ mpBitmapList = pBitmapListItem->GetBitmapList();
+ mpPatternList = pPatternListItem->GetPatternList();
+
+ SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
+
+ AddTabPage("RID_SVXPAGE_PAGE", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_PAGE), nullptr);
+ AddTabPage("RID_SVXPAGE_AREA", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_AREA), nullptr);
+ AddTabPage("RID_SVXPAGE_TRANSPARENCE", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_TRANSPARENCE),
+ nullptr);
+ AddTabPage("RID_SVXPAGE_THEME", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_THEME), nullptr);
+
+ if (!bAreaPage) // I have to add the page before I remove it !
+ {
+ RemoveTabPage("RID_SVXPAGE_AREA");
+ RemoveTabPage("RID_SVXPAGE_TRANSPARENCE");
+ }
+
+ if (!bIsImpressMaster)
+ {
+ // Only slide masters can have a theme.
+ RemoveTabPage("RID_SVXPAGE_THEME");
+ }
+
+ if (mbIsImpressDoc)
+ {
+ set_title(SdResId(STR_SLIDE_SETUP_TITLE));
+ m_xTabCtrl->set_tab_label_text("RID_SVXPAGE_PAGE", SdResId(STR_SLIDE_NAME));
+ }
+}
+
+void SdPageDlg::PageCreated(const OString& rId, SfxTabPage& rPage)
+{
+ SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool()));
+ if (rId == "RID_SVXPAGE_PAGE")
+ {
+ aSet.Put(SfxUInt16Item(sal_uInt16(SID_ENUM_PAGE_MODE), SVX_PAGE_MODE_PRESENTATION));
+ aSet.Put(SfxUInt16Item(SID_PAPER_START, PAPER_A0));
+ aSet.Put(SfxUInt16Item(SID_PAPER_END, PAPER_E));
+
+ if (mbIsImpressDoc)
+ aSet.Put(SfxBoolItem(SID_IMPRESS_DOC, true));
+
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "RID_SVXPAGE_AREA")
+ {
+ aSet.Put(SvxColorListItem(mpColorList, SID_COLOR_TABLE));
+ aSet.Put(SvxGradientListItem(mpGradientList, SID_GRADIENT_LIST));
+ aSet.Put(SvxHatchListItem(mpHatchingList, SID_HATCH_LIST));
+ aSet.Put(SvxBitmapListItem(mpBitmapList, SID_BITMAP_LIST));
+ aSet.Put(SvxPatternListItem(mpPatternList, SID_PATTERN_LIST));
+ aSet.Put(SfxUInt16Item(SID_PAGE_TYPE, 0));
+ aSet.Put(SfxUInt16Item(SID_DLG_TYPE, 1));
+ aSet.Put(SfxUInt16Item(SID_TABPAGE_POS, 0));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "RID_SVXPAGE_TRANSPARENCE")
+ {
+ aSet.Put(SfxUInt16Item(SID_PAGE_TYPE, 0));
+ aSet.Put(SfxUInt16Item(SID_DLG_TYPE, 1));
+ rPage.PageCreated(aSet);
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/dlgsnap.cxx b/sd/source/ui/dlg/dlgsnap.cxx
new file mode 100644
index 000000000..9b1383089
--- /dev/null
+++ b/sd/source/ui/dlg/dlgsnap.cxx
@@ -0,0 +1,185 @@
+/* -*- 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 <svx/svxids.hrc>
+#include <svx/svdpagv.hxx>
+#include <svl/intitem.hxx>
+#include <svl/itempool.hxx>
+#include <svtools/unitconv.hxx>
+#include <tools/debug.hxx>
+
+#include <sdattr.hrc>
+#include <View.hxx>
+#include <drawdoc.hxx>
+#include <dlgsnap.hxx>
+#include <sdenumdef.hxx>
+
+/**
+ * dialog to adjust grid (scarcely ESO!)
+ */
+SdSnapLineDlg::SdSnapLineDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, ::sd::View const * pView)
+ : GenericDialogController(pWindow, "modules/sdraw/ui/dlgsnap.ui", "SnapObjectDialog")
+ , aUIScale(pView->GetDoc().GetUIScale())
+ , m_xFtX(m_xBuilder->weld_label("xlabel"))
+ , m_xMtrFldX(m_xBuilder->weld_metric_spin_button("x", FieldUnit::CM))
+ , m_xFtY(m_xBuilder->weld_label("ylabel"))
+ , m_xMtrFldY(m_xBuilder->weld_metric_spin_button("y", FieldUnit::CM))
+ , m_xRadioGroup(m_xBuilder->weld_widget("radiogroup"))
+ , m_xRbPoint(m_xBuilder->weld_radio_button("point"))
+ , m_xRbVert(m_xBuilder->weld_radio_button("vert"))
+ , m_xRbHorz(m_xBuilder->weld_radio_button("horz"))
+ , m_xBtnDelete(m_xBuilder->weld_button("delete"))
+{
+ m_xRbHorz->connect_toggled(LINK(this, SdSnapLineDlg, ToggleHdl));
+ m_xRbVert->connect_toggled(LINK(this, SdSnapLineDlg, ToggleHdl));
+ m_xRbPoint->connect_toggled(LINK(this, SdSnapLineDlg, ToggleHdl));
+
+ m_xBtnDelete->connect_clicked(LINK(this, SdSnapLineDlg, ClickHdl));
+
+ FieldUnit eUIUnit = pView->GetDoc().GetUIUnit();
+ SetFieldUnit(*m_xMtrFldX, eUIUnit, true);
+ SetFieldUnit(*m_xMtrFldY, eUIUnit, true);
+
+ // get WorkArea
+ ::tools::Rectangle aWorkArea = pView->GetWorkArea();
+
+ // determine PoolUnit
+ SfxItemPool* pPool = rInAttrs.GetPool();
+ DBG_ASSERT( pPool, "Where's the Pool?" );
+ MapUnit ePoolUnit = pPool->GetMetric( SID_ATTR_FILL_HATCH );
+
+ // #i48497# Consider page origin
+ SdrPageView* pPV = pView->GetSdrPageView();
+ Point aLeftTop(aWorkArea.Left()+1, aWorkArea.Top()+1);
+ pPV->LogicToPagePos(aLeftTop);
+ Point aRightBottom(aWorkArea.Right()-2, aWorkArea.Bottom()-2);
+ pPV->LogicToPagePos(aRightBottom);
+
+ // determine max and min values depending on
+ // WorkArea, PoolUnit and FieldUnit:
+ auto const map = [ePoolUnit](std::unique_ptr<weld::MetricSpinButton> const & msb, tools::Long value) {
+ auto const n1 = OutputDevice::LogicToLogic(value, ePoolUnit, MapUnit::Map100thMM);
+ auto const n2 = msb->normalize(n1);
+ auto const n3 = msb->convert_value_from(n2, FieldUnit::MM_100TH);
+ auto const n4 = msb->convert_value_to(n3, FieldUnit::NONE);
+ return n4;
+ };
+ m_xMtrFldX->set_range(map(m_xMtrFldX, sal_Int32(aLeftTop.X() / aUIScale)),
+ map(m_xMtrFldX, sal_Int32(aRightBottom.X() / aUIScale)),
+ FieldUnit::NONE);
+ m_xMtrFldY->set_range(map(m_xMtrFldY, sal_Int32(aLeftTop.Y() / aUIScale)),
+ map(m_xMtrFldY, sal_Int32(aRightBottom.Y() / aUIScale)),
+ FieldUnit::NONE);
+
+ // set values
+ nXValue = static_cast<const SfxInt32Item&>( rInAttrs.Get(ATTR_SNAPLINE_X)).GetValue();
+ nYValue = static_cast<const SfxInt32Item&>( rInAttrs.Get(ATTR_SNAPLINE_Y)).GetValue();
+ nXValue = sal_Int32(nXValue / aUIScale);
+ nYValue = sal_Int32(nYValue / aUIScale);
+ SetMetricValue(*m_xMtrFldX, nXValue, MapUnit::Map100thMM);
+ SetMetricValue(*m_xMtrFldY, nYValue, MapUnit::Map100thMM);
+
+ m_xRbPoint->set_active(true);
+}
+
+SdSnapLineDlg::~SdSnapLineDlg()
+{
+}
+
+/**
+ * fills provided item sets with dialog box attributes
+ */
+IMPL_LINK(SdSnapLineDlg, ToggleHdl, weld::Toggleable&, rBtn, void)
+{
+ if (!rBtn.get_active())
+ return;
+ if (m_xRbPoint->get_active())
+ SetInputFields(true, true);
+ else if (m_xRbHorz->get_active())
+ SetInputFields(false, true);
+ else if (m_xRbVert->get_active())
+ SetInputFields(true, false);
+}
+
+IMPL_LINK( SdSnapLineDlg, ClickHdl, weld::Button&, rBtn, void )
+{
+ if (&rBtn == m_xBtnDelete.get())
+ m_xDialog->response(RET_SNAP_DELETE);
+}
+
+/**
+ * fills provided item sets with dialog box attributes
+ */
+void SdSnapLineDlg::GetAttr(SfxItemSet& rOutAttrs)
+{
+ SnapKind eKind;
+
+ if (m_xRbHorz->get_active()) eKind = SnapKind::Horizontal;
+ else if (m_xRbVert->get_active()) eKind = SnapKind::Vertical;
+ else eKind = SnapKind::Point;
+
+ nXValue = sal_Int32(GetCoreValue(*m_xMtrFldX, MapUnit::Map100thMM) * aUIScale);
+ nYValue = sal_Int32(GetCoreValue(*m_xMtrFldY, MapUnit::Map100thMM) * aUIScale);
+
+ rOutAttrs.Put(SfxUInt16Item(ATTR_SNAPLINE_KIND, static_cast<sal_uInt16>(eKind)));
+ rOutAttrs.Put(SfxInt32Item(ATTR_SNAPLINE_X, nXValue));
+ rOutAttrs.Put(SfxInt32Item(ATTR_SNAPLINE_Y, nYValue));
+}
+
+void SdSnapLineDlg::HideRadioGroup()
+{
+ m_xRadioGroup->hide();
+}
+
+/**
+ * disable X or Y input fields
+ */
+void SdSnapLineDlg::SetInputFields(bool bEnableX, bool bEnableY)
+{
+ if ( bEnableX )
+ {
+ if (!m_xMtrFldX->get_sensitive())
+ m_xMtrFldX->set_value(nXValue, FieldUnit::NONE);
+ m_xMtrFldX->set_sensitive(true);
+ m_xFtX->set_sensitive(true);
+ }
+ else if (m_xMtrFldX->get_sensitive())
+ {
+ nXValue = m_xMtrFldX->get_value(FieldUnit::NONE);
+ m_xMtrFldX->set_text(OUString());
+ m_xMtrFldX->set_sensitive(false);
+ m_xFtX->set_sensitive(false);
+ }
+ if ( bEnableY )
+ {
+ if (!m_xMtrFldY->get_sensitive())
+ m_xMtrFldY->set_value(nYValue, FieldUnit::NONE);
+ m_xMtrFldY->set_sensitive(true);
+ m_xFtY->set_sensitive(true);
+ }
+ else if (m_xMtrFldY->get_sensitive())
+ {
+ nYValue = m_xMtrFldY->get_value(FieldUnit::NONE);
+ m_xMtrFldY->set_text(OUString());
+ m_xMtrFldY->set_sensitive(false);
+ m_xFtY->set_sensitive(false);
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/filedlg.cxx b/sd/source/ui/dlg/filedlg.cxx
new file mode 100644
index 000000000..b2087c408
--- /dev/null
+++ b/sd/source/ui/dlg/filedlg.cxx
@@ -0,0 +1,267 @@
+/* -*- 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 <config_features.h>
+
+#include <com/sun/star/media/XPlayer.hpp>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
+#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
+#include <com/sun/star/ui/dialogs/XFilePicker3.hpp>
+#include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
+#include <com/sun/star/ui/dialogs/FilePickerEvent.hpp>
+#include <vcl/idle.hxx>
+#include <osl/diagnose.h>
+#include <vcl/svapp.hxx>
+#include <sfx2/filedlghelper.hxx>
+#include <avmedia/mediawindow.hxx>
+#include <filedlg.hxx>
+#include <sdresid.hxx>
+#include <strings.hrc>
+
+// ----------- SdFileDialog_Imp ---------------------------
+
+class SdFileDialog_Imp : public sfx2::FileDialogHelper
+{
+private:
+ friend class SdOpenSoundFileDialog;
+
+ css::uno::Reference< css::ui::dialogs::XFilePickerControlAccess > mxControlAccess;
+
+ css::uno::Reference< css::media::XPlayer > mxPlayer;
+ ImplSVEvent * mnPlaySoundEvent;
+ bool mbLabelPlaying;
+ Idle maUpdateIdle;
+
+ DECL_LINK( PlayMusicHdl, void *, void );
+ DECL_LINK( IsMusicStoppedHdl, Timer *, void );
+
+public:
+ explicit SdFileDialog_Imp(weld::Window *pParent);
+ virtual ~SdFileDialog_Imp() override;
+
+ // overwritten from FileDialogHelper, to receive user feedback
+ virtual void ControlStateChanged( const css::ui::dialogs::FilePickerEvent& aEvent ) override;
+};
+
+void SdFileDialog_Imp::ControlStateChanged( const css::ui::dialogs::FilePickerEvent& aEvent )
+{
+ SolarMutexGuard aGuard;
+
+ switch( aEvent.ElementId )
+ {
+ case css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY:
+ if( mxControlAccess.is() )
+ {
+ if( mnPlaySoundEvent )
+ Application::RemoveUserEvent( mnPlaySoundEvent );
+
+ mnPlaySoundEvent = Application::PostUserEvent( LINK( this, SdFileDialog_Imp, PlayMusicHdl ) );
+ }
+ break;
+ }
+}
+
+IMPL_LINK_NOARG(SdFileDialog_Imp, PlayMusicHdl, void*, void)
+{
+ maUpdateIdle.Stop();
+ mnPlaySoundEvent = nullptr;
+
+ if (mxPlayer.is())
+ {
+ if (mxPlayer->isPlaying())
+ mxPlayer->stop();
+ mxPlayer.clear();
+ }
+
+#if HAVE_FEATURE_AVMEDIA
+ if( mbLabelPlaying )
+ {
+ try
+ {
+ mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
+ SdResId( STR_PLAY ) );
+ mbLabelPlaying = false;
+ }
+ catch(const css::lang::IllegalArgumentException&)
+ {
+#ifdef DBG_UTIL
+ OSL_FAIL( "Cannot access play button" );
+#endif
+ }
+ }
+ else
+ {
+ OUString aUrl( GetPath() );
+ if ( !aUrl.isEmpty() )
+ {
+ try
+ {
+ mxPlayer.set( avmedia::MediaWindow::createPlayer( aUrl, "" ), css::uno::UNO_SET_THROW );
+ mxPlayer->start();
+ maUpdateIdle.Start();
+ }
+ catch (const css::uno::Exception&)
+ {
+ mxPlayer.clear();
+ }
+
+ if (mxPlayer.is())
+ {
+ try
+ {
+ mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
+ SdResId( STR_STOP ) );
+ mbLabelPlaying = true;
+ }
+ catch (const css::lang::IllegalArgumentException&)
+ {
+#ifdef DBG_UTIL
+ OSL_FAIL( "Cannot access play button" );
+#endif
+ }
+ }
+ }
+ }
+#endif
+}
+
+IMPL_LINK_NOARG(SdFileDialog_Imp, IsMusicStoppedHdl, Timer *, void)
+{
+ SolarMutexGuard aGuard;
+
+ if (mxPlayer.is() && mxPlayer->isPlaying() &&
+ mxPlayer->getMediaTime() < mxPlayer->getDuration())
+ {
+ maUpdateIdle.Start();
+ return;
+ }
+
+ if( !mxControlAccess.is() )
+ return;
+
+ try
+ {
+ mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
+ SdResId( STR_PLAY ) );
+ mbLabelPlaying = false;
+ }
+ catch (const css::lang::IllegalArgumentException&)
+ {
+#ifdef DBG_UTIL
+ OSL_FAIL( "Cannot access play button" );
+#endif
+ }
+}
+
+SdFileDialog_Imp::SdFileDialog_Imp(weld::Window* pParent)
+ : FileDialogHelper(css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PLAY, FileDialogFlags::NONE, pParent)
+ , mnPlaySoundEvent(nullptr)
+ , mbLabelPlaying(false)
+ , maUpdateIdle( "SdFileDialog_Imp maUpdateIdle" )
+{
+ maUpdateIdle.SetInvokeHandler(LINK(this, SdFileDialog_Imp, IsMusicStoppedHdl));
+
+ css::uno::Reference < css::ui::dialogs::XFilePicker3 > xFileDlg = GetFilePicker();
+
+ // get the control access
+ mxControlAccess.set( xFileDlg, css::uno::UNO_QUERY );
+
+ if( !mxControlAccess.is() )
+ return;
+
+ try
+ {
+ mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
+ SdResId( STR_PLAY ) );
+ }
+ catch (const css::lang::IllegalArgumentException&)
+ {
+#ifdef DBG_UTIL
+ OSL_FAIL( "Cannot set play button label" );
+#endif
+ }
+}
+
+SdFileDialog_Imp::~SdFileDialog_Imp()
+{
+ if( mnPlaySoundEvent )
+ Application::RemoveUserEvent( mnPlaySoundEvent );
+}
+
+// ----------- SdOpenSoundFileDialog -----------------------
+
+// these are simple forwarders
+SdOpenSoundFileDialog::SdOpenSoundFileDialog(weld::Window *pParent)
+ : mpImpl(new SdFileDialog_Imp(pParent))
+{
+ OUString aDescr = SdResId(STR_ALL_FILES);
+ mpImpl->AddFilter( aDescr, "*.*");
+ mpImpl->SetContext(sfx2::FileDialogHelper::DrawImpressOpenSound);
+
+ // setup filter
+#if defined UNX
+ aDescr = SdResId(STR_AU_FILE);
+ mpImpl->AddFilter( aDescr, "*.au;*.snd");
+ aDescr = SdResId(STR_VOC_FILE);
+ mpImpl->AddFilter( aDescr, "*.voc");
+ aDescr = SdResId(STR_WAV_FILE);
+ mpImpl->AddFilter( aDescr, "*.wav");
+ aDescr = SdResId(STR_AIFF_FILE);
+ mpImpl->AddFilter( aDescr, "*.aiff");
+ aDescr = SdResId(STR_SVX_FILE);
+ mpImpl->AddFilter( aDescr, "*.svx");
+#else
+ aDescr = SdResId(STR_WAV_FILE);
+ mpImpl->AddFilter( aDescr, "*.wav;*.mp3;*.ogg" );
+ aDescr = SdResId(STR_MIDI_FILE);
+ mpImpl->AddFilter( aDescr, "*.mid" );
+#endif
+}
+
+SdOpenSoundFileDialog::~SdOpenSoundFileDialog()
+{
+}
+
+ErrCode SdOpenSoundFileDialog::Execute()
+{
+ return mpImpl->Execute();
+}
+
+OUString SdOpenSoundFileDialog::GetPath() const
+{
+ return mpImpl->GetPath();
+}
+
+void SdOpenSoundFileDialog::SetPath( const OUString& rPath )
+{
+ mpImpl->SetDisplayDirectory( rPath );
+}
+
+// WIP, please don't remove, dear Clang plugins
+bool SdOpenSoundFileDialog::IsInsertAsLinkSelected() const
+{
+ bool bInsertAsLinkSelected = false;
+ css::uno::Reference<css::ui::dialogs::XFilePicker3> const xFilePicker(mpImpl->GetFilePicker());
+ css::uno::Reference<css::ui::dialogs::XFilePickerControlAccess> const xControlAccess(xFilePicker, css::uno::UNO_QUERY_THROW);
+ xControlAccess->getValue(css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK, 0) >>= bInsertAsLinkSelected;
+ return bInsertAsLinkSelected;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/gluectrl.cxx b/sd/source/ui/dlg/gluectrl.cxx
new file mode 100644
index 000000000..a6baf3e92
--- /dev/null
+++ b/sd/source/ui/dlg/gluectrl.cxx
@@ -0,0 +1,200 @@
+/* -*- 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 <comphelper/propertyvalue.hxx>
+#include <svx/svdglue.hxx>
+#include <svl/intitem.hxx>
+#include <vcl/toolbox.hxx>
+
+#include <strings.hrc>
+#include <gluectrl.hxx>
+#include <sdresid.hxx>
+#include <app.hrc>
+
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/frame/XFrame.hpp>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::frame;
+
+// at the moment, Joe only supports the methods specified below
+#define ESCDIR_COUNT 5
+const SdrEscapeDirection aEscDirArray[] =
+{
+ SdrEscapeDirection::SMART,
+ SdrEscapeDirection::LEFT,
+ SdrEscapeDirection::RIGHT,
+ SdrEscapeDirection::TOP,
+ SdrEscapeDirection::BOTTOM
+};
+
+SFX_IMPL_TOOLBOX_CONTROL( SdTbxCtlGlueEscDir, SfxUInt16Item )
+
+/**
+ * Constructor for gluepoint escape direction Listbox
+ */
+GlueEscDirLB::GlueEscDirLB(vcl::Window* pParent, const Reference<XFrame>& rFrame)
+ : InterimItemWindow(pParent, "modules/simpress/ui/gluebox.ui", "GlueBox")
+ , m_xFrame(rFrame)
+ , m_xWidget(m_xBuilder->weld_combo_box("gluetype"))
+{
+ InitControlBase(m_xWidget.get());
+
+ Fill();
+
+ m_xWidget->connect_changed(LINK(this, GlueEscDirLB, SelectHdl));
+ m_xWidget->connect_key_press(LINK(this, GlueEscDirLB, KeyInputHdl));
+
+ SetSizePixel(m_xWidget->get_preferred_size());
+
+ Show();
+}
+
+void GlueEscDirLB::dispose()
+{
+ m_xWidget.reset();
+ InterimItemWindow::dispose();
+}
+
+GlueEscDirLB::~GlueEscDirLB()
+{
+ disposeOnce();
+}
+
+void GlueEscDirLB::set_sensitive(bool bSensitive)
+{
+ Enable(bSensitive);
+ m_xWidget->set_sensitive(bSensitive);
+}
+
+IMPL_LINK(GlueEscDirLB, KeyInputHdl, const KeyEvent&, rKEvt, bool)
+{
+ return ChildKeyInput(rKEvt);
+}
+
+/**
+ * Determines the escape direction and sends the corresponding slot
+ */
+IMPL_LINK(GlueEscDirLB, SelectHdl, weld::ComboBox&, rBox, void)
+{
+ sal_Int32 nPos = rBox.get_active();
+ SfxUInt16Item aItem( SID_GLUE_ESCDIR, static_cast<sal_uInt16>(aEscDirArray[ nPos ]) );
+
+ if ( m_xFrame.is() )
+ {
+ Any a;
+ aItem.QueryValue( a );
+ Sequence< PropertyValue > aArgs{ comphelper::makePropertyValue("GlueEscapeDirection", a) };
+ SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( m_xFrame->getController(), UNO_QUERY ),
+ ".uno:GlueEscapeDirection",
+ aArgs );
+ }
+}
+
+/**
+ * Fills the Listbox with strings
+ */
+void GlueEscDirLB::Fill()
+{
+ m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_SMART ) );
+ m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_LEFT ) );
+ m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_RIGHT ) );
+ m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_TOP ) );
+ m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_BOTTOM ) );
+ /*
+ m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_LO ) );
+ m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_LU ) );
+ m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_RO ) );
+ m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_RU ) );
+ m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_HORZ ) );
+ m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_VERT ) );
+ m_xWidget->append_text( SdResId( STR_GLUE_ESCDIR_ALL ) );
+ */
+}
+
+/**
+ * Constructor for gluepoint escape direction toolbox control
+ */
+SdTbxCtlGlueEscDir::SdTbxCtlGlueEscDir(
+ sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx ) :
+ SfxToolBoxControl( nSlotId, nId, rTbx )
+{
+}
+
+/**
+ * Represents state in the listbox of the controller
+ */
+void SdTbxCtlGlueEscDir::StateChangedAtToolBoxControl( sal_uInt16 nSId,
+ SfxItemState eState, const SfxPoolItem* pState )
+{
+ if( eState == SfxItemState::DEFAULT )
+ {
+ GlueEscDirLB* pGlueEscDirLB = static_cast<GlueEscDirLB*> ( GetToolBox().
+ GetItemWindow( GetId() ) );
+ if( pGlueEscDirLB )
+ {
+ if( pState )
+ {
+ pGlueEscDirLB->set_sensitive(true);
+ if ( IsInvalidItem( pState ) )
+ {
+ pGlueEscDirLB->set_active(-1);
+ }
+ else
+ {
+ SdrEscapeDirection nEscDir = static_cast<SdrEscapeDirection>(static_cast<const SfxUInt16Item*>( pState )->GetValue());
+ pGlueEscDirLB->set_active( GetEscDirPos( nEscDir ) );
+ }
+ }
+ else
+ {
+ pGlueEscDirLB->set_sensitive(false);
+ pGlueEscDirLB->set_active(-1);
+ }
+ }
+ }
+
+ SfxToolBoxControl::StateChangedAtToolBoxControl( nSId, eState, pState );
+}
+
+VclPtr<InterimItemWindow> SdTbxCtlGlueEscDir::CreateItemWindow( vcl::Window *pParent )
+{
+ if( GetSlotId() == SID_GLUE_ESCDIR )
+ return VclPtr<GlueEscDirLB>::Create( pParent, m_xFrame ).get();
+
+ return VclPtr<InterimItemWindow>();
+}
+
+/**
+ * Returns position in the array for EscDir (Mapping for Listbox)
+ */
+sal_uInt16 SdTbxCtlGlueEscDir::GetEscDirPos( SdrEscapeDirection nEscDir )
+{
+ for( sal_uInt16 i = 0; i < ESCDIR_COUNT; i++ )
+ {
+ if( aEscDirArray[ i ] == nEscDir )
+ return i;
+ }
+ return 99;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/headerfooterdlg.cxx b/sd/source/ui/dlg/headerfooterdlg.cxx
new file mode 100644
index 000000000..703f2f598
--- /dev/null
+++ b/sd/source/ui/dlg/headerfooterdlg.cxx
@@ -0,0 +1,759 @@
+/* -*- 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 <editeng/eeitem.hxx>
+#include <editeng/flditem.hxx>
+#include <editeng/langitem.hxx>
+#include <svx/langbox.hxx>
+#include <svx/svdotext.hxx>
+#include <editeng/editeng.hxx>
+#include <editeng/outlobj.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <tools/debug.hxx>
+
+#include <Outliner.hxx>
+#include <headerfooterdlg.hxx>
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <ViewShell.hxx>
+#include <sdmod.hxx>
+
+// preview control for presentation layout
+#include <tools/color.hxx>
+#include <i18nlangtag/mslangid.hxx>
+#include <svtools/colorcfg.hxx>
+#include <vcl/customweld.hxx>
+#include <vcl/decoview.hxx>
+#include <vcl/svapp.hxx>
+
+#include <undoheaderfooter.hxx>
+#include <sdundogr.hxx>
+
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
+
+namespace sd
+{
+
+namespace {
+
+class PresLayoutPreview : public weld::CustomWidgetController
+{
+private:
+ SdPage* mpMaster;
+ HeaderFooterSettings maSettings;
+ Size maPageSize;
+ ::tools::Rectangle maOutRect;
+
+private:
+ void Paint(vcl::RenderContext& rRenderContext, SdrTextObj const * pObj, bool bVisible, bool bDotted = false);
+
+public:
+ explicit PresLayoutPreview();
+
+ virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
+
+ virtual void Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect) override;
+
+ void init(SdPage* pMaster);
+ void update(HeaderFooterSettings const & rSettings);
+};
+
+}
+
+}
+
+// tab page for slide & header'n'notes
+
+namespace sd
+{
+
+const int nDateTimeFormatsCount = 12;
+
+namespace {
+
+struct DateAndTimeFormat {
+ SvxDateFormat meDateFormat;
+ SvxTimeFormat meTimeFormat;
+};
+
+}
+
+DateAndTimeFormat const nDateTimeFormats[nDateTimeFormatsCount] =
+{
+ { SvxDateFormat::A, SvxTimeFormat::AppDefault },
+ { SvxDateFormat::B, SvxTimeFormat::AppDefault },
+ { SvxDateFormat::C, SvxTimeFormat::AppDefault },
+ { SvxDateFormat::D, SvxTimeFormat::AppDefault },
+ { SvxDateFormat::E, SvxTimeFormat::AppDefault },
+ { SvxDateFormat::F, SvxTimeFormat::AppDefault },
+
+ { SvxDateFormat::A, SvxTimeFormat::HH24_MM },
+ { SvxDateFormat::A, SvxTimeFormat::HH12_MM },
+
+ { SvxDateFormat::AppDefault, SvxTimeFormat::HH24_MM },
+ { SvxDateFormat::AppDefault, SvxTimeFormat::HH24_MM_SS },
+
+ { SvxDateFormat::AppDefault, SvxTimeFormat::HH12_MM },
+ { SvxDateFormat::AppDefault, SvxTimeFormat::HH12_MM_SS },
+};
+
+class HeaderFooterTabPage
+{
+private:
+ SdDrawDocument* mpDoc;
+ LanguageType meOldLanguage;
+ bool mbHandoutMode;
+
+ std::unique_ptr<weld::Builder> mxBuilder;
+ std::unique_ptr<weld::Container> mxContainer;
+ std::unique_ptr<weld::Label> mxFTIncludeOn;
+ std::unique_ptr<weld::CheckButton> mxCBHeader;
+ std::unique_ptr<weld::Widget> mxHeaderBox;
+ std::unique_ptr<weld::Entry> mxTBHeader;
+ std::unique_ptr<weld::CheckButton> mxCBDateTime;
+ std::unique_ptr<weld::RadioButton> mxRBDateTimeFixed;
+ std::unique_ptr<weld::RadioButton> mxRBDateTimeAutomatic;
+ std::unique_ptr<weld::Entry> mxTBDateTimeFixed;
+ std::unique_ptr<weld::ComboBox> mxCBDateTimeFormat;
+ std::unique_ptr<weld::Label> mxFTDateTimeLanguage;
+ std::unique_ptr<SvxLanguageBox> mxCBDateTimeLanguage;
+ std::unique_ptr<weld::CheckButton> mxCBFooter;
+ std::unique_ptr<weld::Widget> mxFooterBox;
+ std::unique_ptr<weld::Entry> mxTBFooter;
+ std::unique_ptr<weld::CheckButton> mxCBSlideNumber;
+ std::unique_ptr<weld::CheckButton> mxCBNotOnTitle;
+ std::unique_ptr<weld::Label> mxReplacementA;
+ std::unique_ptr<weld::Label> mxReplacementB;
+ std::unique_ptr<PresLayoutPreview> mxCTPreview;
+ std::unique_ptr<weld::CustomWeld> mxCTPreviewWin;
+
+
+ DECL_LINK( UpdateOnToggleHdl, weld::Toggleable&, void );
+ DECL_LINK( LanguageChangeHdl, weld::ComboBox&, void );
+
+ void FillFormatList(sal_Int32 nSelectedPos);
+ void GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet );
+ void GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet, SdPage* pPage );
+
+public:
+ HeaderFooterTabPage(weld::Container* pParent, SdDrawDocument* pDoc, SdPage* pActualPage, bool bHandoutMode );
+
+ void init( const HeaderFooterSettings& rSettings, bool bNotOnTitle );
+ void getData( HeaderFooterSettings& rSettings, bool& rNotOnTitle );
+ void update();
+};
+
+}
+
+using namespace ::sd;
+
+HeaderFooterDialog::HeaderFooterDialog(ViewShell* pViewShell, weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage)
+ : GenericDialogController(pParent, "modules/simpress/ui/headerfooterdialog.ui", "HeaderFooterDialog")
+ , mpDoc( pDoc )
+ , mpCurrentPage( pCurrentPage )
+ , mpViewShell( pViewShell )
+ , mxTabCtrl(m_xBuilder->weld_notebook("tabcontrol"))
+ , mxPBApplyToAll(m_xBuilder->weld_button("apply_all"))
+ , mxPBApply(m_xBuilder->weld_button("apply"))
+ , mxPBCancel(m_xBuilder->weld_button("cancel"))
+{
+ SdPage* pSlide;
+ SdPage* pNotes;
+ if( pCurrentPage->GetPageKind() == PageKind::Standard )
+ {
+ pSlide = pCurrentPage;
+ pNotes = static_cast<SdPage*>(pDoc->GetPage( pCurrentPage->GetPageNum() + 1 ));
+ }
+ else if( pCurrentPage->GetPageKind() == PageKind::Notes )
+ {
+ pNotes = pCurrentPage;
+ pSlide = static_cast<SdPage*>(pDoc->GetPage( pCurrentPage->GetPageNum() -1 ));
+ mpCurrentPage = pSlide;
+ }
+ else
+ {
+ // handout
+ pSlide = pDoc->GetSdPage( 0, PageKind::Standard );
+ pNotes = pDoc->GetSdPage( 0, PageKind::Notes );
+ mpCurrentPage = nullptr;
+ }
+
+ mxSlideTabPage.reset(new HeaderFooterTabPage(mxTabCtrl->get_page("slides"), pDoc, pSlide, false));
+ mxNotesHandoutsTabPage.reset(new HeaderFooterTabPage(mxTabCtrl->get_page("notes"), pDoc, pNotes, true));
+
+ pDoc->StopWorkStartupDelay();
+ mxTabCtrl->show();
+
+ ActivatePageHdl(mxTabCtrl->get_current_page_ident());
+
+ mxTabCtrl->connect_enter_page( LINK( this, HeaderFooterDialog, ActivatePageHdl ) );
+
+ mxPBApplyToAll->connect_clicked( LINK( this, HeaderFooterDialog, ClickApplyToAllHdl ) );
+ mxPBApply->connect_clicked( LINK( this, HeaderFooterDialog, ClickApplyHdl ) );
+ mxPBCancel->connect_clicked( LINK( this, HeaderFooterDialog, ClickCancelHdl ) );
+
+ maSlideSettings = pSlide->getHeaderFooterSettings();
+
+ const HeaderFooterSettings& rTitleSettings = mpDoc->GetSdPage(0, PageKind::Standard)->getHeaderFooterSettings();
+ bool bNotOnTitle = !rTitleSettings.mbFooterVisible && !rTitleSettings.mbSlideNumberVisible && !rTitleSettings.mbDateTimeVisible;
+
+ mxSlideTabPage->init( maSlideSettings, bNotOnTitle );
+
+ maNotesHandoutSettings = pNotes->getHeaderFooterSettings();
+ mxNotesHandoutsTabPage->init( maNotesHandoutSettings, false );
+}
+
+HeaderFooterDialog::~HeaderFooterDialog()
+{
+}
+
+IMPL_LINK(HeaderFooterDialog, ActivatePageHdl, const OString&, rIdent, void)
+{
+ mxPBApply->set_visible(rIdent == "slides");
+ mxPBApply->set_sensitive(mpCurrentPage != nullptr);
+}
+
+IMPL_LINK_NOARG(HeaderFooterDialog, ClickApplyToAllHdl, weld::Button&, void)
+{
+ ApplyToAll();
+}
+
+IMPL_LINK_NOARG(HeaderFooterDialog, ClickApplyHdl, weld::Button&, void)
+{
+ Apply();
+}
+
+IMPL_LINK_NOARG(HeaderFooterDialog, ClickCancelHdl, weld::Button&, void)
+{
+ m_xDialog->response(RET_CANCEL);
+}
+
+short HeaderFooterDialog::run()
+{
+ short nRet = GenericDialogController::run();
+ if (nRet)
+ mpViewShell->GetDocSh()->SetModified();
+ return nRet;
+}
+
+void HeaderFooterDialog::ApplyToAll()
+{
+ OString tabId = mxTabCtrl->get_current_page_ident();
+ apply(true, tabId == "slides");
+ m_xDialog->response(RET_OK);
+}
+
+void HeaderFooterDialog::Apply()
+{
+ OString tabId = mxTabCtrl->get_current_page_ident();
+ apply(false, tabId == "slides");
+ m_xDialog->response(RET_OK);
+}
+
+void HeaderFooterDialog::apply( bool bToAll, bool bForceSlides )
+{
+ std::unique_ptr<SdUndoGroup> pUndoGroup(new SdUndoGroup(mpDoc));
+ OUString aComment( m_xDialog->get_title() );
+ pUndoGroup->SetComment( aComment );
+
+ HeaderFooterSettings aNewSettings;
+ bool bNewNotOnTitle;
+
+ // change slide settings first ...
+
+ mxSlideTabPage->getData( aNewSettings, bNewNotOnTitle );
+
+ // only if we pressed apply or apply all on the slide tab page or if the slide settings
+ // have been changed
+ if( bForceSlides || !(aNewSettings == maSlideSettings) )
+ {
+ // apply to all slides
+ if( bToAll )
+ {
+ int nPageCount = mpDoc->GetSdPageCount( PageKind::Standard );
+ int nPage;
+ for( nPage = 0; nPage < nPageCount; nPage++ )
+ {
+ SdPage* pPage = mpDoc->GetSdPage( static_cast<sal_uInt16>(nPage), PageKind::Standard );
+ change( pUndoGroup.get(), pPage, aNewSettings );
+ }
+ }
+ else
+ {
+ // apply only to the current slide
+ DBG_ASSERT( mpCurrentPage && mpCurrentPage->GetPageKind() == PageKind::Standard, "no current page to apply to!" );
+ if( mpCurrentPage && (mpCurrentPage->GetPageKind() == PageKind::Standard) )
+ {
+ change( pUndoGroup.get(), mpCurrentPage, aNewSettings );
+ }
+ }
+ }
+
+ // if we don't want to have header&footer on the first slide
+ if( bNewNotOnTitle )
+ {
+ // just hide them, plain simple UI feature
+ HeaderFooterSettings aTempSettings = mpDoc->GetSdPage( 0, PageKind::Standard )->getHeaderFooterSettings();
+
+ aTempSettings.mbFooterVisible = false;
+ aTempSettings.mbSlideNumberVisible = false;
+ aTempSettings.mbDateTimeVisible = false;
+
+ change( pUndoGroup.get(), mpDoc->GetSdPage( 0, PageKind::Standard ), aTempSettings );
+ }
+
+ // now notes settings
+
+ mxNotesHandoutsTabPage->getData( aNewSettings, bNewNotOnTitle );
+
+ // only if we pressed apply or apply all on the notes tab page or if the notes settings
+ // have been changed
+ if( !bForceSlides || !(aNewSettings == maNotesHandoutSettings) )
+ {
+ // first set to all notes pages
+ int nPageCount = mpDoc->GetSdPageCount( PageKind::Notes );
+ int nPage;
+ for( nPage = 0; nPage < nPageCount; nPage++ )
+ {
+ SdPage* pPage = mpDoc->GetSdPage( static_cast<sal_uInt16>(nPage), PageKind::Notes );
+
+ change( pUndoGroup.get(), pPage, aNewSettings );
+ }
+
+ // and last but not least to the handout page
+ change( pUndoGroup.get(), mpDoc->GetMasterSdPage( 0, PageKind::Handout ), aNewSettings );
+ }
+
+ // give the undo group to the undo manager
+ mpViewShell->GetViewFrame()->GetObjectShell()->GetUndoManager()->AddUndoAction(std::move(pUndoGroup));
+}
+
+void HeaderFooterDialog::change( SdUndoGroup* pUndoGroup, SdPage* pPage, const HeaderFooterSettings& rNewSettings )
+{
+ pUndoGroup->AddAction(new SdHeaderFooterUndoAction(mpDoc, pPage, rNewSettings ));
+ pPage->setHeaderFooterSettings( rNewSettings );
+}
+
+HeaderFooterTabPage::HeaderFooterTabPage(weld::Container* pParent, SdDrawDocument* pDoc, SdPage* pActualPage, bool bHandoutMode)
+ : mpDoc(pDoc)
+ , mbHandoutMode(bHandoutMode)
+ , mxBuilder(Application::CreateBuilder(pParent, "modules/simpress/ui/headerfootertab.ui"))
+ , mxContainer(mxBuilder->weld_container("HeaderFooterTab"))
+ , mxFTIncludeOn(mxBuilder->weld_label("include_label"))
+ , mxCBHeader(mxBuilder->weld_check_button("header_cb" ))
+ , mxHeaderBox(mxBuilder->weld_widget("header_box"))
+ , mxTBHeader(mxBuilder->weld_entry("header_text"))
+ , mxCBDateTime(mxBuilder->weld_check_button("datetime_cb"))
+ , mxRBDateTimeFixed(mxBuilder->weld_radio_button("rb_fixed"))
+ , mxRBDateTimeAutomatic(mxBuilder->weld_radio_button("rb_auto"))
+ , mxTBDateTimeFixed(mxBuilder->weld_entry("datetime_value"))
+ , mxCBDateTimeFormat(mxBuilder->weld_combo_box("datetime_format_list"))
+ , mxFTDateTimeLanguage(mxBuilder->weld_label("language_label"))
+ , mxCBDateTimeLanguage(new SvxLanguageBox(mxBuilder->weld_combo_box("language_list")))
+ , mxCBFooter(mxBuilder->weld_check_button("footer_cb"))
+ , mxFooterBox(mxBuilder->weld_widget("footer_box" ))
+ , mxTBFooter(mxBuilder->weld_entry("footer_text"))
+ , mxCBSlideNumber(mxBuilder->weld_check_button("slide_number"))
+ , mxCBNotOnTitle(mxBuilder->weld_check_button("not_on_title"))
+ , mxReplacementA(mxBuilder->weld_label("replacement_a"))
+ , mxReplacementB(mxBuilder->weld_label("replacement_b"))
+ , mxCTPreview(new PresLayoutPreview)
+ , mxCTPreviewWin(new weld::CustomWeld(*mxBuilder, "preview", *mxCTPreview))
+{
+ mxCTPreview->init( pActualPage ?
+ (pActualPage->IsMasterPage() ? pActualPage : static_cast<SdPage*>(&(pActualPage->TRG_GetMasterPage()))) :
+ (pDoc->GetMasterSdPage( 0, bHandoutMode ? PageKind::Notes : PageKind::Standard )) );
+
+ if( mbHandoutMode )
+ {
+ OUString sPageNo = mxReplacementA->get_label();
+ mxCBSlideNumber->set_label( sPageNo );
+
+ OUString sFrameTitle = mxReplacementB->get_label();
+ mxFTIncludeOn->set_label( sFrameTitle );
+ }
+
+ mxCBHeader->set_visible( mbHandoutMode );
+ mxHeaderBox->set_visible( mbHandoutMode );
+ mxCBNotOnTitle->set_visible( !mbHandoutMode );
+
+ mxCBDateTime->connect_toggled( LINK( this, HeaderFooterTabPage, UpdateOnToggleHdl ) );
+ mxRBDateTimeFixed->connect_toggled( LINK( this, HeaderFooterTabPage, UpdateOnToggleHdl ) );
+ mxRBDateTimeAutomatic->connect_toggled( LINK( this, HeaderFooterTabPage, UpdateOnToggleHdl ) );
+ mxCBFooter->connect_toggled( LINK( this, HeaderFooterTabPage, UpdateOnToggleHdl ) );
+ mxCBHeader->connect_toggled( LINK( this, HeaderFooterTabPage, UpdateOnToggleHdl ) );
+ mxCBSlideNumber->connect_toggled( LINK( this, HeaderFooterTabPage, UpdateOnToggleHdl ) );
+
+ mxCBDateTimeLanguage->SetLanguageList( SvxLanguageListFlags::ALL|SvxLanguageListFlags::ONLY_KNOWN, false, false );
+ mxCBDateTimeLanguage->connect_changed( LINK( this, HeaderFooterTabPage, LanguageChangeHdl ) );
+
+ GetOrSetDateTimeLanguage( meOldLanguage, false );
+ meOldLanguage = MsLangId::getRealLanguage( meOldLanguage );
+ mxCBDateTimeLanguage->set_active_id( meOldLanguage );
+
+ FillFormatList(0);
+}
+
+IMPL_LINK_NOARG(HeaderFooterTabPage, LanguageChangeHdl, weld::ComboBox&, void)
+{
+ FillFormatList( mxCBDateTimeFormat->get_active() );
+}
+
+void HeaderFooterTabPage::FillFormatList( sal_Int32 nSelectedPos )
+{
+ LanguageType eLanguage = mxCBDateTimeLanguage->get_active_id();
+
+ mxCBDateTimeFormat->clear();
+
+ DateTime aDateTime( DateTime::SYSTEM );
+
+ for (int nFormat = 0; nFormat < nDateTimeFormatsCount; ++nFormat)
+ {
+ OUString aStr( SvxDateTimeField::GetFormatted(
+ aDateTime, aDateTime,
+ nDateTimeFormats[nFormat].meDateFormat, nDateTimeFormats[nFormat].meTimeFormat,
+ *(SD_MOD()->GetNumberFormatter()), eLanguage ) );
+ mxCBDateTimeFormat->append_text(aStr);
+ if (nFormat == nSelectedPos)
+ mxCBDateTimeFormat->set_active(nFormat);
+ }
+}
+
+void HeaderFooterTabPage::init( const HeaderFooterSettings& rSettings, bool bNotOnTitle )
+{
+ mxCBDateTime->set_active( rSettings.mbDateTimeVisible );
+ mxRBDateTimeFixed->set_active( rSettings.mbDateTimeIsFixed );
+ mxRBDateTimeAutomatic->set_active( !rSettings.mbDateTimeIsFixed );
+ mxTBDateTimeFixed->set_text( rSettings.maDateTimeText );
+
+ mxCBHeader->set_active( rSettings.mbHeaderVisible );
+ mxTBHeader->set_text( rSettings.maHeaderText );
+
+ mxCBFooter->set_active( rSettings.mbFooterVisible );
+ mxTBFooter->set_text( rSettings.maFooterText );
+
+ mxCBSlideNumber->set_active( rSettings.mbSlideNumberVisible );
+
+ mxCBNotOnTitle->set_active( bNotOnTitle );
+
+ mxCBDateTimeLanguage->set_active_id( meOldLanguage );
+
+ for (sal_Int32 nPos = 0, nEntryCount = mxCBDateTimeFormat->get_count(); nPos < nEntryCount; ++nPos)
+ {
+ if( nDateTimeFormats[nPos].meDateFormat == rSettings.meDateFormat && nDateTimeFormats[nPos].meTimeFormat == rSettings.meTimeFormat )
+ {
+ mxCBDateTimeFormat->set_active(nPos);
+ break;
+ }
+ }
+
+ update();
+}
+
+void HeaderFooterTabPage::getData( HeaderFooterSettings& rSettings, bool& rNotOnTitle )
+{
+ rSettings.mbDateTimeVisible = mxCBDateTime->get_active();
+ rSettings.mbDateTimeIsFixed = mxRBDateTimeFixed->get_active();
+ rSettings.maDateTimeText = mxTBDateTimeFixed->get_text();
+ rSettings.mbFooterVisible = mxCBFooter->get_active();
+ rSettings.maFooterText = mxTBFooter->get_text();
+ rSettings.mbSlideNumberVisible = mxCBSlideNumber->get_active();
+ rSettings.mbHeaderVisible = mxCBHeader->get_active();
+ rSettings.maHeaderText = mxTBHeader->get_text();
+
+ int nPos = mxCBDateTimeFormat->get_active();
+ if (nPos != -1)
+ {
+ rSettings.meDateFormat = nDateTimeFormats[nPos].meDateFormat;
+ rSettings.meTimeFormat = nDateTimeFormats[nPos].meTimeFormat;
+ }
+
+ LanguageType eLanguage = mxCBDateTimeLanguage->get_active_id();
+ if( eLanguage != meOldLanguage )
+ GetOrSetDateTimeLanguage( eLanguage, true );
+
+ rNotOnTitle = mxCBNotOnTitle->get_active();
+}
+
+void HeaderFooterTabPage::update()
+{
+ mxRBDateTimeFixed->set_sensitive( mxCBDateTime->get_active() );
+ mxTBDateTimeFixed->set_sensitive( mxRBDateTimeFixed->get_active() && mxCBDateTime->get_active() );
+ mxRBDateTimeAutomatic->set_sensitive( mxCBDateTime->get_active() );
+ mxCBDateTimeFormat->set_sensitive( mxCBDateTime->get_active() && mxRBDateTimeAutomatic->get_active() );
+ mxFTDateTimeLanguage->set_sensitive( mxCBDateTime->get_active() && mxRBDateTimeAutomatic->get_active() );
+ mxCBDateTimeLanguage->set_sensitive( mxCBDateTime->get_active() && mxRBDateTimeAutomatic->get_active() );
+ mxFooterBox->set_sensitive( mxCBFooter->get_active() );
+ mxHeaderBox->set_sensitive( mxCBHeader->get_active() );
+
+ HeaderFooterSettings aSettings;
+ bool bNotOnTitle;
+ getData( aSettings, bNotOnTitle );
+ mxCTPreview->update( aSettings );
+}
+
+IMPL_LINK_NOARG(HeaderFooterTabPage, UpdateOnToggleHdl, weld::Toggleable&, void)
+{
+ update();
+}
+
+void HeaderFooterTabPage::GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet )
+{
+ if( mbHandoutMode )
+ {
+ // if set, set it on all notes master pages
+ if( bSet )
+ {
+ sal_uInt16 nPageCount = mpDoc->GetMasterSdPageCount( PageKind::Notes );
+ sal_uInt16 nPage;
+ for( nPage = 0; nPage < nPageCount; nPage++ )
+ {
+ GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( nPage, PageKind::Notes ) );
+ }
+ }
+
+ // #i119985# and set it, or just get it from the notes master page
+ GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( 0, PageKind::Notes ) );
+ }
+ else
+ {
+ // get the language from the first master page
+ // or set it to all master pages
+ sal_uInt16 nPageCount = bSet ? mpDoc->GetMasterSdPageCount( PageKind::Notes ) : 1;
+ sal_uInt16 nPage;
+ for( nPage = 0; nPage < nPageCount; nPage++ )
+ {
+ GetOrSetDateTimeLanguage( rLanguage, bSet, mpDoc->GetMasterSdPage( nPage, PageKind::Standard ) );
+ }
+ }
+}
+
+void HeaderFooterTabPage::GetOrSetDateTimeLanguage( LanguageType &rLanguage, bool bSet, SdPage* pPage )
+{
+ if( !pPage )
+ return;
+
+ SdrTextObj* pObj = static_cast<SdrTextObj*>(pPage->GetPresObj( PresObjKind::DateTime ));
+ if( !pObj )
+ return;
+
+ Outliner* pOutl = mpDoc->GetInternalOutliner();
+ pOutl->Init( OutlinerMode::TextObject );
+ OutlinerMode nOutlMode = pOutl->GetOutlinerMode();
+
+ EditEngine* pEdit = const_cast< EditEngine* >(&pOutl->GetEditEngine());
+
+ OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject();
+ if( pOPO )
+ pOutl->SetText( *pOPO );
+
+ EPosition aDateFieldPosition;
+ bool bHasDateFieldItem = false;
+
+ sal_Int32 nParaCount = pEdit->GetParagraphCount();
+ for (sal_Int32 nPara = 0; (nPara < nParaCount) && !bHasDateFieldItem; ++nPara)
+ {
+ sal_uInt16 nFieldCount = pEdit->GetFieldCount(nPara);
+ for (sal_uInt16 nField = 0; (nField < nFieldCount); ++nField)
+ {
+ EFieldInfo aFieldInfo = pEdit->GetFieldInfo(nPara, nField);
+ if (aFieldInfo.pFieldItem)
+ {
+ const SvxFieldData* pFieldData = aFieldInfo.pFieldItem->GetField();
+ if (dynamic_cast<const SvxDateTimeField*>(pFieldData) != nullptr ||
+ dynamic_cast<const SvxDateField*>(pFieldData) != nullptr)
+ {
+ bHasDateFieldItem = true;
+ aDateFieldPosition = aFieldInfo.aPosition;
+ break;
+ }
+ }
+ }
+ }
+
+ if (bHasDateFieldItem)
+ {
+ if( bSet )
+ {
+ SfxItemSet aSet(pEdit->GetAttribs(aDateFieldPosition.nPara,
+ aDateFieldPosition.nIndex,
+ aDateFieldPosition.nIndex+1,
+ GetAttribsFlags::CHARATTRIBS));
+
+ SvxLanguageItem aItem( rLanguage, EE_CHAR_LANGUAGE );
+ aSet.Put( aItem );
+
+ SvxLanguageItem aItemCJK( rLanguage, EE_CHAR_LANGUAGE_CJK );
+ aSet.Put( aItemCJK );
+
+ SvxLanguageItem aItemCTL( rLanguage, EE_CHAR_LANGUAGE_CTL );
+ aSet.Put( aItemCTL );
+
+ ESelection aSel(aDateFieldPosition.nPara, aDateFieldPosition.nIndex,
+ aDateFieldPosition.nPara, aDateFieldPosition.nIndex+1 );
+ pEdit->QuickSetAttribs( aSet, aSel );
+
+ pObj->SetOutlinerParaObject( pOutl->CreateParaObject() );
+ pOutl->UpdateFields();
+ }
+ else
+ {
+ rLanguage = pOutl->GetLanguage(aDateFieldPosition.nPara,
+ aDateFieldPosition.nIndex );
+ }
+ }
+
+ pOutl->Clear();
+ pOutl->Init( nOutlMode );
+}
+
+PresLayoutPreview::PresLayoutPreview()
+ : mpMaster(nullptr)
+{
+}
+
+void PresLayoutPreview::SetDrawingArea(weld::DrawingArea* pDrawingArea)
+{
+ Size aSize(pDrawingArea->get_ref_device().LogicToPixel(Size(80, 80), MapMode(MapUnit::MapAppFont)));
+ pDrawingArea->set_size_request(aSize.Width(), aSize.Height());
+ CustomWidgetController::SetDrawingArea(pDrawingArea);
+ SetOutputSizePixel(aSize);
+}
+
+void PresLayoutPreview::init( SdPage *pMaster )
+{
+ mpMaster = pMaster;
+ maPageSize = pMaster->GetSize();
+}
+
+void PresLayoutPreview::update( HeaderFooterSettings const & rSettings )
+{
+ maSettings = rSettings;
+ Invalidate();
+}
+
+void PresLayoutPreview::Paint(vcl::RenderContext& rRenderContext, SdrTextObj const * pObj, bool bVisible, bool bDotted /* = false*/ )
+{
+ // get object transformation
+ basegfx::B2DHomMatrix aObjectTransform;
+ basegfx::B2DPolyPolygon aObjectPolyPolygon;
+ pObj->TRGetBaseGeometry(aObjectTransform, aObjectPolyPolygon);
+
+ // build complete transformation by adding view transformation from
+ // logic page coordinates to local pixel coordinates
+ const double fScaleX(static_cast<double>(maOutRect.getWidth()) / static_cast<double>(maPageSize.Width()));
+ const double fScaleY(static_cast<double>(maOutRect.getHeight()) / static_cast<double>(maPageSize.Height()));
+ aObjectTransform.scale(fScaleX, fScaleY);
+ aObjectTransform.translate(maOutRect.Left(), maOutRect.Top());
+
+ // create geometry using unit range and object transform
+ basegfx::B2DPolyPolygon aGeometry(basegfx::utils::createUnitPolygon());
+ aGeometry.transform(aObjectTransform);
+
+ // apply line pattern if wanted
+ if (bDotted)
+ {
+ static const double fFactor(1.0);
+ std::vector<double> aPattern
+ {
+ 3.0 * fFactor,
+ 1.0 * fFactor
+ };
+
+ basegfx::B2DPolyPolygon aDashed;
+ basegfx::utils::applyLineDashing(aGeometry, aPattern, &aDashed);
+ aGeometry = aDashed;
+ }
+
+ // determine line color
+ svtools::ColorConfig aColorConfig;
+ svtools::ColorConfigValue aColor( aColorConfig.GetColorValue( bVisible ? svtools::FONTCOLOR : svtools::OBJECTBOUNDARIES ) );
+
+ // paint at OutDev
+ rRenderContext.SetLineColor(aColor.nColor);
+ rRenderContext.SetFillColor();
+
+ for (sal_uInt32 a(0); a < aGeometry.count(); a++)
+ {
+ rRenderContext.DrawPolyLine(aGeometry.getB2DPolygon(a));
+ }
+}
+
+void PresLayoutPreview::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle&)
+{
+ rRenderContext.Push();
+
+ maOutRect = ::tools::Rectangle(Point(0,0), rRenderContext.GetOutputSize());
+
+ // calculate page size with correct aspect ratio
+ int nWidth, nHeight;
+ if( maPageSize.Width() > maPageSize.Height() )
+ {
+ nWidth = maOutRect.GetWidth();
+ nHeight = maPageSize.Width() == 0 ? 0 : tools::Long( static_cast<double>(nWidth * maPageSize.Height()) / static_cast<double>(maPageSize.Width()) );
+ }
+ else
+ {
+ nHeight = maOutRect.GetHeight();
+ nWidth = maPageSize.Height() == 0 ? 0 : tools::Long( static_cast<double>(nHeight * maPageSize.Width()) / static_cast<double>(maPageSize.Height()) );
+ }
+
+ maOutRect.AdjustLeft((maOutRect.GetWidth() - nWidth) >> 1 );
+ maOutRect.SetRight( maOutRect.Left() + nWidth - 1 );
+ maOutRect.AdjustTop((maOutRect.GetHeight() - nHeight) >> 1 );
+ maOutRect.SetBottom( maOutRect.Top() + nHeight - 1 );
+
+ // draw decoration frame
+ DecorationView aDecoView(&rRenderContext);
+ maOutRect = aDecoView.DrawFrame(maOutRect, DrawFrameStyle::In);
+
+ // draw page background
+ rRenderContext.SetFillColor(COL_WHITE);
+ rRenderContext.DrawRect(maOutRect);
+
+ // paint presentation objects from masterpage
+ if (nullptr != mpMaster)
+ {
+ SdrTextObj* pMasterTitle = static_cast<SdrTextObj*>(mpMaster->GetPresObj(PresObjKind::Title));
+ SdrTextObj* pMasterOutline = static_cast<SdrTextObj*>(mpMaster->GetPresObj(mpMaster->GetPageKind() == PageKind::Notes ? PresObjKind::Notes : PresObjKind::Outline));
+ SdrTextObj* pHeader = static_cast<SdrTextObj*>(mpMaster->GetPresObj(PresObjKind::Header));
+ SdrTextObj* pFooter = static_cast<SdrTextObj*>(mpMaster->GetPresObj(PresObjKind::Footer));
+ SdrTextObj* pDate = static_cast<SdrTextObj*>(mpMaster->GetPresObj(PresObjKind::DateTime));
+ SdrTextObj* pNumber = static_cast<SdrTextObj*>(mpMaster->GetPresObj(PresObjKind::SlideNumber));
+
+ if (pMasterTitle)
+ Paint(rRenderContext, pMasterTitle, true, true);
+ if (pMasterOutline)
+ Paint(rRenderContext, pMasterOutline, true, true);
+ if (pHeader)
+ Paint(rRenderContext, pHeader, maSettings.mbHeaderVisible);
+ if (pFooter)
+ Paint(rRenderContext, pFooter, maSettings.mbFooterVisible);
+ if (pDate)
+ Paint(rRenderContext, pDate, maSettings.mbDateTimeVisible);
+ if (pNumber)
+ Paint(rRenderContext, pNumber, maSettings.mbSlideNumberVisible);
+ }
+
+ rRenderContext.Pop();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/ins_paste.cxx b/sd/source/ui/dlg/ins_paste.cxx
new file mode 100644
index 000000000..f1020c0cb
--- /dev/null
+++ b/sd/source/ui/dlg/ins_paste.cxx
@@ -0,0 +1,34 @@
+/* -*- 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 <ins_paste.hxx>
+
+SdInsertPasteDlg::SdInsertPasteDlg(weld::Window* pWindow)
+ : GenericDialogController(pWindow, "modules/simpress/ui/insertslides.ui", "InsertSlidesDialog")
+ , m_xRbBefore(m_xBuilder->weld_radio_button("before"))
+ , m_xRbAfter(m_xBuilder->weld_radio_button("after"))
+{
+ m_xRbAfter->set_active(true);
+}
+
+SdInsertPasteDlg::~SdInsertPasteDlg() {}
+
+bool SdInsertPasteDlg::IsInsertBefore() const { return m_xRbBefore->get_active(); }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/inspagob.cxx b/sd/source/ui/dlg/inspagob.cxx
new file mode 100644
index 000000000..5c984dd23
--- /dev/null
+++ b/sd/source/ui/dlg/inspagob.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/.
+ *
+ * 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 <inspagob.hxx>
+#include <sdtreelb.hxx>
+
+#include <strings.hrc>
+
+#include <bitmaps.hlst>
+#include <sdresid.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <ViewShell.hxx>
+
+SdInsertPagesObjsDlg::SdInsertPagesObjsDlg(
+ weld::Window* pWindow, const SdDrawDocument* pInDoc,
+ SfxMedium* pSfxMedium, const OUString& rFileName )
+ : GenericDialogController(pWindow, "modules/sdraw/ui/insertslidesdialog.ui", "InsertSlidesDialog")
+ , m_pMedium(pSfxMedium)
+ , m_pDoc(pInDoc)
+ , m_rName(rFileName)
+ , m_xLbTree(new SdPageObjsTLV(m_xBuilder->weld_tree_view("tree")))
+ , m_xCbxLink(m_xBuilder->weld_check_button("links"))
+ , m_xCbxMasters(m_xBuilder->weld_check_button("backgrounds"))
+{
+ m_xLbTree->set_size_request(m_xLbTree->get_approximate_digit_width() * 48,
+ m_xLbTree->get_height_rows(12));
+
+ m_xLbTree->SetViewFrame( pInDoc->GetDocSh()->GetViewShell()->GetViewFrame() );
+
+ m_xLbTree->connect_changed(LINK(this, SdInsertPagesObjsDlg, SelectObjectHdl));
+
+ // insert text
+ if (!m_pMedium)
+ m_xDialog->set_title(SdResId(STR_INSERT_TEXT));
+ else if (m_pDoc && m_pDoc->GetDocumentType() == DocumentType::Draw)
+ m_xDialog->set_title(SdResId(STR_INSERT_PAGES));
+
+ Reset();
+}
+
+SdInsertPagesObjsDlg::~SdInsertPagesObjsDlg()
+{
+}
+
+/**
+ * Fills the TreeLB dependent on the medium. Is not medium available, then
+ * it is a text and not a draw document.
+ */
+void SdInsertPagesObjsDlg::Reset()
+{
+ if( m_pMedium )
+ {
+ m_xLbTree->set_selection_mode(SelectionMode::Multiple);
+
+ // transfer ownership of Medium
+ m_xLbTree->Fill( m_pDoc, m_pMedium, m_rName );
+ }
+ else
+ {
+ m_xLbTree->InsertEntry(m_rName, BMP_DOC_TEXT);
+ }
+
+ m_xCbxMasters->set_active(true);
+}
+
+std::vector<OUString> SdInsertPagesObjsDlg::GetList( const sal_uInt16 nType )
+{
+ // With Draw documents, we have to return NULL on selection of the document
+ if( m_pMedium )
+ {
+ // to ensure that bookmarks are opened
+ // (when the whole document is selected)
+ m_xLbTree->GetBookmarkDoc();
+
+ // If the document is selected (too) or nothing is selected,
+ // the whole document is inserted (but not more!)
+ std::unique_ptr<weld::TreeIter> xIter(m_xLbTree->make_iterator());
+ if (!m_xLbTree->get_iter_first(*xIter) || m_xLbTree->is_selected(*xIter))
+ return std::vector<OUString>();
+ }
+
+ return m_xLbTree->GetSelectEntryList( nType );
+}
+
+/**
+ * is link checked
+ */
+bool SdInsertPagesObjsDlg::IsLink() const
+{
+ return m_xCbxLink->get_active();
+}
+
+/**
+ * is link checked
+ */
+bool SdInsertPagesObjsDlg::IsRemoveUnnecessaryMasterPages() const
+{
+ return m_xCbxMasters->get_active();
+}
+
+/**
+ * Enabled and selects end-color-LB
+ */
+IMPL_LINK_NOARG(SdInsertPagesObjsDlg, SelectObjectHdl, weld::TreeView&, void)
+{
+ m_xCbxLink->set_sensitive(m_xLbTree->IsLinkableSelected());
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/layeroptionsdlg.cxx b/sd/source/ui/dlg/layeroptionsdlg.cxx
new file mode 100644
index 000000000..a70c71f47
--- /dev/null
+++ b/sd/source/ui/dlg/layeroptionsdlg.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/.
+ *
+ * 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 <svl/itemset.hxx>
+
+#include <sdattr.hxx>
+#include <layeroptionsdlg.hxx>
+
+SdInsertLayerDlg::SdInsertLayerDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs,
+ bool bDeletable, const OUString& rStr)
+ : GenericDialogController(pWindow, "modules/sdraw/ui/insertlayer.ui", "InsertLayerDialog")
+ , m_xEdtName(m_xBuilder->weld_entry("name"))
+ , m_xEdtTitle(m_xBuilder->weld_entry("title"))
+ , m_xEdtDesc(m_xBuilder->weld_text_view("textview"))
+ , m_xCbxVisible(m_xBuilder->weld_check_button("visible"))
+ , m_xCbxPrintable(m_xBuilder->weld_check_button("printable"))
+ , m_xCbxLocked(m_xBuilder->weld_check_button("locked"))
+ , m_xNameFrame(m_xBuilder->weld_widget("nameframe"))
+{
+ m_xDialog->set_title(rStr);
+
+ m_xEdtName->set_text( static_cast<const SfxStringItem&>( rInAttrs.Get( ATTR_LAYER_NAME ) ).GetValue() );
+ m_xEdtTitle->set_text( static_cast<const SfxStringItem&>( rInAttrs.Get( ATTR_LAYER_TITLE ) ).GetValue() );
+ m_xEdtDesc->set_text( static_cast<const SfxStringItem&>( rInAttrs.Get( ATTR_LAYER_DESC ) ).GetValue() );
+ m_xEdtDesc->set_size_request(-1, m_xEdtDesc->get_height_rows(4));
+ m_xCbxVisible->set_active( static_cast<const SfxBoolItem&>( rInAttrs.Get( ATTR_LAYER_VISIBLE ) ).GetValue() );
+ m_xCbxPrintable->set_active( static_cast<const SfxBoolItem&>( rInAttrs.Get( ATTR_LAYER_PRINTABLE ) ).GetValue() );
+ m_xCbxLocked->set_active( static_cast<const SfxBoolItem&>( rInAttrs.Get( ATTR_LAYER_LOCKED ) ).GetValue() );
+ m_xNameFrame->set_sensitive(bDeletable);
+}
+
+SdInsertLayerDlg::~SdInsertLayerDlg()
+{
+}
+
+void SdInsertLayerDlg::GetAttr( SfxItemSet& rAttrs )
+{
+ rAttrs.Put( makeSdAttrLayerName( m_xEdtName->get_text() ) );
+ rAttrs.Put( makeSdAttrLayerTitle( m_xEdtTitle->get_text() ) );
+ rAttrs.Put( makeSdAttrLayerDesc( m_xEdtDesc->get_text() ) );
+ rAttrs.Put( makeSdAttrLayerVisible( m_xCbxVisible->get_active() ) );
+ rAttrs.Put( makeSdAttrLayerPrintable( m_xCbxPrintable->get_active() ) );
+ rAttrs.Put( makeSdAttrLayerLocked( m_xCbxLocked->get_active() ) );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/masterlayoutdlg.cxx b/sd/source/ui/dlg/masterlayoutdlg.cxx
new file mode 100644
index 000000000..ce4e069b0
--- /dev/null
+++ b/sd/source/ui/dlg/masterlayoutdlg.cxx
@@ -0,0 +1,133 @@
+/* -*- 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 <masterlayoutdlg.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <osl/diagnose.h>
+
+using namespace ::sd;
+
+MasterLayoutDialog::MasterLayoutDialog(weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage)
+ : GenericDialogController(pParent, "modules/simpress/ui/masterlayoutdlg.ui", "MasterLayoutDialog")
+ , mpDoc(pDoc)
+ , mpCurrentPage(pCurrentPage)
+ , mxCBDate(m_xBuilder->weld_check_button("datetime"))
+ , mxCBPageNumber(m_xBuilder->weld_check_button("pagenumber"))
+ , mxCBSlideNumber(m_xBuilder->weld_check_button("slidenumber"))
+ , mxCBHeader(m_xBuilder->weld_check_button("header"))
+ , mxCBFooter(m_xBuilder->weld_check_button("footer"))
+{
+ if( mpCurrentPage && !mpCurrentPage->IsMasterPage() )
+ {
+ mpCurrentPage = static_cast<SdPage*>(&(mpCurrentPage->TRG_GetMasterPage()));
+ }
+
+ if( mpCurrentPage == nullptr )
+ {
+ mpCurrentPage = pDoc->GetMasterSdPage( 0, PageKind::Standard );
+ OSL_FAIL( "MasterLayoutDialog::MasterLayoutDialog() - no current page?" );
+ }
+
+ switch( mpCurrentPage->GetPageKind() )
+ {
+ case PageKind::Standard:
+ {
+ mxCBHeader->set_sensitive(false);
+ mxCBPageNumber->set_label(mxCBSlideNumber->get_label());
+ break;
+ }
+ case PageKind::Notes:
+ break;
+ case PageKind::Handout:
+ break;
+ }
+
+ mbOldHeader = mpCurrentPage->GetPresObj( PresObjKind::Header ) != nullptr;
+ mbOldDate = mpCurrentPage->GetPresObj( PresObjKind::DateTime ) != nullptr;
+ mbOldFooter = mpCurrentPage->GetPresObj( PresObjKind::Footer ) != nullptr;
+ mbOldPageNumber = mpCurrentPage->GetPresObj( PresObjKind::SlideNumber ) != nullptr;
+
+ mxCBHeader->set_active( mbOldHeader );
+ mxCBDate->set_active( mbOldDate );
+ mxCBFooter->set_active( mbOldFooter );
+ mxCBPageNumber->set_active( mbOldPageNumber );
+}
+
+MasterLayoutDialog::~MasterLayoutDialog()
+{
+}
+
+short MasterLayoutDialog::run()
+{
+ if (GenericDialogController::run() == RET_OK)
+ applyChanges();
+ return RET_OK;
+}
+
+void MasterLayoutDialog::applyChanges()
+{
+ mpDoc->BegUndo(m_xDialog->get_title());
+
+ if( (mpCurrentPage->GetPageKind() != PageKind::Standard) && (mbOldHeader != mxCBHeader->get_active() ) )
+ {
+ if( mbOldHeader )
+ remove( PresObjKind::Header );
+ else
+ create( PresObjKind::Header );
+ }
+
+ if( mbOldFooter != mxCBFooter->get_active() )
+ {
+ if( mbOldFooter )
+ remove( PresObjKind::Footer );
+ else
+ create( PresObjKind::Footer );
+ }
+
+ if( mbOldDate != mxCBDate->get_active() )
+ {
+ if( mbOldDate )
+ remove( PresObjKind::DateTime );
+ else
+ create( PresObjKind::DateTime );
+ }
+
+ if( mbOldPageNumber != mxCBPageNumber->get_active() )
+ {
+ if( mbOldPageNumber )
+ remove( PresObjKind::SlideNumber );
+ else
+ create( PresObjKind::SlideNumber );
+ }
+
+ mpDoc->EndUndo();
+}
+
+void MasterLayoutDialog::create(PresObjKind eKind)
+{
+ mpCurrentPage->CreateDefaultPresObj(eKind);
+}
+
+void MasterLayoutDialog::remove( PresObjKind eKind )
+{
+ mpCurrentPage->DestroyDefaultPresObj(eKind);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/morphdlg.cxx b/sd/source/ui/dlg/morphdlg.cxx
new file mode 100644
index 000000000..c0d7f4e5a
--- /dev/null
+++ b/sd/source/ui/dlg/morphdlg.cxx
@@ -0,0 +1,107 @@
+/* -*- 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 <morphdlg.hxx>
+
+#include <sdmod.hxx>
+#include <sdiocmpt.hxx>
+#include <svx/xdef.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/svdobj.hxx>
+#include <svl/itemset.hxx>
+#include <com/sun/star/drawing/LineStyle.hpp>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+MorphDlg::MorphDlg(weld::Window* pParent, const SdrObject* pObj1, const SdrObject* pObj2 )
+ : GenericDialogController(pParent, "modules/sdraw/ui/crossfadedialog.ui", "CrossFadeDialog")
+ , m_xMtfSteps(m_xBuilder->weld_spin_button("increments"))
+ , m_xCbxAttributes(m_xBuilder->weld_check_button("attributes"))
+ , m_xCbxOrientation(m_xBuilder->weld_check_button("orientation"))
+{
+ LoadSettings();
+
+ SfxItemPool & rPool = pObj1->GetObjectItemPool();
+ SfxItemSet aSet1( rPool );
+ SfxItemSet aSet2( rPool );
+
+ aSet1.Put(pObj1->GetMergedItemSet());
+ aSet2.Put(pObj2->GetMergedItemSet());
+
+ const drawing::LineStyle eLineStyle1 = aSet1.Get( XATTR_LINESTYLE ).GetValue();
+ const drawing::LineStyle eLineStyle2 = aSet2.Get( XATTR_LINESTYLE ).GetValue();
+ const drawing::FillStyle eFillStyle1 = aSet1.Get( XATTR_FILLSTYLE ).GetValue();
+ const drawing::FillStyle eFillStyle2 = aSet2.Get( XATTR_FILLSTYLE ).GetValue();
+
+ if ( ( ( eLineStyle1 == drawing::LineStyle_NONE ) || ( eLineStyle2 == drawing::LineStyle_NONE ) ) &&
+ ( ( eFillStyle1 != drawing::FillStyle_SOLID ) || ( eFillStyle2 != drawing::FillStyle_SOLID ) ) )
+ {
+ m_xCbxAttributes->set_sensitive(false);
+ }
+}
+
+MorphDlg::~MorphDlg()
+{
+}
+
+void MorphDlg::LoadSettings()
+{
+ tools::SvRef<SotStorageStream> xIStm( SD_MOD()->GetOptionStream( SD_OPTION_MORPHING ,
+ SdOptionStreamMode::Load ) );
+ sal_uInt16 nSteps;
+ bool bOrient, bAttrib;
+
+ if( xIStm.is() )
+ {
+ SdIOCompat aCompat( *xIStm, StreamMode::READ );
+
+ xIStm->ReadUInt16( nSteps ).ReadCharAsBool( bOrient ).ReadCharAsBool( bAttrib );
+ }
+ else
+ {
+ nSteps = 16;
+ bOrient = bAttrib = true;
+ }
+
+ m_xMtfSteps->set_value(nSteps);
+ m_xCbxOrientation->set_active(bOrient);
+ m_xCbxAttributes->set_active(bAttrib);
+}
+
+void MorphDlg::SaveSettings() const
+{
+ tools::SvRef<SotStorageStream> xOStm( SD_MOD()->GetOptionStream( SD_OPTION_MORPHING ,
+ SdOptionStreamMode::Store ) );
+
+ if( xOStm.is() )
+ {
+ SdIOCompat aCompat( *xOStm, StreamMode::WRITE, 1 );
+
+ xOStm->WriteUInt16( m_xMtfSteps->get_value() )
+ .WriteBool( m_xCbxOrientation->get_active() )
+ .WriteBool( m_xCbxAttributes->get_active() );
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/navigatr.cxx b/sd/source/ui/dlg/navigatr.cxx
new file mode 100644
index 000000000..78525efe5
--- /dev/null
+++ b/sd/source/ui/dlg/navigatr.cxx
@@ -0,0 +1,735 @@
+/* -*- 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 <memory>
+#include <sal/config.h>
+
+#include <osl/file.hxx>
+#include <tools/urlobj.hxx>
+#include <sfx2/fcontnr.hxx>
+#include <svl/stritem.hxx>
+#include <sfx2/docfile.hxx>
+#include <svl/intitem.hxx>
+#include <sfx2/dispatch.hxx>
+
+#include <sfx2/viewfrm.hxx>
+
+#include <pres.hxx>
+#include <navigatr.hxx>
+#include <pgjump.hxx>
+#include <app.hrc>
+
+#include <bitmaps.hlst>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <slideshow.hxx>
+#include <FrameView.hxx>
+#include <Window.hxx>
+
+#include <DrawViewShell.hxx>
+
+/**
+ * SdNavigatorWin - FloatingWindow
+ */
+SdNavigatorWin::SdNavigatorWin(weld::Widget* pParent, SfxBindings* pInBindings, SfxNavigator* pNavigatorDlg)
+ : PanelLayout(pParent, "NavigatorPanel", "modules/simpress/ui/navigatorpanel.ui")
+ , mxToolbox(m_xBuilder->weld_toolbar("toolbox"))
+ , mxTlbObjects(new SdPageObjsTLV(m_xBuilder->weld_tree_view("tree")))
+ , mxLbDocs(m_xBuilder->weld_combo_box("documents"))
+ , mxDragModeMenu(m_xBuilder->weld_menu("dragmodemenu"))
+ , mxShapeMenu(m_xBuilder->weld_menu("shapemenu"))
+ , mxNavigatorDlg(pNavigatorDlg)
+ , mbDocImported ( false )
+ // On changes of the DragType: adjust SelectionMode of TLB!
+ , meDragType ( NAVIGATOR_DRAGTYPE_EMBEDDED )
+ , mpBindings ( pInBindings )
+{
+ mxTlbObjects->SetViewFrame( mpBindings->GetDispatcher()->GetFrame() );
+
+ mxTlbObjects->connect_row_activated(LINK(this, SdNavigatorWin, ClickObjectHdl));
+ mxTlbObjects->set_selection_mode(SelectionMode::Single);
+
+ mxToolbox->connect_clicked(LINK(this, SdNavigatorWin, SelectToolboxHdl));
+ mxToolbox->connect_menu_toggled(LINK(this, SdNavigatorWin, DropdownClickToolBoxHdl));
+
+ mxToolbox->set_item_menu("dragmode", mxDragModeMenu.get());
+ mxDragModeMenu->connect_activate(LINK(this, SdNavigatorWin, MenuSelectHdl));
+
+ // Shape filter drop down menu.
+ mxToolbox->set_item_menu("shapes", mxShapeMenu.get());
+ mxShapeMenu->connect_activate(LINK(this, SdNavigatorWin, ShapeFilterCallback));
+
+ mxTlbObjects->SetSdNavigator(this);
+
+ // DragTypeListBox
+ mxLbDocs->set_size_request(42, -1); // set a nominal width so it takes width of surroundings
+ mxLbDocs->connect_changed(LINK(this, SdNavigatorWin, SelectDocumentHdl));
+
+ SetDragImage();
+
+ mxToolbox->connect_key_press(LINK(this, SdNavigatorWin, KeyInputHdl));
+ mxTlbObjects->connect_key_press(LINK(this, SdNavigatorWin, KeyInputHdl));
+ mxLbDocs->connect_key_press(LINK(this, SdNavigatorWin, KeyInputHdl));
+}
+
+void SdNavigatorWin::FirstFocus()
+{
+ // set focus to listbox, otherwise it is in the toolbox which is only useful
+ // for keyboard navigation
+ mxTlbObjects->grab_focus();
+}
+
+weld::Window* SdNavigatorWin::GetFrameWeld() const
+{
+ if (mxNavigatorDlg)
+ return mxNavigatorDlg->GetFrameWeld();
+ return PanelLayout::GetFrameWeld();
+}
+
+void SdNavigatorWin::SetUpdateRequestFunctor(const UpdateRequestFunctor& rUpdateRequest)
+{
+ mpNavigatorCtrlItem.reset( new SdNavigatorControllerItem(SID_NAVIGATOR_STATE, this, mpBindings, rUpdateRequest) );
+ mpPageNameCtrlItem.reset( new SdPageNameControllerItem(SID_NAVIGATOR_PAGENAME, this, mpBindings) );
+
+ // InitTlb; is initiated over Slot
+ if (rUpdateRequest)
+ rUpdateRequest();
+}
+
+SdNavigatorWin::~SdNavigatorWin()
+{
+ mpNavigatorCtrlItem.reset();
+ mpPageNameCtrlItem.reset();
+ mxDragModeMenu.reset();
+ mxShapeMenu.reset();
+ mxToolbox.reset();
+ mxTlbObjects.reset();
+ mxLbDocs.reset();
+}
+
+//when object is marked , fresh the corresponding entry tree .
+void SdNavigatorWin::FreshTree( const SdDrawDocument* pDoc )
+{
+ SdDrawDocument* pNonConstDoc = const_cast<SdDrawDocument*>(pDoc); // const as const can...
+ sd::DrawDocShell* pDocShell = pNonConstDoc->GetDocSh();
+ const OUString& aDocShName( pDocShell->GetName() );
+ OUString aDocName = pDocShell->GetMedium()->GetName();
+ mxTlbObjects->Fill( pDoc, false, aDocName ); // Only normal pages
+ RefreshDocumentLB();
+ mxLbDocs->set_active_text(aDocShName);
+}
+
+void SdNavigatorWin::InitTreeLB( const SdDrawDocument* pDoc )
+{
+ SdDrawDocument* pNonConstDoc = const_cast<SdDrawDocument*>(pDoc); // const as const can...
+ ::sd::DrawDocShell* pDocShell = pNonConstDoc->GetDocSh();
+ OUString aDocShName( pDocShell->GetName() );
+ ::sd::ViewShell* pViewShell = pDocShell->GetViewShell();
+
+ // Restore the 'ShowAllShapes' flag from the last time (in this session)
+ // that the navigator was shown.
+ if (pViewShell != nullptr)
+ {
+ ::sd::FrameView* pFrameView = pViewShell->GetFrameView();
+ if (pFrameView != nullptr)
+ mxTlbObjects->SetShowAllShapes(pFrameView->IsNavigatorShowingAllShapes(), false);
+ }
+
+ // Disable the shape filter drop down menu when there is a running slide
+ // show.
+ if (pViewShell!=nullptr && sd::SlideShow::IsRunning( pViewShell->GetViewShellBase() ))
+ mxToolbox->set_item_sensitive("shapes", false);
+ else
+ mxToolbox->set_item_sensitive("shapes", true);
+
+ if( !mxTlbObjects->IsEqualToDoc( pDoc ) )
+ {
+ OUString aDocName = pDocShell->GetMedium()->GetName();
+ mxTlbObjects->clear();
+ mxTlbObjects->Fill( pDoc, false, aDocName ); // only normal pages
+
+ RefreshDocumentLB();
+ mxLbDocs->set_active_text(aDocShName);
+ }
+ else
+ {
+ mxLbDocs->set_active(-1);
+ mxLbDocs->set_active_text(aDocShName);
+
+// commented in order to fix 30246
+// if( mxLbDocs->get_active() == -1 )
+ {
+ RefreshDocumentLB();
+ mxLbDocs->set_active_text(aDocShName);
+ }
+ }
+
+ SfxViewFrame* pViewFrame = ( ( pViewShell && pViewShell->GetViewFrame() ) ? pViewShell->GetViewFrame() : SfxViewFrame::Current() );
+ if( pViewFrame )
+ pViewFrame->GetBindings().Invalidate(SID_NAVIGATOR_PAGENAME, true, true);
+}
+
+/**
+ * DragType is set on dependence if a Drag is even possible. For example,
+ * under certain circumstances, it is not allowed to drag graphics (#31038#).
+ */
+NavigatorDragType SdNavigatorWin::GetNavigatorDragType()
+{
+ NavigatorDragType eDT = meDragType;
+ NavDocInfo* pInfo = GetDocInfo();
+
+ if( ( eDT == NAVIGATOR_DRAGTYPE_LINK ) && ( ( pInfo && !pInfo->HasName() ) || !mxTlbObjects->IsLinkableSelected() ) )
+ eDT = NAVIGATOR_DRAGTYPE_NONE;
+
+ return eDT;
+}
+
+SdPageObjsTLV& SdNavigatorWin::GetObjects()
+{
+ return *mxTlbObjects;
+}
+
+IMPL_LINK(SdNavigatorWin, SelectToolboxHdl, const OString&, rCommand, void)
+{
+ PageJump ePage = PAGE_NONE;
+
+ if (rCommand == "first")
+ ePage = PAGE_FIRST;
+ else if (rCommand == "previous")
+ ePage = PAGE_PREVIOUS;
+ else if (rCommand == "next")
+ ePage = PAGE_NEXT;
+ else if (rCommand == "last")
+ ePage = PAGE_LAST;
+ else if (rCommand == "dragmode")
+ mxToolbox->set_menu_item_active("dragmode", !mxToolbox->get_menu_item_active("dragmode"));
+ else if (rCommand == "shapes")
+ mxToolbox->set_menu_item_active("shapes", !mxToolbox->get_menu_item_active("shapes"));
+
+ if (ePage != PAGE_NONE)
+ {
+ SfxUInt16Item aItem( SID_NAVIGATOR_PAGE, static_cast<sal_uInt16>(ePage) );
+ mpBindings->GetDispatcher()->ExecuteList(SID_NAVIGATOR_PAGE,
+ SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem });
+ }
+}
+
+IMPL_LINK(SdNavigatorWin, DropdownClickToolBoxHdl, const OString&, rCommand, void)
+{
+ if (!mxToolbox->get_menu_item_active(rCommand))
+ return;
+
+ if (rCommand == "dragmode")
+ {
+ NavDocInfo* pInfo = GetDocInfo();
+ if( ( pInfo && !pInfo->HasName() ) || !mxTlbObjects->IsLinkableSelected() )
+ {
+ mxDragModeMenu->set_sensitive(OString::number(NAVIGATOR_DRAGTYPE_LINK), false);
+ mxDragModeMenu->set_sensitive(OString::number(NAVIGATOR_DRAGTYPE_URL), false);
+ meDragType = NAVIGATOR_DRAGTYPE_EMBEDDED;
+ }
+
+ mxDragModeMenu->set_active(OString::number(meDragType), true);
+ }
+ else if (rCommand == "shapes")
+ {
+ bool bAll = mxTlbObjects->GetShowAllShapes();
+ mxShapeMenu->set_active("named", !bAll);
+ mxShapeMenu->set_active("all", bAll);
+ }
+}
+
+IMPL_LINK_NOARG(SdNavigatorWin, ClickObjectHdl, weld::TreeView&, bool)
+{
+ if( !mbDocImported || mxLbDocs->get_active() != 0 )
+ {
+ NavDocInfo* pInfo = GetDocInfo();
+
+ // if it is the active window, we jump to the page
+ if( pInfo && pInfo->IsActive() )
+ {
+ OUString aStr(mxTlbObjects->get_selected_text());
+
+ if( !aStr.isEmpty() )
+ {
+ SfxStringItem aItem( SID_NAVIGATOR_OBJECT, aStr );
+ mpBindings->GetDispatcher()->ExecuteList(
+ SID_NAVIGATOR_OBJECT,
+ SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem });
+
+ // moved here from SetGetFocusHdl. Reset the
+ // focus only if something has been selected in the
+ // document.
+ SfxViewShell* pCurSh = SfxViewShell::Current();
+
+ if ( pCurSh )
+ {
+ vcl::Window* pShellWnd = pCurSh->GetWindow();
+ if ( pShellWnd )
+ pShellWnd->GrabFocus();
+ }
+
+ // We navigated to an object, but the current shell may be
+ // still the slide sorter. Explicitly try to grab the draw
+ // shell focus, so follow-up operations work with the object
+ // and not with the whole slide.
+ sd::DrawDocShell* pDocShell = pInfo->mpDocShell;
+ if (pDocShell)
+ {
+ sd::ViewShell* pViewShell = pDocShell->GetViewShell();
+ if (pViewShell)
+ {
+ vcl::Window* pWindow = pViewShell->GetActiveWindow();
+ if (pWindow)
+ pWindow->GrabFocus();
+ }
+ }
+
+ if (!mxTlbObjects->IsNavigationGrabsFocus())
+ // This is the case when keyboard navigation inside the
+ // navigator should continue to work.
+ mxTlbObjects->grab_focus();
+ }
+ }
+ }
+ return false;
+}
+
+IMPL_LINK_NOARG(SdNavigatorWin, SelectDocumentHdl, weld::ComboBox&, void)
+{
+ OUString aStrLb = mxLbDocs->get_active_text();
+ tools::Long nPos = mxLbDocs->get_active();
+ bool bFound = false;
+ ::sd::DrawDocShell* pDocShell = nullptr;
+ NavDocInfo* pInfo = GetDocInfo();
+
+ // is it a dragged object?
+ if( mbDocImported && nPos == 0 )
+ {
+ // construct document in TLB
+ InsertFile( aStrLb );
+ }
+ else if (pInfo)
+ {
+ pDocShell = pInfo->mpDocShell;
+
+ bFound = true;
+ }
+
+ if( bFound )
+ {
+ SdDrawDocument* pDoc = pDocShell->GetDoc();
+ if( !mxTlbObjects->IsEqualToDoc( pDoc ) )
+ {
+ SdDrawDocument* pNonConstDoc = pDoc; // const as const can...
+ ::sd::DrawDocShell* pNCDocShell = pNonConstDoc->GetDocSh();
+ OUString aDocName = pNCDocShell->GetMedium()->GetName();
+ mxTlbObjects->clear();
+ mxTlbObjects->Fill( pDoc, false, aDocName ); // only normal pages
+ }
+ }
+
+ // check if link or url is possible
+ if( ( pInfo && !pInfo->HasName() ) || !mxTlbObjects->IsLinkableSelected() || ( meDragType != NAVIGATOR_DRAGTYPE_EMBEDDED ) )
+ {
+ meDragType = NAVIGATOR_DRAGTYPE_EMBEDDED;
+ SetDragImage();
+ }
+}
+
+/**
+ * Set DrageType and set image accordingly to it.
+ */
+IMPL_LINK(SdNavigatorWin, MenuSelectHdl, const OString&, rIdent, void)
+{
+ sal_uInt32 nMenuId = rIdent.toUInt32();
+
+ NavigatorDragType eDT = static_cast<NavigatorDragType>(nMenuId);
+ if( meDragType == eDT )
+ return;
+
+ meDragType = eDT;
+ SetDragImage();
+
+ if( meDragType == NAVIGATOR_DRAGTYPE_URL )
+ {
+ // patch, prevents endless loop
+ if (mxTlbObjects->count_selected_rows() > 1)
+ mxTlbObjects->unselect_all();
+
+ mxTlbObjects->set_selection_mode(SelectionMode::Single);
+ }
+ else
+ mxTlbObjects->set_selection_mode(SelectionMode::Multiple);
+}
+
+IMPL_LINK( SdNavigatorWin, ShapeFilterCallback, const OString&, rIdent, void )
+{
+ bool bShowAllShapes(mxTlbObjects->GetShowAllShapes());
+ if (rIdent == "named")
+ bShowAllShapes = false;
+ else if (rIdent == "all")
+ bShowAllShapes = true;
+ else
+ OSL_FAIL("SdNavigatorWin::ShapeFilterCallback called for unknown menu entry");
+
+ mxTlbObjects->SetShowAllShapes(bShowAllShapes, true);
+
+ // Remember the selection in the FrameView.
+ NavDocInfo* pInfo = GetDocInfo();
+ if (pInfo == nullptr)
+ return;
+
+ ::sd::DrawDocShell* pDocShell = pInfo->mpDocShell;
+ if (pDocShell != nullptr)
+ {
+ ::sd::ViewShell* pViewShell = pDocShell->GetViewShell();
+ if (pViewShell != nullptr)
+ {
+ ::sd::FrameView* pFrameView = pViewShell->GetFrameView();
+ if (pFrameView != nullptr)
+ {
+ pFrameView->SetIsNavigatorShowingAllShapes(bShowAllShapes);
+ }
+ }
+ }
+}
+
+bool SdNavigatorWin::InsertFile(const OUString& rFileName)
+{
+ INetURLObject aURL( rFileName );
+
+ if( aURL.GetProtocol() == INetProtocol::NotValid )
+ {
+ OUString aURLStr;
+ osl::FileBase::getFileURLFromSystemPath( rFileName, aURLStr );
+ aURL = INetURLObject( aURLStr );
+ }
+
+ // get adjusted FileName
+ OUString aFileName( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
+
+ if (aFileName.isEmpty())
+ {
+ // show actual document again
+ maDropFileName = aFileName;
+ }
+ else
+ {
+ // show dragged-in document
+ std::shared_ptr<const SfxFilter> pFilter;
+ ErrCode nErr = ERRCODE_NONE;
+
+ if (aFileName != maDropFileName)
+ {
+ SfxMedium aMed(aFileName, (StreamMode::READ | StreamMode::SHARE_DENYNONE));
+ SfxFilterMatcher aMatch( "simpress" );
+ aMed.UseInteractionHandler( true );
+ nErr = aMatch.GuessFilter(aMed, pFilter);
+ }
+
+ if ((pFilter && !nErr) || aFileName == maDropFileName)
+ {
+ // The medium may be opened with READ/WRITE. Therefore, we first
+ // check if it contains a Storage.
+ std::unique_ptr<SfxMedium> xMedium(new SfxMedium(aFileName,
+ StreamMode::READ | StreamMode::NOCREATE));
+
+ if (xMedium->IsStorage())
+ {
+ // Now depending on mode:
+ // mxTlbObjects->set_selection_mode(SelectionMode::Multiple);
+ // handover of ownership of xMedium;
+ SdDrawDocument* pDropDoc = mxTlbObjects->GetBookmarkDoc(xMedium.release());
+
+ if (pDropDoc)
+ {
+ mxTlbObjects->clear();
+ maDropFileName = aFileName;
+
+ if( !mxTlbObjects->IsEqualToDoc( pDropDoc ) )
+ {
+ // only normal pages
+ mxTlbObjects->Fill(pDropDoc, false, maDropFileName);
+ RefreshDocumentLB( &maDropFileName );
+ }
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void SdNavigatorWin::RefreshDocumentLB( const OUString* pDocName )
+{
+ sal_Int32 nPos = 0;
+
+ if( pDocName )
+ {
+ if( mbDocImported )
+ mxLbDocs->remove(0);
+
+ mxLbDocs->insert_text(0, *pDocName);
+ mbDocImported = true;
+ }
+ else
+ {
+ nPos = mxLbDocs->get_active();
+ if (nPos == -1)
+ nPos = 0;
+
+ OUString aStr;
+ if( mbDocImported )
+ aStr = mxLbDocs->get_text(0);
+
+ mxLbDocs->clear();
+
+ // delete list of DocInfos
+ maDocList.clear();
+
+ if( mbDocImported )
+ mxLbDocs->insert_text(0, aStr);
+
+ ::sd::DrawDocShell* pCurrentDocShell =
+ dynamic_cast< ::sd::DrawDocShell *>( SfxObjectShell::Current() );
+ SfxObjectShell* pSfxDocShell = SfxObjectShell::GetFirst([](const SfxObjectShell*){return true;}, false);
+ while( pSfxDocShell )
+ {
+ ::sd::DrawDocShell* pDocShell = dynamic_cast< ::sd::DrawDocShell *>( pSfxDocShell );
+ if( pDocShell && !pDocShell->IsInDestruction() && ( pDocShell->GetCreateMode() != SfxObjectCreateMode::EMBEDDED ) )
+ {
+ NavDocInfo aInfo ;
+ aInfo.mpDocShell = pDocShell;
+
+ SfxMedium *pMedium = pDocShell->GetMedium();
+ aStr = pMedium ? pMedium->GetName() : OUString();
+ if( !aStr.isEmpty() )
+ aInfo.SetName( true );
+ else
+ aInfo.SetName( false );
+ // at the moment, we use the name of the shell again (i.e.
+ // without path) since Koose thinks it is an error if the path
+ // is shown in url notation!
+ aStr = pDocShell->GetName();
+
+ mxLbDocs->append_text(aStr);
+
+ if( pDocShell == pCurrentDocShell )
+ aInfo.SetActive( true );
+ else
+ aInfo.SetActive( false );
+
+ maDocList.push_back( aInfo );
+ }
+ pSfxDocShell = SfxObjectShell::GetNext( *pSfxDocShell, [](const SfxObjectShell*){return true;}, false );
+ }
+ }
+ mxLbDocs->set_active(nPos);
+}
+
+OUString SdNavigatorWin::GetDragTypeSdBmpId(NavigatorDragType eDT)
+{
+ switch( eDT )
+ {
+ case NAVIGATOR_DRAGTYPE_NONE:
+ return OUString();
+ case NAVIGATOR_DRAGTYPE_URL:
+ return BMP_HYPERLINK;
+ case NAVIGATOR_DRAGTYPE_EMBEDDED:
+ return BMP_EMBEDDED;
+ case NAVIGATOR_DRAGTYPE_LINK:
+ return BMP_LINK;
+ default: OSL_FAIL( "No resource for DragType available!" );
+ }
+ return OUString();
+}
+
+NavDocInfo* SdNavigatorWin::GetDocInfo()
+{
+ sal_uInt32 nPos = mxLbDocs->get_active();
+
+ if( mbDocImported )
+ {
+ if( nPos == 0 )
+ {
+ return nullptr;
+ }
+ nPos--;
+ }
+
+ return nPos < maDocList.size() ? &(maDocList[ nPos ]) : nullptr;
+}
+
+/**
+ * catch ESCAPE in order to end show
+ */
+IMPL_LINK(SdNavigatorWin, KeyInputHdl, const KeyEvent&, rKEvt, bool)
+{
+ bool bConsumed = false;
+
+ if (KEY_ESCAPE == rKEvt.GetKeyCode().GetCode())
+ {
+ // during drag'n'drop we just stop the drag but do not close the navigator
+ if (!SdPageObjsTLV::IsInDrag())
+ {
+ ::sd::ViewShellBase* pBase = ::sd::ViewShellBase::GetViewShellBase( mpBindings->GetDispatcher()->GetFrame());
+ if (pBase)
+ sd::SlideShow::Stop(*pBase);
+ bConsumed = true;
+ }
+ }
+
+ return bConsumed;
+}
+
+void SdNavigatorWin::SetDragImage()
+{
+ mxToolbox->set_item_icon_name("dragmode", GetDragTypeSdBmpId(meDragType));
+}
+
+/**
+ * ControllerItem for Navigator
+ */
+SdNavigatorControllerItem::SdNavigatorControllerItem(
+ sal_uInt16 _nId,
+ SdNavigatorWin* pNavWin,
+ SfxBindings* _pBindings,
+ const SdNavigatorWin::UpdateRequestFunctor& rUpdateRequest)
+ : SfxControllerItem( _nId, *_pBindings ),
+ pNavigatorWin( pNavWin ),
+ maUpdateRequest(rUpdateRequest)
+{
+}
+
+void SdNavigatorControllerItem::StateChangedAtToolBoxControl( sal_uInt16 nSId,
+ SfxItemState eState, const SfxPoolItem* pItem )
+{
+ if( eState < SfxItemState::DEFAULT || nSId != SID_NAVIGATOR_STATE )
+ return;
+
+ // only if doc in LB is the active
+ NavDocInfo* pInfo = pNavigatorWin->GetDocInfo();
+ if( !(pInfo && pInfo->IsActive()) )
+ return;
+
+ if (::sd::DrawDocShell* pDrawDocShell = pInfo->GetDrawDocShell())
+ {
+ const auto pDrawViewShell =
+ static_cast<::sd::DrawViewShell *>(pDrawDocShell->GetViewShell());
+ if (pDrawViewShell)
+ {
+ bool bEditModePage(pDrawViewShell->GetEditMode() == EditMode::Page);
+ pNavigatorWin->mxToolbox->set_sensitive(bEditModePage);
+ pNavigatorWin->mxLbDocs->set_sensitive(bEditModePage);
+ pNavigatorWin->mxTlbObjects->set_sensitive(bEditModePage);
+ }
+ }
+
+ const SfxUInt32Item& rStateItem = dynamic_cast<const SfxUInt32Item&>(*pItem);
+ NavState nState = static_cast<NavState>(rStateItem.GetValue());
+
+ // First
+ if (nState & NavState::BtnFirstEnabled &&
+ !pNavigatorWin->mxToolbox->get_item_sensitive("first"))
+ pNavigatorWin->mxToolbox->set_item_sensitive("first", true);
+ if (nState & NavState::BtnFirstDisabled &&
+ pNavigatorWin->mxToolbox->get_item_sensitive("first"))
+ pNavigatorWin->mxToolbox->set_item_sensitive("first", false);
+
+ // Prev
+ if (nState & NavState::BtnPrevEnabled &&
+ !pNavigatorWin->mxToolbox->get_item_sensitive("previous"))
+ pNavigatorWin->mxToolbox->set_item_sensitive("previous", true);
+ if (nState & NavState::BtnPrevDisabled &&
+ pNavigatorWin->mxToolbox->get_item_sensitive("previous"))
+ pNavigatorWin->mxToolbox->set_item_sensitive("previous", false);
+
+ // Last
+ if (nState & NavState::BtnLastEnabled &&
+ !pNavigatorWin->mxToolbox->get_item_sensitive("last"))
+ pNavigatorWin->mxToolbox->set_item_sensitive("last", true);
+ if (nState & NavState::BtnLastDisabled &&
+ pNavigatorWin->mxToolbox->get_item_sensitive("last"))
+ pNavigatorWin->mxToolbox->set_item_sensitive("last", false);
+
+ // Next
+ if (nState & NavState::BtnNextEnabled &&
+ !pNavigatorWin->mxToolbox->get_item_sensitive("next"))
+ pNavigatorWin->mxToolbox->set_item_sensitive("next", true);
+ if (nState & NavState::BtnNextDisabled &&
+ pNavigatorWin->mxToolbox->get_item_sensitive("next"))
+ pNavigatorWin->mxToolbox->set_item_sensitive("next", false);
+
+ if (nState & NavState::TableUpdate)
+ {
+ // InitTlb; is initiated by Slot
+ if (maUpdateRequest)
+ maUpdateRequest();
+ }
+}
+
+/**
+ * ControllerItem for Navigator to show page in TreeLB
+ */
+SdPageNameControllerItem::SdPageNameControllerItem(
+ sal_uInt16 _nId,
+ SdNavigatorWin* pNavWin,
+ SfxBindings* _pBindings)
+ : SfxControllerItem( _nId, *_pBindings ),
+ pNavigatorWin( pNavWin )
+{
+}
+
+void SdPageNameControllerItem::StateChangedAtToolBoxControl( sal_uInt16 nSId,
+ SfxItemState eState, const SfxPoolItem* pItem )
+{
+ if( eState < SfxItemState::DEFAULT || nSId != SID_NAVIGATOR_PAGENAME )
+ return;
+
+ // only if doc in LB is the active
+ NavDocInfo* pInfo = pNavigatorWin->GetDocInfo();
+ if( !(pInfo && pInfo->IsActive()) )
+ return;
+
+ const SfxStringItem& rStateItem = dynamic_cast<const SfxStringItem&>(*pItem);
+ const OUString& aPageName = rStateItem.GetValue();
+
+ if( !pNavigatorWin->mxTlbObjects->HasSelectedChildren( aPageName ) )
+ {
+ if (pNavigatorWin->mxTlbObjects->get_selection_mode() == SelectionMode::Multiple)
+ {
+ // because otherwise it is always additional select
+ pNavigatorWin->mxTlbObjects->unselect_all();
+ }
+ pNavigatorWin->mxTlbObjects->SelectEntry( aPageName );
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/paragr.cxx b/sd/source/ui/dlg/paragr.cxx
new file mode 100644
index 000000000..be9df558e
--- /dev/null
+++ b/sd/source/ui/dlg/paragr.cxx
@@ -0,0 +1,169 @@
+/* -*- 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 <svl/cjkoptions.hxx>
+#include <svl/eitem.hxx>
+#include <svl/intitem.hxx>
+
+#include <svx/dialogs.hrc>
+#include <svx/svxids.hrc>
+#include <svx/flagsdef.hxx>
+#include <svx/xcolit.hxx>
+
+#include <paragr.hxx>
+#include <sdattr.hrc>
+
+namespace {
+
+class SdParagraphNumTabPage : public SfxTabPage
+{
+public:
+ SdParagraphNumTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rSet);
+ static std::unique_ptr<SfxTabPage> Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rSet );
+
+ static WhichRangesContainer GetRanges();
+
+ virtual bool FillItemSet( SfxItemSet* rSet ) override;
+ virtual void Reset( const SfxItemSet* rSet ) override;
+
+private:
+ bool mbModified;
+ std::unique_ptr<weld::CheckButton> m_xNewStartCB;
+ std::unique_ptr<weld::CheckButton> m_xNewStartNumberCB;
+ std::unique_ptr<weld::SpinButton> m_xNewStartNF;
+
+ DECL_LINK( ImplNewStartHdl, weld::Toggleable&, void );
+};
+
+}
+
+SdParagraphNumTabPage::SdParagraphNumTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rAttr)
+ : SfxTabPage(pPage, pController, "modules/sdraw/ui/paranumberingtab.ui", "DrawParaNumbering", &rAttr)
+ , mbModified(false)
+ , m_xNewStartCB(m_xBuilder->weld_check_button("checkbuttonCB_NEW_START"))
+ , m_xNewStartNumberCB(m_xBuilder->weld_check_button("checkbuttonCB_NUMBER_NEW_START"))
+ , m_xNewStartNF(m_xBuilder->weld_spin_button("spinbuttonNF_NEW_START"))
+{
+ m_xNewStartCB->connect_toggled(LINK(this, SdParagraphNumTabPage, ImplNewStartHdl));
+ m_xNewStartNumberCB->connect_toggled(LINK(this, SdParagraphNumTabPage, ImplNewStartHdl));
+}
+
+std::unique_ptr<SfxTabPage> SdParagraphNumTabPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet * rAttrSet)
+{
+ return std::make_unique<SdParagraphNumTabPage>(pPage, pController, *rAttrSet);
+}
+
+WhichRangesContainer SdParagraphNumTabPage::GetRanges()
+{
+ return WhichRangesContainer(svl::Items<ATTR_PARANUMBERING_START, ATTR_PARANUMBERING_END>);
+}
+
+bool SdParagraphNumTabPage::FillItemSet( SfxItemSet* rSet )
+{
+ if (m_xNewStartCB->get_state_changed_from_saved() ||
+ m_xNewStartNumberCB->get_state_changed_from_saved()||
+ m_xNewStartNF->get_value_changed_from_saved())
+ {
+ mbModified = true;
+ bool bNewStartChecked = TRISTATE_TRUE == m_xNewStartCB->get_state();
+ bool bNumberNewStartChecked = TRISTATE_TRUE == m_xNewStartNumberCB->get_state();
+ rSet->Put(SfxBoolItem(ATTR_NUMBER_NEWSTART, bNewStartChecked));
+
+ const sal_Int16 nStartAt = static_cast<sal_Int16>(m_xNewStartNF->get_value());
+ rSet->Put(SfxInt16Item(ATTR_NUMBER_NEWSTART_AT, bNumberNewStartChecked && bNewStartChecked ? nStartAt : -1));
+ }
+
+ return mbModified;
+}
+
+void SdParagraphNumTabPage::Reset( const SfxItemSet* rSet )
+{
+ SfxItemState eItemState = rSet->GetItemState( ATTR_NUMBER_NEWSTART );
+ if(eItemState > SfxItemState::DEFAULT )
+ {
+ const SfxBoolItem& rStart = rSet->Get(ATTR_NUMBER_NEWSTART);
+ m_xNewStartCB->set_state( rStart.GetValue() ? TRISTATE_TRUE : TRISTATE_FALSE );
+ }
+ else
+ {
+ m_xNewStartCB->set_state(TRISTATE_INDET);
+ m_xNewStartCB->set_sensitive(false);
+ }
+ m_xNewStartCB->save_state();
+
+ eItemState = rSet->GetItemState( ATTR_NUMBER_NEWSTART_AT);
+ if( eItemState > SfxItemState::DEFAULT )
+ {
+ sal_Int16 nNewStart = rSet->Get(ATTR_NUMBER_NEWSTART_AT).GetValue();
+ m_xNewStartNumberCB->set_active(-1 != nNewStart);
+ if(-1 == nNewStart)
+ nNewStart = 1;
+
+ m_xNewStartNF->set_value(nNewStart);
+ }
+ else
+ {
+ m_xNewStartCB->set_state(TRISTATE_INDET);
+ }
+ ImplNewStartHdl(*m_xNewStartCB);
+ m_xNewStartNF->save_value();
+ m_xNewStartNumberCB->save_state();
+ mbModified = false;
+}
+
+IMPL_LINK_NOARG(SdParagraphNumTabPage, ImplNewStartHdl, weld::Toggleable&, void)
+{
+ bool bEnable = m_xNewStartCB->get_active();
+ m_xNewStartNumberCB->set_sensitive(bEnable);
+ m_xNewStartNF->set_sensitive(bEnable && m_xNewStartNumberCB->get_active());
+}
+
+SdParagraphDlg::SdParagraphDlg(weld::Window* pParent, const SfxItemSet* pAttr)
+ : SfxTabDialogController(pParent, "modules/sdraw/ui/drawparadialog.ui",
+ "DrawParagraphPropertiesDialog", pAttr)
+{
+ AddTabPage( "labelTP_PARA_STD", RID_SVXPAGE_STD_PARAGRAPH);
+
+ if( SvtCJKOptions::IsAsianTypographyEnabled() )
+ AddTabPage( "labelTP_PARA_ASIAN", RID_SVXPAGE_PARA_ASIAN);
+ else
+ RemoveTabPage( "labelTP_PARA_ASIAN" );
+
+ AddTabPage( "labelTP_PARA_ALIGN", RID_SVXPAGE_ALIGN_PARAGRAPH);
+
+ static const bool bShowParaNumbering = ( getenv( "SD_SHOW_NUMBERING_PAGE" ) != nullptr );
+ if( bShowParaNumbering )
+ AddTabPage( "labelNUMBERING", SdParagraphNumTabPage::Create, SdParagraphNumTabPage::GetRanges );
+ else
+ RemoveTabPage( "labelNUMBERING" );
+
+ AddTabPage("labelTP_TABULATOR", RID_SVXPAGE_TABULATOR);
+}
+
+void SdParagraphDlg::PageCreated(const OString& rId, SfxTabPage &rPage)
+{
+ SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool()));
+ if (rId == "labelTP_PARA_STD")
+ {
+ aSet.Put(SfxUInt32Item(SID_SVXSTDPARAGRAPHTABPAGE_ABSLINEDIST, MM50/2));
+ rPage.PageCreated(aSet);
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/present.cxx b/sd/source/ui/dlg/present.cxx
new file mode 100644
index 000000000..73932ba62
--- /dev/null
+++ b/sd/source/ui/dlg/present.cxx
@@ -0,0 +1,323 @@
+/* -*- 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 <svl/itemset.hxx>
+#include <svl/intitem.hxx>
+#include <svl/eitem.hxx>
+#include <svl/stritem.hxx>
+#include <vcl/svapp.hxx>
+
+#include <sdattr.hrc>
+#include <present.hxx>
+#include <cusshow.hxx>
+#include <customshowlist.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+
+SdStartPresentationDlg::SdStartPresentationDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs,
+ const std::vector<OUString> &rPageNames, SdCustomShowList* pCSList)
+ : GenericDialogController(pWindow, "modules/simpress/ui/presentationdialog.ui", "PresentationDialog")
+ , pCustomShowList(pCSList)
+ , rOutAttrs(rInAttrs)
+ , mnMonitors(0)
+ , m_xRbtAll(m_xBuilder->weld_radio_button("allslides"))
+ , m_xRbtAtDia(m_xBuilder->weld_radio_button("from"))
+ , m_xRbtCustomshow(m_xBuilder->weld_radio_button("customslideshow"))
+ , m_xLbDias(m_xBuilder->weld_combo_box("from_cb"))
+ , m_xLbCustomshow(m_xBuilder->weld_combo_box("customslideshow_cb"))
+ , m_xRbtStandard(m_xBuilder->weld_radio_button("default"))
+ , m_xRbtWindow(m_xBuilder->weld_radio_button("window"))
+ , m_xRbtAuto(m_xBuilder->weld_radio_button("auto"))
+ , m_xTmfPause(m_xBuilder->weld_formatted_spin_button("pauseduration"))
+ , m_xFormatter(new weld::TimeFormatter(*m_xTmfPause))
+ , m_xCbxAutoLogo(m_xBuilder->weld_check_button("showlogo"))
+ , m_xCbxManuel(m_xBuilder->weld_check_button("manualslides"))
+ , m_xCbxMousepointer(m_xBuilder->weld_check_button("pointervisible"))
+ , m_xCbxPen(m_xBuilder->weld_check_button("pointeraspen"))
+ , m_xCbxAnimationAllowed(m_xBuilder->weld_check_button("animationsallowed"))
+ , m_xCbxChangePage(m_xBuilder->weld_check_button("changeslidesbyclick"))
+ , m_xCbxAlwaysOnTop(m_xBuilder->weld_check_button("alwaysontop"))
+ , m_xFtMonitor(m_xBuilder->weld_label("presdisplay_label"))
+ , m_xLBMonitor(m_xBuilder->weld_combo_box("presdisplay_cb"))
+ , m_xMonitor(m_xBuilder->weld_label("monitor_str"))
+ , m_xAllMonitors(m_xBuilder->weld_label("allmonitors_str"))
+ , m_xMonitorExternal(m_xBuilder->weld_label("externalmonitor_str"))
+ , m_xExternal(m_xBuilder->weld_label("external_str"))
+{
+ m_xFormatter->SetExtFormat(ExtTimeFieldFormat::LongDuration);
+ m_xFormatter->EnableEmptyField(false);
+
+ Link<weld::Toggleable&,void> aLink( LINK( this, SdStartPresentationDlg, ChangeRangeHdl ) );
+
+ m_xRbtAll->connect_toggled( aLink );
+ m_xRbtAtDia->connect_toggled( aLink );
+ m_xRbtCustomshow->connect_toggled( aLink );
+
+ aLink = LINK( this, SdStartPresentationDlg, ClickWindowPresentationHdl );
+ m_xRbtStandard->connect_toggled( aLink );
+ m_xRbtWindow->connect_toggled( aLink );
+ m_xRbtAuto->connect_toggled( aLink );
+
+ m_xTmfPause->connect_value_changed( LINK( this, SdStartPresentationDlg, ChangePauseHdl ) );
+
+ // fill Listbox with page names
+ for (const auto& rPageName : rPageNames)
+ m_xLbDias->append_text(rPageName);
+
+ if( pCustomShowList )
+ {
+ sal_uInt16 nPosToSelect = pCustomShowList->GetCurPos();
+ SdCustomShow* pCustomShow;
+ // fill Listbox with CustomShows
+ for( pCustomShow = pCustomShowList->First();
+ pCustomShow != nullptr;
+ pCustomShow = pCustomShowList->Next() )
+ {
+ m_xLbCustomshow->append_text( pCustomShow->GetName() );
+ }
+ m_xLbCustomshow->set_active( nPosToSelect );
+ pCustomShowList->Seek( nPosToSelect );
+ }
+ else
+ m_xRbtCustomshow->set_sensitive(false);
+
+ if( static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_CUSTOMSHOW ) ).GetValue() && pCSList )
+ m_xRbtCustomshow->set_active(true);
+ else if( static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_ALL ) ).GetValue() )
+ m_xRbtAll->set_active(true);
+ else
+ m_xRbtAtDia->set_active(true);
+
+ m_xLbDias->set_active_text( static_cast<const SfxStringItem&>( rOutAttrs.Get( ATTR_PRESENT_DIANAME ) ).GetValue() );
+ m_xCbxManuel->set_active( static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_MANUEL ) ).GetValue() );
+ m_xCbxMousepointer->set_active( static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_MOUSE ) ).GetValue() );
+ m_xCbxPen->set_active( static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_PEN ) ).GetValue() );
+ m_xCbxAnimationAllowed->set_active( static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_ANIMATION_ALLOWED ) ).GetValue() );
+ m_xCbxChangePage->set_active( static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_CHANGE_PAGE ) ).GetValue() );
+ m_xCbxAlwaysOnTop->set_active( static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_ALWAYS_ON_TOP ) ).GetValue() );
+
+ const bool bEndless = static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_ENDLESS ) ).GetValue();
+ const bool bWindow = !static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_FULLSCREEN ) ).GetValue();
+ const tools::Long nPause = static_cast<const SfxUInt32Item&>( rOutAttrs.Get( ATTR_PRESENT_PAUSE_TIMEOUT ) ).GetValue();
+
+ m_xFormatter->SetTime( tools::Time( 0, 0, nPause ) );
+ // set cursor in timefield to end
+ m_xTmfPause->set_position(-1);
+
+ m_xCbxAutoLogo->set_active( static_cast<const SfxBoolItem&>( rOutAttrs.Get( ATTR_PRESENT_SHOW_PAUSELOGO ) ).GetValue() );
+
+ if( bWindow )
+ m_xRbtWindow->set_active(true);
+ else if( bEndless )
+ m_xRbtAuto->set_active(true);
+ else
+ m_xRbtStandard->set_active(true);
+
+ InitMonitorSettings();
+
+ ChangeRangeHdl(*m_xRbtCustomshow);
+
+ ClickWindowPresentationHdl(*m_xRbtStandard);
+ ChangePause();
+}
+
+SdStartPresentationDlg::~SdStartPresentationDlg()
+{
+}
+
+OUString SdStartPresentationDlg::GetDisplayName( sal_Int32 nDisplay,
+ DisplayType eType )
+{
+ OUString aName;
+
+ switch ( eType )
+ {
+ case EXTERNAL_IS_NUMBER:
+ aName = m_xExternal->get_label();
+ break;
+ case MONITOR_IS_EXTERNAL:
+ aName = m_xMonitorExternal->get_label();
+ break;
+ default:
+ case MONITOR_NORMAL:
+ aName = m_xMonitor->get_label();
+ break;
+ }
+ aName = aName.replaceFirst( "%1", OUString::number( nDisplay ) );
+
+ return aName;
+}
+
+/// Store display index together with name in user data
+sal_Int32 SdStartPresentationDlg::InsertDisplayEntry(const OUString &aName,
+ sal_Int32 nDisplay)
+{
+ m_xLBMonitor->append(OUString::number(nDisplay), aName);
+ return m_xLBMonitor->get_count() - 1;
+}
+
+void SdStartPresentationDlg::InitMonitorSettings()
+{
+ try
+ {
+ m_xFtMonitor->show();
+ m_xLBMonitor->show();
+
+ mnMonitors = Application::GetScreenCount();
+
+ if( mnMonitors <= 1 )
+ {
+ m_xFtMonitor->set_sensitive( false );
+ m_xLBMonitor->set_sensitive( false );
+ }
+ else
+ {
+ bool bUnifiedDisplay = Application::IsUnifiedDisplay();
+ sal_Int32 nExternalIndex = Application::GetDisplayExternalScreen();
+
+ sal_Int32 nSelectedIndex (-1);
+ sal_Int32 nDefaultExternalIndex (-1);
+ const sal_Int32 nDefaultSelectedDisplay (
+ static_cast<const SfxInt32Item&>( rOutAttrs.Get( ATTR_PRESENT_DISPLAY ) ).GetValue());
+
+ // Un-conditionally add a version for '0' the default external display
+ sal_Int32 nInsertedEntry;
+
+ // Initial entry - the auto-detected external monitor
+ OUString aName = GetDisplayName( nExternalIndex + 1, EXTERNAL_IS_NUMBER);
+ nInsertedEntry = InsertDisplayEntry( aName, 0 );
+ if( nDefaultSelectedDisplay == 0)
+ nSelectedIndex = nInsertedEntry;
+
+ // The user data contains the real setting
+ for( sal_Int32 nDisplay = 0; nDisplay < mnMonitors; nDisplay++ )
+ {
+ aName = GetDisplayName( nDisplay + 1,
+ nDisplay == nExternalIndex ?
+ MONITOR_IS_EXTERNAL : MONITOR_NORMAL );
+ nInsertedEntry = InsertDisplayEntry( aName, nDisplay + 1 );
+
+ // Remember the index of the default selection.
+ if( nDisplay + 1 == nDefaultSelectedDisplay )
+ nSelectedIndex = nInsertedEntry;
+
+ // Remember index of the default display.
+ if( nDisplay == nExternalIndex )
+ nDefaultExternalIndex = nInsertedEntry;
+ }
+
+ if( bUnifiedDisplay )
+ {
+ nInsertedEntry = InsertDisplayEntry( m_xAllMonitors->get_label(), -1 );
+ if( nDefaultSelectedDisplay == -1 )
+ nSelectedIndex = nInsertedEntry;
+ }
+
+ if (nSelectedIndex < 0)
+ {
+ if (nExternalIndex < 0)
+ nSelectedIndex = 0;
+ else
+ nSelectedIndex = nDefaultExternalIndex;
+ }
+
+ m_xLBMonitor->set_active(nSelectedIndex);
+ }
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+/**
+ * sets the selected attributes of the dialog
+ */
+void SdStartPresentationDlg::GetAttr( SfxItemSet& rAttr )
+{
+ rAttr.Put( SfxBoolItem ( ATTR_PRESENT_ALL, m_xRbtAll->get_active() ) );
+ rAttr.Put( SfxBoolItem ( ATTR_PRESENT_CUSTOMSHOW, m_xRbtCustomshow->get_active() ) );
+ rAttr.Put( SfxStringItem ( ATTR_PRESENT_DIANAME, m_xLbDias->get_active_text() ) );
+ rAttr.Put( SfxBoolItem ( ATTR_PRESENT_MANUEL, m_xCbxManuel->get_active() ) );
+ rAttr.Put( SfxBoolItem ( ATTR_PRESENT_MOUSE, m_xCbxMousepointer->get_active() ) );
+ rAttr.Put( SfxBoolItem ( ATTR_PRESENT_PEN, m_xCbxPen->get_active() ) );
+ rAttr.Put( SfxBoolItem ( ATTR_PRESENT_ANIMATION_ALLOWED, m_xCbxAnimationAllowed->get_active() ) );
+ rAttr.Put( SfxBoolItem ( ATTR_PRESENT_CHANGE_PAGE, m_xCbxChangePage->get_active() ) );
+ rAttr.Put( SfxBoolItem ( ATTR_PRESENT_ALWAYS_ON_TOP, m_xCbxAlwaysOnTop->get_active() ) );
+ rAttr.Put( SfxBoolItem ( ATTR_PRESENT_FULLSCREEN, !m_xRbtWindow->get_active() ) );
+ rAttr.Put( SfxBoolItem ( ATTR_PRESENT_ENDLESS, m_xRbtAuto->get_active() ) );
+ rAttr.Put( SfxUInt32Item ( ATTR_PRESENT_PAUSE_TIMEOUT, m_xFormatter->GetTime().GetMSFromTime() / 1000 ) );
+ rAttr.Put( SfxBoolItem ( ATTR_PRESENT_SHOW_PAUSELOGO, m_xCbxAutoLogo->get_active() ) );
+
+ int nPos = m_xLBMonitor->get_active();
+ if (nPos != -1)
+ rAttr.Put(SfxInt32Item(ATTR_PRESENT_DISPLAY, m_xLBMonitor->get_id(nPos).toInt32()));
+
+ nPos = m_xLbCustomshow->get_active();
+ if (nPos != -1)
+ pCustomShowList->Seek( nPos );
+}
+
+/**
+ * Handler: Enabled/Disabled Listbox "Dias"
+ */
+IMPL_LINK_NOARG(SdStartPresentationDlg, ChangeRangeHdl, weld::Toggleable&, void)
+{
+ m_xLbDias->set_sensitive( m_xRbtAtDia->get_active() );
+ m_xLbCustomshow->set_sensitive( m_xRbtCustomshow->get_active() );
+}
+
+/**
+ * Handler: Enabled/Disabled Checkbox "AlwaysOnTop"
+ */
+IMPL_LINK_NOARG(SdStartPresentationDlg, ClickWindowPresentationHdl, weld::Toggleable&, void)
+{
+ const bool bAuto = m_xRbtAuto->get_active();
+ const bool bWindow = m_xRbtWindow->get_active();
+
+ m_xTmfPause->set_sensitive( bAuto );
+ m_xCbxAutoLogo->set_sensitive( bAuto && ( m_xFormatter->GetTime().GetMSFromTime() > 0 ) );
+
+ const bool bDisplay = !bWindow && ( mnMonitors > 1 );
+ m_xFtMonitor->set_sensitive( bDisplay );
+ m_xLBMonitor->set_sensitive( bDisplay );
+
+ if( bWindow )
+ {
+ m_xCbxAlwaysOnTop->set_sensitive(false);
+ m_xCbxAlwaysOnTop->set_active(false);
+ }
+ else
+ m_xCbxAlwaysOnTop->set_sensitive(true);
+}
+
+/**
+ * Handler: Enabled/Disabled Checkbox "AlwaysOnTop"
+ */
+IMPL_LINK_NOARG(SdStartPresentationDlg, ChangePauseHdl, weld::FormattedSpinButton&, void)
+{
+ ChangePause();
+}
+
+void SdStartPresentationDlg::ChangePause()
+{
+ m_xCbxAutoLogo->set_sensitive(m_xRbtAuto->get_active() && ( m_xFormatter->GetTime().GetMSFromTime() > 0 ));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/prltempl.cxx b/sd/source/ui/dlg/prltempl.cxx
new file mode 100644
index 000000000..869f13c83
--- /dev/null
+++ b/sd/source/ui/dlg/prltempl.cxx
@@ -0,0 +1,305 @@
+/* -*- 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/log.hxx>
+#include <svx/dialogs.hrc>
+#include <svx/svxids.hrc>
+#include <editeng/flstitem.hxx>
+#include <svx/drawitem.hxx>
+#include <svl/style.hxx>
+#include <svx/svdobjkind.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/numitem.hxx>
+#include <svl/cjkoptions.hxx>
+#include <sfx2/objsh.hxx>
+#include <sfx2/sfxdlg.hxx>
+
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <prltempl.hxx>
+#include <bulmaper.hxx>
+#include <svl/intitem.hxx>
+#include <svx/flagsdef.hxx>
+
+#define IS_OUTLINE(x) (x >= PresentationObjects::Outline_1 && x <= PresentationObjects::Outline_9)
+
+/**
+ * Constructor of Tab dialog: appends pages to the dialog
+ */
+SdPresLayoutTemplateDlg::SdPresLayoutTemplateDlg(SfxObjectShell const * pDocSh,
+ weld::Window* pParent,
+ bool bBackground,
+ SfxStyleSheetBase& rStyleBase,
+ PresentationObjects _ePO,
+ SfxStyleSheetBasePool* pSSPool)
+ : SfxTabDialogController(pParent, "modules/sdraw/ui/drawprtldialog.ui", "DrawPRTLDialog")
+ , mpDocShell(pDocSh)
+ , ePO(_ePO)
+ , aInputSet(*rStyleBase.GetItemSet().GetPool(), svl::Items<SID_PARAM_NUM_PRESET, SID_PARAM_CUR_NUM_LEVEL>)
+{
+ const SfxItemSet* pOrgSet(&rStyleBase.GetItemSet());
+
+ if( IS_OUTLINE(ePO))
+ {
+ // Unfortunately, the Itemsets of our style sheets are not discrete...
+ const WhichRangesContainer& pPtr = pOrgSet->GetRanges();
+ sal_uInt16 p1, p2;
+ for( sal_Int32 i = 0; i < pPtr.size(); ++i )
+ {
+ p1 = pPtr[i].first;
+ p2 = pPtr[i].second;
+
+ // first, we make it discrete
+ while(i < pPtr.size() - 1 && (pPtr[i+1].first - p2 == 1))
+ {
+ p2 = pPtr[i+1].second;
+ ++i;
+ }
+ aInputSet.MergeRange( p1, p2 );
+ }
+
+ aInputSet.Put( rStyleBase.GetItemSet() );
+
+ // need parent-relationship
+ const SfxItemSet* pParentItemSet = rStyleBase.GetItemSet().GetParent();
+ if( pParentItemSet )
+ aInputSet.SetParent( pParentItemSet );
+
+ pOutSet.reset( new SfxItemSet( rStyleBase.GetItemSet() ) );
+ pOutSet->ClearItem();
+
+ // If there is no bullet item in this stylesheet, we get it
+ // from 'Outline 1' style sheet.
+ const SfxPoolItem *pItem = nullptr;
+ if( SfxItemState::SET != aInputSet.GetItemState(EE_PARA_NUMBULLET, false, &pItem ))
+ {
+ OUString aStyleName(SdResId(STR_PSEUDOSHEET_OUTLINE) + " 1");
+ SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( aStyleName, SfxStyleFamily::Pseudo);
+
+ if(pFirstStyleSheet)
+ if( SfxItemState::SET == pFirstStyleSheet->GetItemSet().GetItemState(EE_PARA_NUMBULLET, false, &pItem) )
+ aInputSet.Put( *pItem );
+ }
+
+ // preselect selected layer in dialog
+ aInputSet.Put( SfxUInt16Item( SID_PARAM_CUR_NUM_LEVEL, 1<<GetOutlineLevel()));
+
+ SetInputSet(&aInputSet);
+ }
+ else {
+ SetInputSet(pOrgSet);
+ }
+
+ SvxColorListItem const *pColorListItem = mpDocShell->GetItem( SID_COLOR_TABLE );
+ SvxGradientListItem const *pGradientListItem = mpDocShell->GetItem( SID_GRADIENT_LIST );
+ SvxBitmapListItem const *pBitmapListItem = mpDocShell->GetItem( SID_BITMAP_LIST );
+ SvxPatternListItem const *pPatternListItem = mpDocShell->GetItem( SID_PATTERN_LIST );
+ SvxHatchListItem const *pHatchListItem = mpDocShell->GetItem( SID_HATCH_LIST );
+ SvxDashListItem const *pDashListItem = mpDocShell->GetItem( SID_DASH_LIST );
+ SvxLineEndListItem const *pLineEndListItem = mpDocShell->GetItem( SID_LINEEND_LIST );
+
+ pColorTab = pColorListItem->GetColorList();
+ pDashList = pDashListItem->GetDashList();
+ pLineEndList = pLineEndListItem->GetLineEndList();
+ pGradientList = pGradientListItem->GetGradientList();
+ pHatchingList = pHatchListItem->GetHatchList();
+ pBitmapList = pBitmapListItem->GetBitmapList();
+ pPatternList = pPatternListItem->GetPatternList();
+
+ SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
+
+ AddTabPage( "RID_SVXPAGE_LINE", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_LINE ), nullptr );
+ AddTabPage( "RID_SVXPAGE_AREA", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_AREA ), nullptr );
+ AddTabPage( "RID_SVXPAGE_SHADOW", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_SHADOW ), nullptr );
+ AddTabPage( "RID_SVXPAGE_TRANSPARENCE", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_TRANSPARENCE ), nullptr );
+ AddTabPage( "RID_SVXPAGE_CHAR_NAME", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_CHAR_NAME ), nullptr );
+ AddTabPage( "RID_SVXPAGE_CHAR_EFFECTS", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_CHAR_EFFECTS ), nullptr );
+ AddTabPage( "RID_SVXPAGE_STD_PARAGRAPH", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_STD_PARAGRAPH ), nullptr );
+ AddTabPage( "RID_SVXPAGE_TEXTATTR", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_TEXTATTR ), nullptr );
+ AddTabPage( "RID_SVXPAGE_PICK_BULLET", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_PICK_BULLET ), nullptr );
+ AddTabPage( "RID_SVXPAGE_PICK_SINGLE_NUM", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_PICK_SINGLE_NUM ), nullptr );
+ AddTabPage( "RID_SVXPAGE_PICK_BMP", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_PICK_BMP ), nullptr );
+ AddTabPage( "RID_SVXPAGE_NUM_OPTIONS", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_NUM_OPTIONS ), nullptr );
+ AddTabPage( "RID_SVXPAGE_TABULATOR", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_TABULATOR ), nullptr );
+ AddTabPage( "RID_SVXPAGE_PARA_ASIAN", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_PARA_ASIAN ), nullptr );
+ AddTabPage( "RID_SVXPAGE_ALIGN_PARAGRAPH", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_ALIGN_PARAGRAPH ), nullptr );
+ AddTabPage( "RID_SVXPAGE_BKG", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_BKG ), nullptr);
+
+ if( !SvtCJKOptions::IsAsianTypographyEnabled() )
+ RemoveTabPage( "RID_SVXPAGE_PARA_ASIAN" );
+
+ if (bBackground)
+ {
+ RemoveTabPage( "RID_SVXPAGE_LINE");
+
+ RemoveTabPage( "RID_SVXPAGE_SHADOW");
+ RemoveTabPage( "RID_SVXPAGE_TRANSPARENCE");
+ RemoveTabPage( "RID_SVXPAGE_CHAR_NAME");
+ RemoveTabPage( "RID_SVXPAGE_CHAR_EFFECTS");
+ RemoveTabPage( "RID_SVXPAGE_STD_PARAGRAPH");
+ RemoveTabPage( "RID_SVXPAGE_TEXTATTR");
+ RemoveTabPage( "RID_SVXPAGE_PICK_BULLET");
+ RemoveTabPage( "RID_SVXPAGE_PICK_SINGLE_NUM");
+ RemoveTabPage( "RID_SVXPAGE_PICK_BMP");
+ RemoveTabPage( "RID_SVXPAGE_NUM_OPTIONS");
+ RemoveTabPage( "RID_SVXPAGE_TABULATOR");
+ RemoveTabPage( "RID_SVXPAGE_ALIGN_PARAGRAPH");
+ RemoveTabPage( "RID_SVXPAGE_PARA_ASIAN" );
+ RemoveTabPage( "RID_SVXPAGE_BKG" );
+ }
+
+ // set title and add corresponding pages to dialog
+ OUString aTitle;
+
+ switch( ePO )
+ {
+ case PresentationObjects::Title:
+ aTitle = SdResId(STR_PSEUDOSHEET_TITLE);
+ break;
+
+ case PresentationObjects::Subtitle:
+ aTitle = SdResId(STR_PSEUDOSHEET_SUBTITLE);
+ break;
+
+ case PresentationObjects::Background:
+ aTitle = SdResId(STR_PSEUDOSHEET_BACKGROUND);
+ break;
+
+ case PresentationObjects::BackgroundObjects:
+ aTitle = SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS);
+ break;
+
+ case PresentationObjects::Outline_1:
+ case PresentationObjects::Outline_2:
+ case PresentationObjects::Outline_3:
+ case PresentationObjects::Outline_4:
+ case PresentationObjects::Outline_5:
+ case PresentationObjects::Outline_6:
+ case PresentationObjects::Outline_7:
+ case PresentationObjects::Outline_8:
+ case PresentationObjects::Outline_9:
+ aTitle = SdResId(STR_PSEUDOSHEET_OUTLINE) + " " +
+ OUString::number( static_cast<int>(ePO) - static_cast<int>(PresentationObjects::Outline_1) + 1 );
+ break;
+
+ case PresentationObjects::Notes:
+ aTitle = SdResId(STR_PSEUDOSHEET_NOTES);
+ break;
+ }
+ m_xDialog->set_title(aTitle);
+}
+
+SdPresLayoutTemplateDlg::~SdPresLayoutTemplateDlg()
+{
+}
+
+void SdPresLayoutTemplateDlg::PageCreated(const OString& rId, SfxTabPage &rPage)
+{
+ SfxAllItemSet aSet(*(aInputSet.GetPool()));
+
+ if (rId == "RID_SVXPAGE_LINE")
+ {
+ aSet.Put (SvxColorListItem(pColorTab,SID_COLOR_TABLE));
+ aSet.Put (SvxDashListItem(pDashList,SID_DASH_LIST));
+ aSet.Put (SvxLineEndListItem(pLineEndList,SID_LINEEND_LIST));
+ aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "RID_SVXPAGE_AREA")
+ {
+ aSet.Put (SvxColorListItem(pColorTab,SID_COLOR_TABLE));
+ aSet.Put (SvxGradientListItem(pGradientList,SID_GRADIENT_LIST));
+ aSet.Put (SvxHatchListItem(pHatchingList,SID_HATCH_LIST));
+ aSet.Put (SvxBitmapListItem(pBitmapList,SID_BITMAP_LIST));
+ aSet.Put (SvxPatternListItem(pPatternList,SID_PATTERN_LIST));
+ aSet.Put (SfxUInt16Item(SID_PAGE_TYPE,0));
+ aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1));
+ aSet.Put (SfxUInt16Item(SID_TABPAGE_POS,0));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "RID_SVXPAGE_SHADOW")
+ {
+ aSet.Put (SvxColorListItem(pColorTab,SID_COLOR_TABLE));
+ aSet.Put (SfxUInt16Item(SID_PAGE_TYPE,0));
+ aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "RID_SVXPAGE_TRANSPARENCE")
+ {
+ aSet.Put (SfxUInt16Item(SID_PAGE_TYPE,0));
+ aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "RID_SVXPAGE_CHAR_NAME")
+ {
+ SvxFontListItem aItem(*static_cast<const SvxFontListItem*>(mpDocShell->GetItem( SID_ATTR_CHAR_FONTLIST) ) );
+ aSet.Put (SvxFontListItem( aItem.GetFontList(), SID_ATTR_CHAR_FONTLIST));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "RID_SVXPAGE_CHAR_EFFECTS")
+ {
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "RID_SVXPAGE_TEXTATTR")
+ {
+ aSet.Put(CntUInt16Item(SID_SVXTEXTATTRPAGE_OBJKIND, static_cast<sal_uInt16>(SdrObjKind::Text)));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "RID_SVXPAGE_BKG")
+ {
+ aSet.Put(SfxUInt32Item(SID_FLAG_TYPE,static_cast<sal_uInt32>(SvxBackgroundTabFlags::SHOW_CHAR_BKGCOLOR)));
+ rPage.PageCreated(aSet);
+ }
+}
+
+const SfxItemSet* SdPresLayoutTemplateDlg::GetOutputItemSet() const
+{
+ if (pOutSet)
+ {
+ pOutSet->Put(*SfxTabDialogController::GetOutputItemSet());
+
+ const SvxNumBulletItem *pSvxNumBulletItem = pOutSet->GetItemIfSet(EE_PARA_NUMBULLET, false);
+ if (pSvxNumBulletItem)
+ SdBulletMapper::MapFontsInNumRule( const_cast<SvxNumRule&>(pSvxNumBulletItem->GetNumRule()), *pOutSet );
+ return pOutSet.get();
+ }
+ else
+ return SfxTabDialogController::GetOutputItemSet();
+}
+
+sal_uInt16 SdPresLayoutTemplateDlg::GetOutlineLevel() const
+{
+ switch( ePO )
+ {
+ case PresentationObjects::Outline_1: return 0;
+ case PresentationObjects::Outline_2: return 1;
+ case PresentationObjects::Outline_3: return 2;
+ case PresentationObjects::Outline_4: return 3;
+ case PresentationObjects::Outline_5: return 4;
+ case PresentationObjects::Outline_6: return 5;
+ case PresentationObjects::Outline_7: return 6;
+ case PresentationObjects::Outline_8: return 7;
+ case PresentationObjects::Outline_9: return 8;
+ default:
+ SAL_WARN( "sd", "Wrong Po! [CL]");
+ }
+ return 0;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/prntopts.cxx b/sd/source/ui/dlg/prntopts.cxx
new file mode 100644
index 000000000..4b50875bb
--- /dev/null
+++ b/sd/source/ui/dlg/prntopts.cxx
@@ -0,0 +1,235 @@
+/* -*- 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 <sdattr.hrc>
+#include <optsitem.hxx>
+#include <prntopts.hxx>
+#include <app.hrc>
+#include <svl/intitem.hxx>
+
+/**
+ * dialog to adjust print options
+ */
+SdPrintOptions::SdPrintOptions(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs)
+ : SfxTabPage(pPage, pController, "modules/simpress/ui/prntopts.ui", "prntopts", &rInAttrs)
+ , m_xFrmContent(m_xBuilder->weld_frame("contentframe"))
+ , m_xCbxDraw(m_xBuilder->weld_check_button("drawingcb"))
+ , m_xCbxNotes(m_xBuilder->weld_check_button("notecb"))
+ , m_xCbxHandout(m_xBuilder->weld_check_button("handoutcb"))
+ , m_xCbxOutline(m_xBuilder->weld_check_button("outlinecb"))
+ , m_xRbtColor(m_xBuilder->weld_radio_button("defaultrb"))
+ , m_xRbtGrayscale(m_xBuilder->weld_radio_button("grayscalerb"))
+ , m_xRbtBlackWhite(m_xBuilder->weld_radio_button("blackwhiterb"))
+ , m_xCbxPagename(m_xBuilder->weld_check_button("pagenmcb"))
+ , m_xCbxDate(m_xBuilder->weld_check_button("datecb"))
+ , m_xCbxTime(m_xBuilder->weld_check_button("timecb"))
+ , m_xCbxHiddenPages(m_xBuilder->weld_check_button("hiddenpgcb"))
+ , m_xRbtDefault(m_xBuilder->weld_radio_button("pagedefaultrb"))
+ , m_xRbtPagesize(m_xBuilder->weld_radio_button("fittopgrb"))
+ , m_xRbtPagetile(m_xBuilder->weld_radio_button("tilepgrb"))
+ , m_xRbtBooklet(m_xBuilder->weld_radio_button("brouchrb"))
+ , m_xCbxFront(m_xBuilder->weld_check_button("frontcb"))
+ , m_xCbxBack(m_xBuilder->weld_check_button("backcb"))
+ , m_xCbxPaperbin(m_xBuilder->weld_check_button("papertryfrmprntrcb"))
+{
+ Link<weld::Toggleable&,void> aLink = LINK( this, SdPrintOptions, ClickBookletHdl );
+ m_xRbtDefault->connect_toggled( aLink );
+ m_xRbtPagesize->connect_toggled( aLink );
+ m_xRbtPagetile->connect_toggled( aLink );
+ m_xRbtBooklet->connect_toggled( aLink );
+
+ aLink = LINK( this, SdPrintOptions, ClickCheckboxHdl );
+ m_xCbxDraw->connect_toggled( aLink );
+ m_xCbxNotes->connect_toggled( aLink );
+ m_xCbxHandout->connect_toggled( aLink );
+ m_xCbxOutline->connect_toggled( aLink );
+
+#ifndef MACOSX
+ SetDrawMode();
+#endif
+}
+
+SdPrintOptions::~SdPrintOptions()
+{
+}
+
+bool SdPrintOptions::FillItemSet( SfxItemSet* rAttrs )
+{
+ if( m_xCbxDraw->get_state_changed_from_saved() ||
+ m_xCbxNotes->get_state_changed_from_saved() ||
+ m_xCbxHandout->get_state_changed_from_saved() ||
+ m_xCbxOutline->get_state_changed_from_saved() ||
+ m_xCbxDate->get_state_changed_from_saved() ||
+ m_xCbxTime->get_state_changed_from_saved() ||
+ m_xCbxPagename->get_state_changed_from_saved() ||
+ m_xCbxHiddenPages->get_state_changed_from_saved() ||
+ m_xRbtPagesize->get_state_changed_from_saved() ||
+ m_xRbtPagetile->get_state_changed_from_saved() ||
+ m_xRbtBooklet->get_state_changed_from_saved() ||
+ m_xCbxFront->get_state_changed_from_saved() ||
+ m_xCbxBack->get_state_changed_from_saved() ||
+ m_xCbxPaperbin->get_state_changed_from_saved() ||
+ m_xRbtColor->get_state_changed_from_saved() ||
+ m_xRbtGrayscale->get_state_changed_from_saved()||
+ m_xRbtBlackWhite->get_state_changed_from_saved())
+ {
+ SdOptionsPrintItem aOptions;
+
+ aOptions.GetOptionsPrint().SetDraw( m_xCbxDraw->get_active() );
+ aOptions.GetOptionsPrint().SetNotes( m_xCbxNotes->get_active() );
+ aOptions.GetOptionsPrint().SetHandout( m_xCbxHandout->get_active() );
+ aOptions.GetOptionsPrint().SetOutline( m_xCbxOutline->get_active() );
+ aOptions.GetOptionsPrint().SetDate( m_xCbxDate->get_active() );
+ aOptions.GetOptionsPrint().SetTime( m_xCbxTime->get_active() );
+ aOptions.GetOptionsPrint().SetPagename( m_xCbxPagename->get_active() );
+ aOptions.GetOptionsPrint().SetHiddenPages( m_xCbxHiddenPages->get_active() );
+ aOptions.GetOptionsPrint().SetPagesize( m_xRbtPagesize->get_active() );
+ aOptions.GetOptionsPrint().SetPagetile( m_xRbtPagetile->get_active() );
+ aOptions.GetOptionsPrint().SetBooklet( m_xRbtBooklet->get_active() );
+ aOptions.GetOptionsPrint().SetFrontPage( m_xCbxFront->get_active() );
+ aOptions.GetOptionsPrint().SetBackPage( m_xCbxBack->get_active() );
+ aOptions.GetOptionsPrint().SetPaperbin( m_xCbxPaperbin->get_active() );
+
+ sal_uInt16 nQuality = 0; // Standard, also Color
+ if( m_xRbtGrayscale->get_active() )
+ nQuality = 1;
+ if( m_xRbtBlackWhite->get_active() )
+ nQuality = 2;
+ aOptions.GetOptionsPrint().SetOutputQuality( nQuality );
+
+ rAttrs->Put( aOptions );
+
+ return true;
+ }
+ return false;
+}
+
+void SdPrintOptions::Reset( const SfxItemSet* rAttrs )
+{
+ const SdOptionsPrintItem* pPrintOpts = rAttrs->GetItemIfSet( ATTR_OPTIONS_PRINT, false);
+ if( pPrintOpts )
+ {
+ m_xCbxDraw->set_active( pPrintOpts->GetOptionsPrint().IsDraw() );
+ m_xCbxNotes->set_active( pPrintOpts->GetOptionsPrint().IsNotes() );
+ m_xCbxHandout->set_active( pPrintOpts->GetOptionsPrint().IsHandout() );
+ m_xCbxOutline->set_active( pPrintOpts->GetOptionsPrint().IsOutline() );
+ m_xCbxDate->set_active( pPrintOpts->GetOptionsPrint().IsDate() );
+ m_xCbxTime->set_active( pPrintOpts->GetOptionsPrint().IsTime() );
+ m_xCbxPagename->set_active( pPrintOpts->GetOptionsPrint().IsPagename() );
+ m_xCbxHiddenPages->set_active( pPrintOpts->GetOptionsPrint().IsHiddenPages() );
+ m_xRbtPagesize->set_active( pPrintOpts->GetOptionsPrint().IsPagesize() );
+ m_xRbtPagetile->set_active( pPrintOpts->GetOptionsPrint().IsPagetile() );
+ m_xRbtBooklet->set_active( pPrintOpts->GetOptionsPrint().IsBooklet() );
+ m_xCbxFront->set_active( pPrintOpts->GetOptionsPrint().IsFrontPage() );
+ m_xCbxBack->set_active( pPrintOpts->GetOptionsPrint().IsBackPage() );
+ m_xCbxPaperbin->set_active( pPrintOpts->GetOptionsPrint().IsPaperbin() );
+
+ if( !m_xRbtPagesize->get_active() &&
+ !m_xRbtPagetile->get_active() &&
+ !m_xRbtBooklet->get_active() )
+ {
+ m_xRbtDefault->set_active(true);
+ }
+
+ sal_uInt16 nQuality = pPrintOpts->GetOptionsPrint().GetOutputQuality();
+ if( nQuality == 0 )
+ m_xRbtColor->set_active(true);
+ else if( nQuality == 1 )
+ m_xRbtGrayscale->set_active(true);
+ else
+ m_xRbtBlackWhite->set_active(true);
+ }
+ m_xCbxDraw->save_state();
+ m_xCbxNotes->save_state();
+ m_xCbxHandout->save_state();
+ m_xCbxOutline->save_state();
+ m_xCbxDate->save_state();
+ m_xCbxTime->save_state();
+ m_xCbxPagename->save_state();
+ m_xCbxHiddenPages->save_state();
+ m_xRbtPagesize->save_state();
+ m_xRbtPagetile->save_state();
+ m_xRbtBooklet->save_state();
+ m_xCbxPaperbin->save_state();
+ m_xRbtColor->save_state();
+ m_xRbtGrayscale->save_state();
+ m_xRbtBlackWhite->save_state();
+
+ updateControls();
+}
+
+std::unique_ptr<SfxTabPage> SdPrintOptions::Create( weld::Container* pPage, weld::DialogController* pController,
+ const SfxItemSet* rOutAttrs )
+{
+ return std::make_unique<SdPrintOptions>( pPage, pController, *rOutAttrs );
+}
+
+IMPL_LINK(SdPrintOptions, ClickCheckboxHdl, weld::Toggleable&, rCbx, void)
+{
+ // there must be at least one of them checked
+ if( !m_xCbxDraw->get_active() && !m_xCbxNotes->get_active() && !m_xCbxOutline->get_active() && !m_xCbxHandout->get_active() )
+ rCbx.set_active(true);
+
+ updateControls();
+}
+
+IMPL_LINK_NOARG(SdPrintOptions, ClickBookletHdl, weld::Toggleable&, void)
+{
+ updateControls();
+}
+
+void SdPrintOptions::updateControls()
+{
+ m_xCbxFront->set_sensitive(m_xRbtBooklet->get_active());
+ m_xCbxBack->set_sensitive(m_xRbtBooklet->get_active());
+
+ m_xCbxDate->set_sensitive( !m_xRbtBooklet->get_active() );
+ m_xCbxTime->set_sensitive( !m_xRbtBooklet->get_active() );
+
+ m_xCbxPagename->set_sensitive( !m_xRbtBooklet->get_active() && (m_xCbxDraw->get_active() || m_xCbxNotes->get_active() || m_xCbxOutline->get_active()) );
+}
+
+void SdPrintOptions::SetDrawMode()
+{
+ if (m_xCbxNotes->get_visible())
+ {
+ m_xFrmContent->hide();
+ }
+}
+
+void SdPrintOptions::PageCreated (const SfxAllItemSet&
+#ifdef MACOSX
+ aSet
+#endif
+ )
+{
+#ifdef MACOSX
+ const SfxUInt32Item* pFlagItem = aSet.GetItem<SfxUInt32Item>(SID_SDMODE_FLAG, false);
+ if (pFlagItem)
+ {
+ sal_uInt32 nFlags=pFlagItem->GetValue();
+ if ( ( nFlags & SD_DRAW_MODE ) == SD_DRAW_MODE )
+ SetDrawMode();
+ }
+#else
+ SetDrawMode();
+#endif
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/sdabstdlg.cxx b/sd/source/ui/dlg/sdabstdlg.cxx
new file mode 100644
index 000000000..2b686a3e8
--- /dev/null
+++ b/sd/source/ui/dlg/sdabstdlg.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/.
+ *
+ * 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 <sdabstdlg.hxx>
+
+#include <osl/module.hxx>
+
+typedef SdAbstractDialogFactory* (*SdFuncPtrCreateDialogFactory)();
+
+#ifndef DISABLE_DYNLOADING
+
+extern "C" {
+static void thisModule() {}
+}
+
+#else
+
+extern "C" SdAbstractDialogFactory* SdCreateDialogFactory();
+
+#endif
+
+SdAbstractDialogFactory* SdAbstractDialogFactory::Create()
+{
+ SdFuncPtrCreateDialogFactory fp = nullptr;
+#ifndef DISABLE_DYNLOADING
+ static ::osl::Module aDialogLibrary;
+ static constexpr OUStringLiteral sLibName(u"" SDUI_DLL_NAME);
+ if (aDialogLibrary.is() || aDialogLibrary.loadRelative(&thisModule, sLibName))
+ fp = reinterpret_cast<SdAbstractDialogFactory*(SAL_CALL*)()>(
+ aDialogLibrary.getFunctionSymbol("SdCreateDialogFactory"));
+#else
+ fp = SdCreateDialogFactory;
+#endif
+ if (fp)
+ return fp();
+ return nullptr;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/sddlgfact.cxx b/sd/source/ui/dlg/sddlgfact.cxx
new file mode 100644
index 000000000..c526df75d
--- /dev/null
+++ b/sd/source/ui/dlg/sddlgfact.cxx
@@ -0,0 +1,739 @@
+/* -*- 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 "sddlgfact.hxx"
+#include <BreakDlg.hxx>
+#include <copydlg.hxx>
+#include <custsdlg.hxx>
+#include <dlg_char.hxx>
+#include <dlgpage.hxx>
+#include <dlgfield.hxx>
+#include <dlgsnap.hxx>
+#include <layeroptionsdlg.hxx>
+#include <inspagob.hxx>
+#include <morphdlg.hxx>
+#include <OutlineBulletDlg.hxx>
+#include <paragr.hxx>
+#include <present.hxx>
+#include "RemoteDialog.hxx"
+#include <prltempl.hxx>
+#include <sdpreslt.hxx>
+#include <tabtempl.hxx>
+#include <tpaction.hxx>
+#include <vectdlg.hxx>
+#include <tpoption.hxx>
+#include <prntopts.hxx>
+#include <pubdlg.hxx>
+#include <masterlayoutdlg.hxx>
+#include <headerfooterdlg.hxx>
+#include "PhotoAlbumDialog.hxx"
+#include <vcl/virdev.hxx>
+
+short AbstractSvxBulletAndPositionDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+short SdAbstractGenericDialog_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+BitmapEx SdAbstractGenericDialog_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString SdAbstractGenericDialog_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+const SfxItemSet* AbstractSvxBulletAndPositionDlg_Impl::GetOutputItemSet( SfxItemSet* pSet ) const
+{
+ return m_xDlg->GetOutputItemSet( pSet );
+}
+
+bool AbstractSvxBulletAndPositionDlg_Impl::IsApplyToMaster()
+{
+ return m_xDlg->IsApplyToMaster();
+}
+
+bool AbstractSvxBulletAndPositionDlg_Impl::IsSlideScope()
+{
+ return m_xDlg->IsSlideScope();
+}
+
+short AbstractCopyDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+short AbstractSdCustomShowDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+short SdPresLayoutTemplateDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+bool SdPresLayoutTemplateDlg_Impl::StartExecuteAsync(AsyncContext &rCtx)
+{
+ return SfxTabDialogController::runAsync(m_xDlg, rCtx.maEndDialogFn);
+}
+
+short AbstractSdModifyFieldDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+short AbstractSdSnapLineDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+short AbstractSdInsertLayerDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+short AbstractSdInsertPagesObjsDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+short AbstractMorphDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+short AbstractSdStartPresDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+short AbstractSdPresLayoutDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+short SdAbstractSfxDialog_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+short AbstractSdVectorizeDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+short AbstractSdPublishingDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+short AbstractHeaderFooterDialog_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+bool AbstractHeaderFooterDialog_Impl::StartExecuteAsync(AsyncContext &rCtx)
+{
+ return weld::DialogController::runAsync(m_xDlg, rCtx.maEndDialogFn);
+}
+
+BitmapEx AbstractHeaderFooterDialog_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractHeaderFooterDialog_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+short AbstractBulletDialog_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+bool AbstractBulletDialog_Impl::StartExecuteAsync(AsyncContext &rCtx)
+{
+ return SfxTabDialogController::runAsync(m_xDlg, rCtx.maEndDialogFn);
+}
+
+AbstractBreakDlg_Impl::AbstractBreakDlg_Impl(std::unique_ptr<::sd::BreakDlg> pDlg)
+ : m_xDlg(std::move(pDlg))
+{
+}
+
+short AbstractBreakDlg_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+BitmapEx AbstractBreakDlg_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractBreakDlg_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+AbstractMasterLayoutDialog_Impl::AbstractMasterLayoutDialog_Impl(std::unique_ptr<::sd::MasterLayoutDialog> pDlg)
+ : m_xDlg(std::move(pDlg))
+{
+}
+
+short AbstractMasterLayoutDialog_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+BitmapEx AbstractMasterLayoutDialog_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractMasterLayoutDialog_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+void AbstractCopyDlg_Impl::GetAttr( SfxItemSet& rOutAttrs )
+{
+ m_xDlg->GetAttr( rOutAttrs );
+}
+
+BitmapEx AbstractCopyDlg_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractCopyDlg_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+bool AbstractSdCustomShowDlg_Impl::IsCustomShow() const
+{
+ return m_xDlg->IsCustomShow();
+}
+
+BitmapEx AbstractSdCustomShowDlg_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractSdCustomShowDlg_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+short SdAbstractTabController_Impl::Execute()
+{
+ return m_xDlg->run();
+}
+
+void SdAbstractTabController_Impl::SetCurPageId( const OString &rName )
+{
+ m_xDlg->SetCurPageId( rName );
+}
+
+const SfxItemSet* SdAbstractTabController_Impl::GetOutputItemSet() const
+{
+ return m_xDlg->GetOutputItemSet();
+}
+
+WhichRangesContainer SdAbstractTabController_Impl::GetInputRanges(const SfxItemPool& pItem )
+{
+ return m_xDlg->GetInputRanges( pItem );
+}
+
+void SdAbstractTabController_Impl::SetInputSet( const SfxItemSet* pInSet )
+{
+ m_xDlg->SetInputSet( pInSet );
+}
+
+bool SdAbstractTabController_Impl::StartExecuteAsync(AsyncContext &rCtx)
+{
+ return SfxTabDialogController::runAsync(m_xDlg, rCtx.maEndDialogFn);
+}
+
+//From class Window.
+void SdAbstractTabController_Impl::SetText( const OUString& rStr )
+{
+ m_xDlg->set_title(rStr);
+}
+
+BitmapEx SdAbstractTabController_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString SdAbstractTabController_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+void AbstractBulletDialog_Impl::SetCurPageId( const OString& rName )
+{
+ m_xDlg->SetCurPageId( rName );
+}
+
+const SfxItemSet* AbstractBulletDialog_Impl::GetOutputItemSet() const
+{
+ return static_cast< ::sd::OutlineBulletDlg*>(m_xDlg.get())->GetBulletOutputItemSet();
+}
+
+WhichRangesContainer AbstractBulletDialog_Impl::GetInputRanges(const SfxItemPool& pItem )
+{
+ return m_xDlg->GetInputRanges(pItem);
+}
+
+void AbstractBulletDialog_Impl::SetInputSet( const SfxItemSet* pInSet )
+{
+ m_xDlg->SetInputSet(pInSet);
+}
+
+void AbstractBulletDialog_Impl::SetText( const OUString& rStr )
+{
+ m_xDlg->set_title(rStr);
+}
+
+BitmapEx AbstractBulletDialog_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractBulletDialog_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+void SdPresLayoutTemplateDlg_Impl::SetCurPageId( const OString& rName )
+{
+ m_xDlg->SetCurPageId( rName );
+}
+
+const SfxItemSet* SdPresLayoutTemplateDlg_Impl::GetOutputItemSet() const
+{
+ return m_xDlg->GetOutputItemSet();
+}
+
+WhichRangesContainer SdPresLayoutTemplateDlg_Impl::GetInputRanges(const SfxItemPool& pItem )
+{
+ return m_xDlg->GetInputRanges( pItem );
+}
+
+void SdPresLayoutTemplateDlg_Impl::SetInputSet( const SfxItemSet* pInSet )
+{
+ m_xDlg->SetInputSet( pInSet );
+}
+
+void SdPresLayoutTemplateDlg_Impl::SetText( const OUString& rStr )
+{
+ m_xDlg->set_title(rStr);
+}
+
+BitmapEx SdPresLayoutTemplateDlg_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString SdPresLayoutTemplateDlg_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+SvxFieldData* AbstractSdModifyFieldDlg_Impl::GetField()
+{
+ return m_xDlg->GetField();
+}
+
+SfxItemSet AbstractSdModifyFieldDlg_Impl::GetItemSet()
+{
+ return m_xDlg->GetItemSet();
+}
+
+BitmapEx AbstractSdModifyFieldDlg_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractSdModifyFieldDlg_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+void AbstractSdSnapLineDlg_Impl::GetAttr(SfxItemSet& rOutAttrs)
+{
+ m_xDlg->GetAttr(rOutAttrs);
+}
+
+void AbstractSdSnapLineDlg_Impl::HideRadioGroup()
+{
+ m_xDlg->HideRadioGroup();
+}
+
+void AbstractSdSnapLineDlg_Impl::HideDeleteBtn()
+{
+ m_xDlg->HideDeleteBtn();
+}
+
+void AbstractSdSnapLineDlg_Impl::SetInputFields(bool bEnableX, bool bEnableY)
+{
+ m_xDlg->SetInputFields(bEnableX, bEnableY);
+}
+
+void AbstractSdSnapLineDlg_Impl::SetText( const OUString& rStr )
+{
+ m_xDlg->set_title(rStr);
+}
+
+BitmapEx AbstractSdSnapLineDlg_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractSdSnapLineDlg_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+void AbstractSdInsertLayerDlg_Impl::GetAttr( SfxItemSet& rOutAttrs )
+{
+ m_xDlg->GetAttr(rOutAttrs);
+}
+
+void AbstractSdInsertLayerDlg_Impl::SetHelpId( const OString& rHelpId )
+{
+ m_xDlg->set_help_id(rHelpId);
+}
+
+BitmapEx AbstractSdInsertLayerDlg_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractSdInsertLayerDlg_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+std::vector<OUString> AbstractSdInsertPagesObjsDlg_Impl::GetList(const sal_uInt16 nType)
+{
+ return m_xDlg->GetList(nType);
+}
+
+bool AbstractSdInsertPagesObjsDlg_Impl::IsLink()
+{
+ return m_xDlg->IsLink();
+}
+
+bool AbstractSdInsertPagesObjsDlg_Impl::IsRemoveUnnecessaryMasterPages() const
+{
+ return m_xDlg->IsRemoveUnnecessaryMasterPages();
+}
+
+BitmapEx AbstractSdInsertPagesObjsDlg_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractSdInsertPagesObjsDlg_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+void AbstractMorphDlg_Impl::SaveSettings() const
+{
+ m_xDlg->SaveSettings();
+}
+
+sal_uInt16 AbstractMorphDlg_Impl::GetFadeSteps() const
+{
+ return m_xDlg->GetFadeSteps();
+}
+
+bool AbstractMorphDlg_Impl::IsAttributeFade() const
+{
+ return m_xDlg->IsAttributeFade();
+}
+
+bool AbstractMorphDlg_Impl::IsOrientationFade() const
+{
+ return m_xDlg->IsOrientationFade();
+}
+
+BitmapEx AbstractMorphDlg_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractMorphDlg_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+void AbstractSdStartPresDlg_Impl::GetAttr( SfxItemSet& rOutAttrs )
+{
+ m_xDlg->GetAttr(rOutAttrs);
+}
+
+BitmapEx AbstractSdStartPresDlg_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractSdStartPresDlg_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+void AbstractSdPresLayoutDlg_Impl::GetAttr( SfxItemSet& rOutAttrs )
+{
+ m_xDlg->GetAttr(rOutAttrs);
+}
+
+BitmapEx AbstractSdPresLayoutDlg_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractSdPresLayoutDlg_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+const SfxItemSet* SdAbstractSfxDialog_Impl::GetOutputItemSet() const
+{
+ return m_xDlg->GetOutputItemSet();
+}
+
+void SdAbstractSfxDialog_Impl::SetText( const OUString& rStr )
+{
+ m_xDlg->set_title(rStr);
+}
+
+const GDIMetaFile& AbstractSdVectorizeDlg_Impl::GetGDIMetaFile() const
+{
+ return m_xDlg->GetGDIMetaFile();
+}
+
+BitmapEx AbstractSdVectorizeDlg_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractSdVectorizeDlg_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+void AbstractSdPublishingDlg_Impl::GetParameterSequence( css::uno::Sequence< css::beans::PropertyValue >& rParams )
+{
+ m_xDlg->GetParameterSequence( rParams );
+}
+
+BitmapEx AbstractSdPublishingDlg_Impl::createScreenshot() const
+{
+ VclPtr<VirtualDevice> xDialogSurface(m_xDlg->getDialog()->screenshot());
+ return xDialogSurface->GetBitmapEx(Point(), xDialogSurface->GetOutputSizePixel());
+}
+
+OString AbstractSdPublishingDlg_Impl::GetScreenshotId() const
+{
+ return m_xDlg->get_help_id();
+}
+
+//-------------- SdAbstractDialogFactory implementation--------------
+
+VclPtr<AbstractSvxBulletAndPositionDlg> SdAbstractDialogFactory_Impl::CreateSvxBulletAndPositionDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView)
+{
+ return VclPtr<AbstractSvxBulletAndPositionDlg_Impl>::Create(std::make_unique<SvxBulletAndPositionDlg>(pParent, *pAttr, pView));
+}
+
+VclPtr<VclAbstractDialog> SdAbstractDialogFactory_Impl::CreateBreakDlg(
+ weld::Window* pParent,
+ ::sd::DrawView* pDrView,
+ ::sd::DrawDocShell* pShell,
+ sal_uLong nSumActionCount,
+ sal_uLong nObjCount )
+{
+ return VclPtr<AbstractBreakDlg_Impl>::Create(std::make_unique<::sd::BreakDlg>(pParent, pDrView, pShell, nSumActionCount, nObjCount));
+}
+
+VclPtr<AbstractCopyDlg> SdAbstractDialogFactory_Impl::CreateCopyDlg(weld::Window* pParent,
+ const SfxItemSet& rInAttrs,
+ ::sd::View* pView )
+{
+ return VclPtr<AbstractCopyDlg_Impl>::Create(std::make_unique<::sd::CopyDlg>(pParent, rInAttrs, pView));
+}
+
+VclPtr<AbstractSdCustomShowDlg> SdAbstractDialogFactory_Impl::CreateSdCustomShowDlg(weld::Window* pParent, SdDrawDocument& rDrawDoc )
+{
+ return VclPtr<AbstractSdCustomShowDlg_Impl>::Create(std::make_unique<SdCustomShowDlg>(pParent, rDrawDoc));
+}
+
+VclPtr<SfxAbstractTabDialog> SdAbstractDialogFactory_Impl::CreateSdTabCharDialog(weld::Window* pParent, const SfxItemSet* pAttr, SfxObjectShell* pDocShell)
+{
+ return VclPtr<SdAbstractTabController_Impl>::Create(std::make_shared<SdCharDlg>(pParent, pAttr, pDocShell));
+}
+
+VclPtr<SfxAbstractTabDialog> SdAbstractDialogFactory_Impl::CreateSdTabPageDialog(weld::Window* pParent, const SfxItemSet* pAttr, SfxObjectShell* pDocShell, bool bAreaPage, bool bIsImpressDoc, bool bIsImpressMaster )
+{
+ return VclPtr<SdAbstractTabController_Impl>::Create(std::make_shared<SdPageDlg>(pDocShell, pParent, pAttr, bAreaPage, bIsImpressDoc, bIsImpressMaster));
+}
+
+VclPtr<AbstractSdModifyFieldDlg> SdAbstractDialogFactory_Impl::CreateSdModifyFieldDlg(weld::Window* pParent, const SvxFieldData* pInField, const SfxItemSet& rSet)
+{
+ return VclPtr<AbstractSdModifyFieldDlg_Impl>::Create(std::make_unique<SdModifyFieldDlg>(pParent, pInField, rSet));
+}
+
+VclPtr<AbstractSdSnapLineDlg> SdAbstractDialogFactory_Impl::CreateSdSnapLineDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, ::sd::View* pView)
+{
+ return VclPtr<AbstractSdSnapLineDlg_Impl>::Create(std::make_unique<SdSnapLineDlg>(pParent, rInAttrs, pView));
+}
+
+VclPtr<AbstractSdInsertLayerDlg> SdAbstractDialogFactory_Impl::CreateSdInsertLayerDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, bool bDeletable, const OUString& aStr)
+{
+ return VclPtr<AbstractSdInsertLayerDlg_Impl>::Create(std::make_unique<SdInsertLayerDlg>(pParent, rInAttrs, bDeletable, aStr));
+}
+
+VclPtr<AbstractSdInsertPagesObjsDlg> SdAbstractDialogFactory_Impl::CreateSdInsertPagesObjsDlg(weld::Window* pParent, const SdDrawDocument* pDoc, SfxMedium* pSfxMedium, const OUString& rFileName)
+{
+ return VclPtr<AbstractSdInsertPagesObjsDlg_Impl>::Create(std::make_unique<SdInsertPagesObjsDlg>(pParent, pDoc, pSfxMedium, rFileName));
+}
+
+VclPtr<AbstractMorphDlg> SdAbstractDialogFactory_Impl::CreateMorphDlg(weld::Window* pParent, const SdrObject* pObj1, const SdrObject* pObj2)
+{
+ return VclPtr<AbstractMorphDlg_Impl>::Create(std::make_unique<::sd::MorphDlg>(pParent, pObj1, pObj2));
+}
+
+VclPtr<SfxAbstractTabDialog> SdAbstractDialogFactory_Impl::CreateSdOutlineBulletTabDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView)
+{
+ return VclPtr<AbstractBulletDialog_Impl>::Create(std::make_shared<::sd::OutlineBulletDlg>(pParent, pAttr, pView));
+}
+
+VclPtr<SfxAbstractTabDialog> SdAbstractDialogFactory_Impl::CreateSdParagraphTabDlg(weld::Window* pParent, const SfxItemSet* pAttr )
+{
+ return VclPtr<SdAbstractTabController_Impl>::Create(std::make_shared<SdParagraphDlg>(pParent, pAttr));
+}
+
+VclPtr<AbstractSdStartPresDlg> SdAbstractDialogFactory_Impl::CreateSdStartPresentationDlg(weld::Window* pParent,
+ const SfxItemSet& rInAttrs, const std::vector<OUString> &rPageNames, SdCustomShowList* pCSList)
+{
+ return VclPtr<AbstractSdStartPresDlg_Impl>::Create(std::make_unique<SdStartPresentationDlg>(pParent, rInAttrs, rPageNames, pCSList));
+}
+
+VclPtr<VclAbstractDialog> SdAbstractDialogFactory_Impl::CreateRemoteDialog(weld::Window* pParent)
+{
+ return VclPtr<SdAbstractGenericDialog_Impl>::Create(std::make_unique<::sd::RemoteDialog>(pParent));
+}
+
+VclPtr<SfxAbstractTabDialog> SdAbstractDialogFactory_Impl::CreateSdPresLayoutTemplateDlg(SfxObjectShell* pDocSh, weld::Window* pParent, bool bBackgroundDlg, SfxStyleSheetBase& rStyleBase, PresentationObjects ePO, SfxStyleSheetBasePool* pSSPool)
+{
+ return VclPtr<SdPresLayoutTemplateDlg_Impl>::Create(std::make_shared<SdPresLayoutTemplateDlg>(pDocSh, pParent, bBackgroundDlg, rStyleBase, ePO, pSSPool));
+}
+
+VclPtr<AbstractSdPresLayoutDlg> SdAbstractDialogFactory_Impl::CreateSdPresLayoutDlg(weld::Window* pParent, ::sd::DrawDocShell* pDocShell, const SfxItemSet& rInAttrs)
+{
+ return VclPtr<AbstractSdPresLayoutDlg_Impl>::Create(std::make_unique<SdPresLayoutDlg>(pDocShell, pParent, rInAttrs));
+}
+
+VclPtr<SfxAbstractTabDialog> SdAbstractDialogFactory_Impl::CreateSdTabTemplateDlg(weld::Window* pParent, const SfxObjectShell* pDocShell, SfxStyleSheetBase& rStyleBase, SdrModel* pModel, SdrView* pView)
+{
+ return VclPtr<SdAbstractTabController_Impl>::Create(std::make_shared<SdTabTemplateDlg>(pParent, pDocShell, rStyleBase, pModel, pView));
+}
+
+VclPtr<SfxAbstractDialog> SdAbstractDialogFactory_Impl::CreatSdActionDialog(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView )
+{
+ return VclPtr<SdAbstractSfxDialog_Impl>::Create(std::make_unique<SdActionDlg>(pParent, pAttr, pView));
+}
+
+VclPtr<AbstractSdVectorizeDlg> SdAbstractDialogFactory_Impl::CreateSdVectorizeDlg(weld::Window* pParent, const Bitmap& rBmp, ::sd::DrawDocShell* pDocShell)
+{
+ return VclPtr<AbstractSdVectorizeDlg_Impl>::Create(std::make_unique<SdVectorizeDlg>(pParent, rBmp, pDocShell));
+}
+
+VclPtr<AbstractSdPublishingDlg> SdAbstractDialogFactory_Impl::CreateSdPublishingDlg(weld::Window* pParent, DocumentType eDocType)
+{
+ return VclPtr<AbstractSdPublishingDlg_Impl>::Create(std::make_unique<SdPublishingDlg>(pParent, eDocType));
+}
+
+// Factories for TabPages
+CreateTabPage SdAbstractDialogFactory_Impl::GetSdOptionsContentsTabPageCreatorFunc()
+{
+ return SdTpOptionsContents::Create;
+}
+
+CreateTabPage SdAbstractDialogFactory_Impl::GetSdPrintOptionsTabPageCreatorFunc()
+{
+ return SdPrintOptions::Create;
+}
+
+CreateTabPage SdAbstractDialogFactory_Impl::GetSdOptionsMiscTabPageCreatorFunc()
+{
+ return SdTpOptionsMisc::Create;
+}
+
+CreateTabPage SdAbstractDialogFactory_Impl::GetSdOptionsSnapTabPageCreatorFunc()
+{
+ return SdTpOptionsSnap::Create;
+}
+
+VclPtr<VclAbstractDialog> SdAbstractDialogFactory_Impl::CreateMasterLayoutDialog(weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage)
+{
+ return VclPtr<AbstractMasterLayoutDialog_Impl>::Create(std::make_unique<::sd::MasterLayoutDialog>(pParent, pDoc, pCurrentPage));
+}
+
+VclPtr<AbstractHeaderFooterDialog> SdAbstractDialogFactory_Impl::CreateHeaderFooterDialog(sd::ViewShell* pViewShell,
+ weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage)
+{
+ return VclPtr<AbstractHeaderFooterDialog_Impl>::Create(std::make_shared<::sd::HeaderFooterDialog>(pViewShell, pParent, pDoc, pCurrentPage));
+}
+
+VclPtr<VclAbstractDialog> SdAbstractDialogFactory_Impl::CreateSdPhotoAlbumDialog(weld::Window* pParent, SdDrawDocument* pDoc)
+{
+ return VclPtr<SdAbstractGenericDialog_Impl>::Create(std::make_unique<sd::SdPhotoAlbumDialog>(pParent, pDoc));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/sddlgfact.hxx b/sd/source/ui/dlg/sddlgfact.hxx
new file mode 100644
index 000000000..8da5c74dd
--- /dev/null
+++ b/sd/source/ui/dlg/sddlgfact.hxx
@@ -0,0 +1,448 @@
+/* -*- 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 .
+ */
+#pragma once
+
+#include <sdabstdlg.hxx>
+#include <sfx2/basedlgs.hxx>
+#include <sfx2/sfxdlg.hxx>
+#include <svx/svxdlg.hxx>
+
+#include <morphdlg.hxx>
+#include <copydlg.hxx>
+#include <BreakDlg.hxx>
+#include <headerfooterdlg.hxx>
+#include <masterlayoutdlg.hxx>
+#include <custsdlg.hxx>
+#include <layeroptionsdlg.hxx>
+#include <inspagob.hxx>
+#include <dlgfield.hxx>
+#include <sdpreslt.hxx>
+#include <prltempl.hxx>
+#include <pubdlg.hxx>
+#include <dlgsnap.hxx>
+#include <present.hxx>
+#include <vectdlg.hxx>
+#include <BulletAndPositionDlg.hxx>
+
+//namespace sd {
+// class MorphDlg;
+// class CopyDlg;
+// class BreakDlg;
+// class HeaderFooterDialog;
+// class MasterLayoutDialog;
+//}
+
+class SvxBulletAndPositionDlg;
+
+/// Provides managing and getting information from the numbering and position dialog.
+class AbstractSvxBulletAndPositionDlg_Impl :public AbstractSvxBulletAndPositionDlg
+{
+ std::unique_ptr<SvxBulletAndPositionDlg> m_xDlg;
+public:
+ explicit AbstractSvxBulletAndPositionDlg_Impl(std::unique_ptr<SvxBulletAndPositionDlg> p)
+ : m_xDlg(std::move(p))
+ {
+ }
+ virtual short Execute() override;
+ virtual const SfxItemSet* GetOutputItemSet( SfxItemSet* ) const override ;
+ virtual bool IsApplyToMaster() override;
+ virtual bool IsSlideScope() override;
+};
+
+class SdAbstractGenericDialog_Impl : public VclAbstractDialog
+{
+ std::unique_ptr<weld::GenericDialogController> m_xDlg;
+public:
+ explicit SdAbstractGenericDialog_Impl(std::unique_ptr<weld::GenericDialogController> p)
+ : m_xDlg(std::move(p))
+ {
+ }
+ virtual short Execute() override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractMasterLayoutDialog_Impl : public VclAbstractDialog
+{
+private:
+ std::unique_ptr<sd::MasterLayoutDialog> m_xDlg;
+public:
+ AbstractMasterLayoutDialog_Impl(std::unique_ptr<::sd::MasterLayoutDialog> pDlg);
+ virtual short Execute() override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractBreakDlg_Impl : public VclAbstractDialog
+{
+private:
+ std::unique_ptr<sd::BreakDlg> m_xDlg;
+public:
+ AbstractBreakDlg_Impl(std::unique_ptr<::sd::BreakDlg> pDlg);
+ virtual short Execute() override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractCopyDlg_Impl : public AbstractCopyDlg
+{
+private:
+ std::unique_ptr<sd::CopyDlg> m_xDlg;
+public:
+ AbstractCopyDlg_Impl(std::unique_ptr<::sd::CopyDlg> pDlg)
+ : m_xDlg(std::move(pDlg))
+ {
+ }
+ virtual short Execute() override;
+ virtual void GetAttr( SfxItemSet& rOutAttrs ) override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractSdCustomShowDlg_Impl : public AbstractSdCustomShowDlg
+{
+private:
+ std::unique_ptr<SdCustomShowDlg> m_xDlg;
+public:
+ AbstractSdCustomShowDlg_Impl(std::unique_ptr<SdCustomShowDlg> pDlg)
+ : m_xDlg(std::move(pDlg))
+ {
+ }
+ virtual short Execute() override;
+ virtual bool IsCustomShow() const override ;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class SdAbstractTabController_Impl : public SfxAbstractTabDialog
+{
+ std::shared_ptr<SfxTabDialogController> m_xDlg;
+public:
+ explicit SdAbstractTabController_Impl(std::shared_ptr<SfxTabDialogController> p)
+ : m_xDlg(std::move(p))
+ {
+ }
+ virtual short Execute() override;
+ virtual bool StartExecuteAsync(AsyncContext &rCtx) override;
+ virtual void SetCurPageId( const OString &rName ) override;
+ virtual const SfxItemSet* GetOutputItemSet() const override;
+ virtual WhichRangesContainer GetInputRanges( const SfxItemPool& pItem ) override;
+ virtual void SetInputSet( const SfxItemSet* pInSet ) override;
+ virtual void SetText( const OUString& rStr ) override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractBulletDialog_Impl : public SfxAbstractTabDialog
+{
+ std::shared_ptr<SfxTabDialogController> m_xDlg;
+public:
+ explicit AbstractBulletDialog_Impl(std::shared_ptr<SfxTabDialogController> p)
+ : m_xDlg(std::move(p))
+ {
+ }
+ virtual short Execute() override;
+ virtual bool StartExecuteAsync(AsyncContext &rCtx) override;
+ virtual void SetCurPageId( const OString& rName ) override;
+ virtual const SfxItemSet* GetOutputItemSet() const override;
+ virtual WhichRangesContainer GetInputRanges( const SfxItemPool& pItem ) override;
+ virtual void SetInputSet( const SfxItemSet* pInSet ) override;
+ virtual void SetText( const OUString& rStr ) override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class SdPresLayoutTemplateDlg_Impl : public SfxAbstractTabDialog
+{
+ std::shared_ptr<SdPresLayoutTemplateDlg> m_xDlg;
+public:
+ explicit SdPresLayoutTemplateDlg_Impl(std::shared_ptr<SdPresLayoutTemplateDlg> p)
+ : m_xDlg(std::move(p))
+ {
+ }
+ virtual short Execute() override;
+ virtual bool StartExecuteAsync(AsyncContext &rCtx) override;
+ virtual void SetCurPageId( const OString& rName ) override;
+ virtual const SfxItemSet* GetOutputItemSet() const override;
+ virtual WhichRangesContainer GetInputRanges( const SfxItemPool& pItem ) override;
+ virtual void SetInputSet( const SfxItemSet* pInSet ) override;
+ virtual void SetText( const OUString& rStr ) override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractSdModifyFieldDlg_Impl : public AbstractSdModifyFieldDlg
+{
+private:
+ std::unique_ptr<SdModifyFieldDlg> m_xDlg;
+public:
+ AbstractSdModifyFieldDlg_Impl(std::unique_ptr<SdModifyFieldDlg> pDlg)
+ : m_xDlg(std::move(pDlg))
+ {
+ }
+ virtual short Execute() override;
+ virtual SvxFieldData* GetField() override;
+ virtual SfxItemSet GetItemSet() override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractSdSnapLineDlg_Impl : public AbstractSdSnapLineDlg
+{
+private:
+ std::unique_ptr<SdSnapLineDlg> m_xDlg;
+public:
+ AbstractSdSnapLineDlg_Impl(std::unique_ptr<SdSnapLineDlg> pDlg)
+ : m_xDlg(std::move(pDlg))
+ {
+ }
+ virtual short Execute() override;
+ virtual void GetAttr(SfxItemSet& rOutAttrs) override;
+ virtual void HideRadioGroup() override;
+ virtual void HideDeleteBtn() override;
+ virtual void SetInputFields(bool bEnableX, bool bEnableY) override;
+ virtual void SetText( const OUString& rStr ) override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractSdInsertLayerDlg_Impl : public AbstractSdInsertLayerDlg
+{
+private:
+ std::unique_ptr<SdInsertLayerDlg> m_xDlg;
+public:
+ AbstractSdInsertLayerDlg_Impl(std::unique_ptr<SdInsertLayerDlg> pDlg)
+ : m_xDlg(std::move(pDlg))
+ {
+ }
+ virtual short Execute() override;
+ virtual void GetAttr( SfxItemSet& rOutAttrs ) override ;
+ virtual void SetHelpId( const OString& rHelpId ) override ;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractSdInsertPagesObjsDlg_Impl : public AbstractSdInsertPagesObjsDlg
+{
+private:
+ std::unique_ptr<SdInsertPagesObjsDlg> m_xDlg;
+public:
+ AbstractSdInsertPagesObjsDlg_Impl(std::unique_ptr<SdInsertPagesObjsDlg> pDlg)
+ : m_xDlg(std::move(pDlg))
+ {
+ }
+ virtual short Execute() override;
+ virtual std::vector<OUString> GetList ( const sal_uInt16 nType ) override;
+ virtual bool IsLink() override;
+ virtual bool IsRemoveUnnecessaryMasterPages() const override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractMorphDlg_Impl : public AbstractMorphDlg
+{
+private:
+ std::unique_ptr<sd::MorphDlg> m_xDlg;
+public:
+ AbstractMorphDlg_Impl(std::unique_ptr<::sd::MorphDlg> pDlg)
+ : m_xDlg(std::move(pDlg))
+ {
+ }
+ virtual short Execute() override;
+ virtual void SaveSettings() const override;
+ virtual sal_uInt16 GetFadeSteps() const override;
+ virtual bool IsAttributeFade() const override ;
+ virtual bool IsOrientationFade() const override ;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractSdStartPresDlg_Impl : public AbstractSdStartPresDlg
+{
+private:
+ std::unique_ptr<SdStartPresentationDlg> m_xDlg;
+public:
+ AbstractSdStartPresDlg_Impl(std::unique_ptr<SdStartPresentationDlg> pDlg)
+ : m_xDlg(std::move(pDlg))
+ {
+ }
+ virtual short Execute() override;
+ virtual void GetAttr( SfxItemSet& rOutAttrs ) override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractSdPresLayoutDlg_Impl : public AbstractSdPresLayoutDlg
+{
+private:
+ std::unique_ptr<SdPresLayoutDlg> m_xDlg;
+public:
+ AbstractSdPresLayoutDlg_Impl(std::unique_ptr<SdPresLayoutDlg> pDlg)
+ : m_xDlg(std::move(pDlg))
+ {
+ }
+ virtual short Execute() override;
+ virtual void GetAttr(SfxItemSet& rOutAttrs) override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class SdAbstractSfxDialog_Impl : public SfxAbstractDialog
+{
+private:
+ std::unique_ptr<SfxSingleTabDialogController> m_xDlg;
+public:
+ SdAbstractSfxDialog_Impl(std::unique_ptr<SfxSingleTabDialogController> pDlg)
+ : m_xDlg(std::move(pDlg))
+ {
+ }
+ virtual short Execute() override;
+ virtual const SfxItemSet* GetOutputItemSet() const override;
+ virtual void SetText( const OUString& rStr ) override;
+};
+
+class AbstractSdVectorizeDlg_Impl :public AbstractSdVectorizeDlg
+{
+private:
+ std::unique_ptr<SdVectorizeDlg> m_xDlg;
+public:
+ AbstractSdVectorizeDlg_Impl(std::unique_ptr<SdVectorizeDlg> pDlg)
+ : m_xDlg(std::move(pDlg))
+ {
+ }
+ virtual short Execute() override;
+ virtual const GDIMetaFile& GetGDIMetaFile() const override ;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractSdPublishingDlg_Impl :public AbstractSdPublishingDlg
+{
+private:
+ std::unique_ptr<SdPublishingDlg> m_xDlg;
+public:
+ AbstractSdPublishingDlg_Impl(std::unique_ptr<SdPublishingDlg> pDlg)
+ : m_xDlg(std::move(pDlg))
+ {
+ }
+ virtual short Execute() override;
+ virtual void GetParameterSequence( css::uno::Sequence< css::beans::PropertyValue >& rParams ) override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+class AbstractHeaderFooterDialog_Impl :public AbstractHeaderFooterDialog
+{
+private:
+ std::shared_ptr<::sd::HeaderFooterDialog> m_xDlg;
+public:
+ AbstractHeaderFooterDialog_Impl(std::shared_ptr<::sd::HeaderFooterDialog> pDlg)
+ : m_xDlg(std::move(pDlg))
+ {
+ }
+ virtual short Execute() override;
+ virtual bool StartExecuteAsync(AsyncContext &rCtx) override;
+
+ // screenshotting
+ virtual BitmapEx createScreenshot() const override;
+ virtual OString GetScreenshotId() const override;
+};
+
+//AbstractDialogFactory_Impl implementations
+class SdAbstractDialogFactory_Impl : public SdAbstractDialogFactory
+{
+
+public:
+ virtual ~SdAbstractDialogFactory_Impl() {}
+
+ virtual VclPtr<AbstractSvxBulletAndPositionDlg> CreateSvxBulletAndPositionDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) override;
+ virtual VclPtr<VclAbstractDialog> CreateBreakDlg(weld::Window* pWindow, ::sd::DrawView* pDrView, ::sd::DrawDocShell* pShell, sal_uLong nSumActionCount, sal_uLong nObjCount) override;
+ virtual VclPtr<AbstractCopyDlg> CreateCopyDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, ::sd::View* pView) override;
+ virtual VclPtr<AbstractSdCustomShowDlg> CreateSdCustomShowDlg(weld::Window* pParent, SdDrawDocument& rDrawDoc) override;
+ virtual VclPtr<SfxAbstractTabDialog> CreateSdTabCharDialog(weld::Window* pWindow, const SfxItemSet* pAttr, SfxObjectShell* pDocShell) override;
+ virtual VclPtr<SfxAbstractTabDialog> CreateSdTabPageDialog(weld::Window* pWindow, const SfxItemSet* pAttr, SfxObjectShell* pDocShell, bool bAreaPage, bool bIsImpressDoc, bool bIsImpressMaster) override;
+ virtual VclPtr<AbstractSdModifyFieldDlg> CreateSdModifyFieldDlg(weld::Window* pWindow, const SvxFieldData* pInField, const SfxItemSet& rSet) override;
+ virtual VclPtr<AbstractSdSnapLineDlg> CreateSdSnapLineDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, ::sd::View* pView) override;
+ virtual VclPtr<AbstractSdInsertLayerDlg> CreateSdInsertLayerDlg(weld::Window* pParent, const SfxItemSet& rInAttrs, bool bDeletable, const OUString& aStr) override;
+ virtual VclPtr<AbstractSdInsertPagesObjsDlg> CreateSdInsertPagesObjsDlg(weld::Window* pParent, const SdDrawDocument* pDoc, SfxMedium* pSfxMedium, const OUString& rFileName ) override;
+ virtual VclPtr<AbstractMorphDlg> CreateMorphDlg(weld::Window* pParent, const SdrObject* pObj1, const SdrObject* pObj2) override;
+ virtual VclPtr<SfxAbstractTabDialog> CreateSdOutlineBulletTabDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) override;
+ virtual VclPtr<SfxAbstractTabDialog> CreateSdParagraphTabDlg(weld::Window* pParent, const SfxItemSet* pAttr) override;
+ virtual VclPtr<AbstractSdStartPresDlg> CreateSdStartPresentationDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs,
+ const std::vector<OUString> &rPageNames, SdCustomShowList* pCSList ) override;
+ virtual VclPtr<VclAbstractDialog> CreateRemoteDialog(weld::Window* pWindow) override; // add for RemoteDialog
+ virtual VclPtr<SfxAbstractTabDialog> CreateSdPresLayoutTemplateDlg(SfxObjectShell* pDocSh, weld::Window* pParent, bool bBackgroundDlg, SfxStyleSheetBase& rStyleBase, PresentationObjects ePO, SfxStyleSheetBasePool* pSSPool) override;
+ virtual VclPtr<AbstractSdPresLayoutDlg> CreateSdPresLayoutDlg(weld::Window* pParent, ::sd::DrawDocShell* pDocShell, const SfxItemSet& rInAttrs) override;
+ virtual VclPtr<SfxAbstractTabDialog> CreateSdTabTemplateDlg(weld::Window* pParent, const SfxObjectShell* pDocShell, SfxStyleSheetBase& rStyleBase, SdrModel* pModel, SdrView* pView ) override;
+ virtual VclPtr<SfxAbstractDialog> CreatSdActionDialog(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView) override;
+ virtual VclPtr<AbstractSdVectorizeDlg> CreateSdVectorizeDlg(weld::Window* pParent, const Bitmap& rBmp, ::sd::DrawDocShell* pDocShell) override;
+ virtual VclPtr<AbstractSdPublishingDlg> CreateSdPublishingDlg(weld::Window* pWindow, DocumentType eDocType) override;
+
+ virtual VclPtr<VclAbstractDialog> CreateSdPhotoAlbumDialog(weld::Window* pWindow, SdDrawDocument* pDoc) override;
+
+ virtual VclPtr<VclAbstractDialog> CreateMasterLayoutDialog(weld::Window* pParent, SdDrawDocument* pDoc, SdPage*) override;
+
+ virtual VclPtr<AbstractHeaderFooterDialog> CreateHeaderFooterDialog(sd::ViewShell* pViewShell,
+ weld::Window* pParent,
+ SdDrawDocument* pDoc,
+ SdPage* pCurrentPage) override;
+
+ // For TabPage
+ virtual CreateTabPage GetSdOptionsContentsTabPageCreatorFunc() override;
+ virtual CreateTabPage GetSdPrintOptionsTabPageCreatorFunc() override;
+ virtual CreateTabPage GetSdOptionsMiscTabPageCreatorFunc() override;
+ virtual CreateTabPage GetSdOptionsSnapTabPageCreatorFunc() override;
+
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/sdpreslt.cxx b/sd/source/ui/dlg/sdpreslt.cxx
new file mode 100644
index 000000000..dd54611e2
--- /dev/null
+++ b/sd/source/ui/dlg/sdpreslt.cxx
@@ -0,0 +1,267 @@
+/* -*- 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 <svl/itemset.hxx>
+#include <svl/eitem.hxx>
+#include <svl/stritem.hxx>
+#include <sfx2/new.hxx>
+#include <svtools/valueset.hxx>
+#include <tools/debug.hxx>
+#include <vcl/image.hxx>
+
+#include <strings.hrc>
+
+#include <bitmaps.hlst>
+#include <sdpreslt.hxx>
+#include <sdattr.hrc>
+#include <sdresid.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <DrawDocShell.hxx>
+#include <memory>
+
+SdPresLayoutDlg::SdPresLayoutDlg(::sd::DrawDocShell* pDocShell,
+ weld::Window* pWindow, const SfxItemSet& rInAttrs)
+ : GenericDialogController(pWindow, "modules/simpress/ui/slidedesigndialog.ui", "SlideDesignDialog")
+ , mpDocSh(pDocShell)
+ , mrOutAttrs(rInAttrs)
+ , maStrNone(SdResId(STR_NULL))
+ , m_xCbxMasterPage(m_xBuilder->weld_check_button("masterpage"))
+ , m_xCbxCheckMasters(m_xBuilder->weld_check_button("checkmasters"))
+ , m_xBtnLoad(m_xBuilder->weld_button("load"))
+ , m_xVS(new ValueSet(m_xBuilder->weld_scrolled_window("selectwin", true)))
+ , m_xVSWin(new weld::CustomWeld(*m_xBuilder, "select", *m_xVS))
+{
+ m_xVSWin->set_size_request(m_xBtnLoad->get_approximate_digit_width() * 60,
+ m_xBtnLoad->get_text_height() * 20);
+
+ m_xVS->SetDoubleClickHdl(LINK(this, SdPresLayoutDlg, ClickLayoutHdl));
+ m_xBtnLoad->connect_clicked(LINK(this, SdPresLayoutDlg, ClickLoadHdl));
+
+ Reset();
+}
+
+SdPresLayoutDlg::~SdPresLayoutDlg()
+{
+}
+
+/**
+ * Initialize
+ */
+void SdPresLayoutDlg::Reset()
+{
+ tools::Long nName;
+
+ // replace master page
+ if( const SfxBoolItem* pPoolItem = mrOutAttrs.GetItemIfSet( ATTR_PRESLAYOUT_MASTER_PAGE, false ) )
+ {
+ bool bMasterPage = pPoolItem->GetValue();
+ m_xCbxMasterPage->set_sensitive( !bMasterPage );
+ m_xCbxMasterPage->set_active( bMasterPage );
+ }
+
+ // remove not used master pages
+ m_xCbxCheckMasters->set_active(false);
+
+ if( const SfxStringItem* pPoolItem = mrOutAttrs.GetItemIfSet(ATTR_PRESLAYOUT_NAME) )
+ maName = pPoolItem->GetValue();
+ else
+ maName.clear();
+
+ FillValueSet();
+
+ mnLayoutCount = maLayoutNames.size();
+ for( nName = 0; nName < mnLayoutCount; nName++ )
+ {
+ if (maLayoutNames[nName] == maName)
+ break;
+ }
+ DBG_ASSERT(nName < mnLayoutCount, "Layout not found");
+
+ m_xVS->SelectItem(static_cast<sal_uInt16>(nName) + 1); // Indices of the ValueSets start at 1
+
+}
+
+/**
+ * Fills the provided Item-Set with dialog box attributes
+ */
+void SdPresLayoutDlg::GetAttr(SfxItemSet& rOutAttrs)
+{
+ short nId = m_xVS->GetSelectedItemId();
+ bool bLoad = nId > mnLayoutCount;
+ rOutAttrs.Put( SfxBoolItem( ATTR_PRESLAYOUT_LOAD, bLoad ) );
+
+ OUString aLayoutName;
+
+ if( bLoad )
+ {
+ aLayoutName = maName + "#" + maLayoutNames[ nId - 1 ];
+ }
+ else if (nId)
+ {
+ aLayoutName = maLayoutNames[ nId - 1 ];
+ if( aLayoutName == maStrNone )
+ aLayoutName.clear(); // that way we encode "- nothing -" (see below)
+ }
+
+ rOutAttrs.Put( SfxStringItem( ATTR_PRESLAYOUT_NAME, aLayoutName ) );
+ rOutAttrs.Put( SfxBoolItem( ATTR_PRESLAYOUT_MASTER_PAGE, m_xCbxMasterPage->get_active() ) );
+ rOutAttrs.Put( SfxBoolItem( ATTR_PRESLAYOUT_CHECK_MASTERS, m_xCbxCheckMasters->get_active() ) );
+}
+
+/**
+ * Fills ValueSet with bitmaps
+ */
+void SdPresLayoutDlg::FillValueSet()
+{
+ m_xVS->SetStyle(m_xVS->GetStyle() | WB_ITEMBORDER | WB_DOUBLEBORDER
+ | WB_VSCROLL | WB_NAMEFIELD);
+
+ m_xVS->SetColCount(2);
+ m_xVS->SetLineCount(2);
+ m_xVS->SetExtraSpacing(2);
+
+ SdDrawDocument* pDoc = mpDocSh->GetDoc();
+
+ sal_uInt16 nCount = pDoc->GetMasterPageCount();
+
+ for (sal_uInt16 nLayout = 0; nLayout < nCount; nLayout++)
+ {
+ SdPage* pMaster = static_cast<SdPage*>(pDoc->GetMasterPage(nLayout));
+ if (pMaster->GetPageKind() == PageKind::Standard)
+ {
+ OUString aLayoutName(pMaster->GetLayoutName());
+ aLayoutName = aLayoutName.copy(0, aLayoutName.indexOf(SD_LT_SEPARATOR));
+ maLayoutNames.push_back(aLayoutName);
+
+ Image aBitmap(mpDocSh->GetPagePreviewBitmap(pMaster));
+ m_xVS->InsertItem(static_cast<sal_uInt16>(maLayoutNames.size()), aBitmap, aLayoutName);
+ }
+ }
+
+ m_xVS->Show();
+}
+
+/**
+ * DoubleClick handler
+ */
+IMPL_LINK_NOARG(SdPresLayoutDlg, ClickLayoutHdl, ValueSet*, void)
+{
+ m_xDialog->response(RET_OK);
+}
+
+/**
+ * Click handler for load button
+ */
+IMPL_LINK_NOARG(SdPresLayoutDlg, ClickLoadHdl, weld::Button&, void)
+{
+ SfxNewFileDialog aDlg(m_xDialog.get(), SfxNewFileDialogMode::Preview);
+ aDlg.set_title(SdResId(STR_LOAD_PRESENTATION_LAYOUT));
+ sal_uInt16 nResult = aDlg.run();
+
+ bool bCancel = false;
+
+ switch (nResult)
+ {
+ case RET_OK:
+ {
+ if (aDlg.IsTemplate())
+ {
+ maName = aDlg.GetTemplateFileName();
+ }
+ else
+ {
+ // that way we encode "- nothing -"
+ maName.clear();
+ }
+ }
+ break;
+
+ default:
+ bCancel = true;
+ }
+
+ if( bCancel )
+ return;
+
+ // check if template already exists
+ OUString aCompareStr(maName);
+ if (aCompareStr.isEmpty())
+ aCompareStr = maStrNone;
+
+ auto it = std::find(maLayoutNames.begin(), maLayoutNames.end(), aCompareStr);
+ if (it != maLayoutNames.end())
+ {
+ sal_uInt16 aPos = static_cast<sal_uInt16>(std::distance(maLayoutNames.begin(), it));
+ // select template
+ m_xVS->SelectItem( aPos + 1 );
+ }
+ else
+ {
+ // load document in order to determine preview bitmap (if template is selected)
+ if (!maName.isEmpty())
+ {
+ // determine document in order to call OpenBookmarkDoc
+ SdDrawDocument* pDoc = mpDocSh->GetDoc();
+ SdDrawDocument* pTemplDoc = pDoc->OpenBookmarkDoc( maName );
+
+ if (pTemplDoc)
+ {
+ ::sd::DrawDocShell* pTemplDocSh= pTemplDoc->GetDocSh();
+
+ sal_uInt16 nCount = pTemplDoc->GetMasterPageCount();
+
+ for (sal_uInt16 nLayout = 0; nLayout < nCount; nLayout++)
+ {
+ SdPage* pMaster = static_cast<SdPage*>( pTemplDoc->GetMasterPage(nLayout) );
+ if (pMaster->GetPageKind() == PageKind::Standard)
+ {
+ OUString aLayoutName(pMaster->GetLayoutName());
+ aLayoutName = aLayoutName.copy(0, aLayoutName.indexOf(SD_LT_SEPARATOR));
+ maLayoutNames.push_back(aLayoutName);
+
+ Image aBitmap(pTemplDocSh->GetPagePreviewBitmap(pMaster));
+ m_xVS->InsertItem(static_cast<sal_uInt16>(maLayoutNames.size()), aBitmap, aLayoutName);
+ }
+ }
+ }
+ else
+ {
+ bCancel = true;
+ }
+
+ pDoc->CloseBookmarkDoc();
+ }
+ else
+ {
+ // empty layout
+ maLayoutNames.push_back(maStrNone);
+ m_xVS->InsertItem( static_cast<sal_uInt16>(maLayoutNames.size()),
+ Image(BMP_SLIDE_NONE), maStrNone );
+ }
+
+ if (!bCancel)
+ {
+ // select template
+ m_xVS->SelectItem( static_cast<sal_uInt16>(maLayoutNames.size()) );
+ }
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/sdtreelb.cxx b/sd/source/ui/dlg/sdtreelb.cxx
new file mode 100644
index 000000000..c15a2ea09
--- /dev/null
+++ b/sd/source/ui/dlg/sdtreelb.cxx
@@ -0,0 +1,1206 @@
+/* -*- 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/log.hxx>
+#include <sal/types.h>
+#include <sot/formats.hxx>
+#include <vcl/weld.hxx>
+#include <svx/svditer.hxx>
+#include <sfx2/docfile.hxx>
+#include <svx/svdoole2.hxx>
+#include <vcl/svapp.hxx>
+#include <cusshow.hxx>
+
+#include <sfx2/viewfrm.hxx>
+
+#include <sdtreelb.hxx>
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <sdmod.hxx>
+#include <sdresid.hxx>
+#include <navigatr.hxx>
+#include <strings.hrc>
+
+#include <bitmaps.hlst>
+#include <customshowlist.hxx>
+#include <ViewShell.hxx>
+#include <DrawController.hxx>
+#include <ViewShellBase.hxx>
+
+#include <com/sun/star/embed/XEmbedPersist.hpp>
+#include <com/sun/star/embed/XEmbeddedObject.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <svtools/acceleratorexecute.hxx>
+#include <svtools/embedtransfer.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <comphelper/processfactory.hxx>
+
+
+using namespace com::sun::star;
+
+bool SdPageObjsTLV::bIsInDrag = false;
+
+bool SdPageObjsTLV::IsInDrag()
+{
+ return bIsInDrag;
+}
+
+SotClipboardFormatId SdPageObjsTLV::SdPageObjsTransferable::mnListBoxDropFormatId = static_cast<SotClipboardFormatId>(SAL_MAX_UINT32);
+
+SdPageObjsTLV::SdPageObjsTransferable::SdPageObjsTransferable(
+ const INetBookmark& rBookmark,
+ ::sd::DrawDocShell& rDocShell,
+ NavigatorDragType eDragType)
+ : SdTransferable(rDocShell.GetDoc(), nullptr, true),
+ maBookmark( rBookmark ),
+ mrDocShell( rDocShell ),
+ meDragType( eDragType )
+{
+}
+
+SdPageObjsTLV::SdPageObjsTransferable::~SdPageObjsTransferable()
+{
+}
+
+void SdPageObjsTLV::SdPageObjsTransferable::AddSupportedFormats()
+{
+ AddFormat(SotClipboardFormatId::NETSCAPE_BOOKMARK);
+ AddFormat(SotClipboardFormatId::TREELISTBOX);
+ AddFormat(GetListBoxDropFormatId());
+}
+
+bool SdPageObjsTLV::SdPageObjsTransferable::GetData( const css::datatransfer::DataFlavor& rFlavor, const OUString& /*rDestDoc*/ )
+{
+ SotClipboardFormatId nFormatId = SotExchange::GetFormat( rFlavor );
+ switch (nFormatId)
+ {
+ case SotClipboardFormatId::NETSCAPE_BOOKMARK:
+ SetINetBookmark( maBookmark, rFlavor );
+ return true;
+
+ case SotClipboardFormatId::TREELISTBOX:
+ {
+ css::uno::Any aTreeListBoxData; // empty for now
+ SetAny(aTreeListBoxData);
+ return true;
+ }
+
+ default:
+ return false;
+ }
+}
+
+void SdPageObjsTLV::SdPageObjsTransferable::DragFinished( sal_Int8 nDropAction )
+{
+ SdPageObjsTLV::OnDragFinished();
+ SdTransferable::DragFinished(nDropAction);
+}
+
+sal_Int64 SAL_CALL SdPageObjsTLV::SdPageObjsTransferable::getSomething( const css::uno::Sequence< sal_Int8 >& rId )
+{
+ return comphelper::getSomethingImpl(rId, this,
+ comphelper::FallbackToGetSomethingOf<SdTransferable>{});
+}
+
+const css::uno::Sequence<sal_Int8>& SdPageObjsTLV::SdPageObjsTransferable::getUnoTunnelId()
+{
+ static const comphelper::UnoIdInit theSdPageObjsTLBUnoTunnelId;
+ return theSdPageObjsTLBUnoTunnelId.getSeq();
+}
+
+SdPageObjsTLV::SdPageObjsTransferable* SdPageObjsTLV::SdPageObjsTransferable::getImplementation( const css::uno::Reference< css::uno::XInterface >& rxData )
+ noexcept
+{
+ try
+ {
+ return comphelper::getFromUnoTunnel<SdPageObjsTLV::SdPageObjsTransferable>(rxData);
+ }
+ catch( const css::uno::Exception& )
+ {
+ }
+ return nullptr;
+}
+
+SotClipboardFormatId SdPageObjsTLV::SdPageObjsTransferable::GetListBoxDropFormatId()
+{
+ if (mnListBoxDropFormatId == static_cast<SotClipboardFormatId>(SAL_MAX_UINT32))
+ mnListBoxDropFormatId = SotExchange::RegisterFormatMimeType("application/x-openoffice-treelistbox-moveonly;windows_formatname=\"SV_LBOX_DD_FORMAT_MOVE\"");
+ return mnListBoxDropFormatId;
+}
+
+/**
+ * @return true if children of the specified string are selected
+ */
+bool SdPageObjsTLV::HasSelectedChildren( std::u16string_view rName )
+{
+ bool bChildren = false;
+
+ if( !rName.empty() )
+ {
+ std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator());
+ OUString aTmp;
+
+ if (m_xTreeView->get_iter_first(*xEntry))
+ {
+ do
+ {
+ aTmp = m_xTreeView->get_text(*xEntry);
+ if (aTmp == rName)
+ {
+
+ // see if any of the selected nodes are subchildren of this node
+ m_xTreeView->selected_foreach([this, &bChildren, &xEntry](weld::TreeIter& rEntry){
+ std::unique_ptr<weld::TreeIter> xParent(m_xTreeView->make_iterator(&rEntry));
+ while (!bChildren && m_xTreeView->iter_parent(*xParent))
+ bChildren = m_xTreeView->iter_compare(*xParent, *xEntry) == 0;
+ return bChildren;
+ });
+
+ break;
+ }
+ }
+ while (m_xTreeView->iter_next(*xEntry));
+ }
+ }
+
+ return bChildren;
+}
+
+void SdPageObjsTLV::SetShowAllShapes (
+ const bool bShowAllShapes,
+ const bool bFillList)
+{
+ m_bShowAllShapes = bShowAllShapes;
+ if (bFillList)
+ {
+ if (m_pMedium == nullptr)
+ Fill(m_pDoc, m_bShowAllPages, m_aDocName);
+ else
+ Fill(m_pDoc, m_pMedium, m_aDocName);
+ }
+}
+
+bool SdPageObjsTLV::IsEqualToShapeList(std::unique_ptr<weld::TreeIter>& rEntry, const SdrObjList& rList,
+ std::u16string_view rListName)
+{
+ if (!rEntry)
+ return false;
+ OUString aName = m_xTreeView->get_text(*rEntry);
+
+ if (rListName != aName)
+ return false;
+
+ if (!m_xTreeView->iter_next(*rEntry))
+ rEntry.reset();
+
+ SdrObjListIter aIter(&rList,
+ !rList.HasObjectNavigationOrder() /* use navigation order, if available */,
+ SdrIterMode::Flat);
+
+ while (aIter.IsMore())
+ {
+ SdrObject* pObj = aIter.Next();
+
+ const OUString aObjectName(GetObjectName(pObj));
+
+ if (!aObjectName.isEmpty())
+ {
+ if (!rEntry)
+ return false;
+
+ aName = m_xTreeView->get_text(*rEntry);
+
+ if (aObjectName != aName)
+ return false;
+
+ if (pObj->IsGroupObject())
+ {
+ bool bRet = IsEqualToShapeList(rEntry, *pObj->GetSubList(), aObjectName);
+ if (!bRet)
+ return false;
+ }
+ else
+ {
+ if (!m_xTreeView->iter_next(*rEntry))
+ rEntry.reset();
+ }
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Checks if the pages (PageKind::Standard) of a doc and the objects on the pages
+ * are identical to the TreeLB.
+ * If a doc is provided, this will be the used doc (important by more than
+ * one document).
+ */
+bool SdPageObjsTLV::IsEqualToDoc( const SdDrawDocument* pInDoc )
+{
+ if( pInDoc )
+ m_pDoc = pInDoc;
+
+ if( !m_pDoc )
+ return false;
+
+ std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator());
+ if (!m_xTreeView->get_iter_first(*xEntry))
+ xEntry.reset();
+
+ // compare all pages including the objects
+ sal_uInt16 nPage = 0;
+ const sal_uInt16 nMaxPages = m_pDoc->GetPageCount();
+
+ while( nPage < nMaxPages )
+ {
+ const SdPage* pPage = static_cast<const SdPage*>( m_pDoc->GetPage( nPage ) );
+ if( pPage->GetPageKind() == PageKind::Standard )
+ {
+ bool bRet = IsEqualToShapeList(xEntry, *pPage, pPage->GetName());
+ if (!bRet)
+ return false;
+ }
+ nPage++;
+ }
+ // If there are still entries in the listbox,
+ // then objects (with names) or pages were deleted
+ return !xEntry;
+}
+
+IMPL_LINK(SdPageObjsTLV, KeyInputHdl, const KeyEvent&, rKEvt, bool)
+{
+ const vcl::KeyCode& rKeyCode = rKEvt.GetKeyCode();
+ if (m_xAccel->execute(rKeyCode))
+ {
+ // the accelerator consumed the event
+ return true;
+ }
+ if (rKeyCode.GetCode() == KEY_RETURN)
+ {
+ std::unique_ptr<weld::TreeIter> xCursor(m_xTreeView->make_iterator());
+ if (m_xTreeView->get_cursor(xCursor.get()) && m_xTreeView->iter_has_child(*xCursor))
+ {
+ if (m_xTreeView->get_row_expanded(*xCursor))
+ m_xTreeView->collapse_row(*xCursor);
+ else
+ m_xTreeView->expand_row(*xCursor);
+ }
+ m_aRowActivatedHdl.Call(*m_xTreeView);
+ return true;
+ }
+ return m_aKeyPressHdl.Call(rKEvt);
+}
+
+IMPL_LINK(SdPageObjsTLV, MousePressHdl, const MouseEvent&, rMEvt, bool)
+{
+ m_bSelectionHandlerNavigates = rMEvt.GetClicks() == 1;
+ m_bNavigationGrabsFocus = rMEvt.GetClicks() != 1;
+ return false;
+}
+
+IMPL_LINK_NOARG(SdPageObjsTLV, MouseReleaseHdl, const MouseEvent&, bool)
+{
+ m_bSelectionHandlerNavigates = false;
+ m_bNavigationGrabsFocus = true;
+ return false;
+}
+
+IMPL_LINK(SdPageObjsTLV, DragBeginHdl, bool&, rUnsetDragIcon, bool)
+{
+ rUnsetDragIcon = false;
+ return StartDrag();
+}
+
+namespace
+{
+ bool CanDragSource(const weld::TreeView& rTreeView)
+ {
+ std::unique_ptr<weld::TreeIter> xSource(rTreeView.make_iterator());
+ if (!rTreeView.get_selected(xSource.get()))
+ return false;
+
+ std::unique_ptr<weld::TreeIter> xSourceParent(rTreeView.make_iterator(xSource.get()));
+ bool bSourceHasParent = rTreeView.iter_parent(*xSourceParent);
+ // level 1 objects only
+ if (!bSourceHasParent || rTreeView.get_iter_depth(*xSourceParent))
+ return false;
+
+ SdrObject* pSourceObject = weld::fromId<SdrObject*>(rTreeView.get_id(*xSource));
+ if (pSourceObject == reinterpret_cast<SdrObject*>(1))
+ pSourceObject = nullptr;
+
+ if (!pSourceObject)
+ return false;
+
+ SdrPage* pObjectList = pSourceObject->getSdrPageFromSdrObject();
+ if (!pObjectList)
+ return false;
+
+ return true;
+ }
+}
+
+/**
+ * StartDrag-Request
+ */
+bool SdPageObjsTLV::StartDrag()
+{
+ return !CanDragSource(*m_xTreeView) || DoDrag();
+}
+
+/**
+ * Begin drag
+ */
+bool SdPageObjsTLV::DoDrag()
+{
+ if (!m_pNavigator)
+ return true;
+
+ if (!m_xHelper)
+ return true;
+
+ // Get the view.
+ ::sd::DrawDocShell* pDocShell = m_pDoc->GetDocSh();
+ ::sd::ViewShell* pViewShell = GetViewShellForDocShell(*pDocShell);
+ if (pViewShell == nullptr)
+ {
+ OSL_ASSERT(pViewShell!=nullptr);
+ return true;
+ }
+ sd::View* pView = pViewShell->GetView();
+ if (pView == nullptr)
+ {
+ OSL_ASSERT(pView!=nullptr);
+ return true;
+ }
+
+ bIsInDrag = true;
+
+ std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
+ bool bUserData = m_xTreeView->get_cursor(xEntry.get());
+
+ SdrObject* pObject = nullptr;
+ sal_Int64 nUserData = bUserData ? m_xTreeView->get_id(*xEntry).toInt64() : 0;
+ if (nUserData != 1)
+ pObject = reinterpret_cast<SdrObject*>(nUserData);
+ if (pObject != nullptr)
+ {
+ // For shapes without a user supplied name (the automatically
+ // created name does not count), a different drag and drop technique
+ // is used.
+ if (GetObjectName(pObject, false).isEmpty())
+ {
+ AddShapeToTransferable(*m_xHelper, *pObject);
+ m_xHelper->SetView(pView);
+ SD_MOD()->pTransferDrag = m_xHelper.get();
+ }
+
+ // Unnamed shapes have to be selected to be recognized by the
+ // current drop implementation. In order to have a consistent
+ // behaviour for all shapes, every shape that is to be dragged is
+ // selected first.
+ SdrPageView* pPageView = pView->GetSdrPageView();
+ pView->UnmarkAllObj(pPageView);
+ pView->MarkObj(pObject, pPageView);
+ }
+ else
+ {
+ m_xHelper->SetView(pView);
+ SD_MOD()->pTransferDrag = m_xHelper.get();
+ }
+
+ return false;
+}
+
+void SdPageObjsTLV::OnDragFinished()
+{
+ bIsInDrag = false;
+}
+
+SdPageObjsTLVDropTarget::SdPageObjsTLVDropTarget(weld::TreeView& rTreeView)
+ : DropTargetHelper(rTreeView.get_drop_target())
+ , m_rTreeView(rTreeView)
+{
+}
+
+/**
+ * AcceptDrop-Event
+ */
+sal_Int8 SdPageObjsTLVDropTarget::AcceptDrop(const AcceptDropEvent& rEvt)
+{
+ weld::TreeView* pSource = m_rTreeView.get_drag_source();
+ // only dragging within the same widget allowed
+ if (!pSource || pSource != &m_rTreeView)
+ return DND_ACTION_NONE;
+
+ std::unique_ptr<weld::TreeIter> xTarget(m_rTreeView.make_iterator());
+ if (!m_rTreeView.get_dest_row_at_pos(rEvt.maPosPixel, xTarget.get(), true))
+ return DND_ACTION_NONE;
+
+ std::unique_ptr<weld::TreeIter> xSource(m_rTreeView.make_iterator());
+ if (!m_rTreeView.get_selected(xSource.get()))
+ return DND_ACTION_NONE;
+
+ std::unique_ptr<weld::TreeIter> xTargetParent(m_rTreeView.make_iterator(xTarget.get()));
+ while (m_rTreeView.get_iter_depth(*xTargetParent))
+ m_rTreeView.iter_parent(*xTargetParent);
+
+ std::unique_ptr<weld::TreeIter> xSourceParent(m_rTreeView.make_iterator(xSource.get()));
+ while (m_rTreeView.get_iter_depth(*xSourceParent))
+ m_rTreeView.iter_parent(*xSourceParent);
+
+ // can only drop within the same page
+ if (m_rTreeView.iter_compare(*xTargetParent, *xSourceParent) != 0)
+ return DND_ACTION_NONE;
+
+ return DND_ACTION_MOVE;
+}
+
+/**
+ * ExecuteDrop-Event
+ */
+sal_Int8 SdPageObjsTLVDropTarget::ExecuteDrop( const ExecuteDropEvent& rEvt )
+{
+ weld::TreeView* pSource = m_rTreeView.get_drag_source();
+ // only dragging within the same widget allowed
+ if (!pSource || pSource != &m_rTreeView)
+ return DND_ACTION_NONE;
+
+ std::unique_ptr<weld::TreeIter> xSource(m_rTreeView.make_iterator());
+ if (!m_rTreeView.get_selected(xSource.get()))
+ return DND_ACTION_NONE;
+
+ std::unique_ptr<weld::TreeIter> xTarget(m_rTreeView.make_iterator());
+ if (!m_rTreeView.get_dest_row_at_pos(rEvt.maPosPixel, xTarget.get(), true))
+ return DND_ACTION_NONE;
+ int nTargetPos = m_rTreeView.get_iter_index_in_parent(*xTarget) + 1;
+
+ SdrObject* pTargetObject = weld::fromId<SdrObject*>(m_rTreeView.get_id(*xTarget));
+ SdrObject* pSourceObject = weld::fromId<SdrObject*>(m_rTreeView.get_id(*xSource));
+ if (pSourceObject == reinterpret_cast<SdrObject*>(1))
+ pSourceObject = nullptr;
+
+ if (pTargetObject != nullptr && pSourceObject != nullptr)
+ {
+ SdrPage* pObjectList = pSourceObject->getSdrPageFromSdrObject();
+ if (pObjectList != nullptr)
+ {
+ sal_uInt32 nNewPosition;
+ if (pTargetObject == reinterpret_cast<SdrObject*>(1))
+ {
+ nNewPosition = 0;
+ nTargetPos = 0;
+ }
+ else
+ nNewPosition = pTargetObject->GetNavigationPosition() + 1;
+ pObjectList->SetObjectNavigationPosition(*pSourceObject, nNewPosition);
+ }
+
+ std::unique_ptr<weld::TreeIter> xSourceParent(m_rTreeView.make_iterator(xSource.get()));
+ m_rTreeView.iter_parent(*xSourceParent);
+
+ m_rTreeView.move_subtree(*xSource, xSourceParent.get(), nTargetPos);
+ }
+
+ return DND_ACTION_NONE;
+}
+
+void SdPageObjsTLV::AddShapeToTransferable (
+ SdTransferable& rTransferable,
+ const SdrObject& rObject) const
+{
+ std::unique_ptr<TransferableObjectDescriptor> pObjectDescriptor(new TransferableObjectDescriptor);
+ bool bIsDescriptorFillingPending (true);
+
+ const SdrOle2Obj* pOleObject = dynamic_cast<const SdrOle2Obj*>(&rObject);
+ if (pOleObject != nullptr && pOleObject->GetObjRef().is())
+ {
+ // If object has no persistence it must be copied as part of the document
+ try
+ {
+ uno::Reference< embed::XEmbedPersist > xPersObj (pOleObject->GetObjRef(), uno::UNO_QUERY );
+ if (xPersObj.is() && xPersObj->hasEntry())
+ {
+ SvEmbedTransferHelper::FillTransferableObjectDescriptor(
+ *pObjectDescriptor,
+ pOleObject->GetObjRef(),
+ pOleObject->GetGraphic(),
+ pOleObject->GetAspect());
+ bIsDescriptorFillingPending = false;
+ }
+ }
+ catch( uno::Exception& )
+ {
+ }
+ }
+
+ ::sd::DrawDocShell* pDocShell = m_pDoc->GetDocSh();
+ if (bIsDescriptorFillingPending && pDocShell!=nullptr)
+ {
+ pDocShell->FillTransferableObjectDescriptor(*pObjectDescriptor);
+ }
+
+ Point aDragPos (rObject.GetCurrentBoundRect().Center());
+ pObjectDescriptor->maDragStartPos = aDragPos;
+ if (pDocShell != nullptr)
+ pObjectDescriptor->maDisplayName = pDocShell->GetMedium()->GetURLObject().GetURLNoPass();
+ else
+ pObjectDescriptor->maDisplayName.clear();
+
+ rTransferable.SetStartPos(aDragPos);
+ rTransferable.SetObjectDescriptor( std::move(pObjectDescriptor) );
+}
+
+::sd::ViewShell* SdPageObjsTLV::GetViewShellForDocShell (::sd::DrawDocShell& rDocShell)
+{
+ {
+ ::sd::ViewShell* pViewShell = rDocShell.GetViewShell();
+ if (pViewShell != nullptr)
+ return pViewShell;
+ }
+
+ try
+ {
+ // Get a component enumeration from the desktop and search it for documents.
+ uno::Reference<uno::XComponentContext> xContext( ::comphelper::getProcessComponentContext());
+
+ uno::Reference<frame::XDesktop2> xDesktop = frame::Desktop::create(xContext);
+
+ if ( ! xDesktop.is())
+ return nullptr;
+
+ uno::Reference<container::XIndexAccess> xFrameAccess = xDesktop->getFrames();
+ if ( ! xFrameAccess.is())
+ return nullptr;
+
+ for (sal_Int32 nIndex=0,nCount=xFrameAccess->getCount(); nIndex<nCount; ++nIndex)
+ {
+ uno::Reference<frame::XFrame> xFrame;
+ if ( ! (xFrameAccess->getByIndex(nIndex) >>= xFrame))
+ continue;
+
+ auto xController = xFrame->getController();
+ ::sd::DrawController* pController = dynamic_cast<sd::DrawController*>(xController.get());
+ if (pController == nullptr)
+ continue;
+ ::sd::ViewShellBase* pBase = pController->GetViewShellBase();
+ if (pBase == nullptr)
+ continue;
+ if (pBase->GetDocShell() != &rDocShell)
+ continue;
+
+ const std::shared_ptr<sd::ViewShell> pViewShell (pBase->GetMainViewShell());
+ if (pViewShell)
+ return pViewShell.get();
+ }
+ }
+ catch (uno::Exception &)
+ {
+ // When there is an exception then simply use the default value of
+ // bIsEnabled and disable the controls.
+ }
+ return nullptr;
+}
+
+SdPageObjsTLV::SdPageObjsTLV(std::unique_ptr<weld::TreeView> xTreeView)
+ : m_xTreeView(std::move(xTreeView))
+ , m_xScratchIter(m_xTreeView->make_iterator())
+ , m_xDropTargetHelper(new SdPageObjsTLVDropTarget(*m_xTreeView))
+ , m_xAccel(::svt::AcceleratorExecute::createAcceleratorHelper())
+ , m_pNavigator(nullptr)
+ , m_pDoc(nullptr)
+ , m_pBookmarkDoc(nullptr)
+ , m_pMedium(nullptr)
+ , m_pOwnMedium(nullptr)
+ , m_bLinkableSelected(false)
+ , m_bShowAllShapes(false)
+ , m_bShowAllPages(false)
+ , m_bSelectionHandlerNavigates(false)
+ , m_bNavigationGrabsFocus(true)
+ , m_eSelectionMode(SelectionMode::Single)
+ , m_nSelectEventId(nullptr)
+ , m_nRowActivateEventId(nullptr)
+{
+ m_xTreeView->connect_expanding(LINK(this, SdPageObjsTLV, RequestingChildrenHdl));
+ m_xTreeView->connect_changed(LINK(this, SdPageObjsTLV, SelectHdl));
+ m_xTreeView->connect_row_activated(LINK(this, SdPageObjsTLV, RowActivatedHdl));
+ m_xTreeView->connect_drag_begin(LINK(this, SdPageObjsTLV, DragBeginHdl));
+ m_xTreeView->connect_key_press(LINK(this, SdPageObjsTLV, KeyInputHdl));
+ m_xTreeView->connect_mouse_press(LINK(this, SdPageObjsTLV, MousePressHdl));
+ m_xTreeView->connect_mouse_release(LINK(this, SdPageObjsTLV, MouseReleaseHdl));
+
+ m_xTreeView->set_size_request(m_xTreeView->get_approximate_digit_width() * 28,
+ m_xTreeView->get_text_height() * 8);
+}
+
+IMPL_LINK_NOARG(SdPageObjsTLV, SelectHdl, weld::TreeView&, void)
+{
+ if (m_nSelectEventId)
+ Application::RemoveUserEvent(m_nSelectEventId);
+ // post the event to process select event after mouse press event
+ m_nSelectEventId = Application::PostUserEvent(LINK(this, SdPageObjsTLV, AsyncSelectHdl));
+}
+
+IMPL_LINK_NOARG(SdPageObjsTLV, RowActivatedHdl, weld::TreeView&, bool)
+{
+ if (m_nRowActivateEventId)
+ Application::RemoveUserEvent(m_nRowActivateEventId);
+ // post the event to process row activate after mouse press event
+ m_nRowActivateEventId = Application::PostUserEvent(LINK(this, SdPageObjsTLV, AsyncRowActivatedHdl));
+ return true;
+}
+
+IMPL_LINK_NOARG(SdPageObjsTLV, AsyncSelectHdl, void*, void)
+{
+ Select();
+}
+
+void SdPageObjsTLV::Select()
+{
+ m_nSelectEventId = nullptr;
+
+ m_bLinkableSelected = true;
+
+ m_xTreeView->selected_foreach([this](weld::TreeIter& rEntry){
+ if (m_xTreeView->get_id(rEntry).toInt64() == 0)
+ m_bLinkableSelected = false;
+ return false;
+ });
+
+ m_aChangeHdl.Call(*m_xTreeView);
+
+ if (m_bSelectionHandlerNavigates)
+ {
+ // Page items in the tree are given user data value 1.
+ // Drawing object items are given user data value of the object pointer they represent.
+ sal_Int64 nUserData = m_xTreeView->get_selected_id().toInt64();
+ if (nUserData != 1)
+ {
+ SdrObject* pObject = reinterpret_cast<SdrObject*>(nUserData);
+ if (pObject && pObject->GetName().isEmpty())
+ {
+ const bool bUndo = pObject->getSdrModelFromSdrObject().IsUndoEnabled();
+ pObject->getSdrModelFromSdrObject().EnableUndo(false);
+ pObject->SetName(m_xTreeView->get_selected_text(), false);
+ pObject->getSdrModelFromSdrObject().EnableUndo(bUndo);
+ m_aRowActivatedHdl.Call(*m_xTreeView);
+ pObject->getSdrModelFromSdrObject().EnableUndo(false);
+ pObject->SetName(OUString(), false);
+ pObject->getSdrModelFromSdrObject().EnableUndo(bUndo);
+ }
+ else
+ m_aRowActivatedHdl.Call(*m_xTreeView);
+ }
+ else
+ m_aRowActivatedHdl.Call(*m_xTreeView);
+ }
+
+ if (!m_pNavigator)
+ {
+ m_xHelper.clear();
+ return;
+ }
+
+ ::sd::DrawDocShell* pDocShell = m_pDoc->GetDocSh();
+ OUString aURL = INetURLObject(pDocShell->GetMedium()->GetPhysicalName(), INetProtocol::File).GetMainURL(INetURLObject::DecodeMechanism::NONE);
+ NavigatorDragType eDragType = m_pNavigator->GetNavigatorDragType();
+
+ OUString sSelectedEntry = m_xTreeView->get_selected_text();
+ aURL += "#" + sSelectedEntry;
+
+ INetBookmark aBookmark(aURL, sSelectedEntry);
+ sal_Int8 nDNDActions = DND_ACTION_COPYMOVE;
+
+ if( eDragType == NAVIGATOR_DRAGTYPE_LINK )
+ nDNDActions = DND_ACTION_LINK; // Either COPY *or* LINK, never both!
+ else if (m_pDoc->GetSdPageCount(PageKind::Standard) == 1)
+ {
+ // Can not move away the last slide in a document.
+ nDNDActions = DND_ACTION_COPY;
+ }
+
+ // object is destroyed by internal reference mechanism
+ m_xHelper.set(new SdPageObjsTLV::SdPageObjsTransferable(aBookmark, *pDocShell, eDragType));
+ rtl::Reference<TransferDataContainer> xHelper(m_xHelper);
+ m_xTreeView->enable_drag_source(xHelper, nDNDActions);
+}
+
+IMPL_LINK_NOARG(SdPageObjsTLV, AsyncRowActivatedHdl, void*, void)
+{
+ m_nRowActivateEventId = nullptr;
+ m_aRowActivatedHdl.Call(*m_xTreeView);
+}
+
+OUString SdPageObjsTLV::GetObjectName(
+ const SdrObject* pObject,
+ const bool bCreate) const
+{
+ OUString aRet;
+
+ if ( pObject )
+ {
+ aRet = pObject->GetName();
+
+ if (aRet.isEmpty())
+ if (auto pOleObj = dynamic_cast<const SdrOle2Obj* >(pObject))
+ aRet = pOleObj->GetPersistName();
+ }
+
+ if (bCreate
+ && m_bShowAllShapes
+ && aRet.isEmpty()
+ && pObject!=nullptr)
+ {
+ aRet = SdResId(STR_NAVIGATOR_SHAPE_BASE_NAME) + " (" + pObject->TakeObjNameSingul() +")";
+ aRet = aRet.replaceFirst("%1", OUString::number(pObject->GetOrdNum() + 1));
+ }
+
+ return aRet;
+}
+
+std::vector<OUString> SdPageObjsTLV::GetSelectEntryList(const int nDepth) const
+{
+ std::vector<OUString> aEntries;
+
+ m_xTreeView->selected_foreach([this, nDepth, &aEntries](weld::TreeIter& rEntry){
+ int nListDepth = m_xTreeView->get_iter_depth(rEntry);
+ if (nListDepth == nDepth)
+ aEntries.push_back(m_xTreeView->get_text(rEntry));
+ return false;
+ });
+
+ return aEntries;
+}
+
+/**
+ * Checks if it is a draw file and opens the BookmarkDoc depending of
+ * the provided Docs
+ */
+SdDrawDocument* SdPageObjsTLV::GetBookmarkDoc(SfxMedium* pMed)
+{
+ if (
+ !m_pBookmarkDoc ||
+ (pMed && (!m_pOwnMedium || m_pOwnMedium->GetName() != pMed->GetName()))
+ )
+ {
+ // create a new BookmarkDoc if now one exists or if a new Medium is provided
+ if (m_pOwnMedium != pMed)
+ {
+ CloseBookmarkDoc();
+ }
+
+ if (pMed)
+ {
+ // it looks that it is undefined if a Medium was set by Fill() already
+ DBG_ASSERT( !m_pMedium, "SfxMedium confusion!" );
+ delete m_pMedium;
+ m_pMedium = nullptr;
+
+ // take over this Medium (currently used only be Navigator)
+ m_pOwnMedium = pMed;
+ }
+
+ DBG_ASSERT( m_pMedium || pMed, "No SfxMedium provided!" );
+
+ if( pMed )
+ {
+ // in this mode the document is also owned and controlled by this instance
+ m_xBookmarkDocShRef = new ::sd::DrawDocShell(SfxObjectCreateMode::STANDARD, true, DocumentType::Impress);
+ if (m_xBookmarkDocShRef->DoLoad(pMed))
+ m_pBookmarkDoc = m_xBookmarkDocShRef->GetDoc();
+ else
+ m_pBookmarkDoc = nullptr;
+ }
+ else if ( m_pMedium )
+ // in this mode the document is owned and controlled by the SdDrawDocument
+ // it can be released by calling the corresponding CloseBookmarkDoc method
+ // successful creation of a document makes this the owner of the medium
+ m_pBookmarkDoc = const_cast<SdDrawDocument*>(m_pDoc)->OpenBookmarkDoc(m_pMedium);
+
+ if ( !m_pBookmarkDoc )
+ {
+ std::unique_ptr<weld::MessageDialog> xErrorBox(Application::CreateMessageDialog(m_xTreeView.get(),
+ VclMessageType::Warning, VclButtonsType::Ok, SdResId(STR_READ_DATA_ERROR)));
+ xErrorBox->run();
+ m_pMedium = nullptr; //On failure the SfxMedium is invalid
+ }
+ }
+
+ return m_pBookmarkDoc;
+}
+
+/**
+ * Entries are inserted only by request (double click)
+ */
+IMPL_LINK(SdPageObjsTLV, RequestingChildrenHdl, const weld::TreeIter&, rFileEntry, bool)
+{
+ if (!m_xTreeView->iter_has_child(rFileEntry))
+ {
+ if (GetBookmarkDoc())
+ {
+ SdrObject* pObj = nullptr;
+
+ OUString sImgPage(BMP_PAGE);
+ OUString sImgPageObjs(BMP_PAGEOBJS);
+ OUString sImgObjects(BMP_OBJECTS);
+ OUString sImgOle(BMP_OLE);
+ OUString sImgGraphic(BMP_GRAPHIC);
+
+ // document name already inserted
+
+ // only insert all "normal" ? slides with objects
+ sal_uInt16 nPage = 0;
+ const sal_uInt16 nMaxPages = m_pBookmarkDoc->GetPageCount();
+
+ std::unique_ptr<weld::TreeIter> xPageEntry;
+ while (nPage < nMaxPages)
+ {
+ SdPage* pPage = static_cast<SdPage*>(m_pBookmarkDoc->GetPage(nPage));
+ if (pPage->GetPageKind() == PageKind::Standard)
+ {
+ OUString sId(OUString::number(1));
+ m_xTreeView->insert(&rFileEntry, -1, &pPage->GetName(), &sId,
+ nullptr, nullptr, false, m_xScratchIter.get());
+ m_xTreeView->set_image(*m_xScratchIter, sImgPage);
+
+ if (!xPageEntry)
+ {
+ xPageEntry = m_xTreeView->make_iterator(&rFileEntry);
+ (void)m_xTreeView->iter_children(*xPageEntry);
+ }
+ else
+ (void)m_xTreeView->iter_next_sibling(*xPageEntry);
+
+ SdrObjListIter aIter( pPage, SdrIterMode::DeepWithGroups );
+
+ while( aIter.IsMore() )
+ {
+ pObj = aIter.Next();
+ OUString aStr( GetObjectName( pObj ) );
+ if( !aStr.isEmpty() )
+ {
+ if( pObj->GetObjInventor() == SdrInventor::Default && pObj->GetObjIdentifier() == SdrObjKind::OLE2 )
+ {
+ m_xTreeView->insert(xPageEntry.get(), -1, &aStr, nullptr,
+ nullptr, nullptr, false, m_xScratchIter.get());
+ m_xTreeView->set_image(*m_xScratchIter, sImgOle);
+ }
+ else if( pObj->GetObjInventor() == SdrInventor::Default && pObj->GetObjIdentifier() == SdrObjKind::Graphic )
+ {
+ m_xTreeView->insert(xPageEntry.get(), -1, &aStr, nullptr,
+ nullptr, nullptr, false, m_xScratchIter.get());
+ m_xTreeView->set_image(*m_xScratchIter, sImgGraphic);
+ }
+ else
+ {
+ m_xTreeView->insert(xPageEntry.get(), -1, &aStr, nullptr,
+ nullptr, nullptr, false, m_xScratchIter.get());
+ m_xTreeView->set_image(*m_xScratchIter, sImgObjects);
+ }
+ }
+ }
+ if (m_xTreeView->iter_has_child(*xPageEntry))
+ {
+ m_xTreeView->set_image(*xPageEntry, sImgPageObjs);
+ }
+ }
+ nPage++;
+ }
+ }
+ }
+ return true;
+}
+
+void SdPageObjsTLV::SetSdNavigator(SdNavigatorWin* pNavigator)
+{
+ m_pNavigator = pNavigator;
+}
+
+void SdPageObjsTLV::SetViewFrame(const SfxViewFrame* pViewFrame)
+{
+ sd::ViewShellBase* pBase = sd::ViewShellBase::GetViewShellBase(pViewFrame);
+ std::shared_ptr<sd::ViewShell> xViewShell = pBase->GetMainViewShell();
+ SAL_WARN_IF(!xViewShell, "sd", "null pBaseViewFrame");
+ const css::uno::Reference< css::frame::XFrame > xFrame = xViewShell ? xViewShell->GetViewFrame()->GetFrame().GetFrameInterface() : nullptr;
+ m_xAccel->init(::comphelper::getProcessComponentContext(), xFrame);
+}
+
+/**
+ * Close and delete bookmark document
+ */
+void SdPageObjsTLV::CloseBookmarkDoc()
+{
+ if (m_xBookmarkDocShRef.is())
+ {
+ m_xBookmarkDocShRef->DoClose();
+ m_xBookmarkDocShRef.clear();
+
+ // Medium is owned by document, so it's destroyed already
+ m_pOwnMedium = nullptr;
+ }
+ else if (m_pBookmarkDoc)
+ {
+ DBG_ASSERT(!m_pOwnMedium, "SfxMedium confusion!");
+ if (m_pDoc)
+ {
+ // The document owns the Medium, so the Medium will be invalid after closing the document
+ const_cast<SdDrawDocument*>(m_pDoc)->CloseBookmarkDoc();
+ m_pMedium = nullptr;
+ }
+ }
+ else
+ {
+ // perhaps mpOwnMedium provided, but no successful creation of BookmarkDoc
+ delete m_pOwnMedium;
+ m_pOwnMedium = nullptr;
+ }
+
+ m_pBookmarkDoc = nullptr;
+}
+
+bool SdPageObjsTLV::PageBelongsToCurrentShow(const SdPage* pPage) const
+{
+ // Return <TRUE/> as default when there is no custom show or when none
+ // is used. The page does then belong to the standard show.
+ bool bBelongsToShow = true;
+
+ if (m_pDoc->getPresentationSettings().mbCustomShow)
+ {
+ // Get the current custom show.
+ SdCustomShow* pCustomShow = nullptr;
+ SdCustomShowList* pShowList = const_cast<SdDrawDocument*>(m_pDoc)->GetCustomShowList();
+ if (pShowList != nullptr)
+ {
+ sal_uLong nCurrentShowIndex = pShowList->GetCurPos();
+ pCustomShow = (*pShowList)[nCurrentShowIndex].get();
+ }
+
+ // Check whether the given page is part of that custom show.
+ if (pCustomShow != nullptr)
+ {
+ bBelongsToShow = false;
+ size_t nPageCount = pCustomShow->PagesVector().size();
+ for (size_t i=0; i<nPageCount && !bBelongsToShow; i++)
+ if (pPage == pCustomShow->PagesVector()[i])
+ bBelongsToShow = true;
+ }
+ }
+
+ return bBelongsToShow;
+}
+
+void SdPageObjsTLV::AddShapeList (
+ const SdrObjList& rList,
+ const SdrObject* pShape,
+ const OUString& rsName,
+ const bool bIsExcluded,
+ const weld::TreeIter* pParentEntry)
+{
+ OUString aIcon(BMP_PAGE);
+ if (bIsExcluded)
+ aIcon = BMP_PAGE_EXCLUDED;
+ else if (pShape != nullptr)
+ aIcon = BMP_GROUP;
+
+ OUString aUserData("1");
+ if (pShape != nullptr)
+ aUserData = weld::toId(pShape);
+
+ std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
+ InsertEntry(pParentEntry, aUserData, rsName, aIcon, xEntry.get());
+
+ SdrObjListIter aIter(
+ &rList,
+ !rList.HasObjectNavigationOrder() /* use navigation order, if available */,
+ SdrIterMode::Flat);
+
+ while( aIter.IsMore() )
+ {
+ SdrObject* pObj = aIter.Next();
+ OSL_ASSERT(pObj!=nullptr);
+
+ // Get the shape name.
+ OUString aStr (GetObjectName( pObj ) );
+ OUString sId(weld::toId(pObj));
+
+ if( !aStr.isEmpty() )
+ {
+ if( pObj->GetObjInventor() == SdrInventor::Default && pObj->GetObjIdentifier() == SdrObjKind::OLE2 )
+ {
+ InsertEntry(xEntry.get(), sId, aStr, BMP_OLE);
+ }
+ else if( pObj->GetObjInventor() == SdrInventor::Default && pObj->GetObjIdentifier() == SdrObjKind::Graphic )
+ {
+ InsertEntry(xEntry.get(), sId, aStr, BMP_GRAPHIC);
+ }
+ else if (pObj->IsGroupObject())
+ {
+ AddShapeList(
+ *pObj->GetSubList(),
+ pObj,
+ aStr,
+ false,
+ xEntry.get());
+ }
+ else
+ {
+ InsertEntry(xEntry.get(), sId, aStr, BMP_OBJECTS);
+ }
+ }
+ }
+
+ if (!m_xTreeView->iter_has_child(*xEntry))
+ return;
+
+ if (bIsExcluded)
+ m_xTreeView->set_image(*xEntry, BMP_PAGEOBJS_EXCLUDED);
+ else
+ m_xTreeView->set_image(*xEntry, BMP_PAGEOBJS);
+ m_xTreeView->expand_row(*xEntry);
+}
+
+/**
+ * Fill TreeLB with pages and objects
+ */
+void SdPageObjsTLV::Fill(const SdDrawDocument* pInDoc, bool bAllPages, const OUString& rDocName)
+{
+ OUString aSelection = m_xTreeView->get_selected_text();
+ clear();
+
+ m_pDoc = pInDoc;
+ m_aDocName = rDocName;
+ m_bShowAllPages = bAllPages;
+ m_pMedium = nullptr;
+
+ // first insert all pages including objects
+ sal_uInt16 nPage = 0;
+ const sal_uInt16 nMaxPages = m_pDoc->GetPageCount();
+
+ while( nPage < nMaxPages )
+ {
+ const SdPage* pPage = static_cast<const SdPage*>( m_pDoc->GetPage( nPage ) );
+ if( (m_bShowAllPages || pPage->GetPageKind() == PageKind::Standard)
+ && (pPage->GetPageKind() != PageKind::Handout) ) //#94954# never list the normal handout page ( handout-masterpage is used instead )
+ {
+ bool bPageExcluded = pPage->IsExcluded();
+
+ bool bPageBelongsToShow = PageBelongsToCurrentShow (pPage);
+ bPageExcluded |= !bPageBelongsToShow;
+
+ AddShapeList(*pPage, nullptr, pPage->GetName(), bPageExcluded, nullptr);
+ }
+ nPage++;
+ }
+
+ // then insert all master pages including objects
+ if( m_bShowAllPages )
+ {
+ nPage = 0;
+ const sal_uInt16 nMaxMasterPages = m_pDoc->GetMasterPageCount();
+
+ while( nPage < nMaxMasterPages )
+ {
+ const SdPage* pPage = static_cast<const SdPage*>( m_pDoc->GetMasterPage( nPage ) );
+ AddShapeList(*pPage, nullptr, pPage->GetName(), false, nullptr);
+ nPage++;
+ }
+ }
+ if (!aSelection.isEmpty())
+ {
+ m_xTreeView->all_foreach([this, &aSelection](weld::TreeIter& rEntry){
+ if (m_xTreeView->get_text(rEntry) == aSelection)
+ {
+ m_xTreeView->select(rEntry);
+ return true;
+ }
+ return false;
+ });
+ }
+}
+
+/**
+ * We insert only the first entry. Children are created on demand.
+ */
+void SdPageObjsTLV::Fill( const SdDrawDocument* pInDoc, SfxMedium* pInMedium,
+ const OUString& rDocName )
+{
+ m_pDoc = pInDoc;
+
+ // this object now owns the Medium
+ m_pMedium = pInMedium;
+ m_aDocName = rDocName;
+
+ OUString sId(OUString::number(1));
+ // insert document name
+ m_xTreeView->insert(nullptr, -1, &m_aDocName, &sId, nullptr, nullptr, true, m_xScratchIter.get());
+ m_xTreeView->set_image(*m_xScratchIter, BMP_DOC_OPEN);
+}
+
+/**
+ * select an entry in TreeLB
+ */
+bool SdPageObjsTLV::SelectEntry( std::u16string_view rName )
+{
+ bool bFound = false;
+
+ if (!rName.empty())
+ {
+ std::unique_ptr<weld::TreeIter> xEntry(m_xTreeView->make_iterator());
+ OUString aTmp;
+
+ if (m_xTreeView->get_iter_first(*xEntry))
+ {
+ do
+ {
+ aTmp = m_xTreeView->get_text(*xEntry);
+ if (aTmp == rName)
+ {
+ m_xTreeView->set_cursor(*xEntry);
+ m_xTreeView->select(*xEntry);
+ bFound = true;
+ break;
+ }
+ }
+ while (m_xTreeView->iter_next(*xEntry));
+ }
+ }
+
+ return bFound;
+}
+
+SdPageObjsTLV::~SdPageObjsTLV()
+{
+ if (m_nSelectEventId)
+ Application::RemoveUserEvent(m_nSelectEventId);
+ if (m_nRowActivateEventId)
+ Application::RemoveUserEvent(m_nRowActivateEventId);
+
+ if (m_pBookmarkDoc)
+ CloseBookmarkDoc();
+ else
+ {
+ // no document was created from m_pMedium, so this object is still the owner of it
+ delete m_pMedium;
+ }
+ m_xAccel.reset();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/sduiexp.cxx b/sd/source/ui/dlg/sduiexp.cxx
new file mode 100644
index 000000000..62901c70d
--- /dev/null
+++ b/sd/source/ui/dlg/sduiexp.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/.
+ *
+ * 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 "sddlgfact.hxx"
+#include <sal/types.h>
+
+class SdAbstractDialogFactory;
+
+extern "C" {
+SAL_DLLPUBLIC_EXPORT SdAbstractDialogFactory* SdCreateDialogFactory()
+{
+ static SdAbstractDialogFactory_Impl aFactory;
+ return &aFactory;
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/tabtempl.cxx b/sd/source/ui/dlg/tabtempl.cxx
new file mode 100644
index 000000000..e5db39e68
--- /dev/null
+++ b/sd/source/ui/dlg/tabtempl.cxx
@@ -0,0 +1,160 @@
+/* -*- 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 <editeng/flstitem.hxx>
+
+#include <svx/svxids.hrc>
+
+#include <svx/drawitem.hxx>
+#include <svl/intitem.hxx>
+#include <svx/ofaitem.hxx>
+#include <svx/svdmodel.hxx>
+#include <svl/cjkoptions.hxx>
+#include <sfx2/objsh.hxx>
+#include <svx/dialogs.hrc>
+#include <svl/style.hxx>
+
+#include <tabtempl.hxx>
+#include <svx/flagsdef.hxx>
+
+/**
+ * Constructor of the Tab dialog: appends pages to the dialog
+ */
+SdTabTemplateDlg::SdTabTemplateDlg(weld::Window* pParent,
+ const SfxObjectShell* pDocShell,
+ SfxStyleSheetBase& rStyleBase,
+ SdrModel const * pModel,
+ SdrView* pView)
+ : SfxStyleDialogController(pParent, "modules/simpress/ui/templatedialog.ui",
+ "TemplateDialog", rStyleBase)
+ , rDocShell(*pDocShell)
+ , pSdrView(pView)
+ , pColorList(pModel->GetColorList())
+ , pGradientList(pModel->GetGradientList())
+ , pHatchingList(pModel->GetHatchList())
+ , pBitmapList(pModel->GetBitmapList())
+ , pPatternList(pModel->GetPatternList())
+ , pDashList(pModel->GetDashList())
+ , pLineEndList(pModel->GetLineEndList())
+{
+ // fill Listbox and set Select-Handler
+
+ AddTabPage("line", RID_SVXPAGE_LINE);
+ AddTabPage("area", RID_SVXPAGE_AREA);
+ AddTabPage("shadowing", RID_SVXPAGE_SHADOW);
+ AddTabPage("transparency", RID_SVXPAGE_TRANSPARENCE);
+ AddTabPage("font", RID_SVXPAGE_CHAR_NAME);
+ AddTabPage("fonteffect", RID_SVXPAGE_CHAR_EFFECTS);
+ AddTabPage("background", RID_SVXPAGE_BKG);
+ AddTabPage("indents", RID_SVXPAGE_STD_PARAGRAPH);
+ AddTabPage("text", RID_SVXPAGE_TEXTATTR);
+ AddTabPage("animation", RID_SVXPAGE_TEXTANIMATION);
+ AddTabPage("dimensioning", RID_SVXPAGE_MEASURE);
+ AddTabPage("connector", RID_SVXPAGE_CONNECTION);
+ AddTabPage("alignment", RID_SVXPAGE_ALIGN_PARAGRAPH);
+ AddTabPage("tabs", RID_SVXPAGE_TABULATOR);
+ if( SvtCJKOptions::IsAsianTypographyEnabled() )
+ AddTabPage("asiantypo", RID_SVXPAGE_PARA_ASIAN);
+ else
+ RemoveTabPage("asiantypo");
+}
+
+void SdTabTemplateDlg::PageCreated(const OString& rId, SfxTabPage &rPage)
+{
+ SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool()));
+ if (rId == "line")
+ {
+ aSet.Put (SvxColorListItem(pColorList,SID_COLOR_TABLE));
+ aSet.Put (SvxDashListItem(pDashList,SID_DASH_LIST));
+ aSet.Put (SvxLineEndListItem(pLineEndList,SID_LINEEND_LIST));
+ aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "area")
+ {
+ aSet.Put (SvxColorListItem(pColorList,SID_COLOR_TABLE));
+ aSet.Put (SvxGradientListItem(pGradientList,SID_GRADIENT_LIST));
+ aSet.Put (SvxHatchListItem(pHatchingList,SID_HATCH_LIST));
+ aSet.Put (SvxBitmapListItem(pBitmapList,SID_BITMAP_LIST));
+ aSet.Put (SfxUInt16Item(SID_PAGE_TYPE,0));
+ aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1));
+ aSet.Put (SfxUInt16Item(SID_TABPAGE_POS,0));
+ aSet.Put (SvxPatternListItem(pPatternList,SID_PATTERN_LIST));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "shadowing")
+ {
+ aSet.Put (SvxColorListItem(pColorList,SID_COLOR_TABLE));
+ aSet.Put (SfxUInt16Item(SID_PAGE_TYPE,0));
+ aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "transparency")
+ {
+ aSet.Put (SfxUInt16Item(SID_PAGE_TYPE,0));
+ aSet.Put (SfxUInt16Item(SID_DLG_TYPE,1));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "font")
+ {
+ SvxFontListItem aItem(*static_cast<const SvxFontListItem*>(
+ rDocShell.GetItem( SID_ATTR_CHAR_FONTLIST) ) );
+
+ aSet.Put (SvxFontListItem( aItem.GetFontList(), SID_ATTR_CHAR_FONTLIST));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "fonteffect")
+ {
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "background")
+ {
+ aSet.Put(SfxUInt32Item(SID_FLAG_TYPE,static_cast<sal_uInt32>(SvxBackgroundTabFlags::SHOW_CHAR_BKGCOLOR)));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "text")
+ {
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "dimensioning")
+ {
+ aSet.Put (OfaPtrItem(SID_OBJECT_LIST,pSdrView));
+ rPage.PageCreated(aSet);
+ }
+ else if (rId == "connector")
+ {
+ aSet.Put (OfaPtrItem(SID_OBJECT_LIST,pSdrView));
+ rPage.PageCreated(aSet);
+ }
+}
+
+void SdTabTemplateDlg::RefreshInputSet()
+{
+ SfxItemSet* pInputSet = GetInputSetImpl();
+
+ if( pInputSet )
+ {
+ pInputSet->ClearItem();
+ pInputSet->SetParent( GetStyleSheet().GetItemSet().GetParent() );
+ }
+ else
+ SetInputSet(&GetStyleSheet().GetItemSet());
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/titledockwin.cxx b/sd/source/ui/dlg/titledockwin.cxx
new file mode 100644
index 000000000..f2aa744c2
--- /dev/null
+++ b/sd/source/ui/dlg/titledockwin.cxx
@@ -0,0 +1,261 @@
+/* -*- 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 <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svl/eitem.hxx>
+#include <vcl/event.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/toolbox.hxx>
+
+#include <bitmaps.hlst>
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <titledockwin.hxx>
+
+namespace sd
+{
+ //= TitledDockingWindow
+ TitledDockingWindow::TitledDockingWindow( SfxBindings* i_pBindings, SfxChildWindow* i_pChildWindow, vcl::Window* i_pParent )
+ :SfxDockingWindow( i_pBindings, i_pChildWindow, i_pParent, WB_MOVEABLE|WB_CLOSEABLE|WB_DOCKABLE|WB_HIDE|WB_3DLOOK )
+ ,m_aToolbox( VclPtr<ToolBox>::Create(this) )
+ ,m_aContentWindow( VclPtr<vcl::Window>::Create(this, WB_DIALOGCONTROL) )
+ ,m_aBorder( 3, 1, 3, 3 )
+ ,m_nTitleBarHeight(0)
+ {
+ SetBackground( Wallpaper() );
+
+ m_aToolbox->SetSelectHdl( LINK( this, TitledDockingWindow, OnToolboxItemSelected ) );
+ m_aToolbox->SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetDialogColor() ) );
+ m_aToolbox->Show();
+ impl_resetToolBox();
+
+ m_aContentWindow->Show();
+ }
+
+ TitledDockingWindow::~TitledDockingWindow()
+ {
+ disposeOnce();
+ }
+
+ void TitledDockingWindow::dispose()
+ {
+ m_aToolbox.disposeAndClear();
+ m_aContentWindow.disposeAndClear();
+ SfxDockingWindow::dispose();
+ }
+
+ void TitledDockingWindow::SetTitle( const OUString& i_rTitle )
+ {
+ m_sTitle = i_rTitle;
+ Invalidate();
+ }
+
+
+ void TitledDockingWindow::SetText( const OUString& i_rText )
+ {
+ SfxDockingWindow::SetText( i_rText );
+ if ( m_sTitle.isEmpty() )
+ // our text is used as title, too => repaint
+ Invalidate();
+ }
+
+
+ void TitledDockingWindow::Resize()
+ {
+ SfxDockingWindow::Resize();
+ impl_layout();
+ }
+
+
+ void TitledDockingWindow::impl_layout()
+ {
+ m_aToolbox->ShowItem( ToolBoxItemId(1), !IsFloatingMode() );
+
+ const Size aToolBoxSize( m_aToolbox->CalcWindowSizePixel() );
+ Size aWindowSize( GetOutputSizePixel() );
+
+ // position the tool box
+ m_nTitleBarHeight = GetSettings().GetStyleSettings().GetTitleHeight();
+ if ( aToolBoxSize.Height() > m_nTitleBarHeight )
+ m_nTitleBarHeight = aToolBoxSize.Height();
+ m_aToolbox->SetPosSizePixel(
+ Point(
+ aWindowSize.Width() - aToolBoxSize.Width(),
+ ( m_nTitleBarHeight - aToolBoxSize.Height() ) / 2
+ ),
+ aToolBoxSize
+ );
+
+ // Place the content window.
+ if ( m_nTitleBarHeight < aToolBoxSize.Height() )
+ m_nTitleBarHeight = aToolBoxSize.Height();
+ aWindowSize.AdjustHeight( -m_nTitleBarHeight );
+ m_aContentWindow->SetPosSizePixel(
+ Point( m_aBorder.Left(), m_nTitleBarHeight + m_aBorder.Top() ),
+ Size(
+ aWindowSize.Width() - m_aBorder.Left() - m_aBorder.Right(),
+ aWindowSize.Height() - m_aBorder.Top() - m_aBorder.Bottom()
+ )
+ );
+ }
+
+ void TitledDockingWindow::ApplySettings(vcl::RenderContext& rRenderContext)
+ {
+ const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
+
+ // Font
+ ApplyControlFont(rRenderContext, rStyleSettings.GetAppFont());
+
+ // Color
+ ApplyControlForeground(rRenderContext, rStyleSettings.GetButtonTextColor());
+ rRenderContext.SetTextFillColor();
+ }
+
+ void TitledDockingWindow::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& i_rArea)
+ {
+ const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
+
+ SfxDockingWindow::Paint(rRenderContext, i_rArea);
+
+ rRenderContext.Push(vcl::PushFlags::FONT | vcl::PushFlags::FILLCOLOR | vcl::PushFlags::LINECOLOR);
+
+ rRenderContext.SetFillColor(rStyleSettings.GetDialogColor());
+ rRenderContext.SetLineColor();
+
+ // bold font
+ vcl::Font aFont(rRenderContext.GetFont());
+ aFont.SetWeight(WEIGHT_BOLD);
+ rRenderContext.SetFont(aFont);
+
+ // Set border values.
+ Size aWindowSize(GetOutputSizePixel());
+ int nOuterLeft = 0;
+ int nInnerLeft = nOuterLeft + m_aBorder.Left() - 1;
+ int nOuterRight = aWindowSize.Width() - 1;
+ int nInnerRight = nOuterRight - m_aBorder.Right() + 1;
+ int nInnerTop = m_nTitleBarHeight + m_aBorder.Top() - 1;
+ int nOuterBottom = aWindowSize.Height() - 1;
+ int nInnerBottom = nOuterBottom - m_aBorder.Bottom() + 1;
+
+ // Paint title bar background.
+ ::tools::Rectangle aTitleBarBox(::tools::Rectangle(nOuterLeft, 0, nOuterRight, nInnerTop - 1));
+ rRenderContext.DrawRect(aTitleBarBox);
+
+ if (nInnerLeft > nOuterLeft)
+ rRenderContext.DrawRect(::tools::Rectangle(nOuterLeft, nInnerTop, nInnerLeft, nInnerBottom));
+ if (nOuterRight > nInnerRight)
+ rRenderContext.DrawRect(::tools::Rectangle(nInnerRight, nInnerTop, nOuterRight, nInnerBottom));
+ if (nInnerBottom < nOuterBottom)
+ rRenderContext.DrawRect(::tools::Rectangle(nOuterLeft, nInnerBottom, nOuterRight, nOuterBottom));
+
+ // Paint bevel border.
+ rRenderContext.SetFillColor();
+ rRenderContext.SetLineColor(rStyleSettings.GetShadowColor());
+ if (m_aBorder.Top() > 0)
+ rRenderContext.DrawLine(Point(nInnerLeft, nInnerTop), Point(nInnerLeft, nInnerBottom));
+ if (m_aBorder.Left() > 0)
+ rRenderContext.DrawLine(Point(nInnerLeft, nInnerTop), Point(nInnerRight, nInnerTop));
+
+ rRenderContext.SetLineColor(rStyleSettings.GetLightColor());
+ if (m_aBorder.Bottom() > 0)
+ rRenderContext.DrawLine(Point(nInnerRight, nInnerBottom), Point(nInnerLeft, nInnerBottom));
+ if (m_aBorder.Right() > 0)
+ rRenderContext.DrawLine(Point(nInnerRight, nInnerBottom), Point(nInnerRight, nInnerTop));
+
+ // Paint title bar text.
+ rRenderContext.SetLineColor(rStyleSettings.GetActiveTextColor());
+ aTitleBarBox.AdjustLeft(3 );
+ rRenderContext.DrawText(aTitleBarBox,
+ !m_sTitle.isEmpty() ? m_sTitle : GetText(),
+ DrawTextFlags::Left | DrawTextFlags::VCenter | DrawTextFlags::MultiLine | DrawTextFlags::WordBreak);
+
+ // Restore original values of the output device.
+ rRenderContext.Pop();
+ }
+
+
+ void TitledDockingWindow::impl_resetToolBox()
+ {
+ m_aToolbox->Clear();
+
+ // Get the closer bitmap and set it as right most button.
+ m_aToolbox->InsertItem(ToolBoxItemId(1), Image(StockImage::Yes, SFX_BMP_CLOSE_DOC));
+ m_aToolbox->SetQuickHelpText(ToolBoxItemId(1), SdResId(STR_CLOSE_PANE));
+ m_aToolbox->ShowItem( ToolBoxItemId(1) );
+ }
+
+
+ IMPL_LINK( TitledDockingWindow, OnToolboxItemSelected, ToolBox*, pToolBox, void )
+ {
+ const ToolBoxItemId nId = pToolBox->GetCurItemId();
+
+ if ( nId == ToolBoxItemId(1) )
+ {
+ // the closer
+ EndTracking();
+ const sal_uInt16 nChildWindowId( GetChildWindow_Impl()->GetType() );
+ const SfxBoolItem aVisibility( nChildWindowId, false );
+ GetBindings().GetDispatcher()->ExecuteList(
+ nChildWindowId,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aVisibility }
+ );
+ }
+ }
+
+
+ void TitledDockingWindow::StateChanged( StateChangedType i_nType )
+ {
+ switch ( i_nType )
+ {
+ case StateChangedType::InitShow:
+ impl_layout();
+ break;
+ default:;
+ }
+ SfxDockingWindow::StateChanged( i_nType );
+ }
+
+ void TitledDockingWindow::DataChanged( const DataChangedEvent& i_rDataChangedEvent )
+ {
+ SfxDockingWindow::DataChanged( i_rDataChangedEvent );
+
+ switch ( i_rDataChangedEvent.GetType() )
+ {
+ case DataChangedEventType::SETTINGS:
+ if ( !( i_rDataChangedEvent.GetFlags() & AllSettingsFlags::STYLE ) )
+ break;
+ [[fallthrough]];
+ case DataChangedEventType::FONTS:
+ case DataChangedEventType::FONTSUBSTITUTION:
+ {
+ impl_layout();
+ Invalidate();
+ }
+ break;
+ default: break;
+ }
+ }
+
+
+} // namespace sfx2
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/tpaction.cxx b/sd/source/ui/dlg/tpaction.cxx
new file mode 100644
index 000000000..f89fa51f5
--- /dev/null
+++ b/sd/source/ui/dlg/tpaction.cxx
@@ -0,0 +1,801 @@
+/* -*- 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 <svx/svxids.hrc>
+#include <com/sun/star/presentation/ClickAction.hpp>
+#include <com/sun/star/embed/NeedsRunningStateException.hpp>
+#include <com/sun/star/embed/VerbDescriptor.hpp>
+#include <com/sun/star/embed/EmbedStates.hpp>
+#include <com/sun/star/embed/XEmbeddedObject.hpp>
+#include <comphelper/string.hxx>
+#include <com/sun/star/embed/VerbAttributes.hpp>
+#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
+
+#include <sdattr.hrc>
+#include <sfx2/sfxresid.hxx>
+#include <sfx2/strings.hrc>
+#include <o3tl/safeint.hxx>
+#include <tools/debug.hxx>
+#include <sfx2/app.hxx>
+#include <svx/svdograf.hxx>
+#include <svl/stritem.hxx>
+#include <svx/svdoole2.hxx>
+#include <sfx2/docfile.hxx>
+#include <svx/xtable.hxx>
+#include <vcl/mnemonic.hxx>
+#include <svl/intitem.hxx>
+#include <svl/urihelper.hxx>
+#include <sfx2/filedlghelper.hxx>
+#include <svx/drawitem.hxx>
+#include <osl/diagnose.h>
+#include <o3tl/string_view.hxx>
+#include <View.hxx>
+#include <sdresid.hxx>
+#include <tpaction.hxx>
+#include <ViewShell.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <strings.hrc>
+
+#include <filedlg.hxx>
+
+#include <algorithm>
+
+using namespace ::com::sun::star;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+
+#define DOCUMENT_TOKEN '#'
+
+// XML content stream
+constexpr OUStringLiteral pStarDrawXMLContent( u"content.xml" );
+
+/**
+ * Constructor of the Tab dialog: appends the pages to the dialog
+ */
+SdActionDlg::SdActionDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View const * pView)
+ : SfxSingleTabDialogController(pParent, pAttr, "modules/simpress/ui/interactiondialog.ui",
+ "InteractionDialog")
+{
+ std::unique_ptr<SfxTabPage> xNewPage = SdTPAction::Create(get_content_area(), this, *pAttr);
+
+ // formerly in PageCreated
+ static_cast<SdTPAction*>( xNewPage.get() )->SetView( pView );
+ static_cast<SdTPAction*>( xNewPage.get() )->Construct();
+
+ SetTabPage(std::move(xNewPage));
+}
+
+/**
+ * Action-TabPage
+ */
+SdTPAction::SdTPAction(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs)
+ : SfxTabPage(pPage, pController, "modules/simpress/ui/interactionpage.ui", "InteractionPage", &rInAttrs)
+ , mpView(nullptr)
+ , mpDoc(nullptr)
+ , bTreeUpdated(false)
+ , m_xLbAction(m_xBuilder->weld_combo_box("listbox"))
+ , m_xFtTree(m_xBuilder->weld_label("fttree"))
+ , m_xLbTree(new SdPageObjsTLV(m_xBuilder->weld_tree_view("tree")))
+ , m_xLbTreeDocument(new SdPageObjsTLV(m_xBuilder->weld_tree_view("treedoc")))
+ , m_xLbOLEAction(m_xBuilder->weld_tree_view("oleaction"))
+ , m_xFrame(m_xBuilder->weld_frame("frame"))
+ , m_xEdtSound(m_xBuilder->weld_entry("sound"))
+ , m_xEdtBookmark(m_xBuilder->weld_entry("bookmark"))
+ , m_xEdtDocument(m_xBuilder->weld_entry("document"))
+ , m_xEdtProgram(m_xBuilder->weld_entry("program"))
+ , m_xEdtMacro(m_xBuilder->weld_entry("macro"))
+ , m_xBtnSearch(m_xBuilder->weld_button("browse"))
+ , m_xBtnSeek(m_xBuilder->weld_button("find"))
+{
+ m_xLbOLEAction->set_size_request(m_xLbOLEAction->get_approximate_digit_width() * 48,
+ m_xLbOLEAction->get_height_rows(12));
+
+ m_xBtnSearch->connect_clicked( LINK( this, SdTPAction, ClickSearchHdl ) );
+ m_xBtnSeek->connect_clicked( LINK( this, SdTPAction, ClickSearchHdl ) );
+
+ // this page needs ExchangeSupport
+ SetExchangeSupport();
+
+ m_xLbAction->connect_changed( LINK( this, SdTPAction, ClickActionHdl ) );
+ m_xLbTree->connect_changed( LINK( this, SdTPAction, SelectTreeHdl ) );
+ m_xEdtDocument->connect_focus_out( LINK( this, SdTPAction, CheckFileHdl ) );
+ m_xEdtMacro->connect_focus_out( LINK( this, SdTPAction, CheckFileHdl ) );
+
+ //Lock to initial max size
+ Size aSize(m_xContainer->get_preferred_size());
+ m_xContainer->set_size_request(aSize.Width(), aSize.Height());
+
+ ClickActionHdl( *m_xLbAction );
+}
+
+SdTPAction::~SdTPAction()
+{
+}
+
+void SdTPAction::SetView( const ::sd::View* pSdView )
+{
+ mpView = pSdView;
+
+ // get ColorTable and fill ListBox
+ ::sd::DrawDocShell* pDocSh = mpView->GetDocSh();
+ if( pDocSh && pDocSh->GetViewShell() )
+ {
+ mpDoc = pDocSh->GetDoc();
+ SfxViewFrame* pFrame = pDocSh->GetViewShell()->GetViewFrame();
+ m_xLbTree->SetViewFrame( pFrame );
+ m_xLbTreeDocument->SetViewFrame( pFrame );
+
+ pColList = pDocSh->GetItem( SID_COLOR_TABLE )->GetColorList();
+ DBG_ASSERT( pColList.is(), "No color table available!" );
+ }
+ else
+ {
+ OSL_FAIL("sd::SdTPAction::SetView(), no docshell or viewshell?");
+ }
+}
+
+void SdTPAction::Construct()
+{
+ // fill OLE-Actionlistbox
+ SdrOle2Obj* pOleObj = nullptr;
+ SdrGrafObj* pGrafObj = nullptr;
+ bool bOLEAction = false;
+
+ if ( mpView->AreObjectsMarked() )
+ {
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+
+ SdrInventor nInv = pObj->GetObjInventor();
+ SdrObjKind nSdrObjKind = pObj->GetObjIdentifier();
+
+ if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::OLE2)
+ {
+ pOleObj = static_cast<SdrOle2Obj*>(pObj);
+ }
+ else if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::Graphic)
+ {
+ pGrafObj = static_cast<SdrGrafObj*>(pObj);
+ }
+ }
+ }
+ if( pGrafObj )
+ {
+ bOLEAction = true;
+
+ aVerbVector.push_back( 0 );
+ m_xLbOLEAction->append_text( MnemonicGenerator::EraseAllMnemonicChars( SdResId( STR_EDIT_OBJ ) ) );
+ }
+ else if( pOleObj )
+ {
+ const uno::Reference < embed::XEmbeddedObject >& xObj = pOleObj->GetObjRef();
+ if ( xObj.is() )
+ {
+ bOLEAction = true;
+ uno::Sequence < embed::VerbDescriptor > aVerbs;
+ try
+ {
+ aVerbs = xObj->getSupportedVerbs();
+ }
+ catch ( embed::NeedsRunningStateException& )
+ {
+ xObj->changeState( embed::EmbedStates::RUNNING );
+ aVerbs = xObj->getSupportedVerbs();
+ }
+
+ for( const embed::VerbDescriptor& aVerb : std::as_const(aVerbs) )
+ {
+ if( aVerb.VerbAttributes & embed::VerbAttributes::MS_VERBATTR_ONCONTAINERMENU )
+ {
+ OUString aTmp( aVerb.VerbName );
+ aVerbVector.push_back( aVerb.VerbID );
+ m_xLbOLEAction->append_text( MnemonicGenerator::EraseAllMnemonicChars( aTmp ) );
+ }
+ }
+ }
+ }
+
+ maCurrentActions.push_back( presentation::ClickAction_NONE );
+ maCurrentActions.push_back( presentation::ClickAction_PREVPAGE );
+ maCurrentActions.push_back( presentation::ClickAction_NEXTPAGE );
+ maCurrentActions.push_back( presentation::ClickAction_FIRSTPAGE );
+ maCurrentActions.push_back( presentation::ClickAction_LASTPAGE );
+ maCurrentActions.push_back( presentation::ClickAction_BOOKMARK );
+ maCurrentActions.push_back( presentation::ClickAction_DOCUMENT );
+ maCurrentActions.push_back( presentation::ClickAction_SOUND );
+ if( bOLEAction && m_xLbOLEAction->n_children() )
+ maCurrentActions.push_back( presentation::ClickAction_VERB );
+ maCurrentActions.push_back( presentation::ClickAction_PROGRAM );
+ maCurrentActions.push_back( presentation::ClickAction_MACRO );
+ maCurrentActions.push_back( presentation::ClickAction_STOPPRESENTATION );
+
+ // fill Action-Listbox
+ for (const presentation::ClickAction & rAction : maCurrentActions)
+ {
+ TranslateId pRId = GetClickActionSdResId(rAction);
+ m_xLbAction->append_text(SdResId(pRId));
+ }
+
+}
+
+bool SdTPAction::FillItemSet( SfxItemSet* rAttrs )
+{
+ bool bModified = false;
+ presentation::ClickAction eCA = presentation::ClickAction_NONE;
+
+ if (m_xLbAction->get_active() != -1)
+ eCA = GetActualClickAction();
+
+ if( m_xLbAction->get_value_changed_from_saved() )
+ {
+ rAttrs->Put( SfxUInt16Item( ATTR_ACTION, static_cast<sal_uInt16>(eCA) ) );
+ bModified = true;
+ }
+ else
+ rAttrs->InvalidateItem( ATTR_ACTION );
+
+ OUString aFileName = GetEditText( true );
+ if( aFileName.isEmpty() )
+ rAttrs->InvalidateItem( ATTR_ACTION_FILENAME );
+ else
+ {
+ if( mpDoc && mpDoc->GetDocSh() && mpDoc->GetDocSh()->GetMedium() )
+ {
+ OUString aBaseURL = mpDoc->GetDocSh()->GetMedium()->GetBaseURL();
+ if( eCA == presentation::ClickAction_SOUND ||
+ eCA == presentation::ClickAction_DOCUMENT ||
+ eCA == presentation::ClickAction_PROGRAM )
+ aFileName = ::URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), aFileName, URIHelper::GetMaybeFileHdl(), true, false,
+ INetURLObject::EncodeMechanism::WasEncoded,
+ INetURLObject::DecodeMechanism::Unambiguous );
+
+ rAttrs->Put( SfxStringItem( ATTR_ACTION_FILENAME, aFileName ) );
+ bModified = true;
+ }
+ else
+ {
+ OSL_FAIL("sd::SdTPAction::FillItemSet(), I need a medium!");
+ }
+ }
+
+ return bModified;
+}
+
+void SdTPAction::Reset( const SfxItemSet* rAttrs )
+{
+ presentation::ClickAction eCA = presentation::ClickAction_NONE;
+ OUString aFileName;
+
+ // m_xLbAction
+ if( rAttrs->GetItemState( ATTR_ACTION ) != SfxItemState::DONTCARE )
+ {
+ eCA = static_cast<presentation::ClickAction>(static_cast<const SfxUInt16Item&>( rAttrs->
+ Get( ATTR_ACTION ) ).GetValue());
+ SetActualClickAction( eCA );
+ }
+ else
+ m_xLbAction->set_active(-1);
+
+ // m_xEdtSound
+ if( rAttrs->GetItemState( ATTR_ACTION_FILENAME ) != SfxItemState::DONTCARE )
+ {
+ aFileName = static_cast<const SfxStringItem&>( rAttrs->Get( ATTR_ACTION_FILENAME ) ).GetValue();
+ SetEditText( aFileName );
+ }
+
+ switch( eCA )
+ {
+ case presentation::ClickAction_BOOKMARK:
+ {
+ if (!m_xLbTree->SelectEntry(aFileName))
+ m_xLbTree->unselect_all();
+ }
+ break;
+
+ case presentation::ClickAction_DOCUMENT:
+ {
+ if( comphelper::string::getTokenCount(aFileName, DOCUMENT_TOKEN) == 2 )
+ m_xLbTreeDocument->SelectEntry( o3tl::getToken(aFileName, 1, DOCUMENT_TOKEN ) );
+ }
+ break;
+
+ default:
+ break;
+ }
+ ClickActionHdl( *m_xLbAction );
+
+ m_xLbAction->save_value();
+ m_xEdtSound->save_value();
+}
+
+void SdTPAction::ActivatePage( const SfxItemSet& )
+{
+}
+
+DeactivateRC SdTPAction::DeactivatePage( SfxItemSet* pPageSet )
+{
+ if( pPageSet )
+ FillItemSet( pPageSet );
+
+ return DeactivateRC::LeavePage;
+}
+
+std::unique_ptr<SfxTabPage> SdTPAction::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rAttrs)
+{
+ return std::make_unique<SdTPAction>( pPage, pController, rAttrs );
+}
+
+void SdTPAction::UpdateTree()
+{
+ if( !bTreeUpdated && mpDoc && mpDoc->GetDocSh() && mpDoc->GetDocSh()->GetMedium() )
+ {
+ m_xLbTree->Fill( mpDoc, true, mpDoc->GetDocSh()->GetMedium()->GetName() );
+ bTreeUpdated = true;
+ }
+}
+
+void SdTPAction::OpenFileDialog()
+{
+ // Soundpreview only for interaction with sound
+ presentation::ClickAction eCA = GetActualClickAction();
+ bool bSound = ( eCA == presentation::ClickAction_SOUND );
+ bool bPage = ( eCA == presentation::ClickAction_BOOKMARK );
+ bool bDocument = ( eCA == presentation::ClickAction_DOCUMENT ||
+ eCA == presentation::ClickAction_PROGRAM );
+ bool bMacro = ( eCA == presentation::ClickAction_MACRO );
+
+ if( bPage )
+ {
+ // search in the TreeLB for the specified object
+ m_xLbTree->SelectEntry(GetEditText());
+ }
+ else
+ {
+ OUString aFile( GetEditText() );
+
+ if (bSound)
+ {
+ SdOpenSoundFileDialog aFileDialog(GetFrameWeld());
+
+ if( !aFile.isEmpty() )
+ aFileDialog.SetPath( aFile );
+
+ if( aFileDialog.Execute() == ERRCODE_NONE )
+ {
+ aFile = aFileDialog.GetPath();
+ SetEditText( aFile );
+ }
+ }
+ else if (bMacro)
+ {
+ // choose macro dialog
+ OUString aScriptURL = SfxApplication::ChooseScript(GetFrameWeld());
+
+ if ( !aScriptURL.isEmpty() )
+ {
+ SetEditText( aScriptURL );
+ }
+ }
+ else
+ {
+ sfx2::FileDialogHelper aFileDialog(
+ ui::dialogs::TemplateDescription::FILEOPEN_READONLY_VERSION,
+ FileDialogFlags::NONE, GetFrameWeld());
+ aFileDialog.SetContext(sfx2::FileDialogHelper::ImpressClickAction);
+
+ // The following is a workaround for #i4306#:
+ // The addition of the implicitly existing "all files"
+ // filter makes the (Windows system) open file dialog follow
+ // links on the desktop to directories.
+ aFileDialog.AddFilter (
+ SfxResId(STR_SFX_FILTERNAME_ALL),
+ "*.*");
+
+ if( aFileDialog.Execute() == ERRCODE_NONE )
+ {
+ aFile = aFileDialog.GetPath();
+ SetEditText( aFile );
+ }
+ if( bDocument )
+ CheckFileHdl( *m_xEdtDocument );
+ }
+ }
+}
+
+IMPL_LINK_NOARG(SdTPAction, ClickSearchHdl, weld::Button&, void)
+{
+ OpenFileDialog();
+}
+
+IMPL_LINK_NOARG(SdTPAction, ClickActionHdl, weld::ComboBox&, void)
+{
+ presentation::ClickAction eCA = GetActualClickAction();
+
+ // hide controls we don't need
+ switch( eCA )
+ {
+ case presentation::ClickAction_NONE:
+ case presentation::ClickAction_INVISIBLE:
+ case presentation::ClickAction_PREVPAGE:
+ case presentation::ClickAction_NEXTPAGE:
+ case presentation::ClickAction_FIRSTPAGE:
+ case presentation::ClickAction_LASTPAGE:
+ case presentation::ClickAction_STOPPRESENTATION:
+ default:
+ m_xFtTree->hide();
+ m_xLbTree->hide();
+ m_xLbTreeDocument->hide();
+ m_xLbOLEAction->hide();
+
+ m_xFrame->hide();
+ m_xEdtSound->hide();
+ m_xEdtBookmark->hide();
+ m_xEdtDocument->hide();
+ m_xEdtProgram->hide();
+ m_xEdtMacro->hide();
+ m_xBtnSearch->hide();
+ m_xBtnSeek->hide();
+ break;
+
+ case presentation::ClickAction_SOUND:
+ case presentation::ClickAction_PROGRAM:
+ case presentation::ClickAction_MACRO:
+ m_xFtTree->hide();
+ m_xLbTree->hide();
+ m_xLbTreeDocument->hide();
+ m_xLbOLEAction->hide();
+
+ m_xEdtDocument->hide();
+
+ if( eCA == presentation::ClickAction_MACRO )
+ {
+ m_xEdtSound->hide();
+ m_xEdtProgram->hide();
+ }
+ else if( eCA == presentation::ClickAction_PROGRAM )
+ {
+ m_xEdtSound->hide();
+ m_xEdtMacro->hide();
+ }
+ else if( eCA == presentation::ClickAction_SOUND )
+ {
+ m_xEdtProgram->hide();
+ m_xEdtMacro->hide();
+ }
+
+ m_xBtnSeek->hide();
+ break;
+
+ case presentation::ClickAction_DOCUMENT:
+ m_xLbTree->hide();
+ m_xLbOLEAction->hide();
+
+ m_xEdtSound->hide();
+ m_xEdtProgram->hide();
+ m_xEdtMacro->hide();
+ m_xEdtBookmark->hide();
+ m_xBtnSeek->hide();
+ break;
+
+ case presentation::ClickAction_BOOKMARK:
+ m_xLbTreeDocument->hide();
+ m_xLbOLEAction->hide();
+ m_xEdtSound->hide();
+ m_xEdtDocument->hide();
+ m_xEdtProgram->hide();
+ m_xEdtMacro->hide();
+ m_xBtnSearch->hide();
+ break;
+
+ case presentation::ClickAction_VERB:
+ m_xLbTree->hide();
+ m_xEdtDocument->hide();
+ m_xEdtProgram->hide();
+ m_xEdtBookmark->hide();
+ m_xEdtMacro->hide();
+ m_xBtnSearch->hide();
+ m_xFrame->hide();
+ m_xEdtSound->hide();
+ m_xBtnSeek->hide();
+ break;
+ }
+
+ // show controls we do need
+ switch( eCA )
+ {
+ case presentation::ClickAction_NONE:
+ case presentation::ClickAction_INVISIBLE:
+ case presentation::ClickAction_PREVPAGE:
+ case presentation::ClickAction_NEXTPAGE:
+ case presentation::ClickAction_FIRSTPAGE:
+ case presentation::ClickAction_LASTPAGE:
+ case presentation::ClickAction_STOPPRESENTATION:
+ // none
+ break;
+
+ case presentation::ClickAction_SOUND:
+ m_xFrame->show();
+ m_xEdtSound->show();
+ m_xEdtSound->set_sensitive(true);
+ m_xBtnSearch->show();
+ m_xBtnSearch->set_sensitive(true);
+ m_xFrame->set_label( SdResId( STR_EFFECTDLG_SOUND ) );
+ break;
+
+ case presentation::ClickAction_PROGRAM:
+ case presentation::ClickAction_MACRO:
+ m_xFrame->show();
+ m_xBtnSearch->show();
+ m_xBtnSearch->set_sensitive(true);
+ if( eCA == presentation::ClickAction_MACRO )
+ {
+ m_xEdtMacro->show();
+ m_xFrame->set_label( SdResId( STR_EFFECTDLG_MACRO ) );
+ }
+ else
+ {
+ m_xEdtProgram->show();
+ m_xFrame->set_label( SdResId( STR_EFFECTDLG_PROGRAM ) );
+ }
+ break;
+
+ case presentation::ClickAction_DOCUMENT:
+ m_xFtTree->show();
+ m_xLbTreeDocument->show();
+
+ m_xFrame->show();
+ m_xEdtDocument->show();
+ m_xBtnSearch->show();
+ m_xBtnSearch->set_sensitive(true);
+
+ m_xFtTree->set_label( SdResId( STR_EFFECTDLG_JUMP ) );
+ m_xFrame->set_label( SdResId( STR_EFFECTDLG_DOCUMENT ) );
+
+ CheckFileHdl( *m_xEdtDocument );
+ break;
+
+ case presentation::ClickAction_VERB:
+ m_xFtTree->show();
+ m_xLbOLEAction->show();
+
+ m_xFtTree->set_label( SdResId( STR_EFFECTDLG_ACTION ) );
+ break;
+
+ case presentation::ClickAction_BOOKMARK:
+ UpdateTree();
+
+ m_xFtTree->show();
+ m_xLbTree->show();
+
+ m_xFrame->show();
+ m_xEdtBookmark->show();
+ m_xBtnSeek->show();
+
+ m_xFtTree->set_label( SdResId( STR_EFFECTDLG_JUMP ) );
+ m_xFrame->set_label( SdResId( STR_EFFECTDLG_PAGE_OBJECT ) );
+ break;
+ default:
+ break;
+ }
+}
+
+IMPL_LINK_NOARG(SdTPAction, SelectTreeHdl, weld::TreeView&, void)
+{
+ m_xEdtBookmark->set_text( m_xLbTree->get_selected_text() );
+}
+
+IMPL_LINK_NOARG(SdTPAction, CheckFileHdl, weld::Widget&, void)
+{
+ OUString aFile( GetEditText() );
+
+ if( aFile == aLastFile )
+ return;
+
+ bool bHideTreeDocument = true;
+
+ if (mpDoc)
+ {
+ // check if it is a valid draw file
+ SfxMedium aMedium( aFile,
+ StreamMode::READ | StreamMode::NOCREATE );
+
+ if( aMedium.IsStorage() )
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+
+ // is it a draw file?
+ // open with READ, otherwise the Storages might write into the file!
+ uno::Reference < embed::XStorage > xStorage = aMedium.GetStorage();
+ DBG_ASSERT( xStorage.is(), "No storage!" );
+
+ if (xStorage.is())
+ {
+ try
+ {
+ if (xStorage->hasByName(pStarDrawXMLContent))
+ {
+ if (SdDrawDocument* pBookmarkDoc = mpDoc->OpenBookmarkDoc(aFile))
+ {
+ aLastFile = aFile;
+
+ m_xLbTreeDocument->clear();
+ m_xLbTreeDocument->Fill(pBookmarkDoc, true, aFile);
+ mpDoc->CloseBookmarkDoc();
+ m_xLbTreeDocument->show();
+ bHideTreeDocument = false;
+ }
+ }
+ }
+ catch (...)
+ {
+ }
+ }
+ }
+ }
+
+ if (bHideTreeDocument)
+ m_xLbTreeDocument->hide();
+}
+
+presentation::ClickAction SdTPAction::GetActualClickAction()
+{
+ presentation::ClickAction eCA = presentation::ClickAction_NONE;
+ int nPos = m_xLbAction->get_active();
+ if (nPos != -1 && o3tl::make_unsigned(nPos) < maCurrentActions.size())
+ eCA = maCurrentActions[ nPos ];
+ return eCA;
+}
+
+void SdTPAction::SetActualClickAction( presentation::ClickAction eCA )
+{
+ std::vector<css::presentation::ClickAction>::const_iterator pIter =
+ std::find(maCurrentActions.begin(),maCurrentActions.end(),eCA);
+
+ if ( pIter != maCurrentActions.end() )
+ m_xLbAction->set_active(pIter-maCurrentActions.begin());
+}
+
+void SdTPAction::SetEditText( OUString const & rStr )
+{
+ presentation::ClickAction eCA = GetActualClickAction();
+ OUString aText(rStr);
+
+ // possibly convert URI back to system path
+ switch( eCA )
+ {
+ case presentation::ClickAction_DOCUMENT:
+ if( comphelper::string::getTokenCount(rStr, DOCUMENT_TOKEN) == 2 )
+ aText = rStr.getToken( 0, DOCUMENT_TOKEN );
+
+ [[fallthrough]];
+ case presentation::ClickAction_SOUND:
+ case presentation::ClickAction_PROGRAM:
+ {
+ INetURLObject aURL( aText );
+
+ // try to convert to system path
+ OUString aTmpStr(aURL.getFSysPath(FSysStyle::Detect));
+
+ if( !aTmpStr.isEmpty() )
+ aText = aTmpStr; // was a system path
+ }
+ break;
+ default:
+ break;
+ }
+
+ // set the string to the corresponding control
+ switch( eCA )
+ {
+ case presentation::ClickAction_SOUND:
+ m_xEdtSound->set_text(aText );
+ break;
+ case presentation::ClickAction_VERB:
+ {
+ ::std::vector< tools::Long >::iterator aFound( ::std::find( aVerbVector.begin(), aVerbVector.end(), rStr.toInt32() ) );
+ if( aFound != aVerbVector.end() )
+ m_xLbOLEAction->select(aFound - aVerbVector.begin());
+ }
+ break;
+ case presentation::ClickAction_PROGRAM:
+ m_xEdtProgram->set_text( aText );
+ break;
+ case presentation::ClickAction_MACRO:
+ m_xEdtMacro->set_text( aText );
+ break;
+ case presentation::ClickAction_DOCUMENT:
+ m_xEdtDocument->set_text( aText );
+ break;
+ case presentation::ClickAction_BOOKMARK:
+ m_xEdtBookmark->set_text( aText );
+ break;
+ default:
+ break;
+ }
+}
+
+OUString SdTPAction::GetEditText( bool bFullDocDestination )
+{
+ OUString aStr;
+ presentation::ClickAction eCA = GetActualClickAction();
+
+ switch( eCA )
+ {
+ case presentation::ClickAction_SOUND:
+ aStr = m_xEdtSound->get_text();
+ break;
+ case presentation::ClickAction_VERB:
+ {
+ const int nPos = m_xLbOLEAction->get_selected_index();
+ if (nPos != -1 && o3tl::make_unsigned(nPos) < aVerbVector.size() )
+ aStr = OUString::number( aVerbVector[ nPos ] );
+ return aStr;
+ }
+ case presentation::ClickAction_DOCUMENT:
+ aStr = m_xEdtDocument->get_text();
+ break;
+
+ case presentation::ClickAction_PROGRAM:
+ aStr = m_xEdtProgram->get_text();
+ break;
+
+ case presentation::ClickAction_MACRO:
+ {
+ return m_xEdtMacro->get_text();
+ }
+
+ case presentation::ClickAction_BOOKMARK:
+ return m_xEdtBookmark->get_text();
+
+ default:
+ break;
+ }
+
+ // validate file URI
+ INetURLObject aURL( aStr );
+ OUString aBaseURL;
+ if( mpDoc && mpDoc->GetDocSh() && mpDoc->GetDocSh()->GetMedium() )
+ aBaseURL = mpDoc->GetDocSh()->GetMedium()->GetBaseURL();
+
+ if( !aStr.isEmpty() && aURL.GetProtocol() == INetProtocol::NotValid )
+ aURL = INetURLObject( ::URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), aStr, URIHelper::GetMaybeFileHdl() ) );
+
+ // get adjusted file name
+ aStr = aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE );
+
+ if( bFullDocDestination &&
+ eCA == presentation::ClickAction_DOCUMENT &&
+ m_xLbTreeDocument->get_visible() &&
+ m_xLbTreeDocument->get_selected() )
+ {
+ OUString aTmpStr( m_xLbTreeDocument->get_selected_text() );
+ if( !aTmpStr.isEmpty() )
+ {
+ aStr += OUStringChar(DOCUMENT_TOKEN) + aTmpStr;
+ }
+ }
+
+ return aStr;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/tpoption.cxx b/sd/source/ui/dlg/tpoption.cxx
new file mode 100644
index 000000000..0c534682d
--- /dev/null
+++ b/sd/source/ui/dlg/tpoption.cxx
@@ -0,0 +1,618 @@
+/* -*- 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 <com/sun/star/document/PrinterIndependentLayout.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/string.hxx>
+#include <com/sun/star/uno/Exception.hpp>
+#include <sfx2/module.hxx>
+#include <svx/svxids.hrc>
+#include <svx/strarray.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <svtools/unitconv.hxx>
+
+#include <sdattr.hrc>
+#include <sdresid.hxx>
+#include <optsitem.hxx>
+#include <tpoption.hxx>
+#include <strings.hrc>
+#include <app.hrc>
+#include <svl/intitem.hxx>
+#include <o3tl/string_view.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+SdTpOptionsSnap::SdTpOptionsSnap(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs)
+ : SvxGridTabPage(pPage, pController, rInAttrs)
+{
+ m_xSnapFrames->show();
+}
+
+SdTpOptionsSnap::~SdTpOptionsSnap()
+{
+}
+
+bool SdTpOptionsSnap::FillItemSet( SfxItemSet* rAttrs )
+{
+ SvxGridTabPage::FillItemSet(rAttrs);
+ SdOptionsSnapItem aOptsItem;
+
+ aOptsItem.GetOptionsSnap().SetSnapHelplines( m_xCbxSnapHelplines->get_active() );
+ aOptsItem.GetOptionsSnap().SetSnapBorder( m_xCbxSnapBorder->get_active() );
+ aOptsItem.GetOptionsSnap().SetSnapFrame( m_xCbxSnapFrame->get_active() );
+ aOptsItem.GetOptionsSnap().SetSnapPoints( m_xCbxSnapPoints->get_active() );
+ aOptsItem.GetOptionsSnap().SetOrtho( m_xCbxOrtho->get_active() );
+ aOptsItem.GetOptionsSnap().SetBigOrtho( m_xCbxBigOrtho->get_active() );
+ aOptsItem.GetOptionsSnap().SetRotate( m_xCbxRotate->get_active() );
+ aOptsItem.GetOptionsSnap().SetSnapArea(static_cast<sal_Int16>(m_xMtrFldSnapArea->get_value(FieldUnit::PIXEL)));
+ aOptsItem.GetOptionsSnap().SetAngle(Degree100(m_xMtrFldAngle->get_value(FieldUnit::DEGREE)));
+ aOptsItem.GetOptionsSnap().SetEliminatePolyPointLimitAngle(Degree100(m_xMtrFldBezAngle->get_value(FieldUnit::DEGREE)));
+
+ rAttrs->Put( aOptsItem );
+
+ // we get a possible existing GridItem, this ensures that we do not set
+ // some default values by accident
+ return true;
+}
+
+void SdTpOptionsSnap::Reset( const SfxItemSet* rAttrs )
+{
+ SvxGridTabPage::Reset(rAttrs);
+
+ SdOptionsSnapItem aOptsItem( rAttrs->Get( ATTR_OPTIONS_SNAP ) );
+
+ m_xCbxSnapHelplines->set_active( aOptsItem.GetOptionsSnap().IsSnapHelplines() );
+ m_xCbxSnapBorder->set_active( aOptsItem.GetOptionsSnap().IsSnapBorder() );
+ m_xCbxSnapFrame->set_active( aOptsItem.GetOptionsSnap().IsSnapFrame() );
+ m_xCbxSnapPoints->set_active( aOptsItem.GetOptionsSnap().IsSnapPoints() );
+ m_xCbxOrtho->set_active( aOptsItem.GetOptionsSnap().IsOrtho() );
+ m_xCbxBigOrtho->set_active( aOptsItem.GetOptionsSnap().IsBigOrtho() );
+ m_xCbxRotate->set_active( aOptsItem.GetOptionsSnap().IsRotate() );
+ m_xMtrFldSnapArea->set_value(aOptsItem.GetOptionsSnap().GetSnapArea(), FieldUnit::PIXEL);
+ m_xMtrFldAngle->set_value(aOptsItem.GetOptionsSnap().GetAngle().get(), FieldUnit::DEGREE);
+ m_xMtrFldBezAngle->set_value(aOptsItem.GetOptionsSnap().GetEliminatePolyPointLimitAngle().get(), FieldUnit::DEGREE);
+
+ ClickRotateHdl_Impl(*m_xCbxRotate);
+}
+
+std::unique_ptr<SfxTabPage> SdTpOptionsSnap::Create( weld::Container* pPage, weld::DialogController* pController,
+ const SfxItemSet* rAttrs )
+{
+ return std::make_unique<SdTpOptionsSnap>(pPage, pController, *rAttrs);
+}
+
+/*************************************************************************
+|*
+|* TabPage to adjust the content options
+|*
+\************************************************************************/
+SdTpOptionsContents::SdTpOptionsContents(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs)
+ : SfxTabPage(pPage, pController, "modules/simpress/ui/sdviewpage.ui", "SdViewPage", &rInAttrs)
+ , m_xCbxRuler(m_xBuilder->weld_check_button("ruler"))
+ , m_xCbxDragStripes(m_xBuilder->weld_check_button("dragstripes"))
+ , m_xCbxHandlesBezier(m_xBuilder->weld_check_button("handlesbezier"))
+ , m_xCbxMoveOutline(m_xBuilder->weld_check_button("moveoutline"))
+{
+}
+
+SdTpOptionsContents::~SdTpOptionsContents()
+{
+}
+
+bool SdTpOptionsContents::FillItemSet( SfxItemSet* rAttrs )
+{
+ bool bModified = false;
+
+ if( m_xCbxRuler->get_state_changed_from_saved() ||
+ m_xCbxMoveOutline->get_state_changed_from_saved() ||
+ m_xCbxDragStripes->get_state_changed_from_saved() ||
+ m_xCbxHandlesBezier->get_state_changed_from_saved() )
+ {
+ SdOptionsLayoutItem aOptsItem;
+
+ aOptsItem.GetOptionsLayout().SetRulerVisible( m_xCbxRuler->get_active() );
+ aOptsItem.GetOptionsLayout().SetMoveOutline( m_xCbxMoveOutline->get_active() );
+ aOptsItem.GetOptionsLayout().SetDragStripes( m_xCbxDragStripes->get_active() );
+ aOptsItem.GetOptionsLayout().SetHandlesBezier( m_xCbxHandlesBezier->get_active() );
+
+ rAttrs->Put( aOptsItem );
+ bModified = true;
+ }
+ return bModified;
+}
+
+void SdTpOptionsContents::Reset( const SfxItemSet* rAttrs )
+{
+ SdOptionsLayoutItem aLayoutItem( rAttrs->Get( ATTR_OPTIONS_LAYOUT ) );
+
+ m_xCbxRuler->set_active( aLayoutItem.GetOptionsLayout().IsRulerVisible() );
+ m_xCbxMoveOutline->set_active( aLayoutItem.GetOptionsLayout().IsMoveOutline() );
+ m_xCbxDragStripes->set_active( aLayoutItem.GetOptionsLayout().IsDragStripes() );
+ m_xCbxHandlesBezier->set_active( aLayoutItem.GetOptionsLayout().IsHandlesBezier() );
+
+ m_xCbxRuler->save_state();
+ m_xCbxMoveOutline->save_state();
+ m_xCbxDragStripes->save_state();
+ m_xCbxHandlesBezier->save_state();
+}
+
+std::unique_ptr<SfxTabPage> SdTpOptionsContents::Create( weld::Container* pPage, weld::DialogController* pController,
+ const SfxItemSet* rAttrs )
+{
+ return std::make_unique<SdTpOptionsContents>(pPage, pController, *rAttrs);
+}
+
+/*************************************************************************
+|*
+|* TabPage to adjust the misc options
+|*
+\************************************************************************/
+#define TABLE_COUNT 12
+#define TOKEN ':'
+
+SdTpOptionsMisc::SdTpOptionsMisc(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs)
+ : SfxTabPage(pPage, pController, "modules/simpress/ui/optimpressgeneralpage.ui", "OptSavePage", &rInAttrs)
+ , nWidth(0)
+ , nHeight(0)
+ , m_xCbxQuickEdit(m_xBuilder->weld_check_button("qickedit"))
+ , m_xCbxPickThrough(m_xBuilder->weld_check_button("textselected"))
+ , m_xNewDocumentFrame(m_xBuilder->weld_frame("newdocumentframe"))
+ , m_xCbxStartWithTemplate(m_xBuilder->weld_check_button("startwithwizard"))
+ , m_xCbxMasterPageCache(m_xBuilder->weld_check_button("backgroundback"))
+ , m_xCbxCopy(m_xBuilder->weld_check_button("copywhenmove"))
+ , m_xCbxMarkedHitMovesAlways(m_xBuilder->weld_check_button("objalwymov"))
+ , m_xPresentationFrame(m_xBuilder->weld_frame("presentationframe"))
+ , m_xLbMetric(m_xBuilder->weld_combo_box("units"))
+ , m_xMtrFldTabstop(m_xBuilder->weld_metric_spin_button("metricFields", FieldUnit::MM))
+ , m_xCbxEnableSdremote(m_xBuilder->weld_check_button("enremotcont"))
+ , m_xCbxEnablePresenterScreen(m_xBuilder->weld_check_button("enprsntcons"))
+ , m_xCbxUsePrinterMetrics(m_xBuilder->weld_check_button("printermetrics"))
+ , m_xCbxCompatibility(m_xBuilder->weld_check_button("cbCompatibility"))
+ , m_xScaleFrame(m_xBuilder->weld_frame("scaleframe"))
+ , m_xCbScale(m_xBuilder->weld_combo_box("scaleBox"))
+ , m_xNewDocLb(m_xBuilder->weld_label("newdoclbl"))
+ , m_xFiInfo1(m_xBuilder->weld_label("info1"))
+ , m_xMtrFldOriginalWidth(m_xBuilder->weld_metric_spin_button("metricWidthFields", FieldUnit::MM))
+ , m_xWidthLb(m_xBuilder->weld_label("widthlbl"))
+ , m_xHeightLb(m_xBuilder->weld_label("heightlbl"))
+ , m_xFiInfo2(m_xBuilder->weld_label("info2"))
+ , m_xMtrFldOriginalHeight(m_xBuilder->weld_metric_spin_button("metricHeightFields", FieldUnit::MM))
+ , m_xCbxDistort(m_xBuilder->weld_check_button("distortcb"))
+ , m_xMtrFldInfo1(m_xBuilder->weld_metric_spin_button("metricInfo1Fields", FieldUnit::MM))
+ , m_xMtrFldInfo2(m_xBuilder->weld_metric_spin_button("metricInfo2Fields", FieldUnit::MM))
+{
+ SetExchangeSupport();
+
+ // set metric
+ FieldUnit eFUnit;
+
+ sal_uInt16 nWhich = GetWhich( SID_ATTR_METRIC );
+ if ( rInAttrs.GetItemState( nWhich ) >= SfxItemState::DEFAULT )
+ {
+ const SfxUInt16Item& rItem = static_cast<const SfxUInt16Item&>(rInAttrs.Get( nWhich ));
+ eFUnit = static_cast<FieldUnit>(rItem.GetValue());
+ }
+ else
+ eFUnit = SfxModule::GetCurrentFieldUnit();
+
+ SetFieldUnit( *m_xMtrFldTabstop , eFUnit );
+ // tdf#148292 - avoid right frame to change position depending on width of this control
+ m_xMtrFldTabstop->set_size_request(150, -1);
+ // Impress is default mode, let' hide the entire scale frame etc.
+ m_xCbxDistort->hide();
+ m_xScaleFrame->hide();
+
+ // fill ListBox with metrics
+ for (sal_uInt32 i = 0; i < SvxFieldUnitTable::Count(); ++i)
+ {
+ OUString sMetric = SvxFieldUnitTable::GetString(i);
+ sal_uInt32 nFieldUnit = sal_uInt32(SvxFieldUnitTable::GetValue(i));
+ m_xLbMetric->append(OUString::number(nFieldUnit), sMetric);
+ }
+ m_xLbMetric->connect_changed( LINK( this, SdTpOptionsMisc, SelectMetricHdl_Impl ) );
+
+ SetFieldUnit( *m_xMtrFldOriginalWidth, eFUnit );
+ SetFieldUnit( *m_xMtrFldOriginalHeight, eFUnit );
+ m_xMtrFldOriginalWidth->set_max(999999999, FieldUnit::NONE);
+ m_xMtrFldOriginalHeight->set_max(999999999, FieldUnit::NONE);
+
+ // temporary fields for info texts (for formatting/calculation)
+ m_xMtrFldInfo1->set_unit( eFUnit );
+ m_xMtrFldInfo1->set_max(999999999, FieldUnit::NONE);
+ m_xMtrFldInfo1->set_digits( 2 );
+ m_xMtrFldInfo2->set_unit( eFUnit );
+ m_xMtrFldInfo2->set_max(999999999, FieldUnit::NONE);
+ m_xMtrFldInfo2->set_digits( 2 );
+
+ // determine PoolUnit
+ SfxItemPool* pPool = rInAttrs.GetPool();
+ DBG_ASSERT( pPool, "Where is the Pool?" );
+ ePoolUnit = pPool->GetMetric( SID_ATTR_FILL_HATCH );
+
+ // Fill the CB
+ sal_uInt16 aTable[ TABLE_COUNT ] =
+ { 1, 2, 4, 5, 8, 10, 16, 20, 30, 40, 50, 100 };
+
+ for( sal_uInt16 i = TABLE_COUNT-1; i > 0 ; i-- )
+ m_xCbScale->append_text( GetScale( 1, aTable[i] ) );
+ for( sal_uInt16 i = 0; i < TABLE_COUNT; i++ )
+ m_xCbScale->append_text( GetScale( aTable[i], 1 ) );
+}
+
+SdTpOptionsMisc::~SdTpOptionsMisc()
+{
+}
+
+void SdTpOptionsMisc::ActivatePage( const SfxItemSet& rSet )
+{
+ // We have to call save_state again since it can happen that the value
+ // has no effect on other TabPages
+ m_xLbMetric->save_value();
+ // change metric if necessary (since TabPage is in the Dialog where
+ // the metric is set)
+ const SfxUInt16Item* pAttr = rSet.GetItemIfSet( SID_ATTR_METRIC , false );
+ if( !pAttr )
+ return;
+
+ FieldUnit eFUnit = static_cast<FieldUnit>(static_cast<tools::Long>(pAttr->GetValue()));
+
+ if( eFUnit == m_xMtrFldOriginalWidth->get_unit() )
+ return;
+
+ // set metrics
+ sal_Int64 nVal = m_xMtrFldOriginalWidth->denormalize( m_xMtrFldOriginalWidth->get_value( FieldUnit::TWIP ) );
+ SetFieldUnit( *m_xMtrFldOriginalWidth, eFUnit, true );
+ m_xMtrFldOriginalWidth->set_value( m_xMtrFldOriginalWidth->normalize( nVal ), FieldUnit::TWIP );
+
+ nVal = m_xMtrFldOriginalHeight->denormalize( m_xMtrFldOriginalHeight->get_value( FieldUnit::TWIP ) );
+ SetFieldUnit( *m_xMtrFldOriginalHeight, eFUnit, true );
+ m_xMtrFldOriginalHeight->set_value( m_xMtrFldOriginalHeight->normalize( nVal ), FieldUnit::TWIP );
+
+ if( nWidth == 0 || nHeight == 0 )
+ return;
+
+ m_xMtrFldInfo1->set_unit( eFUnit );
+ m_xMtrFldInfo2->set_unit( eFUnit );
+
+ SetMetricValue( *m_xMtrFldInfo1, nWidth, ePoolUnit );
+ aInfo1 = m_xMtrFldInfo1->get_text();
+ m_xFiInfo1->set_label( aInfo1 );
+
+ SetMetricValue( *m_xMtrFldInfo2, nHeight, ePoolUnit );
+ aInfo2 = m_xMtrFldInfo2->get_text();
+ m_xFiInfo2->set_label( aInfo2 );
+}
+
+DeactivateRC SdTpOptionsMisc::DeactivatePage( SfxItemSet* pActiveSet )
+{
+ // check parser
+ sal_Int32 nX, nY;
+ if( SetScale( m_xCbScale->get_active_text(), nX, nY ) )
+ {
+ if( pActiveSet )
+ FillItemSet( pActiveSet );
+ return DeactivateRC::LeavePage;
+ }
+
+ std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Warning, VclButtonsType::YesNo,
+ SdResId(STR_WARN_SCALE_FAIL)));
+ if (xWarn->run() == RET_YES)
+ return DeactivateRC::KeepPage;
+
+ if( pActiveSet )
+ FillItemSet( pActiveSet );
+
+ return DeactivateRC::LeavePage;
+}
+
+bool SdTpOptionsMisc::FillItemSet( SfxItemSet* rAttrs )
+{
+ bool bModified = false;
+
+ if( m_xCbxStartWithTemplate->get_state_changed_from_saved() ||
+ m_xCbxMarkedHitMovesAlways->get_state_changed_from_saved() ||
+ m_xCbxQuickEdit->get_state_changed_from_saved() ||
+ m_xCbxPickThrough->get_state_changed_from_saved() ||
+ m_xCbxMasterPageCache->get_state_changed_from_saved() ||
+ m_xCbxCopy->get_state_changed_from_saved() ||
+ m_xCbxEnableSdremote->get_state_changed_from_saved() ||
+ m_xCbxEnablePresenterScreen->get_state_changed_from_saved() ||
+ m_xCbxCompatibility->get_state_changed_from_saved() ||
+ m_xCbxUsePrinterMetrics->get_state_changed_from_saved() ||
+ m_xCbxDistort->get_state_changed_from_saved())
+ {
+ SdOptionsMiscItem aOptsItem;
+
+ aOptsItem.GetOptionsMisc().SetStartWithTemplate( m_xCbxStartWithTemplate->get_active() );
+ aOptsItem.GetOptionsMisc().SetMarkedHitMovesAlways( m_xCbxMarkedHitMovesAlways->get_active() );
+ aOptsItem.GetOptionsMisc().SetQuickEdit( m_xCbxQuickEdit->get_active() );
+ aOptsItem.GetOptionsMisc().SetPickThrough( m_xCbxPickThrough->get_active() );
+ aOptsItem.GetOptionsMisc().SetMasterPagePaintCaching( m_xCbxMasterPageCache->get_active() );
+ aOptsItem.GetOptionsMisc().SetDragWithCopy( m_xCbxCopy->get_active() );
+ aOptsItem.GetOptionsMisc().SetEnableSdremote( m_xCbxEnableSdremote->get_active() );
+ aOptsItem.GetOptionsMisc().SetEnablePresenterScreen( m_xCbxEnablePresenterScreen->get_active() );
+ aOptsItem.GetOptionsMisc().SetSummationOfParagraphs( m_xCbxCompatibility->get_active() );
+ aOptsItem.GetOptionsMisc().SetPrinterIndependentLayout (
+ m_xCbxUsePrinterMetrics->get_active()
+ ? css::document::PrinterIndependentLayout::DISABLED
+ : css::document::PrinterIndependentLayout::ENABLED);
+ aOptsItem.GetOptionsMisc().SetCrookNoContortion( m_xCbxDistort->get_active() );
+ rAttrs->Put( aOptsItem );
+
+ bModified = true;
+ }
+
+ // metric
+ if (m_xLbMetric->get_value_changed_from_saved())
+ {
+ const sal_Int32 nMPos = m_xLbMetric->get_active();
+ sal_uInt16 nFieldUnit = m_xLbMetric->get_id(nMPos).toUInt32();
+ rAttrs->Put( SfxUInt16Item( GetWhich( SID_ATTR_METRIC ), nFieldUnit ) );
+ bModified = true;
+ }
+
+ // tabulator space
+ if( m_xMtrFldTabstop->get_value_changed_from_saved() )
+ {
+ MapUnit eUnit = rAttrs->GetPool()->GetMetric( SID_ATTR_DEFTABSTOP );
+ SfxUInt16Item aDef( SID_ATTR_DEFTABSTOP, static_cast<sal_uInt16>(GetCoreValue( *m_xMtrFldTabstop, eUnit )) );
+ rAttrs->Put( aDef );
+ bModified = true;
+ }
+
+ sal_Int32 nX, nY;
+ if( SetScale( m_xCbScale->get_active_text(), nX, nY ) )
+ {
+ rAttrs->Put( SfxInt32Item( ATTR_OPTIONS_SCALE_X, nX ) );
+ rAttrs->Put( SfxInt32Item( ATTR_OPTIONS_SCALE_Y, nY ) );
+
+ bModified = true;
+ }
+
+ return bModified;
+}
+
+void SdTpOptionsMisc::Reset( const SfxItemSet* rAttrs )
+{
+ SdOptionsMiscItem aOptsItem( rAttrs->Get( ATTR_OPTIONS_MISC ) );
+
+ m_xCbxStartWithTemplate->set_active( aOptsItem.GetOptionsMisc().IsStartWithTemplate() );
+ m_xCbxMarkedHitMovesAlways->set_active( aOptsItem.GetOptionsMisc().IsMarkedHitMovesAlways() );
+ m_xCbxQuickEdit->set_active( aOptsItem.GetOptionsMisc().IsQuickEdit() );
+ m_xCbxPickThrough->set_active( aOptsItem.GetOptionsMisc().IsPickThrough() );
+ m_xCbxMasterPageCache->set_active( aOptsItem.GetOptionsMisc().IsMasterPagePaintCaching() );
+ m_xCbxCopy->set_active( aOptsItem.GetOptionsMisc().IsDragWithCopy() );
+ m_xCbxEnableSdremote->set_active( aOptsItem.GetOptionsMisc().IsEnableSdremote() );
+ m_xCbxEnablePresenterScreen->set_active( aOptsItem.GetOptionsMisc().IsEnablePresenterScreen() );
+ m_xCbxCompatibility->set_active( aOptsItem.GetOptionsMisc().IsSummationOfParagraphs() );
+ m_xCbxUsePrinterMetrics->set_active( aOptsItem.GetOptionsMisc().GetPrinterIndependentLayout()==1 );
+ m_xCbxDistort->set_active( aOptsItem.GetOptionsMisc().IsCrookNoContortion() );
+ m_xCbxStartWithTemplate->save_state();
+ m_xCbxMarkedHitMovesAlways->save_state();
+ m_xCbxQuickEdit->save_state();
+ m_xCbxPickThrough->save_state();
+
+ m_xCbxMasterPageCache->save_state();
+ m_xCbxCopy->save_state();
+ m_xCbxEnableSdremote->save_state();
+ m_xCbxEnablePresenterScreen->save_state();
+ m_xCbxCompatibility->save_state();
+ m_xCbxUsePrinterMetrics->save_state();
+ m_xCbxDistort->save_state();
+
+ // metric
+ sal_uInt16 nWhich = GetWhich( SID_ATTR_METRIC );
+ m_xLbMetric->set_active(-1);
+
+ if ( rAttrs->GetItemState( nWhich ) >= SfxItemState::DEFAULT )
+ {
+ const SfxUInt16Item& rItem = static_cast<const SfxUInt16Item&>(rAttrs->Get( nWhich ));
+ sal_uInt32 nFieldUnit = static_cast<sal_uInt32>(rItem.GetValue());
+
+ for (sal_Int32 i = 0, nEntryCount = m_xLbMetric->get_count(); i < nEntryCount; ++i)
+ {
+ if (m_xLbMetric->get_id(i).toUInt32() == nFieldUnit)
+ {
+ m_xLbMetric->set_active( i );
+ break;
+ }
+ }
+ }
+
+ // tabulator space
+ constexpr auto nWhich2 = SID_ATTR_DEFTABSTOP;
+ if( rAttrs->GetItemState( nWhich2 ) >= SfxItemState::DEFAULT )
+ {
+ MapUnit eUnit = rAttrs->GetPool()->GetMetric( nWhich2 );
+ const SfxUInt16Item& rItem = rAttrs->Get( nWhich2 );
+ SetMetricValue( *m_xMtrFldTabstop, rItem.GetValue(), eUnit );
+ }
+ m_xLbMetric->save_value();
+ m_xMtrFldTabstop->save_value();
+ //Scale
+ sal_Int32 nX = rAttrs->Get( ATTR_OPTIONS_SCALE_X ).GetValue();
+ sal_Int32 nY = rAttrs->Get( ATTR_OPTIONS_SCALE_Y ).GetValue();
+ nWidth = static_cast<const SfxUInt32Item&>( rAttrs->
+ Get( ATTR_OPTIONS_SCALE_WIDTH ) ).GetValue();
+ nHeight = static_cast<const SfxUInt32Item&>( rAttrs->
+ Get( ATTR_OPTIONS_SCALE_HEIGHT ) ).GetValue();
+
+ m_xCbScale->set_entry_text( GetScale( nX, nY ) );
+
+ m_xMtrFldOriginalWidth->hide();
+ m_xMtrFldOriginalWidth->set_text( aInfo1 ); // empty
+ m_xMtrFldOriginalHeight->hide();
+ m_xMtrFldOriginalHeight->set_text( aInfo2 ); //empty
+ m_xFiInfo1->hide();
+ m_xFiInfo2->hide();
+
+ UpdateCompatibilityControls ();
+}
+
+std::unique_ptr<SfxTabPage> SdTpOptionsMisc::Create( weld::Container* pPage, weld::DialogController* pController,
+ const SfxItemSet* rAttrs )
+{
+ return std::make_unique<SdTpOptionsMisc>( pPage, pController, *rAttrs );
+}
+
+IMPL_LINK_NOARG(SdTpOptionsMisc, SelectMetricHdl_Impl, weld::ComboBox&, void)
+{
+ int nPos = m_xLbMetric->get_active();
+ if (nPos != -1)
+ {
+ FieldUnit eUnit = static_cast<FieldUnit>(m_xLbMetric->get_id(nPos).toUInt32());
+ sal_Int64 nVal =
+ m_xMtrFldTabstop->denormalize(m_xMtrFldTabstop->get_value(FieldUnit::TWIP));
+ SetFieldUnit( *m_xMtrFldTabstop, eUnit );
+ m_xMtrFldTabstop->set_value( m_xMtrFldTabstop->normalize( nVal ), FieldUnit::TWIP );
+ }
+}
+
+void SdTpOptionsMisc::SetImpressMode()
+{
+#ifndef ENABLE_SDREMOTE
+ m_xCbxEnableSdremote->hide();
+#else
+ (void) this; // loplugin:staticmethods
+#endif
+}
+
+void SdTpOptionsMisc::SetDrawMode()
+{
+ m_xScaleFrame->show();
+ m_xNewDocumentFrame->hide();
+ m_xCbxEnableSdremote->hide();
+ m_xCbxEnablePresenterScreen->hide();
+ m_xCbxCompatibility->hide();
+ m_xNewDocLb->hide();
+ m_xCbScale->show();
+ m_xPresentationFrame->hide();
+ m_xMtrFldInfo1->hide();
+ m_xMtrFldInfo2->hide();
+ m_xWidthLb->hide();
+ m_xHeightLb->hide();
+ m_xFiInfo1->show();
+ m_xMtrFldOriginalWidth->show();
+ m_xFiInfo2->show();
+ m_xMtrFldOriginalHeight->show();
+ m_xCbxDistort->show();
+ m_xCbxCompatibility->hide();
+}
+
+OUString SdTpOptionsMisc::GetScale( sal_Int32 nX, sal_Int32 nY )
+{
+ return OUString::number(nX) + OUStringChar(TOKEN) + OUString::number(nY);
+}
+
+bool SdTpOptionsMisc::SetScale( std::u16string_view aScale, sal_Int32& rX, sal_Int32& rY )
+{
+ if (aScale.empty())
+ return false;
+
+ sal_Int32 nIdx {0};
+
+ std::u16string_view aTmp(o3tl::getToken(aScale, 0, TOKEN, nIdx));
+ if (nIdx<0)
+ return false; // we expect another token!
+
+ if (!comphelper::string::isdigitAsciiString(aTmp))
+ return false;
+
+ rX = static_cast<tools::Long>(o3tl::toInt32(aTmp));
+ if( rX == 0 )
+ return false;
+
+ aTmp = o3tl::getToken(aScale, 0, TOKEN, nIdx);
+ if (nIdx>=0)
+ return false; // we require just 2 tokens!
+
+ if (!comphelper::string::isdigitAsciiString(aTmp))
+ return false;
+
+ rY = static_cast<tools::Long>(o3tl::toInt32(aTmp));
+ return rY != 0;
+}
+
+void SdTpOptionsMisc::UpdateCompatibilityControls()
+{
+ // Disable the compatibility controls by default. Enable them only when
+ // there is at least one open document.
+ bool bIsEnabled = false;
+
+ try
+ {
+ // Get a component enumeration from the desktop and search it for documents.
+ Reference<uno::XComponentContext> xContext( ::comphelper::getProcessComponentContext());
+ do
+ {
+ Reference<frame::XDesktop2> xDesktop = frame::Desktop::create(xContext);
+
+ Reference<container::XEnumerationAccess> xComponents =
+ xDesktop->getComponents();
+ if ( ! xComponents.is())
+ break;
+
+ Reference<container::XEnumeration> xEnumeration (
+ xComponents->createEnumeration());
+ if ( ! xEnumeration.is())
+ break;
+
+ while (xEnumeration->hasMoreElements())
+ {
+ Reference<frame::XModel> xModel (xEnumeration->nextElement(), UNO_QUERY);
+ if (xModel.is())
+ {
+ // There is at least one model/document: Enable the compatibility controls.
+ bIsEnabled = true;
+ break;
+ }
+ }
+
+ }
+ while (false); // One 'loop'.
+ }
+ catch (const uno::Exception&)
+ {
+ // When there is an exception then simply use the default value of
+ // bIsEnabled and disable the controls.
+ }
+
+ m_xCbxCompatibility->set_sensitive(bIsEnabled);
+ m_xCbxUsePrinterMetrics->set_sensitive(bIsEnabled);
+}
+
+void SdTpOptionsMisc::PageCreated(const SfxAllItemSet& aSet)
+{
+ const SfxUInt32Item* pFlagItem = aSet.GetItem<SfxUInt32Item>(SID_SDMODE_FLAG, false);
+ if (pFlagItem)
+ {
+ sal_uInt32 nFlags=pFlagItem->GetValue();
+ if ( ( nFlags & SD_DRAW_MODE ) == SD_DRAW_MODE )
+ SetDrawMode();
+ if ( ( nFlags & SD_IMPRESS_MODE ) == SD_IMPRESS_MODE )
+ SetImpressMode();
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/unchss.cxx b/sd/source/ui/dlg/unchss.cxx
new file mode 100644
index 000000000..7d963cddf
--- /dev/null
+++ b/sd/source/ui/dlg/unchss.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/.
+ *
+ * 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 <svl/itemset.hxx>
+#include <svl/style.hxx>
+#include <svl/hint.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdpool.hxx>
+#include <tools/debug.hxx>
+
+#include <unchss.hxx>
+
+#include <strings.hrc>
+#include <glob.hxx>
+#include <sdresid.hxx>
+#include <drawdoc.hxx>
+#include <stlsheet.hxx>
+#include <strings.hxx>
+
+StyleSheetUndoAction::StyleSheetUndoAction(SdDrawDocument* pTheDoc,
+ SfxStyleSheet* pTheStyleSheet,
+ const SfxItemSet* pTheNewItemSet) :
+ SdUndoAction(pTheDoc)
+{
+ DBG_ASSERT(pTheStyleSheet, "Undo without StyleSheet ???");
+ mpStyleSheet = pTheStyleSheet;
+
+ // Create ItemSets; Attention, it is possible that the new one is from a,
+ // different pool. Therefore we clone it with its items.
+ mpNewSet = std::make_unique<SfxItemSet>(static_cast<SfxItemPool&>(SdrObject::GetGlobalDrawObjectItemPool()), pTheNewItemSet->GetRanges());
+ SdrModel::MigrateItemSet( pTheNewItemSet, mpNewSet.get(), pTheDoc );
+
+ mpOldSet = std::make_unique<SfxItemSet>(static_cast<SfxItemPool&>(SdrObject::GetGlobalDrawObjectItemPool()), mpStyleSheet->GetItemSet().GetRanges());
+ SdrModel::MigrateItemSet( &mpStyleSheet->GetItemSet(), mpOldSet.get(), pTheDoc );
+
+ OUString aComment(SdResId(STR_UNDO_CHANGE_PRES_OBJECT));
+ OUString aName(mpStyleSheet->GetName());
+
+ // delete layout name and separator
+ sal_Int32 nPos = aName.indexOf(SD_LT_SEPARATOR);
+ if (nPos != -1)
+ aName = aName.copy(nPos + SD_LT_SEPARATOR.getLength());
+
+ if (aName == STR_LAYOUT_TITLE)
+ {
+ aName = SdResId(STR_PSEUDOSHEET_TITLE);
+ }
+ else if (aName == STR_LAYOUT_SUBTITLE)
+ {
+ aName = SdResId(STR_PSEUDOSHEET_SUBTITLE);
+ }
+ else if (aName == STR_LAYOUT_BACKGROUND)
+ {
+ aName = SdResId(STR_PSEUDOSHEET_BACKGROUND);
+ }
+ else if (aName == STR_LAYOUT_BACKGROUNDOBJECTS)
+ {
+ aName = SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS);
+ }
+ else if (aName == STR_LAYOUT_NOTES)
+ {
+ aName = SdResId(STR_PSEUDOSHEET_NOTES);
+ }
+ else
+ {
+ OUString aOutlineStr(SdResId(STR_PSEUDOSHEET_OUTLINE));
+ nPos = aName.indexOf(aOutlineStr);
+ if (nPos != -1)
+ {
+ std::u16string_view aNumStr(aName.subView(aOutlineStr.getLength()));
+ aName = STR_LAYOUT_OUTLINE + aNumStr;
+ }
+ }
+
+ // replace placeholder with template name
+ SetComment(aComment.replaceFirst("$", aName));
+}
+
+void StyleSheetUndoAction::Undo()
+{
+ SfxItemSet aNewSet( mpDoc->GetItemPool(), mpOldSet->GetRanges() );
+ SdrModel::MigrateItemSet( mpOldSet.get(), &aNewSet, mpDoc );
+
+ mpStyleSheet->GetItemSet().Set(aNewSet);
+ if( mpStyleSheet->GetFamily() == SfxStyleFamily::Pseudo )
+ static_cast<SdStyleSheet*>(mpStyleSheet)->GetRealStyleSheet()->Broadcast(SfxHint(SfxHintId::DataChanged));
+ else
+ mpStyleSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+}
+
+void StyleSheetUndoAction::Redo()
+{
+ SfxItemSet aNewSet( mpDoc->GetItemPool(), mpOldSet->GetRanges() );
+ SdrModel::MigrateItemSet( mpNewSet.get(), &aNewSet, mpDoc );
+
+ mpStyleSheet->GetItemSet().Set(aNewSet);
+ if( mpStyleSheet->GetFamily() == SfxStyleFamily::Pseudo )
+ static_cast<SdStyleSheet*>(mpStyleSheet)->GetRealStyleSheet()->Broadcast(SfxHint(SfxHintId::DataChanged));
+ else
+ mpStyleSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/vectdlg.cxx b/sd/source/ui/dlg/vectdlg.cxx
new file mode 100644
index 000000000..2db041e7e
--- /dev/null
+++ b/sd/source/ui/dlg/vectdlg.cxx
@@ -0,0 +1,336 @@
+/* -*- 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 <vcl/vclenum.hxx>
+#include <vcl/BitmapReadAccess.hxx>
+#include <vcl/metaact.hxx>
+#include <vcl/BitmapSimpleColorQuantizationFilter.hxx>
+#include <vcl/svapp.hxx>
+
+#include <DrawDocShell.hxx>
+#include <sdmod.hxx>
+#include <sdiocmpt.hxx>
+#include <vectdlg.hxx>
+
+#define VECTORIZE_MAX_EXTENT 512
+
+SdVectorizeDlg::SdVectorizeDlg(weld::Window* pParent, const Bitmap& rBmp, ::sd::DrawDocShell* pDocShell)
+ : GenericDialogController(pParent, "modules/sdraw/ui/vectorize.ui", "VectorizeDialog")
+ , m_pDocSh(pDocShell)
+ , aBmp(rBmp)
+ , m_aBmpWin(m_xDialog.get())
+ , m_aMtfWin(m_xDialog.get())
+ , m_xNmLayers(m_xBuilder->weld_spin_button("colors"))
+ , m_xMtReduce(m_xBuilder->weld_metric_spin_button("points", FieldUnit::PIXEL))
+ , m_xFtFillHoles(m_xBuilder->weld_label("tilesft"))
+ , m_xMtFillHoles(m_xBuilder->weld_metric_spin_button("tiles", FieldUnit::PIXEL))
+ , m_xCbFillHoles(m_xBuilder->weld_check_button("fillholes"))
+ , m_xBmpWin(new weld::CustomWeld(*m_xBuilder, "source", m_aBmpWin))
+ , m_xMtfWin(new weld::CustomWeld(*m_xBuilder, "vectorized", m_aMtfWin))
+ , m_xPrgs(m_xBuilder->weld_progress_bar("progressbar"))
+ , m_xBtnOK(m_xBuilder->weld_button("ok"))
+ , m_xBtnPreview(m_xBuilder->weld_button("preview"))
+{
+ const int nWidth = m_xFtFillHoles->get_approximate_digit_width() * 32;
+ const int nHeight = m_xFtFillHoles->get_text_height() * 16;
+ m_xBmpWin->set_size_request(nWidth, nHeight);
+ m_xMtfWin->set_size_request(nWidth, nHeight);
+
+ m_xBtnPreview->connect_clicked( LINK( this, SdVectorizeDlg, ClickPreviewHdl ) );
+ m_xBtnOK->connect_clicked( LINK( this, SdVectorizeDlg, ClickOKHdl ) );
+ m_xNmLayers->connect_value_changed( LINK( this, SdVectorizeDlg, ModifyHdl ) );
+ m_xMtReduce->connect_value_changed( LINK( this, SdVectorizeDlg, MetricModifyHdl ) );
+ m_xMtFillHoles->connect_value_changed( LINK( this, SdVectorizeDlg, MetricModifyHdl ) );
+ m_xCbFillHoles->connect_toggled( LINK( this, SdVectorizeDlg, ToggleHdl ) );
+
+ LoadSettings();
+ InitPreviewBmp();
+}
+
+SdVectorizeDlg::~SdVectorizeDlg()
+{
+}
+
+::tools::Rectangle SdVectorizeDlg::GetRect( const Size& rDispSize, const Size& rBmpSize )
+{
+ ::tools::Rectangle aRect;
+
+ if( rBmpSize.Width() && rBmpSize.Height() && rDispSize.Width() && rDispSize.Height() )
+ {
+ Size aBmpSize( rBmpSize );
+ const double fGrfWH = static_cast<double>(aBmpSize.Width()) / aBmpSize.Height();
+ const double fWinWH = static_cast<double>(rDispSize.Width()) / rDispSize.Height();
+
+ if( fGrfWH < fWinWH )
+ {
+ aBmpSize.setWidth( static_cast<tools::Long>( rDispSize.Height() * fGrfWH ) );
+ aBmpSize.setHeight( rDispSize.Height() );
+ }
+ else
+ {
+ aBmpSize.setWidth( rDispSize.Width() );
+ aBmpSize.setHeight( static_cast<tools::Long>( rDispSize.Width() / fGrfWH) );
+ }
+
+ const Point aBmpPos( ( rDispSize.Width() - aBmpSize.Width() ) >> 1,
+ ( rDispSize.Height() - aBmpSize.Height() ) >> 1 );
+
+ aRect = ::tools::Rectangle( aBmpPos, aBmpSize );
+ }
+
+ return aRect;
+}
+
+void SdVectorizeDlg::InitPreviewBmp()
+{
+ const ::tools::Rectangle aRect( GetRect( m_aBmpWin.GetOutputSizePixel(), aBmp.GetSizePixel() ) );
+
+ aPreviewBmp = aBmp;
+ aPreviewBmp.Scale( aRect.GetSize() );
+ m_aBmpWin.SetGraphic(BitmapEx(aPreviewBmp));
+}
+
+Bitmap SdVectorizeDlg::GetPreparedBitmap( Bitmap const & rBmp, Fraction& rScale )
+{
+ Bitmap aNew( rBmp );
+ const Size aSizePix( aNew.GetSizePixel() );
+
+ if( aSizePix.Width() > VECTORIZE_MAX_EXTENT || aSizePix.Height() > VECTORIZE_MAX_EXTENT )
+ {
+ const ::tools::Rectangle aRect( GetRect( Size( VECTORIZE_MAX_EXTENT, VECTORIZE_MAX_EXTENT ), aSizePix ) );
+ rScale = Fraction( aSizePix.Width(), aRect.GetWidth() );
+ aNew.Scale( aRect.GetSize() );
+ }
+ else
+ rScale = Fraction( 1, 1 );
+
+ BitmapEx aNewBmpEx(aNew);
+ BitmapFilter::Filter(aNewBmpEx, BitmapSimpleColorQuantizationFilter(m_xNmLayers->get_value()));
+ aNew = aNewBmpEx.GetBitmap();
+
+ return aNew;
+}
+
+void SdVectorizeDlg::Calculate( Bitmap const & rBmp, GDIMetaFile& rMtf )
+{
+ m_pDocSh->SetWaitCursor( true );
+ m_xPrgs->set_percentage(0);
+
+ Fraction aScale;
+ Bitmap aTmp( GetPreparedBitmap( rBmp, aScale ) );
+
+ if( !aTmp.IsEmpty() )
+ {
+ const Link<::tools::Long,void> aPrgsHdl( LINK( this, SdVectorizeDlg, ProgressHdl ) );
+ aTmp.Vectorize( rMtf, static_cast<sal_uInt8>(m_xMtReduce->get_value(FieldUnit::NONE)), &aPrgsHdl );
+
+ if (m_xCbFillHoles->get_active())
+ {
+ GDIMetaFile aNewMtf;
+ Bitmap::ScopedReadAccess pRAcc(aTmp);
+
+ if( pRAcc )
+ {
+ const tools::Long nWidth = pRAcc->Width();
+ const tools::Long nHeight = pRAcc->Height();
+ const tools::Long nTileX = m_xMtFillHoles->get_value(FieldUnit::NONE);
+ const tools::Long nTileY = m_xMtFillHoles->get_value(FieldUnit::NONE);
+ assert(nTileX && "div-by-zero");
+ const tools::Long nCountX = nWidth / nTileX;
+ assert(nTileY && "div-by-zero");
+ const tools::Long nCountY = nHeight / nTileY;
+ const tools::Long nRestX = nWidth % nTileX;
+ const tools::Long nRestY = nHeight % nTileY;
+
+ MapMode aMap( rMtf.GetPrefMapMode() );
+ aNewMtf.SetPrefSize( rMtf.GetPrefSize() );
+ aNewMtf.SetPrefMapMode( aMap );
+
+ for( tools::Long nTY = 0; nTY < nCountY; nTY++ )
+ {
+ const tools::Long nY = nTY * nTileY;
+
+ for( tools::Long nTX = 0; nTX < nCountX; nTX++ )
+ AddTile( pRAcc.get(), aNewMtf, nTX * nTileX, nTY * nTileY, nTileX, nTileY );
+
+ if( nRestX )
+ AddTile( pRAcc.get(), aNewMtf, nCountX * nTileX, nY, nRestX, nTileY );
+ }
+
+ if( nRestY )
+ {
+ const tools::Long nY = nCountY * nTileY;
+
+ for( tools::Long nTX = 0; nTX < nCountX; nTX++ )
+ AddTile( pRAcc.get(), aNewMtf, nTX * nTileX, nY, nTileX, nRestY );
+
+ if( nRestX )
+ AddTile( pRAcc.get(), aNewMtf, nCountX * nTileX, nCountY * nTileY, nRestX, nRestY );
+ }
+
+ pRAcc.reset();
+
+ for( size_t n = 0, nCount = rMtf.GetActionSize(); n < nCount; n++ )
+ aNewMtf.AddAction( rMtf.GetAction( n )->Clone() );
+
+ aMap.SetScaleX( aMap.GetScaleX() * aScale );
+ aMap.SetScaleY( aMap.GetScaleY() * aScale );
+ aNewMtf.SetPrefMapMode( aMap );
+ rMtf = aNewMtf;
+ }
+ }
+ }
+
+ m_xPrgs->set_percentage(0);
+ m_pDocSh->SetWaitCursor( false );
+}
+
+void SdVectorizeDlg::AddTile( BitmapReadAccess const * pRAcc, GDIMetaFile& rMtf,
+ tools::Long nPosX, tools::Long nPosY, tools::Long nWidth, tools::Long nHeight )
+{
+ sal_uLong nSumR = 0, nSumG = 0, nSumB = 0;
+ const tools::Long nRight = nPosX + nWidth - 1;
+ const tools::Long nBottom = nPosY + nHeight - 1;
+ const double fMult = 1.0 / ( nWidth * nHeight );
+
+ for( tools::Long nY = nPosY; nY <= nBottom; nY++ )
+ {
+ for( tools::Long nX = nPosX; nX <= nRight; nX++ )
+ {
+ const BitmapColor aPixel( pRAcc->GetColor( nY, nX ) );
+
+ nSumR += aPixel.GetRed();
+ nSumG += aPixel.GetGreen();
+ nSumB += aPixel.GetBlue();
+ }
+ }
+
+ const Color aColor( static_cast<sal_uInt8>(FRound( nSumR * fMult )),
+ static_cast<sal_uInt8>(FRound( nSumG * fMult )),
+ static_cast<sal_uInt8>(FRound( nSumB * fMult )) );
+
+ ::tools::Rectangle aRect( Point( nPosX, nPosY ), Size( nWidth + 1, nHeight + 1 ) );
+ const Size& rMaxSize = rMtf.GetPrefSize();
+
+ aRect = Application::GetDefaultDevice()->PixelToLogic(aRect, rMtf.GetPrefMapMode());
+
+ if( aRect.Right() > ( rMaxSize.Width() - 1 ) )
+ aRect.SetRight( rMaxSize.Width() - 1 );
+
+ if( aRect.Bottom() > ( rMaxSize.Height() - 1 ) )
+ aRect.SetBottom( rMaxSize.Height() - 1 );
+
+ rMtf.AddAction( new MetaLineColorAction( aColor, true ) );
+ rMtf.AddAction( new MetaFillColorAction( aColor, true ) );
+ rMtf.AddAction( new MetaRectAction( aRect ) );
+}
+
+IMPL_LINK( SdVectorizeDlg, ProgressHdl, tools::Long, nData, void )
+{
+ m_xPrgs->set_percentage(nData);
+}
+
+IMPL_LINK_NOARG(SdVectorizeDlg, ClickPreviewHdl, weld::Button&, void)
+{
+ Calculate( aBmp, aMtf );
+ m_aMtfWin.SetGraphic( aMtf );
+ m_xBtnPreview->set_sensitive(false);
+}
+
+IMPL_LINK_NOARG(SdVectorizeDlg, ClickOKHdl, weld::Button&, void)
+{
+ if (m_xBtnPreview->get_sensitive())
+ Calculate( aBmp, aMtf );
+
+ SaveSettings();
+ m_xDialog->response(RET_OK);
+}
+
+IMPL_LINK( SdVectorizeDlg, ToggleHdl, weld::Toggleable&, rCb, void )
+{
+ if (rCb.get_active())
+ {
+ m_xFtFillHoles->set_sensitive(true);
+ m_xMtFillHoles->set_sensitive(true);
+ }
+ else
+ {
+ m_xFtFillHoles->set_sensitive(false);
+ m_xMtFillHoles->set_sensitive(false);
+ }
+
+ m_xBtnPreview->set_sensitive(true);
+}
+
+IMPL_LINK_NOARG(SdVectorizeDlg, ModifyHdl, weld::SpinButton&, void)
+{
+ m_xBtnPreview->set_sensitive(true);
+}
+
+IMPL_LINK_NOARG(SdVectorizeDlg, MetricModifyHdl, weld::MetricSpinButton&, void)
+{
+ m_xBtnPreview->set_sensitive(true);
+}
+
+void SdVectorizeDlg::LoadSettings()
+{
+ tools::SvRef<SotStorageStream> xIStm( SD_MOD()->GetOptionStream(
+ SD_OPTION_VECTORIZE ,
+ SdOptionStreamMode::Load ) );
+ sal_uInt16 nLayers;
+ sal_uInt16 nReduce;
+ sal_uInt16 nFillHoles;
+ bool bFillHoles;
+
+ if( xIStm.is() )
+ {
+ SdIOCompat aCompat( *xIStm, StreamMode::READ );
+ xIStm->ReadUInt16( nLayers ).ReadUInt16( nReduce ).ReadUInt16( nFillHoles ).ReadCharAsBool( bFillHoles );
+ }
+ else
+ {
+ nLayers = 8;
+ nReduce = 0;
+ nFillHoles = 32;
+ bFillHoles = false;
+ }
+
+ m_xNmLayers->set_value(nLayers);
+ m_xMtReduce->set_value(nReduce, FieldUnit::NONE);
+ m_xMtFillHoles->set_value(nFillHoles, FieldUnit::NONE);
+ m_xCbFillHoles->set_active(bFillHoles);
+
+ ToggleHdl(*m_xCbFillHoles);
+}
+
+void SdVectorizeDlg::SaveSettings() const
+{
+ tools::SvRef<SotStorageStream> xOStm( SD_MOD()->GetOptionStream(
+ SD_OPTION_VECTORIZE ,
+ SdOptionStreamMode::Store ) );
+
+ if( xOStm.is() )
+ {
+ SdIOCompat aCompat( *xOStm, StreamMode::WRITE, 1 );
+ xOStm->WriteUInt16( m_xNmLayers->get_value() ).WriteUInt16(m_xMtReduce->get_value(FieldUnit::NONE));
+ xOStm->WriteUInt16( m_xMtFillHoles->get_value(FieldUnit::NONE) ).WriteBool(m_xCbFillHoles->get_active());
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/docshell/docshel2.cxx b/sd/source/ui/docshell/docshel2.cxx
new file mode 100644
index 000000000..160c64a66
--- /dev/null
+++ b/sd/source/ui/docshell/docshel2.cxx
@@ -0,0 +1,416 @@
+/* -*- 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 <memory>
+#include <DrawDocShell.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svxdlg.hxx>
+#include <o3tl/string_view.hxx>
+
+#include <helpids.h>
+#include <ViewShell.hxx>
+#include <FrameView.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <ClientView.hxx>
+#include <Window.hxx>
+#include <strings.hrc>
+
+#include <sdresid.hxx>
+#include <fupoor.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/virdev.hxx>
+#include <rtl/character.hxx>
+#include <tools/debug.hxx>
+
+namespace sd {
+
+/**
+ * Drawing of DocShell (with the helper class SdDrawViewShell)
+ */
+void DrawDocShell::Draw(OutputDevice* pOut, const JobSetup&, sal_uInt16 nAspect)
+{
+ if (nAspect == ASPECT_THUMBNAIL)
+ {
+ // THUMBNAIL: here we may can set the draft mode
+ }
+
+ std::optional<ClientView> pView( std::in_place, this, pOut );
+
+ pView->SetHlplVisible(false);
+ pView->SetGridVisible(false);
+ pView->SetBordVisible(false);
+ pView->SetPageVisible(false);
+ pView->SetGlueVisible(false);
+
+ SdPage* pSelectedPage = nullptr;
+
+ const std::vector<std::unique_ptr<sd::FrameView>> &rViews = mpDoc->GetFrameViewList();
+ if( !rViews.empty() )
+ {
+ sd::FrameView* pFrameView = rViews[0].get();
+ if( pFrameView->GetPageKind() == PageKind::Standard )
+ {
+ sal_uInt16 nSelectedPage = pFrameView->GetSelectedPage();
+ pSelectedPage = mpDoc->GetSdPage(nSelectedPage, PageKind::Standard);
+ }
+ }
+
+ if( nullptr == pSelectedPage )
+ {
+ SdPage* pPage = nullptr;
+ sal_uInt16 nPageCnt = mpDoc->GetSdPageCount(PageKind::Standard);
+
+ for (sal_uInt16 i = 0; i < nPageCnt; i++)
+ {
+ pPage = mpDoc->GetSdPage(i, PageKind::Standard);
+
+ if ( pPage->IsSelected() )
+ pSelectedPage = pPage;
+ }
+
+ if( nullptr == pSelectedPage )
+ pSelectedPage = mpDoc->GetSdPage(0, PageKind::Standard);
+ }
+
+ ::tools::Rectangle aVisArea = GetVisArea(nAspect);
+ pOut->IntersectClipRegion(aVisArea);
+ pView->ShowSdrPage(pSelectedPage);
+
+ if (pOut->GetOutDevType() == OUTDEV_WINDOW)
+ return;
+
+ MapMode aOldMapMode = pOut->GetMapMode();
+
+ if (pOut->GetOutDevType() == OUTDEV_PRINTER)
+ {
+ MapMode aMapMode = aOldMapMode;
+ Point aOrigin = aMapMode.GetOrigin();
+ aOrigin.AdjustX(1 );
+ aOrigin.AdjustY(1 );
+ aMapMode.SetOrigin(aOrigin);
+ pOut->SetMapMode(aMapMode);
+ }
+
+ vcl::Region aRegion(aVisArea);
+ pView->CompleteRedraw(pOut, aRegion);
+
+ if (pOut->GetOutDevType() == OUTDEV_PRINTER)
+ {
+ pOut->SetMapMode(aOldMapMode);
+ }
+}
+
+::tools::Rectangle DrawDocShell::GetVisArea(sal_uInt16 nAspect) const
+{
+ ::tools::Rectangle aVisArea;
+
+ if( ( ASPECT_THUMBNAIL == nAspect ) || ( ASPECT_DOCPRINT == nAspect ) )
+ {
+ // provide size of first page
+ aVisArea.SetSize(mpDoc->GetSdPage(0, PageKind::Standard)->GetSize());
+ }
+ else
+ {
+ aVisArea = SfxObjectShell::GetVisArea(nAspect);
+ }
+
+ if (aVisArea.IsEmpty() && mpViewShell)
+ {
+ vcl::Window* pWin = mpViewShell->GetActiveWindow();
+
+ if (pWin)
+ {
+ aVisArea = pWin->PixelToLogic(::tools::Rectangle(Point(0,0), pWin->GetOutputSizePixel()));
+ }
+ }
+
+ return aVisArea;
+}
+
+void DrawDocShell::Connect(ViewShell* pViewSh)
+{
+ mpViewShell = pViewSh;
+}
+
+void DrawDocShell::Disconnect(ViewShell const * pViewSh)
+{
+ if (mpViewShell == pViewSh)
+ {
+ mpViewShell = nullptr;
+ }
+}
+
+FrameView* DrawDocShell::GetFrameView()
+{
+ FrameView* pFrameView = nullptr;
+
+ if (mpViewShell)
+ {
+ pFrameView = mpViewShell->GetFrameView();
+ }
+
+ return pFrameView;
+}
+
+/**
+ * Creates a bitmap of an arbitrary page
+ */
+BitmapEx DrawDocShell::GetPagePreviewBitmap(SdPage* pPage)
+{
+ const sal_uInt16 nMaxEdgePixel = 90;
+ MapMode aMapMode( MapUnit::Map100thMM );
+ const Size aSize( pPage->GetSize() );
+ const Point aNullPt;
+ ScopedVclPtrInstance< VirtualDevice > pVDev( *Application::GetDefaultDevice() );
+
+ pVDev->SetMapMode( aMapMode );
+
+ const Size aPixSize( pVDev->LogicToPixel( aSize ) );
+ const sal_uLong nMaxEdgePix = std::max( aPixSize.Width(), aPixSize.Height() );
+ Fraction aFrac( nMaxEdgePixel, nMaxEdgePix );
+
+ aMapMode.SetScaleX( aFrac );
+ aMapMode.SetScaleY( aFrac );
+ pVDev->SetMapMode( aMapMode );
+ pVDev->SetOutputSize( aSize );
+
+ // that we also get the dark lines at the right and bottom page margin
+ aFrac = Fraction( nMaxEdgePixel - 1, nMaxEdgePix );
+ aMapMode.SetScaleX( aFrac );
+ aMapMode.SetScaleY( aFrac );
+ pVDev->SetMapMode( aMapMode );
+
+ std::optional<ClientView> pView( std::in_place, this, pVDev );
+ FrameView* pFrameView = GetFrameView();
+ pView->ShowSdrPage( pPage );
+
+ if ( GetFrameView() )
+ {
+ // initialize the drawing-(screen) attributes
+ pView->SetGridCoarse( pFrameView->GetGridCoarse() );
+ pView->SetGridFine( pFrameView->GetGridFine() );
+ pView->SetSnapGridWidth(pFrameView->GetSnapGridWidthX(), pFrameView->GetSnapGridWidthY());
+ pView->SetGridVisible( pFrameView->IsGridVisible() );
+ pView->SetGridFront( pFrameView->IsGridFront() );
+ pView->SetSnapAngle( pFrameView->GetSnapAngle() );
+ pView->SetGridSnap( pFrameView->IsGridSnap() );
+ pView->SetBordSnap( pFrameView->IsBordSnap() );
+ pView->SetHlplSnap( pFrameView->IsHlplSnap() );
+ pView->SetOFrmSnap( pFrameView->IsOFrmSnap() );
+ pView->SetOPntSnap( pFrameView->IsOPntSnap() );
+ pView->SetOConSnap( pFrameView->IsOConSnap() );
+ pView->SetDragStripes( pFrameView->IsDragStripes() );
+ pView->SetFrameDragSingles( pFrameView->IsFrameDragSingles() );
+ pView->SetSnapMagneticPixel( pFrameView->GetSnapMagneticPixel() );
+ pView->SetMarkedHitMovesAlways( pFrameView->IsMarkedHitMovesAlways() );
+ pView->SetMoveOnlyDragging( pFrameView->IsMoveOnlyDragging() );
+ pView->SetSlantButShear( pFrameView->IsSlantButShear() );
+ pView->SetNoDragXorPolys( pFrameView->IsNoDragXorPolys() );
+ pView->SetCrookNoContortion( pFrameView->IsCrookNoContortion() );
+ pView->SetAngleSnapEnabled( pFrameView->IsAngleSnapEnabled() );
+ pView->SetBigOrtho( pFrameView->IsBigOrtho() );
+ pView->SetOrtho( pFrameView->IsOrtho() );
+
+ SdrPageView* pPageView = pView->GetSdrPageView();
+
+ if (pPageView)
+ {
+ if ( pPageView->GetVisibleLayers() != pFrameView->GetVisibleLayers() )
+ pPageView->SetVisibleLayers( pFrameView->GetVisibleLayers() );
+
+ if ( pPageView->GetPrintableLayers() != pFrameView->GetPrintableLayers() )
+ pPageView->SetPrintableLayers( pFrameView->GetPrintableLayers() );
+
+ if ( pPageView->GetLockedLayers() != pFrameView->GetLockedLayers() )
+ pPageView->SetLockedLayers( pFrameView->GetLockedLayers() );
+
+ pPageView->SetHelpLines( pFrameView->GetStandardHelpLines() );
+ }
+
+ if ( pView->GetActiveLayer() != pFrameView->GetActiveLayer() )
+ pView->SetActiveLayer( pFrameView->GetActiveLayer() );
+ }
+
+ pView->CompleteRedraw( pVDev, vcl::Region(::tools::Rectangle(aNullPt, aSize)) );
+
+ // IsRedrawReady() always gives sal_True while ( !pView->IsRedrawReady() ) {}
+ pView.reset();
+
+ pVDev->SetMapMode( MapMode() );
+
+ BitmapEx aPreview( pVDev->GetBitmapEx( aNullPt, pVDev->GetOutputSizePixel() ) );
+
+ DBG_ASSERT(!aPreview.IsEmpty(), "Preview-Bitmap could not be generated");
+
+ return aPreview;
+}
+
+/**
+ * Checks if the page exists. If so, we force the user to enter a not yet used
+ * name.
+ * @return sal_False if the user cancels the action.
+ */
+bool DrawDocShell::CheckPageName(weld::Window* pWin, OUString& rName)
+{
+ const OUString aStrForDlg( rName );
+ bool bIsNameValid = IsNewPageNameValid( rName, true );
+
+ if( ! bIsNameValid )
+ {
+ OUString aDesc;
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+
+ if (GetDocumentType() == DocumentType::Draw)
+ aDesc = SdResId( STR_WARN_PAGE_EXISTS_DRAW );
+ else
+ aDesc = SdResId( STR_WARN_PAGE_EXISTS );
+
+ ScopedVclPtr<AbstractSvxNameDialog> aNameDlg(pFact->CreateSvxNameDialog(pWin, aStrForDlg, aDesc));
+ aNameDlg->SetEditHelpId( HID_SD_NAMEDIALOG_PAGE );
+
+ aNameDlg->SetCheckNameHdl( LINK( this, DrawDocShell, RenameSlideHdl ) );
+
+ rtl::Reference<FuPoor> xFunc( mpViewShell->GetCurrentFunction() );
+ if( xFunc.is() )
+ xFunc->cancel();
+
+ if( aNameDlg->Execute() == RET_OK )
+ {
+ aNameDlg->GetName( rName );
+ bIsNameValid = IsNewPageNameValid( rName );
+ }
+ }
+
+ return bIsNameValid;
+}
+
+bool DrawDocShell::IsNewPageNameValid( OUString & rInOutPageName, bool bResetStringIfStandardName /* = false */ )
+{
+ bool bCanUseNewName = false;
+
+ // check if name is something like 'Slide n'
+ OUString aStrPage(SdResId(STR_SD_PAGE) + " ");
+
+ bool bIsStandardName = false;
+
+ // prevent also _future_ slide names of the form "'STR_SD_PAGE' + ' ' + '[0-9]+|[a-z]|[A-Z]|[CDILMVX]+|[cdilmvx]+'"
+ // (arabic, lower- and upper case single letter, lower- and upper case roman numbers)
+ if (rInOutPageName.startsWith(aStrPage) &&
+ rInOutPageName.getLength() > aStrPage.getLength())
+ {
+ sal_Int32 nIdx{ aStrPage.getLength() };
+ std::u16string_view sRemainder = o3tl::getToken(rInOutPageName, 0, ' ', nIdx);
+ if (!sRemainder.empty() && sRemainder[0] >= '0' && sRemainder[0] <= '9')
+ {
+ // check for arabic numbering
+
+ size_t nIndex = 1;
+ // skip all following numbers
+ while (nIndex < sRemainder.size() &&
+ sRemainder[nIndex] >= '0' && sRemainder[nIndex] <= '9')
+ {
+ nIndex++;
+ }
+
+ // EOL? Reserved name!
+ if (nIndex >= sRemainder.size())
+ {
+ bIsStandardName = true;
+ }
+ }
+ else if (sRemainder.size() == 1 &&
+ rtl::isAsciiLowerCase(sRemainder[0]))
+ {
+ // lower case, single character: reserved
+ bIsStandardName = true;
+ }
+ else if (sRemainder.size() == 1 &&
+ rtl::isAsciiUpperCase(sRemainder[0]))
+ {
+ // upper case, single character: reserved
+ bIsStandardName = true;
+ }
+ else
+ {
+ // check for upper/lower case roman numbering
+ OUString sReserved("cdilmvx");
+
+ // skip all following characters contained in one reserved class
+ if (sReserved.indexOf(sRemainder[0]) == -1)
+ sReserved = sReserved.toAsciiUpperCase();
+
+ size_t nIndex = 0;
+ while (nIndex < sRemainder.size() &&
+ sReserved.indexOf(sRemainder[nIndex]) != -1)
+ {
+ nIndex++;
+ }
+
+ // EOL? Reserved name!
+ if (nIndex >= sRemainder.size())
+ {
+ bIsStandardName = true;
+ }
+ }
+ }
+
+ if( bIsStandardName )
+ {
+ if( bResetStringIfStandardName )
+ {
+ // this is for insertion of slides from other files with standard
+ // name. They get a new standard name, if the string is set to an
+ // empty one.
+ rInOutPageName.clear();
+ bCanUseNewName = true;
+ }
+ else
+ bCanUseNewName = false;
+ }
+ else
+ {
+ if (!rInOutPageName.isEmpty())
+ {
+ bool bOutDummy;
+ sal_uInt16 nExistingPageNum = mpDoc->GetPageByName( rInOutPageName, bOutDummy );
+ bCanUseNewName = ( nExistingPageNum == SDRPAGE_NOTFOUND );
+ }
+ else
+ bCanUseNewName = false;
+ }
+
+ return bCanUseNewName;
+}
+
+bool DrawDocShell::IsPageNameUnique( std::u16string_view rPageName ) const
+{
+ return mpDoc->IsPageNameUnique(rPageName);
+}
+
+IMPL_LINK( DrawDocShell, RenameSlideHdl, AbstractSvxNameDialog&, rDialog, bool )
+{
+ OUString aNewName;
+ rDialog.GetName( aNewName );
+ return IsNewPageNameValid( aNewName );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/docshell/docshel3.cxx b/sd/source/ui/docshell/docshel3.cxx
new file mode 100644
index 000000000..be045818a
--- /dev/null
+++ b/sd/source/ui/docshell/docshel3.cxx
@@ -0,0 +1,443 @@
+/* -*- 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 <DrawDocShell.hxx>
+
+#include <svx/svxids.hrc>
+
+#include <svx/ofaitem.hxx>
+#include <svl/stritem.hxx>
+#include <svl/srchitem.hxx>
+#include <svl/languageoptions.hxx>
+#include <svtools/langtab.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/sfxdlg.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <vcl/abstdlg.hxx>
+#include <svx/drawitem.hxx>
+#include <editeng/langitem.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/editobj.hxx>
+#include <com/sun/star/i18n/TextConversionOption.hpp>
+#include <sfx2/notebookbar/SfxNotebookBar.hxx>
+#include <editeng/editeng.hxx>
+#include <osl/diagnose.h>
+
+#include <sdmod.hxx>
+#include <drawdoc.hxx>
+#include <fusearch.hxx>
+#include <ViewShell.hxx>
+#include <slideshow.hxx>
+#include <fuhhconv.hxx>
+#include <memory>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+
+namespace sd {
+
+static void lcl_setLanguageForObj( SdrObject *pObj, LanguageType nLang, bool bLanguageNone )
+{
+ const sal_uInt16 aLangWhichId_EE[3] =
+ {
+ EE_CHAR_LANGUAGE,
+ EE_CHAR_LANGUAGE_CJK,
+ EE_CHAR_LANGUAGE_CTL
+ };
+
+ if( bLanguageNone )
+ nLang = LANGUAGE_NONE;
+
+ if( nLang != LANGUAGE_DONTKNOW )
+ {
+ if( nLang == LANGUAGE_NONE )
+ {
+ for(sal_uInt16 n : aLangWhichId_EE)
+ pObj->SetMergedItem( SvxLanguageItem( nLang, n ) );
+ }
+ else
+ {
+ sal_uInt16 nLangWhichId = 0;
+ SvtScriptType nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( nLang );
+ switch (nScriptType)
+ {
+ case SvtScriptType::LATIN : nLangWhichId = EE_CHAR_LANGUAGE; break;
+ case SvtScriptType::ASIAN : nLangWhichId = EE_CHAR_LANGUAGE_CJK; break;
+ case SvtScriptType::COMPLEX : nLangWhichId = EE_CHAR_LANGUAGE_CTL; break;
+ default:
+ OSL_FAIL("unexpected case" );
+ return;
+ }
+ pObj->SetMergedItem( SvxLanguageItem( nLang, nLangWhichId ) );
+
+ // Reset shape text language to default, so it inherits the shape language set above.
+ OutlinerParaObject* pOutliner = pObj->GetOutlinerParaObject();
+ if (pOutliner)
+ {
+ EditTextObject& rEditTextObject
+ = const_cast<EditTextObject&>(pOutliner->GetTextObject());
+ for (sal_uInt16 n : aLangWhichId_EE)
+ {
+ rEditTextObject.RemoveCharAttribs(n);
+ }
+ }
+ }
+ }
+ else // Reset to default
+ {
+ for(sal_uInt16 n : aLangWhichId_EE)
+ pObj->ClearMergedItem( n );
+ }
+}
+
+static void lcl_setLanguage( const SdDrawDocument *pDoc, std::u16string_view rLanguage, bool bLanguageNone = false )
+{
+ LanguageType nLang = SvtLanguageTable::GetLanguageType( rLanguage );
+
+ // Do it for SdDrawDocument->SetLanguage as well?
+
+ sal_uInt16 nPageCount = pDoc->GetPageCount(); // Pick All Pages
+ for( sal_uInt16 nPage = 0; nPage < nPageCount; nPage++ )
+ {
+ const SdrPage *pPage = pDoc->GetPage( nPage );
+ const size_t nObjCount = pPage->GetObjCount();
+ for( size_t nObj = 0; nObj < nObjCount; ++nObj )
+ {
+ SdrObject *pObj = pPage->GetObj( nObj );
+ if (pObj->GetObjIdentifier() != SdrObjKind::Page)
+ lcl_setLanguageForObj( pObj, nLang, bLanguageNone );
+ }
+ }
+}
+
+/**
+ * Handles SFX-Requests
+ */
+void DrawDocShell::Execute( SfxRequest& rReq )
+{
+ if(mpViewShell && SlideShow::IsRunning( mpViewShell->GetViewShellBase() ))
+ {
+ // during a running presentation no slot will be executed
+ return;
+ }
+
+ switch ( rReq.GetSlot() )
+ {
+ case SID_SEARCH_ITEM:
+ {
+ const SfxItemSet* pReqArgs = rReq.GetArgs();
+
+ if (pReqArgs)
+ {
+ const SvxSearchItem & rSearchItem = pReqArgs->Get(SID_SEARCH_ITEM);
+
+ SD_MOD()->SetSearchItem(std::unique_ptr<SvxSearchItem>(rSearchItem.Clone()));
+ }
+
+ rReq.Done();
+ }
+ break;
+
+ case FID_SEARCH_ON:
+ {
+ // no action needed
+ rReq.Done();
+ }
+ break;
+
+ case FID_SEARCH_OFF:
+ {
+ if (mpViewShell)
+ {
+ sd::View* pView = mpViewShell->GetView();
+ if (pView)
+ {
+ auto& rFunctionContext = pView->getSearchContext();
+ rtl::Reference<FuSearch>& xFuSearch(rFunctionContext.getFunctionSearch());
+
+ if (xFuSearch.is())
+ {
+ // End Search&Replace in all docshells
+ SfxObjectShell* pFirstShell = SfxObjectShell::GetFirst();
+ SfxObjectShell* pShell = pFirstShell;
+
+ while (pShell)
+ {
+ auto pDrawDocShell = dynamic_cast<DrawDocShell*>(pShell);
+ if (pDrawDocShell)
+ pDrawDocShell->CancelSearching();
+
+ pShell = SfxObjectShell::GetNext(*pShell);
+
+ if (pShell == pFirstShell)
+ pShell = nullptr;
+ }
+
+ rFunctionContext.resetSearchFunction();
+ Invalidate();
+ rReq.Done();
+ }
+ }
+ }
+ }
+ break;
+
+ case FID_SEARCH_NOW:
+ {
+ const SfxItemSet* pReqArgs = rReq.GetArgs();
+
+ if (pReqArgs && mpViewShell)
+ {
+ sd::View* pView = mpViewShell->GetView();
+ if (pView)
+ {
+ rtl::Reference<FuSearch> & xFuSearch = pView->getSearchContext().getFunctionSearch();
+
+ if (!xFuSearch.is())
+ {
+ xFuSearch = rtl::Reference<FuSearch>(
+ FuSearch::createPtr(mpViewShell,
+ mpViewShell->GetActiveWindow(),
+ pView, mpDoc, rReq));
+
+ pView->getSearchContext().setSearchFunction(xFuSearch);
+ }
+
+ if (xFuSearch.is())
+ {
+ const SvxSearchItem& rSearchItem = pReqArgs->Get(SID_SEARCH_ITEM);
+
+ SD_MOD()->SetSearchItem(std::unique_ptr<SvxSearchItem>(rSearchItem.Clone()));
+ xFuSearch->SearchAndReplace(&rSearchItem);
+ }
+ }
+ }
+
+ rReq.Done();
+ }
+ break;
+
+ case SID_CLOSEDOC:
+ {
+ ExecuteSlot(rReq, SfxObjectShell::GetStaticInterface());
+ }
+ break;
+
+ case SID_GET_COLORLIST:
+ {
+ const SvxColorListItem* pColItem = GetItem( SID_COLOR_TABLE );
+ const XColorListRef& pList = pColItem->GetColorList();
+ rReq.SetReturnValue( OfaXColorListItem( SID_GET_COLORLIST, pList ) );
+ }
+ break;
+
+ case SID_VERSION:
+ {
+ ExecuteSlot( rReq, SfxObjectShell::GetStaticInterface() );
+ }
+ break;
+
+ case SID_HANGUL_HANJA_CONVERSION:
+ {
+ if( mpViewShell )
+ {
+ rtl::Reference<FuPoor> aFunc( FuHangulHanjaConversion::Create( mpViewShell, mpViewShell->GetActiveWindow(), mpViewShell->GetView(), mpDoc, rReq ) );
+ static_cast< FuHangulHanjaConversion* >( aFunc.get() )->StartConversion( LANGUAGE_KOREAN, LANGUAGE_KOREAN, nullptr, i18n::TextConversionOption::CHARACTER_BY_CHARACTER, true );
+ }
+ }
+ break;
+
+ case SID_CHINESE_CONVERSION:
+ {
+ if( mpViewShell )
+ {
+ rtl::Reference<FuPoor> aFunc( FuHangulHanjaConversion::Create( mpViewShell, mpViewShell->GetActiveWindow(), mpViewShell->GetView(), mpDoc, rReq ) );
+ static_cast< FuHangulHanjaConversion* >( aFunc.get() )->StartChineseConversion();
+ }
+ }
+ break;
+ case SID_LANGUAGE_STATUS:
+ {
+ OUString aNewLangTxt;
+ const SfxStringItem* pItem = rReq.GetArg<SfxStringItem>(SID_LANGUAGE_STATUS);
+ if (pItem)
+ aNewLangTxt = pItem->GetValue();
+
+ if (aNewLangTxt == "*" )
+ {
+ // open the dialog "Tools/Options/Language Settings - Language"
+ if (mpViewShell)
+ {
+ SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
+ ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateVclDialog( mpViewShell->GetFrameWeld(), SID_LANGUAGE_OPTIONS ));
+ pDlg->Execute();
+ }
+ }
+ else
+ {
+ if( mpViewShell )
+ {
+ // setting the new language...
+ if (!aNewLangTxt.isEmpty())
+ {
+ static const OUStringLiteral aSelectionLangPrefix(u"Current_");
+ static const OUStringLiteral aParagraphLangPrefix(u"Paragraph_");
+ static const OUStringLiteral aDocumentLangPrefix(u"Default_");
+
+ bool bSelection = false;
+ bool bParagraph = false;
+
+ SdDrawDocument* pDoc = mpViewShell->GetDoc();
+ sal_Int32 nPos = -1;
+ if (-1 != (nPos = aNewLangTxt.indexOf( aDocumentLangPrefix )))
+ {
+ aNewLangTxt = aNewLangTxt.replaceAt( nPos, aDocumentLangPrefix.getLength(), u"" );
+
+ if (aNewLangTxt == "LANGUAGE_NONE")
+ lcl_setLanguage( pDoc, u"", true );
+ else if (aNewLangTxt == "RESET_LANGUAGES")
+ lcl_setLanguage( pDoc, u"" );
+ else
+ lcl_setLanguage( pDoc, aNewLangTxt );
+ }
+ else if (-1 != (nPos = aNewLangTxt.indexOf( aSelectionLangPrefix )))
+ {
+ bSelection = true;
+ aNewLangTxt = aNewLangTxt.replaceAt( nPos, aSelectionLangPrefix.getLength(), u"" );
+ }
+ else if (-1 != (nPos = aNewLangTxt.indexOf( aParagraphLangPrefix )))
+ {
+ bParagraph = true;
+ aNewLangTxt = aNewLangTxt.replaceAt( nPos, aParagraphLangPrefix.getLength(), u"" );
+ }
+
+ if (bSelection || bParagraph)
+ {
+ SdrView* pSdrView = mpViewShell->GetDrawView();
+ if (!pSdrView)
+ return;
+
+ EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView();
+ const LanguageType nLangToUse = SvtLanguageTable::GetLanguageType( aNewLangTxt );
+ SvtScriptType nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( nLangToUse );
+
+ SfxItemSet aAttrs = rEditView.GetEditEngine()->GetEmptyItemSet();
+ if (nScriptType == SvtScriptType::LATIN)
+ aAttrs.Put( SvxLanguageItem( nLangToUse, EE_CHAR_LANGUAGE ) );
+ if (nScriptType == SvtScriptType::COMPLEX)
+ aAttrs.Put( SvxLanguageItem( nLangToUse, EE_CHAR_LANGUAGE_CTL ) );
+ if (nScriptType == SvtScriptType::ASIAN)
+ aAttrs.Put( SvxLanguageItem( nLangToUse, EE_CHAR_LANGUAGE_CJK ) );
+ ESelection aOldSel;
+ if (bParagraph)
+ {
+ ESelection aSel = rEditView.GetSelection();
+ aOldSel = aSel;
+ aSel.nStartPos = 0;
+ aSel.nEndPos = EE_TEXTPOS_ALL;
+ rEditView.SetSelection( aSel );
+ }
+
+ rEditView.SetAttribs( aAttrs );
+ if (bParagraph)
+ rEditView.SetSelection( aOldSel );
+ }
+
+ if ( pDoc->GetOnlineSpell() )
+ {
+ pDoc->StartOnlineSpelling();
+ }
+ }
+ }
+ }
+ Broadcast(SfxHint(SfxHintId::LanguageChanged));
+ }
+ break;
+ case SID_SPELLCHECK_IGNORE_ALL:
+ {
+ if (!mpViewShell)
+ return;
+ SdrView* pSdrView = mpViewShell->GetDrawView();
+ if (!pSdrView)
+ return;
+
+ EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView();
+ OUString sIgnoreText;
+ const SfxStringItem* pItem2 = rReq.GetArg<SfxStringItem>(FN_PARAM_1);
+ if (pItem2)
+ sIgnoreText = pItem2->GetValue();
+
+ if(sIgnoreText == "Spelling")
+ {
+ ESelection aOldSel = rEditView.GetSelection();
+ rEditView.SpellIgnoreWord();
+ rEditView.SetSelection( aOldSel );
+ }
+ }
+ break;
+ case SID_SPELLCHECK_APPLY_SUGGESTION:
+ {
+ if (!mpViewShell)
+ return;
+ SdrView* pSdrView = mpViewShell->GetDrawView();
+ if (!pSdrView)
+ return;
+
+ EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView();
+ OUString sApplyText;
+ const SfxStringItem* pItem2 = rReq.GetArg<SfxStringItem>(FN_PARAM_1);
+ if (pItem2)
+ sApplyText = pItem2->GetValue();
+
+ static const OUStringLiteral sSpellingRule(u"Spelling_");
+ sal_Int32 nPos = 0;
+ if(-1 != (nPos = sApplyText.indexOf( sSpellingRule )))
+ {
+ sApplyText = sApplyText.replaceAt(nPos, sSpellingRule.getLength(), u"");
+ rEditView.InsertText( sApplyText );
+ }
+ }
+ break;
+
+ case SID_NOTEBOOKBAR:
+ {
+ const SfxStringItem* pFile = rReq.GetArg<SfxStringItem>( SID_NOTEBOOKBAR );
+
+ if ( mpViewShell )
+ {
+ SfxBindings& rBindings( mpViewShell->GetFrame()->GetBindings() );
+
+ if ( sfx2::SfxNotebookBar::IsActive() )
+ sfx2::SfxNotebookBar::ExecMethod( rBindings, pFile ? pFile->GetValue() : "" );
+ else
+ sfx2::SfxNotebookBar::CloseMethod( rBindings );
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/docshell/docshel4.cxx b/sd/source/ui/docshell/docshel4.cxx
new file mode 100644
index 000000000..6fe599e44
--- /dev/null
+++ b/sd/source/ui/docshell/docshel4.cxx
@@ -0,0 +1,1002 @@
+/* -*- 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 <sal/log.hxx>
+
+#include <memory>
+#include <utility>
+
+#include <DrawDocShell.hxx>
+#include <com/sun/star/document/PrinterIndependentLayout.hpp>
+#include <editeng/outlobj.hxx>
+#include <tools/urlobj.hxx>
+#include <svx/svxids.hrc>
+#include <editeng/editeng.hxx>
+#include <editeng/editstat.hxx>
+#include <editeng/flstitem.hxx>
+#include <svl/flagitem.hxx>
+#include <sot/storage.hxx>
+#include <sfx2/dinfdlg.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/docfilt.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svx/svdotext.hxx>
+#include <sfx2/printer.hxx>
+#include <svtools/ctrltool.hxx>
+#include <comphelper/classids.hxx>
+#include <sot/formats.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <vcl/syswin.hxx>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+
+#include <app.hrc>
+#include <strings.hrc>
+#include <FrameView.hxx>
+#include <optsitem.hxx>
+#include <Outliner.hxx>
+#include <sdattr.hrc>
+#include <drawdoc.hxx>
+#include <ViewShell.hxx>
+#include <sdmod.hxx>
+#include <View.hxx>
+#include <EffectMigration.hxx>
+#include <CustomAnimationEffect.hxx>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <DrawViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <OutlineView.hxx>
+#include <OutlineViewShell.hxx>
+#include <sdxmlwrp.hxx>
+#include <sdpptwrp.hxx>
+#include <sdcgmfilter.hxx>
+#include <sdgrffilter.hxx>
+#include <sdhtmlfilter.hxx>
+#include <sdpdffilter.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <o3tl/string_view.hxx>
+
+#include <sfx2/zoomitem.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using ::sd::framework::FrameworkHelper;
+
+// PowerPoint-Filter
+constexpr OUStringLiteral pFilterPowerPoint97( u"MS PowerPoint 97" );
+constexpr OUStringLiteral pFilterPowerPoint97Template( u"MS PowerPoint 97 Vorlage" );
+constexpr OUStringLiteral pFilterPowerPoint97AutoPlay( u"MS PowerPoint 97 AutoPlay" );
+
+namespace sd {
+
+/**
+ * Creates (if necessary) and returns a SfxPrinter
+ */
+SfxPrinter* DrawDocShell::GetPrinter(bool bCreate)
+{
+ if (bCreate && !mpPrinter)
+ {
+ // create ItemSet with special pool area
+ auto pSet = std::make_unique<SfxItemSetFixed<
+ SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN,
+ SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC,
+ ATTR_OPTIONS_PRINT, ATTR_OPTIONS_PRINT>>( GetPool() );
+ // set PrintOptionsSet
+ SdOptionsPrintItem aPrintItem( SD_MOD()->GetSdOptions(mpDoc->GetDocumentType()) );
+ SfxFlagItem aFlagItem( SID_PRINTER_CHANGESTODOC );
+ SfxPrinterChangeFlags nFlags =
+ (aPrintItem.GetOptionsPrint().IsWarningSize() ? SfxPrinterChangeFlags::CHG_SIZE : SfxPrinterChangeFlags::NONE) |
+ (aPrintItem.GetOptionsPrint().IsWarningOrientation() ? SfxPrinterChangeFlags::CHG_ORIENTATION : SfxPrinterChangeFlags::NONE);
+ aFlagItem.SetValue( static_cast<int>(nFlags) );
+
+ pSet->Put( aPrintItem );
+ pSet->Put( SfxBoolItem( SID_PRINTER_NOTFOUND_WARN, aPrintItem.GetOptionsPrint().IsWarningPrinter() ) );
+ pSet->Put( aFlagItem );
+
+ mpPrinter = VclPtr<SfxPrinter>::Create(std::move(pSet));
+ mbOwnPrinter = true;
+
+ // set output quality
+ sal_uInt16 nQuality = aPrintItem.GetOptionsPrint().GetOutputQuality();
+
+ DrawModeFlags nMode = DrawModeFlags::Default;
+ // 1 == Grayscale, 2 == Black & White (with grayscale images)
+ if( nQuality == 1 )
+ nMode = DrawModeFlags::GrayLine | DrawModeFlags::GrayFill | DrawModeFlags::GrayText | DrawModeFlags::GrayBitmap | DrawModeFlags::GrayGradient;
+ else if( nQuality == 2 )
+ nMode = DrawModeFlags::BlackLine | DrawModeFlags::WhiteFill | DrawModeFlags::BlackText | DrawModeFlags::GrayBitmap | DrawModeFlags::WhiteGradient;
+
+ mpPrinter->SetDrawMode( nMode );
+
+ MapMode aMM (mpPrinter->GetMapMode());
+ aMM.SetMapUnit(MapUnit::Map100thMM);
+ mpPrinter->SetMapMode(aMM);
+ UpdateRefDevice();
+ }
+ return mpPrinter;
+}
+
+/**
+ * Set new SfxPrinter (transfer of ownership)
+ */
+void DrawDocShell::SetPrinter(SfxPrinter *pNewPrinter)
+{
+ if ( mpViewShell )
+ {
+ ::sd::View* pView = mpViewShell->GetView();
+ if ( pView->IsTextEdit() )
+ pView->SdrEndTextEdit();
+ }
+
+ if ( mpPrinter && mbOwnPrinter && (mpPrinter.get() != pNewPrinter) )
+ mpPrinter.disposeAndClear();
+
+ mpPrinter = pNewPrinter;
+ mbOwnPrinter = true;
+ if ( mpDoc->GetPrinterIndependentLayout() == css::document::PrinterIndependentLayout::DISABLED )
+ UpdateFontList();
+ UpdateRefDevice();
+}
+
+void DrawDocShell::UpdateFontList()
+{
+ mpFontList.reset();
+ OutputDevice* pRefDevice = nullptr;
+ if ( mpDoc->GetPrinterIndependentLayout() == css::document::PrinterIndependentLayout::DISABLED )
+ pRefDevice = GetPrinter(true);
+ else
+ pRefDevice = SD_MOD()->GetVirtualRefDevice();
+ mpFontList.reset( new FontList(pRefDevice, nullptr) );
+ SvxFontListItem aFontListItem( mpFontList.get(), SID_ATTR_CHAR_FONTLIST );
+ PutItem( aFontListItem );
+}
+
+Printer* DrawDocShell::GetDocumentPrinter()
+{
+ return GetPrinter(false);
+}
+
+void DrawDocShell::OnDocumentPrinterChanged(Printer* pNewPrinter)
+{
+ // if we already have a printer, see if it's the same
+ if( mpPrinter )
+ {
+ // easy case
+ if( mpPrinter == pNewPrinter )
+ return;
+
+ // compare if it's the same printer with the same job setup
+ if( (mpPrinter->GetName() == pNewPrinter->GetName()) &&
+ (mpPrinter->GetJobSetup() == pNewPrinter->GetJobSetup()))
+ return;
+ }
+
+ SfxPrinter* const pSfxPrinter = dynamic_cast<SfxPrinter*>(pNewPrinter);
+ if (pSfxPrinter)
+ {
+ SetPrinter(pSfxPrinter);
+
+ // container owns printer
+ mbOwnPrinter = false;
+ }
+}
+
+void DrawDocShell::UpdateRefDevice()
+{
+ if( !mpDoc )
+ return;
+
+ // Determine the device for which the output will be formatted.
+ VclPtr< OutputDevice > pRefDevice;
+ switch (mpDoc->GetPrinterIndependentLayout())
+ {
+ case css::document::PrinterIndependentLayout::DISABLED:
+ pRefDevice = mpPrinter.get();
+ break;
+
+ case css::document::PrinterIndependentLayout::ENABLED:
+ pRefDevice = SD_MOD()->GetVirtualRefDevice();
+ break;
+
+ default:
+ // We are confronted with an invalid or un-implemented
+ // layout mode. Use the printer as formatting device
+ // as a fall-back.
+ SAL_WARN( "sd", "DrawDocShell::UpdateRefDevice(): Unexpected printer layout mode");
+
+ pRefDevice = mpPrinter.get();
+ break;
+ }
+ mpDoc->SetRefDevice( pRefDevice.get() );
+
+ SdOutliner* pOutl = mpDoc->GetOutliner( false );
+
+ if( pOutl )
+ pOutl->SetRefDevice( pRefDevice );
+
+ SdOutliner* pInternalOutl = mpDoc->GetInternalOutliner( false );
+
+ if( pInternalOutl )
+ pInternalOutl->SetRefDevice( pRefDevice );
+}
+
+/**
+ * Creates new document, opens streams
+ */
+bool DrawDocShell::InitNew( const css::uno::Reference< css::embed::XStorage >& xStorage )
+{
+ bool bRet = SfxObjectShell::InitNew( xStorage );
+
+ ::tools::Rectangle aVisArea( Point(0, 0), Size(14100, 10000) );
+ SetVisArea(aVisArea);
+
+ if (bRet)
+ {
+ if( !mbSdDataObj )
+ mpDoc->NewOrLoadCompleted(DocCreationMode::New); // otherwise calling
+ // NewOrLoadCompleted(NEW_LOADED) in
+ // SdDrawDocument::AllocModel()
+ }
+ return bRet;
+}
+
+/**
+ * loads pools and document
+ */
+bool DrawDocShell::Load( SfxMedium& rMedium )
+{
+ // If this is an ODF file being loaded, then by default, use legacy processing
+ // for tdf#99729 (if required, it will be overridden in *::ReadUserDataSequence())
+ if (IsOwnStorageFormat(rMedium))
+ {
+ mpDoc->SetAnchoredTextOverflowLegacy(true);
+ }
+
+ bool bRet = false;
+ bool bStartPresentation = false;
+ ErrCode nError = ERRCODE_NONE;
+
+ SfxItemSet* pSet = rMedium.GetItemSet();
+
+ if( pSet )
+ {
+ if( ( SfxItemState::SET == pSet->GetItemState(SID_PREVIEW ) ) && pSet->Get( SID_PREVIEW ).GetValue() )
+ {
+ mpDoc->SetStarDrawPreviewMode( true );
+ }
+
+ if( SfxItemState::SET == pSet->GetItemState(SID_DOC_STARTPRESENTATION)&&
+ pSet->Get( SID_DOC_STARTPRESENTATION ).GetValue() )
+ {
+ bStartPresentation = true;
+ mpDoc->SetStartWithPresentation( true );
+ }
+ }
+
+ bRet = SfxObjectShell::Load( rMedium );
+ if (bRet)
+ {
+ comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = getEmbeddedObjectContainer();
+ rEmbeddedObjectContainer.setUserAllowsLinkUpdate(false);
+ bRet = SdXMLFilter( rMedium, *this, SdXMLFilterMode::Normal, SotStorage::GetVersion( rMedium.GetStorage() ) ).Import( nError );
+ }
+
+ if( bRet )
+ {
+ // for legacy markup in OOoXML filter, convert the animations now
+ EffectMigration::DocumentLoaded(*GetDoc());
+ UpdateTablePointers();
+
+ // If we're an embedded OLE object, use tight bounds
+ // for our visArea. No point in showing the user lots of empty
+ // space. Had to remove the check for empty VisArea below,
+ // since XML load always sets a VisArea before.
+ //TODO/LATER: looks a little bit strange!
+ if( ( GetCreateMode() == SfxObjectCreateMode::EMBEDDED ) && SfxObjectShell::GetVisArea( ASPECT_CONTENT ).IsEmpty() )
+ {
+ SdPage* pPage = mpDoc->GetSdPage( 0, PageKind::Standard );
+
+ if( pPage )
+ SetVisArea( pPage->GetAllObjBoundRect() );
+ }
+
+ FinishedLoading();
+
+ const INetURLObject aUrl;
+ SfxObjectShell::SetAutoLoad( aUrl, 0, false );
+ }
+ else
+ {
+ if( nError == ERRCODE_IO_BROKENPACKAGE )
+ SetError(ERRCODE_IO_BROKENPACKAGE);
+
+ // TODO/LATER: correct error handling?!
+ //pStore->SetError(SVSTREAM_WRONGVERSION);
+ else
+ SetError(ERRCODE_ABORT);
+ }
+
+ // tell SFX to change viewshell when in preview mode
+ if( IsPreview() || bStartPresentation )
+ {
+ SfxItemSet *pMediumSet = GetMedium()->GetItemSet();
+ if( pMediumSet )
+ pMediumSet->Put( SfxUInt16Item( SID_VIEW_ID, bStartPresentation ? 1 : 5 ) );
+ }
+
+ return bRet;
+}
+
+/**
+ * loads content for organizer
+ */
+bool DrawDocShell::LoadFrom( SfxMedium& rMedium )
+{
+ std::unique_ptr<weld::WaitObject> pWait;
+ if( mpViewShell )
+ pWait.reset(new weld::WaitObject(mpViewShell->GetFrameWeld()));
+
+ mpDoc->NewOrLoadCompleted( DocCreationMode::New );
+ mpDoc->CreateFirstPages();
+ mpDoc->StopWorkStartupDelay();
+
+ // TODO/LATER: nobody is interested in the error code?!
+ ErrCode nError = ERRCODE_NONE;
+ bool bRet = SdXMLFilter( rMedium, *this, SdXMLFilterMode::Organizer, SotStorage::GetVersion( rMedium.GetStorage() ) ).Import( nError );
+
+ // tell SFX to change viewshell when in preview mode
+ if( IsPreview() )
+ {
+ SfxItemSet *pSet = GetMedium()->GetItemSet();
+
+ if( pSet )
+ pSet->Put( SfxUInt16Item( SID_VIEW_ID, 5 ) );
+ }
+
+ return bRet;
+}
+
+/**
+ * load from 3rd party format
+ */
+bool DrawDocShell::ImportFrom(SfxMedium &rMedium,
+ uno::Reference<text::XTextRange> const& xInsertPosition)
+{
+ const OUString aFilterName( rMedium.GetFilter()->GetFilterName() );
+ if (aFilterName == "Impress MS PowerPoint 2007 XML" ||
+ aFilterName == "Impress MS PowerPoint 2007 XML AutoPlay" ||
+ aFilterName == "Impress MS PowerPoint 2007 XML VBA")
+ {
+ // As this is a MSFT format, we should use the "MS Compat"
+ // mode for spacing before and after paragraphs.
+
+ // This is copied from what is done for .ppt import in
+ // ImplSdPPTImport::Import() in sd/source/filter/ppt/pptin.cxx
+ // in. We need to tell both the edit engine of the draw outliner,
+ // and the document, to do "summation of paragraphs".
+ SdrOutliner& rOutl = mpDoc->GetDrawOutliner();
+ EEControlBits nControlWord = rOutl.GetEditEngine().GetControlWord();
+ nControlWord |= EEControlBits::ULSPACESUMMATION;
+ const_cast<EditEngine&>(rOutl.GetEditEngine()).SetControlWord( nControlWord );
+
+ mpDoc->SetSummationOfParagraphs();
+ }
+
+ if (aFilterName == "Impress MS PowerPoint 2007 XML" ||
+ aFilterName == "Impress MS PowerPoint 2007 XML AutoPlay" ||
+ aFilterName == "Impress MS PowerPoint 2007 XML VBA" ||
+ aFilterName == "Impress Office Open XML")
+ {
+ // We need to be able to set the default tab size for each text object.
+ // This is possible at the moment only for the whole document. See
+ // TextParagraphPropertiesContext constructor. So default tab width
+ // of the LibreOffice is 1270 but MSO is 2540 on general settings.
+ mpDoc->SetDefaultTabulator( 2540 );
+ }
+
+ const bool bRet = SfxObjectShell::ImportFrom(rMedium, xInsertPosition);
+
+ SfxItemSet* pSet = rMedium.GetItemSet();
+ if( pSet )
+ {
+ if( SfxItemState::SET == pSet->GetItemState(SID_DOC_STARTPRESENTATION)&&
+ pSet->Get( SID_DOC_STARTPRESENTATION ).GetValue() )
+ {
+ mpDoc->SetStartWithPresentation( true );
+
+ // tell SFX to change viewshell when in preview mode
+ if( IsPreview() )
+ {
+ SfxItemSet *pMediumSet = GetMedium()->GetItemSet();
+ if( pMediumSet )
+ pMediumSet->Put( SfxUInt16Item( SID_VIEW_ID, 1 ) );
+ }
+ }
+ }
+
+ return bRet;
+}
+
+/**
+ * load from a foreign format
+ */
+bool DrawDocShell::ConvertFrom( SfxMedium& rMedium )
+{
+ const OUString aFilterName( rMedium.GetFilter()->GetFilterName() );
+ bool bRet = false;
+ bool bStartPresentation = false;
+
+ SetWaitCursor( true );
+
+ SfxItemSet* pSet = rMedium.GetItemSet();
+ if( pSet )
+ {
+ if( ( SfxItemState::SET == pSet->GetItemState(SID_PREVIEW ) ) && pSet->Get( SID_PREVIEW ).GetValue() )
+ {
+ mpDoc->SetStarDrawPreviewMode( true );
+ }
+
+ if( SfxItemState::SET == pSet->GetItemState(SID_DOC_STARTPRESENTATION)&&
+ pSet->Get( SID_DOC_STARTPRESENTATION ).GetValue() )
+ {
+ bStartPresentation = true;
+ mpDoc->SetStartWithPresentation( true );
+ }
+ }
+
+ if( aFilterName == pFilterPowerPoint97
+ || aFilterName == pFilterPowerPoint97Template
+ || aFilterName == pFilterPowerPoint97AutoPlay)
+ {
+ mpDoc->StopWorkStartupDelay();
+ bRet = SdPPTFilter( rMedium, *this ).Import();
+ }
+ else if (aFilterName.indexOf("impress8") >= 0 ||
+ aFilterName.indexOf("draw8") >= 0)
+ {
+ // TODO/LATER: nobody is interested in the error code?!
+ mpDoc->CreateFirstPages();
+ mpDoc->StopWorkStartupDelay();
+ ErrCode nError = ERRCODE_NONE;
+ bRet = SdXMLFilter( rMedium, *this ).Import( nError );
+
+ }
+ else if (aFilterName.indexOf("StarOffice XML (Draw)") >= 0 ||
+ aFilterName.indexOf("StarOffice XML (Impress)") >= 0)
+ {
+ // TODO/LATER: nobody is interested in the error code?!
+ mpDoc->CreateFirstPages();
+ mpDoc->StopWorkStartupDelay();
+ ErrCode nError = ERRCODE_NONE;
+ bRet = SdXMLFilter( rMedium, *this, SdXMLFilterMode::Normal, SOFFICE_FILEFORMAT_60 ).Import( nError );
+ }
+ else if (aFilterName == "CGM - Computer Graphics Metafile")
+ {
+ mpDoc->CreateFirstPages();
+ mpDoc->StopWorkStartupDelay();
+ bRet = SdCGMFilter( rMedium, *this ).Import();
+ }
+ else if (aFilterName == "draw_pdf_import")
+ {
+ mpDoc->CreateFirstPages();
+ mpDoc->StopWorkStartupDelay();
+ bRet = SdPdfFilter(rMedium, *this).Import();
+ }
+ else
+ {
+ mpDoc->CreateFirstPages();
+ mpDoc->StopWorkStartupDelay();
+ bRet = SdGRFFilter( rMedium, *this ).Import();
+ }
+
+ FinishedLoading();
+
+ // tell SFX to change viewshell when in preview mode
+ if( IsPreview() )
+ {
+ SfxItemSet *pMediumSet = GetMedium()->GetItemSet();
+
+ if( pMediumSet )
+ pMediumSet->Put( SfxUInt16Item( SID_VIEW_ID, 5 ) );
+ }
+ SetWaitCursor( false );
+
+ // tell SFX to change viewshell when in preview mode
+ if( IsPreview() || bStartPresentation )
+ {
+ SfxItemSet *pMediumSet = GetMedium()->GetItemSet();
+ if( pMediumSet )
+ pMediumSet->Put( SfxUInt16Item( SID_VIEW_ID, bStartPresentation ? 1 : 5 ) );
+ }
+
+ return bRet;
+}
+
+/**
+ * Writes pools and document to the open streams
+ */
+bool DrawDocShell::Save()
+{
+ mpDoc->StopWorkStartupDelay();
+
+ //TODO/LATER: why this?!
+ if( GetCreateMode() == SfxObjectCreateMode::STANDARD )
+ SfxObjectShell::SetVisArea( ::tools::Rectangle() );
+
+ bool bRet = SfxObjectShell::Save();
+
+ if( bRet )
+ bRet = SdXMLFilter( *GetMedium(), *this, SdXMLFilterMode::Normal, SotStorage::GetVersion( GetMedium()->GetStorage() ) ).Export();
+
+ return bRet;
+}
+
+/**
+ * Writes pools and document to the provided storage
+ */
+bool DrawDocShell::SaveAs( SfxMedium& rMedium )
+{
+ mpDoc->setDocAccTitle(OUString());
+ if (SfxViewFrame* pFrame1 = SfxViewFrame::GetFirst(this))
+ {
+ if (vcl::Window* pSysWin = pFrame1->GetWindow().GetSystemWindow())
+ {
+ pSysWin->SetAccessibleName(OUString());
+ }
+ }
+ mpDoc->StopWorkStartupDelay();
+
+ //With custom animation, if Outliner is modified, update text before saving
+ if( mpViewShell )
+ {
+ SdPage* pPage = mpViewShell->getCurrentPage();
+ if( pPage && pPage->getMainSequence()->getCount() )
+ {
+ SdrObject* pObj = mpViewShell->GetView()->GetTextEditObject();
+ SdrOutliner* pOutl = mpViewShell->GetView()->GetTextEditOutliner();
+ if( pObj && pOutl && pOutl->IsModified() )
+ {
+ std::optional<OutlinerParaObject> pNewText = pOutl->CreateParaObject( 0, pOutl->GetParagraphCount() );
+ pObj->SetOutlinerParaObject( std::move(pNewText) );
+ pOutl->ClearModifyFlag();
+ }
+ }
+ }
+
+ //TODO/LATER: why this?!
+ if( GetCreateMode() == SfxObjectCreateMode::STANDARD )
+ SfxObjectShell::SetVisArea( ::tools::Rectangle() );
+
+ bool bRet = SfxObjectShell::SaveAs( rMedium );
+
+ if( bRet )
+ bRet = SdXMLFilter( rMedium, *this, SdXMLFilterMode::Normal, SotStorage::GetVersion( rMedium.GetStorage() ) ).Export();
+
+ if( GetError() == ERRCODE_NONE )
+ SetError(ERRCODE_NONE);
+
+ return bRet;
+}
+
+/**
+ * save to foreign format
+ */
+bool DrawDocShell::ConvertTo( SfxMedium& rMedium )
+{
+ bool bRet = false;
+
+ if( mpDoc->GetPageCount() )
+ {
+ std::shared_ptr<const SfxFilter> pMediumFilter = rMedium.GetFilter();
+ const OUString aTypeName( pMediumFilter->GetTypeName() );
+ std::unique_ptr<SdFilter> xFilter;
+
+ if( aTypeName.indexOf( "graphic_HTML" ) >= 0 )
+ {
+ xFilter = std::make_unique<SdHTMLFilter>(rMedium, *this);
+ }
+ else if( aTypeName.indexOf( "MS_PowerPoint_97" ) >= 0 )
+ {
+ xFilter = std::make_unique<SdPPTFilter>(rMedium, *this);
+ static_cast<SdPPTFilter*>(xFilter.get())->PreSaveBasic();
+ }
+ else if ( aTypeName.indexOf( "CGM_Computer_Graphics_Metafile" ) >= 0 )
+ {
+ xFilter = std::make_unique<SdCGMFilter>(rMedium, *this);
+ }
+ else if( aTypeName.indexOf( "draw8" ) >= 0 ||
+ aTypeName.indexOf( "impress8" ) >= 0 )
+ {
+ xFilter = std::make_unique<SdXMLFilter>(rMedium, *this);
+ }
+ else if( aTypeName.indexOf( "StarOffice_XML_Impress" ) >= 0 ||
+ aTypeName.indexOf( "StarOffice_XML_Draw" ) >= 0 )
+ {
+ xFilter = std::make_unique<SdXMLFilter>(rMedium, *this, SdXMLFilterMode::Normal, SOFFICE_FILEFORMAT_60);
+ }
+ else
+ {
+ xFilter = std::make_unique<SdGRFFilter>(rMedium, *this);
+ }
+
+ if (xFilter)
+ {
+ if ( mpViewShell )
+ {
+ ::sd::View* pView = mpViewShell->GetView();
+ if ( pView->IsTextEdit() )
+ pView->SdrEndTextEdit();
+ }
+
+ bRet = xFilter->Export();
+ }
+ }
+
+ return bRet;
+}
+
+/**
+ * Reopen own streams to ensure that nobody else can prevent use from opening
+ * them.
+ */
+bool DrawDocShell::SaveCompleted( const css::uno::Reference< css::embed::XStorage >& xStorage )
+{
+ bool bRet = false;
+
+ if( SfxObjectShell::SaveCompleted(xStorage) )
+ {
+ mpDoc->NbcSetChanged( false );
+
+ if( mpViewShell )
+ {
+ if( dynamic_cast< OutlineViewShell *>( mpViewShell ) != nullptr )
+ static_cast<OutlineView*>(mpViewShell->GetView())
+ ->GetOutliner().ClearModifyFlag();
+
+ SdrOutliner* pOutl = mpViewShell->GetView()->GetTextEditOutliner();
+ if( pOutl )
+ {
+ SdrObject* pObj = mpViewShell->GetView()->GetTextEditObject();
+ if( pObj )
+ pObj->NbcSetOutlinerParaObject( pOutl->CreateParaObject() );
+
+ pOutl->ClearModifyFlag();
+ }
+ }
+
+ bRet = true;
+
+ SfxViewFrame* pFrame = ( mpViewShell && mpViewShell->GetViewFrame() ) ?
+ mpViewShell->GetViewFrame() :
+ SfxViewFrame::Current();
+
+ if( pFrame )
+ pFrame->GetBindings().Invalidate( SID_NAVIGATOR_STATE, true );
+ }
+ return bRet;
+}
+
+SfxStyleSheetBasePool* DrawDocShell::GetStyleSheetPool()
+{
+ return mpDoc->GetStyleSheetPool();
+}
+
+void DrawDocShell::GotoBookmark(std::u16string_view rBookmark)
+{
+ auto pDrawViewShell = dynamic_cast<DrawViewShell *>( mpViewShell );
+ if (!pDrawViewShell)
+ return;
+
+ ViewShellBase& rBase (mpViewShell->GetViewShellBase());
+
+ bool bIsMasterPage = false;
+ sal_uInt16 nPageNumber = SDRPAGE_NOTFOUND;
+ SdrObject* pObj = nullptr;
+
+ static constexpr std::u16string_view sInteraction( u"action?" );
+ if ( o3tl::starts_with(rBookmark, sInteraction ) )
+ {
+ static constexpr std::u16string_view sJump( u"jump=" );
+ if ( o3tl::starts_with(rBookmark.substr( sInteraction.size() ), sJump ) )
+ {
+ std::u16string_view aDestination( rBookmark.substr( sInteraction.size() + sJump.size() ) );
+ if ( o3tl::starts_with(aDestination, u"firstslide" ) )
+ {
+ nPageNumber = 1;
+ }
+ else if ( o3tl::starts_with(aDestination, u"lastslide" ) )
+ {
+ nPageNumber = mpDoc->GetPageCount() - 2;
+ }
+ else if ( o3tl::starts_with(aDestination, u"previousslide" ) )
+ {
+ SdPage* pPage = pDrawViewShell->GetActualPage();
+ nPageNumber = pPage->GetPageNum();
+ nPageNumber = nPageNumber > 2 ? nPageNumber - 2 : SDRPAGE_NOTFOUND;
+ }
+ else if ( o3tl::starts_with(aDestination, u"nextslide" ) )
+ {
+ SdPage* pPage = pDrawViewShell->GetActualPage();
+ nPageNumber = pPage->GetPageNum() + 2;
+ if ( nPageNumber >= mpDoc->GetPageCount() )
+ nPageNumber = SDRPAGE_NOTFOUND;
+ }
+ }
+ }
+ else
+ {
+ // Is the bookmark a page?
+ nPageNumber = mpDoc->GetPageByName( rBookmark, bIsMasterPage );
+
+ if (nPageNumber == SDRPAGE_NOTFOUND)
+ {
+ // Is the bookmark an object?
+ pObj = mpDoc->GetObj(rBookmark);
+
+ if (pObj)
+ {
+ nPageNumber = pObj->getSdrPageFromSdrObject()->GetPageNum();
+ }
+ }
+ }
+ if (nPageNumber != SDRPAGE_NOTFOUND)
+ {
+ // Jump to the bookmarked page. This is done in three steps.
+
+ SdPage* pPage;
+ if (bIsMasterPage)
+ pPage = static_cast<SdPage*>( mpDoc->GetMasterPage(nPageNumber) );
+ else
+ pPage = static_cast<SdPage*>( mpDoc->GetPage(nPageNumber) );
+
+ // 1.) Change the view shell to the edit view, the notes view,
+ // or the handout view.
+ PageKind eNewPageKind = pPage->GetPageKind();
+
+ if( (eNewPageKind != PageKind::Standard) && (mpDoc->GetDocumentType() == DocumentType::Draw) )
+ return;
+
+ if (eNewPageKind != pDrawViewShell->GetPageKind())
+ {
+ // change work area
+ GetFrameView()->SetPageKind(eNewPageKind);
+ OUString sViewURL;
+ switch (eNewPageKind)
+ {
+ case PageKind::Standard:
+ sViewURL = FrameworkHelper::msImpressViewURL;
+ break;
+ case PageKind::Notes:
+ sViewURL = FrameworkHelper::msNotesViewURL;
+ break;
+ case PageKind::Handout:
+ sViewURL = FrameworkHelper::msHandoutViewURL;
+ break;
+ default:
+ break;
+ }
+ if (!sViewURL.isEmpty())
+ {
+ std::shared_ptr<FrameworkHelper> pHelper (
+ FrameworkHelper::Instance(rBase));
+ pHelper->RequestView(
+ sViewURL,
+ FrameworkHelper::msCenterPaneURL);
+ pHelper->WaitForUpdate();
+
+ // Get the new DrawViewShell.
+ mpViewShell = pHelper->GetViewShell(FrameworkHelper::msCenterPaneURL).get();
+ pDrawViewShell = dynamic_cast<sd::DrawViewShell*>(mpViewShell);
+ }
+ else
+ {
+ pDrawViewShell = nullptr;
+ }
+ }
+
+ if (pDrawViewShell != nullptr)
+ {
+ setEditMode(pDrawViewShell, bIsMasterPage);
+
+ // Make the bookmarked page the current page. This is done
+ // by using the API because this takes care of all the
+ // little things to be done. Especially writing the view
+ // data to the frame view.
+ sal_uInt16 nSdPgNum = (nPageNumber - 1) / 2;
+ Reference<drawing::XDrawView> xController (rBase.GetController(), UNO_QUERY);
+ if (xController.is())
+ {
+ Reference<drawing::XDrawPage> xDrawPage (pPage->getUnoPage(), UNO_QUERY);
+ xController->setCurrentPage (xDrawPage);
+ }
+ else
+ {
+ // As a fall back switch to the page via the core.
+ DBG_ASSERT (xController.is(),
+ "DrawDocShell::GotoBookmark: can't switch page via API");
+ pDrawViewShell->SwitchPage(nSdPgNum);
+ }
+
+ if (pDrawViewShell->GetDispatcher())
+ {
+ // show page
+ SvxZoomItem aZoom;
+ aZoom.SetType( SvxZoomType::WHOLEPAGE );
+ pDrawViewShell->GetDispatcher()->ExecuteList(SID_ATTR_ZOOM, SfxCallMode::ASYNCHRON, { &aZoom });
+ }
+
+ if (pObj != nullptr)
+ {
+ // select object
+ pDrawViewShell->GetView()->UnmarkAll();
+ pDrawViewShell->GetView()->MarkObj(
+ pObj,
+ pDrawViewShell->GetView()->GetSdrPageView());
+ }
+ }
+ }
+
+ SfxBindings& rBindings = ((pDrawViewShell && pDrawViewShell->GetViewFrame()!=nullptr)
+ ? pDrawViewShell->GetViewFrame()
+ : SfxViewFrame::Current() )->GetBindings();
+
+ rBindings.Invalidate(SID_NAVIGATOR_STATE, true);
+ rBindings.Invalidate(SID_NAVIGATOR_PAGENAME);
+}
+
+/**
+ * If it should become a document template.
+ */
+bool DrawDocShell::SaveAsOwnFormat( SfxMedium& rMedium )
+{
+
+ std::shared_ptr<const SfxFilter> pFilter = rMedium.GetFilter();
+
+ if (pFilter->IsOwnTemplateFormat())
+ {
+ /* now the StarDraw specialty:
+ we assign known layout names to the layout template of the first
+ page, we set the layout names of the affected masterpages and pages.
+ We inform all text objects of the affected standard, note and
+ masterpages about the name change.
+ */
+
+ OUString aLayoutName;
+
+ SfxStringItem const * pLayoutItem = rMedium.GetItemSet()->GetItemIfSet(SID_TEMPLATE_NAME, false);
+ if( pLayoutItem )
+ {
+ aLayoutName = pLayoutItem->GetValue();
+ }
+ else
+ {
+ INetURLObject aURL( rMedium.GetName() );
+ aURL.removeExtension();
+ aLayoutName = aURL.getName();
+ }
+
+ if (aLayoutName.isEmpty())
+ {
+ sal_uInt32 nCount = mpDoc->GetMasterSdPageCount(PageKind::Standard);
+ for (sal_uInt32 i = 0; i < nCount; ++i)
+ {
+ OUString aOldPageLayoutName = mpDoc->GetMasterSdPage(i, PageKind::Standard)->GetLayoutName();
+ OUString aNewLayoutName = aLayoutName;
+ // Don't add suffix for the first master page
+ if( i > 0 )
+ aNewLayoutName += OUString::number(i);
+
+ mpDoc->RenameLayoutTemplate(aOldPageLayoutName, aNewLayoutName);
+ }
+ }
+ }
+
+ return SfxObjectShell::SaveAsOwnFormat(rMedium);
+}
+
+void DrawDocShell::FillClass(SvGlobalName* pClassName,
+ SotClipboardFormatId* pFormat,
+ OUString* pFullTypeName,
+ sal_Int32 nFileFormat,
+ bool bTemplate /* = false */) const
+{
+ if (nFileFormat == SOFFICE_FILEFORMAT_60)
+ {
+ if ( meDocType == DocumentType::Draw )
+ {
+ *pClassName = SvGlobalName(SO3_SDRAW_CLASSID_60);
+ *pFormat = SotClipboardFormatId::STARDRAW_60;
+ *pFullTypeName = SdResId(STR_GRAPHIC_DOCUMENT_FULLTYPE_60);
+ }
+ else
+ {
+ *pClassName = SvGlobalName(SO3_SIMPRESS_CLASSID_60);
+ *pFormat = SotClipboardFormatId::STARIMPRESS_60;
+ *pFullTypeName = SdResId(STR_IMPRESS_DOCUMENT_FULLTYPE_60);
+ }
+ }
+ else if (nFileFormat == SOFFICE_FILEFORMAT_8)
+ {
+ if ( meDocType == DocumentType::Draw )
+ {
+ *pClassName = SvGlobalName(SO3_SDRAW_CLASSID_60);
+ *pFormat = bTemplate ? SotClipboardFormatId::STARDRAW_8_TEMPLATE : SotClipboardFormatId::STARDRAW_8;
+ *pFullTypeName = SdResId(STR_GRAPHIC_DOCUMENT_FULLTYPE_80); // HACK: method will be removed with new storage API
+ }
+ else
+ {
+ *pClassName = SvGlobalName(SO3_SIMPRESS_CLASSID_60);
+ *pFormat = bTemplate ? SotClipboardFormatId::STARIMPRESS_8_TEMPLATE : SotClipboardFormatId::STARIMPRESS_8;
+ *pFullTypeName = SdResId(STR_IMPRESS_DOCUMENT_FULLTYPE_80); // HACK: method will be removed with new storage API
+ }
+ }
+}
+
+OutputDevice* DrawDocShell::GetDocumentRefDev()
+{
+ OutputDevice* pReferenceDevice = SfxObjectShell::GetDocumentRefDev ();
+ // Only when our parent does not have a reference device then we return
+ // our own.
+ if (pReferenceDevice == nullptr && mpDoc != nullptr)
+ pReferenceDevice = mpDoc->GetRefDevice ();
+ return pReferenceDevice;
+}
+
+/** executes the SID_OPENDOC slot to let the framework open a document
+ with the given URL and this document as a referer */
+void DrawDocShell::OpenBookmark( const OUString& rBookmarkURL )
+{
+ SfxStringItem aStrItem( SID_FILE_NAME, rBookmarkURL );
+ SfxStringItem aReferer( SID_REFERER, GetMedium()->GetName() );
+ const SfxPoolItem* ppArgs[] = { &aStrItem, &aReferer, nullptr };
+ ( mpViewShell ? mpViewShell->GetViewFrame() : SfxViewFrame::Current() )->GetBindings().Execute( SID_OPENHYPERLINK, ppArgs );
+}
+
+std::shared_ptr<SfxDocumentInfoDialog> DrawDocShell::CreateDocumentInfoDialog(weld::Window* pParent, const SfxItemSet &rSet)
+{
+ std::shared_ptr<SfxDocumentInfoDialog> xDlg = std::make_shared<SfxDocumentInfoDialog>(pParent, rSet);
+ DrawDocShell* pDocSh = dynamic_cast<DrawDocShell*>(SfxObjectShell::Current());
+ if( pDocSh == this )
+ {
+ xDlg->AddFontTabPage();
+ }
+ return xDlg;
+}
+
+void DrawDocShell::setEditMode(DrawViewShell* pDrawViewShell, bool isMasterPage)
+{
+ // Set the edit mode to either the normal edit mode or the
+ // master page mode.
+ EditMode eNewEditMode = EditMode::Page;
+ if (isMasterPage)
+ {
+ eNewEditMode = EditMode::MasterPage;
+ }
+
+ if (eNewEditMode != pDrawViewShell->GetEditMode())
+ {
+ // Set EditMode
+ pDrawViewShell->ChangeEditMode(eNewEditMode, false);
+ }
+}
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/docshell/docshell.cxx b/sd/source/ui/docshell/docshell.cxx
new file mode 100644
index 000000000..78279687a
--- /dev/null
+++ b/sd/source/ui/docshell/docshell.cxx
@@ -0,0 +1,515 @@
+/* -*- 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 <DrawDocShell.hxx>
+
+#include <officecfg/Office/Common.hxx>
+#include <unotools/configmgr.hxx>
+
+#include <sfx2/docfac.hxx>
+#include <sfx2/objface.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svx/svxids.hrc>
+#include <svl/srchitem.hxx>
+#include <svx/srchdlg.hxx>
+#include <svx/svdoutl.hxx>
+#include <svx/svditer.hxx>
+#include <editeng/flstitem.hxx>
+#include <editeng/eeitem.hxx>
+#include <svl/eitem.hxx>
+#include <svl/intitem.hxx>
+#include <sfx2/printer.hxx>
+#include <svx/drawitem.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svl/whiter.hxx>
+#include <svl/itempool.hxx>
+#include <svl/stritem.hxx>
+#include <svtools/ctrltool.hxx>
+#include <svtools/langtab.hxx>
+#include <comphelper/classids.hxx>
+#include <svl/cjkoptions.hxx>
+#include <svl/visitem.hxx>
+
+#include <app.hrc>
+#include <sdmod.hxx>
+#include <View.hxx>
+#include <drawdoc.hxx>
+
+#include <ViewShell.hxx>
+#include <unomodel.hxx>
+#include <undo/undomanager.hxx>
+#include <undo/undofactory.hxx>
+#include <OutlineView.hxx>
+#include <ViewShellBase.hxx>
+#include <sfx2/notebookbar/SfxNotebookBar.hxx>
+#include <comphelper/lok.hxx>
+#include <DrawViewShell.hxx>
+#include <sdpage.hxx>
+
+using namespace sd;
+#define ShellClass_DrawDocShell
+#include <sdslots.hxx>
+
+SFX_IMPL_SUPERCLASS_INTERFACE(DrawDocShell, SfxObjectShell);
+
+void DrawDocShell::InitInterface_Impl()
+{
+ GetStaticInterface()->RegisterChildWindow(SvxSearchDialogWrapper::GetChildWindowId());
+}
+
+namespace sd {
+
+/**
+ * slotmaps and definitions of SFX
+ */
+
+SFX_IMPL_OBJECTFACTORY(
+ DrawDocShell,
+ SvGlobalName(SO3_SIMPRESS_CLASSID),
+ "simpress" )
+
+void DrawDocShell::Construct( bool bClipboard )
+{
+ mbInDestruction = false;
+ SetSlotFilter(); // resets the filter
+
+ mbOwnDocument = mpDoc == nullptr;
+ if( mbOwnDocument )
+ mpDoc = new SdDrawDocument(meDocType, this);
+
+ // The document has been created so we can call UpdateRefDevice() to set
+ // the document's ref device.
+ UpdateRefDevice();
+
+ SetBaseModel( new SdXImpressDocument( this, bClipboard ) );
+ SetPool( &mpDoc->GetItemPool() );
+ std::unique_ptr<sd::UndoManager> pUndoManager(new sd::UndoManager);
+ pUndoManager->SetDocShell(this);
+ mpUndoManager = std::move(pUndoManager);
+
+ if (!utl::ConfigManager::IsFuzzing()
+ && officecfg::Office::Common::Undo::Steps::get() < 1)
+ {
+ mpUndoManager->EnableUndo(false); // tdf#108863 disable if 0 steps
+ }
+ mpDoc->SetSdrUndoManager( mpUndoManager.get() );
+ mpDoc->SetSdrUndoFactory( new sd::UndoFactory );
+ UpdateTablePointers();
+ SetStyleFamily(SfxStyleFamily::Pseudo);
+}
+
+DrawDocShell::DrawDocShell(SfxObjectCreateMode eMode,
+ bool bDataObject,
+ DocumentType eDocumentType) :
+ SfxObjectShell( eMode == SfxObjectCreateMode::INTERNAL ? SfxObjectCreateMode::EMBEDDED : eMode),
+ mpDoc(nullptr),
+ mpPrinter(nullptr),
+ mpViewShell(nullptr),
+ meDocType(eDocumentType),
+ mbSdDataObj(bDataObject),
+ mbOwnPrinter(false)
+{
+ Construct( eMode == SfxObjectCreateMode::INTERNAL );
+}
+
+DrawDocShell::DrawDocShell( SfxModelFlags nModelCreationFlags, bool bDataObject, DocumentType eDocumentType ) :
+ SfxObjectShell( nModelCreationFlags ),
+ mpDoc(nullptr),
+ mpPrinter(nullptr),
+ mpViewShell(nullptr),
+ meDocType(eDocumentType),
+ mbSdDataObj(bDataObject),
+ mbOwnPrinter(false)
+{
+ Construct( false );
+}
+
+DrawDocShell::DrawDocShell(SdDrawDocument* pDoc, SfxObjectCreateMode eMode,
+ bool bDataObject,
+ DocumentType eDocumentType) :
+ SfxObjectShell(eMode == SfxObjectCreateMode::INTERNAL ? SfxObjectCreateMode::EMBEDDED : eMode),
+ mpDoc(pDoc),
+ mpPrinter(nullptr),
+ mpViewShell(nullptr),
+ meDocType(eDocumentType),
+ mbSdDataObj(bDataObject),
+ mbOwnPrinter(false)
+{
+ Construct( eMode == SfxObjectCreateMode::INTERNAL );
+}
+
+DrawDocShell::~DrawDocShell()
+{
+ // Tell all listeners that the doc shell is about to be
+ // destroyed. This has been introduced for the PreviewRenderer to
+ // free its view (that uses the item poll of the doc shell) but
+ // may be useful in other places as well.
+ Broadcast(SfxHint(SfxHintId::Dying));
+
+ mbInDestruction = true;
+
+ if (mpViewShell)
+ {
+ auto* pView = mpViewShell->GetView();
+ if (pView)
+ {
+ auto & pSearchContext = pView->getSearchContext();
+ pSearchContext.resetSearchFunction();
+ }
+ }
+
+ mpFontList.reset();
+
+ if( mpDoc )
+ mpDoc->SetSdrUndoManager( nullptr );
+ mpUndoManager.reset();
+
+ if (mbOwnPrinter)
+ mpPrinter.disposeAndClear();
+
+ if( mbOwnDocument )
+ delete mpDoc;
+
+ // that the navigator get informed about the disappearance of the document
+ SfxBoolItem aItem(SID_NAVIGATOR_INIT, true);
+ SfxViewFrame* pFrame = mpViewShell ? mpViewShell->GetFrame() : GetFrame();
+
+ if( !pFrame )
+ pFrame = SfxViewFrame::GetFirst( this );
+
+ if( pFrame )
+ {
+ pFrame->GetDispatcher()->ExecuteList(
+ SID_NAVIGATOR_INIT, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aItem });
+ }
+}
+
+void DrawDocShell::GetState(SfxItemSet &rSet)
+{
+
+ SfxWhichIter aIter( rSet );
+ sal_uInt16 nWhich = aIter.FirstWhich();
+
+ while ( nWhich )
+ {
+ sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich)
+ ? GetPool().GetSlotId(nWhich)
+ : nWhich;
+
+ switch ( nSlotId )
+ {
+ case SID_ATTR_CHAR_FONTLIST:
+ rSet.Put( SvxFontListItem( mpFontList.get(), nSlotId ) );
+ break;
+
+ case SID_SEARCH_ITEM:
+ {
+ rSet.Put( *SD_MOD()->GetSearchItem() );
+ }
+ break;
+
+ case SID_CLOSEDOC:
+ GetSlotState(SID_CLOSEDOC, SfxObjectShell::GetInterface(), &rSet);
+ break;
+
+ case SID_SEARCH_OPTIONS:
+ {
+ SearchOptionFlags nOpt = SearchOptionFlags::SEARCH |
+ SearchOptionFlags::WHOLE_WORDS |
+ SearchOptionFlags::BACKWARDS |
+ SearchOptionFlags::REG_EXP |
+ SearchOptionFlags::EXACT |
+ SearchOptionFlags::SIMILARITY |
+ SearchOptionFlags::SELECTION;
+
+ if (!IsReadOnly())
+ {
+ nOpt |= SearchOptionFlags::REPLACE;
+ nOpt |= SearchOptionFlags::REPLACE_ALL;
+ }
+
+ rSet.Put(SfxUInt16Item(nWhich, static_cast<sal_uInt16>(nOpt)));
+ }
+ break;
+
+ case SID_VERSION:
+ {
+ GetSlotState( SID_VERSION, SfxObjectShell::GetInterface(), &rSet );
+ }
+ break;
+
+ case SID_CHINESE_CONVERSION:
+ case SID_HANGUL_HANJA_CONVERSION:
+ {
+ rSet.Put(SfxVisibilityItem(nWhich, SvtCJKOptions::IsAnyEnabled()));
+ }
+ break;
+ case SID_LANGUAGE_STATUS:
+ {
+ SdrObject* pObj = nullptr;
+ bool bLanguageFound = false;
+ OutlinerParaObject* pParaObj = nullptr;
+ LanguageType eLanguage( LANGUAGE_DONTKNOW );
+ sal_uInt16 nCount = mpDoc->GetPageCount();
+ for ( sal_uInt16 itPage = 0; itPage < nCount && !bLanguageFound; itPage++ )
+ {
+ SdrObjListIter aListIter(mpDoc->GetPage(itPage), SdrIterMode::DeepWithGroups);
+ while ( aListIter.IsMore() && !bLanguageFound )
+ {
+ pObj = aListIter.Next();
+ if ( pObj )
+ {
+ pParaObj = pObj->GetOutlinerParaObject();
+ if ( pParaObj )
+ {
+ SdrOutliner aOutliner(&mpDoc->GetPool(), OutlinerMode::TextObject);
+ aOutliner.SetText(*pParaObj);
+ eLanguage = aOutliner.GetLanguage(0, 0);
+ bLanguageFound = eLanguage != LANGUAGE_DONTKNOW;
+ }
+ }
+ }
+ }
+
+ if ( eLanguage == LANGUAGE_DONTKNOW )
+ {
+ eLanguage = mpDoc->GetLanguage( EE_CHAR_LANGUAGE );
+ }
+
+ OUString aLanguage = SvtLanguageTable::GetLanguageString(eLanguage);
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ if (eLanguage == LANGUAGE_DONTKNOW)
+ {
+ aLanguage += ";-";
+ }
+ else
+ {
+ aLanguage += ";" + LanguageTag(eLanguage).getBcp47(false);
+ }
+ }
+ rSet.Put(SfxStringItem(nWhich, aLanguage));
+ }
+ break;
+
+ case SID_NOTEBOOKBAR:
+ {
+ if (mpViewShell)
+ {
+ bool bImpress = mpDoc->GetDocumentType() == DocumentType::Impress;
+ bool bVisible = false;
+ if(bImpress)
+ {
+ bVisible = sfx2::SfxNotebookBar::StateMethod(mpViewShell->GetFrame()->GetBindings(),
+ u"modules/simpress/ui/");
+ }
+ else
+ {
+ bVisible = sfx2::SfxNotebookBar::StateMethod(mpViewShell->GetFrame()->GetBindings(),
+ u"modules/sdraw/ui/");
+ }
+ rSet.Put( SfxBoolItem( SID_NOTEBOOKBAR, bVisible ) );
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ nWhich = aIter.NextWhich();
+ }
+
+ SfxViewFrame* pFrame = SfxViewFrame::Current();
+
+ if (pFrame)
+ {
+ if (rSet.GetItemState(SID_RELOAD) != SfxItemState::UNKNOWN)
+ {
+ pFrame->GetSlotState(SID_RELOAD,
+ pFrame->GetInterface(), &rSet);
+ }
+ }
+}
+
+void DrawDocShell::Activate( bool bMDI)
+{
+ if (bMDI)
+ {
+ ApplySlotFilter();
+ mpDoc->StartOnlineSpelling();
+ }
+}
+
+void DrawDocShell::Deactivate( bool )
+{
+}
+
+SfxUndoManager* DrawDocShell::GetUndoManager()
+{
+ return mpUndoManager.get();
+}
+
+void DrawDocShell::UpdateTablePointers()
+{
+ PutItem( SvxColorListItem( mpDoc->GetColorList(), SID_COLOR_TABLE ) );
+ PutItem( SvxGradientListItem( mpDoc->GetGradientList(), SID_GRADIENT_LIST ) );
+ PutItem( SvxHatchListItem( mpDoc->GetHatchList(), SID_HATCH_LIST ) );
+ PutItem( SvxBitmapListItem( mpDoc->GetBitmapList(), SID_BITMAP_LIST ) );
+ PutItem( SvxPatternListItem( mpDoc->GetPatternList(), SID_PATTERN_LIST ) );
+ PutItem( SvxDashListItem( mpDoc->GetDashList(), SID_DASH_LIST ) );
+ PutItem( SvxLineEndListItem( mpDoc->GetLineEndList(), SID_LINEEND_LIST ) );
+
+ UpdateFontList();
+}
+
+void DrawDocShell::CancelSearching()
+{
+ if (mpViewShell)
+ {
+ auto* pView = mpViewShell->GetView();
+ if (pView)
+ {
+ auto & pSearchContext = pView->getSearchContext();
+ pSearchContext.resetSearchFunction();
+ }
+ }
+}
+
+/**
+ * apply configured slot filters
+ */
+void DrawDocShell::ApplySlotFilter() const
+{
+ SfxViewShell* pTestViewShell = SfxViewShell::GetFirst();
+
+ while( pTestViewShell )
+ {
+ if( pTestViewShell->GetObjectShell()
+ == this
+ && pTestViewShell->GetViewFrame()
+ && pTestViewShell->GetViewFrame()->GetDispatcher() )
+ {
+ SfxDispatcher* pDispatcher = pTestViewShell->GetViewFrame()->GetDispatcher();
+
+ if( !mpFilterSIDs.empty() )
+ pDispatcher->SetSlotFilter( mbFilterEnable ? SfxSlotFilterState::ENABLED : SfxSlotFilterState::DISABLED, mpFilterSIDs );
+ else
+ pDispatcher->SetSlotFilter();
+
+ if( pDispatcher->GetBindings() )
+ pDispatcher->GetBindings()->InvalidateAll( true );
+ }
+
+ pTestViewShell = SfxViewShell::GetNext( *pTestViewShell );
+ }
+}
+
+void DrawDocShell::SetModified( bool bSet /* = true */ )
+{
+ SfxObjectShell::SetModified( bSet );
+
+ // change model state, too
+ // only set the changed state if modification is enabled
+ if( IsEnableSetModified() )
+ {
+ if ( mpDoc )
+ mpDoc->NbcSetChanged( bSet );
+
+ Broadcast( SfxHint( SfxHintId::DocChanged ) );
+ }
+}
+
+/**
+ * Callback for ExecuteSpellPopup()
+ */
+// ExecuteSpellPopup now handled by DrawDocShell. This is necessary
+// to get hands on the outliner and the text object.
+IMPL_LINK(DrawDocShell, OnlineSpellCallback, SpellCallbackInfo&, rInfo, void)
+{
+ SdrObject* pObj = nullptr;
+ SdrOutliner* pOutl = nullptr;
+
+ if(GetViewShell())
+ {
+ pOutl = GetViewShell()->GetView()->GetTextEditOutliner();
+ pObj = GetViewShell()->GetView()->GetTextEditObject();
+ }
+
+ mpDoc->ImpOnlineSpellCallback(&rInfo, pObj, pOutl);
+}
+
+void DrawDocShell::ClearUndoBuffer()
+{
+ // clear possible undo buffers of outliners
+ SfxViewFrame* pSfxViewFrame = SfxViewFrame::GetFirst(this, false);
+ while(pSfxViewFrame)
+ {
+ ViewShellBase* pViewShellBase = dynamic_cast< ViewShellBase* >( pSfxViewFrame->GetViewShell() );
+ if( pViewShellBase )
+ {
+ std::shared_ptr<ViewShell> pViewSh( pViewShellBase->GetMainViewShell() );
+ if( pViewSh )
+ {
+ ::sd::View* pView = pViewSh->GetView();
+ if( pView )
+ {
+ pView->SdrEndTextEdit();
+ sd::OutlineView* pOutlView = dynamic_cast< sd::OutlineView* >( pView );
+ if( pOutlView )
+ {
+ pOutlView->GetOutliner().GetUndoManager().Clear();
+ }
+ }
+ }
+ }
+ pSfxViewFrame = SfxViewFrame::GetNext(*pSfxViewFrame, this, false);
+ }
+
+ SfxUndoManager* pUndoManager = GetUndoManager();
+ if(pUndoManager && pUndoManager->GetUndoActionCount())
+ pUndoManager->Clear();
+}
+
+std::vector<Color> DrawDocShell::GetThemeColors()
+{
+ auto pViewShell = dynamic_cast<sd::DrawViewShell*>(GetViewShell());
+ if (!pViewShell)
+ {
+ return {};
+ }
+
+ SdPage* pPage = pViewShell->getCurrentPage();
+ svx::Theme* pTheme = pPage->getSdrPageProperties().GetTheme();
+ if (!pPage->IsMasterPage())
+ {
+ pTheme = pPage->TRG_GetMasterPage().getSdrPageProperties().GetTheme();
+ }
+
+ if (!pTheme)
+ {
+ return {};
+ }
+
+ return pTheme->GetColors();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/docshell/grdocsh.cxx b/sd/source/ui/docshell/grdocsh.cxx
new file mode 100644
index 000000000..f0f5af956
--- /dev/null
+++ b/sd/source/ui/docshell/grdocsh.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/.
+ *
+ * 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 <svx/svxids.hrc>
+#include <tools/globname.hxx>
+
+#include <comphelper/classids.hxx>
+
+#include <sfx2/objface.hxx>
+
+#include <GraphicDocShell.hxx>
+#include <DrawDocShell.hxx>
+
+using namespace sd;
+#define ShellClass_GraphicDocShell
+#include <sdgslots.hxx>
+
+namespace sd
+{
+SFX_IMPL_SUPERCLASS_INTERFACE(GraphicDocShell, SfxObjectShell)
+
+void GraphicDocShell::InitInterface_Impl()
+{
+ GetStaticInterface()->RegisterChildWindow(SID_SEARCH_DLG);
+}
+
+SFX_IMPL_OBJECTFACTORY(GraphicDocShell, SvGlobalName(SO3_SDRAW_CLASSID_60), "sdraw")
+
+GraphicDocShell::GraphicDocShell(SfxObjectCreateMode eMode)
+ : DrawDocShell(eMode, /*bDataObject*/ true, DocumentType::Draw)
+{
+ SetStyleFamily(SfxStyleFamily::Para);
+}
+
+GraphicDocShell::GraphicDocShell(SfxModelFlags nModelCreationFlags)
+ : DrawDocShell(nModelCreationFlags, /*bDataObject*/ false, DocumentType::Draw)
+{
+ SetStyleFamily(SfxStyleFamily::Para);
+}
+
+GraphicDocShell::~GraphicDocShell() {}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/docshell/sdclient.cxx b/sd/source/ui/docshell/sdclient.cxx
new file mode 100644
index 000000000..02521c257
--- /dev/null
+++ b/sd/source/ui/docshell/sdclient.cxx
@@ -0,0 +1,184 @@
+/* -*- 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 <Client.hxx>
+#include <svx/svdoole2.hxx>
+#include <tools/debug.hxx>
+
+#include <ViewShell.hxx>
+#include <View.hxx>
+#include <vcl/svapp.hxx>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+Client::Client(SdrOle2Obj* pObj, ViewShell* pViewShell, vcl::Window* pWindow) :
+ SfxInPlaceClient(pViewShell->GetViewShell(), pWindow, pObj->GetAspect() ),
+ mpViewShell(pViewShell),
+ pSdrOle2Obj(pObj)
+{
+ SetObject( pObj->GetObjRef() );
+ DBG_ASSERT( GetObject().is(), "No object connected!" );
+}
+
+Client::~Client()
+{
+}
+
+/**
+ * If IP active, then we get this request to increase the visible section of the
+ * object.
+ */
+void Client::RequestNewObjectArea( ::tools::Rectangle& aObjRect )
+{
+ ::sd::View* pView = mpViewShell->GetView();
+
+ bool bSizeProtect = false;
+ bool bPosProtect = false;
+
+ const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+
+ // no need to check for changes, this method is called only if the area really changed
+ bSizeProtect = pObj->IsResizeProtect();
+ bPosProtect = pObj->IsMoveProtect();
+ }
+
+ ::tools::Rectangle aOldRect = GetObjArea();
+ if ( bPosProtect )
+ aObjRect.SetPos( aOldRect.TopLeft() );
+
+ if ( bSizeProtect )
+ aObjRect.SetSize( aOldRect.GetSize() );
+
+ ::tools::Rectangle aWorkArea( pView->GetWorkArea() );
+ if ( aWorkArea.Contains(aObjRect) || bPosProtect || aObjRect == aOldRect )
+ return;
+
+ // correct position
+ Point aPos = aObjRect.TopLeft();
+ Size aSize = aObjRect.GetSize();
+ Point aWorkAreaTL = aWorkArea.TopLeft();
+ Point aWorkAreaBR = aWorkArea.BottomRight();
+
+ aPos.setX( std::max(aPos.X(), aWorkAreaTL.X()) );
+ aPos.setX( std::min(aPos.X(), aWorkAreaBR.X()-aSize.Width()) );
+ aPos.setY( std::max(aPos.Y(), aWorkAreaTL.Y()) );
+ aPos.setY( std::min(aPos.Y(), aWorkAreaBR.Y()-aSize.Height()) );
+
+ aObjRect.SetPos(aPos);
+}
+
+void Client::ObjectAreaChanged()
+{
+ ::sd::View* pView = mpViewShell->GetView();
+ const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
+ if (rMarkList.GetMarkCount() != 1)
+ return;
+
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrOle2Obj* pObj = dynamic_cast< SdrOle2Obj* >(pMark->GetMarkedSdrObj());
+
+ if(!pObj)
+ return;
+
+ // no need to check for changes, this method is called only if the area really changed
+ ::tools::Rectangle aNewRectangle(GetScaledObjArea());
+
+ // #i118524# if sheared/rotated, center to non-rotated LogicRect
+ pObj->setSuppressSetVisAreaSize(true);
+
+ if(pObj->GetGeoStat().nRotationAngle || pObj->GetGeoStat().nShearAngle)
+ {
+ pObj->SetLogicRect( aNewRectangle );
+
+ const ::tools::Rectangle& rBoundRect = pObj->GetCurrentBoundRect();
+ const Point aDelta(aNewRectangle.Center() - rBoundRect.Center());
+
+ aNewRectangle.Move(aDelta.X(), aDelta.Y());
+ }
+
+ pObj->SetLogicRect( aNewRectangle );
+ pObj->setSuppressSetVisAreaSize(false);
+}
+
+void Client::ViewChanged()
+{
+ if ( GetAspect() == embed::Aspects::MSOLE_ICON )
+ {
+ // the iconified object seems not to need such a scaling handling
+ // since the replacement image and the size a completely controlled by the container
+ // TODO/LATER: when the icon exchange is implemented the scaling handling might be required again here
+
+ pSdrOle2Obj->ActionChanged(); // draw needs it to remove lines in slide preview
+ return;
+ }
+
+ //TODO/LATER: should we try to avoid the recalculation of the visareasize
+ //if we know that it didn't change?
+ if (!mpViewShell->GetActiveWindow())
+ return;
+
+ ::sd::View* pView = mpViewShell->GetView();
+ if (!pView)
+ return;
+
+ ::tools::Rectangle aLogicRect( pSdrOle2Obj->GetLogicRect() );
+ Size aLogicSize( aLogicRect.GetWidth(), aLogicRect.GetHeight() );
+
+ if( pSdrOle2Obj->IsChart() )
+ {
+ //charts never should be stretched see #i84323# for example
+ pSdrOle2Obj->SetLogicRect( ::tools::Rectangle( aLogicRect.TopLeft(), aLogicSize ) );
+ pSdrOle2Obj->BroadcastObjectChange();
+ return;
+ }
+
+ // TODO/LEAN: maybe we can do this without requesting the VisualArea?
+ // working with the visual area might need running state, so the object may switch itself to this state
+ MapMode aMap100( MapUnit::Map100thMM );
+ ::tools::Rectangle aVisArea;
+ Size aSize = pSdrOle2Obj->GetOrigObjSize( &aMap100 );
+
+ aVisArea.SetSize( aSize );
+ Size aScaledSize( static_cast< ::tools::Long >( GetScaleWidth() * Fraction( aVisArea.GetWidth() ) ),
+ static_cast< ::tools::Long >( GetScaleHeight() * Fraction( aVisArea.GetHeight() ) ) );
+
+ // react to the change if the difference is bigger than one pixel
+ Size aPixelDiff =
+ Application::GetDefaultDevice()->LogicToPixel(
+ Size( aLogicRect.GetWidth() - aScaledSize.Width(),
+ aLogicRect.GetHeight() - aScaledSize.Height() ),
+ aMap100 );
+ if( aPixelDiff.Width() || aPixelDiff.Height() )
+ {
+ pSdrOle2Obj->SetLogicRect( ::tools::Rectangle( aLogicRect.TopLeft(), aScaledSize ) );
+ pSdrOle2Obj->BroadcastObjectChange();
+ }
+ else
+ pSdrOle2Obj->ActionChanged();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ChangeRequestQueue.cxx b/sd/source/ui/framework/configuration/ChangeRequestQueue.cxx
new file mode 100644
index 000000000..0168c162b
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ChangeRequestQueue.cxx
@@ -0,0 +1,28 @@
+/* -*- 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 "ChangeRequestQueue.hxx"
+
+namespace sd::framework
+{
+ChangeRequestQueue::ChangeRequestQueue() {}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ChangeRequestQueue.hxx b/sd/source/ui/framework/configuration/ChangeRequestQueue.hxx
new file mode 100644
index 000000000..e60b5b527
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ChangeRequestQueue.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Reference.hxx>
+
+#include <queue>
+
+namespace com::sun::star::drawing::framework
+{
+class XConfigurationChangeRequest;
+}
+
+namespace sd::framework
+{
+/** The ChangeRequestQueue stores the pending requests for changes to the
+ requested configuration. It is the task of the
+ ChangeRequestQueueProcessor to process these requests.
+*/
+class ChangeRequestQueue
+ : public ::std::queue<css::uno::Reference<css::drawing::framework::XConfigurationChangeRequest>>
+{
+public:
+ /** Create an empty queue.
+ */
+ ChangeRequestQueue();
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.cxx b/sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.cxx
new file mode 100644
index 000000000..da633a540
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.cxx
@@ -0,0 +1,180 @@
+/* -*- 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 "debugtrace.hxx"
+#include "ChangeRequestQueueProcessor.hxx"
+#include "ConfigurationTracer.hxx"
+
+#include "ConfigurationUpdater.hxx"
+
+#include <vcl/svapp.hxx>
+#include <sal/log.hxx>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationChangeRequest.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace {
+
+#if DEBUG_SD_CONFIGURATION_TRACE
+
+void TraceRequest (const Reference<XConfigurationChangeRequest>& rxRequest)
+{
+ Reference<container::XNamed> xNamed (rxRequest, UNO_QUERY);
+ if (xNamed.is())
+ SAL_INFO("sd.fwk", __func__ << ": " << xNamed->getName());
+}
+
+#endif
+
+} // end of anonymous namespace
+
+namespace sd::framework {
+
+ChangeRequestQueueProcessor::ChangeRequestQueueProcessor (
+ const std::shared_ptr<ConfigurationUpdater>& rpConfigurationUpdater)
+ : mnUserEventId(nullptr),
+ mpConfigurationUpdater(rpConfigurationUpdater)
+{
+}
+
+ChangeRequestQueueProcessor::~ChangeRequestQueueProcessor()
+{
+ if (mnUserEventId != nullptr)
+ Application::RemoveUserEvent(mnUserEventId);
+}
+
+void ChangeRequestQueueProcessor::SetConfiguration (
+ const Reference<XConfiguration>& rxConfiguration)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ mxConfiguration = rxConfiguration;
+ StartProcessing();
+}
+
+void ChangeRequestQueueProcessor::AddRequest (
+ const Reference<XConfigurationChangeRequest>& rxRequest)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+#if DEBUG_SD_CONFIGURATION_TRACE
+ if (maQueue.empty())
+ {
+ SAL_INFO("sd.fwk", __func__ << ": Adding requests to empty queue");
+ ConfigurationTracer::TraceConfiguration(
+ mxConfiguration, "current configuration of queue processor");
+ }
+ SAL_INFO("sd.fwk", __func__ << ": Adding request");
+ TraceRequest(rxRequest);
+#endif
+
+ maQueue.push(rxRequest);
+ StartProcessing();
+}
+
+void ChangeRequestQueueProcessor::StartProcessing()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ if (mnUserEventId == nullptr
+ && mxConfiguration.is()
+ && ! maQueue.empty())
+ {
+ SAL_INFO("sd.fwk", __func__ << ": ChangeRequestQueueProcessor scheduling processing");
+ mnUserEventId = Application::PostUserEvent(
+ LINK(this,ChangeRequestQueueProcessor,ProcessEvent));
+ }
+}
+
+IMPL_LINK_NOARG(ChangeRequestQueueProcessor, ProcessEvent, void*, void)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ mnUserEventId = nullptr;
+
+ ProcessOneEvent();
+
+ if ( ! maQueue.empty())
+ {
+ // Schedule the processing of the next event.
+ StartProcessing();
+ }
+}
+
+void ChangeRequestQueueProcessor::ProcessOneEvent()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ SAL_INFO("sd.fwk", __func__ << ": ProcessOneEvent");
+
+ if (!mxConfiguration.is() || maQueue.empty())
+ return;
+
+ // Get and remove the first entry from the queue.
+ Reference<XConfigurationChangeRequest> xRequest (maQueue.front());
+ maQueue.pop();
+
+ // Execute the change request.
+ if (xRequest.is())
+ {
+#if DEBUG_SD_CONFIGURATION_TRACE
+ TraceRequest(xRequest);
+#endif
+ xRequest->execute(mxConfiguration);
+ }
+
+ if (!maQueue.empty())
+ return;
+
+ SAL_INFO("sd.fwk", __func__ << ": All requests are processed");
+ // The queue is empty so tell the ConfigurationManager to update
+ // its state.
+ if (mpConfigurationUpdater != nullptr)
+ {
+#if DEBUG_SD_CONFIGURATION_TRACE
+ ConfigurationTracer::TraceConfiguration (
+ mxConfiguration, "updating to configuration");
+#endif
+ mpConfigurationUpdater->RequestUpdate(mxConfiguration);
+ }
+}
+
+bool ChangeRequestQueueProcessor::IsEmpty() const
+{
+ return maQueue.empty();
+}
+
+void ChangeRequestQueueProcessor::ProcessUntilEmpty()
+{
+ while ( ! IsEmpty())
+ ProcessOneEvent();
+}
+
+void ChangeRequestQueueProcessor::Clear()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+ ChangeRequestQueue().swap(maQueue);
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.hxx b/sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.hxx
new file mode 100644
index 000000000..4afd5af76
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "ChangeRequestQueue.hxx"
+#include <osl/mutex.hxx>
+
+#include <tools/link.hxx>
+
+#include <memory>
+
+namespace com::sun::star::drawing::framework
+{
+class XConfiguration;
+}
+namespace com::sun::star::drawing::framework
+{
+class XConfigurationChangeRequest;
+}
+
+struct ImplSVEvent;
+
+namespace sd::framework
+{
+class ConfigurationUpdater;
+
+/** The ChangeRequestQueueProcessor owns the ChangeRequestQueue and
+ processes the configuration change requests.
+
+ When after processing one entry the queue is empty then the
+ XConfigurationController::update() method is called so that the changes
+ made to the local XConfiguration reference are reflected by the UI.
+
+ Queue entries are processed asynchronously by calling PostUserEvent().
+*/
+class ChangeRequestQueueProcessor
+{
+public:
+ /** The queue processor is created with a reference to an
+ ConfigurationController so that its UpdateConfiguration() method can
+ be called when the queue becomes empty.
+ */
+ explicit ChangeRequestQueueProcessor(const std::shared_ptr<ConfigurationUpdater>& rpUpdater);
+ ~ChangeRequestQueueProcessor();
+
+ /** Sets the configuration who will be changed by subsequent change
+ requests. This method should be called only by the configuration
+ controller who owns the configuration.
+ */
+ void SetConfiguration(
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration);
+
+ /** The given request is appended to the end of the queue and will
+ eventually be processed when all other entries in front of it have
+ been processed.
+ */
+ void AddRequest(
+ const css::uno::Reference<css::drawing::framework::XConfigurationChangeRequest>& rxRequest);
+
+ /** Returns </sal_True> when the queue is empty.
+ */
+ bool IsEmpty() const;
+
+ /** Process all events in the queue synchronously.
+
+ <p>This method is typically called when the framework is shut down
+ to establish an empty configuration.</p>
+ */
+ void ProcessUntilEmpty();
+
+ /** Process the first event in queue.
+ */
+ void ProcessOneEvent();
+
+ /** Remove all events from the queue.
+
+ <p>This method is typically called when the framework is shut down
+ to avoid the processing of still pending activation requests.</p>
+ */
+ void Clear();
+
+private:
+ mutable ::osl::Mutex maMutex;
+
+ ChangeRequestQueue maQueue;
+
+ /** The id returned by the last PostUserEvent() call. This id is stored
+ so that a pending user event can be removed when the queue processor
+ is destroyed.
+ */
+ ImplSVEvent* mnUserEventId;
+
+ css::uno::Reference<css::drawing::framework::XConfiguration> mxConfiguration;
+
+ std::shared_ptr<ConfigurationUpdater> mpConfigurationUpdater;
+
+ /** Initiate the processing of the entries in the queue. The actual
+ processing starts asynchronously.
+ */
+ void StartProcessing();
+
+ /** Callback function for the PostUserEvent() call.
+ */
+ DECL_LINK(ProcessEvent, void*, void);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/Configuration.cxx b/sd/source/ui/framework/configuration/Configuration.cxx
new file mode 100644
index 000000000..7b813a42b
--- /dev/null
+++ b/sd/source/ui/framework/configuration/Configuration.cxx
@@ -0,0 +1,311 @@
+/* -*- 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 <framework/Configuration.hxx>
+
+#include <framework/FrameworkHelper.hxx>
+
+#include <com/sun/star/drawing/framework/ConfigurationChangeEvent.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationControllerBroadcaster.hpp>
+#include <comphelper/sequence.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <sal/log.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+using ::sd::framework::FrameworkHelper;
+
+namespace {
+/** Use the XResourceId::compareTo() method to implement a compare operator
+ for STL containers.
+*/
+class XResourceIdLess
+{
+public:
+ bool operator () (const Reference<XResourceId>& rId1, const Reference<XResourceId>& rId2) const
+ {
+ return rId1->compareTo(rId2) == -1;
+ }
+};
+
+} // end of anonymous namespace
+
+namespace sd::framework {
+
+class Configuration::ResourceContainer
+ : public ::std::set<Reference<XResourceId>, XResourceIdLess>
+{
+public:
+ ResourceContainer() {}
+};
+
+//===== Configuration =========================================================
+
+Configuration::Configuration (
+ const Reference<XConfigurationControllerBroadcaster>& rxBroadcaster,
+ bool bBroadcastRequestEvents)
+ : mpResourceContainer(new ResourceContainer()),
+ mxBroadcaster(rxBroadcaster),
+ mbBroadcastRequestEvents(bBroadcastRequestEvents)
+{
+}
+
+Configuration::Configuration (
+ const Reference<XConfigurationControllerBroadcaster>& rxBroadcaster,
+ bool bBroadcastRequestEvents,
+ const ResourceContainer& rResourceContainer)
+ : mpResourceContainer(new ResourceContainer(rResourceContainer)),
+ mxBroadcaster(rxBroadcaster),
+ mbBroadcastRequestEvents(bBroadcastRequestEvents)
+{
+}
+
+Configuration::~Configuration()
+{
+}
+
+void Configuration::disposing(std::unique_lock<std::mutex>&)
+{
+ mpResourceContainer->clear();
+ mxBroadcaster = nullptr;
+}
+
+//----- XConfiguration --------------------------------------------------------
+
+void SAL_CALL Configuration::addResource (const Reference<XResourceId>& rxResourceId)
+{
+ ThrowIfDisposed();
+
+ if ( ! rxResourceId.is() || rxResourceId->getResourceURL().isEmpty())
+ throw css::lang::IllegalArgumentException();
+
+ if (mpResourceContainer->insert(rxResourceId).second)
+ {
+ SAL_INFO("sd.fwk", __func__ << ": Configuration::addResource() " <<
+ FrameworkHelper::ResourceIdToString(rxResourceId));
+ PostEvent(rxResourceId, true);
+ }
+}
+
+void SAL_CALL Configuration::removeResource (const Reference<XResourceId>& rxResourceId)
+{
+ ThrowIfDisposed();
+
+ if ( ! rxResourceId.is() || rxResourceId->getResourceURL().isEmpty())
+ throw css::lang::IllegalArgumentException();
+
+ ResourceContainer::iterator iResource (mpResourceContainer->find(rxResourceId));
+ if (iResource != mpResourceContainer->end())
+ {
+ SAL_INFO("sd.fwk", __func__ << ": Configuration::removeResource() " <<
+ FrameworkHelper::ResourceIdToString(rxResourceId));
+ PostEvent(rxResourceId,false);
+ mpResourceContainer->erase(iResource);
+ }
+}
+
+Sequence<Reference<XResourceId> > SAL_CALL Configuration::getResources (
+ const Reference<XResourceId>& rxAnchorId,
+ const OUString& rsResourceURLPrefix,
+ AnchorBindingMode eMode)
+{
+ std::unique_lock aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ const bool bFilterResources (!rsResourceURLPrefix.isEmpty());
+
+ // Collect the matching resources in a vector.
+ ::std::vector<Reference<XResourceId> > aResources;
+ for (const auto& rxResource : *mpResourceContainer)
+ {
+ if ( ! rxResource->isBoundTo(rxAnchorId,eMode))
+ continue;
+
+ if (bFilterResources)
+ {
+ // Apply the given resource prefix as filter.
+
+ // Make sure that the resource is bound directly to the anchor.
+ if (eMode != AnchorBindingMode_DIRECT
+ && ! rxResource->isBoundTo(rxAnchorId, AnchorBindingMode_DIRECT))
+ {
+ continue;
+ }
+
+ // Make sure that the resource URL matches the given prefix.
+ if ( ! rxResource->getResourceURL().match(rsResourceURLPrefix))
+ {
+ continue;
+ }
+ }
+
+ aResources.push_back(rxResource);
+ }
+
+ return comphelper::containerToSequence(aResources);
+}
+
+sal_Bool SAL_CALL Configuration::hasResource (const Reference<XResourceId>& rxResourceId)
+{
+ std::unique_lock aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ return rxResourceId.is()
+ && mpResourceContainer->find(rxResourceId) != mpResourceContainer->end();
+}
+
+//----- XCloneable ------------------------------------------------------------
+
+Reference<util::XCloneable> SAL_CALL Configuration::createClone()
+{
+ std::unique_lock aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ return new Configuration(
+ mxBroadcaster,
+ mbBroadcastRequestEvents,
+ *mpResourceContainer);
+}
+
+//----- XNamed ----------------------------------------------------------------
+
+OUString SAL_CALL Configuration::getName()
+{
+ std::unique_lock aGuard (m_aMutex);
+ OUStringBuffer aString;
+
+ if (m_bDisposed)
+ aString.append("DISPOSED ");
+ aString.append("Configuration[");
+
+ ResourceContainer::const_iterator iResource;
+ for (iResource=mpResourceContainer->begin();
+ iResource!=mpResourceContainer->end();
+ ++iResource)
+ {
+ if (iResource != mpResourceContainer->begin())
+ aString.append(", ");
+ aString.append(FrameworkHelper::ResourceIdToString(*iResource));
+ }
+ aString.append("]");
+
+ return aString.makeStringAndClear();
+}
+
+void SAL_CALL Configuration::setName (const OUString&)
+{
+ // ignored.
+}
+
+OUString Configuration::getImplementationName()
+{
+ return
+ "com.sun.star.comp.Draw.framework.configuration.Configuration";
+}
+
+sal_Bool Configuration::supportsService(OUString const & ServiceName)
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+css::uno::Sequence<OUString> Configuration::getSupportedServiceNames()
+{
+ return css::uno::Sequence<OUString>{
+ "com.sun.star.drawing.framework.Configuration"};
+}
+
+void Configuration::PostEvent (
+ const Reference<XResourceId>& rxResourceId,
+ const bool bActivation)
+{
+ OSL_ASSERT(rxResourceId.is());
+
+ if (!mxBroadcaster.is())
+ return;
+
+ ConfigurationChangeEvent aEvent;
+ aEvent.ResourceId = rxResourceId;
+ if (bActivation)
+ if (mbBroadcastRequestEvents)
+ aEvent.Type = FrameworkHelper::msResourceActivationRequestEvent;
+ else
+ aEvent.Type = FrameworkHelper::msResourceActivationEvent;
+ else
+ if (mbBroadcastRequestEvents)
+ aEvent.Type = FrameworkHelper::msResourceDeactivationRequestEvent;
+ else
+ aEvent.Type = FrameworkHelper::msResourceDeactivationEvent;
+ aEvent.Configuration = this;
+
+ mxBroadcaster->notifyEvent(aEvent);
+}
+
+void Configuration::ThrowIfDisposed() const
+{
+ if (m_bDisposed)
+ {
+ throw lang::DisposedException ("Configuration object has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+bool AreConfigurationsEquivalent (
+ const Reference<XConfiguration>& rxConfiguration1,
+ const Reference<XConfiguration>& rxConfiguration2)
+{
+ if (rxConfiguration1.is() != rxConfiguration2.is())
+ return false;
+ if ( ! rxConfiguration1.is() && ! rxConfiguration2.is())
+ return true;
+
+ // Get the lists of resources from the two given configurations.
+ const Sequence<Reference<XResourceId> > aResources1(
+ rxConfiguration1->getResources(
+ nullptr, OUString(), AnchorBindingMode_INDIRECT));
+ const Sequence<Reference<XResourceId> > aResources2(
+ rxConfiguration2->getResources(
+ nullptr, OUString(), AnchorBindingMode_INDIRECT));
+
+ // When the number of resources differ then the configurations can not
+ // be equivalent.
+ // Comparison of the two lists of resource ids relies on their
+ // ordering.
+ return std::equal(aResources1.begin(), aResources1.end(), aResources2.begin(), aResources2.end(),
+ [](const Reference<XResourceId>& a, const Reference<XResourceId>& b) {
+ if (a.is() && b.is())
+ return a->compareTo(b) == 0;
+ return a.is() == b.is();
+ });
+}
+
+} // end of namespace sd::framework
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_framework_configuration_Configuration_get_implementation(
+ css::uno::XComponentContext*,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::framework::Configuration(nullptr, false));
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ConfigurationClassifier.cxx b/sd/source/ui/framework/configuration/ConfigurationClassifier.cxx
new file mode 100644
index 000000000..99fc1297d
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ConfigurationClassifier.cxx
@@ -0,0 +1,167 @@
+/* -*- 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 "ConfigurationClassifier.hxx"
+
+#include <framework/FrameworkHelper.hxx>
+#include <com/sun/star/drawing/framework/XConfiguration.hpp>
+#include <sal/log.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sd::framework {
+
+ConfigurationClassifier::ConfigurationClassifier (
+ const Reference<XConfiguration>& rxConfiguration1,
+ const Reference<XConfiguration>& rxConfiguration2)
+ : mxConfiguration1(rxConfiguration1),
+ mxConfiguration2(rxConfiguration2)
+{
+}
+
+bool ConfigurationClassifier::Partition()
+{
+ maC1minusC2.clear();
+ maC2minusC1.clear();
+
+ PartitionResources(
+ mxConfiguration1->getResources(nullptr, OUString(), AnchorBindingMode_DIRECT),
+ mxConfiguration2->getResources(nullptr, OUString(), AnchorBindingMode_DIRECT));
+
+ return !maC1minusC2.empty() || !maC2minusC1.empty();
+}
+
+void ConfigurationClassifier::PartitionResources (
+ const css::uno::Sequence<Reference<XResourceId> >& rS1,
+ const css::uno::Sequence<Reference<XResourceId> >& rS2)
+{
+ ResourceIdVector aC1minusC2;
+ ResourceIdVector aC2minusC1;
+ ResourceIdVector aC1andC2;
+
+ // Classify the resources in the configurations that are not bound to
+ // other resources.
+ ClassifyResources(
+ rS1,
+ rS2,
+ aC1minusC2,
+ aC2minusC1,
+ aC1andC2);
+
+ SAL_INFO("sd.fwk", __func__ << ": copying resource ids to C1-C2");
+ CopyResources(aC1minusC2, mxConfiguration1, maC1minusC2);
+ SAL_INFO("sd.fwk", __func__ << ": copying resource ids to C2-C1");
+ CopyResources(aC2minusC1, mxConfiguration2, maC2minusC1);
+
+ // Process the unique resources that belong to both configurations.
+ for (const auto& rxResource : aC1andC2)
+ {
+ PartitionResources(
+ mxConfiguration1->getResources(rxResource, OUString(), AnchorBindingMode_DIRECT),
+ mxConfiguration2->getResources(rxResource, OUString(), AnchorBindingMode_DIRECT));
+ }
+}
+
+void ConfigurationClassifier::ClassifyResources (
+ const css::uno::Sequence<Reference<XResourceId> >& rS1,
+ const css::uno::Sequence<Reference<XResourceId> >& rS2,
+ ResourceIdVector& rS1minusS2,
+ ResourceIdVector& rS2minusS1,
+ ResourceIdVector& rS1andS2)
+{
+ // Find all elements in rS1 and place them in rS1minusS2 or rS1andS2
+ // depending on whether they are in rS2 or not.
+ for (const Reference<XResourceId>& rA1 : rS1)
+ {
+ bool bFound = std::any_of(rS2.begin(), rS2.end(),
+ [&rA1](const Reference<XResourceId>& rA2) {
+ return rA1->getResourceURL() == rA2->getResourceURL(); });
+
+ if (bFound)
+ rS1andS2.push_back(rA1);
+ else
+ rS1minusS2.push_back(rA1);
+ }
+
+ // Find all elements in rS2 that are not in rS1. The elements that are
+ // in both rS1 and rS2 have been handled above and are therefore ignored
+ // here.
+ for (const Reference<XResourceId>& rA2 : rS2)
+ {
+ bool bFound = std::any_of(rS1.begin(), rS1.end(),
+ [&rA2](const Reference<XResourceId>& rA1) {
+ return rA2->getResourceURL() == rA1->getResourceURL(); });
+
+ if ( ! bFound)
+ rS2minusS1.push_back(rA2);
+ }
+}
+
+void ConfigurationClassifier::CopyResources (
+ const ResourceIdVector& rSource,
+ const Reference<XConfiguration>& rxConfiguration,
+ ResourceIdVector& rTarget)
+{
+ // Copy all resources bound to the ones in aC1minusC2Unique to rC1minusC2.
+ for (const auto& rxResource : rSource)
+ {
+ const Sequence<Reference<XResourceId> > aBoundResources (
+ rxConfiguration->getResources(
+ rxResource,
+ OUString(),
+ AnchorBindingMode_INDIRECT));
+ const sal_Int32 nL (aBoundResources.getLength());
+
+ rTarget.reserve(rTarget.size() + 1 + nL);
+ rTarget.push_back(rxResource);
+
+ SAL_INFO("sd.fwk", __func__ << ": copying " <<
+ FrameworkHelper::ResourceIdToString(rxResource));
+
+ for (const Reference<XResourceId>& rBoundResource : aBoundResources)
+ {
+ rTarget.push_back(rBoundResource);
+ SAL_INFO("sd.fwk", __func__ << ": copying " <<
+ FrameworkHelper::ResourceIdToString(rBoundResource));
+ }
+ }
+}
+
+#if DEBUG_SD_CONFIGURATION_TRACE
+
+void ConfigurationClassifier::TraceResourceIdVector (
+ const char* pMessage,
+ const ResourceIdVector& rResources)
+{
+
+ SAL_INFO("sd.fwk", __func__ << ": " << pMessage);
+ for (const auto& rxResource : rResources)
+ {
+ OUString sResource (FrameworkHelper::ResourceIdToString(rxResource));
+ SAL_INFO("sd.fwk", __func__ << ": " << sResource);
+ }
+}
+
+#endif
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ConfigurationClassifier.hxx b/sd/source/ui/framework/configuration/ConfigurationClassifier.hxx
new file mode 100644
index 000000000..e9384713b
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ConfigurationClassifier.hxx
@@ -0,0 +1,165 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "debugtrace.hxx"
+#include <com/sun/star/uno/Reference.hxx>
+
+#include <vector>
+
+namespace com::sun::star::drawing::framework
+{
+class XConfiguration;
+}
+namespace com::sun::star::drawing::framework
+{
+class XResourceId;
+}
+
+namespace sd::framework
+{
+/** A ConfigurationClassifier object compares two configurations of
+ resources and gives access to the differences. It is used mainly when
+ changes to the current configuration have been requested and the various
+ resource controllers have to be supplied with the set of resources that
+ are to be activated or deactivated.
+*/
+class ConfigurationClassifier
+{
+public:
+ /** Create a new ConfigurationClassifier object that will compare the
+ two given configurations.
+ */
+ ConfigurationClassifier(
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration1,
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration2);
+
+ /** Calculate three lists of resource ids. These contain the resources
+ that belong to one configuration but not the other, or that belong
+ to both configurations.
+ @return
+ When the two configurations differ then return <TRUE/>. When
+ they are equivalent then return <FALSE/>.
+ */
+ bool Partition();
+
+ typedef ::std::vector<css::uno::Reference<css::drawing::framework::XResourceId>>
+ ResourceIdVector;
+
+ /** Return the resources that belong to the configuration given as
+ rxConfiguration1 to the constructor but that do not belong to
+ rxConfiguration2.
+ @return
+ A reference to the, possibly empty, list of resources is
+ returned. This reference remains valid as long as the called
+ ConfigurationClassifier object stays alive.
+ */
+ const ResourceIdVector& GetC1minusC2() const { return maC1minusC2; }
+
+ /** Return the resources that belong to the configuration given as
+ rxConfiguration2 to the constructor but that do not belong to
+ rxConfiguration1.
+ @return
+ A reference to the, possibly empty, list of resources is
+ returned. This reference remains valid as long as the called
+ ConfigurationClassifier object stays alive.
+ */
+ const ResourceIdVector& GetC2minusC1() const { return maC2minusC1; }
+
+#if DEBUG_SD_CONFIGURATION_TRACE
+
+ /** Return the resources that belong to both the configurations that
+ where given to the constructor.
+ @return
+ A reference to the, possibly empty, list of resources is
+ returned. This reference remains valid as long as the called
+ ConfigurationClassifier object stays alive.
+ */
+ const ResourceIdVector& GetC1andC2() const { return maC1andC2; }
+
+ static void TraceResourceIdVector(const char* pMessage, const ResourceIdVector& rResources);
+
+#endif
+
+private:
+ css::uno::Reference<css::drawing::framework::XConfiguration> mxConfiguration1;
+ css::uno::Reference<css::drawing::framework::XConfiguration> mxConfiguration2;
+
+ /** After the call to Classify() this vector holds all elements from
+ mxConfiguration1 that are not in mxConfiguration2.
+ */
+ ResourceIdVector maC1minusC2;
+
+ /** After the call to Classify() this vector holds all elements from
+ mxConfiguration2 that are not in mxConfiguration1.
+ */
+ ResourceIdVector maC2minusC1;
+
+ /** Put all the elements in the two given sequences of resource ids and
+ copy them into one of the resource id result vectors maC1minusC2,
+ maC2minusC1, and maC1andC2. This is done by using only the resource
+ URLs for classification. Therefore this method calls itself
+ recursively.
+ @param rS1
+ One sequence of XResourceId objects.
+ @param rS2
+ Another sequence of XResourceId objects.
+ */
+ void PartitionResources(
+ const css::uno::Sequence<css::uno::Reference<css::drawing::framework::XResourceId>>& rS1,
+ const css::uno::Sequence<css::uno::Reference<css::drawing::framework::XResourceId>>& rS2);
+
+ /** Compare the given sequences of resource ids and put their elements
+ in one of three vectors depending on whether an element belongs to
+ both sequences or to one but not the other. Note that only the
+ resource URLs of the XResourceId objects are used for the
+ classification.
+ @param rS1
+ One sequence of XResourceId objects.
+ @param rS2
+ Another sequence of XResourceId objects.
+ */
+ static void ClassifyResources(
+ const css::uno::Sequence<css::uno::Reference<css::drawing::framework::XResourceId>>& rS1,
+ const css::uno::Sequence<css::uno::Reference<css::drawing::framework::XResourceId>>& rS2,
+ ResourceIdVector& rS1minusS2, ResourceIdVector& rS2minusS1, ResourceIdVector& rS1andS2);
+
+ /** Copy the resources given in rSource to the list of resources
+ specified by rTarget. Resources bound to the ones in rSource,
+ either directly or indirectly, are copied as well.
+ @param rSource
+ All resources and the ones bound to them, either directly or
+ indirectly, are copied.
+ @param rxConfiguration
+ This configuration is used to determine the resources bound to
+ the ones in rSource.
+ @param rTarget
+ This list is filled with resources from rSource and the ones
+ bound to them.
+ */
+ static void CopyResources(
+ const ResourceIdVector& rSource,
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration,
+ ResourceIdVector& rTarget);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ConfigurationController.cxx b/sd/source/ui/framework/configuration/ConfigurationController.cxx
new file mode 100644
index 000000000..3fc95adb9
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ConfigurationController.cxx
@@ -0,0 +1,541 @@
+/* -*- 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 <framework/ConfigurationController.hxx>
+#include <framework/Configuration.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include "ConfigurationUpdater.hxx"
+#include "ConfigurationControllerBroadcaster.hxx"
+#include "ConfigurationTracer.hxx"
+#include "GenericConfigurationChangeRequest.hxx"
+#include "ConfigurationControllerResourceManager.hxx"
+#include "ResourceFactoryManager.hxx"
+#include "UpdateRequest.hxx"
+#include "ChangeRequestQueueProcessor.hxx"
+#include "ConfigurationClassifier.hxx"
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/frame/XController.hpp>
+
+#include <sal/log.hxx>
+#include <osl/mutex.hxx>
+#include <vcl/svapp.hxx>
+#include <memory>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+using ::sd::framework::FrameworkHelper;
+
+namespace sd::framework {
+
+//----- ConfigurationController::Implementation -------------------------------
+
+class ConfigurationController::Implementation
+{
+public:
+ Implementation (
+ ConfigurationController& rController,
+ const Reference<frame::XController>& rxController);
+
+ Reference<XControllerManager> mxControllerManager;
+
+ /** The Broadcaster class implements storing and calling of listeners.
+ */
+ std::shared_ptr<ConfigurationControllerBroadcaster> mpBroadcaster;
+
+ /** The requested configuration which is modified (asynchronously) by
+ calls to requestResourceActivation() and
+ requestResourceDeactivation(). The mpConfigurationUpdater makes the
+ current configuration reflect the content of this one.
+ */
+ css::uno::Reference<css::drawing::framework::XConfiguration> mxRequestedConfiguration;
+
+ std::shared_ptr<ResourceFactoryManager> mpResourceFactoryContainer;
+
+ std::shared_ptr<ConfigurationControllerResourceManager> mpResourceManager;
+
+ std::shared_ptr<ConfigurationUpdater> mpConfigurationUpdater;
+
+ /** The queue processor owns the queue of configuration change request
+ objects and processes the objects.
+ */
+ std::unique_ptr<ChangeRequestQueueProcessor> mpQueueProcessor;
+
+ std::shared_ptr<ConfigurationUpdaterLock> mpConfigurationUpdaterLock;
+
+ sal_Int32 mnLockCount;
+};
+
+//===== ConfigurationController::Lock =========================================
+
+ConfigurationController::Lock::Lock (const Reference<XConfigurationController>& rxController)
+ : mxController(rxController)
+{
+ OSL_ASSERT(mxController.is());
+
+ if (mxController.is())
+ mxController->lock();
+}
+
+ConfigurationController::Lock::~Lock()
+{
+ if (mxController.is())
+ mxController->unlock();
+}
+
+//===== ConfigurationController ===============================================
+
+ConfigurationController::ConfigurationController() noexcept
+ : ConfigurationControllerInterfaceBase(m_aMutex)
+ , mbIsDisposed(false)
+{
+}
+
+ConfigurationController::~ConfigurationController() noexcept
+{
+}
+
+void SAL_CALL ConfigurationController::disposing()
+{
+ if (mpImplementation == nullptr)
+ return;
+
+ SAL_INFO("sd.fwk", __func__ << ": ConfigurationController::disposing");
+ SAL_INFO("sd.fwk", __func__ << ": requesting empty configuration");
+ // To destroy all resources an empty configuration is requested and then,
+ // synchronously, all resulting requests are processed.
+ mpImplementation->mpQueueProcessor->Clear();
+ restoreConfiguration(new Configuration(this,false));
+ mpImplementation->mpQueueProcessor->ProcessUntilEmpty();
+ SAL_INFO("sd.fwk", __func__ << ": all requests processed");
+
+ // Now that all resources have been deactivated, mark the controller as
+ // disposed.
+ mbIsDisposed = true;
+
+ // Release the listeners.
+ lang::EventObject aEvent;
+ aEvent.Source = uno::Reference<uno::XInterface>(static_cast<cppu::OWeakObject*>(this));
+
+ {
+ const SolarMutexGuard aSolarGuard;
+ mpImplementation->mpBroadcaster->DisposeAndClear();
+ }
+
+ mpImplementation->mpQueueProcessor.reset();
+ mpImplementation->mxRequestedConfiguration = nullptr;
+ mpImplementation.reset();
+}
+
+void ConfigurationController::ProcessEvent()
+{
+ if (mpImplementation != nullptr)
+ {
+ OSL_ASSERT(mpImplementation->mpQueueProcessor != nullptr);
+
+ mpImplementation->mpQueueProcessor->ProcessOneEvent();
+ }
+}
+
+void ConfigurationController::RequestSynchronousUpdate()
+{
+ if (mpImplementation == nullptr)
+ return;
+ if (mpImplementation->mpQueueProcessor == nullptr)
+ return;
+ mpImplementation->mpQueueProcessor->ProcessUntilEmpty();
+}
+
+//----- XConfigurationControllerBroadcaster -----------------------------------
+
+void SAL_CALL ConfigurationController::addConfigurationChangeListener (
+ const Reference<XConfigurationChangeListener>& rxListener,
+ const OUString& rsEventType,
+ const Any& rUserData)
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+
+ ThrowIfDisposed();
+ OSL_ASSERT(mpImplementation != nullptr);
+ mpImplementation->mpBroadcaster->AddListener(rxListener, rsEventType, rUserData);
+}
+
+void SAL_CALL ConfigurationController::removeConfigurationChangeListener (
+ const Reference<XConfigurationChangeListener>& rxListener)
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+
+ ThrowIfDisposed();
+ mpImplementation->mpBroadcaster->RemoveListener(rxListener);
+}
+
+void SAL_CALL ConfigurationController::notifyEvent (
+ const ConfigurationChangeEvent& rEvent)
+{
+ ThrowIfDisposed();
+ mpImplementation->mpBroadcaster->NotifyListeners(rEvent);
+}
+
+//----- XConfigurationController ----------------------------------------------
+
+void SAL_CALL ConfigurationController::lock()
+{
+ OSL_ASSERT(mpImplementation != nullptr);
+ OSL_ASSERT(mpImplementation->mpConfigurationUpdater != nullptr);
+
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ ++mpImplementation->mnLockCount;
+ if (mpImplementation->mpConfigurationUpdaterLock == nullptr)
+ mpImplementation->mpConfigurationUpdaterLock
+ = mpImplementation->mpConfigurationUpdater->GetLock();
+}
+
+void SAL_CALL ConfigurationController::unlock()
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+
+ // Allow unlocking while the ConfigurationController is being disposed
+ // (but not when that is done and the controller is disposed.)
+ if (rBHelper.bDisposed)
+ ThrowIfDisposed();
+
+ OSL_ASSERT(mpImplementation->mnLockCount>0);
+ --mpImplementation->mnLockCount;
+ if (mpImplementation->mnLockCount == 0)
+ mpImplementation->mpConfigurationUpdaterLock.reset();
+}
+
+void SAL_CALL ConfigurationController::requestResourceActivation (
+ const Reference<XResourceId>& rxResourceId,
+ ResourceActivationMode eMode)
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ // Check whether we are being disposed. This is handled differently
+ // then being completely disposed because the first thing disposing()
+ // does is to deactivate all remaining resources. This is done via
+ // regular methods which must not throw DisposedExceptions. Therefore
+ // we just return silently during that stage.
+ if (rBHelper.bInDispose)
+ {
+ SAL_INFO("sd.fwk", __func__ << ": ConfigurationController::requestResourceActivation(): ignoring " <<
+ FrameworkHelper::ResourceIdToString(rxResourceId));
+ return;
+ }
+
+ SAL_INFO("sd.fwk", __func__ << ": ConfigurationController::requestResourceActivation() " <<
+ FrameworkHelper::ResourceIdToString(rxResourceId));
+
+ if (!rxResourceId.is())
+ return;
+
+ if (eMode == ResourceActivationMode_REPLACE)
+ {
+ // Get a list of the matching resources and create deactivation
+ // requests for them.
+ const Sequence<Reference<XResourceId> > aResourceList (
+ mpImplementation->mxRequestedConfiguration->getResources(
+ rxResourceId->getAnchor(),
+ rxResourceId->getResourceTypePrefix(),
+ AnchorBindingMode_DIRECT));
+
+ for (const auto& rResource : aResourceList)
+ {
+ // Do not request the deactivation of the resource for which
+ // this method was called. Doing it would not change the
+ // outcome but would result in unnecessary work.
+ if (rxResourceId->compareTo(rResource) == 0)
+ continue;
+
+ // Request the deactivation of a resource and all resources
+ // linked to it.
+ requestResourceDeactivation(rResource);
+ }
+ }
+
+ Reference<XConfigurationChangeRequest> xRequest(
+ new GenericConfigurationChangeRequest(
+ rxResourceId,
+ GenericConfigurationChangeRequest::Activation));
+ postChangeRequest(xRequest);
+}
+
+void SAL_CALL ConfigurationController::requestResourceDeactivation (
+ const Reference<XResourceId>& rxResourceId)
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ SAL_INFO("sd.fwk", __func__ << ": ConfigurationController::requestResourceDeactivation() " <<
+ FrameworkHelper::ResourceIdToString(rxResourceId));
+
+ if (!rxResourceId.is())
+ return;
+
+ // Request deactivation of all resources linked to the specified one
+ // as well.
+ const Sequence<Reference<XResourceId> > aLinkedResources (
+ mpImplementation->mxRequestedConfiguration->getResources(
+ rxResourceId,
+ OUString(),
+ AnchorBindingMode_DIRECT));
+ for (const auto& rLinkedResource : aLinkedResources)
+ {
+ // We do not add deactivation requests directly but call this
+ // method recursively, so that when one time there are resources
+ // linked to linked resources, these are handled correctly, too.
+ requestResourceDeactivation(rLinkedResource);
+ }
+
+ // Add a deactivation request for the specified resource.
+ Reference<XConfigurationChangeRequest> xRequest(
+ new GenericConfigurationChangeRequest(
+ rxResourceId,
+ GenericConfigurationChangeRequest::Deactivation));
+ postChangeRequest(xRequest);
+}
+
+Reference<XResource> SAL_CALL ConfigurationController::getResource (
+ const Reference<XResourceId>& rxResourceId)
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ ConfigurationControllerResourceManager::ResourceDescriptor aDescriptor (
+ mpImplementation->mpResourceManager->GetResource(rxResourceId));
+ return aDescriptor.mxResource;
+}
+
+void SAL_CALL ConfigurationController::update()
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ if (mpImplementation->mpQueueProcessor->IsEmpty())
+ {
+ // The queue is empty. Add another request that does nothing but
+ // asynchronously trigger a request for an update.
+ mpImplementation->mpQueueProcessor->AddRequest(new UpdateRequest());
+ }
+ else
+ {
+ // The queue is not empty, so we rely on the queue processor to
+ // request an update automatically when the queue becomes empty.
+ }
+}
+
+sal_Bool SAL_CALL ConfigurationController::hasPendingRequests()
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ return ! mpImplementation->mpQueueProcessor->IsEmpty();
+}
+
+void SAL_CALL ConfigurationController::postChangeRequest (
+ const Reference<XConfigurationChangeRequest>& rxRequest)
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ mpImplementation->mpQueueProcessor->AddRequest(rxRequest);
+}
+
+Reference<XConfiguration> SAL_CALL ConfigurationController::getRequestedConfiguration()
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ if (mpImplementation->mxRequestedConfiguration.is())
+ return Reference<XConfiguration>(
+ mpImplementation->mxRequestedConfiguration->createClone(), UNO_QUERY);
+ else
+ return Reference<XConfiguration>();
+}
+
+Reference<XConfiguration> SAL_CALL ConfigurationController::getCurrentConfiguration()
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ Reference<XConfiguration> xCurrentConfiguration(
+ mpImplementation->mpConfigurationUpdater->GetCurrentConfiguration());
+ if (xCurrentConfiguration.is())
+ return Reference<XConfiguration>(xCurrentConfiguration->createClone(), UNO_QUERY);
+ else
+ return Reference<XConfiguration>();
+}
+
+/** The given configuration is restored by generating the appropriate set of
+ activation and deactivation requests.
+*/
+void SAL_CALL ConfigurationController::restoreConfiguration (
+ const Reference<XConfiguration>& rxNewConfiguration)
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ // We will probably be making a couple of activation and deactivation
+ // requests so lock the configuration controller and let it later update
+ // all changes at once.
+ std::shared_ptr<ConfigurationUpdaterLock> pLock (
+ mpImplementation->mpConfigurationUpdater->GetLock());
+
+ // Get lists of resources that are to be activated or deactivated.
+ Reference<XConfiguration> xCurrentConfiguration (mpImplementation->mxRequestedConfiguration);
+#if OSL_DEBUG_LEVEL >=1
+ SAL_INFO("sd.fwk", __func__ << ": ConfigurationController::restoreConfiguration(");
+ ConfigurationTracer::TraceConfiguration(rxNewConfiguration, "requested configuration");
+ ConfigurationTracer::TraceConfiguration(xCurrentConfiguration, "current configuration");
+#endif
+ ConfigurationClassifier aClassifier (rxNewConfiguration, xCurrentConfiguration);
+ aClassifier.Partition();
+#if DEBUG_SD_CONFIGURATION_TRACE
+ aClassifier.TraceResourceIdVector(
+ "requested but not current resources:\n", aClassifier.GetC1minusC2());
+ aClassifier.TraceResourceIdVector(
+ "current but not requested resources:\n", aClassifier.GetC2minusC1());
+ aClassifier.TraceResourceIdVector(
+ "requested and current resources:\n", aClassifier.GetC1andC2());
+#endif
+
+ // Request the deactivation of resources that are not requested in the
+ // new configuration.
+ const ConfigurationClassifier::ResourceIdVector& rResourcesToDeactivate (
+ aClassifier.GetC2minusC1());
+ for (const auto& rxResource : rResourcesToDeactivate)
+ {
+ requestResourceDeactivation(rxResource);
+ }
+
+ // Request the activation of resources that are requested in the
+ // new configuration but are not part of the current configuration.
+ const ConfigurationClassifier::ResourceIdVector& rResourcesToActivate (
+ aClassifier.GetC1minusC2());
+ for (const auto& rxResource : rResourcesToActivate)
+ {
+ requestResourceActivation(rxResource, ResourceActivationMode_ADD);
+ }
+
+ pLock.reset();
+}
+
+//----- XResourceFactoryManager -----------------------------------------------
+
+void SAL_CALL ConfigurationController::addResourceFactory(
+ const OUString& sResourceURL,
+ const Reference<XResourceFactory>& rxResourceFactory)
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+ mpImplementation->mpResourceFactoryContainer->AddFactory(sResourceURL, rxResourceFactory);
+}
+
+void SAL_CALL ConfigurationController::removeResourceFactoryForURL(
+ const OUString& sResourceURL)
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+ mpImplementation->mpResourceFactoryContainer->RemoveFactoryForURL(sResourceURL);
+}
+
+void SAL_CALL ConfigurationController::removeResourceFactoryForReference(
+ const Reference<XResourceFactory>& rxResourceFactory)
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+ mpImplementation->mpResourceFactoryContainer->RemoveFactoryForReference(rxResourceFactory);
+}
+
+Reference<XResourceFactory> SAL_CALL ConfigurationController::getResourceFactory (
+ const OUString& sResourceURL)
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ return mpImplementation->mpResourceFactoryContainer->GetFactory(sResourceURL);
+}
+
+//----- XInitialization -------------------------------------------------------
+
+void SAL_CALL ConfigurationController::initialize (const Sequence<Any>& aArguments)
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+
+ if (aArguments.getLength() == 1)
+ {
+ const SolarMutexGuard aSolarGuard;
+
+ mpImplementation.reset(new Implementation(
+ *this,
+ Reference<frame::XController>(aArguments[0], UNO_QUERY_THROW)));
+ }
+}
+
+void ConfigurationController::ThrowIfDisposed () const
+{
+ if (mbIsDisposed)
+ {
+ throw lang::DisposedException ("ConfigurationController object has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+
+ if (mpImplementation == nullptr)
+ {
+ OSL_ASSERT(mpImplementation != nullptr);
+ throw RuntimeException("ConfigurationController not initialized",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+//===== ConfigurationController::Implementation ===============================
+
+ConfigurationController::Implementation::Implementation (
+ ConfigurationController& rController,
+ const Reference<frame::XController>& rxController)
+ : mxControllerManager(rxController, UNO_QUERY_THROW),
+ mpBroadcaster(std::make_shared<ConfigurationControllerBroadcaster>(&rController)),
+ mxRequestedConfiguration(new Configuration(&rController, true)),
+ mpResourceFactoryContainer(std::make_shared<ResourceFactoryManager>(mxControllerManager)),
+ mpResourceManager(
+ std::make_shared<ConfigurationControllerResourceManager>(mpResourceFactoryContainer,mpBroadcaster)),
+ mpConfigurationUpdater(
+ std::make_shared<ConfigurationUpdater>(mpBroadcaster, mpResourceManager,mxControllerManager)),
+ mpQueueProcessor(new ChangeRequestQueueProcessor(mpConfigurationUpdater)),
+ mnLockCount(0)
+{
+ mpQueueProcessor->SetConfiguration(mxRequestedConfiguration);
+}
+
+} // end of namespace sd::framework
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_framework_configuration_ConfigurationController_get_implementation(
+ css::uno::XComponentContext*,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::framework::ConfigurationController());
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.cxx b/sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.cxx
new file mode 100644
index 000000000..5d9f22255
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.cxx
@@ -0,0 +1,192 @@
+/* -*- 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 "ConfigurationControllerBroadcaster.hxx"
+#include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/XResource.hpp>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <tools/diagnose_ex.h>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sd::framework {
+
+ConfigurationControllerBroadcaster::ConfigurationControllerBroadcaster (
+ const Reference<XConfigurationController>& rxController)
+ : mxConfigurationController(rxController)
+{
+}
+
+void ConfigurationControllerBroadcaster::AddListener(
+ const Reference<XConfigurationChangeListener>& rxListener,
+ const OUString& rsEventType,
+ const Any& rUserData)
+{
+ if ( ! rxListener.is())
+ throw lang::IllegalArgumentException("invalid listener",
+ mxConfigurationController,
+ 0);
+
+ maListenerMap.try_emplace(rsEventType);
+
+ ListenerDescriptor aDescriptor;
+ aDescriptor.mxListener = rxListener;
+ aDescriptor.maUserData = rUserData;
+ maListenerMap[rsEventType].push_back(aDescriptor);
+}
+
+void ConfigurationControllerBroadcaster::RemoveListener(
+ const Reference<XConfigurationChangeListener>& rxListener)
+{
+ if ( ! rxListener.is())
+ throw lang::IllegalArgumentException("invalid listener",
+ mxConfigurationController,
+ 0);
+
+ ListenerList::iterator iList;
+ for (auto& rMap : maListenerMap)
+ {
+ iList = std::find_if(rMap.second.begin(), rMap.second.end(),
+ [&rxListener](const ListenerDescriptor& rList) { return rList.mxListener == rxListener; });
+ if (iList != rMap.second.end())
+ rMap.second.erase(iList);
+ }
+}
+
+void ConfigurationControllerBroadcaster::NotifyListeners (
+ const ListenerList& rList,
+ const ConfigurationChangeEvent& rEvent)
+{
+ // Create a local copy of the event in which the user data is modified
+ // for every listener.
+ ConfigurationChangeEvent aEvent (rEvent);
+
+ for (const auto& rListener : rList)
+ {
+ try
+ {
+ aEvent.UserData = rListener.maUserData;
+ rListener.mxListener->notifyConfigurationChange(aEvent);
+ }
+ catch (const lang::DisposedException& rException)
+ {
+ // When the exception comes from the listener itself then
+ // unregister it.
+ if (rException.Context == rListener.mxListener)
+ RemoveListener(rListener.mxListener);
+ }
+ catch (const RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+ }
+}
+
+void ConfigurationControllerBroadcaster::NotifyListeners (const ConfigurationChangeEvent& rEvent)
+{
+ // Notify the specialized listeners.
+ ListenerMap::const_iterator iMap (maListenerMap.find(rEvent.Type));
+ if (iMap != maListenerMap.end())
+ {
+ // Create a local list of the listeners to avoid problems with
+ // concurrent changes and to be able to remove disposed listeners.
+ ListenerList aList (iMap->second.begin(), iMap->second.end());
+ NotifyListeners(aList,rEvent);
+ }
+
+ // Notify the universal listeners.
+ iMap = maListenerMap.find(OUString());
+ if (iMap != maListenerMap.end())
+ {
+ // Create a local list of the listeners to avoid problems with
+ // concurrent changes and to be able to remove disposed listeners.
+ ListenerList aList (iMap->second.begin(), iMap->second.end());
+ NotifyListeners(aList,rEvent);
+ }
+}
+
+void ConfigurationControllerBroadcaster::NotifyListeners (
+ const OUString& rsEventType,
+ const Reference<XResourceId>& rxResourceId,
+ const Reference<XResource>& rxResourceObject)
+{
+ ConfigurationChangeEvent aEvent;
+ aEvent.Type = rsEventType;
+ aEvent.ResourceId = rxResourceId;
+ aEvent.ResourceObject = rxResourceObject;
+ try
+ {
+ NotifyListeners(aEvent);
+ }
+ catch (const lang::DisposedException&)
+ {
+ }
+}
+
+void ConfigurationControllerBroadcaster::DisposeAndClear()
+{
+ lang::EventObject aEvent;
+ aEvent.Source = mxConfigurationController;
+ while (!maListenerMap.empty())
+ {
+ ListenerMap::iterator iMap (maListenerMap.begin());
+ if (iMap == maListenerMap.end())
+ break;
+
+ // When the first vector is empty then remove it from the map.
+ if (iMap->second.empty())
+ {
+ maListenerMap.erase(iMap);
+ continue;
+ }
+ else
+ {
+ Reference<XConfigurationChangeListener> xListener (
+ iMap->second.front().mxListener );
+ if (xListener.is())
+ {
+ // Tell the listener that the configuration controller is
+ // being disposed and remove the listener (for all event
+ // types).
+ try
+ {
+ RemoveListener(xListener);
+ xListener->disposing(aEvent);
+ }
+ catch (const RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+ }
+ else
+ {
+ // Remove just this reference to the listener.
+ iMap->second.erase(iMap->second.begin());
+ }
+ }
+ }
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.hxx b/sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.hxx
new file mode 100644
index 000000000..5dfd6843d
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Reference.hxx>
+
+#include <unordered_map>
+#include <vector>
+
+namespace com::sun::star::drawing::framework { class XConfigurationChangeListener; }
+namespace com::sun::star::drawing::framework { class XConfigurationController; }
+namespace com::sun::star::drawing::framework { class XResource; }
+namespace com::sun::star::drawing::framework { class XResourceId; }
+namespace com::sun::star::drawing::framework { struct ConfigurationChangeEvent; }
+
+namespace sd::framework {
+
+/** This class manages the set of XConfigurationChangeListeners and
+ calls them when the ConfigurationController wants to broadcast an
+ event.
+
+ For every registered combination of listener and event type a user data
+ object is stored. This user data object is then given to the listener
+ whenever it is called for an event. With this the listener can use
+ a switch statement to handle different event types.
+*/
+class ConfigurationControllerBroadcaster
+{
+public:
+ /** The given controller is used as origin of thrown exceptions.
+ */
+ explicit ConfigurationControllerBroadcaster (
+ const css::uno::Reference<
+ css::drawing::framework::XConfigurationController>& rxController);
+
+ /** Add a listener for one type of event. When one listener is
+ interested in more than one event type this method has to be called
+ once for every event type. Alternatively it can register as
+ universal listener that will be called for all event types.
+ @param rxListener
+ A valid reference to a listener.
+ @param rsEventType
+ The type of event that the listener will be called for. The
+ empty string is a special value in that the listener will be
+ called for all event types.
+ @param rUserData
+ This object is passed to the listener whenever it is called for
+ the specified event type. For different event types different
+ user data objects can be provided.
+ @throws IllegalArgumentException
+ when an empty listener reference is given.
+ */
+ void AddListener(
+ const css::uno::Reference<
+ css::drawing::framework::XConfigurationChangeListener>& rxListener,
+ const OUString& rsEventType,
+ const css::uno::Any& rUserData);
+
+ /** Remove all references to the given listener. When one listener has
+ been registered for more than one type of event then it is removed
+ for all of them.
+ @param rxListener
+ A valid reference to a listener.
+ @throws IllegalArgumentException
+ when an empty listener reference is given.
+ */
+ void RemoveListener(
+ const css::uno::Reference<
+ css::drawing::framework::XConfigurationChangeListener>& rxListener);
+
+ /** Broadcast the given event to all listeners that have been registered
+ for its type of event as well as all universal listeners.
+
+ When calling a listener results in a DisposedException being thrown
+ the listener is unregistered automatically.
+ */
+ void NotifyListeners (
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent);
+
+ /** This convenience variant of NotifyListeners create the event from
+ the given arguments.
+ */
+ void NotifyListeners (
+ const OUString& rsEventType,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId,
+ const css::uno::Reference<css::drawing::framework::XResource>& rxResourceObject);
+
+ /** Call all listeners and inform them that the
+ ConfigurationController is being disposed. When this method returns
+ the list of registered listeners is empty. Further calls to
+ RemoveListener() are not necessary but do not result in an error.
+ */
+ void DisposeAndClear();
+
+private:
+ css::uno::Reference<css::drawing::framework::XConfigurationController> mxConfigurationController;
+ class ListenerDescriptor
+ {
+ public:
+ css::uno::Reference<css::drawing::framework::XConfigurationChangeListener> mxListener;
+ css::uno::Any maUserData;
+ };
+ typedef std::vector<ListenerDescriptor> ListenerList;
+ typedef std::unordered_map
+ <OUString,
+ ListenerList> ListenerMap;
+ ListenerMap maListenerMap;
+
+ /** Broadcast the given event to all listeners in the given list.
+
+ When calling a listener results in a DisposedException being thrown
+ the listener is unregistered automatically.
+ */
+ void NotifyListeners (
+ const ListenerList& rList,
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.cxx b/sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.cxx
new file mode 100644
index 000000000..904011d7d
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.cxx
@@ -0,0 +1,303 @@
+/* -*- 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 "ConfigurationControllerResourceManager.hxx"
+#include "ConfigurationControllerBroadcaster.hxx"
+#include "ResourceFactoryManager.hxx"
+#include <framework/FrameworkHelper.hxx>
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/drawing/framework/XConfiguration.hpp>
+#include <com/sun/star/drawing/framework/XResourceFactory.hpp>
+#include <tools/diagnose_ex.h>
+#include <sal/log.hxx>
+#include <algorithm>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sd::framework {
+
+//===== ConfigurationControllerResourceManager ================================
+
+ConfigurationControllerResourceManager::ConfigurationControllerResourceManager (
+ const std::shared_ptr<ResourceFactoryManager>& rpResourceFactoryContainer,
+ const std::shared_ptr<ConfigurationControllerBroadcaster>& rpBroadcaster)
+ : maResourceMap(ResourceComparator()),
+ mpResourceFactoryContainer(rpResourceFactoryContainer),
+ mpBroadcaster(rpBroadcaster)
+{
+}
+
+ConfigurationControllerResourceManager::~ConfigurationControllerResourceManager()
+{
+}
+
+ConfigurationControllerResourceManager::ResourceDescriptor
+ ConfigurationControllerResourceManager::GetResource (
+ const Reference<XResourceId>& rxResourceId)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+ ResourceMap::const_iterator iResource (maResourceMap.find(rxResourceId));
+ if (iResource != maResourceMap.end())
+ return iResource->second;
+ else
+ return ResourceDescriptor();
+}
+
+void ConfigurationControllerResourceManager::ActivateResources (
+ const ::std::vector<Reference<XResourceId> >& rResources,
+ const Reference<XConfiguration>& rxConfiguration)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+ // Iterate in normal order over the resources that are to be
+ // activated so that resources on which others depend are activated
+ // before the depending resources are activated.
+ for (const Reference<XResourceId>& xResource : rResources)
+ ActivateResource(xResource, rxConfiguration);
+}
+
+void ConfigurationControllerResourceManager::DeactivateResources (
+ const ::std::vector<Reference<XResourceId> >& rResources,
+ const Reference<XConfiguration>& rxConfiguration)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+ // Iterate in reverse order over the resources that are to be
+ // deactivated so that resources on which others depend are deactivated
+ // only when the depending resources have already been deactivated.
+ ::std::for_each(
+ rResources.rbegin(),
+ rResources.rend(),
+ [&] (Reference<XResourceId> const& xResource) {
+ return DeactivateResource(xResource, rxConfiguration);
+ } );
+}
+
+/* In this method we do following steps.
+ 1. Get the factory with which the resource will be created.
+ 2. Create the resource.
+ 3. Add the resource to the URL->Object map of the configuration
+ controller.
+ 4. Add the resource id to the current configuration.
+ 5. Notify listeners.
+*/
+void ConfigurationControllerResourceManager::ActivateResource (
+ const Reference<XResourceId>& rxResourceId,
+ const Reference<XConfiguration>& rxConfiguration)
+{
+ if ( ! rxResourceId.is())
+ {
+ OSL_ASSERT(rxResourceId.is());
+ return;
+ }
+
+ SAL_INFO("sd.fwk", __func__ << ": activating resource " <<
+ FrameworkHelper::ResourceIdToString(rxResourceId));
+
+ // 1. Get the factory.
+ const OUString sResourceURL (rxResourceId->getResourceURL());
+ Reference<XResourceFactory> xFactory (mpResourceFactoryContainer->GetFactory(sResourceURL));
+ if ( ! xFactory.is())
+ {
+ SAL_INFO("sd.fwk", __func__ << ": no factory found for " << sResourceURL);
+ return;
+ }
+
+ try
+ {
+ // 2. Create the resource.
+ Reference<XResource> xResource;
+ try
+ {
+ xResource = xFactory->createResource(rxResourceId);
+ }
+ catch (lang::DisposedException&)
+ {
+ // The factory is disposed and can be removed from the list
+ // of registered factories.
+ mpResourceFactoryContainer->RemoveFactoryForReference(xFactory);
+ }
+ catch (Exception&) {}
+
+ if (xResource.is())
+ {
+ SAL_INFO("sd.fwk", __func__ << ": successfully created");
+ // 3. Add resource to URL->Object map.
+ AddResource(xResource, xFactory);
+
+ // 4. Add resource id to current configuration.
+ rxConfiguration->addResource(rxResourceId);
+
+ // 5. Notify the new resource to listeners of the ConfigurationController.
+ mpBroadcaster->NotifyListeners(
+ FrameworkHelper::msResourceActivationEvent,
+ rxResourceId,
+ xResource);
+ }
+ else
+ {
+ SAL_INFO("sd.fwk", __func__ << ": resource creation failed");
+ }
+ }
+ catch (RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+}
+
+/* In this method we do following steps.
+ 1. Remove the resource from the URL->Object map of the configuration
+ controller.
+ 2. Notify listeners that deactivation has started.
+ 3. Remove the resource id from the current configuration.
+ 4. Release the resource.
+ 5. Notify listeners about that deactivation is completed.
+*/
+void ConfigurationControllerResourceManager::DeactivateResource (
+ const Reference<XResourceId>& rxResourceId,
+ const Reference<XConfiguration>& rxConfiguration)
+{
+ if ( ! rxResourceId.is())
+ return;
+
+#if OSL_DEBUG_LEVEL >= 1
+ bool bSuccess (false);
+#endif
+ try
+ {
+ // 1. Remove resource from URL->Object map.
+ ResourceDescriptor aDescriptor (RemoveResource(rxResourceId));
+
+ if (aDescriptor.mxResource.is() && aDescriptor.mxResourceFactory.is())
+ {
+ // 2. Notify listeners that the resource is being deactivated.
+ mpBroadcaster->NotifyListeners(
+ FrameworkHelper::msResourceDeactivationEvent,
+ rxResourceId,
+ aDescriptor.mxResource);
+
+ // 3. Remove resource id from current configuration.
+ rxConfiguration->removeResource(rxResourceId);
+
+ // 4. Release the resource.
+ try
+ {
+ aDescriptor.mxResourceFactory->releaseResource(aDescriptor.mxResource);
+ }
+ catch (const lang::DisposedException& rException)
+ {
+ if ( ! rException.Context.is()
+ || rException.Context == aDescriptor.mxResourceFactory)
+ {
+ // The factory is disposed and can be removed from the
+ // list of registered factories.
+ mpResourceFactoryContainer->RemoveFactoryForReference(
+ aDescriptor.mxResourceFactory);
+ }
+ }
+
+#if OSL_DEBUG_LEVEL >= 1
+ bSuccess = true;
+#endif
+ }
+ }
+ catch (RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+
+ // 5. Notify listeners that the resource is being deactivated.
+ mpBroadcaster->NotifyListeners(
+ FrameworkHelper::msResourceDeactivationEndEvent,
+ rxResourceId,
+ nullptr);
+
+#if OSL_DEBUG_LEVEL >= 1
+ if (bSuccess)
+ SAL_INFO("sd.fwk", __func__ << ": successfully deactivated " <<
+ FrameworkHelper::ResourceIdToString(rxResourceId));
+ else
+ SAL_INFO("sd.fwk", __func__ << ": activating resource " <<
+ FrameworkHelper::ResourceIdToString(rxResourceId)
+ << " failed");
+#endif
+}
+
+void ConfigurationControllerResourceManager::AddResource (
+ const Reference<XResource>& rxResource,
+ const Reference<XResourceFactory>& rxFactory)
+{
+ if ( ! rxResource.is())
+ {
+ OSL_ASSERT(rxResource.is());
+ return;
+ }
+
+ // Add the resource to the resource container.
+ ResourceDescriptor aDescriptor;
+ aDescriptor.mxResource = rxResource;
+ aDescriptor.mxResourceFactory = rxFactory;
+ maResourceMap[rxResource->getResourceId()] = aDescriptor;
+
+#if OSL_DEBUG_LEVEL >= 2
+ SAL_INFO("sd.fwk", __func__ << ": ConfigurationControllerResourceManager::AddResource(): added " <<
+ FrameworkHelper::ResourceIdToString(rxResource->getResourceId()) <<
+ " -> " << rxResource.get());
+#endif
+}
+
+ConfigurationControllerResourceManager::ResourceDescriptor
+ ConfigurationControllerResourceManager::RemoveResource (
+ const Reference<XResourceId>& rxResourceId)
+{
+ ResourceDescriptor aDescriptor;
+
+ ResourceMap::iterator iResource (maResourceMap.find(rxResourceId));
+ if (iResource != maResourceMap.end())
+ {
+#if OSL_DEBUG_LEVEL >= 2
+ SAL_INFO("sd.fwk", __func__ << ": ConfigurationControllerResourceManager::RemoveResource(): removing " <<
+ FrameworkHelper::ResourceIdToString(rxResourceId) <<
+ " -> " << &iResource);
+#endif
+
+ aDescriptor = iResource->second;
+ maResourceMap.erase(rxResourceId);
+ }
+
+ return aDescriptor;
+}
+
+//===== ConfigurationControllerResourceManager::ResourceComparator ============
+
+bool ConfigurationControllerResourceManager::ResourceComparator::operator() (
+ const Reference<XResourceId>& rxId1,
+ const Reference<XResourceId>& rxId2) const
+{
+ if (rxId1.is() && rxId2.is())
+ return rxId1->compareTo(rxId2)<0;
+ else if (rxId1.is())
+ return true;
+ else
+ return false;
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.hxx b/sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.hxx
new file mode 100644
index 000000000..f3a3d6d76
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.hxx
@@ -0,0 +1,141 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <osl/mutex.hxx>
+
+#include <com/sun/star/uno/Reference.hxx>
+
+#include <map>
+#include <memory>
+#include <vector>
+
+namespace com::sun::star::drawing::framework { class XConfiguration; }
+namespace com::sun::star::drawing::framework { class XResourceFactory; }
+namespace com::sun::star::drawing::framework { class XResource; }
+namespace com::sun::star::drawing::framework { class XResourceId; }
+
+namespace sd::framework {
+
+class ConfigurationControllerBroadcaster;
+class ResourceFactoryManager;
+
+/** Manage the set of active resources. Activate and deactivate resources.
+*/
+class ConfigurationControllerResourceManager
+{
+public:
+ /** For every active resource both the resource itself as well as its
+ creating factory are remembered, so that on deactivation, the
+ resource can be deactivated by this factory.
+ */
+ class ResourceDescriptor
+ {
+ public:
+ css::uno::Reference<css::drawing::framework::XResource> mxResource;
+ css::uno::Reference<css::drawing::framework::XResourceFactory> mxResourceFactory;
+ };
+
+ /** A new ResourceManager object is created with the resource factory
+ container for creating resources and the event broadcaster for
+ notifying ConfigurationChangeListeners of activated or deactivated
+ resources.
+ */
+ ConfigurationControllerResourceManager (
+ const std::shared_ptr<ResourceFactoryManager>& rpResourceFactoryContainer,
+ const std::shared_ptr<ConfigurationControllerBroadcaster>& rpBroadcaster);
+
+ ~ConfigurationControllerResourceManager();
+
+ /// Forbid copy construction and copy assignment
+ ConfigurationControllerResourceManager(const ConfigurationControllerResourceManager&) = delete;
+ ConfigurationControllerResourceManager& operator=(const ConfigurationControllerResourceManager&) = delete;
+
+ /** Activate all the resources that are specified by resource ids in
+ rResources. The resource ids of activated resources are added to
+ the given configuration. Activated resources are notified to all
+ interested ConfigurationChangeListeners.
+ */
+ void ActivateResources (
+ const ::std::vector<
+ css::uno::Reference<css::drawing::framework::XResourceId> >& rResources,
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration);
+
+ /** Deactivate all the resources that are specified by resource ids in
+ rResources. The resource ids of deactivated resources are removed
+ from the given configuration. Activated resources are notified to all
+ interested ConfigurationChangeListeners.
+ */
+ void DeactivateResources (
+ const ::std::vector<
+ css::uno::Reference<css::drawing::framework::XResourceId> >& rResources,
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration);
+
+ /** Return the descriptor for the specified resource.
+ @return
+ When there is no active resource for the given resource id then
+ an empty descriptor is returned.
+ */
+ ResourceDescriptor GetResource (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId);
+
+private:
+ osl::Mutex maMutex;
+
+ class ResourceComparator
+ {
+ public:
+ bool operator() (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxId1,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxId2) const;
+ };
+
+ typedef ::std::map<
+ css::uno::Reference<css::drawing::framework::XResourceId>,
+ ResourceDescriptor,
+ ResourceComparator> ResourceMap;
+ ResourceMap maResourceMap;
+
+ std::shared_ptr<ResourceFactoryManager> mpResourceFactoryContainer;
+
+ /** This broadcaster is used to notify the activation and deactivation
+ of resources.
+ */
+ std::shared_ptr<ConfigurationControllerBroadcaster> mpBroadcaster;
+
+ void ActivateResource (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId,
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration);
+
+ void DeactivateResource (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId,
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration);
+
+ void AddResource (
+ const css::uno::Reference<css::drawing::framework::XResource>& rxResource,
+ const css::uno::Reference<css::drawing::framework::XResourceFactory>& rxFactory);
+
+ ResourceDescriptor RemoveResource (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ConfigurationTracer.cxx b/sd/source/ui/framework/configuration/ConfigurationTracer.cxx
new file mode 100644
index 000000000..00ddd5ff1
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ConfigurationTracer.cxx
@@ -0,0 +1,73 @@
+/* -*- 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 "ConfigurationTracer.hxx"
+
+#include <com/sun/star/drawing/framework/XConfiguration.hpp>
+#include <sal/log.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sd::framework {
+
+void ConfigurationTracer::TraceConfiguration (
+ const Reference<XConfiguration>& rxConfiguration,
+ const char* pMessage)
+{
+#if OSL_DEBUG_LEVEL >=1
+ SAL_INFO("sd.ui","" << pMessage << " at " << rxConfiguration.get() << " {");
+ if (rxConfiguration.is())
+ {
+ TraceBoundResources(rxConfiguration, nullptr, 0);
+ }
+ else
+ {
+ SAL_INFO("sd.ui"," empty");
+ }
+ SAL_INFO("sd.ui","}");
+#else
+ (void)rxConfiguration;
+ (void)pMessage;
+#endif
+}
+
+#if OSL_DEBUG_LEVEL >=1
+void ConfigurationTracer::TraceBoundResources (
+ const Reference<XConfiguration>& rxConfiguration,
+ const Reference<XResourceId>& rxResourceId,
+ const int nIndentation)
+{
+ const Sequence<Reference<XResourceId> > aResourceList (
+ rxConfiguration->getResources(rxResourceId, OUString(), AnchorBindingMode_DIRECT));
+ static const OUStringLiteral sIndentation (u" ");
+ for (Reference<XResourceId> const & resourceId : aResourceList)
+ {
+ OUString sLine (resourceId->getResourceURL());
+ for (int i=0; i<nIndentation; ++i)
+ sLine = sIndentation + sLine;
+ SAL_INFO("sd.ui", "" << sLine);
+ TraceBoundResources(rxConfiguration, resourceId, nIndentation+1);
+ }
+}
+#endif
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ConfigurationTracer.hxx b/sd/source/ui/framework/configuration/ConfigurationTracer.hxx
new file mode 100644
index 000000000..337fae569
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ConfigurationTracer.hxx
@@ -0,0 +1,58 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+
+namespace com::sun::star::drawing::framework
+{
+class XConfiguration;
+}
+namespace com::sun::star::drawing::framework
+{
+class XResourceId;
+}
+namespace com::sun::star::uno
+{
+template <typename> class Reference;
+}
+
+namespace sd::framework
+{
+/** Print debug information about configurations to the standard error
+ output channel.
+*/
+class ConfigurationTracer
+{
+public:
+ static void TraceConfiguration(
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration,
+ const char* pMessage);
+#if OSL_DEBUG_LEVEL >= 1
+ static void TraceBoundResources(
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId,
+ const int nIndentation);
+#endif
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ConfigurationUpdater.cxx b/sd/source/ui/framework/configuration/ConfigurationUpdater.cxx
new file mode 100644
index 000000000..96ac74186
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ConfigurationUpdater.cxx
@@ -0,0 +1,376 @@
+/* -*- 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 "ConfigurationUpdater.hxx"
+#include "ConfigurationTracer.hxx"
+#include "ConfigurationClassifier.hxx"
+#include "ConfigurationControllerBroadcaster.hxx"
+#include "ConfigurationControllerResourceManager.hxx"
+#include <framework/Configuration.hxx>
+#include <framework/FrameworkHelper.hxx>
+
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <comphelper/scopeguard.hxx>
+#include <tools/diagnose_ex.h>
+#include <sal/log.hxx>
+
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+using ::sd::framework::FrameworkHelper;
+using ::std::vector;
+
+namespace {
+const sal_Int32 snShortTimeout (100);
+const sal_Int32 snNormalTimeout (1000);
+const sal_Int32 snLongTimeout (10000);
+const sal_Int32 snShortTimeoutCountThreshold (1);
+const sal_Int32 snNormalTimeoutCountThreshold (5);
+}
+
+namespace sd::framework {
+
+//===== ConfigurationUpdaterLock ==============================================
+
+class ConfigurationUpdaterLock
+{
+public:
+ explicit ConfigurationUpdaterLock (ConfigurationUpdater& rUpdater)
+ : mrUpdater(rUpdater) { mrUpdater.LockUpdates(); }
+ ~ConfigurationUpdaterLock() { mrUpdater.UnlockUpdates(); }
+private:
+ ConfigurationUpdater& mrUpdater;
+};
+
+//===== ConfigurationUpdater ==================================================
+
+ConfigurationUpdater::ConfigurationUpdater (
+ const std::shared_ptr<ConfigurationControllerBroadcaster>& rpBroadcaster,
+ const std::shared_ptr<ConfigurationControllerResourceManager>& rpResourceManager,
+ const Reference<XControllerManager>& rxControllerManager)
+ : mpBroadcaster(rpBroadcaster),
+ mxCurrentConfiguration(Reference<XConfiguration>(new Configuration(nullptr, false))),
+ mbUpdatePending(false),
+ mbUpdateBeingProcessed(false),
+ mnLockCount(0),
+ maUpdateTimer("sd::ConfigurationUpdater maUpdateTimer"),
+ mnFailedUpdateCount(0),
+ mpResourceManager(rpResourceManager)
+{
+ // Prepare the timer that is started when after an update the current
+ // and the requested configuration differ. With the timer we try
+ // updates until the two configurations are the same.
+ maUpdateTimer.SetTimeout(snNormalTimeout);
+ maUpdateTimer.SetInvokeHandler(LINK(this,ConfigurationUpdater,TimeoutHandler));
+ mxControllerManager = rxControllerManager;
+}
+
+ConfigurationUpdater::~ConfigurationUpdater()
+{
+ maUpdateTimer.Stop();
+}
+
+void ConfigurationUpdater::RequestUpdate (
+ const Reference<XConfiguration>& rxRequestedConfiguration)
+{
+ mxRequestedConfiguration = rxRequestedConfiguration;
+
+ // Find out whether we really can update the configuration.
+ if (IsUpdatePossible())
+ {
+ SAL_INFO("sd.fwk", __func__ << ": UpdateConfiguration start");
+
+ // Call UpdateConfiguration while that is possible and while someone
+ // set mbUpdatePending to true in the middle of it.
+ do
+ {
+ UpdateConfiguration();
+ }
+ while (mbUpdatePending && IsUpdatePossible());
+ }
+ else
+ {
+ mbUpdatePending = true;
+ SAL_INFO("sd.fwk", __func__ << ": scheduling update for later");
+ }
+}
+
+bool ConfigurationUpdater::IsUpdatePossible() const
+{
+ return ! mbUpdateBeingProcessed
+ && mxControllerManager.is()
+ && mnLockCount==0
+ && mxRequestedConfiguration.is()
+ && mxCurrentConfiguration.is();
+}
+
+void ConfigurationUpdater::UpdateConfiguration()
+{
+ SAL_INFO("sd.fwk", __func__ << ": UpdateConfiguration update");
+ SetUpdateBeingProcessed(true);
+ comphelper::ScopeGuard aScopeGuard (
+ [this] () { return this->SetUpdateBeingProcessed(false); });
+
+ try
+ {
+ mbUpdatePending = false;
+
+ CleanRequestedConfiguration();
+ ConfigurationClassifier aClassifier(mxRequestedConfiguration, mxCurrentConfiguration);
+ if (aClassifier.Partition())
+ {
+#if DEBUG_SD_CONFIGURATION_TRACE
+ SAL_INFO("sd.fwk", __func__ << ": ConfigurationUpdater::UpdateConfiguration(");
+ ConfigurationTracer::TraceConfiguration(
+ mxRequestedConfiguration, "requested configuration");
+ ConfigurationTracer::TraceConfiguration(
+ mxCurrentConfiguration, "current configuration");
+#endif
+ // Notify the beginning of the update.
+ ConfigurationChangeEvent aEvent;
+ aEvent.Type = FrameworkHelper::msConfigurationUpdateStartEvent;
+ aEvent.Configuration = mxRequestedConfiguration;
+ mpBroadcaster->NotifyListeners(aEvent);
+
+ // Do the actual update. All exceptions are caught and ignored,
+ // so that the end of the update is notified always.
+ try
+ {
+ if (mnLockCount == 0)
+ UpdateCore(aClassifier);
+ }
+ catch(const RuntimeException&)
+ {
+ }
+
+ // Notify the end of the update.
+ aEvent.Type = FrameworkHelper::msConfigurationUpdateEndEvent;
+ mpBroadcaster->NotifyListeners(aEvent);
+
+ CheckUpdateSuccess();
+ }
+ else
+ {
+ SAL_INFO("sd.fwk", __func__ << ": nothing to do");
+#if DEBUG_SD_CONFIGURATION_TRACE
+ ConfigurationTracer::TraceConfiguration(
+ mxRequestedConfiguration, "requested configuration");
+ ConfigurationTracer::TraceConfiguration(
+ mxCurrentConfiguration, "current configuration");
+#endif
+ }
+ }
+ catch(const RuntimeException &)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+
+ SAL_INFO("sd.fwk", __func__ << ": ConfigurationUpdater::UpdateConfiguration)");
+ SAL_INFO("sd.fwk", __func__ << ": UpdateConfiguration end");
+}
+
+void ConfigurationUpdater::CleanRequestedConfiguration()
+{
+ if (!mxControllerManager.is())
+ return;
+
+ // Request the deactivation of pure anchors that have no child.
+ vector<Reference<XResourceId> > aResourcesToDeactivate;
+ CheckPureAnchors(mxRequestedConfiguration, aResourcesToDeactivate);
+ if (!aResourcesToDeactivate.empty())
+ {
+ Reference<XConfigurationController> xCC (
+ mxControllerManager->getConfigurationController());
+ for (const auto& rxId : aResourcesToDeactivate)
+ if (rxId.is())
+ xCC->requestResourceDeactivation(rxId);
+ }
+}
+
+void ConfigurationUpdater::CheckUpdateSuccess()
+{
+ // When the two configurations differ then start the timer to call
+ // another update later.
+ if ( ! AreConfigurationsEquivalent(mxCurrentConfiguration, mxRequestedConfiguration))
+ {
+ if (mnFailedUpdateCount <= snShortTimeoutCountThreshold)
+ maUpdateTimer.SetTimeout(snShortTimeout);
+ else if (mnFailedUpdateCount < snNormalTimeoutCountThreshold)
+ maUpdateTimer.SetTimeout(snNormalTimeout);
+ else
+ maUpdateTimer.SetTimeout(snLongTimeout);
+ ++mnFailedUpdateCount;
+ maUpdateTimer.Start();
+ }
+ else
+ {
+ // Update was successful. Reset the failed update count.
+ mnFailedUpdateCount = 0;
+ }
+}
+
+void ConfigurationUpdater::UpdateCore (const ConfigurationClassifier& rClassifier)
+{
+ try
+ {
+#if DEBUG_SD_CONFIGURATION_TRACE
+ rClassifier.TraceResourceIdVector(
+ "requested but not current resources:", rClassifier.GetC1minusC2());
+ rClassifier.TraceResourceIdVector(
+ "current but not requested resources:", rClassifier.GetC2minusC1());
+ rClassifier.TraceResourceIdVector(
+ "requested and current resources:", rClassifier.GetC1andC2());
+#endif
+
+ // Updating of the sub controllers is done in two steps. In the
+ // first the sub controllers typically shut down resources that are
+ // not requested anymore. In the second the sub controllers
+ // typically set up resources that have been newly requested.
+ mpResourceManager->DeactivateResources(rClassifier.GetC2minusC1(), mxCurrentConfiguration);
+ mpResourceManager->ActivateResources(rClassifier.GetC1minusC2(), mxCurrentConfiguration);
+
+#if DEBUG_SD_CONFIGURATION_TRACE
+ SAL_INFO("sd.fwk", __func__ << ": ConfigurationController::UpdateConfiguration)");
+ ConfigurationTracer::TraceConfiguration(
+ mxRequestedConfiguration, "requested configuration");
+ ConfigurationTracer::TraceConfiguration(
+ mxCurrentConfiguration, "current configuration");
+#endif
+
+ // Deactivate pure anchors that have no child.
+ vector<Reference<XResourceId> > aResourcesToDeactivate;
+ CheckPureAnchors(mxCurrentConfiguration, aResourcesToDeactivate);
+ if (!aResourcesToDeactivate.empty())
+ mpResourceManager->DeactivateResources(aResourcesToDeactivate, mxCurrentConfiguration);
+ }
+ catch(const RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+}
+
+void ConfigurationUpdater::CheckPureAnchors (
+ const Reference<XConfiguration>& rxConfiguration,
+ vector<Reference<XResourceId> >& rResourcesToDeactivate)
+{
+ if ( ! rxConfiguration.is())
+ return;
+
+ // Get a list of all resources in the configuration.
+ Sequence<Reference<XResourceId> > aResources(
+ rxConfiguration->getResources(
+ nullptr, OUString(), AnchorBindingMode_INDIRECT));
+ auto aResourcesRange = asNonConstRange(aResources);
+ sal_Int32 nCount (aResources.getLength());
+
+ // Prepare the list of pure anchors that have to be deactivated.
+ rResourcesToDeactivate.clear();
+
+ // Iterate over the list in reverse order because when there is a chain
+ // of pure anchors with only the last one having no child then the whole
+ // list has to be deactivated.
+ sal_Int32 nIndex (nCount-1);
+ while (nIndex >= 0)
+ {
+ const Reference<XResourceId> xResourceId (aResources[nIndex]);
+ const Reference<XResource> xResource (
+ mpResourceManager->GetResource(xResourceId).mxResource);
+ bool bDeactiveCurrentResource (false);
+
+ // Skip all resources that are no pure anchors.
+ if (xResource.is() && xResource->isAnchorOnly())
+ {
+ // When xResource is not an anchor of the next resource in
+ // the list then it is the anchor of no resource at all.
+ if (nIndex == nCount-1)
+ {
+ // No following anchors, deactivate this one, then remove it
+ // from the list.
+ bDeactiveCurrentResource = true;
+ }
+ else
+ {
+ const Reference<XResourceId> xPrevResourceId (aResources[nIndex+1]);
+ if ( ! xPrevResourceId.is()
+ || ! xPrevResourceId->isBoundTo(xResourceId, AnchorBindingMode_DIRECT))
+ {
+ // The previous resource (id) does not exist or is not bound to
+ // the current anchor.
+ bDeactiveCurrentResource = true;
+ }
+ }
+ }
+
+ if (bDeactiveCurrentResource)
+ {
+ SAL_INFO("sd.fwk", __func__ << ": deactivating pure anchor " <<
+ FrameworkHelper::ResourceIdToString(xResourceId) <<
+ "because it has no children");
+ // Erase element from current configuration.
+ for (sal_Int32 nI=nIndex; nI<nCount-2; ++nI)
+ aResourcesRange[nI] = aResources[nI+1];
+ nCount -= 1;
+
+ rResourcesToDeactivate.push_back(xResourceId);
+ }
+ nIndex -= 1;
+ }
+}
+
+void ConfigurationUpdater::LockUpdates()
+{
+ ++mnLockCount;
+}
+
+void ConfigurationUpdater::UnlockUpdates()
+{
+ --mnLockCount;
+ if (mnLockCount == 0 && mbUpdatePending)
+ {
+ RequestUpdate(mxRequestedConfiguration);
+ }
+}
+
+std::shared_ptr<ConfigurationUpdaterLock> ConfigurationUpdater::GetLock()
+{
+ return std::make_shared<ConfigurationUpdaterLock>(*this);
+}
+
+void ConfigurationUpdater::SetUpdateBeingProcessed (bool bValue)
+{
+ mbUpdateBeingProcessed = bValue;
+}
+
+IMPL_LINK_NOARG(ConfigurationUpdater, TimeoutHandler, Timer *, void)
+{
+ if ( ! mbUpdateBeingProcessed
+ && mxCurrentConfiguration.is()
+ && mxRequestedConfiguration.is())
+ {
+ if ( ! AreConfigurationsEquivalent(mxCurrentConfiguration, mxRequestedConfiguration))
+ {
+ RequestUpdate(mxRequestedConfiguration);
+ }
+ }
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ConfigurationUpdater.hxx b/sd/source/ui/framework/configuration/ConfigurationUpdater.hxx
new file mode 100644
index 000000000..9fba364b1
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ConfigurationUpdater.hxx
@@ -0,0 +1,209 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <vcl/timer.hxx>
+#include <memory>
+#include <vector>
+
+namespace com::sun::star::drawing::framework
+{
+class XConfiguration;
+}
+namespace com::sun::star::drawing::framework
+{
+class XControllerManager;
+}
+namespace com::sun::star::drawing::framework
+{
+class XResourceId;
+}
+
+namespace sd::framework
+{
+class ConfigurationClassifier;
+class ConfigurationUpdaterLock;
+class ConfigurationControllerResourceManager;
+class ConfigurationControllerBroadcaster;
+
+/** This is a helper class for the ConfigurationController. It handles the
+ update of the current configuration so that it looks like a requested
+ configuration. An update is made by activating or deactivating drawing
+ framework resources.
+
+ When an update is not successful, i.e. after the update the current
+ configuration is not equivalent to the requested configuration, then a
+ timer is started to repeat the update after a short time.
+*/
+class ConfigurationUpdater
+{
+public:
+ /** Create a new ConfigurationUpdater object that notifies configuration
+ changes and the start and end of updates via the given broadcaster.
+ */
+ ConfigurationUpdater(
+ const std::shared_ptr<ConfigurationControllerBroadcaster>& rpBroadcaster,
+ const std::shared_ptr<ConfigurationControllerResourceManager>& rpResourceManager,
+ const css::uno::Reference<css::drawing::framework::XControllerManager>&
+ rxControllerManager);
+ ~ConfigurationUpdater();
+
+ /** Request an update of the current configuration so that it looks like
+ the given requested configuration. It checks whether an update of
+ the current configuration can be done. Calls UpdateConfiguration()
+ if that is the case. Otherwise it schedules a later call to
+ UpdateConfiguration().
+ */
+ void RequestUpdate(const css::uno::Reference<css::drawing::framework::XConfiguration>&
+ rxRequestedConfiguration);
+
+ const css::uno::Reference<css::drawing::framework::XConfiguration>&
+ GetCurrentConfiguration() const
+ {
+ return mxCurrentConfiguration;
+ }
+
+ friend class ConfigurationUpdaterLock;
+ /** Return a lock of the called ConfigurationUpdater. While the
+ returned object exists no update of the current configuration is
+ made.
+ */
+ std::shared_ptr<ConfigurationUpdaterLock> GetLock();
+
+private:
+ /** A reference to the XControllerManager is kept so that
+ UpdateConfiguration() has access to the other sub controllers.
+ */
+ css::uno::Reference<css::drawing::framework::XControllerManager> mxControllerManager;
+
+ std::shared_ptr<ConfigurationControllerBroadcaster> mpBroadcaster;
+
+ /** The current configuration holds the resources that are currently
+ active. It is modified during an update.
+ */
+ css::uno::Reference<css::drawing::framework::XConfiguration> mxCurrentConfiguration;
+
+ /** The requested configuration holds the resources that have been
+ requested to activate or to deactivate since the last update. It is
+ (usually) not modified during an update. This configuration is
+ maintained by the ConfigurationController and given to the
+ ConfigurationUpdater in the RequestUpdate() method.
+ */
+ css::uno::Reference<css::drawing::framework::XConfiguration> mxRequestedConfiguration;
+
+ /** This flag is set to </sal_True> when an update of the current
+ configuration was requested (because the last request in the queue
+ was processed) but could not be executed because the
+ ConfigurationController was locked. A call to UpdateConfiguration()
+ resets the flag to </sal_False>.
+ */
+ bool mbUpdatePending;
+
+ /** This flag is set to </sal_True> while the UpdateConfiguration() method
+ is running. It is used to prevent reentrance problems with this
+ method.
+ */
+ bool mbUpdateBeingProcessed;
+
+ /** The ConfigurationController is locked when this count has a value
+ larger then zero. If the controller is locked then updates of the
+ current configuration are not made.
+ */
+ sal_Int32 mnLockCount;
+
+ /** This timer is used to check from time to time whether the requested
+ configuration and the current configuration are identical and request
+ an update when they are not.
+ This is used to overcome problems with resources that become
+ available asynchronously.
+ */
+ Timer maUpdateTimer;
+
+ /** The number of failed updates (those after which the current
+ configuration is not equivalent to the requested configuration) is
+ used to determine how long to wait before another update is made.
+ */
+ sal_Int32 mnFailedUpdateCount;
+
+ std::shared_ptr<ConfigurationControllerResourceManager> mpResourceManager;
+
+ /** This method does the main work of an update. It calls the sub
+ controllers that are responsible for the various types of resources
+ and tells them to update their active resources. It notifies
+ listeners about the start and end of the configuration update.
+ */
+ void UpdateConfiguration();
+
+ /** Basically calls UpdaterStart() andUpdateEnd() and makes some debug
+ output.
+ */
+ void UpdateCore(const ConfigurationClassifier& rClassifier);
+
+ /** Check for all pure anchors if they have at least one child.
+ Childless pure anchors are deactivated.
+ This affects only the current configuration.
+ */
+ void CheckPureAnchors(
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration,
+ ::std::vector<css::uno::Reference<css::drawing::framework::XResourceId>>&
+ rResourcesToDeactivate);
+
+ /** Remove from the requested configuration all pure anchors that have no
+ child. Requested but not yet activated anchors can not be removed
+ because without the actual resource the 'pureness' of an anchor can
+ not be determined.
+ */
+ void CleanRequestedConfiguration();
+
+ /** Check the success of a recently executed configuration update.
+ When the update failed then start the timer.
+ */
+ void CheckUpdateSuccess();
+
+ /** This method sets the mbUpdateBeingProcessed member that is used to
+ prevent reentrance problems. This method allows function objects
+ easily and safely to modify the variable.
+ */
+ void SetUpdateBeingProcessed(bool bValue);
+
+ /** Return whether it is possible to do an update of the configuration.
+ This takes into account whether another update is currently being
+ executed, the lock count, and whether the configuration controller
+ is still valid.
+ */
+ bool IsUpdatePossible() const;
+
+ /** Lock updates of the current configuration. For intermediate requests
+ for updates mbUpdatePending is set to <TRUE/>.
+ */
+ void LockUpdates();
+
+ /** When an update was requested since the last LockUpdates() call then
+ RequestUpdate() is called.
+ */
+ void UnlockUpdates();
+
+ DECL_LINK(TimeoutHandler, Timer*, void);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.cxx b/sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.cxx
new file mode 100644
index 000000000..fa6d41503
--- /dev/null
+++ b/sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.cxx
@@ -0,0 +1,81 @@
+/* -*- 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 <string_view>
+
+#include "GenericConfigurationChangeRequest.hxx"
+
+#include <framework/FrameworkHelper.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sd::framework {
+
+GenericConfigurationChangeRequest::GenericConfigurationChangeRequest (
+ const Reference<XResourceId>& rxResourceId,
+ const Mode eMode)
+ : mxResourceId(rxResourceId),
+ meMode(eMode)
+{
+ if ( ! rxResourceId.is() || rxResourceId->getResourceURL().isEmpty())
+ throw css::lang::IllegalArgumentException();
+}
+
+GenericConfigurationChangeRequest::~GenericConfigurationChangeRequest() noexcept
+{
+}
+
+void SAL_CALL GenericConfigurationChangeRequest::execute (
+ const Reference<XConfiguration>& rxConfiguration)
+{
+ if (!rxConfiguration.is())
+ return;
+
+ switch (meMode)
+ {
+ case Activation:
+ rxConfiguration->addResource(mxResourceId);
+ break;
+
+ case Deactivation:
+ rxConfiguration->removeResource(mxResourceId);
+ break;
+ }
+}
+
+OUString SAL_CALL GenericConfigurationChangeRequest::getName()
+{
+ return OUString::Concat("GenericConfigurationChangeRequest ")
+ + (meMode==Activation
+ ? std::u16string_view(u"activate ") : std::u16string_view(u"deactivate "))
+ + FrameworkHelper::ResourceIdToString(mxResourceId);
+}
+
+void SAL_CALL GenericConfigurationChangeRequest::setName (const OUString&)
+{
+ // Ignored.
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.hxx b/sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.hxx
new file mode 100644
index 000000000..3caa7a8ca
--- /dev/null
+++ b/sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.hxx
@@ -0,0 +1,98 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XConfigurationChangeRequest.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <comphelper/compbase.hxx>
+
+namespace com::sun::star::drawing::framework { class XConfiguration; }
+namespace com::sun::star::drawing::framework { class XResourceId; }
+
+namespace sd::framework {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::framework::XConfigurationChangeRequest,
+ css::container::XNamed
+ > GenericConfigurationChangeRequestInterfaceBase;
+
+/** This implementation of the XConfigurationChangeRequest interface
+ represents a single explicit request for a configuration change. On its
+ execution it may result in other, implicit, configuration changes. For
+ example this is the case when the deactivation of a unique resource is
+ requested: the resources linked to it have to be deactivated as well.
+*/
+class GenericConfigurationChangeRequest final
+ : public GenericConfigurationChangeRequestInterfaceBase
+{
+public:
+ /** This enum specified whether the activation or deactivation of a
+ resource is requested.
+ */
+ enum Mode { Activation, Deactivation };
+
+ /** Create a new object that represents the request for activation or
+ deactivation of the specified resource.
+ @param rxsResourceId
+ Id of the resource that is to be activated or deactivated.
+ @param eMode
+ The mode specifies whether to activate or to deactivate the
+ resource.
+ @throws css::css::lang::IllegalArgumentException
+ */
+ GenericConfigurationChangeRequest (
+ const css::uno::Reference<css::drawing::framework::XResourceId>&
+ rxResourceId,
+ const Mode eMode);
+
+ virtual ~GenericConfigurationChangeRequest() noexcept override;
+
+ // XConfigurationChangeOperation
+
+ /** The requested configuration change is executed on the given
+ configuration. Additionally to the explicitly requested change
+ other changes have to be made as well. See class description for an
+ example.
+ @param rxConfiguration
+ The configuration to which the requested change is made.
+ */
+ virtual void SAL_CALL execute (
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration) override;
+
+ // XNamed
+
+ /** Return a human readable string representation. This is used for
+ debugging purposes.
+ */
+ virtual OUString SAL_CALL getName() override;
+
+ /** This call is ignored because the XNamed interface is (mis)used to
+ give access to a human readable name for debugging purposes.
+ */
+ virtual void SAL_CALL setName (const OUString& rName) override;
+
+private:
+ const css::uno::Reference<css::drawing::framework::XResourceId> mxResourceId;
+ const Mode meMode;
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ResourceFactoryManager.cxx b/sd/source/ui/framework/configuration/ResourceFactoryManager.cxx
new file mode 100644
index 000000000..4817c1360
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ResourceFactoryManager.cxx
@@ -0,0 +1,197 @@
+/* -*- 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 "ResourceFactoryManager.hxx"
+#include <tools/wldcrd.hxx>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/util/URLTransformer.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <comphelper/processfactory.hxx>
+#include <sal/log.hxx>
+
+#include <algorithm>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+#undef VERBOSE
+//#define VERBOSE 1
+
+namespace sd::framework {
+
+ResourceFactoryManager::ResourceFactoryManager (const Reference<XControllerManager>& rxManager)
+ : mxControllerManager(rxManager)
+{
+ // Create the URL transformer.
+ Reference<uno::XComponentContext> xContext(::comphelper::getProcessComponentContext());
+ mxURLTransformer = util::URLTransformer::create(xContext);
+}
+
+ResourceFactoryManager::~ResourceFactoryManager()
+{
+ for (auto& rXInterfaceResource : maFactoryMap)
+ {
+ Reference<lang::XComponent> xComponent (rXInterfaceResource.second, UNO_QUERY);
+ rXInterfaceResource.second = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ Reference<lang::XComponent> xComponent (mxURLTransformer, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+}
+
+void ResourceFactoryManager::AddFactory (
+ const OUString& rsURL,
+ const Reference<XResourceFactory>& rxFactory)
+{
+ if ( ! rxFactory.is())
+ throw lang::IllegalArgumentException();
+ if (rsURL.isEmpty())
+ throw lang::IllegalArgumentException();
+
+ std::scoped_lock aGuard (maMutex);
+
+ if (rsURL.indexOf('*') >= 0 || rsURL.indexOf('?') >= 0)
+ {
+ // The URL is a URL pattern not a single URL.
+ maFactoryPatternList.emplace_back(rsURL, rxFactory);
+
+#if defined VERBOSE && VERBOSE>=1
+ SAL_INFO("sd","ResourceFactoryManager::AddFactory pattern " << rsURL << std::hex << rxFactory.get());
+#endif
+ }
+ else
+ {
+ maFactoryMap[rsURL] = rxFactory;
+
+#if defined VERBOSE && VERBOSE>=1
+ SAL_INFO("sd", "ResourceFactoryManager::AddFactory fixed " << rsURL << " 0x" << std::hex << rxFactory.get());
+#endif
+ }
+}
+
+void ResourceFactoryManager::RemoveFactoryForURL (
+ const OUString& rsURL)
+{
+ if (rsURL.isEmpty())
+ throw lang::IllegalArgumentException();
+
+ std::scoped_lock aGuard (maMutex);
+
+ FactoryMap::iterator iFactory (maFactoryMap.find(rsURL));
+ if (iFactory != maFactoryMap.end())
+ {
+ maFactoryMap.erase(iFactory);
+ }
+ else
+ {
+ // The URL may be a pattern. Look that up.
+ auto iPattern = std::find_if(maFactoryPatternList.begin(), maFactoryPatternList.end(),
+ [&rsURL](const FactoryPatternList::value_type& rPattern) { return rPattern.first == rsURL; });
+ if (iPattern != maFactoryPatternList.end())
+ {
+ // Found the pattern. Remove it.
+ maFactoryPatternList.erase(iPattern);
+ }
+ }
+}
+
+void ResourceFactoryManager::RemoveFactoryForReference(
+ const Reference<XResourceFactory>& rxFactory)
+{
+ std::scoped_lock aGuard (maMutex);
+
+ // Collect a list with all keys that map to the given factory.
+ ::std::vector<OUString> aKeys;
+ for (const auto& rFactory : maFactoryMap)
+ if (rFactory.second == rxFactory)
+ aKeys.push_back(rFactory.first);
+
+ // Remove the entries whose keys we just have collected.
+ for (const auto& rKey : aKeys)
+ maFactoryMap.erase(rKey);
+
+ // Remove the pattern entries whose factories are identical to the given
+ // factory.
+ maFactoryPatternList.erase(
+ std::remove_if(
+ maFactoryPatternList.begin(),
+ maFactoryPatternList.end(),
+ [&] (FactoryPatternList::value_type const& it) { return it.second == rxFactory; }),
+ maFactoryPatternList.end());
+}
+
+Reference<XResourceFactory> ResourceFactoryManager::GetFactory (
+ const OUString& rsCompleteURL)
+{
+ OUString sURLBase (rsCompleteURL);
+ if (mxURLTransformer.is())
+ {
+ util::URL aURL;
+ aURL.Complete = rsCompleteURL;
+ if (mxURLTransformer->parseStrict(aURL))
+ sURLBase = aURL.Main;
+ }
+
+ Reference<XResourceFactory> xFactory = FindFactory(sURLBase);
+
+ if ( ! xFactory.is() && mxControllerManager.is())
+ {
+ Reference<XModuleController> xModuleController(mxControllerManager->getModuleController());
+ if (xModuleController.is())
+ {
+ // Ask the module controller to provide a factory of the
+ // requested view type. Note that this can (and should) cause
+ // intermediate calls to AddFactory().
+ xModuleController->requestResource(sURLBase);
+
+ xFactory = FindFactory(sURLBase);
+ }
+ }
+
+ return xFactory;
+}
+
+Reference<XResourceFactory> ResourceFactoryManager::FindFactory (const OUString& rsURLBase)
+{
+ std::scoped_lock aGuard (maMutex);
+ FactoryMap::const_iterator iFactory (maFactoryMap.find(rsURLBase));
+ if (iFactory != maFactoryMap.end())
+ return iFactory->second;
+ else
+ {
+ // Check the URL patterns.
+ auto iPattern = std::find_if(maFactoryPatternList.begin(), maFactoryPatternList.end(),
+ [&rsURLBase](const FactoryPatternList::value_type& rPattern) {
+ WildCard aWildCard (rPattern.first);
+ return aWildCard.Matches(rsURLBase);
+ });
+ if (iPattern != maFactoryPatternList.end())
+ return iPattern->second;
+ }
+ return nullptr;
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ResourceFactoryManager.hxx b/sd/source/ui/framework/configuration/ResourceFactoryManager.hxx
new file mode 100644
index 000000000..61daf383b
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ResourceFactoryManager.hxx
@@ -0,0 +1,120 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <mutex>
+#include <unordered_map>
+#include <utility>
+#include <vector>
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <rtl/ustring.hxx>
+
+namespace com::sun::star::drawing::framework { class XControllerManager; }
+namespace com::sun::star::drawing::framework { class XResourceFactory; }
+namespace com::sun::star::util { class XURLTransformer; }
+
+namespace sd::framework {
+
+/** Container of resource factories of the drawing framework.
+*/
+class ResourceFactoryManager
+{
+public:
+ explicit ResourceFactoryManager (
+ const css::uno::Reference<css::drawing::framework::XControllerManager>& rxManager);
+
+ ~ResourceFactoryManager();
+
+ /** Register a resource factory for one type of resource.
+ @param rsURL
+ The type of the resource that will be created by the factory.
+ @param rxFactory
+ The factory that will create resource objects of the specified type.
+ @throws css::uno::RuntimeException
+ */
+ void AddFactory (
+ const OUString& rsURL,
+ const css::uno::Reference<css::drawing::framework::XResourceFactory>& rxFactory);
+
+ /** Unregister the specified factory.
+ @param rsURL
+ Unregister only the factory for this URL. When the same factory
+ is registered for other URLs then these remain registered.
+ @throws css::uno::RuntimeException
+ */
+ void RemoveFactoryForURL(
+ const OUString& rsURL);
+
+ /** Unregister the specified factory.
+ @param rxFactory
+ Unregister the this factory for all URLs that it has been
+ registered for.
+ @throws css::uno::RuntimeException
+ */
+ void RemoveFactoryForReference(
+ const css::uno::Reference<css::drawing::framework::XResourceFactory>& rxFactory);
+
+ /** Return a factory that can create resources specified by the given URL.
+ @param rsCompleteURL
+ This URL specifies the type of the resource. It may contain arguments.
+ @return
+ When a factory for the specified URL has been registered by a
+ previous call to AddFactory() then a reference to that factory
+ is returned. Otherwise an empty reference is returned.
+ @throws css::uno::RuntimeException
+ */
+ css::uno::Reference<css::drawing::framework::XResourceFactory> GetFactory (
+ const OUString& rsURL);
+
+private:
+ std::mutex maMutex;
+ typedef std::unordered_map<
+ OUString,
+ css::uno::Reference<css::drawing::framework::XResourceFactory> > FactoryMap;
+ FactoryMap maFactoryMap;
+
+ typedef ::std::vector<
+ ::std::pair<
+ OUString,
+ css::uno::Reference<css::drawing::framework::XResourceFactory> > >
+ FactoryPatternList;
+ FactoryPatternList maFactoryPatternList;
+
+ css::uno::Reference<css::drawing::framework::XControllerManager> mxControllerManager;
+ css::uno::Reference<css::util::XURLTransformer> mxURLTransformer;
+
+ /** Look up the factory for the given URL.
+ @param rsURLBase
+ The css::tools::URL.Main part of a URL. Arguments have to be
+ stripped off by the caller.
+ @return
+ When the factory has not yet been added then return NULL.
+ @throws css::uno::RuntimeException
+ */
+ css::uno::Reference<css::drawing::framework::XResourceFactory> FindFactory (
+ const OUString& rsURLBase);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/ResourceId.cxx b/sd/source/ui/framework/configuration/ResourceId.cxx
new file mode 100644
index 000000000..1845b353f
--- /dev/null
+++ b/sd/source/ui/framework/configuration/ResourceId.cxx
@@ -0,0 +1,503 @@
+/* -*- 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 <framework/ResourceId.hxx>
+#include <tools/SdGlobalResourceContainer.hxx>
+#include <com/sun/star/util/URLTransformer.hpp>
+#include <comphelper/processfactory.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <cppuhelper/weakref.hxx>
+#include <rtl/ref.hxx>
+
+#include <algorithm>
+
+namespace com::sun::star::uno { class XComponentContext; }
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::drawing::framework;
+
+/** When the USE_OPTIMIZATIONS symbol is defined then at some optimizations
+ are activated that work only together with XResourceId objects that are
+ implemented by the ResourceId class. For other implementations of when
+ the USE_OPTIMIZATIONS symbol is not defined then alternative code is
+ used instead.
+*/
+#define USE_OPTIMIZATIONS
+
+namespace sd::framework {
+
+//===== ResourceId ============================================================
+
+WeakReference<util::XURLTransformer> ResourceId::mxURLTransformerWeak;
+
+ResourceId::ResourceId()
+ : maResourceURLs(0)
+{
+}
+
+ResourceId::ResourceId (
+ std::vector<OUString>&& rResourceURLs)
+ : maResourceURLs(std::move(rResourceURLs))
+{
+ ParseResourceURL();
+}
+
+ResourceId::ResourceId (
+ const OUString& rsResourceURL)
+ : maResourceURLs(1, rsResourceURL)
+{
+ // Handle the special case of an empty resource URL.
+ if (rsResourceURL.isEmpty())
+ maResourceURLs.clear();
+ ParseResourceURL();
+}
+
+ResourceId::ResourceId (
+ const OUString& rsResourceURL,
+ const OUString& rsAnchorURL)
+ : maResourceURLs(2)
+{
+ maResourceURLs[0] = rsResourceURL;
+ maResourceURLs[1] = rsAnchorURL;
+ ParseResourceURL();
+}
+
+ResourceId::ResourceId (
+ const OUString& rsResourceURL,
+ const OUString& rsFirstAnchorURL,
+ const Sequence<OUString>& rAnchorURLs)
+ : maResourceURLs(2+rAnchorURLs.getLength())
+{
+ maResourceURLs[0] = rsResourceURL;
+ maResourceURLs[1] = rsFirstAnchorURL;
+ std::copy(rAnchorURLs.begin(), rAnchorURLs.end(), std::next(maResourceURLs.begin(), 2));
+ ParseResourceURL();
+}
+
+ResourceId::~ResourceId()
+{
+ mpURL.reset();
+}
+
+OUString SAL_CALL
+ ResourceId::getResourceURL()
+{
+ if (!maResourceURLs.empty())
+ return maResourceURLs[0];
+ else
+ return OUString();
+}
+
+util::URL SAL_CALL
+ ResourceId::getFullResourceURL()
+{
+ if (mpURL != nullptr)
+ return *mpURL;
+
+ Reference<util::XURLTransformer> xURLTransformer (mxURLTransformerWeak);
+ if (xURLTransformer.is() && !maResourceURLs.empty() )
+ {
+ mpURL.reset(new util::URL);
+ mpURL->Complete = maResourceURLs[0];
+ xURLTransformer->parseStrict(*mpURL);
+ return *mpURL;
+ }
+
+ util::URL aURL;
+ if (!maResourceURLs.empty())
+ aURL.Complete = maResourceURLs[0];
+ return aURL;
+}
+
+sal_Bool SAL_CALL
+ ResourceId::hasAnchor()
+{
+ return maResourceURLs.size()>1;
+}
+
+Reference<XResourceId> SAL_CALL
+ ResourceId::getAnchor()
+{
+ ::rtl::Reference<ResourceId> rResourceId (new ResourceId());
+ const sal_Int32 nAnchorCount (maResourceURLs.size()-1);
+ if (nAnchorCount > 0)
+ {
+ rResourceId->maResourceURLs.resize(nAnchorCount);
+ for (sal_Int32 nIndex=0; nIndex<nAnchorCount; ++nIndex)
+ rResourceId->maResourceURLs[nIndex] = maResourceURLs[nIndex+1];
+ }
+ return rResourceId;
+}
+
+Sequence<OUString> SAL_CALL
+ ResourceId::getAnchorURLs()
+{
+ const sal_Int32 nAnchorCount (maResourceURLs.size() - 1);
+ if (nAnchorCount > 0)
+ {
+ Sequence<OUString> aAnchorURLs (nAnchorCount);
+ std::copy_n(maResourceURLs.begin() + 1, nAnchorCount, aAnchorURLs.getArray());
+ return aAnchorURLs;
+ }
+ else
+ return Sequence<OUString>();
+}
+
+OUString SAL_CALL
+ ResourceId::getResourceTypePrefix()
+{
+ if (!maResourceURLs.empty() )
+ {
+ // Return the "private:resource/<type>/" prefix.
+
+ // Get the prefix that ends with the second "/".
+ const OUString& rsResourceURL (maResourceURLs[0]);
+ sal_Int32 nPrefixEnd (rsResourceURL.indexOf('/'));
+ if (nPrefixEnd >= 0)
+ nPrefixEnd = rsResourceURL.indexOf('/', nPrefixEnd+1) + 1;
+ else
+ nPrefixEnd = 0;
+
+ return rsResourceURL.copy(0,nPrefixEnd);
+ }
+ else
+ return OUString();
+}
+
+sal_Int16 SAL_CALL
+ ResourceId::compareTo (const Reference<XResourceId>& rxResourceId)
+{
+ sal_Int16 nResult (0);
+
+ if ( ! rxResourceId.is())
+ {
+ // The empty reference is interpreted as empty resource id object.
+ if (!maResourceURLs.empty())
+ nResult = +1;
+ else
+ nResult = 0;
+ }
+ else
+ {
+ ResourceId* pId = nullptr;
+#ifdef USE_OPTIMIZATIONS
+ pId = dynamic_cast<ResourceId*>(rxResourceId.get());
+#endif
+ if (pId != nullptr)
+ {
+ // We have direct access to the implementation of the given
+ // resource id object.
+ nResult = CompareToLocalImplementation(*pId);
+ }
+ else
+ {
+ // We have to do the comparison via the UNO interface of the
+ // given resource id object.
+ nResult = CompareToExternalImplementation(rxResourceId);
+ }
+ }
+
+ return nResult;
+}
+
+sal_Int16 ResourceId::CompareToLocalImplementation (const ResourceId& rId) const
+{
+ sal_Int16 nResult (0);
+
+ const sal_uInt32 nLocalURLCount (maResourceURLs.size());
+ const sal_uInt32 nURLCount(rId.maResourceURLs.size());
+
+ // Start comparison with the top most anchors.
+ for (sal_Int32 nIndex=nURLCount-1,nLocalIndex=nLocalURLCount-1;
+ nIndex>=0 && nLocalIndex>=0;
+ --nIndex,--nLocalIndex)
+ {
+ const OUString sLocalURL (maResourceURLs[nLocalIndex]);
+ const OUString sURL (rId.maResourceURLs[nIndex]);
+ const sal_Int32 nLocalResult (sURL.compareTo(sLocalURL));
+ if (nLocalResult != 0)
+ {
+ if (nLocalResult < 0)
+ nResult = -1;
+ else
+ nResult = +1;
+ break;
+ }
+ }
+
+ if (nResult == 0)
+ {
+ // No difference found yet. When the lengths are the same then the
+ // two resource ids are equivalent. Otherwise the shorter comes
+ // first.
+ if (nLocalURLCount != nURLCount)
+ {
+ if (nLocalURLCount < nURLCount)
+ nResult = -1;
+ else
+ nResult = +1;
+ }
+ }
+
+ return nResult;
+}
+
+sal_Int16 ResourceId::CompareToExternalImplementation (const Reference<XResourceId>& rxId) const
+{
+ sal_Int16 nResult (0);
+
+ const Sequence<OUString> aAnchorURLs (rxId->getAnchorURLs());
+ const sal_uInt32 nLocalURLCount (maResourceURLs.size());
+ const sal_uInt32 nURLCount(1+aAnchorURLs.getLength());
+
+ // Start comparison with the top most anchors.
+ sal_Int32 nLocalResult (0);
+ for (sal_Int32 nIndex=nURLCount-1,nLocalIndex=nLocalURLCount-1;
+ nIndex>=0&&nLocalIndex>=0;
+ --nIndex,--nLocalIndex)
+ {
+ if (nIndex == 0 )
+ nLocalResult = maResourceURLs[nIndex].compareTo(rxId->getResourceURL());
+ else
+ nLocalResult = maResourceURLs[nIndex].compareTo(aAnchorURLs[nIndex-1]);
+ if (nLocalResult != 0)
+ {
+ if (nLocalResult < 0)
+ nResult = -1;
+ else
+ nResult = +1;
+ break;
+ }
+ }
+
+ if (nResult == 0)
+ {
+ // No difference found yet. When the lengths are the same then the
+ // two resource ids are equivalent. Otherwise the shorter comes
+ // first.
+ if (nLocalURLCount != nURLCount)
+ {
+ if (nLocalURLCount < nURLCount)
+ nResult = -1;
+ else
+ nResult = +1;
+ }
+ }
+
+ return nResult;
+}
+
+sal_Bool SAL_CALL
+ ResourceId::isBoundTo (
+ const Reference<XResourceId>& rxResourceId,
+ AnchorBindingMode eMode)
+{
+ if ( ! rxResourceId.is())
+ {
+ // An empty reference is interpreted as empty resource id.
+ return IsBoundToAnchor(nullptr, nullptr, eMode);
+ }
+
+ ResourceId* pId = nullptr;
+#ifdef USE_OPTIMIZATIONS
+ pId = dynamic_cast<ResourceId*>(rxResourceId.get());
+#endif
+ if (pId != nullptr)
+ {
+ return IsBoundToAnchor(pId->maResourceURLs, eMode);
+ }
+ else
+ {
+ const OUString sResourceURL (rxResourceId->getResourceURL());
+ const Sequence<OUString> aAnchorURLs (rxResourceId->getAnchorURLs());
+ return IsBoundToAnchor(&sResourceURL, &aAnchorURLs, eMode);
+ }
+}
+
+sal_Bool SAL_CALL
+ ResourceId::isBoundToURL (
+ const OUString& rsAnchorURL,
+ AnchorBindingMode eMode)
+{
+ return IsBoundToAnchor(&rsAnchorURL, nullptr, eMode);
+}
+
+Reference<XResourceId> SAL_CALL
+ ResourceId::clone()
+{
+ return new ResourceId(std::vector(maResourceURLs));
+}
+
+//----- XInitialization -------------------------------------------------------
+
+void SAL_CALL ResourceId::initialize (const Sequence<Any>& aArguments)
+{
+ for (const auto& rArgument : aArguments)
+ {
+ OUString sResourceURL;
+ if (rArgument >>= sResourceURL)
+ maResourceURLs.push_back(sResourceURL);
+ else
+ {
+ Reference<XResourceId> xAnchor;
+ if (rArgument >>= xAnchor)
+ {
+ if (xAnchor.is())
+ {
+ maResourceURLs.push_back(xAnchor->getResourceURL());
+ const Sequence<OUString> aAnchorURLs (xAnchor->getAnchorURLs());
+ maResourceURLs.insert( maResourceURLs.end(), aAnchorURLs.begin(), aAnchorURLs.end() );
+ }
+ }
+ }
+ }
+ ParseResourceURL();
+}
+
+OUString ResourceId::getImplementationName()
+{
+ return "com.sun.star.comp.Draw.framework.ResourceId";
+}
+
+sal_Bool ResourceId::supportsService(OUString const & ServiceName)
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+css::uno::Sequence<OUString> ResourceId::getSupportedServiceNames()
+{
+ return css::uno::Sequence<OUString>{
+ "com.sun.star.drawing.framework.ResourceId"};
+}
+
+/** When eMode is DIRECTLY then the anchor of the called object and the
+ anchor represented by the given sequence of anchor URLs have to be
+ identical. When eMode is RECURSIVE then the anchor of the called
+ object has to start with the given anchor URLs.
+*/
+bool ResourceId::IsBoundToAnchor (
+ const OUString* psFirstAnchorURL,
+ const Sequence<OUString>* paAnchorURLs,
+ AnchorBindingMode eMode) const
+{
+ const sal_uInt32 nLocalAnchorURLCount (maResourceURLs.size() - 1);
+ const bool bHasFirstAnchorURL (psFirstAnchorURL!=nullptr);
+ const sal_uInt32 nAnchorURLCount ((bHasFirstAnchorURL?1:0)
+ + (paAnchorURLs!=nullptr ? paAnchorURLs->getLength() : 0));
+
+ // Check the lengths.
+ if (nLocalAnchorURLCount<nAnchorURLCount ||
+ (eMode==AnchorBindingMode_DIRECT && nLocalAnchorURLCount!=nAnchorURLCount))
+ {
+ return false;
+ }
+
+ // Compare the nAnchorURLCount bottom-most anchor URLs of this resource
+ // id and the given anchor.
+ sal_uInt32 nOffset = 0;
+ if (paAnchorURLs != nullptr)
+ {
+ sal_uInt32 nCount = paAnchorURLs->getLength();
+ while (nOffset < nCount)
+ {
+ if ( maResourceURLs[nLocalAnchorURLCount - nOffset] !=
+ (*paAnchorURLs)[nCount - 1 - nOffset] )
+ {
+ return false;
+ }
+ ++nOffset;
+ }
+ }
+ if (bHasFirstAnchorURL)
+ {
+ if ( *psFirstAnchorURL != maResourceURLs[nLocalAnchorURLCount - nOffset] )
+ return false;
+ }
+
+ return true;
+}
+
+bool ResourceId::IsBoundToAnchor (
+ const ::std::vector<OUString>& rAnchorURLs,
+ AnchorBindingMode eMode) const
+{
+ const sal_uInt32 nLocalAnchorURLCount (maResourceURLs.size() - 1);
+ const sal_uInt32 nAnchorURLCount (rAnchorURLs.size());
+
+ // Check the lengths.
+ if (nLocalAnchorURLCount<nAnchorURLCount ||
+ (eMode==AnchorBindingMode_DIRECT && nLocalAnchorURLCount!=nAnchorURLCount))
+ {
+ return false;
+ }
+
+ // Compare the nAnchorURLCount bottom-most anchor URLs of this resource
+ // id and the given anchor.
+ for (sal_uInt32 nOffset=0; nOffset<nAnchorURLCount; ++nOffset)
+ {
+ if ( maResourceURLs[nLocalAnchorURLCount - nOffset] !=
+ rAnchorURLs[nAnchorURLCount - 1 - nOffset] )
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void ResourceId::ParseResourceURL()
+{
+ ::osl::Guard< ::osl::Mutex > aGuard (::osl::Mutex::getGlobalMutex());
+ Reference<util::XURLTransformer> xURLTransformer (mxURLTransformerWeak);
+ if ( ! xURLTransformer.is())
+ {
+ // Create the URL transformer.
+ Reference<uno::XComponentContext> xContext(::comphelper::getProcessComponentContext());
+ xURLTransformer.set(util::URLTransformer::create(xContext));
+ mxURLTransformerWeak = xURLTransformer;
+ SdGlobalResourceContainer::Instance().AddResource(
+ Reference<XInterface>(xURLTransformer,UNO_QUERY));
+ }
+
+ if (xURLTransformer.is() && !maResourceURLs.empty() )
+ {
+ mpURL.reset(new util::URL);
+ mpURL->Complete = maResourceURLs[0];
+ xURLTransformer->parseStrict(*mpURL);
+ if (mpURL->Main == maResourceURLs[0])
+ mpURL.reset();
+ else
+ maResourceURLs[0] = mpURL->Main;
+ }
+}
+
+} // end of namespace sd::framework
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_framework_ResourceID_get_implementation(css::uno::XComponentContext*,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::framework::ResourceId());
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/UpdateRequest.cxx b/sd/source/ui/framework/configuration/UpdateRequest.cxx
new file mode 100644
index 000000000..b6c5e8c42
--- /dev/null
+++ b/sd/source/ui/framework/configuration/UpdateRequest.cxx
@@ -0,0 +1,47 @@
+/* -*- 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 "UpdateRequest.hxx"
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sd::framework
+{
+UpdateRequest::UpdateRequest() noexcept {}
+
+UpdateRequest::~UpdateRequest() noexcept {}
+
+void SAL_CALL UpdateRequest::execute(const Reference<XConfiguration>&)
+{
+ // Do nothing here. The configuration is updated when the request queue
+ // becomes empty.
+}
+
+OUString SAL_CALL UpdateRequest::getName() { return "UpdateRequest"; }
+
+void SAL_CALL UpdateRequest::setName(const OUString&)
+{
+ // Ignored.
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/UpdateRequest.hxx b/sd/source/ui/framework/configuration/UpdateRequest.hxx
new file mode 100644
index 000000000..712167154
--- /dev/null
+++ b/sd/source/ui/framework/configuration/UpdateRequest.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XConfigurationChangeRequest.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <comphelper/compbase.hxx>
+
+namespace com::sun::star::drawing::framework { class XConfiguration; }
+
+namespace sd::framework {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::framework::XConfigurationChangeRequest,
+ css::container::XNamed
+ > UpdateRequestInterfaceBase;
+
+/** This update request is used to request configuration updates
+ asynchronous when no other requests are being processed. When there are
+ other requests then we can simply wait until the last one is executed:
+ the configuration is updated when the request queue becomes empty. This
+ is use by this implementation as well. The execute() method does not
+ really do anything. This request just triggers the update of the
+ configuration when it is removed as last request from the queue.
+*/
+class UpdateRequest final
+ : public UpdateRequestInterfaceBase
+{
+public:
+ UpdateRequest() noexcept;
+ virtual ~UpdateRequest() noexcept override;
+
+ // XConfigurationChangeOperation
+
+ virtual void SAL_CALL execute (
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration) override;
+
+ // XNamed
+
+ /** Return a human readable string representation. This is used for
+ debugging purposes.
+ */
+ virtual OUString SAL_CALL getName() override;
+
+ /** This call is ignored because the XNamed interface is (mis)used to
+ give access to a human readable name for debugging purposes.
+ */
+ virtual void SAL_CALL setName (const OUString& rName) override;
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/configuration/debugtrace.hxx b/sd/source/ui/framework/configuration/debugtrace.hxx
new file mode 100644
index 000000000..b520d0ff3
--- /dev/null
+++ b/sd/source/ui/framework/configuration/debugtrace.hxx
@@ -0,0 +1,15 @@
+/* -*- 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/.
+ */
+
+#pragma once
+
+/// Centrally define activation of configuration debug traces.
+#define DEBUG_SD_CONFIGURATION_TRACE 0
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/BasicPaneFactory.cxx b/sd/source/ui/framework/factories/BasicPaneFactory.cxx
new file mode 100644
index 000000000..c01d315a3
--- /dev/null
+++ b/sd/source/ui/framework/factories/BasicPaneFactory.cxx
@@ -0,0 +1,432 @@
+/* -*- 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 <memory>
+#include <sal/config.h>
+
+#include "BasicPaneFactory.hxx"
+
+#include "ChildWindowPane.hxx"
+#include "FrameWindowPane.hxx"
+#include "FullScreenPane.hxx"
+
+#include <comphelper/servicehelper.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <PaneShells.hxx>
+#include <ViewShellBase.hxx>
+#include <PaneChildWindows.hxx>
+#include <DrawController.hxx>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::drawing::framework;
+
+using ::sd::framework::FrameworkHelper;
+
+namespace {
+ enum PaneId {
+ CenterPaneId,
+ FullScreenPaneId,
+ LeftImpressPaneId,
+ LeftDrawPaneId
+ };
+
+ const sal_Int32 gnConfigurationUpdateStartEvent(0);
+ const sal_Int32 gnConfigurationUpdateEndEvent(1);
+}
+
+namespace sd::framework {
+
+/** Store URL, XPane reference and (local) PaneId for every pane factory
+ that is registered at the PaneController.
+*/
+class BasicPaneFactory::PaneDescriptor
+{
+public:
+ OUString msPaneURL;
+ Reference<XResource> mxPane;
+ PaneId mePaneId;
+ /** The mbReleased flag is set when the pane has been released. Some
+ panes are just hidden and destroyed. When the pane is reused this
+ flag is reset.
+ */
+ bool mbIsReleased;
+
+ bool CompareURL(std::u16string_view rsPaneURL) const { return msPaneURL == rsPaneURL; }
+ bool ComparePane(const Reference<XResource>& rxPane) const { return mxPane == rxPane; }
+};
+
+class BasicPaneFactory::PaneContainer
+ : public ::std::vector<PaneDescriptor>
+{
+public:
+ PaneContainer() {}
+};
+
+//===== PaneFactory ===========================================================
+
+BasicPaneFactory::BasicPaneFactory (
+ const Reference<XComponentContext>& rxContext)
+ : mxComponentContext(rxContext),
+ mpViewShellBase(nullptr),
+ mpPaneContainer(new PaneContainer)
+{
+}
+
+BasicPaneFactory::~BasicPaneFactory()
+{
+}
+
+void BasicPaneFactory::disposing(std::unique_lock<std::mutex>&)
+{
+ Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
+ if (xCC.is())
+ {
+ xCC->removeResourceFactoryForReference(this);
+ xCC->removeConfigurationChangeListener(this);
+ mxConfigurationControllerWeak.clear();
+ }
+
+ for (const auto& rDescriptor : *mpPaneContainer)
+ {
+ if (rDescriptor.mbIsReleased)
+ {
+ Reference<XComponent> xComponent (rDescriptor.mxPane, UNO_QUERY);
+ if (xComponent.is())
+ {
+ xComponent->removeEventListener(this);
+ xComponent->dispose();
+ }
+ }
+ }
+}
+
+void SAL_CALL BasicPaneFactory::initialize (const Sequence<Any>& aArguments)
+{
+ if (!aArguments.hasElements())
+ return;
+
+ try
+ {
+ // Get the XController from the first argument.
+ Reference<frame::XController> xController (aArguments[0], UNO_QUERY_THROW);
+
+ // Tunnel through the controller to obtain access to the ViewShellBase.
+ try
+ {
+ Reference<lang::XUnoTunnel> xTunnel (xController, UNO_QUERY_THROW);
+ if (auto pController = comphelper::getFromUnoTunnel<DrawController>(xTunnel))
+ mpViewShellBase = pController->GetViewShellBase();
+ }
+ catch(RuntimeException&)
+ {}
+
+ Reference<XControllerManager> xCM (xController, UNO_QUERY_THROW);
+ Reference<XConfigurationController> xCC (xCM->getConfigurationController());
+ mxConfigurationControllerWeak = xCC;
+
+ // Add pane factories for the two left panes (one for Impress and one for
+ // Draw) and the center pane.
+ if (xController.is() && xCC.is())
+ {
+ PaneDescriptor aDescriptor;
+ aDescriptor.msPaneURL = FrameworkHelper::msCenterPaneURL;
+ aDescriptor.mePaneId = CenterPaneId;
+ aDescriptor.mbIsReleased = false;
+ mpPaneContainer->push_back(aDescriptor);
+ xCC->addResourceFactory(aDescriptor.msPaneURL, this);
+
+ aDescriptor.msPaneURL = FrameworkHelper::msFullScreenPaneURL;
+ aDescriptor.mePaneId = FullScreenPaneId;
+ mpPaneContainer->push_back(aDescriptor);
+ xCC->addResourceFactory(aDescriptor.msPaneURL, this);
+
+ aDescriptor.msPaneURL = FrameworkHelper::msLeftImpressPaneURL;
+ aDescriptor.mePaneId = LeftImpressPaneId;
+ mpPaneContainer->push_back(aDescriptor);
+ xCC->addResourceFactory(aDescriptor.msPaneURL, this);
+
+ aDescriptor.msPaneURL = FrameworkHelper::msLeftDrawPaneURL;
+ aDescriptor.mePaneId = LeftDrawPaneId;
+ mpPaneContainer->push_back(aDescriptor);
+ xCC->addResourceFactory(aDescriptor.msPaneURL, this);
+ }
+
+ // Register as configuration change listener.
+ if (xCC.is())
+ {
+ xCC->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msConfigurationUpdateStartEvent,
+ Any(gnConfigurationUpdateStartEvent));
+ xCC->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msConfigurationUpdateEndEvent,
+ Any(gnConfigurationUpdateEndEvent));
+ }
+ }
+ catch (RuntimeException&)
+ {
+ Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
+ if (xCC.is())
+ xCC->removeResourceFactoryForReference(this);
+ }
+}
+
+//===== XPaneFactory ==========================================================
+
+Reference<XResource> SAL_CALL BasicPaneFactory::createResource (
+ const Reference<XResourceId>& rxPaneId)
+{
+ ThrowIfDisposed();
+
+ Reference<XResource> xPane;
+
+ // Based on the ResourceURL of the given ResourceId look up the
+ // corresponding factory descriptor.
+ PaneContainer::iterator iDescriptor (
+ ::std::find_if (
+ mpPaneContainer->begin(),
+ mpPaneContainer->end(),
+ [&] (PaneDescriptor const& rPane) {
+ return rPane.CompareURL(rxPaneId->getResourceURL());
+ } ));
+
+ if (iDescriptor == mpPaneContainer->end())
+ {
+ // The requested pane can not be created by any of the factories
+ // managed by the called BasicPaneFactory object.
+ throw lang::IllegalArgumentException("BasicPaneFactory::createPane() called for unknown resource id",
+ nullptr,
+ 0);
+ }
+
+ if (iDescriptor->mxPane.is())
+ {
+ // The pane has already been created and is still active (has
+ // not yet been released). This should not happen.
+ xPane = iDescriptor->mxPane;
+ }
+ else
+ {
+ // Create a new pane.
+ switch (iDescriptor->mePaneId)
+ {
+ case CenterPaneId:
+ xPane = CreateFrameWindowPane(rxPaneId);
+ break;
+
+ case FullScreenPaneId:
+ xPane = CreateFullScreenPane(mxComponentContext, rxPaneId);
+ break;
+
+ case LeftImpressPaneId:
+ case LeftDrawPaneId:
+ xPane = CreateChildWindowPane(
+ rxPaneId,
+ *iDescriptor);
+ break;
+ }
+ iDescriptor->mxPane = xPane;
+
+ // Listen for the pane being disposed.
+ Reference<lang::XComponent> xComponent (xPane, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->addEventListener(this);
+ }
+ iDescriptor->mbIsReleased = false;
+
+
+ return xPane;
+}
+
+void SAL_CALL BasicPaneFactory::releaseResource (
+ const Reference<XResource>& rxPane)
+{
+ ThrowIfDisposed();
+
+ // Based on the given XPane reference look up the corresponding factory
+ // descriptor.
+ PaneContainer::iterator iDescriptor (
+ ::std::find_if(
+ mpPaneContainer->begin(),
+ mpPaneContainer->end(),
+ [&] (PaneDescriptor const& rPane) { return rPane.ComparePane(rxPane); } ));
+
+ if (iDescriptor == mpPaneContainer->end())
+ {
+ // The given XPane reference is either empty or the pane was not
+ // created by any of the factories managed by the called
+ // BasicPaneFactory object.
+ throw lang::IllegalArgumentException("BasicPaneFactory::releasePane() called for pane that was not created by same factory.",
+ nullptr,
+ 0);
+ }
+
+ // The given pane was created by one of the factories. Child
+ // windows are just hidden and will be reused when requested later.
+ // Other windows are disposed and their reference is reset so that
+ // on the next createPane() call for the same pane type the pane is
+ // created anew.
+ ChildWindowPane* pChildWindowPane = dynamic_cast<ChildWindowPane*>(rxPane.get());
+ if (pChildWindowPane != nullptr)
+ {
+ iDescriptor->mbIsReleased = true;
+ pChildWindowPane->Hide();
+ }
+ else
+ {
+ iDescriptor->mxPane = nullptr;
+ Reference<XComponent> xComponent (rxPane, UNO_QUERY);
+ if (xComponent.is())
+ {
+ // We are disposing the pane and do not have to be informed of
+ // that.
+ xComponent->removeEventListener(this);
+ xComponent->dispose();
+ }
+ }
+
+}
+
+//===== XConfigurationChangeListener ==========================================
+
+void SAL_CALL BasicPaneFactory::notifyConfigurationChange (
+ const ConfigurationChangeEvent& /* rEvent */ )
+{
+ // FIXME: nothing to do
+}
+
+//===== lang::XEventListener ==================================================
+
+void SAL_CALL BasicPaneFactory::disposing (
+ const lang::EventObject& rEventObject)
+{
+ if (mxConfigurationControllerWeak.get() == rEventObject.Source)
+ {
+ mxConfigurationControllerWeak.clear();
+ }
+ else
+ {
+ // Has one of the panes been disposed? If so, then release the
+ // reference to that pane, but not the pane descriptor.
+ Reference<XResource> xPane (rEventObject.Source, UNO_QUERY);
+ PaneContainer::iterator iDescriptor (
+ ::std::find_if (
+ mpPaneContainer->begin(),
+ mpPaneContainer->end(),
+ [&] (PaneDescriptor const& rPane) { return rPane.ComparePane(xPane); } ));
+ if (iDescriptor != mpPaneContainer->end())
+ {
+ iDescriptor->mxPane = nullptr;
+ }
+ }
+}
+
+Reference<XResource> BasicPaneFactory::CreateFrameWindowPane (
+ const Reference<XResourceId>& rxPaneId)
+{
+ Reference<XResource> xPane;
+
+ if (mpViewShellBase != nullptr)
+ {
+ xPane = new FrameWindowPane(rxPaneId, mpViewShellBase->GetViewWindow());
+ }
+
+ return xPane;
+}
+
+Reference<XResource> BasicPaneFactory::CreateFullScreenPane (
+ const Reference<XComponentContext>& rxComponentContext,
+ const Reference<XResourceId>& rxPaneId)
+{
+ Reference<XResource> xPane (
+ new FullScreenPane(
+ rxComponentContext,
+ rxPaneId,
+ mpViewShellBase->GetViewWindow()));
+
+ return xPane;
+}
+
+Reference<XResource> BasicPaneFactory::CreateChildWindowPane (
+ const Reference<XResourceId>& rxPaneId,
+ const PaneDescriptor& rDescriptor)
+{
+ Reference<XResource> xPane;
+
+ if (mpViewShellBase != nullptr)
+ {
+ // Create the corresponding shell and determine the id of the child window.
+ sal_uInt16 nChildWindowId = 0;
+ ::std::unique_ptr<SfxShell> pShell;
+ switch (rDescriptor.mePaneId)
+ {
+ case LeftImpressPaneId:
+ pShell.reset(new LeftImpressPaneShell());
+ nChildWindowId = ::sd::LeftPaneImpressChildWindow::GetChildWindowId();
+ break;
+
+ case LeftDrawPaneId:
+ pShell.reset(new LeftDrawPaneShell());
+ nChildWindowId = ::sd::LeftPaneDrawChildWindow::GetChildWindowId();
+ break;
+
+ default:
+ break;
+ }
+
+ // With shell and child window id create the ChildWindowPane
+ // wrapper.
+ if (pShell != nullptr)
+ {
+ xPane = new ChildWindowPane(
+ rxPaneId,
+ nChildWindowId,
+ *mpViewShellBase,
+ std::move(pShell));
+ }
+ }
+
+ return xPane;
+}
+
+void BasicPaneFactory::ThrowIfDisposed() const
+{
+ if (m_bDisposed)
+ {
+ throw lang::DisposedException ("BasicPaneFactory object has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+} // end of namespace sd::framework
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_framework_BasicPaneFactory_get_implementation(css::uno::XComponentContext* context,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::framework::BasicPaneFactory(context));
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/BasicPaneFactory.hxx b/sd/source/ui/framework/factories/BasicPaneFactory.hxx
new file mode 100644
index 000000000..317776e48
--- /dev/null
+++ b/sd/source/ui/framework/factories/BasicPaneFactory.hxx
@@ -0,0 +1,131 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XResourceFactory.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <comphelper/compbase.hxx>
+#include <cppuhelper/weakref.hxx>
+
+#include <memory>
+
+namespace com::sun::star::drawing::framework { class XConfigurationController; }
+namespace com::sun::star::uno { class XComponentContext; }
+
+namespace sd {
+
+class ViewShellBase;
+}
+
+namespace sd::framework {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::lang::XInitialization,
+ css::drawing::framework::XResourceFactory,
+ css::drawing::framework::XConfigurationChangeListener
+ > BasicPaneFactoryInterfaceBase;
+
+/** This factory provides the frequently used standard panes
+ private:resource/pane/CenterPane
+ private:resource/pane/FullScreenPane
+ private:resource/pane/LeftImpressPane
+ private:resource/pane/LeftDrawPane
+ There are two left panes because this is (seems to be) the only way to
+ show different titles for the left pane in Draw and Impress.
+*/
+class BasicPaneFactory
+ : public BasicPaneFactoryInterfaceBase
+{
+public:
+ explicit BasicPaneFactory (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext);
+ virtual ~BasicPaneFactory() override;
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ // XInitialization
+
+ virtual void SAL_CALL initialize(
+ const css::uno::Sequence<css::uno::Any>& aArguments) override;
+
+ // XResourceFactory
+
+ virtual css::uno::Reference<css::drawing::framework::XResource>
+ SAL_CALL createResource (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId) override;
+
+ virtual void SAL_CALL
+ releaseResource (
+ const css::uno::Reference<css::drawing::framework::XResource>& rxPane) override;
+
+ // XConfigurationChangeListener
+
+ virtual void SAL_CALL notifyConfigurationChange (
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent) override;
+
+ // lang::XEventListener
+
+ virtual void SAL_CALL disposing (
+ const css::lang::EventObject& rEventObject) override;
+
+private:
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+ css::uno::WeakReference<css::drawing::framework::XConfigurationController>
+ mxConfigurationControllerWeak;
+ ViewShellBase* mpViewShellBase;
+ class PaneDescriptor;
+ class PaneContainer;
+ std::unique_ptr<PaneContainer> mpPaneContainer;
+
+ /** Create a new instance of FrameWindowPane.
+ @param rPaneId
+ There is only one frame window so this id is just checked to
+ have the correct value.
+ */
+ css::uno::Reference<css::drawing::framework::XResource>
+ CreateFrameWindowPane (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId);
+
+ /** Create a new pane that represents the center pane in full screen
+ mode.
+ */
+ css::uno::Reference<css::drawing::framework::XResource>
+ CreateFullScreenPane (
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId);
+
+ /** Create a new instance of ChildWindowPane.
+ @param rPaneId
+ The ResourceURL member defines which side pane to create.
+ */
+ css::uno::Reference<css::drawing::framework::XResource>
+ CreateChildWindowPane (
+ const css::uno::Reference<
+ css::drawing::framework::XResourceId>& rxPaneId,
+ const PaneDescriptor& rDescriptor);
+
+ /// @throws css::lang::DisposedException
+ void ThrowIfDisposed() const;
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/BasicToolBarFactory.cxx b/sd/source/ui/framework/factories/BasicToolBarFactory.cxx
new file mode 100644
index 000000000..af79a88ea
--- /dev/null
+++ b/sd/source/ui/framework/factories/BasicToolBarFactory.cxx
@@ -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/.
+ *
+ * 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 "BasicToolBarFactory.hxx"
+
+#include <ViewTabBar.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <unotools/mediadescriptor.hxx>
+
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sd::framework {
+
+//===== BasicToolBarFactory ===================================================
+
+BasicToolBarFactory::BasicToolBarFactory ()
+{
+}
+
+BasicToolBarFactory::~BasicToolBarFactory()
+{
+}
+
+void BasicToolBarFactory::disposing(std::unique_lock<std::mutex>&)
+{
+ Shutdown();
+}
+
+void BasicToolBarFactory::Shutdown()
+{
+ Reference<lang::XComponent> xComponent (mxConfigurationController, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->removeEventListener(static_cast<lang::XEventListener*>(this));
+ if (mxConfigurationController.is())
+ {
+ mxConfigurationController->removeResourceFactoryForReference(this);
+ mxConfigurationController = nullptr;
+ }
+}
+
+//----- XInitialization -------------------------------------------------------
+
+void SAL_CALL BasicToolBarFactory::initialize (const Sequence<Any>& aArguments)
+{
+ if (!aArguments.hasElements())
+ return;
+
+ try
+ {
+ // Get the XController from the first argument.
+ mxController.set(aArguments[0], UNO_QUERY_THROW);
+
+ utl::MediaDescriptor aDescriptor (mxController->getModel()->getArgs());
+ if ( ! aDescriptor.getUnpackedValueOrDefault(
+ utl::MediaDescriptor::PROP_PREVIEW,
+ false))
+ {
+ // Register the factory for its supported tool bars.
+ Reference<XControllerManager> xControllerManager(mxController, UNO_QUERY_THROW);
+ mxConfigurationController = xControllerManager->getConfigurationController();
+ if (mxConfigurationController.is())
+ {
+ mxConfigurationController->addResourceFactory(
+ FrameworkHelper::msViewTabBarURL, this);
+ }
+
+ Reference<lang::XComponent> xComponent (mxConfigurationController, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->addEventListener(static_cast<lang::XEventListener*>(this));
+ }
+ else
+ {
+ // The view shell is in preview mode and thus does not need
+ // the view tab bar.
+ mxConfigurationController = nullptr;
+ }
+ }
+ catch (RuntimeException&)
+ {
+ Shutdown();
+ throw;
+ }
+}
+
+//----- lang::XEventListener --------------------------------------------------
+
+void SAL_CALL BasicToolBarFactory::disposing (
+ const lang::EventObject& rEventObject)
+{
+ if (rEventObject.Source == mxConfigurationController)
+ mxConfigurationController = nullptr;
+}
+
+//===== XPaneFactory ==========================================================
+
+Reference<XResource> SAL_CALL BasicToolBarFactory::createResource (
+ const Reference<XResourceId>& rxToolBarId)
+{
+ ThrowIfDisposed();
+
+ if (rxToolBarId->getResourceURL() != FrameworkHelper::msViewTabBarURL)
+ throw lang::IllegalArgumentException();
+
+ Reference<XResource> xToolBar = new ViewTabBar(rxToolBarId, mxController);
+ return xToolBar;
+}
+
+void SAL_CALL BasicToolBarFactory::releaseResource (
+ const Reference<XResource>& rxToolBar)
+{
+ ThrowIfDisposed();
+
+ Reference<XComponent> xComponent (rxToolBar, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+}
+
+void BasicToolBarFactory::ThrowIfDisposed() const
+{
+ if (m_bDisposed)
+ {
+ throw lang::DisposedException ("BasicToolBarFactory object has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+} // end of namespace sd::framework
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_framework_BasicToolBarFactory_get_implementation(css::uno::XComponentContext*,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::framework::BasicToolBarFactory);
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/BasicToolBarFactory.hxx b/sd/source/ui/framework/factories/BasicToolBarFactory.hxx
new file mode 100644
index 000000000..fdaf92788
--- /dev/null
+++ b/sd/source/ui/framework/factories/BasicToolBarFactory.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/drawing/framework/XResourceFactory.hpp>
+#include <comphelper/compbase.hxx>
+
+namespace com::sun::star::frame { class XController; }
+namespace com::sun::star::drawing::framework { class XResourceId; }
+namespace com::sun::star::drawing::framework { class XConfigurationController; }
+
+namespace sd::framework {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::framework::XResourceFactory,
+ css::lang::XInitialization,
+ css::lang::XEventListener
+ > BasicToolBarFactoryInterfaceBase;
+
+/** This factory provides some of the frequently used tool bars:
+ private:resource/toolbar/ViewTabBar
+*/
+class BasicToolBarFactory
+ : public BasicToolBarFactoryInterfaceBase
+{
+public:
+ BasicToolBarFactory ();
+ virtual ~BasicToolBarFactory() override;
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ // ToolBarFactory
+
+ virtual css::uno::Reference<css::drawing::framework::XResource> SAL_CALL
+ createResource (
+ const css::uno::Reference<
+ css::drawing::framework::XResourceId>& rxToolBarId) override;
+
+ virtual void SAL_CALL
+ releaseResource (
+ const css::uno::Reference<css::drawing::framework::XResource>&
+ rxToolBar) override;
+
+ // XInitialization
+
+ virtual void SAL_CALL initialize(
+ const css::uno::Sequence<css::uno::Any>& aArguments) override;
+
+ // lang::XEventListener
+
+ virtual void SAL_CALL disposing (
+ const css::lang::EventObject& rEventObject) override;
+
+private:
+ css::uno::Reference<css::drawing::framework::XConfigurationController> mxConfigurationController;
+ css::uno::Reference<css::frame::XController> mxController;
+
+ void Shutdown();
+
+ /// @throws css::lang::DisposedException
+ void ThrowIfDisposed() const;
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/BasicViewFactory.cxx b/sd/source/ui/framework/factories/BasicViewFactory.cxx
new file mode 100644
index 000000000..425cb4446
--- /dev/null
+++ b/sd/source/ui/framework/factories/BasicViewFactory.cxx
@@ -0,0 +1,518 @@
+/* -*- 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 "BasicViewFactory.hxx"
+
+#include <framework/ViewShellWrapper.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <framework/Pane.hxx>
+#include <DrawController.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShellManager.hxx>
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <GraphicViewShell.hxx>
+#include <OutlineViewShell.hxx>
+#include <PresentationViewShell.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <FrameView.hxx>
+#include <Window.hxx>
+
+#include <comphelper/servicehelper.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <vcl/wrkwin.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::drawing::framework;
+
+using ::sd::framework::FrameworkHelper;
+
+namespace sd::framework {
+
+//===== ViewDescriptor ========================================================
+
+class BasicViewFactory::ViewDescriptor
+{
+public:
+ Reference<XResource> mxView;
+ std::shared_ptr<sd::ViewShell> mpViewShell;
+ Reference<XResourceId> mxViewId;
+ static bool CompareView (const std::shared_ptr<ViewDescriptor>& rpDescriptor,
+ const Reference<XResource>& rxView)
+ { return rpDescriptor->mxView.get() == rxView.get(); }
+};
+
+//===== BasicViewFactory::ViewShellContainer ==================================
+
+class BasicViewFactory::ViewShellContainer
+ : public ::std::vector<std::shared_ptr<ViewDescriptor> >
+{
+public:
+ ViewShellContainer() {};
+};
+
+class BasicViewFactory::ViewCache
+ : public ::std::vector<std::shared_ptr<ViewDescriptor> >
+{
+public:
+ ViewCache() {};
+};
+
+//===== ViewFactory ===========================================================
+
+BasicViewFactory::BasicViewFactory ()
+ : mpViewShellContainer(new ViewShellContainer()),
+ mpBase(nullptr),
+ mpFrameView(nullptr),
+ mpWindow(VclPtr<WorkWindow>::Create(nullptr,WB_STDWORK)),
+ mpViewCache(std::make_shared<ViewCache>()),
+ mxLocalPane(new Pane(Reference<XResourceId>(), mpWindow.get()))
+{
+}
+
+BasicViewFactory::~BasicViewFactory()
+{
+}
+
+void BasicViewFactory::disposing(std::unique_lock<std::mutex>&)
+{
+ // Disconnect from the frame view.
+ if (mpFrameView != nullptr)
+ {
+ mpFrameView->Disconnect();
+ mpFrameView = nullptr;
+ }
+
+ // Release the view cache.
+ for (const auto& rxView : *mpViewCache)
+ {
+ ReleaseView(rxView, true);
+ }
+
+ // Release the view shell container. At this point no one other than us
+ // should hold references to the view shells (at the moment this is a
+ // trivial requirement, because no one other than us holds a shared
+ // pointer).
+ // ViewShellContainer::const_iterator iView;
+ for (const auto& rxView : *mpViewShellContainer)
+ {
+ OSL_ASSERT(rxView->mpViewShell.use_count() == 1);
+ }
+ mpViewShellContainer.reset();
+}
+
+Reference<XResource> SAL_CALL BasicViewFactory::createResource (
+ const Reference<XResourceId>& rxViewId)
+{
+ Reference<XResource> xView;
+ const bool bIsCenterPane (
+ rxViewId->isBoundToURL(FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT));
+
+ // Get the pane for the anchor URL.
+ Reference<XPane> xPane;
+ if (mxConfigurationController.is())
+ xPane.set(mxConfigurationController->getResource(rxViewId->getAnchor()), UNO_QUERY);
+
+ // For main views use the frame view of the last main view.
+ ::sd::FrameView* pFrameView = nullptr;
+ if (xPane.is() && bIsCenterPane)
+ {
+ pFrameView = mpFrameView;
+ }
+
+ // Get Window pointer for XWindow of the pane.
+ vcl::Window* pWindow = nullptr;
+ if (xPane.is())
+ pWindow = VCLUnoHelper::GetWindow(xPane->getWindow());
+
+ // Get the view frame.
+ SfxViewFrame* pFrame = nullptr;
+ if (mpBase != nullptr)
+ pFrame = mpBase->GetViewFrame();
+
+ if (pFrame != nullptr && mpBase!=nullptr && pWindow!=nullptr)
+ {
+ // Try to get the view from the cache.
+ std::shared_ptr<ViewDescriptor> pDescriptor (GetViewFromCache(rxViewId, xPane));
+
+ // When the requested view is not in the cache then create a new view.
+ if (pDescriptor == nullptr)
+ {
+ pDescriptor = CreateView(rxViewId, *pFrame, *pWindow, xPane, pFrameView, bIsCenterPane);
+ }
+
+ if (pDescriptor != nullptr)
+ xView = pDescriptor->mxView;
+
+ mpViewShellContainer->push_back(pDescriptor);
+
+ if (bIsCenterPane)
+ ActivateCenterView(pDescriptor);
+ else
+ pWindow->Resize();
+ }
+
+ return xView;
+}
+
+void SAL_CALL BasicViewFactory::releaseResource (const Reference<XResource>& rxView)
+{
+ if ( ! rxView.is())
+ throw lang::IllegalArgumentException();
+
+ if (!rxView.is() || !mpBase)
+ return;
+
+ ViewShellContainer::iterator iViewShell (
+ ::std::find_if(
+ mpViewShellContainer->begin(),
+ mpViewShellContainer->end(),
+ [&] (std::shared_ptr<ViewDescriptor> const& pVD) {
+ return ViewDescriptor::CompareView(pVD, rxView);
+ } ));
+ if (iViewShell == mpViewShellContainer->end())
+ {
+ throw lang::IllegalArgumentException();
+ }
+
+ std::shared_ptr<ViewShell> pViewShell ((*iViewShell)->mpViewShell);
+
+ if ((*iViewShell)->mxViewId->isBoundToURL(
+ FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
+ {
+ // Obtain a pointer to and connect to the frame view of the
+ // view. The next view, that is created, will be
+ // initialized with this frame view.
+ if (mpFrameView == nullptr)
+ {
+ mpFrameView = pViewShell->GetFrameView();
+ if (mpFrameView)
+ mpFrameView->Connect();
+ }
+
+ // With the view in the center pane the sub controller is
+ // released, too.
+ mpBase->GetDrawController().SetSubController(
+ Reference<drawing::XDrawSubController>());
+
+ SfxViewShell* pSfxViewShell = pViewShell->GetViewShell();
+ if (pSfxViewShell != nullptr)
+ pSfxViewShell->DisconnectAllClients();
+ }
+
+ ReleaseView(*iViewShell, false);
+
+ mpViewShellContainer->erase(iViewShell);
+}
+
+void SAL_CALL BasicViewFactory::initialize (const Sequence<Any>& aArguments)
+{
+ if (!aArguments.hasElements())
+ return;
+
+ try
+ {
+ // Get the XController from the first argument.
+ Reference<frame::XController> xController (aArguments[0], UNO_QUERY_THROW);
+
+ // Tunnel through the controller to obtain a ViewShellBase.
+ Reference<lang::XUnoTunnel> xTunnel (xController, UNO_QUERY_THROW);
+ ::sd::DrawController* pController = comphelper::getFromUnoTunnel<sd::DrawController>(xTunnel);
+ if (pController != nullptr)
+ mpBase = pController->GetViewShellBase();
+
+ // Register the factory for its supported views.
+ Reference<XControllerManager> xCM (xController,UNO_QUERY_THROW);
+ mxConfigurationController = xCM->getConfigurationController();
+ if ( ! mxConfigurationController.is())
+ throw RuntimeException();
+ mxConfigurationController->addResourceFactory(FrameworkHelper::msImpressViewURL, this);
+ mxConfigurationController->addResourceFactory(FrameworkHelper::msDrawViewURL, this);
+ mxConfigurationController->addResourceFactory(FrameworkHelper::msOutlineViewURL, this);
+ mxConfigurationController->addResourceFactory(FrameworkHelper::msNotesViewURL, this);
+ mxConfigurationController->addResourceFactory(FrameworkHelper::msHandoutViewURL, this);
+ mxConfigurationController->addResourceFactory(FrameworkHelper::msPresentationViewURL, this);
+ mxConfigurationController->addResourceFactory(FrameworkHelper::msSlideSorterURL, this);
+ }
+ catch (RuntimeException&)
+ {
+ mpBase = nullptr;
+ if (mxConfigurationController.is())
+ mxConfigurationController->removeResourceFactoryForReference(this);
+ throw;
+ }
+}
+
+std::shared_ptr<BasicViewFactory::ViewDescriptor> BasicViewFactory::CreateView (
+ const Reference<XResourceId>& rxViewId,
+ SfxViewFrame& rFrame,
+ vcl::Window& rWindow,
+ const Reference<XPane>& rxPane,
+ FrameView* pFrameView,
+ const bool bIsCenterPane)
+{
+ auto pDescriptor = std::make_shared<ViewDescriptor>();
+
+ pDescriptor->mpViewShell = CreateViewShell(
+ rxViewId,
+ rFrame,
+ rWindow,
+ pFrameView);
+ pDescriptor->mxViewId = rxViewId;
+
+ if (pDescriptor->mpViewShell != nullptr)
+ {
+ pDescriptor->mpViewShell->Init(bIsCenterPane);
+ mpBase->GetViewShellManager()->ActivateViewShell(pDescriptor->mpViewShell.get());
+
+ Reference<awt::XWindow> xWindow(rxPane->getWindow());
+ rtl::Reference<ViewShellWrapper> wrapper(new ViewShellWrapper(
+ pDescriptor->mpViewShell,
+ rxViewId,
+ xWindow));
+
+ // register ViewShellWrapper on pane window
+ if (xWindow.is())
+ {
+ xWindow->addWindowListener(wrapper);
+ if (pDescriptor->mpViewShell != nullptr)
+ {
+ pDescriptor->mpViewShell->Resize();
+ }
+ }
+
+ pDescriptor->mxView = wrapper.get();
+ }
+
+ return pDescriptor;
+}
+
+std::shared_ptr<ViewShell> BasicViewFactory::CreateViewShell (
+ const Reference<XResourceId>& rxViewId,
+ SfxViewFrame& rFrame,
+ vcl::Window& rWindow,
+ FrameView* pFrameView)
+{
+ std::shared_ptr<ViewShell> pViewShell;
+ const OUString& rsViewURL (rxViewId->getResourceURL());
+ if (rsViewURL == FrameworkHelper::msImpressViewURL)
+ {
+ pViewShell =
+ std::make_shared<DrawViewShell>(
+ *mpBase,
+ &rWindow,
+ PageKind::Standard,
+ pFrameView);
+ pViewShell->GetContentWindow()->set_id("impress_win");
+ }
+ else if (rsViewURL == FrameworkHelper::msDrawViewURL)
+ {
+ pViewShell = std::shared_ptr<GraphicViewShell>(
+ new GraphicViewShell(*mpBase, &rWindow, pFrameView),
+ o3tl::default_delete<GraphicViewShell>());
+ pViewShell->GetContentWindow()->set_id("draw_win");
+ }
+ else if (rsViewURL == FrameworkHelper::msOutlineViewURL)
+ {
+ pViewShell =
+ std::make_shared<OutlineViewShell>(
+ &rFrame,
+ *mpBase,
+ &rWindow,
+ pFrameView);
+ pViewShell->GetContentWindow()->set_id("outline_win");
+ }
+ else if (rsViewURL == FrameworkHelper::msNotesViewURL)
+ {
+ pViewShell =
+ std::make_shared<DrawViewShell>(
+ *mpBase,
+ &rWindow,
+ PageKind::Notes,
+ pFrameView);
+ pViewShell->GetContentWindow()->set_id("notes_win");
+ }
+ else if (rsViewURL == FrameworkHelper::msHandoutViewURL)
+ {
+ pViewShell =
+ std::make_shared<DrawViewShell>(
+ *mpBase,
+ &rWindow,
+ PageKind::Handout,
+ pFrameView);
+ pViewShell->GetContentWindow()->set_id("handout_win");
+ }
+ else if (rsViewURL == FrameworkHelper::msPresentationViewURL)
+ {
+ pViewShell =
+ std::make_shared<PresentationViewShell>(
+ *mpBase,
+ &rWindow,
+ pFrameView);
+ pViewShell->GetContentWindow()->set_id("presentation_win");
+ }
+ else if (rsViewURL == FrameworkHelper::msSlideSorterURL)
+ {
+ pViewShell = ::sd::slidesorter::SlideSorterViewShell::Create (
+ &rFrame,
+ *mpBase,
+ &rWindow,
+ pFrameView);
+ pViewShell->GetContentWindow()->set_id("slidesorter");
+ }
+
+ return pViewShell;
+}
+
+void BasicViewFactory::ReleaseView (
+ const std::shared_ptr<ViewDescriptor>& rpDescriptor,
+ bool bDoNotCache)
+{
+ bool bIsCacheable (!bDoNotCache && IsCacheable(rpDescriptor));
+
+ if (bIsCacheable)
+ {
+ Reference<XRelocatableResource> xResource (rpDescriptor->mxView, UNO_QUERY);
+ if (xResource.is())
+ {
+ if (mxLocalPane.is())
+ if (xResource->relocateToAnchor(mxLocalPane))
+ mpViewCache->push_back(rpDescriptor);
+ else
+ bIsCacheable = false;
+ else
+ bIsCacheable = false;
+ }
+ else
+ {
+ bIsCacheable = false;
+ }
+ }
+
+ if ( ! bIsCacheable)
+ {
+ // Shut down the current view shell.
+ rpDescriptor->mpViewShell->Shutdown ();
+ mpBase->GetDocShell()->Disconnect(rpDescriptor->mpViewShell.get());
+ mpBase->GetViewShellManager()->DeactivateViewShell(rpDescriptor->mpViewShell.get());
+
+ Reference<XComponent> xComponent (rpDescriptor->mxView, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+}
+
+bool BasicViewFactory::IsCacheable (const std::shared_ptr<ViewDescriptor>& rpDescriptor)
+{
+ bool bIsCacheable (false);
+
+ Reference<XRelocatableResource> xResource (rpDescriptor->mxView, UNO_QUERY);
+ if (xResource.is())
+ {
+ static ::std::vector<Reference<XResourceId> > s_aCacheableResources = [&]()
+ {
+ ::std::vector<Reference<XResourceId> > tmp;
+ FrameworkHelper::Instance(*mpBase);
+
+ // The slide sorter and the task panel are cacheable and relocatable.
+ tmp.push_back(FrameworkHelper::CreateResourceId(
+ FrameworkHelper::msSlideSorterURL, FrameworkHelper::msLeftDrawPaneURL));
+ tmp.push_back(FrameworkHelper::CreateResourceId(
+ FrameworkHelper::msSlideSorterURL, FrameworkHelper::msLeftImpressPaneURL));
+ return tmp;
+ }();
+
+ bIsCacheable = std::any_of(s_aCacheableResources.begin(), s_aCacheableResources.end(),
+ [&rpDescriptor](const Reference<XResourceId>& rxId) { return rxId->compareTo(rpDescriptor->mxViewId) == 0; });
+ }
+
+ return bIsCacheable;
+}
+
+std::shared_ptr<BasicViewFactory::ViewDescriptor> BasicViewFactory::GetViewFromCache (
+ const Reference<XResourceId>& rxViewId,
+ const Reference<XPane>& rxPane)
+{
+ std::shared_ptr<ViewDescriptor> pDescriptor;
+
+ // Search for the requested view in the cache.
+ ViewCache::iterator iEntry = std::find_if(mpViewCache->begin(), mpViewCache->end(),
+ [&rxViewId](const ViewCache::value_type& rxEntry) { return rxEntry->mxViewId->compareTo(rxViewId) == 0; });
+ if (iEntry != mpViewCache->end())
+ {
+ pDescriptor = *iEntry;
+ mpViewCache->erase(iEntry);
+ }
+
+ // When the view has been found then relocate it to the given pane and
+ // remove it from the cache.
+ if (pDescriptor != nullptr)
+ {
+ bool bRelocationSuccessful (false);
+ Reference<XRelocatableResource> xResource (pDescriptor->mxView, UNO_QUERY);
+ if (xResource.is() && rxPane.is())
+ {
+ if (xResource->relocateToAnchor(rxPane))
+ bRelocationSuccessful = true;
+ }
+
+ if ( ! bRelocationSuccessful)
+ {
+ ReleaseView(pDescriptor, true);
+ pDescriptor.reset();
+ }
+ }
+
+ return pDescriptor;
+}
+
+void BasicViewFactory::ActivateCenterView (
+ const std::shared_ptr<ViewDescriptor>& rpDescriptor)
+{
+ mpBase->GetDocShell()->Connect(rpDescriptor->mpViewShell.get());
+
+ // During the creation of the new sub-shell, resize requests were not
+ // forwarded to it because it was not yet registered. Therefore, we
+ // have to request a resize now.
+ rpDescriptor->mpViewShell->UIFeatureChanged();
+ if (mpBase->GetDocShell()->IsInPlaceActive())
+ mpBase->GetViewFrame()->Resize(true);
+
+ mpBase->GetDrawController().SetSubController(
+ rpDescriptor->mpViewShell->CreateSubController());
+}
+
+} // end of namespace sd::framework
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_framework_BasicViewFactory_get_implementation(css::uno::XComponentContext*,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::framework::BasicViewFactory);
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/BasicViewFactory.hxx b/sd/source/ui/framework/factories/BasicViewFactory.hxx
new file mode 100644
index 000000000..ccd5cbbda
--- /dev/null
+++ b/sd/source/ui/framework/factories/BasicViewFactory.hxx
@@ -0,0 +1,129 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XResourceFactory.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+
+#include <comphelper/compbase.hxx>
+
+#include <vcl/vclptr.hxx>
+#include <memory>
+
+namespace com::sun::star::drawing::framework { class XConfigurationController; }
+namespace com::sun::star::drawing::framework { class XPane; }
+
+namespace sd {
+class ViewShell;
+class ViewShellBase;
+class FrameView;
+}
+class SfxViewFrame;
+namespace vcl { class Window; }
+
+namespace sd::framework {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::framework::XResourceFactory,
+ css::lang::XInitialization
+ > BasicViewFactoryInterfaceBase;
+
+/** Factory for the frequently used standard views of the drawing framework:
+ private:resource/view/
+ private:resource/view/ImpressView
+ private:resource/view/GraphicView
+ private:resource/view/OutlineView
+ private:resource/view/NotesView
+ private:resource/view/HandoutView
+ private:resource/view/SlideSorter
+ private:resource/view/PresentationView
+ private:resource/view/TaskPane
+ For some views in some panes this class also acts as a cache.
+*/
+class BasicViewFactory
+ : public BasicViewFactoryInterfaceBase
+{
+public:
+ BasicViewFactory ();
+ virtual ~BasicViewFactory() override;
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ // XViewFactory
+
+ virtual css::uno::Reference<css::drawing::framework::XResource>
+ SAL_CALL createResource (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId) override;
+
+ virtual void SAL_CALL releaseResource (
+ const css::uno::Reference<css::drawing::framework::XResource>& xView) override;
+
+ // XInitialization
+
+ virtual void SAL_CALL initialize(
+ const css::uno::Sequence<css::uno::Any>& aArguments) override;
+
+private:
+ css::uno::Reference<css::drawing::framework::XConfigurationController>
+ mxConfigurationController;
+ class ViewDescriptor;
+ class ViewShellContainer;
+ std::unique_ptr<ViewShellContainer> mpViewShellContainer;
+ ViewShellBase* mpBase;
+ FrameView* mpFrameView;
+
+ class ViewCache;
+ ScopedVclPtr<vcl::Window> mpWindow;
+ std::shared_ptr<ViewCache> mpViewCache;
+
+ css::uno::Reference<css::drawing::framework::XPane> mxLocalPane;
+
+ std::shared_ptr<ViewDescriptor> CreateView (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ SfxViewFrame& rFrame,
+ vcl::Window& rWindow,
+ const css::uno::Reference<css::drawing::framework::XPane>& rxPane,
+ FrameView* pFrameView,
+ const bool bIsCenterView);
+
+ std::shared_ptr<ViewShell> CreateViewShell (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ SfxViewFrame& rFrame,
+ vcl::Window& rWindow,
+ FrameView* pFrameView);
+
+ void ActivateCenterView (
+ const std::shared_ptr<ViewDescriptor>& rpDescriptor);
+
+ void ReleaseView (
+ const std::shared_ptr<ViewDescriptor>& rpDescriptor,
+ bool bDoNotCache);
+
+ bool IsCacheable (
+ const std::shared_ptr<ViewDescriptor>& rpDescriptor);
+
+ std::shared_ptr<ViewDescriptor> GetViewFromCache (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ const css::uno::Reference<css::drawing::framework::XPane>& rxPane);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/ChildWindowPane.cxx b/sd/source/ui/framework/factories/ChildWindowPane.cxx
new file mode 100644
index 000000000..136f6fcb7
--- /dev/null
+++ b/sd/source/ui/framework/factories/ChildWindowPane.cxx
@@ -0,0 +1,219 @@
+/* -*- 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 <memory>
+#include <sal/config.h>
+#include <sal/log.hxx>
+
+#include <utility>
+
+#include "ChildWindowPane.hxx"
+
+#include <PaneDockingWindow.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShellManager.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <sfx2/viewfrm.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sd::framework {
+
+ChildWindowPane::ChildWindowPane (
+ const Reference<XResourceId>& rxPaneId,
+ sal_uInt16 nChildWindowId,
+ ViewShellBase& rViewShellBase,
+ ::std::unique_ptr<SfxShell> && pShell)
+ : ChildWindowPaneInterfaceBase(rxPaneId,nullptr),
+ mnChildWindowId(nChildWindowId),
+ mrViewShellBase(rViewShellBase),
+ mpShell(std::move(pShell)),
+ mbHasBeenActivated(false)
+{
+ mrViewShellBase.GetViewShellManager()->ActivateShell(mpShell.get());
+
+ SfxViewFrame* pViewFrame = mrViewShellBase.GetViewFrame();
+ if (pViewFrame == nullptr)
+ return;
+
+ if (mrViewShellBase.IsActive())
+ {
+ if (pViewFrame->KnowsChildWindow(mnChildWindowId))
+ {
+ if (pViewFrame->HasChildWindow(mnChildWindowId))
+ {
+ // The ViewShellBase has already been activated. Make
+ // the child window visible as soon as possible.
+ pViewFrame->SetChildWindow(mnChildWindowId, true);
+ }
+ else
+ {
+ // The window is created asynchronously. Rely on the
+ // ConfigurationUpdater to try another update, and with
+ // that another request for this window, in a short
+ // time.
+ }
+ }
+ else
+ {
+ SAL_WARN("sd", "ChildWindowPane:not known");
+ }
+ }
+ else
+ {
+ // The ViewShellBase has not yet been activated. Hide the
+ // window and wait a little before it is made visible. See
+ // comments in the GetWindow() method for an explanation.
+ pViewFrame->SetChildWindow(mnChildWindowId, false);
+ }
+}
+
+ChildWindowPane::~ChildWindowPane()
+{
+}
+
+void ChildWindowPane::Hide()
+{
+ SfxViewFrame* pViewFrame = mrViewShellBase.GetViewFrame();
+ if (pViewFrame != nullptr)
+ if (pViewFrame->KnowsChildWindow(mnChildWindowId))
+ if (pViewFrame->HasChildWindow(mnChildWindowId))
+ pViewFrame->SetChildWindow(mnChildWindowId, false);
+
+ // Release the window because when the child window is shown again it
+ // may use a different window.
+ mxWindow = nullptr;
+}
+
+void SAL_CALL ChildWindowPane::disposing()
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+
+ mrViewShellBase.GetViewShellManager()->DeactivateShell(mpShell.get());
+ mpShell.reset();
+
+ if (mxWindow.is())
+ {
+ mxWindow->removeEventListener(this);
+ }
+
+ Pane::disposing();
+}
+
+vcl::Window* ChildWindowPane::GetWindow()
+{
+ do
+ {
+ if (mxWindow.is())
+ // Window already exists => nothing to do.
+ break;
+
+ // When the window is not yet present then obtain it only when the
+ // shell has already been activated. The activation is not
+ // necessary for the code to work properly but is used to optimize
+ // the layouting and displaying of the window. When it is made
+ // visible too early then some layouting seems to be made twice or at
+ // an inconvenient time and the overall process of initializing the
+ // Impress takes longer.
+ if (!mbHasBeenActivated && mpShell != nullptr && !mpShell->IsActive())
+ break;
+
+ mbHasBeenActivated = true;
+ SfxViewFrame* pViewFrame = mrViewShellBase.GetViewFrame();
+ if (pViewFrame == nullptr)
+ break;
+ // The view frame has to know the child window. This can be the
+ // case, when for example the document is in read-only mode: the
+ // task pane is then not available.
+ if ( ! pViewFrame->KnowsChildWindow(mnChildWindowId))
+ break;
+
+ pViewFrame->SetChildWindow(mnChildWindowId, true);
+ SfxChildWindow* pChildWindow = pViewFrame->GetChildWindow(mnChildWindowId);
+ if (pChildWindow == nullptr)
+ if (pViewFrame->HasChildWindow(mnChildWindowId))
+ {
+ // The child window is not yet visible. Ask the view frame
+ // to show it and try again to get access to the child
+ // window.
+ pViewFrame->ShowChildWindow(mnChildWindowId);
+ pChildWindow = pViewFrame->GetChildWindow(mnChildWindowId);
+ }
+
+ // When the child window is still not visible then we have to try later.
+ if (pChildWindow == nullptr)
+ break;
+
+ // From the child window get the docking window and from that the
+ // content window that is the container for the actual content.
+ PaneDockingWindow* pDockingWindow = dynamic_cast<PaneDockingWindow*>(
+ pChildWindow->GetWindow());
+ if (pDockingWindow == nullptr)
+ break;
+
+ // At last, we have access to the window and its UNO wrapper.
+ mpWindow = &pDockingWindow->GetContentWindow();
+ mxWindow = VCLUnoHelper::GetInterface(mpWindow);
+
+ // Register as window listener to be informed when the child window
+ // is hidden.
+ if (mxWindow.is())
+ mxWindow->addEventListener(this);
+ }
+ while (false);
+
+ return mpWindow;
+}
+
+Reference<awt::XWindow> SAL_CALL ChildWindowPane::getWindow()
+{
+ if (mpWindow == nullptr || ! mxWindow.is())
+ GetWindow();
+ return Pane::getWindow();
+}
+
+IMPLEMENT_FORWARD_XINTERFACE2(
+ ChildWindowPane,
+ ChildWindowPaneInterfaceBase,
+ Pane);
+IMPLEMENT_FORWARD_XTYPEPROVIDER2(
+ ChildWindowPane,
+ ChildWindowPaneInterfaceBase,
+ Pane);
+
+//----- XEventListener --------------------------------------------------------
+
+void SAL_CALL ChildWindowPane::disposing (const lang::EventObject& rEvent)
+{
+ ThrowIfDisposed();
+
+ if (rEvent.Source == mxWindow)
+ {
+ // The window is gone but the pane remains alive. The next call to
+ // GetWindow() may create the window anew.
+ mxWindow = nullptr;
+ mpWindow = nullptr;
+ }
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/ChildWindowPane.hxx b/sd/source/ui/framework/factories/ChildWindowPane.hxx
new file mode 100644
index 000000000..082177757
--- /dev/null
+++ b/sd/source/ui/framework/factories/ChildWindowPane.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <framework/Pane.hxx>
+
+#include <com/sun/star/lang/XEventListener.hpp>
+#include <cppuhelper/implbase.hxx>
+#include <comphelper/uno3.hxx>
+#include <memory>
+
+class SfxShell;
+
+namespace sd { class ViewShellBase; }
+namespace com::sun::star::awt { class XWindow; }
+namespace com::sun::star::drawing::framework { class XResourceId; }
+
+namespace sd::framework {
+
+typedef ::cppu::ImplInheritanceHelper <
+ ::sd::framework::Pane,
+ css::lang::XEventListener
+ > ChildWindowPaneInterfaceBase;
+
+/** The ChildWindowPane listens to the child window and disposes itself when
+ the child window becomes inaccessible. This happens for instance when a
+ document is made read-only and the task pane is turned off.
+*/
+class ChildWindowPane
+ : public ChildWindowPaneInterfaceBase
+{
+public:
+ ChildWindowPane (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
+ sal_uInt16 nChildWindowId,
+ ViewShellBase& rViewShellBase,
+ ::std::unique_ptr<SfxShell> && pShell);
+ virtual ~ChildWindowPane() override;
+
+ /** Hide the pane. To make the pane visible again, call GetWindow().
+ */
+ void Hide();
+
+ virtual void SAL_CALL disposing() override;
+
+ /** This returns the content window when the child window is already
+ visible. Otherwise <NULL/> is returned. In that case a later call
+ may return the requested window (making a child window visible is an
+ asynchronous process.)
+ Note that GetWindow() may return different Window pointers when
+ Hide() is called in between.
+ */
+ virtual vcl::Window* GetWindow() override;
+
+ /** The local getWindow() first calls GetWindow() to provide a valid
+ window pointer before forwarding the call to the base class.
+ */
+ virtual css::uno::Reference<css::awt::XWindow>
+ SAL_CALL getWindow() override;
+
+ DECLARE_XINTERFACE()
+ DECLARE_XTYPEPROVIDER()
+
+ // XEventListener
+
+ virtual void SAL_CALL disposing(
+ const css::lang::EventObject& rEvent) override;
+
+private:
+ sal_uInt16 mnChildWindowId;
+ ViewShellBase& mrViewShellBase;
+ ::std::unique_ptr<SfxShell> mpShell;
+
+ /** This flag is set when the pane shell has been activated at least
+ once. It is used to optimize the start-up performance (by not
+ showing the window too early) and by not delaying its creation at
+ later times.
+ */
+ bool mbHasBeenActivated;
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/FrameWindowPane.cxx b/sd/source/ui/framework/factories/FrameWindowPane.cxx
new file mode 100644
index 000000000..1f4b387d8
--- /dev/null
+++ b/sd/source/ui/framework/factories/FrameWindowPane.cxx
@@ -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/.
+ *
+ * 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 "FrameWindowPane.hxx"
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sd::framework
+{
+FrameWindowPane::FrameWindowPane(const Reference<XResourceId>& rxPaneId, vcl::Window* pWindow)
+ : Pane(rxPaneId, pWindow)
+{
+}
+
+FrameWindowPane::~FrameWindowPane() noexcept {}
+
+sal_Bool SAL_CALL FrameWindowPane::isAnchorOnly() { return false; }
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/FrameWindowPane.hxx b/sd/source/ui/framework/factories/FrameWindowPane.hxx
new file mode 100644
index 000000000..67da37fdf
--- /dev/null
+++ b/sd/source/ui/framework/factories/FrameWindowPane.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <framework/Pane.hxx>
+
+namespace com::sun::star::drawing::framework
+{
+class XResourceId;
+}
+
+namespace sd::framework
+{
+/** This subclass is not necessary anymore. We can remove it if that
+ remains so.
+*/
+class FrameWindowPane : public Pane
+{
+public:
+ FrameWindowPane(const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
+ vcl::Window* pWindow);
+ virtual ~FrameWindowPane() noexcept override;
+
+ /** A frame window typically can (and should) exists on its own without
+ children, if only to visualize that something (a view) is missing.
+ Therefore this method always returns <FALSE/>.
+ */
+ virtual sal_Bool SAL_CALL isAnchorOnly() override;
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/FullScreenPane.cxx b/sd/source/ui/framework/factories/FullScreenPane.cxx
new file mode 100644
index 000000000..dbf34213f
--- /dev/null
+++ b/sd/source/ui/framework/factories/FullScreenPane.cxx
@@ -0,0 +1,226 @@
+/* -*- 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 "FullScreenPane.hxx"
+#include <vcl/vclevent.hxx>
+#include <vcl/wrkwin.hxx>
+#include <o3tl/string_view.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/util/URL.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sd::framework {
+
+FullScreenPane::FullScreenPane (
+ const Reference<XComponentContext>& rxComponentContext,
+ const Reference<XResourceId>& rxPaneId,
+ const vcl::Window* pViewShellWindow)
+ : FrameWindowPane(rxPaneId,nullptr),
+ mxComponentContext(rxComponentContext)
+{
+ vcl::Window* pParent = nullptr;
+ mpWorkWindow.reset(VclPtr<WorkWindow>::Create(
+
+ pParent,
+ 0)); // For debugging (non-fullscreen) use WB_BORDER | WB_MOVEABLE | WB_SIZEABLE));
+
+ if ( ! rxPaneId.is())
+ throw lang::IllegalArgumentException();
+
+ sal_Int32 nScreenNumber = 1;
+ ExtractArguments(rxPaneId, nScreenNumber);
+
+ if (!mpWorkWindow)
+ return;
+
+ // Create a new top-level window that is displayed full screen.
+ mpWorkWindow->ShowFullScreenMode(true, nScreenNumber);
+ // For debugging (non-fullscreen) use mpWorkWindow->SetScreenNumber(nScreenNumber);
+ mpWorkWindow->SetMenuBarMode(MenuBarMode::Hide);
+ mpWorkWindow->SetBorderStyle(WindowBorderStyle::REMOVEBORDER);
+ mpWorkWindow->SetBackground(Wallpaper());
+ // Don't show the window right now in order to allow the setting of an
+ // accessibility object: accessibility objects are typically
+ // requested by AT-tools when the window is shown. Chaining it
+ // afterwards may or may not work.
+
+ // Add resize listener at the work window.
+ Link<VclWindowEvent&,void> aWindowEventHandler (LINK(this, FullScreenPane, WindowEventHandler));
+ mpWorkWindow->AddEventListener(aWindowEventHandler);
+
+ // Set title and icon of the new window to those of the current window
+ // of the view shell.
+ if (pViewShellWindow != nullptr)
+ {
+ const SystemWindow* pSystemWindow = pViewShellWindow->GetSystemWindow();
+ mpWorkWindow->SetText(pSystemWindow->GetText());
+ mpWorkWindow->SetIcon(pSystemWindow->GetIcon());
+ }
+
+ // For some reason the VCL canvas can not paint into a WorkWindow.
+ // Therefore a child window is created that covers the WorkWindow
+ // completely.
+ mpWindow = VclPtr<vcl::Window>::Create(mpWorkWindow.get());
+ mpWindow->SetPosSizePixel(Point(0,0), mpWorkWindow->GetSizePixel());
+ mpWindow->SetBackground(Wallpaper());
+ mxWindow = VCLUnoHelper::GetInterface(mpWindow);
+
+ // Create the canvas.
+ mxCanvas = CreateCanvas();
+
+ mpWindow->GrabFocus();
+}
+
+FullScreenPane::~FullScreenPane() noexcept
+{
+}
+
+void SAL_CALL FullScreenPane::disposing()
+{
+ mpWindow.disposeAndClear();
+
+ if (mpWorkWindow)
+ {
+ Link<VclWindowEvent&,void> aWindowEventHandler (LINK(this, FullScreenPane, WindowEventHandler));
+ mpWorkWindow->RemoveEventListener(aWindowEventHandler);
+ mpWorkWindow.disposeAndClear();
+ }
+
+ FrameWindowPane::disposing();
+}
+
+//----- XPane -----------------------------------------------------------------
+
+sal_Bool SAL_CALL FullScreenPane::isVisible()
+{
+ ThrowIfDisposed();
+
+ if (mpWindow != nullptr)
+ return mpWindow->IsReallyVisible();
+ else
+ return false;
+}
+
+void SAL_CALL FullScreenPane::setVisible (const sal_Bool bIsVisible)
+{
+ ThrowIfDisposed();
+
+ if (mpWindow != nullptr)
+ mpWindow->Show(bIsVisible);
+ if (mpWorkWindow != nullptr)
+ mpWorkWindow->Show(bIsVisible);
+}
+
+Reference<css::accessibility::XAccessible> SAL_CALL FullScreenPane::getAccessible()
+{
+ ThrowIfDisposed();
+
+ if (mpWorkWindow != nullptr)
+ return mpWorkWindow->GetAccessible(false);
+ else
+ return nullptr;
+}
+
+void SAL_CALL FullScreenPane::setAccessible (
+ const Reference<css::accessibility::XAccessible>& rxAccessible)
+{
+ ThrowIfDisposed();
+
+ if (mpWindow == nullptr)
+ return;
+
+ Reference<lang::XInitialization> xInitializable (rxAccessible, UNO_QUERY);
+ if (xInitializable.is())
+ {
+ vcl::Window* pParentWindow = mpWindow->GetParent();
+ Reference<css::accessibility::XAccessible> xAccessibleParent;
+ if (pParentWindow != nullptr)
+ xAccessibleParent = pParentWindow->GetAccessible();
+ Sequence<Any> aArguments{ Any(xAccessibleParent) };
+ xInitializable->initialize(aArguments);
+ }
+ GetWindow()->SetAccessible(rxAccessible);
+}
+
+IMPL_LINK(FullScreenPane, WindowEventHandler, VclWindowEvent&, rEvent, void)
+{
+ switch (rEvent.GetId())
+ {
+ case VclEventId::WindowResize:
+ GetWindow()->SetPosPixel(Point(0,0));
+ GetWindow()->SetSizePixel(Size(
+ mpWorkWindow->GetSizePixel().Width(),
+ mpWorkWindow->GetSizePixel().Height()));
+ break;
+
+ case VclEventId::ObjectDying:
+ mpWorkWindow.disposeAndClear();
+ break;
+
+ default: break;
+ }
+}
+
+Reference<rendering::XCanvas> FullScreenPane::CreateCanvas()
+{
+ VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(mxWindow);
+ if (!pWindow)
+ throw RuntimeException();
+
+ Sequence<Any> aArg{ // common: first any is VCL pointer to window (for VCL canvas)
+ Any(reinterpret_cast<sal_Int64>(pWindow.get())),
+ Any(css::awt::Rectangle()),
+ Any(false),
+ Any(mxWindow)
+ };
+
+ Reference<lang::XMultiServiceFactory> xFactory (
+ mxComponentContext->getServiceManager(), UNO_QUERY_THROW);
+ return Reference<rendering::XCanvas>(
+ xFactory->createInstanceWithArguments("com.sun.star.rendering.SpriteCanvas.VCL",
+ aArg),
+ UNO_QUERY);
+}
+
+void FullScreenPane::ExtractArguments (
+ const Reference<XResourceId>& rxPaneId,
+ sal_Int32& rnScreenNumberReturnValue)
+{
+ // Extract arguments from the resource URL.
+ const util::URL aURL = rxPaneId->getFullResourceURL();
+ for (sal_Int32 nIndex{ 0 }; nIndex >= 0; )
+ {
+ const std::u16string_view aToken = o3tl::getToken(aURL.Arguments, 0, '&', nIndex);
+ std::u16string_view sValue;
+ if (o3tl::starts_with(aToken, u"ScreenNumber=", &sValue))
+ {
+ rnScreenNumberReturnValue = o3tl::toInt32(sValue);
+ }
+ }
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/FullScreenPane.hxx b/sd/source/ui/framework/factories/FullScreenPane.hxx
new file mode 100644
index 000000000..b33804ee5
--- /dev/null
+++ b/sd/source/ui/framework/factories/FullScreenPane.hxx
@@ -0,0 +1,85 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "FrameWindowPane.hxx"
+#include <tools/link.hxx>
+#include <vcl/wrkwin.hxx>
+
+class VclWindowEvent;
+
+namespace vcl { class Window; }
+namespace com::sun::star::uno { class XComponentContext; }
+
+namespace sd::framework {
+
+/** The full screen pane creates a pane that covers the complete application
+ window, i.e. that hides menu bar, tool bars, status bars.
+*/
+class FullScreenPane
+ : public FrameWindowPane
+{
+public:
+ /** Create a new full screen pane.
+ @param rxComponentContext
+ Used for creating a new canvas.
+ @param rxPaneId
+ The resource id of the new pane.
+ @param pViewShellWindow
+ The top-level parent of this window is used to obtain title and
+ icon for the new top-level window.
+ */
+ FullScreenPane (
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
+ const vcl::Window* pViewShellWindow);
+ virtual ~FullScreenPane() noexcept override;
+
+ virtual void SAL_CALL disposing() override;
+
+ //----- XPane -------------------------------------------------------------
+
+ virtual sal_Bool SAL_CALL isVisible() override;
+
+ virtual void SAL_CALL setVisible (sal_Bool bIsVisible) override;
+
+ virtual css::uno::Reference<css::accessibility::XAccessible> SAL_CALL getAccessible() override;
+
+ virtual void SAL_CALL setAccessible (
+ const css::uno::Reference<css::accessibility::XAccessible>& rxAccessible) override;
+
+ DECL_LINK(WindowEventHandler, VclWindowEvent&, void);
+
+protected:
+ virtual css::uno::Reference<css::rendering::XCanvas>
+ CreateCanvas() override;
+
+private:
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+ VclPtr<WorkWindow> mpWorkWindow;
+
+ static void ExtractArguments (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
+ sal_Int32& rnScreenNumberReturnValue);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/Pane.cxx b/sd/source/ui/framework/factories/Pane.cxx
new file mode 100644
index 000000000..a188f0e11
--- /dev/null
+++ b/sd/source/ui/framework/factories/Pane.cxx
@@ -0,0 +1,178 @@
+/* -*- 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 <framework/Pane.hxx>
+
+#include <osl/mutex.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <vcl/window.hxx>
+#include <cppcanvas/vclfactory.hxx>
+#include <com/sun/star/rendering/XSpriteCanvas.hpp>
+#include <comphelper/servicehelper.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sd::framework {
+
+Pane::Pane (
+ const Reference<XResourceId>& rxPaneId,
+ vcl::Window* pWindow)
+ noexcept
+ : PaneInterfaceBase(m_aMutex),
+ mxPaneId(rxPaneId),
+ mpWindow(pWindow),
+ mxWindow(VCLUnoHelper::GetInterface(pWindow))
+{
+}
+
+Pane::~Pane()
+{
+}
+
+void Pane::disposing()
+{
+ mxWindow = nullptr;
+ mpWindow = nullptr;
+}
+
+vcl::Window* Pane::GetWindow()
+{
+ if (mxWindow.is())
+ return mpWindow;
+ else
+ return nullptr;
+}
+
+//----- XPane -----------------------------------------------------------------
+
+Reference<awt::XWindow> SAL_CALL Pane::getWindow()
+{
+ ThrowIfDisposed();
+
+ return mxWindow;
+}
+
+Reference<rendering::XCanvas> SAL_CALL Pane::getCanvas()
+{
+ ::osl::MutexGuard aGuard (m_aMutex);
+ ThrowIfDisposed();
+
+ if ( ! mxCanvas.is())
+ mxCanvas = CreateCanvas();
+
+ return mxCanvas;
+}
+
+//----- XPane2 ----------------------------------------------------------------
+
+sal_Bool SAL_CALL Pane::isVisible()
+{
+ ThrowIfDisposed();
+
+ const vcl::Window* pWindow = GetWindow();
+ if (pWindow != nullptr)
+ return pWindow->IsVisible();
+ else
+ return false;
+}
+
+void SAL_CALL Pane::setVisible (sal_Bool bIsVisible)
+{
+ ThrowIfDisposed();
+
+ vcl::Window* pWindow = GetWindow();
+ if (pWindow != nullptr)
+ pWindow->Show(bIsVisible);
+}
+
+Reference<css::accessibility::XAccessible> SAL_CALL Pane::getAccessible()
+{
+ ThrowIfDisposed();
+ vcl::Window* pWindow = GetWindow();
+ if (pWindow != nullptr)
+ return pWindow->GetAccessible(false);
+ else
+ return nullptr;
+}
+
+void SAL_CALL Pane::setAccessible (
+ const Reference<css::accessibility::XAccessible>& rxAccessible)
+{
+ ThrowIfDisposed();
+ vcl::Window* pWindow = GetWindow();
+ if (pWindow != nullptr)
+ pWindow->SetAccessible(rxAccessible);
+}
+
+//----- XResource -------------------------------------------------------------
+
+Reference<XResourceId> SAL_CALL Pane::getResourceId()
+{
+ ThrowIfDisposed();
+
+ return mxPaneId;
+}
+
+sal_Bool SAL_CALL Pane::isAnchorOnly()
+{
+ return true;
+}
+
+//----- XUnoTunnel ------------------------------------------------------------
+
+const Sequence<sal_Int8>& Pane::getUnoTunnelId()
+{
+ static const comphelper::UnoIdInit thePaneUnoTunnelId;
+ return thePaneUnoTunnelId.getSeq();
+}
+
+sal_Int64 SAL_CALL Pane::getSomething (const Sequence<sal_Int8>& rId)
+{
+ return comphelper::getSomethingImpl(rId, this);
+}
+
+Reference<rendering::XCanvas> Pane::CreateCanvas()
+{
+ Reference<rendering::XCanvas> xCanvas;
+
+ if (mpWindow != nullptr)
+ {
+ ::cppcanvas::SpriteCanvasSharedPtr pCanvas (
+ cppcanvas::VCLFactory::createSpriteCanvas(*mpWindow));
+ if (pCanvas)
+ xCanvas.set(pCanvas->getUNOSpriteCanvas());
+ }
+
+ return xCanvas;
+}
+
+void Pane::ThrowIfDisposed() const
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException ("Pane object has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/PresentationFactory.cxx b/sd/source/ui/framework/factories/PresentationFactory.cxx
new file mode 100644
index 000000000..8cf603809
--- /dev/null
+++ b/sd/source/ui/framework/factories/PresentationFactory.cxx
@@ -0,0 +1,192 @@
+/* -*- 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 <framework/PresentationFactory.hxx>
+
+#include <DrawController.hxx>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <comphelper/servicehelper.hxx>
+#include <comphelper/compbase.hxx>
+#include <tools/diagnose_ex.h>
+#include <slideshow.hxx>
+
+namespace com::sun::star::uno { class XComponentContext; }
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::drawing::framework;
+
+
+namespace sd::framework {
+
+namespace {
+
+typedef comphelper::WeakComponentImplHelper<lang::XInitialization> PresentationFactoryProviderInterfaceBase;
+
+class PresentationFactoryProvider
+ : public PresentationFactoryProviderInterfaceBase
+{
+public:
+ PresentationFactoryProvider ();
+
+ // XInitialization
+
+ virtual void SAL_CALL initialize(
+ const css::uno::Sequence<css::uno::Any>& aArguments) override;
+};
+
+typedef comphelper::WeakComponentImplHelper<XView> PresentationViewInterfaceBase;
+
+/** The PresentationView is not an actual view, it is a marker whose
+ existence in a configuration indicates that a slideshow is running
+ (in another application window).
+*/
+class PresentationView
+ : public PresentationViewInterfaceBase
+{
+public:
+ explicit PresentationView (const Reference<XResourceId>& rxViewId)
+ : mxResourceId(rxViewId) {};
+
+ // XView
+
+ virtual Reference<XResourceId> SAL_CALL getResourceId() override
+ { return mxResourceId; };
+
+ virtual sal_Bool SAL_CALL isAnchorOnly() override
+ { return false; }
+
+private:
+ Reference<XResourceId> mxResourceId;
+};
+
+} // end of anonymous namespace.
+
+//===== PresentationFactory ===================================================
+
+constexpr OUStringLiteral gsPresentationViewURL = u"private:resource/view/Presentation";
+
+PresentationFactory::PresentationFactory (
+ const Reference<frame::XController>& rxController)
+ : mxController(rxController)
+{
+}
+
+PresentationFactory::~PresentationFactory()
+{
+}
+
+//----- XViewFactory ----------------------------------------------------------
+
+Reference<XResource> SAL_CALL PresentationFactory::createResource (
+ const Reference<XResourceId>& rxViewId)
+{
+ ThrowIfDisposed();
+
+ if (rxViewId.is())
+ if ( ! rxViewId->hasAnchor() && rxViewId->getResourceURL() == gsPresentationViewURL)
+ return new PresentationView(rxViewId);
+
+ return Reference<XResource>();
+}
+
+void SAL_CALL PresentationFactory::releaseResource (
+ const Reference<XResource>&)
+{
+ ThrowIfDisposed();
+
+ auto pController = comphelper::getFromUnoTunnel<sd::DrawController>(mxController);
+ if (pController != nullptr)
+ {
+ ViewShellBase* pBase = pController->GetViewShellBase();
+ if (pBase != nullptr)
+ SlideShow::Stop( *pBase );
+ }
+}
+
+//===== XConfigurationChangeListener ==========================================
+
+void SAL_CALL PresentationFactory::notifyConfigurationChange (
+ const ConfigurationChangeEvent&)
+{}
+
+//===== lang::XEventListener ==================================================
+
+void SAL_CALL PresentationFactory::disposing (
+ const lang::EventObject&)
+{}
+
+void PresentationFactory::ThrowIfDisposed() const
+{
+ if (m_bDisposed)
+ {
+ throw lang::DisposedException ("PresentationFactory object has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+namespace {
+
+//===== PresentationFactoryProvider ===========================================
+
+PresentationFactoryProvider::PresentationFactoryProvider ()
+{
+}
+
+// XInitialization
+
+void SAL_CALL PresentationFactoryProvider::initialize(
+ const Sequence<Any>& aArguments)
+{
+ if (!aArguments.hasElements())
+ return;
+
+ try
+ {
+ // Get the XController from the first argument.
+ Reference<frame::XController> xController (aArguments[0], UNO_QUERY_THROW);
+ Reference<XControllerManager> xCM (xController, UNO_QUERY_THROW);
+ Reference<XConfigurationController> xCC (xCM->getConfigurationController());
+ if (xCC.is())
+ xCC->addResourceFactory(
+ gsPresentationViewURL,
+ new PresentationFactory(xController));
+ }
+ catch (RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+}
+
+} // end of anonymous namespace.
+
+} // end of namespace sd::framework
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_framework_PresentationFactoryProvider_get_implementation(css::uno::XComponentContext*,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::framework::PresentationFactoryProvider);
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/factories/ViewShellWrapper.cxx b/sd/source/ui/framework/factories/ViewShellWrapper.cxx
new file mode 100644
index 000000000..8f0fcd976
--- /dev/null
+++ b/sd/source/ui/framework/factories/ViewShellWrapper.cxx
@@ -0,0 +1,252 @@
+/* -*- 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 <framework/ViewShellWrapper.hxx>
+#include <sdpage.hxx>
+#include <ViewShell.hxx>
+
+#include <SlideSorter.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <model/SlsPageDescriptor.hxx>
+
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+
+#include <toolkit/helper/vclunohelper.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <sal/log.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+using ::com::sun::star::awt::XWindow;
+
+namespace sd::framework {
+
+ViewShellWrapper::ViewShellWrapper (
+ const std::shared_ptr<ViewShell>& pViewShell,
+ const Reference<XResourceId>& rxViewId,
+ const Reference<awt::XWindow>& rxWindow)
+ : mpViewShell(pViewShell),
+ mpSlideSorterViewShell(
+ std::dynamic_pointer_cast< ::sd::slidesorter::SlideSorterViewShell >( pViewShell )),
+ mxViewId(rxViewId),
+ mxWindow(rxWindow)
+{
+}
+
+ViewShellWrapper::~ViewShellWrapper()
+{
+}
+
+void ViewShellWrapper::disposing(std::unique_lock<std::mutex>&)
+{
+ SAL_INFO("sd.ui", "disposing ViewShellWrapper " << this);
+ Reference<awt::XWindow> xWindow (mxWindow);
+ if (xWindow.is())
+ {
+ SAL_INFO(
+ "sd.ui",
+ "removing ViewShellWrapper " << this << " from window listener at "
+ << mxWindow.get());
+ xWindow->removeWindowListener(this);
+ }
+
+ mpSlideSorterViewShell.reset();
+ mpViewShell.reset();
+}
+
+uno::Any SAL_CALL ViewShellWrapper::queryInterface( const uno::Type & rType )
+{
+ if( mpSlideSorterViewShell &&
+ rType == cppu::UnoType<view::XSelectionSupplier>::get() )
+ {
+ uno::Reference<view::XSelectionSupplier> xSupplier( this );
+ return Any(xSupplier);
+ }
+ else
+ return ViewShellWrapperInterfaceBase::queryInterface( rType );
+}
+
+//----- XResource -------------------------------------------------------------
+
+Reference<XResourceId> SAL_CALL ViewShellWrapper::getResourceId()
+{
+ return mxViewId;
+}
+
+sal_Bool SAL_CALL ViewShellWrapper::isAnchorOnly()
+{
+ return false;
+}
+
+//----- XSelectionSupplier --------------------------------------------------
+
+sal_Bool SAL_CALL ViewShellWrapper::select( const css::uno::Any& aSelection )
+{
+ if (!mpSlideSorterViewShell)
+ return false;
+
+ ::sd::slidesorter::controller::SlideSorterController& rSlideSorterController
+ = mpSlideSorterViewShell->GetSlideSorter().GetController();
+ ::sd::slidesorter::controller::PageSelector& rSelector (rSlideSorterController.GetPageSelector());
+ rSelector.DeselectAllPages();
+ Sequence<Reference<drawing::XDrawPage> > xPages;
+ aSelection >>= xPages;
+ for (const auto& rPage : std::as_const(xPages))
+ {
+ Reference<beans::XPropertySet> xSet (rPage, UNO_QUERY);
+ if (xSet.is())
+ {
+ try
+ {
+ Any aNumber = xSet->getPropertyValue("Number");
+ sal_Int32 nPageNumber = 0;
+ aNumber >>= nPageNumber;
+ nPageNumber -=1; // Transform 1-based page numbers to 0-based ones.
+ rSelector.SelectPage(nPageNumber);
+ }
+ catch (const RuntimeException&)
+ {
+ }
+ }
+ }
+
+ return true;
+}
+
+uno::Any SAL_CALL ViewShellWrapper::getSelection()
+{
+ Any aResult;
+
+ if (!mpSlideSorterViewShell)
+ return aResult;
+
+ slidesorter::model::PageEnumeration aSelectedPages (
+ slidesorter::model::PageEnumerationProvider::CreateSelectedPagesEnumeration(
+ mpSlideSorterViewShell->GetSlideSorter().GetModel()));
+ int nSelectedPageCount (
+ mpSlideSorterViewShell->GetSlideSorter().GetController().GetPageSelector().GetSelectedPageCount());
+
+ Sequence<Reference<XInterface> > aPages(nSelectedPageCount);
+ auto aPagesRange = asNonConstRange(aPages);
+ int nIndex = 0;
+ while (aSelectedPages.HasMoreElements() && nIndex<nSelectedPageCount)
+ {
+ slidesorter::model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement());
+ aPagesRange[nIndex++] = pDescriptor->GetPage()->getUnoPage();
+ }
+ aResult <<= aPages;
+
+ return aResult;
+}
+
+void SAL_CALL ViewShellWrapper::addSelectionChangeListener( const uno::Reference< view::XSelectionChangeListener >& )
+{
+}
+
+void SAL_CALL ViewShellWrapper::removeSelectionChangeListener( const uno::Reference< view::XSelectionChangeListener >& )
+{
+}
+
+//----- XRelocatableResource --------------------------------------------------
+
+sal_Bool SAL_CALL ViewShellWrapper::relocateToAnchor (
+ const Reference<XResource>& xResource)
+{
+ bool bResult (false);
+
+ Reference<XPane> xPane (xResource, UNO_QUERY);
+ if (xPane.is())
+ {
+ // Detach from the window of the old pane.
+ Reference<awt::XWindow> xWindow (mxWindow);
+ if (xWindow.is())
+ xWindow->removeWindowListener(this);
+ mxWindow = nullptr;
+
+ if (mpViewShell != nullptr)
+ {
+ VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(xPane->getWindow());
+ if (pWindow && mpViewShell->RelocateToParentWindow(pWindow))
+ {
+ bResult = true;
+
+ // Attach to the window of the new pane.
+ xWindow = xPane->getWindow();
+ if (xWindow.is())
+ {
+ xWindow->addWindowListener(this);
+ mpViewShell->Resize();
+ }
+ }
+ }
+ }
+
+ return bResult;
+}
+
+//----- XUnoTunnel ------------------------------------------------------------
+
+const Sequence<sal_Int8>& ViewShellWrapper::getUnoTunnelId()
+{
+ static const comphelper::UnoIdInit theViewShellWrapperUnoTunnelId;
+ return theViewShellWrapperUnoTunnelId.getSeq();
+}
+
+sal_Int64 SAL_CALL ViewShellWrapper::getSomething (const Sequence<sal_Int8>& rId)
+{
+ return comphelper::getSomethingImpl(rId, this);
+}
+
+//===== awt::XWindowListener ==================================================
+
+void SAL_CALL ViewShellWrapper::windowResized (const awt::WindowEvent&)
+{
+ ViewShell* pViewShell (mpViewShell.get());
+ if (pViewShell != nullptr)
+ pViewShell->Resize();
+}
+
+void SAL_CALL ViewShellWrapper::windowMoved (const awt::WindowEvent&) {}
+
+void SAL_CALL ViewShellWrapper::windowShown (const lang::EventObject&)
+{
+ ViewShell* pViewShell (mpViewShell.get());
+ if (pViewShell != nullptr)
+ pViewShell->Resize();
+}
+
+void SAL_CALL ViewShellWrapper::windowHidden (const lang::EventObject&) {}
+
+//===== XEventListener ========================================================
+
+void SAL_CALL ViewShellWrapper::disposing (const lang::EventObject& rEvent)
+{
+ if (rEvent.Source == mxWindow)
+ mxWindow = nullptr;
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/CenterViewFocusModule.cxx b/sd/source/ui/framework/module/CenterViewFocusModule.cxx
new file mode 100644
index 000000000..e36f95e33
--- /dev/null
+++ b/sd/source/ui/framework/module/CenterViewFocusModule.cxx
@@ -0,0 +1,151 @@
+/* -*- 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 "CenterViewFocusModule.hxx"
+
+#include <framework/FrameworkHelper.hxx>
+#include <framework/ViewShellWrapper.hxx>
+
+#include <DrawController.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShellManager.hxx>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <comphelper/servicehelper.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+using ::sd::framework::FrameworkHelper;
+
+namespace sd::framework {
+
+//===== CenterViewFocusModule ====================================================
+
+CenterViewFocusModule::CenterViewFocusModule (Reference<frame::XController> const & rxController)
+ : mbValid(false),
+ mpBase(nullptr),
+ mbNewViewCreated(false)
+{
+ Reference<XControllerManager> xControllerManager (rxController, UNO_QUERY);
+ if (xControllerManager.is())
+ {
+ mxConfigurationController = xControllerManager->getConfigurationController();
+
+ // Tunnel through the controller to obtain a ViewShellBase.
+ auto pController = comphelper::getFromUnoTunnel<sd::DrawController>(rxController);
+ if (pController != nullptr)
+ mpBase = pController->GetViewShellBase();
+
+ // Check, if all required objects do exist.
+ if (mxConfigurationController.is() && mpBase!=nullptr)
+ {
+ mbValid = true;
+ }
+ }
+
+ if (mbValid)
+ {
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msConfigurationUpdateEndEvent,
+ Any());
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msResourceActivationEvent,
+ Any());
+ }
+}
+
+CenterViewFocusModule::~CenterViewFocusModule()
+{
+}
+
+void CenterViewFocusModule::disposing(std::unique_lock<std::mutex>&)
+{
+ if (mxConfigurationController.is())
+ mxConfigurationController->removeConfigurationChangeListener(this);
+
+ mbValid = false;
+ mxConfigurationController = nullptr;
+ mpBase = nullptr;
+}
+
+void SAL_CALL CenterViewFocusModule::notifyConfigurationChange (
+ const ConfigurationChangeEvent& rEvent)
+{
+ if (mbValid)
+ {
+ if (rEvent.Type == FrameworkHelper::msConfigurationUpdateEndEvent)
+ {
+ HandleNewView(rEvent.Configuration);
+ }
+ else if (rEvent.Type == FrameworkHelper::msResourceActivationEvent)
+ {
+ if (rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix))
+ mbNewViewCreated = true;
+ }
+ }
+}
+
+void CenterViewFocusModule::HandleNewView (
+ const Reference<XConfiguration>& rxConfiguration)
+{
+ if (!mbNewViewCreated)
+ return;
+
+ mbNewViewCreated = false;
+ // Make the center pane the active one. Tunnel through the
+ // controller to obtain a ViewShell pointer.
+
+ Sequence<Reference<XResourceId> > xViewIds (rxConfiguration->getResources(
+ FrameworkHelper::CreateResourceId(FrameworkHelper::msCenterPaneURL),
+ FrameworkHelper::msViewURLPrefix,
+ AnchorBindingMode_DIRECT));
+ Reference<XView> xView;
+ if (xViewIds.hasElements())
+ xView.set( mxConfigurationController->getResource(xViewIds[0]),UNO_QUERY);
+ if (mpBase!=nullptr)
+ {
+ auto pViewShellWrapper = comphelper::getFromUnoTunnel<ViewShellWrapper>(xView);
+ if (pViewShellWrapper != nullptr)
+ {
+ std::shared_ptr<ViewShell> pViewShell = pViewShellWrapper->GetViewShell();
+ if (pViewShell != nullptr)
+ mpBase->GetViewShellManager()->MoveToTop(*pViewShell);
+ }
+ }
+}
+
+void SAL_CALL CenterViewFocusModule::disposing (
+ const lang::EventObject& rEvent)
+{
+ if (mxConfigurationController.is())
+ if (rEvent.Source == mxConfigurationController)
+ {
+ mbValid = false;
+ mxConfigurationController = nullptr;
+ mpBase = nullptr;
+ }
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/CenterViewFocusModule.hxx b/sd/source/ui/framework/module/CenterViewFocusModule.hxx
new file mode 100644
index 000000000..c6d5d348e
--- /dev/null
+++ b/sd/source/ui/framework/module/CenterViewFocusModule.hxx
@@ -0,0 +1,90 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp>
+#include <comphelper/compbase.hxx>
+
+namespace com::sun::star::drawing::framework
+{
+class XConfigurationController;
+}
+namespace com::sun::star::frame
+{
+class XController;
+}
+
+namespace sd
+{
+class ViewShellBase;
+}
+
+namespace sd::framework
+{
+typedef comphelper::WeakComponentImplHelper<css::drawing::framework::XConfigurationChangeListener>
+ CenterViewFocusModuleInterfaceBase;
+
+/** This module waits for new views to be created for the center pane and
+ then moves the center view to the top most place on the shell stack. As
+ we are moving away from the shell stack this module may become obsolete
+ or has to be modified.
+*/
+class CenterViewFocusModule final : public CenterViewFocusModuleInterfaceBase
+{
+public:
+ explicit CenterViewFocusModule(
+ css::uno::Reference<css::frame::XController> const& rxController);
+ virtual ~CenterViewFocusModule() override;
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ // XConfigurationChangeListener
+
+ virtual void SAL_CALL notifyConfigurationChange(
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent) override;
+
+ // XEventListener
+
+ virtual void SAL_CALL disposing(const css::lang::EventObject& rEvent) override;
+
+private:
+ class ViewShellContainer;
+
+ bool mbValid;
+ css::uno::Reference<css::drawing::framework::XConfigurationController>
+ mxConfigurationController;
+ ViewShellBase* mpBase;
+ /** This flag indicates whether in the last configuration change cycle a
+ new view has been created and thus the center view has to be moved
+ to the top of the shell stack.
+ */
+ bool mbNewViewCreated;
+
+ /** At the end of an update of the current configuration this method
+ handles a new view in the center pane by moving the associated view
+ shell to the top of the shell stack.
+ */
+ void HandleNewView(
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/DrawModule.cxx b/sd/source/ui/framework/module/DrawModule.cxx
new file mode 100644
index 000000000..17f4671fc
--- /dev/null
+++ b/sd/source/ui/framework/module/DrawModule.cxx
@@ -0,0 +1,41 @@
+/* -*- 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 <framework/DrawModule.hxx>
+
+#include <framework/FrameworkHelper.hxx>
+#include "CenterViewFocusModule.hxx"
+#include "SlideSorterModule.hxx"
+#include "ToolBarModule.hxx"
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd::framework
+{
+void DrawModule::Initialize(Reference<frame::XController> const& rxController)
+{
+ new sd::framework::CenterViewFocusModule(rxController);
+ new sd::framework::SlideSorterModule(rxController, FrameworkHelper::msLeftDrawPaneURL);
+ new ToolBarModule(rxController);
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/ImpressModule.cxx b/sd/source/ui/framework/module/ImpressModule.cxx
new file mode 100644
index 000000000..139b250fd
--- /dev/null
+++ b/sd/source/ui/framework/module/ImpressModule.cxx
@@ -0,0 +1,51 @@
+/* -*- 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 <framework/ImpressModule.hxx>
+
+#include <framework/FrameworkHelper.hxx>
+#include "ViewTabBarModule.hxx"
+#include "CenterViewFocusModule.hxx"
+#include "SlideSorterModule.hxx"
+#include "ToolBarModule.hxx"
+#include "ShellStackGuard.hxx"
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd::framework {
+
+void ImpressModule::Initialize (Reference<frame::XController> const & rxController)
+{
+ new CenterViewFocusModule(rxController);
+ new ViewTabBarModule(
+ rxController,
+ FrameworkHelper::CreateResourceId(
+ FrameworkHelper::msViewTabBarURL,
+ FrameworkHelper::msCenterPaneURL));
+ new SlideSorterModule(
+ rxController,
+ FrameworkHelper::msLeftImpressPaneURL);
+ new ToolBarModule(rxController);
+ new ShellStackGuard(rxController);
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/ModuleController.cxx b/sd/source/ui/framework/module/ModuleController.cxx
new file mode 100644
index 000000000..acd12ec8a
--- /dev/null
+++ b/sd/source/ui/framework/module/ModuleController.cxx
@@ -0,0 +1,244 @@
+/* -*- 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 <framework/ModuleController.hxx>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+
+#include <tools/ConfigurationAccess.hxx>
+#include <comphelper/processfactory.hxx>
+
+#include <tools/diagnose_ex.h>
+#include <sal/log.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+using ::sd::tools::ConfigurationAccess;
+
+namespace sd::framework {
+
+const sal_uInt32 snFactoryPropertyCount (2);
+const sal_uInt32 snStartupPropertyCount (1);
+
+//===== ModuleController ======================================================
+Reference<XModuleController> ModuleController::CreateInstance (
+ const Reference<XComponentContext>& rxContext)
+{
+ return new ModuleController(rxContext);
+}
+
+ModuleController::ModuleController (const Reference<XComponentContext>& rxContext)
+{
+ /** Load a list of URL to service mappings from the
+ /org.openoffice.Office.Impress/MultiPaneGUI/Framework/ResourceFactories
+ configuration entry. The mappings are stored in the
+ mpResourceToFactoryMap member.
+ */
+ try
+ {
+ ConfigurationAccess aConfiguration (
+ rxContext,
+ "/org.openoffice.Office.Impress/",
+ ConfigurationAccess::READ_ONLY);
+ Reference<container::XNameAccess> xFactories (
+ aConfiguration.GetConfigurationNode("MultiPaneGUI/Framework/ResourceFactories"),
+ UNO_QUERY);
+ ::std::vector<OUString> aProperties (snFactoryPropertyCount);
+ aProperties[0] = "ServiceName";
+ aProperties[1] = "ResourceList";
+ ConfigurationAccess::ForAll(
+ xFactories,
+ aProperties,
+ [this] (OUString const&, ::std::vector<Any> const& xs) {
+ return this->ProcessFactory(xs);
+ } );
+ }
+ catch (Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+}
+
+ModuleController::~ModuleController() noexcept
+{
+}
+
+void ModuleController::disposing(std::unique_lock<std::mutex>&)
+{
+ // Break the cyclic reference back to DrawController object
+ maLoadedFactories.clear();
+ maResourceToFactoryMap.clear();
+ mxController.clear();
+}
+
+void ModuleController::ProcessFactory (const ::std::vector<Any>& rValues)
+{
+ OSL_ASSERT(rValues.size() == snFactoryPropertyCount);
+
+ // Get the service name of the factory.
+ OUString sServiceName;
+ rValues[0] >>= sServiceName;
+
+ // Get all resource URLs that are created by the factory.
+ Reference<container::XNameAccess> xResources (rValues[1], UNO_QUERY);
+ ::std::vector<OUString> aURLs;
+ tools::ConfigurationAccess::FillList(
+ xResources,
+ "URL",
+ aURLs);
+
+ SAL_INFO("sd.fwk", __func__ << ": ModuleController::adding factory " << sServiceName);
+
+ // Add the resource URLs to the map.
+ for (const auto& rResource : aURLs)
+ {
+ maResourceToFactoryMap[rResource] = sServiceName;
+ SAL_INFO("sd.fwk", __func__ << ": " << rResource);
+ }
+}
+
+void ModuleController::InstantiateStartupServices()
+{
+ try
+ {
+ tools::ConfigurationAccess aConfiguration (
+ "/org.openoffice.Office.Impress/",
+ tools::ConfigurationAccess::READ_ONLY);
+ Reference<container::XNameAccess> xFactories (
+ aConfiguration.GetConfigurationNode("MultiPaneGUI/Framework/StartupServices"),
+ UNO_QUERY);
+ ::std::vector<OUString> aProperties (snStartupPropertyCount);
+ aProperties[0] = "ServiceName";
+ tools::ConfigurationAccess::ForAll(
+ xFactories,
+ aProperties,
+ [this] (OUString const&, ::std::vector<Any> const& xs) {
+ return this->ProcessStartupService(xs);
+ } );
+ }
+ catch (Exception&)
+ {
+ SAL_WARN("sd.fwk", "ERROR in ModuleController::InstantiateStartupServices");
+ }
+}
+
+void ModuleController::ProcessStartupService (const ::std::vector<Any>& rValues)
+{
+ OSL_ASSERT(rValues.size() == snStartupPropertyCount);
+
+ try
+ {
+ // Get the service name of the startup service.
+ OUString sServiceName;
+ rValues[0] >>= sServiceName;
+
+ // Instantiate service.
+ Reference<uno::XComponentContext> xContext =
+ ::comphelper::getProcessComponentContext();
+
+ // Create the startup service.
+ Sequence<Any> aArguments{ Any(mxController) };
+ // Note that when the new object will be destroyed at the end of
+ // this scope when it does not register itself anywhere.
+ // Typically it will add itself as ConfigurationChangeListener
+ // at the configuration controller.
+ xContext->getServiceManager()->createInstanceWithArgumentsAndContext(sServiceName, aArguments, xContext);
+
+ SAL_INFO("sd.fwk", __func__ << ": ModuleController::created startup service " << sServiceName);
+ }
+ catch (Exception&)
+ {
+ SAL_WARN("sd.fwk", "ERROR in ModuleController::ProcessStartupServices");
+ }
+}
+
+//----- XModuleController -----------------------------------------------------
+
+void SAL_CALL ModuleController::requestResource (const OUString& rsResourceURL)
+{
+ auto iFactory = maResourceToFactoryMap.find(rsResourceURL);
+ if (iFactory == maResourceToFactoryMap.end())
+ return;
+
+ // Check that the factory has already been loaded and not been
+ // destroyed in the meantime.
+ Reference<XInterface> xFactory;
+ auto iLoadedFactory = maLoadedFactories.find(iFactory->second);
+ if (iLoadedFactory != maLoadedFactories.end())
+ xFactory.set(iLoadedFactory->second, UNO_QUERY);
+ if ( xFactory.is())
+ return;
+
+ // Create a new instance of the factory.
+ Reference<uno::XComponentContext> xContext =
+ ::comphelper::getProcessComponentContext();
+
+ // Create the factory service.
+ Sequence<Any> aArguments{ Any(mxController) };
+ try
+ {
+ xFactory = xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+ iFactory->second,
+ aArguments,
+ xContext);
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION("sd.fwk", "caught exception while creating factory");
+ }
+
+ // Remember that this factory has been instanced.
+ maLoadedFactories[iFactory->second] = xFactory;
+}
+
+//----- XInitialization -------------------------------------------------------
+
+void SAL_CALL ModuleController::initialize (const Sequence<Any>& aArguments)
+{
+ if (aArguments.hasElements())
+ {
+ try
+ {
+ // Get the XController from the first argument.
+ mxController.set(aArguments[0], UNO_QUERY_THROW);
+
+ InstantiateStartupServices();
+ }
+ catch (RuntimeException&)
+ {}
+ }
+}
+
+} // end of namespace sd::framework
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_framework_module_ModuleController_get_implementation(
+ css::uno::XComponentContext* context,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ css::uno::Reference< css::uno::XInterface > xModCont ( sd::framework::ModuleController::CreateInstance(context) );
+ xModCont->acquire();
+ return xModCont.get();
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/PresentationModule.cxx b/sd/source/ui/framework/module/PresentationModule.cxx
new file mode 100644
index 000000000..fb0ac0558
--- /dev/null
+++ b/sd/source/ui/framework/module/PresentationModule.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/.
+ *
+ * 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 <framework/PresentationModule.hxx>
+
+#include "CenterViewFocusModule.hxx"
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd::framework
+{
+void PresentationModule::Initialize(Reference<frame::XController> const& rxController)
+{
+ new sd::framework::CenterViewFocusModule(rxController);
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/ShellStackGuard.cxx b/sd/source/ui/framework/module/ShellStackGuard.cxx
new file mode 100644
index 000000000..83d73b055
--- /dev/null
+++ b/sd/source/ui/framework/module/ShellStackGuard.cxx
@@ -0,0 +1,150 @@
+/* -*- 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 "ShellStackGuard.hxx"
+
+#include <framework/ConfigurationController.hxx>
+#include <framework/FrameworkHelper.hxx>
+
+#include <DrawController.hxx>
+#include <ViewShellBase.hxx>
+#include <sfx2/printer.hxx>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <comphelper/servicehelper.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+using ::sd::framework::FrameworkHelper;
+
+namespace sd::framework {
+
+//===== CenterViewFocusModule ====================================================
+
+ShellStackGuard::ShellStackGuard (Reference<frame::XController> const & rxController)
+ : mpBase(nullptr),
+ maPrinterPollingIdle("sd ShellStackGuard PrinterPollingIdle")
+{
+ Reference<XControllerManager> xControllerManager (rxController, UNO_QUERY);
+ if (xControllerManager.is())
+ {
+ mxConfigurationController = xControllerManager->getConfigurationController();
+
+ // Tunnel through the controller to obtain a ViewShellBase.
+ auto pController = comphelper::getFromUnoTunnel<sd::DrawController>(rxController);
+ if (pController != nullptr)
+ mpBase = pController->GetViewShellBase();
+ }
+
+ if (mxConfigurationController.is())
+ {
+ // Listen for update starts so that the following update can be
+ // prevented in case of a printing printer.
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msConfigurationUpdateStartEvent,
+ Any());
+
+ // Prepare the printer polling.
+ maPrinterPollingIdle.SetInvokeHandler(LINK(this,ShellStackGuard,TimeoutHandler));
+ }
+}
+
+ShellStackGuard::~ShellStackGuard()
+{
+}
+
+void ShellStackGuard::disposing(std::unique_lock<std::mutex>&)
+{
+ if (mxConfigurationController)
+ {
+ mxConfigurationController->removeConfigurationChangeListener(this);
+ mxConfigurationController = nullptr;
+ }
+ mpBase = nullptr;
+}
+
+void SAL_CALL ShellStackGuard::notifyConfigurationChange (
+ const ConfigurationChangeEvent& rEvent)
+{
+ if (rEvent.Type == FrameworkHelper::msConfigurationUpdateStartEvent)
+ {
+ if (mpUpdateLock == nullptr && IsPrinting())
+ {
+ // Prevent configuration updates while the printer is printing.
+ mpUpdateLock.reset(new ConfigurationController::Lock(mxConfigurationController));
+
+ // Start polling for the printer having finished printing.
+ maPrinterPollingIdle.Start();
+ }
+ }
+}
+
+void SAL_CALL ShellStackGuard::disposing (
+ const lang::EventObject& rEvent)
+{
+ if (mxConfigurationController.is())
+ if (rEvent.Source == mxConfigurationController)
+ {
+ mxConfigurationController = nullptr;
+ mpBase = nullptr;
+ }
+}
+
+IMPL_LINK(ShellStackGuard, TimeoutHandler, Timer*, pIdle, void)
+{
+#ifdef DEBUG
+ OSL_ASSERT(pIdle==&maPrinterPollingIdle);
+#else
+ (void)pIdle;
+#endif
+ if (mpUpdateLock == nullptr)
+ return;
+
+ if ( ! IsPrinting())
+ {
+ // Printing finished. Release the update lock.
+ mpUpdateLock.reset();
+ }
+ else
+ {
+ // Wait long for the printing to finish.
+ maPrinterPollingIdle.Start();
+ }
+}
+
+bool ShellStackGuard::IsPrinting() const
+{
+ if (mpBase != nullptr)
+ {
+ SfxPrinter* pPrinter = mpBase->GetPrinter();
+ if (pPrinter != nullptr
+ && pPrinter->IsPrinting())
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/ShellStackGuard.hxx b/sd/source/ui/framework/module/ShellStackGuard.hxx
new file mode 100644
index 000000000..72b7ed2c6
--- /dev/null
+++ b/sd/source/ui/framework/module/ShellStackGuard.hxx
@@ -0,0 +1,94 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <framework/ConfigurationController.hxx>
+
+#include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp>
+
+#include <vcl/idle.hxx>
+#include <comphelper/compbase.hxx>
+#include <memory>
+
+namespace com::sun::star::drawing::framework
+{
+class XConfigurationController;
+}
+namespace com::sun::star::frame
+{
+class XController;
+}
+
+namespace sd
+{
+class ViewShellBase;
+}
+
+namespace sd::framework
+{
+typedef comphelper::WeakComponentImplHelper<css::drawing::framework::XConfigurationChangeListener>
+ ShellStackGuardInterfaceBase;
+
+/** This module locks updates of the current configuration in situations
+ when the shell stack must not be modified.
+
+ On every start of a configuration update the ShellStackGuard checks the
+ printer. If it is printing the configuration update is locked. It then
+ polls the printer and unlocks updates when printing finishes.
+
+ When in the future there are no resources left that use shells then this
+ module can be removed.
+*/
+class ShellStackGuard : public ShellStackGuardInterfaceBase
+{
+public:
+ explicit ShellStackGuard(css::uno::Reference<css::frame::XController> const& rxController);
+ virtual ~ShellStackGuard() override;
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ // XConfigurationChangeListener
+
+ virtual void SAL_CALL notifyConfigurationChange(
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent) override;
+
+ // XEventListener
+
+ virtual void SAL_CALL disposing(const css::lang::EventObject& rEvent) override;
+
+private:
+ css::uno::Reference<css::drawing::framework::XConfigurationController>
+ mxConfigurationController;
+ ViewShellBase* mpBase;
+ std::unique_ptr<ConfigurationController::Lock> mpUpdateLock;
+ Idle maPrinterPollingIdle;
+
+ DECL_LINK(TimeoutHandler, Timer*, void);
+
+ /** Return <TRUE/> when the printer is printing. Return <FALSE/> when
+ the printer is not printing, or there is no printer, or something
+ else went wrong.
+ */
+ bool IsPrinting() const;
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/SlideSorterModule.cxx b/sd/source/ui/framework/module/SlideSorterModule.cxx
new file mode 100644
index 000000000..dbe30f0d3
--- /dev/null
+++ b/sd/source/ui/framework/module/SlideSorterModule.cxx
@@ -0,0 +1,313 @@
+/* -*- 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 "SlideSorterModule.hxx"
+
+#include <framework/FrameworkHelper.hxx>
+#include <framework/ConfigurationController.hxx>
+#include <com/sun/star/drawing/framework/XTabBar.hpp>
+#include <com/sun/star/drawing/framework/TabBarButton.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/frame/XController.hpp>
+
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <svtools/slidesorterbaropt.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+using ::sd::framework::FrameworkHelper;
+
+namespace {
+ const sal_Int32 ResourceActivationRequestEvent = 0;
+ const sal_Int32 ResourceDeactivationRequestEvent = 1;
+}
+
+namespace sd::framework {
+
+//===== SlideSorterModule ==================================================
+
+SlideSorterModule::SlideSorterModule (
+ const Reference<frame::XController>& rxController,
+ const OUString& rsLeftPaneURL)
+ : mxResourceId(FrameworkHelper::CreateResourceId(FrameworkHelper::msSlideSorterURL, rsLeftPaneURL)),
+ mxMainViewAnchorId(FrameworkHelper::CreateResourceId(FrameworkHelper::msCenterPaneURL)),
+ mxViewTabBarId(FrameworkHelper::CreateResourceId(
+ FrameworkHelper::msViewTabBarURL,
+ FrameworkHelper::msCenterPaneURL)),
+ mxControllerManager(rxController,UNO_QUERY)
+{
+ Reference<XControllerManager> xControllerManager (rxController, UNO_QUERY);
+ if (xControllerManager.is())
+ {
+ mxConfigurationController = xControllerManager->getConfigurationController();
+
+ if (mxConfigurationController.is())
+ {
+ uno::Reference<lang::XComponent> const xComppnent(
+ mxConfigurationController, UNO_QUERY_THROW);
+ xComppnent->addEventListener(this);
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msResourceActivationRequestEvent,
+ Any(ResourceActivationRequestEvent));
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msResourceDeactivationRequestEvent,
+ Any(ResourceDeactivationRequestEvent));
+ }
+ }
+ if (!mxConfigurationController.is())
+ return;
+
+ UpdateViewTabBar(nullptr);
+
+ if (SvtSlideSorterBarOptions().GetVisibleImpressView())
+ AddActiveMainView(FrameworkHelper::msImpressViewURL);
+ if (SvtSlideSorterBarOptions().GetVisibleOutlineView())
+ AddActiveMainView(FrameworkHelper::msOutlineViewURL);
+ if (SvtSlideSorterBarOptions().GetVisibleNotesView())
+ AddActiveMainView(FrameworkHelper::msNotesViewURL);
+ if (SvtSlideSorterBarOptions().GetVisibleHandoutView())
+ AddActiveMainView(FrameworkHelper::msHandoutViewURL);
+ if (SvtSlideSorterBarOptions().GetVisibleSlideSorterView())
+ AddActiveMainView(FrameworkHelper::msSlideSorterURL);
+ if (SvtSlideSorterBarOptions().GetVisibleDrawView())
+ AddActiveMainView(FrameworkHelper::msDrawViewURL);
+
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msResourceActivationEvent,
+ Any());
+}
+
+SlideSorterModule::~SlideSorterModule()
+{
+}
+
+void SlideSorterModule::SaveResourceState()
+{
+ SvtSlideSorterBarOptions().SetVisibleImpressView(IsResourceActive(FrameworkHelper::msImpressViewURL));
+ SvtSlideSorterBarOptions().SetVisibleOutlineView(IsResourceActive(FrameworkHelper::msOutlineViewURL));
+ SvtSlideSorterBarOptions().SetVisibleNotesView(IsResourceActive(FrameworkHelper::msNotesViewURL));
+ SvtSlideSorterBarOptions().SetVisibleHandoutView(IsResourceActive(FrameworkHelper::msHandoutViewURL));
+ SvtSlideSorterBarOptions().SetVisibleSlideSorterView(IsResourceActive(FrameworkHelper::msSlideSorterURL));
+ SvtSlideSorterBarOptions().SetVisibleDrawView(IsResourceActive(FrameworkHelper::msDrawViewURL));
+}
+
+void SAL_CALL SlideSorterModule::notifyConfigurationChange (
+ const ConfigurationChangeEvent& rEvent)
+{
+ if (rEvent.Type == FrameworkHelper::msResourceActivationEvent)
+ {
+ if (rEvent.ResourceId->compareTo(mxViewTabBarId) == 0)
+ {
+ // Update the view tab bar because the view tab bar has just
+ // become active.
+ UpdateViewTabBar(Reference<XTabBar>(rEvent.ResourceObject,UNO_QUERY));
+ }
+ else if (rEvent.ResourceId->getResourceTypePrefix() ==
+ FrameworkHelper::msViewURLPrefix
+ && rEvent.ResourceId->isBoundTo(
+ FrameworkHelper::CreateResourceId(FrameworkHelper::msCenterPaneURL),
+ AnchorBindingMode_DIRECT))
+ {
+ // Update the view tab bar because the view in the center pane
+ // has changed.
+ UpdateViewTabBar(nullptr);
+ }
+ return;
+ }
+
+ OSL_ASSERT(rEvent.ResourceId.is());
+ sal_Int32 nEventType = 0;
+ rEvent.UserData >>= nEventType;
+ switch (nEventType)
+ {
+ case ResourceActivationRequestEvent:
+ if (rEvent.ResourceId->isBoundToURL(
+ FrameworkHelper::msCenterPaneURL,
+ AnchorBindingMode_DIRECT))
+ {
+ // A resource directly bound to the center pane has been
+ // requested.
+ if (rEvent.ResourceId->getResourceTypePrefix() ==
+ FrameworkHelper::msViewURLPrefix)
+ {
+ // The requested resource is a view. Show or hide the
+ // resource managed by this ResourceManager accordingly.
+ HandleMainViewSwitch(
+ rEvent.ResourceId->getResourceURL(),
+ true);
+ }
+ }
+ else if (rEvent.ResourceId->compareTo(mxResourceId) == 0)
+ {
+ // The resource managed by this ResourceManager has been
+ // explicitly been requested (maybe by us). Remember this
+ // setting.
+ HandleResourceRequest(true, rEvent.Configuration);
+ }
+ break;
+
+ case ResourceDeactivationRequestEvent:
+ if (rEvent.ResourceId->compareTo(mxMainViewAnchorId) == 0)
+ {
+ HandleMainViewSwitch(
+ OUString(),
+ false);
+ }
+ else if (rEvent.ResourceId->compareTo(mxResourceId) == 0)
+ {
+ // The resource managed by this ResourceManager has been
+ // explicitly been requested to be hidden (maybe by us).
+ // Remember this setting.
+ HandleResourceRequest(false, rEvent.Configuration);
+ }
+ break;
+ }
+}
+
+void SlideSorterModule::UpdateViewTabBar (const Reference<XTabBar>& rxTabBar)
+{
+ if ( ! mxControllerManager.is())
+ return;
+
+ Reference<XTabBar> xBar (rxTabBar);
+ if ( ! xBar.is())
+ {
+ Reference<XConfigurationController> xCC (
+ mxControllerManager->getConfigurationController());
+ if (xCC.is())
+ xBar.set(xCC->getResource(mxViewTabBarId), UNO_QUERY);
+ }
+
+ if (!xBar.is())
+ return;
+
+ TabBarButton aButtonA;
+ aButtonA.ResourceId = FrameworkHelper::CreateResourceId(
+ FrameworkHelper::msSlideSorterURL,
+ FrameworkHelper::msCenterPaneURL);
+ aButtonA.ButtonLabel = SdResId(STR_SLIDE_SORTER_MODE);
+
+ TabBarButton aButtonB;
+ aButtonB.ResourceId = FrameworkHelper::CreateResourceId(
+ FrameworkHelper::msHandoutViewURL,
+ FrameworkHelper::msCenterPaneURL);
+
+ if ( ! xBar->hasTabBarButton(aButtonA))
+ xBar->addTabBarButtonAfter(aButtonA, aButtonB);
+}
+
+void SlideSorterModule::AddActiveMainView (
+ const OUString& rsMainViewURL)
+{
+ maActiveMainViewContainer.insert(rsMainViewURL);
+}
+
+bool SlideSorterModule::IsResourceActive (
+ const OUString& rsMainViewURL)
+{
+ return (maActiveMainViewContainer.find(rsMainViewURL) != maActiveMainViewContainer.end());
+}
+
+void SlideSorterModule::disposing(std::unique_lock<std::mutex>&)
+{
+ if (mxConfigurationController.is())
+ {
+ uno::Reference<lang::XComponent> const xComponent(mxConfigurationController, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->removeEventListener(this);
+
+ mxConfigurationController->removeConfigurationChangeListener(this);
+ mxConfigurationController = nullptr;
+ }
+}
+
+void SlideSorterModule::HandleMainViewSwitch (
+ const OUString& rsViewURL,
+ const bool bIsActivated)
+{
+ if (bIsActivated)
+ msCurrentMainViewURL = rsViewURL;
+ else
+ msCurrentMainViewURL.clear();
+
+ if (!mxConfigurationController.is())
+ return;
+
+ ConfigurationController::Lock aLock (mxConfigurationController);
+
+ if (maActiveMainViewContainer.find(msCurrentMainViewURL)
+ != maActiveMainViewContainer.end())
+ {
+ // Activate resource.
+ mxConfigurationController->requestResourceActivation(
+ mxResourceId->getAnchor(),
+ ResourceActivationMode_ADD);
+ mxConfigurationController->requestResourceActivation(
+ mxResourceId,
+ ResourceActivationMode_REPLACE);
+ }
+ else
+ {
+ mxConfigurationController->requestResourceDeactivation(mxResourceId);
+ }
+}
+
+void SlideSorterModule::HandleResourceRequest(
+ bool bActivation,
+ const Reference<XConfiguration>& rxConfiguration)
+{
+ Sequence<Reference<XResourceId> > aCenterViews = rxConfiguration->getResources(
+ FrameworkHelper::CreateResourceId(FrameworkHelper::msCenterPaneURL),
+ FrameworkHelper::msViewURLPrefix,
+ AnchorBindingMode_DIRECT);
+ if (aCenterViews.getLength() == 1)
+ {
+ if (bActivation)
+ {
+ maActiveMainViewContainer.insert(aCenterViews[0]->getResourceURL());
+ }
+ else
+ {
+ maActiveMainViewContainer.erase(aCenterViews[0]->getResourceURL());
+ }
+ }
+}
+
+void SAL_CALL SlideSorterModule::disposing (
+ const lang::EventObject& rEvent)
+{
+ if (mxConfigurationController.is()
+ && rEvent.Source == mxConfigurationController)
+ {
+ SaveResourceState();
+ // Without the configuration controller this class can do nothing.
+ mxConfigurationController = nullptr;
+ dispose();
+ }
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/SlideSorterModule.hxx b/sd/source/ui/framework/module/SlideSorterModule.hxx
new file mode 100644
index 000000000..bec9f5c3c
--- /dev/null
+++ b/sd/source/ui/framework/module/SlideSorterModule.hxx
@@ -0,0 +1,97 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp>
+#include <comphelper/compbase.hxx>
+#include <memory>
+#include <set>
+
+namespace com::sun::star::drawing::framework { class XConfigurationController; }
+namespace com::sun::star::drawing::framework { class XControllerManager; }
+namespace com::sun::star::drawing::framework { class XTabBar; }
+namespace com::sun::star::frame { class XController; }
+
+namespace sd::framework {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::framework::XConfigurationChangeListener
+ > SlideSorterModuleBase;
+
+/** This module is responsible for showing the slide sorter bar and the
+ slide sorter view in the center pane.
+
+ Manage the activation state of one resource depending on the view in the
+ center pane. The ResourceManager remembers in which configuration to
+ activate and in which to deactivate the resource. When the resource is
+ deactivated or activated manually by the user then the ResourceManager
+ detects this and remembers it for the future.
+*/
+class SlideSorterModule final
+ : public SlideSorterModuleBase
+{
+public:
+ SlideSorterModule (
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const OUString& rsLeftPaneURL);
+ virtual ~SlideSorterModule() override;
+
+ /** Remember the given URL as one of a center pane view for which to
+ activate the resource managed by the called object.
+ */
+ void AddActiveMainView (const OUString& rsMainViewURL);
+ bool IsResourceActive (const OUString& rsMainViewURL);
+ void SaveResourceState();
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ // XConfigurationChangeListener
+ virtual void SAL_CALL notifyConfigurationChange (
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent) override;
+
+ // XEventListener
+ virtual void SAL_CALL disposing (
+ const css::lang::EventObject& rEvent) override;
+
+private:
+ css::uno::Reference<css::drawing::framework::XConfigurationController>
+ mxConfigurationController;
+ ::std::set<OUString> maActiveMainViewContainer;
+ /// The resource managed by this class.
+ css::uno::Reference<css::drawing::framework::XResourceId> mxResourceId;
+ /// The anchor of the main view.
+ css::uno::Reference<css::drawing::framework::XResourceId> mxMainViewAnchorId;
+ OUString msCurrentMainViewURL;
+ css::uno::Reference<css::drawing::framework::XResourceId> mxViewTabBarId;
+ css::uno::Reference<css::drawing::framework::XControllerManager> mxControllerManager;
+
+ void HandleMainViewSwitch (
+ const OUString& rsViewURL,
+ const bool bIsActivated);
+ void HandleResourceRequest(
+ bool bActivation,
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration);
+ void UpdateViewTabBar (
+ const css::uno::Reference<css::drawing::framework::XTabBar>& rxViewTabBar);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/ToolBarModule.cxx b/sd/source/ui/framework/module/ToolBarModule.cxx
new file mode 100644
index 000000000..3cecf7b03
--- /dev/null
+++ b/sd/source/ui/framework/module/ToolBarModule.cxx
@@ -0,0 +1,191 @@
+/* -*- 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 "ToolBarModule.hxx"
+#include <ViewShellBase.hxx>
+#include <DrawController.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <framework/FrameworkHelper.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+using ::sd::framework::FrameworkHelper;
+
+namespace {
+ const sal_Int32 gnConfigurationUpdateStartEvent(0);
+ const sal_Int32 gnConfigurationUpdateEndEvent(1);
+ const sal_Int32 gnResourceActivationRequestEvent(2);
+ const sal_Int32 gnResourceDeactivationRequestEvent(3);
+}
+
+namespace sd::framework {
+
+//===== ToolBarModule =========================================================
+
+ToolBarModule::ToolBarModule (
+ const Reference<frame::XController>& rxController)
+ : mpBase(nullptr),
+ mbMainViewSwitchUpdatePending(false)
+{
+ // Tunnel through the controller to obtain a ViewShellBase.
+ auto pController = comphelper::getFromUnoTunnel<sd::DrawController>(rxController);
+ if (pController != nullptr)
+ mpBase = pController->GetViewShellBase();
+
+ Reference<XControllerManager> xControllerManager (rxController, UNO_QUERY);
+ if (!xControllerManager.is())
+ return;
+
+ mxConfigurationController = xControllerManager->getConfigurationController();
+ if (!mxConfigurationController.is())
+ return;
+
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msConfigurationUpdateStartEvent,
+ Any(gnConfigurationUpdateStartEvent));
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msConfigurationUpdateEndEvent,
+ Any(gnConfigurationUpdateEndEvent));
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msResourceActivationRequestEvent,
+ Any(gnResourceActivationRequestEvent));
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msResourceDeactivationRequestEvent,
+ Any(gnResourceDeactivationRequestEvent));
+}
+
+ToolBarModule::~ToolBarModule()
+{
+}
+
+void ToolBarModule::disposing(std::unique_lock<std::mutex>&)
+{
+ if (mxConfigurationController.is())
+ {
+ mxConfigurationController->removeConfigurationChangeListener(this);
+ mxConfigurationController = nullptr;
+ }
+}
+
+void SAL_CALL ToolBarModule::notifyConfigurationChange (
+ const ConfigurationChangeEvent& rEvent)
+{
+ if (!mxConfigurationController.is())
+ return;
+
+ sal_Int32 nEventType = 0;
+ rEvent.UserData >>= nEventType;
+ switch (nEventType)
+ {
+ case gnConfigurationUpdateStartEvent:
+ HandleUpdateStart();
+ break;
+
+ case gnConfigurationUpdateEndEvent:
+ HandleUpdateEnd();
+ break;
+
+ case gnResourceActivationRequestEvent:
+ case gnResourceDeactivationRequestEvent:
+ // Remember the request for the activation or deactivation
+ // of the center pane view. When that happens then on end
+ // of the next configuration update the set of visible tool
+ // bars will be updated.
+ if ( ! mbMainViewSwitchUpdatePending)
+ if (rEvent.ResourceId->getResourceURL().match(
+ FrameworkHelper::msViewURLPrefix)
+ && rEvent.ResourceId->isBoundToURL(
+ FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
+ {
+ mbMainViewSwitchUpdatePending = true;
+ }
+ break;
+ }
+}
+
+void ToolBarModule::HandleUpdateStart()
+{
+ // Lock the ToolBarManager and tell it to lock the ViewShellManager as
+ // well. This way the ToolBarManager can optimize the releasing of
+ // locks and arranging of updates of both tool bars and the view shell
+ // stack.
+ if (mpBase != nullptr)
+ {
+ std::shared_ptr<ToolBarManager> pToolBarManager (mpBase->GetToolBarManager());
+ mpToolBarManagerLock.reset(new ToolBarManager::UpdateLock(pToolBarManager));
+ pToolBarManager->LockViewShellManager();
+ }
+}
+
+void ToolBarModule::HandleUpdateEnd()
+{
+ if (mbMainViewSwitchUpdatePending)
+ {
+ mbMainViewSwitchUpdatePending = false;
+ // Update the set of visible tool bars and deactivate those that are
+ // no longer visible. This is done before the old view shell is
+ // destroyed in order to avoid unnecessary updates of those tool
+ // bars.
+ std::shared_ptr<ToolBarManager> pToolBarManager (mpBase->GetToolBarManager());
+ std::shared_ptr<FrameworkHelper> pFrameworkHelper (
+ FrameworkHelper::Instance(*mpBase));
+ ViewShell* pViewShell
+ = pFrameworkHelper->GetViewShell(FrameworkHelper::msCenterPaneURL).get();
+ if (pViewShell != nullptr)
+ {
+ pToolBarManager->MainViewShellChanged(*pViewShell);
+ pToolBarManager->SelectionHasChanged(
+ *pViewShell,
+ *pViewShell->GetView());
+ pToolBarManager->PreUpdate();
+ }
+ else
+ {
+ pToolBarManager->MainViewShellChanged();
+ pToolBarManager->PreUpdate();
+ }
+ }
+
+ // Releasing the update lock of the ToolBarManager will let the
+ // ToolBarManager with the help of the ViewShellManager take care of
+ // updating tool bars and view shell with the minimal amount of
+ // shell stack modifications and tool bar updates.
+ mpToolBarManagerLock.reset();
+}
+
+void SAL_CALL ToolBarModule::disposing (const lang::EventObject& rEvent)
+{
+ if (mxConfigurationController.is()
+ && rEvent.Source == mxConfigurationController)
+ {
+ // Without the configuration controller this class can do nothing.
+ mxConfigurationController = nullptr;
+ dispose();
+ }
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/ToolBarModule.hxx b/sd/source/ui/framework/module/ToolBarModule.hxx
new file mode 100644
index 000000000..f9189657d
--- /dev/null
+++ b/sd/source/ui/framework/module/ToolBarModule.hxx
@@ -0,0 +1,81 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <ToolBarManager.hxx>
+#include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp>
+#include <comphelper/compbase.hxx>
+#include <o3tl/deleter.hxx>
+#include <memory>
+
+namespace com::sun::star::drawing::framework { class XConfigurationController; }
+namespace com::sun::star::frame { class XController; }
+
+namespace sd {
+class ViewShellBase;
+}
+
+namespace sd::framework {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::framework::XConfigurationChangeListener
+ > ToolBarModuleInterfaceBase;
+
+/** This module is responsible for locking the ToolBarManager during
+ configuration updates and for triggering ToolBarManager updates.
+*/
+class ToolBarModule final
+ : public ToolBarModuleInterfaceBase
+{
+public:
+ /** Create a new module.
+ @param rxController
+ This is the access point to the drawing framework.
+ */
+ explicit ToolBarModule (
+ const css::uno::Reference<css::frame::XController>& rxController);
+ virtual ~ToolBarModule() override;
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ // XConfigurationChangeListener
+
+ virtual void SAL_CALL notifyConfigurationChange (
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent) override;
+
+ // XEventListener
+
+ virtual void SAL_CALL disposing (
+ const css::lang::EventObject& rEvent) override;
+
+private:
+ css::uno::Reference<
+ css::drawing::framework::XConfigurationController> mxConfigurationController;
+ ViewShellBase* mpBase;
+ std::unique_ptr<ToolBarManager::UpdateLock, o3tl::default_delete<ToolBarManager::UpdateLock>> mpToolBarManagerLock;
+ bool mbMainViewSwitchUpdatePending;
+
+ void HandleUpdateStart();
+ void HandleUpdateEnd();
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/ViewTabBarModule.cxx b/sd/source/ui/framework/module/ViewTabBarModule.cxx
new file mode 100644
index 000000000..4f5dd4828
--- /dev/null
+++ b/sd/source/ui/framework/module/ViewTabBarModule.cxx
@@ -0,0 +1,180 @@
+/* -*- 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 "ViewTabBarModule.hxx"
+
+#include <framework/FrameworkHelper.hxx>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/XTabBar.hpp>
+#include <com/sun/star/frame/XController.hpp>
+
+#include <strings.hrc>
+#include <sdresid.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+using ::sd::framework::FrameworkHelper;
+
+namespace {
+
+const sal_Int32 ResourceActivationRequestEvent = 0;
+const sal_Int32 ResourceDeactivationRequestEvent = 1;
+const sal_Int32 ResourceActivationEvent = 2;
+
+}
+
+namespace sd::framework {
+
+//===== ViewTabBarModule ==================================================
+
+ViewTabBarModule::ViewTabBarModule (
+ const Reference<frame::XController>& rxController,
+ const Reference<XResourceId>& rxViewTabBarId)
+ : mxViewTabBarId(rxViewTabBarId)
+{
+ Reference<XControllerManager> xControllerManager (rxController, UNO_QUERY);
+
+ if (!xControllerManager.is())
+ return;
+
+ mxConfigurationController = xControllerManager->getConfigurationController();
+ if (!mxConfigurationController.is())
+ return;
+
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msResourceActivationRequestEvent,
+ Any(ResourceActivationRequestEvent));
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msResourceDeactivationRequestEvent,
+ Any(ResourceDeactivationRequestEvent));
+
+ UpdateViewTabBar(nullptr);
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msResourceActivationEvent,
+ Any(ResourceActivationEvent));
+}
+
+ViewTabBarModule::~ViewTabBarModule()
+{
+}
+
+void ViewTabBarModule::disposing(std::unique_lock<std::mutex>&)
+{
+ if (mxConfigurationController.is())
+ {
+ mxConfigurationController->removeConfigurationChangeListener(this);
+ mxConfigurationController = nullptr;
+ }
+}
+
+void SAL_CALL ViewTabBarModule::notifyConfigurationChange (
+ const ConfigurationChangeEvent& rEvent)
+{
+ if (!mxConfigurationController.is())
+ return;
+
+ sal_Int32 nEventType = 0;
+ rEvent.UserData >>= nEventType;
+ switch (nEventType)
+ {
+ case ResourceActivationRequestEvent:
+ if (mxViewTabBarId->isBoundTo(rEvent.ResourceId, AnchorBindingMode_DIRECT))
+ {
+ mxConfigurationController->requestResourceActivation(
+ mxViewTabBarId,
+ ResourceActivationMode_ADD);
+ }
+ break;
+
+ case ResourceDeactivationRequestEvent:
+ if (mxViewTabBarId->isBoundTo(rEvent.ResourceId, AnchorBindingMode_DIRECT))
+ {
+ mxConfigurationController->requestResourceDeactivation(mxViewTabBarId);
+ }
+ break;
+
+ case ResourceActivationEvent:
+ if (rEvent.ResourceId->compareTo(mxViewTabBarId) == 0)
+ {
+ UpdateViewTabBar(Reference<XTabBar>(rEvent.ResourceObject,UNO_QUERY));
+ }
+ }
+}
+
+void SAL_CALL ViewTabBarModule::disposing (
+ const lang::EventObject& rEvent)
+{
+ if (mxConfigurationController.is()
+ && rEvent.Source == mxConfigurationController)
+ {
+ // Without the configuration controller this class can do nothing.
+ mxConfigurationController = nullptr;
+ dispose();
+ }
+}
+
+void ViewTabBarModule::UpdateViewTabBar (const Reference<XTabBar>& rxTabBar)
+{
+ if (!mxConfigurationController.is())
+ return;
+
+ Reference<XTabBar> xBar (rxTabBar);
+ if ( ! xBar.is())
+ xBar.set( mxConfigurationController->getResource(mxViewTabBarId), UNO_QUERY);
+
+ if (!xBar.is())
+ return;
+
+ TabBarButton aEmptyButton;
+
+ Reference<XResourceId> xAnchor (mxViewTabBarId->getAnchor());
+
+ TabBarButton aImpressViewButton;
+ aImpressViewButton.ResourceId = FrameworkHelper::CreateResourceId(
+ FrameworkHelper::msImpressViewURL,
+ xAnchor);
+ aImpressViewButton.ButtonLabel = SdResId(STR_NORMAL_MODE);
+ if ( ! xBar->hasTabBarButton(aImpressViewButton))
+ xBar->addTabBarButtonAfter(aImpressViewButton, aEmptyButton);
+
+ TabBarButton aOutlineViewButton;
+ aOutlineViewButton.ResourceId = FrameworkHelper::CreateResourceId(
+ FrameworkHelper::msOutlineViewURL,
+ xAnchor);
+ aOutlineViewButton.ButtonLabel = SdResId(STR_OUTLINE_MODE);
+ if ( ! xBar->hasTabBarButton(aOutlineViewButton))
+ xBar->addTabBarButtonAfter(aOutlineViewButton, aImpressViewButton);
+
+ TabBarButton aNotesViewButton;
+ aNotesViewButton.ResourceId = FrameworkHelper::CreateResourceId(
+ FrameworkHelper::msNotesViewURL,
+ xAnchor);
+ aNotesViewButton.ButtonLabel = SdResId(STR_NOTES_MODE);
+ if ( ! xBar->hasTabBarButton(aNotesViewButton))
+ xBar->addTabBarButtonAfter(aNotesViewButton, aOutlineViewButton);
+}
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/module/ViewTabBarModule.hxx b/sd/source/ui/framework/module/ViewTabBarModule.hxx
new file mode 100644
index 000000000..bfb252b8d
--- /dev/null
+++ b/sd/source/ui/framework/module/ViewTabBarModule.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp>
+#include <comphelper/compbase.hxx>
+
+namespace com::sun::star::drawing::framework { class XConfigurationController; }
+namespace com::sun::star::drawing::framework { class XTabBar; }
+namespace com::sun::star::frame { class XController; }
+
+namespace sd::framework {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::framework::XConfigurationChangeListener
+ > ViewTabBarModuleInterfaceBase;
+
+/** This module is responsible for showing the ViewTabBar above the view in
+ the center pane.
+*/
+class ViewTabBarModule
+ : public ViewTabBarModuleInterfaceBase
+{
+public:
+ /** Create a new module that controls the view tab bar above the view
+ in the specified pane.
+ @param rxController
+ This is the access point to the drawing framework.
+ @param rxViewTabBarId
+ This ResourceId specifies which tab bar is to be managed by the
+ new module.
+ */
+ ViewTabBarModule (
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const css::uno::Reference<
+ css::drawing::framework::XResourceId>& rxViewTabBarId);
+ virtual ~ViewTabBarModule() override;
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ // XConfigurationChangeListener
+
+ virtual void SAL_CALL notifyConfigurationChange (
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent) override;
+
+ // XEventListener
+
+ virtual void SAL_CALL disposing (
+ const css::lang::EventObject& rEvent) override;
+
+private:
+ css::uno::Reference<
+ css::drawing::framework::XConfigurationController> mxConfigurationController;
+ css::uno::Reference<css::drawing::framework::XResourceId> mxViewTabBarId;
+
+ /** This is the place where the view tab bar is filled. Only missing
+ buttons are added, so it is safe to call this method multiple
+ times.
+ */
+ void UpdateViewTabBar (
+ const css::uno::Reference<css::drawing::framework::XTabBar>& rxTabBar);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/framework/tools/FrameworkHelper.cxx b/sd/source/ui/framework/tools/FrameworkHelper.cxx
new file mode 100644
index 000000000..dceecd510
--- /dev/null
+++ b/sd/source/ui/framework/tools/FrameworkHelper.cxx
@@ -0,0 +1,952 @@
+/* -*- 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 <osl/time.h>
+
+#include <framework/FrameworkHelper.hxx>
+
+#include <framework/ConfigurationController.hxx>
+#include <framework/ResourceId.hxx>
+#include <framework/ViewShellWrapper.hxx>
+#include <ViewShellBase.hxx>
+#include <DrawViewShell.hxx>
+#include <ViewShellHint.hxx>
+#include <app.hrc>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <comphelper/servicehelper.hxx>
+#include <comphelper/compbase.hxx>
+#include <svl/lstner.hxx>
+#include <rtl/ustrbuf.hxx>
+
+#include <sfx2/request.hxx>
+
+#include <vcl/svapp.hxx>
+#include <osl/doublecheckedlocking.h>
+#include <osl/getglobalmutex.hxx>
+#include <tools/diagnose_ex.h>
+#include <memory>
+#include <unordered_map>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace {
+
+//----- CallbackCaller --------------------------------------------------------
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::framework::XConfigurationChangeListener
+ > CallbackCallerInterfaceBase;
+
+/** A CallbackCaller registers as listener at an XConfigurationController
+ object and waits for the notification of one type of event. When that
+ event is received, or when the CallbackCaller detects at its
+ construction that the event will not be sent in the near future, the
+ actual callback object is called and the CallbackCaller destroys itself.
+*/
+class CallbackCaller
+ : public CallbackCallerInterfaceBase
+{
+public:
+ /** Create a new CallbackCaller object. This object controls its own
+ lifetime by acquiring a reference to itself in the constructor.
+ When it detects that the event will not be notified in the near
+ future (because the queue of pending configuration change operations
+ is empty and therefore no event will be sent int the near future, it
+ does not acquires a reference and thus initiates its destruction in
+ the constructor.)
+ @param rBase
+ This ViewShellBase object is used to determine the
+ XConfigurationController at which to register.
+ @param rsEventType
+ The event type which the callback is waiting for.
+ @param pCallback
+ The callback object which is to be notified. The caller will
+ typically release his reference to the caller so that when the
+ CallbackCaller dies (after having called the callback) the
+ callback is destroyed.
+ */
+ CallbackCaller (
+ const ::sd::ViewShellBase& rBase,
+ const OUString& rsEventType,
+ const ::sd::framework::FrameworkHelper::ConfigurationChangeEventFilter& rFilter,
+ const ::sd::framework::FrameworkHelper::Callback& rCallback);
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+ // XEventListener
+ virtual void SAL_CALL disposing (const lang::EventObject& rEvent) override;
+ // XConfigurationChangeListener
+ virtual void SAL_CALL notifyConfigurationChange (const ConfigurationChangeEvent& rEvent) override;
+
+private:
+ OUString msEventType;
+ Reference<XConfigurationController> mxConfigurationController;
+ ::sd::framework::FrameworkHelper::ConfigurationChangeEventFilter maFilter;
+ ::sd::framework::FrameworkHelper::Callback maCallback;
+};
+
+//----- LifetimeController ----------------------------------------------------
+
+typedef comphelper::WeakComponentImplHelper <
+ css::lang::XEventListener
+ > LifetimeControllerInterfaceBase;
+
+/** This class helps controlling the lifetime of the
+ FrameworkHelper. Register at a ViewShellBase object and an XController
+ object and call Dispose() at the associated FrameworkHelper object when
+ one of them and Release() when both of them are destroyed.
+*/
+class LifetimeController
+ : public LifetimeControllerInterfaceBase,
+ public SfxListener
+{
+public:
+ explicit LifetimeController (::sd::ViewShellBase& rBase);
+ virtual ~LifetimeController() override;
+
+ /** XEventListener. This method is called when the frame::XController
+ is being destroyed.
+ */
+ using WeakComponentImplHelperBase::disposing;
+ virtual void SAL_CALL disposing (const lang::EventObject& rEvent) override;
+
+ /** This method is called when the ViewShellBase is being destroyed.
+ */
+ virtual void Notify (SfxBroadcaster& rBroadcaster, const SfxHint& rHint) override;
+
+private:
+ ::sd::ViewShellBase& mrBase;
+ bool mbListeningToViewShellBase;
+ bool mbListeningToController;
+
+ /** When one or both of the mbListeningToViewShellBase and
+ mbListeningToController members were modified then call this method
+ to either dispose or release the associated FrameworkHelper.
+ */
+ void Update();
+};
+
+} // end of anonymous namespace
+
+namespace sd::framework {
+
+namespace {
+
+ class FrameworkHelperAllPassFilter
+ {
+ public:
+ bool operator() (const css::drawing::framework::ConfigurationChangeEvent&) { return true; }
+ };
+
+ class FrameworkHelperResourceIdFilter
+ {
+ public:
+ explicit FrameworkHelperResourceIdFilter (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId);
+ bool operator() (const css::drawing::framework::ConfigurationChangeEvent& rEvent)
+ { return mxResourceId.is() && rEvent.ResourceId.is()
+ && mxResourceId->compareTo(rEvent.ResourceId) == 0; }
+ private:
+ css::uno::Reference<css::drawing::framework::XResourceId> mxResourceId;
+ };
+
+} // end of anonymous namespace
+
+// Pane URLS.
+
+const OUString FrameworkHelper::msCenterPaneURL( msPaneURLPrefix + "CenterPane");
+const OUString FrameworkHelper::msFullScreenPaneURL( msPaneURLPrefix + "FullScreenPane");
+const OUString FrameworkHelper::msLeftImpressPaneURL( msPaneURLPrefix + "LeftImpressPane");
+const OUString FrameworkHelper::msLeftDrawPaneURL( msPaneURLPrefix + "LeftDrawPane");
+
+// View URLs.
+
+const OUString FrameworkHelper::msImpressViewURL( msViewURLPrefix + "ImpressView");
+const OUString FrameworkHelper::msDrawViewURL( msViewURLPrefix + "GraphicView");
+const OUString FrameworkHelper::msOutlineViewURL( msViewURLPrefix + "OutlineView");
+const OUString FrameworkHelper::msNotesViewURL( msViewURLPrefix + "NotesView");
+const OUString FrameworkHelper::msHandoutViewURL( msViewURLPrefix + "HandoutView");
+const OUString FrameworkHelper::msSlideSorterURL( msViewURLPrefix + "SlideSorter");
+const OUString FrameworkHelper::msPresentationViewURL( msViewURLPrefix + "PresentationView");
+const OUString FrameworkHelper::msSidebarViewURL( msViewURLPrefix + "SidebarView");
+
+// Tool bar URLs.
+
+const OUString FrameworkHelper::msViewTabBarURL( msToolBarURLPrefix + "ViewTabBar");
+
+//----- helper ----------------------------------------------------------------
+namespace
+{
+ ::std::shared_ptr< ViewShell > lcl_getViewShell( const Reference< XResource >& i_rViewShellWrapper )
+ {
+ ::std::shared_ptr< ViewShell > pViewShell;
+ try
+ {
+ Reference<lang::XUnoTunnel> xViewTunnel( i_rViewShellWrapper, UNO_QUERY_THROW );
+ if (auto pWrapper = comphelper::getFromUnoTunnel<ViewShellWrapper>(xViewTunnel))
+ pViewShell = pWrapper->GetViewShell();
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+ return pViewShell;
+ }
+ Reference< XResource > lcl_getFirstViewInPane( const Reference< XConfigurationController >& i_rConfigController,
+ const Reference< XResourceId >& i_rPaneId )
+ {
+ try
+ {
+ Reference< XConfiguration > xConfiguration( i_rConfigController->getRequestedConfiguration(), UNO_SET_THROW );
+ Sequence< Reference< XResourceId > > aViewIds( xConfiguration->getResources(
+ i_rPaneId, FrameworkHelper::msViewURLPrefix, AnchorBindingMode_DIRECT ) );
+ if ( aViewIds.hasElements() )
+ return i_rConfigController->getResource( aViewIds[0] );
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+ return nullptr;
+ }
+}
+
+//----- FrameworkHelper::ViewURLMap -------------------------------------------
+
+/** The ViewURLMap is used to translate between the view URLs used by the
+ drawing framework and the enums defined in the ViewShell class.
+*/
+class FrameworkHelper::ViewURLMap
+ : public std::unordered_map<
+ OUString,
+ ViewShell::ShellType>
+{
+public:
+ ViewURLMap() {}
+};
+
+//----- Framework::DisposeListener ---------------------------------------------
+
+namespace {
+ typedef comphelper::WeakComponentImplHelper <
+ css::lang::XEventListener
+ > FrameworkHelperDisposeListenerInterfaceBase;
+}
+
+class FrameworkHelper::DisposeListener
+ : public FrameworkHelperDisposeListenerInterfaceBase
+{
+public:
+ explicit DisposeListener (const ::std::shared_ptr<FrameworkHelper>& rpHelper);
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ virtual void SAL_CALL disposing (const lang::EventObject& rEventObject) override;
+
+private:
+ ::std::shared_ptr<FrameworkHelper> mpHelper;
+};
+
+//----- FrameworkHelper::Deleter ----------------------------------------------
+
+class FrameworkHelper::Deleter
+{
+public:
+ void operator()(FrameworkHelper* pObject)
+ {
+ delete pObject;
+ }
+};
+
+//----- FrameworkHelper -------------------------------------------------------
+
+FrameworkHelper::ViewURLMap FrameworkHelper::maViewURLMap;
+
+FrameworkHelper::InstanceMap FrameworkHelper::maInstanceMap;
+
+::std::shared_ptr<FrameworkHelper> FrameworkHelper::Instance (ViewShellBase& rBase)
+{
+
+ ::std::shared_ptr<FrameworkHelper> pHelper;
+
+ InstanceMap::const_iterator iHelper (maInstanceMap.find(&rBase));
+ if (iHelper == maInstanceMap.end())
+ {
+ ::osl::GetGlobalMutex aMutexFunctor;
+ ::osl::MutexGuard aGuard (aMutexFunctor());
+ if (iHelper == maInstanceMap.end())
+ {
+ pHelper = ::std::shared_ptr<FrameworkHelper>(
+ new FrameworkHelper(rBase),
+ FrameworkHelper::Deleter());
+ pHelper->Initialize();
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ maInstanceMap[&rBase] = pHelper;
+ }
+ }
+ else
+ {
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ pHelper = iHelper->second;
+ }
+
+ return pHelper;
+}
+
+void FrameworkHelper::DisposeInstance (const ViewShellBase& rBase)
+{
+ InstanceMap::iterator iHelper (maInstanceMap.find(&rBase));
+ if (iHelper != maInstanceMap.end())
+ {
+ iHelper->second->Dispose();
+ }
+}
+
+void FrameworkHelper::ReleaseInstance (const ViewShellBase& rBase)
+{
+ InstanceMap::iterator iHelper (maInstanceMap.find(&rBase));
+ if (iHelper != maInstanceMap.end())
+ maInstanceMap.erase(iHelper);
+}
+
+FrameworkHelper::FrameworkHelper (ViewShellBase& rBase)
+ : mrBase(rBase)
+{
+ Reference<XControllerManager> xControllerManager (rBase.GetController(), UNO_QUERY);
+ if (xControllerManager.is())
+ {
+ mxConfigurationController = xControllerManager->getConfigurationController();
+ }
+
+ new LifetimeController(mrBase);
+}
+
+void FrameworkHelper::Initialize()
+{
+ mxDisposeListener = new DisposeListener(shared_from_this());
+}
+
+FrameworkHelper::~FrameworkHelper()
+{
+}
+
+void FrameworkHelper::Dispose()
+{
+ if (mxDisposeListener.is())
+ mxDisposeListener->dispose();
+ mxConfigurationController = nullptr;
+}
+
+bool FrameworkHelper::IsValid() const
+{
+ return mxConfigurationController.is();
+}
+
+::std::shared_ptr<ViewShell> FrameworkHelper::GetViewShell (const OUString& rsPaneURL)
+{
+ if ( !mxConfigurationController.is() )
+ return ::std::shared_ptr<ViewShell>();
+
+ Reference<XResourceId> xPaneId( CreateResourceId( rsPaneURL ) );
+ return lcl_getViewShell( lcl_getFirstViewInPane( mxConfigurationController, xPaneId ) );
+}
+
+::std::shared_ptr<ViewShell> FrameworkHelper::GetViewShell (const Reference<XView>& rxView)
+{
+ return lcl_getViewShell( rxView );
+}
+
+Reference<XView> FrameworkHelper::GetView (const Reference<XResourceId>& rxPaneOrViewId)
+{
+ Reference<XView> xView;
+
+ if ( ! rxPaneOrViewId.is() || ! mxConfigurationController.is())
+ return nullptr;
+
+ try
+ {
+ if (rxPaneOrViewId->getResourceURL().match(msViewURLPrefix))
+ {
+ xView.set( mxConfigurationController->getResource( rxPaneOrViewId ), UNO_QUERY );
+ }
+ else
+ {
+ xView.set( lcl_getFirstViewInPane( mxConfigurationController, rxPaneOrViewId ), UNO_QUERY );
+ }
+ }
+ catch (lang::DisposedException&)
+ {
+ Dispose();
+ }
+ catch (RuntimeException&)
+ {
+ }
+
+ return xView;
+}
+
+Reference<XResourceId> FrameworkHelper::RequestView (
+ const OUString& rsResourceURL,
+ const OUString& rsAnchorURL)
+{
+ Reference<XResourceId> xViewId;
+
+ try
+ {
+ if (mxConfigurationController.is())
+ {
+ mxConfigurationController->requestResourceActivation(
+ CreateResourceId(rsAnchorURL),
+ ResourceActivationMode_ADD);
+ xViewId = CreateResourceId(rsResourceURL, rsAnchorURL);
+ mxConfigurationController->requestResourceActivation(
+ xViewId,
+ ResourceActivationMode_REPLACE);
+ }
+ }
+ catch (lang::DisposedException&)
+ {
+ Dispose();
+ xViewId = nullptr;
+ }
+ catch (RuntimeException&)
+ {
+ xViewId = nullptr;
+ }
+
+ return xViewId;
+}
+
+ViewShell::ShellType FrameworkHelper::GetViewId (const OUString& rsViewURL)
+{
+ if (maViewURLMap.empty())
+ {
+ maViewURLMap[msImpressViewURL] = ViewShell::ST_IMPRESS;
+ maViewURLMap[msDrawViewURL] = ViewShell::ST_DRAW;
+ maViewURLMap[msOutlineViewURL] = ViewShell::ST_OUTLINE;
+ maViewURLMap[msNotesViewURL] = ViewShell::ST_NOTES;
+ maViewURLMap[msHandoutViewURL] = ViewShell::ST_HANDOUT;
+ maViewURLMap[msSlideSorterURL] = ViewShell::ST_SLIDE_SORTER;
+ maViewURLMap[msPresentationViewURL] = ViewShell::ST_PRESENTATION;
+ maViewURLMap[msSidebarViewURL] = ViewShell::ST_SIDEBAR;
+ }
+ ViewURLMap::const_iterator iView (maViewURLMap.find(rsViewURL));
+ if (iView != maViewURLMap.end())
+ return iView->second;
+ else
+ return ViewShell::ST_NONE;
+}
+
+OUString FrameworkHelper::GetViewURL (ViewShell::ShellType eType)
+{
+ switch (eType)
+ {
+ case ViewShell::ST_IMPRESS : return msImpressViewURL;
+ case ViewShell::ST_DRAW : return msDrawViewURL;
+ case ViewShell::ST_OUTLINE : return msOutlineViewURL;
+ case ViewShell::ST_NOTES : return msNotesViewURL;
+ case ViewShell::ST_HANDOUT : return msHandoutViewURL;
+ case ViewShell::ST_SLIDE_SORTER : return msSlideSorterURL;
+ case ViewShell::ST_PRESENTATION : return msPresentationViewURL;
+ case ViewShell::ST_SIDEBAR : return msSidebarViewURL;
+ default:
+ return OUString();
+ }
+}
+
+namespace
+{
+
+void updateEditMode(const Reference<XView> &xView, const EditMode eEMode, bool updateFrameView)
+{
+ // Ensure we have the expected edit mode
+ // The check is only for DrawViewShell as OutlineViewShell
+ // and SlideSorterViewShell have no master mode
+ const ::std::shared_ptr<ViewShell> pCenterViewShell (FrameworkHelper::GetViewShell(xView));
+ DrawViewShell* pDrawViewShell
+ = dynamic_cast<DrawViewShell*>(pCenterViewShell.get());
+ if (pDrawViewShell != nullptr)
+ {
+ pCenterViewShell->Broadcast (
+ ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START));
+
+ pDrawViewShell->ChangeEditMode(eEMode, pDrawViewShell->IsLayerModeActive());
+ if (updateFrameView)
+ pDrawViewShell->WriteFrameViewData();
+
+ pCenterViewShell->Broadcast (
+ ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END));
+ }
+}
+
+void asyncUpdateEditMode(FrameworkHelper* const pHelper, const EditMode eEMode)
+{
+ Reference<XResourceId> xPaneId (
+ FrameworkHelper::CreateResourceId(framework::FrameworkHelper::msCenterPaneURL));
+ Reference<XView> xView (pHelper->GetView(xPaneId));
+ updateEditMode(xView, eEMode, true);
+}
+
+}
+
+void FrameworkHelper::HandleModeChangeSlot (
+ sal_uInt16 nSlotId,
+ SfxRequest const & rRequest)
+{
+ if ( ! mxConfigurationController.is())
+ return;
+
+ // Parameters are allowed for NotesMasterPage and SlideMasterPage
+ // for these command, transfor xxxxMasterPage with param = false
+ // to ActivatexxxxxMode
+ if (nSlotId == SID_NOTES_MASTER_MODE || nSlotId == SID_SLIDE_MASTER_MODE)
+ {
+ const SfxItemSet* pRequestArguments = rRequest.GetArgs();
+ if (pRequestArguments)
+ {
+ const SfxBoolItem* pIsActive = rRequest.GetArg<SfxBoolItem>(nSlotId);
+ if (!pIsActive->GetValue ())
+ {
+ if (nSlotId == SID_NOTES_MASTER_MODE)
+ nSlotId = SID_NOTES_MODE;
+ else
+ nSlotId = SID_NORMAL_MULTI_PANE_GUI;
+ }
+ }
+ }
+
+ try
+ {
+ if ( ! mxConfigurationController.is())
+ throw RuntimeException();
+
+ Reference<XResourceId> xPaneId (
+ CreateResourceId(framework::FrameworkHelper::msCenterPaneURL));
+ Reference<XView> xView (GetView(xPaneId));
+
+ // Compute requested view
+ OUString sRequestedView;
+ switch (nSlotId)
+ {
+ // draw
+ case SID_DRAWINGMODE:
+ // impress
+ case SID_NORMAL_MULTI_PANE_GUI:
+ case SID_SLIDE_MASTER_MODE:
+ sRequestedView = FrameworkHelper::msImpressViewURL;
+ break;
+
+ case SID_NOTES_MODE:
+ case SID_NOTES_MASTER_MODE:
+ sRequestedView = FrameworkHelper::msNotesViewURL;
+ break;
+
+ case SID_HANDOUT_MASTER_MODE:
+ sRequestedView = FrameworkHelper::msHandoutViewURL;
+ break;
+
+ case SID_SLIDE_SORTER_MULTI_PANE_GUI:
+ case SID_SLIDE_SORTER_MODE:
+ sRequestedView = FrameworkHelper::msSlideSorterURL;
+ break;
+
+ case SID_OUTLINE_MODE:
+ sRequestedView = FrameworkHelper::msOutlineViewURL;
+ break;
+ }
+
+ // Compute requested mode
+ EditMode eEMode = EditMode::Page;
+ if (nSlotId == SID_SLIDE_MASTER_MODE
+ || nSlotId == SID_NOTES_MASTER_MODE
+ || nSlotId == SID_HANDOUT_MASTER_MODE)
+ eEMode = EditMode::MasterPage;
+ // Ensure we have the expected view shell
+ if (!(xView.is() && xView->getResourceId()->getResourceURL() == sRequestedView))
+
+ {
+ const auto xId = CreateResourceId(sRequestedView, msCenterPaneURL);
+ mxConfigurationController->requestResourceActivation(
+ xId,
+ ResourceActivationMode_REPLACE);
+ RunOnResourceActivation(xId, std::bind(&asyncUpdateEditMode, this, eEMode));
+ }
+ else
+ {
+ updateEditMode(xView, eEMode, false);
+ }
+ }
+ catch (RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+}
+
+void FrameworkHelper::RunOnConfigurationEvent(
+ const OUString& rsEventType,
+ const Callback& rCallback)
+{
+ RunOnEvent(
+ rsEventType,
+ FrameworkHelperAllPassFilter(),
+ rCallback);
+}
+
+void FrameworkHelper::RunOnResourceActivation(
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId,
+ const Callback& rCallback)
+{
+ if (mxConfigurationController.is()
+ && mxConfigurationController->getResource(rxResourceId).is())
+ {
+ rCallback(false);
+ }
+ else
+ {
+ RunOnEvent(
+ msResourceActivationEvent,
+ FrameworkHelperResourceIdFilter(rxResourceId),
+ rCallback);
+ }
+}
+
+namespace {
+
+/** A callback that sets a flag to a specified value when the callback is
+ called.
+*/
+class FlagUpdater
+{
+public:
+ explicit FlagUpdater (bool& rFlag) : mrFlag(rFlag) {}
+ void operator() (bool) const {mrFlag = true;}
+private:
+ bool& mrFlag;
+};
+
+}
+
+void FrameworkHelper::RequestSynchronousUpdate()
+{
+ rtl::Reference<ConfigurationController> pCC (
+ dynamic_cast<ConfigurationController*>(mxConfigurationController.get()));
+ if (pCC.is())
+ pCC->RequestSynchronousUpdate();
+}
+
+void FrameworkHelper::WaitForEvent (const OUString& rsEventType) const
+{
+ bool bConfigurationUpdateSeen (false);
+
+ RunOnEvent(
+ rsEventType,
+ FrameworkHelperAllPassFilter(),
+ FlagUpdater(bConfigurationUpdateSeen));
+
+ sal_uInt32 nStartTime = osl_getGlobalTimer();
+ while ( ! bConfigurationUpdateSeen)
+ {
+ Application::Reschedule();
+
+ if( (osl_getGlobalTimer() - nStartTime) > 60000 )
+ {
+ OSL_FAIL("FrameworkHelper::WaitForEvent(), no event for a minute? giving up!");
+ break;
+ }
+ }
+}
+
+void FrameworkHelper::WaitForUpdate() const
+{
+ WaitForEvent(msConfigurationUpdateEndEvent);
+}
+
+void FrameworkHelper::RunOnEvent(
+ const OUString& rsEventType,
+ const ConfigurationChangeEventFilter& rFilter,
+ const Callback& rCallback) const
+{
+ new CallbackCaller(mrBase,rsEventType,rFilter,rCallback);
+}
+
+void FrameworkHelper::disposing (const lang::EventObject& rEventObject)
+{
+ if (rEventObject.Source == mxConfigurationController)
+ mxConfigurationController = nullptr;
+}
+
+void FrameworkHelper::UpdateConfiguration()
+{
+ if (!mxConfigurationController.is())
+ return;
+
+ try
+ {
+ if (mxConfigurationController.is())
+ mxConfigurationController->update();
+ }
+ catch (lang::DisposedException&)
+ {
+ Dispose();
+ }
+ catch (RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+}
+
+OUString FrameworkHelper::ResourceIdToString (const Reference<XResourceId>& rxResourceId)
+{
+ OUStringBuffer sString;
+ if (rxResourceId.is())
+ {
+ sString.append(rxResourceId->getResourceURL());
+ if (rxResourceId->hasAnchor())
+ {
+ const Sequence<OUString> aAnchorURLs (rxResourceId->getAnchorURLs());
+ for (const auto& rAnchorURL : aAnchorURLs)
+ {
+ sString.append(" | ");
+ sString.append(rAnchorURL);
+ }
+ }
+ }
+ return sString.makeStringAndClear();
+}
+
+Reference<XResourceId> FrameworkHelper::CreateResourceId (const OUString& rsResourceURL)
+{
+ return new ::sd::framework::ResourceId(rsResourceURL);
+}
+
+Reference<XResourceId> FrameworkHelper::CreateResourceId (
+ const OUString& rsResourceURL,
+ const OUString& rsAnchorURL)
+{
+ return new ::sd::framework::ResourceId(rsResourceURL, rsAnchorURL);
+}
+
+Reference<XResourceId> FrameworkHelper::CreateResourceId (
+ const OUString& rsResourceURL,
+ const Reference<XResourceId>& rxAnchorId)
+{
+ if (rxAnchorId.is())
+ return new ::sd::framework::ResourceId(
+ rsResourceURL,
+ rxAnchorId->getResourceURL(),
+ rxAnchorId->getAnchorURLs());
+ else
+ return new ::sd::framework::ResourceId(rsResourceURL);
+}
+
+//----- FrameworkHelper::DisposeListener --------------------------------------
+
+FrameworkHelper::DisposeListener::DisposeListener (
+ const ::std::shared_ptr<FrameworkHelper>& rpHelper)
+ : mpHelper(rpHelper)
+{
+ Reference<XComponent> xComponent (mpHelper->mxConfigurationController, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->addEventListener(this);
+}
+
+void FrameworkHelper::DisposeListener::disposing(std::unique_lock<std::mutex>&)
+{
+ Reference<XComponent> xComponent (mpHelper->mxConfigurationController, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->removeEventListener(this);
+
+ mpHelper.reset();
+}
+
+void SAL_CALL FrameworkHelper::DisposeListener::disposing (const lang::EventObject& rEventObject)
+{
+ if (mpHelper != nullptr)
+ mpHelper->disposing(rEventObject);
+}
+
+//===== FrameworkHelperResourceIdFilter =======================================
+
+FrameworkHelperResourceIdFilter::FrameworkHelperResourceIdFilter (
+ const Reference<XResourceId>& rxResourceId)
+ : mxResourceId(rxResourceId)
+{
+}
+
+} // end of namespace sd::framework
+
+namespace {
+
+//===== CallbackCaller ========================================================
+
+CallbackCaller::CallbackCaller (
+ const ::sd::ViewShellBase& rBase,
+ const OUString& rsEventType,
+ const ::sd::framework::FrameworkHelper::ConfigurationChangeEventFilter& rFilter,
+ const ::sd::framework::FrameworkHelper::Callback& rCallback)
+ : msEventType(rsEventType),
+ maFilter(rFilter),
+ maCallback(rCallback)
+{
+ try
+ {
+ Reference<XControllerManager> xControllerManager (rBase.GetController(), UNO_QUERY_THROW);
+ mxConfigurationController = xControllerManager->getConfigurationController();
+ if (mxConfigurationController.is())
+ {
+ if (mxConfigurationController->hasPendingRequests())
+ mxConfigurationController->addConfigurationChangeListener(this,msEventType,Any());
+ else
+ {
+ // There are no requests waiting to be processed. Therefore
+ // no event, especially not the one we are waiting for, will
+ // be sent in the near future and the callback would never be
+ // called.
+ // Call the callback now and tell him that the event it is
+ // waiting for was not sent.
+ mxConfigurationController = nullptr;
+ maCallback(false);
+ }
+ }
+ }
+ catch (RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+}
+
+void CallbackCaller::disposing(std::unique_lock<std::mutex>&)
+{
+ try
+ {
+ if (mxConfigurationController.is())
+ {
+ Reference<XConfigurationController> xCC (mxConfigurationController);
+ mxConfigurationController = nullptr;
+ xCC->removeConfigurationChangeListener(this);
+ }
+ }
+ catch (RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+}
+
+void SAL_CALL CallbackCaller::disposing (const lang::EventObject& rEvent)
+{
+ if (rEvent.Source == mxConfigurationController)
+ {
+ mxConfigurationController = nullptr;
+ maCallback(false);
+ }
+}
+
+void SAL_CALL CallbackCaller::notifyConfigurationChange (
+ const ConfigurationChangeEvent& rEvent)
+{
+ if (!(rEvent.Type == msEventType && maFilter(rEvent)))
+ return;
+
+ maCallback(true);
+ if (mxConfigurationController.is())
+ {
+ // Reset the reference to the configuration controller so that
+ // dispose() will not try to remove the listener a second time.
+ Reference<XConfigurationController> xCC (mxConfigurationController);
+ mxConfigurationController = nullptr;
+
+ // Removing this object from the controller may very likely lead
+ // to its destruction, so no calls after that.
+ xCC->removeConfigurationChangeListener(this);
+ }
+}
+
+//----- LifetimeController -------------------------------------------------
+
+LifetimeController::LifetimeController (::sd::ViewShellBase& rBase)
+ : mrBase(rBase),
+ mbListeningToViewShellBase(false),
+ mbListeningToController(false)
+{
+ // Register as listener at the ViewShellBase. Because that is not done
+ // via a reference we have to increase the reference count manually.
+ // This is necessary even though listening to the XController did
+ // increase the reference count because the controller may release its
+ // reference to us before the ViewShellBase is destroyed.
+ StartListening(mrBase);
+ acquire();
+ mbListeningToViewShellBase = true;
+
+ Reference<XComponent> xComponent = rBase.GetController();
+ if (xComponent.is())
+ {
+ xComponent->addEventListener(this);
+ mbListeningToController = true;
+ }
+}
+
+LifetimeController::~LifetimeController()
+{
+ OSL_ASSERT(!mbListeningToController && !mbListeningToViewShellBase);
+}
+
+void SAL_CALL LifetimeController::disposing (const lang::EventObject&)
+{
+ mbListeningToController = false;
+ Update();
+}
+
+void LifetimeController::Notify (SfxBroadcaster&, const SfxHint& rHint)
+{
+ if (rHint.GetId() == SfxHintId::Dying)
+ {
+ mbListeningToViewShellBase = false;
+ Update();
+ release();
+ }
+}
+
+void LifetimeController::Update()
+{
+ if (mbListeningToViewShellBase && mbListeningToController)
+ {
+ // Both the controller and the ViewShellBase are alive. Keep
+ // waiting for their destruction.
+ }
+ else if (mbListeningToViewShellBase)
+ {
+ // The controller has been destroyed but the ViewShellBase is still
+ // alive. Dispose the associated FrameworkHelper but keep it around
+ // so that no new instance is created for the dying framework.
+ ::sd::framework::FrameworkHelper::DisposeInstance(mrBase);
+ }
+ else
+ {
+ // Both the controller and the ViewShellBase have been destroyed.
+ // Remove the FrameworkHelper so that the next call its Instance()
+ // method can create a new instance.
+ ::sd::framework::FrameworkHelper::ReleaseInstance(mrBase);
+ }
+}
+
+} // end of anonymous namespace.
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/bulmaper.cxx b/sd/source/ui/func/bulmaper.cxx
new file mode 100644
index 000000000..67a667891
--- /dev/null
+++ b/sd/source/ui/func/bulmaper.cxx
@@ -0,0 +1,104 @@
+/* -*- 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 <editeng/editids.hrc>
+
+//-> Fonts & Items
+#include <vcl/font.hxx>
+#include <editeng/fontitem.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/wghtitem.hxx>
+#include <editeng/udlnitem.hxx>
+#include <editeng/crossedoutitem.hxx>
+#include <editeng/postitem.hxx>
+#include <editeng/contouritem.hxx>
+#include <editeng/shdditem.hxx>
+
+//<- Fonts & Items
+#include <svl/itemset.hxx>
+#include <svl/itempool.hxx>
+#include <editeng/numitem.hxx>
+
+#include <bulmaper.hxx>
+
+#define GetWhich(nSlot) rSet.GetPool()->GetWhich( nSlot )
+
+void SdBulletMapper::MapFontsInNumRule( SvxNumRule& aNumRule, const SfxItemSet& rSet )
+{
+ const sal_uInt16 nCount = aNumRule.GetLevelCount();
+ for( sal_uInt16 nLevel = 0; nLevel < nCount; nLevel++ )
+ {
+ const SvxNumberFormat& rSrcLevel = aNumRule.GetLevel(nLevel);
+ SvxNumberFormat aNewLevel( rSrcLevel );
+
+ if(rSrcLevel.GetNumberingType() != css::style::NumberingType::CHAR_SPECIAL &&
+ rSrcLevel.GetNumberingType() != css::style::NumberingType::NUMBER_NONE )
+ {
+ // if enumeration instead bullet is chosen, adjust bullet font to template font
+
+ // to be implemented if module supports CJK
+
+ vcl::Font aMyFont;
+ const SvxFontItem& rFItem =
+ static_cast<const SvxFontItem&>(rSet.Get(GetWhich( sal_uInt16(SID_ATTR_CHAR_FONT) )));
+ aMyFont.SetFamily(rFItem.GetFamily());
+ aMyFont.SetFamilyName(rFItem.GetFamilyName());
+ aMyFont.SetCharSet(rFItem.GetCharSet());
+ aMyFont.SetPitch(rFItem.GetPitch());
+
+ const SvxFontHeightItem& rFHItem =
+ static_cast<const SvxFontHeightItem&>(rSet.Get(GetWhich( sal_uInt16(SID_ATTR_CHAR_FONTHEIGHT) )));
+ aMyFont.SetFontSize(Size(0, rFHItem.GetHeight()));
+
+ const SvxWeightItem& rWItem =
+ static_cast<const SvxWeightItem&>(rSet.Get(GetWhich( sal_uInt16(SID_ATTR_CHAR_WEIGHT) )));
+ aMyFont.SetWeight(rWItem.GetWeight());
+
+ const SvxPostureItem& rPItem =
+ static_cast<const SvxPostureItem&>(rSet.Get(GetWhich( sal_uInt16(SID_ATTR_CHAR_POSTURE) )));
+ aMyFont.SetItalic(rPItem.GetPosture());
+
+ const SvxUnderlineItem& rUItem = rSet.Get(GetWhich(SID_ATTR_CHAR_UNDERLINE));
+ aMyFont.SetUnderline(rUItem.GetLineStyle());
+
+ const SvxOverlineItem& rOItem = static_cast<const SvxOverlineItem&>(rSet.Get(GetWhich(SID_ATTR_CHAR_OVERLINE)));
+ aMyFont.SetOverline(rOItem.GetLineStyle());
+
+ const SvxCrossedOutItem& rCOItem = static_cast<const SvxCrossedOutItem&>(rSet.Get(GetWhich(SID_ATTR_CHAR_STRIKEOUT)));
+ aMyFont.SetStrikeout(rCOItem.GetStrikeout());
+
+ const SvxContourItem& rCItem = static_cast<const SvxContourItem&>(rSet.Get(GetWhich(SID_ATTR_CHAR_CONTOUR)));
+ aMyFont.SetOutline(rCItem.GetValue());
+
+ const SvxShadowedItem& rSItem = static_cast<const SvxShadowedItem&>(rSet.Get(GetWhich(SID_ATTR_CHAR_SHADOWED)));
+ aMyFont.SetShadow(rSItem.GetValue());
+
+ aNewLevel.SetBulletFont(&aMyFont);
+ aNumRule.SetLevel(nLevel, aNewLevel );
+ }
+ else if( rSrcLevel.GetNumberingType() == css::style::NumberingType::CHAR_SPECIAL )
+ {
+ aNewLevel.SetPrefix("");
+ aNewLevel.SetSuffix("");
+ aNumRule.SetLevel(nLevel, aNewLevel );
+ }
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuarea.cxx b/sd/source/ui/func/fuarea.cxx
new file mode 100644
index 000000000..8dd7543e3
--- /dev/null
+++ b/sd/source/ui/func/fuarea.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/.
+ *
+ * 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 <fuarea.hxx>
+
+#include <svx/svxids.hrc>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/bindings.hxx>
+#include <ViewShell.hxx>
+
+#include <drawdoc.hxx>
+#include <View.hxx>
+#include <svx/svxdlg.hxx>
+
+namespace sd {
+
+FuArea::FuArea( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* _pView, SdDrawDocument* pDoc, SfxRequest& rReq)
+: FuPoor(pViewSh, pWin, _pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuArea::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* _pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuArea( pViewSh, pWin, _pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuArea::DoExecute( SfxRequest& rReq )
+{
+ rReq.Ignore ();
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ if (pArgs)
+ return;
+
+ SfxItemSet aNewAttr( mpDoc->GetPool() );
+ mpView->GetAttributes( aNewAttr );
+
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ bool bHasSlideBackground = mpViewShell->GetDoc()->GetDocumentType() == DocumentType::Impress;
+ VclPtr<AbstractSvxAreaTabDialog> pDlg(
+ pFact->CreateSvxAreaTabDialog(mpViewShell->GetFrameWeld(), &aNewAttr, mpDoc, true, bHasSlideBackground));
+
+ pDlg->StartExecuteAsync([pDlg, pView = this->mpView, pViewShell = this->mpViewShell](sal_Int32 nResult){
+ if (nResult == RET_OK)
+ {
+ pView->SetAttributes (*(pDlg->GetOutputItemSet ()));
+
+ // attributes changed, update Listboxes in Objectbars
+ static const sal_uInt16 SidArray[] = {
+ SID_ATTR_FILL_STYLE,
+ SID_ATTR_FILL_COLOR,
+ SID_ATTR_FILL_GRADIENT,
+ SID_ATTR_FILL_HATCH,
+ SID_ATTR_FILL_BITMAP,
+ SID_ATTR_FILL_TRANSPARENCE,
+ SID_ATTR_FILL_FLOATTRANSPARENCE,
+ SID_ATTR_FILL_USE_SLIDE_BACKGROUND,
+ 0 };
+
+ pViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray );
+ }
+
+ // deferred until the dialog ends
+ pViewShell->Cancel();
+
+ pDlg->disposeOnce();
+ });
+}
+
+void FuArea::Activate()
+{
+}
+
+void FuArea::Deactivate()
+{
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fubullet.cxx b/sd/source/ui/func/fubullet.cxx
new file mode 100644
index 000000000..ab0cf7de8
--- /dev/null
+++ b/sd/source/ui/func/fubullet.cxx
@@ -0,0 +1,330 @@
+/* -*- 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 <fubullet.hxx>
+
+#include <sfx2/bindings.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <editeng/eeitem.hxx>
+#include <svl/poolitem.hxx>
+#include <editeng/fontitem.hxx>
+#include <OutlineView.hxx>
+#include <OutlineViewShell.hxx>
+#include <DrawViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <Window.hxx>
+#include <drawdoc.hxx>
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <svx/svdoutl.hxx>
+#include <sfx2/request.hxx>
+#include <svl/ctloptions.hxx>
+#include <svl/stritem.hxx>
+#include <tools/debug.hxx>
+
+#include <svx/svxdlg.hxx>
+#include <svx/svxids.hrc>
+
+namespace sd {
+
+const sal_Unicode CHAR_HARDBLANK = u'\x00A0';
+const sal_Unicode CHAR_HARDHYPHEN = u'\x2011';
+const sal_Unicode CHAR_SOFTHYPHEN = u'\x00AD';
+const sal_Unicode CHAR_RLM = u'\x200F';
+const sal_Unicode CHAR_LRM = u'\x200E';
+const sal_Unicode CHAR_ZWSP = u'\x200B';
+const sal_Unicode CHAR_WJ = u'\x2060';
+const sal_Unicode CHAR_NNBSP = u'\x202F'; //NARROW NO-BREAK SPACE
+
+
+FuBullet::FuBullet (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* _pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, _pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuBullet::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuBullet( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuBullet::DoExecute( SfxRequest& rReq )
+{
+ if( rReq.GetSlot() == SID_CHARMAP )
+ InsertSpecialCharacter(rReq);
+ else
+ {
+ sal_Unicode cMark = 0;
+ switch( rReq.GetSlot() )
+ {
+ case FN_INSERT_SOFT_HYPHEN: cMark = CHAR_SOFTHYPHEN ; break;
+ case FN_INSERT_HARDHYPHEN: cMark = CHAR_HARDHYPHEN ; break;
+ case FN_INSERT_HARD_SPACE: cMark = CHAR_HARDBLANK ; break;
+ case FN_INSERT_NNBSP: cMark = CHAR_NNBSP ; break;
+ case SID_INSERT_RLM : cMark = CHAR_RLM ; break;
+ case SID_INSERT_LRM : cMark = CHAR_LRM ; break;
+ case SID_INSERT_ZWSP : cMark = CHAR_ZWSP ; break;
+ case SID_INSERT_WJ: cMark = CHAR_WJ; break;
+ }
+
+ DBG_ASSERT( cMark != 0, "FuBullet::FuBullet(), illegal slot used!" );
+
+ if( cMark )
+ InsertFormattingMark( cMark );
+ }
+
+}
+
+void FuBullet::InsertFormattingMark( sal_Unicode cMark )
+{
+ OutlinerView* pOV = nullptr;
+ ::Outliner* pOL = nullptr;
+
+ // depending on ViewShell set Outliner and OutlinerView
+ if( dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr)
+ {
+ pOV = mpView->GetTextEditOutlinerView();
+ if (pOV)
+ pOL = mpView->GetTextEditOutliner();
+ }
+ else if( dynamic_cast< const OutlineViewShell *>( mpViewShell ) != nullptr)
+ {
+ pOL = &static_cast<OutlineView*>(mpView)->GetOutliner();
+ pOV = static_cast<OutlineView*>(mpView)->GetViewByWindow(
+ mpViewShell->GetActiveWindow());
+ }
+
+ // insert string
+ if(!(pOV && pOL))
+ return;
+
+ // prevent flickering
+ pOV->HideCursor();
+ pOL->SetUpdateLayout(false);
+
+ // remove old selected text
+ pOV->InsertText( "" );
+
+ // prepare undo
+ SfxUndoManager& rUndoMgr = pOL->GetUndoManager();
+ rUndoMgr.EnterListAction(SdResId(STR_UNDO_INSERT_SPECCHAR),
+ "", 0, mpViewShell->GetViewShellBase().GetViewShellId() );
+
+ // insert given text
+ OUString aStr( cMark );
+ pOV->InsertText( aStr, true);
+
+ ESelection aSel = pOV->GetSelection();
+ aSel.nStartPara = aSel.nEndPara;
+ aSel.nStartPos = aSel.nEndPos;
+ pOV->SetSelection(aSel);
+
+ rUndoMgr.LeaveListAction();
+
+ // restart repainting
+ pOL->SetUpdateLayout(true);
+ pOV->ShowCursor();
+}
+
+void FuBullet::InsertSpecialCharacter( SfxRequest const & rReq )
+{
+ const SfxItemSet *pArgs = rReq.GetArgs();
+ const SfxStringItem* pItem = nullptr;
+ if( pArgs )
+ pItem = pArgs->GetItemIfSet(SID_CHARMAP, false);
+
+ OUString aChars;
+ vcl::Font aFont;
+ if ( pItem )
+ {
+ aChars = pItem->GetValue();
+ const SfxStringItem* pFontItem = pArgs->GetItemIfSet( SID_ATTR_SPECIALCHAR, false );
+ if ( pFontItem )
+ {
+ const OUString& aFontName = pFontItem->GetValue();
+ aFont = vcl::Font( aFontName, Size(1,1) );
+ }
+ else
+ {
+ SfxItemSet aFontAttr( mpDoc->GetPool() );
+ mpView->GetAttributes( aFontAttr );
+ const SvxFontItem* pFItem = aFontAttr.GetItem( SID_ATTR_CHAR_FONT );
+ if( pFItem )
+ aFont = vcl::Font( pFItem->GetFamilyName(), pFItem->GetStyleName(), Size( 1, 1 ) );
+ }
+ }
+
+ if (aChars.isEmpty())
+ {
+ SfxAllItemSet aSet( mpDoc->GetPool() );
+ aSet.Put( SfxBoolItem( FN_PARAM_1, false ) );
+
+ SfxItemSet aFontAttr( mpDoc->GetPool() );
+ mpView->GetAttributes( aFontAttr );
+ const SvxFontItem* pFontItem = aFontAttr.GetItem( SID_ATTR_CHAR_FONT );
+ if( pFontItem )
+ aSet.Put( *pFontItem );
+
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ auto xFrame = mpViewShell ? mpViewShell->GetFrame()->GetFrame().GetFrameInterface() : nullptr;
+ ScopedVclPtr<SfxAbstractDialog> pDlg( pFact->CreateCharMapDialog(mpView->GetViewShell()->GetFrameWeld(), aSet,
+ xFrame) );
+
+ // If a character is selected, it can be shown
+ // pDLg->SetFont( );
+ // pDlg->SetChar( );
+ pDlg->Execute();
+ return;
+ }
+
+ if (aChars.isEmpty())
+ return;
+
+ OutlinerView* pOV = nullptr;
+ ::Outliner* pOL = nullptr;
+
+ // determine depending on ViewShell Outliner and OutlinerView
+ if(dynamic_cast< const DrawViewShell *>( mpViewShell ))
+ {
+ pOV = mpView->GetTextEditOutlinerView();
+ if (pOV)
+ {
+ pOL = mpView->GetTextEditOutliner();
+ }
+ }
+ else if(dynamic_cast< const OutlineViewShell *>( mpViewShell ))
+ {
+ pOL = &static_cast<OutlineView*>(mpView)->GetOutliner();
+ pOV = static_cast<OutlineView*>(mpView)->GetViewByWindow(
+ mpViewShell->GetActiveWindow());
+ }
+
+ // insert special character
+ if (!pOV)
+ return;
+
+ // prevent flicker
+ pOV->HideCursor();
+ pOL->SetUpdateLayout(false);
+
+ /* remember old attributes:
+ To do that, remove selected area before (it has to go anyway).
+ With that, we get unique attributes (and since there is no
+ DeleteSelected() in OutlinerView, it is deleted by inserting an
+ empty string). */
+ pOV->InsertText( "" );
+
+ SfxItemSetFixed<EE_CHAR_FONTINFO, EE_CHAR_FONTINFO> aOldSet( mpDoc->GetPool() );
+ aOldSet.Put( pOV->GetAttribs() );
+
+ SfxUndoManager& rUndoMgr = pOL->GetUndoManager();
+ ViewShellId nViewShellId = mpViewShell ? mpViewShell->GetViewShellBase().GetViewShellId() : ViewShellId(-1);
+ rUndoMgr.EnterListAction(SdResId(STR_UNDO_INSERT_SPECCHAR),
+ "", 0, nViewShellId );
+ pOV->InsertText(aChars, true);
+
+ // set attributes (set font)
+ SfxItemSet aSet(pOL->GetEmptyItemSet());
+ SvxFontItem aFontItem (aFont.GetFamilyType(), aFont.GetFamilyName(),
+ aFont.GetStyleName(), aFont.GetPitch(),
+ aFont.GetCharSet(),
+ EE_CHAR_FONTINFO);
+ aSet.Put(aFontItem);
+ aFontItem.SetWhich(EE_CHAR_FONTINFO_CJK);
+ aSet.Put(aFontItem);
+ aFontItem.SetWhich(EE_CHAR_FONTINFO_CTL);
+ aSet.Put(aFontItem);
+ pOV->SetAttribs(aSet);
+
+ ESelection aSel = pOV->GetSelection();
+ aSel.nStartPara = aSel.nEndPara;
+ aSel.nStartPos = aSel.nEndPos;
+ pOV->SetSelection(aSel);
+
+ // do not go ahead with setting attributes of special characters
+ pOV->GetOutliner()->QuickSetAttribs(aOldSet, aSel);
+
+ rUndoMgr.LeaveListAction();
+
+ // show it again
+ pOL->SetUpdateLayout(true);
+ pOV->ShowCursor();
+}
+
+void FuBullet::GetSlotState( SfxItemSet& rSet, ViewShell const * pViewShell, SfxViewFrame* pViewFrame )
+{
+ if( !(SfxItemState::DEFAULT == rSet.GetItemState( SID_CHARMAP ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_CHARMAP_CONTROL ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( FN_INSERT_SOFT_HYPHEN ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( FN_INSERT_HARDHYPHEN ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( FN_INSERT_HARD_SPACE ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( FN_INSERT_NNBSP ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_INSERT_RLM ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_INSERT_LRM ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_INSERT_WJ ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_INSERT_ZWSP )))
+ return;
+
+ ::sd::View* pView = pViewShell ? pViewShell->GetView() : nullptr;
+ OutlinerView* pOLV = pView ? pView->GetTextEditOutlinerView() : nullptr;
+
+ const bool bTextEdit = pOLV;
+
+ SvtCTLOptions aCTLOptions;
+ const bool bCtlEnabled = aCTLOptions.IsCTLFontEnabled();
+
+ if(!bTextEdit )
+ {
+ rSet.DisableItem(FN_INSERT_SOFT_HYPHEN);
+ rSet.DisableItem(FN_INSERT_HARDHYPHEN);
+ rSet.DisableItem(FN_INSERT_HARD_SPACE);
+ rSet.DisableItem(FN_INSERT_NNBSP);
+ rSet.DisableItem(SID_INSERT_WJ);
+ rSet.DisableItem(SID_INSERT_ZWSP);
+ }
+
+ if( !bTextEdit && (dynamic_cast<OutlineViewShell const *>( pViewShell ) == nullptr) )
+ {
+ rSet.DisableItem(SID_CHARMAP);
+ rSet.DisableItem(SID_CHARMAP_CONTROL);
+ }
+
+ if(!bTextEdit || !bCtlEnabled )
+ {
+ rSet.DisableItem(SID_INSERT_RLM);
+ rSet.DisableItem(SID_INSERT_LRM);
+ }
+
+ if( pViewFrame )
+ {
+ SfxBindings& rBindings = pViewFrame->GetBindings();
+
+ rBindings.SetVisibleState( SID_INSERT_RLM, bCtlEnabled );
+ rBindings.SetVisibleState( SID_INSERT_LRM, bCtlEnabled );
+ }
+}
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuchar.cxx b/sd/source/ui/func/fuchar.cxx
new file mode 100644
index 000000000..3935f64a1
--- /dev/null
+++ b/sd/source/ui/func/fuchar.cxx
@@ -0,0 +1,139 @@
+/* -*- 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 <fuchar.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/sfxdlg.hxx>
+
+#include <svx/svxids.hrc>
+#include <editeng/eeitem.hxx>
+#include <editeng/colritem.hxx>
+#include <editeng/brushitem.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/request.hxx>
+#include <View.hxx>
+#include <drawdoc.hxx>
+#include <ViewShell.hxx>
+#include <DrawDocShell.hxx>
+#include <sdabstdlg.hxx>
+
+namespace sd {
+
+
+FuChar::FuChar (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuChar::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuChar( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuChar::DoExecute( SfxRequest& rReq )
+{
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ if( !pArgs )
+ {
+ SfxItemSet aEditAttr( mpDoc->GetPool() );
+ mpView->GetAttributes( aEditAttr );
+
+ SfxItemSetFixed<XATTR_FILLSTYLE, XATTR_FILLCOLOR, EE_ITEMS_START, EE_ITEMS_END> aNewAttr(mpViewShell->GetPool());
+ aNewAttr.Put( aEditAttr, false );
+
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<SfxAbstractTabDialog> pDlg( pFact->CreateSdTabCharDialog(mpViewShell->GetFrameWeld(), &aNewAttr, mpDoc->GetDocSh() ) );
+ if (rReq.GetSlot() == SID_CHAR_DLG_EFFECT)
+ {
+ pDlg->SetCurPageId("RID_SVXPAGE_CHAR_EFFECTS");
+ }
+
+ sal_uInt16 nResult = pDlg->Execute();
+
+ if( nResult != RET_OK )
+ return;
+
+ const SfxItemSet* pOutputSet = pDlg->GetOutputItemSet();
+ SfxItemSet aOtherSet( *pOutputSet );
+
+ // and now the reverse process
+ const SvxBrushItem* pBrushItem = aOtherSet.GetItem<SvxBrushItem>( SID_ATTR_BRUSH_CHAR );
+
+ if ( pBrushItem )
+ {
+ SvxColorItem aBackColorItem( pBrushItem->GetColor(), EE_CHAR_BKGCOLOR );
+ aOtherSet.ClearItem( SID_ATTR_BRUSH_CHAR );
+ aOtherSet.Put( aBackColorItem );
+ }
+
+ rReq.Done( aOtherSet );
+ pArgs = rReq.GetArgs();
+ }
+ mpView->SetAttributes(*pArgs);
+
+ // invalidate the Slots which are in DrTxtObjBar
+ static const sal_uInt16 SidArray[] = {
+ SID_ATTR_CHAR_FONT,
+ SID_ATTR_CHAR_POSTURE,
+ SID_ATTR_CHAR_WEIGHT,
+ SID_ATTR_CHAR_SHADOWED,
+ SID_ATTR_CHAR_STRIKEOUT,
+ SID_ATTR_CHAR_UNDERLINE,
+ SID_ATTR_CHAR_FONTHEIGHT,
+ SID_ATTR_CHAR_COLOR,
+ SID_ATTR_CHAR_KERNING,
+ SID_ATTR_CHAR_CASEMAP,
+ SID_SET_SUPER_SCRIPT,
+ SID_SET_SUB_SCRIPT,
+ SID_ATTR_CHAR_BACK_COLOR,
+ 0 };
+
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray );
+
+ if( mpDoc->GetOnlineSpell() )
+ {
+ if( SfxItemState::SET == pArgs->GetItemState(EE_CHAR_LANGUAGE, false ) ||
+ SfxItemState::SET == pArgs->GetItemState(EE_CHAR_LANGUAGE_CJK, false ) ||
+ SfxItemState::SET == pArgs->GetItemState(EE_CHAR_LANGUAGE_CTL, false ) )
+ {
+ mpDoc->StopOnlineSpelling();
+ mpDoc->StartOnlineSpelling();
+ }
+ }
+}
+
+void FuChar::Activate()
+{
+}
+
+void FuChar::Deactivate()
+{
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fucon3d.cxx b/sd/source/ui/func/fucon3d.cxx
new file mode 100644
index 000000000..fb844548f
--- /dev/null
+++ b/sd/source/ui/func/fucon3d.cxx
@@ -0,0 +1,474 @@
+/* -*- 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 <fucon3d.hxx>
+
+#include <svx/svxids.hrc>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <tools/poly.hxx>
+
+#include <svx/xlineit0.hxx>
+#include <svx/scene3d.hxx>
+#include <svx/sphere3d.hxx>
+#include <svx/cube3d.hxx>
+#include <svx/lathe3d.hxx>
+#include <svx/camera3d.hxx>
+
+#include <vcl/weld.hxx>
+
+#include <app.hrc>
+
+#include <View.hxx>
+#include <Window.hxx>
+#include <ViewShell.hxx>
+#include <drawdoc.hxx>
+#include <ViewShellBase.hxx>
+#include <ToolBarManager.hxx>
+#include <svx/svx3ditems.hxx>
+
+#include <basegfx/polygon/b2dpolygontools.hxx>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+
+FuConstruct3dObject::FuConstruct3dObject (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuConstruct(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuConstruct3dObject::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent )
+{
+ FuConstruct3dObject* pFunc;
+ rtl::Reference<FuPoor> xFunc( pFunc = new FuConstruct3dObject( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ pFunc->SetPermanent(bPermanent);
+ return xFunc;
+}
+
+void FuConstruct3dObject::DoExecute( SfxRequest& rReq )
+{
+ FuConstruct::DoExecute( rReq );
+ mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBar(
+ ToolBarManager::ToolBarGroup::Function,
+ ToolBarManager::msDrawingObjectToolBar);
+}
+
+E3dCompoundObject* FuConstruct3dObject::ImpCreateBasic3DShape()
+{
+ E3dCompoundObject* p3DObj = nullptr;
+
+ switch (nSlotId)
+ {
+ default:
+ case SID_3D_CUBE:
+ {
+ p3DObj = new E3dCubeObj(
+ mpView->getSdrModelFromSdrView(),
+ mpView->Get3DDefaultAttributes(),
+ ::basegfx::B3DPoint(-2500, -2500, -2500),
+ ::basegfx::B3DVector(5000, 5000, 5000));
+ break;
+ }
+
+ case SID_3D_SPHERE:
+ {
+ p3DObj = new E3dSphereObj(
+ mpView->getSdrModelFromSdrView(),
+ mpView->Get3DDefaultAttributes(),
+ ::basegfx::B3DPoint(0, 0, 0),
+ ::basegfx::B3DVector(5000, 5000, 5000));
+ break;
+ }
+
+ case SID_3D_SHELL:
+ {
+ XPolygon aXPoly(Point (0, 1250), 2500, 2500, 0_deg100, 9000_deg100, false);
+ aXPoly.Scale(5.0, 5.0);
+
+ ::basegfx::B2DPolygon aB2DPolygon(aXPoly.getB2DPolygon());
+ if(aB2DPolygon.areControlPointsUsed())
+ {
+ aB2DPolygon = ::basegfx::utils::adaptiveSubdivideByAngle(aB2DPolygon);
+ }
+ p3DObj = new E3dLatheObj(
+ mpView->getSdrModelFromSdrView(),
+ mpView->Get3DDefaultAttributes(),
+ ::basegfx::B2DPolyPolygon(aB2DPolygon));
+
+ /* this is an open object, therefore it has to be handled double-
+ sided by default */
+ p3DObj->SetMergedItem(makeSvx3DDoubleSidedItem(true));
+ break;
+ }
+
+ case SID_3D_HALF_SPHERE:
+ {
+ XPolygon aXPoly(Point (0, 1250), 2500, 2500, 0_deg100, 9000_deg100, false);
+ aXPoly.Scale(5.0, 5.0);
+
+ aXPoly.Insert(0, Point (2400*5, 1250*5), PolyFlags::Normal);
+ aXPoly.Insert(0, Point (2000*5, 1250*5), PolyFlags::Normal);
+ aXPoly.Insert(0, Point (1500*5, 1250*5), PolyFlags::Normal);
+ aXPoly.Insert(0, Point (1000*5, 1250*5), PolyFlags::Normal);
+ aXPoly.Insert(0, Point (500*5, 1250*5), PolyFlags::Normal);
+ aXPoly.Insert(0, Point (250*5, 1250*5), PolyFlags::Normal);
+ aXPoly.Insert(0, Point (50*5, 1250*5), PolyFlags::Normal);
+ aXPoly.Insert(0, Point (0, 1250*5), PolyFlags::Normal);
+
+ ::basegfx::B2DPolygon aB2DPolygon(aXPoly.getB2DPolygon());
+ if(aB2DPolygon.areControlPointsUsed())
+ {
+ aB2DPolygon = ::basegfx::utils::adaptiveSubdivideByAngle(aB2DPolygon);
+ }
+ p3DObj = new E3dLatheObj(
+ mpView->getSdrModelFromSdrView(),
+ mpView->Get3DDefaultAttributes(),
+ ::basegfx::B2DPolyPolygon(aB2DPolygon));
+ break;
+ }
+
+ case SID_3D_TORUS:
+ {
+ ::basegfx::B2DPolygon aB2DPolygon(::basegfx::utils::createPolygonFromCircle(::basegfx::B2DPoint(1000.0, 0.0), 500.0));
+ if(aB2DPolygon.areControlPointsUsed())
+ {
+ aB2DPolygon = ::basegfx::utils::adaptiveSubdivideByAngle(aB2DPolygon);
+ }
+ p3DObj = new E3dLatheObj(
+ mpView->getSdrModelFromSdrView(),
+ mpView->Get3DDefaultAttributes(),
+ ::basegfx::B2DPolyPolygon(aB2DPolygon));
+ break;
+ }
+
+ case SID_3D_CYLINDER:
+ {
+ ::basegfx::B2DPolygon aInnerPoly;
+
+ aInnerPoly.append(::basegfx::B2DPoint(0, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(50*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(100*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(200*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(300*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(400*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(450*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(500*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(500*5, -1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(450*5, -1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(400*5, -1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(300*5, -1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(200*5, -1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(100*5, -1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(50*5, -1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(0, -1000*5));
+ aInnerPoly.setClosed(true);
+
+ p3DObj = new E3dLatheObj(
+ mpView->getSdrModelFromSdrView(),
+ mpView->Get3DDefaultAttributes(),
+ ::basegfx::B2DPolyPolygon(aInnerPoly));
+ break;
+ }
+
+ case SID_3D_CONE:
+ {
+ ::basegfx::B2DPolygon aInnerPoly;
+
+ aInnerPoly.append(::basegfx::B2DPoint(0, -1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(25*5, -900*5));
+ aInnerPoly.append(::basegfx::B2DPoint(50*5, -800*5));
+ aInnerPoly.append(::basegfx::B2DPoint(100*5, -600*5));
+ aInnerPoly.append(::basegfx::B2DPoint(200*5, -200*5));
+ aInnerPoly.append(::basegfx::B2DPoint(300*5, 200*5));
+ aInnerPoly.append(::basegfx::B2DPoint(400*5, 600*5));
+ aInnerPoly.append(::basegfx::B2DPoint(500*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(400*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(300*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(200*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(100*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(50*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(0, 1000*5));
+ aInnerPoly.setClosed(true);
+
+ p3DObj = new E3dLatheObj(
+ mpView->getSdrModelFromSdrView(),
+ mpView->Get3DDefaultAttributes(),
+ ::basegfx::B2DPolyPolygon(aInnerPoly));
+ break;
+ }
+
+ case SID_3D_PYRAMID:
+ {
+ ::basegfx::B2DPolygon aInnerPoly;
+
+ aInnerPoly.append(::basegfx::B2DPoint(0, -1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(25*5, -900*5));
+ aInnerPoly.append(::basegfx::B2DPoint(50*5, -800*5));
+ aInnerPoly.append(::basegfx::B2DPoint(100*5, -600*5));
+ aInnerPoly.append(::basegfx::B2DPoint(200*5, -200*5));
+ aInnerPoly.append(::basegfx::B2DPoint(300*5, 200*5));
+ aInnerPoly.append(::basegfx::B2DPoint(400*5, 600*5));
+ aInnerPoly.append(::basegfx::B2DPoint(500*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(400*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(300*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(200*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(100*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(50*5, 1000*5));
+ aInnerPoly.append(::basegfx::B2DPoint(0, 1000*5));
+ aInnerPoly.setClosed(true);
+
+ p3DObj = new E3dLatheObj(
+ mpView->getSdrModelFromSdrView(),
+ mpView->Get3DDefaultAttributes(),
+ ::basegfx::B2DPolyPolygon(aInnerPoly));
+ p3DObj->SetMergedItem(makeSvx3DHorizontalSegmentsItem(4));
+ break;
+ }
+ }
+
+ return p3DObj;
+}
+
+void FuConstruct3dObject::ImpPrepareBasic3DShape(E3dCompoundObject const * p3DObj, E3dScene *pScene)
+{
+ Camera3D aCamera = pScene->GetCamera ();
+
+ // get transformed BoundVolume of the new object
+ basegfx::B3DRange aBoundVol;
+ basegfx::B3DRange aObjVol(p3DObj->GetBoundVolume());
+ aObjVol.transform(p3DObj->GetTransform());
+ aBoundVol.expand(aObjVol);
+ double fDeepth(aBoundVol.getDepth());
+
+ aCamera.SetPRP(::basegfx::B3DPoint(0.0, 0.0, 1000.0));
+ aCamera.SetPosition(::basegfx::B3DPoint(0.0, 0.0, mpView->GetDefaultCamPosZ() + fDeepth / 2));
+ aCamera.SetFocalLength(mpView->GetDefaultCamFocal());
+ pScene->SetCamera(aCamera);
+ basegfx::B3DHomMatrix aTransformation;
+
+ switch (nSlotId)
+ {
+ case SID_3D_CUBE:
+ {
+ aTransformation.rotate(basegfx::deg2rad(20), 0.0, 0.0);
+ }
+ break;
+
+ case SID_3D_SPHERE:
+ {
+ }
+ break;
+
+ case SID_3D_SHELL:
+ case SID_3D_HALF_SPHERE:
+ {
+ aTransformation.rotate(basegfx::deg2rad(200), 0.0, 0.0);
+ }
+ break;
+
+ case SID_3D_CYLINDER:
+ case SID_3D_CONE:
+ case SID_3D_PYRAMID:
+ {
+ }
+ break;
+
+ case SID_3D_TORUS:
+ {
+ aTransformation.rotate(basegfx::deg2rad(90), 0.0, 0.0);
+ }
+ break;
+
+ default:
+ {
+ }
+ break;
+ }
+
+ pScene->SetTransform(aTransformation * pScene->GetTransform());
+
+ SfxItemSet aAttr (mpViewShell->GetPool());
+ pScene->SetMergedItemSetAndBroadcast(aAttr);
+}
+
+bool FuConstruct3dObject::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ bool bReturn = FuConstruct::MouseButtonDown(rMEvt);
+
+ if ( rMEvt.IsLeft() && !mpView->IsAction() )
+ {
+ Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
+
+ mpWindow->CaptureMouse();
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+
+ weld::WaitObject aWait(mpViewShell->GetFrameWeld());
+
+ E3dCompoundObject* p3DObj = ImpCreateBasic3DShape();
+ E3dScene* pScene = mpView->SetCurrent3DObj(p3DObj);
+
+ ImpPrepareBasic3DShape(p3DObj, pScene);
+ bReturn = mpView->BegCreatePreparedObject(aPnt, nDrgLog, pScene);
+
+ SdrObject* pObj = mpView->GetCreateObj();
+
+ if (pObj)
+ {
+ SfxItemSet aAttr(mpDoc->GetPool());
+ SetStyleSheet(aAttr, pObj);
+
+ // extract LineStyle
+ aAttr.Put(XLineStyleItem (drawing::LineStyle_NONE));
+
+ pObj->SetMergedItemSet(aAttr);
+ }
+ }
+
+ return bReturn;
+}
+
+bool FuConstruct3dObject::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ bool bReturn = false;
+
+ if ( mpView->IsCreateObj() && rMEvt.IsLeft() )
+ {
+ if( mpView->EndCreateObj( SdrCreateCmd::ForceEnd ) )
+ {
+ bReturn = true;
+ }
+ else
+ {
+ //Drag was too small to create object, so insert default object at click pos
+ Point aClickPos(mpWindow->PixelToLogic(rMEvt.GetPosPixel()));
+ sal_uInt32 nDefaultObjectSize(1000);
+ sal_Int32 nCenterOffset(-sal_Int32(nDefaultObjectSize / 2));
+ aClickPos.AdjustX(nCenterOffset);
+ aClickPos.AdjustY(nCenterOffset);
+
+ SdrPageView *pPV = mpView->GetSdrPageView();
+
+ if(mpView->IsSnapEnabled())
+ aClickPos = mpView->GetSnapPos(aClickPos, pPV);
+
+ ::tools::Rectangle aNewObjectRectangle(aClickPos, Size(nDefaultObjectSize, nDefaultObjectSize));
+ SdrObjectUniquePtr pObjDefault = CreateDefaultObject(nSlotId, aNewObjectRectangle);
+
+ bReturn = mpView->InsertObjectAtView(pObjDefault.release(), *pPV);
+ }
+ }
+ bReturn = FuConstruct::MouseButtonUp(rMEvt) || bReturn;
+
+ if (!bPermanent)
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+
+ return bReturn;
+}
+
+void FuConstruct3dObject::Activate()
+{
+ mpView->SetCurrentObj(SdrObjKind::NONE);
+
+ FuConstruct::Activate();
+}
+
+SdrObjectUniquePtr FuConstruct3dObject::CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle)
+{
+
+ E3dCompoundObject* p3DObj = ImpCreateBasic3DShape();
+
+ // E3dView::SetCurrent3DObj part
+ // get transformed BoundVolume of the object
+ basegfx::B3DRange aObjVol(p3DObj->GetBoundVolume());
+ aObjVol.transform(p3DObj->GetTransform());
+ basegfx::B3DRange aVolume(aObjVol);
+ double fW(aVolume.getWidth());
+ double fH(aVolume.getHeight());
+ ::tools::Rectangle a3DRect(0, 0, static_cast<::tools::Long>(fW), static_cast<::tools::Long>(fH));
+ std::unique_ptr< E3dScene, SdrObjectFreeOp > pScene(new E3dScene(*mpDoc));
+
+ // copied code from E3dView::InitScene
+ double fCamZ(aVolume.getMaxZ() + ((fW + fH) / 4.0));
+ Camera3D aCam(pScene->GetCamera());
+ aCam.SetAutoAdjustProjection(false);
+ aCam.SetViewWindow(- fW / 2, - fH / 2, fW, fH);
+ ::basegfx::B3DPoint aLookAt;
+ double fDefaultCamPosZ = mpView->GetDefaultCamPosZ();
+ ::basegfx::B3DPoint aCamPos(0.0, 0.0, fCamZ < fDefaultCamPosZ ? fDefaultCamPosZ : fCamZ);
+ aCam.SetPosAndLookAt(aCamPos, aLookAt);
+ aCam.SetFocalLength(mpView->GetDefaultCamFocal());
+ pScene->SetCamera(aCam);
+ pScene->InsertObject(p3DObj);
+ pScene->NbcSetSnapRect(a3DRect);
+ ImpPrepareBasic3DShape(p3DObj, pScene.get());
+ SfxItemSet aAttr(mpDoc->GetPool());
+ SetStyleSheet(aAttr, p3DObj);
+ aAttr.Put(XLineStyleItem (drawing::LineStyle_NONE));
+ p3DObj->SetMergedItemSet(aAttr);
+
+ // make object interactive at once
+ pScene->SetBoundAndSnapRectsDirty();
+
+ // Take care of restrictions for the rectangle
+ ::tools::Rectangle aRect(rRectangle);
+
+ switch(nID)
+ {
+ case SID_3D_CUBE:
+ case SID_3D_SPHERE:
+ case SID_3D_TORUS:
+ {
+ // force quadratic
+ ImpForceQuadratic(aRect);
+ break;
+ }
+
+ case SID_3D_SHELL:
+ case SID_3D_HALF_SPHERE:
+ {
+ // force horizontal layout
+ break;
+ }
+
+ case SID_3D_CYLINDER:
+ case SID_3D_CONE:
+ case SID_3D_PYRAMID:
+ {
+ // force vertical layout
+ break;
+ }
+ }
+
+ // use changed rectangle, not original one
+ pScene->SetLogicRect(aRect);
+
+ return SdrObjectUniquePtr(pScene.release());
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuconarc.cxx b/sd/source/ui/func/fuconarc.cxx
new file mode 100644
index 000000000..b5be93f9b
--- /dev/null
+++ b/sd/source/ui/func/fuconarc.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/.
+ *
+ * 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 <fuconarc.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdocirc.hxx>
+#include <sfx2/request.hxx>
+#include <svl/intitem.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svx/svdobj.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <osl/diagnose.h>
+
+#include <svx/svxids.hrc>
+
+#include <Window.hxx>
+#include <drawdoc.hxx>
+
+#include <View.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <ToolBarManager.hxx>
+
+#include <svx/sxciaitm.hxx>
+#include <svx/xfillit0.hxx>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+
+FuConstructArc::FuConstructArc (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq )
+ : FuConstruct( pViewSh, pWin, pView, pDoc, rReq )
+{
+}
+
+rtl::Reference<FuPoor> FuConstructArc::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent )
+{
+ FuConstructArc* pFunc;
+ rtl::Reference<FuPoor> xFunc( pFunc = new FuConstructArc( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ pFunc->SetPermanent(bPermanent);
+ return xFunc;
+}
+
+void FuConstructArc::DoExecute( SfxRequest& rReq )
+{
+ FuConstruct::DoExecute( rReq );
+
+ mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBar(
+ ToolBarManager::ToolBarGroup::Function,
+ ToolBarManager::msDrawingObjectToolBar);
+
+ const SfxItemSet *pArgs = rReq.GetArgs ();
+
+ if (!pArgs)
+ return;
+
+ const SfxUInt32Item* pCenterX = rReq.GetArg<SfxUInt32Item>(ID_VAL_CENTER_X);
+ const SfxUInt32Item* pCenterY = rReq.GetArg<SfxUInt32Item>(ID_VAL_CENTER_Y);
+ const SfxUInt32Item* pAxisX = rReq.GetArg<SfxUInt32Item>(ID_VAL_AXIS_X);
+ const SfxUInt32Item* pAxisY = rReq.GetArg<SfxUInt32Item>(ID_VAL_AXIS_Y);
+ const SfxUInt32Item* pPhiStart = rReq.GetArg<SfxUInt32Item>(ID_VAL_ANGLESTART);
+ const SfxUInt32Item* pPhiEnd = rReq.GetArg<SfxUInt32Item>(ID_VAL_ANGLEEND);
+
+ ::tools::Rectangle aNewRectangle (pCenterX->GetValue () - pAxisX->GetValue () / 2,
+ pCenterY->GetValue () - pAxisY->GetValue () / 2,
+ pCenterX->GetValue () + pAxisX->GetValue () / 2,
+ pCenterY->GetValue () + pAxisY->GetValue () / 2);
+
+ Activate(); // sets aObjKind
+ SdrCircObj* pNewCircle =
+ new SdrCircObj(
+ mpView->getSdrModelFromSdrView(),
+ ToSdrCircKind(mpView->GetCurrentObjIdentifier()),
+ aNewRectangle,
+ Degree100(pPhiStart->GetValue() * 10),
+ Degree100(pPhiEnd->GetValue() * 10));
+ SdrPageView *pPV = mpView->GetSdrPageView();
+
+ mpView->InsertObjectAtView(pNewCircle, *pPV, SdrInsertFlags::SETDEFLAYER);
+}
+
+bool FuConstructArc::MouseButtonDown( const MouseEvent& rMEvt )
+{
+ bool bReturn = FuConstruct::MouseButtonDown( rMEvt );
+
+ if ( rMEvt.IsLeft() && !mpView->IsAction() )
+ {
+ Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
+ mpWindow->CaptureMouse();
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+ mpView->BegCreateObj(aPnt, nullptr, nDrgLog);
+
+ SdrObject* pObj = mpView->GetCreateObj();
+
+ if (pObj)
+ {
+ SfxItemSet aAttr(mpDoc->GetPool());
+ SetStyleSheet(aAttr, pObj);
+
+ pObj->SetMergedItemSet(aAttr);
+ }
+
+ bReturn = true;
+ }
+ return bReturn;
+}
+
+bool FuConstructArc::MouseButtonUp( const MouseEvent& rMEvt )
+{
+ bool bReturn = false;
+ bool bCreated = false;
+
+ if ( mpView->IsCreateObj() && rMEvt.IsLeft() )
+ {
+ const size_t nCount = mpView->GetSdrPageView()->GetObjList()->GetObjCount();
+
+ if (mpView->EndCreateObj(SdrCreateCmd::NextPoint) )
+ {
+ if (nCount != mpView->GetSdrPageView()->GetObjList()->GetObjCount())
+ {
+ bCreated = true;
+ }
+ }
+
+ bReturn = true;
+ }
+
+ bReturn = FuConstruct::MouseButtonUp (rMEvt) || bReturn;
+
+ if (!bPermanent && bCreated)
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+
+ return bReturn;
+}
+
+void FuConstructArc::Activate()
+{
+ SdrObjKind aObjKind;
+
+ switch( nSlotId )
+ {
+ case SID_DRAW_ARC :
+ case SID_DRAW_CIRCLEARC:
+ {
+ aObjKind = SdrObjKind::CircleArc;
+ }
+ break;
+
+ case SID_DRAW_PIE :
+ case SID_DRAW_PIE_NOFILL :
+ case SID_DRAW_CIRCLEPIE :
+ case SID_DRAW_CIRCLEPIE_NOFILL:
+ {
+ aObjKind = SdrObjKind::CircleSection;
+ }
+ break;
+
+ case SID_DRAW_ELLIPSECUT :
+ case SID_DRAW_ELLIPSECUT_NOFILL:
+ case SID_DRAW_CIRCLECUT :
+ case SID_DRAW_CIRCLECUT_NOFILL :
+ {
+ aObjKind = SdrObjKind::CircleCut;
+ }
+ break;
+
+ default:
+ {
+ aObjKind = SdrObjKind::CircleArc;
+ }
+ break;
+ }
+
+ mpView->SetCurrentObj(aObjKind);
+
+ FuConstruct::Activate();
+}
+
+SdrObjectUniquePtr FuConstructArc::CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle)
+{
+
+ SdrObjectUniquePtr pObj(SdrObjFactory::MakeNewObject(
+ mpView->getSdrModelFromSdrView(),
+ mpView->GetCurrentObjInventor(),
+ mpView->GetCurrentObjIdentifier()));
+
+ if(pObj)
+ {
+ if( dynamic_cast< const SdrCircObj *>( pObj.get() ) != nullptr)
+ {
+ ::tools::Rectangle aRect(rRectangle);
+
+ if(SID_DRAW_ARC == nID ||
+ SID_DRAW_CIRCLEARC == nID ||
+ SID_DRAW_CIRCLEPIE == nID ||
+ SID_DRAW_CIRCLEPIE_NOFILL == nID ||
+ SID_DRAW_CIRCLECUT == nID ||
+ SID_DRAW_CIRCLECUT_NOFILL == nID)
+ {
+ // force quadratic
+ ImpForceQuadratic(aRect);
+ }
+
+ pObj->SetLogicRect(aRect);
+
+ SfxItemSet aAttr(mpDoc->GetPool());
+ aAttr.Put(makeSdrCircStartAngleItem(9000_deg100));
+ aAttr.Put(makeSdrCircEndAngleItem(0_deg100));
+
+ if(SID_DRAW_PIE_NOFILL == nID ||
+ SID_DRAW_CIRCLEPIE_NOFILL == nID ||
+ SID_DRAW_ELLIPSECUT_NOFILL == nID ||
+ SID_DRAW_CIRCLECUT_NOFILL == nID)
+ {
+ aAttr.Put(XFillStyleItem(drawing::FillStyle_NONE));
+ }
+
+ pObj->SetMergedItemSet(aAttr);
+ }
+ else
+ {
+ OSL_FAIL("Object is NO circle object");
+ }
+ }
+
+ return pObj;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuconbez.cxx b/sd/source/ui/func/fuconbez.cxx
new file mode 100644
index 000000000..b123e9c2d
--- /dev/null
+++ b/sd/source/ui/func/fuconbez.cxx
@@ -0,0 +1,556 @@
+/* -*- 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 <com/sun/star/presentation/EffectNodeType.hpp>
+
+#include <fuconbez.hxx>
+#include <svx/svdopath.hxx>
+#include <svl/intitem.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svx/svdobj.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <osl/diagnose.h>
+
+#include <svx/svxids.hrc>
+#include <svx/svdpagv.hxx>
+#include <svx/xlnclit.hxx>
+#include <svx/xlntrit.hxx>
+#include <svx/xlnwtit.hxx>
+
+#include <app.hrc>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <View.hxx>
+#include <Window.hxx>
+#include <ToolBarManager.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+
+#include <CustomAnimationEffect.hxx>
+
+using namespace ::com::sun::star::uno;
+
+namespace sd {
+
+/*//Extra attributes coming from parameters
+ sal_uInt16 mnTransparence; // Default: 0
+ OUString msColor; // Default: ""
+ sal_uInt16 mnWidth; // Default: 0
+ OUString msShapeName; // Default: ""*/
+FuConstructBezierPolygon::FuConstructBezierPolygon (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuConstruct(pViewSh, pWin, pView, pDoc, rReq),
+ nEditMode(SID_BEZIER_MOVE),
+ mnTransparence(0),
+ mnWidth(0)
+{
+}
+
+namespace{
+
+/// Checks to see if the request has a parameter of IsSticky:bool=true
+/// It means that the selected command/button will stay selected after use
+bool isSticky(const SfxRequest& rReq)
+{
+ const SfxItemSet *pArgs = rReq.GetArgs ();
+ if (pArgs)
+ {
+ const SfxBoolItem* pIsSticky = rReq.GetArg<SfxBoolItem>(FN_PARAM_4);
+ if (pIsSticky && pIsSticky->GetValue())
+ return true;
+ }
+
+ return false;
+}
+
+}
+
+rtl::Reference<FuPoor> FuConstructBezierPolygon::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent )
+{
+ FuConstructBezierPolygon* pFunc;
+ rtl::Reference<FuPoor> xFunc( pFunc = new FuConstructBezierPolygon( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ pFunc->SetPermanent(bPermanent || isSticky(rReq));
+ return xFunc;
+}
+
+void FuConstructBezierPolygon::DoExecute( SfxRequest& rReq )
+{
+ FuConstruct::DoExecute( rReq );
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ if( !pArgs )
+ return;
+
+ const SfxUnoAnyItem* pPoolItem = pArgs->GetItemIfSet( SID_ADD_MOTION_PATH );
+ if( pPoolItem )
+ maTargets = pPoolItem->GetValue();
+
+ if (nSlotId != SID_DRAW_FREELINE_NOFILL)
+ return;
+
+ const SfxUInt16Item* pTransparence = rReq.GetArg<SfxUInt16Item>(FN_PARAM_1);
+ const SfxStringItem* pColor = rReq.GetArg<SfxStringItem>(FN_PARAM_2);
+ const SfxUInt16Item* pWidth = rReq.GetArg<SfxUInt16Item>(FN_PARAM_3);
+ const SfxStringItem* pShapeName = rReq.GetArg<SfxStringItem>(SID_SHAPE_NAME);
+
+ if (pTransparence && pTransparence->GetValue() > 0)
+ {
+ mnTransparence = pTransparence->GetValue();
+ }
+ if (pColor && !pColor->GetValue().isEmpty())
+ {
+ msColor = pColor->GetValue();
+ }
+ if (pWidth && pWidth->GetValue() > 0)
+ {
+ mnWidth = pWidth->GetValue();
+ }
+ if (pShapeName && !pShapeName->GetValue().isEmpty())
+ {
+ msShapeName = pShapeName->GetValue();
+ }
+}
+
+bool FuConstructBezierPolygon::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ bool bReturn = FuConstruct::MouseButtonDown(rMEvt);
+
+ SdrViewEvent aVEvt;
+ SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+
+ if (eHit == SdrHitKind::Handle || rMEvt.IsMod1())
+ {
+ mpView->SetEditMode(SdrViewEditMode::Edit);
+ }
+ else
+ {
+ mpView->SetEditMode(SdrViewEditMode::Create);
+ }
+
+ if (aVEvt.meEvent == SdrEventKind::BeginTextEdit)
+ {
+ // here, we do not allow text input
+ aVEvt.meEvent = SdrEventKind::BeginDragObj;
+ mpView->EnableExtendedMouseEventDispatcher(false);
+ }
+ else
+ {
+ mpView->EnableExtendedMouseEventDispatcher(true);
+ }
+
+ if (eHit == SdrHitKind::MarkedObject && nEditMode == SID_BEZIER_INSERT)
+ {
+ // insert gluepoint
+ mpView->BegInsObjPoint(aMDPos, rMEvt.IsMod1());
+ }
+ else
+ {
+ mpView->MouseButtonDown(rMEvt, mpWindow->GetOutDev());
+
+ SdrObject* pObj = mpView->GetCreateObj();
+
+ if (pObj)
+ {
+ SfxItemSet aAttr(mpDoc->GetPool());
+ SetStyleSheet(aAttr, pObj);
+ SetAttributes(aAttr, pObj);
+ pObj->SetMergedItemSet(aAttr);
+ }
+ }
+
+ return bReturn;
+}
+
+bool FuConstructBezierPolygon::MouseButtonUp(const MouseEvent& rMEvt )
+{
+ bool bReturn = false;
+ bool bCreated = false;
+
+ SdrViewEvent aVEvt;
+ mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONUP, aVEvt);
+
+ const size_t nCount = mpView->GetSdrPageView()->GetObjList()->GetObjCount();
+
+ if (mpView->IsInsObjPoint())
+ {
+ mpView->EndInsObjPoint(SdrCreateCmd::ForceEnd);
+ }
+ else
+ {
+ mpView->MouseButtonUp(rMEvt, mpWindow->GetOutDev());
+ }
+
+ if (aVEvt.meEvent == SdrEventKind::EndCreate)
+ {
+ bReturn = true;
+
+ if (nCount+1 == mpView->GetSdrPageView()->GetObjList()->GetObjCount())
+ {
+ bCreated = true;
+ }
+
+ // trick to suppress FuDraw::DoubleClick
+ bMBDown = false;
+
+ }
+
+ bReturn = FuConstruct::MouseButtonUp(rMEvt) || bReturn;
+
+ bool bDeleted = false;
+ if( bCreated && maTargets.hasValue() )
+ {
+ SdrPathObj* pPathObj = dynamic_cast< SdrPathObj* >( mpView->GetSdrPageView()->GetObjList()->GetObj( nCount ) );
+ SdPage* pPage = dynamic_cast< SdPage* >( pPathObj ? pPathObj->getSdrPageFromSdrObject() : nullptr );
+ if( pPage )
+ {
+ std::shared_ptr< sd::MainSequence > pMainSequence( pPage->getMainSequence() );
+ if( pMainSequence )
+ {
+ Sequence< Any > aTargets;
+ maTargets >>= aTargets;
+
+ sal_Int32 nTCount = aTargets.getLength();
+ if( nTCount > 1 )
+ {
+ const Any* pTarget = aTargets.getConstArray();
+ double fDuration = 0.0;
+ *pTarget++ >>= fDuration;
+ bool bFirst = true;
+
+ OUString sPresetId;
+ switch(nSlotId)
+ {
+ case SID_DRAW_BEZIER_NOFILL:
+ sPresetId = "libo-motionpath-curve";
+ break;
+ case SID_DRAW_POLYGON_NOFILL:
+ sPresetId = "libo-motionpath-polygon";
+ break;
+ case SID_DRAW_FREELINE_NOFILL:
+ sPresetId = "libo-motionpath-freeform-line";
+ break;
+ }
+
+ while( --nTCount )
+ {
+ CustomAnimationEffectPtr pCreated( pMainSequence->append( *pPathObj, *pTarget++, fDuration, sPresetId) );
+ if( bFirst )
+ bFirst = false;
+ else
+ pCreated->setNodeType( css::presentation::EffectNodeType::WITH_PREVIOUS );
+ }
+ }
+ }
+ }
+ mpView->DeleteMarked();
+ bDeleted = true;
+ }
+
+ if ((!bPermanent && bCreated) || bDeleted)
+ {
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+ }
+
+ return bReturn;
+}
+
+void FuConstructBezierPolygon::Activate()
+{
+ mpView->EnableExtendedMouseEventDispatcher(true);
+
+ SdrObjKind eKind;
+
+ switch (nSlotId)
+ {
+ case SID_DRAW_POLYGON_NOFILL:
+ case SID_DRAW_XPOLYGON_NOFILL:
+ {
+ eKind = SdrObjKind::PolyLine;
+ }
+ break;
+
+ case SID_DRAW_POLYGON:
+ case SID_DRAW_XPOLYGON:
+ {
+ eKind = SdrObjKind::Polygon;
+ }
+ break;
+
+ case SID_DRAW_BEZIER_NOFILL:
+ {
+ eKind = SdrObjKind::PathLine;
+ }
+ break;
+
+ case SID_DRAW_BEZIER_FILL:
+ {
+ eKind = SdrObjKind::PathFill;
+ }
+ break;
+
+ case SID_DRAW_FREELINE_NOFILL:
+ {
+ eKind = SdrObjKind::FreehandLine;
+ }
+ break;
+
+ case SID_DRAW_FREELINE:
+ {
+ eKind = SdrObjKind::FreehandFill;
+ }
+ break;
+
+ default:
+ {
+ eKind = SdrObjKind::PathLine;
+ }
+ break;
+ }
+
+ mpView->SetCurrentObj(eKind);
+
+ FuConstruct::Activate();
+}
+
+void FuConstructBezierPolygon::Deactivate()
+{
+ mpView->EnableExtendedMouseEventDispatcher(false);
+
+ FuConstruct::Deactivate();
+}
+
+void FuConstructBezierPolygon::SelectionHasChanged()
+{
+ FuDraw::SelectionHasChanged();
+
+ mpViewShell->GetViewShellBase().GetToolBarManager()->SelectionHasChanged(
+ *mpViewShell,
+ *mpView);
+}
+
+namespace {
+/// Returns the color based on the color names listed in core/include/tools/color.hxx
+/// Feel free to extend with more color names from color.hxx
+Color strToColor(std::u16string_view sColor)
+{
+ Color aColor = COL_AUTO;
+
+ if (sColor == u"COL_GRAY")
+ aColor = COL_GRAY;
+ else if (sColor == u"COL_GRAY3")
+ aColor = COL_GRAY3;
+ else if (sColor == u"COL_GRAY7")
+ aColor = COL_GRAY7;
+
+ return aColor;
+}
+}
+
+void FuConstructBezierPolygon::SetAttributes(SfxItemSet& rAttr, SdrObject *pObj)
+{
+ if (nSlotId == SID_DRAW_FREELINE_NOFILL)
+ {
+ if (mnTransparence > 0 && mnTransparence <= 100)
+ rAttr.Put(XLineTransparenceItem(mnTransparence));
+ if (!msColor.isEmpty())
+ rAttr.Put(XLineColorItem(OUString(), strToColor(msColor)));
+ if (mnWidth > 0)
+ rAttr.Put(XLineWidthItem(mnWidth));
+ if (!msShapeName.isEmpty())
+ pObj->SetName(msShapeName);
+ }
+}
+
+/**
+ * Set current bezier edit mode
+ */
+void FuConstructBezierPolygon::SetEditMode(sal_uInt16 nMode)
+{
+ nEditMode = nMode;
+ ForcePointer();
+
+ SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings();
+ rBindings.Invalidate(SID_BEZIER_MOVE);
+ rBindings.Invalidate(SID_BEZIER_INSERT);
+}
+
+SdrObjectUniquePtr FuConstructBezierPolygon::CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle)
+{
+ // case SID_DRAW_POLYGON:
+ // case SID_DRAW_POLYGON_NOFILL:
+ // case SID_DRAW_XPOLYGON:
+ // case SID_DRAW_XPOLYGON_NOFILL:
+ // case SID_DRAW_FREELINE:
+ // case SID_DRAW_FREELINE_NOFILL:
+ // case SID_DRAW_BEZIER_FILL: // BASIC
+ // case SID_DRAW_BEZIER_NOFILL: // BASIC
+
+ SdrObjectUniquePtr pObj(SdrObjFactory::MakeNewObject(
+ mpView->getSdrModelFromSdrView(),
+ mpView->GetCurrentObjInventor(),
+ mpView->GetCurrentObjIdentifier()));
+
+ if(pObj)
+ {
+ if( auto pPathObj = dynamic_cast< SdrPathObj *>( pObj.get() ) )
+ {
+ basegfx::B2DPolyPolygon aPoly;
+
+ switch(nID)
+ {
+ case SID_DRAW_BEZIER_FILL:
+ {
+ const sal_Int32 nWdt(rRectangle.GetWidth() / 2);
+ const sal_Int32 nHgt(rRectangle.GetHeight() / 2);
+ const basegfx::B2DPolygon aInnerPoly(basegfx::utils::createPolygonFromEllipse(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y()), nWdt, nHgt));
+
+ aPoly.append(aInnerPoly);
+ break;
+ }
+ case SID_DRAW_BEZIER_NOFILL:
+ {
+ basegfx::B2DPolygon aInnerPoly;
+
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom()));
+
+ const basegfx::B2DPoint aCenterBottom(rRectangle.Center().X(), rRectangle.Bottom());
+ aInnerPoly.appendBezierSegment(
+ aCenterBottom,
+ aCenterBottom,
+ basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y()));
+
+ const basegfx::B2DPoint aCenterTop(rRectangle.Center().X(), rRectangle.Top());
+ aInnerPoly.appendBezierSegment(
+ aCenterTop,
+ aCenterTop,
+ basegfx::B2DPoint(rRectangle.Right(), rRectangle.Top()));
+
+ aPoly.append(aInnerPoly);
+ break;
+ }
+ case SID_DRAW_FREELINE:
+ case SID_DRAW_FREELINE_NOFILL:
+ {
+ basegfx::B2DPolygon aInnerPoly;
+
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom()));
+
+ aInnerPoly.appendBezierSegment(
+ basegfx::B2DPoint(rRectangle.Left(), rRectangle.Top()),
+ basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Top()),
+ basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y()));
+
+ aInnerPoly.appendBezierSegment(
+ basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Bottom()),
+ basegfx::B2DPoint(rRectangle.Right(), rRectangle.Bottom()),
+ basegfx::B2DPoint(rRectangle.Right(), rRectangle.Top()));
+
+ if(SID_DRAW_FREELINE == nID)
+ {
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Right(), rRectangle.Bottom()));
+ }
+ else
+ {
+ aInnerPoly.setClosed(true);
+ }
+
+ aPoly.append(aInnerPoly);
+ break;
+ }
+ case SID_DRAW_XPOLYGON:
+ case SID_DRAW_XPOLYGON_NOFILL:
+ {
+ basegfx::B2DPolygon aInnerPoly;
+
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom()));
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Top()));
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Top()));
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y()));
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Right(), rRectangle.Center().Y()));
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Right(), rRectangle.Bottom()));
+
+ if(SID_DRAW_XPOLYGON_NOFILL == nID)
+ {
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Bottom()));
+ }
+ else
+ {
+ aInnerPoly.setClosed(true);
+ }
+
+ aPoly.append(aInnerPoly);
+ break;
+ }
+ case SID_DRAW_POLYGON:
+ case SID_DRAW_POLYGON_NOFILL:
+ {
+ basegfx::B2DPolygon aInnerPoly;
+ const sal_Int32 nWdt(rRectangle.GetWidth());
+ const sal_Int32 nHgt(rRectangle.GetHeight());
+
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom()));
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 30) / 100, rRectangle.Top() + (nHgt * 70) / 100));
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Top() + (nHgt * 15) / 100));
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 65) / 100, rRectangle.Top()));
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + nWdt, rRectangle.Top() + (nHgt * 30) / 100));
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 80) / 100, rRectangle.Top() + (nHgt * 50) / 100));
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 80) / 100, rRectangle.Top() + (nHgt * 75) / 100));
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Bottom(), rRectangle.Right()));
+
+ if(SID_DRAW_POLYGON_NOFILL == nID)
+ {
+ aInnerPoly.append(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Bottom()));
+ }
+ else
+ {
+ aInnerPoly.setClosed(true);
+ }
+
+ aPoly.append(aInnerPoly);
+ break;
+ }
+ }
+
+ pPathObj->SetPathPoly(aPoly);
+ }
+ else
+ {
+ OSL_FAIL("Object is NO path object");
+ }
+
+ pObj->SetLogicRect(rRectangle);
+ }
+
+ return pObj;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuconcs.cxx b/sd/source/ui/func/fuconcs.cxx
new file mode 100644
index 000000000..806960dd2
--- /dev/null
+++ b/sd/source/ui/func/fuconcs.cxx
@@ -0,0 +1,261 @@
+/* -*- 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 <fuconcs.hxx>
+#include <rtl/ustring.hxx>
+
+#include <svx/svxids.hrc>
+
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/request.hxx>
+#include <editeng/adjustitem.hxx>
+#include <editeng/eeitem.hxx>
+#include <svx/svdoashp.hxx>
+#include <svx/sdtagitm.hxx>
+
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <ToolBarManager.hxx>
+#include <svx/gallery.hxx>
+#include <svx/sdooitm.hxx>
+#include <svl/itempool.hxx>
+#include <svl/stritem.hxx>
+
+#include <View.hxx>
+#include <Window.hxx>
+#include <drawdoc.hxx>
+
+namespace sd {
+
+
+FuConstructCustomShape::FuConstructCustomShape (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq ) :
+ FuConstruct(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuConstructCustomShape::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent )
+{
+ FuConstructCustomShape* pFunc;
+ rtl::Reference<FuPoor> xFunc( pFunc = new FuConstructCustomShape( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ pFunc->SetPermanent( bPermanent );
+ return xFunc;
+}
+
+void FuConstructCustomShape::DoExecute( SfxRequest& rReq )
+{
+ FuConstruct::DoExecute( rReq );
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ if ( pArgs )
+ {
+ const SfxStringItem& rItm = static_cast<const SfxStringItem&>(pArgs->Get( rReq.GetSlot() ));
+ aCustomShape = rItm.GetValue();
+ }
+
+ mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBar(
+ ToolBarManager::ToolBarGroup::Function,
+ ToolBarManager::msDrawingObjectToolBar);
+}
+
+bool FuConstructCustomShape::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ bool bReturn = FuConstruct::MouseButtonDown(rMEvt);
+
+ if ( rMEvt.IsLeft() && !mpView->IsAction() )
+ {
+ Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
+
+ mpWindow->CaptureMouse();
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+
+ mpView->BegCreateObj(aPnt, nullptr, nDrgLog);
+
+ SdrObject* pObj = mpView->GetCreateObj();
+ if ( pObj )
+ {
+ SetAttributes( pObj );
+ bool bForceFillStyle = true;
+ bool bForceNoFillStyle = false;
+ if ( static_cast<SdrObjCustomShape*>(pObj)->UseNoFillStyle() )
+ {
+ bForceFillStyle = false;
+ bForceNoFillStyle = true;
+ }
+ SfxItemSet aAttr(mpDoc->GetPool());
+ SetStyleSheet( aAttr, pObj, bForceFillStyle, bForceNoFillStyle );
+ pObj->SetMergedItemSet(aAttr);
+ }
+ }
+
+ return bReturn;
+}
+
+bool FuConstructCustomShape::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ bool bReturn(false);
+
+ if(mpView->IsCreateObj() && rMEvt.IsLeft())
+ {
+ SdrObject* pObj = mpView->GetCreateObj();
+ if( pObj && mpView->EndCreateObj( SdrCreateCmd::ForceEnd ) )
+ {
+ bReturn = true;
+ }
+ else
+ {
+ //Drag was too small to create object, so insert default object at click pos
+ Point aClickPos(mpWindow->PixelToLogic(rMEvt.GetPosPixel()));
+ sal_uInt32 nDefaultObjectSize(1000);
+ sal_Int32 nCenterOffset(-sal_Int32(nDefaultObjectSize / 2));
+ aClickPos.AdjustX(nCenterOffset);
+ aClickPos.AdjustY(nCenterOffset);
+
+ SdrPageView *pPV = mpView->GetSdrPageView();
+ if(mpView->IsSnapEnabled())
+ aClickPos = mpView->GetSnapPos(aClickPos, pPV);
+
+ ::tools::Rectangle aNewObjectRectangle(aClickPos, Size(nDefaultObjectSize, nDefaultObjectSize));
+ SdrObjectUniquePtr pObjDefault = CreateDefaultObject(nSlotId, aNewObjectRectangle);
+
+ bReturn = mpView->InsertObjectAtView(pObjDefault.release(), *pPV);
+ }
+ }
+ bReturn = FuConstruct::MouseButtonUp (rMEvt) || bReturn;
+
+ if (!bPermanent)
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+
+ return bReturn;
+}
+
+void FuConstructCustomShape::Activate()
+{
+ mpView->SetCurrentObj( SdrObjKind::CustomShape );
+ FuConstruct::Activate();
+}
+
+/**
+ * set attribute for the object to be created
+ */
+void FuConstructCustomShape::SetAttributes( SdrObject* pObj )
+{
+ bool bAttributesAppliedFromGallery = false;
+
+ if ( GalleryExplorer::GetSdrObjCount( GALLERY_THEME_POWERPOINT ) )
+ {
+ std::vector< OUString > aObjList;
+ if ( GalleryExplorer::FillObjListTitle( GALLERY_THEME_POWERPOINT, aObjList ) )
+ {
+ for ( std::vector<OUString>::size_type i = 0; i < aObjList.size(); i++ )
+ {
+ if ( aObjList[ i ].equalsIgnoreAsciiCase( aCustomShape ) )
+ {
+ FmFormModel aFormModel;
+ SfxItemPool& rPool(aFormModel.GetItemPool());
+ rPool.FreezeIdRanges();
+
+ if ( GalleryExplorer::GetSdrObj( GALLERY_THEME_POWERPOINT, i, &aFormModel ) )
+ {
+ const SdrPage* pPage = aFormModel.GetPage( 0 );
+ if ( pPage )
+ {
+ const SdrObject* pSourceObj = pPage->GetObj( 0 );
+ if( pSourceObj )
+ {
+ const SfxItemSet& rSource = pSourceObj->GetMergedItemSet();
+ SfxItemSetFixed<
+ // Ranges from SdrAttrObj:
+ SDRATTR_START, SDRATTR_SHADOW_LAST,
+ SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST,
+ SDRATTR_TEXTDIRECTION,
+ SDRATTR_TEXTDIRECTION,
+ // Graphic attributes, 3D properties,
+ // CustomShape properties:
+ SDRATTR_GRAF_FIRST,
+ SDRATTR_CUSTOMSHAPE_LAST,
+ // Range from SdrTextObj:
+ EE_ITEMS_START, EE_ITEMS_END> aDest(pObj->getSdrModelFromSdrObject().GetItemPool());
+ aDest.Set( rSource );
+ pObj->SetMergedItemSet( aDest );
+ // Enables Word-wrap by default (tdf#134369)
+ pObj->SetMergedItem( SdrOnOffItem( SDRATTR_TEXT_WORDWRAP, true ) );
+ Degree100 nAngle = pSourceObj->GetRotateAngle();
+ if ( nAngle )
+ pObj->NbcRotate( pObj->GetSnapRect().Center(), nAngle );
+ bAttributesAppliedFromGallery = true;
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ if ( !bAttributesAppliedFromGallery )
+ {
+ pObj->SetMergedItem( SvxAdjustItem( SvxAdjust::Center, EE_PARA_JUST ) );
+ pObj->SetMergedItem( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_CENTER ) );
+ pObj->SetMergedItem( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_BLOCK ) );
+ pObj->SetMergedItem( makeSdrTextAutoGrowHeightItem( false ) );
+ static_cast<SdrObjCustomShape*>(pObj)->MergeDefaultAttributes( &aCustomShape );
+ }
+}
+
+const OUString& FuConstructCustomShape::GetShapeType() const
+{
+ return aCustomShape;
+}
+
+SdrObjectUniquePtr FuConstructCustomShape::CreateDefaultObject(const sal_uInt16, const ::tools::Rectangle& rRectangle)
+{
+ SdrObjectUniquePtr pObj(SdrObjFactory::MakeNewObject(
+ mpView->getSdrModelFromSdrView(),
+ mpView->GetCurrentObjInventor(),
+ mpView->GetCurrentObjIdentifier()));
+
+ if( pObj )
+ {
+ ::tools::Rectangle aRect( rRectangle );
+ if ( doConstructOrthogonal() )
+ ImpForceQuadratic( aRect );
+ pObj->SetLogicRect( aRect );
+ SetAttributes( pObj.get() );
+ SfxItemSet aAttr(mpDoc->GetPool());
+ SetStyleSheet(aAttr, pObj.get());
+ pObj->SetMergedItemSet(aAttr);
+ }
+ return pObj;
+}
+
+// #i33136#
+bool FuConstructCustomShape::doConstructOrthogonal() const
+{
+ return SdrObjCustomShape::doConstructOrthogonal(aCustomShape);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuconnct.cxx b/sd/source/ui/func/fuconnct.cxx
new file mode 100644
index 000000000..fc95b4907
--- /dev/null
+++ b/sd/source/ui/func/fuconnct.cxx
@@ -0,0 +1,71 @@
+/* -*- 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 <fuconnct.hxx>
+#include <sfx2/request.hxx>
+#include <View.hxx>
+#include <drawdoc.hxx>
+#include <svx/svxdlg.hxx>
+#include <svx/dialogs.hrc>
+
+namespace sd {
+
+
+FuConnectionDlg::FuConnectionDlg (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuConnectionDlg::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuConnectionDlg( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuConnectionDlg::DoExecute( SfxRequest& rReq )
+{
+ SfxItemSet aNewAttr( mpDoc->GetPool() );
+ mpView->GetAttributes( aNewAttr );
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ if( !pArgs )
+ {
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ ScopedVclPtr<SfxAbstractDialog> pDlg(pFact->CreateSfxDialog(rReq.GetFrameWeld(), aNewAttr, mpView, RID_SVXPAGE_CONNECTION));
+
+ if( pDlg->Execute() == RET_OK )
+ {
+ rReq.Done( *pDlg->GetOutputItemSet() );
+ pArgs = rReq.GetArgs();
+ }
+ }
+ if( pArgs )
+ mpView->SetAttributes( *pArgs );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuconrec.cxx b/sd/source/ui/func/fuconrec.cxx
new file mode 100644
index 000000000..d93ef2849
--- /dev/null
+++ b/sd/source/ui/func/fuconrec.cxx
@@ -0,0 +1,1096 @@
+/* -*- 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 <fuconrec.hxx>
+#include <svx/svdpagv.hxx>
+
+#include <svx/svxids.hrc>
+#include <svx/strings.hrc>
+#include <svx/dialmgr.hxx>
+
+#include <app.hrc>
+#include <svl/itemset.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/xlnstwit.hxx>
+#include <svx/xlnedwit.hxx>
+#include <svx/xlnedit.hxx>
+#include <svx/xlnstit.hxx>
+#include <svx/xlnwtit.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svx/sdtmfitm.hxx>
+#include <svx/sxekitm.hxx>
+#include <svx/sderitm.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/svdocirc.hxx>
+#include <svl/intitem.hxx>
+#include <sfx2/request.hxx>
+#include <editeng/adjustitem.hxx>
+#include <editeng/eeitem.hxx>
+#include <svx/xtable.hxx>
+#include <svx/xfltrit.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/sdtagitm.hxx>
+#include <svx/sdtditm.hxx>
+
+#include <svx/svdocapt.hxx>
+
+#include <svx/svdomeas.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <ToolBarManager.hxx>
+#include <editeng/writingmodeitem.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/signaturelinehelper.hxx>
+#include <osl/diagnose.h>
+
+#include <sdresid.hxx>
+#include <View.hxx>
+#include <sdpage.hxx>
+#include <Window.hxx>
+#include <drawdoc.hxx>
+#include <unokywds.hxx>
+
+#include <strings.hrc>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+
+FuConstructRectangle::FuConstructRectangle (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuConstruct(pViewSh, pWin, pView, pDoc, rReq)
+ , mnFillTransparence(0)
+ , mnLineStyle(SAL_MAX_UINT16)
+{
+}
+
+namespace{
+
+/// Checks to see if the request has a parameter of IsSticky:bool=true
+/// It means that the selected command/button will stay selected after use
+bool isSticky(const SfxRequest& rReq)
+{
+ const SfxItemSet *pArgs = rReq.GetArgs ();
+ if (pArgs)
+ {
+ const SfxBoolItem* pIsSticky = rReq.GetArg<SfxBoolItem>(FN_PARAM_4);
+ if (pIsSticky && pIsSticky->GetValue())
+ return true;
+ }
+
+ return false;
+}
+
+}
+
+rtl::Reference<FuPoor> FuConstructRectangle::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent )
+{
+ FuConstructRectangle* pFunc;
+ rtl::Reference<FuPoor> xFunc( pFunc = new FuConstructRectangle( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ pFunc->SetPermanent(bPermanent || isSticky(rReq));
+ return xFunc;
+}
+
+void FuConstructRectangle::DoExecute( SfxRequest& rReq )
+{
+ FuConstruct::DoExecute( rReq );
+
+ mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBar(
+ ToolBarManager::ToolBarGroup::Function,
+ ToolBarManager::msDrawingObjectToolBar);
+
+ const SfxItemSet *pArgs = rReq.GetArgs ();
+
+ if (pArgs)
+ {
+ switch (nSlotId)
+ {
+ case SID_DRAW_ELLIPSE :
+ {
+ const SfxUInt32Item* pCenterX = rReq.GetArg<SfxUInt32Item>(ID_VAL_CENTER_X);
+ const SfxUInt32Item* pCenterY = rReq.GetArg<SfxUInt32Item>(ID_VAL_CENTER_Y);
+ const SfxUInt32Item* pAxisX = rReq.GetArg<SfxUInt32Item>(ID_VAL_AXIS_X);
+ const SfxUInt32Item* pAxisY = rReq.GetArg<SfxUInt32Item>(ID_VAL_AXIS_Y);
+
+ if (!pCenterX || !pCenterY || !pAxisX || !pAxisY)
+ break;
+
+ ::tools::Rectangle aNewRectangle (pCenterX->GetValue () - pAxisX->GetValue () / 2,
+ pCenterY->GetValue () - pAxisY->GetValue () / 2,
+ pCenterX->GetValue () + pAxisX->GetValue () / 2,
+ pCenterY->GetValue () + pAxisY->GetValue () / 2);
+ SdrCircObj *pNewCircle = new SdrCircObj(
+ mpView->getSdrModelFromSdrView(),
+ SdrCircKind::Full,
+ aNewRectangle);
+ SdrPageView *pPV = mpView->GetSdrPageView();
+
+ mpView->InsertObjectAtView(pNewCircle, *pPV, SdrInsertFlags::SETDEFLAYER | SdrInsertFlags::SETDEFATTR);
+ }
+ break;
+
+ case SID_DRAW_RECT :
+ {
+ const SfxUInt32Item* pMouseStartX = rReq.GetArg<SfxUInt32Item>(ID_VAL_MOUSESTART_X);
+ const SfxUInt32Item* pMouseStartY = rReq.GetArg<SfxUInt32Item>(ID_VAL_MOUSESTART_Y);
+ const SfxUInt32Item* pMouseEndX = rReq.GetArg<SfxUInt32Item>(ID_VAL_MOUSEEND_X);
+ const SfxUInt32Item* pMouseEndY = rReq.GetArg<SfxUInt32Item>(ID_VAL_MOUSEEND_Y);
+ const SfxUInt16Item* pFillTransparence = rReq.GetArg<SfxUInt16Item>(FN_PARAM_1);
+ const SfxStringItem* pFillColor = rReq.GetArg<SfxStringItem>(FN_PARAM_2);
+ const SfxUInt16Item* pLineStyle = rReq.GetArg<SfxUInt16Item>(FN_PARAM_3);
+ const SfxStringItem* pShapeName = rReq.GetArg<SfxStringItem>(SID_SHAPE_NAME);
+
+ if (pFillTransparence && pFillTransparence->GetValue() > 0)
+ {
+ mnFillTransparence = pFillTransparence->GetValue();
+ }
+ if (pFillColor && !pFillColor->GetValue().isEmpty())
+ {
+ msFillColor = pFillColor->GetValue();
+ }
+ if (pLineStyle)
+ {
+ mnLineStyle = pLineStyle->GetValue();
+ }
+ if (pShapeName && !pShapeName->GetValue().isEmpty())
+ {
+ msShapeName = pShapeName->GetValue();
+ }
+
+ if (!pMouseStartX || !pMouseStartY || !pMouseEndX || !pMouseEndY)
+ break;
+
+ ::tools::Rectangle aNewRectangle (pMouseStartX->GetValue (),
+ pMouseStartY->GetValue (),
+ pMouseEndX->GetValue (),
+ pMouseEndY->GetValue ());
+ SdrRectObj *pNewRect = new SdrRectObj(
+ mpView->getSdrModelFromSdrView(),
+ aNewRectangle);
+ SdrPageView *pPV = mpView->GetSdrPageView();
+
+ mpView->InsertObjectAtView(pNewRect, *pPV, SdrInsertFlags::SETDEFLAYER | SdrInsertFlags::SETDEFATTR);
+ }
+ break;
+ }
+ }
+
+ if (nSlotId == SID_TOOL_CONNECTOR ||
+ nSlotId == SID_CONNECTOR_ARROW_START ||
+ nSlotId == SID_CONNECTOR_ARROW_END ||
+ nSlotId == SID_CONNECTOR_ARROWS ||
+ nSlotId == SID_CONNECTOR_CIRCLE_START ||
+ nSlotId == SID_CONNECTOR_CIRCLE_END ||
+ nSlotId == SID_CONNECTOR_CIRCLES ||
+ nSlotId == SID_CONNECTOR_LINE ||
+ nSlotId == SID_CONNECTOR_LINE_ARROW_START ||
+ nSlotId == SID_CONNECTOR_LINE_ARROW_END ||
+ nSlotId == SID_CONNECTOR_LINE_ARROWS ||
+ nSlotId == SID_CONNECTOR_LINE_CIRCLE_START ||
+ nSlotId == SID_CONNECTOR_LINE_CIRCLE_END ||
+ nSlotId == SID_CONNECTOR_LINE_CIRCLES ||
+ nSlotId == SID_CONNECTOR_CURVE ||
+ nSlotId == SID_CONNECTOR_CURVE_ARROW_START ||
+ nSlotId == SID_CONNECTOR_CURVE_ARROW_END ||
+ nSlotId == SID_CONNECTOR_CURVE_ARROWS ||
+ nSlotId == SID_CONNECTOR_CURVE_CIRCLE_START ||
+ nSlotId == SID_CONNECTOR_CURVE_CIRCLE_END ||
+ nSlotId == SID_CONNECTOR_CURVE_CIRCLES ||
+ nSlotId == SID_CONNECTOR_LINES ||
+ nSlotId == SID_CONNECTOR_LINES_ARROW_START ||
+ nSlotId == SID_CONNECTOR_LINES_ARROW_END ||
+ nSlotId == SID_CONNECTOR_LINES_ARROWS ||
+ nSlotId == SID_CONNECTOR_LINES_CIRCLE_START ||
+ nSlotId == SID_CONNECTOR_LINES_CIRCLE_END ||
+ nSlotId == SID_CONNECTOR_LINES_CIRCLES ||
+ nSlotId == SID_LINE_ARROW_START ||
+ nSlotId == SID_LINE_ARROW_END ||
+ nSlotId == SID_LINE_ARROWS ||
+ nSlotId == SID_LINE_ARROW_CIRCLE ||
+ nSlotId == SID_LINE_CIRCLE_ARROW ||
+ nSlotId == SID_LINE_ARROW_SQUARE ||
+ nSlotId == SID_LINE_SQUARE_ARROW )
+ {
+ mpView->UnmarkAll();
+ }
+}
+
+bool FuConstructRectangle::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ bool bReturn = FuConstruct::MouseButtonDown(rMEvt);
+
+ if ( rMEvt.IsLeft() && !mpView->IsAction() )
+ {
+ Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
+
+ mpWindow->CaptureMouse();
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+
+ if (mpView->GetCurrentObjIdentifier() == SdrObjKind::Caption)
+ {
+ Size aCaptionSize(846, 846); // (4x2)cm
+ bReturn = mpView->BegCreateCaptionObj(aPnt, aCaptionSize,
+ nullptr, nDrgLog);
+ }
+ else
+ {
+ mpView->BegCreateObj(aPnt, nullptr, nDrgLog);
+ }
+
+ SdrObject* pObj = mpView->GetCreateObj();
+
+ if (pObj)
+ {
+ SfxItemSet aAttr(mpDoc->GetPool());
+ SetStyleSheet(aAttr, pObj);
+ SetAttributes(aAttr, pObj);
+ SetLineEnds(aAttr, *pObj);
+ pObj->SetMergedItemSet(aAttr);
+
+ if( nSlotId == SID_DRAW_CAPTION_VERTICAL )
+ static_cast<SdrTextObj*>(pObj)->SetVerticalWriting( true );
+ }
+ }
+ return bReturn;
+}
+
+bool FuConstructRectangle::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ bool bReturn(false);
+
+ if(mpView->IsCreateObj() && rMEvt.IsLeft())
+ {
+ SdrObject* pObj = mpView->GetCreateObj();
+
+ if(pObj && mpView->EndCreateObj(SdrCreateCmd::ForceEnd))
+ {
+ if(SID_DRAW_MEASURELINE == nSlotId)
+ {
+ SdrLayerAdmin& rAdmin = mpDoc->GetLayerAdmin();
+ pObj->SetLayer(rAdmin.GetLayerID(sUNO_LayerName_measurelines));
+ }
+
+ // init text position when vertical caption object is created
+ if( dynamic_cast< const SdrCaptionObj *>( pObj ) != nullptr && SID_DRAW_CAPTION_VERTICAL == nSlotId)
+ {
+ // draw text object, needs to be initialized when vertical text is used
+ SfxItemSet aSet(pObj->GetMergedItemSet());
+
+ aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_CENTER));
+ aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
+
+ // Correct the value of SDRATTR_TEXTDIRECTION to avoid SetItemSet
+ // calling SetVerticalWriting() again since this item may not yet
+ // be set at the object and thus may differ from vertical state of
+ // the object.
+ aSet.Put(SvxWritingModeItem(css::text::WritingMode_TB_RL, SDRATTR_TEXTDIRECTION));
+ pObj->SetMergedItemSet(aSet);
+ }
+
+ bReturn = true;
+ }
+ else
+ {
+ //Drag was too small to create object, so insert default object at click pos
+ Point aClickPos(mpWindow->PixelToLogic(rMEvt.GetPosPixel()));
+ sal_uInt32 nDefaultObjectSize(1500);
+ sal_Int32 nCenterOffset(-sal_Int32(nDefaultObjectSize / 2));
+ aClickPos.AdjustX(nCenterOffset);
+ aClickPos.AdjustY(nCenterOffset);
+
+ SdrPageView *pPV = mpView->GetSdrPageView();
+ if(mpView->IsSnapEnabled())
+ aClickPos = mpView->GetSnapPos(aClickPos, pPV);
+
+ ::tools::Rectangle aNewObjectRectangle(aClickPos, Size(nDefaultObjectSize, nDefaultObjectSize));
+ SdrObjectUniquePtr pObjDefault = CreateDefaultObject(nSlotId, aNewObjectRectangle);
+
+ bReturn = mpView->InsertObjectAtView(pObjDefault.release(), *pPV);
+ }
+ }
+
+ bReturn = FuConstruct::MouseButtonUp (rMEvt) || bReturn;
+
+ if (!bPermanent)
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+
+ return bReturn;
+}
+
+void FuConstructRectangle::Activate()
+{
+ SdrObjKind aObjKind;
+
+ switch (nSlotId)
+ {
+ case SID_LINE_ARROW_START:
+ case SID_LINE_ARROW_END:
+ case SID_LINE_ARROWS:
+ case SID_LINE_ARROW_CIRCLE:
+ case SID_LINE_CIRCLE_ARROW:
+ case SID_LINE_ARROW_SQUARE:
+ case SID_LINE_SQUARE_ARROW:
+ mpView->SetGlueVisible();
+ [[fallthrough]];
+ case SID_DRAW_LINE :
+ case SID_DRAW_XLINE:
+ aObjKind = SdrObjKind::Line;
+ break;
+
+ case SID_DRAW_MEASURELINE:
+ {
+ aObjKind = SdrObjKind::Measure;
+ }
+ break;
+
+ case SID_DRAW_RECT :
+ case SID_DRAW_RECT_NOFILL :
+ case SID_DRAW_RECT_ROUND :
+ case SID_DRAW_RECT_ROUND_NOFILL:
+ case SID_DRAW_SQUARE :
+ case SID_DRAW_SQUARE_NOFILL :
+ case SID_DRAW_SQUARE_ROUND :
+ case SID_DRAW_SQUARE_ROUND_NOFILL:
+ {
+ aObjKind = SdrObjKind::Rectangle;
+ }
+ break;
+
+ case SID_DRAW_ELLIPSE :
+ case SID_DRAW_ELLIPSE_NOFILL:
+ case SID_DRAW_CIRCLE :
+ case SID_DRAW_CIRCLE_NOFILL :
+ {
+ aObjKind = SdrObjKind::CircleOrEllipse;
+ }
+ break;
+
+ case SID_DRAW_CAPTION:
+ case SID_DRAW_CAPTION_VERTICAL:
+ {
+ aObjKind = SdrObjKind::Caption;
+ }
+ break;
+
+ case SID_TOOL_CONNECTOR:
+ case SID_CONNECTOR_ARROW_START:
+ case SID_CONNECTOR_ARROW_END:
+ case SID_CONNECTOR_ARROWS:
+ case SID_CONNECTOR_CIRCLE_START:
+ case SID_CONNECTOR_CIRCLE_END:
+ case SID_CONNECTOR_CIRCLES:
+ case SID_CONNECTOR_LINE:
+ case SID_CONNECTOR_LINE_ARROW_START:
+ case SID_CONNECTOR_LINE_ARROW_END:
+ case SID_CONNECTOR_LINE_ARROWS:
+ case SID_CONNECTOR_LINE_CIRCLE_START:
+ case SID_CONNECTOR_LINE_CIRCLE_END:
+ case SID_CONNECTOR_LINE_CIRCLES:
+ case SID_CONNECTOR_CURVE:
+ case SID_CONNECTOR_CURVE_ARROW_START:
+ case SID_CONNECTOR_CURVE_ARROW_END:
+ case SID_CONNECTOR_CURVE_ARROWS:
+ case SID_CONNECTOR_CURVE_CIRCLE_START:
+ case SID_CONNECTOR_CURVE_CIRCLE_END:
+ case SID_CONNECTOR_CURVE_CIRCLES:
+ case SID_CONNECTOR_LINES:
+ case SID_CONNECTOR_LINES_ARROW_START:
+ case SID_CONNECTOR_LINES_ARROW_END:
+ case SID_CONNECTOR_LINES_ARROWS:
+ case SID_CONNECTOR_LINES_CIRCLE_START:
+ case SID_CONNECTOR_LINES_CIRCLE_END:
+ case SID_CONNECTOR_LINES_CIRCLES:
+ {
+ aObjKind = SdrObjKind::Edge;
+ mpView->SetGlueVisible();
+ }
+ break;
+ case SID_INSERT_SIGNATURELINE:
+ {
+ aObjKind = SdrObjKind::Graphic;
+ }
+ break;
+
+ default:
+ {
+ aObjKind = SdrObjKind::Rectangle;
+ }
+ break;
+ }
+
+ mpView->SetCurrentObj(aObjKind);
+
+ FuConstruct::Activate();
+}
+
+void FuConstructRectangle::Deactivate()
+{
+ if( nSlotId == SID_TOOL_CONNECTOR ||
+ nSlotId == SID_CONNECTOR_ARROW_START ||
+ nSlotId == SID_CONNECTOR_ARROW_END ||
+ nSlotId == SID_CONNECTOR_ARROWS ||
+ nSlotId == SID_CONNECTOR_CIRCLE_START ||
+ nSlotId == SID_CONNECTOR_CIRCLE_END ||
+ nSlotId == SID_CONNECTOR_CIRCLES ||
+ nSlotId == SID_CONNECTOR_LINE ||
+ nSlotId == SID_CONNECTOR_LINE_ARROW_START ||
+ nSlotId == SID_CONNECTOR_LINE_ARROW_END ||
+ nSlotId == SID_CONNECTOR_LINE_ARROWS ||
+ nSlotId == SID_CONNECTOR_LINE_CIRCLE_START ||
+ nSlotId == SID_CONNECTOR_LINE_CIRCLE_END ||
+ nSlotId == SID_CONNECTOR_LINE_CIRCLES ||
+ nSlotId == SID_CONNECTOR_CURVE ||
+ nSlotId == SID_CONNECTOR_CURVE_ARROW_START ||
+ nSlotId == SID_CONNECTOR_CURVE_ARROW_END ||
+ nSlotId == SID_CONNECTOR_CURVE_ARROWS ||
+ nSlotId == SID_CONNECTOR_CURVE_CIRCLE_START ||
+ nSlotId == SID_CONNECTOR_CURVE_CIRCLE_END ||
+ nSlotId == SID_CONNECTOR_CURVE_CIRCLES ||
+ nSlotId == SID_CONNECTOR_LINES ||
+ nSlotId == SID_CONNECTOR_LINES_ARROW_START ||
+ nSlotId == SID_CONNECTOR_LINES_ARROW_END ||
+ nSlotId == SID_CONNECTOR_LINES_ARROWS ||
+ nSlotId == SID_CONNECTOR_LINES_CIRCLE_START ||
+ nSlotId == SID_CONNECTOR_LINES_CIRCLE_END ||
+ nSlotId == SID_CONNECTOR_LINES_CIRCLES ||
+ nSlotId == SID_LINE_ARROW_START ||
+ nSlotId == SID_LINE_ARROW_END ||
+ nSlotId == SID_LINE_ARROWS ||
+ nSlotId == SID_LINE_ARROW_CIRCLE ||
+ nSlotId == SID_LINE_CIRCLE_ARROW ||
+ nSlotId == SID_LINE_ARROW_SQUARE ||
+ nSlotId == SID_LINE_SQUARE_ARROW )
+ {
+ mpView->SetGlueVisible( false );
+ }
+ FuConstruct::Deactivate();
+
+ if (nSlotId != SID_INSERT_SIGNATURELINE)
+ {
+ return;
+ }
+
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ if (rMarkList.GetMarkCount() < 1)
+ {
+ // Just switching pages, no signature rectangle yet.
+ return;
+ }
+
+ // Finished drawing a signature rectangle, now set it up.
+ if (!mpViewShell)
+ {
+ return;
+ }
+
+ uno::Reference<security::XCertificate> xCertificate
+ = svx::SignatureLineHelper::getSignatureCertificate(mpViewShell->GetObjectShell(),
+ mpViewShell->GetFrameWeld());
+ if (!xCertificate.is())
+ {
+ return;
+ }
+
+ svx::SignatureLineHelper::setShapeCertificate(mpView, xCertificate);
+
+ // Update infobar to offer "finish signing".
+ SfxViewFrame* pFrame = mpViewShell->GetViewFrame();
+ if (pFrame && pFrame->HasInfoBarWithID(u"readonly"))
+ {
+ pFrame->RemoveInfoBar(u"readonly");
+ pFrame->AppendReadOnlyInfobar();
+ }
+}
+
+namespace {
+/// Returns the color based on the color names listed in core/include/tools/color.hxx
+/// Feel free to extend with more color names from color.hxx
+Color strToColor(std::u16string_view sColor)
+{
+ Color aColor = COL_AUTO;
+
+ if (sColor == u"COL_GRAY")
+ aColor = COL_GRAY;
+ else if (sColor == u"COL_GRAY3")
+ aColor = COL_GRAY3;
+ else if (sColor == u"COL_GRAY7")
+ aColor = COL_GRAY7;
+
+ return aColor;
+}
+}
+
+/**
+ * set attribute for the object to be created
+ */
+void FuConstructRectangle::SetAttributes(SfxItemSet& rAttr, SdrObject* pObj)
+{
+ if (nSlotId == SID_DRAW_RECT_ROUND ||
+ nSlotId == SID_DRAW_RECT_ROUND_NOFILL ||
+ nSlotId == SID_DRAW_SQUARE_ROUND ||
+ nSlotId == SID_DRAW_SQUARE_ROUND_NOFILL)
+ {
+ // round corner
+ rAttr.Put(makeSdrEckenradiusItem(500));
+ }
+ else if (nSlotId == SID_CONNECTOR_LINE ||
+ nSlotId == SID_CONNECTOR_LINE_ARROW_START ||
+ nSlotId == SID_CONNECTOR_LINE_ARROW_END ||
+ nSlotId == SID_CONNECTOR_LINE_ARROWS ||
+ nSlotId == SID_CONNECTOR_LINE_CIRCLE_START ||
+ nSlotId == SID_CONNECTOR_LINE_CIRCLE_END ||
+ nSlotId == SID_CONNECTOR_LINE_CIRCLES)
+ {
+ // direct connector
+ rAttr.Put(SdrEdgeKindItem(SdrEdgeKind::OneLine));
+ }
+ else if (nSlotId == SID_CONNECTOR_LINES ||
+ nSlotId == SID_CONNECTOR_LINES_ARROW_START ||
+ nSlotId == SID_CONNECTOR_LINES_ARROW_END ||
+ nSlotId == SID_CONNECTOR_LINES_ARROWS ||
+ nSlotId == SID_CONNECTOR_LINES_CIRCLE_START ||
+ nSlotId == SID_CONNECTOR_LINES_CIRCLE_END ||
+ nSlotId == SID_CONNECTOR_LINES_CIRCLES)
+ {
+ // line connector
+ rAttr.Put(SdrEdgeKindItem(SdrEdgeKind::ThreeLines));
+ }
+ else if (nSlotId == SID_CONNECTOR_CURVE ||
+ nSlotId == SID_CONNECTOR_CURVE_ARROW_START ||
+ nSlotId == SID_CONNECTOR_CURVE_ARROW_END ||
+ nSlotId == SID_CONNECTOR_CURVE_ARROWS ||
+ nSlotId == SID_CONNECTOR_CURVE_CIRCLE_START ||
+ nSlotId == SID_CONNECTOR_CURVE_CIRCLE_END ||
+ nSlotId == SID_CONNECTOR_CURVE_CIRCLES)
+ {
+ // curve connector
+ rAttr.Put(SdrEdgeKindItem(SdrEdgeKind::Bezier));
+ }
+ else if ( nSlotId == SID_DRAW_CAPTION || nSlotId == SID_DRAW_CAPTION_VERTICAL )
+ {
+ // legend object
+ Size aSize(pObj->GetLogicRect().GetSize());
+ rAttr.Put( makeSdrTextMinFrameHeightItem( aSize.Height() ) );
+ rAttr.Put( makeSdrTextMinFrameWidthItem( aSize.Width() ) );
+ rAttr.Put( makeSdrTextAutoGrowHeightItem( true ) );
+ rAttr.Put( makeSdrTextAutoGrowWidthItem( true ) );
+
+ // Support full with for vertical caption objects, too
+ if(SID_DRAW_CAPTION == nSlotId)
+ rAttr.Put( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_BLOCK ) );
+ else
+ rAttr.Put( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_BLOCK ) );
+
+ rAttr.Put( SvxAdjustItem( SvxAdjust::Center, EE_PARA_JUST ) );
+ rAttr.Put( makeSdrTextLeftDistItem( 100 ) );
+ rAttr.Put( makeSdrTextRightDistItem( 100 ) );
+ rAttr.Put( makeSdrTextUpperDistItem( 100 ) );
+ rAttr.Put( makeSdrTextLowerDistItem( 100 ) );
+ }
+ else if (nSlotId == SID_DRAW_MEASURELINE)
+ {
+ // dimension line
+ SdPage* pPage = static_cast<SdPage*>( mpView->GetSdrPageView()->GetPage() );
+ OUString aName(SdResId(STR_POOLSHEET_MEASURE));
+ SfxStyleSheet* pSheet(
+ static_cast< SfxStyleSheet* >(
+ pPage->getSdrModelFromSdrPage().GetStyleSheetPool()->Find(aName, SfxStyleFamily::Para)));
+ DBG_ASSERT(pSheet, "StyleSheet missing");
+
+ if (pSheet)
+ {
+ pObj->SetStyleSheet(pSheet, false);
+ }
+
+ SdrLayerAdmin& rAdmin = mpDoc->GetLayerAdmin();
+ pObj->SetLayer(rAdmin.GetLayerID(sUNO_LayerName_measurelines));
+ }
+ else if (nSlotId == SID_DRAW_RECT)
+ {
+ if (mnFillTransparence > 0 && mnFillTransparence <= 100)
+ rAttr.Put(XFillTransparenceItem(mnFillTransparence));
+ if (!msFillColor.isEmpty())
+ rAttr.Put(XFillColorItem(OUString(), strToColor(msFillColor)));
+ if (!msShapeName.isEmpty())
+ pObj->SetName(msShapeName);
+
+ switch(mnLineStyle)
+ {
+ case 0:
+ rAttr.Put( XLineStyleItem(css::drawing::LineStyle_NONE ) );
+ break;
+ case 1:
+ rAttr.Put( XLineStyleItem(css::drawing::LineStyle_SOLID ) );
+ break;
+ case 2:
+ rAttr.Put( XLineStyleItem(css::drawing::LineStyle_DASH ) );
+ break;
+ default:
+ // Leave it to the defaults
+ break;
+ }
+ }
+ else if (nSlotId == SID_INSERT_SIGNATURELINE)
+ {
+ // Avoid the default solid fill and line, we'll set a graphic instead.
+ rAttr.Put(XFillStyleItem(drawing::FillStyle_NONE));
+ rAttr.Put(XLineStyleItem(drawing::LineStyle_NONE));
+ }
+}
+
+/**
+ * set line starts and ends for the object to be created
+ */
+static ::basegfx::B2DPolyPolygon getPolygon(TranslateId pResId, const SdrModel& rModel)
+{
+ ::basegfx::B2DPolyPolygon aRetval;
+ XLineEndListRef pLineEndList(rModel.GetLineEndList());
+
+ if( pLineEndList.is() )
+ {
+ OUString aArrowName(SvxResId(pResId));
+ ::tools::Long nCount = pLineEndList->Count();
+ ::tools::Long nIndex;
+ for( nIndex = 0; nIndex < nCount; nIndex++ )
+ {
+ const XLineEndEntry* pEntry = pLineEndList->GetLineEnd(nIndex);
+ if( pEntry->GetName() == aArrowName )
+ {
+ aRetval = pEntry->GetLineEnd();
+ break;
+ }
+ }
+ }
+
+ return aRetval;
+}
+
+void FuConstructRectangle::SetLineEnds(SfxItemSet& rAttr, SdrObject const & rObj)
+{
+ if ( !((rObj.GetObjIdentifier() == SdrObjKind::Edge &&
+ nSlotId != SID_TOOL_CONNECTOR &&
+ nSlotId != SID_CONNECTOR_LINE &&
+ nSlotId != SID_CONNECTOR_LINES &&
+ nSlotId != SID_CONNECTOR_CURVE) ||
+ nSlotId == SID_LINE_ARROW_START ||
+ nSlotId == SID_LINE_ARROW_END ||
+ nSlotId == SID_LINE_ARROWS ||
+ nSlotId == SID_LINE_ARROW_CIRCLE ||
+ nSlotId == SID_LINE_CIRCLE_ARROW ||
+ nSlotId == SID_LINE_ARROW_SQUARE ||
+ nSlotId == SID_LINE_SQUARE_ARROW) )
+ return;
+
+ // set attributes of line start and ends
+ SdrModel& rModel(rObj.getSdrModelFromSdrObject());
+
+ // arrowhead
+ ::basegfx::B2DPolyPolygon aArrow( getPolygon( RID_SVXSTR_ARROW, rModel ) );
+ if( !aArrow.count() )
+ {
+ ::basegfx::B2DPolygon aNewArrow;
+ aNewArrow.append(::basegfx::B2DPoint(10.0, 0.0));
+ aNewArrow.append(::basegfx::B2DPoint(0.0, 30.0));
+ aNewArrow.append(::basegfx::B2DPoint(20.0, 30.0));
+ aNewArrow.setClosed(true);
+ aArrow.append(aNewArrow);
+ }
+
+ // Circles
+ ::basegfx::B2DPolyPolygon aCircle( getPolygon( RID_SVXSTR_CIRCLE, rModel ) );
+ if( !aCircle.count() )
+ {
+ ::basegfx::B2DPolygon aNewCircle = ::basegfx::utils::createPolygonFromEllipse(::basegfx::B2DPoint(0.0, 0.0), 250.0, 250.0);
+ aNewCircle.setClosed(true);
+ aCircle.append(aNewCircle);
+ }
+
+ // Square
+ ::basegfx::B2DPolyPolygon aSquare( getPolygon( RID_SVXSTR_SQUARE, rModel ) );
+ if( !aSquare.count() )
+ {
+ ::basegfx::B2DPolygon aNewSquare;
+ aNewSquare.append(::basegfx::B2DPoint(0.0, 0.0));
+ aNewSquare.append(::basegfx::B2DPoint(10.0, 0.0));
+ aNewSquare.append(::basegfx::B2DPoint(10.0, 10.0));
+ aNewSquare.append(::basegfx::B2DPoint(0.0, 10.0));
+ aNewSquare.setClosed(true);
+ aSquare.append(aNewSquare);
+ }
+
+ SfxItemSet aSet( mpDoc->GetPool() );
+ mpView->GetAttributes( aSet );
+
+ // #i3908# Here, the default Line Start/End width for arrow construction is
+ // set. To have the same value in all situations (construction) in i3908
+ // it was decided to change the default to 0.03 cm for all situations.
+ ::tools::Long nWidth = 300; // (1/100th mm)
+
+ // determine line width and calculate with it the line end width
+ if( aSet.GetItemState( XATTR_LINEWIDTH ) != SfxItemState::DONTCARE )
+ {
+ ::tools::Long nValue = aSet.Get( XATTR_LINEWIDTH ).GetValue();
+ if( nValue > 0 )
+ nWidth = nValue * 3;
+ }
+
+ switch (nSlotId)
+ {
+ case SID_CONNECTOR_ARROWS:
+ case SID_CONNECTOR_LINE_ARROWS:
+ case SID_CONNECTOR_LINES_ARROWS:
+ case SID_CONNECTOR_CURVE_ARROWS:
+ case SID_LINE_ARROWS:
+ {
+ // connector with arrow ends
+ rAttr.Put(XLineStartItem(SvxResId(RID_SVXSTR_ARROW), aArrow));
+ rAttr.Put(XLineStartWidthItem(nWidth));
+ rAttr.Put(XLineEndItem(SvxResId(RID_SVXSTR_ARROW), aArrow));
+ rAttr.Put(XLineEndWidthItem(nWidth));
+ }
+ break;
+
+ case SID_CONNECTOR_ARROW_START:
+ case SID_CONNECTOR_LINE_ARROW_START:
+ case SID_CONNECTOR_LINES_ARROW_START:
+ case SID_CONNECTOR_CURVE_ARROW_START:
+ case SID_LINE_ARROW_START:
+ case SID_LINE_ARROW_CIRCLE:
+ case SID_LINE_ARROW_SQUARE:
+ {
+ // connector with arrow start
+ rAttr.Put(XLineStartItem(SvxResId(RID_SVXSTR_ARROW), aArrow));
+ rAttr.Put(XLineStartWidthItem(nWidth));
+ }
+ break;
+
+ case SID_CONNECTOR_ARROW_END:
+ case SID_CONNECTOR_LINE_ARROW_END:
+ case SID_CONNECTOR_LINES_ARROW_END:
+ case SID_CONNECTOR_CURVE_ARROW_END:
+ case SID_LINE_ARROW_END:
+ case SID_LINE_CIRCLE_ARROW:
+ case SID_LINE_SQUARE_ARROW:
+ {
+ // connector with arrow end
+ rAttr.Put(XLineEndItem(SvxResId(RID_SVXSTR_ARROW), aArrow));
+ rAttr.Put(XLineEndWidthItem(nWidth));
+ }
+ break;
+
+ case SID_CONNECTOR_CIRCLES:
+ case SID_CONNECTOR_LINE_CIRCLES:
+ case SID_CONNECTOR_LINES_CIRCLES:
+ case SID_CONNECTOR_CURVE_CIRCLES:
+ {
+ // connector with circle ends
+ rAttr.Put(XLineStartItem(SvxResId(RID_SVXSTR_CIRCLE), aCircle));
+ rAttr.Put(XLineStartWidthItem(nWidth));
+ rAttr.Put(XLineEndItem(SvxResId(RID_SVXSTR_CIRCLE), aCircle));
+ rAttr.Put(XLineEndWidthItem(nWidth));
+ }
+ break;
+
+ case SID_CONNECTOR_CIRCLE_START:
+ case SID_CONNECTOR_LINE_CIRCLE_START:
+ case SID_CONNECTOR_LINES_CIRCLE_START:
+ case SID_CONNECTOR_CURVE_CIRCLE_START:
+ {
+ // connector with circle start
+ rAttr.Put(XLineStartItem(SvxResId(RID_SVXSTR_CIRCLE), aCircle));
+ rAttr.Put(XLineStartWidthItem(nWidth));
+ }
+ break;
+
+ case SID_CONNECTOR_CIRCLE_END:
+ case SID_CONNECTOR_LINE_CIRCLE_END:
+ case SID_CONNECTOR_LINES_CIRCLE_END:
+ case SID_CONNECTOR_CURVE_CIRCLE_END:
+ {
+ // connector with circle ends
+ rAttr.Put(XLineEndItem(SvxResId(RID_SVXSTR_CIRCLE), aCircle));
+ rAttr.Put(XLineEndWidthItem(nWidth));
+ }
+ break;
+ }
+
+ // and again, for the still missing ends
+ switch (nSlotId)
+ {
+ case SID_LINE_ARROW_CIRCLE:
+ {
+ // circle end
+ rAttr.Put(XLineEndItem(SvxResId(RID_SVXSTR_CIRCLE), aCircle));
+ rAttr.Put(XLineEndWidthItem(nWidth));
+ }
+ break;
+
+ case SID_LINE_CIRCLE_ARROW:
+ {
+ // circle start
+ rAttr.Put(XLineStartItem(SvxResId(RID_SVXSTR_CIRCLE), aCircle));
+ rAttr.Put(XLineStartWidthItem(nWidth));
+ }
+ break;
+
+ case SID_LINE_ARROW_SQUARE:
+ {
+ // square end
+ rAttr.Put(XLineEndItem(SvxResId(RID_SVXSTR_SQUARE), aSquare));
+ rAttr.Put(XLineEndWidthItem(nWidth));
+ }
+ break;
+
+ case SID_LINE_SQUARE_ARROW:
+ {
+ // square start
+ rAttr.Put(XLineStartItem(SvxResId(RID_SVXSTR_SQUARE), aSquare));
+ rAttr.Put(XLineStartWidthItem(nWidth));
+ }
+ break;
+ }
+}
+
+SdrObjectUniquePtr FuConstructRectangle::CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle)
+{
+ DBG_ASSERT( (nID != SID_DRAW_FONTWORK) && (nID != SID_DRAW_FONTWORK_VERTICAL ), "FuConstRectangle::CreateDefaultObject can not create Fontwork shapes!" );
+
+ // case SID_DRAW_LINE:
+ // case SID_DRAW_XLINE:
+ // case SID_DRAW_MEASURELINE:
+ // case SID_LINE_ARROW_START:
+ // case SID_LINE_ARROW_END:
+ // case SID_LINE_ARROWS:
+ // case SID_LINE_ARROW_CIRCLE:
+ // case SID_LINE_CIRCLE_ARROW:
+ // case SID_LINE_ARROW_SQUARE:
+ // case SID_LINE_SQUARE_ARROW:
+ // case SID_DRAW_RECT:
+ // case SID_DRAW_RECT_NOFILL:
+ // case SID_DRAW_RECT_ROUND:
+ // case SID_DRAW_RECT_ROUND_NOFILL:
+ // case SID_DRAW_SQUARE:
+ // case SID_DRAW_SQUARE_NOFILL:
+ // case SID_DRAW_SQUARE_ROUND:
+ // case SID_DRAW_SQUARE_ROUND_NOFILL:
+ // case SID_DRAW_ELLIPSE:
+ // case SID_DRAW_ELLIPSE_NOFILL:
+ // case SID_DRAW_CIRCLE:
+ // case SID_DRAW_CIRCLE_NOFILL:
+ // case SID_DRAW_CAPTION:
+ // case SID_DRAW_CAPTION_VERTICAL:
+ // case SID_TOOL_CONNECTOR:
+ // case SID_CONNECTOR_ARROW_START:
+ // case SID_CONNECTOR_ARROW_END:
+ // case SID_CONNECTOR_ARROWS:
+ // case SID_CONNECTOR_CIRCLE_START:
+ // case SID_CONNECTOR_CIRCLE_END:
+ // case SID_CONNECTOR_CIRCLES:
+ // case SID_CONNECTOR_LINE:
+ // case SID_CONNECTOR_LINE_ARROW_START:
+ // case SID_CONNECTOR_LINE_ARROW_END:
+ // case SID_CONNECTOR_LINE_ARROWS:
+ // case SID_CONNECTOR_LINE_CIRCLE_START:
+ // case SID_CONNECTOR_LINE_CIRCLE_END:
+ // case SID_CONNECTOR_LINE_CIRCLES:
+ // case SID_CONNECTOR_CURVE:
+ // case SID_CONNECTOR_CURVE_ARROW_START:
+ // case SID_CONNECTOR_CURVE_ARROW_END:
+ // case SID_CONNECTOR_CURVE_ARROWS:
+ // case SID_CONNECTOR_CURVE_CIRCLE_START:
+ // case SID_CONNECTOR_CURVE_CIRCLE_END:
+ // case SID_CONNECTOR_CURVE_CIRCLES:
+ // case SID_CONNECTOR_LINES:
+ // case SID_CONNECTOR_LINES_ARROW_START:
+ // case SID_CONNECTOR_LINES_ARROW_END:
+ // case SID_CONNECTOR_LINES_ARROWS:
+ // case SID_CONNECTOR_LINES_CIRCLE_START:
+ // case SID_CONNECTOR_LINES_CIRCLE_END:
+ // case SID_CONNECTOR_LINES_CIRCLES:
+
+ SdrObjectUniquePtr pObj(SdrObjFactory::MakeNewObject(
+ mpView->getSdrModelFromSdrView(),
+ mpView->GetCurrentObjInventor(),
+ mpView->GetCurrentObjIdentifier()));
+
+ if(pObj)
+ {
+ ::tools::Rectangle aRect(rRectangle);
+
+ if(SID_DRAW_SQUARE == nID ||
+ SID_DRAW_SQUARE_NOFILL == nID ||
+ SID_DRAW_SQUARE_ROUND == nID ||
+ SID_DRAW_SQUARE_ROUND_NOFILL == nID ||
+ SID_DRAW_CIRCLE == nID ||
+ SID_DRAW_CIRCLE_NOFILL == nID)
+ {
+ // force quadratic
+ ImpForceQuadratic(aRect);
+ }
+
+ Point aStart = aRect.TopLeft();
+ Point aEnd = aRect.BottomRight();
+
+ switch(nID)
+ {
+ case SID_DRAW_LINE:
+ case SID_DRAW_XLINE:
+ case SID_LINE_ARROW_START:
+ case SID_LINE_ARROW_END:
+ case SID_LINE_ARROWS:
+ case SID_LINE_ARROW_CIRCLE:
+ case SID_LINE_CIRCLE_ARROW:
+ case SID_LINE_ARROW_SQUARE:
+ case SID_LINE_SQUARE_ARROW:
+ {
+ if( auto pPathObj = dynamic_cast<SdrPathObj *>( pObj.get() ) )
+ {
+ sal_Int32 nYMiddle((aRect.Top() + aRect.Bottom()) / 2);
+
+ ::basegfx::B2DPolygon aB2DPolygon;
+ aB2DPolygon.append(::basegfx::B2DPoint(aStart.X(), nYMiddle));
+ aB2DPolygon.append(::basegfx::B2DPoint(aEnd.X(), nYMiddle));
+ pPathObj->SetPathPoly(::basegfx::B2DPolyPolygon(aB2DPolygon));
+ }
+ else
+ {
+ OSL_FAIL("Object is NO line object");
+ }
+
+ break;
+ }
+
+ case SID_DRAW_MEASURELINE:
+ {
+ if( auto pMeasureObj = dynamic_cast< SdrMeasureObj *>( pObj.get() ) )
+ {
+ sal_Int32 nYMiddle((aRect.Top() + aRect.Bottom()) / 2);
+ pMeasureObj->SetPoint(Point(aStart.X(), nYMiddle), 0);
+ pMeasureObj->SetPoint(Point(aEnd.X(), nYMiddle), 1);
+ }
+ else
+ {
+ OSL_FAIL("Object is NO measure object");
+ }
+
+ break;
+ }
+
+ case SID_TOOL_CONNECTOR:
+ case SID_CONNECTOR_ARROW_START:
+ case SID_CONNECTOR_ARROW_END:
+ case SID_CONNECTOR_ARROWS:
+ case SID_CONNECTOR_CIRCLE_START:
+ case SID_CONNECTOR_CIRCLE_END:
+ case SID_CONNECTOR_CIRCLES:
+ case SID_CONNECTOR_LINE:
+ case SID_CONNECTOR_LINE_ARROW_START:
+ case SID_CONNECTOR_LINE_ARROW_END:
+ case SID_CONNECTOR_LINE_ARROWS:
+ case SID_CONNECTOR_LINE_CIRCLE_START:
+ case SID_CONNECTOR_LINE_CIRCLE_END:
+ case SID_CONNECTOR_LINE_CIRCLES:
+ case SID_CONNECTOR_CURVE:
+ case SID_CONNECTOR_CURVE_ARROW_START:
+ case SID_CONNECTOR_CURVE_ARROW_END:
+ case SID_CONNECTOR_CURVE_ARROWS:
+ case SID_CONNECTOR_CURVE_CIRCLE_START:
+ case SID_CONNECTOR_CURVE_CIRCLE_END:
+ case SID_CONNECTOR_CURVE_CIRCLES:
+ case SID_CONNECTOR_LINES:
+ case SID_CONNECTOR_LINES_ARROW_START:
+ case SID_CONNECTOR_LINES_ARROW_END:
+ case SID_CONNECTOR_LINES_ARROWS:
+ case SID_CONNECTOR_LINES_CIRCLE_START:
+ case SID_CONNECTOR_LINES_CIRCLE_END:
+ case SID_CONNECTOR_LINES_CIRCLES:
+ {
+ if( auto pEdgeObj = dynamic_cast< SdrEdgeObj *>( pObj.get() ) )
+ {
+ pEdgeObj->SetTailPoint(false, aStart);
+ pEdgeObj->SetTailPoint(true, aEnd);
+ }
+ else
+ {
+ OSL_FAIL("Object is NO connector object");
+ }
+
+ break;
+ }
+ case SID_DRAW_CAPTION:
+ case SID_DRAW_CAPTION_VERTICAL:
+ {
+ if( auto pCaptionObj = dynamic_cast< SdrCaptionObj *>( pObj.get() ) )
+ {
+ bool bIsVertical(SID_DRAW_CAPTION_VERTICAL == nID);
+
+ pCaptionObj->SetVerticalWriting(bIsVertical);
+
+ if(bIsVertical)
+ {
+ SfxItemSet aSet(pObj->GetMergedItemSet());
+ aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_CENTER));
+ aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
+ pObj->SetMergedItemSet(aSet);
+ }
+
+ // The default text is not inserted anymore.
+
+ pCaptionObj->SetLogicRect(aRect);
+ pCaptionObj->SetTailPos(
+ aRect.TopLeft() - Point(aRect.GetWidth() / 2, aRect.GetHeight() / 2));
+ }
+ else
+ {
+ OSL_FAIL("Object is NO caption object");
+ }
+
+ break;
+ }
+
+ default:
+ {
+ pObj->SetLogicRect(aRect);
+
+ break;
+ }
+ }
+
+ SfxItemSet aAttr(mpDoc->GetPool());
+ SetStyleSheet(aAttr, pObj.get());
+ SetAttributes(aAttr, pObj.get());
+ SetLineEnds(aAttr, *pObj);
+ pObj->SetMergedItemSet(aAttr);
+ }
+
+ return pObj;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuconstr.cxx b/sd/source/ui/func/fuconstr.cxx
new file mode 100644
index 000000000..9d6f36320
--- /dev/null
+++ b/sd/source/ui/func/fuconstr.cxx
@@ -0,0 +1,414 @@
+/* -*- 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 <fuconstr.hxx>
+
+#include <svx/svxids.hrc>
+#include <svx/svdpagv.hxx>
+#include <svx/xdef.hxx>
+#include <svx/xfillit0.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <tools/debug.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/xlnclit.hxx>
+
+#include <app.hrc>
+#include <strings.hrc>
+#include <strings.hxx>
+#include <fudraw.hxx>
+#include <View.hxx>
+#include <Window.hxx>
+#include <ViewShell.hxx>
+#include <drawdoc.hxx>
+#include <FrameView.hxx>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <glob.hxx>
+#include <comphelper/lok.hxx>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+
+FuConstruct::FuConstruct (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuDraw(pViewSh, pWin, pView, pDoc, rReq),
+ bSelectionChanged(false)
+{
+}
+
+bool FuConstruct::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ bool bReturn = FuDraw::MouseButtonDown(rMEvt);
+
+ bMBDown = true;
+ bSelectionChanged = false;
+
+ if ( mpView->IsAction() )
+ {
+ return true;
+ }
+
+ bFirstMouseMove = true;
+ aDragTimer.Start();
+
+ aMDPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() );
+ sal_uInt16 nHitLog = sal_uInt16 (mpWindow->PixelToLogic(Size(HITPIX,0)).Width());
+
+ if (rMEvt.IsLeft() && mpView->IsExtendedMouseEventDispatcherEnabled())
+ {
+ mpWindow->CaptureMouse();
+
+ SdrHdl* pHdl = mpView->PickHandle(aMDPos);
+
+ if ( pHdl != nullptr || mpView->IsMarkedHit(aMDPos, nHitLog) )
+ {
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+ mpView->BegDragObj(aMDPos, nullptr, pHdl, nDrgLog);
+ bReturn = true;
+ }
+ else if ( mpView->AreObjectsMarked() )
+ {
+ mpView->UnmarkAll();
+ bReturn = true;
+ }
+ }
+
+ return bReturn;
+}
+
+bool FuConstruct::MouseMove(const MouseEvent& rMEvt)
+{
+ FuDraw::MouseMove(rMEvt);
+
+ if (aDragTimer.IsActive() )
+ {
+ if( bFirstMouseMove )
+ bFirstMouseMove = false;
+ else
+ aDragTimer.Stop();
+ }
+
+ Point aPix(rMEvt.GetPosPixel());
+ Point aPnt( mpWindow->PixelToLogic(aPix) );
+
+ if ( mpView->IsAction() )
+ {
+ ForceScroll(aPix);
+ mpView->MovAction(aPnt);
+ }
+
+ return true;
+}
+
+bool FuConstruct::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ bool bReturn = true;
+
+ if (aDragTimer.IsActive() )
+ {
+ aDragTimer.Stop();
+ bIsInDragMode = false;
+ }
+
+ FuDraw::MouseButtonUp(rMEvt);
+
+ Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
+
+ if ( mpView && mpView->IsDragObj() )
+ {
+ FrameView* pFrameView = mpViewShell->GetFrameView();
+ bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy());
+
+ if (bDragWithCopy)
+ {
+ bDragWithCopy = !mpView->IsPresObjSelected(false);
+ }
+
+ mpView->SetDragWithCopy(bDragWithCopy);
+ mpView->EndDragObj( mpView->IsDragWithCopy() );
+ }
+ else if ( mpView && mpView->IsMarkObj() )
+ {
+ mpView->EndMarkObj();
+ }
+ else
+ {
+ bReturn = false;
+ }
+
+ if ( mpView && !mpView->IsAction() )
+ {
+ mpWindow->ReleaseMouse();
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+
+ if ( !mpView->AreObjectsMarked() )
+ {
+ SdrPageView* pPV;
+ sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
+
+ SdrObject* pObj = mpView->PickObj(aPnt, mpView->getHitTolLog(), pPV);
+ if (!pObj)
+ {
+ mpView->MarkObj(aPnt, nHitLog);
+ }
+
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+ }
+ else if (rMEvt.IsLeft() && !rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() &&
+ !bSelectionChanged &&
+ std::abs(aPnt.X() - aMDPos.X()) < nDrgLog &&
+ std::abs(aPnt.Y() - aMDPos.Y()) < nDrgLog)
+ {
+ // toggle between selection and rotation
+ SdrObject* pSingleObj = nullptr;
+
+ if (mpView->GetMarkedObjectList().GetMarkCount()==1)
+ {
+ pSingleObj = mpView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
+ }
+
+ const bool bTiledRendering = comphelper::LibreOfficeKit::isActive();
+ if (!bTiledRendering && (mpView->GetDragMode() == SdrDragMode::Move && mpView->IsRotateAllowed() &&
+ (mpViewShell->GetFrameView()->IsClickChangeRotation() ||
+ (pSingleObj && pSingleObj->GetObjInventor()==SdrInventor::E3d))))
+ {
+ mpView->SetDragMode(SdrDragMode::Rotate);
+ }
+ else
+ {
+ mpView->SetDragMode(SdrDragMode::Move);
+ }
+ }
+ }
+
+ sal_uInt16 nClicks = rMEvt.GetClicks();
+
+ if (nClicks == 2 && rMEvt.IsLeft() && bMBDown &&
+ !rMEvt.IsMod1() && !rMEvt.IsMod2() && !rMEvt.IsShift() )
+ {
+ DoubleClick(rMEvt);
+ }
+ bMBDown = false;
+
+ return bReturn;
+}
+
+void FuConstruct::Activate()
+{
+ mpView->SetEditMode(SdrViewEditMode::Create);
+ FuDraw::Activate();
+}
+
+void FuConstruct::Deactivate()
+{
+ FuDraw::Deactivate();
+ mpView->SetEditMode(SdrViewEditMode::Edit);
+}
+
+/**
+ * set style sheet for the object to be created
+ */
+void FuConstruct::SetStyleSheet(SfxItemSet& rAttr, SdrObject* pObj)
+{
+ bool bUseFillStyle, bUseNoFillStyle;
+ bUseFillStyle = bUseNoFillStyle = false;
+
+ switch( nSlotId )
+ {
+ case SID_DRAW_RECT:
+ case SID_DRAW_RECT_ROUND:
+ case SID_DRAW_SQUARE:
+ case SID_DRAW_SQUARE_ROUND:
+ case SID_DRAW_ELLIPSE:
+ case SID_DRAW_PIE:
+ case SID_DRAW_ELLIPSECUT:
+ case SID_DRAW_CIRCLE:
+ case SID_DRAW_CIRCLEPIE:
+ case SID_DRAW_CIRCLECUT:
+ case SID_DRAW_POLYGON:
+ case SID_DRAW_XPOLYGON:
+ case SID_DRAW_FREELINE:
+ case SID_DRAW_BEZIER_FILL:
+ {
+ bUseFillStyle = true;
+ break;
+ }
+ case SID_DRAW_RECT_NOFILL:
+ case SID_DRAW_RECT_ROUND_NOFILL:
+ case SID_DRAW_SQUARE_NOFILL:
+ case SID_DRAW_SQUARE_ROUND_NOFILL:
+ case SID_DRAW_ELLIPSE_NOFILL:
+ case SID_DRAW_PIE_NOFILL:
+ case SID_DRAW_ELLIPSECUT_NOFILL:
+ case SID_DRAW_CIRCLE_NOFILL:
+ case SID_DRAW_CIRCLEPIE_NOFILL:
+ case SID_DRAW_CIRCLECUT_NOFILL:
+ case SID_DRAW_POLYGON_NOFILL:
+ case SID_DRAW_XPOLYGON_NOFILL:
+ case SID_DRAW_FREELINE_NOFILL:
+ case SID_DRAW_LINE:
+ case SID_DRAW_XLINE:
+ case SID_CONNECTOR_ARROW_START:
+ case SID_CONNECTOR_ARROW_END:
+ case SID_CONNECTOR_ARROWS:
+ case SID_CONNECTOR_CIRCLE_START:
+ case SID_CONNECTOR_CIRCLE_END:
+ case SID_CONNECTOR_CIRCLES:
+ case SID_CONNECTOR_LINE:
+ case SID_CONNECTOR_LINE_ARROW_START:
+ case SID_CONNECTOR_LINE_ARROW_END:
+ case SID_CONNECTOR_LINE_ARROWS:
+ case SID_CONNECTOR_LINE_CIRCLE_START:
+ case SID_CONNECTOR_LINE_CIRCLE_END:
+ case SID_CONNECTOR_LINE_CIRCLES:
+ case SID_CONNECTOR_CURVE:
+ case SID_CONNECTOR_CURVE_ARROW_START:
+ case SID_CONNECTOR_CURVE_ARROW_END:
+ case SID_CONNECTOR_CURVE_ARROWS:
+ case SID_CONNECTOR_CURVE_CIRCLE_START:
+ case SID_CONNECTOR_CURVE_CIRCLE_END:
+ case SID_CONNECTOR_CURVE_CIRCLES:
+ case SID_CONNECTOR_LINES:
+ case SID_CONNECTOR_LINES_ARROW_START:
+ case SID_CONNECTOR_LINES_ARROW_END:
+ case SID_CONNECTOR_LINES_ARROWS:
+ case SID_CONNECTOR_LINES_CIRCLE_START:
+ case SID_CONNECTOR_LINES_CIRCLE_END:
+ case SID_CONNECTOR_LINES_CIRCLES:
+ case SID_DRAW_BEZIER_NOFILL:
+ case SID_LINE_ARROW_END:
+ {
+ bUseNoFillStyle = true;
+ break;
+ }
+ }
+ SetStyleSheet( rAttr, pObj, bUseFillStyle, bUseNoFillStyle );
+}
+
+void FuConstruct::SetStyleSheet( SfxItemSet& rAttr, SdrObject* pObj,
+ const bool bForceFillStyle, const bool bForceNoFillStyle )
+{
+ SdPage* pPage = static_cast<SdPage*>(mpView->GetSdrPageView()->GetPage());
+ if ( pPage->IsMasterPage() && pPage->GetPageKind() == PageKind::Standard &&
+ mpDoc->GetDocumentType() == DocumentType::Impress )
+ {
+ /**********************************************
+ * Objects was created on the slide master page
+ ***********************************************/
+ OUString aName( pPage->GetLayoutName() );
+ sal_Int32 n = aName.indexOf(SD_LT_SEPARATOR) + SD_LT_SEPARATOR.getLength();
+ aName = OUString::Concat(aName.subView(0, n)) + STR_LAYOUT_BACKGROUNDOBJECTS;
+ SfxStyleSheet* pSheet(
+ static_cast< SfxStyleSheet* >(
+ pPage->getSdrModelFromSdrPage().GetStyleSheetPool()->Find(aName, SfxStyleFamily::Page)));
+ DBG_ASSERT(pSheet, "StyleSheet missing");
+ if (pSheet)
+ {
+ // applying style sheet for background objects
+ pObj->SetStyleSheet(pSheet, false);
+ SfxItemSet& rSet = pSheet->GetItemSet();
+ const XFillStyleItem& rFillStyle = rSet.Get(XATTR_FILLSTYLE);
+ if ( bForceFillStyle )
+ {
+ if (rFillStyle.GetValue() == drawing::FillStyle_NONE)
+ rAttr.Put(XFillStyleItem(drawing::FillStyle_SOLID));
+ }
+ else if ( bForceNoFillStyle )
+ {
+ if (rFillStyle.GetValue() != drawing::FillStyle_NONE)
+ rAttr.Put(XFillStyleItem(drawing::FillStyle_NONE));
+ }
+ }
+ }
+ else
+ {
+ /***********************************
+ * object was created on normal page
+ ************************************/
+ if ( bForceNoFillStyle )
+ {
+ OUString aName(SdResId(STR_POOLSHEET_OBJWITHOUTFILL));
+ SfxStyleSheet* pSheet(
+ static_cast< SfxStyleSheet* >(
+ pPage->getSdrModelFromSdrPage().GetStyleSheetPool()->Find(aName, SfxStyleFamily::Para)));
+ DBG_ASSERT(pSheet, "Stylesheet missing");
+ if (pSheet)
+ {
+ pObj->SetStyleSheet(pSheet, false);
+ SfxItemSet aAttr(mpView->GetDefaultAttr());
+ aAttr.Put(pSheet->GetItemSet().Get(XATTR_FILLSTYLE));
+ pObj->SetMergedItemSet(aAttr);
+ }
+ else
+ {
+ SfxItemSet aAttr(mpView->GetDefaultAttr());
+ rAttr.Put(XFillStyleItem(drawing::FillStyle_NONE));
+ pObj->SetMergedItemSet(aAttr);
+ }
+ }
+ else
+ {
+ // Creating an object with fill.
+ SdrPage* pThemePage = pPage;
+ if (pThemePage->TRG_HasMasterPage())
+ {
+ pThemePage = &pThemePage->TRG_GetMasterPage();
+ }
+
+ svx::Theme* pTheme = pThemePage->getSdrPageProperties().GetTheme();
+ if (pTheme)
+ {
+ // We construct an object on a page where the master page has a theme. Take the
+ // accent1 color from that theme, make sure it has priority over the shape's
+ // document-global style.
+ SfxItemSet aAttr(mpView->GetDefaultAttr());
+
+ aAttr.Put(XFillStyleItem(css::drawing::FillStyle_SOLID));
+
+ svx::ThemeColorType eColorType = svx::ThemeColorType::ACCENT1;
+ Color aColor = pTheme->GetColor(eColorType);
+ XFillColorItem aFillColorItem("", aColor);
+ aFillColorItem.GetThemeColor().SetThemeIndex(static_cast<sal_Int16>(eColorType));
+ aAttr.Put(aFillColorItem);
+
+ aAttr.Put(XLineStyleItem(css::drawing::LineStyle_SOLID));
+
+ // Line color is 50% darker than the fill color.
+ aColor.ApplyTintOrShade(-5000);
+ XLineColorItem aLineColorItem("", aColor);
+ // TODO no theme or theme effect for line colors yet.
+ aAttr.Put(aLineColorItem);
+
+ pObj->SetMergedItemSet(aAttr);
+ }
+ }
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuconuno.cxx b/sd/source/ui/func/fuconuno.cxx
new file mode 100644
index 000000000..afa4523c6
--- /dev/null
+++ b/sd/source/ui/func/fuconuno.cxx
@@ -0,0 +1,150 @@
+/* -*- 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 <fuconuno.hxx>
+#include <rtl/ustring.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/request.hxx>
+#include <svl/intitem.hxx>
+#include <svx/svxids.hrc>
+#include <vcl/ptrstyle.hxx>
+
+#include <ViewShell.hxx>
+#include <View.hxx>
+#include <Window.hxx>
+#include <ViewShellBase.hxx>
+#include <ToolBarManager.hxx>
+#include <unokywds.hxx>
+
+
+namespace sd {
+
+
+FuConstructUnoControl::FuConstructUnoControl (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuConstruct(pViewSh, pWin, pView, pDoc, rReq)
+ , nInventor(SdrInventor::Unknown)
+ , nIdentifier(SdrObjKind::NONE)
+{
+}
+
+rtl::Reference<FuPoor> FuConstructUnoControl::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent )
+{
+ FuConstructUnoControl* pFunc;
+ rtl::Reference<FuPoor> xFunc( pFunc = new FuConstructUnoControl( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ pFunc->SetPermanent(bPermanent);
+ return xFunc;
+}
+
+void FuConstructUnoControl::DoExecute( SfxRequest& rReq )
+{
+ FuConstruct::DoExecute( rReq );
+
+ const SfxUInt32Item* pInventorItem = rReq.GetArg<SfxUInt32Item>(SID_FM_CONTROL_INVENTOR);
+ const SfxUInt16Item* pIdentifierItem = rReq.GetArg<SfxUInt16Item>(SID_FM_CONTROL_IDENTIFIER);
+ if( pInventorItem )
+ nInventor = static_cast<SdrInventor>(pInventorItem->GetValue());
+ if( pIdentifierItem )
+ nIdentifier = static_cast<SdrObjKind>(pIdentifierItem->GetValue());
+
+ mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBar(
+ ToolBarManager::ToolBarGroup::Function,
+ ToolBarManager::msDrawingObjectToolBar);
+}
+
+bool FuConstructUnoControl::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ bool bReturn = FuConstruct::MouseButtonDown(rMEvt);
+
+ if ( rMEvt.IsLeft() && !mpView->IsAction() )
+ {
+ Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
+ mpWindow->CaptureMouse();
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+ mpView->BegCreateObj(aPnt, nullptr, nDrgLog);
+ bReturn = true;
+ }
+ return bReturn;
+}
+
+bool FuConstructUnoControl::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ bool bReturn = false;
+
+ if ( mpView->IsCreateObj() && rMEvt.IsLeft() )
+ {
+ mpView->EndCreateObj(SdrCreateCmd::ForceEnd);
+ bReturn = true;
+ }
+
+ bReturn = (FuConstruct::MouseButtonUp(rMEvt) || bReturn);
+
+ if (!bPermanent)
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+
+ return bReturn;
+}
+
+void FuConstructUnoControl::Activate()
+{
+ mpView->SetCurrentObj( nIdentifier, nInventor );
+
+ aNewPointer = PointerStyle::DrawRect;
+ aOldPointer = mpWindow->GetPointer();
+ mpWindow->SetPointer( aNewPointer );
+
+ aOldLayer = mpView->GetActiveLayer();
+ mpView->SetActiveLayer(sUNO_LayerName_controls);
+
+ FuConstruct::Activate();
+}
+
+void FuConstructUnoControl::Deactivate()
+{
+ FuConstruct::Deactivate();
+ mpView->SetActiveLayer( aOldLayer );
+ mpWindow->SetPointer( aOldPointer );
+}
+
+SdrObjectUniquePtr FuConstructUnoControl::CreateDefaultObject(const sal_uInt16, const ::tools::Rectangle& rRectangle)
+{
+ // case SID_FM_CREATE_CONTROL:
+
+ SdrObjectUniquePtr pObj(SdrObjFactory::MakeNewObject(
+ mpView->getSdrModelFromSdrView(),
+ mpView->GetCurrentObjInventor(),
+ mpView->GetCurrentObjIdentifier()));
+
+ if(pObj)
+ {
+ pObj->SetLogicRect(rRectangle);
+ }
+
+ return pObj;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fucopy.cxx b/sd/source/ui/func/fucopy.cxx
new file mode 100644
index 000000000..99e5f7b87
--- /dev/null
+++ b/sd/source/ui/func/fucopy.cxx
@@ -0,0 +1,288 @@
+/* -*- 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 <fucopy.hxx>
+#include <sfx2/progress.hxx>
+#include <svl/intitem.hxx>
+
+#include <sdattr.hrc>
+#include <sdresid.hxx>
+#include <strings.hrc>
+#include <ViewShell.hxx>
+#include <View.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/xcolit.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xdef.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/sdangitm.hxx>
+#include <sfx2/request.hxx>
+#include <sdabstdlg.hxx>
+#include <memory>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+
+FuCopy::FuCopy (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuCopy::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuCopy( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuCopy::DoExecute( SfxRequest& rReq )
+{
+ if( !mpView->AreObjectsMarked() )
+ return;
+
+ // Undo
+ OUString aString = mpView->GetDescriptionOfMarkedObjects() +
+ " " + SdResId( STR_UNDO_COPYOBJECTS );
+ mpView->BegUndo( aString );
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ if( !pArgs )
+ {
+ SfxItemSetFixed<ATTR_COPY_START, ATTR_COPY_END> aSet( mpViewShell->GetPool() );
+
+ // indicate color attribute
+ SfxItemSet aAttr( mpDoc->GetPool() );
+ mpView->GetAttributes( aAttr );
+
+ if( const XFillStyleItem* pFillStyleItem = aAttr.GetItemIfSet( XATTR_FILLSTYLE ) )
+ {
+ drawing::FillStyle eStyle = pFillStyleItem->GetValue();
+
+ const XFillColorItem* pFillColorItem;
+ if( eStyle == drawing::FillStyle_SOLID &&
+ (pFillColorItem = aAttr.GetItemIfSet( XATTR_FILLCOLOR )) )
+ {
+ XColorItem aXColorItem( ATTR_COPY_START_COLOR, pFillColorItem->GetName(),
+ pFillColorItem->GetColorValue() );
+ aSet.Put( aXColorItem );
+
+ }
+ }
+
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractCopyDlg> pDlg(pFact->CreateCopyDlg(mpViewShell->GetFrameWeld(), aSet, mpView ));
+
+ sal_uInt16 nResult = pDlg->Execute();
+
+ switch( nResult )
+ {
+ case RET_OK:
+ pDlg->GetAttr( aSet );
+ rReq.Done( aSet );
+ pArgs = rReq.GetArgs();
+ break;
+
+ default:
+ {
+ pDlg.disposeAndClear();
+ mpView->EndUndo();
+ return; // Cancel
+ }
+ }
+ }
+
+ ::tools::Rectangle aRect;
+ sal_Int32 lWidth = 0, lHeight = 0, lSizeX = 0, lSizeY = 0;
+ Degree100 lAngle(0);
+ sal_uInt16 nNumber = 0;
+ Color aStartColor, aEndColor;
+ bool bColor = false;
+
+ if (pArgs)
+ {
+ // Count
+ if( const SfxUInt16Item* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_NUMBER ) )
+ nNumber = pPoolItem->GetValue();
+
+ // translation
+ if( const SfxInt32Item* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_MOVE_X ) )
+ lSizeX = pPoolItem->GetValue();
+ if( const SfxInt32Item* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_MOVE_Y ) )
+ lSizeY = pPoolItem->GetValue();
+ if( const SdrAngleItem* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_ANGLE ) )
+ lAngle = pPoolItem->GetValue();
+
+ // scale
+ if( const SfxInt32Item* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_WIDTH ) )
+ lWidth = pPoolItem->GetValue();
+ if( const SfxInt32Item* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_HEIGHT ) )
+ lHeight = pPoolItem->GetValue();
+
+ // start/end color
+ if( const XColorItem* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_START_COLOR ) )
+ {
+ aStartColor = pPoolItem->GetColorValue();
+ bColor = true;
+ }
+ if( const XColorItem* pPoolItem = pArgs->GetItemIfSet( ATTR_COPY_END_COLOR ) )
+ {
+ aEndColor = pPoolItem->GetColorValue();
+ if( aStartColor == aEndColor )
+ bColor = false;
+ }
+ }
+
+ // remove handles
+ //HMHmpView->HideMarkHdl();
+
+ std::unique_ptr<SfxProgress> pProgress;
+ bool bWaiting = false;
+
+ if( nNumber > 1 )
+ {
+ OUString aStr = SdResId( STR_OBJECTS ) +
+ " " + SdResId( STR_UNDO_COPYOBJECTS );
+
+ pProgress.reset(new SfxProgress( mpDocSh, aStr, nNumber ));
+ mpDocSh->SetWaitCursor( true );
+ bWaiting = true;
+ }
+
+ const SdrMarkList aMarkList( mpView->GetMarkedObjectList() );
+ const size_t nMarkCount = aMarkList.GetMarkCount();
+ SdrObject* pObj = nullptr;
+
+ // calculate number of possible copies
+ aRect = mpView->GetAllMarkedRect();
+
+ if( lWidth < 0 )
+ {
+ ::tools::Long nTmp = ( aRect.Right() - aRect.Left() ) / -lWidth;
+ nNumber = static_cast<sal_uInt16>(std::min( nTmp, static_cast<::tools::Long>(nNumber) ));
+ }
+
+ if( lHeight < 0 )
+ {
+ ::tools::Long nTmp = ( aRect.Bottom() - aRect.Top() ) / -lHeight;
+ nNumber = static_cast<sal_uInt16>(std::min( nTmp, static_cast<::tools::Long>(nNumber) ));
+ }
+
+ for( sal_uInt16 i = 1; i <= nNumber; i++ )
+ {
+ if( pProgress )
+ pProgress->SetState( i );
+
+ aRect = mpView->GetAllMarkedRect();
+
+ if( ( 1 == i ) && bColor )
+ {
+ SfxItemSetFixed<XATTR_FILLSTYLE, XATTR_FILLCOLOR> aNewSet( mpViewShell->GetPool() );
+ aNewSet.Put( XFillStyleItem( drawing::FillStyle_SOLID ) );
+ aNewSet.Put( XFillColorItem( OUString(), aStartColor ) );
+ mpView->SetAttributes( aNewSet );
+ }
+
+ // make a copy of selected objects
+ mpView->CopyMarked();
+
+ // get newly selected objects
+ SdrMarkList aCopyMarkList( mpView->GetMarkedObjectList() );
+ const size_t nCopyMarkCount = aMarkList.GetMarkCount();
+
+ // set protection flags at marked copies to null
+ for( size_t j = 0; j < nCopyMarkCount; ++j )
+ {
+ pObj = aCopyMarkList.GetMark( j )->GetMarkedSdrObj();
+
+ if( pObj )
+ {
+ pObj->SetMoveProtect( false );
+ pObj->SetResizeProtect( false );
+ }
+ }
+
+ Fraction aWidth( aRect.Right() - aRect.Left() + lWidth, aRect.Right() - aRect.Left() );
+ Fraction aHeight( aRect.Bottom() - aRect.Top() + lHeight, aRect.Bottom() - aRect.Top() );
+
+ if( mpView->IsResizeAllowed() )
+ mpView->ResizeAllMarked( aRect.TopLeft(), aWidth, aHeight );
+
+ if( mpView->IsRotateAllowed() )
+ mpView->RotateAllMarked( aRect.Center(), lAngle );
+
+ if( mpView->IsMoveAllowed() )
+ mpView->MoveAllMarked( Size( lSizeX, lSizeY ) );
+
+ // set protection flags at marked copies to original values
+ if( nMarkCount == nCopyMarkCount )
+ {
+ for( size_t j = 0; j < nMarkCount; ++j )
+ {
+ SdrObject* pSrcObj = aMarkList.GetMark( j )->GetMarkedSdrObj();
+ SdrObject* pDstObj = aCopyMarkList.GetMark( j )->GetMarkedSdrObj();
+
+ if( pSrcObj && pDstObj &&
+ ( pSrcObj->GetObjInventor() == pDstObj->GetObjInventor() ) &&
+ ( pSrcObj->GetObjIdentifier() == pDstObj->GetObjIdentifier() ) )
+ {
+ pDstObj->SetMoveProtect( pSrcObj->IsMoveProtect() );
+ pDstObj->SetResizeProtect( pSrcObj->IsResizeProtect() );
+ }
+ }
+ }
+
+ if( bColor )
+ {
+ // probably room for optimizations, but may can lead to rounding errors
+ sal_uInt8 nRed = aStartColor.GetRed() + static_cast<sal_uInt8>( ( static_cast<::tools::Long>(aEndColor.GetRed()) - static_cast<::tools::Long>(aStartColor.GetRed()) ) * static_cast<::tools::Long>(i) / static_cast<::tools::Long>(nNumber) );
+ sal_uInt8 nGreen = aStartColor.GetGreen() + static_cast<sal_uInt8>( ( static_cast<::tools::Long>(aEndColor.GetGreen()) - static_cast<::tools::Long>(aStartColor.GetGreen()) ) * static_cast<::tools::Long>(i) / static_cast<::tools::Long>(nNumber) );
+ sal_uInt8 nBlue = aStartColor.GetBlue() + static_cast<sal_uInt8>( ( static_cast<::tools::Long>(aEndColor.GetBlue()) - static_cast<::tools::Long>(aStartColor.GetBlue()) ) * static_cast<::tools::Long>(i) / static_cast<::tools::Long>(nNumber) );
+ Color aNewColor( nRed, nGreen, nBlue );
+ SfxItemSetFixed<XATTR_FILLSTYLE, XATTR_FILLCOLOR> aNewSet( mpViewShell->GetPool() );
+ aNewSet.Put( XFillStyleItem( drawing::FillStyle_SOLID ) );
+ aNewSet.Put( XFillColorItem( OUString(), aNewColor ) );
+ mpView->SetAttributes( aNewSet );
+ }
+ }
+
+ pProgress.reset();
+
+ if ( bWaiting )
+ mpDocSh->SetWaitCursor( false );
+
+ // show handles
+ mpView->AdjustMarkHdl(); //HMH sal_True );
+ //HMHpView->ShowMarkHdl();
+
+ mpView->EndUndo();
+}
+
+} // end of namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fucushow.cxx b/sd/source/ui/func/fucushow.cxx
new file mode 100644
index 000000000..eb3b12211
--- /dev/null
+++ b/sd/source/ui/func/fucushow.cxx
@@ -0,0 +1,91 @@
+/* -*- 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 <fucushow.hxx>
+
+#include <svx/svxids.hrc>
+
+#include <ViewShell.hxx>
+#include <Window.hxx>
+#include <drawdoc.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+
+#include <sdabstdlg.hxx>
+
+namespace sd {
+
+
+FuCustomShowDlg::FuCustomShowDlg (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor( pViewSh, pWin, pView, pDoc, rReq )
+{
+}
+
+rtl::Reference<FuPoor> FuCustomShowDlg::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuCustomShowDlg( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuCustomShowDlg::DoExecute( SfxRequest& )
+{
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ vcl::Window* pWin = mpViewShell->GetActiveWindow();
+ ScopedVclPtr<AbstractSdCustomShowDlg> pDlg( pFact->CreateSdCustomShowDlg(pWin ? pWin->GetFrameWeld() : nullptr, *mpDoc) );
+ sal_uInt16 nRet = pDlg->Execute();
+ mpDoc->SetChanged();
+ sd::PresentationSettings& rSettings = mpDoc->getPresentationSettings();
+
+ if( nRet == RET_YES )
+ {
+ // If the custom show is not set by default
+ if (!rSettings.mbCustomShow)
+ {
+ rSettings.mbStartCustomShow = true;
+ rSettings.mbCustomShow = pDlg->IsCustomShow();
+ }
+
+ mpViewShell->SetStartShowWithDialog(true);
+
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_PRESENTATION,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+ }
+ if (nRet == RET_OK)
+ {
+ if (mpDoc->GetCustomShowList())
+ {
+ if (!pDlg->IsCustomShow())
+ {
+ rSettings.mbCustomShow = false;
+ rSettings.mbAll = true;
+ }
+ }
+ }
+ pDlg.disposeAndClear();
+}
+
+} // end of namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fudraw.cxx b/sd/source/ui/func/fudraw.cxx
new file mode 100644
index 000000000..8beb753f6
--- /dev/null
+++ b/sd/source/ui/func/fudraw.cxx
@@ -0,0 +1,820 @@
+/* -*- 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 <vcl/svapp.hxx>
+#include <vcl/ptrstyle.hxx>
+#include <editeng/flditem.hxx>
+#include <svx/svdogrp.hxx>
+#include <tools/urlobj.hxx>
+#include <vcl/help.hxx>
+#include <svx/bmpmask.hxx>
+#include <svx/svdotext.hxx>
+#include <svx/ImageMapInfo.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/sfxhelp.hxx>
+#include <svx/svdpagv.hxx>
+#include <vcl/imapobj.hxx>
+#include <svx/svxids.hrc>
+#include <svx/obj3d.hxx>
+#include <svx/scene3d.hxx>
+#include <sfx2/viewfrm.hxx>
+
+#include <strings.hrc>
+
+
+#include <sdmod.hxx>
+#include <fudraw.hxx>
+#include <ViewShell.hxx>
+#include <FrameView.hxx>
+#include <View.hxx>
+#include <Window.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <sdresid.hxx>
+#include <fusel.hxx>
+#include <vcl/weld.hxx>
+#include <svx/sdrhittesthelper.hxx>
+
+using namespace ::com::sun::star;
+
+namespace sd {
+
+
+/**
+ * Base-class for all drawmodul-specific functions
+ */
+FuDraw::FuDraw(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView,
+ SdDrawDocument* pDoc, SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+ , aNewPointer(PointerStyle::Arrow)
+ , aOldPointer(PointerStyle::Arrow)
+ , bMBDown(false)
+ , bDragHelpLine(false)
+ , nHelpLine(0)
+ , bPermanent(false)
+{
+}
+
+FuDraw::~FuDraw()
+{
+ mpView->BrkAction();
+}
+
+
+/**
+ * Code shared by MouseButtonDown and MouseMove
+ */
+void FuDraw::DoModifiers(const MouseEvent& rMEvt, bool bSnapModPressed)
+{
+ FrameView* pFrameView = mpViewShell->GetFrameView();
+ bool bGridSnap = pFrameView->IsGridSnap();
+ bGridSnap = (bSnapModPressed != bGridSnap);
+
+ if (mpView->IsGridSnap() != bGridSnap)
+ mpView->SetGridSnap(bGridSnap);
+
+ bool bBordSnap = pFrameView->IsBordSnap();
+ bBordSnap = (bSnapModPressed != bBordSnap);
+
+ if (mpView->IsBordSnap() != bBordSnap)
+ mpView->SetBordSnap(bBordSnap);
+
+ bool bHlplSnap = pFrameView->IsHlplSnap();
+ bHlplSnap = (bSnapModPressed != bHlplSnap);
+
+ if (mpView->IsHlplSnap() != bHlplSnap)
+ mpView->SetHlplSnap(bHlplSnap);
+
+ bool bOFrmSnap = pFrameView->IsOFrmSnap();
+ bOFrmSnap = (bSnapModPressed != bOFrmSnap);
+
+ if (mpView->IsOFrmSnap() != bOFrmSnap)
+ mpView->SetOFrmSnap(bOFrmSnap);
+
+ bool bOPntSnap = pFrameView->IsOPntSnap();
+ bOPntSnap = (bSnapModPressed != bOPntSnap);
+
+ if (mpView->IsOPntSnap() != bOPntSnap)
+ mpView->SetOPntSnap(bOPntSnap);
+
+ bool bOConSnap = pFrameView->IsOConSnap();
+ bOConSnap = (bSnapModPressed != bOConSnap);
+
+ if (mpView->IsOConSnap() != bOConSnap)
+ mpView->SetOConSnap(bOConSnap);
+
+ bool bAngleSnap = rMEvt.IsShift() == !pFrameView->IsAngleSnapEnabled();
+
+ if (mpView->IsAngleSnapEnabled() != bAngleSnap)
+ mpView->SetAngleSnapEnabled(bAngleSnap);
+
+ bool bCenter = rMEvt.IsMod2();
+
+ if ( mpView->IsCreate1stPointAsCenter() != bCenter ||
+ mpView->IsResizeAtCenter() != bCenter )
+ {
+ mpView->SetCreate1stPointAsCenter(bCenter);
+ mpView->SetResizeAtCenter(bCenter);
+ }
+}
+
+
+bool FuDraw::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ // remember button state for creation of own MouseEvents
+ SetMouseButtonCode(rMEvt.GetButtons());
+
+ bool bReturn = false;
+ bDragHelpLine = false;
+ aMDPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() );
+
+ if ( rMEvt.IsLeft() )
+ {
+ FrameView* pFrameView = mpViewShell->GetFrameView();
+
+ bool bOrtho = false;
+
+ bool bRestricted = true;
+
+ if (mpView->IsDragObj())
+ {
+ // object is dragged (move, resize,...)
+ const SdrHdl* pHdl = mpView->GetDragStat().GetHdl();
+
+ if (!pHdl || (!pHdl->IsCornerHdl() && !pHdl->IsVertexHdl()))
+ {
+ // Move
+ bRestricted = false;
+ }
+ }
+
+ // #i33136#
+ if(bRestricted && doConstructOrthogonal())
+ {
+ // Restrict movement:
+ // rectangle->square, ellipse->circle, etc.
+ bOrtho = !rMEvt.IsShift();
+ }
+ else
+ {
+ bOrtho = rMEvt.IsShift() != pFrameView->IsOrtho();
+ }
+ if (!mpView->IsSnapEnabled())
+ mpView->SetSnapEnabled(true);
+
+ bool bSnapModPressed = rMEvt.IsMod1();
+ if (mpView->IsOrtho() != bOrtho)
+ mpView->SetOrtho(bOrtho);
+
+ DoModifiers(rMEvt, bSnapModPressed);
+
+ SdrPageView* pPV = nullptr;
+ sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
+
+ // look only for HelpLines when they are visible (!)
+ bool bHelpLine(false);
+ if(mpView->IsHlplVisible())
+ bHelpLine = mpView->PickHelpLine(aMDPos, nHitLog, *mpWindow->GetOutDev(), nHelpLine, pPV);
+ bool bHitHdl = (mpView->PickHandle(aMDPos) != nullptr);
+
+ if ( bHelpLine
+ && !mpView->IsCreateObj()
+ && ((mpView->GetEditMode() == SdrViewEditMode::Edit && !bHitHdl) || (rMEvt.IsShift() && bSnapModPressed)) )
+ {
+ mpWindow->CaptureMouse();
+ mpView->BegDragHelpLine(nHelpLine, pPV);
+ bDragHelpLine = mpView->IsDragHelpLine();
+ bReturn = true;
+ }
+ }
+ ForcePointer(&rMEvt);
+
+ return bReturn;
+}
+
+bool FuDraw::MouseMove(const MouseEvent& rMEvt)
+{
+ FrameView* pFrameView = mpViewShell->GetFrameView();
+ Point aPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() );
+
+ bool bOrtho = false;
+ bool bRestricted = true;
+
+ if (mpView->IsDragObj())
+ {
+ // object is dragged (move, resize, ...)
+ const SdrHdl* pHdl = mpView->GetDragStat().GetHdl();
+
+ if (!pHdl || (!pHdl->IsCornerHdl() && !pHdl->IsVertexHdl()))
+ {
+ // Move
+ bRestricted = false;
+ }
+ }
+
+ if (mpView->IsAction())
+ {
+ // #i33136# and fdo#88339
+ if(bRestricted && doConstructOrthogonal())
+ {
+ // Scale proportionally by default:
+ // rectangle->square, ellipse->circle, images, etc.
+ bOrtho = !rMEvt.IsShift();
+ }
+ else
+ {
+ bOrtho = rMEvt.IsShift() != pFrameView->IsOrtho();
+ }
+
+ bool bSnapModPressed = rMEvt.IsMod2();
+ mpView->SetDragWithCopy(rMEvt.IsMod1() && pFrameView->IsDragWithCopy());
+
+ if (mpView->IsOrtho() != bOrtho)
+ mpView->SetOrtho(bOrtho);
+ DoModifiers(rMEvt, bSnapModPressed);
+
+
+ if ( mpView->IsDragHelpLine() )
+ mpView->MovDragHelpLine(aPos);
+ }
+
+ bool bReturn = mpView->MouseMove(rMEvt, mpWindow->GetOutDev());
+
+ if (mpView->IsAction())
+ {
+ // Because the flag set back if necessary in MouseMove
+ if (mpView->IsOrtho() != bOrtho)
+ mpView->SetOrtho(bOrtho);
+ }
+
+ ForcePointer(&rMEvt);
+
+ return bReturn;
+}
+
+bool FuDraw::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ if (mpView && mpView->IsDragHelpLine())
+ mpView->EndDragHelpLine();
+
+ if ( bDragHelpLine )
+ {
+ ::tools::Rectangle aOutputArea(Point(0,0), mpWindow->GetOutputSizePixel());
+
+ if (mpView && !aOutputArea.Contains(rMEvt.GetPosPixel()))
+ mpView->GetSdrPageView()->DeleteHelpLine(nHelpLine);
+
+ mpWindow->ReleaseMouse();
+ }
+
+ if (mpView)
+ {
+ FrameView* pFrameView = mpViewShell->GetFrameView();
+ mpView->SetOrtho( pFrameView->IsOrtho() );
+ mpView->SetAngleSnapEnabled( pFrameView->IsAngleSnapEnabled() );
+ mpView->SetSnapEnabled(true);
+ mpView->SetCreate1stPointAsCenter(false);
+ mpView->SetResizeAtCenter(false);
+ mpView->SetDragWithCopy(pFrameView->IsDragWithCopy());
+ mpView->SetGridSnap(pFrameView->IsGridSnap());
+ mpView->SetBordSnap(pFrameView->IsBordSnap());
+ mpView->SetHlplSnap(pFrameView->IsHlplSnap());
+ mpView->SetOFrmSnap(pFrameView->IsOFrmSnap());
+ mpView->SetOPntSnap(pFrameView->IsOPntSnap());
+ mpView->SetOConSnap(pFrameView->IsOConSnap());
+ }
+
+ bIsInDragMode = false;
+ ForcePointer(&rMEvt);
+ FuPoor::MouseButtonUp(rMEvt);
+
+ return false;
+}
+
+/**
+ * Process keyboard input
+ * @returns sal_True if a KeyEvent is being processed, sal_False otherwise
+ */
+bool FuDraw::KeyInput(const KeyEvent& rKEvt)
+{
+ bool bReturn = false;
+
+ switch ( rKEvt.GetKeyCode().GetCode() )
+ {
+ case KEY_ESCAPE:
+ {
+ bReturn = FuDraw::cancel();
+ }
+ break;
+
+ case KEY_DELETE:
+ case KEY_BACKSPACE:
+ {
+ if (!mpDocSh->IsReadOnly())
+ {
+ if (mpView->IsPresObjSelected(false, true, false, true))
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(mpWindow->GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ // wait-mousepointer while deleting object
+ weld::WaitObject aWait(mpViewShell->GetFrameWeld());
+ // delete object
+ mpView->DeleteMarked();
+ }
+ }
+ bReturn = true;
+ }
+ break;
+
+ case KEY_TAB:
+ {
+ vcl::KeyCode aCode = rKEvt.GetKeyCode();
+
+ if ( !aCode.IsMod1() && !aCode.IsMod2() )
+ {
+ // Moved next line which was a bugfix itself into
+ // the scope which really does the object selection travel
+ // and thus is allowed to call SelectionHasChanged().
+
+ // Switch to FuSelect.
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(
+ SID_OBJECT_SELECT,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+
+ // changeover to the next object
+ if(!mpView->MarkNextObj( !aCode.IsShift() ))
+ {
+ //If there is only one object, don't do the UnmarkAllObj() & MarkNextObj().
+ if ( mpView->HasMultipleMarkableObjects() && mpView->AreObjectsMarked() )
+ {
+ // No next object: go over open end and get first from
+ // the other side
+ mpView->UnmarkAllObj();
+ mpView->MarkNextObj(!aCode.IsShift());
+ }
+ }
+
+ if(mpView->AreObjectsMarked())
+ mpView->MakeVisible(mpView->GetAllMarkedRect(), *mpWindow);
+
+ bReturn = true;
+ }
+ }
+ break;
+
+ case KEY_END:
+ {
+ vcl::KeyCode aCode = rKEvt.GetKeyCode();
+
+ if ( aCode.IsMod1() )
+ {
+ // mark last object
+ mpView->UnmarkAllObj();
+ mpView->MarkNextObj();
+
+ if(mpView->AreObjectsMarked())
+ mpView->MakeVisible(mpView->GetAllMarkedRect(), *mpWindow);
+
+ bReturn = true;
+ }
+ }
+ break;
+
+ case KEY_HOME:
+ {
+ vcl::KeyCode aCode = rKEvt.GetKeyCode();
+
+ if ( aCode.IsMod1() )
+ {
+ // mark first object
+ mpView->UnmarkAllObj();
+ mpView->MarkNextObj(true);
+
+ if(mpView->AreObjectsMarked())
+ mpView->MakeVisible(mpView->GetAllMarkedRect(), *mpWindow);
+
+ bReturn = true;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if (!bReturn)
+ {
+ bReturn = FuPoor::KeyInput(rKEvt);
+ }
+ else
+ {
+ mpWindow->ReleaseMouse();
+ }
+
+ return bReturn;
+}
+
+void FuDraw::Activate()
+{
+ FuPoor::Activate();
+ ForcePointer();
+}
+
+/**
+ * Toggle mouse-pointer
+ */
+void FuDraw::ForcePointer(const MouseEvent* pMEvt)
+{
+ Point aPnt;
+ sal_uInt16 nModifier = 0;
+ bool bLeftDown = false;
+ bool bDefPointer = true;
+
+ if (pMEvt)
+ {
+ aPnt = mpWindow->PixelToLogic(pMEvt->GetPosPixel());
+ nModifier = pMEvt->GetModifier();
+ bLeftDown = pMEvt->IsLeft();
+ }
+ else
+ {
+ aPnt = mpWindow->PixelToLogic(mpWindow->GetPointerPosPixel());
+ }
+
+ if (mpView->IsDragObj())
+ {
+ if (SD_MOD()->GetWaterCan() && !mpView->PickHandle(aPnt))
+ {
+ // water can mode
+ bDefPointer = false;
+ mpWindow->SetPointer(PointerStyle::Fill);
+ }
+ }
+ else
+ {
+ SdrHdl* pHdl = mpView->PickHandle(aPnt);
+
+ if (SD_MOD()->GetWaterCan() && !pHdl)
+ {
+ // water can mode
+ bDefPointer = false;
+ mpWindow->SetPointer(PointerStyle::Fill);
+ }
+ else if (!pHdl &&
+ mpViewShell->GetViewFrame()->HasChildWindow(SvxBmpMaskChildWindow::GetChildWindowId()))
+ {
+ // pipette mode
+ SfxChildWindow* pWnd = mpViewShell->GetViewFrame()->GetChildWindow(SvxBmpMaskChildWindow::GetChildWindowId());
+ SvxBmpMask* pMask = pWnd ? static_cast<SvxBmpMask*>(pWnd->GetWindow()) : nullptr;
+ if (pMask && pMask->IsEyedropping())
+ {
+ bDefPointer = false;
+ mpWindow->SetPointer(PointerStyle::RefHand);
+ }
+ }
+ else if (!mpView->IsAction())
+ {
+ SdrObject* pObj = nullptr;
+ SdrPageView* pPV = nullptr;
+ SdrViewEvent aVEvt;
+ SdrHitKind eHit = SdrHitKind::NONE;
+ SdrDragMode eDragMode = mpView->GetDragMode();
+
+ if (pMEvt)
+ {
+ eHit = mpView->PickAnything(*pMEvt, SdrMouseEventKind::MOVE, aVEvt);
+ }
+
+ if ((eDragMode == SdrDragMode::Rotate) && (eHit == SdrHitKind::MarkedObject))
+ {
+ // The goal of this request is show always the rotation arrow for 3D-objects at rotation mode
+ // Independent of the settings at Tools->Options->Draw "Objects always moveable"
+ // 2D-objects acquit in another way. Otherwise, the rotation of 3d-objects around any axes
+ // wouldn't be possible per default.
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ SdrObject* pObject = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ if ((dynamic_cast<const E3dObject* >(pObject) != nullptr) && (rMarkList.GetMarkCount() == 1))
+ {
+ mpWindow->SetPointer(PointerStyle::Rotate);
+ bDefPointer = false; // Otherwise it'll be called Joe's routine and the mousepointer will reconfigurate again
+ }
+ }
+
+ if (eHit == SdrHitKind::NONE)
+ {
+ // found nothing -> look after at the masterpage
+ pObj = mpView->PickObj(aPnt, mpView->getHitTolLog(), pPV, SdrSearchOptions::ALSOONMASTER);
+ }
+ else if (eHit == SdrHitKind::UnmarkedObject)
+ {
+ pObj = aVEvt.mpObj;
+ }
+ else if (eHit == SdrHitKind::TextEditObj && dynamic_cast< const FuSelection *>( this ) != nullptr)
+ {
+ SdrObjKind nSdrObjKind = aVEvt.mpObj->GetObjIdentifier();
+
+ if ( nSdrObjKind != SdrObjKind::Text &&
+ nSdrObjKind != SdrObjKind::TitleText &&
+ nSdrObjKind != SdrObjKind::OutlineText &&
+ aVEvt.mpObj->IsEmptyPresObj() )
+ {
+ pObj = nullptr;
+ bDefPointer = false;
+ mpWindow->SetPointer(PointerStyle::Arrow);
+ }
+ }
+
+ if (pObj && pMEvt && !pMEvt->IsMod2()
+ && dynamic_cast<const FuSelection*>(this) != nullptr)
+ {
+ // test for ImageMap
+ bDefPointer = !SetPointer(pObj, aPnt);
+
+ if (bDefPointer
+ && (dynamic_cast<const SdrObjGroup*>(pObj) != nullptr
+ || dynamic_cast<const E3dScene*>(pObj) != nullptr))
+ {
+ // take a glance into the group
+ pObj = mpView->PickObj(aPnt, mpView->getHitTolLog(), pPV,
+ SdrSearchOptions::ALSOONMASTER | SdrSearchOptions::DEEP);
+ if (pObj)
+ bDefPointer = !SetPointer(pObj, aPnt);
+ }
+ }
+ }
+ }
+
+ if (bDefPointer)
+ {
+ mpWindow->SetPointer(mpView->GetPreferredPointer(
+ aPnt, mpWindow->GetOutDev(), nModifier, bLeftDown));
+ }
+}
+
+/**
+ * Set cursor to pointer when in clickable area of an ImageMap
+ *
+ * @return True when pointer was set
+ */
+bool FuDraw::SetPointer(const SdrObject* pObj, const Point& rPos)
+{
+ bool bImageMapInfo = SvxIMapInfo::GetIMapInfo(pObj) != nullptr;
+
+ if (!bImageMapInfo)
+ return false;
+
+ const SdrLayerIDSet* pVisiLayer = &mpView->GetSdrPageView()->GetVisibleLayers();
+ sal_uInt16 nHitLog(sal_uInt16(mpWindow->PixelToLogic(Size(HITPIX, 0)).Width()));
+ ::tools::Long n2HitLog(nHitLog * 2);
+ Point aHitPosR(rPos);
+ Point aHitPosL(rPos);
+ Point aHitPosT(rPos);
+ Point aHitPosB(rPos);
+
+ aHitPosR.AdjustX(n2HitLog);
+ aHitPosL.AdjustX(-n2HitLog);
+ aHitPosT.AdjustY(n2HitLog);
+ aHitPosB.AdjustY(-n2HitLog);
+
+ if (!pObj->IsClosedObj()
+ || (SdrObjectPrimitiveHit(*pObj, aHitPosR, nHitLog, *mpView->GetSdrPageView(), pVisiLayer,
+ false)
+ && SdrObjectPrimitiveHit(*pObj, aHitPosL, nHitLog, *mpView->GetSdrPageView(),
+ pVisiLayer, false)
+ && SdrObjectPrimitiveHit(*pObj, aHitPosT, nHitLog, *mpView->GetSdrPageView(),
+ pVisiLayer, false)
+ && SdrObjectPrimitiveHit(*pObj, aHitPosB, nHitLog, *mpView->GetSdrPageView(),
+ pVisiLayer, false)))
+ {
+ // hit inside the object (without margin) or open object
+ if (SvxIMapInfo::GetHitIMapObject(pObj, rPos))
+ {
+ mpWindow->SetPointer(PointerStyle::RefHand);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Response of doubleclick
+ */
+void FuDraw::DoubleClick(const MouseEvent& rMEvt)
+{
+ sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
+
+ if ( mpView->AreObjectsMarked() )
+ {
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+
+ SdrInventor nInv = pObj->GetObjInventor();
+ SdrObjKind nSdrObjKind = pObj->GetObjIdentifier();
+
+ if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::OLE2)
+ {
+ // activate OLE-object
+ SfxInt16Item aItem(SID_OBJECT, 0);
+ mpViewShell->GetViewFrame()->
+ GetDispatcher()->ExecuteList(SID_OBJECT,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aItem });
+ }
+ else if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::Graphic && pObj->IsEmptyPresObj() )
+ {
+ mpViewShell->GetViewFrame()->
+ GetDispatcher()->Execute( SID_INSERT_GRAPHIC,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+ }
+ else if ( ( dynamic_cast< const SdrTextObj *>( pObj ) != nullptr || dynamic_cast< const SdrObjGroup *>( pObj ) != nullptr ) &&
+ !SD_MOD()->GetWaterCan() &&
+ mpViewShell->GetFrameView()->IsDoubleClickTextEdit() &&
+ !mpDocSh->IsReadOnly())
+ {
+ SfxUInt16Item aItem(SID_TEXTEDIT, 2);
+ mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(
+ SID_TEXTEDIT,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aItem });
+ }
+ else if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::Group)
+ {
+ // hit group -> select subobject
+ mpView->UnMarkAll();
+ mpView->MarkObj(aMDPos, nHitLog, rMEvt.IsShift(), true);
+ }
+ }
+ }
+ else
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+}
+
+bool FuDraw::RequestHelp(const HelpEvent& rHEvt)
+{
+ bool bReturn = false;
+
+ if (Help::IsBalloonHelpEnabled() || Help::IsQuickHelpEnabled())
+ {
+ SdrViewEvent aVEvt;
+
+ MouseEvent aMEvt(mpWindow->GetPointerPosPixel(), 1, MouseEventModifiers::NONE, MOUSE_LEFT);
+
+ SdrHitKind eHit = mpView->PickAnything(aMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+
+ SdrObject* pObj = aVEvt.mpObj;
+
+ if (eHit != SdrHitKind::NONE && pObj != nullptr)
+ {
+ Point aPosPixel = rHEvt.GetMousePosPixel();
+
+ bReturn = SetHelpText(pObj, aPosPixel, aVEvt);
+
+ if (!bReturn && (dynamic_cast< const SdrObjGroup *>( pObj ) != nullptr || dynamic_cast< const E3dScene* >(pObj) != nullptr))
+ {
+ // take a glance into the group
+ SdrPageView* pPV = nullptr;
+
+ Point aPos(mpWindow->PixelToLogic(mpWindow->ScreenToOutputPixel(aPosPixel)));
+
+ pObj = mpView->PickObj(aPos, mpView->getHitTolLog(), pPV, SdrSearchOptions::ALSOONMASTER | SdrSearchOptions::DEEP);
+ if (pObj)
+ bReturn = SetHelpText(pObj, aPosPixel, aVEvt);
+ }
+ }
+ }
+
+ if (!bReturn)
+ {
+ bReturn = FuPoor::RequestHelp(rHEvt);
+ }
+
+ if (!bReturn)
+ bReturn = mpView->RequestHelp(rHEvt);
+
+ return bReturn;
+}
+
+bool FuDraw::SetHelpText(const SdrObject* pObj, const Point& rPosPixel, const SdrViewEvent& rVEvt)
+{
+ OUString aHelpText;
+ Point aPos(mpWindow->PixelToLogic(mpWindow->ScreenToOutputPixel(rPosPixel)));
+ IMapObject* pIMapObj = SvxIMapInfo::GetHitIMapObject(pObj, aPos);
+
+ if (!rVEvt.mpURLField && !pIMapObj)
+ return false;
+
+ OUString aURL;
+ if (rVEvt.mpURLField)
+ aURL = INetURLObject::decode(rVEvt.mpURLField->GetURL(),
+ INetURLObject::DecodeMechanism::WithCharset);
+ else if (pIMapObj)
+ {
+ aURL = pIMapObj->GetAltText() +
+ " (" +
+ INetURLObject::decode(pIMapObj->GetURL(),
+ INetURLObject::DecodeMechanism::WithCharset) +
+ ")";
+ }
+ else
+ return false;
+
+ aHelpText = SfxHelp::GetURLHelpText(aURL);
+
+ if (aHelpText.isEmpty())
+ return false;
+
+ ::tools::Rectangle aLogicPix = mpWindow->LogicToPixel(pObj->GetLogicRect());
+ ::tools::Rectangle aScreenRect(mpWindow->OutputToScreenPixel(aLogicPix.TopLeft()),
+ mpWindow->OutputToScreenPixel(aLogicPix.BottomRight()));
+
+ if (Help::IsBalloonHelpEnabled())
+ Help::ShowBalloon( static_cast<vcl::Window*>(mpWindow), rPosPixel, aScreenRect, aHelpText);
+ else if (Help::IsQuickHelpEnabled())
+ Help::ShowQuickHelp( static_cast<vcl::Window*>(mpWindow), aScreenRect, aHelpText);
+
+ return true;
+}
+
+/** is called when the current function should be aborted. <p>
+ This is used when a function gets a KEY_ESCAPE but can also
+ be called directly.
+
+ @returns true if an active function was aborted
+*/
+bool FuDraw::cancel()
+{
+ bool bReturn = false;
+
+ if ( mpView->IsAction() )
+ {
+ mpView->BrkAction();
+ bReturn = true;
+ }
+ else if ( mpView->IsTextEdit() )
+ {
+ mpView->SdrEndTextEdit();
+ bReturn = true;
+
+ SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_DEC_INDENT );
+ rBindings.Invalidate( SID_INC_INDENT );
+ rBindings.Invalidate( SID_PARASPACE_INCREASE );
+ rBindings.Invalidate( SID_PARASPACE_DECREASE );
+ }
+ else if ( mpView->AreObjectsMarked() )
+ {
+ const SdrHdlList& rHdlList = mpView->GetHdlList();
+ SdrHdl* pHdl = rHdlList.GetFocusHdl();
+
+ if(pHdl)
+ {
+ const_cast<SdrHdlList&>(rHdlList).ResetFocusHdl();
+ }
+ else
+ {
+ mpView->UnmarkAll();
+ }
+
+ // Switch to FuSelect.
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(
+ SID_OBJECT_SELECT,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+
+ bReturn = true;
+ }
+
+ return bReturn;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fudspord.cxx b/sd/source/ui/func/fudspord.cxx
new file mode 100644
index 000000000..f129c523c
--- /dev/null
+++ b/sd/source/ui/func/fudspord.cxx
@@ -0,0 +1,131 @@
+/* -*- 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 <fudspord.hxx>
+
+#include <vcl/ptrstyle.hxx>
+
+#include <app.hrc>
+#include <fupoor.hxx>
+#include <ViewShell.hxx>
+#include <View.hxx>
+#include <Window.hxx>
+
+namespace sd {
+
+
+FuDisplayOrder::FuDisplayOrder( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq)
+: FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+, maPtr(PointerStyle::Arrow)
+, mpRefObj(nullptr)
+{
+}
+
+FuDisplayOrder::~FuDisplayOrder()
+{
+}
+
+void FuDisplayOrder::implClearOverlay()
+{
+ mpOverlay.reset();
+}
+
+rtl::Reference<FuPoor> FuDisplayOrder::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuDisplayOrder( pViewSh, pWin, pView, pDoc, rReq ) );
+ return xFunc;
+}
+
+bool FuDisplayOrder::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ // remember button state for creation of own MouseEvents
+ SetMouseButtonCode(rMEvt.GetButtons());
+
+ return true;
+}
+
+bool FuDisplayOrder::MouseMove(const MouseEvent& rMEvt)
+{
+ SdrPageView* pPV;
+ Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
+
+ SdrObject* pPickObj = mpView->PickObj(aPnt, mpView->getHitTolLog(), pPV);
+ if (pPickObj)
+ {
+ if (mpRefObj != pPickObj)
+ {
+ // delete current overlay
+ implClearOverlay();
+
+ // create new one
+ mpOverlay.reset( new SdrDropMarkerOverlay(*mpView, *pPickObj) );
+
+ // remember referenced object
+ mpRefObj = pPickObj;
+ }
+ }
+ else
+ {
+ mpRefObj = nullptr;
+ implClearOverlay();
+ }
+
+ return true;
+}
+
+bool FuDisplayOrder::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ // remember button state for creation of own MouseEvents
+ SetMouseButtonCode(rMEvt.GetButtons());
+
+ SdrPageView* pPV = nullptr;
+ Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
+
+ mpRefObj = mpView->PickObj(aPnt, mpView->getHitTolLog(), pPV);
+ if (mpRefObj)
+ {
+ if (nSlotId == SID_BEFORE_OBJ)
+ {
+ mpView->PutMarkedInFrontOfObj(mpRefObj);
+ }
+ else
+ {
+ mpView->PutMarkedBehindObj(mpRefObj);
+ }
+ }
+
+ mpViewShell->Cancel();
+
+ return true;
+}
+
+void FuDisplayOrder::Activate()
+{
+ maPtr = mpWindow->GetPointer();
+ mpWindow->SetPointer( PointerStyle::RefHand );
+}
+
+void FuDisplayOrder::Deactivate()
+{
+ mpWindow->SetPointer( maPtr );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuediglu.cxx b/sd/source/ui/func/fuediglu.cxx
new file mode 100644
index 000000000..5d9d61447
--- /dev/null
+++ b/sd/source/ui/func/fuediglu.cxx
@@ -0,0 +1,471 @@
+/* -*- 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 <fuediglu.hxx>
+#include <svl/eitem.hxx>
+#include <svx/svdglue.hxx>
+#include <sfx2/request.hxx>
+
+#include <app.hrc>
+
+#include <Window.hxx>
+#include <View.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <ToolBarManager.hxx>
+
+namespace sd {
+
+
+FuEditGluePoints::FuEditGluePoints (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuDraw(pViewSh, pWin, pView, pDoc, rReq)
+ //Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point,
+ //and SHIFT+ENTER key to decide the position and draw the new insert point
+ ,bBeginInsertPoint(false),
+ oldPoint(0,0)
+{
+}
+
+rtl::Reference<FuPoor> FuEditGluePoints::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent )
+{
+ FuEditGluePoints* pFunc;
+ rtl::Reference<FuPoor> xFunc( pFunc = new FuEditGluePoints( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ pFunc->SetPermanent( bPermanent );
+ return xFunc;
+}
+
+void FuEditGluePoints::DoExecute( SfxRequest& rReq )
+{
+ FuDraw::DoExecute( rReq );
+ mpView->SetInsGluePointMode(false);
+ mpViewShell->GetViewShellBase().GetToolBarManager()->AddToolBar(
+ ToolBarManager::ToolBarGroup::Function,
+ ToolBarManager::msGluePointsToolBar);
+}
+
+FuEditGluePoints::~FuEditGluePoints()
+{
+ mpView->BrkAction();
+ mpView->UnmarkAllGluePoints();
+ mpView->SetInsGluePointMode(false);
+}
+
+bool FuEditGluePoints::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ mpView->SetActualWin( mpWindow->GetOutDev() );
+
+ bool bReturn = FuDraw::MouseButtonDown(rMEvt);
+
+ if (mpView->IsAction())
+ {
+ if (rMEvt.IsRight())
+ mpView->BckAction();
+
+ return true;
+ }
+
+ if (rMEvt.IsLeft())
+ {
+ bReturn = true;
+ sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+ mpWindow->CaptureMouse();
+
+ SdrViewEvent aVEvt;
+ SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+
+ if (eHit == SdrHitKind::Handle)
+ {
+ // drag handle
+ SdrHdl* pHdl = aVEvt.mpHdl;
+
+ if (mpView->IsGluePointMarked(aVEvt.mpObj, aVEvt.mnGlueId) && rMEvt.IsShift())
+ {
+ mpView->UnmarkGluePoint(aVEvt.mpObj, aVEvt.mnGlueId);
+ pHdl = nullptr;
+ }
+
+ if (pHdl)
+ {
+ // drag handle
+ mpView->BegDragObj(aMDPos, nullptr, aVEvt.mpHdl, nDrgLog);
+ }
+ }
+ else if (eHit == SdrHitKind::MarkedObject && mpView->IsInsGluePointMode())
+ {
+ // insert gluepoints
+ mpView->BegInsGluePoint(aMDPos);
+ }
+ else if (eHit == SdrHitKind::MarkedObject && rMEvt.IsMod1())
+ {
+ // select gluepoints
+ if (!rMEvt.IsShift())
+ mpView->UnmarkAllGluePoints();
+
+ mpView->BegMarkGluePoints(aMDPos);
+ }
+ else if (eHit == SdrHitKind::MarkedObject && !rMEvt.IsShift() && !rMEvt.IsMod2())
+ {
+ // move object
+ mpView->BegDragObj(aMDPos, nullptr, nullptr, nDrgLog);
+ }
+ else if (eHit == SdrHitKind::Gluepoint)
+ {
+ // select gluepoints
+ if (!rMEvt.IsShift())
+ mpView->UnmarkAllGluePoints();
+
+ mpView->MarkGluePoint(aVEvt.mpObj, aVEvt.mnGlueId, false);
+ SdrHdl* pHdl = mpView->GetGluePointHdl(aVEvt.mpObj, aVEvt.mnGlueId);
+
+ if (pHdl)
+ {
+ mpView->BegDragObj(aMDPos, nullptr, pHdl, nDrgLog);
+ }
+ }
+ else
+ {
+ // select or drag object
+ if (!rMEvt.IsShift() && !rMEvt.IsMod2() && eHit == SdrHitKind::UnmarkedObject)
+ {
+ mpView->UnmarkAllObj();
+ }
+
+ bool bMarked = false;
+
+ if (!rMEvt.IsMod1())
+ {
+ if (rMEvt.IsMod2())
+ {
+ bMarked = mpView->MarkNextObj(aMDPos, nHitLog, rMEvt.IsShift());
+ }
+ else
+ {
+ bMarked = mpView->MarkObj(aMDPos, nHitLog, rMEvt.IsShift());
+ }
+ }
+
+ if (bMarked &&
+ (!rMEvt.IsShift() || eHit == SdrHitKind::MarkedObject))
+ {
+ // move object
+ mpView->BegDragObj(aMDPos, nullptr, aVEvt.mpHdl, nDrgLog);
+ }
+ else if (mpView->AreObjectsMarked())
+ {
+ // select gluepoint
+ if (!rMEvt.IsShift())
+ mpView->UnmarkAllGluePoints();
+
+ mpView->BegMarkGluePoints(aMDPos);
+ }
+ else
+ {
+ // select object
+ mpView->BegMarkObj(aMDPos);
+ }
+ }
+
+ ForcePointer(&rMEvt);
+ }
+
+ return bReturn;
+}
+
+bool FuEditGluePoints::MouseMove(const MouseEvent& rMEvt)
+{
+ mpView->SetActualWin( mpWindow->GetOutDev() );
+
+ FuDraw::MouseMove(rMEvt);
+
+ if (mpView->IsAction())
+ {
+ Point aPix(rMEvt.GetPosPixel());
+ Point aPnt( mpWindow->PixelToLogic(aPix) );
+ ForceScroll(aPix);
+ mpView->MovAction(aPnt);
+ }
+
+ ForcePointer(&rMEvt);
+
+ return true;
+}
+
+bool FuEditGluePoints::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ mpView->SetActualWin( mpWindow->GetOutDev() );
+
+ bool bReturn = false;
+
+ if (mpView->IsAction())
+ {
+ bReturn = true;
+ mpView->EndAction();
+ }
+
+ FuDraw::MouseButtonUp(rMEvt);
+
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+ Point aPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() );
+
+ if (std::abs(aMDPos.X() - aPos.X()) < nDrgLog &&
+ std::abs(aMDPos.Y() - aPos.Y()) < nDrgLog &&
+ !rMEvt.IsShift() && !rMEvt.IsMod2())
+ {
+ SdrViewEvent aVEvt;
+ SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+
+ if (eHit == SdrHitKind::NONE)
+ {
+ // click on position: deselect
+ mpView->UnmarkAllObj();
+ }
+ }
+
+ mpWindow->ReleaseMouse();
+
+ return bReturn;
+}
+
+/**
+ * Process keyboard input
+ * @returns sal_True if a KeyEvent is being processed, sal_False otherwise
+ */
+bool FuEditGluePoints::KeyInput(const KeyEvent& rKEvt)
+{
+ mpView->SetActualWin( mpWindow->GetOutDev() );
+
+ //Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point,
+ //and SHIFT+ENTER key to decide the position and draw the new insert point
+
+ bool bReturn = false;
+
+ switch (rKEvt.GetKeyCode().GetCode())
+ {
+ case KEY_UP:
+ case KEY_DOWN:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ {
+ if(rKEvt.GetKeyCode().IsShift()&& mpView->IsInsGluePointMode() ){
+ ::tools::Long nX = 0;
+ ::tools::Long nY = 0;
+ sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
+ if (nCode == KEY_UP)
+ {
+ // scroll up
+ nX = 0;
+ nY =-1;
+ }
+ else if (nCode == KEY_DOWN)
+ {
+ // scroll down
+ nX = 0;
+ nY = 1;
+ }
+ else if (nCode == KEY_LEFT)
+ {
+ // scroll left
+ nX =-1;
+ nY = 0;
+ }
+ else if (nCode == KEY_RIGHT)
+ {
+ // scroll right
+ nX = 1;
+ nY = 0;
+ }
+ Point centerPoint;
+ ::tools::Rectangle rect = mpView->GetMarkedObjRect();
+ centerPoint = mpWindow->LogicToPixel(rect.Center());
+ Point aPoint = bBeginInsertPoint? oldPoint:centerPoint;
+ Point ePoint = aPoint + Point(nX,nY);
+ mpWindow->SetPointerPosPixel(ePoint);
+ //simulate mouse move action
+ MouseEvent eMevt(ePoint, 1, MouseEventModifiers::DRAGMOVE, MOUSE_LEFT, 0);
+ MouseMove(eMevt);
+ oldPoint = ePoint;
+ bBeginInsertPoint = true;
+ bReturn = true;
+ }
+ }
+ break;
+ case KEY_RETURN:
+ if(rKEvt.GetKeyCode().IsShift() && mpView->IsInsGluePointMode() )
+ {
+ if(bBeginInsertPoint)
+ {
+ mpWindow->SetPointerPosPixel(oldPoint);
+ //simulate mouse button down action
+ MouseEvent aMevt(oldPoint, 1,
+ MouseEventModifiers::SIMPLEMOVE | MouseEventModifiers::DRAGMOVE,
+ MOUSE_LEFT, KEY_SHIFT);
+ // MT IA2: Not used?
+ // sal_uInt16 ubuttons = aMevt.GetButtons();
+ // sal_uInt16 uMod = aMevt.GetModifier();
+ MouseButtonDown(aMevt);
+ mpWindow->CaptureMouse();
+ //simulate mouse button up action
+ MouseEvent rMEvt(oldPoint+Point(0,0), 1,
+ MouseEventModifiers::SIMPLEMOVE | MouseEventModifiers::ENTERWINDOW,
+ MOUSE_LEFT, KEY_SHIFT);
+ MouseButtonUp(rMEvt);
+ bReturn= true;
+ }
+ }
+ break;
+ }
+
+ if(!bReturn)
+ bReturn = FuDraw::KeyInput(rKEvt);
+
+ return bReturn;
+}
+
+//Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point, and
+//SHIFT+ENTER key to decide the position and draw the new insert point
+void FuEditGluePoints::ForcePointer(const MouseEvent* pMEvt)
+{
+ if(bBeginInsertPoint && pMEvt)
+ {
+ MouseEvent aMEvt(pMEvt->GetPosPixel(), pMEvt->GetClicks(),
+ pMEvt->GetMode(), pMEvt->GetButtons(), pMEvt->GetModifier() & ~KEY_SHIFT);
+ FuDraw::ForcePointer(&aMEvt);
+ }
+ else
+ {
+ FuDraw::ForcePointer(pMEvt);
+ }
+}
+
+bool FuEditGluePoints::Command(const CommandEvent& rCEvt)
+{
+ mpView->SetActualWin( mpWindow->GetOutDev() );
+ return FuPoor::Command( rCEvt );
+}
+
+void FuEditGluePoints::Activate()
+{
+ mpView->SetGluePointEditMode();
+ FuDraw::Activate();
+}
+
+void FuEditGluePoints::Deactivate()
+{
+ mpView->SetGluePointEditMode( false );
+ FuDraw::Deactivate();
+}
+
+void FuEditGluePoints::ReceiveRequest(SfxRequest& rReq)
+{
+ switch (rReq.GetSlot())
+ {
+ case SID_GLUE_INSERT_POINT:
+ {
+ mpView->SetInsGluePointMode(!mpView->IsInsGluePointMode());
+ }
+ break;
+
+ case SID_GLUE_ESCDIR_LEFT:
+ {
+ mpView->SetMarkedGluePointsEscDir( SdrEscapeDirection::LEFT,
+ !mpView->IsMarkedGluePointsEscDir( SdrEscapeDirection::LEFT ) );
+ }
+ break;
+
+ case SID_GLUE_ESCDIR_RIGHT:
+ {
+ mpView->SetMarkedGluePointsEscDir( SdrEscapeDirection::RIGHT,
+ !mpView->IsMarkedGluePointsEscDir( SdrEscapeDirection::RIGHT ) );
+ }
+ break;
+
+ case SID_GLUE_ESCDIR_TOP:
+ {
+ mpView->SetMarkedGluePointsEscDir( SdrEscapeDirection::TOP,
+ !mpView->IsMarkedGluePointsEscDir( SdrEscapeDirection::TOP ) );
+ }
+ break;
+
+ case SID_GLUE_ESCDIR_BOTTOM:
+ {
+ mpView->SetMarkedGluePointsEscDir( SdrEscapeDirection::BOTTOM,
+ !mpView->IsMarkedGluePointsEscDir( SdrEscapeDirection::BOTTOM ) );
+ }
+ break;
+
+ case SID_GLUE_PERCENT:
+ {
+ const SfxItemSet* pSet = rReq.GetArgs();
+ const SfxPoolItem& rItem = pSet->Get(SID_GLUE_PERCENT);
+ bool bPercent = static_cast<const SfxBoolItem&>(rItem).GetValue();
+ mpView->SetMarkedGluePointsPercent(bPercent);
+ }
+ break;
+
+ case SID_GLUE_HORZALIGN_CENTER:
+ {
+ mpView->SetMarkedGluePointsAlign(false, SdrAlign::HORZ_CENTER);
+ }
+ break;
+
+ case SID_GLUE_HORZALIGN_LEFT:
+ {
+ mpView->SetMarkedGluePointsAlign(false, SdrAlign::HORZ_LEFT);
+ }
+ break;
+
+ case SID_GLUE_HORZALIGN_RIGHT:
+ {
+ mpView->SetMarkedGluePointsAlign(false, SdrAlign::HORZ_RIGHT);
+ }
+ break;
+
+ case SID_GLUE_VERTALIGN_CENTER:
+ {
+ mpView->SetMarkedGluePointsAlign(true, SdrAlign::VERT_CENTER);
+ }
+ break;
+
+ case SID_GLUE_VERTALIGN_TOP:
+ {
+ mpView->SetMarkedGluePointsAlign(true, SdrAlign::VERT_TOP);
+ }
+ break;
+
+ case SID_GLUE_VERTALIGN_BOTTOM:
+ {
+ mpView->SetMarkedGluePointsAlign(true, SdrAlign::VERT_BOTTOM);
+ }
+ break;
+ }
+
+ // at the end, call base class
+ FuPoor::ReceiveRequest(rReq);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuexecuteinteraction.cxx b/sd/source/ui/func/fuexecuteinteraction.cxx
new file mode 100644
index 000000000..d1956fcf5
--- /dev/null
+++ b/sd/source/ui/func/fuexecuteinteraction.cxx
@@ -0,0 +1,237 @@
+/* -*- 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 <fuexecuteinteraction.hxx>
+
+#include <app.hrc>
+#include <config_features.h>
+#include <avmedia/mediawindow.hxx>
+#include <basic/sbstar.hxx>
+#include <sfx2/app.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <sfx2/viewfrm.hxx>
+#include <svl/intitem.hxx>
+#include <svl/stritem.hxx>
+#include <svl/urihelper.hxx>
+#include <tools/urlobj.hxx>
+#include <o3tl/string_view.hxx>
+
+#include <DrawViewShell.hxx>
+#include <GraphicDocShell.hxx>
+#include <ViewShell.hxx>
+#include <anminfo.hxx>
+#include <drawdoc.hxx>
+#include <drawview.hxx>
+#include <pgjump.hxx>
+
+#include <com/sun/star/media/XPlayer.hpp>
+
+using namespace css;
+
+namespace sd
+{
+FuExecuteInteraction::FuExecuteInteraction(ViewShell* pViewSh, ::sd::Window* pWin,
+ ::sd::View* pView, SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuExecuteInteraction::Create(ViewShell* pViewSh, ::sd::Window* pWin,
+ ::sd::View* pView, SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+{
+ rtl::Reference<FuPoor> xFunc(new FuExecuteInteraction(pViewSh, pWin, pView, pDoc, rReq));
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuExecuteInteraction::DoExecute(SfxRequest&)
+{
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if (rMarkList.GetMarkCount() != 1)
+ return;
+
+ SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+
+ if (dynamic_cast<const GraphicDocShell*>(mpDocSh) != nullptr
+ || dynamic_cast<const DrawView*>(mpView) == nullptr)
+ return;
+
+ SdAnimationInfo* pInfo = SdDrawDocument::GetAnimationInfo(pObj);
+ if (!pInfo)
+ return;
+
+ switch (pInfo->meClickAction)
+ {
+ case presentation::ClickAction_BOOKMARK:
+ {
+ // Jump to Bookmark (Page or Object)
+ SfxStringItem aItem(SID_NAVIGATOR_OBJECT, pInfo->GetBookmark());
+ mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(
+ SID_NAVIGATOR_OBJECT, SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem });
+ }
+ break;
+
+ case presentation::ClickAction_DOCUMENT:
+ {
+ OUString sBookmark(pInfo->GetBookmark());
+ // Jump to document
+ if (!sBookmark.isEmpty())
+ {
+ SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName());
+ SfxStringItem aStrItem(SID_FILE_NAME, sBookmark);
+ SfxViewFrame* pFrame = mpViewShell->GetViewFrame();
+ SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame);
+ SfxBoolItem aBrowseItem(SID_BROWSE, true);
+ pFrame->GetDispatcher()->ExecuteList(
+ SID_OPENDOC, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aStrItem, &aFrameItem, &aBrowseItem, &aReferer });
+ }
+ }
+ break;
+
+ case presentation::ClickAction_PREVPAGE:
+ {
+ // Jump to the previous page
+ SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_PREVIOUS);
+ mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(
+ SID_NAVIGATOR_PAGE, SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem });
+ }
+ break;
+
+ case presentation::ClickAction_NEXTPAGE:
+ {
+ // Jump to the next page
+ SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_NEXT);
+ mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(
+ SID_NAVIGATOR_PAGE, SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem });
+ }
+ break;
+
+ case presentation::ClickAction_FIRSTPAGE:
+ {
+ // Jump to the first page
+ SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_FIRST);
+ mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(
+ SID_NAVIGATOR_PAGE, SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem });
+ }
+ break;
+
+ case presentation::ClickAction_LASTPAGE:
+ {
+ // Jump to the last page
+ SfxUInt16Item aItem(SID_NAVIGATOR_PAGE, PAGE_LAST);
+ mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(
+ SID_NAVIGATOR_PAGE, SfxCallMode::SLOT | SfxCallMode::RECORD, { &aItem });
+ }
+ break;
+
+ case presentation::ClickAction_SOUND:
+ {
+#if HAVE_FEATURE_AVMEDIA
+ try
+ {
+ mxPlayer.set(avmedia::MediaWindow::createPlayer(pInfo->GetBookmark(), "" /*TODO?*/),
+ uno::UNO_SET_THROW);
+ mxPlayer->start();
+ }
+ catch (uno::Exception&)
+ {
+ }
+#endif
+ }
+ break;
+
+ case presentation::ClickAction_VERB:
+ {
+ // Assign verb
+ mpView->UnmarkAll();
+ mpView->MarkObj(pObj, mpView->GetSdrPageView());
+ DrawViewShell* pDrViewSh = static_cast<DrawViewShell*>(mpViewShell);
+ pDrViewSh->DoVerb(static_cast<sal_Int16>(pInfo->mnVerb));
+ }
+ break;
+
+ case presentation::ClickAction_PROGRAM:
+ {
+ OUString aBaseURL = GetDocSh()->GetMedium()->GetBaseURL();
+ INetURLObject aURL(::URIHelper::SmartRel2Abs(
+ INetURLObject(aBaseURL), pInfo->GetBookmark(), URIHelper::GetMaybeFileHdl(), true,
+ false, INetURLObject::EncodeMechanism::WasEncoded,
+ INetURLObject::DecodeMechanism::Unambiguous));
+
+ if (INetProtocol::File == aURL.GetProtocol())
+ {
+ SfxStringItem aUrl(SID_FILE_NAME,
+ aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE));
+ SfxBoolItem aBrowsing(SID_BROWSE, true);
+
+ SfxViewFrame* pViewFrm = SfxViewFrame::Current();
+ if (pViewFrm)
+ pViewFrm->GetDispatcher()->ExecuteList(
+ SID_OPENDOC, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aUrl, &aBrowsing });
+ }
+ }
+ break;
+
+#if HAVE_FEATURE_SCRIPTING
+ case presentation::ClickAction_MACRO:
+ {
+ // Execute macro
+ OUString aMacro = pInfo->GetBookmark();
+
+ if (SfxApplication::IsXScriptURL(aMacro))
+ {
+ uno::Any aRet;
+ uno::Sequence<sal_Int16> aOutArgsIndex;
+ uno::Sequence<uno::Any> aParams;
+ uno::Sequence<uno::Any> aOutArgs;
+
+ mpDocSh->CallXScript(aMacro, aParams, aRet, aOutArgsIndex, aOutArgs);
+ }
+ else
+ {
+ // aMacro has got following format:
+ // "Macroname.Modulname.Libname.Documentname" or
+ // "Macroname.Modulname.Libname.Applicationname"
+ sal_Int32 nIdx{ 0 };
+ const std::u16string_view aMacroName = o3tl::getToken(aMacro, 0, '.', nIdx);
+ const std::u16string_view aModulName = o3tl::getToken(aMacro, 0, '.', nIdx);
+
+ // Currently the "Call" method only resolves modulename+macroname
+ mpDocSh->GetBasic()->Call(OUString::Concat(aModulName) + "." + aMacroName);
+ }
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuexpand.cxx b/sd/source/ui/func/fuexpand.cxx
new file mode 100644
index 000000000..822174ed9
--- /dev/null
+++ b/sd/source/ui/func/fuexpand.cxx
@@ -0,0 +1,256 @@
+/* -*- 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 <fuexpand.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <svx/svdotext.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/svdundo.hxx>
+#include <editeng/outlobj.hxx>
+#include <svx/svdetc.hxx>
+#include <xmloff/autolayout.hxx>
+#include <sal/log.hxx>
+
+#include <app.hrc>
+#include <strings.hrc>
+#include <pres.hxx>
+#include <View.hxx>
+#include <sdpage.hxx>
+#include <Outliner.hxx>
+#include <drawdoc.hxx>
+#include <ViewShell.hxx>
+#include <sdresid.hxx>
+#include <sdmod.hxx>
+#include <sfx2/dispatch.hxx>
+#include <editeng/eeitem.hxx>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+
+FuExpandPage::FuExpandPage (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuExpandPage::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuExpandPage( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuExpandPage::DoExecute( SfxRequest& )
+{
+ if ( mpView && mpView->IsTextEdit() )
+ mpView->SdrEndTextEdit();
+
+ // find selected page (only standard pages)
+ SdPage* pActualPage = nullptr;
+ sal_uInt16 i = 0;
+ sal_uInt16 nCount = mpDoc->GetSdPageCount(PageKind::Standard);
+
+ while (!pActualPage && i < nCount)
+ {
+ if (mpDoc->GetSdPage(i, PageKind::Standard)->IsSelected())
+ {
+ pActualPage = mpDoc->GetSdPage(i, PageKind::Standard);
+ }
+
+ i++;
+ }
+
+ if (!pActualPage)
+ return;
+
+ SdOutliner aOutliner( mpDoc, OutlinerMode::OutlineObject );
+ aOutliner.SetUpdateLayout(false);
+ aOutliner.EnableUndo(false);
+
+ if (mpDocSh)
+ aOutliner.SetRefDevice( SD_MOD()->GetVirtualRefDevice() );
+
+ aOutliner.SetDefTab( mpDoc->GetDefaultTabulator() );
+ aOutliner.SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(mpDoc->GetStyleSheetPool()));
+
+ SdrLayerIDSet aVisibleLayers = pActualPage->TRG_GetMasterPageVisibleLayers();
+ sal_uInt16 nActualPageNum = pActualPage->GetPageNum();
+ SdPage* pActualNotesPage = static_cast<SdPage*>(mpDoc->GetPage(nActualPageNum + 1));
+ SdrTextObj* pActualOutline = static_cast<SdrTextObj*>(pActualPage->GetPresObj(PresObjKind::Outline));
+
+ if (pActualOutline)
+ {
+ const bool bUndo = mpView->IsUndoEnabled();
+
+ if( bUndo )
+ mpView->BegUndo(SdResId(STR_UNDO_EXPAND_PAGE));
+
+ // set current structuring-object into outliner
+ OutlinerParaObject* pParaObj = pActualOutline->GetOutlinerParaObject();
+ aOutliner.SetText(*pParaObj);
+
+ // remove hard paragraph- and character attributes
+ SfxItemSetFixed<EE_ITEMS_START, EE_ITEMS_END> aEmptyEEAttr(mpDoc->GetPool());
+ sal_Int32 nParaCount1 = aOutliner.GetParagraphCount();
+
+ for (sal_Int32 nPara = 0; nPara < nParaCount1; nPara++)
+ {
+ aOutliner.RemoveCharAttribs(nPara);
+ aOutliner.SetParaAttribs(nPara, aEmptyEEAttr);
+ }
+
+ sal_uInt16 nPos = 2;
+ Paragraph* pPara = aOutliner.GetParagraph( 0 );
+
+ while (pPara)
+ {
+ sal_Int32 nParaPos = aOutliner.GetAbsPos( pPara );
+ sal_Int16 nDepth = aOutliner.GetDepth( nParaPos );
+ if ( nDepth == 0 )
+ {
+ // page with title & structuring!
+ rtl::Reference<SdPage> pPage = mpDoc->AllocSdPage(false);
+ pPage->SetSize(pActualPage->GetSize() );
+ pPage->SetBorder(pActualPage->GetLeftBorder(),
+ pActualPage->GetUpperBorder(),
+ pActualPage->GetRightBorder(),
+ pActualPage->GetLowerBorder() );
+ pPage->SetName(OUString());
+
+ // insert page after current page
+ mpDoc->InsertPage(pPage.get(), nActualPageNum + nPos);
+ nPos++;
+
+ if( bUndo )
+ mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pPage));
+
+ // use MasterPage of the current page
+ pPage->TRG_SetMasterPage(pActualPage->TRG_GetMasterPage());
+ pPage->SetLayoutName(pActualPage->GetLayoutName());
+ pPage->SetAutoLayout(AUTOLAYOUT_TITLE_CONTENT, true);
+ pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+
+ // notes-page
+ rtl::Reference<SdPage> pNotesPage = mpDoc->AllocSdPage(false);
+ pNotesPage->SetSize(pActualNotesPage->GetSize());
+ pNotesPage->SetBorder(pActualNotesPage->GetLeftBorder(),
+ pActualNotesPage->GetUpperBorder(),
+ pActualNotesPage->GetRightBorder(),
+ pActualNotesPage->GetLowerBorder() );
+ pNotesPage->SetPageKind(PageKind::Notes);
+ pNotesPage->SetName(OUString());
+
+ // insert page after current page
+ mpDoc->InsertPage(pNotesPage.get(), nActualPageNum + nPos);
+ nPos++;
+
+ if( bUndo )
+ mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pNotesPage));
+
+ // use MasterPage of the current page
+ pNotesPage->TRG_SetMasterPage(pActualNotesPage->TRG_GetMasterPage());
+ pNotesPage->SetLayoutName(pActualNotesPage->GetLayoutName());
+ pNotesPage->SetAutoLayout(pActualNotesPage->GetAutoLayout(), true);
+ pNotesPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+
+ // create title text objects
+ SdrTextObj* pTextObj = static_cast<SdrTextObj*>(pPage->GetPresObj(PresObjKind::Title));
+ SAL_WARN_IF(!pTextObj, "sd.core", "worrying lack of PresObjKind::Title object");
+ if (!pTextObj)
+ continue;
+
+ std::optional<OutlinerParaObject> pOutlinerParaObject = aOutliner.CreateParaObject( nParaPos, 1);
+ pOutlinerParaObject->SetOutlinerMode(OutlinerMode::TitleObject);
+
+ if( pOutlinerParaObject->GetDepth(0) != -1 )
+ {
+ std::unique_ptr<SdrOutliner> pTempOutl = SdrMakeOutliner(OutlinerMode::TitleObject, *mpDoc);
+
+ pTempOutl->SetText( *pOutlinerParaObject );
+
+ pOutlinerParaObject.reset();
+
+ pTempOutl->SetDepth( pTempOutl->GetParagraph( 0 ), -1 );
+
+ pOutlinerParaObject = pTempOutl->CreateParaObject();
+ }
+
+ pTextObj->SetOutlinerParaObject(std::move(pOutlinerParaObject));
+
+ pTextObj->SetEmptyPresObj(false);
+
+ SfxStyleSheet* pSheet = pPage->GetStyleSheetForPresObj(PresObjKind::Title);
+ pTextObj->NbcSetStyleSheet(pSheet, false);
+
+ SdrTextObj* pOutlineObj = nullptr;
+ sal_Int32 nChildCount = aOutliner.GetChildCount(pPara);
+ if (nChildCount > 0)
+ pOutlineObj = static_cast<SdrTextObj*>( pPage->GetPresObj(PresObjKind::Outline) );
+ if (pOutlineObj)
+ {
+ // create structuring text objects
+ std::optional<OutlinerParaObject> pOPO = aOutliner.CreateParaObject(++nParaPos, nChildCount);
+
+ std::unique_ptr<SdrOutliner> pTempOutl = SdrMakeOutliner(OutlinerMode::OutlineObject, *mpDoc);
+ pTempOutl->SetText( *pOPO );
+
+ sal_Int32 nParaCount2 = pTempOutl->GetParagraphCount();
+ sal_Int32 nPara;
+ for( nPara = 0; nPara < nParaCount2; nPara++ )
+ {
+ pTempOutl->SetDepth (
+ pTempOutl->GetParagraph( nPara ),
+ pTempOutl->GetDepth( nPara ) - 1);
+ }
+
+ pOPO = pTempOutl->CreateParaObject();
+ pTempOutl.reset();
+
+ pOutlineObj->SetOutlinerParaObject( std::move(pOPO) );
+ pOutlineObj->SetEmptyPresObj(false);
+
+ // remove hard attributes (Flag to sal_True)
+ SfxItemSet aAttr(mpDoc->GetPool());
+ aAttr.Put(XLineStyleItem(drawing::LineStyle_NONE));
+ aAttr.Put(XFillStyleItem(drawing::FillStyle_NONE));
+ pOutlineObj->SetMergedItemSet(aAttr);
+ }
+ }
+
+ pPara = aOutliner.GetParagraph( ++nParaPos );
+ }
+
+ if( bUndo )
+ mpView->EndUndo();
+ }
+
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_DELETE_PAGE, SfxCallMode::SYNCHRON | SfxCallMode::RECORD);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuformatpaintbrush.cxx b/sd/source/ui/func/fuformatpaintbrush.cxx
new file mode 100644
index 000000000..40bde764f
--- /dev/null
+++ b/sd/source/ui/func/fuformatpaintbrush.cxx
@@ -0,0 +1,276 @@
+/* -*- 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 <sfx2/request.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+
+#include <svx/svxids.hrc>
+#include <svx/svdotable.hxx>
+#include <svx/svdundo.hxx>
+#include <editeng/outliner.hxx>
+#include <vcl/ptrstyle.hxx>
+
+#include <fuformatpaintbrush.hxx>
+#include <drawview.hxx>
+#include <DrawViewShell.hxx>
+#include <FrameView.hxx>
+#include <drawdoc.hxx>
+#include <ViewShellBase.hxx>
+
+#include <Window.hxx>
+
+namespace sd {
+
+
+FuFormatPaintBrush::FuFormatPaintBrush( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+: FuText(pViewSh, pWin, pView, pDoc, rReq)
+, mbPermanent( false )
+, mbOldIsQuickTextEditMode( true )
+{
+}
+
+rtl::Reference<FuPoor> FuFormatPaintBrush::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuFormatPaintBrush( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute( rReq );
+ return xFunc;
+}
+
+void FuFormatPaintBrush::DoExecute( SfxRequest& rReq )
+{
+ const SfxItemSet *pArgs = rReq.GetArgs();
+ if( pArgs && pArgs->Count() >= 1 )
+ {
+ mbPermanent = pArgs->Get(SID_FORMATPAINTBRUSH).GetValue();
+ }
+
+ if( mpView )
+ {
+ mpView->TakeFormatPaintBrush( mxItemSet );
+ }
+}
+
+void FuFormatPaintBrush::implcancel()
+{
+ if( mpViewShell && mpViewShell->GetViewFrame() )
+ {
+ SfxViewFrame* pViewFrame = mpViewShell->GetViewFrame();
+ pViewFrame->GetBindings().Invalidate(SID_FORMATPAINTBRUSH);
+ pViewFrame->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+ }
+}
+
+static void unmarkimpl( SdrView* pView )
+{
+ pView->SdrEndTextEdit();
+ pView->UnMarkAll();
+}
+
+bool FuFormatPaintBrush::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ if(mpView&&mpWindow)
+ {
+ SdrViewEvent aVEvt;
+ SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+
+ if( (eHit == SdrHitKind::TextEdit) || (eHit == SdrHitKind::TextEditObj && ( mpViewShell->GetFrameView()->IsQuickEdit() || dynamic_cast<sdr::table::SdrTableObj*>(aVEvt.mpObj) != nullptr ) ))
+ {
+ SdrPageView* pPV=nullptr;
+ sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
+ SdrObject* pPickObj = mpView->PickObj(mpWindow->PixelToLogic(rMEvt.GetPosPixel()),nHitLog, pPV, SdrSearchOptions::PICKMARKABLE);
+ if( (pPickObj != nullptr) && !pPickObj->IsEmptyPresObj() )
+ {
+ // if we text hit another shape than the one currently selected, unselect the old one now
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ if( rMarkList.GetMarkCount() > 0 )
+ {
+ if( rMarkList.GetMarkCount() == 1 )
+ {
+ if( rMarkList.GetMark(0)->GetMarkedSdrObj() != pPickObj )
+ {
+
+ // if current selected shape is not that of the hit text edit, deselect it
+ unmarkimpl( mpView );
+ }
+ }
+ else
+ {
+ // more than one shape selected, deselect all of them
+ unmarkimpl( mpView );
+ }
+ }
+ MouseEvent aMEvt( rMEvt.GetPosPixel(), rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), 0 );
+ return FuText::MouseButtonDown(aMEvt);
+ }
+
+ if (aVEvt.mpObj == nullptr)
+ aVEvt.mpObj = pPickObj;
+ }
+
+ unmarkimpl( mpView );
+
+ if (aVEvt.mpObj)
+ {
+ sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
+ mpView->MarkObj(mpWindow->PixelToLogic( rMEvt.GetPosPixel() ), nHitLog, false/*bToggle*/);
+ return true;
+ }
+ }
+ return false;
+}
+
+bool FuFormatPaintBrush::MouseMove(const MouseEvent& rMEvt)
+{
+ bool bReturn = false;
+ if( mpWindow && mpView )
+ {
+ if ( mpView->IsTextEdit() )
+ {
+ bReturn = FuText::MouseMove( rMEvt );
+ mpWindow->SetPointer(PointerStyle::Fill);
+ }
+ else
+ {
+ sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
+ SdrPageView* pPV=nullptr;
+ SdrObject* pObj = mpView->PickObj(mpWindow->PixelToLogic( rMEvt.GetPosPixel() ),nHitLog, pPV, SdrSearchOptions::PICKMARKABLE);
+ if (pObj && HasContentForThisType(pObj->GetObjInventor(),pObj->GetObjIdentifier()) )
+ mpWindow->SetPointer(PointerStyle::Fill);
+ else
+ mpWindow->SetPointer(PointerStyle::Arrow);
+ }
+ }
+ return bReturn;
+}
+
+bool FuFormatPaintBrush::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ if( mxItemSet && mpView && mpView->AreObjectsMarked() )
+ {
+ bool bNoCharacterFormats = false;
+ bool bNoParagraphFormats = false;
+ {
+ if( (rMEvt.GetModifier()&KEY_MOD1) && (rMEvt.GetModifier()&KEY_SHIFT) )
+ bNoCharacterFormats = true;
+ else if( rMEvt.GetModifier() & KEY_MOD1 )
+ bNoParagraphFormats = true;
+ }
+
+ OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
+ if( pOLV )
+ pOLV->MouseButtonUp(rMEvt);
+
+ Paste( bNoCharacterFormats, bNoParagraphFormats );
+ if(mpViewShell)
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate(SID_FORMATPAINTBRUSH);
+
+ if( mbPermanent )
+ return true;
+ }
+
+ implcancel();
+ return true;
+}
+
+bool FuFormatPaintBrush::KeyInput(const KeyEvent& rKEvt)
+{
+ if (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE)
+ {
+ implcancel();
+ return true;
+ }
+ return FuPoor::KeyInput(rKEvt);
+}
+
+void FuFormatPaintBrush::Activate()
+{
+ mbOldIsQuickTextEditMode = mpViewShell->GetFrameView()->IsQuickEdit();
+ if( !mbOldIsQuickTextEditMode )
+ {
+ mpViewShell->GetFrameView()->SetQuickEdit(true);
+ mpView->SetQuickTextEditMode(true);
+ }
+}
+
+void FuFormatPaintBrush::Deactivate()
+{
+ if( !mbOldIsQuickTextEditMode )
+ {
+ mpViewShell->GetFrameView()->SetQuickEdit(false);
+ mpView->SetQuickTextEditMode(false);
+ }
+}
+
+bool FuFormatPaintBrush::HasContentForThisType( SdrInventor nObjectInventor, SdrObjKind nObjectIdentifier ) const
+{
+ if (mxItemSet == nullptr)
+ return false;
+ if( !mpView || (!SdrObjEditView::SupportsFormatPaintbrush( nObjectInventor, nObjectIdentifier) ) )
+ return false;
+ return true;
+}
+
+void FuFormatPaintBrush::Paste( bool bNoCharacterFormats, bool bNoParagraphFormats )
+{
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ if( !(mxItemSet && ( rMarkList.GetMarkCount() == 1 )) )
+ return;
+
+ SdrObject* pObj( nullptr );
+ bool bUndo = mpDoc->IsUndoEnabled();
+
+ if( bUndo && !mpView->GetTextEditOutlinerView() )
+ pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+
+ // n685123: ApplyFormatPaintBrush itself would store undo information
+ // except in a few cases (?)
+ if( pObj )
+ {
+ OUString sLabel( mpViewShell->GetViewShellBase().RetrieveLabelFromCommand(".uno:FormatPaintbrush" ) );
+ mpDoc->BegUndo( sLabel );
+ if (dynamic_cast< sdr::table::SdrTableObj* >( pObj ) == nullptr)
+ mpDoc->AddUndo( mpDoc->GetSdrUndoFactory().CreateUndoAttrObject( *pObj, false, true ) );
+ }
+
+ mpView->ApplyFormatPaintBrush( *mxItemSet, bNoCharacterFormats, bNoParagraphFormats );
+
+ if( pObj )
+ {
+ mpDoc->EndUndo();
+ }
+}
+
+/* static */ void FuFormatPaintBrush::GetMenuState( DrawViewShell const & rDrawViewShell, SfxItemSet &rSet )
+{
+ const SdrMarkList& rMarkList = rDrawViewShell.GetDrawView()->GetMarkedObjectList();
+
+ if( rMarkList.GetMarkCount() == 1 )
+ {
+ SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ if( pObj && SdrObjEditView::SupportsFormatPaintbrush(pObj->GetObjInventor(),pObj->GetObjIdentifier()) )
+ return;
+ }
+ rSet.DisableItem( SID_FORMATPAINTBRUSH );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuhhconv.cxx b/sd/source/ui/func/fuhhconv.cxx
new file mode 100644
index 000000000..a312439bb
--- /dev/null
+++ b/sd/source/ui/func/fuhhconv.cxx
@@ -0,0 +1,256 @@
+/* -*- 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 <com/sun/star/i18n/TextConversionOption.hpp>
+
+#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
+#include <com/sun/star/lang/XMultiComponentFactory.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <comphelper/propertysequence.hxx>
+#include <cppuhelper/bootstrap.hxx>
+#include <svl/style.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/langitem.hxx>
+#include <editeng/fontitem.hxx>
+
+#include <fuhhconv.hxx>
+#include <drawdoc.hxx>
+#include <Outliner.hxx>
+#include <DrawViewShell.hxx>
+#include <OutlineViewShell.hxx>
+#include <Window.hxx>
+#include <ViewShellBase.hxx>
+
+#include <sdresid.hxx>
+#include <strings.hrc>
+
+class SfxRequest;
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+
+namespace sd {
+
+
+FuHangulHanjaConversion::FuHangulHanjaConversion (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDocument,
+ SfxRequest& rReq )
+ : FuPoor(pViewSh, pWin, pView, pDocument, rReq),
+ pSdOutliner(nullptr),
+ bOwnOutliner(false)
+{
+ if ( dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr )
+ {
+ bOwnOutliner = true;
+ pSdOutliner = new SdOutliner( mpDoc, OutlinerMode::TextObject );
+ }
+ else if ( dynamic_cast< const OutlineViewShell *>( mpViewShell ) != nullptr )
+ {
+ bOwnOutliner = false;
+ pSdOutliner = mpDoc->GetOutliner();
+ }
+
+ if (pSdOutliner)
+ pSdOutliner->PrepareSpelling();
+}
+
+FuHangulHanjaConversion::~FuHangulHanjaConversion()
+{
+ if (pSdOutliner)
+ pSdOutliner->EndConversion();
+
+ if (bOwnOutliner)
+ delete pSdOutliner;
+}
+
+rtl::Reference<FuPoor> FuHangulHanjaConversion::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuHangulHanjaConversion( pViewSh, pWin, pView, pDoc, rReq ) );
+ return xFunc;
+}
+
+/**
+ * Search and replace
+ */
+void FuHangulHanjaConversion::StartConversion( LanguageType nSourceLanguage, LanguageType nTargetLanguage,
+ const vcl::Font *pTargetFont, sal_Int32 nOptions, bool bIsInteractive )
+{
+
+ mpView->BegUndo(SdResId(STR_UNDO_HANGULHANJACONVERSION));
+
+ ViewShellBase* pBase = dynamic_cast<ViewShellBase*>( SfxViewShell::Current() );
+ if (pBase != nullptr)
+ mpViewShell = pBase->GetMainViewShell().get();
+
+ if( mpViewShell )
+ {
+ if ( pSdOutliner && dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr && !bOwnOutliner )
+ {
+ pSdOutliner->EndConversion();
+
+ bOwnOutliner = true;
+ pSdOutliner = new SdOutliner( mpDoc, OutlinerMode::TextObject );
+ pSdOutliner->BeginConversion();
+ }
+ else if ( pSdOutliner && dynamic_cast< const OutlineViewShell *>( mpViewShell ) != nullptr && bOwnOutliner )
+ {
+ pSdOutliner->EndConversion();
+ delete pSdOutliner;
+
+ bOwnOutliner = false;
+ pSdOutliner = mpDoc->GetOutliner();
+ pSdOutliner->BeginConversion();
+ }
+
+ if (pSdOutliner)
+ pSdOutliner->StartConversion(nSourceLanguage, nTargetLanguage, pTargetFont, nOptions, bIsInteractive );
+ }
+
+ // Due to changing between edit mode, notes mode, and handout mode the
+ // view has most likely changed. Get the new one.
+ mpViewShell = pBase ? pBase->GetMainViewShell().get() : nullptr;
+ if (mpViewShell != nullptr)
+ {
+ mpView = mpViewShell->GetView();
+ mpWindow = mpViewShell->GetActiveWindow();
+ }
+ else
+ {
+ mpView = nullptr;
+ mpWindow = nullptr;
+ }
+
+ if (mpView != nullptr)
+ mpView->EndUndo();
+}
+
+void FuHangulHanjaConversion::ConvertStyles( LanguageType nTargetLanguage, const vcl::Font *pTargetFont )
+{
+ if( !mpDoc )
+ return;
+
+ SfxStyleSheetBasePool* pStyleSheetPool = mpDoc->GetStyleSheetPool();
+ if( !pStyleSheetPool )
+ return;
+
+ SfxStyleSheetBase* pStyle = pStyleSheetPool->First(SfxStyleFamily::All);
+ while( pStyle )
+ {
+ SfxItemSet& rSet = pStyle->GetItemSet();
+
+ const bool bHasParent = !pStyle->GetParent().isEmpty();
+
+ if( !bHasParent || rSet.GetItemState( EE_CHAR_LANGUAGE_CJK, false ) == SfxItemState::SET )
+ rSet.Put( SvxLanguageItem( nTargetLanguage, EE_CHAR_LANGUAGE_CJK ) );
+
+ if( pTargetFont &&
+ ( !bHasParent || rSet.GetItemState( EE_CHAR_FONTINFO_CJK, false ) == SfxItemState::SET ) )
+ {
+ // set new font attribute
+ SvxFontItem aFontItem( rSet.Get( EE_CHAR_FONTINFO_CJK ) );
+ aFontItem.SetFamilyName( pTargetFont->GetFamilyName());
+ aFontItem.SetFamily( pTargetFont->GetFamilyType());
+ aFontItem.SetStyleName( pTargetFont->GetStyleName());
+ aFontItem.SetPitch( pTargetFont->GetPitch());
+ aFontItem.SetCharSet( pTargetFont->GetCharSet());
+ rSet.Put( aFontItem );
+ }
+
+ pStyle = pStyleSheetPool->Next();
+ }
+
+ mpDoc->SetLanguage( nTargetLanguage, EE_CHAR_LANGUAGE_CJK );
+}
+
+void FuHangulHanjaConversion::StartChineseConversion()
+{
+ //open ChineseTranslationDialog
+ Reference< XComponentContext > xContext(
+ ::cppu::defaultBootstrap_InitialComponentContext() ); //@todo get context from calc if that has one
+ if(!xContext.is())
+ return;
+
+ Reference< lang::XMultiComponentFactory > xMCF( xContext->getServiceManager() );
+ if(!xMCF.is())
+ return;
+
+ Reference< ui::dialogs::XExecutableDialog > xDialog(
+ xMCF->createInstanceWithContext("com.sun.star.linguistic2.ChineseTranslationDialog"
+ , xContext), UNO_QUERY);
+ Reference< lang::XInitialization > xInit( xDialog, UNO_QUERY );
+ if( xInit.is() )
+ {
+ // initialize dialog
+ Reference< awt::XWindow > xDialogParentWindow;
+ Sequence<Any> aSeq(comphelper::InitAnyPropertySequence(
+ {
+ {"ParentWindow", uno::Any(xDialogParentWindow)}
+ }));
+ xInit->initialize( aSeq );
+
+ //execute dialog
+ sal_Int16 nDialogRet = xDialog->execute();
+ if( RET_OK == nDialogRet )
+ {
+ //get some parameters from the dialog
+ bool bToSimplified = true;
+ bool bUseVariants = true;
+ bool bCommonTerms = true;
+ Reference< beans::XPropertySet > xProp( xDialog, UNO_QUERY );
+ if( xProp.is() )
+ {
+ try
+ {
+ xProp->getPropertyValue( "IsDirectionToSimplified" ) >>= bToSimplified;
+ xProp->getPropertyValue( "IsUseCharacterVariants" ) >>= bUseVariants;
+ xProp->getPropertyValue( "IsTranslateCommonTerms" ) >>= bCommonTerms;
+ }
+ catch( Exception& )
+ {
+ }
+ }
+
+ //execute translation
+ LanguageType nSourceLang = bToSimplified ? LANGUAGE_CHINESE_TRADITIONAL : LANGUAGE_CHINESE_SIMPLIFIED;
+ LanguageType nTargetLang = bToSimplified ? LANGUAGE_CHINESE_SIMPLIFIED : LANGUAGE_CHINESE_TRADITIONAL;
+ sal_Int32 nOptions = bUseVariants ? i18n::TextConversionOption::USE_CHARACTER_VARIANTS : 0;
+ if( !bCommonTerms )
+ nOptions = nOptions | i18n::TextConversionOption::CHARACTER_BY_CHARACTER;
+
+ vcl::Font aTargetFont = OutputDevice::GetDefaultFont(
+ DefaultFontType::CJK_PRESENTATION,
+ nTargetLang, GetDefaultFontFlags::OnlyOne );
+
+ StartConversion( nSourceLang, nTargetLang, &aTargetFont, nOptions, false );
+ ConvertStyles( nTargetLang, &aTargetFont );
+ }
+ }
+ Reference< lang::XComponent > xComponent( xDialog, UNO_QUERY );
+ if( xComponent.is() )
+ xComponent->dispose();
+}
+} // end of namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuinsert.cxx b/sd/source/ui/func/fuinsert.cxx
new file mode 100644
index 000000000..919814d56
--- /dev/null
+++ b/sd/source/ui/func/fuinsert.cxx
@@ -0,0 +1,767 @@
+/* -*- 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 <config_features.h>
+
+#include <fuinsert.hxx>
+#include <comphelper/storagehelper.hxx>
+#include <comphelper/propertysequence.hxx>
+#include <editeng/sizeitem.hxx>
+#include <officecfg/Office/Common.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <svx/svxdlg.hxx>
+#include <com/sun/star/chart2/XChartDocument.hpp>
+#include <com/sun/star/embed/EmbedVerbs.hpp>
+#include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
+#include <com/sun/star/embed/Aspects.hpp>
+#include <com/sun/star/embed/XEmbeddedObject.hpp>
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/media/XPlayer.hpp>
+
+#include <svl/stritem.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/msgpool.hxx>
+#include <sfx2/msg.hxx>
+#include <svtools/insdlg.hxx>
+#include <sfx2/request.hxx>
+#include <svl/globalnameitem.hxx>
+#include <svtools/embedhlp.hxx>
+#include <svx/linkwarn.hxx>
+#include <avmedia/mediawindow.hxx>
+#include <comphelper/classids.hxx>
+#include <svtools/sfxecode.hxx>
+#include <vcl/transfer.hxx>
+#include <svl/urlbmk.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdoole2.hxx>
+#include <sot/formats.hxx>
+#include <svx/svdpagv.hxx>
+#include <sfx2/opengrf.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svx/charthelper.hxx>
+#include <svx/svxids.hrc>
+
+#include <sdresid.hxx>
+#include <View.hxx>
+#include <sdmod.hxx>
+#include <Window.hxx>
+#include <DrawViewShell.hxx>
+#include <DrawDocShell.hxx>
+#include <GraphicDocShell.hxx>
+#include <strings.hrc>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <sdgrffilter.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <vcl/errinf.hxx>
+#include <vcl/graphicfilter.hxx>
+
+#include <vcl/GraphicNativeTransform.hxx>
+#include <vcl/GraphicNativeMetadata.hxx>
+
+#include <comphelper/lok.hxx>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+
+FuInsertGraphic::FuInsertGraphic (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq,
+ bool replaceExistingImage)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq),
+ mbReplaceExistingImage(replaceExistingImage)
+{
+}
+
+rtl::Reference<FuPoor> FuInsertGraphic::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView,
+ SdDrawDocument* pDoc, SfxRequest& rReq, bool replaceExistingImage )
+{
+ rtl::Reference<FuPoor> xFunc( new FuInsertGraphic( pViewSh, pWin, pView, pDoc, rReq, replaceExistingImage ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuInsertGraphic::DoExecute( SfxRequest& rReq )
+{
+ OUString aFileName;
+ Graphic aGraphic;
+
+ bool bAsLink = false;
+ ErrCode nError = ERRCODE_GRFILTER_OPENERROR;
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ const SfxPoolItem* pItem;
+
+ if ( pArgs &&
+ pArgs->GetItemState( SID_INSERT_GRAPHIC, true, &pItem ) == SfxItemState::SET )
+ {
+ aFileName = static_cast<const SfxStringItem*>(pItem)->GetValue();
+
+ OUString aFilterName;
+ if ( const SfxStringItem* pFilterItem = pArgs->GetItemIfSet( FN_PARAM_FILTER ) )
+ aFilterName = pFilterItem->GetValue();
+
+ if ( pArgs->GetItemState( FN_PARAM_1, true, &pItem ) == SfxItemState::SET )
+ bAsLink = static_cast<const SfxBoolItem*>(pItem)->GetValue();
+
+ nError = GraphicFilter::LoadGraphic( aFileName, aFilterName, aGraphic, &GraphicFilter::GetGraphicFilter() );
+ }
+ else
+ {
+ SvxOpenGraphicDialog aDlg(SdResId(STR_INSERTGRAPHIC), mpWindow ? mpWindow->GetFrameWeld() : nullptr);
+
+ if( aDlg.Execute() != ERRCODE_NONE )
+ return; // cancel dialog
+
+ nError = aDlg.GetGraphic(aGraphic);
+ bAsLink = aDlg.IsAsLink();
+ aFileName = aDlg.GetPath();
+ }
+
+ if( nError == ERRCODE_NONE )
+ {
+ GraphicNativeMetadata aMetadata;
+ if ( aMetadata.read(aGraphic) )
+ {
+ const Degree10 aRotation = aMetadata.getRotation();
+ if (aRotation)
+ {
+ GraphicNativeTransform aTransform( aGraphic );
+ aTransform.rotate( aRotation );
+ }
+ }
+ if( dynamic_cast< DrawViewShell *>( mpViewShell ) )
+ {
+ sal_Int8 nAction = DND_ACTION_COPY;
+ SdrObject* pPickObj = nullptr;
+ if (mbReplaceExistingImage)
+ pPickObj = mpView->GetSelectedSingleObject( mpView->GetPage() );
+ if (pPickObj)
+ nAction = DND_ACTION_LINK;
+ else
+ {
+ pPickObj = mpView->GetEmptyPresentationObject( PresObjKind::Graphic );
+ if (pPickObj)
+ nAction = DND_ACTION_LINK;
+ }
+
+ Point aPos = mpWindow->GetVisibleCenter();
+ SdrGrafObj* pGrafObj = mpView->InsertGraphic(aGraphic, nAction, aPos, pPickObj, nullptr);
+
+ if(pGrafObj && bAsLink )
+ {
+ // really store as link only?
+ if( officecfg::Office::Common::Misc::ShowLinkWarningDialog::get() )
+ {
+ SvxLinkWarningDialog aWarnDlg(mpWindow->GetFrameWeld(), aFileName);
+ if (aWarnDlg.run() != RET_OK)
+ return; // don't store as link
+ }
+
+ // store as link
+ pGrafObj->SetGraphicLink(aFileName);
+ }
+ }
+ }
+ else
+ {
+ SdGRFFilter::HandleGraphicFilterError( nError, GraphicFilter::GetGraphicFilter().GetLastError() );
+ }
+}
+
+FuInsertClipboard::FuInsertClipboard (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuInsertClipboard::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuInsertClipboard( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuInsertClipboard::DoExecute( SfxRequest& )
+{
+ TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( mpWindow ) );
+ SotClipboardFormatId nFormatId;
+
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ ScopedVclPtr<SfxAbstractPasteDialog> pDlg(pFact->CreatePasteDialog(mpViewShell->GetFrameWeld()));
+ pDlg->Insert( SotClipboardFormatId::EMBED_SOURCE, OUString() );
+ pDlg->Insert( SotClipboardFormatId::LINK_SOURCE, OUString() );
+ pDlg->Insert( SotClipboardFormatId::DRAWING, OUString() );
+ pDlg->Insert( SotClipboardFormatId::SVXB, OUString() );
+ pDlg->Insert( SotClipboardFormatId::GDIMETAFILE, OUString() );
+ pDlg->Insert( SotClipboardFormatId::BITMAP, OUString() );
+ pDlg->Insert( SotClipboardFormatId::NETSCAPE_BOOKMARK, OUString() );
+ pDlg->Insert( SotClipboardFormatId::STRING, OUString() );
+ pDlg->Insert( SotClipboardFormatId::HTML, OUString() );
+ pDlg->Insert( SotClipboardFormatId::RTF, OUString() );
+ pDlg->Insert( SotClipboardFormatId::RICHTEXT, OUString() );
+ pDlg->Insert( SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT, OUString() );
+
+ //TODO/MBA: testing
+ nFormatId = pDlg->GetFormat( aDataHelper );
+ if( nFormatId == SotClipboardFormatId::NONE || !aDataHelper.GetTransferable().is() )
+ return;
+
+ sal_Int8 nAction = DND_ACTION_COPY;
+ DrawViewShell* pDrViewSh = nullptr;
+
+ if (!mpView->InsertData( aDataHelper,
+ mpWindow->PixelToLogic( ::tools::Rectangle( Point(), mpWindow->GetOutputSizePixel() ).Center() ),
+ nAction, false, nFormatId ))
+ {
+ pDrViewSh = dynamic_cast<DrawViewShell*>(mpViewShell);
+ }
+
+ if (!pDrViewSh)
+ return;
+
+ INetBookmark aINetBookmark( "", "" );
+
+ if( ( aDataHelper.HasFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK ) &&
+ aDataHelper.GetINetBookmark( SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark ) ) ||
+ ( aDataHelper.HasFormat( SotClipboardFormatId::FILEGRPDESCRIPTOR ) &&
+ aDataHelper.GetINetBookmark( SotClipboardFormatId::FILEGRPDESCRIPTOR, aINetBookmark ) ) ||
+ ( aDataHelper.HasFormat( SotClipboardFormatId::UNIFORMRESOURCELOCATOR ) &&
+ aDataHelper.GetINetBookmark( SotClipboardFormatId::UNIFORMRESOURCELOCATOR, aINetBookmark ) ) )
+ {
+ pDrViewSh->InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), "" );
+ }
+}
+
+FuInsertOLE::FuInsertOLE (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuInsertOLE::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuInsertOLE( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuInsertOLE::DoExecute( SfxRequest& rReq )
+{
+ if ( nSlotId == SID_ATTR_TABLE ||
+ nSlotId == SID_INSERT_DIAGRAM ||
+ nSlotId == SID_INSERT_MATH )
+ {
+ PresObjKind ePresObjKind = (nSlotId == SID_INSERT_DIAGRAM) ? PresObjKind::Chart : PresObjKind::Object;
+
+ SdrObject* pPickObj = mpView->GetEmptyPresentationObject( ePresObjKind );
+
+ // insert diagram or Calc table
+ OUString aObjName;
+ SvGlobalName aName;
+ if (nSlotId == SID_INSERT_DIAGRAM)
+ aName = SvGlobalName( SO3_SCH_CLASSID);
+ else if (nSlotId == SID_ATTR_TABLE)
+ aName = SvGlobalName(SO3_SC_CLASSID);
+ else if (nSlotId == SID_INSERT_MATH)
+ aName = SvGlobalName(SO3_SM_CLASSID);
+
+ uno::Reference < embed::XEmbeddedObject > xObj = mpViewShell->GetViewFrame()->GetObjectShell()->
+ GetEmbeddedObjectContainer().CreateEmbeddedObject( aName.GetByteSequence(), aObjName );
+ if ( xObj.is() )
+ {
+ // Create default chart type.
+ uno::Reference<chart2::XChartDocument> xChartDoc(xObj->getComponent(), uno::UNO_QUERY);
+ if (xChartDoc.is())
+ xChartDoc->createDefaultChart();
+
+ sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT;
+
+ MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
+
+ ::tools::Rectangle aRect;
+ if( pPickObj )
+ {
+ aRect = pPickObj->GetLogicRect();
+
+ awt::Size aSz;
+ aSz.Width = aRect.GetWidth();
+ aSz.Height = aRect.GetHeight();
+ xObj->setVisualAreaSize( nAspect, aSz );
+ }
+ else
+ {
+ awt::Size aSz;
+ try
+ {
+ aSz = xObj->getVisualAreaSize( nAspect );
+ }
+ catch ( embed::NoVisualAreaSizeException& )
+ {
+ // the default size will be set later
+ }
+
+ Size aSize( aSz.Width, aSz.Height );
+
+ if (aSize.IsEmpty())
+ {
+ // rectangle with balanced edge ratio
+ aSize.setWidth( 14100 );
+ aSize.setHeight( 10000 );
+ Size aTmp = OutputDevice::LogicToLogic(aSize, MapMode(MapUnit::Map100thMM), MapMode(aUnit));
+ aSz.Width = aTmp.Width();
+ aSz.Height = aTmp.Height();
+ xObj->setVisualAreaSize( nAspect, aSz );
+ }
+ else
+ {
+ aSize = OutputDevice::LogicToLogic(aSize, MapMode(aUnit), MapMode(MapUnit::Map100thMM));
+ }
+
+ Point aPos = mpWindow->GetVisibleCenter();
+ aPos.AdjustX( -(aSize.Width() / 2) );
+ aPos.AdjustY( -(aSize.Height() / 2) );
+ aRect = ::tools::Rectangle(aPos, aSize);
+ }
+
+ SdrOle2Obj* pOleObj = new SdrOle2Obj(
+ mpView->getSdrModelFromSdrView(),
+ svt::EmbeddedObjectRef( xObj, nAspect ),
+ aObjName,
+ aRect);
+ SdrPageView* pPV = mpView->GetSdrPageView();
+
+ // if we have a pick obj we need to make this new ole a pres obj replacing the current pick obj
+ if( pPickObj )
+ {
+ SdPage* pPage = static_cast< SdPage* >(pPickObj->getSdrPageFromSdrObject());
+ if(pPage && pPage->IsPresObj(pPickObj))
+ {
+ pPage->InsertPresObj( pOleObj, ePresObjKind );
+ pOleObj->SetUserCall(pPickObj->GetUserCall());
+ }
+
+ // #i123468# we need to end text edit before replacing the object. There cannot yet
+ // being text typed (else it would not be an EmptyPresObj anymore), but it may be
+ // in text edit mode
+ if (mpView->IsTextEdit())
+ {
+ mpView->SdrEndTextEdit();
+ }
+ }
+
+ bool bRet = true;
+ if( pPickObj )
+ mpView->ReplaceObjectAtView(pPickObj, *pPV, pOleObj );
+ else
+ bRet = mpView->InsertObjectAtView(pOleObj, *pPV, SdrInsertFlags::SETDEFLAYER);
+
+ if (bRet && !comphelper::LibreOfficeKit::isActive())
+ {
+ // Let the chart be activated after the inserting (unless
+ // via LibreOfficeKit)
+ if (nSlotId == SID_INSERT_DIAGRAM)
+ {
+ pOleObj->SetProgName( "StarChart");
+ }
+ else if (nSlotId == SID_ATTR_TABLE)
+ {
+ pOleObj->SetProgName( "StarCalc" );
+ }
+ else if (nSlotId == SID_INSERT_MATH)
+ {
+ pOleObj->SetProgName( "StarMath" );
+ }
+
+ pOleObj->SetLogicRect(aRect);
+ Size aTmp( OutputDevice::LogicToLogic(aRect.GetSize(), MapMode(MapUnit::Map100thMM), MapMode(aUnit)) );
+ awt::Size aVisualSize;
+ aVisualSize.Width = aTmp.Width();
+ aVisualSize.Height = aTmp.Height();
+ xObj->setVisualAreaSize( nAspect, aVisualSize );
+ mpViewShell->ActivateObject(pOleObj, embed::EmbedVerbs::MS_OLEVERB_SHOW);
+
+ if (nSlotId == SID_INSERT_DIAGRAM)
+ {
+ // note, that this call modified the chart model which
+ // results in a change notification. So call this after
+ // everything else is finished.
+ ChartHelper::AdaptDefaultsForChart( xObj );
+ }
+ }
+ }
+ else
+ {
+ ErrorHandler::HandleError(* new StringErrorInfo(ERRCODE_SFX_OLEGENERAL,
+ "" ) );
+ }
+ }
+ else
+ {
+ // insert object
+ sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT;
+ bool bCreateNew = false;
+ uno::Reference < embed::XEmbeddedObject > xObj;
+ uno::Reference < embed::XStorage > xStorage = comphelper::OStorageHelper::GetTemporaryStorage();
+ SvObjectServerList aServerLst;
+ OUString aName;
+
+ OUString aIconMediaType;
+ uno::Reference< io::XInputStream > xIconMetaFile;
+
+ const SfxGlobalNameItem* pNameItem = rReq.GetArg<SfxGlobalNameItem>(SID_INSERT_OBJECT);
+ if ( nSlotId == SID_INSERT_OBJECT && pNameItem )
+ {
+ const SvGlobalName& aClassName = pNameItem->GetValue();
+ xObj = mpViewShell->GetViewFrame()->GetObjectShell()->
+ GetEmbeddedObjectContainer().CreateEmbeddedObject( aClassName.GetByteSequence(), aName );
+ }
+ else
+ {
+ switch ( nSlotId )
+ {
+ case SID_INSERT_OBJECT :
+ {
+ aServerLst.FillInsertObjects();
+ if (mpDoc->GetDocumentType() == DocumentType::Draw)
+ {
+ aServerLst.Remove( GraphicDocShell::Factory().GetClassId() );
+ }
+ else
+ {
+ aServerLst.Remove( DrawDocShell::Factory().GetClassId() );
+ }
+
+ [[fallthrough]];
+ }
+ case SID_INSERT_FLOATINGFRAME :
+ {
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ ScopedVclPtr<SfxAbstractInsertObjectDialog> pDlg(
+ pFact->CreateInsertObjectDialog( mpViewShell->GetFrameWeld(), SD_MOD()->GetSlotPool()->GetSlot(nSlotId)->GetCommandString(),
+ xStorage, &aServerLst ));
+ pDlg->Execute();
+ bCreateNew = pDlg->IsCreateNew();
+ xObj = pDlg->GetObject();
+
+ xIconMetaFile = pDlg->GetIconIfIconified( &aIconMediaType );
+ if ( xIconMetaFile.is() )
+ nAspect = embed::Aspects::MSOLE_ICON;
+
+ if ( xObj.is() )
+ mpViewShell->GetObjectShell()->GetEmbeddedObjectContainer().InsertEmbeddedObject( xObj, aName );
+
+ break;
+ }
+ }
+ }
+
+ try
+ {
+ if (xObj.is())
+ {
+ bool bInsertNewObject = true;
+
+ Size aSize;
+ MapUnit aMapUnit = MapUnit::Map100thMM;
+ if ( nAspect != embed::Aspects::MSOLE_ICON )
+ {
+ awt::Size aSz;
+ try
+ {
+ aSz = xObj->getVisualAreaSize( nAspect );
+ }
+ catch( embed::NoVisualAreaSizeException& )
+ {
+ // the default size will be set later
+ }
+
+ aSize =Size( aSz.Width, aSz.Height );
+
+ aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
+ if (aSize.IsEmpty())
+ {
+ // rectangle with balanced edge ratio
+ aSize.setWidth( 14100 );
+ aSize.setHeight( 10000 );
+ Size aTmp = OutputDevice::LogicToLogic(aSize, MapMode(MapUnit::Map100thMM), MapMode(aMapUnit));
+ aSz.Width = aTmp.Width();
+ aSz.Height = aTmp.Height();
+ xObj->setVisualAreaSize( nAspect, aSz );
+ }
+ else
+ {
+ aSize = OutputDevice::LogicToLogic(aSize, MapMode(aMapUnit), MapMode(MapUnit::Map100thMM));
+ }
+ }
+
+ if ( mpView->AreObjectsMarked() )
+ {
+ // as an empty OLE object available?
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+
+ if (pObj->GetObjInventor() == SdrInventor::Default &&
+ pObj->GetObjIdentifier() == SdrObjKind::OLE2)
+ {
+ if ( !static_cast<SdrOle2Obj*>(pObj)->GetObjRef().is() )
+ {
+ // the empty OLE object gets a new IPObj
+ bInsertNewObject = false;
+ pObj->SetEmptyPresObj(false);
+ static_cast<SdrOle2Obj*>(pObj)->SetOutlinerParaObject(std::nullopt);
+ static_cast<SdrOle2Obj*>(pObj)->SetObjRef(xObj);
+ static_cast<SdrOle2Obj*>(pObj)->SetPersistName(aName);
+ static_cast<SdrOle2Obj*>(pObj)->SetName(aName);
+ static_cast<SdrOle2Obj*>(pObj)->SetAspect(nAspect);
+ ::tools::Rectangle aRect = static_cast<SdrOle2Obj*>(pObj)->GetLogicRect();
+
+ if ( nAspect == embed::Aspects::MSOLE_ICON )
+ {
+ if( xIconMetaFile.is() )
+ static_cast<SdrOle2Obj*>(pObj)->SetGraphicToObj( xIconMetaFile, aIconMediaType );
+ }
+ else
+ {
+ Size aTmp = OutputDevice::LogicToLogic(aRect.GetSize(), MapMode(MapUnit::Map100thMM), MapMode(aMapUnit));
+ awt::Size aSz( aTmp.Width(), aTmp.Height() );
+ xObj->setVisualAreaSize( nAspect, aSz );
+ }
+ }
+ }
+ }
+ }
+
+ if (bInsertNewObject)
+ {
+ // we create a new OLE object
+ SdrPageView* pPV = mpView->GetSdrPageView();
+ Size aPageSize = pPV->GetPage()->GetSize();
+
+ // get the size from the iconified object
+ ::svt::EmbeddedObjectRef aObjRef( xObj, nAspect );
+ if ( nAspect == embed::Aspects::MSOLE_ICON )
+ {
+ aObjRef.SetGraphicStream( xIconMetaFile, aIconMediaType );
+ MapMode aMapMode( MapUnit::Map100thMM );
+ aSize = aObjRef.GetSize( &aMapMode );
+ }
+
+ Point aPnt ((aPageSize.Width() - aSize.Width()) / 2,
+ (aPageSize.Height() - aSize.Height()) / 2);
+ ::tools::Rectangle aRect (aPnt, aSize);
+ SdrOle2Obj* pObj = new SdrOle2Obj(
+ mpView->getSdrModelFromSdrView(),
+ aObjRef,
+ aName,
+ aRect);
+
+ if( mpView->InsertObjectAtView(pObj, *pPV, SdrInsertFlags::SETDEFLAYER) )
+ {
+ // Math objects change their object size during InsertObject.
+ // New size must be set in SdrObject, or a wrong scale will be set at
+ // ActivateObject.
+
+ if ( nAspect != embed::Aspects::MSOLE_ICON )
+ {
+ try
+ {
+ awt::Size aSz = xObj->getVisualAreaSize( nAspect );
+
+ Size aNewSize = OutputDevice::LogicToLogic( Size( aSz.Width, aSz.Height ),
+ MapMode( aMapUnit ), MapMode( MapUnit::Map100thMM ) );
+ if ( aNewSize != aSize )
+ {
+ aRect.SetSize( aNewSize );
+ pObj->SetLogicRect( aRect );
+ }
+ }
+ catch( embed::NoVisualAreaSizeException& )
+ {}
+ }
+
+ if (bCreateNew)
+ {
+ pObj->SetLogicRect(aRect);
+
+ if ( nAspect != embed::Aspects::MSOLE_ICON )
+ {
+ Size aTmp = OutputDevice::LogicToLogic(aRect.GetSize(), MapMode(MapUnit::Map100thMM), MapMode(aMapUnit));
+ awt::Size aSz( aTmp.Width(), aTmp.Height() );
+ xObj->setVisualAreaSize( nAspect, aSz );
+ }
+
+ mpViewShell->ActivateObject(pObj, embed::EmbedVerbs::MS_OLEVERB_SHOW);
+ }
+
+ Size aVisSizePixel = mpWindow->GetOutputSizePixel();
+ ::tools::Rectangle aVisAreaWin = mpWindow->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) );
+ mpViewShell->VisAreaChanged(aVisAreaWin);
+ mpDocSh->SetVisArea(aVisAreaWin);
+ }
+ }
+ }
+ }
+ catch (uno::Exception&)
+ {
+ // For some reason the object can not be inserted. For example
+ // because it is password protected and is not properly unlocked.
+ }
+ }
+}
+
+FuInsertAVMedia::FuInsertAVMedia(
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuInsertAVMedia::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuInsertAVMedia( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuInsertAVMedia::DoExecute( SfxRequest& rReq )
+{
+#if HAVE_FEATURE_AVMEDIA
+ OUString aURL;
+ const SfxItemSet* pReqArgs = rReq.GetArgs();
+ bool bAPI = false;
+
+ const SvxSizeItem* pSizeItem = rReq.GetArg<SvxSizeItem>(FN_PARAM_1);
+ const SfxBoolItem* pLinkItem = rReq.GetArg<SfxBoolItem>(FN_PARAM_2);
+ const bool bSizeUnknown = !pSizeItem;
+ Size aPrefSize;
+
+ if( pReqArgs )
+ {
+ const SfxStringItem* pStringItem = dynamic_cast<const SfxStringItem*>( &pReqArgs->Get( rReq.GetSlot() ) );
+
+ if( pStringItem )
+ {
+ aURL = pStringItem->GetValue();
+ bAPI = !aURL.isEmpty();
+ }
+ }
+
+ bool bLink(pLinkItem ? pLinkItem->GetValue() : true);
+ if (!(bAPI
+ || ::avmedia::MediaWindow::executeMediaURLDialog(mpWindow ? mpWindow->GetFrameWeld() : nullptr, aURL, & bLink)
+ ))
+ return;
+
+ if (!bSizeUnknown)
+ {
+ aPrefSize = pSizeItem->GetSize();
+ }
+ else
+ {
+ // If we don't have a size then try and find that out, the resulted might be deliver async, so dispatch a follow up
+ // effort to insert the video, this time with a size.
+ if( mpWindow )
+ mpWindow->EnterWait();
+
+ css::uno::Reference<css::frame::XDispatchProvider> xDispatchProvider(mpViewShell->GetViewFrame()->GetFrame().GetFrameInterface(), css::uno::UNO_QUERY);
+
+ rtl::Reference<avmedia::PlayerListener> xPlayerListener(new avmedia::PlayerListener(
+ [xDispatchProvider, aURL, bLink](const css::uno::Reference<css::media::XPlayer>& rPlayer){
+ css::awt::Size aSize = rPlayer->getPreferredPlayerWindowSize();
+ avmedia::MediaWindow::dispatchInsertAVMedia(xDispatchProvider, aSize, aURL, bLink);
+ }));
+
+ const bool bIsMediaURL = ::avmedia::MediaWindow::isMediaURL(aURL, "", true, xPlayerListener);
+
+ if( mpWindow )
+ mpWindow->LeaveWait();
+
+ if (!bIsMediaURL && !bAPI)
+ ::avmedia::MediaWindow::executeFormatErrorBox(mpWindow->GetFrameWeld());
+
+ return;
+ }
+
+ InsertMediaURL(aURL, aPrefSize, bLink);
+
+#else
+ (void)rReq;
+#endif
+}
+
+#if HAVE_FEATURE_AVMEDIA
+void FuInsertAVMedia::InsertMediaURL(const OUString& rURL, const Size& rPrefSize, bool bLink)
+{
+ if( mpWindow )
+ mpWindow->EnterWait();
+
+ Point aPos;
+ Size aSize;
+ sal_Int8 nAction = DND_ACTION_COPY;
+
+ if (rPrefSize.Width() && rPrefSize.Height())
+ {
+ if( mpWindow )
+ aSize = mpWindow->PixelToLogic(rPrefSize, MapMode(MapUnit::Map100thMM));
+ else
+ aSize = Application::GetDefaultDevice()->PixelToLogic(rPrefSize, MapMode(MapUnit::Map100thMM));
+ }
+ else
+ aSize = Size( 5000, 5000 );
+
+ if( mpWindow )
+ {
+ aPos = mpWindow->PixelToLogic( ::tools::Rectangle( aPos, mpWindow->GetOutputSizePixel() ).Center() );
+ aPos.AdjustX( -(aSize.Width() >> 1) );
+ aPos.AdjustY( -(aSize.Height() >> 1) );
+ }
+
+ mpView->InsertMediaURL(rURL, nAction, aPos, aSize, bLink);
+
+ if( mpWindow )
+ mpWindow->LeaveWait();
+}
+#endif
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuinsfil.cxx b/sd/source/ui/func/fuinsfil.cxx
new file mode 100644
index 000000000..6569514cf
--- /dev/null
+++ b/sd/source/ui/func/fuinsfil.cxx
@@ -0,0 +1,725 @@
+/* -*- 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 <fuinsfil.hxx>
+#include <vcl/svapp.hxx>
+#include <sfx2/progress.hxx>
+#include <editeng/outliner.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/editeng.hxx>
+#include <svl/stritem.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/app.hxx>
+#include <vcl/weld.hxx>
+#include <svx/svdorect.hxx>
+#include <svx/svdundo.hxx>
+#include <svx/svdoutl.hxx>
+#include <sfx2/filedlghelper.hxx>
+#include <sot/formats.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/docfilt.hxx>
+#include <sfx2/fcontnr.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svxids.hrc>
+#include <tools/debug.hxx>
+#include <com/sun/star/ui/dialogs/XFilterManager.hpp>
+#include <com/sun/star/ui/dialogs/XFilePicker.hpp>
+#include <com/sun/star/ui/dialogs/XFilePicker3.hpp>
+#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
+
+#include <sdresid.hxx>
+#include <drawdoc.hxx>
+#include <Window.hxx>
+#include <View.hxx>
+#include <strings.hrc>
+#include <sdmod.hxx>
+#include <sdpage.hxx>
+#include <ViewShellBase.hxx>
+#include <DrawViewShell.hxx>
+#include <OutlineView.hxx>
+#include <DrawDocShell.hxx>
+#include <GraphicDocShell.hxx>
+#include <app.hrc>
+#include <Outliner.hxx>
+#include <sdabstdlg.hxx>
+#include <memory>
+
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::ui::dialogs;
+using namespace ::com::sun::star;
+
+typedef ::std::pair< OUString, OUString > FilterDesc;
+
+namespace
+{
+
+OUString lcl_GetExtensionsList ( ::std::vector< FilterDesc > const& rFilterDescList )
+{
+ OUStringBuffer aExtensions;
+
+ for (const auto& rFilterDesc : rFilterDescList)
+ {
+ OUString sWildcard = rFilterDesc.second;
+
+ if ( aExtensions.indexOf( sWildcard ) == -1 )
+ {
+ if ( !aExtensions.isEmpty() )
+ aExtensions.append(";");
+ aExtensions.append(sWildcard);
+ }
+
+ }
+
+ return aExtensions.makeStringAndClear();
+}
+
+void lcl_AddFilter ( ::std::vector< FilterDesc >& rFilterDescList,
+ const std::shared_ptr<const SfxFilter>& pFilter )
+{
+ if (pFilter)
+ rFilterDescList.emplace_back( pFilter->GetUIName(), pFilter->GetDefaultExtension() );
+}
+
+}
+
+namespace sd {
+
+
+FuInsertFile::FuInsertFile (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuInsertFile::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuInsertFile( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuInsertFile::DoExecute( SfxRequest& rReq )
+{
+ SfxFilterMatcher& rMatcher = SfxGetpApp()->GetFilterMatcher();
+ ::std::vector< FilterDesc > aFilterVector;
+ ::std::vector< OUString > aOtherFilterVector;
+ const SfxItemSet* pArgs = rReq.GetArgs ();
+
+ FuInsertFile::GetSupportedFilterVector( aOtherFilterVector );
+
+ if (!pArgs)
+ {
+ sfx2::FileDialogHelper aFileDialog(
+ ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE,
+ FileDialogFlags::Insert, mpWindow ? mpWindow->GetFrameWeld() : nullptr);
+ aFileDialog.SetContext(sfx2::FileDialogHelper::DrawImpressInsertFile);
+ Reference< XFilePicker > xFilePicker( aFileDialog.GetFilePicker() );
+ Reference< XFilterManager > xFilterManager( xFilePicker, UNO_QUERY );
+ OUString aOwnCont;
+ OUString aOtherCont;
+
+ aFileDialog.SetTitle( SdResId(STR_DLG_INSERT_PAGES_FROM_FILE) );
+
+ if( mpDoc->GetDocumentType() == DocumentType::Impress )
+ {
+ aOwnCont = "simpress";
+ aOtherCont = "sdraw";
+ }
+ else
+ {
+ aOtherCont = "simpress";
+ aOwnCont = "sdraw" ;
+ }
+
+ SfxFilterMatcher aMatch( aOwnCont );
+
+ if( xFilterManager.is() )
+ {
+ // Get filter for current format
+ try
+ {
+ // Get main filter
+ std::shared_ptr<const SfxFilter> pFilter = SfxFilter::GetDefaultFilterFromFactory( aOwnCont );
+ lcl_AddFilter( aFilterVector, pFilter );
+
+ // get template filter
+ if( mpDoc->GetDocumentType() == DocumentType::Impress )
+ pFilter = DrawDocShell::Factory().GetTemplateFilter();
+ else
+ pFilter = GraphicDocShell::Factory().GetTemplateFilter();
+ lcl_AddFilter( aFilterVector, pFilter );
+
+ // get cross filter
+ pFilter = SfxFilter::GetDefaultFilterFromFactory( aOtherCont );
+ lcl_AddFilter( aFilterVector, pFilter );
+
+ // get Powerpoint filter
+ pFilter = aMatch.GetFilter4Extension( ".ppt" );
+ lcl_AddFilter( aFilterVector, pFilter );
+
+ // Get other draw/impress filters
+ pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARIMPRESS_60, SfxFilterFlags::IMPORT, SfxFilterFlags::TEMPLATEPATH );
+ lcl_AddFilter( aFilterVector, pFilter );
+
+ pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARIMPRESS_60, SfxFilterFlags::TEMPLATEPATH );
+ lcl_AddFilter( aFilterVector, pFilter );
+
+ pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARDRAW_60, SfxFilterFlags::IMPORT, SfxFilterFlags::TEMPLATEPATH );
+ lcl_AddFilter( aFilterVector, pFilter );
+
+ pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARDRAW_60, SfxFilterFlags::TEMPLATEPATH );
+ lcl_AddFilter( aFilterVector, pFilter );
+
+ pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARDRAW, SfxFilterFlags::IMPORT, SfxFilterFlags::TEMPLATEPATH );
+ lcl_AddFilter( aFilterVector, pFilter );
+
+ pFilter = aMatch.GetFilter4ClipBoardId( SotClipboardFormatId::STARDRAW, SfxFilterFlags::TEMPLATEPATH );
+ lcl_AddFilter( aFilterVector, pFilter );
+
+ // add additional supported filters
+ for( const auto& rOtherFilter : aOtherFilterVector )
+ {
+ if( ( pFilter = rMatcher.GetFilter4Mime( rOtherFilter ) ) != nullptr )
+ lcl_AddFilter( aFilterVector, pFilter );
+ }
+
+ // set "All supported formats" as the default filter
+ OUString aAllSpec( SdResId( STR_ALL_SUPPORTED_FORMATS ) );
+ OUString aExtensions = lcl_GetExtensionsList( aFilterVector );
+ OUString aGUIName = aAllSpec + " (" + aExtensions + ")";
+
+ xFilterManager->appendFilter( aGUIName, aExtensions );
+ xFilterManager->setCurrentFilter( aAllSpec );
+
+ // append individual filters
+ for( const auto& rFilter : aFilterVector )
+ {
+ xFilterManager->appendFilter( rFilter.first, rFilter.second );
+ }
+
+ // end with "All files" as fallback
+ xFilterManager->appendFilter( SdResId( STR_ALL_FILES ), "*.*" );
+ }
+ catch (const IllegalArgumentException&)
+ {
+ }
+ }
+
+ if( aFileDialog.Execute() != ERRCODE_NONE )
+ return;
+ else
+ {
+ aFilterName = aFileDialog.GetCurrentFilter();
+ aFile = aFileDialog.GetPath();
+ }
+ }
+ else
+ {
+ const SfxStringItem* pFileName = rReq.GetArg<SfxStringItem>(ID_VAL_DUMMY0);
+ const SfxStringItem* pFilterName = rReq.GetArg<SfxStringItem>(ID_VAL_DUMMY1);
+
+ aFile = pFileName->GetValue ();
+
+ if( pFilterName )
+ aFilterName = pFilterName->GetValue ();
+ }
+
+ mpDocSh->SetWaitCursor( true );
+
+ std::unique_ptr<SfxMedium> xMedium(new SfxMedium(aFile, StreamMode::READ | StreamMode::NOCREATE));
+ std::shared_ptr<const SfxFilter> pFilter;
+
+ SfxGetpApp()->GetFilterMatcher().GuessFilter(*xMedium, pFilter);
+
+ bool bDrawMode = dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr;
+ bool bInserted = false;
+
+ if( pFilter )
+ {
+ xMedium->SetFilter( pFilter );
+ aFilterName = pFilter->GetFilterName();
+
+ if( xMedium->IsStorage() || ( xMedium->GetInStream() && SotStorage::IsStorageFile( xMedium->GetInStream() ) ) )
+ {
+ if ( pFilter->GetServiceName() == "com.sun.star.presentation.PresentationDocument" ||
+ pFilter->GetServiceName() == "com.sun.star.drawing.DrawingDocument" )
+ {
+ // Draw, Impress or PowerPoint document
+ // the ownership of the Medium is transferred
+ if( bDrawMode )
+ InsSDDinDrMode(xMedium.release());
+ else
+ InsSDDinOlMode(xMedium.release());
+
+ // ownership of pMedium has changed in this case
+ bInserted = true;
+ }
+ }
+ else
+ {
+ bool bFound = ( ::std::find( aOtherFilterVector.begin(), aOtherFilterVector.end(), pFilter->GetMimeType() ) != aOtherFilterVector.end() );
+ if( !bFound &&
+ ( aFilterName.indexOf( "Text" ) != -1 ||
+ aFilterName.indexOf( "Rich" ) != -1 ||
+ aFilterName.indexOf( "RTF" ) != -1 ||
+ aFilterName.indexOf( "HTML" ) != -1 ) )
+ {
+ bFound = true;
+ }
+
+ if( bFound )
+ {
+ if( bDrawMode )
+ InsTextOrRTFinDrMode(xMedium.get());
+ else
+ InsTextOrRTFinOlMode(xMedium.get());
+
+ bInserted = true;
+ xMedium.reset();
+ }
+ }
+ }
+
+ mpDocSh->SetWaitCursor( false );
+
+ if( !bInserted )
+ {
+ std::unique_ptr<weld::MessageDialog> xErrorBox(Application::CreateMessageDialog(mpWindow->GetFrameWeld(),
+ VclMessageType::Warning, VclButtonsType::Ok, SdResId(STR_READ_DATA_ERROR)));
+ xErrorBox->run();
+ }
+}
+
+bool FuInsertFile::InsSDDinDrMode(SfxMedium* pMedium)
+{
+ bool bOK = false;
+
+ mpDocSh->SetWaitCursor( false );
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ weld::Window* pParent = mpViewShell ? mpViewShell->GetFrameWeld() : nullptr;
+ ScopedVclPtr<AbstractSdInsertPagesObjsDlg> pDlg( pFact->CreateSdInsertPagesObjsDlg(pParent, mpDoc, pMedium, aFile) );
+
+ sal_uInt16 nRet = pDlg->Execute();
+
+ mpDocSh->SetWaitCursor( true );
+
+ if( nRet == RET_OK )
+ {
+ /* list with page names (if NULL, then all pages)
+ First, insert pages */
+ std::vector<OUString> aBookmarkList = pDlg->GetList( 1 ); // pages
+ bool bLink = pDlg->IsLink();
+ SdPage* pPage = nullptr;
+ ::sd::View* pView = mpViewShell ? mpViewShell->GetView() : nullptr;
+
+ if (pView)
+ {
+ if( auto pOutlineView = dynamic_cast<OutlineView *>( pView ))
+ {
+ pPage = pOutlineView->GetActualPage();
+ }
+ else
+ {
+ pPage = static_cast<SdPage*>(pView->GetSdrPageView()->GetPage());
+ }
+ }
+
+ sal_uInt16 nPos = 0xFFFF;
+
+ if (pPage && !pPage->IsMasterPage())
+ {
+ if (pPage->GetPageKind() == PageKind::Standard)
+ {
+ nPos = pPage->GetPageNum() + 2;
+ }
+ else if (pPage->GetPageKind() == PageKind::Notes)
+ {
+ nPos = pPage->GetPageNum() + 1;
+ }
+ }
+
+ bool bNameOK;
+ std::vector<OUString> aExchangeList;
+ std::vector<OUString> aObjectBookmarkList = pDlg->GetList( 2 ); // objects
+
+ /* if pBookmarkList is NULL, we insert selected pages, and/or selected
+ objects or everything. */
+ if( !aBookmarkList.empty() || aObjectBookmarkList.empty() )
+ {
+ /* To ensure that all page names are unique, we check the ones we
+ want to insert and insert them into a substitution list if
+ necessary.
+ bNameOK is sal_False if the user has canceled. */
+ bNameOK = mpView->GetExchangeList( aExchangeList, aBookmarkList, 0 );
+
+ if( bNameOK )
+ bOK = mpDoc->InsertBookmarkAsPage( aBookmarkList, &aExchangeList,
+ bLink, false/*bReplace*/, nPos,
+ false, nullptr, true, true, false );
+
+ aBookmarkList.clear();
+ aExchangeList.clear();
+ }
+
+ // to ensure ... (see above)
+ bNameOK = mpView->GetExchangeList( aExchangeList, aObjectBookmarkList, 1 );
+
+ if( bNameOK )
+ bOK = mpDoc->InsertBookmarkAsObject( aObjectBookmarkList, aExchangeList,
+ nullptr, nullptr, false );
+
+ if( pDlg->IsRemoveUnnecessaryMasterPages() )
+ mpDoc->RemoveUnnecessaryMasterPages();
+ }
+
+ return bOK;
+}
+
+void FuInsertFile::InsTextOrRTFinDrMode(SfxMedium* pMedium)
+{
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractSdInsertPagesObjsDlg> pDlg( pFact->CreateSdInsertPagesObjsDlg(mpViewShell->GetFrameWeld(), mpDoc, nullptr, aFile) );
+
+ mpDocSh->SetWaitCursor( false );
+
+ sal_uInt16 nRet = pDlg->Execute();
+ mpDocSh->SetWaitCursor( true );
+
+ if( nRet != RET_OK )
+ return;
+
+ // selected file format: text, RTF or HTML (default is text)
+ EETextFormat nFormat = EETextFormat::Text;
+
+ if( aFilterName.indexOf( "Rich") != -1 )
+ nFormat = EETextFormat::Rtf;
+ else if( aFilterName.indexOf( "HTML" ) != -1 )
+ nFormat = EETextFormat::Html;
+
+ /* create our own outline since:
+ - it is possible that the document outliner is actually used in the
+ structuring mode
+ - the draw outliner of the drawing engine has to draw something in
+ between
+ - the global outliner could be used in SdPage::CreatePresObj */
+ SdOutliner aOutliner( mpDoc, OutlinerMode::TextObject );
+
+ // set reference device
+ aOutliner.SetRefDevice( SD_MOD()->GetVirtualRefDevice() );
+
+ SdPage* pPage = static_cast<DrawViewShell*>(mpViewShell)->GetActualPage();
+ aLayoutName = pPage->GetLayoutName();
+ sal_Int32 nIndex = aLayoutName.indexOf(SD_LT_SEPARATOR);
+ if( nIndex != -1 )
+ aLayoutName = aLayoutName.copy(0, nIndex);
+
+ aOutliner.SetPaperSize(pPage->GetSize());
+
+ SvStream* pStream = pMedium->GetInStream();
+ assert(pStream && "No InStream!");
+ pStream->Seek( 0 );
+
+ ErrCode nErr = aOutliner.Read( *pStream, pMedium->GetBaseURL(), nFormat, mpDocSh->GetHeaderAttributes() );
+
+ if (nErr || aOutliner.GetEditEngine().GetText().isEmpty())
+ {
+ std::unique_ptr<weld::MessageDialog> xErrorBox(Application::CreateMessageDialog(mpWindow->GetFrameWeld(),
+ VclMessageType::Warning, VclButtonsType::Ok, SdResId(STR_READ_DATA_ERROR)));
+ xErrorBox->run();
+ }
+ else
+ {
+ // is it a master page?
+ if (static_cast<DrawViewShell*>(mpViewShell)->GetEditMode() == EditMode::MasterPage &&
+ !pPage->IsMasterPage())
+ {
+ pPage = static_cast<SdPage*>(&(pPage->TRG_GetMasterPage()));
+ }
+
+ assert(pPage && "page not found");
+
+ // if editing is going on right now, let it flow into this text object
+ OutlinerView* pOutlinerView = mpView->GetTextEditOutlinerView();
+ if( pOutlinerView )
+ {
+ SdrObject* pObj = mpView->GetTextEditObject();
+ if( pObj &&
+ pObj->GetObjInventor() == SdrInventor::Default &&
+ pObj->GetObjIdentifier() == SdrObjKind::TitleText &&
+ aOutliner.GetParagraphCount() > 1 )
+ {
+ // in title objects, only one paragraph is allowed
+ while ( aOutliner.GetParagraphCount() > 1 )
+ {
+ Paragraph* pPara = aOutliner.GetParagraph( 0 );
+ sal_uLong nLen = aOutliner.GetText( pPara ).getLength();
+ aOutliner.QuickDelete( ESelection( 0, nLen, 1, 0 ) );
+ aOutliner.QuickInsertLineBreak( ESelection( 0, nLen, 0, nLen ) );
+ }
+ }
+ }
+
+ std::optional<OutlinerParaObject> pOPO = aOutliner.CreateParaObject();
+
+ if (pOutlinerView)
+ {
+ pOutlinerView->InsertText(*pOPO);
+ }
+ else
+ {
+ SdrRectObj* pTO = new SdrRectObj(
+ mpView->getSdrModelFromSdrView(),
+ SdrObjKind::Text);
+ pTO->SetOutlinerParaObject(std::move(pOPO));
+
+ const bool bUndo = mpView->IsUndoEnabled();
+ if( bUndo )
+ mpView->BegUndo(SdResId(STR_UNDO_INSERT_TEXTFRAME));
+ pPage->InsertObject(pTO);
+
+ /* can be bigger as the maximal allowed size:
+ limit object size if necessary */
+ Size aSize(aOutliner.CalcTextSize());
+ Size aMaxSize = mpDoc->GetMaxObjSize();
+ aSize.setHeight( std::min(aSize.Height(), aMaxSize.Height()) );
+ aSize.setWidth( std::min(aSize.Width(), aMaxSize.Width()) );
+ aSize = mpWindow->LogicToPixel(aSize);
+
+ // put it at the center of the window
+ Size aTemp(mpWindow->GetOutputSizePixel());
+ Point aPos(aTemp.Width() / 2, aTemp.Height() / 2);
+ aPos.AdjustX( -(aSize.Width() / 2) );
+ aPos.AdjustY( -(aSize.Height() / 2) );
+ aSize = mpWindow->PixelToLogic(aSize);
+ aPos = mpWindow->PixelToLogic(aPos);
+ pTO->SetLogicRect(::tools::Rectangle(aPos, aSize));
+
+ if (pDlg->IsLink())
+ {
+ pTO->SetTextLink(aFile, aFilterName );
+ }
+
+ if( bUndo )
+ {
+ mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoInsertObject(*pTO));
+ mpView->EndUndo();
+ }
+ }
+ }
+}
+
+void FuInsertFile::InsTextOrRTFinOlMode(SfxMedium* pMedium)
+{
+ // selected file format: text, RTF or HTML (default is text)
+ EETextFormat nFormat = EETextFormat::Text;
+
+ if( aFilterName.indexOf( "Rich") != -1 )
+ nFormat = EETextFormat::Rtf;
+ else if( aFilterName.indexOf( "HTML" ) != -1 )
+ nFormat = EETextFormat::Html;
+
+ ::Outliner& rDocliner = static_cast<OutlineView*>(mpView)->GetOutliner();
+
+ std::vector<Paragraph*> aSelList;
+ rDocliner.GetView(0)->CreateSelectionList(aSelList);
+
+ Paragraph* pPara = aSelList.empty() ? nullptr : *(aSelList.begin());
+
+ // what should we insert?
+ while (pPara && !Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE))
+ pPara = rDocliner.GetParent(pPara);
+
+ sal_Int32 nTargetPos = rDocliner.GetAbsPos(pPara) + 1;
+
+ // apply layout of predecessor page
+ sal_uInt16 nPage = 0;
+ pPara = rDocliner.GetParagraph( rDocliner.GetAbsPos( pPara ) - 1 );
+ while (pPara)
+ {
+ sal_Int32 nPos = rDocliner.GetAbsPos( pPara );
+ if ( Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) )
+ nPage++;
+ pPara = rDocliner.GetParagraph( nPos - 1 );
+ }
+ SdPage* pPage = mpDoc->GetSdPage(nPage, PageKind::Standard);
+ aLayoutName = pPage->GetLayoutName();
+ sal_Int32 nIndex = aLayoutName.indexOf(SD_LT_SEPARATOR);
+ if( nIndex != -1 )
+ aLayoutName = aLayoutName.copy(0, nIndex);
+
+ /* create our own outline since:
+ - it is possible that the document outliner is actually used in the
+ structuring mode
+ - the draw outliner of the drawing engine has to draw something in
+ between
+ - the global outliner could be used in SdPage::CreatePresObj */
+ ::Outliner aOutliner( &mpDoc->GetItemPool(), OutlinerMode::OutlineObject );
+ aOutliner.SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(mpDoc->GetStyleSheetPool()));
+
+ // set reference device
+ aOutliner.SetRefDevice(SD_MOD()->GetVirtualRefDevice());
+ aOutliner.SetPaperSize(Size(0x7fffffff, 0x7fffffff));
+
+ SvStream* pStream = pMedium->GetInStream();
+ DBG_ASSERT( pStream, "No InStream!" );
+ pStream->Seek( 0 );
+
+ ErrCode nErr = aOutliner.Read(*pStream, pMedium->GetBaseURL(), nFormat, mpDocSh->GetHeaderAttributes());
+
+ if (nErr || aOutliner.GetEditEngine().GetText().isEmpty())
+ {
+ std::unique_ptr<weld::MessageDialog> xErrorBox(Application::CreateMessageDialog(mpWindow->GetFrameWeld(),
+ VclMessageType::Warning, VclButtonsType::Ok, SdResId(STR_READ_DATA_ERROR)));
+ xErrorBox->run();
+ }
+ else
+ {
+ sal_Int32 nParaCount = aOutliner.GetParagraphCount();
+
+ // for progress bar: number of level-0-paragraphs
+ sal_uInt16 nNewPages = 0;
+ pPara = aOutliner.GetParagraph( 0 );
+ while (pPara)
+ {
+ sal_Int32 nPos = aOutliner.GetAbsPos( pPara );
+ if( Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) )
+ nNewPages++;
+ pPara = aOutliner.GetParagraph( ++nPos );
+ }
+
+ mpDocSh->SetWaitCursor( false );
+
+ std::optional<SfxProgress> pProgress( std::in_place, mpDocSh, SdResId(STR_CREATE_PAGES), nNewPages);
+ pProgress->SetState( 0, 100 );
+
+ nNewPages = 0;
+
+ ViewShellId nViewShellId = mpViewShell ? mpViewShell->GetViewShellBase().GetViewShellId() : ViewShellId(-1);
+ rDocliner.GetUndoManager().EnterListAction(
+ SdResId(STR_UNDO_INSERT_FILE), OUString(), 0, nViewShellId );
+
+ sal_Int32 nSourcePos = 0;
+ SfxStyleSheet* pStyleSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Outline );
+ Paragraph* pSourcePara = aOutliner.GetParagraph( 0 );
+ while (pSourcePara)
+ {
+ sal_Int32 nPos = aOutliner.GetAbsPos( pSourcePara );
+ sal_Int16 nDepth = aOutliner.GetDepth( nPos );
+
+ // only take the last paragraph if it is filled
+ if (nSourcePos < nParaCount - 1 ||
+ !aOutliner.GetText(pSourcePara).isEmpty())
+ {
+ rDocliner.Insert( aOutliner.GetText(pSourcePara), nTargetPos, nDepth );
+ OUString aStyleSheetName( pStyleSheet->GetName() );
+ aStyleSheetName = aStyleSheetName.subView( 0, aStyleSheetName.getLength()-1 ) +
+ OUString::number( nDepth <= 0 ? 1 : nDepth+1 );
+ SfxStyleSheetBasePool* pStylePool = mpDoc->GetStyleSheetPool();
+ SfxStyleSheet* pOutlStyle = static_cast<SfxStyleSheet*>( pStylePool->Find( aStyleSheetName, pStyleSheet->GetFamily() ) );
+ rDocliner.SetStyleSheet( nTargetPos, pOutlStyle );
+ }
+
+ if( Outliner::HasParaFlag( pSourcePara, ParaFlag::ISPAGE ) )
+ {
+ nNewPages++;
+ pProgress->SetState( nNewPages );
+ }
+
+ pSourcePara = aOutliner.GetParagraph( ++nPos );
+ nTargetPos++;
+ nSourcePos++;
+ }
+
+ rDocliner.GetUndoManager().LeaveListAction();
+
+ pProgress.reset();
+
+ mpDocSh->SetWaitCursor( true );
+ }
+}
+
+bool FuInsertFile::InsSDDinOlMode(SfxMedium* pMedium)
+{
+ OutlineView* pOlView = static_cast<OutlineView*>(mpView);
+
+ // transfer Outliner content to SdDrawDocument
+ pOlView->PrepareClose();
+
+ // read in like in the character mode
+ if (InsSDDinDrMode(pMedium))
+ {
+ ::Outliner* pOutliner = pOlView->GetViewByWindow(mpWindow)->GetOutliner();
+
+ // cut notification links temporarily
+ Link<Outliner::ParagraphHdlParam,void> aOldParagraphInsertedHdl = pOutliner->GetParaInsertedHdl();
+ pOutliner->SetParaInsertedHdl( Link<Outliner::ParagraphHdlParam,void>());
+ Link<Outliner::ParagraphHdlParam,void> aOldParagraphRemovingHdl = pOutliner->GetParaRemovingHdl();
+ pOutliner->SetParaRemovingHdl( Link<Outliner::ParagraphHdlParam,void>());
+ Link<Outliner::DepthChangeHdlParam,void> aOldDepthChangedHdl = pOutliner->GetDepthChangedHdl();
+ pOutliner->SetDepthChangedHdl( Link<::Outliner::DepthChangeHdlParam,void>());
+ Link<::Outliner*,void> aOldBeginMovingHdl = pOutliner->GetBeginMovingHdl();
+ pOutliner->SetBeginMovingHdl( Link<::Outliner*,void>());
+ Link<::Outliner*,void> aOldEndMovingHdl = pOutliner->GetEndMovingHdl();
+ pOutliner->SetEndMovingHdl( Link<::Outliner*,void>());
+
+ Link<EditStatus&,void> aOldStatusEventHdl = pOutliner->GetStatusEventHdl();
+ pOutliner->SetStatusEventHdl(Link<EditStatus&,void>());
+
+ pOutliner->Clear();
+ pOlView->FillOutliner();
+
+ // set links again
+ pOutliner->SetParaInsertedHdl(aOldParagraphInsertedHdl);
+ pOutliner->SetParaRemovingHdl(aOldParagraphRemovingHdl);
+ pOutliner->SetDepthChangedHdl(aOldDepthChangedHdl);
+ pOutliner->SetBeginMovingHdl(aOldBeginMovingHdl);
+ pOutliner->SetEndMovingHdl(aOldEndMovingHdl);
+ pOutliner->SetStatusEventHdl(aOldStatusEventHdl);
+
+ return true;
+ }
+ else
+ return false;
+}
+
+void FuInsertFile::GetSupportedFilterVector( ::std::vector< OUString >& rFilterVector )
+{
+ SfxFilterMatcher& rMatcher = SfxGetpApp()->GetFilterMatcher();
+ std::shared_ptr<const SfxFilter> pSearchFilter;
+
+ rFilterVector.clear();
+
+ if( ( pSearchFilter = rMatcher.GetFilter4Mime( "text/plain" )) != nullptr )
+ rFilterVector.push_back( pSearchFilter->GetMimeType() );
+
+ if( ( pSearchFilter = rMatcher.GetFilter4Mime( "application/rtf" ) ) != nullptr )
+ rFilterVector.push_back( pSearchFilter->GetMimeType() );
+
+ if( ( pSearchFilter = rMatcher.GetFilter4Mime( "text/html" ) ) != nullptr )
+ rFilterVector.push_back( pSearchFilter->GetMimeType() );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuline.cxx b/sd/source/ui/func/fuline.cxx
new file mode 100644
index 000000000..da9cc795f
--- /dev/null
+++ b/sd/source/ui/func/fuline.cxx
@@ -0,0 +1,109 @@
+/* -*- 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 <fuline.hxx>
+
+#include <svx/svxids.hrc>
+#include <sfx2/request.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <ViewShell.hxx>
+#include <View.hxx>
+#include <drawdoc.hxx>
+#include <svx/svxdlg.hxx>
+
+namespace sd {
+
+
+FuLine::FuLine (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuLine::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuLine( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuLine::DoExecute( SfxRequest& rReq )
+{
+ rReq.Ignore();
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ if (pArgs)
+ return;
+
+ const SdrObject* pObj = nullptr;
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ if( rMarkList.GetMarkCount() == 1 )
+ pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+
+ SfxItemSet aNewAttr( mpDoc->GetPool() );
+ mpView->GetAttributes( aNewAttr );
+
+ bool bHasMarked = mpView->AreObjectsMarked();
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ VclPtr<SfxAbstractTabDialog> pDlg( pFact->CreateSvxLineTabDialog(mpViewShell->GetFrameWeld(), &aNewAttr, mpDoc, pObj, bHasMarked) );
+
+ pDlg->StartExecuteAsync([pDlg, this](sal_Int32 nResult){
+ if (nResult == RET_OK)
+ {
+ mpView->SetAttributes (*(pDlg->GetOutputItemSet ()));
+
+ // some attributes are changed, we have to update the listboxes in the objectbars
+ static const sal_uInt16 SidArray[] = {
+ SID_ATTR_LINE_STYLE, // ( SID_SVX_START + 169 )
+ SID_ATTR_LINE_DASH, // ( SID_SVX_START + 170 )
+ SID_ATTR_LINE_WIDTH, // ( SID_SVX_START + 171 )
+ SID_ATTR_LINE_COLOR, // ( SID_SVX_START + 172 )
+ SID_ATTR_LINE_START, // ( SID_SVX_START + 173 )
+ SID_ATTR_LINE_END, // ( SID_SVX_START + 174 )
+ SID_ATTR_LINE_TRANSPARENCE, // (SID_SVX_START+1107)
+ SID_ATTR_LINE_JOINT, // (SID_SVX_START+1110)
+ SID_ATTR_LINE_CAP, // (SID_SVX_START+1111)
+ 0 };
+
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray );
+ }
+
+ // deferred until the dialog ends
+ mpViewShell->Cancel();
+
+ pDlg->disposeOnce();
+ });
+}
+
+void FuLine::Activate()
+{
+}
+
+void FuLine::Deactivate()
+{
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fulinend.cxx b/sd/source/ui/func/fulinend.cxx
new file mode 100644
index 000000000..34fe63161
--- /dev/null
+++ b/sd/source/ui/func/fulinend.cxx
@@ -0,0 +1,154 @@
+/* -*- 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 <fulinend.hxx>
+#include <svx/xtable.hxx>
+#include <svx/svxdlg.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdopath.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+
+#include <strings.hrc>
+#include <helpids.h>
+#include <sdresid.hxx>
+#include <drawdoc.hxx>
+#include <View.hxx>
+#include <Window.hxx>
+#include <memory>
+
+namespace sd {
+
+
+FuLineEnd::FuLineEnd(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView,
+ SdDrawDocument* pDoc, SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuLineEnd::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuLineEnd( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuLineEnd::DoExecute( SfxRequest& )
+{
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if( rMarkList.GetMarkCount() != 1 )
+ return;
+
+ const SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ const SdrObject* pNewObj;
+ SdrObjectUniquePtr pConvPolyObj;
+
+ if( dynamic_cast< const SdrPathObj *>( pObj ) != nullptr )
+ {
+ pNewObj = pObj;
+ }
+ else
+ {
+ SdrObjTransformInfoRec aInfoRec;
+ pObj->TakeObjInfo( aInfoRec );
+
+ if( aInfoRec.bCanConvToPath &&
+ pObj->GetObjInventor() == SdrInventor::Default &&
+ pObj->GetObjIdentifier() != SdrObjKind::Group )
+ // bCanConvToPath is sal_True for group objects,
+ // but it crashes on ConvertToPathObj()!
+ {
+ pConvPolyObj = pObj->ConvertToPolyObj( true, false );
+ pNewObj = pConvPolyObj.get();
+
+ if( !pNewObj || dynamic_cast< const SdrPathObj *>( pNewObj ) == nullptr )
+ return; // Cancel, additional security, but it does not help
+ // for group objects
+ }
+ else return; // Cancel
+ }
+
+ const ::basegfx::B2DPolyPolygon aPolyPolygon = static_cast<const SdrPathObj*>(pNewObj)->GetPathPoly();
+
+ // Delete the created poly-object
+ pConvPolyObj.reset();
+
+ XLineEndListRef pLineEndList = mpDoc->GetLineEndList();
+
+ OUString aNewName( SdResId( STR_LINEEND ) );
+ OUString aDesc( SdResId( STR_DESC_LINEEND ) );
+ OUString aName;
+
+ ::tools::Long nCount = pLineEndList->Count();
+ ::tools::Long j = 1;
+ bool bDifferent = false;
+
+ while( !bDifferent )
+ {
+ aName = aNewName + " " + OUString::number(j++);
+ bDifferent = true;
+ for( ::tools::Long i = 0; i < nCount && bDifferent; i++ )
+ {
+ if( aName == pLineEndList->GetLineEnd( i )->GetName() )
+ bDifferent = false;
+ }
+ }
+
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractSvxNameDialog> pDlg( pFact->CreateSvxNameDialog( nullptr, aName, aDesc ) );
+
+ pDlg->SetEditHelpId( HID_SD_NAMEDIALOG_LINEEND );
+
+ if( pDlg->Execute() != RET_OK )
+ return;
+
+ pDlg->GetName( aName );
+ bDifferent = true;
+
+ for( ::tools::Long i = 0; i < nCount && bDifferent; i++ )
+ {
+ if( aName == pLineEndList->GetLineEnd( i )->GetName() )
+ bDifferent = false;
+ }
+
+ if( bDifferent )
+ {
+ pLineEndList->Insert(std::make_unique<XLineEndEntry>(aPolyPolygon, aName));
+ }
+ else
+ {
+ std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(mpWindow ? mpWindow->GetFrameWeld() : nullptr,
+ VclMessageType::Warning, VclButtonsType::Ok,
+ SdResId(STR_WARN_NAME_DUPLICATE)));
+ xWarn->run();
+ }
+}
+
+void FuLineEnd::Activate()
+{
+}
+
+void FuLineEnd::Deactivate()
+{
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fulink.cxx b/sd/source/ui/func/fulink.cxx
new file mode 100644
index 000000000..8a6d726de
--- /dev/null
+++ b/sd/source/ui/func/fulink.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/.
+ *
+ * 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 <fulink.hxx>
+
+#include <sfx2/bindings.hxx>
+#include <sfx2/viewfrm.hxx>
+
+#include <svx/svxdlg.hxx>
+
+#include <drawdoc.hxx>
+#include <ViewShell.hxx>
+#include <app.hrc>
+
+class SfxRequest;
+
+namespace sd {
+
+
+FuLink::FuLink (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq )
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuLink::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuLink( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuLink::DoExecute( SfxRequest& )
+{
+ sfx2::LinkManager* pLinkManager = mpDoc->GetLinkManager();
+
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ ScopedVclPtr<SfxAbstractLinksDialog> pDlg(pFact->CreateLinksDialog(mpViewShell->GetFrameWeld(), pLinkManager));
+ pDlg->Execute();
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_MANAGE_LINKS );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fumeasur.cxx b/sd/source/ui/func/fumeasur.cxx
new file mode 100644
index 000000000..27afd0f7a
--- /dev/null
+++ b/sd/source/ui/func/fumeasur.cxx
@@ -0,0 +1,72 @@
+/* -*- 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 <fumeasur.hxx>
+#include <sfx2/request.hxx>
+#include <View.hxx>
+#include <drawdoc.hxx>
+#include <svx/svxdlg.hxx>
+#include <svx/dialogs.hrc>
+
+namespace sd {
+
+
+FuMeasureDlg::FuMeasureDlg (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuMeasureDlg::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuMeasureDlg( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuMeasureDlg::DoExecute( SfxRequest& rReq )
+{
+ SfxItemSet aNewAttr( mpDoc->GetPool() );
+ mpView->GetAttributes( aNewAttr );
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ if( !pArgs )
+ {
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ ScopedVclPtr<SfxAbstractDialog> pDlg(pFact->CreateSfxDialog(rReq.GetFrameWeld(), aNewAttr, mpView, RID_SVXPAGE_MEASURE));
+
+ if( pDlg->Execute() == RET_OK )
+ {
+ rReq.Done( *pDlg->GetOutputItemSet() );
+ pArgs = rReq.GetArgs();
+ }
+ }
+
+ if( pArgs )
+ mpView->SetAttributes( *pArgs );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fumorph.cxx b/sd/source/ui/func/fumorph.cxx
new file mode 100644
index 000000000..c2f94b440
--- /dev/null
+++ b/sd/source/ui/func/fumorph.cxx
@@ -0,0 +1,508 @@
+/* -*- 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 <fumorph.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/xlnclit.hxx>
+#include <svx/xlnwtit.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/svdogrp.hxx>
+#include <editeng/eeitem.hxx>
+
+#include <View.hxx>
+#include <Window.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <basegfx/matrix/b2dhommatrixtools.hxx>
+
+#include <strings.hrc>
+#include <sdresid.hxx>
+
+#include <sdabstdlg.hxx>
+
+#include <svx/svditer.hxx>
+
+#include <basegfx/color/bcolor.hxx>
+#include <com/sun/star/drawing/LineStyle.hpp>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+FuMorph::FuMorph (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq )
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuMorph::Create(
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq
+)
+{
+ rtl::Reference<FuPoor> xFunc( new FuMorph( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuMorph::DoExecute( SfxRequest& )
+{
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if(rMarkList.GetMarkCount() != 2)
+ return;
+
+ // create clones
+ SdrObject* pObj1 = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ SdrObject* pObj2 = rMarkList.GetMark(1)->GetMarkedSdrObj();
+ SdrObject* pCloneObj1(pObj1->CloneSdrObject(pObj1->getSdrModelFromSdrObject()));
+ SdrObject* pCloneObj2(pObj2->CloneSdrObject(pObj2->getSdrModelFromSdrObject()));
+
+ // delete text at clone, otherwise we do not get a correct PathObj
+ pCloneObj1->SetOutlinerParaObject(std::nullopt);
+ pCloneObj2->SetOutlinerParaObject(std::nullopt);
+
+ // create path objects
+ SdrObjectUniquePtr pPolyObj1 = pCloneObj1->ConvertToPolyObj(false, false);
+ SdrObjectUniquePtr pPolyObj2 = pCloneObj2->ConvertToPolyObj(false, false);
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractMorphDlg> pDlg( pFact->CreateMorphDlg(mpWindow ? mpWindow->GetFrameWeld() : nullptr, pObj1, pObj2) );
+ if(pPolyObj1 && pPolyObj2 && (pDlg->Execute() == RET_OK))
+ {
+ B2DPolyPolygonList_impl aPolyPolyList;
+ ::basegfx::B2DPolyPolygon aPolyPoly1;
+ ::basegfx::B2DPolyPolygon aPolyPoly2;
+
+ pDlg->SaveSettings();
+
+ // #i48168# Not always is the pPolyObj1/pPolyObj2 a SdrPathObj, it may also be a group object
+ // containing SdrPathObjs. To get the polygons, I add two iters here
+ SdrObjListIter aIter1(*pPolyObj1);
+ SdrObjListIter aIter2(*pPolyObj2);
+
+ while(aIter1.IsMore())
+ {
+ SdrObject* pObj = aIter1.Next();
+ if(auto pPathObj = dynamic_cast< SdrPathObj *>( pObj ))
+ aPolyPoly1.append(pPathObj->GetPathPoly());
+ }
+
+ while(aIter2.IsMore())
+ {
+ SdrObject* pObj = aIter2.Next();
+ if(auto pPathObj = dynamic_cast< SdrPathObj *>( pObj ))
+ aPolyPoly2.append(pPathObj->GetPathPoly());
+ }
+
+ // perform morphing
+ if(aPolyPoly1.count() && aPolyPoly2.count())
+ {
+ aPolyPoly1 = ::basegfx::utils::correctOrientations(aPolyPoly1);
+ aPolyPoly1.removeDoublePoints();
+ ::basegfx::B2VectorOrientation eIsClockwise1(::basegfx::utils::getOrientation(aPolyPoly1.getB2DPolygon(0)));
+
+ aPolyPoly2 = ::basegfx::utils::correctOrientations(aPolyPoly2);
+ aPolyPoly2.removeDoublePoints();
+ ::basegfx::B2VectorOrientation eIsClockwise2(::basegfx::utils::getOrientation(aPolyPoly2.getB2DPolygon(0)));
+
+ // set same orientation
+ if(eIsClockwise1 != eIsClockwise2)
+ aPolyPoly2.flip();
+
+ // force same poly count
+ if(aPolyPoly1.count() < aPolyPoly2.count())
+ ImpAddPolys(aPolyPoly1, aPolyPoly2);
+ else if(aPolyPoly2.count() < aPolyPoly1.count())
+ ImpAddPolys(aPolyPoly2, aPolyPoly1);
+
+ // use orientation flag from dialog
+ if(!pDlg->IsOrientationFade())
+ aPolyPoly2.flip();
+
+ // force same point counts
+ for( sal_uInt32 a(0); a < aPolyPoly1.count(); a++ )
+ {
+ ::basegfx::B2DPolygon aSub1(aPolyPoly1.getB2DPolygon(a));
+ ::basegfx::B2DPolygon aSub2(aPolyPoly2.getB2DPolygon(a));
+
+ if(aSub1.count() < aSub2.count())
+ ImpEqualizePolyPointCount(aSub1, aSub2);
+ else if(aSub2.count() < aSub1.count())
+ ImpEqualizePolyPointCount(aSub2, aSub1);
+
+ aPolyPoly1.setB2DPolygon(a, aSub1);
+ aPolyPoly2.setB2DPolygon(a, aSub2);
+ }
+
+ ImpMorphPolygons(aPolyPoly1, aPolyPoly2, pDlg->GetFadeSteps(), aPolyPolyList);
+
+ OUString aString = mpView->GetDescriptionOfMarkedObjects() +
+ " " + SdResId(STR_UNDO_MORPHING);
+
+ mpView->BegUndo(aString);
+ ImpInsertPolygons(aPolyPolyList, pDlg->IsAttributeFade(), pObj1, pObj2);
+ mpView->EndUndo();
+ }
+ }
+ SdrObject::Free( pCloneObj1 );
+ SdrObject::Free( pCloneObj2 );
+}
+
+static ::basegfx::B2DPolygon ImpGetExpandedPolygon(
+ const ::basegfx::B2DPolygon& rCandidate,
+ sal_uInt32 nNum
+)
+{
+ if(rCandidate.count() && nNum && rCandidate.count() != nNum)
+ {
+ // length of step in dest poly
+ ::basegfx::B2DPolygon aRetval;
+ const double fStep(::basegfx::utils::getLength(rCandidate) / static_cast<double>(rCandidate.isClosed() ? nNum : nNum - 1));
+ double fDestPos(0.0);
+ double fSrcPos(0.0);
+ sal_uInt32 nSrcPos(0);
+ sal_uInt32 nSrcPosNext((nSrcPos + 1 == rCandidate.count()) ? 0 : nSrcPos + 1);
+ double fNextSrcLen(::basegfx::B2DVector(rCandidate.getB2DPoint(nSrcPos) - rCandidate.getB2DPoint(nSrcPosNext)).getLength());
+
+ for(sal_uInt32 b(0); b < nNum; b++)
+ {
+ // calc fDestPos in source
+ while(fSrcPos + fNextSrcLen < fDestPos)
+ {
+ fSrcPos += fNextSrcLen;
+ nSrcPos++;
+ nSrcPosNext = (nSrcPos + 1 == rCandidate.count()) ? 0 : nSrcPos + 1;
+ fNextSrcLen = ::basegfx::B2DVector(rCandidate.getB2DPoint(nSrcPos) - rCandidate.getB2DPoint(nSrcPosNext)).getLength();
+ }
+
+ // fDestPos is between fSrcPos and (fSrcPos + fNextSrcLen)
+ const double fLenA((fDestPos - fSrcPos) / fNextSrcLen);
+ const ::basegfx::B2DPoint aOld1(rCandidate.getB2DPoint(nSrcPos));
+ const ::basegfx::B2DPoint aOld2(rCandidate.getB2DPoint(nSrcPosNext));
+ ::basegfx::B2DPoint aNewPoint(basegfx::interpolate(aOld1, aOld2, fLenA));
+ aRetval.append(aNewPoint);
+
+ // next step
+ fDestPos += fStep;
+ }
+
+ if(aRetval.count() >= 3)
+ {
+ aRetval.setClosed(rCandidate.isClosed());
+ }
+
+ return aRetval;
+ }
+ else
+ {
+ return rCandidate;
+ }
+}
+
+/**
+ * make the point count of the polygons equal in adding points
+ */
+void FuMorph::ImpEqualizePolyPointCount(
+ ::basegfx::B2DPolygon& rSmall,
+ const ::basegfx::B2DPolygon& rBig
+)
+{
+ // create poly with equal point count
+ const sal_uInt32 nCnt(rBig.count());
+ ::basegfx::B2DPolygon aPoly1(ImpGetExpandedPolygon(rSmall, nCnt));
+
+ // create transformation for rBig to do the compare
+ const ::basegfx::B2DRange aSrcSize(::basegfx::utils::getRange(rBig));
+ const ::basegfx::B2DPoint aSrcPos(aSrcSize.getCenter());
+ const ::basegfx::B2DRange aDstSize(::basegfx::utils::getRange(rSmall));
+ const ::basegfx::B2DPoint aDstPos(aDstSize.getCenter());
+
+ basegfx::B2DHomMatrix aTrans(basegfx::utils::createTranslateB2DHomMatrix(-aSrcPos.getX(), -aSrcPos.getY()));
+ aTrans.scale(aDstSize.getWidth() / aSrcSize.getWidth(), aDstSize.getHeight() / aSrcSize.getHeight());
+ aTrans.translate(aDstPos.getX(), aDstPos.getY());
+
+ // transpose points to have smooth linear blending
+ ::basegfx::B2DPolygon aPoly2;
+ aPoly2.append(::basegfx::B2DPoint(), nCnt);
+ sal_uInt32 nInd(ImpGetNearestIndex(aPoly1, aTrans * rBig.getB2DPoint(0)));
+
+ for(sal_uInt32 a(0); a < nCnt; a++)
+ {
+ aPoly2.setB2DPoint((a + nCnt - nInd) % nCnt, aPoly1.getB2DPoint(a));
+ }
+
+ aPoly2.setClosed(rBig.isClosed());
+ rSmall = aPoly2;
+}
+
+sal_uInt32 FuMorph::ImpGetNearestIndex(
+ const ::basegfx::B2DPolygon& rPoly,
+ const ::basegfx::B2DPoint& rPos
+)
+{
+ double fMinDist = 0.0;
+ sal_uInt32 nActInd = 0;
+
+ for(sal_uInt32 a(0); a < rPoly.count(); a++)
+ {
+ double fNewDist(::basegfx::B2DVector(rPoly.getB2DPoint(a) - rPos).getLength());
+
+ if(!a || fNewDist < fMinDist)
+ {
+ fMinDist = fNewDist;
+ nActInd = a;
+ }
+ }
+
+ return nActInd;
+}
+
+/**
+ * add to a point reduced polys until count is same
+ */
+void FuMorph::ImpAddPolys(
+ ::basegfx::B2DPolyPolygon& rSmaller,
+ const ::basegfx::B2DPolyPolygon& rBigger
+)
+{
+ while(rSmaller.count() < rBigger.count())
+ {
+ const ::basegfx::B2DPolygon& aToBeCopied(rBigger.getB2DPolygon(rSmaller.count()));
+ const ::basegfx::B2DRange aToBeCopiedPolySize(::basegfx::utils::getRange(aToBeCopied));
+ ::basegfx::B2DPoint aNewPoint(aToBeCopiedPolySize.getCenter());
+ ::basegfx::B2DPolygon aNewPoly;
+
+ const ::basegfx::B2DRange aSrcSize(::basegfx::utils::getRange(rBigger.getB2DPolygon(0)));
+ const ::basegfx::B2DPoint aSrcPos(aSrcSize.getCenter());
+ const ::basegfx::B2DRange aDstSize(::basegfx::utils::getRange(rSmaller.getB2DPolygon(0)));
+ const ::basegfx::B2DPoint aDstPos(aDstSize.getCenter());
+ aNewPoint = aNewPoint - aSrcPos + aDstPos;
+
+ for(sal_uInt32 a(0); a < aToBeCopied.count(); a++)
+ {
+ aNewPoly.append(aNewPoint);
+ }
+
+ rSmaller.append(aNewPoly);
+ }
+}
+
+/**
+ * create group object with morphed polygons
+ */
+void FuMorph::ImpInsertPolygons(
+ B2DPolyPolygonList_impl& rPolyPolyList3D,
+ bool bAttributeFade,
+ const SdrObject* pObj1,
+ const SdrObject* pObj2
+)
+{
+ Color aStartFillCol;
+ Color aEndFillCol;
+ Color aStartLineCol;
+ Color aEndLineCol;
+ ::tools::Long nStartLineWidth = 0;
+ ::tools::Long nEndLineWidth = 0;
+ SdrPageView* pPageView = mpView->GetSdrPageView();
+ SfxItemPool & rPool = pObj1->GetObjectItemPool();
+ SfxItemSetFixed<SDRATTR_START,SDRATTR_NOTPERSIST_FIRST-1,EE_ITEMS_START,EE_ITEMS_END> aSet1( rPool );
+ SfxItemSet aSet2( aSet1 );
+ bool bLineColor = false;
+ bool bFillColor = false;
+ bool bLineWidth = false;
+ bool bIgnoreLine = false;
+ bool bIgnoreFill = false;
+
+ aSet1.Put(pObj1->GetMergedItemSet());
+ aSet2.Put(pObj2->GetMergedItemSet());
+
+ const drawing::LineStyle eLineStyle1 = aSet1.Get(XATTR_LINESTYLE).GetValue();
+ const drawing::LineStyle eLineStyle2 = aSet2.Get(XATTR_LINESTYLE).GetValue();
+ const drawing::FillStyle eFillStyle1 = aSet1.Get(XATTR_FILLSTYLE).GetValue();
+ const drawing::FillStyle eFillStyle2 = aSet2.Get(XATTR_FILLSTYLE).GetValue();
+
+ if ( bAttributeFade )
+ {
+ if ( ( eLineStyle1 != drawing::LineStyle_NONE ) && ( eLineStyle2 != drawing::LineStyle_NONE ) )
+ {
+ bLineWidth = bLineColor = true;
+
+ aStartLineCol = aSet1.Get(XATTR_LINECOLOR).GetColorValue();
+ aEndLineCol = aSet2.Get(XATTR_LINECOLOR).GetColorValue();
+
+ nStartLineWidth = aSet1.Get(XATTR_LINEWIDTH).GetValue();
+ nEndLineWidth = aSet2.Get(XATTR_LINEWIDTH).GetValue();
+ }
+ else if ( ( eLineStyle1 == drawing::LineStyle_NONE ) && ( eLineStyle2 == drawing::LineStyle_NONE ) )
+ bIgnoreLine = true;
+
+ if ( ( eFillStyle1 == drawing::FillStyle_SOLID ) && ( eFillStyle2 == drawing::FillStyle_SOLID ) )
+ {
+ bFillColor = true;
+ aStartFillCol = aSet1.Get(XATTR_FILLCOLOR).GetColorValue();
+ aEndFillCol = aSet2.Get(XATTR_FILLCOLOR).GetColorValue();
+ }
+ else if ( ( eFillStyle1 == drawing::FillStyle_NONE ) && ( eFillStyle2 == drawing::FillStyle_NONE ) )
+ bIgnoreFill = true;
+ }
+
+ if ( !pPageView )
+ return;
+
+ SfxItemSet aSet( aSet1 );
+ std::unique_ptr<SdrObjGroup, SdrObjectFreeOp> xObjGroup(new SdrObjGroup(mpView->getSdrModelFromSdrView()));
+ SdrObjList* pObjList = xObjGroup->GetSubList();
+ const size_t nCount = rPolyPolyList3D.size();
+ const double fStep = 1. / ( nCount + 1 );
+ const double fDelta = nEndLineWidth - nStartLineWidth;
+ double fFactor = fStep;
+
+ aSet.Put( XLineStyleItem( drawing::LineStyle_SOLID ) );
+ aSet.Put( XFillStyleItem( drawing::FillStyle_SOLID ) );
+
+ for ( size_t i = 0; i < nCount; i++, fFactor += fStep )
+ {
+ const ::basegfx::B2DPolyPolygon& rPolyPoly3D = rPolyPolyList3D[ i ];
+ SdrPathObj* pNewObj = new SdrPathObj(
+ mpView->getSdrModelFromSdrView(),
+ SdrObjKind::Polygon,
+ rPolyPoly3D);
+
+ // line color
+ if ( bLineColor )
+ {
+ const basegfx::BColor aLineColor(basegfx::interpolate(aStartLineCol.getBColor(), aEndLineCol.getBColor(), fFactor));
+ aSet.Put( XLineColorItem( "", Color(aLineColor)));
+ }
+ else if ( bIgnoreLine )
+ aSet.Put( XLineStyleItem( drawing::LineStyle_NONE ) );
+
+ // fill color
+ if ( bFillColor )
+ {
+ const basegfx::BColor aFillColor(basegfx::interpolate(aStartFillCol.getBColor(), aEndFillCol.getBColor(), fFactor));
+ aSet.Put( XFillColorItem( "", Color(aFillColor)));
+ }
+ else if ( bIgnoreFill )
+ aSet.Put( XFillStyleItem( drawing::FillStyle_NONE ) );
+
+ // line width
+ if ( bLineWidth )
+ aSet.Put( XLineWidthItem( nStartLineWidth + static_cast<::tools::Long>( fFactor * fDelta + 0.5 ) ) );
+
+ pNewObj->SetMergedItemSetAndBroadcast(aSet);
+
+ pObjList->InsertObject( pNewObj );
+ }
+
+ if ( nCount )
+ {
+ pObjList->InsertObject(
+ pObj1->CloneSdrObject(pObj1->getSdrModelFromSdrObject()),
+ 0 );
+ pObjList->InsertObject(
+ pObj2->CloneSdrObject(pObj2->getSdrModelFromSdrObject()) );
+
+ mpView->DeleteMarked();
+ mpView->InsertObjectAtView(xObjGroup.release(), *pPageView, SdrInsertFlags:: SETDEFLAYER);
+ }
+}
+
+/**
+ * create single morphed PolyPolygon
+ */
+::basegfx::B2DPolyPolygon FuMorph::ImpCreateMorphedPolygon(
+ const ::basegfx::B2DPolyPolygon& rPolyPolyStart,
+ const ::basegfx::B2DPolyPolygon& rPolyPolyEnd,
+ double fMorphingFactor
+)
+{
+ ::basegfx::B2DPolyPolygon aNewPolyPolygon;
+ const double fFactor = 1.0 - fMorphingFactor;
+
+ for(sal_uInt32 a(0); a < rPolyPolyStart.count(); a++)
+ {
+ const ::basegfx::B2DPolygon& aPolyStart(rPolyPolyStart.getB2DPolygon(a));
+ const ::basegfx::B2DPolygon& aPolyEnd(rPolyPolyEnd.getB2DPolygon(a));
+ const sal_uInt32 nCount(aPolyStart.count());
+ ::basegfx::B2DPolygon aNewPolygon;
+
+ for(sal_uInt32 b(0); b < nCount; b++)
+ {
+ const ::basegfx::B2DPoint& aPtStart(aPolyStart.getB2DPoint(b));
+ const ::basegfx::B2DPoint& aPtEnd(aPolyEnd.getB2DPoint(b));
+ aNewPolygon.append(aPtEnd + ((aPtStart - aPtEnd) * fFactor));
+ }
+
+ aNewPolygon.setClosed(aPolyStart.isClosed() && aPolyEnd.isClosed());
+ aNewPolyPolygon.append(aNewPolygon);
+ }
+
+ return aNewPolyPolygon;
+}
+
+/**
+ * create morphed PolyPolygons
+ */
+void FuMorph::ImpMorphPolygons(
+ const ::basegfx::B2DPolyPolygon& rPolyPoly1,
+ const ::basegfx::B2DPolyPolygon& rPolyPoly2,
+ const sal_uInt16 nSteps,
+ B2DPolyPolygonList_impl& rPolyPolyList3D
+)
+{
+ if(!nSteps)
+ return;
+
+ const ::basegfx::B2DRange aStartPolySize(::basegfx::utils::getRange(rPolyPoly1));
+ const ::basegfx::B2DPoint aStartCenter(aStartPolySize.getCenter());
+ const ::basegfx::B2DRange aEndPolySize(::basegfx::utils::getRange(rPolyPoly2));
+ const ::basegfx::B2DPoint aEndCenter(aEndPolySize.getCenter());
+ const ::basegfx::B2DPoint aDelta(aEndCenter - aStartCenter);
+ const double fFactor(1.0 / (nSteps + 1));
+ double fValue(0.0);
+
+ for(sal_uInt16 i(0); i < nSteps; i++)
+ {
+ fValue += fFactor;
+ ::basegfx::B2DPolyPolygon aNewPolyPoly2D = ImpCreateMorphedPolygon(rPolyPoly1, rPolyPoly2, fValue);
+
+ const ::basegfx::B2DRange aNewPolySize(::basegfx::utils::getRange(aNewPolyPoly2D));
+ const ::basegfx::B2DPoint aNewS(aNewPolySize.getCenter());
+ const ::basegfx::B2DPoint aRealS(aStartCenter + (aDelta * fValue));
+ const ::basegfx::B2DPoint aDiff(aRealS - aNewS);
+
+ aNewPolyPoly2D.transform(basegfx::utils::createTranslateB2DHomMatrix(aDiff));
+ rPolyPolyList3D.push_back( std::move(aNewPolyPoly2D) );
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/funavig.cxx b/sd/source/ui/func/funavig.cxx
new file mode 100644
index 000000000..bd0cdb7c3
--- /dev/null
+++ b/sd/source/ui/func/funavig.cxx
@@ -0,0 +1,154 @@
+/* -*- 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 <funavig.hxx>
+#include <sfx2/viewfrm.hxx>
+
+#include <app.hrc>
+#include <sdpage.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/request.hxx>
+#include <drawdoc.hxx>
+#include <DrawViewShell.hxx>
+#include <ViewShell.hxx>
+#include <slideshow.hxx>
+
+namespace sd {
+
+
+FuNavigation::FuNavigation (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuNavigation::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuNavigation( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuNavigation::DoExecute( SfxRequest& rReq )
+{
+ bool bSlideShow = SlideShow::IsRunning( mpViewShell->GetViewShellBase() );
+
+ switch ( rReq.GetSlot() )
+ {
+ case SID_GO_TO_FIRST_PAGE:
+ {
+ if (!mpView->IsTextEdit()
+ && dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr
+ && !bSlideShow)
+ {
+ // jump to first page
+ static_cast<DrawViewShell*>(mpViewShell)->SwitchPage(0);
+ }
+ }
+ break;
+
+ case SID_GO_TO_PREVIOUS_PAGE:
+ {
+ if( !bSlideShow)
+ if( auto pDrawViewShell = dynamic_cast<DrawViewShell *>( mpViewShell ) )
+ {
+ // With no modifier pressed we move to the previous
+ // slide.
+ mpView->SdrEndTextEdit();
+
+ // Previous page.
+ SdPage* pPage = pDrawViewShell->GetActualPage();
+ sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2;
+
+ if (nSdPage > 0)
+ {
+ // Switch the page and send events regarding
+ // deactivation the old page and activating the new
+ // one.
+ TabControl& rPageTabControl =
+ static_cast<DrawViewShell*>(mpViewShell)
+ ->GetPageTabControl();
+ if (rPageTabControl.IsReallyShown())
+ rPageTabControl.SendDeactivatePageEvent ();
+ static_cast<DrawViewShell*>(mpViewShell)->SwitchPage(nSdPage - 1);
+ if (rPageTabControl.IsReallyShown())
+ rPageTabControl.SendActivatePageEvent ();
+ }
+ }
+ }
+ break;
+
+ case SID_GO_TO_NEXT_PAGE:
+ {
+ if( !bSlideShow)
+ if( auto pDrawViewShell = dynamic_cast<DrawViewShell *>( mpViewShell ))
+ {
+ // With no modifier pressed we move to the next slide.
+ mpView->SdrEndTextEdit();
+
+ // Next page.
+ SdPage* pPage = pDrawViewShell->GetActualPage();
+ sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2;
+
+ if (nSdPage < mpDoc->GetSdPageCount(pPage->GetPageKind()) - 1)
+ {
+ // Switch the page and send events regarding
+ // deactivation the old page and activating the new
+ // one.
+ TabControl& rPageTabControl =
+ static_cast<DrawViewShell*>(mpViewShell)->GetPageTabControl();
+ if (rPageTabControl.IsReallyShown())
+ rPageTabControl.SendDeactivatePageEvent ();
+ static_cast<DrawViewShell*>(mpViewShell)->SwitchPage(nSdPage + 1);
+ if (rPageTabControl.IsReallyShown())
+ rPageTabControl.SendActivatePageEvent ();
+ }
+ }
+ }
+ break;
+
+ case SID_GO_TO_LAST_PAGE:
+ {
+ if (!mpView->IsTextEdit() && !bSlideShow)
+ if (auto pDrawViewShell = dynamic_cast<DrawViewShell *>( mpViewShell ))
+ {
+ // jump to last page
+ SdPage* pPage = pDrawViewShell->GetActualPage();
+ pDrawViewShell->SwitchPage(mpDoc->GetSdPageCount(
+ pPage->GetPageKind()) - 1);
+ }
+ }
+ break;
+ }
+ // Refresh toolbar icons
+ SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings();
+ rBindings.Invalidate(SID_GO_TO_FIRST_PAGE);
+ rBindings.Invalidate(SID_GO_TO_PREVIOUS_PAGE);
+ rBindings.Invalidate(SID_GO_TO_NEXT_PAGE);
+ rBindings.Invalidate(SID_GO_TO_LAST_PAGE);
+}
+
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuoaprms.cxx b/sd/source/ui/func/fuoaprms.cxx
new file mode 100644
index 000000000..0feaabfb4
--- /dev/null
+++ b/sd/source/ui/func/fuoaprms.cxx
@@ -0,0 +1,800 @@
+/* -*- 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 <fuoaprms.hxx>
+#include <sdattr.hrc>
+
+#include <editeng/colritem.hxx>
+#include <svx/svdundo.hxx>
+#include <sfx2/objsh.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/sfxdlg.hxx>
+#include <svl/intitem.hxx>
+#include <svl/stritem.hxx>
+#include <svx/svdopath.hxx>
+#include <tools/debug.hxx>
+
+#include <strings.hrc>
+#include <drawdoc.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <anminfo.hxx>
+#include <unoaprms.hxx>
+#include <sdundogr.hxx>
+#include <View.hxx>
+#include <sdabstdlg.hxx>
+#include <sdresid.hxx>
+#include <tools/helpers.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <memory>
+
+using namespace ::com::sun::star;
+
+namespace sd {
+
+
+#define ATTR_MISSING 0 ///< Attribute missing
+#define ATTR_MIXED 1 ///< Attribute ambiguous (on multi-selection)
+#define ATTR_SET 2 ///< Attribute unique
+
+FuObjectAnimationParameters::FuObjectAnimationParameters (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuObjectAnimationParameters::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuObjectAnimationParameters( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuObjectAnimationParameters::DoExecute( SfxRequest& rReq )
+{
+ SfxUndoManager* pUndoMgr = mpViewShell->GetViewFrame()->GetObjectShell()->GetUndoManager();
+
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ const size_t nCount = rMarkList.GetMarkCount();
+
+ short nAnimationSet = ATTR_MISSING;
+ short nEffectSet = ATTR_MISSING;
+ short nTextEffectSet = ATTR_MISSING;
+ short nSpeedSet = ATTR_MISSING;
+ short nFadeColorSet = ATTR_MISSING;
+ short nFadeOutSet = ATTR_MISSING;
+ short nInvisibleSet = ATTR_MISSING;
+ short nSoundOnSet = ATTR_MISSING;
+ short nSoundFileSet = ATTR_MISSING;
+ short nPlayFullSet = ATTR_MISSING;
+ short nClickActionSet = ATTR_MISSING;
+ short nBookmarkSet = ATTR_MISSING;
+
+ short nSecondEffectSet = ATTR_MISSING;
+ short nSecondSpeedSet = ATTR_MISSING;
+ short nSecondSoundOnSet = ATTR_MISSING;
+ short nSecondPlayFullSet = ATTR_MISSING;
+
+ // defaults (for Undo-Action)
+ presentation::AnimationEffect eEffect = presentation::AnimationEffect_NONE;
+ presentation::AnimationEffect eTextEffect = presentation::AnimationEffect_NONE;
+ presentation::AnimationSpeed eSpeed = presentation::AnimationSpeed_MEDIUM;
+ bool bActive = false;
+ bool bFadeOut = false;
+ Color aFadeColor = COL_LIGHTGRAY;
+ bool bInvisible = false;
+ bool bSoundOn = false;
+ OUString aSound;
+ bool bPlayFull = false;
+ presentation::ClickAction eClickAction = presentation::ClickAction_NONE;
+ OUString aBookmark;
+
+ presentation::AnimationEffect eSecondEffect = presentation::AnimationEffect_NONE;
+ presentation::AnimationSpeed eSecondSpeed = presentation::AnimationSpeed_MEDIUM;
+ bool bSecondSoundOn = false;
+ bool bSecondPlayFull = false;
+
+ SdAnimationInfo* pInfo;
+ SdrMark* pMark;
+
+ // inspect first object
+ pMark = rMarkList.GetMark(0);
+ pInfo = SdDrawDocument::GetAnimationInfo(pMark->GetMarkedSdrObj());
+ if( pInfo )
+ {
+ bActive = pInfo->mbActive;
+ nAnimationSet = ATTR_SET;
+
+ eEffect = pInfo->meEffect;
+ nEffectSet = ATTR_SET;
+
+ eTextEffect = pInfo->meTextEffect;
+ nTextEffectSet = ATTR_SET;
+
+ eSpeed = pInfo->meSpeed;
+ nSpeedSet = ATTR_SET;
+
+ bFadeOut = pInfo->mbDimPrevious;
+ nFadeOutSet = ATTR_SET;
+
+ aFadeColor = pInfo->maDimColor;
+ nFadeColorSet = ATTR_SET;
+
+ bInvisible = pInfo->mbDimHide;
+ nInvisibleSet = ATTR_SET;
+
+ bSoundOn = pInfo->mbSoundOn;
+ nSoundOnSet = ATTR_SET;
+
+ aSound = pInfo->maSoundFile;
+ nSoundFileSet = ATTR_SET;
+
+ bPlayFull = pInfo->mbPlayFull;
+ nPlayFullSet = ATTR_SET;
+
+ eClickAction = pInfo->meClickAction;
+ nClickActionSet = ATTR_SET;
+
+ aBookmark = pInfo->GetBookmark();
+ nBookmarkSet = ATTR_SET;
+
+ eSecondEffect = pInfo->meSecondEffect;
+ nSecondEffectSet = ATTR_SET;
+
+ eSecondSpeed = pInfo->meSecondSpeed;
+ nSecondSpeedSet = ATTR_SET;
+
+ bSecondSoundOn = pInfo->mbSecondSoundOn;
+ nSecondSoundOnSet = ATTR_SET;
+
+ bSecondPlayFull = pInfo->mbSecondPlayFull;
+ nSecondPlayFullSet = ATTR_SET;
+ }
+
+ // if necessary, inspect more objects
+ for( size_t nObject = 1; nObject < nCount; ++nObject )
+ {
+ pMark = rMarkList.GetMark( nObject );
+ SdrObject* pObject = pMark->GetMarkedSdrObj();
+ pInfo = SdDrawDocument::GetAnimationInfo(pObject);
+ if( pInfo )
+ {
+ if( bActive != pInfo->mbActive )
+ nAnimationSet = ATTR_MIXED;
+
+ if( eEffect != pInfo->meEffect )
+ nEffectSet = ATTR_MIXED;
+
+ if( eTextEffect != pInfo->meTextEffect )
+ nTextEffectSet = ATTR_MIXED;
+
+ if( eSpeed != pInfo->meSpeed )
+ nSpeedSet = ATTR_MIXED;
+
+ if( bFadeOut != pInfo->mbDimPrevious )
+ nFadeOutSet = ATTR_MIXED;
+
+ if( aFadeColor != pInfo->maDimColor )
+ nFadeColorSet = ATTR_MIXED;
+
+ if( bInvisible != pInfo->mbDimHide )
+ nInvisibleSet = ATTR_MIXED;
+
+ if( bSoundOn != pInfo->mbSoundOn )
+ nSoundOnSet = ATTR_MIXED;
+
+ if( aSound != pInfo->maSoundFile )
+ nSoundFileSet = ATTR_MIXED;
+
+ if( bPlayFull != pInfo->mbPlayFull )
+ nPlayFullSet = ATTR_MIXED;
+
+ if( eClickAction != pInfo->meClickAction )
+ nClickActionSet = ATTR_MIXED;
+
+ if( aBookmark != pInfo->GetBookmark() )
+ nBookmarkSet = ATTR_MIXED;
+
+ if( eSecondEffect != pInfo->meSecondEffect )
+ nSecondEffectSet = ATTR_MIXED;
+
+ if( eSecondSpeed != pInfo->meSecondSpeed )
+ nSecondSpeedSet = ATTR_MIXED;
+
+ if( bSecondSoundOn != pInfo->mbSecondSoundOn )
+ nSecondSoundOnSet = ATTR_MIXED;
+
+ if( bSecondPlayFull != pInfo->mbSecondPlayFull )
+ nSecondPlayFullSet = ATTR_MIXED;
+ }
+ else
+ {
+ if (nAnimationSet == ATTR_SET && bActive)
+ nAnimationSet = ATTR_MIXED;
+
+ if (nEffectSet == ATTR_SET && eEffect != presentation::AnimationEffect_NONE)
+ nEffectSet = ATTR_MIXED;
+
+ if (nTextEffectSet == ATTR_SET && eTextEffect != presentation::AnimationEffect_NONE)
+ nTextEffectSet = ATTR_MIXED;
+
+ if (nSpeedSet == ATTR_SET)
+ nSpeedSet = ATTR_MIXED;
+
+ if (nFadeOutSet == ATTR_SET && bFadeOut)
+ nFadeOutSet = ATTR_MIXED;
+
+ if (nFadeColorSet == ATTR_SET)
+ nFadeColorSet = ATTR_MIXED;
+
+ if (nInvisibleSet == ATTR_SET && bInvisible)
+ nInvisibleSet = ATTR_MIXED;
+
+ if (nSoundOnSet == ATTR_SET && bSoundOn)
+ nSoundOnSet = ATTR_MIXED;
+
+ if (nSoundFileSet == ATTR_SET)
+ nSoundFileSet = ATTR_MIXED;
+
+ if (nPlayFullSet == ATTR_SET && bPlayFull)
+ nPlayFullSet = ATTR_MIXED;
+
+ if (nClickActionSet == ATTR_SET && eClickAction != presentation::ClickAction_NONE)
+ nClickActionSet = ATTR_MIXED;
+
+ if (nBookmarkSet == ATTR_SET)
+ nBookmarkSet = ATTR_MIXED;
+
+ if (nSecondEffectSet == ATTR_SET && eSecondEffect != presentation::AnimationEffect_NONE)
+ nSecondEffectSet = ATTR_MIXED;
+
+ if (nSecondSpeedSet == ATTR_SET)
+ nSecondSpeedSet = ATTR_MIXED;
+
+ if (nSecondSoundOnSet == ATTR_SET && bSecondSoundOn)
+ nSecondSoundOnSet = ATTR_MIXED;
+
+ if (nSecondPlayFullSet == ATTR_SET && bSecondPlayFull)
+ nSecondPlayFullSet = ATTR_MIXED;
+ }
+ }
+
+ /* Exactly two objects with path effect?
+ Then, only the animation info at the moved object is valid. */
+ if (nCount == 2)
+ {
+ SdrObject* pObject1 = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ SdrObject* pObject2 = rMarkList.GetMark(1)->GetMarkedSdrObj();
+ SdrObjKind eKind1 = pObject1->GetObjIdentifier();
+ SdrObjKind eKind2 = pObject2->GetObjIdentifier();
+ SdAnimationInfo* pInfo1 = SdDrawDocument::GetAnimationInfo(pObject1);
+ SdAnimationInfo* pInfo2 = SdDrawDocument::GetAnimationInfo(pObject2);
+ pInfo = nullptr;
+
+ if (pObject1->GetObjInventor() == SdrInventor::Default &&
+ ((eKind1 == SdrObjKind::Line) || // 2 point line
+ (eKind1 == SdrObjKind::PolyLine) || // Polygon
+ (eKind1 == SdrObjKind::PathLine)) && // Bezier curve
+ (pInfo2 && pInfo2->meEffect == presentation::AnimationEffect_PATH))
+ {
+ pInfo = pInfo2;
+ }
+
+ if (pObject2->GetObjInventor() == SdrInventor::Default &&
+ ((eKind2 == SdrObjKind::Line) || // 2 point line
+ (eKind2 == SdrObjKind::PolyLine) || // Polygon
+ (eKind2 == SdrObjKind::PathLine)) && // Bezier curve
+ (pInfo1 && pInfo1->meEffect == presentation::AnimationEffect_PATH))
+ {
+ pInfo = pInfo1;
+ }
+
+ if (pInfo)
+ {
+ bActive = pInfo->mbActive; nAnimationSet = ATTR_SET;
+ eEffect = pInfo->meEffect; nEffectSet = ATTR_SET;
+ eTextEffect = pInfo->meTextEffect; nTextEffectSet = ATTR_SET;
+ eSpeed = pInfo->meSpeed; nSpeedSet = ATTR_SET;
+ bFadeOut = pInfo->mbDimPrevious; nFadeOutSet = ATTR_SET;
+ aFadeColor = pInfo->maDimColor; nFadeColorSet = ATTR_SET;
+ bInvisible = pInfo->mbDimHide; nInvisibleSet = ATTR_SET;
+ bSoundOn = pInfo->mbSoundOn; nSoundOnSet = ATTR_SET;
+ aSound = pInfo->maSoundFile; nSoundFileSet = ATTR_SET;
+ bPlayFull = pInfo->mbPlayFull; nPlayFullSet = ATTR_SET;
+ eClickAction = pInfo->meClickAction; nClickActionSet = ATTR_SET;
+ aBookmark = pInfo->GetBookmark(); nBookmarkSet = ATTR_SET;
+ eSecondEffect = pInfo->meSecondEffect; nSecondEffectSet = ATTR_SET;
+ eSecondSpeed = pInfo->meSecondSpeed; nSecondSpeedSet = ATTR_SET;
+ bSecondSoundOn = pInfo->mbSecondSoundOn; nSecondSoundOnSet = ATTR_SET;
+ bSecondPlayFull = pInfo->mbSecondPlayFull; nSecondPlayFullSet = ATTR_SET;
+ }
+ }
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ if(!pArgs)
+ {
+ // fill ItemSet for dialog
+ SfxItemSetFixed<ATTR_ANIMATION_START, ATTR_ACTION_END> aSet(mpDoc->GetPool());
+
+ // fill the set
+ if (nAnimationSet == ATTR_SET)
+ aSet.Put( SfxBoolItem( ATTR_ANIMATION_ACTIVE, bActive));
+ else if (nAnimationSet == ATTR_MIXED)
+ aSet.InvalidateItem(ATTR_ANIMATION_ACTIVE);
+ else
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_ACTIVE, false));
+
+ if (nEffectSet == ATTR_SET)
+ aSet.Put(SfxUInt16Item(ATTR_ANIMATION_EFFECT, static_cast<sal_uInt16>(eEffect)));
+ else if (nEffectSet == ATTR_MIXED)
+ aSet.InvalidateItem( ATTR_ANIMATION_EFFECT );
+ else
+ aSet.Put(SfxUInt16Item(ATTR_ANIMATION_EFFECT, sal_uInt16(presentation::AnimationEffect_NONE)));
+
+ if (nTextEffectSet == ATTR_SET)
+ aSet.Put(SfxUInt16Item(ATTR_ANIMATION_TEXTEFFECT, static_cast<sal_uInt16>(eTextEffect)));
+ else if (nTextEffectSet == ATTR_MIXED)
+ aSet.InvalidateItem( ATTR_ANIMATION_TEXTEFFECT );
+ else
+ aSet.Put(SfxUInt16Item(ATTR_ANIMATION_TEXTEFFECT, sal_uInt16(presentation::AnimationEffect_NONE)));
+
+ if (nSpeedSet == ATTR_SET)
+ aSet.Put(SfxUInt16Item(ATTR_ANIMATION_SPEED, static_cast<sal_uInt16>(eSpeed)));
+ else
+ aSet.InvalidateItem(ATTR_ANIMATION_SPEED);
+
+ if (nFadeOutSet == ATTR_SET)
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_FADEOUT, bFadeOut));
+ else if (nFadeOutSet == ATTR_MIXED)
+ aSet.InvalidateItem(ATTR_ANIMATION_FADEOUT);
+ else
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_FADEOUT, false));
+
+ if (nFadeColorSet == ATTR_SET)
+ aSet.Put(SvxColorItem(aFadeColor, ATTR_ANIMATION_COLOR));
+ else if (nFadeColorSet == ATTR_MIXED)
+ aSet.InvalidateItem(ATTR_ANIMATION_COLOR);
+ else
+ aSet.Put(SvxColorItem(COL_LIGHTGRAY, ATTR_ANIMATION_COLOR));
+
+ if (nInvisibleSet == ATTR_SET)
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_INVISIBLE, bInvisible));
+ else if (nInvisibleSet == ATTR_MIXED)
+ aSet.InvalidateItem(ATTR_ANIMATION_INVISIBLE);
+ else
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_INVISIBLE, false));
+
+ if (nSoundOnSet == ATTR_SET)
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_SOUNDON, bSoundOn));
+ else if (nSoundOnSet == ATTR_MIXED)
+ aSet.InvalidateItem(ATTR_ANIMATION_SOUNDON);
+ else
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_SOUNDON, false));
+
+ if (nSoundFileSet == ATTR_SET)
+ aSet.Put(SfxStringItem(ATTR_ANIMATION_SOUNDFILE, aSound));
+ else
+ aSet.InvalidateItem(ATTR_ANIMATION_SOUNDFILE);
+
+ if (nPlayFullSet == ATTR_SET)
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_PLAYFULL, bPlayFull));
+ else if (nPlayFullSet == ATTR_MIXED)
+ aSet.InvalidateItem(ATTR_ANIMATION_PLAYFULL);
+ else
+ aSet.Put(SfxBoolItem(ATTR_ANIMATION_PLAYFULL, false));
+
+ if (nClickActionSet == ATTR_SET)
+ aSet.Put(SfxUInt16Item(ATTR_ACTION, static_cast<sal_uInt16>(eClickAction)));
+ else if (nClickActionSet == ATTR_MIXED)
+ aSet.InvalidateItem(ATTR_ACTION);
+ else
+ aSet.Put(SfxUInt16Item(ATTR_ACTION, sal_uInt16(presentation::ClickAction_NONE)));
+
+ if (nBookmarkSet == ATTR_SET)
+ aSet.Put(SfxStringItem(ATTR_ACTION_FILENAME, aBookmark));
+ else
+ aSet.InvalidateItem(ATTR_ACTION_FILENAME);
+
+ if (nSecondEffectSet == ATTR_SET)
+ aSet.Put(SfxUInt16Item(ATTR_ACTION_EFFECT, static_cast<sal_uInt16>(eSecondEffect)));
+ else if (nSecondEffectSet == ATTR_MIXED)
+ aSet.InvalidateItem( ATTR_ACTION_EFFECT );
+ else
+ aSet.Put(SfxUInt16Item(ATTR_ACTION_EFFECT, sal_uInt16(presentation::AnimationEffect_NONE)));
+
+ if (nSecondSpeedSet == ATTR_SET)
+ aSet.Put(SfxUInt16Item(ATTR_ACTION_EFFECTSPEED, static_cast<sal_uInt16>(eSecondSpeed)));
+ else
+ aSet.InvalidateItem(ATTR_ACTION_EFFECTSPEED);
+
+ if (nSecondSoundOnSet == ATTR_SET)
+ aSet.Put(SfxBoolItem(ATTR_ACTION_SOUNDON, bSecondSoundOn));
+ else if (nSecondSoundOnSet == ATTR_MIXED)
+ aSet.InvalidateItem(ATTR_ACTION_SOUNDON);
+ else
+ aSet.Put(SfxBoolItem(ATTR_ACTION_SOUNDON, false));
+
+ if (nSecondPlayFullSet == ATTR_SET)
+ aSet.Put(SfxBoolItem(ATTR_ACTION_PLAYFULL, bSecondPlayFull));
+ else if (nSecondPlayFullSet == ATTR_MIXED)
+ aSet.InvalidateItem(ATTR_ACTION_PLAYFULL);
+ else
+ aSet.Put(SfxBoolItem(ATTR_ACTION_PLAYFULL, false));
+
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<SfxAbstractDialog> pDlg( pFact->CreatSdActionDialog(mpViewShell->GetFrameWeld(), &aSet, mpView) );
+
+ short nResult = pDlg->Execute();
+
+ if( nResult != RET_OK )
+ return;
+
+ rReq.Done( *( pDlg->GetOutputItemSet() ) );
+ pArgs = rReq.GetArgs();
+ }
+
+ // evaluation of the ItemSets
+ if (pArgs->GetItemState(ATTR_ANIMATION_ACTIVE) == SfxItemState::SET)
+ {
+ bActive = static_cast<const SfxBoolItem&>(pArgs->Get(ATTR_ANIMATION_ACTIVE)).GetValue();
+ nAnimationSet = ATTR_SET;
+ }
+ else
+ nAnimationSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ANIMATION_EFFECT) == SfxItemState::SET)
+ {
+ eEffect = static_cast<presentation::AnimationEffect>(static_cast<const SfxUInt16Item&>( pArgs->
+ Get(ATTR_ANIMATION_EFFECT)).GetValue());
+ nEffectSet = ATTR_SET;
+ }
+ else
+ nEffectSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ANIMATION_TEXTEFFECT) == SfxItemState::SET)
+ {
+ eTextEffect = static_cast<presentation::AnimationEffect>(static_cast<const SfxUInt16Item&>( pArgs->
+ Get(ATTR_ANIMATION_TEXTEFFECT)).GetValue());
+ nTextEffectSet = ATTR_SET;
+ }
+ else
+ nTextEffectSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ANIMATION_SPEED) == SfxItemState::SET)
+ {
+ eSpeed = static_cast<presentation::AnimationSpeed>(static_cast<const SfxUInt16Item&>( pArgs->
+ Get(ATTR_ANIMATION_SPEED)).GetValue());
+ nSpeedSet = ATTR_SET;
+ }
+ else
+ nSpeedSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ANIMATION_FADEOUT) == SfxItemState::SET)
+ {
+ bFadeOut = static_cast<const SfxBoolItem&>(pArgs->Get(ATTR_ANIMATION_FADEOUT)).GetValue();
+ nFadeOutSet = ATTR_SET;
+ }
+ else
+ nFadeOutSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ANIMATION_INVISIBLE) == SfxItemState::SET)
+ {
+ bInvisible = static_cast<const SfxBoolItem&>(pArgs->Get(ATTR_ANIMATION_INVISIBLE)).GetValue();
+ nInvisibleSet = ATTR_SET;
+ }
+ else
+ nInvisibleSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ANIMATION_SOUNDON) == SfxItemState::SET)
+ {
+ bSoundOn = static_cast<const SfxBoolItem&>(pArgs->Get(ATTR_ANIMATION_SOUNDON)).GetValue();
+ nSoundOnSet = ATTR_SET;
+ }
+ else
+ nSoundOnSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ANIMATION_SOUNDFILE) == SfxItemState::SET)
+ {
+ aSound = static_cast<const SfxStringItem&>(pArgs->Get(ATTR_ANIMATION_SOUNDFILE)).GetValue();
+ nSoundFileSet = ATTR_SET;
+ }
+ else
+ nSoundFileSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ANIMATION_COLOR) == SfxItemState::SET)
+ {
+ aFadeColor = static_cast<const SvxColorItem&>(pArgs->Get(ATTR_ANIMATION_COLOR)).GetValue();
+ nFadeColorSet = ATTR_SET;
+ }
+ else
+ nFadeColorSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ANIMATION_PLAYFULL) == SfxItemState::SET)
+ {
+ bPlayFull = static_cast<const SfxBoolItem&>(pArgs->Get(ATTR_ANIMATION_PLAYFULL)).GetValue();
+ nPlayFullSet = ATTR_SET;
+ }
+ else
+ nPlayFullSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ACTION) == SfxItemState::SET)
+ {
+ eClickAction = static_cast<presentation::ClickAction>(static_cast<const SfxUInt16Item&>(pArgs->
+ Get(ATTR_ACTION)).GetValue());
+ nClickActionSet = ATTR_SET;
+ }
+ else
+ nClickActionSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ACTION_FILENAME) == SfxItemState::SET)
+ {
+ aBookmark = static_cast<const SfxStringItem&>(pArgs->
+ Get(ATTR_ACTION_FILENAME)).GetValue();
+ nBookmarkSet = ATTR_SET;
+ }
+ else
+ nBookmarkSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ACTION_EFFECT) == SfxItemState::SET)
+ {
+ eSecondEffect = static_cast<presentation::AnimationEffect>(static_cast<const SfxUInt16Item&>( pArgs->
+ Get(ATTR_ACTION_EFFECT)).GetValue());
+ nSecondEffectSet = ATTR_SET;
+ }
+ else
+ nSecondEffectSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ACTION_EFFECTSPEED) == SfxItemState::SET)
+ {
+ eSecondSpeed = static_cast<presentation::AnimationSpeed>(static_cast<const SfxUInt16Item&>( pArgs->
+ Get(ATTR_ACTION_EFFECTSPEED)).GetValue());
+ nSecondSpeedSet = ATTR_SET;
+ }
+ else
+ nSecondSpeedSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ACTION_SOUNDON) == SfxItemState::SET)
+ {
+ bSecondSoundOn = static_cast<const SfxBoolItem&>(pArgs->Get(ATTR_ACTION_SOUNDON)).GetValue();
+ nSecondSoundOnSet = ATTR_SET;
+ }
+ else
+ nSecondSoundOnSet = ATTR_MISSING;
+
+ if (pArgs->GetItemState(ATTR_ACTION_PLAYFULL) == SfxItemState::SET)
+ {
+ bSecondPlayFull = static_cast<const SfxBoolItem&>(pArgs->Get(ATTR_ACTION_PLAYFULL)).GetValue();
+ nSecondPlayFullSet = ATTR_SET;
+ }
+ else
+ nSecondPlayFullSet = ATTR_MISSING;
+
+ // if any attribute is chosen
+ if (!(nEffectSet == ATTR_SET ||
+ nTextEffectSet == ATTR_SET ||
+ nSpeedSet == ATTR_SET ||
+ nAnimationSet == ATTR_SET ||
+ nFadeOutSet == ATTR_SET ||
+ nFadeColorSet == ATTR_SET ||
+ nInvisibleSet == ATTR_SET ||
+ nSoundOnSet == ATTR_SET ||
+ nSoundFileSet == ATTR_SET ||
+ nPlayFullSet == ATTR_SET ||
+ nClickActionSet == ATTR_SET ||
+ nBookmarkSet == ATTR_SET ||
+ nSecondEffectSet == ATTR_SET ||
+ nSecondSpeedSet == ATTR_SET ||
+ nSecondSoundOnSet == ATTR_SET ||
+ nSecondPlayFullSet == ATTR_SET))
+ return;
+
+ // String for undo-group and list-action
+ OUString aComment(SdResId(STR_UNDO_ANIMATION));
+
+ // with 'following curves', we have an additional UndoAction
+ // therefore cling? here
+ pUndoMgr->EnterListAction(aComment, aComment, 0, mpViewShell->GetViewShellBase().GetViewShellId());
+
+ // create undo group
+ std::unique_ptr<SdUndoGroup> pUndoGroup(new SdUndoGroup(mpDoc));
+ pUndoGroup->SetComment(aComment);
+
+ // for the path effect, remember some stuff
+ SdrPathObj* pPath = nullptr;
+ if (eEffect == presentation::AnimationEffect_PATH && nEffectSet == ATTR_SET)
+ {
+ DBG_ASSERT(nCount == 2, "This effect expects two selected objects");
+ SdrObject* pObject1 = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ SdrObject* pObject2 = rMarkList.GetMark(1)->GetMarkedSdrObj();
+ SdrObjKind eKind1 = pObject1->GetObjIdentifier();
+ SdrObjKind eKind2 = pObject2->GetObjIdentifier();
+ SdrObject* pRunningObj = nullptr;
+
+ if (pObject1->GetObjInventor() == SdrInventor::Default &&
+ ((eKind1 == SdrObjKind::Line) || // 2 point line
+ (eKind1 == SdrObjKind::PolyLine) || // Polygon
+ (eKind1 == SdrObjKind::PathLine))) // Bezier curve
+ {
+ pPath = static_cast<SdrPathObj*>(pObject1);
+ pRunningObj = pObject2;
+ }
+
+ if (pObject2->GetObjInventor() == SdrInventor::Default &&
+ ((eKind2 == SdrObjKind::Line) || // 2 point line
+ (eKind2 == SdrObjKind::PolyLine) || // Polygon
+ (eKind2 == SdrObjKind::PathLine))) // Bezier curve
+ {
+ pPath = static_cast<SdrPathObj*>(pObject2);
+ pRunningObj = pObject1;
+ }
+
+ assert(pRunningObj && pPath && "no curve found");
+
+ // push the running object to the end of the curve
+ if (pRunningObj)
+ {
+ ::tools::Rectangle aCurRect(pRunningObj->GetLogicRect());
+ Point aCurCenter(aCurRect.Center());
+ const ::basegfx::B2DPolyPolygon& rPolyPolygon = pPath->GetPathPoly();
+ sal_uInt32 nNoOfPolygons(rPolyPolygon.count());
+ const ::basegfx::B2DPolygon& aPolygon(rPolyPolygon.getB2DPolygon(nNoOfPolygons - 1));
+ sal_uInt32 nPoints(aPolygon.count());
+ const ::basegfx::B2DPoint aNewB2DCenter(aPolygon.getB2DPoint(nPoints - 1));
+ const Point aNewCenter(FRound(aNewB2DCenter.getX()), FRound(aNewB2DCenter.getY()));
+ Size aDistance(aNewCenter.X() - aCurCenter.X(), aNewCenter.Y() - aCurCenter.Y());
+ pRunningObj->Move(aDistance);
+
+ pUndoMgr->AddUndoAction(mpDoc->GetSdrUndoFactory().CreateUndoMoveObject( *pRunningObj, aDistance));
+ }
+ }
+
+ for (size_t nObject = 0; nObject < nCount; ++nObject)
+ {
+ SdrObject* pObject = rMarkList.GetMark(nObject)->GetMarkedSdrObj();
+
+ pInfo = SdDrawDocument::GetAnimationInfo(pObject);
+
+ bool bCreated = false;
+ if( !pInfo )
+ {
+ pInfo = SdDrawDocument::GetShapeUserData(*pObject,true);
+ bCreated = true;
+ }
+
+ // path object for 'following curves'?
+ if (eEffect == presentation::AnimationEffect_PATH && pObject == pPath)
+ {
+ SdAnimationPrmsUndoAction* pAction = new SdAnimationPrmsUndoAction
+ (mpDoc, pObject, bCreated);
+ pAction->SetActive(pInfo->mbActive, pInfo->mbActive);
+ pAction->SetEffect(pInfo->meEffect, pInfo->meEffect);
+ pAction->SetTextEffect(pInfo->meTextEffect, pInfo->meTextEffect);
+ pAction->SetSpeed(pInfo->meSpeed, pInfo->meSpeed);
+ pAction->SetDim(pInfo->mbDimPrevious, pInfo->mbDimPrevious);
+ pAction->SetDimColor(pInfo->maDimColor, pInfo->maDimColor);
+ pAction->SetDimHide(pInfo->mbDimHide, pInfo->mbDimHide);
+ pAction->SetSoundOn(pInfo->mbSoundOn, pInfo->mbSoundOn);
+ pAction->SetSound(pInfo->maSoundFile, pInfo->maSoundFile);
+ pAction->SetPlayFull(pInfo->mbPlayFull, pInfo->mbPlayFull);
+ pAction->SetClickAction(pInfo->meClickAction, pInfo->meClickAction);
+ pAction->SetBookmark(pInfo->GetBookmark(), pInfo->GetBookmark());
+ pAction->SetVerb(pInfo->mnVerb, pInfo->mnVerb);
+ pAction->SetSecondEffect(pInfo->meSecondEffect, pInfo->meSecondEffect);
+ pAction->SetSecondSpeed(pInfo->meSecondSpeed, pInfo->meSecondSpeed);
+ pAction->SetSecondSoundOn(pInfo->mbSecondSoundOn, pInfo->mbSecondSoundOn);
+ pAction->SetSecondPlayFull(pInfo->mbSecondPlayFull, pInfo->mbSecondPlayFull);
+ pUndoGroup->AddAction(pAction);
+
+ }
+ else
+ {
+
+ // create undo action with old and new sizes
+ SdAnimationPrmsUndoAction* pAction = new SdAnimationPrmsUndoAction
+ (mpDoc, pObject, bCreated);
+ pAction->SetActive(pInfo->mbActive, bActive);
+ pAction->SetEffect(pInfo->meEffect, eEffect);
+ pAction->SetTextEffect(pInfo->meTextEffect, eTextEffect);
+ pAction->SetSpeed(pInfo->meSpeed, eSpeed);
+ pAction->SetDim(pInfo->mbDimPrevious, bFadeOut);
+ pAction->SetDimColor(pInfo->maDimColor, aFadeColor);
+ pAction->SetDimHide(pInfo->mbDimHide, bInvisible);
+ pAction->SetSoundOn(pInfo->mbSoundOn, bSoundOn);
+ pAction->SetSound(pInfo->maSoundFile, aSound);
+ pAction->SetPlayFull(pInfo->mbPlayFull, bPlayFull);
+ pAction->SetClickAction(pInfo->meClickAction, eClickAction);
+ pAction->SetBookmark(pInfo->GetBookmark(), aBookmark);
+ pAction->SetVerb(pInfo->mnVerb, static_cast<sal_uInt16>(pInfo->GetBookmark().toInt32()) );
+ pAction->SetSecondEffect(pInfo->meSecondEffect, eSecondEffect);
+ pAction->SetSecondSpeed(pInfo->meSecondSpeed, eSecondSpeed);
+ pAction->SetSecondSoundOn(pInfo->mbSecondSoundOn, bSecondSoundOn);
+ pAction->SetSecondPlayFull(pInfo->mbSecondPlayFull,bSecondPlayFull);
+ pUndoGroup->AddAction(pAction);
+
+ // insert new values at info block of the object
+ if (nAnimationSet == ATTR_SET)
+ pInfo->mbActive = bActive;
+
+ if (nEffectSet == ATTR_SET)
+ pInfo->meEffect = eEffect;
+
+ if (nTextEffectSet == ATTR_SET)
+ pInfo->meTextEffect = eTextEffect;
+
+ if (nSpeedSet == ATTR_SET)
+ pInfo->meSpeed = eSpeed;
+
+ if (nFadeOutSet == ATTR_SET)
+ pInfo->mbDimPrevious = bFadeOut;
+
+ if (nFadeColorSet == ATTR_SET)
+ pInfo->maDimColor = aFadeColor;
+
+ if (nInvisibleSet == ATTR_SET)
+ pInfo->mbDimHide = bInvisible;
+
+ if (nSoundOnSet == ATTR_SET)
+ pInfo->mbSoundOn = bSoundOn;
+
+ if (nSoundFileSet == ATTR_SET)
+ pInfo->maSoundFile = aSound;
+
+ if (nPlayFullSet == ATTR_SET)
+ pInfo->mbPlayFull = bPlayFull;
+
+ if (nClickActionSet == ATTR_SET)
+ pInfo->meClickAction = eClickAction;
+
+ if (nBookmarkSet == ATTR_SET)
+ pInfo->SetBookmark( aBookmark );
+
+ if (nSecondEffectSet == ATTR_SET)
+ pInfo->meSecondEffect = eSecondEffect;
+
+ if (nSecondSpeedSet == ATTR_SET)
+ pInfo->meSecondSpeed = eSecondSpeed;
+
+ if (nSecondSoundOnSet == ATTR_SET)
+ pInfo->mbSecondSoundOn = bSecondSoundOn;
+
+ if (nSecondPlayFullSet == ATTR_SET)
+ pInfo->mbSecondPlayFull = bSecondPlayFull;
+
+ if (eClickAction == presentation::ClickAction_VERB)
+ pInfo->mnVerb = static_cast<sal_uInt16>(aBookmark.toInt32());
+ }
+ }
+ // Set the Undo Group in of the Undo Manager
+ pUndoMgr->AddUndoAction(std::move(pUndoGroup));
+ pUndoMgr->LeaveListAction();
+
+ // Model changed
+ mpDoc->SetChanged();
+ // not seen, therefore we do not need to invalidate at the bindings
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuolbull.cxx b/sd/source/ui/func/fuolbull.cxx
new file mode 100644
index 000000000..beb57db5b
--- /dev/null
+++ b/sd/source/ui/func/fuolbull.cxx
@@ -0,0 +1,340 @@
+/* -*- 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 <fuolbull.hxx>
+#include <svl/intitem.hxx>
+#include <svl/stritem.hxx>
+#include <editeng/outliner.hxx>
+#include <editeng/eeitem.hxx>
+#include <sfx2/request.hxx>
+#include <editeng/numitem.hxx>
+#include <strings.hxx>
+
+#include <svx/svxids.hrc>
+#include <OutlineView.hxx>
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <Window.hxx>
+#include <drawdoc.hxx>
+#include <sdabstdlg.hxx>
+#include <svx/nbdtmg.hxx>
+#include <svx/nbdtmgfact.hxx>
+#include <svx/svdoutl.hxx>
+#include <memory>
+
+using namespace svx::sidebar;
+namespace sd {
+
+FuBulletAndPosition::FuBulletAndPosition(ViewShell* pViewShell, ::sd::Window* pWindow,
+ ::sd::View* pView, SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewShell, pWindow, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuBulletAndPosition::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuBulletAndPosition( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuBulletAndPosition::DoExecute( SfxRequest& rReq )
+{
+ const sal_uInt16 nSId = rReq.GetSlot();
+ if ( nSId == FN_SVX_SET_BULLET || nSId == FN_SVX_SET_NUMBER )
+ {
+ SetCurrentBulletsNumbering(rReq);
+ return;
+ }
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ const SfxStringItem* pPageItem = SfxItemSet::GetItem<SfxStringItem>(pArgs, FN_PARAM_1, false);
+
+ if ( pArgs && !pPageItem )
+ {
+ /* not direct to pOlView; therefore, SdDrawView::SetAttributes can catch
+ changes to master page and redirect to a template */
+ mpView->SetAttributes(*pArgs);
+ return;
+ }
+
+ // fill ItemSet for Dialog
+ SfxItemSet aEditAttr( mpDoc->GetPool() );
+ mpView->GetAttributes( aEditAttr );
+
+ SfxItemSetFixed<EE_PARA_NUMBULLET, EE_PARA_BULLET> aNewAttr( mpViewShell->GetPool() );
+ aNewAttr.Put( aEditAttr, false );
+
+ auto pView = mpView;
+
+ // create and execute dialog
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractSvxBulletAndPositionDlg> pDlg(pFact->CreateSvxBulletAndPositionDlg(mpViewShell->GetFrameWeld(), &aNewAttr, mpView));
+ sal_uInt16 nResult = pDlg->Execute();
+
+ if( nResult == RET_OK )
+ {
+ OutlinerView* pOLV = pView->GetTextEditOutlinerView();
+
+ std::unique_ptr<OutlineViewModelChangeGuard, o3tl::default_delete<OutlineViewModelChangeGuard>> aGuard;
+
+ if (OutlineView* pOutlineView = dynamic_cast<OutlineView*>(pView))
+ {
+ pOLV = pOutlineView->GetViewByWindow(mpViewShell->GetActiveWindow());
+ aGuard.reset(new OutlineViewModelChangeGuard(*pOutlineView));
+ }
+
+ if( pOLV )
+ pOLV->EnsureNumberingIsOn();
+
+ const SfxItemSet pOutputSet( *pDlg->GetOutputItemSet( &aNewAttr ) );
+ pView->SetAttributes(pOutputSet, /*bReplaceAll=*/false, /*bSlide*/ pDlg->IsSlideScope(), /*bMaster=*/pDlg->IsApplyToMaster());
+ }
+
+ rReq.Done();
+}
+
+void FuBulletAndPosition::SetCurrentBulletsNumbering(SfxRequest& rReq)
+{
+ if (!mpDoc || !mpView)
+ return;
+
+ const sal_uInt16 nSId = rReq.GetSlot();
+ if ( nSId != FN_SVX_SET_BULLET && nSId != FN_SVX_SET_NUMBER )
+ {
+ // unexpected SfxRequest
+ return;
+ }
+
+ const SfxUInt16Item* pItem = rReq.GetArg<SfxUInt16Item>(nSId);
+ if ( !pItem )
+ {
+ rReq.Done();
+ return;
+ }
+
+ SfxItemSetFixed<EE_ITEMS_START, EE_ITEMS_END> aNewAttr( mpViewShell->GetPool() );
+ {
+ SfxItemSet aEditAttr( mpDoc->GetPool() );
+ mpView->GetAttributes( aEditAttr );
+ aNewAttr.Put( aEditAttr, false );
+ }
+
+ const DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >(mpViewShell);
+ //Init bullet level in "Customize" tab page in bullet dialog in master page view
+ const bool bInMasterView = pDrawViewShell && pDrawViewShell->GetEditMode() == EditMode::MasterPage;
+ if ( bInMasterView )
+ {
+ SdrObject* pObj = mpView->GetTextEditObject();
+ if( pObj && pObj->GetObjIdentifier() == SdrObjKind::OutlineText )
+ {
+ const sal_uInt16 nLevel = mpView->GetSelectionLevel();
+ if( nLevel != 0xFFFF )
+ {
+ //save the itemset value
+ SfxItemSet aStoreSet( aNewAttr );
+ aNewAttr.ClearItem();
+ //extend range
+ aNewAttr.MergeRange( SID_PARAM_NUM_PRESET, SID_PARAM_CUR_NUM_LEVEL );
+ aNewAttr.Put( aStoreSet );
+ //put current level user selected
+ aNewAttr.Put( SfxUInt16Item( SID_PARAM_CUR_NUM_LEVEL, nLevel ) );
+ }
+ }
+ }
+
+ sal_uInt16 nIdx = pItem->GetValue();
+ bool bToggle = false;
+ if( nIdx == sal_uInt16(0xFFFF) )
+ {
+ // If the nIdx is (sal_uInt16)0xFFFF, means set bullet status to on/off
+ nIdx = 1;
+ bToggle = true;
+ }
+ nIdx--;
+
+ TypedWhichId<SvxNumBulletItem> nNumItemId = SID_ATTR_NUMBERING_RULE;
+ const SfxPoolItem* pTmpItem = GetNumBulletItem( aNewAttr, nNumItemId );
+ std::unique_ptr<SvxNumRule> pNumRule;
+ if ( pTmpItem )
+ {
+ pNumRule.reset(new SvxNumRule(static_cast<const SvxNumBulletItem*>(pTmpItem)->GetNumRule()));
+
+ // get numbering rule corresponding to <nIdx> and apply the needed number formats to <pNumRule>
+ NBOTypeMgrBase* pNumRuleMgr =
+ NBOutlineTypeMgrFact::CreateInstance(
+ nSId == FN_SVX_SET_BULLET ? NBOType::Bullets : NBOType::Numbering );
+ if ( pNumRuleMgr )
+ {
+ sal_uInt16 nActNumLvl = sal_uInt16(0xFFFF);
+ if(const SfxUInt16Item* pNumLevelItem = aNewAttr.GetItemIfSet(SID_PARAM_CUR_NUM_LEVEL, false))
+ nActNumLvl = pNumLevelItem->GetValue();
+
+ pNumRuleMgr->SetItems(&aNewAttr);
+ SvxNumRule aTmpRule( *pNumRule );
+ if ( nSId == FN_SVX_SET_BULLET && bToggle && nIdx==0 )
+ {
+ // for toggling bullets get default numbering rule
+ pNumRuleMgr->ApplyNumRule( aTmpRule, nIdx, nActNumLvl, true );
+ }
+ else
+ {
+ pNumRuleMgr->ApplyNumRule( aTmpRule, nIdx, nActNumLvl );
+ }
+
+ sal_uInt16 nMask = 1;
+ for(sal_uInt16 i = 0; i < pNumRule->GetLevelCount(); i++)
+ {
+ if(nActNumLvl & nMask)
+ {
+ const SvxNumberFormat& aFmt(aTmpRule.GetLevel(i));
+ pNumRule->SetLevel(i, aFmt);
+ }
+ nMask <<= 1;
+ }
+ }
+ }
+
+ OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
+ std::unique_ptr<OutlineViewModelChangeGuard, o3tl::default_delete<OutlineViewModelChangeGuard>> aGuard;
+ if (OutlineView* pView = dynamic_cast<OutlineView*>(mpView))
+ {
+ pOLV = pView->GetViewByWindow(mpViewShell->GetActiveWindow());
+ aGuard.reset(new OutlineViewModelChangeGuard(*pView));
+ }
+
+ SdrOutliner* pOwner = bInMasterView ? mpView->GetTextEditOutliner() : nullptr;
+ const bool bOutlinerUndoEnabled = pOwner && !pOwner->IsInUndo() && pOwner->IsUndoEnabled();
+ SdrModel* pSdrModel = bInMasterView ? mpView->GetModel() : nullptr;
+ const bool bModelUndoEnabled = pSdrModel && pSdrModel->IsUndoEnabled();
+
+ if ( bOutlinerUndoEnabled )
+ {
+ pOwner->UndoActionStart( OLUNDO_ATTR );
+ }
+ else if ( bModelUndoEnabled )
+ {
+ pSdrModel->BegUndo();
+ }
+
+ if ( pOLV )
+ {
+ pOLV->ToggleBulletsNumbering( bToggle, nSId == FN_SVX_SET_BULLET, bInMasterView ? nullptr : pNumRule.get() );
+ }
+ else
+ {
+ mpView->ChangeMarkedObjectsBulletsNumbering( bToggle, nSId == FN_SVX_SET_BULLET, bInMasterView ? nullptr : pNumRule.get() );
+ }
+
+ if (bInMasterView && pNumRule)
+ {
+ SfxItemSetFixed<EE_ITEMS_START, EE_ITEMS_END> aSetAttr( mpViewShell->GetPool() );
+ aSetAttr.Put(SvxNumBulletItem( *pNumRule, nNumItemId ));
+ mpView->SetAttributes(aSetAttr);
+ }
+
+ if( bOutlinerUndoEnabled )
+ {
+ pOwner->UndoActionEnd();
+ }
+ else if ( bModelUndoEnabled )
+ {
+ pSdrModel->EndUndo();
+ }
+
+ pNumRule.reset();
+ rReq.Done();
+}
+
+const SvxNumBulletItem* FuBulletAndPosition::GetNumBulletItem(SfxItemSet& aNewAttr, TypedWhichId<SvxNumBulletItem>& nNumItemId)
+{
+ const SvxNumBulletItem* pTmpItem = aNewAttr.GetItemIfSet(nNumItemId, false);
+
+ if(pTmpItem)
+ return pTmpItem;
+
+ nNumItemId = aNewAttr.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE);
+ pTmpItem = aNewAttr.GetItemIfSet(nNumItemId, false);
+ if (pTmpItem)
+ return pTmpItem;
+
+ bool bOutliner = false;
+ bool bTitle = false;
+
+ if( mpView )
+ {
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ const size_t nCount = rMarkList.GetMarkCount();
+
+ for(size_t nNum = 0; nNum < nCount; ++nNum)
+ {
+ SdrObject* pObj = rMarkList.GetMark(nNum)->GetMarkedSdrObj();
+ if( pObj->GetObjInventor() == SdrInventor::Default )
+ {
+ switch(pObj->GetObjIdentifier())
+ {
+ case SdrObjKind::TitleText:
+ bTitle = true;
+ break;
+ case SdrObjKind::OutlineText:
+ bOutliner = true;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ const SvxNumBulletItem *pItem = nullptr;
+ if(bOutliner)
+ {
+ SfxStyleSheetBasePool* pSSPool = mpView->GetDocSh()->GetStyleSheetPool();
+ SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( STR_LAYOUT_OUTLINE + " 1", SfxStyleFamily::Pseudo);
+ if( pFirstStyleSheet )
+ pItem = pFirstStyleSheet->GetItemSet().GetItemIfSet(EE_PARA_NUMBULLET, false);
+ }
+
+ if( pItem == nullptr )
+ pItem = aNewAttr.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET);
+
+ //DBG_ASSERT( pItem, "No EE_PARA_NUMBULLET in the Pool!" );
+
+ aNewAttr.Put(pItem->CloneSetWhich(EE_PARA_NUMBULLET));
+
+ if(bTitle && aNewAttr.GetItemState(EE_PARA_NUMBULLET) == SfxItemState::SET )
+ {
+ const SvxNumBulletItem* pBulletItem = aNewAttr.GetItem(EE_PARA_NUMBULLET);
+ const SvxNumRule& rLclRule = pBulletItem->GetNumRule();
+ SvxNumRule aNewRule( rLclRule );
+ aNewRule.SetFeatureFlag( SvxNumRuleFlags::NO_NUMBERS );
+
+ SvxNumBulletItem aNewItem( std::move(aNewRule), EE_PARA_NUMBULLET );
+ aNewAttr.Put(aNewItem);
+ }
+
+ pTmpItem = aNewAttr.GetItemIfSet(nNumItemId, false);
+ return pTmpItem;
+}
+
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuoltext.cxx b/sd/source/ui/func/fuoltext.cxx
new file mode 100644
index 000000000..fe64cac47
--- /dev/null
+++ b/sd/source/ui/func/fuoltext.cxx
@@ -0,0 +1,305 @@
+/* -*- 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 <fuoltext.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <editeng/outliner.hxx>
+#include <editeng/flditem.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/dispatch.hxx>
+#include <tools/debug.hxx>
+#include <svl/stritem.hxx>
+
+#include <svx/svxids.hrc>
+#include <app.hrc>
+#include <OutlineView.hxx>
+#include <Window.hxx>
+#include <DrawDocShell.hxx>
+#include <ViewShell.hxx>
+#include <OutlineViewShell.hxx>
+
+#include <memory>
+
+namespace sd {
+
+const sal_uInt16 SidArray[] = {
+ SID_STYLE_FAMILY2,
+ SID_STYLE_FAMILY3,
+ SID_STYLE_FAMILY5,
+ SID_STYLE_UPDATE_BY_EXAMPLE,
+ SID_CUT,
+ SID_COPY,
+ SID_PASTE,
+ SID_SELECTALL,
+ SID_ATTR_CHAR_FONT,
+ SID_ATTR_CHAR_POSTURE,
+ SID_ATTR_CHAR_WEIGHT,
+ SID_ATTR_CHAR_SHADOWED,
+ SID_ATTR_CHAR_STRIKEOUT,
+ SID_ATTR_CHAR_UNDERLINE,
+ SID_ATTR_CHAR_FONTHEIGHT,
+ SID_ATTR_CHAR_COLOR,
+ SID_ATTR_CHAR_KERNING,
+ SID_OUTLINE_UP,
+ SID_OUTLINE_DOWN,
+ SID_OUTLINE_LEFT,
+ SID_OUTLINE_RIGHT,
+ //SID_OUTLINE_FORMAT,
+ SID_OUTLINE_COLLAPSE_ALL,
+ //SID_OUTLINE_BULLET,
+ SID_OUTLINE_COLLAPSE,
+ SID_OUTLINE_EXPAND_ALL,
+ SID_OUTLINE_EXPAND,
+ SID_SET_SUPER_SCRIPT,
+ SID_SET_SUB_SCRIPT,
+ SID_HYPERLINK_GETLINK,
+ SID_DEC_INDENT,
+ SID_INC_INDENT,
+ SID_PARASPACE_INCREASE,
+ SID_PARASPACE_DECREASE,
+ SID_SCALE,
+ SID_STATUS_PAGE,
+ SID_STATUS_LAYOUT,
+ SID_EXPAND_PAGE,
+ SID_SUMMARY_PAGE,
+ 0 };
+
+
+FuOutlineText::FuOutlineText(ViewShell* pViewShell, ::sd::Window* pWindow,
+ ::sd::View* pView, SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewShell, pWindow, pView, pDoc, rReq),
+ pOutlineViewShell (static_cast<OutlineViewShell*>(pViewShell)),
+ pOutlineView (static_cast<OutlineView*>(pView))
+{
+}
+
+/**
+ * forward to OutlinerView
+ */
+bool FuOutlineText::Command(const CommandEvent& rCEvt)
+{
+ bool bResult = false;
+
+ OutlinerView* pOlView =
+ static_cast<OutlineView*>(mpView)->GetViewByWindow(mpWindow);
+ DBG_ASSERT (pOlView, "no OutlineView found");
+
+ if (pOlView)
+ {
+ pOlView->Command(rCEvt); // unfortunately, we do not get a return value
+ bResult = true;
+ }
+ return bResult;
+}
+
+
+rtl::Reference<FuPoor> FuOutlineText::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuOutlineText( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute( rReq );
+ return xFunc;
+}
+
+bool FuOutlineText::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ mpWindow->GrabFocus();
+
+ bool bReturn = pOutlineView->GetViewByWindow(mpWindow)->MouseButtonDown(rMEvt);
+
+ if (bReturn)
+ {
+ // Now the attributes of the current text position can be different
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray );
+ }
+ else
+ {
+ bReturn = FuPoor::MouseButtonDown(rMEvt);
+ }
+
+ return bReturn;
+}
+
+bool FuOutlineText::MouseMove(const MouseEvent& rMEvt)
+{
+ bool bReturn = pOutlineView->GetViewByWindow(mpWindow)->MouseMove(rMEvt);
+
+ if (!bReturn)
+ {
+ bReturn = FuPoor::MouseMove(rMEvt);
+ }
+
+ return bReturn;
+}
+
+bool FuOutlineText::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ bool bReturn = pOutlineView->GetViewByWindow(mpWindow)->MouseButtonUp(rMEvt);
+
+ if (bReturn)
+ {
+ // Now the attributes of the current text position can be different
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray );
+ }
+ else
+ {
+ const SvxFieldItem* pFieldItem = pOutlineView->GetViewByWindow( mpWindow )->GetFieldUnderMousePointer();
+ if( pFieldItem )
+ {
+ const SvxFieldData* pField = pFieldItem->GetField();
+
+ if( auto pURLField = dynamic_cast< const SvxURLField *>( pField ) )
+ {
+ bReturn = true;
+ mpWindow->ReleaseMouse();
+ SfxStringItem aStrItem( SID_FILE_NAME, pURLField->GetURL() );
+ SfxStringItem aReferer( SID_REFERER, mpDocSh->GetMedium()->GetName() );
+ SfxBoolItem aBrowseItem( SID_BROWSE, true );
+ SfxViewFrame* pFrame = mpViewShell->GetViewFrame();
+
+ if ( rMEvt.IsMod1() )
+ {
+ // open in new frame
+ pFrame->GetDispatcher()->ExecuteList(SID_OPENDOC,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aStrItem, &aBrowseItem, &aReferer });
+ }
+ else
+ {
+ // open in current frame
+ SfxFrameItem aFrameItem( SID_DOCFRAME, pFrame );
+ pFrame->GetDispatcher()->ExecuteList(SID_OPENDOC,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aStrItem, &aFrameItem, &aBrowseItem, &aReferer });
+ }
+ }
+ }
+ }
+
+ if( !bReturn )
+ bReturn = FuPoor::MouseButtonUp(rMEvt);
+
+ return bReturn;
+}
+
+/**
+ * Process keyboard input
+ * @returns sal_True if a KeyEvent is being processed, sal_False otherwise
+ */
+bool FuOutlineText::KeyInput(const KeyEvent& rKEvt)
+{
+ bool bReturn = false;
+
+ sal_uInt16 nKeyGroup = rKEvt.GetKeyCode().GetGroup();
+ if( !mpDocSh->IsReadOnly() || nKeyGroup == KEYGROUP_CURSOR )
+ {
+ mpWindow->GrabFocus();
+
+ std::unique_ptr<OutlineViewModelChangeGuard, o3tl::default_delete<OutlineViewModelChangeGuard>> aGuard;
+ if( (nKeyGroup != KEYGROUP_CURSOR) && (nKeyGroup != KEYGROUP_FKEYS) )
+ aGuard.reset( new OutlineViewModelChangeGuard( *pOutlineView ) );
+
+ bReturn = pOutlineView->GetViewByWindow(mpWindow)->PostKeyEvent(rKEvt);
+
+ if (bReturn)
+ {
+ UpdateForKeyPress (rKEvt);
+ }
+ else
+ {
+ bReturn = FuPoor::KeyInput(rKEvt);
+ }
+ }
+
+ return bReturn;
+}
+
+void FuOutlineText::UpdateForKeyPress (const KeyEvent& rEvent)
+{
+ // Attributes at the current text position may have changed.
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate(SidArray);
+
+ bool bUpdatePreview = true;
+ switch (rEvent.GetKeyCode().GetCode())
+ {
+ // When just the cursor has been moved the preview only changes when
+ // it moved to entries of another page. To prevent unnecessary
+ // updates we check this here. This is an early rejection test, so
+ // missing a key is not a problem.
+ case KEY_UP:
+ case KEY_DOWN:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ case KEY_HOME:
+ case KEY_END:
+ case KEY_PAGEUP:
+ case KEY_PAGEDOWN:
+ {
+ SdPage* pCurrentPage = pOutlineViewShell->GetActualPage();
+ bUpdatePreview = (pCurrentPage != pOutlineViewShell->GetActualPage());
+ }
+ break;
+ }
+ if (bUpdatePreview)
+ pOutlineViewShell->UpdatePreview (pOutlineViewShell->GetActualPage());
+}
+
+/**
+ * Cut object to clipboard
+ */
+void FuOutlineText::DoCut()
+{
+ pOutlineView->GetViewByWindow(mpWindow)->Cut();
+}
+
+/**
+ * Copy object to clipboard
+ */
+void FuOutlineText::DoCopy()
+{
+ pOutlineView->GetViewByWindow(mpWindow)->Copy();
+}
+
+/**
+ * Paste object from clipboard
+ */
+void FuOutlineText::DoPaste()
+{
+ pOutlineView->GetViewByWindow(mpWindow)->PasteSpecial();
+}
+
+/**
+ * Paste object as unformatted text from clipboard
+ */
+void FuOutlineText::DoPasteUnformatted()
+{
+ TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( mpViewShell->GetActiveWindow() ) );
+ if (aDataHelper.GetTransferable().is())
+ {
+ OUString aText;
+ if (aDataHelper.GetString(SotClipboardFormatId::STRING, aText))
+ pOutlineView->GetViewByWindow(mpWindow)->InsertText(aText);
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fupage.cxx b/sd/source/ui/func/fupage.cxx
new file mode 100644
index 000000000..5427e6b7d
--- /dev/null
+++ b/sd/source/ui/func/fupage.cxx
@@ -0,0 +1,648 @@
+/* -*- 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 <fupage.hxx>
+
+// arrange Tab-Page
+
+#include <sfx2/sfxdlg.hxx>
+#include <svx/pageitem.hxx>
+#include <svx/svxids.hrc>
+#include <svl/itempool.hxx>
+#include <svl/grabbagitem.hxx>
+#include <sfx2/request.hxx>
+#include <vcl/prntypes.hxx>
+#include <vcl/graphicfilter.hxx>
+#include <stlsheet.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/frmdiritem.hxx>
+#include <svx/graphichelper.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xbtmpit.hxx>
+#include <svx/xflbstit.hxx>
+#include <svx/xflbmtit.hxx>
+#include <svx/xflgrit.hxx>
+#include <svx/xflhtit.hxx>
+#include <editeng/ulspitem.hxx>
+#include <editeng/lrspitem.hxx>
+#include <svx/sdr/properties/properties.hxx>
+#include <editeng/shaditem.hxx>
+#include <editeng/boxitem.hxx>
+#include <editeng/sizeitem.hxx>
+#include <editeng/pbinitem.hxx>
+#include <sfx2/opengrf.hxx>
+#include <sal/log.hxx>
+
+#include <strings.hrc>
+#include <sdpage.hxx>
+#include <View.hxx>
+#include <Window.hxx>
+#include <pres.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <ViewShell.hxx>
+#include <DrawViewShell.hxx>
+#include <app.hrc>
+#include <unchss.hxx>
+#include <undoback.hxx>
+#include <sdabstdlg.hxx>
+#include <sdresid.hxx>
+
+#include <memory>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+// 50 cm 28350
+// adapted from writer
+#define MAXHEIGHT 28350
+#define MAXWIDTH 28350
+
+
+static void mergeItemSetsImpl( SfxItemSet& rTarget, const SfxItemSet& rSource )
+{
+ const WhichRangesContainer& rRanges = rSource.GetRanges();
+ sal_uInt16 p1, p2;
+ for (sal_Int32 i = 0; i < rRanges.size(); ++i)
+ {
+ p1 = rRanges[i].first;
+ p2 = rRanges[i].second;
+
+ // make ranges discrete
+ while(i < rRanges.size()-1 && (rRanges[i+1].first - p2 == 1))
+ {
+ p2 = rRanges[i+1].second;
+ ++i;
+ }
+ rTarget.MergeRange( p1, p2 );
+ }
+
+ rTarget.Put(rSource);
+}
+
+FuPage::FuPage( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView,
+ SdDrawDocument* pDoc, SfxRequest& rReq )
+: FuPoor(pViewSh, pWin, pView, pDoc, rReq),
+ mrReq(rReq),
+ mpArgs( rReq.GetArgs() ),
+ mbPageBckgrdDeleted( false ),
+ mbMasterPage( false ),
+ mbDisplayBackgroundTabPage( true ),
+ mpPage(nullptr),
+ mpDrawViewShell(nullptr)
+{
+}
+
+rtl::Reference<FuPoor> FuPage::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuPage( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuPage::DoExecute(SfxRequest& rReq)
+{
+ mpDrawViewShell = dynamic_cast<DrawViewShell*>(mpViewShell);
+ DBG_ASSERT( mpDrawViewShell, "sd::FuPage::FuPage(), called without a current DrawViewShell!" );
+
+ if( mpDrawViewShell )
+ {
+ mbMasterPage = mpDrawViewShell->GetEditMode() == EditMode::MasterPage;
+ // we don't really want to format page background with SID_ATTR_PAGE[_SIZE] slots
+ mbDisplayBackgroundTabPage = ( mpDrawViewShell->GetPageKind() == PageKind::Standard) &&
+ ( nSlotId != SID_ATTR_PAGE_SIZE) && ( nSlotId != SID_ATTR_PAGE );
+ mpPage = mpDrawViewShell->getCurrentPage();
+ }
+
+ if( !mpPage )
+ return;
+
+ // if there are no arguments given, open the dialog
+ if (!mpArgs || mpArgs->GetItemState(SID_SELECT_BACKGROUND) == SfxItemState::SET)
+ {
+ mpView->SdrEndTextEdit();
+ mpArgs = ExecuteDialog(mpWindow ? mpWindow->GetFrameWeld() : nullptr, rReq);
+ }
+
+ // if we now have arguments, apply them to current page
+ if( mpArgs )
+ {
+ ApplyItemSet( mpArgs );
+ }
+}
+
+FuPage::~FuPage()
+{
+}
+
+void FuPage::Activate()
+{
+}
+
+void FuPage::Deactivate()
+{
+}
+
+void MergePageBackgroundFilling(SdPage *pPage, SdStyleSheet *pStyleSheet, bool bMasterPage, SfxItemSet& rMergedAttr)
+{
+ if (bMasterPage)
+ {
+ if (pStyleSheet)
+ mergeItemSetsImpl(rMergedAttr, pStyleSheet->GetItemSet());
+ }
+ else
+ {
+ // Only this page, get attributes for background fill
+ const SfxItemSet& rBackgroundAttributes = pPage->getSdrPageProperties().GetItemSet();
+
+ if(drawing::FillStyle_NONE != rBackgroundAttributes.Get(XATTR_FILLSTYLE).GetValue())
+ {
+ // page attributes are used, take them
+ rMergedAttr.Put(rBackgroundAttributes);
+ }
+ else
+ {
+ if(pStyleSheet
+ && drawing::FillStyle_NONE != pStyleSheet->GetItemSet().Get(XATTR_FILLSTYLE).GetValue())
+ {
+ // if the page has no fill style, use the settings from the
+ // background stylesheet (if used)
+ mergeItemSetsImpl(rMergedAttr, pStyleSheet->GetItemSet());
+ }
+ else
+ {
+ // no fill style from page, start with no fill style
+ rMergedAttr.Put(XFillStyleItem(drawing::FillStyle_NONE));
+ }
+ }
+ }
+}
+
+const SfxItemSet* FuPage::ExecuteDialog(weld::Window* pParent, const SfxRequest& rReq)
+{
+ if (!mpDrawViewShell)
+ return nullptr;
+
+ SfxItemSetFixed<
+ XATTR_FILL_FIRST, XATTR_FILL_LAST,
+ EE_PARA_WRITINGDIR, EE_PARA_WRITINGDIR,
+ SID_ATTR_BORDER_OUTER, SID_ATTR_BORDER_OUTER,
+ SID_ATTR_BORDER_SHADOW, SID_ATTR_BORDER_SHADOW,
+ SID_ATTR_PAGE, SID_ATTR_PAGE_SHARED,
+ SID_ATTR_CHAR_GRABBAG, SID_ATTR_CHAR_GRABBAG,
+ SID_ATTR_PAGE_COLOR, SID_ATTR_PAGE_FILLSTYLE
+ > aNewAttr(mpDoc->GetPool());
+ // Keep it sorted
+ aNewAttr.MergeRange(mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE),
+ mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE));
+
+ // Retrieve additional data for dialog
+
+ SvxShadowItem aShadowItem(SID_ATTR_BORDER_SHADOW);
+ aNewAttr.Put( aShadowItem );
+ SvxBoxItem aBoxItem( SID_ATTR_BORDER_OUTER );
+ aNewAttr.Put( aBoxItem );
+
+ aNewAttr.Put( SvxFrameDirectionItem(
+ mpDoc->GetDefaultWritingMode() == css::text::WritingMode_RL_TB ? SvxFrameDirection::Horizontal_RL_TB : SvxFrameDirection::Horizontal_LR_TB,
+ EE_PARA_WRITINGDIR ) );
+
+ // Retrieve page-data for dialog
+
+ SvxPageItem aPageItem( SID_ATTR_PAGE );
+ aPageItem.SetDescName( mpPage->GetName() );
+ aPageItem.SetPageUsage( SvxPageUsage::All );
+ aPageItem.SetLandscape( mpPage->GetOrientation() == Orientation::Landscape );
+ aPageItem.SetNumType( mpDoc->GetPageNumType() );
+ aNewAttr.Put( aPageItem );
+
+ // size
+ maSize = mpPage->GetSize();
+ SvxSizeItem aSizeItem( SID_ATTR_PAGE_SIZE, maSize );
+ aNewAttr.Put( aSizeItem );
+
+ // Max size
+ SvxSizeItem aMaxSizeItem( SID_ATTR_PAGE_MAXSIZE, Size( MAXWIDTH, MAXHEIGHT ) );
+ aNewAttr.Put( aMaxSizeItem );
+
+ // paperbin
+ SvxPaperBinItem aPaperBinItem( SID_ATTR_PAGE_PAPERBIN, static_cast<sal_uInt8>(mpPage->GetPaperBin()) );
+ aNewAttr.Put( aPaperBinItem );
+
+ SvxLRSpaceItem aLRSpaceItem( static_cast<sal_uInt16>(mpPage->GetLeftBorder()), static_cast<sal_uInt16>(mpPage->GetRightBorder()), 0, 0, mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE));
+ aNewAttr.Put( aLRSpaceItem );
+
+ SvxULSpaceItem aULSpaceItem( static_cast<sal_uInt16>(mpPage->GetUpperBorder()), static_cast<sal_uInt16>(mpPage->GetLowerBorder()), mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE));
+ aNewAttr.Put( aULSpaceItem );
+
+ // Application
+ bool bScale = mpDoc->GetDocumentType() != DocumentType::Draw;
+ aNewAttr.Put( SfxBoolItem( SID_ATTR_PAGE_EXT1, bScale ) );
+
+ bool bFullSize = mpPage->IsMasterPage() ?
+ mpPage->IsBackgroundFullSize() : static_cast<SdPage&>(mpPage->TRG_GetMasterPage()).IsBackgroundFullSize();
+
+ SfxGrabBagItem grabBag(SID_ATTR_CHAR_GRABBAG);
+ grabBag.GetGrabBag()["BackgroundFullSize"] <<= bFullSize;
+
+ if (mpDoc->GetDocumentType() == DocumentType::Impress && mpPage->IsMasterPage())
+ {
+ // A master slide may have a theme.
+ svx::Theme* pTheme = mpPage->getSdrPageProperties().GetTheme();
+ if (pTheme)
+ {
+ uno::Any aTheme;
+ pTheme->ToAny(aTheme);
+ grabBag.GetGrabBag()["Theme"] = aTheme;
+ }
+ }
+
+ aNewAttr.Put(grabBag);
+
+ // Merge ItemSet for dialog
+
+ const WhichRangesContainer& rRanges = aNewAttr.GetRanges();
+ sal_uInt16 p1 = rRanges[0].first, p2 = rRanges[0].second;
+ sal_Int32 idx = 1;
+ while(idx < rRanges.size() && (rRanges[idx].first - p2 == 1))
+ {
+ p2 = rRanges[idx].second;
+ ++idx;
+ }
+ SfxItemSet aMergedAttr( *aNewAttr.GetPool(), p1, p2 );
+
+ mergeItemSetsImpl( aMergedAttr, aNewAttr );
+
+ SdStyleSheet* pStyleSheet = mpPage->getPresentationStyle(HID_PSEUDOSHEET_BACKGROUND);
+
+ // merge page background filling to the dialogs input set
+ if( mbDisplayBackgroundTabPage )
+ {
+ MergePageBackgroundFilling(mpPage, pStyleSheet, mbMasterPage, aMergedAttr);
+ }
+
+ std::optional< SfxItemSet > pTempSet;
+
+ const sal_uInt16 nId = GetSlotID();
+ if (nId == SID_SAVE_BACKGROUND)
+ {
+ const XFillStyleItem& rStyleItem = aMergedAttr.Get(XATTR_FILLSTYLE);
+ if (drawing::FillStyle_BITMAP == rStyleItem.GetValue())
+ {
+ const XFillBitmapItem& rBitmap = aMergedAttr.Get(XATTR_FILLBITMAP);
+ const GraphicObject& rGraphicObj = rBitmap.GetGraphicObject();
+ GraphicHelper::ExportGraphic(pParent, rGraphicObj.GetGraphic(), "");
+ }
+ }
+ else if (nId == SID_SELECT_BACKGROUND)
+ {
+ Graphic aGraphic;
+ ErrCode nError = ERRCODE_GRFILTER_OPENERROR;
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ const SfxPoolItem* pItem;
+
+ if (pArgs && pArgs->GetItemState(SID_SELECT_BACKGROUND, true, &pItem) == SfxItemState::SET)
+ {
+ OUString aFileName(static_cast<const SfxStringItem*>(pItem)->GetValue());
+ OUString aFilterName;
+
+ if (const SfxStringItem* pFilterItem = pArgs->GetItemIfSet(FN_PARAM_FILTER))
+ aFilterName = pFilterItem->GetValue();
+
+ nError = GraphicFilter::LoadGraphic(aFileName, aFilterName, aGraphic,
+ &GraphicFilter::GetGraphicFilter());
+ }
+ else
+ {
+ SvxOpenGraphicDialog aDlg(SdResId(STR_SET_BACKGROUND_PICTURE), pParent);
+
+ nError = aDlg.Execute();
+ if (nError == ERRCODE_NONE)
+ {
+ nError = aDlg.GetGraphic(aGraphic);
+ }
+ }
+
+ if (nError == ERRCODE_NONE)
+ {
+ pTempSet.emplace( mpDoc->GetPool(), svl::Items<XATTR_FILL_FIRST, XATTR_FILL_LAST> );
+
+ pTempSet->Put( XFillStyleItem( drawing::FillStyle_BITMAP ) );
+
+ // MigrateItemSet makes sure the XFillBitmapItem will have a unique name
+ SfxItemSetFixed<XATTR_FILLBITMAP, XATTR_FILLBITMAP> aMigrateSet( mpDoc->GetPool() );
+ aMigrateSet.Put(XFillBitmapItem("background", aGraphic));
+ SdrModel::MigrateItemSet( &aMigrateSet, &*pTempSet, mpDoc );
+
+ pTempSet->Put( XFillBmpStretchItem( true ));
+ pTempSet->Put( XFillBmpTileItem( false ));
+ }
+ }
+
+ else
+ {
+ bool bIsImpressDoc = mpDrawViewShell->GetDoc()->GetDocumentType() == DocumentType::Impress;
+
+ // create the dialog
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<SfxAbstractTabDialog> pDlg( pFact->CreateSdTabPageDialog(mpViewShell->GetFrameWeld(), &aMergedAttr, mpDocSh, mbDisplayBackgroundTabPage, bIsImpressDoc, mbMasterPage) );
+ if( pDlg->Execute() == RET_OK )
+ pTempSet.emplace( *pDlg->GetOutputItemSet() );
+ }
+
+ if (pTempSet && pStyleSheet)
+ {
+ pStyleSheet->AdjustToFontHeight(*pTempSet);
+
+ if( mbDisplayBackgroundTabPage )
+ {
+ // if some fillstyle-items are not set in the dialog, then
+ // try to use the items before
+ bool bChanges = false;
+ for( sal_uInt16 i=XATTR_FILL_FIRST; i<XATTR_FILL_LAST; i++ )
+ {
+ if( aMergedAttr.GetItemState( i ) != SfxItemState::DEFAULT )
+ {
+ if( pTempSet->GetItemState( i ) == SfxItemState::DEFAULT )
+ pTempSet->Put( aMergedAttr.Get( i ) );
+ else
+ if( aMergedAttr.GetItem( i ) != pTempSet->GetItem( i ) )
+ bChanges = true;
+ }
+ }
+
+ // if the background for this page was set to invisible, the background-object has to be deleted, too.
+ const XFillStyleItem* pTempFillStyleItem = pTempSet->GetItem<XFillStyleItem>(XATTR_FILLSTYLE);
+ assert(pTempFillStyleItem);
+ if (pTempFillStyleItem->GetValue() == drawing::FillStyle_NONE)
+ mbPageBckgrdDeleted = true;
+ else
+ {
+ if (pTempSet->GetItemState(XATTR_FILLSTYLE) == SfxItemState::DEFAULT)
+ {
+ const XFillStyleItem* pMergedFillStyleItem = aMergedAttr.GetItem<XFillStyleItem>(XATTR_FILLSTYLE);
+ assert(pMergedFillStyleItem);
+ if (pMergedFillStyleItem->GetValue() == drawing::FillStyle_NONE)
+ mbPageBckgrdDeleted = true;
+ }
+ }
+
+ const XFillGradientItem* pTempGradItem = pTempSet->GetItem<XFillGradientItem>(XATTR_FILLGRADIENT);
+ if (pTempGradItem && pTempGradItem->GetName().isEmpty())
+ {
+ // MigrateItemSet guarantees unique gradient names
+ SfxItemSetFixed<XATTR_FILLGRADIENT, XATTR_FILLGRADIENT> aMigrateSet( mpDoc->GetPool() );
+ aMigrateSet.Put( XFillGradientItem("gradient", pTempGradItem->GetGradientValue()) );
+ SdrModel::MigrateItemSet( &aMigrateSet, &*pTempSet, mpDoc);
+ }
+
+ const XFillHatchItem* pTempHatchItem = pTempSet->GetItem<XFillHatchItem>(XATTR_FILLHATCH);
+ if (pTempHatchItem && pTempHatchItem->GetName().isEmpty())
+ {
+ // MigrateItemSet guarantees unique hatch names
+ SfxItemSetFixed<XATTR_FILLHATCH, XATTR_FILLHATCH> aMigrateSet( mpDoc->GetPool() );
+ aMigrateSet.Put( XFillHatchItem("hatch", pTempHatchItem->GetHatchValue()) );
+ SdrModel::MigrateItemSet( &aMigrateSet, &*pTempSet, mpDoc);
+ }
+
+ if( !mbMasterPage && bChanges && mbPageBckgrdDeleted )
+ {
+ mpBackgroundObjUndoAction.reset( new SdBackgroundObjUndoAction(
+ *mpDoc, *mpPage, mpPage->getSdrPageProperties().GetItemSet()) );
+
+ if(!mpPage->IsMasterPage())
+ {
+ // on normal pages, switch off fill attribute usage
+ SdrPageProperties& rPageProperties = mpPage->getSdrPageProperties();
+ rPageProperties.ClearItem( XATTR_FILLBITMAP );
+ rPageProperties.ClearItem( XATTR_FILLGRADIENT );
+ rPageProperties.ClearItem( XATTR_FILLHATCH );
+ rPageProperties.PutItem(XFillStyleItem(drawing::FillStyle_NONE));
+ }
+ }
+
+
+ /* Special treatment: reset the INVALIDS to
+ NULL-Pointer (otherwise INVALIDs or pointer point
+ to DefaultItems in the template; both would
+ prevent the attribute inheritance) */
+ pTempSet->ClearInvalidItems();
+
+ if( mbMasterPage )
+ {
+ mpDocSh->GetUndoManager()->AddUndoAction(std::make_unique<StyleSheetUndoAction>(
+ mpDoc, static_cast<SfxStyleSheet*>(pStyleSheet), &(*pTempSet)));
+ pStyleSheet->GetItemSet().Put( *pTempSet );
+ sdr::properties::CleanupFillProperties( pStyleSheet->GetItemSet() );
+ pStyleSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+ }
+
+ // if background filling is set to master pages then clear from page set
+ if( mbMasterPage )
+ {
+ for( sal_uInt16 nWhich = XATTR_FILL_FIRST; nWhich <= XATTR_FILL_LAST; nWhich++ )
+ {
+ pTempSet->ClearItem( nWhich );
+ }
+ pTempSet->Put(XFillStyleItem(drawing::FillStyle_NONE));
+ }
+
+ if( const SvxFrameDirectionItem* pItem = pTempSet->GetItemIfSet( EE_PARA_WRITINGDIR, false ) )
+ {
+ SvxFrameDirection nVal = pItem->GetValue();
+ mpDoc->SetDefaultWritingMode( nVal == SvxFrameDirection::Horizontal_RL_TB ? css::text::WritingMode_RL_TB : css::text::WritingMode_LR_TB );
+ }
+
+ mpDoc->SetChanged();
+
+ // BackgroundFill of Masterpage: no hard attributes allowed
+ SdrPage& rUsedMasterPage = mpPage->IsMasterPage() ? *mpPage : mpPage->TRG_GetMasterPage();
+ OSL_ENSURE(rUsedMasterPage.IsMasterPage(), "No MasterPage (!)");
+ rUsedMasterPage.getSdrPageProperties().ClearItem();
+ OSL_ENSURE(nullptr != rUsedMasterPage.getSdrPageProperties().GetStyleSheet(),
+ "MasterPage without StyleSheet detected (!)");
+ }
+
+ aNewAttr.Put(*pTempSet);
+ mrReq.Done( aNewAttr );
+
+ return mrReq.GetArgs();
+ }
+ else
+ {
+ return nullptr;
+ }
+}
+
+void FuPage::ApplyItemSet( const SfxItemSet* pArgs )
+{
+ if (!pArgs || !mpDrawViewShell)
+ return;
+
+ // Set new page-attributes
+ PageKind ePageKind = mpDrawViewShell->GetPageKind();
+ const SfxPoolItem* pPoolItem;
+ bool bSetPageSizeAndBorder = false;
+ Size aNewSize(maSize);
+ sal_Int32 nLeft = -1, nRight = -1, nUpper = -1, nLower = -1;
+ bool bScaleAll = true;
+ Orientation eOrientation = mpPage->GetOrientation();
+ SdPage* pMasterPage = mpPage->IsMasterPage() ? mpPage : &static_cast<SdPage&>(mpPage->TRG_GetMasterPage());
+ bool bFullSize = pMasterPage->IsBackgroundFullSize();
+ sal_uInt16 nPaperBin = mpPage->GetPaperBin();
+
+ if( pArgs->GetItemState(SID_ATTR_PAGE, true, &pPoolItem) == SfxItemState::SET )
+ {
+ mpDoc->SetPageNumType(static_cast<const SvxPageItem*>(pPoolItem)->GetNumType());
+
+ eOrientation = static_cast<const SvxPageItem*>(pPoolItem)->IsLandscape() ?
+ Orientation::Landscape : Orientation::Portrait;
+
+ if( mpPage->GetOrientation() != eOrientation )
+ bSetPageSizeAndBorder = true;
+
+ mpDrawViewShell->ResetActualPage();
+ }
+
+ if( pArgs->GetItemState(SID_ATTR_PAGE_SIZE, true, &pPoolItem) == SfxItemState::SET )
+ {
+ aNewSize = static_cast<const SvxSizeItem*>(pPoolItem)->GetSize();
+
+ if( mpPage->GetSize() != aNewSize )
+ bSetPageSizeAndBorder = true;
+ }
+
+ if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE),
+ true, &pPoolItem) == SfxItemState::SET )
+ {
+ nLeft = static_cast<const SvxLRSpaceItem*>(pPoolItem)->GetLeft();
+ nRight = static_cast<const SvxLRSpaceItem*>(pPoolItem)->GetRight();
+
+ if( mpPage->GetLeftBorder() != nLeft || mpPage->GetRightBorder() != nRight )
+ bSetPageSizeAndBorder = true;
+
+ }
+
+ if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE),
+ true, &pPoolItem) == SfxItemState::SET )
+ {
+ nUpper = static_cast<const SvxULSpaceItem*>(pPoolItem)->GetUpper();
+ nLower = static_cast<const SvxULSpaceItem*>(pPoolItem)->GetLower();
+
+ if( mpPage->GetUpperBorder() != nUpper || mpPage->GetLowerBorder() != nLower )
+ bSetPageSizeAndBorder = true;
+ }
+
+ if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_PAGE_EXT1), true, &pPoolItem) == SfxItemState::SET )
+ {
+ bScaleAll = static_cast<const SfxBoolItem*>(pPoolItem)->GetValue();
+ }
+
+ if (SfxItemState::SET == pArgs->GetItemState(SID_ATTR_CHAR_GRABBAG, true, &pPoolItem))
+ {
+ SfxGrabBagItem const*const pGrabBag(static_cast<SfxGrabBagItem const*>(pPoolItem));
+ if (pGrabBag->GetGrabBag().find("BackgroundFullSize")->second >>= bFullSize)
+ {
+ if (pMasterPage->IsBackgroundFullSize() != bFullSize)
+ {
+ bSetPageSizeAndBorder = true;
+ }
+ }
+
+ if (mpDoc->GetDocumentType() == DocumentType::Impress && mpPage->IsMasterPage())
+ {
+ // The item set may have a theme.
+ auto it = pGrabBag->GetGrabBag().find("Theme");
+ if (it != pGrabBag->GetGrabBag().end())
+ {
+ std::unique_ptr<svx::Theme> pTheme = svx::Theme::FromAny(it->second);
+ pMasterPage->getSdrPageProperties().SetTheme(std::move(pTheme));
+ }
+ else
+ {
+ SAL_WARN("sd.ui", "FuPage::ApplyItemSet: got no theme");
+ }
+ }
+ }
+
+ // Paper Bin
+ if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_PAGE_PAPERBIN), true, &pPoolItem) == SfxItemState::SET )
+ {
+ nPaperBin = static_cast<const SvxPaperBinItem*>(pPoolItem)->GetValue();
+
+ if( mpPage->GetPaperBin() != nPaperBin )
+ bSetPageSizeAndBorder = true;
+ }
+
+ if (nLeft == -1 && nUpper != -1)
+ {
+ bSetPageSizeAndBorder = true;
+ nLeft = mpPage->GetLeftBorder();
+ nRight = mpPage->GetRightBorder();
+ }
+ else if (nLeft != -1 && nUpper == -1)
+ {
+ bSetPageSizeAndBorder = true;
+ nUpper = mpPage->GetUpperBorder();
+ nLower = mpPage->GetLowerBorder();
+ }
+
+ if( bSetPageSizeAndBorder || !mbMasterPage )
+ mpDrawViewShell->SetPageSizeAndBorder(ePageKind, aNewSize, nLeft, nRight, nUpper, nLower, bScaleAll, eOrientation, nPaperBin, bFullSize );
+
+ // if bMasterPage==sal_False then create a background-object for this page with the
+ // properties set in the dialog before, but if mbPageBckgrdDeleted==sal_True then
+ // the background of this page was set to invisible, so it would be a mistake
+ // to create a new background-object for this page !
+
+ if( mbDisplayBackgroundTabPage )
+ {
+ if( !mbMasterPage && !mbPageBckgrdDeleted )
+ {
+ // Only this page
+ mpBackgroundObjUndoAction.reset( new SdBackgroundObjUndoAction(
+ *mpDoc, *mpPage, mpPage->getSdrPageProperties().GetItemSet()) );
+ SfxItemSet aSet( *pArgs );
+ sdr::properties::CleanupFillProperties(aSet);
+ mpPage->getSdrPageProperties().ClearItem();
+ mpPage->getSdrPageProperties().PutItemSet(aSet);
+ }
+ }
+
+ // add undo action for background object
+ if( mpBackgroundObjUndoAction )
+ {
+ // set merge flag, because a SdUndoGroupAction could have been inserted before
+ mpDocSh->GetUndoManager()->AddUndoAction( std::move(mpBackgroundObjUndoAction), true );
+ }
+
+ // Objects can not be bigger than ViewSize
+ Size aPageSize = mpDoc->GetSdPage(0, ePageKind)->GetSize();
+ Size aViewSize(aPageSize.Width() * 3, aPageSize.Height() * 2);
+ mpDoc->SetMaxObjSize(aViewSize);
+
+ // if necessary, we tell Preview the new context
+ mpDrawViewShell->UpdatePreview( mpDrawViewShell->GetActualPage() );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuparagr.cxx b/sd/source/ui/func/fuparagr.cxx
new file mode 100644
index 000000000..ac5d87636
--- /dev/null
+++ b/sd/source/ui/func/fuparagr.cxx
@@ -0,0 +1,162 @@
+/* -*- 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 <fuparagr.hxx>
+#include <editeng/eeitem.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/sfxdlg.hxx>
+#include <svx/svxids.hrc>
+#include <editeng/editdata.hxx>
+#include <editeng/lrspitem.hxx>
+#include <svx/svdoutl.hxx>
+#include <svl/intitem.hxx>
+
+#include <View.hxx>
+#include <ViewShell.hxx>
+#include <drawdoc.hxx>
+#include <sdabstdlg.hxx>
+#include <sdattr.hrc>
+
+namespace sd {
+
+
+FuParagraph::FuParagraph (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuParagraph::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuParagraph( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuParagraph::DoExecute( SfxRequest& rReq )
+{
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ OutlinerView* pOutlView = mpView->GetTextEditOutlinerView();
+ ::Outliner* pOutliner = mpView->GetTextEditOutliner();
+
+ if( !pArgs )
+ {
+ SfxItemSet aEditAttr( mpDoc->GetPool() );
+ mpView->GetAttributes( aEditAttr );
+ SfxItemPool *pPool = aEditAttr.GetPool();
+ SfxItemSetFixed<EE_ITEMS_START, EE_ITEMS_END,
+ SID_ATTR_TABSTOP_OFFSET, SID_ATTR_TABSTOP_OFFSET,
+ ATTR_PARANUMBERING_START, ATTR_PARANUMBERING_END> aNewAttr( *pPool );
+
+ aNewAttr.Put( aEditAttr );
+
+ // left border is offset
+ const ::tools::Long nOff = aNewAttr.Get( EE_PARA_LRSPACE ).GetTextLeft();
+ // conversion since TabulatorTabPage always uses Twips!
+ SfxInt32Item aOff( SID_ATTR_TABSTOP_OFFSET, nOff );
+ aNewAttr.Put( aOff );
+
+ if( pOutlView && pOutliner )
+ {
+ ESelection eSelection = pOutlView->GetSelection();
+ aNewAttr.Put( SfxInt16Item( ATTR_NUMBER_NEWSTART_AT, pOutliner->GetNumberingStartValue( eSelection.nStartPara ) ) );
+ aNewAttr.Put( SfxBoolItem( ATTR_NUMBER_NEWSTART, pOutliner->IsParaIsNumberingRestart( eSelection.nStartPara ) ) );
+ }
+
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<SfxAbstractTabDialog> pDlg(pFact->CreateSdParagraphTabDlg(mpViewShell->GetFrameWeld(), &aNewAttr));
+
+ sal_uInt16 nResult = pDlg->Execute();
+
+ switch( nResult )
+ {
+ case RET_OK:
+ {
+ rReq.Done( *( pDlg->GetOutputItemSet() ) );
+
+ pArgs = rReq.GetArgs();
+ }
+ break;
+
+ default:
+ return; // Cancel
+ }
+ }
+ mpView->SetAttributes( *pArgs );
+
+ if( pOutlView && pOutliner )
+ {
+ ESelection eSelection = pOutlView->GetSelection();
+
+ if( const SfxBoolItem* pItem = pArgs->GetItemIfSet( ATTR_NUMBER_NEWSTART, false ) )
+ {
+ const bool bNewStart = pItem->GetValue();
+ pOutliner->SetParaIsNumberingRestart( eSelection.nStartPara, bNewStart );
+ }
+
+ if( const SfxInt16Item* pItem = pArgs->GetItemIfSet( ATTR_NUMBER_NEWSTART_AT, false ) )
+ {
+ const sal_Int16 nStartAt = pItem->GetValue();
+ pOutliner->SetNumberingStartValue( eSelection.nStartPara, nStartAt );
+ }
+ }
+
+ // invalidate slots
+ static const sal_uInt16 SidArray[] = {
+ SID_ATTR_TABSTOP,
+ SID_ATTR_PARA_ADJUST_LEFT,
+ SID_ATTR_PARA_ADJUST_RIGHT,
+ SID_ATTR_PARA_ADJUST_CENTER,
+ SID_ATTR_PARA_ADJUST_BLOCK,
+ SID_ATTR_PARA_LINESPACE,
+ SID_ATTR_PARA_LINESPACE_10,
+ SID_ATTR_PARA_LINESPACE_15,
+ SID_ATTR_PARA_LINESPACE_20,
+ SID_ATTR_PARA_ULSPACE,
+ SID_ATTR_PARA_LRSPACE,
+ SID_DEC_INDENT,
+ SID_INC_INDENT,
+ SID_ATTR_PARA_LEFT_TO_RIGHT,
+ SID_ATTR_PARA_RIGHT_TO_LEFT,
+ SID_RULER_TEXT_RIGHT_TO_LEFT,
+ SID_PARASPACE_INCREASE,
+ SID_PARASPACE_DECREASE,
+ 0 };
+
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray );
+}
+
+void FuParagraph::Activate()
+{
+}
+
+void FuParagraph::Deactivate()
+{
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fupoor.cxx b/sd/source/ui/func/fupoor.cxx
new file mode 100644
index 000000000..e901d07a6
--- /dev/null
+++ b/sd/source/ui/func/fupoor.cxx
@@ -0,0 +1,1135 @@
+/* -*- 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 <fupoor.hxx>
+
+#include <svx/svxids.hrc>
+#include <svx/svdpagv.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdograf.hxx>
+#include <vcl/seleng.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/request.hxx>
+#include <svl/stritem.hxx>
+
+#include <app.hrc>
+#include <fusel.hxx>
+#include <sdpage.hxx>
+#include <DrawViewShell.hxx>
+#include <Window.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <zoomlist.hxx>
+#include <slideshow.hxx>
+#include <LayerTabBar.hxx>
+
+#include <com/sun/star/embed/EmbedVerbs.hpp>
+
+#include <sfx2/viewfrm.hxx>
+
+#include <svx/svditer.hxx>
+
+#include <editeng/editeng.hxx>
+
+using namespace ::com::sun::star;
+
+namespace sd {
+
+
+FuPoor::FuPoor (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDrDoc,
+ SfxRequest& rReq)
+ : mpView(pView),
+ mpViewShell(pViewSh),
+ mpWindow(pWin),
+ mpDocSh( pDrDoc->GetDocSh() ),
+ mpDoc(pDrDoc),
+ nSlotId( rReq.GetSlot() ),
+ aScrollTimer("sd FuPoor aScrollTimer"),
+ aDragTimer("sd FuPoor aDragTimer"),
+ bIsInDragMode(false),
+ bNoScrollUntilInside (true),
+ aDelayToScrollTimer("sd FuPoor aDelayToScrollTimer"),
+ bScrollable (false),
+ bDelayActive (false),
+ bFirstMouseMove (false),
+ // remember MouseButton state
+ mnCode(0)
+{
+ ReceiveRequest(rReq);
+
+ aScrollTimer.SetInvokeHandler( LINK(this, FuPoor, ScrollHdl) );
+ aScrollTimer.SetTimeout(SELENG_AUTOREPEAT_INTERVAL);
+
+ aDragTimer.SetInvokeHandler( LINK(this, FuPoor, DragHdl) );
+ aDragTimer.SetTimeout(SELENG_DRAGDROP_TIMEOUT);
+
+ aDelayToScrollTimer.SetInvokeHandler( LINK(this, FuPoor, DelayHdl) );
+ aDelayToScrollTimer.SetTimeout(2000);
+}
+
+FuPoor::~FuPoor()
+{
+ aDragTimer.Stop();
+ aScrollTimer.Stop();
+ aDelayToScrollTimer.Stop();
+}
+
+void FuPoor::Activate()
+{
+}
+
+void FuPoor::Deactivate()
+{
+ aDragTimer.Stop();
+ aScrollTimer.Stop();
+ aDelayToScrollTimer.Stop ();
+ bScrollable = bDelayActive = false;
+
+ if (mpWindow && mpWindow->IsMouseCaptured())
+ mpWindow->ReleaseMouse();
+}
+
+void FuPoor::SetWindow(::sd::Window* pWin)
+{
+ mpWindow = pWin;
+}
+
+/**
+ * scroll when approached the border of the window; is called by MouseMove
+ */
+void FuPoor::ForceScroll(const Point& aPixPos)
+{
+ aScrollTimer.Stop();
+
+ if ( mpView->IsDragHelpLine() || mpView->IsSetPageOrg() ||
+ SlideShow::IsRunning( mpViewShell->GetViewShellBase() ) )
+ return;
+
+ Point aPos = mpWindow->OutputToScreenPixel(aPixPos);
+ const ::tools::Rectangle& rRect = mpViewShell->GetAllWindowRect();
+
+ if ( bNoScrollUntilInside )
+ {
+ if ( rRect.Contains(aPos) )
+ bNoScrollUntilInside = false;
+ }
+ else
+ {
+ short dx = 0, dy = 0;
+
+ if ( aPos.X() <= rRect.Left() ) dx = -1;
+ if ( aPos.X() >= rRect.Right() ) dx = 1;
+ if ( aPos.Y() <= rRect.Top() ) dy = -1;
+ if ( aPos.Y() >= rRect.Bottom() ) dy = 1;
+
+ if ( dx != 0 || dy != 0 )
+ {
+ if (bScrollable)
+ {
+ // scroll action in derived class
+ mpViewShell->ScrollLines(dx, dy);
+ aScrollTimer.Start();
+ }
+ else if (! bDelayActive) StartDelayToScrollTimer ();
+ }
+ }
+}
+
+/**
+ * timer handler for window scrolling
+ */
+IMPL_LINK_NOARG(FuPoor, ScrollHdl, Timer *, void)
+{
+ Point aPnt(mpWindow->GetPointerPosPixel());
+
+ // use remembered MouseButton state to create correct
+ // MouseEvents for this artificial MouseMove.
+ MouseMove(MouseEvent(aPnt, 1, MouseEventModifiers::NONE, GetMouseButtonCode()));
+}
+
+/**
+ * handle keyboard events
+ * @returns sal_True if the event was handled, sal_False otherwise
+ */
+bool FuPoor::KeyInput(const KeyEvent& rKEvt)
+{
+ sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
+ bool bReturn = false;
+ bool bSlideShow = SlideShow::IsRunning( mpViewShell->GetViewShellBase() );
+
+ switch (nCode)
+ {
+ case KEY_RETURN:
+ {
+ if(rKEvt.GetKeyCode().IsMod1())
+ {
+ if( auto pDrawViewShell = dynamic_cast<DrawViewShell *>( mpViewShell ))
+ {
+ SdPage* pActualPage = pDrawViewShell->GetActualPage();
+ SdrTextObj* pCandidate = nullptr;
+
+ if(pActualPage)
+ {
+ SdrObjListIter aIter(pActualPage, SdrIterMode::DeepNoGroups);
+
+ while(aIter.IsMore() && !pCandidate)
+ {
+ SdrObject* pObj = aIter.Next();
+
+ if(auto pTextObj = dynamic_cast<SdrTextObj *>( pObj ))
+ {
+ SdrInventor nInv(pObj->GetObjInventor());
+ SdrObjKind nKnd(pObj->GetObjIdentifier());
+
+ if(SdrInventor::Default == nInv &&
+ (SdrObjKind::TitleText == nKnd || SdrObjKind::OutlineText == nKnd || SdrObjKind::Text == nKnd))
+ {
+ pCandidate = pTextObj;
+ }
+ }
+ }
+ }
+
+ if(pCandidate)
+ {
+ mpView->UnMarkAll();
+ mpView->MarkObj(pCandidate, mpView->GetSdrPageView());
+
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(
+ SID_ATTR_CHAR, SfxCallMode::ASYNCHRON);
+ }
+ else
+ {
+ // insert a new page with the same page layout
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(
+ SID_INSERTPAGE_QUICK, SfxCallMode::ASYNCHRON);
+ }
+
+ // consumed
+ bReturn = true;
+ }
+ }
+ else
+ {
+ // activate OLE object on RETURN for selected object
+ // activate text edit on RETURN for selected object
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if( !mpView->IsTextEdit() && 1 == rMarkList.GetMarkCount() )
+ {
+ SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
+
+ if( dynamic_cast< const SdrOle2Obj* >( pObj ) && !mpDocSh->IsUIActive() )
+ {
+ //HMHmpView->HideMarkHdl();
+ mpViewShell->ActivateObject(static_cast<SdrOle2Obj*>(pObj), css::embed::EmbedVerbs::MS_OLEVERB_PRIMARY);
+ }
+ else if( pObj && pObj->IsEmptyPresObj() && dynamic_cast< const SdrGrafObj *>( pObj ) != nullptr )
+ {
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_INSERT_GRAPHIC, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+ }
+ else
+ {
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_ATTR_CHAR, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+ }
+
+ // consumed
+ bReturn = true;
+ }
+ }
+ }
+ break;
+
+ case KEY_TAB:
+ {
+ // handle Mod1 and Mod2 to get travelling running on different systems
+ if(rKEvt.GetKeyCode().IsMod1() || rKEvt.GetKeyCode().IsMod2())
+ {
+ // do something with a selected handle?
+ const SdrHdlList& rHdlList = mpView->GetHdlList();
+ bool bForward(!rKEvt.GetKeyCode().IsShift());
+
+ const_cast<SdrHdlList&>(rHdlList).TravelFocusHdl(bForward);
+
+ // guarantee visibility of focused handle
+ SdrHdl* pHdl = rHdlList.GetFocusHdl();
+
+ if(pHdl)
+ {
+ Point aHdlPosition(pHdl->GetPos());
+ ::tools::Rectangle aVisRect(aHdlPosition - Point(100, 100), Size(200, 200));
+ mpView->MakeVisible(aVisRect, *mpWindow);
+ }
+
+ // consumed
+ bReturn = true;
+ }
+ }
+ break;
+
+ case KEY_ESCAPE:
+ {
+ bReturn = FuPoor::cancel();
+ }
+ break;
+
+ case KEY_ADD:
+ {
+ if (!mpView->IsTextEdit() && !bSlideShow && !mpDocSh->IsUIActive())
+ {
+ // increase zoom
+ mpViewShell->SetZoom(mpWindow->GetZoom() * 3 / 2);
+
+ if( auto pViewShell = dynamic_cast<DrawViewShell *>( mpViewShell ))
+ pViewShell->SetZoomOnPage(false);
+
+ bReturn = true;
+ }
+ }
+ break;
+
+ case KEY_SUBTRACT:
+ {
+ if (!mpView->IsTextEdit() && !bSlideShow && !mpDocSh->IsUIActive())
+ {
+ // decrease zoom
+ mpViewShell->SetZoom(mpWindow->GetZoom() * 2 / 3);
+
+ if( auto pViewShell = dynamic_cast<DrawViewShell *>( mpViewShell ))
+ pViewShell->SetZoomOnPage(false);
+
+ bReturn = true;
+ }
+ }
+ break;
+
+ case KEY_MULTIPLY:
+ {
+ if (!mpView->IsTextEdit() && !bSlideShow)
+ {
+ // zoom to page
+ mpViewShell->GetViewFrame()->GetDispatcher()->
+ Execute(SID_SIZE_PAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ bReturn = true;
+ }
+ }
+ break;
+
+ case KEY_DIVIDE:
+ {
+ if (!mpView->IsTextEdit() && !bSlideShow)
+ {
+ // zoom to selected objects
+ mpViewShell->GetViewFrame()->GetDispatcher()->
+ Execute(SID_SIZE_OPTIMAL, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ bReturn = true;
+ }
+ }
+ break;
+
+ case KEY_POINT:
+ {
+ ZoomList* pZoomList = mpViewShell->GetZoomList();
+
+ if (!mpView->IsTextEdit() && pZoomList->IsNextPossible() && !bSlideShow && !mpDocSh->IsUIActive())
+ {
+ // use next ZoomRect
+ mpViewShell->SetZoomRect(pZoomList->GetNextZoomRect());
+ bReturn = true;
+ }
+ }
+ break;
+
+ case KEY_COMMA:
+ {
+ ZoomList* pZoomList = mpViewShell->GetZoomList();
+
+ if (!mpView->IsTextEdit() && pZoomList->IsPreviousPossible() && !bSlideShow && !mpDocSh->IsUIActive())
+ {
+ // use previous ZoomRect
+ mpViewShell->SetZoomRect(pZoomList->GetPreviousZoomRect());
+ bReturn = true;
+ }
+ }
+ break;
+
+ case KEY_HOME:
+ {
+ if (!mpView->IsTextEdit() && !bSlideShow)
+ if (auto pDrawViewShell = dynamic_cast<DrawViewShell *>( mpViewShell ))
+ {
+ // jump to first page
+ pDrawViewShell->SwitchPage(0);
+ bReturn = true;
+ }
+ }
+ break;
+
+ case KEY_END:
+ {
+ if (!mpView->IsTextEdit() && !bSlideShow)
+ if (auto pDrawViewShell = dynamic_cast<DrawViewShell *>( mpViewShell ))
+ {
+ // jump to last page
+ SdPage* pPage = pDrawViewShell->GetActualPage();
+ pDrawViewShell->SwitchPage(mpDoc->GetSdPageCount(
+ pPage->GetPageKind()) - 1);
+ bReturn = true;
+ }
+ }
+ break;
+
+ case KEY_PAGEUP:
+ {
+ if( rKEvt.GetKeyCode().IsMod1() && rKEvt.GetKeyCode().IsMod2() )
+ break;
+ if( bSlideShow)
+ break;
+
+ if( auto pDrawViewShell = dynamic_cast<DrawViewShell *>( mpViewShell ) )
+ {
+ // The page-up key switches layers or pages depending on the
+ // modifier key.
+ if ( ! rKEvt.GetKeyCode().GetModifier())
+ {
+ // With no modifier pressed we move to the previous
+ // slide.
+ mpView->SdrEndTextEdit();
+
+ // Previous page.
+ bReturn = true;
+ SdPage* pPage = pDrawViewShell->GetActualPage();
+ sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2;
+
+ if (nSdPage > 0)
+ {
+ // Switch the page and send events regarding
+ // deactivation the old page and activating the new
+ // one.
+ TabControl& rPageTabControl =
+ pDrawViewShell->GetPageTabControl();
+ if (rPageTabControl.IsReallyShown())
+ rPageTabControl.SendDeactivatePageEvent ();
+ pDrawViewShell->SwitchPage(nSdPage - 1);
+ if (rPageTabControl.IsReallyShown())
+ rPageTabControl.SendActivatePageEvent ();
+ }
+ }
+ else if (rKEvt.GetKeyCode().IsMod1())
+ {
+ // With the CONTROL modifier we switch layers.
+ if (pDrawViewShell->IsLayerModeActive())
+ {
+ // Moves to the previous layer.
+ SwitchLayer (-1);
+ }
+ }
+ }
+ }
+ break;
+
+ case KEY_PAGEDOWN:
+ {
+ if( rKEvt.GetKeyCode().IsMod1() && rKEvt.GetKeyCode().IsMod2() )
+ break;
+ if(dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr && !bSlideShow)
+ {
+ // The page-down key switches layers or pages depending on the
+ // modifier key.
+ if ( ! rKEvt.GetKeyCode().GetModifier())
+ {
+ // With no modifier pressed we move to the next slide.
+ mpView->SdrEndTextEdit();
+
+ // Next page.
+ bReturn = true;
+ SdPage* pPage = static_cast<DrawViewShell*>(mpViewShell)->GetActualPage();
+ sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2;
+
+ if (nSdPage < mpDoc->GetSdPageCount(pPage->GetPageKind()) - 1)
+ {
+ // Switch the page and send events regarding
+ // deactivation the old page and activating the new
+ // one.
+ TabControl& rPageTabControl =
+ static_cast<DrawViewShell*>(mpViewShell)->GetPageTabControl();
+ if (rPageTabControl.IsReallyShown())
+ rPageTabControl.SendDeactivatePageEvent ();
+ static_cast<DrawViewShell*>(mpViewShell)->SwitchPage(nSdPage + 1);
+ if (rPageTabControl.IsReallyShown())
+ rPageTabControl.SendActivatePageEvent ();
+ }
+ }
+ else if (rKEvt.GetKeyCode().IsMod1())
+ {
+ // With the CONTROL modifier we switch layers.
+ if (static_cast<DrawViewShell*>(mpViewShell)->IsLayerModeActive())
+ {
+ // With the layer mode active pressing page-down
+ // moves to the next layer.
+ SwitchLayer (+1);
+ }
+ }
+ }
+ }
+ break;
+
+ // change select state when focus is on poly point
+ case KEY_SPACE:
+ {
+ const SdrHdlList& rHdlList = mpView->GetHdlList();
+ SdrHdl* pHdl = rHdlList.GetFocusHdl();
+
+ if(pHdl)
+ {
+ if(pHdl->GetKind() == SdrHdlKind::Poly)
+ {
+ // rescue ID of point with focus
+ sal_uInt32 nPol(pHdl->GetPolyNum());
+ sal_uInt32 nPnt(pHdl->GetPointNum());
+
+ if(mpView->IsPointMarked(*pHdl))
+ {
+ if(rKEvt.GetKeyCode().IsShift())
+ {
+ mpView->UnmarkPoint(*pHdl);
+ }
+ }
+ else
+ {
+ if(!rKEvt.GetKeyCode().IsShift())
+ {
+ mpView->UnmarkAllPoints();
+ }
+
+ mpView->MarkPoint(*pHdl);
+ }
+
+ if(nullptr == rHdlList.GetFocusHdl())
+ {
+ // restore point with focus
+ SdrHdl* pNewOne = nullptr;
+
+ for(size_t a = 0; !pNewOne && a < rHdlList.GetHdlCount(); ++a)
+ {
+ SdrHdl* pAct = rHdlList.GetHdl(a);
+
+ if(pAct
+ && pAct->GetKind() == SdrHdlKind::Poly
+ && pAct->GetPolyNum() == nPol
+ && pAct->GetPointNum() == nPnt)
+ {
+ pNewOne = pAct;
+ }
+ }
+
+ if(pNewOne)
+ {
+ const_cast<SdrHdlList&>(rHdlList).SetFocusHdl(pNewOne);
+ }
+ }
+
+ bReturn = true;
+ }
+ }
+ }
+ break;
+
+ case KEY_UP:
+ case KEY_DOWN:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ {
+ if (!mpView->IsTextEdit() && !bSlideShow)
+ {
+ ::tools::Long nX = 0;
+ ::tools::Long nY = 0;
+
+ if (nCode == KEY_UP)
+ {
+ // scroll up
+ nX = 0;
+ nY =-1;
+ }
+ else if (nCode == KEY_DOWN)
+ {
+ // scroll down
+ nX = 0;
+ nY = 1;
+ }
+ else if (nCode == KEY_LEFT)
+ {
+ // scroll left
+ nX =-1;
+ nY = 0;
+ }
+ else if (nCode == KEY_RIGHT)
+ {
+ // scroll right
+ nX = 1;
+ nY = 0;
+ }
+
+ if (mpView->AreObjectsMarked() && !rKEvt.GetKeyCode().IsMod1() &&
+ !mpDocSh->IsReadOnly())
+ {
+ const SdrHdlList& rHdlList = mpView->GetHdlList();
+ SdrHdl* pHdl = rHdlList.GetFocusHdl();
+
+ bool bIsMoveOfConnectedHandle(false);
+ bool bOldSuppress = false;
+ SdrEdgeObj* pEdgeObj = nullptr;
+ if(pHdl)
+ pEdgeObj = dynamic_cast<SdrEdgeObj *>( pHdl->GetObj() );
+
+ if(pEdgeObj && 0 == pHdl->GetPolyNum())
+ {
+ if(0 == pHdl->GetPointNum())
+ {
+ if(pEdgeObj->GetConnection(true).GetObject())
+ {
+ bIsMoveOfConnectedHandle = true;
+ }
+ }
+ if(1 == pHdl->GetPointNum())
+ {
+ if(pEdgeObj->GetConnection(false).GetObject())
+ {
+ bIsMoveOfConnectedHandle = true;
+ }
+ }
+ }
+
+ if(pEdgeObj)
+ {
+ // Suppress default connects to inside object and object center
+ bOldSuppress = pEdgeObj->GetSuppressDefaultConnect();
+ pEdgeObj->SetSuppressDefaultConnect(true);
+ }
+
+ if(bIsMoveOfConnectedHandle)
+ {
+ sal_uInt16 nMarkHdSiz(mpView->GetMarkHdlSizePixel());
+ Size aHalfConSiz(nMarkHdSiz + 1, nMarkHdSiz + 1);
+ aHalfConSiz = mpWindow->PixelToLogic(aHalfConSiz);
+
+ if(100 < aHalfConSiz.Width())
+ nX *= aHalfConSiz.Width();
+ else
+ nX *= 100;
+
+ if(100 < aHalfConSiz.Height())
+ nY *= aHalfConSiz.Height();
+ else
+ nY *= 100;
+ }
+ else if(rKEvt.GetKeyCode().IsMod2())
+ {
+ // move in 1 pixel distance
+ Size aLogicSizeOnePixel = mpWindow->PixelToLogic(Size(1,1));
+ nX *= aLogicSizeOnePixel.Width();
+ nY *= aLogicSizeOnePixel.Height();
+ }
+ else if(rKEvt.GetKeyCode().IsShift())
+ {
+ nX *= 1000;
+ nY *= 1000;
+ }
+ else
+ {
+ // old, fixed move distance
+ nX *= 100;
+ nY *= 100;
+ }
+
+ if(nullptr == pHdl)
+ {
+ // only take action when move is allowed
+ if(mpView->IsMoveAllowed())
+ {
+ // restrict movement to WorkArea
+ const ::tools::Rectangle& rWorkArea = mpView->GetWorkArea();
+
+ if(!rWorkArea.IsEmpty())
+ {
+ ::tools::Rectangle aMarkRect(mpView->GetMarkedObjRect());
+ aMarkRect.Move(nX, nY);
+
+ if(!aMarkRect.Contains(rWorkArea))
+ {
+ if(aMarkRect.Left() < rWorkArea.Left())
+ {
+ nX += rWorkArea.Left() - aMarkRect.Left();
+ }
+
+ if(aMarkRect.Right() > rWorkArea.Right())
+ {
+ nX -= aMarkRect.Right() - rWorkArea.Right();
+ }
+
+ if(aMarkRect.Top() < rWorkArea.Top())
+ {
+ nY += rWorkArea.Top() - aMarkRect.Top();
+ }
+
+ if(aMarkRect.Bottom() > rWorkArea.Bottom())
+ {
+ nY -= aMarkRect.Bottom() - rWorkArea.Bottom();
+ }
+ }
+ }
+
+ // no handle selected
+ if(0 != nX || 0 != nY)
+ {
+ mpView->MoveAllMarked(Size(nX, nY));
+
+ mpView->MakeVisible(mpView->GetAllMarkedRect(), *mpWindow);
+ }
+ }
+ }
+ else
+ {
+ // move handle with index nHandleIndex
+ if (nX || nY)
+ {
+ // now move the Handle (nX, nY)
+ Point aStartPoint(pHdl->GetPos());
+ Point aEndPoint(pHdl->GetPos() + Point(nX, nY));
+ const SdrDragStat& rDragStat = mpView->GetDragStat();
+
+ // start dragging
+ mpView->BegDragObj(aStartPoint, nullptr, pHdl, 0);
+
+ if(mpView->IsDragObj())
+ {
+ bool bWasNoSnap = rDragStat.IsNoSnap();
+ bool bWasSnapEnabled = mpView->IsSnapEnabled();
+
+ // switch snapping off
+ if(!bWasNoSnap)
+ const_cast<SdrDragStat&>(rDragStat).SetNoSnap();
+ if(bWasSnapEnabled)
+ mpView->SetSnapEnabled(false);
+
+ mpView->MovAction(aEndPoint);
+ mpView->EndDragObj();
+
+ // restore snap
+ if(!bWasNoSnap)
+ const_cast<SdrDragStat&>(rDragStat).SetNoSnap(bWasNoSnap);
+ if(bWasSnapEnabled)
+ mpView->SetSnapEnabled(bWasSnapEnabled);
+ }
+
+ // make moved handle visible
+ ::tools::Rectangle aVisRect(aEndPoint - Point(100, 100), Size(200, 200));
+ mpView->MakeVisible(aVisRect, *mpWindow);
+ }
+ }
+
+ if(pEdgeObj)
+ {
+ // Restore original suppress value
+ pEdgeObj->SetSuppressDefaultConnect(bOldSuppress);
+ }
+ }
+ else
+ {
+ // scroll page
+ mpViewShell->ScrollLines(nX, nY);
+ }
+
+ bReturn = true;
+ }
+ }
+ break;
+ }
+
+ if (bReturn)
+ {
+ mpWindow->ReleaseMouse();
+ }
+
+ // when a text-editable object is selected and the
+ // input character is printable, activate text edit on that object
+ // and feed character to object
+ if(!bReturn && !mpDocSh->IsReadOnly())
+ {
+ if (!mpView->IsTextEdit())
+ {
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if(1 == rMarkList.GetMarkCount())
+ {
+ SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+
+ // #i118485# allow TextInput for OLEs, too
+ if( dynamic_cast< const SdrTextObj *>( pObj ) != nullptr && pObj->HasTextEdit())
+ {
+ // use common IsSimpleCharInput from the EditEngine.
+ bool bPrintable(EditEngine::IsSimpleCharInput(rKEvt));
+
+ if(bPrintable)
+ {
+ // try to activate textedit mode for the selected object
+ SfxStringItem aInputString(SID_ATTR_CHAR, OUString(rKEvt.GetCharCode()));
+
+ mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(
+ SID_ATTR_CHAR,
+ SfxCallMode::ASYNCHRON,
+ { &aInputString });
+
+ // consumed
+ bReturn = true;
+ }
+ }
+ }
+ else
+ {
+ // test if there is a title object there. If yes, try to
+ // set it to edit mode and start typing...
+ DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>(mpViewShell);
+ if (pDrawViewShell && EditEngine::IsSimpleCharInput(rKEvt))
+ {
+ SdPage* pActualPage = pDrawViewShell->GetActualPage();
+ SdrTextObj* pCandidate = nullptr;
+
+ if(pActualPage)
+ {
+ SdrObjListIter aIter(pActualPage, SdrIterMode::DeepNoGroups);
+
+ while(aIter.IsMore() && !pCandidate)
+ {
+ SdrObject* pObj = aIter.Next();
+
+ if(auto pTextObj = dynamic_cast< SdrTextObj *>( pObj ))
+ {
+ SdrInventor nInv(pObj->GetObjInventor());
+ SdrObjKind nKnd(pObj->GetObjIdentifier());
+
+ if(SdrInventor::Default == nInv && SdrObjKind::TitleText == nKnd)
+ {
+ pCandidate = pTextObj;
+ }
+ }
+ }
+ }
+
+ // when candidate found and candidate is untouched, start editing text...
+ if(pCandidate && pCandidate->IsEmptyPresObj())
+ {
+ mpView->UnMarkAll();
+ mpView->MarkObj(pCandidate, mpView->GetSdrPageView());
+ SfxStringItem aInputString(SID_ATTR_CHAR, OUString(rKEvt.GetCharCode()));
+
+ mpViewShell->GetViewFrame()->GetDispatcher()->ExecuteList(
+ SID_ATTR_CHAR,
+ SfxCallMode::ASYNCHRON,
+ { &aInputString });
+
+ // consumed
+ bReturn = true;
+ }
+ }
+ }
+ }
+ }
+
+ return bReturn;
+}
+
+bool FuPoor::MouseMove(const MouseEvent& )
+{
+ return false;
+}
+
+void FuPoor::SelectionHasChanged()
+{
+ const SdrHdlList& rHdlList = mpView->GetHdlList();
+ const_cast<SdrHdlList&>(rHdlList).ResetFocusHdl();
+}
+
+/**
+ * Cut object to clipboard
+ */
+void FuPoor::DoCut()
+{
+ if (mpView)
+ {
+ mpView->DoCut();
+ }
+}
+
+/**
+ * Copy object to clipboard
+ */
+void FuPoor::DoCopy()
+{
+ if (mpView)
+ {
+ mpView->DoCopy();
+ }
+}
+
+/**
+ * Paste object from clipboard
+ */
+void FuPoor::DoPaste()
+{
+ if (mpView)
+ {
+ mpView->DoPaste(mpWindow);
+ }
+}
+
+/**
+ * Paste unformatted text from clipboard
+ */
+void FuPoor::DoPasteUnformatted()
+{
+ if (mpView)
+ {
+ TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( mpViewShell->GetActiveWindow() ) );
+ if (aDataHelper.GetTransferable().is())
+ {
+ sal_Int8 nAction = DND_ACTION_COPY;
+ mpView->InsertData( aDataHelper,
+ mpWindow->PixelToLogic( ::tools::Rectangle( Point(), mpWindow->GetOutputSizePixel() ).Center() ),
+ nAction, false, SotClipboardFormatId::STRING);
+ }
+ }
+}
+
+/**
+ * Timer handler for Drag&Drop
+ */
+IMPL_LINK_NOARG(FuPoor, DragHdl, Timer *, void)
+{
+ if( !mpView )
+ return;
+
+ sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
+ SdrHdl* pHdl = mpView->PickHandle(aMDPos);
+
+ if ( pHdl==nullptr && mpView->IsMarkedHit(aMDPos, nHitLog)
+ && !mpView->IsPresObjSelected(false) )
+ {
+ mpWindow->ReleaseMouse();
+ bIsInDragMode = true;
+ mpView->StartDrag( aMDPos, mpWindow );
+ }
+}
+
+bool FuPoor::Command(const CommandEvent& rCEvt)
+{
+ return mpView->Command(rCEvt,mpWindow);
+}
+
+/**
+ * Timer handler for window scrolling
+ */
+IMPL_LINK_NOARG(FuPoor, DelayHdl, Timer *, void)
+{
+ aDelayToScrollTimer.Stop ();
+ bScrollable = true;
+
+ Point aPnt(mpWindow->GetPointerPosPixel());
+
+ // use remembered MouseButton state to create correct
+ // MouseEvents for this artificial MouseMove.
+ MouseMove(MouseEvent(aPnt, 1, MouseEventModifiers::NONE, GetMouseButtonCode()));
+}
+
+bool FuPoor::MouseButtonUp (const MouseEvent& rMEvt)
+{
+ // remember button state for creation of own MouseEvents
+ SetMouseButtonCode(rMEvt.GetButtons());
+
+ aDelayToScrollTimer.Stop ();
+ bScrollable = bDelayActive = false;
+ return bScrollable;
+}
+
+bool FuPoor::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ // remember button state for creation of own MouseEvents
+ SetMouseButtonCode(rMEvt.GetButtons());
+
+ return false;
+}
+
+void FuPoor::StartDelayToScrollTimer ()
+{
+ bDelayActive = true;
+ aDelayToScrollTimer.Start ();
+}
+
+bool FuPoor::RequestHelp(const HelpEvent& rHEvt)
+{
+ bool bReturn = false;
+
+ SdrPageView* pPV = mpView->GetSdrPageView();
+
+ if (pPV)
+ {
+ SdPage* pPage = static_cast<SdPage*>( pPV->GetPage() );
+
+ if (pPage)
+ {
+ bReturn = FmFormPage::RequestHelp(mpWindow, mpView, rHEvt);
+ }
+ }
+
+ return bReturn;
+}
+
+void FuPoor::ReceiveRequest(SfxRequest& /*rReq*/)
+{
+}
+
+SdrObjectUniquePtr FuPoor::CreateDefaultObject(const sal_uInt16, const ::tools::Rectangle& )
+{
+ // empty base implementation
+ return nullptr;
+}
+
+void FuPoor::ImpForceQuadratic(::tools::Rectangle& rRect)
+{
+ if(rRect.GetWidth() > rRect.GetHeight())
+ {
+ rRect = ::tools::Rectangle(
+ Point(rRect.Left() + ((rRect.GetWidth() - rRect.GetHeight()) / 2), rRect.Top()),
+ Size(rRect.GetHeight(), rRect.GetHeight()));
+ }
+ else
+ {
+ rRect = ::tools::Rectangle(
+ Point(rRect.Left(), rRect.Top() + ((rRect.GetHeight() - rRect.GetWidth()) / 2)),
+ Size(rRect.GetWidth(), rRect.GetWidth()));
+ }
+}
+
+void FuPoor::SwitchLayer (sal_Int32 nOffset)
+{
+ auto pDrawViewShell = dynamic_cast<DrawViewShell *>( mpViewShell );
+ if(!pDrawViewShell)
+ return;
+
+ // Calculate the new index.
+ sal_Int32 nIndex = pDrawViewShell->GetActiveTabLayerIndex() + nOffset;
+
+ // Make sure the new index lies inside the range of valid indices.
+ if (nIndex < 0)
+ nIndex = 0;
+ else if (nIndex >= pDrawViewShell->GetTabLayerCount ())
+ nIndex = pDrawViewShell->GetTabLayerCount() - 1;
+
+ // Set the new active layer.
+ if (nIndex != pDrawViewShell->GetActiveTabLayerIndex ())
+ {
+ LayerTabBar* pLayerTabControl =
+ static_cast<DrawViewShell*>(mpViewShell)->GetLayerTabControl();
+ if (pLayerTabControl != nullptr)
+ pLayerTabControl->SendDeactivatePageEvent ();
+
+ pDrawViewShell->SetActiveTabLayerIndex (nIndex);
+
+ if (pLayerTabControl != nullptr)
+ pLayerTabControl->SendActivatePageEvent ();
+ }
+}
+
+/** is called when the current function should be aborted. <p>
+ This is used when a function gets a KEY_ESCAPE but can also
+ be called directly.
+
+ @returns true if an active function was aborted
+*/
+bool FuPoor::cancel()
+{
+ if ( dynamic_cast< const FuSelection *>( this ) == nullptr )
+ {
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+ return true;
+ }
+
+ return false;
+}
+
+// #i33136#
+bool FuPoor::doConstructOrthogonal() const
+{
+ // Check whether a media object is selected
+ bool bResizeKeepRatio = false;
+ // tdf#89758 Avoid interactive crop preview from being proportionally scaled by default.
+ if (mpView->AreObjectsMarked() && mpView->GetDragMode() != SdrDragMode::Crop)
+ {
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrObjKind aObjIdentifier = rMarkList.GetMark(0)->GetMarkedSdrObj()->GetObjIdentifier();
+ bResizeKeepRatio = aObjIdentifier == SdrObjKind::Graphic ||
+ aObjIdentifier == SdrObjKind::Media ||
+ aObjIdentifier == SdrObjKind::OLE2;
+ }
+ }
+ SdrHdl* pHdl = mpView->PickHandle(aMDPos);
+ // Resize proportionally when media is selected and the user drags on a corner
+ if (pHdl)
+ bResizeKeepRatio = bResizeKeepRatio && pHdl->IsCornerHdl();
+
+ return (
+ bResizeKeepRatio ||
+ SID_DRAW_XLINE == nSlotId ||
+ SID_DRAW_CIRCLEARC == nSlotId ||
+ SID_DRAW_SQUARE == nSlotId ||
+ SID_DRAW_SQUARE_NOFILL == nSlotId ||
+ SID_DRAW_SQUARE_ROUND == nSlotId ||
+ SID_DRAW_SQUARE_ROUND_NOFILL == nSlotId ||
+ SID_DRAW_CIRCLE == nSlotId ||
+ SID_DRAW_CIRCLE_NOFILL == nSlotId ||
+ SID_DRAW_CIRCLEPIE == nSlotId ||
+ SID_DRAW_CIRCLEPIE_NOFILL == nSlotId ||
+ SID_DRAW_CIRCLECUT == nSlotId ||
+ SID_DRAW_CIRCLECUT_NOFILL == nSlotId ||
+ SID_DRAW_XPOLYGON == nSlotId ||
+ SID_DRAW_XPOLYGON_NOFILL == nSlotId ||
+ SID_3D_CUBE == nSlotId ||
+ SID_3D_SPHERE == nSlotId ||
+ SID_3D_SHELL == nSlotId ||
+ SID_3D_HALF_SPHERE == nSlotId ||
+ SID_3D_TORUS == nSlotId ||
+ SID_3D_CYLINDER == nSlotId ||
+ SID_3D_CONE == nSlotId ||
+ SID_3D_PYRAMID == nSlotId);
+}
+
+void FuPoor::DoExecute( SfxRequest& )
+{
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuprlout.cxx b/sd/source/ui/func/fuprlout.cxx
new file mode 100644
index 000000000..c436b78f0
--- /dev/null
+++ b/sd/source/ui/func/fuprlout.cxx
@@ -0,0 +1,277 @@
+/* -*- 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 <fuprlout.hxx>
+#include <sfx2/dispatch.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/request.hxx>
+#include <svl/stritem.hxx>
+
+#include <sdattr.hrc>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <pres.hxx>
+#include <DrawViewShell.hxx>
+#include <View.hxx>
+#include <glob.hxx>
+#include <app.hrc>
+#include <DrawDocShell.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <Window.hxx>
+#include <drawview.hxx>
+#include <sdabstdlg.hxx>
+#include <memory>
+
+namespace sd
+{
+
+
+#define DOCUMENT_TOKEN '#'
+
+FuPresentationLayout::FuPresentationLayout (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuPresentationLayout::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuPresentationLayout( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuPresentationLayout::DoExecute( SfxRequest& rReq )
+{
+ // prevent selected objects or objects which are under editing from disappearing
+ mpView->SdrEndTextEdit();
+
+ if(mpView->GetSdrPageView())
+ {
+ mpView->UnmarkAll();
+ }
+
+ bool bError = false;
+
+ /* if we are on a master page, the changes apply for all pages and notes-
+ pages who are using the relevant layout */
+ bool bOnMaster = false;
+ if (DrawViewShell *pShell = dynamic_cast<DrawViewShell*>(mpViewShell))
+ {
+ EditMode eEditMode = pShell->GetEditMode();
+ if (eEditMode == EditMode::MasterPage)
+ bOnMaster = true;
+ }
+
+ std::vector<SdPage*> aUnselect;
+ if (!bOnMaster)
+ {
+ //We later rely on IsSelected, so transfer the selection here
+ //into the document
+ slidesorter::SlideSorterViewShell* pSlideSorterViewShell
+ = slidesorter::SlideSorterViewShell::GetSlideSorter(mpViewShell->GetViewShellBase());
+ if (pSlideSorterViewShell)
+ {
+ std::shared_ptr<slidesorter::SlideSorterViewShell::PageSelection> xSelection(
+ pSlideSorterViewShell->GetPageSelection());
+ if (xSelection)
+ {
+ for (SdPage *pPage : *xSelection)
+ {
+ if (pPage->IsSelected() || pPage->GetPageKind() != PageKind::Standard)
+ continue;
+ mpDoc->SetSelected(pPage, true);
+ aUnselect.push_back(pPage);
+ }
+ }
+ }
+ }
+
+ std::vector<SdPage*> aSelectedPages;
+ std::vector<sal_uInt16> aSelectedPageNums;
+ // determine the active pages
+ for (sal_uInt16 nPage = 0; nPage < mpDoc->GetSdPageCount(PageKind::Standard); nPage++)
+ {
+ SdPage* pPage = mpDoc->GetSdPage(nPage, PageKind::Standard);
+ if (pPage->IsSelected())
+ {
+ aSelectedPages.push_back(pPage);
+ aSelectedPageNums.push_back(nPage);
+ }
+ }
+
+ bool bMasterPage = bOnMaster;
+ bool bCheckMasters = false;
+
+ // call dialog
+ bool bLoad = false; // appear the new master pages?
+ OUString aFile;
+
+ SfxItemSetFixed<ATTR_PRESLAYOUT_START, ATTR_PRESLAYOUT_END> aSet(mpDoc->GetPool() );
+
+ aSet.Put( SfxBoolItem( ATTR_PRESLAYOUT_LOAD, bLoad));
+ aSet.Put( SfxBoolItem( ATTR_PRESLAYOUT_MASTER_PAGE, bMasterPage ) );
+ aSet.Put( SfxBoolItem( ATTR_PRESLAYOUT_CHECK_MASTERS, bCheckMasters ) );
+
+ if (!aSelectedPages.empty())
+ {
+ OUString aOldLayoutName(aSelectedPages.back()->GetLayoutName());
+ sal_Int32 nPos = aOldLayoutName.indexOf(SD_LT_SEPARATOR);
+ if (nPos != -1)
+ aOldLayoutName = aOldLayoutName.copy(0, nPos);
+ aSet.Put(SfxStringItem(ATTR_PRESLAYOUT_NAME, aOldLayoutName));
+ }
+
+ const SfxItemSet *pArgs = rReq.GetArgs ();
+
+ if (pArgs)
+ {
+ if (pArgs->GetItemState(ATTR_PRESLAYOUT_LOAD) == SfxItemState::SET)
+ bLoad = static_cast<const SfxBoolItem&>(pArgs->Get(ATTR_PRESLAYOUT_LOAD)).GetValue();
+ if( pArgs->GetItemState( ATTR_PRESLAYOUT_MASTER_PAGE ) == SfxItemState::SET )
+ bMasterPage = pArgs->Get( ATTR_PRESLAYOUT_MASTER_PAGE ).GetValue();
+ if( pArgs->GetItemState( ATTR_PRESLAYOUT_CHECK_MASTERS ) == SfxItemState::SET )
+ bCheckMasters = static_cast<const SfxBoolItem&>( pArgs->Get( ATTR_PRESLAYOUT_CHECK_MASTERS ) ).GetValue();
+ if (pArgs->GetItemState(ATTR_PRESLAYOUT_NAME) == SfxItemState::SET)
+ aFile = pArgs->Get(ATTR_PRESLAYOUT_NAME).GetValue();
+ }
+ else
+ {
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractSdPresLayoutDlg> pDlg(pFact->CreateSdPresLayoutDlg(mpWindow ? mpWindow->GetFrameWeld() : nullptr, mpDocSh, aSet));
+
+ sal_uInt16 nResult = pDlg->Execute();
+
+ switch (nResult)
+ {
+ case RET_OK:
+ {
+ pDlg->GetAttr(aSet);
+ if (aSet.GetItemState(ATTR_PRESLAYOUT_LOAD) == SfxItemState::SET)
+ bLoad = static_cast<const SfxBoolItem&>(aSet.Get(ATTR_PRESLAYOUT_LOAD)).GetValue();
+ if( aSet.GetItemState( ATTR_PRESLAYOUT_MASTER_PAGE ) == SfxItemState::SET )
+ bMasterPage = aSet.Get( ATTR_PRESLAYOUT_MASTER_PAGE ).GetValue();
+ if( aSet.GetItemState( ATTR_PRESLAYOUT_CHECK_MASTERS ) == SfxItemState::SET )
+ bCheckMasters = static_cast<const SfxBoolItem&>(aSet.Get( ATTR_PRESLAYOUT_CHECK_MASTERS ) ).GetValue();
+ if (aSet.GetItemState(ATTR_PRESLAYOUT_NAME) == SfxItemState::SET)
+ aFile = aSet.Get(ATTR_PRESLAYOUT_NAME).GetValue();
+ }
+ break;
+
+ default:
+ bError = true;
+ }
+ }
+
+ if (bError)
+ return;
+
+ mpDocSh->SetWaitCursor( true );
+
+ /* Here, we only exchange masterpages, therefore the current page
+ remains the current page. To prevent calling PageOrderChangedHint
+ during insertion and extraction of the masterpages, we block. */
+ /* That isn't quite right. If the masterpageview is active and you are
+ removing a masterpage, it's possible that you are removing the
+ current masterpage. So you have to call ResetActualPage ! */
+ if( dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr && !bCheckMasters )
+ static_cast<DrawView*>(mpView)->BlockPageOrderChangedHint(true);
+
+ if (bLoad)
+ {
+ sal_Int32 nIdx{ 0 };
+ OUString aFileName = aFile.getToken(0, DOCUMENT_TOKEN, nIdx);
+ SdDrawDocument* pTempDoc = mpDoc->OpenBookmarkDoc( aFileName );
+
+ // #69581: If I chose the standard-template I got no filename and so I get no
+ // SdDrawDocument-Pointer. But the method SetMasterPage is able to handle
+ // a NULL-pointer as a Standard-template ( look at SdDrawDocument::SetMasterPage )
+ OUString aLayoutName;
+ if( pTempDoc )
+ aLayoutName = aFile.getToken(0, DOCUMENT_TOKEN, nIdx);
+ for (auto nSelectedPage : aSelectedPageNums)
+ mpDoc->SetMasterPage(nSelectedPage, aLayoutName, pTempDoc, bMasterPage, bCheckMasters);
+ mpDoc->CloseBookmarkDoc();
+ }
+ else
+ {
+ // use master page with the layout name aFile from current Doc
+ for (auto nSelectedPage : aSelectedPageNums)
+ mpDoc->SetMasterPage(nSelectedPage, aFile, mpDoc, bMasterPage, bCheckMasters);
+ }
+
+ // remove blocking
+ if( dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr && !bCheckMasters )
+ static_cast<DrawView*>(mpView)->BlockPageOrderChangedHint(false);
+
+ // if the master page was visible, show it again
+ if (!aSelectedPages.empty())
+ {
+ if (bOnMaster)
+ {
+ if( auto pDrawViewShell = dynamic_cast<DrawViewShell *>( mpViewShell ))
+ {
+ ::sd::View* pView = pDrawViewShell->GetView();
+ for (auto pSelectedPage : aSelectedPages)
+ {
+ sal_uInt16 nPgNum = pSelectedPage->TRG_GetMasterPage().GetPageNum();
+
+ if (static_cast<DrawViewShell*>(mpViewShell)->GetPageKind() == PageKind::Notes)
+ nPgNum++;
+
+ pView->HideSdrPage();
+ pView->ShowSdrPage(pView->GetModel()->GetMasterPage(nPgNum));
+ }
+ }
+
+ // force update of TabBar
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_MASTERPAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ }
+ else
+ {
+ for (auto pSelectedPage : aSelectedPages)
+ pSelectedPage->SetAutoLayout(pSelectedPage->GetAutoLayout());
+ }
+ }
+
+ //Undo transfer to document selection
+ for (auto pPage : aUnselect)
+ mpDoc->SetSelected(pPage, false);
+
+
+ // fake a mode change to repaint the page tab bar
+ if( auto pDrawViewSh = dynamic_cast<DrawViewShell *>( mpViewShell ) )
+ {
+ EditMode eMode = pDrawViewSh->GetEditMode();
+ bool bLayer = pDrawViewSh->IsLayerModeActive();
+ pDrawViewSh->ChangeEditMode( eMode, !bLayer );
+ pDrawViewSh->ChangeEditMode( eMode, bLayer );
+ }
+
+ mpDocSh->SetWaitCursor( false );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuprobjs.cxx b/sd/source/ui/func/fuprobjs.cxx
new file mode 100644
index 000000000..6042d1fbc
--- /dev/null
+++ b/sd/source/ui/func/fuprobjs.cxx
@@ -0,0 +1,154 @@
+/* -*- 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 <fuprobjs.hxx>
+
+#include <svl/stritem.hxx>
+#include <svl/style.hxx>
+#include <editeng/outliner.hxx>
+#include <svl/hint.hxx>
+#include <tools/debug.hxx>
+
+#include <app.hrc>
+
+#include <strings.hxx>
+
+#include <drawdoc.hxx>
+#include <sfx2/sfxdlg.hxx>
+#include <DrawDocShell.hxx>
+#include <OutlineView.hxx>
+#include <OutlineViewShell.hxx>
+#include <ViewShell.hxx>
+#include <Window.hxx>
+#include <glob.hxx>
+#include <prlayout.hxx>
+#include <unchss.hxx>
+#include <sdabstdlg.hxx>
+#include <memory>
+
+namespace sd {
+
+
+FuPresentationObjects::FuPresentationObjects (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuPresentationObjects::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuPresentationObjects( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuPresentationObjects::DoExecute( SfxRequest& )
+{
+ OutlineViewShell* pOutlineViewShell = dynamic_cast< OutlineViewShell* >( mpViewShell );
+ DBG_ASSERT( pOutlineViewShell, "sd::FuPresentationObjects::DoExecute(), does not work without an OutlineViewShell!");
+ if( !pOutlineViewShell )
+ return;
+
+ /* does the selections end in a unique presentation layout?
+ if not, it is not allowed to edit the templates */
+ SfxItemSetFixed<SID_STATUS_LAYOUT, SID_STATUS_LAYOUT> aSet(mpDoc->GetItemPool() );
+ pOutlineViewShell->GetStatusBarState( aSet );
+ OUString aLayoutName = static_cast<const SfxStringItem&>(aSet.Get(SID_STATUS_LAYOUT)).GetValue();
+ DBG_ASSERT(!aLayoutName.isEmpty(), "Layout not defined");
+
+ bool bUnique = false;
+ sal_Int16 nDepth, nTmp;
+ OutlineView* pOlView = static_cast<OutlineView*>(pOutlineViewShell->GetView());
+ OutlinerView* pOutlinerView = pOlView->GetViewByWindow( static_cast<Window*>(mpWindow) );
+ ::Outliner* pOutl = pOutlinerView->GetOutliner();
+
+ std::vector<Paragraph*> aSelList;
+ pOutlinerView->CreateSelectionList(aSelList);
+
+ Paragraph* pPara = aSelList.empty() ? nullptr : aSelList.front();
+
+ nDepth = pOutl->GetDepth(pOutl->GetAbsPos( pPara ) );
+ bool bPage = ::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE );
+
+ for( const auto& rpPara : aSelList )
+ {
+ nTmp = pOutl->GetDepth( pOutl->GetAbsPos( rpPara ) );
+
+ if( nDepth != nTmp )
+ {
+ bUnique = false;
+ break;
+ }
+
+ if( ::Outliner::HasParaFlag( rpPara, ParaFlag::ISPAGE ) != bPage )
+ {
+ bUnique = false;
+ break;
+ }
+ bUnique = true;
+ }
+
+ if( !bUnique )
+ return;
+
+ OUString aStyleName = aLayoutName + SD_LT_SEPARATOR;
+ PresentationObjects ePO;
+
+ if( bPage )
+ {
+ ePO = PresentationObjects::Title;
+ aStyleName += STR_LAYOUT_TITLE;
+ }
+ else
+ {
+ ePO = static_cast<PresentationObjects>( static_cast<int>(PresentationObjects::Outline_1) + nDepth - 1 );
+ aStyleName += STR_LAYOUT_OUTLINE + " " + OUString::number(nDepth);
+ }
+
+ SfxStyleSheetBasePool* pStyleSheetPool = mpDocSh->GetStyleSheetPool();
+ SfxStyleSheetBase* pStyleSheet = pStyleSheetPool->Find( aStyleName, SfxStyleFamily::Page );
+ DBG_ASSERT(pStyleSheet, "StyleSheet missing");
+
+ if( !pStyleSheet )
+ return;
+
+ SfxStyleSheetBase& rStyleSheet = *pStyleSheet;
+
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<SfxAbstractTabDialog> pDlg(pFact->CreateSdPresLayoutTemplateDlg(mpDocSh, mpViewShell->GetFrameWeld(),
+ false, rStyleSheet, ePO, pStyleSheetPool));
+ if( pDlg->Execute() == RET_OK )
+ {
+ const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
+ // Undo-Action
+ mpDocSh->GetUndoManager()->AddUndoAction(
+ std::make_unique<StyleSheetUndoAction>(mpDoc, static_cast<SfxStyleSheet*>(pStyleSheet), pOutSet));
+
+ pStyleSheet->GetItemSet().Put( *pOutSet );
+ static_cast<SfxStyleSheet*>( pStyleSheet )->Broadcast( SfxHint( SfxHintId::DataChanged ) );
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuscale.cxx b/sd/source/ui/func/fuscale.cxx
new file mode 100644
index 000000000..d4730b243
--- /dev/null
+++ b/sd/source/ui/func/fuscale.cxx
@@ -0,0 +1,179 @@
+/* -*- 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 <fuscale.hxx>
+
+#include <svx/svxids.hrc>
+
+#include <app.hrc>
+#include <View.hxx>
+#include <Window.hxx>
+#include <OutlineViewShell.hxx>
+#include <drawdoc.hxx>
+#include <DrawViewShell.hxx>
+#include <ViewShell.hxx>
+#include <fuzoom.hxx>
+
+#include <svx/svdpagv.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/zoomitem.hxx>
+#include <sfx2/request.hxx>
+#include <svx/svxdlg.hxx>
+#include <memory>
+
+namespace sd {
+
+
+FuScale::FuScale (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuScale::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuScale( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuScale::DoExecute( SfxRequest& rReq )
+{
+ sal_Int16 nValue;
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ if( !pArgs )
+ {
+ SfxItemSetFixed<SID_ATTR_ZOOM, SID_ATTR_ZOOM> aNewAttr( mpDoc->GetPool() );
+ std::unique_ptr<SvxZoomItem> pZoomItem;
+ SvxZoomEnableFlags nZoomValues = SvxZoomEnableFlags::ALL;
+
+ nValue = static_cast<sal_Int16>(mpWindow->GetZoom());
+
+ // zoom on page size?
+ if( dynamic_cast< DrawViewShell *>( mpViewShell ) &&
+ static_cast<DrawViewShell*>(mpViewShell)->IsZoomOnPage() )
+ {
+ pZoomItem.reset(new SvxZoomItem( SvxZoomType::WHOLEPAGE, nValue ));
+ }
+ else
+ {
+ pZoomItem.reset(new SvxZoomItem( SvxZoomType::PERCENT, nValue ));
+ }
+
+ // limit range
+ if( mpViewShell )
+ {
+ if( dynamic_cast< DrawViewShell *>( mpViewShell ) != nullptr )
+ {
+ SdrPageView* pPageView = mpView->GetSdrPageView();
+ if( pPageView && pPageView->GetObjList()->GetObjCount() == 0 )
+ {
+ nZoomValues &= ~SvxZoomEnableFlags::OPTIMAL;
+ }
+ }
+ else if( dynamic_cast< OutlineViewShell *>( mpViewShell ) != nullptr )
+ {
+ nZoomValues &= ~SvxZoomEnableFlags::OPTIMAL;
+ nZoomValues &= ~SvxZoomEnableFlags::WHOLEPAGE;
+ nZoomValues &= ~SvxZoomEnableFlags::PAGEWIDTH;
+ }
+ }
+
+ pZoomItem->SetValueSet( nZoomValues );
+ aNewAttr.Put( std::move(pZoomItem) );
+
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractSvxZoomDialog> pDlg(pFact->CreateSvxZoomDialog(rReq.GetFrameWeld(), aNewAttr));
+ pDlg->SetLimits( static_cast<sal_uInt16>(mpWindow->GetMinZoom()), static_cast<sal_uInt16>(mpWindow->GetMaxZoom()) );
+ sal_uInt16 nResult = pDlg->Execute();
+ switch( nResult )
+ {
+ case RET_CANCEL:
+ {
+ rReq.Ignore ();
+ return; // Cancel
+ }
+ default:
+ {
+ rReq.Ignore ();
+ }
+ break;
+ }
+
+ const SfxItemSet aArgs (*(pDlg->GetOutputItemSet ()));
+
+ pDlg.disposeAndClear();
+
+ if (!mpViewShell)
+ return;
+
+ switch ( aArgs.Get (SID_ATTR_ZOOM).GetType ())
+ {
+ case SvxZoomType::PERCENT:
+ {
+ nValue = aArgs.Get (SID_ATTR_ZOOM).GetValue ();
+
+ mpViewShell->SetZoom( nValue );
+
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArrayZoom );
+ }
+ break;
+
+ case SvxZoomType::OPTIMAL:
+ {
+ if( dynamic_cast< DrawViewShell *>( mpViewShell ) != nullptr )
+ {
+ // name confusion: SID_SIZE_ALL -> zoom onto all objects
+ // --> the program offers it as optimal
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_ALL, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ }
+ }
+ break;
+
+ case SvxZoomType::PAGEWIDTH:
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_PAGE_WIDTH, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ break;
+
+ case SvxZoomType::WHOLEPAGE:
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_SIZE_PAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ break;
+ default:
+ break;
+ }
+ }
+ else if(mpViewShell && (pArgs->Count () == 1))
+ {
+ const SfxUInt32Item* pScale = rReq.GetArg<SfxUInt32Item>(ID_VAL_ZOOM);
+ mpViewShell->SetZoom (pScale->GetValue ());
+
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArrayZoom );
+ }
+
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fusearch.cxx b/sd/source/ui/func/fusearch.cxx
new file mode 100644
index 000000000..73a112bf4
--- /dev/null
+++ b/sd/source/ui/func/fusearch.cxx
@@ -0,0 +1,140 @@
+/* -*- 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 <fusearch.hxx>
+
+#include <sfx2/viewfrm.hxx>
+
+#include <sfx2/bindings.hxx>
+#include <fupoor.hxx>
+#include <drawdoc.hxx>
+#include <app.hrc>
+#include <Outliner.hxx>
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <OutlineViewShell.hxx>
+#include <ViewShellBase.hxx>
+
+class SfxRequest;
+
+namespace sd {
+
+const sal_uInt16 SidArraySpell[] = {
+ SID_DRAWINGMODE,
+ SID_OUTLINE_MODE,
+ SID_SLIDE_SORTER_MODE,
+ SID_NOTES_MODE,
+ SID_HANDOUT_MASTER_MODE,
+ SID_SLIDE_MASTER_MODE,
+ SID_NOTES_MASTER_MODE,
+ 0 };
+
+FuSearch::FuSearch (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq )
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq),
+ m_pSdOutliner(nullptr),
+ m_bOwnOutliner(false)
+{
+}
+
+FuSearch* FuSearch::createPtr(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq)
+{
+ FuSearch* xFunc( new FuSearch( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuSearch::DoExecute( SfxRequest& )
+{
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArraySpell );
+
+ if ( dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr )
+ {
+ m_bOwnOutliner = true;
+ m_pSdOutliner = new SdOutliner( mpDoc, OutlinerMode::TextObject );
+ }
+ else if ( dynamic_cast< const OutlineViewShell *>( mpViewShell ) != nullptr )
+ {
+ m_bOwnOutliner = false;
+ m_pSdOutliner = mpDoc->GetOutliner();
+ }
+
+ if (m_pSdOutliner)
+ m_pSdOutliner->PrepareSpelling();
+}
+
+FuSearch::~FuSearch()
+{
+ if ( ! mpDocSh->IsInDestruction() && mpDocSh->GetViewShell()!=nullptr)
+ mpDocSh->GetViewShell()->GetViewFrame()->GetBindings().Invalidate( SidArraySpell );
+
+ if (m_pSdOutliner)
+ m_pSdOutliner->EndSpelling();
+
+ if (m_bOwnOutliner)
+ delete m_pSdOutliner;
+}
+
+void FuSearch::SearchAndReplace( const SvxSearchItem* pSearchItem )
+{
+ ViewShellBase* pBase = dynamic_cast<ViewShellBase*>( SfxViewShell::Current() );
+ ViewShell* pViewShell = nullptr;
+ if (pBase != nullptr)
+ pViewShell = pBase->GetMainViewShell().get();
+
+ if (pViewShell == nullptr)
+ return;
+
+ if (m_pSdOutliner && dynamic_cast<const DrawViewShell*>(pViewShell) && !m_bOwnOutliner)
+ {
+ m_pSdOutliner->EndSpelling();
+
+ m_bOwnOutliner = true;
+ m_pSdOutliner = new SdOutliner(mpDoc, OutlinerMode::TextObject);
+ m_pSdOutliner->PrepareSpelling();
+ }
+ else if (m_pSdOutliner && dynamic_cast<const OutlineViewShell*>(pViewShell) && m_bOwnOutliner)
+ {
+ m_pSdOutliner->EndSpelling();
+ delete m_pSdOutliner;
+
+ m_bOwnOutliner = false;
+ m_pSdOutliner = mpDoc->GetOutliner();
+ m_pSdOutliner->PrepareSpelling();
+ }
+
+ if (m_pSdOutliner)
+ {
+ bool bEndSpelling = m_pSdOutliner->StartSearchAndReplace(pSearchItem);
+
+ if (bEndSpelling)
+ {
+ m_pSdOutliner->EndSpelling();
+ m_pSdOutliner->PrepareSpelling();
+ }
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fusel.cxx b/sd/source/ui/func/fusel.cxx
new file mode 100644
index 000000000..a525f3bfc
--- /dev/null
+++ b/sd/source/ui/func/fusel.cxx
@@ -0,0 +1,1328 @@
+/* -*- 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 <fusel.hxx>
+#include <svx/svddrgmt.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdogrp.hxx>
+#include <svx/scene3d.hxx>
+#include <vcl/imapobj.hxx>
+#include <unotools/securityoptions.hxx>
+#include <svx/svxids.hrc>
+#include <svx/xfillit0.hxx>
+#include <svx/ImageMapInfo.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svl/stritem.hxx>
+#include <svl/intitem.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/docfile.hxx>
+#include <editeng/flditem.hxx>
+
+#include <svx/svdotable.hxx>
+
+#include <app.hrc>
+
+#include <sdmod.hxx>
+#include <DrawDocShell.hxx>
+#include <stlpool.hxx>
+#include <fudraw.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <FrameView.hxx>
+#include <View.hxx>
+#include <Window.hxx>
+#include <drawdoc.hxx>
+#include <DrawViewShell.hxx>
+#include <ToolBarManager.hxx>
+#include <Client.hxx>
+
+#include <svx/svdundo.hxx>
+
+#include <svx/sdrhittesthelper.hxx>
+#include <svx/diagram/IDiagramHelper.hxx>
+
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+#include <comphelper/lok.hxx>
+
+using namespace ::com::sun::star;
+
+namespace sd {
+
+FuSelection::FuSelection (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuDraw(pViewSh, pWin, pView, pDoc, rReq),
+ bTempRotation(false),
+ bSelectionChanged(false),
+ pHdl(nullptr),
+ bSuppressChangesOfSelection(false),
+ bMirrorSide0(false),
+ nEditMode(SID_BEZIER_MOVE),
+ pWaterCanCandidate(nullptr)
+ //Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point,
+ //and SHIFT+ENTER key to decide the position and draw the new insert point
+ ,bBeginInsertPoint(false),
+ oldPoint(0,0)
+ ,bMovedToCenterPoint(false)
+{
+}
+
+rtl::Reference<FuPoor> FuSelection::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuSelection( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuSelection::DoExecute( SfxRequest& rReq )
+{
+ FuDraw::DoExecute( rReq );
+
+ // Select object bar
+ SelectionHasChanged();
+}
+
+FuSelection::~FuSelection()
+{
+ mpView->UnmarkAllPoints();
+ mpView->ResetCreationActive();
+
+ if ( mpView->GetDragMode() != SdrDragMode::Move )
+ {
+ mpView->SetDragMode(SdrDragMode::Move);
+ }
+}
+
+namespace {
+ bool lcl_followHyperlinkAllowed(const MouseEvent& rMEvt) {
+ if (!rMEvt.IsMod1() && SvtSecurityOptions::IsOptionSet(SvtSecurityOptions::EOption::CtrlClickHyperlink))
+ return false;
+ if (rMEvt.IsMod1() && !SvtSecurityOptions::IsOptionSet(SvtSecurityOptions::EOption::CtrlClickHyperlink))
+ return false;
+ return true;
+ }
+}
+
+bool FuSelection::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ pHdl = nullptr;
+ bool bReturn = FuDraw::MouseButtonDown(rMEvt);
+ bool bWaterCan = SD_MOD()->GetWaterCan();
+ const bool bReadOnly = mpDocSh->IsReadOnly();
+ // When the right mouse button is pressed then only select objects
+ // (and deselect others) as a preparation for showing the context
+ // menu.
+ const bool bSelectionOnly = rMEvt.IsRight();
+
+ bMBDown = true;
+ bSelectionChanged = false;
+
+ if ( mpView->IsAction() )
+ {
+ if ( rMEvt.IsRight() )
+ mpView->BckAction();
+ return true;
+ }
+
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+ sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
+
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ // When tiled rendering, we always work in logic units, use the non-pixel constants.
+ nDrgLog = DRGLOG;
+ nHitLog = HITLOG;
+ }
+
+ // The following code is executed for right clicks as well as for left
+ // clicks in order to modify the selection for the right button as a
+ // preparation for the context menu. The functions BegMarkObject() and
+ // BegDragObject(), however, are not called for right clicks because a)
+ // it makes no sense and b) to have IsAction() return sal_False when called
+ // from Command() which is a prerequisite for the context menu.
+ if ((rMEvt.IsLeft() || rMEvt.IsRight())
+ && !mpView->IsAction()
+ && (mpView->IsFrameDragSingles() || !mpView->HasMarkablePoints()))
+ {
+ /******************************************************************
+ * NO BEZIER_EDITOR
+ ******************************************************************/
+ mpWindow->CaptureMouse();
+ pHdl = mpView->PickHandle(aMDPos);
+
+ Degree100 nAngle0 = GetAngle(aMDPos - mpView->GetRef1());
+ nAngle0 -= 27000_deg100;
+ nAngle0 = NormAngle36000(nAngle0);
+ bMirrorSide0 = nAngle0 < 18000_deg100;
+
+ if (!pHdl && mpView->Is3DRotationCreationActive())
+ {
+ /******************************************************************
+ * If 3D-rotation bodies are about to be created,
+ * end creation now.
+ ******************************************************************/
+ bSuppressChangesOfSelection = true;
+ mpWindow->EnterWait();
+ mpView->End3DCreation();
+ bSuppressChangesOfSelection = false;
+ mpView->ResetCreationActive();
+ mpWindow->LeaveWait();
+ }
+
+ bool bTextEdit = false;
+ SdrViewEvent aVEvt;
+ SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+
+ if (eHit == SdrHitKind::TextEditObj && (mpViewShell->GetFrameView()->IsQuickEdit() || dynamic_cast< sdr::table::SdrTableObj* >(aVEvt.mpObj) != nullptr))
+ {
+ bTextEdit = true;
+ }
+
+ // When clicking into a URl field, also go to text edit mode (when not following the link)
+ if (!bTextEdit && eHit == SdrHitKind::UrlField && !rMEvt.IsMod2() && !lcl_followHyperlinkAllowed(rMEvt))
+ bTextEdit = true;
+
+ bool bPreventModify = mpDocSh->IsReadOnly();
+ if (bPreventModify && mpDocSh->GetSignPDFCertificate().is())
+ {
+ // If the just added signature line shape is selected, allow moving / resizing it.
+ bPreventModify = false;
+ }
+
+ if(!bTextEdit
+ && !bPreventModify
+ && ((mpView->IsMarkedHit(aMDPos, nHitLog) && !rMEvt.IsShift() && !rMEvt.IsMod2()) || pHdl != nullptr)
+ && (rMEvt.GetClicks() != 2)
+ )
+ {
+ if (!pHdl && mpView->Is3DRotationCreationActive())
+ {
+ // Switch between 3D-rotation body -> selection
+ mpView->ResetCreationActive();
+ }
+ else if (bWaterCan)
+ {
+ // Remember the selected object for proper handling in
+ // MouseButtonUp().
+ pWaterCanCandidate = pickObject (aMDPos);
+ }
+ else
+ {
+ // hit handle or marked object
+ bFirstMouseMove = true;
+ aDragTimer.Start();
+ }
+
+ if ( ! rMEvt.IsRight())
+ if (mpView->BegDragObj(aMDPos, nullptr, pHdl, nDrgLog))
+ mpView->GetDragMethod()->SetShiftPressed( rMEvt.IsShift() );
+ bReturn = true;
+ }
+ else
+ {
+ SdrPageView* pPV = nullptr;
+ SdrObject* pObj = !rMEvt.IsMod2() ? mpView->PickObj(aMDPos, mpView->getHitTolLog(), pPV, SdrSearchOptions::PICKMACRO) : nullptr;
+ if (pObj)
+ {
+ mpView->BegMacroObj(aMDPos, nHitLog, pObj, pPV, mpWindow);
+ bReturn = true;
+ }
+ else if ( bTextEdit )
+ {
+ SdrObjKind nSdrObjKind = aVEvt.mpObj->GetObjIdentifier();
+
+ if (aVEvt.mpObj->GetObjInventor() == SdrInventor::Default &&
+ (nSdrObjKind == SdrObjKind::Text ||
+ nSdrObjKind == SdrObjKind::TitleText ||
+ nSdrObjKind == SdrObjKind::OutlineText ||
+ !aVEvt.mpObj->IsEmptyPresObj()))
+ {
+ // Seamless Editing: branch to text input
+ if (!rMEvt.IsShift())
+ mpView->UnmarkAll();
+
+ SfxUInt16Item aItem(SID_TEXTEDIT, 1);
+ mpViewShell->GetViewFrame()->GetDispatcher()->
+ ExecuteList(SID_TEXTEDIT,
+ SfxCallMode::SYNCHRON | SfxCallMode::RECORD,
+ { &aItem });
+ return bReturn; // CAUTION, due to the synchronous slot the object is deleted now
+ }
+ }
+ else if ( !rMEvt.IsMod2() && rMEvt.GetClicks() == 1 &&
+ aVEvt.meEvent == SdrEventKind::ExecuteUrl )
+ {
+ mpWindow->ReleaseMouse();
+
+ // If tiled rendering, let client handles URL execution and early returns.
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ SfxViewShell& rSfxViewShell = mpViewShell->GetViewShellBase();
+ rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_HYPERLINK_CLICKED, aVEvt.mpURLField->GetURL().toUtf8().getStr());
+ return true;
+ }
+
+ if (!lcl_followHyperlinkAllowed(rMEvt))
+ return true;
+
+ SfxStringItem aStrItem(SID_FILE_NAME, aVEvt.mpURLField->GetURL());
+ SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName());
+ SfxBoolItem aBrowseItem( SID_BROWSE, true );
+ SfxViewFrame* pFrame = mpViewShell->GetViewFrame();
+ mpWindow->ReleaseMouse();
+
+ if (rMEvt.IsMod1())
+ {
+ // Open in new frame
+ pFrame->GetDispatcher()->ExecuteList(SID_OPENDOC,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aStrItem, &aBrowseItem, &aReferer });
+ }
+ else
+ {
+ // Open in current frame
+ SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame);
+ pFrame->GetDispatcher()->ExecuteList(SID_OPENDOC,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aStrItem, &aFrameItem, &aBrowseItem, &aReferer });
+ }
+
+ bReturn = true;
+ }
+ else if(!rMEvt.IsMod2()
+ && dynamic_cast< const DrawViewShell *>( mpViewShell ) != nullptr
+ )
+ {
+ pObj = mpView->PickObj(aMDPos, mpView->getHitTolLog(), pPV, SdrSearchOptions::ALSOONMASTER);
+ if (pObj)
+ {
+ // Handle ImageMap click when not just selecting
+ if (!bSelectionOnly)
+ {
+ if (lcl_followHyperlinkAllowed(rMEvt))
+ bReturn = HandleImageMapClick(pObj, aMDPos);
+ }
+
+ if (!bReturn
+ && (dynamic_cast<const SdrObjGroup*>(pObj) != nullptr
+ || dynamic_cast<const E3dScene*>(pObj) != nullptr))
+ {
+ if (rMEvt.GetClicks() == 1)
+ {
+ // Look into the group
+ pObj = mpView->PickObj(aMDPos, mpView->getHitTolLog(), pPV,
+ SdrSearchOptions::ALSOONMASTER
+ | SdrSearchOptions::DEEP);
+ if (pObj && lcl_followHyperlinkAllowed(rMEvt))
+ bReturn = HandleImageMapClick(pObj, aMDPos);
+ }
+ else if (!bReadOnly && rMEvt.GetClicks() == 2)
+ {
+ // New: double click on selected Group object
+ // enter group
+ if (!bSelectionOnly
+ && pObj->getSdrPageFromSdrObject() == pPV->GetPage())
+ bReturn = pPV->EnterGroup(pObj);
+ }
+ }
+ }
+
+ // #i71727# replaced else here with two possibilities, once the original else (!pObj)
+ // and also ignoring the found object when it's on a masterpage
+ if(!pObj || (pObj->getSdrPageFromSdrObject() && pObj->getSdrPageFromSdrObject()->IsMasterPage()))
+ {
+ if(mpView->IsGroupEntered() && 2 == rMEvt.GetClicks())
+ {
+ // New: double click on empty space/on obj on MasterPage, leave group
+ mpView->LeaveOneGroup();
+ bReturn = true;
+ }
+ }
+ }
+
+ if (!bReturn)
+ {
+ if (bWaterCan)
+ {
+ if ( ! (rMEvt.IsShift() || rMEvt.IsMod2()))
+ {
+ // Find the object under the current mouse position
+ // and store it for the MouseButtonUp() method to
+ // evaluate.
+ pWaterCanCandidate = pickObject (aMDPos);
+ }
+ }
+ else
+ {
+ bReturn = true;
+ bool bDeactivateOLE = false;
+
+ if ( !rMEvt.IsShift() && !rMEvt.IsMod2() )
+ {
+ OSL_ASSERT (mpViewShell->GetViewShell()!=nullptr);
+ Client* pIPClient = static_cast<Client*>(
+ mpViewShell->GetViewShell()->GetIPClient());
+
+ if (pIPClient && pIPClient->IsObjectInPlaceActive())
+ {
+ // OLE-object gets deactivated in subsequent UnmarkAll()
+ bDeactivateOLE = true;
+ }
+
+ mpView->UnmarkAll();
+ }
+
+ bool bMarked = false;
+
+ if ( !rMEvt.IsMod1() && !bDeactivateOLE)
+ {
+ if ( rMEvt.IsMod2() )
+ {
+ bMarked = mpView->MarkNextObj(aMDPos, nHitLog, rMEvt.IsShift() );
+ }
+ else
+ {
+ bool bToggle = false;
+
+ if (rMEvt.IsShift() && mpView->GetMarkedObjectList().GetMarkCount() > 1)
+ {
+ // No Toggle on single selection
+ bToggle = true;
+ }
+
+ bMarked = mpView->MarkObj(aMDPos, nHitLog, bToggle);
+ }
+ }
+
+ if( !bDeactivateOLE )
+ {
+ if ( !bReadOnly &&
+ bMarked &&
+ (!rMEvt.IsShift() || mpView->IsMarkedHit(aMDPos, nHitLog)))
+ {
+ /**********************************************************
+ * Move object
+ **********************************************************/
+ aDragTimer.Start();
+
+ pHdl=mpView->PickHandle(aMDPos);
+ if ( ! rMEvt.IsRight())
+ mpView->BegDragObj(aMDPos, nullptr, pHdl, nDrgLog);
+ }
+ else
+ {
+ /**********************************************************
+ * Select object
+ **********************************************************/
+ if ( ! rMEvt.IsRight())
+ mpView->BegMarkObj(aMDPos);
+ }
+ }
+
+ if( bMarked && bTempRotation && (nSlotId == SID_OBJECT_ROTATE) && !rMEvt.IsShift() && (rMEvt.GetClicks() != 2) )
+ {
+ nSlotId = SID_OBJECT_SELECT;
+ Activate();
+ }
+ }
+ }
+ }
+ }
+ else if ( !bReadOnly
+ && (rMEvt.IsLeft() || rMEvt.IsRight())
+ && !mpView->IsAction())
+ {
+ /**********************************************************************
+ * BEZIER-EDITOR
+ **********************************************************************/
+ mpWindow->CaptureMouse();
+ SdrViewEvent aVEvt;
+ SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+
+ if (eHit == SdrHitKind::Handle && aVEvt.mpHdl->GetKind() == SdrHdlKind::BezierWeight)
+ {
+ /******************************************************************
+ * Drag Handle
+ ******************************************************************/
+ if ( ! rMEvt.IsRight())
+ mpView->BegDragObj(aMDPos, nullptr, aVEvt.mpHdl, nDrgLog);
+ }
+ else if (eHit == SdrHitKind::MarkedObject && nEditMode == SID_BEZIER_INSERT)
+ {
+ /******************************************************************
+ * Insert gluepoint
+ ******************************************************************/
+ mpView->BegInsObjPoint(aMDPos, rMEvt.IsMod1());
+ }
+ else if (eHit == SdrHitKind::MarkedObject && rMEvt.IsMod1())
+ {
+ /******************************************************************
+ * Select gluepoint
+ ******************************************************************/
+ if (!rMEvt.IsShift())
+ mpView->UnmarkAllPoints();
+
+ if ( ! rMEvt.IsRight())
+ mpView->BegMarkPoints(aMDPos);
+ }
+ else if (eHit == SdrHitKind::MarkedObject && !rMEvt.IsShift() && !rMEvt.IsMod2())
+ {
+ /******************************************************************
+ * Move object
+ ******************************************************************/
+ if ( ! rMEvt.IsRight())
+ mpView->BegDragObj(aMDPos, nullptr, nullptr, nDrgLog);
+ }
+ else if (eHit == SdrHitKind::Handle)
+ {
+ /******************************************************************
+ * Select gluepoint
+ ******************************************************************/
+ if (!mpView->IsPointMarked(*aVEvt.mpHdl) || rMEvt.IsShift())
+ {
+ if (!rMEvt.IsShift())
+ {
+ mpView->UnmarkAllPoints();
+ pHdl = mpView->PickHandle(aMDPos);
+ }
+ else
+ {
+ if (mpView->IsPointMarked(*aVEvt.mpHdl))
+ {
+ mpView->UnmarkPoint(*aVEvt.mpHdl);
+ pHdl = nullptr;
+ }
+ else
+ {
+ pHdl = mpView->PickHandle(aMDPos);
+ }
+ }
+
+ if (pHdl)
+ {
+ mpView->MarkPoint(*pHdl);
+ if ( ! rMEvt.IsRight())
+ mpView->BegDragObj(aMDPos, nullptr, pHdl, nDrgLog);
+
+ }
+ }
+ else
+ {
+ // Point IS marked and NO shift is pressed. Start
+ // dragging of selected point(s)
+ pHdl = mpView->PickHandle(aMDPos);
+ if(pHdl && ! rMEvt.IsRight())
+ mpView->BegDragObj(aMDPos, nullptr, pHdl, nDrgLog);
+ }
+ }
+ else
+ {
+ /******************************************************************
+ * Select or drag object
+ ******************************************************************/
+ if (!rMEvt.IsShift() && !rMEvt.IsMod2() && eHit == SdrHitKind::UnmarkedObject)
+ {
+ mpView->UnmarkAllObj();
+ }
+
+ bool bMarked = false;
+
+ if (!rMEvt.IsMod1())
+ {
+ if (rMEvt.IsMod2())
+ {
+ bMarked = mpView->MarkNextObj(aMDPos, nHitLog, rMEvt.IsShift());
+ }
+ else
+ {
+ bMarked = mpView->MarkObj(aMDPos, nHitLog, rMEvt.IsShift());
+ }
+ }
+
+ if (bMarked &&
+ (!rMEvt.IsShift() || eHit == SdrHitKind::MarkedObject))
+ {
+ // Move object
+ if ( ! rMEvt.IsRight())
+ mpView->BegDragObj(aMDPos, nullptr, aVEvt.mpHdl, nDrgLog);
+ }
+ else if (mpView->AreObjectsMarked())
+ {
+ /**************************************************************
+ * Select gluepoint
+ **************************************************************/
+ if (!rMEvt.IsShift())
+ mpView->UnmarkAllPoints();
+
+ if ( ! rMEvt.IsRight())
+ mpView->BegMarkPoints(aMDPos);
+ }
+ else
+ {
+ /**************************************************************
+ * Select object
+ **************************************************************/
+ if ( ! rMEvt.IsRight())
+ mpView->BegMarkObj(aMDPos);
+ }
+
+ ForcePointer(&rMEvt);
+ }
+ }
+
+ if (!bIsInDragMode)
+ {
+ ForcePointer(&rMEvt);
+ }
+
+ return bReturn;
+}
+
+bool FuSelection::MouseMove(const MouseEvent& rMEvt)
+{
+ bool bReturn = FuDraw::MouseMove(rMEvt);
+
+ if (aDragTimer.IsActive())
+ {
+ if(bFirstMouseMove)
+ {
+ bFirstMouseMove = false;
+ }
+ else
+ {
+ aDragTimer.Stop();
+ }
+ }
+
+ if (mpView->IsAction())
+ {
+ Point aPix(rMEvt.GetPosPixel());
+ Point aPnt(mpWindow->PixelToLogic(aPix));
+
+ ForceScroll(aPix);
+
+ if (mpView->IsInsObjPoint())
+ {
+ mpView->MovInsObjPoint(aPnt);
+ }
+ else
+ {
+ mpView->MovAction(aPnt);
+ }
+ }
+
+ ForcePointer(&rMEvt);
+
+ return bReturn;
+}
+
+bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ bool bReturn = false;
+ // When the right mouse button is pressed then only select objects
+ // (and deselect others) as a preparation for showing the context
+ // menu.
+ const bool bSelectionOnly = rMEvt.IsRight();
+
+ if (aDragTimer.IsActive() )
+ {
+ aDragTimer.Stop();
+ bIsInDragMode = false;
+ }
+
+ if( !mpView )
+ return false;
+
+ Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
+ sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+
+ if (mpView->IsFrameDragSingles() || !mpView->HasMarkablePoints())
+ {
+ /**********************************************************************
+ * NO BEZIER_EDITOR
+ **********************************************************************/
+ if ( mpView->IsDragObj() )
+ {
+ /******************************************************************
+ * Object was moved
+ ******************************************************************/
+ FrameView* pFrameView = mpViewShell->GetFrameView();
+ bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy());
+
+ if (bDragWithCopy)
+ {
+ bDragWithCopy = !mpView->IsPresObjSelected(false);
+ }
+
+ mpView->SetDragWithCopy(bDragWithCopy);
+ bool bWasDragged(mpView->EndDragObj( mpView->IsDragWithCopy() ));
+
+ mpView->ForceMarkedToAnotherPage();
+
+ if (!rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() &&
+ !bSelectionChanged &&
+ std::abs(aPnt.X() - aMDPos.X()) < nDrgLog &&
+ std::abs(aPnt.Y() - aMDPos.Y()) < nDrgLog)
+ {
+ /*************************************************************
+ * If a user wants to click on an object in front of a marked
+ * one, he releases the mouse button immediately
+ **************************************************************/
+ SdrPageView* pPV;
+ SdrObject* pObj = mpView->PickObj(aMDPos, mpView->getHitTolLog(), pPV, SdrSearchOptions::ALSOONMASTER | SdrSearchOptions::BEFOREMARK);
+ if (pObj && pPV->IsObjMarkable(pObj))
+ {
+ mpView->UnmarkAllObj();
+ mpView->MarkObj(pObj,pPV);
+ return true;
+ }
+
+ // check for single object selected
+ SdrObject* pSingleObj = nullptr;
+
+ if (mpView->GetMarkedObjectList().GetMarkCount()==1)
+ {
+ pSingleObj = mpView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
+ }
+
+ // Check for click on svx::diagram::DiagramFrameHdl
+ // - if we hit a SdrHdl
+ // - if it was not moved
+ // - if single object is selected
+ // - and it is a Diagram
+ if(pHdl && !bWasDragged && nullptr != pSingleObj && pSingleObj->isDiagram())
+ {
+ svx::diagram::DiagramFrameHdl* pDiagramFrameHdl(dynamic_cast<svx::diagram::DiagramFrameHdl*>(pHdl));
+ if(nullptr != pDiagramFrameHdl)
+ {
+ // let the DiagramFrameHdl decide what to do
+ svx::diagram::DiagramFrameHdl::clicked(aPnt);
+ }
+ }
+
+ /**************************************************************
+ * Toggle between selection and rotation
+ **************************************************************/
+ if (nSlotId == SID_OBJECT_SELECT
+ && !comphelper::LibreOfficeKit::isActive()
+ && mpView->IsRotateAllowed()
+
+ && (rMEvt.GetClicks() != 2)
+ && (mpViewShell->GetFrameView()->IsClickChangeRotation()
+ || (pSingleObj
+ && pSingleObj->GetObjInventor()==SdrInventor::E3d))
+ && ! bSelectionOnly)
+
+ {
+ bTempRotation = true;
+ nSlotId = SID_OBJECT_ROTATE;
+ Activate();
+ }
+ else if (nSlotId == SID_OBJECT_ROTATE)
+ {
+ nSlotId = SID_OBJECT_SELECT;
+ Activate();
+ }
+ }
+ else if (nSlotId == SID_CONVERT_TO_3D_LATHE)
+ {
+ if (!pHdl)
+ {
+ bSuppressChangesOfSelection = true;
+ mpView->Start3DCreation();
+ bSuppressChangesOfSelection = false;
+ }
+ else if (pHdl->GetKind() != SdrHdlKind::MirrorAxis &&
+ pHdl->GetKind() != SdrHdlKind::Ref1 &&
+ pHdl->GetKind() != SdrHdlKind::Ref2 && mpView->Is3DRotationCreationActive())
+ {
+ /*********************************************************
+ * If 3D-rotation bodies are about to be created,
+ * end creation now
+ **********************************************************/
+ Degree100 nAngle1 = GetAngle(aPnt - mpView->GetRef1());
+ nAngle1 -= 27000_deg100;
+ nAngle1 = NormAngle36000(nAngle1);
+ bool bMirrorSide1 = nAngle1 < 18000_deg100;
+
+ if (bMirrorSide0 != bMirrorSide1)
+ {
+ bSuppressChangesOfSelection = true;
+ mpWindow->EnterWait();
+ mpView->End3DCreation();
+ bSuppressChangesOfSelection = false;
+ nSlotId = SID_OBJECT_SELECT;
+ mpWindow->LeaveWait();
+ Activate();
+ }
+ }
+ }
+ }
+ else if (rMEvt.IsMod1()
+ && !rMEvt.IsMod2()
+ && std::abs(aPnt.X() - aMDPos.X()) < nDrgLog
+ && std::abs(aPnt.Y() - aMDPos.Y()) < nDrgLog)
+ {
+ // Enter group
+ mpView->MarkObj(aPnt, nHitLog, rMEvt.IsShift(), rMEvt.IsMod1());
+ }
+
+ if (mpView->IsAction() )
+ {
+ mpView->EndAction();
+ }
+
+ if( SD_MOD()->GetWaterCan() )
+ {
+ if( rMEvt.IsRight() )
+ {
+ // In watering-can mode, on press onto right mouse button, an undo is executed
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_UNDO, SfxCallMode::ASYNCHRON );
+ }
+ else if (pWaterCanCandidate != nullptr)
+ {
+ // Is the candidate object still under the mouse?
+ if (pickObject (aPnt) == pWaterCanCandidate)
+ {
+ SdStyleSheetPool* pPool = static_cast<SdStyleSheetPool*>(
+ mpDocSh->GetStyleSheetPool());
+ if (pPool != nullptr)
+ {
+ SfxStyleSheet* pStyleSheet = static_cast<SfxStyleSheet*>(
+ pPool->GetActualStyleSheet());
+ if (pStyleSheet != nullptr && mpView->IsUndoEnabled() )
+ {
+ // Added UNDOs for the WaterCan mode. This was never done in
+ // the past, thus it was missing all the time.
+ std::unique_ptr<SdrUndoAction> pUndoAttr = mpDoc->GetSdrUndoFactory().CreateUndoAttrObject(*pWaterCanCandidate, true, true);
+ mpView->BegUndo(pUndoAttr->GetComment());
+ mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoGeoObject(*pWaterCanCandidate));
+ mpView->AddUndo(std::move(pUndoAttr));
+
+ pWaterCanCandidate->SetStyleSheet (pStyleSheet, false);
+
+ mpView->EndUndo();
+ }
+ }
+ }
+ }
+ // else when there has been no object under the mouse when the
+ // button was pressed then nothing happens even when there is
+ // one now.
+ }
+
+ sal_uInt16 nClicks = rMEvt.GetClicks();
+
+ if (nClicks == 2 && rMEvt.IsLeft() && bMBDown &&
+ !rMEvt.IsMod1() && !rMEvt.IsShift() )
+ {
+ DoubleClick(rMEvt);
+ }
+
+ bMBDown = false;
+
+ ForcePointer(&rMEvt);
+ pHdl = nullptr;
+ mpWindow->ReleaseMouse();
+ SdrObject* pSingleObj = nullptr;
+ const size_t nMarkCount = mpView->GetMarkedObjectList().GetMarkCount();
+
+ if (nMarkCount==1)
+ {
+ pSingleObj = mpView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
+ }
+
+ if ( (nSlotId != SID_OBJECT_SELECT && nMarkCount==0) ||
+ ( mpView->GetDragMode() == SdrDragMode::Crook &&
+ !mpView->IsCrookAllowed( mpView->IsCrookNoContortion() ) ) ||
+ ( mpView->GetDragMode() == SdrDragMode::Shear &&
+ !mpView->IsShearAllowed() && !mpView->IsDistortAllowed() ) ||
+ ( nSlotId==SID_CONVERT_TO_3D_LATHE && pSingleObj &&
+ (pSingleObj->GetObjInventor() != SdrInventor::Default ||
+ pSingleObj->GetObjIdentifier() == SdrObjKind::Measure) ) )
+ {
+ bReturn = true;
+ ForcePointer(&rMEvt);
+ pHdl = nullptr;
+ mpWindow->ReleaseMouse();
+ FuDraw::MouseButtonUp(rMEvt);
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::SYNCHRON);
+ return bReturn; // CAUTION, due to the synchronous slot, the object is deleted now.
+ }
+
+ FuDraw::MouseButtonUp(rMEvt);
+ }
+ else
+ {
+ /**********************************************************************
+ * BEZIER_EDITOR
+ **********************************************************************/
+ if ( mpView->IsAction() )
+ {
+ if ( mpView->IsInsObjPoint() )
+ {
+ mpView->EndInsObjPoint(SdrCreateCmd::ForceEnd);
+ }
+ else if ( mpView->IsDragObj() )
+ {
+ FrameView* pFrameView = mpViewShell->GetFrameView();
+ bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy());
+
+ if (bDragWithCopy)
+ {
+ bDragWithCopy = !mpView->IsPresObjSelected(false);
+ }
+
+ mpView->SetDragWithCopy(bDragWithCopy);
+ mpView->EndDragObj( mpView->IsDragWithCopy() );
+ }
+ else
+ {
+ mpView->EndAction();
+
+ sal_uInt16 nDrgLog2 = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+ Point aPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() );
+
+ if (std::abs(aMDPos.X() - aPos.X()) < nDrgLog2 &&
+ std::abs(aMDPos.Y() - aPos.Y()) < nDrgLog2 &&
+ !rMEvt.IsShift() && !rMEvt.IsMod2())
+ {
+ SdrViewEvent aVEvt;
+ SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+
+ if (eHit == SdrHitKind::NONE)
+ {
+ // Click on the same place - unselect
+ mpView->UnmarkAllObj();
+ }
+ }
+ }
+ }
+ else if (!rMEvt.IsShift() && rMEvt.IsMod1() && !rMEvt.IsMod2() &&
+ std::abs(aPnt.X() - aMDPos.X()) < nDrgLog &&
+ std::abs(aPnt.Y() - aMDPos.Y()) < nDrgLog)
+ {
+ // Enter group
+ mpView->MarkObj(aPnt, nHitLog, false, rMEvt.IsMod1());
+ }
+
+ ForcePointer(&rMEvt);
+ pHdl = nullptr;
+ mpWindow->ReleaseMouse();
+
+ FuDraw::MouseButtonUp(rMEvt);
+ }
+
+ return bReturn;
+}
+
+/**
+ * Process keyboard input
+ * @returns sal_True if a KeyEvent is being processed, sal_False otherwise
+ */
+bool FuSelection::KeyInput(const KeyEvent& rKEvt)
+{
+ bool bReturn = false;
+
+ switch (rKEvt.GetKeyCode().GetCode())
+ {
+ case KEY_ESCAPE:
+ {
+ bReturn = FuSelection::cancel();
+ }
+ break;
+ //add keyboard operation for insert points in drawing curve
+ case KEY_UP:
+ case KEY_DOWN:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ {
+ if(rKEvt.GetKeyCode().IsShift()&&(nEditMode == SID_BEZIER_INSERT)){
+ ::tools::Long nX = 0;
+ ::tools::Long nY = 0;
+ sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
+ if (nCode == KEY_UP)
+ {
+ // scroll up
+ nX = 0;
+ nY =-1;
+ }
+ else if (nCode == KEY_DOWN)
+ {
+ // scroll down
+ nX = 0;
+ nY = 1;
+ }
+ else if (nCode == KEY_LEFT)
+ {
+ // scroll left
+ nX =-1;
+ nY = 0;
+ }
+ else if (nCode == KEY_RIGHT)
+ {
+ // scroll right
+ nX = 1;
+ nY = 0;
+ }
+
+ Point centerPoint;
+ ::tools::Rectangle rect = mpView->GetMarkedObjRect();
+ centerPoint = mpWindow->LogicToPixel(rect.Center());
+ Point aPoint = bMovedToCenterPoint? oldPoint:centerPoint;
+ Point ePoint = aPoint + Point(nX,nY);
+ mpWindow->SetPointerPosPixel(ePoint);
+ //simulate mouse move action
+ MouseEvent eMevt(ePoint, 1, MouseEventModifiers::DRAGMOVE, MOUSE_LEFT, 0);
+ MouseMove(eMevt);
+ oldPoint = ePoint;
+ bMovedToCenterPoint = true;
+ bReturn = true;
+ }
+ }
+ break;
+ case KEY_RETURN:
+ if(rKEvt.GetKeyCode().IsShift()&&(nEditMode == SID_BEZIER_INSERT))
+ {
+ if(!bBeginInsertPoint)
+ {
+ //simulate mouse button down action
+ MouseEvent aMevt(oldPoint, 1,
+ MouseEventModifiers::SIMPLEMOVE | MouseEventModifiers::DRAGMOVE,
+ MOUSE_LEFT, KEY_SHIFT);
+ MouseButtonDown(aMevt);
+ mpWindow->CaptureMouse();
+ bBeginInsertPoint = true;
+ }
+ else
+ {
+ //simulate mouse button up action
+ MouseEvent rMEvt(oldPoint, 1,
+ MouseEventModifiers::SIMPLEMOVE | MouseEventModifiers::ENTERWINDOW,
+ MOUSE_LEFT, KEY_SHIFT);
+ MouseButtonUp(rMEvt);
+ bBeginInsertPoint = false;
+ }
+ bReturn= true;
+ }
+ break;
+ }
+ if (!bReturn)
+ {
+ bReturn = FuDraw::KeyInput(rKEvt);
+
+ if(mpView->GetMarkedObjectList().GetMarkCount() == 0)
+ {
+ mpView->ResetCreationActive();
+
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ }
+ }
+
+ return bReturn;
+
+}
+
+void FuSelection::Activate()
+{
+ SdrDragMode eMode;
+ mpView->ResetCreationActive();
+ mpView->SetEditMode(SdrViewEditMode::Edit);
+
+ switch( nSlotId )
+ {
+ case SID_OBJECT_ROTATE:
+ {
+ eMode = SdrDragMode::Rotate;
+
+ if ( mpView->GetDragMode() != eMode )
+ mpView->SetDragMode(eMode);
+ }
+ break;
+
+ case SID_OBJECT_MIRROR:
+ {
+ eMode = SdrDragMode::Mirror;
+
+ if ( mpView->GetDragMode() != eMode )
+ mpView->SetDragMode(eMode);
+ }
+ break;
+
+ case SID_OBJECT_CROP:
+ {
+ eMode = SdrDragMode::Crop;
+
+ if ( mpView->GetDragMode() != eMode )
+ mpView->SetDragMode(eMode);
+ }
+ break;
+
+ case SID_OBJECT_TRANSPARENCE:
+ {
+ eMode = SdrDragMode::Transparence;
+
+ if ( mpView->GetDragMode() != eMode )
+ mpView->SetDragMode(eMode);
+ }
+ break;
+
+ case SID_OBJECT_GRADIENT:
+ {
+ eMode = SdrDragMode::Gradient;
+
+ if ( mpView->GetDragMode() != eMode )
+ mpView->SetDragMode(eMode);
+ }
+ break;
+
+ case SID_OBJECT_SHEAR:
+ {
+ eMode = SdrDragMode::Shear;
+
+ if ( mpView->GetDragMode() != eMode )
+ mpView->SetDragMode(eMode);
+ }
+ break;
+
+ case SID_OBJECT_CROOK_ROTATE:
+ {
+ eMode = SdrDragMode::Crook;
+
+ if ( mpView->GetDragMode() != eMode )
+ {
+ mpView->SetDragMode(eMode);
+ mpView->SetCrookMode(SdrCrookMode::Rotate);
+ }
+ }
+ break;
+
+ case SID_OBJECT_CROOK_SLANT:
+ {
+ eMode = SdrDragMode::Crook;
+
+ if ( mpView->GetDragMode() != eMode )
+ {
+ mpView->SetDragMode(eMode);
+ mpView->SetCrookMode(SdrCrookMode::Slant);
+ }
+ }
+ break;
+
+ case SID_OBJECT_CROOK_STRETCH:
+ {
+ eMode = SdrDragMode::Crook;
+
+ if ( mpView->GetDragMode() != eMode )
+ {
+ mpView->SetDragMode(eMode);
+ mpView->SetCrookMode(SdrCrookMode::Stretch);
+ }
+ }
+ break;
+
+ case SID_CONVERT_TO_3D_LATHE:
+ {
+ eMode = SdrDragMode::Mirror;
+ bSuppressChangesOfSelection = true;
+
+ if ( mpView->GetDragMode() != eMode )
+ mpView->SetDragMode(eMode);
+
+ if (!mpView->Is3DRotationCreationActive())
+ mpView->Start3DCreation();
+
+ bSuppressChangesOfSelection = false;
+ }
+ break;
+
+ default:
+ {
+ eMode = SdrDragMode::Move;
+
+ if ( mpView->GetDragMode() != eMode )
+ mpView->SetDragMode(eMode);
+ }
+ break;
+ }
+
+ if (nSlotId != SID_OBJECT_ROTATE)
+ {
+ bTempRotation = false;
+ }
+
+ FuDraw::Activate();
+}
+
+void FuSelection::SelectionHasChanged()
+{
+ bSelectionChanged = true;
+
+ FuDraw::SelectionHasChanged();
+
+ if (mpView->Is3DRotationCreationActive() && !bSuppressChangesOfSelection)
+ {
+ // Switch rotation body -> selection
+ mpView->ResetCreationActive();
+ nSlotId = SID_OBJECT_SELECT;
+ Activate();
+ }
+
+ // Activate the right tool bar for the current context of the view.
+ mpViewShell->GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*mpViewShell, *mpView);
+}
+
+/**
+ * Set current bezier edit mode
+ */
+void FuSelection::SetEditMode(sal_uInt16 nMode)
+{
+ nEditMode = nMode;
+
+ if (nEditMode == SID_BEZIER_INSERT)
+ {
+ mpView->SetInsObjPointMode(true);
+ }
+ else
+ {
+ mpView->SetInsObjPointMode(false);
+ }
+
+ ForcePointer();
+
+ SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings();
+ rBindings.Invalidate(SID_BEZIER_MOVE);
+ rBindings.Invalidate(SID_BEZIER_INSERT);
+}
+
+/**
+ * Execute ImageMap interaction
+ */
+bool FuSelection::HandleImageMapClick(const SdrObject* pObj, const Point& rPos)
+{
+ bool bClosed = pObj->IsClosedObj();
+ bool bFilled = false;
+
+ if (bClosed)
+ {
+ SfxItemSet aSet(mpDoc->GetPool());
+
+ aSet.Put(pObj->GetMergedItemSet());
+
+ const XFillStyleItem& rFillStyle = aSet.Get(XATTR_FILLSTYLE);
+ bFilled = rFillStyle.GetValue() != drawing::FillStyle_NONE;
+ }
+
+ const SdrLayerIDSet* pVisiLayer = &mpView->GetSdrPageView()->GetVisibleLayers();
+ sal_uInt16 nHitLog = sal_uInt16(mpWindow->PixelToLogic(Size(HITPIX, 0)).Width());
+ const ::tools::Long n2HitLog = nHitLog * 2;
+ Point aHitPosR(rPos);
+ Point aHitPosL(rPos);
+ Point aHitPosT(rPos);
+ Point aHitPosB(rPos);
+
+ aHitPosR.AdjustX(n2HitLog);
+ aHitPosL.AdjustX(-n2HitLog);
+ aHitPosT.AdjustY(n2HitLog);
+ aHitPosB.AdjustY(-n2HitLog);
+
+ if (!bClosed || !bFilled
+ || (SdrObjectPrimitiveHit(*pObj, aHitPosR, nHitLog, *mpView->GetSdrPageView(), pVisiLayer,
+ false)
+ && SdrObjectPrimitiveHit(*pObj, aHitPosL, nHitLog, *mpView->GetSdrPageView(),
+ pVisiLayer, false)
+ && SdrObjectPrimitiveHit(*pObj, aHitPosT, nHitLog, *mpView->GetSdrPageView(),
+ pVisiLayer, false)
+ && SdrObjectPrimitiveHit(*pObj, aHitPosB, nHitLog, *mpView->GetSdrPageView(),
+ pVisiLayer, false)))
+ {
+ if (SvxIMapInfo::GetIMapInfo(pObj))
+ {
+ const IMapObject* pIMapObj = SvxIMapInfo::GetHitIMapObject(pObj, rPos);
+
+ if (pIMapObj && !pIMapObj->GetURL().isEmpty())
+ {
+ // Jump to Document
+ mpWindow->ReleaseMouse();
+ SfxStringItem aStrItem(SID_FILE_NAME, pIMapObj->GetURL());
+ SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName());
+ SfxViewFrame* pFrame = mpViewShell->GetViewFrame();
+ SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame);
+ SfxBoolItem aBrowseItem(SID_BROWSE, true);
+ mpWindow->ReleaseMouse();
+ pFrame->GetDispatcher()->ExecuteList(
+ SID_OPENDOC, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aStrItem, &aFrameItem, &aBrowseItem, &aReferer });
+
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+/** is called when the current function should be aborted. <p>
+ This is used when a function gets a KEY_ESCAPE but can also
+ be called directly.
+
+ @returns true if an active function was aborted
+*/
+bool FuSelection::cancel()
+{
+ if (mpView->Is3DRotationCreationActive())
+ {
+ mpView->ResetCreationActive();
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+SdrObject* FuSelection::pickObject (const Point& rTestPoint)
+{
+ SdrPageView* pPageView;
+ sal_uInt16 nHitLog = sal_uInt16 (mpWindow->PixelToLogic(Size(HITPIX,0)).Width());
+ return mpView->PickObj(rTestPoint, nHitLog, pPageView, SdrSearchOptions::PICKMARKABLE);
+}
+
+void FuSelection::ForcePointer(const MouseEvent* pMEvt)
+{
+ if(bMovedToCenterPoint && !bBeginInsertPoint && pMEvt)
+ {
+ MouseEvent aMEvt(pMEvt->GetPosPixel(), pMEvt->GetClicks(),
+ pMEvt->GetMode(), pMEvt->GetButtons(), pMEvt->GetModifier() & ~KEY_SHIFT);
+ FuDraw::ForcePointer(&aMEvt);
+ }
+ else
+ {
+ FuDraw::ForcePointer(pMEvt);
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fusldlg.cxx b/sd/source/ui/func/fusldlg.cxx
new file mode 100644
index 000000000..c0269b08a
--- /dev/null
+++ b/sd/source/ui/func/fusldlg.cxx
@@ -0,0 +1,226 @@
+/* -*- 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 <fusldlg.hxx>
+#include <svl/eitem.hxx>
+#include <svl/itemset.hxx>
+#include <svl/stritem.hxx>
+#include <svl/intitem.hxx>
+
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <strings.hrc>
+#include <sdattr.hrc>
+#include <sdmod.hxx>
+#include <Window.hxx>
+#include <optsitem.hxx>
+#include <sdabstdlg.hxx>
+
+namespace sd {
+
+#define ITEMVALUE(ItemSet,Id,Cast) static_cast<const Cast&>((ItemSet).Get(Id)).GetValue()
+
+
+FuSlideShowDlg::FuSlideShowDlg (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor( pViewSh, pWin, pView, pDoc, rReq )
+{
+}
+
+rtl::Reference<FuPoor> FuSlideShowDlg::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuSlideShowDlg( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuSlideShowDlg::DoExecute( SfxRequest& )
+{
+ PresentationSettings& rPresentationSettings = mpDoc->getPresentationSettings();
+
+ SfxItemSetFixed<ATTR_PRESENT_START, ATTR_PRESENT_END> aDlgSet( mpDoc->GetPool() );
+ std::vector<OUString> aPageNameList(mpDoc->GetSdPageCount( PageKind::Standard ));
+ const OUString& rPresPage = rPresentationSettings.maPresPage;
+ OUString aFirstPage;
+ SdPage* pPage = nullptr;
+ ::tools::Long nPage;
+
+ for( nPage = mpDoc->GetSdPageCount( PageKind::Standard ) - 1; nPage >= 0; nPage-- )
+ {
+ pPage = mpDoc->GetSdPage( static_cast<sal_uInt16>(nPage), PageKind::Standard );
+ OUString aStr( pPage->GetName() );
+
+ if ( aStr.isEmpty() )
+ {
+ aStr = SdResId( STR_PAGE ) + OUString::number( nPage + 1 );
+ }
+
+ aPageNameList[ nPage ] = aStr;
+
+ // is this our (existing) first page?
+ if ( rPresPage == aStr )
+ aFirstPage = rPresPage;
+ else if ( pPage->IsSelected() && aFirstPage.isEmpty() )
+ aFirstPage = aStr;
+ }
+ SdCustomShowList* pCustomShowList = mpDoc->GetCustomShowList(); // No Create
+
+ if( aFirstPage.isEmpty() && pPage )
+ aFirstPage = pPage->GetName();
+
+ aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_ALL, rPresentationSettings.mbAll ) );
+ aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_CUSTOMSHOW, rPresentationSettings.mbCustomShow ) );
+ aDlgSet.Put( SfxStringItem( ATTR_PRESENT_DIANAME, aFirstPage ) );
+ aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_ENDLESS, rPresentationSettings.mbEndless ) );
+ aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_MANUEL, rPresentationSettings.mbManual ) );
+ aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_MOUSE, rPresentationSettings.mbMouseVisible ) );
+ aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_PEN, rPresentationSettings.mbMouseAsPen ) );
+ aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_ANIMATION_ALLOWED, rPresentationSettings.mbAnimationAllowed ) );
+ aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_CHANGE_PAGE, !rPresentationSettings.mbLockedPages ) );
+ aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_ALWAYS_ON_TOP, rPresentationSettings.mbAlwaysOnTop ) );
+ aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_FULLSCREEN, rPresentationSettings.mbFullScreen ) );
+ aDlgSet.Put( SfxUInt32Item( ATTR_PRESENT_PAUSE_TIMEOUT, rPresentationSettings.mnPauseTimeout ) );
+ aDlgSet.Put( SfxBoolItem( ATTR_PRESENT_SHOW_PAUSELOGO, rPresentationSettings.mbShowPauseLogo ) );
+
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress);
+ aDlgSet.Put( SfxInt32Item( ATTR_PRESENT_DISPLAY, pOptions->GetDisplay() ) );
+
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractSdStartPresDlg> pDlg( pFact->CreateSdStartPresentationDlg(mpWindow ? mpWindow->GetFrameWeld() : nullptr, aDlgSet, aPageNameList, pCustomShowList) );
+ if( pDlg->Execute() != RET_OK )
+ return;
+
+ ::tools::Long nValue32;
+ bool bValue;
+ bool bValuesChanged = false;
+
+ pDlg->GetAttr( aDlgSet );
+
+ bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_ALL, SfxBoolItem );
+ if ( bValue != rPresentationSettings.mbAll )
+ {
+ bValuesChanged = true;
+ rPresentationSettings.mbAll = bValue;
+ // remove any previous existing slide
+ rPresentationSettings.maPresPage.clear();
+ }
+
+ if (!rPresentationSettings.mbAll)
+ {
+ OUString aPage = ITEMVALUE( aDlgSet, ATTR_PRESENT_DIANAME, SfxStringItem );
+ if( aPage != rPresentationSettings.maPresPage )
+ {
+ bValuesChanged = true;
+ rPresentationSettings.maPresPage = aPage;
+ }
+ }
+
+ bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_CUSTOMSHOW, SfxBoolItem );
+ if ( bValue != rPresentationSettings.mbCustomShow )
+ {
+ bValuesChanged = true;
+ rPresentationSettings.mbCustomShow = bValue;
+ rPresentationSettings.mbStartCustomShow = false;
+ }
+
+ bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_ENDLESS, SfxBoolItem );
+ if ( bValue != rPresentationSettings.mbEndless )
+ {
+ bValuesChanged = true;
+ rPresentationSettings.mbEndless = bValue;
+ }
+
+ bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_MANUEL, SfxBoolItem );
+ if ( bValue != rPresentationSettings.mbManual )
+ {
+ bValuesChanged = true;
+ rPresentationSettings.mbManual = bValue;
+ }
+
+ bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_MOUSE, SfxBoolItem );
+ if ( bValue != rPresentationSettings.mbMouseVisible )
+ {
+ bValuesChanged = true;
+ rPresentationSettings.mbMouseVisible = bValue;
+ }
+
+ bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_PEN, SfxBoolItem );
+ if ( bValue != rPresentationSettings.mbMouseAsPen )
+ {
+ bValuesChanged = true;
+ rPresentationSettings.mbMouseAsPen = bValue;
+ }
+
+ bValue = !ITEMVALUE( aDlgSet, ATTR_PRESENT_CHANGE_PAGE, SfxBoolItem );
+ if ( bValue != rPresentationSettings.mbLockedPages )
+ {
+ bValuesChanged = true;
+ rPresentationSettings.mbLockedPages = bValue;
+ }
+
+ bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_ANIMATION_ALLOWED, SfxBoolItem );
+ if ( bValue != rPresentationSettings.mbAnimationAllowed )
+ {
+ bValuesChanged = true;
+ rPresentationSettings.mbAnimationAllowed = bValue;
+ }
+
+ bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_ALWAYS_ON_TOP, SfxBoolItem );
+ if ( bValue != rPresentationSettings.mbAlwaysOnTop )
+ {
+ bValuesChanged = true;
+ rPresentationSettings.mbAlwaysOnTop = bValue;
+ }
+
+ bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_FULLSCREEN, SfxBoolItem );
+ if ( bValue != rPresentationSettings.mbFullScreen )
+ {
+ bValuesChanged = true;
+ rPresentationSettings.mbFullScreen = bValue;
+ }
+
+ nValue32 = ITEMVALUE( aDlgSet, ATTR_PRESENT_PAUSE_TIMEOUT, SfxUInt32Item );
+ if( nValue32 != rPresentationSettings.mnPauseTimeout )
+ {
+ bValuesChanged = true;
+ rPresentationSettings.mnPauseTimeout = nValue32;
+ }
+
+ bValue = ITEMVALUE( aDlgSet, ATTR_PRESENT_SHOW_PAUSELOGO, SfxBoolItem );
+ if ( bValue != rPresentationSettings.mbShowPauseLogo )
+ {
+ bValuesChanged = true;
+ rPresentationSettings.mbShowPauseLogo = bValue;
+ }
+
+ pOptions->SetDisplay( ITEMVALUE( aDlgSet, ATTR_PRESENT_DISPLAY, SfxInt32Item ) );
+
+ // is something has changed, we set the modified flag
+ if ( bValuesChanged )
+ mpDoc->SetChanged();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fusnapln.cxx b/sd/source/ui/func/fusnapln.cxx
new file mode 100644
index 000000000..ee51d78ce
--- /dev/null
+++ b/sd/source/ui/func/fusnapln.cxx
@@ -0,0 +1,196 @@
+/* -*- 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 <fusnapln.hxx>
+#include <svl/intitem.hxx>
+#include <sfx2/request.hxx>
+#include <svx/svxids.hrc>
+
+#include <strings.hrc>
+#include <sdattr.hrc>
+
+#include <View.hxx>
+#include <ViewShell.hxx>
+#include <DrawViewShell.hxx>
+#include <Window.hxx>
+#include <sdenumdef.hxx>
+#include <sdresid.hxx>
+#include <sdabstdlg.hxx>
+#include <svx/svdpagv.hxx>
+
+namespace sd {
+
+
+FuSnapLine::FuSnapLine(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView,
+ SdDrawDocument* pDoc, SfxRequest& rReq) :
+ FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuSnapLine::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuSnapLine( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuSnapLine::DoExecute( SfxRequest& rReq )
+{
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ sal_uInt16 nHelpLine = 0;
+ bool bCreateNew = true;
+
+ // Get index of snap line or snap point from the request.
+ const SfxUInt32Item* pHelpLineIndex = rReq.GetArg<SfxUInt32Item>(ID_VAL_INDEX);
+ if (pHelpLineIndex != nullptr)
+ {
+ nHelpLine = static_cast<sal_uInt16>(pHelpLineIndex->GetValue());
+ // Reset the argument pointer to trigger the display of the dialog.
+ pArgs = nullptr;
+ }
+
+ SdrPageView* pPV = mpView->GetSdrPageView();
+
+ if (!pArgs)
+ {
+ SfxItemSetFixed<ATTR_SNAPLINE_START, ATTR_SNAPLINE_END> aNewAttr(mpViewShell->GetPool());
+ bool bLineExist (false);
+ Point aLinePos;
+
+ if (pHelpLineIndex == nullptr)
+ {
+ // The index of the snap line is not provided as argument to the
+ // request. Determine it from the mouse position.
+
+ aLinePos = static_cast<DrawViewShell*>(mpViewShell)->GetMousePos();
+
+ if ( aLinePos.X() >= 0 )
+ {
+ aLinePos = mpWindow->PixelToLogic(aLinePos);
+ sal_uInt16 nHitLog = static_cast<sal_uInt16>(mpWindow->PixelToLogic(Size(HITPIX,0)).Width());
+ bLineExist = mpView->PickHelpLine(aLinePos, nHitLog, *mpWindow->GetOutDev(), nHelpLine, pPV);
+ if ( bLineExist )
+ aLinePos = (pPV->GetHelpLines())[nHelpLine].GetPos();
+ else
+ pPV = mpView->GetSdrPageView();
+
+ pPV->LogicToPagePos(aLinePos);
+ }
+ else
+ aLinePos = Point(0,0);
+ }
+ else
+ {
+ assert(pPV!=nullptr);
+ aLinePos = (pPV->GetHelpLines())[nHelpLine].GetPos();
+ pPV->LogicToPagePos(aLinePos);
+ bLineExist = true;
+ }
+ aNewAttr.Put(SfxInt32Item(ATTR_SNAPLINE_X, aLinePos.X()));
+ aNewAttr.Put(SfxInt32Item(ATTR_SNAPLINE_Y, aLinePos.Y()));
+
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ vcl::Window* pWin = mpViewShell->GetActiveWindow();
+ ScopedVclPtr<AbstractSdSnapLineDlg> pDlg( pFact->CreateSdSnapLineDlg(pWin ? pWin->GetFrameWeld() : nullptr, aNewAttr, mpView) );
+
+ if ( bLineExist )
+ {
+ pDlg->HideRadioGroup();
+
+ const SdrHelpLine& rHelpLine = (pPV->GetHelpLines())[nHelpLine];
+
+ if ( rHelpLine.GetKind() == SdrHelpLineKind::Point )
+ {
+ pDlg->SetText(SdResId(STR_SNAPDLG_SETPOINT));
+ pDlg->SetInputFields(true, true);
+ }
+ else
+ {
+ pDlg->SetText(SdResId(STR_SNAPDLG_SETLINE));
+
+ if ( rHelpLine.GetKind() == SdrHelpLineKind::Vertical )
+ pDlg->SetInputFields(true, false);
+ else
+ pDlg->SetInputFields(false, true);
+ }
+ bCreateNew = false;
+ }
+ else
+ pDlg->HideDeleteBtn();
+
+ sal_uInt16 nResult = pDlg->Execute();
+
+ pDlg->GetAttr(aNewAttr);
+ pDlg.disposeAndClear();
+
+ switch( nResult )
+ {
+ case RET_OK:
+ rReq.Done(aNewAttr);
+ pArgs = rReq.GetArgs();
+ break;
+
+ case RET_SNAP_DELETE:
+ // delete snap object
+ if ( !bCreateNew )
+ pPV->DeleteHelpLine(nHelpLine);
+ [[fallthrough]];
+ default:
+ return;
+ }
+ }
+ Point aHlpPos;
+
+ aHlpPos.setX( static_cast<const SfxInt32Item&>( pArgs->Get(ATTR_SNAPLINE_X)).GetValue() );
+ aHlpPos.setY( static_cast<const SfxInt32Item&>( pArgs->Get(ATTR_SNAPLINE_Y)).GetValue() );
+ pPV->PagePosToLogic(aHlpPos);
+
+ if ( bCreateNew )
+ {
+ SdrHelpLineKind eKind;
+
+ pPV = mpView->GetSdrPageView();
+
+ switch ( static_cast<SnapKind>(static_cast<const SfxUInt16Item&>(
+ pArgs->Get(ATTR_SNAPLINE_KIND)).GetValue()) )
+ {
+ case SnapKind::Horizontal : eKind = SdrHelpLineKind::Horizontal; break;
+ case SnapKind::Vertical : eKind = SdrHelpLineKind::Vertical; break;
+ default : eKind = SdrHelpLineKind::Point; break;
+ }
+ pPV->InsertHelpLine(SdrHelpLine(eKind, aHlpPos));
+ }
+ else
+ {
+ const SdrHelpLine& rHelpLine = (pPV->GetHelpLines())[nHelpLine];
+ pPV->SetHelpLine(nHelpLine, SdrHelpLine(rHelpLine.GetKind(), aHlpPos));
+ }
+}
+
+void FuSnapLine::Activate()
+{
+}
+
+void FuSnapLine::Deactivate()
+{
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fusumry.cxx b/sd/source/ui/func/fusumry.cxx
new file mode 100644
index 000000000..9b160099c
--- /dev/null
+++ b/sd/source/ui/func/fusumry.cxx
@@ -0,0 +1,229 @@
+/* -*- 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 <fusumry.hxx>
+#include <editeng/eeitem.hxx>
+#include <svx/svdotext.hxx>
+#include <svx/svdundo.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xlineit0.hxx>
+#include <editeng/outlobj.hxx>
+#include <xmloff/autolayout.hxx>
+
+#include <strings.hrc>
+
+#include <pres.hxx>
+#include <View.hxx>
+#include <sdpage.hxx>
+#include <Outliner.hxx>
+#include <drawdoc.hxx>
+#include <ViewShell.hxx>
+#include <sdmod.hxx>
+#include <sdresid.hxx>
+#include <DrawViewShell.hxx>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+
+FuSummaryPage::FuSummaryPage (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuSummaryPage::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuSummaryPage( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuSummaryPage::DoExecute( SfxRequest& )
+{
+ std::unique_ptr<SdOutliner> pOutl;
+ rtl::Reference<SdPage> pSummaryPage;
+ sal_uInt16 i = 0;
+ sal_uInt16 nFirstPage = SDRPAGE_NOTFOUND;
+ sal_uInt16 nSelectedPages = 0;
+ sal_uInt16 nCount = mpDoc->GetSdPageCount(PageKind::Standard);
+
+ while (i < nCount && nSelectedPages <= 1)
+ {
+ /* How many pages are selected?
+ exactly one: pool everything from this page
+ otherwise: only pool the selected pages */
+ SdPage* pActualPage = mpDoc->GetSdPage(i, PageKind::Standard);
+
+ if (pActualPage->IsSelected())
+ {
+ if (nFirstPage == SDRPAGE_NOTFOUND)
+ {
+ nFirstPage = i;
+ }
+
+ nSelectedPages++;
+ }
+
+ i++;
+ }
+
+ bool bBegUndo = false;
+
+ SfxStyleSheet* pStyle = nullptr;
+
+ for (i = nFirstPage; i < nCount; i++)
+ {
+ SdPage* pActualPage = mpDoc->GetSdPage(i, PageKind::Standard);
+
+ if (nSelectedPages <= 1 || pActualPage->IsSelected())
+ {
+ SdPage* pActualNotesPage = mpDoc->GetSdPage(i, PageKind::Notes);
+ SdrTextObj* pTextObj = static_cast<SdrTextObj*>( pActualPage->GetPresObj(PresObjKind::Title) );
+
+ if (pTextObj && !pTextObj->IsEmptyPresObj())
+ {
+ if (!pSummaryPage)
+ {
+ // insert "table of content"-page and create outliner
+ const bool bUndo = mpView->IsUndoEnabled();
+
+ if( bUndo )
+ {
+ mpView->BegUndo(SdResId(STR_UNDO_SUMMARY_PAGE));
+ bBegUndo = true;
+ }
+
+ SdrLayerIDSet aVisibleLayers = pActualPage->TRG_GetMasterPageVisibleLayers();
+
+ // page with title & structuring!
+ pSummaryPage = mpDoc->AllocSdPage(false);
+ pSummaryPage->SetSize(pActualPage->GetSize() );
+ pSummaryPage->SetBorder(pActualPage->GetLeftBorder(),
+ pActualPage->GetUpperBorder(),
+ pActualPage->GetRightBorder(),
+ pActualPage->GetLowerBorder() );
+
+ // insert page at the back
+ mpDoc->InsertPage(pSummaryPage.get(), nCount * 2 + 1);
+ if( bUndo )
+ mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pSummaryPage));
+
+ // use MasterPage of the current page
+ pSummaryPage->TRG_SetMasterPage(pActualPage->TRG_GetMasterPage());
+ pSummaryPage->SetLayoutName(pActualPage->GetLayoutName());
+ pSummaryPage->SetAutoLayout(AUTOLAYOUT_TITLE_CONTENT, true);
+ pSummaryPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+ pSummaryPage->setHeaderFooterSettings(pActualPage->getHeaderFooterSettings());
+
+ // notes-page
+ rtl::Reference<SdPage> pNotesPage = mpDoc->AllocSdPage(false);
+ pNotesPage->SetSize(pActualNotesPage->GetSize());
+ pNotesPage->SetBorder(pActualNotesPage->GetLeftBorder(),
+ pActualNotesPage->GetUpperBorder(),
+ pActualNotesPage->GetRightBorder(),
+ pActualNotesPage->GetLowerBorder() );
+ pNotesPage->SetPageKind(PageKind::Notes);
+
+ // insert page at the back
+ mpDoc->InsertPage(pNotesPage.get(), nCount * 2 + 2);
+
+ if( bUndo )
+ mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pNotesPage));
+
+ // use MasterPage of the current page
+ pNotesPage->TRG_SetMasterPage(pActualNotesPage->TRG_GetMasterPage());
+ pNotesPage->SetLayoutName(pActualNotesPage->GetLayoutName());
+ pNotesPage->SetAutoLayout(pActualNotesPage->GetAutoLayout(), true);
+ pNotesPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+ pNotesPage->setHeaderFooterSettings(pActualNotesPage->getHeaderFooterSettings());
+
+ pOutl.reset(new SdOutliner( mpDoc, OutlinerMode::OutlineObject ));
+ pOutl->SetUpdateLayout(false);
+ pOutl->EnableUndo(false);
+
+ if (mpDocSh)
+ pOutl->SetRefDevice(SD_MOD()->GetVirtualRefDevice());
+
+ pOutl->SetDefTab( mpDoc->GetDefaultTabulator() );
+ pOutl->SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(mpDoc->GetStyleSheetPool()));
+ pStyle = pSummaryPage->GetStyleSheetForPresObj( PresObjKind::Outline );
+ pOutl->SetStyleSheet( 0, pStyle );
+ }
+
+ // add text
+ OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject();
+ // #118876#, check if the OutlinerParaObject is created successfully
+ if( pParaObj )
+ {
+ pParaObj->SetOutlinerMode( OutlinerMode::OutlineObject );
+ pOutl->AddText(*pParaObj);
+ }
+ }
+ }
+ }
+
+ if (!pSummaryPage)
+ return;
+
+ SdrTextObj* pTextObj = static_cast<SdrTextObj*>( pSummaryPage->GetPresObj(PresObjKind::Outline) );
+
+ if (!pTextObj)
+ return;
+
+ // remove hard break- and character attributes
+ SfxItemSetFixed<EE_ITEMS_START, EE_ITEMS_END> aEmptyEEAttr(mpDoc->GetPool());
+ sal_Int32 nParaCount = pOutl->GetParagraphCount();
+
+ for (sal_Int32 nPara = 0; nPara < nParaCount; nPara++)
+ {
+ pOutl->SetStyleSheet( nPara, pStyle );
+ pOutl->RemoveCharAttribs(nPara);
+ pOutl->SetParaAttribs(nPara, aEmptyEEAttr);
+ pOutl->SetDepth(pOutl->GetParagraph(nPara), 0);
+ }
+
+ pTextObj->SetOutlinerParaObject( pOutl->CreateParaObject() );
+ pTextObj->SetEmptyPresObj(false);
+
+ // remove hard attributes (Flag to sal_True)
+ SfxItemSet aAttr(mpDoc->GetPool());
+ aAttr.Put(XLineStyleItem(drawing::LineStyle_NONE));
+ aAttr.Put(XFillStyleItem(drawing::FillStyle_NONE));
+ pTextObj->SetMergedItemSet(aAttr);
+
+ if( bBegUndo )
+ mpView->EndUndo();
+ pOutl.reset();
+
+ DrawViewShell* pDrawViewShell= dynamic_cast< DrawViewShell* >( mpViewShell );
+ if(pDrawViewShell)
+ {
+ pDrawViewShell->SwitchPage( (pSummaryPage->GetPageNum() - 1) / 2);
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/futempl.cxx b/sd/source/ui/func/futempl.cxx
new file mode 100644
index 000000000..2c0c22ecd
--- /dev/null
+++ b/sd/source/ui/func/futempl.cxx
@@ -0,0 +1,638 @@
+/* -*- 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 <com/sun/star/style/XStyleFamiliesSupplier.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+
+#include <futempl.hxx>
+
+#include <svx/svxids.hrc>
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <editeng/eeitem.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/sfxdlg.hxx>
+#include <editeng/numitem.hxx>
+#include <svx/svdopage.hxx>
+#include <editeng/colritem.hxx>
+#include <editeng/brushitem.hxx>
+#include <svx/svditer.hxx>
+#include <svx/sdr/properties/properties.hxx>
+#include <svl/intitem.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <svx/xlndsit.hxx>
+#include <svx/xlnstit.hxx>
+#include <svx/xlnedit.hxx>
+#include <svx/xbtmpit.hxx>
+#include <svx/xflgrit.hxx>
+#include <svx/xflftrit.hxx>
+#include <svx/xflhtit.hxx>
+#include <o3tl/string_view.hxx>
+#include <app.hrc>
+#include <stlsheet.hxx>
+#include <sdpage.hxx>
+#include <stlpool.hxx>
+#include <sdmod.hxx>
+#include <View.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <ViewShell.hxx>
+
+#include <strings.hrc>
+#include <prlayout.hxx>
+#include <sdresid.hxx>
+#include <OutlineView.hxx>
+#include <sdabstdlg.hxx>
+#include <memory>
+
+using namespace com::sun::star::uno;
+using namespace com::sun::star::container;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::style;
+
+namespace sd
+{
+
+
+FuTemplate::FuTemplate (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq )
+ : FuPoor( pViewSh, pWin, pView, pDoc, rReq )
+{
+}
+
+rtl::Reference<FuPoor> FuTemplate::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuTemplate( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuTemplate::DoExecute( SfxRequest& rReq )
+{
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ sal_uInt16 nSId = rReq.GetSlot();
+
+ // get StyleSheet parameter
+ SfxStyleSheetBasePool* pSSPool = mpDoc->GetDocSh()->GetStyleSheetPool();
+ SfxStyleSheetBase* pStyleSheet = nullptr;
+
+ const SfxPoolItem* pItem;
+ SfxStyleFamily nFamily = SfxStyleFamily(USHRT_MAX);
+ if( pArgs && SfxItemState::SET == pArgs->GetItemState( SID_STYLE_FAMILY,
+ false, &pItem ))
+ {
+ nFamily = static_cast<SfxStyleFamily>( pArgs->Get( SID_STYLE_FAMILY ).GetValue());
+ }
+ else if( pArgs && SfxItemState::SET == pArgs->GetItemState( SID_STYLE_FAMILYNAME,
+ false, &pItem ))
+ {
+ OUString sFamily = pArgs->Get( SID_STYLE_FAMILYNAME ).GetValue();
+ if (sFamily == "graphics")
+ nFamily = SfxStyleFamily::Para;
+ else
+ nFamily = SfxStyleFamily::Pseudo;
+ }
+
+ OUString aStyleName;
+ sal_uInt16 nRetMask = static_cast<sal_uInt16>(SfxStyleSearchBits::All);
+
+ switch( nSId )
+ {
+ case SID_STYLE_APPLY:
+ case SID_STYLE_EDIT:
+ case SID_STYLE_DELETE:
+ case SID_STYLE_HIDE:
+ case SID_STYLE_SHOW:
+ case SID_STYLE_FAMILY:
+ case SID_STYLE_NEW_BY_EXAMPLE:
+ {
+ const SfxStringItem* pNameItem = rReq.GetArg<SfxStringItem>(SID_APPLY_STYLE);
+ const SfxStringItem* pFamilyItem = rReq.GetArg<SfxStringItem>(SID_STYLE_FAMILYNAME);
+ if ( pFamilyItem && pNameItem )
+ {
+ try
+ {
+ Reference< XStyleFamiliesSupplier > xModel(mpDoc->GetDocSh()->GetModel(), UNO_QUERY_THROW );
+ Reference< XNameAccess > xCont( xModel->getStyleFamilies() );
+ Reference< XNameAccess > xStyles( xCont->getByName(pFamilyItem->GetValue()), UNO_QUERY_THROW );
+ Reference< XPropertySet > xInfo( xStyles->getByName( pNameItem->GetValue() ), UNO_QUERY_THROW );
+
+ OUString aUIName;
+ xInfo->getPropertyValue( "DisplayName" ) >>= aUIName;
+ if ( !aUIName.isEmpty() )
+ rReq.AppendItem( SfxStringItem( nSId, aUIName ) );
+ }
+ catch( Exception& )
+ {
+ }
+ }
+
+ if (pArgs && pArgs->GetItemState(nSId) == SfxItemState::SET)
+ aStyleName = static_cast<const SfxStringItem &>( pArgs->Get( nSId ) ).GetValue();
+ }
+ }
+
+ switch( nSId )
+ {
+ case SID_STYLE_NEW:
+ {
+ SfxStyleSheetBase *p = pSSPool->Find(aStyleName, nFamily );
+ if(p)
+ {
+ pSSPool->Remove(p);
+ p = nullptr;
+ }
+ pStyleSheet = &pSSPool->Make( aStyleName, nFamily, SfxStyleSearchBits::UserDefined );
+
+ if (pArgs && pArgs->GetItemState(SID_STYLE_REFERENCE) == SfxItemState::SET)
+ {
+ OUString aParentName( pArgs->Get(SID_STYLE_REFERENCE).GetValue());
+ pStyleSheet->SetParent(aParentName);
+ }
+ else
+ {
+ pStyleSheet->SetParent(SdResId(STR_STANDARD_STYLESHEET_NAME));
+ }
+ }
+ break;
+
+ case SID_STYLE_NEW_BY_EXAMPLE:
+ {
+ // at the moment, the dialog to enter the name of the template is still opened
+ SfxStyleSheetBase *p = pSSPool->Find(aStyleName, nFamily );
+ if(p)
+ {
+ pSSPool->Remove(p);
+ p = nullptr;
+ }
+ pStyleSheet = &pSSPool->Make( aStyleName, nFamily, SfxStyleSearchBits::UserDefined );
+ pStyleSheet->SetParent(SdResId(STR_STANDARD_STYLESHEET_NAME));
+ }
+ break;
+
+ case SID_STYLE_EDIT:
+ pStyleSheet = pSSPool->Find( aStyleName, nFamily);
+ break;
+
+ case SID_STYLE_DELETE:
+ pStyleSheet = pSSPool->Find( aStyleName, nFamily);
+ if( pStyleSheet )
+ {
+ pSSPool->Remove( pStyleSheet );
+ nRetMask = sal_uInt16(true);
+ mpDoc->SetChanged();
+ }
+ else
+ {
+ nRetMask = sal_uInt16(false);
+ }
+ break;
+
+ case SID_STYLE_HIDE:
+ case SID_STYLE_SHOW:
+ pStyleSheet = pSSPool->Find( aStyleName, nFamily);
+ pStyleSheet->SetHidden( nSId == SID_STYLE_HIDE );
+ nRetMask = sal_uInt16(true);
+ break;
+
+ case SID_STYLE_APPLY:
+ // apply the template to the document
+ pStyleSheet = pSSPool->Find( aStyleName, nFamily);
+
+ // do not set presentation styles, they will be set implicit
+ if ( pStyleSheet && pStyleSheet->GetFamily() != SfxStyleFamily::Pseudo )
+ {
+ SfxStyleSheet* pOldStyleSheet = mpView->GetStyleSheet();
+ OUString aStr;
+
+ if( // if the object had no style sheet, allow all
+ !pOldStyleSheet ||
+
+ // allow if old and new style sheet has same family
+ pStyleSheet->GetFamily() == pOldStyleSheet->GetFamily() ||
+
+ // allow if old was background objects and new is graphics
+ (pStyleSheet->GetFamily() == SfxStyleFamily::Para && pOldStyleSheet->GetHelpId( aStr ) == HID_PSEUDOSHEET_BACKGROUNDOBJECTS) ||
+
+ // allow if old was presentation and we are a drawing document
+ (pOldStyleSheet->GetFamily() == SfxStyleFamily::Page && mpDoc->GetDocumentType() == DocumentType::Draw) )
+ {
+ mpView->SetStyleSheet( static_cast<SfxStyleSheet*>(pStyleSheet));
+ mpDoc->SetChanged();
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 );
+ }
+ }
+ break;
+
+ case SID_STYLE_WATERCAN:
+ {
+ if( !SD_MOD()->GetWaterCan() )
+ {
+ if (pArgs && pArgs->GetItemState( nSId ) == SfxItemState::SET)
+ {
+ aStyleName = static_cast<const SfxStringItem &>( pArgs->Get( nSId ) ).GetValue();
+ SD_MOD()->SetWaterCan( true );
+ pStyleSheet = pSSPool->Find( aStyleName, nFamily);
+ }
+ // no presentation object templates, they are only allowed implicitly
+ if( pStyleSheet && pStyleSheet->GetFamily() != SfxStyleFamily::Pseudo )
+ {
+ static_cast<SdStyleSheetPool*>( pSSPool )->SetActualStyleSheet( pStyleSheet );
+
+ // we switch explicitly into selection mode
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_OBJECT_SELECT,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+
+ }
+ else
+ SD_MOD()->SetWaterCan( false );
+ }
+ else
+ {
+ SD_MOD()->SetWaterCan( false );
+ // we have to re-enable to tools-bar
+ mpViewShell->Invalidate();
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ switch( nSId )
+ {
+ case SID_STYLE_NEW:
+ case SID_STYLE_EDIT:
+ {
+ PresentationObjects ePO = PresentationObjects::Outline_1;
+
+ if( pStyleSheet )
+ {
+ ScopedVclPtr<SfxAbstractTabDialog> pStdDlg;
+ ScopedVclPtr<SfxAbstractTabDialog> pPresDlg;
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+
+ SfxStyleFamily eFamily = pStyleSheet->GetFamily();
+
+ if (eFamily == SfxStyleFamily::Para)
+ {
+ pStdDlg.disposeAndReset(pFact ? pFact->CreateSdTabTemplateDlg(mpViewShell->GetFrameWeld(), mpDoc->GetDocSh(), *pStyleSheet, mpDoc, mpView) : nullptr);
+ }
+ else if (eFamily == SfxStyleFamily::Pseudo)
+ {
+ OUString aName(pStyleSheet->GetName());
+ bool bBackground = false;
+ bool bOldDocInOtherLanguage = false;
+
+ if (aName == SdResId(STR_PSEUDOSHEET_TITLE))
+ {
+ ePO = PresentationObjects::Title;
+ }
+ else if (aName == SdResId(STR_PSEUDOSHEET_SUBTITLE))
+ {
+ ePO = PresentationObjects::Subtitle;
+ }
+ else if (aName ==
+ SdResId(STR_PSEUDOSHEET_BACKGROUND))
+ {
+ bBackground = true;
+ ePO = PresentationObjects::Background;
+ }
+ else if (aName ==
+ SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS))
+ {
+ ePO = PresentationObjects::BackgroundObjects;
+ }
+ else if (aName ==
+ SdResId(STR_PSEUDOSHEET_NOTES))
+ {
+ ePO = PresentationObjects::Notes;
+ }
+ else if(aName.indexOf(SdResId(STR_PSEUDOSHEET_OUTLINE)) != -1)
+ {
+ OUString aOutlineStr(SdResId(STR_PSEUDOSHEET_OUTLINE));
+ // determine number, mind the blank between name and number
+ std::u16string_view aNumStr(aName.subView(aOutlineStr.getLength() + 1));
+ sal_uInt16 nLevel = static_cast<sal_uInt16>(o3tl::toInt32(aNumStr));
+ switch (nLevel)
+ {
+ case 1: ePO = PresentationObjects::Outline_1; break;
+ case 2: ePO = PresentationObjects::Outline_2; break;
+ case 3: ePO = PresentationObjects::Outline_3; break;
+ case 4: ePO = PresentationObjects::Outline_4; break;
+ case 5: ePO = PresentationObjects::Outline_5; break;
+ case 6: ePO = PresentationObjects::Outline_6; break;
+ case 7: ePO = PresentationObjects::Outline_7; break;
+ case 8: ePO = PresentationObjects::Outline_8; break;
+ case 9: ePO = PresentationObjects::Outline_9; break;
+ }
+ }
+ else
+ {
+ OSL_FAIL("StyleSheet from older version with different language");
+ bOldDocInOtherLanguage = true;
+ }
+
+ if( !bOldDocInOtherLanguage )
+ {
+ pPresDlg.disposeAndReset(pFact ? pFact->CreateSdPresLayoutTemplateDlg(mpDocSh, mpViewShell->GetFrameWeld(), bBackground, *pStyleSheet, ePO, pSSPool ) : nullptr);
+ }
+ }
+
+ sal_uInt16 nResult = RET_CANCEL;
+ const SfxItemSet* pOutSet = nullptr;
+ if (pStdDlg)
+ {
+ nResult = pStdDlg->Execute();
+ pOutSet = pStdDlg->GetOutputItemSet();
+ }
+ else if( pPresDlg )
+ {
+ nResult = pPresDlg->Execute();
+ pOutSet = pPresDlg->GetOutputItemSet();
+ }
+
+ switch( nResult )
+ {
+ case RET_OK:
+ {
+ nRetMask = static_cast<sal_uInt16>(pStyleSheet->GetMask());
+
+ if (eFamily == SfxStyleFamily::Pseudo)
+ {
+ SfxItemSet aTempSet(*pOutSet);
+ /* Extract SvxBrushItem out of set and insert SvxColorItem */
+ const SvxBrushItem* pBrushItem = aTempSet.GetItem<SvxBrushItem>( SID_ATTR_BRUSH_CHAR );
+
+ if ( pBrushItem )
+ {
+ SvxColorItem aBackColorItem(pBrushItem->GetColor(), EE_CHAR_BKGCOLOR);
+ aTempSet.ClearItem( EE_CHAR_BKGCOLOR );
+ aTempSet.Put( aBackColorItem );
+ }
+ static_cast<SdStyleSheet*>(pStyleSheet)->AdjustToFontHeight(aTempSet);
+
+ /* Special treatment: reset the INVALIDS to
+ NULL-Pointer (otherwise INVALIDs or pointer point
+ to DefaultItems in the template; both would
+ prevent the attribute inheritance) */
+ aTempSet.ClearInvalidItems();
+
+ // EE_PARA_NUMBULLET item is only valid in first outline template
+ if( (ePO >= PresentationObjects::Outline_2) && (ePO <= PresentationObjects::Outline_9) )
+ {
+ if (aTempSet.GetItemState(EE_PARA_NUMBULLET) == SfxItemState::SET)
+ {
+ SvxNumRule aRule(aTempSet.GetItem<SvxNumBulletItem>(EE_PARA_NUMBULLET)->GetNumRule());
+
+ OUString sStyleName(SdResId(STR_PSEUDOSHEET_OUTLINE) + " 1");
+ SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( sStyleName, SfxStyleFamily::Pseudo);
+
+ if(pFirstStyleSheet)
+ {
+ pFirstStyleSheet->GetItemSet().Put( SvxNumBulletItem( aRule, EE_PARA_NUMBULLET ));
+ SdStyleSheet* pRealSheet = static_cast<SdStyleSheet*>(pFirstStyleSheet)->GetRealStyleSheet();
+ pRealSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+ }
+
+ aTempSet.ClearItem( EE_PARA_NUMBULLET );
+ }
+ }
+
+ pStyleSheet->GetItemSet().Put(aTempSet);
+ SdStyleSheet::BroadcastSdStyleSheetChange(pStyleSheet, ePO, pSSPool);
+ }
+
+ SfxItemSet& rAttr = pStyleSheet->GetItemSet();
+
+ sdr::properties::CleanupFillProperties( rAttr );
+
+ // check for unique names of named items for xml
+ if( rAttr.GetItemState( XATTR_FILLBITMAP ) == SfxItemState::SET )
+ {
+ const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLBITMAP );
+ std::unique_ptr<SfxPoolItem> pNewItem = static_cast<const XFillBitmapItem*>(pOldItem)->checkForUniqueItem( mpDoc );
+ if( pNewItem )
+ {
+ rAttr.Put( std::move(pNewItem) );
+ }
+ }
+ if( rAttr.GetItemState( XATTR_LINEDASH ) == SfxItemState::SET )
+ {
+ const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINEDASH );
+ std::unique_ptr<SfxPoolItem> pNewItem = static_cast<const XLineDashItem*>(pOldItem)->checkForUniqueItem( mpDoc );
+ if( pNewItem )
+ {
+ rAttr.Put( std::move(pNewItem) );
+ }
+ }
+ if( rAttr.GetItemState( XATTR_LINESTART ) == SfxItemState::SET )
+ {
+ const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINESTART );
+ std::unique_ptr<SfxPoolItem> pNewItem = static_cast<const XLineStartItem*>(pOldItem)->checkForUniqueItem( mpDoc );
+ if( pNewItem )
+ {
+ rAttr.Put( std::move(pNewItem) );
+ }
+ }
+ if( rAttr.GetItemState( XATTR_LINEEND ) == SfxItemState::SET )
+ {
+ const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINEEND );
+ std::unique_ptr<SfxPoolItem> pNewItem = static_cast<const XLineEndItem*>(pOldItem)->checkForUniqueItem( mpDoc );
+ if( pNewItem )
+ {
+ rAttr.Put( std::move(pNewItem) );
+ }
+ }
+ if( rAttr.GetItemState( XATTR_FILLGRADIENT ) == SfxItemState::SET )
+ {
+ const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLGRADIENT );
+ std::unique_ptr<SfxPoolItem> pNewItem = static_cast<const XFillGradientItem*>(pOldItem)->checkForUniqueItem( mpDoc );
+ if( pNewItem )
+ {
+ rAttr.Put( std::move(pNewItem) );
+ }
+ }
+ if( rAttr.GetItemState( XATTR_FILLFLOATTRANSPARENCE ) == SfxItemState::SET )
+ {
+ const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLFLOATTRANSPARENCE );
+ std::unique_ptr<SfxPoolItem> pNewItem = static_cast<const XFillFloatTransparenceItem*>(pOldItem)->checkForUniqueItem( mpDoc );
+ if( pNewItem )
+ {
+ rAttr.Put( std::move(pNewItem) );
+ }
+ }
+ if( rAttr.GetItemState( XATTR_FILLHATCH ) == SfxItemState::SET )
+ {
+ const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLHATCH );
+ std::unique_ptr<SfxPoolItem> pNewItem = static_cast<const XFillHatchItem*>(pOldItem)->checkForUniqueItem( mpDoc );
+ if( pNewItem )
+ {
+ rAttr.Put( std::move(pNewItem) );
+ }
+ }
+
+ static_cast<SfxStyleSheet*>( pStyleSheet )->Broadcast( SfxHint( SfxHintId::DataChanged ) );
+
+ DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >( mpViewShell );
+ if( pDrawViewShell )
+ {
+ PageKind ePageKind = pDrawViewShell->GetPageKind();
+ if( ePageKind == PageKind::Notes || ePageKind == PageKind::Handout )
+ {
+ SdPage* pPage = mpViewShell->GetActualPage();
+
+ if(pDrawViewShell->GetEditMode() == EditMode::MasterPage)
+ {
+ pPage = static_cast<SdPage*>((&(pPage->TRG_GetMasterPage())));
+ }
+
+ if( pPage )
+ {
+ SdrObjListIter aIter( pPage );
+ while( aIter.IsMore() )
+ {
+ SdrObject* pObj = aIter.Next();
+ if( dynamic_cast< const SdrPageObj *>( pObj ) != nullptr )
+ {
+ // repaint only
+ pObj->ActionChanged();
+ // pObj->SendRepaintBroadcast();
+ }
+ }
+ }
+ }
+ }
+
+ if( mpDoc->GetOnlineSpell() )
+ {
+ if( SfxItemState::SET == rAttr.GetItemState(EE_CHAR_LANGUAGE, false ) ||
+ SfxItemState::SET == rAttr.GetItemState(EE_CHAR_LANGUAGE_CJK, false ) ||
+ SfxItemState::SET == rAttr.GetItemState(EE_CHAR_LANGUAGE_CTL, false ) )
+ {
+ mpDoc->StopOnlineSpelling();
+ mpDoc->StartOnlineSpelling();
+ }
+ }
+
+ mpDoc->SetChanged();
+ }
+ break;
+
+ default:
+ {
+ if( nSId == SID_STYLE_NEW )
+ pSSPool->Remove( pStyleSheet );
+ }
+ return; // Cancel
+ }
+ }
+ }
+ break;
+
+ case SID_STYLE_NEW_BY_EXAMPLE:
+ {
+ if( pStyleSheet )
+ {
+ nRetMask = static_cast<sal_uInt16>(pStyleSheet->GetMask());
+ SfxItemSet aCoreSet( mpDoc->GetPool() );
+ mpView->GetAttributes( aCoreSet, true );
+
+ // if the object had a template, this becomes parent of the new template
+ SfxStyleSheet* pOldStyle = mpView->GetStyleSheet();
+
+ // if pOldStyle == pStyleSheet -> recursion
+ if( pOldStyle != pStyleSheet )
+ {
+ if (pOldStyle)
+ {
+ pStyleSheet->SetParent(pOldStyle->GetName());
+ }
+
+ SfxItemSet* pStyleSet = &pStyleSheet->GetItemSet();
+ pStyleSet->Put(aCoreSet);
+
+ /* apply template (but not when somebody is editing a text.
+ To do this, the edit engine had to be capable to use
+ templates on a character level. */
+ if (!mpView->GetTextEditObject())
+ {
+ mpView->SetStyleSheet( static_cast<SfxStyleSheet*>(pStyleSheet));
+ }
+
+ static_cast<SfxStyleSheet*>( pStyleSheet )->Broadcast( SfxHint( SfxHintId::DataChanged ) );
+ mpDoc->SetChanged();
+
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 );
+ }
+ }
+ }
+ break;
+
+ case SID_STYLE_UPDATE_BY_EXAMPLE:
+ {
+ if ((mpView->AreObjectsMarked() && mpView->GetMarkedObjectList().GetMarkCount() == 1) ||
+ dynamic_cast< const OutlineView *>( mpView ) != nullptr)
+ {
+ pStyleSheet = mpView->GetStyleSheet();
+
+ if( pStyleSheet )
+ {
+ nRetMask = static_cast<sal_uInt16>(pStyleSheet->GetMask());
+ SfxItemSet aCoreSet( mpDoc->GetPool() );
+ mpView->GetAttributes( aCoreSet );
+
+ SfxItemSet* pStyleSet = &pStyleSheet->GetItemSet();
+ pStyleSet->Put( aCoreSet );
+
+ mpView->SetStyleSheet( static_cast<SfxStyleSheet*>(pStyleSheet));
+
+ static_cast<SfxStyleSheet*>( pStyleSheet )->Broadcast( SfxHint( SfxHintId::DataChanged ) );
+ mpDoc->SetChanged();
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 );
+ }
+ }
+ }
+ break;
+
+ }
+ if( nRetMask != static_cast<sal_uInt16>(SfxStyleSearchBits::All) )
+ rReq.SetReturnValue( SfxUInt16Item( nSId, nRetMask ) );
+}
+
+void FuTemplate::Activate()
+{
+}
+
+void FuTemplate::Deactivate()
+{
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/futext.cxx b/sd/source/ui/func/futext.cxx
new file mode 100644
index 000000000..725bf96e1
--- /dev/null
+++ b/sd/source/ui/func/futext.cxx
@@ -0,0 +1,1464 @@
+/* -*- 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 <futext.hxx>
+#include <editeng/eeitem.hxx>
+#include <svx/sdrpagewindow.hxx>
+#include <svx/sdrpaintwindow.hxx>
+#include <tools/urlobj.hxx>
+#include <vcl/help.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <svl/intitem.hxx>
+#include <svl/stritem.hxx>
+#include <svx/svdotext.hxx>
+#include <editeng/flditem.hxx>
+#include <svl/style.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/sdtmfitm.hxx>
+#include <svx/sdtagitm.hxx>
+#include <svx/sdtfsitm.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/request.hxx>
+#include <editeng/editeng.hxx>
+#include <svx/svdoutl.hxx>
+#include <svx/svxids.hrc>
+#include <svx/sdr/overlay/overlaymanager.hxx>
+#include <sfx2/docfile.hxx>
+#include <editeng/outlobj.hxx>
+#include <osl/diagnose.h>
+
+#include <editeng/frmdiritem.hxx>
+
+#include <svx/svdetc.hxx>
+#include <editeng/editview.hxx>
+
+#include <sdresid.hxx>
+#include <app.hrc>
+
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <View.hxx>
+#include <Window.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <FrameView.hxx>
+#include <ToolBarManager.hxx>
+#include <DrawDocShell.hxx>
+#include <strings.hrc>
+#include <pres.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::linguistic2;
+
+namespace sd {
+
+const sal_uInt16 SidArray[] = {
+ SID_STYLE_FAMILY2, // 5542
+ SID_STYLE_FAMILY5, // 5545
+ SID_REDO, // 5700
+ SID_UNDO, // 5701
+ SID_CUT, // 5710
+ SID_COPY, // 5711
+ SID_ATTR_TABSTOP, // 10002
+ SID_ATTR_CHAR_FONT, // 10007
+ SID_ATTR_CHAR_POSTURE, // 10008
+ SID_ATTR_CHAR_WEIGHT, // 10009
+ SID_ATTR_CHAR_SHADOWED, // 10010
+ SID_ATTR_CHAR_STRIKEOUT, // 10013
+ SID_ATTR_CHAR_UNDERLINE, // 10014
+ SID_ATTR_CHAR_FONTHEIGHT, // 10015
+ SID_ATTR_CHAR_COLOR, // 10017
+ SID_ATTR_CHAR_KERNING, // 10018
+ SID_ATTR_CHAR_CASEMAP, // 10019
+ SID_ATTR_PARA_ADJUST_LEFT, // 10028
+ SID_ATTR_PARA_ADJUST_RIGHT, // 10029
+ SID_ATTR_PARA_ADJUST_CENTER, // 10030
+ SID_ATTR_PARA_ADJUST_BLOCK, // 10031
+ SID_ATTR_PARA_LINESPACE_10, // 10034
+ SID_ATTR_PARA_LINESPACE_15, // 10035
+ SID_ATTR_PARA_LINESPACE_20, // 10036
+ SID_ATTR_PARA_ULSPACE, // 10042
+ SID_ATTR_PARA_LRSPACE, // 10043
+ SID_ATTR_TRANSFORM_POS_X, // 10088
+ SID_ATTR_TRANSFORM_POS_Y, // 10089
+ SID_ATTR_TRANSFORM_WIDTH, // 10090
+ SID_ATTR_TRANSFORM_HEIGHT, // 10091
+ SID_ATTR_TRANSFORM_ROT_X, // 10093
+ SID_ATTR_TRANSFORM_ROT_Y, // 10094
+ SID_ATTR_TRANSFORM_ANGLE, // 10095 //Added
+ SID_OUTLINE_UP, // 10150
+ SID_OUTLINE_DOWN, // 10151
+ SID_OUTLINE_LEFT, // 10152
+ SID_OUTLINE_RIGHT, // 10153
+ SID_ATTR_TRANSFORM_PROTECT_POS, // 10236
+ SID_ATTR_TRANSFORM_PROTECT_SIZE, // 10237 //Added
+ SID_FORMTEXT_STYLE, // 10257
+ SID_SET_SUPER_SCRIPT, // 10294
+ SID_SET_SUB_SCRIPT, // 10295
+ SID_ATTR_TRANSFORM_AUTOWIDTH, // 10310
+ SID_ATTR_TRANSFORM_AUTOHEIGHT, // 10311 //Added
+ SID_HYPERLINK_GETLINK, // 10361
+ SID_DEC_INDENT, // 10461
+ SID_INC_INDENT, // 10462
+ SID_CHARMAP, // 10503
+ SID_TEXTDIRECTION_LEFT_TO_RIGHT, // 10907
+ SID_TEXTDIRECTION_TOP_TO_BOTTOM, // 10908
+ SID_ATTR_PARA_LEFT_TO_RIGHT, // 10950
+ SID_ATTR_PARA_RIGHT_TO_LEFT, // 10951
+ SID_PARASPACE_INCREASE, // 11145
+ SID_PARASPACE_DECREASE, // 11146
+ FN_NUM_BULLET_ON, // 20138
+ 0 };
+
+
+/**
+ * base class for text functions
+ */
+FuText::FuText( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+: FuConstruct(pViewSh, pWin, pView, pDoc, rReq)
+, bFirstObjCreated(false)
+, bJustEndedEdit(false)
+, rRequest (rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuText::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuText( pViewSh, pWin, pView, pDoc, rReq ) );
+ return xFunc;
+}
+
+void FuText::disposing()
+{
+ if(mpView)
+ {
+ if(mpView->SdrEndTextEdit() == SdrEndTextEditKind::Deleted)
+ mxTextObj.reset(nullptr);
+
+ // reset the RequestHandler of the used Outliner to the handler of the document
+ ::Outliner* pOutliner = mpView->GetTextEditOutliner();
+
+ if (pOutliner)
+ pOutliner->SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(mpDoc->GetStyleSheetPool()));
+ }
+}
+
+/*************************************************************************
+|*
+|* Execute functionality of this class:
+|*
+|* #71422: Start the functionality of this class in this method
+|* and not in the ctor.
+|* If you construct an object of this class and you put the
+|* address of this object to pFuActual you've got a problem,
+|* because some methods inside DoExecute use the pFuActual-Pointer.
+|* If the code inside DoExecute is executed inside the ctor,
+|* the value of pFuActual is not right. And the value will not
+|* be right until the ctor finished !!!
+|*
+\************************************************************************/
+void FuText::DoExecute( SfxRequest& )
+{
+ mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBarShell(
+ ToolBarManager::ToolBarGroup::Function,
+ ToolbarId::Draw_Text_Toolbox_Sd);
+
+ mpView->SetCurrentObj(SdrObjKind::Text);
+ mpView->SetEditMode(SdrViewEditMode::Edit);
+
+ MouseEvent aMEvt(mpWindow->GetPointerPosPixel());
+
+ if (nSlotId == SID_TEXTEDIT)
+ {
+ // Try to select an object
+ SdrPageView* pPV = mpView->GetSdrPageView();
+ SdrViewEvent aVEvt;
+ mpView->PickAnything(aMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+ mpView->MarkObj(aVEvt.mpRootObj, pPV);
+
+ mxTextObj.reset( dynamic_cast< SdrTextObj* >( aVEvt.mpObj ) );
+ }
+ else if (mpView->AreObjectsMarked())
+ {
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ mxTextObj.reset( dynamic_cast< SdrTextObj* >( pObj ) );
+ }
+ }
+
+ // check for table
+ if (mpView->AreObjectsMarked())
+ {
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ if( pObj && (pObj->GetObjInventor() == SdrInventor::Default ) && (pObj->GetObjIdentifier() == SdrObjKind::Table) )
+ {
+ mpViewShell->GetViewShellBase().GetToolBarManager()->AddToolBarShell(ToolBarManager::ToolBarGroup::Function, ToolbarId::Draw_Table_Toolbox);
+ }
+ }
+ }
+
+ bool bQuickDrag = true;
+
+ const SfxItemSet* pArgs = rRequest.GetArgs();
+
+ if (pArgs
+
+ // test for type before using
+ && SID_TEXTEDIT == nSlotId
+ && SfxItemState::SET == pArgs->GetItemState(SID_TEXTEDIT)
+
+ && static_cast<const SfxUInt16Item&>(pArgs->Get(SID_TEXTEDIT)).GetValue() == 2)
+ {
+ // Selection by doubleclick -> don't allow QuickDrag
+ bQuickDrag = false;
+ }
+
+ SetInEditMode(aMEvt, bQuickDrag);
+}
+
+bool FuText::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ bMBDown = true;
+ bJustEndedEdit = false;
+
+ bool bReturn = FuDraw::MouseButtonDown(rMEvt);
+
+ SdrViewEvent aVEvt;
+ SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+
+ // handle URL also during the text editing
+ if (rMEvt.GetClicks() == 1 && rMEvt.IsLeft() && rMEvt.IsMod1())
+ {
+ OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
+
+ if (mxTextObj.is() && pOLV && pOLV->GetFieldUnderMousePointer())
+ {
+ const SvxFieldItem* pFieldItem = pOLV->GetFieldUnderMousePointer();
+ if (pFieldItem)
+ {
+ const SvxFieldData* pField = pFieldItem->GetField();
+
+ if (auto pURLField = dynamic_cast< const SvxURLField *>( pField ))
+ {
+ eHit = SdrHitKind::MarkedObject;
+ aVEvt.meEvent = SdrEventKind::ExecuteUrl;
+ aVEvt.mpURLField = pURLField;
+ }
+ }
+ }
+ }
+
+ if (eHit == SdrHitKind::TextEdit)
+ {
+ // hit text -> SdrView handles event
+ if (mpView->MouseButtonDown(rMEvt, mpWindow->GetOutDev()))
+ return true;
+ }
+
+ if (rMEvt.GetClicks() == 1)
+ {
+ if (mpView->IsTextEdit() && eHit != SdrHitKind::MarkedObject && eHit != SdrHitKind::Handle)
+ {
+ // finish text input
+ if(mpView->SdrEndTextEdit() == SdrEndTextEditKind::Deleted)
+ {
+ /* Bugfix from MBA: during a double click onto the unused? area
+ in text mode, we get with the second click eHit =
+ SdrHitKind::TextEditObj since it goes to the TextObject which was
+ created with the first click. But this is removed by
+ SdrEndTextEdit since it is empty. But it is still in the mark
+ list. The call MarkObj further below accesses then the dead
+ object. As a simple fix, we determine eHit after
+ SdrEndTextEdit again, this returns then SdrHitKind::NONE. */
+ mxTextObj.reset(nullptr);
+ eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+ }
+
+ mpView->SetCurrentObj(SdrObjKind::Text);
+ mpView->SetEditMode(SdrViewEditMode::Edit);
+ }
+
+ if (rMEvt.IsLeft() || rMEvt.IsRight())
+ {
+ mpWindow->CaptureMouse();
+ SdrPageView* pPV = mpView->GetSdrPageView();
+
+ if (eHit == SdrHitKind::TextEdit)
+ {
+ SetInEditMode(rMEvt, false);
+ }
+ else
+ {
+ // Don't remark table when clicking in it, mark change triggers a lot of updating
+ bool bMarkChanges = true;
+ rtl::Reference< sdr::SelectionController > xSelectionController(mpView->getSelectionController());
+ if (eHit == SdrHitKind::TextEditObj && xSelectionController.is())
+ {
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ if (rMarkList.GetMarkCount() == 1 && rMarkList.GetMark(0)->GetMarkedSdrObj() == aVEvt.mpRootObj)
+ bMarkChanges = false;
+ }
+
+ if (eHit != SdrHitKind::Handle)
+ {
+ // deselect selection
+ if (!rMEvt.IsShift() && eHit == SdrHitKind::TextEditObj)
+ {
+ if(bMarkChanges)
+ {
+ mpView->UnmarkAll();
+ mpView->SetDragMode(SdrDragMode::Move);
+ }
+ }
+ }
+
+ if ( aVEvt.meEvent == SdrEventKind::ExecuteUrl ||
+ eHit == SdrHitKind::Handle ||
+ eHit == SdrHitKind::MarkedObject ||
+ eHit == SdrHitKind::TextEditObj ||
+ ( eHit == SdrHitKind::UnmarkedObject && bFirstObjCreated &&
+ !bPermanent ) )
+ {
+ // Handle, hit marked or unmarked object
+ if (eHit == SdrHitKind::TextEditObj)
+ {
+ /* hit text of unmarked object:
+ select object and set to EditMode */
+ if (bMarkChanges)
+ mpView->MarkObj(aVEvt.mpRootObj, pPV);
+
+ if (auto pSdrTextObj = dynamic_cast<SdrTextObj*>(aVEvt.mpObj))
+ {
+ mxTextObj.reset( pSdrTextObj );
+ }
+
+ SetInEditMode(rMEvt, true);
+ }
+ else if (aVEvt.meEvent == SdrEventKind::ExecuteUrl && !rMEvt.IsMod2())
+ {
+ // execute URL
+ mpWindow->ReleaseMouse();
+ SfxStringItem aStrItem(SID_FILE_NAME, aVEvt.mpURLField->GetURL());
+ SfxStringItem aReferer(SID_REFERER, mpDocSh->GetMedium()->GetName());
+ SfxBoolItem aBrowseItem( SID_BROWSE, true );
+ SfxViewFrame* pFrame = mpViewShell->GetViewFrame();
+ mpWindow->ReleaseMouse();
+
+ if (rMEvt.IsMod1())
+ {
+ // open in new frame
+ pFrame->GetDispatcher()->ExecuteList(SID_OPENDOC,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aStrItem, &aBrowseItem, &aReferer });
+ }
+ else
+ {
+ // open in current frame
+ SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame);
+ pFrame->GetDispatcher()->ExecuteList(SID_OPENDOC,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aStrItem, &aFrameItem, &aBrowseItem, &aReferer });
+ }
+ }
+ else
+ {
+ // drag object or handle
+
+ // #i78748#
+ // do the EndTextEdit first, it will delete the handles and force a
+ // recreation. This will make aVEvt.mpHdl to point to a deleted handle,
+ // thus it is necessary to reset it and to get it again.
+
+ // #i112855#
+ // cl: I'm not sure why we checked here also for mxTextObj->GetOutlinerParaObject
+ // this caused SdrEndTextEdit() to be called also when not in text editing and
+ // this does not make sense and caused troubles. (see issue 112855)
+
+ if( mpView->IsTextEdit() )
+ {
+ mpView->SdrEndTextEdit();
+ bJustEndedEdit = true;
+
+ if(aVEvt.mpHdl)
+ {
+ // force new handle identification, the pointer will be dead here
+ // since SdrEndTextEdit has reset (deleted) the handles.
+ aVEvt.mpHdl = nullptr;
+ mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+ }
+ }
+
+ if (!aVEvt.mpHdl)
+ {
+ if( eHit == SdrHitKind::UnmarkedObject )
+ {
+ if ( !rMEvt.IsShift() )
+ mpView->UnmarkAll();
+
+ mpView->MarkObj(aVEvt.mpRootObj, pPV);
+ }
+
+ // Drag object
+ bFirstMouseMove = true;
+ aDragTimer.Start();
+ }
+
+ if ( ! rMEvt.IsRight())
+ {
+ // we need to pick again since SdrEndTextEdit can rebuild the handles list
+ eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+ if( (eHit == SdrHitKind::Handle) || (eHit == SdrHitKind::MarkedObject) )
+ {
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+ mpView->BegDragObj(aMDPos, nullptr, aVEvt.mpHdl, nDrgLog);
+ }
+ }
+ bReturn = true;
+ }
+ }
+ else if ( nSlotId != SID_TEXTEDIT &&
+ (bPermanent || !bFirstObjCreated) )
+ {
+ // create object
+ mpView->SetCurrentObj(SdrObjKind::Text);
+ mpView->SetEditMode(SdrViewEditMode::Create);
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+ mpView->BegCreateObj(aMDPos, nullptr, nDrgLog);
+ }
+ else
+ {
+ // select
+ if( !rMEvt.IsShift() )
+ mpView->UnmarkAll();
+
+ mpView->BegMarkObj( aMDPos );
+ }
+ }
+ }
+ }
+ else if ( rMEvt.GetClicks() == 2 && !mpView->IsTextEdit() )
+ {
+ MouseEvent aMEvt( mpWindow->GetPointerPosPixel() );
+ SetInEditMode( aMEvt, false );
+ }
+
+ if (!bIsInDragMode)
+ {
+ ForcePointer(&rMEvt);
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate(SidArray);
+ }
+
+ return bReturn;
+}
+
+bool FuText::MouseMove(const MouseEvent& rMEvt)
+{
+ bool bReturn = FuDraw::MouseMove(rMEvt);
+
+ if (aDragTimer.IsActive() )
+ {
+ if( bFirstMouseMove )
+ bFirstMouseMove = false;
+ else
+ aDragTimer.Stop();
+ }
+
+ if (!bReturn && mpView->IsAction() && !mpDocSh->IsReadOnly())
+ {
+ Point aPix(rMEvt.GetPosPixel());
+ Point aPnt(mpWindow->PixelToLogic(aPix));
+
+ ForceScroll(aPix);
+ mpView->MovAction(aPnt);
+ }
+
+ ForcePointer(&rMEvt);
+
+ return bReturn;
+}
+
+void FuText::ImpSetAttributesForNewTextObject(SdrTextObj* pTxtObj)
+{
+ if(mpDoc->GetDocumentType() == DocumentType::Impress)
+ {
+ if( nSlotId == SID_ATTR_CHAR )
+ {
+ /* Create Impress text object (rescales to line height)
+ We get the correct height during the subsequent creation of the
+ object, otherwise we draw too much */
+ SfxItemSet aSet(mpViewShell->GetPool());
+ aSet.Put(makeSdrTextMinFrameHeightItem(0));
+ aSet.Put(makeSdrTextAutoGrowWidthItem(false));
+ aSet.Put(makeSdrTextAutoGrowHeightItem(true));
+ pTxtObj->SetMergedItemSet(aSet);
+ pTxtObj->AdjustTextFrameWidthAndHeight();
+ aSet.Put(makeSdrTextMaxFrameHeightItem(pTxtObj->GetLogicRect().GetSize().Height()));
+ pTxtObj->SetMergedItemSet(aSet);
+ const SfxViewShell* pCurrentViewShell = SfxViewShell::Current();
+ if (pCurrentViewShell && (pCurrentViewShell->isLOKMobilePhone() || pCurrentViewShell->isLOKTablet()))
+ pTxtObj->SetText(SdResId(STR_PRESOBJ_TEXT_EDIT_MOBILE));
+ }
+ else if( nSlotId == SID_ATTR_CHAR_VERTICAL )
+ {
+ SfxItemSet aSet(mpViewShell->GetPool());
+ aSet.Put(makeSdrTextMinFrameWidthItem(0));
+ aSet.Put(makeSdrTextAutoGrowWidthItem(true));
+ aSet.Put(makeSdrTextAutoGrowHeightItem(false));
+
+ // Needs to be set since default is SDRTEXTHORZADJUST_BLOCK
+ aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
+ pTxtObj->SetMergedItemSet(aSet);
+ pTxtObj->AdjustTextFrameWidthAndHeight();
+ aSet.Put(makeSdrTextMaxFrameWidthItem(pTxtObj->GetLogicRect().GetSize().Width()));
+ pTxtObj->SetMergedItemSet(aSet);
+ }
+ }
+ else
+ {
+ if( nSlotId == SID_ATTR_CHAR_VERTICAL )
+ {
+ // draw text object, needs to be initialized when vertical text is used
+ SfxItemSet aSet(mpViewShell->GetPool());
+
+ aSet.Put(makeSdrTextAutoGrowWidthItem(true));
+ aSet.Put(makeSdrTextAutoGrowHeightItem(false));
+
+ // Set defaults for vertical click-n'drag text object, pool defaults are:
+ // SdrTextVertAdjustItem: SDRTEXTVERTADJUST_TOP
+ // SdrTextHorzAdjustItem: SDRTEXTHORZADJUST_BLOCK
+ // Analog to that:
+ aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_BLOCK));
+ aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
+
+ pTxtObj->SetMergedItemSet(aSet);
+ }
+ }
+}
+
+void FuText::ImpSetAttributesFitToSize(SdrTextObj* pTxtObj)
+{
+ // FitToSize (fit to frame)
+ SfxItemSetFixed<SDRATTR_TEXT_AUTOGROWHEIGHT, SDRATTR_TEXT_AUTOGROWWIDTH> aSet(mpViewShell->GetPool());
+ aSet.Put(SdrTextFitToSizeTypeItem(drawing::TextFitToSizeType_PROPORTIONAL));
+ aSet.Put(makeSdrTextAutoGrowHeightItem(false));
+ aSet.Put(makeSdrTextAutoGrowWidthItem(false));
+ pTxtObj->SetMergedItemSet(aSet);
+ pTxtObj->AdjustTextFrameWidthAndHeight();
+}
+
+void FuText::ImpSetAttributesFitToSizeVertical(SdrTextObj* pTxtObj)
+{
+ SfxItemSetFixed<SDRATTR_TEXT_AUTOGROWHEIGHT, SDRATTR_TEXT_AUTOGROWWIDTH> aSet(mpViewShell->GetPool());
+ aSet.Put(SdrTextFitToSizeTypeItem(drawing::TextFitToSizeType_PROPORTIONAL));
+ aSet.Put(makeSdrTextAutoGrowHeightItem(false));
+ aSet.Put(makeSdrTextAutoGrowWidthItem(false));
+ pTxtObj->SetMergedItemSet(aSet);
+ pTxtObj->AdjustTextFrameWidthAndHeight();
+}
+
+void FuText::ImpSetAttributesFitCommon(SdrTextObj* pTxtObj)
+{
+ // Normal Textobject
+ if (mpDoc->GetDocumentType() != DocumentType::Impress)
+ return;
+
+ if( nSlotId == SID_ATTR_CHAR )
+ {
+ // Impress text object (rescales to line height)
+ SfxItemSet aSet(mpViewShell->GetPool());
+ aSet.Put(makeSdrTextMinFrameHeightItem(0));
+ aSet.Put(makeSdrTextMaxFrameHeightItem(0));
+ aSet.Put(makeSdrTextAutoGrowHeightItem(true));
+ aSet.Put(makeSdrTextAutoGrowWidthItem(false));
+ pTxtObj->SetMergedItemSet(aSet);
+ }
+ else if( nSlotId == SID_ATTR_CHAR_VERTICAL )
+ {
+ SfxItemSet aSet(mpViewShell->GetPool());
+ aSet.Put(makeSdrTextMinFrameWidthItem(0));
+ aSet.Put(makeSdrTextMaxFrameWidthItem(0));
+ aSet.Put(makeSdrTextAutoGrowWidthItem(true));
+ aSet.Put(makeSdrTextAutoGrowHeightItem(false));
+ pTxtObj->SetMergedItemSet(aSet);
+ }
+
+ pTxtObj->AdjustTextFrameWidthAndHeight();
+}
+
+bool FuText::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ bool bReturn = false;
+ if (aDragTimer.IsActive())
+ {
+ aDragTimer.Stop();
+ bIsInDragMode = false;
+ }
+
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray );
+
+ Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
+
+ if( (mpView && mpView->MouseButtonUp(rMEvt, mpWindow->GetOutDev())) || rMEvt.GetClicks() == 2 )
+ return true; // handle event from SdrView
+
+ bool bEmptyTextObj = false;
+
+ if (mxTextObj.is())
+ {
+ bool bReset = true;
+
+ if (mpView)
+ {
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if (rMarkList.GetMarkCount() == 1
+ && ( rMarkList.GetMark(0)->GetMarkedSdrObj() == mxTextObj.get()) )
+ {
+ if( mxTextObj.is() && !GetTextObj()->GetOutlinerParaObject() )
+ bEmptyTextObj = true;
+ else
+ bFirstObjCreated = true;
+ bReset = false;
+ }
+ }
+
+ if (bReset)
+ {
+ mxTextObj.reset(nullptr);
+ }
+ }
+
+ if( mpView && mpView->IsDragObj())
+ {
+ // object was moved
+ FrameView* pFrameView = mpViewShell->GetFrameView();
+ bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy());
+
+ if (bDragWithCopy)
+ {
+ bDragWithCopy = !mpView->IsPresObjSelected(false);
+ }
+
+ mpView->SetDragWithCopy(bDragWithCopy);
+ mpView->EndDragObj( mpView->IsDragWithCopy() );
+ mpView->ForceMarkedToAnotherPage();
+ mpView->SetCurrentObj(SdrObjKind::Text);
+
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+
+ if (bJustEndedEdit)
+ {
+ bJustEndedEdit = false;
+ FuPoor::cancel();
+ }
+ if ((rMEvt.GetClicks() != 2) &&
+ !rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() && !rMEvt.IsRight() &&
+ std::abs(aPnt.X() - aMDPos.X()) < nDrgLog &&
+ std::abs(aPnt.Y() - aMDPos.Y()) < nDrgLog)
+ {
+ /*************************************************************
+ * From text mode, you don't want to rotate immediately.
+ **************************************************************/
+ SdrPageView* pPV;
+ SdrObject* pObj = mpView->PickObj(aMDPos, mpView->getHitTolLog(), pPV, SdrSearchOptions::ALSOONMASTER | SdrSearchOptions::BEFOREMARK);
+ if (pObj && pPV->IsObjMarkable(pObj))
+ {
+ mpView->UnmarkAllObj();
+ mpView->MarkObj(pObj,pPV);
+ return bReturn;
+ }
+ }
+ }
+ else if( mpView && mpView->IsCreateObj() && rMEvt.IsLeft())
+ {
+ // object was created
+ mxTextObj.reset( dynamic_cast< SdrTextObj* >( mpView->GetCreateObj() ) );
+
+ if( mxTextObj.is() )
+ {
+ //AW outliner needs to be set to vertical when there is no
+ // outliner object up to now; also it needs to be set back to not
+ // vertical when there was a vertical one used last time.
+ OutlinerParaObject* pOPO = GetTextObj()->GetOutlinerParaObject();
+ SdrOutliner& rOutl(mxTextObj->getSdrModelFromSdrObject().GetDrawOutliner(GetTextObj()));
+ bool bVertical((pOPO && pOPO->IsEffectivelyVertical())
+ || nSlotId == SID_ATTR_CHAR_VERTICAL
+ || nSlotId == SID_TEXT_FITTOSIZE_VERTICAL);
+ rOutl.SetVertical(bVertical);
+
+ // Before ImpSetAttributesForNewTextObject the vertical writing mode
+ // needs to be set at the object. This is done here at the OutlinerParaObject
+ // directly to not mirror the layout text items involved. These items will be set
+ // from ImpSetAttributesForNewTextObject and below.
+ OutlinerParaObject* pPara = GetTextObj()->GetOutlinerParaObject();
+
+ if(!pPara)
+ {
+ GetTextObj()->ForceOutlinerParaObject();
+ pPara = GetTextObj()->GetOutlinerParaObject();
+ }
+
+ if(pPara && bVertical != pPara->IsEffectivelyVertical())
+ {
+ // set ParaObject orientation accordingly
+ pPara->SetVertical(bVertical);
+ }
+
+ ImpSetAttributesForNewTextObject(GetTextObj());
+ }
+
+ if (!mpView->EndCreateObj(SdrCreateCmd::ForceEnd))
+ {
+ // it was not possible to create text object
+ mxTextObj.reset(nullptr);
+ }
+ else if (nSlotId == SID_TEXT_FITTOSIZE)
+ {
+ ImpSetAttributesFitToSize(GetTextObj());
+
+ SetInEditMode(rMEvt, false);
+ }
+ else if ( nSlotId == SID_TEXT_FITTOSIZE_VERTICAL )
+ {
+ ImpSetAttributesFitToSizeVertical(GetTextObj());
+
+ SetInEditMode(rMEvt, false);
+ }
+ else
+ {
+ ImpSetAttributesFitCommon(GetTextObj());
+
+ // thereby the handles and the gray frame are correct
+ mpView->AdjustMarkHdl();
+ mpView->PickHandle(aPnt);
+ SetInEditMode(rMEvt, false);
+ }
+ }
+ else if ( mpView && mpView->IsAction())
+ {
+ mpView->EndAction();
+ }
+
+ ForcePointer(&rMEvt);
+ mpWindow->ReleaseMouse();
+ sal_uInt16 nDrgLog1 = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+
+ if ( mpView && !mpView->AreObjectsMarked() &&
+ std::abs(aMDPos.X() - aPnt.X()) < nDrgLog1 &&
+ std::abs(aMDPos.Y() - aPnt.Y()) < nDrgLog1 &&
+ !rMEvt.IsShift() && !rMEvt.IsMod2() )
+ {
+ SdrPageView* pPV2 = mpView->GetSdrPageView();
+ SdrViewEvent aVEvt;
+ mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+ mpView->MarkObj(aVEvt.mpRootObj, pPV2);
+ }
+
+ if ( !mxTextObj.is() && mpView )
+ {
+ if ( ( (!bEmptyTextObj && bPermanent) ||
+ (!bFirstObjCreated && !bPermanent) ) &&
+ !mpDocSh->IsReadOnly() &&
+ nSlotId != SID_TEXTEDIT )
+ {
+ // text body (left-justified AutoGrow)
+ mpView->SetCurrentObj(SdrObjKind::Text);
+ mpView->SetEditMode(SdrViewEditMode::Create);
+ sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
+ mpView->BegCreateObj(aMDPos, nullptr, nDrgLog);
+
+ bool bSnapEnabled = mpView->IsSnapEnabled();
+
+ if (bSnapEnabled)
+ mpView->SetSnapEnabled(false);
+
+ aPnt.AdjustX(nDrgLog + nDrgLog );
+ aPnt.AdjustY(nDrgLog + nDrgLog );
+ mpView->MovAction(aPnt);
+
+ mxTextObj.reset( dynamic_cast< SdrTextObj* >( mpView->GetCreateObj() ) );
+
+ if(mxTextObj.is())
+ {
+ GetTextObj()->SetDisableAutoWidthOnDragging(true);
+ }
+
+ if(!mpView->EndCreateObj(SdrCreateCmd::ForceEnd))
+ {
+ mxTextObj.reset(nullptr);
+ }
+
+ if(bSnapEnabled)
+ mpView->SetSnapEnabled(bSnapEnabled);
+
+ if(mxTextObj.is())
+ {
+ SfxItemSet aSet(mpViewShell->GetPool());
+ aSet.Put(makeSdrTextMinFrameHeightItem(0));
+ aSet.Put(makeSdrTextMinFrameWidthItem(0));
+ aSet.Put(makeSdrTextAutoGrowHeightItem(true));
+ aSet.Put(makeSdrTextAutoGrowWidthItem(true));
+
+ if(nSlotId == SID_ATTR_CHAR_VERTICAL)
+ {
+ // Here, all items which need to be different from pool default need to be set
+ // again on the newly created text object.
+ // Since this is a simple click text object, it is first created, then SetVertical()
+ // is used, then ImpSetAttributesForNewTextObject is called and then the object is
+ // deleted again since not the minimum drag distance was travelled. Then, a new
+ // click text object is created and thus all that stuff needs to be set again here.
+
+ // Before using the new object the vertical writing mode
+ // needs to be set. This is done here at the OutlinerParaObject
+ // directly to not mirror the layout text items involved. These items will be set
+ // below.
+ OutlinerParaObject* pPara = GetTextObj()->GetOutlinerParaObject();
+
+ if(!pPara)
+ {
+ GetTextObj()->ForceOutlinerParaObject();
+ pPara = GetTextObj()->GetOutlinerParaObject();
+ }
+
+ if(pPara && !pPara->IsEffectivelyVertical())
+ {
+ // set ParaObject orientation accordingly
+ pPara->SetVertical(true);
+ }
+
+ aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
+
+ // Analog to the else case below, for vertical simple click texts
+ // one of the default set items from ImpSetAttributesForNewTextObject
+ // needs to be adapted to non-block mode.
+ const SfxItemSet& rSet = mpView->GetDefaultAttr();
+ SvxFrameDirection eDirection = rSet.Get(EE_PARA_WRITINGDIR).GetValue();
+
+ if(SvxFrameDirection::Horizontal_RL_TB == eDirection || SvxFrameDirection::Vertical_RL_TB == eDirection)
+ {
+ aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_BOTTOM));
+ }
+ else
+ {
+ aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP));
+ }
+ }
+ else
+ {
+ // This is for Format/Page settings. Since this also leads
+ // to the object defaults to be changed, i think this code can be
+ // removed. CL. wanted to take a look before adding this.
+
+ // Look in the object defaults if left-to-right is wanted. If
+ // yes, set text anchoring to right to let the box grow to left.
+ const SfxItemSet& rSet = mpView->GetDefaultAttr();
+ SvxFrameDirection eDirection = rSet.Get(EE_PARA_WRITINGDIR).GetValue();
+
+ if(SvxFrameDirection::Horizontal_RL_TB == eDirection)
+ {
+ aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
+ }
+ else
+ {
+ aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_LEFT));
+ }
+ }
+
+ GetTextObj()->SetMergedItemSet(aSet);
+ GetTextObj()->SetDisableAutoWidthOnDragging(true);
+ SetInEditMode(rMEvt, false);
+ }
+
+ bFirstObjCreated = true;
+ }
+ else
+ {
+ // switch to selection
+ if (mpView->SdrEndTextEdit() == SdrEndTextEditKind::Deleted)
+ {
+ mxTextObj.reset(nullptr);
+ }
+
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_OBJECT_SELECT,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+ }
+ }
+ if (bJustEndedEdit)
+ {
+ bJustEndedEdit = false;
+ FuPoor::cancel();
+ }
+ bMBDown = false;
+ FuConstruct::MouseButtonUp(rMEvt);
+ return bReturn;
+}
+
+/**
+ * handle keyboard events
+ * @returns sal_True if the event was handled, sal_False otherwise
+ */
+bool FuText::KeyInput(const KeyEvent& rKEvt)
+{
+ bool bReturn = false;
+
+ vcl::KeyCode nCode = rKEvt.GetKeyCode();
+ bool bShift = nCode.IsShift();
+
+ if(mxTextObj.is())
+ {
+ // maybe object is deleted, test if it's equal to the selected object
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ SdrObject* pSelectedObj = nullptr;
+
+ if(1 == rMarkList.GetMarkCount())
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ pSelectedObj = pMark->GetMarkedSdrObj();
+ }
+
+ if(mxTextObj.get() != pSelectedObj)
+ {
+ mxTextObj.reset(nullptr);
+ }
+ }
+
+ if ( mxTextObj.is() && mxTextObj->GetObjInventor() == SdrInventor::Default && mxTextObj->GetObjIdentifier() == SdrObjKind::TitleText && rKEvt.GetKeyCode().GetCode() == KEY_RETURN )
+ {
+ // title text object: always soft breaks
+ bShift = true;
+ }
+
+ sal_uInt16 nKey = nCode.GetCode();
+ vcl::KeyCode aKeyCode (nKey, bShift, nCode.IsMod1(), nCode.IsMod2(), nCode.IsMod3() );
+ KeyEvent aKEvt(rKEvt.GetCharCode(), aKeyCode);
+
+ bool bOK = true;
+
+ if (mpDocSh->IsReadOnly())
+ {
+ bOK = !EditEngine::DoesKeyChangeText(aKEvt);
+ }
+ if( aKeyCode.GetCode() == KEY_PAGEUP || aKeyCode.GetCode() == KEY_PAGEDOWN )
+ {
+ bOK = false; // default handling in base class
+ }
+
+ if (bOK && mpView->KeyInput(aKEvt, mpWindow) )
+ {
+ bReturn = true;
+
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArray );
+
+ }
+ else if (aKeyCode == KEY_ESCAPE)
+ {
+ bReturn = cancel();
+ }
+
+ if( bPermanent )
+ {
+ mpView->SetCurrentObj(SdrObjKind::Text);
+ mpView->SetEditMode(SdrViewEditMode::Create);
+ }
+
+ if (!bReturn)
+ {
+ bReturn = FuDraw::KeyInput(aKEvt);
+ }
+
+ return bReturn;
+}
+
+void FuText::Activate()
+{
+ mpView->SetQuickTextEditMode(mpViewShell->GetFrameView()->IsQuickEdit());
+
+ // #i89661# it's no longer necessary to make it so big here, it's fine tuned
+ // for text objects in SdrMarkView::CheckSingleSdrObjectHit
+ mpView->SetHitTolerancePixel( 2 * HITPIX );
+
+ OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
+
+ if (pOLV)
+ pOLV->ShowCursor(/*bGotoCursor=*/true, /*bActivate=*/true);
+
+ FuConstruct::Activate();
+
+ if( pOLV )
+ mpView->SetEditMode(SdrViewEditMode::Edit);
+}
+
+void FuText::Deactivate()
+{
+ OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
+
+ if (pOLV)
+ pOLV->HideCursor(/*bDeactivate=*/true);
+
+ mpView->SetHitTolerancePixel( HITPIX );
+
+ FuConstruct::Deactivate();
+}
+
+/**
+ * Sets the object into the edit mode.
+ */
+void FuText::SetInEditMode(const MouseEvent& rMEvt, bool bQuickDrag)
+{
+ SdrPageView* pPV = mpView->GetSdrPageView();
+ if( mxTextObj.is() && (mxTextObj->getSdrPageFromSdrObject() == pPV->GetPage()) )
+ {
+ mpView->SetCurrentObj(SdrObjKind::Text);
+
+ if( bPermanent )
+ mpView->SetEditMode(SdrViewEditMode::Create);
+ else
+ mpView->SetEditMode(SdrViewEditMode::Edit);
+
+ bool bEmptyOutliner = false;
+
+ if (!GetTextObj()->GetOutlinerParaObject() && mpView->GetTextEditOutliner())
+ {
+ ::Outliner* pOutl = mpView->GetTextEditOutliner();
+ sal_Int32 nParagraphCnt = pOutl->GetParagraphCount();
+ Paragraph* p1stPara = pOutl->GetParagraph( 0 );
+
+ if (nParagraphCnt==1 && p1stPara)
+ {
+ // with only one paragraph
+ if (pOutl->GetText(p1stPara).isEmpty())
+ {
+ bEmptyOutliner = true;
+ }
+ }
+ }
+
+ if (GetTextObj() != mpView->GetTextEditObject() || bEmptyOutliner)
+ {
+ SdrInventor nInv = mxTextObj->GetObjInventor();
+ SdrObjKind nSdrObjKind = mxTextObj->GetObjIdentifier();
+
+ if (nInv == SdrInventor::Default && GetTextObj()->HasTextEdit() &&
+ (nSdrObjKind == SdrObjKind::Text ||
+ nSdrObjKind == SdrObjKind::TitleText ||
+ nSdrObjKind == SdrObjKind::OutlineText || !mxTextObj->IsEmptyPresObj() ) )
+ {
+ // create new outliner (owned by SdrObjEditView)
+ std::unique_ptr<SdrOutliner> pOutl = SdrMakeOutliner(OutlinerMode::OutlineObject, *mpDoc);
+
+ if (bEmptyOutliner)
+ mpView->SdrEndTextEdit(true);
+
+ SdrTextObj* pTextObj = GetTextObj();
+ if( pTextObj )
+ {
+ OutlinerParaObject* pOPO = pTextObj->GetOutlinerParaObject();
+ if( pOPO && pOPO->IsEffectivelyVertical() )
+ {
+ pOutl->SetVertical(pOPO->GetVertical());
+ pOutl->SetRotation(pOPO->GetRotation());
+ }
+ else if (nSlotId == SID_ATTR_CHAR_VERTICAL || nSlotId == SID_TEXT_FITTOSIZE_VERTICAL)
+ pOutl->SetVertical( true );
+
+ if( pTextObj->getTextCount() > 1 )
+ {
+ Point aPix(rMEvt.GetPosPixel());
+ Point aPnt(mpWindow->PixelToLogic(aPix));
+ pTextObj->setActiveText( pTextObj->CheckTextHit(aPnt ) );
+ }
+
+ if (mpView->SdrBeginTextEdit(pTextObj, pPV, mpWindow, true, pOutl.release()) && mxTextObj->GetObjInventor() == SdrInventor::Default)
+ {
+ //tdf#102293 flush overlay before going on to pass clicks down to
+ //the outline view which will want to paint selections
+ for (sal_uInt32 b = 0; b < pPV->PageWindowCount(); ++b)
+ {
+ const SdrPageWindow& rPageWindow = *pPV->GetPageWindow(b);
+ if (!rPageWindow.GetPaintWindow().OutputToWindow())
+ continue;
+ const rtl::Reference< sdr::overlay::OverlayManager >& xManager = rPageWindow.GetOverlayManager();
+ if (!xManager.is())
+ continue;
+ xManager->flush();
+ }
+
+ bFirstObjCreated = true;
+ DeleteDefaultText();
+
+ OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
+
+ nSdrObjKind = mxTextObj->GetObjIdentifier();
+
+ SdrViewEvent aVEvt;
+ SdrHitKind eHit = mpView->PickAnything(rMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+
+ if (eHit == SdrHitKind::TextEdit)
+ {
+ // hit text
+ if (nSdrObjKind == SdrObjKind::Text ||
+ nSdrObjKind == SdrObjKind::TitleText ||
+ nSdrObjKind == SdrObjKind::OutlineText ||
+ nSdrObjKind == SdrObjKind::Table ||
+ nSlotId == SID_TEXTEDIT ||
+ !bQuickDrag)
+ {
+ pOLV->MouseButtonDown(rMEvt);
+ pOLV->MouseMove(rMEvt);
+ pOLV->MouseButtonUp(rMEvt);
+ }
+
+ if (mpViewShell->GetFrameView()->IsQuickEdit() && bQuickDrag && GetTextObj()->GetOutlinerParaObject())
+ {
+ pOLV->MouseButtonDown(rMEvt);
+ }
+ }
+ else
+ {
+ // Move cursor to end of text
+ ESelection aNewSelection(EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND, EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND);
+ if (pOLV != nullptr)
+ pOLV->SetSelection(aNewSelection);
+ }
+ }
+ else
+ {
+ mpView->RestoreDefaultText( mxTextObj.get() );
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ mxTextObj.reset(nullptr);
+ }
+}
+
+/**
+ * Text entry is started, if necessary delete the default text.
+ */
+void FuText::DeleteDefaultText()
+{
+ if ( !(mxTextObj.is() && mxTextObj->IsEmptyPresObj()) )
+ return;
+
+ SdPage* pPage = static_cast<SdPage*>( mxTextObj->getSdrPageFromSdrObject() );
+
+ if (!pPage)
+ return;
+
+ PresObjKind ePresObjKind = pPage->GetPresObjKind(mxTextObj.get());
+
+ if ( !(ePresObjKind == PresObjKind::Title ||
+ ePresObjKind == PresObjKind::Outline ||
+ ePresObjKind == PresObjKind::Notes ||
+ ePresObjKind == PresObjKind::Text ) ||
+ pPage->IsMasterPage() )
+ return;
+
+ ::Outliner* pOutliner = mpView->GetTextEditOutliner();
+ SfxStyleSheet* pSheet = pOutliner->GetStyleSheet( 0 );
+ bool bIsUndoEnabled = pOutliner->IsUndoEnabled();
+ if( bIsUndoEnabled )
+ pOutliner->EnableUndo(false);
+
+ pOutliner->SetText( OUString(), pOutliner->GetParagraph( 0 ) );
+
+ if( bIsUndoEnabled )
+ pOutliner->EnableUndo(true);
+
+ if (pSheet &&
+ (ePresObjKind == PresObjKind::Notes || ePresObjKind == PresObjKind::Text))
+ pOutliner->SetStyleSheet(0, pSheet);
+
+ mxTextObj->SetEmptyPresObj(true);
+}
+
+bool FuText::RequestHelp(const HelpEvent& rHEvt)
+{
+ bool bReturn = false;
+
+ OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
+
+ if ((Help::IsBalloonHelpEnabled() || Help::IsQuickHelpEnabled()) &&
+ mxTextObj.is() && pOLV && pOLV->GetFieldUnderMousePointer())
+ {
+ OUString aHelpText;
+ const SvxFieldItem* pFieldItem = pOLV->GetFieldUnderMousePointer();
+ const SvxFieldData* pField = pFieldItem->GetField();
+
+ if (auto pURLField = dynamic_cast< const SvxURLField *>( pField ))
+ {
+ // URL-Field
+ aHelpText = INetURLObject::decode( pURLField->GetURL(), INetURLObject::DecodeMechanism::WithCharset );
+ }
+ if (!aHelpText.isEmpty())
+ {
+ ::tools::Rectangle aLogicPix = mpWindow->LogicToPixel(mxTextObj->GetLogicRect());
+ ::tools::Rectangle aScreenRect(mpWindow->OutputToScreenPixel(aLogicPix.TopLeft()),
+ mpWindow->OutputToScreenPixel(aLogicPix.BottomRight()));
+
+ if (Help::IsBalloonHelpEnabled())
+ {
+ Help::ShowBalloon( static_cast<vcl::Window*>(mpWindow), rHEvt.GetMousePosPixel(), aScreenRect, aHelpText);
+ bReturn = true;
+ }
+ else if (Help::IsQuickHelpEnabled())
+ {
+ Help::ShowQuickHelp( static_cast<vcl::Window*>(mpWindow), aScreenRect, aHelpText);
+ bReturn = true;
+ }
+ }
+ }
+
+ if (!bReturn)
+ {
+ bReturn = FuConstruct::RequestHelp(rHEvt);
+ }
+
+ return bReturn;
+}
+
+void FuText::ReceiveRequest(SfxRequest& rReq)
+{
+ nSlotId = rReq.GetSlot();
+
+ // then we call the base class (besides others, nSlotId is NOT set there)
+ FuPoor::ReceiveRequest(rReq);
+
+ if (!(nSlotId == SID_TEXTEDIT || mpViewShell->GetFrameView()->IsQuickEdit() || SID_ATTR_CHAR == nSlotId))
+ return;
+
+ MouseEvent aMEvt(mpWindow->GetPointerPosPixel());
+
+ mxTextObj.reset(nullptr);
+
+ if (nSlotId == SID_TEXTEDIT)
+ {
+ // are we currently editing?
+ mxTextObj.reset( mpView->GetTextEditObject() );
+
+ if (!mxTextObj.is())
+ {
+ // Try to select an object
+ SdrPageView* pPV = mpView->GetSdrPageView();
+ SdrViewEvent aVEvt;
+ mpView->PickAnything(aMEvt, SdrMouseEventKind::BUTTONDOWN, aVEvt);
+ mpView->MarkObj(aVEvt.mpRootObj, pPV);
+
+ if (auto pSdrTextObj = dynamic_cast<SdrTextObj*>(aVEvt.mpObj))
+ {
+ mxTextObj.reset( pSdrTextObj );
+ }
+ }
+ }
+ else if (mpView->AreObjectsMarked())
+ {
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+
+ if( auto pTextObj = dynamic_cast<SdrTextObj *>( pObj ))
+ {
+ mxTextObj.reset( pTextObj );
+ }
+ }
+ }
+
+ bool bQuickDrag = true;
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ if (pArgs
+
+ // test for type before using
+ && SID_TEXTEDIT == nSlotId
+ && SfxItemState::SET == pArgs->GetItemState(SID_TEXTEDIT)
+
+ && static_cast<const SfxUInt16Item&>( pArgs->Get(SID_TEXTEDIT)).GetValue() == 2)
+ {
+ // selection with double click -> do not allow QuickDrag
+ bQuickDrag = false;
+ }
+
+ SetInEditMode(aMEvt, bQuickDrag);
+}
+
+void FuText::DoubleClick(const MouseEvent& )
+{
+ // Nothing to do
+}
+
+/** Removed the insertion of default text and putting a new text
+ object directly into edit mode.
+*/
+SdrObjectUniquePtr FuText::CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle)
+{
+ SdrObjectUniquePtr pObj( SdrObjFactory::MakeNewObject(
+ mpView->getSdrModelFromSdrView(),
+ mpView->GetCurrentObjInventor(),
+ mpView->GetCurrentObjIdentifier(),
+ nullptr) );
+
+ if(pObj)
+ {
+ if( auto pText = dynamic_cast< SdrTextObj *>( pObj.get() ) )
+ {
+ pText->SetLogicRect(rRectangle);
+
+ bool bVertical = (SID_ATTR_CHAR_VERTICAL == nID || SID_TEXT_FITTOSIZE_VERTICAL == nID);
+ pText->SetVerticalWriting(bVertical);
+
+ ImpSetAttributesForNewTextObject(pText);
+
+ if (nSlotId == SID_TEXT_FITTOSIZE)
+ {
+ ImpSetAttributesFitToSize(pText);
+ }
+ else if ( nSlotId == SID_TEXT_FITTOSIZE_VERTICAL )
+ {
+ ImpSetAttributesFitToSizeVertical(pText);
+ }
+ else
+ {
+ ImpSetAttributesFitCommon(pText);
+ }
+
+ // Put text object into edit mode.
+ SdrPageView* pPV = mpView->GetSdrPageView();
+ mpView->SdrBeginTextEdit(pText, pPV);
+ }
+ else
+ {
+ OSL_FAIL("Object is NO text object");
+ }
+ }
+
+ return pObj;
+}
+
+/** is called when the current function should be aborted. <p>
+ This is used when a function gets a KEY_ESCAPE but can also
+ be called directly.
+
+ @returns true if an active function was aborted
+*/
+bool FuText::cancel()
+{
+ if ( mpView->IsTextEdit() )
+ {
+ if(mpView->SdrEndTextEdit() == SdrEndTextEditKind::Deleted)
+ mxTextObj.reset(nullptr);
+
+ mpView->SetCurrentObj(SdrObjKind::Text);
+ mpView->SetEditMode(SdrViewEditMode::Edit);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+void FuText::ChangeFontSize( bool bGrow, OutlinerView* pOLV, const FontList* pFontList, ::sd::View* pView )
+{
+ if( !pFontList || !pView )
+ return;
+
+ if( pOLV )
+ {
+ pOLV->GetEditView().ChangeFontSize( bGrow, pFontList );
+ }
+ else
+ {
+
+ pView->BegUndo(SdResId(bGrow ? STR_GROW_FONT_SIZE : STR_SHRINK_FONT_SIZE));
+ const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
+ for( size_t nMark = 0; nMark < rMarkList.GetMarkCount(); ++nMark )
+ {
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( rMarkList.GetMark(nMark)->GetMarkedSdrObj() );
+ if( pTextObj )
+ {
+ rtl::Reference<sdr::SelectionController> xSelectionController(pView->getSelectionController());
+ if (xSelectionController.is() && xSelectionController->ChangeFontSize(bGrow, pFontList))
+ {
+ continue;
+ }
+ for( sal_Int32 nText = 0; nText < pTextObj->getTextCount(); nText++ )
+ {
+ pTextObj->setActiveText( nText );
+
+ // Put text object into edit mode.
+ SdrPageView* pPV = pView->GetSdrPageView();
+ pView->SdrBeginTextEdit(pTextObj, pPV);
+
+ pOLV = pView->GetTextEditOutlinerView();
+ if( pOLV )
+ {
+ EditEngine* pEditEngine = pOLV->GetEditView().GetEditEngine();
+ if( pEditEngine )
+ {
+ ESelection aSel;
+ aSel.nEndPara = pEditEngine->GetParagraphCount()-1;
+ aSel.nEndPos = pEditEngine->GetTextLen(aSel.nEndPara);
+ pOLV->SetSelection(aSel);
+ }
+
+ ChangeFontSize( bGrow, pOLV, pFontList, pView );
+ }
+
+ pView->SdrEndTextEdit();
+ }
+
+ SfxItemSet aShapeSet( pTextObj->GetMergedItemSet() );
+ if( EditView::ChangeFontSize( bGrow, aShapeSet, pFontList ) )
+ {
+ pTextObj->SetObjectItemNoBroadcast( aShapeSet.Get( EE_CHAR_FONTHEIGHT ) );
+ pTextObj->SetObjectItemNoBroadcast( aShapeSet.Get( EE_CHAR_FONTHEIGHT_CJK ) );
+ pTextObj->SetObjectItemNoBroadcast( aShapeSet.Get( EE_CHAR_FONTHEIGHT_CTL ) );
+ }
+ }
+ }
+ pView->EndUndo();
+ }
+}
+
+void FuText::InvalidateBindings()
+{
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate(SidArray);
+}
+
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/futhes.cxx b/sd/source/ui/func/futhes.cxx
new file mode 100644
index 000000000..78d2ae693
--- /dev/null
+++ b/sd/source/ui/func/futhes.cxx
@@ -0,0 +1,132 @@
+/* -*- 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 <futhes.hxx>
+
+#include <editeng/outliner.hxx>
+#include <sfx2/request.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdotext.hxx>
+#include <editeng/eeitem.hxx>
+#include <tools/debug.hxx>
+
+#include <svx/svxerr.hxx>
+#include <svx/dialmgr.hxx>
+#include <editeng/unolingu.hxx>
+#include <vcl/weld.hxx>
+#include <drawdoc.hxx>
+#include <View.hxx>
+#include <Outliner.hxx>
+#include <DrawViewShell.hxx>
+#include <OutlineViewShell.hxx>
+#include <Window.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::linguistic2;
+
+class SfxRequest;
+
+namespace sd {
+
+
+FuThesaurus::FuThesaurus( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView,
+ SdDrawDocument* pDoc, SfxRequest& rReq )
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuThesaurus::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuThesaurus( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuThesaurus::DoExecute(SfxRequest& rReq)
+{
+ SfxErrorContext aContext(ERRCTX_SVX_LINGU_THESAURUS, OUString(),
+ mpWindow->GetFrameWeld(), RID_SVXERRCTX, SvxResLocale());
+
+ if (dynamic_cast< DrawViewShell *>( mpViewShell ))
+ {
+ SdrTextObj* pTextObj = nullptr;
+
+ if ( mpView->AreObjectsMarked() )
+ {
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if ( rMarkList.GetMarkCount() == 1 )
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+
+ pTextObj = dynamic_cast<SdrTextObj *>( pObj );
+ }
+ }
+
+ ::Outliner* pOutliner = mpView->GetTextEditOutliner();
+ const OutlinerView* pOutlView = mpView->GetTextEditOutlinerView();
+
+ if ( pTextObj && pOutliner && pOutlView )
+ {
+ if ( !pOutliner->GetSpeller().is() )
+ {
+ Reference< XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() );
+ if ( xSpellChecker.is() )
+ pOutliner->SetSpeller( xSpellChecker );
+
+ Reference< XHyphenator > xHyphenator( LinguMgr::GetHyphenator() );
+ if( xHyphenator.is() )
+ pOutliner->SetHyphenator( xHyphenator );
+
+ pOutliner->SetDefaultLanguage( mpDoc->GetLanguage( EE_CHAR_LANGUAGE ) );
+ }
+
+ EESpellState eState = const_cast<OutlinerView*>(pOutlView)->StartThesaurus(rReq.GetFrameWeld());
+ DBG_ASSERT(eState != EESpellState::NoSpeller, "No SpellChecker");
+ }
+ }
+ else if (dynamic_cast< OutlineViewShell *>( mpViewShell ))
+ {
+ Outliner* pOutliner = mpDoc->GetOutliner();
+ OutlinerView* pOutlView = pOutliner->GetView(0);
+
+ if ( !pOutliner->GetSpeller().is() )
+ {
+ Reference< XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() );
+ if ( xSpellChecker.is() )
+ pOutliner->SetSpeller( xSpellChecker );
+
+ Reference< XHyphenator > xHyphenator( LinguMgr::GetHyphenator() );
+ if( xHyphenator.is() )
+ pOutliner->SetHyphenator( xHyphenator );
+
+ pOutliner->SetDefaultLanguage( mpDoc->GetLanguage( EE_CHAR_LANGUAGE ) );
+ }
+
+ EESpellState eState = pOutlView->StartThesaurus(rReq.GetFrameWeld());
+ DBG_ASSERT(eState != EESpellState::NoSpeller, "No SpellChecker");
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/futransf.cxx b/sd/source/ui/func/futransf.cxx
new file mode 100644
index 000000000..8c565a3b8
--- /dev/null
+++ b/sd/source/ui/func/futransf.cxx
@@ -0,0 +1,132 @@
+/* -*- 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 <futransf.hxx>
+
+#include <svx/svxids.hrc>
+#include <sfx2/request.hxx>
+
+#include <strings.hrc>
+#include <ViewShell.hxx>
+#include <View.hxx>
+#include <sdresid.hxx>
+#include <drawdoc.hxx>
+#include <svx/svxdlg.hxx>
+#include <comphelper/lok.hxx>
+
+#include <memory>
+
+using namespace sd;
+
+FuTransform::FuTransform(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView,
+ SdDrawDocument* pDoc, SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuTransform::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuTransform( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+namespace {
+
+void setUndo(::sd::View* pView, const SfxItemSet* pArgs, bool addPageMargin)
+{
+ // Undo
+ OUString aString = pView->GetDescriptionOfMarkedObjects() +
+ " " + SdResId(STR_TRANSFORM);
+ pView->BegUndo(aString);
+ pView->SetGeoAttrToMarked(*pArgs, addPageMargin);
+ pView->SetAttributes(*pArgs);
+ pView->EndUndo();
+}
+
+}
+
+void FuTransform::DoExecute( SfxRequest& rReq )
+{
+ if (!mpView->AreObjectsMarked())
+ return;
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ if (pArgs)
+ {
+ // If this comes from LOK, that means the shape is moved by mouse
+ // only then pArgs is pre-set.
+ setUndo(mpView, pArgs, comphelper::LibreOfficeKit::isActive());
+ return;
+ }
+
+ // --------- itemset for size and position --------
+ SfxItemSet aSet( mpView->GetGeoAttrFromMarked() );
+ VclPtr<SfxAbstractTabDialog> pDlg;
+
+ bool bWelded = false;
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ if( rMarkList.GetMarkCount() == 1 &&
+ pObj->GetObjInventor() == SdrInventor::Default &&
+ pObj->GetObjIdentifier() == SdrObjKind::Caption )
+ {
+ // --------- itemset for caption --------
+ SfxItemSet aNewAttr( mpDoc->GetPool() );
+ mpView->GetAttributes( aNewAttr );
+
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ pDlg.reset(pFact->CreateCaptionDialog(mpViewShell->GetFrameWeld(), mpView));
+
+ const WhichRangesContainer& pRange = pDlg->GetInputRanges( *aNewAttr.GetPool() );
+ SfxItemSet aCombSet( *aNewAttr.GetPool(), pRange );
+ aCombSet.Put( aNewAttr );
+ aCombSet.Put( aSet );
+ pDlg->SetInputSet( &aCombSet );
+ }
+ else
+ {
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ pDlg.reset(pFact->CreateSvxTransformTabDialog(mpViewShell->GetFrameWeld(), &aSet, mpView));
+ bWelded = true;
+ }
+
+ assert(pDlg && "there must be a dialog at this point");
+
+ auto pRequest = std::make_shared<SfxRequest>(rReq);
+ rReq.Ignore(); // the 'old' request is not relevant any more
+
+ pDlg->StartExecuteAsync([bWelded, pDlg, pRequest, this](sal_Int32 nResult){
+ if (nResult == RET_OK)
+ {
+ pRequest->Done(*(pDlg->GetOutputItemSet()));
+ // Page margin is already calculated at this point.
+ setUndo(mpView, pRequest->GetArgs(), false);
+ }
+
+ // deferred until the dialog ends
+ mpViewShell->Invalidate(SID_RULER_OBJECT);
+ mpViewShell->Cancel();
+ if (bWelded)
+ pDlg->disposeOnce();
+ });
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/futxtatt.cxx b/sd/source/ui/func/futxtatt.cxx
new file mode 100644
index 000000000..56f8c2569
--- /dev/null
+++ b/sd/source/ui/func/futxtatt.cxx
@@ -0,0 +1,80 @@
+/* -*- 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 <futxtatt.hxx>
+#include <sfx2/request.hxx>
+
+#include <svx/svxdlg.hxx>
+#include <View.hxx>
+#include <drawdoc.hxx>
+
+namespace sd {
+
+
+FuTextAttrDlg::FuTextAttrDlg (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuTextAttrDlg::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuTextAttrDlg( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuTextAttrDlg::DoExecute( SfxRequest& rReq )
+{
+ SfxItemSet aNewAttr( mpDoc->GetPool() );
+ mpView->GetAttributes( aNewAttr );
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ if( !pArgs )
+ {
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ ScopedVclPtr<SfxAbstractTabDialog> pDlg(pFact->CreateTextTabDialog(rReq.GetFrameWeld(), &aNewAttr, mpView));
+
+ sal_uInt16 nResult = pDlg->Execute();
+
+ switch( nResult )
+ {
+ case RET_OK:
+ {
+ rReq.Done( *( pDlg->GetOutputItemSet() ) );
+
+ pArgs = rReq.GetArgs();
+ }
+ break;
+
+ default:
+ return; // Cancel
+ }
+ }
+ mpView->SetAttributes( *pArgs );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuvect.cxx b/sd/source/ui/func/fuvect.cxx
new file mode 100644
index 000000000..64840810c
--- /dev/null
+++ b/sd/source/ui/func/fuvect.cxx
@@ -0,0 +1,87 @@
+/* -*- 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 <fuvect.hxx>
+#include <svx/svdograf.hxx>
+
+#include <View.hxx>
+#include <Window.hxx>
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <sdabstdlg.hxx>
+
+namespace sd
+{
+
+
+FuVectorize::FuVectorize (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor (pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+rtl::Reference<FuPoor> FuVectorize::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuVectorize( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuVectorize::DoExecute( SfxRequest& )
+{
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if( rMarkList.GetMarkCount() != 1 )
+ return;
+
+ SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
+
+ auto pSdrGrafObj = dynamic_cast< const SdrGrafObj *>( pObj );
+ if( !pSdrGrafObj )
+ return;
+
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractSdVectorizeDlg> pDlg(
+ pFact->CreateSdVectorizeDlg(mpWindow ? mpWindow->GetFrameWeld() : nullptr,
+ pSdrGrafObj->GetGraphic().GetBitmapEx().GetBitmap(), mpDocSh ) );
+ if( pDlg->Execute() != RET_OK )
+ return;
+
+ const GDIMetaFile& rMtf = pDlg->GetGDIMetaFile();
+ SdrPageView* pPageView = mpView->GetSdrPageView();
+
+ if( pPageView && rMtf.GetActionSize() )
+ {
+ SdrGrafObj* pVectObj = static_cast<SdrGrafObj*>( pObj->CloneSdrObject(pObj->getSdrModelFromSdrObject()) );
+ OUString aStr = mpView->GetDescriptionOfMarkedObjects() +
+ " " + SdResId( STR_UNDO_VECTORIZE );
+ mpView->BegUndo( aStr );
+ pVectObj->SetGraphic( rMtf );
+ mpView->ReplaceObjectAtView( pObj, *pPageView, pVectObj );
+ mpView->EndUndo();
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/fuzoom.cxx b/sd/source/ui/func/fuzoom.cxx
new file mode 100644
index 000000000..871d594d3
--- /dev/null
+++ b/sd/source/ui/func/fuzoom.cxx
@@ -0,0 +1,219 @@
+/* -*- 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 <fuzoom.hxx>
+
+#include <svx/svxids.hrc>
+#include <sfx2/bindings.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <app.hrc>
+#include <svx/svdpagv.hxx>
+#include <vcl/ptrstyle.hxx>
+
+#include <ViewShell.hxx>
+#include <View.hxx>
+#include <Window.hxx>
+#include <zoomlist.hxx>
+
+namespace sd {
+
+const sal_uInt16 SidArrayZoom[] = {
+ SID_ATTR_ZOOM,
+ SID_ZOOM_OUT,
+ SID_ZOOM_IN,
+ 0 };
+
+
+FuZoom::FuZoom(
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq),
+ bVisible(false),
+ bStartDrag(false),
+ aPtr(PointerStyle::Arrow)
+{
+}
+
+FuZoom::~FuZoom()
+{
+ if (bVisible)
+ {
+ // Hide ZoomRect
+ mpViewShell->DrawMarkRect(aZoomRect);
+
+ bVisible = false;
+ bStartDrag = false;
+ }
+}
+
+rtl::Reference<FuPoor> FuZoom::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ rtl::Reference<FuPoor> xFunc( new FuZoom( pViewSh, pWin, pView, pDoc, rReq ) );
+ return xFunc;
+}
+
+bool FuZoom::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ // remember button state for creation of own MouseEvents
+ SetMouseButtonCode(rMEvt.GetButtons());
+
+ mpWindow->CaptureMouse();
+ bStartDrag = true;
+
+ aBeginPosPix = rMEvt.GetPosPixel();
+ aBeginPos = mpWindow->PixelToLogic(aBeginPosPix);
+ aZoomRect.SetSize( Size( 0, 0 ) );
+ aZoomRect.SetPos( aBeginPos );
+
+ return true;
+}
+
+bool FuZoom::MouseMove(const MouseEvent& rMEvt)
+{
+ if (rMEvt.IsShift())
+ mpWindow->SetPointer(PointerStyle::Hand);
+ else if (nSlotId != SID_ZOOM_PANNING)
+ mpWindow->SetPointer(PointerStyle::Magnify);
+
+ if (bStartDrag)
+ {
+ if (bVisible)
+ {
+ mpViewShell->DrawMarkRect(aZoomRect);
+ }
+
+ Point aPosPix = rMEvt.GetPosPixel();
+ ForceScroll(aPosPix);
+
+ aEndPos = mpWindow->PixelToLogic(aPosPix);
+ aBeginPos = mpWindow->PixelToLogic(aBeginPosPix);
+
+ if (nSlotId == SID_ZOOM_PANNING || (rMEvt.IsShift() && !bVisible) )
+ {
+ // Panning
+
+ Point aScroll = aBeginPos - aEndPos;
+
+ if (aScroll.X() != 0 || aScroll.Y() != 0)
+ {
+ Size aWorkSize = mpView->GetWorkArea().GetSize();
+ Size aPageSize = mpView->GetSdrPageView()->GetPage()->GetSize();
+ if (aWorkSize.Width() != 0 && aWorkSize.Height() != 0 &&
+ aPageSize.Width() != 0 && aPageSize.Height() != 0)
+ {
+ aScroll.setX( aScroll.X() / ( aWorkSize.Width() / aPageSize.Width()) );
+ aScroll.setY( aScroll.Y() / ( aWorkSize.Height() / aPageSize.Height()) );
+ mpViewShell->Scroll(aScroll.X(), aScroll.Y());
+ aBeginPosPix = aPosPix;
+ }
+ }
+ }
+ else
+ {
+ ::tools::Rectangle aRect(aBeginPos, aEndPos);
+ aZoomRect = aRect;
+ aZoomRect.Justify();
+ mpViewShell->DrawMarkRect(aZoomRect);
+ bVisible = true;
+ }
+ }
+
+ return bStartDrag;
+}
+
+bool FuZoom::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ // remember button state for creation of own MouseEvents
+ SetMouseButtonCode(rMEvt.GetButtons());
+
+ if (bVisible)
+ {
+ // Hide ZoomRect
+ mpViewShell->DrawMarkRect(aZoomRect);
+ bVisible = false;
+ }
+
+ Point aPosPix = rMEvt.GetPosPixel();
+
+ if(SID_ZOOM_PANNING != nSlotId && !rMEvt.IsShift())
+ {
+ // Zoom
+ Size aZoomSizePixel = mpWindow->LogicToPixel(aZoomRect).GetSize();
+ sal_uLong nTol = DRGPIX + DRGPIX;
+
+ if ( ( aZoomSizePixel.Width() < static_cast<::tools::Long>(nTol) && aZoomSizePixel.Height() < static_cast<::tools::Long>(nTol) ) || rMEvt.IsMod1() )
+ {
+ // click at place: double zoom factor
+ Point aPos = mpWindow->PixelToLogic(aPosPix);
+ Size aSize = mpWindow->PixelToLogic(mpWindow->GetOutputSizePixel());
+ if ( rMEvt.IsMod1() )
+ {
+ aSize.setWidth( aSize.Width() * 2 );
+ aSize.setHeight( aSize.Height() * 2 );
+ }
+ else
+ {
+ aSize.setWidth( aSize.Width() / 2 );
+ aSize.setHeight( aSize.Height() / 2 );
+ }
+ aPos.AdjustX( -(aSize.Width() / 2) );
+ aPos.AdjustY( -(aSize.Height() / 2) );
+ aZoomRect.SetPos(aPos);
+ aZoomRect.SetSize(aSize);
+ }
+
+ mpViewShell->SetZoomRect(aZoomRect);
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArrayZoom );
+ }
+
+ ::tools::Rectangle aVisAreaWin = mpWindow->PixelToLogic(::tools::Rectangle(Point(0,0),
+ mpWindow->GetOutputSizePixel()));
+ mpViewShell->GetZoomList()->InsertZoomRect(aVisAreaWin);
+
+ bStartDrag = false;
+ mpWindow->ReleaseMouse();
+
+ return true;
+}
+
+void FuZoom::Activate()
+{
+ aPtr = mpWindow->GetPointer();
+
+ if (nSlotId == SID_ZOOM_PANNING)
+ {
+ mpWindow->SetPointer(PointerStyle::Hand);
+ }
+ else
+ {
+ mpWindow->SetPointer(PointerStyle::Magnify);
+ }
+}
+
+void FuZoom::Deactivate()
+{
+ mpWindow->SetPointer( aPtr );
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SidArrayZoom );
+}
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/sdundogr.cxx b/sd/source/ui/func/sdundogr.cxx
new file mode 100644
index 000000000..a2e97386d
--- /dev/null
+++ b/sd/source/ui/func/sdundogr.cxx
@@ -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/.
+ *
+ * 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 <sdundogr.hxx>
+#include <tools/long.hxx>
+
+SdUndoGroup::~SdUndoGroup() = default;
+
+bool SdUndoGroup::Merge(SfxUndoAction* pNextAction)
+{
+ bool bRet = false;
+
+ if (auto pSdUndoAction = dynamic_cast<SdUndoAction*>(pNextAction))
+ {
+ SdUndoAction* pClone = pSdUndoAction->Clone();
+
+ if (pClone)
+ {
+ AddAction(pClone);
+ bRet = true;
+ }
+ }
+
+ return bRet;
+}
+
+/**
+ * Undo, reverse order of execution
+ */
+void SdUndoGroup::Undo()
+{
+ ::tools::Long nLast = aCtn.size();
+ for (::tools::Long nAction = nLast - 1; nAction >= 0; nAction--)
+ {
+ aCtn[nAction]->Undo();
+ }
+}
+
+void SdUndoGroup::Redo()
+{
+ size_t nLast = aCtn.size();
+ for (size_t nAction = 0; nAction < nLast; nAction++)
+ {
+ aCtn[nAction]->Redo();
+ }
+}
+
+void SdUndoGroup::AddAction(SdUndoAction* pAction) { aCtn.emplace_back(pAction); }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/smarttag.cxx b/sd/source/ui/func/smarttag.cxx
new file mode 100644
index 000000000..ff5382116
--- /dev/null
+++ b/sd/source/ui/func/smarttag.cxx
@@ -0,0 +1,333 @@
+/* -*- 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 <vcl/commandevent.hxx>
+
+#include <ViewShell.hxx>
+#include <smarttag.hxx>
+#include <Window.hxx>
+#include <View.hxx>
+
+namespace sd
+{
+
+SmartTag::SmartTag( ::sd::View& rView )
+: mrView( rView )
+, mbSelected( false )
+{
+ SmartTagReference xThis( this );
+ mrView.getSmartTags().add( xThis );
+}
+
+SmartTag::~SmartTag()
+{
+}
+
+bool SmartTag::MouseButtonDown( const MouseEvent&, SmartHdl& )
+{
+ return false;
+}
+
+/** returns true if the SmartTag consumes this event. */
+bool SmartTag::KeyInput( const KeyEvent& /*rKEvt*/ )
+{
+ return false;
+}
+
+/** returns true if the SmartTag consumes this event. */
+bool SmartTag::Command( const CommandEvent& /*rCEvt*/ )
+{
+ return false;
+}
+
+void SmartTag::addCustomHandles( SdrHdlList& /*rHandlerList*/ )
+{
+}
+
+void SmartTag::select()
+{
+ mbSelected = true;
+}
+
+void SmartTag::deselect()
+{
+ mbSelected = false;
+}
+
+void SmartTag::disposing()
+{
+ SmartTagReference xThis( this );
+ mrView.getSmartTags().remove( xThis );
+}
+
+bool SmartTag::getContext( SdrViewContext& /*rContext*/ )
+{
+ return false;
+}
+
+sal_Int32 SmartTag::GetMarkablePointCount() const
+{
+ return 0;
+}
+
+sal_Int32 SmartTag::GetMarkedPointCount() const
+{
+ return 0;
+}
+
+bool SmartTag::MarkPoint(SdrHdl& /*rHdl*/, bool /*bUnmark*/ )
+{
+ return false;
+}
+
+bool SmartTag::MarkPoints(const ::tools::Rectangle* /*pRect*/, bool /*bUnmark*/ )
+{
+ return false;
+}
+
+void SmartTag::CheckPossibilities()
+{
+}
+
+SmartTagSet::SmartTagSet( View& rView )
+: mrView( rView )
+{
+}
+
+SmartTagSet::~SmartTagSet()
+{
+}
+
+void SmartTagSet::add( const SmartTagReference& xTag )
+{
+ maSet.insert( xTag );
+ mrView.InvalidateAllWin();
+
+ if( xTag == mxMouseOverTag )
+ mxMouseOverTag.clear();
+
+ if( xTag == mxSelectedTag )
+ mxSelectedTag.clear();
+}
+
+void SmartTagSet::remove( const SmartTagReference& xTag )
+{
+ std::set< SmartTagReference >::iterator aIter( maSet.find( xTag ) );
+ if( aIter != maSet.end() )
+ maSet.erase( aIter );
+ mrView.InvalidateAllWin();
+
+ if( xTag == mxMouseOverTag )
+ mxMouseOverTag.clear();
+
+ if( xTag == mxSelectedTag )
+ mxSelectedTag.clear();
+}
+
+void SmartTagSet::Dispose()
+{
+ std::set< SmartTagReference > aSet;
+ aSet.swap( maSet );
+ for( auto& rxItem : aSet )
+ rxItem->Dispose();
+ mrView.InvalidateAllWin();
+ mxMouseOverTag.clear();
+ mxSelectedTag.clear();
+}
+
+void SmartTagSet::select( const SmartTagReference& xTag )
+{
+ if( mxSelectedTag == xTag )
+ return;
+
+ if( mxSelectedTag.is() )
+ mxSelectedTag->deselect();
+
+ mxSelectedTag = xTag;
+ mxSelectedTag->select();
+ mrView.SetPossibilitiesDirty();
+ if( mrView.GetMarkedObjectCount() > 0 )
+ mrView.UnmarkAllObj();
+ else
+ mrView.updateHandles();
+}
+
+void SmartTagSet::deselect()
+{
+ if( mxSelectedTag.is() )
+ {
+ mxSelectedTag->deselect();
+ mxSelectedTag.clear();
+ mrView.SetPossibilitiesDirty();
+ mrView.updateHandles();
+ }
+}
+
+bool SmartTagSet::MouseButtonDown( const MouseEvent& rMEvt )
+{
+ Point aMDPos( mrView.GetViewShell()->GetActiveWindow()->PixelToLogic( rMEvt.GetPosPixel() ) );
+ SdrHdl* pHdl = mrView.PickHandle(aMDPos);
+
+ // check if a smart tag is selected and no handle is hit
+ if( mxSelectedTag.is() && !pHdl )
+ {
+ // deselect smart tag
+ deselect();
+ return false;
+ }
+
+ // if a smart tag handle is hit, forward event to its smart tag
+ SmartHdl* pSmartHdl = dynamic_cast< SmartHdl* >( pHdl );
+ if(pSmartHdl && pSmartHdl->getTag().is() )
+ {
+ SmartTagReference xTag( pSmartHdl->getTag() );
+ return xTag->MouseButtonDown( rMEvt, *pSmartHdl );
+ }
+
+ return false;
+}
+
+bool SmartTagSet::KeyInput( const KeyEvent& rKEvt )
+{
+ if( mxSelectedTag.is() )
+ return mxSelectedTag->KeyInput( rKEvt );
+ else if( rKEvt.GetKeyCode().GetCode() == KEY_SPACE )
+ {
+ SmartHdl* pSmartHdl = dynamic_cast< SmartHdl* >( mrView.GetHdlList().GetFocusHdl() );
+ if( pSmartHdl )
+ {
+ const_cast< SdrHdlList& >( mrView.GetHdlList() ).ResetFocusHdl();
+ const SmartTagReference& xTag( pSmartHdl->getTag() );
+ select( xTag );
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/** returns true if the SmartTag consumes this event. */
+bool SmartTagSet::Command( const CommandEvent& rCEvt )
+{
+ if( rCEvt.IsMouseEvent() )
+ {
+ Point aMDPos( mrView.GetViewShell()->GetActiveWindow()->PixelToLogic( rCEvt.GetMousePosPixel() ) );
+ SdrHdl* pHdl = mrView.PickHandle(aMDPos);
+
+ if( pHdl )
+ {
+ // if a smart tag handle is hit, forward event to its smart tag
+ SmartHdl* pSmartHdl = dynamic_cast< SmartHdl* >( pHdl );
+ if(pSmartHdl && pSmartHdl->getTag().is() )
+ {
+ const SmartTagReference& xTag( pSmartHdl->getTag() );
+ return xTag->Command( rCEvt );
+ }
+ }
+ }
+ else
+ {
+ if( mxSelectedTag.is() )
+ return mxSelectedTag->Command( rCEvt );
+
+ }
+
+ return false;
+}
+
+void SmartTagSet::addCustomHandles( SdrHdlList& rHandlerList )
+{
+ for( auto& rxItem : maSet )
+ rxItem->addCustomHandles( rHandlerList );
+}
+
+/** returns true if the currently selected smart tag has
+ a special context, returned in rContext. */
+bool SmartTagSet::getContext( SdrViewContext& rContext ) const
+{
+ if( mxSelectedTag.is() )
+ return mxSelectedTag->getContext( rContext );
+ else
+ return false;
+}
+
+// support point editing
+
+bool SmartTagSet::HasMarkablePoints() const
+{
+ return GetMarkablePointCount() != 0;
+}
+
+sal_uLong SmartTagSet::GetMarkablePointCount() const
+{
+ if( mxSelectedTag.is() )
+ return mxSelectedTag->GetMarkablePointCount();
+ return 0;
+}
+
+bool SmartTagSet::HasMarkedPoints() const
+{
+ return GetMarkedPointCount() != 0;
+}
+
+sal_uLong SmartTagSet::GetMarkedPointCount() const
+{
+ if( mxSelectedTag.is() )
+ return mxSelectedTag->GetMarkedPointCount();
+ else
+ return 0;
+}
+
+bool SmartTagSet::MarkPoint(SdrHdl& rHdl, bool bUnmark )
+{
+ if( mxSelectedTag.is() )
+ return mxSelectedTag->MarkPoint( rHdl, bUnmark );
+
+ return false;
+}
+
+bool SmartTagSet::MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark)
+{
+ if( mxSelectedTag.is() )
+ return mxSelectedTag->MarkPoints( pRect, bUnmark );
+ return false;
+}
+
+void SmartTagSet::CheckPossibilities()
+{
+ if( mxSelectedTag.is() )
+ mxSelectedTag->CheckPossibilities();
+}
+
+SmartHdl::SmartHdl( const SmartTagReference& xTag, SdrObject* pObject, const Point& rPnt, SdrHdlKind eNewKind /*=SdrHdlKind::Move*/ )
+: SdrHdl( rPnt, eNewKind )
+, mxSmartTag( xTag )
+{
+ SetObj( pObject );
+}
+
+SmartHdl::SmartHdl( const SmartTagReference& xTag, const Point& rPnt, SdrHdlKind eNewKind /*=SdrHdlKind::Move*/ )
+: SdrHdl( rPnt, eNewKind )
+, mxSmartTag( xTag )
+{
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/undoback.cxx b/sd/source/ui/func/undoback.cxx
new file mode 100644
index 000000000..768ca2ec2
--- /dev/null
+++ b/sd/source/ui/func/undoback.cxx
@@ -0,0 +1,105 @@
+/* -*- 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 <memory>
+#include <undoback.hxx>
+
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <strings.hrc>
+
+#include <com/sun/star/drawing/FillStyle.hpp>
+
+#include <svl/itemset.hxx>
+
+#include <svx/xdef.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xbtmpit.hxx>
+
+SdBackgroundObjUndoAction::SdBackgroundObjUndoAction(
+ SdDrawDocument& rDoc,
+ SdPage& rPage,
+ const SfxItemSet& rItemSet)
+: SdUndoAction(&rDoc),
+ mrPage(rPage),
+ mpItemSet(std::make_unique<SfxItemSet>(rItemSet)),
+ mbHasFillBitmap(false)
+{
+ OUString aString( SdResId( STR_UNDO_CHANGE_PAGEFORMAT ) );
+ SetComment( aString );
+ saveFillBitmap(*mpItemSet);
+}
+
+void SdBackgroundObjUndoAction::ImplRestoreBackgroundObj()
+{
+ std::unique_ptr<SfxItemSet> pNew = std::make_unique<SfxItemSet>(mrPage.getSdrPageProperties().GetItemSet());
+ mrPage.getSdrPageProperties().ClearItem();
+ if (bool(mpFillBitmapItem))
+ restoreFillBitmap(*mpItemSet);
+ mpFillBitmapItem.reset();
+ mbHasFillBitmap = false;
+ mrPage.getSdrPageProperties().PutItemSet(*mpItemSet);
+ mpItemSet = std::move(pNew);
+ saveFillBitmap(*mpItemSet);
+
+ // tell the page that it's visualization has changed
+ mrPage.ActionChanged();
+}
+
+void SdBackgroundObjUndoAction::Undo()
+{
+ ImplRestoreBackgroundObj();
+}
+
+void SdBackgroundObjUndoAction::Redo()
+{
+ ImplRestoreBackgroundObj();
+}
+
+SdUndoAction* SdBackgroundObjUndoAction::Clone() const
+{
+ std::unique_ptr<SdBackgroundObjUndoAction> pCopy = std::make_unique<SdBackgroundObjUndoAction>(*mpDoc, mrPage, *mpItemSet);
+ if (mpFillBitmapItem)
+ pCopy->mpFillBitmapItem.reset(mpFillBitmapItem->Clone());
+ pCopy->mbHasFillBitmap = mbHasFillBitmap;
+ return pCopy.release();
+}
+
+void SdBackgroundObjUndoAction::saveFillBitmap(SfxItemSet &rItemSet)
+{
+ if (const XFillBitmapItem *pItem = rItemSet.GetItemIfSet(XATTR_FILLBITMAP, false))
+ mpFillBitmapItem.reset(pItem->Clone());
+ if (bool(mpFillBitmapItem))
+ {
+ if (const XFillStyleItem* pItem = rItemSet.GetItemIfSet(XATTR_FILLSTYLE, false))
+ mbHasFillBitmap = pItem->GetValue() == css::drawing::FillStyle_BITMAP;
+ rItemSet.ClearItem(XATTR_FILLBITMAP);
+ if (mbHasFillBitmap)
+ rItemSet.ClearItem(XATTR_FILLSTYLE);
+ }
+}
+
+void SdBackgroundObjUndoAction::restoreFillBitmap(SfxItemSet &rItemSet)
+{
+ rItemSet.Put(*mpFillBitmapItem);
+ if (mbHasFillBitmap)
+ rItemSet.Put(XFillStyleItem(css::drawing::FillStyle_BITMAP));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/undoheaderfooter.cxx b/sd/source/ui/func/undoheaderfooter.cxx
new file mode 100644
index 000000000..e0183dac3
--- /dev/null
+++ b/sd/source/ui/func/undoheaderfooter.cxx
@@ -0,0 +1,53 @@
+/* -*- 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 <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+
+#include <app.hrc>
+#include <undoheaderfooter.hxx>
+
+
+SdHeaderFooterUndoAction::SdHeaderFooterUndoAction( SdDrawDocument* pDoc, SdPage* pPage, const sd::HeaderFooterSettings& rNewSettings )
+: SdUndoAction(pDoc),
+ mpPage(pPage),
+ maOldSettings(pPage->getHeaderFooterSettings()),
+ maNewSettings(rNewSettings)
+{
+}
+
+SdHeaderFooterUndoAction::~SdHeaderFooterUndoAction()
+{
+}
+
+void SdHeaderFooterUndoAction::Undo()
+{
+ mpPage->setHeaderFooterSettings( maOldSettings );
+ if (SfxViewFrame* pViewFrm = SfxViewFrame::Current())
+ pViewFrm->GetDispatcher()->Execute( SID_SWITCHPAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+}
+
+void SdHeaderFooterUndoAction::Redo()
+{
+ mpPage->setHeaderFooterSettings( maNewSettings );
+ if (SfxViewFrame* pViewFrm = SfxViewFrame::Current())
+ pViewFrm->GetDispatcher()->Execute( SID_SWITCHPAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/undolayer.cxx b/sd/source/ui/func/undolayer.cxx
new file mode 100644
index 000000000..b29142ee8
--- /dev/null
+++ b/sd/source/ui/func/undolayer.cxx
@@ -0,0 +1,78 @@
+/* -*- 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 <undolayer.hxx>
+
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <DrawViewShell.hxx>
+#include <strings.hrc>
+#include <sdresid.hxx>
+
+
+SdLayerModifyUndoAction::SdLayerModifyUndoAction(
+ SdDrawDocument* _pDoc, SdrLayer* pLayer,
+ const OUString& rOldLayerName, const OUString& rOldLayerTitle, const OUString& rOldLayerDesc, bool bOldIsVisible, bool bOldIsLocked, bool bOldIsPrintable,
+ const OUString& rNewLayerName, const OUString& rNewLayerTitle, const OUString& rNewLayerDesc, bool bNewIsVisible, bool bNewIsLocked, bool bNewIsPrintable )
+: SdUndoAction( _pDoc ),
+ mpLayer( pLayer ),
+ maOldLayerName( rOldLayerName ),
+ maOldLayerTitle( rOldLayerTitle ),
+ maOldLayerDesc( rOldLayerDesc ),
+ mbOldIsVisible( bOldIsVisible ),
+ mbOldIsLocked( bOldIsLocked ),
+ mbOldIsPrintable( bOldIsPrintable ),
+ maNewLayerName( rNewLayerName ),
+ maNewLayerTitle( rNewLayerTitle ),
+ maNewLayerDesc( rNewLayerDesc ),
+ mbNewIsVisible( bNewIsVisible ),
+ mbNewIsLocked( bNewIsLocked ),
+ mbNewIsPrintable( bNewIsPrintable )
+{
+ OUString aString(SdResId(STR_MODIFYLAYER));
+ SetComment(aString);
+}
+
+void SdLayerModifyUndoAction::Undo()
+{
+ ::sd::DrawDocShell* pDocSh = mpDoc->GetDocSh();
+ if( pDocSh )
+ {
+ ::sd::DrawViewShell* pDrViewSh = dynamic_cast< ::sd::DrawViewShell*> ( pDocSh->GetViewShell() );
+ if( pDrViewSh )
+ {
+ pDrViewSh->ModifyLayer( mpLayer, maOldLayerName, maOldLayerTitle, maOldLayerDesc, mbOldIsVisible, mbOldIsLocked, mbOldIsPrintable );
+ }
+ }
+}
+
+void SdLayerModifyUndoAction::Redo()
+{
+ ::sd::DrawDocShell* pDocSh = mpDoc->GetDocSh();
+ if( pDocSh )
+ {
+ ::sd::DrawViewShell* pDrViewSh = dynamic_cast< ::sd::DrawViewShell* >( pDocSh->GetViewShell() );
+ if( pDrViewSh )
+ {
+ pDrViewSh->ModifyLayer( mpLayer, maNewLayerName, maNewLayerTitle, maNewLayerDesc, mbNewIsVisible, mbNewIsLocked, mbNewIsPrintable );
+ }
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/undopage.cxx b/sd/source/ui/func/undopage.cxx
new file mode 100644
index 000000000..174747bf6
--- /dev/null
+++ b/sd/source/ui/func/undopage.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/.
+ *
+ * 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 <undopage.hxx>
+#include <sdpage.hxx>
+
+
+SdPageFormatUndoAction::~SdPageFormatUndoAction()
+{
+}
+
+void SdPageFormatUndoAction::Undo()
+{
+ ::tools::Rectangle aOldBorderRect(mnOldLeft, mnOldUpper, mnOldRight, mnOldLower);
+ mpPage->ScaleObjects(maOldSize, aOldBorderRect, mbNewScale);
+ mpPage->SetSize(maOldSize);
+ mpPage->SetLeftBorder(mnOldLeft);
+ mpPage->SetRightBorder(mnOldRight);
+ mpPage->SetUpperBorder(mnOldUpper);
+ mpPage->SetLowerBorder(mnOldLower);
+ mpPage->SetOrientation(meOldOrientation);
+ mpPage->SetPaperBin( mnOldPaperBin );
+
+ mpPage->SetBackgroundFullSize( mbOldFullSize );
+ if( !mpPage->IsMasterPage() )
+ static_cast<SdPage&>( mpPage->TRG_GetMasterPage() ).SetBackgroundFullSize( mbOldFullSize );
+
+}
+
+void SdPageFormatUndoAction::Redo()
+{
+ ::tools::Rectangle aNewBorderRect(mnNewLeft, mnNewUpper, mnNewRight, mnNewLower);
+ mpPage->ScaleObjects(maNewSize, aNewBorderRect, mbNewScale);
+ mpPage->SetSize(maNewSize);
+ mpPage->SetLeftBorder(mnNewLeft);
+ mpPage->SetRightBorder(mnNewRight);
+ mpPage->SetUpperBorder(mnNewUpper);
+ mpPage->SetLowerBorder(mnNewLower);
+ mpPage->SetOrientation(meNewOrientation);
+ mpPage->SetPaperBin( mnNewPaperBin );
+
+ mpPage->SetBackgroundFullSize( mbNewFullSize );
+ if( !mpPage->IsMasterPage() )
+ static_cast<SdPage&>( mpPage->TRG_GetMasterPage() ).SetBackgroundFullSize( mbNewFullSize );
+
+}
+
+SdPageLRUndoAction::~SdPageLRUndoAction()
+{
+}
+
+void SdPageLRUndoAction::Undo()
+{
+ mpPage->SetLeftBorder(mnOldLeft);
+ mpPage->SetRightBorder(mnOldRight);
+}
+
+void SdPageLRUndoAction::Redo()
+{
+ mpPage->SetLeftBorder(mnNewLeft);
+ mpPage->SetRightBorder(mnNewRight);
+}
+
+SdPageULUndoAction::~SdPageULUndoAction()
+{
+}
+
+void SdPageULUndoAction::Undo()
+{
+ mpPage->SetUpperBorder(mnOldUpper);
+ mpPage->SetLowerBorder(mnOldLower);
+}
+
+/**
+ * UL-Redo()
+ */
+void SdPageULUndoAction::Redo()
+{
+ mpPage->SetUpperBorder(mnNewUpper);
+ mpPage->SetLowerBorder(mnNewLower);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/unmovss.cxx b/sd/source/ui/func/unmovss.cxx
new file mode 100644
index 000000000..d21f83b39
--- /dev/null
+++ b/sd/source/ui/func/unmovss.cxx
@@ -0,0 +1,95 @@
+/* -*- 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 <unmovss.hxx>
+#include <drawdoc.hxx>
+#include <stlsheet.hxx>
+#include <stlpool.hxx>
+
+SdMoveStyleSheetsUndoAction::SdMoveStyleSheetsUndoAction( SdDrawDocument* pTheDoc, StyleSheetCopyResultVector& rTheStyles, bool bInserted)
+: SdUndoAction(pTheDoc)
+, mbMySheets( !bInserted )
+{
+ maStyles.swap( rTheStyles );
+
+ maListOfChildLists.resize( maStyles.size() );
+ // create list with lists of style sheet children
+ std::size_t i = 0;
+ for (const auto& a : maStyles)
+ {
+ maListOfChildLists[i++] = SdStyleSheetPool::CreateChildList(a.m_xStyleSheet.get());
+ }
+}
+
+void SdMoveStyleSheetsUndoAction::Undo()
+{
+ SfxStyleSheetBasePool* pPool = mpDoc->GetStyleSheetPool();
+
+ if (mbMySheets)
+ {
+ // the styles have to be inserted in the pool
+
+ // first insert all styles to the pool
+ for (auto& a : maStyles)
+ {
+ if (!a.m_bCreatedByCopy) // tdf#119259, existed before this action, so leave it alone
+ continue;
+ pPool->Insert(a.m_xStyleSheet.get());
+ }
+
+ // now assign the children again
+ std::vector< SdStyleSheetVector >::iterator childlistiter( maListOfChildLists.begin() );
+ for (const auto& a : maStyles)
+ {
+ OUString aParent(a.m_xStyleSheet->GetName());
+ for( auto& rxChild : *childlistiter )
+ {
+ rxChild->SetParent(aParent);
+ }
+ ++childlistiter;
+ }
+ }
+ else
+ {
+ // remove the styles again from the pool
+ for (auto& a : maStyles)
+ {
+ if (!a.m_bCreatedByCopy) // tdf#119259, existed before this action, so leave it alone
+ continue;
+ pPool->Remove(a.m_xStyleSheet.get());
+ }
+ }
+ mbMySheets = !mbMySheets;
+}
+
+void SdMoveStyleSheetsUndoAction::Redo()
+{
+ Undo();
+}
+
+SdMoveStyleSheetsUndoAction::~SdMoveStyleSheetsUndoAction()
+{
+}
+
+OUString SdMoveStyleSheetsUndoAction::GetComment() const
+{
+ return OUString();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/unoaprms.cxx b/sd/source/ui/func/unoaprms.cxx
new file mode 100644
index 000000000..3bf7d98a6
--- /dev/null
+++ b/sd/source/ui/func/unoaprms.cxx
@@ -0,0 +1,96 @@
+/* -*- 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 <drawdoc.hxx>
+#include <unoaprms.hxx>
+#include <anminfo.hxx>
+
+
+void SdAnimationPrmsUndoAction::Undo()
+{
+ // no new info created: restore data
+ if (!bInfoCreated)
+ {
+ SdDrawDocument* pDoc(dynamic_cast< SdDrawDocument* >(&pObject->getSdrModelFromSdrObject()));
+ SdAnimationInfo* pInfo = pDoc ? SdDrawDocument::GetAnimationInfo(pObject) : nullptr;
+ if (pInfo)
+ {
+ pInfo->mbActive = bOldActive;
+ pInfo->meEffect = eOldEffect;
+ pInfo->meTextEffect = eOldTextEffect;
+ pInfo->meSpeed = eOldSpeed;
+ pInfo->mbDimPrevious = bOldDimPrevious;
+ pInfo->maDimColor = aOldDimColor;
+ pInfo->mbDimHide = bOldDimHide;
+ pInfo->mbSoundOn = bOldSoundOn;
+ pInfo->maSoundFile = aOldSoundFile;
+ pInfo->mbPlayFull = bOldPlayFull;
+ pInfo->meClickAction = eOldClickAction;
+ pInfo->SetBookmark( aOldBookmark );
+ pInfo->mnVerb = nOldVerb;
+
+ pInfo->meSecondEffect = eOldSecondEffect;
+ pInfo->meSecondSpeed = eOldSecondSpeed;
+ pInfo->mbSecondSoundOn = bOldSecondSoundOn;
+ pInfo->mbSecondPlayFull = bOldSecondPlayFull;
+ }
+ }
+ // info was created by action: delete info
+ else
+ {
+ pObject->DeleteUserData(0);
+ }
+ // force ModelHasChanged() in order to update effect window (animation order)
+ pObject->SetChanged();
+ pObject->BroadcastObjectChange();
+}
+
+void SdAnimationPrmsUndoAction::Redo()
+{
+ SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pObject,true);
+
+ pInfo->mbActive = bNewActive;
+ pInfo->meEffect = eNewEffect;
+ pInfo->meTextEffect = eNewTextEffect;
+ pInfo->meSpeed = eNewSpeed;
+ pInfo->mbDimPrevious = bNewDimPrevious;
+ pInfo->maDimColor = aNewDimColor;
+ pInfo->mbDimHide = bNewDimHide;
+ pInfo->mbSoundOn = bNewSoundOn;
+ pInfo->maSoundFile = aNewSoundFile;
+ pInfo->mbPlayFull = bNewPlayFull;
+ pInfo->meClickAction = eNewClickAction;
+ pInfo->SetBookmark( aNewBookmark );
+ pInfo->mnVerb = nNewVerb;
+
+ pInfo->meSecondEffect = eNewSecondEffect;
+ pInfo->meSecondSpeed = eNewSecondSpeed;
+ pInfo->mbSecondSoundOn = bNewSecondSoundOn;
+ pInfo->mbSecondPlayFull = bNewSecondPlayFull;
+
+ // force ModelHasChanged() in order to update effect window (animation order)
+ pObject->SetChanged();
+ pObject->BroadcastObjectChange();
+}
+
+SdAnimationPrmsUndoAction::~SdAnimationPrmsUndoAction()
+{
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/func/unprlout.cxx b/sd/source/ui/func/unprlout.cxx
new file mode 100644
index 000000000..218883349
--- /dev/null
+++ b/sd/source/ui/func/unprlout.cxx
@@ -0,0 +1,73 @@
+/* -*- 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 <tools/debug.hxx>
+
+#include <unprlout.hxx>
+
+#include <strings.hrc>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+
+
+SdPresentationLayoutUndoAction::SdPresentationLayoutUndoAction(
+ SdDrawDocument* pTheDoc,
+ const OUString& aTheOldLayoutName,
+ const OUString& aTheNewLayoutName,
+ AutoLayout eTheOldAutoLayout,
+ AutoLayout eTheNewAutoLayout,
+ bool bSet,
+ SdPage* pThePage):
+ SdUndoAction(pTheDoc)
+{
+ aOldLayoutName = aTheOldLayoutName;
+ aNewLayoutName = aTheNewLayoutName;
+ eOldAutoLayout = eTheOldAutoLayout;
+ eNewAutoLayout = eTheNewAutoLayout;
+ bSetAutoLayout = bSet;
+
+ DBG_ASSERT(pThePage, "No Page set!");
+ pPage = pThePage;
+ aComment = SdResId(STR_UNDO_SET_PRESLAYOUT);
+}
+
+void SdPresentationLayoutUndoAction::Undo()
+{
+ pPage->SetPresentationLayout(aOldLayoutName, true, true, true);
+ if (bSetAutoLayout)
+ pPage->SetAutoLayout(eOldAutoLayout, true);
+}
+
+void SdPresentationLayoutUndoAction::Redo()
+{
+ pPage->SetPresentationLayout(aNewLayoutName);
+ if (bSetAutoLayout)
+ pPage->SetAutoLayout(eNewAutoLayout, true);
+}
+
+SdPresentationLayoutUndoAction::~SdPresentationLayoutUndoAction()
+{
+}
+
+OUString SdPresentationLayoutUndoAction::GetComment() const
+{
+ return aComment;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/AccessibleDocumentViewBase.hxx b/sd/source/ui/inc/AccessibleDocumentViewBase.hxx
new file mode 100644
index 000000000..0db25b689
--- /dev/null
+++ b/sd/source/ui/inc/AccessibleDocumentViewBase.hxx
@@ -0,0 +1,324 @@
+/* -*- 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_SD_SOURCE_UI_INC_ACCESSIBLEDOCUMENTVIEWBASE_HXX
+#define INCLUDED_SD_SOURCE_UI_INC_ACCESSIBLEDOCUMENTVIEWBASE_HXX
+
+#include <editeng/AccessibleContextBase.hxx>
+#include <editeng/AccessibleComponentBase.hxx>
+#include <editeng/AccessibleSelectionBase.hxx>
+#include "AccessibleViewForwarder.hxx"
+#include <svx/AccessibleShapeTreeInfo.hxx>
+#include <svx/IAccessibleViewForwarderListener.hxx>
+
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/awt/XFocusListener.hpp>
+#include <com/sun/star/beans/XPropertyChangeListener.hpp>
+#include <tools/link.hxx>
+
+#include <com/sun/star/accessibility/XAccessibleExtendedAttributes.hpp>
+
+#include "Window.hxx"
+
+namespace com::sun::star::accessibility { class XAccessible; }
+namespace com::sun::star::frame { class XModel; }
+namespace com::sun::star::awt { class XWindow; }
+
+class VclWindowEvent;
+
+namespace sd {
+class ViewShell;
+}
+
+namespace accessibility {
+
+/** Base class for the various document views of the Draw and
+ Impress applications.
+
+ <p>The different view modes of the Draw and Impress applications
+ are made accessible by derived classes. When the view mode is
+ changed then the object representing the document view is
+ disposed and replaced by a new instance of the then appropriate
+ derived class.</p>
+
+ <p>This base class also manages an optionally active accessible OLE
+ object. If you overwrite the <member>getAccessibleChildCount</member>
+ and <member>getAccessibleChild</member> methods then make sure to first
+ call the corresponding method of this class and adapt your child count
+ and indices accordingly. Only one active OLE object is allowed at a
+ time. This class does not listen for disposing calls at the moment
+ because it does not use the accessible OLE object directly and trusts on
+ getting informed through VCL window events.</p>
+
+ <p>This class implements three kinds of listeners:
+ <ol><li>The property change listener is not used directly but exists as
+ convenience for derived classes. May be moved to those classes
+ instead.</li>
+ <li>As window listener it waits for changes of the window geometry and
+ forwards those as view forwarder changes.</li>
+ <li>As focus listener it keeps track of the focus to give this class and
+ derived classes the opportunity to set and remove the focus to/from
+ shapes.</li>
+ </ol>
+ </p>
+*/
+class AccessibleDocumentViewBase
+ : public AccessibleContextBase,
+ public AccessibleComponentBase,
+ public AccessibleSelectionBase,
+ public IAccessibleViewForwarderListener,
+ public css::beans::XPropertyChangeListener,
+ public css::awt::XWindowListener,
+ public css::awt::XFocusListener,
+ public css::accessibility::XAccessibleExtendedAttributes
+{
+public:
+ //===== internal ========================================================
+
+ /** Create a new object. Note that the caller has to call the
+ Init method directly after this constructor has finished.
+ @param pSdWindow
+ The window whose content is to be made accessible.
+ @param pViewShell
+ The view shell associated with the given window.
+ @param rxController
+ The controller from which to get the model.
+ @param rxParent
+ The accessible parent of the new object. Note that this parent does
+ not necessarily correspond with the parent of the given window.
+ */
+ AccessibleDocumentViewBase (
+ ::sd::Window* pSdWindow,
+ ::sd::ViewShell* pViewShell,
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const css::uno::Reference<css::accessibility::XAccessible>& rxParent);
+
+ virtual ~AccessibleDocumentViewBase() override;
+
+ /** Initialize a new object. Call this method directly after creating a
+ new object. It finished the initialization begun in the constructor
+ but which needs a fully created object.
+ */
+ virtual void Init();
+
+ /** Define callback for listening to window child events of VCL.
+ Listen for creation or destruction of OLE objects.
+ */
+ DECL_LINK( WindowChildEventListener, VclWindowEvent&, void );
+
+ //===== IAccessibleViewForwarderListener ================================
+
+ /** A view forwarder change is signalled for instance when any of the
+ window events is received. Thus, instead of overriding the four
+ windowResized... methods it will be sufficient in most cases just to
+ override this method.
+ */
+ virtual void ViewForwarderChanged() override;
+
+ //===== XAccessibleContext ==============================================
+
+ virtual css::uno::Reference<css::accessibility::XAccessible> SAL_CALL
+ getAccessibleParent() override;
+
+ /** This implementation returns either 1 or 0 depending on whether there
+ is an active accessible OLE object or not.
+ */
+ virtual sal_Int32 SAL_CALL
+ getAccessibleChildCount() override;
+
+ /** This implementation either returns the active accessible OLE object
+ if it exists and the given index is 0 or throws an exception.
+ */
+ virtual css::uno::Reference<css::accessibility::XAccessible> SAL_CALL
+ getAccessibleChild (sal_Int32 nIndex) override;
+
+ //===== XAccessibleComponent ============================================
+
+ virtual css::uno::Reference<css::accessibility::XAccessible > SAL_CALL
+ getAccessibleAtPoint (const css::awt::Point& aPoint) override;
+
+ virtual css::awt::Rectangle SAL_CALL getBounds() override;
+
+ virtual css::awt::Point SAL_CALL getLocation() override;
+
+ virtual css::awt::Point SAL_CALL getLocationOnScreen() override;
+
+ virtual css::awt::Size SAL_CALL getSize() override;
+
+ //===== XInterface ======================================================
+
+ virtual css::uno::Any SAL_CALL
+ queryInterface (const css::uno::Type & rType) override;
+
+ virtual void SAL_CALL
+ acquire()
+ noexcept override;
+
+ virtual void SAL_CALL
+ release()
+ noexcept override;
+
+ //===== XServiceInfo ====================================================
+
+ /** Returns an identifier for the implementation of this object.
+ */
+ virtual OUString SAL_CALL
+ getImplementationName() override;
+
+ virtual css::uno::Sequence< OUString> SAL_CALL
+ getSupportedServiceNames() override;
+
+ //===== XTypeProvider ===================================================
+
+ virtual css::uno::Sequence< css::uno::Type> SAL_CALL
+ getTypes() override;
+
+ //===== lang::XEventListener ============================================
+
+ virtual void SAL_CALL
+ disposing (const css::lang::EventObject& rEventObject) override;
+
+ //===== XPropertyChangeListener =========================================
+
+ virtual void SAL_CALL
+ propertyChange (const css::beans::PropertyChangeEvent& rEventObject) override;
+
+ //===== XWindowListener =================================================
+
+ virtual void SAL_CALL
+ windowResized (const css::awt::WindowEvent& e) override;
+
+ virtual void SAL_CALL
+ windowMoved (const css::awt::WindowEvent& e) override;
+
+ virtual void SAL_CALL
+ windowShown (const css::lang::EventObject& e) override;
+
+ virtual void SAL_CALL
+ windowHidden (const css::lang::EventObject& e) override;
+
+ //===== XFocusListener =================================================
+
+ virtual void SAL_CALL focusGained (const css::awt::FocusEvent& e) override;
+ virtual void SAL_CALL focusLost (const css::awt::FocusEvent& e) override;
+ //----------------------------xAttribute----------------------------
+ virtual css::uno::Any SAL_CALL getExtendedAttributes() override;
+ ::sd::ViewShell* mpViewShell;
+private:
+
+ // return the member maMutex;
+ virtual ::osl::Mutex&
+ implGetMutex() override;
+
+ // return ourself as context in default case
+ virtual css::uno::Reference< css::accessibility::XAccessibleContext >
+ implGetAccessibleContext() override;
+
+ // return sal_False in default case
+ virtual bool
+ implIsSelected( sal_Int32 nAccessibleChildIndex ) override;
+
+ // return nothing in default case
+ virtual void
+ implSelect( sal_Int32 nAccessibleChildIndex, bool bSelect ) override;
+
+protected:
+ /// The API window that is made accessible.
+ css::uno::Reference< css::awt::XWindow>
+ mxWindow;
+
+ /// The controller of the window in which this view is displayed.
+ css::uno::Reference< css::frame::XController>
+ mxController;
+
+ /// Model of the document.
+ css::uno::Reference < css::frame::XModel>
+ mxModel;
+
+ // Bundle of information that is passed down the shape tree.
+ AccessibleShapeTreeInfo maShapeTreeInfo;
+
+ /// The view forwarder passed to the children manager.
+ AccessibleViewForwarder maViewForwarder;
+
+ /** Accessible OLE object. Set or removed by the
+ <member>SetAccessibleOLEObject</member> method.
+ */
+ css::uno::Reference< css::accessibility::XAccessible>
+ mxAccessibleOLEObject;
+
+ Link<VclWindowEvent&,void> maWindowLink;
+
+ // This method is called from the component helper base class while
+ // disposing.
+ virtual void SAL_CALL disposing() override;
+
+ /** Create a name string. The current name is not modified and,
+ therefore, no events are sent. This method is usually called once
+ by the <member>getAccessibleName</member> method of the base class.
+ @return
+ A name string.
+ */
+ virtual OUString
+ CreateAccessibleName () override;
+
+ /** This method is called when (after) the frame containing this
+ document has been activated. Can be used to send FOCUSED state
+ changes for the currently selected element.
+
+ Note: Currently used as a substitute for FocusGained. Should be
+ renamed in the future.
+ */
+ virtual void Activated();
+
+ /** This method is called when (before or after?) the frame containing
+ this document has been deactivated. Can be used to send FOCUSED
+ state changes for the currently selected element.
+
+ Note: Currently used as a substitute for FocusLost. Should be
+ renamed in the future.
+ */
+ virtual void Deactivated();
+
+ /** Set or remove the currently active accessible OLE object.
+ @param xOLEObject
+ If this is a valid reference then a child event is send that
+ informs the listeners of a new child. If there has already been
+ an active accessible OLE object then this is removed first and
+ appropriate events are sent.
+
+ If this is an empty reference then the currently active
+ accessible OLE object (if there is one) is removed.
+ */
+ void SetAccessibleOLEObject (
+ const css::uno::Reference<css::accessibility::XAccessible>& xOLEObject);
+
+public:
+ void SwitchViewActivated() { Activated(); }
+ virtual sal_Int32 SAL_CALL getForeground( ) override;
+
+ virtual sal_Int32 SAL_CALL getBackground( ) override;
+ virtual void impl_dispose();
+};
+
+} // end of namespace accessibility
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/AccessibleDrawDocumentView.hxx b/sd/source/ui/inc/AccessibleDrawDocumentView.hxx
new file mode 100644
index 000000000..202edd0ea
--- /dev/null
+++ b/sd/source/ui/inc/AccessibleDrawDocumentView.hxx
@@ -0,0 +1,165 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "AccessibleDocumentViewBase.hxx"
+
+#include <com/sun/star/accessibility/XAccessibleGroupPosition.hpp>
+
+namespace accessibility { class AccessiblePageShape; }
+namespace accessibility { class ChildrenManager; }
+
+namespace accessibility {
+
+/** This class makes draw documents in the general view modes
+ accessible. It passes all shapes on the current draw page to a
+ children manager and additionally creates a new shape that
+ represents the actual draw page.
+
+ Please see the documentation of the base class for further
+ explanations of the individual methods.
+*/
+class AccessibleDrawDocumentView final :
+ public AccessibleDocumentViewBase
+ ,public css::accessibility::XAccessibleGroupPosition
+{
+public:
+ //===== internal ========================================================
+
+ AccessibleDrawDocumentView (::sd::Window* pSdWindow,
+ ::sd::ViewShell* pViewShell,
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const css::uno::Reference<css::accessibility::XAccessible>& rxParent);
+
+ virtual ~AccessibleDrawDocumentView() override;
+
+ /** Complete the initialization begun in the constructor.
+ */
+ virtual void Init() override;
+
+ //===== IAccessibleViewForwarderListener ================================
+
+ virtual void ViewForwarderChanged() override;
+
+ //===== XAccessibleContext ==============================================
+
+ virtual sal_Int32 SAL_CALL
+ getAccessibleChildCount() override;
+
+ virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL
+ getAccessibleChild (sal_Int32 nIndex) override;
+
+ virtual OUString SAL_CALL
+ getAccessibleName() override;
+
+ //===== lang::XEventListener ============================================
+
+ virtual void SAL_CALL
+ disposing (const css::lang::EventObject& rEventObject) override;
+
+ //===== XPropertyChangeListener =========================================
+
+ virtual void SAL_CALL
+ propertyChange (const css::beans::PropertyChangeEvent& rEventObject) override;
+ //===== XInterface ======================================================
+
+ virtual css::uno::Any SAL_CALL
+ queryInterface (const css::uno::Type & rType) override;
+
+ virtual void SAL_CALL
+ acquire()
+ noexcept override;
+
+ virtual void SAL_CALL
+ release()
+ noexcept override;
+
+ //===== XAccessibleGroupPosition =========================================
+ virtual css::uno::Sequence< sal_Int32 > SAL_CALL
+ getGroupPosition( const css::uno::Any& rAny ) override;
+ virtual OUString SAL_CALL getObjectLink( const css::uno::Any& accoject ) override;
+
+private:
+
+ //===== XServiceInfo ====================================================
+
+ virtual OUString SAL_CALL
+ getImplementationName() override;
+
+ virtual css::uno::Sequence< OUString> SAL_CALL
+ getSupportedServiceNames() override;
+
+ virtual bool
+ implIsSelected( sal_Int32 nAccessibleChildIndex ) override;
+
+ /** Select or deselect the specified child or all children if the given
+ index has the special value ACCESSIBLE_SELECTION_CHILD_ALL.
+ Selecting or deselecting a child sets or resets the
+ <const>SELECTED</const> state and selects or deselects the UNO shape
+ being made accessible by the child.
+ @param nAccessibleChildIndex
+ Index of the child to select or deselect. If the parameter has
+ the value ACCESSIBLE_SELECTION_CHILD_ALL then all children are
+ selected or deselected.
+ @param bSelect
+ Indicates whether to select or deselect the specified child
+ reps. children.
+ */
+ virtual void
+ implSelect( sal_Int32 nAccessibleChildIndex, bool bSelect ) override;
+
+ ::sd::ViewShell* mpSdViewSh;
+
+ /** This object manages the shapes of the represented draw page. It is
+ responsible to determine the visible shapes and create on demand the
+ accessible objects representing them.
+ */
+ std::unique_ptr<ChildrenManager> mpChildrenManager;
+
+ // This method is called from the component helper base class while
+ // disposing.
+ virtual void SAL_CALL disposing() override;
+
+ /** Create a shape the represents the page as seen on the screen.
+ */
+ rtl::Reference<AccessiblePageShape> CreateDrawPageShape();
+
+ /// Create an accessible name that contains the current view mode.
+ virtual OUString
+ CreateAccessibleName () override;
+
+ /** Make sure that the currently focused shape sends a FOCUSED state
+ change event indicating that it has (regained) the focus.
+ */
+ virtual void Activated() override;
+
+ /** Make sure that the currently focused shape sends a FOCUSED state
+ change event indicating that it has lost the focus.
+ */
+ virtual void Deactivated() override;
+
+ virtual void impl_dispose() override;
+
+ void UpdateAccessibleName();
+};
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/AccessibleOutlineEditSource.hxx b/sd/source/ui/inc/AccessibleOutlineEditSource.hxx
new file mode 100644
index 000000000..d13d27e97
--- /dev/null
+++ b/sd/source/ui/inc/AccessibleOutlineEditSource.hxx
@@ -0,0 +1,90 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svl/SfxBroadcaster.hxx>
+#include <svl/lstner.hxx>
+#include <tools/link.hxx>
+#include <editeng/unoedsrc.hxx>
+#include <editeng/unoforou.hxx>
+#include <editeng/unoviwou.hxx>
+
+class OutlinerView;
+class SdrOutliner;
+class SdrView;
+namespace vcl { class Window; }
+
+namespace accessibility
+{
+ /** Implementation of the SvxEditSource interface in the SdOutlineView
+
+ This class connects the SdOutlineView and its EditEngine
+ outliner with the AccessibleTextHelper, which provides all
+ necessary functionality to make the outliner text accessible
+
+ @see SvxEditSource
+ @see SvxViewForwarder
+ */
+ class AccessibleOutlineEditSource final : public SvxEditSource, public SvxViewForwarder, public SfxBroadcaster, public SfxListener
+ {
+ public:
+ /// Create an SvxEditSource interface for the given Outliner
+ AccessibleOutlineEditSource(
+ SdrOutliner& rOutliner,
+ SdrView& rView,
+ OutlinerView& rOutlView,
+ const vcl::Window& rViewWindow );
+ virtual ~AccessibleOutlineEditSource() override;
+
+ /// This method is disabled and always returns NULL
+ virtual std::unique_ptr<SvxEditSource> Clone() const override;
+ virtual SvxTextForwarder* GetTextForwarder() override;
+ virtual SvxViewForwarder* GetViewForwarder() override;
+ virtual SvxEditViewForwarder* GetEditViewForwarder( bool bCreate = false ) override;
+ virtual void UpdateData() override;
+ virtual SfxBroadcaster& GetBroadcaster() const override;
+
+ // the view forwarder
+ virtual bool IsValid() const override;
+ virtual Point LogicToPixel( const Point& rPoint, const MapMode& rMapMode ) const override;
+ virtual Point PixelToLogic( const Point& rPoint, const MapMode& rMapMode ) const override;
+
+ // SfxListener
+ virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
+
+ private:
+ AccessibleOutlineEditSource( const AccessibleOutlineEditSource& ) = delete;
+ AccessibleOutlineEditSource& operator=( const AccessibleOutlineEditSource& ) = delete;
+
+ DECL_LINK( NotifyHdl, EENotify&, void );
+
+ SdrView& mrView;
+ const vcl::Window& mrWindow;
+ SdrOutliner* mpOutliner;
+ OutlinerView* mpOutlinerView;
+
+ SvxOutlinerForwarder mTextForwarder;
+ SvxDrawOutlinerViewForwarder mViewForwarder;
+
+ };
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/AccessibleOutlineView.hxx b/sd/source/ui/inc/AccessibleOutlineView.hxx
new file mode 100644
index 000000000..5fa1df7c5
--- /dev/null
+++ b/sd/source/ui/inc/AccessibleOutlineView.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "AccessibleDocumentViewBase.hxx"
+#include <svx/AccessibleTextHelper.hxx>
+
+namespace sd { class OutlineViewShell; }
+
+namespace accessibility {
+
+/** This class makes the Impress outline view accessible.
+
+ Please see the documentation of the base class for further
+ explanations of the individual methods. This class is a mere
+ wrapper around the AccessibleTextHelper class; as basically the
+ Outline View is a big Outliner.
+*/
+class AccessibleOutlineView final
+ : public AccessibleDocumentViewBase
+{
+public:
+ AccessibleOutlineView (
+ ::sd::Window* pSdWindow,
+ ::sd::OutlineViewShell* pViewShell,
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const css::uno::Reference<css::accessibility::XAccessible>& rxParent);
+
+ virtual ~AccessibleOutlineView() override;
+
+ /** Complete the initialization begun in the constructor.
+ */
+ virtual void Init() override;
+
+ //===== IAccessibleViewForwarderListener ================================
+
+ virtual void ViewForwarderChanged() override;
+
+ //===== XAccessibleContext ==============================================
+
+ virtual sal_Int32 SAL_CALL
+ getAccessibleChildCount() override;
+
+ virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL
+ getAccessibleChild (sal_Int32 nIndex) override;
+ virtual OUString SAL_CALL
+ getAccessibleName() override;
+ //===== XAccessibleEventBroadcaster ========================================
+
+ virtual void SAL_CALL
+ addAccessibleEventListener (
+ const css::uno::Reference<css::accessibility::XAccessibleEventListener >& xListener) override;
+
+ virtual void SAL_CALL
+ removeAccessibleEventListener (
+ const css::uno::Reference<css::accessibility::XAccessibleEventListener >& xListener) override;
+
+ //===== XServiceInfo ====================================================
+
+ /** Returns an identifier for the implementation of this object.
+ */
+ virtual OUString SAL_CALL
+ getImplementationName() override;
+
+ //===== lang::XEventListener ============================================
+
+ using AccessibleDocumentViewBase::disposing;
+
+ //===== XPropertyChangeListener =========================================
+
+ virtual void SAL_CALL
+ propertyChange (const css::beans::PropertyChangeEvent& rEventObject) override;
+
+private:
+
+ // overridden to detect focus changes
+ virtual void Activated() override;
+
+ // overridden to detect focus changes
+ virtual void Deactivated() override;
+
+ // declared, but not defined
+ AccessibleOutlineView( const AccessibleOutlineView& );
+ AccessibleOutlineView& operator= ( const AccessibleOutlineView& );
+
+ // This method is called from the component helper base class while disposing.
+ virtual void SAL_CALL disposing() override;
+
+ /// Create an accessible name that contains the current view mode.
+ virtual OUString
+ CreateAccessibleName () override;
+
+ /// Invalidate text helper, updates visible children
+ void UpdateChildren();
+
+ AccessibleTextHelper maTextHelper;
+
+};
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/AccessiblePageShape.hxx b/sd/source/ui/inc/AccessiblePageShape.hxx
new file mode 100644
index 000000000..164fb96fe
--- /dev/null
+++ b/sd/source/ui/inc/AccessiblePageShape.hxx
@@ -0,0 +1,117 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svx/AccessibleShape.hxx>
+
+namespace com::sun::star::accessibility { class XAccessible; }
+namespace com::sun::star::drawing { class XDrawPage; }
+namespace accessibility { class AccessibleShapeTreeInfo; }
+
+namespace accessibility {
+
+/** A page shape represents the actual page as seen on the screen.
+*/
+class AccessiblePageShape
+ : public AccessibleShape
+{
+public:
+ //===== internal ========================================================
+
+ /** Create a new accessible object that makes the given shape accessible.
+ @param rxParent
+ The accessible parent object. It will be used, for example when
+ the <member>getIndexInParent</member> method is called.
+ @param rShapeTreeInfo
+ Bundle of information passed to this shape and all of its descendants.
+ @attention
+ Always call the <member>init</member> method after creating a
+ new accessible shape. This is one way to overcome the potential
+ problem of registering the new object with e.g. event
+ broadcasters. That would delete the new object if a broadcaster
+ would not keep a strong reference to the new object.
+ */
+ AccessiblePageShape (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxPage,
+ const css::uno::Reference<css::accessibility::XAccessible>& rxParent,
+ const AccessibleShapeTreeInfo& rShapeTreeInfo);
+
+ virtual ~AccessiblePageShape() override;
+
+ //===== XAccessibleContext ==============================================
+
+ /// Returns always 0 because there can be no children.
+ virtual sal_Int32 SAL_CALL
+ getAccessibleChildCount() override;
+
+ /** Return the specified child.
+ @param nIndex
+ Index of the requested child.
+ @return
+ Reference of the requested child which is the accessible object
+ of a visible shape.
+ @throws IndexOutOfBoundsException
+ Throws always an exception because there are no children.
+ */
+ virtual css::uno::Reference<css::accessibility::XAccessible> SAL_CALL
+ getAccessibleChild (sal_Int32 nIndex) override;
+
+ //===== XAccessibleComponent ============================================
+
+ virtual css::awt::Rectangle SAL_CALL getBounds() override;
+
+ virtual sal_Int32 SAL_CALL getForeground() override;
+
+ virtual sal_Int32 SAL_CALL getBackground() override;
+
+ //===== XComponent ======================================================
+
+ virtual void SAL_CALL
+ dispose() override;
+
+ //===== XServiceInfo ====================================================
+
+ virtual OUString SAL_CALL
+ getImplementationName() override;
+
+ virtual css::uno::Sequence< OUString> SAL_CALL
+ getSupportedServiceNames() override;
+
+ using AccessibleShape::disposing;
+
+protected:
+ /** Create a base name string that contains the accessible name.
+ */
+ virtual OUString
+ CreateAccessibleBaseName() override;
+
+ virtual OUString
+ CreateAccessibleName() override;
+
+private:
+ css::uno::Reference<css::drawing::XDrawPage> mxPage;
+
+ AccessiblePageShape (const AccessiblePageShape&) = delete;
+ AccessibleShape& operator= (const AccessiblePageShape&) = delete;
+};
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/AccessiblePresentationGraphicShape.hxx b/sd/source/ui/inc/AccessiblePresentationGraphicShape.hxx
new file mode 100644
index 000000000..91e573835
--- /dev/null
+++ b/sd/source/ui/inc/AccessiblePresentationGraphicShape.hxx
@@ -0,0 +1,60 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svx/AccessibleGraphicShape.hxx>
+
+namespace accessibility { class AccessibleShapeInfo; }
+namespace accessibility { class AccessibleShapeTreeInfo; }
+
+namespace accessibility {
+
+/** This class makes Impress shapes accessible.
+*/
+class AccessiblePresentationGraphicShape
+ : public AccessibleGraphicShape
+{
+public:
+ //===== internal ========================================================
+ AccessiblePresentationGraphicShape (
+ const AccessibleShapeInfo& rShapeInfo,
+ const AccessibleShapeTreeInfo& rShapeTreeInfo);
+ virtual ~AccessiblePresentationGraphicShape() override;
+
+ //===== XServiceInfo ====================================================
+
+ /** Returns an identifier for the implementation of this object.
+ */
+ virtual OUString SAL_CALL
+ getImplementationName() override;
+
+ //===== internal ========================================================
+
+ /// Create a name string that contains the accessible name.
+ virtual OUString
+ CreateAccessibleBaseName () override;
+
+ /// Return this object's role.
+ virtual sal_Int16 SAL_CALL getAccessibleRole () override;
+};
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/AccessiblePresentationOLEShape.hxx b/sd/source/ui/inc/AccessiblePresentationOLEShape.hxx
new file mode 100644
index 000000000..a8ac60deb
--- /dev/null
+++ b/sd/source/ui/inc/AccessiblePresentationOLEShape.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <svx/AccessibleOLEShape.hxx>
+
+namespace accessibility {
+
+/** This class makes Impress shapes accessible.
+*/
+class AccessiblePresentationOLEShape
+ : public AccessibleOLEShape
+{
+public:
+ //===== internal ========================================================
+ AccessiblePresentationOLEShape (
+ const AccessibleShapeInfo& rShapeInfo,
+ const AccessibleShapeTreeInfo& rShapeTreeInfo);
+ virtual ~AccessiblePresentationOLEShape() override;
+
+ //===== XServiceInfo ====================================================
+
+ /** Returns an identifier for the implementation of this object.
+ */
+ virtual OUString SAL_CALL
+ getImplementationName() override;
+
+ //===== internal ========================================================
+
+ /// Create a name string that contains the accessible name.
+ virtual OUString
+ CreateAccessibleBaseName () override;
+
+ /// Return this object's role.
+ virtual sal_Int16 SAL_CALL getAccessibleRole () override;
+};
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/AccessiblePresentationShape.hxx b/sd/source/ui/inc/AccessiblePresentationShape.hxx
new file mode 100644
index 000000000..4a6447ae9
--- /dev/null
+++ b/sd/source/ui/inc/AccessiblePresentationShape.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <svx/AccessibleShape.hxx>
+
+namespace accessibility {
+
+/** This class makes Impress shapes accessible.
+*/
+class AccessiblePresentationShape
+ : public AccessibleShape
+{
+public:
+ //===== internal ========================================================
+ AccessiblePresentationShape (
+ const AccessibleShapeInfo& rShapeInfo,
+ const AccessibleShapeTreeInfo& rShapeTreeInfo);
+ virtual ~AccessiblePresentationShape() override;
+
+ //===== XServiceInfo ====================================================
+
+ /** Returns an identifier for the implementation of this object.
+ */
+ virtual OUString SAL_CALL
+ getImplementationName() override;
+
+ //===== internal ========================================================
+
+ /// Create a name string that contains the accessible name.
+ virtual OUString
+ CreateAccessibleBaseName () override;
+
+ OUString GetStyle() const override;
+
+private:
+ AccessiblePresentationShape (const AccessiblePresentationShape&) = delete;
+
+ AccessiblePresentationShape& operator= (const AccessiblePresentationShape&) = delete;
+};
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/AccessibleSlideSorterObject.hxx b/sd/source/ui/inc/AccessibleSlideSorterObject.hxx
new file mode 100644
index 000000000..6da56a152
--- /dev/null
+++ b/sd/source/ui/inc/AccessibleSlideSorterObject.hxx
@@ -0,0 +1,189 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <comphelper/compbase.hxx>
+#include <com/sun/star/accessibility/XAccessible.hpp>
+#include <com/sun/star/accessibility/XAccessibleContext.hpp>
+#include <com/sun/star/accessibility/XAccessibleComponent.hpp>
+#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+
+class SdPage;
+namespace sd::slidesorter { class SlideSorter; }
+
+namespace accessibility {
+
+typedef comphelper::WeakComponentImplHelper<
+ css::accessibility::XAccessible,
+ css::accessibility::XAccessibleEventBroadcaster,
+ css::accessibility::XAccessibleContext,
+ css::accessibility::XAccessibleComponent,
+ css::lang::XServiceInfo > AccessibleSlideSorterObjectBase;
+
+/** This class makes page objects of the slide sorter accessible.
+*/
+class AccessibleSlideSorterObject
+ : public AccessibleSlideSorterObjectBase
+{
+public:
+ /** Create a new object that represents a page object in the slide
+ sorter.
+ @param rxParent
+ The accessible parent.
+ @param rSlideSorter
+ The slide sorter whose model manages the page.
+ @param nPageNumber
+ The number of the page in the range [0,nPageCount).
+ */
+ AccessibleSlideSorterObject(
+ const css::uno::Reference<css::accessibility::XAccessible >& rxParent,
+ ::sd::slidesorter::SlideSorter& rSlideSorter,
+ sal_uInt16 nPageNumber);
+ virtual ~AccessibleSlideSorterObject() override;
+
+ /** Return the page that is made accessible by the called object.
+ */
+ SdPage* GetPage() const;
+
+ /** The page number as given to the constructor.
+ */
+ sal_uInt16 GetPageNumber() const { return mnPageNumber;}
+
+ void FireAccessibleEvent (
+ short nEventId,
+ const css::uno::Any& rOldValue,
+ const css::uno::Any& rNewValue);
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ //===== XAccessible =======================================================
+
+ virtual css::uno::Reference<css::accessibility::XAccessibleContext > SAL_CALL
+ getAccessibleContext() override;
+
+ //===== XAccessibleEventBroadcaster =======================================
+ virtual void SAL_CALL
+ addAccessibleEventListener(
+ const css::uno::Reference<css::accessibility::XAccessibleEventListener >& rxListener) override;
+
+ virtual void SAL_CALL
+ removeAccessibleEventListener(
+ const css::uno::Reference<css::accessibility::XAccessibleEventListener >& rxListener ) override;
+
+ //===== XAccessibleContext ==============================================
+
+ virtual sal_Int32 SAL_CALL
+ getAccessibleChildCount() override;
+
+ virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL
+ getAccessibleChild (sal_Int32 nIndex) override;
+
+ virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL
+ getAccessibleParent() override;
+
+ virtual sal_Int32 SAL_CALL
+ getAccessibleIndexInParent() override;
+
+ virtual sal_Int16 SAL_CALL
+ getAccessibleRole() override;
+
+ virtual OUString SAL_CALL
+ getAccessibleDescription() override;
+
+ virtual OUString SAL_CALL
+ getAccessibleName() override;
+
+ virtual css::uno::Reference< css::accessibility::XAccessibleRelationSet> SAL_CALL
+ getAccessibleRelationSet() override;
+
+ virtual css::uno::Reference< css::accessibility::XAccessibleStateSet> SAL_CALL
+ getAccessibleStateSet() override;
+
+ virtual css::lang::Locale SAL_CALL
+ getLocale() override;
+
+ //===== XAccessibleComponent ================================================
+
+ virtual sal_Bool SAL_CALL containsPoint (
+ const css::awt::Point& aPoint) override;
+
+ virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL
+ getAccessibleAtPoint (
+ const css::awt::Point& aPoint) override;
+
+ virtual css::awt::Rectangle SAL_CALL getBounds() override;
+
+ virtual css::awt::Point SAL_CALL getLocation() override;
+
+ virtual css::awt::Point SAL_CALL getLocationOnScreen() override;
+
+ virtual css::awt::Size SAL_CALL getSize() override;
+
+ virtual void SAL_CALL grabFocus() override;
+
+ virtual sal_Int32 SAL_CALL getForeground() override;
+
+ virtual sal_Int32 SAL_CALL getBackground() override;
+
+ //===== XServiceInfo ====================================================
+
+ /** Returns an identifier for the implementation of this object.
+ */
+ virtual OUString SAL_CALL
+ getImplementationName() override;
+
+ /** Return whether the specified service is supported by this class.
+ */
+ virtual sal_Bool SAL_CALL
+ supportsService (const OUString& sServiceName) override;
+
+ /** Returns a list of all supported services.
+ */
+ virtual css::uno::Sequence< OUString> SAL_CALL
+ getSupportedServiceNames() override;
+
+private:
+ css::uno::Reference<css::accessibility::XAccessible> mxParent;
+ sal_uInt16 mnPageNumber;
+ ::sd::slidesorter::SlideSorter& mrSlideSorter;
+ sal_uInt32 mnClientId;
+
+ /** Check whether or not the object has been disposed (or is in the
+ state of being disposed). If that is the case then
+ DisposedException is thrown to inform the (indirect) caller of the
+ foul deed.
+
+ @throws css::lang::DisposedException
+ */
+ void ThrowIfDisposed();
+
+ /** Check whether or not the object has been disposed (or is in the
+ state of being disposed).
+
+ @return sal_True, if the object is disposed or in the course
+ of being disposed. Otherwise, sal_False is returned.
+ */
+ bool IsDisposed() const;
+};
+
+} // end of namespace ::accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/AccessibleSlideSorterView.hxx b/sd/source/ui/inc/AccessibleSlideSorterView.hxx
new file mode 100644
index 000000000..85003b72d
--- /dev/null
+++ b/sd/source/ui/inc/AccessibleSlideSorterView.hxx
@@ -0,0 +1,255 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <com/sun/star/accessibility/XAccessible.hpp>
+#include <com/sun/star/accessibility/XAccessibleContext.hpp>
+#include <com/sun/star/accessibility/XAccessibleComponent.hpp>
+#include <com/sun/star/accessibility/XAccessibleSelection.hpp>
+#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <vcl/vclptr.hxx>
+#include <vcl/window.hxx>
+
+#include <memory>
+
+namespace sd::slidesorter { class SlideSorter; }
+
+namespace accessibility {
+
+class AccessibleSlideSorterObject;
+
+typedef ::cppu::WeakComponentImplHelper<
+ css::accessibility::XAccessible,
+ css::accessibility::XAccessibleEventBroadcaster,
+ css::accessibility::XAccessibleContext,
+ css::accessibility::XAccessibleComponent,
+ css::accessibility::XAccessibleSelection,
+ css::lang::XServiceInfo
+ > AccessibleSlideSorterViewBase;
+
+/** This class makes the SlideSorterViewShell accessible. It uses objects
+ of the AccessibleSlideSorterObject class to the make the page objects
+ accessible.
+*/
+class AccessibleSlideSorterView
+ : public cppu::BaseMutex,
+ public AccessibleSlideSorterViewBase
+{
+public:
+ AccessibleSlideSorterView(
+ ::sd::slidesorter::SlideSorter& rSlideSorter,
+ vcl::Window* pParentWindow);
+
+ void Init();
+
+ virtual ~AccessibleSlideSorterView() override;
+
+ /** This method acts like a dispose call. It sends a disposing to all
+ of its listeners. It may be called twice.
+ */
+ void Destroyed();
+
+ void FireAccessibleEvent (
+ short nEventId,
+ const css::uno::Any& rOldValue,
+ const css::uno::Any& rNewValue);
+
+ virtual void SAL_CALL disposing() override;
+
+ /** Return the implementation object of the specified child.
+ @param nIndex
+ Index of the child for which to return the implementation object.
+ */
+ AccessibleSlideSorterObject* GetAccessibleChildImplementation (sal_Int32 nIndex);
+
+ //===== XAccessible =======================================================
+
+ virtual css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL
+ getAccessibleContext() override;
+
+ //===== XAccessibleEventBroadcaster =======================================
+ virtual void SAL_CALL
+ addAccessibleEventListener(
+ const css::uno::Reference< css::accessibility::XAccessibleEventListener >& rxListener) override;
+
+ virtual void SAL_CALL
+ removeAccessibleEventListener(
+ const css::uno::Reference< css::accessibility::XAccessibleEventListener >& rxListener ) override;
+
+ //===== XAccessibleContext ==============================================
+
+ /// Return the number of currently visible children.
+ virtual sal_Int32 SAL_CALL
+ getAccessibleChildCount() override;
+
+ /// Return the specified child or throw exception.
+ virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL
+ getAccessibleChild (sal_Int32 nIndex) override;
+
+ /// Return a reference to the parent.
+ virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL
+ getAccessibleParent() override;
+
+ /// Return this objects index among the parents children.
+ virtual sal_Int32 SAL_CALL
+ getAccessibleIndexInParent() override;
+
+ /// Return this object's role.
+ virtual sal_Int16 SAL_CALL
+ getAccessibleRole() override;
+
+ /// Return this object's description.
+ virtual OUString SAL_CALL
+ getAccessibleDescription() override;
+
+ /// Return the object's current name.
+ virtual OUString SAL_CALL
+ getAccessibleName() override;
+
+ /// Return NULL to indicate that an empty relation set.
+ virtual css::uno::Reference<
+ css::accessibility::XAccessibleRelationSet> SAL_CALL
+ getAccessibleRelationSet() override;
+
+ /// Return the set of current states.
+ virtual css::uno::Reference<
+ css::accessibility::XAccessibleStateSet> SAL_CALL
+ getAccessibleStateSet() override;
+
+ /** Return the parents locale or throw exception if this object has no
+ parent yet/anymore.
+ */
+ virtual css::lang::Locale SAL_CALL
+ getLocale() override;
+
+ //===== XAccessibleComponent ================================================
+
+ /** The default implementation uses the result of
+ <member>getBounds</member> to determine whether the given point lies
+ inside this object.
+ */
+ virtual sal_Bool SAL_CALL containsPoint (
+ const css::awt::Point& aPoint) override;
+
+ /** The default implementation returns an empty reference.
+ */
+ virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL
+ getAccessibleAtPoint (
+ const css::awt::Point& aPoint) override;
+
+ /** The default implementation returns an empty rectangle.
+ */
+ virtual css::awt::Rectangle SAL_CALL getBounds() override;
+
+ /** The default implementation uses the result of
+ <member>getBounds</member> to determine the location.
+ */
+ virtual css::awt::Point SAL_CALL getLocation() override;
+
+ /** The default implementation returns an empty position, i.e. the
+ * result of the default constructor of <type>css::awt::Point</type>.
+ */
+ virtual css::awt::Point SAL_CALL getLocationOnScreen() override;
+
+ /** The default implementation uses the result of
+ <member>getBounds</member> to determine the size.
+ */
+ virtual css::awt::Size SAL_CALL getSize() override;
+
+ /** The default implementation does nothing.
+ */
+ virtual void SAL_CALL grabFocus() override;
+
+ /** Returns black as the default foreground color.
+ */
+ virtual sal_Int32 SAL_CALL getForeground() override;
+
+ /** Returns white as the default background color.
+ */
+ virtual sal_Int32 SAL_CALL getBackground() override;
+
+ //===== XAccessibleSelection ==============================================
+
+ virtual void SAL_CALL
+ selectAccessibleChild (sal_Int32 nChildIndex) override;
+
+ virtual sal_Bool SAL_CALL
+ isAccessibleChildSelected( sal_Int32 nChildIndex ) override;
+
+ virtual void SAL_CALL
+ clearAccessibleSelection( ) override;
+
+ virtual void SAL_CALL
+ selectAllAccessibleChildren( ) override;
+
+ virtual sal_Int32 SAL_CALL
+ getSelectedAccessibleChildCount( ) override;
+
+ virtual css::uno::Reference<
+ css::accessibility::XAccessible > SAL_CALL
+ getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) override;
+
+ virtual void SAL_CALL
+ deselectAccessibleChild( sal_Int32 nSelectedChildIndex ) override;
+
+ //===== XServiceInfo ====================================================
+
+ /** Returns an identifier for the implementation of this object.
+ */
+ virtual OUString SAL_CALL
+ getImplementationName() override;
+
+ /** Return whether the specified service is supported by this class.
+ */
+ virtual sal_Bool SAL_CALL
+ supportsService (const OUString& sServiceName) override;
+
+ /** Returns a list of all supported services.
+ */
+ virtual css::uno::Sequence< OUString> SAL_CALL
+ getSupportedServiceNames() override;
+
+ void SwitchViewActivated();
+private:
+ class Implementation;
+ ::std::unique_ptr<Implementation> mpImpl;
+
+ ::sd::slidesorter::SlideSorter& mrSlideSorter;
+
+ sal_uInt32 mnClientId;
+
+ VclPtr<vcl::Window> mpContentWindow;
+
+ /** Check whether or not the object has been disposed (or is in the
+ state of being disposed). If that is the case then
+ DisposedException is thrown to inform the (indirect) caller of the
+ foul deed.
+
+ @throws css::lang::DisposedException
+ */
+ void ThrowIfDisposed();
+};
+
+} // end of namespace ::accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/AccessibleViewForwarder.hxx b/sd/source/ui/inc/AccessibleViewForwarder.hxx
new file mode 100644
index 000000000..c791921e6
--- /dev/null
+++ b/sd/source/ui/inc/AccessibleViewForwarder.hxx
@@ -0,0 +1,92 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svx/IAccessibleViewForwarder.hxx>
+
+class SdrPaintView;
+class OutputDevice;
+
+namespace accessibility
+{
+/** <p>This class provides the means to transform between internal coordinates
+ and screen coordinates without giving direct access to the underlying
+ view. It represents a certain window. A call to
+ <method>GetVisArea</method> returns the corresponding visible
+ rectangle.</p>
+
+ @attention
+ Note, that modifications of the underlying view that lead to
+ different transformations between internal and screen coordinates or
+ change the validity of the forwarder have to be signaled separately.
+*/
+class AccessibleViewForwarder final : public IAccessibleViewForwarder
+{
+public:
+ //===== internal ========================================================
+
+ AccessibleViewForwarder(SdrPaintView* pView, const OutputDevice& rDevice);
+
+ virtual ~AccessibleViewForwarder() override;
+
+ //===== IAccessibleViewforwarder ========================================
+
+ /** Returns the area of the underlying document that is visible in the
+ * corresponding window.
+
+ @return
+ The rectangle of the visible part of the document.
+ */
+ virtual ::tools::Rectangle GetVisibleArea() const override;
+
+ /** Transform the specified point from internal coordinates to an
+ absolute screen position.
+
+ @param rPoint
+ Point in internal coordinates.
+
+ @return
+ The same point but in screen coordinates relative to the upper
+ left corner of the (current) screen.
+ */
+ virtual Point LogicToPixel(const Point& rPoint) const override;
+
+ /** Transform the specified size from internal coordinates to a screen
+ * position.
+
+ @param rSize
+ Size in internal coordinates.
+
+ @return
+ The same size but in screen coordinates.
+ */
+ virtual Size LogicToPixel(const Size& rSize) const override;
+
+private:
+ SdrPaintView* mpView;
+ sal_uInt16 mnWindowId;
+
+ AccessibleViewForwarder(AccessibleViewForwarder const&) = delete;
+ AccessibleViewForwarder& operator=(AccessibleViewForwarder const&) = delete;
+};
+
+} // end of namespace accessibility
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/AnimationChildWindow.hxx b/sd/source/ui/inc/AnimationChildWindow.hxx
new file mode 100644
index 000000000..1223dfdbd
--- /dev/null
+++ b/sd/source/ui/inc/AnimationChildWindow.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/childwin.hxx>
+#include <sal/types.h>
+
+namespace vcl { class Window; }
+class SfxBindings;
+
+namespace sd {
+
+class AnimationChildWindow
+ : public SfxChildWindow
+{
+public:
+ AnimationChildWindow(
+ vcl::Window*,
+ sal_uInt16,
+ SfxBindings*,
+ SfxChildWinInfo*);
+
+ SFX_DECL_CHILDWINDOW_WITHID(AnimationChildWindow);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/BezierObjectBar.hxx b/sd/source/ui/inc/BezierObjectBar.hxx
new file mode 100644
index 000000000..a030576eb
--- /dev/null
+++ b/sd/source/ui/inc/BezierObjectBar.hxx
@@ -0,0 +1,51 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/shell.hxx>
+#include <glob.hxx>
+
+namespace sd
+{
+class View;
+class ViewShell;
+
+class BezierObjectBar final : public SfxShell
+{
+public:
+ SFX_DECL_INTERFACE(SD_IF_SDDRAWBEZIEROBJECTBAR)
+
+ BezierObjectBar(ViewShell* pSdViewShell, View* pSdView);
+ virtual ~BezierObjectBar() override;
+
+ void GetAttrState(SfxItemSet& rSet);
+ void Execute(SfxRequest& rReq);
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+ View* mpView;
+ ViewShell* mpViewSh;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/BreakDlg.hxx b/sd/source/ui/inc/BreakDlg.hxx
new file mode 100644
index 000000000..ee2a8b15d
--- /dev/null
+++ b/sd/source/ui/inc/BreakDlg.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/basedlgs.hxx>
+#include <sfx2/progress.hxx>
+#include <svx/svdetc.hxx>
+#include <vcl/idle.hxx>
+
+namespace sd
+{
+class DrawDocShell;
+class DrawView;
+
+/**
+ * dialog to break meta files
+ */
+class BreakDlg : public SfxDialogController
+{
+public:
+ BreakDlg(weld::Window* pWindow, DrawView* pDrView, DrawDocShell* pShell,
+ sal_uLong nSumActionCount, sal_uLong nObjCount);
+
+ virtual short run() override;
+
+private:
+ std::unique_ptr<weld::Label> m_xFiObjInfo;
+ std::unique_ptr<weld::Label> m_xFiActInfo;
+ std::unique_ptr<weld::Label> m_xFiInsInfo;
+ std::unique_ptr<weld::Button> m_xBtnCancel;
+
+ DrawView* m_pDrView;
+
+ bool m_bCancel;
+
+ Idle m_aUpdateIdle;
+ std::unique_ptr<SvdProgressInfo> m_xProgrInfo;
+ std::unique_ptr<SfxProgress> m_xProgress;
+
+ DECL_LINK(CancelButtonHdl, weld::Button&, void);
+ DECL_LINK(UpDate, void*, bool);
+ DECL_LINK(InitialUpdate, Timer*, void);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/BulletAndPositionDlg.hxx b/sd/source/ui/inc/BulletAndPositionDlg.hxx
new file mode 100644
index 000000000..6dde73753
--- /dev/null
+++ b/sd/source/ui/inc/BulletAndPositionDlg.hxx
@@ -0,0 +1,157 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vector>
+#include <memory>
+
+#include <editeng/numdef.hxx>
+#include <editeng/svxenum.hxx>
+#include <vcl/weld.hxx>
+#include "View.hxx"
+#include <cui/numberingpreview.hxx>
+
+#define MN_GALLERY_ENTRY 100
+
+class ColorListBox;
+class SvxNumValueSet;
+class SvxNumRule;
+class SvxBmpNumValueSet;
+class SvxBrushItem;
+class SdDrawDocument;
+
+namespace sd
+{
+class View;
+}
+
+/// Main class for handling the bullets, numbering format and their position.
+class SvxBulletAndPositionDlg : public weld::GenericDialogController
+{
+ OUString m_sNumCharFmtName;
+
+ Timer aInvalidateTimer;
+
+ std::unique_ptr<SvxNumRule> pActNum;
+ std::unique_ptr<SvxNumRule> pSaveNum;
+ const SfxItemSet& rFirstStateSet;
+
+ Size aInitSize[SVX_MAX_NUM];
+
+ bool bLastWidthModified : 1;
+ bool bModified : 1;
+ bool bInInitControl : 1; // workaround for Modify-error, is said to be corrected from 391 on
+ bool bLabelAlignmentPosAndSpaceModeActive;
+ bool bApplyToMaster;
+
+ std::vector<OUString> aGrfNames;
+ vcl::Font aActBulletFont;
+
+ sal_uInt8 nBullet;
+ sal_uInt16 nActNumLvl;
+ weld::Window* p_Window;
+ TypedWhichId<SvxNumBulletItem> nNumItemId;
+ MapUnit eCoreUnit;
+
+ SvxNumberingPreview m_aPreviewWIN;
+ std::unique_ptr<weld::Widget> m_xGrid;
+ std::unique_ptr<weld::TreeView> m_xLevelLB;
+ std::unique_ptr<weld::ComboBox> m_xFmtLB;
+ std::unique_ptr<weld::Label> m_xPrefixFT;
+ std::unique_ptr<weld::Entry> m_xPrefixED;
+ std::unique_ptr<weld::Label> m_xSuffixFT;
+ std::unique_ptr<weld::Entry> m_xSuffixED;
+ std::unique_ptr<weld::Frame> m_xBeforeAfter;
+ std::unique_ptr<weld::Label> m_xBulColorFT;
+ std::unique_ptr<ColorListBox> m_xBulColLB;
+ std::unique_ptr<weld::Label> m_xBulRelSizeFT;
+ std::unique_ptr<weld::MetricSpinButton> m_xBulRelSizeMF;
+ std::unique_ptr<weld::Label> m_xStartFT;
+ std::unique_ptr<weld::SpinButton> m_xStartED;
+ std::unique_ptr<weld::Label> m_xBulletFT;
+ std::unique_ptr<weld::Button> m_xBulletPB;
+ std::unique_ptr<weld::MenuButton> m_xBitmapMB;
+ std::unique_ptr<weld::Label> m_xWidthFT;
+ std::unique_ptr<weld::MetricSpinButton> m_xWidthMF;
+ std::unique_ptr<weld::Label> m_xHeightFT;
+ std::unique_ptr<weld::MetricSpinButton> m_xHeightMF;
+ std::unique_ptr<weld::CheckButton> m_xRatioCB;
+ std::unique_ptr<weld::Menu> m_xGalleryMenu;
+ std::unique_ptr<weld::CustomWeld> m_xPreviewWIN;
+ std::unique_ptr<weld::Label> m_xDistBorderFT;
+ std::unique_ptr<weld::MetricSpinButton> m_xDistBorderMF;
+ std::unique_ptr<weld::CheckButton> m_xRelativeCB;
+ std::unique_ptr<weld::Label> m_xIndentFT;
+ std::unique_ptr<weld::MetricSpinButton> m_xIndentMF;
+ std::unique_ptr<weld::Toggleable> m_xLeftTB;
+ std::unique_ptr<weld::Toggleable> m_xCenterTB;
+ std::unique_ptr<weld::Toggleable> m_xRightTB;
+ std::unique_ptr<weld::RadioButton> m_xSlideRB;
+ std::unique_ptr<weld::RadioButton> m_xSelectionRB;
+ std::unique_ptr<weld::Toggleable> m_xApplyToMaster;
+ std::unique_ptr<weld::Button> m_xReset;
+
+ void InitControls();
+ /** To switch between the numbering type
+ 0 - Number;
+ 1 - Bullet;
+ 2 - Bitmap; */
+ void SwitchNumberType(sal_uInt8 nType);
+ void CheckForStartValue_Impl(sal_uInt16 nNumberingType);
+
+ DECL_LINK(NumberTypeSelectHdl_Impl, weld::ComboBox&, void);
+ DECL_LINK(LevelHdl_Impl, weld::TreeView&, void);
+ DECL_LINK(PopupActivateHdl_Impl, weld::Toggleable&, void);
+ DECL_LINK(GraphicHdl_Impl, const OString&, void);
+ DECL_LINK(BulletHdl_Impl, weld::Button&, void);
+ DECL_LINK(SizeHdl_Impl, weld::MetricSpinButton&, void);
+ DECL_LINK(RatioHdl_Impl, weld::Toggleable&, void);
+ DECL_LINK(EditModifyHdl_Impl, weld::Entry&, void);
+ DECL_LINK(SpinModifyHdl_Impl, weld::SpinButton&, void);
+ DECL_LINK(BulColorHdl_Impl, ColorListBox&, void);
+ DECL_LINK(BulRelSizeHdl_Impl, weld::MetricSpinButton&, void);
+ DECL_LINK(PreviewInvalidateHdl_Impl, Timer*, void);
+ DECL_LINK(DistanceHdl_Impl, weld::MetricSpinButton&, void);
+ DECL_LINK(RelativeHdl_Impl, weld::Toggleable&, void);
+ DECL_LINK(SelectLeftAlignmentHdl_Impl, weld::Toggleable&, void);
+ DECL_LINK(SelectCenterAlignmentHdl_Impl, weld::Toggleable&, void);
+ DECL_LINK(SelectRightAlignmentHdl_Impl, weld::Toggleable&, void);
+ DECL_LINK(ApplyToMasterHdl_Impl, weld::Toggleable&, void);
+ DECL_LINK(ResetHdl_Impl, weld::Button&, void);
+ void EditModifyHdl_Impl(const weld::Entry*);
+ void InitPosAndSpaceMode();
+ void SetAlignmentHdl_Impl(SvxAdjust);
+
+public:
+ SvxBulletAndPositionDlg(weld::Window* pWindow, const SfxItemSet& rSet, const ::sd::View* pView);
+ virtual ~SvxBulletAndPositionDlg() override;
+
+ SfxItemSet* GetOutputItemSet(SfxItemSet* rSet);
+ bool IsApplyToMaster() const;
+ bool IsSlideScope() const;
+ void Reset(const SfxItemSet* rSet);
+
+ void SetCharFmt(const OUString& rNumName) { m_sNumCharFmtName = rNumName; }
+ void SetMetric(FieldUnit eSet);
+
+ void SetModified(bool bRepaint = true);
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/Client.hxx b/sd/source/ui/inc/Client.hxx
new file mode 100644
index 000000000..6b999068e
--- /dev/null
+++ b/sd/source/ui/inc/Client.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/ipclient.hxx>
+class SdrOle2Obj;
+
+namespace sd
+{
+class ViewShell;
+
+class Client : public SfxInPlaceClient
+{
+ ViewShell* mpViewShell;
+ SdrOle2Obj* pSdrOle2Obj;
+
+ virtual void ObjectAreaChanged() override;
+ virtual void RequestNewObjectArea(::tools::Rectangle&) override;
+ virtual void ViewChanged() override;
+
+public:
+ Client(SdrOle2Obj* pObj, ViewShell* pSdViewShell, vcl::Window* pWindow);
+ virtual ~Client() override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/ClientView.hxx b/sd/source/ui/inc/ClientView.hxx
new file mode 100644
index 000000000..7a52053ba
--- /dev/null
+++ b/sd/source/ui/inc/ClientView.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "drawview.hxx"
+
+namespace sd
+{
+/**
+ * The SdClientView is used for DrawDocShell::Draw()
+ */
+class ClientView : public DrawView
+{
+public:
+ ClientView(DrawDocShell* pDocSh, OutputDevice* pOutDev);
+ virtual ~ClientView() override;
+
+ /* if the view should not do an Invalidate() on the windows, you have to
+ override the following two methods and do something different */
+ virtual void InvalidateOneWin(OutputDevice& rWin) override;
+ virtual void InvalidateOneWin(OutputDevice& rWin, const ::tools::Rectangle& rRect) override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/CustomAnimationList.hxx b/sd/source/ui/inc/CustomAnimationList.hxx
new file mode 100644
index 000000000..ca9673fd7
--- /dev/null
+++ b/sd/source/ui/inc/CustomAnimationList.hxx
@@ -0,0 +1,169 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <memory>
+
+#include <vcl/transfer.hxx>
+#include <vcl/weld.hxx>
+#include <CustomAnimationEffect.hxx>
+
+namespace com::sun::star::drawing { class XShape; }
+
+struct ImplSVEvent;
+
+namespace sd {
+
+typedef std::shared_ptr< CustomAnimationEffect > CustomAnimationEffectPtr;
+
+class ICustomAnimationListController
+{
+public:
+ virtual void onSelect() = 0;
+ virtual void onDoubleClick() = 0;
+ virtual void onContextMenu(const OString &rIdent) = 0;
+ virtual void onDragNDropComplete( std::vector< CustomAnimationEffectPtr > pEffectsDragged, CustomAnimationEffectPtr pEffectInsertBefore ) = 0;
+ virtual ~ICustomAnimationListController() {}
+};
+
+class CustomAnimationList;
+class CustomAnimationListEntryItem;
+
+class CustomAnimationListDropTarget : public DropTargetHelper
+{
+private:
+ CustomAnimationList& m_rTreeView;
+
+ virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override;
+ virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override;
+
+public:
+ CustomAnimationListDropTarget(CustomAnimationList& rTreeView);
+};
+
+class CustomAnimationList : public ISequenceListener
+{
+ friend class CustomAnimationListEntryItem;
+ friend struct stl_append_effect_func;
+
+public:
+ explicit CustomAnimationList(std::unique_ptr<weld::TreeView> xTreeView,
+ std::unique_ptr<weld::Label> xLabel,
+ std::unique_ptr<weld::Widget> xScrolledWindow);
+ virtual ~CustomAnimationList();
+
+ // methods
+
+ /** selects or deselects the given effect.
+ Selections of other effects are not changed */
+ void select( const CustomAnimationEffectPtr& pEffect );
+
+ /** populates the list with all effects from the given MainSequence */
+ void update( const MainSequencePtr& pMainSequence );
+
+ void update();
+
+ EffectSequence getSelection() const;
+
+ // events
+ void onSelectionChanged(const css::uno::Any& rSelection);
+
+ void Select();
+
+ virtual void notify_change() override;
+
+ bool isExpanded( const CustomAnimationEffectPtr& pEffect ) const;
+ bool isVisible( const CustomAnimationEffectPtr& pEffect ) const;
+
+ // clears all entries from the listbox
+ void clear();
+
+ void setController( ICustomAnimationListController* pController )
+ {
+ mpController = pController;
+ };
+
+ sal_Int8 AcceptDrop(const AcceptDropEvent& rEvt);
+ sal_Int8 ExecuteDrop(const ExecuteDropEvent& rEvt);
+
+ void set_sensitive(bool bSensitive) { mxTreeView->set_sensitive(bSensitive); }
+ int get_height_rows(int nRows) { return mxTreeView->get_height_rows(nRows); }
+ int get_approximate_digit_width() const { return mxTreeView->get_approximate_digit_width(); }
+ void set_size_request(int nWidth, int nHeight)
+ {
+ mxTreeView->set_size_request(nWidth, nHeight);
+ mxEmptyLabel->set_size_request(nWidth, nHeight);
+ }
+ void unselect_all() { mxTreeView->unselect_all(); }
+ weld::TreeView& get_widget() { return *mxTreeView; }
+
+ DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
+ DECL_LINK(ExpandHdl, const weld::TreeIter&, bool);
+ DECL_LINK(PostExpandHdl, void*, void);
+ DECL_LINK(CollapseHdl, const weld::TreeIter&, bool);
+ DECL_LINK(PostCollapseHdl, void*, void);
+
+private:
+ std::unique_ptr<weld::TreeView> mxTreeView;
+ CustomAnimationListDropTarget maDropTargetHelper;
+ std::unique_ptr<weld::Label> mxEmptyLabel;
+ std::unique_ptr<weld::Widget> mxEmptyLabelParent;
+ std::vector<std::unique_ptr<CustomAnimationListEntryItem>> mxEntries;
+ std::vector<std::unique_ptr<weld::TreeIter>> lastSelectedEntries;
+
+ bool mbIgnorePaint;
+
+ DECL_LINK(SelectHdl, weld::TreeView&, void);
+ DECL_LINK(CommandHdl, const CommandEvent&, bool);
+ DECL_LINK(DoubleClickHdl, weld::TreeView&, bool);
+ DECL_LINK(DragBeginHdl, bool&, bool);
+ DECL_STATIC_LINK(CustomAnimationList, CustomRenderHdl, weld::TreeView::render_args, void);
+ DECL_STATIC_LINK(CustomAnimationList, CustomGetSizeHdl, weld::TreeView::get_size_args, Size);
+
+ void ExecuteContextMenuAction(const OString& rSelectedPopupEntry);
+
+ /** appends the given effect to the list*/
+ void append( CustomAnimationEffectPtr pEffect );
+
+ ICustomAnimationListController* mpController;
+
+ MainSequencePtr mpMainSequence;
+
+ css::uno::Reference< css::drawing::XShape > mxLastTargetShape;
+ sal_Int32 mnLastGroupId;
+ ImplSVEvent* mnPostExpandEvent;
+ ImplSVEvent* mnPostCollapseEvent;
+
+ std::unique_ptr<weld::TreeIter> mxLastParentEntry;
+
+ // drag & drop
+ std::unique_ptr<weld::TreeIter> mxDndEffectDragging;
+ std::vector<std::unique_ptr<weld::TreeIter>> mDndEffectsSelected;
+};
+
+OUString getPropertyName( sal_Int32 nPropertyType );
+
+OUString getShapeDescription( const css::uno::Reference< css::drawing::XShape >& xShape, bool bWithText );
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/CustomAnimationPane.hxx b/sd/source/ui/inc/CustomAnimationPane.hxx
new file mode 100644
index 000000000..5e2d69658
--- /dev/null
+++ b/sd/source/ui/inc/CustomAnimationPane.hxx
@@ -0,0 +1,179 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/sidebar/ILayoutableWindow.hxx>
+#include <sfx2/sidebar/PanelLayout.hxx>
+#include <vcl/idle.hxx>
+#include "CustomAnimationList.hxx"
+#include <misc/scopelock.hxx>
+
+#include <vector>
+
+namespace com::sun::star::drawing { class XDrawPage; }
+namespace com::sun::star::drawing { class XDrawView; }
+namespace weld { class ComboBox; }
+namespace com::sun::star::animations { class XAnimationNode; }
+namespace sd::tools { class EventMultiplexerEvent; }
+
+enum class PathKind { NONE, CURVE, POLYGON, FREEFORM };
+
+namespace sd {
+
+class MotionPathTag;
+class SdPropertySubControl;
+class STLPropertySet;
+class ViewShellBase;
+
+typedef std::vector< rtl::Reference< MotionPathTag > > MotionPathTagVector;
+
+class CustomAnimationPane : public PanelLayout
+ , public sfx2::sidebar::ILayoutableWindow
+ , public ICustomAnimationListController
+{
+ friend class MotionPathTag;
+public:
+ CustomAnimationPane(weld::Widget* pParent, ViewShellBase& rBase);
+ virtual ~CustomAnimationPane() override;
+
+ // ILayoutableWindow
+ virtual css::ui::LayoutSize GetHeightForWidth (const sal_Int32 nWidth) override;
+
+ // callbacks
+ void onSelectionChanged();
+ void onChangeCurrentPage();
+ void onAdd();
+ void onRemove();
+ void onChangeStart();
+ void onChangeStart( sal_Int16 nNodeType );
+ void onChangeSpeed();
+
+ // methods
+ void preview( const css::uno::Reference< css::animations::XAnimationNode >& xAnimationNode );
+ void remove( CustomAnimationEffectPtr const & pEffect );
+
+ // ICustomAnimationListController
+ virtual void onSelect() override;
+ virtual void onDoubleClick() override;
+ virtual void onContextMenu(const OString& rIdent) override;
+ virtual void onDragNDropComplete( std::vector< CustomAnimationEffectPtr > pEffectsDragged, CustomAnimationEffectPtr pEffectInsertBefore ) override;
+
+ void addUndo();
+
+ double getDuration() const;
+ void updatePathFromMotionPathTag( const rtl::Reference< MotionPathTag >& xTag );
+
+private:
+ void initialize();
+ void addListener();
+ void removeListener();
+ void updateControls();
+ void updateMotionPathTags();
+
+ void showOptions(const OString& sPage = OString());
+ void moveSelection( bool bUp );
+ void onPreview( bool bForcePreview );
+
+ std::unique_ptr<STLPropertySet> createSelectionSet();
+ void changeSelection( STLPropertySet const * pResultSet, STLPropertySet const * pOldSet );
+
+ static css::uno::Any getProperty1Value( sal_Int32 nType, const CustomAnimationEffectPtr& pEffect );
+ static bool setProperty1Value( sal_Int32 nType, const CustomAnimationEffectPtr& pEffect, const css::uno::Any& rValue );
+ sal_Int32 fillAnimationLB( bool bHasText );
+ PathKind getCreatePathKind() const;
+ void createPath( PathKind eKind, std::vector< ::com::sun::star::uno::Any >& rTargets, double fDuration );
+
+ DECL_LINK( implControlListBoxHdl, weld::ComboBox&, void );
+ DECL_LINK( implClickHdl, weld::Button&, void );
+ DECL_LINK( implToggleHdl, weld::Toggleable&, void );
+ DECL_LINK( implPropertyHdl, LinkParamNone*, void );
+ DECL_LINK( EventMultiplexerListener, tools::EventMultiplexerEvent&, void );
+ DECL_LINK( lateInitCallback, Timer *, void );
+ DECL_LINK( DurationModifiedHdl, weld::MetricSpinButton&, void );
+ DECL_LINK( DelayModifiedHdl, weld::MetricSpinButton&, void );
+ DECL_LINK( DelayLoseFocusHdl, weld::Widget&, void );
+ DECL_LINK( UpdateAnimationLB, weld::ComboBox&, void );
+ DECL_LINK( AnimationSelectHdl, weld::TreeView&, void );
+ DECL_LINK( SelectionHandler, Timer*, void );
+ void implControlHdl(const weld::Widget* pControl);
+
+private:
+ ViewShellBase& mrBase;
+
+ // UI Elements
+ std::unique_ptr<weld::Label> mxFTAnimation;
+ std::unique_ptr<CustomAnimationList> mxCustomAnimationList;
+ std::unique_ptr<weld::Button> mxPBAddEffect;
+ std::unique_ptr<weld::Button> mxPBRemoveEffect;
+ std::unique_ptr<weld::Button> mxPBMoveUp;
+ std::unique_ptr<weld::Button> mxPBMoveDown;
+ std::unique_ptr<weld::Label> mxFTCategory;
+ std::unique_ptr<weld::ComboBox> mxLBCategory;
+ std::unique_ptr<weld::Label> mxFTEffect;
+ std::unique_ptr<weld::TreeView> mxLBAnimation;
+ std::unique_ptr<weld::Label> mxFTStart;
+ std::unique_ptr<weld::ComboBox> mxLBStart;
+ std::unique_ptr<weld::Label> mxFTProperty;
+ std::unique_ptr<SdPropertySubControl> mxLBSubControl;
+ std::unique_ptr<weld::Container> mxPlaceholderBox;
+ std::unique_ptr<weld::Button> mxPBPropertyMore;
+ std::unique_ptr<weld::Label> mxFTDuration;
+ std::unique_ptr<weld::MetricSpinButton> mxCBXDuration;
+ std::unique_ptr<weld::Label> mxFTStartDelay;
+ std::unique_ptr<weld::MetricSpinButton> mxMFStartDelay;
+ std::unique_ptr<weld::CheckButton> mxCBAutoPreview;
+ std::unique_ptr<weld::Button> mxPBPlay;
+
+ Idle maIdle;
+
+ OUString maStrModify;
+ OUString maStrProperty;
+
+ sal_Int32 mnLastSelectedAnimation;
+ sal_Int32 mnPropertyType;
+ static sal_Int32 const gnMotionPathPos = 3;
+ sal_Int32 mnCurvePathPos;
+ sal_Int32 mnPolygonPathPos;
+ sal_Int32 mnFreeformPathPos;
+
+ EffectSequence maListSelection;
+ css::uno::Any maViewSelection;
+
+ MainSequencePtr mpMainSequence;
+
+ css::uno::Reference< css::drawing::XDrawPage > mxCurrentPage;
+ css::uno::Reference< css::drawing::XDrawView > mxView;
+
+ /** The CustomAnimationPresets is initialized either on demand or
+ after a short time after the construction of a new object of this
+ class. This timer is responsible for the later.
+ */
+ Timer maLateInitTimer;
+
+ MotionPathTagVector maMotionPathTags;
+
+ ScopeLock maSelectionLock;
+};
+
+void fillRepeatComboBox(weld::ComboBox& rBox);
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/DocumentRenderer.hxx b/sd/source/ui/inc/DocumentRenderer.hxx
new file mode 100644
index 000000000..7cbeefc79
--- /dev/null
+++ b/sd/source/ui/inc/DocumentRenderer.hxx
@@ -0,0 +1,63 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/view/XRenderable.hpp>
+#include <comphelper/compbase.hxx>
+#include <memory>
+
+namespace sd { class ViewShellBase; }
+
+namespace sd {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::view::XRenderable
+ > DocumentRendererInterfaceBase;
+
+class DocumentRenderer final
+ : public DocumentRendererInterfaceBase
+{
+public:
+ DocumentRenderer (ViewShellBase& rBase);
+ virtual ~DocumentRenderer() override;
+
+ // XRenderable
+ virtual sal_Int32 SAL_CALL getRendererCount (
+ const css::uno::Any& aSelection,
+ const css::uno::Sequence<css::beans::PropertyValue >& xOptions) override;
+
+ virtual css::uno::Sequence<css::beans::PropertyValue> SAL_CALL getRenderer (
+ sal_Int32 nRenderer,
+ const css::uno::Any& rSelection,
+ const css::uno::Sequence<css::beans::PropertyValue>& rxOptions) override;
+
+ virtual void SAL_CALL render (
+ sal_Int32 nRenderer,
+ const css::uno::Any& rSelection,
+ const css::uno::Sequence<css::beans::PropertyValue>& rxOptions) override;
+
+private:
+ class Implementation;
+ std::unique_ptr<Implementation> mpImpl;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/DrawController.hxx b/sd/source/ui/inc/DrawController.hxx
new file mode 100644
index 000000000..2c15e26eb
--- /dev/null
+++ b/sd/source/ui/inc/DrawController.hxx
@@ -0,0 +1,327 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <cppuhelper/propshlp.hxx>
+#include <sfx2/sfxbasecontroller.hxx>
+#include <com/sun/star/view/XSelectionSupplier.hpp>
+#include <com/sun/star/view/XFormLayerAccess.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+#include <comphelper/uno3.hxx>
+#include <cppuhelper/implbase.hxx>
+#include <unotools/weakref.hxx>
+#include <tools/gen.hxx>
+#include <memory>
+#include <vector>
+
+namespace com::sun::star::drawing { class XDrawSubController; }
+namespace com::sun::star::drawing::framework { class XConfigurationController; }
+namespace com::sun::star::drawing::framework { class XModuleController; }
+namespace com::sun::star::drawing { class XLayer; }
+namespace osl { class Mutex; }
+
+class SdPage;
+
+namespace sd {
+
+typedef ::cppu::ImplInheritanceHelper <
+ SfxBaseController,
+ css::view::XSelectionSupplier,
+ css::lang::XServiceInfo,
+ css::drawing::XDrawView,
+ css::view::XSelectionChangeListener,
+ css::view::XFormLayerAccess,
+ css::drawing::framework::XControllerManager,
+ css::lang::XUnoTunnel
+ > DrawControllerInterfaceBase;
+
+class BroadcastHelperOwner
+{
+public:
+ explicit BroadcastHelperOwner (::osl::Mutex& rMutex) : maBroadcastHelper(rMutex) {};
+ ::cppu::OBroadcastHelper maBroadcastHelper;
+};
+
+class ViewShellBase;
+
+/** The DrawController is the UNO controller for Impress and Draw. It
+ relies objects that implement the DrawSubController interface for view
+ specific behaviour. The life time of the DrawController is roughly that
+ of ViewShellBase but note that the DrawController can (in the case of a
+ reload) outlive the ViewShellBase.
+
+ The implementation of the XControllerManager interface is not yet in its
+ final form.
+*/
+class DrawController final
+ : public DrawControllerInterfaceBase,
+ private BroadcastHelperOwner,
+ public ::cppu::OPropertySetHelper
+{
+public:
+ enum PropertyHandle {
+ PROPERTY_WORKAREA = 0,
+ PROPERTY_SUB_CONTROLLER = 1,
+ PROPERTY_CURRENTPAGE = 2,
+ PROPERTY_MASTERPAGEMODE = 3,
+ PROPERTY_LAYERMODE = 4,
+ PROPERTY_ACTIVE_LAYER = 5,
+ PROPERTY_ZOOMTYPE = 6,
+ PROPERTY_ZOOMVALUE = 7,
+ PROPERTY_VIEWOFFSET = 8,
+ PROPERTY_DRAWVIEWMODE = 9
+ ,PROPERTY_UPDATEACC = 10
+ ,PROPERTY_PAGE_CHANGE = 11
+ };
+
+ /** Create a new DrawController object for the given ViewShellBase.
+ */
+ explicit DrawController (ViewShellBase& rBase) noexcept;
+
+ virtual ~DrawController() noexcept override;
+
+ /** Replace the currently used sub controller with the given one. This
+ new sub controller is used from now on for the view (that is the
+ main view shell to be precise) specific tasks. Call this method
+ with a suitable sub controller whenever the view shell in the center
+ pane is exchanged.
+ @param pSubController
+ The ViewShell specific sub controller or NULL when (temporarily
+ while switching to another one) there is no ViewShell displayed
+ in the center pane.
+ */
+ void SetSubController (
+ const css::uno::Reference<css::drawing::XDrawSubController>& rxSubController);
+
+ /** Call this method when the VisArea has changed.
+ */
+ void FireVisAreaChanged (const ::tools::Rectangle& rVisArea) noexcept;
+
+ /** Call this method when the selection has changed.
+ */
+ void FireSelectionChangeListener() noexcept;
+
+ /** Call this method when the edit mode has changed.
+ */
+ void FireChangeEditMode (bool bMasterPageMode) noexcept;
+
+ /** Call this method when the layer mode has changed.
+ */
+ void FireChangeLayerMode (bool bLayerMode) noexcept;
+
+ /** Call this method when there is a new current page.
+ */
+ void FireSwitchCurrentPage (SdPage* pCurrentPage) noexcept;
+
+ /** Broadcast a sidebar context change that is caused by a view
+ switch.
+ */
+ void BroadcastContextChange() const;
+ void NotifyAccUpdate();
+ void fireChangeLayer( css::uno::Reference< css::drawing::XLayer>* pCurrentLayer ) noexcept;
+ // change the parameter to int
+ //void fireSwitchCurrentPage( String pageName) throw();
+ void fireSwitchCurrentPage( sal_Int32 pageIndex) noexcept;
+ bool IsDisposing() const { return mbDisposing; }
+
+ /** Return a pointer to the ViewShellBase object that the DrawController
+ is connected to.
+ @return
+ The returned pointer is <NULL/> after a call to
+ ReleaseViewShellBase().
+ */
+ ViewShellBase* GetViewShellBase() { return mpBase;}
+
+ /** This method is typically called from the destructor of ViewShellBase
+ to tell the DrawController that it and its members must not access
+ the ViewShellBase anymore.
+ After this call the DrawController is semi-disposed.
+ */
+ void ReleaseViewShellBase();
+
+ static const css::uno::Sequence<sal_Int8>& getUnoTunnelId();
+
+ DECLARE_XINTERFACE()
+ DECLARE_XTYPEPROVIDER()
+
+ // XComponent
+ virtual void SAL_CALL dispose() override;
+ virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override;
+ virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override;
+
+ // XController
+ virtual sal_Bool SAL_CALL suspend( sal_Bool Suspend ) 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;
+
+ // XSelectionSupplier
+ virtual sal_Bool SAL_CALL select( const css::uno::Any& aSelection ) override;
+ virtual css::uno::Any SAL_CALL getSelection( ) override;
+ virtual void SAL_CALL addSelectionChangeListener( const css::uno::Reference< css::view::XSelectionChangeListener >& xListener ) override;
+ virtual void SAL_CALL removeSelectionChangeListener( const css::uno::Reference< css::view::XSelectionChangeListener >& xListener ) override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override;
+
+ // XFormLayerAccess
+ virtual css::uno::Reference< css::form::runtime::XFormController > SAL_CALL getFormController( const css::uno::Reference< css::form::XForm >& Form ) override;
+ virtual sal_Bool SAL_CALL isFormDesignMode( ) override;
+ virtual void SAL_CALL setFormDesignMode( sal_Bool DesignMode ) override;
+
+ // XControlAccess
+ virtual css::uno::Reference< css::awt::XControl > SAL_CALL getControl( const css::uno::Reference< css::awt::XControlModel >& xModel ) override;
+
+ // XDrawView
+ virtual void SAL_CALL
+ setCurrentPage (
+ const css::uno::Reference<
+ css::drawing::XDrawPage >& xPage) override;
+
+ virtual css::uno::Reference<
+ css::drawing::XDrawPage > SAL_CALL
+ getCurrentPage() override;
+
+ // lang::XEventListener
+ virtual void SAL_CALL
+ disposing (const css::lang::EventObject& rEventObject) override;
+
+ // view::XSelectionChangeListener
+ virtual void SAL_CALL
+ selectionChanged (const css::lang::EventObject& rEvent) override;
+
+ // XControllerManager
+
+ virtual css::uno::Reference<css::drawing::framework::XConfigurationController> SAL_CALL
+ getConfigurationController() override;
+
+ virtual css::uno::Reference<css::drawing::framework::XModuleController> SAL_CALL
+ getModuleController() override;
+
+ // XUnoTunnel
+
+ virtual sal_Int64 SAL_CALL getSomething (const css::uno::Sequence<sal_Int8>& rId) override;
+
+private:
+ /** This method must return the name to index table. This table
+ contains all property names and types of this object.
+ */
+ virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override;
+
+ static void FillPropertyTable (
+ ::std::vector< css::beans::Property>& rProperties);
+
+ /**
+ * The same as getFastPropertyValue, but return the value through
+ * rValue and nHandle is always valid.
+ */
+ virtual void SAL_CALL getFastPropertyValue(
+ css::uno::Any& rValue,
+ sal_Int32 nHandle ) const override;
+
+ /** Convert the value rValue and return the result in rConvertedValue and the
+ old value in rOldValue.
+ After this call the vetoable listeners are notified.
+
+ @param rConvertedValue
+ The converted value. Only set if return is true.
+ @param rOldValue
+ The old value. Only set if return is true.
+ @param nHandle
+ The handle of the property.
+ @return
+ <TRUE/> if the value is converted successfully.
+ @throws IllegalArgumentException
+ */
+ virtual sal_Bool SAL_CALL convertFastPropertyValue(
+ css::uno::Any & rConvertedValue,
+ css::uno::Any & rOldValue,
+ sal_Int32 nHandle,
+ const css::uno::Any& rValue ) override;
+
+ /** The same as setFastPropertyValue, but no exception is thrown and nHandle
+ is always valid. You must not broadcast the changes in this method.
+ */
+ virtual void SAL_CALL setFastPropertyValue_NoBroadcast(
+ sal_Int32 nHandle,
+ const css::uno::Any& rValue ) override;
+
+ /** When the called object has been disposed already this method throws
+ a Disposed exception and does not return.
+
+ @throws css::lang::DisposedException
+ */
+ void ThrowIfDisposed() const;
+
+ using cppu::OPropertySetHelper::disposing;
+ using cppu::OPropertySetHelper::getFastPropertyValue;
+
+ css::uno::Reference< css::drawing::XLayer>* mpCurrentLayer;
+
+ const css::uno::Type m_aSelectionTypeIdentifier;
+
+ /** This pointer to the ViewShellBase can be NULL (after a call to
+ ReleaseViewShellBase()).
+ */
+ ViewShellBase* mpBase;
+
+ ::tools::Rectangle maLastVisArea;
+ ::unotools::WeakReference<SdPage> mpCurrentPage;
+ bool mbMasterPageMode;
+ bool mbLayerMode;
+
+ /** This flag indicates whether the called DrawController is being
+ disposed or already has been disposed.
+ */
+ bool mbDisposing;
+
+ ::std::unique_ptr< ::cppu::IPropertyArrayHelper> mpPropertyArrayHelper;
+
+ /** The current sub controller. May be NULL.
+ */
+ css::uno::Reference<css::drawing::XDrawSubController> mxSubController;
+
+ css::uno::Reference<
+ css::drawing::framework::XConfigurationController> mxConfigurationController;
+ css::uno::Reference<
+ css::drawing::framework::XModuleController> mxModuleController;
+
+ /** Send an event to all relevant property listeners that a
+ property has changed its value. The fire() method of the
+ OPropertySetHelper is wrapped by this method to handle
+ exceptions thrown by called listeners.
+ */
+ void FirePropertyChange (
+ sal_Int32 nHandle,
+ const css::uno::Any& rNewValue,
+ const css::uno::Any& rOldValue);
+
+ void ProvideFrameworkControllers();
+ void DisposeFrameworkControllers();
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/DrawDocShell.hxx b/sd/source/ui/inc/DrawDocShell.hxx
new file mode 100644
index 000000000..15fa5ebd4
--- /dev/null
+++ b/sd/source/ui/inc/DrawDocShell.hxx
@@ -0,0 +1,235 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <o3tl/span.hxx>
+#include <sfx2/docfac.hxx>
+#include <sfx2/objsh.hxx>
+#include <svl/style.hxx>
+
+#include <glob.hxx>
+#include <pres.hxx>
+#include <sddllapi.h>
+#include "fupoor.hxx"
+
+class FontList;
+class SdDrawDocument;
+class SdPage;
+class SfxPrinter;
+struct SpellCallbackInfo;
+class AbstractSvxNameDialog;
+class SfxUndoManager;
+
+namespace sd {
+
+class FrameView;
+class ViewShell;
+class DrawViewShell;
+
+// DrawDocShell
+class SD_DLLPUBLIC DrawDocShell : public SfxObjectShell
+{
+public:
+ SFX_DECL_INTERFACE(SD_IF_SDDRAWDOCSHELL)
+ SFX_DECL_OBJECTFACTORY();
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+public:
+ DrawDocShell (
+ SfxObjectCreateMode eMode,
+ bool bSdDataObj,
+ DocumentType);
+
+ DrawDocShell (
+ SfxModelFlags nModelCreationFlags,
+ bool bSdDataObj,
+ DocumentType);
+
+ DrawDocShell (
+ SdDrawDocument* pDoc,
+ SfxObjectCreateMode eMode,
+ bool bSdDataObj,
+ DocumentType);
+ virtual ~DrawDocShell() override;
+
+ void UpdateRefDevice();
+ virtual void Activate( bool bMDI ) override;
+ virtual void Deactivate( bool bMDI ) override;
+ virtual bool InitNew( const css::uno::Reference< css::embed::XStorage >& xStorage ) override;
+ virtual bool ImportFrom(SfxMedium &rMedium,
+ css::uno::Reference<css::text::XTextRange> const& xInsertPosition)
+ override;
+ virtual bool ConvertFrom( SfxMedium &rMedium ) override;
+ virtual bool Save() override;
+ virtual bool SaveAsOwnFormat( SfxMedium& rMedium ) override;
+ virtual bool ConvertTo( SfxMedium &rMedium ) override;
+ virtual bool SaveCompleted( const css::uno::Reference< css::embed::XStorage >& xStorage ) override;
+
+ virtual bool Load( SfxMedium &rMedium ) override;
+ virtual bool LoadFrom( SfxMedium& rMedium ) override;
+ virtual bool SaveAs( SfxMedium &rMedium ) override;
+
+ virtual ::tools::Rectangle GetVisArea(sal_uInt16 nAspect) const override;
+ virtual void Draw(OutputDevice*, const JobSetup& rSetup, sal_uInt16 nAspect) override;
+ virtual SfxUndoManager* GetUndoManager() override;
+ virtual Printer* GetDocumentPrinter() override;
+ virtual void OnDocumentPrinterChanged(Printer* pNewPrinter) override;
+ virtual SfxStyleSheetBasePool* GetStyleSheetPool() override;
+ virtual void FillClass(SvGlobalName* pClassName, SotClipboardFormatId* pFormat, OUString* pFullTypeName, sal_Int32 nFileFormat, bool bTemplate = false ) const override;
+ virtual void SetModified( bool = true ) override;
+ virtual std::shared_ptr<SfxDocumentInfoDialog> CreateDocumentInfoDialog(weld::Window* pParent,
+ const SfxItemSet &rSet) override;
+
+ using SfxObjectShell::GetVisArea;
+ using SfxShell::GetViewShell;
+
+ sd::ViewShell* GetViewShell() { return mpViewShell; }
+ ::sd::FrameView* GetFrameView();
+
+ SdDrawDocument* GetDoc() { return mpDoc;}
+ DocumentType GetDocumentType() const { return meDocType; }
+
+ SfxPrinter* GetPrinter(bool bCreate);
+ void SetPrinter(SfxPrinter *pNewPrinter);
+ void UpdateFontList();
+
+ bool IsInDestruction() const { return mbInDestruction; }
+
+ void CancelSearching();
+
+ void Execute( SfxRequest& rReq );
+ void GetState(SfxItemSet&);
+
+ void Connect(sd::ViewShell* pViewSh);
+ void Disconnect(sd::ViewShell const * pViewSh);
+ void UpdateTablePointers();
+
+ void GotoBookmark(std::u16string_view rBookmark);
+
+ BitmapEx GetPagePreviewBitmap(SdPage* pPage);
+
+ /** checks, if the given name is a valid new name for a slide
+
+ <p>If the name is invalid, an <type>SvxNameDialog</type> pops up that
+ queries again for a new name until it is ok or the user chose
+ Cancel.</p>
+
+ @param pWin is necessary to pass to the <type>SvxNameDialog</type> in
+ case an invalid name was entered.
+ @param rName the new name that is to be set for a slide. This string
+ may be set to an empty string (see below).
+
+ @return sal_True, if the new name is unique. Note that if the user entered
+ a default name of a not-yet-existing slide (e.g. 'Slide 17'),
+ sal_True is returned, but rName is set to an empty string.
+ */
+ bool CheckPageName(weld::Window* pWin, OUString& rName );
+
+ void SetSlotFilter(bool bEnable = false, o3tl::span<sal_uInt16 const> pSIDs = o3tl::span<sal_uInt16 const>()) { mbFilterEnable = bEnable; mpFilterSIDs = pSIDs; }
+ void ApplySlotFilter() const;
+
+ SfxStyleFamily GetStyleFamily() const { return mnStyleFamily; }
+ void SetStyleFamily( SfxStyleFamily nSF ) { mnStyleFamily = nSF; }
+
+ /** executes the SID_OPENDOC slot to let the framework open a document
+ with the given URL and this document as a referer */
+ void OpenBookmark( const OUString& rBookmarkURL );
+
+ /** checks, if the given name is a valid new name for a slide
+
+ <p>This method does not pop up any dialog (like CheckPageName).</p>
+
+ @param rInOutPageName the new name for a slide that is to be renamed.
+ This string will be set to an empty string if
+ bResetStringIfStandardName is true and the name is of the
+ form of any, possibly not-yet existing, standard slide
+ (e.g. 'Slide 17')
+
+ @param bResetStringIfStandardName if true allows setting rInOutPageName
+ to an empty string, which returns true and implies that the
+ slide will later on get a new standard name (with a free
+ slide number).
+
+ @return true, if the new name is unique. If bResetStringIfStandardName
+ is true, the return value is also true, if the slide name is
+ a standard name (see above)
+ */
+ bool IsNewPageNameValid( OUString & rInOutPageName, bool bResetStringIfStandardName = false );
+
+ /** checks, if the given name is a *unique* name for an *existing* slide
+
+ @param rPageName the name of an existing slide
+
+ @return true, if the name is unique and the slide exists
+ */
+ bool IsPageNameUnique(std::u16string_view rPagName) const;
+
+ /** Return the reference device for the current document. When the
+ inherited implementation returns a device then this is passed to the
+ caller. Otherwise the returned value depends on the printer
+ independent layout mode and will usually be either a printer or a
+ virtual device used for screen rendering.
+ @return
+ Returns NULL when the current document has no reference device.
+ */
+ virtual OutputDevice* GetDocumentRefDev() override;
+
+ DECL_DLLPRIVATE_LINK( RenameSlideHdl, AbstractSvxNameDialog&, bool );
+
+ // ExecuteSpellPopup now handled by DrawDocShell
+ DECL_DLLPRIVATE_LINK( OnlineSpellCallback, SpellCallbackInfo&, void );
+
+ void ClearUndoBuffer();
+
+ std::vector<Color> GetThemeColors() override;
+
+protected:
+
+ SdDrawDocument* mpDoc;
+ std::unique_ptr<SfxUndoManager> mpUndoManager;
+ VclPtr<SfxPrinter> mpPrinter;
+ ::sd::ViewShell* mpViewShell;
+ std::unique_ptr<FontList> mpFontList;
+ DocumentType meDocType;
+ SfxStyleFamily mnStyleFamily;
+ o3tl::span<sal_uInt16 const>
+ mpFilterSIDs;
+ bool mbFilterEnable;
+ bool mbSdDataObj;
+ bool mbInDestruction;
+ bool mbOwnPrinter;
+
+ bool mbOwnDocument; // if true, we own mpDoc and will delete it in our d'tor
+ void Construct(bool bClipboard);
+private:
+ static void setEditMode(DrawViewShell* pDrawViewShell, bool isMasterPage);
+};
+
+#ifndef SV_DECL_DRAW_DOC_SHELL_DEFINED
+#define SV_DECL_DRAW_DOC_SHELL_DEFINED
+typedef ::tools::SvRef<DrawDocShell> DrawDocShellRef;
+#endif
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/DrawSubController.hxx b/sd/source/ui/inc/DrawSubController.hxx
new file mode 100644
index 000000000..d748d6378
--- /dev/null
+++ b/sd/source/ui/inc/DrawSubController.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/XDrawSubController.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <cppuhelper/compbase.hxx>
+
+namespace sd {
+
+ class DrawSubControllerInterfaceBase : public ::cppu::WeakComponentImplHelper<
+ css::drawing::XDrawSubController,
+ css::lang::XServiceInfo >
+ {
+ public:
+ DrawSubControllerInterfaceBase( ::osl::Mutex& aMutex )
+ : ::cppu::WeakComponentImplHelper<
+ css::drawing::XDrawSubController,
+ css::lang::XServiceInfo >( aMutex ) {}
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName( ) override = 0;
+ virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override = 0;
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override = 0;
+ };
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/DrawViewShell.hxx b/sd/source/ui/inc/DrawViewShell.hxx
new file mode 100644
index 000000000..c56a0f33e
--- /dev/null
+++ b/sd/source/ui/inc/DrawViewShell.hxx
@@ -0,0 +1,513 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include "ViewShell.hxx"
+#include "tools/AsynchronousCall.hxx"
+#include "TabControl.hxx"
+#include <glob.hxx>
+#include <pres.hxx>
+#include <unotools/caserotate.hxx>
+#include <unotools/options.hxx>
+#include <sddllapi.h>
+
+namespace svx::sidebar { class SelectionChangeHandler; }
+namespace com::sun::star::lang { class XEventListener; }
+namespace com::sun::star::scanner { class XScannerManager2; }
+
+class Outliner;
+class SdPage;
+class SdStyleSheet;
+class SdrExternalToolEdit;
+class TabBar;
+class SdrObject;
+class SdrPageView;
+class TransferableDataHelper;
+class TransferableClipboardListener;
+class AbstractSvxNameDialog;
+class SdrLayer;
+class SvxClipboardFormatItem;
+struct ESelection;
+class AbstractSvxObjectNameDialog;
+
+namespace sd {
+
+class DrawView;
+class LayerTabBar;
+class Ruler;
+class AnnotationManager;
+class ViewOverlayManager;
+
+#define CHECK_RANGE(nMin, nValue, nMax) ((nValue >= nMin) && (nValue <= nMax))
+
+/** Base class of the stacked shells that provide graphical views to
+ Draw and Impress documents and editing functionality. In contrast
+ to this other stacked shells are responsible for showing an
+ overview over several slides or a textual
+ overview over the text in an Impress document (OutlineViewShell).
+*/
+class SAL_DLLPUBLIC_RTTI DrawViewShell
+ : public ViewShell,
+ public SfxListener,
+ public utl::ConfigurationListener
+{
+public:
+ SFX_DECL_INTERFACE(SD_IF_SDDRAWVIEWSHELL)
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+public:
+ /** Create a new stackable shell that may take some information
+ (e.g. the frame view) from the given previous shell.
+ @param ePageKind
+ This parameter gives the initial page kind that the new shell
+ will show.
+ @param pFrameView
+ The frame view that makes it possible to pass information from
+ one view shell to the next.
+ */
+ DrawViewShell (
+ ViewShellBase& rViewShellBase,
+ vcl::Window* pParentWindow,
+ PageKind ePageKind,
+ FrameView* pFrameView);
+
+ virtual ~DrawViewShell() override;
+
+ virtual void Init (bool bIsMainViewShell) override;
+
+ virtual void Shutdown() override;
+
+ void PrePaint() override;
+ virtual void Paint(const ::tools::Rectangle& rRect, ::sd::Window* pWin) override;
+
+ /** Arrange and resize the GUI elements like rulers, sliders, and
+ buttons as well as the actual document view according to the size of
+ the enclosing window and current sizes of buttons, rulers, and
+ sliders.
+ */
+ virtual void ArrangeGUIElements() override;
+
+ void HidePage();
+
+ virtual bool KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin) override;
+ virtual void MouseMove(const MouseEvent& rMEvt, ::sd::Window* pWin) override;
+ virtual void MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin) override;
+ virtual void MouseButtonDown(const MouseEvent& rMEvt, ::sd::Window* pWin) override;
+ virtual void Command(const CommandEvent& rCEvt, ::sd::Window* pWin) override;
+ bool IsMouseButtonDown() const { return mbMouseButtonDown; }
+ bool IsMouseSelecting() const { return mbMouseSelecting; }
+
+ virtual void Resize() override;
+
+ void ShowMousePosInfo(const ::tools::Rectangle& rRect, ::sd::Window const * pWin);
+
+ virtual void ChangeEditMode (EditMode eMode, bool bIsLayerModeActive);
+
+ virtual void SetZoom( ::tools::Long nZoom ) override;
+ virtual void SetZoomRect( const ::tools::Rectangle& rZoomRect ) override;
+
+ void InsertURLField(const OUString& rURL, const OUString& rText, const OUString& rTarget);
+ void InsertURLButton(const OUString& rURL, const OUString& rText, const OUString& rTarget,
+ const Point* pPos);
+
+ void SelectionHasChanged();
+ void ModelHasChanged();
+ virtual void Activate(bool bIsMDIActivate) override;
+ virtual void Deactivate(bool IsMDIActivate) override;
+ virtual void UIActivating( SfxInPlaceClient* ) override;
+ virtual void UIDeactivated( SfxInPlaceClient* ) override;
+ OUString GetSelectionText( bool bCompleteWords );
+ bool HasSelection( bool bText ) const;
+
+ //If we are editing a PresObjKind::Outline return the Outliner and fill rSel
+ //with the current selection
+ ::Outliner* GetOutlinerForMasterPageOutlineTextObj(ESelection &rSel);
+
+ void ExecCtrl(SfxRequest& rReq);
+ void GetCtrlState(SfxItemSet& rSet);
+ void GetDrawAttrState(SfxItemSet& rSet);
+ void GetMenuState(SfxItemSet& rSet);
+ void GetTableMenuState(SfxItemSet& rSet);
+ /** Set the items of the given item set that are related to
+ switching the editing mode to the correct values.
+ <p>This function also sets the states of the mode buttons
+ (those at the upper right corner) accordingly.</p>
+ */
+ void GetModeSwitchingMenuState (SfxItemSet &rSet);
+ void GetAttrState(SfxItemSet& rSet);
+ void GetSnapItemState(SfxItemSet& rSet);
+
+ void SetPageProperties (SfxRequest& rReq);
+ void GetPageProperties(SfxItemSet& rSet);
+ void GetMarginProperties(SfxItemSet& rSet);
+
+ void GetState (SfxItemSet& rSet);
+ void Execute (SfxRequest& rReq);
+
+ void ExecStatusBar(SfxRequest& rReq);
+ void GetStatusBarState(SfxItemSet& rSet);
+
+ void ExecOptionsBar(SfxRequest& rReq);
+ void GetOptionsBarState(SfxItemSet& rSet);
+
+ void ExecRuler(SfxRequest& rReq);
+ void GetRulerState(SfxItemSet& rSet);
+
+ void ExecFormText(SfxRequest& rReq);
+ void GetFormTextState(SfxItemSet& rSet);
+
+ void ExecAnimationWin(SfxRequest& rReq);
+ void GetAnimationWinState(SfxItemSet& rSet);
+
+ void ExecNavigatorWin(SfxRequest& rReq);
+ void GetNavigatorWinState(SfxItemSet& rSet);
+
+ void ExecutePropPanelAttr (SfxRequest const & rReq);
+ void GetStatePropPanelAttr(SfxItemSet& rSet);
+
+ void ExecEffectWin(SfxRequest& rReq);
+
+ void Update3DWindow();
+ void AssignFrom3DWindow();
+
+ void ExecGallery(SfxRequest const & rReq);
+
+ void ExecBmpMask( SfxRequest const & rReq );
+ void GetBmpMaskState( SfxItemSet& rSet );
+
+ void ExecIMap( SfxRequest const & rReq );
+ void GetIMapState( SfxItemSet& rSet );
+
+ void FuTemporary(SfxRequest& rReq);
+ void FuPermanent(SfxRequest& rReq);
+ void FuSupport(SfxRequest& rReq);
+ void FuDeleteSelectedObjects();
+ void FuSupportRotate(SfxRequest const & rReq);
+ void FuTable(SfxRequest& rReq);
+
+ void AttrExec (SfxRequest& rReq);
+ void AttrState (SfxItemSet& rSet);
+
+ void ExecGoToNextPage (SfxRequest& rReq);
+ void GetStateGoToNextPage (SfxItemSet& rSet);
+
+ void ExecGoToPreviousPage (SfxRequest& rReq);
+ void GetStateGoToPreviousPage (SfxItemSet& rSet);
+
+ void ExecGoToFirstPage (SfxRequest& rReq);
+ void GetStateGoToFirstPage (SfxItemSet& rSet);
+
+ void ExecGoToLastPage (SfxRequest& rReq);
+ void GetStateGoToLastPage (SfxItemSet& rSet);
+
+ SD_DLLPUBLIC void ExecChar(SfxRequest& rReq);
+
+ void ExecuteAnnotation (SfxRequest const & rRequest);
+ void GetAnnotationState (SfxItemSet& rItemSet);
+
+ void StartRulerDrag (const Ruler& rRuler, const MouseEvent& rMEvt);
+
+ virtual bool PrepareClose( bool bUI = true ) override;
+
+ PageKind GetPageKind() const { return mePageKind; }
+ void SetPageKind( PageKind ePageKind ) { mePageKind = ePageKind; }
+ const Point& GetMousePos() const { return maMousePos; }
+
+ EditMode GetEditMode() const { return meEditMode; }
+ virtual SdPage* GetActualPage() override { return mpActualPage; }
+
+ /// inherited from sd::ViewShell
+ virtual SdPage* getCurrentPage() const override;
+
+ void ResetActualPage();
+ void ResetActualLayer();
+ bool SwitchPage(sal_uInt16 nPage, bool bAllowChangeFocus = true);
+ bool IsSwitchPageAllowed() const;
+
+ /**
+ * Mark the desired page as selected (1), deselected (0), toggle (2).
+ * nPage refers to the page in question.
+ */
+ bool SelectPage(sal_uInt16 nPage, sal_uInt16 nSelect);
+ bool IsSelected(sal_uInt16 nPage);
+ bool IsVisible(sal_uInt16 nPage);
+
+ void GotoBookmark(std::u16string_view rBookmark);
+ //Realize multi-selection of objects, If object is marked, the
+ //corresponding entry is set true, else the corresponding entry is set
+ //false.
+ void FreshNavigatrTree();
+ void MakeVisible(const ::tools::Rectangle& rRect, vcl::Window& rWin);
+
+ virtual void ReadFrameViewData(FrameView* pView) override;
+ virtual void WriteFrameViewData() override;
+
+ virtual ErrCode DoVerb(sal_Int32 nVerb) override;
+ virtual bool ActivateObject(SdrOle2Obj* pObj, sal_Int32 nVerb) override;
+
+ void SetZoomOnPage( bool bZoom ) { mbZoomOnPage = bZoom; }
+ bool IsZoomOnPage() const { return mbZoomOnPage; }
+ static void CheckLineTo (SfxRequest& rReq);
+ void SetChildWindowState( SfxItemSet& rSet );
+
+ void UpdateIMapDlg( SdrObject* pObj );
+
+ void LockInput();
+ void UnlockInput();
+ bool IsInputLocked() const { return mnLockCount > 0; }
+
+ sal_uInt16 GetCurPagePos() const { return maTabControl->GetCurPagePos(); }
+
+ /** Show controls of the UI or hide them, depending on the given flag.
+ Do not call this method directly. Call the method at ViewShellBase
+ instead.
+ */
+ virtual void ShowUIControls (bool bVisible) override;
+
+ void ScannerEvent();
+
+ bool IsLayerModeActive() const { return mbIsLayerModeActive;}
+
+ virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt, DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow, sal_uInt16 nPage, SdrLayerID nLayer ) override;
+ virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt, DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow, sal_uInt16 nPage, SdrLayerID nLayer ) override;
+
+ virtual void WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& ) override;
+ virtual void ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& ) override;
+
+ virtual void VisAreaChanged(const ::tools::Rectangle& rRect) override;
+
+ /** Create an accessible object representing the specified window.
+ @param pWindow
+ The returned object makes the document displayed in this window
+ accessible.
+ @return
+ Returns an <type>AccessibleDrawDocumentView</type> object.
+ */
+ virtual css::uno::Reference<css::accessibility::XAccessible>
+ CreateAccessibleDocumentView (::sd::Window* pWindow) override;
+
+ /** Return the number of layers managed by the layer tab control. This
+ will usually differ from the number of layers managed by the layer
+ administrator.
+ @return
+ The number of layers managed by the layer tab control. The
+ returned value is independent of whether the layer mode is
+ currently active and the tab control is visible.
+ */
+ int GetTabLayerCount() const;
+
+ /** Return the numerical id of the currently active layer as seen by the
+ layer tab control.
+ @return
+ The returned id is a number between zero (inclusive) and the
+ number of layers as returned by the
+ <member>GetTabLayerCount</member> method (exclusive).
+ */
+ int GetActiveTabLayerIndex() const;
+
+ /** Set the active layer at the layer tab control and update the control
+ accordingly to reflect the change on screen.
+ @param nId
+ The id is expected to be a number between zero (inclusive) and
+ the number of layers as returned by the
+ <member>GetTabLayerCount</member> method (exclusive). Note that
+ Invalid values are ignored. No exception is thrown in that case.
+ */
+ void SetActiveTabLayerIndex (int nId);
+
+ /** Return a pointer to the tab control for pages.
+ */
+ TabControl& GetPageTabControl() { return *maTabControl; }
+
+ /** Return a pointer to the tab control for layers.
+ */
+ SD_DLLPUBLIC LayerTabBar* GetLayerTabControl(); // export for unit test
+
+ /** Renames the given slide using an SvxNameDialog
+
+ @param nPageId the index of the page in the SdTabControl.
+ @param rName the new name of the slide.
+
+ @return false, if the new name is invalid for some reason.
+
+ <p>Implemented in <code>drviews8.cxx</code>.</p>
+ */
+ bool RenameSlide( sal_uInt16 nPageId, const OUString & rName );
+
+ /** modifies the given layer with the given values */
+ void ModifyLayer( SdrLayer* pLayer, const OUString& rLayerName, const OUString& rLayerTitle, const OUString& rLayerDesc, bool bIsVisible, bool bIsLocked, bool bIsPrintable );
+
+ virtual css::uno::Reference<css::drawing::XDrawSubController> CreateSubController() override;
+
+ DrawView* GetDrawView() const { return mpDrawView.get(); }
+
+ /** Relocation to a new parent window is not supported for DrawViewShell
+ objects so this method always returns <FALSE/>.
+ */
+ virtual bool RelocateToParentWindow (vcl::Window* pParentWindow) override;
+
+ OUString const & GetSidebarContextName() const;
+
+ bool IsInSwitchPage() const { return mbIsInSwitchPage; }
+
+ //move this method to ViewShell.
+ //void NotifyAccUpdate();
+protected:
+ std::unique_ptr<DrawView> mpDrawView;
+ SdPage* mpActualPage;
+ ::tools::Rectangle maMarkRect;
+ Point maMousePos;
+ VclPtr<TabControl> maTabControl;
+ EditMode meEditMode;
+ PageKind mePageKind;
+ // tdf#137445 at context menu popup time set if the EditHyperlink entry
+ // should be disabled and use that state if queried about it if
+ // EditHyperlink is dispatched from the menu. So ignoring where the mouse
+ // currently happens to be when the menu was dismissed.
+ std::optional<bool> moAtContextMenu_DisableEditHyperlink;
+ bool mbZoomOnPage;
+ bool mbIsRulerDrag;
+ sal_uLong mnLockCount;
+ bool mbReadOnly;
+ static bool mbPipette;
+
+ DECL_DLLPRIVATE_LINK( ClipboardChanged, TransferableDataHelper*, void );
+ DECL_DLLPRIVATE_LINK( TabSplitHdl, TabBar *, void );
+ DECL_DLLPRIVATE_LINK( NameObjectHdl, AbstractSvxObjectNameDialog&, bool );
+ DECL_DLLPRIVATE_LINK( RenameSlideHdl, AbstractSvxNameDialog&, bool );
+
+ void DeleteActualPage();
+ void DeleteActualLayer();
+
+ virtual VclPtr<SvxRuler> CreateHRuler(::sd::Window* pWin) override;
+ virtual VclPtr<SvxRuler> CreateVRuler(::sd::Window* pWin) override;
+ virtual void UpdateHRuler() override;
+ virtual void UpdateVRuler() override;
+ virtual void SetZoomFactor(const Fraction& rZoomX, const Fraction& rZoomY) override;
+
+ void SetupPage( Size const &rSize, ::tools::Long nLeft, ::tools::Long nRight, ::tools::Long nUpper, ::tools::Long nLower,
+ bool bSize, bool bMargin, bool bScaleAll );
+
+ void GetMenuStateSel(SfxItemSet& rSet);
+
+private:
+ /** This flag controls whether the layer mode is active, i.e. the layer
+ dialog is visible.
+ */
+ bool mbIsLayerModeActive;
+
+ /** This item contains the clipboard formats of the current clipboard
+ content that are supported both by that content and by the
+ DrawViewShell.
+ */
+ ::std::unique_ptr<SvxClipboardFormatItem> mpCurrentClipboardFormats;
+
+ /** On some occasions it is necessary to make SwitchPage calls
+ asynchronously.
+ */
+ tools::AsynchronousCall maAsynchronousSwitchPageCall;
+
+ /** This flag is used to prevent nested calls to SwitchPage().
+ */
+ bool mbIsInSwitchPage;
+
+ RotateTransliteration m_aRotateCase;
+
+ /** Listen for selection changes and broadcast context changes for the sidebar.
+ */
+ ::rtl::Reference<svx::sidebar::SelectionChangeHandler> mpSelectionChangeHandler;
+
+ void Construct (DrawDocShell* pDocSh, PageKind ePageKind);
+
+ /** Depending on the given request create a new page or duplicate an
+ existing one. See ViewShell::CreateOrDuplicatePage() for more
+ information.
+ */
+ virtual SdPage* CreateOrDuplicatePage (
+ SfxRequest& rRequest,
+ PageKind ePageKind,
+ SdPage* pPage,
+ const sal_Int32 nInsertPosition = -1) override;
+
+ void DuplicateSelectedSlides (SfxRequest& rRequest);
+
+ css::uno::Reference< css::scanner::XScannerManager2 > mxScannerManager;
+ css::uno::Reference< css::lang::XEventListener > mxScannerListener;
+ rtl::Reference<TransferableClipboardListener> mxClipEvtLstnr;
+ bool mbPastePossible;
+ bool mbMouseButtonDown;
+ bool mbMouseSelecting;
+
+ virtual void Notify (SfxBroadcaster& rBC, const SfxHint& rHint) override;
+
+ /** Stop a running slide show.
+ */
+ void StopSlideShow();
+
+ /** Show the context menu for snap lines and points. Because snap lines
+ can not be selected the index of the snap line/point for which the
+ popup menu is opened has to be passed to the processing slot
+ handlers. This can be done only by manually showing the popup menu.
+ @param pParent
+ The parent for the context menu.
+ @param rRect
+ The location at which to display the context menu.
+ @param rPageView
+ The page view is used to access the help lines.
+ @param nSnapLineIndex
+ Index of the snap line or snap point for which to show the
+ context menu.
+ */
+ void ShowSnapLineContextMenu(weld::Window* pParent, const ::tools::Rectangle& rRect,
+ SdrPageView& rPageView, const sal_uInt16 nSnapLineIndex);
+
+ using ViewShell::Notify;
+
+ ::std::unique_ptr< AnnotationManager > mpAnnotationManager;
+ ::std::unique_ptr< ViewOverlayManager > mpViewOverlayManager;
+
+ std::vector<std::unique_ptr<SdrExternalToolEdit>> m_ExternalEdits;
+
+ virtual void ConfigurationChanged( utl::ConfigurationBroadcaster* pCb, ConfigurationHints ) override;
+
+ void ConfigureAppBackgroundColor( svtools::ColorConfig* pColorConfig = nullptr );
+
+ /// return true if "Edit Hyperlink" in context menu should be disabled
+ bool ShouldDisableEditHyperlink() const;
+ /// force "Edit Hyperlink" to true, with the expectation that SID_EDIT_HYPERLINK is
+ /// later Invalidated to reset it back to its natural value
+ void EnableEditHyperlink();
+
+ // The colour of the area behind the slide (used to be called "Wiese")
+ Color mnAppBackgroundColor;
+};
+
+ /// Merge the background properties together and deposit the result in rMergeAttr
+ void MergePageBackgroundFilling(SdPage *pPage, SdStyleSheet *pStyleSheet, bool bMasterPage, SfxItemSet& rMergedAttr);
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/EventMultiplexer.hxx b/sd/source/ui/inc/EventMultiplexer.hxx
new file mode 100644
index 000000000..d6d79d11b
--- /dev/null
+++ b/sd/source/ui/inc/EventMultiplexer.hxx
@@ -0,0 +1,172 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <rtl/ref.hxx>
+
+template <typename Arg, typename Ret> class Link;
+
+namespace sd
+{
+class ViewShellBase;
+}
+
+enum class EventMultiplexerEventId
+{
+ /** The EventMultiplexer itself is being disposed. Called for a live
+ EventMultiplexer. Removing a listener as response is not necessary,
+ though.
+ */
+ Disposing,
+
+ /** The selection in the center pane has changed.
+ */
+ EditViewSelection,
+
+ /** The selection in the slide sorter has changed, regardless of whether
+ the slide sorter is displayed in the left pane or the center pane.
+ */
+ SlideSortedSelection,
+
+ /** The current page has changed.
+ */
+ CurrentPageChanged,
+
+ /** The current MainViewShell (the ViewShell displayed in the center
+ pane) has been removed.
+ */
+ MainViewRemoved,
+
+ /** A new ViewShell has been made the MainViewShell.
+ */
+ MainViewAdded,
+
+ /** A new ViewShell is being displayed in one of the panes. Note that
+ for the ViewShell in the center pane both this event type and
+ EventId::MainViewAdded is broadcasted.
+ */
+ ViewAdded,
+
+ /** Edit mode was (or is being) switched to normal mode. Find
+ EventId::EditModeMaster below.
+ */
+ EditModeNormal,
+
+ /** One or more pages have been inserted into or deleted from the model.
+ */
+ PageOrder,
+
+ /** Text editing in one of the shapes in the MainViewShell has started.
+ */
+ BeginTextEdit,
+
+ /** Text editing in one of the shapes in the MainViewShell has ended.
+ */
+ EndTextEdit,
+
+ /** A UNO controller has been attached to the UNO frame.
+ */
+ ControllerAttached,
+
+ /** A UNO controller has been detached to the UNO frame.
+ */
+ ControllerDetached,
+
+ /** The state of a shape has changed. The page is available in the user data.
+ */
+ ShapeChanged,
+
+ /** A shape has been inserted to a page. The page is available in the
+ user data.
+ */
+ ShapeInserted,
+
+ /** A shape has been removed from a page. The page is available in the
+ user data.
+ */
+ ShapeRemoved,
+
+ /** A configuration update has been completed.
+ */
+ ConfigurationUpdated,
+
+ /** Edit mode was (or is being) switched to master mode.
+ */
+ EditModeMaster,
+};
+
+namespace sd::tools
+{
+class EventMultiplexerEvent
+{
+public:
+ EventMultiplexerEventId meEventId;
+ const void* mpUserData;
+
+ EventMultiplexerEvent(EventMultiplexerEventId eEventId, const void* pUserData);
+};
+
+/** This convenience class makes it easy to listen to various events that
+ originally are broadcasted via different channels.
+
+ There is usually one EventMultiplexer instance per ViewShellBase().
+ Call the laters GetEventMultiplexer() method to get access to that
+ instance.
+*/
+class EventMultiplexer
+{
+public:
+ /** Create new EventMultiplexer for the given ViewShellBase object.
+ */
+ EventMultiplexer(ViewShellBase& rBase);
+ ~EventMultiplexer();
+
+ /** Add an event listener that will be informed about the specified
+ event types.
+ @param rCallback
+ The callback to call as soon as one of the event specified by
+ aEventTypeSet is received by the EventMultiplexer.
+ */
+ void AddEventListener(const Link<EventMultiplexerEvent&, void>& rCallback);
+
+ /** Remove an event listener for the specified event types.
+ */
+ void RemoveEventListener(const Link<EventMultiplexerEvent&, void>& rCallback);
+
+ /** This method is used for out-of-line events. An event of the
+ specified type will be sent to all listeners that are registered for
+ that type.
+ @param eEventId
+ The type of the event.
+ @param pUserData
+ Some data sent to the listeners along with the event.
+ */
+ void MultiplexEvent(EventMultiplexerEventId eEventId, void const* pUserData);
+
+private:
+ class Implementation;
+ rtl::Reference<Implementation> mpImpl;
+};
+
+} // end of namespace ::sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/FormShellManager.hxx b/sd/source/ui/inc/FormShellManager.hxx
new file mode 100644
index 000000000..b2c03b3de
--- /dev/null
+++ b/sd/source/ui/inc/FormShellManager.hxx
@@ -0,0 +1,139 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "ViewShellManager.hxx"
+
+#include <tools/link.hxx>
+#include <svl/lstner.hxx>
+#include <vcl/vclptr.hxx>
+
+class VclWindowEvent;
+class FmFormShell;
+namespace vcl
+{
+class Window;
+}
+
+namespace sd::tools
+{
+class EventMultiplexerEvent;
+}
+
+namespace sd
+{
+class ViewShellBase;
+
+/** This simple class is responsible for putting the form shell above or
+ below the main view shell on the shell stack maintained by the ObjectBarManager.
+
+ The form shell is moved above the view shell when the form shell is
+ activated, i.e. the FormControlActivated handler is called.
+
+ It is moved below the view shell when the main window of the
+ main view shell is focused.
+
+ The form shell is created and destroyed by the ViewShellManager by using
+ a factory object provided by the FormShellManager.
+*/
+class FormShellManager : public SfxListener
+{
+public:
+ FormShellManager(ViewShellBase& rBase);
+ virtual ~FormShellManager() override;
+
+ /** Typically called by a ShellFactory. It tells the
+ FormShellManager which form shell to manage.
+ @param pFormShell
+ This may be <NULL/> to disconnect the ViewShellManager from the
+ form shell.
+ */
+ void SetFormShell(FmFormShell* pFormShell);
+
+ /** Return the form shell last set with SetFormShell().
+ @return
+ The result may be <NULL/> when the SetFormShell() method has not
+ yet been called or was last called with <NULL/>.
+ */
+ FmFormShell* GetFormShell() { return mpFormShell; }
+
+private:
+ ViewShellBase& mrBase;
+
+ /** Ownership of the form shell lies with the ViewShellManager. This
+ reference is kept so that the FormShellManager can detect when a new
+ form shell is passed to SetFormShell().
+ */
+ FmFormShell* mpFormShell;
+
+ /** Remember whether the form shell is currently above or below the main
+ view shell.
+ */
+ bool mbFormShellAboveViewShell;
+
+ /** The factory is remembered so that it removed from the
+ ViewShellManager when the FormShellManager is destroyed.
+ */
+ ViewShellManager::SharedShellFactory mpSubShellFactory;
+
+ bool mbIsMainViewChangePending;
+
+ VclPtr<vcl::Window> mpMainViewShellWindow;
+
+ /** Register at window of center pane and at the form shell that
+ represents the form tool bar. The former informs this manager about
+ the deselection of the form shell. The later informs about its
+ selection.
+ */
+ void RegisterAtCenterPane();
+
+ /** Unregister the listeners that were registered in
+ RegisterAtCenterPane().
+ */
+ void UnregisterAtCenterPane();
+
+ /** This call back is called by the application window (among others)
+ when the window gets the focus. In this case the form shell is
+ moved to the bottom of the shell stack.
+ */
+ DECL_LINK(WindowEventHandler, VclWindowEvent&, void);
+
+ /** This call back is called when view in the center pane is replaced.
+ When this happens then we unregister at the window of the old and
+ register at the window of the new shell.
+ */
+ DECL_LINK(ConfigurationUpdateHandler, ::sd::tools::EventMultiplexerEvent&, void);
+
+ /** This call back is called by the form shell when it gets the focus.
+ In this case the form shell is moved to the top of the shell stack.
+ */
+ DECL_LINK(FormControlActivated, LinkParamNone*, void);
+
+ /** This method is called by the form shell when that is destroyed. It
+ acts as a last resort against referencing a dead form shell. With
+ the factory working properly this method should not be necessary
+ (and may be removed in the future.)
+ */
+ virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/FrameView.hxx b/sd/source/ui/inc/FrameView.hxx
new file mode 100644
index 000000000..8226746a3
--- /dev/null
+++ b/sd/source/ui/inc/FrameView.hxx
@@ -0,0 +1,213 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "ViewShell.hxx"
+#include <svx/svdview.hxx>
+#include <pres.hxx>
+
+class SdDrawDocument;
+class SdOptions;
+
+namespace sd {
+
+/**
+ * View for MDIFrame
+ */
+class SD_DLLPUBLIC FrameView
+ : public SdrView
+{
+public:
+ FrameView(SdDrawDocument* pDrawDoc, FrameView* pFrameView = nullptr );
+ FrameView(const FrameView& rFrameView);
+ virtual ~FrameView() override;
+
+ void Connect();
+ void Disconnect();
+
+ void Update(SdOptions const * pOptions);
+
+ void SetStandardHelpLines(const SdrHelpLineList& rHelpLines)
+ { maStandardHelpLines = rHelpLines; }
+ const SdrHelpLineList& GetStandardHelpLines() const { return maStandardHelpLines; }
+ void SetNotesHelpLines(const SdrHelpLineList& rHelpLines)
+ { maNotesHelpLines = rHelpLines; }
+ const SdrHelpLineList& GetNotesHelpLines() const { return maNotesHelpLines; }
+ void SetHandoutHelpLines(const SdrHelpLineList& rHelpLines)
+ { maHandoutHelpLines = rHelpLines; }
+ const SdrHelpLineList& GetHandoutHelpLines() const { return maHandoutHelpLines; }
+
+ void SetVisibleLayers(const SdrLayerIDSet& rVisibleLayers)
+ { maVisibleLayers = rVisibleLayers; }
+ const SdrLayerIDSet& GetVisibleLayers() const { return maVisibleLayers; }
+
+ void SetLockedLayers(const SdrLayerIDSet& rLockedLayers)
+ { maLockedLayers = rLockedLayers; }
+ const SdrLayerIDSet& GetLockedLayers() const { return maLockedLayers; }
+
+ void SetPrintableLayers(const SdrLayerIDSet& rPrintableLayers)
+ { maPrintableLayers = rPrintableLayers; }
+ const SdrLayerIDSet& GetPrintableLayers() const { return maPrintableLayers; }
+
+ void SetRuler(const bool bRulerOn)
+ { mbRuler = bRulerOn; }
+ bool HasRuler() const { return mbRuler; }
+
+ void SetNoColors(const bool bNoCol)
+ { mbNoColors = bNoCol; }
+ bool IsNoColors() const { return mbNoColors; }
+
+ void SetNoAttribs(const bool bNoAttr)
+ { mbNoAttribs = bNoAttr; }
+ bool IsNoAttribs() const { return mbNoAttribs; }
+
+ void SetVisArea(const ::tools::Rectangle& rVisArea)
+ { maVisArea = rVisArea; }
+ const ::tools::Rectangle& GetVisArea() const { return maVisArea; }
+
+ void SetPageKind(PageKind eKind) { mePageKind = eKind; }
+ PageKind GetPageKind() const { return mePageKind; }
+
+ /** is used in FrameView::ReadUserDataSequence() only to store the
+ page kind that was selected while last saving this document */
+ void SetPageKindOnLoad(PageKind eKind) { mePageKindOnLoad = eKind; }
+
+ /** can be used to get the page kind that was selected on last save of this document */
+ PageKind GetPageKindOnLoad() const { return mePageKindOnLoad; }
+
+ void SetSelectedPage (sal_uInt16 nPage);
+ sal_uInt16 GetSelectedPage () const { return mnSelectedPage;}
+
+ /** is used in FrameView::ReadUserDataSequence() only to store the
+ page that was selected while last saving this document */
+ void SetSelectedPageOnLoad (sal_uInt16 nPage) { mnSelectedPageOnLoad = nPage; }
+
+ /** can be used to get the page that was selected on last save of this document */
+ sal_uInt16 GetSelectedPageOnLoad () const { return mnSelectedPageOnLoad; }
+
+ void SetViewShEditMode(EditMode eMode);
+ EditMode GetViewShEditMode () const;
+
+ /** Remember the edit mode of the main view shell at the time when the
+ document is loaded.
+ */
+ void SetViewShEditModeOnLoad (const EditMode eMode);
+
+ /** Return the value of the edit mode as it was when the document was
+ loaded.
+ */
+ EditMode GetViewShEditModeOnLoad() const { return meEditModeOnLoad;}
+
+ void SetLayerMode(bool bMode)
+ { mbLayerMode = bMode; }
+ bool IsLayerMode() const { return mbLayerMode; }
+
+ void SetQuickEdit(bool bQEdit)
+ { mbQuickEdit = bQEdit; }
+ bool IsQuickEdit() const { return mbQuickEdit; }
+
+ void SetDoubleClickTextEdit( bool bOn ) { mbDoubleClickTextEdit = bOn; }
+ bool IsDoubleClickTextEdit() const { return mbDoubleClickTextEdit; }
+
+ void SetClickChangeRotation( bool bOn ) { mbClickChangeRotation = bOn; }
+ bool IsClickChangeRotation() const { return mbClickChangeRotation; }
+
+ /** Remember the type of the view shell that was (or soon will be)
+ previously associated with this frame view.
+ @param eType
+ The type of the previous view shell or ViewShell::ST_NONE to
+ indicate that there is no previous view shell.
+ */
+ void SetPreviousViewShellType (ViewShell::ShellType eType);
+
+ /** Return the type of the view shell previously associated with this
+ frame view.
+ */
+ ViewShell::ShellType GetPreviousViewShellType() const { return mePreviousViewShellType;}
+
+ /** Remember the type of the view shell at the time when the document is
+ loaded or, rather, when the ViewShellBase is constructed.
+ */
+ void SetViewShellTypeOnLoad (ViewShell::ShellType eType);
+
+ ViewShell::ShellType GetViewShellTypeOnLoad() const { return meViewShellTypeOnLoad;}
+
+ void SetPresentationViewShellId(sal_uInt16 nId)
+ { mnPresViewShellId = nId; }
+ sal_uInt16 GetPresentationViewShellId() const { return mnPresViewShellId; }
+
+ void SetSlidesPerRow(sal_uInt16 nSlides) { mnSlidesPerRow = nSlides; }
+ sal_uInt16 GetSlidesPerRow() const { return mnSlidesPerRow; }
+
+ void SetDrawMode(DrawModeFlags nNewDrawMode) { mnDrawMode = nNewDrawMode; };
+ DrawModeFlags GetDrawMode() const { return mnDrawMode; };
+
+ void SetIsNavigatorShowingAllShapes (const bool bIsNavigatorShowingAllShapes);
+ bool IsNavigatorShowingAllShapes() const { return mbIsNavigatorShowingAllShapes;}
+
+ void WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& );
+ void ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& );
+
+private:
+ sal_uInt16 mnRefCount;
+ bool mbRuler;
+ SdrLayerIDSet maVisibleLayers;
+ SdrLayerIDSet maLockedLayers;
+ SdrLayerIDSet maPrintableLayers;
+ SdrHelpLineList maStandardHelpLines;
+ SdrHelpLineList maNotesHelpLines;
+ SdrHelpLineList maHandoutHelpLines;
+ bool mbNoColors; ///< structuring mode
+ bool mbNoAttribs; ///< structuring mode
+ ::tools::Rectangle maVisArea; ///< visible area
+ PageKind mePageKind; ///< kind of page (standard, notes, handout)
+ sal_uInt16 mnSelectedPage;
+ PageKind mePageKindOnLoad;
+ sal_uInt16 mnSelectedPageOnLoad;
+ EditMode mePageEditMode; ///< edit mode in drawing mode (Page/MasterPage)
+ // EditMode meStandardEditMode; ///< edit mode in drawing mode (Page/MasterPage)
+ // EditMode meNotesEditMode; ///< edit mode in notes mode (Page/MasterPage)
+ // EditMode meHandoutEditMode; ///< edit mode in handout mode (Page/MasterPage)
+ EditMode meEditModeOnLoad;
+ bool mbLayerMode; ///< layer on/off
+ bool mbQuickEdit; ///< QuickEdit on/off
+ bool mbDoubleClickTextEdit; ///< text mode after double click
+ bool mbClickChangeRotation; ///< single click switches between selection/rotation mode
+ sal_uInt16 mnPresViewShellId; ///< ViewShell from which the presentation was started
+ sal_uInt16 mnSlidesPerRow; ///< slides per row on the slide-desk
+ DrawModeFlags mnDrawMode; ///< draw mode for the normal window
+ /** Remember whether the navigator shows all shapes (<TRUE/>) or only
+ the names ones (<FALSE/>). Not persistent.
+ */
+ bool mbIsNavigatorShowingAllShapes;
+
+ /** The type of the previous view shell. The (default) value
+ ViewShell::ST_NONE indicates that there was no previous view shell.
+ Note that this value is used only temporarily and is not saved or
+ restored.
+ */
+ ViewShell::ShellType mePreviousViewShellType;
+
+ ViewShell::ShellType meViewShellTypeOnLoad;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/GraphicDocShell.hxx b/sd/source/ui/inc/GraphicDocShell.hxx
new file mode 100644
index 000000000..40df981cf
--- /dev/null
+++ b/sd/source/ui/inc/GraphicDocShell.hxx
@@ -0,0 +1,54 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/docfac.hxx>
+#include <sfx2/objsh.hxx>
+#include "DrawDocShell.hxx"
+#include <glob.hxx>
+#include <sddllapi.h>
+
+namespace sd
+{
+/**
+ * document shell for draw documents
+ */
+class SD_DLLPUBLIC GraphicDocShell : public DrawDocShell
+{
+public:
+ SFX_DECL_INTERFACE(SD_IF_SDGRAPHICDOCSHELL)
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+public:
+ SFX_DECL_OBJECTFACTORY();
+
+ GraphicDocShell(SfxObjectCreateMode eMode);
+
+ GraphicDocShell(SfxModelFlags nModelCreationFlags);
+
+ virtual ~GraphicDocShell() override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/GraphicObjectBar.hxx b/sd/source/ui/inc/GraphicObjectBar.hxx
new file mode 100644
index 000000000..7d53a86d2
--- /dev/null
+++ b/sd/source/ui/inc/GraphicObjectBar.hxx
@@ -0,0 +1,54 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/shell.hxx>
+#include <glob.hxx>
+
+namespace sd {
+
+class View;
+class ViewShell;
+
+class GraphicObjectBar final
+ : public SfxShell
+{
+public:
+ SFX_DECL_INTERFACE( SD_IF_SDDRAWGRAFOBJECTBAR )
+
+ GraphicObjectBar (const ViewShell* pSdViewShell, ::sd::View* pSdView);
+ virtual ~GraphicObjectBar() override;
+
+ void GetAttrState( SfxItemSet& rSet );
+ void Execute( SfxRequest& rReq );
+
+ void GetFilterState( SfxItemSet& rSet );
+ void ExecuteFilter( SfxRequest const & rReq );
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+ ::sd::View* mpView;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/GraphicViewShell.hxx b/sd/source/ui/inc/GraphicViewShell.hxx
new file mode 100644
index 000000000..d730c2dd9
--- /dev/null
+++ b/sd/source/ui/inc/GraphicViewShell.hxx
@@ -0,0 +1,72 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "DrawViewShell.hxx"
+
+namespace vcl
+{
+class Window;
+}
+
+namespace sd
+{
+/** View shell of the Draw application.
+
+ <p>This class is an example of how not to do it: specialization by
+ inheritance. A graphic view shell is similar to a draw view shell
+ but lacks some of its features. Thus is should be at most a base
+ class of DrawViewShell. There even is special case code in
+ ViewShell that turns off some of the features for GraphicViewShell
+ instances.</p>
+*/
+class SAL_DLLPUBLIC_RTTI GraphicViewShell final : public DrawViewShell
+{
+public:
+ SFX_DECL_VIEWFACTORY(GraphicViewShell);
+ SFX_DECL_INTERFACE(SD_IF_SDGRAPHICVIEWSHELL)
+
+ /** Create a new view shell for the Draw application.
+ @param rViewShellBase
+ The new object will be stacked on this view shell base.
+ @param pFrameView
+ The frame view that makes it possible to pass information from
+ one view shell to the next.
+ */
+ GraphicViewShell(ViewShellBase& rViewShellBase, vcl::Window* pParentWindow,
+ FrameView* pFrameView);
+
+ virtual ~GraphicViewShell() override;
+
+ /** Override this method in order to have the layer mode always active.
+ */
+ virtual void ChangeEditMode(EditMode eMode, bool bIsLayerModeActive) override;
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+ void ConstructGraphicViewShell();
+ virtual void ArrangeGUIElements() override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/GraphicViewShellBase.hxx b/sd/source/ui/inc/GraphicViewShellBase.hxx
new file mode 100644
index 000000000..89a96cf51
--- /dev/null
+++ b/sd/source/ui/inc/GraphicViewShellBase.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "ViewShellBase.hxx"
+
+namespace sd
+{
+/** This class exists to be able to register another factory that
+ creates the view shell for the Draw application.
+*/
+class GraphicViewShellBase : public ViewShellBase
+{
+public:
+ SFX_DECL_VIEWFACTORY(GraphicViewShellBase);
+
+ /** This constructor is used by the view factory of the SFX
+ macros.
+ */
+ GraphicViewShellBase(SfxViewFrame* pFrame, SfxViewShell* pOldShell);
+ virtual ~GraphicViewShellBase() override;
+
+ /** Callback function for general slot calls.
+ */
+ virtual void Execute(SfxRequest& rRequest) override;
+
+protected:
+ virtual void InitializeFramework() override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/ImpressViewShellBase.hxx b/sd/source/ui/inc/ImpressViewShellBase.hxx
new file mode 100644
index 000000000..80070e7c8
--- /dev/null
+++ b/sd/source/ui/inc/ImpressViewShellBase.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "ViewShellBase.hxx"
+
+namespace sd
+{
+/** This class implements a few features that exist only for the Impress
+ application.
+*/
+class ImpressViewShellBase : public ViewShellBase
+{
+public:
+ SFX_DECL_VIEWFACTORY(ImpressViewShellBase);
+
+ /** This constructor is used by the view factory of the SFX
+ macros.
+ */
+ ImpressViewShellBase(SfxViewFrame* pFrame, SfxViewShell* pOldShell);
+ virtual ~ImpressViewShellBase() override;
+
+ /** Callback function for general slot calls.
+ */
+ virtual void Execute(SfxRequest& rRequest) override;
+
+protected:
+ virtual void InitializeFramework() override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/LayerTabBar.hxx b/sd/source/ui/inc/LayerTabBar.hxx
new file mode 100644
index 000000000..297a9302d
--- /dev/null
+++ b/sd/source/ui/inc/LayerTabBar.hxx
@@ -0,0 +1,108 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <string_view>
+
+#include <svtools/tabbar.hxx>
+#include <vcl/transfer.hxx>
+#include <sddllapi.h>
+
+namespace sd {
+
+/**
+ * TabBar for layer administration
+ */
+class DrawViewShell;
+
+class SAL_DLLPUBLIC_RTTI LayerTabBar final
+ : public TabBar,
+ public DropTargetHelper
+{
+public:
+ LayerTabBar (
+ DrawViewShell* pDrViewSh,
+ vcl::Window* pParent);
+ virtual void dispose() override;
+ virtual ~LayerTabBar() override;
+
+ /** Inform all listeners of this control that the current layer has been
+ activated. Call this method after switching the current layer and is
+ not done elsewhere (like when using ctrl + page up/down keys).
+ */
+ void SendActivatePageEvent();
+
+ /** Inform all listeners of this control that the current layer has been
+ deactivated. Call this method before switching the current layer
+ and is not done elsewhere (like when using ctrl page up/down keys).
+ */
+ void SendDeactivatePageEvent();
+
+ // Expects not-localized, real layer name in rText. Generates a localized layer name
+ // that will be displayed on the tab of the LayerTabBar and writes the real name
+ // to maAuxiliaryText. In case you want no entry in maAuxiliaryText, use method from TabBar.
+ virtual void InsertPage( sal_uInt16 nPageId, const OUString& rText,
+ TabBarPageBits nBits = TabBarPageBits::NONE,
+ sal_uInt16 nPos = TabBar::APPEND ) override;
+ virtual void SetPageText( sal_uInt16 nPageId, const OUString& rText ) override;
+
+ // Returns the real layer name if exists and empty OUString otherwise.
+ OUString GetLayerName(sal_uInt16 nPageId) const;
+
+ // Used e.g. in DeleteActualLayer() to test whether deleting is allowed.
+ static bool IsRealNameOfStandardLayer(std::u16string_view rName);
+
+ // Used e.g. in validity test of user entered names
+ static bool IsLocalizedNameOfStandardLayer(std::u16string_view rName);
+
+ // In case rName is one of the sUNO_LayerName_*, it generates a localized name,
+ // otherwise it returns value of rName.
+ static OUString convertToLocalizedName(const OUString& rName);
+
+ // TabBar
+ virtual void Select() override;
+ virtual void DoubleClick() override;
+
+ SD_DLLPUBLIC virtual void MouseButtonDown(const MouseEvent& rMEvt) override; // export for unit test
+
+ virtual void Command(const CommandEvent& rCEvt) override;
+
+ virtual bool StartRenaming() override;
+ virtual TabBarAllowRenamingReturnCode AllowRenaming() override;
+ virtual void EndRenaming() override;
+
+ virtual void ActivatePage() override;
+
+ // DropTargetHelper
+ virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override;
+ virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override;
+
+private:
+ DrawViewShell* pDrViewSh;
+
+ // Expects not-localized, real layer name in rText and writes it to maAuxiliaryText.
+ void SetLayerName( sal_uInt16 nPageId, const OUString& rText );
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/MasterPageObserver.hxx b/sd/source/ui/inc/MasterPageObserver.hxx
new file mode 100644
index 000000000..96f4a3741
--- /dev/null
+++ b/sd/source/ui/inc/MasterPageObserver.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <rtl/ustring.hxx>
+#include <tools/link.hxx>
+#include "tools/SdGlobalResourceContainer.hxx"
+#include <memory>
+#include <set>
+
+namespace osl
+{
+class Mutex;
+}
+
+class SdDrawDocument;
+
+namespace sd
+{
+class MasterPageObserverEvent;
+
+/** This singleton observes all registered documents for changes in the used
+ master pages and in turn informs its listeners about it. One such
+ listener is the master page selector control in the tool panel that
+ shows the recently used master pages.
+*/
+class MasterPageObserver : public SdGlobalResource
+{
+public:
+ typedef ::std::set<OUString> MasterPageNameSet;
+
+ /** Return the single instance of this class.
+ */
+ static MasterPageObserver& Instance();
+
+ /** The master page observer will listen to events of this document and
+ detect changes of the use of master pages.
+ */
+ void RegisterDocument(SdDrawDocument& rDocument);
+
+ /** The master page observer will stop to listen to events of this
+ document.
+ */
+ void UnregisterDocument(SdDrawDocument& rDocument);
+
+ /** Add a listener that is informed of master pages that are newly
+ assigned to slides or become unassigned.
+ @param rEventListener
+ The event listener to call for future events. Call
+ RemoveEventListener() before the listener is destroyed.
+ */
+ void AddEventListener(const Link<MasterPageObserverEvent&, void>& rEventListener);
+
+ /** Remove the given listener from the list of listeners.
+ @param rEventListener
+ After this method returns the given listener is not called back
+ from this object. Passing a listener that has not
+ been registered before is safe and is silently ignored.
+ */
+ void RemoveEventListener(const Link<MasterPageObserverEvent&, void>& rEventListener);
+
+private:
+ class Implementation;
+ ::std::unique_ptr<Implementation> mpImpl;
+
+ MasterPageObserver();
+ virtual ~MasterPageObserver() override;
+
+ MasterPageObserver(const MasterPageObserver&) = delete;
+
+ MasterPageObserver& operator=(const MasterPageObserver&) = delete;
+};
+
+/** Objects of this class are sent to listeners of the MasterPageObserver
+ singleton when the list of master pages of one document has changed.
+*/
+class MasterPageObserverEvent
+{
+public:
+ enum EventType
+ {
+ /// Master page already exists when document is registered.
+ ET_MASTER_PAGE_EXISTS,
+ /// Master page has been added to a document.
+ ET_MASTER_PAGE_ADDED,
+ /// Master page has been removed from to a document.
+ ET_MASTER_PAGE_REMOVED
+ };
+
+ EventType meType;
+ const OUString& mrMasterPageName;
+
+ MasterPageObserverEvent(EventType eType, const OUString& rMasterPageName)
+ : meType(eType)
+ , mrMasterPageName(rMasterPageName)
+ {
+ }
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/MediaObjectBar.hxx b/sd/source/ui/inc/MediaObjectBar.hxx
new file mode 100644
index 000000000..b7c56ef00
--- /dev/null
+++ b/sd/source/ui/inc/MediaObjectBar.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/shell.hxx>
+#include <glob.hxx>
+
+class SfxInterface;
+class SfxItemSet;
+class SfxModule;
+class SfxRequest;
+
+namespace sd {
+
+class View;
+class ViewShell;
+
+class MediaObjectBar final
+ : public SfxShell
+{
+public:
+ SFX_DECL_INTERFACE( SD_IF_SDDRAWMEDIAOBJECTBAR )
+
+ MediaObjectBar (const ViewShell* pSdViewShell, ::sd::View* pSdView);
+ virtual ~MediaObjectBar() override;
+
+ void GetState( SfxItemSet& rSet );
+ void Execute( SfxRequest const & rReq );
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+ ::sd::View* mpView;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/NavigatorChildWindow.hxx b/sd/source/ui/inc/NavigatorChildWindow.hxx
new file mode 100644
index 000000000..4199cab67
--- /dev/null
+++ b/sd/source/ui/inc/NavigatorChildWindow.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/childwin.hxx>
+#include <sfx2/navigat.hxx>
+
+namespace vcl { class Window; }
+class SfxBindings;
+
+namespace sd {
+
+class SdNavigatorWrapper final : public SfxNavigatorWrapper
+{
+public:
+ SdNavigatorWrapper(vcl::Window *pParent, sal_uInt16 nId,
+ SfxBindings* pBindings, SfxChildWinInfo* pInfo);
+ SFX_DECL_CHILDWINDOW(SdNavigatorWrapper);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/OutlineBulletDlg.hxx b/sd/source/ui/inc/OutlineBulletDlg.hxx
new file mode 100644
index 000000000..512d45f9a
--- /dev/null
+++ b/sd/source/ui/inc/OutlineBulletDlg.hxx
@@ -0,0 +1,51 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/tabdlg.hxx>
+
+namespace sd
+{
+class View;
+
+/**
+ * Bullet-Tab-Dialog
+ */
+class OutlineBulletDlg : public SfxTabDialogController
+{
+public:
+ OutlineBulletDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView);
+ virtual ~OutlineBulletDlg() override;
+
+ const SfxItemSet* GetBulletOutputItemSet() const;
+
+protected:
+ virtual void PageCreated(const OString& rId, SfxTabPage& rPage) override;
+
+private:
+ SfxItemSet m_aInputSet;
+ std::unique_ptr<SfxItemSet> m_xOutputSet;
+ bool m_bTitle;
+ ::sd::View* m_pSdView;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/OutlineView.hxx b/sd/source/ui/inc/OutlineView.hxx
new file mode 100644
index 000000000..058f6323a
--- /dev/null
+++ b/sd/source/ui/inc/OutlineView.hxx
@@ -0,0 +1,230 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <vcl/image.hxx>
+#include <vcl/vclevent.hxx>
+#include <editeng/lrspitem.hxx>
+#include <o3tl/deleter.hxx>
+#include "View.hxx"
+
+class SdPage;
+class SdrPage;
+class SdrTextObj;
+class SfxProgress;
+struct PasteOrDropInfos;
+class EditView;
+
+namespace sd::tools {
+ class EventMultiplexerEvent;
+}
+
+namespace sd {
+
+class DrawDocShell;
+class OutlineViewShell;
+class OutlineViewModelChangeGuard;
+
+const int MAX_OUTLINERVIEWS = 4;
+
+/**
+ * Derivative of ::sd::View for the outline mode
+|*
+\************************************************************************/
+
+class OutlineView
+ : public ::sd::View
+{
+ friend class OutlineViewModelChangeGuard;
+public:
+ OutlineView (DrawDocShell& rDocSh,
+ vcl::Window* pWindow,
+ OutlineViewShell& rOutlineViewSh);
+ virtual ~OutlineView() override;
+
+ /** This method is called by the view shell that owns the view to tell
+ the view that it can safely connect to the application.
+ This method must not be called before the view shell is on the shell
+ stack.
+ */
+ void ConnectToApplication();
+ void DisconnectFromApplication();
+
+
+ static SdrTextObj* GetTitleTextObject(SdrPage const * pPage);
+ static SdrTextObj* GetOutlineTextObject(SdrPage const * pPage);
+
+ static SdrTextObj* CreateTitleTextObject(SdPage* pPage);
+ static SdrTextObj* CreateOutlineTextObject(SdPage* pPage);
+
+ virtual void AddWindowToPaintView(OutputDevice* pWin, vcl::Window* pWindow) override;
+ virtual void DeleteWindowFromPaintView(OutputDevice* pWin) override;
+
+ OutlinerView* GetViewByWindow(vcl::Window const * pWin) const;
+ SdrOutliner& GetOutliner() { return mrOutliner; }
+
+ Paragraph* GetPrevTitle(const Paragraph* pPara);
+ Paragraph* GetNextTitle(const Paragraph* pPara);
+ SdPage* GetActualPage();
+ SdPage* GetPageForParagraph( Paragraph* pPara );
+ Paragraph* GetParagraphForPage( ::Outliner const & rOutl, SdPage const * pPage );
+
+ /** selects the paragraph for the given page at the outliner view*/
+ void SetActualPage( SdPage const * pActual );
+
+ void Paint (const ::tools::Rectangle& rRect, ::sd::Window const * pWin);
+
+ // Callbacks for LINKs
+ DECL_LINK( ParagraphInsertedHdl, ::Outliner::ParagraphHdlParam, void );
+ DECL_LINK( ParagraphRemovingHdl, ::Outliner::ParagraphHdlParam, void );
+ DECL_LINK( DepthChangedHdl, ::Outliner::DepthChangeHdlParam, void );
+ DECL_LINK( StatusEventHdl, EditStatus&, void );
+ DECL_LINK( BeginMovingHdl, ::Outliner *, void );
+ DECL_LINK( EndMovingHdl, ::Outliner *, void );
+ DECL_LINK( RemovingPagesHdl, OutlinerView *, bool );
+ DECL_LINK( IndentingPagesHdl, OutlinerView *, bool );
+ DECL_LINK( BeginDropHdl, EditView*, void );
+ DECL_LINK( EndDropHdl, EditView*, void );
+ DECL_LINK( PaintingFirstLineHdl, PaintFirstLineInfo*, void );
+
+ sal_uLong GetPaperWidth() const { return mnPaperWidth;}
+
+ void PrepareClose();
+
+ virtual void GetAttributes( SfxItemSet& rTargetSet, bool bOnlyHardAttr = false ) const override;
+ virtual bool SetAttributes(const SfxItemSet& rSet, bool bReplaceAll = false, bool bSlide = false, bool bMaster = false) override;
+
+ void FillOutliner();
+ void SetLinks();
+ void ResetLinks() const;
+
+ SfxStyleSheet* GetStyleSheet() const override;
+
+ void SetSelectedPages();
+
+ virtual sal_Int8 AcceptDrop (
+ const AcceptDropEvent& rEvt,
+ DropTargetHelper& rTargetHelper,
+ SdrLayerID nLayer) override;
+ virtual sal_Int8 ExecuteDrop (
+ const ExecuteDropEvent& rEvt,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer) override;
+
+ // Re-implement GetScriptType for this view to get correct results
+ virtual SvtScriptType GetScriptType() const override;
+
+ /** After this method has been called with <TRUE/> following changes of
+ the current page are ignored in that the corresponding text is not
+ selected.
+ This is used to suppress unwanted side effects between selection and
+ cursor position.
+ */
+ void IgnoreCurrentPageChanges (bool bIgnore);
+
+ /** creates and inserts an empty slide for the given paragraph. */
+ SdPage* InsertSlideForParagraph( Paragraph* pPara );
+
+ void UpdateParagraph( sal_Int32 nPara );
+
+protected:
+ virtual void OnBeginPasteOrDrop( PasteOrDropInfos* pInfo ) override;
+ virtual void OnEndPasteOrDrop( PasteOrDropInfos* pInfo ) override;
+
+private:
+ /** call this method before you do anything that can modify the outliner
+ and or the drawing document model. It will create needed undo actions */
+ void BeginModelChange();
+
+ /** call this method after BeginModelChange(), when all possible model
+ changes are done. */
+ void EndModelChange();
+
+ /** merge edit engine undo actions if possible */
+ void TryToMergeUndoActions();
+
+ /** updates all changes in the outliner model to the draw model */
+ void UpdateDocument();
+
+ OutlineViewShell& mrOutlineViewShell;
+ SdrOutliner& mrOutliner;
+ std::unique_ptr<OutlinerView> mpOutlinerViews[MAX_OUTLINERVIEWS];
+
+ std::vector<Paragraph*> maOldParaOrder;
+ std::vector<Paragraph*> maSelectedParas;
+
+ sal_Int32 mnPagesToProcess; // for the progress bar
+ sal_Int32 mnPagesProcessed;
+
+ bool mbFirstPaint;
+
+ sal_uLong mnPaperWidth;
+
+ std::unique_ptr<SfxProgress> mpProgress;
+
+ /** stores the last used document color.
+ this is changed in onUpdateStyleSettings()
+ */
+ Color maDocColor;
+
+ /** updates the high contrast settings and document color if they changed.
+ @param bForceUpdate forces the method to set all style settings
+ */
+ void onUpdateStyleSettings( bool bForceUpdate );
+
+ /** this link is called from the vcl application when the stylesettings
+ change. Its only purpose is to call onUpdateStyleSettings() then.
+ */
+ DECL_LINK( AppEventListenerHdl, VclSimpleEvent&, void );
+
+ DECL_LINK(EventMultiplexerListener, sd::tools::EventMultiplexerEvent&, void);
+
+ /** holds a model guard during drag and drop between BeginMovingHdl and EndMovingHdl */
+ std::unique_ptr<OutlineViewModelChangeGuard, o3tl::default_delete<OutlineViewModelChangeGuard>> maDragAndDropModelGuard;
+
+ SvxLRSpaceItem maLRSpaceItem;
+ Image maSlideImage;
+};
+
+// calls IgnoreCurrentPageChangesLevel with true in ctor and with false in dtor
+class OutlineViewPageChangesGuard
+{
+public:
+ OutlineViewPageChangesGuard( OutlineView* pView );
+ ~OutlineViewPageChangesGuard();
+private:
+ OutlineView* mpView;
+};
+
+// calls BeginModelChange() on c'tor and EndModelChange() on d'tor
+class OutlineViewModelChangeGuard
+{
+public:
+ OutlineViewModelChangeGuard( OutlineView& rView );
+ ~OutlineViewModelChangeGuard() COVERITY_NOEXCEPT_FALSE;
+private:
+ OutlineView& mrView;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/OutlineViewShell.hxx b/sd/source/ui/inc/OutlineViewShell.hxx
new file mode 100644
index 000000000..6bc230189
--- /dev/null
+++ b/sd/source/ui/inc/OutlineViewShell.hxx
@@ -0,0 +1,163 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "ViewShell.hxx"
+#include <glob.hxx>
+
+class SdPage;
+class TransferableDataHelper;
+class TransferableClipboardListener;
+
+namespace sd { class OutlineView; }
+
+namespace sd {
+
+/** Show a textual overview of the text contents of all slides.
+*/
+class OutlineViewShell
+ : public ViewShell
+{
+public:
+
+ SFX_DECL_VIEWFACTORY(OutlineViewShell);
+ SFX_DECL_INTERFACE(SD_IF_SDOUTLINEVIEWSHELL)
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+public:
+ /** Create a new view shell for the outline mode.
+ @param rViewShellBase
+ The new object will be stacked on this view shell base.
+ @param pFrameView
+ The frame view that makes it possible to pass information from
+ one view shell to the next.
+ */
+ OutlineViewShell (
+ SfxViewFrame* pFrame,
+ ViewShellBase& rViewShellBase,
+ vcl::Window* pParentWindow,
+ FrameView* pFrameView);
+
+ virtual ~OutlineViewShell() override;
+
+ virtual void Shutdown() override;
+
+ virtual void Paint(const ::tools::Rectangle& rRect, ::sd::Window* pWin) override;
+
+ /** Arrange and resize the GUI elements like rulers, sliders, and
+ buttons as well as the actual document view according to the size of
+ the enclosing window and current sizes of buttons, rulers, and
+ sliders.
+ */
+ virtual void ArrangeGUIElements() override;
+
+ virtual bool PrepareClose( bool bUI = true ) override;
+
+ virtual void VirtHScrollHdl(ScrollBar* pHScroll) override;
+ virtual void VirtVScrollHdl(ScrollBar* pVHScroll) override;
+
+ virtual void Activate( bool IsMDIActivate ) override;
+ virtual void Deactivate( bool IsMDIActivate ) override;
+
+ virtual SdPage* GetActualPage() override;
+
+ /// inherited from sd::ViewShell
+ virtual SdPage* getCurrentPage() const override;
+
+ void ExecCtrl(SfxRequest &rReq);
+ void GetCtrlState(SfxItemSet &rSet);
+ // FIXME non-virtual override???
+ void GetMenuState(SfxItemSet &rSet);
+ void GetAttrState(SfxItemSet &rSet);
+ void GetState (SfxItemSet& rSet);
+
+ static void ExecStatusBar(SfxRequest& rReq);
+ void GetStatusBarState(SfxItemSet& rSet);
+
+ void FuTemporary(SfxRequest &rReq);
+ void FuTemporaryModify(SfxRequest &rReq);
+ void FuPermanent(SfxRequest &rReq);
+ void FuSupport(SfxRequest &rReq);
+
+ virtual void SetZoom(::tools::Long nZoom) override;
+ virtual void SetZoomRect(const ::tools::Rectangle& rZoomRect) override;
+
+ void Execute(SfxRequest& rReq);
+
+ virtual void ReadFrameViewData(FrameView* pView) override;
+ virtual void WriteFrameViewData() override;
+
+ virtual void Command( const CommandEvent& rCEvt, ::sd::Window* pWin ) override;
+ virtual bool KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin) override;
+ virtual void MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin) override;
+
+ ErrCode ReadRtf(SvStream& rInput);
+
+ virtual void WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& ) override;
+ virtual void ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& ) override;
+
+ /** this method is called when the visible area of the view from this viewshell is changed */
+ virtual void VisAreaChanged(const ::tools::Rectangle& rRect) override;
+
+ /** Create an accessible object representing the specified window.
+ @param pWindow
+ The returned object makes the document displayed in this window
+ accessible.
+ @return
+ Returns an <type>AccessibleDrawDocumentView</type> object.
+ */
+ virtual css::uno::Reference<css::accessibility::XAccessible>
+ CreateAccessibleDocumentView (::sd::Window* pWindow) override;
+
+ /** Update the preview to show the specified page.
+ */
+ virtual void UpdatePreview (SdPage* pPage) override;
+
+ virtual css::uno::Reference<css::drawing::XDrawSubController> CreateSubController() override;
+
+ /** Make the given page the new current page. This method
+ notifies the controller and adapts the selection of the
+ model.
+ @param pPage
+ The new current page. Pass NULL when there is no current page.
+ */
+ void SetCurrentPage (SdPage* pPage);
+
+ void UpdateTitleObject( SdPage* pPage, Paragraph const * pPara );
+ void UpdateOutlineObject( SdPage* pPage, Paragraph* pPara );
+
+private:
+ OUString m_StrOldPageName;
+ std::unique_ptr<OutlineView> pOlView;
+ SdPage* pLastPage; // For efficient processing of the preview
+ rtl::Reference<TransferableClipboardListener> mxClipEvtLstnr;
+ bool bPastePossible;
+ bool mbInitialized;
+
+ void Construct();
+ DECL_LINK( ClipboardChanged, TransferableDataHelper*, void );
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/OutlineViewShellBase.hxx b/sd/source/ui/inc/OutlineViewShellBase.hxx
new file mode 100644
index 000000000..13527d80d
--- /dev/null
+++ b/sd/source/ui/inc/OutlineViewShellBase.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "ImpressViewShellBase.hxx"
+
+namespace sd
+{
+/** This class exists to be able to register a factory that
+ creates an outline view shell as default.
+*/
+class OutlineViewShellBase : public ImpressViewShellBase
+{
+public:
+ SFX_DECL_VIEWFACTORY(OutlineViewShellBase);
+
+ /** This constructor is used by the view factory of the SFX
+ macros.
+ */
+ OutlineViewShellBase(SfxViewFrame* pFrame, SfxViewShell* pOldShell);
+ virtual ~OutlineViewShellBase() override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/OutlinerIteratorImpl.hxx b/sd/source/ui/inc/OutlinerIteratorImpl.hxx
new file mode 100644
index 000000000..00be547c0
--- /dev/null
+++ b/sd/source/ui/inc/OutlinerIteratorImpl.hxx
@@ -0,0 +1,239 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <OutlinerIterator.hxx>
+#include <memory>
+
+class SdDrawDocument;
+class SdPage;
+class SdrObjListIter;
+
+namespace sd {
+
+class ViewShell;
+
+namespace outliner {
+
+/** Base class for the polymorphic implementation class of the
+ <type>Iterator</type> class. The iterators based on this class are
+ basically uni directional iterators. Their direction can, however, be
+ reversed at any point of their life time.
+*/
+class IteratorImplBase
+{
+public:
+ /** The constructor stores the given arguments to be used by the derived
+ classes.
+ @param pDocument
+ The document provides the information to be iterated on.
+ @param pViewShellWeak
+ Some information has to be taken from the view shell.
+ @param bDirectionIsForward
+ This flag defines the iteration direction. When <TRUE/> then
+ the direction is forwards otherwise it is backwards.
+ */
+ IteratorImplBase (SdDrawDocument* pDocument,
+ const std::weak_ptr<ViewShell>& rpViewShellWeak,
+ bool bDirectionIsForward);
+ IteratorImplBase (SdDrawDocument* pDocument,
+ const std::weak_ptr<ViewShell>& rpViewShellWeak,
+ bool bDirectionIsForward, PageKind ePageKind, EditMode eEditMode);
+ virtual ~IteratorImplBase();
+
+ /** Advance to the next text of the current object or to the next object.
+ This takes the iteration direction into
+ account. The new object pointed to can be retrieved (among other
+ information) by calling the <member>GetPosition</member> method.
+ */
+ virtual void GotoNextText() = 0;
+ /** Return an object that describes the current object.
+ @return
+ The returned object describes the current object pointed to by
+ the iterator. See the description of
+ <type>IteratorPosition</type> for details on the available
+ information.
+ */
+ virtual const IteratorPosition& GetPosition();
+ /** Create an exact copy of this object. No argument should be
+ specified when called from the outside. It then creates an object
+ first and passes that to the inherited <member>Clone()</member>
+ methods to fill in class specific information.
+ @return
+ Returns a copy of this object. When this method is called with
+ an argument then this value will be returned.
+ */
+ virtual IteratorImplBase* Clone (IteratorImplBase* pObject=nullptr) const;
+ /** Test the equality of the this object and the given iterator. Two
+ iterators are taken to be equal when they point to the same object.
+ Iteration direction is not taken into account.
+ @param rIterator
+ The iterator to compare to.
+ @return
+ When both iterators are equal <TRUE/> is returned, <FALSE/> otherwise.
+ */
+ virtual bool operator== (const IteratorImplBase& rIterator) const;
+ /** This method is used by the equality operator. It is part of a "multimethod" pattern.
+ @param rIterator
+ The iterator to compare to.
+ @return
+ Returns <TRUE/> when both iterators point to the same object.
+ */
+ virtual bool IsEqualSelection(const IteratorImplBase& rIterator) const;
+ /** Reverse the direction of iteration. The current object stays the same.
+ */
+ virtual void Reverse();
+
+protected:
+ /// The current position as returned by <member>GetPosition()</member>.
+ IteratorPosition maPosition;
+ /// The document on whose data the iterator operates.
+ SdDrawDocument* mpDocument;
+ /// Necessary secondary source of information.
+ std::weak_ptr<ViewShell> mpViewShellWeak;
+ /// Specifies the search direction.
+ bool mbDirectionIsForward;
+};
+
+/** Iterator all objects that belong to the current mark list
+ a.k.a. selection. It is assumed that all marked objects belong to the
+ same page. It is further assumed that the mark list does not change
+ while an iterator is alive. It is therefore the responsibility of an
+ iterator's owner to handle the case of a changed mark list.
+
+ <p>For documentation of the methods please refer to the base class
+ <type>IteratorImplBase</type>.</p>
+*/
+class SelectionIteratorImpl
+ : public IteratorImplBase
+{
+public:
+ SelectionIteratorImpl (
+ const ::std::vector< ::tools::WeakReference<SdrObject> >& rObjectList,
+ sal_Int32 nObjectIndex,
+ SdDrawDocument* pDocument,
+ const std::weak_ptr<ViewShell>& rpViewShellWeak,
+ bool bDirectionIsForward);
+ SelectionIteratorImpl (const SelectionIteratorImpl& rObject);
+ virtual ~SelectionIteratorImpl() override;
+
+ virtual void GotoNextText() override;
+ virtual const IteratorPosition& GetPosition() override;
+ virtual IteratorImplBase* Clone (IteratorImplBase* pObject = nullptr) const override;
+ virtual bool operator== (const IteratorImplBase& rIterator) const override;
+
+private:
+ const ::std::vector<::tools::WeakReference<SdrObject>>& mrObjectList;
+ sal_Int32 mnObjectIndex;
+
+ /** Compare the given iterator with this object. This method handles
+ only the case that the given iterator is an instance of this class.
+ @param rIterator
+ The iterator to compare to.
+ @return
+ Returns <TRUE/> when both iterators point to the same object.
+ */
+ virtual bool IsEqualSelection(const IteratorImplBase& rIterator) const override;
+
+ IteratorImplBase& operator= (const IteratorImplBase& rIterator);
+};
+
+/** Iterator for iteration over all objects in a single view. On reaching
+ the last object on the last page (or the first object on the first page)
+ the view is *not* switched. Further calls to the
+ <member>GotoNextObject()</member> method will be ignored.
+
+ <p>For documentation of the methods please refer to the base class
+ <type>IteratorImplBase</type>.</p>
+*/
+class ViewIteratorImpl : public IteratorImplBase
+{
+public:
+ ViewIteratorImpl (
+ sal_Int32 nPageIndex,
+ SdDrawDocument* pDocument,
+ const std::weak_ptr<ViewShell>& rpViewShellWeak,
+ bool bDirectionIsForward);
+ ViewIteratorImpl (
+ sal_Int32 nPageIndex,
+ SdDrawDocument* pDocument,
+ const std::weak_ptr<ViewShell>& rpViewShellWeak,
+ bool bDirectionIsForward,
+ PageKind ePageKind,
+ EditMode eEditMode);
+ virtual ~ViewIteratorImpl() override;
+
+ virtual void GotoNextText() override;
+ virtual IteratorImplBase* Clone (IteratorImplBase* pObject = nullptr) const override;
+ virtual void Reverse() override;
+
+protected:
+ /** Set up page pointer and object list iterator for the specified
+ page.
+ @param nPageIndex
+ Index of the new page. It may lie outside the valid range for
+ page indices.
+ */
+ void SetPage (sal_Int32 nPageIndex);
+
+private:
+ /// Indicates whether a page changed occurred on switching to current page.
+ bool mbPageChangeOccurred;
+ /// Pointer to the page associated with the current page index. May be NULL.
+ SdPage* mpPage;
+ /// Iterator of all objects on the current page.
+ std::unique_ptr<SdrObjListIter> mpObjectIterator;
+
+ // Don't use this operator.
+ ViewIteratorImpl& operator= (const ViewIteratorImpl&) = delete;
+};
+
+/** Iterator for iteration over all objects in all views. It automatically
+ switches views when reaching the end/beginning of a view.
+
+ <p>For documentation of the methods please refer to the base class
+ <type>IteratorImplBase</type>.</p>
+*/
+class DocumentIteratorImpl : public ViewIteratorImpl
+{
+public:
+ DocumentIteratorImpl (
+ sal_Int32 nPageIndex,
+ PageKind ePageKind,
+ EditMode eEditMode,
+ SdDrawDocument* pDocument,
+ const std::weak_ptr<ViewShell>& rpViewShellWeak,
+ bool bDirectionIsForward);
+ virtual ~DocumentIteratorImpl() override;
+
+ virtual void GotoNextText() override;
+ virtual IteratorImplBase* Clone (IteratorImplBase* pObject = nullptr) const override;
+
+private:
+ /// Number of pages in the view that is specified by <member>maPosition</member>.
+ sal_Int32 mnPageCount;
+
+ // Don't use this operator.
+ DocumentIteratorImpl& operator= (const DocumentIteratorImpl& ) = delete;
+};
+
+} } // end of namespace ::sd::outliner
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/PaneChildWindows.hxx b/sd/source/ui/inc/PaneChildWindows.hxx
new file mode 100644
index 000000000..e323353ee
--- /dev/null
+++ b/sd/source/ui/inc/PaneChildWindows.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 .
+ */
+
+#pragma once
+
+#include <sfx2/childwin.hxx>
+#include <unotools/resmgr.hxx>
+
+namespace sd {
+
+/// Base class of Impress and Draw left sidebars/panes.
+class PaneChildWindow
+ : public SfxChildWindow
+{
+public:
+ PaneChildWindow (
+ vcl::Window* pParentWindow,
+ sal_uInt16 nId,
+ SfxBindings* pBindings,
+ SfxChildWinInfo* pInfo,
+ TranslateId pTitleBarResId);
+ virtual ~PaneChildWindow() override;
+};
+
+/// The slide-sorter sidebar (on the left) in Impress.
+class LeftPaneImpressChildWindow
+ : public PaneChildWindow
+{
+public:
+ LeftPaneImpressChildWindow(vcl::Window* pParentWindow, sal_uInt16 nId, SfxBindings* pBindings,
+ SfxChildWinInfo* pInfo);
+
+ SFX_DECL_CHILDWINDOW_WITHID(LeftPaneImpressChildWindow);
+};
+
+/// The pages sidebar (on the left) in Draw.
+class LeftPaneDrawChildWindow
+ : public PaneChildWindow
+{
+public:
+ LeftPaneDrawChildWindow(vcl::Window* pParentWindow, sal_uInt16 nId, SfxBindings* pBindings,
+ SfxChildWinInfo* pInfo);
+
+ SFX_DECL_CHILDWINDOW_WITHID(LeftPaneDrawChildWindow);
+};
+
+} // end of namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/PaneDockingWindow.hxx b/sd/source/ui/inc/PaneDockingWindow.hxx
new file mode 100644
index 000000000..c69cb6f94
--- /dev/null
+++ b/sd/source/ui/inc/PaneDockingWindow.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "titledockwin.hxx"
+
+namespace sd {
+
+ class PaneDockingWindow : public ::sd::TitledDockingWindow
+{
+public:
+ /** Create a new docking window.
+ @param pBindings
+ Used, among others, to determine the ViewShellBase and
+ PaneManager that manage the new docking window.
+ @param pChildWindow
+ This child window is the logical container for the new docking
+ window.
+ @param pParent
+ The parent window of the new docking window.
+ @param rsTitle
+ the initial title
+ */
+ PaneDockingWindow (
+ SfxBindings *pBindings,
+ SfxChildWindow *pChildWindow,
+ vcl::Window* pParent,
+ const OUString& rsTitle);
+
+ virtual ~PaneDockingWindow() override;
+ virtual void StateChanged( StateChangedType nType ) override;
+ virtual void MouseButtonDown (const MouseEvent& rEvent) override;
+ /** When docked the given range is passed to the parent SplitWindow.
+ */
+ void SetValidSizeRange (const Range& rValidSizeRange);
+
+ enum Orientation { HorizontalOrientation, VerticalOrientation, UnknownOrientation };
+ /** When the PaneDockingWindow is docked and managed by a split window
+ it can derive its orientation from the orientation of the split
+ window and return either HorizontalOrientation or
+ VerticalOrientation.
+ Otherwise UnknownOrientation is returned.
+ */
+ Orientation GetOrientation() const;
+};
+
+} // end of namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/PaneShells.hxx b/sd/source/ui/inc/PaneShells.hxx
new file mode 100644
index 000000000..fe5809a8f
--- /dev/null
+++ b/sd/source/ui/inc/PaneShells.hxx
@@ -0,0 +1,63 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/shell.hxx>
+#include <glob.hxx>
+
+namespace sd
+{
+/** Shell that displays the left pane for Impress. The shell does not do
+ anything else and has especially no slots.
+*/
+class LeftImpressPaneShell : public SfxShell
+{
+public:
+ SFX_DECL_INTERFACE(SD_IF_SDLEFTIMPRESSPANESHELL)
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+public:
+ LeftImpressPaneShell();
+ virtual ~LeftImpressPaneShell() override;
+};
+
+/** Shell that displays the left pane for Draw. The shell does not do
+ anything else and has especially no slots.
+*/
+class LeftDrawPaneShell : public SfxShell
+{
+public:
+ SFX_DECL_INTERFACE(SD_IF_SDLEFTDRAWPANESHELL)
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+public:
+ LeftDrawPaneShell();
+ virtual ~LeftDrawPaneShell() override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/PresentationViewShell.hxx b/sd/source/ui/inc/PresentationViewShell.hxx
new file mode 100644
index 000000000..f37b31e08
--- /dev/null
+++ b/sd/source/ui/inc/PresentationViewShell.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "DrawViewShell.hxx"
+
+namespace sd
+{
+/** This view shell is responsible for showing the presentation of an
+ Impress document.
+*/
+class PresentationViewShell : public DrawViewShell
+{
+public:
+ SFX_DECL_INTERFACE(SD_IF_SDPRESVIEWSHELL)
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+public:
+ PresentationViewShell(ViewShellBase& rViewShellBase, vcl::Window* pParentWindow,
+ FrameView* pFrameView);
+ virtual ~PresentationViewShell() override;
+
+ /** This method is used by a simple class that passes some
+ arguments from the creator of the new view shell to the new view
+ shell object by waiting for its asynchronous creation.
+ @param pFrameView
+ The frame view that is typically used by the creating object and
+ that shall be shared by the created view shell.
+ */
+ void FinishInitialization(FrameView* pFrameView);
+
+ virtual void Resize() override;
+
+protected:
+ virtual VclPtr<SvxRuler> CreateHRuler(::sd::Window* pWin) override;
+ virtual VclPtr<SvxRuler> CreateVRuler(::sd::Window* pWin) override;
+
+private:
+ ::tools::Rectangle maOldVisArea;
+ ImplSVEvent* mnAbortSlideShowEvent;
+
+ virtual void Activate(bool bIsMDIActivate) override;
+ virtual void Paint(const ::tools::Rectangle& rRect, ::sd::Window* pWin) override;
+
+ DECL_LINK(AbortSlideShowHdl, void*, void);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/PresentationViewShellBase.hxx b/sd/source/ui/inc/PresentationViewShellBase.hxx
new file mode 100644
index 000000000..684e5ee61
--- /dev/null
+++ b/sd/source/ui/inc/PresentationViewShellBase.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "ViewShellBase.hxx"
+
+namespace sd
+{
+/** This class exists to be able to register another factory that
+ creates the view shell for the presentation.
+*/
+class PresentationViewShellBase : public ViewShellBase
+{
+public:
+ SFX_DECL_VIEWFACTORY(PresentationViewShellBase);
+
+ /** This constructor is used by the view factory of the SFX
+ macros.
+ */
+ PresentationViewShellBase(SfxViewFrame* pFrame, SfxViewShell* pOldShell);
+ virtual ~PresentationViewShellBase() override;
+
+protected:
+ virtual void InitializeFramework() override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/PreviewRenderer.hxx b/sd/source/ui/inc/PreviewRenderer.hxx
new file mode 100644
index 000000000..245f0b638
--- /dev/null
+++ b/sd/source/ui/inc/PreviewRenderer.hxx
@@ -0,0 +1,141 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/image.hxx>
+#include <memory>
+
+#include <svl/lstner.hxx>
+
+class SdPage;
+class VirtualDevice;
+
+namespace sd {
+
+class DrawDocShell;
+class DrawView;
+
+class PreviewRenderer
+ : public SfxListener
+{
+public:
+ /** Create a new preview renderer that takes some of its initial values
+ from the given output device.
+ @param bPaintFrame
+ When <TRUE/> (the default) then a frame is painted around the
+ preview. This makes the actual preview smaller.
+ */
+ PreviewRenderer(const bool bPaintFrame = true);
+
+ virtual ~PreviewRenderer() override;
+
+ /** Render a page with the given pixel size.
+ Use this version when only the width of the preview is known to the
+ caller. The height is then calculated according to the aspect
+ ratio of the given page.
+ @param pPage
+ The page to render.
+ @param nWidth
+ The width of the preview in device coordinates.
+ The high contrast mode of the application is
+ ignored and the preview is rendered in normal mode.
+ */
+ Image RenderPage (
+ const SdPage* pPage,
+ const sal_Int32 nWidth);
+
+ /** Render a page with the given pixel size.
+ @param pPage
+ The page to render.
+ @param aPreviewPixelSize
+ The size in device coordinates of the preview.
+ @param bObeyHighContrastMode
+ When <FALSE/> then the high contrast mode of the application is
+ ignored and the preview is rendered in normal mode. When
+ <TRUE/> and high contrast mode is active then the preview is
+ rendered in high contrast mode.
+ @param bDisplayPresentationObjects
+ When <FALSE/> then the PresObj place holders are not displayed
+ in the returned preview.
+ */
+ Image RenderPage (
+ const SdPage* pPage,
+ const Size aPreviewPixelSize,
+ const bool bObeyHighContrastMode,
+ const bool bDisplayPresentationObjects = true);
+
+ /** Render an image that contains the given substitution text instead of a
+ slide preview.
+ @param aPreviewPixelSize
+ The size in device coordinates of the image.
+ */
+ Image RenderSubstitution (
+ const Size& rPreviewPixelSize,
+ const OUString& sSubstitutionText);
+
+ /** Scale the given bitmap by keeping its aspect ratio to the desired
+ width. Add a frame to it afterwards.
+ */
+ Image ScaleBitmap (
+ const BitmapEx& rBitmap,
+ int nWidth);
+
+protected:
+ virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
+
+private:
+ ScopedVclPtr<VirtualDevice> mpPreviewDevice;
+ ::std::unique_ptr<DrawView> mpView;
+ DrawDocShell* mpDocShellOfView;
+ const Color maFrameColor;
+ const bool mbHasFrame;
+ static const int snSubstitutionTextSize;
+ // Width of the frame that is painted around the preview.
+ static const int snFrameWidth;
+
+ bool Initialize (
+ const SdPage* pPage,
+ const Size& rPixelSize,
+ const bool bObeyHighContrastMode);
+ void PaintPage (
+ const SdPage* pPage,
+ const bool bDisplayPresentationObjects);
+ void PaintSubstitutionText (const OUString& rSubstitutionText);
+ void PaintFrame();
+
+ /** Set up the map mode so that the given page is renderer into a bitmap
+ with the specified width.
+ @param rPage
+ The page for which the preview is created.
+ @param rPixelSize
+ The size of the resulting preview bitmap. Note that this size
+ includes the frame. The actual preview is smaller accordingly.
+ */
+ void SetupOutputSize (const SdPage& rPage, const Size& rPixelSize);
+
+ /** When mpView is empty then create a new view and initialize it.
+ Otherwise just initialize it.
+ */
+ void ProvideView (DrawDocShell* pDocShell);
+};
+
+} // end of namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/RemoteServer.hxx b/sd/source/ui/inc/RemoteServer.hxx
new file mode 100644
index 000000000..965bf7a27
--- /dev/null
+++ b/sd/source/ui/inc/RemoteServer.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/.
+ */
+#pragma once
+
+#include <memory>
+#include <vector>
+
+#include <osl/socket_decl.hxx>
+#include <salhelper/thread.hxx>
+
+#include <sddllapi.h>
+
+namespace osl { class Mutex; }
+namespace com::sun::star::presentation { class XSlideShowController; }
+namespace com::sun::star::uno { template <class interface_type> class Reference; }
+
+/**
+* The port for use for the main communication between LibO and remote control app.
+*/
+#define PORT 1599
+
+namespace sd
+{
+ class BufferedStreamSocket;
+ class Communicator;
+
+ struct ClientInfo
+ {
+ OUString mName;
+
+ bool mbIsAlreadyAuthorised;
+
+ ClientInfo( const OUString& rName,
+ const bool bIsAlreadyAuthorised ) :
+ mName( rName ),
+ mbIsAlreadyAuthorised( bIsAlreadyAuthorised ) {}
+
+ virtual ~ClientInfo() {};
+ };
+
+ struct ClientInfoInternal;
+
+ class RemoteServer final : public salhelper::Thread
+ {
+ public:
+ // Internal setup
+ static void setup();
+
+ // For slideshowimpl to inform us.
+ static void presentationStarted( const css::uno::Reference<
+ css::presentation::XSlideShowController > &rController );
+ static void presentationStopped();
+
+ // For the control dialog
+ SD_DLLPUBLIC static std::vector< std::shared_ptr< ClientInfo > > getClients();
+ SD_DLLPUBLIC static bool connectClient( const std::shared_ptr< ClientInfo >& pClient,
+ std::u16string_view aPin );
+ SD_DLLPUBLIC static void deauthoriseClient( const std::shared_ptr< ClientInfo >& pClient );
+
+ /// ensure that discoverability (eg. for Bluetooth) is enabled
+ SD_DLLPUBLIC static void ensureDiscoverable();
+ /// restore the state of discoverability from before ensureDiscoverable
+ SD_DLLPUBLIC static void restoreDiscoverable();
+
+ // For the communicator
+ static void removeCommunicator( Communicator const * pCommunicator );
+ private:
+ RemoteServer();
+ virtual ~RemoteServer() override;
+ static RemoteServer *spServer;
+ static ::osl::Mutex sDataMutex;
+ static ::std::vector<Communicator*> sCommunicators;
+ osl::AcceptorSocket mSocket;
+
+ ::std::vector< std::shared_ptr< ClientInfoInternal > > mAvailableClients;
+
+ void execute() override;
+ void handleAcceptedConnection( BufferedStreamSocket *pSocket ) ;
+ };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/Ruler.hxx b/sd/source/ui/inc/Ruler.hxx
new file mode 100644
index 000000000..5cf1d18bb
--- /dev/null
+++ b/sd/source/ui/inc/Ruler.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <svx/ruler.hxx>
+
+namespace sd {
+
+class DrawViewShell;
+class RulerCtrlItem;
+class Window;
+
+class Ruler final
+ : public SvxRuler
+{
+public:
+ Ruler (
+ DrawViewShell& rViewSh,
+ vcl::Window* pParent,
+ ::sd::Window* pWin,
+ SvxRulerSupportFlags nRulerFlags,
+ SfxBindings& rBindings,
+ WinBits nWinStyle);
+ virtual ~Ruler() override;
+ virtual void dispose() override;
+
+ void SetNullOffset(const Point& rOffset);
+
+ bool IsHorizontal() const { return bHorz; }
+
+ using ::Ruler::SetNullOffset;
+
+private:
+ DrawViewShell* pDrViewShell;
+ std::unique_ptr<RulerCtrlItem> pCtrlItem;
+ bool bHorz;
+
+ virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
+ virtual void Command(const CommandEvent& rCEvt) override;
+ virtual void ExtraDown() override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/SdUnoDrawView.hxx b/sd/source/ui/inc/SdUnoDrawView.hxx
new file mode 100644
index 000000000..6b62e4cb2
--- /dev/null
+++ b/sd/source/ui/inc/SdUnoDrawView.hxx
@@ -0,0 +1,116 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "DrawSubController.hxx"
+#include <cppuhelper/basemutex.hxx>
+
+class SdXImpressDocument;
+namespace com::sun::star::drawing { class XLayer; }
+
+namespace sd {
+
+class DrawViewShell;
+class View;
+
+/** This class implements the DrawViewShell specific part of the controller.
+*/
+class SdUnoDrawView final
+ : private cppu::BaseMutex,
+ public DrawSubControllerInterfaceBase
+{
+public:
+ SdUnoDrawView (
+ DrawViewShell& rViewShell,
+ View& rView) noexcept;
+ virtual ~SdUnoDrawView() noexcept override;
+
+ // XSelectionSupplier
+
+ virtual sal_Bool SAL_CALL select (
+ const css::uno::Any& aSelection) override;
+
+ virtual css::uno::Any SAL_CALL getSelection() override;
+
+ virtual void SAL_CALL addSelectionChangeListener (
+ const css::uno::Reference<css::view::XSelectionChangeListener>& rxListener) override;
+
+ virtual void SAL_CALL removeSelectionChangeListener (
+ const css::uno::Reference<css::view::XSelectionChangeListener>& rxListener) override;
+
+ // XDrawView
+
+ virtual void SAL_CALL setCurrentPage (
+ const css::uno::Reference<css::drawing::XDrawPage >& xPage) override;
+
+ virtual css::uno::Reference<css::drawing::XDrawPage> SAL_CALL getCurrentPage() override;
+
+ // XFastPropertySet
+
+ virtual void SAL_CALL setFastPropertyValue (
+ sal_Int32 nHandle,
+ const css::uno::Any& rValue) override;
+
+ virtual css::uno::Any SAL_CALL getFastPropertyValue (
+ sal_Int32 nHandle) 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;
+
+ /** Return a reference to the active layer object.
+ @return
+ The returned value may be empty when the internal state of this
+ view is not valid (like during destruction.)
+ */
+ css::uno::Reference< css::drawing::XLayer> getActiveLayer() const;
+
+private:
+ bool getMasterPageMode() const noexcept;
+ void setMasterPageMode(bool MasterPageMode_) noexcept;
+ bool getLayerMode() const noexcept;
+ void setLayerMode(bool LayerMode_) noexcept;
+ /** Make the specified object the active layer.
+ @param rxLayer
+ The new layer object.
+ @throws css::uno::RuntimeException
+ */
+ void setActiveLayer (const css::uno::Reference< css::drawing::XLayer>& rxLayer);
+
+ void SetZoom( sal_Int16 nZoom );
+ sal_Int16 GetZoom() const;
+
+ void SetViewOffset(const css::awt::Point& rWinPos );
+ css::awt::Point GetViewOffset() const;
+
+ void SetZoomType( sal_Int16 nType );
+
+ css::uno::Any getDrawViewMode() const;
+
+ SdXImpressDocument* GetModel() const noexcept;
+
+ DrawViewShell& mrDrawViewShell;
+ sd::View& mrView;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/SdUnoOutlineView.hxx b/sd/source/ui/inc/SdUnoOutlineView.hxx
new file mode 100644
index 000000000..2789cabee
--- /dev/null
+++ b/sd/source/ui/inc/SdUnoOutlineView.hxx
@@ -0,0 +1,82 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "DrawSubController.hxx"
+#include <cppuhelper/basemutex.hxx>
+
+namespace sd {
+
+class OutlineViewShell;
+
+/** This class implements the OutlineViewShell specific part of the controller.
+*/
+class SdUnoOutlineView final
+ : private cppu::BaseMutex,
+ public DrawSubControllerInterfaceBase
+{
+public:
+ SdUnoOutlineView (
+ OutlineViewShell& rViewShell) noexcept;
+ virtual ~SdUnoOutlineView() noexcept override;
+
+ virtual void SAL_CALL disposing() override;
+
+ // XSelectionSupplier
+
+ virtual sal_Bool SAL_CALL select (
+ const css::uno::Any& aSelection) override;
+
+ virtual css::uno::Any SAL_CALL getSelection() override;
+
+ virtual void SAL_CALL addSelectionChangeListener (
+ const css::uno::Reference<css::view::XSelectionChangeListener>& rxListener) override;
+
+ virtual void SAL_CALL removeSelectionChangeListener (
+ const css::uno::Reference<css::view::XSelectionChangeListener>& rxListener) override;
+
+ // XDrawView
+
+ virtual void SAL_CALL setCurrentPage (
+ const css::uno::Reference<css::drawing::XDrawPage >& xPage) override;
+
+ virtual css::uno::Reference<css::drawing::XDrawPage> SAL_CALL getCurrentPage() override;
+
+ // XFastPropertySet
+
+ virtual void SAL_CALL setFastPropertyValue (
+ sal_Int32 nHandle,
+ const css::uno::Any& rValue) override;
+
+ virtual css::uno::Any SAL_CALL getFastPropertyValue (
+ sal_Int32 nHandle) 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:
+ OutlineViewShell& mrOutlineViewShell;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/SdUnoSlideView.hxx b/sd/source/ui/inc/SdUnoSlideView.hxx
new file mode 100644
index 000000000..7ca40a1ab
--- /dev/null
+++ b/sd/source/ui/inc/SdUnoSlideView.hxx
@@ -0,0 +1,82 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "DrawSubController.hxx"
+#include <cppuhelper/basemutex.hxx>
+
+namespace sd::slidesorter { class SlideSorter; }
+namespace com::sun::star::drawing { class XDrawPage; }
+
+namespace sd {
+
+/** This class implements the SlideSorter specific part of the
+ controller.
+ */
+class SdUnoSlideView final
+ : private cppu::BaseMutex,
+ public DrawSubControllerInterfaceBase
+{
+public:
+ SdUnoSlideView (
+ slidesorter::SlideSorter& rSlideSorter) noexcept;
+ virtual ~SdUnoSlideView() noexcept override;
+
+ // XSelectionSupplier
+
+ virtual sal_Bool SAL_CALL select (const css::uno::Any& aSelection) override;
+
+ virtual css::uno::Any SAL_CALL getSelection() override;
+
+ virtual void SAL_CALL addSelectionChangeListener (
+ const css::uno::Reference<css::view::XSelectionChangeListener>& rxListener) override;
+
+ virtual void SAL_CALL removeSelectionChangeListener (
+ const css::uno::Reference<css::view::XSelectionChangeListener>& rxListener) override;
+
+ // XDrawView
+
+ virtual void SAL_CALL setCurrentPage (
+ const css::uno::Reference< css::drawing::XDrawPage >& xPage) override;
+
+ virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL
+ getCurrentPage() override;
+
+ // XFastPropertySet
+
+ virtual void SAL_CALL setFastPropertyValue (
+ sal_Int32 nHandle,
+ const css::uno::Any& rValue) override;
+
+ virtual css::uno::Any SAL_CALL getFastPropertyValue (
+ sal_Int32 nHandle) 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:
+ slidesorter::SlideSorter& mrSlideSorter;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/ShellFactory.hxx b/sd/source/ui/inc/ShellFactory.hxx
new file mode 100644
index 000000000..fc05c41ab
--- /dev/null
+++ b/sd/source/ui/inc/ShellFactory.hxx
@@ -0,0 +1,52 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/toolbarids.hxx>
+
+namespace sd
+{
+typedef ToolbarId ShellId;
+
+template <class ShellType> class ShellFactory
+{
+public:
+ /** This abstract virtual class needs a destructor so that the
+ destructors of derived classes are called.
+ */
+ virtual ~ShellFactory(){};
+
+ /** Create a new instance of a view shell for the given id that will
+ be stacked onto the given view shell base.
+ @return
+ Return the new view shell or NULL when a creation is not
+ possible.
+ */
+ virtual ShellType* CreateShell(ShellId nId) = 0;
+
+ /** Tell the factory that a shell is no longer in use. It may destroy
+ it or put it for future use in a cache.
+ */
+ virtual void ReleaseShell(ShellType* pShell) = 0;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/SlideSorter.hxx b/sd/source/ui/inc/SlideSorter.hxx
new file mode 100644
index 000000000..9ed70cf9b
--- /dev/null
+++ b/sd/source/ui/inc/SlideSorter.hxx
@@ -0,0 +1,248 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <cppuhelper/weakref.hxx>
+#include <vcl/scrbar.hxx>
+#include <sddllapi.h>
+#include <memory>
+
+namespace vcl { class Window; }
+namespace com::sun::star::frame { class XController; }
+namespace rtl { template <class reference_type> class Reference; }
+
+namespace sd {
+class ViewShell;
+class ViewShellBase;
+class Window;
+class FuPoor;
+}
+
+namespace sd::slidesorter::model { class SlideSorterModel; }
+
+namespace sd::slidesorter::view {
+ class SlideSorterView;
+ class Theme;
+}
+
+namespace sd::slidesorter::controller {
+ class SlideSorterController;
+ class SlotManager;
+ class Properties;
+}
+
+namespace sd::slidesorter {
+
+/** Show previews for all the slides in a document and allow the user to
+ insert or delete slides and modify the order of the slides.
+
+ This class is a facade for the model, view, and controller classes.
+ It is a hub that allows access to the various parts of a slide sorter.
+
+ Note that this class is not in its final state.
+*/
+class SlideSorter final
+{
+ friend class controller::SlotManager;
+public:
+ ~SlideSorter();
+
+ /// Forbid copy construction and copy assignment
+ SlideSorter(const SlideSorter&) = delete;
+ SlideSorter& operator=(const SlideSorter&) = delete;
+
+ /** Return whether the called SlideSorter object is valid and calling
+ its Get(Model,View,Controller) methods is safe. When <FALSE/> is
+ called then no other methods should be called.
+ Calling this method should be necessary only during startup and
+ shutdown (when that can be detected).
+ */
+ bool IsValid() const { return mbIsValid;}
+
+ /** Create a new slide sorter that is strongly coupled to the given view
+ shell. Use this function for a slide sorter in the left pane.
+ @param rViewShell
+ Typically a SlideSorterViewShell object.
+ @param rpContentWindow
+ Typically the content window of the ViewShell.
+ @param rpHorizontalScrollBar
+ Typically the horizontal scroll bar of the ViewShell.
+ @param rpVerticalScrollBar
+ Typically the vertical scroll bar of the ViewShell.
+ @param rpScrollBarBox
+ The little square enclosed by the two scroll bars. Typically
+ the one from the ViewShell.
+ */
+ static std::shared_ptr<SlideSorter> CreateSlideSorter (
+ ViewShell& rViewShell,
+ sd::Window* pContentWindow,
+ ScrollBar* pHorizontalScrollBar,
+ ScrollBar* pVerticalScrollBar,
+ ScrollBarBox* pScrollBarBox);
+
+ /** Create a new slide sorter that is loosely coupled to the given view
+ shell. The view shell may even be missing.
+ @param rBase
+ ViewShellBase object of the enclosing application.
+ @param pViewShell
+ Supply when at hand.
+ @param rParentWindow
+ The parent window of the internally created content window and
+ scroll bars.
+ */
+ static std::shared_ptr<SlideSorter> CreateSlideSorter (
+ ViewShellBase& rBase,
+ vcl::Window& rParentWindow);
+
+ /** Return the control of the vertical scroll bar.
+ */
+ const VclPtr<ScrollBar>& GetVerticalScrollBar() const { return mpVerticalScrollBar;}
+
+ /** Return the control of the horizontal scroll bar.
+ */
+ const VclPtr<ScrollBar>& GetHorizontalScrollBar() const { return mpHorizontalScrollBar;}
+
+ /** Return the scroll bar filler that paints the little square that is
+ enclosed by the two scroll bars.
+ */
+ const VclPtr<ScrollBarBox>& GetScrollBarFiller (void) const { return mpScrollBarBox;}
+
+ /** Return the content window. This is a sibling and is geometrically
+ enclosed by the scroll bars.
+ */
+ const VclPtr<sd::Window>& GetContentWindow() const { return mpContentWindow;}
+
+ model::SlideSorterModel& GetModel() const;
+
+ view::SlideSorterView& GetView() const;
+
+ // Exported for unit test
+ SD_DLLPUBLIC controller::SlideSorterController& GetController() const;
+
+ /** Return the view shell that was given at construction.
+ @return
+ May be empty.
+ */
+ ViewShell* GetViewShell() const { return mpViewShell;}
+
+ /** Return the XController object of the main view.
+ */
+ css::uno::Reference<css::frame::XController>
+ GetXController() const;
+
+ /** Return the ViewShellBase object.
+ @return
+ May be empty.
+ */
+ ViewShellBase* GetViewShellBase() const { return mpViewShellBase;}
+
+ void Paint (const ::tools::Rectangle& rRepaintArea);
+
+ /** Place and size the controls and windows. You may want to call this
+ method when something has changed that for instance affects the
+ visibility state of the scroll bars.
+ */
+ void ArrangeGUIElements (
+ const Point& rOffset,
+ const Size& rSize);
+
+ void RelocateToWindow (vcl::Window* pWindow);
+
+ /** Set the current function at the view shell or, when it is not
+ present, set it at the content window. This method supports the use
+ of functions even when there is no SlideSorterViewShell.
+ */
+ void SetCurrentFunction (const rtl::Reference<FuPoor>& rpFunction);
+
+ /** Return a collection of properties that are used throughout the slide
+ sorter.
+ */
+ std::shared_ptr<controller::Properties> const & GetProperties() const;
+
+ /** Return the active theme which gives access to colors and fonts.
+ */
+ std::shared_ptr<view::Theme> const & GetTheme() const;
+
+private:
+ /** This virtual method makes it possible to create a specialization of
+ the slide sorter view shell that works with its own implementation
+ of model, view, and controller. The default implementation simply
+ calls the CreateModel(), CreateView(), and CreateController()
+ methods in this order.
+ */
+ void CreateModelViewController();
+
+ /** Create the model for the view shell. When called from the default
+ implementation of CreateModelViewController() then neither view nor
+ controller do exist. Test their pointers when in doubt.
+ */
+ model::SlideSorterModel* CreateModel();
+
+ bool mbIsValid;
+
+ std::unique_ptr<controller::SlideSorterController> mpSlideSorterController;
+ std::unique_ptr<model::SlideSorterModel> mpSlideSorterModel;
+ std::unique_ptr<view::SlideSorterView> mpSlideSorterView;
+ css::uno::WeakReference<css::frame::XController> mxControllerWeak;
+ ViewShell* mpViewShell;
+ ViewShellBase* mpViewShellBase;
+ VclPtr<sd::Window> mpContentWindow;
+ VclPtr<ScrollBar> mpHorizontalScrollBar;
+ VclPtr<ScrollBar> mpVerticalScrollBar;
+ VclPtr<ScrollBarBox> mpScrollBarBox;
+
+ /** Some slide sorter wide properties that are used in different
+ classes.
+ */
+ std::shared_ptr<controller::Properties> mpProperties;
+ std::shared_ptr<view::Theme> mpTheme;
+
+ SlideSorter (
+ ViewShell& rViewShell,
+ sd::Window* pContentWindow,
+ ScrollBar* pHorizontalScrollBar,
+ ScrollBar* pVerticalScrollBar,
+ ScrollBarBox* pScrollBarBox);
+ SlideSorter (
+ ViewShellBase& rBase,
+ vcl::Window& rParentWindow);
+
+ void Init();
+ /** Create the controls for the slide sorter. This are the tab bar
+ for switching the edit mode, the scroll bar, and the actual
+ slide sorter view window.
+ This method is usually called exactly one time from the
+ constructor.
+ */
+ void SetupControls();
+
+ /** This method is usually called exactly one time from the
+ constructor.
+ */
+ void SetupListeners();
+
+ /** Release the listeners that have been installed in SetupListeners().
+ */
+ void ReleaseListeners();
+};
+
+} // end of namespace ::sd::slidesorter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/SlideSorterViewShell.hxx b/sd/source/ui/inc/SlideSorterViewShell.hxx
new file mode 100644
index 000000000..64808d434
--- /dev/null
+++ b/sd/source/ui/inc/SlideSorterViewShell.hxx
@@ -0,0 +1,232 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "ViewShell.hxx"
+#include <glob.hxx>
+#include <sfx2/shell.hxx>
+#include <sddllapi.h>
+#include <memory>
+#include <vector>
+
+namespace sd::slidesorter::controller { class SlotManager; }
+
+namespace sd::slidesorter {
+
+class SlideSorter;
+
+class SAL_DLLPUBLIC_RTTI SlideSorterViewShell final
+ : public ViewShell
+{
+ friend class controller::SlotManager;
+
+public:
+ SFX_DECL_INTERFACE(SD_IF_SDSLIDESORTERVIEWSHELL)
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+public:
+ static std::shared_ptr<SlideSorterViewShell> Create(
+ SfxViewFrame* pFrame,
+ ViewShellBase& rViewShellBase,
+ vcl::Window* pParentWindow,
+ FrameView* pFrameView);
+
+ virtual ~SlideSorterViewShell() override;
+
+ /** Late initialization that has to be called after a new instance has
+ completed its construction.
+ */
+ virtual void Init (bool bIsMainViewShell) override;
+
+ /** Return a slide sorter that is currently displayed in one of the
+ panes that belong to the given ViewShellBase object.
+ When there is only one slide sorter visible then that one is
+ returned. When two (or more) are visible then the one in the center
+ pane is returned. When no slidesorter is visible then NULL is
+ returned.
+ */
+ // Exported for unit test
+ SD_DLLPUBLIC static SlideSorterViewShell* GetSlideSorter(ViewShellBase& rBase);
+
+ virtual SdPage* GetActualPage() override;
+
+ /// inherited from sd::ViewShell
+ virtual SdPage* getCurrentPage() const override;
+
+ void ExecCtrl (SfxRequest& rRequest);
+ void GetCtrlState (SfxItemSet &rSet);
+ void FuSupport (SfxRequest& rRequest);
+ void FuTemporary (SfxRequest& rRequest);
+ void GetStatusBarState (SfxItemSet& rSet);
+ void FuPermanent (SfxRequest& rRequest);
+ void GetAttrState (SfxItemSet& rSet);
+ static void ExecStatusBar (SfxRequest& rRequest);
+ virtual void Command (const CommandEvent& rEvent, ::sd::Window* pWindow) override;
+ void GetMenuState (SfxItemSet &rSet);
+ void GetClipboardState (SfxItemSet &rSet);
+
+ virtual void ReadFrameViewData (FrameView* pView) override;
+ virtual void WriteFrameViewData() override;
+
+ /** Set the zoom factor. The given value is clipped against an upper
+ bound.
+ @param nZoom
+ An integer percent value, i.e. nZoom/100 is the actual zoom
+ factor.
+ */
+ virtual void SetZoom (::tools::Long nZoom) override;
+ virtual void SetZoomRect (const ::tools::Rectangle& rZoomRect) override;
+
+ /** This is a callback method used by the active window to delegate its
+ Paint() call to. This view shell itself delegates it to the view.
+ */
+ virtual void Paint(const ::tools::Rectangle& rRect, ::sd::Window* pWin) override;
+
+ /** Place and size the controls and windows. You may want to call this
+ method when something has changed that for instance affects the
+ visibility state of the scroll bars.
+ */
+ virtual void ArrangeGUIElements() override;
+
+ virtual void Activate (bool IsMDIActivate) override;
+ virtual void Deactivate (bool IsMDIActivate) override;
+
+ /** Move slides up and down. Mainly uno commands. */
+ void ExecMovePageUp (SfxRequest& rReq);
+ void GetStateMovePageUp (SfxItemSet& rSet);
+
+ void ExecMovePageDown (SfxRequest& rReq);
+ void GetStateMovePageDown (SfxItemSet& rSet);
+
+ void ExecMovePageFirst (SfxRequest& rReq);
+ void GetStateMovePageFirst (SfxItemSet& rSet);
+
+ void ExecMovePageLast (SfxRequest& rReq);
+ void GetStateMovePageLast (SfxItemSet& rSet);
+
+
+ //===== Drag and Drop =====================================================
+
+ void StartDrag (
+ const Point& rDragPt,
+ vcl::Window* pWindow );
+ virtual sal_Int8 AcceptDrop (
+ const AcceptDropEvent& rEvt,
+ DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer ) override;
+ virtual sal_Int8 ExecuteDrop (
+ const ExecuteDropEvent& rEvt,
+ DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer) override;
+
+ typedef ::std::vector<SdPage*> PageSelection;
+
+ /** Return the set of selected pages.
+ */
+ std::shared_ptr<PageSelection> GetPageSelection() const;
+
+ void SetPageSelection (const std::shared_ptr<PageSelection>& rSelection);
+
+ /** Add a listener that is called when the selection of the slide sorter
+ changes.
+ @param rListener
+ When this method is called multiple times for the same listener
+ the second and all following calls are ignored. Each listener
+ is added only once.
+ */
+ void AddSelectionChangeListener (const Link<LinkParamNone*,void>& rListener);
+
+ /** Remove a listener that was called when the selection of the slide
+ sorter changes.
+ @param rListener
+ It is safe to pass a listener that was not added are has been
+ removed previously. Such calls are ignored.
+ */
+ void RemoveSelectionChangeListener (const Link<LinkParamNone*,void>& rListener);
+
+ virtual css::uno::Reference<css::drawing::XDrawSubController> CreateSubController() override;
+
+ /** Create an accessible object representing the specified window.
+ @param pWindow
+ The returned object makes the document displayed in this window
+ accessible.
+ @return
+ Returns an <type>AccessibleSlideSorterView</type> object.
+ */
+ virtual css::uno::Reference<css::accessibility::XAccessible>
+ CreateAccessibleDocumentView (::sd::Window* pWindow) override;
+ // handle SlideSorterView specially because AccessibleSlideSorterView doesn't inherit from AccessibleDocumentViewBase
+ virtual void SwitchViewFireFocus( const css::uno::Reference< css::accessibility::XAccessible >& xAcc ) override;
+
+ // Exported for unit test
+ SD_DLLPUBLIC SlideSorter& GetSlideSorter() const;
+
+ /** Try to relocate all toplevel window elements to the given parent
+ window.
+ */
+ virtual bool RelocateToParentWindow (vcl::Window* pParentWindow) override;
+
+private:
+
+ /** Override this method to handle a missing tool bar correctly.
+ This is the case when the slide sorter is not the main view shell.
+ */
+ virtual SfxUndoManager* ImpGetUndoManager() const override;
+
+ std::shared_ptr<SlideSorter> mpSlideSorter;
+ bool mbIsArrangeGUIElementsPending;
+
+ SlideSorterViewShell (
+ SfxViewFrame* pFrame,
+ ViewShellBase& rViewShellBase,
+ vcl::Window* pParentWindow,
+ FrameView* pFrameView);
+ void Initialize();
+
+ /** This method overwrites the one from our base class: We do our own
+ scroll bar and the base class call is thus unnecessary. It simply
+ calls UpdateScrollBars(false).
+ */
+ virtual void UpdateScrollBars() override;
+
+ void PostMoveSlidesActions(const std::shared_ptr<SlideSorterViewShell::PageSelection> &rpSelection);
+
+ void MainViewEndEditAndUnmarkAll();
+
+ /** Select the same pages in the document as are selected in the
+ SlideSorterViewShell
+
+ return the page numbers of the first and last selected pages
+ */
+ std::pair<sal_uInt16, sal_uInt16> SyncPageSelectionToDocument(const std::shared_ptr<SlideSorterViewShell::PageSelection> &rpSelection);
+};
+
+typedef std::shared_ptr<SlideSorterViewShell::PageSelection> SharedPageSelection;
+
+} // end of namespace ::sd::slidesorter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/SlideSorterViewShellBase.hxx b/sd/source/ui/inc/SlideSorterViewShellBase.hxx
new file mode 100644
index 000000000..e1ca1b57b
--- /dev/null
+++ b/sd/source/ui/inc/SlideSorterViewShellBase.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "ImpressViewShellBase.hxx"
+
+namespace sd
+{
+/** This class exists to be able to register a factory that creates a
+ slide sorter view shell as default.
+*/
+class SlideSorterViewShellBase final : public ImpressViewShellBase
+{
+public:
+ SFX_DECL_VIEWFACTORY(SlideSorterViewShellBase);
+
+ /** This constructor is used by the view factory of the SFX
+ macros.
+ */
+ SlideSorterViewShellBase(SfxViewFrame* pFrame, SfxViewShell* pOldShell);
+ virtual ~SlideSorterViewShellBase() override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/SlideTransitionPane.hxx b/sd/source/ui/inc/SlideTransitionPane.hxx
new file mode 100644
index 000000000..2b6ea8f93
--- /dev/null
+++ b/sd/source/ui/inc/SlideTransitionPane.hxx
@@ -0,0 +1,137 @@
+/* -*- 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 .
+ */
+#pragma once
+
+#include "SlideSorterViewShell.hxx"
+
+#include <svtools/valueset.hxx>
+#include <sfx2/sidebar/ILayoutableWindow.hxx>
+#include <sfx2/sidebar/PanelLayout.hxx>
+#include <vcl/weld.hxx>
+
+#include <vector>
+#include <map>
+
+class SdDrawDocument;
+
+namespace com::sun::star::drawing { class XDrawView; }
+namespace com::sun::star::frame { class XModel; }
+namespace sd::tools { class EventMultiplexerEvent; }
+
+namespace sd
+{
+
+class TransitionPane;
+class ViewShellBase;
+
+namespace impl
+{
+ struct TransitionEffect;
+}
+
+class SlideTransitionPane final : public PanelLayout
+ , public sfx2::sidebar::ILayoutableWindow
+{
+public:
+ explicit SlideTransitionPane(
+ weld::Widget* pParent,
+ ViewShellBase & rBase);
+ virtual ~SlideTransitionPane() override;
+
+ // ILayoutableWindow
+ virtual css::ui::LayoutSize GetHeightForWidth (const sal_Int32 nWidth) override;
+
+ void onSelectionChanged();
+ void onChangeCurrentPage();
+
+private:
+ void updateControls();
+ void updateControlState();
+ void updateVariants(size_t nPresetOffset);
+
+ void updateSoundList();
+ void openSoundFileDialog();
+
+ impl::TransitionEffect getTransitionEffectFromControls() const;
+
+ void applyToSelectedPages(bool bPreview);
+ void playCurrentEffect();
+
+ void addListener();
+ void removeListener();
+
+ ::sd::slidesorter::SharedPageSelection getSelectedPages() const;
+
+ void Initialize(SdDrawDocument* pDoc);
+
+ DECL_LINK( ApplyToAllButtonClicked, weld::Button&, void );
+ DECL_LINK( PlayButtonClicked, weld::Button&, void );
+ DECL_LINK( AutoPreviewClicked, weld::Toggleable&, void );
+
+ DECL_LINK( TransitionSelected, ValueSet*, void );
+ DECL_LINK( AdvanceSlideRadioButtonToggled, weld::Toggleable&, void );
+ DECL_LINK( AdvanceTimeModified, weld::MetricSpinButton&, void );
+ DECL_LINK( VariantListBoxSelected, weld::ComboBox&, void );
+ DECL_LINK( DurationModifiedHdl, weld::MetricSpinButton&, void );
+ DECL_LINK( DurationLoseFocusHdl, weld::Widget&, void );
+ DECL_LINK( SoundListBoxSelected, weld::ComboBox&, void );
+ DECL_LINK( LoopSoundBoxChecked, weld::Toggleable&, void );
+ DECL_LINK( EventMultiplexerListener, tools::EventMultiplexerEvent&, void );
+ DECL_LINK(LateInitCallback, Timer *, void);
+
+ ViewShellBase & mrBase;
+ SdDrawDocument * mpDrawDoc;
+
+ std::unique_ptr<TransitionPane> mxVS_TRANSITION_ICONS;
+ std::unique_ptr<weld::CustomWeld> mxVS_TRANSITION_ICONSWin;
+ std::unique_ptr<weld::Label> mxFT_VARIANT;
+ std::unique_ptr<weld::ComboBox> mxLB_VARIANT;
+ std::unique_ptr<weld::Label> mxFT_duration;
+ std::unique_ptr<weld::MetricSpinButton> mxCBX_duration;
+ std::unique_ptr<weld::Label> mxFT_SOUND;
+ std::unique_ptr<weld::ComboBox> mxLB_SOUND;
+ std::unique_ptr<weld::CheckButton> mxCB_LOOP_SOUND;
+ std::unique_ptr<weld::RadioButton> mxRB_ADVANCE_ON_MOUSE;
+ std::unique_ptr<weld::RadioButton> mxRB_ADVANCE_AUTO;
+ std::unique_ptr<weld::MetricSpinButton> mxMF_ADVANCE_AUTO_AFTER;
+ std::unique_ptr<weld::Button> mxPB_APPLY_TO_ALL;
+ std::unique_ptr<weld::Button> mxPB_PLAY;
+ std::unique_ptr<weld::CheckButton> mxCB_AUTO_PREVIEW;
+
+ css::uno::Reference< css::drawing::XDrawView > mxView;
+ css::uno::Reference< css::frame::XModel > mxModel;
+
+ bool mbHasSelection;
+ bool mbUpdatingControls;
+ bool mbIsMainViewChangePending;
+
+ std::vector<OUString> maSoundList;
+ mutable OUString maCurrentSoundFile;
+
+ // How many variants each transition set has
+ std::map< OUString, int > m_aNumVariants;
+
+ Timer maLateInitTimer;
+};
+
+} // namespace sd
+
+// INCLUDED_SD_SOURCE_UI_ANIMATIONS_SLIDETRANSITIONPANE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/SpellDialogChildWindow.hxx b/sd/source/ui/inc/SpellDialogChildWindow.hxx
new file mode 100644
index 000000000..3d2163a7e
--- /dev/null
+++ b/sd/source/ui/inc/SpellDialogChildWindow.hxx
@@ -0,0 +1,86 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svx/SpellDialogChildWindow.hxx>
+#include <svl/lstner.hxx>
+
+class SdOutliner;
+
+namespace sd
+{
+/** This derivation of the svx::SpellDialogChildWindow base class
+ provides Draw and Impress specific implementations of
+ GetNextWrongSentence() and ApplyChangedSentence().
+*/
+class SpellDialogChildWindow final : public svx::SpellDialogChildWindow, public SfxListener
+{
+public:
+ SpellDialogChildWindow(vcl::Window* pParent, sal_uInt16 nId, SfxBindings* pBindings,
+ SfxChildWinInfo* pInfo);
+ virtual ~SpellDialogChildWindow() override;
+
+ /** This method makes the one from the base class public so that
+ it can be called from the view shell when one is created.
+ */
+ void InvalidateSpellDialog();
+
+ // SfxListener
+ virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
+
+ SFX_DECL_CHILDWINDOW_WITHID(SpellDialogChildWindow);
+
+private:
+ /** Iterate over the sentences in all text shapes and stop at the
+ next sentence with spelling errors. While doing so the view
+ mode may be changed and text shapes are set into edit mode.
+ */
+ virtual svx::SpellPortions GetNextWrongSentence(bool bRecheck) override;
+
+ /** This method is responsible for merging corrections made in the
+ spelling dialog back into the document.
+ */
+ virtual void ApplyChangedSentence(const svx::SpellPortions& rChanged, bool bRecheck) override;
+ virtual void GetFocus() override;
+ virtual void LoseFocus() override;
+
+ /** This outliner is used to do the main work of iterating over a
+ document and finding sentences with spelling errors.
+ */
+ SdOutliner* mpSdOutliner;
+
+ /** When this flag is <TRUE/> then eventually we have to destroy
+ the outliner in mpSdOutliner.
+ */
+ bool mbOwnOutliner;
+
+ /** Provide an outliner in the mpSdOutliner data member. When the
+ view shell has changed since the last call this include the
+ deletion/release of formerly created/obtained one prior to
+ construction/obtaining of a new one.
+ */
+ void ProvideOutliner();
+
+ void EndSpellingAndClearOutliner();
+};
+
+} // end of namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/TabControl.hxx b/sd/source/ui/inc/TabControl.hxx
new file mode 100644
index 000000000..5e5eba7bb
--- /dev/null
+++ b/sd/source/ui/inc/TabControl.hxx
@@ -0,0 +1,107 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svtools/tabbar.hxx>
+#include <vcl/transfer.hxx>
+
+namespace sd {
+
+/**
+ * TabControl-Class for page switch
+ */
+
+class DrawViewShell;
+
+class TabControl final
+ : public TabBar,
+ public DragSourceHelper,
+ public DropTargetHelper
+{
+public:
+ TabControl (DrawViewShell* pDrViewSh, vcl::Window* pParent);
+ virtual void dispose() override;
+ virtual ~TabControl() override;
+
+ /** Inform all listeners of this control that the current page has been
+ activated. Call this method after switching the current page and is
+ not done elsewhere (like when using page up/down keys).
+ */
+ void SendActivatePageEvent();
+
+ /** Inform all listeners of this control that the current page has been
+ deactivated. Call this method before switching the current page and
+ is not done elsewhere (like when using page up/down keys).
+ */
+ void SendDeactivatePageEvent();
+
+private:
+ DrawViewShell* pDrViewSh;
+ bool bInternalMove;
+
+ // TabBar
+ virtual void Select() override;
+ virtual void DoubleClick() override;
+ virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
+
+ virtual void Command(const CommandEvent& rCEvt) override;
+
+ virtual bool StartRenaming() override;
+ virtual TabBarAllowRenamingReturnCode AllowRenaming() override;
+ virtual void EndRenaming() override;
+
+ virtual void ActivatePage() override;
+ virtual bool DeactivatePage() override;
+
+ // DragSourceHelper
+ virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel ) override;
+
+ // DropTargetHelper
+ virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override;
+ virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override;
+
+ // nested class to implement the TransferableHelper
+ class TabControlTransferable final : public TransferableHelper
+ {
+ public:
+ explicit TabControlTransferable( TabControl& rParent ) :
+ mrParent( rParent ) {}
+ private:
+
+ TabControl& mrParent;
+
+ virtual ~TabControlTransferable() override;
+
+ virtual void AddSupportedFormats() override;
+ virtual bool GetData( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) override;
+ virtual void DragFinished( sal_Int8 nDropAction ) override;
+
+ };
+
+ friend class TabControl::TabControlTransferable;
+
+ void DragFinished();
+
+ using TabBar::StartDrag;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/TableDesignPane.hxx b/sd/source/ui/inc/TableDesignPane.hxx
new file mode 100644
index 000000000..042eb6137
--- /dev/null
+++ b/sd/source/ui/inc/TableDesignPane.hxx
@@ -0,0 +1,118 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svtools/valueset.hxx>
+#include <sfx2/sidebar/ILayoutableWindow.hxx>
+#include <sfx2/sidebar/PanelLayout.hxx>
+#include <vcl/weld.hxx>
+
+namespace com::sun::star::beans { class XPropertySet; }
+namespace com::sun::star::container { class XIndexAccess; }
+namespace com::sun::star::drawing { class XDrawView; }
+
+namespace sd
+{
+
+namespace tools {
+class EventMultiplexerEvent;
+}
+
+class ViewShellBase;
+
+enum TableCheckBox : sal_uInt16
+{
+ CB_HEADER_ROW = 0,
+ CB_TOTAL_ROW = 1,
+ CB_BANDED_ROWS = 2,
+ CB_FIRST_COLUMN = 3,
+ CB_LAST_COLUMN = 4,
+ CB_BANDED_COLUMNS = 5,
+ CB_COUNT = CB_BANDED_COLUMNS + 1
+};
+
+class TableValueSet final : public ValueSet
+{
+private:
+ bool m_bModal;
+public:
+ TableValueSet(std::unique_ptr<weld::ScrolledWindow> pScrolledWindow);
+ virtual void Resize() override;
+ virtual void StyleUpdated() override;
+ void updateSettings();
+ void setModal(bool bModal) { m_bModal = bModal; }
+};
+
+class TableDesignWidget final
+{
+public:
+ TableDesignWidget(weld::Builder& rBuilder, ViewShellBase& rBase);
+ ~TableDesignWidget();
+
+ // callbacks
+ void onSelectionChanged();
+
+ void ApplyOptions();
+ void ApplyStyle();
+
+private:
+ void addListener();
+ void removeListener();
+ void updateControls();
+
+ void FillDesignPreviewControl();
+
+ DECL_LINK(EventMultiplexerListener, tools::EventMultiplexerEvent&, void);
+ DECL_LINK(implValueSetHdl, ValueSet*, void);
+ DECL_LINK(implCheckBoxHdl, weld::Toggleable&, void);
+
+ ViewShellBase& mrBase;
+
+ std::unique_ptr<TableValueSet> m_xValueSet;
+ std::unique_ptr<weld::CustomWeld> m_xValueSetWin;
+ std::unique_ptr<weld::CheckButton> m_aCheckBoxes[CB_COUNT];
+
+ css::uno::Reference< css::beans::XPropertySet > mxSelectedTable;
+ css::uno::Reference< css::drawing::XDrawView > mxView;
+ css::uno::Reference< css::container::XIndexAccess > mxTableFamily;
+};
+
+class TableDesignPane final : public PanelLayout
+ , public sfx2::sidebar::ILayoutableWindow
+{
+private:
+ std::unique_ptr<TableDesignWidget> m_xImpl;
+public:
+ TableDesignPane( weld::Widget* pParent, ViewShellBase& rBase )
+ : PanelLayout(pParent, "TableDesignPanel",
+ "modules/simpress/ui/tabledesignpanel.ui")
+ , m_xImpl(new TableDesignWidget(*m_xBuilder, rBase))
+ {
+ }
+ virtual css::ui::LayoutSize GetHeightForWidth(const sal_Int32 /*nWidth*/) override
+ {
+ sal_Int32 nMinimumHeight = get_preferred_size().Height();
+ return css::ui::LayoutSize(nMinimumHeight, -1, nMinimumHeight);
+ }
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/TemplateScanner.hxx b/sd/source/ui/inc/TemplateScanner.hxx
new file mode 100644
index 000000000..034f000a6
--- /dev/null
+++ b/sd/source/ui/inc/TemplateScanner.hxx
@@ -0,0 +1,175 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "tools/AsynchronousTask.hxx"
+#include <ucbhelper/content.hxx>
+#include <com/sun/star/uno/Reference.h>
+
+#include <memory>
+#include <vector>
+
+namespace com::sun::star::ucb
+{
+class XContent;
+class XCommandEnvironment;
+}
+
+namespace com::sun::star::sdbc
+{
+class XResultSet;
+}
+
+namespace sd
+{
+/** Representation of a template or layout file.
+*/
+class TemplateEntry
+{
+public:
+ TemplateEntry(const OUString& rsTitle, const OUString& rsPath)
+ : msTitle(rsTitle)
+ , msPath(rsPath)
+ {
+ }
+
+ OUString msTitle;
+ OUString msPath;
+};
+
+/** This class scans the template folders for impress templates. There are
+ two ways to use this class.
+ 1. The old and deprecated way is to call Scan() to scan all templates
+ and collect the supported ones in a tree structure. This structure is
+ returned by GetFolderList().
+ 2. The new way implements the AsynchronousTask interface. Call
+ RunNextStep() as long HasNextStep() returns <TRUE/>. After every step
+ GetLastAddedEntry() returns the template that was scanned (and has a
+ supported format) last. When a step does not add a new template then
+ the value of the previous step is returned.
+*/
+class TemplateScanner final : public ::sd::tools::AsynchronousTask
+{
+public:
+ /** Create a new template scanner and prepare but do not execute the scanning.
+ */
+ TemplateScanner();
+
+ /** The destructor deletes any remaining entries of the local list of
+ templates.
+ */
+ virtual ~TemplateScanner();
+
+ /** Implementation of the AsynchronousTask interface method.
+ */
+ virtual void RunNextStep() override;
+
+ /** Implementation of the AsynchronousTask interface method.
+ */
+ virtual bool HasNextStep() override;
+
+ /** Return the TemplateDir object that was last added to
+ mpTemplateEntries.
+ @return
+ <nullptr/> is returned either before the template scanning is
+ started or after it has ended.
+ */
+ const TemplateEntry* GetLastAddedEntry() const
+ {
+ return mpTemplateEntries.empty() ? nullptr : mpTemplateEntries.back().get();
+ }
+
+private:
+ /** The current state determines which step will be executed next by
+ RunNextStep().
+ */
+ enum State
+ {
+ INITIALIZE_SCANNING,
+ INITIALIZE_FOLDER_SCANNING,
+ GATHER_FOLDER_LIST,
+ SCAN_FOLDER,
+ INITIALIZE_ENTRY_SCAN,
+ SCAN_ENTRY,
+ DONE,
+ ERROR
+ };
+ State meState;
+
+ ::ucbhelper::Content maFolderContent;
+ ::std::vector<std::unique_ptr<TemplateEntry>> mpTemplateEntries;
+
+ /** The folders that are collected by GatherFolderList().
+ */
+ class FolderDescriptorList;
+ std::unique_ptr<FolderDescriptorList> mpFolderDescriptors;
+
+ /** Set of state variables used by the methods
+ InitializeFolderScanning(), GatherFolderList(), ScanFolder(),
+ InitializeEntryScanning(), and ScanEntry().
+ */
+ css::uno::Reference<css::ucb::XContent> mxTemplateRoot;
+ css::uno::Reference<css::ucb::XCommandEnvironment> mxFolderEnvironment;
+ css::uno::Reference<css::ucb::XCommandEnvironment> mxEntryEnvironment;
+ css::uno::Reference<css::sdbc::XResultSet> mxFolderResultSet;
+ css::uno::Reference<css::sdbc::XResultSet> mxEntryResultSet;
+
+ /** Obtain the root folder of the template folder hierarchy. The result
+ is stored in mxTemplateRoot for later use.
+ */
+ State GetTemplateRoot();
+
+ /** Initialize the scanning of folders. This is called exactly once.
+ @return
+ Returns one of the two states ERROR or GATHER_FOLDER_LIST.
+ */
+ State InitializeFolderScanning();
+
+ /** Collect all available top-level folders in an ordered list which can
+ then be processed by ScanFolder().
+ @return
+ Returns one of the two states ERROR or SCAN_FOLDER.
+ */
+ State GatherFolderList();
+
+ /** From the list of top-level folders collected by GatherFolderList()
+ the one with highest priority is processed.
+ @return
+ Returns one of the states ERROR, DONE, or INITIALIZE_ENTRY_SCAN.
+ */
+ State ScanFolder();
+
+ /** Initialize the scanning of entries of a top-level folder.
+ @return
+ Returns one of the states ERROR or SCAN_ENTRY.
+ */
+ State InitializeEntryScanning();
+
+ /** Scan one entry. When this entry matches the recognized template
+ types it is appended to the result set.
+ @return
+ Returns one of the states ERROR, SCAN_ENTRY, or SCAN_FOLDER.
+ */
+ State ScanEntry();
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/TextObjectBar.hxx b/sd/source/ui/inc/TextObjectBar.hxx
new file mode 100644
index 000000000..61394834f
--- /dev/null
+++ b/sd/source/ui/inc/TextObjectBar.hxx
@@ -0,0 +1,58 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/shell.hxx>
+#include <glob.hxx>
+
+namespace sd {
+
+class View;
+class ViewShell;
+
+class TextObjectBar final
+ : public SfxShell
+{
+public:
+ SFX_DECL_INTERFACE(SD_IF_SDDRAWTEXTOBJECTBAR)
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+public:
+ TextObjectBar (
+ ViewShell* pSdViewShell,
+ SfxItemPool& rItemPool,
+ ::sd::View* pSdView);
+ virtual ~TextObjectBar() override;
+
+ void GetAttrState( SfxItemSet& rSet );
+ void GetCharState( SfxItemSet& rSet );
+ void Execute( SfxRequest &rReq );
+
+private:
+ ViewShell* mpViewShell;
+ ::sd::View* mpView;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/ToolBarManager.hxx b/sd/source/ui/inc/ToolBarManager.hxx
new file mode 100644
index 000000000..45f4532fb
--- /dev/null
+++ b/sd/source/ui/inc/ToolBarManager.hxx
@@ -0,0 +1,273 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "ShellFactory.hxx"
+#include <rtl/ustring.hxx>
+
+#include <sal/types.h>
+#include <memory>
+
+class SdrView;
+namespace sd { class ViewShell; }
+namespace sd::tools { class EventMultiplexer; }
+
+namespace sd {
+
+class ViewShellBase;
+class ViewShellManager;
+
+/** Manage the set of visible tool bars (and object bars). Usually they
+ belong to the current view in the center pane.
+
+ Tool bars are managed in groups. Each group can be set, reset, or
+ modified independently of the others. This allows for instance to
+ replace the toolbars associated with the current function independently
+ from those associated with the main view.
+
+ The ToolBarManager has two high level methods which contain the
+ knowledge about which tool bars to show in a specific context.
+ When the view in the center pane changes then MainViewShellChanged()
+ sets up the tool bars for the new view. On changes of the selection the
+ SelectionHasChanged() method shows the tool bars for the new context.
+
+ The update of the actually visible tool bars to the set currently
+ required by the main view shell and its functions is divided into two
+ parts, PreUpdate() and PostUpdate(). This are to be called before
+ respectively after the update of the view shell stack. The reason for
+ this is to save time by not updating tool bars that will not be visible
+ in a short time on a view shell switch.
+*/
+class ToolBarManager
+ : public std::enable_shared_from_this<ToolBarManager>
+{
+public:
+ /** Use this method instead of the constructor to create new objects of
+ this class.
+ */
+ static std::shared_ptr<ToolBarManager> Create (
+ ViewShellBase& rBase,
+ const std::shared_ptr<tools::EventMultiplexer>& rpMultiplexer,
+ const std::shared_ptr<ViewShellManager>& rpViewShellManager);
+
+ ~ToolBarManager();
+
+ /** Call this method prior to the destructor to prevent the
+ ToolBarManager from accessing the ViewShellManager or the
+ XLayoutManager when those are possibly not well and alive anymore
+ (like during the destruction of the ViewShellBase.)
+ */
+ void Shutdown();
+
+ /** When the view in the center pane changes then this method sets up
+ the initial set of tool bars for the new view.
+ The ToolBarManager listens for view switching itself and then calls
+ MainViewShellChanged(). Calling this method from the outside should
+ not be necessary.
+ @param nShellType
+ The type of the new main view shell.
+ */
+ void MainViewShellChanged ();
+ void MainViewShellChanged (const ViewShell& rMainViewShell);
+
+ /** Call this method when the selection has changed to update the more
+ temporary tool bars (those in the ToolBarGroup::Function group.)
+ */
+ void SelectionHasChanged (
+ const ViewShell& rViewShell,
+ const SdrView& rView);
+
+ /** The set of tool bars that are handled by this manager class.
+ */
+ constexpr static OUStringLiteral msToolBar = u"toolbar"; // Draw_Toolbox_Sd, 23011
+ constexpr static OUStringLiteral msOptionsToolBar = u"optionsbar";
+ // Draw_Options_Toolbox, 23020
+ constexpr static OUStringLiteral msCommonTaskToolBar = u"commontaskbar";
+ // Draw_CommonTask_Toolbox, 23021
+ constexpr static OUStringLiteral msViewerToolBar = u"viewerbar"; // Draw_Viewer_Toolbox, 23023
+ constexpr static OUStringLiteral msSlideSorterToolBar = u"slideviewtoolbar";
+ // Slide_Toolbox, 23012
+ constexpr static OUStringLiteral msSlideSorterObjectBar = u"slideviewobjectbar";
+ // Slide_Obj_Toolbox, 23014
+ constexpr static OUStringLiteral msOutlineToolBar = u"outlinetoolbar"; // Outline_Toolbox, 23017
+ constexpr static OUStringLiteral msMasterViewToolBar = u"masterviewtoolbar";
+ // SID_MASTERPAGE, 27053
+ constexpr static OUStringLiteral msDrawingObjectToolBar = u"drawingobjectbar";
+ // Draw_Obj_Toolbox, 23013
+ constexpr static OUStringLiteral msGluePointsToolBar = u"gluepointsobjectbar";
+ // Gluepoints_Toolbox, 23019
+ constexpr static OUStringLiteral msTextObjectBar = u"textobjectbar";
+ // Draw_Text_Toolbox_Sd, 23016
+ constexpr static OUStringLiteral msBezierObjectBar = u"bezierobjectbar";
+ // Bezier_Toolbox_Sd, 23015
+ constexpr static OUStringLiteral msGraphicObjectBar = u"graphicobjectbar";
+ // Draw_Graf_Toolbox, 23030
+ constexpr static OUStringLiteral msMediaObjectBar = u"mediaobjectbar";
+ // Draw_Media_Toolbox, 23031
+ constexpr static OUStringLiteral msTableObjectBar = u"tableobjectbar";
+ // Draw_Table_Toolbox, 23018
+
+ /** The set of tool bar groups.
+ */
+ enum class ToolBarGroup {
+ Permanent,
+ Function,
+ CommonTask,
+ MasterMode,
+ LAST = MasterMode
+ };
+
+ /** Reset the set of visible object bars in the specified group. Tool
+ bars in other groups are not affected.
+ @param rParentShell
+ When this shell is not the main view then the method returns
+ immediately.
+ @param eGroup
+ Only the tool bars in this group are rest.
+ */
+ void ResetToolBars (ToolBarGroup eGroup);
+
+ /** Reset all tool bars, regardless of the group they belong to.
+ @param rParentShell
+ When this shell is not the main view then the method returns
+ immediately.
+ */
+ void ResetAllToolBars();
+
+ /** Add the tool bar with the given name to the specified group of tool
+ bars.
+ @param rParentShell
+ When this shell is not the main view then the method returns
+ immediately.
+ @param eGroup
+ The new tool bar is added to this group.
+ @param rsToolBarName
+ The base name of the tool bar. A proper prefix (like
+ private:resource/toolbar/) is added. The name may be one of the
+ ones defined above. Other names are allowed as well.
+ */
+ void AddToolBar (
+ ToolBarGroup eGroup,
+ const OUString& rsToolBarName);
+
+ /** Add the tool bar shell to the shell stack. This method basically
+ forwards the call to the ViewShellManager.
+ For some tool bar shells additional tool bars are made visible.
+ @param rParentShell
+ When this shell is not the main view then the method returns
+ immediately.
+ @param eGroup
+ The group is used for the actual tool bars.
+ @param nToolBarId
+ Id of the tool bar shell.
+ */
+ void AddToolBarShell (
+ ToolBarGroup eGroup,
+ ShellId nToolBarId);
+
+ /** Remove the tool bar with the given name from the specified group.
+ If the tool bar is not visible then nothing happens.
+ If the tool bar is a member of another group then nothing happens
+ either.
+ */
+ void RemoveToolBar (
+ ToolBarGroup eGroup,
+ const OUString& rsToolBarName);
+
+ /** This is basically a shortcut for ResetToolBars(),AddToolBar(). The
+ main difference is, that all sub shells of the specified parent
+ shell are deactivated as well.
+ @param rParentShell
+ When this shell is not the main view then the method returns
+ immediately.
+ @param eGroup
+ The new tool bar is added to this group.
+ @param rsToolBarName
+ The base name of the tool bar. A proper prefix (like
+ private:resource/toolbar/) is added. The name may be one of the
+ ones defined above. Other names are allowed as well.
+ */
+ void SetToolBar (
+ ToolBarGroup eGroup,
+ const OUString& rsToolBarName);
+
+ /** This is basically a shortcut for ResetToolBars(),AddToolBar(). The
+ main difference is, that all sub shells of the specified parent
+ shell are deactivated as well.
+ @param rParentShell
+ When this shell is not the main view then the method returns
+ immediately.
+ @param rParentShell
+ When this shell is not the main view then the method returns
+ immediately.
+ @param eGroup
+ The group is currently not used.
+ @param nToolBarId
+ Id of the tool bar shell.
+ */
+ void SetToolBarShell (
+ ToolBarGroup eGroup,
+ ShellId nToolBarId);
+
+ void PreUpdate();
+
+ /** Request an update of the active tool bars. The update is made
+ asynchronously.
+ */
+ void RequestUpdate();
+
+ /** This is a hint for the ToolBarManager to improve the performance
+ when it updates its tool bars when its own lock is released. Taking
+ control of the release of the update lock of the ViewShellManager
+ avoids some shell stack modifications and tool bar updates.
+ */
+ void LockViewShellManager();
+
+ /** Use this class to prevent the visible tool bars from being updated
+ (and thus causing repaints and GUI rearrangements) when several tool
+ bar operations are made in a row.
+ */
+ class UpdateLock { public:
+ UpdateLock(const std::shared_ptr<ToolBarManager>& rpManager)
+ : mpManager(rpManager) { mpManager->LockUpdate(); }
+ ~UpdateLock() COVERITY_NOEXCEPT_FALSE { mpManager->UnlockUpdate(); }
+ private:
+ std::shared_ptr<ToolBarManager> mpManager;
+ };
+ friend class UpdateLock;
+
+ void ToolBarsDestroyed();
+
+private:
+ class Implementation;
+ std::unique_ptr<Implementation> mpImpl;
+
+ /** The ViewShellBase is used to get the XLayoutManager and to determine
+ the plug in mode.
+ */
+ ToolBarManager();
+
+ void LockUpdate();
+ void UnlockUpdate();
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/View.hxx b/sd/source/ui/inc/View.hxx
new file mode 100644
index 000000000..4e530e3f9
--- /dev/null
+++ b/sd/source/ui/inc/View.hxx
@@ -0,0 +1,300 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <pres.hxx>
+#include <tools/gen.hxx>
+#include <vcl/transfer.hxx>
+#include <svx/fmview.hxx>
+#include <svx/svdpage.hxx>
+#include <vcl/idle.hxx>
+
+#include "smarttag.hxx"
+#include "fusearch.hxx"
+
+class SdDrawDocument;
+class SdPage;
+class SdrOle2Obj;
+class SdrGrafObj;
+class SdrMediaObj;
+class OutputDevice;
+class ImageMap;
+class Graphic;
+class SdrOutliner;
+
+namespace avmedia { class PlayerListener; }
+
+namespace sd {
+
+class DrawDocShell;
+class ViewShell;
+class Window;
+class ViewClipboard;
+
+//For master view we want to force that master
+//textboxes have readonly text, because the
+//text is the auto-generated click-here-to-edit
+//and it doesn't help to change it
+class OutlinerMasterViewFilter
+{
+private:
+ SdrOutliner *m_pOutl;
+ bool m_bReadOnly;
+public:
+ OutlinerMasterViewFilter()
+ : m_pOutl(nullptr)
+ , m_bReadOnly(false)
+ {
+ }
+ void Start(SdrOutliner *pOutl);
+ void End();
+};
+
+class SearchContext
+{
+private:
+ rtl::Reference<FuSearch> maFunctionSearch;
+
+public:
+ rtl::Reference<FuSearch>& getFunctionSearch()
+ {
+ return maFunctionSearch;
+ }
+
+ void setSearchFunction(rtl::Reference<FuSearch> const & xFunction)
+ {
+ resetSearchFunction();
+ maFunctionSearch = xFunction;
+ }
+
+ void resetSearchFunction()
+ {
+ if (maFunctionSearch.is())
+ maFunctionSearch->Dispose();
+ }
+};
+
+class SAL_DLLPUBLIC_RTTI View : public FmFormView
+{
+public:
+
+ View (
+ SdDrawDocument& rDrawDoc,
+ OutputDevice* pOutDev,
+ ViewShell* pViewSh=nullptr);
+ virtual ~View() override;
+
+ void CompleteRedraw( OutputDevice* pOutDev, const vcl::Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector = nullptr) override;
+
+ virtual void GetAttributes( SfxItemSet& rTargetSet, bool bOnlyHardAttr = false ) const;
+ virtual bool SetAttributes(const SfxItemSet& rSet, bool bReplaceAll = false, bool bSlide = false, bool bMaster = false);
+ virtual void MarkListHasChanged() override;
+ void SelectAll();
+ void DoCut();
+ void DoCopy();
+ void DoPaste(::sd::Window* pWindow=nullptr);
+ virtual void DoConnect(SdrOle2Obj* pOleObj) override;
+ virtual bool SetStyleSheet(SfxStyleSheet* pStyleSheet, bool bDontRemoveHardAttr = false);
+ void StartDrag( const Point& rStartPos, vcl::Window* pWindow );
+ virtual void DragFinished( sal_Int8 nDropAction );
+ virtual sal_Int8 AcceptDrop (
+ const AcceptDropEvent& rEvt,
+ DropTargetHelper& rTargetHelper,
+ SdrLayerID nLayer);
+ virtual sal_Int8 ExecuteDrop (
+ const ExecuteDropEvent& rEvt,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer);
+
+ css::uno::Reference<css::datatransfer::XTransferable>
+ CreateClipboardDataObject ();
+ css::uno::Reference<css::datatransfer::XTransferable>
+ CreateDragDataObject (::sd::View*, vcl::Window& rWindow,
+ const Point& rDragPos);
+ css::uno::Reference<css::datatransfer::XTransferable>
+ CreateSelectionDataObject (::sd::View*);
+
+ // update clipboard to what is selected
+ void UpdateSelectionClipboard();
+
+ // release content of clipboard, if we own the content
+ void ClearSelectionClipboard();
+
+ DrawDocShell* GetDocSh() const { return mpDocSh; }
+ inline SdDrawDocument& GetDoc() const;
+ ViewShell* GetViewShell() const { return mpViewSh; }
+ SfxViewShell* GetSfxViewShell() const override;
+
+ // Create a local UndoManager
+ std::unique_ptr<SdrUndoManager> createLocalTextUndoManager() override;
+
+ virtual bool SdrBeginTextEdit(SdrObject* pObj, SdrPageView* pPV = nullptr, vcl::Window* pWin = nullptr, bool bIsNewObj = false,
+ SdrOutliner* pGivenOutliner = nullptr, OutlinerView* pGivenOutlinerView = nullptr,
+ bool bDontDeleteOutliner = false, bool bOnlyOneView = false, bool bGrabFocus = true) override;
+
+ virtual SdrEndTextEditKind SdrEndTextEdit(bool bDontDeleteReally = false) override;
+
+ bool RestoreDefaultText( SdrTextObj* pTextObj );
+
+ bool InsertData( const TransferableDataHelper& rDataHelper,
+ const Point& rPos, sal_Int8& rDnDAction, bool bDrag,
+ SotClipboardFormatId nFormat = SotClipboardFormatId::NONE,
+ sal_uInt16 nPage = SDRPAGE_NOTFOUND, SdrLayerID nLayer = SDRLAYER_NOTFOUND );
+ /** gets the metafile from the given transferable helper and insert it as a graphic shape.
+ @param bOptimize if set to true, the metafile is analyzed and if only one bitmap action is
+ present, then is inserted as a single graphic.
+ */
+ bool InsertMetaFile( const TransferableDataHelper& rDataHelper,
+ const Point& rInsertPos,
+ ImageMap const * pImageMap, bool bOptimize );
+ SdrGrafObj* InsertGraphic( const Graphic& rGraphic,
+ sal_Int8& rAction, const Point& rPos,
+ SdrObject* pSelectedObj, ImageMap const * pImageMap );
+ void InsertMediaURL( const OUString& rMediaURL, sal_Int8& rAction,
+ const Point& rPos, const Size& rSize,
+ bool const bLink );
+ SdrMediaObj* InsertMediaObj( const OUString& rURL, const OUString& rMimeType, sal_Int8& rAction,
+ const Point& rPos, const Size& rSize );
+
+ bool PasteRTFTable( const ::tools::SvRef<SotTempStream>& xStm, SdrPage* pPage, SdrInsertFlags nPasteOptions );
+
+ bool IsPresObjSelected(bool bOnPage = true, bool bOnMasterPage = true, bool bCheckPresObjListOnly = false, bool bCheckLayoutOnly = false) const;
+
+ void SetMarkedOriginalSize();
+
+ bool IsMorphingAllowed() const;
+ bool IsVectorizeAllowed() const;
+
+ virtual SfxStyleSheet* GetStyleSheet() const;
+
+ /** return parameter:
+ pExchangeList == NULL -> all names are unique
+ bNameOK == false -> cancel by user
+ nType == 0 -> pages
+ nType == 1 -> objects
+ nType == 2 -> pages and objects */
+
+ bool GetExchangeList( std::vector<OUString> &rExchangeList,
+ std::vector<OUString> &rBookmarkList,
+ const sal_uInt16 nType );
+
+ virtual void onAccessibilityOptionsChanged() override;
+
+ /** returns true if we have an undo manager and there is an open list undo action */
+ bool isRecordingUndo() const;
+
+ virtual void AddCustomHdl() override;
+
+ SmartTagSet& getSmartTags() { return maSmartTags; }
+ void updateHandles();
+
+ virtual SdrViewContext GetContext() const override;
+ virtual bool HasMarkablePoints() const override;
+ virtual sal_Int32 GetMarkablePointCount() const override;
+ virtual bool HasMarkedPoints() const override;
+ virtual bool MarkPoint(SdrHdl& rHdl, bool bUnmark=false) override;
+ virtual void CheckPossibilities() override;
+ virtual bool MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark) override;
+ using SdrMarkView::MarkPoints;
+
+ bool ShouldToggleOn(
+ const bool bBulletOnOffMode,
+ const bool bNormalBullet);
+
+ /** change the bullets/numbering of the marked objects
+
+ @param bToggle
+ true: just toggle the current bullets/numbering on --> off resp. off --> on
+
+ @param bHandleBullets
+ true: handle bullets
+ false: handle numbering
+
+ @param pNumRule
+ numbering rule which needs to be applied. can be 0.
+ */
+ void ChangeMarkedObjectsBulletsNumbering(
+ const bool bToggle,
+ const bool bHandleBullets,
+ const SvxNumRule* pNumRule);
+
+ void SetPossibilitiesDirty() { m_bPossibilitiesDirty = true; }
+ void SetMoveAllowed( bool bSet ) { m_bMoveAllowed = bSet; }
+ void SetMoveProtected( bool bSet ) { m_bMoveProtect = bSet; }
+ void SetResizeFreeAllowed( bool bSet ) { m_bResizeFreeAllowed = bSet; }
+ void SetResizePropAllowed( bool bSet ) { m_bResizePropAllowed = bSet; }
+ void SetResizeProtected( bool bSet ) { m_bResizeProtect = bSet; }
+
+ SdrObject* GetEmptyPresentationObject( PresObjKind eKind );
+ SdPage* GetPage();
+ SdrObject* GetSelectedSingleObject(SdPage const * pPage);
+ void SetAuthor(const OUString& rAuthor) { m_sAuthor = rAuthor; }
+ const OUString& GetAuthor() const { return m_sAuthor; }
+
+ SearchContext& getSearchContext() { return maSearchContext; }
+protected:
+ DECL_DLLPRIVATE_LINK( OnParagraphInsertedHdl, ::Outliner::ParagraphHdlParam, void );
+ DECL_DLLPRIVATE_LINK( OnParagraphRemovingHdl, ::Outliner::ParagraphHdlParam, void );
+
+ virtual void OnBeginPasteOrDrop( PasteOrDropInfos* pInfo ) override;
+ virtual void OnEndPasteOrDrop( PasteOrDropInfos* pInfo ) override;
+
+ SdDrawDocument& mrDoc;
+ DrawDocShell* mpDocSh;
+ ViewShell* mpViewSh;
+ std::unique_ptr<SdrMarkList> mpDragSrcMarkList;
+ SdrObject* mpDropMarkerObj;
+ std::unique_ptr<SdrDropMarkerOverlay> mpDropMarker;
+ sal_uInt16 mnDragSrcPgNum;
+ Point maDropPos;
+ ::std::vector<OUString> maDropFileVector;
+ sal_Int8 mnAction;
+ Idle maDropErrorIdle;
+ Idle maDropInsertFileIdle;
+ rtl::Reference<avmedia::PlayerListener> mxDropMediaSizeListener;
+ sal_uInt16 mnLockRedrawSmph;
+ bool mbIsDropAllowed;
+
+ DECL_DLLPRIVATE_LINK( DropErrorHdl, Timer*, void );
+ DECL_DLLPRIVATE_LINK( DropInsertFileHdl, Timer*, void );
+ DECL_DLLPRIVATE_LINK( ExecuteNavigatorDrop, void*, void );
+
+ void ImplClearDrawDropMarker();
+
+ SmartTagSet maSmartTags;
+
+private:
+ ::std::unique_ptr<ViewClipboard> mpClipboard;
+ OutlinerMasterViewFilter maMasterViewFilter;
+ SearchContext maSearchContext;
+
+ OUString m_sAuthor;
+};
+
+SdDrawDocument& View::GetDoc() const
+{
+ return mrDoc;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/ViewClipboard.hxx b/sd/source/ui/inc/ViewClipboard.hxx
new file mode 100644
index 000000000..f16c0ad33
--- /dev/null
+++ b/sd/source/ui/inc/ViewClipboard.hxx
@@ -0,0 +1,78 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+
+class SdPage;
+class SdTransferable;
+
+namespace sd
+{
+class View;
+
+/** Handle clipboard related tasks for the draw view.
+*/
+class ViewClipboard
+{
+public:
+ ViewClipboard(::sd::View& rView);
+ virtual ~ViewClipboard();
+
+ /** Handle the drop of a drag-and-drop action where the transferable
+ contains a set of pages.
+ */
+ void HandlePageDrop(const SdTransferable& rTransferable);
+
+protected:
+ ::sd::View& mrView;
+
+ /** Return the first master page of the given transferable. When the
+ bookmark list of the transferable contains at least one non-master
+ page then NULL is returned.
+ */
+ static SdPage* GetFirstMasterPage(const SdTransferable& rTransferable);
+
+ /** Assign the (first) master page of the given transferable to the
+ (...) slide.
+ */
+ void AssignMasterPage(const SdTransferable& rTransferable, SdPage const* pMasterPage);
+
+ /** Return an index of a page after which the pages of the transferable
+ are to be inserted into the target document.
+ */
+ virtual sal_uInt16 DetermineInsertPosition();
+
+ /** Insert the slides in the given transferable behind the last selected
+ slide or, when the selection is empty, behind the last slide.
+ @param rTransferable
+ This transferable defines which pages to insert.
+ @param nInsertPosition
+ The pages of the transferable will be inserted behind the page
+ with this index.
+ @return
+ Returns the number of inserted slides.
+ */
+ sal_uInt16 InsertSlides(const SdTransferable& rTransferable, sal_uInt16 nInsertPosition);
+};
+
+} // end of namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/ViewShell.hxx b/sd/source/ui/inc/ViewShell.hxx
new file mode 100644
index 000000000..1eeede9e2
--- /dev/null
+++ b/sd/source/ui/inc/ViewShell.hxx
@@ -0,0 +1,559 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <rtl/ref.hxx>
+
+#include <sfx2/viewsh.hxx>
+#include <svl/typedwhich.hxx>
+#include <vcl/prntypes.hxx>
+#include <vcl/scrbar.hxx>
+#include <o3tl/deleter.hxx>
+#include <pres.hxx>
+#include "View.hxx"
+#include "fupoor.hxx"
+#include <sddllapi.h>
+
+#include <memory>
+
+class SdPage;
+class SvxRuler;
+class SdrOle2Obj; // for the ones, who have undefined parts of SVDRAW
+class SdDrawDocument;
+class SvxNumBulletItem;
+
+namespace weld
+{
+ class Window;
+}
+
+namespace com::sun::star::drawing { class XDrawSubController; }
+
+namespace sd {
+
+class DrawDocShell;
+class FrameView;
+class LayerTabBar;
+class ViewShellBase;
+class Window;
+class WindowUpdater;
+class ZoomList;
+
+#undef OUTPUT_DRAWMODE_COLOR
+#undef OUTPUT_DRAWMODE_CONTRAST
+
+const DrawModeFlags OUTPUT_DRAWMODE_COLOR = DrawModeFlags::Default;
+const DrawModeFlags OUTPUT_DRAWMODE_GRAYSCALE
+ = DrawModeFlags::GrayLine | DrawModeFlags::GrayFill
+ | DrawModeFlags::BlackText | DrawModeFlags::GrayBitmap
+ | DrawModeFlags::GrayGradient;
+const DrawModeFlags OUTPUT_DRAWMODE_BLACKWHITE
+ = DrawModeFlags::BlackLine | DrawModeFlags::BlackText
+ | DrawModeFlags::WhiteFill | DrawModeFlags::GrayBitmap
+ | DrawModeFlags::WhiteGradient;
+const DrawModeFlags OUTPUT_DRAWMODE_CONTRAST
+ = DrawModeFlags::SettingsLine | DrawModeFlags::SettingsFill
+ | DrawModeFlags::SettingsText | DrawModeFlags::SettingsGradient;
+
+/** Base class of the stacked shell hierarchy.
+
+ <p>Despite its name this class is not a descendant of SfxViewShell
+ but of SfxShell. Its name expresses the fact that it acts like a
+ view shell. Being a stacked shell rather than being an actual view shell
+ there can be several instances of this class that
+ <ul>
+ <li>all are based on the same view shell and thus show the same
+ document and share common view functionality and</li>
+ <li>are all visible at the same time and live in the same
+ frame.</li>
+ <ul></p>
+
+ <p>This class replaces the former ViewShell class.</p>
+*/
+class SAL_DLLPUBLIC_RTTI ViewShell
+ : public SfxShell
+{
+public:
+ enum ShellType {
+ ST_NONE,
+ ST_DRAW, // The Draw application.
+ ST_IMPRESS, // Main view of the Impress application.
+ ST_NOTES,
+ ST_HANDOUT,
+ ST_OUTLINE,
+ ST_SLIDE_SORTER,
+ ST_PRESENTATION,
+ ST_SIDEBAR
+ };
+ static const int MAX_HSPLIT_CNT = 1;
+ static const int MAX_VSPLIT_CNT = 1;
+ static const int MIN_SCROLLBAR_SIZE = 50;
+
+
+ ViewShell (
+ vcl::Window* pParentWindow,
+ ViewShellBase& rViewShellBase);
+ virtual ~ViewShell() override;
+
+ /** The Init method has to be called from the outside directly
+ after a new object of this class has been created. It can be
+ used for that part of the initialisation that can be run only
+ after the creation of the new object is finished. This
+ includes registration as listener at event broadcasters.
+
+ Derived classes should call this method at the head of their
+ Init() methods.
+ @param bIsMainViewShell
+ This flag tells the Init() method whether the new ViewShell will
+ be the main view shell.
+ */
+ virtual void Init (bool bIsMainViewShell);
+
+ /** The Exit() method has to be called before the destructor so that the
+ view shell is still a valid object and can safely call methods that
+ rely on that.
+ */
+ void Exit();
+
+ void Cancel();
+
+ /** Return the window that is the parent of all controls of this view
+ shell. This may or may not be the window of the frame.
+ */
+ vcl::Window* GetParentWindow() const { return mpParentWindow; }
+
+ sd::Window* GetContentWindow() const;
+
+ ::sd::View* GetView() const { return mpView; }
+ inline SdrView* GetDrawView() const;
+ SD_DLLPUBLIC DrawDocShell* GetDocSh() const;
+
+ SdDrawDocument* GetDoc() const;
+
+ SD_DLLPUBLIC SfxViewFrame* GetViewFrame() const;
+
+ /** The active window is usually the mpContentWindow. When there is a
+ show running then the active window is a ShowWindow.
+ */
+ ::sd::Window* GetActiveWindow() const { return mpActiveWindow;}
+ SD_DLLPUBLIC weld::Window* GetFrameWeld() const;
+
+ /** Set the active window. When the shell is displayed in the center
+ pane then the window of the ViewShellBase is also set to the given
+ window.
+ */
+ void SetActiveWindow (::sd::Window* pWindow);
+
+ /** Return the rectangle that encloses all windows of the view. That
+ excludes the controls in the frame like rulers, scroll bars, tab
+ bar, and buttons.
+ @return
+ The rectangle is returned in screen coordinates, i.e. pixel
+ values relative to the upper left corner of the screen?.
+ */
+ const ::tools::Rectangle& GetAllWindowRect();
+
+ // Mouse- & Key-Events
+ virtual void PrePaint();
+ virtual void Paint (const ::tools::Rectangle& rRect, ::sd::Window* pWin);
+ virtual bool KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin);
+ virtual void MouseMove(const MouseEvent& rMEvt, ::sd::Window* pWin);
+ virtual void MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin);
+ virtual void MouseButtonDown(const MouseEvent& rMEvt, ::sd::Window* pWin);
+ virtual void Command(const CommandEvent& rCEvt, ::sd::Window* pWin);
+ bool RequestHelp( const HelpEvent& rEvt );
+ bool Notify( NotifyEvent const & rNEvt, ::sd::Window* pWin );
+
+ bool HandleScrollCommand(const CommandEvent& rCEvt, ::sd::Window* pWin);
+
+ void SetUIUnit(FieldUnit eUnit);
+ void SetDefTabHRuler( sal_uInt16 nDefTab );
+
+ const SvxNumBulletItem* GetNumBulletItem(SfxItemSet& aNewAttr, TypedWhichId<SvxNumBulletItem>& nNumItemId);
+
+ bool HasRuler() const { return mbHasRulers;}
+ void SetRuler(bool bRuler);
+ // Hides horizontal, vertical scrollbar as well as scrollbox
+ void SetScrollBarsVisible(bool bVisible);
+
+ /** Set internal values of all scroll bars that determine thumb size and
+ position. The external values like size and position of the scroll
+ bar controls are not modified.
+ */
+ virtual void UpdateScrollBars();
+ void Scroll(::tools::Long nX, ::tools::Long nY);
+ void ScrollLines(::tools::Long nX, ::tools::Long nY);
+ virtual void SetZoom(::tools::Long nZoom);
+ ::tools::Long GetZoom() const;
+ virtual void SetZoomRect(const ::tools::Rectangle& rZoomRect);
+ void InitWindows(const Point& rViewOrigin, const Size& rViewSize,
+ const Point& rWinPos, bool bUpdate = false);
+ void InvalidateWindows();
+ /** This method is still used by the OutlineViewShell to update the
+ model according to the content of the outline view. This in turn
+ updates the previews in the slide sorter.
+ */
+ virtual void UpdatePreview (SdPage* pPage);
+
+ void DrawMarkRect(const ::tools::Rectangle& rRect) const;
+
+ void ExecReq( SfxRequest &rReq );
+
+ ZoomList* GetZoomList() { return mpZoomList.get();}
+
+ FrameView* GetFrameView() { return mpFrameView; }
+ /** Setting a frame view triggers ReadFrameViewData() for the new
+ frame.
+ @param pFrameView
+ The new frame view that replaces the old one.
+ */
+ void SetFrameView (FrameView* pFrameView);
+ virtual void ReadFrameViewData(FrameView* pView);
+ virtual void WriteFrameViewData();
+ void WriteUserData();
+ void ReadUserData();
+
+ virtual bool ActivateObject(SdrOle2Obj* pObj, sal_Int32 nVerb);
+
+ /** @returns
+ current or selected page or 0. This method
+ will fail in master page mode.
+
+ @deprecated, please use getCurrentPage();
+ */
+ virtual SdPage* GetActualPage() = 0;
+
+ /** @returns
+ current or selected page or 0.
+ */
+ virtual SdPage* getCurrentPage() const = 0;
+
+ const rtl::Reference<FuPoor>& GetOldFunction() const { return mxOldFunction; }
+ bool HasOldFunction() const { return mxOldFunction.is(); }
+ const rtl::Reference<FuPoor>& GetCurrentFunction() const { return mxCurrentFunction; }
+ bool HasCurrentFunction( sal_uInt16 nSID ) { return mxCurrentFunction.is() && (mxCurrentFunction->GetSlotID() == nSID ); }
+ bool HasCurrentFunction() const { return mxCurrentFunction.is(); }
+
+ void SetCurrentFunction(const rtl::Reference<FuPoor>& xFunction);
+ void SetOldFunction(const rtl::Reference<FuPoor>& xFunction);
+ void DeactivateCurrentFunction( bool bPermanent = false );
+
+ void SetPageSizeAndBorder(PageKind ePageKind, const Size& rNewSize,
+ ::tools::Long nLeft, ::tools::Long nRight, ::tools::Long nUpper, ::tools::Long nLower,
+ bool bScaleAll, Orientation eOrient, sal_uInt16 nPaperBin,
+ bool bBackgroundFullSize );
+
+ void SetStartShowWithDialog( bool bIn ) { mbStartShowWithDialog = bIn; }
+ bool IsStartShowWithDialog() const { return mbStartShowWithDialog; }
+
+ sal_uInt16 GetPrintedHandoutPageNum() const { return mnPrintedHandoutPageNum; }
+ void SetPrintedHandoutPageNum (sal_uInt16 nPageNumber) {mnPrintedHandoutPageNum=nPageNumber; }
+
+ sal_uInt16 GetPrintedHandoutPageCount() const { return mnPrintedHandoutPageCount; }
+ void SetPrintedHandoutPageCount (sal_uInt16 nPageCount) {mnPrintedHandoutPageCount=nPageCount; }
+
+ virtual bool PrepareClose( bool bUI = true );
+
+ void GetMenuState(SfxItemSet& rSet);
+
+ virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt, DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow, sal_uInt16 nPage, SdrLayerID nLayer );
+ virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt, DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow, sal_uInt16 nPage, SdrLayerID nLayer );
+
+ virtual void WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& );
+ virtual void ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& );
+
+ /** this method is called when the visible area of the view from this viewshell is changed */
+ virtual void VisAreaChanged(const ::tools::Rectangle& rRect);
+
+ /** Create an accessible object representing the specified window.
+ Override this method to provide view mode specific objects. The
+ default implementation returns an empty reference.
+ @param pWindow
+ Make the document displayed in this window accessible.
+ @return
+ This default implementation returns an empty reference.
+ */
+ virtual css::uno::Reference<css::accessibility::XAccessible>
+ CreateAccessibleDocumentView (::sd::Window* pWindow);
+
+ virtual void SwitchViewFireFocus( const css::uno::Reference< css::accessibility::XAccessible >& xAcc );
+ void SwitchActiveViewFireFocus( );
+ // Move these two methods from DrawViewShell to enable slide show view
+ void NotifyAccUpdate();
+ void fireSwitchCurrentPage(sal_Int32 pageIndex);
+ void SetWinViewPos(const Point& rWinPos);
+ Point const & GetWinViewPos() const;
+ Point const & GetViewOrigin() const;
+
+ /** Return the window updater of this view shell.
+ @return
+ In rare circumstances the returned pointer may be <null/>,
+ i.e. when no memory is available anymore.
+ */
+ ::sd::WindowUpdater* GetWindowUpdater() const;
+
+ /** Return the border that is drawn around the actual document view.
+ The border contains typically rulers and scroll bars.
+ */
+ SvBorder GetBorder();
+
+ /** Notify the view shell that its parent window has been resized.
+ The ViewShell places and resizes its UI elements accordingly.
+ The new size can be obtained from the parent window.
+ */
+ virtual void Resize();
+
+ /** Set position and size of the GUI elements that are controlled by
+ the view shell like rulers and scroll bars as well as the actual
+ document view according to the position and size that were given
+ with the last Resize() call.
+ */
+ virtual void ArrangeGUIElements();
+
+ // virtual void OuterResizePixel(const Point &rPos, const Size &rSize);
+ // virtual void InnerResizePixel(const Point &rPos, const Size &rSize);
+
+ // Exported for unit test
+ SD_DLLPUBLIC ViewShellBase& GetViewShellBase() const;
+
+ /** Return <TRUE/> when the called view shell is the main sub shell of
+ its ViewShellBase object, i.e. is display in the center pane. This
+ convenience function is equivalent to comparing the this pointer to
+ the result of ViewShellBase::GetViewShell(PT_CENTER).
+ */
+ bool IsMainViewShell() const;
+
+ /** Set or reset the flag that indicates whether the called shell is the
+ one displayed in the center pane. By default this flag is set to
+ <FALSE/>. For the main view shell it thus has to be set to <TRUE/>.
+ */
+ void SetIsMainViewShell (bool bIsMainViewShell);
+
+ /** Return a sub controller that implements the view shell specific
+ part of the DrawController.
+ */
+ virtual css::uno::Reference<css::drawing::XDrawSubController> CreateSubController() = 0;
+
+ /** Return the type of the shell.
+ */
+ SD_DLLPUBLIC ShellType GetShellType() const; //Export for unit test
+
+ /** This method is more or less an alias to Deactivate(). It is called
+ before an object of this class is taken from the stack of view
+ shells.
+
+ <p>When this method is not called before a view shell is taken from
+ a stack then the Deactivate() call from the SFX as a response to
+ RemoveSubShell() comes too late when the view shell is not on the
+ stack anymore.</p>
+ */
+ virtual void Shutdown();
+
+ /** This function is called from the underlying ViewShellBase
+ object to handle a verb execution request.
+ */
+ virtual ErrCode DoVerb(sal_Int32 nVerb);
+
+ virtual void UIActivating( SfxInPlaceClient* );
+ virtual void UIDeactivated( SfxInPlaceClient* );
+
+ /** Show controls of the UI or hide them, depending on the given flag.
+ As a result the border is adapted.
+ */
+ virtual void ShowUIControls (bool bVisible);
+ bool IsPageFlipMode() const;
+
+ /** Set the given window as new parent window. This is not possible for
+ all views, so the return value tells the caller if the relocation
+ was successful.
+ */
+ virtual bool RelocateToParentWindow (vcl::Window* pParentWindow);
+
+ /** Depending on the given request create a new page or duplicate an
+ existing one. A new page is created behind the given slide.
+ @param rRequest
+ The request as passed to an Execute() method. Its arguments are
+ evaluated. Its slot id determines whether to create or
+ duplicate a slide.
+ @param pPage
+ This page is either duplicated or becomes the predecessor of the
+ new slide. If NULL a duplication request is ignored. A new
+ slide is inserted as first slide.
+ @param nInsertPosition
+ When -1 (the default) then insert after pPage. Otherwise insert
+ before the given index (of a standard page).
+ @return
+ The new slide is returned. If for some reason a new page can
+ not be created then NULL is returned.
+ */
+ virtual SdPage* CreateOrDuplicatePage (
+ SfxRequest& rRequest,
+ PageKind ePageKind,
+ SdPage* pPage,
+ const sal_Int32 nInsertPosition = -1);
+
+ /// Allows adjusting the point or mark of the selection to a document coordinate.
+ void SetCursorMm100Position(const Point& rPosition, bool bPoint, bool bClearMark);
+ /// Gets the current selection
+ css::uno::Reference<css::datatransfer::XTransferable> GetSelectionTransferrable() const;
+ /// Allows starting or ending a graphic move or resize action.
+ void SetGraphicMm100Position(bool bStart, const Point& rPosition);
+
+ class Implementation;
+
+protected:
+ /** must be called in the beginning of each subclass d'tor.
+ disposes and clears both current and old function. */
+ void DisposeFunctions();
+
+ friend class ViewShellBase;
+
+ /** Window inside the rulers and scroll bars that shows a view of the
+ document.
+ */
+
+ VclPtr<sd::Window> mpContentWindow;
+
+ /// Horizontal scroll bar for the current slide is displayed when needed.
+ VclPtr<ScrollBar> mpHorizontalScrollBar;
+ /// Vertical scroll bar for whole document is always visible.
+ VclPtr<ScrollBar> mpVerticalScrollBar;
+ /// Horizontal ruler is not shown by default.
+ VclPtr<SvxRuler> mpHorizontalRuler;
+ /// Vertical ruler is not shown by default.
+ VclPtr<SvxRuler> mpVerticalRuler;
+ /// Filler of the little square enclosed by the two scroll bars.
+ VclPtr<ScrollBarBox> mpScrollBarBox;
+ /// Layer tab bar.
+ VclPtr<LayerTabBar> mpLayerTabBar;
+
+ /// This flag controls whether the rulers are visible.
+ bool mbHasRulers;
+
+ /// The active window.
+ VclPtr< ::sd::Window> mpActiveWindow;
+ ::sd::View* mpView;
+ FrameView* mpFrameView;
+
+ rtl::Reference<FuPoor> mxCurrentFunction;
+ rtl::Reference<FuPoor> mxOldFunction;
+ std::unique_ptr<ZoomList> mpZoomList;
+
+ Point maViewPos;
+ Size maViewSize;
+ Size maScrBarWH;
+
+ bool mbStartShowWithDialog; // presentation is started by dialog
+ sal_uInt16 mnPrintedHandoutPageNum; // Page number of the handout page that is to be printed.
+ sal_uInt16 mnPrintedHandoutPageCount; // Page count of the handout pages that are to be printed.
+
+ //af bool bPrintDirectSelected; // Print only selected objects in direct print
+ //afString sPageRange; // pagerange if selected objects in direct print
+
+ /** Area covered by all windows, i.e. the area of the parent window
+ without the controls at the borders like rulers, scroll bars, tab
+ bar, buttons.
+ This rectangle may be set in window coordinates (i.e. pixel values
+ relative to the parent window). It is transformed by every call to
+ GetAllWindowRectangle() into screen coordinates (relative to the
+ upper left corner of the screen.
+ */
+ ::tools::Rectangle maAllWindowRectangle;
+
+ /// The type of the shell. Returned by GetShellType().
+ ShellType meShellType;
+
+ std::unique_ptr<Implementation, o3tl::default_delete<Implementation>> mpImpl;
+
+ // Support methods for centralized UNDO/REDO
+ virtual SfxUndoManager* ImpGetUndoManager() const;
+ void ImpGetUndoStrings(SfxItemSet &rSet) const;
+ void ImpGetRedoStrings(SfxItemSet &rSet) const;
+ void ImpSidUndo(SfxRequest& rReq);
+ void ImpSidRedo(SfxRequest& rReq);
+
+ DECL_DLLPRIVATE_LINK( HScrollHdl, ScrollBar *, void );
+ DECL_DLLPRIVATE_LINK( VScrollHdl, ScrollBar *, void );
+
+ // virtual scroll handler, here, derivative classes can add themselves here
+ virtual void VirtHScrollHdl(ScrollBar* pHScroll);
+ virtual void VirtVScrollHdl(ScrollBar* pVScroll);
+
+ // virtual functions ruler handling
+ virtual VclPtr<SvxRuler> CreateHRuler(::sd::Window* pWin);
+ virtual VclPtr<SvxRuler> CreateVRuler(::sd::Window* pWin);
+ virtual void UpdateHRuler();
+ virtual void UpdateVRuler();
+
+ virtual void Activate(bool IsMDIActivate) override;
+ virtual void Deactivate(bool IsMDIActivate) override;
+
+ virtual void SetZoomFactor( const Fraction &rZoomX,
+ const Fraction &rZoomY );
+
+ /**
+ This must be called after the ctor, but before anything else.
+ It's the part of construction that is dependent
+ on showing the top-level window.
+
+ Showing a window with a11y enabled causes various callbacks
+ to be triggered.
+
+ Due to the "virtual methods are not virtual during constructors"
+ problem, this is a disaster to call from the ctor
+
+ i.e. construct calls Show, and if a11y is enabled this
+ reenters the not-fully constructed object and calls
+ CreateAccessibleDocumentView, so if construct is called
+ from the ctor then if a derived class is constructed the base-case
+ CreateAccessibleDocumentView is used, not the derived
+ CreateAccessibleDocumentView. i.e. run smoketest under a11y with
+ debugging assertions enabled
+ */
+ void doShow();
+
+private:
+ VclPtr<vcl::Window> mpParentWindow;
+ /** This window updater is used to keep all relevant windows up to date
+ with reference to the digit language used to display digits in text
+ shapes.
+ */
+ ::std::unique_ptr< ::sd::WindowUpdater> mpWindowUpdater;
+
+ /** Code common to all constructors. It generally is a bad idea
+ to call this function from outside a constructor.
+ */
+ void construct();
+
+ /** Create the rulers.
+ */
+ void SetupRulers();
+};
+
+SdrView* ViewShell::GetDrawView() const
+{
+ return static_cast<SdrView*>(mpView);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/ViewShellBase.hxx b/sd/source/ui/inc/ViewShellBase.hxx
new file mode 100644
index 000000000..eab26ec8a
--- /dev/null
+++ b/sd/source/ui/inc/ViewShellBase.hxx
@@ -0,0 +1,246 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <glob.hxx>
+#include <sfx2/viewsh.hxx>
+#include <memory>
+
+class SdDrawDocument;
+class SfxRequest;
+
+namespace sd::tools {
+class EventMultiplexer;
+}
+
+namespace sd {
+
+class DrawController;
+class DrawDocShell;
+class FormShellManager;
+class ToolBarManager;
+class ViewShell;
+class ViewShellManager;
+class ViewTabBar;
+
+/** SfxViewShell descendant that the stacked Draw/Impress shells are
+ based on.
+
+ <p>The "base" part of the name does not mean that this is a base
+ class of some class hierarchy. It rather is the base of the
+ stacked shells.</p>
+
+ <p>This class starts as a new and relatively small class. Over
+ time as much code as possible should be moved from the stacked
+ shells to this class.</p>
+*/
+class ViewShellBase
+ : public SfxViewShell
+{
+public:
+ SFX_DECL_INTERFACE(SD_IF_SDVIEWSHELLBASE)
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+public:
+ /** This constructor is used by the view factory of the SFX macros.
+ Note that LateInit() has to be called after the constructor
+ terminates and before doing anything else.
+ */
+ ViewShellBase (
+ SfxViewFrame *pFrame,
+ SfxViewShell* pOldShell);
+
+ virtual ~ViewShellBase() override;
+
+ /** This method is part of the object construction. It HAS to be called
+ after the constructor has created a new object.
+ */
+ void LateInit (const OUString& rsDefaultView);
+
+ std::shared_ptr<ViewShellManager> const & GetViewShellManager() const;
+
+ /** Return the main view shell stacked on the called ViewShellBase
+ object. This is usually the view shell displayed in the center
+ pane.
+ */
+ std::shared_ptr<ViewShell> GetMainViewShell() const;
+
+ /** When given a view frame this static method returns the
+ corresponding sd::ViewShellBase object.
+ @return
+ When the SfxViewShell of the given frame is not a
+ ViewShellBase object then NULL is returned.
+ */
+ static ViewShellBase* GetViewShellBase (SfxViewFrame const * pFrame);
+
+ DrawDocShell* GetDocShell() const { return mpDocShell;}
+ SdDrawDocument* GetDocument() const { return mpDocument;}
+
+ /** Callback function for general slot calls. At the moment these are
+ slots for switching the pane docking windows on and off.
+ */
+ virtual void Execute (SfxRequest& rRequest);
+
+ /** Callback function for retrieving item values related to certain
+ slots. This is the companion of Execute() and handles the slots
+ concerned with showing the pane docking windows.
+ */
+ void GetState (SfxItemSet& rSet);
+
+ /* override these from SfxViewShell */
+ virtual OUString GetSelectionText(bool = false, bool bOnlyASample = false) override;
+ virtual bool HasSelection(bool = true ) const override;
+
+ SvBorder GetBorder (bool bOuterResize);
+ virtual void InnerResizePixel (const Point& rOrigin, const Size& rSize, bool inplaceEditModeChange) override;
+ virtual void OuterResizePixel (const Point& rOrigin, const Size& rSize) override;
+
+ /** This call is forwarded to the main sub-shell.
+ */
+ virtual ErrCode DoVerb(sal_Int32 nVerb) override;
+
+ /** Return a new renderer that can be used for example for printing the
+ document.
+ */
+ virtual css::uno::Reference<css::view::XRenderable> GetRenderable() override;
+
+ /// Forwarded to the print manager.
+ virtual SfxPrinter* GetPrinter (bool bCreate = false) override;
+
+ /// Forwarded to the print manager.
+ virtual sal_uInt16 SetPrinter (
+ SfxPrinter* pNewPrinter,
+ SfxPrinterChangeFlags nDiffFlags = SFX_PRINTER_ALL) override;
+
+ /// Forward methods to main sub shell.
+ virtual void WriteUserDataSequence (
+ css::uno::Sequence< css::beans::PropertyValue >&) override;
+
+ /** Pass the given properties to the main view shell. After that we
+ ensure that the right view shell type is displayed in the center
+ pane.
+ */
+ virtual void ReadUserDataSequence (
+ const css::uno::Sequence< css::beans::PropertyValue >&) override;
+
+ virtual void UIActivating( SfxInPlaceClient* ) override;
+ virtual void UIDeactivated( SfxInPlaceClient* ) override;
+ virtual void Activate (bool IsMDIActivate) override;
+ using SfxViewShell::Deactivate;
+ virtual void SetZoomFactor (
+ const Fraction &rZoomX,
+ const Fraction &rZoomY) override;
+ virtual bool PrepareClose (bool bUI = true) override;
+ virtual void WriteUserData (OUString&, bool bBrowse = false) override;
+ virtual void ReadUserData (const OUString&, bool bBrowse = false) override;
+ virtual SdrView* GetDrawView() const override;
+
+ /** When <TRUE/> is given, then the mouse shape is set to hour glass (or
+ whatever the busy shape looks like on the system.)
+ */
+ void SetBusyState (bool bBusy);
+
+ /** Call this method when the controls of this view shell or the
+ embedded sub shell need to be rearranged. This is necessary
+ e.g. when the border has been modified (UpdateBorder() calls this
+ method).
+
+ This method is like ResizePixel() with no arguments.
+ */
+ void Rearrange();
+
+ /** Update the border that is set with SfxViewShell::SetBorderPixel().
+ This is done by adding the border used by the ViewShellBase itself
+ with the border used by the main view shell.
+
+ @param bForce if true the borders are also updated if old border
+ and new border are same.
+ */
+ void UpdateBorder ( bool bForce = false );
+
+ /** With this method the UI controls can be turned on or off. It is
+ used by the FuSlideShow to hide the UI controls while showing a
+ non-full-screen or in-window presentation in the center pane.
+ */
+ void ShowUIControls (bool bVisible);
+
+ /** Return an event multiplexer. It is a single class that forwards
+ events from various sources. This method must not be called before
+ LateInit() has terminated.
+ */
+ std::shared_ptr<tools::EventMultiplexer> const & GetEventMultiplexer() const;
+
+ /** returns the complete area of the current view relative to the frame
+ window
+ */
+ const ::tools::Rectangle& getClientRectangle() const;
+
+ std::shared_ptr<ToolBarManager> const & GetToolBarManager() const;
+ std::shared_ptr<FormShellManager> const & GetFormShellManager() const;
+
+ DrawController& GetDrawController() const;
+
+ void SetViewTabBar (const ::rtl::Reference<ViewTabBar>& rViewTabBar);
+
+ /** Return the window that is used by the main view shell to display its
+ view and other UI elements, like scroll bars and rulers. Ownership
+ of that window remains with the called ViewShellBase object.
+ */
+ vcl::Window* GetViewWindow();
+
+ /** returns the ui descriptive name for the given uno slot. The result is taken from the configuration
+ and not cached, so do not use it excessive (f.e. in status updates) */
+ OUString RetrieveLabelFromCommand( const OUString& aCmdURL ) const;
+ /// See SfxViewShell::getPart().
+ int getPart() const override;
+ /// See SfxViewShell::NotifyCursor().
+ void NotifyCursor(SfxViewShell* pViewShell) const override;
+
+ void setLOKVisibleArea(const ::tools::Rectangle& rArea) { maLOKVisibleArea = rArea; }
+ virtual ::tools::Rectangle getLOKVisibleArea() const override { return maLOKVisibleArea; }
+
+protected:
+
+ virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
+
+ virtual void InitializeFramework();
+
+private:
+ class Implementation;
+ std::unique_ptr<Implementation> mpImpl;
+ DrawDocShell* mpDocShell;
+ SdDrawDocument* mpDocument;
+ ::tools::Rectangle maLOKVisibleArea;
+
+ /** Determine from the properties of the document shell the initial type
+ of the view shell in the center pane. We use this method to avoid
+ starting with the wrong type. When ReadUserDataSequence() is called
+ we check that the right type is active and change again if that is
+ not the case because something went wrong.
+ */
+ OUString GetInitialViewShellType() const;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/ViewShellHint.hxx b/sd/source/ui/inc/ViewShellHint.hxx
new file mode 100644
index 000000000..05a0c8328
--- /dev/null
+++ b/sd/source/ui/inc/ViewShellHint.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <svl/hint.hxx>
+
+namespace sd
+{
+/** Local derivation of the SfxHint class that defines some hint ids that
+ are used by the ViewShell class and its descendants.
+*/
+class ViewShellHint final : public SfxHint
+{
+public:
+ enum HintId
+ {
+ // Indicate that a page resize is about to begin.
+ HINT_PAGE_RESIZE_START,
+ // Indicate that a page resize has been completed.
+ HINT_PAGE_RESIZE_END,
+ // Indicate that an edit mode change is about to begin.
+ HINT_CHANGE_EDIT_MODE_START,
+ // Indicate that an edit mode change has been completed.
+ HINT_CHANGE_EDIT_MODE_END,
+
+ HINT_COMPLEX_MODEL_CHANGE_START,
+ HINT_COMPLEX_MODEL_CHANGE_END
+ };
+
+ ViewShellHint(HintId nHintId);
+
+ HintId GetHintId() const { return meHintId; }
+
+private:
+ HintId meHintId;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/ViewShellImplementation.hxx b/sd/source/ui/inc/ViewShellImplementation.hxx
new file mode 100644
index 000000000..b4a02c3d5
--- /dev/null
+++ b/sd/source/ui/inc/ViewShellImplementation.hxx
@@ -0,0 +1,150 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "ViewShell.hxx"
+#include "ViewShellManager.hxx"
+#include "ToolBarManager.hxx"
+#include <o3tl/deleter.hxx>
+#include <memory>
+
+class SvxIMapDlg;
+
+namespace sd
+{
+/** This class contains (will contain) the implementation of methods that
+ have not be accessible from the outside.
+*/
+class ViewShell::Implementation
+{
+public:
+ bool mbIsMainViewShell;
+ /// Set to true when the ViewShell::Init() method has been called.
+ bool mbIsInitialized;
+ /** Set to true while ViewShell::ArrangeGUIElements() is being
+ executed. It is used as guard against recursive execution.
+ */
+ bool mbArrangeActive;
+
+ /** Remember a link to the sub shell factory, so that it can be
+ unregistered at the ViewShellManager when a ViewShell is deleted.
+ */
+ ViewShellManager::SharedShellFactory mpSubShellFactory;
+
+ /** This update lock for the ToolBarManager exists in order to avoid
+ problems with tool bars being displayed while the mouse button is
+ pressed. With docked tool bars this can lead to a size change of
+ the view. This would change the relative mouse coordinates and thus
+ interpret every mouse click as move command.
+ */
+ class ToolBarManagerLock
+ {
+ public:
+ /** Create a new instance. This allows the mpSelf member to be set
+ automatically.
+ */
+ static std::shared_ptr<ToolBarManagerLock>
+ Create(const std::shared_ptr<ToolBarManager>& rpManager);
+ /** Release the lock. When the UI is captured
+ (Application::IsUICaptured() returns <TRUE/>) then the lock is
+ released later asynchronously.
+ @param bForce
+ When this flag is <TRUE/> then the lock is released even
+ when IsUICaptured() returns <TRUE/>.
+ */
+ void Release(bool bForce = false);
+ DECL_DLLPRIVATE_LINK(TimeoutCallback, Timer*, void);
+
+ private:
+ ::std::unique_ptr<ToolBarManager::UpdateLock,
+ o3tl::default_delete<ToolBarManager::UpdateLock>>
+ mpLock;
+ /** The timer is used both as a safe guard to unlock the update lock
+ when Release() is not called explicitly. It is also used to
+ defer the release of the lock to a time when the UI is not
+ captured.
+ */
+ Timer maTimer;
+ /** The shared_ptr to this allows the ToolBarManagerLock to control
+ its own lifetime. This, of course, does work only when no one
+ holds another shared_ptr longer than only temporary.
+ */
+ std::shared_ptr<ToolBarManagerLock> mpSelf;
+ ToolBarManagerLock(const std::shared_ptr<sd::ToolBarManager>& rpManager);
+ ~ToolBarManagerLock();
+
+ class Deleter;
+ friend class Deleter;
+ };
+ // The member is not a unique_ptr because it takes over its own life time
+ // control.
+ std::weak_ptr<ToolBarManagerLock> mpUpdateLockForMouse;
+
+ Implementation(ViewShell& rViewShell);
+ ~Implementation() COVERITY_NOEXCEPT_FALSE;
+
+ /** Process the SID_MODIFY slot.
+ */
+ void ProcessModifyPageSlot(SfxRequest& rRequest, SdPage* pCurrentPage, PageKind ePageKind);
+
+ /** Assign the given layout to the given page. This method is at the
+ moment merely a front end for ProcessModifyPageSlot.
+ @param pPage
+ If a NULL pointer is given then this call is ignored.
+ */
+ void AssignLayout(SfxRequest const& rRequest, PageKind ePageKind);
+
+ /** Determine the view id of the view shell. This corresponds to the
+ view id stored in the SfxViewFrame class.
+
+ We can not use the view of that class because with the introduction
+ of the multi pane GUI we do not switch the SfxViewShell anymore when
+ switching the view in the center pane. The view id of the
+ SfxViewFrame is thus not modified and we can not set it from the
+ outside.
+
+ The view id is still needed for the SFX to determine on start up
+ (e.g. after loading a document) which ViewShellBase sub class to
+ use. These sub classes--like OutlineViewShellBase--exist only to be
+ used by the SFX as factories. They only set the initial pane
+ configuration, nothing more.
+
+ So what we do here in essence is to return one of the
+ ViewShellFactoryIds that can be used to select the factory that
+ creates the ViewShellBase subclass with the initial pane
+ configuration that has in the center pane a view shell of the same
+ type as mrViewShell.
+ */
+ SfxInterfaceId GetViewId() const;
+
+ /** Return a pointer to the image map dialog that is displayed in some
+ child window.
+ @return
+ Returns <NULL/> when the image map dialog is not available.
+ */
+ static SvxIMapDlg* GetImageMapDialog();
+
+private:
+ ViewShell& mrViewShell;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/ViewShellManager.hxx b/sd/source/ui/inc/ViewShellManager.hxx
new file mode 100644
index 000000000..a2c8f1ef2
--- /dev/null
+++ b/sd/source/ui/inc/ViewShellManager.hxx
@@ -0,0 +1,195 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "ShellFactory.hxx"
+#include <o3tl/deleter.hxx>
+#include <memory>
+
+class FmFormShell;
+class SfxShell;
+
+namespace sd
+{
+class ViewShell;
+class ViewShellBase;
+
+/** The ViewShellManager has the responsibility to manage the view shells
+ and sub shells on the SFX shell stack. They form a two level hierarchy
+ (the underlying ViewShellBase, the only true SfxViewShell descendant,
+ forms a third level.) On the first level there are the view shells
+ (what formerly was called view shell, anyway; nowadays they are derived
+ from SfxShell) and shells for panes. On the second level there are sub
+ shells (also derived from SfxShell) that usually are tool bars.
+
+ <p>On the SFX shell stack the regular sub shells are placed above their
+ view shells. The FormShell is a special case. With the SetFormShell()
+ method it can be placed directly above or below one of the view
+ shells.</p>
+
+ <p>Shells managed by this class are created by factories or are given
+ directly to Activate... methods. For the sub shells there is one
+ factory for every view shell. Factories are added or removed via the
+ (Add|Remove)SubShellFactory() methods. The FormShell is managed with the
+ factory of its view shell.</p>
+*/
+class ViewShellManager
+{
+public:
+ typedef std::shared_ptr<ShellFactory<SfxShell>> SharedShellFactory;
+
+ ViewShellManager(ViewShellBase& rBase);
+
+ /** Before the destructor is called the method Shutdown() has to have
+ been called.
+ */
+ ~ViewShellManager();
+
+ /** Tell a ViewShellManager object to prepare to be deleted, i.e. to
+ destroy all of its resources and to ignore all following calls.
+ Use this when the owner of the view shell manager is about being
+ destroyed but the view shell manager itself can not yet be deleted.
+ */
+ void Shutdown();
+
+ /** Set the factory for sub shells of the specified view shell.
+ */
+ void AddSubShellFactory(ViewShell const* pViewShell, const SharedShellFactory& rpFactory);
+ void RemoveSubShellFactory(ViewShell const* pViewShell, const SharedShellFactory& rpFactory);
+
+ /** Activate the given view shell.
+ */
+ void ActivateViewShell(ViewShell* pViewShell);
+
+ /** Activate the given shell which is not a view shell. For view shells
+ use the ActivateViewShell() method.
+ */
+ void ActivateShell(SfxShell* pShell);
+
+ /** Deactivate the specified shell, i.e. take it and all of its
+ object bars from the shell stack.
+ @param pShell
+ The shell to deactivate.
+ */
+ void DeactivateViewShell(const ViewShell* pShell);
+
+ /** Deactivate the specified shell. The shell is not destroyed.
+ */
+ void DeactivateShell(const SfxShell* pShell);
+
+ /** Associate the form shell with a view shell and their relative
+ position. This method does not change the shell stack, it just
+ stores the given values for the next shell stack update.
+ @param pParentShell
+ The view shell of the form shell.
+ @param pFormShell
+ The form shell.
+ @param bAbove
+ When <TRUE/> then the form shell will be placed directly above
+ pViewShell on the SFX shell stack. Otherwise the form shell is
+ placed directly below the view shell.
+ */
+ void SetFormShell(const ViewShell* pParentShell, FmFormShell* pFormShell, bool bAbove);
+
+ /** Activate the specified shell as sub shell for the given view shell.
+ The sub shell factory associated with the view shell is used to
+ create the sub shell.
+ @param rParentShell
+ The new sub shell will be placed above this view shell.
+ @param nId
+ This id is used only with the factory registered for the parent
+ view shell.
+ */
+ void ActivateSubShell(const ViewShell& rParentShell, ShellId nId);
+
+ /** Deactivate the specified sub shell.
+ */
+ void DeactivateSubShell(const ViewShell& rParentShell, ShellId nId);
+
+ /** Send all sub shells of the specified view shell an Invalidate()
+ call. This does not modify the shell stack.
+ */
+ void InvalidateAllSubShells(ViewShell const* pViewShell);
+
+ /** Move the specified view shell to the top most position on the stack
+ of view shells in relation to the other view shells. After this the
+ only shells that are higher on the stack are its object bars.
+
+ Call this method after a focus change to bring a view mode view
+ shell and is associated tool bar shells to the top of the
+ stack.
+
+ The mbKeepMainViewShellOnTop flag is not obeyed.
+
+ @param nId
+ The id of the shell to move to the top.
+ */
+ void MoveToTop(const ViewShell& rShell);
+
+ /** Return the first, i.e. top most, view shell that has been activated
+ under the given id.
+ @param nId
+ The id of the shell for which to return a pointer.
+ @return
+ When the specified shell is currently not active then NULL is
+ returned.
+ */
+ SfxShell* GetShell(ShellId nId) const;
+
+ /** Return the top-most shell on the SFX shell stack regardless of
+ whether that is a view shell or a sub shell.
+ */
+ SfxShell* GetTopShell() const;
+
+ /** Return the top-most active view shell on the internal shell stack.
+ */
+ SfxShell* GetTopViewShell() const;
+
+ /** Use this class to safely lock updates of the view shell stack.
+ */
+ class UpdateLock
+ {
+ public:
+ UpdateLock(const std::shared_ptr<ViewShellManager>& rpManager)
+ : mpManager(rpManager)
+ {
+ mpManager->LockUpdate();
+ }
+ ~UpdateLock() COVERITY_NOEXCEPT_FALSE { mpManager->UnlockUpdate(); }
+
+ private:
+ std::shared_ptr<ViewShellManager> mpManager;
+ };
+ friend class UpdateLock;
+
+private:
+ class Implementation;
+ std::unique_ptr<ViewShellManager::Implementation,
+ o3tl::default_delete<ViewShellManager::Implementation>>
+ mpImpl;
+ bool mbValid;
+
+ void LockUpdate();
+ void UnlockUpdate();
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/ViewTabBar.hxx b/sd/source/ui/inc/ViewTabBar.hxx
new file mode 100644
index 000000000..ca9db932e
--- /dev/null
+++ b/sd/source/ui/inc/ViewTabBar.hxx
@@ -0,0 +1,184 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/TabBarButton.hpp>
+#include <com/sun/star/drawing/framework/XTabBar.hpp>
+#include <com/sun/star/drawing/framework/XToolBar.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+#include <comphelper/compbase.hxx>
+#include <vcl/InterimItemWindow.hxx>
+
+#include <vector>
+
+namespace com::sun::star::drawing::framework { class XConfigurationController; }
+namespace com::sun::star::drawing::framework { class XResourceId; }
+namespace com::sun::star::drawing::framework { struct ConfigurationChangeEvent; }
+namespace com::sun::star::frame { class XController; }
+namespace vcl { class Window; }
+
+namespace sd {
+ class ViewShellBase;
+ class ViewTabBar;
+}
+
+namespace sd {
+
+class TabBarControl final : public InterimItemWindow
+{
+public:
+ TabBarControl(vcl::Window* pParentWindow, const ::rtl::Reference<ViewTabBar>& rpViewTabBar);
+ virtual void dispose() override;
+ virtual ~TabBarControl() override;
+ weld::Notebook& GetNotebook() { return *mxTabControl; }
+ int GetAllocatedWidth() const { return mnAllocatedWidth; }
+private:
+ std::unique_ptr<weld::Notebook> mxTabControl;
+ ::rtl::Reference<ViewTabBar> mpViewTabBar;
+ int mnAllocatedWidth;
+
+ DECL_LINK(ActivatePageHdl, const OString&, void);
+ DECL_LINK(NotebookSizeAllocHdl, const Size&, void);
+};
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::framework::XToolBar,
+ css::drawing::framework::XTabBar,
+ css::drawing::framework::XConfigurationChangeListener,
+ css::lang::XUnoTunnel
+ > ViewTabBarInterfaceBase;
+
+/** Tab control for switching between views in the center pane.
+*/
+class ViewTabBar final
+ : public ViewTabBarInterfaceBase
+{
+public:
+ ViewTabBar (
+ const css::uno::Reference< css::drawing::framework::XResourceId>& rxViewTabBarId,
+ const css::uno::Reference< css::frame::XController>& rxController);
+ virtual ~ViewTabBar() override;
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ const VclPtr<TabBarControl>& GetTabControl() const { return mpTabControl; }
+
+ bool ActivatePage(size_t nIndex);
+
+ //----- drawing::framework::XConfigurationChangeListener ------------------
+
+ virtual void SAL_CALL
+ notifyConfigurationChange (
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent) override;
+
+ //----- XEventListener ----------------------------------------------------
+
+ virtual void SAL_CALL disposing(
+ const css::lang::EventObject& rEvent) override;
+
+ //----- XTabBar -----------------------------------------------------------
+
+ virtual void
+ SAL_CALL addTabBarButtonAfter (
+ const css::drawing::framework::TabBarButton& rButton,
+ const css::drawing::framework::TabBarButton& rAnchor) override;
+
+ virtual void
+ SAL_CALL appendTabBarButton (
+ const css::drawing::framework::TabBarButton& rButton) override;
+
+ virtual void
+ SAL_CALL removeTabBarButton (
+ const css::drawing::framework::TabBarButton& rButton) override;
+
+ virtual sal_Bool
+ SAL_CALL hasTabBarButton (
+ const css::drawing::framework::TabBarButton& rButton) override;
+
+ virtual css::uno::Sequence<css::drawing::framework::TabBarButton>
+ SAL_CALL getTabBarButtons() override;
+
+ //----- XResource ---------------------------------------------------------
+
+ virtual css::uno::Reference<
+ css::drawing::framework::XResourceId> SAL_CALL getResourceId() override;
+
+ virtual sal_Bool SAL_CALL isAnchorOnly() override;
+
+ //----- XUnoTunnel --------------------------------------------------------
+
+ static const css::uno::Sequence<sal_Int8>& getUnoTunnelId();
+
+ virtual sal_Int64 SAL_CALL getSomething (const css::uno::Sequence<sal_Int8>& rId) override;
+
+ /** The returned value is calculated as the difference between the
+ total height of the control and the height of its first tab page.
+ This can be considered a hack.
+ This procedure works only when the control is visible. Calling this
+ method when the control is not visible results in returning a
+ default value.
+ To be on the safe side wait for this control to become visible and
+ the call this method again.
+ */
+ int GetHeight() const;
+
+ void UpdateActiveButton();
+
+ void AddTabBarButton (
+ const css::drawing::framework::TabBarButton& rButton,
+ const css::drawing::framework::TabBarButton& rAnchor);
+ void AddTabBarButton (
+ const css::drawing::framework::TabBarButton& rButton);
+ void RemoveTabBarButton (
+ const css::drawing::framework::TabBarButton& rButton);
+ bool HasTabBarButton (
+ const css::drawing::framework::TabBarButton& rButton);
+ css::uno::Sequence<css::drawing::framework::TabBarButton>
+ GetTabBarButtons();
+
+private:
+ VclPtr<TabBarControl> mpTabControl;
+ css::uno::Reference<css::frame::XController> mxController;
+ css::uno::Reference<css::drawing::framework::XConfigurationController> mxConfigurationController;
+ typedef ::std::vector<css::drawing::framework::TabBarButton> TabBarButtonList;
+ TabBarButtonList maTabBarButtons;
+ css::uno::Reference<css::drawing::framework::XResourceId> mxViewTabBarId;
+ ViewShellBase* mpViewShellBase;
+ int mnNoteBookWidthPadding;
+
+ void AddTabBarButton (
+ const css::drawing::framework::TabBarButton& rButton,
+ sal_Int32 nPosition);
+ void UpdateTabBarButtons();
+
+ /** This method is called from the constructor to get the window for an
+ anchor ResourceId and pass it to our base class. It has to be
+ static because it must not access any of the, not yet initialized
+ members.
+ */
+ static vcl::Window* GetAnchorWindow(
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewTabBarId,
+ const css::uno::Reference<css::frame::XController>& rxController);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/Window.hxx b/sd/source/ui/inc/Window.hxx
new file mode 100644
index 000000000..f1beddbc6
--- /dev/null
+++ b/sd/source/ui/inc/Window.hxx
@@ -0,0 +1,213 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <tools/gen.hxx>
+#include <tools/long.hxx>
+#include <vcl/window.hxx>
+#include <vcl/transfer.hxx>
+
+class OutlinerView;
+
+namespace sd
+{
+class ViewShell;
+
+/** An SdWindow contains the actual working area of ViewShell.
+
+ <p>The zoom factor used by this class controls how much the page and the
+ shapes on it are scaled down (<100%) or up (>100%) when displayed on the
+ output device represented by the <type>OutputDevice</type>base class. A
+ zoom factor of 100% would result (with a correctly set DPI value for an
+ output device) in a one to one mapping of the internal coordinates that
+ are stored in 100th of mm. The zoom factor is stored in the map mode
+ member of the <type>OutputDevice</type> base class. It is calculated to
+ be an integer percent value.
+*/
+class Window : public vcl::Window, public ::DropTargetHelper
+{
+public:
+ Window(vcl::Window* pParent);
+ virtual ~Window() override;
+ virtual void dispose() override;
+
+ void SetViewShell(ViewShell* pViewSh);
+ ViewShell* GetViewShell();
+
+ /** Set the zoom factor to the specified value and center the display
+ area around the zoom center.
+ @param nZoom
+ The zoom factor is given as integral percent value.
+ */
+ void SetZoomIntegral(::tools::Long nZoom);
+
+ /** This internally used method performs the actual adaptation of the
+ window's map mode to the specified zoom factor.
+ @param nZoom
+ The zoom factor is given as integral percent value.
+ @return
+ When the given zoom factor lies outside the valid range enclosed
+ by the minimal zoom factor previously calculated by
+ <member>CalcMinZoom</member> and a constant upper value it is
+ forced into that interval. Therefore the returned value is a
+ valid zoom factor.
+ */
+ ::tools::Long SetZoomFactor(::tools::Long nZoom);
+
+ /** This method is called when the whole page shall be displayed in the
+ window. Position and zoom factor are set so that the given
+ rectangle is displayed as large as possible in the window while at
+ the same time maintaining the rectangle's aspect ratio and adding a
+ small space at all its four sides (about 3% of width and height).
+ The map mode is adapted accordingly.
+ @param rZoomRect
+ The rectangle is expected to be given relative to the upper left
+ corner of the window in logical coordinates (100th of mm).
+ @return
+ The new zoom factor is returned as integral percent value.
+ */
+ ::tools::Long SetZoomRect(const ::tools::Rectangle& rZoomRect);
+
+ ::tools::Long GetZoomForRect(const ::tools::Rectangle& rZoomRect);
+
+ void SetMinZoomAutoCalc(bool bAuto);
+
+ /** Calculate the minimal zoom factor as the value at which the
+ application area would completely fill the window. All values set
+ manually or programmatically are set to this value if they are
+ smaller. If the currently used zoom factor is smaller than the minimal zoom
+ factor than set the minimal zoom factor as the new current zoom
+ factor.
+
+ <p>This calculation is performed only when the
+ <member>bMinZoomAutoCalc</member> is set (to <TRUE/>).</p>
+ */
+ void CalcMinZoom();
+ void SetMinZoom(::tools::Long nMin);
+ ::tools::Long GetMinZoom() const { return mnMinZoom; }
+ void SetMaxZoom(::tools::Long nMax);
+ ::tools::Long GetMaxZoom() const { return mnMaxZoom; }
+
+ ::tools::Long GetZoom() const;
+
+ const Point& GetWinViewPos() const { return maWinPos; }
+ const Point& GetViewOrigin() const { return maViewOrigin; }
+ const Size& GetViewSize() const { return maViewSize; }
+ void SetWinViewPos(const Point& rPnt);
+ void SetViewOrigin(const Point& rPnt);
+ void SetViewSize(const Size& rSize);
+ void SetCenterAllowed(bool bIsAllowed);
+
+ /** Calculate origin of the map mode according to the size of the view
+ and window (its size in model coordinates; that takes the zoom
+ factor into account), and the bCenterAllowed flag. When it is not
+ set then nothing is changed. When in any direction the window is
+ larger than the view or the value of aWinPos in this direction is -1
+ then the window is centered in this direction.
+ */
+ void UpdateMapOrigin(bool bInvalidate = true);
+
+ void UpdateMapMode();
+
+ double GetVisibleX() const; // interface for ScrollBars
+ double GetVisibleY() const;
+ void SetVisibleXY(double fX, double fY);
+ double GetVisibleWidth() const;
+ double GetVisibleHeight() const;
+ Point GetVisibleCenter();
+ double GetScrlLineWidth() const;
+ double GetScrlLineHeight() const;
+ double GetScrlPageWidth() const;
+ double GetScrlPageHeight() const;
+ void GrabFocus();
+ virtual void DataChanged(const DataChangedEvent& rDCEvt) override;
+
+ // DropTargetHelper
+ virtual sal_Int8 AcceptDrop(const AcceptDropEvent& rEvt) override;
+ virtual sal_Int8 ExecuteDrop(const ExecuteDropEvent& rEvt) override;
+
+ /** The DropScroll() method is used by AcceptDrop() to scroll the
+ content of the window while dragging and dropping. With this method
+ you can control whether DropScroll() shall be used.
+ */
+ void SetUseDropScroll(bool bUseDropScroll);
+ void DropScroll(const Point& rMousePos);
+ virtual void KeyInput(const KeyEvent& rKEvt) override;
+
+private:
+ OutlinerView* GetOutlinerView() const;
+
+protected:
+ Point maWinPos;
+ Point maViewOrigin;
+ Size maViewSize;
+ Size maPrevSize; // contains previous window size in logical coords
+ sal_uInt16 mnMinZoom;
+ sal_uInt16 mnMaxZoom;
+
+ /** This flag tells whether to re-calculate the minimal zoom factor
+ depending on the current zoom factor. Its default value is now false.
+ */
+ bool mbMinZoomAutoCalc;
+ bool mbCenterAllowed;
+ ::tools::Long mnTicks;
+
+ ViewShell* mpViewShell;
+ bool mbUseDropScroll;
+
+ virtual void Resize() override;
+ virtual void PrePaint(vcl::RenderContext& rRenderContext) override;
+ virtual void Paint(vcl::RenderContext& rRenderContext,
+ const ::tools::Rectangle& rRect) override;
+ virtual void MouseMove(const MouseEvent& rMEvt) override;
+ virtual void MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
+ virtual void Command(const CommandEvent& rCEvt) override;
+ virtual void RequestHelp(const HelpEvent& rEvt) override;
+ virtual void LoseFocus() override;
+ virtual bool EventNotify(NotifyEvent& rNEvt) override;
+
+ /** Create an accessibility object that makes this window accessible.
+
+ @return
+ The returned reference is empty if an accessible object could
+ not be created.
+ */
+ virtual css::uno::Reference<css::accessibility::XAccessible> CreateAccessible() override;
+
+ OUString GetSurroundingText() const override;
+ Selection GetSurroundingTextSelection() const override;
+ bool DeleteSurroundingText(const Selection& rSelection) override;
+
+ /// @see Window::LogicInvalidate().
+ void LogicInvalidate(const ::tools::Rectangle* pRectangle) override;
+ /// Same as MouseButtonDown(), but coordinates are in logic unit.
+ virtual void LogicMouseButtonDown(const MouseEvent& rMouseEvent) override;
+ /// Same as MouseButtonUp(), but coordinates are in logic unit.
+ virtual void LogicMouseButtonUp(const MouseEvent& rMouseEvent) override;
+ /// Same as MouseMove(), but coordinates are in logic unit.
+ virtual void LogicMouseMove(const MouseEvent& rMouseEvent) override;
+
+ FactoryFunction GetUITestFactory() const override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/WindowUpdater.hxx b/sd/source/ui/inc/WindowUpdater.hxx
new file mode 100644
index 000000000..2545af79f
--- /dev/null
+++ b/sd/source/ui/inc/WindowUpdater.hxx
@@ -0,0 +1,124 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svl/ctloptions.hxx>
+#include <vcl/vclptr.hxx>
+
+#include <vector>
+
+namespace vcl
+{
+class Window;
+}
+class OutputDevice;
+class SdDrawDocument;
+
+namespace sd
+{
+/** The purpose of the <type>WindowUpdater</type> is to update output
+ devices to take care of modified global values. These values are
+ monitored for changes. At the moment this is
+ the digit language that defines the glyphs to use to render digits.
+ Other values may be added in the future.
+
+ <p>The methods of this class have not been included into the
+ <type>ViewShell</type> class in order to not clutter its interface any
+ further. This class accesses some of <type>ViewShell</type> data
+ members directly and thus is declared as its friend.</p>
+
+ <p>Windows that are to be kept up-to-date have to be registered via the
+ <member>RegisterWindow()</member> method. When a document is given then
+ this document is reformatted when the monitored option changes.</p>
+*/
+class WindowUpdater final : public utl::ConfigurationListener
+{
+public:
+ explicit WindowUpdater();
+ virtual ~WindowUpdater() noexcept override;
+
+ /** Add the given device to the list of devices which will be updated
+ when one of the monitored values changes.
+ @param pWindow
+ This device is added to the device list if it is not <null/> and
+ when it is not already a member of that list.
+ */
+ void RegisterWindow(vcl::Window* pWindow);
+
+ /** Remove the given device from the list of devices which will be updated
+ when one of the monitored values changes.
+ @param pWindow
+ This device is removed from the device list when it is a member
+ of that list.
+ */
+ void UnregisterWindow(vcl::Window* pWindow);
+
+ /** Set the document so that it is reformatted when one of the monitored
+ values changes.
+ @param pDocument
+ When <null/> is given document reformatting will not take
+ place in the future.
+ */
+ void SetDocument(SdDrawDocument* pDocument);
+
+ /** Update the given output device and update all text objects of the
+ view shell if not told otherwise.
+ @param pWindow
+ The device to update. When the given pointer is NULL then
+ nothing is done.
+ */
+ void Update(OutputDevice* pDevice) const;
+
+ /** Callback that waits for notifications of a
+ <type>SvtCTLOptions</type> object.
+ */
+ virtual void ConfigurationChanged(utl::ConfigurationBroadcaster*,
+ ConfigurationHints nHint) override;
+
+private:
+ /// Options to monitor for changes.
+ SvtCTLOptions maCTLOptions;
+
+ /// The document rendered in the output devices.
+ SdDrawDocument* mpDocument;
+
+ WindowUpdater(const WindowUpdater& rUpdater) = delete;
+
+ WindowUpdater operator=(const WindowUpdater& rUpdater) = delete;
+
+ /** Type and data member for a list of devices that have to be kept
+ up-to-date.
+ */
+ typedef ::std::vector<VclPtr<vcl::Window>> tWindowList;
+ tWindowList maWindowList;
+
+ /** The central method of this class. Update the given output device.
+ It is the task of the caller to initiate a reformatting of the
+ document that is rendered on this device to reflect the changes.
+ @param pWindow
+ The output device to update. When it is <null/> then the call
+ is ignored.
+ */
+ void UpdateWindow(OutputDevice* pDevice) const;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/animobjs.hxx b/sd/source/ui/inc/animobjs.hxx
new file mode 100644
index 000000000..b44a5fb3d
--- /dev/null
+++ b/sd/source/ui/inc/animobjs.hxx
@@ -0,0 +1,163 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/dockwin.hxx>
+#include <tools/fract.hxx>
+#include <sfx2/ctrlitem.hxx>
+#include <sfx2/progress.hxx>
+#include <misc/scopelock.hxx>
+#include <vcl/bitmapex.hxx>
+#include <vcl/customweld.hxx>
+#include <vcl/weld.hxx>
+#include <vcl/weldutils.hxx>
+
+class SdDrawDocument;
+
+namespace sd {
+
+class AnimationControllerItem;
+class View;
+
+enum BitmapAdjustment
+{
+ BA_LEFT_UP,
+ BA_LEFT,
+ BA_LEFT_DOWN,
+ BA_UP,
+ BA_CENTER,
+ BA_DOWN,
+ BA_RIGHT_UP,
+ BA_RIGHT,
+ BA_RIGHT_DOWN
+};
+
+class SdDisplay : public weld::CustomWidgetController
+{
+private:
+ BitmapEx aBitmapEx;
+ Fraction aScale;
+
+public:
+ SdDisplay();
+ virtual ~SdDisplay() override;
+
+ virtual void Paint( vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect ) override;
+
+ void SetBitmapEx( BitmapEx const * pBmpEx );
+ void SetScale( const Fraction& rFrac );
+
+ virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
+};
+
+class AnimationWindow : public SfxDockingWindow
+{
+ friend class AnimationChildWindow;
+ friend class AnimationControllerItem;
+
+public:
+ AnimationWindow(SfxBindings* pBindings, SfxChildWindow *pCW, vcl::Window* pParent);
+ virtual ~AnimationWindow() override;
+ virtual void dispose() override;
+
+ void AddObj( ::sd::View& rView );
+ void CreateAnimObj( ::sd::View& rView );
+
+ virtual void DataChanged( const DataChangedEvent& rDCEvt ) override;
+
+protected:
+ virtual bool Close() override;
+ virtual void Resize() override;
+
+private:
+ std::unique_ptr<SdDisplay> m_xCtlDisplay;
+ std::unique_ptr<weld::CustomWeld> m_xCtlDisplayWin;
+ std::unique_ptr<weld::Button> m_xBtnFirst;
+ std::unique_ptr<weld::Button> m_xBtnReverse;
+ std::unique_ptr<weld::Button> m_xBtnStop;
+ std::unique_ptr<weld::Button> m_xBtnPlay;
+ std::unique_ptr<weld::Button> m_xBtnLast;
+ std::unique_ptr<weld::SpinButton> m_xNumFldBitmap;
+ std::unique_ptr<weld::FormattedSpinButton> m_xTimeField;
+ std::unique_ptr<weld::TimeFormatter> m_xFormatter;
+ std::unique_ptr<weld::ComboBox> m_xLbLoopCount;
+ std::unique_ptr<weld::Button> m_xBtnGetOneObject;
+ std::unique_ptr<weld::Button> m_xBtnGetAllObjects;
+ std::unique_ptr<weld::Button> m_xBtnRemoveBitmap;
+ std::unique_ptr<weld::Button> m_xBtnRemoveAll;
+ std::unique_ptr<weld::Label> m_xFiCount;
+
+ std::unique_ptr<weld::RadioButton> m_xRbtGroup;
+ std::unique_ptr<weld::RadioButton> m_xRbtBitmap;
+ std::unique_ptr<weld::Label> m_xFtAdjustment;
+ std::unique_ptr<weld::ComboBox> m_xLbAdjustment;
+ std::unique_ptr<weld::Button> m_xBtnCreateGroup;
+ std::unique_ptr<weld::Button> m_xBtnHelp;
+
+ ::std::vector< ::std::pair<BitmapEx, ::tools::Time> > m_FrameList;
+ static const size_t EMPTY_FRAMELIST;
+ size_t m_nCurrentFrame;
+ std::unique_ptr<SdDrawDocument> pMyDoc;
+
+ bool bMovie;
+ bool bAllObjects;
+
+ std::unique_ptr<AnimationControllerItem> pControllerItem;
+
+ ScopeLock maPlayLock;
+
+ DECL_LINK( ClickFirstHdl, weld::Button&, void );
+ DECL_LINK( ClickStopHdl, weld::Button&, void );
+ DECL_LINK( ClickPlayHdl, weld::Button&, void );
+ DECL_LINK( ClickLastHdl, weld::Button&, void );
+ DECL_LINK( ClickGetObjectHdl, weld::Button&, void );
+ DECL_LINK( ClickRemoveBitmapHdl, weld::Button&, void );
+ DECL_LINK( ClickRbtHdl, weld::Toggleable&, void );
+ DECL_LINK( ClickHelpHdl, weld::Button&, void );
+ DECL_LINK( ClickCreateGroupHdl, weld::Button&, void );
+ DECL_LINK( ModifyBitmapHdl, weld::SpinButton&, void );
+ DECL_LINK( ModifyTimeHdl, weld::FormattedSpinButton&, void );
+
+ void UpdateControl(bool bDisableCtrls = false);
+ void ResetAttrs();
+ void WaitInEffect( sal_uLong nMilliSeconds, sal_uLong nTime,
+ SfxProgress* pStbMgr ) const;
+ Fraction GetScale();
+};
+
+/**
+ * ControllerItem for Animator
+ */
+class AnimationControllerItem : public SfxControllerItem
+{
+
+public:
+ AnimationControllerItem( sal_uInt16, AnimationWindow*, SfxBindings* );
+
+protected:
+ virtual void StateChangedAtToolBoxControl( sal_uInt16 nSId, SfxItemState eState,
+ const SfxPoolItem* pState ) override;
+private:
+ VclPtr<AnimationWindow> pAnimationWin;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/annotationmanager.hxx b/sd/source/ui/inc/annotationmanager.hxx
new file mode 100644
index 000000000..6f47efd1f
--- /dev/null
+++ b/sd/source/ui/inc/annotationmanager.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <rtl/ref.hxx>
+
+class SfxRequest;
+class SfxItemSet;
+
+namespace sd
+{
+class ViewShellBase;
+class AnnotationManagerImpl;
+
+class AnnotationManager
+{
+public:
+ AnnotationManager(ViewShellBase& rViewShellBase);
+ ~AnnotationManager();
+
+ void ExecuteAnnotation(SfxRequest const& rRequest);
+ void GetAnnotationState(SfxItemSet& rItemSet);
+
+private:
+ ::rtl::Reference<AnnotationManagerImpl> mxImpl;
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/assclass.hxx b/sd/source/ui/inc/assclass.hxx
new file mode 100644
index 000000000..2b366e971
--- /dev/null
+++ b/sd/source/ui/inc/assclass.hxx
@@ -0,0 +1,68 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <vector>
+
+#include <sddllapi.h>
+
+#define MAX_PAGES 10
+
+namespace weld { class Widget; }
+
+class SD_DLLPUBLIC Assistent
+{
+ /** contains for every page the controls, which have to be
+ connected? correctly */
+ std::vector<weld::Widget*> maPages[MAX_PAGES];
+
+ /// number of pages
+ int mnPages;
+
+ int mnCurrentPage;
+
+ std::unique_ptr<bool[]> mpPageStatus;
+
+public:
+
+ Assistent(int nNoOfPage);
+
+ bool IsEnabled ( int nPage ) const;
+ void EnablePage( int nPage );
+ void DisablePage( int nPage );
+
+ /// adds a control to the specified page
+ bool InsertControl(int nDestPage, weld::Widget* pUsedControl);
+
+ void NextPage();
+
+ void PreviousPage();
+
+ bool GotoPage(const int nPageToGo);
+
+ bool IsLastPage() const;
+
+ bool IsFirstPage() const;
+
+ int GetCurrentPage() const { return mnCurrentPage;}
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/bulmaper.hxx b/sd/source/ui/inc/bulmaper.hxx
new file mode 100644
index 000000000..3de99d262
--- /dev/null
+++ b/sd/source/ui/inc/bulmaper.hxx
@@ -0,0 +1,37 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sddllapi.h>
+
+class SfxItemSet;
+class SvxNumRule;
+
+class SD_DLLPUBLIC SdBulletMapper
+{
+public:
+ /* #i35937#
+ static void PreMapNumBulletForDialog( SfxItemSet& rSet );
+ static void PostMapNumBulletForDialog( SfxItemSet& rSet );
+*/
+ static void MapFontsInNumRule(SvxNumRule& aNumRule, const SfxItemSet& rSet);
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/copydlg.hxx b/sd/source/ui/inc/copydlg.hxx
new file mode 100644
index 000000000..7d8274743
--- /dev/null
+++ b/sd/source/ui/inc/copydlg.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/basedlgs.hxx>
+#include <tools/fract.hxx>
+
+class ColorListBox;
+
+namespace sd
+{
+class View;
+
+/**
+ * dialog to adjust screen
+ */
+class CopyDlg : public SfxDialogController
+{
+public:
+ CopyDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, ::sd::View* pView);
+ virtual ~CopyDlg() override;
+
+ void GetAttr(SfxItemSet& rOutAttrs);
+ void Reset();
+
+private:
+ const SfxItemSet& mrOutAttrs;
+ Fraction maUIScale;
+ ::sd::View* mpView;
+
+ std::unique_ptr<weld::SpinButton> m_xNumFldCopies;
+ std::unique_ptr<weld::Button> m_xBtnSetViewData;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtrFldMoveX;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtrFldMoveY;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtrFldAngle;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtrFldWidth;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtrFldHeight;
+ std::unique_ptr<weld::Label> m_xFtEndColor;
+ std::unique_ptr<weld::Button> m_xBtnSetDefault;
+ std::unique_ptr<ColorListBox> m_xLbStartColor;
+ std::unique_ptr<ColorListBox> m_xLbEndColor;
+
+ DECL_LINK(SelectColorHdl, ColorListBox&, void);
+ DECL_LINK(SetViewData, weld::Button&, void);
+ DECL_LINK(SetDefault, weld::Button&, void);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/createtableobjectbar.hxx b/sd/source/ui/inc/createtableobjectbar.hxx
new file mode 100644
index 000000000..8fc21f19f
--- /dev/null
+++ b/sd/source/ui/inc/createtableobjectbar.hxx
@@ -0,0 +1,37 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+class SfxShell;
+
+namespace sd
+{
+class View;
+class ViewShell;
+}
+
+namespace sd::ui::table
+{
+SfxShell* CreateTableObjectBar(ViewShell& rShell, ::sd::View* pView);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/custsdlg.hxx b/sd/source/ui/inc/custsdlg.hxx
new file mode 100644
index 000000000..52ae87852
--- /dev/null
+++ b/sd/source/ui/inc/custsdlg.hxx
@@ -0,0 +1,91 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/weld.hxx>
+#include <vcl/weldutils.hxx>
+
+class SdDrawDocument;
+class SdCustomShow;
+class SdCustomShowList;
+
+class SdCustomShowDlg : public weld::GenericDialogController
+{
+private:
+ SdDrawDocument& rDoc;
+ SdCustomShowList* pCustomShowList;
+
+ std::unique_ptr<weld::TreeView> m_xLbCustomShows;
+ std::unique_ptr<weld::Button> m_xBtnNew;
+ std::unique_ptr<weld::Button> m_xBtnEdit;
+ std::unique_ptr<weld::Button> m_xBtnRemove;
+ std::unique_ptr<weld::Button> m_xBtnCopy;
+ std::unique_ptr<weld::Button> m_xBtnHelp;
+ std::unique_ptr<weld::Button> m_xBtnStartShow;
+ std::unique_ptr<weld::Button> m_xBtnOK;
+
+ void CheckState();
+
+ DECL_LINK( ClickButtonHdl, weld::Button&, void );
+ DECL_LINK( SelectListBoxHdl, weld::TreeView&, void );
+ DECL_LINK( StartShowHdl, weld::Button&, void );
+ void SelectHdl(void const *);
+
+public:
+ SdCustomShowDlg(weld::Window* pWindow, SdDrawDocument& rDrawDoc);
+ virtual ~SdCustomShowDlg() override;
+ bool IsCustomShow() const;
+};
+
+class SdDefineCustomShowDlg : public weld::GenericDialogController
+{
+private:
+ SdDrawDocument& rDoc;
+ std::unique_ptr<SdCustomShow>& rpCustomShow;
+ bool bModified;
+ OUString aOldName;
+
+ std::unique_ptr<weld::Entry> m_xEdtName;
+ std::unique_ptr<weld::TreeView> m_xLbPages;
+ std::unique_ptr<weld::Button> m_xBtnAdd;
+ std::unique_ptr<weld::Button> m_xBtnRemove;
+ std::unique_ptr<weld::TreeView> m_xLbCustomPages;
+ std::unique_ptr<weld::ReorderingDropTarget> m_xDropTargetHelper;
+ std::unique_ptr<weld::Button> m_xBtnOK;
+ std::unique_ptr<weld::Button> m_xBtnCancel;
+ std::unique_ptr<weld::Button> m_xBtnHelp;
+
+ void CheckState();
+ void CheckCustomShow();
+
+ DECL_LINK( ClickButtonHdl, weld::Button&, void );
+ DECL_LINK( ClickButtonEditHdl, weld::Entry&, void );
+ DECL_LINK( ClickButtonHdl3, weld::TreeView&, void );
+ DECL_LINK( ClickButtonHdl4, weld::TreeView&, void );
+ DECL_LINK( OKHdl, weld::Button&, void );
+ void ClickButtonHdl2(void const *);
+
+public:
+
+ SdDefineCustomShowDlg(weld::Window* pWindow, SdDrawDocument& rDrawDoc, std::unique_ptr<SdCustomShow>& rpCS);
+ virtual ~SdDefineCustomShowDlg() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/diactrl.hxx b/sd/source/ui/inc/diactrl.hxx
new file mode 100644
index 000000000..12e76762e
--- /dev/null
+++ b/sd/source/ui/inc/diactrl.hxx
@@ -0,0 +1,68 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/InterimItemWindow.hxx>
+#include <sfx2/tbxctrl.hxx>
+
+namespace com::sun::star::frame
+{
+class XFrame;
+}
+class SfxUInt16Item;
+
+// SdPagesField:
+
+class SdPagesField final : public InterimItemWindow
+{
+private:
+ std::unique_ptr<weld::SpinButton> m_xWidget;
+ css::uno::Reference<css::frame::XFrame> m_xFrame;
+
+ DECL_LINK(ModifyHdl, weld::SpinButton&, void);
+ DECL_STATIC_LINK(SdPagesField, OutputHdl, weld::SpinButton&, void);
+ DECL_LINK(spin_button_input, int* result, bool);
+ DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
+
+public:
+ SdPagesField(vcl::Window* pParent, const css::uno::Reference<css::frame::XFrame>& rFrame);
+ virtual void dispose() override;
+ void set_sensitive(bool bSensitive);
+ virtual ~SdPagesField() override;
+
+ void UpdatePagesField(const SfxUInt16Item* pItem);
+};
+
+// SdTbxCtlDiaPages:
+
+class SdTbxCtlDiaPages : public SfxToolBoxControl
+{
+public:
+ virtual void StateChangedAtToolBoxControl(sal_uInt16 nSID, SfxItemState eState,
+ const SfxPoolItem* pState) override;
+ virtual VclPtr<InterimItemWindow> CreateItemWindow(vcl::Window* pParent) override;
+
+ SFX_DECL_TOOLBOX_CONTROL();
+
+ SdTbxCtlDiaPages(sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx);
+ virtual ~SdTbxCtlDiaPages() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/dlg_char.hxx b/sd/source/ui/inc/dlg_char.hxx
new file mode 100644
index 000000000..36e791a09
--- /dev/null
+++ b/sd/source/ui/inc/dlg_char.hxx
@@ -0,0 +1,41 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/tabdlg.hxx>
+
+class SfxItemSet;
+class SfxObjectShell;
+
+/**
+ * Character-Tab-Dialog
+ */
+class SdCharDlg : public SfxTabDialogController
+{
+private:
+ const SfxObjectShell& rDocShell;
+
+ virtual void PageCreated(const OString& rId, SfxTabPage& rPage) override;
+
+public:
+ SdCharDlg(weld::Window* pParent, const SfxItemSet* pAttr, const SfxObjectShell* pDocShell);
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/dlgfield.hxx b/sd/source/ui/inc/dlgfield.hxx
new file mode 100644
index 000000000..769dc12c7
--- /dev/null
+++ b/sd/source/ui/inc/dlgfield.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <vcl/weld.hxx>
+#include <memory>
+#include <svl/itemset.hxx>
+
+class SvxFieldData;
+class SvxLanguageBox;
+
+/**
+ * dialog to adjust field-commands
+ */
+class SdModifyFieldDlg : public weld::GenericDialogController
+{
+private:
+ SfxItemSet m_aInputSet;
+ const SvxFieldData* m_pField;
+
+ std::unique_ptr<weld::RadioButton> m_xRbtFix;
+ std::unique_ptr<weld::RadioButton> m_xRbtVar;
+ std::unique_ptr<SvxLanguageBox> m_xLbLanguage;
+ std::unique_ptr<weld::ComboBox> m_xLbFormat;
+
+ void FillFormatList();
+ void FillControls();
+
+ DECL_LINK(LanguageChangeHdl, weld::ComboBox&, void);
+
+public:
+ SdModifyFieldDlg(weld::Window* pWindow, const SvxFieldData* pInField, const SfxItemSet& rSet);
+ virtual ~SdModifyFieldDlg() override;
+
+ SvxFieldData* GetField();
+ SfxItemSet GetItemSet() const;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/dlgpage.hxx b/sd/source/ui/inc/dlgpage.hxx
new file mode 100644
index 000000000..718ccf0c6
--- /dev/null
+++ b/sd/source/ui/inc/dlgpage.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/tabdlg.hxx>
+#include <svx/xtable.hxx>
+
+class SfxObjectShell;
+enum class ChangeType;
+
+/**
+ * Page configuration-tab-dialog
+ */
+class SdPageDlg : public SfxTabDialogController
+{
+private:
+ bool mbIsImpressDoc;
+
+ XColorListRef mpColorList;
+ XGradientListRef mpGradientList;
+ XHatchListRef mpHatchingList;
+ XBitmapListRef mpBitmapList;
+ XPatternListRef mpPatternList;
+public:
+
+ SdPageDlg(SfxObjectShell const * pDocSh, weld::Window* pParent, const SfxItemSet* pAttr, bool bAreaPage, bool bIsImpressDoc, bool bIsImpressMaster);
+
+ virtual void PageCreated(const OString& rId, SfxTabPage& rPage) override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/dlgsnap.hxx b/sd/source/ui/inc/dlgsnap.hxx
new file mode 100644
index 000000000..97fe09ccb
--- /dev/null
+++ b/sd/source/ui/inc/dlgsnap.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <tools/fract.hxx>
+#include <vcl/weld.hxx>
+
+/************************************************************************/
+
+class SfxItemSet;
+namespace sd {
+ class View;
+}
+
+/**
+ * dialog to adjust snap- lines and points
+ */
+class SdSnapLineDlg : public weld::GenericDialogController
+{
+private:
+ int nXValue;
+ int nYValue;
+ Fraction aUIScale;
+
+ std::unique_ptr<weld::Label> m_xFtX;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtrFldX;
+ std::unique_ptr<weld::Label> m_xFtY;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtrFldY;
+ std::unique_ptr<weld::Widget> m_xRadioGroup;
+ std::unique_ptr<weld::RadioButton> m_xRbPoint;
+ std::unique_ptr<weld::RadioButton> m_xRbVert;
+ std::unique_ptr<weld::RadioButton> m_xRbHorz;
+ std::unique_ptr<weld::Button> m_xBtnDelete;
+
+ DECL_LINK(ClickHdl, weld::Button&, void);
+ DECL_LINK(ToggleHdl, weld::Toggleable&, void);
+
+public:
+ SdSnapLineDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs, ::sd::View const * pView);
+ virtual ~SdSnapLineDlg() override;
+
+ void GetAttr(SfxItemSet& rOutAttrs);
+
+ void HideRadioGroup();
+ void HideDeleteBtn() { m_xBtnDelete->hide(); }
+ void SetInputFields(bool bEnableX, bool bEnableY);
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/drawview.hxx b/sd/source/ui/inc/drawview.hxx
new file mode 100644
index 000000000..daa5cc026
--- /dev/null
+++ b/sd/source/ui/inc/drawview.hxx
@@ -0,0 +1,72 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "View.hxx"
+
+#include <sddllapi.h>
+
+namespace sd {
+
+class DrawDocShell;
+class DrawViewShell;
+
+/**
+ * Derivative of ::sd::View; contains also a pointer to the document
+ */
+class SD_DLLPUBLIC DrawView : public ::sd::View
+{
+public:
+
+ DrawView (
+ DrawDocShell* pDocSh,
+ OutputDevice* pOutDev,
+ DrawViewShell* pShell);
+ virtual ~DrawView() override;
+
+ virtual void MarkListHasChanged() override;
+ void CompleteRedraw(OutputDevice* pOutDev, const vcl::Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector = nullptr) override;
+
+ virtual bool SetAttributes(const SfxItemSet& rSet, bool bReplaceAll = false, bool bSlide = false, bool bMaster = false) override;
+ void SetMasterAttributes(SdrObject* pObject, const SdPage& rPage, SfxItemSet rSet, SfxStyleSheetBasePool* pStShPool, bool& bOk, bool bMaster, bool bSlide);
+
+ virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
+
+ void BlockPageOrderChangedHint(bool bBlock);
+
+ bool SetStyleSheet(SfxStyleSheet* pStyleSheet, bool bDontRemoveHardAttr = false) override;
+
+ virtual void MakeVisible(const ::tools::Rectangle& rRect, vcl::Window& rWin) override;
+ virtual void HideSdrPage() override; // SdrPageView* pPV);
+
+ virtual void DeleteMarked() override; // from SdrView
+protected:
+ virtual void ModelHasChanged() override;
+
+private:
+ DrawDocShell* mpDocShell;
+ DrawViewShell* mpDrawViewShell;
+
+ sal_uInt16 mnPOCHSmph; ///< for blocking PageOrderChangedHint
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/filedlg.hxx b/sd/source/ui/inc/filedlg.hxx
new file mode 100644
index 000000000..6a22d6ba5
--- /dev/null
+++ b/sd/source/ui/inc/filedlg.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <vcl/errcode.hxx>
+#include <vcl/weld.hxx>
+
+#include <memory>
+
+#include <sddllapi.h>
+
+class SdFileDialog_Imp;
+
+/******************************************************************************/
+
+/**
+ The class SdOpenSoundFileDialog wraps the FileDialogHelper, displaying the
+ FILEOPEN_PLAY dialog template and performing the 'preview' functionality
+ (playing the selected sound file). The interface is a downstripped version
+ of the aforementioned class, with similar semantics.
+ */
+class SD_DLLPUBLIC SdOpenSoundFileDialog
+{
+ const std::unique_ptr<SdFileDialog_Imp> mpImpl;
+
+ SdOpenSoundFileDialog(const SdOpenSoundFileDialog&) = delete;
+ SdOpenSoundFileDialog& operator=(const SdOpenSoundFileDialog&) = delete;
+
+public:
+ SdOpenSoundFileDialog(weld::Window* pParent);
+ ~SdOpenSoundFileDialog();
+
+ ErrCode Execute();
+ OUString GetPath() const;
+ void SetPath(const OUString& rPath);
+ // WIP, please don't remove, dear Clang plugins
+ bool IsInsertAsLinkSelected() const;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/framework/Configuration.hxx b/sd/source/ui/inc/framework/Configuration.hxx
new file mode 100644
index 000000000..8f33ef431
--- /dev/null
+++ b/sd/source/ui/inc/framework/Configuration.hxx
@@ -0,0 +1,181 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XConfiguration.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <comphelper/compbase.hxx>
+
+#include <memory>
+
+namespace com::sun::star::util { class XCloneable; }
+namespace com::sun::star::drawing::framework { class XConfigurationControllerBroadcaster; }
+
+namespace sd::framework {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::framework::XConfiguration,
+ css::container::XNamed,
+ css::lang::XServiceInfo
+ > ConfigurationInterfaceBase;
+
+/** A configuration describes the resources of an application like panes,
+ views, and tool bars and their relationships that are currently active
+ or are requested to be activated. Resources are specified by URLs rather
+ than references so that not only the current configuration but also a
+ requested configuration can be represented.
+
+ A resource URL describes the type of a resource, not its actual
+ instance. For resources, like panes, that are unique with respect to an
+ application frame, that does not mean much of a difference. For other
+ resources like views, that may have more than one instance per
+ application frame, this is different. To identify them unambiguously a
+ second URL, one of a unique resource, is necessary. This second URL is
+ called the anchor of the first. The two types of resources are called
+ unique and linked respectively.
+
+ Direct manipulation of a configuration object is not advised with the
+ exception of the configuration controller and objects that implement the
+ XConfigurationChangeOperation interface.
+*/
+class Configuration final
+ : public ConfigurationInterfaceBase
+{
+public:
+ /** Create a new configuration with a broadcaster that is used to send
+ events about requested configuration changes.
+ @param rxBroadcaster
+ This broadcaster is typically the same as the one used by the
+ ConfigurationController.
+ @param bBroadcastRequestEvents
+ When this is <TRUE/> then modifications to the configuration
+ trigger the broadcasting of "ResourceActivationRequestEvent" and
+ "ResourceDeactivationRequestEvent". When this flag is <FALSE/>
+ then events with type "ResourceActivationEvent" and
+ "ResourceDeactivationEvent" are broadcasted.
+ */
+ Configuration (const css::uno::Reference<css::drawing::framework::XConfigurationControllerBroadcaster>& rxBroadcaster,
+ bool bBroadcastRequestEvents);
+ virtual ~Configuration() override;
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ // XConfiguration
+
+ virtual void SAL_CALL addResource (
+ const css::uno::Reference<css::drawing::framework::XResourceId>&
+ rxResourceId) override;
+
+ virtual void SAL_CALL removeResource(
+ const css::uno::Reference<css::drawing::framework::XResourceId>&
+ rxResourceId) override;
+
+ virtual css::uno::Sequence< css::uno::Reference<
+ css::drawing::framework::XResourceId> > SAL_CALL getResources (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxAnchorId,
+ const OUString& rsResourceURLPrefix,
+ css::drawing::framework::AnchorBindingMode eMode) override;
+
+ virtual sal_Bool SAL_CALL hasResource (
+ const css::uno::Reference<css::drawing::framework::XResourceId>&
+ rxResourceId) override;
+
+ // XCloneable
+
+ virtual css::uno::Reference<css::util::XCloneable>
+ SAL_CALL createClone() override;
+
+ // XNamed
+
+ /** Return a human readable string representation. This is used for
+ debugging purposes.
+ */
+ virtual OUString SAL_CALL getName() override;
+
+ /** This call is ignored because the XNamed interface is (mis)used to
+ give access to a human readable name for debugging purposes.
+ */
+ virtual void SAL_CALL setName (const OUString& rName) override;
+
+ OUString SAL_CALL getImplementationName() override;
+
+ sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override;
+
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ class ResourceContainer;
+ /** The resource container holds the URLs of unique resource and of
+ resource linked to unique resources.
+ */
+ std::unique_ptr<ResourceContainer> mpResourceContainer;
+
+ /** The broadcaster used for notifying listeners of requests for
+ configuration changes.
+ */
+ css::uno::Reference<css::drawing::framework::XConfigurationControllerBroadcaster>
+ mxBroadcaster;
+
+ bool mbBroadcastRequestEvents;
+
+ /** This private variant of the constructor is used for cloning a
+ Configuration object.
+ @param rResourceContainer
+ The new Configuration is created with a copy of the elements in
+ this container.
+ */
+ Configuration (const css::uno::Reference<css::drawing::framework::XConfigurationControllerBroadcaster>& rxBroadcaster,
+ bool bBroadcastRequestEvents,
+ const ResourceContainer& rResourceContainer);
+
+ /** Send an event to all interested listeners that a resource has been
+ added or removed. The event is sent to the listeners via the
+ ConfigurationController.
+ @param rxResourceId
+ The resource that is added to or removed from the configuration.
+ @param bActivation
+ This specifies whether an activation or deactivation is
+ broadcasted. The mbBroadcastRequestEvents member is also taken
+ into account when the actual event type field is determined.
+ */
+ void PostEvent (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId,
+ const bool bActivation);
+
+ /** When the called object has already been disposed this method throws
+ an exception and does not return.
+
+ @throws css::lang::DisposedException
+ */
+ void ThrowIfDisposed() const;
+};
+
+/** Return whether the two given configurations contain the same resource
+ ids. The order of resource ids is ignored. Empty references are
+ treated like empty configurations.
+*/
+bool AreConfigurationsEquivalent (
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration1,
+ const css::uno::Reference<css::drawing::framework::XConfiguration>& rxConfiguration2);
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/framework/ConfigurationController.hxx b/sd/source/ui/inc/framework/ConfigurationController.hxx
new file mode 100644
index 000000000..2fe2f48d0
--- /dev/null
+++ b/sd/source/ui/inc/framework/ConfigurationController.hxx
@@ -0,0 +1,180 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+
+#include <memory>
+
+
+namespace com::sun::star::drawing::framework { class XConfiguration; }
+namespace com::sun::star::drawing::framework { class XConfigurationChangeRequest; }
+namespace com::sun::star::drawing::framework { class XResourceId; }
+namespace com::sun::star::drawing::framework { struct ConfigurationChangeEvent; }
+
+namespace sd::framework {
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::drawing::framework::XConfigurationController,
+ css::lang::XInitialization
+ > ConfigurationControllerInterfaceBase;
+
+/** The configuration controller is responsible for maintaining the current
+ configuration.
+
+ @see css::drawing::framework::XConfigurationController
+ for an extended documentation.
+*/
+class ConfigurationController
+ : private cppu::BaseMutex,
+ public ConfigurationControllerInterfaceBase
+{
+public:
+ ConfigurationController() noexcept;
+ virtual ~ConfigurationController() noexcept override;
+ ConfigurationController(const ConfigurationController&) = delete;
+ ConfigurationController& operator=(const ConfigurationController&) = delete;
+
+ virtual void SAL_CALL disposing() override;
+
+ void ProcessEvent();
+
+ /** Normally the requested changes of the configuration are executed
+ asynchronously. However, there is at least one situation (searching
+ with the Outliner) where the surrounding code does not cope with
+ this. So, instead of calling Reschedule until the global event loop
+ executes the configuration update, this method does (almost) the
+ same without the reschedules.
+
+ Do not use this method until there is absolutely no other way.
+ */
+ void RequestSynchronousUpdate();
+
+ // XConfigurationController
+
+ virtual void SAL_CALL lock() override;
+
+ virtual void SAL_CALL unlock() override;
+
+ virtual void SAL_CALL requestResourceActivation (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId,
+ css::drawing::framework::ResourceActivationMode eMode) override;
+
+ virtual void SAL_CALL requestResourceDeactivation (
+ const css::uno::Reference<css::drawing::framework::XResourceId>&
+ rxResourceId) override;
+
+ virtual css::uno::Reference<css::drawing::framework::XResource>
+ SAL_CALL getResource (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId) override;
+
+ virtual void SAL_CALL update() override;
+
+ virtual css::uno::Reference<
+ css::drawing::framework::XConfiguration>
+ SAL_CALL getRequestedConfiguration() override;
+
+ virtual css::uno::Reference<
+ css::drawing::framework::XConfiguration>
+ SAL_CALL getCurrentConfiguration() override;
+
+ virtual void SAL_CALL restoreConfiguration (
+ const css::uno::Reference<css::drawing::framework::XConfiguration>&
+ rxConfiguration) override;
+
+ // XConfigurationControllerBroadcaster
+
+ virtual void SAL_CALL addConfigurationChangeListener (
+ const css::uno::Reference<
+ css::drawing::framework::XConfigurationChangeListener>& rxListener,
+ const OUString& rsEventType,
+ const css::uno::Any& rUserData) override;
+
+ virtual void SAL_CALL removeConfigurationChangeListener (
+ const css::uno::Reference<
+ css::drawing::framework::XConfigurationChangeListener>& rxListener) override;
+
+ virtual void SAL_CALL notifyEvent (
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent) override;
+
+ // XConfigurationRequestQueue
+
+ virtual sal_Bool SAL_CALL hasPendingRequests() override;
+
+ virtual void SAL_CALL postChangeRequest (
+ const css::uno::Reference<
+ css::drawing::framework::XConfigurationChangeRequest>& rxRequest) override;
+
+ // XResourceFactoryManager
+
+ virtual void SAL_CALL addResourceFactory(
+ const OUString& sResourceURL,
+ const css::uno::Reference<css::drawing::framework::XResourceFactory>& rxResourceFactory) override;
+
+ virtual void SAL_CALL removeResourceFactoryForURL(
+ const OUString& sResourceURL) override;
+
+ virtual void SAL_CALL removeResourceFactoryForReference(
+ const css::uno::Reference<css::drawing::framework::XResourceFactory>& rxResourceFactory) override;
+
+ virtual css::uno::Reference<css::drawing::framework::XResourceFactory>
+ SAL_CALL getResourceFactory (
+ const OUString& sResourceURL) override;
+
+ // XInitialization
+
+ virtual void SAL_CALL initialize(
+ const css::uno::Sequence<css::uno::Any>& rArguments) override;
+
+ /** Use this class instead of calling lock() and unlock() directly in
+ order to be exception safe.
+ */
+ class Lock
+ {
+ public:
+ Lock (const css::uno::Reference<
+ css::drawing::framework::XConfigurationController>& rxController);
+ ~Lock();
+ private:
+ css::uno::Reference<
+ css::drawing::framework::XConfigurationController> mxController;
+ };
+
+private:
+ class Implementation;
+ std::unique_ptr<Implementation> mpImplementation;
+ bool mbIsDisposed;
+
+ /** When the called object has already been disposed this method throws
+ an exception and does not return.
+
+ @throws css::lang::DisposedException
+ @throws css::uno::RuntimeException
+ */
+ void ThrowIfDisposed () const;
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/framework/DrawModule.hxx b/sd/source/ui/inc/framework/DrawModule.hxx
new file mode 100644
index 000000000..79a59b4f9
--- /dev/null
+++ b/sd/source/ui/inc/framework/DrawModule.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+
+namespace com::sun::star::frame
+{
+class XController;
+}
+namespace com::sun::star::uno
+{
+template <typename> class Reference;
+}
+
+namespace sd::framework
+{
+/** The task of this module is to instantiate all modules that belong to the
+ Draw application.
+*/
+class DrawModule
+{
+public:
+ static void Initialize(css::uno::Reference<css::frame::XController> const& rxController);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/framework/FrameworkHelper.hxx b/sd/source/ui/inc/framework/FrameworkHelper.hxx
new file mode 100644
index 000000000..c9bf981bb
--- /dev/null
+++ b/sd/source/ui/inc/framework/FrameworkHelper.hxx
@@ -0,0 +1,340 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <ViewShell.hxx>
+
+#include <tools/SdGlobalResourceContainer.hxx>
+
+#include <functional>
+#include <map>
+#include <memory>
+
+namespace com::sun::star::drawing::framework { class XConfigurationController; }
+namespace com::sun::star::drawing::framework { class XResourceId; }
+namespace com::sun::star::drawing::framework { class XView; }
+namespace com::sun::star::drawing::framework { struct ConfigurationChangeEvent; }
+
+namespace sd {
+class ViewShellBase;
+}
+
+
+namespace sd::framework {
+
+/** The FrameworkHelper is a convenience class that simplifies the
+ access to the drawing framework.
+ It has three main tasks:
+ 1. Provide frequently used strings of resource URLs and event names.
+ 2. Provide shortcuts for accessing the sd framework.
+ 3. Ease the migration to the drawing framework.
+
+ Note that a FrameworkHelper disposes itself when one of the resource
+ controllers called by it throws a DisposedException.
+*/
+class FrameworkHelper
+ : public std::enable_shared_from_this<FrameworkHelper>,
+ public SdGlobalResource
+{
+public:
+ // URLs of frequently used panes.
+ static constexpr OUStringLiteral msPaneURLPrefix = u"private:resource/pane/";
+ static const OUString msCenterPaneURL;
+ static const OUString msFullScreenPaneURL;
+ static const OUString msLeftImpressPaneURL;
+ static const OUString msLeftDrawPaneURL;
+
+ // URLs of frequently used views.
+ static constexpr OUStringLiteral msViewURLPrefix = u"private:resource/view/";
+ static const OUString msImpressViewURL;
+ static const OUString msDrawViewURL;
+ static const OUString msOutlineViewURL;
+ static const OUString msNotesViewURL;
+ static const OUString msHandoutViewURL;
+ static const OUString msSlideSorterURL;
+ static const OUString msPresentationViewURL;
+ static const OUString msSidebarViewURL;
+
+ // URLs of frequently used tool bars.
+ static constexpr OUStringLiteral msToolBarURLPrefix = u"private:resource/toolbar/";
+ static const OUString msViewTabBarURL;
+
+ // Names of frequently used events.
+ static constexpr OUStringLiteral msResourceActivationRequestEvent
+ = u"ResourceActivationRequested";
+ static constexpr OUStringLiteral msResourceDeactivationRequestEvent
+ = u"ResourceDeactivationRequest";
+ static constexpr OUStringLiteral msResourceActivationEvent = u"ResourceActivation";
+ static constexpr OUStringLiteral msResourceDeactivationEvent = u"ResourceDeactivation";
+ static constexpr OUStringLiteral msResourceDeactivationEndEvent = u"ResourceDeactivationEnd";
+ static constexpr OUStringLiteral msConfigurationUpdateStartEvent = u"ConfigurationUpdateStart";
+ static constexpr OUStringLiteral msConfigurationUpdateEndEvent = u"ConfigurationUpdateEnd";
+
+ /** Return the FrameworkHelper object that is associated with the given
+ ViewShellBase. If such an object does not yet exist, a new one is
+ created.
+ */
+ static ::std::shared_ptr<FrameworkHelper> Instance (ViewShellBase& rBase);
+
+ /** Mark the FrameworkHelper object for the given ViewShellBase as
+ disposed. A following ReleaseInstance() call will destroy the
+ FrameworkHelper object.
+
+ Do not call this method. It is an internally used method that can
+ not be made private.
+ */
+ static void DisposeInstance (const ViewShellBase& rBase);
+
+ /** Destroy the FrameworkHelper object for the given ViewShellBase.
+
+ Do not call this method. It is an internally used method that can
+ not be made private.
+ */
+ static void ReleaseInstance (const ViewShellBase& rBase);
+
+ /** Return an identifier for the given view URL. This identifier can be
+ used in a switch statement. See GetViewURL() for a mapping in the
+ opposite direction.
+ */
+ static ViewShell::ShellType GetViewId (const OUString& rsViewURL);
+
+ /** Return a view URL for the given identifier. See GetViewId() for a
+ mapping in the opposite direction.
+ */
+ static OUString GetViewURL (ViewShell::ShellType eType);
+
+ /** Return a ViewShell pointer for the given XView reference. This
+ assumes that the given reference is implemented by the
+ ViewShellWrapper class that supports the XTunnel interface.
+ @return
+ When the ViewShell pointer can not be inferred from the given
+ reference then an empty pointer is returned.
+ */
+ static ::std::shared_ptr<ViewShell> GetViewShell (
+ const css::uno::Reference<css::drawing::framework::XView>& rxView);
+
+ typedef ::std::function<bool (const css::drawing::framework::ConfigurationChangeEvent&)>
+ ConfigurationChangeEventFilter;
+ typedef ::std::function<void (bool bEventSeen)> Callback;
+ typedef ::std::function<
+ void (
+ const css::uno::Reference<
+ css::drawing::framework::XResourceId>&)
+ > ResourceFunctor;
+
+ /** Test whether the called FrameworkHelper object is valid.
+ @return
+ When the object has already been disposed then <FALSE/> is returned.
+ */
+ bool IsValid() const;
+
+ /** Return a pointer to the view shell that is displayed in the
+ specified pane. See GetView() for a variant that returns a
+ reference to XView instead of a ViewShell pointer.
+ @return
+ An empty pointer is returned when for example the specified pane
+ does not exist or is not visible or does not show a view or one
+ of the involved objects does not support XUnoTunnel (where
+ necessary).
+ */
+ ::std::shared_ptr<ViewShell> GetViewShell (const OUString& rsPaneURL);
+
+ /** Return a reference to the view that is displayed in the specified
+ pane. See GetViewShell () for a variant that returns a ViewShell
+ pointer instead of a reference to XView.
+ @param rxPaneOrViewId
+ When this ResourceId specifies a view then that view is
+ returned. When it belongs to a pane then one view in that pane
+ is returned.
+ @return
+ An empty reference is returned when for example the specified pane
+ does not exist or is not visible or does not show a view or one
+ of the involved objects does not support XTunnel (where
+ necessary).
+ */
+ css::uno::Reference<css::drawing::framework::XView> GetView (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneOrViewId);
+
+ /** Request the specified view to be displayed in the specified pane.
+ When the pane is not visible its creation is also requested. The
+ update that creates the actual view object is done asynchronously.
+ @param rsResourceURL
+ The resource URL of the view to show.
+ @param rsAnchorURL
+ The URL of the pane in which to show the view.
+ @return
+ The resource id of the requested view is returned. With that
+ the caller can, for example, call RunOnResourceActivation() to
+ do some initialization after the requested view becomes active.
+ */
+ css::uno::Reference<css::drawing::framework::XResourceId> RequestView (
+ const OUString& rsResourceURL,
+ const OUString& rsAnchorURL);
+
+ /** Process a slot call that requests a view shell change.
+ */
+ void HandleModeChangeSlot (
+ sal_uInt16 nSlotId,
+ SfxRequest const & rRequest);
+
+ /** Run the given callback when the specified event is notified by the
+ ConfigurationManager. When there are no pending requests and
+ therefore no events would be notified (in the foreseeable future)
+ then the callback is called immediately.
+ The callback is called with a flag that tells the callback whether
+ the event it waits for has been sent.
+ */
+ void RunOnConfigurationEvent(
+ const OUString& rsEventType,
+ const Callback& rCallback);
+
+ /** Run the given callback when the specified resource has been
+ activated. When the resource is active already when this method is
+ called then rCallback is called before this method returns.
+ @param rxResourceId
+ Wait for the activation of this resource before calling
+ rCallback.
+ @param rCallback
+ The callback to be called when the resource is activated.
+
+ */
+ void RunOnResourceActivation(
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId,
+ const Callback& rCallback);
+
+ /** Normally the requested changes of the configuration are executed
+ asynchronously. However, there is at least one situation (searching
+ with the Outliner) where the surrounding code does not cope with
+ this. So, instead of calling Reschedule until the global event loop
+ executes the configuration update, this method does (almost) the
+ same without the reschedules.
+
+ Do not use this method until there is absolutely no other way.
+ */
+ void RequestSynchronousUpdate();
+
+ /** Block until the specified event is notified by the configuration
+ controller. When the configuration controller is not processing any
+ requests the method returns immediately.
+ */
+ void WaitForEvent (const OUString& rsEventName) const;
+
+ /** This is a short cut for WaitForEvent(msConfigurationUpdateEndEvent).
+ Call this method to execute the pending requests.
+ */
+ void WaitForUpdate() const;
+
+ /** Explicit request for an update of the current configuration. Call
+ this method when one of the resources managed by the sd framework
+ has been activated or deactivated from the outside, i.e. not by the
+ framework itself. An example for this is a click on the closer
+ button of one of the side panes.
+ */
+ void UpdateConfiguration();
+
+ /** Return a string representation of the given XResourceId object.
+ */
+ static OUString ResourceIdToString (
+ const css::uno::Reference<
+ css::drawing::framework::XResourceId>& rxResourceId);
+
+ /** Create a new XResourceId object for the given resource URL.
+ */
+ static css::uno::Reference<
+ css::drawing::framework::XResourceId>
+ CreateResourceId (
+ const OUString& rsResourceURL);
+
+ /** Create a new XResourceId object for the given resource URL and a
+ single anchor URL.
+ */
+ static css::uno::Reference<
+ css::drawing::framework::XResourceId>
+ CreateResourceId (
+ const OUString& rsResourceURL,
+ const OUString& rsAnchorURL);
+
+ /** Create a new XResourceId object for the given resource URL.
+ */
+ static css::uno::Reference<
+ css::drawing::framework::XResourceId>
+ CreateResourceId (
+ const OUString& rsResourceURL,
+ const css::uno::Reference<
+ css::drawing::framework::XResourceId>& rxAnchor);
+
+ const css::uno::Reference<css::drawing::framework::XConfigurationController>&
+ GetConfigurationController() const { return mxConfigurationController;}
+
+private:
+ typedef ::std::map<
+ const ViewShellBase*,
+ ::std::shared_ptr<FrameworkHelper> > InstanceMap;
+ /** The instance map holds (at least) one FrameworkHelper instance for
+ every ViewShellBase object.
+ */
+ static InstanceMap maInstanceMap;
+ class ViewURLMap;
+ static ViewURLMap maViewURLMap;
+
+ ViewShellBase& mrBase;
+ css::uno::Reference<css::drawing::framework::XConfigurationController>
+ mxConfigurationController;
+
+ class DisposeListener;
+ friend class DisposeListener;
+ css::uno::Reference<css::lang::XComponent>
+ mxDisposeListener;
+
+ FrameworkHelper (ViewShellBase& rBase);
+ FrameworkHelper (const FrameworkHelper& rHelper) = delete;
+ virtual ~FrameworkHelper() override;
+ class Deleter; friend class Deleter;
+ FrameworkHelper& operator= (const FrameworkHelper& rHelper) = delete;
+
+ void Initialize();
+
+ void Dispose();
+
+ /** Run the given callback when an event of the specified type is
+ received from the ConfigurationController or when the
+ ConfigurationController has no pending change requests.
+ @param rsEventType
+ Run rCallback only on this event.
+ @param rFilter
+ This filter has to return <TRUE/> in order for rCallback to be
+ called.
+ @param rCallback
+ The callback functor to be called.
+ */
+ void RunOnEvent(
+ const OUString& rsEventType,
+ const ConfigurationChangeEventFilter& rFilter,
+ const Callback& rCallback) const;
+
+ /** This disposing method is forwarded from the inner DisposeListener class.
+ */
+ void disposing (const css::lang::EventObject& rEventObject);
+};
+
+} // end of namespace sd::framework
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/framework/ImpressModule.hxx b/sd/source/ui/inc/framework/ImpressModule.hxx
new file mode 100644
index 000000000..da7ede9d9
--- /dev/null
+++ b/sd/source/ui/inc/framework/ImpressModule.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+
+namespace com::sun::star::frame
+{
+class XController;
+}
+namespace com::sun::star::uno
+{
+template <class interface_type> class Reference;
+}
+
+namespace sd::framework
+{
+/** The task of this module is to instantiate all modules that belong to the
+ Impress application.
+*/
+class ImpressModule
+{
+public:
+ static void Initialize(css::uno::Reference<css::frame::XController> const& rxController);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/framework/ModuleController.hxx b/sd/source/ui/inc/framework/ModuleController.hxx
new file mode 100644
index 000000000..4efc6cc15
--- /dev/null
+++ b/sd/source/ui/inc/framework/ModuleController.hxx
@@ -0,0 +1,114 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XModuleController.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <comphelper/compbase.hxx>
+#include <cppuhelper/weakref.hxx>
+
+#include <unordered_map>
+
+namespace com::sun::star::frame { class XController; }
+namespace com::sun::star::uno { class XComponentContext; }
+
+namespace sd::framework {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::framework::XModuleController,
+ css::lang::XInitialization
+ > ModuleControllerInterfaceBase;
+
+/** The ModuleController has two tasks:
+
+ 1. It reads the
+ org.openoffice.Office.Impress/MultiPaneGUI/Framework/ResourceFactories
+ configuration data that maps from resource URLs to service names of
+ factories that can create resources for the URLs. When the
+ configuration controller wants to create a resource for which it does
+ not have a factory, it asks the ModuleController to provide one. The
+ ModuleController looks up the service name registered for the URL of the
+ resource and instantiates this service. The service is expected to
+ register on its creation a factory for the resource in question.
+
+ 2. The ModuleController reads on its creation
+ org.openoffice.Office.Impress/MultiPaneGUI/Framework/StartupServices
+ configuration data and instantiates all listed services. These services
+ can then register as listeners at the ConfigurationController or do
+ whatever they like.
+*/
+class ModuleController final
+ : public ModuleControllerInterfaceBase
+{
+public:
+ static css::uno::Reference<
+ css::drawing::framework::XModuleController>
+ CreateInstance (
+ const css::uno::Reference<css::uno::XComponentContext>&
+ rxContext);
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ // XModuleController
+
+ virtual void SAL_CALL requestResource(const OUString& rsResourceURL) override;
+
+ // XInitialization
+
+ virtual void SAL_CALL initialize(
+ const css::uno::Sequence<css::uno::Any>& aArguments) override;
+
+private:
+ css::uno::Reference<
+ css::frame::XController> mxController;
+
+ std::unordered_map<OUString, OUString> maResourceToFactoryMap;
+ std::unordered_map<OUString, css::uno::WeakReference<css::uno::XInterface>> maLoadedFactories;
+
+ /// @throws std::exception
+ ModuleController (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext);
+ ModuleController (const ModuleController&) = delete;
+ virtual ~ModuleController() noexcept override;
+
+ /** Called for every entry in the ResourceFactories configuration entry.
+ */
+ void ProcessFactory (const ::std::vector<css::uno::Any>& rValues);
+
+ /** Instantiate all startup services that are found in the
+ /org.openoffice.Office.Impress/MultiPaneGUI/Framework/StartupServices
+ configuration entry. This method is called once when a new
+ ModuleController object is created.
+ */
+ void InstantiateStartupServices();
+
+ /** Called for one entry in the StartupServices configuration list this
+ method instantiates the service described by the entry. It does not
+ hold references to the new object so that the object will be
+ destroyed on function exit when it does not register itself
+ somewhere. It typically will register as
+ XConfigurationChangeListener at the configuration controller.
+ */
+ void ProcessStartupService (const ::std::vector<css::uno::Any>& rValues);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/framework/Pane.hxx b/sd/source/ui/inc/framework/Pane.hxx
new file mode 100644
index 000000000..9e8ee25a1
--- /dev/null
+++ b/sd/source/ui/inc/framework/Pane.hxx
@@ -0,0 +1,141 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/drawing/framework/XPane2.hpp>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <vcl/vclptr.hxx>
+#include <vcl/window.hxx>
+
+namespace sd::framework {
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::drawing::framework::XPane,
+ css::drawing::framework::XPane2,
+ css::lang::XUnoTunnel
+ > PaneInterfaceBase;
+
+/** A pane is a wrapper for a window and possibly for a tab bar (for view
+ switching). Panes are unique resources.
+
+ This class has two responsibilities:
+ 1. It implements the XPane interface. This is the most important
+ interface of this class for API based views (of which there not that
+ many yet) because it gives access to the XWindow.
+ 2. It gives access to the underlying VCL Window by implementing the
+ XUnoTunnel interface. This is necessary at the moment and in the
+ foreseeable future because many parts of the Draw and Impress views rely
+ on direct access on the Window class.
+*/
+class Pane
+ : protected cppu::BaseMutex,
+ public PaneInterfaceBase
+{
+public:
+ /** Create a new Pane object that wraps the given window.
+ @param rsPaneURL
+ The URL that is used by the configuration to identify the pane.
+ The given URL has to be valid.
+ @param pWindow
+ The VCL Window (usually this really is an sd::Window) that is
+ wrapped by the new Pane object. The given pointer must not be
+ NULL.
+ */
+ Pane (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
+ vcl::Window* pWindow)
+ noexcept;
+ virtual ~Pane() override;
+
+ virtual void SAL_CALL disposing() override;
+
+ static const css::uno::Sequence<sal_Int8>& getUnoTunnelId();
+
+ /** This method is typically used together with the XUnoTunnel to obtain
+ a Window pointer from an XPane object.
+ */
+ virtual vcl::Window* GetWindow();
+
+ //----- XPane -------------------------------------------------------------
+
+ /** For a UNO API based implementation of a view this may the most
+ important method of this class because the view is only interested
+ in the window of the pane.
+ */
+ virtual css::uno::Reference<css::awt::XWindow>
+ SAL_CALL getWindow() override;
+
+ virtual css::uno::Reference<css::rendering::XCanvas>
+ SAL_CALL getCanvas() override;
+
+ //----- XPane2 -------------------------------------------------------------
+
+ virtual sal_Bool SAL_CALL isVisible() override;
+
+ virtual void SAL_CALL setVisible (sal_Bool bIsVisible) override;
+
+ virtual css::uno::Reference<css::accessibility::XAccessible> SAL_CALL getAccessible() override;
+
+ virtual void SAL_CALL setAccessible (
+ const css::uno::Reference<css::accessibility::XAccessible>& rxAccessible) override;
+
+ //----- XResource ---------------------------------------------------------
+
+ virtual css::uno::Reference<css::drawing::framework::XResourceId>
+ SAL_CALL getResourceId() override;
+
+ /** For the typical pane it makes no sense to be displayed without a
+ view. Therefore this default implementation returns always <TRUE/>.
+ */
+ virtual sal_Bool SAL_CALL isAnchorOnly() override;
+
+ //----- XUnoTunnel --------------------------------------------------------
+
+ virtual sal_Int64 SAL_CALL getSomething (const css::uno::Sequence<sal_Int8>& rId) override;
+
+protected:
+ css::uno::Reference<css::drawing::framework::XResourceId> mxPaneId;
+ VclPtr<vcl::Window> mpWindow;
+ css::uno::Reference<css::awt::XWindow> mxWindow;
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+
+ /** Override this method, not getCanvas(), when you want to provide a
+ different canvas.
+
+ @throws css::uno::RuntimeException
+ */
+ virtual css::uno::Reference<css::rendering::XCanvas>
+ CreateCanvas();
+
+ /** Throw DisposedException when the object has already been disposed or
+ is currently being disposed. Otherwise this method returns
+ normally.
+
+ @throws css::lang::DisposedException
+ */
+ void ThrowIfDisposed() const;
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/framework/PresentationFactory.hxx b/sd/source/ui/inc/framework/PresentationFactory.hxx
new file mode 100644
index 000000000..897825c8a
--- /dev/null
+++ b/sd/source/ui/inc/framework/PresentationFactory.hxx
@@ -0,0 +1,77 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XResourceFactory.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp>
+#include <comphelper/compbase.hxx>
+
+namespace com::sun::star::frame { class XController; }
+
+namespace sd::framework {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::framework::XResourceFactory,
+ css::drawing::framework::XConfigurationChangeListener
+ > PresentationFactoryInterfaceBase;
+
+/** This factory creates a marker view whose existence in a configuration
+ indicates that a slideshow is running (in another but associated
+ application window).
+*/
+class PresentationFactory final
+ : public PresentationFactoryInterfaceBase
+{
+public:
+ PresentationFactory (
+ const css::uno::Reference<css::frame::XController>& rxController);
+ virtual ~PresentationFactory() override;
+
+ // XResourceFactory
+
+ virtual css::uno::Reference<css::drawing::framework::XResource>
+ SAL_CALL createResource (
+ const css::uno::Reference<
+ css::drawing::framework::XResourceId>& rxViewId) override;
+
+ virtual void SAL_CALL releaseResource (
+ const css::uno::Reference<css::drawing::framework::XResource>& xView) override;
+
+ // XConfigurationChangeListener
+
+ virtual void SAL_CALL notifyConfigurationChange (
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent) override;
+
+ // lang::XEventListener
+
+ using WeakComponentImplHelperBase::disposing;
+ virtual void SAL_CALL disposing (
+ const css::lang::EventObject& rEventObject) override;
+
+private:
+ css::uno::Reference<css::frame::XController> mxController;
+
+ /// @throws css::lang::DisposedException
+ void ThrowIfDisposed() const;
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/framework/PresentationModule.hxx b/sd/source/ui/inc/framework/PresentationModule.hxx
new file mode 100644
index 000000000..f6dcfbc69
--- /dev/null
+++ b/sd/source/ui/inc/framework/PresentationModule.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+
+namespace com::sun::star::frame
+{
+class XController;
+}
+namespace com::sun::star::uno
+{
+template <class interface_type> class Reference;
+}
+
+namespace sd::framework
+{
+/** The task of this module is to instantiate all modules that belong to the
+ fullscreen presentation.
+*/
+class PresentationModule
+{
+public:
+ static void Initialize(css::uno::Reference<css::frame::XController> const& rxController);
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/framework/ResourceId.hxx b/sd/source/ui/inc/framework/ResourceId.hxx
new file mode 100644
index 000000000..98b456c76
--- /dev/null
+++ b/sd/source/ui/inc/framework/ResourceId.hxx
@@ -0,0 +1,213 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <vector>
+
+#include <com/sun/star/drawing/framework/XResourceId.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <cppuhelper/implbase.hxx>
+
+#include <memory>
+
+namespace com::sun::star::util { class XURLTransformer; }
+namespace com::sun::star::uno { template <class interface_type> class WeakReference; }
+
+namespace sd::framework {
+
+typedef ::cppu::WeakImplHelper <
+ css::drawing::framework::XResourceId,
+ css::lang::XInitialization,
+ css::lang::XServiceInfo
+ > ResourceIdInterfaceBase;
+
+/** Implementation of the css::drawing::framework::ResourceId
+ service and the css::drawing::framework::XResourceId
+ interface.
+*/
+class ResourceId
+ : public ResourceIdInterfaceBase
+{
+public:
+ /** Create a new, empty resource id.
+ */
+ ResourceId();
+
+ /** Create a new resource id that is described by the given URLs.
+ @param rsResourceURLs
+ The first URL specifies the type of resource. The other URLs
+ describe its anchor.
+ The set of URLs may be empty. The result is then the same as
+ returned by ResourceId() default constructor.
+ */
+ ResourceId (std::vector<OUString>&& rsResourceURLs);
+
+ /** Create a new resource id that has an empty anchor.
+ @param rsResourceURL
+ When this resource URL is empty then the resulting ResourceId
+ object is identical to when the ResourceId() default constructor
+ had been called.
+ */
+ ResourceId (
+ const OUString& rsResourceURL);
+
+ /** Create a new resource id for the given resource type and an anchor
+ that is specified by a single URL. This constructor can be used for
+ example for views that are bound to panes.
+ @param rsResourceURL
+ The URL of the actual resource.
+ @param rsAnchorURL
+ The single URL of the anchor.
+ */
+ ResourceId (
+ const OUString& rsResourceURL,
+ const OUString& rsAnchorURL);
+
+ /** Create a new resource id with an anchor that consists of a sequence
+ of URLs that is extended by a further URL.
+ @param rsResourceURL
+ The URL of the actual resource.
+ @param rsFirstAnchorURL
+ This URL extends the anchor given by rAnchorURLs.
+ @param rAnchorURLs
+ An anchor as it is returned by XResourceId::getAnchorURLs().
+ */
+ ResourceId (
+ const OUString& rsResourceURL,
+ const OUString& rsFirstAnchorURL,
+ const css::uno::Sequence<OUString>& rAnchorURLs);
+
+ virtual ~ResourceId() override;
+
+ //===== XResourceId =======================================================
+
+ virtual OUString SAL_CALL
+ getResourceURL() override;
+
+ virtual css::util::URL SAL_CALL
+ getFullResourceURL() override;
+
+ virtual sal_Bool SAL_CALL
+ hasAnchor() override;
+
+ virtual css::uno::Reference<
+ css::drawing::framework::XResourceId> SAL_CALL
+ getAnchor() override;
+
+ virtual css::uno::Sequence<OUString> SAL_CALL
+ getAnchorURLs() override;
+
+ virtual OUString SAL_CALL
+ getResourceTypePrefix() override;
+
+ virtual sal_Int16 SAL_CALL
+ compareTo (const css::uno::Reference<
+ css::drawing::framework::XResourceId>& rxResourceId) override;
+
+ virtual sal_Bool SAL_CALL
+ isBoundTo (
+ const css::uno::Reference<
+ css::drawing::framework::XResourceId>& rxResourceId,
+ css::drawing::framework::AnchorBindingMode eMode) override;
+
+ virtual sal_Bool SAL_CALL
+ isBoundToURL (
+ const OUString& rsAnchorURL,
+ css::drawing::framework::AnchorBindingMode eMode) override;
+
+ virtual css::uno::Reference<
+ css::drawing::framework::XResourceId> SAL_CALL
+ clone() override;
+
+ //===== XInitialization ===================================================
+
+ void SAL_CALL initialize (
+ const css::uno::Sequence<css::uno::Any>& aArguments) override;
+
+ OUString SAL_CALL getImplementationName() override;
+
+ sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override;
+
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+private:
+ /** The set of URLs that consist of the resource URL at index 0 and the
+ anchor URLs and indices 1 and above.
+ */
+ std::vector<OUString> maResourceURLs;
+
+ std::unique_ptr<css::util::URL> mpURL;
+
+ static css::uno::WeakReference<css::util::XURLTransformer> mxURLTransformerWeak;
+
+ /** Compare the called ResourceId object to the given ResourceId object.
+ This uses the implementation of both objects to speed up the
+ comparison.
+ */
+ sal_Int16 CompareToLocalImplementation (const ResourceId& rId) const;
+
+ /** Compare the called ResourceId object to the given XResourceId object
+ reference. The comparison is done via the UNO interface. Namely,
+ it uses the getResourceURL() and the getAnchorURLs() methods to get
+ access to the URLs of the given object.
+ */
+ sal_Int16 CompareToExternalImplementation (const css::uno::Reference<
+ css::drawing::framework::XResourceId>& rxId) const;
+
+ /** Return whether the called ResourceId object is bound to the anchor
+ consisting of the URLs given by psFirstAnchorURL and paAnchorURLs.
+ @param psFirstAnchorURL
+ Optional first URL of the anchor. This can be missing or present
+ independently of paAnchorURLs.
+ @param paAnchorURLs
+ Optional set of additional anchor URLs. This can be missing or
+ present independently of psFirstAnchorURL.
+ @param eMode
+ This specifies whether the called resource has to be directly
+ bound to the given anchor in order to return <TRUE/> or whether
+ it can be bound indirectly, too.
+ */
+ bool IsBoundToAnchor (
+ const OUString* psFirstAnchorURL,
+ const css::uno::Sequence<OUString>* paAnchorURLs,
+ css::drawing::framework::AnchorBindingMode eMode) const;
+
+ /** Return whether the called ResourceId object is bound to the anchor
+ consisting of the URLs in rResourceURLs.
+ @param rResourceURLs
+ A possibly empty list of anchor URLs.
+ @param eMode
+ This specifies whether the called resource has to be directly
+ bound to the given anchor in order to return <TRUE/> or whether
+ it can be bound indirectly, too.
+ */
+ bool IsBoundToAnchor (
+ const ::std::vector<OUString>& rResourceURLs,
+ css::drawing::framework::AnchorBindingMode eMode) const;
+
+ void ParseResourceURL();
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/framework/ViewShellWrapper.hxx b/sd/source/ui/inc/framework/ViewShellWrapper.hxx
new file mode 100644
index 000000000..43dca4d67
--- /dev/null
+++ b/sd/source/ui/inc/framework/ViewShellWrapper.hxx
@@ -0,0 +1,131 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <com/sun/star/drawing/framework/XRelocatableResource.hpp>
+#include <com/sun/star/view/XSelectionSupplier.hpp>
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+#include <comphelper/compbase.hxx>
+
+#include <memory>
+
+namespace sd { class ViewShell; }
+namespace sd::slidesorter { class SlideSorterViewShell; }
+namespace com::sun::star::awt { class XWindow; }
+
+namespace sd::framework {
+
+typedef comphelper::WeakComponentImplHelper < css::lang::XUnoTunnel
+ , css::awt::XWindowListener
+ , css::view::XSelectionSupplier
+ , css::drawing::framework::XRelocatableResource
+ , css::drawing::framework::XView
+ > ViewShellWrapperInterfaceBase;
+
+/** This class wraps ViewShell objects and makes them look like an XView.
+ Most importantly it provides a tunnel to the ViewShell implementation.
+ Then it forwards size changes of the pane window to the view shell.
+*/
+class ViewShellWrapper final : public ViewShellWrapperInterfaceBase
+{
+public:
+ /** Create a new ViewShellWrapper object that wraps the given ViewShell
+ object.
+ @param pViewShell
+ The ViewShell object to wrap.
+ @param rsViewURL
+ URL of the view type of the wrapped view shell.
+ @param rxWindow
+ This window reference is optional. When a valid reference is
+ given then size changes of the referenced window are forwarded
+ to the ViewShell object.
+ */
+ ViewShellWrapper (
+ const ::std::shared_ptr<ViewShell>& pViewShell,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ const css::uno::Reference<css::awt::XWindow>& rxWindow);
+ virtual ~ViewShellWrapper() override;
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+ virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override;
+
+ static const css::uno::Sequence<sal_Int8>& getUnoTunnelId();
+
+ /** This method is typically used together with the XUnoTunnel interface
+ to obtain a pointer to the wrapped ViewShell object for a given
+ XView object.
+ */
+ const ::std::shared_ptr<ViewShell>& GetViewShell() const { return mpViewShell;}
+
+ // XUnoTunnel
+
+ virtual sal_Int64 SAL_CALL getSomething (const css::uno::Sequence<sal_Int8>& rId) override;
+
+ // XResource
+
+ virtual css::uno::Reference<css::drawing::framework::XResourceId>
+ SAL_CALL getResourceId() override;
+
+ virtual sal_Bool SAL_CALL isAnchorOnly() override;
+
+ // XSelectionSupplier
+
+ virtual sal_Bool SAL_CALL select( const css::uno::Any& aSelection ) override;
+ virtual css::uno::Any SAL_CALL getSelection() override;
+ virtual void SAL_CALL addSelectionChangeListener( const css::uno::Reference< css::view::XSelectionChangeListener >& xListener ) override;
+ virtual void SAL_CALL removeSelectionChangeListener( const css::uno::Reference< css::view::XSelectionChangeListener >& xListener ) override;
+
+ // XRelocatableResource
+
+ virtual sal_Bool SAL_CALL relocateToAnchor (
+ const css::uno::Reference<
+ css::drawing::framework::XResource>& xResource) override;
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized(
+ const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved(
+ const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown(
+ const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden(
+ const css::lang::EventObject& rEvent) override;
+
+ // XEventListener
+
+ virtual void SAL_CALL disposing(
+ const css::lang::EventObject& rEvent) override;
+
+private:
+ ::std::shared_ptr< ViewShell > mpViewShell;
+ ::std::shared_ptr< ::sd::slidesorter::SlideSorterViewShell > mpSlideSorterViewShell;
+ const css::uno::Reference< css::drawing::framework::XResourceId > mxViewId;
+ css::uno::Reference<css::awt::XWindow > mxWindow;
+};
+
+} // end of namespace sd::framework
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuarea.hxx b/sd/source/ui/inc/fuarea.hxx
new file mode 100644
index 000000000..38f0b48b6
--- /dev/null
+++ b/sd/source/ui/inc/fuarea.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuArea : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+private:
+ FuArea (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+ virtual void DoExecute( SfxRequest& rReq ) override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fubullet.hxx b/sd/source/ui/inc/fubullet.hxx
new file mode 100644
index 000000000..a8b771f06
--- /dev/null
+++ b/sd/source/ui/inc/fubullet.hxx
@@ -0,0 +1,54 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+class SfxItemSet;
+class SfxViewFrame;
+
+namespace sd {
+
+class ViewShell;
+
+class FuBullet : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+ static void GetSlotState( SfxItemSet& rSet, ViewShell const * pViewShell, SfxViewFrame* pViewFrame );
+
+private:
+ FuBullet (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+ void InsertSpecialCharacter( SfxRequest const & rReq );
+ void InsertFormattingMark( sal_Unicode cMark );
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuchar.hxx b/sd/source/ui/inc/fuchar.hxx
new file mode 100644
index 000000000..10331b87d
--- /dev/null
+++ b/sd/source/ui/inc/fuchar.hxx
@@ -0,0 +1,49 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuChar
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+private:
+ FuChar (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fucon3d.hxx b/sd/source/ui/inc/fucon3d.hxx
new file mode 100644
index 000000000..545b19327
--- /dev/null
+++ b/sd/source/ui/inc/fucon3d.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fuconstr.hxx"
+
+class E3dCompoundObject;
+class E3dScene;
+class SdDrawDocument;
+class SfxRequest;
+
+namespace sd {
+
+class FuConstruct3dObject
+ : public FuConstruct
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+ // Mouse- & Key-Events
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+
+ virtual void Activate() override;
+
+ virtual SdrObjectUniquePtr CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override;
+
+private:
+ FuConstruct3dObject (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+ void ImpPrepareBasic3DShape(E3dCompoundObject const * p3DObj, E3dScene *pScene);
+ E3dCompoundObject* ImpCreateBasic3DShape();
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuconarc.hxx b/sd/source/ui/inc/fuconarc.hxx
new file mode 100644
index 000000000..9a1beae89
--- /dev/null
+++ b/sd/source/ui/inc/fuconarc.hxx
@@ -0,0 +1,54 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fuconstr.hxx"
+
+namespace sd {
+
+class FuConstructArc final
+ : public FuConstruct
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+ // Mouse- & Key-Events
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+
+ virtual void Activate() override;
+
+ virtual SdrObjectUniquePtr CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override;
+
+private:
+ FuConstructArc (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuconbez.hxx b/sd/source/ui/inc/fuconbez.hxx
new file mode 100644
index 000000000..fe9aceae2
--- /dev/null
+++ b/sd/source/ui/inc/fuconbez.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Any.hxx>
+#include "fuconstr.hxx"
+
+class SdDrawDocument;
+
+namespace sd {
+
+class FuConstructBezierPolygon final
+ : public FuConstruct
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent );
+ void DoExecute( SfxRequest& rReq ) override;
+
+ // Mouse- & Key-Events
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+ virtual void SelectionHasChanged() override;
+
+ void SetEditMode(sal_uInt16 nMode);
+ sal_uInt16 GetEditMode() const { return nEditMode; }
+
+ /**
+ * set attribute for the object to be created
+ */
+ void SetAttributes(SfxItemSet& rAttr, SdrObject* pObj);
+
+ virtual SdrObjectUniquePtr CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override;
+
+private:
+ FuConstructBezierPolygon (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+ sal_uInt16 nEditMode;
+ css::uno::Any maTargets; // used for creating a path for custom animations
+
+ //Extra attributes coming from parameters
+ sal_uInt16 mnTransparence; // Default: 0
+ OUString msColor; // Default: ""
+ sal_uInt16 mnWidth; // Default: 0
+ OUString msShapeName; // Default: ""
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuconcs.hxx b/sd/source/ui/inc/fuconcs.hxx
new file mode 100644
index 000000000..f4f4ef30e
--- /dev/null
+++ b/sd/source/ui/inc/fuconcs.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fuconstr.hxx"
+#include <rtl/ustring.hxx>
+
+class SdDrawDocument;
+
+namespace sd {
+
+class FuConstructCustomShape final
+ : public FuConstruct
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+ // Mouse- & Key-Events
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+
+ virtual void Activate() override;
+
+ void SetAttributes( SdrObject* pObj );
+ const OUString& GetShapeType() const;
+
+ virtual SdrObjectUniquePtr CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override;
+
+ // #i33136#
+ virtual bool doConstructOrthogonal() const override;
+
+private:
+ FuConstructCustomShape (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+ OUString aCustomShape;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuconnct.hxx b/sd/source/ui/inc/fuconnct.hxx
new file mode 100644
index 000000000..f8000e5bc
--- /dev/null
+++ b/sd/source/ui/inc/fuconnct.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuConnectionDlg
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuConnectionDlg (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuconrec.hxx b/sd/source/ui/inc/fuconrec.hxx
new file mode 100644
index 000000000..caf8ac7eb
--- /dev/null
+++ b/sd/source/ui/inc/fuconrec.hxx
@@ -0,0 +1,71 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fuconstr.hxx"
+
+class SdDrawDocument;
+class SfxItemSet;
+
+namespace sd {
+
+/**
+ * draw rectangle
+ */
+class FuConstructRectangle final
+ : public FuConstruct
+{
+private:
+ //Extra attributes coming from parameters
+ sal_uInt16 mnFillTransparence; // Default: 0
+ OUString msFillColor; // Default: ""
+ sal_uInt16 mnLineStyle; // Default: SAL_MAX_UINT16
+ OUString msShapeName; // Default: ""
+
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+ // Mouse- & Key-Events
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+ void SetAttributes(SfxItemSet& rAttr, SdrObject* pObj);
+ void SetLineEnds(SfxItemSet& rAttr, SdrObject const & rObj);
+
+ virtual SdrObjectUniquePtr CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override;
+
+private:
+ FuConstructRectangle (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuconstr.hxx b/sd/source/ui/inc/fuconstr.hxx
new file mode 100644
index 000000000..743c6cd5b
--- /dev/null
+++ b/sd/source/ui/inc/fuconstr.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fudraw.hxx"
+
+class SdrObject;
+class SfxItemSet;
+
+namespace sd {
+
+class FuConstruct : public FuDraw
+{
+public:
+
+ // Mouse Events
+ virtual bool MouseMove(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+ virtual void SelectionHasChanged() override { bSelectionChanged = true; }
+
+ // SJ: setting stylesheet, the use of a filled or unfilled style
+ // is determined by the member nSlotId :
+ void SetStyleSheet(SfxItemSet& rAttr, SdrObject* pObj);
+
+ // SJ: setting stylesheet, the use of a filled or unfilled style
+ // is determined by the parameters bUseFillStyle and bUseNoFillStyle :
+ void SetStyleSheet( SfxItemSet& rAttr, SdrObject* pObj,
+ const bool bUseFillStyle, const bool bUseNoFillStyle );
+
+protected:
+ FuConstruct (ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+private:
+ bool bSelectionChanged;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuconuno.hxx b/sd/source/ui/inc/fuconuno.hxx
new file mode 100644
index 000000000..df8e4d415
--- /dev/null
+++ b/sd/source/ui/inc/fuconuno.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fuconstr.hxx"
+#include <rtl/ustring.hxx>
+
+enum class SdrInventor : sal_uInt32;
+
+namespace sd {
+
+/**
+ * draw control
+ */
+class FuConstructUnoControl final
+ : public FuConstruct
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+ // Mouse- & Key-Events
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+ virtual SdrObjectUniquePtr CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override;
+
+private:
+ FuConstructUnoControl(
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+ OUString aOldLayer;
+ SdrInventor nInventor;
+ SdrObjKind nIdentifier;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fucopy.hxx b/sd/source/ui/inc/fucopy.hxx
new file mode 100644
index 000000000..89b950a8f
--- /dev/null
+++ b/sd/source/ui/inc/fucopy.hxx
@@ -0,0 +1,47 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuCopy
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+
+ FuCopy (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fucushow.hxx b/sd/source/ui/inc/fucushow.hxx
new file mode 100644
index 000000000..005aea218
--- /dev/null
+++ b/sd/source/ui/inc/fucushow.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuCustomShowDlg
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuCustomShowDlg (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fudraw.hxx b/sd/source/ui/inc/fudraw.hxx
new file mode 100644
index 000000000..e1d25a521
--- /dev/null
+++ b/sd/source/ui/inc/fudraw.hxx
@@ -0,0 +1,85 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+struct SdrViewEvent;
+class SdrObject;
+
+namespace sd {
+
+/**
+ * Base class for all Draw specific functions
+ */
+class FuDraw
+ : public FuPoor
+{
+public:
+
+ virtual bool KeyInput(const KeyEvent& rKEvt) override;
+ virtual bool MouseMove(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+ virtual bool RequestHelp(const HelpEvent& rHEvt) override;
+
+ virtual void Activate() override;
+
+ virtual void ForcePointer(const MouseEvent* pMEvt = nullptr);
+
+ virtual void DoubleClick(const MouseEvent& rMEvt);
+
+ bool SetPointer(const SdrObject* pObj, const Point& rPos);
+ bool SetHelpText(const SdrObject* pObj, const Point& rPos, const SdrViewEvent& rVEvt);
+
+ void SetPermanent(bool bSet) { bPermanent = bSet; }
+
+ /** is called when the current function should be aborted. <p>
+ This is used when a function gets a KEY_ESCAPE but can also
+ be called directly.
+
+ @returns true if an active function was aborted
+ */
+ virtual bool cancel() override;
+
+protected:
+ FuDraw (ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+ virtual ~FuDraw() override;
+
+ PointerStyle aNewPointer;
+ PointerStyle aOldPointer;
+ bool bMBDown;
+ bool bDragHelpLine;
+ sal_uInt16 nHelpLine;
+ bool bPermanent;
+
+private:
+ void DoModifiers(const MouseEvent& rMEvt, bool bSnapModPressed);
+
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fudspord.hxx b/sd/source/ui/inc/fudspord.hxx
new file mode 100644
index 000000000..2c6089442
--- /dev/null
+++ b/sd/source/ui/inc/fudspord.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+class SdrDropMarkerOverlay;
+class SdrObject;
+
+namespace sd {
+
+class FuDisplayOrder final
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+
+ // Mouse- & Key-Events
+ virtual bool MouseMove(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+private:
+ virtual ~FuDisplayOrder() override;
+ void implClearOverlay();
+
+ PointerStyle maPtr;
+ SdrObject* mpRefObj;
+ std::unique_ptr<SdrDropMarkerOverlay> mpOverlay;
+
+ FuDisplayOrder (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuediglu.hxx b/sd/source/ui/inc/fuediglu.hxx
new file mode 100644
index 000000000..19c32cefd
--- /dev/null
+++ b/sd/source/ui/inc/fuediglu.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fudraw.hxx"
+
+namespace sd {
+
+class FuEditGluePoints final
+ : public FuDraw
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+ // Mouse- & Key-Events
+ virtual bool KeyInput(const KeyEvent& rKEvt) override;
+ virtual bool MouseMove(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+ virtual bool Command(const CommandEvent& rCEvt) override;
+ virtual void ReceiveRequest(SfxRequest& rReq) override;
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+ //Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point,
+ //and SHIFT+ENTER key to decide the position and draw the new insert point
+ virtual void ForcePointer(const MouseEvent* pMEvt = nullptr) override;
+
+private:
+ bool bBeginInsertPoint;
+ Point oldPoint;
+
+ FuEditGluePoints (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+ virtual ~FuEditGluePoints() override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuexecuteinteraction.hxx b/sd/source/ui/inc/fuexecuteinteraction.hxx
new file mode 100644
index 000000000..1fb733b55
--- /dev/null
+++ b/sd/source/ui/inc/fuexecuteinteraction.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 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+#include <com/sun/star/media/XPlayer.hpp>
+
+namespace sd
+{
+class FuExecuteInteraction : public FuPoor
+{
+public:
+ static rtl::Reference<FuPoor> Create(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView,
+ SdDrawDocument* pDoc, SfxRequest& rReq);
+ virtual void DoExecute(SfxRequest& rReq) override;
+
+private:
+ FuExecuteInteraction(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView,
+ SdDrawDocument* pDoc, SfxRequest& rReq);
+
+ css::uno::Reference<css::media::XPlayer> mxPlayer;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuexpand.hxx b/sd/source/ui/inc/fuexpand.hxx
new file mode 100644
index 000000000..ccdffb661
--- /dev/null
+++ b/sd/source/ui/inc/fuexpand.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuExpandPage
+ : public FuPoor
+{
+ public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuExpandPage (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuformatpaintbrush.hxx b/sd/source/ui/inc/fuformatpaintbrush.hxx
new file mode 100644
index 000000000..0de28d4a8
--- /dev/null
+++ b/sd/source/ui/inc/fuformatpaintbrush.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "futext.hxx"
+
+namespace sd {
+
+class DrawViewShell;
+
+class FuFormatPaintBrush : public FuText
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+
+ virtual bool MouseMove(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+ virtual bool KeyInput(const KeyEvent& rKEvt) override;
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+ static void GetMenuState( DrawViewShell const & rDrawViewShell, SfxItemSet &rSet );
+
+private:
+ FuFormatPaintBrush ( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq);
+
+ void DoExecute( SfxRequest& rReq ) override;
+
+ bool HasContentForThisType( SdrInventor nObjectInventor, SdrObjKind nObjectIdentifier ) const;
+ void Paste( bool, bool );
+
+ void implcancel();
+
+ std::shared_ptr<SfxItemSet> mxItemSet;
+ bool mbPermanent;
+ bool mbOldIsQuickTextEditMode;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuhhconv.hxx b/sd/source/ui/inc/fuhhconv.hxx
new file mode 100644
index 000000000..a009b3023
--- /dev/null
+++ b/sd/source/ui/inc/fuhhconv.hxx
@@ -0,0 +1,58 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+class SdOutliner;
+
+namespace sd {
+
+class FuHangulHanjaConversion final : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+
+ void StartConversion( LanguageType nSourceLanguage, LanguageType nTargetLanguage,
+ const vcl::Font *pTargetFont, sal_Int32 nOptions, bool bIsInteractive );
+
+ void StartChineseConversion();
+
+ void ConvertStyles( LanguageType nTargetLanguage, const vcl::Font *pTargetFont );
+
+private:
+ virtual ~FuHangulHanjaConversion() override;
+
+ SdOutliner* pSdOutliner;
+ bool bOwnOutliner;
+
+ FuHangulHanjaConversion (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq );
+
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuinsert.hxx b/sd/source/ui/inc/fuinsert.hxx
new file mode 100644
index 000000000..a2b335961
--- /dev/null
+++ b/sd/source/ui/inc/fuinsert.hxx
@@ -0,0 +1,112 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <config_features.h>
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuInsertGraphic
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin,
+ ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq,
+ bool replaceExistingImage);
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+
+ FuInsertGraphic (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq,
+ bool replaceExistingImage);
+
+ bool mbReplaceExistingImage;
+};
+
+/************************************************************************/
+
+class FuInsertClipboard
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuInsertClipboard (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+/************************************************************************/
+
+class FuInsertOLE
+ : public FuPoor
+{
+ public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuInsertOLE (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+/************************************************************************/
+
+class FuInsertAVMedia
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuInsertAVMedia (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+#if HAVE_FEATURE_AVMEDIA
+ void InsertMediaURL(const OUString& rURL, const Size& rPrefSize, bool bLink);
+#endif
+};
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuinsfil.hxx b/sd/source/ui/inc/fuinsfil.hxx
new file mode 100644
index 000000000..f29b0764d
--- /dev/null
+++ b/sd/source/ui/inc/fuinsfil.hxx
@@ -0,0 +1,60 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+#include <vector>
+#include <rtl/ustring.hxx>
+
+class SfxMedium;
+
+namespace sd {
+
+class FuInsertFile
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+ static void GetSupportedFilterVector( ::std::vector< OUString >& rFilterVector );
+
+private:
+ FuInsertFile (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+ OUString aLayoutName; ///< layout name of the currently inserted page
+ OUString aFilterName; ///< chosen file filter
+ OUString aFile; ///< chosen file name
+
+ void InsTextOrRTFinOlMode(SfxMedium* pMedium);
+ bool InsSDDinOlMode(SfxMedium* pMedium);
+ void InsTextOrRTFinDrMode(SfxMedium* pMedium);
+ bool InsSDDinDrMode(SfxMedium* pMedium);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuline.hxx b/sd/source/ui/inc/fuline.hxx
new file mode 100644
index 000000000..459ff83ee
--- /dev/null
+++ b/sd/source/ui/inc/fuline.hxx
@@ -0,0 +1,49 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuLine
+ : public FuPoor
+{
+public:
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+
+ FuLine (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fulinend.hxx b/sd/source/ui/inc/fulinend.hxx
new file mode 100644
index 000000000..ea17a559a
--- /dev/null
+++ b/sd/source/ui/inc/fulinend.hxx
@@ -0,0 +1,49 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuLineEnd
+ : public FuPoor
+{
+public:
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+
+ FuLineEnd (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fulink.hxx b/sd/source/ui/inc/fulink.hxx
new file mode 100644
index 000000000..38c9d0c07
--- /dev/null
+++ b/sd/source/ui/inc/fulink.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuLink
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+
+ FuLink (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq );
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fumeasur.hxx b/sd/source/ui/inc/fumeasur.hxx
new file mode 100644
index 000000000..1900dba17
--- /dev/null
+++ b/sd/source/ui/inc/fumeasur.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuMeasureDlg
+ : public FuPoor
+{
+ public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+
+ FuMeasureDlg (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fumorph.hxx b/sd/source/ui/inc/fumorph.hxx
new file mode 100644
index 000000000..2d896b8eb
--- /dev/null
+++ b/sd/source/ui/inc/fumorph.hxx
@@ -0,0 +1,90 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+
+#include <vector>
+
+namespace basegfx {
+ class B2DPolygon;
+ class B2DPoint;
+}
+
+namespace sd {
+
+class FuMorph
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ typedef ::std::vector< ::basegfx::B2DPolyPolygon > B2DPolyPolygonList_impl;
+
+ FuMorph (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+ void ImpInsertPolygons(
+ B2DPolyPolygonList_impl& rPolyPolyList3D,
+ bool bAttributeFade,
+ const SdrObject* pObj1,
+ const SdrObject* pObj2
+ );
+
+ static ::basegfx::B2DPolyPolygon ImpCreateMorphedPolygon(
+ const ::basegfx::B2DPolyPolygon& rPolyPolyStart,
+ const ::basegfx::B2DPolyPolygon& rPolyPolyEnd,
+ double fMorphingFactor
+ );
+
+ static void ImpMorphPolygons(
+ const ::basegfx::B2DPolyPolygon& rPolyPoly1,
+ const ::basegfx::B2DPolyPolygon& rPolyPoly2,
+ const sal_uInt16 nSteps,
+ B2DPolyPolygonList_impl& rPolyPolyList3D
+ );
+
+ static void ImpAddPolys(
+ ::basegfx::B2DPolyPolygon& rSmaller,
+ const ::basegfx::B2DPolyPolygon& rBigger
+ );
+
+ static void ImpEqualizePolyPointCount(
+ ::basegfx::B2DPolygon& rSmall,
+ const ::basegfx::B2DPolygon& rBig
+ );
+
+ static sal_uInt32 ImpGetNearestIndex(
+ const ::basegfx::B2DPolygon& rPoly,
+ const ::basegfx::B2DPoint& rPos
+ );
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/funavig.hxx b/sd/source/ui/inc/funavig.hxx
new file mode 100644
index 000000000..d717ce202
--- /dev/null
+++ b/sd/source/ui/inc/funavig.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuNavigation
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuNavigation (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuoaprms.hxx b/sd/source/ui/inc/fuoaprms.hxx
new file mode 100644
index 000000000..09e69c8d1
--- /dev/null
+++ b/sd/source/ui/inc/fuoaprms.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuObjectAnimationParameters
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+
+ FuObjectAnimationParameters (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuolbull.hxx b/sd/source/ui/inc/fuolbull.hxx
new file mode 100644
index 000000000..1ed73cf91
--- /dev/null
+++ b/sd/source/ui/inc/fuolbull.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+class SdDrawDocument;
+class SfxRequest;
+class SfxItemSet;
+class SfxPoolItem;
+class SvxNumBulletItem;
+
+namespace sd {
+
+class View;
+class ViewShell;
+
+/**
+ * bullet functions in outline mode
+ */
+
+class FuBulletAndPosition
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuBulletAndPosition (
+ ViewShell* pViewShell,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+ void SetCurrentBulletsNumbering(SfxRequest& rReq);
+
+ const SvxNumBulletItem* GetNumBulletItem(SfxItemSet& aNewAttr, TypedWhichId<SvxNumBulletItem>& nNumItemId);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuoltext.hxx b/sd/source/ui/inc/fuoltext.hxx
new file mode 100644
index 000000000..288bcf190
--- /dev/null
+++ b/sd/source/ui/inc/fuoltext.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+class SdDrawDocument;
+class SfxRequest;
+
+namespace sd {
+
+class View;
+class ViewShell;
+class OutlineView;
+class OutlineViewShell;
+
+/**
+ * text functions in outline mode
+ */
+class FuOutlineText final
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+
+ virtual bool Command(const CommandEvent& rCEvt) override;
+
+ virtual bool KeyInput(const KeyEvent& rKEvt) override;
+ virtual bool MouseMove(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+
+ virtual void DoCut() override;
+ virtual void DoCopy() override;
+ virtual void DoPaste() override;
+ virtual void DoPasteUnformatted() override;
+
+ /** Call this method when the text in the outliner (may) has changed.
+ It will invalidate some slots of the view frame and update the
+ preview in the slide sorter.
+ */
+ void UpdateForKeyPress (const KeyEvent& rEvent);
+
+private:
+ FuOutlineText (
+ ViewShell* pViewShell,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+ OutlineViewShell* pOutlineViewShell;
+ OutlineView* pOutlineView;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fupage.hxx b/sd/source/ui/inc/fupage.hxx
new file mode 100644
index 000000000..8540d80d7
--- /dev/null
+++ b/sd/source/ui/inc/fupage.hxx
@@ -0,0 +1,73 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include "fupoor.hxx"
+#include <vcl/weld.hxx>
+
+class SfxItemSet;
+class SdBackgroundObjUndoAction;
+class SdPage;
+
+namespace sd {
+class DrawViewShell;
+
+class FuPage
+ : public FuPoor
+{
+ public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+ const SfxItemSet* ExecuteDialog(weld::Window* pParent, const SfxRequest& rReq);
+
+protected:
+ virtual ~FuPage() override;
+
+private:
+ FuPage (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq );
+
+ void ApplyItemSet( const SfxItemSet* pArgs );
+
+ SfxRequest& mrReq;
+ const SfxItemSet* mpArgs;
+ std::unique_ptr<SdBackgroundObjUndoAction>
+ mpBackgroundObjUndoAction;
+ Size maSize;
+ bool mbPageBckgrdDeleted;
+ bool mbMasterPage;
+ bool mbDisplayBackgroundTabPage;
+ SdPage* mpPage;
+ DrawViewShell* mpDrawViewShell;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuparagr.hxx b/sd/source/ui/inc/fuparagr.hxx
new file mode 100644
index 000000000..559dd0de6
--- /dev/null
+++ b/sd/source/ui/inc/fuparagr.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuParagraph
+ : public FuPoor
+{
+public:
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuParagraph (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fupoor.hxx b/sd/source/ui/inc/fupoor.hxx
new file mode 100644
index 000000000..553f6688d
--- /dev/null
+++ b/sd/source/ui/inc/fupoor.hxx
@@ -0,0 +1,180 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/timer.hxx>
+#include <tools/link.hxx>
+#include <tools/gen.hxx>
+#include <vcl/vclptr.hxx>
+#include <svx/svdobj.hxx>
+
+#include <helper/simplereferencecomponent.hxx>
+
+class SdDrawDocument;
+class SfxRequest;
+class CommandEvent;
+class HelpEvent;
+class KeyEvent;
+class MouseEvent;
+
+namespace sd {
+
+class DrawDocShell;
+class View;
+class ViewShell;
+class Window;
+
+/**
+ * Base class for all functions
+ */
+class FuPoor : public SimpleReferenceComponent
+{
+public:
+ static const int HITPIX = 2; // hit tolerance in pixel
+ static const int HITLOG = 53; // hit tolerance in mm100
+ static const int DRGPIX = 2; // minimal drag move in pixel
+ static const int DRGLOG = 53; // minimal drag move in mm100
+
+
+ virtual void DoExecute( SfxRequest& rReq );
+
+ void SetMouseButtonCode(sal_uInt16 nNew) { if(nNew != mnCode) mnCode = nNew; }
+ sal_uInt16 GetMouseButtonCode() const { return mnCode; }
+
+ DrawDocShell* GetDocSh() { return mpDocSh; }
+
+ virtual void DoCut();
+ virtual void DoCopy();
+ virtual void DoPaste();
+ virtual void DoPasteUnformatted();
+
+ // mouse & key events; return value = sal_True: event has been handled
+ virtual bool KeyInput(const KeyEvent& rKEvt);
+ virtual bool MouseMove(const MouseEvent& );
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt);
+
+ // moved from inline to *.cxx
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt);
+
+ virtual bool Command(const CommandEvent& rCEvt);
+ virtual bool RequestHelp(const HelpEvent& rHEvt);
+ virtual void ReceiveRequest(SfxRequest& rReq);
+
+ virtual void Activate(); ///< activates the function
+ virtual void Deactivate(); ///< deactivates the function
+
+ void SetWindow(::sd::Window* pWin);
+
+ virtual void SelectionHasChanged();
+
+ sal_uInt16 GetSlotID() const { return nSlotId; }
+
+ void StartDelayToScrollTimer ();
+
+ virtual SdrObjectUniquePtr CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle);
+
+ /** is called when the current function should be aborted. <p>
+ This is used when a function gets a KEY_ESCAPE but can also
+ be called directly.
+
+ @returns true if an active function was aborted
+ */
+ virtual bool cancel();
+
+ // #i33136#
+ /** Decide if the object to be created should be created
+ orthogonal. Default implementation uses nSlotID
+ to decide. May be overridden to use other criteria
+ for this decision
+
+ @returns true if the to be created object should be orthogonal.
+ */
+ virtual bool doConstructOrthogonal() const;
+
+protected:
+ /**
+ @param pViewSh
+ May be NULL.
+ */
+ FuPoor (ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+ virtual ~FuPoor() override;
+
+ DECL_LINK( DelayHdl, Timer *, void );
+
+ static void ImpForceQuadratic(::tools::Rectangle& rRect);
+
+ /** Switch to another layer. The layer to switch to is specified by an
+ offset relative to the active layer. With respect to the layer bar
+ control at the lower left of the document window positive values
+ move to the right and negative values move to the left.
+
+ <p>Switching the layer is independent of the view's layer mode. The
+ layers are switched even when the layer mode is turned off and the
+ layer control is not visible.</p>
+ @param nOffset
+ If the offset is positive skip that many layers in selecting the
+ next layer. If it is negative then select a previous one. An
+ offset or zero does not change the current layer. If the
+ resulting index lies outside the valid range of indices then it
+ is set to either the minimal or maximal valid index, whichever
+ is nearer.
+ */
+ void SwitchLayer (sal_Int32 nOffset);
+
+ ::sd::View* mpView;
+ ViewShell* mpViewShell;
+ VclPtr< ::sd::Window> mpWindow;
+ DrawDocShell* mpDocSh;
+ SdDrawDocument* mpDoc;
+
+ sal_uInt16 nSlotId;
+
+ Timer aScrollTimer; ///< for auto-scrolling
+ DECL_LINK( ScrollHdl, Timer *, void );
+ void ForceScroll(const Point& aPixPos);
+
+ Timer aDragTimer; ///< for Drag&Drop
+ DECL_LINK(DragHdl, Timer *, void);
+ bool bIsInDragMode;
+ Point aMDPos; ///< position of MouseButtonDown
+
+ /// Flag to prevent auto-scrolling until one drags from outside into the window
+ bool bNoScrollUntilInside;
+
+ /// timer to delay scrolling (~ 1 sec) when dragging out of the window
+ Timer aDelayToScrollTimer;
+ bool bScrollable;
+ bool bDelayActive;
+ bool bFirstMouseMove;
+
+ /// member to hold state of the mouse buttons for creation of own MouseEvents (like in ScrollHdl)
+
+private:
+ sal_uInt16 mnCode;
+
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuprlout.hxx b/sd/source/ui/inc/fuprlout.hxx
new file mode 100644
index 000000000..183ea124f
--- /dev/null
+++ b/sd/source/ui/inc/fuprlout.hxx
@@ -0,0 +1,51 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+class SdDrawDocument;
+class SfxRequest;
+
+namespace sd {
+
+class View;
+class ViewShell;
+
+class FuPresentationLayout
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuPresentationLayout (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuprobjs.hxx b/sd/source/ui/inc/fuprobjs.hxx
new file mode 100644
index 000000000..732c73526
--- /dev/null
+++ b/sd/source/ui/inc/fuprobjs.hxx
@@ -0,0 +1,51 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+class SdDrawDocument;
+class SfxRequest;
+
+namespace sd {
+
+class View;
+class ViewShell;
+
+class FuPresentationObjects
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuPresentationObjects (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuscale.hxx b/sd/source/ui/inc/fuscale.hxx
new file mode 100644
index 000000000..9b70492b8
--- /dev/null
+++ b/sd/source/ui/inc/fuscale.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuScale
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuScale (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fusearch.hxx b/sd/source/ui/inc/fusearch.hxx
new file mode 100644
index 000000000..7088dd776
--- /dev/null
+++ b/sd/source/ui/inc/fusearch.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+class SvxSearchItem;
+class SdOutliner;
+
+namespace sd {
+
+class FuSearch final : public FuPoor
+{
+public:
+
+ static FuSearch* createPtr(ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq);
+
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+ void SearchAndReplace( const SvxSearchItem* pSearchItem );
+
+private:
+ virtual ~FuSearch() override;
+
+ SdOutliner* m_pSdOutliner;
+ bool m_bOwnOutliner;
+
+ FuSearch (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fusel.hxx b/sd/source/ui/inc/fusel.hxx
new file mode 100644
index 000000000..3896a6d42
--- /dev/null
+++ b/sd/source/ui/inc/fusel.hxx
@@ -0,0 +1,104 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fudraw.hxx"
+
+namespace com::sun::star::media { class XPlayer; }
+
+class SdrHdl;
+class SdrObject;
+
+namespace sd {
+
+class FuSelection final
+ : public FuDraw
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+ // Mouse- & Key-Events
+ virtual bool KeyInput(const KeyEvent& rKEvt) override;
+ virtual bool MouseMove(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+
+ virtual void Activate() override;
+
+ virtual void SelectionHasChanged() override;
+
+ void SetEditMode(sal_uInt16 nMode);
+ sal_uInt16 GetEditMode() const { return nEditMode; }
+
+ bool HandleImageMapClick(const SdrObject* pObj, const Point& rPos);
+
+ /** is called when the current function should be aborted. <p>
+ This is used when a function gets a KEY_ESCAPE but can also
+ be called directly.
+
+ @returns true if an active function was aborted
+ */
+ virtual bool cancel() override;
+
+ //let mouse cursor move
+ virtual void ForcePointer(const MouseEvent* pMEvt = nullptr) override;
+
+private:
+ FuSelection (ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+ virtual ~FuSelection() override;
+
+ bool bTempRotation;
+ bool bSelectionChanged;
+ SdrHdl* pHdl;
+ bool bSuppressChangesOfSelection;
+ bool bMirrorSide0;
+ sal_uInt16 nEditMode;
+
+ /** This pointer stores a candidate for assigning a style in the water
+ can mode between mouse button down and mouse button up.
+ */
+ SdrObject* pWaterCanCandidate;
+
+ /** Find the object under the given test point without selecting it.
+ @param rTestPoint
+ The coordinates at which to search for a shape.
+ @return
+ The shape at the test point. When there is no shape at this
+ position then NULL is returned.
+ */
+ SdrObject* pickObject (const Point& rTestPoint);
+ //Add Shift+UP/DOWN/LEFT/RIGHT key to move the position of insert point,
+ //and SHIFT+ENTER key to decide the position and draw the new insert point
+ bool bBeginInsertPoint;
+ Point oldPoint;
+ //let mouse cursor move
+ bool bMovedToCenterPoint;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fusldlg.hxx b/sd/source/ui/inc/fusldlg.hxx
new file mode 100644
index 000000000..89f0e69ad
--- /dev/null
+++ b/sd/source/ui/inc/fusldlg.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuSlideShowDlg
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuSlideShowDlg (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fusnapln.hxx b/sd/source/ui/inc/fusnapln.hxx
new file mode 100644
index 000000000..aba91f696
--- /dev/null
+++ b/sd/source/ui/inc/fusnapln.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuSnapLine
+ : public FuPoor
+{
+public:
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuSnapLine (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fusumry.hxx b/sd/source/ui/inc/fusumry.hxx
new file mode 100644
index 000000000..3a20d3813
--- /dev/null
+++ b/sd/source/ui/inc/fusumry.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuSummaryPage
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuSummaryPage (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/futempl.hxx b/sd/source/ui/inc/futempl.hxx
new file mode 100644
index 000000000..e51447f7b
--- /dev/null
+++ b/sd/source/ui/inc/futempl.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuTemplate
+ : public FuPoor
+{
+public:
+
+ virtual void Activate() override;
+ virtual void Deactivate() override;
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuTemplate (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/futext.hxx b/sd/source/ui/inc/futext.hxx
new file mode 100644
index 000000000..f101e07a0
--- /dev/null
+++ b/sd/source/ui/inc/futext.hxx
@@ -0,0 +1,97 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "fuconstr.hxx"
+#include <tools/weakbase.h>
+
+class SdrTextObj;
+class FontList;
+class OutlinerView;
+
+namespace sd {
+
+/**
+ * Base class for text functions
+ */
+class FuText
+ : public FuConstruct
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+ virtual bool KeyInput(const KeyEvent& rKEvt) override;
+ virtual bool MouseMove(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+ virtual bool RequestHelp(const HelpEvent& rHEvt) override;
+ virtual void ReceiveRequest(SfxRequest& rReq) override;
+ virtual void DoubleClick(const MouseEvent& rMEvt) override;
+
+ virtual void Activate() override; ///< activates the function
+ virtual void Deactivate() override; ///< deactivates the function
+
+ void SetInEditMode(const MouseEvent& rMEvt, bool bQuickDrag);
+ void DeleteDefaultText();
+ SdrTextObj* GetTextObj() { return mxTextObj.get(); }
+
+ virtual SdrObjectUniquePtr CreateDefaultObject(const sal_uInt16 nID, const ::tools::Rectangle& rRectangle) override;
+
+ /** is called when the current function should be aborted. <p>
+ This is used when a function gets a KEY_ESCAPE but can also
+ be called directly.
+
+ @returns true if an active function was aborted
+ */
+ virtual bool cancel() override;
+
+ static void ChangeFontSize( bool, OutlinerView*, const FontList*, ::sd::View* );
+
+ void InvalidateBindings();
+
+
+protected:
+ FuText (ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+
+private:
+ virtual void disposing() override;
+
+ ::tools::WeakReference<SdrTextObj>
+ mxTextObj;
+ bool bFirstObjCreated;
+ bool bJustEndedEdit;
+
+ SfxRequest& rRequest;
+
+ void ImpSetAttributesForNewTextObject(SdrTextObj* pTxtObj);
+ void ImpSetAttributesFitToSize(SdrTextObj* pTxtObj);
+ void ImpSetAttributesFitToSizeVertical(SdrTextObj* pTxtObj);
+ void ImpSetAttributesFitCommon(SdrTextObj* pTxtObj);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/futhes.hxx b/sd/source/ui/inc/futhes.hxx
new file mode 100644
index 000000000..3b9533ddd
--- /dev/null
+++ b/sd/source/ui/inc/futhes.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuThesaurus
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuThesaurus (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/futransf.hxx b/sd/source/ui/inc/futransf.hxx
new file mode 100644
index 000000000..dd7ae19a0
--- /dev/null
+++ b/sd/source/ui/inc/futransf.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuTransform
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuTransform (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/futxtatt.hxx b/sd/source/ui/inc/futxtatt.hxx
new file mode 100644
index 000000000..584e59c0d
--- /dev/null
+++ b/sd/source/ui/inc/futxtatt.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuTextAttrDlg
+ : public FuPoor
+{
+ public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+ FuTextAttrDlg (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuvect.hxx b/sd/source/ui/inc/fuvect.hxx
new file mode 100644
index 000000000..0501fb224
--- /dev/null
+++ b/sd/source/ui/inc/fuvect.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+class FuVectorize
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+ virtual void DoExecute( SfxRequest& rReq ) override;
+
+private:
+
+ FuVectorize (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/fuzoom.hxx b/sd/source/ui/inc/fuzoom.hxx
new file mode 100644
index 000000000..54c352dd3
--- /dev/null
+++ b/sd/source/ui/inc/fuzoom.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "fupoor.hxx"
+
+namespace sd {
+
+extern const sal_uInt16 SidArrayZoom[];
+
+class FuZoom final
+ : public FuPoor
+{
+public:
+
+ static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
+
+ // Mouse- & Key-Events
+ virtual bool MouseMove(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+
+ virtual void Activate() override; ///< activates the function
+ virtual void Deactivate() override; ///< deactivates the function
+
+private:
+ virtual ~FuZoom() override;
+
+ Point aBeginPosPix;
+ Point aBeginPos;
+ Point aEndPos;
+ ::tools::Rectangle aZoomRect;
+ bool bVisible;
+ bool bStartDrag;
+ PointerStyle aPtr;
+
+ FuZoom (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq);
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/gluectrl.hxx b/sd/source/ui/inc/gluectrl.hxx
new file mode 100644
index 000000000..58aa13944
--- /dev/null
+++ b/sd/source/ui/inc/gluectrl.hxx
@@ -0,0 +1,68 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/InterimItemWindow.hxx>
+#include <sfx2/tbxctrl.hxx>
+
+enum class SdrEscapeDirection;
+
+/**
+ * GluePointEscDirLB
+ */
+class GlueEscDirLB final : public InterimItemWindow
+{
+private:
+ css::uno::Reference<css::frame::XFrame> m_xFrame;
+ std::unique_ptr<weld::ComboBox> m_xWidget;
+
+ DECL_LINK(SelectHdl, weld::ComboBox&, void);
+ DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
+
+public:
+ GlueEscDirLB(vcl::Window* pParent, const css::uno::Reference<css::frame::XFrame>& rFrame);
+ virtual void dispose() override;
+ virtual ~GlueEscDirLB() override;
+
+ void set_active(int nPos) { m_xWidget->set_active(nPos); }
+ void set_sensitive(bool bSensitive);
+
+ void Fill();
+};
+
+/**
+ * Toolbox controller for glue-point escape direction
+ */
+class SdTbxCtlGlueEscDir : public SfxToolBoxControl
+{
+private:
+ static sal_uInt16 GetEscDirPos(SdrEscapeDirection nEscDir);
+
+public:
+ virtual void StateChangedAtToolBoxControl(sal_uInt16 nSId, SfxItemState eState,
+ const SfxPoolItem* pState) override;
+ virtual VclPtr<InterimItemWindow> CreateItemWindow(vcl::Window* pParent) override;
+
+ SFX_DECL_TOOLBOX_CONTROL();
+
+ SdTbxCtlGlueEscDir(sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx);
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/headerfooterdlg.hxx b/sd/source/ui/inc/headerfooterdlg.hxx
new file mode 100644
index 000000000..e794712d3
--- /dev/null
+++ b/sd/source/ui/inc/headerfooterdlg.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/.
+ *
+ * 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 .
+ */
+#pragma once
+
+#include <vcl/weld.hxx>
+
+#include <sdpage.hxx>
+
+class SdUndoGroup;
+
+namespace sd
+{
+class ViewShell;
+
+class HeaderFooterTabPage;
+
+class HeaderFooterDialog : public weld::GenericDialogController
+{
+private:
+ DECL_LINK( ActivatePageHdl, const OString&, void );
+ DECL_LINK( ClickApplyToAllHdl, weld::Button&, void );
+ DECL_LINK( ClickApplyHdl, weld::Button&, void );
+ DECL_LINK( ClickCancelHdl, weld::Button&, void );
+
+ HeaderFooterSettings maSlideSettings;
+ HeaderFooterSettings maNotesHandoutSettings;
+
+ SdDrawDocument* mpDoc;
+ SdPage* mpCurrentPage;
+ ViewShell* mpViewShell;
+
+ std::unique_ptr<weld::Notebook> mxTabCtrl;
+ std::unique_ptr<weld::Button> mxPBApplyToAll;
+ std::unique_ptr<weld::Button> mxPBApply;
+ std::unique_ptr<weld::Button> mxPBCancel;
+ std::unique_ptr<HeaderFooterTabPage> mxSlideTabPage;
+ std::unique_ptr<HeaderFooterTabPage> mxNotesHandoutsTabPage;
+
+ void apply( bool bToAll, bool bForceSlides );
+ void change( SdUndoGroup* pUndoGroup, SdPage* pPage, const HeaderFooterSettings& rNewSettings );
+
+public:
+ HeaderFooterDialog(ViewShell* pViewShell, weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage);
+ virtual ~HeaderFooterDialog() override;
+
+ void ApplyToAll();
+ void Apply();
+
+ virtual short run() override;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/ins_paste.hxx b/sd/source/ui/inc/ins_paste.hxx
new file mode 100644
index 000000000..5031d09b0
--- /dev/null
+++ b/sd/source/ui/inc/ins_paste.hxx
@@ -0,0 +1,37 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/weld.hxx>
+
+// SdInsertPasteDlg
+class SdInsertPasteDlg : public weld::GenericDialogController
+{
+private:
+ std::unique_ptr<weld::RadioButton> m_xRbBefore;
+ std::unique_ptr<weld::RadioButton> m_xRbAfter;
+
+public:
+ SdInsertPasteDlg(weld::Window* pWindow);
+ virtual ~SdInsertPasteDlg() override;
+ bool IsInsertBefore() const;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/inspagob.hxx b/sd/source/ui/inc/inspagob.hxx
new file mode 100644
index 000000000..d906a10f7
--- /dev/null
+++ b/sd/source/ui/inc/inspagob.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <vcl/weld.hxx>
+
+class SdDrawDocument;
+class SdPageObjsTLV;
+class SfxMedium;
+
+class SdInsertPagesObjsDlg : public weld::GenericDialogController
+{
+private:
+ SfxMedium* m_pMedium;
+ const SdDrawDocument* m_pDoc;
+ const OUString& m_rName;
+
+ std::unique_ptr<SdPageObjsTLV> m_xLbTree;
+ std::unique_ptr<weld::CheckButton> m_xCbxLink;
+ std::unique_ptr<weld::CheckButton> m_xCbxMasters;
+
+ void Reset();
+ DECL_LINK(SelectObjectHdl, weld::TreeView&, void);
+
+public:
+ SdInsertPagesObjsDlg(weld::Window* pParent, const SdDrawDocument* pDoc,
+ SfxMedium* pSfxMedium, const OUString& rFileName);
+ virtual ~SdInsertPagesObjsDlg() override;
+
+ /** returns the list
+ nType == 0 -> pages
+ nType == 1 -> objects */
+
+ std::vector<OUString> GetList ( const sal_uInt16 nType ) ;
+
+ bool IsLink() const;
+ bool IsRemoveUnnecessaryMasterPages() const;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/layeroptionsdlg.hxx b/sd/source/ui/inc/layeroptionsdlg.hxx
new file mode 100644
index 000000000..300994937
--- /dev/null
+++ b/sd/source/ui/inc/layeroptionsdlg.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sddllapi.h>
+
+#include <vcl/weld.hxx>
+
+class SfxItemSet;
+
+class SD_DLLPUBLIC SdInsertLayerDlg : public weld::GenericDialogController
+{
+private:
+ std::unique_ptr<weld::Entry> m_xEdtName;
+ std::unique_ptr<weld::Entry> m_xEdtTitle;
+ std::unique_ptr<weld::TextView> m_xEdtDesc;
+ std::unique_ptr<weld::CheckButton> m_xCbxVisible;
+ std::unique_ptr<weld::CheckButton> m_xCbxPrintable;
+ std::unique_ptr<weld::CheckButton> m_xCbxLocked;
+ std::unique_ptr<weld::Widget> m_xNameFrame;
+
+public:
+
+ SdInsertLayerDlg(weld::Window* pWindow, const SfxItemSet& rInAttrs,
+ bool bDeletable, const OUString& rStr);
+ virtual ~SdInsertLayerDlg() override;
+
+ void GetAttr( SfxItemSet& rOutAttrs );
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/masterlayoutdlg.hxx b/sd/source/ui/inc/masterlayoutdlg.hxx
new file mode 100644
index 000000000..0acbb18d7
--- /dev/null
+++ b/sd/source/ui/inc/masterlayoutdlg.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+#pragma once
+
+#include <vcl/weld.hxx>
+
+#include <pres.hxx>
+
+class SdDrawDocument;
+class SdPage;
+
+namespace sd
+{
+
+class MasterLayoutDialog : public weld::GenericDialogController
+{
+private:
+ SdDrawDocument* mpDoc;
+ SdPage* mpCurrentPage;
+
+ std::unique_ptr<weld::CheckButton> mxCBDate;
+ std::unique_ptr<weld::CheckButton> mxCBPageNumber;
+ std::unique_ptr<weld::CheckButton> mxCBSlideNumber;
+ std::unique_ptr<weld::CheckButton> mxCBHeader;
+ std::unique_ptr<weld::CheckButton> mxCBFooter;
+
+ bool mbOldHeader;
+ bool mbOldFooter;
+ bool mbOldDate;
+ bool mbOldPageNumber;
+
+ void applyChanges();
+ void remove( PresObjKind eKind );
+ void create( PresObjKind eKind );
+
+public:
+ MasterLayoutDialog(weld::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage);
+ virtual ~MasterLayoutDialog() override;
+
+ virtual short run() override;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/morphdlg.hxx b/sd/source/ui/inc/morphdlg.hxx
new file mode 100644
index 000000000..77b20d718
--- /dev/null
+++ b/sd/source/ui/inc/morphdlg.hxx
@@ -0,0 +1,49 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/weld.hxx>
+
+class SdrObject;
+
+namespace sd {
+
+class MorphDlg : public weld::GenericDialogController
+{
+public:
+ MorphDlg(weld::Window* pParent, const SdrObject* pObj1, const SdrObject* pObj2);
+ virtual ~MorphDlg() override;
+
+ void SaveSettings() const;
+ sal_uInt16 GetFadeSteps() const { return static_cast<sal_uInt16>(m_xMtfSteps->get_value()); }
+ bool IsAttributeFade() const { return m_xCbxAttributes->get_active(); }
+ bool IsOrientationFade() const { return m_xCbxOrientation->get_active(); }
+
+private:
+ std::unique_ptr<weld::SpinButton> m_xMtfSteps;
+ std::unique_ptr<weld::CheckButton> m_xCbxAttributes;
+ std::unique_ptr<weld::CheckButton> m_xCbxOrientation;
+
+ void LoadSettings();
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/navigatr.hxx b/sd/source/ui/inc/navigatr.hxx
new file mode 100644
index 000000000..0e500eb0f
--- /dev/null
+++ b/sd/source/ui/inc/navigatr.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/ctrlitem.hxx>
+#include <sfx2/sidebar/PanelLayout.hxx>
+#include <sfx2/navigat.hxx>
+#include "sdtreelb.hxx"
+#include <pres.hxx>
+
+// forward
+namespace vcl { class Window; }
+
+namespace sd {
+class DrawDocShell;
+class SdNavigatorFloat;
+}
+class Menu;
+class SdNavigatorControllerItem;
+class SdPageNameControllerItem;
+
+enum class NavState {
+ NONE = 0x000000,
+ TableUpdate = 0x000100,
+ BtnFirstEnabled = 0x001000,
+ BtnFirstDisabled = 0x002000,
+ BtnPrevEnabled = 0x004000,
+ BtnPrevDisabled = 0x008000,
+ BtnLastEnabled = 0x010000,
+ BtnLastDisabled = 0x020000,
+ BtnNextEnabled = 0x040000,
+ BtnNextDisabled = 0x080000,
+};
+namespace o3tl {
+ template<> struct typed_flags<NavState> : is_typed_flags<NavState, 0x0ff100> {};
+}
+
+class NavDocInfo
+{
+public:
+ NavDocInfo()
+ : bName(false)
+ , bActive(false)
+ , mpDocShell(nullptr)
+ {
+ }
+
+ bool HasName() const { return bName; }
+ bool IsActive() const { return bActive; }
+
+ void SetName( bool bOn ) { bName = bOn; }
+ void SetActive( bool bOn ) { bActive = bOn; }
+
+ ::sd::DrawDocShell* GetDrawDocShell() {return mpDocShell;}
+
+private:
+ friend class SdNavigatorWin;
+ bool bName : 1;
+ bool bActive : 1;
+ ::sd::DrawDocShell* mpDocShell;
+};
+
+namespace sd {
+
+class SdNavigatorFloat : public SfxNavigator
+{
+private:
+ std::unique_ptr<SdNavigatorWin> m_xNavWin;
+ bool m_bSetInitialFocusOnActivate;
+
+public:
+ SdNavigatorFloat(SfxBindings* _pBindings, SfxChildWindow* pMgr,
+ vcl::Window* pParent, SfxChildWinInfo* pInfo);
+ void InitTreeLB(const SdDrawDocument* pDoc);
+ void FreshTree(const SdDrawDocument* pDoc);
+ virtual void Activate() override;
+ virtual void dispose() override;
+ virtual ~SdNavigatorFloat() override;
+};
+
+}
+
+class SD_DLLPUBLIC SdNavigatorWin : public PanelLayout
+{
+public:
+ typedef ::std::function<void ()> UpdateRequestFunctor;
+
+ /** Create a new instance of the navigator.
+ @param bUseActiveUpdate
+ When <TRUE/>, the default, then the SdNavigatorWin object
+ will make a SID_NAVIGATOR_INIT call whenever it thinks an
+ update is necessary. When <FALSE/> the navigator will
+ rely on others to trigger updates.
+ */
+ SdNavigatorWin(weld::Widget* pParent, SfxBindings* pBindings, SfxNavigator* pNavigatorDlg);
+ void SetUpdateRequestFunctor(const UpdateRequestFunctor& rUpdateRequest);
+ virtual ~SdNavigatorWin() override;
+
+ void InitTreeLB( const SdDrawDocument* pDoc );
+ void RefreshDocumentLB( const OUString* pDocName = nullptr );
+ void FirstFocus();
+
+ bool InsertFile(const OUString& rFileName);
+
+ NavigatorDragType GetNavigatorDragType();
+ SdPageObjsTLV& GetObjects();
+
+private:
+ friend class SdNavigatorFloat;
+ friend class SdNavigatorControllerItem;
+ friend class SdPageNameControllerItem;
+
+ std::unique_ptr<weld::Toolbar> mxToolbox;
+ std::unique_ptr<SdPageObjsTLV> mxTlbObjects;
+ std::unique_ptr<weld::ComboBox> mxLbDocs;
+ std::unique_ptr<weld::Menu> mxDragModeMenu;
+ std::unique_ptr<weld::Menu> mxShapeMenu;
+
+ VclPtr<SfxNavigator> mxNavigatorDlg;
+
+ bool mbDocImported;
+ OUString maDropFileName;
+ NavigatorDragType meDragType;
+ std::vector<NavDocInfo> maDocList;
+ SfxBindings* mpBindings;
+ std::unique_ptr<SdNavigatorControllerItem> mpNavigatorCtrlItem;
+ std::unique_ptr<SdPageNameControllerItem> mpPageNameCtrlItem;
+
+ /** This flag controls whether all shapes or only the named shapes are
+ shown.
+ */
+ // bool mbShowAllShapes;
+
+ static OUString GetDragTypeSdBmpId(NavigatorDragType eDT);
+ NavDocInfo* GetDocInfo();
+
+ DECL_DLLPRIVATE_LINK( SelectToolboxHdl, const OString&, void );
+ DECL_DLLPRIVATE_LINK( DropdownClickToolBoxHdl, const OString&, void );
+ DECL_DLLPRIVATE_LINK( ClickObjectHdl, weld::TreeView&, bool );
+ DECL_DLLPRIVATE_LINK( SelectDocumentHdl, weld::ComboBox&, void );
+ DECL_DLLPRIVATE_LINK( MenuSelectHdl, const OString&, void );
+ DECL_DLLPRIVATE_LINK( ShapeFilterCallback, const OString&, void );
+ DECL_DLLPRIVATE_LINK( KeyInputHdl, const KeyEvent&, bool );
+
+ void SetDragImage();
+
+public:
+ //when object is marked , fresh the corresponding entry tree .
+ void FreshTree ( const SdDrawDocument* pDoc );
+
+ virtual weld::Window* GetFrameWeld() const override;
+};
+
+/**
+ * ControllerItem for Navigator
+ */
+class SdNavigatorControllerItem : public SfxControllerItem
+{
+public:
+ SdNavigatorControllerItem( sal_uInt16, SdNavigatorWin*, SfxBindings*,
+ const SdNavigatorWin::UpdateRequestFunctor& rUpdateRequest);
+
+protected:
+ virtual void StateChangedAtToolBoxControl( sal_uInt16 nSId, SfxItemState eState,
+ const SfxPoolItem* pState ) override;
+
+private:
+ SdNavigatorWin* pNavigatorWin;
+ const SdNavigatorWin::UpdateRequestFunctor maUpdateRequest;
+};
+
+/**
+ * ControllerItem for Navigator to show the page in the TreeLB
+ */
+class SdPageNameControllerItem : public SfxControllerItem
+{
+public:
+ SdPageNameControllerItem( sal_uInt16, SdNavigatorWin*, SfxBindings*);
+
+protected:
+ virtual void StateChangedAtToolBoxControl( sal_uInt16 nSId, SfxItemState eState,
+ const SfxPoolItem* pState ) override;
+
+private:
+ SdNavigatorWin* pNavigatorWin;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/optsitem.hxx b/sd/source/ui/inc/optsitem.hxx
new file mode 100644
index 000000000..979b90b78
--- /dev/null
+++ b/sd/source/ui/inc/optsitem.hxx
@@ -0,0 +1,580 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <unotools/configitem.hxx>
+#include <sfx2/module.hxx>
+#include <svx/optgrid.hxx>
+#include <tools/degree.hxx>
+#include <sddllapi.h>
+#include <memory>
+
+class SdOptions;
+
+namespace sd {
+class FrameView;
+}
+
+class SdOptionsGeneric;
+
+class SD_DLLPUBLIC SdOptionsItem : public ::utl::ConfigItem
+{
+
+private:
+
+ const SdOptionsGeneric& mrParent;
+
+ virtual void ImplCommit() override;
+
+public:
+
+ SdOptionsItem( const SdOptionsGeneric& rParent, const OUString& rSubTree );
+ virtual ~SdOptionsItem() override;
+
+ SdOptionsItem(SdOptionsItem const &) = default;
+ SdOptionsItem(SdOptionsItem &&) = default;
+ SdOptionsItem & operator =(SdOptionsItem const &) = delete; // due to ConfigItem
+ SdOptionsItem & operator =(SdOptionsItem &&) = delete; // due to ConfigItem
+
+ virtual void Notify( const css::uno::Sequence<OUString>& aPropertyNames) override;
+
+ css::uno::Sequence< css::uno::Any > GetProperties( const css::uno::Sequence< OUString >& rNames );
+ bool PutProperties( const css::uno::Sequence< OUString >& rNames,
+ const css::uno::Sequence< css::uno::Any>& rValues );
+ using ConfigItem::SetModified;
+};
+
+class SD_DLLPUBLIC SdOptionsGeneric
+{
+friend class SdOptionsItem;
+
+private:
+
+ OUString maSubTree;
+ std::unique_ptr<SdOptionsItem>
+ mpCfgItem;
+ bool mbImpress;
+ bool mbInit : 1;
+ bool mbEnableModify : 1;
+
+ SAL_DLLPRIVATE void Commit( SdOptionsItem& rCfgItem ) const;
+ SAL_DLLPRIVATE css::uno::Sequence< OUString > GetPropertyNames() const;
+
+protected:
+
+ void Init() const;
+ void OptionsChanged() { if( mpCfgItem && mbEnableModify ) mpCfgItem->SetModified(); }
+
+protected:
+
+ virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const = 0;
+ virtual bool ReadData( const css::uno::Any* pValues ) = 0;
+ virtual bool WriteData( css::uno::Any* pValues ) const = 0;
+
+public:
+
+ SdOptionsGeneric(bool bImpress, const OUString& rSubTree);
+ SdOptionsGeneric(SdOptionsGeneric const &);
+ virtual ~SdOptionsGeneric();
+
+ SdOptionsGeneric& operator=( SdOptionsGeneric const & );
+
+ bool IsImpress() const { return mbImpress; }
+
+ void EnableModify( bool bModify ) { mbEnableModify = bModify; }
+
+ void Store();
+
+ static bool isMetricSystem();
+};
+
+class SD_DLLPUBLIC SdOptionsLayout : public SdOptionsGeneric
+{
+private:
+
+ bool bRuler; // Layout/Display/Ruler
+ bool bMoveOutline; // Layout/Display/Contour
+ bool bDragStripes; // Layout/Display/Guide
+ bool bHandlesBezier; // Layout/Display/Bezier
+ bool bHelplines; // Layout/Display/Helpline
+ sal_uInt16 nMetric; // Layout/Other/MeasureUnit
+ sal_uInt16 nDefTab; // Layout/Other/TabStop
+
+protected:
+
+ virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override;
+ virtual bool ReadData( const css::uno::Any* pValues ) override;
+ virtual bool WriteData( css::uno::Any* pValues ) const override;
+
+public:
+ SdOptionsLayout(bool bImpress, bool bUseConfig);
+
+ bool operator==( const SdOptionsLayout& rOpt ) const;
+
+ bool IsRulerVisible() const { Init(); return bRuler; }
+ bool IsMoveOutline() const { Init(); return bMoveOutline; }
+ bool IsDragStripes() const { Init(); return bDragStripes; }
+ bool IsHandlesBezier() const { Init(); return bHandlesBezier; }
+ bool IsHelplines() const { Init(); return bHelplines; }
+ sal_uInt16 GetMetric() const { Init(); return( ( 0xffff == nMetric ) ? static_cast<sal_uInt16>(SfxModule::GetCurrentFieldUnit()) : nMetric ); }
+ sal_uInt16 GetDefTab() const { Init(); return nDefTab; }
+
+ void SetRulerVisible( bool bOn ) { if( bRuler != bOn ) { OptionsChanged(); bRuler = bOn; } }
+ void SetMoveOutline( bool bOn ) { if( bMoveOutline != bOn ) { OptionsChanged(); bMoveOutline = bOn; } }
+ void SetDragStripes( bool bOn ) { if( bDragStripes != bOn ) { OptionsChanged(); bDragStripes = bOn; } }
+ void SetHandlesBezier( bool bOn ) { if( bHandlesBezier != bOn ) { OptionsChanged(); bHandlesBezier = bOn; } }
+ void SetHelplines( bool bOn ) { if( bHelplines != bOn ) { OptionsChanged(); bHelplines = bOn; } }
+ void SetMetric( sal_uInt16 nInMetric ) { if( nMetric != nInMetric ) { OptionsChanged(); nMetric = nInMetric; } }
+ void SetDefTab( sal_uInt16 nTab ) { if( nDefTab != nTab ) { OptionsChanged(); nDefTab = nTab; } }
+};
+
+class SD_DLLPUBLIC SdOptionsLayoutItem : public SfxPoolItem
+{
+public:
+
+ explicit SdOptionsLayoutItem();
+ SdOptionsLayoutItem( SdOptions const * pOpts, ::sd::FrameView const * pView );
+
+ virtual SdOptionsLayoutItem* Clone( SfxItemPool *pPool = nullptr ) const override;
+ virtual bool operator==( const SfxPoolItem& ) const override;
+
+ void SetOptions( SdOptions* pOpts ) const;
+
+ SdOptionsLayout& GetOptionsLayout() { return maOptionsLayout; }
+private:
+ SdOptionsLayout maOptionsLayout;
+};
+
+class SdOptionsContents : public SdOptionsGeneric
+{
+private:
+protected:
+
+ virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override;
+ virtual bool ReadData( const css::uno::Any* pValues ) override;
+ virtual bool WriteData( css::uno::Any* pValues ) const override;
+
+public:
+
+ SdOptionsContents(bool bImpress);
+
+ bool operator==( const SdOptionsContents& rOpt ) const;
+};
+
+class SD_DLLPUBLIC SdOptionsMisc : public SdOptionsGeneric
+{
+private:
+
+ sal_Int32 nDefaultObjectSizeWidth;
+ sal_Int32 nDefaultObjectSizeHeight;
+
+ bool bStartWithTemplate : 1; // Misc/NewDoc/AutoPilot
+ bool bMarkedHitMovesAlways : 1; // Misc/ObjectMoveable
+ bool bMoveOnlyDragging : 1; // Currently, not in use !!!
+ bool bCrookNoContortion : 1; // Misc/NoDistort
+ bool bQuickEdit : 1; // Misc/TextObject/QuickEditing
+ bool bMasterPageCache : 1; // Misc/BackgroundCache
+ bool bDragWithCopy : 1; // Misc/CopyWhileMoving
+ bool bPickThrough : 1; // Misc/TextObject/Selectable
+ bool bDoubleClickTextEdit : 1; // Misc/DclickTextedit
+ bool bClickChangeRotation : 1; // Misc/RotateClick
+ bool bEnableSdremote : 1; // Misc/Start/EnableSdremote
+ bool bEnablePresenterScreen : 1; // Misc/Start/EnablePresenterDisplay
+ bool bSolidDragging : 1; // Misc/ModifyWithAttributes
+ bool bSummationOfParagraphs : 1; // misc/SummationOfParagraphs
+ bool bTabBarVisible : 1; // Misc/TabBarVisible
+ bool bShowUndoDeleteWarning : 1; // Misc/ShowUndoDeleteWarning
+ // #i75315#
+ bool bSlideshowRespectZOrder : 1; // Misc/SlideshowRespectZOrder
+ bool bShowComments : 1; // Misc/ShowComments
+
+ bool bPreviewNewEffects;
+ bool bPreviewChangedEffects;
+ bool bPreviewTransitions;
+
+
+ sal_Int32 mnDisplay;
+
+ sal_Int32 mnPenColor;
+ double mnPenWidth;
+
+ /** This value controls the device to use for formatting documents.
+ The currently supported values are 0 for the current printer or 1
+ for the printer independent virtual device the can be retrieved from
+ the modules.
+ */
+ sal_uInt16 mnPrinterIndependentLayout; // Misc/Compatibility/PrinterIndependentLayout
+// Misc
+
+protected:
+
+ virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override;
+ virtual bool ReadData( const css::uno::Any* pValues ) override;
+ virtual bool WriteData( css::uno::Any* pValues ) const override;
+
+public:
+
+ SdOptionsMisc(bool bImpress, bool bUseConfig);
+
+ bool operator==( const SdOptionsMisc& rOpt ) const;
+
+ bool IsStartWithTemplate() const { Init(); return bStartWithTemplate; }
+ bool IsMarkedHitMovesAlways() const { Init(); return bMarkedHitMovesAlways; }
+ bool IsMoveOnlyDragging() const { Init(); return bMoveOnlyDragging; }
+ bool IsCrookNoContortion() const { Init(); return bCrookNoContortion; }
+ bool IsQuickEdit() const { Init(); return bQuickEdit; }
+ bool IsMasterPagePaintCaching() const { Init(); return bMasterPageCache; }
+ bool IsDragWithCopy() const { Init(); return bDragWithCopy; }
+ bool IsPickThrough() const { Init(); return bPickThrough; }
+ bool IsDoubleClickTextEdit() const { Init(); return bDoubleClickTextEdit; }
+ bool IsClickChangeRotation() const { Init(); return bClickChangeRotation; }
+ bool IsEnableSdremote() const { Init(); return bEnableSdremote; }
+ bool IsEnablePresenterScreen() const { Init(); return bEnablePresenterScreen; }
+ bool IsSolidDragging() const { Init(); return bSolidDragging; }
+ bool IsSummationOfParagraphs() const { Init(); return bSummationOfParagraphs; };
+ bool IsTabBarVisible() const { Init(); return bTabBarVisible; };
+
+ /** Return the currently selected printer independent layout mode.
+ @return
+ Returns 1 for printer independent layout enabled and 0 when it
+ is disabled. Other values are reserved for future use.
+ */
+ sal_uInt16 GetPrinterIndependentLayout() const { Init(); return mnPrinterIndependentLayout; };
+ bool IsShowUndoDeleteWarning() const { Init(); return bShowUndoDeleteWarning; }
+ bool IsSlideshowRespectZOrder() const { Init(); return bSlideshowRespectZOrder; }
+ sal_Int32 GetDefaultObjectSizeWidth() const { Init(); return nDefaultObjectSizeWidth; }
+ sal_Int32 GetDefaultObjectSizeHeight() const { Init(); return nDefaultObjectSizeHeight; }
+
+ bool IsPreviewNewEffects() const { Init(); return bPreviewNewEffects; }
+ bool IsPreviewChangedEffects() const { Init(); return bPreviewChangedEffects; }
+ bool IsPreviewTransitions() const { Init(); return bPreviewTransitions; }
+
+ sal_Int32 GetDisplay() const;
+ void SetDisplay( sal_Int32 nDisplay );
+
+ sal_Int32 GetPresentationPenColor() const { Init(); return mnPenColor; }
+ void SetPresentationPenColor( sal_Int32 nPenColor ) { if( mnPenColor != nPenColor ) { OptionsChanged(); mnPenColor = nPenColor; } }
+
+ double GetPresentationPenWidth() const { Init(); return mnPenWidth; }
+ void SetPresentationPenWidth( double nPenWidth ) { if( mnPenWidth != nPenWidth ) { OptionsChanged(); mnPenWidth = nPenWidth; } }
+
+ void SetStartWithTemplate( bool bOn ) { if( bStartWithTemplate != bOn ) { OptionsChanged(); bStartWithTemplate = bOn; } }
+ void SetMarkedHitMovesAlways( bool bOn ) { if( bMarkedHitMovesAlways != bOn ) { OptionsChanged(); bMarkedHitMovesAlways = bOn; } }
+ void SetMoveOnlyDragging( bool bOn ) { if( bMoveOnlyDragging != bOn ) { OptionsChanged(); bMoveOnlyDragging = bOn; } }
+ void SetCrookNoContortion( bool bOn ) { if( bCrookNoContortion != bOn ) { OptionsChanged(); bCrookNoContortion = bOn; } }
+ void SetQuickEdit( bool bOn ) { if( bQuickEdit != bOn ) { OptionsChanged(); bQuickEdit = bOn; } }
+ void SetMasterPagePaintCaching( bool bOn ) { if( bMasterPageCache != bOn ) { OptionsChanged(); bMasterPageCache = bOn; } }
+ void SetDragWithCopy( bool bOn ) { if( bDragWithCopy != bOn ) { OptionsChanged(); bDragWithCopy = bOn; } }
+ void SetPickThrough( bool bOn ) { if( bPickThrough != bOn ) { OptionsChanged(); bPickThrough = bOn; } }
+ void SetDoubleClickTextEdit( bool bOn ) { if( bDoubleClickTextEdit != bOn ) { OptionsChanged(); bDoubleClickTextEdit = bOn; } }
+ void SetClickChangeRotation( bool bOn ) { if( bClickChangeRotation != bOn ) { OptionsChanged(); bClickChangeRotation = bOn; } }
+ void SetEnableSdremote( bool bOn ) { if( bEnableSdremote != bOn ) { OptionsChanged(); bEnableSdremote = bOn; } }
+ void SetEnablePresenterScreen( bool bOn ) { if( bEnablePresenterScreen != bOn ) { OptionsChanged(); bEnablePresenterScreen = bOn; } }
+ void SetSummationOfParagraphs( bool bOn ){ if ( bOn != bSummationOfParagraphs ) { OptionsChanged(); bSummationOfParagraphs = bOn; } }
+ void SetTabBarVisible( bool bOn ){ if ( bOn != bTabBarVisible ) { OptionsChanged(); bTabBarVisible = bOn; } }
+ /** Set the printer independent layout mode.
+ @param nOn
+ The default value is to switch printer independent layout on,
+ hence the parameters name. Use 0 for turning it off. Other
+ values are reserved for future use.
+ */
+ void SetPrinterIndependentLayout (sal_uInt16 nOn ){ if ( nOn != mnPrinterIndependentLayout ) { OptionsChanged(); mnPrinterIndependentLayout = nOn; } }
+ void SetSolidDragging( bool bOn ) { if( bSolidDragging != bOn ) { OptionsChanged(); bSolidDragging = bOn; } }
+ void SetShowUndoDeleteWarning( bool bOn ) { if( bShowUndoDeleteWarning != bOn ) { OptionsChanged(); bShowUndoDeleteWarning = bOn; } }
+ void SetSlideshowRespectZOrder( bool bOn ) { if( bSlideshowRespectZOrder != bOn ) { OptionsChanged(); bSlideshowRespectZOrder = bOn; } }
+ void SetDefaultObjectSizeWidth( sal_Int32 nWidth ) { if( nDefaultObjectSizeWidth != nWidth ) { OptionsChanged(); nDefaultObjectSizeWidth = nWidth; } }
+ void SetDefaultObjectSizeHeight( sal_Int32 nHeight ) { if( nDefaultObjectSizeHeight != nHeight ) { OptionsChanged(); nDefaultObjectSizeHeight = nHeight; } }
+
+ void SetPreviewNewEffects( bool bOn ) { if( bPreviewNewEffects != bOn ) { OptionsChanged(); bPreviewNewEffects = bOn; } }
+ void SetPreviewChangedEffects( bool bOn ) { if( bPreviewChangedEffects != bOn ) { OptionsChanged(); bPreviewChangedEffects = bOn; } }
+ void SetPreviewTransitions( bool bOn ) { if( bPreviewTransitions != bOn ) { OptionsChanged(); bPreviewTransitions = bOn; } }
+
+ bool IsShowComments() const { Init(); return bShowComments; }
+ void SetShowComments( bool bShow ) { if( bShowComments != bShow ) { OptionsChanged(); bShowComments = bShow; } }
+};
+
+class SD_DLLPUBLIC SdOptionsMiscItem : public SfxPoolItem
+{
+public:
+
+ explicit SdOptionsMiscItem();
+ SdOptionsMiscItem( SdOptions const * pOpts, ::sd::FrameView const * pView );
+
+ virtual SdOptionsMiscItem* Clone( SfxItemPool *pPool = nullptr ) const override;
+ virtual bool operator==( const SfxPoolItem& ) const override;
+
+ void SetOptions( SdOptions* pOpts ) const;
+
+ SdOptionsMisc& GetOptionsMisc() { return maOptionsMisc; }
+ const SdOptionsMisc& GetOptionsMisc() const { return maOptionsMisc; }
+private:
+ SdOptionsMisc maOptionsMisc;
+};
+
+class SD_DLLPUBLIC SdOptionsSnap : public SdOptionsGeneric
+{
+private:
+
+ bool bSnapHelplines : 1; // Snap/Object/SnapLine
+ bool bSnapBorder : 1; // Snap/Object/PageMargin
+ bool bSnapFrame : 1; // Snap/Object/ObjectFrame
+ bool bSnapPoints : 1; // Snap/Object/ObjectPoint
+ bool bOrtho : 1; // Snap/Position/CreatingMoving
+ bool bBigOrtho : 1; // Snap/Position/ExtendEdges
+ bool bRotate : 1; // Snap/Position/Rotating
+ sal_Int16 nSnapArea; // Snap/Object/Range
+ Degree100 nAngle; // Snap/Position/RotatingValue
+ Degree100 nBezAngle; // Snap/Position/PointReduction
+
+protected:
+
+ virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override;
+ virtual bool ReadData( const css::uno::Any* pValues ) override;
+ virtual bool WriteData( css::uno::Any* pValues ) const override;
+
+public:
+
+ SdOptionsSnap(bool bImpress, bool bUseConfig);
+
+ bool operator==( const SdOptionsSnap& rOpt ) const;
+
+ bool IsSnapHelplines() const { Init(); return bSnapHelplines; }
+ bool IsSnapBorder() const { Init(); return bSnapBorder; }
+ bool IsSnapFrame() const { Init(); return bSnapFrame; }
+ bool IsSnapPoints() const { Init(); return bSnapPoints; }
+ bool IsOrtho() const { Init(); return bOrtho; }
+ bool IsBigOrtho() const { Init(); return bBigOrtho; }
+ bool IsRotate() const { Init(); return bRotate; }
+ sal_Int16 GetSnapArea() const { Init(); return nSnapArea; }
+ Degree100 GetAngle() const { Init(); return nAngle; }
+ Degree100 GetEliminatePolyPointLimitAngle() const { Init(); return nBezAngle; }
+
+ void SetSnapHelplines( bool bOn ) { if( bSnapHelplines != bOn ) { OptionsChanged(); bSnapHelplines = bOn; } }
+ void SetSnapBorder( bool bOn ) { if( bSnapBorder != bOn ) { OptionsChanged(); bSnapBorder = bOn; } }
+ void SetSnapFrame( bool bOn ) { if( bSnapFrame != bOn ) { OptionsChanged(); bSnapFrame = bOn; } }
+ void SetSnapPoints( bool bOn ) { if( bSnapPoints != bOn ) { OptionsChanged(); bSnapPoints = bOn; } }
+ void SetOrtho( bool bOn ) { if( bOrtho != bOn ) { OptionsChanged(); bOrtho = bOn; } }
+ void SetBigOrtho( bool bOn ) { if( bBigOrtho != bOn ) { OptionsChanged(); bBigOrtho = bOn; } }
+ void SetRotate( bool bOn ) { if( bRotate != bOn ) { OptionsChanged(); bRotate = bOn; } }
+ void SetSnapArea( sal_Int16 nIn ) { if( nSnapArea != nIn ) { OptionsChanged(); nSnapArea = nIn; } }
+ void SetAngle( Degree100 nIn ) { if( nAngle != nIn ) { OptionsChanged(); nAngle = nIn; } }
+ void SetEliminatePolyPointLimitAngle( Degree100 nIn ) { if( nBezAngle != nIn ) { OptionsChanged(); nBezAngle = nIn; } }
+};
+
+class SD_DLLPUBLIC SdOptionsSnapItem : public SfxPoolItem
+{
+public:
+
+ explicit SdOptionsSnapItem();
+ SdOptionsSnapItem( SdOptions const * pOpts, ::sd::FrameView const * pView );
+
+ virtual SdOptionsSnapItem* Clone( SfxItemPool *pPool = nullptr ) const override;
+ virtual bool operator==( const SfxPoolItem& ) const override;
+
+ void SetOptions( SdOptions* pOpts ) const;
+
+ SdOptionsSnap& GetOptionsSnap() { return maOptionsSnap; }
+private:
+ SdOptionsSnap maOptionsSnap;
+};
+
+class SdOptionsZoom : public SdOptionsGeneric
+{
+private:
+
+ sal_Int32 nX; // Zoom/ScaleX
+ sal_Int32 nY; // Zoom/ScaleY
+
+protected:
+
+ virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override;
+ virtual bool ReadData( const css::uno::Any* pValues ) override;
+ virtual bool WriteData( css::uno::Any* pValues ) const override;
+
+public:
+
+ explicit SdOptionsZoom(bool bImpress);
+
+ void GetScale( sal_Int32& rX, sal_Int32& rY ) const { Init(); rX = nX; rY = nY; }
+ void SetScale( sal_Int32 nInX, sal_Int32 nInY ) { if( nX != nInX || nY != nInY ) { OptionsChanged(); nX = nInX; nY = nInY; } }
+};
+
+class SdOptionsGrid : public SdOptionsGeneric, public SvxOptionsGrid
+{
+protected:
+
+ virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override;
+ virtual bool ReadData( const css::uno::Any* pValues ) override;
+ virtual bool WriteData( css::uno::Any* pValues ) const override;
+
+public:
+
+ explicit SdOptionsGrid(bool bImpress);
+ virtual ~SdOptionsGrid() override;
+
+ void SetDefaults();
+
+ sal_uInt32 GetFieldDrawX() const { Init(); return SvxOptionsGrid::GetFieldDrawX(); }
+ sal_uInt32 GetFieldDivisionX() const { Init(); return SvxOptionsGrid::GetFieldDivisionX(); }
+ sal_uInt32 GetFieldDrawY() const { Init(); return SvxOptionsGrid::GetFieldDrawY(); }
+ sal_uInt32 GetFieldDivisionY() const { Init(); return SvxOptionsGrid::GetFieldDivisionY(); }
+ sal_uInt32 GetFieldSnapX() const { Init(); return SvxOptionsGrid::GetFieldSnapX(); }
+ sal_uInt32 GetFieldSnapY() const { Init(); return SvxOptionsGrid::GetFieldSnapY(); }
+ bool IsUseGridSnap() const { Init(); return SvxOptionsGrid::GetUseGridSnap(); }
+ bool IsSynchronize() const { Init(); return SvxOptionsGrid::GetSynchronize(); }
+ bool IsGridVisible() const { Init(); return SvxOptionsGrid::GetGridVisible(); }
+ bool IsEqualGrid() const { Init(); return SvxOptionsGrid::GetEqualGrid(); }
+
+ void SetFieldDrawX( sal_uInt32 nSet ) { if( nSet != SvxOptionsGrid::GetFieldDrawX() ) { OptionsChanged(); SvxOptionsGrid::SetFieldDrawX( nSet ); } }
+ void SetFieldDivisionX( sal_uInt32 nSet ) { if( nSet != SvxOptionsGrid::GetFieldDivisionX() ) { OptionsChanged(); SvxOptionsGrid::SetFieldDivisionX( nSet ); } }
+ void SetFieldDrawY( sal_uInt32 nSet ) { if( nSet != SvxOptionsGrid::GetFieldDrawY() ) { OptionsChanged(); SvxOptionsGrid::SetFieldDrawY( nSet ); } }
+ void SetFieldDivisionY( sal_uInt32 nSet ) { if( nSet != SvxOptionsGrid::GetFieldDivisionY() ) { OptionsChanged(); SvxOptionsGrid::SetFieldDivisionY( nSet ); } }
+ void SetFieldSnapX( sal_uInt32 nSet ) { if( nSet != SvxOptionsGrid::GetFieldSnapX() ) { OptionsChanged(); SvxOptionsGrid::SetFieldSnapX( nSet ); } }
+ void SetFieldSnapY( sal_uInt32 nSet ) { if( nSet != SvxOptionsGrid::GetFieldSnapY() ) { OptionsChanged(); SvxOptionsGrid::SetFieldSnapY( nSet ); } }
+ void SetUseGridSnap( bool bSet ) { if( bSet != SvxOptionsGrid::GetUseGridSnap() ) { OptionsChanged(); SvxOptionsGrid::SetUseGridSnap( bSet ); } }
+ void SetSynchronize( bool bSet ) { if( bSet != SvxOptionsGrid::GetSynchronize() ) { OptionsChanged(); SvxOptionsGrid::SetSynchronize( bSet ); } }
+ void SetGridVisible( bool bSet ) { if( bSet != SvxOptionsGrid::GetGridVisible() ) { OptionsChanged(); SvxOptionsGrid::SetGridVisible( bSet ); } }
+ void SetEqualGrid( bool bSet ) { if( bSet != SvxOptionsGrid::GetEqualGrid() ) { OptionsChanged(); SvxOptionsGrid::SetEqualGrid( bSet ); } }
+};
+
+class SdOptionsGridItem : public SvxGridItem
+{
+
+public:
+ explicit SdOptionsGridItem( SdOptions const * pOpts );
+
+ void SetOptions( SdOptions* pOpts ) const;
+};
+
+class SD_DLLPUBLIC SdOptionsPrint : public SdOptionsGeneric
+{
+private:
+
+ bool bDraw : 1; // Print/Content/Drawing
+ bool bNotes : 1; // Print/Content/Note
+ bool bHandout : 1; // Print/Content/Handout
+ bool bOutline : 1; // Print/Content/Outline
+ bool bDate : 1; // Print/Other/Date
+ bool bTime : 1; // Print/Other/Time
+ bool bPagename : 1; // Print/Other/PageName
+ bool bHiddenPages : 1; // Print/Other/HiddenPage
+ bool bPagesize : 1; // Print/Page/PageSize
+ bool bPagetile : 1; // Print/Page/PageTile
+ bool bWarningPrinter : 1; // These flags you get
+ bool bWarningSize : 1; // from the common options,
+ bool bWarningOrientation : 1; // currently org.openoffice.Office.Common.xml (class OfaMiscCfg ; sfx2/misccfg.hxx )
+ bool bBooklet : 1; // Print/Page/Booklet
+ bool bFront : 1; // Print/Page/BookletFront
+ bool bBack : 1; // Print/Page/BookletFront
+ bool bCutPage : 1; // NOT persistent !!!
+ bool bPaperbin : 1; // Print/Other/FromPrinterSetup
+ bool mbHandoutHorizontal : 1; // Order Page previews on Handout Pages horizontal
+ sal_uInt16 mnHandoutPages; // Number of page previews on handout page (only 1/2/4/6/9 are supported)
+ sal_uInt16 nQuality; // Print/Other/Quality
+
+protected:
+
+ virtual void GetPropNameArray( const char**& ppNames, sal_uLong& rCount ) const override;
+ virtual bool ReadData( const css::uno::Any* pValues ) override;
+ virtual bool WriteData( css::uno::Any* pValues ) const override;
+
+public:
+
+ SdOptionsPrint(bool bImpress, bool bUseConfig);
+
+ bool operator==( const SdOptionsPrint& rOpt ) const;
+
+ bool IsDraw() const { Init(); return bDraw; }
+ bool IsNotes() const { Init(); return bNotes; }
+ bool IsHandout() const { Init(); return bHandout; }
+ bool IsOutline() const { Init(); return bOutline; }
+ bool IsDate() const { Init(); return bDate; }
+ bool IsTime() const { Init(); return bTime; }
+ bool IsPagename() const { Init(); return bPagename; }
+ bool IsHiddenPages() const { Init(); return bHiddenPages; }
+ bool IsPagesize() const { Init(); return bPagesize; }
+ bool IsPagetile() const { Init(); return bPagetile; }
+ bool IsWarningPrinter() const { Init(); return bWarningPrinter; }
+ bool IsWarningSize() const { Init(); return bWarningSize; }
+ bool IsWarningOrientation() const { Init(); return bWarningOrientation; }
+ bool IsBooklet() const { Init(); return bBooklet; }
+ bool IsFrontPage() const { Init(); return bFront; }
+ bool IsBackPage() const { Init(); return bBack; }
+ bool IsCutPage() const { Init(); return bCutPage; }
+ bool IsPaperbin() const { Init(); return bPaperbin; }
+ sal_uInt16 GetOutputQuality() const { Init(); return nQuality; }
+ bool IsHandoutHorizontal() const { Init(); return mbHandoutHorizontal; }
+ sal_uInt16 GetHandoutPages() const { Init(); return mnHandoutPages; }
+
+ void SetDraw( bool bOn ) { if( bDraw != bOn ) { OptionsChanged(); bDraw = bOn; } }
+ void SetNotes( bool bOn ) { if( bNotes != bOn ) { OptionsChanged(); bNotes = bOn; } }
+ void SetHandout( bool bOn ) { if( bHandout != bOn ) { OptionsChanged(); bHandout = bOn; } }
+ void SetOutline( bool bOn ) { if( bOutline != bOn ) { OptionsChanged(); bOutline = bOn; } }
+ void SetDate( bool bOn ) { if( bDate != bOn ) { OptionsChanged(); bDate = bOn; } }
+ void SetTime( bool bOn ) { if( bTime != bOn ) { OptionsChanged(); bTime = bOn; } }
+ void SetPagename( bool bOn ) { if( bPagename != bOn ) { OptionsChanged(); bPagename = bOn; } }
+ void SetHiddenPages( bool bOn ) { if( bHiddenPages != bOn ) { OptionsChanged(); bHiddenPages = bOn; } }
+ void SetPagesize( bool bOn ) { if( bPagesize != bOn ) { OptionsChanged(); bPagesize = bOn; } }
+ void SetPagetile( bool bOn ) { if( bPagetile != bOn ) { OptionsChanged(); bPagetile = bOn; } }
+ void SetWarningPrinter( bool bOn ) { if( bWarningPrinter != bOn ) { OptionsChanged(); bWarningPrinter = bOn; } }
+ void SetWarningSize( bool bOn ) { if( bWarningSize != bOn ) { OptionsChanged(); bWarningSize = bOn; } }
+ void SetWarningOrientation( bool bOn) { if( bWarningOrientation != bOn ) { OptionsChanged(); bWarningOrientation = bOn; } }
+ void SetBooklet( bool bOn ) { if( bBooklet != bOn ) { OptionsChanged(); bBooklet = bOn; } }
+ void SetFrontPage( bool bOn ) { if( bFront != bOn ) { OptionsChanged(); bFront = bOn; } }
+ void SetBackPage( bool bOn ) { if( bBack != bOn ) { OptionsChanged(); bBack = bOn; } }
+ void SetCutPage( bool bOn ) { if( bCutPage != bOn ) { OptionsChanged(); bCutPage = bOn; } }
+ void SetPaperbin( bool bOn ) { if( bPaperbin != bOn ) { OptionsChanged(); bPaperbin = bOn; } }
+ void SetOutputQuality( sal_uInt16 nInQuality ) { if( nQuality != nInQuality ) { OptionsChanged(); nQuality = nInQuality; } }
+ void SetHandoutHorizontal( bool bHandoutHorizontal ) { if( mbHandoutHorizontal != bHandoutHorizontal ) { OptionsChanged(); mbHandoutHorizontal = bHandoutHorizontal; } }
+ void SetHandoutPages( sal_uInt16 nHandoutPages ) { if( nHandoutPages != mnHandoutPages ) { OptionsChanged(); mnHandoutPages = nHandoutPages; } }
+};
+
+class SD_DLLPUBLIC SdOptionsPrintItem : public SfxPoolItem
+{
+public:
+
+ explicit SdOptionsPrintItem();
+ explicit SdOptionsPrintItem( SdOptions const * pOpts );
+
+ virtual SdOptionsPrintItem* Clone( SfxItemPool *pPool = nullptr ) const override;
+ virtual bool operator==( const SfxPoolItem& ) const override;
+
+ void SetOptions( SdOptions* pOpts ) const;
+
+ SdOptionsPrint& GetOptionsPrint() { return maOptionsPrint; }
+ const SdOptionsPrint& GetOptionsPrint() const { return maOptionsPrint; }
+private:
+ SdOptionsPrint maOptionsPrint;
+};
+
+class SdOptions : public SdOptionsLayout, public SdOptionsContents,
+ public SdOptionsMisc, public SdOptionsSnap,
+ public SdOptionsZoom, public SdOptionsGrid,
+ public SdOptionsPrint
+{
+public:
+
+ explicit SdOptions(bool bImpress);
+ virtual ~SdOptions() override;
+
+ void StoreConfig();
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/paragr.hxx b/sd/source/ui/inc/paragr.hxx
new file mode 100644
index 000000000..30304d800
--- /dev/null
+++ b/sd/source/ui/inc/paragr.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/tabdlg.hxx>
+
+/**
+ * Paragraph-Tab-Dialog
+ */
+class SdParagraphDlg : public SfxTabDialogController
+{
+private:
+ virtual void PageCreated(const OString& rId, SfxTabPage& rPage) override;
+
+public:
+ SdParagraphDlg(weld::Window* pParent, const SfxItemSet* pAttr);
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/pgjump.hxx b/sd/source/ui/inc/pgjump.hxx
new file mode 100644
index 000000000..c4d434caa
--- /dev/null
+++ b/sd/source/ui/inc/pgjump.hxx
@@ -0,0 +1,31 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+enum PageJump
+{
+ PAGE_NONE,
+ PAGE_FIRST,
+ PAGE_PREVIOUS,
+ PAGE_NEXT,
+ PAGE_LAST
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/present.hxx b/sd/source/ui/inc/present.hxx
new file mode 100644
index 000000000..00c78ac79
--- /dev/null
+++ b/sd/source/ui/inc/present.hxx
@@ -0,0 +1,90 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/weld.hxx>
+#include <vcl/weldutils.hxx>
+
+class SfxItemSet;
+class SdCustomShowList;
+
+/**
+ * Dialog to define optionsm_xnd to start the presentation
+ */
+class SdStartPresentationDlg : public weld::GenericDialogController
+{
+private:
+ SdCustomShowList* pCustomShowList;
+ const SfxItemSet& rOutAttrs;
+ sal_Int32 mnMonitors;
+
+ std::unique_ptr<weld::RadioButton> m_xRbtAll;
+ std::unique_ptr<weld::RadioButton> m_xRbtAtDia;
+ std::unique_ptr<weld::RadioButton> m_xRbtCustomshow;
+ std::unique_ptr<weld::ComboBox> m_xLbDias;
+ std::unique_ptr<weld::ComboBox> m_xLbCustomshow;
+
+ std::unique_ptr<weld::RadioButton> m_xRbtStandard;
+ std::unique_ptr<weld::RadioButton> m_xRbtWindow;
+ std::unique_ptr<weld::RadioButton> m_xRbtAuto;
+ std::unique_ptr<weld::FormattedSpinButton> m_xTmfPause;
+ std::unique_ptr<weld::TimeFormatter> m_xFormatter;
+ std::unique_ptr<weld::CheckButton> m_xCbxAutoLogo;
+
+ std::unique_ptr<weld::CheckButton> m_xCbxManuel;
+ std::unique_ptr<weld::CheckButton> m_xCbxMousepointer;
+ std::unique_ptr<weld::CheckButton> m_xCbxPen;
+ std::unique_ptr<weld::CheckButton> m_xCbxAnimationAllowed;
+ std::unique_ptr<weld::CheckButton> m_xCbxChangePage;
+ std::unique_ptr<weld::CheckButton> m_xCbxAlwaysOnTop;
+
+ std::unique_ptr<weld::Label> m_xFtMonitor;
+ std::unique_ptr<weld::ComboBox> m_xLBMonitor;
+
+ std::unique_ptr<weld::Label> m_xMonitor;
+ std::unique_ptr<weld::Label> m_xAllMonitors;
+ std::unique_ptr<weld::Label> m_xMonitorExternal;
+ std::unique_ptr<weld::Label> m_xExternal;
+
+ DECL_LINK(ChangeRangeHdl, weld::Toggleable&, void);
+ DECL_LINK(ClickWindowPresentationHdl, weld::Toggleable&, void);
+ void ChangePause();
+ DECL_LINK(ChangePauseHdl, weld::FormattedSpinButton&, void);
+
+ void InitMonitorSettings();
+ enum DisplayType {
+ EXTERNAL_IS_NUMBER,
+ MONITOR_NORMAL,
+ MONITOR_IS_EXTERNAL,
+ };
+ sal_Int32 InsertDisplayEntry(const OUString &aName,
+ sal_Int32 nDisplay);
+ OUString GetDisplayName( sal_Int32 nDisplay,
+ DisplayType eType );
+public:
+ SdStartPresentationDlg(weld::Window* pWindow,
+ const SfxItemSet& rInAttrs,
+ const std::vector<OUString> &rPageNames,
+ SdCustomShowList* pCSList);
+ virtual ~SdStartPresentationDlg() override;
+ void GetAttr( SfxItemSet& rOutAttrs );
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/prltempl.hxx b/sd/source/ui/inc/prltempl.hxx
new file mode 100644
index 000000000..efd50e4f7
--- /dev/null
+++ b/sd/source/ui/inc/prltempl.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/tabdlg.hxx>
+#include <svx/xtable.hxx>
+
+#include <prlayout.hxx>
+
+class SfxObjectShell;
+class SfxStyleSheetBase;
+class SfxStyleSheetBasePool;
+
+/**
+ * Template-Tab-Dialog
+ */
+class SdPresLayoutTemplateDlg final : public SfxTabDialogController
+{
+private:
+ const SfxObjectShell* mpDocShell;
+
+ XColorListRef pColorTab;
+ XGradientListRef pGradientList;
+ XHatchListRef pHatchingList;
+ XBitmapListRef pBitmapList;
+ XPatternListRef pPatternList;
+ XDashListRef pDashList;
+ XLineEndListRef pLineEndList;
+
+ PresentationObjects ePO;
+
+ virtual void PageCreated(const OString& rId, SfxTabPage &rPage) override;
+
+ // for mapping with the new SvxNumBulletItem
+ SfxItemSet aInputSet;
+ std::unique_ptr<SfxItemSet> pOutSet;
+
+ sal_uInt16 GetOutlineLevel() const;
+
+public:
+ SdPresLayoutTemplateDlg(SfxObjectShell const * pDocSh, weld::Window* pParent, bool bBackground, SfxStyleSheetBase& rStyleBase, PresentationObjects ePO, SfxStyleSheetBasePool* pSSPool);
+ virtual ~SdPresLayoutTemplateDlg() override;
+
+ const SfxItemSet* GetOutputItemSet() const;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/prntopts.hxx b/sd/source/ui/inc/prntopts.hxx
new file mode 100644
index 000000000..51c3a3603
--- /dev/null
+++ b/sd/source/ui/inc/prntopts.hxx
@@ -0,0 +1,69 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/tabdlg.hxx>
+
+class SdPrintOptions final : public SfxTabPage
+{
+ friend class SdModule;
+
+private:
+ std::unique_ptr<weld::Frame> m_xFrmContent;
+ std::unique_ptr<weld::CheckButton> m_xCbxDraw;
+ std::unique_ptr<weld::CheckButton> m_xCbxNotes;
+ std::unique_ptr<weld::CheckButton> m_xCbxHandout;
+ std::unique_ptr<weld::CheckButton> m_xCbxOutline;
+ std::unique_ptr<weld::RadioButton> m_xRbtColor;
+ std::unique_ptr<weld::RadioButton> m_xRbtGrayscale;
+ std::unique_ptr<weld::RadioButton> m_xRbtBlackWhite;
+ std::unique_ptr<weld::CheckButton> m_xCbxPagename;
+ std::unique_ptr<weld::CheckButton> m_xCbxDate;
+ std::unique_ptr<weld::CheckButton> m_xCbxTime;
+ std::unique_ptr<weld::CheckButton> m_xCbxHiddenPages;
+ std::unique_ptr<weld::RadioButton> m_xRbtDefault;
+ std::unique_ptr<weld::RadioButton> m_xRbtPagesize;
+ std::unique_ptr<weld::RadioButton> m_xRbtPagetile;
+ std::unique_ptr<weld::RadioButton> m_xRbtBooklet;
+ std::unique_ptr<weld::CheckButton> m_xCbxFront;
+ std::unique_ptr<weld::CheckButton> m_xCbxBack;
+ std::unique_ptr<weld::CheckButton> m_xCbxPaperbin;
+
+ DECL_LINK(ClickCheckboxHdl, weld::Toggleable&, void);
+ DECL_LINK(ClickBookletHdl, weld::Toggleable&, void);
+
+ void updateControls();
+
+public:
+ SdPrintOptions(weld::Container* pPage, weld::DialogController* pController,
+ const SfxItemSet& rInAttrs);
+ virtual ~SdPrintOptions() override;
+
+ static std::unique_ptr<SfxTabPage>
+ Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet*);
+
+ virtual bool FillItemSet(SfxItemSet*) override;
+ virtual void Reset(const SfxItemSet*) override;
+
+ void SetDrawMode();
+ virtual void PageCreated(const SfxAllItemSet& aSet) override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/pubdlg.hxx b/sd/source/ui/inc/pubdlg.hxx
new file mode 100644
index 000000000..1f0b7274c
--- /dev/null
+++ b/sd/source/ui/inc/pubdlg.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <svtools/valueset.hxx>
+#include <vcl/weld.hxx>
+#include <vcl/weldutils.hxx>
+#include <pres.hxx>
+#include "assclass.hxx"
+
+#include <memory>
+#include <vector>
+
+class ListBox;
+class Edit;
+class SdHtmlAttrPreview;
+class SdPublishingDesign;
+class ButtonSet;
+
+namespace com::sun::star::beans
+{
+struct PropertyValue;
+}
+namespace com::sun::star::uno
+{
+template <class E> class Sequence;
+}
+
+// *********************************************************************
+// Html-Export Autopilot
+// *********************************************************************
+// should turn this into a wizard
+class SdPublishingDlg final : public weld::GenericDialogController
+{
+private:
+ // page 1 controls
+ std::unique_ptr<weld::Container> m_xPage1;
+ std::unique_ptr<weld::Label> m_xPage1_Title;
+ std::unique_ptr<weld::RadioButton> m_xPage1_NewDesign;
+ std::unique_ptr<weld::RadioButton> m_xPage1_OldDesign;
+ std::unique_ptr<weld::TreeView> m_xPage1_Designs;
+ std::unique_ptr<weld::Button> m_xPage1_DelDesign;
+ std::unique_ptr<weld::Label> m_xPage1_Desc;
+
+ // page 2 controls
+ std::unique_ptr<weld::Container> m_xPage2;
+ std::unique_ptr<weld::Container> m_xPage2Frame2;
+ std::unique_ptr<weld::Container> m_xPage2Frame3;
+ std::unique_ptr<weld::Container> m_xPage2Frame4;
+ std::unique_ptr<weld::Label> m_xPage2_Title;
+ std::unique_ptr<weld::RadioButton> m_xPage2_Standard;
+ std::unique_ptr<weld::RadioButton> m_xPage2_Frames;
+ std::unique_ptr<weld::RadioButton> m_xPage2_SingleDocument;
+ std::unique_ptr<weld::RadioButton> m_xPage2_Kiosk;
+ std::unique_ptr<weld::RadioButton> m_xPage2_WebCast;
+ std::unique_ptr<weld::Image> m_xPage2_Standard_FB;
+ std::unique_ptr<weld::Image> m_xPage2_Frames_FB;
+ std::unique_ptr<weld::Image> m_xPage2_Kiosk_FB;
+ std::unique_ptr<weld::Image> m_xPage2_WebCast_FB;
+
+ std::unique_ptr<weld::Label> m_xPage2_Title_Html;
+ std::unique_ptr<weld::CheckButton> m_xPage2_Content;
+ std::unique_ptr<weld::CheckButton> m_xPage2_Notes;
+
+ std::unique_ptr<weld::Label> m_xPage2_Title_WebCast;
+ std::unique_ptr<weld::RadioButton> m_xPage2_ASP;
+ std::unique_ptr<weld::RadioButton> m_xPage2_PERL;
+ std::unique_ptr<weld::Label> m_xPage2_URL_txt;
+ std::unique_ptr<weld::Entry> m_xPage2_URL;
+ std::unique_ptr<weld::Label> m_xPage2_CGI_txt;
+ std::unique_ptr<weld::Entry> m_xPage2_CGI;
+ std::unique_ptr<weld::Label> m_xPage2_Index_txt;
+ std::unique_ptr<weld::Entry> m_xPage2_Index;
+ std::unique_ptr<weld::Label> m_xPage2_Title_Kiosk;
+ std::unique_ptr<weld::RadioButton> m_xPage2_ChgDefault;
+ std::unique_ptr<weld::RadioButton> m_xPage2_ChgAuto;
+ std::unique_ptr<weld::Label> m_xPage2_Duration_txt;
+ std::unique_ptr<weld::FormattedSpinButton> m_xPage2_Duration;
+ std::unique_ptr<weld::TimeFormatter> m_xFormatter;
+ std::unique_ptr<weld::CheckButton> m_xPage2_Endless;
+
+ // page 3 controls
+ std::unique_ptr<weld::Container> m_xPage3;
+ std::unique_ptr<weld::Label> m_xPage3_Title1;
+ std::unique_ptr<weld::RadioButton> m_xPage3_Png;
+ std::unique_ptr<weld::RadioButton> m_xPage3_Gif;
+ std::unique_ptr<weld::RadioButton> m_xPage3_Jpg;
+ std::unique_ptr<weld::Label> m_xPage3_Quality_txt;
+ std::unique_ptr<weld::ComboBox> m_xPage3_Quality;
+ std::unique_ptr<weld::Label> m_xPage3_Title2;
+ std::unique_ptr<weld::RadioButton> m_xPage3_Resolution_1;
+ std::unique_ptr<weld::RadioButton> m_xPage3_Resolution_2;
+ std::unique_ptr<weld::RadioButton> m_xPage3_Resolution_3;
+ std::unique_ptr<weld::RadioButton> m_xPage3_Resolution_4;
+ std::unique_ptr<weld::Label> m_xPage3_Title3;
+ std::unique_ptr<weld::CheckButton> m_xPage3_SldSound;
+ std::unique_ptr<weld::CheckButton> m_xPage3_HiddenSlides;
+
+ // page 4 controls
+ std::unique_ptr<weld::Container> m_xPage4;
+ std::unique_ptr<weld::Label> m_xPage4_Title1;
+ std::unique_ptr<weld::Label> m_xPage4_Author_txt;
+ std::unique_ptr<weld::Entry> m_xPage4_Author;
+ std::unique_ptr<weld::Label> m_xPage4_Email_txt;
+ std::unique_ptr<weld::Entry> m_xPage4_Email;
+ std::unique_ptr<weld::Label> m_xPage4_WWW_txt;
+ std::unique_ptr<weld::Entry> m_xPage4_WWW;
+ std::unique_ptr<weld::Label> m_xPage4_Title2;
+ std::unique_ptr<weld::TextView> m_xPage4_Misc;
+ std::unique_ptr<weld::CheckButton> m_xPage4_Download;
+
+ // page 5 controls
+ std::unique_ptr<weld::Container> m_xPage5;
+ std::unique_ptr<weld::Label> m_xPage5_Title;
+ std::unique_ptr<weld::CheckButton> m_xPage5_TextOnly;
+ std::unique_ptr<ValueSet> m_xPage5_Buttons;
+ std::unique_ptr<weld::CustomWeld> m_xPage5_ButtonsWnd;
+
+ // page 6 controls
+ std::unique_ptr<weld::Container> m_xPage6;
+ std::unique_ptr<weld::Label> m_xPage6_Title;
+ std::unique_ptr<weld::RadioButton> m_xPage6_Default;
+ std::unique_ptr<weld::RadioButton> m_xPage6_User;
+ std::unique_ptr<weld::Button> m_xPage6_Back;
+ std::unique_ptr<weld::Button> m_xPage6_Text;
+ std::unique_ptr<weld::Button> m_xPage6_Link;
+ std::unique_ptr<weld::Button> m_xPage6_VLink;
+ std::unique_ptr<weld::Button> m_xPage6_ALink;
+ std::unique_ptr<weld::RadioButton> m_xPage6_DocColors;
+ std::unique_ptr<SdHtmlAttrPreview> m_xPage6_Preview;
+ std::unique_ptr<weld::CustomWeld> m_xPage6_PreviewWnd;
+
+ std::unique_ptr<ButtonSet> m_xButtonSet;
+
+ // standard controls
+ std::unique_ptr<weld::Button> m_xLastPageButton;
+ std::unique_ptr<weld::Button> m_xNextPageButton;
+ std::unique_ptr<weld::Button> m_xFinishButton;
+
+ Assistent aAssistentFunc;
+
+ bool m_bImpress;
+ bool m_bButtonsDirty;
+
+ void SetDefaults();
+ void CreatePages();
+
+ Color m_aBackColor, m_aTextColor, m_aLinkColor;
+ Color m_aVLinkColor, m_aALinkColor;
+
+ void ChangePage();
+ void UpdatePage();
+
+ std::vector<SdPublishingDesign> m_aDesignList;
+ bool m_bDesignListDirty;
+ SdPublishingDesign* m_pDesign;
+ void Load();
+ bool Save();
+
+ void GetDesign(SdPublishingDesign* pDesign);
+ void SetDesign(SdPublishingDesign const* pDesign);
+
+ void LoadPreviewButtons();
+
+ DECL_LINK(FinishHdl, weld::Button&, void);
+ DECL_LINK(NextPageHdl, weld::Button&, void);
+ DECL_LINK(LastPageHdl, weld::Button&, void);
+
+ DECL_LINK(DesignHdl, weld::Toggleable&, void);
+ DECL_LINK(DesignSelectHdl, weld::TreeView&, void);
+ DECL_LINK(DesignDeleteHdl, weld::Button&, void);
+ DECL_LINK(BaseHdl, weld::Toggleable&, void);
+ DECL_LINK(ContentHdl, weld::Toggleable&, void);
+ DECL_LINK(GfxFormatHdl, weld::Toggleable&, void);
+ DECL_LINK(ResolutionHdl, weld::Toggleable&, void);
+ DECL_LINK(ButtonsHdl, ValueSet*, void);
+ DECL_LINK(ColorHdl, weld::Button&, void);
+ DECL_LINK(WebServerHdl, weld::Toggleable&, void);
+ DECL_LINK(SlideChgHdl, weld::Toggleable&, void);
+
+public:
+ SdPublishingDlg(weld::Window* pWindow, DocumentType eDocType);
+ virtual ~SdPublishingDlg() override;
+
+ void GetParameterSequence(css::uno::Sequence<css::beans::PropertyValue>& rParams);
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/registerinterfaces.hxx b/sd/source/ui/inc/registerinterfaces.hxx
new file mode 100644
index 000000000..5a8be7dc0
--- /dev/null
+++ b/sd/source/ui/inc/registerinterfaces.hxx
@@ -0,0 +1,30 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+#include <sfx2/module.hxx>
+
+namespace sd::ui::table
+{
+void RegisterInterfaces(const SfxModule* pMod);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/scalectrl.hxx b/sd/source/ui/inc/scalectrl.hxx
new file mode 100644
index 000000000..2a0ed5b28
--- /dev/null
+++ b/sd/source/ui/inc/scalectrl.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/stbitem.hxx>
+
+class SdScaleControl final : public SfxStatusBarControl
+{
+public:
+ SdScaleControl(sal_uInt16 nSlotId, sal_uInt16 nId, StatusBar& rStb);
+ virtual ~SdScaleControl() override;
+
+ virtual void StateChangedAtStatusBarControl(sal_uInt16 nSID, SfxItemState eState,
+ const SfxPoolItem* pState) override;
+
+ SFX_DECL_STATUSBAR_CONTROL();
+
+private:
+ virtual void Command(const CommandEvent& rCEvt) override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/sdpopup.hxx b/sd/source/ui/inc/sdpopup.hxx
new file mode 100644
index 000000000..0eccc914d
--- /dev/null
+++ b/sd/source/ui/inc/sdpopup.hxx
@@ -0,0 +1,47 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <i18nlangtag/lang.h>
+#include <vcl/weld.hxx>
+
+class SvxFieldData;
+
+/**
+ * PopupMenu for editing field-commands
+ */
+class SdFieldPopup
+{
+private:
+ std::unique_ptr<weld::Builder> m_xBuilder;
+ std::unique_ptr<weld::Menu> m_xPopup;
+ const SvxFieldData* m_pField;
+
+ void Fill( LanguageType eLanguage );
+
+public:
+ SdFieldPopup(const SvxFieldData* pInField, LanguageType eLanguage);
+ void Execute(weld::Window* pParent, const tools::Rectangle& rRect);
+ ~SdFieldPopup();
+
+ SvxFieldData* GetField();
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/sdpreslt.hxx b/sd/source/ui/inc/sdpreslt.hxx
new file mode 100644
index 000000000..77187a0b3
--- /dev/null
+++ b/sd/source/ui/inc/sdpreslt.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <vector>
+
+#include <vcl/weld.hxx>
+
+class SfxItemSet;
+class ValueSet;
+namespace weld { class CustomWeld; }
+
+namespace sd {
+class DrawDocShell;
+}
+
+class SdPresLayoutDlg final
+ : public weld::GenericDialogController
+{
+public:
+ SdPresLayoutDlg(
+ ::sd::DrawDocShell* pDocShell,
+ weld::Window* pWindow,
+ const SfxItemSet& rInAttrs);
+ virtual ~SdPresLayoutDlg() override;
+
+ void GetAttr(SfxItemSet& rOutAttrs);
+
+ DECL_LINK(ClickLayoutHdl, ValueSet*, void);
+ DECL_LINK(ClickLoadHdl, weld::Button&, void);
+
+private:
+ ::sd::DrawDocShell* mpDocSh;
+
+ const SfxItemSet& mrOutAttrs;
+
+ std::vector<OUString> maLayoutNames;
+
+ OUString maName; ///< layout name or file name
+ tools::Long mnLayoutCount; ///< number of master pages in the document
+ const OUString maStrNone;
+
+ std::unique_ptr<weld::CheckButton> m_xCbxMasterPage;
+ std::unique_ptr<weld::CheckButton> m_xCbxCheckMasters;
+ std::unique_ptr<weld::Button> m_xBtnLoad;
+ std::unique_ptr<ValueSet> m_xVS;
+ std::unique_ptr<weld::CustomWeld> m_xVSWin;
+
+ void FillValueSet();
+ void Reset();
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/sdtreelb.hxx b/sd/source/ui/inc/sdtreelb.hxx
new file mode 100644
index 000000000..ea59ed0b5
--- /dev/null
+++ b/sd/source/ui/inc/sdtreelb.hxx
@@ -0,0 +1,395 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <pres.hxx>
+#include <sddllapi.h>
+#include <vcl/weld.hxx>
+#include <svl/urlbmk.hxx>
+#include <tools/ref.hxx>
+#include "sdxfer.hxx"
+#include <memory>
+#include <vector>
+
+class SdDrawDocument;
+class SfxMedium;
+class SfxViewFrame;
+class SdNavigatorWin;
+class SdrObject;
+class SdrObjList;
+class SdPage;
+struct ImplSVEvent;
+
+namespace sd {
+class ViewShell;
+
+class DrawDocShell;
+#ifndef SV_DECL_DRAW_DOC_SHELL_DEFINED
+#define SV_DECL_DRAW_DOC_SHELL_DEFINED
+typedef ::tools::SvRef<DrawDocShell> DrawDocShellRef;
+#endif
+}
+namespace svt {
+ class AcceleratorExecute;
+}
+
+class SdPageObjsTLVDropTarget final : public DropTargetHelper
+{
+private:
+ weld::TreeView& m_rTreeView;
+
+ virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override;
+ virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override;
+
+public:
+ SdPageObjsTLVDropTarget(weld::TreeView& rTreeView);
+};
+
+class SD_DLLPUBLIC SdPageObjsTLV
+{
+private:
+ static bool SAL_DLLPRIVATE bIsInDrag; ///< static, in the case the navigator is deleted in ExecuteDrag
+
+ std::unique_ptr<weld::TreeView> m_xTreeView;
+ std::unique_ptr<weld::TreeIter> m_xScratchIter;
+ std::unique_ptr<SdPageObjsTLVDropTarget> m_xDropTargetHelper;
+ std::unique_ptr<::svt::AcceleratorExecute> m_xAccel;
+ SdNavigatorWin* m_pNavigator;
+ const SdDrawDocument* m_pDoc;
+ SdDrawDocument* m_pBookmarkDoc;
+ SfxMedium* m_pMedium;
+ SfxMedium* m_pOwnMedium;
+ bool m_bLinkableSelected;
+ bool m_bShowAllShapes;
+
+ /** This flag controls whether to show all pages.
+ */
+ bool m_bShowAllPages;
+
+ /**
+ * If changing the selection should also result in navigating to the
+ * relevant shape.
+ */
+ bool m_bSelectionHandlerNavigates;
+
+ /**
+ * If navigation should not only select the relevant shape but also change
+ * focus to it.
+ */
+ bool m_bNavigationGrabsFocus;
+
+ SelectionMode m_eSelectionMode;
+
+ ImplSVEvent* m_nSelectEventId;
+ ImplSVEvent* m_nRowActivateEventId;
+
+ OUString m_aDocName;
+ ::sd::DrawDocShellRef m_xBookmarkDocShRef; ///< for the loading of bookmarks
+ Link<weld::TreeView&, void> m_aChangeHdl;
+ Link<weld::TreeView&, bool> m_aRowActivatedHdl;
+ Link<const KeyEvent&, bool> m_aKeyPressHdl;
+
+ /** Return the name of the object. When the object has no user supplied
+ name and the bCreate flag is <TRUE/> then a name is created
+ automatically. Additionally the mbShowAllShapes flag is taken into
+ account when there is no user supplied name. When this flag is
+ <FALSE/> then no name is created.
+ @param pObject
+ When this is NULL then an empty string is returned, regardless
+ of the value of bCreate.
+ @param bCreate
+ This flag controls for objects without user supplied name
+ whether a name is created. When a name is created then this
+ name is not stored in the object.
+ */
+ OUString GetObjectName (
+ const SdrObject* pObject,
+ const bool bCreate = true) const;
+
+ void CloseBookmarkDoc();
+
+ DECL_DLLPRIVATE_LINK(RequestingChildrenHdl, const weld::TreeIter&, bool);
+ DECL_DLLPRIVATE_LINK(SelectHdl, weld::TreeView&, void);
+ DECL_DLLPRIVATE_LINK(AsyncSelectHdl, void*, void);
+ DECL_DLLPRIVATE_LINK(RowActivatedHdl, weld::TreeView&, bool);
+ DECL_DLLPRIVATE_LINK(AsyncRowActivatedHdl, void*, void);
+ DECL_DLLPRIVATE_LINK(DragBeginHdl, bool&, bool);
+ DECL_DLLPRIVATE_LINK(KeyInputHdl, const KeyEvent&, bool);
+
+ /** Determine whether the specified page belongs to the current show
+ which is either the standard show or a custom show.
+ @param pPage
+ Pointer to the page for which to check whether it belongs to the
+ show.
+ @return
+ Returns <FALSE/> if there is no custom show or if the current
+ show does not contain the specified page at least once.
+ */
+ bool PageBelongsToCurrentShow (const SdPage* pPage) const;
+
+ bool DoDrag();
+ static void OnDragFinished();
+
+ // DragSourceHelper
+ bool StartDrag();
+
+public:
+
+ SdPageObjsTLV(std::unique_ptr<weld::TreeView> xTreeview);
+ ~SdPageObjsTLV();
+
+ void set_sensitive(bool bSensitive)
+ {
+ m_xTreeView->set_sensitive(bSensitive);
+ }
+
+ void hide()
+ {
+ m_xTreeView->hide();
+ }
+
+ void show()
+ {
+ m_xTreeView->show();
+ }
+
+ void grab_focus()
+ {
+ m_xTreeView->grab_focus();
+ }
+
+ void set_size_request(int nWidth, int nHeight)
+ {
+ m_xTreeView->set_size_request(nWidth, nHeight);
+ }
+
+ float get_approximate_digit_width() const
+ {
+ return m_xTreeView->get_approximate_digit_width();
+ }
+
+ DECL_LINK(MousePressHdl, const MouseEvent&, bool);
+ DECL_LINK(MouseReleaseHdl, const MouseEvent&, bool);
+
+ void Select();
+
+ int get_height_rows(int nRows) const
+ {
+ return m_xTreeView->get_height_rows(nRows);
+ }
+
+ void set_selection_mode(SelectionMode eMode)
+ {
+ m_eSelectionMode = eMode;
+ m_xTreeView->set_selection_mode(eMode);
+ }
+
+ SelectionMode get_selection_mode() const
+ {
+ return m_eSelectionMode;
+ }
+
+ void connect_row_activated(const Link<weld::TreeView&, bool>& rLink)
+ {
+ m_aRowActivatedHdl = rLink;
+ }
+
+ void connect_key_press(const Link<const KeyEvent&, bool>& rLink)
+ {
+ m_aKeyPressHdl = rLink;
+ }
+
+ bool HasSelectedChildren(std::u16string_view rName);
+ bool SelectEntry(std::u16string_view rName);
+
+ OUString get_selected_text() const
+ {
+ return m_xTreeView->get_selected_text();
+ }
+
+ bool get_selected() const
+ {
+ return m_xTreeView->get_selected(nullptr);
+ }
+
+ int count_selected_rows() const
+ {
+ return m_xTreeView->count_selected_rows();
+ }
+
+ void connect_changed(const Link<weld::TreeView&, void>& rLink)
+ {
+ m_aChangeHdl = rLink;
+ }
+
+ bool is_selected(const weld::TreeIter& rIter) const
+ {
+ return m_xTreeView->is_selected(rIter);
+ }
+
+ bool get_iter_first(weld::TreeIter& rIter) const
+ {
+ return m_xTreeView->get_iter_first(rIter);
+ }
+
+ std::unique_ptr<weld::TreeIter> make_iterator()
+ {
+ return m_xTreeView->make_iterator();
+ }
+
+ bool get_visible() const
+ {
+ return m_xTreeView->get_visible();
+ }
+
+ void unselect_all()
+ {
+ m_xTreeView->unselect_all();
+ }
+
+ void SetViewFrame(const SfxViewFrame* pViewFrame);
+
+ void Fill(const SdDrawDocument*, bool bAllPages, const OUString& rDocName);
+ void Fill(const SdDrawDocument*, SfxMedium* pSfxMedium, const OUString& rDocName);
+
+ void SetShowAllShapes (const bool bShowAllShapes, const bool bFill);
+ bool GetShowAllShapes() const { return m_bShowAllShapes; }
+
+ bool IsNavigationGrabsFocus() const { return m_bNavigationGrabsFocus; }
+ bool IsEqualToDoc(const SdDrawDocument* pInDoc);
+ /// Visits rList recursively and tries to advance rEntry accordingly.
+ bool IsEqualToShapeList(std::unique_ptr<weld::TreeIter>& rEntry, const SdrObjList& rList,
+ std::u16string_view rListName);
+
+ static bool IsInDrag();
+
+ /** Return the view shell that is linked to the given doc shell.
+ Call this method when the there is a chance that the doc shell
+ has been disconnected from the view shell (but not the other
+ way round.)
+ @return
+ May return <NULL/> when the link between view shell and
+ doc shell has been severed.
+ */
+ static ::sd::ViewShell* GetViewShellForDocShell (::sd::DrawDocShell &rDocShell);
+
+ /** Add one list box entry for the parent of the given shapes and one child entry for
+ each of the given shapes.
+ @param rList
+ The container of shapes that are to be inserted.
+ @param pShape
+ The parent shape or NULL when the parent is a page.
+ @param rsName
+ The name to be displayed for the new parent node.
+ @param bIsExcluded
+ Some pages can be excluded (from the show?).
+ @param pParentEntry
+ The parent entry of the new parent entry.
+ */
+ void AddShapeList (
+ const SdrObjList& rList,
+ const SdrObject* pShape,
+ const OUString& rsName,
+ const bool bIsExcluded,
+ const weld::TreeIter* pParentEntry);
+
+ /** Add the given object to a transferable object so that the object can
+ be dragged and dropped without having a name.
+ */
+ void AddShapeToTransferable (
+ SdTransferable& rTransferable,
+ const SdrObject& rObject) const;
+
+ /** return selected entries
+ nDepth == 0 -> pages
+ nDepth == 1 -> objects */
+
+ std::vector<OUString> GetSelectEntryList(const int nDepth) const;
+
+ SdDrawDocument* GetBookmarkDoc(SfxMedium* pMedium = nullptr);
+
+ bool IsLinkableSelected() const { return m_bLinkableSelected; }
+
+ void InsertEntry(const OUString &rName, const OUString &rExpander)
+ {
+ m_xTreeView->insert(nullptr, -1, &rName, nullptr, nullptr, nullptr, false, m_xScratchIter.get());
+ m_xTreeView->set_image(*m_xScratchIter, rExpander);
+ }
+
+ void InsertEntry(const weld::TreeIter* pParent, const OUString& rId, const OUString &rName, const OUString &rExpander, weld::TreeIter* pEntry = nullptr)
+ {
+ m_xTreeView->insert(pParent, -1, &rName, &rId, nullptr, nullptr, false, m_xScratchIter.get());
+ m_xTreeView->set_image(*m_xScratchIter, rExpander);
+ if (pEntry)
+ m_xTreeView->copy_iterator(*m_xScratchIter, *pEntry);
+ }
+
+ //Mark Current Entry
+ void SetSdNavigator(SdNavigatorWin* pNavigator);
+
+ void clear()
+ {
+ m_xTreeView->clear();
+ }
+
+ // nested class to implement the TransferableHelper
+ class SAL_DLLPRIVATE SdPageObjsTransferable final : public SdTransferable
+ {
+ public:
+ SdPageObjsTransferable(
+ const INetBookmark& rBookmark,
+ ::sd::DrawDocShell& rDocShell,
+ NavigatorDragType eDragType );
+ ::sd::DrawDocShell& GetDocShell() const { return mrDocShell;}
+ NavigatorDragType GetDragType() const { return meDragType;}
+
+ static const css::uno::Sequence< sal_Int8 >& getUnoTunnelId();
+ static SdPageObjsTransferable* getImplementation( const css::uno::Reference< css::uno::XInterface >& rxData ) noexcept;
+ /** Return a temporary transferable data flavor that is used
+ internally in the navigator for reordering entries. Its
+ lifetime ends with the office application.
+ */
+ static SotClipboardFormatId GetListBoxDropFormatId();
+
+ private:
+ /** Temporary drop flavor id that is used internally in the
+ navigator.
+ */
+ static SotClipboardFormatId mnListBoxDropFormatId;
+
+ INetBookmark const maBookmark;
+ ::sd::DrawDocShell& mrDocShell;
+ NavigatorDragType const meDragType;
+ virtual ~SdPageObjsTransferable() override;
+
+ virtual void AddSupportedFormats() override;
+ virtual bool GetData( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) override;
+ virtual void DragFinished( sal_Int8 nDropAction ) override;
+
+ virtual sal_Int64 SAL_CALL getSomething( const css::uno::Sequence< sal_Int8 >& rId ) override;
+ };
+
+ friend class SdPageObjsTLV::SdPageObjsTransferable;
+
+private:
+ rtl::Reference<SdPageObjsTransferable> m_xHelper;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/sdundogr.hxx b/sd/source/ui/inc/sdundogr.hxx
new file mode 100644
index 000000000..466182faf
--- /dev/null
+++ b/sd/source/ui/inc/sdundogr.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sdundo.hxx>
+#include <sddllapi.h>
+
+#include <memory>
+#include <vector>
+
+class SD_DLLPUBLIC SdUndoGroup final : public SdUndoAction
+{
+ std::vector<std::unique_ptr<SdUndoAction>> aCtn;
+public:
+ SdUndoGroup(SdDrawDocument* pSdDrawDocument)
+ : SdUndoAction(pSdDrawDocument)
+ {}
+ virtual ~SdUndoGroup() override;
+
+ virtual bool Merge( SfxUndoAction* pNextAction ) override;
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+ void AddAction(SdUndoAction* pAction);
+
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/sdxfer.hxx b/sd/source/ui/inc/sdxfer.hxx
new file mode 100644
index 000000000..5e25ba682
--- /dev/null
+++ b/sd/source/ui/inc/sdxfer.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <vcl/transfer.hxx>
+#include <vcl/vclptr.hxx>
+#include <sfx2/objsh.hxx>
+#include <svl/lstner.hxx>
+
+// SdTransferable
+class SdDrawDocument;
+class SdrObject;
+class INetBookmark;
+class ImageMap;
+class VirtualDevice;
+
+namespace sd {
+class DrawDocShell;
+class View;
+}
+
+class SAL_DLLPUBLIC_RTTI SdTransferable : public TransferDataContainer, public SfxListener
+{
+public:
+
+ SdTransferable( SdDrawDocument* pSrcDoc, ::sd::View* pWorkView, bool bInitOnGetData );
+ virtual ~SdTransferable() override;
+
+ void SetDocShell( const SfxObjectShellRef& rRef ) { maDocShellRef = rRef; }
+ const SfxObjectShellRef& GetDocShell() const { return maDocShellRef; }
+
+ void SetWorkDocument( const SdDrawDocument* pWorkDoc ) { mpSdDrawDocument = mpSdDrawDocumentIntern = const_cast<SdDrawDocument*>(pWorkDoc); }
+ const SdDrawDocument* GetWorkDocument() const { return mpSdDrawDocument; }
+
+ void SetView(const ::sd::View* pView);
+ const ::sd::View* GetView() const { return mpSdView; }
+
+ void SetObjectDescriptor( std::unique_ptr<TransferableObjectDescriptor> pObjDesc );
+
+ void SetStartPos( const Point& rStartPos ) { maStartPos = rStartPos; }
+ const Point& GetStartPos() const { return maStartPos; }
+
+ void SetInternalMove( bool bSet ) { mbInternalMove = bSet; }
+ bool IsInternalMove() const { return mbInternalMove; }
+
+ bool HasSourceDoc( const SdDrawDocument* pDoc ) const { return( mpSourceDoc == pDoc ); }
+
+ void SetPageBookmarks( std::vector<OUString>&& rPageBookmarks, bool bPersistent );
+ bool IsPageTransferable() const { return mbPageTransferable; }
+ bool HasPageBookmarks() const { return( mpPageDocShell && ( !maPageBookmarks.empty() ) ); }
+ const std::vector<OUString>& GetPageBookmarks() const { return maPageBookmarks; }
+ ::sd::DrawDocShell* GetPageDocShell() const { return mpPageDocShell; }
+
+ bool SetTableRTF( SdDrawDocument* );
+
+ static const css::uno::Sequence< sal_Int8 >& getUnoTunnelId();
+ static SdTransferable* getImplementation( const css::uno::Reference< css::uno::XInterface >& rxData ) noexcept;
+
+ // SfxListener
+ virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
+
+ virtual void DragFinished( sal_Int8 nDropAction ) override;
+ SdDrawDocument* GetSourceDoc() const { return mpSourceDoc;}
+
+ /** User data objects can be used to store information temporarily
+ at the transferable. The slide sorter uses this to store
+ previews of the slides that are referenced by the
+ transferable.
+ */
+ class UserData {public:virtual~UserData(){}};
+
+ /** Add a user data object. When it was added before (and not
+ removed) then this call is ignored.
+ */
+ void AddUserData (const std::shared_ptr<UserData>& rpData);
+
+ /** Return the number of user data objects.
+ */
+ sal_Int32 GetUserDataCount() const;
+
+ /** Return the specified user data object. When the index is not
+ valid, ie not in the range [0,count) then an empty pointer is
+ returned.
+ */
+ std::shared_ptr<UserData> GetUserData (const sal_Int32 nIndex) const;
+
+ // XUnoTunnel
+ virtual sal_Int64 SAL_CALL getSomething(const css::uno::Sequence< sal_Int8 >& rId) override;
+
+protected:
+
+ virtual void AddSupportedFormats() override;
+ virtual bool GetData( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) override;
+ virtual bool WriteObject( tools::SvRef<SotTempStream>& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, const css::datatransfer::DataFlavor& rFlavor ) override;
+ virtual void ObjectReleased() override final;
+
+private:
+
+ SfxObjectShellRef maDocShellRef;
+ ::sd::DrawDocShell* mpPageDocShell;
+ std::vector<OUString> maPageBookmarks;
+ std::unique_ptr<TransferableDataHelper> mpOLEDataHelper;
+ std::unique_ptr<TransferableObjectDescriptor> mpObjDesc;
+ const ::sd::View* mpSdView;
+ ::sd::View* mpSdViewIntern;
+ SdDrawDocument* mpSdDrawDocument;
+ SdDrawDocument* mpSdDrawDocumentIntern;
+ SdDrawDocument* mpSourceDoc;
+ VclPtr<VirtualDevice> mpVDev;
+ std::unique_ptr<INetBookmark> mpBookmark;
+ std::unique_ptr<Graphic> mpGraphic;
+ std::unique_ptr<ImageMap> mpImageMap;
+ ::tools::Rectangle maVisArea;
+ Point maStartPos;
+ bool mbInternalMove : 1;
+ bool mbOwnDocument : 1;
+ bool mbOwnView : 1;
+ bool mbLateInit : 1;
+ bool mbPageTransferable : 1;
+ bool mbPageTransferablePersistent : 1;
+ ::std::vector<std::shared_ptr<UserData> > maUserData;
+
+ SdTransferable( const SdTransferable& ) = delete;
+ SdTransferable& operator=( const SdTransferable& ) = delete;
+
+ void CreateObjectReplacement( SdrObject* pObj );
+ void CreateData();
+
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/slideshow.hxx b/sd/source/ui/inc/slideshow.hxx
new file mode 100644
index 000000000..35b93afe8
--- /dev/null
+++ b/sd/source/ui/inc/slideshow.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/presentation/XPresentation2.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+
+#include <rtl/ref.hxx>
+
+#include <tools/link.hxx>
+
+#include <comphelper/compbase.hxx>
+
+#include <editeng/unoipset.hxx>
+
+#include <memory>
+#include <sddllapi.h>
+
+namespace com::sun::star {
+ namespace drawing {
+ class XDrawPage;
+ }
+ namespace animations {
+ class XAnimationNode;
+ }
+}
+class SdDrawDocument;
+class KeyEvent;
+class OutputDevice;
+class Size;
+namespace vcl { class Window; }
+class SfxRequest;
+class WorkWindow;
+class CommandSwipeData;
+class CommandLongPressData;
+struct ImplSVEvent;
+
+// TODO: Remove
+#define PAGE_NO_END 65535
+
+/* Definition of SlideShow class */
+
+namespace sd
+{
+
+class SlideshowImpl;
+class View;
+class ViewShell;
+class ViewShellBase;
+struct PresentationSettingsEx;
+class FrameView;
+
+enum AnimationMode
+{
+ ANIMATIONMODE_SHOW,
+ ANIMATIONMODE_PREVIEW
+};
+
+typedef comphelper::WeakComponentImplHelper< css::presentation::XPresentation2, css::lang::XServiceInfo > SlideshowBase;
+
+class SlideShow final : public SlideshowBase
+{
+public:
+ /// used by the model to create a slideshow for it
+ static rtl::Reference< SlideShow > Create( SdDrawDocument* pDoc );
+
+ // static helper api
+ static rtl::Reference< SlideShow > GetSlideShow( SdDrawDocument const * pDocument );
+ static rtl::Reference< SlideShow > GetSlideShow( SdDrawDocument const & rDocument );
+ static rtl::Reference< SlideShow > GetSlideShow( ViewShellBase const & rBase );
+
+ static css::uno::Reference< css::presentation::XSlideShowController > GetSlideShowController(ViewShellBase const & rBase );
+
+ static bool StartPreview( ViewShellBase const & rBase,
+ const css::uno::Reference< css::drawing::XDrawPage >& xDrawPage,
+ const css::uno::Reference< css::animations::XAnimationNode >& xAnimationNode );
+
+ static void Stop( ViewShellBase const & rBase );
+
+ /// returns true if there is a running presentation for the given ViewShellBase
+ static bool IsRunning( ViewShellBase const & rBase );
+
+ /// returns true if there is a running presentation inside the given ViewShell
+ /// returns false even if there is a running presentation but in another ViewShell
+ static bool IsRunning( const ViewShell& rViewShell );
+
+ // helper api
+
+ void startPreview(
+ const css::uno::Reference< css::drawing::XDrawPage >& xDrawPage,
+ const css::uno::Reference< css::animations::XAnimationNode >& xAnimationNode );
+
+ // uno api
+
+ virtual void disposing(std::unique_lock<std::mutex>&) 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;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override;
+ virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override;
+ virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override;
+ virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+ virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+
+ // XPresentation
+ virtual void SAL_CALL start( ) override;
+ virtual void SAL_CALL end() override;
+ virtual void SAL_CALL rehearseTimings( ) override;
+
+ // XPresentation2
+ virtual void SAL_CALL startWithArguments(const css::uno::Sequence< css::beans::PropertyValue >& Arguments) override;
+ virtual sal_Bool SAL_CALL isRunning( ) override;
+ virtual css::uno::Reference< css::presentation::XSlideShowController > SAL_CALL getController( ) override;
+
+ // legacy api
+
+ // actions
+ void jumpToPageNumber( sal_Int32 nPage ); // a.k.a. FuSlideShow::JumpToPage()
+ void jumpToPageIndex( sal_Int32 nIndex );
+ void jumpToBookmark( const OUString& sBookmark ); // a.k.a. FuSlideShow::JumpToBookmark()
+
+ /** sets or clears the pause state of the running slideshow.
+ !!!! This should only be called by the SdShowWindow !!!!*/
+ void pause( bool bPause );
+ bool swipe(const CommandSwipeData &rSwipeData);
+ bool longpress(const CommandLongPressData& rLongPressData);
+
+ // settings
+ bool isFullScreen() const; // a.k.a. FuSlideShow::IsFullScreen()
+ OutputDevice* getShowWindow(); // a.k.a. FuSlideShow::GetShowWindow()
+ int getAnimationMode() const; // a.k.a. FuSlideShow::GetAnimationMode()
+ sal_Int32 getCurrentPageNumber() const; // a.k.a. FuSlideShow::GetCurrentPage()
+
+ // events
+ void resize( const Size &rSize );
+ // return false if the activate failed. callers should call end in response to failure
+ bool activate(ViewShellBase& rBase);
+ void deactivate();
+ void paint();
+
+ bool keyInput(const KeyEvent& rKEvt);
+
+ bool dependsOn( ViewShellBase const * pViewShellBase );
+
+ static sal_Int32 GetDisplay();
+
+ bool IsExitAfterPresenting() const;
+ void SetExitAfterPresenting(bool bExit);
+
+private:
+ SlideShow( SdDrawDocument* pDoc );
+
+ DECL_LINK( StartInPlacePresentationConfigurationHdl, void *, void );
+ void StartInPlacePresentationConfigurationCallback();
+
+ void StartInPlacePresentation();
+ void StartFullscreenPresentation();
+
+ /// @throws css::uno::RuntimeException
+ void ThrowIfDisposed() const;
+
+ void CreateController( ViewShell* pViewSh, ::sd::View* pView, vcl::Window* pParentWindow );
+ WorkWindow *GetWorkWindow();
+
+ SlideShow(const SlideShow&) = delete;
+ SlideShow& operator=( const SlideShow& ) = delete;
+
+ SvxItemPropertySet maPropSet;
+
+ rtl::Reference< SlideshowImpl > mxController;
+ /** This flag is used together with mxController.is() to prevent
+ multiple instances of the slide show for one document. The flag
+ covers the time before mxController is set.
+ */
+ bool mbIsInStartup;
+ SdDrawDocument* mpDoc;
+
+ std::shared_ptr< PresentationSettingsEx > mxCurrentSettings;
+
+ ViewShellBase* mpCurrentViewShellBase;
+ ViewShellBase* mpFullScreenViewShellBase;
+ FrameView* mpFullScreenFrameView;
+ ImplSVEvent * mnInPlaceConfigEvent;
+};
+
+namespace slideshowhelp
+{
+ SD_DLLPUBLIC void ShowSlideShow(SfxRequest const& rReq, SdDrawDocument& rDoc);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/smarttag.hxx b/sd/source/ui/inc/smarttag.hxx
new file mode 100644
index 000000000..6e27979d6
--- /dev/null
+++ b/sd/source/ui/inc/smarttag.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <helper/simplereferencecomponent.hxx>
+#include <rtl/ref.hxx>
+#include <set>
+#include <svx/svdhdl.hxx>
+#include <svx/svdview.hxx>
+
+class KeyEvent;
+class MouseEvent;
+
+namespace sd
+{
+class View;
+class SmartHdl;
+
+/** a smart tag represents a visual user interface element on the documents edit view
+ that is not part of the document. It uses derivations from SmartHdl for its visuals.
+ A SmartTag adds himself to the given view if created. It removes himself if it
+ is disposed before the view is disposed.
+
+ Derive from this class to implement your own smart tag.
+*/
+class SmartTag : public SimpleReferenceComponent
+{
+ friend class SmartTagSet;
+
+public:
+ explicit SmartTag(::sd::View& rView);
+ virtual ~SmartTag() override;
+
+ /** returns true if the SmartTag consumes this event. */
+ virtual bool MouseButtonDown(const MouseEvent&, SmartHdl&);
+
+ /** returns true if the SmartTag consumes this event. */
+ virtual bool KeyInput(const KeyEvent& rKEvt);
+
+ /** returns true if the SmartTag consumes this event. */
+ virtual bool Command(const CommandEvent& rCEvt);
+
+ /** returns true if this smart tag is currently selected */
+ bool isSelected() const { return mbSelected; }
+
+ ::sd::View& getView() const { return mrView; }
+
+protected:
+ virtual sal_Int32 GetMarkablePointCount() const;
+ virtual sal_Int32 GetMarkedPointCount() const;
+ virtual bool MarkPoint(SdrHdl& rHdl, bool bUnmark);
+ virtual void CheckPossibilities();
+ virtual bool MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark);
+
+ virtual void addCustomHandles(SdrHdlList& rHandlerList);
+ virtual void select();
+ virtual void deselect();
+ virtual bool getContext(SdrViewContext& rContext);
+
+ virtual void disposing() override;
+
+ ::sd::View& mrView;
+ bool mbSelected;
+
+private:
+ SmartTag(const SmartTag&) = delete;
+ SmartTag& operator=(const SmartTag&) = delete;
+};
+
+typedef rtl::Reference<SmartTag> SmartTagReference;
+
+/** class to administrate the available smart tags for a single view. */
+class SmartTagSet
+{
+ friend class SmartTag;
+
+public:
+ explicit SmartTagSet(::sd::View& rView);
+ ~SmartTagSet();
+
+ /** selects the given smart tag and updates all handles */
+ void select(const SmartTagReference& xTag);
+
+ /** deselects the current selected smart tag and updates all handles */
+ void deselect();
+
+ /** returns the currently selected tag or an empty reference. */
+ const SmartTagReference& getSelected() const { return mxSelectedTag; }
+
+ /** returns true if a SmartTag consumes this event. */
+ bool MouseButtonDown(const MouseEvent&);
+
+ /** returns true if a SmartTag consumes this event. */
+ bool KeyInput(const KeyEvent& rKEvt);
+
+ /** returns true if a SmartTag consumes this event. */
+ bool Command(const CommandEvent& rCEvt);
+
+ /** disposes all smart tags and clears the set */
+ void Dispose();
+
+ /** adds the handles from all smart tags to the given list */
+ void addCustomHandles(SdrHdlList& rHandlerList);
+
+ /** returns true if the currently selected smart tag has
+ a special context, returned in rContext. */
+ bool getContext(SdrViewContext& rContext) const;
+
+ // support point editing
+ bool HasMarkablePoints() const;
+ sal_uLong GetMarkablePointCount() const;
+ bool HasMarkedPoints() const;
+ sal_uLong GetMarkedPointCount() const;
+ bool MarkPoint(SdrHdl& rHdl, bool bUnmark);
+ bool MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark);
+
+ void CheckPossibilities();
+
+private:
+ SmartTagSet(const SmartTagSet&) = delete;
+ SmartTagSet& operator=(const SmartTagSet&) = delete;
+
+ /** adds a new smart tag to this set */
+ void add(const SmartTagReference& xTag);
+
+ /** removes the given smart tag from this set */
+ void remove(const SmartTagReference& xTag);
+
+ std::set<SmartTagReference> maSet;
+
+ ::sd::View& mrView;
+ SmartTagReference mxSelectedTag;
+ SmartTagReference mxMouseOverTag;
+};
+
+/** a derivation from this handle is the visual representation for a smart tag.
+ One smart tag can have more than one handle.
+*/
+class SmartHdl : public SdrHdl
+{
+public:
+ SmartHdl(const SmartTagReference& xTag, SdrObject* pObject, const Point& rPnt,
+ SdrHdlKind eNewKind);
+ SmartHdl(const SmartTagReference& xTag, const Point& rPnt, SdrHdlKind eNewKind);
+
+ const SmartTagReference& getTag() const { return mxSmartTag; }
+
+private:
+ SmartTagReference mxSmartTag;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tablefunction.hxx b/sd/source/ui/inc/tablefunction.hxx
new file mode 100644
index 000000000..fe32f16b5
--- /dev/null
+++ b/sd/source/ui/inc/tablefunction.hxx
@@ -0,0 +1,32 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <tools/stream.hxx>
+#include <drawdoc.hxx>
+
+namespace sd
+{
+void CreateTableFromRTF(SvStream& rStream, SdDrawDocument* pModel);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tabtempl.hxx b/sd/source/ui/inc/tabtempl.hxx
new file mode 100644
index 000000000..d32388d7b
--- /dev/null
+++ b/sd/source/ui/inc/tabtempl.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/styledlg.hxx>
+#include <svx/xtable.hxx>
+
+class SdrModel;
+class SfxObjectShell;
+class SdrView;
+
+/**
+ * Template-Tab-Dialog
+ */
+class SdTabTemplateDlg final : public SfxStyleDialogController
+{
+private:
+ const SfxObjectShell& rDocShell;
+ SdrView* pSdrView;
+
+ XColorListRef pColorList;
+ XGradientListRef pGradientList;
+ XHatchListRef pHatchingList;
+ XBitmapListRef pBitmapList;
+ XPatternListRef pPatternList;
+ XDashListRef pDashList;
+ XLineEndListRef pLineEndList;
+
+ virtual void PageCreated(const OString& rId, SfxTabPage &rPage) override;
+ virtual void RefreshInputSet() override;
+
+public:
+ SdTabTemplateDlg(weld::Window* pParent,
+ const SfxObjectShell* pDocShell,
+ SfxStyleSheetBase& rStyleBase,
+ SdrModel const * pModel,
+ SdrView* pView);
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/titledockwin.hxx b/sd/source/ui/inc/titledockwin.hxx
new file mode 100644
index 000000000..59e7e04b3
--- /dev/null
+++ b/sd/source/ui/inc/titledockwin.hxx
@@ -0,0 +1,94 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/dockwin.hxx>
+#include <tools/svborder.hxx>
+#include <vcl/vclptr.hxx>
+
+class ToolBox;
+
+namespace sd
+{
+ class TitledDockingWindow : public SfxDockingWindow
+ {
+ public:
+ TitledDockingWindow(
+ SfxBindings* i_pBindings, SfxChildWindow* i_pChildWindow,
+ vcl::Window* i_pParent
+ );
+
+ virtual ~TitledDockingWindow() override;
+ virtual void dispose() override;
+
+ /** sets a title to be displayed in the docking window
+ */
+ void SetTitle( const OUString& i_rTitle );
+
+ /** returns the content window, which is to be used as parent window for any content to be displayed
+ in the docking window.
+ */
+ vcl::Window& GetContentWindow() { return *m_aContentWindow; }
+ const vcl::Window& GetContentWindow() const { return *m_aContentWindow; }
+
+ /** Return the border that is painted around the inner window as
+ decoration.
+ */
+ const SvBorder& GetDecorationBorder() const { return m_aBorder; }
+
+ protected:
+ // Window overridables
+ virtual void Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& i_rArea) override;
+ virtual void Resize() override;
+ virtual void StateChanged( StateChangedType i_nType ) override;
+ virtual void DataChanged( const DataChangedEvent& i_rDataChangedEvent ) override;
+ virtual void SetText( const OUString& i_rText ) override;
+
+ virtual void ApplySettings(vcl::RenderContext& rRenderContext) override;
+ protected:
+ /** internal version of ResetToolBox
+ */
+ void impl_resetToolBox();
+
+ private:
+ DECL_LINK(OnToolboxItemSelected, ToolBox*, void);
+
+ void impl_layout();
+
+ private:
+ OUString m_sTitle;
+ VclPtr<ToolBox> m_aToolbox;
+ VclPtr<Window> m_aContentWindow;
+
+ /** The border that is painted around the inner window. The bevel
+ shadow lines are part of the border, so where the border is 0 no
+ such line is painted.
+ */
+ SvBorder m_aBorder;
+
+ /** Height of the title bar. Calculated in impl_layout().
+ */
+ int m_nTitleBarHeight;
+
+ };
+
+} // namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tmplctrl.hxx b/sd/source/ui/inc/tmplctrl.hxx
new file mode 100644
index 000000000..bdf6eed86
--- /dev/null
+++ b/sd/source/ui/inc/tmplctrl.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/.
+ *
+ * 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 .
+ */
+#pragma once
+
+#include <sfx2/stbitem.hxx>
+
+class SdTemplateControl final : public SfxStatusBarControl
+{
+public:
+ SdTemplateControl( sal_uInt16 nSlotId, sal_uInt16 nId, StatusBar& rStb );
+ virtual ~SdTemplateControl() override;
+
+ virtual void StateChangedAtStatusBarControl( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) override;
+ virtual void Paint( const UserDrawEvent& rEvt ) override;
+
+ SFX_DECL_STATUSBAR_CONTROL();
+
+private:
+ virtual void Command( const CommandEvent& rCEvt ) override;
+
+ OUString msTemplate;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tools/AsynchronousCall.hxx b/sd/source/ui/inc/tools/AsynchronousCall.hxx
new file mode 100644
index 000000000..fa4c18020
--- /dev/null
+++ b/sd/source/ui/inc/tools/AsynchronousCall.hxx
@@ -0,0 +1,77 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/timer.hxx>
+
+#include <memory>
+#include <functional>
+
+namespace sd::tools
+{
+/** Store a function object and execute it asynchronous.
+
+ The features of this class are:
+ a) It provides a wrapper around a VCL Timer so that generic function
+ objects can be used.
+ b) When more than one function objects are posted to be executed later
+ then the pending ones are erased and only the last one will actually be
+ executed.
+
+ Use this class like this:
+ aInstanceOfAsynchronousCall.Post(
+ ::std::bind(
+ ::std::mem_fun(&DrawViewShell::SwitchPage),
+ pDrawViewShell,
+ 11));
+*/
+class AsynchronousCall
+{
+public:
+ /** Create a new asynchronous call. Each object of this class processes
+ one (semantical) type of call.
+ */
+ AsynchronousCall();
+
+ ~AsynchronousCall();
+
+ /** Post a function object that is to be executed asynchronously. When
+ this method is called while the current function object has not been
+ executed then the latter is destroyed and only the given function
+ object will be executed.
+ @param rFunction
+ The function object that may be called asynchronously in the
+ near future.
+ */
+ typedef ::std::function<void()> AsynchronousFunction;
+ void Post(const AsynchronousFunction& rFunction);
+
+private:
+ Timer maTimer;
+ /** The function object that will be executed when the TimerCallback
+ function is called the next time. This pointer may be NULL.
+ */
+ ::std::unique_ptr<AsynchronousFunction> mpFunction;
+ DECL_LINK(TimerCallback, Timer*, void);
+};
+
+} // end of namespace ::sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tools/AsynchronousTask.hxx b/sd/source/ui/inc/tools/AsynchronousTask.hxx
new file mode 100644
index 000000000..696423439
--- /dev/null
+++ b/sd/source/ui/inc/tools/AsynchronousTask.hxx
@@ -0,0 +1,49 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+namespace sd::tools
+{
+/** Interface for the asynchronous execution of a task. This interface
+ allows a controller to run the task either timer based with a fixed
+ amount of time between the steps or thread based one step right after
+ the other.
+*/
+class AsynchronousTask
+{
+public:
+ /** Run the next step of the task. After HasNextStep() returns false
+ this method should ignore further calls.
+ */
+ virtual void RunNextStep() = 0;
+
+ /** Return <TRUE/> when there is at least one more step to execute.
+ When the task has been executed completely then <FALSE/> is
+ returned.
+ */
+ virtual bool HasNextStep() = 0;
+
+protected:
+ ~AsynchronousTask() {}
+};
+
+} // end of namespace ::sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tools/ConfigurationAccess.hxx b/sd/source/ui/inc/tools/ConfigurationAccess.hxx
new file mode 100644
index 000000000..b86a30fff
--- /dev/null
+++ b/sd/source/ui/inc/tools/ConfigurationAccess.hxx
@@ -0,0 +1,144 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <rtl/ustring.hxx>
+#include <com/sun/star/uno/XInterface.hpp>
+
+#include <vector>
+#include <functional>
+
+namespace com::sun::star::container { class XHierarchicalNameAccess; }
+namespace com::sun::star::container { class XNameAccess; }
+namespace com::sun::star::lang { class XMultiServiceFactory; }
+namespace com::sun::star::uno { class XComponentContext; }
+
+namespace sd::tools {
+
+/** This class gives access to the configuration. Create an object of this
+ class for one node of the configuration. This will be the root node.
+ Its children are then accessible through the new ConfigurationAccess
+ object.
+*/
+class ConfigurationAccess
+{
+public:
+ enum WriteMode { READ_WRITE, READ_ONLY };
+
+ /** Create a new object to access the configuration entries below the
+ given root.
+ @param rsRootName
+ Name of the root.
+ @param eMode
+ This flag specifies whether to give read-write or read-only
+ access.
+ */
+ ConfigurationAccess(
+ const OUString& rsRootName,
+ const WriteMode eMode);
+
+ ConfigurationAccess(
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const OUString& rsRootName,
+ const WriteMode eMode);
+
+ /** Return a configuration node below the root of the called object.
+ @param rsPathToNode
+ The relative path from the root (as given the constructor) to
+ the node.
+ @return
+ The type of the returned node varies with the requested node.
+ It is empty when the node was not found.
+ */
+ css::uno::Any GetConfigurationNode (
+ const OUString& rsPathToNode);
+
+ /** Return a configuration node below the given node.
+ @param rxNode
+ The node that acts as root to the given relative path.
+ @param rsPathToNode
+ The relative path from the given node to the requested node.
+ @return
+ The type of the returned node varies with the requested node.
+ It is empty when the node was not found.
+ */
+ static css::uno::Any GetConfigurationNode (
+ const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode,
+ const OUString& rsPathToNode);
+
+ /** Write any changes that have been made back to the configuration.
+ This call is ignored when the called ConfigurationAccess object was
+ not create with read-write mode.
+ */
+ void CommitChanges();
+
+ /** This functor is typically called for every item in a set. Its two
+ parameters are the name of key item (often of no further interest)
+ and the value of the item.
+ */
+ typedef ::std::function<void (
+ const OUString&,
+ const std::vector<css::uno::Any>&) > Functor;
+
+ /** Execute a functor for all elements of the given container.
+ @param rxContainer
+ The container is a XNameAccess to a list of the configuration.
+ This can be a node returned by GetConfigurationNode().
+ @param rArguments
+ The functor is called with arguments that are children of each
+ element of the container. The set of children is specified in this
+ list.
+ @param rFunctor
+ The functor to be executed for some or all of the elements in
+ the given container.
+ */
+ static void ForAll (
+ const css::uno::Reference<css::container::XNameAccess>& rxContainer,
+ const ::std::vector<OUString>& rArguments,
+ const Functor& rFunctor);
+
+ /** Fill a list with the string contents of all sub-elements in the given container.
+ @param rxContainer
+ The container is a XNameAccess to a list of the configuration.
+ This can be a node returned by GetConfigurationNode().
+ @param rsArgument
+ This specifies which string children of the elements in the
+ container are to be inserted into the list. The specified child
+ has to be of type string.
+ @param rList
+ The list to be filled.
+ */
+ static void FillList(
+ const css::uno::Reference<css::container::XNameAccess>& rxContainer,
+ const OUString& rsArgument,
+ ::std::vector<OUString>& rList);
+
+private:
+ css::uno::Reference<css::uno::XInterface> mxRoot;
+
+ void Initialize (
+ const css::uno::Reference<css::lang::XMultiServiceFactory>& rxProvider,
+ const OUString& rsRootName,
+ const WriteMode eMode);
+};
+
+} // end of namespace sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tools/GraphicSizeCheck.hxx b/sd/source/ui/inc/tools/GraphicSizeCheck.hxx
new file mode 100644
index 000000000..44f78e4eb
--- /dev/null
+++ b/sd/source/ui/inc/tools/GraphicSizeCheck.hxx
@@ -0,0 +1,116 @@
+/* -*- 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/.
+ *
+ */
+
+#pragma once
+
+#include <memory>
+#include <drawdoc.hxx>
+#include <svx/GenericCheckDialog.hxx>
+#include <svx/svdograf.hxx>
+
+namespace sd
+{
+/**
+ * Class responsible to check if a graphic object violates the size
+ * constraints and store the results.
+ */
+class GraphicSizeViolation final
+{
+private:
+ SdrGrafObj* m_pGraphicObject;
+
+ sal_Int32 m_nLowDPILimit = 0;
+ sal_Int32 m_nHighDPILimit = 0;
+
+ sal_Int32 m_nDPIX = 0;
+ sal_Int32 m_nDPIY = 0;
+
+public:
+ GraphicSizeViolation(sal_Int32 nDPI, SdrGrafObj* pGraphicObject);
+ bool check();
+
+ const OUString& getGraphicName();
+
+ SdrGrafObj* getObject() const { return m_pGraphicObject; }
+
+ bool isDPITooLow() { return m_nDPIX < m_nLowDPILimit || m_nDPIY < m_nLowDPILimit; }
+
+ bool isDPITooHigh() { return m_nDPIX > m_nHighDPILimit || m_nDPIY > m_nHighDPILimit; }
+
+ sal_Int32 getDPIX() { return m_nDPIX; }
+
+ sal_Int32 getDPIY() { return m_nDPIY; }
+};
+
+/**
+ * Run the graphic size checks for all the graphic objects in the DOM
+ * and store a list of violations.
+ */
+class GraphicSizeCheck final
+{
+private:
+ SdDrawDocument* m_pDocument;
+ std::vector<std::unique_ptr<GraphicSizeViolation>> m_aGraphicSizeViolationList;
+
+public:
+ GraphicSizeCheck(SdDrawDocument* pDocument)
+ : m_pDocument(pDocument)
+ {
+ }
+
+ void check();
+
+ std::vector<std::unique_ptr<GraphicSizeViolation>>& getViolationList()
+ {
+ return m_aGraphicSizeViolationList;
+ }
+};
+
+/** The UI part of the GraphicSizeViolation used by GenericCheckDialog */
+class GraphicSizeCheckGUIEntry : public svx::CheckData
+{
+private:
+ SdDrawDocument* m_pDocument;
+ std::unique_ptr<GraphicSizeViolation> m_pViolation;
+
+public:
+ GraphicSizeCheckGUIEntry(SdDrawDocument* pDocument,
+ std::unique_ptr<GraphicSizeViolation>&& pViolation)
+ : m_pDocument(pDocument)
+ , m_pViolation(std::move(pViolation))
+ {
+ }
+
+ OUString getText() override;
+
+ bool canMarkObject() override { return true; }
+
+ void markObject() override;
+
+ bool hasProperties() override { return true; }
+
+ void runProperties() override;
+};
+
+/**
+ * The UI part presenting the graphic size check results, which is
+ * used by GenericCheckDialog
+ */
+class GraphicSizeCheckGUIResult : public svx::CheckDataCollection
+{
+public:
+ GraphicSizeCheckGUIResult(SdDrawDocument* m_pDocument);
+
+ OUString getTitle() override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tools/IconCache.hxx b/sd/source/ui/inc/tools/IconCache.hxx
new file mode 100644
index 000000000..fef994764
--- /dev/null
+++ b/sd/source/ui/inc/tools/IconCache.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <tools/SdGlobalResourceContainer.hxx>
+#include <vcl/image.hxx>
+
+namespace sd
+{
+/** This simple class stores frequently used icons so that the classes that
+ use the icons do not have to store them in every one of their
+ instances.
+
+ Icons are addressed over their resource id and are loaded on demand.
+
+ This cache acts like a singleton with a lifetime equal to that of the sd
+ module.
+*/
+class IconCache final : public SdGlobalResource
+{
+public:
+ /** The lifetime of the returned reference is limited to that of the sd
+ module.
+ */
+ static IconCache& Instance();
+
+ /** Return the icon with the given resource id.
+ @return
+ The returned Image may be empty when there is no icon for the
+ given id or an error occurred. Should not happen under normal
+ circumstances.
+ */
+ Image GetIcon(const OUString& rResourceId);
+
+private:
+ class Implementation;
+ ::std::unique_ptr<Implementation> mpImpl;
+
+ /** The constructor creates the one instance of the cache and registers
+ it at the SdGlobalResourceContainer to limit is lifetime to that of
+ the sd module.
+ */
+ IconCache();
+
+ /** This destructor is called by SdGlobalResourceContainer.
+ */
+ virtual ~IconCache() override;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tools/IdleDetection.hxx b/sd/source/ui/inc/tools/IdleDetection.hxx
new file mode 100644
index 000000000..decf5ff26
--- /dev/null
+++ b/sd/source/ui/inc/tools/IdleDetection.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <o3tl/typed_flags_set.hxx>
+
+namespace vcl { class Window; }
+
+namespace sd::tools {
+ enum class IdleState {
+ /** When GetIdleState() returns this value, then the system is idle.
+ */
+ Idle = 0x0000,
+
+ /** There are system event pending.
+ */
+ SystemEventPending = 0x0001,
+
+ /** A full screen slide show is running and is active. In contrast
+ there may be a full screen show be running in an inactive window,
+ i.e. in the background.
+ */
+ FullScreenShowActive = 0x0002,
+
+ /** A slide show is running in a window.
+ */
+ WindowShowActive = 0x0004,
+
+ /** A window is being painted.
+ */
+ WindowPainting = 0x0008,
+ };
+} // end of namespace ::sd::tools
+namespace o3tl {
+ template<> struct typed_flags<::sd::tools::IdleState> : is_typed_flags<::sd::tools::IdleState, 0x0f> {};
+}
+
+namespace sd::tools {
+
+/** Detect whether the system is idle and some time consuming operation may
+ be carried out. This class distinguishes between different states of
+ idle-ness.
+*/
+class IdleDetection
+{
+public:
+ /** Determine whether the system is idle.
+ @param pWindow
+ When a valid Window pointer is given then it is checked
+ whether the window is currently being painting.
+ @return
+ This method either returns IdleState::Idle or a combination of
+ IdleStates values or-ed together that describe what the system
+ is currently doing so that the caller can decide what to do.
+ */
+ static IdleState GetIdleState (const vcl::Window* pWindow);
+
+private:
+ /** Check whether there are input events pending.
+ */
+ static IdleState CheckInputPending();
+
+ /** Check whether a slide show is running full screen or in a window.
+ */
+ static IdleState CheckSlideShowRunning();
+
+ static IdleState CheckWindowPainting (const vcl::Window& rWindow);
+};
+
+} // end of namespace ::sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tools/PropertySet.hxx b/sd/source/ui/inc/tools/PropertySet.hxx
new file mode 100644
index 000000000..c432783da
--- /dev/null
+++ b/sd/source/ui/inc/tools/PropertySet.hxx
@@ -0,0 +1,114 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <map>
+#include <memory>
+
+namespace sd::tools {
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::beans::XPropertySet
+> PropertySetInterfaceBase;
+
+/** A very simple implementation of the XPropertySet interface. It does not
+ support constrained properties and thus does not support vetoable
+ listeners. It does not support the optional property set info.
+
+ In order to use it you have to derive from this class and implement the
+ GetPropertyValue() and SetPropertyValue() methods.
+*/
+class PropertySet
+ : protected ::cppu::BaseMutex,
+ public PropertySetInterfaceBase
+{
+public:
+ explicit PropertySet();
+ virtual ~PropertySet() override;
+
+ virtual void SAL_CALL disposing() override;
+
+ // XPropertySet
+
+ virtual css::uno::Reference<css::beans::XPropertySetInfo>
+ SAL_CALL getPropertySetInfo() override;
+
+ virtual void SAL_CALL setPropertyValue (
+ const OUString& rsPropertyName,
+ const css::uno::Any& rsPropertyValue) override;
+
+ virtual css::uno::Any SAL_CALL getPropertyValue (const OUString& rsPropertyName) override;
+
+ virtual void SAL_CALL addPropertyChangeListener (
+ const OUString& rsPropertyName,
+ const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener) override;
+
+ virtual void SAL_CALL removePropertyChangeListener (
+ const OUString& rsPropertyName,
+ const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener) override;
+
+ virtual void SAL_CALL addVetoableChangeListener (
+ const OUString& rsPropertyName,
+ const css::uno::Reference<css::beans::XVetoableChangeListener>& rxListener) override;
+
+ virtual void SAL_CALL removeVetoableChangeListener (
+ const OUString& rsPropertyName,
+ const css::uno::Reference<css::beans::XVetoableChangeListener>& rxListener) override;
+
+protected:
+ /** Return the requested property value.
+ @throw css::beans::UnknownPropertyException when the
+ property is not supported.
+ */
+ virtual css::uno::Any GetPropertyValue (const OUString& rsPropertyName) = 0;
+ /** Set the given property value.
+ @return the old value.
+ @throw css::beans::UnknownPropertyException when the
+ property is not supported.
+ */
+ virtual css::uno::Any SetPropertyValue (
+ const OUString& rsPropertyName,
+ const css::uno::Any& rValue) = 0;
+
+private:
+ typedef ::std::multimap<OUString,
+ css::uno::Reference<css::beans::XPropertyChangeListener> > ChangeListenerContainer;
+ std::unique_ptr<ChangeListenerContainer> mpChangeListeners;
+
+ /** Call all listeners that are registered for the given property name.
+ Call this method with an empty property name to call listeners that
+ are registered for all properties.
+ */
+ void CallListeners (
+ const OUString& rsPropertyName,
+ const css::beans::PropertyChangeEvent& rEvent);
+
+ /** @throws css::lang::DisposedException when the object has already been
+ disposed.
+ */
+ void ThrowIfDisposed();
+};
+
+} // end of namespace ::sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tools/SdGlobalResourceContainer.hxx b/sd/source/ui/inc/tools/SdGlobalResourceContainer.hxx
new file mode 100644
index 000000000..a582ffa72
--- /dev/null
+++ b/sd/source/ui/inc/tools/SdGlobalResourceContainer.hxx
@@ -0,0 +1,105 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <sal/types.h>
+#include <o3tl/deleter.hxx>
+
+namespace com::sun::star::uno
+{
+template <class interface_type> class Reference;
+}
+namespace com::sun::star::uno
+{
+class XInterface;
+}
+
+namespace sd
+{
+class SdGlobalResource
+{
+public:
+ virtual ~SdGlobalResource() COVERITY_NOEXCEPT_FALSE{};
+};
+
+/** The purpose of this container is to hold references to resources that
+ are globally available to all interested objects and to destroy them
+ when the sd module is destroyed. Examples for resources can be
+ containers of bitmaps or the container of master pages used by the
+ MasterPagesSelector objects in the task panel.
+
+ It works like a singleton in that there is one instance per sd module.
+ Resources can be added (by themselves or their owners) to the
+ container. The main task of the container is the destruction of all
+ resources that have been added to it.
+
+ As you may note, there is no method to get a resource from the
+ container. It is the task of the resource to provide other means of
+ access to it.
+
+ The reason for this design is not to have to change the SdModule
+ destructor every time when there is a new resource. This is done by
+ reversing the dependency between module and resource: the resource knows
+ about the module--this container class to be more precisely--and tells
+ it to destroy the resource when the sd module is at the end of its
+ lifetime.
+*/
+class SdGlobalResourceContainer final
+{
+public:
+ static SdGlobalResourceContainer& Instance();
+
+ /** Add a resource to the container. The ownership of the resource is
+ transferred to the container. The resource is destroyed when the
+ container is destroyed, i.e. when the sd module is destroyed.
+
+ When in doubt, use the shared_ptr variant of this method.
+ */
+ void AddResource(::std::unique_ptr<SdGlobalResource> pResource);
+
+ /** Add a resource to the container. By using a shared_ptr and
+ releasing it only when the SgGlobalResourceContainer is destroyed
+ the given resource is kept alive at least that long. When at the
+ time of the destruction of SgGlobalResourceContainer no other
+ references exist the resource is destroyed as well.
+ */
+ void AddResource(const std::shared_ptr<SdGlobalResource>& pResource);
+
+ /** Add a resource that is implemented as UNO object. Destruction
+ (when the sd modules is unloaded) is done by a) calling dispose()
+ when the XComponent is supported and by b) releasing the reference.
+ */
+ void AddResource(const css::uno::Reference<css::uno::XInterface>& rxResource);
+
+private:
+ friend class SdGlobalResourceContainerInstance;
+ friend struct o3tl::default_delete<SdGlobalResourceContainer>;
+
+ class Implementation;
+ ::std::unique_ptr<Implementation> mpImpl;
+
+ SdGlobalResourceContainer();
+ ~SdGlobalResourceContainer();
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tools/SlotStateListener.hxx b/sd/source/ui/inc/tools/SlotStateListener.hxx
new file mode 100644
index 000000000..54a2e463d
--- /dev/null
+++ b/sd/source/ui/inc/tools/SlotStateListener.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/frame/XStatusListener.hpp>
+#include <comphelper/compbase.hxx>
+#include <tools/link.hxx>
+#include <cppuhelper/weakref.hxx>
+
+namespace com::sun::star::frame { class XDispatch; }
+namespace com::sun::star::frame { class XDispatchProvider; }
+namespace com::sun::star::frame { class XStatusListener; }
+namespace com::sun::star::frame { struct FeatureStateEvent; }
+
+namespace sd::tools {
+
+typedef comphelper::WeakComponentImplHelper<
+ css::frame::XStatusListener
+ > SlotStateListenerInterfaceBase;
+
+/** Listen for state changes of slots. This class has been created in order
+ to be informed when the support for vertical writing changes but it can
+ be used to relay state changes of other slots as well.
+*/
+class SlotStateListener final
+ : public SlotStateListenerInterfaceBase
+{
+public:
+ /** This convenience version of the constructor takes all parameters
+ that are necessary to observe a single slot. See descriptions of
+ the SetCallback(), ConnectToFrame(), and ObserveSlot() methods for
+ explanations about the parameters.
+ */
+ SlotStateListener (
+ Link<const OUString&,void> const & rCallback,
+ const css::uno::Reference<css::frame::XDispatchProvider>& rxDispatchProvider,
+ const OUString& rSlotName);
+
+ /** The constructor de-registers all remaining listeners. Usually a prior
+ dispose() call should have done that already.
+ */
+ virtual ~SlotStateListener() override;
+
+ /** Set the callback to the given value. Whenever one of the observed
+ slots changes its state this callback is informed about it.
+ Changing the callback does not release the listeners.
+ @throws DisposedException
+ */
+ void SetCallback (const Link<const OUString&,void>& rCallback);
+
+ /** Set the frame whose slots shall be observed. When an object of this
+ class is already observing slots of another frame then these
+ listeners are released first.
+ @throws DisposedException
+ */
+ void ConnectToDispatchProvider (
+ const css::uno::Reference<css::frame::XDispatchProvider>& rxDispatchProvider);
+
+ /** Observe the slot specified by the given name. Note that
+ ConnectToFrame() has to have been called earlier.
+ @param rSlotName
+ The name of the slot to observe. An example is
+ ".uno:VerticalTextState".
+ @throws DisposedException
+ */
+ void ObserveSlot (const OUString& rSlotName);
+
+ //===== frame::XStatusListener ==========================================
+
+ /** Called by slot state change broadcasters. In turn the callback is
+ informed about the state change.
+ @throws DisposedException
+ */
+ virtual void SAL_CALL
+ statusChanged (
+ const css::frame::FeatureStateEvent& rState) override;
+
+ //===== lang::XEventListener ============================================
+
+ virtual void SAL_CALL
+ disposing(const css::lang::EventObject& rEvent) override;
+
+private:
+ /** This method is called by the WeakComponentImplHelper base class in
+ reaction to a XComponent::dispose() call. It releases all currently
+ active listeners.
+ */
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ Link<const OUString&,void> maCallback;
+
+ /** Remember the URLs that describe slots whose state changes we are
+ listening to.
+ */
+ std::vector<css::util::URL> maRegisteredURLList;
+
+ css::uno::WeakReference<css::frame::XDispatchProvider> mxDispatchProviderWeak;
+
+ /** Deregister all currently active state change listeners.
+ */
+ void ReleaseListeners();
+
+ /** @throws css::lang::DisposedException when the object has already been
+ disposed.
+ */
+ void ThrowIfDisposed();
+
+ /** Transform the given string into a URL object.
+ */
+ static css::util::URL MakeURL (const OUString& rSlotName);
+
+ /** Return an XDispatch object for the given URL.
+ */
+ css::uno::Reference<css::frame::XDispatch>
+ GetDispatch (
+ const css::util::URL& rURL) const;
+};
+
+} // end of namespace ::sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tools/TimerBasedTaskExecution.hxx b/sd/source/ui/inc/tools/TimerBasedTaskExecution.hxx
new file mode 100644
index 000000000..bbff549f1
--- /dev/null
+++ b/sd/source/ui/inc/tools/TimerBasedTaskExecution.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <vcl/timer.hxx>
+
+#include <memory>
+
+namespace sd::tools {
+
+class AsynchronousTask;
+
+/** Execute an AsynchronousTask timer based, i.e. every
+ nMillisecondsBetweenSteps milliseconds as much steps are executed as fit
+ into a nMaxTimePerStep millisecond interval.
+
+ When a task is executed completely, i.e. HasNextStep() returns <FALSE/>,
+ the TimerBasedTaskExecution destroys itself. This, of course, works
+ only if the creating instance does not hold a shared_ptr to that object.
+*/
+class TimerBasedTaskExecution
+{
+public:
+ /** Create a new object of this class.
+ @param rpTask
+ The AsynchronousTask that is to be executed.
+ @param nMillisecondsBetweenSteps
+ Wait at least this long between the execution of steps. Note
+ that more than one step may be executed in succession.
+ @param nMaxTimePerStep
+ The maximal time for executing steps without yielding control.
+ */
+ static std::shared_ptr<TimerBasedTaskExecution> Create (
+ const std::shared_ptr<AsynchronousTask>& rpTask,
+ sal_uInt32 nMillisecondsBetweenSteps,
+ sal_uInt32 nMaxTimePerStep);
+
+ /** Stop the execution of the task and release the shared pointer to
+ itself so that it will eventually be destroyed.
+ */
+ void Release();
+
+ /** Convenience method that calls Release() on the given task. It
+ checks the given weak_ptr for being expired and catches bad_weak_ptr
+ exceptions.
+ */
+ static void ReleaseTask (const std::weak_ptr<TimerBasedTaskExecution>& rpTask);
+
+private:
+ std::shared_ptr<AsynchronousTask> mpTask;
+ Timer maTimer;
+ /** This shared_ptr to this is used to destroy a TimerBasedTaskExecution
+ object when its task has been executed completely.
+ */
+ std::shared_ptr<TimerBasedTaskExecution> mpSelf;
+ sal_uInt32 mnMaxTimePerStep;
+
+ TimerBasedTaskExecution (
+ const std::shared_ptr<AsynchronousTask>& rpTask,
+ sal_uInt32 nMillisecondsBetweenSteps,
+ sal_uInt32 nMaxTimePerStep);
+ ~TimerBasedTaskExecution();
+
+ class Deleter;
+ friend class Deleter;
+
+ DECL_LINK(TimerCallback, Timer *, void);
+};
+
+} // end of namespace ::sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tpaction.hxx b/sd/source/ui/inc/tpaction.hxx
new file mode 100644
index 000000000..893192d25
--- /dev/null
+++ b/sd/source/ui/inc/tpaction.hxx
@@ -0,0 +1,104 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/presentation/ClickAction.hpp>
+#include <sfx2/tabdlg.hxx>
+#include <sfx2/basedlgs.hxx>
+#include <svx/xtable.hxx>
+#include <unotools/resmgr.hxx>
+#include "sdtreelb.hxx"
+
+#include <vector>
+
+namespace sd {
+ class View;
+}
+class SdDrawDocument;
+
+/**
+ * Effect-SingleTab-Dialog
+ */
+class SdActionDlg final : public SfxSingleTabDialogController
+{
+public:
+ SdActionDlg(weld::Window* pParent, const SfxItemSet* pAttr, ::sd::View const * pView);
+};
+
+/**
+ * Interaction-Tab-Page
+ */
+class SdTPAction final : public SfxTabPage
+{
+private:
+ const ::sd::View* mpView;
+ SdDrawDocument* mpDoc;
+ XColorListRef pColList;
+
+ bool bTreeUpdated;
+ std::vector<css::presentation::ClickAction> maCurrentActions;
+ OUString aLastFile;
+ ::std::vector< tools::Long > aVerbVector;
+
+ std::unique_ptr<weld::ComboBox> m_xLbAction;
+ std::unique_ptr<weld::Label> m_xFtTree; // jump destination controls
+ std::unique_ptr<SdPageObjsTLV> m_xLbTree;
+ std::unique_ptr<SdPageObjsTLV> m_xLbTreeDocument;
+ std::unique_ptr<weld::TreeView> m_xLbOLEAction;
+ std::unique_ptr<weld::Frame> m_xFrame;
+ std::unique_ptr<weld::Entry> m_xEdtSound;
+ std::unique_ptr<weld::Entry> m_xEdtBookmark;
+ std::unique_ptr<weld::Entry> m_xEdtDocument;
+ std::unique_ptr<weld::Entry> m_xEdtProgram;
+ std::unique_ptr<weld::Entry> m_xEdtMacro;
+ std::unique_ptr<weld::Button> m_xBtnSearch;
+ std::unique_ptr<weld::Button> m_xBtnSeek;
+
+ DECL_LINK( ClickSearchHdl, weld::Button&, void );
+ DECL_LINK( ClickActionHdl, weld::ComboBox&, void );
+ DECL_LINK( SelectTreeHdl, weld::TreeView&, void );
+ DECL_LINK( CheckFileHdl, weld::Widget&, void );
+
+ void UpdateTree();
+ void OpenFileDialog();
+ css::presentation::ClickAction GetActualClickAction();
+ void SetActualClickAction( css::presentation::ClickAction eCA );
+ void SetEditText( OUString const & rStr );
+ OUString GetEditText( bool bURL = false );
+public:
+ SD_DLLPUBLIC static TranslateId GetClickActionSdResId(css::presentation::ClickAction eCA);
+
+ SdTPAction(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs);
+ virtual ~SdTPAction() override;
+
+ static std::unique_ptr<SfxTabPage> Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& );
+
+ virtual bool FillItemSet( SfxItemSet* ) override;
+ virtual void Reset( const SfxItemSet * ) override;
+
+ virtual void ActivatePage( const SfxItemSet& rSet ) override;
+ virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override;
+
+ void Construct();
+
+ void SetView( const ::sd::View* pSdView );
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/tpoption.hxx b/sd/source/ui/inc/tpoption.hxx
new file mode 100644
index 000000000..8657db27a
--- /dev/null
+++ b/sd/source/ui/inc/tpoption.hxx
@@ -0,0 +1,144 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/tabdlg.hxx>
+#include <svx/optgrid.hxx>
+
+/**
+ * Option-Tab-Page: Snap
+ */
+class SdTpOptionsSnap final : public SvxGridTabPage
+{
+public:
+ SdTpOptionsSnap(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs);
+ static std::unique_ptr<SfxTabPage> Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* );
+ virtual ~SdTpOptionsSnap() override;
+
+ virtual bool FillItemSet( SfxItemSet* ) override;
+ virtual void Reset( const SfxItemSet * ) override;
+};
+
+/**
+ * Option-Tab-Page: Contents
+ */
+class SdTpOptionsContents final : public SfxTabPage
+{
+private:
+ std::unique_ptr<weld::CheckButton> m_xCbxRuler;
+ std::unique_ptr<weld::CheckButton> m_xCbxDragStripes;
+ std::unique_ptr<weld::CheckButton> m_xCbxHandlesBezier;
+ std::unique_ptr<weld::CheckButton> m_xCbxMoveOutline;
+
+public:
+ SdTpOptionsContents(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs);
+ static std::unique_ptr<SfxTabPage> Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* );
+ virtual ~SdTpOptionsContents() override;
+
+ virtual bool FillItemSet( SfxItemSet* ) override;
+ virtual void Reset( const SfxItemSet * ) override;
+};
+
+/**
+ * Option-Tab-Page: View
+ */
+
+class SdTpOptionsMisc final : public SfxTabPage
+{
+ friend class SdModule;
+
+private:
+ sal_uInt32 nWidth;
+ sal_uInt32 nHeight;
+ OUString aInfo1;
+ OUString aInfo2;
+
+ MapUnit ePoolUnit;
+
+ std::unique_ptr<weld::CheckButton> m_xCbxQuickEdit;
+ std::unique_ptr<weld::CheckButton> m_xCbxPickThrough;
+
+ std::unique_ptr<weld::Frame> m_xNewDocumentFrame;
+ std::unique_ptr<weld::CheckButton> m_xCbxStartWithTemplate;
+
+ std::unique_ptr<weld::CheckButton> m_xCbxMasterPageCache;
+ std::unique_ptr<weld::CheckButton> m_xCbxCopy;
+ std::unique_ptr<weld::CheckButton> m_xCbxMarkedHitMovesAlways;
+ std::unique_ptr<weld::Frame> m_xPresentationFrame;
+
+ std::unique_ptr<weld::ComboBox> m_xLbMetric;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtrFldTabstop;
+
+ std::unique_ptr<weld::CheckButton> m_xCbxEnableSdremote;
+ std::unique_ptr<weld::CheckButton> m_xCbxEnablePresenterScreen;
+ std::unique_ptr<weld::CheckButton> m_xCbxUsePrinterMetrics;
+ std::unique_ptr<weld::CheckButton> m_xCbxCompatibility;
+
+ //Scale
+ std::unique_ptr<weld::Frame> m_xScaleFrame;
+ std::unique_ptr<weld::ComboBox> m_xCbScale;
+ std::unique_ptr<weld::Label> m_xNewDocLb;
+ std::unique_ptr<weld::Label> m_xFiInfo1;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtrFldOriginalWidth;
+ std::unique_ptr<weld::Label> m_xWidthLb;
+ std::unique_ptr<weld::Label> m_xHeightLb;
+ std::unique_ptr<weld::Label> m_xFiInfo2;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtrFldOriginalHeight;
+ std::unique_ptr<weld::CheckButton> m_xCbxDistort;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtrFldInfo1;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtrFldInfo2;
+
+ static OUString GetScale( sal_Int32 nX, sal_Int32 nY );
+ static bool SetScale( std::u16string_view aScale, sal_Int32& rX, sal_Int32& rY );
+
+ DECL_LINK( SelectMetricHdl_Impl, weld::ComboBox&, void );
+
+ /** Enable or disable the controls in the compatibility section of the
+ 'general' tab page depending on whether there is at least one
+ document.
+ */
+ void UpdateCompatibilityControls();
+
+ virtual void ActivatePage( const SfxItemSet& rSet ) override;
+ virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override;
+
+public:
+ SdTpOptionsMisc(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs);
+ static std::unique_ptr<SfxTabPage> Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* );
+ virtual ~SdTpOptionsMisc() override;
+
+ virtual bool FillItemSet( SfxItemSet* ) override;
+ virtual void Reset( const SfxItemSet * ) override;
+
+ /** Hide Impress specific controls, make Draw specific controls visible
+ and arrange the visible controls. Do not call this method or the
+ <member>SetImpressMode()</member> method more than once.
+ */
+ void SetDrawMode();
+
+ /** Hide Draw specific controls, make Impress specific controls visible
+ and arrange the visible controls. Do not call this method or the
+ <member>SetDrawMode()</member> method more than once.
+ */
+ void SetImpressMode();
+ virtual void PageCreated(const SfxAllItemSet& aSet) override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/uiobject.hxx b/sd/source/ui/inc/uiobject.hxx
new file mode 100644
index 000000000..06cb6105f
--- /dev/null
+++ b/sd/source/ui/inc/uiobject.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/.
+ */
+
+#include <memory>
+#include <vcl/uitest/uiobject.hxx>
+#include "Window.hxx"
+
+class ImpressWindowUIObject final : public WindowUIObject
+{
+public:
+ ImpressWindowUIObject(const VclPtr<sd::Window>& xWindow);
+
+ virtual StringMap get_state() override;
+
+ virtual void execute(const OUString& rAction, const StringMap& rParameters) override;
+
+ virtual std::unique_ptr<UIObject> get_child(const OUString& rID) override;
+
+ virtual std::set<OUString> get_children() const override;
+
+ static std::unique_ptr<UIObject> create(vcl::Window* pWindow);
+
+private:
+ virtual OUString get_name() const override;
+
+ VclPtr<sd::Window> mxWindow;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/unchss.hxx b/sd/source/ui/inc/unchss.hxx
new file mode 100644
index 000000000..7c3845f8b
--- /dev/null
+++ b/sd/source/ui/inc/unchss.hxx
@@ -0,0 +1,47 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+
+#include <svl/itemset.hxx>
+
+#include <sdundo.hxx>
+
+class SfxItemSet;
+class SfxStyleSheet;
+class SdDrawDocument;
+
+class StyleSheetUndoAction final : public SdUndoAction
+{
+ SfxStyleSheet* mpStyleSheet;
+
+ std::unique_ptr<SfxItemSet> mpNewSet;
+ std::unique_ptr<SfxItemSet> mpOldSet;
+
+public:
+ StyleSheetUndoAction(SdDrawDocument* pTheDoc, SfxStyleSheet* pTheStyleSheet,
+ const SfxItemSet* pTheNewItemSet);
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/undoback.hxx b/sd/source/ui/inc/undoback.hxx
new file mode 100644
index 000000000..afbb13eca
--- /dev/null
+++ b/sd/source/ui/inc/undoback.hxx
@@ -0,0 +1,58 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+
+#include <sdundo.hxx>
+
+#include <svl/itemset.hxx>
+
+class SdDrawDocument;
+class SdPage;
+class SfxItemSet;
+class SfxPoolItem;
+
+class SdBackgroundObjUndoAction final : public SdUndoAction
+{
+private:
+
+ SdPage& mrPage;
+ std::unique_ptr<SfxItemSet> mpItemSet;
+ std::unique_ptr<SfxPoolItem> mpFillBitmapItem;
+ bool mbHasFillBitmap;
+
+ void ImplRestoreBackgroundObj();
+ void saveFillBitmap(SfxItemSet &rItemSet);
+ void restoreFillBitmap(SfxItemSet &rItemSet);
+
+public:
+ SdBackgroundObjUndoAction(
+ SdDrawDocument& rDoc,
+ SdPage& rPage,
+ const SfxItemSet& rItemSet);
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+ virtual SdUndoAction* Clone() const override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/undoheaderfooter.hxx b/sd/source/ui/inc/undoheaderfooter.hxx
new file mode 100644
index 000000000..2c8c9c8e9
--- /dev/null
+++ b/sd/source/ui/inc/undoheaderfooter.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sdundo.hxx>
+#include <sdpage.hxx>
+#include <sddllapi.h>
+
+class SdDrawDocument;
+
+/************************************************************************/
+
+class SD_DLLPUBLIC SdHeaderFooterUndoAction final : public SdUndoAction
+{
+ SdPage* mpPage;
+
+ const sd::HeaderFooterSettings maOldSettings;
+ const sd::HeaderFooterSettings maNewSettings;
+
+public:
+ SdHeaderFooterUndoAction( SdDrawDocument* pDoc, SdPage* pPage, const sd::HeaderFooterSettings& rNewSettings );
+ virtual ~SdHeaderFooterUndoAction() override;
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/undolayer.hxx b/sd/source/ui/inc/undolayer.hxx
new file mode 100644
index 000000000..431f60d4f
--- /dev/null
+++ b/sd/source/ui/inc/undolayer.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sdundo.hxx>
+
+class SdDrawDocument;
+class SdrLayer;
+
+/************************************************************************/
+
+class SdLayerModifyUndoAction final : public SdUndoAction
+{
+
+public:
+ SdLayerModifyUndoAction( SdDrawDocument* _pDoc, SdrLayer* pLayer,
+ const OUString& rOldLayerName, const OUString& rOldLayerTitle, const OUString& rOldLayerDesc, bool bOldIsVisible, bool bOldIsLocked, bool bOldIsPrintable,
+ const OUString& rNewLayerName, const OUString& rNewLayerTitle, const OUString& rNewLayerDesc, bool bNewIsVisible, bool bNewIsLocked, bool bNewIsPrintable );
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+private:
+ SdrLayer* mpLayer;
+ OUString maOldLayerName;
+ OUString maOldLayerTitle;
+ OUString maOldLayerDesc;
+ bool mbOldIsVisible;
+ bool mbOldIsLocked;
+ bool mbOldIsPrintable;
+ OUString maNewLayerName;
+ OUString maNewLayerTitle;
+ OUString maNewLayerDesc;
+ bool mbNewIsVisible;
+ bool mbNewIsLocked;
+ bool mbNewIsPrintable;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/undopage.hxx b/sd/source/ui/inc/undopage.hxx
new file mode 100644
index 000000000..87d5b5b21
--- /dev/null
+++ b/sd/source/ui/inc/undopage.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <tools/gen.hxx>
+#include <vcl/prntypes.hxx>
+
+#include <sdundo.hxx>
+
+class SdDrawDocument;
+class SdPage;
+
+/************************************************************************/
+
+class SdPageFormatUndoAction final : public SdUndoAction
+{
+ SdPage* mpPage;
+
+ Size maOldSize;
+ sal_Int32 mnOldLeft;
+ sal_Int32 mnOldRight;
+ sal_Int32 mnOldUpper;
+ sal_Int32 mnOldLower;
+ Orientation meOldOrientation;
+ sal_uInt16 mnOldPaperBin;
+ bool mbOldFullSize;
+
+ Size maNewSize;
+ sal_Int32 mnNewLeft;
+ sal_Int32 mnNewRight;
+ sal_Int32 mnNewUpper;
+ sal_Int32 mnNewLower;
+ bool mbNewScale;
+ Orientation meNewOrientation;
+ sal_uInt16 mnNewPaperBin;
+ bool mbNewFullSize;
+
+public:
+ SdPageFormatUndoAction( SdDrawDocument* pDoc,
+ SdPage* pThePage,
+ const Size& rOldSz,
+ sal_Int32 nOldLft,
+ sal_Int32 nOldRgt,
+ sal_Int32 nOldUpr,
+ sal_Int32 nOldLwr,
+ Orientation eOldOrient,
+ sal_uInt16 nOPaperBin,
+ bool bOFullSize,
+
+ const Size& rNewSz,
+ sal_Int32 nNewLft,
+ sal_Int32 nNewRgt,
+ sal_Int32 nNewUpr,
+ sal_Int32 nNewLwr,
+ bool bNewScl,
+ Orientation eNewOrient,
+ sal_uInt16 nNPaperBin,
+ bool bNFullSize
+ ) :
+ SdUndoAction(pDoc),
+ mpPage (pThePage),
+ maOldSize (rOldSz),
+ mnOldLeft (nOldLft),
+ mnOldRight (nOldRgt),
+ mnOldUpper (nOldUpr),
+ mnOldLower (nOldLwr),
+ meOldOrientation(eOldOrient),
+ mnOldPaperBin (nOPaperBin),
+ mbOldFullSize (bOFullSize),
+
+ maNewSize (rNewSz),
+ mnNewLeft (nNewLft),
+ mnNewRight (nNewRgt),
+ mnNewUpper (nNewUpr),
+ mnNewLower (nNewLwr),
+ mbNewScale (bNewScl),
+ meNewOrientation(eNewOrient),
+ mnNewPaperBin (nNPaperBin),
+ mbNewFullSize (bNFullSize)
+
+ {}
+ virtual ~SdPageFormatUndoAction() override;
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+};
+
+/************************************************************************/
+
+class SdPageLRUndoAction final : public SdUndoAction
+{
+ SdPage* mpPage;
+
+ sal_Int32 mnOldLeft;
+ sal_Int32 mnOldRight;
+ sal_Int32 mnNewLeft;
+ sal_Int32 mnNewRight;
+
+public:
+ SdPageLRUndoAction( SdDrawDocument* pDoc, SdPage* pThePage,
+ sal_Int32 nOldLft, sal_Int32 nOldRgt,
+ sal_Int32 nNewLft, sal_Int32 nNewRgt ) :
+ SdUndoAction(pDoc),
+ mpPage (pThePage),
+ mnOldLeft (nOldLft),
+ mnOldRight (nOldRgt),
+ mnNewLeft (nNewLft),
+ mnNewRight (nNewRgt)
+ {}
+ virtual ~SdPageLRUndoAction() override;
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+};
+
+/************************************************************************/
+
+class SdPageULUndoAction final : public SdUndoAction
+{
+ SdPage* mpPage;
+
+ sal_Int32 mnOldUpper;
+ sal_Int32 mnOldLower;
+ sal_Int32 mnNewUpper;
+ sal_Int32 mnNewLower;
+
+public:
+ SdPageULUndoAction( SdDrawDocument* pDoc, SdPage* pThePage,
+ sal_Int32 nOldUpr, sal_Int32 nOldLwr,
+ sal_Int32 nNewUpr, sal_Int32 nNewLwr ) :
+ SdUndoAction(pDoc),
+ mpPage (pThePage),
+ mnOldUpper (nOldUpr),
+ mnOldLower (nOldLwr),
+ mnNewUpper (nNewUpr),
+ mnNewLower (nNewLwr)
+ {}
+ virtual ~SdPageULUndoAction() override;
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/unmodpg.hxx b/sd/source/ui/inc/unmodpg.hxx
new file mode 100644
index 000000000..9248642bf
--- /dev/null
+++ b/sd/source/ui/inc/unmodpg.hxx
@@ -0,0 +1,74 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <xmloff/autolayout.hxx>
+
+#include <sdundo.hxx>
+
+class SdDrawDocument;
+class SdPage;
+
+class ModifyPageUndoAction final : public SdUndoAction
+{
+ SdPage* mpPage;
+ OUString maOldName;
+ OUString maNewName;
+ AutoLayout meOldAutoLayout;
+ AutoLayout meNewAutoLayout;
+ bool mbOldBckgrndVisible;
+ bool mbNewBckgrndVisible;
+ bool mbOldBckgrndObjsVisible;
+ bool mbNewBckgrndObjsVisible;
+
+public:
+ ModifyPageUndoAction(
+ SdDrawDocument* pTheDoc,
+ SdPage* pThePage,
+ const OUString& aTheNewName,
+ AutoLayout eTheNewAutoLayout,
+ bool bTheNewBckgrndVisible,
+ bool bTheNewBckgrndObjsVisible);
+
+ virtual ~ModifyPageUndoAction() override;
+ virtual void Undo() override;
+ virtual void Redo() override;
+};
+
+class RenameLayoutTemplateUndoAction final : public SdUndoAction
+{
+public:
+ RenameLayoutTemplateUndoAction(
+ SdDrawDocument* pDocument,
+ const OUString& rOldLayoutName,
+ const OUString& rNewLayoutName);
+
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+ virtual OUString GetComment() const override;
+
+private:
+ OUString maOldName;
+ OUString maNewName;
+ const OUString maComment;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/unmovss.hxx b/sd/source/ui/inc/unmovss.hxx
new file mode 100644
index 000000000..93e87cd40
--- /dev/null
+++ b/sd/source/ui/inc/unmovss.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 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 .
+ */
+
+#pragma once
+
+#include <sdundo.hxx>
+#include <stlsheet.hxx>
+#include <vector>
+
+class SdDrawDocument;
+
+class SdMoveStyleSheetsUndoAction final : public SdUndoAction
+{
+ StyleSheetCopyResultVector maStyles;
+ std::vector< SdStyleSheetVector > maListOfChildLists;
+ bool mbMySheets;
+
+public:
+ SdMoveStyleSheetsUndoAction(SdDrawDocument* pTheDoc, StyleSheetCopyResultVector& rTheStyles, bool bInserted);
+
+ virtual ~SdMoveStyleSheetsUndoAction() override;
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+ virtual OUString GetComment() const override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/unoaprms.hxx b/sd/source/ui/inc/unoaprms.hxx
new file mode 100644
index 000000000..9ad327668
--- /dev/null
+++ b/sd/source/ui/inc/unoaprms.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/presentation/AnimationEffect.hpp>
+#include <com/sun/star/presentation/AnimationSpeed.hpp>
+#include <com/sun/star/presentation/ClickAction.hpp>
+#include <sdundo.hxx>
+#include <tools/color.hxx>
+
+class SdDrawDocument;
+class SdrObject;
+
+class SdAnimationPrmsUndoAction final : public SdUndoAction
+{
+ SdrObject* pObject;
+ bool bOldActive;
+ bool bNewActive;
+ bool bOldDimPrevious;
+ bool bNewDimPrevious;
+ bool bOldDimHide;
+ bool bNewDimHide;
+ bool bOldSoundOn;
+ bool bNewSoundOn;
+ bool bOldSecondSoundOn;
+ bool bNewSecondSoundOn;
+ bool bOldPlayFull;
+ bool bNewPlayFull;
+ bool bOldSecondPlayFull;
+ bool bNewSecondPlayFull;
+ css::presentation::AnimationEffect eOldEffect;
+ css::presentation::AnimationEffect eNewEffect;
+ css::presentation::AnimationEffect eOldTextEffect;
+ css::presentation::AnimationEffect eNewTextEffect;
+ css::presentation::AnimationSpeed eOldSpeed;
+ css::presentation::AnimationSpeed eNewSpeed;
+ css::presentation::AnimationEffect eOldSecondEffect;
+ css::presentation::AnimationEffect eNewSecondEffect;
+ css::presentation::AnimationSpeed eOldSecondSpeed;
+ css::presentation::AnimationSpeed eNewSecondSpeed;
+ Color aOldDimColor;
+ Color aNewDimColor;
+ OUString aOldSoundFile;
+ OUString aNewSoundFile;
+ css::presentation::ClickAction eOldClickAction;
+ css::presentation::ClickAction eNewClickAction;
+ OUString aOldBookmark;
+ OUString aNewBookmark;
+ sal_uInt16 nOldVerb;
+ sal_uInt16 nNewVerb;
+
+ bool bInfoCreated;
+
+public:
+ SdAnimationPrmsUndoAction(SdDrawDocument* pTheDoc, SdrObject* pObj,
+ bool bCreated)
+ : SdUndoAction(pTheDoc)
+ , pObject(pObj)
+ , bOldActive(false)
+ , bNewActive(false)
+ , bOldDimPrevious(false)
+ , bNewDimPrevious(false)
+ , bOldDimHide(false)
+ , bNewDimHide(false)
+ , bOldSoundOn(false)
+ , bNewSoundOn(false)
+ , bOldSecondSoundOn(false)
+ , bNewSecondSoundOn(false)
+ , bOldPlayFull(false)
+ , bNewPlayFull(false)
+ , bOldSecondPlayFull(false)
+ , bNewSecondPlayFull(false)
+ , eOldEffect(css::presentation::AnimationEffect_NONE)
+ , eNewEffect(css::presentation::AnimationEffect_NONE)
+ , eOldTextEffect(css::presentation::AnimationEffect_NONE)
+ , eNewTextEffect(css::presentation::AnimationEffect_NONE)
+ , eOldSpeed(css::presentation::AnimationSpeed_SLOW)
+ , eNewSpeed(css::presentation::AnimationSpeed_SLOW)
+ , eOldSecondEffect(css::presentation::AnimationEffect_NONE)
+ , eNewSecondEffect(css::presentation::AnimationEffect_NONE)
+ , eOldSecondSpeed(css::presentation::AnimationSpeed_SLOW)
+ , eNewSecondSpeed(css::presentation::AnimationSpeed_SLOW)
+ , eOldClickAction(css::presentation::ClickAction_NONE)
+ , eNewClickAction(css::presentation::ClickAction_NONE)
+ , nOldVerb(0)
+ , nNewVerb(0)
+ , bInfoCreated(bCreated)
+ {
+ }
+
+ void SetActive(bool bTheOldActive, bool bTheNewActive)
+ { bOldActive = bTheOldActive; bNewActive = bTheNewActive; }
+ void SetEffect(css::presentation::AnimationEffect eTheOldEffect, css::presentation::AnimationEffect eTheNewEffect)
+ { eOldEffect = eTheOldEffect; eNewEffect = eTheNewEffect; }
+ void SetTextEffect(css::presentation::AnimationEffect eTheOldEffect, css::presentation::AnimationEffect eTheNewEffect)
+ { eOldTextEffect = eTheOldEffect; eNewTextEffect = eTheNewEffect; }
+ void SetSpeed(css::presentation::AnimationSpeed eTheOldSpeed, css::presentation::AnimationSpeed eTheNewSpeed)
+ { eOldSpeed = eTheOldSpeed; eNewSpeed = eTheNewSpeed; }
+ void SetDim(bool bTheOldDim, bool bTheNewDim)
+ { bOldDimPrevious = bTheOldDim; bNewDimPrevious = bTheNewDim; }
+ void SetDimColor(Color aTheOldDimColor, Color aTheNewDimColor)
+ { aOldDimColor = aTheOldDimColor; aNewDimColor = aTheNewDimColor; }
+ void SetDimHide(bool bTheOldDimHide, bool bTheNewDimHide)
+ { bOldDimHide = bTheOldDimHide; bNewDimHide = bTheNewDimHide; }
+ void SetSoundOn(bool bTheOldSoundOn, bool bTheNewSoundOn)
+ { bOldSoundOn = bTheOldSoundOn; bNewSoundOn = bTheNewSoundOn; }
+ void SetSound(const OUString& aTheOldSound, const OUString& aTheNewSound)
+ { aOldSoundFile = aTheOldSound; aNewSoundFile = aTheNewSound; }
+ void SetPlayFull(bool bTheOldPlayFull, bool bTheNewPlayFull)
+ { bOldPlayFull = bTheOldPlayFull; bNewPlayFull = bTheNewPlayFull; }
+ void SetClickAction(css::presentation::ClickAction eTheOldAction, css::presentation::ClickAction eTheNewAction)
+ { eOldClickAction = eTheOldAction; eNewClickAction = eTheNewAction; }
+ void SetBookmark(const OUString& aTheOldBookmark, const OUString& aTheNewBookmark)
+ { aOldBookmark = aTheOldBookmark; aNewBookmark = aTheNewBookmark; }
+ void SetVerb(sal_uInt16 nTheOldVerb, sal_uInt16 nTheNewVerb)
+ { nOldVerb = nTheOldVerb; nNewVerb = nTheNewVerb; }
+ void SetSecondEffect(css::presentation::AnimationEffect eTheOldEffect, css::presentation::AnimationEffect eTheNewEffect)
+ { eOldSecondEffect = eTheOldEffect; eNewSecondEffect = eTheNewEffect; }
+ void SetSecondSpeed(css::presentation::AnimationSpeed eTheOldSpeed, css::presentation::AnimationSpeed eTheNewSpeed)
+ { eOldSecondSpeed = eTheOldSpeed; eNewSecondSpeed = eTheNewSpeed; }
+ void SetSecondSoundOn(bool bTheOldSoundOn, bool bTheNewSoundOn)
+ { bOldSecondSoundOn = bTheOldSoundOn; bNewSecondSoundOn = bTheNewSoundOn; }
+ void SetSecondPlayFull(bool bTheOldPlayFull, bool bTheNewPlayFull)
+ { bOldSecondPlayFull = bTheOldPlayFull; bNewSecondPlayFull = bTheNewPlayFull; }
+
+ virtual ~SdAnimationPrmsUndoAction() override;
+ virtual void Undo() override;
+ virtual void Redo() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/unokywds.hxx b/sd/source/ui/inc/unokywds.hxx
new file mode 100644
index 000000000..37a03d3d6
--- /dev/null
+++ b/sd/source/ui/inc/unokywds.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+#include <rtl/ustring.hxx>
+
+// SdUnoPseudoStyleFamily
+inline constexpr OUStringLiteral sUNO_PseudoSheet_Background = u"background";
+
+// SdLayer
+inline constexpr OUStringLiteral sUNO_LayerName_background = u"background";
+inline constexpr OUStringLiteral sUNO_LayerName_background_objects = u"backgroundobjects";
+inline constexpr OUStringLiteral sUNO_LayerName_layout = u"layout";
+inline constexpr OUStringLiteral sUNO_LayerName_controls = u"controls";
+inline constexpr OUStringLiteral sUNO_LayerName_measurelines = u"measurelines";
+
+// services
+inline constexpr OUStringLiteral sUNO_Service_FillProperties
+ = u"com.sun.star.drawing.FillProperties";
+inline constexpr OUStringLiteral sUNO_Service_PageBackground
+ = u"com.sun.star.drawing.PageBackground";
+inline constexpr OUStringLiteral sUNO_Service_ImageMapRectangleObject
+ = u"com.sun.star.image.ImageMapRectangleObject";
+inline constexpr OUStringLiteral sUNO_Service_ImageMapCircleObject
+ = u"com.sun.star.image.ImageMapCircleObject";
+inline constexpr OUStringLiteral sUNO_Service_ImageMapPolygonObject
+ = u"com.sun.star.image.ImageMapPolygonObject";
+
+// properties
+inline constexpr OUStringLiteral sUNO_Prop_ForbiddenCharacters = u"ForbiddenCharacters";
+inline constexpr OUStringLiteral sUNO_Prop_MapUnit = u"MapUnit";
+inline constexpr OUStringLiteral sUNO_Prop_VisibleArea = u"VisibleArea";
+inline constexpr OUStringLiteral sUNO_Prop_TabStop = u"TabStop";
+inline constexpr OUStringLiteral sUNO_Prop_CharLocale = u"CharLocale";
+inline constexpr OUStringLiteral sUNO_Prop_AutomContFocus = u"AutomaticControlFocus";
+inline constexpr OUStringLiteral sUNO_Prop_ApplyFrmDsgnMode = u"ApplyFormDesignMode";
+inline constexpr OUStringLiteral sUNO_Prop_IsBackgroundVisible = u"IsBackgroundVisible";
+inline constexpr OUStringLiteral sUNO_Prop_IsBackgroundObjectsVisible
+ = u"IsBackgroundObjectsVisible";
+inline constexpr OUStringLiteral sUNO_Prop_UserDefinedAttributes = u"UserDefinedAttributes";
+inline constexpr OUStringLiteral sUNO_Prop_BookmarkURL = u"BookmarkURL";
+inline constexpr OUStringLiteral sUNO_Prop_RuntimeUID = u"RuntimeUID";
+inline constexpr OUStringLiteral sUNO_Prop_HasValidSignatures = u"HasValidSignatures";
+inline constexpr OUStringLiteral sUNO_Prop_InteropGrabBag = u"InteropGrabBag";
+inline constexpr OUStringLiteral sUNO_Prop_Theme = u"Theme";
+
+// view settings
+inline constexpr OUStringLiteral sUNO_View_ViewId = u"ViewId";
+inline constexpr OUStringLiteral sUNO_View_SnapLinesDrawing = u"SnapLinesDrawing";
+inline constexpr OUStringLiteral sUNO_View_SnapLinesNotes = u"SnapLinesNotes";
+inline constexpr OUStringLiteral sUNO_View_SnapLinesHandout = u"SnapLinesHandout";
+inline constexpr OUStringLiteral sUNO_View_RulerIsVisible = u"RulerIsVisible";
+inline constexpr OUStringLiteral sUNO_View_PageKind = u"PageKind";
+inline constexpr OUStringLiteral sUNO_View_SelectedPage = u"SelectedPage";
+inline constexpr OUStringLiteral sUNO_View_IsLayerMode = u"IsLayerMode";
+inline constexpr OUStringLiteral sUNO_View_IsDoubleClickTextEdit = u"IsDoubleClickTextEdit";
+inline constexpr OUStringLiteral sUNO_View_IsClickChangeRotation = u"IsClickChangeRotation";
+inline constexpr OUStringLiteral sUNO_View_SlidesPerRow = u"SlidesPerRow";
+inline constexpr OUStringLiteral sUNO_View_EditMode = u"EditMode";
+inline const char sUNO_View_EditModeStandard[] = "EditModeStandard"; // To be deprecated
+// inline const char sUNO_View_EditModeNotes[] = "EditModeNotes";
+// inline const char sUNO_View_EditModeHandout[] = "EditModeHandout";
+
+inline constexpr OUStringLiteral sUNO_View_GridIsVisible = u"GridIsVisible";
+inline constexpr OUStringLiteral sUNO_View_GridIsFront = u"GridIsFront";
+inline constexpr OUStringLiteral sUNO_View_IsSnapToGrid = u"IsSnapToGrid";
+inline constexpr OUStringLiteral sUNO_View_IsSnapToPageMargins = u"IsSnapToPageMargins";
+inline constexpr OUStringLiteral sUNO_View_IsSnapToSnapLines = u"IsSnapToSnapLines";
+inline constexpr OUStringLiteral sUNO_View_IsSnapToObjectFrame = u"IsSnapToObjectFrame";
+inline constexpr OUStringLiteral sUNO_View_IsSnapToObjectPoints = u"IsSnapToObjectPoints";
+inline constexpr OUStringLiteral sUNO_View_IsPlusHandlesAlwaysVisible
+ = u"IsPlusHandlesAlwaysVisible";
+inline constexpr OUStringLiteral sUNO_View_IsFrameDragSingles = u"IsFrameDragSingles";
+inline constexpr OUStringLiteral sUNO_View_EliminatePolyPointLimitAngle
+ = u"EliminatePolyPointLimitAngle";
+inline constexpr OUStringLiteral sUNO_View_IsEliminatePolyPoints = u"IsEliminatePolyPoints";
+inline const char sUNO_View_ActiveLayer[] = "ActiveLayer";
+inline constexpr OUStringLiteral sUNO_View_NoAttribs = u"NoAttribs";
+inline constexpr OUStringLiteral sUNO_View_NoColors = u"NoColors";
+inline constexpr OUStringLiteral sUNO_View_GridCoarseWidth = u"GridCoarseWidth";
+inline constexpr OUStringLiteral sUNO_View_GridCoarseHeight = u"GridCoarseHeight";
+inline constexpr OUStringLiteral sUNO_View_GridFineWidth = u"GridFineWidth";
+inline constexpr OUStringLiteral sUNO_View_GridFineHeight = u"GridFineHeight";
+inline constexpr OUStringLiteral sUNO_View_IsAngleSnapEnabled = u"IsAngleSnapEnabled";
+inline constexpr OUStringLiteral sUNO_View_SnapAngle = u"SnapAngle";
+inline constexpr OUStringLiteral sUNO_View_GridSnapWidthXNumerator = u"GridSnapWidthXNumerator";
+inline constexpr OUStringLiteral sUNO_View_GridSnapWidthXDenominator = u"GridSnapWidthXDenominator";
+inline constexpr OUStringLiteral sUNO_View_GridSnapWidthYNumerator = u"GridSnapWidthYNumerator";
+inline constexpr OUStringLiteral sUNO_View_GridSnapWidthYDenominator = u"GridSnapWidthYDenominator";
+inline constexpr OUStringLiteral sUNO_View_VisibleLayers = u"VisibleLayers";
+inline constexpr OUStringLiteral sUNO_View_PrintableLayers = u"PrintableLayers";
+inline constexpr OUStringLiteral sUNO_View_LockedLayers = u"LockedLayers";
+
+inline constexpr OUStringLiteral sUNO_View_VisibleAreaTop = u"VisibleAreaTop";
+inline constexpr OUStringLiteral sUNO_View_VisibleAreaLeft = u"VisibleAreaLeft";
+inline constexpr OUStringLiteral sUNO_View_VisibleAreaWidth = u"VisibleAreaWidth";
+inline constexpr OUStringLiteral sUNO_View_VisibleAreaHeight = u"VisibleAreaHeight";
+
+inline constexpr OUStringLiteral sUNO_View_ZoomOnPage = u"ZoomOnPage";
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/unomodel.hxx b/sd/source/ui/inc/unomodel.hxx
new file mode 100644
index 000000000..cf88666f6
--- /dev/null
+++ b/sd/source/ui/inc/unomodel.hxx
@@ -0,0 +1,406 @@
+/* -*- 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 .
+ */
+#pragma once
+
+#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
+#include <com/sun/star/document/XLinkTargetSupplier.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XDrawPageDuplicator.hpp>
+#include <com/sun/star/drawing/XLayerSupplier.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/presentation/XPresentationSupplier.hpp>
+#include <com/sun/star/presentation/XCustomPresentationSupplier.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/drawing/XDrawPages.hpp>
+#include <com/sun/star/ucb/XAnyCompareFactory.hpp>
+#include <com/sun/star/presentation/XHandoutMasterSupplier.hpp>
+#include <com/sun/star/view/XRenderable.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+
+#include <rtl/ref.hxx>
+
+#include <sfx2/sfxbasemodel.hxx>
+#include <svx/fmdmod.hxx>
+
+#include <vcl/ITiledRenderable.hxx>
+
+#include <comphelper/servicehelper.hxx>
+#include <cppuhelper/implbase.hxx>
+#include <cppuhelper/weakref.hxx>
+#include <sddllapi.h>
+
+namespace com::sun::star::container { class XNameContainer; }
+namespace com::sun::star::i18n { class XForbiddenCharacters; }
+namespace com::sun::star::presentation { class XPresentation; }
+
+class SdDrawDocument;
+class SdPage;
+class SvxItemPropertySet;
+
+namespace sd {
+class DrawDocShell;
+class DrawViewShell;
+}
+
+extern OUString getPageApiName( SdPage const * pPage );
+extern OUString getPageApiNameFromUiName( const OUString& rUIName );
+
+class SD_DLLPUBLIC SdXImpressDocument final : public SfxBaseModel, // implements SfxListener, OWEAKOBJECT & other
+ public SvxFmMSFactory,
+ public css::drawing::XDrawPageDuplicator,
+ public css::drawing::XLayerSupplier,
+ public css::drawing::XMasterPagesSupplier,
+ public css::drawing::XDrawPagesSupplier,
+ public css::presentation::XPresentationSupplier,
+ public css::presentation::XCustomPresentationSupplier,
+ public css::document::XLinkTargetSupplier,
+ public css::beans::XPropertySet,
+ public css::style::XStyleFamiliesSupplier,
+ public css::lang::XServiceInfo,
+ public css::ucb::XAnyCompareFactory,
+ public css::presentation::XHandoutMasterSupplier,
+ public css::view::XRenderable,
+ public vcl::ITiledRenderable
+{
+ friend class SdDrawPagesAccess;
+ friend class SdMasterPagesAccess;
+ friend class SdLayerManager;
+
+private:
+ ::sd::DrawDocShell* mpDocShell;
+ SdDrawDocument* mpDoc;
+ bool mbDisposed;
+
+ css::uno::Reference<css::uno::XInterface> create(
+ OUString const & aServiceSpecifier, OUString const & referer);
+
+ /// @throws css::uno::RuntimeException
+ SdPage* InsertSdPage( sal_uInt16 nPage, bool bDuplicate );
+
+ const bool mbImpressDoc;
+ bool mbClipBoard;
+
+ css::uno::WeakReference< css::drawing::XDrawPages > mxDrawPagesAccess;
+ css::uno::WeakReference< css::drawing::XDrawPages > mxMasterPagesAccess;
+ css::uno::WeakReference< css::container::XNameAccess > mxLayerManager;
+ css::uno::WeakReference< css::container::XNameContainer > mxCustomPresentationAccess;
+ css::uno::WeakReference< css::i18n::XForbiddenCharacters > mxForbiddenCharacters;
+ css::uno::Reference< css::container::XNameAccess > mxLinks;
+
+ css::uno::Reference< css::uno::XInterface > mxDashTable;
+ css::uno::Reference< css::uno::XInterface > mxGradientTable;
+ css::uno::Reference< css::uno::XInterface > mxHatchTable;
+ css::uno::Reference< css::uno::XInterface > mxBitmapTable;
+ css::uno::Reference< css::uno::XInterface > mxTransGradientTable;
+ css::uno::Reference< css::uno::XInterface > mxMarkerTable;
+ css::uno::Reference< css::uno::XInterface > mxDrawingPool;
+
+ const SvxItemPropertySet* mpPropSet;
+
+ css::uno::Sequence< css::uno::Type > maTypeSequence;
+
+ OUString maBuildId;
+
+ void initializeDocument();
+
+ sd::DrawViewShell* GetViewShell();
+
+ /** abstract SdrModel provider */
+ virtual SdrModel& getSdrModelFromUnoModel() const override;
+
+public:
+ SdXImpressDocument(::sd::DrawDocShell* pShell, bool bClipBoard);
+ SdXImpressDocument(SdDrawDocument* pDoc, bool bClipBoard);
+ virtual ~SdXImpressDocument() noexcept override;
+
+ static rtl::Reference< SdXImpressDocument > GetModel( SdDrawDocument const & rDoc );
+
+ // intern
+ bool operator==( const SdXImpressDocument& rModel ) const { return mpDoc == rModel.mpDoc; }
+ bool operator!=( const SdXImpressDocument& rModel ) const { return mpDoc != rModel.mpDoc; }
+
+ ::sd::DrawDocShell* GetDocShell() const { return mpDocShell; }
+ SdDrawDocument* GetDoc() const { return mpDoc; }
+ bool IsImpressDocument() const { return mbImpressDoc; }
+
+ void SetModified() noexcept;
+
+ css::uno::Reference< css::i18n::XForbiddenCharacters > getForbiddenCharsTable();
+
+ // SfxListener
+ virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
+
+ UNO3_GETIMPLEMENTATION_DECL(SdXImpressDocument)
+
+ // XInterface
+ virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override;
+ virtual void SAL_CALL acquire() noexcept override;
+ virtual void SAL_CALL release() noexcept override;
+
+ // XModel
+ virtual void SAL_CALL lockControllers( ) override;
+ virtual void SAL_CALL unlockControllers( ) override;
+ virtual sal_Bool SAL_CALL hasControllersLocked( ) override;
+ virtual css::uno::Reference < css::container::XIndexAccess > SAL_CALL getViewData() override;
+ virtual void SAL_CALL setViewData( const css::uno::Reference < css::container::XIndexAccess >& aData ) override;
+
+ // XTypeProvider
+ virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override;
+ virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId( ) override;
+
+ // XDrawPageDuplicator
+ virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL duplicate( const css::uno::Reference< css::drawing::XDrawPage >& xPage ) override;
+
+ // XDrawPagesSupplier
+ virtual css::uno::Reference< css::drawing::XDrawPages > SAL_CALL getDrawPages( ) override;
+
+ // XMasterPagesSupplier
+ virtual css::uno::Reference< css::drawing::XDrawPages > SAL_CALL getMasterPages( ) override;
+
+ // XLayerManagerSupplier
+ virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getLayerManager( ) override;
+
+ // XCustomPresentationSupplier
+ virtual css::uno::Reference< css::container::XNameContainer > SAL_CALL getCustomPresentations( ) override;
+
+ // XHandoutMasterSupplier
+ virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getHandoutMasterPage( ) override;
+
+ // XPresentationSupplier
+ virtual css::uno::Reference< css::presentation::XPresentation > SAL_CALL getPresentation( ) override;
+
+ // XMultiServiceFactory ( SvxFmMSFactory )
+ virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance( const OUString& aServiceSpecifier ) override;
+ virtual css::uno::Reference<css::uno::XInterface> SAL_CALL
+ createInstanceWithArguments(
+ OUString const & ServiceSpecifier,
+ css::uno::Sequence<css::uno::Any> const & Arguments) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getAvailableServiceNames( ) 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;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override;
+ virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override;
+ virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override;
+ virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+ virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+
+ // XLinkTargetSupplier
+ virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getLinks( ) override;
+
+ // XStyleFamiliesSupplier
+ virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getStyleFamilies( ) override;
+
+ // XAnyCompareFactory
+ virtual css::uno::Reference< css::ucb::XAnyCompare > SAL_CALL createAnyCompareByName( const OUString& PropertyName ) override;
+
+ // XRenderable
+ virtual sal_Int32 SAL_CALL getRendererCount( const css::uno::Any& aSelection, const css::uno::Sequence< css::beans::PropertyValue >& xOptions ) override;
+ virtual css::uno::Sequence< css::beans::PropertyValue > SAL_CALL getRenderer( sal_Int32 nRenderer, const css::uno::Any& aSelection, const css::uno::Sequence< css::beans::PropertyValue >& xOptions ) override;
+ virtual void SAL_CALL render( sal_Int32 nRenderer, const css::uno::Any& aSelection, const css::uno::Sequence< css::beans::PropertyValue >& xOptions ) override;
+
+ // ITiledRenderable
+ virtual void paintTile( VirtualDevice& rDevice,
+ int nOutputWidth,
+ int nOutputHeight,
+ int nTilePosX,
+ int nTilePosY,
+ tools::Long nTileWidth,
+ tools::Long nTileHeight ) override;
+ virtual Size getDocumentSize() override;
+ virtual void setPart( int nPart, bool bAllowChangeFocus = true ) override;
+ virtual int getPart() override;
+ virtual int getParts() override;
+ virtual OUString getPartName( int nPart ) override;
+ virtual OUString getPartHash( int nPart ) override;
+ virtual VclPtr<vcl::Window> getDocWindow() override;
+ bool isMasterViewMode();
+
+ virtual void setPartMode( int nPartMode ) override;
+
+ /// @see vcl::ITiledRenderable::initializeForTiledRendering().
+ virtual void initializeForTiledRendering(const css::uno::Sequence<css::beans::PropertyValue>& rArguments) override;
+ /// @see vcl::ITiledRenderable::postKeyEvent().
+ virtual void postKeyEvent(int nType, int nCharCode, int nKeyCode) override;
+ /// @see vcl::ITiledRenderable::postMouseEvent().
+ virtual void postMouseEvent(int nType, int nX, int nY, int nCount, int nButtons, int nModifier) override;
+ /// @see vcl::ITiledRenderable::setTextSelection().
+ virtual void setTextSelection(int nType, int nX, int nY) override;
+ /// @see vcl::ITiledRenderable::getSelection().
+ virtual css::uno::Reference<css::datatransfer::XTransferable> getSelection() override;
+ /// @see vcl::ITiledRenderable::setGraphicSelection().
+ virtual void setGraphicSelection(int nType, int nX, int nY) override;
+ /// @see lok::Document::resetSelection().
+ virtual void resetSelection() override;
+ /// @see vcl::ITiledRenderable::setClientVisibleArea().
+ virtual void setClientVisibleArea(const tools::Rectangle& rRectangle) override;
+ /// @see vcl::ITiledRenderable::setClipboard().
+ virtual void setClipboard(const css::uno::Reference<css::datatransfer::clipboard::XClipboard>& xClipboard) override;
+ /// @see vcl::ITiledRenderable::isMimeTypeSupported().
+ virtual bool isMimeTypeSupported() override;
+ /// @see vcl::ITiledRenderable::getPointer().
+ virtual PointerStyle getPointer() override;
+ /// @see vcl::ITiledRenderable::getPostIts().
+ virtual void getPostIts(tools::JsonWriter& /*rJsonWriter*/) override;
+ /// @see vcl::ITiledRenderable::selectPart().
+ virtual void selectPart(int nPart, int nSelect) override;
+ /// @see vcl::ITiledRenderable::moveSelectedParts().
+ virtual void moveSelectedParts(int nPosition, bool bDuplicate) override;
+ /// @see vcl::ITiledRenderable::getPartInfo().
+ virtual OUString getPartInfo(int nPart) override;
+ /// @see vcl::ITiledRenderable::isDisposed().
+ virtual bool isDisposed() const override
+ {
+ return mbDisposed;
+ }
+
+ // XComponent
+
+ /** This dispose implementation releases the resources held by the
+ called object and forwards the call to its base class.
+ When close() has not yet been called then this is done first. As a
+ consequence the implementation has to cope with being called twice
+ and still has to forward the second call to the base class.
+ See also comments of issue 27847.
+ */
+ virtual void SAL_CALL dispose() override;
+};
+
+/***********************************************************************
+* *
+***********************************************************************/
+
+class SdDrawPagesAccess final : public ::cppu::WeakImplHelper< css::drawing::XDrawPages, css::container::XNameAccess, css::lang::XServiceInfo, css::lang::XComponent >
+{
+private:
+ SdXImpressDocument* mpModel;
+
+public:
+ SdDrawPagesAccess( SdXImpressDocument& rMyModel ) noexcept;
+ virtual ~SdDrawPagesAccess() noexcept override;
+
+ // XDrawPages
+ virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL insertNewByIndex( sal_Int32 nIndex ) override;
+ virtual void SAL_CALL remove( const css::uno::Reference< css::drawing::XDrawPage >& xPage ) override;
+
+ // XNameAccess
+ virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override;
+ virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
+
+ // XIndexAccess
+ virtual sal_Int32 SAL_CALL getCount() override ;
+ virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() 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;
+
+ // XComponent
+ virtual void SAL_CALL dispose( ) override;
+ virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override;
+ virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override;
+};
+
+/***********************************************************************
+* *
+***********************************************************************/
+
+class SdMasterPagesAccess final : public ::cppu::WeakImplHelper< css::drawing::XDrawPages, css::lang::XServiceInfo, css::lang::XComponent >
+{
+private:
+ SdXImpressDocument* mpModel;
+
+public:
+ SdMasterPagesAccess( SdXImpressDocument& rMyModel ) noexcept;
+ virtual ~SdMasterPagesAccess() noexcept override;
+
+ // XDrawPages
+ virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL insertNewByIndex( sal_Int32 nIndex ) override;
+ virtual void SAL_CALL remove( const css::uno::Reference< css::drawing::XDrawPage >& xPage ) override;
+
+ // XIndexAccess
+ virtual sal_Int32 SAL_CALL getCount() override ;
+ virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() 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;
+
+ // XComponent
+ virtual void SAL_CALL dispose( ) override;
+ virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override;
+ virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override;
+};
+
+/***********************************************************************
+* *
+***********************************************************************/
+
+class SdDocLinkTargets final : public ::cppu::WeakImplHelper< css::container::XNameAccess,
+ css::lang::XServiceInfo , css::lang::XComponent >
+{
+private:
+ SdXImpressDocument* mpModel;
+
+public:
+ SdDocLinkTargets( SdXImpressDocument& rMyModel ) noexcept;
+ virtual ~SdDocLinkTargets() noexcept override;
+
+ // XNameAccess
+ virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override;
+ virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() 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;
+
+ // XComponent
+ virtual void SAL_CALL dispose( ) override;
+ virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override;
+ virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override;
+
+ // intern
+ /// @throws std::exception
+ SdPage* FindPage( std::u16string_view rName ) const;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/unopage.hxx b/sd/source/ui/inc/unopage.hxx
new file mode 100644
index 000000000..af09e5982
--- /dev/null
+++ b/sd/source/ui/inc/unopage.hxx
@@ -0,0 +1,304 @@
+/* -*- 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 .
+ */
+#pragma once
+
+#include <com/sun/star/document/XLinkTargetSupplier.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/drawing/XMasterPageTarget.hpp>
+#include <com/sun/star/drawing/XShapeCombiner.hpp>
+#include <com/sun/star/drawing/XShapeBinder.hpp>
+#include <com/sun/star/presentation/XPresentationPage.hpp>
+#include <com/sun/star/animations/XAnimationNodeSupplier.hpp>
+#include <com/sun/star/beans/XMultiPropertySet.hpp>
+#include <com/sun/star/office/XAnnotationAccess.hpp>
+
+#include <svx/unopage.hxx>
+#include <svx/fmdpage.hxx>
+
+#include <comphelper/servicehelper.hxx>
+#include <cppuhelper/implbase.hxx>
+
+#include "unosrch.hxx"
+#include <sdpage.hxx>
+
+class SdrObject;
+class SdXImpressDocument;
+
+class SdGenericDrawPage : public SvxFmDrawPage,
+ public SdUnoSearchReplaceShape,
+ public css::drawing::XShapeCombiner,
+ public css::drawing::XShapeBinder,
+ public css::container::XNamed,
+ public css::beans::XPropertySet,
+ public css::beans::XMultiPropertySet,
+ public css::animations::XAnimationNodeSupplier,
+ public css::office::XAnnotationAccess,
+ public css::document::XLinkTargetSupplier
+{
+private:
+ SdXImpressDocument* mpDocModel;
+ SdrModel* mpSdrModel;
+ bool mbIsImpressDocument;
+ sal_Int16 mnTempPageNumber; // for printing handouts
+
+ void UpdateModel();
+
+protected:
+ friend class SdXImpressDocument;
+
+ const SvxItemPropertySet* mpPropSet;
+
+ /// @throws css::lang::IllegalArgumentException
+ virtual void setBackground( const css::uno::Any& rValue );
+ /// @throws std::exception
+ virtual void getBackground( css::uno::Any& rValue );
+
+ OUString getBookmarkURL() const;
+ void setBookmarkURL( std::u16string_view rURL );
+
+ void SetLeftBorder( sal_Int32 nValue );
+ void SetRightBorder( sal_Int32 nValue );
+ void SetUpperBorder( sal_Int32 nValue );
+ void SetLowerBorder( sal_Int32 nValue );
+
+ void SetWidth( sal_Int32 nWidth );
+ void SetHeight( sal_Int32 nHeight );
+
+ bool IsImpressDocument() const;
+
+ virtual void disposing() noexcept override;
+
+ css::uno::Any getNavigationOrder();
+ void setNavigationOrder( const css::uno::Any& rValue );
+
+ /// @throws css::uno::RuntimeException
+ void throwIfDisposed() const;
+
+public:
+ SdGenericDrawPage(SdXImpressDocument* pModel, SdPage* pInPage, const SvxItemPropertySet* pSet);
+ virtual ~SdGenericDrawPage() noexcept override;
+
+ // intern
+ bool isValid() const { return (SvxDrawPage::mpPage != nullptr) && (mpModel != nullptr); }
+
+ SdPage* GetPage() const { return static_cast<SdPage*>(SvxDrawPage::mpPage); }
+ SdXImpressDocument* GetModel() const;
+
+ static const css::uno::Sequence< sal_Int8 > & getUnoTunnelId() noexcept;
+ virtual sal_Int64 SAL_CALL getSomething( const css::uno::Sequence< sal_Int8 >& aIdentifier ) override;
+
+ // this is called whenever a SdrObject must be created for an empty api shape wrapper
+ virtual SdrObject *CreateSdrObject_( const css::uno::Reference< css::drawing::XShape >& xShape ) override;
+
+ // SvxFmDrawPage
+ virtual css::uno::Reference<css::drawing::XShape> CreateShape(SdrObject *pObj) const override;
+
+ // XInterface
+ virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override;
+ virtual void SAL_CALL release() noexcept override;
+
+ // XShapeCombiner
+ virtual css::uno::Reference< css::drawing::XShape > SAL_CALL combine( const css::uno::Reference< css::drawing::XShapes >& xShapes ) override;
+ virtual void SAL_CALL split( const css::uno::Reference< css::drawing::XShape >& xGroup ) override;
+
+ // XShapeBinder
+ virtual css::uno::Reference< css::drawing::XShape > SAL_CALL bind( const css::uno::Reference< css::drawing::XShapes >& xShapes ) override;
+ virtual void SAL_CALL unbind( const css::uno::Reference< css::drawing::XShape >& xShape ) override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override;
+ virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override;
+ virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+ virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+
+ // XMultiPropertySet
+ virtual void SAL_CALL setPropertyValues( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Sequence< css::uno::Any >& aValues ) override;
+ virtual css::uno::Sequence< css::uno::Any > SAL_CALL getPropertyValues( const css::uno::Sequence< OUString >& aPropertyNames ) override;
+ virtual void SAL_CALL addPropertiesChangeListener( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertiesChangeListener( const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override;
+ virtual void SAL_CALL firePropertiesChangeEvent( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override;
+
+ // XLinkTargetSupplier
+ virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getLinks( ) override;
+
+ // XServiceInfo
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
+
+ // XAnimationNodeSupplier
+ virtual css::uno::Reference< css::animations::XAnimationNode > SAL_CALL getAnimationNode( ) override;
+
+ // XAnnotationAccess:
+ virtual css::uno::Reference< css::office::XAnnotation > SAL_CALL createAndInsertAnnotation() override;
+ virtual void SAL_CALL removeAnnotation(const css::uno::Reference< css::office::XAnnotation > & annotation) override;
+ virtual css::uno::Reference< css::office::XAnnotationEnumeration > SAL_CALL createAnnotationEnumeration() override;
+};
+
+/***********************************************************************
+* *
+***********************************************************************/
+
+class SdDrawPage final : public css::drawing::XMasterPageTarget,
+ public css::presentation::XPresentationPage,
+ public SdGenericDrawPage
+{
+private:
+ css::uno::Sequence< css::uno::Type > maTypeSequence;
+
+ virtual void setBackground( const css::uno::Any& rValue ) override;
+ virtual void getBackground( css::uno::Any& rValue ) override;
+public:
+ SdDrawPage(SdXImpressDocument* pModel, SdPage* pInPage);
+ virtual ~SdDrawPage() noexcept override;
+
+ UNO3_GETIMPLEMENTATION_DECL( SdDrawPage )
+
+ static OUString getPageApiName( SdPage const * pPage );
+ static OUString getPageApiNameFromUiName( const OUString& rUIName );
+ static OUString getUiNameFromPageApiName( const OUString& rApiName );
+
+ // XInterface
+ virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override;
+ virtual void SAL_CALL acquire() noexcept override;
+ virtual void SAL_CALL release() noexcept override;
+
+ // XTypeProvider
+ virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override;
+ virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() 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;
+
+ // XMasterPageTarget
+ virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getMasterPage( ) override;
+ virtual void SAL_CALL setMasterPage( const css::uno::Reference< css::drawing::XDrawPage >& xMasterPage ) override;
+
+ // XPresentationPage
+ virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getNotesPage( ) override;
+
+ // XNamed
+ virtual OUString SAL_CALL getName( ) override;
+ virtual void SAL_CALL setName( const OUString& aName ) override;
+
+ // XIndexAccess
+ virtual sal_Int32 SAL_CALL getCount() override ;
+ virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() override;
+
+ // XShapes
+ virtual void SAL_CALL add( const css::uno::Reference< css::drawing::XShape >& xShape ) override;
+ virtual void SAL_CALL remove( const css::uno::Reference< css::drawing::XShape >& xShape ) override;
+};
+
+/***********************************************************************
+* *
+***********************************************************************/
+
+class SdMasterPage final : public css::presentation::XPresentationPage,
+ public SdGenericDrawPage
+{
+private:
+ css::uno::Sequence< css::uno::Type > maTypeSequence;
+
+ virtual void setBackground( const css::uno::Any& rValue ) override;
+ virtual void getBackground( css::uno::Any& rValue ) override;
+
+public:
+ SdMasterPage(SdXImpressDocument* pModel, SdPage* pInPage);
+ virtual ~SdMasterPage() noexcept override;
+
+ UNO3_GETIMPLEMENTATION_DECL(SdMasterPage)
+
+ // XInterface
+ virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override;
+ virtual void SAL_CALL acquire() noexcept override;
+ virtual void SAL_CALL release() noexcept override;
+
+ // XTypeProvider
+ virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override;
+ virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() 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;
+
+ // XIndexAccess
+ virtual sal_Int32 SAL_CALL getCount() override ;
+ virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() override;
+
+ // XPresentationPage
+ virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getNotesPage( ) override;
+
+ // XNamed
+ virtual OUString SAL_CALL getName( ) override;
+ virtual void SAL_CALL setName( const OUString& aName ) override;
+
+ // XShapes
+ virtual void SAL_CALL add( const css::uno::Reference< css::drawing::XShape >& xShape ) override;
+ virtual void SAL_CALL remove( const css::uno::Reference< css::drawing::XShape >& xShape ) override;
+};
+
+/***********************************************************************
+* *
+***********************************************************************/
+
+class SdPageLinkTargets final : public ::cppu::WeakImplHelper< css::container::XNameAccess,
+ css::lang::XServiceInfo >
+{
+private:
+ css::uno::Reference< css::drawing::XDrawPage > mxPage;
+ SdGenericDrawPage* mpUnoPage;
+
+public:
+ SdPageLinkTargets( SdGenericDrawPage* pUnoPage ) noexcept;
+ virtual ~SdPageLinkTargets() noexcept override;
+
+ // intern
+ SdrObject* FindObject( std::u16string_view rName ) const noexcept;
+
+ // 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;
+
+ // XNameAccess
+ virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override;
+ virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() override;
+};
+
+OUString getUiNameFromPageApiNameImpl( const OUString& rApiName );
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/unoprnms.hxx b/sd/source/ui/inc/unoprnms.hxx
new file mode 100644
index 000000000..1d3a90552
--- /dev/null
+++ b/sd/source/ui/inc/unoprnms.hxx
@@ -0,0 +1,73 @@
+/* -*- 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 .
+ */
+#pragma once
+
+
+#define UNO_NAME_PAGE_BACKGROUND "Background"
+#define UNO_NAME_PAGE_LEFT "BorderLeft"
+#define UNO_NAME_PAGE_RIGHT "BorderRight"
+#define UNO_NAME_PAGE_TOP "BorderTop"
+#define UNO_NAME_PAGE_BOTTOM "BorderBottom"
+#define UNO_NAME_PAGE_CHANGE "Change"
+#define UNO_NAME_PAGE_DURATION "Duration"
+#define UNO_NAME_PAGE_EFFECT "Effect"
+#define UNO_NAME_PAGE_HEIGHT "Height"
+#define UNO_NAME_PAGE_LAYOUT "Layout"
+#define UNO_NAME_PAGE_NUMBER "Number"
+#define UNO_NAME_PAGE_ORIENTATION "Orientation"
+#define UNO_NAME_PAGE_SPEED "Speed"
+#define UNO_NAME_PAGE_TRANSITION_DURATION "TransitionDuration"
+#define UNO_NAME_PAGE_WIDTH "Width"
+#define UNO_NAME_PAGE_PREVIEW "Preview"
+#define UNO_NAME_PAGE_PREVIEWBITMAP "PreviewBitmap"
+#define UNO_NAME_PAGE_PREVIEWMETAFILE "PreviewMetafile"
+#define UNO_NAME_PAGE_VISIBLE "Visible"
+
+#define UNO_NAME_OBJ_BOOKMARK "Bookmark"
+#define UNO_NAME_OBJ_DIMCOLOR "DimColor"
+#define UNO_NAME_OBJ_DIMHIDE "DimHide"
+#define UNO_NAME_OBJ_DIMPREV "DimPrevious"
+#define UNO_NAME_OBJ_EFFECT "Effect"
+#define UNO_NAME_OBJ_ISEMPTYPRESOBJ "IsEmptyPresentationObject"
+#define UNO_NAME_OBJ_ISPRESOBJ "IsPresentationObject"
+#define UNO_NAME_OBJ_CLICKACTION "OnClick"
+#define UNO_NAME_OBJ_PLAYFULL "PlayFull"
+#define UNO_NAME_OBJ_PRESORDER "PresentationOrder"
+#define UNO_NAME_OBJ_SOUNDFILE "Sound"
+#define UNO_NAME_OBJ_SOUNDON "SoundOn"
+#define UNO_NAME_OBJ_SPEED "Speed"
+#define UNO_NAME_OBJ_TEXTEFFECT "TextEffect"
+#define UNO_NAME_OBJ_BLUESCREEN "TransparentColor"
+#define UNO_NAME_OBJ_VERB "Verb"
+#define UNO_NAME_OBJ_STYLE "Style"
+#define UNO_NAME_OBJ_MASTERDEPENDENT "IsPlaceholderDependent"
+#define UNO_NAME_OBJ_ANIMATIONPATH "AnimationPath"
+#define UNO_NAME_OBJ_LEGACYFRAGMENT "LegacyFragment"
+
+#define UNO_NAME_LAYER_LOCKED "IsLocked"
+#define UNO_NAME_LAYER_PRINTABLE "IsPrintable"
+#define UNO_NAME_LAYER_VISIBLE "IsVisible"
+#define UNO_NAME_LAYER_NAME "Name"
+
+
+#define UNO_NAME_SEARCH_BACKWARDS "SearchBackwards"
+#define UNO_NAME_SEARCH_CASE "SearchCaseSensitive"
+#define UNO_NAME_SEARCH_WORDS "SearchWords"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/unosrch.hxx b/sd/source/ui/inc/unosrch.hxx
new file mode 100644
index 000000000..6dcf681cb
--- /dev/null
+++ b/sd/source/ui/inc/unosrch.hxx
@@ -0,0 +1,134 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <com/sun/star/util/XReplaceable.hpp>
+#include <com/sun/star/util/XReplaceDescriptor.hpp>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+
+#include <comphelper/servicehelper.hxx>
+#include <cppuhelper/implbase.hxx>
+#include <editeng/editdata.hxx>
+
+namespace com::sun::star::drawing { class XDrawPage; }
+namespace com::sun::star::drawing { class XShape; }
+namespace com::sun::star::text { class XTextRange; }
+namespace com::sun::star::util { class XSearchDescriptor; }
+
+class SvxItemPropertySet;
+class SdUnoSearchReplaceDescriptor;
+
+/** this class implements a search or replace operation on a given page or a given sdrobj */
+class SdUnoSearchReplaceShape : public css::util::XReplaceable
+{
+protected:
+ css::drawing::XDrawPage* mpPage;
+
+ css::uno::Reference< css::text::XTextRange > Search( const css::uno::Reference< css::text::XTextRange >& xText, SdUnoSearchReplaceDescriptor* pDescr );
+ bool Search( const OUString& rText, sal_Int32& nStartPos, sal_Int32& nEndPos, SdUnoSearchReplaceDescriptor* pDescr ) noexcept;
+ static ESelection GetSelection( const css::uno::Reference< css::text::XTextRange >& xTextRange ) noexcept;
+ static css::uno::Reference< css::drawing::XShape > GetShape( const css::uno::Reference< css::text::XTextRange >& xTextRange ) noexcept;
+ css::uno::Reference< css::drawing::XShape > GetNextShape( const css::uno::Reference< css::container::XIndexAccess >& xShapes, const css::uno::Reference< css::drawing::XShape >& xCurrentShape ) noexcept;
+ css::uno::Reference< css::drawing::XShape > GetCurrentShape() const noexcept;
+
+public:
+ // danger, this c'tor is only usable if the given shape or page is derived
+ // from this class!!!
+ SdUnoSearchReplaceShape( css::drawing::XDrawPage* xPage ) noexcept;
+ virtual ~SdUnoSearchReplaceShape() noexcept;
+
+ // XReplaceable
+ virtual css::uno::Reference< css::util::XReplaceDescriptor > SAL_CALL createReplaceDescriptor( ) override;
+ virtual sal_Int32 SAL_CALL replaceAll( const css::uno::Reference< css::util::XSearchDescriptor >& xDesc ) override;
+
+ // XSearchable
+ virtual css::uno::Reference< css::util::XSearchDescriptor > SAL_CALL createSearchDescriptor( ) override;
+ virtual css::uno::Reference< css::container::XIndexAccess > SAL_CALL findAll( const css::uno::Reference< css::util::XSearchDescriptor >& xDesc ) override;
+ virtual css::uno::Reference< css::uno::XInterface > SAL_CALL findFirst( const css::uno::Reference< css::util::XSearchDescriptor >& xDesc ) override;
+ virtual css::uno::Reference< css::uno::XInterface > SAL_CALL findNext( const css::uno::Reference< css::uno::XInterface >& xStartAt, const css::uno::Reference< css::util::XSearchDescriptor >& xDesc ) override;
+};
+
+/* ================================================================= */
+
+/** this class holds the parameters and status of a search or replace operation performed
+ by class SdUnoSearchReplaceShape */
+
+class SdUnoSearchReplaceDescriptor final : public ::cppu::WeakImplHelper< css::lang::XUnoTunnel, css::util::XReplaceDescriptor > // public css::util::XSearchDescriptor, css::beans::XPropertySet
+{
+ std::unique_ptr<SvxItemPropertySet> mpPropSet;
+
+ bool mbBackwards;
+ bool mbCaseSensitive;
+ bool mbWords;
+
+ OUString maSearchStr;
+ OUString maReplaceStr;
+
+public:
+ /// @throws css::uno::RuntimeException
+ SdUnoSearchReplaceDescriptor();
+ virtual ~SdUnoSearchReplaceDescriptor() noexcept override;
+
+ bool IsCaseSensitive() const { return mbCaseSensitive; }
+ bool IsWords() const { return mbWords; }
+
+ UNO3_GETIMPLEMENTATION_DECL( SdUnoSearchReplaceDescriptor )
+
+ // XSearchDescriptor
+ virtual OUString SAL_CALL getSearchString( ) override;
+ virtual void SAL_CALL setSearchString( const OUString& aString ) override;
+
+ // XReplaceDescriptor
+ virtual OUString SAL_CALL getReplaceString( ) override;
+ virtual void SAL_CALL setReplaceString( const OUString& aReplaceString ) override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override;
+ virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override;
+ virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override;
+ virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+ virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+};
+
+/* ================================================================= */
+
+/** this class holds a sequence that is a result from a find all and
+ lets people access it through the XIndexAccess Interface. */
+class SdUnoFindAllAccess final : public ::cppu::WeakImplHelper< css::container::XIndexAccess > // public css::container::XElementAccess
+{
+ css::uno::Sequence< css::uno::Reference< css::uno::XInterface > > maSequence;
+
+public:
+ SdUnoFindAllAccess( css::uno::Sequence< css::uno::Reference< css::uno::XInterface > > const & rSequence ) noexcept;
+ virtual ~SdUnoFindAllAccess() noexcept override;
+
+ // XIndexAccess
+ virtual sal_Int32 SAL_CALL getCount() override ;
+ virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/unprlout.hxx b/sd/source/ui/inc/unprlout.hxx
new file mode 100644
index 000000000..8d75204f1
--- /dev/null
+++ b/sd/source/ui/inc/unprlout.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <xmloff/autolayout.hxx>
+
+#include <sdundo.hxx>
+
+class SdDrawDocument;
+class SdPage;
+
+class SdPresentationLayoutUndoAction final : public SdUndoAction
+{
+ OUString aOldLayoutName;
+ OUString aNewLayoutName;
+ AutoLayout eOldAutoLayout;
+ AutoLayout eNewAutoLayout;
+ bool bSetAutoLayout; // sal_True: change AutoLayout
+ SdPage* pPage;
+ OUString aComment;
+
+public:
+ SdPresentationLayoutUndoAction(SdDrawDocument* pTheDoc,
+ const OUString& aTheOldLayoutName,
+ const OUString& aTheNewLayoutName,
+ AutoLayout eTheOldAutoLayout,
+ AutoLayout eTheNewAutoLayout,
+ bool bSet,
+ SdPage* pThePage);
+
+ virtual ~SdPresentationLayoutUndoAction() override;
+ virtual void Undo() override;
+ virtual void Redo() override;
+
+ virtual OUString GetComment() const override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/vectdlg.hxx b/sd/source/ui/inc/vectdlg.hxx
new file mode 100644
index 000000000..ac7a1bfd4
--- /dev/null
+++ b/sd/source/ui/inc/vectdlg.hxx
@@ -0,0 +1,81 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/weld.hxx>
+#include <svx/graphctl.hxx>
+
+namespace sd {
+class DrawDocShell;
+}
+
+/******************************************************************************
+|*
+|* SdVectorizeDlg
+|*
+\******************************************************************************/
+
+class SdVectorizeDlg final : public weld::GenericDialogController
+{
+ ::sd::DrawDocShell* m_pDocSh;
+ Bitmap aBmp;
+ Bitmap aPreviewBmp;
+ GDIMetaFile aMtf;
+
+ GraphCtrl m_aBmpWin;
+ GraphCtrl m_aMtfWin;
+
+ std::unique_ptr<weld::SpinButton> m_xNmLayers;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtReduce;
+ std::unique_ptr<weld::Label> m_xFtFillHoles;
+ std::unique_ptr<weld::MetricSpinButton> m_xMtFillHoles;
+ std::unique_ptr<weld::CheckButton> m_xCbFillHoles;
+ std::unique_ptr<weld::CustomWeld> m_xBmpWin;
+ std::unique_ptr<weld::CustomWeld> m_xMtfWin;
+ std::unique_ptr<weld::ProgressBar> m_xPrgs;
+ std::unique_ptr<weld::Button> m_xBtnOK;
+ std::unique_ptr<weld::Button> m_xBtnPreview;
+
+ void LoadSettings();
+ void SaveSettings() const;
+ void InitPreviewBmp();
+
+ static ::tools::Rectangle GetRect( const Size& rDispSize, const Size& rBmpSize );
+ Bitmap GetPreparedBitmap( Bitmap const & rBmp, Fraction& rScale );
+ void Calculate( Bitmap const & rBmp, GDIMetaFile& rMtf );
+ static void AddTile( BitmapReadAccess const * pRAcc, GDIMetaFile& rMtf,
+ tools::Long nPosX, tools::Long nPosY, tools::Long nWidth, tools::Long nHeight );
+
+ DECL_LINK( ProgressHdl, tools::Long, void );
+ DECL_LINK( ClickPreviewHdl, weld::Button&, void );
+ DECL_LINK( ClickOKHdl, weld::Button&, void );
+ DECL_LINK( ToggleHdl, weld::Toggleable&, void );
+ DECL_LINK( ModifyHdl, weld::SpinButton&, void );
+ DECL_LINK( MetricModifyHdl, weld::MetricSpinButton&, void );
+
+public:
+
+ SdVectorizeDlg(weld::Window* pParent, const Bitmap& rBmp, ::sd::DrawDocShell* pDocShell);
+ virtual ~SdVectorizeDlg() override;
+
+ const GDIMetaFile& GetGDIMetaFile() const { return aMtf; }
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/view/viewoverlaymanager.hxx b/sd/source/ui/inc/view/viewoverlaymanager.hxx
new file mode 100644
index 000000000..3a5c98deb
--- /dev/null
+++ b/sd/source/ui/inc/view/viewoverlaymanager.hxx
@@ -0,0 +1,71 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <rtl/ref.hxx>
+#include <tools/link.hxx>
+#include <svl/lstner.hxx>
+
+#include <vector>
+
+namespace sd
+{
+class SmartTag;
+}
+namespace sd::tools
+{
+class EventMultiplexerEvent;
+}
+namespace sd
+{
+class ViewShellBase;
+}
+struct ImplSVEvent;
+
+namespace sd
+{
+typedef std::vector<rtl::Reference<SmartTag>> ViewTagVector;
+
+class ViewOverlayManager final : public SfxListener
+{
+public:
+ ViewOverlayManager(ViewShellBase& rViewShellBase);
+ virtual ~ViewOverlayManager() override;
+
+ void onZoomChanged();
+ void UpdateTags();
+
+ DECL_LINK(EventMultiplexerListener, tools::EventMultiplexerEvent&, void);
+ DECL_LINK(UpdateTagsHdl, void*, void);
+
+ bool CreateTags();
+ bool DisposeTags();
+
+ virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override;
+
+private:
+ ViewShellBase& mrBase;
+ ImplSVEvent* mnUpdateTagsEvent;
+
+ ViewTagVector maTagVector;
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/inc/zoomlist.hxx b/sd/source/ui/inc/zoomlist.hxx
new file mode 100644
index 000000000..b7f7da79d
--- /dev/null
+++ b/sd/source/ui/inc/zoomlist.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <vector>
+
+#include <tools/gen.hxx>
+
+namespace sd
+{
+class ViewShell;
+
+class ZoomList
+{
+public:
+ ZoomList(ViewShell* pViewShell);
+
+ void InsertZoomRect(const ::tools::Rectangle& rRect);
+ ::tools::Rectangle const& GetNextZoomRect();
+ ::tools::Rectangle const& GetPreviousZoomRect();
+ bool IsNextPossible() const;
+ bool IsPreviousPossible() const;
+
+private:
+ ViewShell* mpViewShell;
+ sal_uInt32 mnCurPos;
+
+ std::vector<::tools::Rectangle> maRectangles;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/presenter/CanvasUpdateRequester.cxx b/sd/source/ui/presenter/CanvasUpdateRequester.cxx
new file mode 100644
index 000000000..2271ba781
--- /dev/null
+++ b/sd/source/ui/presenter/CanvasUpdateRequester.cxx
@@ -0,0 +1,131 @@
+/* -*- 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 "CanvasUpdateRequester.hxx"
+#include <vcl/svapp.hxx>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/rendering/XSpriteCanvas.hpp>
+#include <cppuhelper/weakref.hxx>
+#include <vector>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd::presenter {
+
+//===== CanvasUpdateRequester::Deleter ========================================
+
+class CanvasUpdateRequester::Deleter
+{
+public:
+ void operator() (CanvasUpdateRequester* pObject) { delete pObject; }
+};
+
+//===== CanvasUpdateRequester =================================================
+
+std::shared_ptr<CanvasUpdateRequester> CanvasUpdateRequester::Instance (
+ const Reference<rendering::XSpriteCanvas>& rxSharedCanvas)
+{
+ // this global must not own anything or we crash on shutdown
+ static std::vector<std::pair<
+ uno::WeakReference<rendering::XSpriteCanvas>,
+ std::weak_ptr<CanvasUpdateRequester>>> s_RequesterMap;
+ for (auto it = s_RequesterMap.begin(); it != s_RequesterMap.end(); )
+ {
+ uno::Reference<rendering::XSpriteCanvas> const xCanvas(it->first);
+ if (!xCanvas.is())
+ {
+ it = s_RequesterMap.erase(it); // remove stale entry
+ }
+ else if (xCanvas == rxSharedCanvas)
+ {
+ std::shared_ptr<CanvasUpdateRequester> pRequester(it->second);
+ if (pRequester)
+ {
+ return pRequester;
+ }
+ else
+ {
+ std::shared_ptr<CanvasUpdateRequester> const pNew(
+ new CanvasUpdateRequester(rxSharedCanvas), Deleter());
+ it->second = pNew;
+ return pNew;
+ }
+ }
+ else
+ {
+ ++it;
+ }
+ }
+
+ // No requester for the given canvas found. Create a new one.
+ std::shared_ptr<CanvasUpdateRequester> pRequester (
+ new CanvasUpdateRequester(rxSharedCanvas), Deleter());
+ s_RequesterMap.emplace_back(rxSharedCanvas, pRequester);
+ return pRequester;
+}
+
+
+CanvasUpdateRequester::CanvasUpdateRequester (
+ const Reference<rendering::XSpriteCanvas>& rxCanvas)
+ : mxCanvas(rxCanvas)
+ , m_pUserEventId(nullptr)
+ , mbUpdateFlag(false)
+{
+ Reference<lang::XComponent> xComponent (mxCanvas, UNO_QUERY);
+ if (xComponent.is())
+ {
+ //xComponent->addEventListener(this);
+ }
+}
+
+CanvasUpdateRequester::~CanvasUpdateRequester()
+{
+ assert(m_pUserEventId == nullptr);
+}
+
+void CanvasUpdateRequester::RequestUpdate (const bool bUpdateAll)
+{
+ if (m_pUserEventId == nullptr)
+ {
+ m_pThis = shared_from_this(); // keep instance alive until dispatch
+ mbUpdateFlag = bUpdateAll;
+ m_pUserEventId = Application::PostUserEvent(LINK(this, CanvasUpdateRequester, Callback));
+ }
+ else
+ {
+ mbUpdateFlag |= bUpdateAll;
+ }
+}
+
+IMPL_LINK_NOARG(CanvasUpdateRequester, Callback, void*, void)
+{
+ m_pUserEventId = nullptr;
+ if (mxCanvas.is())
+ {
+ mxCanvas->updateScreen(mbUpdateFlag);
+ mbUpdateFlag = false;
+ }
+ assert(m_pThis);
+ m_pThis.reset(); // possibly delete "this"
+}
+
+} // end of namespace ::sd::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/presenter/CanvasUpdateRequester.hxx b/sd/source/ui/presenter/CanvasUpdateRequester.hxx
new file mode 100644
index 000000000..ebb582ead
--- /dev/null
+++ b/sd/source/ui/presenter/CanvasUpdateRequester.hxx
@@ -0,0 +1,72 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <tools/link.hxx>
+#include <memory>
+
+namespace com::sun::star::rendering
+{
+class XSpriteCanvas;
+}
+
+struct ImplSVEvent;
+
+namespace sd::presenter
+{
+/** Each UpdateRequester handles update requests (calls to
+ XCanvas::updateScreen()) for one shared canvas (a canvas that has one or
+ more PresenterCanvas wrappers). Multiple calls are collected and lead
+ to a single call to updateScreen.
+*/
+class CanvasUpdateRequester : public std::enable_shared_from_this<CanvasUpdateRequester>
+{
+public:
+ CanvasUpdateRequester(const CanvasUpdateRequester&) = delete;
+ CanvasUpdateRequester& operator=(const CanvasUpdateRequester&) = delete;
+
+ /** @return the Canvas UpdateRequester object for the given shared canvas.
+ A new object is created when it does not already exist.
+ */
+ static std::shared_ptr<CanvasUpdateRequester>
+ Instance(const css::uno::Reference<css::rendering::XSpriteCanvas>& rxCanvas);
+
+ void RequestUpdate(const bool bUpdateAll);
+
+private:
+ explicit CanvasUpdateRequester(
+ const css::uno::Reference<css::rendering::XSpriteCanvas>& rxCanvas);
+ ~CanvasUpdateRequester();
+ class Deleter;
+ friend class Deleter;
+
+ /// keep instance alive waiting for event dispatch
+ std::shared_ptr<CanvasUpdateRequester> m_pThis;
+ css::uno::Reference<css::rendering::XSpriteCanvas> mxCanvas;
+ ImplSVEvent* m_pUserEventId;
+ bool mbUpdateFlag;
+
+ DECL_LINK(Callback, void*, void);
+};
+
+} // end of namespace ::sd::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/presenter/PresenterCanvas.cxx b/sd/source/ui/presenter/PresenterCanvas.cxx
new file mode 100644
index 000000000..f586969bc
--- /dev/null
+++ b/sd/source/ui/presenter/PresenterCanvas.cxx
@@ -0,0 +1,790 @@
+/* -*- 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 "PresenterCanvas.hxx"
+#include "CanvasUpdateRequester.hxx"
+
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <basegfx/polygon/b2dpolygonclipper.hxx>
+#include <basegfx/range/b2drectangle.hxx>
+#include <basegfx/utils/canvastools.hxx>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <comphelper/compbase.hxx>
+#include <rtl/ref.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <vcl/window.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd::presenter {
+
+//===== PresenterCustomSprite =================================================
+
+/** Wrapper around a sprite that is displayed on a PresenterCanvas.
+*/
+namespace {
+ typedef comphelper::WeakComponentImplHelper <
+ css::rendering::XCustomSprite
+ > PresenterCustomSpriteInterfaceBase;
+
+class PresenterCustomSprite final
+ : public PresenterCustomSpriteInterfaceBase
+{
+public:
+ PresenterCustomSprite (
+ const rtl::Reference<PresenterCanvas>& rpCanvas,
+ const Reference<rendering::XCustomSprite>& rxSprite,
+ const Reference<awt::XWindow>& rxBaseWindow);
+ PresenterCustomSprite(const PresenterCustomSprite&) = delete;
+ PresenterCustomSprite& operator=(const PresenterCustomSprite&) = delete;
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ // XSprite
+
+ virtual void SAL_CALL setAlpha (double nAlpha) override;
+
+ virtual void SAL_CALL move (const geometry::RealPoint2D& rNewPos,
+ const rendering::ViewState& rViewState,
+ const rendering::RenderState& rRenderState) override;
+
+ virtual void SAL_CALL transform (const geometry::AffineMatrix2D& rTransformation) override;
+
+ virtual void SAL_CALL clip (const Reference<rendering::XPolyPolygon2D>& rClip) override;
+
+ virtual void SAL_CALL setPriority (double nPriority) override;
+
+ virtual void SAL_CALL show() override;
+
+ virtual void SAL_CALL hide() override;
+
+ // XCustomSprite
+
+ virtual Reference<rendering::XCanvas> SAL_CALL getContentCanvas() override;
+
+private:
+ rtl::Reference<PresenterCanvas> mpCanvas;
+ Reference<rendering::XCustomSprite> mxSprite;
+ Reference<awt::XWindow> mxBaseWindow;
+ geometry::RealPoint2D maPosition;
+
+ /// @throws css::lang::DisposedException
+ void ThrowIfDisposed();
+};
+
+}
+
+//===== PresenterCanvas =======================================================
+
+PresenterCanvas::PresenterCanvas (
+ const Reference<rendering::XSpriteCanvas>& rxUpdateCanvas,
+ const Reference<awt::XWindow>& rxUpdateWindow,
+ const Reference<rendering::XCanvas>& rxSharedCanvas,
+ const Reference<awt::XWindow>& rxSharedWindow,
+ const Reference<awt::XWindow>& rxWindow)
+ : mxUpdateCanvas(rxUpdateCanvas),
+ mxUpdateWindow(rxUpdateWindow),
+ mxSharedCanvas(rxSharedCanvas),
+ mxSharedWindow(rxSharedWindow),
+ mxWindow(rxWindow),
+ mbOffsetUpdatePending(true)
+{
+ if (mxWindow.is())
+ mxWindow->addWindowListener(this);
+
+ if (mxUpdateCanvas.is())
+ {
+ m_pUpdateRequester = CanvasUpdateRequester::Instance(mxUpdateCanvas);
+ }
+}
+
+PresenterCanvas::~PresenterCanvas()
+{
+}
+
+void PresenterCanvas::disposing(std::unique_lock<std::mutex>&)
+{
+ if (mxWindow.is())
+ {
+ mxWindow->removeWindowListener(this);
+ mxWindow.clear();
+ }
+}
+
+//----- XCanvas ---------------------------------------------------------------
+
+void SAL_CALL PresenterCanvas::clear()
+{
+ ThrowIfDisposed();
+ // ToDo: Clear the area covered by the child window. A simple forward
+ // would clear the whole shared canvas.
+}
+
+void SAL_CALL PresenterCanvas::drawPoint (
+ const css::geometry::RealPoint2D& aPoint,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState)
+{
+ ThrowIfDisposed();
+ mxSharedCanvas->drawPoint(aPoint,MergeViewState(aViewState),aRenderState);
+}
+
+void SAL_CALL PresenterCanvas::drawLine (
+ const css::geometry::RealPoint2D& aStartPoint,
+ const css::geometry::RealPoint2D& aEndPoint,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState)
+{
+ ThrowIfDisposed();
+ mxSharedCanvas->drawLine(aStartPoint,aEndPoint,MergeViewState(aViewState),aRenderState);
+}
+
+void SAL_CALL PresenterCanvas::drawBezier (
+ const css::geometry::RealBezierSegment2D& aBezierSegment,
+ const css::geometry::RealPoint2D& aEndPoint,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState)
+{
+ ThrowIfDisposed();
+ mxSharedCanvas->drawBezier(aBezierSegment,aEndPoint,MergeViewState(aViewState),aRenderState);
+}
+
+css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL PresenterCanvas::drawPolyPolygon (
+ const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->drawPolyPolygon(
+ xPolyPolygon, MergeViewState(aViewState), aRenderState);
+}
+
+css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL PresenterCanvas::strokePolyPolygon (
+ const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ const css::rendering::StrokeAttributes& aStrokeAttributes)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->strokePolyPolygon(
+ xPolyPolygon, MergeViewState(aViewState), aRenderState, aStrokeAttributes);
+}
+
+css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ PresenterCanvas::strokeTexturedPolyPolygon (
+ const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ const css::uno::Sequence< css::rendering::Texture >& aTextures,
+ const css::rendering::StrokeAttributes& aStrokeAttributes)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->strokeTexturedPolyPolygon(
+ xPolyPolygon, MergeViewState(aViewState), aRenderState, aTextures, aStrokeAttributes);
+}
+
+css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ PresenterCanvas::strokeTextureMappedPolyPolygon(
+ const css::uno::Reference<css::rendering::XPolyPolygon2D >& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ const css::uno::Sequence<css::rendering::Texture>& aTextures,
+ const css::uno::Reference<css::geometry::XMapping2D>& xMapping,
+ const css::rendering::StrokeAttributes& aStrokeAttributes)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->strokeTextureMappedPolyPolygon(
+ xPolyPolygon,
+ MergeViewState(aViewState),
+ aRenderState,
+ aTextures,
+ xMapping,
+ aStrokeAttributes);
+}
+
+css::uno::Reference<css::rendering::XPolyPolygon2D> SAL_CALL
+ PresenterCanvas::queryStrokeShapes(
+ const css::uno::Reference<css::rendering::XPolyPolygon2D>& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ const css::rendering::StrokeAttributes& aStrokeAttributes)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->queryStrokeShapes(
+ xPolyPolygon, MergeViewState(aViewState), aRenderState, aStrokeAttributes);
+}
+
+css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ PresenterCanvas::fillPolyPolygon(
+ const css::uno::Reference<css::rendering::XPolyPolygon2D>& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->fillPolyPolygon(
+ xPolyPolygon, MergeViewState(aViewState), aRenderState);
+}
+
+css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ PresenterCanvas::fillTexturedPolyPolygon(
+ const css::uno::Reference<css::rendering::XPolyPolygon2D>& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ const css::uno::Sequence<css::rendering::Texture>& xTextures)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->fillTexturedPolyPolygon(
+ xPolyPolygon, MergeViewState(aViewState), aRenderState, xTextures);
+}
+
+css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ PresenterCanvas::fillTextureMappedPolyPolygon(
+ const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ const css::uno::Sequence< css::rendering::Texture >& xTextures,
+ const css::uno::Reference< css::geometry::XMapping2D >& xMapping)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->fillTextureMappedPolyPolygon(
+ xPolyPolygon, MergeViewState(aViewState), aRenderState, xTextures, xMapping);
+}
+
+css::uno::Reference<css::rendering::XCanvasFont> SAL_CALL
+ PresenterCanvas::createFont(
+ const css::rendering::FontRequest& aFontRequest,
+ const css::uno::Sequence< css::beans::PropertyValue >& aExtraFontProperties,
+ const css::geometry::Matrix2D& aFontMatrix)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->createFont(
+ aFontRequest, aExtraFontProperties, aFontMatrix);
+}
+
+css::uno::Sequence<css::rendering::FontInfo> SAL_CALL
+ PresenterCanvas::queryAvailableFonts(
+ const css::rendering::FontInfo& aFilter,
+ const css::uno::Sequence< css::beans::PropertyValue >& aFontProperties)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->queryAvailableFonts(aFilter, aFontProperties);
+}
+
+css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ PresenterCanvas::drawText(
+ const css::rendering::StringContext& aText,
+ const css::uno::Reference< css::rendering::XCanvasFont >& xFont,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ ::sal_Int8 nTextDirection)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->drawText(
+ aText, xFont, MergeViewState(aViewState), aRenderState, nTextDirection);
+}
+
+css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ PresenterCanvas::drawTextLayout(
+ const css::uno::Reference< css::rendering::XTextLayout >& xLayoutetText,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->drawTextLayout(
+ xLayoutetText, MergeViewState(aViewState), aRenderState);
+}
+
+css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ PresenterCanvas::drawBitmap(
+ const css::uno::Reference< css::rendering::XBitmap >& xBitmap,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->drawBitmap(
+ xBitmap, MergeViewState(aViewState), aRenderState);
+}
+
+css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ PresenterCanvas::drawBitmapModulated(
+ const css::uno::Reference< css::rendering::XBitmap>& xBitmap,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState)
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->drawBitmapModulated(
+ xBitmap, MergeViewState(aViewState), aRenderState);
+}
+
+css::uno::Reference<css::rendering::XGraphicDevice> SAL_CALL
+ PresenterCanvas::getDevice()
+{
+ ThrowIfDisposed();
+ return mxSharedCanvas->getDevice();
+}
+
+//----- XSpriteCanvas ---------------------------------------------------------
+
+Reference<rendering::XAnimatedSprite> SAL_CALL
+ PresenterCanvas::createSpriteFromAnimation (
+ const css::uno::Reference<css::rendering::XAnimation>& rAnimation)
+{
+ ThrowIfDisposed();
+
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxSharedCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ return xSpriteCanvas->createSpriteFromAnimation(rAnimation);
+ else
+ return nullptr;
+}
+
+Reference<rendering::XAnimatedSprite> SAL_CALL
+ PresenterCanvas::createSpriteFromBitmaps (
+ const css::uno::Sequence<
+ css::uno::Reference< css::rendering::XBitmap > >& rAnimationBitmaps,
+ ::sal_Int8 nInterpolationMode)
+{
+ ThrowIfDisposed();
+
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxSharedCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ return xSpriteCanvas->createSpriteFromBitmaps(rAnimationBitmaps, nInterpolationMode);
+ else
+ return nullptr;
+}
+
+Reference<rendering::XCustomSprite> SAL_CALL
+ PresenterCanvas::createCustomSprite (
+ const css::geometry::RealSize2D& rSpriteSize)
+{
+ ThrowIfDisposed();
+
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxSharedCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ return new PresenterCustomSprite(
+ this,
+ xSpriteCanvas->createCustomSprite(rSpriteSize),
+ mxSharedWindow);
+ else if (mxUpdateCanvas.is())
+ return new PresenterCustomSprite(
+ this,
+ mxUpdateCanvas->createCustomSprite(rSpriteSize),
+ mxUpdateWindow);
+ else
+ return nullptr;
+}
+
+Reference<rendering::XSprite> SAL_CALL
+ PresenterCanvas::createClonedSprite (
+ const css::uno::Reference< css::rendering::XSprite >& rxOriginal)
+{
+ ThrowIfDisposed();
+
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxSharedCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ return xSpriteCanvas->createClonedSprite(rxOriginal);
+ if (mxUpdateCanvas.is())
+ return mxUpdateCanvas->createClonedSprite(rxOriginal);
+ return nullptr;
+}
+
+sal_Bool SAL_CALL PresenterCanvas::updateScreen (sal_Bool bUpdateAll)
+{
+ ThrowIfDisposed();
+
+ mbOffsetUpdatePending = true;
+ if (m_pUpdateRequester != nullptr)
+ {
+ m_pUpdateRequester->RequestUpdate(bUpdateAll);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+//----- XEventListener --------------------------------------------------------
+
+void SAL_CALL PresenterCanvas::disposing (const css::lang::EventObject& rEvent)
+{
+ ThrowIfDisposed();
+ if (rEvent.Source == mxWindow)
+ mxWindow = nullptr;
+}
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL PresenterCanvas::windowResized (const css::awt::WindowEvent&)
+{
+ ThrowIfDisposed();
+ mbOffsetUpdatePending = true;
+}
+
+void SAL_CALL PresenterCanvas::windowMoved (const css::awt::WindowEvent&)
+{
+ ThrowIfDisposed();
+ mbOffsetUpdatePending = true;
+}
+
+void SAL_CALL PresenterCanvas::windowShown (const css::lang::EventObject&)
+{
+ ThrowIfDisposed();
+ mbOffsetUpdatePending = true;
+}
+
+void SAL_CALL PresenterCanvas::windowHidden (const css::lang::EventObject&)
+{
+ ThrowIfDisposed();
+}
+
+//----- XBitmap ---------------------------------------------------------------
+
+geometry::IntegerSize2D SAL_CALL PresenterCanvas::getSize()
+{
+ ThrowIfDisposed();
+
+ if (mxWindow.is())
+ {
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ return geometry::IntegerSize2D(aWindowBox.Width, aWindowBox.Height);
+ }
+ else
+ return geometry::IntegerSize2D(0,0);
+}
+
+sal_Bool SAL_CALL PresenterCanvas::hasAlpha()
+{
+ Reference<rendering::XBitmap> xBitmap (mxSharedCanvas, UNO_QUERY);
+ if (xBitmap.is())
+ return xBitmap->hasAlpha();
+ else
+ return false;
+}
+
+Reference<rendering::XBitmap> SAL_CALL PresenterCanvas::getScaledBitmap(
+ const css::geometry::RealSize2D&,
+ sal_Bool)
+{
+ ThrowIfDisposed();
+
+ // Not implemented.
+
+ return nullptr;
+}
+
+rendering::ViewState PresenterCanvas::MergeViewState (
+ const rendering::ViewState& rViewState)
+{
+ // Make sure the offset is up-to-date.
+ if (mbOffsetUpdatePending)
+ maOffset = GetOffset(mxSharedWindow);
+ return MergeViewState(rViewState, maOffset);
+}
+
+css::rendering::ViewState PresenterCanvas::MergeViewState (
+ const css::rendering::ViewState& rViewState,
+ const css::awt::Point& rOffset)
+{
+ // Early rejects.
+ if ( ! mxSharedCanvas.is())
+ return rViewState;
+
+ Reference<rendering::XGraphicDevice> xDevice (mxSharedCanvas->getDevice());
+ if ( ! xDevice.is())
+ return rViewState;
+
+ // Create a modifiable copy of the given view state.
+ rendering::ViewState aViewState (rViewState);
+
+ // Prepare the local clip rectangle.
+ ::basegfx::B2DRectangle aWindowRange (GetClipRectangle(aViewState.AffineTransform, rOffset));
+
+ // Adapt the offset of the view state.
+ aViewState.AffineTransform.m02 += rOffset.X;
+ aViewState.AffineTransform.m12 += rOffset.Y;
+
+ // Adapt the clip polygon.
+ if ( ! aViewState.Clip.is())
+ {
+ // Cancel out the later multiplication with the view state
+ // transformation.
+ aViewState.Clip = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
+ xDevice,
+ ::basegfx::B2DPolyPolygon(::basegfx::utils::createPolygonFromRect(aWindowRange)));
+ }
+ else
+ {
+ // Have to compute the intersection of the given clipping polygon in
+ // the view state and the local clip rectangle.
+
+ // Clip the view state clipping polygon against the local clip rectangle.
+ const ::basegfx::B2DPolyPolygon aClipPolygon (
+ ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(
+ aViewState.Clip));
+ const ::basegfx::B2DPolyPolygon aClippedClipPolygon (
+ ::basegfx::utils::clipPolyPolygonOnRange(
+ aClipPolygon,
+ aWindowRange,
+ true, /* bInside */
+ false /* bStroke */));
+
+ aViewState.Clip = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
+ xDevice,
+ aClippedClipPolygon);
+ }
+
+ return aViewState;
+}
+
+awt::Point PresenterCanvas::GetOffset (const Reference<awt::XWindow>& rxBaseWindow)
+{
+ mbOffsetUpdatePending = false;
+ if (mxWindow.is() && rxBaseWindow.is())
+ {
+ VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(mxWindow);
+ VclPtr<vcl::Window> pSharedWindow = VCLUnoHelper::GetWindow(rxBaseWindow);
+ if (pWindow && pSharedWindow)
+ {
+ ::tools::Rectangle aBox = pWindow->GetWindowExtentsRelative(pSharedWindow);
+
+ // Calculate offset of this canvas with respect to the shared
+ // canvas.
+ return awt::Point(aBox.Left(), aBox.Top());
+ }
+ }
+
+ return awt::Point(0, 0);
+}
+
+::basegfx::B2DRectangle PresenterCanvas::GetClipRectangle (
+ const css::geometry::AffineMatrix2D& rViewTransform,
+ const awt::Point& rOffset)
+{
+ VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(mxWindow);
+ if (!pWindow)
+ return ::basegfx::B2DRectangle();
+
+ VclPtr<vcl::Window> pSharedWindow = VCLUnoHelper::GetWindow(mxSharedWindow);
+ if (!pSharedWindow)
+ return ::basegfx::B2DRectangle();
+
+ // Get the bounding box of the window and create a range in the
+ // coordinate system of the child window.
+ // Use the window extents.
+ ::tools::Rectangle aLocalClip = pWindow->GetWindowExtentsRelative(pSharedWindow);
+
+ // The local clip rectangle is used to clip the view state clipping
+ // polygon.
+ ::basegfx::B2DRectangle aWindowRectangle (
+ aLocalClip.Left() - rOffset.X,
+ aLocalClip.Top() - rOffset.Y,
+ aLocalClip.Right() - rOffset.X + 1,
+ aLocalClip.Bottom() - rOffset.Y + 1);
+
+ // Calculate the inverted view state transformation to cancel out a
+ // later transformation of the local clip polygon with the view state
+ // transformation.
+ ::basegfx::B2DHomMatrix aInvertedViewStateTransformation;
+ ::basegfx::unotools::homMatrixFromAffineMatrix(
+ aInvertedViewStateTransformation,
+ rViewTransform);
+ if (aInvertedViewStateTransformation.invert())
+ {
+ // Cancel out the later multiplication with the view state
+ // transformation.
+ aWindowRectangle.transform(aInvertedViewStateTransformation);
+ }
+
+ return aWindowRectangle;
+}
+
+Reference<rendering::XPolyPolygon2D> PresenterCanvas::UpdateSpriteClip (
+ const Reference<rendering::XPolyPolygon2D>& rxOriginalClip,
+ const geometry::RealPoint2D& rLocation)
+{
+ // Check used resources and just return the original clip when not
+ // every one of them is available.
+ if ( ! mxWindow.is())
+ return rxOriginalClip;
+
+ Reference<rendering::XGraphicDevice> xDevice (mxSharedCanvas->getDevice());
+ if ( ! xDevice.is())
+ return rxOriginalClip;
+
+ // Determine the bounds of the clip rectangle (the window border) in the
+ // coordinate system of the sprite.
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ const double nMinX (-rLocation.X);
+ const double nMinY (-rLocation.Y);
+ const double nMaxX (aWindowBox.Width-rLocation.X);
+ const double nMaxY (aWindowBox.Height-rLocation.Y);
+
+ // Create a clip polygon.
+ Reference<rendering::XPolyPolygon2D> xPolygon;
+ if (rxOriginalClip.is())
+ {
+ // Combine the original clip with the window clip.
+ const ::basegfx::B2DPolyPolygon aOriginalClip (
+ ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rxOriginalClip));
+ ::basegfx::B2DRectangle aWindowRange (nMinX, nMinY, nMaxX, nMaxY);
+ const ::basegfx::B2DPolyPolygon aClippedClipPolygon (
+ ::basegfx::utils::clipPolyPolygonOnRange(
+ aOriginalClip,
+ aWindowRange,
+ true, /* bInside */
+ false /* bStroke */));
+ xPolygon = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
+ xDevice,
+ aClippedClipPolygon);
+ }
+ else
+ {
+ // Create a new clip polygon from the window clip rectangle.
+ Sequence<Sequence<geometry::RealPoint2D> > aPoints
+ {
+ {
+ { nMinX,nMinY },
+ { nMaxX,nMinY },
+ { nMaxX,nMaxY },
+ { nMinX,nMaxY }
+ }
+ };
+ Reference<rendering::XLinePolyPolygon2D> xLinePolygon(
+ xDevice->createCompatibleLinePolyPolygon(aPoints));
+ if (xLinePolygon.is())
+ xLinePolygon->setClosed(0, true);
+ xPolygon = xLinePolygon;
+ }
+
+ return xPolygon;
+}
+
+void PresenterCanvas::ThrowIfDisposed()
+{
+ if (m_bDisposed || ! mxSharedCanvas.is())
+ {
+ throw lang::DisposedException ("PresenterCanvas object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+//===== PresenterCustomSprite =================================================
+
+PresenterCustomSprite::PresenterCustomSprite (
+ const rtl::Reference<PresenterCanvas>& rpCanvas,
+ const Reference<rendering::XCustomSprite>& rxSprite,
+ const Reference<awt::XWindow>& rxBaseWindow)
+ : mpCanvas(rpCanvas),
+ mxSprite(rxSprite),
+ mxBaseWindow(rxBaseWindow),
+ maPosition(0,0)
+{
+}
+
+void PresenterCustomSprite::disposing(std::unique_lock<std::mutex>&)
+{
+ Reference<XComponent> xComponent (mxSprite, UNO_QUERY);
+ mxSprite = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ mpCanvas.clear();
+}
+
+//----- XSprite ---------------------------------------------------------------
+
+void SAL_CALL PresenterCustomSprite::setAlpha (const double nAlpha)
+{
+ ThrowIfDisposed();
+ mxSprite->setAlpha(nAlpha);
+}
+
+void SAL_CALL PresenterCustomSprite::move (
+ const geometry::RealPoint2D& rNewPos,
+ const rendering::ViewState& rViewState,
+ const rendering::RenderState& rRenderState)
+{
+ ThrowIfDisposed();
+ maPosition = rNewPos;
+ mxSprite->move(
+ rNewPos,
+ mpCanvas->MergeViewState(rViewState, mpCanvas->GetOffset(mxBaseWindow)),
+ rRenderState);
+ // Clip sprite against window bounds. This call is necessary because
+ // sprite clipping is done in the coordinate system of the sprite.
+ // Therefore, after each change of the sprites location the window
+ // bounds have to be transformed into the sprites coordinate system.
+ clip(nullptr);
+}
+
+void SAL_CALL PresenterCustomSprite::transform (const geometry::AffineMatrix2D& rTransformation)
+{
+ ThrowIfDisposed();
+ mxSprite->transform(rTransformation);
+}
+
+void SAL_CALL PresenterCustomSprite::clip (const Reference<rendering::XPolyPolygon2D>& rxClip)
+{
+ ThrowIfDisposed();
+ // The clip region is expected in the coordinate system of the sprite.
+ // UpdateSpriteClip() integrates the window bounds, transformed into the
+ // sprites coordinate system, with the given clip.
+ mxSprite->clip(mpCanvas->UpdateSpriteClip(rxClip, maPosition));
+}
+
+void SAL_CALL PresenterCustomSprite::setPriority (const double nPriority)
+{
+ ThrowIfDisposed();
+ mxSprite->setPriority(nPriority);
+}
+
+void SAL_CALL PresenterCustomSprite::show()
+{
+ ThrowIfDisposed();
+ mxSprite->show();
+}
+
+void SAL_CALL PresenterCustomSprite::hide()
+{
+ ThrowIfDisposed();
+ mxSprite->hide();
+}
+
+//----- XCustomSprite ---------------------------------------------------------
+
+Reference<rendering::XCanvas> PresenterCustomSprite::getContentCanvas()
+{
+ ThrowIfDisposed();
+ return mxSprite->getContentCanvas();
+}
+
+void PresenterCustomSprite::ThrowIfDisposed()
+{
+ if (m_bDisposed || ! mxSprite.is())
+ {
+ throw lang::DisposedException ("PresenterCustomSprite object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+} // end of namespace ::sd::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/presenter/PresenterCanvas.hxx b/sd/source/ui/presenter/PresenterCanvas.hxx
new file mode 100644
index 000000000..da2f51a79
--- /dev/null
+++ b/sd/source/ui/presenter/PresenterCanvas.hxx
@@ -0,0 +1,320 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <basegfx/range/b2drectangle.hxx>
+#include <com/sun/star/awt/Point.hpp>
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/rendering/XSpriteCanvas.hpp>
+#include <com/sun/star/rendering/XBitmap.hpp>
+#include <comphelper/compbase.hxx>
+#include <memory>
+
+namespace sd::presenter { class CanvasUpdateRequester; }
+namespace com::sun::star::awt { class XWindow; }
+namespace com::sun::star::geometry { struct AffineMatrix2D; }
+
+namespace sd::presenter {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::rendering::XSpriteCanvas,
+ css::rendering::XBitmap,
+ css::awt::XWindowListener
+> PresenterCanvasInterfaceBase;
+
+/** Wrapper around a shared canvas that forwards most of its methods to the
+ shared canvas. Most notable differences are:
+ 1. The transformation of the ViewState of forwarded calls is modified by adding
+ an offset.
+ 2. The clip polygon of the ViewState of forwarded calls is intersected
+ with a clip rectangle that can be set via SetClip().
+ 3. Calls to updateScreen() are collected. One call to the updateScreen()
+ method of the shared canvas is made asynchronously.
+
+ The canvas can use different canvases for sharing and for sprite
+ construction. This allows the shared canvas to be a canvas of sprite itself.
+*/
+class PresenterCanvas
+ : public PresenterCanvasInterfaceBase
+{
+public:
+ /** This constructor is used when a PresenterCanvas object is created
+ directly, typically by the PresenterCanvasFactory.
+ @param rxUpdateCanvas
+ This canvas is used to call updateScreen() at and to create
+ sprites. In the typical case this canvas is identical to the
+ rxSharedCanvas argument.
+ @param rxUpdateWindow
+ The window that belongs to the canvas given by the
+ rxUpdateCanvas argument.
+ @param rxSharedCanvas
+ The canvas that is wrapped by the new instance of this class.
+ Typically this is a regular XSpriteCanvas and then is identical
+ to the one given by the rxUpdateCanvas argument. It may be the
+ canvas of a sprite which does not support the XSpriteCanvas
+ interface. In that case the canvas that created the sprite can
+ be given as rxUpdateCanvas argument to allow to create further
+ sprites and to have proper calls to updateScreen().
+ @param rxSharedWindow
+ The window that belongs to the canvas given by the
+ rxSharedCanvas argument.
+ @param rxWindow
+ The window that is represented by the new PresenterCanvas
+ object. It is expected to be a direct descendant of
+ rxSharedWindow. Its position inside rxSharedWindow defines the
+ offset of the canvas implemented by the new PresenterCanvas
+ object and rxSharedCanvas.
+ */
+ PresenterCanvas (
+ const css::uno::Reference<css::rendering::XSpriteCanvas>& rxUpdateCanvas,
+ const css::uno::Reference<css::awt::XWindow>& rxUpdateWindow,
+ const css::uno::Reference<css::rendering::XCanvas>& rxSharedCanvas,
+ const css::uno::Reference<css::awt::XWindow>& rxSharedWindow,
+ const css::uno::Reference<css::awt::XWindow>& rxWindow);
+ virtual ~PresenterCanvas() override;
+ PresenterCanvas(const PresenterCanvas&) = delete;
+ PresenterCanvas& operator=(const PresenterCanvas&) = delete;
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ css::awt::Point GetOffset (const css::uno::Reference<css::awt::XWindow>& rxBaseWindow);
+
+ /** Merge the given view state with the view state that translates the
+ (virtual) child canvas to the shared canvas.
+ */
+ css::rendering::ViewState MergeViewState (
+ const css::rendering::ViewState& rViewState,
+ const css::awt::Point& raOffset);
+
+ /** Called by custom sprites to update their clip polygon so that they
+ are clipped at the borders of the canvas. This method has to be
+ called after each change of the sprite location so that the bounds
+ of the canvas can be transformed into the coordinate system of the
+ sprite.
+ */
+ css::uno::Reference<css::rendering::XPolyPolygon2D> UpdateSpriteClip (
+ const css::uno::Reference<css::rendering::XPolyPolygon2D>& rxOriginalClip,
+ const css::geometry::RealPoint2D& rLocation);
+
+ // XCanvas
+
+ virtual void SAL_CALL clear() override;
+
+ virtual void SAL_CALL drawPoint (
+ const css::geometry::RealPoint2D& aPoint,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState) override;
+
+ virtual void SAL_CALL drawLine (
+ const css::geometry::RealPoint2D& aStartPoint,
+ const css::geometry::RealPoint2D& aEndPoint,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState) override;
+
+ virtual void SAL_CALL drawBezier (
+ const css::geometry::RealBezierSegment2D& aBezierSegment,
+ const css::geometry::RealPoint2D& aEndPoint,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState) override;
+
+ virtual css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL drawPolyPolygon (
+ const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState) override;
+
+ virtual css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL strokePolyPolygon (
+ const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ const css::rendering::StrokeAttributes& aStrokeAttributes) override;
+
+ virtual css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ strokeTexturedPolyPolygon (
+ const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ const css::uno::Sequence< css::rendering::Texture >& aTextures,
+ const css::rendering::StrokeAttributes& aStrokeAttributes) override;
+
+ virtual css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ strokeTextureMappedPolyPolygon(
+ const css::uno::Reference<css::rendering::XPolyPolygon2D >& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ const css::uno::Sequence<css::rendering::Texture>& aTextures,
+ const css::uno::Reference<css::geometry::XMapping2D>& xMapping,
+ const css::rendering::StrokeAttributes& aStrokeAttributes) override;
+
+ virtual css::uno::Reference<css::rendering::XPolyPolygon2D> SAL_CALL
+ queryStrokeShapes(
+ const css::uno::Reference<css::rendering::XPolyPolygon2D>& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ const css::rendering::StrokeAttributes& aStrokeAttributes) override;
+
+ virtual css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ fillPolyPolygon(
+ const css::uno::Reference<css::rendering::XPolyPolygon2D>& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState) override;
+
+ virtual css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ fillTexturedPolyPolygon(
+ const css::uno::Reference<css::rendering::XPolyPolygon2D>& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ const css::uno::Sequence<css::rendering::Texture>& xTextures) override;
+
+ virtual css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ fillTextureMappedPolyPolygon(
+ const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ const css::uno::Sequence< css::rendering::Texture >& xTextures,
+ const css::uno::Reference< css::geometry::XMapping2D >& xMapping) override;
+
+ virtual css::uno::Reference<css::rendering::XCanvasFont> SAL_CALL
+ createFont(
+ const css::rendering::FontRequest& aFontRequest,
+ const css::uno::Sequence< css::beans::PropertyValue >& aExtraFontProperties,
+ const css::geometry::Matrix2D& aFontMatrix) override;
+
+ virtual css::uno::Sequence<css::rendering::FontInfo> SAL_CALL
+ queryAvailableFonts(
+ const css::rendering::FontInfo& aFilter,
+ const css::uno::Sequence< css::beans::PropertyValue >& aFontProperties) override;
+
+ virtual css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ drawText(
+ const css::rendering::StringContext& aText,
+ const css::uno::Reference< css::rendering::XCanvasFont >& xFont,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState,
+ ::sal_Int8 nTextDirection) override;
+
+ virtual css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ drawTextLayout(
+ const css::uno::Reference< css::rendering::XTextLayout >& xLayoutetText,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState) override;
+
+ virtual css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ drawBitmap(
+ const css::uno::Reference< css::rendering::XBitmap >& xBitmap,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState) override;
+
+ virtual css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
+ drawBitmapModulated(
+ const css::uno::Reference< css::rendering::XBitmap>& xBitmap,
+ const css::rendering::ViewState& aViewState,
+ const css::rendering::RenderState& aRenderState) override;
+
+ virtual css::uno::Reference<css::rendering::XGraphicDevice> SAL_CALL
+ getDevice() override;
+
+ // XSpriteCanvas
+
+ css::uno::Reference< css::rendering::XAnimatedSprite > SAL_CALL
+ createSpriteFromAnimation (
+ const css::uno::Reference< css::rendering::XAnimation >& animation) override;
+
+ css::uno::Reference< css::rendering::XAnimatedSprite > SAL_CALL
+ createSpriteFromBitmaps (
+ const css::uno::Sequence<
+ css::uno::Reference< css::rendering::XBitmap > >& animationBitmaps,
+ ::sal_Int8 interpolationMode) override;
+
+ css::uno::Reference< css::rendering::XCustomSprite > SAL_CALL
+ createCustomSprite (
+ const css::geometry::RealSize2D& spriteSize) override;
+
+ css::uno::Reference< css::rendering::XSprite > SAL_CALL
+ createClonedSprite (
+ const css::uno::Reference< css::rendering::XSprite >& original) override;
+
+ sal_Bool SAL_CALL updateScreen (sal_Bool bUpdateAll) override;
+
+ // XEventListener
+
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override;
+
+ // XBitmap
+
+ virtual css::geometry::IntegerSize2D SAL_CALL getSize() override;
+
+ virtual sal_Bool SAL_CALL hasAlpha() override;
+
+ virtual css::uno::Reference<css::rendering::XBitmap> SAL_CALL getScaledBitmap(
+ const css::geometry::RealSize2D& rNewSize,
+ sal_Bool bFast) override;
+
+private:
+ css::uno::Reference<css::rendering::XSpriteCanvas> mxUpdateCanvas;
+ css::uno::Reference<css::awt::XWindow> mxUpdateWindow;
+ css::uno::Reference<css::rendering::XCanvas> mxSharedCanvas;
+ css::uno::Reference<css::awt::XWindow> mxSharedWindow;
+
+ /** The window for which a canvas is emulated.
+ */
+ css::uno::Reference<css::awt::XWindow> mxWindow;
+
+ /** Offset of the emulated canvas with respect to the shared canvas.
+ */
+ css::awt::Point maOffset;
+
+ /** The UpdateRequester is used by updateScreen() to schedule
+ updateScreen() calls at the shared canvas.
+ */
+ std::shared_ptr<CanvasUpdateRequester> m_pUpdateRequester;
+
+ /** When this flag is true (it is set to true after every call to
+ updateScreen()) then the next call to MergeViewState updates the
+ maOffset member. A possible optimization would set this flag only
+ to true when one of the windows between mxWindow and mxSharedWindow
+ changes its position.
+ */
+ bool mbOffsetUpdatePending;
+
+ ::basegfx::B2DRectangle GetClipRectangle (
+ const css::geometry::AffineMatrix2D& rViewTransform,
+ const css::awt::Point& rOffset);
+
+ css::rendering::ViewState MergeViewState (const css::rendering::ViewState& rViewState);
+
+ /** @throws css::lang::DisposedException when the object has already been
+ disposed.
+ */
+ void ThrowIfDisposed();
+};
+
+} // end of namespace ::sd::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/presenter/PresenterHelper.cxx b/sd/source/ui/presenter/PresenterHelper.cxx
new file mode 100644
index 000000000..a93113a75
--- /dev/null
+++ b/sd/source/ui/presenter/PresenterHelper.cxx
@@ -0,0 +1,466 @@
+/* -*- 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 "PresenterHelper.hxx"
+#include "PresenterCanvas.hxx"
+#include <cppcanvas/vclfactory.hxx>
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <vcl/window.hxx>
+#include <vcl/wrkwin.hxx>
+
+
+#include <bitmaps.hlst>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd::presenter {
+
+//===== PresenterHelper =======================================================
+
+PresenterHelper::PresenterHelper (
+ const Reference<XComponentContext>& rxContext)
+ : mxComponentContext(rxContext)
+{
+}
+
+PresenterHelper::~PresenterHelper()
+{
+}
+
+//----- XInitialize -----------------------------------------------------------
+
+void SAL_CALL PresenterHelper::initialize (const Sequence<Any>&) {}
+
+//----- XPaneHelper ----------------------------------------------------
+
+Reference<awt::XWindow> SAL_CALL PresenterHelper::createWindow (
+ const Reference<awt::XWindow>& rxParentWindow,
+ sal_Bool bCreateSystemChildWindow,
+ sal_Bool bInitiallyVisible,
+ sal_Bool bEnableChildTransparentMode,
+ sal_Bool bEnableParentClip)
+{
+ VclPtr<vcl::Window> pParentWindow(VCLUnoHelper::GetWindow(rxParentWindow));
+
+ // Create a new window.
+ VclPtr<vcl::Window> pWindow;
+ if (bCreateSystemChildWindow)
+ {
+ pWindow = VclPtr<WorkWindow>::Create(pParentWindow, WB_SYSTEMCHILDWINDOW);
+ }
+ else
+ {
+ pWindow = VclPtr<vcl::Window>::Create(pParentWindow);
+ }
+ Reference<awt::XWindow> xWindow (pWindow->GetComponentInterface(), UNO_QUERY);
+
+ if (bEnableChildTransparentMode)
+ {
+ // Make the frame window transparent and make the parent able to
+ // draw behind it.
+ if (pParentWindow)
+ pParentWindow->EnableChildTransparentMode();
+ }
+
+ pWindow->Show(bInitiallyVisible);
+
+ pWindow->SetMapMode(MapMode(MapUnit::MapPixel));
+ pWindow->SetBackground();
+ if ( ! bEnableParentClip)
+ {
+ pWindow->SetParentClipMode(ParentClipMode::NoClip);
+ pWindow->SetPaintTransparent(true);
+ }
+ else
+ {
+ pWindow->SetParentClipMode(ParentClipMode::Clip);
+ pWindow->SetPaintTransparent(false);
+ }
+
+ return xWindow;
+}
+
+Reference<rendering::XCanvas> SAL_CALL PresenterHelper::createSharedCanvas (
+ const Reference<rendering::XSpriteCanvas>& rxUpdateCanvas,
+ const Reference<awt::XWindow>& rxUpdateWindow,
+ const Reference<rendering::XCanvas>& rxSharedCanvas,
+ const Reference<awt::XWindow>& rxSharedWindow,
+ const Reference<awt::XWindow>& rxWindow)
+{
+ if ( ! rxSharedCanvas.is()
+ || ! rxSharedWindow.is()
+ || ! rxWindow.is())
+ {
+ throw RuntimeException("illegal argument", static_cast<XWeak*>(this));
+ }
+
+ if (rxWindow == rxSharedWindow)
+ return rxSharedCanvas;
+ else
+ return new PresenterCanvas(
+ rxUpdateCanvas,
+ rxUpdateWindow,
+ rxSharedCanvas,
+ rxSharedWindow,
+ rxWindow);
+}
+
+Reference<rendering::XCanvas> SAL_CALL PresenterHelper::createCanvas (
+ const Reference<awt::XWindow>& rxWindow,
+ sal_Int16,
+ const OUString& rsOptionalCanvasServiceName)
+{
+ // No shared window is given or an explicit canvas service name is
+ // specified. Create a new canvas.
+ VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(rxWindow);
+ if (!pWindow)
+ throw RuntimeException();
+
+ Sequence<Any> aArg{ // common: first any is VCL pointer to window (for VCL canvas)
+ Any(reinterpret_cast<sal_Int64>(pWindow.get())),
+ Any(css::awt::Rectangle()),
+ Any(false),
+ Any(rxWindow)
+ };
+
+ Reference<lang::XMultiServiceFactory> xFactory (
+ mxComponentContext->getServiceManager(), UNO_QUERY_THROW);
+ return Reference<rendering::XCanvas>(
+ xFactory->createInstanceWithArguments(
+ !rsOptionalCanvasServiceName.isEmpty()
+ ? rsOptionalCanvasServiceName
+ : OUString("com.sun.star.rendering.Canvas.VCL"),
+ aArg),
+ UNO_QUERY);
+}
+
+void SAL_CALL PresenterHelper::toTop (
+ const Reference<awt::XWindow>& rxWindow)
+{
+ VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(rxWindow);
+ if (pWindow)
+ {
+ pWindow->ToTop();
+ pWindow->SetZOrder(nullptr, ZOrderFlags::Last);
+ }
+}
+
+namespace {
+
+struct IdMapEntry {
+ char const * sid;
+ rtl::OUStringConstExpr bmpid;
+};
+
+}
+
+Reference<rendering::XBitmap> SAL_CALL PresenterHelper::loadBitmap (
+ const OUString& id,
+ const Reference<rendering::XCanvas>& rxCanvas)
+{
+ if ( ! rxCanvas.is())
+ return nullptr;
+
+ static IdMapEntry const map[] = {
+ { "bitmaps/Background.png", BMP_PRESENTERSCREEN_BACKGROUND },
+ { "bitmaps/Animation.png",
+ BMP_PRESENTERSCREEN_ANIMATION },
+ { "bitmaps/Transition.png",
+ BMP_PRESENTERSCREEN_TRANSITION },
+ { "bitmaps/BorderActiveBottom.png",
+ BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM },
+ { "bitmaps/BorderActiveBottomCallout.png",
+ BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM_CALLOUT },
+ { "bitmaps/BorderActiveBottomLeft.png",
+ BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM_LEFT },
+ { "bitmaps/BorderActiveBottomRight.png",
+ BMP_PRESENTERSCREEN_BORDER_ACTIVE_BOTTOM_RIGHT },
+ { "bitmaps/BorderActiveLeft.png",
+ BMP_PRESENTERSCREEN_BORDER_ACTIVE_LEFT },
+ { "bitmaps/BorderActiveRight.png",
+ BMP_PRESENTERSCREEN_BORDER_ACTIVE_RIGHT },
+ { "bitmaps/BorderActiveTop.png",
+ BMP_PRESENTERSCREEN_BORDER_ACTIVE_TOP },
+ { "bitmaps/BorderActiveTopLeft.png",
+ BMP_PRESENTERSCREEN_BORDER_ACTIVE_TOP_LEFT },
+ { "bitmaps/BorderActiveTopRight.png",
+ BMP_PRESENTERSCREEN_BORDER_ACTIVE_TOP_RIGHT },
+ { "bitmaps/BorderBottom.png", BMP_PRESENTERSCREEN_BORDER_BOTTOM },
+ { "bitmaps/BorderBottomLeft.png",
+ BMP_PRESENTERSCREEN_BORDER_BOTTOM_LEFT },
+ { "bitmaps/BorderBottomRight.png",
+ BMP_PRESENTERSCREEN_BORDER_BOTTOM_RIGHT },
+ { "bitmaps/BorderCurrentSlideBottom.png",
+ BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_BOTTOM },
+ { "bitmaps/BorderCurrentSlideBottomLeft.png",
+ BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_BOTTOM_LEFT },
+ { "bitmaps/BorderCurrentSlideBottomRight.png",
+ BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_BOTTOM_RIGHT },
+ { "bitmaps/BorderCurrentSlideLeft.png",
+ BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_LEFT },
+ { "bitmaps/BorderCurrentSlideRight.png",
+ BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_RIGHT },
+ { "bitmaps/BorderCurrentSlideTop.png",
+ BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_TOP },
+ { "bitmaps/BorderCurrentSlideTopLeft.png",
+ BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_TOP_LEFT },
+ { "bitmaps/BorderCurrentSlideTopRight.png",
+ BMP_PRESENTERSCREEN_BORDER_CURRENT_SLIDE_TOP_RIGHT },
+ { "bitmaps/BorderLeft.png", BMP_PRESENTERSCREEN_BORDER_LEFT },
+ { "bitmaps/BorderRight.png", BMP_PRESENTERSCREEN_BORDER_RIGHT },
+ { "bitmaps/BorderToolbarBottom.png",
+ BMP_PRESENTERSCREEN_BORDER_TOOLBAR_BOTTOM },
+ { "bitmaps/BorderToolbarLeft.png",
+ BMP_PRESENTERSCREEN_BORDER_TOOLBAR_LEFT },
+ { "bitmaps/BorderToolbarRight.png",
+ BMP_PRESENTERSCREEN_BORDER_TOOLBAR_RIGHT },
+ { "bitmaps/BorderToolbarTop.png",
+ BMP_PRESENTERSCREEN_BORDER_TOOLBAR_TOP },
+ { "bitmaps/BorderToolbarTopLeft.png",
+ BMP_PRESENTERSCREEN_BORDER_TOOLBAR_TOP_LEFT },
+ { "bitmaps/BorderToolbarTopRight.png",
+ BMP_PRESENTERSCREEN_BORDER_TOOLBAR_TOP_RIGHT },
+ { "bitmaps/BorderTop.png", BMP_PRESENTERSCREEN_BORDER_TOP },
+ { "bitmaps/BorderTopLeft.png", BMP_PRESENTERSCREEN_BORDER_TOP_LEFT },
+ { "bitmaps/BorderTopRight.png", BMP_PRESENTERSCREEN_BORDER_TOP_RIGHT },
+ { "bitmaps/ButtonEffectNextDisabled.png",
+ BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_DISABLED },
+ { "bitmaps/ButtonEffectNextMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_MOUSE_OVER },
+ { "bitmaps/ButtonEffectNextNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_NORMAL },
+ { "bitmaps/ButtonEffectNextSelected.png",
+ BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_SELECTED },
+ { "bitmaps/ButtonFrameCenterMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_FRAME_CENTER_MOUSE_OVER },
+ { "bitmaps/ButtonFrameCenterNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_FRAME_CENTER_NORMAL },
+ { "bitmaps/ButtonFrameLeftMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_FRAME_LEFT_MOUSE_OVER },
+ { "bitmaps/ButtonFrameLeftNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_FRAME_LEFT_NORMAL },
+ { "bitmaps/ButtonFrameRightMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_FRAME_RIGHT_MOUSE_OVER },
+ { "bitmaps/ButtonFrameRightNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_FRAME_RIGHT_NORMAL },
+ { "bitmaps/ButtonHelpDisabled.png",
+ BMP_PRESENTERSCREEN_BUTTON_HELP_DISABLED },
+ { "bitmaps/ButtonHelpMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_HELP_MOUSE_OVER },
+ { "bitmaps/ButtonHelpNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_HELP_NORMAL },
+ { "bitmaps/ButtonHelpSelected.png",
+ BMP_PRESENTERSCREEN_BUTTON_HELP_SELECTED },
+ { "bitmaps/ButtonExitPresenterMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_EXIT_PRESENTER_MOUSE_OVER },
+ { "bitmaps/ButtonExitPresenterNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_EXIT_PRESENTER_NORMAL },
+ { "bitmaps/ButtonMinusDisabled.png",
+ BMP_PRESENTERSCREEN_BUTTON_MINUS_DISABLED },
+ { "bitmaps/ButtonMinusMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_MINUS_MOUSE_OVER },
+ { "bitmaps/ButtonMinusNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_MINUS_NORMAL },
+ { "bitmaps/ButtonMinusSelected.png",
+ BMP_PRESENTERSCREEN_BUTTON_MINUS_SELECTED },
+ { "bitmaps/ButtonNotesDisabled.png",
+ BMP_PRESENTERSCREEN_BUTTON_NOTES_DISABLED },
+ { "bitmaps/ButtonNotesMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_NOTES_MOUSE_OVER },
+ { "bitmaps/ButtonNotesNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_NOTES_NORMAL },
+ { "bitmaps/ButtonNotesSelected.png",
+ BMP_PRESENTERSCREEN_BUTTON_NOTES_SELECTED },
+ { "bitmaps/ButtonPlusDisabled.png",
+ BMP_PRESENTERSCREEN_BUTTON_PLUS_DISABLED },
+ { "bitmaps/ButtonPlusMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_PLUS_MOUSE_OVER },
+ { "bitmaps/ButtonPlusNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_PLUS_NORMAL },
+ { "bitmaps/ButtonPlusSelected.png",
+ BMP_PRESENTERSCREEN_BUTTON_PLUS_SELECTED },
+ { "bitmaps/ButtonSlideNextDisabled.png",
+ BMP_PRESENTERSCREEN_BUTTON_SLIDE_NEXT_DISABLED },
+ { "bitmaps/ButtonSlideNextMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_SLIDE_NEXT_MOUSE_OVER },
+ { "bitmaps/ButtonSlideNextNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_SLIDE_NEXT_NORMAL },
+ { "bitmaps/ButtonSlidePreviousDisabled.png",
+ BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_DISABLED },
+ { "bitmaps/ButtonSlidePreviousMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_MOUSE_OVER },
+ { "bitmaps/ButtonSlidePreviousNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_NORMAL },
+ { "bitmaps/ButtonSlidePreviousSelected.png",
+ BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_SELECTED },
+ { "bitmaps/ButtonSlideSorterDisabled.png",
+ BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_DISABLED },
+ { "bitmaps/ButtonSlideSorterMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_MOUSE_OVER },
+ { "bitmaps/ButtonSlideSorterNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_NORMAL },
+ { "bitmaps/ButtonSlideSorterSelected.png",
+ BMP_PRESENTERSCREEN_BUTTON_SLIDE_SORTER_SELECTED },
+ { "bitmaps/ButtonSwitchMonitorMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_SWITCH_MONITOR_MOUSE_OVER },
+ { "bitmaps/ButtonSwitchMonitorNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_SWITCH_MONITOR_NORMAL },
+ { "bitmaps/ButtonRestartTimerMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_RESTART_TIMER_MOUSE_OVER },
+ { "bitmaps/ButtonRestartTimerNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_RESTART_TIMER_NORMAL },
+ { "bitmaps/ButtonPauseTimerMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_PAUSE_TIMER_MOUSE_OVER },
+ { "bitmaps/ButtonPauseTimerNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_PAUSE_TIMER_NORMAL },
+ { "bitmaps/ButtonResumeTimerMouseOver.png",
+ BMP_PRESENTERSCREEN_BUTTON_RESUME_TIMER_MOUSE_OVER },
+ { "bitmaps/ButtonResumeTimerNormal.png",
+ BMP_PRESENTERSCREEN_BUTTON_RESUME_TIMER_NORMAL },
+ { "bitmaps/LabelMouseOverCenter.png",
+ BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_CENTER },
+ { "bitmaps/LabelMouseOverLeft.png",
+ BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_LEFT },
+ { "bitmaps/LabelMouseOverRight.png",
+ BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_RIGHT },
+ { "bitmaps/ScrollbarArrowDownDisabled.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_DISABLED },
+ { "bitmaps/ScrollbarArrowDownMouseOver.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_MOUSE_OVER },
+ { "bitmaps/ScrollbarArrowDownNormal.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_NORMAL },
+ { "bitmaps/ScrollbarArrowDownSelected.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_DOWN_SELECTED },
+ { "bitmaps/ScrollbarArrowUpDisabled.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_DISABLED },
+ { "bitmaps/ScrollbarArrowUpMouseOver.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_MOUSE_OVER },
+ { "bitmaps/ScrollbarArrowUpNormal.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_NORMAL },
+ { "bitmaps/ScrollbarArrowUpSelected.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_ARROW_UP_SELECTED },
+ { "bitmaps/ScrollbarPagerMiddleMouseOver.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_PAGER_MIDDLE_MOUSE_OVER },
+ { "bitmaps/ScrollbarPagerMiddleNormal.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_PAGER_MIDDLE_NORMAL },
+ { "bitmaps/ScrollbarThumbBottomMouseOver.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_BOTTOM_MOUSE_OVER },
+ { "bitmaps/ScrollbarThumbBottomNormal.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_BOTTOM_NORMAL },
+ { "bitmaps/ScrollbarThumbMiddleMouseOver.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_MIDDLE_MOUSE_OVER },
+ { "bitmaps/ScrollbarThumbMiddleNormal.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_MIDDLE_NORMAL },
+ { "bitmaps/ScrollbarThumbTopMouseOver.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_TOP_MOUSE_OVER },
+ { "bitmaps/ScrollbarThumbTopNormal.png",
+ BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_TOP_NORMAL },
+ { "bitmaps/ViewBackground.png", BMP_PRESENTERSCREEN_VIEW_BACKGROUND },
+ { "bitmaps/Separator.png",
+ BMP_PRESENTERSCREEN_SEPARATOR }
+ };
+ OUString bmpid;
+ for (std::size_t i = 0; i != SAL_N_ELEMENTS(map); ++i) {
+ if (id.equalsAscii(map[i].sid)) {
+ bmpid = map[i].bmpid;
+ break;
+ }
+ }
+ if (bmpid.isEmpty()) {
+ return nullptr;
+ }
+
+ ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
+
+ const cppcanvas::CanvasSharedPtr pCanvas (
+ cppcanvas::VCLFactory::createCanvas(rxCanvas));
+
+ if (pCanvas)
+ {
+ BitmapEx aBitmapEx(bmpid);
+ cppcanvas::BitmapSharedPtr xBitmap(
+ cppcanvas::VCLFactory::createBitmap(pCanvas,
+ aBitmapEx));
+ if (!xBitmap)
+ return nullptr;
+ return xBitmap->getUNOBitmap();
+ }
+
+ return nullptr;
+}
+
+void SAL_CALL PresenterHelper::captureMouse (
+ const Reference<awt::XWindow>& rxWindow)
+{
+ ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
+
+ // Capture the mouse (if not already done.)
+ VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(rxWindow);
+ if (pWindow && ! pWindow->IsMouseCaptured())
+ {
+ pWindow->CaptureMouse();
+ }
+}
+
+void SAL_CALL PresenterHelper::releaseMouse (const Reference<awt::XWindow>& rxWindow)
+{
+ ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
+
+ // Release the mouse (if not already done.)
+ VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(rxWindow);
+ if (pWindow && pWindow->IsMouseCaptured())
+ {
+ pWindow->ReleaseMouse();
+ }
+}
+
+awt::Rectangle PresenterHelper::getWindowExtentsRelative (
+ const Reference<awt::XWindow>& rxChildWindow,
+ const Reference<awt::XWindow>& rxParentWindow)
+{
+ VclPtr<vcl::Window> pChildWindow = VCLUnoHelper::GetWindow(rxChildWindow);
+ VclPtr<vcl::Window> pParentWindow = VCLUnoHelper::GetWindow(rxParentWindow);
+ if (pChildWindow && pParentWindow)
+ {
+ ::tools::Rectangle aBox (pChildWindow->GetWindowExtentsRelative(pParentWindow));
+ return awt::Rectangle(aBox.Left(),aBox.Top(),aBox.GetWidth(),aBox.GetHeight());
+ }
+ else
+ return awt::Rectangle();
+}
+
+} // end of namespace ::sd::presenter
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_PresenterHelper_get_implementation(css::uno::XComponentContext* context,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::presenter::PresenterHelper(context));
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/presenter/PresenterHelper.hxx b/sd/source/ui/presenter/PresenterHelper.hxx
new file mode 100644
index 000000000..cee7e39fb
--- /dev/null
+++ b/sd/source/ui/presenter/PresenterHelper.hxx
@@ -0,0 +1,93 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/XPresenterHelper.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <comphelper/compbase.hxx>
+
+namespace com::sun::star::uno { class XComponentContext; }
+
+namespace sd::presenter {
+
+typedef comphelper::WeakComponentImplHelper<
+ css::lang::XInitialization,
+ css::drawing::XPresenterHelper
+> PresenterHelperInterfaceBase;
+
+/** Implementation of the XPresenterHelper interface: functionality that can
+ not be implemented in an extension.
+*/
+class PresenterHelper final
+ : public PresenterHelperInterfaceBase
+{
+public:
+ explicit PresenterHelper (const css::uno::Reference<css::uno::XComponentContext>& rxContext);
+ virtual ~PresenterHelper() override;
+ PresenterHelper(const PresenterHelper&) = delete;
+ PresenterHelper& operator=(const PresenterHelper&) = delete;
+
+ // XInitialize
+
+ virtual void SAL_CALL initialize (const css::uno::Sequence<css::uno::Any>& rArguments) override;
+
+ // XPresenterHelper
+
+ virtual css::uno::Reference<css::awt::XWindow> SAL_CALL createWindow (
+ const css::uno::Reference<css::awt::XWindow>& rxParentWindow,
+ sal_Bool bCreateSystemChildWindow,
+ sal_Bool bInitiallyVisible,
+ sal_Bool bEnableChildTransparentMode,
+ sal_Bool bEnableParentClip) override;
+
+ virtual css::uno::Reference<css::rendering::XCanvas> SAL_CALL createSharedCanvas (
+ const css::uno::Reference<css::rendering::XSpriteCanvas>& rxUpdateCanvas,
+ const css::uno::Reference<css::awt::XWindow>& rxUpdateWindow,
+ const css::uno::Reference<css::rendering::XCanvas>& rxSharedCanvas,
+ const css::uno::Reference<css::awt::XWindow>& rxSharedWindow,
+ const css::uno::Reference<css::awt::XWindow>& rxWindow) override;
+
+ virtual css::uno::Reference<css::rendering::XCanvas> SAL_CALL createCanvas (
+ const css::uno::Reference<css::awt::XWindow>& rxWindow,
+ sal_Int16 nRequestedCanvasFeatures,
+ const OUString& rsOptionalCanvasServiceName) override;
+
+ virtual void SAL_CALL toTop (
+ const css::uno::Reference<css::awt::XWindow>& rxWindow) override;
+
+ virtual css::uno::Reference<css::rendering::XBitmap> SAL_CALL loadBitmap (
+ const OUString& rsURL,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas) override;
+
+ virtual void SAL_CALL captureMouse (const css::uno::Reference<css::awt::XWindow>& rxWindow) override;
+
+ virtual void SAL_CALL releaseMouse (const css::uno::Reference<css::awt::XWindow>& rxWindow) override;
+
+ virtual css::awt::Rectangle SAL_CALL getWindowExtentsRelative (
+ const css::uno::Reference<css::awt::XWindow>& rxChildWindow,
+ const css::uno::Reference<css::awt::XWindow>& rxParentWindow) override;
+
+private:
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+};
+
+} // end of namespace ::sd::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/presenter/PresenterPreviewCache.cxx b/sd/source/ui/presenter/PresenterPreviewCache.cxx
new file mode 100644
index 000000000..fd29cdbfa
--- /dev/null
+++ b/sd/source/ui/presenter/PresenterPreviewCache.cxx
@@ -0,0 +1,360 @@
+/* -*- 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 "PresenterPreviewCache.hxx"
+
+#include <cache/SlsPageCache.hxx>
+#include <cache/SlsCacheContext.hxx>
+#include <vcl/bitmapex.hxx>
+#include <sdpage.hxx>
+#include <cppcanvas/vclfactory.hxx>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <osl/diagnose.h>
+
+namespace com::sun::star::uno { class XComponentContext; }
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::sd::slidesorter::cache;
+
+namespace sd::presenter {
+
+class PresenterPreviewCache::PresenterCacheContext : public CacheContext
+{
+public:
+ PresenterCacheContext();
+
+ void SetDocumentSlides (
+ const Reference<container::XIndexAccess>& rxSlides,
+ const Reference<XInterface>& rxDocument);
+ void SetVisibleSlideRange (
+ const sal_Int32 nFirstVisibleSlideIndex,
+ const sal_Int32 nLastVisibleSlideIndex);
+ const SdrPage* GetPage (const sal_Int32 nSlideIndex) const;
+ void AddPreviewCreationNotifyListener (const Reference<drawing::XSlidePreviewCacheListener>& rxListener);
+ void RemovePreviewCreationNotifyListener (const Reference<drawing::XSlidePreviewCacheListener>& rxListener);
+
+ // CacheContext
+ virtual void NotifyPreviewCreation (CacheKey aKey) override;
+ virtual bool IsIdle() override;
+ virtual bool IsVisible (CacheKey aKey) override;
+ virtual const SdrPage* GetPage (CacheKey aKey) override;
+ virtual std::shared_ptr<std::vector<CacheKey> > GetEntryList (bool bVisible) override;
+ virtual sal_Int32 GetPriority (CacheKey aKey) override;
+ virtual css::uno::Reference<css::uno::XInterface> GetModel() override;
+
+private:
+ Reference<container::XIndexAccess> mxSlides;
+ Reference<XInterface> mxDocument;
+ sal_Int32 mnFirstVisibleSlideIndex;
+ sal_Int32 mnLastVisibleSlideIndex;
+ typedef ::std::vector<css::uno::Reference<css::drawing::XSlidePreviewCacheListener> > ListenerContainer;
+ ListenerContainer maListeners;
+
+ void CallListeners (const sal_Int32 nSlideIndex);
+};
+
+//===== PresenterPreviewCache =================================================
+
+PresenterPreviewCache::PresenterPreviewCache ()
+ : maPreviewSize(Size(200,200)),
+ mpCacheContext(std::make_shared<PresenterCacheContext>()),
+ mpCache(std::make_shared<PageCache>(maPreviewSize, Bitmap::HasFastScale(), mpCacheContext))
+{
+}
+
+PresenterPreviewCache::~PresenterPreviewCache()
+{
+}
+
+//----- XInitialize -----------------------------------------------------------
+
+void SAL_CALL PresenterPreviewCache::initialize (const Sequence<Any>& rArguments)
+{
+ if (rArguments.hasElements())
+ throw RuntimeException();
+}
+
+//----- XSlidePreviewCache ----------------------------------------------------
+
+void SAL_CALL PresenterPreviewCache::setDocumentSlides (
+ const Reference<container::XIndexAccess>& rxSlides,
+ const Reference<XInterface>& rxDocument)
+{
+ ThrowIfDisposed();
+ OSL_ASSERT(mpCacheContext != nullptr);
+
+ mpCacheContext->SetDocumentSlides(rxSlides, rxDocument);
+}
+
+void SAL_CALL PresenterPreviewCache::setVisibleRange (
+ sal_Int32 nFirstVisibleSlideIndex,
+ sal_Int32 nLastVisibleSlideIndex)
+{
+ ThrowIfDisposed();
+ OSL_ASSERT(mpCacheContext != nullptr);
+
+ mpCacheContext->SetVisibleSlideRange (nFirstVisibleSlideIndex, nLastVisibleSlideIndex);
+}
+
+void SAL_CALL PresenterPreviewCache::setPreviewSize (
+ const css::geometry::IntegerSize2D& rSize)
+{
+ ThrowIfDisposed();
+ OSL_ASSERT(mpCache != nullptr);
+
+ maPreviewSize = Size(rSize.Width, rSize.Height);
+ mpCache->ChangeSize(maPreviewSize, Bitmap::HasFastScale());
+}
+
+Reference<rendering::XBitmap> SAL_CALL PresenterPreviewCache::getSlidePreview (
+ sal_Int32 nSlideIndex,
+ const Reference<rendering::XCanvas>& rxCanvas)
+{
+ ThrowIfDisposed();
+ OSL_ASSERT(mpCacheContext != nullptr);
+
+ cppcanvas::CanvasSharedPtr pCanvas (
+ cppcanvas::VCLFactory::createCanvas(rxCanvas));
+
+ const SdrPage* pPage = mpCacheContext->GetPage(nSlideIndex);
+ if (pPage == nullptr)
+ throw RuntimeException();
+
+ const BitmapEx aPreview (mpCache->GetPreviewBitmap(pPage,true));
+ if (aPreview.IsEmpty())
+ return nullptr;
+ else
+ return cppcanvas::VCLFactory::createBitmap(
+ pCanvas,
+ aPreview)->getUNOBitmap();
+}
+
+void SAL_CALL PresenterPreviewCache::addPreviewCreationNotifyListener (
+ const Reference<drawing::XSlidePreviewCacheListener>& rxListener)
+{
+ if (m_bDisposed)
+ return;
+ if (rxListener.is())
+ mpCacheContext->AddPreviewCreationNotifyListener(rxListener);
+}
+
+void SAL_CALL PresenterPreviewCache::removePreviewCreationNotifyListener (
+ const css::uno::Reference<css::drawing::XSlidePreviewCacheListener>& rxListener)
+{
+ ThrowIfDisposed();
+ mpCacheContext->RemovePreviewCreationNotifyListener(rxListener);
+}
+
+void SAL_CALL PresenterPreviewCache::pause()
+{
+ ThrowIfDisposed();
+ OSL_ASSERT(mpCache != nullptr);
+ mpCache->Pause();
+}
+
+void SAL_CALL PresenterPreviewCache::resume()
+{
+ ThrowIfDisposed();
+ OSL_ASSERT(mpCache != nullptr);
+ mpCache->Resume();
+}
+
+void PresenterPreviewCache::ThrowIfDisposed()
+{
+ if (m_bDisposed)
+ {
+ throw lang::DisposedException ("PresenterPreviewCache object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+//===== PresenterPreviewCache::PresenterCacheContext ==========================
+
+PresenterPreviewCache::PresenterCacheContext::PresenterCacheContext()
+ : mnFirstVisibleSlideIndex(-1),
+ mnLastVisibleSlideIndex(-1)
+{
+}
+
+void PresenterPreviewCache::PresenterCacheContext::SetDocumentSlides (
+ const Reference<container::XIndexAccess>& rxSlides,
+ const Reference<XInterface>& rxDocument)
+{
+ mxSlides = rxSlides;
+ mxDocument = rxDocument;
+ mnFirstVisibleSlideIndex = -1;
+ mnLastVisibleSlideIndex = -1;
+}
+
+void PresenterPreviewCache::PresenterCacheContext::SetVisibleSlideRange (
+ const sal_Int32 nFirstVisibleSlideIndex,
+ const sal_Int32 nLastVisibleSlideIndex)
+{
+ if (nFirstVisibleSlideIndex > nLastVisibleSlideIndex || nFirstVisibleSlideIndex<0)
+ {
+ mnFirstVisibleSlideIndex = -1;
+ mnLastVisibleSlideIndex = -1;
+ }
+ else
+ {
+ mnFirstVisibleSlideIndex = nFirstVisibleSlideIndex;
+ mnLastVisibleSlideIndex = nLastVisibleSlideIndex;
+ }
+ if (mxSlides.is() && mnLastVisibleSlideIndex >= mxSlides->getCount())
+ mnLastVisibleSlideIndex = mxSlides->getCount() - 1;
+}
+
+void PresenterPreviewCache::PresenterCacheContext::AddPreviewCreationNotifyListener (
+ const Reference<drawing::XSlidePreviewCacheListener>& rxListener)
+{
+ maListeners.push_back(rxListener);
+}
+
+void PresenterPreviewCache::PresenterCacheContext::RemovePreviewCreationNotifyListener (
+ const Reference<drawing::XSlidePreviewCacheListener>& rxListener)
+{
+ auto iListener = std::find(maListeners.begin(), maListeners.end(), rxListener);
+ if (iListener != maListeners.end())
+ maListeners.erase(iListener);
+}
+
+//----- CacheContext ----------------------------------------------------------
+
+void PresenterPreviewCache::PresenterCacheContext::NotifyPreviewCreation (
+ CacheKey aKey)
+{
+ if ( ! mxSlides.is())
+ return;
+ const sal_Int32 nCount(mxSlides->getCount());
+ for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
+ if (aKey == GetPage(nIndex))
+ CallListeners(nIndex);
+}
+
+bool PresenterPreviewCache::PresenterCacheContext::IsIdle()
+{
+ return true;
+}
+
+bool PresenterPreviewCache::PresenterCacheContext::IsVisible (CacheKey aKey)
+{
+ if (mnFirstVisibleSlideIndex < 0)
+ return false;
+ for (sal_Int32 nIndex=mnFirstVisibleSlideIndex; nIndex<=mnLastVisibleSlideIndex; ++nIndex)
+ {
+ const SdrPage* pPage = GetPage(nIndex);
+ if (pPage == aKey)
+ return true;
+ }
+ return false;
+}
+
+const SdrPage* PresenterPreviewCache::PresenterCacheContext::GetPage (CacheKey aKey)
+{
+ return aKey;
+}
+
+std::shared_ptr<std::vector<CacheKey> >
+ PresenterPreviewCache::PresenterCacheContext::GetEntryList (bool bVisible)
+{
+ auto pKeys = std::make_shared<std::vector<CacheKey>>();
+
+ if ( ! mxSlides.is())
+ return pKeys;
+
+ const sal_Int32 nFirstIndex (bVisible ? mnFirstVisibleSlideIndex : 0);
+ const sal_Int32 nLastIndex (bVisible ? mnLastVisibleSlideIndex : mxSlides->getCount()-1);
+
+ if (nFirstIndex < 0)
+ return pKeys;
+
+ for (sal_Int32 nIndex=nFirstIndex; nIndex<=nLastIndex; ++nIndex)
+ {
+ pKeys->push_back(GetPage(nIndex));
+ }
+
+ return pKeys;
+}
+
+sal_Int32 PresenterPreviewCache::PresenterCacheContext::GetPriority (CacheKey aKey)
+{
+ if ( ! mxSlides.is())
+ return 0;
+
+ const sal_Int32 nCount (mxSlides->getCount());
+
+ for (sal_Int32 nIndex=mnFirstVisibleSlideIndex; nIndex<=mnLastVisibleSlideIndex; ++nIndex)
+ if (aKey == GetPage(nIndex))
+ return -nCount-1+nIndex;
+
+ for (sal_Int32 nIndex=0; nIndex<=nCount; ++nIndex)
+ if (aKey == GetPage(nIndex))
+ return nIndex;
+
+ return 0;
+}
+
+Reference<XInterface> PresenterPreviewCache::PresenterCacheContext::GetModel()
+{
+ return mxDocument;
+}
+
+const SdrPage* PresenterPreviewCache::PresenterCacheContext::GetPage (
+ const sal_Int32 nSlideIndex) const
+{
+ if ( ! mxSlides.is())
+ return nullptr;
+ if (nSlideIndex < 0 || nSlideIndex >= mxSlides->getCount())
+ return nullptr;
+
+ Reference<drawing::XDrawPage> xSlide (mxSlides->getByIndex(nSlideIndex), UNO_QUERY);
+ const SdPage* pPage = SdPage::getImplementation(xSlide);
+ return pPage;
+}
+
+void PresenterPreviewCache::PresenterCacheContext::CallListeners (
+ const sal_Int32 nIndex)
+{
+ ListenerContainer aListeners (maListeners);
+ for (const auto& rxListener : aListeners)
+ {
+ try
+ {
+ rxListener->notifyPreviewCreation(nIndex);
+ }
+ catch (lang::DisposedException&)
+ {
+ RemovePreviewCreationNotifyListener(rxListener);
+ }
+ }
+}
+
+} // end of namespace ::sd::presenter
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_PresenterPreviewCache_get_implementation(css::uno::XComponentContext*,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::presenter::PresenterPreviewCache);
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/presenter/PresenterPreviewCache.hxx b/sd/source/ui/presenter/PresenterPreviewCache.hxx
new file mode 100644
index 000000000..4f8c52280
--- /dev/null
+++ b/sd/source/ui/presenter/PresenterPreviewCache.hxx
@@ -0,0 +1,97 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/XSlidePreviewCache.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <tools/gen.hxx>
+#include <comphelper/compbase.hxx>
+#include <memory>
+
+namespace sd::slidesorter::cache { class PageCache; }
+
+namespace sd::presenter {
+
+typedef comphelper::WeakComponentImplHelper<
+ css::lang::XInitialization,
+ css::drawing::XSlidePreviewCache
+> PresenterPreviewCacheInterfaceBase;
+
+/** Uno API wrapper around the slide preview cache.
+*/
+class PresenterPreviewCache final
+ : public PresenterPreviewCacheInterfaceBase
+{
+public:
+ PresenterPreviewCache ();
+ virtual ~PresenterPreviewCache() override;
+ PresenterPreviewCache(const PresenterPreviewCache&) = delete;
+ PresenterPreviewCache& operator=(const PresenterPreviewCache&) = delete;
+
+ // XInitialize
+
+ /** Accepts no arguments. All values that are necessary to set up a
+ preview cache can be provided via methods.
+ */
+ virtual void SAL_CALL initialize (const css::uno::Sequence<css::uno::Any>& rArguments) override;
+
+ // XSlidePreviewCache
+
+ virtual void SAL_CALL setDocumentSlides (
+ const css::uno::Reference<css::container::XIndexAccess>& rxSlides,
+ const css::uno::Reference<css::uno::XInterface>& rxDocument) override;
+
+ virtual void SAL_CALL setVisibleRange (
+ sal_Int32 nFirstVisibleSlideIndex,
+ sal_Int32 nLastVisibleSlideIndex) override;
+
+ virtual void SAL_CALL setPreviewSize (
+ const css::geometry::IntegerSize2D& rSize) override;
+
+ virtual css::uno::Reference<css::rendering::XBitmap> SAL_CALL
+ getSlidePreview (
+ sal_Int32 nSlideIndex,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas) override;
+
+ virtual void SAL_CALL addPreviewCreationNotifyListener (
+ const css::uno::Reference<css::drawing::XSlidePreviewCacheListener>& rxListener) override;
+
+ virtual void SAL_CALL removePreviewCreationNotifyListener (
+ const css::uno::Reference<css::drawing::XSlidePreviewCacheListener>& rxListener) override;
+
+ virtual void SAL_CALL pause() override;
+
+ virtual void SAL_CALL resume() override;
+
+private:
+ class PresenterCacheContext;
+ Size maPreviewSize;
+ std::shared_ptr<PresenterCacheContext> mpCacheContext;
+ std::shared_ptr<sd::slidesorter::cache::PageCache> mpCache;
+
+ /** @throws css::lang::DisposedException when the object has already been
+ disposed.
+ */
+ void ThrowIfDisposed();
+};
+
+} // end of namespace ::sd::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/presenter/PresenterTextView.cxx b/sd/source/ui/presenter/PresenterTextView.cxx
new file mode 100644
index 000000000..affa21b03
--- /dev/null
+++ b/sd/source/ui/presenter/PresenterTextView.cxx
@@ -0,0 +1,466 @@
+/* -*- 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 "PresenterTextView.hxx"
+
+#include <i18nlangtag/mslangid.hxx>
+#include <cppcanvas/vclfactory.hxx>
+#include <svl/itempool.hxx>
+#include <unotools/lingucfg.hxx>
+#include <editeng/colritem.hxx>
+#include <editeng/editeng.hxx>
+#include <editeng/editstat.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/fontitem.hxx>
+#include <vcl/bitmapex.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/virdev.hxx>
+#include <com/sun/star/awt/FontDescriptor.hpp>
+#include <com/sun/star/awt/Size.hpp>
+#include <com/sun/star/rendering/XCanvas.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/i18n/ScriptType.hpp>
+#include <o3tl/string_view.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+
+constexpr OUStringLiteral gsTextPropertyName(u"Text");
+constexpr OUStringLiteral gsBitmapPropertyName(u"Bitmap");
+constexpr OUStringLiteral gsSizePropertyName(u"Size");
+constexpr OUStringLiteral gsBackgroundColorPropertyName(u"BackgroundColor");
+constexpr OUStringLiteral gsTextColorPropertyName(u"TextColor");
+constexpr OUStringLiteral gsFontDescriptorPropertyName(u"FontDescriptor");
+constexpr OUStringLiteral gsTopPropertyName(u"Top");
+constexpr OUStringLiteral gsTopRelativePropertyName(u"RelativeTop");
+constexpr OUStringLiteral gsTotalHeightPropertyName(u"TotalHeight");
+
+namespace sd::presenter {
+
+// PresenterTextView::Implementation
+class PresenterTextView::Implementation
+{
+public:
+ Implementation();
+ ~Implementation();
+
+ void SetCanvas (const cppcanvas::CanvasSharedPtr& rCanvas);
+ void SetSize (const Size aSize);
+ void SetBackgroundColor (const Color aColor);
+ void SetTextColor (const Color aColor);
+ void SetFontDescriptor (const awt::FontDescriptor& rFontDescriptor);
+ sal_Int32 GetTop() const { return mnTop;}
+ void SetTop (const sal_Int32 nTop);
+ void SetText (const OUString& Text);
+ sal_Int32 ParseDistance (const OUString& rsDistance) const;
+ Reference<rendering::XBitmap> const & GetBitmap();
+ sal_Int32 GetTotalHeight();
+
+private:
+ Reference<rendering::XBitmap> mxBitmap;
+ cppcanvas::CanvasSharedPtr mpCanvas;
+ VclPtr<VirtualDevice> mpOutputDevice;
+ std::unique_ptr<EditEngine> mpEditEngine;
+ rtl::Reference<SfxItemPool> mpEditEngineItemPool;
+ Size maSize;
+ OUString msText;
+ sal_Int32 mnTop;
+ sal_Int32 mnTotalHeight;
+
+ void CheckTop();
+};
+
+// PresenterTextView
+PresenterTextView::PresenterTextView ()
+ : mpImplementation(new Implementation())
+{
+}
+
+PresenterTextView::~PresenterTextView()
+{
+}
+
+void SAL_CALL PresenterTextView::disposing()
+{
+ mpImplementation.reset();
+}
+
+// XInitialization
+void SAL_CALL PresenterTextView::initialize (const Sequence<Any>& rArguments)
+{
+ ThrowIfDisposed();
+
+ if (rArguments.getLength() != 1)
+ {
+ throw RuntimeException("PresenterTextView: invalid number of arguments",
+ static_cast<XWeak*>(this));
+ }
+
+ Reference<rendering::XCanvas> xCanvas (rArguments[0], UNO_QUERY_THROW);
+ mpImplementation->SetCanvas(
+ cppcanvas::VCLFactory::createCanvas(xCanvas));
+}
+
+Any PresenterTextView::GetPropertyValue (const OUString& rsPropertyName)
+{
+ ThrowIfDisposed();
+
+ if (rsPropertyName == gsBitmapPropertyName)
+ {
+ return Any(mpImplementation->GetBitmap());
+ }
+ else if (rsPropertyName == gsTopPropertyName)
+ {
+ return Any(mpImplementation->GetTop());
+ }
+ else if (rsPropertyName == gsTotalHeightPropertyName)
+ {
+ return Any(mpImplementation->GetTotalHeight());
+ }
+
+ return Any();
+}
+
+Any PresenterTextView::SetPropertyValue (
+ const OUString& rsPropertyName,
+ const css::uno::Any& rValue)
+{
+ ThrowIfDisposed();
+
+ Any aOldValue;
+ if (rsPropertyName == gsTextPropertyName)
+ {
+ OUString sText;
+ if (rValue >>= sText)
+ mpImplementation->SetText(sText);
+ }
+ else if (rsPropertyName == gsSizePropertyName)
+ {
+ awt::Size aSize;
+ if (rValue >>= aSize)
+ mpImplementation->SetSize(Size(aSize.Width,aSize.Height));
+ }
+ else if (rsPropertyName == gsBackgroundColorPropertyName)
+ {
+ ::Color aColor;
+ if (rValue >>= aColor)
+ mpImplementation->SetBackgroundColor(aColor);
+ }
+ else if (rsPropertyName == gsTextColorPropertyName)
+ {
+ ::Color aColor;
+ if (rValue >>= aColor)
+ mpImplementation->SetTextColor(aColor);
+ }
+ else if (rsPropertyName == gsFontDescriptorPropertyName)
+ {
+ awt::FontDescriptor aFontDescriptor;
+ if (rValue >>= aFontDescriptor)
+ mpImplementation->SetFontDescriptor(aFontDescriptor);
+ }
+ else if (rsPropertyName == gsTopPropertyName)
+ {
+ sal_Int32 nTop = 0;
+ if (rValue >>= nTop)
+ mpImplementation->SetTop(nTop);
+ }
+ else if (rsPropertyName == gsTopRelativePropertyName)
+ {
+ OUString sDistance;
+ if (rValue >>= sDistance)
+ mpImplementation->SetTop(
+ mpImplementation->GetTop()
+ + mpImplementation->ParseDistance(sDistance));
+ }
+ return aOldValue;
+}
+
+void PresenterTextView::ThrowIfDisposed()
+{
+ if (PresenterTextViewInterfaceBase::rBHelper.bDisposed
+ || PresenterTextViewInterfaceBase::rBHelper.bInDispose || mpImplementation == nullptr)
+ {
+ throw lang::DisposedException ("PresenterTextView object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+// PresenterTextView::Implementation
+PresenterTextView::Implementation::Implementation()
+ : mpOutputDevice(VclPtr<VirtualDevice>::Create(*Application::GetDefaultDevice(), DeviceFormat::DEFAULT, DeviceFormat::DEFAULT)),
+ mpEditEngineItemPool(EditEngine::CreatePool()),
+ maSize(100,100),
+ mnTop(0),
+ mnTotalHeight(-1)
+{
+ mpOutputDevice->SetMapMode(MapMode(MapUnit::MapPixel));
+
+ // set fonts to be used
+ SvtLinguOptions aOpt;
+ SvtLinguConfig().GetOptions( aOpt );
+
+ struct FontDta {
+ LanguageType nFallbackLang;
+ LanguageType nLang;
+ DefaultFontType nFontType;
+ sal_uInt16 nFontInfoId;
+ } aTable[3] =
+ {
+ // info to get western font to be used
+ { LANGUAGE_ENGLISH_US, LANGUAGE_NONE,
+ DefaultFontType::SERIF, EE_CHAR_FONTINFO },
+ // info to get CJK font to be used
+ { LANGUAGE_JAPANESE, LANGUAGE_NONE,
+ DefaultFontType::CJK_TEXT, EE_CHAR_FONTINFO_CJK },
+ // info to get CTL font to be used
+ { LANGUAGE_ARABIC_SAUDI_ARABIA, LANGUAGE_NONE,
+ DefaultFontType::CTL_TEXT, EE_CHAR_FONTINFO_CTL }
+ };
+ aTable[0].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage, css::i18n::ScriptType::LATIN);
+ aTable[1].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage_CJK, css::i18n::ScriptType::ASIAN);
+ aTable[2].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage_CTL, css::i18n::ScriptType::COMPLEX);
+
+ for (const FontDta & rFntDta : aTable)
+ {
+ LanguageType nLang = (LANGUAGE_NONE == rFntDta.nLang) ?
+ rFntDta.nFallbackLang : rFntDta.nLang;
+ vcl::Font aFont = OutputDevice::GetDefaultFont(
+ rFntDta.nFontType, nLang, GetDefaultFontFlags::OnlyOne);
+ mpEditEngineItemPool->SetPoolDefaultItem(
+ SvxFontItem(
+ aFont.GetFamilyType(),
+ aFont.GetFamilyName(),
+ aFont.GetStyleName(),
+ aFont.GetPitch(),
+ aFont.GetCharSet(),
+ rFntDta.nFontInfoId));
+ }
+
+ mpEditEngine.reset( new EditEngine (mpEditEngineItemPool.get()) );
+
+ mpEditEngine->EnableUndo (true);
+ mpEditEngine->SetDefTab (sal_uInt16(
+ Application::GetDefaultDevice()->GetTextWidth("XXXX")));
+
+ mpEditEngine->SetControlWord(
+ EEControlBits(mpEditEngine->GetControlWord() | EEControlBits::AUTOINDENTING) &
+ EEControlBits(~EEControlBits::UNDOATTRIBS) &
+ EEControlBits(~EEControlBits::PASTESPECIAL) );
+
+ mpEditEngine->SetWordDelimiters (" .=+-*/(){}[];\"");
+ mpEditEngine->SetRefMapMode(MapMode(MapUnit::MapPixel));
+ mpEditEngine->SetPaperSize (Size(800, 0));
+ mpEditEngine->EraseVirtualDevice();
+ mpEditEngine->ClearModifyFlag();
+}
+
+PresenterTextView::Implementation::~Implementation()
+{
+ mpEditEngine.reset();
+ mpEditEngineItemPool.clear();
+ mpOutputDevice.disposeAndClear();
+}
+
+void PresenterTextView::Implementation::SetCanvas (const cppcanvas::CanvasSharedPtr& rpCanvas)
+{
+ mpCanvas = rpCanvas;
+ mxBitmap = nullptr;
+}
+
+void PresenterTextView::Implementation::SetSize (const Size aSize)
+{
+ DBG_ASSERT(mpEditEngine!=nullptr, "EditEngine missing");
+
+ maSize = aSize;
+ mpEditEngine->SetPaperSize(maSize);
+ mnTotalHeight = -1;
+ mxBitmap = nullptr;
+}
+
+void PresenterTextView::Implementation::SetBackgroundColor (const Color aColor)
+{
+ mxBitmap = nullptr;
+
+ DBG_ASSERT(mpEditEngine!=nullptr, "EditEngine missing");
+ DBG_ASSERT(mpEditEngineItemPool!=nullptr, "EditEngineItemPool missing");
+ mpEditEngine->SetBackgroundColor(aColor);
+ mpEditEngine->EnableAutoColor(false);
+ mpEditEngine->ForceAutoColor(false);
+}
+
+void PresenterTextView::Implementation::SetTextColor (const Color aColor)
+{
+ mxBitmap = nullptr;
+
+ DBG_ASSERT(mpEditEngineItemPool!=nullptr, "EditEngineItemPool missing");
+ mpEditEngineItemPool->SetPoolDefaultItem(SvxColorItem(aColor, EE_CHAR_COLOR));
+}
+
+void PresenterTextView::Implementation::SetFontDescriptor (
+ const awt::FontDescriptor& rFontDescriptor)
+{
+ mxBitmap = nullptr;
+
+ DBG_ASSERT(mpEditEngineItemPool!=nullptr, "EditEngineItemPool missing");
+
+ const sal_Int32 nFontHeight = rFontDescriptor.Height;
+
+ SvxFontHeightItem aFontHeight(
+ Application::GetDefaultDevice()->LogicToPixel(
+ Size(0, nFontHeight), MapMode (MapUnit::MapPoint)).Height(),
+ 100,
+ EE_CHAR_FONTHEIGHT);
+ mpEditEngineItemPool->SetPoolDefaultItem( aFontHeight);
+ aFontHeight.SetWhich (EE_CHAR_FONTHEIGHT_CJK);
+ mpEditEngineItemPool->SetPoolDefaultItem( aFontHeight);
+ aFontHeight.SetWhich (EE_CHAR_FONTHEIGHT_CTL);
+ mpEditEngineItemPool->SetPoolDefaultItem( aFontHeight);
+
+ SvxFontItem aSvxFontItem (EE_CHAR_FONTINFO);
+ aSvxFontItem.SetFamilyName( rFontDescriptor.Name );
+ mpEditEngineItemPool->SetPoolDefaultItem(aSvxFontItem);
+
+ mnTotalHeight = -1;
+ mxBitmap = nullptr;
+
+ CheckTop();
+ mnTotalHeight = -1;
+}
+
+void PresenterTextView::Implementation::SetTop (const sal_Int32 nTop)
+{
+ if (nTop == mnTop)
+ return;
+
+ mnTop = nTop;
+ mxBitmap = nullptr;
+ CheckTop();
+}
+
+void PresenterTextView::Implementation::SetText (const OUString& rText)
+{
+ DBG_ASSERT(mpEditEngine!=nullptr, "EditEngine missing");
+ msText = rText;
+ mpEditEngine->SetPaperSize(maSize);
+ mnTotalHeight = -1;
+ mxBitmap = nullptr;
+}
+
+sal_Int32 PresenterTextView::Implementation::ParseDistance (const OUString& rsDistance) const
+{
+ DBG_ASSERT(mpEditEngine!=nullptr, "EditEngine missing");
+ sal_Int32 nDistance (0);
+ if (rsDistance.endsWith("px"))
+ {
+ nDistance = o3tl::toInt32(rsDistance.subView(0,rsDistance.getLength()-2));
+ }
+ else if (rsDistance.endsWith("l"))
+ {
+ const sal_Int32 nLines (o3tl::toInt32(rsDistance.subView(0,rsDistance.getLength()-1)));
+ // Take the height of the first line as the height of every line.
+ const sal_uInt32 nFirstLineHeight (mpEditEngine->GetLineHeight(0));
+ nDistance = nFirstLineHeight * nLines;
+ }
+
+ return nDistance;
+}
+
+Reference<rendering::XBitmap> const & PresenterTextView::Implementation::GetBitmap()
+{
+ DBG_ASSERT(mpEditEngine!=nullptr, "EditEngine missing");
+
+ if ( ! mxBitmap.is())
+ {
+ mpOutputDevice.disposeAndClear();
+ mpOutputDevice = VclPtr<VirtualDevice>::Create(*Application::GetDefaultDevice(),
+ DeviceFormat::DEFAULT, DeviceFormat::DEFAULT);
+ mpOutputDevice->SetMapMode(MapMode(MapUnit::MapPixel));
+ mpOutputDevice->SetOutputSizePixel(maSize);
+ mpOutputDevice->SetLineColor();
+ mpOutputDevice->SetFillColor();
+ mpOutputDevice->SetBackground(Wallpaper());
+ mpOutputDevice->Erase();
+
+ MapMode aMapMode (mpOutputDevice->GetMapMode());
+ aMapMode.SetOrigin(Point(0,0));
+ mpOutputDevice->SetMapMode(aMapMode);
+ const ::tools::Rectangle aWindowBox (Point(0,0), maSize);
+ mpOutputDevice->DrawRect(aWindowBox);
+
+ mpEditEngine->Clear();
+ mpEditEngine->SetText(msText);
+ mpEditEngine->SetPaperSize(maSize);
+
+ mpEditEngine->Draw(*mpOutputDevice, aWindowBox, Point(0,mnTop));
+
+ const BitmapEx aBitmap (mpOutputDevice->GetBitmapEx(Point(0,0), maSize));
+ mxBitmap = cppcanvas::VCLFactory::createBitmap(
+ mpCanvas,
+ aBitmap
+ )->getUNOBitmap();
+ }
+ return mxBitmap;
+}
+
+sal_Int32 PresenterTextView::Implementation::GetTotalHeight()
+{
+ DBG_ASSERT(mpEditEngine!=nullptr, "EditEngine missing");
+
+ if (mnTotalHeight < 0)
+ {
+ if ( ! mxBitmap.is())
+ GetBitmap();
+ mnTotalHeight = mpEditEngine->GetTextHeight();
+ }
+ return mnTotalHeight;
+}
+
+void PresenterTextView::Implementation::CheckTop()
+{
+ DBG_ASSERT(mpEditEngine!=nullptr, "EditEngine missing");
+
+ if (mpEditEngine!=nullptr && mnTotalHeight < 0)
+ mnTotalHeight = mpEditEngine->GetTextHeight();
+ if (mpEditEngine!=nullptr && mnTop >= mnTotalHeight)
+ mnTop = mnTotalHeight - mpEditEngine->GetLineHeight(0);
+
+ if (mnTotalHeight < maSize.Height())
+ mnTop = 0;
+
+ if (mnTotalHeight - mnTop < maSize.Height())
+ mnTop = mnTotalHeight - maSize.Height();
+
+ if (mnTop < 0)
+ mnTop = 0;
+}
+
+} // end of namespace ::sd::presenter
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_PresenterTextView_get_implementation(css::uno::XComponentContext*,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::presenter::PresenterTextView);
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/presenter/PresenterTextView.hxx b/sd/source/ui/presenter/PresenterTextView.hxx
new file mode 100644
index 000000000..28b68aaa5
--- /dev/null
+++ b/sd/source/ui/presenter/PresenterTextView.hxx
@@ -0,0 +1,71 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <tools/PropertySet.hxx>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <cppuhelper/implbase.hxx>
+#include <memory>
+
+namespace sd::presenter {
+
+typedef ::cppu::ImplInheritanceHelper <
+ tools::PropertySet,
+ css::lang::XInitialization
+> PresenterTextViewInterfaceBase;
+
+/** Render text into bitmaps. An edit engine is used to render the text.
+ This service is used by the presenter screen to render the notes view.
+*/
+class PresenterTextView
+ : public PresenterTextViewInterfaceBase
+{
+public:
+ PresenterTextView ();
+ virtual ~PresenterTextView() override;
+ PresenterTextView(const PresenterTextView&) = delete;
+ PresenterTextView& operator=(const PresenterTextView&) = delete;
+
+ // XInitialization
+
+ virtual void SAL_CALL initialize (const css::uno::Sequence<css::uno::Any>& rArguments) override;
+
+protected:
+ virtual void SAL_CALL disposing() override;
+
+ virtual css::uno::Any GetPropertyValue (
+ const OUString& rsPropertyName) override;
+ virtual css::uno::Any SetPropertyValue (
+ const OUString& rsPropertyName,
+ const css::uno::Any& rValue) override;
+
+private:
+ class Implementation;
+ std::unique_ptr<Implementation> mpImplementation;
+
+ /** @throws css::lang::DisposedException when the object has already been
+ disposed.
+ */
+ void ThrowIfDisposed();
+};
+
+} // end of namespace ::sd::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/presenter/SlideRenderer.cxx b/sd/source/ui/presenter/SlideRenderer.cxx
new file mode 100644
index 000000000..1b57b195a
--- /dev/null
+++ b/sd/source/ui/presenter/SlideRenderer.cxx
@@ -0,0 +1,201 @@
+/* -*- 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 "SlideRenderer.hxx"
+#include <sdpage.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <vcl/svapp.hxx>
+#include <cppcanvas/vclfactory.hxx>
+#include <cppuhelper/supportsservice.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd::presenter {
+
+//===== SlideRenderer ==========================================================
+
+SlideRenderer::SlideRenderer ()
+{
+}
+
+SlideRenderer::~SlideRenderer()
+{
+}
+
+//----- XInitialization -------------------------------------------------------
+
+void SAL_CALL SlideRenderer::initialize (const Sequence<Any>& rArguments)
+{
+ ThrowIfDisposed();
+
+ if (rArguments.hasElements())
+ {
+ throw RuntimeException("SlideRenderer: invalid number of arguments",
+ static_cast<XWeak*>(this));
+ }
+}
+
+OUString SlideRenderer::getImplementationName()
+{
+ return "com.sun.star.comp.Draw.SlideRenderer";
+}
+
+sal_Bool SlideRenderer::supportsService(OUString const & ServiceName)
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+css::uno::Sequence<OUString> SlideRenderer::getSupportedServiceNames()
+{
+ return {"com.sun.star.drawing.SlideRenderer"};
+}
+
+//----- XSlideRenderer --------------------------------------------------------
+
+Reference<awt::XBitmap> SlideRenderer::createPreview (
+ const Reference<drawing::XDrawPage>& rxSlide,
+ const awt::Size& rMaximalSize,
+ sal_Int16 nSuperSampleFactor)
+{
+ ThrowIfDisposed();
+ SolarMutexGuard aGuard;
+
+ return VCLUnoHelper::CreateBitmap(
+ CreatePreview(rxSlide, rMaximalSize, nSuperSampleFactor));
+}
+
+Reference<rendering::XBitmap> SlideRenderer::createPreviewForCanvas (
+ const Reference<drawing::XDrawPage>& rxSlide,
+ const awt::Size& rMaximalSize,
+ sal_Int16 nSuperSampleFactor,
+ const Reference<rendering::XCanvas>& rxCanvas)
+{
+ ThrowIfDisposed();
+ SolarMutexGuard aGuard;
+
+ cppcanvas::CanvasSharedPtr pCanvas (
+ cppcanvas::VCLFactory::createCanvas(rxCanvas));
+ if (pCanvas)
+ return cppcanvas::VCLFactory::createBitmap(
+ pCanvas,
+ CreatePreview(rxSlide, rMaximalSize, nSuperSampleFactor))->getUNOBitmap();
+ else
+ return nullptr;
+}
+
+awt::Size SAL_CALL SlideRenderer::calculatePreviewSize (
+ double nSlideAspectRatio,
+ const awt::Size& rMaximalSize)
+{
+ if (rMaximalSize.Width <= 0
+ || rMaximalSize.Height <= 0
+ || nSlideAspectRatio <= 0)
+ {
+ return awt::Size(0,0);
+ }
+
+ const double nWindowAspectRatio (double(rMaximalSize.Width) / double(rMaximalSize.Height));
+ if (nSlideAspectRatio < nWindowAspectRatio)
+ return awt::Size(
+ sal::static_int_cast<sal_Int32>(rMaximalSize.Height * nSlideAspectRatio),
+ rMaximalSize.Height);
+ else
+ return awt::Size(
+ rMaximalSize.Width,
+ sal::static_int_cast<sal_Int32>(rMaximalSize.Width / nSlideAspectRatio));
+}
+
+BitmapEx SlideRenderer::CreatePreview (
+ const Reference<drawing::XDrawPage>& rxSlide,
+ const awt::Size& rMaximalSize,
+ sal_Int16 nSuperSampleFactor)
+{
+ const SdPage* pPage = SdPage::getImplementation(rxSlide);
+ if (pPage == nullptr)
+ throw lang::IllegalArgumentException("SlideRenderer::createPreview() called with invalid slide",
+ static_cast<XWeak*>(this),
+ 0);
+
+ // Determine the size of the current slide and its aspect ratio.
+ Size aPageSize = pPage->GetSize();
+ if (aPageSize.Height() <= 0)
+ throw lang::IllegalArgumentException("SlideRenderer::createPreview() called with invalid size",
+ static_cast<XWeak*>(this),
+ 1);
+
+ // Compare with the aspect ratio of the window (which rMaximalSize
+ // assumed to be) and calculate the size of the preview so that it
+ // a) will have the aspect ratio of the page and
+ // b) will be as large as possible.
+ awt::Size aPreviewSize (calculatePreviewSize(
+ double(aPageSize.Width()) / double(aPageSize.Height()),
+ rMaximalSize));
+ if (aPreviewSize.Width <= 0 || aPreviewSize.Height <= 0)
+ return BitmapEx();
+
+ // Make sure that the super sample factor has a sane value.
+ sal_Int16 nFactor (nSuperSampleFactor);
+ if (nFactor < 1)
+ nFactor = 1;
+ else if (nFactor > 10)
+ nFactor = 10;
+
+ // Create the preview. When the super sample factor n is greater than 1
+ // then a preview is created in size (n*width, n*height) and then scaled
+ // down to (width, height). This is a poor mans antialiasing for the
+ // time being. When we have true antialiasing support this workaround
+ // can be removed.
+ const Image aPreview = maPreviewRenderer.RenderPage (
+ pPage,
+ Size(aPreviewSize.Width*nFactor, aPreviewSize.Height*nFactor),
+ true);
+ if (nFactor == 1)
+ return aPreview.GetBitmapEx();
+ else
+ {
+ BitmapEx aScaledPreview = aPreview.GetBitmapEx();
+ aScaledPreview.Scale(
+ Size(aPreviewSize.Width,aPreviewSize.Height),
+ BmpScaleFlag::BestQuality);
+ return aScaledPreview;
+ }
+}
+
+void SlideRenderer::ThrowIfDisposed()
+{
+ if (m_bDisposed)
+ {
+ throw lang::DisposedException ("SlideRenderer object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+} // end of namespace ::sd::presenter
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_SlideRenderer_get_implementation(css::uno::XComponentContext*,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::presenter::SlideRenderer);
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/presenter/SlideRenderer.hxx b/sd/source/ui/presenter/SlideRenderer.hxx
new file mode 100644
index 000000000..d39434421
--- /dev/null
+++ b/sd/source/ui/presenter/SlideRenderer.hxx
@@ -0,0 +1,94 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <PreviewRenderer.hxx>
+#include <com/sun/star/drawing/XSlideRenderer.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+
+#include <comphelper/compbase.hxx>
+
+namespace com::sun::star::drawing { class XDrawPage; }
+
+namespace sd::presenter {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::XSlideRenderer,
+ css::lang::XInitialization,
+ css::lang::XServiceInfo
+> SlideRendererInterfaceBase;
+
+/** Render single slides into bitmaps.
+*/
+class SlideRenderer final
+ : public SlideRendererInterfaceBase
+{
+public:
+ SlideRenderer ();
+ virtual ~SlideRenderer() override;
+ SlideRenderer(const SlideRenderer&) = delete;
+ SlideRenderer& operator=(const SlideRenderer&) = delete;
+
+ // XInitialization
+
+ virtual void SAL_CALL initialize (const css::uno::Sequence<css::uno::Any>& rArguments) override;
+
+ OUString SAL_CALL getImplementationName() override;
+
+ sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override;
+
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+ // XSlideRenderer
+
+ virtual css::uno::Reference<css::awt::XBitmap> SAL_CALL createPreview (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxSlide,
+ const css::awt::Size& rMaximumPreviewPixelSize,
+ sal_Int16 nSuperSampleFactor) override;
+
+ virtual css::uno::Reference<css::rendering::XBitmap> SAL_CALL createPreviewForCanvas (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxSlide,
+ const css::awt::Size& rMaximumPreviewPixelSize,
+ sal_Int16 nSuperSampleFactor,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas) override;
+
+ virtual css::awt::Size SAL_CALL calculatePreviewSize (
+ double nSlideAspectRatio,
+ const css::awt::Size& rMaximumPreviewPixelSize) override;
+
+private:
+ PreviewRenderer maPreviewRenderer;
+
+ /// @throws css::uno::RuntimeException
+ BitmapEx CreatePreview (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxSlide,
+ const css::awt::Size& rMaximumPreviewPixelSize,
+ sal_Int16 nSuperSampleFactor);
+
+ /** @throws css::lang::DisposedException when the object has already been
+ disposed.
+ */
+ void ThrowIfDisposed();
+};
+
+} // end of namespace ::sd::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/AvahiNetworkService.cxx b/sd/source/ui/remotecontrol/AvahiNetworkService.cxx
new file mode 100644
index 000000000..7708e6eb7
--- /dev/null
+++ b/sd/source/ui/remotecontrol/AvahiNetworkService.cxx
@@ -0,0 +1,209 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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 <config_dbus.h>
+
+#include <iostream>
+#include <limits>
+#include <new>
+#include <assert.h>
+
+#include <avahi-client/client.h>
+#include <avahi-client/publish.h>
+
+#include <avahi-common/alternative.h>
+#include <avahi-common/error.h>
+#include <avahi-common/thread-watch.h>
+#include <comphelper/random.hxx>
+
+#if ENABLE_DBUS
+#include <dbus/dbus.h>
+#endif
+
+#include <sal/log.hxx>
+
+#include "AvahiNetworkService.hxx"
+#include "ZeroconfService.hxx"
+
+using namespace sd;
+
+static AvahiClient *client = nullptr;
+static AvahiThreadedPoll *threaded_poll = nullptr;
+static AvahiEntryGroup *group = nullptr;
+static AvahiNetworkService *avahiService = nullptr;
+
+static bool create_services(AvahiClient *c);
+
+static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state, AVAHI_GCC_UNUSED void *userdata) {
+ assert(g == group || group == nullptr);
+ group = g;
+
+ /* Called whenever the entry group state changes */
+
+ switch (state) {
+ case AVAHI_ENTRY_GROUP_ESTABLISHED :
+ /* The entry group has been established successfully */
+ SAL_INFO( "sdremote.wifi", "Service '" << avahiService->getName() << "' successfully established." );
+ break;
+
+ case AVAHI_ENTRY_GROUP_COLLISION : {
+ char *n;
+
+ /* A service name collision with a remote service
+ * happened. Let's pick a new name */
+ n = avahi_alternative_service_name(avahiService->getName().c_str());
+ avahiService->setName(n);
+
+ SAL_INFO( "sdremote.wifi", "Service name collision, renaming service to '" << avahiService->getName() << "'");
+
+ /* And recreate the services */
+ create_services(avahi_entry_group_get_client(g));
+ break;
+ }
+
+ case AVAHI_ENTRY_GROUP_FAILURE :
+
+ SAL_WARN("sdremote.wifi", "Entry group failure: " << avahi_strerror(avahi_client_errno(avahi_entry_group_get_client(g))));
+
+ /* Some kind of failure happened while we were registering our services */
+ avahi_threaded_poll_quit(threaded_poll);
+ break;
+
+ case AVAHI_ENTRY_GROUP_UNCOMMITED:
+ case AVAHI_ENTRY_GROUP_REGISTERING:
+ ;
+ }
+}
+
+static bool create_services(AvahiClient *c) {
+ assert(c);
+
+ /* If this is the first time we're called, let's create a new
+ * entry group if necessary */
+ if(!client)
+ return false;
+
+ if (!group)
+ if (!(group = avahi_entry_group_new(c, entry_group_callback, nullptr))) {
+ SAL_WARN("sdremote.wifi", "avahi_entry_group_new() failed: " << avahi_strerror(avahi_client_errno(c)));
+ avahiService->clear();
+ return false;
+ }
+
+ /* If the group is empty (either because it was just created, or
+ * because it was reset previously, add our entries. */
+
+ if (avahi_entry_group_is_empty(group)) {
+ SAL_INFO("sdremote.wifi", "Adding service '" << avahiService->getName() << "'");
+ char r[128];
+ int nRandom = comphelper::rng::uniform_int_distribution(0, std::numeric_limits<int>::max());
+ snprintf(r, sizeof(r), "random=%i", nRandom);
+ int ret = avahi_entry_group_add_service(
+ group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, static_cast<AvahiPublishFlags>(0),
+ avahiService->getName().c_str(), kREG_TYPE, nullptr, nullptr, 1599, "local", r, nullptr
+ );
+ if (ret < 0) {
+
+ if (ret == AVAHI_ERR_COLLISION){
+ /* A service name collision with a local service happened. Let's
+ * pick a new name */
+ char *n = avahi_alternative_service_name(avahiService->getName().c_str());
+ avahiService->setName(n);
+
+ SAL_WARN("sdremote.wifi", "Service name collision, renaming service to '" << avahiService->getName() << "'");
+
+ avahi_entry_group_reset(group);
+
+ return create_services(c);
+ }
+
+ SAL_WARN("sdremote.wifi", "Failed to add _impressremote._tcp service: " << avahi_strerror(ret));
+ avahiService->clear();
+ return false;
+ }
+
+ /* Tell the server to register the service */
+ if ((ret = avahi_entry_group_commit(group)) < 0) {
+ SAL_WARN("sdremote.wifi", "Failed to commit entry group: " << avahi_strerror(ret));
+ avahiService->clear();
+ return false;
+ }
+ }
+
+ return true; //Services we're already created
+}
+
+static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UNUSED void * userdata) {
+ assert(c);
+
+ /* Called whenever the client or server state changes */
+
+ switch (state) {
+ case AVAHI_CLIENT_S_RUNNING:
+ create_services(c);
+ break;
+ case AVAHI_CLIENT_FAILURE:
+ SAL_WARN("sdremote.wifi", "Client failure: " << avahi_strerror(avahi_client_errno(c)));
+ avahiService->clear();
+ break;
+ case AVAHI_CLIENT_S_COLLISION:
+ case AVAHI_CLIENT_S_REGISTERING:
+ if (group)
+ avahi_entry_group_reset(group);
+ break;
+ case AVAHI_CLIENT_CONNECTING:
+ ;
+ }
+}
+
+void AvahiNetworkService::setup() {
+#if ENABLE_DBUS
+ // Sure, without ENABLE_DBUS it probably makes no sense to try to use this Avahi stuff either,
+ // but this is just a stop-gap measure to get this to even compile for now with the probably
+ // pointless combination of configurable options --enable-avahi --enable-dbus --disable-gui.
+
+ // Avahi internally uses D-Bus, which requires the following in order to be
+ // thread-safe (and we potentially access D-Bus from different threads in
+ // different places of the code base):
+ if (!dbus_threads_init_default()) {
+ throw std::bad_alloc();
+ }
+#endif
+
+ int error = 0;
+ avahiService = this;
+ if (!(threaded_poll = avahi_threaded_poll_new())) {
+ SAL_WARN("sdremote.wifi", "avahi_threaded_poll_new '" << avahiService->getName() << "' failed");
+ return;
+ }
+
+ if (!(client = avahi_client_new(avahi_threaded_poll_get(threaded_poll), static_cast<AvahiClientFlags>(0), client_callback, nullptr, &error))) {
+ SAL_WARN("sdremote.wifi", "avahi_client_new failed");
+ return;
+ }
+
+ if(!create_services(client))
+ return;
+
+ /* Finally, start the event loop thread */
+ if (avahi_threaded_poll_start(threaded_poll) < 0) {
+ SAL_WARN("sdremote.wifi", "avahi_threaded_poll_start failed");
+ return;
+ }
+}
+
+void AvahiNetworkService::clear() {
+ /* Call this when the app shuts down */
+ if(threaded_poll)
+ avahi_threaded_poll_stop(threaded_poll);
+ if(client)
+ avahi_client_free(client);
+ if(threaded_poll)
+ avahi_threaded_poll_free(threaded_poll);
+}
diff --git a/sd/source/ui/remotecontrol/AvahiNetworkService.hxx b/sd/source/ui/remotecontrol/AvahiNetworkService.hxx
new file mode 100644
index 000000000..374a27a3a
--- /dev/null
+++ b/sd/source/ui/remotecontrol/AvahiNetworkService.hxx
@@ -0,0 +1,25 @@
+/* -*- 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/.
+ */
+#pragma once
+
+#include <string>
+#include "ZeroconfService.hxx"
+
+namespace sd {
+
+ class AvahiNetworkService : public ZeroconfService
+ {
+ public:
+ AvahiNetworkService(const std::string& aname = "", unsigned int aport = 1599)
+ : ZeroconfService(aname, aport){}
+
+ void clear() override;
+ void setup() override;
+ };
+}
diff --git a/sd/source/ui/remotecontrol/BluetoothServer.cxx b/sd/source/ui/remotecontrol/BluetoothServer.cxx
new file mode 100644
index 000000000..fc3eeff54
--- /dev/null
+++ b/sd/source/ui/remotecontrol/BluetoothServer.cxx
@@ -0,0 +1,1521 @@
+/* -*- 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 "BluetoothServer.hxx"
+
+#include <iostream>
+#include <memory>
+#include <new>
+#include <string_view>
+
+#include <sal/log.hxx>
+
+#ifdef LINUX_BLUETOOTH
+ #include <glib.h>
+ #include <dbus/dbus.h>
+ #include <errno.h>
+ #include <fcntl.h>
+ #include <unistd.h>
+ #include <sys/socket.h>
+ #include <bluetooth/bluetooth.h>
+ #include <bluetooth/rfcomm.h>
+ #include "BluetoothServiceRecord.hxx"
+ #include "BufferedStreamSocket.hxx"
+#endif
+
+#ifdef _WIN32
+ // LO vs WinAPI conflict
+ #undef WB_LEFT
+ #undef WB_RIGHT
+ #include <winsock2.h>
+ #include <ws2bth.h>
+ #include "BufferedStreamSocket.hxx"
+#endif
+
+#ifdef MACOSX
+ #include <iomanip>
+ #include <osl/conditn.hxx>
+ #include <premac.h>
+ #import <CoreFoundation/CoreFoundation.h>
+ #import <IOBluetooth/IOBluetoothUtilities.h>
+ #import <IOBluetooth/objc/IOBluetoothSDPUUID.h>
+ #import <IOBluetooth/objc/IOBluetoothSDPServiceRecord.h>
+ #include <postmac.h>
+ #import "OSXBluetooth.h"
+ #include "OSXBluetoothWrapper.hxx"
+#endif
+
+#include "Communicator.hxx"
+
+using namespace sd;
+
+#ifdef LINUX_BLUETOOTH
+
+namespace {
+
+struct DBusObject {
+ OString maBusName;
+ OString maPath;
+ OString maInterface;
+
+ DBusObject() { }
+ DBusObject( const char *pBusName, const char *pPath, const char *pInterface )
+ : maBusName( pBusName ), maPath( pPath ), maInterface( pInterface ) { }
+
+ DBusMessage *getMethodCall( const char *pName )
+ {
+ return dbus_message_new_method_call( maBusName.getStr(), maPath.getStr(),
+ maInterface.getStr(), pName );
+ }
+ std::unique_ptr<DBusObject> cloneForInterface( const char *pInterface )
+ {
+ std::unique_ptr<DBusObject> pObject(new DBusObject());
+
+ pObject->maBusName = maBusName;
+ pObject->maPath = maPath;
+ pObject->maInterface = pInterface;
+
+ return pObject;
+ }
+};
+
+}
+
+static std::unique_ptr<DBusObject> getBluez5Adapter(DBusConnection *pConnection);
+
+struct sd::BluetoothServer::Impl {
+ // the glib mainloop running in the thread
+ GMainContext *mpContext;
+ DBusConnection *mpConnection;
+ std::unique_ptr<DBusObject> mpService;
+ enum class BluezVersion { BLUEZ4, BLUEZ5, UNKNOWN };
+ BluezVersion maBluezVersion;
+
+ Impl()
+ : mpContext( g_main_context_new() )
+ , mpConnection( nullptr )
+ , maBluezVersion( BluezVersion::UNKNOWN )
+ { }
+
+ std::unique_ptr<DBusObject> getAdapter()
+ {
+ if (mpService)
+ {
+ return mpService->cloneForInterface( "org.bluez.Adapter" );
+ }
+ else if (spServer->mpImpl->maBluezVersion == BluezVersion::BLUEZ5)
+ {
+ return getBluez5Adapter(mpConnection);
+ }
+ else
+ {
+ return nullptr;
+ }
+ }
+};
+
+static DBusConnection *
+dbusConnectToNameOnBus()
+{
+ DBusError aError;
+ DBusConnection *pConnection;
+
+ dbus_error_init( &aError );
+
+ pConnection = dbus_bus_get( DBUS_BUS_SYSTEM, &aError );
+ if( !pConnection || dbus_error_is_set( &aError ))
+ {
+ SAL_WARN( "sdremote.bluetooth", "failed to get dbus system bus: " << aError.message );
+ dbus_error_free( &aError );
+ return nullptr;
+ }
+
+ return pConnection;
+}
+
+static DBusMessage *
+sendUnrefAndWaitForReply( DBusConnection *pConnection, DBusMessage *pMsg )
+{
+ DBusPendingCall *pPending = nullptr;
+
+ if( !pMsg || !dbus_connection_send_with_reply( pConnection, pMsg, &pPending,
+ -1 /* default timeout */ ) )
+ {
+ SAL_WARN( "sdremote.bluetooth", "Memory allocation failed on message send" );
+ dbus_message_unref( pMsg );
+ return nullptr;
+ }
+ dbus_connection_flush( pConnection );
+ dbus_message_unref( pMsg );
+
+ dbus_pending_call_block( pPending ); // block for reply
+
+ pMsg = dbus_pending_call_steal_reply( pPending );
+ if( !pMsg )
+ SAL_WARN( "sdremote.bluetooth", "no valid reply / timeout" );
+
+ dbus_pending_call_unref( pPending );
+ return pMsg;
+}
+
+static bool
+isBluez5Available(DBusConnection *pConnection)
+{
+ DBusMessage *pMsg;
+
+ // Simplest ways to check whether we have Bluez 5+ is to check
+ // that we can obtain adapters using the new interfaces.
+ // The first two error checks however don't tell us anything as they should
+ // succeed as long as dbus is working correctly.
+ pMsg = DBusObject( "org.bluez", "/", "org.freedesktop.DBus.ObjectManager" ).getMethodCall( "GetManagedObjects" );
+ if (!pMsg)
+ {
+ SAL_INFO("sdremote.bluetooth", "No GetManagedObjects call created");
+ return false;
+ }
+
+ pMsg = sendUnrefAndWaitForReply( pConnection, pMsg );
+ if (!pMsg)
+ {
+ SAL_INFO("sdremote.bluetooth", "No reply received");
+ return false;
+ }
+
+ // If dbus is working correctly and we aren't on bluez 5 this is where we
+ // should actually get the error.
+ if (dbus_message_get_error_name( pMsg ))
+ {
+ SAL_INFO( "sdremote.bluetooth", "GetManagedObjects call failed with \""
+ << dbus_message_get_error_name( pMsg )
+ << "\" -- we don't seem to have Bluez 5 available");
+ return false;
+ }
+ SAL_INFO("sdremote.bluetooth", "GetManagedObjects call seems to have succeeded -- we must be on Bluez 5");
+ dbus_message_unref(pMsg);
+ return true;
+}
+
+static std::unique_ptr<DBusObject>
+getBluez5Adapter(DBusConnection *pConnection)
+{
+ DBusMessage *pMsg;
+ // This returns a list of objects where we need to find the first
+ // org.bluez.Adapter1 .
+ pMsg = DBusObject( "org.bluez", "/", "org.freedesktop.DBus.ObjectManager" ).getMethodCall( "GetManagedObjects" );
+ if (!pMsg)
+ return nullptr;
+
+ const gchar* const pInterfaceType = "org.bluez.Adapter1";
+
+ pMsg = sendUnrefAndWaitForReply( pConnection, pMsg );
+
+ DBusMessageIter aObjectIterator;
+ if (pMsg && dbus_message_iter_init(pMsg, &aObjectIterator))
+ {
+ if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&aObjectIterator))
+ {
+ DBusMessageIter aObject;
+ dbus_message_iter_recurse(&aObjectIterator, &aObject);
+ do
+ {
+ if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&aObject))
+ {
+ DBusMessageIter aContainerIter;
+ dbus_message_iter_recurse(&aObject, &aContainerIter);
+ char *pPath = nullptr;
+ do
+ {
+ if (DBUS_TYPE_OBJECT_PATH == dbus_message_iter_get_arg_type(&aContainerIter))
+ {
+ dbus_message_iter_get_basic(&aContainerIter, &pPath);
+ SAL_INFO( "sdremote.bluetooth", "Something retrieved: '"
+ << pPath << "' '");
+ }
+ else if (DBUS_TYPE_ARRAY == dbus_message_iter_get_arg_type(&aContainerIter))
+ {
+ DBusMessageIter aInnerIter;
+ dbus_message_iter_recurse(&aContainerIter, &aInnerIter);
+ do
+ {
+ if (DBUS_TYPE_DICT_ENTRY == dbus_message_iter_get_arg_type(&aInnerIter))
+ {
+ DBusMessageIter aInnerInnerIter;
+ dbus_message_iter_recurse(&aInnerIter, &aInnerInnerIter);
+ do
+ {
+ if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&aInnerInnerIter))
+ {
+ char* pMessage;
+
+ dbus_message_iter_get_basic(&aInnerInnerIter, &pMessage);
+ if (pMessage == std::string_view("org.bluez.Adapter1"))
+ {
+ dbus_message_unref(pMsg);
+ if (pPath)
+ {
+ return std::make_unique<DBusObject>( "org.bluez", pPath, pInterfaceType );
+ }
+ assert(false); // We should already have pPath provided for us.
+ }
+ }
+ }
+ while (dbus_message_iter_next(&aInnerInnerIter));
+ }
+ }
+ while (dbus_message_iter_next(&aInnerIter));
+ }
+ }
+ while (dbus_message_iter_next(&aContainerIter));
+ }
+ }
+ while (dbus_message_iter_next(&aObject));
+ }
+ dbus_message_unref(pMsg);
+ }
+
+ return nullptr;
+}
+
+static DBusObject *
+bluez4GetDefaultService( DBusConnection *pConnection )
+{
+ DBusMessage *pMsg;
+ DBusMessageIter it;
+ const gchar* const pInterfaceType = "org.bluez.Service";
+
+ // org.bluez.manager only exists for bluez 4.
+ // getMethodCall should return NULL if there is any issue e.g. the
+ // if org.bluez.manager doesn't exist.
+ pMsg = DBusObject( "org.bluez", "/", "org.bluez.Manager" ).getMethodCall( "DefaultAdapter" );
+
+ if (!pMsg)
+ {
+ SAL_WARN("sdremote.bluetooth", "Couldn't retrieve DBusObject for DefaultAdapter");
+ return nullptr;
+ }
+
+ SAL_INFO("sdremote.bluetooth", "successfully retrieved org.bluez.Manager.DefaultAdapter, attempting to use.");
+ pMsg = sendUnrefAndWaitForReply( pConnection, pMsg );
+
+ if(!pMsg || !dbus_message_iter_init( pMsg, &it ) )
+ {
+ return nullptr;
+ }
+
+ // This works for Bluez 4
+ if( DBUS_TYPE_OBJECT_PATH == dbus_message_iter_get_arg_type( &it ) )
+ {
+ const char *pObjectPath = nullptr;
+ dbus_message_iter_get_basic( &it, &pObjectPath );
+ SAL_INFO( "sdremote.bluetooth", "DefaultAdapter retrieved: '"
+ << pObjectPath << "' '" << pInterfaceType << "'" );
+ dbus_message_unref( pMsg );
+ return new DBusObject( "org.bluez", pObjectPath, pInterfaceType );
+ }
+ // Some form of error, e.g. if we have bluez 5 we get a message that
+ // this method doesn't exist.
+ else if ( DBUS_TYPE_STRING == dbus_message_iter_get_arg_type( &it ) )
+ {
+ const char *pMessage = nullptr;
+ dbus_message_iter_get_basic( &it, &pMessage );
+ SAL_INFO( "sdremote.bluetooth", "Error message: '"
+ << pMessage << "' '" << pInterfaceType << "'" );
+ }
+ else
+ {
+ SAL_INFO( "sdremote.bluetooth", "invalid type of reply to DefaultAdapter: '"
+ << static_cast<char>(dbus_message_iter_get_arg_type( &it )) << "'" );
+ }
+ dbus_message_unref(pMsg);
+ return nullptr;
+}
+
+static bool
+bluez4RegisterServiceRecord( DBusConnection *pConnection, DBusObject *pAdapter,
+ const char *pServiceRecord )
+{
+ DBusMessage *pMsg;
+ DBusMessageIter it;
+
+ pMsg = pAdapter->getMethodCall( "AddRecord" );
+ dbus_message_iter_init_append( pMsg, &it );
+ dbus_message_iter_append_basic( &it, DBUS_TYPE_STRING, &pServiceRecord );
+
+ pMsg = sendUnrefAndWaitForReply( pConnection, pMsg );
+
+ if( !pMsg || !dbus_message_iter_init( pMsg, &it ) ||
+ dbus_message_iter_get_arg_type( &it ) != DBUS_TYPE_UINT32 )
+ {
+ SAL_WARN( "sdremote.bluetooth", "SDP registration failed" );
+ return false;
+ }
+
+ // We ignore the uint de-registration handle we get back:
+ // bluez will clean us up automatically on exit
+
+ return true;
+}
+
+static void
+bluezCreateAttachListeningSocket( GMainContext *pContext, GPollFD *pSocketFD )
+{
+ int nSocket;
+
+ pSocketFD->fd = -1;
+
+ if( ( nSocket = socket( AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM ) ) < 0 )
+ {
+ SAL_WARN( "sdremote.bluetooth", "failed to open bluetooth socket with error " << nSocket );
+ return;
+ }
+
+ sockaddr_rc aAddr;
+ // Initialize whole structure. Mainly to appease valgrind, which
+ // doesn't know about the padding at the end of sockaddr_rc which
+ // it will dutifully check for definedness. But also the standard
+ // definition of BDADDR_ANY is unusable in C++ code, so just use
+ // memset to set aAddr.rc_bdaddr to 0.
+ memset( &aAddr, 0, sizeof( aAddr ) );
+ aAddr.rc_family = AF_BLUETOOTH;
+ aAddr.rc_channel = 5;
+
+ int a;
+ if ( ( a = bind( nSocket, reinterpret_cast<sockaddr*>(&aAddr), sizeof(aAddr) ) ) < 0 ) {
+ SAL_WARN( "sdremote.bluetooth", "bind failed with error" << a );
+ close( nSocket );
+ return;
+ }
+
+ if ( ( a = listen( nSocket, 1 ) ) < 0 )
+ {
+ SAL_WARN( "sdremote.bluetooth", "listen failed with error" << a );
+ close( nSocket );
+ return;
+ }
+
+ // set non-blocking behaviour ...
+ if( fcntl( nSocket, F_SETFL, O_NONBLOCK) < 0 )
+ {
+ close( nSocket );
+ return;
+ }
+
+ pSocketFD->fd = nSocket;
+ pSocketFD->events = G_IO_IN | G_IO_PRI;
+ pSocketFD->revents = 0;
+
+ g_main_context_add_poll( pContext, pSocketFD, G_PRIORITY_DEFAULT );
+}
+
+static void
+bluezDetachCloseSocket( GMainContext *pContext, GPollFD *pSocketFD )
+{
+ if( pSocketFD->fd >= 0 )
+ {
+ close( pSocketFD->fd );
+ g_main_context_remove_poll( pContext, pSocketFD );
+ pSocketFD->fd = -1;
+ }
+}
+
+#endif // LINUX_BLUETOOTH
+
+#if defined(MACOSX)
+
+OSXBluetoothWrapper::OSXBluetoothWrapper( IOBluetoothRFCOMMChannel* channel ) :
+ mpChannel(channel),
+ mnMTU(0),
+ mHaveBytes(),
+ mMutex(),
+ mBuffer()
+{
+ // silly enough, can't write more than mnMTU bytes at once
+ mnMTU = [channel getMTU];
+
+ SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::OSXBluetoothWrapper(): mnMTU=" << mnMTU );
+}
+
+sal_Int32 OSXBluetoothWrapper::readLine( OString& aLine )
+{
+ SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine()" );
+
+ while( true )
+ {
+ {
+ SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine: entering mutex" );
+ ::osl::MutexGuard aQueueGuard( mMutex );
+ SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine: entered mutex" );
+
+#ifdef SAL_LOG_INFO
+ // We should have in the sal logging some standard way to
+ // output char buffers with non-printables escaped.
+ std::ostringstream s;
+ if (mBuffer.size() > 0)
+ {
+ for (unsigned char *p = reinterpret_cast<unsigned char *>(mBuffer.data()); p != reinterpret_cast<unsigned char *>(mBuffer.data()) + mBuffer.size(); p++)
+ {
+ if (*p == '\n')
+ s << "\\n";
+ else if (*p < ' ' || *p >= 0x7F)
+ s << "\\0x" << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(*p) << std::setfill(' ') << std::setw(1) << std::dec;
+ else
+ s << *p;
+ }
+ }
+ SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine mBuffer: \"" << s.str() << "\"" );
+#endif
+
+ // got enough bytes to return a line?
+ std::vector<char>::iterator aIt;
+ if ( (aIt = find( mBuffer.begin(), mBuffer.end(), '\n' ))
+ != mBuffer.end() )
+ {
+ sal_uInt64 aLocation = aIt - mBuffer.begin();
+
+ aLine = OString( &(*mBuffer.begin()), aLocation );
+
+ mBuffer.erase( mBuffer.begin(), aIt + 1 ); // Also delete the empty line
+
+ // yeps
+ SAL_INFO( "sdremote.bluetooth", " returning, got \"" << OStringToOUString( aLine, RTL_TEXTENCODING_UTF8 ) << "\"" );
+ return aLine.getLength() + 1;
+ }
+
+ // nope - wait some more (after releasing the mutex)
+ SAL_INFO( "sdremote.bluetooth", " resetting mHaveBytes" );
+ mHaveBytes.reset();
+ SAL_INFO( "sdremote.bluetooth", " leaving mutex" );
+ }
+
+ SAL_INFO( "sdremote.bluetooth", " waiting for mHaveBytes" );
+ mHaveBytes.wait();
+ SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::readLine: got mHaveBytes" );
+ }
+}
+
+sal_Int32 OSXBluetoothWrapper::write( const void* pBuffer, sal_uInt32 n )
+{
+ SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::write(" << pBuffer << ", " << n << ") mpChannel=" << mpChannel );
+
+ char const * ptr = static_cast<char const *>(pBuffer);
+ sal_uInt32 nBytesWritten = 0;
+
+ if (mpChannel == nil)
+ return 0;
+
+ while( nBytesWritten < n )
+ {
+ int toWrite = n - nBytesWritten;
+ toWrite = toWrite <= mnMTU ? toWrite : mnMTU;
+ if ( [mpChannel writeSync:const_cast<char *>(ptr) length:toWrite] != kIOReturnSuccess )
+ {
+ SAL_INFO( "sdremote.bluetooth", " [mpChannel writeSync:" << static_cast<void const *>(ptr) << " length:" << toWrite << "] returned error, total written " << nBytesWritten );
+ return nBytesWritten;
+ }
+ ptr += toWrite;
+ nBytesWritten += toWrite;
+ }
+ SAL_INFO( "sdremote.bluetooth", " total written " << nBytesWritten );
+ return nBytesWritten;
+}
+
+void OSXBluetoothWrapper::appendData(void* pBuffer, size_t len)
+{
+ SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::appendData(" << pBuffer << ", " << len << ")" );
+
+ if( len )
+ {
+ SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::appendData: entering mutex" );
+ ::osl::MutexGuard aQueueGuard( mMutex );
+ SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::appendData: entered mutex" );
+ mBuffer.insert(mBuffer.begin()+mBuffer.size(),
+ static_cast<char*>(pBuffer), static_cast<char *>(pBuffer)+len);
+ SAL_INFO( "sdremote.bluetooth", " setting mHaveBytes" );
+ mHaveBytes.set();
+ SAL_INFO( "sdremote.bluetooth", " leaving mutex" );
+ }
+}
+
+void OSXBluetoothWrapper::channelClosed()
+{
+ SAL_INFO( "sdremote.bluetooth", "OSXBluetoothWrapper::channelClosed()" );
+
+ mpChannel = nil;
+}
+
+void incomingCallback( void *userRefCon,
+ IOBluetoothUserNotificationRef,
+ IOBluetoothObjectRef objectRef )
+{
+ SAL_INFO( "sdremote.bluetooth", "incomingCallback()" );
+
+ BluetoothServer* pServer = static_cast<BluetoothServer*>(userRefCon);
+
+ IOBluetoothRFCOMMChannel* channel = [IOBluetoothRFCOMMChannel withRFCOMMChannelRef:reinterpret_cast<IOBluetoothRFCOMMChannelRef>(objectRef)];
+
+ OSXBluetoothWrapper* socket = new OSXBluetoothWrapper( channel);
+ Communicator* pCommunicator = new Communicator( std::unique_ptr<IBluetoothSocket>(socket) );
+ pServer->addCommunicator( pCommunicator );
+
+ ChannelDelegate* delegate = [[ChannelDelegate alloc] initWithCommunicatorAndSocket: pCommunicator socket: socket];
+ [channel setDelegate: delegate];
+ [delegate retain];
+
+ pCommunicator->launch();
+}
+
+void BluetoothServer::addCommunicator( Communicator* pCommunicator )
+{
+ mpCommunicators->push_back( pCommunicator );
+}
+
+#endif // MACOSX
+
+#ifdef LINUX_BLUETOOTH
+
+extern "C" {
+ static gboolean ensureDiscoverable_cb(gpointer)
+ {
+ BluetoothServer::doEnsureDiscoverable();
+ return FALSE; // remove source
+ }
+ static gboolean restoreDiscoverable_cb(gpointer)
+ {
+ BluetoothServer::doRestoreDiscoverable();
+ return FALSE; // remove source
+ }
+}
+
+/*
+ * Bluez 4 uses custom methods for setting properties, whereas Bluez 5+
+ * implements properties using the generic "org.freedesktop.DBus.Properties"
+ * interface -- hence we have a specific Bluez 4 function to deal with the
+ * old style of reading properties.
+ */
+static bool
+getBluez4BooleanProperty( DBusConnection *pConnection, DBusObject *pAdapter,
+ const char *pPropertyName, bool *pBoolean )
+{
+ *pBoolean = false;
+
+ if( !pAdapter )
+ return false;
+
+ DBusMessage *pMsg;
+ pMsg = sendUnrefAndWaitForReply( pConnection,
+ pAdapter->getMethodCall( "GetProperties" ) );
+
+ DBusMessageIter it;
+ if( !pMsg || !dbus_message_iter_init( pMsg, &it ) )
+ {
+ SAL_WARN( "sdremote.bluetooth", "no valid reply / timeout" );
+ return false;
+ }
+
+ if( DBUS_TYPE_ARRAY != dbus_message_iter_get_arg_type( &it ) )
+ {
+ SAL_WARN( "sdremote.bluetooth", "no valid reply / timeout" );
+ return false;
+ }
+
+ DBusMessageIter arrayIt;
+ dbus_message_iter_recurse( &it, &arrayIt );
+
+ while( dbus_message_iter_get_arg_type( &arrayIt ) == DBUS_TYPE_DICT_ENTRY )
+ {
+ DBusMessageIter dictIt;
+ dbus_message_iter_recurse( &arrayIt, &dictIt );
+
+ const char *pName = nullptr;
+ if( dbus_message_iter_get_arg_type( &dictIt ) == DBUS_TYPE_STRING )
+ {
+ dbus_message_iter_get_basic( &dictIt, &pName );
+ if( pName != nullptr && !strcmp( pName, pPropertyName ) )
+ {
+ SAL_INFO( "sdremote.bluetooth", "hit " << pPropertyName << " property" );
+ dbus_message_iter_next( &dictIt );
+ dbus_bool_t bBool = false;
+
+ if( dbus_message_iter_get_arg_type( &dictIt ) == DBUS_TYPE_VARIANT )
+ {
+ DBusMessageIter variantIt;
+ dbus_message_iter_recurse( &dictIt, &variantIt );
+
+ if( dbus_message_iter_get_arg_type( &variantIt ) == DBUS_TYPE_BOOLEAN )
+ {
+ dbus_message_iter_get_basic( &variantIt, &bBool );
+ SAL_INFO( "sdremote.bluetooth", "" << pPropertyName << " is " << bBool );
+ *pBoolean = bBool;
+ return true;
+ }
+ else
+ SAL_WARN( "sdremote.bluetooth", "" << pPropertyName << " type " <<
+ dbus_message_iter_get_arg_type( &variantIt ) );
+ }
+ else
+ SAL_WARN( "sdremote.bluetooth", "variant type ? " <<
+ dbus_message_iter_get_arg_type( &dictIt ) );
+ }
+ else
+ {
+ const char *pStr = pName ? pName : "<null>";
+ SAL_INFO( "sdremote.bluetooth", "property '" << pStr << "'" );
+ }
+ }
+ else
+ SAL_WARN( "sdremote.bluetooth", "unexpected property key type "
+ << dbus_message_iter_get_arg_type( &dictIt ) );
+ dbus_message_iter_next( &arrayIt );
+ }
+ dbus_message_unref( pMsg );
+
+ return false;
+}
+
+/*
+ * This gets an org.freedesktop.DBus.Properties boolean
+ * (as opposed to the old Bluez 4 custom properties methods as visible above).
+ */
+static bool
+getDBusBooleanProperty( DBusConnection *pConnection, DBusObject *pAdapter,
+ const char *pPropertyName, bool *pBoolean )
+{
+ assert( pAdapter );
+
+ *pBoolean = false;
+ bool bRet = false;
+
+ std::unique_ptr< DBusObject > pProperties (
+ pAdapter->cloneForInterface( "org.freedesktop.DBus.Properties" ) );
+
+ DBusMessage *pMsg = pProperties->getMethodCall( "Get" );
+
+ DBusMessageIter itIn;
+ dbus_message_iter_init_append( pMsg, &itIn );
+ const char* pInterface = "org.bluez.Adapter1";
+ dbus_message_iter_append_basic( &itIn, DBUS_TYPE_STRING, &pInterface );
+ dbus_message_iter_append_basic( &itIn, DBUS_TYPE_STRING, &pPropertyName );
+ pMsg = sendUnrefAndWaitForReply( pConnection, pMsg );
+
+ DBusMessageIter it;
+ if( !pMsg || !dbus_message_iter_init( pMsg, &it ) )
+ {
+ SAL_WARN( "sdremote.bluetooth", "no valid reply / timeout" );
+ return false;
+ }
+
+ if( DBUS_TYPE_VARIANT != dbus_message_iter_get_arg_type( &it ) )
+ {
+ SAL_WARN( "sdremote.bluetooth", "invalid return type" );
+ }
+ else
+ {
+ DBusMessageIter variantIt;
+ dbus_message_iter_recurse( &it, &variantIt );
+
+ if( dbus_message_iter_get_arg_type( &variantIt ) == DBUS_TYPE_BOOLEAN )
+ {
+ dbus_bool_t bBool = false;
+ dbus_message_iter_get_basic( &variantIt, &bBool );
+ SAL_INFO( "sdremote.bluetooth", "" << pPropertyName << " is " << bBool );
+ *pBoolean = bBool;
+ bRet = true;
+ }
+ else
+ {
+ SAL_WARN( "sdremote.bluetooth", "" << pPropertyName << " type " <<
+ dbus_message_iter_get_arg_type( &variantIt ) );
+ }
+
+ const char* pError = dbus_message_get_error_name( pMsg );
+ if ( pError )
+ {
+ SAL_WARN( "sdremote.bluetooth",
+ "Get failed for " << pPropertyName << " on " <<
+ pAdapter->maPath << " with error: " << pError );
+ }
+ }
+ dbus_message_unref( pMsg );
+
+ return bRet;
+}
+
+static void
+setDBusBooleanProperty( DBusConnection *pConnection, DBusObject *pAdapter,
+ const char *pPropertyName, bool bBoolean )
+{
+ assert( pAdapter );
+
+ std::unique_ptr< DBusObject > pProperties(
+ pAdapter->cloneForInterface( "org.freedesktop.DBus.Properties" ) );
+
+ DBusMessage *pMsg = pProperties->getMethodCall( "Set" );
+
+ DBusMessageIter itIn;
+ dbus_message_iter_init_append( pMsg, &itIn );
+ const char* pInterface = "org.bluez.Adapter1";
+ dbus_message_iter_append_basic( &itIn, DBUS_TYPE_STRING, &pInterface );
+ dbus_message_iter_append_basic( &itIn, DBUS_TYPE_STRING, &pPropertyName );
+
+ {
+ DBusMessageIter varIt;
+ dbus_message_iter_open_container( &itIn, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_BOOLEAN_AS_STRING, &varIt );
+ dbus_bool_t bDBusBoolean = bBoolean;
+ dbus_message_iter_append_basic( &varIt, DBUS_TYPE_BOOLEAN, &bDBusBoolean );
+ dbus_message_iter_close_container( &itIn, &varIt );
+ }
+
+ pMsg = sendUnrefAndWaitForReply( pConnection, pMsg );
+
+ if( !pMsg )
+ {
+ SAL_WARN( "sdremote.bluetooth", "no valid reply / timeout" );
+ }
+ else
+ {
+ const char* pError = dbus_message_get_error_name( pMsg );
+ if ( pError )
+ {
+ SAL_WARN( "sdremote.bluetooth",
+ "Set failed for " << pPropertyName << " on " <<
+ pAdapter->maPath << " with error: " << pError );
+ }
+ dbus_message_unref( pMsg );
+ }
+}
+
+static bool
+getDiscoverable( DBusConnection *pConnection, DBusObject *pAdapter )
+{
+ if (pAdapter->maInterface == "org.bluez.Adapter") // Bluez 4
+ {
+ bool bDiscoverable;
+ if( getBluez4BooleanProperty(pConnection, pAdapter, "Discoverable", &bDiscoverable ) )
+ return bDiscoverable;
+ }
+ else if (pAdapter->maInterface == "org.bluez.Adapter1") // Bluez 5
+ {
+ bool bDiscoverable;
+ if ( getDBusBooleanProperty(pConnection, pAdapter, "Discoverable", &bDiscoverable ) )
+ return bDiscoverable;
+ }
+ return false;
+}
+
+static void
+setDiscoverable( DBusConnection *pConnection, DBusObject *pAdapter, bool bDiscoverable )
+{
+ SAL_INFO( "sdremote.bluetooth", "setDiscoverable to " << bDiscoverable );
+
+ if (pAdapter->maInterface == "org.bluez.Adapter") // Bluez 4
+ {
+ bool bPowered = false;
+ if( !getBluez4BooleanProperty( pConnection, pAdapter, "Powered", &bPowered ) || !bPowered )
+ return; // nothing to do
+
+ DBusMessage *pMsg;
+ DBusMessageIter it, varIt;
+
+ // set timeout to zero
+ pMsg = pAdapter->getMethodCall( "SetProperty" );
+ dbus_message_iter_init_append( pMsg, &it );
+ const char *pTimeoutStr = "DiscoverableTimeout";
+ dbus_message_iter_append_basic( &it, DBUS_TYPE_STRING, &pTimeoutStr );
+ dbus_message_iter_open_container( &it, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_UINT32_AS_STRING, &varIt );
+ dbus_uint32_t nTimeout = 0;
+ dbus_message_iter_append_basic( &varIt, DBUS_TYPE_UINT32, &nTimeout );
+ dbus_message_iter_close_container( &it, &varIt );
+ dbus_connection_send( pConnection, pMsg, nullptr ); // async send - why not ?
+ dbus_message_unref( pMsg );
+
+ // set discoverable value
+ pMsg = pAdapter->getMethodCall( "SetProperty" );
+ dbus_message_iter_init_append( pMsg, &it );
+ const char *pDiscoverableStr = "Discoverable";
+ dbus_message_iter_append_basic( &it, DBUS_TYPE_STRING, &pDiscoverableStr );
+ dbus_message_iter_open_container( &it, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_BOOLEAN_AS_STRING, &varIt );
+ dbus_bool_t bValue = bDiscoverable;
+ dbus_message_iter_append_basic( &varIt, DBUS_TYPE_BOOLEAN, &bValue );
+ dbus_message_iter_close_container( &it, &varIt ); // async send - why not ?
+ dbus_connection_send( pConnection, pMsg, nullptr );
+ dbus_message_unref( pMsg );
+ }
+ else if (pAdapter->maInterface == "org.bluez.Adapter1") // Bluez 5
+ {
+ setDBusBooleanProperty(pConnection, pAdapter, "Discoverable", bDiscoverable );
+ }
+}
+
+static std::unique_ptr<DBusObject>
+registerWithDefaultAdapter( DBusConnection *pConnection )
+{
+ std::unique_ptr<DBusObject> pService(bluez4GetDefaultService( pConnection ));
+ if( pService )
+ {
+ if( !bluez4RegisterServiceRecord( pConnection, pService.get(),
+ bluetooth_service_record ) )
+ {
+ return nullptr;
+ }
+ }
+
+ return pService;
+}
+
+static void ProfileUnregisterFunction
+(DBusConnection *, void *)
+{
+ // We specifically don't need to do anything here.
+}
+
+static DBusHandlerResult ProfileMessageFunction
+(DBusConnection *pConnection, DBusMessage *pMessage, void *user_data)
+{
+ SAL_INFO("sdremote.bluetooth", "ProfileMessageFunction||" << dbus_message_get_interface(pMessage) << "||" << dbus_message_get_member(pMessage));
+
+ if (dbus_message_get_interface(pMessage) == std::string_view("org.bluez.Profile1"))
+ {
+ if (dbus_message_get_member(pMessage) == std::string_view("Release"))
+ {
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
+ else if (dbus_message_get_member(pMessage) == std::string_view("NewConnection"))
+ {
+ if (!dbus_message_has_signature(pMessage, "oha{sv}"))
+ {
+ SAL_WARN("sdremote.bluetooth", "wrong signature for NewConnection");
+ }
+
+ DBusMessageIter it;
+ if (!dbus_message_iter_init(pMessage, &it))
+ SAL_WARN( "sdremote.bluetooth", "error init dbus" );
+ else
+ {
+ char* pPath;
+ dbus_message_iter_get_basic(&it, &pPath);
+ SAL_INFO("sdremote.bluetooth", "Adapter path:" << pPath);
+
+ if (!dbus_message_iter_next(&it))
+ SAL_WARN("sdremote.bluetooth", "not enough parameters passed");
+
+ // DBUS_TYPE_UNIX_FD == 'h' -- doesn't exist in older versions
+ // of dbus (< 1.3?) hence defined manually for now
+ if ('h' == dbus_message_iter_get_arg_type(&it))
+ {
+
+ int nDescriptor;
+ dbus_message_iter_get_basic(&it, &nDescriptor);
+ std::vector<Communicator*>* pCommunicators = static_cast<std::vector<Communicator*>*>(user_data);
+
+ // Bluez gives us non-blocking sockets, but our code relies
+ // on blocking behaviour.
+ (void)fcntl(nDescriptor, F_SETFL, fcntl(nDescriptor, F_GETFL) & ~O_NONBLOCK);
+
+ SAL_INFO( "sdremote.bluetooth", "connection accepted " << nDescriptor);
+ Communicator* pCommunicator = new Communicator( std::make_unique<BufferedStreamSocket>( nDescriptor ) );
+ pCommunicators->push_back( pCommunicator );
+ pCommunicator->launch();
+ }
+
+ // For some reason an (empty?) reply is expected.
+ DBusMessage* pRet = dbus_message_new_method_return(pMessage);
+ dbus_connection_send(pConnection, pRet, nullptr);
+ dbus_message_unref(pRet);
+
+ // We could read the remote profile version and features here
+ // (i.e. they are provided as part of the DBusMessage),
+ // however for us they are irrelevant (as our protocol handles
+ // equivalent functionality independently of whether we're on
+ // bluetooth or normal network connection).
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
+ }
+ else if (dbus_message_get_member(pMessage) == std::string_view("RequestDisconnection"))
+ {
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
+ }
+ SAL_WARN("sdremote.bluetooth", "Couldn't handle message correctly.");
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+}
+
+static void
+setupBluez5Profile1(DBusConnection* pConnection, std::vector<Communicator*>* pCommunicators)
+{
+ bool bErr;
+
+ SAL_INFO("sdremote.bluetooth", "Attempting to register our org.bluez.Profile1");
+ static DBusObjectPathVTable aVTable;
+ aVTable.unregister_function = ProfileUnregisterFunction;
+ aVTable.message_function = ProfileMessageFunction;
+
+ // dbus_connection_try_register_object_path could be used but only exists for
+ // dbus >= 1.2 -- we really shouldn't be trying this twice in any case.
+ // (dbus_connection_try_register_object_path also returns an error with more
+ // information which could be useful for debugging purposes.)
+ bErr = !dbus_connection_register_object_path(pConnection, "/org/libreoffice/bluez/profile1", &aVTable, pCommunicators);
+
+ if (bErr)
+ {
+ SAL_WARN("sdremote.bluetooth", "Failed to register Bluez 5 Profile1 callback, bluetooth won't work.");
+ }
+
+ dbus_connection_flush( pConnection );
+}
+
+static void
+unregisterBluez5Profile(DBusConnection* pConnection)
+{
+ DBusMessage* pMsg = dbus_message_new_method_call("org.bluez", "/org/bluez",
+ "org.bluez.ProfileManager1", "UnregisterProfile");
+ DBusMessageIter it;
+ dbus_message_iter_init_append(pMsg, &it);
+
+ const char *pPath = "/org/libreoffice/bluez/profile1";
+ dbus_message_iter_append_basic(&it, DBUS_TYPE_OBJECT_PATH, &pPath);
+
+ pMsg = sendUnrefAndWaitForReply( pConnection, pMsg );
+
+ if (pMsg)
+ dbus_message_unref(pMsg);
+
+ dbus_connection_unregister_object_path( pConnection, "/org/libreoffice/bluez/profile1");
+
+ dbus_connection_flush(pConnection);
+}
+
+static bool
+registerBluez5Profile(DBusConnection* pConnection, std::vector<Communicator*>* pCommunicators)
+{
+ setupBluez5Profile1(pConnection, pCommunicators);
+
+ DBusMessage *pMsg;
+ DBusMessageIter it;
+
+ pMsg = dbus_message_new_method_call("org.bluez", "/org/bluez",
+ "org.bluez.ProfileManager1", "RegisterProfile");
+ dbus_message_iter_init_append(pMsg, &it);
+
+ const char *pPath = "/org/libreoffice/bluez/profile1";
+ dbus_message_iter_append_basic(&it, DBUS_TYPE_OBJECT_PATH, &pPath);
+ const char *pUUID = "spp"; // Bluez translates this to 0x1101 for spp
+ dbus_message_iter_append_basic(&it, DBUS_TYPE_STRING, &pUUID);
+
+ DBusMessageIter aOptionsIter;
+ dbus_message_iter_open_container(&it, DBUS_TYPE_ARRAY, "{sv}", &aOptionsIter);
+
+ DBusMessageIter aEntry;
+
+ {
+ dbus_message_iter_open_container(&aOptionsIter, DBUS_TYPE_DICT_ENTRY, nullptr, &aEntry);
+
+ const char *pString = "Name";
+ dbus_message_iter_append_basic(&aEntry, DBUS_TYPE_STRING, &pString);
+
+ const char *pValue = "LibreOffice Impress Remote";
+ DBusMessageIter aValue;
+ dbus_message_iter_open_container(&aEntry, DBUS_TYPE_VARIANT, "s", &aValue);
+ dbus_message_iter_append_basic(&aValue, DBUS_TYPE_STRING, &pValue);
+ dbus_message_iter_close_container(&aEntry, &aValue);
+ dbus_message_iter_close_container(&aOptionsIter, &aEntry);
+ }
+
+ dbus_message_iter_close_container(&it, &aOptionsIter);
+
+ // Other properties that we could set (but don't, since they appear
+ // to be useless for us):
+ // "Service": "0x1101" (not needed, but we used to have it in the manually defined profile).
+ // "Role": setting this to "server" breaks things, although we think we're a server?
+ // "Channel": seems to be dealt with automatically (but we used to use 5 in the manual profile).
+
+ bool bSuccess = true;
+
+ pMsg = sendUnrefAndWaitForReply( pConnection, pMsg );
+
+ DBusError aError;
+ dbus_error_init(&aError);
+ if (pMsg && dbus_set_error_from_message( &aError, pMsg ))
+ {
+ bSuccess = false;
+ SAL_WARN("sdremote.bluetooth",
+ "Failed to register our Profile1 with bluez ProfileManager "
+ << (aError.message ? aError.message : "<null>"));
+ }
+
+ dbus_error_free(&aError);
+ if (pMsg)
+ dbus_message_unref(pMsg);
+
+ dbus_connection_flush(pConnection);
+
+ return bSuccess;
+}
+
+#endif // LINUX_BLUETOOTH
+
+BluetoothServer::BluetoothServer( std::vector<Communicator*>* pCommunicators )
+ : meWasDiscoverable( UNKNOWN ),
+ mpCommunicators( pCommunicators )
+{
+#ifdef LINUX_BLUETOOTH
+ // D-Bus requires the following in order to be thread-safe (and we
+ // potentially access D-Bus from different threads in different places of
+ // the code base):
+ if (!dbus_threads_init_default()) {
+ throw std::bad_alloc();
+ }
+
+ mpImpl.reset(new BluetoothServer::Impl());
+#endif
+}
+
+BluetoothServer::~BluetoothServer()
+{
+}
+
+void BluetoothServer::ensureDiscoverable()
+{
+#ifdef LINUX_BLUETOOTH
+ // Push it all across into our mainloop
+ if( !spServer )
+ return;
+ GSource *pIdle = g_idle_source_new();
+ g_source_set_callback( pIdle, ensureDiscoverable_cb, nullptr, nullptr );
+ g_source_set_priority( pIdle, G_PRIORITY_DEFAULT );
+ g_source_attach( pIdle, spServer->mpImpl->mpContext );
+ g_source_unref( pIdle );
+#endif
+}
+
+void BluetoothServer::restoreDiscoverable()
+{
+#ifdef LINUX_BLUETOOTH
+ // Push it all across into our mainloop
+ if( !spServer )
+ return;
+ GSource *pIdle = g_idle_source_new();
+ g_source_set_callback( pIdle, restoreDiscoverable_cb, nullptr, nullptr );
+ g_source_set_priority( pIdle, G_PRIORITY_DEFAULT_IDLE );
+ g_source_attach( pIdle, spServer->mpImpl->mpContext );
+ g_source_unref( pIdle );
+#endif
+}
+
+void BluetoothServer::doEnsureDiscoverable()
+{
+#ifdef LINUX_BLUETOOTH
+ if (!spServer->mpImpl->mpConnection ||
+ spServer->meWasDiscoverable != UNKNOWN )
+ return;
+
+ // Find out if we are discoverable already ...
+ std::unique_ptr<DBusObject> pAdapter = spServer->mpImpl->getAdapter();
+ if( !pAdapter )
+ return;
+
+ bool bDiscoverable = getDiscoverable(spServer->mpImpl->mpConnection, pAdapter.get() );
+
+ spServer->meWasDiscoverable = bDiscoverable ? DISCOVERABLE : NOT_DISCOVERABLE;
+ if( !bDiscoverable )
+ setDiscoverable( spServer->mpImpl->mpConnection, pAdapter.get(), true );
+#endif
+}
+
+void BluetoothServer::doRestoreDiscoverable()
+{
+ if( spServer->meWasDiscoverable == NOT_DISCOVERABLE )
+ {
+#ifdef LINUX_BLUETOOTH
+ std::unique_ptr<DBusObject> pAdapter = spServer->mpImpl->getAdapter();
+ if( !pAdapter )
+ return;
+ setDiscoverable( spServer->mpImpl->mpConnection, pAdapter.get(), false );
+#endif
+ }
+ spServer->meWasDiscoverable = UNKNOWN;
+}
+
+// We have to have all our clients shut otherwise we can't
+// re-bind to the same port number it appears.
+void BluetoothServer::cleanupCommunicators()
+{
+ for (auto& rpCommunicator : *mpCommunicators)
+ rpCommunicator->forceClose();
+ // the hope is that all the threads then terminate cleanly and
+ // clean themselves up.
+}
+
+void SAL_CALL BluetoothServer::run()
+{
+ SAL_INFO( "sdremote.bluetooth", "BluetoothServer::run called" );
+ osl::Thread::setName("BluetoothServer");
+#ifdef LINUX_BLUETOOTH
+ DBusConnection *pConnection = dbusConnectToNameOnBus();
+ if( !pConnection )
+ return;
+
+ // For either implementation we need to poll the dbus fd
+ int fd = -1;
+ GPollFD aDBusFD;
+ if( dbus_connection_get_unix_fd( pConnection, &fd ) && fd >= 0 )
+ {
+ aDBusFD.fd = fd;
+ aDBusFD.events = G_IO_IN | G_IO_PRI;
+ g_main_context_add_poll( mpImpl->mpContext, &aDBusFD, G_PRIORITY_DEFAULT );
+ }
+ else
+ SAL_WARN( "sdremote.bluetooth", "failed to poll for incoming dbus signals" );
+
+ if (isBluez5Available(pConnection))
+ {
+ SAL_INFO("sdremote.bluetooth", "Using Bluez 5");
+ registerBluez5Profile(pConnection, mpCommunicators);
+ mpImpl->mpConnection = pConnection;
+ mpImpl->maBluezVersion = Impl::BluezVersion::BLUEZ5;
+
+ // We don't need to listen to adapter changes anymore -- profile
+ // registration is done globally for the entirety of bluez, so we only
+ // need adapters when setting discoverability, which can be done
+ // dynamically without the need to listen for changes.
+
+ // TODO: exit on SD deinit
+ // Probably best to do that in SdModule::~SdModule?
+ while (true)
+ {
+ aDBusFD.revents = 0;
+ g_main_context_iteration( mpImpl->mpContext, true );
+ if( aDBusFD.revents )
+ {
+ dbus_connection_read_write( pConnection, 0 );
+ while (DBUS_DISPATCH_DATA_REMAINS == dbus_connection_get_dispatch_status( pConnection ))
+ dbus_connection_dispatch( pConnection );
+ }
+ if ((false)) break;
+ // silence Clang -Wunreachable-code after loop (TODO: proper
+ // fix?)
+ }
+ unregisterBluez5Profile( pConnection );
+ g_main_context_unref( mpImpl->mpContext );
+ mpImpl->mpConnection = nullptr;
+ mpImpl->mpContext = nullptr;
+ return;
+ }
+
+ // Otherwise we could be on Bluez 4 and continue as usual.
+ mpImpl->maBluezVersion = Impl::BluezVersion::BLUEZ4;
+
+ // Try to setup the default adapter, otherwise wait for add/remove signal
+ mpImpl->mpService = registerWithDefaultAdapter( pConnection );
+ // listen for connection state and power changes - we need to close
+ // and re-create our socket code on suspend / resume, enable/disable
+ DBusError aError;
+ dbus_error_init( &aError );
+ dbus_bus_add_match( pConnection, "type='signal',interface='org.bluez.Manager'", &aError );
+ dbus_connection_flush( pConnection );
+
+ // Try to setup the default adapter, otherwise wait for add/remove signal
+ mpImpl->mpService = registerWithDefaultAdapter( pConnection );
+
+ // poll on our bluetooth socket - if we can.
+ GPollFD aSocketFD;
+ if( mpImpl->mpService )
+ bluezCreateAttachListeningSocket( mpImpl->mpContext, &aSocketFD );
+
+ mpImpl->mpConnection = pConnection;
+
+ while( true )
+ {
+ aDBusFD.revents = 0;
+ aSocketFD.revents = 0;
+ g_main_context_iteration( mpImpl->mpContext, true );
+
+ SAL_INFO( "sdremote.bluetooth", "main-loop spin "
+ << aDBusFD.revents << " " << aSocketFD.revents );
+ if( aDBusFD.revents )
+ {
+ dbus_connection_read_write( pConnection, 0 );
+ DBusMessage *pMsg = dbus_connection_pop_message( pConnection );
+ if( pMsg )
+ {
+ if( dbus_message_is_signal( pMsg, "org.bluez.Manager", "AdapterRemoved" ) )
+ {
+ SAL_WARN( "sdremote.bluetooth", "lost adapter - cleaning up sockets" );
+ bluezDetachCloseSocket( mpImpl->mpContext, &aSocketFD );
+ cleanupCommunicators();
+ }
+ else if( dbus_message_is_signal( pMsg, "org.bluez.Manager", "AdapterAdded" ) ||
+ dbus_message_is_signal( pMsg, "org.bluez.Manager", "DefaultAdapterChanged" ) )
+ {
+ SAL_WARN( "sdremote.bluetooth", "gained adapter - re-generating sockets" );
+ bluezDetachCloseSocket( mpImpl->mpContext, &aSocketFD );
+ cleanupCommunicators();
+ mpImpl->mpService = registerWithDefaultAdapter( pConnection );
+ if( mpImpl->mpService )
+ bluezCreateAttachListeningSocket( mpImpl->mpContext, &aSocketFD );
+ }
+ else
+ SAL_INFO( "sdremote.bluetooth", "unknown incoming dbus message, "
+ " type: " << dbus_message_get_type( pMsg )
+ << " path: '" << dbus_message_get_path( pMsg )
+ << "' interface: '" << dbus_message_get_interface( pMsg )
+ << "' member: '" << dbus_message_get_member( pMsg ) );
+ }
+ dbus_message_unref( pMsg );
+ }
+
+ if( aSocketFD.revents )
+ {
+ sockaddr_rc aRemoteAddr;
+ socklen_t aRemoteAddrLen = sizeof(aRemoteAddr);
+
+ SAL_INFO( "sdremote.bluetooth", "performing accept" );
+ int nClient = accept( aSocketFD.fd, reinterpret_cast<sockaddr*>(&aRemoteAddr), &aRemoteAddrLen);
+ if ( nClient < 0 && errno != EAGAIN )
+ {
+ SAL_WARN( "sdremote.bluetooth", "accept failed with errno " << errno );
+ } else {
+ SAL_INFO( "sdremote.bluetooth", "connection accepted " << nClient );
+ Communicator* pCommunicator = new Communicator( std::make_unique<BufferedStreamSocket>( nClient ) );
+ mpCommunicators->push_back( pCommunicator );
+ pCommunicator->launch();
+ }
+ }
+ if ((false)) break;
+ // silence Clang -Wunreachable-code after loop (TODO: proper fix?)
+ }
+
+ unregisterBluez5Profile( pConnection );
+ g_main_context_unref( mpImpl->mpContext );
+ mpImpl->mpConnection = nullptr;
+ mpImpl->mpContext = nullptr;
+
+#elif defined(_WIN32)
+ WORD wVersionRequested;
+ WSADATA wsaData;
+
+ wVersionRequested = MAKEWORD(2, 2);
+
+ if ( WSAStartup(wVersionRequested, &wsaData) )
+ {
+ return; // winsock dll couldn't be loaded
+ }
+
+ int aSocket = socket( AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM );
+ if ( !aSocket )
+ {
+ WSACleanup();
+ return;
+ }
+ SOCKADDR_BTH aAddr;
+ aAddr.addressFamily = AF_BTH;
+ aAddr.btAddr = 0;
+ aAddr.serviceClassId = GUID_NULL;
+ aAddr.port = BT_PORT_ANY; // Select any free socket.
+ if ( bind( aSocket, reinterpret_cast<SOCKADDR*>(&aAddr), sizeof(aAddr) ) == SOCKET_ERROR )
+ {
+ closesocket( aSocket );
+ WSACleanup();
+ return;
+ }
+
+ SOCKADDR_BTH aName;
+ int aNameSize = sizeof(aName);
+ getsockname( aSocket, reinterpret_cast<SOCKADDR*>(&aName), &aNameSize ); // Retrieve the local address and port
+
+ CSADDR_INFO aAddrInfo = {};
+ aAddrInfo.LocalAddr.lpSockaddr = reinterpret_cast<SOCKADDR*>(&aName);
+ aAddrInfo.LocalAddr.iSockaddrLength = sizeof( SOCKADDR_BTH );
+ aAddrInfo.iSocketType = SOCK_STREAM;
+ aAddrInfo.iProtocol = BTHPROTO_RFCOMM;
+
+ // To be used for setting a custom UUID once available.
+// GUID uuid;
+// uuid.Data1 = 0x00001101;
+// memset( &uuid, 0x1000 + UUID*2^96, sizeof( GUID ) );
+// uuid.Data2 = 0;
+// uuid.Data3 = 0x1000;
+// ULONGLONG aData4 = 0x800000805F9B34FB;
+// memcpy( uuid.Data4, &aData4, sizeof(uuid.Data4) );
+
+ WSAQUERYSETW aRecord = {};
+ aRecord.dwSize = sizeof(aRecord);
+ aRecord.lpszServiceInstanceName = const_cast<wchar_t *>(
+ L"LibreOffice Impress Remote Control");
+ aRecord.lpszComment = const_cast<wchar_t *>(
+ L"Remote control of presentations over bluetooth.");
+ aRecord.lpServiceClassId = const_cast<LPGUID>(&SerialPortServiceClass_UUID);
+ aRecord.dwNameSpace = NS_BTH;
+ aRecord.dwNumberOfCsAddrs = 1;
+ aRecord.lpcsaBuffer = &aAddrInfo;
+ if (WSASetServiceW( &aRecord, RNRSERVICE_REGISTER, 0 ) == SOCKET_ERROR)
+ {
+ closesocket( aSocket );
+ WSACleanup();
+ return;
+ }
+
+ if ( listen( aSocket, 1 ) == SOCKET_ERROR )
+ {
+ closesocket( aSocket );
+ WSACleanup();
+ return;
+ }
+
+ SOCKADDR_BTH aRemoteAddr;
+ int aRemoteAddrLen = sizeof(aRemoteAddr);
+ while ( true )
+ {
+ SOCKET socket;
+ if ( (socket = accept(aSocket, reinterpret_cast<sockaddr*>(&aRemoteAddr), &aRemoteAddrLen)) == INVALID_SOCKET )
+ {
+ closesocket( aSocket );
+ WSACleanup();
+ return;
+ } else {
+ Communicator* pCommunicator = new Communicator( std::make_unique<BufferedStreamSocket>( socket) );
+ mpCommunicators->push_back( pCommunicator );
+ pCommunicator->launch();
+ }
+ }
+
+#elif defined(MACOSX)
+ // Build up dictionary at run-time instead of bothering with a
+ // .plist file, using the Objective-C API
+
+ // Compare to BluetoothServiceRecord.hxx
+
+ NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
+
+ NSDictionary *dict =
+ [NSDictionary dictionaryWithObjectsAndKeys:
+
+ // Service class ID list
+ [NSArray arrayWithObject:
+ [IOBluetoothSDPUUID uuid16: kBluetoothSDPUUID16ServiceClassSerialPort]],
+ @"0001 - ServiceClassIDList",
+
+ // Protocol descriptor list
+ [NSArray arrayWithObjects:
+ [NSArray arrayWithObject: [IOBluetoothSDPUUID uuid16: kBluetoothSDPUUID16L2CAP]],
+ [NSArray arrayWithObjects:
+ [IOBluetoothSDPUUID uuid16: kBluetoothL2CAPPSMRFCOMM],
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInt: 1],
+ @"DataElementSize",
+ [NSNumber numberWithInt: 1],
+ @"DataElementType",
+ [NSNumber numberWithInt: 5], // RFCOMM port number, will be replaced if necessary automatically
+ @"DataElementValue",
+ nil],
+ nil],
+ nil],
+ @"0004 - Protocol descriptor list",
+
+ // Browse group list
+ [NSArray arrayWithObject:
+ [IOBluetoothSDPUUID uuid16: kBluetoothSDPUUID16ServiceClassPublicBrowseGroup]],
+ @"0005 - BrowseGroupList",
+
+ // Language base attribute ID list
+ [NSArray arrayWithObjects:
+ [NSData dataWithBytes: "en" length: 2],
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInt: 2],
+ @"DataElementSize",
+ [NSNumber numberWithInt: 1],
+ @"DataElementType",
+ [NSNumber numberWithInt: 0x006a], // encoding
+ @"DataElementValue",
+ nil],
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInt: 2],
+ @"DataElementSize",
+ [NSNumber numberWithInt: 1],
+ @"DataElementType",
+ [NSNumber numberWithInt: 0x0100], // offset
+ @"DataElementValue",
+ nil],
+ nil],
+ @"0006 - LanguageBaseAttributeIDList",
+
+ // Bluetooth profile descriptor list
+ [NSArray arrayWithObject:
+ [NSArray arrayWithObjects:
+ [IOBluetoothSDPUUID uuid16: kBluetoothSDPUUID16ServiceClassSerialPort],
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInt: 2],
+ @"DataElementSize",
+ [NSNumber numberWithInt: 1],
+ @"DataElementType",
+ [NSNumber numberWithInt: 0x0100], // version number ?
+ @"DataElementValue",
+ nil],
+ nil]],
+ @"0009 - BluetoothProfileDescriptorList",
+
+ // Attributes pointed to by the LanguageBaseAttributeIDList
+ @"LibreOffice Impress Remote Control",
+ @"0100 - ServiceName",
+ @"The Document Foundation",
+ @"0102 - ProviderName",
+ nil];
+
+ // Create service
+ IOBluetoothSDPServiceRecordRef serviceRecordRef;
+ SAL_WNODEPRECATED_DECLARATIONS_PUSH //TODO: 10.9 IOBluetoothAddServiceDict
+ IOReturn rc = IOBluetoothAddServiceDict(reinterpret_cast<CFDictionaryRef>(dict), &serviceRecordRef);
+ SAL_WNODEPRECATED_DECLARATIONS_POP
+
+ SAL_INFO("sdremote.bluetooth", "IOBluetoothAddServiceDict returned " << rc);
+
+ if (rc == kIOReturnSuccess)
+ {
+ IOBluetoothSDPServiceRecord *serviceRecord =
+ [IOBluetoothSDPServiceRecord withSDPServiceRecordRef: serviceRecordRef];
+
+ BluetoothRFCOMMChannelID channelID;
+ [serviceRecord getRFCOMMChannelID: &channelID];
+
+ BluetoothSDPServiceRecordHandle serviceRecordHandle;
+ [serviceRecord getServiceRecordHandle: &serviceRecordHandle];
+
+ // Register callback for incoming connections
+ IOBluetoothRegisterForFilteredRFCOMMChannelOpenNotifications(
+ incomingCallback,
+ this,
+ channelID,
+ kIOBluetoothUserNotificationChannelDirectionIncoming);
+
+ [serviceRecord release];
+ }
+
+ [pool release];
+
+ (void) mpCommunicators;
+#else
+ (void) mpCommunicators; // avoid warnings about unused member
+#endif
+}
+
+BluetoothServer *sd::BluetoothServer::spServer = nullptr;
+
+void BluetoothServer::setup( std::vector<Communicator*>* pCommunicators )
+{
+ if (spServer)
+ return;
+
+ spServer = new BluetoothServer( pCommunicators );
+ spServer->create();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/BluetoothServer.hxx b/sd/source/ui/remotecontrol/BluetoothServer.hxx
new file mode 100644
index 000000000..9e20bfa51
--- /dev/null
+++ b/sd/source/ui/remotecontrol/BluetoothServer.hxx
@@ -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/.
+ */
+#pragma once
+
+#include <osl/thread.hxx>
+#include <memory>
+#include <vector>
+
+#include <config_dbus.h>
+
+#if (defined(LINUX) && !defined(__FreeBSD_kernel__)) && ENABLE_DBUS && DBUS_HAVE_GLIB
+# define LINUX_BLUETOOTH
+#endif
+
+namespace sd
+{
+ class Communicator;
+
+ class BluetoothServer:
+ public osl::Thread
+ {
+ public:
+ static void setup( std::vector<Communicator*>* pCommunicators );
+
+ /// ensure that Bluetooth discoverability is on
+ static void ensureDiscoverable();
+ /// restore the state of discoverability from before ensureDiscoverable
+ static void restoreDiscoverable();
+
+ // called by C / idle callbacks
+ static void doEnsureDiscoverable();
+ static void doRestoreDiscoverable();
+
+#if defined(MACOSX)
+ void addCommunicator( Communicator* pCommunicator );
+#endif
+ private:
+ explicit BluetoothServer( std::vector<Communicator*>* pCommunicators );
+ virtual ~BluetoothServer() override;
+
+ enum { UNKNOWN, DISCOVERABLE, NOT_DISCOVERABLE } meWasDiscoverable;
+ static BluetoothServer *spServer;
+
+#ifdef LINUX_BLUETOOTH
+ struct Impl;
+ std::unique_ptr<Impl> mpImpl;
+#endif
+ virtual void SAL_CALL run() override;
+
+ void cleanupCommunicators();
+ std::vector<Communicator*>* mpCommunicators;
+ };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/BluetoothServer.mm b/sd/source/ui/remotecontrol/BluetoothServer.mm
new file mode 100644
index 000000000..28288ff6f
--- /dev/null
+++ b/sd/source/ui/remotecontrol/BluetoothServer.mm
@@ -0,0 +1 @@
+#include "BluetoothServer.cxx" \ No newline at end of file
diff --git a/sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx b/sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx
new file mode 100644
index 000000000..c1a00fb3b
--- /dev/null
+++ b/sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx
@@ -0,0 +1,75 @@
+/* -*- 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/.
+ */
+
+#pragma once
+
+// FIXME: look into sharing definitions across OS's (i.e. UUID and port ).
+// Look into dynamically determining which ports are available.
+
+// SDP is a Service Description Protocol cf.
+// http://developer.bluetooth.org/TechnologyOverview/Pages/DI.aspx
+// This is an XML representation, an alternative would be a
+// binary SDP record.
+
+// for numbers see:
+// https://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm
+
+const char * const bluetooth_service_record =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<record>"
+ "<attribute id=\"0x0001\">" // Service class ID list
+ "<sequence>"
+ "<uuid value=\"0x1101\"/>" // an assigned service class meaning: 'serial port'
+ // we could add our own 'LibreOffice remote' service
+ // class here too in future ...
+ "</sequence>"
+ "</attribute>"
+ "<attribute id=\"0x0004\">" // Protocol Descriptor list
+ "<sequence>"
+ "<sequence>"
+ "<uuid value=\"0x0100\"/>" // L2CAP Protocol descriptor
+ "</sequence>"
+ "<sequence>"
+ "<uuid value=\"0x0003\"/>" // enumeration value of RFCOMM protocol
+ "<uint8 value=\"0x05\"/>" // RFCOMM port number
+ "</sequence>"
+ "</sequence>"
+ "</attribute>"
+ "<attribute id=\"0x0005\">" // Browse Group List
+ "<sequence>"
+ "<uuid value=\"0x1002\"/>" // public browse class
+ "</sequence>"
+ "</attribute>"
+ "<attribute id=\"0x0006\">" // Language Base Attribute ID List
+ "<sequence>"
+ "<uint16 value=\"0x656e\"/>" // code_ISO639
+ "<uint16 value=\"0x006a\"/>" // encoding 0x6a
+ "<uint16 value=\"0x0100\"/>" // base_offset ie. points to below =>
+ "</sequence>"
+ "</attribute>"
+ "<attribute id=\"0x0009\">" // Bluetooth Profile Descriptor List
+ "<sequence>"
+ "<sequence>"
+ "<uuid value=\"0x1101\"/>" // 'serial port' UUID as above
+ "<uint16 value=\"0x0100\"/>"// version number 1.0 ?
+ "</sequence>"
+ "</sequence>"
+ "</attribute>"
+ // Attribute identifiers are pointed to by the Language Base Attribute ID List
+ // id+0 = ServiceName, id+1 = ServiceDescription, id+2=ProviderName
+ "<attribute id=\"0x0100\">"
+ "<text value=\"LibreOffice Impress Remote Control\"/>"
+ "</attribute>"
+ "<attribute id=\"0x0102\">"
+ "<text value=\"The Document Foundation\"/>"
+ "</attribute>"
+ "</record>"
+ ;
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/BufferedStreamSocket.cxx b/sd/source/ui/remotecontrol/BufferedStreamSocket.cxx
new file mode 100644
index 000000000..64ad5eb8d
--- /dev/null
+++ b/sd/source/ui/remotecontrol/BufferedStreamSocket.cxx
@@ -0,0 +1,130 @@
+/* -*- 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 "BufferedStreamSocket.hxx"
+
+#include <osl/socket.hxx>
+#include <sal/log.hxx>
+#include <algorithm>
+
+#ifdef _WIN32
+ // LO vs WinAPI conflict
+ #undef WB_LEFT
+ #undef WB_RIGHT
+
+ #include <winsock2.h>
+#else
+ #include <sys/socket.h>
+ #include <unistd.h>
+#endif
+using namespace sd;
+using namespace osl;
+
+BufferedStreamSocket::BufferedStreamSocket( const osl::StreamSocket &aSocket ):
+ StreamSocket( aSocket ),
+ aRet( 0 ),
+ aRead( 0 ),
+ mSocket( 0 ),
+ usingCSocket( false )
+{
+}
+
+BufferedStreamSocket::BufferedStreamSocket( int aSocket ):
+ aRet( 0 ),
+ aRead( 0 ),
+ mSocket( aSocket ),
+ usingCSocket( true )
+{
+}
+
+BufferedStreamSocket::~BufferedStreamSocket() {
+ close();
+}
+
+void BufferedStreamSocket::getPeerAddr(osl::SocketAddr& rAddr)
+{
+ assert ( !usingCSocket );
+ StreamSocket::getPeerAddr( rAddr );
+}
+
+sal_Int32 BufferedStreamSocket::write( const void* pBuffer, sal_uInt32 n )
+{
+ if ( !usingCSocket )
+ return StreamSocket::write( pBuffer, n );
+ else
+ return ::send(
+ mSocket,
+#if defined(_WIN32)
+ static_cast<char const *>(pBuffer),
+#else
+ pBuffer,
+#endif
+ static_cast<size_t>(n), 0 );
+}
+
+void BufferedStreamSocket::close()
+{
+ if( usingCSocket && mSocket != -1 )
+ {
+#ifdef _WIN32
+ ::closesocket( mSocket );
+#else
+ ::close( mSocket );
+#endif
+ mSocket = -1;
+ }
+ else
+ ::osl::StreamSocket::close();
+}
+
+sal_Int32 BufferedStreamSocket::readLine( OString& aLine )
+{
+ while ( true )
+ {
+ // Process buffer first in case data already present.
+ std::vector<char>::iterator aIt;
+ if ( (aIt = find( aBuffer.begin(), aBuffer.end(), '\n' ))
+ != aBuffer.end() )
+ {
+ sal_uInt64 aLocation = aIt - aBuffer.begin();
+
+ aLine = OString( &(*aBuffer.begin()), aLocation );
+
+ aBuffer.erase( aBuffer.begin(), aIt + 1 ); // Also delete the empty line
+ aRead -= (aLocation + 1);
+
+ SAL_INFO( "sdremote.bluetooth", "recv line '" << aLine << "'" );
+
+ return aLine.getLength() + 1;
+ }
+
+ // Then try and receive if nothing present
+ aBuffer.resize( aRead + 100 );
+ if ( !usingCSocket)
+ aRet = StreamSocket::recv( &aBuffer[aRead], 100 );
+ else
+ aRet = ::recv( mSocket, &aBuffer[aRead], 100, 0 );
+
+ SAL_INFO( "sdremote.bluetooth", "recv " << aRet << " aBuffer len " << aBuffer.size() );
+ if ( aRet <= 0 )
+ {
+ return 0;
+ }
+ // Prevent buffer from growing massively large.
+ if ( aRead > MAX_LINE_LENGTH )
+ {
+ aBuffer.clear();
+ return 0;
+ }
+ aRead += aRet;
+ }
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/BufferedStreamSocket.hxx b/sd/source/ui/remotecontrol/BufferedStreamSocket.hxx
new file mode 100644
index 000000000..6abf7ec1b
--- /dev/null
+++ b/sd/source/ui/remotecontrol/BufferedStreamSocket.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/.
+ */
+#pragma once
+
+#include "IBluetoothSocket.hxx"
+#include <osl/socket_decl.hxx>
+#include <vector>
+
+#define MAX_LINE_LENGTH 20000
+
+namespace sd
+{
+
+ /**
+ * [A wrapper for an osl StreamSocket to allow reading lines.]
+ *
+ * Currently wraps either an osl StreamSocket or a standard c socket,
+ * allowing reading and writing for our purposes. Should eventually be
+ * returned to being a StreamSocket wrapper if/when Bluetooth is
+ * integrated into osl Sockets.
+ */
+ class BufferedStreamSocket final :
+ public IBluetoothSocket,
+ private ::osl::StreamSocket
+ {
+ public:
+ /**
+ * Create a BufferedStreamSocket on top of an
+ * osl::StreamSocket.
+ */
+ explicit BufferedStreamSocket( const osl::StreamSocket &aSocket );
+ /**
+ * Create a BufferedStreamSocket on top of a POSIX or WinSock socket.
+ */
+ explicit BufferedStreamSocket( int aSocket );
+ BufferedStreamSocket( const BufferedStreamSocket &aSocket );
+
+ ~BufferedStreamSocket();
+
+ /**
+ * Blocks until a line is read.
+ * Returns whatever the last call of recv returned, i.e. 0 or less
+ * if there was a problem in communications.
+ */
+ virtual sal_Int32 readLine( OString& aLine ) override;
+
+ virtual sal_Int32 write( const void* pBuffer, sal_uInt32 n ) override;
+
+ virtual void close() override;
+
+ void getPeerAddr(osl::SocketAddr&);
+ private:
+ sal_Int32 aRet, aRead;
+ std::vector<char> aBuffer;
+ int mSocket;
+ bool usingCSocket;
+ };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/Communicator.cxx b/sd/source/ui/remotecontrol/Communicator.cxx
new file mode 100644
index 000000000..59509ed3c
--- /dev/null
+++ b/sd/source/ui/remotecontrol/Communicator.cxx
@@ -0,0 +1,154 @@
+/* -*- 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 <vector>
+
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/presentation/XPresentation2.hpp>
+#include <com/sun/star/presentation/XPresentationSupplier.hpp>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/documentinfo.hxx>
+#include <config_version.h>
+#include <rtl/string.hxx>
+#include <sal/log.hxx>
+
+#include "Communicator.hxx"
+#include "IBluetoothSocket.hxx"
+#include "Listener.hxx"
+#include "Receiver.hxx"
+#include "Transmitter.hxx"
+#include <RemoteServer.hxx>
+
+using namespace sd;
+using namespace com::sun::star;
+using namespace osl;
+
+Communicator::Communicator( std::unique_ptr<IBluetoothSocket> pSocket ):
+ Thread( "CommunicatorThread" ),
+ mpSocket( std::move(pSocket) )
+{
+}
+
+Communicator::~Communicator()
+{
+}
+
+/// Close the underlying socket from another thread to force
+/// an early exit / termination
+void Communicator::forceClose()
+{
+ if( mpSocket )
+ mpSocket->close();
+}
+
+// Run as a thread
+void Communicator::execute()
+{
+ pTransmitter.reset( new Transmitter( mpSocket.get() ) );
+ pTransmitter->create();
+
+ pTransmitter->addMessage( "LO_SERVER_SERVER_PAIRED\n\n",
+ Transmitter::PRIORITY_HIGH );
+
+ pTransmitter->addMessage( "LO_SERVER_INFO\n" LIBO_VERSION_DOTTED "\n\n",
+ Transmitter::PRIORITY_HIGH );
+
+ Receiver aReceiver( pTransmitter.get() );
+ try {
+ uno::Reference< frame::XDesktop2 > xFramesSupplier = frame::Desktop::create( ::comphelper::getProcessComponentContext() );
+ uno::Reference< frame::XFrame > xFrame = xFramesSupplier->getActiveFrame();
+
+ uno::Reference<presentation::XPresentationSupplier> xPS;
+ if( xFrame.is() )
+ xPS.set( xFrame->getController()->getModel(), uno::UNO_QUERY );
+ uno::Reference<presentation::XPresentation2> xPresentation;
+ if( xPS.is() )
+ xPresentation.set( xPS->getPresentation(), uno::UNO_QUERY );
+ if ( xPresentation.is() && xPresentation->isRunning() )
+ {
+ presentationStarted( xPresentation->getController() );
+ OString aBuffer =
+ "slideshow_info\n" +
+ OUStringToOString( ::comphelper::DocumentInfo::getDocumentTitle( xFrame->getController()->getModel() ), RTL_TEXTENCODING_UTF8 ) +
+ "\n\n";
+
+ pTransmitter->addMessage( aBuffer.getStr(), Transmitter::PRIORITY_LOW );
+ }
+ else
+ {
+ pTransmitter->addMessage( "slideshow_finished\n\n",
+ Transmitter::PRIORITY_HIGH );
+ }
+ }
+ catch (uno::RuntimeException &)
+ {
+ }
+
+ sal_uInt64 aRet;
+ std::vector<OString> aCommand;
+ while ( true )
+ {
+ OString aLine;
+ aRet = mpSocket->readLine( aLine );
+ if ( aRet == 0 )
+ {
+ break; // I.e. transmission finished.
+ }
+ if ( aLine.getLength() )
+ {
+ aCommand.push_back( aLine );
+ }
+ else
+ {
+ aReceiver.pushCommand( aCommand );
+ aCommand.clear();
+ }
+ }
+
+ SAL_INFO ("sdremote", "Exiting transmission loop");
+
+ disposeListener();
+
+ pTransmitter->notifyFinished();
+ pTransmitter->join();
+ pTransmitter = nullptr;
+
+ mpSocket->close();
+ mpSocket.reset();
+
+ RemoteServer::removeCommunicator( this );
+}
+
+void Communicator::informListenerDestroyed()
+{
+ if ( pTransmitter )
+ pTransmitter->addMessage( "slideshow_finished\n\n",
+ Transmitter::PRIORITY_HIGH );
+}
+
+void Communicator::presentationStarted( const css::uno::Reference<
+ css::presentation::XSlideShowController > &rController )
+{
+ if ( pTransmitter )
+ {
+ mListener.set( new Listener( this, pTransmitter.get() ) );
+ mListener->init( rController );
+ }
+}
+
+void Communicator::disposeListener()
+{
+ if ( mListener.is() )
+ {
+ mListener->dispose();
+ mListener = nullptr;
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/Communicator.hxx b/sd/source/ui/remotecontrol/Communicator.hxx
new file mode 100644
index 000000000..f8f23c58c
--- /dev/null
+++ b/sd/source/ui/remotecontrol/Communicator.hxx
@@ -0,0 +1,52 @@
+/* -*- 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/.
+ */
+#pragma once
+
+#include <memory>
+
+#include <rtl/ref.hxx>
+#include <salhelper/thread.hxx>
+
+namespace com::sun::star::uno { template <typename > class Reference; }
+namespace com::sun::star::presentation { class XSlideShowController; }
+namespace sd { struct IBluetoothSocket; }
+
+namespace sd
+{
+
+ class Transmitter;
+ class Listener;
+
+ /** Class used for communication with one single client, dealing with all
+ * tasks specific to this client.
+ *
+ * Needs to be created, then started using launch(), disposes itself.
+ */
+ class Communicator : public salhelper::Thread
+ {
+ public:
+ explicit Communicator( std::unique_ptr<IBluetoothSocket> pSocket );
+ virtual ~Communicator() override;
+
+ void presentationStarted( const css::uno::Reference<
+ css::presentation::XSlideShowController > &rController );
+ void informListenerDestroyed();
+ void disposeListener();
+ void forceClose();
+
+ private:
+ void execute() override;
+ std::unique_ptr<IBluetoothSocket> mpSocket;
+
+ std::unique_ptr<Transmitter> pTransmitter;
+ rtl::Reference<Listener> mListener;
+ };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/DiscoveryService.cxx b/sd/source/ui/remotecontrol/DiscoveryService.cxx
new file mode 100644
index 000000000..bdd0b51c8
--- /dev/null
+++ b/sd/source/ui/remotecontrol/DiscoveryService.cxx
@@ -0,0 +1,186 @@
+/* -*- 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 <errno.h>
+#include <string.h>
+#include <iostream>
+
+#include <osl/socket.hxx>
+#include <config_features.h>
+#include <sal/log.hxx>
+
+#include "DiscoveryService.hxx"
+#include "ZeroconfService.hxx"
+
+#ifdef _WIN32
+ // LO vs WinAPI conflict
+ #undef WB_LEFT
+ #undef WB_RIGHT
+
+ #include <winsock2.h>
+ #include <ws2tcpip.h>
+
+ #include "WINNetworkService.hxx"
+ typedef int socklen_t;
+#else
+ #include <unistd.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+#endif
+
+#ifdef MACOSX
+ #include <osl/conditn.hxx>
+ #include <premac.h>
+ #import <CoreFoundation/CoreFoundation.h>
+ #include <postmac.h>
+ #import "OSXNetworkService.hxx"
+#endif
+
+#if HAVE_FEATURE_AVAHI
+ #include "AvahiNetworkService.hxx"
+#endif
+
+using namespace osl;
+using namespace sd;
+
+DiscoveryService::DiscoveryService()
+ : mSocket(-1)
+ , zService(nullptr)
+{
+}
+
+DiscoveryService::~DiscoveryService()
+{
+ if (mSocket != -1)
+ {
+#ifdef _WIN32
+ closesocket( mSocket );
+#else
+ close( mSocket );
+#endif
+ }
+
+ if (zService)
+ zService->clear();
+}
+
+void DiscoveryService::setupSockets()
+{
+
+#ifdef MACOSX
+ // Bonjour for OSX
+ zService = new OSXNetworkService();
+ zService->setup();
+#endif
+
+#if HAVE_FEATURE_AVAHI
+ // Avahi for Linux
+ char hostname[1024];
+ hostname[1023] = '\0';
+ gethostname(hostname, 1023);
+
+ zService = new AvahiNetworkService(hostname);
+ zService->setup();
+#endif
+
+#ifdef _WIN32
+ zService = new WINNetworkService();
+ zService->setup();
+#endif
+
+ // Old implementation for backward compatibility matter
+ mSocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
+ if (mSocket == -1)
+ {
+ SAL_WARN("sd", "DiscoveryService: socket failed: " << errno);
+ return; // would be better to throw, but unsure if caller handles that
+ }
+
+ sockaddr_in aAddr = {};
+ aAddr.sin_family = AF_INET;
+ aAddr.sin_addr.s_addr = htonl(INADDR_ANY);
+ aAddr.sin_port = htons( PORT_DISCOVERY );
+
+ int rc = bind( mSocket, reinterpret_cast<sockaddr*>(&aAddr), sizeof(sockaddr_in) );
+
+ if (rc)
+ {
+ SAL_WARN("sd", "DiscoveryService: bind failed: " << errno);
+ return; // would be better to throw, but unsure if caller handles that
+ }
+
+ struct ip_mreq multicastRequest;
+
+ multicastRequest.imr_multiaddr.s_addr = htonl((239U << 24) | 1U); // 239.0.0.1
+ multicastRequest.imr_interface.s_addr = htonl(INADDR_ANY);
+
+ rc = setsockopt( mSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
+ #ifdef _WIN32
+ reinterpret_cast<const char*>(&multicastRequest),
+ #else
+ &multicastRequest,
+ #endif
+ sizeof(multicastRequest));
+
+ if (rc)
+ {
+ SAL_WARN("sd", "DiscoveryService: setsockopt failed: " << errno);
+ return; // would be better to throw, but unsure if caller handles that
+ }
+}
+
+void SAL_CALL DiscoveryService::run()
+{
+ osl::Thread::setName("DiscoveryService");
+
+ setupSockets();
+
+ // Kept for backward compatibility
+ while ( true )
+ {
+ char aBuffer[BUFFER_SIZE] = {};
+ sockaddr_in aAddr;
+ socklen_t aLen = sizeof( aAddr );
+ if(recvfrom( mSocket, aBuffer, BUFFER_SIZE, 0, reinterpret_cast<sockaddr*>(&aAddr), &aLen ) > 0)
+ {
+ OString aString( aBuffer, strlen( "LOREMOTE_SEARCH" ) );
+ if ( aString == "LOREMOTE_SEARCH" )
+ {
+ OString aStringBuffer = "LOREMOTE_ADVERTISE\n" +
+ OUStringToOString(osl::SocketAddr::getLocalHostname(), RTL_TEXTENCODING_UTF8 ) +
+ "\n\n";
+ if ( sendto( mSocket, aStringBuffer.getStr(),
+ aStringBuffer.getLength(), 0, reinterpret_cast<sockaddr*>(&aAddr),
+ sizeof(aAddr) ) <= 0 )
+ {
+ // Write error or closed socket -- we are done.
+ return;
+ }
+ }
+ }
+ else
+ {
+ // Read error or closed socket -- we are done.
+ return;
+ }
+ }
+}
+
+DiscoveryService *sd::DiscoveryService::spService = nullptr;
+
+void DiscoveryService::setup()
+{
+ if (spService)
+ return;
+
+ spService = new DiscoveryService();
+ spService->create();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/DiscoveryService.hxx b/sd/source/ui/remotecontrol/DiscoveryService.hxx
new file mode 100644
index 000000000..4b235fe89
--- /dev/null
+++ b/sd/source/ui/remotecontrol/DiscoveryService.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/.
+ */
+#pragma once
+
+#include <osl/thread.hxx>
+
+namespace sd { class ZeroconfService; }
+
+namespace sd
+{
+ class DiscoveryService : public osl::Thread
+ {
+ public:
+ static void setup();
+
+ private:
+ DiscoveryService();
+ virtual ~DiscoveryService() override;
+
+ /**
+ * Networking related setup -- must be run within our own thread
+ * to prevent the application blocking (fdo#75328).
+ */
+ void setupSockets();
+
+ static DiscoveryService *spService;
+ virtual void SAL_CALL run() override;
+ int mSocket;
+
+ ZeroconfService * zService;
+ };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/DiscoveryService.mm b/sd/source/ui/remotecontrol/DiscoveryService.mm
new file mode 100644
index 000000000..3cad7cdfb
--- /dev/null
+++ b/sd/source/ui/remotecontrol/DiscoveryService.mm
@@ -0,0 +1 @@
+#include "DiscoveryService.cxx" \ No newline at end of file
diff --git a/sd/source/ui/remotecontrol/IBluetoothSocket.hxx b/sd/source/ui/remotecontrol/IBluetoothSocket.hxx
new file mode 100644
index 000000000..4b75a1e82
--- /dev/null
+++ b/sd/source/ui/remotecontrol/IBluetoothSocket.hxx
@@ -0,0 +1,42 @@
+/* -*- 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/.
+ */
+
+#pragma once
+
+#include <rtl/string.hxx>
+
+namespace sd
+{
+ /** Interface for bluetooth data io
+ */
+ struct IBluetoothSocket
+ {
+ IBluetoothSocket() = default;
+ virtual ~IBluetoothSocket() {}
+ IBluetoothSocket(const IBluetoothSocket&) = delete;
+ IBluetoothSocket& operator=(const IBluetoothSocket&) = delete;
+
+ /** Blocks until a line is read.
+
+ @return whatever the last call of recv returned, i.e. 0 or less
+ if there was a problem in communications.
+ */
+ virtual sal_Int32 readLine(OString& aLine) = 0;
+
+ /** Write a number of bytes
+
+ @return number of bytes actually written
+ */
+ virtual sal_Int32 write( const void* pBuffer, sal_uInt32 n ) = 0;
+
+ virtual void close() {};
+ };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/ImagePreparer.cxx b/sd/source/ui/remotecontrol/ImagePreparer.cxx
new file mode 100644
index 000000000..ba8d2c1f3
--- /dev/null
+++ b/sd/source/ui/remotecontrol/ImagePreparer.cxx
@@ -0,0 +1,255 @@
+/* -*- 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 "ImagePreparer.hxx"
+#include "Transmitter.hxx"
+
+#include <comphelper/base64.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <osl/file.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <sal/log.hxx>
+
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/drawing/GraphicExportFilter.hpp>
+#include <com/sun/star/lang/XServiceName.hpp>
+#include <com/sun/star/presentation/XSlideShowController.hpp>
+#include <com/sun/star/presentation/XPresentationPage.hpp>
+#include <com/sun/star/text/XTextRange.hpp>
+
+using namespace ::sd;
+using namespace ::osl;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+ImagePreparer::ImagePreparer(
+ const uno::Reference<presentation::XSlideShowController>& rxController,
+ Transmitter *aTransmitter )
+ : Timer("sd ImagePreparer"),
+ xController( rxController ),
+ pTransmitter( aTransmitter )
+{
+ SAL_INFO( "sdremote", "ImagePreparer - start" );
+ SetTimeout( 50 );
+ mnSendingSlide = 0;
+ Start();
+}
+
+ImagePreparer::~ImagePreparer()
+{
+ SAL_INFO( "sdremote", "ImagePreparer - stop" );
+ Stop();
+}
+
+void ImagePreparer::Invoke()
+{
+ sal_uInt32 aSlides = xController->getSlideCount();
+ SAL_INFO( "sdremote", "ImagePreparer " << xController->isRunning() <<
+ " sending slide " << mnSendingSlide << " of " << aSlides );
+ if ( xController->isRunning() && // not stopped/disposed of.
+ mnSendingSlide < aSlides )
+ {
+ sendPreview( mnSendingSlide );
+ sendNotes( mnSendingSlide );
+ mnSendingSlide++;
+ Start();
+ }
+ else
+ Stop();
+}
+
+void ImagePreparer::sendPreview( sal_uInt32 aSlideNumber )
+{
+ sal_uInt64 aSize;
+ uno::Sequence<sal_Int8> aImageData = preparePreview( aSlideNumber, 320, 240,
+ aSize );
+ if ( !xController->isRunning() )
+ return;
+
+ OUStringBuffer aStrBuffer;
+ ::comphelper::Base64::encode( aStrBuffer, aImageData );
+
+ OString aEncodedShortString = OUStringToOString(
+ aStrBuffer.makeStringAndClear(), RTL_TEXTENCODING_UTF8 );
+
+ // Start the writing
+ OString aBuffer = "slide_preview\n" +
+ OString::number(aSlideNumber) +
+ "\n" + aEncodedShortString + "\n\n";
+ pTransmitter->addMessage( aBuffer,
+ Transmitter::PRIORITY_LOW );
+
+}
+
+uno::Sequence<sal_Int8> ImagePreparer::preparePreview(
+ sal_uInt32 aSlideNumber, sal_uInt32 aWidth, sal_uInt32 aHeight,
+ sal_uInt64 &rSize )
+{
+ OUString aFileURL;
+ FileBase::createTempFile( nullptr, nullptr, &aFileURL );
+
+ uno::Reference< drawing::XGraphicExportFilter > xFilter =
+ drawing::GraphicExportFilter::create( ::comphelper::getProcessComponentContext() );
+
+ if ( !xController->isRunning() )
+ return uno::Sequence<sal_Int8>();
+
+ uno::Reference< lang::XComponent > xSourceDoc(
+ xController->getSlideByIndex( aSlideNumber ),
+ uno::UNO_QUERY_THROW );
+
+ xFilter->setSourceDocument( xSourceDoc );
+
+ uno::Sequence< beans::PropertyValue > aFilterData{
+ comphelper::makePropertyValue("PixelWidth", aWidth),
+ comphelper::makePropertyValue("PixelHeight", aHeight),
+ comphelper::makePropertyValue("ColorMode", sal_Int32(0)) // 0: Color, 1: B&W
+ };
+
+ uno::Sequence< beans::PropertyValue > aProps{
+ comphelper::makePropertyValue("MediaType", OUString( "image/png" )),
+ comphelper::makePropertyValue("URL", aFileURL),
+ comphelper::makePropertyValue("FilterData", aFilterData)
+ };
+
+ xFilter->filter( aProps );
+
+ File aFile(aFileURL);
+ if (aFile.open(0) != osl::File::E_None)
+ return uno::Sequence<sal_Int8>();
+
+ sal_uInt64 aRead;
+ rSize = 0;
+ aFile.getSize( rSize );
+ uno::Sequence<sal_Int8> aContents( rSize );
+
+ aFile.read( aContents.getArray(), rSize, aRead );
+ if (aRead != rSize)
+ aContents.realloc(aRead);
+
+ aFile.close();
+ File::remove( aFileURL );
+ return aContents;
+
+}
+
+void ImagePreparer::sendNotes( sal_uInt32 aSlideNumber )
+{
+
+ OString aNotes = prepareNotes( aSlideNumber );
+
+ if ( aNotes.isEmpty() )
+ return;
+
+ if ( !xController->isRunning() )
+ return;
+
+ // Start the writing
+ OString aBuffer =
+ "slide_notes\n" +
+ OString::number( static_cast<sal_Int32>(aSlideNumber) ) +
+ "\n"
+ "<html><body>" +
+ aNotes +
+ "</body></html>"
+ "\n\n";
+ pTransmitter->addMessage( aBuffer,
+ Transmitter::PRIORITY_LOW );
+}
+
+// Code copied from sdremote/source/presenter/PresenterNotesView.cxx
+OString ImagePreparer::prepareNotes( sal_uInt32 aSlideNumber )
+{
+ OUStringBuffer aRet;
+
+ if ( !xController->isRunning() )
+ return "";
+
+ uno::Reference<css::drawing::XDrawPage> aNotesPage;
+ uno::Reference< drawing::XDrawPage > xSourceDoc(
+ xController->getSlideByIndex( aSlideNumber ),
+ uno::UNO_SET_THROW );
+ uno::Reference<presentation::XPresentationPage> xPresentationPage(
+ xSourceDoc, UNO_QUERY);
+ if (xPresentationPage.is())
+ aNotesPage = xPresentationPage->getNotesPage();
+ else
+ return "";
+
+ static constexpr OUStringLiteral sNotesShapeName (
+ u"com.sun.star.presentation.NotesShape" );
+ static constexpr OUStringLiteral sTextShapeName (
+ u"com.sun.star.drawing.TextShape" );
+
+ if (aNotesPage.is())
+ {
+
+ // Iterate over all shapes and find the one that holds the text.
+ sal_Int32 nCount (aNotesPage->getCount());
+ for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
+ {
+
+ uno::Reference<lang::XServiceName> xServiceName (
+ aNotesPage->getByIndex(nIndex), UNO_QUERY);
+ if (xServiceName.is()
+ && xServiceName->getServiceName() == sNotesShapeName)
+ {
+ uno::Reference<text::XTextRange> xText (xServiceName, UNO_QUERY);
+ if (xText.is())
+ {
+ aRet.append(xText->getString());
+ aRet.append("<br/>");
+ }
+ }
+ else
+ {
+ uno::Reference<drawing::XShapeDescriptor> xShapeDescriptor (
+ aNotesPage->getByIndex(nIndex), UNO_QUERY);
+ if (xShapeDescriptor.is())
+ {
+ OUString sType (xShapeDescriptor->getShapeType());
+ if (sType == sNotesShapeName || sType == sTextShapeName)
+ {
+ uno::Reference<text::XTextRange> xText (
+ aNotesPage->getByIndex(nIndex), UNO_QUERY);
+ if (xText.is())
+ {
+ aRet.append(xText->getString());
+ aRet.append("<br/>");
+ }
+ }
+ }
+ }
+ }
+ }
+ // Replace all newlines with <br\> tags
+ for ( sal_Int32 i = 0; i < aRet.getLength(); i++ )
+ {
+ if ( aRet[i] == '\n' )
+ {
+ aRet[i]= '<';
+ aRet.insert( i+1, "br/>" );
+ }
+ }
+ return OUStringToOString(
+ aRet.makeStringAndClear(), RTL_TEXTENCODING_UTF8 );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/ImagePreparer.hxx b/sd/source/ui/remotecontrol/ImagePreparer.hxx
new file mode 100644
index 000000000..146eba073
--- /dev/null
+++ b/sd/source/ui/remotecontrol/ImagePreparer.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/.
+ */
+#pragma once
+
+#include <vcl/timer.hxx>
+#include <com/sun/star/uno/Reference.hxx>
+
+namespace com::sun::star::presentation { class XSlideShowController; }
+namespace sd { class Transmitter; }
+
+namespace sd
+{
+
+class ImagePreparer : private Timer
+{
+ sal_uInt32 mnSendingSlide;
+public:
+ ImagePreparer( const
+ css::uno::Reference<css::presentation::XSlideShowController>&
+ rxController, sd::Transmitter *aTransmitter );
+ virtual ~ImagePreparer() override;
+
+private:
+ css::uno::Reference<css::presentation::XSlideShowController> xController;
+ Transmitter *pTransmitter;
+
+ virtual void Invoke() override;
+
+ void sendPreview( sal_uInt32 aSlideNumber );
+ css::uno::Sequence<sal_Int8> preparePreview( sal_uInt32 aSlideNumber,
+ sal_uInt32 aWidth, sal_uInt32 aHeight, sal_uInt64 &rSize );
+
+ void sendNotes( sal_uInt32 aSlideNumber );
+ OString prepareNotes( sal_uInt32 aSlideNumber );
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/Listener.cxx b/sd/source/ui/remotecontrol/Listener.cxx
new file mode 100644
index 000000000..3753ed9b5
--- /dev/null
+++ b/sd/source/ui/remotecontrol/Listener.cxx
@@ -0,0 +1,133 @@
+/* -*- 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 <sal/log.hxx>
+#include <vcl/svapp.hxx>
+
+#include "Communicator.hxx"
+#include "Listener.hxx"
+#include "ImagePreparer.hxx"
+#include "Transmitter.hxx"
+
+#include <com/sun/star/presentation/XSlideShowController.hpp>
+
+using namespace sd;
+using namespace ::com::sun::star::presentation;
+
+Listener::Listener( const ::rtl::Reference<Communicator>& rCommunicator,
+ sd::Transmitter *aTransmitter ):
+ mCommunicator( rCommunicator ),
+ pTransmitter( nullptr )
+{
+ pTransmitter = aTransmitter;
+}
+
+Listener::~Listener()
+{
+}
+
+void Listener::init( const css::uno::Reference< css::presentation::XSlideShowController >& aController)
+{
+ if ( aController.is() )
+ {
+ mController.set( aController );
+ aController->addSlideShowListener( this );
+
+ sal_Int32 aSlides = aController->getSlideCount();
+ sal_Int32 aCurrentSlide = aController->getCurrentSlideIndex();
+ OString aBuffer = "slideshow_started\n" +
+ OString::number( aSlides ) + "\n" +
+ OString::number( aCurrentSlide ) + "\n\n";
+
+ pTransmitter->addMessage( aBuffer,
+ Transmitter::PRIORITY_HIGH );
+
+ {
+ SolarMutexGuard aGuard;
+ /* ImagePreparer* pPreparer = */ new ImagePreparer( aController, pTransmitter );
+ }
+ }
+ else
+ {
+ SAL_INFO( "sdremote", "Listener::init but no controller - so no preview push queued" );
+ }
+}
+
+//----- XAnimationListener ----------------------------------------------------
+
+void SAL_CALL Listener::beginEvent(const css::uno::Reference<
+ css::animations::XAnimationNode >& )
+{}
+
+void SAL_CALL Listener::endEvent( const css::uno::Reference<
+ css::animations::XAnimationNode >& )
+{}
+
+void SAL_CALL Listener::repeat( const css::uno::Reference<
+ css::animations::XAnimationNode >&, ::sal_Int32 )
+{}
+
+//----- XSlideShowListener ----------------------------------------------------
+
+void SAL_CALL Listener::paused()
+{
+}
+
+void SAL_CALL Listener::resumed()
+{
+}
+
+void SAL_CALL Listener::slideEnded (sal_Bool)
+{
+}
+
+void SAL_CALL Listener::hyperLinkClicked (const OUString &)
+{
+}
+
+void SAL_CALL Listener::slideTransitionStarted()
+{
+ sal_Int32 aSlide = mController->getCurrentSlideIndex();
+
+ OString aBuilder = "slide_updated\n" +
+ OString::number( aSlide ) +
+ "\n\n";
+
+ if ( pTransmitter )
+ {
+ pTransmitter->addMessage( aBuilder,
+ Transmitter::PRIORITY_HIGH );
+ }
+}
+
+void SAL_CALL Listener::slideTransitionEnded()
+{
+}
+
+void SAL_CALL Listener::slideAnimationsEnded()
+{
+}
+
+void Listener::disposing(std::unique_lock<std::mutex>&)
+{
+ pTransmitter = nullptr;
+ if ( mController.is() )
+ {
+ mController->removeSlideShowListener( this );
+ mController = nullptr;
+ }
+ mCommunicator->informListenerDestroyed();
+}
+
+void SAL_CALL Listener::disposing (
+ const css::lang::EventObject&)
+{
+ dispose();
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/Listener.hxx b/sd/source/ui/remotecontrol/Listener.hxx
new file mode 100644
index 000000000..58d7483f6
--- /dev/null
+++ b/sd/source/ui/remotecontrol/Listener.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/.
+ */
+#pragma once
+
+#include <sal/config.h>
+#include <com/sun/star/presentation/XSlideShowListener.hpp>
+
+#include <rtl/ref.hxx>
+#include <comphelper/compbase.hxx>
+#include <com/sun/star/uno/Reference.hxx>
+
+namespace com::sun::star::presentation { class XSlideShowController; }
+namespace sd { class Communicator; }
+namespace sd { class Transmitter; }
+
+namespace sd {
+/**
+ * Slide show listener. This class can also be used for anything else that is
+ * specific to the lifetime of one slideshow while a client is connected.
+ */
+class Listener
+ : public comphelper::WeakComponentImplHelper< css::presentation::XSlideShowListener >
+{
+public:
+ Listener( const ::rtl::Reference<Communicator>& rServer, sd::Transmitter *aTransmitter );
+ virtual ~Listener() override;
+ void init( const css::uno::Reference< css::presentation::XSlideShowController >& aController );
+
+ // XAnimationListener
+ virtual void SAL_CALL beginEvent(const css::uno::Reference<
+ css::animations::XAnimationNode >& rNode ) override;
+ virtual void SAL_CALL endEvent( const css::uno::Reference<
+ css::animations::XAnimationNode >& rNode ) override;
+ virtual void SAL_CALL repeat( const css::uno::Reference<
+ css::animations::XAnimationNode >& rNode, ::sal_Int32 Repeat ) override;
+
+ // XSlideShowListener
+ virtual void SAL_CALL paused( ) override;
+ virtual void SAL_CALL resumed( ) override;
+ virtual void SAL_CALL slideTransitionStarted( ) override;
+ virtual void SAL_CALL slideTransitionEnded( ) override;
+ virtual void SAL_CALL slideAnimationsEnded( ) override;
+ virtual void SAL_CALL slideEnded(sal_Bool bReverse) override;
+ virtual void SAL_CALL hyperLinkClicked( const OUString& hyperLink ) override;
+
+ // XEventListener
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+
+private:
+ rtl::Reference<Communicator> mCommunicator;
+ sd::Transmitter *pTransmitter;
+ css::uno::Reference< css::presentation::XSlideShowController > mController;
+};
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/OSXBluetooth.h b/sd/source/ui/remotecontrol/OSXBluetooth.h
new file mode 100644
index 000000000..64f095f6c
--- /dev/null
+++ b/sd/source/ui/remotecontrol/OSXBluetooth.h
@@ -0,0 +1,30 @@
+/* -*- Mode: ObjC; 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/.
+ */
+
+#pragma once
+
+#import <IOBluetooth/objc/IOBluetoothRFCOMMChannel.h>
+
+#include "IBluetoothSocket.hxx"
+#include "Communicator.hxx"
+#include "OSXBluetoothWrapper.hxx"
+
+@interface ChannelDelegate : NSObject<IOBluetoothRFCOMMChannelDelegate>
+{
+ sd::Communicator* pCommunicator;
+ sd::OSXBluetoothWrapper* pSocket;
+}
+
+- (id) initWithCommunicatorAndSocket:(sd::Communicator*)communicator socket:(sd::OSXBluetoothWrapper*)socket;
+- (void) rfcommChannelData:(IOBluetoothRFCOMMChannel*)rfcommChannel data:(void *)dataPointer length:(size_t)dataLength;
+- (void) rfcommChannelClosed:(IOBluetoothRFCOMMChannel*)rfcommChannel;
+
+@end
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/OSXBluetooth.mm b/sd/source/ui/remotecontrol/OSXBluetooth.mm
new file mode 100644
index 000000000..8b705c50b
--- /dev/null
+++ b/sd/source/ui/remotecontrol/OSXBluetooth.mm
@@ -0,0 +1,53 @@
+/* -*- Mode: ObjC; 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 <osl/conditn.hxx>
+#include <sal/log.hxx>
+
+#include <premac.h>
+#import <IOBluetooth/objc/IOBluetoothRFCOMMChannel.h>
+#include <postmac.h>
+
+#include "OSXBluetooth.h"
+
+@implementation ChannelDelegate
+
+- (id) initWithCommunicatorAndSocket:(sd::Communicator*)communicator socket:(sd::OSXBluetoothWrapper*)socket
+{
+ pCommunicator = communicator;
+ pSocket = socket;
+ return self;
+}
+
+- (void) rfcommChannelData:(IOBluetoothRFCOMMChannel*)rfcommChannel data:(void *)dataPointer length:(size_t)dataLength
+{
+ (void) rfcommChannel;
+
+ if ( pSocket )
+ {
+ pSocket->appendData(dataPointer, dataLength);
+ }
+}
+
+- (void) rfcommChannelClosed:(IOBluetoothRFCOMMChannel*)rfcommChannel
+{
+ (void) rfcommChannel;
+
+ SAL_INFO( "sdremote.bluetooth", "ChannelDelegate::rfcommChannelClosed()");
+
+ if ( pSocket )
+ {
+ pSocket->channelClosed();
+ }
+ pCommunicator = nullptr;
+ pSocket = nullptr;
+}
+
+@end
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/OSXBluetoothWrapper.hxx b/sd/source/ui/remotecontrol/OSXBluetoothWrapper.hxx
new file mode 100644
index 000000000..26e1349f0
--- /dev/null
+++ b/sd/source/ui/remotecontrol/OSXBluetoothWrapper.hxx
@@ -0,0 +1,38 @@
+/* -*- 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/.
+ */
+
+#pragma once
+
+#include <rtl/string.hxx>
+#include <osl/conditn.hxx>
+#include <osl/mutex.hxx>
+#include <vector>
+
+#include "IBluetoothSocket.hxx"
+
+namespace sd
+{
+ class OSXBluetoothWrapper : public IBluetoothSocket
+ {
+ IOBluetoothRFCOMMChannel* mpChannel;
+ int mnMTU;
+ osl::Condition mHaveBytes;
+ osl::Mutex mMutex;
+ std::vector<char> mBuffer;
+
+ public:
+ OSXBluetoothWrapper( IOBluetoothRFCOMMChannel* channel );
+ virtual sal_Int32 readLine( OString& aLine ) override;
+ virtual sal_Int32 write( const void* pBuffer, sal_uInt32 len ) override;
+ void appendData(void* pBuffer, size_t len );
+ void channelClosed();
+ };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/OSXNetworkService.h b/sd/source/ui/remotecontrol/OSXNetworkService.h
new file mode 100644
index 000000000..7298d901b
--- /dev/null
+++ b/sd/source/ui/remotecontrol/OSXNetworkService.h
@@ -0,0 +1,30 @@
+/* -*- Mode: ObjC; 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/.
+ */
+
+#pragma once
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#include <premac.h>
+#import <CoreFoundation/CoreFoundation.h>
+#import <Foundation/NSNetServices.h>
+#import <Foundation/NSRunLoop.h>
+#include <postmac.h>
+
+@interface OSXBonjourService : NSObject <NSNetServiceDelegate>
+{
+ NSNetService* netService;
+}
+
+- (void)publishImpressRemoteServiceOnLocalNetworkWithName:(NSString*)sName;
+
+@end
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/OSXNetworkService.hxx b/sd/source/ui/remotecontrol/OSXNetworkService.hxx
new file mode 100644
index 000000000..78ab13eff
--- /dev/null
+++ b/sd/source/ui/remotecontrol/OSXNetworkService.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/.
+ */
+#pragma once
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+#include <vector>
+#include <iostream>
+
+#include <osl/conditn.hxx>
+#include <premac.h>
+#import <CoreFoundation/CoreFoundation.h>
+#include <postmac.h>
+#import "OSXNetworkService.h"
+
+#include "ZeroconfService.hxx"
+
+namespace sd {
+ class OSXNetworkService : public ZeroconfService
+ {
+ private:
+ OSXBonjourService *osxservice;
+ public:
+ OSXNetworkService(const std::string& aname = "", unsigned int aport = 1599)
+ : ZeroconfService(aname, aport){}
+
+ void clear() override {
+ [osxservice dealloc];
+ }
+ void setup() override {
+ osxservice = [[OSXBonjourService alloc] init];
+ [osxservice publishImpressRemoteServiceOnLocalNetworkWithName: @""];
+ };
+ };
+}
diff --git a/sd/source/ui/remotecontrol/OSXNetworkService.mm b/sd/source/ui/remotecontrol/OSXNetworkService.mm
new file mode 100644
index 000000000..51cbd8c99
--- /dev/null
+++ b/sd/source/ui/remotecontrol/OSXNetworkService.mm
@@ -0,0 +1,43 @@
+/* -*- Mode: ObjC; 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 <osl/conditn.hxx>
+
+#include <premac.h>
+ #import <CoreFoundation/CoreFoundation.h>
+ #import "OSXNetworkService.h"
+#include <postmac.h>
+
+@implementation OSXBonjourService
+
+- (void) publishImpressRemoteServiceOnLocalNetworkWithName:(NSString *)sName
+{
+ netService = [[NSNetService alloc] initWithDomain:@"local" type:@"_impressremote._tcp" name:sName port:1599];
+
+ if (netService != nil)
+ {
+ [netService setDelegate:self];
+ [netService scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+ [netService publish];
+ }
+}
+
+-(void)netService:(NSNetService *)aNetService
+ didNotPublish:(NSDictionary *)dict {
+ NSLog(@"Service %p did not publish: %@", aNetService, dict);
+}
+
+- (void)dealloc {
+ [netService stop];
+ [netService release];
+ [super dealloc];
+}
+
+@end
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/Receiver.cxx b/sd/source/ui/remotecontrol/Receiver.cxx
new file mode 100644
index 000000000..dd92e8e99
--- /dev/null
+++ b/sd/source/ui/remotecontrol/Receiver.cxx
@@ -0,0 +1,207 @@
+/* -*- 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 "Receiver.hxx"
+#include <com/sun/star/presentation/XSlideShowController.hpp>
+#include <com/sun/star/presentation/XPresentationSupplier.hpp>
+#include <com/sun/star/presentation/XPresentation2.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/uno/RuntimeException.hpp>
+
+#include <comphelper/processfactory.hxx>
+#include <sal/log.hxx>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <vcl/svapp.hxx>
+#include <tools/diagnose_ex.h>
+
+using namespace sd;
+using namespace ::osl;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::presentation;
+using namespace ::com::sun::star::beans;
+
+Receiver::Receiver( Transmitter *aTransmitter ) : Timer("sd Receiver")
+{
+ pTransmitter = aTransmitter;
+ SetTimeout( 0 );
+}
+
+Receiver::~Receiver()
+{
+}
+
+// Bounce the commands to the main thread to avoid threading woes
+void Receiver::pushCommand( const std::vector<OString> &rCommand )
+{
+ SolarMutexGuard aGuard;
+ maExecQueue.push_back( rCommand );
+ Start();
+}
+
+void Receiver::Invoke()
+{
+ if( !maExecQueue.empty() )
+ {
+ std::vector< OString > aCommands( maExecQueue.front() );
+ maExecQueue.pop_front();
+ if( !aCommands.empty() )
+ executeCommand( aCommands );
+ Start();
+ }
+ else
+ Stop();
+}
+
+void Receiver::executeCommand( const std::vector<OString> &aCommand )
+{
+ uno::Reference<presentation::XSlideShowController> xSlideShowController;
+ uno::Reference<presentation::XPresentation2> xPresentation;
+ uno::Reference<presentation::XSlideShow> xSlideShow;
+ try {
+ uno::Reference< frame::XDesktop2 > xFramesSupplier = frame::Desktop::create( ::comphelper::getProcessComponentContext() );
+ uno::Reference< frame::XFrame > xFrame ( xFramesSupplier->getActiveFrame(), uno::UNO_SET_THROW );
+ uno::Reference<presentation::XPresentationSupplier> xPS ( xFrame->getController()->getModel(), uno::UNO_QUERY_THROW);
+ xPresentation.set( xPS->getPresentation(), uno::UNO_QUERY_THROW);
+ // Throws an exception if no slideshow running
+ xSlideShowController.set( xPresentation->getController(), uno::UNO_SET_THROW );
+ xSlideShow.set( xSlideShowController->getSlideShow(), uno::UNO_SET_THROW );
+ }
+ catch (uno::RuntimeException &)
+ {
+ }
+
+ if ( aCommand[0] == "transition_next" )
+ {
+ if ( xSlideShowController.is() )
+ xSlideShowController->gotoNextEffect();
+ }
+ else if ( aCommand[0] == "transition_previous" )
+ {
+ if ( xSlideShowController.is() )
+ xSlideShowController->gotoPreviousEffect();
+ }
+ else if ( aCommand[0] == "goto_slide" )
+ {
+ // FIXME: if 0 returned, then not a valid number
+ sal_Int32 aSlide = aCommand[1].toInt32();
+ if ( xSlideShowController.is() &&
+ xSlideShowController->getCurrentSlideIndex() != aSlide )
+ {
+ xSlideShowController->gotoSlideIndex( aSlide );
+ }
+ }
+ else if ( aCommand[0] == "presentation_start" )
+ {
+ if ( xPresentation.is() )
+ xPresentation->start();
+ }
+ else if ( aCommand[0] == "presentation_stop" )
+ {
+ if ( xPresentation.is() )
+ xPresentation->end();
+ }
+ else if ( aCommand[0] == "presentation_blank_screen" )
+ {
+ if ( aCommand.size() > 1 )
+ {
+// aColour = FIXME: get the colour in some format from this string
+// Determine the formatting first.
+ }
+ if ( xSlideShowController.is() )
+ {
+ xSlideShowController->blankScreen( 0 ); // Default is black
+ }
+ }
+ else if (aCommand[0] == "pointer_started" )
+ {
+ // std::cerr << "pointer_started" << std::endl;
+ float x = aCommand[1].toFloat();
+ float y = aCommand[2].toFloat();
+ SolarMutexGuard aSolarGuard;
+
+ const css::geometry::RealPoint2D pos(x,y);
+ // std::cerr << "Pointer at ("<<pos.X<<","<<pos.Y<<")" << std::endl;
+
+ if (xSlideShow.is())
+ {
+ try
+ {
+ // std::cerr << "pointer_coordination in the is" << std::endl;
+ xSlideShow->setProperty(beans::PropertyValue("PointerPosition", -1, Any(pos),
+ beans::PropertyState_DIRECT_VALUE));
+ }
+ catch (Exception&)
+ {
+ TOOLS_WARN_EXCEPTION("sdremote", "sd::SlideShowImpl::setPointerPosition()");
+ }
+
+ try
+ {
+ xSlideShow->setProperty(beans::PropertyValue("PointerVisible", -1, Any(true),
+ beans::PropertyState_DIRECT_VALUE));
+ }
+ catch (Exception&)
+ {
+ TOOLS_WARN_EXCEPTION("sdremote", "sd::SlideShowImpl::setPointerMode()");
+ }
+ }
+
+ SAL_INFO( "sdremote", "Pointer started, we display the pointer on screen" );
+ }
+ else if (aCommand[0] == "pointer_dismissed" )
+ {
+ SolarMutexGuard aSolarGuard;
+ if (xSlideShow.is()) try
+ {
+ xSlideShow->setProperty(
+ beans::PropertyValue( "PointerVisible" ,
+ -1,
+ Any( false ),
+ beans::PropertyState_DIRECT_VALUE ) );
+ }
+ catch ( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sdremote", "sd::SlideShowImpl::setPointerMode()" );
+ }
+
+ SAL_INFO( "sdremote", "Pointer dismissed, we hide the pointer on screen" );
+ }
+ else if (aCommand[0] == "pointer_coordination" )
+ {
+ float x = aCommand[1].toFloat();
+ float y = aCommand[2].toFloat();
+
+ SAL_INFO( "sdremote", "Pointer at ("<<x<<","<<y<<")" );
+ const css::geometry::RealPoint2D pos(x,y);
+
+ SolarMutexGuard aSolarGuard;
+ if (xSlideShow.is()) try
+ {
+ xSlideShow->setProperty(
+ beans::PropertyValue( "PointerPosition" ,
+ -1,
+ Any( pos ),
+ beans::PropertyState_DIRECT_VALUE ) );
+ }
+ catch ( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sdremote", "sd::SlideShowImpl::setPointerPosition()" );
+ }
+ }
+ else if ( aCommand[0] == "presentation_resume" )
+ {
+ if ( xSlideShowController.is() )
+ {
+ xSlideShowController->resume();
+ }
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/Receiver.hxx b/sd/source/ui/remotecontrol/Receiver.hxx
new file mode 100644
index 000000000..d3fadf0da
--- /dev/null
+++ b/sd/source/ui/remotecontrol/Receiver.hxx
@@ -0,0 +1,37 @@
+/* -*- 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/.
+ */
+#pragma once
+
+#include <rtl/string.hxx>
+#include <vcl/timer.hxx>
+
+#include <vector>
+#include <deque>
+
+namespace sd { class Transmitter; }
+
+namespace sd
+{
+
+// Timer is protected by the solar mutex => so are we.
+class Receiver : private Timer
+{
+ std::deque< std::vector< OString > > maExecQueue;
+public:
+ explicit Receiver( Transmitter *aTransmitter );
+ virtual ~Receiver() override;
+ virtual void Invoke() override;
+ void pushCommand( const std::vector<OString> &rCommand );
+ static void executeCommand( const std::vector<OString> &aCommand );
+
+private:
+ Transmitter *pTransmitter;
+};
+
+}
diff --git a/sd/source/ui/remotecontrol/Server.cxx b/sd/source/ui/remotecontrol/Server.cxx
new file mode 100644
index 000000000..53bf0352c
--- /dev/null
+++ b/sd/source/ui/remotecontrol/Server.cxx
@@ -0,0 +1,373 @@
+/* -*- 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 <vector>
+
+#include <officecfg/Office/Impress.hxx>
+
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+
+#include <comphelper/processfactory.hxx>
+#include <comphelper/configuration.hxx>
+#include <comphelper/sequence.hxx>
+#include <sal/log.hxx>
+#include <vcl/svapp.hxx>
+#include <osl/socket.hxx>
+
+#include <sddll.hxx>
+
+#include "DiscoveryService.hxx"
+#include "Listener.hxx"
+#include <RemoteServer.hxx>
+#include "BluetoothServer.hxx"
+#include "Communicator.hxx"
+#include "BufferedStreamSocket.hxx"
+
+using namespace sd;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+using namespace ::osl;
+using namespace ::comphelper;
+
+namespace sd {
+ /**
+ * Used to keep track of clients that have attempted to connect, but haven't
+ * yet been approved.
+ */
+ struct ClientInfoInternal:
+ ClientInfo
+ {
+ BufferedStreamSocket *mpStreamSocket;
+ OUString mPin;
+
+ ClientInfoInternal( const OUString& rName,
+ BufferedStreamSocket *pSocket,
+ const OUString& rPin ):
+ ClientInfo( rName, false ),
+ mpStreamSocket( pSocket ),
+ mPin( rPin ) {}
+ };
+}
+
+RemoteServer::RemoteServer() :
+ Thread( "RemoteServerThread" )
+{
+ SAL_INFO( "sdremote", "Instantiated RemoteServer" );
+}
+
+RemoteServer::~RemoteServer()
+{
+}
+
+void RemoteServer::execute()
+{
+ SAL_INFO( "sdremote", "RemoteServer::execute called" );
+ osl::SocketAddr aAddr( "0.0.0.0", PORT );
+ if ( !mSocket.bind( aAddr ) )
+ {
+ SAL_WARN( "sdremote", "bind failed" << mSocket.getErrorAsString() );
+ spServer = nullptr;
+ return;
+ }
+
+ if ( !mSocket.listen(3) )
+ {
+ SAL_WARN( "sdremote", "listen failed" << mSocket.getErrorAsString() );
+ spServer = nullptr;
+ return;
+ }
+ while ( true )
+ {
+ StreamSocket aSocket;
+ SAL_INFO( "sdremote", "waiting on accept" );
+ if ( mSocket.acceptConnection( aSocket ) == osl_Socket_Error )
+ {
+ SAL_WARN( "sdremote", "accept failed" << mSocket.getErrorAsString() );
+ spServer = nullptr;
+ return; // Closed, or other issue.
+ }
+ BufferedStreamSocket *pSocket = new BufferedStreamSocket( aSocket);
+ handleAcceptedConnection( pSocket );
+ }
+ SAL_INFO( "sdremote", "shutting down RemoteServer" );
+ spServer = nullptr; // Object is destroyed when Thread::execute() ends.
+}
+
+void RemoteServer::handleAcceptedConnection( BufferedStreamSocket *pSocket )
+{
+ OString aLine;
+ if ( ! ( pSocket->readLine( aLine)
+ && aLine == "LO_SERVER_CLIENT_PAIR"
+ && pSocket->readLine( aLine ) ) )
+ {
+ SAL_INFO( "sdremote", "client failed to send LO_SERVER_CLIENT_PAIR, ignoring" );
+ delete pSocket;
+ return;
+ }
+
+ OString aName( aLine );
+
+ if ( ! pSocket->readLine( aLine ) )
+ {
+ delete pSocket;
+ return;
+ }
+ OString aPin( aLine );
+
+ SocketAddr aClientAddr;
+ pSocket->getPeerAddr( aClientAddr );
+
+ do
+ {
+ // Read off any additional non-empty lines
+ // We know that we at least have the empty termination line to read.
+ if ( ! pSocket->readLine( aLine ) ) {
+ delete pSocket;
+ return;
+ }
+ }
+ while ( aLine.getLength() > 0 );
+
+ MutexGuard aGuard( sDataMutex );
+ std::shared_ptr< ClientInfoInternal > pClient =
+ std::make_shared<ClientInfoInternal>(
+ OStringToOUString( aName, RTL_TEXTENCODING_UTF8 ),
+ pSocket, OStringToOUString( aPin, RTL_TEXTENCODING_UTF8 ) );
+ mAvailableClients.push_back( pClient );
+
+ // Check if we already have this server.
+ Reference< XNameAccess > const xConfig = officecfg::Office::Impress::Misc::AuthorisedRemotes::get();
+ const Sequence< OUString > aNames = xConfig->getElementNames();
+ for ( const auto& rName : aNames )
+ {
+ if ( rName == pClient->mName )
+ {
+ Reference<XNameAccess> xSetItem( xConfig->getByName(rName), UNO_QUERY );
+ Any axPin(xSetItem->getByName("PIN"));
+ OUString sPin;
+ axPin >>= sPin;
+
+ if ( sPin == pClient->mPin ) {
+ SAL_INFO( "sdremote", "client found on validated list -- connecting" );
+ connectClient( pClient, sPin );
+ return;
+ }
+ }
+ }
+
+ // Pin not found so inform the client.
+ SAL_INFO( "sdremote", "client not found on validated list" );
+ pSocket->write( "LO_SERVER_VALIDATING_PIN\n\n",
+ strlen( "LO_SERVER_VALIDATING_PIN\n\n" ) );
+}
+
+RemoteServer *sd::RemoteServer::spServer = nullptr;
+::osl::Mutex sd::RemoteServer::sDataMutex;
+::std::vector<Communicator*> sd::RemoteServer::sCommunicators;
+
+void RemoteServer::setup()
+{
+ if (spServer)
+ return;
+
+ spServer = new RemoteServer();
+ spServer->launch();
+
+#ifdef ENABLE_SDREMOTE_BLUETOOTH
+ sd::BluetoothServer::setup( &sCommunicators );
+#endif
+}
+
+void RemoteServer::presentationStarted( const css::uno::Reference<
+ css::presentation::XSlideShowController > &rController )
+{
+ if ( !spServer )
+ return;
+ MutexGuard aGuard( sDataMutex );
+ for ( const auto& rpCommunicator : sCommunicators )
+ {
+ rpCommunicator->presentationStarted( rController );
+ }
+}
+void RemoteServer::presentationStopped()
+{
+ if ( !spServer )
+ return;
+ MutexGuard aGuard( sDataMutex );
+ for ( const auto& rpCommunicator : sCommunicators )
+ {
+ rpCommunicator->disposeListener();
+ }
+}
+
+void RemoteServer::removeCommunicator( Communicator const * mCommunicator )
+{
+ if ( !spServer )
+ return;
+ MutexGuard aGuard( sDataMutex );
+ auto aIt = std::find(sCommunicators.begin(), sCommunicators.end(), mCommunicator);
+ if (aIt != sCommunicators.end())
+ sCommunicators.erase( aIt );
+}
+
+std::vector< std::shared_ptr< ClientInfo > > RemoteServer::getClients()
+{
+ SAL_INFO( "sdremote", "RemoteServer::getClients() called" );
+ std::vector< std::shared_ptr< ClientInfo > > aClients;
+ if ( spServer )
+ {
+ MutexGuard aGuard( sDataMutex );
+ aClients.assign( spServer->mAvailableClients.begin(),
+ spServer->mAvailableClients.end() );
+ }
+ else
+ {
+ SAL_INFO( "sdremote", "No remote server instance => no remote clients" );
+ }
+ // We also need to provide authorised clients (no matter whether or not
+ // they are actually available), so that they can be de-authorised if
+ // necessary. We specifically want these to be at the end of the list
+ // since the user is more likely to be trying to connect a new remote
+ // than removing an existing remote.
+ // We can also be sure that pre-authorised clients will not be on the
+ // available clients list, as they get automatically connected if seen.
+ // TODO: we should probably add some sort of extra labelling to mark
+ // authorised AND connected client.
+ Reference< XNameAccess > const xConfig = officecfg::Office::Impress::Misc::AuthorisedRemotes::get();
+ const Sequence< OUString > aNames = xConfig->getElementNames();
+ std::transform(aNames.begin(), aNames.end(), std::back_inserter(aClients),
+ [](const OUString& rName) -> std::shared_ptr<ClientInfo> {
+ return std::make_shared<ClientInfo>(rName, true); });
+
+ return aClients;
+}
+
+bool RemoteServer::connectClient( const std::shared_ptr< ClientInfo >& pClient, std::u16string_view aPin )
+{
+ SAL_INFO( "sdremote", "RemoteServer::connectClient called" );
+ if ( !spServer )
+ return false;
+
+ ClientInfoInternal* apClient = dynamic_cast< ClientInfoInternal* >( pClient.get() );
+ if ( !apClient )
+ // could happen if we try to "connect" an already authorised client
+ {
+ return false;
+ }
+
+ if ( apClient->mPin == aPin )
+ {
+ // Save in settings first
+ std::shared_ptr< ConfigurationChanges > aChanges = ConfigurationChanges::create();
+ Reference< XNameContainer > const xConfig = officecfg::Office::Impress::Misc::AuthorisedRemotes::get( aChanges );
+
+ Reference<XSingleServiceFactory> xChildFactory (
+ xConfig, UNO_QUERY);
+ Reference<XNameReplace> xChild( xChildFactory->createInstance(), UNO_QUERY);
+ Any aValue;
+ if (xChild.is())
+ {
+ // Check whether the client is already saved
+ Sequence< OUString > aNames = xConfig->getElementNames();
+ if (comphelper::findValue(aNames, apClient->mName) != -1)
+ xConfig->replaceByName( apClient->mName, Any( xChild ) );
+ else
+ xConfig->insertByName( apClient->mName, Any( xChild ) );
+ aValue <<= apClient->mPin;
+ xChild->replaceByName("PIN", aValue);
+ aChanges->commit();
+ }
+
+ Communicator* pCommunicator = new Communicator( std::unique_ptr<IBluetoothSocket>(apClient->mpStreamSocket) );
+ MutexGuard aGuard( sDataMutex );
+
+ sCommunicators.push_back( pCommunicator );
+
+ auto aIt = std::find(spServer->mAvailableClients.begin(), spServer->mAvailableClients.end(), pClient);
+ if (aIt != spServer->mAvailableClients.end())
+ spServer->mAvailableClients.erase( aIt );
+ pCommunicator->launch();
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+void RemoteServer::deauthoriseClient( const std::shared_ptr< ClientInfo >& pClient )
+{
+ // TODO: we probably want to forcefully disconnect at this point too?
+ // But possibly via a separate function to allow just disconnecting from
+ // the UI.
+
+ SAL_INFO( "sdremote", "RemoteServer::deauthoriseClient called" );
+
+ if ( !pClient->mbIsAlreadyAuthorised )
+ // We can't remove unauthorised clients from the authorised list...
+ {
+ return;
+ }
+
+ std::shared_ptr< ConfigurationChanges > aChanges = ConfigurationChanges::create();
+ Reference< XNameContainer > const xConfig =
+ officecfg::Office::Impress::Misc::AuthorisedRemotes::get( aChanges );
+
+ xConfig->removeByName( pClient->mName );
+ aChanges->commit();
+}
+
+void SdDLL::RegisterRemotes()
+{
+ SAL_INFO( "sdremote", "SdDLL::RegisterRemotes called" );
+
+ // The remote server is likely of no use in headless mode. And as only
+ // one instance of the server can actually own the appropriate ports its
+ // probably best to not even try to do so from our headless instance
+ // (i.e. as to avoid blocking expected usage).
+ // It could perhaps be argued that we would still need the remote
+ // server for tiled rendering of presentations, but even then this
+ // implementation would not be of much use, i.e. would be controlling
+ // the purely imaginary headless presentation -- instead we'd need
+ // to have some sort of mechanism of plugging in our tiled rendering
+ // client to be controlled by the remote server, or provide an
+ // alternative implementation.
+ if ( Application::IsHeadlessModeEnabled() )
+ return;
+
+ if ( !officecfg::Office::Impress::Misc::Start::EnableSdremote::get() )
+ return;
+
+ sd::RemoteServer::setup();
+ sd::DiscoveryService::setup();
+}
+
+void RemoteServer::ensureDiscoverable()
+{
+ // FIXME: we could also enable listening on our WiFi
+ // socket here to significantly reduce the attack surface.
+#ifdef ENABLE_SDREMOTE_BLUETOOTH
+ BluetoothServer::ensureDiscoverable();
+#endif
+}
+
+void RemoteServer::restoreDiscoverable()
+{
+#ifdef ENABLE_SDREMOTE_BLUETOOTH
+ BluetoothServer::restoreDiscoverable();
+#endif
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/Transmitter.cxx b/sd/source/ui/remotecontrol/Transmitter.cxx
new file mode 100644
index 000000000..cca6a3bee
--- /dev/null
+++ b/sd/source/ui/remotecontrol/Transmitter.cxx
@@ -0,0 +1,86 @@
+/* -*- 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 "Transmitter.hxx"
+#include "IBluetoothSocket.hxx"
+#include <sal/log.hxx>
+
+using namespace osl; // Sockets etc.
+using namespace sd;
+
+Transmitter::Transmitter( IBluetoothSocket* aSocket )
+ : pStreamSocket( aSocket ),
+ mFinishRequested( false )
+{
+}
+
+void SAL_CALL Transmitter::run()
+{
+ osl_setThreadName("bluetooth Transmitter");
+
+ while ( true )
+ {
+ mProcessingRequired.wait();
+
+ ::osl::MutexGuard aGuard( mMutex );
+
+ if ( mFinishRequested ) {
+ return;
+ }
+ if ( !mHighPriority.empty() )
+ {
+ OString aMessage( mHighPriority.front() );
+ mHighPriority.pop();
+ SAL_INFO( "sdremote.bluetooth", "write high prio line '" << aMessage << "'" );
+ pStreamSocket->write( aMessage.getStr(), aMessage.getLength() );
+ }
+ else if ( !mLowPriority.empty() )
+ {
+ OString aMessage( mLowPriority.front() );
+ mLowPriority.pop();
+ SAL_INFO( "sdremote.bluetooth", "write normal line '" << aMessage << "'" );
+ pStreamSocket->write( aMessage.getStr(), aMessage.getLength() );
+ }
+
+ if ( mLowPriority.empty() && mHighPriority.empty())
+ {
+ mProcessingRequired.reset();
+ }
+ }
+}
+
+void Transmitter::notifyFinished()
+{
+ ::osl::MutexGuard aGuard( mMutex );
+ mFinishRequested = true;
+ mProcessingRequired.set();
+}
+
+Transmitter::~Transmitter()
+{
+}
+
+void Transmitter::addMessage( const OString& aMessage, const Priority aPriority )
+{
+ ::osl::MutexGuard aGuard( mMutex );
+ switch ( aPriority )
+ {
+ case PRIORITY_LOW:
+ mLowPriority.push( aMessage );
+ break;
+ case PRIORITY_HIGH:
+ mHighPriority.push( aMessage );
+ break;
+ }
+ if ( !mProcessingRequired.check() )
+ {
+ mProcessingRequired.set();
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/Transmitter.hxx b/sd/source/ui/remotecontrol/Transmitter.hxx
new file mode 100644
index 000000000..c24f5a5a4
--- /dev/null
+++ b/sd/source/ui/remotecontrol/Transmitter.hxx
@@ -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/.
+ */
+
+#pragma once
+
+#include <osl/conditn.hxx>
+#include <osl/mutex.hxx>
+#include <osl/thread.hxx>
+#include <rtl/string.hxx>
+
+#include <queue>
+
+namespace sd { struct IBluetoothSocket; }
+
+namespace sd
+{
+
+class Transmitter
+: public osl::Thread
+{
+public:
+ enum Priority { PRIORITY_LOW = 1, PRIORITY_HIGH };
+ explicit Transmitter( ::sd::IBluetoothSocket* aSocket );
+ virtual ~Transmitter() override;
+ void addMessage( const OString& aMessage, const Priority aPriority );
+ void notifyFinished();
+
+private:
+ virtual void SAL_CALL run() override;
+
+ ::sd::IBluetoothSocket* pStreamSocket;
+
+ ::osl::Condition mProcessingRequired;
+
+ ::osl::Mutex mMutex;
+ /**
+ * Used to indicate that we're done and the transmitter loop should exit.
+ * All access must be guarded my `mMutex`.
+ */
+ bool mFinishRequested;
+ /// Queue for low priority messages. All access must be guarded my `mMutex`.
+ std::queue<OString> mLowPriority;
+ /// Queue for high priority messages. All access must be guarded my `mMutex`.
+ std::queue<OString> mHighPriority;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/WINNetworkService.cxx b/sd/source/ui/remotecontrol/WINNetworkService.cxx
new file mode 100644
index 000000000..bd2decf62
--- /dev/null
+++ b/sd/source/ui/remotecontrol/WINNetworkService.cxx
@@ -0,0 +1,19 @@
+#include <string>
+#include <iostream>
+#include "WINNetworkService.hxx"
+#include <sal/log.hxx>
+
+void sd::WINNetworkService::setup()
+{
+ DNSServiceErrorType err = DNSServiceRegister(&client, 0, 0, nullptr, kREG_TYPE, "local", nullptr, 1599, 1, "", nullptr, this );
+
+ if (kDNSServiceErr_NoError != err)
+ SAL_WARN("sdremote.wifi", "DNSServiceRegister failed: " << err);
+
+ // Fail silently
+}
+
+void sd::WINNetworkService::clear()
+{
+ DNSServiceRefDeallocate(client);
+}
diff --git a/sd/source/ui/remotecontrol/WINNetworkService.hxx b/sd/source/ui/remotecontrol/WINNetworkService.hxx
new file mode 100644
index 000000000..3d096dc0f
--- /dev/null
+++ b/sd/source/ui/remotecontrol/WINNetworkService.hxx
@@ -0,0 +1,23 @@
+#pragma once
+
+#include <string>
+#undef WB_LEFT
+#undef WB_RIGHT
+#include <dns_sd.h>
+#include "ZeroconfService.hxx"
+
+namespace sd{
+ class WINNetworkService : public ZeroconfService
+ {
+ private:
+ DNSServiceRef client;
+
+ public:
+ WINNetworkService(const std::string& aname = "", unsigned int aport = 1599)
+ : ZeroconfService(aname, aport), client(nullptr) {}
+
+ void clear() override;
+ void setup() override;
+
+ };
+}
diff --git a/sd/source/ui/remotecontrol/ZeroconfService.hxx b/sd/source/ui/remotecontrol/ZeroconfService.hxx
new file mode 100644
index 000000000..a595d0b58
--- /dev/null
+++ b/sd/source/ui/remotecontrol/ZeroconfService.hxx
@@ -0,0 +1,49 @@
+/* -*- 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 ZEROCONF_SERVICE
+#define ZEROCONF_SERVICE
+
+#include <string>
+
+/**
+* The port used by LO's custom remote server discovery protocol.
+*/
+#define PORT_DISCOVERY 1598
+#define BUFFER_SIZE 200
+
+#define kREG_TYPE "_impressremote._tcp"
+
+struct sockaddr_in;
+
+typedef unsigned int uint;
+
+namespace sd{
+
+ class ZeroconfService
+ {
+ protected:
+ std::string name;
+ uint port;
+
+ public:
+ explicit ZeroconfService(const std::string& aname, uint aport)
+ :name(aname), port(aport){}
+ virtual ~ZeroconfService(){}
+
+ const std::string& getName() const {return name;}
+ void setName(const char * n) {name = n;}
+
+ // Clean up the service when closing
+ virtual void clear() = 0;
+ // Bonjour for OSX, Avahi for Linux
+ virtual void setup() = 0;
+ };
+
+}
+#endif
diff --git a/sd/source/ui/sidebar/AllMasterPagesSelector.cxx b/sd/source/ui/sidebar/AllMasterPagesSelector.cxx
new file mode 100644
index 000000000..76e056120
--- /dev/null
+++ b/sd/source/ui/sidebar/AllMasterPagesSelector.cxx
@@ -0,0 +1,180 @@
+/* -*- 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 "AllMasterPagesSelector.hxx"
+#include <ViewShellBase.hxx>
+#include "MasterPageContainer.hxx"
+#include "MasterPageDescriptor.hxx"
+#include <helpids.h>
+
+#include <set>
+
+namespace {
+
+using namespace sd::sidebar;
+
+int GetURLPriority (const SharedMasterPageDescriptor& rpDescriptor)
+{
+ int nPriority (0);
+ switch (rpDescriptor->GetURLClassification())
+ {
+ case MasterPageDescriptor::URLCLASS_USER: nPriority = 0; break;
+ case MasterPageDescriptor::URLCLASS_LAYOUT: nPriority = 1; break;
+ case MasterPageDescriptor::URLCLASS_PRESENTATION: nPriority = 2; break;
+ case MasterPageDescriptor::URLCLASS_OTHER: nPriority = 3; break;
+ case MasterPageDescriptor::URLCLASS_UNKNOWN: nPriority = 4; break;
+ default:
+ case MasterPageDescriptor::URLCLASS_UNDETERMINED: nPriority = 5; break;
+ }
+ return nPriority;
+}
+
+class MasterPageDescriptorOrder
+{
+public:
+ bool operator() (
+ const SharedMasterPageDescriptor& rp1,
+ const SharedMasterPageDescriptor& rp2) const
+ {
+ if (rp1->meOrigin == MasterPageContainer::DEFAULT)
+ return true;
+ else if (rp2->meOrigin == MasterPageContainer::DEFAULT)
+ return false;
+ else if (rp1->GetURLClassification() == rp2->GetURLClassification())
+ return rp1->mnTemplateIndex < rp2->mnTemplateIndex;
+ else
+ return GetURLPriority(rp1) < GetURLPriority(rp2);
+ }
+};
+
+} // end of anonymous namespace
+
+namespace sd::sidebar {
+
+class AllMasterPagesSelector::SortedMasterPageDescriptorList
+ : public ::std::set<SharedMasterPageDescriptor,MasterPageDescriptorOrder>
+{
+public:
+ SortedMasterPageDescriptorList() {}
+};
+
+std::unique_ptr<PanelLayout> AllMasterPagesSelector::Create (
+ weld::Widget* pParent,
+ ViewShellBase& rViewShellBase,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar)
+{
+ SdDrawDocument* pDocument = rViewShellBase.GetDocument();
+ if (pDocument == nullptr)
+ return nullptr;
+
+ auto pContainer = std::make_shared<MasterPageContainer>();
+
+ auto xSelector(std::make_unique<AllMasterPagesSelector>(
+ pParent,
+ *pDocument,
+ rViewShellBase,
+ pContainer,
+ rxSidebar));
+ xSelector->LateInit();
+ xSelector->SetHelpId(HID_SD_TASK_PANE_PREVIEW_ALL);
+
+ return xSelector;
+}
+
+AllMasterPagesSelector::AllMasterPagesSelector (
+ weld::Widget* pParent,
+ SdDrawDocument& rDocument,
+ ViewShellBase& rBase,
+ const std::shared_ptr<MasterPageContainer>& rpContainer,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar)
+ : MasterPagesSelector(pParent, rDocument, rBase, rpContainer, rxSidebar, "modules/simpress/ui/masterpagepanelall.ui", "allvalueset"),
+ mpSortedMasterPages(new SortedMasterPageDescriptorList())
+{
+ MasterPagesSelector::Fill();
+}
+
+AllMasterPagesSelector::~AllMasterPagesSelector()
+{
+}
+
+void AllMasterPagesSelector::Fill (ItemList& rItemList)
+{
+ if (mpSortedMasterPages->empty())
+ UpdateMasterPageList();
+ UpdatePageSet(rItemList);
+}
+
+void AllMasterPagesSelector::NotifyContainerChangeEvent (
+ const MasterPageContainerChangeEvent& rEvent)
+{
+ switch (rEvent.meEventType)
+ {
+ case MasterPageContainerChangeEvent::EventType::CHILD_ADDED:
+ AddItem(rEvent.maChildToken);
+ MasterPagesSelector::Fill();
+ break;
+
+ case MasterPageContainerChangeEvent::EventType::INDEX_CHANGED:
+ mpSortedMasterPages->clear();
+ MasterPagesSelector::Fill();
+ break;
+
+ default:
+ MasterPagesSelector::NotifyContainerChangeEvent(rEvent);
+ break;
+ }
+}
+
+void AllMasterPagesSelector::UpdateMasterPageList()
+{
+ mpSortedMasterPages->clear();
+ int nTokenCount = mpContainer->GetTokenCount();
+ for (int i=0; i<nTokenCount; i++)
+ AddItem(mpContainer->GetTokenForIndex(i));
+}
+
+void AllMasterPagesSelector::AddItem (MasterPageContainer::Token aToken)
+{
+ switch (mpContainer->GetOriginForToken(aToken))
+ {
+ case MasterPageContainer::DEFAULT:
+ case MasterPageContainer::TEMPLATE:
+ // Templates are added only when coming from the
+ // MasterPageContainerFiller so that they have an id which
+ // defines their place in the list. Templates (pre) loaded from
+ // RecentlyUsedMasterPages are ignored (they will be loaded
+ // later by the MasterPageContainerFiller.)
+ if (mpContainer->GetTemplateIndexForToken(aToken) >= 0)
+ mpSortedMasterPages->insert(mpContainer->GetDescriptorForToken(aToken));
+ break;
+
+ default:
+ break;
+ }
+}
+
+void AllMasterPagesSelector::UpdatePageSet (ItemList& rItemList)
+{
+ for (const auto& rxDescriptor : *mpSortedMasterPages)
+ rItemList.push_back(rxDescriptor->maToken);
+}
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/AllMasterPagesSelector.hxx b/sd/source/ui/sidebar/AllMasterPagesSelector.hxx
new file mode 100644
index 000000000..982a2ec52
--- /dev/null
+++ b/sd/source/ui/sidebar/AllMasterPagesSelector.hxx
@@ -0,0 +1,80 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "MasterPagesSelector.hxx"
+
+#include <memory>
+
+namespace sd::sidebar {
+
+/** Show a list of all available master pages so that the user can assign
+ them to the document.
+*/
+class AllMasterPagesSelector
+ : public MasterPagesSelector
+{
+ friend class VclPtrInstance<AllMasterPagesSelector>;
+public:
+ static std::unique_ptr<PanelLayout> Create (
+ weld::Widget* pParent,
+ ViewShellBase& rViewShellBase,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar);
+
+ AllMasterPagesSelector (
+ weld::Widget* pParent,
+ SdDrawDocument& rDocument,
+ ViewShellBase& rBase,
+ const std::shared_ptr<MasterPageContainer>& rpContainer,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar);
+ virtual ~AllMasterPagesSelector() override;
+
+
+ /** Scan the set of templates for the ones whose first master pages are
+ shown by this control and store them in the MasterPageContainer.
+ */
+ virtual void Fill (ItemList& rItemList) override;
+
+protected:
+ virtual void NotifyContainerChangeEvent (const MasterPageContainerChangeEvent& rEvent) override;
+
+private:
+ /** The list of master pages displayed by this class.
+ */
+ class SortedMasterPageDescriptorList;
+ ::std::unique_ptr<SortedMasterPageDescriptorList> mpSortedMasterPages;
+
+ void AddItem (MasterPageContainer::Token aToken);
+
+ /** Add all items in the internal master page list into the given list.
+ */
+ void UpdatePageSet (ItemList& rItemList);
+
+ /** Update the internal list of master pages that are to show in the
+ control.
+ */
+ void UpdateMasterPageList();
+
+ using MasterPagesSelector::Fill;
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/CurrentMasterPagesSelector.cxx b/sd/source/ui/sidebar/CurrentMasterPagesSelector.cxx
new file mode 100644
index 000000000..269099edd
--- /dev/null
+++ b/sd/source/ui/sidebar/CurrentMasterPagesSelector.cxx
@@ -0,0 +1,263 @@
+/* -*- 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 "CurrentMasterPagesSelector.hxx"
+#include "PreviewValueSet.hxx"
+#include <ViewShellBase.hxx>
+#include <DrawViewShell.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include "MasterPageContainer.hxx"
+#include "MasterPageContainerProviders.hxx"
+#include "MasterPageDescriptor.hxx"
+#include <EventMultiplexer.hxx>
+#include <DrawDocShell.hxx>
+#include <osl/diagnose.h>
+
+#include <helpids.h>
+
+#include <set>
+
+using namespace ::com::sun::star;
+
+namespace sd::sidebar {
+
+std::unique_ptr<PanelLayout> CurrentMasterPagesSelector::Create (
+ weld::Widget* pParent,
+ ViewShellBase& rViewShellBase,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar)
+{
+ SdDrawDocument* pDocument = rViewShellBase.GetDocument();
+ if (pDocument == nullptr)
+ return nullptr;
+
+ auto pContainer = std::make_shared<MasterPageContainer>();
+
+ auto xSelector(std::make_unique<CurrentMasterPagesSelector>(
+ pParent,
+ *pDocument,
+ rViewShellBase,
+ pContainer,
+ rxSidebar));
+ xSelector->LateInit();
+ xSelector->SetHelpId( HID_SD_TASK_PANE_PREVIEW_CURRENT );
+
+ return xSelector;
+}
+
+CurrentMasterPagesSelector::CurrentMasterPagesSelector (
+ weld::Widget* pParent,
+ SdDrawDocument& rDocument,
+ ViewShellBase& rBase,
+ const std::shared_ptr<MasterPageContainer>& rpContainer,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar)
+ : MasterPagesSelector (pParent, rDocument, rBase, rpContainer, rxSidebar, "modules/simpress/ui/masterpagepanel.ui", "usedvalueset")
+{
+ Link<sd::tools::EventMultiplexerEvent&,void> aLink (LINK(this,CurrentMasterPagesSelector,EventMultiplexerListener));
+ rBase.GetEventMultiplexer()->AddEventListener(aLink);
+}
+
+CurrentMasterPagesSelector::~CurrentMasterPagesSelector()
+{
+ if (mrDocument.GetDocSh() != nullptr)
+ {
+ EndListening(*mrDocument.GetDocSh());
+ }
+ else
+ {
+ OSL_ASSERT(mrDocument.GetDocSh() != nullptr);
+ }
+
+ Link<sd::tools::EventMultiplexerEvent&,void> aLink (LINK(this,CurrentMasterPagesSelector,EventMultiplexerListener));
+ mrBase.GetEventMultiplexer()->RemoveEventListener(aLink);
+}
+
+void CurrentMasterPagesSelector::LateInit()
+{
+ MasterPagesSelector::LateInit();
+ MasterPagesSelector::Fill();
+ if (mrDocument.GetDocSh() != nullptr)
+ {
+ StartListening(*mrDocument.GetDocSh());
+ }
+ else
+ {
+ OSL_ASSERT(mrDocument.GetDocSh() != nullptr);
+ }
+}
+
+void CurrentMasterPagesSelector::Fill (ItemList& rItemList)
+{
+ sal_uInt16 nPageCount = mrDocument.GetMasterSdPageCount(PageKind::Standard);
+ // Remember the names of the master pages that have been inserted to
+ // avoid double insertion.
+ ::std::set<OUString> aMasterPageNames;
+ for (sal_uInt16 nIndex=0; nIndex<nPageCount; nIndex++)
+ {
+ SdPage* pMasterPage = mrDocument.GetMasterSdPage (nIndex, PageKind::Standard);
+ if (pMasterPage == nullptr)
+ continue;
+
+ // Use the name of the master page to avoid duplicate entries.
+ OUString sName (pMasterPage->GetName());
+ if (!aMasterPageNames.insert(sName).second)
+ continue;
+
+ // Look up the master page in the container and, when it is not yet
+ // in it, insert it.
+ MasterPageContainer::Token aToken = mpContainer->GetTokenForPageObject(pMasterPage);
+ if (aToken == MasterPageContainer::NIL_TOKEN)
+ {
+ SharedMasterPageDescriptor pDescriptor = std::make_shared<MasterPageDescriptor>(
+ MasterPageContainer::MASTERPAGE,
+ nIndex,
+ OUString(),
+ pMasterPage->GetName(),
+ OUString(),
+ pMasterPage->IsPrecious(),
+ std::make_shared<ExistingPageProvider>(pMasterPage),
+ std::make_shared<PagePreviewProvider>());
+ aToken = mpContainer->PutMasterPage(pDescriptor);
+ }
+
+ rItemList.push_back(aToken);
+ }
+}
+
+OUString CurrentMasterPagesSelector::GetContextMenuUIFile() const
+{
+ return "modules/simpress/ui/currentmastermenu.ui";
+}
+
+void CurrentMasterPagesSelector::UpdateSelection()
+{
+ // Iterate over all pages and for the selected ones put the name of
+ // their master page into a set.
+ sal_uInt16 nPageCount = mrDocument.GetSdPageCount(PageKind::Standard);
+ ::std::set<OUString> aNames;
+ sal_uInt16 nIndex;
+ bool bLoop (true);
+ for (nIndex=0; nIndex<nPageCount && bLoop; nIndex++)
+ {
+ SdPage* pPage = mrDocument.GetSdPage (nIndex, PageKind::Standard);
+ if (pPage != nullptr && pPage->IsSelected())
+ {
+ if ( ! pPage->TRG_HasMasterPage())
+ {
+ // One of the pages has no master page. This is an
+ // indicator for that this method is called in the middle of
+ // a document change and that the model is not in a valid
+ // state. Therefore we stop update the selection and wait
+ // for another call to UpdateSelection when the model is
+ // valid again.
+ bLoop = false;
+ }
+ else
+ {
+ SdrPage& rMasterPage (pPage->TRG_GetMasterPage());
+ assert(dynamic_cast<SdPage*>(&rMasterPage));
+ aNames.insert(static_cast<SdPage&>(rMasterPage).GetName());
+ }
+ }
+ }
+
+ // Find the items for the master pages in the set.
+ sal_uInt16 nItemCount (mxPreviewValueSet->GetItemCount());
+ for (nIndex=1; nIndex<=nItemCount && bLoop; nIndex++)
+ {
+ OUString sName (mxPreviewValueSet->GetItemText (nIndex));
+ if (aNames.find(sName) != aNames.end())
+ {
+ mxPreviewValueSet->SelectItem (nIndex);
+ }
+ }
+}
+
+void CurrentMasterPagesSelector::ExecuteCommand(const OString &rIdent)
+{
+ if (rIdent == "delete")
+ {
+ // Check once again that the master page can safely be deleted,
+ // i.e. is not used.
+ SdPage* pMasterPage = GetSelectedMasterPage();
+ if (pMasterPage != nullptr
+ && mrDocument.GetMasterPageUserCount(pMasterPage) == 0)
+ {
+ // Removing the precious flag so that the following call to
+ // RemoveUnnecessaryMasterPages() will remove this master page.
+ pMasterPage->SetPrecious(false);
+ mrDocument.RemoveUnnecessaryMasterPages(pMasterPage);
+ }
+ }
+ else
+ MasterPagesSelector::ExecuteCommand(rIdent);
+}
+
+void CurrentMasterPagesSelector::ProcessPopupMenu(weld::Menu& rMenu)
+{
+ // Disable the delete entry when there is only one master page.
+ if (mrDocument.GetMasterPageUserCount(GetSelectedMasterPage()) > 0)
+ rMenu.set_sensitive("delete", false);
+
+ std::shared_ptr<DrawViewShell> pDrawViewShell (
+ std::dynamic_pointer_cast<DrawViewShell>(mrBase.GetMainViewShell()));
+ if (pDrawViewShell && pDrawViewShell->GetEditMode() == EditMode::MasterPage)
+ {
+ rMenu.set_sensitive("edit", false);
+ }
+
+ MasterPagesSelector::ProcessPopupMenu(rMenu);
+}
+
+IMPL_LINK(CurrentMasterPagesSelector,EventMultiplexerListener,
+ sd::tools::EventMultiplexerEvent&, rEvent, void)
+{
+ switch (rEvent.meEventId)
+ {
+ case EventMultiplexerEventId::CurrentPageChanged:
+ case EventMultiplexerEventId::EditModeNormal:
+ case EventMultiplexerEventId::EditModeMaster:
+ case EventMultiplexerEventId::SlideSortedSelection:
+ UpdateSelection();
+ break;
+
+ case EventMultiplexerEventId::PageOrder:
+ // This is tricky. If a master page is removed, moved, or
+ // added we have to wait until both the notes master page
+ // and the standard master page have been removed, moved,
+ // or added. We do this by looking at the number of master
+ // pages which has to be odd in the consistent state (the
+ // handout master page is always present). If the number is
+ // even we ignore the hint.
+ if (mrBase.GetDocument()->GetMasterPageCount()%2 == 1)
+ MasterPagesSelector::Fill();
+ break;
+
+ case EventMultiplexerEventId::ShapeChanged:
+ case EventMultiplexerEventId::ShapeInserted:
+ case EventMultiplexerEventId::ShapeRemoved:
+ InvalidatePreview(static_cast<const SdPage*>(rEvent.mpUserData));
+ break;
+ default: break;
+ }
+}
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/CurrentMasterPagesSelector.hxx b/sd/source/ui/sidebar/CurrentMasterPagesSelector.hxx
new file mode 100644
index 000000000..cd7c27734
--- /dev/null
+++ b/sd/source/ui/sidebar/CurrentMasterPagesSelector.hxx
@@ -0,0 +1,77 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svl/lstner.hxx>
+
+#include "MasterPagesSelector.hxx"
+
+namespace sd::tools { class EventMultiplexerEvent; }
+
+namespace sd::sidebar {
+
+/** Show the master pages currently used by a SdDrawDocument.
+*/
+class CurrentMasterPagesSelector
+ : public MasterPagesSelector,
+ public SfxListener
+{
+ friend class VclPtrInstance<CurrentMasterPagesSelector>;
+public:
+ static std::unique_ptr<PanelLayout> Create (
+ weld::Widget* pParent,
+ ViewShellBase& rViewShellBase,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar);
+
+ CurrentMasterPagesSelector (
+ weld::Widget* pParent,
+ SdDrawDocument& rDocument,
+ ViewShellBase& rBase,
+ const std::shared_ptr<MasterPageContainer>& rpContainer,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar);
+ virtual ~CurrentMasterPagesSelector() override;
+
+ /** Set the selection so that the master page is selected that is
+ used by the currently selected page of the document in the
+ center pane.
+ */
+ void UpdateSelection();
+
+ /** Copy all master pages that are to be shown into the given list.
+ */
+ virtual void Fill (ItemList& rItemList) override;
+
+ using MasterPagesSelector::Fill;
+
+protected:
+ virtual OUString GetContextMenuUIFile() const override;
+
+ virtual void ProcessPopupMenu(weld::Menu& rMenu) override;
+ virtual void ExecuteCommand(const OString &rIdent) override;
+
+private:
+ virtual void LateInit() override;
+
+ DECL_LINK(EventMultiplexerListener,sd::tools::EventMultiplexerEvent&, void);
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/DocumentHelper.cxx b/sd/source/ui/sidebar/DocumentHelper.cxx
new file mode 100644
index 000000000..00c028868
--- /dev/null
+++ b/sd/source/ui/sidebar/DocumentHelper.cxx
@@ -0,0 +1,536 @@
+/* -*- 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 "DocumentHelper.hxx"
+
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <sdpage.hxx>
+#include <glob.hxx>
+#include <unmovss.hxx>
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <undoback.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XDrawPages.hpp>
+#include <stlpool.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/svdundo.hxx>
+#include <tools/diagnose_ex.h>
+#include <xmloff/autolayout.hxx>
+#include <sal/log.hxx>
+
+using namespace ::com::sun::star;
+
+namespace sd::sidebar {
+
+SdPage* DocumentHelper::CopyMasterPageToLocalDocument (
+ SdDrawDocument& rTargetDocument,
+ SdPage* pMasterPage)
+{
+ SdPage* pNewMasterPage = nullptr;
+
+ do
+ {
+ if (pMasterPage == nullptr)
+ break;
+
+ // Check the presence of the source document.
+ SdDrawDocument& rSourceDocument(static_cast< SdDrawDocument& >(pMasterPage->getSdrModelFromSdrPage()));
+
+ // When the given master page already belongs to the target document
+ // then there is nothing more to do.
+ if (&rSourceDocument == &rTargetDocument)
+ {
+ pNewMasterPage = pMasterPage;
+ break;
+ }
+
+ // Test if the master pages of both the slide and its notes page are
+ // present. This is not the case when we are called during the
+ // creation of the slide master page because then the notes master
+ // page is not there.
+ sal_uInt16 nSourceMasterPageCount = rSourceDocument.GetMasterPageCount();
+ if (nSourceMasterPageCount%2 == 0)
+ // There should be 1 handout page + n slide masters + n notes
+ // masters = 2*n+1. An even value indicates that a new slide
+ // master but not yet the notes master has been inserted.
+ break;
+ sal_uInt16 nIndex = pMasterPage->GetPageNum();
+ if (nSourceMasterPageCount <= nIndex+1)
+ break;
+ // Get the slide master page.
+ if (pMasterPage != static_cast<SdPage*>(
+ rSourceDocument.GetMasterPage(nIndex)))
+ break;
+ // Get the notes master page.
+ SdPage* pNotesMasterPage = static_cast<SdPage*>(
+ rSourceDocument.GetMasterPage(nIndex+1));
+ if (pNotesMasterPage == nullptr)
+ break;
+
+ // Check if a master page with the same name as that of the given
+ // master page already exists.
+ bool bPageExists (false);
+ sal_uInt16 nMasterPageCount(rTargetDocument.GetMasterSdPageCount(PageKind::Standard));
+ for (sal_uInt16 nMaster=0; nMaster<nMasterPageCount; nMaster++)
+ {
+ SdPage* pCandidate = rTargetDocument.GetMasterSdPage (nMaster, PageKind::Standard);
+ if (pCandidate->GetName() == pMasterPage->GetName())
+ {
+ bPageExists = true;
+ pNewMasterPage = pCandidate;
+ break;
+ }
+ }
+ if (bPageExists)
+ break;
+
+ // Create a new slide (and its notes page.)
+ uno::Reference<drawing::XDrawPagesSupplier> xSlideSupplier (
+ rTargetDocument.getUnoModel(), uno::UNO_QUERY);
+ if ( ! xSlideSupplier.is())
+ break;
+ uno::Reference<drawing::XDrawPages> xSlides =
+ xSlideSupplier->getDrawPages();
+ if ( ! xSlides.is())
+ break;
+ xSlides->insertNewByIndex (xSlides->getCount());
+
+ // Set a layout.
+ SdPage* pSlide = rTargetDocument.GetSdPage(
+ rTargetDocument.GetSdPageCount(PageKind::Standard)-1,
+ PageKind::Standard);
+ if (pSlide == nullptr)
+ break;
+ pSlide->SetAutoLayout(AUTOLAYOUT_TITLE, true);
+
+ // Create a copy of the master page and the associated notes
+ // master page and insert them into our document.
+ pNewMasterPage = AddMasterPage(rTargetDocument, pMasterPage);
+ if (pNewMasterPage==nullptr)
+ break;
+ SdPage* pNewNotesMasterPage
+ = AddMasterPage(rTargetDocument, pNotesMasterPage);
+ if (pNewNotesMasterPage==nullptr)
+ break;
+
+ // Make the connection from the new slide to the master page
+ // (and do the same for the notes page.)
+ rTargetDocument.SetMasterPage (
+ rTargetDocument.GetSdPageCount(PageKind::Standard)-1,
+ pNewMasterPage->GetName(),
+ &rTargetDocument,
+ false, // Connect the new master page with the new slide but
+ // do not modify other (master) pages.
+ true);
+ }
+ while (false);
+
+ // We are not interested in any automatisms for our modified internal
+ // document.
+ rTargetDocument.SetChanged(false);
+
+ return pNewMasterPage;
+}
+
+SdPage* DocumentHelper::GetSlideForMasterPage (SdPage const * pMasterPage)
+{
+ SdPage* pCandidate = nullptr;
+
+ SdDrawDocument* pDocument = nullptr;
+ if (pMasterPage != nullptr)
+ pDocument = dynamic_cast< SdDrawDocument* >(&pMasterPage->getSdrModelFromSdrPage());
+
+ // Iterate over all pages and check if it references the given master
+ // page.
+ if (pDocument!=nullptr && pDocument->GetSdPageCount(PageKind::Standard) > 0)
+ {
+ // In most cases a new slide has just been inserted so start with
+ // the last page.
+ sal_uInt16 nPageIndex (pDocument->GetSdPageCount(PageKind::Standard)-1);
+ bool bFound (false);
+ while ( ! bFound)
+ {
+ pCandidate = pDocument->GetSdPage(
+ nPageIndex,
+ PageKind::Standard);
+ if (pCandidate != nullptr)
+ {
+ if (static_cast<SdPage*>(&pCandidate->TRG_GetMasterPage())
+ == pMasterPage)
+ {
+ bFound = true;
+ break;
+ }
+ }
+
+ if (nPageIndex == 0)
+ break;
+ else
+ nPageIndex --;
+ }
+
+ // If no page was found, that referenced the given master page, reset
+ // the pointer that is returned.
+ if ( ! bFound)
+ pCandidate = nullptr;
+ }
+
+ return pCandidate;
+}
+
+SdPage* DocumentHelper::AddMasterPage (
+ SdDrawDocument& rTargetDocument,
+ SdPage const * pMasterPage)
+{
+ rtl::Reference<SdPage> pClonedMasterPage;
+
+ if (pMasterPage!=nullptr)
+ {
+ try
+ {
+ // Duplicate the master page.
+ pClonedMasterPage = static_cast<SdPage*>(pMasterPage->CloneSdrPage(rTargetDocument).get());
+
+ // Copy the necessary styles.
+ SdDrawDocument& rSourceDocument(static_cast< SdDrawDocument& >(pMasterPage->getSdrModelFromSdrPage()));
+ ProvideStyles(rSourceDocument, rTargetDocument, pClonedMasterPage.get());
+
+ // Copy the precious flag.
+ pClonedMasterPage->SetPrecious(pMasterPage->IsPrecious());
+
+ // Now that the styles are available we can insert the cloned
+ // master page.
+ rTargetDocument.InsertMasterPage (pClonedMasterPage.get());
+ }
+ catch(const uno::Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ pClonedMasterPage = nullptr;
+ }
+ catch(const ::std::exception& e)
+ {
+ pClonedMasterPage = nullptr;
+ SAL_WARN("sd", "caught general exception " << e.what());
+ }
+ catch(...)
+ {
+ pClonedMasterPage = nullptr;
+ SAL_WARN("sd", "caught general exception");
+ }
+ }
+
+ return pClonedMasterPage.get();
+}
+
+void DocumentHelper::ProvideStyles (
+ SdDrawDocument const & rSourceDocument,
+ SdDrawDocument& rTargetDocument,
+ SdPage const * pPage)
+{
+ // Get the layout name of the given page.
+ OUString sLayoutName (pPage->GetLayoutName());
+ sal_Int32 nIndex = sLayoutName.indexOf(SD_LT_SEPARATOR);
+ if( nIndex != -1 )
+ sLayoutName = sLayoutName.copy(0, nIndex);
+
+ // Copy the style sheet from source to target document.
+ SdStyleSheetPool* pSourceStyleSheetPool =
+ static_cast<SdStyleSheetPool*>(rSourceDocument.GetStyleSheetPool());
+ SdStyleSheetPool* pTargetStyleSheetPool =
+ static_cast<SdStyleSheetPool*>(rTargetDocument.GetStyleSheetPool());
+ StyleSheetCopyResultVector aCreatedStyles;
+ pTargetStyleSheetPool->CopyLayoutSheets (
+ sLayoutName,
+ *pSourceStyleSheetPool,
+ aCreatedStyles);
+
+ // Add an undo action for the copied style sheets.
+ if( !aCreatedStyles.empty() )
+ {
+ SfxUndoManager* pUndoManager = rTargetDocument.GetDocSh()->GetUndoManager();
+ if (pUndoManager != nullptr)
+ {
+ pUndoManager->AddUndoAction (
+ std::make_unique<SdMoveStyleSheetsUndoAction>(
+ &rTargetDocument,
+ aCreatedStyles,
+ true));
+ }
+ }
+}
+
+void DocumentHelper::AssignMasterPageToPageList (
+ SdDrawDocument& rTargetDocument,
+ SdPage* pMasterPage,
+ const std::shared_ptr<std::vector<SdPage*> >& rpPageList)
+{
+ if (pMasterPage == nullptr || !pMasterPage->IsMasterPage())
+ return;
+
+ // Make the layout name by stripping out the layout postfix from the
+ // layout name of the given master page.
+ OUString sFullLayoutName(pMasterPage->GetLayoutName());
+ OUString sBaseLayoutName (sFullLayoutName);
+ sal_Int32 nIndex = sBaseLayoutName.indexOf(SD_LT_SEPARATOR);
+ if( nIndex != -1 )
+ sBaseLayoutName = sBaseLayoutName.copy(0, nIndex);
+
+ if (rpPageList->empty())
+ return;
+
+ // Create a second list that contains only the valid pointers to
+ // pages for which an assignment is necessary.
+ ::std::vector<SdPage*> aCleanedList;
+ for (const auto& rpPage : *rpPageList)
+ {
+ OSL_ASSERT(rpPage!=nullptr && &rpPage->getSdrModelFromSdrPage() == &rTargetDocument);
+ if (rpPage != nullptr && rpPage->GetLayoutName() != sFullLayoutName)
+ {
+ aCleanedList.push_back(rpPage);
+ }
+ }
+ if (aCleanedList.empty() )
+ return;
+
+ ViewShellId nViewShellId(-1);
+ if (sd::ViewShell* pViewShell = rTargetDocument.GetDocSh()->GetViewShell())
+ nViewShellId = pViewShell->GetViewShellBase().GetViewShellId();
+ SfxUndoManager* pUndoMgr = rTargetDocument.GetDocSh()->GetUndoManager();
+ if( pUndoMgr )
+ pUndoMgr->EnterListAction(SdResId(STR_UNDO_SET_PRESLAYOUT), OUString(), 0, nViewShellId);
+
+ SdPage* pMasterPageInDocument = ProvideMasterPage(rTargetDocument,pMasterPage,rpPageList);
+ if (pMasterPageInDocument == nullptr)
+ return;
+
+ // Assign the master pages to the given list of pages.
+ for (const auto& rpPage : aCleanedList)
+ {
+ AssignMasterPageToPage (
+ pMasterPageInDocument,
+ sBaseLayoutName,
+ rpPage);
+ }
+
+ if( pUndoMgr )
+ pUndoMgr->LeaveListAction();
+}
+
+SdPage* DocumentHelper::AddMasterPage (
+ SdDrawDocument& rTargetDocument,
+ SdPage const * pMasterPage,
+ sal_uInt16 nInsertionIndex)
+{
+ rtl::Reference<SdPage> pClonedMasterPage;
+
+ if (pMasterPage!=nullptr)
+ {
+ // Duplicate the master page.
+ pClonedMasterPage = static_cast<SdPage*>(pMasterPage->CloneSdrPage(rTargetDocument).get());
+
+ // Copy the precious flag.
+ pClonedMasterPage->SetPrecious(pMasterPage->IsPrecious());
+
+ // Copy the necessary styles.
+ SdDrawDocument& rSourceDocument(static_cast< SdDrawDocument& >(pMasterPage->getSdrModelFromSdrPage()));
+ ProvideStyles(rSourceDocument, rTargetDocument, pClonedMasterPage.get());
+
+ // Now that the styles are available we can insert the cloned
+ // master page.
+ rTargetDocument.InsertMasterPage (pClonedMasterPage.get(), nInsertionIndex);
+
+ // Adapt the size of the new master page to that of the pages in
+ // the document.
+ Size aNewSize (rTargetDocument.GetSdPage(0, pMasterPage->GetPageKind())->GetSize());
+ ::tools::Rectangle aBorders (
+ pClonedMasterPage->GetLeftBorder(),
+ pClonedMasterPage->GetUpperBorder(),
+ pClonedMasterPage->GetRightBorder(),
+ pClonedMasterPage->GetLowerBorder());
+ pClonedMasterPage->ScaleObjects(aNewSize, aBorders, true);
+ pClonedMasterPage->SetSize(aNewSize);
+ pClonedMasterPage->CreateTitleAndLayout(true);
+ }
+
+ return pClonedMasterPage.get();
+}
+
+/** In here we have to handle three cases:
+ 1. pPage is a normal slide. We can use SetMasterPage to assign the
+ master pages to it.
+ 2. pPage is a master page that is used by at least one slide. We can
+ assign the master page to these slides.
+ 3. pPage is a master page that is currently not used by any slide.
+ We can delete that page and add copies of the given master pages
+ instead.
+
+ For points 2 and 3 where one master page A is assigned to another B we have
+ to keep in mind that the master page that page A has already been
+ inserted into the target document.
+*/
+void DocumentHelper::AssignMasterPageToPage (
+ SdPage const * pMasterPage,
+ std::u16string_view rsBaseLayoutName,
+ SdPage* pPage)
+{
+ // Leave early when the parameters are invalid.
+ if (pPage == nullptr || pMasterPage == nullptr)
+ return;
+
+ SdDrawDocument& rDocument(dynamic_cast< SdDrawDocument& >(pPage->getSdrModelFromSdrPage()));
+
+ if ( ! pPage->IsMasterPage())
+ {
+ // 1. Remove the background object (so that, if it exists, does
+ // not override the new master page) and assign the master page to
+ // the regular slide.
+ rDocument.GetDocSh()->GetUndoManager()->AddUndoAction(
+ std::make_unique<SdBackgroundObjUndoAction>(
+ rDocument, *pPage, pPage->getSdrPageProperties().GetItemSet()),
+ true);
+ pPage->getSdrPageProperties().PutItem(XFillStyleItem(drawing::FillStyle_NONE));
+
+ rDocument.SetMasterPage (
+ (pPage->GetPageNum()-1)/2,
+ rsBaseLayoutName,
+ &rDocument,
+ false,
+ false);
+ }
+ else
+ {
+ // Find first slide that uses the master page.
+ SdPage* pSlide = nullptr;
+ sal_uInt16 nPageCount = rDocument.GetSdPageCount(PageKind::Standard);
+ for (sal_uInt16 nPage=0; nPage<nPageCount&&pSlide==nullptr; nPage++)
+ {
+ SdrPage* pCandidate = rDocument.GetSdPage(nPage,PageKind::Standard);
+ if (pCandidate != nullptr
+ && pCandidate->TRG_HasMasterPage()
+ && &(pCandidate->TRG_GetMasterPage()) == pPage)
+ {
+ pSlide = static_cast<SdPage*>(pCandidate);
+ }
+ }
+
+ if (pSlide != nullptr)
+ {
+ // 2. Assign the given master pages to the first slide that was
+ // found above that uses the master page.
+ rDocument.SetMasterPage (
+ (pSlide->GetPageNum()-1)/2,
+ rsBaseLayoutName,
+ &rDocument,
+ false,
+ false);
+ }
+ else
+ {
+ // 3. Replace the master page A by a copy of the given master
+ // page B.
+ rDocument.RemoveUnnecessaryMasterPages (
+ pPage);
+ }
+ }
+}
+
+SdPage* DocumentHelper::ProvideMasterPage (
+ SdDrawDocument& rTargetDocument,
+ SdPage* pMasterPage,
+ const std::shared_ptr<std::vector<SdPage*> >& rpPageList)
+{
+ // Make sure that both the master page and its notes master exist
+ // in the source document. If one is missing then return without
+ // making any changes.
+ if (pMasterPage == nullptr)
+ {
+ // The caller should make sure that the master page is valid.
+ OSL_ASSERT(pMasterPage != nullptr);
+ return nullptr;
+ }
+ SdDrawDocument& rSourceDocument(static_cast< SdDrawDocument& >(pMasterPage->getSdrModelFromSdrPage()));
+ SdPage* pNotesMasterPage = static_cast<SdPage*>(
+ rSourceDocument.GetMasterPage(pMasterPage->GetPageNum()+1));
+ if (pNotesMasterPage == nullptr)
+ {
+ // The model is not in a valid state. Maybe a new master page
+ // is being (not finished yet) created? Return without making
+ // any changes.
+ return nullptr;
+ }
+
+ SdPage* pMasterPageInDocument = nullptr;
+ // Search for a master page with the same name as the given one in
+ // the target document.
+ const OUString sMasterPageLayoutName (pMasterPage->GetLayoutName());
+ for (sal_uInt16 nIndex=0,nCount=rTargetDocument.GetMasterPageCount(); nIndex<nCount; ++nIndex)
+ {
+ SdPage* pCandidate = static_cast<SdPage*>(rTargetDocument.GetMasterPage(nIndex));
+ if (pCandidate && sMasterPageLayoutName == pCandidate->GetLayoutName())
+ {
+ // The requested master page does already exist in the
+ // target document, return it.
+ return pCandidate;
+ }
+ }
+
+ // The given master page does not already belong to the target
+ // document so we have to create copies and insert them into the
+ // target document.
+
+ // Determine the position where the new master pages are inserted.
+ // By default they are inserted at the end. When we assign to a
+ // master page then insert after the last of the (selected) pages.
+ sal_uInt16 nInsertionIndex = rTargetDocument.GetMasterPageCount();
+ if (rpPageList->front()->IsMasterPage())
+ {
+ nInsertionIndex = rpPageList->back()->GetPageNum();
+ }
+
+ // Clone the master page.
+ if (&pMasterPage->getSdrModelFromSdrPage() != &rTargetDocument)
+ {
+ pMasterPageInDocument = AddMasterPage (rTargetDocument, pMasterPage, nInsertionIndex);
+ if( rTargetDocument.IsUndoEnabled() )
+ rTargetDocument.AddUndo(
+ rTargetDocument.GetSdrUndoFactory().CreateUndoNewPage(*pMasterPageInDocument));
+ }
+ else
+ pMasterPageInDocument = pMasterPage;
+
+ // Clone the notes master.
+ if (&pNotesMasterPage->getSdrModelFromSdrPage() != &rTargetDocument)
+ {
+ SdPage* pClonedNotesMasterPage
+ = AddMasterPage (rTargetDocument, pNotesMasterPage, nInsertionIndex+1);
+ if( rTargetDocument.IsUndoEnabled() )
+ rTargetDocument.AddUndo(
+ rTargetDocument.GetSdrUndoFactory().CreateUndoNewPage(*pClonedNotesMasterPage));
+ }
+
+ return pMasterPageInDocument;
+}
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/DocumentHelper.hxx b/sd/source/ui/sidebar/DocumentHelper.hxx
new file mode 100644
index 000000000..61ba5f810
--- /dev/null
+++ b/sd/source/ui/sidebar/DocumentHelper.hxx
@@ -0,0 +1,108 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+#include <sal/types.h>
+
+#include <memory>
+#include <string_view>
+#include <vector>
+
+class SdDrawDocument;
+class SdPage;
+
+namespace sd::sidebar {
+
+/** A collection of methods supporting the handling of master pages.
+*/
+class DocumentHelper
+{
+public:
+ /** Return a copy of the given master page in the given document.
+ */
+ static SdPage* CopyMasterPageToLocalDocument (
+ SdDrawDocument& rTargetDocument,
+ SdPage* pMasterPage);
+
+ /** Return and, when not yet present, create a slide that uses the given
+ master page.
+ */
+ static SdPage* GetSlideForMasterPage (SdPage const * pMasterPage);
+
+ /** Copy the styles used by the given page from the source document to
+ the target document.
+ */
+ static void ProvideStyles (
+ SdDrawDocument const & rSourceDocument,
+ SdDrawDocument& rTargetDocument,
+ SdPage const * pPage);
+
+ /** Assign the given master page to the list of pages.
+ @param rTargetDocument
+ The document that is the owner of the pages in rPageList.
+ @param pMasterPage
+ This master page will usually be a member of the list of all
+ available master pages as provided by the MasterPageContainer.
+ @param rPageList
+ The pages to which to assign the master page. These pages may
+ be slides or master pages themselves.
+ */
+ static void AssignMasterPageToPageList (
+ SdDrawDocument& rTargetDocument,
+ SdPage* pMasterPage,
+ const std::shared_ptr<std::vector<SdPage*> >& rPageList);
+
+private:
+ static SdPage* AddMasterPage (
+ SdDrawDocument& rTargetDocument,
+ SdPage const * pMasterPage);
+ static SdPage* AddMasterPage (
+ SdDrawDocument& rTargetDocument,
+ SdPage const * pMasterPage,
+ sal_uInt16 nInsertionIndex);
+ static SdPage* ProvideMasterPage (
+ SdDrawDocument& rTargetDocument,
+ SdPage* pMasterPage,
+ const std::shared_ptr<std::vector<SdPage*> >& rpPageList);
+
+ /** Assign the given master page to the given page.
+ @param pMasterPage
+ In contrast to AssignMasterPageToPageList() this page is assumed
+ to be in the target document, i.e. the same document that pPage
+ is in. The caller will usually call AddMasterPage() to create a
+ clone of a master page in another document to create it.
+ @param rsBaseLayoutName
+ The layout name of the given master page. It is given so that
+ it has not to be created on every call. It could be generated
+ from the given master page, though.
+ @param pPage
+ The page to which to assign the master page. It can be a slide
+ or a master page itself.
+ */
+ static void AssignMasterPageToPage (
+ SdPage const * pMasterPage,
+ std::u16string_view rsBaseLayoutName,
+ SdPage* pPage);
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/IDisposable.hxx b/sd/source/ui/sidebar/IDisposable.hxx
new file mode 100644
index 000000000..e2c1afe27
--- /dev/null
+++ b/sd/source/ui/sidebar/IDisposable.hxx
@@ -0,0 +1,31 @@
+/* -*- 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 .
+ */
+#pragma once
+
+namespace sd::sidebar
+{
+class IDisposable
+{
+public:
+ virtual ~IDisposable();
+};
+
+} // end of namespace ::sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/ISidebarReceiver.hxx b/sd/source/ui/sidebar/ISidebarReceiver.hxx
new file mode 100644
index 000000000..bf51cbe12
--- /dev/null
+++ b/sd/source/ui/sidebar/ISidebarReceiver.hxx
@@ -0,0 +1,31 @@
+/* -*- 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 .
+ */
+#pragma once
+
+namespace sd::sidebar
+{
+class ISidebarReceiver
+{
+public:
+ virtual ~ISidebarReceiver();
+};
+
+} // end of namespace ::sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/LayoutMenu.cxx b/sd/source/ui/sidebar/LayoutMenu.cxx
new file mode 100644
index 000000000..23521df0e
--- /dev/null
+++ b/sd/source/ui/sidebar/LayoutMenu.cxx
@@ -0,0 +1,728 @@
+/* -*- 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 "LayoutMenu.hxx"
+
+#include <app.hrc>
+#include <drawdoc.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <strings.hrc>
+#include <helpids.h>
+#include <pres.hxx>
+#include <sdmod.hxx>
+
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <unokywds.hxx>
+#include <bitmaps.hlst>
+#include <tools/gen.hxx>
+#include <tools/SlotStateListener.hxx>
+#include <DrawController.hxx>
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <EventMultiplexer.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <sfx2/sidebar/Theme.hxx>
+#include <sal/log.hxx>
+
+#include <comphelper/processfactory.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svl/cjkoptions.hxx>
+#include <svl/stritem.hxx>
+#include <svl/intitem.hxx>
+#include <vcl/commandevent.hxx>
+#include <vcl/image.hxx>
+#include <xmloff/autolayout.hxx>
+
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <com/sun/star/drawing/framework/ResourceId.hpp>
+
+#include <vector>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::text;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+using namespace ::sd::slidesorter;
+using ::sd::framework::FrameworkHelper;
+
+namespace sd::sidebar {
+
+namespace {
+
+struct snew_slide_value_info
+{
+ rtl::OUStringConstExpr msBmpResId;
+ TranslateId mpStrResId;
+ WritingMode meWritingMode;
+ AutoLayout maAutoLayout;
+};
+
+}
+
+constexpr OUStringLiteral EMPTY = u"";
+
+const snew_slide_value_info notes[] =
+{
+ {BMP_SLIDEN_01, STR_AUTOLAYOUT_NOTES, WritingMode_LR_TB,
+ AUTOLAYOUT_NOTES},
+ {EMPTY, {}, WritingMode_LR_TB, AUTOLAYOUT_NONE},
+};
+
+const snew_slide_value_info handout[] =
+{
+ {BMP_SLIDEH_01, STR_AUTOLAYOUT_HANDOUT1, WritingMode_LR_TB,
+ AUTOLAYOUT_HANDOUT1},
+ {BMP_SLIDEH_02, STR_AUTOLAYOUT_HANDOUT2, WritingMode_LR_TB,
+ AUTOLAYOUT_HANDOUT2},
+ {BMP_SLIDEH_03, STR_AUTOLAYOUT_HANDOUT3, WritingMode_LR_TB,
+ AUTOLAYOUT_HANDOUT3},
+ {BMP_SLIDEH_04, STR_AUTOLAYOUT_HANDOUT4, WritingMode_LR_TB,
+ AUTOLAYOUT_HANDOUT4},
+ {BMP_SLIDEH_06, STR_AUTOLAYOUT_HANDOUT6, WritingMode_LR_TB,
+ AUTOLAYOUT_HANDOUT6},
+ {BMP_SLIDEH_09, STR_AUTOLAYOUT_HANDOUT9, WritingMode_LR_TB,
+ AUTOLAYOUT_HANDOUT9},
+ {EMPTY, {}, WritingMode_LR_TB, AUTOLAYOUT_NONE},
+};
+
+const snew_slide_value_info standard[] =
+{
+ {BMP_LAYOUT_EMPTY, STR_AUTOLAYOUT_NONE, WritingMode_LR_TB, AUTOLAYOUT_NONE},
+ {BMP_LAYOUT_HEAD03, STR_AUTOLAYOUT_TITLE, WritingMode_LR_TB, AUTOLAYOUT_TITLE},
+ {BMP_LAYOUT_HEAD02, STR_AUTOLAYOUT_CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_CONTENT},
+ {BMP_LAYOUT_HEAD02A, STR_AUTOLAYOUT_2CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_2CONTENT},
+ {BMP_LAYOUT_HEAD01, STR_AUTOLAYOUT_ONLY_TITLE, WritingMode_LR_TB, AUTOLAYOUT_TITLE_ONLY},
+ {BMP_LAYOUT_TEXTONLY, STR_AUTOLAYOUT_ONLY_TEXT, WritingMode_LR_TB, AUTOLAYOUT_ONLY_TEXT},
+ {BMP_LAYOUT_HEAD03B, STR_AUTOLAYOUT_2CONTENT_CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_2CONTENT_CONTENT},
+ {BMP_LAYOUT_HEAD03C, STR_AUTOLAYOUT_CONTENT_2CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_CONTENT_2CONTENT},
+ {BMP_LAYOUT_HEAD03A, STR_AUTOLAYOUT_2CONTENT_OVER_CONTENT,WritingMode_LR_TB, AUTOLAYOUT_TITLE_2CONTENT_OVER_CONTENT},
+ {BMP_LAYOUT_HEAD02B, STR_AUTOLAYOUT_CONTENT_OVER_CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_CONTENT_OVER_CONTENT},
+ {BMP_LAYOUT_HEAD04, STR_AUTOLAYOUT_4CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_4CONTENT},
+ {BMP_LAYOUT_HEAD06, STR_AUTOLAYOUT_6CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TITLE_6CONTENT},
+
+ // vertical
+ {BMP_LAYOUT_VERTICAL02, STR_AL_VERT_TITLE_TEXT_CHART, WritingMode_TB_RL, AUTOLAYOUT_VTITLE_VCONTENT_OVER_VCONTENT},
+ {BMP_LAYOUT_VERTICAL01, STR_AL_VERT_TITLE_VERT_OUTLINE, WritingMode_TB_RL, AUTOLAYOUT_VTITLE_VCONTENT},
+ {BMP_LAYOUT_HEAD02, STR_AL_TITLE_VERT_OUTLINE, WritingMode_TB_RL, AUTOLAYOUT_TITLE_VCONTENT},
+ {BMP_LAYOUT_HEAD02A, STR_AL_TITLE_VERT_OUTLINE_CLIPART, WritingMode_TB_RL, AUTOLAYOUT_TITLE_2VTEXT},
+ {EMPTY, {}, WritingMode_LR_TB, AUTOLAYOUT_NONE}
+};
+
+class LayoutValueSet : public ValueSet
+{
+private:
+ LayoutMenu& mrMenu;
+
+ /** Calculate the number of displayed rows. This depends on the given
+ item size, the given number of columns, and the size of the
+ control. Note that this is not the number of rows managed by the
+ valueset. This number may be larger. In that case a vertical
+ scroll bar is displayed.
+ */
+ int CalculateRowCount(const Size& rItemSize, int nColumnCount);
+
+public:
+ LayoutValueSet(LayoutMenu& rMenu)
+ : ValueSet(nullptr)
+ , mrMenu(rMenu)
+ {
+ }
+
+ virtual void Resize() override;
+
+ virtual bool Command(const CommandEvent& rEvent) override;
+};
+
+LayoutMenu::LayoutMenu (
+ weld::Widget* pParent,
+ ViewShellBase& rViewShellBase,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar)
+ : PanelLayout( pParent, "LayoutPanel", "modules/simpress/ui/layoutpanel.ui" ),
+ mrBase(rViewShellBase),
+ mxLayoutValueSet(new LayoutValueSet(*this)),
+ mxLayoutValueSetWin(new weld::CustomWeld(*m_xBuilder, "layoutvalueset", *mxLayoutValueSet)),
+ mbIsMainViewChangePending(false),
+ mxSidebar(rxSidebar),
+ mbIsDisposed(false)
+{
+ implConstruct( *mrBase.GetDocument()->GetDocSh() );
+ SAL_INFO("sd.ui", "created LayoutMenu at " << this);
+
+ mxLayoutValueSet->SetStyle(mxLayoutValueSet->GetStyle() | WB_ITEMBORDER | WB_FLATVALUESET | WB_TABSTOP);
+
+ mxLayoutValueSet->SetColor(sfx2::sidebar::Theme::GetColor(sfx2::sidebar::Theme::Color_PanelBackground));
+}
+
+void LayoutMenu::implConstruct( DrawDocShell& rDocumentShell )
+{
+ OSL_ENSURE( mrBase.GetDocument()->GetDocSh() == &rDocumentShell,
+ "LayoutMenu::implConstruct: hmm?" );
+ // if this fires, then my assumption that the rDocumentShell parameter to our first ctor is superfluous ...
+ (void) rDocumentShell;
+
+ mxLayoutValueSet->SetStyle (
+ ( mxLayoutValueSet->GetStyle() & ~(WB_ITEMBORDER) )
+ | WB_TABSTOP
+ | WB_MENUSTYLEVALUESET
+ | WB_NO_DIRECTSELECT
+ );
+ mxLayoutValueSet->SetExtraSpacing(2);
+ mxLayoutValueSet->SetSelectHdl (LINK(this, LayoutMenu, ClickHandler));
+ InvalidateContent();
+
+ Link<::sd::tools::EventMultiplexerEvent&,void> aEventListenerLink (LINK(this,LayoutMenu,EventMultiplexerListener));
+ mrBase.GetEventMultiplexer()->AddEventListener(aEventListenerLink);
+
+ mxLayoutValueSet->SetHelpId(HID_SD_TASK_PANE_PREVIEW_LAYOUTS);
+ mxLayoutValueSet->SetAccessibleName(SdResId(STR_TASKPANEL_LAYOUT_MENU_TITLE));
+
+ Link<const OUString&,void> aStateChangeLink (LINK(this,LayoutMenu,StateChangeHandler));
+ mxListener = new ::sd::tools::SlotStateListener(
+ aStateChangeLink,
+ Reference<frame::XDispatchProvider>(mrBase.GetController()->getFrame(), UNO_QUERY),
+ ".uno:VerticalTextState");
+}
+
+LayoutMenu::~LayoutMenu()
+{
+ SAL_INFO("sd.ui", "destroying LayoutMenu at " << this);
+ Dispose();
+ mxLayoutValueSetWin.reset();
+ mxLayoutValueSet.reset();
+}
+
+void LayoutMenu::Dispose()
+{
+ if (mbIsDisposed)
+ return;
+
+ SAL_INFO("sd.ui", "disposing LayoutMenu at " << this);
+
+ mbIsDisposed = true;
+
+ Reference<lang::XComponent> xComponent (mxListener, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+
+ Clear();
+ Link<tools::EventMultiplexerEvent&,void> aLink (LINK(this,LayoutMenu,EventMultiplexerListener));
+ mrBase.GetEventMultiplexer()->RemoveEventListener (aLink);
+}
+
+AutoLayout LayoutMenu::GetSelectedAutoLayout() const
+{
+ AutoLayout aResult = AUTOLAYOUT_NONE;
+
+ if (!mxLayoutValueSet->IsNoSelection() && mxLayoutValueSet->GetSelectedItemId()!=0)
+ {
+ AutoLayout* pLayout = static_cast<AutoLayout*>(mxLayoutValueSet->GetItemData(mxLayoutValueSet->GetSelectedItemId()));
+ if (pLayout != nullptr)
+ aResult = *pLayout;
+ }
+
+ return aResult;
+}
+
+ui::LayoutSize LayoutMenu::GetHeightForWidth (const sal_Int32 nWidth)
+{
+ sal_Int32 nPreferredHeight = 200;
+ if (mxLayoutValueSet->GetItemCount()>0)
+ {
+ Image aImage = mxLayoutValueSet->GetItemImage(mxLayoutValueSet->GetItemId(0));
+ Size aItemSize = mxLayoutValueSet->CalcItemSizePixel(aImage.GetSizePixel());
+ if (nWidth>0 && aItemSize.Width()>0)
+ {
+ aItemSize.AdjustWidth(8 );
+ aItemSize.AdjustHeight(8 );
+ int nColumnCount = nWidth / aItemSize.Width();
+ if (nColumnCount <= 0)
+ nColumnCount = 1;
+ else if (nColumnCount > 4)
+ nColumnCount = 4;
+ int nRowCount = (mxLayoutValueSet->GetItemCount() + nColumnCount-1) / nColumnCount;
+ nPreferredHeight = nRowCount * aItemSize.Height();
+ }
+ }
+ return ui::LayoutSize(nPreferredHeight,nPreferredHeight,nPreferredHeight);
+}
+
+void LayoutValueSet::Resize()
+{
+ Size aWindowSize = GetOutputSizePixel();
+ if (IsVisible() && aWindowSize.Width() > 0)
+ {
+ // Calculate the number of rows and columns.
+ if (GetItemCount() > 0)
+ {
+ Image aImage = GetItemImage(GetItemId(0));
+ Size aItemSize = CalcItemSizePixel (
+ aImage.GetSizePixel());
+ aItemSize.AdjustWidth(8 );
+ aItemSize.AdjustHeight(8 );
+ int nColumnCount = aWindowSize.Width() / aItemSize.Width();
+ if (nColumnCount < 1)
+ nColumnCount = 1;
+ else if (nColumnCount > 4)
+ nColumnCount = 4;
+
+ int nRowCount = CalculateRowCount (aItemSize, nColumnCount);
+
+ SetColCount(nColumnCount);
+ SetLineCount(nRowCount);
+ }
+ }
+
+ ValueSet::Resize();
+}
+
+bool LayoutValueSet::Command(const CommandEvent& rEvent)
+{
+ if (rEvent.GetCommand() != CommandEventId::ContextMenu)
+ return false;
+
+ // As a preparation for the context menu the item under the mouse is
+ // selected.
+ if (rEvent.IsMouseEvent())
+ {
+ sal_uInt16 nIndex = GetItemId(rEvent.GetMousePosPixel());
+ if (nIndex > 0)
+ SelectItem(nIndex);
+ }
+
+ mrMenu.ShowContextMenu(rEvent.IsMouseEvent() ? &rEvent.GetMousePosPixel() : nullptr);
+ return true;
+}
+
+void LayoutMenu::InsertPageWithLayout (AutoLayout aLayout)
+{
+ ViewShell* pViewShell = mrBase.GetMainViewShell().get();
+ if (pViewShell == nullptr)
+ return;
+
+ SfxViewFrame* pViewFrame = mrBase.GetViewFrame();
+ if (pViewFrame == nullptr)
+ return;
+
+ SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
+ if (pDispatcher == nullptr)
+ return;
+
+ // Call SID_INSERTPAGE with the right arguments. This is because
+ // the popup menu can not call this slot with arguments directly.
+ SfxRequest aRequest (CreateRequest(SID_INSERTPAGE, aLayout));
+ if (aRequest.GetArgs() != nullptr)
+ {
+ pDispatcher->Execute(
+ SID_INSERTPAGE,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ *aRequest.GetArgs());
+ }
+ UpdateSelection();
+}
+
+void LayoutMenu::InvalidateContent()
+{
+ // Throw away the current set and fill the menu anew according to the
+ // current settings (this includes the support for vertical writing.)
+ Fill();
+
+ if (mxSidebar.is())
+ mxSidebar->requestLayout();
+
+ // set selection inside the control during Impress start up
+ UpdateSelection();
+}
+
+int LayoutValueSet::CalculateRowCount (const Size&, int nColumnCount)
+{
+ int nRowCount = 0;
+
+ if (GetItemCount() > 0 && nColumnCount > 0)
+ {
+ nRowCount = (GetItemCount() + nColumnCount - 1) / nColumnCount;
+ if (nRowCount < 1)
+ nRowCount = 1;
+ }
+
+ return nRowCount;
+}
+
+IMPL_LINK_NOARG(LayoutMenu, ClickHandler, ValueSet*, void)
+{
+ AssignLayoutToSelectedSlides( GetSelectedAutoLayout() );
+}
+
+/** The specified layout is assigned to the current page of the view shell
+ in the center pane.
+*/
+void LayoutMenu::AssignLayoutToSelectedSlides (AutoLayout aLayout)
+{
+ using namespace ::sd::slidesorter;
+ using namespace ::sd::slidesorter::controller;
+
+ do
+ {
+ // The view shell in the center pane has to be present.
+ ViewShell* pMainViewShell = mrBase.GetMainViewShell().get();
+ if (pMainViewShell == nullptr)
+ break;
+
+ // Determine if the current view is in an invalid master page mode.
+ // The handout view is always in master page mode and therefore not
+ // invalid.
+ bool bMasterPageMode (false);
+ switch (pMainViewShell->GetShellType())
+ {
+ case ViewShell::ST_NOTES:
+ case ViewShell::ST_IMPRESS:
+ {
+ DrawViewShell* pDrawViewShell = static_cast<DrawViewShell*>(pMainViewShell);
+ if (pDrawViewShell->GetEditMode() == EditMode::MasterPage)
+ bMasterPageMode = true;
+ break;
+ }
+ default:
+ break;
+ }
+ if (bMasterPageMode)
+ break;
+
+ // Get a list of all selected slides and call the SID_MODIFYPAGE
+ // slot for all of them.
+ ::sd::slidesorter::SharedPageSelection pPageSelection;
+
+ // Get a list of selected pages.
+ // First we try to obtain this list from a slide sorter. This is
+ // possible only some of the view shells in the center pane. When
+ // no valid slide sorter is available then ask the main view shell
+ // for its current page.
+ SlideSorterViewShell* pSlideSorter = nullptr;
+ switch (pMainViewShell->GetShellType())
+ {
+ case ViewShell::ST_IMPRESS:
+ case ViewShell::ST_NOTES:
+ case ViewShell::ST_SLIDE_SORTER:
+ pSlideSorter = SlideSorterViewShell::GetSlideSorter(mrBase);
+ break;
+ default:
+ break;
+ }
+ if (pSlideSorter != nullptr)
+ {
+ // There is a slide sorter visible so get the list of selected pages from it.
+ pPageSelection = pSlideSorter->GetPageSelection();
+ }
+
+ if( (pSlideSorter == nullptr) || !pPageSelection || pPageSelection->empty() )
+ {
+ // No valid slide sorter available. Ask the main view shell for
+ // its current page.
+ pPageSelection = std::make_shared<::sd::slidesorter::SlideSorterViewShell::PageSelection>();
+ pPageSelection->push_back(pMainViewShell->GetActualPage());
+ }
+
+ if (pPageSelection->empty())
+ break;
+
+ for (const auto& rpPage : *pPageSelection)
+ {
+ if (rpPage == nullptr)
+ continue;
+
+ // Call the SID_ASSIGN_LAYOUT slot with all the necessary parameters.
+ SfxRequest aRequest (mrBase.GetViewFrame(), SID_ASSIGN_LAYOUT);
+ aRequest.AppendItem(SfxUInt32Item (ID_VAL_WHATPAGE, (rpPage->GetPageNum()-1)/2));
+ aRequest.AppendItem(SfxUInt32Item (ID_VAL_WHATLAYOUT, aLayout));
+ pMainViewShell->ExecuteSlot (aRequest, false);
+ }
+ }
+ while(false);
+}
+
+SfxRequest LayoutMenu::CreateRequest (
+ sal_uInt16 nSlotId,
+ AutoLayout aLayout)
+{
+ SfxRequest aRequest (mrBase.GetViewFrame(), nSlotId);
+
+ do
+ {
+ SdrLayerAdmin& rLayerAdmin (mrBase.GetDocument()->GetLayerAdmin());
+ SdrLayerID aBackground (rLayerAdmin.GetLayerID(sUNO_LayerName_background));
+ SdrLayerID aBackgroundObject (rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects));
+ ViewShell* pViewShell = mrBase.GetMainViewShell().get();
+ if (pViewShell == nullptr)
+ break;
+ SdPage* pPage = pViewShell->GetActualPage();
+ if (pPage == nullptr)
+ break;
+
+ SdrLayerIDSet aVisibleLayers (pPage->TRG_GetMasterPageVisibleLayers());
+
+ aRequest.AppendItem(
+ SfxStringItem (ID_VAL_PAGENAME, OUString()));//pPage->GetName()));
+ aRequest.AppendItem(SfxUInt32Item (ID_VAL_WHATLAYOUT, aLayout));
+ aRequest.AppendItem(
+ SfxBoolItem(ID_VAL_ISPAGEBACK, aVisibleLayers.IsSet(aBackground)));
+ aRequest.AppendItem(
+ SfxBoolItem(
+ ID_VAL_ISPAGEOBJ,
+ aVisibleLayers.IsSet(aBackgroundObject)));
+ }
+ while (false);
+
+ return aRequest;
+}
+
+void LayoutMenu::Fill()
+{
+ bool bVertical = SvtCJKOptions::IsVerticalTextEnabled();
+ SdDrawDocument* pDocument = mrBase.GetDocument();
+ bool bRightToLeft = (pDocument!=nullptr
+ && pDocument->GetDefaultWritingMode() == WritingMode_RL_TB);
+
+ // Get URL of the view in the center pane.
+ OUString sCenterPaneViewName;
+ try
+ {
+ Reference<XControllerManager> xControllerManager (
+ Reference<XWeak>(&mrBase.GetDrawController()), UNO_QUERY_THROW);
+ Reference<XResourceId> xPaneId (ResourceId::create(
+ ::comphelper::getProcessComponentContext(),
+ FrameworkHelper::msCenterPaneURL));
+ Reference<XView> xView (FrameworkHelper::Instance(mrBase)->GetView(xPaneId));
+ if (xView.is())
+ sCenterPaneViewName = xView->getResourceId()->getResourceURL();
+ }
+ catch (RuntimeException&)
+ {}
+
+ const snew_slide_value_info* pInfo = nullptr;
+ if (sCenterPaneViewName == framework::FrameworkHelper::msNotesViewURL)
+ {
+ pInfo = notes;
+ }
+ else if (sCenterPaneViewName == framework::FrameworkHelper::msHandoutViewURL)
+ {
+ pInfo = handout;
+ }
+ else if (sCenterPaneViewName == framework::FrameworkHelper::msImpressViewURL
+ || sCenterPaneViewName == framework::FrameworkHelper::msSlideSorterURL)
+ {
+ pInfo = standard;
+ }
+ else
+ {
+ pInfo = nullptr;
+ }
+
+ Clear();
+ for (sal_uInt16 i=1; pInfo!=nullptr && pInfo->mpStrResId; i++, pInfo++)
+ {
+ if ((WritingMode_TB_RL != pInfo->meWritingMode) || bVertical)
+ {
+ Image aImg("private:graphicrepository/" + static_cast<const OUString &>(pInfo->msBmpResId));
+
+ if (bRightToLeft && (WritingMode_TB_RL != pInfo->meWritingMode))
+ { // FIXME: avoid interpolating RTL layouts.
+ BitmapEx aRTL = aImg.GetBitmapEx();
+ aRTL.Mirror(BmpMirrorFlags::Horizontal);
+ aImg = Image(aRTL);
+ }
+
+ mxLayoutValueSet->InsertItem(i, aImg, SdResId(pInfo->mpStrResId));
+ mxLayoutValueSet->SetItemData (i, new AutoLayout(pInfo->maAutoLayout));
+ }
+ }
+}
+
+void LayoutMenu::Clear()
+{
+ for (size_t nId=1; nId<=mxLayoutValueSet->GetItemCount(); nId++)
+ delete static_cast<AutoLayout*>(mxLayoutValueSet->GetItemData(nId));
+ mxLayoutValueSet->Clear();
+}
+
+void LayoutMenu::ShowContextMenu(const Point* pPos)
+{
+ if (SD_MOD()->GetWaterCan())
+ return;
+
+ // Determine the position where to show the menu.
+ Point aMenuPosition;
+ if (pPos)
+ {
+ auto nItemId = mxLayoutValueSet->GetItemId(*pPos);
+ if (nItemId <= 0)
+ return;
+ mxLayoutValueSet->SelectItem(nItemId);
+ aMenuPosition = *pPos;
+ }
+ else
+ {
+ if (mxLayoutValueSet->GetSelectedItemId() == sal_uInt16(-1))
+ return;
+ ::tools::Rectangle aBBox(mxLayoutValueSet->GetItemRect(mxLayoutValueSet->GetSelectedItemId()));
+ aMenuPosition = aBBox.Center();
+ }
+
+ // Setup the menu.
+ ::tools::Rectangle aRect(aMenuPosition, Size(1, 1));
+ weld::Widget* pPopupParent = mxLayoutValueSet->GetDrawingArea();
+ std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(pPopupParent, "modules/simpress/ui/layoutmenu.ui"));
+ std::unique_ptr<weld::Menu> xMenu(xBuilder->weld_menu("menu"));
+
+ // Disable the SID_INSERTPAGE_LAYOUT_MENU item when
+ // the document is read-only.
+ const SfxPoolItem* pItem = nullptr;
+ const SfxItemState aState (
+ mrBase.GetViewFrame()->GetDispatcher()->QueryState(SID_INSERTPAGE, pItem));
+ if (aState == SfxItemState::DISABLED)
+ xMenu->set_sensitive("insert", false);
+
+ // Show the menu.
+ OnMenuItemSelected(xMenu->popup_at_rect(pPopupParent, aRect));
+}
+
+IMPL_LINK_NOARG(LayoutMenu, StateChangeHandler, const OUString&, void)
+{
+ InvalidateContent();
+}
+
+void LayoutMenu::OnMenuItemSelected(std::string_view ident)
+{
+ if (ident.empty())
+ return;
+
+ if (ident == "apply")
+ {
+ AssignLayoutToSelectedSlides(GetSelectedAutoLayout());
+ }
+ else if (ident == "insert")
+ {
+ // Add arguments to this slot and forward it to the main view
+ // shell.
+ InsertPageWithLayout(GetSelectedAutoLayout());
+ }
+}
+
+// Selects an appropriate layout of the slide inside control.
+//
+// Method may be called several times with the same item-id to be selected -
+// only once the actually state of the control will be changed.
+//
+void LayoutMenu::UpdateSelection()
+{
+ bool bItemSelected = false;
+
+ do
+ {
+ // Get current page of main view.
+ ViewShell* pViewShell = mrBase.GetMainViewShell().get();
+ if (pViewShell == nullptr)
+ break;
+
+ SdPage* pCurrentPage = pViewShell->getCurrentPage();
+ if (pCurrentPage == nullptr)
+ break;
+
+ // Get layout of current page.
+ AutoLayout aLayout (pCurrentPage->GetAutoLayout());
+ if (aLayout<AUTOLAYOUT_START || aLayout>AUTOLAYOUT_END)
+ break;
+
+ // Find the entry of the menu for to the layout.
+ const sal_uInt16 nItemCount = mxLayoutValueSet->GetItemCount();
+ for (sal_uInt16 nId=1; nId<=nItemCount; nId++)
+ {
+ if (*static_cast<AutoLayout*>(mxLayoutValueSet->GetItemData(nId)) == aLayout)
+ {
+ // do not set selection twice to the same item
+ if (mxLayoutValueSet->GetSelectedItemId() != nId)
+ {
+ mxLayoutValueSet->SetNoSelection();
+ mxLayoutValueSet->SelectItem(nId);
+ }
+
+ bItemSelected = true; // no need to call SetNoSelection()
+ break;
+ }
+ }
+ }
+ while (false);
+
+ if (!bItemSelected)
+ mxLayoutValueSet->SetNoSelection();
+}
+
+IMPL_LINK(LayoutMenu, EventMultiplexerListener, ::sd::tools::EventMultiplexerEvent&, rEvent, void)
+{
+ switch (rEvent.meEventId)
+ {
+ // tdf#89890 During changes of the Layout of the slide when focus is not set inside main area
+ // we do not receive notification EventMultiplexerEventId::CurrentPageChanged, but we receive the following 3 notification types.
+ // => let's make UpdateSelection() also when some shape is changed (during Layout changes)
+ case EventMultiplexerEventId::ShapeChanged:
+ case EventMultiplexerEventId::ShapeInserted:
+ case EventMultiplexerEventId::ShapeRemoved:
+ UpdateSelection();
+ break;
+
+ case EventMultiplexerEventId::CurrentPageChanged:
+ case EventMultiplexerEventId::SlideSortedSelection:
+ UpdateSelection();
+ break;
+
+ case EventMultiplexerEventId::MainViewAdded:
+ mbIsMainViewChangePending = true;
+ break;
+
+ case EventMultiplexerEventId::MainViewRemoved:
+ mxLayoutValueSet->Invalidate(); // redraw without focus
+ break;
+
+ case EventMultiplexerEventId::ConfigurationUpdated:
+ if (mbIsMainViewChangePending)
+ {
+ mbIsMainViewChangePending = false;
+ InvalidateContent();
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void LayoutMenu::DataChanged(const DataChangedEvent& rEvent)
+{
+ PanelLayout::DataChanged(rEvent);
+ Fill();
+ mxLayoutValueSet->StyleUpdated();
+ mxLayoutValueSet->SetColor(sfx2::sidebar::Theme::GetColor(sfx2::sidebar::Theme::Color_PanelBackground));
+}
+
+} // end of namespace ::sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/LayoutMenu.hxx b/sd/source/ui/sidebar/LayoutMenu.hxx
new file mode 100644
index 000000000..4cc916858
--- /dev/null
+++ b/sd/source/ui/sidebar/LayoutMenu.hxx
@@ -0,0 +1,157 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sfx2/sidebar/ILayoutableWindow.hxx>
+#include <sfx2/sidebar/PanelLayout.hxx>
+
+#include <svtools/valueset.hxx>
+#include <sfx2/request.hxx>
+#include <xmloff/autolayout.hxx>
+
+namespace com::sun::star::frame
+{
+class XStatusListener;
+}
+namespace com::sun::star::ui
+{
+class XSidebar;
+}
+
+namespace sd
+{
+class DrawDocShell;
+class ViewShellBase;
+}
+
+namespace sd::tools
+{
+class EventMultiplexerEvent;
+}
+
+namespace sd::sidebar
+{
+class LayoutValueSet;
+
+class LayoutMenu : public PanelLayout, public sfx2::sidebar::ILayoutableWindow
+{
+public:
+ /** Create a new layout menu. Depending on the given flag it
+ displays its own scroll bar or lets a surrounding window
+ handle that.
+ @param i_pParent
+ the parent node in the control tree
+ @param i_rPanelViewShell
+ the view shell of the task pane.
+ */
+ LayoutMenu(weld::Widget* pParent, ViewShellBase& rViewShellBase,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar);
+ virtual ~LayoutMenu() override;
+
+ void Dispose();
+
+ /** Return a numerical value representing the currently selected
+ layout.
+ */
+ AutoLayout GetSelectedAutoLayout() const;
+
+ // From ILayoutableWindow
+ virtual css::ui::LayoutSize GetHeightForWidth(const sal_Int32 nWidth) override;
+
+ /** Call this method when the set of displayed layouts is not up-to-date
+ anymore. It will re-assemble this set according to the current
+ settings.
+ */
+ void InvalidateContent();
+
+ /** The context menu is requested over this ShowContextMenu() method.
+ */
+ void ShowContextMenu(const Point* pPos);
+
+ /** Call Fill() when switching to or from high contrast mode so that the
+ correct set of icons is displayed.
+ */
+ virtual void DataChanged(const DataChangedEvent& rEvent) override;
+
+private:
+ ViewShellBase& mrBase;
+
+ std::unique_ptr<LayoutValueSet> mxLayoutValueSet;
+ std::unique_ptr<weld::CustomWeld> mxLayoutValueSetWin;
+
+ /** If we are asked for the preferred window size, then use this
+ many columns for the calculation.
+ */
+ css::uno::Reference<css::frame::XStatusListener> mxListener;
+ bool mbIsMainViewChangePending;
+ css::uno::Reference<css::ui::XSidebar> mxSidebar;
+ bool mbIsDisposed;
+
+ /** Fill the value set with the layouts that are applicable to the
+ current main view shell.
+ */
+ void Fill();
+
+ /** Remove all items from the value set.
+ */
+ void Clear();
+
+ /** Assign the given layout to all selected slides of a slide sorter.
+ If no slide sorter is active then this call is ignored. The slide
+ sorter in the center pane is preferred if the choice exists.
+ */
+ void AssignLayoutToSelectedSlides(AutoLayout aLayout);
+
+ /** Insert a new page with the given layout. The page is inserted via
+ the main view shell, i.e. its SID_INSERTPAGE slot is called. If it
+ does not support this slot then inserting a new page does not take
+ place. The new page is inserted after the currently active one (the
+ one returned by ViewShell::GetActualPage().)
+ */
+ void InsertPageWithLayout(AutoLayout aLayout);
+
+ /** Create a request structure that can be used with the SID_INSERTPAGE
+ and SID_MODIFYPAGE slots. The parameters are set so that the given
+ layout is assigned to the current page of the main view shell.
+ @param nSlotId
+ Supported slots are SID_INSERTPAGE and SID_MODIFYPAGE.
+ @param aLayout
+ Layout of the page to insert or to assign.
+ */
+ SfxRequest CreateRequest(sal_uInt16 nSlotId, AutoLayout aLayout);
+
+ /** Select the layout that is used by the current page.
+ */
+ void UpdateSelection();
+
+ // internal ctor
+ void implConstruct(DrawDocShell& rDocumentShell);
+
+ /** When clicked then set the current page of the view in the center pane.
+ */
+ DECL_LINK(ClickHandler, ValueSet*, void);
+ DECL_LINK(StateChangeHandler, const OUString&, void);
+ DECL_LINK(EventMultiplexerListener, ::sd::tools::EventMultiplexerEvent&, void);
+ void OnMenuItemSelected(std::string_view ident);
+};
+
+} // end of namespace ::sd::toolpanel
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/MasterPageContainer.cxx b/sd/source/ui/sidebar/MasterPageContainer.cxx
new file mode 100644
index 000000000..20d852807
--- /dev/null
+++ b/sd/source/ui/sidebar/MasterPageContainer.cxx
@@ -0,0 +1,958 @@
+/* -*- 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 "MasterPageContainer.hxx"
+
+#include "MasterPageContainerProviders.hxx"
+#include "MasterPageDescriptor.hxx"
+#include "MasterPageContainerFiller.hxx"
+#include "MasterPageContainerQueue.hxx"
+#include <PreviewRenderer.hxx>
+#include <tools/SdGlobalResourceContainer.hxx>
+#include <strings.hrc>
+#include <algorithm>
+#include <memory>
+
+#include <unomodel.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/util/XCloseable.hpp>
+#include <com/sun/star/util/CloseVetoException.hpp>
+#include <comphelper/processfactory.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <tools/TimerBasedTaskExecution.hxx>
+#include <o3tl/safeint.hxx>
+#include <osl/mutex.hxx>
+#include <osl/getglobalmutex.hxx>
+#include <xmloff/autolayout.hxx>
+#include <tools/debug.hxx>
+#include <osl/diagnose.h>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace {
+
+typedef ::std::vector<sd::sidebar::SharedMasterPageDescriptor> MasterPageContainerType;
+
+} // end of anonymous namespace
+
+namespace sd::sidebar {
+
+/** Inner implementation class of the MasterPageContainer.
+*/
+class MasterPageContainer::Implementation
+ : public SdGlobalResource,
+ public MasterPageContainerFiller::ContainerAdapter,
+ public MasterPageContainerQueue::ContainerAdapter
+{
+public:
+ mutable ::osl::Mutex maMutex;
+
+ static std::weak_ptr<Implementation> mpInstance;
+ MasterPageContainerType maContainer;
+
+ static std::shared_ptr<Implementation> Instance();
+
+ void LateInit();
+ void AddChangeListener (const Link<MasterPageContainerChangeEvent&,void>& rLink);
+ void RemoveChangeListener (const Link<MasterPageContainerChangeEvent&,void>& rLink);
+ void UpdatePreviewSizePixel();
+ const Size& GetPreviewSizePixel (PreviewSize eSize) const;
+
+ bool HasToken (Token aToken) const;
+ SharedMasterPageDescriptor GetDescriptor (MasterPageContainer::Token aToken) const;
+ virtual Token PutMasterPage (const SharedMasterPageDescriptor& rDescriptor) override;
+ void InvalidatePreview (Token aToken);
+ Image GetPreviewForToken (
+ Token aToken,
+ PreviewSize ePreviewSize);
+ PreviewState GetPreviewState (Token aToken) const;
+ bool RequestPreview (Token aToken);
+
+ Reference<frame::XModel> GetModel();
+ SdDrawDocument* GetDocument();
+
+ void FireContainerChange (
+ MasterPageContainerChangeEvent::EventType eType,
+ Token aToken);
+
+ virtual bool UpdateDescriptor (
+ const SharedMasterPageDescriptor& rpDescriptor,
+ bool bForcePageObject,
+ bool bForcePreview,
+ bool bSendEvents) override;
+
+ void ReleaseDescriptor (Token aToken);
+
+ /** Called by the MasterPageContainerFiller to notify that all master
+ pages from template documents have been added.
+ */
+ virtual void FillingDone() override;
+
+private:
+ Implementation();
+ virtual ~Implementation() override;
+
+ class Deleter { public:
+ void operator() (Implementation* pObject) { delete pObject; }
+ };
+ friend class Deleter;
+
+ enum class InitializationState { NotInitialized, Initializing, Initialized };
+ InitializationState meInitializationState;
+
+ std::unique_ptr<MasterPageContainerQueue> mpRequestQueue;
+ css::uno::Reference<css::frame::XModel> mxModel;
+ SdDrawDocument* mpDocument;
+ PreviewRenderer maPreviewRenderer;
+ /** Remember whether the first page object has already been used to
+ determine the correct size ratio.
+ */
+ bool mbFirstPageObjectSeen;
+
+ // The widths for the previews contain two pixels for the border that is
+ // painted around the preview.
+ static const int SMALL_PREVIEW_WIDTH = 72 + 2;
+ static const int LARGE_PREVIEW_WIDTH = 2*72 + 2;
+
+ /** This substitution of page preview shows "Preparing preview" and is
+ shown as long as the actual previews are not being present.
+ */
+ Image maLargePreviewBeingCreated;
+ Image maSmallPreviewBeingCreated;
+
+ /** This substitution of page preview is shown when a preview can not be
+ created and thus is not available.
+ */
+ Image maLargePreviewNotAvailable;
+ Image maSmallPreviewNotAvailable;
+
+ ::std::vector<Link<MasterPageContainerChangeEvent&,void>> maChangeListeners;
+
+ // We have to remember the tasks for initialization and filling in case
+ // a MasterPageContainer object is destroyed before these tasks have
+ // been completed.
+ std::weak_ptr<sd::tools::TimerBasedTaskExecution> mpFillerTask;
+
+ Size maSmallPreviewSizePixel;
+ Size maLargePreviewSizePixel;
+
+ Image GetPreviewSubstitution(TranslateId pId, PreviewSize ePreviewSize);
+
+ void CleanContainer();
+};
+
+//===== MasterPageContainer ===================================================
+
+std::weak_ptr<MasterPageContainer::Implementation>
+ MasterPageContainer::Implementation::mpInstance;
+
+std::shared_ptr<MasterPageContainer::Implementation>
+ MasterPageContainer::Implementation::Instance()
+{
+ std::shared_ptr<MasterPageContainer::Implementation> pInstance;
+
+ if (Implementation::mpInstance.expired())
+ {
+ ::osl::GetGlobalMutex aMutexFunctor;
+ ::osl::MutexGuard aGuard (aMutexFunctor());
+ if (Implementation::mpInstance.expired())
+ {
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ pInstance = std::shared_ptr<MasterPageContainer::Implementation>(
+ new MasterPageContainer::Implementation(),
+ MasterPageContainer::Implementation::Deleter());
+ SdGlobalResourceContainer::Instance().AddResource(pInstance);
+ Implementation::mpInstance = pInstance;
+ }
+ else
+ pInstance = std::shared_ptr<MasterPageContainer::Implementation>(
+ Implementation::mpInstance);
+ }
+ else
+ {
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ pInstance = std::shared_ptr<MasterPageContainer::Implementation>(
+ Implementation::mpInstance);
+ }
+
+ DBG_ASSERT(pInstance != nullptr,
+ "MasterPageContainer::Implementation::Instance(): instance is nullptr");
+ return pInstance;
+}
+
+MasterPageContainer::MasterPageContainer()
+ : mpImpl(Implementation::Instance()),
+ mePreviewSize(SMALL)
+{
+ mpImpl->LateInit();
+}
+
+MasterPageContainer::~MasterPageContainer()
+{
+}
+
+void MasterPageContainer::AddChangeListener (const Link<MasterPageContainerChangeEvent&,void>& rLink)
+{
+ mpImpl->AddChangeListener(rLink);
+}
+
+void MasterPageContainer::RemoveChangeListener (const Link<MasterPageContainerChangeEvent&,void>& rLink)
+{
+ mpImpl->RemoveChangeListener(rLink);
+}
+
+void MasterPageContainer::SetPreviewSize (PreviewSize eSize)
+{
+ mePreviewSize = eSize;
+ mpImpl->FireContainerChange(
+ MasterPageContainerChangeEvent::EventType::SIZE_CHANGED,
+ NIL_TOKEN);
+}
+
+Size const & MasterPageContainer::GetPreviewSizePixel() const
+{
+ return mpImpl->GetPreviewSizePixel(mePreviewSize);
+}
+
+MasterPageContainer::Token MasterPageContainer::PutMasterPage (
+ const std::shared_ptr<MasterPageDescriptor>& rDescriptor)
+{
+ return mpImpl->PutMasterPage(rDescriptor);
+}
+
+void MasterPageContainer::AcquireToken (Token aToken)
+{
+ SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken);
+ if (pDescriptor)
+ {
+ ++pDescriptor->mnUseCount;
+ }
+}
+
+void MasterPageContainer::ReleaseToken (Token aToken)
+{
+ SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken);
+ if (!pDescriptor)
+ return;
+
+ OSL_ASSERT(pDescriptor->mnUseCount>0);
+ --pDescriptor->mnUseCount;
+ if (pDescriptor->mnUseCount > 0)
+ return;
+
+ switch (pDescriptor->meOrigin)
+ {
+ case DEFAULT:
+ case TEMPLATE:
+ default:
+ break;
+
+ case MASTERPAGE:
+ mpImpl->ReleaseDescriptor(aToken);
+ break;
+ }
+}
+
+int MasterPageContainer::GetTokenCount() const
+{
+ const ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ return mpImpl->maContainer.size();
+}
+
+bool MasterPageContainer::HasToken (Token aToken) const
+{
+ const ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ return mpImpl->HasToken(aToken);
+}
+
+MasterPageContainer::Token MasterPageContainer::GetTokenForIndex (int nIndex)
+{
+ const ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ Token aResult (NIL_TOKEN);
+ if (HasToken(nIndex))
+ aResult = mpImpl->maContainer[nIndex]->maToken;
+ return aResult;
+}
+
+MasterPageContainer::Token MasterPageContainer::GetTokenForURL (
+ const OUString& sURL)
+{
+ const ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ Token aResult (NIL_TOKEN);
+ if (!sURL.isEmpty())
+ {
+ MasterPageContainerType::iterator iEntry (
+ ::std::find_if (
+ mpImpl->maContainer.begin(),
+ mpImpl->maContainer.end(),
+ MasterPageDescriptor::URLComparator(sURL)));
+ if (iEntry != mpImpl->maContainer.end())
+ aResult = (*iEntry)->maToken;
+ }
+ return aResult;
+}
+
+MasterPageContainer::Token MasterPageContainer::GetTokenForStyleName (const OUString& sStyleName)
+{
+ const ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ Token aResult (NIL_TOKEN);
+ if (!sStyleName.isEmpty())
+ {
+ MasterPageContainerType::iterator iEntry (
+ ::std::find_if (
+ mpImpl->maContainer.begin(),
+ mpImpl->maContainer.end(),
+ MasterPageDescriptor::StyleNameComparator(sStyleName)));
+ if (iEntry != mpImpl->maContainer.end())
+ aResult = (*iEntry)->maToken;
+ }
+ return aResult;
+}
+
+MasterPageContainer::Token MasterPageContainer::GetTokenForPageObject (
+ const SdPage* pPage)
+{
+ const ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ Token aResult (NIL_TOKEN);
+ if (pPage != nullptr)
+ {
+ MasterPageContainerType::iterator iEntry (
+ ::std::find_if (
+ mpImpl->maContainer.begin(),
+ mpImpl->maContainer.end(),
+ MasterPageDescriptor::PageObjectComparator(pPage)));
+ if (iEntry != mpImpl->maContainer.end())
+ aResult = (*iEntry)->maToken;
+ }
+ return aResult;
+}
+
+OUString MasterPageContainer::GetURLForToken (
+ MasterPageContainer::Token aToken)
+{
+ const ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken);
+ if (pDescriptor)
+ return pDescriptor->msURL;
+ else
+ return OUString();
+}
+
+OUString MasterPageContainer::GetPageNameForToken (
+ MasterPageContainer::Token aToken)
+{
+ const ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken);
+ if (pDescriptor)
+ return pDescriptor->msPageName;
+ else
+ return OUString();
+}
+
+OUString MasterPageContainer::GetStyleNameForToken (
+ MasterPageContainer::Token aToken)
+{
+ const ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken);
+ if (pDescriptor)
+ return pDescriptor->msStyleName;
+ else
+ return OUString();
+}
+
+SdPage* MasterPageContainer::GetPageObjectForToken (
+ MasterPageContainer::Token aToken,
+ bool bLoad)
+{
+ const ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ SdPage* pPageObject = nullptr;
+ SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken);
+ if (pDescriptor)
+ {
+ pPageObject = pDescriptor->mpMasterPage;
+ if (pPageObject == nullptr)
+ {
+ // The page object is not (yet) present. Call
+ // UpdateDescriptor() to trigger the PageObjectProvider() to
+ // provide it.
+ if (bLoad)
+ mpImpl->GetModel();
+ if (mpImpl->UpdateDescriptor(pDescriptor,bLoad,false, true))
+ pPageObject = pDescriptor->mpMasterPage;
+ }
+ }
+ return pPageObject;
+}
+
+MasterPageContainer::Origin MasterPageContainer::GetOriginForToken (Token aToken)
+{
+ const ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken);
+ if (pDescriptor)
+ return pDescriptor->meOrigin;
+ else
+ return UNKNOWN;
+}
+
+sal_Int32 MasterPageContainer::GetTemplateIndexForToken (Token aToken)
+{
+ const ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ SharedMasterPageDescriptor pDescriptor = mpImpl->GetDescriptor(aToken);
+ if (pDescriptor)
+ return pDescriptor->mnTemplateIndex;
+ else
+ return -1;
+}
+
+std::shared_ptr<MasterPageDescriptor> MasterPageContainer::GetDescriptorForToken (
+ MasterPageContainer::Token aToken)
+{
+ const ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ return mpImpl->GetDescriptor(aToken);
+}
+
+void MasterPageContainer::InvalidatePreview (MasterPageContainer::Token aToken)
+{
+ mpImpl->InvalidatePreview(aToken);
+}
+
+Image MasterPageContainer::GetPreviewForToken (MasterPageContainer::Token aToken)
+{
+ return mpImpl->GetPreviewForToken(aToken,mePreviewSize);
+}
+
+MasterPageContainer::PreviewState MasterPageContainer::GetPreviewState (Token aToken)
+{
+ return mpImpl->GetPreviewState(aToken);
+}
+
+bool MasterPageContainer::RequestPreview (Token aToken)
+{
+ return mpImpl->RequestPreview(aToken);
+}
+
+//==== Implementation ================================================
+
+MasterPageContainer::Implementation::Implementation()
+ : meInitializationState(InitializationState::NotInitialized),
+ mpDocument(nullptr),
+ mbFirstPageObjectSeen(false)
+{
+ UpdatePreviewSizePixel();
+}
+
+MasterPageContainer::Implementation::~Implementation()
+{
+ // When the initializer or filler tasks are still running then we have
+ // to stop them now in order to prevent them from calling us back.
+ tools::TimerBasedTaskExecution::ReleaseTask(mpFillerTask);
+
+ mpRequestQueue.reset();
+
+ uno::Reference<util::XCloseable> xCloseable (mxModel, uno::UNO_QUERY);
+ if (xCloseable.is())
+ {
+ try
+ {
+ xCloseable->close(true);
+ }
+ catch (const css::util::CloseVetoException&)
+ {
+ }
+ }
+ mxModel = nullptr;
+}
+
+void MasterPageContainer::Implementation::LateInit()
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ if (meInitializationState != InitializationState::NotInitialized)
+ return;
+
+ meInitializationState = InitializationState::Initializing;
+
+ OSL_ASSERT(Instance().get()==this);
+ mpRequestQueue.reset(MasterPageContainerQueue::Create(
+ std::shared_ptr<MasterPageContainerQueue::ContainerAdapter>(Instance())));
+
+ mpFillerTask = ::sd::tools::TimerBasedTaskExecution::Create(
+ std::make_shared<MasterPageContainerFiller>(*this),
+ 5,
+ 50);
+
+ meInitializationState = InitializationState::Initialized;
+}
+
+void MasterPageContainer::Implementation::AddChangeListener (const Link<MasterPageContainerChangeEvent&,void>& rLink)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ ::std::vector<Link<MasterPageContainerChangeEvent&,void>>::iterator iListener (
+ ::std::find(maChangeListeners.begin(),maChangeListeners.end(),rLink));
+ if (iListener == maChangeListeners.end())
+ maChangeListeners.push_back(rLink);
+
+}
+
+void MasterPageContainer::Implementation::RemoveChangeListener (const Link<MasterPageContainerChangeEvent&,void>& rLink)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ ::std::vector<Link<MasterPageContainerChangeEvent&,void>>::iterator iListener (
+ ::std::find(maChangeListeners.begin(),maChangeListeners.end(),rLink));
+ if (iListener != maChangeListeners.end())
+ maChangeListeners.erase(iListener);
+}
+
+void MasterPageContainer::Implementation::UpdatePreviewSizePixel()
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ // The default aspect ratio is 4:3
+ int nWidth (4);
+ int nHeight (3);
+
+ // Search for the first entry with an existing master page.
+ auto iDescriptor = std::find_if(maContainer.begin(), maContainer.end(),
+ [](const SharedMasterPageDescriptor& rxDescriptor) {
+ return rxDescriptor != nullptr && rxDescriptor->mpMasterPage != nullptr;
+ });
+ if (iDescriptor != maContainer.end())
+ {
+ Size aPageSize ((*iDescriptor)->mpMasterPage->GetSize());
+ OSL_ASSERT(!aPageSize.IsEmpty());
+ if (aPageSize.Width() > 0)
+ nWidth = aPageSize.Width();
+ if (aPageSize.Height() > 0)
+ nHeight = aPageSize.Height();
+ mbFirstPageObjectSeen = true;
+ }
+
+ maSmallPreviewSizePixel.setWidth( SMALL_PREVIEW_WIDTH );
+ maLargePreviewSizePixel.setWidth( LARGE_PREVIEW_WIDTH );
+
+ int nNewSmallHeight ((maSmallPreviewSizePixel.Width()-2) * nHeight / nWidth + 2);
+ int nNewLargeHeight ((maLargePreviewSizePixel.Width()-2) * nHeight / nWidth + 2);
+
+ if (nNewSmallHeight!=maSmallPreviewSizePixel.Height()
+ || nNewLargeHeight!=maLargePreviewSizePixel.Height())
+ {
+ maSmallPreviewSizePixel.setHeight( nNewSmallHeight );
+ maLargePreviewSizePixel.setHeight( nNewLargeHeight );
+ FireContainerChange(
+ MasterPageContainerChangeEvent::EventType::SIZE_CHANGED,
+ NIL_TOKEN);
+ }
+}
+
+const Size& MasterPageContainer::Implementation::GetPreviewSizePixel (PreviewSize eSize) const
+{
+ if (eSize == SMALL)
+ return maSmallPreviewSizePixel;
+ else
+ return maLargePreviewSizePixel;
+}
+
+MasterPageContainer::Token MasterPageContainer::Implementation::PutMasterPage (
+ const SharedMasterPageDescriptor& rpDescriptor)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ Token aResult (NIL_TOKEN);
+
+ // Get page object and preview when that is inexpensive.
+ UpdateDescriptor(rpDescriptor,false,false, false);
+
+ // Look up the new MasterPageDescriptor and either insert it or update
+ // an already existing one.
+ MasterPageContainerType::iterator aEntry (
+ ::std::find_if (
+ maContainer.begin(),
+ maContainer.end(),
+ MasterPageDescriptor::AllComparator(rpDescriptor)));
+ if (aEntry == maContainer.end())
+ {
+ // Insert a new MasterPageDescriptor.
+ bool bIgnore(rpDescriptor->mpPageObjectProvider == nullptr
+ && rpDescriptor->msURL.isEmpty());
+
+ if ( ! bIgnore)
+ {
+ CleanContainer();
+
+ aResult = maContainer.size();
+ rpDescriptor->SetToken(aResult);
+
+ // Templates are precious, i.e. we lock them so that they will
+ // not be destroyed when (temporarily) no one references them.
+ // They will only be deleted when the container is destroyed.
+ switch (rpDescriptor->meOrigin)
+ {
+ case TEMPLATE:
+ case DEFAULT:
+ ++rpDescriptor->mnUseCount;
+ break;
+
+ default:
+ break;
+ }
+
+ maContainer.push_back(rpDescriptor);
+ aEntry = maContainer.end()-1;
+
+ FireContainerChange(MasterPageContainerChangeEvent::EventType::CHILD_ADDED,aResult);
+ }
+ }
+ else
+ {
+ // Update an existing MasterPageDescriptor.
+ aResult = (*aEntry)->maToken;
+ std::unique_ptr<std::vector<MasterPageContainerChangeEvent::EventType> > pEventTypes(
+ (*aEntry)->Update(*rpDescriptor));
+ if (pEventTypes != nullptr && !pEventTypes->empty())
+ {
+ // One or more aspects of the descriptor have changed. Send
+ // appropriate events to the listeners.
+ UpdateDescriptor(*aEntry,false,false, true);
+
+ for (const auto& rEventType : *pEventTypes)
+ {
+ FireContainerChange(rEventType, (*aEntry)->maToken);
+ }
+ }
+ }
+
+ return aResult;
+}
+
+bool MasterPageContainer::Implementation::HasToken (Token aToken) const
+{
+ return aToken>=0
+ && o3tl::make_unsigned(aToken)<maContainer.size()
+ && maContainer[aToken];
+}
+
+SharedMasterPageDescriptor MasterPageContainer::Implementation::GetDescriptor (Token aToken) const
+{
+ if (aToken>=0 && o3tl::make_unsigned(aToken)<maContainer.size())
+ return maContainer[aToken];
+ else
+ return SharedMasterPageDescriptor();
+}
+
+void MasterPageContainer::Implementation::InvalidatePreview (Token aToken)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ SharedMasterPageDescriptor pDescriptor (GetDescriptor(aToken));
+ if (pDescriptor)
+ {
+ pDescriptor->maSmallPreview = Image();
+ pDescriptor->maLargePreview = Image();
+ RequestPreview(aToken);
+ }
+}
+
+Image MasterPageContainer::Implementation::GetPreviewForToken (
+ MasterPageContainer::Token aToken,
+ PreviewSize ePreviewSize)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ Image aPreview;
+ PreviewState ePreviewState (GetPreviewState(aToken));
+
+ SharedMasterPageDescriptor pDescriptor = GetDescriptor(aToken);
+
+ // When the preview is missing but inexpensively creatable then do that
+ // now.
+ if (pDescriptor)
+ {
+ if (ePreviewState == PS_CREATABLE)
+ if (UpdateDescriptor(pDescriptor, false,false, true))
+ if (pDescriptor->maLargePreview.GetSizePixel().Width() != 0)
+ ePreviewState = PS_AVAILABLE;
+
+ switch (ePreviewState)
+ {
+ case PS_AVAILABLE:
+ aPreview = pDescriptor->GetPreview(ePreviewSize);
+ break;
+
+ case PS_PREPARING:
+ aPreview = GetPreviewSubstitution(
+ STR_TASKPANEL_PREPARING_PREVIEW_SUBSTITUTION,
+ ePreviewSize);
+ break;
+
+ case PS_CREATABLE:
+ aPreview = GetPreviewSubstitution(
+ STR_TASKPANEL_PREPARING_PREVIEW_SUBSTITUTION,
+ ePreviewSize);
+ break;
+
+ case PS_NOT_AVAILABLE:
+ aPreview = GetPreviewSubstitution(
+ STR_TASKPANEL_NOT_AVAILABLE_SUBSTITUTION,
+ ePreviewSize);
+ if (ePreviewSize == SMALL)
+ pDescriptor->maSmallPreview = aPreview;
+ else
+ pDescriptor->maLargePreview = aPreview;
+ break;
+ }
+ }
+
+ return aPreview;
+}
+
+MasterPageContainer::PreviewState MasterPageContainer::Implementation::GetPreviewState (
+ Token aToken) const
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ PreviewState eState (PS_NOT_AVAILABLE);
+
+ SharedMasterPageDescriptor pDescriptor = GetDescriptor(aToken);
+ if (pDescriptor)
+ {
+ if (pDescriptor->maLargePreview.GetSizePixel().Width() != 0)
+ eState = PS_AVAILABLE;
+ else if (pDescriptor->mpPreviewProvider != nullptr)
+ {
+ // The preview does not exist but can be created. When that is
+ // not expensive then do it at once.
+ if (mpRequestQueue->HasRequest(aToken))
+ eState = PS_PREPARING;
+ else
+ eState = PS_CREATABLE;
+ }
+ else
+ eState = PS_NOT_AVAILABLE;
+ }
+
+ return eState;
+}
+
+bool MasterPageContainer::Implementation::RequestPreview (Token aToken)
+{
+ SharedMasterPageDescriptor pDescriptor = GetDescriptor(aToken);
+ if (pDescriptor)
+ return mpRequestQueue->RequestPreview(pDescriptor);
+ else
+ return false;
+}
+
+Reference<frame::XModel> MasterPageContainer::Implementation::GetModel()
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ if ( ! mxModel.is())
+ {
+ // Create a new model.
+ mxModel.set(
+ ::comphelper::getProcessServiceFactory()->createInstance(
+ "com.sun.star.presentation.PresentationDocument"),
+ uno::UNO_QUERY);
+
+ // Initialize the model.
+ uno::Reference<frame::XLoadable> xLoadable (mxModel,uno::UNO_QUERY);
+ if (xLoadable.is())
+ xLoadable->initNew();
+
+ // Use its tunnel to get a pointer to its core implementation.
+ uno::Reference<lang::XUnoTunnel> xUnoTunnel (mxModel, uno::UNO_QUERY);
+ if (auto pSdXImpressDocument = comphelper::getFromUnoTunnel<SdXImpressDocument>(xUnoTunnel))
+ {
+ mpDocument = pSdXImpressDocument->GetDoc();
+ }
+
+ // Create a default page.
+ uno::Reference<drawing::XDrawPagesSupplier> xSlideSupplier (mxModel, uno::UNO_QUERY);
+ if (xSlideSupplier.is())
+ {
+ uno::Reference<drawing::XDrawPages> xSlides =
+ xSlideSupplier->getDrawPages();
+ if (xSlides.is())
+ {
+ uno::Reference<drawing::XDrawPage> xNewPage (xSlides->insertNewByIndex(0));
+ uno::Reference<beans::XPropertySet> xProperties(xNewPage, uno::UNO_QUERY);
+ if (xProperties.is())
+ xProperties->setPropertyValue(
+ "Layout",
+ Any(sal_Int16(AUTOLAYOUT_TITLE)));
+ }
+ }
+ }
+ return mxModel;
+}
+
+SdDrawDocument* MasterPageContainer::Implementation::GetDocument()
+{
+ GetModel();
+ return mpDocument;
+}
+
+Image MasterPageContainer::Implementation::GetPreviewSubstitution (
+ TranslateId pId,
+ PreviewSize ePreviewSize)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ Image aPreview;
+
+ if (pId == STR_TASKPANEL_PREPARING_PREVIEW_SUBSTITUTION)
+ {
+ Image& rPreview (ePreviewSize==SMALL
+ ? maSmallPreviewBeingCreated
+ : maLargePreviewBeingCreated);
+ if (rPreview.GetSizePixel().Width() == 0)
+ {
+ rPreview = maPreviewRenderer.RenderSubstitution(
+ ePreviewSize==SMALL ? maSmallPreviewSizePixel : maLargePreviewSizePixel,
+ SdResId(STR_TASKPANEL_PREPARING_PREVIEW_SUBSTITUTION));
+ }
+ aPreview = rPreview;
+ }
+ else if (pId == STR_TASKPANEL_NOT_AVAILABLE_SUBSTITUTION)
+ {
+ Image& rPreview (ePreviewSize==SMALL
+ ? maSmallPreviewNotAvailable
+ : maLargePreviewNotAvailable);
+ if (rPreview.GetSizePixel().Width() == 0)
+ {
+ rPreview = maPreviewRenderer.RenderSubstitution(
+ ePreviewSize==SMALL ? maSmallPreviewSizePixel : maLargePreviewSizePixel,
+ SdResId(STR_TASKPANEL_NOT_AVAILABLE_SUBSTITUTION));
+ }
+ aPreview = rPreview;
+ }
+
+ return aPreview;
+}
+
+void MasterPageContainer::Implementation::CleanContainer()
+{
+ // Remove the empty elements at the end of the container. The empty
+ // elements in the middle can not be removed because that would
+ // invalidate the references still held by others.
+ int nIndex (maContainer.size()-1);
+ while (nIndex>=0 && !maContainer[nIndex])
+ --nIndex;
+ maContainer.resize(++nIndex);
+}
+
+void MasterPageContainer::Implementation::FireContainerChange (
+ MasterPageContainerChangeEvent::EventType eType,
+ Token aToken)
+{
+ ::std::vector<Link<MasterPageContainerChangeEvent&,void>> aCopy(maChangeListeners);
+ MasterPageContainerChangeEvent aEvent;
+ aEvent.meEventType = eType;
+ aEvent.maChildToken = aToken;
+ for (const auto& rListener : aCopy)
+ rListener.Call(aEvent);
+}
+
+bool MasterPageContainer::Implementation::UpdateDescriptor (
+ const SharedMasterPageDescriptor& rpDescriptor,
+ bool bForcePageObject,
+ bool bForcePreview,
+ bool bSendEvents)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ // We have to create the page object when the preview provider needs it
+ // and the caller needs the preview.
+ bForcePageObject |= (bForcePreview
+ && rpDescriptor->mpPreviewProvider->NeedsPageObject()
+ && rpDescriptor->mpMasterPage==nullptr);
+
+ // Define a cost threshold so that an update or page object or preview
+ // that is at least this cost are made at once. Updates with higher cost
+ // are scheduled for later.
+ sal_Int32 nCostThreshold (mpRequestQueue->IsEmpty() ? 5 : 0);
+
+ // Update the page object (which may be used for the preview update).
+ if (bForcePageObject)
+ GetDocument();
+ int nPageObjectModified (rpDescriptor->UpdatePageObject(
+ (bForcePageObject ? -1 : nCostThreshold),
+ mpDocument));
+ if (nPageObjectModified == 1 && bSendEvents)
+ FireContainerChange(
+ MasterPageContainerChangeEvent::EventType::DATA_CHANGED,
+ rpDescriptor->maToken);
+ if (nPageObjectModified == -1 && bSendEvents)
+ FireContainerChange(
+ MasterPageContainerChangeEvent::EventType::CHILD_REMOVED,
+ rpDescriptor->maToken);
+ if (nPageObjectModified && ! mbFirstPageObjectSeen)
+ UpdatePreviewSizePixel();
+
+ // Update the preview.
+ bool bPreviewModified (rpDescriptor->UpdatePreview(
+ (bForcePreview ? -1 : nCostThreshold),
+ maSmallPreviewSizePixel,
+ maLargePreviewSizePixel,
+ maPreviewRenderer));
+
+ if (bPreviewModified && bSendEvents)
+ FireContainerChange(
+ MasterPageContainerChangeEvent::EventType::PREVIEW_CHANGED,
+ rpDescriptor->maToken);
+
+ return nPageObjectModified || bPreviewModified;
+}
+
+void MasterPageContainer::Implementation::ReleaseDescriptor (Token aToken)
+{
+ if (aToken>=0 && o3tl::make_unsigned(aToken)<maContainer.size())
+ {
+ maContainer[aToken].reset();
+ }
+}
+
+void MasterPageContainer::Implementation::FillingDone()
+{
+ mpRequestQueue->ProcessAllRequests();
+}
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/MasterPageContainer.hxx b/sd/source/ui/sidebar/MasterPageContainer.hxx
new file mode 100644
index 000000000..9de4eb6bc
--- /dev/null
+++ b/sd/source/ui/sidebar/MasterPageContainer.hxx
@@ -0,0 +1,199 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/image.hxx>
+
+#include <memory>
+
+class SdPage;
+
+namespace sd::sidebar
+{
+class MasterPageDescriptor;
+class MasterPageContainerChangeEvent;
+
+/** This container manages the master pages used by the MasterPagesSelector
+ controls. It uses internally a singleton implementation object.
+ Therefore, all MasterPageContainer object operator on the same set of
+ master pages. Each MasterPageContainer, however, has its own
+ PreviewSize value and thus can independently switch between large and
+ small previews.
+
+ The container maintains its own document to store master page objects.
+
+ For each master page container stores its URL, preview bitmap, page
+ name, and, if available, the page object.
+
+ Entries are accessed via a Token, which is mostly a numerical index but
+ whose values do not necessarily have to be consecutive.
+*/
+class MasterPageContainer final
+{
+public:
+ typedef int Token;
+ static const Token NIL_TOKEN = -1;
+
+ MasterPageContainer();
+ ~MasterPageContainer();
+
+ void AddChangeListener(const Link<MasterPageContainerChangeEvent&, void>& rLink);
+ void RemoveChangeListener(const Link<MasterPageContainerChangeEvent&, void>& rLink);
+
+ enum PreviewSize
+ {
+ SMALL,
+ LARGE
+ };
+ /** There are two different preview sizes, a small one and a large one.
+ Which one is used by the called container can be changed with this
+ method.
+ When the preview size is changed then all change listeners are
+ notified of this.
+ */
+ void SetPreviewSize(PreviewSize eSize);
+
+ /** Returns the preview size.
+ */
+ PreviewSize GetPreviewSize() const { return mePreviewSize; }
+
+ /** Return the preview size in pixels.
+ */
+ Size const& GetPreviewSizePixel() const;
+
+ enum PreviewState
+ {
+ PS_AVAILABLE,
+ PS_CREATABLE,
+ PS_PREPARING,
+ PS_NOT_AVAILABLE
+ };
+ PreviewState GetPreviewState(Token aToken);
+
+ /** This method is typically called for entries in the container for
+ which GetPreviewState() returns OS_CREATABLE. The creation of the
+ preview is then scheduled to be executed asynchronously at a later
+ point in time. When the preview is available the change listeners
+ will be notified.
+ */
+ bool RequestPreview(Token aToken);
+
+ /** Each entry of the container is either the first page of a template
+ document or is a master page of an Impress document.
+ */
+ enum Origin
+ {
+ MASTERPAGE, // Master page of a document.
+ TEMPLATE, // First page of a template file.
+ DEFAULT, // Empty master page with default style.
+ UNKNOWN
+ };
+
+ /** Put the master page identified and described by the given parameters
+ into the container. When there already is a master page with the
+ given URL, page name, or object pointer (when that is not NULL) then
+ the existing entry is replaced/updated by the given one. Otherwise
+ a new entry is inserted.
+ */
+ Token PutMasterPage(const std::shared_ptr<MasterPageDescriptor>& rDescriptor);
+ void AcquireToken(Token aToken);
+ void ReleaseToken(Token aToken);
+
+ /** This and the GetTokenForIndex() methods can be used to iterate over
+ all members of the container.
+ */
+ int GetTokenCount() const;
+
+ /** Determine whether the container has a member for the given token.
+ */
+ bool HasToken(Token aToken) const;
+
+ /** Return a token for an index in the range
+ 0 <= index < GetTokenCount().
+ */
+ Token GetTokenForIndex(int nIndex);
+
+ Token GetTokenForURL(const OUString& sURL);
+ Token GetTokenForStyleName(const OUString& sStyleName);
+ Token GetTokenForPageObject(const SdPage* pPage);
+
+ OUString GetURLForToken(Token aToken);
+ OUString GetPageNameForToken(Token aToken);
+ OUString GetStyleNameForToken(Token aToken);
+ SdPage* GetPageObjectForToken(Token aToken, bool bLoad);
+ Origin GetOriginForToken(Token aToken);
+ sal_Int32 GetTemplateIndexForToken(Token aToken);
+ std::shared_ptr<MasterPageDescriptor> GetDescriptorForToken(Token aToken);
+
+ void InvalidatePreview(Token aToken);
+
+ /** Return a preview for the specified token. When the preview is not
+ present then the PreviewProvider associated with the token is
+ executed only when that is not expensive. It is the responsibility
+ of the caller to call RequestPreview() to do the same
+ (asynchronously) for expensive PreviewProviders.
+ Call GetPreviewState() to find out if that is necessary.
+ @param aToken
+ This token specifies for which master page to return the preview.
+ Tokens are returned for example by the GetTokenFor...() methods.
+ @return
+ The returned image is the requested preview or a substitution.
+ */
+ Image GetPreviewForToken(Token aToken);
+
+private:
+ class Implementation;
+ std::shared_ptr<Implementation> mpImpl;
+ PreviewSize mePreviewSize;
+};
+
+/** For some changes to the set of master pages in a MasterPageContainer or
+ to the data stored for each master page one or more events are sent to
+ registered listeners.
+ Each event has an event type and a token that tells the listener where
+ the change took place.
+*/
+class MasterPageContainerChangeEvent
+{
+public:
+ enum class EventType
+ {
+ // A master page was added to the container.
+ CHILD_ADDED,
+ // A master page was removed from the container.
+ CHILD_REMOVED,
+ // The preview of a master page has changed.
+ PREVIEW_CHANGED,
+ // The size of a preview has changed.
+ SIZE_CHANGED,
+ // Some of the data stored for a master page has changed.
+ DATA_CHANGED,
+ // The TemplateIndex of a master page has changed.
+ INDEX_CHANGED,
+ } meEventType;
+
+ // Token of the container entry whose data changed or which was added or
+ // removed.
+ MasterPageContainer::Token maChildToken;
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/MasterPageContainerFiller.cxx b/sd/source/ui/sidebar/MasterPageContainerFiller.cxx
new file mode 100644
index 000000000..3568d9c71
--- /dev/null
+++ b/sd/source/ui/sidebar/MasterPageContainerFiller.cxx
@@ -0,0 +1,168 @@
+/* -*- 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 "MasterPageContainerFiller.hxx"
+
+#include "MasterPageDescriptor.hxx"
+#include "MasterPageContainerProviders.hxx"
+#include <TemplateScanner.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd::sidebar {
+
+MasterPageContainerFiller::MasterPageContainerFiller (ContainerAdapter& rpAdapter)
+ : mrContainerAdapter(rpAdapter),
+ meState(INITIALIZE_TEMPLATE_SCANNER),
+ mpLastAddedEntry(nullptr),
+ mnIndex(1)
+{
+ // Add one entry for the default master page. We use temporarily the
+ // DefaultPagePreviewProvider to prevent the rendering (and the
+ // expensive creation) of the default page. It is replaced later on by
+ // another.
+ SharedMasterPageDescriptor pDescriptor = std::make_shared<MasterPageDescriptor>(
+ MasterPageContainer::DEFAULT,
+ 0,
+ OUString(),
+ OUString(),
+ OUString(),
+ false,
+ std::make_shared<DefaultPageObjectProvider>(),
+ std::make_shared<PagePreviewProvider>());
+ mrContainerAdapter.PutMasterPage(pDescriptor);
+}
+
+MasterPageContainerFiller::~MasterPageContainerFiller()
+{
+}
+
+void MasterPageContainerFiller::RunNextStep()
+{
+ switch (meState)
+ {
+ case INITIALIZE_TEMPLATE_SCANNER:
+ mpScannerTask.reset(new TemplateScanner());
+ meState = SCAN_TEMPLATE;
+ break;
+
+ case SCAN_TEMPLATE:
+ meState = ScanTemplate();
+ break;
+
+ case ADD_TEMPLATE:
+ meState = AddTemplate();
+ break;
+
+ case DONE:
+ case ERROR:
+ default:
+ break;
+ }
+
+ // When the state has just been set to DONE or ERROR then tell the
+ // container that no more templates will be coming and stop the
+ // scanning.
+ switch (meState)
+ {
+ case DONE:
+ case ERROR:
+ if (mpScannerTask != nullptr)
+ {
+ mrContainerAdapter.FillingDone();
+ mpScannerTask.reset();
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+bool MasterPageContainerFiller::HasNextStep()
+{
+ switch (meState)
+ {
+ case DONE:
+ case ERROR:
+ return false;
+
+ default:
+ return true;
+ }
+}
+
+MasterPageContainerFiller::State MasterPageContainerFiller::ScanTemplate()
+{
+ State eState (ERROR);
+
+ if (mpScannerTask != nullptr)
+ {
+ if (mpScannerTask->HasNextStep())
+ {
+ mpScannerTask->RunNextStep();
+ if (mpScannerTask->GetLastAddedEntry() != mpLastAddedEntry)
+ {
+ mpLastAddedEntry = mpScannerTask->GetLastAddedEntry();
+ if (mpLastAddedEntry != nullptr)
+ eState = ADD_TEMPLATE;
+ else
+ eState = SCAN_TEMPLATE;
+ }
+ else
+ eState = SCAN_TEMPLATE;
+ }
+ else
+ eState = DONE;
+ }
+
+ return eState;
+}
+
+MasterPageContainerFiller::State MasterPageContainerFiller::AddTemplate()
+{
+ if (mpLastAddedEntry != nullptr)
+ {
+ SharedMasterPageDescriptor pDescriptor = std::make_shared<MasterPageDescriptor>(
+ MasterPageContainer::TEMPLATE,
+ mnIndex,
+ mpLastAddedEntry->msPath,
+ mpLastAddedEntry->msTitle,
+ OUString(),
+ false,
+ std::make_shared<TemplatePageObjectProvider>(mpLastAddedEntry->msPath),
+ std::make_shared<TemplatePreviewProvider>(mpLastAddedEntry->msPath));
+ // For user supplied templates we use a different preview provider:
+ // The preview in the document shows not only shapes on the master
+ // page but also shapes on the foreground. This is misleading and
+ // therefore these previews are discarded and created directly from
+ // the page objects.
+ if (pDescriptor->GetURLClassification() == MasterPageDescriptor::URLCLASS_USER)
+ pDescriptor->mpPreviewProvider = std::make_shared<PagePreviewProvider>();
+
+ mrContainerAdapter.PutMasterPage(pDescriptor);
+ ++mnIndex;
+ }
+
+ return SCAN_TEMPLATE;
+}
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/MasterPageContainerFiller.hxx b/sd/source/ui/sidebar/MasterPageContainerFiller.hxx
new file mode 100644
index 000000000..b08452ab6
--- /dev/null
+++ b/sd/source/ui/sidebar/MasterPageContainerFiller.hxx
@@ -0,0 +1,92 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include "MasterPageContainer.hxx"
+#include "MasterPageDescriptor.hxx"
+#include <tools/AsynchronousTask.hxx>
+
+namespace sd
+{
+class TemplateScanner;
+class TemplateEntry;
+}
+
+namespace sd::sidebar
+{
+/** Fill a MasterPageContainer with information about the available master
+ pages. These are provided by one default page and from the existing
+ Impress templates. This is done asynchronously.
+*/
+class MasterPageContainerFiller : public ::sd::tools::AsynchronousTask
+{
+public:
+ class ContainerAdapter
+ {
+ public:
+ virtual MasterPageContainer::Token
+ PutMasterPage(const SharedMasterPageDescriptor& rpDescriptor)
+ = 0;
+ /** This method is called when all Impress templates have been added
+ to the container via the PutMasterPage() method.
+ */
+ virtual void FillingDone() = 0;
+
+ protected:
+ ~ContainerAdapter() {}
+ };
+
+ explicit MasterPageContainerFiller(ContainerAdapter& rContainerAdapter);
+ virtual ~MasterPageContainerFiller();
+
+ /** Run the next step of the task. After HasNextStep() returns false
+ this method should ignore further calls.
+ */
+ virtual void RunNextStep() override;
+
+ /** Return <TRUE/> when there is at least one more step to execute.
+ When the task has been executed completely then <FALSE/> is
+ returned.
+ */
+ virtual bool HasNextStep() override;
+
+private:
+ ContainerAdapter& mrContainerAdapter;
+ // Remember what the next step has to do.
+ enum State
+ {
+ INITIALIZE_TEMPLATE_SCANNER,
+ SCAN_TEMPLATE,
+ ADD_TEMPLATE,
+ ERROR,
+ DONE
+ } meState;
+ ::std::unique_ptr<TemplateScanner> mpScannerTask;
+ const TemplateEntry* mpLastAddedEntry;
+ int mnIndex;
+
+ State ScanTemplate();
+ State AddTemplate();
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/MasterPageContainerProviders.cxx b/sd/source/ui/sidebar/MasterPageContainerProviders.cxx
new file mode 100644
index 000000000..785536daa
--- /dev/null
+++ b/sd/source/ui/sidebar/MasterPageContainerProviders.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/.
+ *
+ * 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 "MasterPageContainerProviders.hxx"
+
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <PreviewRenderer.hxx>
+#include <svl/eitem.hxx>
+#include <sfx2/app.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <sfx2/thumbnailview.hxx>
+#include <vcl/image.hxx>
+#include <tools/diagnose_ex.h>
+#include <sal/log.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd::sidebar {
+
+//===== PagePreviewProvider ===================================================
+
+PagePreviewProvider::PagePreviewProvider()
+{
+}
+
+Image PagePreviewProvider::operator () (
+ int nWidth,
+ SdPage* pPage,
+ ::sd::PreviewRenderer& rRenderer)
+{
+ Image aPreview;
+
+ if (pPage != nullptr)
+ {
+ // Use the given renderer to create a preview of the given page
+ // object.
+ aPreview = rRenderer.RenderPage(
+ pPage,
+ nWidth);
+ }
+
+ return aPreview;
+}
+
+int PagePreviewProvider::GetCostIndex()
+{
+ return 5;
+}
+
+bool PagePreviewProvider::NeedsPageObject()
+{
+ return true;
+}
+
+//===== TemplatePreviewProvider ===============================================
+
+TemplatePreviewProvider::TemplatePreviewProvider (const OUString& rsURL)
+ : msURL(rsURL)
+{
+}
+
+Image TemplatePreviewProvider::operator() (
+ int,
+ SdPage*,
+ ::sd::PreviewRenderer&)
+{
+ return Image(ThumbnailView::readThumbnail(msURL));
+}
+
+int TemplatePreviewProvider::GetCostIndex()
+{
+ return 10;
+}
+
+bool TemplatePreviewProvider::NeedsPageObject()
+{
+ return false;
+}
+
+//===== TemplatePageObjectProvider =============================================
+
+TemplatePageObjectProvider::TemplatePageObjectProvider (const OUString& rsURL)
+ : msURL(rsURL)
+{
+}
+
+SdPage* TemplatePageObjectProvider::operator() (SdDrawDocument*)
+{
+ SdPage* pPage = nullptr;
+
+ mxDocumentShell = nullptr;
+ try
+ {
+ // Load the template document and return its first page.
+ ::sd::DrawDocShell* pDocumentShell = LoadDocument (msURL);
+ if (pDocumentShell != nullptr)
+ {
+ SdDrawDocument* pDocument = pDocumentShell->GetDoc();
+ if (pDocument != nullptr)
+ {
+ pPage = pDocument->GetMasterSdPage(0, PageKind::Standard);
+ // In order to make the newly loaded master page deletable
+ // when copied into documents it is marked as no "precious".
+ // When it is modified then it is marked as "precious".
+ if (pPage != nullptr)
+ pPage->SetPrecious(false);
+ }
+ }
+ }
+ catch (const uno::RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ pPage = nullptr;
+ }
+
+ return pPage;
+}
+
+::sd::DrawDocShell* TemplatePageObjectProvider::LoadDocument (const OUString& sFileName)
+{
+ SfxApplication* pSfxApp = SfxGetpApp();
+ std::unique_ptr<SfxItemSet> pSet(new SfxAllItemSet (pSfxApp->GetPool()));
+ pSet->Put (SfxBoolItem (SID_TEMPLATE, true));
+ pSet->Put (SfxBoolItem (SID_PREVIEW, true));
+ if (pSfxApp->LoadTemplate (mxDocumentShell, sFileName, std::move(pSet)))
+ {
+ mxDocumentShell = nullptr;
+ }
+ SfxObjectShell* pShell = mxDocumentShell;
+ return dynamic_cast< ::sd::DrawDocShell *>( pShell );
+}
+
+int TemplatePageObjectProvider::GetCostIndex()
+{
+ return 20;
+}
+
+//===== DefaultPageObjectProvider ==============================================
+
+DefaultPageObjectProvider::DefaultPageObjectProvider()
+{
+}
+
+SdPage* DefaultPageObjectProvider::operator () (SdDrawDocument* pContainerDocument)
+{
+ SdPage* pLocalMasterPage = nullptr;
+ if (pContainerDocument != nullptr)
+ {
+ SdPage* pLocalSlide = pContainerDocument->GetSdPage(0, PageKind::Standard);
+ if (pLocalSlide!=nullptr && pLocalSlide->TRG_HasMasterPage())
+ pLocalMasterPage = dynamic_cast<SdPage*>(&pLocalSlide->TRG_GetMasterPage());
+ }
+
+ if (pLocalMasterPage == nullptr)
+ {
+ SAL_WARN( "sd", "can not create master page for slide");
+ }
+
+ return pLocalMasterPage;
+}
+
+int DefaultPageObjectProvider::GetCostIndex()
+{
+ return 15;
+}
+
+//===== ExistingPageProvider ==================================================
+
+ExistingPageProvider::ExistingPageProvider (SdPage* pPage)
+ : mpPage(pPage)
+{
+}
+
+SdPage* ExistingPageProvider::operator() (SdDrawDocument*)
+{
+ return mpPage;
+}
+
+int ExistingPageProvider::GetCostIndex()
+{
+ return 0;
+}
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/MasterPageContainerProviders.hxx b/sd/source/ui/sidebar/MasterPageContainerProviders.hxx
new file mode 100644
index 000000000..b76076e15
--- /dev/null
+++ b/sd/source/ui/sidebar/MasterPageContainerProviders.hxx
@@ -0,0 +1,175 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <rtl/ustring.hxx>
+#include <sfx2/objsh.hxx>
+
+class Image;
+class SdDrawDocument;
+class SdPage;
+namespace sd
+{
+class PreviewRenderer;
+}
+namespace sd
+{
+class DrawDocShell;
+}
+
+namespace sd::sidebar
+{
+/** Interface for a provider of page objects. It is used by the
+ MasterPageDescriptor to create master page objects on demand.
+*/
+class PageObjectProvider
+{
+public:
+ /** Return a master page either by returning an already existing one, by
+ creating a new page, or by loading a document.
+ @param pDocument
+ The document of the MasterPageContainer. It may be used to
+ create new pages.
+ */
+ virtual SdPage* operator()(SdDrawDocument* pDocument) = 0;
+
+ /** An abstract value for the expected cost of providing a master page
+ object.
+ @return
+ A value of 0 represents for the lowest cost, i.e. an almost
+ immediate return. Positive values stand for higher costs.
+ Negative values are not supported.
+ */
+ virtual int GetCostIndex() = 0;
+
+protected:
+ ~PageObjectProvider() {}
+};
+
+class PreviewProvider
+{
+public:
+ /** Create a preview image in the specified width.
+ @param nWidth
+ Requested width of the preview. The calling method can cope
+ with other sizes as well but the resulting image quality is
+ better when the returned image has the requested size.
+ @param pPage
+ Page object for which a preview is requested. This may be NULL
+ when the page object is expensive to get and the PreviewProvider
+ does not need this object (NeedsPageObject() returns false.)
+ @param rRenderer
+ This PreviewRenderer may be used by the PreviewProvider to
+ create a preview image.
+ */
+ virtual Image operator()(int nWidth, SdPage* pPage, ::sd::PreviewRenderer& rRenderer) = 0;
+
+ /** Return a value that indicates how expensive the creation of a
+ preview image is. The higher the returned value the more expensive
+ is the preview creation. Return 0 when the preview is already
+ present and can be returned immediately.
+ */
+ virtual int GetCostIndex() = 0;
+
+ /** Return whether the page object passed is necessary to create a
+ preview.
+ */
+ virtual bool NeedsPageObject() = 0;
+
+protected:
+ ~PreviewProvider() {}
+};
+
+/** Provide previews of existing page objects by rendering them.
+*/
+class PagePreviewProvider : public PreviewProvider
+{
+public:
+ PagePreviewProvider();
+ virtual ~PagePreviewProvider() {}
+ virtual Image operator()(int nWidth, SdPage* pPage, ::sd::PreviewRenderer& rRenderer) override;
+ virtual int GetCostIndex() override;
+ virtual bool NeedsPageObject() override;
+
+private:
+};
+
+/** Provide master page objects for template documents for which only the
+ URL is given.
+*/
+class TemplatePageObjectProvider : public PageObjectProvider
+{
+public:
+ explicit TemplatePageObjectProvider(const OUString& rsURL);
+ virtual ~TemplatePageObjectProvider(){};
+ virtual SdPage* operator()(SdDrawDocument* pDocument) override;
+ virtual int GetCostIndex() override;
+
+private:
+ OUString msURL;
+ SfxObjectShellLock mxDocumentShell;
+ ::sd::DrawDocShell* LoadDocument(const OUString& sFileName);
+};
+
+/** Provide previews for template documents by loading the thumbnails from
+ the documents.
+*/
+class TemplatePreviewProvider : public PreviewProvider
+{
+public:
+ explicit TemplatePreviewProvider(const OUString& rsURL);
+ virtual ~TemplatePreviewProvider(){};
+ virtual Image operator()(int nWidth, SdPage* pPage, ::sd::PreviewRenderer& rRenderer) override;
+ virtual int GetCostIndex() override;
+ virtual bool NeedsPageObject() override;
+
+private:
+ OUString msURL;
+};
+
+/** Create an empty default master page.
+*/
+class DefaultPageObjectProvider : public PageObjectProvider
+{
+public:
+ DefaultPageObjectProvider();
+ virtual ~DefaultPageObjectProvider() {}
+ virtual SdPage* operator()(SdDrawDocument* pDocument) override;
+ virtual int GetCostIndex() override;
+};
+
+/** This implementation of the PageObjectProvider simply returns an already
+ existing master page object.
+*/
+class ExistingPageProvider : public PageObjectProvider
+{
+public:
+ explicit ExistingPageProvider(SdPage* pPage);
+ virtual ~ExistingPageProvider() {}
+ virtual SdPage* operator()(SdDrawDocument* pDocument) override;
+ virtual int GetCostIndex() override;
+
+private:
+ SdPage* mpPage;
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/MasterPageContainerQueue.cxx b/sd/source/ui/sidebar/MasterPageContainerQueue.cxx
new file mode 100644
index 000000000..229f3d972
--- /dev/null
+++ b/sd/source/ui/sidebar/MasterPageContainerQueue.cxx
@@ -0,0 +1,263 @@
+/* -*- 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 "MasterPageContainerQueue.hxx"
+#include "MasterPageContainerProviders.hxx"
+
+#include <tools/IdleDetection.hxx>
+
+#include <set>
+
+namespace sd::sidebar {
+
+const sal_Int32 MasterPageContainerQueue::snDelayedCreationTimeout (15);
+const sal_Int32 MasterPageContainerQueue::snDelayedCreationTimeoutWhenNotIdle (100);
+const sal_Int32 MasterPageContainerQueue::snMasterPagePriorityBoost (5);
+const sal_Int32 MasterPageContainerQueue::snWaitForMoreRequestsPriorityThreshold (-10);
+sal_uInt32 MasterPageContainerQueue::snWaitForMoreRequestsCount(15);
+
+//===== MasterPageContainerQueue::PreviewCreationRequest ======================
+
+class MasterPageContainerQueue::PreviewCreationRequest
+{
+public:
+ PreviewCreationRequest (const SharedMasterPageDescriptor& rpDescriptor, int nPriority)
+ : mpDescriptor(rpDescriptor),
+ mnPriority(nPriority)
+ {}
+ SharedMasterPageDescriptor mpDescriptor;
+ int mnPriority;
+ class Compare
+ {
+ public:
+ bool operator() (const PreviewCreationRequest& r1,const PreviewCreationRequest& r2) const
+ {
+ if (r1.mnPriority != r2.mnPriority)
+ {
+ // Prefer requests with higher priority.
+ return r1.mnPriority > r2.mnPriority;
+ }
+ else
+ {
+ // Prefer tokens that have been earlier created (those with lower
+ // value).
+ return r1.mpDescriptor->maToken < r2.mpDescriptor->maToken;
+ }
+ }
+ };
+ class CompareToken
+ {
+ public:
+ MasterPageContainer::Token maToken;
+ explicit CompareToken(MasterPageContainer::Token aToken) : maToken(aToken) {}
+ bool operator() (const PreviewCreationRequest& rRequest) const
+ { return maToken==rRequest.mpDescriptor->maToken; }
+ };
+};
+
+//===== MasterPageContainerQueue::RequestQueue ================================
+
+class MasterPageContainerQueue::RequestQueue
+ : public ::std::set<PreviewCreationRequest,PreviewCreationRequest::Compare>
+{
+public:
+ RequestQueue() {}
+};
+
+//===== MasterPageContainerQueue ==============================================
+
+MasterPageContainerQueue* MasterPageContainerQueue::Create (
+ const std::weak_ptr<ContainerAdapter>& rpContainer)
+{
+ MasterPageContainerQueue* pQueue = new MasterPageContainerQueue(rpContainer);
+ pQueue->LateInit();
+ return pQueue;
+}
+
+MasterPageContainerQueue::MasterPageContainerQueue (
+ const std::weak_ptr<ContainerAdapter>& rpContainer)
+ : mpWeakContainer(rpContainer),
+ mpRequestQueue(new RequestQueue()),
+ maDelayedPreviewCreationTimer("sd MasterPageContainerQueue maDelayedPreviewCreationTimer"),
+ mnRequestsServedCount(0)
+{
+}
+
+MasterPageContainerQueue::~MasterPageContainerQueue()
+{
+ maDelayedPreviewCreationTimer.Stop();
+ while ( ! mpRequestQueue->empty())
+ mpRequestQueue->erase(mpRequestQueue->begin());
+}
+
+void MasterPageContainerQueue::LateInit()
+{
+ // Set up the timer for the delayed creation of preview bitmaps.
+ maDelayedPreviewCreationTimer.SetTimeout (snDelayedCreationTimeout);
+ maDelayedPreviewCreationTimer.SetInvokeHandler(
+ LINK(this,MasterPageContainerQueue,DelayedPreviewCreation) );
+}
+
+bool MasterPageContainerQueue::RequestPreview (const SharedMasterPageDescriptor& rpDescriptor)
+{
+ bool bSuccess (false);
+ if (rpDescriptor
+ && rpDescriptor->maLargePreview.GetSizePixel().Width() == 0)
+ {
+ sal_Int32 nPriority (CalculatePriority(rpDescriptor));
+
+ // Add a new or replace an existing request.
+ RequestQueue::iterator iRequest (::std::find_if(
+ mpRequestQueue->begin(),
+ mpRequestQueue->end(),
+ PreviewCreationRequest::CompareToken(rpDescriptor->maToken)));
+ // When a request for the same token exists then the lowest of the
+ // two priorities is used.
+ if (iRequest != mpRequestQueue->end())
+ if (iRequest->mnPriority < nPriority)
+ {
+ mpRequestQueue->erase(iRequest);
+ iRequest = mpRequestQueue->end();
+ }
+
+ // Add a new request when none exists (or has just been erased).
+ if (iRequest == mpRequestQueue->end())
+ {
+ mpRequestQueue->insert(PreviewCreationRequest(rpDescriptor,nPriority));
+ maDelayedPreviewCreationTimer.Start();
+ bSuccess = true;
+ }
+ }
+ return bSuccess;
+}
+
+sal_Int32 MasterPageContainerQueue::CalculatePriority (
+ const SharedMasterPageDescriptor& rpDescriptor)
+{
+ sal_Int32 nPriority;
+
+ // The cost is used as a starting value.
+ int nCost (0);
+ if (rpDescriptor->mpPreviewProvider != nullptr)
+ {
+ nCost = rpDescriptor->mpPreviewProvider->GetCostIndex();
+ if (rpDescriptor->mpPreviewProvider->NeedsPageObject())
+ if (rpDescriptor->mpPageObjectProvider != nullptr)
+ nCost += rpDescriptor->mpPageObjectProvider->GetCostIndex();
+ }
+
+ // Its negative value is used so that requests with a low cost are
+ // preferred over those with high costs.
+ nPriority = -nCost;
+
+ // Add a term that introduces an order based on the appearance in the
+ // AllMasterPagesSelector.
+ nPriority -= rpDescriptor->maToken / 3;
+
+ // Process requests for the CurrentMasterPagesSelector first.
+ if (rpDescriptor->meOrigin == MasterPageContainer::MASTERPAGE)
+ nPriority += snMasterPagePriorityBoost;
+
+ return nPriority;
+}
+
+IMPL_LINK(MasterPageContainerQueue, DelayedPreviewCreation, Timer*, pTimer, void)
+{
+ bool bIsShowingFullScreenShow (false);
+ bool bWaitForMoreRequests (false);
+
+ do
+ {
+ if (mpRequestQueue->empty())
+ break;
+
+ // First check whether the system is idle.
+ tools::IdleState nIdleState (tools::IdleDetection::GetIdleState(nullptr));
+ if (nIdleState != tools::IdleState::Idle)
+ {
+ if (nIdleState & tools::IdleState::FullScreenShowActive)
+ bIsShowingFullScreenShow = true;
+ break;
+ }
+
+ PreviewCreationRequest aRequest (*mpRequestQueue->begin());
+
+ // Check if the request should really be processed right now.
+ // Reasons to not do it are when its cost is high and not many other
+ // requests have been inserted into the queue that would otherwise
+ // be processed first.
+ if (aRequest.mnPriority < snWaitForMoreRequestsPriorityThreshold
+ && (mnRequestsServedCount+mpRequestQueue->size() < snWaitForMoreRequestsCount))
+ {
+ // Wait for more requests before this one is processed. Note
+ // that the queue processing is not started anew when this
+ // method is left. That is done when the next request is
+ // inserted.
+ bWaitForMoreRequests = true;
+ break;
+ }
+
+ mpRequestQueue->erase(mpRequestQueue->begin());
+
+ if (aRequest.mpDescriptor)
+ {
+ mnRequestsServedCount += 1;
+ if ( ! mpWeakContainer.expired())
+ {
+ std::shared_ptr<ContainerAdapter> pContainer (mpWeakContainer);
+ if (pContainer != nullptr)
+ pContainer->UpdateDescriptor(aRequest.mpDescriptor,false,true,true);
+ }
+ }
+ }
+ while (false);
+
+ if (!mpRequestQueue->empty() && ! bWaitForMoreRequests)
+ {
+ int nTimeout (snDelayedCreationTimeout);
+ if (bIsShowingFullScreenShow)
+ nTimeout = snDelayedCreationTimeoutWhenNotIdle;
+ maDelayedPreviewCreationTimer.SetTimeout(nTimeout);
+ pTimer->Start();
+ }
+}
+
+bool MasterPageContainerQueue::HasRequest (MasterPageContainer::Token aToken) const
+{
+ return std::any_of(
+ mpRequestQueue->begin(),
+ mpRequestQueue->end(),
+ PreviewCreationRequest::CompareToken(aToken));
+}
+
+bool MasterPageContainerQueue::IsEmpty() const
+{
+ return mpRequestQueue->empty();
+}
+
+void MasterPageContainerQueue::ProcessAllRequests()
+{
+ snWaitForMoreRequestsCount = 0;
+ if (!mpRequestQueue->empty())
+ maDelayedPreviewCreationTimer.Start();
+}
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/MasterPageContainerQueue.hxx b/sd/source/ui/sidebar/MasterPageContainerQueue.hxx
new file mode 100644
index 000000000..6b9b0adca
--- /dev/null
+++ b/sd/source/ui/sidebar/MasterPageContainerQueue.hxx
@@ -0,0 +1,131 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "MasterPageContainer.hxx"
+#include "MasterPageDescriptor.hxx"
+
+#include <vcl/timer.hxx>
+
+#include <memory>
+
+namespace sd::sidebar {
+
+/** The queue stores and processes all requests from a MasterPageContainer
+ for the creation of previews.
+ The order of request processing and its timing is controlled by a
+ heuristic that uses values given with each request and which is
+ controlled by various parameters that are described below.
+*/
+class MasterPageContainerQueue final
+{
+public:
+ class ContainerAdapter {
+ public:
+ virtual bool UpdateDescriptor (
+ const SharedMasterPageDescriptor& rpDescriptor,
+ bool bForcePageObject,
+ bool bForcePreview,
+ bool bSendEvents) = 0;
+
+ protected:
+ ~ContainerAdapter() {}
+ };
+
+ static MasterPageContainerQueue* Create (
+ const std::weak_ptr<ContainerAdapter>& rpContainer);
+ ~MasterPageContainerQueue();
+
+ /** This method is typically called for entries in the container for
+ which GetPreviewState() returns OS_CREATABLE. The creation of the
+ preview is then scheduled to be executed asynchronously at a later
+ point in time. When the preview is available the change listeners
+ will be notified.
+ */
+ bool RequestPreview (const SharedMasterPageDescriptor& rDescriptor);
+
+ /** Return <TRUE/> when there is a request currently in the queue for
+ the given token.
+ */
+ bool HasRequest (MasterPageContainer::Token aToken) const;
+
+ /** Return <TRUE/> when there is at least one request in the queue.
+ */
+ bool IsEmpty() const;
+
+ /** After this call the queue does not wait anymore for requests with
+ higher priority when only a small number of requests with lower
+ priority are present. This method should be called when all
+ templates are inserted into the MasterPageContainer.
+ */
+ void ProcessAllRequests();
+
+private:
+ std::weak_ptr<ContainerAdapter> mpWeakContainer;
+ class PreviewCreationRequest;
+ class RequestQueue;
+ std::unique_ptr<RequestQueue> mpRequestQueue;
+ Timer maDelayedPreviewCreationTimer;
+ sal_uInt32 mnRequestsServedCount;
+
+ // There are a couple of values that define various aspects of the
+ // heuristic that defines the order and timing in which requests for
+ // preview creation are processed.
+
+ /** The time to wait (in milliseconds) between the creation of previews.
+ */
+ static const sal_Int32 snDelayedCreationTimeout;
+
+ /** The time to wait when the system is not idle.
+ */
+ static const sal_Int32 snDelayedCreationTimeoutWhenNotIdle;
+
+ /** Requests for previews of master pages in a document have their
+ priority increased by this value.
+ */
+ static const sal_Int32 snMasterPagePriorityBoost;
+
+ /** When only requests which a priority lower than this threshold exist
+ and not many requests have been made yet then wait with processing
+ them until more requests are present.
+ */
+ static const sal_Int32 snWaitForMoreRequestsPriorityThreshold;
+
+ /** When only requests which a priority lower than a threshold exist
+ and not more requests than this number have been made or already
+ processed then wait with processing them until more requests are
+ present.
+ */
+ static sal_uInt32 snWaitForMoreRequestsCount;
+
+ explicit MasterPageContainerQueue (const std::weak_ptr<ContainerAdapter>& rpContainer);
+ void LateInit();
+
+ /** Calculate the priority that defines the order in which requests
+ are processed.
+ */
+ static sal_Int32 CalculatePriority (const SharedMasterPageDescriptor& rDescriptor);
+
+ DECL_LINK(DelayedPreviewCreation, Timer *, void);
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/MasterPageDescriptor.cxx b/sd/source/ui/sidebar/MasterPageDescriptor.cxx
new file mode 100644
index 000000000..2c0c23eb7
--- /dev/null
+++ b/sd/source/ui/sidebar/MasterPageDescriptor.cxx
@@ -0,0 +1,341 @@
+/* -*- 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 <memory>
+#include "MasterPageDescriptor.hxx"
+#include "MasterPageContainerProviders.hxx"
+
+#include "DocumentHelper.hxx"
+#include <PreviewRenderer.hxx>
+#include <sdpage.hxx>
+#include <tools/urlobj.hxx>
+#include <sal/log.hxx>
+
+namespace sd::sidebar {
+
+//===== MasterPageDescriptor ==================================================
+
+MasterPageDescriptor::MasterPageDescriptor (
+ MasterPageContainer::Origin eOrigin,
+ const sal_Int32 nTemplateIndex,
+ std::u16string_view rsURL,
+ const OUString& rsPageName,
+ const OUString& rsStyleName,
+ const bool bIsPrecious,
+ const std::shared_ptr<PageObjectProvider>& rpPageObjectProvider,
+ const std::shared_ptr<PreviewProvider>& rpPreviewProvider)
+ : maToken(MasterPageContainer::NIL_TOKEN),
+ meOrigin(eOrigin),
+ msURL(INetURLObject(rsURL).GetMainURL(INetURLObject::DecodeMechanism::Unambiguous)),
+ msPageName(rsPageName),
+ msStyleName(rsStyleName),
+ mbIsPrecious(bIsPrecious),
+ mpMasterPage(nullptr),
+ mpSlide(nullptr),
+ mpPreviewProvider(rpPreviewProvider),
+ mpPageObjectProvider(rpPageObjectProvider),
+ mnTemplateIndex(nTemplateIndex),
+ meURLClassification(URLCLASS_UNDETERMINED),
+ mnUseCount(0)
+{
+}
+
+void MasterPageDescriptor::SetToken (MasterPageContainer::Token aToken)
+{
+ maToken = aToken;
+}
+
+const Image& MasterPageDescriptor::GetPreview (MasterPageContainer::PreviewSize eSize) const
+{
+ if (eSize == MasterPageContainer::SMALL)
+ return maSmallPreview;
+ else
+ return maLargePreview;
+}
+
+::std::unique_ptr<std::vector<MasterPageContainerChangeEvent::EventType> >
+ MasterPageDescriptor::Update (
+ const MasterPageDescriptor& rDescriptor)
+{
+ bool bDataChanged (false);
+ bool bIndexChanged (false);
+ bool bPreviewChanged (false);
+
+ if (meOrigin==MasterPageContainer::UNKNOWN
+ && rDescriptor.meOrigin!=MasterPageContainer::UNKNOWN)
+ {
+ meOrigin = rDescriptor.meOrigin;
+ bIndexChanged = true;
+ }
+
+ if (msURL.isEmpty() && !rDescriptor.msURL.isEmpty())
+ {
+ msURL = rDescriptor.msURL;
+ bDataChanged = true;
+ }
+
+ if (msPageName.isEmpty() && !rDescriptor.msPageName.isEmpty())
+ {
+ msPageName = rDescriptor.msPageName;
+ bDataChanged = true;
+ }
+
+ if (msStyleName.isEmpty() && !rDescriptor.msStyleName.isEmpty())
+ {
+ msStyleName = rDescriptor.msStyleName;
+ bDataChanged = true;
+ }
+
+ if (mpPageObjectProvider == nullptr && rDescriptor.mpPageObjectProvider != nullptr)
+ {
+ mpPageObjectProvider = rDescriptor.mpPageObjectProvider;
+ bDataChanged = true;
+ }
+
+ if (mpPreviewProvider == nullptr && rDescriptor.mpPreviewProvider != nullptr)
+ {
+ mpPreviewProvider = rDescriptor.mpPreviewProvider;
+ bPreviewChanged = true;
+ }
+
+ if (mnTemplateIndex<0 && rDescriptor.mnTemplateIndex>=0)
+ {
+ mnTemplateIndex = rDescriptor.mnTemplateIndex;
+ bIndexChanged = true;
+ }
+
+ // Prepare the list of event types that will be returned.
+ ::std::unique_ptr<std::vector<MasterPageContainerChangeEvent::EventType> > pResult;
+ if (bDataChanged || bIndexChanged || bPreviewChanged)
+ {
+ pResult.reset(new std::vector<MasterPageContainerChangeEvent::EventType>);
+ if (bDataChanged)
+ pResult->push_back(MasterPageContainerChangeEvent::EventType::DATA_CHANGED);
+ if (bIndexChanged)
+ pResult->push_back(MasterPageContainerChangeEvent::EventType::INDEX_CHANGED);
+ if (bPreviewChanged)
+ pResult->push_back(MasterPageContainerChangeEvent::EventType::PREVIEW_CHANGED);
+ }
+
+ return pResult;
+}
+
+int MasterPageDescriptor::UpdatePageObject (
+ sal_Int32 nCostThreshold,
+ SdDrawDocument* pDocument)
+{
+ int nModified = 0;
+
+ // Update the page object when that is not yet known.
+ if (mpMasterPage == nullptr && mpPageObjectProvider != nullptr
+ && (nCostThreshold < 0 || mpPageObjectProvider->GetCostIndex() <= nCostThreshold))
+ {
+ // Note that pDocument may be NULL.
+
+ SdPage* pPage = (*mpPageObjectProvider)(pDocument);
+ if (meOrigin == MasterPageContainer::MASTERPAGE)
+ {
+ mpMasterPage = pPage;
+ if (mpMasterPage != nullptr)
+ mpMasterPage->SetPrecious(mbIsPrecious);
+ }
+ else
+ {
+ // Master pages from templates are copied into the local document.
+ if (pDocument != nullptr)
+ mpMasterPage = DocumentHelper::CopyMasterPageToLocalDocument(*pDocument,pPage);
+ mpSlide = DocumentHelper::GetSlideForMasterPage(mpMasterPage);
+ }
+
+ if (mpMasterPage != nullptr)
+ {
+ // Update page name and style name.
+ if (msPageName.isEmpty())
+ msPageName = mpMasterPage->GetName();
+ msStyleName = mpMasterPage->GetName();
+
+ // Delete an existing substitution. The next request for a preview
+ // will create the real one.
+ maSmallPreview = Image();
+ maLargePreview = Image();
+ mpPreviewProvider = std::make_shared<PagePreviewProvider>();
+ }
+ else
+ {
+ SAL_WARN( "sd", "UpdatePageObject: master page is NULL");
+ return -1;
+ }
+
+ nModified = 1;
+ }
+
+ return nModified;
+}
+
+bool MasterPageDescriptor::UpdatePreview (
+ sal_Int32 nCostThreshold,
+ const Size& rSmallSize,
+ const Size& rLargeSize,
+ ::sd::PreviewRenderer& rRenderer)
+{
+ bool bModified (false);
+
+ // Update the preview when that is not yet known.
+ if (maLargePreview.GetSizePixel().Width() == 0 && mpPreviewProvider != nullptr
+ && (nCostThreshold < 0 || mpPreviewProvider->GetCostIndex() <= nCostThreshold))
+ {
+ SdPage* pPage = mpSlide;
+ if (pPage == nullptr)
+ {
+ pPage = mpMasterPage;
+ }
+ //TODO: Notify LOOL of preview updates.
+ maLargePreview = (*mpPreviewProvider)(
+ rLargeSize.Width(),
+ pPage,
+ rRenderer);
+ if (maLargePreview.GetSizePixel().Width() > 0)
+ {
+ // Create the small preview by scaling the large one down.
+ maSmallPreview = rRenderer.ScaleBitmap(
+ maLargePreview.GetBitmapEx(),
+ rSmallSize.Width());
+ // The large preview may not have the desired width. Scale it
+ // accordingly.
+ if (maLargePreview.GetSizePixel().Width() != rLargeSize.Width())
+ maLargePreview = rRenderer.ScaleBitmap(
+ maLargePreview.GetBitmapEx(),
+ rLargeSize.Width());
+ bModified = true;
+ }
+ }
+
+ return bModified;
+}
+
+MasterPageDescriptor::URLClassification MasterPageDescriptor::GetURLClassification()
+{
+ if (meURLClassification == URLCLASS_UNDETERMINED)
+ {
+ if (msURL.isEmpty())
+ meURLClassification = URLCLASS_UNKNOWN;
+ else if (msURL.indexOf("presnt")>=0)
+ {
+ meURLClassification = URLCLASS_PRESENTATION;
+ }
+ else if (msURL.indexOf("layout")>=0)
+ {
+ meURLClassification = URLCLASS_LAYOUT;
+ }
+ else if (msURL.indexOf("educate")>=0)
+ {
+ meURLClassification = URLCLASS_OTHER;
+ }
+ else
+ {
+ meURLClassification = URLCLASS_USER;
+ }
+ }
+
+ return meURLClassification;
+}
+
+//===== URLComparator =========================================================
+
+MasterPageDescriptor::URLComparator::URLComparator (const OUString& sURL)
+ : msURL(sURL)
+{
+}
+
+bool MasterPageDescriptor::URLComparator::operator() (
+ const SharedMasterPageDescriptor& rDescriptor)
+{
+ if (!rDescriptor)
+ return false;
+ else
+ return rDescriptor->msURL == msURL;
+}
+
+// ===== StyleNameComparator ==================================================
+
+MasterPageDescriptor::StyleNameComparator::StyleNameComparator (const OUString& sStyleName)
+ : msStyleName(sStyleName)
+{
+}
+
+bool MasterPageDescriptor::StyleNameComparator::operator() (
+ const SharedMasterPageDescriptor& rDescriptor)
+{
+ if (!rDescriptor)
+ return false;
+ else
+ return rDescriptor->msStyleName == msStyleName;
+}
+
+//===== PageObjectComparator ==================================================
+
+MasterPageDescriptor::PageObjectComparator::PageObjectComparator (const SdPage* pPageObject)
+ : mpMasterPage(pPageObject)
+{
+}
+
+bool MasterPageDescriptor::PageObjectComparator::operator() (
+ const SharedMasterPageDescriptor& rDescriptor)
+{
+ if (!rDescriptor)
+ return false;
+ else
+ return rDescriptor->mpMasterPage==mpMasterPage;
+}
+
+//===== AllComparator =========================================================
+
+MasterPageDescriptor::AllComparator::AllComparator(const SharedMasterPageDescriptor& rDescriptor)
+ : mpDescriptor(rDescriptor)
+{
+}
+
+bool MasterPageDescriptor::AllComparator::operator() (const SharedMasterPageDescriptor&rDescriptor)
+{
+ if (!rDescriptor)
+ return false;
+ else
+ {
+ // Take URL, page name, style name, and page object into account
+ // when comparing two descriptors. When two descriptors are
+ // identical in any of these values then there are thought of as
+ // equivalent. Only the Origin has to be the same in both
+ // descriptors.
+ return mpDescriptor->meOrigin == rDescriptor->meOrigin
+ && ((!mpDescriptor->msURL.isEmpty() && mpDescriptor->msURL == rDescriptor->msURL)
+ || (!mpDescriptor->msPageName.isEmpty()
+ && mpDescriptor->msPageName == rDescriptor->msPageName)
+ || (!mpDescriptor->msStyleName.isEmpty()
+ && mpDescriptor->msStyleName == rDescriptor->msStyleName)
+ || (mpDescriptor->mpMasterPage != nullptr
+ && mpDescriptor->mpMasterPage == rDescriptor->mpMasterPage)
+ || (mpDescriptor->mpPageObjectProvider != nullptr
+ && rDescriptor->mpPageObjectProvider != nullptr
+ && mpDescriptor->mpPageObjectProvider == rDescriptor->mpPageObjectProvider));
+ }
+}
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/MasterPageDescriptor.hxx b/sd/source/ui/sidebar/MasterPageDescriptor.hxx
new file mode 100644
index 000000000..62717e528
--- /dev/null
+++ b/sd/source/ui/sidebar/MasterPageDescriptor.hxx
@@ -0,0 +1,231 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "MasterPageContainer.hxx"
+#include <memory>
+
+namespace sd { class PreviewRenderer; }
+class SdDrawDocument;
+
+namespace sd::sidebar {
+
+class PageObjectProvider;
+class PreviewProvider;
+
+class MasterPageDescriptor;
+typedef std::shared_ptr<MasterPageDescriptor> SharedMasterPageDescriptor;
+
+/** A collection of data that is stored for every master page in the
+ MasterpageContainer.
+*/
+class MasterPageDescriptor
+{
+public:
+ MasterPageDescriptor (
+ MasterPageContainer::Origin eOrigin,
+ const sal_Int32 nTemplateIndex,
+ std::u16string_view rURL,
+ const OUString& rPageName,
+ const OUString& rStyleName,
+ const bool bIsPrecious,
+ const std::shared_ptr<PageObjectProvider>& rpPageObjectProvider,
+ const std::shared_ptr<PreviewProvider>& rpPreviewProvider);
+
+ void SetToken (MasterPageContainer::Token aToken);
+
+ /** Update the called MasterPageDescriptor object with values from the
+ given one. Only those values are updated that have default values
+ in the called object and that have non-default values in the given
+ one.
+ @return
+ Returns a list of event types for which event notifications have
+ to be sent to listeners. The list may be empty or NULL.
+ */
+ ::std::unique_ptr<std::vector<MasterPageContainerChangeEvent::EventType> >
+ Update (
+ const MasterPageDescriptor& rDescriptor);
+
+ /** This convenience method returns either a small or a large preview,
+ depending on the given size specifier.
+ Note that the previews are not created when they are not present.
+ @return
+ The returned preview may be empty.
+ */
+ const Image& GetPreview (MasterPageContainer::PreviewSize ePreviewSize) const;
+
+ /** Use the PreviewProvider to get access to a preview of the master
+ page.
+
+ Note that this is only done, when either bForce is <TRUE/> or
+ the PreviewProvider::GetCostIndex() returns 0.
+
+ The small preview is created by scaling the large one, not by
+ calling PreviewProvider::operator() a second time.
+
+ It is the responsibility of the caller to call UpdatePageObject()
+ before calling this method when the PreviewProvider can only work
+ when the master page object is present, i.e. its NeedsPageObject()
+ method returns <TRUE/>.
+
+ @param nCostThreshold
+ When this is zero or positive then the preview is created only
+ when the preview provider has a cost equal to or smaller than
+ this threshold. A negative value forces the preview to be
+ created, regardless of the cost.
+ @param rSmallSize
+ Size of the small preview.
+ @param rLargeSize
+ Size of the large preview.
+ @param rRenderer
+ A PreviewRenderer object that may be used to create a preview.
+ @return
+ When the previews are successfully provided then <TRUE/> is
+ returned.
+ */
+ bool UpdatePreview (
+ sal_Int32 nCostThreshold,
+ const Size& rSmallSize,
+ const Size& rLargeSize,
+ ::sd::PreviewRenderer& rRenderer);
+
+ /** Use the PageObjectProvider to get access to the master page object.
+
+ Note that this is only done, when either bForce is <TRUE/> or the
+ PreviewProvider::GetCostIndex() returns 0.
+
+ @param nCostThreshold
+ When this is zero or positive then the page object is created
+ only when the page object provider has a cost equal to or
+ smaller than this threshold. A negative value forces the
+ page object be created, regardless of the cost.
+ @param pDocument
+ This document of the MasterPageContainer may be used to create
+ a page object with or store one in.
+ @return
+ When the master page object is successfully provided then
+ 1 is returned, on no change then a 0 is provided,
+ on a masterpage-error a -1 is provided.
+ */
+ int UpdatePageObject (
+ sal_Int32 nCostThreshold,
+ SdDrawDocument* pDocument);
+
+ enum URLClassification {
+ URLCLASS_USER,
+ URLCLASS_LAYOUT,
+ URLCLASS_PRESENTATION,
+ URLCLASS_OTHER,
+ URLCLASS_UNKNOWN,
+ URLCLASS_UNDETERMINED
+ };
+
+ URLClassification GetURLClassification();
+
+ /** The Token under which the MasterPageContainer gives access to the
+ object.
+ */
+ MasterPageContainer::Token maToken;
+
+ /** A rough specification of the origin of the master page.
+ */
+ MasterPageContainer::Origin meOrigin;
+
+ /** The URL is not empty for master pages loaded from a template
+ document.
+ */
+ OUString msURL;
+
+ /** Taken from the title of the template file.
+ */
+ OUString msPageName;
+
+ /** Taken from the master page object.
+ */
+ OUString msStyleName;
+
+ const bool mbIsPrecious;
+
+ /** The actual master page.
+ */
+ SdPage* mpMasterPage;
+
+ /** A slide that uses the master page.
+ */
+ SdPage* mpSlide;
+
+ /** A small (the default size) preview of the master page. May be
+ empty. When this smaller preview is not empty then the larger one
+ is not empty, too.
+ */
+ Image maSmallPreview;
+
+ /** A large preview of the master page. May be empty. When this larger
+ preview is not empty then the smaller one is not empty, too.
+ */
+ Image maLargePreview;
+
+ /** The preview provider. May be empty. May be replaced during the
+ lifetime of a MasterPageDescriptor object.
+ */
+ std::shared_ptr<PreviewProvider> mpPreviewProvider;
+
+ /** The master page provider. May be empty. May be replaced during
+ the lifetime of a MasterPageDescriptor object.
+ */
+ std::shared_ptr<PageObjectProvider> mpPageObjectProvider;
+
+ /** This index represents the order in which templates are provided via
+ the TemplateScanner. It defines the order in which the entries in
+ the AllMasterPagesSelector are displayed. The default value is -1.
+ */
+ sal_Int32 mnTemplateIndex;
+
+ URLClassification meURLClassification;
+
+ sal_Int32 mnUseCount;
+
+ class URLComparator { public:
+ OUString msURL;
+ explicit URLComparator (const OUString& sURL);
+ bool operator() (const SharedMasterPageDescriptor& rDescriptor);
+ };
+ class StyleNameComparator { public:
+ OUString msStyleName;
+ explicit StyleNameComparator (const OUString& sStyleName);
+ bool operator() (const SharedMasterPageDescriptor& rDescriptor);
+ };
+ class PageObjectComparator { public:
+ const SdPage* mpMasterPage;
+ explicit PageObjectComparator (const SdPage* pPageObject);
+ bool operator() (const SharedMasterPageDescriptor& rDescriptor);
+ };
+ class AllComparator { public:
+ explicit AllComparator(const SharedMasterPageDescriptor& rDescriptor);
+ bool operator() (const SharedMasterPageDescriptor& rDescriptor);
+ private:
+ SharedMasterPageDescriptor mpDescriptor;
+ };
+
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/MasterPageObserver.cxx b/sd/source/ui/sidebar/MasterPageObserver.cxx
new file mode 100644
index 000000000..017a0bcdf
--- /dev/null
+++ b/sd/source/ui/sidebar/MasterPageObserver.cxx
@@ -0,0 +1,317 @@
+/* -*- 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 <MasterPageObserver.hxx>
+
+#include <algorithm>
+#include <iterator>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <set>
+#include <unordered_map>
+#include <memory>
+#include <vector>
+#include <svl/lstner.hxx>
+#include <osl/doublecheckedlocking.h>
+#include <osl/getglobalmutex.hxx>
+#include <tools/debug.hxx>
+
+namespace sd {
+
+class MasterPageObserver::Implementation
+ : public SfxListener
+{
+public:
+ /** The single instance of this class. It is created on demand when
+ Instance() is called for the first time.
+ */
+ static MasterPageObserver* mpInstance;
+
+ /** The master page observer will listen to events of this document and
+ detect changes of the use of master pages.
+ */
+ void RegisterDocument (SdDrawDocument& rDocument);
+
+ /** The master page observer will stop to listen to events of this
+ document.
+ */
+ void UnregisterDocument (SdDrawDocument& rDocument);
+
+ /** Add a listener that is informed of master pages that are newly
+ assigned to slides or become unassigned.
+ @param rEventListener
+ The event listener to call for future events. Call
+ RemoveEventListener() before the listener is destroyed.
+ */
+ void AddEventListener (const Link<MasterPageObserverEvent&,void>& rEventListener);
+
+ /** Remove the given listener from the list of listeners.
+ @param rEventListener
+ After this method returns the given listener is not called back
+ from this object. Passing a listener that has not
+ been registered before is safe and is silently ignored.
+ */
+ void RemoveEventListener (const Link<MasterPageObserverEvent&,void>& rEventListener);
+
+private:
+ ::std::vector<Link<MasterPageObserverEvent&,void>> maListeners;
+
+ struct DrawDocHash {
+ size_t operator()(SdDrawDocument* argument) const
+ { return reinterpret_cast<sal_uIntPtr>(argument); }
+ };
+ typedef std::unordered_map<SdDrawDocument*,
+ MasterPageObserver::MasterPageNameSet,
+ DrawDocHash>
+ MasterPageContainer;
+ MasterPageContainer maUsedMasterPages;
+
+ virtual void Notify(
+ SfxBroadcaster& rBroadcaster,
+ const SfxHint& rHint) override;
+
+ void AnalyzeUsedMasterPages (SdDrawDocument& rDocument);
+
+ void SendEvent (MasterPageObserverEvent& rEvent);
+};
+
+MasterPageObserver* MasterPageObserver::Implementation::mpInstance = nullptr;
+
+//===== MasterPageObserver ====================================================
+
+MasterPageObserver& MasterPageObserver::Instance()
+{
+ if (Implementation::mpInstance == nullptr)
+ {
+ ::osl::GetGlobalMutex aMutexFunctor;
+ ::osl::MutexGuard aGuard (aMutexFunctor());
+ if (Implementation::mpInstance == nullptr)
+ {
+ MasterPageObserver* pInstance = new MasterPageObserver ();
+ SdGlobalResourceContainer::Instance().AddResource (
+ ::std::unique_ptr<SdGlobalResource>(pInstance));
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ Implementation::mpInstance = pInstance;
+ }
+ }
+ else
+ {
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ }
+
+ DBG_ASSERT(Implementation::mpInstance!=nullptr,
+ "MasterPageObserver::Instance(): instance is NULL");
+ return *Implementation::mpInstance;
+}
+
+void MasterPageObserver::RegisterDocument (SdDrawDocument& rDocument)
+{
+ mpImpl->RegisterDocument (rDocument);
+}
+
+void MasterPageObserver::UnregisterDocument (SdDrawDocument& rDocument)
+{
+ mpImpl->UnregisterDocument (rDocument);
+}
+
+void MasterPageObserver::AddEventListener (const Link<MasterPageObserverEvent&,void>& rEventListener)
+{
+
+ mpImpl->AddEventListener (rEventListener);
+}
+
+void MasterPageObserver::RemoveEventListener (const Link<MasterPageObserverEvent&,void>& rEventListener)
+{
+ mpImpl->RemoveEventListener (rEventListener);
+}
+
+MasterPageObserver::MasterPageObserver()
+ : mpImpl (new Implementation)
+{}
+
+MasterPageObserver::~MasterPageObserver()
+{}
+
+//===== MasterPageObserver::Implementation ====================================
+
+void MasterPageObserver::Implementation::RegisterDocument (
+ SdDrawDocument& rDocument)
+{
+ // Gather the names of all the master pages in the given document.
+ MasterPageContainer::mapped_type aMasterPageSet;
+ sal_uInt16 nMasterPageCount = rDocument.GetMasterSdPageCount(PageKind::Standard);
+ for (sal_uInt16 nIndex=0; nIndex<nMasterPageCount; nIndex++)
+ {
+ SdPage* pMasterPage = rDocument.GetMasterSdPage (nIndex, PageKind::Standard);
+ if (pMasterPage != nullptr)
+ aMasterPageSet.insert (pMasterPage->GetName());
+ }
+
+ bool bAlreadyExists = maUsedMasterPages.find(&rDocument) != maUsedMasterPages.end();
+ maUsedMasterPages[&rDocument] = aMasterPageSet;
+
+ if (!bAlreadyExists)
+ StartListening (rDocument);
+}
+
+void MasterPageObserver::Implementation::UnregisterDocument (
+ SdDrawDocument& rDocument)
+{
+ EndListening (rDocument);
+
+ MasterPageContainer::iterator aMasterPageDescriptor(maUsedMasterPages.find(&rDocument));
+ if(aMasterPageDescriptor != maUsedMasterPages.end())
+ maUsedMasterPages.erase(aMasterPageDescriptor);
+}
+
+void MasterPageObserver::Implementation::AddEventListener (
+ const Link<MasterPageObserverEvent&,void>& rEventListener)
+{
+ if (::std::find (
+ maListeners.begin(),
+ maListeners.end(),
+ rEventListener) != maListeners.end())
+ return;
+
+ maListeners.push_back (rEventListener);
+
+ // Tell the new listener about all the master pages that are
+ // currently in use.
+ for (const auto& rDocument : maUsedMasterPages)
+ {
+ ::std::set<OUString>::reverse_iterator aNameIterator;
+ for (aNameIterator=rDocument.second.rbegin();
+ aNameIterator!=rDocument.second.rend();
+ ++aNameIterator)
+ {
+ MasterPageObserverEvent aEvent (
+ MasterPageObserverEvent::ET_MASTER_PAGE_EXISTS,
+ *aNameIterator);
+ SendEvent (aEvent);
+ }
+ }
+}
+
+void MasterPageObserver::Implementation::RemoveEventListener (
+ const Link<MasterPageObserverEvent&,void>& rEventListener)
+{
+ maListeners.erase (
+ ::std::find (
+ maListeners.begin(),
+ maListeners.end(),
+ rEventListener));
+}
+
+void MasterPageObserver::Implementation::Notify(
+ SfxBroadcaster& rBroadcaster,
+ const SfxHint& rHint)
+{
+ if (rHint.GetId() != SfxHintId::ThisIsAnSdrHint)
+ return;
+ const SdrHint* pSdrHint = static_cast<const SdrHint*>(&rHint);
+
+ switch (pSdrHint->GetKind())
+ {
+ case SdrHintKind::PageOrderChange:
+ // Process the modified set of pages only when the number of
+ // standard and notes master pages are equal. This test
+ // filters out events that are sent in between the insertion
+ // of a new standard master page and a new notes master
+ // page.
+ if (auto pDrawDocument = dynamic_cast<SdDrawDocument *>( &rBroadcaster ))
+ {
+ if (pDrawDocument->GetMasterSdPageCount(PageKind::Standard)
+ == pDrawDocument->GetMasterSdPageCount(PageKind::Notes))
+ {
+ AnalyzeUsedMasterPages (*pDrawDocument);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void MasterPageObserver::Implementation::AnalyzeUsedMasterPages (
+ SdDrawDocument& rDocument)
+{
+ // Create a set of names of the master pages used by the given document.
+ sal_uInt16 nMasterPageCount = rDocument.GetMasterSdPageCount(PageKind::Standard);
+ ::std::set<OUString> aCurrentMasterPages;
+ for (sal_uInt16 nIndex=0; nIndex<nMasterPageCount; nIndex++)
+ {
+ SdPage* pMasterPage = rDocument.GetMasterSdPage (nIndex, PageKind::Standard);
+ if (pMasterPage != nullptr)
+ aCurrentMasterPages.insert (pMasterPage->GetName());
+ }
+
+ std::vector<OUString> aNewMasterPages;
+ std::vector<OUString> aRemovedMasterPages;
+ MasterPageContainer::iterator aOldMasterPagesDescriptor (
+ maUsedMasterPages.find(&rDocument));
+ if (aOldMasterPagesDescriptor == maUsedMasterPages.end())
+ return;
+
+ // Send events about the newly used master pages.
+ ::std::set_difference (
+ aCurrentMasterPages.begin(),
+ aCurrentMasterPages.end(),
+ aOldMasterPagesDescriptor->second.begin(),
+ aOldMasterPagesDescriptor->second.end(),
+ std::back_inserter(aNewMasterPages));
+ for (const auto& aNewMasterPage : aNewMasterPages)
+ {
+ MasterPageObserverEvent aEvent (
+ MasterPageObserverEvent::ET_MASTER_PAGE_ADDED,
+ aNewMasterPage);
+ SendEvent (aEvent);
+ }
+
+ // Send events about master pages that are not used any longer.
+ ::std::set_difference (
+ aOldMasterPagesDescriptor->second.begin(),
+ aOldMasterPagesDescriptor->second.end(),
+ aCurrentMasterPages.begin(),
+ aCurrentMasterPages.end(),
+ std::back_inserter(aRemovedMasterPages));
+ for (const auto& aRemovedMasterPage : aRemovedMasterPages)
+ {
+ MasterPageObserverEvent aEvent (
+ MasterPageObserverEvent::ET_MASTER_PAGE_REMOVED,
+ aRemovedMasterPage);
+ SendEvent (aEvent);
+ }
+
+ // Store the new list of master pages.
+ aOldMasterPagesDescriptor->second = aCurrentMasterPages;
+}
+
+void MasterPageObserver::Implementation::SendEvent (
+ MasterPageObserverEvent& rEvent)
+{
+ for (const auto& aLink : maListeners)
+ {
+ aLink.Call(rEvent);
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/MasterPagesSelector.cxx b/sd/source/ui/sidebar/MasterPagesSelector.cxx
new file mode 100644
index 000000000..979726910
--- /dev/null
+++ b/sd/source/ui/sidebar/MasterPagesSelector.cxx
@@ -0,0 +1,620 @@
+/* -*- 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 <utility>
+
+#include "MasterPagesSelector.hxx"
+
+#include "MasterPageContainer.hxx"
+#include "DocumentHelper.hxx"
+#include <pres.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <app.hrc>
+
+#include <DrawController.hxx>
+#include <SlideSorterViewShell.hxx>
+#include "PreviewValueSet.hxx"
+#include <ViewShellBase.hxx>
+#include <o3tl/safeint.hxx>
+#include <vcl/image.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/sidebar/Theme.hxx>
+#include <memory>
+
+using namespace ::com::sun::star::text;
+
+namespace sd::sidebar {
+
+ /** menu entry that is executed as default action when the left mouse button is
+ clicked over a master page.
+ */
+constexpr OStringLiteral gsDefaultClickAction = "applyselect";
+
+MasterPagesSelector::MasterPagesSelector (
+ weld::Widget* pParent,
+ SdDrawDocument& rDocument,
+ ViewShellBase& rBase,
+ const std::shared_ptr<MasterPageContainer>& rpContainer,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar,
+ const OUString& rUIFileName,
+ const OString& rValueSetName)
+ : PanelLayout( pParent, "MasterPagePanel", rUIFileName ),
+ mpContainer(rpContainer),
+ mxPreviewValueSet(new PreviewValueSet),
+ mxPreviewValueSetWin(new weld::CustomWeld(*m_xBuilder, rValueSetName, *mxPreviewValueSet)),
+ mrDocument(rDocument),
+ mrBase(rBase),
+ mxSidebar(rxSidebar)
+{
+ mxPreviewValueSet->SetSelectHdl (
+ LINK(this, MasterPagesSelector, ClickHandler));
+ mxPreviewValueSet->SetContextMenuHandler (
+ LINK(this, MasterPagesSelector, ContextMenuHandler));
+ mxPreviewValueSet->SetStyle(mxPreviewValueSet->GetStyle() | WB_NO_DIRECTSELECT);
+
+ if (mxPreviewValueSet->GetDrawingArea()->get_ref_device().GetDPIScaleFactor() > 1)
+ mpContainer->SetPreviewSize(MasterPageContainer::LARGE);
+
+ mxPreviewValueSet->SetPreviewSize(mpContainer->GetPreviewSizePixel());
+ mxPreviewValueSet->Show();
+
+ mxPreviewValueSet->SetColor(sfx2::sidebar::Theme::GetColor(sfx2::sidebar::Theme::Color_PanelBackground));
+
+ Link<MasterPageContainerChangeEvent&,void> aChangeListener (LINK(this,MasterPagesSelector,ContainerChangeListener));
+ mpContainer->AddChangeListener(aChangeListener);
+}
+
+MasterPagesSelector::~MasterPagesSelector()
+{
+ Clear();
+ UpdateLocks(ItemList());
+
+ Link<MasterPageContainerChangeEvent&,void> aChangeListener (LINK(this,MasterPagesSelector,ContainerChangeListener));
+ mpContainer->RemoveChangeListener(aChangeListener);
+ mpContainer.reset();
+ mxPreviewValueSetWin.reset();
+ mxPreviewValueSet.reset();
+}
+
+void MasterPagesSelector::LateInit()
+{
+}
+
+sal_Int32 MasterPagesSelector::GetPreferredHeight (sal_Int32 nWidth)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ return mxPreviewValueSet->GetPreferredHeight (nWidth);
+}
+
+void MasterPagesSelector::UpdateLocks (const ItemList& rItemList)
+{
+ ItemList aNewLockList;
+
+ // In here we first lock the master pages in the given list and then
+ // release the locks acquired in a previous call to this method. When
+ // this were done the other way round the lock count of some master
+ // pages might drop temporarily to 0 and would lead to unnecessary
+ // deletion and re-creation of MasterPageDescriptor objects.
+
+ // Lock the master pages in the given list.
+ for (const auto& rItem : rItemList)
+ {
+ mpContainer->AcquireToken(rItem);
+ aNewLockList.push_back(rItem);
+ }
+
+ // Release the previously locked master pages.
+ for (const auto& rPage : maLockedMasterPages)
+ mpContainer->ReleaseToken(rPage);
+
+ maLockedMasterPages.swap(aNewLockList);
+}
+
+void MasterPagesSelector::Fill()
+{
+ ::std::unique_ptr<ItemList> pItemList (new ItemList);
+
+ Fill(*pItemList);
+
+ UpdateLocks(*pItemList);
+ UpdateItemList(std::move(pItemList));
+}
+
+OUString MasterPagesSelector::GetContextMenuUIFile() const
+{
+ return "modules/simpress/ui/mastermenu.ui";
+}
+
+IMPL_LINK_NOARG(MasterPagesSelector, ClickHandler, ValueSet*, void)
+{
+ // We use the framework to assign the clicked-on master page because we
+ // so use the same mechanism as the context menu does (where we do not
+ // have the option to call the assignment method directly.)
+ ExecuteCommand(gsDefaultClickAction);
+}
+
+IMPL_LINK(MasterPagesSelector, ContextMenuHandler, const Point*, pPos, void)
+{
+ if (pPos)
+ {
+ // Here we only prepare the display of the context menu: on right
+ // click the item under the mouse is selected.
+ mxPreviewValueSet->GrabFocus();
+ mxPreviewValueSet->ReleaseMouse();
+
+ sal_uInt16 nIndex = mxPreviewValueSet->GetItemId(*pPos);
+ if (nIndex > 0)
+ mxPreviewValueSet->SelectItem(nIndex);
+ }
+
+ // Now do the actual display of the context menu
+ ShowContextMenu(pPos);
+}
+
+void MasterPagesSelector::ShowContextMenu(const Point* pPos)
+{
+ // Use the currently selected item and show the popup menu in its
+ // center.
+ const sal_uInt16 nIndex = mxPreviewValueSet->GetSelectedItemId();
+ if (nIndex <= 0)
+ return;
+
+ // The position of the upper left corner of the context menu is
+ // taken either from the mouse position (when the command was sent
+ // as reaction to a right click) or in the center of the selected
+ // item (when the command was sent as reaction to Shift+F10.)
+ Point aPosition;
+ if (!pPos)
+ {
+ ::tools::Rectangle aBBox (mxPreviewValueSet->GetItemRect(nIndex));
+ aPosition = aBBox.Center();
+ }
+ else
+ aPosition = *pPos;
+
+ // Setup the menu.
+ weld::Widget* pParent = mxPreviewValueSet->GetDrawingArea();
+ std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(pParent, GetContextMenuUIFile()));
+ std::unique_ptr<weld::Menu> xMenu(xBuilder->weld_menu("menu"));
+ ProcessPopupMenu(*xMenu);
+ ::tools::Rectangle aRect(aPosition, Size(1,1));
+ // Show the menu.
+ ExecuteCommand(xMenu->popup_at_rect(pParent, aRect));
+}
+
+void MasterPagesSelector::ProcessPopupMenu(weld::Menu& rMenu)
+{
+ // Disable some entries.
+ if (mpContainer->GetPreviewSize() == MasterPageContainer::SMALL)
+ rMenu.set_sensitive("small", false);
+ else
+ rMenu.set_sensitive("large", false);
+}
+
+void MasterPagesSelector::ExecuteCommand(const OString &rIdent)
+{
+ if (rIdent == "applyall")
+ {
+ mrBase.SetBusyState (true);
+ AssignMasterPageToAllSlides (GetSelectedMasterPage());
+ mrBase.SetBusyState (false);
+ }
+ else if (rIdent == "applyselect")
+ {
+ mrBase.SetBusyState (true);
+ AssignMasterPageToSelectedSlides (GetSelectedMasterPage());
+ mrBase.SetBusyState (false);
+ }
+ else if (rIdent == "large")
+ {
+ mrBase.SetBusyState (true);
+ mpContainer->SetPreviewSize(MasterPageContainer::LARGE);
+ mrBase.SetBusyState (false);
+ if (mxSidebar.is())
+ mxSidebar->requestLayout();
+ }
+ else if (rIdent == "small")
+ {
+ mrBase.SetBusyState (true);
+ mpContainer->SetPreviewSize(MasterPageContainer::SMALL);
+ mrBase.SetBusyState (false);
+ if (mxSidebar.is())
+ mxSidebar->requestLayout();
+ }
+ else if (rIdent == "edit")
+ {
+ using namespace ::com::sun::star;
+ uno::Reference<drawing::XDrawPage> xSelectedMaster;
+ SdPage* pMasterPage = GetSelectedMasterPage();
+ assert(pMasterPage); //rhbz#902884
+ if (pMasterPage)
+ xSelectedMaster.set(pMasterPage->getUnoPage(), uno::UNO_QUERY);
+ SfxViewFrame* pViewFrame = mrBase.GetViewFrame();
+ if (pViewFrame != nullptr && xSelectedMaster.is())
+ {
+ SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
+ if (pDispatcher != nullptr)
+ {
+ sal_uInt16 nIndex = mxPreviewValueSet->GetSelectedItemId();
+ pDispatcher->Execute(SID_MASTERPAGE, SfxCallMode::SYNCHRON);
+ mxPreviewValueSet->SelectItem (nIndex);
+ mrBase.GetDrawController().setCurrentPage(xSelectedMaster);
+ }
+ }
+ }
+}
+
+IMPL_LINK(MasterPagesSelector, ContainerChangeListener, MasterPageContainerChangeEvent&, rEvent, void)
+{
+ NotifyContainerChangeEvent(rEvent);
+}
+
+SdPage* MasterPagesSelector::GetSelectedMasterPage()
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ SdPage* pMasterPage = nullptr;
+ sal_uInt16 nIndex = mxPreviewValueSet->GetSelectedItemId();
+ UserData* pData = GetUserData(nIndex);
+ if (pData != nullptr)
+ {
+ pMasterPage = mpContainer->GetPageObjectForToken(pData->second, true);
+ }
+ return pMasterPage;
+}
+
+/** Assemble a list of all slides of the document and pass it to
+ AssignMasterPageToPageList().
+*/
+void MasterPagesSelector::AssignMasterPageToAllSlides (SdPage* pMasterPage)
+{
+ if (pMasterPage == nullptr)
+ return;
+
+ sal_uInt16 nPageCount = mrDocument.GetSdPageCount(PageKind::Standard);
+ if (nPageCount == 0)
+ return;
+
+ // Get a list of all pages. As a little optimization we only
+ // include pages that do not already have the given master page
+ // assigned.
+ OUString sFullLayoutName(pMasterPage->GetLayoutName());
+ ::sd::slidesorter::SharedPageSelection pPageList =
+ std::make_shared<::sd::slidesorter::SlideSorterViewShell::PageSelection>();
+ for (sal_uInt16 nPageIndex=0; nPageIndex<nPageCount; nPageIndex++)
+ {
+ SdPage* pPage = mrDocument.GetSdPage (nPageIndex, PageKind::Standard);
+ if (pPage != nullptr && pPage->GetLayoutName() != sFullLayoutName)
+ {
+ pPageList->push_back (pPage);
+ }
+ }
+
+ AssignMasterPageToPageList(pMasterPage, pPageList);
+}
+
+/** Assemble a list of the currently selected slides (selected in a visible
+ slide sorter) and pass it to AssignMasterPageToPageList().
+*/
+void MasterPagesSelector::AssignMasterPageToSelectedSlides (
+ SdPage* pMasterPage)
+{
+ using namespace ::sd::slidesorter;
+ using namespace ::sd::slidesorter::controller;
+
+ if (pMasterPage == nullptr)
+ return;
+
+ // Find a visible slide sorter.
+ SlideSorterViewShell* pSlideSorter = SlideSorterViewShell::GetSlideSorter(mrBase);
+ if (pSlideSorter == nullptr)
+ return;
+
+ // Get a list of selected pages.
+ SharedPageSelection pPageSelection = pSlideSorter->GetPageSelection();
+ if (pPageSelection->empty())
+ return;
+
+ AssignMasterPageToPageList(pMasterPage, pPageSelection);
+
+ // Restore the previous selection.
+ pSlideSorter->SetPageSelection(pPageSelection);
+}
+
+void MasterPagesSelector::AssignMasterPageToPageList (
+ SdPage* pMasterPage,
+ const std::shared_ptr<std::vector<SdPage*>>& rPageList)
+{
+ DocumentHelper::AssignMasterPageToPageList(mrDocument, pMasterPage, rPageList);
+}
+
+void MasterPagesSelector::NotifyContainerChangeEvent (const MasterPageContainerChangeEvent& rEvent)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ switch (rEvent.meEventType)
+ {
+ case MasterPageContainerChangeEvent::EventType::SIZE_CHANGED:
+ mxPreviewValueSet->SetPreviewSize(mpContainer->GetPreviewSizePixel());
+ UpdateAllPreviews();
+ break;
+
+ case MasterPageContainerChangeEvent::EventType::PREVIEW_CHANGED:
+ {
+ int nIndex (GetIndexForToken(rEvent.maChildToken));
+ if (nIndex >= 0)
+ {
+ mxPreviewValueSet->SetItemImage (
+ static_cast<sal_uInt16>(nIndex),
+ mpContainer->GetPreviewForToken(rEvent.maChildToken));
+ mxPreviewValueSet->Invalidate(mxPreviewValueSet->GetItemRect(static_cast<sal_uInt16>(nIndex)));
+ }
+ }
+ break;
+
+ case MasterPageContainerChangeEvent::EventType::DATA_CHANGED:
+ {
+ InvalidateItem(rEvent.maChildToken);
+ Fill();
+ }
+ break;
+
+ case MasterPageContainerChangeEvent::EventType::CHILD_REMOVED:
+ {
+ int nIndex (GetIndexForToken(rEvent.maChildToken));
+ SetItem(nIndex, MasterPageContainer::NIL_TOKEN);
+ break;
+ }
+
+ default:
+ break;
+ }
+}
+
+MasterPagesSelector::UserData* MasterPagesSelector::GetUserData (int nIndex) const
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ if (nIndex>0 && o3tl::make_unsigned(nIndex)<=mxPreviewValueSet->GetItemCount())
+ return static_cast<UserData*>(mxPreviewValueSet->GetItemData(static_cast<sal_uInt16>(nIndex)));
+ else
+ return nullptr;
+}
+
+void MasterPagesSelector::SetUserData (int nIndex, std::unique_ptr<UserData> pData)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ delete GetUserData(nIndex);
+ mxPreviewValueSet->SetItemData(static_cast<sal_uInt16>(nIndex), pData.release());
+}
+
+void MasterPagesSelector::SetItem (
+ sal_uInt16 nIndex,
+ MasterPageContainer::Token aToken)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ RemoveTokenToIndexEntry(nIndex,aToken);
+
+ if (nIndex <= 0)
+ return;
+
+ if (aToken != MasterPageContainer::NIL_TOKEN)
+ {
+ Image aPreview (mpContainer->GetPreviewForToken(aToken));
+ MasterPageContainer::PreviewState eState (mpContainer->GetPreviewState(aToken));
+
+ if (aPreview.GetSizePixel().Width()>0)
+ {
+ if (mxPreviewValueSet->GetItemPos(nIndex) != VALUESET_ITEM_NOTFOUND)
+ {
+ mxPreviewValueSet->SetItemImage(nIndex,aPreview);
+ mxPreviewValueSet->SetItemText(nIndex, mpContainer->GetPageNameForToken(aToken));
+ }
+ else
+ {
+ mxPreviewValueSet->InsertItem (
+ nIndex,
+ aPreview,
+ mpContainer->GetPageNameForToken(aToken),
+ nIndex);
+ }
+ SetUserData(nIndex, std::make_unique<UserData>(nIndex,aToken));
+
+ AddTokenToIndexEntry(nIndex,aToken);
+ }
+
+ if (eState == MasterPageContainer::PS_CREATABLE)
+ mpContainer->RequestPreview(aToken);
+ }
+ else
+ {
+ mxPreviewValueSet->RemoveItem(nIndex);
+ }
+
+}
+
+void MasterPagesSelector::AddTokenToIndexEntry (
+ sal_uInt16 nIndex,
+ MasterPageContainer::Token aToken)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ maTokenToValueSetIndex[aToken] = nIndex;
+}
+
+void MasterPagesSelector::RemoveTokenToIndexEntry (
+ sal_uInt16 nIndex,
+ MasterPageContainer::Token aNewToken)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ UserData* pData = GetUserData(nIndex);
+ if (pData != nullptr)
+ {
+ // Get the token that the index pointed to previously.
+ MasterPageContainer::Token aOldToken (pData->second);
+
+ if (aNewToken != aOldToken
+ && nIndex == GetIndexForToken(aOldToken))
+ {
+ maTokenToValueSetIndex[aOldToken] = 0;
+ }
+ }
+}
+
+void MasterPagesSelector::InvalidatePreview (const SdPage* pPage)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ for (size_t nIndex=1; nIndex<=mxPreviewValueSet->GetItemCount(); nIndex++)
+ {
+ UserData* pData = GetUserData(nIndex);
+ if (pData != nullptr)
+ {
+ MasterPageContainer::Token aToken (pData->second);
+ if (pPage == mpContainer->GetPageObjectForToken(aToken,false))
+ {
+ mpContainer->InvalidatePreview(aToken);
+ mpContainer->RequestPreview(aToken);
+ break;
+ }
+ }
+ }
+}
+
+void MasterPagesSelector::UpdateAllPreviews()
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ for (size_t nIndex=1; nIndex<=mxPreviewValueSet->GetItemCount(); nIndex++)
+ {
+ UserData* pData = GetUserData(nIndex);
+ if (pData != nullptr)
+ {
+ MasterPageContainer::Token aToken (pData->second);
+ mxPreviewValueSet->SetItemImage(
+ nIndex,
+ mpContainer->GetPreviewForToken(aToken));
+ if (mpContainer->GetPreviewState(aToken) == MasterPageContainer::PS_CREATABLE)
+ mpContainer->RequestPreview(aToken);
+ }
+ }
+ mxPreviewValueSet->Rearrange();
+}
+
+void MasterPagesSelector::ClearPageSet()
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ for (size_t nIndex=1; nIndex<=mxPreviewValueSet->GetItemCount(); nIndex++)
+ {
+ UserData* pData = GetUserData(nIndex);
+ delete pData;
+ }
+ mxPreviewValueSet->Clear();
+}
+
+void MasterPagesSelector::SetHelpId( const OString& aId )
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ mxPreviewValueSet->SetHelpId( aId );
+}
+
+sal_Int32 MasterPagesSelector::GetIndexForToken (MasterPageContainer::Token aToken) const
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ TokenToValueSetIndex::const_iterator iIndex (maTokenToValueSetIndex.find(aToken));
+ if (iIndex != maTokenToValueSetIndex.end())
+ return iIndex->second;
+ else
+ return -1;
+}
+
+void MasterPagesSelector::Clear()
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ ClearPageSet();
+}
+
+void MasterPagesSelector::InvalidateItem (MasterPageContainer::Token aToken)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ auto iItem = std::find(maCurrentItemList.begin(), maCurrentItemList.end(), aToken);
+ if (iItem != maCurrentItemList.end())
+ *iItem = MasterPageContainer::NIL_TOKEN;
+}
+
+void MasterPagesSelector::UpdateItemList (::std::unique_ptr<ItemList> && pNewItemList)
+{
+ const ::osl::MutexGuard aGuard (maMutex);
+
+ ItemList::const_iterator iNewItem (pNewItemList->begin());
+ ItemList::const_iterator iCurrentItem (maCurrentItemList.begin());
+ ItemList::const_iterator iNewEnd (pNewItemList->end());
+ ItemList::const_iterator iCurrentEnd (maCurrentItemList.end());
+ sal_uInt16 nIndex (1);
+
+ // Update existing items.
+ for ( ; iNewItem!=iNewEnd && iCurrentItem!=iCurrentEnd; ++iNewItem, ++iCurrentItem,++nIndex)
+ {
+ if (*iNewItem != *iCurrentItem)
+ {
+ SetItem(nIndex,*iNewItem);
+ }
+ }
+
+ // Append new items.
+ for ( ; iNewItem!=iNewEnd; ++iNewItem,++nIndex)
+ {
+ SetItem(nIndex,*iNewItem);
+ }
+
+ // Remove trailing items.
+ for ( ; iCurrentItem!=iCurrentEnd; ++iCurrentItem,++nIndex)
+ {
+ SetItem(nIndex,MasterPageContainer::NIL_TOKEN);
+ }
+
+ maCurrentItemList.swap(*pNewItemList);
+
+ mxPreviewValueSet->Rearrange();
+ if (mxSidebar.is())
+ mxSidebar->requestLayout();
+}
+
+css::ui::LayoutSize MasterPagesSelector::GetHeightForWidth (const sal_Int32 nWidth)
+{
+ const sal_Int32 nHeight (GetPreferredHeight(nWidth));
+ return css::ui::LayoutSize(nHeight,nHeight,nHeight);
+}
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/MasterPagesSelector.hxx b/sd/source/ui/sidebar/MasterPagesSelector.hxx
new file mode 100644
index 000000000..1b6932789
--- /dev/null
+++ b/sd/source/ui/sidebar/MasterPagesSelector.hxx
@@ -0,0 +1,180 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <map>
+#include <memory>
+#include "MasterPageContainer.hxx"
+#include "PreviewValueSet.hxx"
+#include <sfx2/sidebar/ILayoutableWindow.hxx>
+#include <sfx2/sidebar/PanelLayout.hxx>
+
+#include <osl/mutex.hxx>
+
+namespace com::sun::star::ui { class XSidebar; }
+class MouseEvent;
+class SdDrawDocument;
+class SdPage;
+
+namespace sd {
+class ViewShellBase;
+}
+
+namespace sd::sidebar {
+
+/** Base class of a menu that lets the user select from a list of
+ templates or designs that are loaded from files.
+*/
+class MasterPagesSelector : public PanelLayout
+ , public sfx2::sidebar::ILayoutableWindow
+{
+public:
+ MasterPagesSelector (
+ weld::Widget* pParent,
+ SdDrawDocument& rDocument,
+ ViewShellBase& rBase,
+ const std::shared_ptr<MasterPageContainer>& rpContainer,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar,
+ const OUString& rUIFileName,
+ const OString& rValueSetName);
+ virtual ~MasterPagesSelector() override;
+
+ virtual void LateInit();
+
+ sal_Int32 GetPreferredHeight (sal_Int32 nWidth);
+
+ /** Make the selector empty. This method clear the value set from any
+ entries. Override this method to add functionality, especially to
+ destroy objects set as data items at the value set.
+ */
+ void ClearPageSet();
+
+ void SetHelpId( const OString& aId );
+
+ /** Mark the preview that belongs to the given index as not up-to-date
+ anymore with respect to page content or preview size.
+ The implementation of this method will either sunchronously or
+ asynchronously call UpdatePreview().
+ @param nIndex
+ Index into the value set control that is used for displaying the
+ previews.
+ */
+ void InvalidatePreview (const SdPage* pPage);
+
+ void UpdateAllPreviews();
+
+ void ShowContextMenu(const Point* pPos);
+
+ // ILayoutableWindow
+ virtual css::ui::LayoutSize GetHeightForWidth (const sal_Int32 nWidth) override;
+
+protected:
+ mutable ::osl::Mutex maMutex;
+ std::shared_ptr<MasterPageContainer> mpContainer;
+
+ std::unique_ptr<PreviewValueSet> mxPreviewValueSet;
+ std::unique_ptr<weld::CustomWeld> mxPreviewValueSetWin;
+
+ SdDrawDocument& mrDocument;
+ ViewShellBase& mrBase;
+
+ SdPage* GetSelectedMasterPage();
+
+ /** Assign the given master page to all slides of the document.
+ @param pMasterPage
+ The master page to assign to all slides.
+ */
+ void AssignMasterPageToAllSlides (SdPage* pMasterPage);
+
+ /** Assign the given master page to all slides that are selected in a
+ slide sorter that is displayed in the lef or center pane. When both
+ panes display a slide sorter then the one in the center pane is
+ used.
+ */
+ void AssignMasterPageToSelectedSlides (SdPage* pMasterPage);
+
+ virtual void AssignMasterPageToPageList (
+ SdPage* pMasterPage,
+ const std::shared_ptr<std::vector<SdPage*>>& rPageList);
+
+ virtual void NotifyContainerChangeEvent (const MasterPageContainerChangeEvent& rEvent);
+
+ typedef ::std::pair<int, MasterPageContainer::Token> UserData;
+ UserData* GetUserData (int nIndex) const;
+ void SetUserData (int nIndex, std::unique_ptr<UserData> pData);
+
+ sal_Int32 GetIndexForToken (MasterPageContainer::Token aToken) const;
+ typedef ::std::vector<MasterPageContainer::Token> ItemList;
+ void UpdateItemList (::std::unique_ptr<ItemList> && pList);
+ void Clear();
+ /** Invalidate the specified item so that on the next Fill() this item
+ is updated.
+ */
+ void InvalidateItem (MasterPageContainer::Token aToken);
+
+ // For every item in the ValueSet we store its associated token. This
+ // allows a faster access and easier change tracking.
+ ItemList maCurrentItemList;
+ typedef ::std::map<MasterPageContainer::Token,sal_Int32> TokenToValueSetIndex;
+ TokenToValueSetIndex maTokenToValueSetIndex;
+
+ ItemList maLockedMasterPages;
+ /** Lock master pages in the given list and release locks that were
+ previously acquired.
+ */
+ void UpdateLocks (const ItemList& rItemList);
+
+ void Fill();
+ virtual void Fill (ItemList& rItemList) = 0;
+
+ /** Give derived classes the opportunity to provide their own context
+ menu. If they do then they probably have to provide their own
+ Execute() and GetState() methods as well.
+ */
+ virtual OUString GetContextMenuUIFile() const;
+
+ virtual void ProcessPopupMenu(weld::Menu& rMenu);
+ virtual void ExecuteCommand(const OString& rIdent);
+
+private:
+ css::uno::Reference<css::ui::XSidebar> mxSidebar;
+
+ /** The offset between ValueSet index and MasterPageContainer::Token
+ last seen. This value is used heuristically to speed up the lookup
+ of an index for a token.
+ */
+ DECL_LINK(ClickHandler, ValueSet*, void);
+ DECL_LINK(ContextMenuHandler, const Point*, void);
+ DECL_LINK(ContainerChangeListener, MasterPageContainerChangeEvent&, void);
+
+ void SetItem (
+ sal_uInt16 nIndex,
+ MasterPageContainer::Token aToken);
+ void AddTokenToIndexEntry (
+ sal_uInt16 nIndex,
+ MasterPageContainer::Token aToken);
+ void RemoveTokenToIndexEntry (
+ sal_uInt16 nIndex,
+ MasterPageContainer::Token aToken);
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/NavigatorWrapper.cxx b/sd/source/ui/sidebar/NavigatorWrapper.cxx
new file mode 100644
index 000000000..95d4a66ae
--- /dev/null
+++ b/sd/source/ui/sidebar/NavigatorWrapper.cxx
@@ -0,0 +1,49 @@
+/* -*- 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 "NavigatorWrapper.hxx"
+#include <ViewShellBase.hxx>
+#include <navigatr.hxx>
+
+namespace sd::sidebar {
+
+NavigatorWrapper::NavigatorWrapper (
+ weld::Widget* pParent,
+ sd::ViewShellBase& rViewShellBase,
+ SfxBindings* pBindings)
+ : SdNavigatorWin(pParent, pBindings, nullptr)
+ , mrViewShellBase(rViewShellBase)
+{
+ SetUpdateRequestFunctor(
+ [this] () { return this->UpdateNavigator(); });
+}
+
+css::ui::LayoutSize NavigatorWrapper::GetHeightForWidth (const sal_Int32)
+{
+ return css::ui::LayoutSize(-1,-1,-1);
+}
+
+void NavigatorWrapper::UpdateNavigator()
+{
+ InitTreeLB(mrViewShellBase.GetDocument());
+}
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/NavigatorWrapper.hxx b/sd/source/ui/sidebar/NavigatorWrapper.hxx
new file mode 100644
index 000000000..6632d796f
--- /dev/null
+++ b/sd/source/ui/sidebar/NavigatorWrapper.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/.
+ *
+ * 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 .
+ */
+#pragma once
+
+#include <sfx2/sidebar/ILayoutableWindow.hxx>
+#include <navigatr.hxx>
+
+class SfxBindings;
+namespace sd { class ViewShellBase; }
+
+namespace sd::sidebar {
+
+/** Present the navigator as control that can be displayed inside the
+ sidebar.
+ This wrapper has two main responsibilities:
+ - Watch for document changes and update the navigator when one
+ happens.
+ - Forward size changes from sidebar to navigator.
+*/
+class NavigatorWrapper
+ : public SdNavigatorWin,
+ public sfx2::sidebar::ILayoutableWindow
+{
+public:
+ NavigatorWrapper (
+ weld::Widget* pParent,
+ sd::ViewShellBase& rViewShellBase,
+ SfxBindings* pBindings);
+
+ // From ILayoutableWindow
+ virtual css::ui::LayoutSize GetHeightForWidth (const sal_Int32 nWidth) override;
+
+private:
+ ViewShellBase& mrViewShellBase;
+
+ void UpdateNavigator();
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/PageMarginUtils.hxx b/sd/source/ui/sidebar/PageMarginUtils.hxx
new file mode 100644
index 000000000..9a1f83493
--- /dev/null
+++ b/sd/source/ui/sidebar/PageMarginUtils.hxx
@@ -0,0 +1,159 @@
+/* -*- 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 <cmath>
+#include <tools/long.hxx>
+#define SDPAGE_NO_MARGIN 0
+#define SDPAGE_NARROW_VALUE 635
+#define SDPAGE_MODERATE_LR 955
+#define SDPAGE_NORMAL_VALUE 1000
+#define SDPAGE_WIDE_VALUE1 1270
+#define SDPAGE_WIDE_VALUE2 2540
+#define SDPAGE_WIDE_VALUE3 1590
+#define SDPAGE_UNIT_THRESHOLD 5
+
+namespace sd::sidebar{
+
+bool IsNone( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin,
+ const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin )
+{
+ return( std::abs(nPageLeftMargin - SDPAGE_NO_MARGIN) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageRightMargin - SDPAGE_NO_MARGIN ) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageTopMargin - SDPAGE_NO_MARGIN) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageBottomMargin - SDPAGE_NO_MARGIN) <= SDPAGE_UNIT_THRESHOLD );
+}
+
+void SetNone( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin,
+ ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin )
+{
+ nPageLeftMargin = SDPAGE_NO_MARGIN;
+ nPageRightMargin = SDPAGE_NO_MARGIN;
+ nPageTopMargin = SDPAGE_NO_MARGIN;
+ nPageBottomMargin = SDPAGE_NO_MARGIN;
+}
+
+bool IsNarrow( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin,
+ const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin )
+{
+ return( std::abs(nPageLeftMargin - SDPAGE_NARROW_VALUE) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageRightMargin - SDPAGE_NARROW_VALUE) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageTopMargin - SDPAGE_NARROW_VALUE) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageBottomMargin - SDPAGE_NARROW_VALUE) <= SDPAGE_UNIT_THRESHOLD );
+}
+
+void SetNarrow( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin,
+ ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin )
+{
+ nPageLeftMargin = SDPAGE_NARROW_VALUE;
+ nPageRightMargin = SDPAGE_NARROW_VALUE;
+ nPageTopMargin = SDPAGE_NARROW_VALUE;
+ nPageBottomMargin = SDPAGE_NARROW_VALUE;
+}
+
+bool IsModerate( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin,
+ const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin )
+{
+ return( std::abs(nPageLeftMargin - SDPAGE_MODERATE_LR) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageRightMargin - SDPAGE_MODERATE_LR) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageTopMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageBottomMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD );
+}
+
+void SetModerate( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin,
+ ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin )
+{
+ nPageLeftMargin = SDPAGE_MODERATE_LR;
+ nPageRightMargin = SDPAGE_MODERATE_LR;
+ nPageTopMargin = SDPAGE_WIDE_VALUE1;
+ nPageBottomMargin = SDPAGE_WIDE_VALUE1;
+}
+
+bool IsNormal075( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin,
+ const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin )
+{
+ return( std::abs(nPageLeftMargin - SDPAGE_NORMAL_VALUE) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageRightMargin - SDPAGE_NORMAL_VALUE) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageTopMargin - SDPAGE_NORMAL_VALUE) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageBottomMargin - SDPAGE_NORMAL_VALUE) <= SDPAGE_UNIT_THRESHOLD );
+}
+
+void SetNormal075( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin,
+ ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin )
+{
+ nPageLeftMargin = SDPAGE_NORMAL_VALUE;
+ nPageRightMargin = SDPAGE_NORMAL_VALUE;
+ nPageTopMargin = SDPAGE_NORMAL_VALUE;
+ nPageBottomMargin = SDPAGE_NORMAL_VALUE;
+}
+
+bool IsNormal100( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin,
+ const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin )
+{
+ return( std::abs(nPageLeftMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageRightMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageTopMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageBottomMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD );
+}
+
+void SetNormal100( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin,
+ ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin )
+{
+ nPageLeftMargin = SDPAGE_WIDE_VALUE1;
+ nPageRightMargin = SDPAGE_WIDE_VALUE1;
+ nPageTopMargin = SDPAGE_WIDE_VALUE1;
+ nPageBottomMargin = SDPAGE_WIDE_VALUE1;
+}
+
+bool IsNormal125( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin,
+ const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin )
+{
+ return( std::abs(nPageLeftMargin - SDPAGE_WIDE_VALUE3) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageRightMargin - SDPAGE_WIDE_VALUE3) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageTopMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageBottomMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD );
+}
+
+void SetNormal125( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin,
+ ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin )
+{
+ nPageLeftMargin = SDPAGE_WIDE_VALUE3;
+ nPageRightMargin = SDPAGE_WIDE_VALUE3;
+ nPageTopMargin = SDPAGE_WIDE_VALUE1;
+ nPageBottomMargin = SDPAGE_WIDE_VALUE1;
+}
+
+bool IsWide( const ::tools::Long nPageLeftMargin, const ::tools::Long nPageRightMargin,
+ const ::tools::Long nPageTopMargin, const ::tools::Long nPageBottomMargin )
+{
+ return( std::abs(nPageLeftMargin - SDPAGE_WIDE_VALUE2) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageRightMargin - SDPAGE_WIDE_VALUE2) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageTopMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD &&
+ std::abs(nPageBottomMargin - SDPAGE_WIDE_VALUE1) <= SDPAGE_UNIT_THRESHOLD );
+}
+
+void SetWide( ::tools::Long& nPageLeftMargin, ::tools::Long& nPageRightMargin,
+ ::tools::Long& nPageTopMargin, ::tools::Long& nPageBottomMargin )
+{
+ nPageLeftMargin = SDPAGE_WIDE_VALUE2;
+ nPageRightMargin = SDPAGE_WIDE_VALUE2;
+ nPageTopMargin = SDPAGE_WIDE_VALUE1;
+ nPageBottomMargin = SDPAGE_WIDE_VALUE1;
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/PanelFactory.cxx b/sd/source/ui/sidebar/PanelFactory.cxx
new file mode 100644
index 000000000..c7ca8c25c
--- /dev/null
+++ b/sd/source/ui/sidebar/PanelFactory.cxx
@@ -0,0 +1,141 @@
+/* -*- 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 "PanelFactory.hxx"
+#include <framework/Pane.hxx>
+#include <ViewShellBase.hxx>
+#include <DrawController.hxx>
+#include "LayoutMenu.hxx"
+#include "CurrentMasterPagesSelector.hxx"
+#include "RecentMasterPagesSelector.hxx"
+#include "AllMasterPagesSelector.hxx"
+#include <CustomAnimationPane.hxx>
+#include "NavigatorWrapper.hxx"
+#include <SlideTransitionPane.hxx>
+#include <TableDesignPane.hxx>
+#include "SlideBackground.hxx"
+
+#include <sfx2/sidebar/SidebarPanelBase.hxx>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <comphelper/namedvaluecollection.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <vcl/weldutils.hxx>
+
+using namespace css;
+using namespace css::uno;
+using namespace ::sd::framework;
+
+namespace sd::sidebar {
+
+//----- PanelFactory --------------------------------------------------------
+
+PanelFactory::PanelFactory()
+{
+}
+
+PanelFactory::~PanelFactory()
+{
+}
+
+// XUIElementFactory
+
+Reference<ui::XUIElement> SAL_CALL PanelFactory::createUIElement (
+ const OUString& rsUIElementResourceURL,
+ const css::uno::Sequence<css::beans::PropertyValue>& rArguments)
+{
+ // Process arguments.
+ const ::comphelper::NamedValueCollection aArguments (rArguments);
+ Reference<frame::XFrame> xFrame (aArguments.getOrDefault("Frame", Reference<frame::XFrame>()));
+ Reference<awt::XWindow> xParentWindow (aArguments.getOrDefault("ParentWindow", Reference<awt::XWindow>()));
+ Reference<ui::XSidebar> xSidebar (aArguments.getOrDefault("Sidebar", Reference<ui::XSidebar>()));
+
+ // Throw exceptions when the arguments are not as expected.
+ weld::Widget* pParent(nullptr);
+ if (weld::TransportAsXWindow* pTunnel = dynamic_cast<weld::TransportAsXWindow*>(xParentWindow.get()))
+ pParent = pTunnel->getWidget();
+
+ if (!pParent)
+ throw RuntimeException(
+ "PanelFactory::createUIElement called without ParentWindow");
+ if ( ! xFrame.is())
+ throw RuntimeException(
+ "PanelFactory::createUIElement called without XFrame");
+
+ // Tunnel through the controller to obtain a ViewShellBase.
+ ViewShellBase* pBase = nullptr;
+ auto pController = comphelper::getFromUnoTunnel<sd::DrawController>(xFrame->getController());
+ if (pController != nullptr)
+ pBase = pController->GetViewShellBase();
+ if (pBase == nullptr)
+ throw RuntimeException("can not get ViewShellBase for frame");
+
+ // Get bindings from given arguments.
+ const sal_uInt64 nBindingsValue (aArguments.getOrDefault("SfxBindings", sal_uInt64(0)));
+ SfxBindings* pBindings = reinterpret_cast<SfxBindings*>(nBindingsValue);
+
+ // Create a framework view.
+ std::unique_ptr<PanelLayout> xControl;
+ css::ui::LayoutSize aLayoutSize (-1,-1,-1);
+
+ /** Note that these names have to be identical to (the tail of)
+ the entries in officecfg/registry/data/org/openoffice/Office/Impress.xcu
+ for the TaskPanelFactory.
+ */
+ if (rsUIElementResourceURL.endsWith("/CustomAnimations"))
+ xControl = std::make_unique<CustomAnimationPane>(pParent, *pBase);
+ else if (rsUIElementResourceURL.endsWith("/Layouts"))
+ xControl = std::make_unique<LayoutMenu>(pParent, *pBase, xSidebar);
+ else if (rsUIElementResourceURL.endsWith("/AllMasterPages"))
+ xControl = AllMasterPagesSelector::Create(pParent, *pBase, xSidebar);
+ else if (rsUIElementResourceURL.endsWith("/RecentMasterPages"))
+ xControl = RecentMasterPagesSelector::Create(pParent, *pBase, xSidebar);
+ else if (rsUIElementResourceURL.endsWith("/UsedMasterPages"))
+ xControl = CurrentMasterPagesSelector::Create(pParent, *pBase, xSidebar);
+ else if (rsUIElementResourceURL.endsWith("/SlideTransitions"))
+ xControl = std::make_unique<SlideTransitionPane>(pParent, *pBase);
+ else if (rsUIElementResourceURL.endsWith("/TableDesign"))
+ xControl = std::make_unique<TableDesignPane>(pParent, *pBase);
+ else if (rsUIElementResourceURL.endsWith("/NavigatorPanel"))
+ xControl = std::make_unique<NavigatorWrapper>(pParent, *pBase, pBindings);
+ else if (rsUIElementResourceURL.endsWith("/SlideBackgroundPanel"))
+ xControl = std::make_unique<SlideBackground>(pParent, *pBase, xFrame, pBindings);
+
+ if (!xControl)
+ throw lang::IllegalArgumentException();
+
+ // Create a wrapper around the control that implements the
+ // necessary UNO interfaces.
+ return sfx2::sidebar::SidebarPanelBase::Create(
+ rsUIElementResourceURL,
+ xFrame,
+ std::move(xControl),
+ aLayoutSize);
+}
+
+} // end of namespace sd::sidebar
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+org_openoffice_comp_Draw_framework_PanelFactory_get_implementation(css::uno::XComponentContext* /*context*/,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::sidebar::PanelFactory);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/PanelFactory.hxx b/sd/source/ui/sidebar/PanelFactory.hxx
new file mode 100644
index 000000000..77fc17dbc
--- /dev/null
+++ b/sd/source/ui/sidebar/PanelFactory.hxx
@@ -0,0 +1,49 @@
+/* -*- 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 .
+ */
+#pragma once
+
+#include <comphelper/compbase.hxx>
+
+#include <com/sun/star/ui/XUIElementFactory.hpp>
+
+namespace sd::sidebar {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::ui::XUIElementFactory
+ > PanelFactoryInterfaceBase;
+
+class PanelFactory final
+ : public PanelFactoryInterfaceBase
+{
+public:
+ explicit PanelFactory ();
+ virtual ~PanelFactory() override;
+ PanelFactory(const PanelFactory&) = delete;
+ PanelFactory& operator=(const PanelFactory&) = delete;
+
+ // XUIElementFactory
+
+ css::uno::Reference<css::ui::XUIElement> SAL_CALL createUIElement (
+ const OUString& rsResourceURL,
+ const css::uno::Sequence<css::beans::PropertyValue>& rArguments) override;
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/PreviewValueSet.cxx b/sd/source/ui/sidebar/PreviewValueSet.cxx
new file mode 100644
index 000000000..f752d60eb
--- /dev/null
+++ b/sd/source/ui/sidebar/PreviewValueSet.cxx
@@ -0,0 +1,127 @@
+/* -*- 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 "PreviewValueSet.hxx"
+#include <vcl/commandevent.hxx>
+
+namespace sd::sidebar {
+
+const int gnBorderWidth(3);
+const int gnBorderHeight(3);
+
+PreviewValueSet::PreviewValueSet()
+ : ValueSet(nullptr)
+ , maPreviewSize(10,10)
+{
+ SetStyle (
+ GetStyle()
+ & ~(WB_ITEMBORDER)// | WB_MENUSTYLEVALUESET)
+ // | WB_FLATVALUESET);
+ );
+}
+
+void PreviewValueSet::SetDrawingArea(weld::DrawingArea* pDrawingArea)
+{
+ ValueSet::SetDrawingArea(pDrawingArea);
+
+ SetColCount(2);
+ SetExtraSpacing (2);
+}
+
+PreviewValueSet::~PreviewValueSet()
+{
+}
+
+void PreviewValueSet::SetPreviewSize (const Size& rSize)
+{
+ maPreviewSize = rSize;
+}
+
+void PreviewValueSet::SetContextMenuHandler(const Link<const Point*, void>& rLink)
+{
+ maContextMenuHandler = rLink;
+}
+
+bool PreviewValueSet::Command(const CommandEvent& rEvent)
+{
+ if (rEvent.GetCommand() != CommandEventId::ContextMenu)
+ return ValueSet::Command(rEvent);
+ maContextMenuHandler.Call(rEvent.IsMouseEvent() ? &rEvent.GetMousePosPixel() : nullptr);
+ return true;
+}
+
+void PreviewValueSet::Resize()
+{
+ ValueSet::Resize();
+
+ Size aWindowSize (GetOutputSizePixel());
+ if (!aWindowSize.IsEmpty())
+ {
+ Rearrange();
+ }
+}
+
+void PreviewValueSet::Rearrange()
+{
+ sal_uInt16 nNewColumnCount (CalculateColumnCount (
+ GetOutputSizePixel().Width()));
+ sal_uInt16 nNewRowCount (CalculateRowCount (nNewColumnCount));
+
+ SetFormat();
+ SetColCount(nNewColumnCount);
+ SetLineCount(nNewRowCount);
+}
+
+sal_uInt16 PreviewValueSet::CalculateColumnCount (int nWidth) const
+{
+ int nColumnCount = 0;
+ if (nWidth > 0)
+ {
+ nColumnCount = nWidth / (maPreviewSize.Width() + 2*gnBorderWidth);
+ if (nColumnCount < 1)
+ nColumnCount = 1;
+ }
+ return static_cast<sal_uInt16>(nColumnCount);
+}
+
+sal_uInt16 PreviewValueSet::CalculateRowCount (sal_uInt16 nColumnCount) const
+{
+ int nRowCount = 0;
+ int nItemCount = GetItemCount();
+ if (nColumnCount > 0)
+ {
+ nRowCount = (nItemCount+nColumnCount-1) / nColumnCount;
+ if (nRowCount < 1)
+ nRowCount = 1;
+ }
+
+ return static_cast<sal_uInt16>(nRowCount);
+}
+
+sal_Int32 PreviewValueSet::GetPreferredHeight (sal_Int32 nWidth)
+{
+ int nRowCount (CalculateRowCount(CalculateColumnCount(nWidth)));
+ int nItemHeight (maPreviewSize.Height());
+
+ return nRowCount * (nItemHeight + 2*gnBorderHeight);
+}
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/PreviewValueSet.hxx b/sd/source/ui/sidebar/PreviewValueSet.hxx
new file mode 100644
index 000000000..adab3c78a
--- /dev/null
+++ b/sd/source/ui/sidebar/PreviewValueSet.hxx
@@ -0,0 +1,59 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <svtools/valueset.hxx>
+
+namespace sd::sidebar
+{
+/** Adapt the svtools valueset to the needs of the master page controls.
+*/
+class PreviewValueSet : public ValueSet
+{
+public:
+ explicit PreviewValueSet();
+ virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
+ virtual ~PreviewValueSet() override;
+
+ void SetContextMenuHandler(const Link<const Point*, void>& rLink);
+
+ virtual void Resize() override;
+ virtual bool Command(const CommandEvent& rEvent) override;
+
+ void SetPreviewSize(const Size& rSize);
+
+ sal_Int32 GetPreferredHeight(sal_Int32 nWidth);
+
+ /** Set the number of rows and columns according to the current number
+ of items. Call this method when new items have been inserted.
+ */
+ void Rearrange();
+
+private:
+ Link<const Point*, void> maContextMenuHandler;
+ Size maPreviewSize;
+
+ sal_uInt16 CalculateColumnCount(int nWidth) const;
+ sal_uInt16 CalculateRowCount(sal_uInt16 nColumnCount) const;
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/RecentMasterPagesSelector.cxx b/sd/source/ui/sidebar/RecentMasterPagesSelector.cxx
new file mode 100644
index 000000000..6e5a46c73
--- /dev/null
+++ b/sd/source/ui/sidebar/RecentMasterPagesSelector.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/.
+ *
+ * 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 "RecentMasterPagesSelector.hxx"
+
+#include <ViewShellBase.hxx>
+#include "RecentlyUsedMasterPages.hxx"
+#include <MasterPageObserver.hxx>
+#include <sdpage.hxx>
+#include <drawdoc.hxx>
+#include <helpids.h>
+
+namespace sd::sidebar {
+
+std::unique_ptr<PanelLayout> RecentMasterPagesSelector::Create (
+ weld::Widget* pParent,
+ ViewShellBase& rViewShellBase,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar)
+{
+ SdDrawDocument* pDocument = rViewShellBase.GetDocument();
+ if (pDocument == nullptr)
+ return nullptr;
+
+ auto pContainer = std::make_shared<MasterPageContainer>();
+
+ auto xSelector(std::make_unique<RecentMasterPagesSelector>(
+ pParent,
+ *pDocument,
+ rViewShellBase,
+ pContainer,
+ rxSidebar));
+ xSelector->LateInit();
+ xSelector->SetHelpId(HID_SD_TASK_PANE_PREVIEW_RECENT);
+
+ return xSelector;
+}
+
+RecentMasterPagesSelector::RecentMasterPagesSelector (
+ weld::Widget* pParent,
+ SdDrawDocument& rDocument,
+ ViewShellBase& rBase,
+ const std::shared_ptr<MasterPageContainer>& rpContainer,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar)
+ : MasterPagesSelector (pParent, rDocument, rBase, rpContainer, rxSidebar, "modules/simpress/ui/masterpagepanelrecent.ui", "recentvalueset")
+{
+}
+
+RecentMasterPagesSelector::~RecentMasterPagesSelector()
+{
+ RecentlyUsedMasterPages::Instance().RemoveEventListener (
+ LINK(this,RecentMasterPagesSelector,MasterPageListListener));
+}
+
+void RecentMasterPagesSelector::LateInit()
+{
+ MasterPagesSelector::LateInit();
+
+ MasterPagesSelector::Fill();
+ RecentlyUsedMasterPages::Instance().AddEventListener (
+ LINK(this,RecentMasterPagesSelector,MasterPageListListener));
+}
+
+IMPL_LINK_NOARG(RecentMasterPagesSelector, MasterPageListListener, LinkParamNone*, void)
+{
+ MasterPagesSelector::Fill();
+}
+
+void RecentMasterPagesSelector::Fill (ItemList& rItemList)
+{
+ // Create a set of names of the master pages used by the document.
+ MasterPageObserver::MasterPageNameSet aCurrentNames;
+ sal_uInt16 nMasterPageCount = mrDocument.GetMasterSdPageCount(PageKind::Standard);
+ for (sal_uInt16 nIndex=0; nIndex<nMasterPageCount; nIndex++)
+ {
+ SdPage* pMasterPage = mrDocument.GetMasterSdPage (nIndex, PageKind::Standard);
+ if (pMasterPage != nullptr)
+ aCurrentNames.insert (pMasterPage->GetName());
+ }
+
+ // Insert the recently used master pages that are currently not used.
+ RecentlyUsedMasterPages& rInstance (RecentlyUsedMasterPages::Instance());
+ int nPageCount = rInstance.GetMasterPageCount();
+ for (int nIndex=0; nIndex<nPageCount; nIndex++)
+ {
+ // Add an entry when a) the page is already known to the
+ // MasterPageContainer, b) the style name is empty, i.e. it has not yet
+ // been loaded (and thus can not be in use) or otherwise c) the
+ // style name is not currently in use.
+ MasterPageContainer::Token aToken (rInstance.GetTokenForIndex(nIndex));
+ if (aToken != MasterPageContainer::NIL_TOKEN)
+ {
+ OUString sStyleName (mpContainer->GetStyleNameForToken(aToken));
+ if (sStyleName.isEmpty()
+ || aCurrentNames.find(sStyleName) == aCurrentNames.end())
+ {
+ rItemList.push_back(aToken);
+ }
+ }
+ }
+}
+
+void RecentMasterPagesSelector::AssignMasterPageToPageList (
+ SdPage* pMasterPage,
+ const std::shared_ptr<std::vector<SdPage*> >& rpPageList)
+{
+ sal_uInt16 nSelectedItemId = mxPreviewValueSet->GetSelectedItemId();
+
+ MasterPagesSelector::AssignMasterPageToPageList(pMasterPage, rpPageList);
+
+ // Restore the selection.
+ if (mxPreviewValueSet->GetItemCount() > 0)
+ {
+ if (mxPreviewValueSet->GetItemCount() >= nSelectedItemId)
+ mxPreviewValueSet->SelectItem(nSelectedItemId);
+ else
+ mxPreviewValueSet->SelectItem(mxPreviewValueSet->GetItemCount());
+ }
+}
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/RecentMasterPagesSelector.hxx b/sd/source/ui/sidebar/RecentMasterPagesSelector.hxx
new file mode 100644
index 000000000..6dbc3a2aa
--- /dev/null
+++ b/sd/source/ui/sidebar/RecentMasterPagesSelector.hxx
@@ -0,0 +1,71 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "MasterPagesSelector.hxx"
+
+namespace sd::sidebar {
+
+/** Show the recently used master pages (that are not currently used).
+*/
+class RecentMasterPagesSelector final
+ : public MasterPagesSelector
+{
+ friend class VclPtrInstance<RecentMasterPagesSelector>;
+public:
+ static std::unique_ptr<PanelLayout> Create (
+ weld::Widget* pParent,
+ ViewShellBase& rViewShellBase,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar);
+
+ RecentMasterPagesSelector (
+ weld::Widget* pParent,
+ SdDrawDocument& rDocument,
+ ViewShellBase& rBase,
+ const std::shared_ptr<MasterPageContainer>& rpContainer,
+ const css::uno::Reference<css::ui::XSidebar>& rxSidebar);
+ virtual ~RecentMasterPagesSelector() override;
+
+private:
+ DECL_LINK(MasterPageListListener, LinkParamNone*, void);
+ virtual void Fill (ItemList& rItemList) override;
+
+ using sd::sidebar::MasterPagesSelector::Fill;
+
+ /** Forward this call to the base class but save and restore the
+ currently selected item.
+ Assign the given master page to the list of pages.
+ @param pMasterPage
+ This master page will usually be a member of the list of all
+ available master pages as provided by the MasterPageContainer.
+ @param rPageList
+ The pages to which to assign the master page. These pages may
+ be slides or master pages themselves.
+ */
+ virtual void AssignMasterPageToPageList (
+ SdPage* pMasterPage,
+ const std::shared_ptr<std::vector<SdPage*> >& rpPageList) override;
+
+ virtual void LateInit() override;
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/RecentlyUsedMasterPages.cxx b/sd/source/ui/sidebar/RecentlyUsedMasterPages.cxx
new file mode 100644
index 000000000..268658823
--- /dev/null
+++ b/sd/source/ui/sidebar/RecentlyUsedMasterPages.cxx
@@ -0,0 +1,366 @@
+/* -*- 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 "RecentlyUsedMasterPages.hxx"
+#include "MasterPageContainerProviders.hxx"
+#include <MasterPageObserver.hxx>
+#include "MasterPageDescriptor.hxx"
+#include <tools/ConfigurationAccess.hxx>
+
+#include <algorithm>
+#include <memory>
+#include <vector>
+
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <osl/doublecheckedlocking.h>
+#include <osl/getglobalmutex.hxx>
+
+using namespace ::std;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace {
+
+OUString GetPathToImpressConfigurationRoot()
+{
+ return "/org.openoffice.Office.Impress/";
+}
+OUString GetPathToSetNode()
+{
+ return "MultiPaneGUI/ToolPanel/RecentlyUsedMasterPages";
+}
+
+} // end of anonymous namespace
+
+namespace sd::sidebar {
+
+RecentlyUsedMasterPages* RecentlyUsedMasterPages::mpInstance = nullptr;
+
+RecentlyUsedMasterPages& RecentlyUsedMasterPages::Instance()
+{
+ if (mpInstance == nullptr)
+ {
+ ::osl::GetGlobalMutex aMutexFunctor;
+ ::osl::MutexGuard aGuard (aMutexFunctor());
+ if (mpInstance == nullptr)
+ {
+ RecentlyUsedMasterPages* pInstance = new RecentlyUsedMasterPages();
+ pInstance->LateInit();
+ SdGlobalResourceContainer::Instance().AddResource (
+ ::std::unique_ptr<SdGlobalResource>(pInstance));
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ mpInstance = pInstance;
+ }
+ }
+ else {
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ }
+
+ return *mpInstance;
+}
+
+constexpr size_t gnMaxListSize(8);
+
+RecentlyUsedMasterPages::RecentlyUsedMasterPages()
+ : mpContainer(std::make_shared<MasterPageContainer>())
+{
+}
+
+RecentlyUsedMasterPages::~RecentlyUsedMasterPages()
+{
+ Link<MasterPageContainerChangeEvent&,void> aLink (LINK(this,RecentlyUsedMasterPages,MasterPageContainerChangeListener));
+ mpContainer->RemoveChangeListener(aLink);
+
+ MasterPageObserver::Instance().RemoveEventListener(
+ LINK(this,RecentlyUsedMasterPages,MasterPageChangeListener));
+}
+
+void RecentlyUsedMasterPages::LateInit()
+{
+ Link<MasterPageContainerChangeEvent&,void> aLink (LINK(this,RecentlyUsedMasterPages,MasterPageContainerChangeListener));
+ mpContainer->AddChangeListener(aLink);
+
+ LoadPersistentValues ();
+ MasterPageObserver::Instance().AddEventListener(
+ LINK(this,RecentlyUsedMasterPages,MasterPageChangeListener));
+}
+
+void RecentlyUsedMasterPages::LoadPersistentValues()
+{
+ try
+ {
+ tools::ConfigurationAccess aConfiguration (
+ GetPathToImpressConfigurationRoot(),
+ tools::ConfigurationAccess::READ_ONLY);
+ Reference<container::XNameAccess> xSet (
+ aConfiguration.GetConfigurationNode(GetPathToSetNode()),
+ UNO_QUERY);
+ if ( ! xSet.is())
+ return;
+
+ static const OUStringLiteral sURLMemberName(u"URL");
+ static const OUStringLiteral sNameMemberName(u"Name");
+ OUString sURL;
+ OUString sName;
+
+ // Read the names and URLs of the master pages.
+ const Sequence<OUString> aKeys (xSet->getElementNames());
+ mvMasterPages.clear();
+ mvMasterPages.reserve(aKeys.getLength());
+ for (const auto& rKey : aKeys)
+ {
+ Reference<container::XNameAccess> xSetItem (
+ xSet->getByName(rKey), UNO_QUERY);
+ if (xSetItem.is())
+ {
+ Any aURL (xSetItem->getByName(sURLMemberName));
+ Any aName (xSetItem->getByName(sNameMemberName));
+ aURL >>= sURL;
+ aName >>= sName;
+ SharedMasterPageDescriptor pDescriptor = std::make_shared<MasterPageDescriptor>(
+ MasterPageContainer::TEMPLATE,
+ -1,
+ sURL,
+ OUString(),
+ sName,
+ false,
+ std::make_shared<TemplatePageObjectProvider>(sURL),
+ std::make_shared<TemplatePreviewProvider>(sURL));
+ // For user supplied templates we use a different
+ // preview provider: The preview in the document shows
+ // not only shapes on the master page but also shapes on
+ // the foreground. This is misleading and therefore
+ // these previews are discarded and created directly
+ // from the page objects.
+ if (pDescriptor->GetURLClassification() == MasterPageDescriptor::URLCLASS_USER)
+ pDescriptor->mpPreviewProvider = std::make_shared<PagePreviewProvider>();
+ MasterPageContainer::Token aToken (mpContainer->PutMasterPage(pDescriptor));
+ mvMasterPages.emplace_back(aToken,sURL,sName);
+ }
+ }
+
+ ResolveList();
+ }
+ catch (Exception&)
+ {
+ // Ignore exception.
+ }
+}
+
+void RecentlyUsedMasterPages::SavePersistentValues()
+{
+ try
+ {
+ tools::ConfigurationAccess aConfiguration (
+ GetPathToImpressConfigurationRoot(),
+ tools::ConfigurationAccess::READ_WRITE);
+ Reference<container::XNameContainer> xSet (
+ aConfiguration.GetConfigurationNode(GetPathToSetNode()),
+ UNO_QUERY);
+ if ( ! xSet.is())
+ return;
+
+ // Clear the set.
+ const Sequence<OUString> aKeys (xSet->getElementNames());
+ for (const auto& rKey : aKeys)
+ xSet->removeByName (rKey);
+
+ // Fill it with the URLs of this object.
+ static const OUStringLiteral sURLMemberName(u"URL");
+ static const OUStringLiteral sNameMemberName(u"Name");
+ Any aValue;
+ Reference<lang::XSingleServiceFactory> xChildFactory (
+ xSet, UNO_QUERY);
+ if ( ! xChildFactory.is())
+ return;
+ sal_Int32 nIndex(0);
+ for (const auto& rDescriptor : mvMasterPages)
+ {
+ // Create new child.
+ OUString sKey = "index_" + OUString::number(nIndex);
+ Reference<container::XNameReplace> xChild(
+ xChildFactory->createInstance(), UNO_QUERY);
+ if (xChild.is())
+ {
+ xSet->insertByName (sKey, Any(xChild));
+
+ aValue <<= rDescriptor.msURL;
+ xChild->replaceByName (sURLMemberName, aValue);
+
+ aValue <<= rDescriptor.msName;
+ xChild->replaceByName (sNameMemberName, aValue);
+ }
+ ++nIndex;
+ }
+
+ // Write the data back to disk.
+ aConfiguration.CommitChanges();
+ }
+ catch (Exception&)
+ {
+ // Ignore exception.
+ }
+}
+
+void RecentlyUsedMasterPages::AddEventListener (const Link<LinkParamNone*,void>& rEventListener)
+{
+ if (::std::find (
+ maListeners.begin(),
+ maListeners.end(),
+ rEventListener) == maListeners.end())
+ {
+ maListeners.push_back (rEventListener);
+ }
+}
+
+void RecentlyUsedMasterPages::RemoveEventListener (const Link<LinkParamNone*,void>& rEventListener)
+{
+ maListeners.erase (
+ ::std::find (
+ maListeners.begin(),
+ maListeners.end(),
+ rEventListener));
+}
+
+int RecentlyUsedMasterPages::GetMasterPageCount() const
+{
+ return mvMasterPages.size();
+}
+
+MasterPageContainer::Token RecentlyUsedMasterPages::GetTokenForIndex (sal_uInt32 nIndex) const
+{
+ if(nIndex<mvMasterPages.size())
+ return mvMasterPages[nIndex].maToken;
+ else
+ return MasterPageContainer::NIL_TOKEN;
+}
+
+void RecentlyUsedMasterPages::SendEvent()
+{
+ for (const auto& aLink : maListeners)
+ {
+ aLink.Call(nullptr);
+ }
+}
+
+IMPL_LINK(RecentlyUsedMasterPages, MasterPageChangeListener,
+ MasterPageObserverEvent&, rEvent, void)
+{
+ switch (rEvent.meType)
+ {
+ case MasterPageObserverEvent::ET_MASTER_PAGE_ADDED:
+ case MasterPageObserverEvent::ET_MASTER_PAGE_EXISTS:
+ AddMasterPage(
+ mpContainer->GetTokenForStyleName(rEvent.mrMasterPageName));
+ break;
+
+ case MasterPageObserverEvent::ET_MASTER_PAGE_REMOVED:
+ // Do not change the list of recently master pages (the deleted
+ // page was recently used) but tell the listeners. They may want
+ // to update their lists.
+ SendEvent();
+ break;
+ }
+}
+
+IMPL_LINK(RecentlyUsedMasterPages, MasterPageContainerChangeListener,
+ MasterPageContainerChangeEvent&, rEvent, void)
+{
+ switch (rEvent.meEventType)
+ {
+ case MasterPageContainerChangeEvent::EventType::CHILD_ADDED:
+ case MasterPageContainerChangeEvent::EventType::CHILD_REMOVED:
+ case MasterPageContainerChangeEvent::EventType::INDEX_CHANGED:
+ ResolveList();
+ break;
+
+ default:
+ // Ignored.
+ break;
+ }
+}
+
+void RecentlyUsedMasterPages::AddMasterPage (
+ MasterPageContainer::Token aToken)
+{
+ // For the page to be inserted the token has to be valid and the page
+ // has to have a valid URL. This excludes master pages that do not come
+ // from template files.
+ if (aToken == MasterPageContainer::NIL_TOKEN
+ || mpContainer->GetURLForToken(aToken).isEmpty())
+ return;
+
+ MasterPageList::iterator aIterator (
+ ::std::find_if(mvMasterPages.begin(),mvMasterPages.end(),
+ Descriptor::TokenComparator(aToken)));
+ if (aIterator != mvMasterPages.end())
+ {
+ // When an entry for the given token already exists then remove
+ // it now and insert it later at the head of the list.
+ mvMasterPages.erase (aIterator);
+ }
+
+ mvMasterPages.insert(mvMasterPages.begin(),
+ Descriptor(
+ aToken,
+ mpContainer->GetURLForToken(aToken),
+ mpContainer->GetStyleNameForToken(aToken)));
+
+ // Shorten list to maximal size.
+ while (mvMasterPages.size() > gnMaxListSize)
+ {
+ mvMasterPages.pop_back ();
+ }
+
+ SavePersistentValues ();
+ SendEvent();
+}
+
+void RecentlyUsedMasterPages::ResolveList()
+{
+ bool bNotify (false);
+
+ for (auto& rDescriptor : mvMasterPages)
+ {
+ if (rDescriptor.maToken == MasterPageContainer::NIL_TOKEN)
+ {
+ MasterPageContainer::Token aToken (mpContainer->GetTokenForURL(rDescriptor.msURL));
+ rDescriptor.maToken = aToken;
+ if (aToken != MasterPageContainer::NIL_TOKEN)
+ bNotify = true;
+ }
+ else
+ {
+ if ( ! mpContainer->HasToken(rDescriptor.maToken))
+ {
+ rDescriptor.maToken = MasterPageContainer::NIL_TOKEN;
+ bNotify = true;
+ }
+ }
+ }
+
+ if (bNotify)
+ SendEvent();
+}
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/RecentlyUsedMasterPages.hxx b/sd/source/ui/sidebar/RecentlyUsedMasterPages.hxx
new file mode 100644
index 000000000..e95e66ccb
--- /dev/null
+++ b/sd/source/ui/sidebar/RecentlyUsedMasterPages.hxx
@@ -0,0 +1,125 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <tools/SdGlobalResourceContainer.hxx>
+#include <tools/link.hxx>
+#include <vector>
+
+#include "MasterPageContainer.hxx"
+
+namespace sd {
+class MasterPageObserverEvent;
+}
+
+namespace sd::sidebar {
+
+/** This singleton holds a list of the most recently used master pages.
+*/
+class RecentlyUsedMasterPages
+ : public SdGlobalResource
+{
+public:
+ /** Return the single instance of this class.
+ */
+ static RecentlyUsedMasterPages& Instance();
+
+ void AddEventListener (const Link<LinkParamNone*,void>& rEventListener);
+ void RemoveEventListener (const Link<LinkParamNone*,void>& rEventListener);
+
+ int GetMasterPageCount() const;
+ MasterPageContainer::Token GetTokenForIndex (sal_uInt32 nIndex) const;
+
+private:
+ class Descriptor
+ {
+ public:
+ OUString msURL;
+ OUString msName;
+ ::sd::sidebar::MasterPageContainer::Token maToken;
+ Descriptor (::sd::sidebar::MasterPageContainer::Token aToken,
+ const OUString& rsURL, const OUString& rsName)
+ : msURL(rsURL),
+ msName(rsName),
+ maToken(aToken)
+ {}
+
+ class TokenComparator
+ {
+ public:
+ explicit TokenComparator(::sd::sidebar::MasterPageContainer::Token aToken)
+ : maToken(aToken) {}
+ bool operator () (const Descriptor& rDescriptor)
+ { return maToken==rDescriptor.maToken; }
+
+ private:
+ ::sd::sidebar::MasterPageContainer::Token maToken;
+ };
+ };
+
+ /** The single instance of this class. It is created on demand when
+ Instance() is called for the first time.
+ */
+ static RecentlyUsedMasterPages* mpInstance;
+
+ ::std::vector<Link<LinkParamNone*,void>> maListeners;
+
+ typedef ::std::vector<Descriptor> MasterPageList;
+ MasterPageList mvMasterPages;
+ std::shared_ptr<MasterPageContainer> mpContainer;
+
+ RecentlyUsedMasterPages();
+ virtual ~RecentlyUsedMasterPages() override;
+
+ /** Call this method after a new object has been created.
+ */
+ void LateInit();
+
+ RecentlyUsedMasterPages (const RecentlyUsedMasterPages&) = delete;
+
+ RecentlyUsedMasterPages& operator= (const RecentlyUsedMasterPages&) = delete;
+
+ void SendEvent();
+ DECL_LINK(MasterPageChangeListener, MasterPageObserverEvent&, void);
+ DECL_LINK(MasterPageContainerChangeListener, MasterPageContainerChangeEvent&, void);
+
+ /** Add a descriptor for the specified master page to the end of the
+ list of most recently used master pages. When the page is already a
+ member of that list the associated descriptor is moved to the end of
+ the list to make it the most recently used entry.
+ */
+ void AddMasterPage(MasterPageContainer::Token aToken);
+
+ /** Load the list of recently used master pages from the registry where
+ it was saved to make it persistent.
+ */
+ void LoadPersistentValues();
+
+ /** Save the list of recently used master pages to the registry to make
+ it persistent.
+ */
+ void SavePersistentValues();
+
+ void ResolveList();
+};
+
+} // end of namespace sd::sidebar
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/SlideBackground.cxx b/sd/source/ui/sidebar/SlideBackground.cxx
new file mode 100644
index 000000000..742275bab
--- /dev/null
+++ b/sd/source/ui/sidebar/SlideBackground.cxx
@@ -0,0 +1,1286 @@
+/* -*- 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 <com/sun/star/ui/XDeck.hpp>
+#include <com/sun/star/ui/XPanel.hpp>
+#include <com/sun/star/frame/XController2.hpp>
+#include <SlideSorter.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include "SlideBackground.hxx"
+#include <sdresid.hxx>
+#include <ViewShellBase.hxx>
+#include <FrameView.hxx>
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include "PageMarginUtils.hxx"
+#include <strings.hrc>
+#include <pageformatpanel.hrc>
+#include <DrawViewShell.hxx>
+#include <svl/intitem.hxx>
+#include <svx/colorbox.hxx>
+#include <svx/dlgutil.hxx>
+#include <svx/drawitem.hxx>
+#include <svx/itemwin.hxx>
+#include <svx/pageitem.hxx>
+#include <app.hrc>
+#include <editeng/paperinf.hxx>
+#include <svx/xflgrit.hxx>
+#include <svx/rulritem.hxx>
+#include <svx/svxids.hrc>
+#include <svx/xfillit0.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xgrad.hxx>
+#include <svx/xbtmpit.hxx>
+#include <svx/xflhtit.hxx>
+#include <svx/svdpage.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/sidebar/Panel.hxx>
+#include <EventMultiplexer.hxx>
+#include <unotools/localedatawrapper.hxx>
+#include <vcl/EnumContext.hxx>
+#include <vcl/svapp.hxx>
+
+#include <editeng/sizeitem.hxx>
+#include <comphelper/lok.hxx>
+#include <unomodel.hxx>
+#include <sfx2/lokhelper.hxx>
+
+using namespace ::com::sun::star;
+
+using ::com::sun::star::uno::Reference;
+
+namespace sd::sidebar {
+
+namespace {
+
+enum eFillStyle
+{
+ NONE,
+ SOLID,
+ GRADIENT,
+ HATCH,
+ BITMAP,
+ PATTERN
+};
+
+}
+
+SlideBackground::SlideBackground(
+ weld::Widget* pParent,
+ ViewShellBase& rBase,
+ const css::uno::Reference<css::frame::XFrame>& rxFrame,
+ SfxBindings* pBindings) :
+ PanelLayout( pParent, "SlideBackgroundPanel", "modules/simpress/ui/sidebarslidebackground.ui" ),
+ mrBase( rBase ),
+ mxPaperSizeBox(new SvxPaperSizeListBox(m_xBuilder->weld_combo_box("paperformat"))),
+ mxPaperOrientation(m_xBuilder->weld_combo_box("orientation")),
+ mxMasterSlide(m_xBuilder->weld_combo_box("masterslide")),
+ mxBackgroundLabel(m_xBuilder->weld_label("label3")),
+ mxFillStyle(m_xBuilder->weld_combo_box("fillstyle")),
+ mxFillLB(new ColorListBox(m_xBuilder->weld_menu_button("fillattr"), [this]{ return GetFrameWeld(); })),
+ mxFillAttr(m_xBuilder->weld_combo_box("fillattr1")),
+ mxFillGrad1(new ColorListBox(m_xBuilder->weld_menu_button("fillattr2"), [this]{ return GetFrameWeld(); })),
+ mxFillGrad2(new ColorListBox(m_xBuilder->weld_menu_button("fillattr3"), [this]{ return GetFrameWeld(); })),
+ mxInsertImage(m_xBuilder->weld_button("button2")),
+ mxDspMasterBackground(m_xBuilder->weld_check_button("displaymasterbackground")),
+ mxDspMasterObjects(m_xBuilder->weld_check_button("displaymasterobjects")),
+ mxCloseMaster(m_xBuilder->weld_button("closemasterslide")),
+ mxEditMaster(m_xBuilder->weld_button("masterslidebutton")),
+ mxMasterLabel(m_xBuilder->weld_label("masterlabel")),
+ mxMarginSelectBox(m_xBuilder->weld_combo_box("marginLB")),
+ mxCustomEntry(m_xBuilder->weld_label("customlabel")),
+ mxMarginLabel(m_xBuilder->weld_label("labelmargin")),
+ maPaperSizeController(SID_ATTR_PAGE_SIZE, *pBindings, *this),
+ maPaperOrientationController(SID_ATTR_PAGE, *pBindings, *this),
+ maPaperMarginLRController(SID_ATTR_PAGE_LRSPACE, *pBindings, *this),
+ maPaperMarginULController(SID_ATTR_PAGE_ULSPACE, *pBindings, *this),
+ maBckColorController(SID_ATTR_PAGE_COLOR, *pBindings, *this),
+ maBckGradientController(SID_ATTR_PAGE_GRADIENT, *pBindings, *this),
+ maBckHatchController(SID_ATTR_PAGE_HATCH, *pBindings, *this),
+ maBckBitmapController(SID_ATTR_PAGE_BITMAP, *pBindings, *this),
+ maBckFillStyleController(SID_ATTR_PAGE_FILLSTYLE, *pBindings, *this),
+ maBckImageController(SID_SELECT_BACKGROUND, *pBindings, *this),
+ maDspBckController(SID_DISPLAY_MASTER_BACKGROUND, *pBindings, *this),
+ maDspObjController(SID_DISPLAY_MASTER_OBJECTS, *pBindings, *this),
+ maMetricController(SID_ATTR_METRIC, *pBindings, *this),
+ maCloseMasterController(SID_CLOSE_MASTER_VIEW, *pBindings, *this),
+ mpPageItem( new SvxPageItem(SID_ATTR_PAGE) ),
+ mbSwitchModeToNormal(false),
+ mbSwitchModeToMaster(false),
+ mxFrame(rxFrame),
+ maDrawOtherContext(vcl::EnumContext::Application::Draw, vcl::EnumContext::Context::DrawPage),
+ maDrawMasterContext(vcl::EnumContext::Application::Draw, vcl::EnumContext::Context::MasterPage),
+ maImpressOtherContext(vcl::EnumContext::Application::Impress, vcl::EnumContext::Context::DrawPage),
+ maImpressMasterContext(vcl::EnumContext::Application::Impress, vcl::EnumContext::Context::MasterPage),
+ maImpressHandoutContext(vcl::EnumContext::Application::Impress, vcl::EnumContext::Context::HandoutPage),
+ maImpressNotesContext(vcl::EnumContext::Application::Impress, vcl::EnumContext::Context::NotesPage),
+ mbTitle(false),
+ mpPageLRMarginItem( new SvxLongLRSpaceItem( 0, 0, SID_ATTR_PAGE_LRSPACE ) ),
+ mpPageULMarginItem( new SvxLongULSpaceItem( 0, 0, SID_ATTR_PAGE_ULSPACE ) ),
+ m_nPageLeftMargin(0),
+ m_nPageRightMargin(0),
+ m_nPageTopMargin(0),
+ m_nPageBottomMargin(0),
+ meFUnit(GetModuleFieldUnit()),
+ mpBindings(pBindings)
+{
+ //let the listbox shrink to any size so the sidebar isn't forced to grow to
+ //the size of the longest master slide name in the document
+ mxMasterSlide->set_size_request(42, -1);
+
+ maCustomEntry = mxCustomEntry->get_label();
+
+ addListener();
+ Initialize();
+}
+
+bool SlideBackground::IsDraw()
+{
+ return ( maContext == maDrawMasterContext ||
+ maContext == maDrawOtherContext );
+}
+
+bool SlideBackground::IsImpress()
+{
+ return ( maContext == maImpressMasterContext ||
+ maContext == maImpressOtherContext ||
+ maContext == maImpressHandoutContext ||
+ maContext == maImpressNotesContext );
+}
+
+FieldUnit SlideBackground::GetCurrentUnit(SfxItemState eState, const SfxPoolItem* pState)
+{
+ FieldUnit eUnit;
+
+ if (pState && eState >= SfxItemState::DEFAULT)
+ eUnit = static_cast<FieldUnit>(static_cast<const SfxUInt16Item*>(pState)->GetValue());
+ else
+ eUnit = GetModuleFieldUnit();
+
+ return eUnit;
+}
+
+void SlideBackground::SetMarginsFieldUnit()
+{
+ auto nSelected = mxMarginSelectBox->get_active();
+ mxMarginSelectBox->clear();
+
+ const LocaleDataWrapper& rLocaleData = Application::GetSettings().GetLocaleDataWrapper();
+
+ if (IsInch(meFUnit))
+ {
+ OUString sSuffix = weld::MetricSpinButton::MetricToString(FieldUnit::INCH);
+ for (size_t i = 0; i < SAL_N_ELEMENTS(RID_PAGEFORMATPANEL_MARGINS_INCH); ++i)
+ {
+ OUString sMeasurement = rLocaleData.getNum(RID_PAGEFORMATPANEL_MARGINS_INCH[i].second, 2, true, false) + sSuffix;
+ mxMarginSelectBox->append_text(SdResId(RID_PAGEFORMATPANEL_MARGINS_INCH[i].first).replaceFirst("%1", sMeasurement));
+ }
+ }
+ else
+ {
+ OUString sSuffix = " " + weld::MetricSpinButton::MetricToString(FieldUnit::CM);
+ for (size_t i = 0; i < SAL_N_ELEMENTS(RID_PAGEFORMATPANEL_MARGINS_CM); ++i)
+ {
+ OUString sMeasurement = rLocaleData.getNum(RID_PAGEFORMATPANEL_MARGINS_CM[i].second, 2, true, false) + sSuffix;
+ mxMarginSelectBox->append_text(SdResId(RID_PAGEFORMATPANEL_MARGINS_CM[i].first).replaceFirst("%1", sMeasurement));
+ }
+ }
+
+ mxMarginSelectBox->set_active(nSelected);
+}
+
+void SlideBackground::Initialize()
+{
+ SvxFillTypeBox::Fill(*mxFillStyle);
+
+ SetMarginsFieldUnit();
+
+ mxPaperSizeBox->FillPaperSizeEntries( PaperSizeApp::Draw );
+ mxPaperSizeBox->connect_changed(LINK(this,SlideBackground,PaperSizeModifyHdl));
+ mxPaperOrientation->connect_changed(LINK(this,SlideBackground,PaperSizeModifyHdl));
+ mxEditMaster->connect_clicked(LINK(this, SlideBackground, EditMasterHdl));
+ mxCloseMaster->connect_clicked(LINK(this, SlideBackground, CloseMasterHdl));
+ mxInsertImage->connect_clicked(LINK(this, SlideBackground, SelectBgHdl));
+ meUnit = maPaperSizeController.GetCoreMetric();
+
+ mxMasterSlide->connect_changed(LINK(this, SlideBackground, AssignMasterPage));
+
+ mxFillStyle->connect_changed(LINK(this, SlideBackground, FillStyleModifyHdl));
+ mxFillLB->SetSelectHdl(LINK(this, SlideBackground, FillColorHdl));
+ mxFillGrad1->SetSelectHdl(LINK(this, SlideBackground, FillColorHdl));
+ mxFillGrad2->SetSelectHdl(LINK(this, SlideBackground, FillColorHdl));
+ mxFillAttr->connect_changed(LINK(this, SlideBackground, FillBackgroundHdl));
+
+ ViewShell* pMainViewShell = mrBase.GetMainViewShell().get();
+ if (pMainViewShell)
+ {
+ FrameView *pFrameView = pMainViewShell->GetFrameView();
+
+ if ( pFrameView->GetViewShEditMode() == EditMode::Page )
+ {
+ SdPage* mpPage = pMainViewShell->getCurrentPage();
+ populateMasterSlideDropdown();
+
+ OUString aLayoutName( mpPage->GetLayoutName() );
+ aLayoutName = aLayoutName.copy(0,aLayoutName.indexOf(SD_LT_SEPARATOR));
+ mxMasterSlide->set_active_text(aLayoutName);
+ }
+ }
+
+ mxFillStyle->set_active(static_cast< sal_Int32 >(NONE));
+
+ mxDspMasterBackground->connect_toggled(LINK(this, SlideBackground, DspBackground));
+ mxDspMasterObjects->connect_toggled(LINK(this, SlideBackground, DspObjects));
+
+ //margins
+ mxMarginSelectBox->connect_changed(LINK(this, SlideBackground, ModifyMarginHdl));
+
+ Update();
+ UpdateMarginBox();
+}
+
+void SlideBackground::DumpAsPropertyTree(::tools::JsonWriter& rJsonWriter)
+{
+ if (mxPaperSizeBox->get_active() == -1)
+ {
+ mpBindings->Update(SID_ATTR_PAGE_SIZE);
+ }
+
+ PanelLayout::DumpAsPropertyTree(rJsonWriter);
+}
+
+void SlideBackground::HandleContextChange(
+ const vcl::EnumContext& rContext)
+{
+ if (maContext == rContext)
+ return;
+ maContext = rContext;
+
+ if ( IsImpress() )
+ {
+ mxMasterLabel->set_label(SdResId(STR_MASTERSLIDE_LABEL));
+
+ // margin selector is only for Draw
+ mxMarginSelectBox->hide();
+ mxMarginLabel->hide();
+
+ if ( maContext == maImpressMasterContext )
+ {
+ mxCloseMaster->show();
+ mxEditMaster->hide();
+ mxMasterSlide->set_sensitive(false);
+ mxMasterSlide->clear();
+ mxDspMasterBackground->set_sensitive(false);
+ mxDspMasterObjects->set_sensitive(false);
+ mxFillStyle->hide();
+ mxBackgroundLabel->hide();
+ mxInsertImage->show();
+
+ mxFillLB->hide();
+ mxFillAttr->hide();
+ mxFillGrad1->hide();
+ mxFillGrad2->hide();
+ }
+ else if ( maContext == maImpressHandoutContext || maContext == maImpressNotesContext )
+ {
+ mxCloseMaster->hide();
+ mxEditMaster->hide();
+ mxMasterSlide->set_sensitive(false);
+ mxMasterSlide->clear();
+ mxDspMasterBackground->set_sensitive(false);
+ mxDspMasterObjects->set_sensitive(false);
+ mxFillStyle->hide();
+ mxBackgroundLabel->hide();
+ mxInsertImage->hide();
+ }
+ else if (maContext == maImpressOtherContext)
+ {
+ mxCloseMaster->hide();
+ mxEditMaster->show();
+ mxMasterSlide->set_sensitive(true);
+ populateMasterSlideDropdown();
+ mxDspMasterBackground->set_sensitive(true);
+ mxDspMasterObjects->set_sensitive(true);
+ mxFillStyle->show();
+ mxBackgroundLabel->show();
+ mxInsertImage->show();
+ }
+
+ // Need to do a relayouting, otherwise the panel size is not updated after show / hide controls
+ if (m_pPanel)
+ m_pPanel->TriggerDeckLayouting();
+
+ }
+ else if ( IsDraw() )
+ {
+ mxMasterLabel->set_label(SdResId(STR_MASTERPAGE_LABEL));
+ mxDspMasterBackground->hide();
+ mxDspMasterObjects->hide();
+
+ if (maContext == maDrawOtherContext)
+ {
+ mxEditMaster->hide();
+ mxFillStyle->show();
+ mxBackgroundLabel->show();
+ }
+ else if (maContext == maDrawMasterContext)
+ {
+ mxFillStyle->hide();
+ mxBackgroundLabel->hide();
+ }
+ }
+
+ // The Insert Image button in the sidebar issues .uno:SelectBackground,
+ // which when invoked without arguments will open the file-open-dialog
+ // to prompt the user to select a file. This is useless in LOOL.
+ // Hide for now so the user will only be able to use the menu to insert
+ // background image, which prompts the user for file selection in the browser.
+ if (comphelper::LibreOfficeKit::isActive())
+ mxInsertImage->hide();
+}
+
+void SlideBackground::Update()
+{
+ eFillStyle nPos = static_cast<eFillStyle>(mxFillStyle->get_active());
+
+ if(maContext != maImpressOtherContext && maContext != maDrawOtherContext)
+ nPos = NONE;
+
+ SfxObjectShell* pSh = SfxObjectShell::Current();
+ if (!pSh)
+ return;
+
+ switch(nPos)
+ {
+ case NONE:
+ {
+ mxFillLB->hide();
+ mxFillAttr->hide();
+ mxFillGrad1->hide();
+ mxFillGrad2->hide();
+ }
+ break;
+ case SOLID:
+ {
+ mxFillAttr->hide();
+ mxFillGrad1->hide();
+ mxFillGrad2->hide();
+ mxFillLB->show();
+ const Color aColor = GetColorSetOrDefault();
+ mxFillLB->SelectEntry(aColor);
+ }
+ break;
+ case GRADIENT:
+ {
+ mxFillLB->hide();
+ mxFillAttr->hide();
+ mxFillGrad1->show();
+ mxFillGrad2->show();
+
+ const XGradient xGradient = GetGradientSetOrDefault();
+ const Color aStartColor = xGradient.GetStartColor();
+ mxFillGrad1->SelectEntry(aStartColor);
+ const Color aEndColor = xGradient.GetEndColor();
+ mxFillGrad2->SelectEntry(aEndColor);
+ }
+ break;
+
+ case HATCH:
+ {
+ mxFillLB->hide();
+ mxFillAttr->show();
+ mxFillAttr->clear();
+ SvxFillAttrBox::Fill(*mxFillAttr, pSh->GetItem(SID_HATCH_LIST)->GetHatchList());
+ mxFillGrad1->hide();
+ mxFillGrad2->hide();
+
+ const OUString aHatchName = GetHatchingSetOrDefault();
+ mxFillAttr->set_active_text( aHatchName );
+ }
+ break;
+
+ case BITMAP:
+ case PATTERN:
+ {
+ mxFillLB->hide();
+ mxFillAttr->show();
+ mxFillAttr->clear();
+ mxFillGrad1->hide();
+ mxFillGrad2->hide();
+ OUString aName;
+ if(nPos == BITMAP)
+ {
+ SvxFillAttrBox::Fill(*mxFillAttr, pSh->GetItem(SID_BITMAP_LIST)->GetBitmapList());
+ aName = GetBitmapSetOrDefault();
+ }
+ else if(nPos == PATTERN)
+ {
+ SvxFillAttrBox::Fill(*mxFillAttr, pSh->GetItem(SID_PATTERN_LIST)->GetPatternList());
+ aName = GetPatternSetOrDefault();
+ }
+ mxFillAttr->set_active_text( aName );
+ }
+ break;
+ default:
+ break;
+ }
+
+ // Need to do a relayouting, otherwise the panel size is not updated after show / hide controls
+ if (m_pPanel)
+ m_pPanel->TriggerDeckLayouting();
+}
+
+void SlideBackground::UpdateMarginBox()
+{
+ m_nPageLeftMargin = mpPageLRMarginItem->GetLeft();
+ m_nPageRightMargin = mpPageLRMarginItem->GetRight();
+ m_nPageTopMargin = mpPageULMarginItem->GetUpper();
+ m_nPageBottomMargin = mpPageULMarginItem->GetLower();
+
+ int nCustomIndex = mxMarginSelectBox->find_text(maCustomEntry);
+
+ if( IsNone(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) )
+ {
+ mxMarginSelectBox->set_active(0);
+ if (nCustomIndex != -1)
+ mxMarginSelectBox->remove(nCustomIndex);
+ }
+ else if( IsNarrow(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) )
+ {
+ mxMarginSelectBox->set_active(1);
+ if (nCustomIndex != -1)
+ mxMarginSelectBox->remove(nCustomIndex);
+ }
+ else if( IsModerate(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) )
+ {
+ mxMarginSelectBox->set_active(2);
+ if (nCustomIndex != -1)
+ mxMarginSelectBox->remove(nCustomIndex);
+ }
+ else if( IsNormal075(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) )
+ {
+ mxMarginSelectBox->set_active(3);
+ if (nCustomIndex != -1)
+ mxMarginSelectBox->remove(nCustomIndex);
+ }
+ else if( IsNormal100(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) )
+ {
+ mxMarginSelectBox->set_active(4);
+ if (nCustomIndex != -1)
+ mxMarginSelectBox->remove(nCustomIndex);
+ }
+ else if( IsNormal125(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) )
+ {
+ mxMarginSelectBox->set_active(5);
+ if (nCustomIndex != -1)
+ mxMarginSelectBox->remove(nCustomIndex);
+ }
+ else if( IsWide(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin) )
+ {
+ mxMarginSelectBox->set_active(6);
+ if (nCustomIndex != -1)
+ mxMarginSelectBox->remove(nCustomIndex);
+ }
+ else
+ {
+ if (nCustomIndex == -1)
+ mxMarginSelectBox->append_text(maCustomEntry);
+ mxMarginSelectBox->set_active_text(maCustomEntry);
+ }
+}
+
+void SlideBackground::SetPanelTitle( const OUString& rTitle )
+{
+ Reference<frame::XController2> xController( mxFrame->getController(), uno::UNO_QUERY);
+ if ( !xController.is() )
+ return;
+
+ Reference<ui::XSidebarProvider> xSidebarProvider = xController->getSidebar();
+ if ( !xSidebarProvider.is() )
+ return;
+
+ Reference<ui::XDecks> xDecks = xSidebarProvider->getDecks();
+ if ( !xDecks.is() )
+ return;
+
+ Reference<ui::XDeck> xDeck ( xDecks->getByName("PropertyDeck"), uno::UNO_QUERY);
+ if ( !xDeck.is() )
+ return;
+
+ Reference<ui::XPanels> xPanels = xDeck->getPanels();
+ if ( !xPanels.is() )
+ return;
+
+ if (xPanels->hasByName("SlideBackgroundPanel"))
+ {
+ Reference<ui::XPanel> xPanel ( xPanels->getByName("SlideBackgroundPanel"), uno::UNO_QUERY);
+ if ( !xPanel.is() )
+ return;
+
+ xPanel->setTitle( rTitle );
+ }
+}
+
+void SlideBackground::addListener()
+{
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this, SlideBackground, EventMultiplexerListener) );
+ mrBase.GetEventMultiplexer()->AddEventListener( aLink );
+}
+
+void SlideBackground::removeListener()
+{
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this, SlideBackground, EventMultiplexerListener) );
+ mrBase.GetEventMultiplexer()->RemoveEventListener( aLink );
+}
+
+IMPL_LINK(SlideBackground, EventMultiplexerListener,
+ tools::EventMultiplexerEvent&, rEvent, void)
+{
+ switch (rEvent.meEventId)
+ {
+ // add more events as per requirement
+ // Master Page change triggers a shape change event. Solves sync problem.
+ case EventMultiplexerEventId::ShapeChanged:
+ populateMasterSlideDropdown();
+ break;
+ case EventMultiplexerEventId::EditModeNormal:
+ mbSwitchModeToNormal = true;
+ break;
+ case EventMultiplexerEventId::EditModeMaster:
+ mbSwitchModeToMaster = true;
+ break;
+ case EventMultiplexerEventId::EditViewSelection:
+ case EventMultiplexerEventId::EndTextEdit:
+ {
+ if ( mbSwitchModeToMaster )
+ {
+ if( IsImpress() )
+ SetPanelTitle(SdResId(STR_MASTERSLIDE_NAME));
+ else
+ SetPanelTitle(SdResId(STR_MASTERPAGE_NAME));
+ mbSwitchModeToMaster = false;
+ }
+ else if ( mbSwitchModeToNormal )
+ {
+ if( IsImpress() )
+ SetPanelTitle(SdResId(STR_SLIDE_NAME));
+ else
+ SetPanelTitle(SdResId(STR_PAGE_NAME));
+ mbSwitchModeToNormal = false;
+ }
+
+ }
+ break;
+ case EventMultiplexerEventId::CurrentPageChanged:
+ {
+ static const sal_uInt16 SidArray[] = {
+ SID_ATTR_PAGE_COLOR,
+ SID_ATTR_PAGE_GRADIENT,
+ SID_ATTR_PAGE_HATCH,
+ SID_ATTR_PAGE_BITMAP,
+ SID_ATTR_PAGE_FILLSTYLE,
+ SID_DISPLAY_MASTER_BACKGROUND,
+ SID_DISPLAY_MASTER_OBJECTS,
+ 0 };
+ updateMasterSlideSelection();
+ GetBindings()->Invalidate( SidArray );
+ }
+ break;
+ case EventMultiplexerEventId::ViewAdded:
+ {
+ if(!mbTitle)
+ {
+ if( IsDraw() )
+ {
+ mxCloseMaster->hide();
+ mxEditMaster->hide();
+ if( maContext == maDrawMasterContext)
+ SetPanelTitle(SdResId(STR_MASTERPAGE_NAME));
+ else
+ SetPanelTitle(SdResId(STR_PAGE_NAME));
+ }
+ else if ( maContext == maImpressOtherContext || maContext == maImpressMasterContext )
+ {
+ if( maContext == maImpressMasterContext )
+ SetPanelTitle(SdResId(STR_MASTERSLIDE_NAME));
+ else
+ SetPanelTitle(SdResId(STR_SLIDE_NAME));
+ }
+ else if ( maContext == maImpressNotesContext )
+ {
+ mxMasterLabel->set_label(SdResId(STR_MASTERSLIDE_LABEL));
+ ViewShell* pMainViewShell = mrBase.GetMainViewShell().get();
+
+ if (pMainViewShell)
+ {
+ DrawViewShell* pDrawViewShell = static_cast<DrawViewShell*>(pMainViewShell);
+ if ( pDrawViewShell->GetEditMode() == EditMode::MasterPage)
+ SetPanelTitle(SdResId(STR_MASTERSLIDE_NAME));
+ else // EditMode::Page
+ SetPanelTitle(SdResId(STR_SLIDE_NAME));
+ }
+ }
+ mbTitle = true;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void SlideBackground::populateMasterSlideDropdown()
+{
+ mxMasterSlide->clear();
+ ::sd::DrawDocShell* pDocSh = dynamic_cast<::sd::DrawDocShell*>( SfxObjectShell::Current() );
+ SdDrawDocument* pDoc = pDocSh ? pDocSh->GetDoc() : nullptr;
+ sal_uInt16 nCount = pDoc ? pDoc->GetMasterPageCount() : 0;
+ for( sal_uInt16 nLayout = 0; nLayout < nCount; nLayout++ )
+ {
+ SdPage* pMaster = static_cast<SdPage*>(pDoc->GetMasterPage(nLayout));
+ if( pMaster->GetPageKind() == PageKind::Standard)
+ {
+ OUString aLayoutName(pMaster->GetLayoutName());
+ aLayoutName = aLayoutName.copy(0,aLayoutName.indexOf(SD_LT_SEPARATOR));
+ mxMasterSlide->append_text(aLayoutName);
+ }
+ }
+ updateMasterSlideSelection();
+}
+
+void SlideBackground::updateMasterSlideSelection()
+{
+ ViewShell* pMainViewShell = mrBase.GetMainViewShell().get();
+ SdPage* pPage = pMainViewShell ? pMainViewShell->getCurrentPage() : nullptr;
+ if (pPage != nullptr && pPage->TRG_HasMasterPage())
+ {
+ SdrPage& rMasterPage (pPage->TRG_GetMasterPage());
+ SdPage* pMasterPage = static_cast<SdPage*>(&rMasterPage);
+ mxMasterSlide->set_active_text(pMasterPage->GetName());
+ }
+}
+
+SlideBackground::~SlideBackground()
+{
+ removeListener();
+
+ mxCustomEntry.reset();
+ mxMarginLabel.reset();
+ mxPaperSizeBox.reset();
+ mxPaperOrientation.reset();
+ mxMasterSlide.reset();
+ mxBackgroundLabel.reset();
+ mxFillAttr.reset();
+ mxFillGrad1.reset();
+ mxFillGrad2.reset();
+ mxFillStyle.reset();
+ mxFillLB.reset();
+ mxInsertImage.reset();
+ mxMarginSelectBox.reset();
+ mxDspMasterBackground.reset();
+ mxDspMasterObjects.reset();
+ mxMasterLabel.reset();
+ mxEditMaster.reset();
+ mxCloseMaster.reset();
+
+ maPaperSizeController.dispose();
+ maPaperOrientationController.dispose();
+ maPaperMarginLRController.dispose();
+ maPaperMarginULController.dispose();
+ maBckColorController.dispose();
+ maBckGradientController.dispose();
+ maBckHatchController.dispose();
+ maBckBitmapController.dispose();
+ maBckFillStyleController.dispose();
+ maBckImageController.dispose();
+ maDspBckController.dispose();
+ maDspObjController.dispose();
+ maMetricController.dispose();
+ maCloseMasterController.dispose();
+
+ mpPageItem.reset();
+ mpColorItem.reset();
+ mpHatchItem.reset();
+ mpBitmapItem.reset();
+ mpPageLRMarginItem.reset();
+ mpPageULMarginItem.reset();
+}
+
+void SlideBackground::ExecuteMarginLRChange(const ::tools::Long mnPageLeftMargin, const ::tools::Long mnPageRightMargin)
+{
+ mpPageLRMarginItem->SetLeft(mnPageLeftMargin);
+ mpPageLRMarginItem->SetRight(mnPageRightMargin);
+ GetBindings()->GetDispatcher()->ExecuteList( SID_ATTR_PAGE_LRSPACE, SfxCallMode::RECORD, { mpPageLRMarginItem.get() } );
+}
+
+void SlideBackground::ExecuteMarginULChange(const ::tools::Long mnPageTopMargin, const ::tools::Long mnPageBottomMargin)
+{
+ mpPageULMarginItem->SetUpper(mnPageTopMargin);
+ mpPageULMarginItem->SetLower(mnPageBottomMargin);
+ GetBindings()->GetDispatcher()->ExecuteList( SID_ATTR_PAGE_ULSPACE, SfxCallMode::RECORD, { mpPageULMarginItem.get() } );
+}
+
+Color const & SlideBackground::GetColorSetOrDefault()
+{
+ // Tango Sky Blue 1, to be consistent w/ area fill panel (b/c COL_AUTO for slides is transparent)
+ if ( !mpColorItem )
+ mpColorItem.reset( new XFillColorItem( OUString(), Color(0x72, 0x9f, 0xcf) ) );
+
+ return mpColorItem->GetColorValue();
+}
+
+XGradient const & SlideBackground::GetGradientSetOrDefault()
+{
+ if( !mpGradientItem )
+ {
+ XGradient aGradient;
+ OUString aGradientName;
+ if (SfxObjectShell* pSh = SfxObjectShell::Current())
+ {
+ const SvxGradientListItem * pGradListItem = pSh->GetItem(SID_GRADIENT_LIST);
+ aGradient = pGradListItem->GetGradientList()->GetGradient(0)->GetGradient();
+ aGradientName = pGradListItem->GetGradientList()->GetGradient(0)->GetName();
+ }
+ mpGradientItem.reset( new XFillGradientItem( aGradientName, aGradient ) );
+ }
+
+ return mpGradientItem->GetGradientValue();
+}
+
+OUString const & SlideBackground::GetHatchingSetOrDefault()
+{
+ if( !mpHatchItem )
+ {
+ XHatch aHatch;
+ OUString aHatchName;
+ if (SfxObjectShell* pSh = SfxObjectShell::Current())
+ {
+ const SvxHatchListItem * pHatchListItem = pSh->GetItem(SID_HATCH_LIST);
+ aHatch = pHatchListItem->GetHatchList()->GetHatch(0)->GetHatch();
+ aHatchName = pHatchListItem->GetHatchList()->GetHatch(0)->GetName();
+ }
+ mpHatchItem.reset( new XFillHatchItem( aHatchName, aHatch ) );
+ }
+
+ return mpHatchItem->GetName();
+}
+
+OUString const & SlideBackground::GetBitmapSetOrDefault()
+{
+ if( !mpBitmapItem || mpBitmapItem->isPattern())
+ {
+ GraphicObject aGraphObj;
+ OUString aBmpName;
+ if (SfxObjectShell* pSh = SfxObjectShell::Current())
+ {
+ const SvxBitmapListItem * pBmpListItem = pSh->GetItem(SID_BITMAP_LIST);
+ aGraphObj = pBmpListItem->GetBitmapList()->GetBitmap(0)->GetGraphicObject();
+ aBmpName = pBmpListItem->GetBitmapList()->GetBitmap(0)->GetName();
+ }
+ mpBitmapItem.reset( new XFillBitmapItem( aBmpName, aGraphObj ) );
+ }
+
+ return mpBitmapItem->GetName();
+}
+
+OUString const & SlideBackground::GetPatternSetOrDefault()
+{
+ if( !mpBitmapItem || !(mpBitmapItem->isPattern()))
+ {
+ GraphicObject aGraphObj;
+ OUString aPtrnName;
+ if (SfxObjectShell* pSh = SfxObjectShell::Current())
+ {
+ const SvxPatternListItem * pPtrnListItem = pSh->GetItem(SID_PATTERN_LIST);
+ aGraphObj = pPtrnListItem->GetPatternList()->GetBitmap(0)->GetGraphicObject();
+ aPtrnName = pPtrnListItem->GetPatternList()->GetBitmap(0)->GetName();
+ }
+ mpBitmapItem.reset( new XFillBitmapItem( aPtrnName, aGraphObj ) );
+ }
+
+ return mpBitmapItem->GetName();
+}
+
+void SlideBackground::NotifyItemUpdate(
+ const sal_uInt16 nSID,
+ const SfxItemState eState,
+ const SfxPoolItem* pState)
+{
+ switch(nSID)
+ {
+
+ case SID_ATTR_PAGE_COLOR:
+ {
+ if(eState >= SfxItemState::DEFAULT)
+ {
+ mxFillStyle->set_active(static_cast< sal_Int32 >(SOLID));
+ mpColorItem.reset(pState ? static_cast< XFillColorItem* >(pState->Clone()) : nullptr);
+ Update();
+ }
+ }
+ break;
+
+ case SID_ATTR_PAGE_HATCH:
+ {
+ if(eState >= SfxItemState::DEFAULT)
+ {
+ mxFillStyle->set_active(static_cast< sal_Int32 >(HATCH));
+ mpHatchItem.reset(pState ? static_cast < XFillHatchItem* >(pState->Clone()) : nullptr);
+ Update();
+ }
+ }
+ break;
+
+ case SID_ATTR_PAGE_GRADIENT:
+ {
+ if(eState >= SfxItemState::DEFAULT)
+ {
+ mxFillStyle->set_active(static_cast< sal_Int32>(GRADIENT));
+ mpGradientItem.reset(pState ? static_cast< XFillGradientItem* >(pState->Clone()) : nullptr);
+ Update();
+ }
+ }
+ break;
+ case SID_ATTR_PAGE_BITMAP:
+ {
+ if(eState >= SfxItemState::DEFAULT)
+ {
+ mpBitmapItem.reset(pState ? static_cast< XFillBitmapItem* >(pState->Clone()) : nullptr);
+ if(mpBitmapItem)
+ {
+ if(mpBitmapItem->isPattern())
+ mxFillStyle->set_active(static_cast< sal_Int32 >(PATTERN));
+ else
+ mxFillStyle->set_active(static_cast< sal_Int32 >(BITMAP));
+ }
+ else
+ mxFillStyle->set_active(static_cast< sal_Int32 >(BITMAP));
+ Update();
+ }
+ }
+ break;
+
+ case SID_ATTR_PAGE_FILLSTYLE:
+ {
+ const XFillStyleItem* pFillStyleItem = nullptr;
+ if (eState >= SfxItemState::DEFAULT)
+ pFillStyleItem = dynamic_cast< const XFillStyleItem* >(pState);
+ if (pFillStyleItem)
+ {
+ css::drawing::FillStyle eXFS = pFillStyleItem->GetValue();
+ switch(eXFS)
+ {
+ case drawing::FillStyle_NONE:
+ mxFillStyle->set_active(static_cast< sal_Int32 >(NONE));
+ break;
+ case drawing::FillStyle_SOLID:
+ mxFillStyle->set_active(static_cast< sal_Int32 >(SOLID));
+ break;
+ case drawing::FillStyle_GRADIENT:
+ mxFillStyle->set_active(static_cast< sal_Int32 >(GRADIENT));
+ break;
+ case drawing::FillStyle_HATCH:
+ mxFillStyle->set_active(static_cast< sal_Int32 >(HATCH));
+ break;
+ case drawing::FillStyle_BITMAP:
+ {
+ if(mpBitmapItem->isPattern())
+ mxFillStyle->set_active(static_cast< sal_Int32 >(PATTERN));
+ else
+ mxFillStyle->set_active(static_cast< sal_Int32 >(BITMAP));
+ }
+ break;
+ default:
+ break;
+ }
+ Update();
+ }
+ }
+ break;
+
+ case SID_ATTR_PAGE_SIZE:
+ {
+ const SvxSizeItem* pSizeItem = nullptr;
+ if (eState >= SfxItemState::DEFAULT)
+ pSizeItem = dynamic_cast<const SvxSizeItem*>(pState);
+ if (pSizeItem)
+ {
+ Size aPaperSize = pSizeItem->GetSize();
+ if (mxPaperOrientation->get_active() == 0)
+ Swap(aPaperSize);
+
+ Paper ePaper = SvxPaperInfo::GetSvxPaper(aPaperSize, meUnit);
+ mxPaperSizeBox->set_active_id( ePaper );
+ }
+ }
+ break;
+
+ case SID_ATTR_PAGE:
+ {
+ const SvxPageItem* pPageItem = nullptr;
+ if (eState >= SfxItemState::DEFAULT)
+ pPageItem = dynamic_cast<const SvxPageItem*>(pState);
+ if (pPageItem)
+ {
+ mpPageItem.reset(pPageItem->Clone());
+ bool bIsLandscape = mpPageItem->IsLandscape();
+ mxPaperOrientation->set_active( bIsLandscape ? 0 : 1 );
+ }
+ }
+ break;
+
+ case SID_ATTR_PAGE_LRSPACE:
+ {
+ const SvxLongLRSpaceItem* pLRItem = nullptr;
+ if (eState >= SfxItemState::DEFAULT)
+ pLRItem = dynamic_cast<const SvxLongLRSpaceItem*>(pState);
+ if (pLRItem)
+ {
+ mpPageLRMarginItem.reset( static_cast<SvxLongLRSpaceItem*>(pState->Clone()) );
+ UpdateMarginBox();
+ }
+ }
+ break;
+
+ case SID_ATTR_PAGE_ULSPACE:
+ {
+ const SvxLongULSpaceItem* pULItem = nullptr;
+ if (eState >= SfxItemState::DEFAULT)
+ pULItem = dynamic_cast<const SvxLongULSpaceItem*>(pState);
+ if (pULItem)
+ {
+ mpPageULMarginItem.reset( static_cast<SvxLongULSpaceItem*>(pState->Clone()) );
+ UpdateMarginBox();
+ }
+ }
+ break;
+
+ case SID_DISPLAY_MASTER_BACKGROUND:
+ {
+ const SfxBoolItem* pBoolItem = nullptr;
+ if (eState >= SfxItemState::DEFAULT)
+ pBoolItem = dynamic_cast< const SfxBoolItem* >(pState);
+ if (pBoolItem)
+ mxDspMasterBackground->set_active(pBoolItem->GetValue());
+ }
+ break;
+ case SID_DISPLAY_MASTER_OBJECTS:
+ {
+ const SfxBoolItem* pBoolItem = nullptr;
+ if (eState >= SfxItemState::DEFAULT)
+ pBoolItem = dynamic_cast< const SfxBoolItem* >(pState);
+ if (pBoolItem)
+ mxDspMasterObjects->set_active(pBoolItem->GetValue());
+ }
+ break;
+ case SID_SELECT_BACKGROUND:
+ {
+ if(eState >= SfxItemState::DEFAULT)
+ {
+ mxFillStyle->set_active(static_cast< sal_Int32 >(BITMAP));
+ Update();
+ }
+ }
+ break;
+ case SID_ATTR_METRIC:
+ {
+ FieldUnit eFUnit = GetCurrentUnit(eState, pState);
+ if (meFUnit != eFUnit)
+ {
+ meFUnit = eFUnit;
+ SetMarginsFieldUnit();
+ UpdateMarginBox();
+ }
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+IMPL_LINK_NOARG(SlideBackground, FillStyleModifyHdl, weld::ComboBox&, void)
+{
+ const eFillStyle nPos = static_cast<eFillStyle>(mxFillStyle->get_active());
+ Update();
+
+ switch (nPos)
+ {
+ case NONE:
+ {
+ const XFillStyleItem aXFillStyleItem(drawing::FillStyle_NONE);
+ GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_FILLSTYLE, SfxCallMode::RECORD, { &aXFillStyleItem });
+ }
+ break;
+
+ case SOLID:
+ {
+ if (mpColorItem)
+ {
+ const XFillColorItem aItem( OUString(), mpColorItem->GetColorValue() );
+ GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_COLOR, SfxCallMode::RECORD, { &aItem });
+ }
+ }
+ break;
+
+ case GRADIENT:
+ {
+ if (mpGradientItem)
+ {
+ const XFillGradientItem aItem( mpGradientItem->GetName(), mpGradientItem->GetGradientValue() );
+ GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_GRADIENT, SfxCallMode::RECORD, { &aItem });
+ }
+ }
+ break;
+
+ case HATCH:
+ {
+ if (mpHatchItem)
+ {
+ const XFillHatchItem aItem( mpHatchItem->GetName(), mpHatchItem->GetHatchValue() );
+ GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_HATCH, SfxCallMode::RECORD, { &aItem });
+ }
+ }
+ break;
+
+ case BITMAP:
+ case PATTERN:
+ {
+ if (mpBitmapItem)
+ {
+ const XFillBitmapItem aItem( mpBitmapItem->GetName(), mpBitmapItem->GetGraphicObject() );
+ GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_BITMAP, SfxCallMode::RECORD, { &aItem });
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+//TODO mxFillStyle->Selected();
+}
+
+IMPL_LINK_NOARG(SlideBackground, PaperSizeModifyHdl, weld::ComboBox&, void)
+{
+ const Paper ePaper = mxPaperSizeBox->get_active_id();
+ Size aSize(SvxPaperInfo::GetPaperSize(ePaper, meUnit));
+
+ if (mxPaperOrientation->get_active() == 0)
+ Swap(aSize);
+
+ mpPageItem->SetLandscape(mxPaperOrientation->get_active() == 0);
+ const SvxSizeItem aSizeItem(SID_ATTR_PAGE_SIZE, aSize);
+ // Page/slide properties dialog (FuPage::ExecuteDialog and ::ApplyItemSet) misuses
+ // SID_ATTR_PAGE_EXT1 to distinguish between Impress and Draw, as for whether to fit
+ // objects to paper size. Until that is handled somehow better, we do the same here
+ const SfxBoolItem aFitObjs(SID_ATTR_PAGE_EXT1, IsImpress());
+
+ GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_SIZE, SfxCallMode::RECORD,
+ { &aSizeItem, mpPageItem.get(), &aFitObjs });
+
+ // Notify LOK clients of the page size change.
+ if (!comphelper::LibreOfficeKit::isActive())
+ return;
+
+ SfxViewShell* pViewShell = SfxViewShell::GetFirst();
+ while (pViewShell)
+ {
+ if (pViewShell->GetDocId() == mrBase.GetDocId())
+ {
+ SdXImpressDocument* pDoc = comphelper::getFromUnoTunnel<SdXImpressDocument>(pViewShell->GetCurrentDocument());
+ SfxLokHelper::notifyDocumentSizeChangedAllViews(pDoc);
+ }
+ pViewShell = SfxViewShell::GetNext(*pViewShell);
+ }
+}
+
+IMPL_LINK_NOARG(SlideBackground, FillColorHdl, ColorListBox&, void)
+{
+ const drawing::FillStyle eXFS = static_cast<drawing::FillStyle>(mxFillStyle->get_active());
+ switch(eXFS)
+ {
+ case drawing::FillStyle_SOLID:
+ {
+ XFillColorItem aItem(OUString(), mxFillLB->GetSelectEntryColor());
+ GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_COLOR, SfxCallMode::RECORD, { &aItem });
+ }
+ break;
+ case drawing::FillStyle_GRADIENT:
+ {
+ XGradient aGradient;
+ aGradient.SetStartColor(mxFillGrad1->GetSelectEntryColor());
+ aGradient.SetEndColor(mxFillGrad2->GetSelectEntryColor());
+
+ // the name doesn't really matter, it'll be converted to unique one eventually,
+ // but it has to be non-empty
+ XFillGradientItem aItem("gradient", aGradient);
+ GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_GRADIENT, SfxCallMode::RECORD, { &aItem });
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+IMPL_LINK_NOARG(SlideBackground, FillBackgroundHdl, weld::ComboBox&, void)
+{
+ const eFillStyle nFillPos = static_cast<eFillStyle>(mxFillStyle->get_active());
+ SfxObjectShell* pSh = SfxObjectShell::Current();
+ if (!pSh)
+ return;
+ switch(nFillPos)
+ {
+
+ case HATCH:
+ {
+ const SvxHatchListItem * pHatchListItem = pSh->GetItem(SID_HATCH_LIST);
+ sal_uInt16 nPos = mxFillAttr->get_active();
+ XHatch aHatch = pHatchListItem->GetHatchList()->GetHatch(nPos)->GetHatch();
+ const OUString aHatchName = pHatchListItem->GetHatchList()->GetHatch(nPos)->GetName();
+
+ XFillHatchItem aItem(aHatchName, aHatch);
+ GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_HATCH, SfxCallMode::RECORD, { &aItem });
+ }
+ break;
+
+ case BITMAP:
+ case PATTERN:
+ {
+ sal_Int16 nPos = mxFillAttr->get_active();
+ GraphicObject aBitmap;
+ OUString aName;
+ if( nFillPos == BITMAP )
+ {
+ SvxBitmapListItem const * pBitmapListItem = pSh->GetItem(SID_BITMAP_LIST);
+ aBitmap = pBitmapListItem->GetBitmapList()->GetBitmap(nPos)->GetGraphicObject();
+ aName = pBitmapListItem->GetBitmapList()->GetBitmap(nPos)->GetName();
+ }
+ else if( nFillPos == PATTERN )
+ {
+ SvxPatternListItem const * pPatternListItem = pSh->GetItem(SID_PATTERN_LIST);
+ aBitmap = pPatternListItem->GetPatternList()->GetBitmap(nPos)->GetGraphicObject();
+ aName = pPatternListItem->GetPatternList()->GetBitmap(nPos)->GetName();
+ }
+ XFillBitmapItem aItem(aName, aBitmap);
+ GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_BITMAP, SfxCallMode::RECORD, { &aItem });
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+IMPL_LINK_NOARG(SlideBackground, AssignMasterPage, weld::ComboBox&, void)
+{
+ ::sd::DrawDocShell* pDocSh = dynamic_cast<::sd::DrawDocShell*>( SfxObjectShell::Current() );
+ SdDrawDocument* pDoc = pDocSh ? pDocSh->GetDoc() : nullptr;
+ if (!pDoc)
+ return;
+
+ auto pSSVS = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(mrBase);
+ if (pSSVS == nullptr)
+ return;
+
+ auto& rSSController = pSSVS->GetSlideSorter().GetController();
+ auto& rPageSelector = rSSController.GetPageSelector();
+
+ for( sal_uInt16 nPage = 0; nPage < pDoc->GetSdPageCount(PageKind::Standard); nPage++ )
+ {
+ if (rPageSelector.IsPageSelected(nPage))
+ {
+ OUString aLayoutName(mxMasterSlide->get_active_text());
+ pDoc->SetMasterPage(nPage, aLayoutName, pDoc, false, false);
+ }
+ }
+}
+
+IMPL_LINK_NOARG(SlideBackground, EditMasterHdl, weld::Button&, void)
+{
+ GetBindings()->GetDispatcher()->Execute( SID_SLIDE_MASTER_MODE, SfxCallMode::RECORD );
+}
+
+IMPL_LINK_NOARG(SlideBackground, SelectBgHdl, weld::Button&, void)
+{
+ GetBindings()->GetDispatcher()->Execute( SID_SELECT_BACKGROUND, SfxCallMode::RECORD );
+}
+
+IMPL_LINK_NOARG(SlideBackground, CloseMasterHdl, weld::Button&, void)
+{
+ GetBindings()->GetDispatcher()->Execute( SID_CLOSE_MASTER_VIEW, SfxCallMode::RECORD );
+}
+
+IMPL_LINK_NOARG(SlideBackground, DspBackground, weld::Toggleable&, void)
+{
+ bool IsChecked = mxDspMasterBackground->get_active();
+ const SfxBoolItem aBoolItem(SID_DISPLAY_MASTER_BACKGROUND, IsChecked);
+ GetBindings()->GetDispatcher()->ExecuteList(SID_DISPLAY_MASTER_BACKGROUND, SfxCallMode::RECORD, { &aBoolItem });
+}
+
+IMPL_LINK_NOARG(SlideBackground, DspObjects, weld::Toggleable&, void)
+{
+ bool IsChecked = mxDspMasterObjects->get_active();
+ const SfxBoolItem aBoolItem(SID_DISPLAY_MASTER_OBJECTS,IsChecked);
+ GetBindings()->GetDispatcher()->ExecuteList(SID_DISPLAY_MASTER_OBJECTS, SfxCallMode::RECORD, { &aBoolItem, &aBoolItem });
+}
+
+IMPL_LINK_NOARG( SlideBackground, ModifyMarginHdl, weld::ComboBox&, void )
+{
+ bool bApplyNewPageMargins = true;
+ switch ( mxMarginSelectBox->get_active() )
+ {
+ case 0:
+ SetNone(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin);
+ break;
+ case 1:
+ SetNarrow(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin);
+ break;
+ case 2:
+ SetModerate(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin);
+ break;
+ case 3:
+ SetNormal075(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin);
+ break;
+ case 4:
+ SetNormal100(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin);
+ break;
+ case 5:
+ SetNormal125(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin);
+ break;
+ case 6:
+ SetWide(m_nPageLeftMargin, m_nPageRightMargin, m_nPageTopMargin, m_nPageBottomMargin);
+ break;
+ default:
+ bApplyNewPageMargins = false;
+ break;
+ }
+
+ if(bApplyNewPageMargins)
+ {
+ ExecuteMarginLRChange(m_nPageLeftMargin, m_nPageRightMargin);
+ ExecuteMarginULChange(m_nPageTopMargin, m_nPageBottomMargin);
+ }
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/sidebar/SlideBackground.hxx b/sd/source/ui/sidebar/SlideBackground.hxx
new file mode 100644
index 000000000..25af0a4af
--- /dev/null
+++ b/sd/source/ui/sidebar/SlideBackground.hxx
@@ -0,0 +1,180 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <sfx2/sidebar/PanelLayout.hxx>
+#include <sfx2/sidebar/ControllerItem.hxx>
+#include <svx/papersizelistbox.hxx>
+#include <sfx2/sidebar/IContextChangeReceiver.hxx>
+#include <vcl/EnumContext.hxx>
+
+#include <com/sun/star/frame/XFrame.hpp>
+
+namespace sd { class ViewShellBase; }
+namespace sd::tools { class EventMultiplexerEvent; }
+
+class ColorListBox;
+class SvxPageItem;
+class SvxLongLRSpaceItem;
+class SvxLongULSpaceItem;
+class XFillColorItem;
+class XGradient;
+class XFillGradientItem;
+class XFillBitmapItem;
+class XFillHatchItem;
+
+namespace sd::sidebar {
+
+class SlideBackground :
+ public PanelLayout,
+ public ::sfx2::sidebar::IContextChangeReceiver,
+ public ::sfx2::sidebar::ControllerItem::ItemUpdateReceiverInterface
+{
+public:
+ SlideBackground(
+ weld::Widget* pParent,
+ ViewShellBase& rBase,
+ const css::uno::Reference<css::frame::XFrame>& rxFrame,
+ SfxBindings* pBindings );
+ virtual ~SlideBackground() override;
+ SfxBindings* GetBindings() { return mpBindings; }
+ // Window
+ virtual void NotifyItemUpdate(
+ const sal_uInt16 nSID,
+ const SfxItemState eState,
+ const SfxPoolItem* pState) override;
+
+ virtual void GetControlState(
+ const sal_uInt16 /*nSId*/,
+ boost::property_tree::ptree& /*rState*/) override {};
+
+ virtual void HandleContextChange(
+ const vcl::EnumContext& rContext) override;
+ virtual void DumpAsPropertyTree(::tools::JsonWriter&) override;
+
+private:
+
+ ViewShellBase& mrBase;
+
+ std::unique_ptr<SvxPaperSizeListBox> mxPaperSizeBox;
+ std::unique_ptr<weld::ComboBox> mxPaperOrientation;
+ std::unique_ptr<weld::ComboBox> mxMasterSlide;
+ std::unique_ptr<weld::Label> mxBackgroundLabel;
+ std::unique_ptr<weld::ComboBox> mxFillStyle;
+ std::unique_ptr<ColorListBox> mxFillLB;
+ std::unique_ptr<weld::ComboBox> mxFillAttr;
+ std::unique_ptr<ColorListBox> mxFillGrad1;
+ std::unique_ptr<ColorListBox> mxFillGrad2;
+ std::unique_ptr<weld::Button> mxInsertImage;
+ std::unique_ptr<weld::CheckButton> mxDspMasterBackground;
+ std::unique_ptr<weld::CheckButton> mxDspMasterObjects;
+ std::unique_ptr<weld::Button> mxCloseMaster;
+ std::unique_ptr<weld::Button> mxEditMaster;
+ std::unique_ptr<weld::Label> mxMasterLabel;
+ std::unique_ptr<weld::ComboBox> mxMarginSelectBox;
+ std::unique_ptr<weld::Label> mxCustomEntry;
+ std::unique_ptr<weld::Label> mxMarginLabel;
+
+ ::sfx2::sidebar::ControllerItem maPaperSizeController;
+ ::sfx2::sidebar::ControllerItem maPaperOrientationController;
+ ::sfx2::sidebar::ControllerItem maPaperMarginLRController;
+ ::sfx2::sidebar::ControllerItem maPaperMarginULController;
+ ::sfx2::sidebar::ControllerItem maBckColorController;
+ ::sfx2::sidebar::ControllerItem maBckGradientController;
+ ::sfx2::sidebar::ControllerItem maBckHatchController;
+ ::sfx2::sidebar::ControllerItem maBckBitmapController;
+ ::sfx2::sidebar::ControllerItem maBckFillStyleController;
+ ::sfx2::sidebar::ControllerItem maBckImageController;
+ ::sfx2::sidebar::ControllerItem maDspBckController;
+ ::sfx2::sidebar::ControllerItem maDspObjController;
+ ::sfx2::sidebar::ControllerItem maMetricController;
+ ::sfx2::sidebar::ControllerItem maCloseMasterController;
+
+ std::unique_ptr< SvxPageItem > mpPageItem;
+ std::unique_ptr< XFillColorItem > mpColorItem;
+ std::unique_ptr< XFillGradientItem > mpGradientItem;
+ std::unique_ptr< XFillHatchItem > mpHatchItem;
+ std::unique_ptr< XFillBitmapItem > mpBitmapItem;
+
+ bool mbSwitchModeToNormal;
+ bool mbSwitchModeToMaster;
+
+ css::uno::Reference<css::frame::XFrame> mxFrame;
+ vcl::EnumContext maContext;
+ vcl::EnumContext maDrawOtherContext;
+ vcl::EnumContext maDrawMasterContext;
+ vcl::EnumContext maImpressOtherContext;
+ vcl::EnumContext maImpressMasterContext;
+ vcl::EnumContext maImpressHandoutContext;
+ vcl::EnumContext maImpressNotesContext;
+ bool mbTitle;
+ std::unique_ptr<SvxLongLRSpaceItem> mpPageLRMarginItem;
+ std::unique_ptr<SvxLongULSpaceItem> mpPageULMarginItem;
+ ::tools::Long m_nPageLeftMargin;
+ ::tools::Long m_nPageRightMargin;
+ ::tools::Long m_nPageTopMargin;
+ ::tools::Long m_nPageBottomMargin;
+ FieldUnit meFUnit;
+ OUString maCustomEntry;
+
+ SfxBindings* mpBindings;
+
+ MapUnit meUnit;
+
+ DECL_LINK(FillBackgroundHdl, weld::ComboBox&, void);
+ DECL_LINK(FillStyleModifyHdl, weld::ComboBox&, void);
+ DECL_LINK(PaperSizeModifyHdl, weld::ComboBox&, void);
+ DECL_LINK(FillColorHdl, ColorListBox&, void);
+ DECL_LINK(AssignMasterPage, weld::ComboBox&, void);
+ DECL_LINK(DspBackground, weld::Toggleable&, void);
+ DECL_LINK(DspObjects, weld::Toggleable&, void);
+ DECL_LINK(CloseMasterHdl, weld::Button&, void);
+ DECL_LINK(EditMasterHdl, weld::Button&, void);
+ DECL_LINK(SelectBgHdl, weld::Button&, void);
+ DECL_LINK(EventMultiplexerListener, tools::EventMultiplexerEvent&, void );
+ DECL_LINK( ModifyMarginHdl, weld::ComboBox&, void );
+
+ void Initialize();
+ void Update();
+ void UpdateMarginBox();
+ void SetPanelTitle(const OUString& rTitle);
+ void SetMarginsFieldUnit();
+
+ Color const & GetColorSetOrDefault();
+ XGradient const & GetGradientSetOrDefault();
+ OUString const & GetHatchingSetOrDefault();
+ OUString const & GetBitmapSetOrDefault();
+ OUString const & GetPatternSetOrDefault();
+ bool IsDraw();
+ bool IsImpress();
+ void addListener();
+ void removeListener();
+ void ExecuteMarginLRChange(const ::tools::Long mnPageLeftMargin, const ::tools::Long mnPageRightMargin);
+ void ExecuteMarginULChange(const ::tools::Long mnPageTopMargin, const ::tools::Long mnPageBottomMargin);
+ void populateMasterSlideDropdown();
+ void updateMasterSlideSelection();
+
+ static FieldUnit GetCurrentUnit(SfxItemState eState, const SfxPoolItem* pState);
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slideshow/PaneHider.cxx b/sd/source/ui/slideshow/PaneHider.cxx
new file mode 100644
index 000000000..85858c0b6
--- /dev/null
+++ b/sd/source/ui/slideshow/PaneHider.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/.
+ *
+ * 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 "PaneHider.hxx"
+
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include "slideshowimpl.hxx"
+#include <framework/FrameworkHelper.hxx>
+
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/XConfiguration.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/lang/DisposedException.hpp>
+
+#include <tools/diagnose_ex.h>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+using ::sd::framework::FrameworkHelper;
+using ::com::sun::star::lang::DisposedException;
+
+namespace sd
+{
+PaneHider::PaneHider(const ViewShell& rViewShell, SlideshowImpl* pSlideShow)
+{
+ // Hide the left and right pane windows when a slideshow exists and is
+ // not full screen.
+ if (pSlideShow == nullptr || pSlideShow->isFullScreen())
+ return;
+
+ try
+ {
+ Reference<XControllerManager> xControllerManager(
+ rViewShell.GetViewShellBase().GetController(), UNO_QUERY_THROW);
+ mxConfigurationController = xControllerManager->getConfigurationController();
+ if (mxConfigurationController.is())
+ {
+ // Get and save the current configuration.
+ mxConfiguration = mxConfigurationController->getRequestedConfiguration();
+ if (mxConfiguration.is())
+ {
+ // Iterate over the resources and deactivate the panes.
+ const Sequence<Reference<XResourceId>> aResources(mxConfiguration->getResources(
+ nullptr, framework::FrameworkHelper::msPaneURLPrefix,
+ AnchorBindingMode_DIRECT));
+ for (const Reference<XResourceId>& xPaneId : aResources)
+ {
+ if (xPaneId->getResourceURL() != FrameworkHelper::msCenterPaneURL)
+ {
+ mxConfigurationController->requestResourceDeactivation(xPaneId);
+ }
+ }
+ }
+ }
+ FrameworkHelper::Instance(rViewShell.GetViewShellBase())->WaitForUpdate();
+ }
+ catch (RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+}
+
+PaneHider::~PaneHider()
+{
+ if (mxConfiguration.is() && mxConfigurationController.is())
+ {
+ try
+ {
+ mxConfigurationController->restoreConfiguration(mxConfiguration);
+ }
+ catch (DisposedException&)
+ {
+ // When the configuration controller is already disposed then
+ // there is no point in restoring the configuration.
+ }
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slideshow/PaneHider.hxx b/sd/source/ui/slideshow/PaneHider.hxx
new file mode 100644
index 000000000..a2d3cabb0
--- /dev/null
+++ b/sd/source/ui/slideshow/PaneHider.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Reference.hxx>
+
+namespace com::sun::star::drawing::framework
+{
+class XConfiguration;
+}
+namespace com::sun::star::drawing::framework
+{
+class XConfigurationController;
+}
+
+namespace sd
+{
+class ViewShell;
+class SlideshowImpl;
+
+/** Hide the windows of the side panes and restore the original visibility
+ later. Used by the in-window slide show in order to use the whole frame
+ window for the show.
+*/
+class PaneHider
+{
+public:
+ /** The constructor hides all side panes that belong to the
+ ViewShellBase of the given view shell.
+ */
+ PaneHider(const ViewShell& rViewShell, SlideshowImpl* pSlideShow);
+
+ /** Restore the original visibility of the side panes.
+ */
+ ~PaneHider();
+
+private:
+ /** Remember whether the visibility states of the windows of the panes
+ has been modified and have to be restored.
+ */
+
+ css::uno::Reference<css::drawing::framework::XConfigurationController>
+ mxConfigurationController;
+ css::uno::Reference<css::drawing::framework::XConfiguration> mxConfiguration;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slideshow/SlideShowRestarter.cxx b/sd/source/ui/slideshow/SlideShowRestarter.cxx
new file mode 100644
index 000000000..b8c61ba48
--- /dev/null
+++ b/sd/source/ui/slideshow/SlideShowRestarter.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/.
+ *
+ * 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 <DrawController.hxx>
+#include <ViewShellBase.hxx>
+#include <slideshow.hxx>
+#include "SlideShowRestarter.hxx"
+
+#include <comphelper/propertyvalue.hxx>
+#include <framework/ConfigurationController.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svx/svxids.hrc>
+#include <vcl/svapp.hxx>
+
+#include <functional>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using ::sd::framework::FrameworkHelper;
+
+namespace sd {
+
+SlideShowRestarter::SlideShowRestarter (
+ const ::rtl::Reference<SlideShow>& rpSlideShow,
+ ViewShellBase* pViewShellBase)
+ : mnEventId(nullptr),
+ mpSlideShow(rpSlideShow),
+ mpViewShellBase(pViewShellBase),
+ mnDisplayCount(Application::GetScreenCount()),
+ mpDispatcher(pViewShellBase->GetViewFrame()->GetDispatcher()),
+ mnCurrentSlideNumber(0)
+{
+}
+
+SlideShowRestarter::~SlideShowRestarter()
+{
+}
+
+void SlideShowRestarter::Restart (bool bForce)
+{
+ // Prevent multiple and concurrently restarts.
+ if (mnEventId != nullptr)
+ return;
+
+ if (bForce)
+ mnDisplayCount = 0;
+
+ // Remember the current slide in order to restore it after the slide
+ // show has been restarted.
+ if (mpSlideShow.is())
+ mnCurrentSlideNumber = mpSlideShow->getCurrentPageNumber();
+
+ // Remember a shared pointer to this object to prevent its destruction
+ // before the whole restarting process has finished.
+ mpSelf = shared_from_this();
+
+ // We do not know in what situation this method was called. So, in
+ // order to be able to cleanly stop the presentation, we do that
+ // asynchronously.
+ mnEventId = Application::PostUserEvent(
+ LINK(this, SlideShowRestarter, EndPresentation));
+}
+
+IMPL_LINK_NOARG(SlideShowRestarter, EndPresentation, void*, void)
+{
+ mnEventId = nullptr;
+ if (!mpSlideShow.is())
+ return;
+
+ if (mnDisplayCount == static_cast<sal_Int32>(Application::GetScreenCount()))
+ return;
+
+ bool bIsExitAfterPresenting = mpSlideShow->IsExitAfterPresenting();
+ mpSlideShow->SetExitAfterPresenting(false);
+ mpSlideShow->end();
+ mpSlideShow->SetExitAfterPresenting(bIsExitAfterPresenting);
+
+ // The following piece of code should not be here because the
+ // slide show should be aware of the existence of the presenter
+ // console (which is displayed in the FullScreenPane). But the
+ // timing has to be right and I did not find a better place for
+ // it.
+
+ // Wait for the full screen pane, which displays the presenter
+ // console, to disappear. Only when it is gone, call
+ // InitiatePresenterStart(), in order to begin the asynchronous
+ // restart of the slide show.
+ if (mpViewShellBase == nullptr)
+ return;
+
+ ::std::shared_ptr<FrameworkHelper> pHelper(
+ FrameworkHelper::Instance(*mpViewShellBase));
+ if (pHelper->GetConfigurationController()->getResource(
+ FrameworkHelper::CreateResourceId(FrameworkHelper::msFullScreenPaneURL)).is())
+ {
+ ::sd::framework::ConfigurationController::Lock aLock (
+ pHelper->GetConfigurationController());
+
+ pHelper->RunOnConfigurationEvent(
+ FrameworkHelper::msConfigurationUpdateEndEvent,
+ ::std::bind(&SlideShowRestarter::StartPresentation, shared_from_this()));
+ pHelper->UpdateConfiguration();
+ }
+ else
+ {
+ StartPresentation();
+ }
+}
+
+void SlideShowRestarter::StartPresentation()
+{
+ //rhbz#1091117 crash because we're exiting the application, and this is
+ //being called during the configuration update event on exit. At this point
+ //newly created objects won't get disposed called on them, because the
+ //disposer is doing its last execution of that now.
+ if (mpViewShellBase && mpViewShellBase->GetDrawController().IsDisposing())
+ return;
+
+ if (mpDispatcher == nullptr && mpViewShellBase!=nullptr)
+ mpDispatcher = mpViewShellBase->GetViewFrame()->GetDispatcher();
+
+ // Start the slide show on the saved current slide.
+ if (mpDispatcher != nullptr)
+ {
+ mpDispatcher->Execute(SID_PRESENTATION, SfxCallMode::ASYNCHRON);
+ if (mpSlideShow.is())
+ {
+ Sequence aProperties{ comphelper::makePropertyValue("FirstPage",
+ "page" + OUString::number(mnCurrentSlideNumber+1)) };
+ mpSlideShow->startWithArguments(aProperties);
+ }
+ mpSelf.reset();
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slideshow/SlideShowRestarter.hxx b/sd/source/ui/slideshow/SlideShowRestarter.hxx
new file mode 100644
index 000000000..e8e97a600
--- /dev/null
+++ b/sd/source/ui/slideshow/SlideShowRestarter.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <rtl/ref.hxx>
+#include <tools/link.hxx>
+#include <memory>
+
+namespace sd
+{
+class SlideShow;
+}
+namespace sd
+{
+class ViewShellBase;
+}
+class SfxDispatcher;
+struct ImplSVEvent;
+
+namespace sd
+{
+/** This class is used when a display is removed or added to restart the
+ slide show. This is necessary at least with DirectX because
+ deactivating a display invalidates DirectX resources. Accessing those
+ leads to a crash.
+
+ During a restart a possibly installed presenter extension is given the
+ opportunity to show or hide depending on the number of available displays.
+*/
+class SlideShowRestarter : public std::enable_shared_from_this<SlideShowRestarter>
+{
+public:
+ /** Create a new SlideShowRestarter object.
+ @param rpSlideShow
+ The slide show is used to determine the current slide, which is
+ restored after the restart, and of course to stop and start the
+ slide show.
+ @param pViewShellBase
+ Used to get access to a slot dispatcher.
+ */
+ SlideShowRestarter(const ::rtl::Reference<SlideShow>& rpSlideShow,
+ ViewShellBase* pViewShellBase);
+ virtual ~SlideShowRestarter();
+
+ /** Restarting the slide show is an asynchronous multi step process
+ which is started by calling this method.
+ @param bForce
+ Used to force a re-start, even if the display count is unchanged.
+ */
+ void Restart(bool bForce);
+
+private:
+ ImplSVEvent* mnEventId;
+ ::rtl::Reference<SlideShow> mpSlideShow;
+ ViewShellBase* mpViewShellBase;
+ ::std::shared_ptr<SlideShowRestarter> mpSelf;
+ sal_Int32 mnDisplayCount;
+ SfxDispatcher* mpDispatcher;
+ sal_Int32 mnCurrentSlideNumber;
+
+ DECL_LINK(EndPresentation, void*, void);
+
+ /** Restart the presentation on the slide last shown before the restart
+ was initiated.
+ */
+ void StartPresentation();
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slideshow/showwin.cxx b/sd/source/ui/slideshow/showwin.cxx
new file mode 100644
index 000000000..35c0a4027
--- /dev/null
+++ b/sd/source/ui/slideshow/showwin.cxx
@@ -0,0 +1,629 @@
+/* -*- 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 <com/sun/star/awt/Key.hpp>
+
+#include "showwindow.hxx"
+#include "slideshowimpl.hxx"
+
+#include <unotools/localedatawrapper.hxx>
+#include <unotools/syslocale.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/sfxsids.hrc>
+
+
+#include <slideshow.hxx>
+#include <ViewShell.hxx>
+#include <sdresid.hxx>
+#include <helpids.h>
+#include <strings.hrc>
+
+#include <sal/log.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/virdev.hxx>
+
+using namespace ::com::sun::star;
+
+namespace sd {
+
+const sal_uInt64 HIDE_MOUSE_TIMEOUT = 10000;
+const sal_uInt64 SHOW_MOUSE_TIMEOUT = 1000;
+
+ShowWindow::ShowWindow( const ::rtl::Reference< SlideshowImpl >& xController, vcl::Window* pParent )
+: ::sd::Window( pParent )
+, maPauseTimer("sd ShowWindow maPauseTimer")
+, maMouseTimer("sd ShowWindow maMouseTimer")
+, mnPauseTimeout( SLIDE_NO_TIMEOUT )
+, mnRestartPageIndex( PAGE_NO_END )
+, meShowWindowMode(SHOWWINDOWMODE_NORMAL)
+, mbShowNavigatorAfterSpecialMode( false )
+, mbMouseAutoHide(true)
+, mbMouseCursorHidden(false)
+, mnFirstMouseMove(0)
+, mxController( xController )
+{
+ GetOutDev()->SetOutDevViewType( OutDevViewType::SlideShow );
+
+ // Do never mirror the preview window. This explicitly includes right
+ // to left writing environments.
+ EnableRTL (false);
+
+ MapMode aMap(GetMapMode());
+ aMap.SetMapUnit(MapUnit::Map100thMM);
+ SetMapMode(aMap);
+
+ // set HelpId
+ SetHelpId( HID_SD_WIN_PRESENTATION );
+
+ maPauseTimer.SetInvokeHandler( LINK( this, ShowWindow, PauseTimeoutHdl ) );
+ maPauseTimer.SetTimeout( 1000 );
+ maMouseTimer.SetInvokeHandler( LINK( this, ShowWindow, MouseTimeoutHdl ) );
+ maMouseTimer.SetTimeout( HIDE_MOUSE_TIMEOUT );
+
+ maShowBackground = Wallpaper( COL_BLACK );
+ SetBackground(); // avoids that VCL paints any background!
+ GetParent()->Show();
+ AddEventListener( LINK( this, ShowWindow, EventHdl ) );
+}
+
+ShowWindow::~ShowWindow()
+{
+ disposeOnce();
+}
+
+void ShowWindow::dispose()
+{
+ maPauseTimer.Stop();
+ maMouseTimer.Stop();
+ ::sd::Window::dispose();
+}
+
+void ShowWindow::KeyInput(const KeyEvent& rKEvt)
+{
+ bool bReturn = false;
+
+ if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode )
+ {
+ TerminateShow();
+ bReturn = true;
+ }
+ else if( SHOWWINDOWMODE_END == meShowWindowMode )
+ {
+ const int nKeyCode = rKEvt.GetKeyCode().GetCode();
+ switch( nKeyCode )
+ {
+ case KEY_PAGEUP:
+ case KEY_LEFT:
+ case KEY_UP:
+ case KEY_P:
+ case KEY_HOME:
+ case KEY_END:
+ case awt::Key::CONTEXTMENU:
+ // these keys will be handled by the slide show even
+ // while in end mode
+ break;
+ default:
+ TerminateShow();
+ bReturn = true;
+ }
+ }
+ else if( SHOWWINDOWMODE_BLANK == meShowWindowMode )
+ {
+ bool bFakeKeyPress = rKEvt.GetKeyCode().GetFullCode() == 0;
+ // Ignore workaround of https://gitlab.gnome.org/GNOME/gtk/issues/1785
+ // See calls to GtkSalFrame::makeFakeKeyPress (Fixed in GTK 2.34)
+ if (!bFakeKeyPress)
+ RestartShow();
+ bReturn = true;
+ }
+ else if( SHOWWINDOWMODE_PAUSE == meShowWindowMode )
+ {
+ const int nKeyCode = rKEvt.GetKeyCode().GetCode();
+ switch( nKeyCode )
+ {
+ case KEY_ESCAPE:
+ TerminateShow();
+ bReturn = true;
+ break;
+ case KEY_PAGEUP:
+ case KEY_RIGHT:
+ case KEY_UP:
+ case KEY_P:
+ case KEY_HOME:
+ case KEY_END:
+ case awt::Key::CONTEXTMENU:
+ // these keys will be handled by the slide show even
+ // while in end mode
+ break;
+ default:
+ RestartShow();
+ bReturn = true;
+ break;
+ }
+ }
+
+ if( !bReturn )
+ {
+ if( mxController.is() )
+ bReturn = mxController->keyInput(rKEvt);
+
+ if( !bReturn )
+ {
+ if( mpViewShell )
+ {
+ mpViewShell->KeyInput(rKEvt,this);
+ }
+ else
+ {
+ Window::KeyInput(rKEvt);
+ }
+ }
+ }
+
+ if( mpViewShell )
+ mpViewShell->SetActiveWindow( this );
+}
+
+void ShowWindow::MouseButtonDown(const MouseEvent& /*rMEvt*/)
+{
+ if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode )
+ {
+ TerminateShow();
+ }
+ else if( mpViewShell )
+ {
+ mpViewShell->SetActiveWindow( this );
+ }
+}
+
+void ShowWindow::MouseMove(const MouseEvent& /*rMEvt*/)
+{
+ if( mbMouseAutoHide )
+ {
+ if( mbMouseCursorHidden )
+ {
+ if( mnFirstMouseMove )
+ {
+ // if this is not the first mouse move while hidden, see if
+ // enough time has pasted to show mouse pointer again
+ sal_uInt64 nTime = ::tools::Time::GetSystemTicks();
+ if( (nTime - mnFirstMouseMove) >= SHOW_MOUSE_TIMEOUT )
+ {
+ ShowPointer( true );
+ mnFirstMouseMove = 0;
+ mbMouseCursorHidden = false;
+ maMouseTimer.SetTimeout( HIDE_MOUSE_TIMEOUT );
+ maMouseTimer.Start();
+ }
+ }
+ else
+ {
+ // if this is the first mouse move, note current
+ // time and start idle timer to cancel show mouse pointer
+ // again if not enough mouse movement is measured
+ mnFirstMouseMove = ::tools::Time::GetSystemTicks();
+ maMouseTimer.SetTimeout( 2*SHOW_MOUSE_TIMEOUT );
+ maMouseTimer.Start();
+ }
+ }
+ else
+ {
+ // current mousemove restarts the idle timer to hide the mouse
+ maMouseTimer.Start();
+ }
+ }
+
+ if( mpViewShell )
+ mpViewShell->SetActiveWindow( this );
+}
+
+void ShowWindow::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode )
+ {
+ TerminateShow();
+ }
+ else if( (SHOWWINDOWMODE_END == meShowWindowMode) && !rMEvt.IsRight() )
+ {
+ TerminateShow();
+ }
+ else if( (( SHOWWINDOWMODE_BLANK == meShowWindowMode ) || ( SHOWWINDOWMODE_PAUSE == meShowWindowMode ))
+ && !rMEvt.IsRight() )
+ {
+ RestartShow();
+ }
+ else
+ {
+ if( mxController.is() )
+ mxController->mouseButtonUp( rMEvt );
+ }
+}
+
+/**
+ * if FuSlideShow is still available, forward it
+ */
+void ShowWindow::Paint(vcl::RenderContext& /*rRenderContext*/, const ::tools::Rectangle& rRect)
+{
+ if( (meShowWindowMode == SHOWWINDOWMODE_NORMAL) || (meShowWindowMode == SHOWWINDOWMODE_PREVIEW) )
+ {
+ if( mxController.is() )
+ {
+ mxController->paint();
+ }
+ else if(mpViewShell )
+ {
+ mpViewShell->Paint(rRect, this);
+ }
+ }
+ else
+ {
+ GetOutDev()->DrawWallpaper( rRect, maShowBackground );
+
+ if( SHOWWINDOWMODE_END == meShowWindowMode )
+ {
+ DrawEndScene();
+ }
+ else if( SHOWWINDOWMODE_PAUSE == meShowWindowMode )
+ {
+ DrawPauseScene( false );
+ }
+ else if( SHOWWINDOWMODE_BLANK == meShowWindowMode )
+ {
+ // just blank through background color => nothing to be done here
+ }
+ }
+}
+
+void ShowWindow::LoseFocus()
+{
+ Window::LoseFocus();
+
+ if( SHOWWINDOWMODE_PREVIEW == meShowWindowMode)
+ TerminateShow();
+}
+
+void ShowWindow::SetEndMode()
+{
+ if( !(( SHOWWINDOWMODE_NORMAL == meShowWindowMode ) && mpViewShell && mpViewShell->GetView()) )
+ return;
+
+ DeleteWindowFromPaintView();
+ meShowWindowMode = SHOWWINDOWMODE_END;
+ maShowBackground = Wallpaper( COL_BLACK );
+
+ // hide navigator if it is visible
+ if( mpViewShell->GetViewFrame()->GetChildWindow( SID_NAVIGATOR ) )
+ {
+ mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, false );
+ mbShowNavigatorAfterSpecialMode = true;
+ }
+
+ Invalidate();
+}
+
+bool ShowWindow::SetPauseMode( sal_Int32 nTimeout, Graphic const * pLogo )
+{
+ rtl::Reference< SlideShow > xSlideShow;
+
+ if( mpViewShell )
+ xSlideShow = SlideShow::GetSlideShow( mpViewShell->GetViewShellBase() );
+
+ if( xSlideShow.is() && !nTimeout )
+ {
+ xSlideShow->jumpToPageIndex( 0 );
+ }
+ else if( ( SHOWWINDOWMODE_NORMAL == meShowWindowMode ) && mpViewShell && mpViewShell->GetView() )
+ {
+ DeleteWindowFromPaintView();
+ mnPauseTimeout = nTimeout;
+ mnRestartPageIndex = 0;
+ meShowWindowMode = SHOWWINDOWMODE_PAUSE;
+ maShowBackground = Wallpaper( COL_BLACK );
+
+ // hide navigator if it is visible
+ if( mpViewShell->GetViewFrame()->GetChildWindow( SID_NAVIGATOR ) )
+ {
+ mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, false );
+ mbShowNavigatorAfterSpecialMode = true;
+ }
+
+ if( pLogo )
+ maLogo = *pLogo;
+
+ Invalidate();
+
+ if( SLIDE_NO_TIMEOUT != mnPauseTimeout )
+ maPauseTimer.Start();
+ }
+
+ return( SHOWWINDOWMODE_PAUSE == meShowWindowMode );
+}
+
+bool ShowWindow::SetBlankMode( sal_Int32 nPageIndexToRestart, const Color& rBlankColor )
+{
+ if( ( SHOWWINDOWMODE_NORMAL == meShowWindowMode ) && mpViewShell && mpViewShell->GetView() )
+ {
+ DeleteWindowFromPaintView();
+ mnRestartPageIndex = nPageIndexToRestart;
+ meShowWindowMode = SHOWWINDOWMODE_BLANK;
+ maShowBackground = Wallpaper( rBlankColor );
+
+ // hide navigator if it is visible
+ if( mpViewShell->GetViewFrame()->GetChildWindow( SID_NAVIGATOR ) )
+ {
+ mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR, false );
+ mbShowNavigatorAfterSpecialMode = true;
+ }
+
+ Invalidate();
+ }
+
+ return( SHOWWINDOWMODE_BLANK == meShowWindowMode );
+}
+
+void ShowWindow::SetPreviewMode()
+{
+ meShowWindowMode = SHOWWINDOWMODE_PREVIEW;
+}
+
+void ShowWindow::TerminateShow()
+{
+ maLogo.Clear();
+ maPauseTimer.Stop();
+ maMouseTimer.Stop();
+ GetOutDev()->Erase();
+ maShowBackground = Wallpaper( COL_BLACK );
+ meShowWindowMode = SHOWWINDOWMODE_NORMAL;
+ mnPauseTimeout = SLIDE_NO_TIMEOUT;
+
+ if( mpViewShell )
+ {
+ // show navigator?
+ if( mbShowNavigatorAfterSpecialMode )
+ {
+ mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR );
+ mbShowNavigatorAfterSpecialMode = false;
+ }
+ }
+
+ if( mxController.is() )
+ mxController->endPresentation();
+
+ mnRestartPageIndex = PAGE_NO_END;
+}
+
+void ShowWindow::RestartShow()
+{
+ RestartShow( mnRestartPageIndex );
+}
+
+void ShowWindow::RestartShow( sal_Int32 nPageIndexToRestart )
+{
+ ShowWindowMode eOldShowWindowMode = meShowWindowMode;
+
+ maLogo.Clear();
+ maPauseTimer.Stop();
+ GetOutDev()->Erase();
+ maShowBackground = Wallpaper( COL_BLACK );
+ meShowWindowMode = SHOWWINDOWMODE_NORMAL;
+ mnPauseTimeout = SLIDE_NO_TIMEOUT;
+
+ if( mpViewShell )
+ {
+ rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( mpViewShell->GetViewShellBase() ) );
+
+ if( xSlideShow.is() )
+ {
+ AddWindowToPaintView();
+
+ if( SHOWWINDOWMODE_BLANK == eOldShowWindowMode || SHOWWINDOWMODE_END == eOldShowWindowMode )
+ {
+ xSlideShow->pause(false);
+ Invalidate();
+ }
+ else
+ {
+ xSlideShow->jumpToPageIndex( nPageIndexToRestart );
+ }
+ }
+ }
+
+ mnRestartPageIndex = PAGE_NO_END;
+
+ // show navigator?
+ if( mbShowNavigatorAfterSpecialMode )
+ {
+ if (mpViewShell)
+ mpViewShell->GetViewFrame()->ShowChildWindow( SID_NAVIGATOR );
+ mbShowNavigatorAfterSpecialMode = false;
+ }
+}
+
+void ShowWindow::DrawPauseScene( bool bTimeoutOnly )
+{
+ const MapMode& rMap = GetMapMode();
+ const Point aOutOrg( PixelToLogic( Point() ) );
+ const Size aOutSize( GetOutDev()->GetOutputSize() );
+ const Size aTextSize(OutputDevice::LogicToLogic(Size(0, 14), MapMode(MapUnit::MapPoint), rMap));
+ const Size aOffset(OutputDevice::LogicToLogic(Size(1000, 1000), MapMode(MapUnit::Map100thMM), rMap));
+ OUString aText( SdResId( STR_PRES_PAUSE ) );
+ bool bDrawn = false;
+
+ vcl::Font aFont( GetSettings().GetStyleSettings().GetMenuFont() );
+ const vcl::Font aOldFont( GetFont() );
+
+ aFont.SetFontSize( aTextSize );
+ aFont.SetColor( COL_WHITE );
+ aFont.SetCharSet( aOldFont.GetCharSet() );
+ aFont.SetLanguage( aOldFont.GetLanguage() );
+
+ if( !bTimeoutOnly && ( maLogo.GetType() != GraphicType::NONE ) )
+ {
+ Size aGrfSize;
+
+ if (maLogo.GetPrefMapMode().GetMapUnit() == MapUnit::MapPixel)
+ aGrfSize = PixelToLogic( maLogo.GetPrefSize() );
+ else
+ aGrfSize = OutputDevice::LogicToLogic( maLogo.GetPrefSize(), maLogo.GetPrefMapMode(), rMap );
+
+ const Point aGrfPos( std::max( aOutOrg.X() + aOutSize.Width() - aGrfSize.Width() - aOffset.Width(), aOutOrg.X() ),
+ std::max( aOutOrg.Y() + aOutSize.Height() - aGrfSize.Height() - aOffset.Height(), aOutOrg.Y() ) );
+
+ if( maLogo.IsAnimated() )
+ maLogo.StartAnimation(*GetOutDev(), aGrfPos, aGrfSize, reinterpret_cast<sal_IntPtr>(this));
+ else
+ maLogo.Draw(*GetOutDev(), aGrfPos, aGrfSize);
+ }
+
+ if( SLIDE_NO_TIMEOUT != mnPauseTimeout )
+ {
+ MapMode aVMap( rMap );
+ ScopedVclPtrInstance< VirtualDevice > pVDev( *GetOutDev() );
+
+ aVMap.SetOrigin( Point() );
+ pVDev->SetMapMode( aVMap );
+ pVDev->SetBackground( Wallpaper( COL_BLACK ) );
+
+ // set font first, to determine real output height
+ pVDev->SetFont( aFont );
+
+ const Size aVDevSize( aOutSize.Width(), pVDev->GetTextHeight() );
+
+ if( pVDev->SetOutputSize( aVDevSize ) )
+ {
+ // Note: if performance gets an issue here, we can use NumberFormatter directly
+ SvtSysLocale aSysLocale;
+ const LocaleDataWrapper& aLocaleData = aSysLocale.GetLocaleData();
+
+ aText += " ( " + aLocaleData.getDuration( ::tools::Time( 0, 0, mnPauseTimeout ) ) + " )";
+ pVDev->DrawText( Point( aOffset.Width(), 0 ), aText );
+ GetOutDev()->DrawOutDev( Point( aOutOrg.X(), aOffset.Height() ), aVDevSize, Point(), aVDevSize, *pVDev );
+ bDrawn = true;
+ }
+ }
+
+ if( !bDrawn )
+ {
+ SetFont( aFont );
+ GetOutDev()->DrawText( Point( aOutOrg.X() + aOffset.Width(), aOutOrg.Y() + aOffset.Height() ), aText );
+ SetFont( aOldFont );
+ }
+}
+
+void ShowWindow::DrawEndScene()
+{
+ const vcl::Font aOldFont( GetFont() );
+ vcl::Font aFont( GetSettings().GetStyleSettings().GetMenuFont() );
+
+ const Point aOutOrg( PixelToLogic( Point() ) );
+ const Size aTextSize(OutputDevice::LogicToLogic(Size(0, 14), MapMode(MapUnit::MapPoint), GetMapMode()));
+ const OUString aText( SdResId( STR_PRES_SOFTEND ) );
+
+ aFont.SetFontSize( aTextSize );
+ aFont.SetColor( COL_WHITE );
+ aFont.SetCharSet( aOldFont.GetCharSet() );
+ aFont.SetLanguage( aOldFont.GetLanguage() );
+ SetFont( aFont );
+ GetOutDev()->DrawText( Point( aOutOrg.X() + aTextSize.Height(), aOutOrg.Y() + aTextSize.Height() ), aText );
+ SetFont( aOldFont );
+}
+
+IMPL_LINK( ShowWindow, PauseTimeoutHdl, Timer*, pTimer, void )
+{
+ if( !( --mnPauseTimeout ) )
+ RestartShow();
+ else
+ {
+ DrawPauseScene( true );
+ pTimer->Start();
+ }
+}
+
+IMPL_LINK_NOARG(ShowWindow, MouseTimeoutHdl, Timer *, void)
+{
+ if( mbMouseCursorHidden )
+ {
+ // not enough mouse movements since first recording so
+ // cancel show mouse pointer for now
+ mnFirstMouseMove = 0;
+ }
+ else
+ {
+ // mouse has been idle too long, hide pointer
+ ShowPointer( false );
+ mbMouseCursorHidden = true;
+ }
+}
+
+IMPL_LINK( ShowWindow, EventHdl, VclWindowEvent&, rEvent, void )
+{
+ if( mbMouseAutoHide )
+ {
+ if (rEvent.GetId() == VclEventId::WindowShow)
+ {
+ maMouseTimer.SetTimeout( HIDE_MOUSE_TIMEOUT );
+ maMouseTimer.Start();
+ }
+ }
+}
+
+void ShowWindow::DeleteWindowFromPaintView()
+{
+ if( mpViewShell->GetView() )
+ mpViewShell->GetView()->DeleteWindowFromPaintView( GetOutDev() );
+
+ sal_uInt16 nChild = GetChildCount();
+ while( nChild-- )
+ GetChild( nChild )->Show( false );
+}
+
+void ShowWindow::AddWindowToPaintView()
+{
+ if( mpViewShell->GetView() )
+ mpViewShell->GetView()->AddWindowToPaintView( GetOutDev(), nullptr );
+
+ sal_uInt16 nChild = GetChildCount();
+ while( nChild-- )
+ GetChild( nChild )->Show();
+}
+
+// Override the sd::Window's CreateAccessible to create a different accessible object
+css::uno::Reference<css::accessibility::XAccessible>
+ ShowWindow::CreateAccessible()
+{
+ css::uno::Reference< css::accessibility::XAccessible > xAcc = GetAccessible(false);
+ if (xAcc)
+ {
+ return xAcc;
+ }
+ if (mpViewShell != nullptr)
+ {
+ xAcc = mpViewShell->CreateAccessibleDocumentView (this);
+ SetAccessible(xAcc);
+ return xAcc;
+ }
+ else
+ {
+ SAL_WARN("sd", "::sd::Window::CreateAccessible: no view shell");
+ return vcl::Window::CreateAccessible ();
+ }
+}
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slideshow/showwindow.hxx b/sd/source/ui/slideshow/showwindow.hxx
new file mode 100644
index 000000000..f0f88228b
--- /dev/null
+++ b/sd/source/ui/slideshow/showwindow.hxx
@@ -0,0 +1,110 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <rtl/ref.hxx>
+#include <sal/types.h>
+#include <vcl/timer.hxx>
+#include <vcl/graph.hxx>
+
+#include <Window.hxx>
+
+namespace sd {
+
+class SlideshowImpl;
+
+#define SLIDE_NO_TIMEOUT SAL_MAX_INT32
+
+enum ShowWindowMode
+{
+ SHOWWINDOWMODE_NORMAL = 0,
+ SHOWWINDOWMODE_PAUSE = 1,
+ SHOWWINDOWMODE_END = 2,
+ SHOWWINDOWMODE_BLANK = 3,
+ SHOWWINDOWMODE_PREVIEW = 4
+};
+
+class ShowWindow
+ : public ::sd::Window
+{
+
+public:
+ ShowWindow ( const ::rtl::Reference< ::sd::SlideshowImpl >& xController, vcl::Window* pParent );
+ virtual ~ShowWindow() override;
+ virtual void dispose() override;
+
+ void SetEndMode();
+ bool SetPauseMode( sal_Int32 nTimeoutSec, Graphic const * pLogo = nullptr );
+ bool SetBlankMode( sal_Int32 nPageIndexToRestart, const Color& rBlankColor );
+
+ const Color& GetBlankColor() const { return maShowBackground.GetColor(); }
+
+ void SetPreviewMode();
+
+ void SetMouseAutoHide( bool bMouseAutoHide ) { mbMouseAutoHide = bMouseAutoHide; }
+
+ ShowWindowMode GetShowWindowMode() const { return meShowWindowMode; }
+
+ void RestartShow( sal_Int32 nPageIndexToRestart );
+
+ virtual void LoseFocus() override;
+
+ virtual void KeyInput(const KeyEvent& rKEvt) override;
+ virtual void MouseMove(const MouseEvent& rMEvt) override;
+ virtual void MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
+ virtual void Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect) override;
+ /// Override the sd::Window's CreateAccessible to create a different accessible object
+ virtual css::uno::Reference<css::accessibility::XAccessible>
+ CreateAccessible() override;
+
+ void TerminateShow();
+ void RestartShow();
+
+private:
+ void DrawPauseScene( bool bTimeoutOnly );
+ void DrawEndScene();
+
+ void DeleteWindowFromPaintView();
+ void AddWindowToPaintView();
+
+private:
+ Timer maPauseTimer;
+ Timer maMouseTimer;
+ Wallpaper maShowBackground;
+ Graphic maLogo;
+ sal_uLong mnPauseTimeout;
+ sal_Int32 mnRestartPageIndex;
+ ShowWindowMode meShowWindowMode;
+ bool mbShowNavigatorAfterSpecialMode;
+ bool mbMouseAutoHide;
+ bool mbMouseCursorHidden;
+ sal_uInt64 mnFirstMouseMove;
+
+ DECL_LINK( PauseTimeoutHdl, Timer*, void );
+ DECL_LINK(MouseTimeoutHdl, Timer *, void);
+ DECL_LINK( EventHdl, VclWindowEvent&, void );
+
+ ::rtl::Reference< SlideshowImpl > mxController;
+};
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slideshow/slideshow.cxx b/sd/source/ui/slideshow/slideshow.cxx
new file mode 100644
index 000000000..fa14c4de6
--- /dev/null
+++ b/sd/source/ui/slideshow/slideshow.cxx
@@ -0,0 +1,1191 @@
+/* -*- 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 <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/util/URL.hpp>
+
+#include <comphelper/propertyvalue.hxx>
+#include <cppuhelper/supportsservice.hxx>
+
+#include <sal/log.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/wrkwin.hxx>
+#include <svx/svdpool.hxx>
+#include <svx/svdlayer.hxx>
+#include <svl/itemprop.hxx>
+
+#include <sfx2/bindings.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/sfxsids.hrc>
+
+#include <framework/FrameworkHelper.hxx>
+#include <comphelper/extract.hxx>
+
+#include <FrameView.hxx>
+#include <createpresentation.hxx>
+#include <unomodel.hxx>
+#include <slideshow.hxx>
+#include "slideshowimpl.hxx"
+#include <sdattr.hrc>
+#include <sdmod.hxx>
+#include <FactoryIds.hxx>
+#include <DrawDocShell.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include "SlideShowRestarter.hxx"
+#include <DrawController.hxx>
+#include <PresentationViewShell.hxx>
+#include <customshowlist.hxx>
+#include <unopage.hxx>
+#include <sdpage.hxx>
+#include <cusshow.hxx>
+#include <optsitem.hxx>
+#include <strings.hrc>
+#include <sdresid.hxx>
+
+using ::com::sun::star::presentation::XSlideShowController;
+using ::sd::framework::FrameworkHelper;
+using ::com::sun::star::awt::XWindow;
+using namespace ::sd;
+using namespace ::cppu;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::animations;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace {
+ /** This local version of the work window overrides DataChanged() so that it
+ can restart the slide show when a display is added or removed.
+ */
+ class FullScreenWorkWindow : public WorkWindow
+ {
+ public:
+ FullScreenWorkWindow (
+ const ::rtl::Reference<SlideShow>& rpSlideShow,
+ ViewShellBase* pViewShellBase)
+ : WorkWindow(nullptr, WB_HIDE | WB_CLIPCHILDREN),
+ mpRestarter(std::make_shared<SlideShowRestarter>(rpSlideShow, pViewShellBase))
+ {}
+
+ void Restart(bool bForce)
+ {
+ mpRestarter->Restart(bForce);
+ }
+
+ virtual void DataChanged (const DataChangedEvent& rEvent) override
+ {
+ if (rEvent.GetType() == DataChangedEventType::DISPLAY)
+ Restart(false);
+ }
+
+ private:
+ ::std::shared_ptr<SlideShowRestarter> mpRestarter;
+ };
+}
+
+static const SfxItemPropertyMapEntry* ImplGetPresentationPropertyMap()
+{
+ // NOTE: First member must be sorted
+ static const SfxItemPropertyMapEntry aPresentationPropertyMap_Impl[] =
+ {
+ { u"AllowAnimations", ATTR_PRESENT_ANIMATION_ALLOWED, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"CustomShow", ATTR_PRESENT_CUSTOMSHOW, ::cppu::UnoType<OUString>::get(), 0, 0 },
+ { u"Display", ATTR_PRESENT_DISPLAY, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
+ { u"FirstPage", ATTR_PRESENT_DIANAME, ::cppu::UnoType<OUString>::get(), 0, 0 },
+ { u"IsAlwaysOnTop", ATTR_PRESENT_ALWAYS_ON_TOP, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"IsAutomatic", ATTR_PRESENT_MANUEL, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"IsEndless", ATTR_PRESENT_ENDLESS, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"IsFullScreen", ATTR_PRESENT_FULLSCREEN, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"IsShowAll", ATTR_PRESENT_ALL, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"IsMouseVisible", ATTR_PRESENT_MOUSE, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"IsShowLogo", ATTR_PRESENT_SHOW_PAUSELOGO, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"IsTransitionOnClick", ATTR_PRESENT_CHANGE_PAGE, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"Pause", ATTR_PRESENT_PAUSE_TIMEOUT, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
+ { u"StartWithNavigator", ATTR_PRESENT_NAVIGATOR, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"UsePen", ATTR_PRESENT_PEN, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"", 0, css::uno::Type(), 0, 0 }
+ };
+
+ return aPresentationPropertyMap_Impl;
+}
+
+
+SlideShow::SlideShow( SdDrawDocument* pDoc )
+: maPropSet(ImplGetPresentationPropertyMap(), SdrObject::GetGlobalDrawObjectItemPool())
+, mbIsInStartup(false)
+, mpDoc( pDoc )
+, mpCurrentViewShellBase( nullptr )
+, mpFullScreenViewShellBase( nullptr )
+, mpFullScreenFrameView( nullptr )
+, mnInPlaceConfigEvent( nullptr )
+{
+}
+
+void SlideShow::ThrowIfDisposed() const
+{
+ if( mpDoc == nullptr )
+ throw DisposedException();
+}
+
+/// used by the model to create a slideshow for it
+rtl::Reference< SlideShow > SlideShow::Create( SdDrawDocument* pDoc )
+{
+ return new SlideShow( pDoc );
+}
+
+rtl::Reference< SlideShow > SlideShow::GetSlideShow( SdDrawDocument const * pDocument )
+{
+ rtl::Reference< SlideShow > xRet;
+
+ if( pDocument )
+ xRet = GetSlideShow( *pDocument );
+
+ return xRet;
+}
+
+rtl::Reference< SlideShow > SlideShow::GetSlideShow( SdDrawDocument const & rDocument )
+{
+ return rtl::Reference< SlideShow >(
+ dynamic_cast< SlideShow* >( rDocument.getPresentation().get() ) );
+}
+
+rtl::Reference< SlideShow > SlideShow::GetSlideShow( ViewShellBase const & rBase )
+{
+ return GetSlideShow( rBase.GetDocument() );
+}
+
+css::uno::Reference< css::presentation::XSlideShowController > SlideShow::GetSlideShowController(ViewShellBase const & rBase )
+{
+ rtl::Reference< SlideShow > xSlideShow( GetSlideShow( rBase ) );
+
+ Reference< XSlideShowController > xRet;
+ if( xSlideShow.is() )
+ xRet = xSlideShow->getController();
+
+ return xRet;
+}
+
+bool SlideShow::StartPreview( ViewShellBase const & rBase,
+ const css::uno::Reference< css::drawing::XDrawPage >& xDrawPage,
+ const css::uno::Reference< css::animations::XAnimationNode >& xAnimationNode )
+{
+ rtl::Reference< SlideShow > xSlideShow( GetSlideShow( rBase ) );
+ if( !xSlideShow.is() )
+ return false;
+
+ xSlideShow->startPreview( xDrawPage, xAnimationNode );
+ return true;
+}
+
+void SlideShow::Stop( ViewShellBase const & rBase )
+{
+ rtl::Reference< SlideShow > xSlideShow( GetSlideShow( rBase ) );
+ if( xSlideShow.is() )
+ xSlideShow->end();
+}
+
+bool SlideShow::IsRunning( ViewShellBase const & rBase )
+{
+ rtl::Reference< SlideShow > xSlideShow( GetSlideShow( rBase ) );
+ return xSlideShow.is() && xSlideShow->isRunning();
+}
+
+bool SlideShow::IsRunning( const ViewShell& rViewShell )
+{
+ rtl::Reference< SlideShow > xSlideShow( GetSlideShow( rViewShell.GetViewShellBase() ) );
+ return xSlideShow.is() && xSlideShow->isRunning() && (xSlideShow->mxController->getViewShell() == &rViewShell);
+}
+
+void SlideShow::CreateController( ViewShell* pViewSh, ::sd::View* pView, vcl::Window* pParentWindow )
+{
+ SAL_INFO_IF( !mxController.is(), "sd.slideshow", "sd::SlideShow::CreateController(), clean up old controller first!" );
+
+ Reference< XPresentation2 > xThis( this );
+
+ rtl::Reference<SlideshowImpl> xController (
+ new SlideshowImpl(xThis, pViewSh, pView, mpDoc, pParentWindow));
+
+ // Reset mbIsInStartup. From here mxController.is() is used to prevent
+ // multiple slide show instances for one document.
+ mxController = xController;
+ mbIsInStartup = false;
+
+}
+
+// XServiceInfo
+OUString SAL_CALL SlideShow::getImplementationName( )
+{
+ return "com.sun.star.comp.sd.SlideShow";
+}
+
+sal_Bool SAL_CALL SlideShow::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+Sequence< OUString > SAL_CALL SlideShow::getSupportedServiceNames( )
+{
+ return { "com.sun.star.presentation.Presentation" };
+}
+
+// XPropertySet
+Reference< XPropertySetInfo > SAL_CALL SlideShow::getPropertySetInfo()
+{
+ SolarMutexGuard aGuard;
+ static Reference< XPropertySetInfo > xInfo = maPropSet.getPropertySetInfo();
+ return xInfo;
+ }
+
+void SAL_CALL SlideShow::setPropertyValue( const OUString& aPropertyName, const Any& aValue )
+{
+ SolarMutexGuard aGuard;
+ ThrowIfDisposed();
+
+ sd::PresentationSettings& rPresSettings = mpDoc->getPresentationSettings();
+
+ const SfxItemPropertyMapEntry* pEntry = maPropSet.getPropertyMapEntry(aPropertyName);
+
+ if( pEntry && ((pEntry->nFlags & PropertyAttribute::READONLY) != 0) )
+ throw PropertyVetoException();
+
+ bool bValuesChanged = false;
+ bool bIllegalArgument = true;
+
+ switch( pEntry ? pEntry->nWID : -1 )
+ {
+ case ATTR_PRESENT_ALL:
+ {
+ bool bVal = false;
+
+ if( aValue >>= bVal )
+ {
+ bIllegalArgument = false;
+
+ if( rPresSettings.mbAll != bVal )
+ {
+ rPresSettings.mbAll = bVal;
+ bValuesChanged = true;
+ if( bVal )
+ rPresSettings.mbCustomShow = false;
+ }
+ }
+ break;
+ }
+ case ATTR_PRESENT_CHANGE_PAGE:
+ {
+ bool bVal = false;
+
+ if( aValue >>= bVal )
+ {
+ bIllegalArgument = false;
+
+ if( bVal == rPresSettings.mbLockedPages )
+ {
+ bValuesChanged = true;
+ rPresSettings.mbLockedPages = !bVal;
+ }
+ }
+ break;
+ }
+
+ case ATTR_PRESENT_ANIMATION_ALLOWED:
+ {
+ bool bVal = false;
+
+ if( aValue >>= bVal )
+ {
+ bIllegalArgument = false;
+
+ if(rPresSettings.mbAnimationAllowed != bVal)
+ {
+ bValuesChanged = true;
+ rPresSettings.mbAnimationAllowed = bVal;
+ }
+ }
+ break;
+ }
+ case ATTR_PRESENT_CUSTOMSHOW:
+ {
+ OUString aShowName;
+ if( aValue >>= aShowName )
+ {
+ bIllegalArgument = false;
+
+ SdCustomShowList* pCustomShowList = mpDoc->GetCustomShowList();
+ if(pCustomShowList)
+ {
+ SdCustomShow* pCustomShow;
+ for( pCustomShow = pCustomShowList->First(); pCustomShow != nullptr; pCustomShow = pCustomShowList->Next() )
+ {
+ if( pCustomShow->GetName() == aShowName )
+ break;
+ }
+
+ rPresSettings.mbCustomShow = true;
+ bValuesChanged = true;
+ }
+ }
+ break;
+ }
+ case ATTR_PRESENT_ENDLESS:
+ {
+ bool bVal = false;
+
+ if( aValue >>= bVal )
+ {
+ bIllegalArgument = false;
+
+ if( rPresSettings.mbEndless != bVal)
+ {
+ bValuesChanged = true;
+ rPresSettings.mbEndless = bVal;
+ }
+ }
+ break;
+ }
+ case ATTR_PRESENT_FULLSCREEN:
+ {
+ bool bVal = false;
+
+ if( aValue >>= bVal )
+ {
+ bIllegalArgument = false;
+ if( rPresSettings.mbFullScreen != bVal)
+ {
+ bValuesChanged = true;
+ rPresSettings.mbFullScreen = bVal;
+ }
+ }
+ break;
+ }
+ case ATTR_PRESENT_DIANAME:
+ {
+ OUString aPresPage;
+ aValue >>= aPresPage;
+ bIllegalArgument = false;
+ if( (rPresSettings.maPresPage != aPresPage) || !rPresSettings.mbCustomShow || !rPresSettings.mbAll )
+ {
+ bValuesChanged = true;
+ rPresSettings.maPresPage = getUiNameFromPageApiNameImpl(aPresPage);
+ rPresSettings.mbCustomShow = false;
+ rPresSettings.mbAll = false;
+ }
+ break;
+ }
+ case ATTR_PRESENT_MANUEL:
+ {
+ bool bVal = false;
+
+ if( aValue >>= bVal )
+ {
+ bIllegalArgument = false;
+
+ if( rPresSettings.mbManual != bVal)
+ {
+ bValuesChanged = true;
+ rPresSettings.mbManual = bVal;
+ }
+ }
+ break;
+ }
+ case ATTR_PRESENT_MOUSE:
+ {
+ bool bVal = false;
+
+ if( aValue >>= bVal )
+ {
+ bIllegalArgument = false;
+ if( rPresSettings.mbMouseVisible != bVal)
+ {
+ bValuesChanged = true;
+ rPresSettings.mbMouseVisible = bVal;
+ }
+ }
+ break;
+ }
+ case ATTR_PRESENT_ALWAYS_ON_TOP:
+ {
+ bool bVal = false;
+
+ if( aValue >>= bVal )
+ {
+ bIllegalArgument = false;
+
+ if( rPresSettings.mbAlwaysOnTop != bVal)
+ {
+ bValuesChanged = true;
+ rPresSettings.mbAlwaysOnTop = bVal;
+ }
+ }
+ break;
+ }
+ case ATTR_PRESENT_NAVIGATOR:
+ bIllegalArgument = false;
+ //ignored, but exists in some older documents
+ break;
+ case ATTR_PRESENT_PEN:
+ {
+ bool bVal = false;
+
+ if( aValue >>= bVal )
+ {
+ bIllegalArgument = false;
+
+ if(rPresSettings.mbMouseAsPen != bVal)
+ {
+ bValuesChanged = true;
+ rPresSettings.mbMouseAsPen = bVal;
+ }
+ }
+ break;
+ }
+ case ATTR_PRESENT_PAUSE_TIMEOUT:
+ {
+ sal_Int32 nValue = 0;
+ if( (aValue >>= nValue) && (nValue >= 0) )
+ {
+ bIllegalArgument = false;
+ if( rPresSettings.mnPauseTimeout != nValue )
+ {
+ bValuesChanged = true;
+ rPresSettings.mnPauseTimeout = nValue;
+ }
+ }
+ break;
+ }
+ case ATTR_PRESENT_SHOW_PAUSELOGO:
+ {
+ bool bVal = false;
+
+ if( aValue >>= bVal )
+ {
+ bIllegalArgument = false;
+
+ if( rPresSettings.mbShowPauseLogo != bVal )
+ {
+ bValuesChanged = true;
+ rPresSettings.mbShowPauseLogo = bVal;
+ }
+ }
+ break;
+ }
+ case ATTR_PRESENT_DISPLAY:
+ {
+ sal_Int32 nDisplay = 0;
+ if( aValue >>= nDisplay )
+ {
+ bIllegalArgument = false;
+
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress);
+ pOptions->SetDisplay( nDisplay );
+
+ FullScreenWorkWindow *pWin = dynamic_cast<FullScreenWorkWindow *>(GetWorkWindow());
+ if( !pWin )
+ return;
+ pWin->Restart(true);
+ }
+ break;
+ }
+
+ default:
+ throw UnknownPropertyException( OUString::number(pEntry ? pEntry->nWID : -1), static_cast<cppu::OWeakObject*>(this));
+ }
+
+ if( bIllegalArgument )
+ throw IllegalArgumentException();
+
+ if( bValuesChanged )
+ mpDoc->SetChanged();
+}
+
+Any SAL_CALL SlideShow::getPropertyValue( const OUString& PropertyName )
+{
+ SolarMutexGuard aGuard;
+ ThrowIfDisposed();
+
+ const sd::PresentationSettings& rPresSettings = mpDoc->getPresentationSettings();
+
+ const SfxItemPropertyMapEntry* pEntry = maPropSet.getPropertyMapEntry(PropertyName);
+
+ switch( pEntry ? pEntry->nWID : -1 )
+ {
+ case ATTR_PRESENT_ALL:
+ return Any( !rPresSettings.mbCustomShow && rPresSettings.mbAll );
+ case ATTR_PRESENT_CHANGE_PAGE:
+ return Any( !rPresSettings.mbLockedPages );
+ case ATTR_PRESENT_ANIMATION_ALLOWED:
+ return Any( rPresSettings.mbAnimationAllowed );
+ case ATTR_PRESENT_CUSTOMSHOW:
+ {
+ SdCustomShowList* pList = mpDoc->GetCustomShowList();
+ SdCustomShow* pShow = (pList && rPresSettings.mbCustomShow) ? pList->GetCurObject() : nullptr;
+ OUString aShowName;
+
+ if(pShow)
+ aShowName = pShow->GetName();
+
+ return Any( aShowName );
+ }
+ case ATTR_PRESENT_ENDLESS:
+ return Any( rPresSettings.mbEndless );
+ case ATTR_PRESENT_FULLSCREEN:
+ return Any( rPresSettings.mbFullScreen );
+ case ATTR_PRESENT_DIANAME:
+ {
+ OUString aSlideName;
+
+ if( !rPresSettings.mbCustomShow && !rPresSettings.mbAll )
+ aSlideName = getPageApiNameFromUiName( rPresSettings.maPresPage );
+
+ return Any( aSlideName );
+ }
+ case ATTR_PRESENT_MANUEL:
+ return Any( rPresSettings.mbManual );
+ case ATTR_PRESENT_MOUSE:
+ return Any( rPresSettings.mbMouseVisible );
+ case ATTR_PRESENT_ALWAYS_ON_TOP:
+ return Any( rPresSettings.mbAlwaysOnTop );
+ case ATTR_PRESENT_NAVIGATOR:
+ return Any( false );
+ case ATTR_PRESENT_PEN:
+ return Any( rPresSettings.mbMouseAsPen );
+ case ATTR_PRESENT_PAUSE_TIMEOUT:
+ return Any( rPresSettings.mnPauseTimeout );
+ case ATTR_PRESENT_SHOW_PAUSELOGO:
+ return Any( rPresSettings.mbShowPauseLogo );
+ case ATTR_PRESENT_DISPLAY:
+ {
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress);
+ return Any(pOptions->GetDisplay());
+ }
+
+ default:
+ throw UnknownPropertyException( OUString::number(pEntry ? pEntry->nWID : -1), static_cast<cppu::OWeakObject*>(this));
+ }
+}
+
+void SAL_CALL SlideShow::addPropertyChangeListener( const OUString& , const Reference< XPropertyChangeListener >& )
+{
+}
+
+void SAL_CALL SlideShow::removePropertyChangeListener( const OUString& , const Reference< XPropertyChangeListener >& )
+{
+}
+
+void SAL_CALL SlideShow::addVetoableChangeListener( const OUString& , const Reference< XVetoableChangeListener >& )
+{
+}
+
+void SAL_CALL SlideShow::removeVetoableChangeListener( const OUString& , const Reference< XVetoableChangeListener >& )
+{
+}
+
+// XPresentation
+
+void SAL_CALL SlideShow::start()
+{
+ const Sequence< PropertyValue > aArguments;
+ startWithArguments( aArguments );
+}
+
+WorkWindow *SlideShow::GetWorkWindow()
+{
+ if( !mpFullScreenViewShellBase )
+ return nullptr;
+
+ PresentationViewShell* pShell = dynamic_cast<PresentationViewShell*>(mpFullScreenViewShellBase->GetMainViewShell().get());
+
+ if( !pShell || !pShell->GetViewFrame() )
+ return nullptr;
+
+ return dynamic_cast<WorkWindow*>(pShell->GetViewFrame()->GetFrame().GetWindow().GetParent());
+}
+
+bool SlideShow::IsExitAfterPresenting() const
+{
+ SolarMutexGuard aGuard;
+ ThrowIfDisposed();
+ return mpDoc->IsExitAfterPresenting();
+}
+
+void SlideShow::SetExitAfterPresenting(bool bExit)
+{
+ SolarMutexGuard aGuard;
+ ThrowIfDisposed();
+ mpDoc->SetExitAfterPresenting(bExit);
+}
+
+void SAL_CALL SlideShow::end()
+{
+ SolarMutexGuard aGuard;
+
+ // The mbIsInStartup flag should have been reset during the start of the
+ // slide show. Reset it here just in case that something has horribly
+ // gone wrong.
+ assert(!mbIsInStartup);
+
+ rtl::Reference< SlideshowImpl > xController( mxController );
+ if( !xController.is() )
+ return;
+
+ mxController.clear();
+
+ if( mpFullScreenFrameView )
+ {
+ delete mpFullScreenFrameView;
+ mpFullScreenFrameView = nullptr;
+ }
+
+ ViewShellBase* pFullScreenViewShellBase = mpFullScreenViewShellBase;
+ mpFullScreenViewShellBase = nullptr;
+
+ // dispose before fullscreen window changes screens
+ // (potentially). If this needs to be moved behind
+ // pWorkWindow->StartPresentationMode() again, read issue
+ // pWorkWindow->i94007 & implement the solution outlined
+ // there.
+ xController->dispose();
+
+ if( pFullScreenViewShellBase )
+ {
+ PresentationViewShell* pShell = dynamic_cast<PresentationViewShell*>(pFullScreenViewShellBase->GetMainViewShell().get());
+
+ if( pShell && pShell->GetViewFrame() )
+ {
+ WorkWindow* pWorkWindow = dynamic_cast<WorkWindow*>(pShell->GetViewFrame()->GetFrame().GetWindow().GetParent());
+ if( pWorkWindow )
+ {
+ pWorkWindow->StartPresentationMode( (mxController.is() && mxController->maPresSettings.mbAlwaysOnTop)
+ ? PresentationFlags::HideAllApps : PresentationFlags::NONE );
+ }
+ }
+ }
+
+ if( pFullScreenViewShellBase )
+ {
+ PresentationViewShell* pShell = nullptr;
+ {
+ // Get the shell pointer in its own scope to be sure that
+ // the shared_ptr to the shell is released before DoClose()
+ // is called.
+ ::std::shared_ptr<ViewShell> pSharedView (pFullScreenViewShellBase->GetMainViewShell());
+ pShell = dynamic_cast<PresentationViewShell*>(pSharedView.get());
+ }
+ if( pShell && pShell->GetViewFrame() )
+ pShell->GetViewFrame()->DoClose();
+ }
+ else if( mpCurrentViewShellBase )
+ {
+ ViewShell* pViewShell = mpCurrentViewShellBase->GetMainViewShell().get();
+
+ if( pViewShell )
+ {
+ FrameView* pFrameView = pViewShell->GetFrameView();
+
+ if( pFrameView && (pFrameView->GetPresentationViewShellId() != SID_VIEWSHELL0) )
+ {
+ ViewShell::ShellType ePreviousType (pFrameView->GetPreviousViewShellType());
+ pFrameView->SetPreviousViewShellType(ViewShell::ST_NONE);
+
+ pFrameView->SetPresentationViewShellId(SID_VIEWSHELL0);
+ pFrameView->SetPreviousViewShellType(pViewShell->GetShellType());
+
+ framework::FrameworkHelper::Instance(*mpCurrentViewShellBase)->RequestView(
+ framework::FrameworkHelper::GetViewURL(ePreviousType),
+ framework::FrameworkHelper::msCenterPaneURL);
+
+ pViewShell->GetViewFrame()->GetBindings().InvalidateAll( true );
+ }
+ }
+ }
+
+ if( mpCurrentViewShellBase )
+ {
+ if (ViewShell* const pViewShell = mpCurrentViewShellBase->GetMainViewShell().get())
+ {
+ // invalidate the view shell so the presentation slot will be re-enabled
+ // and the rehearsing will be updated
+ pViewShell->Invalidate();
+
+ if( xController->meAnimationMode ==ANIMATIONMODE_SHOW )
+ {
+ // switch to the previously visible Slide
+ DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>( pViewShell );
+ if( pDrawViewShell )
+ pDrawViewShell->SwitchPage( static_cast<sal_uInt16>(xController->getRestoreSlide()) );
+ else
+ {
+ Reference<XDrawView> xDrawView (
+ Reference<XWeak>(&mpCurrentViewShellBase->GetDrawController()), UNO_QUERY);
+ if (xDrawView.is())
+ xDrawView->setCurrentPage(
+ Reference<XDrawPage>(
+ mpDoc->GetSdPage(xController->getRestoreSlide(), PageKind::Standard)->getUnoPage(),
+ UNO_QUERY));
+ }
+ }
+
+ if( pViewShell->GetDoc()->IsExitAfterPresenting() )
+ {
+ pViewShell->GetDoc()->SetExitAfterPresenting( false );
+
+ Reference<frame::XDispatchProvider> xProvider(pViewShell->GetViewShellBase().GetController()->getFrame(),
+ UNO_QUERY);
+ if( xProvider.is() )
+ {
+ util::URL aURL;
+ aURL.Complete = ".uno:CloseFrame";
+
+ uno::Reference< frame::XDispatch > xDispatch(
+ xProvider->queryDispatch(
+ aURL, OUString(), 0));
+ if( xDispatch.is() )
+ {
+ xDispatch->dispatch(aURL,
+ uno::Sequence< beans::PropertyValue >());
+ }
+ }
+ }
+
+ // In case mbMouseAsPen was set, a new layer DrawnInSlideshow might have been generated
+ // during slideshow, which is not known to FrameView yet.
+ if (any2bool(getPropertyValue("UsePen"))
+ && pViewShell->GetDoc()->GetLayerAdmin().GetLayer("DrawnInSlideshow"))
+ {
+ SdrLayerIDSet aDocLayerIDSet;
+ pViewShell->GetDoc()->GetLayerAdmin().getVisibleLayersODF(aDocLayerIDSet);
+ if (pViewShell->GetFrameView()->GetVisibleLayers() != aDocLayerIDSet)
+ {
+ pViewShell->GetFrameView()->SetVisibleLayers(aDocLayerIDSet);
+ }
+ pViewShell->GetDoc()->GetLayerAdmin().getPrintableLayersODF(aDocLayerIDSet);
+ if (pViewShell->GetFrameView()->GetPrintableLayers() != aDocLayerIDSet)
+ {
+ pViewShell->GetFrameView()->SetPrintableLayers(aDocLayerIDSet);
+ }
+ pViewShell->GetDoc()->GetLayerAdmin().getLockedLayersODF(aDocLayerIDSet);
+ if (pViewShell->GetFrameView()->GetLockedLayers() != aDocLayerIDSet)
+ {
+ pViewShell->GetFrameView()->SetLockedLayers(aDocLayerIDSet);
+ }
+ pViewShell->InvalidateWindows();
+ }
+
+ // Fire the acc focus event when focus is switched back. The above method
+ // mpCurrentViewShellBase->GetWindow()->GrabFocus() will set focus to WorkWindow
+ // instead of the sd::window, so here call Shell's method to fire the focus event
+ pViewShell->SwitchActiveViewFireFocus();
+ }
+ }
+ mpCurrentViewShellBase = nullptr;
+}
+
+void SAL_CALL SlideShow::rehearseTimings()
+{
+ Sequence< PropertyValue > aArguments{ comphelper::makePropertyValue("RehearseTimings", true) };
+ startWithArguments( aArguments );
+}
+
+// XPresentation2
+
+void SAL_CALL SlideShow::startWithArguments(const Sequence< PropertyValue >& rArguments)
+{
+ SolarMutexGuard aGuard;
+ ThrowIfDisposed();
+
+ // Stop a running show before starting a new one.
+ if( mxController.is() )
+ {
+ assert(!mbIsInStartup);
+ end();
+ }
+ else if (mbIsInStartup)
+ {
+ // We are already somewhere in process of starting a slide show but
+ // have not yet got to the point where mxController is set. There
+ // is not yet a slide show to end so return silently.
+ return;
+ }
+
+ // Prevent multiple instance of the SlideShow class for one document.
+ mbIsInStartup = true;
+
+ mxCurrentSettings = std::make_shared<PresentationSettingsEx>( mpDoc->getPresentationSettings() );
+ mxCurrentSettings->SetArguments( rArguments );
+
+ // if there is no view shell base set, use the current one or the first using this document
+ if( mpCurrentViewShellBase == nullptr )
+ {
+ // first check current
+ ::sd::ViewShellBase* pBase = ::sd::ViewShellBase::GetViewShellBase( SfxViewFrame::Current() );
+ if( pBase && pBase->GetDocument() == mpDoc )
+ {
+ mpCurrentViewShellBase = pBase;
+ }
+ else
+ {
+ // current is not ours, so get first from ours
+ mpCurrentViewShellBase = ::sd::ViewShellBase::GetViewShellBase( SfxViewFrame::GetFirst( mpDoc->GetDocSh() ) );
+ }
+ }
+
+ // #i118456# make sure TextEdit changes get pushed to model.
+ // mpDrawView is tested against NULL above already.
+ if(mpCurrentViewShellBase)
+ {
+ ViewShell* pViewShell = mpCurrentViewShellBase->GetMainViewShell().get();
+
+ if(pViewShell && pViewShell->GetView())
+ {
+ pViewShell->GetView()->SdrEndTextEdit();
+ }
+ }
+
+ // Start either a full-screen or an in-place show.
+ if(mxCurrentSettings->mbFullScreen && !mxCurrentSettings->mbPreview)
+ StartFullscreenPresentation();
+ else
+ StartInPlacePresentation();
+
+}
+
+sal_Bool SAL_CALL SlideShow::isRunning( )
+{
+ SolarMutexGuard aGuard;
+ return mxController.is() && mxController->isRunning();
+}
+
+Reference< XSlideShowController > SAL_CALL SlideShow::getController( )
+{
+ ThrowIfDisposed();
+
+ return mxController;
+}
+
+// XComponent
+
+void SlideShow::disposing(std::unique_lock<std::mutex>&)
+{
+ SolarMutexGuard aGuard;
+
+ if( mnInPlaceConfigEvent )
+ {
+ Application::RemoveUserEvent( mnInPlaceConfigEvent );
+ mnInPlaceConfigEvent = nullptr;
+ }
+
+ if( mxController.is() )
+ {
+ mxController->dispose();
+ mxController.clear();
+ }
+
+ mpCurrentViewShellBase = nullptr;
+ mpFullScreenViewShellBase = nullptr;
+ mpDoc = nullptr;
+}
+
+void SlideShow::startPreview( const Reference< XDrawPage >& xDrawPage, const Reference< XAnimationNode >& xAnimationNode )
+{
+ Sequence< PropertyValue > aArguments{
+ comphelper::makePropertyValue("Preview", true),
+ comphelper::makePropertyValue("FirstPage", xDrawPage),
+ comphelper::makePropertyValue("AnimationNode", xAnimationNode),
+ comphelper::makePropertyValue("ParentWindow", Reference< XWindow >()),
+ };
+
+ startWithArguments( aArguments );
+}
+
+OutputDevice* SlideShow::getShowWindow()
+{
+ return mxController.is() ? mxController->mpShowWindow->GetOutDev() : nullptr;
+}
+
+int SlideShow::getAnimationMode() const
+{
+ return mxController.is() ? mxController->meAnimationMode : ANIMATIONMODE_SHOW;
+}
+
+void SlideShow::jumpToPageIndex( sal_Int32 nPageIndex )
+{
+ if( mxController.is() )
+ mxController->displaySlideIndex( nPageIndex );
+}
+
+void SlideShow::jumpToPageNumber( sal_Int32 nPageNumber )
+{
+ if( mxController.is() )
+ mxController->displaySlideNumber( nPageNumber );
+}
+
+sal_Int32 SlideShow::getCurrentPageNumber() const
+{
+ return mxController.is() ? mxController->getCurrentSlideNumber() : 0;
+}
+
+void SlideShow::jumpToBookmark( const OUString& sBookmark )
+{
+ if( mxController.is() )
+ mxController->jumpToBookmark( sBookmark );
+}
+
+bool SlideShow::isFullScreen() const
+{
+ return mxController.is() && mxController->maPresSettings.mbFullScreen;
+}
+
+void SlideShow::resize( const Size &rSize )
+{
+ if( mxController.is() )
+ mxController->resize( rSize );
+}
+
+bool SlideShow::activate( ViewShellBase& rBase )
+{
+ if( (mpFullScreenViewShellBase == &rBase) && !mxController.is() )
+ {
+ ::std::shared_ptr<PresentationViewShell> pShell = std::dynamic_pointer_cast<PresentationViewShell>(rBase.GetMainViewShell());
+ if (pShell != nullptr)
+ {
+ pShell->FinishInitialization( mpFullScreenFrameView );
+ mpFullScreenFrameView = nullptr;
+
+ CreateController( pShell.get(), pShell->GetView(), rBase.GetViewWindow() );
+
+ if (!mxController->startShow(mxCurrentSettings.get()))
+ return false;
+
+ pShell->Resize();
+ // Defer the sd::ShowWindow's GrabFocus to here. so that the accessible event can be fired correctly.
+ pShell->GetActiveWindow()->GrabFocus();
+ }
+ }
+
+ if( mxController.is() )
+ mxController->activate();
+
+ return true;
+}
+
+void SlideShow::deactivate()
+{
+ mxController->deactivate();
+}
+
+bool SlideShow::keyInput(const KeyEvent& rKEvt)
+{
+ return mxController.is() && mxController->keyInput(rKEvt);
+}
+
+void SlideShow::paint()
+{
+ if( mxController.is() )
+ mxController->paint();
+}
+
+void SlideShow::pause( bool bPause )
+{
+ if( mxController.is() )
+ {
+ if( bPause )
+ mxController->pause();
+ else
+ mxController->resume();
+ }
+}
+
+bool SlideShow::swipe(const CommandSwipeData& rSwipeData)
+{
+ return mxController.is() && mxController->swipe(rSwipeData);
+}
+
+bool SlideShow::longpress(const CommandLongPressData& rLongPressData)
+{
+ return mxController.is() && mxController->longpress(rLongPressData);
+}
+
+void SlideShow::StartInPlacePresentationConfigurationCallback()
+{
+ if( mnInPlaceConfigEvent != nullptr )
+ Application::RemoveUserEvent( mnInPlaceConfigEvent );
+
+ mnInPlaceConfigEvent = Application::PostUserEvent( LINK( this, SlideShow, StartInPlacePresentationConfigurationHdl ) );
+}
+
+IMPL_LINK_NOARG(SlideShow, StartInPlacePresentationConfigurationHdl, void*, void)
+{
+ mnInPlaceConfigEvent = nullptr;
+ StartInPlacePresentation();
+}
+
+void SlideShow::StartInPlacePresentation()
+{
+ if( mpCurrentViewShellBase )
+ {
+ // Save the current view shell type so that it can be restored after the
+ // show has ended. If there already is a saved shell type then that is
+ // not overwritten.
+
+ ViewShell::ShellType eShell = ViewShell::ST_NONE;
+
+ ::std::shared_ptr<FrameworkHelper> pHelper(FrameworkHelper::Instance(*mpCurrentViewShellBase));
+ ::std::shared_ptr<ViewShell> pMainViewShell(pHelper->GetViewShell(FrameworkHelper::msCenterPaneURL));
+
+ if( pMainViewShell )
+ eShell = pMainViewShell->GetShellType();
+
+ if( eShell != ViewShell::ST_IMPRESS )
+ {
+ // Switch temporary to a DrawViewShell which supports the in-place presentation.
+
+ if( pMainViewShell )
+ {
+ FrameView* pFrameView = pMainViewShell->GetFrameView();
+ pFrameView->SetPresentationViewShellId(SID_VIEWSHELL1);
+ pFrameView->SetPreviousViewShellType (pMainViewShell->GetShellType());
+ pFrameView->SetPageKind (PageKind::Standard);
+ }
+
+ pHelper->RequestView( FrameworkHelper::msImpressViewURL, FrameworkHelper::msCenterPaneURL );
+ pHelper->RunOnConfigurationEvent(
+ FrameworkHelper::msConfigurationUpdateEndEvent,
+ [this] (bool const) { return this->StartInPlacePresentationConfigurationCallback(); } );
+ return;
+ }
+ else
+ {
+ vcl::Window* pParentWindow = mxCurrentSettings->mpParentWindow;
+ if( pParentWindow == nullptr )
+ pParentWindow = mpCurrentViewShellBase->GetViewWindow();
+
+ CreateController( pMainViewShell.get(), pMainViewShell->GetView(), pParentWindow );
+ }
+ }
+ else if( mxCurrentSettings->mpParentWindow )
+ {
+ // no current view shell, but parent window
+ CreateController( nullptr, nullptr, mxCurrentSettings->mpParentWindow );
+ }
+
+ if( !mxController.is() )
+ return;
+
+ bool bSuccess = false;
+ if( mxCurrentSettings && mxCurrentSettings->mbPreview )
+ {
+ bSuccess = mxController->startPreview(mxCurrentSettings->mxStartPage, mxCurrentSettings->mxAnimationNode, mxCurrentSettings->mpParentWindow );
+ }
+ else
+ {
+ bSuccess = mxController->startShow(mxCurrentSettings.get());
+ }
+
+ if( !bSuccess )
+ end();
+ else
+ {
+ if( mpCurrentViewShellBase && ( !mxCurrentSettings || ( mxCurrentSettings && !mxCurrentSettings->mbPreview ) ) )
+ mpCurrentViewShellBase->GetWindow()->GrabFocus();
+ }
+}
+
+void SlideShow::StartFullscreenPresentation( )
+{
+ // Create the top level window in which the PresentationViewShell(Base)
+ // will be created. This is done here explicitly so that we can make it
+ // fullscreen.
+ const sal_Int32 nDisplay (GetDisplay());
+ VclPtr<WorkWindow> pWorkWindow = VclPtr<FullScreenWorkWindow>::Create(this, mpCurrentViewShellBase);
+ pWorkWindow->SetBackground(Wallpaper(COL_BLACK));
+ OUString Title(SdResId(STR_FULLSCREEN_SLIDESHOW));
+ Title = Title.replaceFirst("%s",
+ mpCurrentViewShellBase->GetDocShell()->GetTitle(SFX_TITLE_DETECT));
+ pWorkWindow->SetText(Title);
+ pWorkWindow->StartPresentationMode( true, mpDoc->getPresentationSettings().mbAlwaysOnTop ? PresentationFlags::HideAllApps : PresentationFlags::NONE, nDisplay);
+ // pWorkWindow->ShowFullScreenMode(sal_False, nDisplay);
+
+ if (!pWorkWindow->IsVisible())
+ return;
+
+ // Initialize the new presentation view shell with a copy of the
+ // frame view of the current view shell. This avoids that
+ // changes made by the presentation have an effect on the other
+ // view shells.
+ FrameView* pOriginalFrameView = nullptr;
+ ::std::shared_ptr<ViewShell> xShell(mpCurrentViewShellBase->GetMainViewShell());
+ if (xShell)
+ pOriginalFrameView = xShell->GetFrameView();
+
+ delete mpFullScreenFrameView;
+ mpFullScreenFrameView = new FrameView(mpDoc, pOriginalFrameView);
+
+ // The new frame is created hidden. To make it visible and activate the
+ // new view shell--a prerequisite to process slot calls and initialize
+ // its panes--a GrabFocus() has to be called later on.
+ SfxFrame* pNewFrame = SfxFrame::CreateHidden( *mpDoc->GetDocSh(), *pWorkWindow, PRESENTATION_FACTORY_ID );
+ pNewFrame->SetPresentationMode(true);
+
+ mpFullScreenViewShellBase = static_cast<ViewShellBase*>(pNewFrame->GetCurrentViewFrame()->GetViewShell());
+ if(mpFullScreenViewShellBase != nullptr)
+ {
+ // The following GrabFocus() is responsible for activating the
+ // new view shell. Without it the screen remains blank (under
+ // Windows and some Linux variants.)
+ mpFullScreenViewShellBase->GetWindow()->GrabFocus();
+ }
+}
+
+/// convert configuration setting display concept to real screens
+sal_Int32 SlideShow::GetDisplay()
+{
+ sal_Int32 nDisplay = 0;
+
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress);
+ if( pOptions )
+ nDisplay = pOptions->GetDisplay();
+
+ if( nDisplay < 0 )
+ nDisplay = -1;
+ else if( nDisplay == 0)
+ nDisplay = static_cast<sal_Int32>(Application::GetDisplayExternalScreen());
+ else
+ nDisplay--;
+
+ SAL_INFO("sd", "Presenting on real screen " << nDisplay);
+
+ return nDisplay;
+}
+
+bool SlideShow::dependsOn( ViewShellBase const * pViewShellBase )
+{
+ return mxController.is() && (pViewShellBase == mpCurrentViewShellBase) && mpFullScreenViewShellBase;
+}
+
+Reference< presentation::XPresentation2 > CreatePresentation( const SdDrawDocument& rDocument )
+{
+ return Reference< presentation::XPresentation2 >( SlideShow::Create( const_cast< SdDrawDocument* >( &rDocument ) ) );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slideshow/slideshowimpl.cxx b/sd/source/ui/slideshow/slideshowimpl.cxx
new file mode 100644
index 000000000..89a8ac95f
--- /dev/null
+++ b/sd/source/ui/slideshow/slideshowimpl.cxx
@@ -0,0 +1,3349 @@
+/* -*- 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 <algorithm>
+
+#include <config_features.h>
+
+#include <com/sun/star/frame/theAutoRecovery.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <com/sun/star/document/XEventsSupplier.hpp>
+#include <com/sun/star/drawing/XMasterPageTarget.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/beans/XPropertySetInfo.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/awt/SystemPointer.hpp>
+#include <com/sun/star/util/URLTransformer.hpp>
+#include <com/sun/star/util/XURLTransformer.hpp>
+#include <com/sun/star/frame/XDispatch.hpp>
+#include <com/sun/star/frame/XLayoutManager.hpp>
+#include <com/sun/star/presentation/SlideShow.hpp>
+#include <com/sun/star/media/XPlayer.hpp>
+#include <officecfg/Office/Common.hxx>
+#include <svl/stritem.hxx>
+#include <svl/urihelper.hxx>
+#include <basic/sbstar.hxx>
+
+#include <toolkit/helper/vclunohelper.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <sfx2/infobar.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/app.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/f3dchild.hxx>
+#include <svx/imapdlg.hxx>
+#include <svx/fontwork.hxx>
+#include <svx/SvxColorChildWindow.hxx>
+#include <svx/bmpmask.hxx>
+#include <svx/srchdlg.hxx>
+#include <svx/hyperdlg.hxx>
+#include <svx/svxids.hrc>
+#include <AnimationChildWindow.hxx>
+#include <notifydocumentevent.hxx>
+#include "slideshowimpl.hxx"
+#include "slideshowviewimpl.hxx"
+#include "PaneHider.hxx"
+
+#include <bitmaps.hlst>
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <vcl/canvastools.hxx>
+#include <vcl/commandevent.hxx>
+#include <vcl/weldutils.hxx>
+
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/help.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <rtl/ref.hxx>
+#include <o3tl/safeint.hxx>
+#include <o3tl/string_view.hxx>
+#include <avmedia/mediawindow.hxx>
+#include <svtools/colrdlg.hxx>
+#include <DrawDocShell.hxx>
+#include <ViewShellBase.hxx>
+#include <PresentationViewShell.hxx>
+#include <RemoteServer.hxx>
+#include <customshowlist.hxx>
+#include <unopage.hxx>
+#include <sdpage.hxx>
+#include <sdmod.hxx>
+#include <app.hrc>
+#include <cusshow.hxx>
+#include <optsitem.hxx>
+
+#define CM_SLIDES 21
+
+using ::com::sun::star::animations::XAnimationNode;
+using ::com::sun::star::animations::XAnimationListener;
+using ::com::sun::star::awt::XWindow;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::document;
+using namespace ::com::sun::star::presentation;
+using namespace ::com::sun::star::beans;
+
+namespace sd
+{
+/** Slots, which will be disabled in the slide show and are managed by Sfx.
+ Have to be sorted in the order of the SIDs */
+sal_uInt16 const pAllowed[] =
+{
+ SID_OPENDOC , // 5501 ///< that internally jumps work
+ SID_JUMPTOMARK , // 5598
+ SID_OPENHYPERLINK , // 6676
+ SID_PRESENTATION_END // 27218
+};
+
+class AnimationSlideController
+{
+public:
+ enum Mode { ALL, FROM, CUSTOM, PREVIEW };
+
+public:
+ AnimationSlideController( Reference< XIndexAccess > const & xSlides, Mode eMode );
+
+ void setStartSlideNumber( sal_Int32 nSlideNumber ) { mnStartSlideNumber = nSlideNumber; }
+ sal_Int32 getStartSlideIndex() const;
+
+ sal_Int32 getCurrentSlideNumber() const;
+ sal_Int32 getCurrentSlideIndex() const;
+
+ sal_Int32 getSlideIndexCount() const { return maSlideNumbers.size(); }
+ sal_Int32 getSlideNumberCount() const { return mnSlideCount; }
+
+ sal_Int32 getSlideNumber( sal_Int32 nSlideIndex ) const;
+
+ void insertSlideNumber( sal_Int32 nSlideNumber, bool bVisible = true );
+ void setPreviewNode( const Reference< XAnimationNode >& xPreviewNode );
+
+ bool jumpToSlideIndex( sal_Int32 nNewSlideIndex );
+ bool jumpToSlideNumber( sal_Int32 nNewSlideIndex );
+
+ bool nextSlide();
+ bool previousSlide();
+
+ void displayCurrentSlide( const Reference< XSlideShow >& xShow,
+ const Reference< XDrawPagesSupplier>& xDrawPages,
+ const bool bSkipAllMainSequenceEffects );
+
+ sal_Int32 getNextSlideIndex() const;
+ sal_Int32 getPreviousSlideIndex() const;
+
+ bool isVisibleSlideNumber( sal_Int32 nSlideNumber ) const;
+
+ Reference< XDrawPage > getSlideByNumber( sal_Int32 nSlideNumber ) const;
+
+ sal_Int32 getNextSlideNumber() const;
+
+ bool hasSlides() const { return !maSlideNumbers.empty(); }
+
+private:
+ bool getSlideAPI( sal_Int32 nSlideNumber, Reference< XDrawPage >& xSlide, Reference< XAnimationNode >& xAnimNode );
+ sal_Int32 findSlideIndex( sal_Int32 nSlideNumber ) const;
+
+ bool isValidIndex( sal_Int32 nIndex ) const { return (nIndex >= 0) && (o3tl::make_unsigned(nIndex) < maSlideNumbers.size()); }
+ bool isValidSlideNumber( sal_Int32 nSlideNumber ) const { return (nSlideNumber >= 0) && (nSlideNumber < mnSlideCount); }
+
+private:
+ Mode meMode;
+ sal_Int32 mnStartSlideNumber;
+ std::vector< sal_Int32 > maSlideNumbers;
+ std::vector< bool > maSlideVisible;
+ std::vector< bool > maSlideVisited;
+ Reference< XAnimationNode > mxPreviewNode;
+ sal_Int32 mnSlideCount;
+ sal_Int32 mnCurrentSlideIndex;
+ sal_Int32 mnHiddenSlideNumber;
+ Reference< XIndexAccess > mxSlides;
+};
+
+Reference< XDrawPage > AnimationSlideController::getSlideByNumber( sal_Int32 nSlideNumber ) const
+{
+ Reference< XDrawPage > xSlide;
+ if( mxSlides.is() && (nSlideNumber >= 0) && (nSlideNumber < mxSlides->getCount()) )
+ mxSlides->getByIndex( nSlideNumber ) >>= xSlide;
+ return xSlide;
+}
+
+bool AnimationSlideController::isVisibleSlideNumber( sal_Int32 nSlideNumber ) const
+{
+ sal_Int32 nIndex = findSlideIndex( nSlideNumber );
+
+ if( nIndex != -1 )
+ return maSlideVisible[ nIndex ];
+ else
+ return false;
+}
+
+void AnimationSlideController::setPreviewNode( const Reference< XAnimationNode >& xPreviewNode )
+{
+ mxPreviewNode = xPreviewNode;
+}
+
+AnimationSlideController::AnimationSlideController( Reference< XIndexAccess > const & xSlides, Mode eMode )
+: meMode( eMode )
+, mnStartSlideNumber(-1)
+, mnSlideCount( 0 )
+, mnCurrentSlideIndex(0)
+, mnHiddenSlideNumber( -1 )
+, mxSlides( xSlides )
+{
+ if( mxSlides.is() )
+ mnSlideCount = xSlides->getCount();
+}
+
+sal_Int32 AnimationSlideController::getStartSlideIndex() const
+{
+ if( mnStartSlideNumber >= 0 )
+ {
+ sal_Int32 nIndex;
+ const sal_Int32 nCount = maSlideNumbers.size();
+
+ for( nIndex = 0; nIndex < nCount; nIndex++ )
+ {
+ if( maSlideNumbers[nIndex] == mnStartSlideNumber )
+ return nIndex;
+ }
+ }
+
+ return 0;
+}
+
+sal_Int32 AnimationSlideController::getCurrentSlideNumber() const
+{
+ if( mnHiddenSlideNumber != -1 )
+ return mnHiddenSlideNumber;
+ else if( !maSlideNumbers.empty() )
+ return maSlideNumbers[mnCurrentSlideIndex];
+ else
+ return 0;
+}
+
+sal_Int32 AnimationSlideController::getCurrentSlideIndex() const
+{
+ if( mnHiddenSlideNumber != -1 )
+ return -1;
+ else
+ return mnCurrentSlideIndex;
+}
+
+bool AnimationSlideController::jumpToSlideIndex( sal_Int32 nNewSlideIndex )
+{
+ if( isValidIndex( nNewSlideIndex ) )
+ {
+ mnCurrentSlideIndex = nNewSlideIndex;
+ mnHiddenSlideNumber = -1;
+ maSlideVisited[mnCurrentSlideIndex] = true;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+bool AnimationSlideController::jumpToSlideNumber( sal_Int32 nNewSlideNumber )
+{
+ sal_Int32 nIndex = findSlideIndex( nNewSlideNumber );
+ if( isValidIndex( nIndex ) )
+ {
+ return jumpToSlideIndex( nIndex );
+ }
+ else if( (nNewSlideNumber >= 0) && (nNewSlideNumber < mnSlideCount) )
+ {
+ // jump to a hidden slide
+ mnHiddenSlideNumber = nNewSlideNumber;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+sal_Int32 AnimationSlideController::getSlideNumber( sal_Int32 nSlideIndex ) const
+{
+ if( isValidIndex( nSlideIndex ) )
+ return maSlideNumbers[nSlideIndex];
+ else
+ return -1;
+}
+
+void AnimationSlideController::insertSlideNumber( sal_Int32 nSlideNumber, bool bVisible /* = true */ )
+{
+ DBG_ASSERT( isValidSlideNumber( nSlideNumber ), "sd::AnimationSlideController::insertSlideNumber(), illegal index" );
+ if( isValidSlideNumber( nSlideNumber ) )
+ {
+ maSlideNumbers.push_back( nSlideNumber );
+ maSlideVisible.push_back( bVisible );
+ maSlideVisited.push_back( false );
+ }
+}
+
+bool AnimationSlideController::getSlideAPI( sal_Int32 nSlideNumber, Reference< XDrawPage >& xSlide, Reference< XAnimationNode >& xAnimNode )
+{
+ if( isValidSlideNumber( nSlideNumber ) ) try
+ {
+ xSlide.set( mxSlides->getByIndex(nSlideNumber), UNO_QUERY_THROW );
+
+ if( meMode == PREVIEW )
+ {
+ xAnimNode = mxPreviewNode;
+ }
+ else
+ {
+ Reference< animations::XAnimationNodeSupplier > xAnimNodeSupplier( xSlide, UNO_QUERY_THROW );
+ xAnimNode = xAnimNodeSupplier->getAnimationNode();
+ }
+
+ return true;
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::AnimationSlideController::getSlideAPI()" );
+ }
+
+ return false;
+}
+
+sal_Int32 AnimationSlideController::findSlideIndex( sal_Int32 nSlideNumber ) const
+{
+ sal_Int32 nIndex;
+ const sal_Int32 nCount = maSlideNumbers.size();
+
+ for( nIndex = 0; nIndex < nCount; nIndex++ )
+ {
+ if( maSlideNumbers[nIndex] == nSlideNumber )
+ return nIndex;
+ }
+
+ return -1;
+}
+
+sal_Int32 AnimationSlideController::getNextSlideIndex() const
+{
+ switch( meMode )
+ {
+ case ALL:
+ {
+ sal_Int32 nNewSlideIndex = mnCurrentSlideIndex + 1;
+ if( isValidIndex( nNewSlideIndex ) )
+ {
+ // if the current slide is not excluded, make sure the
+ // next slide is also not excluded.
+ // if the current slide is excluded, we want to go
+ // to the next slide, even if this is also excluded.
+ if( maSlideVisible[mnCurrentSlideIndex] )
+ {
+ while( isValidIndex( nNewSlideIndex ) )
+ {
+ if( maSlideVisible[nNewSlideIndex] )
+ break;
+
+ nNewSlideIndex++;
+ }
+ }
+ }
+ return isValidIndex( nNewSlideIndex ) ? nNewSlideIndex : -1;
+ }
+
+ case FROM:
+ case CUSTOM:
+ return mnHiddenSlideNumber == -1 ? mnCurrentSlideIndex + 1 : mnCurrentSlideIndex;
+
+ default:
+ case PREVIEW:
+ return -1;
+
+ }
+}
+
+sal_Int32 AnimationSlideController::getNextSlideNumber() const
+{
+ sal_Int32 nNextSlideIndex = getNextSlideIndex();
+ if( isValidIndex( nNextSlideIndex ) )
+ {
+ return maSlideNumbers[nNextSlideIndex];
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+bool AnimationSlideController::nextSlide()
+{
+ return jumpToSlideIndex( getNextSlideIndex() );
+}
+
+sal_Int32 AnimationSlideController::getPreviousSlideIndex() const
+{
+ sal_Int32 nNewSlideIndex = mnCurrentSlideIndex - 1;
+
+ switch( meMode )
+ {
+ case ALL:
+ {
+ // make sure the previous slide is visible
+ // or was already visited
+ while( isValidIndex( nNewSlideIndex ) )
+ {
+ if( maSlideVisible[nNewSlideIndex] || maSlideVisited[nNewSlideIndex] )
+ break;
+
+ nNewSlideIndex--;
+ }
+
+ break;
+ }
+
+ case PREVIEW:
+ return -1;
+
+ default:
+ break;
+ }
+
+ return nNewSlideIndex;
+}
+
+bool AnimationSlideController::previousSlide()
+{
+ return jumpToSlideIndex( getPreviousSlideIndex() );
+}
+
+void AnimationSlideController::displayCurrentSlide( const Reference< XSlideShow >& xShow,
+ const Reference< XDrawPagesSupplier>& xDrawPages,
+ const bool bSkipAllMainSequenceEffects )
+{
+ const sal_Int32 nCurrentSlideNumber = getCurrentSlideNumber();
+
+ if( !(xShow.is() && (nCurrentSlideNumber != -1 )) )
+ return;
+
+ Reference< XDrawPage > xSlide;
+ Reference< XAnimationNode > xAnimNode;
+ ::std::vector<PropertyValue> aProperties;
+
+ const sal_Int32 nNextSlideNumber = getNextSlideNumber();
+ if( getSlideAPI( nNextSlideNumber, xSlide, xAnimNode ) )
+ {
+ Sequence< Any > aValue{ Any(xSlide), Any(xAnimNode) };
+ aProperties.emplace_back( "Prefetch" ,
+ -1,
+ Any(aValue),
+ PropertyState_DIRECT_VALUE);
+ }
+ if (bSkipAllMainSequenceEffects)
+ {
+ // Add one property that prevents the slide transition from being
+ // shown (to speed up the transition to the previous slide) and
+ // one to show all main sequence effects so that the user can
+ // continue to undo effects.
+ aProperties.emplace_back( "SkipAllMainSequenceEffects",
+ -1,
+ Any(true),
+ PropertyState_DIRECT_VALUE);
+ aProperties.emplace_back("SkipSlideTransition",
+ -1,
+ Any(true),
+ PropertyState_DIRECT_VALUE);
+ }
+
+ if( getSlideAPI( nCurrentSlideNumber, xSlide, xAnimNode ) )
+ xShow->displaySlide( xSlide, xDrawPages, xAnimNode, comphelper::containerToSequence(aProperties) );
+}
+
+constexpr OUStringLiteral gsOnClick( u"OnClick" );
+constexpr OUStringLiteral gsBookmark( u"Bookmark" );
+constexpr OUStringLiteral gsVerb( u"Verb" );
+
+SlideshowImpl::SlideshowImpl( const Reference< XPresentation2 >& xPresentation, ViewShell* pViewSh, ::sd::View* pView, SdDrawDocument* pDoc, vcl::Window* pParentWindow )
+: mxModel(pDoc->getUnoModel(),UNO_QUERY_THROW)
+, maUpdateTimer("SlideShowImpl maUpdateTimer")
+, maInputFreezeTimer("SlideShowImpl maInputFreezeTimer")
+, maDeactivateTimer("SlideShowImpl maDeactivateTimer")
+, mpView(pView)
+, mpViewShell(pViewSh)
+, mpDocSh(pDoc->GetDocSh())
+, mpDoc(pDoc)
+, mpParentWindow(pParentWindow)
+, mpShowWindow(nullptr)
+, mnRestoreSlide(0)
+, maPresSize( -1, -1 )
+, meAnimationMode(ANIMATIONMODE_SHOW)
+, mpOldActiveWindow(nullptr)
+, mnChildMask( 0 )
+, mbDisposed(false)
+, mbAutoSaveWasOn(false)
+, mbRehearseTimings(false)
+, mbIsPaused(false)
+, mbWasPaused(false)
+, mbInputFreeze(false)
+, mbActive(false)
+, maPresSettings( pDoc->getPresentationSettings() )
+, mnUserPaintColor( 0x80ff0000L )
+, mbUsePen(false)
+, mdUserPaintStrokeWidth ( 150.0 )
+, mnEndShowEvent(nullptr)
+, mnContextMenuEvent(nullptr)
+, mxPresentation( xPresentation )
+{
+ if( mpViewShell )
+ mpOldActiveWindow = mpViewShell->GetActiveWindow();
+
+ maUpdateTimer.SetInvokeHandler(LINK(this, SlideshowImpl, updateHdl));
+ // Priority must not be too high or we'll starve input handling etc.
+ maUpdateTimer.SetPriority(TaskPriority::REPAINT);
+
+ maDeactivateTimer.SetInvokeHandler(LINK(this, SlideshowImpl, deactivateHdl));
+ maDeactivateTimer.SetTimeout( 20 );
+
+ maInputFreezeTimer.SetInvokeHandler( LINK( this, SlideshowImpl, ReadyForNextInputHdl ) );
+ maInputFreezeTimer.SetTimeout( 20 );
+
+ // no autosave during show
+ if( officecfg::Office::Common::Save::Document::AutoSave::get() )
+ mbAutoSaveWasOn = true;
+
+ Application::AddEventListener( LINK( this, SlideshowImpl, EventListenerHdl ) );
+
+ mbUsePen = maPresSettings.mbMouseAsPen;
+
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(DocumentType::Impress);
+ if( pOptions )
+ {
+ mnUserPaintColor = pOptions->GetPresentationPenColor();
+ mdUserPaintStrokeWidth = pOptions->GetPresentationPenWidth();
+ }
+}
+
+SlideshowImpl::~SlideshowImpl()
+{
+ SdModule *pModule = SD_MOD();
+ //rhbz#806663 SlideshowImpl can outlive SdModule
+ SdOptions* pOptions = pModule ?
+ pModule->GetSdOptions(DocumentType::Impress) : nullptr;
+ if( pOptions )
+ {
+ pOptions->SetPresentationPenColor(mnUserPaintColor);
+ pOptions->SetPresentationPenWidth(mdUserPaintStrokeWidth);
+ }
+
+ Application::RemoveEventListener( LINK( this, SlideshowImpl, EventListenerHdl ) );
+
+ maDeactivateTimer.Stop();
+
+ if( !mbDisposed )
+ {
+ OSL_FAIL("SlideshowImpl::~SlideshowImpl(), component was not disposed!");
+ std::unique_lock g(m_aMutex);
+ disposing(g);
+ }
+}
+
+void SlideshowImpl::disposing(std::unique_lock<std::mutex>&)
+{
+#ifdef ENABLE_SDREMOTE
+ RemoteServer::presentationStopped();
+#endif
+ if( mxShow.is() && mpDoc )
+ NotifyDocumentEvent(
+ *mpDoc,
+ "OnEndPresentation" );
+
+ if( mbAutoSaveWasOn )
+ setAutoSaveState( true );
+
+ if( mnEndShowEvent )
+ Application::RemoveUserEvent( mnEndShowEvent );
+ if( mnContextMenuEvent )
+ Application::RemoveUserEvent( mnContextMenuEvent );
+
+ maInputFreezeTimer.Stop();
+
+ SolarMutexGuard aSolarGuard;
+
+ if( !mxShow.is() )
+ return;
+
+ if( mxPresentation.is() )
+ mxPresentation->end();
+
+ maUpdateTimer.Stop();
+
+ removeShapeEvents();
+
+ if( mxListenerProxy.is() )
+ mxListenerProxy->removeAsSlideShowListener();
+
+ try
+ {
+ if( mxView.is() )
+ mxShow->removeView( mxView );
+
+ Reference< XComponent > xComponent( mxShow, UNO_QUERY );
+ if( xComponent.is() )
+ xComponent->dispose();
+
+ if( mxView.is() )
+ mxView->dispose();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::stop()" );
+ }
+
+ mxShow.clear();
+ mxView.clear();
+ mxListenerProxy.clear();
+ mpSlideController.reset();
+
+ // take DrawView from presentation window, but give the old window back
+ if( mpShowWindow && mpView )
+ mpView->DeleteWindowFromPaintView( mpShowWindow->GetOutDev() );
+
+ if( mpView )
+ mpView->SetAnimationPause( false );
+
+ if( mpViewShell )
+ {
+ mpViewShell->SetActiveWindow(mpOldActiveWindow);
+ if (mpShowWindow)
+ mpShowWindow->SetViewShell( nullptr );
+ }
+
+ if( mpView )
+ mpView->InvalidateAllWin();
+
+ if( maPresSettings.mbFullScreen )
+ {
+#if HAVE_FEATURE_SCRIPTING
+ // restore StarBASICErrorHdl
+ StarBASIC::SetGlobalErrorHdl(maStarBASICGlobalErrorHdl);
+ maStarBASICGlobalErrorHdl = Link<StarBASIC*,bool>();
+#endif
+ }
+ else
+ {
+ if( mpShowWindow )
+ mpShowWindow->Hide();
+ }
+
+ if( meAnimationMode == ANIMATIONMODE_SHOW )
+ {
+ mpDocSh->SetSlotFilter();
+ mpDocSh->ApplySlotFilter();
+
+ Help::EnableContextHelp();
+ Help::EnableExtHelp();
+
+ showChildWindows();
+ mnChildMask = 0;
+ }
+
+ // show current window again
+ if( mpViewShell && dynamic_cast< PresentationViewShell *>( mpViewShell ) == nullptr)
+ {
+ if( meAnimationMode == ANIMATIONMODE_SHOW )
+ {
+ mpViewShell->GetViewShellBase().ShowUIControls (true);
+ mpPaneHider.reset();
+ }
+ else if( meAnimationMode == ANIMATIONMODE_PREVIEW )
+ {
+ mpViewShell->ShowUIControls(true);
+ }
+ }
+
+ if( mpShowWindow )
+ mpShowWindow->Hide();
+ mpShowWindow.disposeAndClear();
+
+ if ( mpViewShell )
+ {
+ if( meAnimationMode == ANIMATIONMODE_SHOW )
+ {
+ ::sd::Window* pActWin = mpViewShell->GetActiveWindow();
+
+ if (pActWin)
+ {
+ Size aVisSizePixel = pActWin->GetOutputSizePixel();
+ ::tools::Rectangle aVisAreaWin = pActWin->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) );
+ mpViewShell->VisAreaChanged(aVisAreaWin);
+ if (mpView)
+ mpView->VisAreaChanged(pActWin->GetOutDev());
+ pActWin->GrabFocus();
+ }
+ }
+
+ // restart the custom show dialog if he started us
+ if( mpViewShell->IsStartShowWithDialog() && getDispatcher() )
+ {
+ mpViewShell->SetStartShowWithDialog( false );
+ getDispatcher()->Execute( SID_CUSTOMSHOW_DLG, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+ }
+
+ mpViewShell->GetViewShellBase().UpdateBorder(true);
+ }
+
+ if( mpShowWindow )
+ {
+ mpShowWindow.disposeAndClear();
+ }
+
+ setActiveXToolbarsVisible( true );
+
+ mbDisposed = true;
+}
+
+bool SlideshowImpl::startPreview(
+ const Reference< XDrawPage >& xDrawPage,
+ const Reference< XAnimationNode >& xAnimationNode,
+ vcl::Window * pParent )
+{
+ bool bRet = false;
+
+ try
+ {
+ const Reference<lang::XServiceInfo> xServiceInfo( xDrawPage, UNO_QUERY );
+ if (xServiceInfo.is()) {
+ const Sequence<OUString> supportedServices(
+ xServiceInfo->getSupportedServiceNames() );
+ if (comphelper::findValue(supportedServices, "com.sun.star.drawing.MasterPage") != -1) {
+ OSL_FAIL("sd::SlideshowImpl::startPreview() "
+ "not allowed on master page!");
+ return false;
+ }
+ }
+
+ mxPreviewDrawPage = xDrawPage;
+ mxPreviewAnimationNode = xAnimationNode;
+ meAnimationMode = ANIMATIONMODE_PREVIEW;
+
+ maPresSettings.mbAll = false;
+ maPresSettings.mbEndless = false;
+ maPresSettings.mbCustomShow = false;
+ maPresSettings.mbManual = false;
+ maPresSettings.mbMouseVisible = false;
+ maPresSettings.mbMouseAsPen = false;
+ maPresSettings.mbLockedPages = false;
+ maPresSettings.mbAlwaysOnTop = false;
+ maPresSettings.mbFullScreen = false;
+ maPresSettings.mbAnimationAllowed = true;
+ maPresSettings.mnPauseTimeout = 0;
+ maPresSettings.mbShowPauseLogo = false;
+
+ Reference< XDrawPagesSupplier > xDrawPages( mpDoc->getUnoModel(), UNO_QUERY_THROW );
+ Reference< XIndexAccess > xSlides( xDrawPages->getDrawPages(), UNO_QUERY_THROW );
+ mpSlideController = std::make_shared<AnimationSlideController>( xSlides, AnimationSlideController::PREVIEW );
+
+ sal_Int32 nSlideNumber = 0;
+ Reference< XPropertySet > xSet( mxPreviewDrawPage, UNO_QUERY_THROW );
+ xSet->getPropertyValue( "Number" ) >>= nSlideNumber;
+ mpSlideController->insertSlideNumber( nSlideNumber-1 );
+ mpSlideController->setPreviewNode( xAnimationNode );
+
+ mpShowWindow = VclPtr<ShowWindow>::Create( this, ((pParent == nullptr) && mpViewShell) ? mpParentWindow.get() : pParent );
+ if( mpViewShell )
+ {
+ mpViewShell->SetActiveWindow( mpShowWindow );
+ mpShowWindow->SetViewShell (mpViewShell);
+ mpViewShell->ShowUIControls (false);
+ }
+
+ if( mpView )
+ {
+ mpView->AddWindowToPaintView( mpShowWindow->GetOutDev(), nullptr );
+ mpView->SetAnimationPause( true );
+ }
+
+ // call resize handler
+ if( pParent )
+ {
+ maPresSize = pParent->GetSizePixel();
+ }
+ else if( mpViewShell )
+ {
+ ::tools::Rectangle aContentRect (mpViewShell->GetViewShellBase().getClientRectangle());
+ if (AllSettings::GetLayoutRTL())
+ {
+ aContentRect.SetLeft( aContentRect.Right() );
+ aContentRect.AdjustRight(aContentRect.Right() );
+ }
+ maPresSize = aContentRect.GetSize();
+ mpShowWindow->SetPosPixel( aContentRect.TopLeft() );
+ }
+ else
+ {
+ OSL_FAIL("sd::SlideshowImpl::startPreview(), I need either a parent window or a viewshell!");
+ }
+ resize( maPresSize );
+
+ sal_Int32 nPropertyCount = 1;
+ if( mxPreviewAnimationNode.is() )
+ nPropertyCount++;
+
+ Sequence< beans::PropertyValue > aProperties(nPropertyCount);
+ auto pProperties = aProperties.getArray();
+ pProperties[0].Name = "AutomaticAdvancement";
+ pProperties[0].Value <<= 1.0; // one second timeout
+
+ if( mxPreviewAnimationNode.is() )
+ {
+ pProperties[1].Name = "NoSlideTransitions";
+ pProperties[1].Value <<= true;
+ }
+
+ bRet = startShowImpl( aProperties );
+
+ if( mpShowWindow != nullptr && meAnimationMode == ANIMATIONMODE_PREVIEW )
+ mpShowWindow->SetPreviewMode();
+
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::startPreview()" );
+ bRet = false;
+ }
+
+ return bRet;
+}
+
+bool SlideshowImpl::startShow( PresentationSettingsEx const * pPresSettings )
+{
+ const rtl::Reference<SlideshowImpl> xKeepAlive(this);
+
+ DBG_ASSERT( !mxShow.is(), "sd::SlideshowImpl::startShow(), called twice!" );
+ if( mxShow.is() )
+ return true;
+ DBG_ASSERT( mpParentWindow!=nullptr, "sd::SlideshowImpl::startShow() called without parent window" );
+ if (mpParentWindow == nullptr)
+ return false;
+
+ // Autoplay (pps/ppsx)
+ if (mpViewShell->GetDoc()->IsStartWithPresentation()){
+ mpViewShell->GetDoc()->SetExitAfterPresenting(true);
+ }
+
+ bool bRet = false;
+
+ try
+ {
+ if( pPresSettings )
+ {
+ maPresSettings = *pPresSettings;
+ mbRehearseTimings = pPresSettings->mbRehearseTimings;
+ }
+
+ OUString aPresSlide( maPresSettings.maPresPage );
+ SdPage* pStartPage = mpViewShell->GetActualPage();
+ bool bStartWithActualSlide = pStartPage;
+
+ // times should be measured?
+ if( mbRehearseTimings )
+ {
+ maPresSettings.mbEndless = false;
+ maPresSettings.mbManual = true;
+ maPresSettings.mbMouseVisible = true;
+ maPresSettings.mbMouseAsPen = false;
+ maPresSettings.mnPauseTimeout = 0;
+ maPresSettings.mbShowPauseLogo = false;
+ }
+
+ if( pStartPage )
+ {
+ if( pStartPage->GetPageKind() == PageKind::Notes )
+ {
+ // we are in notes page mode, so get
+ // the corresponding draw page
+ const sal_uInt16 nPgNum = ( pStartPage->GetPageNum() - 2 ) >> 1;
+ pStartPage = mpDoc->GetSdPage( nPgNum, PageKind::Standard );
+ }
+ }
+
+ if( bStartWithActualSlide )
+ {
+ if ( aPresSlide.isEmpty())
+ {
+ // no preset slide yet, so pick current on one
+ aPresSlide = pStartPage->GetName();
+ // if the starting slide is hidden, we can't set slide controller to ALL mode
+ maPresSettings.mbAll = !pStartPage->IsExcluded();
+ }
+
+ if( meAnimationMode != ANIMATIONMODE_SHOW )
+ {
+ if( pStartPage->GetPageKind() == PageKind::Standard )
+ {
+ maPresSettings.mbAll = false;
+ }
+ }
+ }
+
+ // build page list
+ createSlideList( maPresSettings.mbAll, aPresSlide );
+
+ // remember Slide number from where the show was started
+ if( pStartPage )
+ mnRestoreSlide = ( pStartPage->GetPageNum() - 1 ) / 2;
+
+ if( mpSlideController->hasSlides() )
+ {
+ // hide child windows
+ hideChildWindows();
+
+ mpShowWindow = VclPtr<ShowWindow>::Create( this, mpParentWindow );
+ mpShowWindow->SetMouseAutoHide( !maPresSettings.mbMouseVisible );
+ mpViewShell->SetActiveWindow( mpShowWindow );
+ mpShowWindow->SetViewShell (mpViewShell);
+ mpViewShell->GetViewShellBase().ShowUIControls (false);
+ // Hide the side panes for in-place presentations.
+ if ( ! maPresSettings.mbFullScreen)
+ mpPaneHider.reset(new PaneHider(*mpViewShell,this));
+
+ // these Slots are forbidden in other views for this document
+ if( mpDocSh )
+ {
+ mpDocSh->SetSlotFilter( true, pAllowed );
+ mpDocSh->ApplySlotFilter();
+ }
+
+ Help::DisableContextHelp();
+ Help::DisableExtHelp();
+
+ if( maPresSettings.mbFullScreen )
+ {
+#if HAVE_FEATURE_SCRIPTING
+ // disable basic ide error handling
+ maStarBASICGlobalErrorHdl = StarBASIC::GetGlobalErrorHdl();
+ StarBASIC::SetGlobalErrorHdl( Link<StarBASIC*,bool>() );
+#endif
+ }
+
+ // call resize handler
+ maPresSize = mpParentWindow->GetSizePixel();
+ if (!maPresSettings.mbFullScreen)
+ {
+ const ::tools::Rectangle& aClientRect = mpViewShell->GetViewShellBase().getClientRectangle();
+ maPresSize = aClientRect.GetSize();
+ mpShowWindow->SetPosPixel( aClientRect.TopLeft() );
+ resize( maPresSize );
+ }
+
+ // #i41824#
+ // Note: In FullScreen Mode the OS (window manager) sends a resize to
+ // the WorkWindow once it actually resized it to full size. The
+ // WorkWindow propagates the resize to the DrawViewShell which calls
+ // resize() at the SlideShow (this). Calling resize here results in a
+ // temporary display of a black window in the window's default size
+
+ if( mpView )
+ {
+ mpView->AddWindowToPaintView( mpShowWindow->GetOutDev(), nullptr );
+ mpView->SetAnimationPause( true );
+ }
+
+ SfxBindings* pBindings = getBindings();
+ if( pBindings )
+ {
+ pBindings->Invalidate( SID_PRESENTATION );
+ pBindings->Invalidate( SID_REHEARSE_TIMINGS );
+ }
+
+ // Defer the sd::ShowWindow's GrabFocus to SlideShow::activate. so that the accessible event can be fired correctly.
+ //mpShowWindow->GrabFocus();
+
+ std::vector<beans::PropertyValue> aProperties;
+ aProperties.reserve( 4 );
+
+ aProperties.emplace_back( "AdvanceOnClick" ,
+ -1, Any( !maPresSettings.mbLockedPages ),
+ beans::PropertyState_DIRECT_VALUE );
+
+ aProperties.emplace_back( "ImageAnimationsAllowed" ,
+ -1, Any( maPresSettings.mbAnimationAllowed ),
+ beans::PropertyState_DIRECT_VALUE );
+
+ const bool bZOrderEnabled(
+ SD_MOD()->GetSdOptions( mpDoc->GetDocumentType() )->IsSlideshowRespectZOrder() );
+ aProperties.emplace_back( "DisableAnimationZOrder" ,
+ -1, Any( !bZOrderEnabled ),
+ beans::PropertyState_DIRECT_VALUE );
+
+ aProperties.emplace_back( "ForceManualAdvance" ,
+ -1, Any( maPresSettings.mbManual ),
+ beans::PropertyState_DIRECT_VALUE );
+
+ if( mbUsePen )
+ {
+ aProperties.emplace_back( "UserPaintColor" ,
+ // User paint color is black by default.
+ -1, Any( mnUserPaintColor ),
+ beans::PropertyState_DIRECT_VALUE );
+
+ aProperties.emplace_back( "UserPaintStrokeWidth" ,
+ // User paint color is black by default.
+ -1, Any( mdUserPaintStrokeWidth ),
+ beans::PropertyState_DIRECT_VALUE );
+ }
+
+ if (mbRehearseTimings) {
+ aProperties.emplace_back( "RehearseTimings" ,
+ -1, Any(true), beans::PropertyState_DIRECT_VALUE );
+ }
+
+ bRet = startShowImpl( Sequence<beans::PropertyValue>(
+ aProperties.data(), aProperties.size() ) );
+
+ }
+
+ setActiveXToolbarsVisible( false );
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::startShow()" );
+ bRet = false;
+ }
+
+ return bRet;
+}
+
+bool SlideshowImpl::startShowImpl( const Sequence< beans::PropertyValue >& aProperties )
+{
+ try
+ {
+ mxShow.set( createSlideShow(), UNO_SET_THROW );
+
+ mxView = new SlideShowView(
+ *mpShowWindow,
+ mpDoc,
+ meAnimationMode,
+ this,
+ maPresSettings.mbFullScreen);
+
+ // try add wait symbol to properties:
+ const Reference<rendering::XSpriteCanvas> xSpriteCanvas(
+ mxView->getCanvas() );
+ if (xSpriteCanvas.is())
+ {
+ BitmapEx waitSymbolBitmap(BMP_WAIT_ICON);
+ const Reference<rendering::XBitmap> xBitmap(
+ vcl::unotools::xBitmapFromBitmapEx( waitSymbolBitmap ) );
+ if (xBitmap.is())
+ {
+ mxShow->setProperty(
+ beans::PropertyValue( "WaitSymbolBitmap" ,
+ -1,
+ Any( xBitmap ),
+ beans::PropertyState_DIRECT_VALUE ) );
+ }
+
+ BitmapEx pointerSymbolBitmap(BMP_POINTER_ICON);
+ const Reference<rendering::XBitmap> xPointerBitmap(
+ vcl::unotools::xBitmapFromBitmapEx( pointerSymbolBitmap ) );
+ if (xPointerBitmap.is())
+ {
+ mxShow->setProperty(
+ beans::PropertyValue( "PointerSymbolBitmap" ,
+ -1,
+ Any( xPointerBitmap ),
+ beans::PropertyState_DIRECT_VALUE ) );
+ }
+ }
+
+ for( const auto& rProp : aProperties )
+ mxShow->setProperty( rProp );
+
+ mxShow->addView( mxView );
+
+ mxListenerProxy.set( new SlideShowListenerProxy( this, mxShow ) );
+ mxListenerProxy->addAsSlideShowListener();
+
+ NotifyDocumentEvent(
+ *mpDoc,
+ "OnStartPresentation");
+ displaySlideIndex( mpSlideController->getStartSlideIndex() );
+
+ return true;
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::startShowImpl()" );
+ return false;
+ }
+}
+
+/** called only by the slideshow view when the first paint event occurs.
+ This actually starts the slideshow. */
+void SlideshowImpl::onFirstPaint()
+{
+ if( mpShowWindow )
+ {
+ /*
+ mpShowWindow->SetBackground( Wallpaper( COL_BLACK ) );
+ mpShowWindow->Erase();
+ mpShowWindow->SetBackground();
+ */
+ }
+
+ SolarMutexGuard aSolarGuard;
+ maUpdateTimer.SetTimeout( sal_uLong(100) );
+ maUpdateTimer.Start();
+}
+
+void SlideshowImpl::paint()
+{
+ if( mxView.is() ) try
+ {
+ awt::PaintEvent aEvt;
+ // aEvt.UpdateRect = TODO
+ mxView->paint( aEvt );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::paint()" );
+ }
+}
+
+void SAL_CALL SlideshowImpl::addSlideShowListener( const Reference< XSlideShowListener >& xListener )
+{
+ if( mxListenerProxy.is() )
+ mxListenerProxy->addSlideShowListener( xListener );
+}
+
+void SAL_CALL SlideshowImpl::removeSlideShowListener( const Reference< XSlideShowListener >& xListener )
+{
+ if( mxListenerProxy.is() )
+ mxListenerProxy->removeSlideShowListener( xListener );
+}
+
+void SlideshowImpl::slideEnded(const bool bReverse)
+{
+ if (bReverse)
+ gotoPreviousSlide(true);
+ else
+ gotoNextSlide();
+}
+
+bool SlideshowImpl::swipe(const CommandSwipeData &rSwipeData)
+{
+ if (mbUsePen || mnContextMenuEvent)
+ return false;
+ double nVelocityX = rSwipeData.getVelocityX();
+ // tdf#108475 make it swipe only if some reasonable movement was involved
+ if (fabs(nVelocityX) < 50)
+ return false;
+ if (nVelocityX > 0)
+ {
+ gotoPreviousSlide();
+ }
+ else
+ {
+ gotoNextEffect();
+ }
+ //a swipe is followed by a mouse up, tell the view to ignore that mouse up as we've reacted
+ //to the swipe instead
+ mxView->ignoreNextMouseReleased();
+ return true;
+}
+
+bool SlideshowImpl::longpress(const CommandLongPressData &rLongPressData)
+{
+ if (mnContextMenuEvent)
+ return false;
+
+ maPopupMousePos = Point(rLongPressData.getX(), rLongPressData.getY());
+ mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) );
+
+ return true;
+}
+
+void SlideshowImpl::removeShapeEvents()
+{
+ if( !(mxShow.is() && mxListenerProxy.is()) )
+ return;
+
+ try
+ {
+ for( const auto& rEntry : maShapeEventMap )
+ {
+ mxListenerProxy->removeShapeEventListener( rEntry.first );
+ mxShow->setShapeCursor( rEntry.first, awt::SystemPointer::ARROW );
+ }
+
+ maShapeEventMap.clear();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::removeShapeEvents()" );
+ }
+}
+
+void SlideshowImpl::registerShapeEvents(sal_Int32 nSlideNumber)
+{
+ if( nSlideNumber < 0 )
+ return;
+
+ try
+ {
+ Reference< XDrawPagesSupplier > xDrawPages( mxModel, UNO_QUERY_THROW );
+ Reference< XIndexAccess > xPages( xDrawPages->getDrawPages(), UNO_QUERY_THROW );
+
+ Reference< XShapes > xDrawPage;
+ xPages->getByIndex(nSlideNumber) >>= xDrawPage;
+
+ if( xDrawPage.is() )
+ {
+ Reference< XMasterPageTarget > xMasterPageTarget( xDrawPage, UNO_QUERY );
+ if( xMasterPageTarget.is() )
+ {
+ Reference< XShapes > xMasterPage = xMasterPageTarget->getMasterPage();
+ if( xMasterPage.is() )
+ registerShapeEvents( xMasterPage );
+ }
+ registerShapeEvents( xDrawPage );
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::registerShapeEvents()" );
+ }
+}
+
+void SlideshowImpl::registerShapeEvents( Reference< XShapes > const & xShapes )
+{
+ try
+ {
+ const sal_Int32 nShapeCount = xShapes->getCount();
+ sal_Int32 nShape;
+ for( nShape = 0; nShape < nShapeCount; nShape++ )
+ {
+ Reference< XShape > xShape;
+ xShapes->getByIndex( nShape ) >>= xShape;
+
+ if( xShape.is() && xShape->getShapeType() == "com.sun.star.drawing.GroupShape" )
+ {
+ Reference< XShapes > xSubShapes( xShape, UNO_QUERY );
+ if( xSubShapes.is() )
+ registerShapeEvents( xSubShapes );
+ }
+
+ Reference< XPropertySet > xSet( xShape, UNO_QUERY );
+ if( !xSet.is() )
+ continue;
+
+ Reference< XPropertySetInfo > xSetInfo( xSet->getPropertySetInfo() );
+ if( !xSetInfo.is() || !xSetInfo->hasPropertyByName( gsOnClick ) )
+ continue;
+
+ WrappedShapeEventImplPtr pEvent = std::make_shared<WrappedShapeEventImpl>();
+ xSet->getPropertyValue( gsOnClick ) >>= pEvent->meClickAction;
+
+ switch( pEvent->meClickAction )
+ {
+ case ClickAction_PREVPAGE:
+ case ClickAction_NEXTPAGE:
+ case ClickAction_FIRSTPAGE:
+ case ClickAction_LASTPAGE:
+ case ClickAction_STOPPRESENTATION:
+ break;
+ case ClickAction_BOOKMARK:
+ if( xSetInfo->hasPropertyByName( gsBookmark ) )
+ xSet->getPropertyValue( gsBookmark ) >>= pEvent->maStrBookmark;
+ if( getSlideNumberForBookmark( pEvent->maStrBookmark ) == -1 )
+ continue;
+ break;
+ case ClickAction_DOCUMENT:
+ case ClickAction_SOUND:
+ case ClickAction_PROGRAM:
+ case ClickAction_MACRO:
+ if( xSetInfo->hasPropertyByName( gsBookmark ) )
+ xSet->getPropertyValue( gsBookmark ) >>= pEvent->maStrBookmark;
+ break;
+ case ClickAction_VERB:
+ if( xSetInfo->hasPropertyByName( gsVerb ) )
+ xSet->getPropertyValue( gsVerb ) >>= pEvent->mnVerb;
+ break;
+ default:
+ continue; // skip all others
+ }
+
+ maShapeEventMap[ xShape ] = pEvent;
+
+ if( mxListenerProxy.is() )
+ mxListenerProxy->addShapeEventListener( xShape );
+ mxShow->setShapeCursor( xShape, awt::SystemPointer::REFHAND );
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::registerShapeEvents()" );
+ }
+}
+
+void SlideshowImpl::displayCurrentSlide (const bool bSkipAllMainSequenceEffects)
+{
+ stopSound();
+ removeShapeEvents();
+
+ if( mpSlideController && mxShow.is() )
+ {
+ Reference< XDrawPagesSupplier > xDrawPages( mpDoc->getUnoModel(),
+ UNO_QUERY_THROW );
+ mpSlideController->displayCurrentSlide( mxShow, xDrawPages, bSkipAllMainSequenceEffects );
+ registerShapeEvents(mpSlideController->getCurrentSlideNumber());
+ update();
+
+ }
+ // send out page change event and notify to update all acc info for current page
+ if (mpViewShell)
+ {
+ sal_Int32 currentPageIndex = getCurrentSlideIndex();
+ mpViewShell->fireSwitchCurrentPage(currentPageIndex);
+ mpViewShell->NotifyAccUpdate();
+ }
+}
+
+void SlideshowImpl::endPresentation()
+{
+ if( maPresSettings.mbMouseAsPen)
+ {
+ Reference< XMultiServiceFactory > xDocFactory(mpDoc->getUnoModel(), UNO_QUERY );
+ if( xDocFactory.is() )
+ mxShow->registerUserPaintPolygons(xDocFactory);
+ }
+
+ if( !mnEndShowEvent )
+ mnEndShowEvent = Application::PostUserEvent( LINK(this, SlideshowImpl, endPresentationHdl) );
+}
+
+IMPL_LINK_NOARG(SlideshowImpl, endPresentationHdl, void*, void)
+{
+ mnEndShowEvent = nullptr;
+
+ stopSound();
+
+ if( mxPresentation.is() )
+ mxPresentation->end();
+}
+
+void SAL_CALL SlideshowImpl::pause()
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( mbIsPaused )
+ return;
+
+ try
+ {
+ mbIsPaused = true;
+ if( mxShow.is() )
+ {
+ mxShow->pause(true);
+
+ if( mxListenerProxy.is() )
+ mxListenerProxy->paused();
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::pause()" );
+ }
+}
+
+void SAL_CALL SlideshowImpl::resume()
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( mbIsPaused ) try
+ {
+ if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_BLANK || mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_END )
+ {
+ mpShowWindow->RestartShow();
+ }
+ else
+ {
+ mbIsPaused = false;
+ if( mxShow.is() )
+ {
+ mxShow->pause(false);
+ update();
+
+ if( mxListenerProxy.is() )
+ mxListenerProxy->resumed();
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::resume()" );
+ }
+#ifdef ENABLE_SDREMOTE
+ RemoteServer::presentationStarted( this );
+#endif
+}
+
+sal_Bool SAL_CALL SlideshowImpl::isPaused()
+{
+ SolarMutexGuard aSolarGuard;
+ return mbIsPaused;
+}
+
+void SAL_CALL SlideshowImpl::blankScreen( sal_Int32 nColor )
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( mpShowWindow && mpSlideController )
+ {
+ if( mpShowWindow->SetBlankMode( mpSlideController->getCurrentSlideIndex(), Color(ColorTransparency, nColor) ) )
+ {
+ pause();
+ }
+ }
+}
+
+// XShapeEventListener
+
+void SlideshowImpl::click( const Reference< XShape >& xShape )
+{
+ SolarMutexGuard aSolarGuard;
+
+ WrappedShapeEventImplPtr pEvent = maShapeEventMap[xShape];
+ if( !pEvent )
+ return;
+
+ switch( pEvent->meClickAction )
+ {
+ case ClickAction_PREVPAGE: gotoPreviousSlide(); break;
+ case ClickAction_NEXTPAGE: gotoNextSlide(); break;
+ case ClickAction_FIRSTPAGE: gotoFirstSlide(); break;
+ case ClickAction_LASTPAGE: gotoLastSlide(); break;
+ case ClickAction_STOPPRESENTATION: endPresentation(); break;
+ case ClickAction_BOOKMARK:
+ {
+ gotoBookmark( pEvent->maStrBookmark );
+ }
+ break;
+ case ClickAction_SOUND:
+ {
+#if HAVE_FEATURE_AVMEDIA
+ try
+ {
+ mxPlayer.set(avmedia::MediaWindow::createPlayer(pEvent->maStrBookmark, ""/*TODO?*/), uno::UNO_SET_THROW );
+ mxPlayer->start();
+ }
+ catch( uno::Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::click()" );
+ }
+#endif
+ }
+ break;
+
+ case ClickAction_DOCUMENT:
+ {
+ OUString aBookmark( pEvent->maStrBookmark );
+
+ sal_Int32 nPos = aBookmark.indexOf( '#' );
+ if( nPos >= 0 )
+ {
+ OUString aURL( aBookmark.copy( 0, nPos+1 ) );
+ OUString aName( aBookmark.copy( nPos+1 ) );
+ aURL += getUiNameFromPageApiNameImpl( aName );
+ aBookmark = aURL;
+ }
+
+ mpDocSh->OpenBookmark( aBookmark );
+ }
+ break;
+
+ case ClickAction_PROGRAM:
+ {
+ INetURLObject aURL(
+ ::URIHelper::SmartRel2Abs(
+ INetURLObject(mpDocSh->GetMedium()->GetBaseURL()),
+ pEvent->maStrBookmark, ::URIHelper::GetMaybeFileHdl(), true,
+ false, INetURLObject::EncodeMechanism::WasEncoded,
+ INetURLObject::DecodeMechanism::Unambiguous ) );
+
+ if( INetProtocol::File == aURL.GetProtocol() )
+ {
+ SfxStringItem aUrl( SID_FILE_NAME, aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
+ SfxBoolItem aBrowsing( SID_BROWSE, true );
+
+ SfxViewFrame* pViewFrm = SfxViewFrame::Current();
+ if (pViewFrm)
+ {
+ SfxUnoFrameItem aDocFrame(SID_FILLFRAME, pViewFrm->GetFrame().GetFrameInterface());
+ pViewFrm->GetDispatcher()->ExecuteList( SID_OPENDOC,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aUrl, &aBrowsing }, { &aDocFrame } );
+ }
+ }
+ }
+ break;
+
+#if HAVE_FEATURE_SCRIPTING
+ case presentation::ClickAction_MACRO:
+ {
+ const OUString aMacro( pEvent->maStrBookmark );
+
+ if ( SfxApplication::IsXScriptURL( aMacro ) )
+ {
+ Any aRet;
+ Sequence< sal_Int16 > aOutArgsIndex;
+ Sequence< Any > aOutArgs;
+ Sequence< Any >* pInArgs = new Sequence< Any >(0);
+ mpDocSh->CallXScript( aMacro, *pInArgs, aRet, aOutArgsIndex, aOutArgs);
+ }
+ else
+ {
+ // aMacro has the following syntax:
+ // "Macroname.Modulname.Libname.Documentname" or
+ // "Macroname.Modulname.Libname.Applicationname"
+ sal_Int32 nIdx{ 0 };
+ const std::u16string_view aMacroName = o3tl::getToken(aMacro, 0, '.', nIdx);
+ const std::u16string_view aModulName = o3tl::getToken(aMacro, 0, '.', nIdx);
+
+ // todo: is the limitation still given that only
+ // Modulname+Macroname can be used here?
+ OUString aExecMacro = OUString::Concat(aModulName) + "." + aMacroName;
+ mpDocSh->GetBasic()->Call(aExecMacro);
+ }
+ }
+ break;
+#endif
+
+ case ClickAction_VERB:
+ {
+ // todo, better do it async?
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape(xShape);
+ SdrOle2Obj* pOleObject = dynamic_cast< SdrOle2Obj* >(pObj);
+ if (pOleObject && mpViewShell )
+ mpViewShell->ActivateObject(pOleObject, pEvent->mnVerb);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+sal_Int32 SlideshowImpl::getSlideNumberForBookmark( const OUString& rStrBookmark )
+{
+ bool bIsMasterPage;
+ OUString aBookmark = getUiNameFromPageApiNameImpl( rStrBookmark );
+ sal_uInt16 nPgNum = mpDoc->GetPageByName( aBookmark, bIsMasterPage );
+
+ if( nPgNum == SDRPAGE_NOTFOUND )
+ {
+ // Is the bookmark an object?
+ SdrObject* pObj = mpDoc->GetObj( aBookmark );
+
+ if( pObj )
+ {
+ nPgNum = pObj->getSdrPageFromSdrObject()->GetPageNum();
+ bIsMasterPage = pObj->getSdrPageFromSdrObject()->IsMasterPage();
+ }
+ }
+
+ if( (nPgNum == SDRPAGE_NOTFOUND) || bIsMasterPage || static_cast<SdPage*>(mpDoc->GetPage(nPgNum))->GetPageKind() != PageKind::Standard )
+ return -1;
+
+ return ( nPgNum - 1) >> 1;
+}
+
+void SlideshowImpl::hyperLinkClicked( OUString const& aHyperLink )
+{
+ OUString aBookmark( aHyperLink );
+
+ sal_Int32 nPos = aBookmark.indexOf( '#' );
+ if( nPos >= 0 )
+ {
+ OUString aURL( aBookmark.copy( 0, nPos+1 ) );
+ OUString aName( aBookmark.copy( nPos+1 ) );
+ aURL += getUiNameFromPageApiNameImpl( aName );
+ aBookmark = aURL;
+ }
+
+ mpDocSh->OpenBookmark( aBookmark );
+}
+
+void SlideshowImpl::displaySlideNumber( sal_Int32 nSlideNumber )
+{
+ if( mpSlideController )
+ {
+ if( mpSlideController->jumpToSlideNumber( nSlideNumber ) )
+ {
+ displayCurrentSlide();
+ }
+ }
+}
+
+/** nSlideIndex == -1 displays current slide again */
+void SlideshowImpl::displaySlideIndex( sal_Int32 nSlideIndex )
+{
+ if( mpSlideController )
+ {
+ if( (nSlideIndex == -1) || mpSlideController->jumpToSlideIndex( nSlideIndex ) )
+ {
+ displayCurrentSlide();
+ }
+ }
+}
+
+void SlideshowImpl::jumpToBookmark( const OUString& sBookmark )
+{
+ sal_Int32 nSlideNumber = getSlideNumberForBookmark( sBookmark );
+ if( nSlideNumber != -1 )
+ displaySlideNumber( nSlideNumber );
+}
+
+sal_Int32 SlideshowImpl::getCurrentSlideNumber() const
+{
+ return mpSlideController ? mpSlideController->getCurrentSlideNumber() : -1;
+}
+
+sal_Bool SAL_CALL SlideshowImpl::isEndless()
+{
+ SolarMutexGuard aSolarGuard;
+ return maPresSettings.mbEndless;
+}
+
+void SlideshowImpl::update()
+{
+ startUpdateTimer();
+}
+
+void SlideshowImpl::startUpdateTimer()
+{
+ SolarMutexGuard aSolarGuard;
+ maUpdateTimer.SetTimeout( 0 );
+ maUpdateTimer.Start();
+}
+
+/** this timer is called 20ms after a new slide was displayed.
+ This is used to unfreeze user input that was disabled after
+ slide change to skip input that was buffered during slide
+ transition preparation */
+IMPL_LINK_NOARG(SlideshowImpl, ReadyForNextInputHdl, Timer *, void)
+{
+ mbInputFreeze = false;
+}
+
+/** if I catch someone someday who calls this method by hand
+ and not by using the timer, I will personally punish this
+ person seriously, even if this person is me.
+*/
+IMPL_LINK_NOARG(SlideshowImpl, updateHdl, Timer *, void)
+{
+ updateSlideShow();
+}
+
+void SlideshowImpl::updateSlideShow()
+{
+ // prevent me from deletion when recursing (App::EnableYieldMode does)
+ const rtl::Reference<SlideshowImpl> xKeepAlive(this);
+
+ Reference< XSlideShow > xShow( mxShow );
+ if ( ! xShow.is())
+ return;
+
+ try
+ {
+ double fUpdate = 0.0;
+ if( !xShow->update(fUpdate) )
+ fUpdate = -1.0;
+
+ if (mxShow.is() && (fUpdate >= 0.0))
+ {
+ if (::basegfx::fTools::equalZero(fUpdate))
+ {
+ // Make sure idle tasks don't starve when we don't have to wait.
+ // Don't process any events generated after invoking the function.
+ Application::Reschedule(/*bHandleAllCurrentEvents=*/true);
+ }
+ else
+ {
+ // Avoid busy loop when the previous call to update()
+ // returns a small positive number but not 0 (which is
+ // handled above). Also, make sure that calls to update()
+ // have a minimum frequency.
+ // => Allow up to 60 frames per second. Call at least once
+ // every 4 seconds.
+ const static sal_Int32 nMaximumFrameCount (60);
+ const static double nMinimumTimeout (1.0 / nMaximumFrameCount);
+ const static double nMaximumTimeout (4.0);
+ fUpdate = std::clamp(fUpdate, nMinimumTimeout, nMaximumTimeout);
+
+ // Make sure that the maximum frame count has not been set
+ // too high (only then conversion to milliseconds and long
+ // integer may lead to zero value.)
+ OSL_ASSERT(static_cast<sal_uLong>(fUpdate * 1000.0) > 0);
+ }
+
+ // Use our high resolution timers for the asynchronous callback.
+ maUpdateTimer.SetTimeout(static_cast<sal_uLong>(fUpdate * 1000.0));
+ maUpdateTimer.Start();
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::updateSlideShow()" );
+ }
+}
+
+bool SlideshowImpl::keyInput(const KeyEvent& rKEvt)
+{
+ if( !mxShow.is() || mbInputFreeze )
+ return false;
+
+ bool bRet = true;
+
+ try
+ {
+ const int nKeyCode = rKEvt.GetKeyCode().GetCode();
+ switch( nKeyCode )
+ {
+ case awt::Key::CONTEXTMENU:
+ if( !mnContextMenuEvent )
+ {
+ if( mpShowWindow )
+ maPopupMousePos = mpShowWindow->GetPointerState().maPos;
+ mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) );
+ }
+ break;
+
+ // cancel show
+ case KEY_ESCAPE:
+ case KEY_SUBTRACT:
+ // in case the user cancels the presentation, switch to current slide
+ // in edit mode
+ if( mpSlideController && (ANIMATIONMODE_SHOW == meAnimationMode) )
+ {
+ if( mpSlideController->getCurrentSlideNumber() != -1 )
+ mnRestoreSlide = mpSlideController->getCurrentSlideNumber();
+ }
+ endPresentation();
+ break;
+
+ // advance show
+ case KEY_PAGEDOWN:
+ if(rKEvt.GetKeyCode().IsMod2())
+ {
+ gotoNextSlide();
+ break;
+ }
+ [[fallthrough]];
+ case KEY_SPACE:
+ case KEY_RIGHT:
+ case KEY_DOWN:
+ gotoNextEffect();
+ break;
+
+ case KEY_RETURN:
+ {
+ if( !maCharBuffer.isEmpty() )
+ {
+ if( mpSlideController )
+ {
+ if( mpSlideController->jumpToSlideNumber( maCharBuffer.toInt32() - 1 ) )
+ displayCurrentSlide();
+ }
+ maCharBuffer.clear();
+ }
+ else
+ {
+ gotoNextEffect();
+ }
+ }
+ break;
+
+ // numeric: add to buffer
+ case KEY_0:
+ case KEY_1:
+ case KEY_2:
+ case KEY_3:
+ case KEY_4:
+ case KEY_5:
+ case KEY_6:
+ case KEY_7:
+ case KEY_8:
+ case KEY_9:
+ maCharBuffer += OUStringChar( rKEvt.GetCharCode() );
+ break;
+
+ case KEY_PAGEUP:
+ if(rKEvt.GetKeyCode().IsMod2())
+ {
+ gotoPreviousSlide();
+ break;
+ }
+ [[fallthrough]];
+ case KEY_LEFT:
+ case KEY_UP:
+ case KEY_BACKSPACE:
+ gotoPreviousEffect();
+ break;
+
+ case KEY_P:
+ setUsePen( !mbUsePen );
+ break;
+
+ // tdf#149351 Ctrl+A disables pointer as pen mode
+ case KEY_A:
+ if(rKEvt.GetKeyCode().IsMod1())
+ {
+ setUsePen( false );
+ break;
+ }
+ break;
+
+ case KEY_E:
+ setEraseAllInk( true );
+ updateSlideShow();
+ break;
+
+ case KEY_HOME:
+ gotoFirstSlide();
+ break;
+
+ case KEY_END:
+ gotoLastSlide();
+ break;
+
+ case KEY_B:
+ case KEY_W:
+ case KEY_POINT:
+ case KEY_COMMA:
+ {
+ blankScreen( ((nKeyCode == KEY_W ) || (nKeyCode == KEY_COMMA)) ? 0x00ffffff : 0x00000000 );
+ }
+ break;
+
+ default:
+ bRet = false;
+ break;
+ }
+ }
+ catch( Exception& )
+ {
+ bRet = false;
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::keyInput()" );
+ }
+
+ return bRet;
+}
+
+IMPL_LINK( SlideshowImpl, EventListenerHdl, VclSimpleEvent&, rSimpleEvent, void )
+{
+ if( !mxShow.is() || mbInputFreeze )
+ return;
+
+ if( !((rSimpleEvent.GetId() == VclEventId::WindowCommand) && static_cast<VclWindowEvent*>(&rSimpleEvent)->GetData()) )
+ return;
+
+ const CommandEvent& rEvent = *static_cast<const CommandEvent*>(static_cast<VclWindowEvent*>(&rSimpleEvent)->GetData());
+
+ if( rEvent.GetCommand() != CommandEventId::Media )
+ return;
+
+ CommandMediaData* pMediaData = rEvent.GetMediaData();
+ pMediaData->SetPassThroughToOS(false);
+ switch (pMediaData->GetMediaId())
+ {
+#if defined( MACOSX )
+ case MediaCommand::Menu:
+ if( !mnContextMenuEvent )
+ {
+ if( mpShowWindow )
+ maPopupMousePos = mpShowWindow->GetPointerState().maPos;
+ mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) );
+ }
+ break;
+ case MediaCommand::VolumeDown:
+ gotoPreviousSlide();
+ break;
+ case MediaCommand::VolumeUp:
+ gotoNextEffect();
+ break;
+#endif
+ case MediaCommand::NextTrack:
+ gotoNextEffect();
+ break;
+ case MediaCommand::Pause:
+ if( !mbIsPaused )
+ blankScreen(0);
+ break;
+ case MediaCommand::Play:
+ if( mbIsPaused )
+ resume();
+ break;
+
+ case MediaCommand::PlayPause:
+ if( mbIsPaused )
+ resume();
+ else
+ blankScreen(0);
+ break;
+ case MediaCommand::PreviousTrack:
+ gotoPreviousSlide();
+ break;
+ case MediaCommand::NextTrackHold:
+ gotoLastSlide();
+ break;
+
+ case MediaCommand::Rewind:
+ gotoFirstSlide();
+ break;
+ case MediaCommand::Stop:
+ // in case the user cancels the presentation, switch to current slide
+ // in edit mode
+ if( mpSlideController && (ANIMATIONMODE_SHOW == meAnimationMode) )
+ {
+ if( mpSlideController->getCurrentSlideNumber() != -1 )
+ mnRestoreSlide = mpSlideController->getCurrentSlideNumber();
+ }
+ endPresentation();
+ break;
+ default:
+ pMediaData->SetPassThroughToOS(true);
+ break;
+ }
+}
+
+void SlideshowImpl::mouseButtonUp(const MouseEvent& rMEvt)
+{
+ if( rMEvt.IsRight() && !mnContextMenuEvent )
+ {
+ maPopupMousePos = rMEvt.GetPosPixel();
+ mnContextMenuEvent = Application::PostUserEvent( LINK( this, SlideshowImpl, ContextMenuHdl ) );
+ }
+}
+
+IMPL_LINK_NOARG(SlideshowImpl, ContextMenuHdl, void*, void)
+{
+ mnContextMenuEvent = nullptr;
+
+ if (mpSlideController == nullptr)
+ return;
+
+ mbWasPaused = mbIsPaused;
+ if( !mbWasPaused )
+ pause();
+
+ std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(nullptr, "modules/simpress/ui/slidecontextmenu.ui"));
+ std::unique_ptr<weld::Menu> xMenu(xBuilder->weld_menu("menu"));
+ OUString sNextImage(BMP_MENU_NEXT), sPrevImage(BMP_MENU_PREV);
+ xMenu->insert(0, "next", SdResId(RID_SVXSTR_MENU_NEXT), &sNextImage, nullptr, nullptr, TRISTATE_INDET);
+ xMenu->insert(1, "prev", SdResId(RID_SVXSTR_MENU_PREV), &sPrevImage, nullptr, nullptr, TRISTATE_INDET);
+
+ // Adding button to display if in Pen mode
+ xMenu->set_active("pen", mbUsePen);
+
+ const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
+ xMenu->set_visible("next", mpSlideController->getNextSlideIndex() != -1);
+ xMenu->set_visible("prev", (mpSlideController->getPreviousSlideIndex() != -1 ) || (eMode == SHOWWINDOWMODE_END) || (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK));
+ xMenu->set_visible("edit", mpViewShell->GetDoc()->IsStartWithPresentation());
+
+ std::unique_ptr<weld::Menu> xPageMenu(xBuilder->weld_menu("gotomenu"));
+ OUString sFirstImage(BMP_MENU_FIRST), sLastImage(BMP_MENU_LAST);
+ xPageMenu->insert(0, "first", SdResId(RID_SVXSTR_MENU_FIRST), &sFirstImage, nullptr, nullptr, TRISTATE_INDET);
+ xPageMenu->insert(1, "last", SdResId(RID_SVXSTR_MENU_LAST), &sLastImage, nullptr, nullptr, TRISTATE_INDET);
+
+ // populate slide goto list
+ const sal_Int32 nPageNumberCount = mpSlideController->getSlideNumberCount();
+ if( nPageNumberCount <= 1 )
+ {
+ xMenu->set_visible("goto", false);
+ }
+ else
+ {
+ sal_Int32 nCurrentSlideNumber = mpSlideController->getCurrentSlideNumber();
+ if( (eMode == SHOWWINDOWMODE_END) || (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
+ nCurrentSlideNumber = -1;
+
+ xPageMenu->set_visible("first", mpSlideController->getSlideNumber(0) != nCurrentSlideNumber);
+ xPageMenu->set_visible("last", mpSlideController->getSlideNumber(mpSlideController->getSlideIndexCount() - 1) != nCurrentSlideNumber);
+
+ sal_Int32 nPageNumber;
+
+ for( nPageNumber = 0; nPageNumber < nPageNumberCount; nPageNumber++ )
+ {
+ if( mpSlideController->isVisibleSlideNumber( nPageNumber ) )
+ {
+ SdPage* pPage = mpDoc->GetSdPage(static_cast<sal_uInt16>(nPageNumber), PageKind::Standard);
+ if (pPage)
+ {
+ OUString sId(OUString::number(CM_SLIDES + nPageNumber));
+ xPageMenu->append_check(sId, pPage->GetName());
+ if (nPageNumber == nCurrentSlideNumber)
+ xPageMenu->set_active(sId.toUtf8(), true);
+ }
+ }
+ }
+ }
+
+ std::unique_ptr<weld::Menu> xBlankMenu(xBuilder->weld_menu("screenmenu"));
+
+ if (mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_BLANK)
+ {
+ xBlankMenu->set_active((mpShowWindow->GetBlankColor() == COL_WHITE) ? "white" : "black", true);
+ }
+
+ std::unique_ptr<weld::Menu> xWidthMenu(xBuilder->weld_menu("widthmenu"));
+
+ // populate color width list
+ sal_Int32 nIterator;
+ double nWidth;
+
+ nWidth = 4.0;
+ for( nIterator = 1; nIterator < 6; nIterator++)
+ {
+ switch(nIterator)
+ {
+ case 1:
+ nWidth = 4.0;
+ break;
+ case 2:
+ nWidth = 100.0;
+ break;
+ case 3:
+ nWidth = 150.0;
+ break;
+ case 4:
+ nWidth = 200.0;
+ break;
+ case 5:
+ nWidth = 400.0;
+ break;
+ default:
+ break;
+ }
+
+ if (nWidth == mdUserPaintStrokeWidth)
+ xWidthMenu->set_active(OString::number(nWidth), true);
+ }
+
+ ::tools::Rectangle aRect(maPopupMousePos, Size(1,1));
+ weld::Window* pParent = weld::GetPopupParent(*mpShowWindow, aRect);
+ ContextMenuSelectHdl(xMenu->popup_at_rect(pParent, aRect));
+
+ if( mxView.is() )
+ mxView->ignoreNextMouseReleased();
+
+ if( !mbWasPaused )
+ resume();
+}
+
+void SlideshowImpl::ContextMenuSelectHdl(std::string_view rMenuId)
+{
+ if (rMenuId == "prev")
+ {
+ gotoPreviousSlide();
+ mbWasPaused = false;
+ }
+ else if(rMenuId == "next")
+ {
+ gotoNextSlide();
+ mbWasPaused = false;
+ }
+ else if (rMenuId == "first")
+ {
+ gotoFirstSlide();
+ mbWasPaused = false;
+ }
+ else if (rMenuId == "last")
+ {
+ gotoLastSlide();
+ mbWasPaused = false;
+ }
+ else if (rMenuId == "black" || rMenuId == "white")
+ {
+ const Color aBlankColor(rMenuId == "white" ? COL_WHITE : COL_BLACK);
+ if( mbWasPaused )
+ {
+ if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_BLANK )
+ {
+ if( mpShowWindow->GetBlankColor() == aBlankColor )
+ {
+ mbWasPaused = false;
+ mpShowWindow->RestartShow();
+ return;
+ }
+ }
+ mpShowWindow->RestartShow();
+ }
+ if( mpShowWindow->SetBlankMode( mpSlideController->getCurrentSlideIndex(), aBlankColor ) )
+ {
+ pause();
+ mbWasPaused = true;
+ }
+ }
+ else if (rMenuId == "color")
+ {
+ //Open a color picker based on SvColorDialog
+ ::Color aColor( ColorTransparency, mnUserPaintColor );
+ SvColorDialog aColorDlg;
+ aColorDlg.SetColor( aColor );
+
+ if (aColorDlg.Execute(mpShowWindow->GetFrameWeld()))
+ {
+ aColor = aColorDlg.GetColor();
+ setPenColor(sal_Int32(aColor));
+ }
+ mbWasPaused = false;
+ }
+ else if (rMenuId == "4")
+ {
+ setPenWidth(4.0);
+ mbWasPaused = false;
+ }
+ else if (rMenuId == "100")
+ {
+ setPenWidth(100.0);
+ mbWasPaused = false;
+ }
+ else if (rMenuId == "150")
+ {
+ setPenWidth(150.0);
+ mbWasPaused = false;
+ }
+ else if (rMenuId == "200")
+ {
+ setPenWidth(200.0);
+ mbWasPaused = false;
+ }
+ else if (rMenuId == "400")
+ {
+ setPenWidth(400.0);
+ mbWasPaused = false;
+ }
+ else if (rMenuId == "erase")
+ {
+ setEraseAllInk(true);
+ mbWasPaused = false;
+ }
+ else if (rMenuId == "pen")
+ {
+ setUsePen(!mbUsePen);
+ mbWasPaused = false;
+ }
+ else if (rMenuId == "edit")
+ {
+ // When in autoplay mode (pps/ppsx), offer editing of the presentation
+ // Turn autostart off, else Impress will close when exiting the Presentation
+ mpViewShell->GetDoc()->SetExitAfterPresenting(false);
+ if( mpSlideController && (ANIMATIONMODE_SHOW == meAnimationMode) )
+ {
+ if( mpSlideController->getCurrentSlideNumber() != -1 )
+ {
+ mnRestoreSlide = mpSlideController->getCurrentSlideNumber();
+ }
+ }
+ endPresentation();
+ }
+ else if (rMenuId == "end")
+ {
+ // in case the user cancels the presentation, switch to current slide
+ // in edit mode
+ if( mpSlideController && (ANIMATIONMODE_SHOW == meAnimationMode) )
+ {
+ if( mpSlideController->getCurrentSlideNumber() != -1 )
+ {
+ mnRestoreSlide = mpSlideController->getCurrentSlideNumber();
+ }
+ }
+ endPresentation();
+ }
+ else if (!rMenuId.empty())
+ {
+ sal_Int32 nPageNumber = o3tl::toInt32(rMenuId) - CM_SLIDES;
+ const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
+ if( (eMode == SHOWWINDOWMODE_END) || (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
+ {
+ mpShowWindow->RestartShow( nPageNumber );
+ }
+ else if( nPageNumber != mpSlideController->getCurrentSlideNumber() )
+ {
+ displaySlideNumber( nPageNumber );
+ }
+ mbWasPaused = false;
+ }
+}
+
+Reference< XSlideShow > SlideshowImpl::createSlideShow()
+{
+ Reference< XSlideShow > xShow;
+
+ try
+ {
+ Reference< uno::XComponentContext > xContext =
+ ::comphelper::getProcessComponentContext();
+
+ xShow.set( presentation::SlideShow::create(xContext), UNO_SET_THROW );
+ }
+ catch( uno::Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::createSlideShow()" );
+ }
+
+ return xShow;
+}
+
+void SlideshowImpl::createSlideList( bool bAll, std::u16string_view rPresSlide )
+{
+ const sal_uInt16 nSlideCount = mpDoc->GetSdPageCount( PageKind::Standard );
+
+ if( !nSlideCount )
+ return;
+
+ SdCustomShow* pCustomShow;
+
+ if( mpDoc->GetCustomShowList() && maPresSettings.mbCustomShow )
+ pCustomShow = mpDoc->GetCustomShowList()->GetCurObject();
+ else
+ pCustomShow = nullptr;
+
+ // create animation slide controller
+ AnimationSlideController::Mode eMode =
+ ( pCustomShow && !pCustomShow->PagesVector().empty() ) ? AnimationSlideController::CUSTOM :
+ (bAll ? AnimationSlideController::ALL : AnimationSlideController::FROM);
+
+ Reference< XDrawPagesSupplier > xDrawPages( mpDoc->getUnoModel(), UNO_QUERY_THROW );
+ Reference< XIndexAccess > xSlides( xDrawPages->getDrawPages(), UNO_QUERY_THROW );
+ mpSlideController = std::make_shared<AnimationSlideController>( xSlides, eMode );
+
+ if( eMode != AnimationSlideController::CUSTOM )
+ {
+ sal_Int32 nFirstVisibleSlide = 0;
+
+ // normal presentation
+ if( !rPresSlide.empty() )
+ {
+ sal_Int32 nSlide;
+ bool bTakeNextAvailable = false;
+
+ for( nSlide = 0, nFirstVisibleSlide = -1;
+ ( nSlide < nSlideCount ) && ( -1 == nFirstVisibleSlide ); nSlide++ )
+ {
+ SdPage* pTestSlide = mpDoc->GetSdPage( static_cast<sal_uInt16>(nSlide), PageKind::Standard );
+
+ if( pTestSlide->GetName() == rPresSlide )
+ {
+ if( pTestSlide->IsExcluded() )
+ bTakeNextAvailable = true;
+ else
+ nFirstVisibleSlide = nSlide;
+ }
+ else if( bTakeNextAvailable && !pTestSlide->IsExcluded() )
+ nFirstVisibleSlide = nSlide;
+ }
+
+ if( -1 == nFirstVisibleSlide )
+ nFirstVisibleSlide = 0;
+ }
+
+ for( sal_Int32 i = 0; i < nSlideCount; i++ )
+ {
+ bool bVisible = ! mpDoc->GetSdPage( static_cast<sal_uInt16>(i), PageKind::Standard )->IsExcluded();
+ if( bVisible || (eMode == AnimationSlideController::ALL) )
+ mpSlideController->insertSlideNumber( i, bVisible );
+ }
+
+ mpSlideController->setStartSlideNumber( nFirstVisibleSlide );
+ }
+ else
+ {
+ if( meAnimationMode != ANIMATIONMODE_SHOW && !rPresSlide.empty() )
+ {
+ sal_Int32 nSlide;
+ for( nSlide = 0; nSlide < nSlideCount; nSlide++ )
+ if( rPresSlide == mpDoc->GetSdPage( static_cast<sal_uInt16>(nSlide), PageKind::Standard )->GetName() )
+ break;
+
+ if( nSlide < nSlideCount )
+ mpSlideController->insertSlideNumber( static_cast<sal_uInt16>(nSlide) );
+ }
+
+ for( const auto& rpPage : pCustomShow->PagesVector() )
+ {
+ const sal_uInt16 nSdSlide = ( rpPage->GetPageNum() - 1 ) / 2;
+
+ if( ! mpDoc->GetSdPage( nSdSlide, PageKind::Standard )->IsExcluded())
+ mpSlideController->insertSlideNumber( nSdSlide );
+ }
+ }
+}
+
+typedef sal_uInt16 (*FncGetChildWindowId)();
+
+const FncGetChildWindowId aShowChildren[] =
+{
+ &AnimationChildWindow::GetChildWindowId,
+ &Svx3DChildWindow::GetChildWindowId,
+ &SvxFontWorkChildWindow::GetChildWindowId,
+ &SvxColorChildWindow::GetChildWindowId,
+ &SvxSearchDialogWrapper::GetChildWindowId,
+ &SvxBmpMaskChildWindow::GetChildWindowId,
+ &SvxIMapDlgChildWindow::GetChildWindowId,
+ &SvxHlinkDlgWrapper::GetChildWindowId,
+ &SfxInfoBarContainerChild::GetChildWindowId
+};
+
+void SlideshowImpl::hideChildWindows()
+{
+ mnChildMask = 0;
+
+ if( ANIMATIONMODE_SHOW != meAnimationMode )
+ return;
+
+ SfxViewFrame* pViewFrame = getViewFrame();
+
+ if( !pViewFrame )
+ return;
+
+ for( sal_uLong i = 0; i < SAL_N_ELEMENTS( aShowChildren ); i++ )
+ {
+ const sal_uInt16 nId = ( *aShowChildren[ i ] )();
+
+ if( pViewFrame->GetChildWindow( nId ) )
+ {
+ pViewFrame->SetChildWindow( nId, false );
+ mnChildMask |= ::tools::ULong(1) << i;
+ }
+ }
+}
+
+void SlideshowImpl::showChildWindows()
+{
+ if( ANIMATIONMODE_SHOW == meAnimationMode )
+ {
+ SfxViewFrame* pViewFrame = getViewFrame();
+ if( pViewFrame )
+ {
+ for( sal_uLong i = 0; i < SAL_N_ELEMENTS(aShowChildren); i++ )
+ {
+ if( mnChildMask & ( ::tools::ULong(1) << i ) )
+ pViewFrame->SetChildWindow( ( *aShowChildren[ i ] )(), true );
+ }
+ }
+ }
+}
+
+SfxViewFrame* SlideshowImpl::getViewFrame() const
+{
+ return mpViewShell ? mpViewShell->GetViewFrame() : nullptr;
+}
+
+SfxDispatcher* SlideshowImpl::getDispatcher() const
+{
+ return (mpViewShell && mpViewShell->GetViewFrame()) ? mpViewShell->GetViewFrame()->GetDispatcher() : nullptr;
+}
+
+SfxBindings* SlideshowImpl::getBindings() const
+{
+ return (mpViewShell && mpViewShell->GetViewFrame()) ? &mpViewShell->GetViewFrame()->GetBindings() : nullptr;
+}
+
+void SlideshowImpl::resize( const Size& rSize )
+{
+ maPresSize = rSize;
+
+ if(mpShowWindow)
+ {
+ mpShowWindow->SetSizePixel( maPresSize );
+ mpShowWindow->Show();
+ }
+
+ if( mxView.is() ) try
+ {
+ awt::WindowEvent aEvt;
+ mxView->windowResized(aEvt);
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::resize()" );
+ }
+}
+
+void SlideshowImpl::setActiveXToolbarsVisible( bool bVisible )
+{
+ // in case of ActiveX control the toolbars should not be visible if slide show runs in window mode
+ // actually it runs always in window mode in case of ActiveX control
+ if ( !(!maPresSettings.mbFullScreen && mpDocSh && mpDocSh->GetMedium()) )
+ return;
+
+ const SfxBoolItem* pItem = SfxItemSet::GetItem<SfxBoolItem>(mpDocSh->GetMedium()->GetItemSet(), SID_VIEWONLY, false);
+ if ( !(pItem && pItem->GetValue()) )
+ return;
+
+ // this is a plugin/activex mode, no toolbars should be visible during slide show
+ // after the end of slide show they should be visible again
+ SfxViewFrame* pViewFrame = getViewFrame();
+ if( !pViewFrame )
+ return;
+
+ try
+ {
+ Reference< frame::XLayoutManager > xLayoutManager;
+ Reference< beans::XPropertySet > xFrameProps( pViewFrame->GetFrame().GetFrameInterface(), UNO_QUERY_THROW );
+ if ( ( xFrameProps->getPropertyValue( "LayoutManager" )
+ >>= xLayoutManager )
+ && xLayoutManager.is() )
+ {
+ xLayoutManager->setVisible( bVisible );
+ }
+ }
+ catch( uno::Exception& )
+ {}
+}
+
+void SAL_CALL SlideshowImpl::activate()
+{
+ SolarMutexGuard aSolarGuard;
+
+ maDeactivateTimer.Stop();
+
+ if( mbActive || !mxShow.is() )
+ return;
+
+ mbActive = true;
+
+ if( ANIMATIONMODE_SHOW == meAnimationMode )
+ {
+ if( mbAutoSaveWasOn )
+ setAutoSaveState( false );
+
+ if( mpShowWindow )
+ {
+ SfxViewFrame* pViewFrame = getViewFrame();
+ SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : nullptr;
+
+ hideChildWindows();
+
+ if( pDispatcher )
+ {
+ // filter all forbidden slots
+ pDispatcher->SetSlotFilter( SfxSlotFilterState::ENABLED, pAllowed );
+ }
+
+ if( getBindings() )
+ getBindings()->InvalidateAll(true);
+
+ mpShowWindow->GrabFocus();
+ }
+ }
+
+ resume();
+}
+
+void SAL_CALL SlideshowImpl::deactivate()
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( mbActive && mxShow.is() )
+ {
+ maDeactivateTimer.Start();
+ }
+}
+
+IMPL_LINK_NOARG(SlideshowImpl, deactivateHdl, Timer *, void)
+{
+ if( !(mbActive && mxShow.is()) )
+ return;
+
+ mbActive = false;
+
+ pause();
+
+ if( ANIMATIONMODE_SHOW == meAnimationMode )
+ {
+ if( mbAutoSaveWasOn )
+ setAutoSaveState( true );
+
+ if( mpShowWindow )
+ {
+ showChildWindows();
+ }
+ }
+}
+
+sal_Bool SAL_CALL SlideshowImpl::isActive()
+{
+ SolarMutexGuard aSolarGuard;
+ return mbActive;
+}
+
+void SlideshowImpl::setAutoSaveState( bool bOn)
+{
+ try
+ {
+ uno::Reference<uno::XComponentContext> xContext( ::comphelper::getProcessComponentContext() );
+
+ uno::Reference< util::XURLTransformer > xParser(util::URLTransformer::create(xContext));
+ util::URL aURL;
+ aURL.Complete = "vnd.sun.star.autorecovery:/setAutoSaveState";
+ xParser->parseStrict(aURL);
+
+ Sequence< beans::PropertyValue > aArgs{ comphelper::makePropertyValue("AutoSaveState", bOn) };
+
+ uno::Reference< frame::XDispatch > xAutoSave = frame::theAutoRecovery::get(xContext);
+ xAutoSave->dispatch(aURL, aArgs);
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::setAutoSaveState()");
+ }
+}
+
+Reference< XDrawPage > SAL_CALL SlideshowImpl::getCurrentSlide()
+{
+ SolarMutexGuard aSolarGuard;
+
+ Reference< XDrawPage > xSlide;
+ if( mxShow.is() && mpSlideController )
+ {
+ sal_Int32 nSlide = getCurrentSlideNumber();
+ if( (nSlide >= 0) && (nSlide < mpSlideController->getSlideNumberCount() ) )
+ xSlide = mpSlideController->getSlideByNumber( nSlide );
+ }
+
+ return xSlide;
+}
+
+sal_Int32 SAL_CALL SlideshowImpl::getNextSlideIndex()
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( mxShow.is() )
+ {
+ return mpSlideController->getNextSlideIndex();
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+sal_Int32 SAL_CALL SlideshowImpl::getCurrentSlideIndex()
+{
+ return mpSlideController ? mpSlideController->getCurrentSlideIndex() : -1;
+}
+
+// css::presentation::XSlideShowController:
+
+::sal_Int32 SAL_CALL SlideshowImpl::getSlideCount()
+{
+ return mpSlideController ? mpSlideController->getSlideIndexCount() : 0;
+}
+
+Reference< XDrawPage > SAL_CALL SlideshowImpl::getSlideByIndex(::sal_Int32 Index)
+{
+ if ((mpSlideController == nullptr) || (Index < 0)
+ || (Index >= mpSlideController->getSlideIndexCount()))
+ throw IndexOutOfBoundsException();
+
+ return mpSlideController->getSlideByNumber( mpSlideController->getSlideNumber( Index ) );
+}
+
+sal_Bool SAL_CALL SlideshowImpl::getAlwaysOnTop()
+{
+ SolarMutexGuard aSolarGuard;
+ return maPresSettings.mbAlwaysOnTop;
+}
+
+void SAL_CALL SlideshowImpl::setAlwaysOnTop( sal_Bool bAlways )
+{
+ SolarMutexGuard aSolarGuard;
+ if( maPresSettings.mbAlwaysOnTop != bool(bAlways) )
+ {
+ maPresSettings.mbAlwaysOnTop = bAlways;
+ // todo, can this be changed while running?
+ }
+}
+
+sal_Bool SAL_CALL SlideshowImpl::isFullScreen()
+{
+ SolarMutexGuard aSolarGuard;
+ return maPresSettings.mbFullScreen;
+}
+
+sal_Bool SAL_CALL SlideshowImpl::getMouseVisible()
+{
+ SolarMutexGuard aSolarGuard;
+ return maPresSettings.mbMouseVisible;
+}
+
+void SAL_CALL SlideshowImpl::setMouseVisible( sal_Bool bVisible )
+{
+ SolarMutexGuard aSolarGuard;
+ if( maPresSettings.mbMouseVisible != bool(bVisible) )
+ {
+ maPresSettings.mbMouseVisible = bVisible;
+ if( mpShowWindow )
+ mpShowWindow->SetMouseAutoHide( !maPresSettings.mbMouseVisible );
+ }
+}
+
+sal_Bool SAL_CALL SlideshowImpl::getUsePen()
+{
+ SolarMutexGuard aSolarGuard;
+ return mbUsePen;
+}
+
+void SAL_CALL SlideshowImpl::setUsePen( sal_Bool bMouseAsPen )
+{
+ SolarMutexGuard aSolarGuard;
+ mbUsePen = bMouseAsPen;
+ if( !mxShow.is() )
+ return;
+
+ try
+ {
+ // For Pencolor;
+ Any aValue;
+ if( mbUsePen )
+ aValue <<= mnUserPaintColor;
+ beans::PropertyValue aPenProp;
+ aPenProp.Name = "UserPaintColor";
+ aPenProp.Value = aValue;
+ mxShow->setProperty( aPenProp );
+
+ //for StrokeWidth :
+ if( mbUsePen )
+ {
+ beans::PropertyValue aPenPropWidth;
+ aPenPropWidth.Name = "UserPaintStrokeWidth";
+ aPenPropWidth.Value <<= mdUserPaintStrokeWidth;
+ mxShow->setProperty( aPenPropWidth );
+
+ // for Pen Mode
+ beans::PropertyValue aPenPropSwitchPenMode;
+ aPenPropSwitchPenMode.Name = "SwitchPenMode";
+ aPenPropSwitchPenMode.Value <<= true;
+ mxShow->setProperty( aPenPropSwitchPenMode );
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::setUsePen()" );
+ }
+}
+
+double SAL_CALL SlideshowImpl::getPenWidth()
+{
+ SolarMutexGuard aSolarGuard;
+ return mdUserPaintStrokeWidth;
+}
+
+void SAL_CALL SlideshowImpl::setPenWidth( double dStrokeWidth )
+{
+ SolarMutexGuard aSolarGuard;
+ mdUserPaintStrokeWidth = dStrokeWidth;
+ setUsePen( true ); // enable pen mode, update color and width
+}
+
+sal_Int32 SAL_CALL SlideshowImpl::getPenColor()
+{
+ SolarMutexGuard aSolarGuard;
+ return mnUserPaintColor;
+}
+
+void SAL_CALL SlideshowImpl::setPenColor( sal_Int32 nColor )
+{
+ SolarMutexGuard aSolarGuard;
+ mnUserPaintColor = nColor;
+ setUsePen( true ); // enable pen mode, update color
+}
+
+void SAL_CALL SlideshowImpl::setEraseAllInk(sal_Bool bEraseAllInk)
+{
+ if( !bEraseAllInk )
+ return;
+
+ SolarMutexGuard aSolarGuard;
+ if( !mxShow.is() )
+ return;
+
+ try
+ {
+ beans::PropertyValue aPenPropEraseAllInk;
+ aPenPropEraseAllInk.Name = "EraseAllInk";
+ aPenPropEraseAllInk.Value <<= bEraseAllInk;
+ mxShow->setProperty( aPenPropEraseAllInk );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd.slideshow", "sd::SlideshowImpl::setEraseAllInk()" );
+ }
+}
+
+// XSlideShowController Methods
+sal_Bool SAL_CALL SlideshowImpl::isRunning( )
+{
+ SolarMutexGuard aSolarGuard;
+ return mxShow.is();
+}
+
+void SAL_CALL SlideshowImpl::gotoNextEffect( )
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( !(mxShow.is() && mpSlideController && mpShowWindow) )
+ return;
+
+ if( mbIsPaused )
+ resume();
+
+ const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
+ if( eMode == SHOWWINDOWMODE_END )
+ {
+ endPresentation();
+ }
+ else if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
+ {
+ mpShowWindow->RestartShow();
+ }
+ else
+ {
+ mxShow->nextEffect();
+ update();
+ }
+}
+
+void SAL_CALL SlideshowImpl::gotoPreviousEffect( )
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( !(mxShow.is() && mpSlideController && mpShowWindow) )
+ return;
+
+ if( mbIsPaused )
+ resume();
+
+ const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
+ if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
+ {
+ mpShowWindow->RestartShow();
+ }
+ else
+ {
+ mxShow->previousEffect();
+ update();
+ }
+}
+
+void SAL_CALL SlideshowImpl::gotoFirstSlide( )
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( !(mpShowWindow && mpSlideController) )
+ return;
+
+ if( mbIsPaused )
+ resume();
+
+ if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_END )
+ {
+ if( mpSlideController->getSlideIndexCount() )
+ mpShowWindow->RestartShow( 0);
+ }
+ else
+ {
+ displaySlideIndex( 0 );
+ }
+}
+
+void SAL_CALL SlideshowImpl::gotoNextSlide( )
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( mbIsPaused )
+ resume();
+
+ const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
+ if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
+ {
+ mpShowWindow->RestartShow();
+ }
+ else
+ {
+ // if this is a show, ignore user inputs and
+ // start 20ms timer to reenable inputs to filter
+ // buffered inputs during slide transition
+ if( meAnimationMode == ANIMATIONMODE_SHOW )
+ {
+ mbInputFreeze = true;
+ maInputFreezeTimer.Start();
+ }
+
+ if( mpSlideController )
+ {
+ if( mpSlideController->nextSlide() )
+ {
+ displayCurrentSlide();
+ }
+ else
+ {
+ stopSound();
+
+ if( meAnimationMode == ANIMATIONMODE_PREVIEW )
+ {
+ endPresentation();
+ }
+ else if( maPresSettings.mbEndless )
+ {
+ if( maPresSettings.mnPauseTimeout )
+ {
+ if( mpShowWindow )
+ {
+ if ( maPresSettings.mbShowPauseLogo )
+ {
+ Graphic aGraphic(SfxApplication::GetApplicationLogo(360));
+ mpShowWindow->SetPauseMode( maPresSettings.mnPauseTimeout, &aGraphic );
+ }
+ else
+ mpShowWindow->SetPauseMode( maPresSettings.mnPauseTimeout );
+ }
+ }
+ else
+ {
+ displaySlideIndex( 0 );
+ }
+ }
+ else
+ {
+ if( mpShowWindow )
+ {
+ mpShowWindow->SetEndMode();
+ if( !mpViewShell->GetDoc()->IsStartWithPresentation() )
+ pause();
+ }
+ }
+ }
+ }
+ }
+}
+
+void SAL_CALL SlideshowImpl::gotoPreviousSlide( )
+{
+ gotoPreviousSlide(false);
+}
+
+void SlideshowImpl::gotoPreviousSlide (const bool bSkipAllMainSequenceEffects)
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( !(mxShow.is() && mpSlideController) )
+ return;
+
+ try
+ {
+ if( mbIsPaused )
+ resume();
+
+ const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode();
+ if( eMode == SHOWWINDOWMODE_END )
+ {
+ mpShowWindow->RestartShow( mpSlideController->getCurrentSlideIndex() );
+ }
+ else if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) )
+ {
+ mpShowWindow->RestartShow();
+ }
+ else
+ {
+ if( mpSlideController->previousSlide())
+ displayCurrentSlide(bSkipAllMainSequenceEffects);
+ else if (bSkipAllMainSequenceEffects)
+ {
+ // We could not go to the previous slide (probably because
+ // the current slide is already the first one). We still
+ // have to call displayCurrentSlide because the calling
+ // slideshow can not determine whether there is a previous
+ // slide or not and has already prepared for a slide change.
+ // This slide change has to be completed now, even when
+ // changing to the same slide.
+ // Note that in this special case we do NOT pass
+ // bSkipAllMainSequenceEffects because we display the same
+ // slide as before and do not want to show all its effects.
+ displayCurrentSlide();
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::gotoPreviousSlide()" );
+ }
+}
+
+void SAL_CALL SlideshowImpl::gotoLastSlide()
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( !mpSlideController )
+ return;
+
+ if( mbIsPaused )
+ resume();
+
+ const sal_Int32 nLastSlideIndex = mpSlideController->getSlideIndexCount() - 1;
+ if( nLastSlideIndex >= 0 )
+ {
+ if( mpShowWindow->GetShowWindowMode() == SHOWWINDOWMODE_END )
+ {
+ mpShowWindow->RestartShow( nLastSlideIndex );
+ }
+ else
+ {
+ displaySlideIndex( nLastSlideIndex );
+ }
+ }
+}
+
+void SAL_CALL SlideshowImpl::gotoBookmark( const OUString& rBookmark )
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( mbIsPaused )
+ resume();
+
+ sal_Int32 nSlideNumber = getSlideNumberForBookmark( rBookmark );
+ if( nSlideNumber != -1 )
+ displaySlideNumber( nSlideNumber );
+}
+
+void SAL_CALL SlideshowImpl::gotoSlide( const Reference< XDrawPage >& xSlide )
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( !(mpSlideController && xSlide.is()) )
+ return;
+
+ if( mbIsPaused )
+ resume();
+
+ const sal_Int32 nSlideCount = mpSlideController->getSlideNumberCount();
+ for( sal_Int32 nSlide = 0; nSlide < nSlideCount; nSlide++ )
+ {
+ if( mpSlideController->getSlideByNumber( nSlide ) == xSlide )
+ {
+ displaySlideNumber( nSlide );
+ }
+ }
+}
+
+void SAL_CALL SlideshowImpl::gotoSlideIndex( sal_Int32 nIndex )
+{
+ SolarMutexGuard aSolarGuard;
+
+ if( mbIsPaused )
+ resume();
+
+ displaySlideIndex( nIndex );
+}
+
+void SAL_CALL SlideshowImpl::stopSound( )
+{
+ SolarMutexGuard aSolarGuard;
+
+ try
+ {
+ if( mxPlayer.is() )
+ {
+ mxPlayer->stop();
+ mxPlayer.clear();
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideshowImpl::stopSound()" );
+ }
+}
+
+// XIndexAccess
+
+::sal_Int32 SAL_CALL SlideshowImpl::getCount( )
+{
+ return getSlideCount();
+}
+
+css::uno::Any SAL_CALL SlideshowImpl::getByIndex( ::sal_Int32 Index )
+{
+ return Any( getSlideByIndex( Index ) );
+}
+
+css::uno::Type SAL_CALL SlideshowImpl::getElementType( )
+{
+ return cppu::UnoType<XDrawPage>::get();
+}
+
+sal_Bool SAL_CALL SlideshowImpl::hasElements( )
+{
+ return getSlideCount() != 0;
+}
+
+Reference< XSlideShow > SAL_CALL SlideshowImpl::getSlideShow()
+{
+ return mxShow;
+}
+
+PresentationSettingsEx::PresentationSettingsEx( const PresentationSettingsEx& r )
+: PresentationSettings( r )
+, mbRehearseTimings(r.mbRehearseTimings)
+, mbPreview(r.mbPreview)
+, mpParentWindow( nullptr )
+{
+}
+
+PresentationSettingsEx::PresentationSettingsEx( PresentationSettings const & r )
+: PresentationSettings( r )
+, mbRehearseTimings(false)
+, mbPreview(false)
+, mpParentWindow(nullptr)
+{
+}
+
+void PresentationSettingsEx::SetArguments( const Sequence< PropertyValue >& rArguments )
+{
+ for( const PropertyValue& rValue : rArguments )
+ {
+ SetPropertyValue( rValue.Name, rValue.Value );
+ }
+}
+
+void PresentationSettingsEx::SetPropertyValue( std::u16string_view rProperty, const Any& rValue )
+{
+ if ( rProperty == u"RehearseTimings" )
+ {
+ if( rValue >>= mbRehearseTimings )
+ return;
+ }
+ else if ( rProperty == u"Preview" )
+ {
+ if( rValue >>= mbPreview )
+ return;
+ }
+ else if ( rProperty == u"AnimationNode" )
+ {
+ if( rValue >>= mxAnimationNode )
+ return;
+ }
+ else if ( rProperty == u"ParentWindow" )
+ {
+ Reference< XWindow > xWindow;
+ if( rValue >>= xWindow )
+ {
+ mpParentWindow = xWindow.is() ? VCLUnoHelper::GetWindow( xWindow )
+ : nullptr;
+ return;
+ }
+ }
+ else if ( rProperty == u"AllowAnimations" )
+ {
+ if( rValue >>= mbAnimationAllowed )
+ return;
+ }
+ else if ( rProperty == u"FirstPage" )
+ {
+ OUString aPresPage;
+ if( rValue >>= aPresPage )
+ {
+ maPresPage = getUiNameFromPageApiNameImpl(aPresPage);
+ mbCustomShow = false;
+ mbAll = false;
+ return;
+ }
+ else
+ {
+ if( rValue >>= mxStartPage )
+ return;
+ }
+ }
+ else if ( rProperty == u"IsAlwaysOnTop" )
+ {
+ if( rValue >>= mbAlwaysOnTop )
+ return;
+ }
+ else if ( rProperty == u"IsAutomatic" )
+ {
+ if( rValue >>= mbManual )
+ return;
+ }
+ else if ( rProperty == u"IsEndless" )
+ {
+ if( rValue >>= mbEndless )
+ return;
+ }
+ else if ( rProperty == u"IsFullScreen" )
+ {
+ if( rValue >>= mbFullScreen )
+ return;
+ }
+ else if ( rProperty == u"IsMouseVisible" )
+ {
+ if( rValue >>= mbMouseVisible )
+ return;
+ }
+ else if ( rProperty == u"Pause" )
+ {
+ sal_Int32 nPause = -1;
+ if( (rValue >>= nPause) && (nPause >= 0) )
+ {
+ mnPauseTimeout = nPause;
+ return;
+ }
+ }
+ else if ( rProperty == u"UsePen" )
+ {
+ if( rValue >>= mbMouseAsPen )
+ return;
+ }
+ throw IllegalArgumentException();
+}
+
+// XAnimationListener
+
+SlideShowListenerProxy::SlideShowListenerProxy( const rtl::Reference< SlideshowImpl >& xController, const css::uno::Reference< css::presentation::XSlideShow >& xSlideShow )
+: maListeners( m_aMutex )
+, mxController( xController )
+, mxSlideShow( xSlideShow )
+{
+}
+
+SlideShowListenerProxy::~SlideShowListenerProxy()
+{
+}
+
+void SlideShowListenerProxy::addAsSlideShowListener()
+{
+ if( mxSlideShow.is() )
+ {
+ Reference< XSlideShowListener > xSlideShowListener( this );
+ mxSlideShow->addSlideShowListener( xSlideShowListener );
+ }
+}
+
+void SlideShowListenerProxy::removeAsSlideShowListener()
+{
+ if( mxSlideShow.is() )
+ {
+ Reference< XSlideShowListener > xSlideShowListener( this );
+ mxSlideShow->removeSlideShowListener( xSlideShowListener );
+ }
+}
+
+void SlideShowListenerProxy::addShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape )
+{
+ if( mxSlideShow.is() )
+ {
+ Reference< XShapeEventListener > xListener( this );
+ mxSlideShow->addShapeEventListener( xListener, xShape );
+ }
+}
+
+void SlideShowListenerProxy::removeShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape )
+{
+ if( mxSlideShow.is() )
+ {
+ Reference< XShapeEventListener > xListener( this );
+ mxSlideShow->removeShapeEventListener( xListener, xShape );
+ }
+}
+
+void SlideShowListenerProxy::addSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& xListener )
+{
+ maListeners.addInterface(xListener);
+}
+
+void SlideShowListenerProxy::removeSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& xListener )
+{
+ maListeners.removeInterface(xListener);
+}
+
+void SAL_CALL SlideShowListenerProxy::beginEvent( const Reference< XAnimationNode >& xNode )
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ if( maListeners.getLength() >= 0 )
+ {
+ maListeners.forEach(
+ [&] (Reference<XAnimationListener> const& xListener) {
+ return xListener->beginEvent(xNode);
+ } );
+ }
+}
+
+void SAL_CALL SlideShowListenerProxy::endEvent( const Reference< XAnimationNode >& xNode )
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ if( maListeners.getLength() >= 0 )
+ {
+ maListeners.forEach(
+ [&] (Reference<XAnimationListener> const& xListener) {
+ return xListener->endEvent(xNode);
+ } );
+ }
+}
+
+void SAL_CALL SlideShowListenerProxy::repeat( const Reference< XAnimationNode >& xNode, ::sal_Int32 nRepeat )
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ if( maListeners.getLength() >= 0 )
+ {
+ maListeners.forEach(
+ [&] (Reference<XAnimationListener> const& xListener) {
+ return xListener->repeat(xNode, nRepeat);
+ } );
+ }
+}
+
+// css::presentation::XSlideShowListener:
+
+void SAL_CALL SlideShowListenerProxy::paused( )
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ maListeners.forEach(
+ [](uno::Reference<presentation::XSlideShowListener> const& xListener)
+ {
+ xListener->paused();
+ });
+}
+
+void SAL_CALL SlideShowListenerProxy::resumed( )
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ maListeners.forEach(
+ [](uno::Reference<presentation::XSlideShowListener> const& xListener)
+ {
+ xListener->resumed();
+ });
+}
+
+void SAL_CALL SlideShowListenerProxy::slideTransitionStarted( )
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ maListeners.forEach(
+ [](uno::Reference<presentation::XSlideShowListener> const& xListener)
+ {
+ xListener->slideTransitionStarted();
+ });
+}
+
+void SAL_CALL SlideShowListenerProxy::slideTransitionEnded( )
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ maListeners.forEach(
+ [](uno::Reference<presentation::XSlideShowListener> const& xListener)
+ {
+ xListener->slideTransitionEnded ();
+ });
+}
+
+void SAL_CALL SlideShowListenerProxy::slideAnimationsEnded( )
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ maListeners.forEach(
+ [](uno::Reference<presentation::XSlideShowListener> const& xListener)
+ {
+ xListener->slideAnimationsEnded ();
+ });
+}
+
+void SlideShowListenerProxy::slideEnded(sal_Bool bReverse)
+{
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ if( maListeners.getLength() >= 0 )
+ {
+ maListeners.forEach(
+ [&] (Reference<XSlideShowListener> const& xListener) {
+ return xListener->slideEnded(bReverse);
+ } );
+ }
+ }
+
+ {
+ SolarMutexGuard aSolarGuard;
+ if( mxController.is() )
+ mxController->slideEnded(bReverse);
+ }
+}
+
+void SlideShowListenerProxy::hyperLinkClicked( OUString const& aHyperLink )
+{
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ if( maListeners.getLength() >= 0 )
+ {
+ maListeners.forEach(
+ [&] (Reference<XSlideShowListener> const& xListener) {
+ return xListener->hyperLinkClicked(aHyperLink);
+ } );
+ }
+ }
+
+ {
+ SolarMutexGuard aSolarGuard;
+ if( mxController.is() )
+ mxController->hyperLinkClicked(aHyperLink);
+ }
+}
+
+// XEventListener
+
+void SAL_CALL SlideShowListenerProxy::disposing( const css::lang::EventObject& aDisposeEvent )
+{
+ maListeners.disposeAndClear( aDisposeEvent );
+ mxController.clear();
+ mxSlideShow.clear();
+}
+
+// XShapeEventListener
+
+void SAL_CALL SlideShowListenerProxy::click( const Reference< XShape >& xShape, const css::awt::MouseEvent& /*aOriginalEvent*/ )
+{
+ SolarMutexGuard aSolarGuard;
+ if( mxController.is() )
+ mxController->click(xShape );
+}
+
+} // namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slideshow/slideshowimpl.hxx b/sd/source/ui/slideshow/slideshowimpl.hxx
new file mode 100644
index 000000000..eeec8a3fd
--- /dev/null
+++ b/sd/source/ui/slideshow/slideshowimpl.hxx
@@ -0,0 +1,342 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <sal/config.h>
+#include <comphelper/compbase.hxx>
+#include <cppuhelper/implbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+#include <comphelper/interfacecontainer3.hxx>
+#include <com/sun/star/presentation/ClickAction.hpp>
+#include <com/sun/star/presentation/XSlideShowListener.hpp>
+#include <com/sun/star/presentation/XSlideShowController.hpp>
+#include <com/sun/star/presentation/XShapeEventListener.hpp>
+
+#include <drawdoc.hxx>
+
+#include "showwindow.hxx"
+
+#include <slideshow.hxx>
+
+namespace com::sun::star::frame { class XModel; }
+namespace com::sun::star::media { class XPlayer; }
+namespace sd { class DrawDocShell; }
+namespace sd { class ViewShell; }
+
+class SfxBindings;
+class SfxDispatcher;
+class SfxViewFrame;
+class StarBASIC;
+
+namespace sd
+{
+class SlideShowView;
+class AnimationSlideController;
+class PaneHider;
+
+struct PresentationSettingsEx : public PresentationSettings
+{
+ bool mbRehearseTimings;
+ bool mbPreview;
+ VclPtr<vcl::Window> mpParentWindow;
+ css::uno::Reference< css::drawing::XDrawPage > mxStartPage;
+ css::uno::Reference< css::animations::XAnimationNode > mxAnimationNode;
+
+ PresentationSettingsEx( const PresentationSettingsEx& );
+ explicit PresentationSettingsEx( PresentationSettings const & );
+
+ /// @throws css::lang::IllegalArgumentException
+ void SetArguments( const css::uno::Sequence< css::beans::PropertyValue >& rArguments );
+
+ /// @throws css::lang::IllegalArgumentException
+ void SetPropertyValue( std::u16string_view rProperty, const css::uno::Any& rValue );
+};
+
+struct WrappedShapeEventImpl
+{
+ css::presentation::ClickAction meClickAction;
+ sal_Int32 mnVerb;
+ OUString maStrBookmark;
+ WrappedShapeEventImpl() : meClickAction( css::presentation::ClickAction_NONE ), mnVerb( 0 ) {};
+};
+
+typedef std::shared_ptr< WrappedShapeEventImpl > WrappedShapeEventImplPtr;
+
+class SlideShowListenerProxy : private ::cppu::BaseMutex,
+ public ::cppu::WeakImplHelper< css::presentation::XSlideShowListener, css::presentation::XShapeEventListener >
+{
+public:
+ SlideShowListenerProxy( const rtl::Reference< SlideshowImpl >& xController, const css::uno::Reference< css::presentation::XSlideShow >& xSlideShow );
+ virtual ~SlideShowListenerProxy() override;
+
+ void addAsSlideShowListener();
+ void removeAsSlideShowListener();
+
+ void addSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener );
+ void removeSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener );
+
+ void addShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape );
+ void removeShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape );
+
+ // css::animations::XAnimationListener
+ virtual void SAL_CALL beginEvent( const css::uno::Reference< css::animations::XAnimationNode >& Node ) override;
+ virtual void SAL_CALL endEvent( const css::uno::Reference< css::animations::XAnimationNode >& Node ) override;
+ virtual void SAL_CALL repeat( const css::uno::Reference< css::animations::XAnimationNode >& Node, ::sal_Int32 Repeat ) override;
+
+ // css::presentation::XSlideShowListener:
+ virtual void SAL_CALL paused() override;
+ virtual void SAL_CALL resumed() override;
+ virtual void SAL_CALL slideTransitionStarted() override;
+ virtual void SAL_CALL slideTransitionEnded() override;
+ virtual void SAL_CALL slideAnimationsEnded() override;
+ virtual void SAL_CALL slideEnded(sal_Bool bReverse) override;
+ virtual void SAL_CALL hyperLinkClicked(const OUString & hyperLink) override;
+
+ // css::lang::XEventListener:
+ virtual void SAL_CALL disposing(const css::lang::EventObject & Source) override;
+
+ // css::presentation::XShapeEventListener:
+ virtual void SAL_CALL click(const css::uno::Reference< css::drawing::XShape > & xShape, const css::awt::MouseEvent & aOriginalEvent) override;
+
+private:
+ ::comphelper::OInterfaceContainerHelper3<css::presentation::XSlideShowListener> maListeners;
+ rtl::Reference< SlideshowImpl > mxController;
+ css::uno::Reference< css::presentation::XSlideShow > mxSlideShow;
+};
+
+typedef comphelper::WeakComponentImplHelper< css::presentation::XSlideShowController, css::container::XIndexAccess > SlideshowImplBase;
+
+class SlideshowImpl final : public SlideshowImplBase
+{
+friend class SlideShow;
+friend class SlideShowView;
+
+public:
+ explicit SlideshowImpl( const css::uno::Reference< css::presentation::XPresentation2 >& xPresentation, ViewShell* pViewSh, ::sd::View* pView, SdDrawDocument* pDoc, vcl::Window* pParentWindow);
+
+ // css::presentation::XSlideShowController:
+ virtual sal_Bool SAL_CALL getAlwaysOnTop() override;
+ virtual void SAL_CALL setAlwaysOnTop( sal_Bool _alwaysontop ) override;
+ virtual sal_Bool SAL_CALL getMouseVisible() override;
+ virtual void SAL_CALL setMouseVisible( sal_Bool _mousevisible ) override;
+ virtual sal_Bool SAL_CALL getUsePen() override;
+ virtual void SAL_CALL setUsePen( sal_Bool _usepen ) override;
+ virtual ::sal_Int32 SAL_CALL getPenColor() override;
+ virtual void SAL_CALL setPenColor( ::sal_Int32 _pencolor ) override;
+ virtual double SAL_CALL getPenWidth() override;
+ virtual void SAL_CALL setPenWidth( double dStrokeWidth ) override;
+ /// @throws css::uno::RuntimeException
+ virtual void SAL_CALL setEraseAllInk( sal_Bool bEraseAllInk ) override;
+ virtual sal_Bool SAL_CALL isRunning( ) override;
+ virtual ::sal_Int32 SAL_CALL getSlideCount( ) override;
+ virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getSlideByIndex( ::sal_Int32 Index ) override;
+ virtual void SAL_CALL addSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener ) override;
+ virtual void SAL_CALL removeSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener ) override;
+ virtual void SAL_CALL gotoNextEffect( ) override;
+ virtual void SAL_CALL gotoPreviousEffect( ) override;
+ virtual void SAL_CALL gotoFirstSlide( ) override;
+ virtual void SAL_CALL gotoNextSlide( ) override;
+ virtual void SAL_CALL gotoPreviousSlide( ) override;
+ virtual void SAL_CALL gotoLastSlide( ) override;
+ virtual void SAL_CALL gotoBookmark( const OUString& Bookmark ) override;
+ virtual void SAL_CALL gotoSlide( const css::uno::Reference< css::drawing::XDrawPage >& Page ) override;
+ virtual void SAL_CALL gotoSlideIndex( ::sal_Int32 Index ) override;
+ virtual void SAL_CALL stopSound( ) override;
+ virtual void SAL_CALL pause( ) override;
+ virtual void SAL_CALL resume( ) override;
+ virtual sal_Bool SAL_CALL isPaused( ) override;
+ virtual void SAL_CALL blankScreen( ::sal_Int32 Color ) override;
+ virtual void SAL_CALL activate( ) override;
+ virtual void SAL_CALL deactivate( ) override;
+ virtual sal_Bool SAL_CALL isActive( ) override;
+ virtual css::uno::Reference< css::drawing::XDrawPage > SAL_CALL getCurrentSlide( ) override;
+ virtual ::sal_Int32 SAL_CALL getCurrentSlideIndex( ) override;
+ virtual ::sal_Int32 SAL_CALL getNextSlideIndex( ) override;
+ virtual sal_Bool SAL_CALL isEndless( ) override;
+ virtual sal_Bool SAL_CALL isFullScreen( ) override;
+ virtual css::uno::Reference< css::presentation::XSlideShow > SAL_CALL getSlideShow( ) override;
+
+ // XIndexAccess
+ virtual ::sal_Int32 SAL_CALL getCount( ) override;
+ virtual css::uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) override;
+ virtual css::uno::Type SAL_CALL getElementType( ) override;
+ virtual sal_Bool SAL_CALL hasElements( ) override;
+
+ // will be called from the SlideShowListenerProxy when this event is fired from the XSlideShow
+ void slideEnded(const bool bReverse);
+ /// @throws css::uno::RuntimeException
+ void hyperLinkClicked(const OUString & hyperLink);
+ void click(const css::uno::Reference< css::drawing::XShape > & xShape);
+ bool swipe(const CommandSwipeData &rSwipeData);
+ bool longpress(const CommandLongPressData& rLongPressData);
+
+ /// ends the presentation async
+ void endPresentation();
+
+ ViewShell* getViewShell() const { return mpViewShell; }
+
+ void paint();
+ bool keyInput(const KeyEvent& rKEvt);
+ void mouseButtonUp(const MouseEvent& rMEvt);
+
+private:
+ SlideshowImpl(SlideshowImpl const &) = delete;
+ void operator =(SlideshowImpl const &) = delete;
+
+ virtual ~SlideshowImpl() override;
+
+ // override WeakComponentImplHelperBase::disposing()
+ // This function is called upon disposing the component,
+ // if your component needs special work when it becomes
+ // disposed, do it here.
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ // internal
+ bool startShow( PresentationSettingsEx const * pPresSettings );
+ bool startPreview(
+ const css::uno::Reference< css::drawing::XDrawPage >& xDrawPage,
+ const css::uno::Reference< css::animations::XAnimationNode >& xAnimationNode,
+ vcl::Window* pParent );
+
+ /** forces an async call to update in the main thread */
+ void startUpdateTimer();
+
+ void update();
+
+ void createSlideList( bool bAll, std::u16string_view rPresSlide );
+
+ void displayCurrentSlide (const bool bSkipAllMainSequenceEffects = false);
+
+ void displaySlideNumber( sal_Int32 nSlide );
+ void displaySlideIndex( sal_Int32 nIndex );
+ sal_Int32 getCurrentSlideNumber() const;
+ bool isInputFreezed() const { return mbInputFreeze; }
+
+ void jumpToBookmark( const OUString& sBookmark );
+
+ void hideChildWindows();
+ void showChildWindows();
+
+ void resize( const Size& rSize );
+
+ void setActiveXToolbarsVisible( bool bVisible );
+
+ DECL_LINK( updateHdl, Timer *, void );
+ DECL_LINK( ReadyForNextInputHdl, Timer *, void );
+ DECL_LINK( endPresentationHdl, void*, void );
+ void ContextMenuSelectHdl(std::string_view rIdent);
+ DECL_LINK( ContextMenuHdl, void*, void );
+ DECL_LINK( deactivateHdl, Timer *, void );
+ DECL_LINK( EventListenerHdl, VclSimpleEvent&, void );
+
+ /** called only by the slideshow view when the first paint event occurs.
+ This actually starts the slideshow. */
+ void onFirstPaint();
+
+ ::tools::Long getRestoreSlide() const { return mnRestoreSlide; }
+
+private:
+ bool startShowImpl(
+ const css::uno::Sequence< css::beans::PropertyValue >& aProperties );
+
+ SfxViewFrame* getViewFrame() const;
+ SfxDispatcher* getDispatcher() const;
+ SfxBindings* getBindings() const;
+
+ sal_Int32 getSlideNumberForBookmark( const OUString& rStrBookmark );
+
+ void removeShapeEvents();
+ void registerShapeEvents( sal_Int32 nSlideNumber );
+ /// @throws css::uno::Exception
+ void registerShapeEvents( css::uno::Reference< css::drawing::XShapes > const & xShapes );
+
+ static css::uno::Reference< css::presentation::XSlideShow > createSlideShow();
+
+ static void setAutoSaveState( bool bOn );
+ void gotoPreviousSlide (const bool bSkipAllMainSequenceEffects);
+
+ /** Called by our maUpdateTimer's updateHdl handler this method is
+ responsible to call the slideshow update() method and, depending on
+ its return value, wait for a certain amount of time before another
+ call to update() is scheduled.
+ */
+ void updateSlideShow();
+
+ css::uno::Reference< css::presentation::XSlideShow > mxShow;
+ rtl::Reference<sd::SlideShowView> mxView;
+ css::uno::Reference< css::frame::XModel > mxModel;
+
+ Timer maUpdateTimer;
+ Timer maInputFreezeTimer;
+ Timer maDeactivateTimer;
+
+ ::sd::View* mpView;
+ ViewShell* mpViewShell;
+ DrawDocShell* mpDocSh;
+ SdDrawDocument* mpDoc;
+
+ VclPtr<vcl::Window> mpParentWindow;
+ VclPtr<sd::ShowWindow> mpShowWindow;
+
+ std::shared_ptr< AnimationSlideController > mpSlideController;
+
+ ::tools::Long mnRestoreSlide;
+ Point maPopupMousePos;
+ Size maPresSize;
+ AnimationMode meAnimationMode;
+ OUString maCharBuffer;
+ VclPtr< ::sd::Window> mpOldActiveWindow;
+ Link<StarBASIC*,bool> maStarBASICGlobalErrorHdl;
+ ::tools::ULong mnChildMask;
+ bool mbDisposed;
+ bool mbAutoSaveWasOn;
+ bool mbRehearseTimings;
+ bool mbIsPaused;
+ bool mbWasPaused; // used to cache pause state during context menu
+ bool mbInputFreeze;
+ bool mbActive;
+
+ PresentationSettings maPresSettings;
+ sal_Int32 mnUserPaintColor;
+
+ bool mbUsePen;
+ double mdUserPaintStrokeWidth;
+
+ std::map< css::uno::Reference< css::drawing::XShape >, WrappedShapeEventImplPtr >
+ maShapeEventMap;
+
+ css::uno::Reference< css::drawing::XDrawPage > mxPreviewDrawPage;
+ css::uno::Reference< css::animations::XAnimationNode > mxPreviewAnimationNode;
+
+ css::uno::Reference< css::media::XPlayer > mxPlayer;
+
+ ::std::unique_ptr<PaneHider> mpPaneHider;
+
+ ImplSVEvent * mnEndShowEvent;
+ ImplSVEvent * mnContextMenuEvent;
+
+ css::uno::Reference< css::presentation::XPresentation2 > mxPresentation;
+ ::rtl::Reference< SlideShowListenerProxy > mxListenerProxy;
+};
+
+} // namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slideshow/slideshowviewimpl.cxx b/sd/source/ui/slideshow/slideshowviewimpl.cxx
new file mode 100644
index 000000000..d6addc3f8
--- /dev/null
+++ b/sd/source/ui/slideshow/slideshowviewimpl.cxx
@@ -0,0 +1,626 @@
+/* -*- 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 "slideshowviewimpl.hxx"
+#include "slideshowimpl.hxx"
+#include <sdpage.hxx>
+
+#include <vcl/svapp.hxx>
+
+#include <com/sun/star/awt/Pointer.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/matrix/b2dhommatrixtools.hxx>
+#include <basegfx/matrix/b2dhommatrix.hxx>
+
+#include <cppcanvas/vclfactory.hxx>
+#include <cppcanvas/basegfxfactory.hxx>
+#include <basegfx/utils/canvastools.hxx>
+
+#include <toolkit/helper/vclunohelper.hxx>
+#include <comphelper/processfactory.hxx>
+
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::WeakReference;
+using ::com::sun::star::uno::Exception;
+
+using namespace ::com::sun::star;
+
+namespace sd
+{
+
+void SlideShowViewMouseListeners::notify( std::unique_lock<std::mutex>& rGuard, const WrappedMouseEvent& rEvent )
+{
+ forEach(rGuard,
+ [&rEvent] (const Reference<css::awt::XMouseListener>& rListener)
+ {
+ switch( rEvent.meType )
+ {
+ case WrappedMouseEvent::PRESSED:
+ rListener->mousePressed( rEvent.maEvent );
+ break;
+
+ case WrappedMouseEvent::RELEASED:
+ rListener->mouseReleased( rEvent.maEvent );
+ break;
+
+ case WrappedMouseEvent::ENTERED:
+ rListener->mouseEntered( rEvent.maEvent );
+ break;
+
+ case WrappedMouseEvent::EXITED:
+ rListener->mouseExited( rEvent.maEvent );
+ break;
+ }
+ });
+}
+
+
+void SlideShowViewMouseMotionListeners::notify( std::unique_lock<std::mutex>& rGuard,const WrappedMouseMotionEvent& rEvent )
+{
+ forEach(rGuard,
+ [&rEvent] (const Reference< awt::XMouseMotionListener >& rListener)
+ {
+ switch( rEvent.meType )
+ {
+ case WrappedMouseMotionEvent::DRAGGED:
+ rListener->mouseDragged( rEvent.maEvent );
+ break;
+
+ case WrappedMouseMotionEvent::MOVED:
+ rListener->mouseMoved( rEvent.maEvent );
+ break;
+ }
+ });
+}
+
+// SlideShowView
+SlideShowView::SlideShowView( ShowWindow& rOutputWindow,
+ SdDrawDocument* pDoc,
+ AnimationMode eAnimationMode,
+ SlideshowImpl* pSlideShow,
+ bool bFullScreen )
+: mpCanvas( ::cppcanvas::VCLFactory::createSpriteCanvas( rOutputWindow ) ),
+ mxWindow( VCLUnoHelper::GetInterface( &rOutputWindow ), uno::UNO_SET_THROW ),
+ mxWindowPeer( mxWindow, uno::UNO_QUERY_THROW ),
+ mpSlideShow( pSlideShow ),
+ mrOutputWindow( rOutputWindow ),
+ mpDoc( pDoc ),
+ mbIsMouseMotionListener( false ),
+ meAnimationMode( eAnimationMode ),
+ mbFirstPaint( true ),
+ mbMousePressedEaten( false )
+{
+ mxWindow->addWindowListener( this );
+ mxWindow->addMouseListener( this );
+
+ mxPointer = awt::Pointer::create( ::comphelper::getProcessComponentContext() );
+
+ getTransformation();
+
+ // #i48939# only switch on kind of hacky scroll optimization, when
+ // running fullscreen. this minimizes the probability that other
+ // windows partially cover the show.
+ if( bFullScreen )
+ {
+ try
+ {
+ Reference< beans::XPropertySet > xCanvasProps( getCanvas(),
+ uno::UNO_QUERY_THROW );
+ xCanvasProps->setPropertyValue("UnsafeScrolling",
+ uno::Any( true ) );
+ }
+ catch( uno::Exception& )
+ {
+ }
+ }
+
+ mTranslationOffset.Width = 0;
+ mTranslationOffset.Height = 0;
+}
+
+// Dispose all internal references
+void SlideShowView::disposing(std::unique_lock<std::mutex>& rGuard)
+{
+ mpSlideShow = nullptr;
+
+ // deregister listeners
+ if( mxWindow.is() )
+ {
+ mxWindow->removeWindowListener( this );
+ mxWindow->removeMouseListener( this );
+
+ if( mbIsMouseMotionListener )
+ mxWindow->removeMouseMotionListener( this );
+ }
+
+ mpCanvas.reset();
+ mxWindow.clear();
+
+ // clear all listener containers
+ disposingImpl(rGuard);
+}
+
+// Disposing our broadcaster
+void SAL_CALL SlideShowView::disposing( const lang::EventObject& )
+{
+ std::unique_lock aGuard( m_aMutex );
+
+ disposingImpl(aGuard);
+}
+
+// Disposing our broadcaster
+void SlideShowView::disposingImpl(std::unique_lock<std::mutex>& rGuard)
+{
+ // notify all listeners that _we_ are going down (send a disposing()),
+ // then delete listener containers:
+ lang::EventObject const evt( static_cast<OWeakObject *>(this) );
+ if (!maViewListeners.empty())
+ {
+ auto tmp = std::move(maViewListeners);
+ rGuard.unlock();
+ for( const auto& rxListener : tmp )
+ {
+ Reference< util::XModifyListener > xListener( rxListener );
+ if( xListener.is() )
+ xListener->disposing( evt );
+ }
+ rGuard.lock();
+ }
+ if (maPaintListeners.getLength(rGuard))
+ {
+ maPaintListeners.disposeAndClear( rGuard, evt );
+ rGuard.lock();
+ }
+ if (maMouseListeners.getLength(rGuard))
+ {
+ maMouseListeners.disposeAndClear( rGuard, evt );
+ rGuard.lock();
+ }
+ if (maMouseMotionListeners.getLength(rGuard))
+ {
+ maMouseMotionListeners.disposeAndClear( rGuard, evt );
+ rGuard.lock();
+ }
+}
+
+void SlideShowView::paint( const awt::PaintEvent& e )
+{
+ std::unique_lock aGuard( m_aMutex );
+
+ if( mbFirstPaint )
+ {
+ mbFirstPaint = false;
+ SlideshowImpl* pSlideShow = mpSlideShow;
+ aGuard.unlock();
+ if( pSlideShow )
+ pSlideShow->onFirstPaint();
+ }
+ else
+ {
+ // Change event source, to enable listeners to match event
+ // with view
+ awt::PaintEvent aEvent( e );
+ aEvent.Source = static_cast< ::cppu::OWeakObject* >( this );
+ maPaintListeners.notifyEach( aGuard, &css::awt::XPaintListener::windowPaint, aEvent );
+ updateimpl( aGuard, mpSlideShow ); // warning: clears guard!
+ }
+}
+
+// XSlideShowView methods
+Reference< rendering::XSpriteCanvas > SAL_CALL SlideShowView::getCanvas( )
+{
+ std::unique_lock aGuard( m_aMutex );
+
+ return mpCanvas ? mpCanvas->getUNOSpriteCanvas() : Reference< rendering::XSpriteCanvas >();
+}
+
+void SAL_CALL SlideShowView::clear()
+{
+ // paint background in black
+ std::unique_lock aGuard( m_aMutex );
+ SolarMutexGuard aSolarGuard;
+
+ // fill the bounds rectangle in black
+
+ const Size aWindowSize( mrOutputWindow.GetSizePixel() );
+
+ ::basegfx::B2DPolygon aPoly( ::basegfx::utils::createPolygonFromRect(
+ ::basegfx::B2DRectangle(0.0,0.0,
+ aWindowSize.Width(),
+ aWindowSize.Height() ) ) );
+ ::cppcanvas::PolyPolygonSharedPtr pPolyPoly(
+ ::cppcanvas::BaseGfxFactory::createPolyPolygon( mpCanvas, aPoly ) );
+
+ if( pPolyPoly )
+ {
+ pPolyPoly->setRGBAFillColor( 0x000000FFU );
+ pPolyPoly->draw();
+ }
+}
+
+geometry::IntegerSize2D SAL_CALL SlideShowView::getTranslationOffset( )
+{
+ return mTranslationOffset;
+}
+
+geometry::AffineMatrix2D SAL_CALL SlideShowView::getTransformation( )
+{
+ std::unique_lock aGuard( m_aMutex );
+ SolarMutexGuard aSolarGuard;
+
+ const Size& rTmpSize( mrOutputWindow.GetSizePixel() );
+
+ if (rTmpSize.IsEmpty())
+ {
+ return geometry::AffineMatrix2D (1,0,0,0,1,0);
+ }
+
+ const Size aWindowSize( mrOutputWindow.GetSizePixel() );
+ Size aOutputSize( aWindowSize );
+
+ if( meAnimationMode != ANIMATIONMODE_SHOW )
+ {
+ aOutputSize.setWidth( static_cast<::tools::Long>( aOutputSize.Width() / 1.03 ) );
+ aOutputSize.setHeight( static_cast<::tools::Long>( aOutputSize.Height() / 1.03 ) );
+ }
+
+ SdPage* pP = mpDoc->GetSdPage( 0, PageKind::Standard );
+ Size aPageSize( pP->GetSize() );
+
+ const double page_ratio = static_cast<double>(aPageSize.Width()) / static_cast<double>(aPageSize.Height());
+ const double output_ratio = static_cast<double>(aOutputSize.Width()) / static_cast<double>(aOutputSize.Height());
+
+ if( page_ratio > output_ratio )
+ {
+ aOutputSize.setHeight( ( aOutputSize.Width() * aPageSize.Height() ) / aPageSize.Width() );
+ }
+ else if( page_ratio < output_ratio )
+ {
+ aOutputSize.setWidth( ( aOutputSize.Height() * aPageSize.Width() ) / aPageSize.Height() );
+ }
+
+ Point aOutputOffset( ( aWindowSize.Width() - aOutputSize.Width() ) >> 1,
+ ( aWindowSize.Height() - aOutputSize.Height() ) >> 1 );
+
+ // Reduce available width by one, as the slides might actually
+ // render one pixel wider and higher as aPageSize below specifies
+ // (when shapes of page size have visible border lines)
+ aOutputSize.AdjustWidth( -1 );
+ aOutputSize.AdjustHeight( -1 );
+
+ // Record mTranslationOffset
+ mTranslationOffset.Height = aOutputOffset.Y();
+ mTranslationOffset.Width = aOutputOffset.X();
+
+ // scale presentation into available window rect (minus 10%); center in the window
+ const basegfx::B2DHomMatrix aMatrix(basegfx::utils::createScaleTranslateB2DHomMatrix(
+ aOutputSize.Width(), aOutputSize.Height(), aOutputOffset.X(), aOutputOffset.Y()));
+
+ geometry::AffineMatrix2D aRes;
+
+ return ::basegfx::unotools::affineMatrixFromHomMatrix( aRes, aMatrix );
+}
+
+void SAL_CALL SlideShowView::addTransformationChangedListener( const Reference< util::XModifyListener >& xListener )
+{
+ std::unique_lock aGuard( m_aMutex );
+
+ if (m_bDisposed)
+ return;
+ WeakReference< util::XModifyListener > xWeak( xListener );
+ if( std::find( maViewListeners.begin(), maViewListeners.end(), xWeak ) == maViewListeners.end() )
+ maViewListeners.push_back( xWeak );
+}
+
+void SAL_CALL SlideShowView::removeTransformationChangedListener( const Reference< util::XModifyListener >& xListener )
+{
+ std::unique_lock aGuard( m_aMutex );
+
+ if (m_bDisposed)
+ return;
+ WeakReference< util::XModifyListener > xWeak( xListener );
+ auto aIter( std::find( maViewListeners.begin(), maViewListeners.end(), xWeak ) );
+ if( aIter != maViewListeners.end() )
+ maViewListeners.erase( aIter );
+}
+
+void SAL_CALL SlideShowView::addPaintListener( const Reference< awt::XPaintListener >& xListener )
+{
+ std::unique_lock aGuard( m_aMutex );
+
+ if (!m_bDisposed)
+ maPaintListeners.addInterface( aGuard, xListener );
+}
+
+void SAL_CALL SlideShowView::removePaintListener( const Reference< awt::XPaintListener >& xListener )
+{
+ std::unique_lock aGuard( m_aMutex );
+
+ if (!m_bDisposed)
+ maPaintListeners.removeInterface( aGuard, xListener );
+}
+
+void SAL_CALL SlideShowView::addMouseListener( const Reference< awt::XMouseListener >& xListener )
+{
+ std::unique_lock aGuard( m_aMutex );
+
+ if (!m_bDisposed)
+ maMouseListeners.addInterface( aGuard, xListener );
+}
+
+void SAL_CALL SlideShowView::removeMouseListener( const Reference< awt::XMouseListener >& xListener )
+{
+ std::unique_lock aGuard( m_aMutex );
+
+ if (!m_bDisposed)
+ maMouseListeners.removeInterface( aGuard, xListener );
+}
+
+void SAL_CALL SlideShowView::addMouseMotionListener( const Reference< awt::XMouseMotionListener >& xListener )
+{
+ std::unique_lock aGuard( m_aMutex );
+
+ if (m_bDisposed)
+ return;
+
+ if( !mbIsMouseMotionListener && mxWindow.is() )
+ {
+ // delay motion event registration, until we really
+ // need it
+ mbIsMouseMotionListener = true;
+ mxWindow->addMouseMotionListener( this );
+ }
+
+ maMouseMotionListeners.addInterface( aGuard, xListener );
+}
+
+void SAL_CALL SlideShowView::removeMouseMotionListener( const Reference< awt::XMouseMotionListener >& xListener )
+{
+ std::unique_lock aGuard( m_aMutex );
+
+ if (!m_bDisposed)
+ maMouseMotionListeners.removeInterface( aGuard, xListener );
+
+ // TODO(P1): Might be nice to deregister for mouse motion
+ // events, when the last listener is gone.
+}
+
+void SAL_CALL SlideShowView::setMouseCursor( sal_Int16 nPointerShape )
+{
+ std::unique_lock aGuard( m_aMutex );
+
+ // forward to window
+ if( mxPointer.is() )
+ mxPointer->setType( nPointerShape );
+
+ if( mxWindowPeer.is() )
+ mxWindowPeer->setPointer( mxPointer );
+}
+
+awt::Rectangle SAL_CALL SlideShowView::getCanvasArea( )
+{
+ awt::Rectangle aRectangle;
+
+ if( mxWindow.is() )
+ return mxWindow->getPosSize();
+
+ aRectangle.X = aRectangle.Y = aRectangle.Width = aRectangle.Height = 0;
+
+ return aRectangle;
+}
+
+void SlideShowView::updateimpl( std::unique_lock<std::mutex>& rGuard, SlideshowImpl* pSlideShow )
+{
+ if( !pSlideShow )
+ return;
+
+ ::rtl::Reference< SlideshowImpl > xKeepAlive( pSlideShow );
+
+ if( mbFirstPaint )
+ {
+ mbFirstPaint = false;
+ SlideshowImpl* pTmpSlideShow = mpSlideShow;
+ rGuard.unlock();
+ if( pTmpSlideShow )
+ pTmpSlideShow->onFirstPaint();
+ } else
+ rGuard.unlock();
+
+ pSlideShow->startUpdateTimer();
+}
+
+// XWindowListener methods
+void SAL_CALL SlideShowView::windowResized( const awt::WindowEvent& e )
+{
+ std::unique_lock aGuard( m_aMutex );
+
+ if (m_bDisposed)
+ return;
+
+ if (!maViewListeners.empty())
+ {
+ // Change event source, to enable listeners to match event
+ // with view
+ awt::WindowEvent aEvent( e );
+ aEvent.Source = static_cast< ::cppu::OWeakObject* >( this );
+ auto aIter( maViewListeners.begin() );
+ while( aIter != maViewListeners.end() )
+ {
+ Reference< util::XModifyListener > xListener( *aIter );
+ if( xListener.is() )
+ {
+ aGuard.unlock();
+ xListener->modified( aEvent );
+ aGuard.lock();
+ ++aIter;
+ }
+ else
+ {
+ aIter = maViewListeners.erase( aIter );
+ }
+ }
+ }
+
+ updateimpl( aGuard, mpSlideShow ); // warning: clears guard!
+}
+
+void SAL_CALL SlideShowView::windowMoved( const awt::WindowEvent& )
+{
+ // ignored
+}
+
+void SAL_CALL SlideShowView::windowShown( const lang::EventObject& )
+{
+ // ignored
+}
+
+void SAL_CALL SlideShowView::windowHidden( const lang::EventObject& )
+{
+ // ignored
+}
+
+// XMouseListener implementation
+void SAL_CALL SlideShowView::mousePressed( const awt::MouseEvent& e )
+{
+ std::unique_lock aGuard( m_aMutex );
+ if (m_bDisposed)
+ return;
+
+ if( mpSlideShow && mpSlideShow->isInputFreezed() )
+ {
+ mbMousePressedEaten = true;
+ }
+ else
+ {
+ mbMousePressedEaten = false;
+
+ // Change event source, to enable listeners to match event
+ // with view
+ WrappedMouseEvent aEvent;
+ aEvent.meType = WrappedMouseEvent::PRESSED;
+ aEvent.maEvent = e;
+ aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this );
+
+ maMouseListeners.notify( aGuard, aEvent );
+ updateimpl( aGuard, mpSlideShow ); // warning: clears guard!
+ }
+}
+
+void SAL_CALL SlideShowView::mouseReleased( const awt::MouseEvent& e )
+{
+ std::unique_lock aGuard( m_aMutex );
+ if (m_bDisposed)
+ return;
+
+ if( mbMousePressedEaten )
+ {
+ // if mouse button down was ignored, also ignore mouse button up
+ mbMousePressedEaten = false;
+ }
+ else if( mpSlideShow && !mpSlideShow->isInputFreezed() )
+ {
+ // Change event source, to enable listeners to match event
+ // with view
+ WrappedMouseEvent aEvent;
+ aEvent.meType = WrappedMouseEvent::RELEASED;
+ aEvent.maEvent = e;
+ aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this );
+
+ maMouseListeners.notify( aGuard, aEvent );
+ updateimpl( aGuard, mpSlideShow ); // warning: clears guard!
+ }
+}
+
+void SAL_CALL SlideShowView::mouseEntered( const awt::MouseEvent& e )
+{
+ std::unique_lock aGuard( m_aMutex );
+ if (m_bDisposed)
+ return;
+
+ // Change event source, to enable listeners to match event
+ // with view
+ WrappedMouseEvent aEvent;
+ aEvent.meType = WrappedMouseEvent::ENTERED;
+ aEvent.maEvent = e;
+ aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this );
+
+ maMouseListeners.notify( aGuard, aEvent );
+ updateimpl( aGuard, mpSlideShow ); // warning: clears guard!
+}
+
+void SAL_CALL SlideShowView::mouseExited( const awt::MouseEvent& e )
+{
+ std::unique_lock aGuard( m_aMutex );
+ if (m_bDisposed)
+ return;
+
+ // Change event source, to enable listeners to match event
+ // with view
+ WrappedMouseEvent aEvent;
+ aEvent.meType = WrappedMouseEvent::EXITED;
+ aEvent.maEvent = e;
+ aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this );
+
+ maMouseListeners.notify( aGuard, aEvent );
+ updateimpl( aGuard, mpSlideShow ); // warning: clears guard!
+}
+
+// XMouseMotionListener implementation
+void SAL_CALL SlideShowView::mouseDragged( const awt::MouseEvent& e )
+{
+ std::unique_lock aGuard( m_aMutex );
+ if (m_bDisposed)
+ return;
+
+ // Change event source, to enable listeners to match event
+ // with view
+ WrappedMouseMotionEvent aEvent;
+ aEvent.meType = WrappedMouseMotionEvent::DRAGGED;
+ aEvent.maEvent = e;
+ aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this );
+
+ maMouseMotionListeners.notify( aGuard, aEvent );
+ updateimpl( aGuard, mpSlideShow ); // warning: clears guard!
+}
+
+void SAL_CALL SlideShowView::mouseMoved( const awt::MouseEvent& e )
+{
+ std::unique_lock aGuard( m_aMutex );
+ if (m_bDisposed)
+ return;
+
+ // Change event source, to enable listeners to match event
+ // with view
+ WrappedMouseMotionEvent aEvent;
+ aEvent.meType = WrappedMouseMotionEvent::MOVED;
+ aEvent.maEvent = e;
+ aEvent.maEvent.Source = static_cast< ::cppu::OWeakObject* >( this );
+
+ maMouseMotionListeners.notify( aGuard, aEvent );
+ updateimpl( aGuard, mpSlideShow ); // warning: clears guard!
+}
+
+} // namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slideshow/slideshowviewimpl.hxx b/sd/source/ui/slideshow/slideshowviewimpl.hxx
new file mode 100644
index 000000000..3a5018be4
--- /dev/null
+++ b/sd/source/ui/slideshow/slideshowviewimpl.hxx
@@ -0,0 +1,182 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <comphelper/compbase.hxx>
+#include <comphelper/interfacecontainer4.hxx>
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/util/XModifyListener.hpp>
+#include <com/sun/star/awt/XPaintListener.hpp>
+#include <com/sun/star/presentation/XSlideShowView.hpp>
+#include <cppcanvas/spritecanvas.hxx>
+#include <cppuhelper/weakref.hxx>
+
+#include <slideshow.hxx>
+
+namespace com::sun::star::awt { class XPointer; }
+namespace com::sun::star::awt { class XWindow; }
+namespace com::sun::star::awt { class XWindowPeer; }
+namespace com::sun::star::awt { struct WindowEvent; }
+namespace com::sun::star::rendering { class XSpriteCanvas; }
+class SdDrawDocument;
+
+namespace sd
+{
+
+struct WrappedMouseEvent : public css::lang::EventObject
+{
+ enum EventType
+ {
+ PRESSED,
+ RELEASED,
+ ENTERED,
+ EXITED
+ };
+
+ EventType meType;
+ css::awt::MouseEvent maEvent;
+};
+
+struct WrappedMouseMotionEvent : public css::lang::EventObject
+{
+ enum EventType
+ {
+ DRAGGED,
+ MOVED
+ };
+
+ EventType meType;
+ css::awt::MouseEvent maEvent;
+};
+
+// SlideShowViewPaintListeners
+typedef ::comphelper::OInterfaceContainerHelper4< css::awt::XPaintListener > SlideShowViewPaintListeners;
+
+
+// SlideShowViewMouseListeners
+typedef ::comphelper::OInterfaceContainerHelper4< css::awt::XMouseListener > SlideShowViewMouseListeners_Base;
+
+class SlideShowViewMouseListeners : public SlideShowViewMouseListeners_Base
+{
+public:
+ void notify(std::unique_lock<std::mutex>& rGuard, const WrappedMouseEvent& rEvent);
+};
+
+
+// SlideShowViewMouseMotionListeners
+typedef ::comphelper::OInterfaceContainerHelper4< css::awt::XMouseMotionListener > SlideShowViewMouseMotionListeners_Base;
+
+class SlideShowViewMouseMotionListeners : public SlideShowViewMouseMotionListeners_Base
+{
+public:
+ void notify( std::unique_lock<std::mutex>& rGuard, const WrappedMouseMotionEvent& rEvent );
+};
+
+// SlideShowView
+class ShowWindow;
+class SlideshowImpl;
+
+typedef comphelper::WeakComponentImplHelper< css::presentation::XSlideShowView,
+ css::awt::XWindowListener,
+ css::awt::XMouseListener,
+ css::awt::XMouseMotionListener > SlideShowView_Base;
+
+class SlideShowView final : public SlideShowView_Base
+{
+public:
+ SlideShowView( ShowWindow& rOutputWindow,
+ SdDrawDocument* pDoc,
+ AnimationMode eAnimationMode,
+ SlideshowImpl* pSlideShow,
+ bool bFullScreen );
+
+ void ignoreNextMouseReleased() { mbMousePressedEaten = true; }
+
+ /// Dispose all internal references
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ /// Disposing our broadcaster
+ virtual void SAL_CALL disposing( const css::lang::EventObject& ) override;
+
+ /// @throws css::uno::RuntimeException
+ void paint( const css::awt::PaintEvent& e );
+
+ // XSlideShowView methods
+ virtual css::uno::Reference< css::rendering::XSpriteCanvas > SAL_CALL getCanvas( ) override;
+ virtual void SAL_CALL clear( ) override;
+ virtual css::geometry::AffineMatrix2D SAL_CALL getTransformation( ) override;
+ virtual css::geometry::IntegerSize2D SAL_CALL getTranslationOffset( ) override;
+ virtual void SAL_CALL addTransformationChangedListener( const css::uno::Reference< css::util::XModifyListener >& xListener ) override;
+ virtual void SAL_CALL removeTransformationChangedListener( const css::uno::Reference< css::util::XModifyListener >& xListener ) override;
+ virtual void SAL_CALL addPaintListener( const css::uno::Reference< css::awt::XPaintListener >& xListener ) override;
+ virtual void SAL_CALL removePaintListener( const css::uno::Reference< css::awt::XPaintListener >& xListener ) override;
+ virtual void SAL_CALL addMouseListener( const css::uno::Reference< css::awt::XMouseListener >& xListener ) override;
+ virtual void SAL_CALL removeMouseListener( const css::uno::Reference< css::awt::XMouseListener >& xListener ) override;
+ virtual void SAL_CALL addMouseMotionListener( const css::uno::Reference< css::awt::XMouseMotionListener >& xListener ) override;
+ virtual void SAL_CALL removeMouseMotionListener( const css::uno::Reference< css::awt::XMouseMotionListener >& xListener ) override;
+ virtual void SAL_CALL setMouseCursor( sal_Int16 nPointerShape ) override;
+ virtual css::awt::Rectangle SAL_CALL getCanvasArea( ) override;
+
+ // XWindowListener methods
+ virtual void SAL_CALL windowResized( const css::awt::WindowEvent& e ) override;
+ virtual void SAL_CALL windowMoved( const css::awt::WindowEvent& e ) override;
+ virtual void SAL_CALL windowShown( const css::lang::EventObject& e ) override;
+ virtual void SAL_CALL windowHidden( const css::lang::EventObject& e ) override;
+
+ // XMouseListener implementation
+ virtual void SAL_CALL mousePressed( const css::awt::MouseEvent& e ) override;
+ virtual void SAL_CALL mouseReleased( const css::awt::MouseEvent& e ) override;
+ virtual void SAL_CALL mouseEntered( const css::awt::MouseEvent& e ) override;
+ virtual void SAL_CALL mouseExited( const css::awt::MouseEvent& e ) override;
+
+ // XMouseMotionListener implementation
+ virtual void SAL_CALL mouseDragged( const css::awt::MouseEvent& e ) override;
+ virtual void SAL_CALL mouseMoved( const css::awt::MouseEvent& e ) override;
+
+protected:
+ virtual ~SlideShowView() override {}
+
+private:
+ void updateimpl( std::unique_lock<std::mutex>& rGuard, SlideshowImpl* pSlideShow );
+
+ void disposingImpl( std::unique_lock<std::mutex>& );
+
+ ::cppcanvas::SpriteCanvasSharedPtr mpCanvas;
+ css::uno::Reference< css::awt::XWindow > mxWindow;
+ css::uno::Reference< css::awt::XWindowPeer > mxWindowPeer;
+ css::uno::Reference< css::awt::XPointer > mxPointer;
+ SlideshowImpl* mpSlideShow;
+ ShowWindow& mrOutputWindow;
+ std::vector< css::uno::WeakReference< css::util::XModifyListener > >
+ maViewListeners;
+ SlideShowViewPaintListeners maPaintListeners;
+ SlideShowViewMouseListeners maMouseListeners;
+ SlideShowViewMouseMotionListeners maMouseMotionListeners;
+ SdDrawDocument* mpDoc;
+ bool mbIsMouseMotionListener;
+ AnimationMode meAnimationMode;
+ bool mbFirstPaint;
+ bool mbMousePressedEaten;
+ css::geometry::IntegerSize2D mTranslationOffset;
+};
+
+} // namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapCache.cxx b/sd/source/ui/slidesorter/cache/SlsBitmapCache.cxx
new file mode 100644
index 000000000..87c727408
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsBitmapCache.cxx
@@ -0,0 +1,550 @@
+/* -*- 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 <memory>
+#include <unordered_map>
+#include "SlsBitmapCache.hxx"
+#include "SlsCacheCompactor.hxx"
+#include "SlsBitmapCompressor.hxx"
+#include "SlsCacheConfiguration.hxx"
+
+#include <sal/log.hxx>
+
+// Define the default value for the maximal cache size that is used for
+// previews that are currently not visible. The visible previews are all
+// held in memory at all times. This default is used only when the
+// configuration does not have a value.
+const sal_Int32 MAXIMAL_CACHE_SIZE = 4*1024L*1024L;
+
+using namespace ::com::sun::star::uno;
+
+namespace sd::slidesorter::cache {
+
+class BitmapCache::CacheEntry
+{
+public:
+ CacheEntry(const BitmapEx& rBitmap, sal_Int32 nLastAccessTime, bool bIsPrecious);
+ CacheEntry(sal_Int32 nLastAccessTime, bool bIsPrecious);
+ inline void Recycle (const CacheEntry& rEntry);
+ inline sal_Int32 GetMemorySize() const;
+ void Compress (const std::shared_ptr<BitmapCompressor>& rpCompressor);
+ inline void Decompress();
+
+ bool IsUpToDate() const { return mbIsUpToDate; }
+ void SetUpToDate (bool bIsUpToDate) { mbIsUpToDate = bIsUpToDate; }
+ sal_Int32 GetAccessTime() const { return mnLastAccessTime; }
+ void SetAccessTime (sal_Int32 nAccessTime) { mnLastAccessTime = nAccessTime; }
+
+ const BitmapEx& GetPreview() const { return maPreview; }
+ inline void SetPreview (const BitmapEx& rPreview);
+ bool HasPreview() const;
+
+ const BitmapEx& GetMarkedPreview() const { return maMarkedPreview; }
+ inline void SetMarkedPreview (const BitmapEx& rMarkePreview);
+
+ bool HasReplacement() const { return (mpReplacement != nullptr); }
+ inline bool HasLosslessReplacement() const;
+ void Invalidate() { mpReplacement.reset(); mpCompressor.reset(); mbIsUpToDate = false; }
+ bool IsPrecious() const { return mbIsPrecious; }
+ void SetPrecious (bool bIsPrecious) { mbIsPrecious = bIsPrecious; }
+
+private:
+ BitmapEx maPreview;
+ BitmapEx maMarkedPreview;
+ std::shared_ptr<BitmapReplacement> mpReplacement;
+ std::shared_ptr<BitmapCompressor> mpCompressor;
+ bool mbIsUpToDate;
+ sal_Int32 mnLastAccessTime;
+ // When this flag is set then the bitmap is not modified by a cache
+ // compactor.
+ bool mbIsPrecious;
+};
+
+namespace {
+
+class CacheHash {
+public:
+ size_t operator()(const BitmapCache::CacheKey& p) const
+ { return reinterpret_cast<size_t>(p); }
+};
+
+}
+
+class BitmapCache::CacheBitmapContainer
+ : public std::unordered_map<CacheKey, CacheEntry, CacheHash>
+{
+public:
+ CacheBitmapContainer() {}
+};
+
+namespace {
+
+typedef ::std::vector<
+ ::std::pair< ::sd::slidesorter::cache::BitmapCache::CacheKey,
+ ::sd::slidesorter::cache::BitmapCache::CacheEntry>
+ > SortableBitmapContainer;
+
+ /** Compare elements of the bitmap cache according to their last access
+ time.
+ */
+ class AccessTimeComparator
+ {
+ public:
+ bool operator () (
+ const SortableBitmapContainer::value_type& e1,
+ const SortableBitmapContainer::value_type& e2)
+ {
+ return e1.second.GetAccessTime() < e2.second.GetAccessTime();
+ }
+ };
+
+} // end of anonymous namespace
+
+//===== BitmapCache =========================================================
+
+BitmapCache::BitmapCache ()
+ : mpBitmapContainer(new CacheBitmapContainer()),
+ mnNormalCacheSize(0),
+ mnPreciousCacheSize(0),
+ mnCurrentAccessTime(0),
+ mnMaximalNormalCacheSize(MAXIMAL_CACHE_SIZE),
+ mbIsFull(false)
+{
+ Any aCacheSize (CacheConfiguration::Instance()->GetValue("CacheSize"));
+ if (aCacheSize.has<sal_Int32>())
+ aCacheSize >>= mnMaximalNormalCacheSize;
+
+ mpCacheCompactor = CacheCompactor::Create(*this,mnMaximalNormalCacheSize);
+}
+
+BitmapCache::~BitmapCache()
+{
+ Clear();
+}
+
+void BitmapCache::Clear()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ mpBitmapContainer->clear();
+ mnNormalCacheSize = 0;
+ mnPreciousCacheSize = 0;
+ mnCurrentAccessTime = 0;
+}
+
+bool BitmapCache::HasBitmap (const CacheKey& rKey)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey));
+ return (iEntry != mpBitmapContainer->end()
+ && (iEntry->second.HasPreview() || iEntry->second.HasReplacement()));
+}
+
+bool BitmapCache::BitmapIsUpToDate (const CacheKey& rKey)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ bool bIsUpToDate = false;
+ CacheBitmapContainer::iterator aIterator (mpBitmapContainer->find(rKey));
+ if (aIterator != mpBitmapContainer->end())
+ bIsUpToDate = aIterator->second.IsUpToDate();
+
+ return bIsUpToDate;
+}
+
+BitmapEx BitmapCache::GetBitmap (const CacheKey& rKey)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey));
+ if (iEntry == mpBitmapContainer->end())
+ {
+ // Create an empty bitmap for the given key that acts as placeholder
+ // until we are given the real one. Mark it as not being up to date.
+ SetBitmap(rKey, BitmapEx(), false);
+ iEntry = mpBitmapContainer->find(rKey);
+ iEntry->second.SetUpToDate(false);
+ }
+ else
+ {
+ iEntry->second.SetAccessTime(mnCurrentAccessTime++);
+
+ // Maybe we have to decompress the preview.
+ if ( ! iEntry->second.HasPreview() && iEntry->second.HasReplacement())
+ {
+ UpdateCacheSize(iEntry->second, REMOVE);
+ iEntry->second.Decompress();
+ UpdateCacheSize(iEntry->second, ADD);
+ }
+ }
+ return iEntry->second.GetPreview();
+}
+
+BitmapEx BitmapCache::GetMarkedBitmap (const CacheKey& rKey)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey));
+ if (iEntry != mpBitmapContainer->end())
+ {
+ iEntry->second.SetAccessTime(mnCurrentAccessTime++);
+ return iEntry->second.GetMarkedPreview();
+ }
+ else
+ return BitmapEx();
+}
+
+void BitmapCache::ReleaseBitmap (const CacheKey& rKey)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ CacheBitmapContainer::iterator aIterator (mpBitmapContainer->find(rKey));
+ if (aIterator != mpBitmapContainer->end())
+ {
+ UpdateCacheSize(aIterator->second, REMOVE);
+ mpBitmapContainer->erase(aIterator);
+ }
+}
+
+bool BitmapCache::InvalidateBitmap (const CacheKey& rKey)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey));
+ if (iEntry != mpBitmapContainer->end())
+ {
+ iEntry->second.SetUpToDate(false);
+
+ // When there is a preview then we release the replacement. The
+ // preview itself is kept until a new one is created.
+ if (iEntry->second.HasPreview())
+ {
+ UpdateCacheSize(iEntry->second, REMOVE);
+ iEntry->second.Invalidate();
+ UpdateCacheSize(iEntry->second, ADD);
+ }
+ return true;
+ }
+ else
+ return false;
+}
+
+void BitmapCache::InvalidateCache()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ for (auto& rEntry : *mpBitmapContainer)
+ {
+ rEntry.second.Invalidate();
+ }
+ ReCalculateTotalCacheSize();
+}
+
+void BitmapCache::SetBitmap (
+ const CacheKey& rKey,
+ const BitmapEx& rPreview,
+ bool bIsPrecious)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey));
+ if (iEntry != mpBitmapContainer->end())
+ {
+ UpdateCacheSize(iEntry->second, REMOVE);
+ iEntry->second.SetPreview(rPreview);
+ iEntry->second.SetUpToDate(true);
+ iEntry->second.SetAccessTime(mnCurrentAccessTime++);
+ }
+ else
+ {
+ iEntry = mpBitmapContainer->emplace(
+ rKey,
+ CacheEntry(rPreview, mnCurrentAccessTime++, bIsPrecious)
+ ).first;
+ }
+
+ if (iEntry != mpBitmapContainer->end())
+ UpdateCacheSize(iEntry->second, ADD);
+}
+
+void BitmapCache::SetMarkedBitmap (
+ const CacheKey& rKey,
+ const BitmapEx& rPreview)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey));
+ if (iEntry != mpBitmapContainer->end())
+ {
+ UpdateCacheSize(iEntry->second, REMOVE);
+ iEntry->second.SetMarkedPreview(rPreview);
+ iEntry->second.SetAccessTime(mnCurrentAccessTime++);
+ UpdateCacheSize(iEntry->second, ADD);
+ }
+}
+
+void BitmapCache::SetPrecious (const CacheKey& rKey, bool bIsPrecious)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey));
+ if (iEntry != mpBitmapContainer->end())
+ {
+ if (iEntry->second.IsPrecious() != bIsPrecious)
+ {
+ UpdateCacheSize(iEntry->second, REMOVE);
+ iEntry->second.SetPrecious(bIsPrecious);
+ UpdateCacheSize(iEntry->second, ADD);
+ }
+ }
+ else if (bIsPrecious)
+ {
+ iEntry = mpBitmapContainer->emplace(
+ rKey,
+ CacheEntry(BitmapEx(), mnCurrentAccessTime++, bIsPrecious)
+ ).first;
+ UpdateCacheSize(iEntry->second, ADD);
+ }
+}
+
+void BitmapCache::ReCalculateTotalCacheSize()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ mnNormalCacheSize = 0;
+ mnPreciousCacheSize = 0;
+ for (const auto& rEntry : *mpBitmapContainer)
+ {
+ if (rEntry.second.IsPrecious())
+ mnPreciousCacheSize += rEntry.second.GetMemorySize();
+ else
+ mnNormalCacheSize += rEntry.second.GetMemorySize();
+ }
+ mbIsFull = (mnNormalCacheSize >= mnMaximalNormalCacheSize);
+
+ SAL_INFO("sd.sls", __func__ << ": cache size is " << mnNormalCacheSize << "/" << mnPreciousCacheSize);
+}
+
+void BitmapCache::Recycle (const BitmapCache& rCache)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ for (const auto& rOtherEntry : *rCache.mpBitmapContainer)
+ {
+ CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rOtherEntry.first));
+ if (iEntry == mpBitmapContainer->end())
+ {
+ iEntry = mpBitmapContainer->emplace(
+ rOtherEntry.first,
+ CacheEntry(mnCurrentAccessTime++, true)
+ ).first;
+ UpdateCacheSize(iEntry->second, ADD);
+ }
+ if (iEntry != mpBitmapContainer->end())
+ {
+ UpdateCacheSize(iEntry->second, REMOVE);
+ iEntry->second.Recycle(rOtherEntry.second);
+ UpdateCacheSize(iEntry->second, ADD);
+ }
+ }
+}
+
+BitmapCache::CacheIndex BitmapCache::GetCacheIndex() const
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ // Create a copy of the bitmap container.
+ SortableBitmapContainer aSortedContainer;
+ aSortedContainer.reserve(mpBitmapContainer->size());
+
+ // Copy the relevant entries.
+ for (const auto& rEntry : *mpBitmapContainer)
+ {
+ if ( rEntry.second.IsPrecious())
+ continue;
+
+ if ( ! rEntry.second.HasPreview())
+ continue;
+
+ aSortedContainer.emplace_back(rEntry.first, rEntry.second);
+ }
+
+ // Sort the remaining entries.
+ ::std::sort(aSortedContainer.begin(), aSortedContainer.end(), AccessTimeComparator());
+
+ // Return a list with the keys of the sorted entries.
+ CacheIndex aIndex;
+ aIndex.reserve(aSortedContainer.size());
+ for (const auto& rIndexEntry : aSortedContainer)
+ aIndex.push_back(rIndexEntry.first);
+ return aIndex;
+}
+
+void BitmapCache::Compress (
+ const CacheKey& rKey,
+ const std::shared_ptr<BitmapCompressor>& rpCompressor)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ CacheBitmapContainer::iterator iEntry (mpBitmapContainer->find(rKey));
+ if (iEntry != mpBitmapContainer->end() && iEntry->second.HasPreview())
+ {
+ UpdateCacheSize(iEntry->second, REMOVE);
+ iEntry->second.Compress(rpCompressor);
+ UpdateCacheSize(iEntry->second, ADD);
+ }
+}
+
+void BitmapCache::UpdateCacheSize (const CacheEntry& rEntry, CacheOperation eOperation)
+{
+ sal_Int32 nEntrySize (rEntry.GetMemorySize());
+ sal_Int32& rCacheSize (rEntry.IsPrecious() ? mnPreciousCacheSize : mnNormalCacheSize);
+ switch (eOperation)
+ {
+ case ADD:
+ rCacheSize += nEntrySize;
+ if ( ! rEntry.IsPrecious() && mnNormalCacheSize>mnMaximalNormalCacheSize)
+ {
+ mbIsFull = true;
+ SAL_INFO("sd.sls", __func__ << ": cache size is " << mnNormalCacheSize << " > " << mnMaximalNormalCacheSize);
+ mpCacheCompactor->RequestCompaction();
+ }
+ break;
+
+ case REMOVE:
+ rCacheSize -= nEntrySize;
+ if (mnNormalCacheSize < mnMaximalNormalCacheSize)
+ mbIsFull = false;
+ break;
+
+ default:
+ assert(false);
+ break;
+ }
+}
+
+//===== CacheEntry ============================================================
+
+BitmapCache::CacheEntry::CacheEntry(
+ sal_Int32 nLastAccessTime,
+ bool bIsPrecious)
+ : mbIsUpToDate(true),
+ mnLastAccessTime(nLastAccessTime),
+ mbIsPrecious(bIsPrecious)
+{
+}
+
+BitmapCache::CacheEntry::CacheEntry(
+ const BitmapEx& rPreview,
+ sal_Int32 nLastAccessTime,
+ bool bIsPrecious)
+ : maPreview(rPreview),
+ mbIsUpToDate(true),
+ mnLastAccessTime(nLastAccessTime),
+ mbIsPrecious(bIsPrecious)
+{
+}
+
+inline void BitmapCache::CacheEntry::Recycle (const CacheEntry& rEntry)
+{
+ if ((rEntry.HasPreview() || rEntry.HasLosslessReplacement())
+ && ! (HasPreview() || HasLosslessReplacement()))
+ {
+ maPreview = rEntry.maPreview;
+ maMarkedPreview = rEntry.maMarkedPreview;
+ mpReplacement = rEntry.mpReplacement;
+ mpCompressor = rEntry.mpCompressor;
+ mnLastAccessTime = rEntry.mnLastAccessTime;
+ mbIsUpToDate = rEntry.mbIsUpToDate;
+ }
+}
+
+inline sal_Int32 BitmapCache::CacheEntry::GetMemorySize() const
+{
+ sal_Int32 nSize (0);
+ nSize += maPreview.GetSizeBytes();
+ nSize += maMarkedPreview.GetSizeBytes();
+ if (mpReplacement != nullptr)
+ nSize += mpReplacement->GetMemorySize();
+ return nSize;
+}
+
+void BitmapCache::CacheEntry::Compress (const std::shared_ptr<BitmapCompressor>& rpCompressor)
+{
+ if ( maPreview.IsEmpty())
+ return;
+
+ if (mpReplacement == nullptr)
+ {
+ mpReplacement = rpCompressor->Compress(maPreview);
+
+#ifdef DEBUG_SD_SLSBITMAPCACHE
+ sal_uInt32 nOldSize (maPreview.GetSizeBytes());
+ sal_uInt32 nNewSize (mpReplacement.get()!=NULL ? mpReplacement->GetMemorySize() : 0);
+ if (nOldSize == 0)
+ nOldSize = 1;
+ sal_Int32 nRatio (100L * nNewSize / nOldSize);
+ SAL_INFO("sd.sls", __func__ << ": compressing bitmap for " << %x << " from " << nOldSize << " to " << nNewSize << " bytes (" << nRatio << "%)");
+#endif
+
+ mpCompressor = rpCompressor;
+ }
+
+ maPreview.SetEmpty();
+ maMarkedPreview.SetEmpty();
+}
+
+inline void BitmapCache::CacheEntry::Decompress()
+{
+ if (mpReplacement != nullptr && mpCompressor != nullptr && maPreview.IsEmpty())
+ {
+ maPreview = mpCompressor->Decompress(*mpReplacement);
+ maMarkedPreview.SetEmpty();
+ if ( ! mpCompressor->IsLossless())
+ mbIsUpToDate = false;
+ }
+}
+
+inline void BitmapCache::CacheEntry::SetPreview (const BitmapEx& rPreview)
+{
+ maPreview = rPreview;
+ maMarkedPreview.SetEmpty();
+ mpReplacement.reset();
+ mpCompressor.reset();
+}
+
+bool BitmapCache::CacheEntry::HasPreview() const
+{
+ return ! maPreview.IsEmpty();
+}
+
+inline void BitmapCache::CacheEntry::SetMarkedPreview (const BitmapEx& rMarkedPreview)
+{
+ maMarkedPreview = rMarkedPreview;
+}
+
+inline bool BitmapCache::CacheEntry::HasLosslessReplacement() const
+{
+ return mpReplacement != nullptr && mpCompressor != nullptr && mpCompressor->IsLossless();
+}
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapCache.hxx b/sd/source/ui/slidesorter/cache/SlsBitmapCache.hxx
new file mode 100644
index 000000000..98b0bcb53
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsBitmapCache.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <vcl/bitmapex.hxx>
+#include <osl/mutex.hxx>
+#include <memory>
+
+class SdrPage;
+
+namespace sd::slidesorter::cache
+{
+class CacheCompactor;
+class BitmapCompressor;
+
+/** This low level cache is the actual bitmap container. It supports a
+ precious flag for every preview bitmap and keeps track of total sizes
+ for all previews with/without this flag. The precious flag is used by
+ compaction algorithms to determine which previews may be compressed or
+ even discarded and which have to remain in their original form. The
+ precious flag is usually set for the visible previews.
+
+ Additionally to the actual preview there is an optional marked preview.
+ This is used for slides excluded from the slide show which have a preview
+ that shows a mark (some sort of bitmap overlay) to that effect.
+*/
+class BitmapCache
+{
+public:
+ /** The key for looking up preview bitmaps is a pointer to an SdrPage
+ object. The prior use of PageObjectViewObjectContact objects (which
+ ultimately use them) turned out to be less suitable because their
+ life time is shorter then that of the page objects. Frequent
+ destruction and re-creation of the preview bitmaps was the result.
+ */
+ typedef const SdrPage* CacheKey;
+ class CacheEntry;
+ class CacheBitmapContainer;
+ typedef ::std::vector<CacheKey> CacheIndex;
+
+ /** Create a new cache for bitmap objects.
+ The default value from the configuration is used.
+ When that does not exist then an internal default value is
+ used.
+ */
+ explicit BitmapCache();
+
+ /** The destructor clears the cache and releases all bitmaps still in it.
+ */
+ ~BitmapCache();
+
+ /** Remove all preview bitmaps from the cache. After this call the
+ cache is empty.
+ */
+ void Clear();
+
+ /** Return <TRUE/> when the cache is full, i.e. the cache compactor had
+ to be run.
+ */
+ bool IsFull() const { return mbIsFull; }
+
+ /** Return the memory size that is occupied by all non-precious bitmaps
+ in the cache.
+ */
+ sal_Int32 GetSize() const { return mnNormalCacheSize; }
+
+ /** Return <TRUE/> when a preview bitmap exists for the given key.
+ */
+ bool HasBitmap(const CacheKey& rKey);
+
+ /** Return <TRUE/> when a preview bitmap exists for the given key and
+ when it is up-to-date.
+ */
+ bool BitmapIsUpToDate(const CacheKey& rKey);
+
+ /** Return the preview bitmap for the given contact object.
+ */
+ BitmapEx GetBitmap(const CacheKey& rKey);
+
+ /** Return the marked preview bitmap for the given contact object.
+ */
+ BitmapEx GetMarkedBitmap(const CacheKey& rKey);
+
+ /** Release the reference to the preview bitmap that is associated with
+ the given key.
+ */
+ void ReleaseBitmap(const CacheKey& rKey);
+
+ /** Mark the specified preview bitmap as not being up-to-date
+ anymore.
+ @return
+ When the key references a page in the cache then
+ return <TRUE/>. When the key is not known then <FALSE/>
+ is returned.
+ */
+ bool InvalidateBitmap(const CacheKey& rKey);
+
+ /** Mark all preview bitmaps as not being up-to-date anymore.
+ */
+ void InvalidateCache();
+
+ /** Add or replace a bitmap for the given key.
+ */
+ void SetBitmap(const CacheKey& rKey, const BitmapEx& rPreview, bool bIsPrecious);
+
+ /** Add or replace a marked bitmap for the given key.
+ */
+ void SetMarkedBitmap(const CacheKey& rKey, const BitmapEx& rPreview);
+
+ /** Mark the specified preview bitmap as precious, i.e. that it must not
+ be compressed or otherwise removed from the cache.
+ */
+ void SetPrecious(const CacheKey& rKey, bool bIsPrecious);
+
+ /** Calculate the cache size. This should rarely be necessary because
+ the cache size is tracked with each modification of preview
+ bitmaps.
+ */
+ void ReCalculateTotalCacheSize();
+
+ /** Use the previews in the given cache to initialize missing previews.
+ */
+ void Recycle(const BitmapCache& rCache);
+
+ /** Return a list of sorted cache keys that represent an index into (a
+ part of) the cache. The entries of the index are sorted according
+ to last access times with the least recently access time first.
+ Entries with the precious flag set are omitted.
+ Entries with that have no preview bitmaps are omitted.
+ */
+ CacheIndex GetCacheIndex() const;
+
+ /** Compress the specified preview bitmap with the given bitmap
+ compressor. A reference to the compressor is stored for later
+ decompression.
+ */
+ void Compress(const CacheKey& rKey, const std::shared_ptr<BitmapCompressor>& rpCompressor);
+
+private:
+ mutable ::osl::Mutex maMutex;
+
+ std::unique_ptr<CacheBitmapContainer> mpBitmapContainer;
+
+ /** Total size of bytes that are occupied by bitmaps in the cache for
+ whom the slides are currently not inside the visible area.
+ */
+ sal_Int32 mnNormalCacheSize;
+
+ /** Total size of bytes that are occupied by bitmaps in the cache for
+ whom the slides are currently visible.
+ */
+ sal_Int32 mnPreciousCacheSize;
+
+ /** At the moment the access time is not an actual time or date value
+ but a counter that is increased with every access. It thus defines
+ the same ordering as a true time.
+ */
+ sal_Int32 mnCurrentAccessTime;
+
+ /** The maximal cache size for the off-screen preview bitmaps. When
+ mnNormalCacheSize grows larger than this value then the
+ mpCacheCompactor member is used to reduce the cache size.
+ */
+ sal_Int32 mnMaximalNormalCacheSize;
+
+ /** The cache compactor is used to reduce the number of bytes used by
+ off-screen preview bitmaps.
+ */
+ ::std::unique_ptr<CacheCompactor> mpCacheCompactor;
+
+ /** This flag stores if the cache is or recently was full, i.e. the
+ cache compactor has or had to be run in order to reduce the cache
+ size to the allowed value.
+ */
+ bool mbIsFull;
+
+ /** Update mnNormalCacheSize or mnPreciousCacheSize according to the
+ precious flag of the specified preview bitmap and the specified
+ operation.
+ */
+ enum CacheOperation
+ {
+ ADD,
+ REMOVE
+ };
+ void UpdateCacheSize(const CacheEntry& rKey, CacheOperation eOperation);
+};
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapCompressor.cxx b/sd/source/ui/slidesorter/cache/SlsBitmapCompressor.cxx
new file mode 100644
index 000000000..d4da935dd
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsBitmapCompressor.cxx
@@ -0,0 +1,197 @@
+/* -*- 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 "SlsBitmapCompressor.hxx"
+
+#include <tools/stream.hxx>
+#include <vcl/bitmapex.hxx>
+#include <vcl/filter/PngImageReader.hxx>
+#include <vcl/pngwrite.hxx>
+
+namespace sd::slidesorter::cache {
+
+//===== NoBitmapCompression ===================================================
+
+/** This dummy replacement simply stores a shared pointer to the original
+ preview bitmap.
+*/
+class NoBitmapCompression::DummyReplacement
+ : public BitmapReplacement
+{
+public:
+ BitmapEx maPreview;
+
+ explicit DummyReplacement (const BitmapEx& rPreview) : maPreview(rPreview) { }
+ virtual ~DummyReplacement() {}
+ virtual sal_Int32 GetMemorySize() const override { return maPreview.GetSizeBytes(); }
+};
+
+std::shared_ptr<BitmapReplacement> NoBitmapCompression::Compress (const BitmapEx& rBitmap) const
+{
+ return std::make_shared<DummyReplacement>(rBitmap);
+}
+
+BitmapEx NoBitmapCompression::Decompress (const BitmapReplacement& rBitmapData) const
+{
+ return dynamic_cast<const DummyReplacement&>(rBitmapData).maPreview;
+}
+
+bool NoBitmapCompression::IsLossless() const
+{
+ return true;
+}
+
+//===== CompressionByDeletion =================================================
+
+std::shared_ptr<BitmapReplacement> CompressionByDeletion::Compress (const BitmapEx& ) const
+{
+ return std::shared_ptr<BitmapReplacement>();
+}
+
+BitmapEx CompressionByDeletion::Decompress (const BitmapReplacement& ) const
+{
+ // Return a NULL pointer. This will eventually lead to a request for
+ // the creation of a new one.
+ return BitmapEx();
+}
+
+bool CompressionByDeletion::IsLossless() const
+{
+ return false;
+}
+
+//===== ResolutionReduction ===================================================
+
+/** Store a scaled down bitmap together with the original size.
+*/
+class ResolutionReduction::ResolutionReducedReplacement : public BitmapReplacement
+{
+public:
+ BitmapEx maPreview;
+ Size maOriginalSize;
+
+ virtual ~ResolutionReducedReplacement();
+ virtual sal_Int32 GetMemorySize() const override;
+};
+
+ResolutionReduction::ResolutionReducedReplacement::~ResolutionReducedReplacement()
+{
+}
+
+sal_Int32 ResolutionReduction::ResolutionReducedReplacement::GetMemorySize() const
+{
+ return maPreview.GetSizeBytes();
+}
+
+std::shared_ptr<BitmapReplacement> ResolutionReduction::Compress (
+ const BitmapEx& rBitmap) const
+{
+ auto pResult = std::make_shared<ResolutionReducedReplacement>();
+ pResult->maPreview = rBitmap;
+ Size aSize (rBitmap.GetSizePixel());
+ pResult->maOriginalSize = aSize;
+ if (aSize.Width()>0 && aSize.Width()<mnWidth)
+ {
+ int nHeight = aSize.Height() * mnWidth / aSize.Width() ;
+ pResult->maPreview.Scale(Size(mnWidth,nHeight));
+ }
+
+ return pResult;
+}
+
+BitmapEx ResolutionReduction::Decompress (const BitmapReplacement& rBitmapData) const
+{
+ BitmapEx aResult;
+
+ const ResolutionReducedReplacement* pData (
+ dynamic_cast<const ResolutionReducedReplacement*>(&rBitmapData));
+
+ if ( pData && ! pData->maPreview.IsEmpty())
+ {
+ aResult = pData->maPreview;
+ if (pData->maOriginalSize.Width() > mnWidth)
+ aResult.Scale(pData->maOriginalSize);
+ }
+
+ return aResult;
+}
+
+bool ResolutionReduction::IsLossless() const
+{
+ return false;
+}
+
+//===== PNGCompression ========================================================
+
+class PngCompression::PngReplacement : public BitmapReplacement
+{
+public:
+ void* mpData;
+ sal_Int32 mnDataSize;
+ PngReplacement()
+ : mpData(nullptr),
+ mnDataSize(0)
+ {}
+ virtual ~PngReplacement()
+ {
+ delete [] static_cast<char*>(mpData);
+ }
+ virtual sal_Int32 GetMemorySize() const override
+ {
+ return mnDataSize;
+ }
+};
+
+std::shared_ptr<BitmapReplacement> PngCompression::Compress (const BitmapEx& rBitmap) const
+{
+ vcl::PNGWriter aWriter(rBitmap);
+ SvMemoryStream aStream (32768, 32768);
+ aWriter.Write(aStream);
+
+ auto pResult = std::make_shared<PngReplacement>();
+ pResult->mnDataSize = aStream.Tell();
+ pResult->mpData = new char[pResult->mnDataSize];
+ memcpy(pResult->mpData, aStream.GetData(), pResult->mnDataSize);
+
+ return pResult;
+}
+
+BitmapEx PngCompression::Decompress (
+ const BitmapReplacement& rBitmapData) const
+{
+ BitmapEx aResult;
+ const PngReplacement* pData (dynamic_cast<const PngReplacement*>(&rBitmapData));
+ if (pData != nullptr)
+ {
+ SvMemoryStream aStream (pData->mpData, pData->mnDataSize, StreamMode::READ);
+ vcl::PngImageReader aReader (aStream);
+ aResult = aReader.read().GetBitmap();
+ }
+
+ return aResult;
+}
+
+bool PngCompression::IsLossless() const
+{
+ return true;
+}
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapCompressor.hxx b/sd/source/ui/slidesorter/cache/SlsBitmapCompressor.hxx
new file mode 100644
index 000000000..4754bead9
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsBitmapCompressor.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+#include <memory>
+
+class BitmapEx;
+
+namespace sd::slidesorter::cache
+{
+class BitmapReplacement;
+
+/** This interface class provides the minimal method set for classes that
+ implement the compression and decompression of preview bitmaps.
+*/
+class BitmapCompressor
+{
+public:
+ /** Compress the given bitmap into a replacement format that is specific
+ to the compressor class.
+ */
+ virtual std::shared_ptr<BitmapReplacement> Compress(const BitmapEx& rBitmap) const = 0;
+
+ /** Decompress the given replacement data into a preview bitmap.
+ Depending on the compression technique the returned bitmap may
+ differ from the original bitmap given to the Compress() method. It
+ may even of the wrong size or empty or the NULL pointer. It is the
+ task of the caller to create a new preview bitmap if the returned
+ one is not as desired.
+ */
+ virtual BitmapEx Decompress(const BitmapReplacement& rBitmapData) const = 0;
+
+ /** Return whether the compression and decompression is lossless. This
+ value is used by the caller of Decompress() to decide whether to use
+ the returned bitmap as is or if a new preview has to be created.
+ */
+ virtual bool IsLossless() const = 0;
+
+protected:
+ ~BitmapCompressor() {}
+};
+
+/** Interface for preview bitmap replacements. Each bitmap
+ compressor/decompressor has to provide an implementation that is
+ suitable to store the compressed bitmaps.
+*/
+class BitmapReplacement
+{
+public:
+ virtual sal_Int32 GetMemorySize() const { return 0; }
+
+protected:
+ ~BitmapReplacement() {}
+};
+
+/** This is one trivial bitmap compressor. It stores bitmaps unmodified
+ instead of compressing them.
+ This compressor is lossless.
+*/
+class NoBitmapCompression : public BitmapCompressor
+{
+ class DummyReplacement;
+
+public:
+ virtual ~NoBitmapCompression() {}
+ virtual std::shared_ptr<BitmapReplacement> Compress(const BitmapEx& rpBitmap) const override;
+ virtual BitmapEx Decompress(const BitmapReplacement& rBitmapData) const override;
+ virtual bool IsLossless() const override;
+};
+
+/** This is another trivial bitmap compressor. Instead of compressing a
+ bitmap, it throws the bitmap away. Its Decompress() method returns a
+ NULL pointer. The caller has to create a new preview bitmap instead.
+ This compressor clearly is not lossless.
+*/
+class CompressionByDeletion : public BitmapCompressor
+{
+public:
+ virtual ~CompressionByDeletion() {}
+ virtual std::shared_ptr<BitmapReplacement> Compress(const BitmapEx& rBitmap) const override;
+ virtual BitmapEx Decompress(const BitmapReplacement& rBitmapData) const override;
+ virtual bool IsLossless() const override;
+};
+
+/** Compress a preview bitmap by reducing its resolution. While the aspect
+ ratio is maintained the horizontal resolution is scaled down to 100
+ pixels.
+ This compressor is not lossless.
+*/
+class ResolutionReduction : public BitmapCompressor
+{
+ class ResolutionReducedReplacement;
+ static const sal_Int32 mnWidth = 100;
+
+public:
+ virtual ~ResolutionReduction() {}
+ virtual std::shared_ptr<BitmapReplacement> Compress(const BitmapEx& rpBitmap) const override;
+ /** Scale the replacement bitmap up to the original size.
+ */
+ virtual BitmapEx Decompress(const BitmapReplacement& rBitmapData) const override;
+ virtual bool IsLossless() const override;
+};
+
+/** Compress preview bitmaps using the PNG format.
+ This compressor is lossless.
+*/
+class PngCompression : public BitmapCompressor
+{
+ class PngReplacement;
+
+public:
+ virtual ~PngCompression() {}
+ virtual std::shared_ptr<BitmapReplacement> Compress(const BitmapEx& rBitmap) const override;
+ virtual BitmapEx Decompress(const BitmapReplacement& rBitmapData) const override;
+ virtual bool IsLossless() const override;
+};
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx b/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx
new file mode 100644
index 000000000..a9182c2a2
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx
@@ -0,0 +1,71 @@
+/* -*- 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 "SlsBitmapFactory.hxx"
+
+#include <PreviewRenderer.hxx>
+#include <sdpage.hxx>
+#include <vcl/bitmapex.hxx>
+
+namespace sd::slidesorter::view {
+class SlideSorterView;
+class PageObjectViewObjectContact;
+}
+
+namespace sd::slidesorter::cache {
+
+BitmapFactory::BitmapFactory()
+ : maRenderer(false)
+{
+}
+
+BitmapFactory::~BitmapFactory()
+{
+}
+
+BitmapEx BitmapFactory::CreateBitmap (
+ const SdPage& rPage,
+ const Size& rPixelSize,
+ const bool bDoSuperSampling)
+{
+ Size aSize (rPixelSize);
+ if (bDoSuperSampling)
+ {
+ // Supersampling factor
+ int aSuperSamplingFactor = 2;
+ aSize.setWidth( aSize.Width() * aSuperSamplingFactor );
+ aSize.setHeight( aSize.Height() * aSuperSamplingFactor );
+ }
+
+ BitmapEx aPreview (maRenderer.RenderPage (
+ &rPage,
+ aSize,
+ true,
+ false).GetBitmapEx());
+ if (bDoSuperSampling)
+ {
+ aPreview.Scale(rPixelSize, BmpScaleFlag::BestQuality);
+ }
+
+ return aPreview;
+}
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapFactory.hxx b/sd/source/ui/slidesorter/cache/SlsBitmapFactory.hxx
new file mode 100644
index 000000000..c1733b825
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsBitmapFactory.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <PreviewRenderer.hxx>
+
+class SdPage;
+class Size;
+
+namespace sd::slidesorter::cache
+{
+/** This factory class creates preview bitmaps for page objects. It is
+ merely an adapter for the PreviewRenderer.
+*/
+class BitmapFactory
+{
+public:
+ BitmapFactory();
+ ~BitmapFactory();
+
+ BitmapEx CreateBitmap(const SdPage& rPage, const Size& rPixelSize, const bool bDoSuperSampling);
+
+private:
+ PreviewRenderer maRenderer;
+};
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsCacheCompactor.cxx b/sd/source/ui/slidesorter/cache/SlsCacheCompactor.cxx
new file mode 100644
index 000000000..79ab9fab2
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsCacheCompactor.cxx
@@ -0,0 +1,189 @@
+/* -*- 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 <memory>
+#include "SlsCacheCompactor.hxx"
+
+#include "SlsBitmapCompressor.hxx"
+#include "SlsBitmapCache.hxx"
+#include "SlsCacheConfiguration.hxx"
+
+#include <rtl/ustring.hxx>
+#include <sal/log.hxx>
+#include <com/sun/star/uno/Any.hxx>
+
+using namespace ::com::sun::star::uno;
+
+namespace {
+
+/** This is a trivial implementation of the CacheCompactor interface class.
+ It ignores calls to RequestCompaction() and thus will never decrease the
+ total size of off-screen preview bitmaps.
+*/
+class NoCacheCompaction
+ : public ::sd::slidesorter::cache::CacheCompactor
+{
+public:
+ NoCacheCompaction (
+ ::sd::slidesorter::cache::BitmapCache& rCache,
+ sal_Int32 nMaximalCacheSize)
+ : CacheCompactor(rCache, nMaximalCacheSize)
+ {}
+
+ virtual void RequestCompaction() override { /* Ignored */ };
+
+protected:
+ virtual void Run() override { /* Do nothing */ };
+};
+
+/** This implementation of the CacheCompactor interface class uses one of
+ several bitmap compression algorithms to reduce the number of the bytes
+ of the off-screen previews in the bitmap cache. See the documentation
+ of CacheCompactor::Create() for more details on configuration properties
+ that control the choice of compression algorithm.
+*/
+class CacheCompactionByCompression
+ : public ::sd::slidesorter::cache::CacheCompactor
+{
+public:
+ CacheCompactionByCompression (
+ ::sd::slidesorter::cache::BitmapCache& rCache,
+ sal_Int32 nMaximalCacheSize,
+ const std::shared_ptr< ::sd::slidesorter::cache::BitmapCompressor>& rpCompressor);
+
+protected:
+ virtual void Run() override;
+
+private:
+ std::shared_ptr< ::sd::slidesorter::cache::BitmapCompressor> mpCompressor;
+};
+
+} // end of anonymous namespace
+
+namespace sd::slidesorter::cache {
+
+::std::unique_ptr<CacheCompactor> CacheCompactor::Create (
+ BitmapCache& rCache,
+ sal_Int32 nMaximalCacheSize)
+{
+ static const char sNone[] = "None";
+
+ std::shared_ptr<BitmapCompressor> pCompressor;
+ OUString sCompressionPolicy("PNGCompression");
+ Any aCompressionPolicy (CacheConfiguration::Instance()->GetValue("CompressionPolicy"));
+ if (aCompressionPolicy.has<OUString>())
+ aCompressionPolicy >>= sCompressionPolicy;
+ if (sCompressionPolicy == sNone)
+ pCompressor = std::make_shared<NoBitmapCompression>();
+ else if (sCompressionPolicy == "Erase")
+ pCompressor = std::make_shared<CompressionByDeletion>();
+ else if (sCompressionPolicy == "ResolutionReduction")
+ pCompressor = std::make_shared<ResolutionReduction>();
+ else
+ pCompressor = std::make_shared<PngCompression>();
+
+ ::std::unique_ptr<CacheCompactor> pCompactor;
+ OUString sCompactionPolicy("Compress");
+ Any aCompactionPolicy (CacheConfiguration::Instance()->GetValue("CompactionPolicy"));
+ if (aCompactionPolicy.has<OUString>())
+ aCompactionPolicy >>= sCompactionPolicy;
+ if (sCompactionPolicy == sNone)
+ pCompactor.reset(new NoCacheCompaction(rCache,nMaximalCacheSize));
+ else
+ pCompactor.reset(new CacheCompactionByCompression(rCache,nMaximalCacheSize,pCompressor));
+
+ return pCompactor;
+}
+
+void CacheCompactor::RequestCompaction()
+{
+ if ( ! mbIsCompactionRunning && ! maCompactionTimer.IsActive())
+ maCompactionTimer.Start();
+}
+
+CacheCompactor::CacheCompactor(
+ BitmapCache& rCache,
+ sal_Int32 nMaximalCacheSize)
+ : mrCache(rCache),
+ mnMaximalCacheSize(nMaximalCacheSize),
+ maCompactionTimer("sd CacheCompactor maCompactionTimer"),
+ mbIsCompactionRunning(false)
+{
+ maCompactionTimer.SetTimeout(100);
+ maCompactionTimer.SetInvokeHandler(LINK(this,CacheCompactor,CompactionCallback));
+}
+
+IMPL_LINK_NOARG(CacheCompactor, CompactionCallback, Timer *, void)
+{
+ mbIsCompactionRunning = true;
+
+ try
+ {
+ Run();
+ }
+ catch (const css::uno::RuntimeException&)
+ {
+ }
+ catch (const css::uno::Exception&)
+ {
+ }
+
+ mbIsCompactionRunning = false;
+}
+
+} // end of namespace ::sd::slidesorter::cache
+
+namespace {
+
+//===== CacheCompactionByCompression ==========================================
+
+CacheCompactionByCompression::CacheCompactionByCompression (
+ ::sd::slidesorter::cache::BitmapCache& rCache,
+ sal_Int32 nMaximalCacheSize,
+ const std::shared_ptr< ::sd::slidesorter::cache::BitmapCompressor>& rpCompressor)
+ : CacheCompactor(rCache,nMaximalCacheSize),
+ mpCompressor(rpCompressor)
+{
+}
+
+void CacheCompactionByCompression::Run()
+{
+ if (mrCache.GetSize() <= mnMaximalCacheSize)
+ return;
+
+ SAL_INFO("sd.sls", __func__ << ": bitmap cache uses too much space: " << mrCache.GetSize() << " > " << mnMaximalCacheSize);
+
+ ::sd::slidesorter::cache::BitmapCache::CacheIndex aIndex (
+ mrCache.GetCacheIndex());
+ for (const auto& rpIndex : aIndex)
+ {
+ if (rpIndex == nullptr)
+ continue;
+
+ mrCache.Compress(rpIndex, mpCompressor);
+ if (mrCache.GetSize() < mnMaximalCacheSize)
+ break;
+ }
+ mrCache.ReCalculateTotalCacheSize();
+ SAL_INFO("sd.sls", __func__ << ": there are now " << mrCache.GetSize() << " bytes occupied");
+}
+
+} // end of anonymous namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsCacheCompactor.hxx b/sd/source/ui/slidesorter/cache/SlsCacheCompactor.hxx
new file mode 100644
index 000000000..d694ae1a1
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsCacheCompactor.hxx
@@ -0,0 +1,87 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+#include <vcl/timer.hxx>
+#include <memory>
+
+namespace sd::slidesorter::cache {
+
+class BitmapCache;
+
+/** This is an interface class whose implementations are created via the
+ Create() factory method.
+*/
+class CacheCompactor
+{
+public:
+ virtual ~CacheCompactor() {};
+
+ /** Create a new instance of the CacheCompactor interface class. The
+ type of compaction algorithm used depends on values from the
+ configuration: the SlideSorter/PreviewCache/CompactionPolicy
+ property of the Impress.xcs file currently supports the values
+ "None" and "Compress". With the later the CompressionPolicy
+ property is evaluated which implementation of the BitmapCompress
+ interface class to use as bitmap compressor.
+ @param rCache
+ The bitmap cache on which to operate.
+ @param nMaximalCacheSize
+ The total number of bytes the off-screen bitmaps in the cache
+ may have. When the Run() method is (indirectly) called the
+ compactor tries to reduce that summed size of off-screen bitmaps
+ under this number. However, it is not guaranteed that this
+ works in all cases.
+ */
+ static ::std::unique_ptr<CacheCompactor> Create (
+ BitmapCache& rCache,
+ sal_Int32 nMaximalCacheSize);
+
+ /** Request a compaction of the off-screen previews in the bitmap
+ cache. This calls via a timer the Run() method.
+ */
+ virtual void RequestCompaction();
+
+protected:
+ BitmapCache& mrCache;
+ sal_Int32 mnMaximalCacheSize;
+
+ CacheCompactor(
+ BitmapCache& rCache,
+ sal_Int32 nMaximalCacheSize);
+
+ /** This method actually tries to reduce the total number of bytes used
+ by the off-screen preview bitmaps.
+ */
+ virtual void Run() = 0;
+
+private:
+ /** This timer is used to collect calls to RequestCompaction() and
+ eventually call Run().
+ */
+ Timer maCompactionTimer;
+ bool mbIsCompactionRunning;
+ DECL_LINK(CompactionCallback, Timer *, void);
+};
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsCacheConfiguration.cxx b/sd/source/ui/slidesorter/cache/SlsCacheConfiguration.cxx
new file mode 100644
index 000000000..fd08c7627
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsCacheConfiguration.cxx
@@ -0,0 +1,144 @@
+/* -*- 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 "SlsCacheConfiguration.hxx"
+#include <vcl/svapp.hxx>
+
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertysequence.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/configuration/theDefaultProvider.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd::slidesorter::cache {
+
+namespace
+{
+ typedef std::shared_ptr<CacheConfiguration> CacheConfigSharedPtr;
+ CacheConfigSharedPtr& theInstance()
+ {
+ static CacheConfigSharedPtr SINGLETON;
+ return SINGLETON;
+ }
+}
+
+std::weak_ptr<CacheConfiguration> CacheConfiguration::mpWeakInstance;
+
+std::shared_ptr<CacheConfiguration> CacheConfiguration::Instance()
+{
+ SolarMutexGuard aSolarGuard;
+ CacheConfigSharedPtr &rInstancePtr = theInstance();
+ if (!rInstancePtr)
+ {
+ // Maybe somebody else kept a previously created instance alive.
+ if ( ! mpWeakInstance.expired())
+ rInstancePtr = std::shared_ptr<CacheConfiguration>(mpWeakInstance);
+ if (!rInstancePtr)
+ {
+ // We have to create a new instance.
+ rInstancePtr.reset(new CacheConfiguration());
+ mpWeakInstance = rInstancePtr;
+ // Prepare to release this instance in the near future.
+ rInstancePtr->m_ReleaseTimer.SetInvokeHandler(
+ LINK(rInstancePtr.get(),CacheConfiguration,TimerCallback));
+ rInstancePtr->m_ReleaseTimer.SetTimeout(5000 /* 5s */);
+ rInstancePtr->m_ReleaseTimer.Start();
+ }
+ }
+ return rInstancePtr;
+}
+
+CacheConfiguration::CacheConfiguration()
+ : m_ReleaseTimer("sd::CacheConfiguration maReleaseTimer")
+{
+ // Get the cache size from configuration.
+ try
+ {
+ // Obtain access to the configuration.
+ Reference<lang::XMultiServiceFactory> xProvider =
+ configuration::theDefaultProvider::get( ::comphelper::getProcessComponentContext() );
+
+ // Obtain access to Impress configuration.
+ Sequence<Any> aCreationArguments(comphelper::InitAnyPropertySequence(
+ {
+ {"nodepath", Any(OUString("/org.openoffice.Office.Impress/"))},
+ {"depth", Any(sal_Int32(-1))}
+ }));
+
+ Reference<XInterface> xRoot (xProvider->createInstanceWithArguments(
+ "com.sun.star.configuration.ConfigurationAccess",
+ aCreationArguments));
+ if ( ! xRoot.is())
+ return;
+ Reference<container::XHierarchicalNameAccess> xHierarchy (xRoot, UNO_QUERY);
+ if ( ! xHierarchy.is())
+ return;
+
+ // Get the node for the slide sorter preview cache.
+ mxCacheNode.set( xHierarchy->getByHierarchicalName("MultiPaneGUI/SlideSorter/PreviewCache"), UNO_QUERY);
+ }
+ catch (RuntimeException &)
+ {
+ }
+ catch (Exception &)
+ {
+ }
+}
+
+Any CacheConfiguration::GetValue (const OUString& rName)
+{
+ Any aResult;
+
+ if (mxCacheNode != nullptr)
+ {
+ try
+ {
+ aResult = mxCacheNode->getByName(rName);
+ }
+ catch (Exception &)
+ {
+ }
+ }
+
+ return aResult;
+}
+
+IMPL_STATIC_LINK_NOARG(CacheConfiguration, TimerCallback, Timer *, void)
+{
+ CacheConfigSharedPtr &rInstancePtr = theInstance();
+ // Release our reference to the instance.
+ rInstancePtr.reset();
+ // note: if there are no other references to the instance, m_ReleaseTimer
+ // will be deleted now
+}
+
+void CacheConfiguration::Shutdown()
+{
+ CacheConfigSharedPtr &rInstancePtr = theInstance();
+ rInstancePtr.reset();
+ assert(mpWeakInstance.expired()); // ensure m_ReleaseTimer is destroyed
+}
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsCacheConfiguration.hxx b/sd/source/ui/slidesorter/cache/SlsCacheConfiguration.hxx
new file mode 100644
index 000000000..d53bcd713
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsCacheConfiguration.hxx
@@ -0,0 +1,68 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Any.hxx>
+#include <vcl/timer.hxx>
+#include <memory>
+
+namespace com::sun::star::container
+{
+class XNameAccess;
+}
+
+namespace sd::slidesorter::cache
+{
+/** A very simple and easy-to-use access to configuration entries regarding
+ the slide sorter cache.
+*/
+class CacheConfiguration
+{
+public:
+ /** Return an instance to this class. The reference is released after 5
+ seconds. Subsequent calls to this function will create a new
+ instance.
+ */
+ static std::shared_ptr<CacheConfiguration> Instance();
+
+ static void Shutdown();
+
+ /** Look up the specified value in
+ MultiPaneGUI/SlideSorter/PreviewCache. When the specified value
+ does not exist then an empty Any is returned.
+ */
+ css::uno::Any GetValue(const OUString& rName);
+
+private:
+ /** When a caller holds a reference after we have released ours we use
+ this weak pointer to avoid creating a new instance.
+ */
+ static std::weak_ptr<CacheConfiguration> mpWeakInstance;
+ Timer m_ReleaseTimer;
+ css::uno::Reference<css::container::XNameAccess> mxCacheNode;
+
+ CacheConfiguration();
+
+ DECL_STATIC_LINK(CacheConfiguration, TimerCallback, Timer*, void);
+};
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsGenericPageCache.cxx b/sd/source/ui/slidesorter/cache/SlsGenericPageCache.cxx
new file mode 100644
index 000000000..6275754fa
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsGenericPageCache.cxx
@@ -0,0 +1,278 @@
+/* -*- 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 "SlsGenericPageCache.hxx"
+
+#include "SlsQueueProcessor.hxx"
+#include "SlsRequestPriorityClass.hxx"
+#include "SlsRequestFactory.hxx"
+#include "SlsBitmapCache.hxx"
+#include <cache/SlsPageCacheManager.hxx>
+#include <tools/debug.hxx>
+
+namespace sd::slidesorter::cache {
+
+GenericPageCache::GenericPageCache (
+ const Size& rPreviewSize,
+ const bool bDoSuperSampling,
+ const SharedCacheContext& rpCacheContext)
+ : maRequestQueue(rpCacheContext),
+ mpCacheContext(rpCacheContext),
+ maPreviewSize(rPreviewSize),
+ mbDoSuperSampling(bDoSuperSampling)
+{
+ // A large size may indicate an error of the caller. After all we
+ // are creating previews.
+ DBG_ASSERT (maPreviewSize.Width()<1000 && maPreviewSize.Height()<1000,
+ "GenericPageCache<>::GetPreviewBitmap(): bitmap requested with large width. "
+ "This may indicate an error.");
+}
+
+GenericPageCache::~GenericPageCache()
+{
+ if (mpQueueProcessor != nullptr)
+ mpQueueProcessor->Stop();
+ maRequestQueue.Clear();
+ mpQueueProcessor.reset();
+
+ if (mpBitmapCache != nullptr)
+ PageCacheManager::Instance()->ReleaseCache(mpBitmapCache);
+ mpBitmapCache.reset();
+}
+
+void GenericPageCache::ProvideCacheAndProcessor()
+{
+ if (mpBitmapCache == nullptr)
+ mpBitmapCache = PageCacheManager::Instance()->GetCache(
+ mpCacheContext->GetModel(),
+ maPreviewSize);
+
+ if (mpQueueProcessor == nullptr)
+ mpQueueProcessor.reset(new QueueProcessor(
+ maRequestQueue,
+ mpBitmapCache,
+ maPreviewSize,
+ mbDoSuperSampling,
+ mpCacheContext));
+}
+
+void GenericPageCache::ChangePreviewSize (
+ const Size& rPreviewSize,
+ const bool bDoSuperSampling)
+{
+ if (rPreviewSize==maPreviewSize && bDoSuperSampling==mbDoSuperSampling)
+ return;
+
+ // A large size may indicate an error of the caller. After all we
+ // are creating previews.
+ DBG_ASSERT (maPreviewSize.Width()<1000 && maPreviewSize.Height()<1000,
+ "GenericPageCache<>::GetPreviewBitmap(): bitmap requested with large width. "
+ "This may indicate an error.");
+
+ if (mpBitmapCache != nullptr)
+ {
+ mpBitmapCache = PageCacheManager::Instance()->ChangeSize(
+ mpBitmapCache, maPreviewSize, rPreviewSize);
+ if (mpQueueProcessor != nullptr)
+ {
+ mpQueueProcessor->SetPreviewSize(rPreviewSize, bDoSuperSampling);
+ mpQueueProcessor->SetBitmapCache(mpBitmapCache);
+ }
+ }
+ maPreviewSize = rPreviewSize;
+ mbDoSuperSampling = bDoSuperSampling;
+}
+
+BitmapEx GenericPageCache::GetPreviewBitmap (
+ const CacheKey aKey,
+ const bool bResize)
+{
+ assert(aKey != nullptr);
+
+ BitmapEx aPreview;
+ bool bMayBeUpToDate = true;
+ ProvideCacheAndProcessor();
+ const SdrPage* pPage = mpCacheContext->GetPage(aKey);
+ if (mpBitmapCache->HasBitmap(pPage))
+ {
+ aPreview = mpBitmapCache->GetBitmap(pPage);
+ const Size aBitmapSize (aPreview.GetSizePixel());
+ if (aBitmapSize != maPreviewSize)
+ {
+ // Scale the bitmap to the desired size when that is possible,
+ // i.e. the bitmap is not empty.
+ if (bResize && !aBitmapSize.IsEmpty())
+ {
+ aPreview.Scale(maPreviewSize);
+ }
+ bMayBeUpToDate = false;
+ }
+ else
+ bMayBeUpToDate = true;
+ }
+ else
+ bMayBeUpToDate = false;
+
+ // Request the creation of a correctly sized preview bitmap. We do this
+ // even when the size of the bitmap in the cache is correct because its
+ // content may be not up-to-date anymore.
+ RequestPreviewBitmap(aKey, bMayBeUpToDate);
+
+ return aPreview;
+}
+
+BitmapEx GenericPageCache::GetMarkedPreviewBitmap (
+ const CacheKey aKey)
+{
+ assert(aKey != nullptr);
+
+ ProvideCacheAndProcessor();
+ const SdrPage* pPage = mpCacheContext->GetPage(aKey);
+ BitmapEx aMarkedPreview (mpBitmapCache->GetMarkedBitmap(pPage));
+
+ return aMarkedPreview;
+}
+
+void GenericPageCache::SetMarkedPreviewBitmap (
+ const CacheKey aKey,
+ const BitmapEx& rMarkedBitmap)
+{
+ assert(aKey != nullptr);
+
+ ProvideCacheAndProcessor();
+ const SdrPage* pPage = mpCacheContext->GetPage(aKey);
+ mpBitmapCache->SetMarkedBitmap(pPage, rMarkedBitmap);
+}
+
+void GenericPageCache::RequestPreviewBitmap (
+ const CacheKey aKey,
+ const bool bMayBeUpToDate)
+{
+ assert(aKey != nullptr);
+
+ const SdrPage* pPage = mpCacheContext->GetPage(aKey);
+
+ ProvideCacheAndProcessor();
+
+ // Determine if the available bitmap is up to date.
+ bool bIsUpToDate = false;
+ if (bMayBeUpToDate)
+ bIsUpToDate = mpBitmapCache->BitmapIsUpToDate (pPage);
+ if (bIsUpToDate)
+ {
+ const BitmapEx aPreview (mpBitmapCache->GetBitmap(pPage));
+ if (aPreview.IsEmpty() || aPreview.GetSizePixel()!=maPreviewSize)
+ bIsUpToDate = false;
+ }
+
+ if ( bIsUpToDate)
+ return;
+
+ // No, the bitmap is not up-to-date. Request a new one.
+ RequestPriorityClass ePriorityClass (NOT_VISIBLE);
+ if (mpCacheContext->IsVisible(aKey))
+ {
+ if (mpBitmapCache->HasBitmap(pPage))
+ ePriorityClass = VISIBLE_OUTDATED_PREVIEW;
+ else
+ ePriorityClass = VISIBLE_NO_PREVIEW;
+ }
+ maRequestQueue.AddRequest(aKey, ePriorityClass);
+ mpQueueProcessor->Start(ePriorityClass);
+}
+
+bool GenericPageCache::InvalidatePreviewBitmap (const CacheKey aKey)
+{
+ // Invalidate the page in all caches that reference it, not just this one.
+ std::shared_ptr<cache::PageCacheManager> pCacheManager (
+ cache::PageCacheManager::Instance());
+ if (pCacheManager)
+ return pCacheManager->InvalidatePreviewBitmap(
+ mpCacheContext->GetModel(),
+ aKey);
+ else if (mpBitmapCache != nullptr)
+ return mpBitmapCache->InvalidateBitmap(mpCacheContext->GetPage(aKey));
+ else
+ return false;
+}
+
+void GenericPageCache::InvalidateCache ()
+{
+ if (!mpBitmapCache)
+ return;
+
+ // When the cache is being invalidated then it makes no sense to
+ // continue creating preview bitmaps. However, this may be
+ // re-started below.
+ mpQueueProcessor->Stop();
+ maRequestQueue.Clear();
+
+ // Mark the previews in the cache as not being up-to-date anymore.
+ // Depending on the given bUpdateCache flag we start to create new
+ // preview bitmaps.
+ mpBitmapCache->InvalidateCache();
+ RequestFactory()(maRequestQueue, mpCacheContext);
+}
+
+void GenericPageCache::SetPreciousFlag (
+ const CacheKey aKey,
+ const bool bIsPrecious)
+{
+ ProvideCacheAndProcessor();
+
+ // Change the request priority class according to the new precious flag.
+ if (bIsPrecious)
+ {
+ if (mpBitmapCache->HasBitmap(mpCacheContext->GetPage(aKey)))
+ maRequestQueue.ChangeClass(aKey,VISIBLE_OUTDATED_PREVIEW);
+ else
+ maRequestQueue.ChangeClass(aKey,VISIBLE_NO_PREVIEW);
+ }
+ else
+ {
+ if (mpBitmapCache->IsFull())
+ {
+ // When the bitmap cache is full then requests for slides that
+ // are not visible are removed.
+ maRequestQueue.RemoveRequest(aKey);
+ }
+ else
+ maRequestQueue.ChangeClass(aKey,NOT_VISIBLE);
+ }
+
+ mpBitmapCache->SetPrecious(mpCacheContext->GetPage(aKey), bIsPrecious);
+}
+
+void GenericPageCache::Pause()
+{
+ ProvideCacheAndProcessor();
+ if (mpQueueProcessor != nullptr)
+ mpQueueProcessor->Pause();
+}
+
+void GenericPageCache::Resume()
+{
+ ProvideCacheAndProcessor();
+ if (mpQueueProcessor != nullptr)
+ mpQueueProcessor->Resume();
+}
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsGenericPageCache.hxx b/sd/source/ui/slidesorter/cache/SlsGenericPageCache.hxx
new file mode 100644
index 000000000..900d40268
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsGenericPageCache.hxx
@@ -0,0 +1,152 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "SlsRequestQueue.hxx"
+#include <memory>
+
+#include <vcl/bitmapex.hxx>
+
+namespace sd::slidesorter::cache {
+
+class BitmapCache;
+class QueueProcessor;
+
+/** This basically is the implementation class for the PageCache class.
+*/
+class GenericPageCache
+{
+public:
+ /** The page cache is created with a reference to the SlideSorter and
+ thus has access to both view and model. This allows the cache to
+ fill itself with requests for all pages or just the visible ones.
+ @param rPreviewSize
+ The size of the previews is expected in pixel values.
+ @param bDoSuperSampling
+ When <TRUE/> the previews are rendered larger and then scaled
+ down to the requested size to improve image quality.
+ */
+ GenericPageCache (
+ const Size& rPreviewSize,
+ const bool bDoSuperSampling,
+ const SharedCacheContext& rpCacheContext);
+
+ ~GenericPageCache();
+
+ /** Change the size of the preview bitmaps. This may be caused by a
+ resize of the slide sorter window or a change of the number of
+ columns.
+ */
+ void ChangePreviewSize (
+ const Size& rPreviewSize,
+ const bool bDoSuperSampling);
+
+ /** Request a preview bitmap for the specified page object in the
+ specified size. The returned bitmap may be a preview of the preview,
+ i.e. either a scaled (up or down) version of a previous preview (of
+ the wrong size) or an empty bitmap. In this case a request for the
+ generation of a new preview is created and inserted into the request
+ queue. When the preview is available the page shape will be told to
+ paint itself again. When it then calls this method again if
+ receives the correctly sized preview bitmap.
+ @param rRequestData
+ This data is used to determine the preview.
+ @param bResize
+ When <TRUE/> then when the available bitmap has not the
+ requested size, it is scaled before it is returned. When
+ <FALSE/> then the bitmap is returned in the wrong size and it is
+ the task of the caller to scale it.
+ @return
+ Returns a bitmap that is either empty, contains a scaled (up or
+ down) version or is the requested bitmap.
+ */
+ BitmapEx GetPreviewBitmap (
+ const CacheKey aKey,
+ const bool bResize);
+ BitmapEx GetMarkedPreviewBitmap (
+ const CacheKey aKey);
+ void SetMarkedPreviewBitmap (
+ const CacheKey aKey,
+ const BitmapEx& rMarkedBitmap);
+
+ /** When the requested preview bitmap does not yet exist or is not
+ up-to-date then the rendering of one is scheduled. Otherwise this
+ method does nothing.
+ @param rRequestData
+ This data is used to determine the preview.
+ @param bMayBeUpToDate
+ This flag helps the method to determine whether an existing
+ preview that matches the request is up to date. If the caller
+ knows that it is not then by passing <FALSE/> he tells us that we
+ do not have to check the up-to-date flag a second time. If
+ unsure use <TRUE/>.
+ */
+ void RequestPreviewBitmap (
+ const CacheKey aKey,
+ const bool bMayBeUpToDate);
+
+ /** Tell the cache to replace the bitmap associated with the given
+ request data with a new one that reflects recent changes in the
+ content of the page object.
+ @return
+ When the key is known then return <TRUE/>.
+ */
+ bool InvalidatePreviewBitmap (const CacheKey aKey);
+
+ /** Call this method when all preview bitmaps have to be generated anew.
+ This is the case when the size of the page objects on the screen has
+ changed or when the model has changed.
+ */
+ void InvalidateCache ();
+
+ /** With the precious flag you can control whether a bitmap can be
+ removed from the cache or reduced in size to make room for other
+ bitmaps or is so precious that it will not be touched. A typical
+ use is to set the precious flag for the visible pages.
+ */
+ void SetPreciousFlag (const CacheKey aKey, const bool bIsPrecious);
+
+ void Pause();
+ void Resume();
+
+private:
+ std::shared_ptr<BitmapCache> mpBitmapCache;
+
+ RequestQueue maRequestQueue;
+
+ std::unique_ptr<QueueProcessor> mpQueueProcessor;
+
+ SharedCacheContext mpCacheContext;
+
+ /** The current size of preview bitmaps.
+ */
+ Size maPreviewSize;
+
+ bool mbDoSuperSampling;
+
+ /** Both bitmap cache and queue processor are created on demand by this
+ method.
+ */
+ void ProvideCacheAndProcessor();
+};
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsPageCache.cxx b/sd/source/ui/slidesorter/cache/SlsPageCache.cxx
new file mode 100644
index 000000000..82b1b8ae4
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsPageCache.cxx
@@ -0,0 +1,109 @@
+/* -*- 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 <tools/gen.hxx>
+#include "SlsGenericPageCache.hxx"
+#include <cache/SlsPageCache.hxx>
+
+using namespace ::com::sun::star;
+
+namespace sd::slidesorter::cache {
+
+//===== PageCache =============================================================
+
+PageCache::PageCache (
+ const Size& rPreviewSize,
+ const bool bDoSuperSampling,
+ const SharedCacheContext& rpCacheContext)
+ : mpImplementation(
+ new GenericPageCache(
+ rPreviewSize,
+ bDoSuperSampling,
+ rpCacheContext))
+{
+}
+
+PageCache::~PageCache()
+{
+}
+
+void PageCache::ChangeSize (
+ const Size& rPreviewSize,
+ const bool bDoSuperSampling)
+{
+ mpImplementation->ChangePreviewSize(rPreviewSize, bDoSuperSampling);
+}
+
+BitmapEx PageCache::GetPreviewBitmap (
+ const CacheKey aKey,
+ const bool bResize)
+{
+ return mpImplementation->GetPreviewBitmap(aKey, bResize);
+}
+
+BitmapEx PageCache::GetMarkedPreviewBitmap (
+ const CacheKey aKey)
+{
+ return mpImplementation->GetMarkedPreviewBitmap(aKey);
+}
+
+void PageCache::SetMarkedPreviewBitmap (
+ const CacheKey aKey,
+ const BitmapEx& rMarkedBitmap)
+{
+ mpImplementation->SetMarkedPreviewBitmap(aKey, rMarkedBitmap);
+}
+
+void PageCache::RequestPreviewBitmap (const CacheKey aKey)
+{
+ return mpImplementation->RequestPreviewBitmap(aKey, true);
+}
+
+void PageCache::InvalidatePreviewBitmap (
+ const CacheKey aKey)
+{
+ if (mpImplementation->InvalidatePreviewBitmap(aKey))
+ RequestPreviewBitmap(aKey);
+}
+
+void PageCache::InvalidateCache()
+{
+ mpImplementation->InvalidateCache();
+}
+
+void PageCache::SetPreciousFlag (
+ const CacheKey aKey,
+ const bool bIsPrecious)
+{
+ mpImplementation->SetPreciousFlag(aKey, bIsPrecious);
+}
+
+void PageCache::Pause()
+{
+ mpImplementation->Pause();
+}
+
+void PageCache::Resume()
+{
+ mpImplementation->Resume();
+}
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsPageCacheManager.cxx b/sd/source/ui/slidesorter/cache/SlsPageCacheManager.cxx
new file mode 100644
index 000000000..45afd93c9
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsPageCacheManager.cxx
@@ -0,0 +1,420 @@
+/* -*- 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 <cache/SlsPageCacheManager.hxx>
+
+#include "SlsBitmapCache.hxx"
+
+#include <deque>
+#include <map>
+#include <memory>
+#include <unordered_map>
+
+namespace {
+
+/** Collection of data that is stored for all active preview caches.
+*/
+class CacheDescriptor
+{
+public:
+ ::sd::slidesorter::cache::PageCacheManager::DocumentKey mpDocument;
+ Size maPreviewSize;
+
+ CacheDescriptor(
+ ::sd::slidesorter::cache::PageCacheManager::DocumentKey const & pDocument,
+ const Size& rPreviewSize)
+ :mpDocument(pDocument),maPreviewSize(rPreviewSize)
+ {}
+ /// Test for equality with respect to all members.
+ class Equal {public: bool operator() (
+ const CacheDescriptor& rDescriptor1, const CacheDescriptor& rDescriptor2) const {
+ return rDescriptor1.mpDocument==rDescriptor2.mpDocument
+ && rDescriptor1.maPreviewSize==rDescriptor2.maPreviewSize;
+ } };
+ /// Hash function that takes all members into account.
+ class Hash {public: size_t operator() (const CacheDescriptor& rDescriptor) const {
+ return reinterpret_cast<size_t>(rDescriptor.mpDocument.get()) + rDescriptor.maPreviewSize.Width();
+ } };
+};
+
+/** Collection of data that is stored for the inactive, recently used
+ caches.
+*/
+class RecentlyUsedCacheDescriptor
+{
+public:
+ Size maPreviewSize;
+ std::shared_ptr< ::sd::slidesorter::cache::BitmapCache> mpCache;
+
+ RecentlyUsedCacheDescriptor(
+ const Size& rPreviewSize,
+ const std::shared_ptr< ::sd::slidesorter::cache::BitmapCache>& rpCache)
+ :maPreviewSize(rPreviewSize),mpCache(rpCache)
+ {}
+};
+
+/** The list of recently used caches is organized as queue. When elements
+ are added the list is shortened to the maximally allowed number of
+ elements by removing the least recently used elements.
+*/
+typedef ::std::deque<RecentlyUsedCacheDescriptor> RecentlyUsedQueue;
+
+/** Compare the caches by preview size. Those that match the given size
+ come first, then, regardless of the given size, the largest ones before
+ the smaller ones.
+*/
+class BestFittingCacheComparer
+{
+public:
+ explicit BestFittingCacheComparer (const Size& rPreferredSize)
+ : maPreferredSize(rPreferredSize)
+ {}
+ bool operator()(const ::sd::slidesorter::cache::PageCacheManager::BestFittingPageCaches::value_type& rElement1,
+ const ::sd::slidesorter::cache::PageCacheManager::BestFittingPageCaches::value_type& rElement2)
+ {
+ if (rElement2.first == maPreferredSize)
+ return false;
+ else if (rElement1.first == maPreferredSize)
+ return true;
+ else
+ return (rElement1.first.Width()*rElement1.first.Height()
+ > rElement2.first.Width()*rElement2.first.Height());
+ }
+
+private:
+ Size maPreferredSize;
+};
+
+} // end of anonymous namespace
+
+namespace sd::slidesorter::cache {
+
+/** Container for the active caches.
+*/
+class PageCacheManager::PageCacheContainer
+ : public std::unordered_map<CacheDescriptor,
+ std::shared_ptr<BitmapCache>,
+ CacheDescriptor::Hash,
+ CacheDescriptor::Equal>
+{
+public:
+ PageCacheContainer() {}
+
+ /** Compare entries in the cache container with respect to the cache
+ address only.
+ */
+ class CompareWithCache { public:
+ explicit CompareWithCache(const std::shared_ptr<BitmapCache>& rpCache)
+ : mpCache(rpCache) {}
+ bool operator () (const PageCacheContainer::value_type& rValue) const
+ { return rValue.second == mpCache; }
+ private:
+ std::shared_ptr<BitmapCache> mpCache;
+ };
+};
+
+/** The recently used caches are stored in one queue for each document.
+*/
+class PageCacheManager::RecentlyUsedPageCaches
+{
+public:
+ typedef DocumentKey key_type;
+ typedef RecentlyUsedQueue mapped_type;
+ typedef std::map<key_type,mapped_type>::iterator iterator;
+private:
+ std::map<key_type,mapped_type> maMap;
+public:
+ RecentlyUsedPageCaches () {};
+
+ iterator end() { return maMap.end(); }
+ void clear() { maMap.clear(); }
+ iterator find(const key_type& key) { return maMap.find(key); }
+ template<class... Args>
+ std::pair<iterator,bool> emplace(Args&&... args) { return maMap.emplace(std::forward<Args>(args)...); }
+};
+
+class PageCacheManager::Deleter
+{
+public:
+ void operator() (PageCacheManager* pObject) { delete pObject; }
+};
+
+//===== PageCacheManager ====================================================
+
+std::weak_ptr<PageCacheManager> PageCacheManager::mpInstance;
+
+std::shared_ptr<PageCacheManager> PageCacheManager::Instance()
+{
+ std::shared_ptr<PageCacheManager> pInstance;
+
+ ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
+
+ pInstance = mpInstance.lock();
+ if (pInstance == nullptr)
+ {
+ pInstance = std::shared_ptr<PageCacheManager>(
+ new PageCacheManager(),
+ PageCacheManager::Deleter());
+ mpInstance = pInstance;
+ }
+
+ return pInstance;
+}
+
+PageCacheManager::PageCacheManager()
+ : mpPageCaches(new PageCacheContainer()),
+ mpRecentlyUsedPageCaches(new RecentlyUsedPageCaches())
+{
+}
+
+PageCacheManager::~PageCacheManager()
+{
+}
+
+std::shared_ptr<BitmapCache> PageCacheManager::GetCache (
+ const DocumentKey& pDocument,
+ const Size& rPreviewSize)
+{
+ std::shared_ptr<BitmapCache> pResult;
+
+ // Look for the cache in the list of active caches.
+ CacheDescriptor aKey (pDocument, rPreviewSize);
+ PageCacheContainer::iterator iCache (mpPageCaches->find(aKey));
+ if (iCache != mpPageCaches->end())
+ pResult = iCache->second;
+
+ // Look for the cache in the list of recently used caches.
+ if (pResult == nullptr)
+ pResult = GetRecentlyUsedCache(pDocument, rPreviewSize);
+
+ // Create the cache when no suitable one does exist.
+ if (pResult == nullptr)
+ pResult = std::make_shared<BitmapCache>();
+
+ // The cache may be newly created and thus empty or is old and may
+ // contain previews that are not up-to-date. Recycle previews from
+ // other caches to fill in the holes.
+ Recycle(pResult, pDocument,rPreviewSize);
+
+ // Put the new (or old) cache into the container.
+ mpPageCaches->emplace(aKey, pResult);
+
+ return pResult;
+}
+
+void PageCacheManager::Recycle (
+ const std::shared_ptr<BitmapCache>& rpCache,
+ const DocumentKey& pDocument,
+ const Size& rPreviewSize)
+{
+ BestFittingPageCaches aCaches;
+
+ // Add bitmap caches from active caches.
+ for (auto& rActiveCache : *mpPageCaches)
+ {
+ if (rActiveCache.first.mpDocument == pDocument)
+ aCaches.emplace_back(
+ rActiveCache.first.maPreviewSize, rActiveCache.second);
+ }
+
+ // Add bitmap caches from recently used caches.
+ RecentlyUsedPageCaches::iterator iQueue (mpRecentlyUsedPageCaches->find(pDocument));
+ if (iQueue != mpRecentlyUsedPageCaches->end())
+ {
+ for (const auto& rRecentCache : iQueue->second)
+ aCaches.emplace_back(
+ rRecentCache.maPreviewSize, rRecentCache.mpCache);
+ }
+
+ ::std::sort(aCaches.begin(), aCaches.end(), BestFittingCacheComparer(rPreviewSize));
+
+ for (const auto& rBestCache : aCaches)
+ {
+ rpCache->Recycle(*rBestCache.second);
+ }
+}
+
+void PageCacheManager::ReleaseCache (const std::shared_ptr<BitmapCache>& rpCache)
+{
+ PageCacheContainer::iterator iCache (::std::find_if(
+ mpPageCaches->begin(),
+ mpPageCaches->end(),
+ PageCacheContainer::CompareWithCache(rpCache)));
+
+ if (iCache != mpPageCaches->end())
+ {
+ assert(iCache->second == rpCache);
+
+ PutRecentlyUsedCache(iCache->first.mpDocument,iCache->first.maPreviewSize,rpCache);
+
+ mpPageCaches->erase(iCache);
+ }
+}
+
+std::shared_ptr<BitmapCache> PageCacheManager::ChangeSize (
+ const std::shared_ptr<BitmapCache>& rpCache,
+ const Size&,
+ const Size& rNewPreviewSize)
+{
+ std::shared_ptr<BitmapCache> pResult;
+
+ if (rpCache != nullptr)
+ {
+ // Look up the given cache in the list of active caches.
+ PageCacheContainer::iterator iCacheToChange (::std::find_if(
+ mpPageCaches->begin(),
+ mpPageCaches->end(),
+ PageCacheContainer::CompareWithCache(rpCache)));
+ if (iCacheToChange != mpPageCaches->end())
+ {
+ assert(iCacheToChange->second == rpCache);
+
+ // Now, we can change the preview size of the existing one by
+ // removing the cache from the list and re-insert it with the
+ // updated size.
+ const ::sd::slidesorter::cache::PageCacheManager::DocumentKey aKey (
+ iCacheToChange->first.mpDocument);
+ mpPageCaches->erase(iCacheToChange);
+ mpPageCaches->emplace(
+ CacheDescriptor(aKey,rNewPreviewSize),
+ rpCache);
+
+ pResult = rpCache;
+ }
+ else
+ {
+ assert(iCacheToChange != mpPageCaches->end());
+ }
+ }
+
+ return pResult;
+}
+
+bool PageCacheManager::InvalidatePreviewBitmap (
+ const DocumentKey& pDocument,
+ const SdrPage* pKey)
+{
+ bool bHasChanged (false);
+
+ if (pDocument!=nullptr)
+ {
+ // Iterate over all caches that are currently in use and invalidate
+ // the previews in those that belong to the document.
+ for (auto& rCache : *mpPageCaches)
+ if (rCache.first.mpDocument == pDocument)
+ bHasChanged |= rCache.second->InvalidateBitmap(pKey);
+
+ // Invalidate the previews in the recently used caches belonging to
+ // the given document.
+ RecentlyUsedPageCaches::iterator iQueue (mpRecentlyUsedPageCaches->find(pDocument));
+ if (iQueue != mpRecentlyUsedPageCaches->end())
+ {
+ for (const auto& rCache2 : iQueue->second)
+ bHasChanged |= rCache2.mpCache->InvalidateBitmap(pKey);
+ }
+ }
+
+ return bHasChanged;
+}
+
+void PageCacheManager::InvalidateAllPreviewBitmaps (const DocumentKey& pDocument)
+{
+ if (pDocument == nullptr)
+ return;
+
+ // Iterate over all caches that are currently in use and invalidate the
+ // previews in those that belong to the document.
+ for (auto& rCache : *mpPageCaches)
+ if (rCache.first.mpDocument == pDocument)
+ rCache.second->InvalidateCache();
+
+ // Invalidate the previews in the recently used caches belonging to the
+ // given document.
+ RecentlyUsedPageCaches::iterator iQueue (mpRecentlyUsedPageCaches->find(pDocument));
+ if (iQueue != mpRecentlyUsedPageCaches->end())
+ {
+ for (const auto& rCache2 : iQueue->second)
+ rCache2.mpCache->InvalidateCache();
+ }
+}
+
+void PageCacheManager::InvalidateAllCaches()
+{
+ // Iterate over all caches that are currently in use and invalidate
+ // them.
+ for (auto& rCache : *mpPageCaches)
+ rCache.second->InvalidateCache();
+
+ // Remove all recently used caches, there is not much sense in storing
+ // invalidated and unused caches.
+ mpRecentlyUsedPageCaches->clear();
+}
+
+void PageCacheManager::ReleasePreviewBitmap (const SdrPage* pPage)
+{
+ for (auto& rCache : *mpPageCaches)
+ rCache.second->ReleaseBitmap(pPage);
+}
+
+std::shared_ptr<BitmapCache> PageCacheManager::GetRecentlyUsedCache (
+ const DocumentKey& pDocument,
+ const Size& rPreviewSize)
+{
+ std::shared_ptr<BitmapCache> pCache;
+
+ // Look for the cache in the list of recently used caches.
+ RecentlyUsedPageCaches::iterator iQueue (mpRecentlyUsedPageCaches->find(pDocument));
+ if (iQueue != mpRecentlyUsedPageCaches->end())
+ {
+ RecentlyUsedQueue::iterator iCache = std::find_if(iQueue->second.begin(), iQueue->second.end(),
+ [&rPreviewSize](const RecentlyUsedCacheDescriptor& rCache) { return rCache.maPreviewSize == rPreviewSize; });
+ if (iCache != iQueue->second.end())
+ {
+ pCache = iCache->mpCache;
+ iQueue->second.erase(iCache);
+ }
+ }
+
+ return pCache;
+}
+
+void PageCacheManager::PutRecentlyUsedCache(
+ DocumentKey const & pDocument,
+ const Size& rPreviewSize,
+ const std::shared_ptr<BitmapCache>& rpCache)
+{
+ // Look up the list of recently used caches for the given document.
+ RecentlyUsedPageCaches::iterator iQueue (mpRecentlyUsedPageCaches->find(pDocument));
+ if (iQueue == mpRecentlyUsedPageCaches->end())
+ iQueue = mpRecentlyUsedPageCaches->emplace(
+ pDocument, RecentlyUsedQueue()
+ ).first;
+
+ if (iQueue != mpRecentlyUsedPageCaches->end())
+ {
+ iQueue->second.push_front(RecentlyUsedCacheDescriptor(rPreviewSize,rpCache));
+ // Shorten the list of recently used caches to the allowed maximal length.
+ while (iQueue->second.size() > mnMaximalRecentlyCacheCount)
+ iQueue->second.pop_back();
+ }
+}
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsQueueProcessor.cxx b/sd/source/ui/slidesorter/cache/SlsQueueProcessor.cxx
new file mode 100644
index 000000000..077c48709
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsQueueProcessor.cxx
@@ -0,0 +1,176 @@
+/* -*- 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 "SlsQueueProcessor.hxx"
+#include "SlsRequestQueue.hxx"
+#include "SlsBitmapCache.hxx"
+
+#include <sdpage.hxx>
+#include <comphelper/profilezone.hxx>
+#include <tools/diagnose_ex.h>
+
+namespace sd::slidesorter::cache {
+
+//===== QueueProcessor ======================================================
+
+QueueProcessor::QueueProcessor (
+ RequestQueue& rQueue,
+ const std::shared_ptr<BitmapCache>& rpCache,
+ const Size& rPreviewSize,
+ const bool bDoSuperSampling,
+ const SharedCacheContext& rpCacheContext)
+ : maTimer("sd::QueueProcessor maTimer"),
+ maPreviewSize(rPreviewSize),
+ mbDoSuperSampling(bDoSuperSampling),
+ mpCacheContext(rpCacheContext),
+ mrQueue(rQueue),
+ mpCache(rpCache),
+ mbIsPaused(false)
+{
+ maTimer.SetInvokeHandler (LINK(this,QueueProcessor,ProcessRequestHdl));
+ maTimer.SetTimeout (10);
+}
+
+QueueProcessor::~QueueProcessor()
+{
+}
+
+void QueueProcessor::Start (int nPriorityClass)
+{
+ if (mbIsPaused)
+ return;
+ if ( ! maTimer.IsActive())
+ {
+ if (nPriorityClass == 0)
+ maTimer.SetTimeout (10);
+ else
+ maTimer.SetTimeout (100);
+ maTimer.Start();
+ }
+}
+
+void QueueProcessor::Stop()
+{
+ if (maTimer.IsActive())
+ maTimer.Stop();
+}
+
+void QueueProcessor::Pause()
+{
+ mbIsPaused = true;
+}
+
+void QueueProcessor::Resume()
+{
+ mbIsPaused = false;
+ if ( ! mrQueue.IsEmpty())
+ Start(mrQueue.GetFrontPriorityClass());
+}
+
+void QueueProcessor::SetPreviewSize (
+ const Size& rPreviewSize,
+ const bool bDoSuperSampling)
+{
+ maPreviewSize = rPreviewSize;
+ mbDoSuperSampling = bDoSuperSampling;
+}
+
+IMPL_LINK_NOARG(QueueProcessor, ProcessRequestHdl, Timer *, void)
+{
+ ProcessRequests();
+}
+
+void QueueProcessor::ProcessRequests()
+{
+ assert(mpCacheContext);
+
+ // Never process more than one request at a time in order to prevent the
+ // lock up of the edit view.
+ if ( ! mrQueue.IsEmpty()
+ && ! mbIsPaused
+ && mpCacheContext->IsIdle())
+ {
+ CacheKey aKey = nullptr;
+ RequestPriorityClass ePriorityClass (NOT_VISIBLE);
+ {
+ ::osl::MutexGuard aGuard (mrQueue.GetMutex());
+
+ if ( ! mrQueue.IsEmpty())
+ {
+ // Get the request with the highest priority from the queue.
+ ePriorityClass = mrQueue.GetFrontPriorityClass();
+ aKey = mrQueue.GetFront();
+ mrQueue.PopFront();
+ }
+ }
+
+ if (aKey != nullptr)
+ ProcessOneRequest(aKey, ePriorityClass);
+ }
+
+ // Schedule the processing of the next element(s).
+ {
+ ::osl::MutexGuard aGuard (mrQueue.GetMutex());
+ if ( ! mrQueue.IsEmpty())
+ Start(mrQueue.GetFrontPriorityClass());
+ else
+ {
+ comphelper::ProfileZone aZone("QueueProcessor finished processing all elements");
+ }
+ }
+}
+
+void QueueProcessor::ProcessOneRequest (
+ CacheKey aKey,
+ const RequestPriorityClass ePriorityClass)
+{
+ try
+ {
+ std::scoped_lock aGuard (maMutex);
+
+ // Create a new preview bitmap and store it in the cache.
+ if (mpCache != nullptr && mpCacheContext)
+ {
+ const SdPage* pSdPage = dynamic_cast<const SdPage*>(mpCacheContext->GetPage(aKey));
+ if (pSdPage != nullptr)
+ {
+ const BitmapEx aPreview (
+ maBitmapFactory.CreateBitmap(*pSdPage, maPreviewSize, mbDoSuperSampling));
+ mpCache->SetBitmap (pSdPage, aPreview, ePriorityClass!=NOT_VISIBLE);
+
+ // Initiate a repaint of the new preview.
+ mpCacheContext->NotifyPreviewCreation(aKey);
+ }
+ }
+ }
+ catch (css::uno::Exception &)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "QueueProcessor");
+ }
+}
+
+void QueueProcessor::SetBitmapCache (
+ const std::shared_ptr<BitmapCache>& rpCache)
+{
+ mpCache = rpCache;
+}
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsQueueProcessor.hxx b/sd/source/ui/slidesorter/cache/SlsQueueProcessor.hxx
new file mode 100644
index 000000000..0035bcbce
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsQueueProcessor.hxx
@@ -0,0 +1,98 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <cache/SlsCacheContext.hxx>
+#include "SlsRequestPriorityClass.hxx"
+#include "SlsBitmapFactory.hxx"
+
+#include <vcl/timer.hxx>
+#include <mutex>
+
+namespace sd::slidesorter::cache {
+
+class BitmapCache;
+class RequestQueue;
+
+/** This queue processor is timer based, i.e. when an entry is added to the
+ queue and the processor is started with Start() in the base class a
+ timer is started that eventually calls ProcessRequest(). This is
+ repeated until the queue is empty or Stop() is called.
+*/
+class QueueProcessor final
+{
+public:
+ QueueProcessor (
+ RequestQueue& rQueue,
+ const std::shared_ptr<BitmapCache>& rpCache,
+ const Size& rPreviewSize,
+ const bool bDoSuperSampling,
+ const SharedCacheContext& rpCacheContext);
+ ~QueueProcessor();
+
+ /** Start the processor. This implementation is timer based and waits
+ a defined amount of time that depends on the given argument before
+ the next entry in the queue is processed.
+ @param nPriorityClass
+ A priority class of 0 tells the processor that a high priority
+ request is waiting in the queue. The time to wait is thus
+ shorter then that for a low priority request (denoted by a value
+ of 1.) When the timer is already running it is not modified.
+ */
+ void Start (int nPriorityClass);
+ void Stop();
+ void Pause();
+ void Resume();
+
+ void SetPreviewSize (
+ const Size& rSize,
+ const bool bDoSuperSampling);
+
+ /** Use this method when the page cache is (maybe) using a different
+ BitmapCache. This is usually necessary after calling
+ PageCacheManager::ChangeSize().
+ */
+ void SetBitmapCache (const std::shared_ptr<BitmapCache>& rpCache);
+
+private:
+ /** This mutex is used to guard the queue processor. Be careful not to
+ mix its use with that of the solar mutex.
+ */
+ std::mutex maMutex;
+
+ Timer maTimer;
+ DECL_LINK(ProcessRequestHdl, Timer *, void);
+ Size maPreviewSize;
+ bool mbDoSuperSampling;
+ SharedCacheContext mpCacheContext;
+ RequestQueue& mrQueue;
+ std::shared_ptr<BitmapCache> mpCache;
+ BitmapFactory maBitmapFactory;
+ bool mbIsPaused;
+
+ void ProcessRequests();
+ void ProcessOneRequest (
+ CacheKey aKey,
+ const RequestPriorityClass ePriorityClass);
+};
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsRequestFactory.cxx b/sd/source/ui/slidesorter/cache/SlsRequestFactory.cxx
new file mode 100644
index 000000000..6fc6cabc9
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsRequestFactory.cxx
@@ -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/.
+ *
+ * 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 "SlsRequestFactory.hxx"
+#include "SlsRequestQueue.hxx"
+
+namespace sd::slidesorter::cache {
+
+void RequestFactory::operator()(
+ RequestQueue& rRequestQueue,
+ const SharedCacheContext& rpCacheContext)
+{
+ std::shared_ptr<std::vector<CacheKey> > aKeys;
+
+ // Add the requests for the visible pages.
+ aKeys = rpCacheContext->GetEntryList(true);
+ if (aKeys != nullptr)
+ {
+ for (const auto& rKey : *aKeys)
+ rRequestQueue.AddRequest(rKey, VISIBLE_NO_PREVIEW);
+ }
+
+ // Add the requests for the non-visible pages.
+ aKeys = rpCacheContext->GetEntryList(false);
+ if (aKeys != nullptr)
+ {
+ for (const auto& rKey : *aKeys)
+ rRequestQueue.AddRequest(rKey, NOT_VISIBLE);
+ }
+}
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsRequestFactory.hxx b/sd/source/ui/slidesorter/cache/SlsRequestFactory.hxx
new file mode 100644
index 000000000..3f4207725
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsRequestFactory.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <cache/SlsCacheContext.hxx>
+
+namespace sd::slidesorter::cache
+{
+class RequestQueue;
+
+class RequestFactory
+{
+public:
+ void operator()(RequestQueue& rRequestQueue, const SharedCacheContext& rpCacheContext);
+};
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsRequestPriorityClass.hxx b/sd/source/ui/slidesorter/cache/SlsRequestPriorityClass.hxx
new file mode 100644
index 000000000..2c84ecbcf
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsRequestPriorityClass.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 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 .
+ */
+
+#pragma once
+
+namespace sd::slidesorter::cache
+{
+/** Each request for a preview creation has a priority. This enum defines
+ the available priorities. The special values MIN_CLASS and MAX_CLASS
+ are/can be used for validation and have to be kept up-to-date.
+*/
+enum RequestPriorityClass
+{
+ MIN_CLASS = 0,
+
+ // The slide is visible. A preview does not yet exist.
+ VISIBLE_NO_PREVIEW = MIN_CLASS,
+ // The slide is visible. A preview exists but is not up-to-date anymore.
+ VISIBLE_OUTDATED_PREVIEW,
+ // The slide is not visible.
+ NOT_VISIBLE,
+
+ MAX_CLASS = NOT_VISIBLE
+};
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx b/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx
new file mode 100644
index 000000000..931c1a8f6
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx
@@ -0,0 +1,275 @@
+/* -*- 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 "SlsRequestQueue.hxx"
+
+#include <sal/log.hxx>
+
+#include <svx/svdpage.hxx>
+
+#include <set>
+
+namespace sd::slidesorter::cache {
+
+namespace {
+
+/** This class extends the actual request data with additional information
+ that is used by the priority queues.
+*/
+class Request
+{
+public:
+ Request (
+ CacheKey aKey, sal_Int32 nPriority, RequestPriorityClass eClass)
+ : maKey(aKey), mnPriorityInClass(nPriority), meClass(eClass)
+ {}
+ /** Sort requests according to priority classes and then to priorities.
+ */
+ class Comparator { public:
+ bool operator() (const Request& rRequest1, const Request& rRequest2)
+ const
+ {
+ if (rRequest1.meClass == rRequest2.meClass)
+ {
+ if (rRequest1.mnPriorityInClass == rRequest2.mnPriorityInClass)
+ {
+ return rRequest1.maKey < rRequest2.maKey;
+ }
+ return rRequest1.mnPriorityInClass > rRequest2.mnPriorityInClass;
+ }
+ return rRequest1.meClass < rRequest2.meClass;
+ }
+ };
+ /** Request data is compared arbitrarily by their addresses in memory.
+ This just establishes an order so that the STL containers are happy.
+ The order is not semantically interpreted.
+ */
+ class DataComparator
+ {
+ public:
+ explicit DataComparator (const CacheKey aKey)
+ : maKey(aKey)
+ {
+ }
+ bool operator() (const Request& rRequest) const
+ {
+ return maKey == rRequest.maKey;
+ }
+ private:
+ const CacheKey maKey;
+ };
+
+ CacheKey maKey;
+ sal_Int32 mnPriorityInClass;
+ RequestPriorityClass meClass;
+};
+
+}
+
+class RequestQueue::Container
+ : public ::std::set<
+ Request,
+ Request::Comparator>
+{
+};
+
+//===== GenericRequestQueue =================================================
+
+RequestQueue::RequestQueue (const SharedCacheContext& rpCacheContext)
+ : mpRequestQueue(new Container),
+ mpCacheContext(rpCacheContext),
+ mnMinimumPriority(0),
+ mnMaximumPriority(1)
+{
+}
+
+RequestQueue::~RequestQueue()
+{
+ Clear();
+}
+
+void RequestQueue::AddRequest (
+ CacheKey aKey,
+ RequestPriorityClass eRequestClass)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ assert(eRequestClass>=MIN_CLASS && eRequestClass<=MAX_CLASS);
+
+ // If the request is already a member of the queue then remove it so
+ // that the following insertion will use the new prioritization.
+#if OSL_DEBUG_LEVEL >=2
+ bool bRemoved =
+#endif
+ RemoveRequest(aKey);
+
+ // The priority of the request inside its priority class is defined by
+ // the page number. This ensures a strict top-to-bottom, left-to-right
+ // order.
+ sal_Int32 nPriority (mpCacheContext->GetPriority(aKey));
+ Request aRequest (aKey, nPriority, eRequestClass);
+
+ std::pair<Container::iterator,bool> ret = mpRequestQueue->insert(aRequest);
+ bool bInserted = ret.second;
+
+ if (bInserted)
+ {
+ SdrPage *pPage = const_cast<SdrPage*>(aRequest.maKey);
+ pPage->AddPageUser(*this);
+ }
+
+#if OSL_DEBUG_LEVEL >=2
+ SAL_INFO("sd.sls", __func__ << ": " << (bRemoved?"replaced":"added")
+ << " request for page " << ((aKey->GetPageNum()-1)/2)
+ << " with priority class " << static_cast<int>(eRequestClass));
+#endif
+}
+
+void RequestQueue::PageInDestruction(const SdrPage& rPage)
+{
+ //remove any requests pending for this page which is going away now
+ RemoveRequest(&rPage);
+}
+
+#if OSL_DEBUG_LEVEL >=2
+bool
+#else
+void
+#endif
+RequestQueue::RemoveRequest(
+ CacheKey aKey)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+#if OSL_DEBUG_LEVEL >=2
+ bool bIsRemoved = false;
+#endif
+ while(true)
+ {
+ Container::const_iterator aRequestIterator = ::std::find_if (
+ mpRequestQueue->begin(),
+ mpRequestQueue->end(),
+ Request::DataComparator(aKey));
+ if (aRequestIterator != mpRequestQueue->end())
+ {
+ if (aRequestIterator->mnPriorityInClass == mnMinimumPriority+1)
+ mnMinimumPriority++;
+ else if (aRequestIterator->mnPriorityInClass == mnMaximumPriority-1)
+ mnMaximumPriority--;
+
+ SdrPage *pPage = const_cast<SdrPage*>(aRequestIterator->maKey);
+ pPage->RemovePageUser(*this);
+ mpRequestQueue->erase(aRequestIterator);
+#if OSL_DEBUG_LEVEL >=2
+ bIsRemoved = true;
+#endif
+ }
+ else
+ break;
+ }
+#if OSL_DEBUG_LEVEL >=2
+ return bIsRemoved;
+#endif
+
+}
+
+void RequestQueue::ChangeClass (
+ CacheKey aKey,
+ RequestPriorityClass eNewRequestClass)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ assert(eNewRequestClass>=MIN_CLASS && eNewRequestClass<=MAX_CLASS);
+
+ Container::const_iterator iRequest (
+ ::std::find_if (
+ mpRequestQueue->begin(),
+ mpRequestQueue->end(),
+ Request::DataComparator(aKey)));
+ if (iRequest!=mpRequestQueue->end() && iRequest->meClass!=eNewRequestClass)
+ {
+ AddRequest(aKey, eNewRequestClass);
+ }
+}
+
+CacheKey RequestQueue::GetFront()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ if (mpRequestQueue->empty())
+ throw css::uno::RuntimeException("RequestQueue::GetFront(): queue is empty",
+ nullptr);
+
+ return mpRequestQueue->begin()->maKey;
+}
+
+RequestPriorityClass RequestQueue::GetFrontPriorityClass()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ if (mpRequestQueue->empty())
+ throw css::uno::RuntimeException("RequestQueue::GetFrontPriorityClass(): queue is empty",
+ nullptr);
+
+ return mpRequestQueue->begin()->meClass;
+}
+
+void RequestQueue::PopFront()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ if ( mpRequestQueue->empty())
+ return;
+
+ Container::const_iterator aIter(mpRequestQueue->begin());
+ SdrPage *pPage = const_cast<SdrPage*>(aIter->maKey);
+ pPage->RemovePageUser(*this);
+ mpRequestQueue->erase(aIter);
+
+ // Reset the priority counter if possible.
+ if (mpRequestQueue->empty())
+ {
+ mnMinimumPriority = 0;
+ mnMaximumPriority = 1;
+ }
+}
+
+bool RequestQueue::IsEmpty()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+ return mpRequestQueue->empty();
+}
+
+void RequestQueue::Clear()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ for (const auto& rItem : *mpRequestQueue)
+ {
+ SdrPage *pPage = const_cast<SdrPage*>(rItem.maKey);
+ pPage->RemovePageUser(*this);
+ }
+
+ mpRequestQueue->clear();
+ mnMinimumPriority = 0;
+ mnMaximumPriority = 1;
+}
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx b/sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx
new file mode 100644
index 000000000..618ba5801
--- /dev/null
+++ b/sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx
@@ -0,0 +1,122 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include "SlsRequestPriorityClass.hxx"
+#include <cache/SlsCacheContext.hxx>
+#include <osl/mutex.hxx>
+#include <svx/sdrpageuser.hxx>
+
+#include <memory>
+
+namespace sd::slidesorter::cache
+{
+/** The request queue stores requests that are described by the Request
+ sorted according to priority class and then priority.
+*/
+class RequestQueue : public sdr::PageUser
+{
+public:
+ explicit RequestQueue(const SharedCacheContext& rpCacheContext);
+ virtual ~RequestQueue();
+
+ /** Insert a request with highest or lowest priority in its priority
+ class. When the request is already present then it is first
+ removed. This effect is then a re-prioritization.
+ @param aKey
+ The request.
+ @param eRequestClass
+ The priority class in which to insert the request with highest
+ or lowest priority.
+ @param bInsertWithHighestPriority
+ When this flag is <TRUE/> the request is inserted with highest
+ priority in its class. When <FALSE/> the request is inserted
+ with lowest priority.
+ */
+ void AddRequest(CacheKey aKey, RequestPriorityClass eRequestClass);
+
+ /** Remove the specified request from the queue.
+ @param aKey
+ It is OK when the specified request is not a member of the
+ queue.
+ */
+#if OSL_DEBUG_LEVEL >= 2
+ bool
+#else
+ void
+#endif
+ RemoveRequest(CacheKey aKey);
+
+ /** Change the priority class of the specified request.
+ */
+ void ChangeClass(CacheKey aKey, RequestPriorityClass eNewRequestClass);
+
+ /** Get the request with the highest priority int the highest priority class.
+ */
+ CacheKey GetFront();
+
+ // For debugging.
+ RequestPriorityClass GetFrontPriorityClass();
+
+ /** Really a synonym for RemoveRequest(GetFront());
+ */
+ void PopFront();
+
+ /** Returns <TRUE/> when there is no element in the queue.
+ */
+ bool IsEmpty();
+
+ /** Remove all requests from the queue. This resets the minimum and
+ maximum priorities to their default values.
+ */
+ void Clear();
+
+ /** Return the mutex that guards the access to the priority queue.
+ */
+ ::osl::Mutex& GetMutex() { return maMutex; }
+
+ /** Ensure we don't hand out a page deleted before anyone got a
+ chance to process it
+ */
+ virtual void PageInDestruction(const SdrPage& rPage) override;
+
+private:
+ ::osl::Mutex maMutex;
+ class Container;
+ std::unique_ptr<Container> mpRequestQueue;
+ SharedCacheContext mpCacheContext;
+
+ /** A lower bound of the lowest priority of all elements in the queues.
+ The start value is 0. It is assigned and then decreased every time
+ when an element is inserted or marked as the request with lowest
+ priority.
+ */
+ int mnMinimumPriority;
+ /** An upper bound of the highest priority of all elements in the queues.
+ The start value is 1. It is assigned and then increased every time
+ when an element is inserted or marked as the request with highest
+ priority.
+ */
+ int mnMaximumPriority;
+};
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlideSorterController.cxx b/sd/source/ui/slidesorter/controller/SlideSorterController.cxx
new file mode 100644
index 000000000..5c851f183
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlideSorterController.cxx
@@ -0,0 +1,910 @@
+/* -*- 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 <controller/SlideSorterController.hxx>
+
+#include <SlideSorter.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsSelectionFunction.hxx>
+#include <controller/SlsProperties.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include "SlsListener.hxx"
+#include <controller/SlsFocusManager.hxx>
+#include <controller/SlsAnimator.hxx>
+#include <controller/SlsClipboard.hxx>
+#include <controller/SlsInsertionIndicatorHandler.hxx>
+#include <controller/SlsScrollBarManager.hxx>
+#include <controller/SlsSelectionManager.hxx>
+#include <controller/SlsSlotManager.hxx>
+#include <controller/SlsVisibleAreaManager.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsLayouter.hxx>
+#include <view/SlsPageObjectLayouter.hxx>
+#include <view/SlsTheme.hxx>
+#include <view/SlsToolTip.hxx>
+#include <cache/SlsPageCache.hxx>
+#include <cache/SlsPageCacheManager.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <drawdoc.hxx>
+#include <ViewShellBase.hxx>
+#include <Window.hxx>
+#include <FrameView.hxx>
+#include <sdpage.hxx>
+
+#include <app.hrc>
+#include <sdmod.hxx>
+#include <ViewShellHint.hxx>
+#include <AccessibleSlideSorterView.hxx>
+#include <AccessibleSlideSorterObject.hxx>
+
+#include <vcl/window.hxx>
+#include <svx/svxids.hrc>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/dispatch.hxx>
+#include <tools/debug.hxx>
+#include <vcl/commandevent.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/settings.hxx>
+
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+
+#include <memory>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::sd::slidesorter::model;
+using namespace ::sd::slidesorter::view;
+using namespace ::sd::slidesorter::controller;
+using namespace ::basegfx;
+
+namespace sd::slidesorter::controller {
+
+SlideSorterController::SlideSorterController (SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter),
+ mrModel(mrSlideSorter.GetModel()),
+ mrView(mrSlideSorter.GetView()),
+ mpInsertionIndicatorHandler(std::make_shared<InsertionIndicatorHandler>(rSlideSorter)),
+ mpAnimator(std::make_shared<Animator>(rSlideSorter)),
+ mpVisibleAreaManager(new VisibleAreaManager(rSlideSorter)),
+ mnModelChangeLockCount(0),
+ mbIsForcedRearrangePending(false),
+ mbContextMenuOpen(false),
+ mbPostModelChangePending(false),
+ mnCurrentPageBeforeSwitch(0),
+ mpEditModeChangeMasterPage(nullptr),
+ mnPaintEntranceCount(0)
+{
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ OSL_ASSERT(pWindow);
+ if (!pWindow)
+ return;
+
+ // The whole background is painted by the view and controls.
+ vcl::Window* pParentWindow = pWindow->GetParent();
+ OSL_ASSERT(pParentWindow!=nullptr);
+ pParentWindow->SetBackground (Wallpaper());
+
+ // Connect the view with the window that has been created by our base
+ // class.
+ pWindow->SetBackground(Wallpaper());
+ pWindow->SetCenterAllowed(false);
+ pWindow->SetMapMode(MapMode(MapUnit::MapPixel));
+ pWindow->SetViewSize(mrView.GetModelArea().GetSize());
+}
+
+void SlideSorterController::Init()
+{
+ mpCurrentSlideManager = std::make_shared<CurrentSlideManager>(mrSlideSorter);
+ mpPageSelector.reset(new PageSelector(mrSlideSorter));
+ mpFocusManager.reset(new FocusManager(mrSlideSorter));
+ mpSlotManager = std::make_shared<SlotManager>(mrSlideSorter);
+ mpScrollBarManager.reset(new ScrollBarManager(mrSlideSorter));
+ mpSelectionManager = std::make_shared<SelectionManager>(mrSlideSorter);
+ mpClipboard.reset(new Clipboard(mrSlideSorter));
+
+ // Create the selection function.
+ SfxRequest aRequest (
+ SID_OBJECT_SELECT,
+ SfxCallMode::SLOT,
+ mrModel.GetDocument()->GetItemPool());
+ mrSlideSorter.SetCurrentFunction(CreateSelectionFunction(aRequest));
+
+ mpListener = new Listener(mrSlideSorter);
+
+ mpPageSelector->GetCoreSelection();
+ GetSelectionManager()->SelectionHasChanged();
+}
+
+SlideSorterController::~SlideSorterController()
+{
+ try
+ {
+ uno::Reference<lang::XComponent> xComponent = mpListener;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ catch( uno::Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideSorterController::~SlideSorterController()" );
+ }
+
+ // dispose should have been called by now so that nothing is to be done
+ // to shut down cleanly.
+}
+
+void SlideSorterController::Dispose()
+{
+ mpInsertionIndicatorHandler->End(Animator::AM_Immediate);
+ mpClipboard.reset();
+ mpSelectionManager.reset();
+ mpAnimator->Dispose();
+}
+
+model::SharedPageDescriptor SlideSorterController::GetPageAt (
+ const Point& aWindowPosition)
+{
+ sal_Int32 nHitPageIndex (mrView.GetPageIndexAtPoint(aWindowPosition));
+ model::SharedPageDescriptor pDescriptorAtPoint;
+ if (nHitPageIndex >= 0)
+ {
+ pDescriptorAtPoint = mrModel.GetPageDescriptor(nHitPageIndex);
+
+ // Depending on a property we may have to check that the mouse is no
+ // just over the page object but over the preview area.
+ if (pDescriptorAtPoint
+ && ! pDescriptorAtPoint->HasState(PageDescriptor::ST_Selected))
+ {
+ // Make sure that the mouse is over the preview area.
+ if ( ! mrView.GetLayouter().GetPageObjectLayouter()->GetBoundingBox(
+ pDescriptorAtPoint,
+ view::PageObjectLayouter::Part::Preview,
+ view::PageObjectLayouter::WindowCoordinateSystem).Contains(aWindowPosition))
+ {
+ pDescriptorAtPoint.reset();
+ }
+ }
+ }
+
+ return pDescriptorAtPoint;
+}
+
+PageSelector& SlideSorterController::GetPageSelector()
+{
+ OSL_ASSERT(mpPageSelector != nullptr);
+ return *mpPageSelector;
+}
+
+FocusManager& SlideSorterController::GetFocusManager()
+{
+ OSL_ASSERT(mpFocusManager != nullptr);
+ return *mpFocusManager;
+}
+
+Clipboard& SlideSorterController::GetClipboard()
+{
+ OSL_ASSERT(mpClipboard != nullptr);
+ return *mpClipboard;
+}
+
+ScrollBarManager& SlideSorterController::GetScrollBarManager()
+{
+ OSL_ASSERT(mpScrollBarManager != nullptr);
+ return *mpScrollBarManager;
+}
+
+std::shared_ptr<CurrentSlideManager> const & SlideSorterController::GetCurrentSlideManager() const
+{
+ OSL_ASSERT(mpCurrentSlideManager != nullptr);
+ return mpCurrentSlideManager;
+}
+
+std::shared_ptr<SlotManager> const & SlideSorterController::GetSlotManager() const
+{
+ OSL_ASSERT(mpSlotManager != nullptr);
+ return mpSlotManager;
+}
+
+std::shared_ptr<SelectionManager> const & SlideSorterController::GetSelectionManager() const
+{
+ OSL_ASSERT(mpSelectionManager != nullptr);
+ return mpSelectionManager;
+}
+
+std::shared_ptr<InsertionIndicatorHandler> const &
+ SlideSorterController::GetInsertionIndicatorHandler() const
+{
+ OSL_ASSERT(mpInsertionIndicatorHandler != nullptr);
+ return mpInsertionIndicatorHandler;
+}
+
+void SlideSorterController::Paint (
+ const ::tools::Rectangle& rBBox,
+ vcl::Window* pWindow)
+{
+ if (mnPaintEntranceCount != 0)
+ return;
+
+ ++mnPaintEntranceCount;
+
+ try
+ {
+ mrView.CompleteRedraw(pWindow->GetOutDev(), vcl::Region(rBBox));
+ }
+ catch (const Exception&)
+ {
+ // Ignore all exceptions.
+ }
+
+ --mnPaintEntranceCount;
+}
+
+void SlideSorterController::FuTemporary (SfxRequest& rRequest)
+{
+ mpSlotManager->FuTemporary (rRequest);
+}
+
+void SlideSorterController::FuPermanent (SfxRequest &rRequest)
+{
+ mpSlotManager->FuPermanent (rRequest);
+}
+
+void SlideSorterController::FuSupport (SfxRequest &rRequest)
+{
+ mpSlotManager->FuSupport (rRequest);
+}
+
+bool SlideSorterController::Command (
+ const CommandEvent& rEvent,
+ ::sd::Window* pWindow)
+{
+ bool bEventHasBeenHandled = false;
+
+ if (pWindow == nullptr)
+ return false;
+
+ ViewShell* pViewShell = mrSlideSorter.GetViewShell();
+ if (pViewShell == nullptr)
+ return false;
+
+ switch (rEvent.GetCommand())
+ {
+ case CommandEventId::ContextMenu:
+ {
+ SdPage* pPage = nullptr;
+ OUString aPopupId;
+
+ model::PageEnumeration aSelectedPages (
+ PageEnumerationProvider::CreateSelectedPagesEnumeration(mrModel));
+ if (aSelectedPages.HasMoreElements())
+ pPage = aSelectedPages.GetNextElement()->GetPage();
+
+ if (mrModel.GetEditMode() == EditMode::Page)
+ {
+ if (pPage != nullptr)
+ aPopupId = "pagepane";
+ else
+ aPopupId = "pagepanenosel";
+ }
+ else if (pPage != nullptr)
+ aPopupId = "pagepanemaster";
+ else
+ aPopupId = "pagepanenoselmaster";
+
+ std::unique_ptr<InsertionIndicatorHandler::ForceShowContext, o3tl::default_delete<InsertionIndicatorHandler::ForceShowContext>> xContext;
+ if (pPage == nullptr)
+ {
+ // When there is no selection, then we show the insertion
+ // indicator so that the user knows where a page insertion
+ // would take place.
+ mpInsertionIndicatorHandler->Start(false);
+ mpInsertionIndicatorHandler->UpdateIndicatorIcon(SD_MOD()->pTransferClip);
+ mpInsertionIndicatorHandler->UpdatePosition(
+ pWindow->PixelToLogic(rEvent.GetMousePosPixel()),
+ InsertionIndicatorHandler::MoveMode);
+ xContext.reset(new InsertionIndicatorHandler::ForceShowContext(
+ mpInsertionIndicatorHandler));
+ }
+
+ pWindow->ReleaseMouse();
+
+ Point aMenuLocation (0,0);
+ if (!rEvent.IsMouseEvent())
+ {
+ // The event is not a mouse event. Use the center of the
+ // focused page as top left position of the context menu.
+ model::SharedPageDescriptor pDescriptor (
+ GetFocusManager().GetFocusedPageDescriptor());
+ if (pDescriptor)
+ {
+ ::tools::Rectangle aBBox (
+ mrView.GetLayouter().GetPageObjectLayouter()->GetBoundingBox (
+ pDescriptor,
+ PageObjectLayouter::Part::PageObject,
+ PageObjectLayouter::ModelCoordinateSystem));
+ aMenuLocation = aBBox.Center();
+ }
+ }
+
+ if (SfxDispatcher* pDispatcher = pViewShell->GetDispatcher())
+ {
+ mbContextMenuOpen = true;
+ if (!rEvent.IsMouseEvent())
+ pDispatcher->ExecutePopup(aPopupId, pWindow, &aMenuLocation);
+ else
+ pDispatcher->ExecutePopup(aPopupId, pWindow);
+ mbContextMenuOpen = false;
+ mrSlideSorter.GetView().UpdatePageUnderMouse();
+ ::rtl::Reference<SelectionFunction> pFunction(GetCurrentSelectionFunction());
+ if (pFunction.is())
+ pFunction->ResetMouseAnchor();
+ }
+ if (pPage == nullptr)
+ {
+ // Remember the position of the insertion indicator before
+ // it is hidden, so that a pending slide insertion slot call
+ // finds the right place to insert a new slide.
+ GetSelectionManager()->SetInsertionPosition(
+ GetInsertionIndicatorHandler()->GetInsertionPageIndex());
+ }
+ xContext.reset();
+ bEventHasBeenHandled = true;
+ }
+ break;
+
+ case CommandEventId::Wheel:
+ {
+ const CommandWheelData* pData = rEvent.GetWheelData();
+ if (pData == nullptr)
+ return false;
+ if (pData->IsMod1())
+ {
+ // We do not support zooming with control+mouse wheel.
+ return false;
+ }
+ // Determine whether to scroll horizontally or vertically. This
+ // depends on the orientation of the scroll bar and the
+ // IsHoriz() flag of the event.
+ if ((mrSlideSorter.GetView().GetOrientation()==view::Layouter::HORIZONTAL)
+ == pData->IsHorz())
+ {
+ GetScrollBarManager().Scroll(
+ ScrollBarManager::Orientation_Vertical,
+ -pData->GetNotchDelta());
+ }
+ else
+ {
+ GetScrollBarManager().Scroll(
+ ScrollBarManager::Orientation_Horizontal,
+ -pData->GetNotchDelta());
+ }
+ mrSlideSorter.GetView().UpdatePageUnderMouse(rEvent.GetMousePosPixel());
+
+ bEventHasBeenHandled = true;
+ }
+ break;
+
+ default: break;
+ }
+
+ return bEventHasBeenHandled;
+}
+
+void SlideSorterController::LockModelChange()
+{
+ mnModelChangeLockCount += 1;
+}
+
+void SlideSorterController::UnlockModelChange()
+{
+ mnModelChangeLockCount -= 1;
+ if (mnModelChangeLockCount==0 && mbPostModelChangePending)
+ {
+ PostModelChange();
+ }
+}
+
+void SlideSorterController::PreModelChange()
+{
+ // Prevent PreModelChange to execute more than once per model lock.
+ if (mbPostModelChangePending)
+ return;
+
+ if (mrSlideSorter.GetViewShell() != nullptr)
+ mrSlideSorter.GetViewShell()->Broadcast(
+ ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_START));
+
+ GetCurrentSlideManager()->PrepareModelChange();
+
+ if (mrSlideSorter.GetContentWindow())
+ mrView.PreModelChange();
+
+ mbPostModelChangePending = true;
+}
+
+void SlideSorterController::PostModelChange()
+{
+ mbPostModelChangePending = false;
+ mrModel.Resync();
+
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if (pWindow)
+ {
+ GetCurrentSlideManager()->HandleModelChange();
+
+ mrView.PostModelChange ();
+
+ pWindow->SetViewOrigin (Point (0,0));
+ pWindow->SetViewSize (mrView.GetModelArea().GetSize());
+
+ // The visibility of the scroll bars may have to be changed. Then
+ // the size of the view has to change, too. Let Rearrange() handle
+ // that.
+ Rearrange(mbIsForcedRearrangePending);
+ }
+
+ if (mrSlideSorter.GetViewShell() != nullptr)
+ mrSlideSorter.GetViewShell()->Broadcast(
+ ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_END));
+}
+
+void SlideSorterController::HandleModelChange()
+{
+ // Ignore this call when the document is not in a valid state, i.e. has
+ // not the same number of regular and notes pages.
+ bool bIsDocumentValid = (mrModel.GetDocument()->GetPageCount() % 2 == 1);
+
+ if (bIsDocumentValid)
+ {
+ ModelChangeLock aLock (*this);
+ PreModelChange();
+ }
+}
+
+IMPL_LINK(SlideSorterController, ApplicationEventHandler, VclSimpleEvent&, rEvent, void)
+{
+ auto windowEvent = dynamic_cast<VclWindowEvent *>(&rEvent);
+ if (windowEvent != nullptr) {
+ WindowEventHandler(*windowEvent);
+ }
+}
+IMPL_LINK(SlideSorterController, WindowEventHandler, VclWindowEvent&, rEvent, void)
+{
+ vcl::Window* pWindow = rEvent.GetWindow();
+ sd::Window *pActiveWindow (mrSlideSorter.GetContentWindow().get());
+ switch (rEvent.GetId())
+ {
+ case VclEventId::WindowActivate:
+ case VclEventId::WindowShow:
+ if (pActiveWindow && pWindow == pActiveWindow->GetParent())
+ mrView.RequestRepaint();
+ break;
+
+ case VclEventId::WindowHide:
+ if (pActiveWindow && pWindow == pActiveWindow->GetParent())
+ mrView.SetPageUnderMouse(SharedPageDescriptor());
+ break;
+
+ case VclEventId::WindowGetFocus:
+ if (pActiveWindow)
+ if (pWindow == pActiveWindow)
+ GetFocusManager().ShowFocus(false);
+ break;
+
+ case VclEventId::WindowLoseFocus:
+ if (pActiveWindow && pWindow == pActiveWindow)
+ {
+ GetFocusManager().HideFocus();
+ mrView.GetToolTip().Hide();
+
+ //don't scroll back to the selected slide when we lose
+ //focus due to a temporary active context menu
+ if (!mbContextMenuOpen)
+ {
+ // Select the current slide so that it is properly
+ // visualized when the focus is moved to the edit view.
+ GetPageSelector().SelectPage(GetCurrentSlideManager()->GetCurrentSlide());
+ }
+ }
+ break;
+
+ case VclEventId::ApplicationDataChanged:
+ {
+ // Invalidate the preview cache.
+ cache::PageCacheManager::Instance()->InvalidateAllCaches();
+
+ // Update the draw mode.
+ DrawModeFlags nDrawMode (Application::GetSettings().GetStyleSettings().GetHighContrastMode()
+ ? sd::OUTPUT_DRAWMODE_CONTRAST
+ : sd::OUTPUT_DRAWMODE_COLOR);
+ if (mrSlideSorter.GetViewShell() != nullptr)
+ mrSlideSorter.GetViewShell()->GetFrameView()->SetDrawMode(nDrawMode);
+ if (pActiveWindow != nullptr)
+ pActiveWindow->GetOutDev()->SetDrawMode(nDrawMode);
+ mrView.HandleDrawModeChange();
+
+ // When the system font has changed a layout has to be done.
+ mrView.Resize();
+
+ // Update theme colors.
+ mrSlideSorter.GetProperties()->HandleDataChangeEvent();
+ mrSlideSorter.GetTheme()->Update(mrSlideSorter.GetProperties());
+ mrView.HandleDataChangeEvent();
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void SlideSorterController::GetCtrlState (SfxItemSet& rSet)
+{
+ if (rSet.GetItemState(SID_RELOAD) != SfxItemState::UNKNOWN)
+ {
+ // let SFx en-/disable "last version"
+ SfxViewFrame* pSlideViewFrame = SfxViewFrame::Current();
+ DBG_ASSERT(pSlideViewFrame!=nullptr,
+ "SlideSorterController::GetCtrlState: ViewFrame not found");
+ if (pSlideViewFrame)
+ {
+ pSlideViewFrame->GetSlotState (SID_RELOAD, nullptr, &rSet);
+ }
+ else // MI says: no MDIFrame --> disable
+ {
+ rSet.DisableItem(SID_RELOAD);
+ }
+ }
+
+ // Output quality.
+ if (rSet.GetItemState(SID_OUTPUT_QUALITY_COLOR)==SfxItemState::DEFAULT
+ ||rSet.GetItemState(SID_OUTPUT_QUALITY_GRAYSCALE)==SfxItemState::DEFAULT
+ ||rSet.GetItemState(SID_OUTPUT_QUALITY_BLACKWHITE)==SfxItemState::DEFAULT
+ ||rSet.GetItemState(SID_OUTPUT_QUALITY_CONTRAST)==SfxItemState::DEFAULT)
+ {
+ if (mrSlideSorter.GetContentWindow())
+ {
+ DrawModeFlags nMode = mrSlideSorter.GetContentWindow()->GetOutDev()->GetDrawMode();
+ sal_uInt16 nQuality = 0;
+
+ if (nMode == sd::OUTPUT_DRAWMODE_COLOR) {
+ nQuality = 0;
+ } else if (nMode == sd::OUTPUT_DRAWMODE_GRAYSCALE) {
+ nQuality = 1;
+ } else if (nMode == sd::OUTPUT_DRAWMODE_BLACKWHITE) {
+ nQuality = 2;
+ } else if (nMode == sd::OUTPUT_DRAWMODE_CONTRAST) {
+ nQuality = 3;
+ }
+
+ rSet.Put (SfxBoolItem (SID_OUTPUT_QUALITY_COLOR, nQuality==0));
+ rSet.Put (SfxBoolItem (SID_OUTPUT_QUALITY_GRAYSCALE, nQuality==1));
+ rSet.Put (SfxBoolItem (SID_OUTPUT_QUALITY_BLACKWHITE, nQuality==2));
+ rSet.Put (SfxBoolItem (SID_OUTPUT_QUALITY_CONTRAST, nQuality==3));
+ }
+ }
+
+ if (rSet.GetItemState(SID_MAIL_SCROLLBODY_PAGEDOWN) == SfxItemState::DEFAULT)
+ {
+ rSet.Put (SfxBoolItem( SID_MAIL_SCROLLBODY_PAGEDOWN, true));
+ }
+}
+
+void SlideSorterController::GetStatusBarState (SfxItemSet& rSet)
+{
+ mpSlotManager->GetStatusBarState (rSet);
+}
+
+void SlideSorterController::ExecCtrl (SfxRequest& rRequest)
+{
+ mpSlotManager->ExecCtrl (rRequest);
+}
+
+void SlideSorterController::GetAttrState (SfxItemSet& rSet)
+{
+ mpSlotManager->GetAttrState (rSet);
+}
+
+void SlideSorterController::UpdateAllPages()
+{
+ // Do a redraw.
+ mrSlideSorter.GetContentWindow()->Invalidate();
+}
+
+void SlideSorterController::Resize (const ::tools::Rectangle& rAvailableSpace)
+{
+ if (maTotalWindowArea != rAvailableSpace)
+ {
+ maTotalWindowArea = rAvailableSpace;
+ Rearrange(true);
+ }
+}
+
+void SlideSorterController::Rearrange (bool bForce)
+{
+ if (maTotalWindowArea.IsEmpty())
+ return;
+
+ if (mnModelChangeLockCount>0)
+ {
+ mbIsForcedRearrangePending |= bForce;
+ return;
+ }
+ else
+ mbIsForcedRearrangePending = false;
+
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if (!pWindow)
+ return;
+
+ if (bForce)
+ mrView.UpdateOrientation();
+
+ // Place the scroll bars.
+ ::tools::Rectangle aNewContentArea = GetScrollBarManager().PlaceScrollBars(
+ maTotalWindowArea,
+ mrView.GetOrientation() != view::Layouter::VERTICAL,
+ mrView.GetOrientation() != view::Layouter::HORIZONTAL);
+
+ bool bSizeHasChanged (false);
+ // Only when bForce is not true we have to test for a size change in
+ // order to determine whether the window and the view have to be resized.
+ if ( ! bForce)
+ {
+ ::tools::Rectangle aCurrentContentArea (pWindow->GetPosPixel(), pWindow->GetOutputSizePixel());
+ bSizeHasChanged = (aNewContentArea != aCurrentContentArea);
+ }
+ if (bForce || bSizeHasChanged)
+ {
+ // The browser window gets the remaining space.
+ pWindow->SetPosSizePixel (aNewContentArea.TopLeft(), aNewContentArea.GetSize());
+ mrView.Resize();
+ }
+
+ // Adapt the scroll bars to the new zoom factor of the browser
+ // window and the arrangement of the page objects.
+ GetScrollBarManager().UpdateScrollBars(!bForce);
+
+ // Keep the current slide in the visible area.
+ GetVisibleAreaManager().RequestCurrentSlideVisible();
+
+ mrView.RequestRepaint();
+}
+
+rtl::Reference<FuPoor> SlideSorterController::CreateSelectionFunction (SfxRequest& rRequest)
+{
+ rtl::Reference<FuPoor> xFunc( SelectionFunction::Create(mrSlideSorter, rRequest) );
+ return xFunc;
+}
+
+::rtl::Reference<SelectionFunction> SlideSorterController::GetCurrentSelectionFunction() const
+{
+ rtl::Reference<FuPoor> pFunction (mrSlideSorter.GetViewShell()->GetCurrentFunction());
+ return ::rtl::Reference<SelectionFunction>(dynamic_cast<SelectionFunction*>(pFunction.get()));
+}
+
+void SlideSorterController::PrepareEditModeChange()
+{
+ // Before we throw away the page descriptors we prepare for selecting
+ // descriptors in the other mode and for restoring the current
+ // selection when switching back to the current mode.
+ if (mrModel.GetEditMode() != EditMode::Page)
+ return;
+
+ maSelectionBeforeSwitch.clear();
+
+ // Search for the first selected page and determine the master page
+ // used by its page object. It will be selected after the switch.
+ // In the same loop the current selection is stored.
+ PageEnumeration aSelectedPages (
+ PageEnumerationProvider::CreateSelectedPagesEnumeration(mrModel));
+ while (aSelectedPages.HasMoreElements())
+ {
+ SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement());
+ SdPage* pPage = pDescriptor->GetPage();
+ // Remember the master page of the first selected descriptor.
+ if (pPage!=nullptr && mpEditModeChangeMasterPage==nullptr)
+ mpEditModeChangeMasterPage = &static_cast<SdPage&>(
+ pPage->TRG_GetMasterPage());
+
+ maSelectionBeforeSwitch.push_back(pPage);
+ }
+
+ // Remember the current page.
+ if (mrSlideSorter.GetViewShell() != nullptr)
+ mnCurrentPageBeforeSwitch = (mrSlideSorter.GetViewShell()->GetViewShellBase()
+ .GetMainViewShell()->GetActualPage()->GetPageNum()-1)/2;
+}
+
+void SlideSorterController::ChangeEditMode (EditMode eEditMode)
+{
+ if (mrModel.GetEditMode() != eEditMode)
+ {
+ ModelChangeLock aLock (*this);
+ PreModelChange();
+ // Do the actual edit mode switching.
+ bool bResult = mrModel.SetEditMode(eEditMode);
+ if (bResult)
+ HandleModelChange();
+ }
+}
+
+void SlideSorterController::FinishEditModeChange()
+{
+ if (mrModel.GetEditMode() == EditMode::MasterPage)
+ {
+ mpPageSelector->DeselectAllPages();
+
+ // Search for the master page that was determined in
+ // PrepareEditModeChange() and make it the current page.
+ PageEnumeration aAllPages (PageEnumerationProvider::CreateAllPagesEnumeration(mrModel));
+ while (aAllPages.HasMoreElements())
+ {
+ SharedPageDescriptor pDescriptor (aAllPages.GetNextElement());
+ if (pDescriptor->GetPage() == mpEditModeChangeMasterPage)
+ {
+ GetCurrentSlideManager()->SwitchCurrentSlide(pDescriptor);
+ mpPageSelector->SelectPage(pDescriptor);
+ break;
+ }
+ }
+ }
+ else
+ {
+ PageSelector::BroadcastLock aBroadcastLock (*mpPageSelector);
+
+ SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(mnCurrentPageBeforeSwitch));
+ GetCurrentSlideManager()->SwitchCurrentSlide(pDescriptor);
+
+ // Restore the selection.
+ mpPageSelector->DeselectAllPages();
+ for (const auto& rpPage : maSelectionBeforeSwitch)
+ {
+ mpPageSelector->SelectPage(rpPage);
+ }
+ maSelectionBeforeSwitch.clear( );
+ }
+ mpEditModeChangeMasterPage = nullptr;
+}
+
+void SlideSorterController::PageNameHasChanged (int nPageIndex, const OUString& rsOldName)
+{
+ // Request a repaint for the page object whose name has changed.
+ model::SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex));
+ if (pDescriptor)
+ mrView.RequestRepaint(pDescriptor);
+
+ // Get a pointer to the corresponding accessible object and notify
+ // that of the name change.
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if ( ! pWindow)
+ return;
+
+ css::uno::Reference< css::accessibility::XAccessible >
+ xAccessible (pWindow->GetAccessible(false));
+ if ( ! xAccessible.is())
+ return;
+
+ // Now comes a small hack. We assume that the accessible object is
+ // an instantiation of AccessibleSlideSorterView and cast it to that
+ // class. The cleaner alternative to this cast would be a new member
+ // in which we would store the last AccessibleSlideSorterView object
+ // created by SlideSorterViewShell::CreateAccessibleDocumentView().
+ // But then there is no guaranty that the accessible object obtained
+ // from the window really is that instance last created by
+ // CreateAccessibleDocumentView().
+ // However, the dynamic cast together with the check of the result
+ // being NULL should be safe enough.
+ ::accessibility::AccessibleSlideSorterView* pAccessibleView
+ = dynamic_cast< ::accessibility::AccessibleSlideSorterView*>(xAccessible.get());
+ if (pAccessibleView == nullptr)
+ return;
+
+ ::accessibility::AccessibleSlideSorterObject* pChild
+ = pAccessibleView->GetAccessibleChildImplementation(nPageIndex);
+ if (pChild == nullptr || pChild->GetPage() == nullptr)
+ return;
+
+ OUString sNewName (pChild->GetPage()->GetName());
+ pChild->FireAccessibleEvent(
+ css::accessibility::AccessibleEventId::NAME_CHANGED,
+ Any(rsOldName),
+ Any(sNewName));
+}
+
+void SlideSorterController::SetDocumentSlides (const Reference<container::XIndexAccess>& rxSlides)
+{
+ if (mrModel.GetDocumentSlides() != rxSlides)
+ {
+ ModelChangeLock aLock (*this);
+ PreModelChange();
+
+ mrModel.SetDocumentSlides(rxSlides);
+ }
+}
+
+VisibleAreaManager& SlideSorterController::GetVisibleAreaManager() const
+{
+ OSL_ASSERT(mpVisibleAreaManager);
+ return *mpVisibleAreaManager;
+}
+
+void SlideSorterController::CheckForMasterPageAssignment()
+{
+ if (mrModel.GetPageCount()%2==0)
+ return;
+ PageEnumeration aAllPages (PageEnumerationProvider::CreateAllPagesEnumeration(mrModel));
+ while (aAllPages.HasMoreElements())
+ {
+ SharedPageDescriptor pDescriptor (aAllPages.GetNextElement());
+ if (pDescriptor->UpdateMasterPage())
+ {
+ mrView.GetPreviewCache()->InvalidatePreviewBitmap (
+ pDescriptor->GetPage());
+ }
+ }
+}
+
+void SlideSorterController::CheckForSlideTransitionAssignment()
+{
+ if (mrModel.GetPageCount()%2==0)
+ return;
+ PageEnumeration aAllPages (PageEnumerationProvider::CreateAllPagesEnumeration(mrModel));
+ while (aAllPages.HasMoreElements())
+ {
+ SharedPageDescriptor pDescriptor (aAllPages.GetNextElement());
+ if (pDescriptor->UpdateTransitionFlag())
+ {
+ mrView.GetPreviewCache()->InvalidatePreviewBitmap (
+ pDescriptor->GetPage());
+ }
+ }
+}
+
+//===== SlideSorterController::ModelChangeLock ================================
+
+SlideSorterController::ModelChangeLock::ModelChangeLock (
+ SlideSorterController& rController)
+ : mpController(&rController)
+{
+ mpController->LockModelChange();
+}
+
+SlideSorterController::ModelChangeLock::~ModelChangeLock() COVERITY_NOEXCEPT_FALSE
+{
+ Release();
+}
+
+void SlideSorterController::ModelChangeLock::Release()
+{
+ if (mpController != nullptr)
+ {
+ mpController->UnlockModelChange();
+ mpController = nullptr;
+ }
+}
+
+} // end of namespace ::sd::slidesorter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsAnimationFunction.cxx b/sd/source/ui/slidesorter/controller/SlsAnimationFunction.cxx
new file mode 100644
index 000000000..31978baf7
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsAnimationFunction.cxx
@@ -0,0 +1,129 @@
+/* -*- 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 <o3tl/safeint.hxx>
+
+#include <controller/SlsAnimationFunction.hxx>
+
+namespace sd::slidesorter::controller {
+
+//===== AnimationBezierFunction ===============================================
+
+AnimationBezierFunction::AnimationBezierFunction (
+ const double nX1,
+ const double nY1)
+ : mnX1(nX1),
+ mnY1(nY1),
+ mnX2(1-nY1),
+ mnY2(1-nX1)
+{
+}
+
+::basegfx::B2DPoint AnimationBezierFunction::operator() (const double nT)
+{
+ return ::basegfx::B2DPoint(
+ EvaluateComponent(nT, mnX1, mnX2),
+ EvaluateComponent(nT, mnY1, mnY2));
+}
+
+double AnimationBezierFunction::EvaluateComponent (
+ const double nT,
+ const double nV1,
+ const double nV2)
+{
+ const double nS (1-nT);
+
+ // While the control point values 1 and 2 are explicitly given the start
+ // and end values are implicitly given.
+ const double nV0 (0);
+ const double nV3 (1);
+
+ const double nV01 (nS*nV0 + nT*nV1);
+ const double nV12 (nS*nV1 + nT*nV2);
+ const double nV23 (nS*nV2 + nT*nV3);
+
+ const double nV012 (nS*nV01 + nT*nV12);
+ const double nV123 (nS*nV12 + nT*nV23);
+
+ const double nV0123 (nS*nV012 + nT*nV123);
+
+ return nV0123;
+}
+
+//===== AnimationParametricFunction ===========================================
+
+AnimationParametricFunction::AnimationParametricFunction (const ParametricFunction& rFunction)
+{
+ const sal_Int32 nSampleCount (64);
+
+ // Sample the given parametric function.
+ ::std::vector<basegfx::B2DPoint> aPoints;
+ aPoints.reserve(nSampleCount);
+ for (sal_Int32 nIndex=0; nIndex<nSampleCount; ++nIndex)
+ {
+ const double nT (nIndex/double(nSampleCount-1));
+ aPoints.emplace_back(rFunction(nT));
+ }
+
+ // Interpolate at evenly spaced points.
+ maY.clear();
+ maY.reserve(nSampleCount);
+ double nX0 (aPoints[0].getX());
+ double nY0 (aPoints[0].getY());
+ double nX1 (aPoints[1].getX());
+ double nY1 (aPoints[1].getY());
+ sal_Int32 nIndex (1);
+ for (sal_Int32 nIndex2=0; nIndex2<nSampleCount; ++nIndex2)
+ {
+ const double nX (nIndex2 / double(nSampleCount-1));
+ while (nX > nX1 && nIndex<nSampleCount)
+ {
+ nX0 = nX1;
+ nY0 = nY1;
+ nX1 = aPoints[nIndex].getX();
+ nY1 = aPoints[nIndex].getY();
+ ++nIndex;
+ }
+ const double nU ((nX-nX1) / (nX0 - nX1));
+ const double nY (nY0*nU + nY1*(1-nU));
+ maY.push_back(nY);
+ }
+}
+
+double AnimationParametricFunction::operator() (const double nX)
+{
+ const sal_Int32 nIndex0 (static_cast<sal_Int32>(nX * maY.size()));
+ const double nX0 (nIndex0 / double(maY.size()-1));
+ const sal_uInt32 nIndex1 (nIndex0 + 1);
+ const double nX1 (nIndex1 / double(maY.size()-1));
+
+ if (nIndex0<=0)
+ return maY[0];
+ else if (o3tl::make_unsigned(nIndex0)>=maY.size() || nIndex1>=maY.size())
+ return maY[maY.size()-1];
+
+ const double nU ((nX-nX1) / (nX0 - nX1));
+ return maY[nIndex0]*nU + maY[nIndex1]*(1-nU);
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsAnimator.cxx b/sd/source/ui/slidesorter/controller/SlsAnimator.cxx
new file mode 100644
index 000000000..b400ec4dc
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsAnimator.cxx
@@ -0,0 +1,280 @@
+/* -*- 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 <controller/SlsAnimator.hxx>
+#include <view/SlideSorterView.hxx>
+#include <osl/diagnose.h>
+
+namespace sd::slidesorter::controller {
+
+/** Handle one animation function by using a timer for frequent calls to
+ the animations operator().
+*/
+class Animator::Animation
+{
+public:
+ Animation (
+ const Animator::AnimationFunctor& rAnimation,
+ const double nStartOffset,
+ const double nDuration,
+ const double nGlobalTime,
+ const Animator::AnimationId nAnimationId,
+ const Animator::FinishFunctor& rFinishFunctor);
+ /** Run next animation step. If animation has reached its end it is
+ expired.
+ */
+ bool Run (const double nGlobalTime);
+
+ /** Typically called when an animation has finished, but also from
+ Animator::Disposed(). The finish functor is called and the
+ animation is marked as expired to prevent another run.
+ */
+ void Expire();
+ bool IsExpired() const { return mbIsExpired;}
+
+ Animator::AnimationFunctor maAnimation;
+ Animator::FinishFunctor maFinishFunctor;
+ const Animator::AnimationId mnAnimationId;
+ const double mnDuration;
+ const double mnEnd;
+ const double mnGlobalTimeAtStart;
+ bool mbIsExpired;
+};
+
+Animator::Animator (SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter),
+ maIdle("sd slidesorter controller Animator"),
+ mbIsDisposed(false),
+ mnNextAnimationId(0)
+{
+ maIdle.SetPriority(TaskPriority::REPAINT);
+ maIdle.SetInvokeHandler(LINK(this,Animator,TimeoutHandler));
+}
+
+Animator::~Animator()
+{
+ if ( ! mbIsDisposed)
+ {
+ OSL_ASSERT(mbIsDisposed);
+ Dispose();
+ }
+}
+
+void Animator::Dispose()
+{
+ mbIsDisposed = true;
+
+ AnimationList aCopy (maAnimations);
+ for (const auto& rxAnimation : aCopy)
+ rxAnimation->Expire();
+
+ maIdle.Stop();
+ if (mpDrawLock)
+ {
+ mpDrawLock->Dispose();
+ mpDrawLock.reset();
+ }
+}
+
+Animator::AnimationId Animator::AddAnimation (
+ const AnimationFunctor& rAnimation,
+ const FinishFunctor& rFinishFunctor)
+{
+ // When the animator is already disposed then ignore this call
+ // silently (well, we show an assertion, but do not throw an exception.)
+ OSL_ASSERT( ! mbIsDisposed);
+ if (mbIsDisposed)
+ return -1;
+
+ std::shared_ptr<Animation> pAnimation =
+ std::make_shared<Animation>(
+ rAnimation,
+ 0,
+ 300 / 1000.0,
+ maElapsedTime.getElapsedTime(),
+ ++mnNextAnimationId,
+ rFinishFunctor);
+ maAnimations.push_back(pAnimation);
+
+ RequestNextFrame();
+
+ return pAnimation->mnAnimationId;
+}
+
+void Animator::RemoveAnimation (const Animator::AnimationId nId)
+{
+ OSL_ASSERT( ! mbIsDisposed);
+
+ const AnimationList::iterator iAnimation (::std::find_if(
+ maAnimations.begin(),
+ maAnimations.end(),
+ [nId] (std::shared_ptr<Animation> const& pAnim)
+ { return nId == pAnim->mnAnimationId; }));
+ if (iAnimation != maAnimations.end())
+ {
+ OSL_ASSERT((*iAnimation)->mnAnimationId == nId);
+ (*iAnimation)->Expire();
+ maAnimations.erase(iAnimation);
+ }
+
+ if (maAnimations.empty())
+ {
+ // Reset the animation id when we can.
+ mnNextAnimationId = 0;
+
+ // No more animations => we do not have to suppress painting
+ // anymore.
+ mpDrawLock.reset();
+ }
+}
+
+void Animator::RemoveAllAnimations()
+{
+ for (auto const& it : maAnimations)
+ {
+ it->Expire();
+ }
+ maAnimations.clear();
+ mnNextAnimationId = 0;
+
+ // No more animations => we do not have to suppress painting
+ // anymore.
+ mpDrawLock.reset();
+}
+
+bool Animator::ProcessAnimations (const double nTime)
+{
+ bool bExpired (false);
+
+ OSL_ASSERT( ! mbIsDisposed);
+ if (mbIsDisposed)
+ return bExpired;
+
+ AnimationList aCopy (maAnimations);
+ for (const auto& rxAnimation : aCopy)
+ {
+ bExpired |= rxAnimation->Run(nTime);
+ }
+
+ return bExpired;
+}
+
+void Animator::CleanUpAnimationList()
+{
+ OSL_ASSERT( ! mbIsDisposed);
+ if (mbIsDisposed)
+ return;
+
+ AnimationList aActiveAnimations;
+
+ for (const auto& rxAnimation : maAnimations)
+ {
+ if ( ! rxAnimation->IsExpired())
+ aActiveAnimations.push_back(rxAnimation);
+ }
+
+ maAnimations.swap(aActiveAnimations);
+}
+
+void Animator::RequestNextFrame ()
+{
+ if ( ! maIdle.IsActive())
+ {
+ // Prevent redraws except for the ones in TimeoutHandler. While the
+ // Animator is active it will schedule repaints regularly. Repaints
+ // in between would only lead to visual artifacts.
+ mpDrawLock.reset(new view::SlideSorterView::DrawLock(mrSlideSorter));
+ maIdle.Start();
+ }
+}
+
+IMPL_LINK_NOARG(Animator, TimeoutHandler, Timer *, void)
+{
+ if (mbIsDisposed)
+ return;
+
+ if (ProcessAnimations(maElapsedTime.getElapsedTime()))
+ CleanUpAnimationList();
+
+ // Unlock the draw lock. This should lead to a repaint.
+ mpDrawLock.reset();
+
+ if (!maAnimations.empty())
+ RequestNextFrame();
+}
+
+//===== Animator::Animation ===================================================
+
+Animator::Animation::Animation (
+ const Animator::AnimationFunctor& rAnimation,
+ const double nStartOffset,
+ const double nDuration,
+ const double nGlobalTime,
+ const Animator::AnimationId nId,
+ const Animator::FinishFunctor& rFinishFunctor)
+ : maAnimation(rAnimation),
+ maFinishFunctor(rFinishFunctor),
+ mnAnimationId(nId),
+ mnDuration(nDuration),
+ mnEnd(nGlobalTime + nDuration + nStartOffset),
+ mnGlobalTimeAtStart(nGlobalTime + nStartOffset),
+ mbIsExpired(false)
+{
+ Run(nGlobalTime);
+}
+
+bool Animator::Animation::Run (const double nGlobalTime)
+{
+ if ( ! mbIsExpired)
+ {
+ if (mnDuration > 0)
+ {
+ if (nGlobalTime >= mnEnd)
+ {
+ maAnimation(1.0);
+ Expire();
+ }
+ else if (nGlobalTime >= mnGlobalTimeAtStart)
+ {
+ maAnimation((nGlobalTime - mnGlobalTimeAtStart) / mnDuration);
+ }
+ }
+ else if (mnDuration < 0)
+ {
+ // Animations without end have to be expired by their owner.
+ maAnimation(nGlobalTime);
+ }
+ }
+
+ return mbIsExpired;
+}
+
+void Animator::Animation::Expire()
+{
+ if ( ! mbIsExpired)
+ {
+ mbIsExpired = true;
+ if (maFinishFunctor)
+ maFinishFunctor();
+ }
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsClipboard.cxx b/sd/source/ui/slidesorter/controller/SlsClipboard.cxx
new file mode 100644
index 000000000..160077e64
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsClipboard.cxx
@@ -0,0 +1,918 @@
+/* -*- 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 <cassert>
+
+#include <controller/SlsClipboard.hxx>
+
+#include <SlideSorterViewShell.hxx>
+#include <SlideSorter.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <view/SlideSorterView.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsInsertionIndicatorHandler.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsSelectionFunction.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <controller/SlsFocusManager.hxx>
+#include <controller/SlsSelectionManager.hxx>
+#include <controller/SlsTransferableData.hxx>
+#include <controller/SlsSelectionObserver.hxx>
+#include <controller/SlsVisibleAreaManager.hxx>
+#include <cache/SlsPageCache.hxx>
+
+#include <ViewShellBase.hxx>
+#include <DrawViewShell.hxx>
+#include <Window.hxx>
+#include <fupoor.hxx>
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <sdxfer.hxx>
+#include <sdmod.hxx>
+#include <ins_paste.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <sdpage.hxx>
+#include <sdtreelb.hxx>
+
+#include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/docfile.hxx>
+#include <svx/svxids.hrc>
+#include <tools/urlobj.hxx>
+#include <rtl/ustring.hxx>
+#include <vcl/svapp.hxx>
+
+namespace sd::slidesorter::controller {
+
+namespace {
+/** Temporarily deactivate slide tracking of the VisibleAreaManager.
+ This is used as a workaround to avoid unwanted repositioning of
+ the visible area when the selection of slides is copied to the
+ clipboard (cloning of slides leads to model change notifications
+ for the original model.)
+*/
+class TemporarySlideTrackingDeactivator
+{
+public:
+ explicit TemporarySlideTrackingDeactivator (SlideSorterController& rController)
+ : mrController(rController),
+ mbIsCurrentSlideTrackingActive (
+ mrController.GetVisibleAreaManager().IsCurrentSlideTrackingActive())
+ {
+ if (mbIsCurrentSlideTrackingActive)
+ mrController.GetVisibleAreaManager().DeactivateCurrentSlideTracking();
+ }
+ ~TemporarySlideTrackingDeactivator()
+ {
+ if (mbIsCurrentSlideTrackingActive)
+ mrController.GetVisibleAreaManager().ActivateCurrentSlideTracking();
+ }
+
+private:
+ SlideSorterController& mrController;
+ const bool mbIsCurrentSlideTrackingActive;
+};
+} // end of anonymous namespace
+
+class Clipboard::UndoContext
+{
+public:
+ UndoContext (
+ SdDrawDocument* pDocument,
+ const std::shared_ptr<ViewShell>& rpMainViewShell)
+ : mpDocument(pDocument),
+ mpMainViewShell(rpMainViewShell)
+ {
+ if (mpDocument!=nullptr && mpDocument->IsUndoEnabled())
+ {
+ if (mpMainViewShell && mpMainViewShell->GetShellType() == ViewShell::ST_DRAW)
+ mpDocument->BegUndo(SdResId(STRING_DRAG_AND_DROP_PAGES));
+ else
+ mpDocument->BegUndo(SdResId(STRING_DRAG_AND_DROP_SLIDES));
+ }
+ }
+
+ ~UndoContext()
+ {
+ if (mpDocument!=nullptr && mpDocument->IsUndoEnabled())
+ mpDocument->EndUndo();
+ if (mpMainViewShell && mpMainViewShell->GetViewFrame()!=nullptr)
+ {
+ SfxBindings& rBindings = mpMainViewShell->GetViewFrame()->GetBindings();
+ rBindings.Invalidate(SID_UNDO);
+ rBindings.Invalidate(SID_REDO);
+ }
+ }
+private:
+ SdDrawDocument* mpDocument;
+ std::shared_ptr<ViewShell> mpMainViewShell;
+};
+
+Clipboard::Clipboard (SlideSorter& rSlideSorter)
+ : ViewClipboard(rSlideSorter.GetView()),
+ mrSlideSorter(rSlideSorter),
+ mrController(mrSlideSorter.GetController()),
+ mnDragFinishedUserEventId(nullptr)
+{
+}
+
+Clipboard::~Clipboard()
+{
+ if (mnDragFinishedUserEventId != nullptr)
+ Application::RemoveUserEvent(mnDragFinishedUserEventId);
+}
+
+/** With the current implementation the forwarded calls to the current
+ function will come back eventually to call the local Do(Cut|Copy|Paste)
+ methods. A shortcut is possible but would be an unclean hack.
+*/
+void Clipboard::HandleSlotCall (SfxRequest& rRequest)
+{
+ ViewShell* pViewShell = mrSlideSorter.GetViewShell();
+ rtl::Reference<FuPoor> xFunc;
+ if (pViewShell != nullptr)
+ xFunc = pViewShell->GetCurrentFunction();
+ switch (rRequest.GetSlot())
+ {
+ case SID_CUT:
+ if (mrSlideSorter.GetModel().GetEditMode() != EditMode::MasterPage)
+ {
+ if(xFunc.is())
+ xFunc->DoCut();
+ else
+ DoCut();
+ }
+ rRequest.Done();
+ break;
+
+ case SID_COPY:
+ if (mrSlideSorter.GetModel().GetEditMode() != EditMode::MasterPage)
+ {
+ if(xFunc.is())
+ xFunc->DoCopy();
+ else
+ DoCopy();
+ }
+ rRequest.Done();
+ break;
+
+ case SID_PASTE:
+ // Prevent redraws while inserting pages from the clipboard
+ // because the intermediate inconsistent state might lead to
+ // a crash.
+ if (mrSlideSorter.GetModel().GetEditMode() != EditMode::MasterPage)
+ {
+ view::SlideSorterView::DrawLock aLock (mrSlideSorter);
+ SelectionObserver::Context aContext (mrSlideSorter);
+ if(xFunc.is())
+ xFunc->DoPaste();
+ else
+ DoPaste();
+ }
+ rRequest.Done();
+ break;
+
+ case SID_DELETE:
+ DoDelete();
+ rRequest.Done();
+ break;
+ }
+}
+
+void Clipboard::DoCut ()
+{
+ if (mrSlideSorter.GetModel().GetPageCount() > 1)
+ {
+ DoCopy();
+ DoDelete();
+ }
+}
+
+void Clipboard::DoDelete()
+{
+ if (mrSlideSorter.GetModel().GetPageCount() > 1)
+ {
+ mrController.GetSelectionManager()->DeleteSelectedPages();
+ }
+}
+
+void Clipboard::DoCopy ()
+{
+ CreateSlideTransferable( nullptr, false );
+}
+
+void Clipboard::DoPaste ()
+{
+ SdTransferable* pClipTransferable = SD_MOD()->pTransferClip;
+
+ if (pClipTransferable==nullptr || !pClipTransferable->IsPageTransferable())
+ return;
+
+ sal_Int32 nInsertPosition = GetInsertionPosition();
+
+ if (nInsertPosition >= 0)
+ {
+ // Paste the pages from the clipboard.
+ sal_Int32 nInsertPageCount = PasteTransferable(nInsertPosition);
+ // Select the pasted pages and make the first of them the
+ // current page.
+ mrSlideSorter.GetContentWindow()->GrabFocus();
+ SelectPageRange(nInsertPosition, nInsertPageCount);
+ }
+}
+
+sal_Int32 Clipboard::GetInsertionPosition ()
+{
+ sal_Int32 nInsertPosition = -1;
+
+ // Determine the insertion position:
+ // a) When the insertion indicator is visible, then at that position.
+ // b) When the focus indicator is visible, then before or after the
+ // focused page, depending on user input to a dialog.
+ // c) When there is a selection but no focus, then after the
+ // selection.
+ // d) After the last page when there is no selection and no focus.
+
+ std::shared_ptr<controller::InsertionIndicatorHandler> pInsertionIndicatorHandler (
+ mrController.GetInsertionIndicatorHandler());
+ if (pInsertionIndicatorHandler->IsActive())
+ {
+ // Use the insertion index of an active insertion indicator.
+ nInsertPosition = pInsertionIndicatorHandler->GetInsertionPageIndex();
+ }
+ else if (mrController.GetSelectionManager()->GetInsertionPosition() >= 0)
+ {
+ // Use the insertion index of an insertion indicator that has been
+ // deactivated a short while ago.
+ nInsertPosition = mrController.GetSelectionManager()->GetInsertionPosition();
+ }
+ else if (mrController.GetFocusManager().IsFocusShowing())
+ {
+ // Use the focus to determine the insertion position.
+ vcl::Window* pWin = mrSlideSorter.GetContentWindow();
+ SdInsertPasteDlg aDialog(pWin ? pWin->GetFrameWeld() : nullptr);
+ if (aDialog.run() == RET_OK)
+ {
+ nInsertPosition = mrController.GetFocusManager().GetFocusedPageIndex();
+ if (!aDialog.IsInsertBefore())
+ nInsertPosition ++;
+ }
+ }
+
+ return nInsertPosition;
+}
+
+sal_Int32 Clipboard::PasteTransferable (sal_Int32 nInsertPosition)
+{
+ SdTransferable* pClipTransferable = SD_MOD()->pTransferClip;
+ model::SlideSorterModel& rModel (mrSlideSorter.GetModel());
+ bool bMergeMasterPages = !pClipTransferable->HasSourceDoc (rModel.GetDocument());
+ sal_uInt16 nInsertIndex (rModel.GetCoreIndex(nInsertPosition));
+ sal_Int32 nInsertPageCount (0);
+ if (pClipTransferable->HasPageBookmarks())
+ {
+ const std::vector<OUString> &rBookmarkList = pClipTransferable->GetPageBookmarks();
+ const SolarMutexGuard aGuard;
+
+ nInsertPageCount = static_cast<sal_uInt16>(rBookmarkList.size());
+ rModel.GetDocument()->InsertBookmarkAsPage(
+ rBookmarkList,
+ nullptr,
+ false,
+ false,
+ nInsertIndex,
+ false,
+ pClipTransferable->GetPageDocShell(),
+ true,
+ bMergeMasterPages,
+ false);
+ }
+ else
+ {
+ SfxObjectShell* pShell = pClipTransferable->GetDocShell().get();
+ DrawDocShell* pDataDocSh = static_cast<DrawDocShell*>(pShell);
+ SdDrawDocument* pDataDoc = pDataDocSh->GetDoc();
+
+ if (pDataDoc!=nullptr
+ && pDataDoc->GetSdPageCount(PageKind::Standard))
+ {
+ const SolarMutexGuard aGuard;
+
+ bMergeMasterPages = (pDataDoc != rModel.GetDocument());
+ nInsertPageCount = pDataDoc->GetSdPageCount( PageKind::Standard );
+ rModel.GetDocument()->InsertBookmarkAsPage(
+ std::vector<OUString>(),
+ nullptr,
+ false,
+ false,
+ nInsertIndex,
+ false,
+ pDataDocSh,
+ true,
+ bMergeMasterPages,
+ false);
+ }
+ }
+ mrController.HandleModelChange();
+ return nInsertPageCount;
+}
+
+void Clipboard::SelectPageRange (sal_Int32 nFirstIndex, sal_Int32 nPageCount)
+{
+ // Select the newly inserted pages. That are the nInsertPageCount pages
+ // after the nInsertIndex position.
+ PageSelector& rSelector (mrController.GetPageSelector());
+ rSelector.DeselectAllPages();
+ for (sal_Int32 i=0; i<nPageCount; i++)
+ {
+ model::SharedPageDescriptor pDescriptor (
+ mrSlideSorter.GetModel().GetPageDescriptor(nFirstIndex + i));
+ if (pDescriptor)
+ {
+ rSelector.SelectPage(pDescriptor);
+ // The first page of the new selection is made the current page.
+ if (i == 0)
+ {
+ mrController.GetCurrentSlideManager()->SwitchCurrentSlide(pDescriptor);
+ }
+ }
+ }
+}
+
+void Clipboard::CreateSlideTransferable (
+ vcl::Window* pWindow,
+ bool bDrag)
+{
+ std::vector<OUString> aBookmarkList;
+
+ // Insert all selected pages into a bookmark list and remember them in
+ // maPagesToRemove for possible later removal.
+ model::PageEnumeration aSelectedPages
+ (model::PageEnumerationProvider::CreateSelectedPagesEnumeration(
+ mrSlideSorter.GetModel()));
+ SdDrawDocument* const pDocument = mrSlideSorter.GetModel().GetDocument();
+ DrawDocShell* const pDataDocSh = pDocument->GetDocSh();
+
+ sal_Int32 nUniqueID = 0;
+ while (aSelectedPages.HasMoreElements())
+ {
+ model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement());
+
+ //ensure that the slides have unique names
+ const OUString sOrigName = pDescriptor->GetPage()->GetName();
+ if ( pDataDocSh && !pDataDocSh->IsPageNameUnique( sOrigName ) )
+ {
+ OUString sUniqueName;
+ bool bUnique = false;
+ while ( !bUnique )
+ {
+ sUniqueName = sOrigName + "_clipboard" + OUString::number(nUniqueID++);
+ bUnique = pDataDocSh->IsNewPageNameValid( sUniqueName );
+ if ( bUnique )
+ pDescriptor->GetPage()->SetName(sUniqueName);
+ }
+ }
+
+ aBookmarkList.push_back(pDescriptor->GetPage()->GetName());
+ maPagesToRemove.push_back (pDescriptor->GetPage());
+ }
+
+ // Create a small set of representatives of the selection for which
+ // previews are included into the transferable so that an insertion
+ // indicator can be rendered.
+ aSelectedPages.Rewind();
+ ::std::vector<TransferableData::Representative> aRepresentatives;
+ aRepresentatives.reserve(3);
+ std::shared_ptr<cache::PageCache> pPreviewCache (
+ mrSlideSorter.GetView().GetPreviewCache());
+ while (aSelectedPages.HasMoreElements())
+ {
+ model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement());
+ if ( ! pDescriptor || pDescriptor->GetPage()==nullptr)
+ continue;
+ BitmapEx aPreview (pPreviewCache->GetPreviewBitmap(pDescriptor->GetPage(), false));
+ aRepresentatives.emplace_back(
+ aPreview,
+ pDescriptor->HasState(model::PageDescriptor::ST_Excluded));
+ if (aRepresentatives.size() >= 3)
+ break;
+ }
+
+ if (aBookmarkList.empty())
+ return;
+
+ mrSlideSorter.GetView().BrkAction();
+ rtl::Reference<SdTransferable> pTransferable = TransferableData::CreateTransferable (
+ pDocument,
+ dynamic_cast<SlideSorterViewShell*>(mrSlideSorter.GetViewShell()),
+ std::move(aRepresentatives));
+
+ if (bDrag)
+ SD_MOD()->pTransferDrag = pTransferable.get();
+ else
+ SD_MOD()->pTransferClip = pTransferable.get();
+
+ pDocument->CreatingDataObj (pTransferable.get());
+ pTransferable->SetWorkDocument(pDocument->AllocSdDrawDocument());
+ std::unique_ptr<TransferableObjectDescriptor> pObjDesc(new TransferableObjectDescriptor);
+ pTransferable->GetWorkDocument()->GetDocSh()
+ ->FillTransferableObjectDescriptor (*pObjDesc);
+
+ if (pDataDocSh != nullptr)
+ pObjDesc->maDisplayName = pDataDocSh->GetMedium()->GetURLObject().GetURLNoPass();
+
+ vcl::Window* pActionWindow = pWindow;
+ if (pActionWindow == nullptr)
+ {
+ ViewShell* pViewShell = mrSlideSorter.GetViewShell();
+ if (pViewShell != nullptr)
+ pActionWindow = pViewShell->GetActiveWindow();
+ }
+
+ assert(pActionWindow);
+
+ pTransferable->SetStartPos (pActionWindow->PixelToLogic(
+ pActionWindow->GetPointerPosPixel()));
+ pTransferable->SetObjectDescriptor (std::move(pObjDesc));
+
+ {
+ TemporarySlideTrackingDeactivator aDeactivator (mrController);
+ pTransferable->SetPageBookmarks (std::move(aBookmarkList), !bDrag);
+ }
+
+ if (bDrag)
+ {
+ pTransferable->SetView (&mrSlideSorter.GetView());
+ pTransferable->StartDrag (pActionWindow, DND_ACTION_COPY | DND_ACTION_MOVE);
+ }
+ else
+ pTransferable->CopyToClipboard (pActionWindow);
+
+ pDocument->CreatingDataObj(nullptr);
+}
+
+std::shared_ptr<SdTransferable::UserData> Clipboard::CreateTransferableUserData (SdTransferable* pTransferable)
+{
+ do
+ {
+ SdPageObjsTLV::SdPageObjsTransferable* pTreeListBoxTransferable
+ = dynamic_cast<SdPageObjsTLV::SdPageObjsTransferable*>(pTransferable);
+ if (pTreeListBoxTransferable == nullptr)
+ break;
+
+ // Find view shell for the document of the transferable.
+ ::sd::ViewShell* pViewShell
+ = SdPageObjsTLV::GetViewShellForDocShell(pTreeListBoxTransferable->GetDocShell());
+ if (pViewShell == nullptr)
+ break;
+
+ // Find slide sorter for the document of the transferable.
+ SlideSorterViewShell* pSlideSorterViewShell
+ = SlideSorterViewShell::GetSlideSorter(pViewShell->GetViewShellBase());
+ if (pSlideSorterViewShell == nullptr)
+ break;
+ SlideSorter& rSlideSorter (pSlideSorterViewShell->GetSlideSorter());
+
+ // Get bookmark from transferable.
+ TransferableDataHelper aDataHelper (pTransferable);
+ INetBookmark aINetBookmark;
+ if ( ! aDataHelper.GetINetBookmark(SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark))
+ break;
+ const OUString sURL (aINetBookmark.GetURL());
+ const sal_Int32 nIndex (sURL.indexOf('#'));
+ if (nIndex == -1)
+ break;
+ OUString sBookmark (sURL.copy(nIndex+1));
+
+ // Make sure that the bookmark points to a page.
+ SdDrawDocument* pTransferableDocument = rSlideSorter.GetModel().GetDocument();
+ if (pTransferableDocument == nullptr)
+ break;
+ bool bIsMasterPage = false;
+ const sal_uInt16 nPageIndex (pTransferableDocument->GetPageByName(sBookmark, bIsMasterPage));
+ if (nPageIndex == SDRPAGE_NOTFOUND)
+ break;
+
+ // Create preview.
+ ::std::vector<TransferableData::Representative> aRepresentatives;
+ aRepresentatives.reserve(1);
+ std::shared_ptr<cache::PageCache> pPreviewCache (
+ rSlideSorter.GetView().GetPreviewCache());
+ model::SharedPageDescriptor pDescriptor (rSlideSorter.GetModel().GetPageDescriptor((nPageIndex-1)/2));
+ if ( ! pDescriptor || pDescriptor->GetPage()==nullptr)
+ break;
+ BitmapEx aPreview (pPreviewCache->GetPreviewBitmap(pDescriptor->GetPage(), false));
+ aRepresentatives.emplace_back(
+ aPreview,
+ pDescriptor->HasState(model::PageDescriptor::ST_Excluded));
+
+ // Remember the page in maPagesToRemove so that it can be removed
+ // when drag and drop action is "move".
+ Clipboard& rOtherClipboard (pSlideSorterViewShell->GetSlideSorter().GetController().GetClipboard());
+ rOtherClipboard.maPagesToRemove.clear();
+ rOtherClipboard.maPagesToRemove.push_back(pDescriptor->GetPage());
+
+ // Create the new transferable.
+ std::shared_ptr<SdTransferable::UserData> pNewTransferable =
+ std::make_shared<TransferableData>(
+ pSlideSorterViewShell,
+ std::move(aRepresentatives));
+ pTransferable->SetWorkDocument(pTreeListBoxTransferable->GetSourceDoc()->AllocSdDrawDocument());
+ // pTransferable->SetView(&mrSlideSorter.GetView());
+
+ // Set page bookmark list.
+ std::vector<OUString> aPageBookmarks { sBookmark };
+ pTransferable->SetPageBookmarks(std::move(aPageBookmarks), false);
+
+ // Replace the view referenced by the transferable with the
+ // corresponding slide sorter view.
+ pTransferable->SetView(&pSlideSorterViewShell->GetSlideSorter().GetView());
+
+ return pNewTransferable;
+ }
+ while (false);
+
+ return std::shared_ptr<SdTransferable::UserData>();
+}
+
+void Clipboard::StartDrag (
+ const Point& rPosition,
+ vcl::Window* pWindow)
+{
+ maPagesToRemove.clear();
+ CreateSlideTransferable(pWindow, true);
+
+ mrController.GetInsertionIndicatorHandler()->UpdatePosition(
+ rPosition,
+ InsertionIndicatorHandler::UnknownMode);
+}
+
+void Clipboard::DragFinished (sal_Int8 nDropAction)
+{
+ if (mnDragFinishedUserEventId == nullptr)
+ {
+ mnDragFinishedUserEventId = Application::PostUserEvent(
+ LINK(this, Clipboard, ProcessDragFinished),
+ reinterpret_cast<void*>(nDropAction));
+ }
+}
+
+IMPL_LINK(Clipboard, ProcessDragFinished, void*, pUserData, void)
+{
+ const sal_Int8 nDropAction (static_cast<sal_Int8>(reinterpret_cast<sal_IntPtr>(pUserData)));
+
+ mnDragFinishedUserEventId = nullptr;
+
+ // Hide the substitution display and insertion indicator.
+ ::rtl::Reference<SelectionFunction> pFunction (mrController.GetCurrentSelectionFunction());
+ if (pFunction.is())
+ pFunction->NotifyDragFinished();
+
+ PageSelector& rSelector (mrController.GetPageSelector());
+ if ((nDropAction & DND_ACTION_MOVE) != 0
+ && ! maPagesToRemove.empty())
+ {
+ // Remove the pages that have been moved to another place (possibly
+ // in the same document.)
+ rSelector.DeselectAllPages();
+ for (const auto& rpDraggedPage : maPagesToRemove)
+ {
+ rSelector.SelectPage(rpDraggedPage);
+ }
+ mrController.GetSelectionManager()->DeleteSelectedPages();
+ }
+ mxUndoContext.reset();
+ mxSelectionObserverContext.reset();
+}
+
+sal_Int8 Clipboard::AcceptDrop (
+ const AcceptDropEvent& rEvent,
+ DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer)
+{
+ sal_Int8 nAction (DND_ACTION_NONE);
+
+ const Clipboard::DropType eDropType (IsDropAccepted());
+
+ switch (eDropType)
+ {
+ case DT_PAGE:
+ case DT_PAGE_FROM_NAVIGATOR:
+ {
+ // Accept a drop.
+ nAction = rEvent.mnAction;
+
+ // Use the copy action when the drop action is the default, i.e. not
+ // explicitly set to move or link, and when the source and
+ // target models are not the same.
+ SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag;
+ if (pDragTransferable != nullptr
+ && pDragTransferable->IsPageTransferable()
+ && ((rEvent.maDragEvent.DropAction
+ & css::datatransfer::dnd::DNDConstants::ACTION_DEFAULT) != 0)
+ && (mrSlideSorter.GetModel().GetDocument()->GetDocSh()
+ != pDragTransferable->GetPageDocShell()))
+ {
+ nAction = DND_ACTION_COPY;
+ }
+ else if (IsInsertionTrivial(pDragTransferable, nAction))
+ {
+ nAction = DND_ACTION_NONE;
+ }
+
+ // Show the insertion marker and the substitution for a drop.
+ SelectionFunction* pSelectionFunction = dynamic_cast<SelectionFunction*>(
+ mrSlideSorter.GetViewShell()->GetCurrentFunction().get());
+ if (pSelectionFunction != nullptr)
+ pSelectionFunction->MouseDragged(rEvent, nAction);
+
+ // Scroll the window when the mouse reaches the window border.
+ // mrController.GetScrollBarManager().AutoScroll (rEvent.maPosPixel);
+ }
+ break;
+
+ case DT_SHAPE:
+ nAction = ExecuteOrAcceptShapeDrop(
+ DC_ACCEPT,
+ rEvent.maPosPixel,
+ &rEvent,
+ rTargetHelper,
+ pTargetWindow,
+ nPage,
+ nLayer);
+ break;
+
+ default:
+ case DT_NONE:
+ nAction = DND_ACTION_NONE;
+ break;
+ }
+
+ return nAction;
+}
+
+sal_Int8 Clipboard::ExecuteDrop (
+ const ExecuteDropEvent& rEvent,
+ DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer)
+{
+ sal_Int8 nResult = DND_ACTION_NONE;
+ mxUndoContext.reset();
+ const Clipboard::DropType eDropType (IsDropAccepted());
+
+ switch (eDropType)
+ {
+ case DT_PAGE:
+ case DT_PAGE_FROM_NAVIGATOR:
+ {
+ SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag;
+ const Point aEventModelPosition (
+ pTargetWindow->PixelToLogic (rEvent.maPosPixel));
+ const sal_Int32 nXOffset (std::abs (pDragTransferable->GetStartPos().X()
+ - aEventModelPosition.X()));
+ const sal_Int32 nYOffset (std::abs (pDragTransferable->GetStartPos().Y()
+ - aEventModelPosition.Y()));
+ bool bContinue =
+ ( pDragTransferable->GetView() != &mrSlideSorter.GetView() )
+ || ( nXOffset >= 2 && nYOffset >= 2 );
+
+ std::shared_ptr<InsertionIndicatorHandler> pInsertionIndicatorHandler(
+ mrController.GetInsertionIndicatorHandler());
+ // Get insertion position and then turn off the insertion indicator.
+ pInsertionIndicatorHandler->UpdatePosition(aEventModelPosition, rEvent.mnAction);
+ // sal_uInt16 nIndex = DetermineInsertPosition(*pDragTransferable);
+
+ // Do not process the insertion when it is trivial,
+ // i.e. would insert pages at their original place.
+ if (IsInsertionTrivial(pDragTransferable, rEvent.mnAction))
+ bContinue = false;
+
+ // Tell the insertion indicator handler to hide before the model
+ // is modified. Doing it later may result in page objects whose
+ // animation state is not properly reset because they are then
+ // in another run then before the model change.
+ pInsertionIndicatorHandler->End(Animator::AM_Immediate);
+
+ if (bContinue)
+ {
+ SlideSorterController::ModelChangeLock aModelChangeLock (mrController);
+
+ // Handle a general drop operation.
+ mxUndoContext.reset(new UndoContext (
+ mrSlideSorter.GetModel().GetDocument(),
+ mrSlideSorter.GetViewShell()->GetViewShellBase().GetMainViewShell()));
+ mxSelectionObserverContext.reset(new SelectionObserver::Context(mrSlideSorter));
+
+ if (rEvent.mnAction == DND_ACTION_MOVE)
+ {
+ SdDrawDocument* pDoc = mrSlideSorter.GetModel().GetDocument();
+ const bool bDoesMakePageObjectsNamesUnique = pDoc->DoesMakePageObjectsNamesUnique();
+ pDoc->DoMakePageObjectsNamesUnique(false);
+ HandlePageDrop(*pDragTransferable);
+ pDoc->DoMakePageObjectsNamesUnique(bDoesMakePageObjectsNamesUnique);
+ }
+ else
+ HandlePageDrop(*pDragTransferable);
+
+ nResult = rEvent.mnAction;
+
+ // We leave the undo context alive for when moving or
+ // copying inside one view then the actions in
+ // NotifyDragFinished should be covered as well as
+ // well as the ones above.
+ }
+
+ // When the pages originated in another slide sorter then
+ // only that is notified automatically about the drag
+ // operation being finished. Because the target slide sorter
+ // has be notified, too, add a callback for that.
+ std::shared_ptr<TransferableData> pSlideSorterTransferable (
+ TransferableData::GetFromTransferable(pDragTransferable));
+ assert(pSlideSorterTransferable);
+ if (pSlideSorterTransferable
+ && pSlideSorterTransferable->GetSourceViewShell() != mrSlideSorter.GetViewShell())
+ {
+ DragFinished(nResult);
+ }
+
+ // Notify the receiving selection function that drag-and-drop is
+ // finished and the substitution handler can be released.
+ ::rtl::Reference<SelectionFunction> pFunction (
+ mrController.GetCurrentSelectionFunction());
+ if (pFunction.is())
+ pFunction->NotifyDragFinished();
+ }
+ break;
+
+ case DT_SHAPE:
+ nResult = ExecuteOrAcceptShapeDrop(
+ DC_EXECUTE,
+ rEvent.maPosPixel,
+ &rEvent,
+ rTargetHelper,
+ pTargetWindow,
+ nPage,
+ nLayer);
+ break;
+
+ default:
+ case DT_NONE:
+ break;
+ }
+
+ return nResult;
+}
+
+bool Clipboard::IsInsertionTrivial (
+ SdTransferable const * pTransferable,
+ const sal_Int8 nDndAction) const
+{
+ std::shared_ptr<TransferableData> pSlideSorterTransferable (
+ TransferableData::GetFromTransferable(pTransferable));
+ if (pSlideSorterTransferable
+ && pSlideSorterTransferable->GetSourceViewShell() != mrSlideSorter.GetViewShell())
+ return false;
+ return mrController.GetInsertionIndicatorHandler()->IsInsertionTrivial(nDndAction);
+}
+
+void Clipboard::Abort()
+{
+ if (mxSelectionObserverContext)
+ {
+ mxSelectionObserverContext->Abort();
+ mxSelectionObserverContext.reset();
+ }
+}
+
+sal_uInt16 Clipboard::DetermineInsertPosition ()
+{
+ // Tell the model to move the dragged pages behind the one with the
+ // index nInsertionIndex which first has to be transformed into an index
+ // understandable by the document.
+ const sal_Int32 nInsertionIndex (
+ mrController.GetInsertionIndicatorHandler()->GetInsertionPageIndex());
+
+ // Convert to insertion index to that of an SdModel.
+ if (nInsertionIndex >= 0)
+ return mrSlideSorter.GetModel().GetCoreIndex(nInsertionIndex);
+ else
+ return 0;
+}
+
+Clipboard::DropType Clipboard::IsDropAccepted() const
+{
+ const SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag;
+ if (pDragTransferable == nullptr)
+ return DT_NONE;
+
+ if (pDragTransferable->IsPageTransferable())
+ {
+ if (mrSlideSorter.GetModel().GetEditMode() != EditMode::MasterPage)
+ return DT_PAGE;
+ else
+ return DT_NONE;
+ }
+
+ const SdPageObjsTLV::SdPageObjsTransferable* pPageObjsTransferable
+ = dynamic_cast<const SdPageObjsTLV::SdPageObjsTransferable*>(pDragTransferable);
+ if (pPageObjsTransferable != nullptr)
+ return DT_PAGE_FROM_NAVIGATOR;
+
+ return DT_SHAPE;
+}
+
+sal_Int8 Clipboard::ExecuteOrAcceptShapeDrop (
+ DropCommand eCommand,
+ const Point& rPosition,
+ const void* pDropEvent,
+ DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer)
+{
+ sal_Int8 nResult = 0;
+
+ // The dropping of a shape is accepted or executed only when there is
+ // DrawViewShell available to which we can forward this call. This has
+ // technical reasons: The actual code to accept or execute a shape drop
+ // is implemented in the ViewShell class and uses the page view of the
+ // main edit view. This is not possible without a DrawViewShell.
+ std::shared_ptr<DrawViewShell> pDrawViewShell;
+ if (mrSlideSorter.GetViewShell() != nullptr)
+ pDrawViewShell = std::dynamic_pointer_cast<DrawViewShell>(
+ mrSlideSorter.GetViewShell()->GetViewShellBase().GetMainViewShell());
+ if (pDrawViewShell != nullptr
+ && (pDrawViewShell->GetShellType() == ViewShell::ST_IMPRESS
+ || pDrawViewShell->GetShellType() == ViewShell::ST_DRAW))
+ {
+ // The drop is only accepted or executed when it takes place over a
+ // page object. Therefore we replace a missing page number by the
+ // number of the page under the mouse.
+ if (nPage == SDRPAGE_NOTFOUND)
+ {
+ model::SharedPageDescriptor pDescriptor (
+ mrSlideSorter.GetModel().GetPageDescriptor(
+ mrSlideSorter.GetView().GetPageIndexAtPoint(rPosition)));
+ if (pDescriptor)
+ nPage = pDescriptor->GetPageIndex();
+ }
+
+ // Now comes the code that is different for the Execute and Accept:
+ // We simply forward the call to the AcceptDrop() or ExecuteDrop()
+ // methods of the DrawViewShell in the center pane.
+ if (nPage != SDRPAGE_NOTFOUND)
+ switch (eCommand)
+ {
+ case DC_ACCEPT:
+ nResult = pDrawViewShell->AcceptDrop(
+ *static_cast<const AcceptDropEvent*>(pDropEvent),
+ rTargetHelper,
+ pTargetWindow,
+ nPage,
+ nLayer);
+ break;
+
+ case DC_EXECUTE:
+ nResult = pDrawViewShell->ExecuteDrop(
+ *static_cast<const ExecuteDropEvent*>(pDropEvent),
+ rTargetHelper,
+ pTargetWindow,
+ nPage,
+ nLayer);
+ break;
+ }
+ }
+
+ return nResult;
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx b/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx
new file mode 100644
index 000000000..9203c06e8
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx
@@ -0,0 +1,256 @@
+/* -*- 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 <SlideSorter.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <controller/SlsFocusManager.hxx>
+#include <view/SlideSorterView.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShell.hxx>
+#include <DrawViewShell.hxx>
+#include <sdpage.hxx>
+#include <FrameView.hxx>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <osl/diagnose.h>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+using namespace ::sd::slidesorter::model;
+
+namespace sd::slidesorter::controller {
+
+CurrentSlideManager::CurrentSlideManager (SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter),
+ mnCurrentSlideIndex(-1),
+ maSwitchPageDelayTimer("sd CurrentSlideManager maSwitchPageDelayTimer")
+{
+ maSwitchPageDelayTimer.SetTimeout(100);
+ maSwitchPageDelayTimer.SetInvokeHandler(LINK(this,CurrentSlideManager,SwitchPageCallback));
+}
+
+CurrentSlideManager::~CurrentSlideManager()
+{
+}
+
+void CurrentSlideManager::NotifyCurrentSlideChange (const SdPage* pPage)
+{
+ if (pPage != nullptr)
+ NotifyCurrentSlideChange(
+ mrSlideSorter.GetModel().GetIndex(
+ Reference<drawing::XDrawPage>(
+ const_cast<SdPage*>(pPage)->getUnoPage(),
+ UNO_QUERY)));
+ else
+ NotifyCurrentSlideChange(-1);
+}
+
+void CurrentSlideManager::NotifyCurrentSlideChange (const sal_Int32 nSlideIndex)
+{
+ if (mnCurrentSlideIndex == nSlideIndex)
+ return;
+
+ PageSelector::BroadcastLock aBroadcastLock (mrSlideSorter.GetController().GetPageSelector());
+
+ mrSlideSorter.GetController().GetPageSelector().DeselectAllPages();
+
+ ReleaseCurrentSlide();
+ AcquireCurrentSlide(nSlideIndex);
+
+ // Update the selection.
+ if (mpCurrentSlide)
+ {
+ mrSlideSorter.GetController().GetPageSelector().SelectPage(mpCurrentSlide);
+ mrSlideSorter.GetController().GetFocusManager().SetFocusedPage(mpCurrentSlide);
+ }
+}
+
+void CurrentSlideManager::ReleaseCurrentSlide()
+{
+ if (mpCurrentSlide)
+ mrSlideSorter.GetView().SetState(mpCurrentSlide, PageDescriptor::ST_Current, false);
+
+ mpCurrentSlide.reset();
+ mnCurrentSlideIndex = -1;
+}
+
+void CurrentSlideManager::AcquireCurrentSlide (const sal_Int32 nSlideIndex)
+{
+ mnCurrentSlideIndex = nSlideIndex;
+
+ // if current slide valid
+ if (mnCurrentSlideIndex >= 0 && mnCurrentSlideIndex<mrSlideSorter.GetModel().GetPageCount())
+ {
+ // Get a descriptor for the XDrawPage reference. Note that the
+ // given XDrawPage may or may not be member of the slide sorter
+ // document.
+ mpCurrentSlide = mrSlideSorter.GetModel().GetPageDescriptor(mnCurrentSlideIndex);
+ if (mpCurrentSlide)
+ mrSlideSorter.GetView().SetState(mpCurrentSlide, PageDescriptor::ST_Current, true);
+ }
+}
+
+void CurrentSlideManager::SwitchCurrentSlide (
+ const sal_Int32 nSlideIndex)
+{
+ SwitchCurrentSlide(mrSlideSorter.GetModel().GetPageDescriptor(nSlideIndex), true/*bUpdateSelection*/);
+}
+
+void CurrentSlideManager::SwitchCurrentSlide (
+ const SharedPageDescriptor& rpDescriptor,
+ const bool bUpdateSelection)
+{
+ if (!rpDescriptor || mpCurrentSlide==rpDescriptor)
+ return;
+
+ ReleaseCurrentSlide();
+ AcquireCurrentSlide((rpDescriptor->GetPage()->GetPageNum()-1)/2);
+
+ ViewShell* pViewShell = mrSlideSorter.GetViewShell();
+ if (pViewShell != nullptr && pViewShell->IsMainViewShell())
+ {
+ // The slide sorter is the main view.
+ FrameView* pFrameView = pViewShell->GetFrameView();
+ if (pFrameView != nullptr)
+ pFrameView->SetSelectedPage(sal::static_int_cast<sal_uInt16>(mnCurrentSlideIndex));
+ mrSlideSorter.GetController().GetPageSelector().SetCoreSelection();
+ }
+
+ // We do not tell the XController/ViewShellBase about the new
+ // slide right away. This is done asynchronously after a short
+ // delay to allow for more slide switches in the slide sorter.
+ // This goes under the assumption that slide switching inside
+ // the slide sorter is fast (no expensive redraw of the new page
+ // (unless the preview of the new slide is not yet preset)) and
+ // that slide switching in the edit view is slow (all shapes of
+ // the new slide have to be repainted.)
+ maSwitchPageDelayTimer.Start();
+
+ // We have to store the (index of the) new current slide at
+ // the tab control because there are other asynchronous
+ // notifications of the slide switching that otherwise
+ // overwrite the correct value.
+ SetCurrentSlideAtTabControl(mpCurrentSlide);
+
+ if (bUpdateSelection)
+ {
+ mrSlideSorter.GetController().GetPageSelector().DeselectAllPages();
+ mrSlideSorter.GetController().GetPageSelector().SelectPage(rpDescriptor);
+ }
+ mrSlideSorter.GetController().GetFocusManager().SetFocusedPage(rpDescriptor);
+}
+
+void CurrentSlideManager::SetCurrentSlideAtViewShellBase (const SharedPageDescriptor& rpDescriptor)
+{
+ OSL_ASSERT(rpDescriptor);
+
+ ViewShellBase* pBase = mrSlideSorter.GetViewShellBase();
+ if (pBase != nullptr)
+ {
+ DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>(
+ pBase->GetMainViewShell().get());
+ if (pDrawViewShell != nullptr)
+ {
+ sal_uInt16 nPageNumber = (rpDescriptor->GetPage()->GetPageNum()-1)/2;
+ pDrawViewShell->SwitchPage(nPageNumber);
+ TabControl& rPageTabControl = pDrawViewShell->GetPageTabControl();
+ rPageTabControl.SetCurPageId(rPageTabControl.GetPageId(nPageNumber));
+ }
+ }
+}
+
+void CurrentSlideManager::SetCurrentSlideAtTabControl (const SharedPageDescriptor& rpDescriptor)
+{
+ OSL_ASSERT(rpDescriptor);
+
+ ViewShellBase* pBase = mrSlideSorter.GetViewShellBase();
+ if (pBase != nullptr)
+ {
+ std::shared_ptr<DrawViewShell> pDrawViewShell (
+ std::dynamic_pointer_cast<DrawViewShell>(pBase->GetMainViewShell()));
+ if (pDrawViewShell)
+ {
+ sal_uInt16 nPageNumber = (rpDescriptor->GetPage()->GetPageNum()-1)/2;
+ TabControl& rPageTabControl = pDrawViewShell->GetPageTabControl();
+ rPageTabControl.SetCurPageId(rPageTabControl.GetPageId(nPageNumber));
+ }
+ }
+}
+
+void CurrentSlideManager::SetCurrentSlideAtXController (const SharedPageDescriptor& rpDescriptor)
+{
+ OSL_ASSERT(rpDescriptor);
+
+ try
+ {
+ Reference<beans::XPropertySet> xSet (mrSlideSorter.GetXController(), UNO_QUERY);
+ if (xSet.is())
+ {
+ Any aPage;
+ aPage <<= rpDescriptor->GetPage()->getUnoPage();
+ xSet->setPropertyValue( "CurrentPage", aPage );
+ }
+ }
+ catch (const Exception&)
+ {
+ // We have not been able to set the current page at the main view.
+ // This is sad but still leaves us in a valid state. Therefore,
+ // this exception is silently ignored.
+ }
+}
+
+void CurrentSlideManager::PrepareModelChange()
+{
+ mpCurrentSlide.reset();
+}
+
+void CurrentSlideManager::HandleModelChange()
+{
+ if (mnCurrentSlideIndex >= 0)
+ {
+ mpCurrentSlide = mrSlideSorter.GetModel().GetPageDescriptor(mnCurrentSlideIndex);
+ if (mpCurrentSlide)
+ mrSlideSorter.GetView().SetState(mpCurrentSlide, PageDescriptor::ST_Current, true);
+ }
+}
+
+IMPL_LINK_NOARG(CurrentSlideManager, SwitchPageCallback, Timer *, void)
+{
+ if (mpCurrentSlide)
+ {
+ // Set current page. At the moment we have to do this in two
+ // different ways. The UNO way is the preferable one but, alas,
+ // it does not work always correctly (after some kinds of model
+ // changes). Therefore, we call DrawViewShell::SwitchPage(),
+ // too.
+ ViewShell* pViewShell = mrSlideSorter.GetViewShell();
+ if (pViewShell==nullptr || ! pViewShell->IsMainViewShell())
+ SetCurrentSlideAtViewShellBase(mpCurrentSlide);
+ SetCurrentSlideAtXController(mpCurrentSlide);
+ }
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx
new file mode 100644
index 000000000..f447c5656
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx
@@ -0,0 +1,120 @@
+/* -*- 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 "SlsDragAndDropContext.hxx"
+
+#include <SlideSorter.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsInsertionIndicatorHandler.hxx>
+#include <controller/SlsScrollBarManager.hxx>
+#include <controller/SlsProperties.hxx>
+#include <controller/SlsClipboard.hxx>
+#include <controller/SlsTransferableData.hxx>
+#include <Window.hxx>
+#include <sdtreelb.hxx>
+#include <sdmod.hxx>
+
+namespace sd::slidesorter::controller {
+
+DragAndDropContext::DragAndDropContext (SlideSorter& rSlideSorter)
+ : mpTargetSlideSorter(&rSlideSorter),
+ mnInsertionIndex(-1)
+{
+ // No Drag-and-Drop for master pages.
+ if (rSlideSorter.GetModel().GetEditMode() != EditMode::Page)
+ return;
+
+ // For properly handling transferables created by the navigator we
+ // need additional information. For this a user data object is
+ // created that contains the necessary information.
+ SdTransferable* pTransferable = SD_MOD()->pTransferDrag;
+ SdPageObjsTLV::SdPageObjsTransferable* pTreeListBoxTransferable
+ = dynamic_cast<SdPageObjsTLV::SdPageObjsTransferable*>(pTransferable);
+ if (pTreeListBoxTransferable!=nullptr && !TransferableData::GetFromTransferable(pTransferable))
+ {
+ pTransferable->AddUserData(
+ sd::slidesorter::controller::Clipboard::CreateTransferableUserData(pTransferable));
+ }
+
+ rSlideSorter.GetController().GetInsertionIndicatorHandler()->UpdateIndicatorIcon(pTransferable);
+}
+
+DragAndDropContext::~DragAndDropContext() COVERITY_NOEXCEPT_FALSE
+{
+ SetTargetSlideSorter();
+}
+
+void DragAndDropContext::Dispose()
+{
+ mnInsertionIndex = -1;
+}
+
+void DragAndDropContext::UpdatePosition (
+ const Point& rMousePosition,
+ const InsertionIndicatorHandler::Mode eMode,
+ const bool bAllowAutoScroll)
+{
+ if (mpTargetSlideSorter == nullptr)
+ return;
+
+ if (mpTargetSlideSorter->GetProperties()->IsUIReadOnly())
+ return;
+
+ // Convert window coordinates into model coordinates (we need the
+ // window coordinates for auto-scrolling because that remains
+ // constant while scrolling.)
+ sd::Window *pWindow = mpTargetSlideSorter->GetContentWindow().get();
+ const Point aMouseModelPosition (pWindow->PixelToLogic(rMousePosition));
+ std::shared_ptr<InsertionIndicatorHandler> pInsertionIndicatorHandler (
+ mpTargetSlideSorter->GetController().GetInsertionIndicatorHandler());
+
+ bool bDoAutoScroll = bAllowAutoScroll
+ && mpTargetSlideSorter->GetController().GetScrollBarManager().AutoScroll(
+ rMousePosition,
+ [this, eMode, rMousePosition] () {
+ return this->UpdatePosition(rMousePosition, eMode, false);
+ });
+
+ if (!bDoAutoScroll)
+ {
+ pInsertionIndicatorHandler->UpdatePosition(aMouseModelPosition, eMode);
+
+ // Remember the new insertion index.
+ mnInsertionIndex = pInsertionIndicatorHandler->GetInsertionPageIndex();
+ if (pInsertionIndicatorHandler->IsInsertionTrivial(mnInsertionIndex, eMode))
+ mnInsertionIndex = -1;
+ }
+}
+
+void DragAndDropContext::SetTargetSlideSorter()
+{
+ if (mpTargetSlideSorter != nullptr)
+ {
+ mpTargetSlideSorter->GetController().GetScrollBarManager().StopAutoScroll();
+ mpTargetSlideSorter->GetController().GetInsertionIndicatorHandler()->End(
+ Animator::AM_Animated);
+ }
+
+ mpTargetSlideSorter = nullptr;
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.hxx b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.hxx
new file mode 100644
index 000000000..cbeb11f8b
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.hxx
@@ -0,0 +1,68 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <controller/SlsInsertionIndicatorHandler.hxx>
+
+class Point;
+
+namespace sd::slidesorter
+{
+class SlideSorter;
+}
+
+namespace sd::slidesorter::controller
+{
+/** A DragAndDropContext object handles an active drag and drop operation.
+ When the mouse is moved from one slide sorter window to another the
+ target SlideSorter object is exchanged accordingly.
+*/
+class DragAndDropContext
+{
+public:
+ /** Create a substitution display of the currently selected pages or,
+ when provided, the pages in the transferable.
+ */
+ explicit DragAndDropContext(SlideSorter& rSlideSorter);
+ ~DragAndDropContext() COVERITY_NOEXCEPT_FALSE;
+
+ /** Call this method (for example as reaction to ESC key press) to avoid
+ processing (ie moving or inserting) the substitution when the called
+ DragAndDropContext object is destroyed.
+ */
+ void Dispose();
+
+ /** Move the substitution display by the distance the mouse has
+ travelled since the last call to this method or to
+ CreateSubstitution(). The given point becomes the new anchor.
+ */
+ void UpdatePosition(const Point& rMousePosition, const InsertionIndicatorHandler::Mode eMode,
+ const bool bAllowAutoScroll);
+
+ void SetTargetSlideSorter();
+
+private:
+ SlideSorter* mpTargetSlideSorter;
+ sal_Int32 mnInsertionIndex;
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx b/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx
new file mode 100644
index 000000000..59027f5a8
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx
@@ -0,0 +1,245 @@
+/* -*- 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 <controller/SlsFocusManager.hxx>
+
+#include <SlideSorter.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <controller/SlsVisibleAreaManager.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsLayouter.hxx>
+#include <osl/diagnose.h>
+
+#include <Window.hxx>
+#include <sdpage.hxx>
+
+namespace sd::slidesorter::controller {
+
+FocusManager::FocusManager (SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter),
+ mnPageIndex(0),
+ mbPageIsFocused(false)
+{
+ if (mrSlideSorter.GetModel().GetPageCount() > 0)
+ mnPageIndex = 0;
+}
+
+FocusManager::~FocusManager()
+{
+}
+
+void FocusManager::MoveFocus (FocusMoveDirection eDirection)
+{
+ if (!(mnPageIndex >= 0 && mbPageIsFocused))
+ return;
+
+ HideFocusIndicator (GetFocusedPageDescriptor());
+
+ const sal_Int32 nColumnCount (mrSlideSorter.GetView().GetLayouter().GetColumnCount());
+ const sal_Int32 nPageCount (mrSlideSorter.GetModel().GetPageCount());
+ switch (eDirection)
+ {
+ case FocusMoveDirection::Left:
+ if (mnPageIndex > 0)
+ mnPageIndex -= 1;
+ break;
+
+ case FocusMoveDirection::Right:
+ if (mnPageIndex < nPageCount-1)
+ mnPageIndex += 1;
+ break;
+
+ case FocusMoveDirection::Up:
+ {
+ const sal_Int32 nCandidate (mnPageIndex - nColumnCount);
+ if (nCandidate >= 0)
+ {
+ // Move the focus the previous row.
+ mnPageIndex = nCandidate;
+ }
+ }
+ break;
+
+ case FocusMoveDirection::Down:
+ {
+ const sal_Int32 nCandidate (mnPageIndex + nColumnCount);
+ if (nCandidate < nPageCount)
+ {
+ // Move the focus to the next row.
+ mnPageIndex = nCandidate;
+ }
+ }
+ break;
+ }
+
+ if (mnPageIndex < 0)
+ {
+ OSL_ASSERT(mnPageIndex>=0);
+ mnPageIndex = 0;
+ }
+ else if (mnPageIndex >= nPageCount)
+ {
+ OSL_ASSERT(mnPageIndex<nPageCount);
+ mnPageIndex = nPageCount - 1;
+ }
+
+ if (mbPageIsFocused)
+ {
+ ShowFocusIndicator(GetFocusedPageDescriptor(), true);
+ }
+}
+
+void FocusManager::ShowFocus (const bool bScrollToFocus)
+{
+ mbPageIsFocused = true;
+ ShowFocusIndicator(GetFocusedPageDescriptor(), bScrollToFocus);
+}
+
+void FocusManager::HideFocus()
+{
+ mbPageIsFocused = false;
+ HideFocusIndicator(GetFocusedPageDescriptor());
+}
+
+bool FocusManager::ToggleFocus()
+{
+ if (mnPageIndex >= 0)
+ {
+ if (mbPageIsFocused)
+ HideFocus ();
+ else
+ ShowFocus ();
+ }
+ return mbPageIsFocused;
+}
+
+bool FocusManager::HasFocus() const
+{
+ return mrSlideSorter.GetContentWindow()->HasFocus();
+}
+
+model::SharedPageDescriptor FocusManager::GetFocusedPageDescriptor() const
+{
+ return mrSlideSorter.GetModel().GetPageDescriptor(mnPageIndex);
+}
+
+bool FocusManager::SetFocusedPage (const model::SharedPageDescriptor& rpDescriptor)
+{
+ if (rpDescriptor)
+ {
+ FocusHider aFocusHider (*this);
+ mnPageIndex = (rpDescriptor->GetPage()->GetPageNum()-1)/2;
+ return true;
+ }
+ return false;
+}
+
+void FocusManager::SetFocusedPage (sal_Int32 nPageIndex)
+{
+ FocusHider aFocusHider (*this);
+ mnPageIndex = nPageIndex;
+}
+
+bool FocusManager::SetFocusedPageToCurrentPage()
+{
+ return SetFocusedPage(mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide());
+}
+
+bool FocusManager::IsFocusShowing() const
+{
+ return HasFocus() && mbPageIsFocused;
+}
+
+void FocusManager::HideFocusIndicator (const model::SharedPageDescriptor& rpDescriptor)
+{
+ if (rpDescriptor)
+ {
+ mrSlideSorter.GetView().SetState(rpDescriptor, model::PageDescriptor::ST_Focused, false);
+
+ // Hide focus should also fire the focus event, Currently, only accessibility add the focus listener
+ NotifyFocusChangeListeners();
+ }
+}
+
+void FocusManager::ShowFocusIndicator (
+ const model::SharedPageDescriptor& rpDescriptor,
+ const bool bScrollToFocus)
+{
+ if (!rpDescriptor)
+ return;
+
+ mrSlideSorter.GetView().SetState(rpDescriptor, model::PageDescriptor::ST_Focused, true);
+
+ if (bScrollToFocus)
+ {
+ // Scroll the focused page object into the visible area and repaint
+ // it, so that the focus indicator becomes visible.
+ mrSlideSorter.GetController().GetVisibleAreaManager().RequestVisible(rpDescriptor,true);
+ }
+ mrSlideSorter.GetView().RequestRepaint(rpDescriptor);
+
+ NotifyFocusChangeListeners();
+}
+
+void FocusManager::AddFocusChangeListener (const Link<LinkParamNone*,void>& rListener)
+{
+ if (::std::find (maFocusChangeListeners.begin(), maFocusChangeListeners.end(), rListener)
+ == maFocusChangeListeners.end())
+ {
+ maFocusChangeListeners.push_back (rListener);
+ }
+}
+
+void FocusManager::RemoveFocusChangeListener (const Link<LinkParamNone*,void>& rListener)
+{
+ maFocusChangeListeners.erase (
+ ::std::find (maFocusChangeListeners.begin(), maFocusChangeListeners.end(), rListener));
+}
+
+void FocusManager::NotifyFocusChangeListeners() const
+{
+ // Create a copy of the listener list to be safe when that is modified.
+ ::std::vector<Link<LinkParamNone*,void>> aListeners (maFocusChangeListeners);
+
+ // Tell the selection change listeners that the selection has changed.
+ for (const auto& rListener : aListeners)
+ {
+ rListener.Call(nullptr);
+ }
+}
+
+FocusManager::FocusHider::FocusHider (FocusManager& rManager)
+: mbFocusVisible(rManager.IsFocusShowing())
+, mrManager(rManager)
+{
+ mrManager.HideFocus();
+}
+
+FocusManager::FocusHider::~FocusHider() COVERITY_NOEXCEPT_FALSE
+{
+ if (mbFocusVisible)
+ mrManager.ShowFocus();
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsInsertionIndicatorHandler.cxx b/sd/source/ui/slidesorter/controller/SlsInsertionIndicatorHandler.cxx
new file mode 100644
index 000000000..ff1a05ef1
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsInsertionIndicatorHandler.cxx
@@ -0,0 +1,243 @@
+/* -*- 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 <controller/SlsInsertionIndicatorHandler.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsLayouter.hxx>
+#include <view/SlsInsertAnimator.hxx>
+#include <view/SlsInsertionIndicatorOverlay.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>
+#include <osl/diagnose.h>
+
+#include <SlideSorter.hxx>
+
+using namespace ::com::sun::star::datatransfer::dnd::DNDConstants;
+
+namespace sd::slidesorter::controller {
+
+InsertionIndicatorHandler::InsertionIndicatorHandler (SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter),
+ mpInsertionIndicatorOverlay(std::make_shared<view::InsertionIndicatorOverlay>(rSlideSorter)),
+ meMode(MoveMode),
+ mbIsInsertionTrivial(false),
+ mbIsActive(false),
+ mbIsReadOnly(mrSlideSorter.GetModel().IsReadOnly()),
+ mbIsOverSourceView(true),
+ maIconSize(0,0),
+ mbIsForcedShow(false)
+{
+}
+
+InsertionIndicatorHandler::~InsertionIndicatorHandler() COVERITY_NOEXCEPT_FALSE
+{
+}
+
+void InsertionIndicatorHandler::Start (const bool bIsOverSourceView)
+{
+ if (mbIsActive)
+ {
+ OSL_ASSERT(!mbIsActive);
+ }
+
+ mbIsReadOnly = mrSlideSorter.GetModel().IsReadOnly();
+ if (mbIsReadOnly)
+ return;
+
+ mbIsActive = true;
+ mbIsOverSourceView = bIsOverSourceView;
+}
+
+void InsertionIndicatorHandler::End (const controller::Animator::AnimationMode eMode)
+{
+ if (mbIsForcedShow || ! mbIsActive || mbIsReadOnly)
+ return;
+
+ GetInsertAnimator()->Reset(eMode);
+
+ mbIsActive = false;
+ // maInsertPosition = view::InsertPosition();
+ meMode = UnknownMode;
+
+ mpInsertionIndicatorOverlay->Hide();
+ mpInsertionIndicatorOverlay = std::make_shared<view::InsertionIndicatorOverlay>(mrSlideSorter);
+}
+
+void InsertionIndicatorHandler::ForceShow()
+{
+ mbIsForcedShow = true;
+}
+
+void InsertionIndicatorHandler::ForceEnd()
+{
+ mbIsForcedShow = false;
+ End(Animator::AM_Immediate);
+}
+
+void InsertionIndicatorHandler::UpdateIndicatorIcon (const SdTransferable* pTransferable)
+{
+ mpInsertionIndicatorOverlay->Create(pTransferable);
+ maIconSize = mpInsertionIndicatorOverlay->GetSize();
+}
+
+InsertionIndicatorHandler::Mode InsertionIndicatorHandler::GetModeFromDndAction (
+ const sal_Int8 nDndAction)
+{
+ if ((nDndAction & ACTION_MOVE) != 0)
+ return MoveMode;
+ else if ((nDndAction & ACTION_COPY) != 0)
+ return CopyMode;
+ else
+ return UnknownMode;
+}
+
+void InsertionIndicatorHandler::UpdatePosition (
+ const Point& rMouseModelPosition,
+ const Mode eMode)
+{
+ if ( ! mbIsActive)
+ return;
+
+ if (mbIsReadOnly)
+ return;
+
+ SetPosition(rMouseModelPosition, eMode);
+}
+
+void InsertionIndicatorHandler::UpdatePosition (
+ const Point& rMouseModelPosition,
+ const sal_Int8 nDndAction)
+{
+ UpdatePosition(rMouseModelPosition, GetModeFromDndAction(nDndAction));
+}
+
+sal_Int32 InsertionIndicatorHandler::GetInsertionPageIndex() const
+{
+ if (mbIsReadOnly)
+ return -1;
+ else
+ return maInsertPosition.GetIndex();
+}
+
+void InsertionIndicatorHandler::SetPosition (
+ const Point& rPoint,
+ const Mode eMode)
+{
+ view::Layouter& rLayouter (mrSlideSorter.GetView().GetLayouter());
+
+ const view::InsertPosition aInsertPosition (rLayouter.GetInsertPosition(
+ rPoint,
+ maIconSize,
+ mrSlideSorter.GetModel()));
+
+ if (maInsertPosition == aInsertPosition && meMode == eMode)
+ return;
+
+ maInsertPosition = aInsertPosition;
+ meMode = eMode;
+ mbIsInsertionTrivial = IsInsertionTrivial(maInsertPosition.GetIndex(), eMode);
+ if (maInsertPosition.GetIndex()>=0 && ! mbIsInsertionTrivial)
+ {
+ mpInsertionIndicatorOverlay->SetLocation(maInsertPosition.GetLocation());
+
+ GetInsertAnimator()->SetInsertPosition(maInsertPosition);
+ mpInsertionIndicatorOverlay->Show();
+ }
+ else
+ {
+ GetInsertAnimator()->Reset(Animator::AM_Animated);
+ mpInsertionIndicatorOverlay->Hide();
+ }
+}
+
+std::shared_ptr<view::InsertAnimator> const & InsertionIndicatorHandler::GetInsertAnimator()
+{
+ if ( ! mpInsertAnimator)
+ mpInsertAnimator = std::make_shared<view::InsertAnimator>(mrSlideSorter);
+ return mpInsertAnimator;
+}
+
+bool InsertionIndicatorHandler::IsInsertionTrivial (
+ const sal_Int32 nInsertionIndex,
+ const Mode eMode) const
+{
+ if (eMode == CopyMode)
+ return false;
+ else if (eMode == UnknownMode)
+ return true;
+
+ if ( ! mbIsOverSourceView)
+ return false;
+
+ // Iterate over all selected pages and check whether there are
+ // holes. While we do this we remember the indices of the first and
+ // last selected page as preparation for the next step.
+ sal_Int32 nCurrentIndex = -1;
+ sal_Int32 nFirstIndex = -1;
+ sal_Int32 nLastIndex = -1;
+ model::PageEnumeration aSelectedPages (
+ model::PageEnumerationProvider::CreateSelectedPagesEnumeration(
+ mrSlideSorter.GetModel()));
+ while (aSelectedPages.HasMoreElements())
+ {
+ model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement());
+
+ // Get the page number and compare it to the last one.
+ const sal_Int32 nPageNumber (pDescriptor->GetPageIndex());
+ if (nCurrentIndex>=0 && nPageNumber>(nCurrentIndex+1))
+ return false;
+ else
+ nCurrentIndex = nPageNumber;
+
+ // Remember indices of the first and last page of the selection.
+ if (nFirstIndex == -1)
+ nFirstIndex = nPageNumber;
+ nLastIndex = nPageNumber;
+ }
+
+ // When we come here then the selection has no holes. We still have
+ // to check that the insertion position is not directly in front or
+ // directly behind the selection and thus moving the selection there
+ // would not change the model.
+ return nInsertionIndex >= nFirstIndex && nInsertionIndex <= (nLastIndex+1);
+}
+
+bool InsertionIndicatorHandler::IsInsertionTrivial (const sal_Int8 nDndAction)
+{
+ return IsInsertionTrivial(GetInsertionPageIndex(), GetModeFromDndAction(nDndAction));
+}
+
+//===== InsertionIndicatorHandler::ForceShowContext ===========================
+
+InsertionIndicatorHandler::ForceShowContext::ForceShowContext (
+ const std::shared_ptr<InsertionIndicatorHandler>& rpHandler)
+ : mpHandler(rpHandler)
+{
+ mpHandler->ForceShow();
+}
+
+InsertionIndicatorHandler::ForceShowContext::~ForceShowContext() COVERITY_NOEXCEPT_FALSE
+{
+ mpHandler->ForceEnd();
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsListener.cxx b/sd/source/ui/slidesorter/controller/SlsListener.cxx
new file mode 100644
index 000000000..000f42da2
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsListener.cxx
@@ -0,0 +1,597 @@
+/* -*- 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 "SlsListener.hxx"
+
+#include <SlideSorter.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellHint.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <controller/SlsSelectionManager.hxx>
+#include <controller/SlsSelectionObserver.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <view/SlideSorterView.hxx>
+#include <cache/SlsPageCache.hxx>
+#include <cache/SlsPageCacheManager.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <DrawDocShell.hxx>
+#include <svx/svdpage.hxx>
+
+#include <ViewShellBase.hxx>
+#include <EventMultiplexer.hxx>
+#include <com/sun/star/document/XEventBroadcaster.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/frame/FrameActionEvent.hpp>
+#include <com/sun/star/frame/FrameAction.hpp>
+#include <tools/debug.hxx>
+#include <tools/diagnose_ex.h>
+
+using namespace ::com::sun::star::accessibility;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star;
+
+namespace sd::slidesorter::controller {
+
+Listener::Listener (
+ SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter),
+ mrController(mrSlideSorter.GetController()),
+ mpBase(mrSlideSorter.GetViewShellBase()),
+ mbListeningToDocument (false),
+ mbListeningToUNODocument (false),
+ mbListeningToController (false),
+ mbListeningToFrame (false),
+ mbIsMainViewChangePending(false)
+{
+ StartListening(*mrSlideSorter.GetModel().GetDocument());
+ StartListening(*mrSlideSorter.GetModel().GetDocument()->GetDocSh());
+ mbListeningToDocument = true;
+
+ // Connect to the UNO document.
+ Reference<document::XEventBroadcaster> xBroadcaster (
+ mrSlideSorter.GetModel().GetDocument()->getUnoModel(), uno::UNO_QUERY);
+ if (xBroadcaster.is())
+ {
+ xBroadcaster->addEventListener (this);
+ mbListeningToUNODocument = true;
+ }
+
+ // Listen for disposing events from the document.
+ Reference<XComponent> xComponent (xBroadcaster, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->addEventListener (
+ Reference<lang::XEventListener>(
+ static_cast<XWeak*>(this), UNO_QUERY));
+
+ // Connect to the frame to listen for controllers being exchanged.
+ bool bIsMainViewShell (false);
+ ViewShell* pViewShell = mrSlideSorter.GetViewShell();
+ if (pViewShell != nullptr)
+ bIsMainViewShell = pViewShell->IsMainViewShell();
+ if ( ! bIsMainViewShell)
+ {
+ // Listen to changes of certain properties.
+ Reference<frame::XFrame> xFrame;
+ Reference<frame::XController> xController (mrSlideSorter.GetXController());
+ if (xController.is())
+ xFrame = xController->getFrame();
+ mxFrameWeak = xFrame;
+ if (xFrame.is())
+ {
+ xFrame->addFrameActionListener(Reference<frame::XFrameActionListener>(this));
+ mbListeningToFrame = true;
+ }
+
+ // Connect to the current controller.
+ ConnectToController ();
+ }
+
+ // Listen for hints of the MainViewShell as well. If that is not yet
+ // present then the EventMultiplexer will tell us when it is available.
+ if (mpBase != nullptr)
+ {
+ ViewShell* pMainViewShell = mpBase->GetMainViewShell().get();
+ if (pMainViewShell != nullptr
+ && pMainViewShell!=pViewShell)
+ {
+ StartListening(*pMainViewShell);
+ }
+
+ Link<tools::EventMultiplexerEvent&,void> aLink (LINK(this, Listener, EventMultiplexerCallback));
+ mpBase->GetEventMultiplexer()->AddEventListener(aLink);
+ }
+}
+
+Listener::~Listener()
+{
+ DBG_ASSERT( !mbListeningToDocument && !mbListeningToUNODocument && !mbListeningToFrame,
+ "sd::Listener::~Listener(), disposing() was not called, ask DBO!" );
+}
+
+void Listener::ReleaseListeners()
+{
+ if (mbListeningToDocument)
+ {
+ EndListening(*mrSlideSorter.GetModel().GetDocument()->GetDocSh());
+ EndListening(*mrSlideSorter.GetModel().GetDocument());
+ mbListeningToDocument = false;
+ }
+
+ if (mbListeningToUNODocument)
+ {
+ Reference<document::XEventBroadcaster> xBroadcaster (
+ mrSlideSorter.GetModel().GetDocument()->getUnoModel(), UNO_QUERY);
+ if (xBroadcaster.is())
+ xBroadcaster->removeEventListener (this);
+
+ // Remove the dispose listener.
+ Reference<XComponent> xComponent (xBroadcaster, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->removeEventListener (
+ Reference<lang::XEventListener>(
+ static_cast<XWeak*>(this), UNO_QUERY));
+
+ mbListeningToUNODocument = false;
+ }
+
+ if (mbListeningToFrame)
+ {
+ // Listen to changes of certain properties.
+ Reference<frame::XFrame> xFrame (mxFrameWeak);
+ if (xFrame.is())
+ {
+ xFrame->removeFrameActionListener(Reference<frame::XFrameActionListener>(this));
+ mbListeningToFrame = false;
+ }
+ }
+
+ DisconnectFromController ();
+
+ if (mpBase != nullptr)
+ {
+ Link<sd::tools::EventMultiplexerEvent&,void> aLink (LINK(this, Listener, EventMultiplexerCallback));
+ mpBase->GetEventMultiplexer()->RemoveEventListener(aLink);
+ }
+}
+
+void Listener::ConnectToController()
+{
+ ViewShell* pShell = mrSlideSorter.GetViewShell();
+
+ // Register at the controller of the main view shell (if we are that not
+ // ourself).
+ if (pShell!=nullptr && pShell->IsMainViewShell())
+ return;
+
+ Reference<frame::XController> xController (mrSlideSorter.GetXController());
+
+ // Listen to changes of certain properties.
+ Reference<beans::XPropertySet> xSet (xController, UNO_QUERY);
+ if (xSet.is())
+ {
+ try
+ {
+ xSet->addPropertyChangeListener("CurrentPage", this);
+ }
+ catch (beans::UnknownPropertyException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+ try
+ {
+ xSet->addPropertyChangeListener("IsMasterPageMode", this);
+ }
+ catch (beans::UnknownPropertyException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+ }
+
+ // Listen for disposing events.
+ if (xController.is())
+ {
+ xController->addEventListener (
+ Reference<lang::XEventListener>(static_cast<XWeak*>(this), UNO_QUERY));
+
+ mxControllerWeak = xController;
+ mbListeningToController = true;
+ }
+}
+
+void Listener::DisconnectFromController()
+{
+ if (!mbListeningToController)
+ return;
+
+ Reference<frame::XController> xController = mxControllerWeak;
+ Reference<beans::XPropertySet> xSet (xController, UNO_QUERY);
+ try
+ {
+ // Remove the property listener.
+ if (xSet.is())
+ {
+ xSet->removePropertyChangeListener( "CurrentPage", this );
+ xSet->removePropertyChangeListener( "IsMasterPageMode", this);
+ }
+
+ // Remove the dispose listener.
+ if (xController.is())
+ xController->removeEventListener (
+ Reference<lang::XEventListener>(
+ static_cast<XWeak*>(this), UNO_QUERY));
+ }
+ catch (beans::UnknownPropertyException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+
+ mbListeningToController = false;
+ mxControllerWeak = Reference<frame::XController>();
+}
+
+void Listener::Notify (
+ SfxBroadcaster& rBroadcaster,
+ const SfxHint& rHint)
+{
+ if (rHint.GetId() == SfxHintId::ThisIsAnSdrHint)
+ {
+ const SdrHint* pSdrHint = static_cast<const SdrHint*>(&rHint);
+ switch (pSdrHint->GetKind())
+ {
+ case SdrHintKind::ModelCleared:
+ if (&rBroadcaster == mrSlideSorter.GetModel().GetDocument())
+ { // rhbz#965646 stop listening to dying document
+ EndListening(rBroadcaster);
+ return;
+ }
+ break;
+ case SdrHintKind::PageOrderChange:
+ if (&rBroadcaster == mrSlideSorter.GetModel().GetDocument())
+ HandleModelChange(pSdrHint->GetPage());
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if (rHint.GetId() == SfxHintId::DocChanged)
+ {
+ mrController.CheckForMasterPageAssignment();
+ mrController.CheckForSlideTransitionAssignment();
+ }
+ else if (auto pViewShellHint = dynamic_cast<const ViewShellHint*>(&rHint))
+ {
+ switch (pViewShellHint->GetHintId())
+ {
+ case ViewShellHint::HINT_PAGE_RESIZE_START:
+ // Initiate a model change but do nothing (well, not much)
+ // until we are told that all slides have been resized.
+ mpModelChangeLock.reset(new SlideSorterController::ModelChangeLock(mrController),
+ o3tl::default_delete<SlideSorterController::ModelChangeLock>());
+ mrController.HandleModelChange();
+ break;
+
+ case ViewShellHint::HINT_PAGE_RESIZE_END:
+ // All slides have been resized. The model has to be updated.
+ mpModelChangeLock.reset();
+ break;
+
+ case ViewShellHint::HINT_CHANGE_EDIT_MODE_START:
+ mrController.PrepareEditModeChange();
+ break;
+
+ case ViewShellHint::HINT_CHANGE_EDIT_MODE_END:
+ mrController.FinishEditModeChange();
+ break;
+
+ case ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_START:
+ mpModelChangeLock.reset(new SlideSorterController::ModelChangeLock(mrController),
+ o3tl::default_delete<SlideSorterController::ModelChangeLock>());
+ break;
+
+ case ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_END:
+ mpModelChangeLock.reset();
+ break;
+ }
+ }
+}
+
+IMPL_LINK(Listener, EventMultiplexerCallback, ::sd::tools::EventMultiplexerEvent&, rEvent, void)
+{
+ switch (rEvent.meEventId)
+ {
+ case EventMultiplexerEventId::MainViewRemoved:
+ {
+ if (mpBase != nullptr)
+ {
+ ViewShell* pMainViewShell = mpBase->GetMainViewShell().get();
+ if (pMainViewShell != nullptr)
+ EndListening(*pMainViewShell);
+ }
+ }
+ break;
+
+ case EventMultiplexerEventId::MainViewAdded:
+ mbIsMainViewChangePending = true;
+ break;
+
+ case EventMultiplexerEventId::ConfigurationUpdated:
+ if (mbIsMainViewChangePending && mpBase != nullptr)
+ {
+ mbIsMainViewChangePending = false;
+ ViewShell* pMainViewShell = mpBase->GetMainViewShell().get();
+ if (pMainViewShell != nullptr
+ && pMainViewShell!=mrSlideSorter.GetViewShell())
+ {
+ StartListening (*pMainViewShell);
+ }
+ }
+ break;
+
+ case EventMultiplexerEventId::ControllerAttached:
+ {
+ ConnectToController();
+ // mrController.GetPageSelector().GetCoreSelection();
+ UpdateEditMode();
+ }
+ break;
+
+ case EventMultiplexerEventId::ControllerDetached:
+ DisconnectFromController();
+ break;
+
+ case EventMultiplexerEventId::ShapeChanged:
+ case EventMultiplexerEventId::ShapeInserted:
+ case EventMultiplexerEventId::ShapeRemoved:
+ HandleShapeModification(static_cast<const SdrPage*>(rEvent.mpUserData));
+ break;
+
+ case EventMultiplexerEventId::EndTextEdit:
+ if (rEvent.mpUserData != nullptr)
+ {
+ const SdrObject* pObject = static_cast<const SdrObject*>(rEvent.mpUserData);
+ HandleShapeModification(pObject->getSdrPageFromSdrObject());
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+//===== lang::XEventListener ================================================
+
+void SAL_CALL Listener::disposing (
+ const lang::EventObject& rEventObject)
+{
+ if ((mbListeningToDocument || mbListeningToUNODocument)
+ && mrSlideSorter.GetModel().GetDocument()!=nullptr
+ && rEventObject.Source
+ == mrSlideSorter.GetModel().GetDocument()->getUnoModel())
+ {
+ mbListeningToDocument = false;
+ mbListeningToUNODocument = false;
+ }
+ else if (mbListeningToController)
+ {
+ Reference<frame::XController> xController (mxControllerWeak);
+ if (rEventObject.Source == xController)
+ {
+ mbListeningToController = false;
+ }
+ }
+}
+
+//===== document::XEventListener ============================================
+
+void SAL_CALL Listener::notifyEvent (
+ const document::EventObject& )
+{
+}
+
+//===== beans::XPropertySetListener =========================================
+
+void SAL_CALL Listener::propertyChange (
+ const PropertyChangeEvent& rEvent)
+{
+ if (m_bDisposed)
+ {
+ throw lang::DisposedException ("SlideSorterController object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+
+ if (rEvent.PropertyName == "CurrentPage")
+ {
+ Any aCurrentPage = rEvent.NewValue;
+ Reference<beans::XPropertySet> xPageSet (aCurrentPage, UNO_QUERY);
+ if (xPageSet.is())
+ {
+ try
+ {
+ Any aPageNumber = xPageSet->getPropertyValue ("Number");
+ sal_Int32 nCurrentPage = 0;
+ aPageNumber >>= nCurrentPage;
+ // The selection is already set but we call SelectPage()
+ // nevertheless in order to make the new current page the
+ // last recently selected page of the PageSelector. This is
+ // used when making the selection visible.
+ mrController.GetCurrentSlideManager()->NotifyCurrentSlideChange(nCurrentPage-1);
+ mrController.GetPageSelector().SelectPage(nCurrentPage-1);
+ }
+ catch (beans::UnknownPropertyException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+ catch (lang::DisposedException&)
+ {
+ // Something is already disposed. There is not much we can
+ // do, except not to crash.
+ }
+ }
+ }
+ else if (rEvent.PropertyName == "IsMasterPageMode")
+ {
+ bool bIsMasterPageMode = false;
+ rEvent.NewValue >>= bIsMasterPageMode;
+ mrController.ChangeEditMode (
+ bIsMasterPageMode ? EditMode::MasterPage : EditMode::Page);
+ }
+}
+
+//===== frame::XFrameActionListener ==========================================
+
+void SAL_CALL Listener::frameAction (const frame::FrameActionEvent& rEvent)
+{
+ switch (rEvent.Action)
+ {
+ case frame::FrameAction_COMPONENT_DETACHING:
+ DisconnectFromController();
+ break;
+
+ case frame::FrameAction_COMPONENT_REATTACHED:
+ {
+ ConnectToController();
+ mrController.GetPageSelector().GetCoreSelection();
+ UpdateEditMode();
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+//===== accessibility::XAccessibleEventListener ==============================
+
+void SAL_CALL Listener::notifyEvent (
+ const AccessibleEventObject& )
+{
+}
+
+void Listener::disposing(std::unique_lock<std::mutex>&)
+{
+ ReleaseListeners();
+}
+
+void Listener::UpdateEditMode()
+{
+ // When there is a new controller then the edit mode may have changed at
+ // the same time.
+ Reference<frame::XController> xController (mxControllerWeak);
+ Reference<beans::XPropertySet> xSet (xController, UNO_QUERY);
+ bool bIsMasterPageMode = false;
+ if (xSet != nullptr)
+ {
+ try
+ {
+ Any aValue (xSet->getPropertyValue( "IsMasterPageMode" ));
+ aValue >>= bIsMasterPageMode;
+ }
+ catch (beans::UnknownPropertyException&)
+ {
+ // When the property is not supported then the master page mode
+ // is not supported, too.
+ bIsMasterPageMode = false;
+ }
+ }
+ mrController.ChangeEditMode (
+ bIsMasterPageMode ? EditMode::MasterPage : EditMode::Page);
+}
+
+void Listener::HandleModelChange (const SdrPage* pPage)
+{
+ // Notify model and selection observer about the page. The return value
+ // of the model call acts as filter as to which events to pass to the
+ // selection observer.
+ if (mrSlideSorter.GetModel().NotifyPageEvent(pPage))
+ {
+ // The page of the hint belongs (or belonged) to the model.
+
+ // Tell the cache manager that the preview bitmaps for a deleted
+ // page can be removed from all caches.
+ if (pPage!=nullptr && ! pPage->IsInserted())
+ cache::PageCacheManager::Instance()->ReleasePreviewBitmap(pPage);
+
+ mrController.GetSelectionManager()->GetSelectionObserver()->NotifyPageEvent(pPage);
+ }
+
+ // Tell the controller about the model change only when the document is
+ // in a sane state, not just in the middle of a larger change.
+ SdDrawDocument* pDocument (mrSlideSorter.GetModel().GetDocument());
+ if (pDocument != nullptr
+ && pDocument->GetMasterSdPageCount(PageKind::Standard) == pDocument->GetMasterSdPageCount(PageKind::Notes))
+ {
+ // A model change can make updates of some text fields necessary
+ // (like page numbers and page count.) Invalidate all previews in
+ // the cache to cope with this. Doing this on demand would be a
+ // nice optimization.
+ cache::PageCacheManager::Instance()->InvalidateAllPreviewBitmaps(pDocument->getUnoModel());
+
+ mrController.HandleModelChange();
+ }
+}
+
+void Listener::HandleShapeModification (const SdrPage* pPage)
+{
+ if (pPage == nullptr)
+ return;
+
+ // Invalidate the preview of the page (in all slide sorters that display
+ // it.)
+ std::shared_ptr<cache::PageCacheManager> pCacheManager (cache::PageCacheManager::Instance());
+ if ( ! pCacheManager)
+ return;
+ SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument();
+ if (pDocument == nullptr)
+ {
+ OSL_ASSERT(pDocument!=nullptr);
+ return;
+ }
+ pCacheManager->InvalidatePreviewBitmap(pDocument->getUnoModel(), pPage);
+ mrSlideSorter.GetView().GetPreviewCache()->RequestPreviewBitmap(pPage);
+
+ // When the page is a master page then invalidate the previews of all
+ // pages that are linked to this master page.
+ if (!pPage->IsMasterPage())
+ return;
+
+ for (sal_uInt16 nIndex=0,nCount=pDocument->GetSdPageCount(PageKind::Standard);
+ nIndex<nCount;
+ ++nIndex)
+ {
+ const SdPage* pCandidate = pDocument->GetSdPage(nIndex, PageKind::Standard);
+ if (pCandidate!=nullptr && pCandidate->TRG_HasMasterPage())
+ {
+ if (&pCandidate->TRG_GetMasterPage() == pPage)
+ pCacheManager->InvalidatePreviewBitmap(pDocument->getUnoModel(), pCandidate);
+ }
+ else
+ {
+ OSL_ASSERT(pCandidate!=nullptr && pCandidate->TRG_HasMasterPage());
+ }
+ }
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsListener.hxx b/sd/source/ui/slidesorter/controller/SlsListener.hxx
new file mode 100644
index 000000000..eff02cf19
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsListener.hxx
@@ -0,0 +1,164 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <controller/SlideSorterController.hxx>
+#include <com/sun/star/document/XEventListener.hpp>
+#include <com/sun/star/beans/XPropertyChangeListener.hpp>
+#include <com/sun/star/accessibility/XAccessibleEventListener.hpp>
+#include <com/sun/star/frame/XFrameActionListener.hpp>
+#include <comphelper/compbase.hxx>
+#include <cppuhelper/weakref.hxx>
+
+#include <svl/lstner.hxx>
+#include <tools/link.hxx>
+#include <memory>
+
+class SdrPage;
+
+namespace sd {
+class ViewShellBase;
+}
+
+namespace sd::tools { class EventMultiplexerEvent; }
+namespace sd::slidesorter { class SlideSorter; }
+
+namespace sd::slidesorter::controller {
+
+typedef comphelper::WeakComponentImplHelper<
+ css::document::XEventListener,
+ css::beans::XPropertyChangeListener,
+ css::accessibility::XAccessibleEventListener,
+ css::frame::XFrameActionListener
+ > ListenerInterfaceBase;
+
+/** Listen for events of various types and sources and react to them. This
+ class is a part of the controller.
+
+ When the view shell in the center pane is replaced by another the
+ associated controller is replaced as well. Therefore we have to
+ register at the frame and on certain FrameActionEvents to stop listening
+ to the old controller and register as listener at the new one.
+*/
+class Listener
+ : public ListenerInterfaceBase,
+ public SfxListener
+{
+public:
+ explicit Listener (SlideSorter& rSlideSorter);
+ virtual ~Listener() override;
+
+ /** Connect to the current controller of the view shell as listener.
+ This method is called once during initialization and every time a
+ FrameActionEvent signals the current controller being exchanged.
+ When the connection is successful then the flag
+ mbListeningToController is set to <TRUE/>.
+ */
+ void ConnectToController();
+
+ /** Disconnect from the current controller of the view shell as
+ listener. This method is called once during initialization and
+ every time a FrameActionEvent signals the current controller being
+ exchanged. When this method terminates then mbListeningToController
+ is <FALSE/>.
+ */
+ void DisconnectFromController();
+
+ virtual void Notify (
+ SfxBroadcaster& rBroadcaster,
+ const SfxHint& rHint) override;
+
+ //===== lang::XEventListener ============================================
+ virtual void SAL_CALL
+ disposing (const css::lang::EventObject& rEventObject) override;
+
+ //===== document::XEventListener ========================================
+ virtual void SAL_CALL
+ notifyEvent (
+ const css::document::EventObject& rEventObject) override;
+
+ //===== beans::XPropertySetListener =====================================
+ virtual void SAL_CALL
+ propertyChange (
+ const css::beans::PropertyChangeEvent& rEvent) override;
+
+ //===== accessibility::XAccessibleEventListener ==========================
+ virtual void SAL_CALL
+ notifyEvent (
+ const css::accessibility::AccessibleEventObject&
+ rEvent) override;
+
+ //===== frame::XFrameActionListener ======================================
+ /** For certain actions the listener connects to a new controller of the
+ frame it is listening to. This usually happens when the view shell
+ in the center pane is replaced by another view shell.
+ */
+ virtual void SAL_CALL
+ frameAction (const css::frame::FrameActionEvent& rEvent) override;
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+private:
+ SlideSorter& mrSlideSorter;
+ SlideSorterController& mrController;
+ ViewShellBase* mpBase;
+
+ /// Remember whether we are listening to the document.
+ bool mbListeningToDocument;
+ /// Remember whether we are listening to the UNO document.
+ bool mbListeningToUNODocument;
+ /// Remember whether we are listening to the UNO controller.
+ bool mbListeningToController;
+ /// Remember whether we are listening to the frame.
+ bool mbListeningToFrame;
+ bool mbIsMainViewChangePending;
+
+ css::uno::WeakReference< css::frame::XController> mxControllerWeak;
+ css::uno::WeakReference< css::frame::XFrame> mxFrameWeak;
+
+ /** This object is used to lock the model between some
+ events. It is references counted in order to cope with events that
+ are expected but never sent.
+ */
+ std::shared_ptr<SlideSorterController::ModelChangeLock> mpModelChangeLock;
+
+ void ReleaseListeners();
+
+ /** Called when the edit mode has changed. Update model accordingly.
+ */
+ void UpdateEditMode();
+
+ /** Handle a change in the order of slides or when the set of slides has
+ changed, i.e. a slide has been created.
+ */
+ void HandleModelChange (const SdrPage* pPage);
+
+ /** Handle a modification to a shape on the given page. When this is a
+ regular page then update its preview. When it is a master page then
+ additionally update the previews of all pages linked to it.
+ */
+ void HandleShapeModification (const SdrPage* pPage);
+
+ DECL_LINK(EventMultiplexerCallback, tools::EventMultiplexerEvent&, void);
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx b/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx
new file mode 100644
index 000000000..21affcf2f
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx
@@ -0,0 +1,386 @@
+/* -*- 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 <controller/SlsPageSelector.hxx>
+
+#include <SlideSorter.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsSelectionManager.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <controller/SlsVisibleAreaManager.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <view/SlideSorterView.hxx>
+#include <osl/diagnose.h>
+
+#include <sdpage.hxx>
+#include <tools/debug.hxx>
+#include <memory>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::sd::slidesorter::model;
+using namespace ::sd::slidesorter::view;
+
+namespace sd::slidesorter::controller {
+
+PageSelector::PageSelector (SlideSorter& rSlideSorter)
+ : mrModel(rSlideSorter.GetModel()),
+ mrSlideSorter(rSlideSorter),
+ mrController(mrSlideSorter.GetController()),
+ mnSelectedPageCount(0),
+ mnBroadcastDisableLevel(0),
+ mbSelectionChangeBroadcastPending(false),
+ mnUpdateLockCount(0),
+ mbIsUpdateCurrentPagePending(true)
+{
+ CountSelectedPages ();
+}
+
+void PageSelector::SelectAllPages()
+{
+ VisibleAreaManager::TemporaryDisabler aDisabler (mrSlideSorter);
+ PageSelector::UpdateLock aLock (*this);
+
+ int nPageCount = mrModel.GetPageCount();
+ for (int nPageIndex=0; nPageIndex<nPageCount; nPageIndex++)
+ SelectPage(nPageIndex);
+}
+
+void PageSelector::DeselectAllPages()
+{
+ VisibleAreaManager::TemporaryDisabler aDisabler (mrSlideSorter);
+ PageSelector::UpdateLock aLock (*this);
+
+ int nPageCount = mrModel.GetPageCount();
+ for (int nPageIndex=0; nPageIndex<nPageCount; nPageIndex++)
+ DeselectPage(nPageIndex);
+
+ DBG_ASSERT (mnSelectedPageCount==0,
+ "PageSelector::DeselectAllPages: the selected pages counter is not 0");
+ mnSelectedPageCount = 0;
+ mpSelectionAnchor.reset();
+}
+
+void PageSelector::GetCoreSelection()
+{
+ PageSelector::UpdateLock aLock (*this);
+
+ bool bSelectionHasChanged (true);
+ mnSelectedPageCount = 0;
+ model::PageEnumeration aAllPages (
+ model::PageEnumerationProvider::CreateAllPagesEnumeration(mrModel));
+ while (aAllPages.HasMoreElements())
+ {
+ model::SharedPageDescriptor pDescriptor (aAllPages.GetNextElement());
+ if (pDescriptor->GetCoreSelection())
+ {
+ mrSlideSorter.GetController().GetVisibleAreaManager().RequestVisible(pDescriptor);
+ mrSlideSorter.GetView().RequestRepaint(pDescriptor);
+ bSelectionHasChanged = true;
+ }
+
+ if (pDescriptor->HasState(PageDescriptor::ST_Selected))
+ mnSelectedPageCount++;
+ }
+
+ if (bSelectionHasChanged)
+ {
+ if (mnBroadcastDisableLevel > 0)
+ mbSelectionChangeBroadcastPending = true;
+ else
+ mrController.GetSelectionManager()->SelectionHasChanged();
+ }
+}
+
+void PageSelector::SetCoreSelection()
+{
+ model::PageEnumeration aAllPages (
+ model::PageEnumerationProvider::CreateAllPagesEnumeration(mrModel));
+ while (aAllPages.HasMoreElements())
+ {
+ model::SharedPageDescriptor pDescriptor (aAllPages.GetNextElement());
+ pDescriptor->SetCoreSelection();
+ }
+}
+
+void PageSelector::SelectPage (int nPageIndex)
+{
+ SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex));
+ if (pDescriptor)
+ SelectPage(pDescriptor);
+}
+
+void PageSelector::SelectPage (const SdPage* pPage)
+{
+ const sal_Int32 nPageIndex (mrModel.GetIndex(pPage));
+ SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex));
+ if (pDescriptor && pDescriptor->GetPage()==pPage)
+ SelectPage(pDescriptor);
+}
+
+void PageSelector::SelectPage (const SharedPageDescriptor& rpDescriptor)
+{
+ if (!rpDescriptor
+ || !mrSlideSorter.GetView().SetState(rpDescriptor, PageDescriptor::ST_Selected, true))
+ return;
+
+ ++mnSelectedPageCount;
+ mrSlideSorter.GetController().GetVisibleAreaManager().RequestVisible(rpDescriptor,true);
+ mrSlideSorter.GetView().RequestRepaint(rpDescriptor);
+
+ mpMostRecentlySelectedPage = rpDescriptor;
+ if (mpSelectionAnchor == nullptr)
+ mpSelectionAnchor = rpDescriptor;
+
+ if (mnBroadcastDisableLevel > 0)
+ mbSelectionChangeBroadcastPending = true;
+ else
+ mrController.GetSelectionManager()->SelectionHasChanged();
+ UpdateCurrentPage();
+
+ CheckConsistency();
+}
+
+void PageSelector::DeselectPage (int nPageIndex)
+{
+ model::SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex));
+ if (pDescriptor)
+ DeselectPage(pDescriptor);
+}
+
+void PageSelector::DeselectPage (
+ const SharedPageDescriptor& rpDescriptor,
+ const bool bUpdateCurrentPage)
+{
+ if (!rpDescriptor
+ || !mrSlideSorter.GetView().SetState(rpDescriptor, PageDescriptor::ST_Selected, false))
+ return;
+
+ --mnSelectedPageCount;
+ mrSlideSorter.GetController().GetVisibleAreaManager().RequestVisible(rpDescriptor);
+ mrSlideSorter.GetView().RequestRepaint(rpDescriptor);
+ if (mpMostRecentlySelectedPage == rpDescriptor)
+ mpMostRecentlySelectedPage.reset();
+ if (mnBroadcastDisableLevel > 0)
+ mbSelectionChangeBroadcastPending = true;
+ else
+ mrController.GetSelectionManager()->SelectionHasChanged();
+ if (bUpdateCurrentPage)
+ UpdateCurrentPage();
+
+ CheckConsistency();
+}
+
+void PageSelector::CheckConsistency() const
+{
+ int nSelectionCount (0);
+ for (int nPageIndex=0,nPageCount=mrModel.GetPageCount(); nPageIndex<nPageCount; nPageIndex++)
+ {
+ SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex));
+ assert(pDescriptor);
+ if (pDescriptor->HasState(PageDescriptor::ST_Selected))
+ ++nSelectionCount;
+ }
+ if (nSelectionCount!=mnSelectedPageCount)
+ {
+ // #i120020# The former call to assert(..) internally calls
+ // SlideSorterModel::GetPageDescriptor which will crash in this situation
+ // (only in non-pro code). All what is wanted there is to assert it (the
+ // error is already detected), so do this directly.
+ OSL_ENSURE(false, "PageSelector: Consistency error (!)");
+ }
+}
+
+bool PageSelector::IsPageSelected(int nPageIndex)
+{
+ SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex));
+ if (pDescriptor)
+ return pDescriptor->HasState(PageDescriptor::ST_Selected);
+ else
+ return false;
+}
+
+bool PageSelector::IsPageVisible(int nPageIndex)
+{
+ SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex));
+ if (pDescriptor)
+ return pDescriptor->HasState(PageDescriptor::ST_Visible);
+ else
+ return false;
+}
+
+int PageSelector::GetPageCount() const
+{
+ return mrModel.GetPageCount();
+}
+
+void PageSelector::CountSelectedPages()
+{
+ mnSelectedPageCount = 0;
+ model::PageEnumeration aSelectedPages (
+ model::PageEnumerationProvider::CreateSelectedPagesEnumeration(mrModel));
+ while (aSelectedPages.HasMoreElements())
+ {
+ mnSelectedPageCount++;
+ aSelectedPages.GetNextElement();
+ }
+}
+
+void PageSelector::EnableBroadcasting()
+{
+ if (mnBroadcastDisableLevel > 0)
+ mnBroadcastDisableLevel --;
+ if (mnBroadcastDisableLevel==0 && mbSelectionChangeBroadcastPending)
+ {
+ mrController.GetSelectionManager()->SelectionHasChanged();
+ mbSelectionChangeBroadcastPending = false;
+ }
+}
+
+void PageSelector::DisableBroadcasting()
+{
+ mnBroadcastDisableLevel ++;
+}
+
+std::shared_ptr<PageSelector::PageSelection> PageSelector::GetPageSelection() const
+{
+ auto pSelection = std::make_shared<PageSelection>();
+ pSelection->reserve(GetSelectedPageCount());
+
+ int nPageCount = GetPageCount();
+ for (int nIndex=0; nIndex<nPageCount; nIndex++)
+ {
+ SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nIndex));
+ if (pDescriptor && pDescriptor->HasState(PageDescriptor::ST_Selected))
+ pSelection->push_back(pDescriptor->GetPage());
+ }
+
+ return pSelection;
+}
+
+void PageSelector::SetPageSelection (
+ const std::shared_ptr<PageSelection>& rpSelection,
+ const bool bUpdateCurrentPage)
+{
+ for (const auto& rpPage : *rpSelection)
+ SelectPage(rpPage);
+ if (bUpdateCurrentPage)
+ UpdateCurrentPage();
+}
+
+void PageSelector::UpdateCurrentPage (const bool bUpdateOnlyWhenPending)
+{
+ if (mnUpdateLockCount > 0)
+ {
+ mbIsUpdateCurrentPagePending = true;
+ return;
+ }
+
+ if ( ! mbIsUpdateCurrentPagePending && bUpdateOnlyWhenPending)
+ return;
+
+ mbIsUpdateCurrentPagePending = false;
+
+ // Make the first selected page the current page.
+ SharedPageDescriptor pCurrentPageDescriptor;
+ const sal_Int32 nPageCount (GetPageCount());
+ for (sal_Int32 nIndex=0; nIndex<nPageCount; ++nIndex)
+ {
+ SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nIndex));
+ if ( ! pDescriptor)
+ continue;
+ if (pDescriptor->HasState(PageDescriptor::ST_Selected))
+ {
+ pCurrentPageDescriptor = pDescriptor;
+ break;
+ }
+ }
+
+ if (!pCurrentPageDescriptor)
+ return;
+
+ // Switching the current slide normally sets also the
+ // selection to just the new current slide. To prevent that,
+ // we store (and at the end of this scope restore) the current
+ // selection.
+ std::shared_ptr<PageSelection> pSelection (GetPageSelection());
+
+ mrController.GetCurrentSlideManager()->SwitchCurrentSlide(pCurrentPageDescriptor);
+
+ // Restore the selection and prevent a recursive call to
+ // UpdateCurrentPage().
+ SetPageSelection(pSelection, false);
+}
+
+//===== PageSelector::UpdateLock ==============================================
+
+PageSelector::UpdateLock::UpdateLock (SlideSorter const & rSlideSorter)
+ : mpSelector(&rSlideSorter.GetController().GetPageSelector())
+{
+ ++mpSelector->mnUpdateLockCount;
+}
+
+PageSelector::UpdateLock::UpdateLock (PageSelector& rSelector)
+ : mpSelector(&rSelector)
+{
+ ++mpSelector->mnUpdateLockCount;
+}
+
+PageSelector::UpdateLock::~UpdateLock()
+{
+ Release();
+}
+
+void PageSelector::UpdateLock::Release()
+{
+ if (mpSelector != nullptr)
+ {
+ --mpSelector->mnUpdateLockCount;
+ OSL_ASSERT(mpSelector->mnUpdateLockCount >= 0);
+ if (mpSelector->mnUpdateLockCount == 0)
+ mpSelector->UpdateCurrentPage(true);
+
+ mpSelector = nullptr;
+ }
+}
+
+//===== PageSelector::BroadcastLock ==============================================
+
+PageSelector::BroadcastLock::BroadcastLock (SlideSorter const & rSlideSorter)
+ : mrSelector(rSlideSorter.GetController().GetPageSelector())
+{
+ mrSelector.DisableBroadcasting();
+}
+
+PageSelector::BroadcastLock::BroadcastLock (PageSelector& rSelector)
+ : mrSelector(rSelector)
+{
+ mrSelector.DisableBroadcasting();
+}
+
+PageSelector::BroadcastLock::~BroadcastLock()
+{
+ mrSelector.EnableBroadcasting();
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsProperties.cxx b/sd/source/ui/slidesorter/controller/SlsProperties.cxx
new file mode 100644
index 000000000..f1152a373
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsProperties.cxx
@@ -0,0 +1,106 @@
+/* -*- 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 <controller/SlsProperties.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/settings.hxx>
+
+namespace sd::slidesorter::controller {
+
+Properties::Properties()
+ : mbIsHighlightCurrentSlide(false),
+ mbIsShowSelection(true),
+ mbIsShowFocus(true),
+ mbIsCenterSelection(false),
+ mbIsSmoothSelectionScrolling(true),
+ mbIsSuspendPreviewUpdatesDuringFullScreenPresentation(true),
+ maBackgroundColor(Application::GetSettings().GetStyleSettings().GetWindowColor()),
+ maTextColor(Application::GetSettings().GetStyleSettings().GetActiveTextColor()),
+ maSelectionColor(Application::GetSettings().GetStyleSettings().GetHighlightColor()),
+ maHighlightColor(Application::GetSettings().GetStyleSettings().GetMenuHighlightColor()),
+ mbIsUIReadOnly(false)
+{
+}
+
+void Properties::HandleDataChangeEvent()
+{
+ maBackgroundColor = Application::GetSettings().GetStyleSettings().GetWindowColor();
+ maTextColor = Application::GetSettings().GetStyleSettings().GetActiveTextColor();
+ maSelectionColor = Application::GetSettings().GetStyleSettings().GetHighlightColor();
+ maHighlightColor = Application::GetSettings().GetStyleSettings().GetMenuHighlightColor();
+}
+
+void Properties::SetHighlightCurrentSlide (const bool bIsHighlightCurrentSlide)
+{
+ mbIsHighlightCurrentSlide = bIsHighlightCurrentSlide;
+}
+
+void Properties::SetShowSelection (const bool bIsShowSelection)
+{
+ mbIsShowSelection = bIsShowSelection;
+}
+
+void Properties::SetShowFocus (const bool bIsShowFocus)
+{
+ mbIsShowFocus = bIsShowFocus;
+}
+
+void Properties::SetCenterSelection (const bool bIsCenterSelection)
+{
+ mbIsCenterSelection = bIsCenterSelection;
+}
+
+void Properties::SetSmoothSelectionScrolling (const bool bIsSmoothSelectionScrolling)
+{
+ mbIsSmoothSelectionScrolling = bIsSmoothSelectionScrolling;
+}
+
+void Properties::SetSuspendPreviewUpdatesDuringFullScreenPresentation (const bool bFlag)
+{
+ mbIsSuspendPreviewUpdatesDuringFullScreenPresentation = bFlag;
+}
+
+void Properties::SetBackgroundColor (const Color& rColor)
+{
+ maBackgroundColor = rColor;
+}
+
+void Properties::SetTextColor (const Color& rColor)
+{
+ maTextColor = rColor;
+}
+
+void Properties::SetSelectionColor (const Color& rColor)
+{
+ maSelectionColor = rColor;
+}
+
+void Properties::SetHighlightColor (const Color& rColor)
+{
+ maHighlightColor = rColor;
+}
+
+void Properties::SetUIReadOnly (const bool bIsUIReadOnly)
+{
+ mbIsUIReadOnly = bIsUIReadOnly;
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx
new file mode 100644
index 000000000..83192414f
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx
@@ -0,0 +1,608 @@
+/* -*- 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 <controller/SlsScrollBarManager.hxx>
+
+#include <SlideSorter.hxx>
+#include <ViewShell.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsVisibleAreaManager.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsLayouter.hxx>
+#include <Window.hxx>
+#include <sdpage.hxx>
+#include <osl/diagnose.h>
+
+#include <vcl/scrbar.hxx>
+
+namespace sd::slidesorter::controller {
+
+constexpr double gnHorizontalScrollFactor(0.15);
+constexpr double gnVerticalScrollFactor(0.25);
+
+ScrollBarManager::ScrollBarManager (SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter),
+ mpHorizontalScrollBar(mrSlideSorter.GetHorizontalScrollBar()),
+ mpVerticalScrollBar(mrSlideSorter.GetVerticalScrollBar()),
+ mnHorizontalPosition (0),
+ mnVerticalPosition (0),
+ maScrollBorder (20,20),
+ mpScrollBarFiller(mrSlideSorter.GetScrollBarFiller()),
+ maAutoScrollTimer("sd ScrollBarManager maAutoScrollTimer"),
+ maAutoScrollOffset(0,0),
+ mbIsAutoScrollActive(false),
+ mpContentWindow(mrSlideSorter.GetContentWindow())
+{
+ // Hide the scroll bars by default to prevent display errors while
+ // switching between view shells: In the short time between initiating
+ // such a switch and the final rearrangement of UI controls the scroll
+ // bars and the filler where displayed in the upper left corner of the
+ // ViewTabBar.
+ mpHorizontalScrollBar->Hide();
+ mpVerticalScrollBar->Hide();
+ mpScrollBarFiller->Hide();
+
+ maAutoScrollTimer.SetTimeout(25);
+ maAutoScrollTimer.SetInvokeHandler (
+ LINK(this, ScrollBarManager, AutoScrollTimeoutHandler));
+}
+
+ScrollBarManager::~ScrollBarManager()
+{
+}
+
+void ScrollBarManager::Connect()
+{
+ if (mpVerticalScrollBar != nullptr)
+ {
+ mpVerticalScrollBar->SetScrollHdl (
+ LINK(this, ScrollBarManager, VerticalScrollBarHandler));
+ }
+ if (mpHorizontalScrollBar != nullptr)
+ {
+ mpHorizontalScrollBar->SetScrollHdl(
+ LINK(this, ScrollBarManager, HorizontalScrollBarHandler));
+ }
+}
+
+void ScrollBarManager::Disconnect()
+{
+ if (mpVerticalScrollBar != nullptr)
+ {
+ mpVerticalScrollBar->SetScrollHdl( Link<ScrollBar*,void>() );
+ }
+ if (mpHorizontalScrollBar != nullptr)
+ {
+ mpHorizontalScrollBar->SetScrollHdl( Link<ScrollBar*,void>() );
+ }
+}
+
+/** Placing the scroll bars is an iterative process. The visibility of one
+ scroll bar affects the remaining size and thus may lead to the other
+ scroll bar becoming visible.
+
+ First we determine the visibility of the horizontal scroll bar. After
+ that we do the same for the vertical scroll bar. To have an initial
+ value for the required size we call the layouter before that. When one
+ of the two scroll bars is made visible then the size of the browser
+ window changes and a second call to the layouter becomes necessary.
+ That call is made anyway after this method returns.
+*/
+::tools::Rectangle ScrollBarManager::PlaceScrollBars (
+ const ::tools::Rectangle& rAvailableArea,
+ const bool bIsHorizontalScrollBarAllowed,
+ const bool bIsVerticalScrollBarAllowed)
+{
+ ::tools::Rectangle aRemainingSpace (DetermineScrollBarVisibilities(
+ rAvailableArea,
+ bIsHorizontalScrollBarAllowed,
+ bIsVerticalScrollBarAllowed));
+
+ if (mpHorizontalScrollBar!=nullptr && mpHorizontalScrollBar->IsVisible())
+ PlaceHorizontalScrollBar (rAvailableArea);
+
+ if (mpVerticalScrollBar!=nullptr && mpVerticalScrollBar->IsVisible())
+ PlaceVerticalScrollBar (rAvailableArea);
+
+ if (mpScrollBarFiller!=nullptr && mpScrollBarFiller->IsVisible())
+ PlaceFiller (rAvailableArea);
+
+ return aRemainingSpace;
+}
+
+void ScrollBarManager::PlaceHorizontalScrollBar (const ::tools::Rectangle& aAvailableArea)
+{
+ // Save the current relative position.
+ mnHorizontalPosition = double(mpHorizontalScrollBar->GetThumbPos())
+ / double(mpHorizontalScrollBar->GetRange().Len());
+
+ // Place the scroll bar.
+ Size aScrollBarSize (mpHorizontalScrollBar->GetSizePixel());
+ mpHorizontalScrollBar->SetPosSizePixel (
+ Point(aAvailableArea.Left(),
+ aAvailableArea.Bottom()-aScrollBarSize.Height()+1),
+ Size (aAvailableArea.GetWidth() - GetVerticalScrollBarWidth(),
+ aScrollBarSize.Height()));
+
+ // Restore the relative position.
+ mpHorizontalScrollBar->SetThumbPos(
+ static_cast<::tools::Long>(0.5 + mnHorizontalPosition * mpHorizontalScrollBar->GetRange().Len()));
+}
+
+void ScrollBarManager::PlaceVerticalScrollBar (const ::tools::Rectangle& aArea)
+{
+ const sal_Int32 nThumbPosition (mpVerticalScrollBar->GetThumbPos());
+
+ // Place the scroll bar.
+ Size aScrollBarSize (mpVerticalScrollBar->GetSizePixel());
+ Point aPosition (aArea.Right()-aScrollBarSize.Width()+1, aArea.Top());
+ Size aSize (aScrollBarSize.Width(), aArea.GetHeight() - GetHorizontalScrollBarHeight());
+ mpVerticalScrollBar->SetPosSizePixel(aPosition, aSize);
+
+ // Restore the position.
+ mpVerticalScrollBar->SetThumbPos(static_cast<::tools::Long>(nThumbPosition));
+ mnVerticalPosition = nThumbPosition / double(mpVerticalScrollBar->GetRange().Len());
+}
+
+void ScrollBarManager::PlaceFiller (const ::tools::Rectangle& aArea)
+{
+ mpScrollBarFiller->SetPosSizePixel(
+ Point(
+ aArea.Right()-mpVerticalScrollBar->GetSizePixel().Width()+1,
+ aArea.Bottom()-mpHorizontalScrollBar->GetSizePixel().Height()+1),
+ Size (
+ mpVerticalScrollBar->GetSizePixel().Width(),
+ mpHorizontalScrollBar->GetSizePixel().Height()));
+}
+
+void ScrollBarManager::UpdateScrollBars(bool bUseScrolling)
+{
+ ::tools::Rectangle aModelArea (mrSlideSorter.GetView().GetModelArea());
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ Size aWindowModelSize (pWindow->PixelToLogic(pWindow->GetSizePixel()));
+
+ // The horizontal scroll bar is only shown when the window is
+ // horizontally smaller than the view.
+ if (mpHorizontalScrollBar != nullptr && mpHorizontalScrollBar->IsVisible())
+ {
+ mpHorizontalScrollBar->Show();
+ mpHorizontalScrollBar->SetRange (
+ Range(aModelArea.Left(), aModelArea.Right()));
+ mnHorizontalPosition =
+ double(mpHorizontalScrollBar->GetThumbPos())
+ / double(mpHorizontalScrollBar->GetRange().Len());
+
+ mpHorizontalScrollBar->SetVisibleSize (aWindowModelSize.Width());
+
+ const ::tools::Long nWidth (mpContentWindow->PixelToLogic(
+ mpContentWindow->GetSizePixel()).Width());
+ // Make the line size about 10% of the visible width.
+ mpHorizontalScrollBar->SetLineSize (nWidth / 10);
+ // Make the page size about 90% of the visible width.
+ mpHorizontalScrollBar->SetPageSize ((nWidth * 9) / 10);
+ }
+ else
+ {
+ mnHorizontalPosition = 0;
+ }
+
+ // The vertical scroll bar is always shown.
+ if (mpVerticalScrollBar != nullptr && mpVerticalScrollBar->IsVisible())
+ {
+ mpVerticalScrollBar->SetRange (
+ Range(aModelArea.Top(), aModelArea.Bottom()));
+ mnVerticalPosition =
+ double(mpVerticalScrollBar->GetThumbPos())
+ / double(mpVerticalScrollBar->GetRange().Len());
+
+ mpVerticalScrollBar->SetVisibleSize (aWindowModelSize.Height());
+
+ const ::tools::Long nHeight (mpContentWindow->PixelToLogic(
+ mpContentWindow->GetSizePixel()).Height());
+ // Make the line size about 10% of the visible height.
+ mpVerticalScrollBar->SetLineSize (nHeight / 10);
+ // Make the page size about 90% of the visible height.
+ mpVerticalScrollBar->SetPageSize ((nHeight * 9) / 10);
+ }
+ else
+ {
+ mnVerticalPosition = 0;
+ }
+
+ double nEps (::std::numeric_limits<double>::epsilon());
+ if (fabs(mnHorizontalPosition-pWindow->GetVisibleX()) > nEps
+ || fabs(mnVerticalPosition-pWindow->GetVisibleY()) > nEps)
+ {
+ mrSlideSorter.GetView().InvalidatePageObjectVisibilities();
+ if (bUseScrolling)
+ pWindow->SetVisibleXY(mnHorizontalPosition, mnVerticalPosition);
+ else
+ SetWindowOrigin(mnHorizontalPosition, mnVerticalPosition);
+ }
+}
+
+IMPL_LINK(ScrollBarManager, VerticalScrollBarHandler, ScrollBar*, pScrollBar, void)
+{
+ if (pScrollBar!=nullptr
+ && pScrollBar==mpVerticalScrollBar.get()
+ && pScrollBar->IsVisible()
+ && mrSlideSorter.GetContentWindow())
+ {
+ double nRelativePosition = double(pScrollBar->GetThumbPos())
+ / double(pScrollBar->GetRange().Len());
+ mrSlideSorter.GetView().InvalidatePageObjectVisibilities();
+ mrSlideSorter.GetContentWindow()->SetVisibleXY(-1, nRelativePosition);
+ mrSlideSorter.GetController().GetVisibleAreaManager().DeactivateCurrentSlideTracking();
+ }
+}
+
+IMPL_LINK(ScrollBarManager, HorizontalScrollBarHandler, ScrollBar*, pScrollBar, void)
+{
+ if (pScrollBar!=nullptr
+ && pScrollBar==mpHorizontalScrollBar.get()
+ && pScrollBar->IsVisible()
+ && mrSlideSorter.GetContentWindow())
+ {
+ double nRelativePosition = double(pScrollBar->GetThumbPos())
+ / double(pScrollBar->GetRange().Len());
+ mrSlideSorter.GetView().InvalidatePageObjectVisibilities();
+ mrSlideSorter.GetContentWindow()->SetVisibleXY(nRelativePosition, -1);
+ mrSlideSorter.GetController().GetVisibleAreaManager().DeactivateCurrentSlideTracking();
+ }
+}
+
+void ScrollBarManager::SetWindowOrigin (
+ double nHorizontalPosition,
+ double nVerticalPosition)
+{
+ mnHorizontalPosition = nHorizontalPosition;
+ mnVerticalPosition = nVerticalPosition;
+
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ Size aViewSize (pWindow->GetViewSize());
+ Point aOrigin (
+ static_cast<::tools::Long>(mnHorizontalPosition * aViewSize.Width()),
+ static_cast<::tools::Long>(mnVerticalPosition * aViewSize.Height()));
+
+ pWindow->SetWinViewPos (aOrigin);
+ pWindow->UpdateMapMode ();
+ pWindow->Invalidate ();
+}
+
+/** Determining the visibility of the scroll bars is quite complicated. The
+ visibility of one influences that of the other because showing a scroll
+ bar makes the available space smaller and may lead to the need of
+ displaying the other.
+ To solve this we test all four combinations of showing or hiding each
+ scroll bar and use the best one. The best one is that combination that
+ a) shows the least number of scroll bars with preference of showing the
+ vertical over showing the horizontal and
+ b) when not showing a scroll bar the area used by the page objects fits
+ into the available area in the scroll bars orientation.
+*/
+::tools::Rectangle ScrollBarManager::DetermineScrollBarVisibilities (
+ const ::tools::Rectangle& rAvailableArea,
+ const bool bIsHorizontalScrollBarAllowed,
+ const bool bIsVerticalScrollBarAllowed)
+{
+ // Test which combination of scroll bars is the best.
+ bool bShowHorizontal = false;
+ bool bShowVertical = false;
+ if (mrSlideSorter.GetModel().GetPageCount() == 0)
+ {
+ // No pages => no scroll bars.
+ }
+ else if (TestScrollBarVisibilities(false, false, rAvailableArea))
+ {
+ // Nothing to be done.
+ }
+ else if (bIsHorizontalScrollBarAllowed
+ && TestScrollBarVisibilities(true, false, rAvailableArea))
+ {
+ bShowHorizontal = true;
+ }
+ else if (bIsVerticalScrollBarAllowed
+ && TestScrollBarVisibilities(false, true, rAvailableArea))
+ {
+ bShowVertical = true;
+ }
+ else
+ {
+ bShowHorizontal = true;
+ bShowVertical = true;
+ }
+
+ // Make the visibility of the scroll bars permanent.
+ mpVerticalScrollBar->Show(bShowVertical);
+ mpHorizontalScrollBar->Show(bShowHorizontal);
+ mpScrollBarFiller->Show(bShowVertical && bShowHorizontal);
+
+ // Adapt the remaining space accordingly.
+ ::tools::Rectangle aRemainingSpace (rAvailableArea);
+ if (bShowVertical)
+ aRemainingSpace.AdjustRight( -(mpVerticalScrollBar->GetSizePixel().Width()) );
+ if (bShowHorizontal)
+ aRemainingSpace.AdjustBottom( -(mpHorizontalScrollBar->GetSizePixel().Height()) );
+
+ return aRemainingSpace;
+}
+
+bool ScrollBarManager::TestScrollBarVisibilities (
+ bool bHorizontalScrollBarVisible,
+ bool bVerticalScrollBarVisible,
+ const ::tools::Rectangle& rAvailableArea)
+{
+ model::SlideSorterModel& rModel (mrSlideSorter.GetModel());
+
+ // Adapt the available size by subtracting the sizes of the scroll bars
+ // visible in this combination.
+ Size aBrowserSize (rAvailableArea.GetSize());
+ if (bHorizontalScrollBarVisible)
+ aBrowserSize.AdjustHeight( -(mpHorizontalScrollBar->GetSizePixel().Height()) );
+ if (bVerticalScrollBarVisible)
+ aBrowserSize.AdjustWidth( -(mpVerticalScrollBar->GetSizePixel().Width()) );
+
+ // Tell the view to rearrange its page objects and check whether the
+ // page objects can be shown without clipping.
+ bool bRearrangeSuccess (mrSlideSorter.GetView().GetLayouter().Rearrange (
+ mrSlideSorter.GetView().GetOrientation(),
+ aBrowserSize,
+ rModel.GetPageDescriptor(0)->GetPage()->GetSize(),
+ rModel.GetPageCount()));
+
+ if (bRearrangeSuccess)
+ {
+ Size aPageSize = mrSlideSorter.GetView().GetLayouter().GetTotalBoundingBox().GetSize();
+ Size aWindowModelSize = mpContentWindow->PixelToLogic(aBrowserSize);
+
+ // The content may be clipped, i.e. not fully visible, in one
+ // direction only when the scroll bar is visible in that direction.
+ if (aPageSize.Width() > aWindowModelSize.Width())
+ if ( ! bHorizontalScrollBarVisible)
+ return false;
+ if (aPageSize.Height() > aWindowModelSize.Height())
+ if ( ! bVerticalScrollBarVisible)
+ return false;
+
+ return true;
+ }
+ else
+ return false;
+}
+
+void ScrollBarManager::SetTopLeft(const Point& rNewTopLeft)
+{
+ if (( ! mpVerticalScrollBar
+ || mpVerticalScrollBar->GetThumbPos() == rNewTopLeft.Y())
+ && ( ! mpHorizontalScrollBar
+ || mpHorizontalScrollBar->GetThumbPos() == rNewTopLeft.X()))
+ return;
+
+ // Flush pending repaints before scrolling to avoid temporary artifacts.
+ mrSlideSorter.GetContentWindow()->PaintImmediately();
+
+ if (mpVerticalScrollBar)
+ {
+ mpVerticalScrollBar->SetThumbPos(rNewTopLeft.Y());
+ mnVerticalPosition = rNewTopLeft.Y() / double(mpVerticalScrollBar->GetRange().Len());
+ }
+ if (mpHorizontalScrollBar)
+ {
+ mpHorizontalScrollBar->SetThumbPos(rNewTopLeft.X());
+ mnHorizontalPosition = rNewTopLeft.X() / double(mpHorizontalScrollBar->GetRange().Len());
+ }
+
+ mrSlideSorter.GetContentWindow()->SetVisibleXY(mnHorizontalPosition, mnVerticalPosition);
+ mrSlideSorter.GetView().InvalidatePageObjectVisibilities();
+}
+
+int ScrollBarManager::GetVerticalScrollBarWidth() const
+{
+ if (mpVerticalScrollBar != nullptr && mpVerticalScrollBar->IsVisible())
+ return mpVerticalScrollBar->GetSizePixel().Width();
+ else
+ return 0;
+}
+
+int ScrollBarManager::GetHorizontalScrollBarHeight() const
+{
+ if (mpHorizontalScrollBar != nullptr && mpHorizontalScrollBar->IsVisible())
+ return mpHorizontalScrollBar->GetSizePixel().Height();
+ else
+ return 0;
+}
+
+void ScrollBarManager::CalcAutoScrollOffset (const Point& rMouseWindowPosition)
+{
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+
+ int nDx = 0;
+ int nDy = 0;
+
+ Size aWindowSize = pWindow->GetOutputSizePixel();
+ ::tools::Rectangle aWindowArea (pWindow->GetPosPixel(), aWindowSize);
+ ::tools::Rectangle aViewPixelArea (
+ pWindow->LogicToPixel(mrSlideSorter.GetView().GetModelArea()));
+
+ if (aWindowSize.Width() > maScrollBorder.Width() * 3
+ && mpHorizontalScrollBar != nullptr
+ && mpHorizontalScrollBar->IsVisible())
+ {
+ if (rMouseWindowPosition.X() < maScrollBorder.Width()
+ && aWindowArea.Left() > aViewPixelArea.Left())
+ {
+ nDx = -1 + static_cast<int>(gnHorizontalScrollFactor
+ * (rMouseWindowPosition.X() - maScrollBorder.Width()));
+ }
+
+ if (rMouseWindowPosition.X() >= (aWindowSize.Width() - maScrollBorder.Width())
+ && aWindowArea.Right() < aViewPixelArea.Right())
+ {
+ nDx = 1 + static_cast<int>(gnHorizontalScrollFactor
+ * (rMouseWindowPosition.X() - aWindowSize.Width()
+ + maScrollBorder.Width()));
+ }
+ }
+
+ if (aWindowSize.Height() > maScrollBorder.Height() * 3
+ && aWindowSize.Height() < aViewPixelArea.GetHeight())
+ {
+ if (rMouseWindowPosition.Y() < maScrollBorder.Height()
+ && aWindowArea.Top() > aViewPixelArea.Top())
+ {
+ nDy = -1 + static_cast<int>(gnVerticalScrollFactor
+ * (rMouseWindowPosition.Y() - maScrollBorder.Height()));
+ }
+
+ if (rMouseWindowPosition.Y() >= (aWindowSize.Height() - maScrollBorder.Height())
+ && aWindowArea.Bottom() < aViewPixelArea.Bottom())
+ {
+ nDy = 1 + static_cast<int>(gnVerticalScrollFactor
+ * (rMouseWindowPosition.Y() - aWindowSize.Height()
+ + maScrollBorder.Height()));
+ }
+ }
+
+ maAutoScrollOffset = Size(nDx,nDy);
+}
+
+bool ScrollBarManager::AutoScroll (
+ const Point& rMouseWindowPosition,
+ const ::std::function<void ()>& rAutoScrollFunctor)
+{
+ maAutoScrollFunctor = rAutoScrollFunctor;
+ CalcAutoScrollOffset(rMouseWindowPosition);
+ bool bResult (true);
+ if ( ! mbIsAutoScrollActive)
+ bResult = RepeatAutoScroll();
+
+ return bResult;
+}
+
+void ScrollBarManager::StopAutoScroll()
+{
+ maAutoScrollTimer.Stop();
+ mbIsAutoScrollActive = false;
+}
+
+bool ScrollBarManager::RepeatAutoScroll()
+{
+ if (maAutoScrollOffset != Size(0,0))
+ {
+ if (mrSlideSorter.GetViewShell() != nullptr)
+ {
+ mrSlideSorter.GetViewShell()->Scroll(
+ maAutoScrollOffset.Width(),
+ maAutoScrollOffset.Height());
+ mrSlideSorter.GetView().InvalidatePageObjectVisibilities();
+
+ if (maAutoScrollFunctor)
+ maAutoScrollFunctor();
+
+ mbIsAutoScrollActive = true;
+ maAutoScrollTimer.Start();
+
+ return true;
+ }
+ }
+
+ clearAutoScrollFunctor();
+ mbIsAutoScrollActive = false;
+ return false;
+}
+
+void ScrollBarManager::clearAutoScrollFunctor()
+{
+ maAutoScrollFunctor = ::std::function<void ()>();
+}
+
+IMPL_LINK_NOARG(ScrollBarManager, AutoScrollTimeoutHandler, Timer *, void)
+{
+ RepeatAutoScroll();
+}
+
+void ScrollBarManager::Scroll(
+ const Orientation eOrientation,
+ const sal_Int32 nDistance)
+{
+ bool bIsVertical (false);
+ switch (eOrientation)
+ {
+ case Orientation_Horizontal: bIsVertical = false; break;
+ case Orientation_Vertical: bIsVertical = true; break;
+ default:
+ OSL_ASSERT(eOrientation==Orientation_Horizontal || eOrientation==Orientation_Vertical);
+ return;
+ }
+
+ Point aNewTopLeft (
+ mpHorizontalScrollBar ? mpHorizontalScrollBar->GetThumbPos() : 0,
+ mpVerticalScrollBar ? mpVerticalScrollBar->GetThumbPos() : 0);
+
+ view::Layouter& rLayouter (mrSlideSorter.GetView().GetLayouter());
+
+ // Calculate estimate of new location.
+ if (bIsVertical)
+ aNewTopLeft.AdjustY(nDistance * rLayouter.GetPageObjectSize().Height() );
+ else
+ aNewTopLeft.AdjustX(nDistance * rLayouter.GetPageObjectSize().Width() );
+
+ // Adapt location to show whole slides.
+ if (bIsVertical)
+ if (nDistance > 0)
+ {
+ const sal_Int32 nIndex (rLayouter.GetIndexAtPoint(
+ Point(aNewTopLeft.X(), aNewTopLeft.Y()+mpVerticalScrollBar->GetVisibleSize()),
+ true));
+ aNewTopLeft.setY( rLayouter.GetPageObjectBox(nIndex,true).Bottom()
+ - mpVerticalScrollBar->GetVisibleSize() );
+ }
+ else
+ {
+ const sal_Int32 nIndex (rLayouter.GetIndexAtPoint(
+ Point(aNewTopLeft.X(), aNewTopLeft.Y()),
+ true));
+ aNewTopLeft.setY( rLayouter.GetPageObjectBox(nIndex,true).Top() );
+ }
+ else
+ if (nDistance > 0)
+ {
+ const sal_Int32 nIndex (rLayouter.GetIndexAtPoint(
+ Point(aNewTopLeft.X()+mpVerticalScrollBar->GetVisibleSize(), aNewTopLeft.Y()),
+ true));
+ aNewTopLeft.setX( rLayouter.GetPageObjectBox(nIndex,true).Right()
+ - mpVerticalScrollBar->GetVisibleSize() );
+ }
+ else
+ {
+ const sal_Int32 nIndex (rLayouter.GetIndexAtPoint(
+ Point(aNewTopLeft.X(), aNewTopLeft.Y()),
+ true));
+ aNewTopLeft.setX( rLayouter.GetPageObjectBox(nIndex,true).Left() );
+ }
+
+ mrSlideSorter.GetController().GetVisibleAreaManager().DeactivateCurrentSlideTracking();
+ SetTopLeft(aNewTopLeft);
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx b/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx
new file mode 100644
index 000000000..c710a4c1b
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx
@@ -0,0 +1,1485 @@
+/* -*- 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 <memory>
+#include <sal/config.h>
+
+#include <controller/SlsSelectionFunction.hxx>
+
+#include <SlideSorter.hxx>
+#include <SlideSorterViewShell.hxx>
+#include "SlsDragAndDropContext.hxx"
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsFocusManager.hxx>
+#include <controller/SlsScrollBarManager.hxx>
+#include <controller/SlsClipboard.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <controller/SlsInsertionIndicatorHandler.hxx>
+#include <controller/SlsSelectionManager.hxx>
+#include <controller/SlsProperties.hxx>
+#include <controller/SlsVisibleAreaManager.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsLayouter.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <osl/diagnose.h>
+#include <Window.hxx>
+#include <sdpage.hxx>
+#include <drawdoc.hxx>
+#include <sdxfer.hxx>
+#include <ViewShell.hxx>
+#include <FrameView.hxx>
+#include <app.hrc>
+#include <o3tl/deleter.hxx>
+#include <sfx2/dispatch.hxx>
+#include <vcl/ptrstyle.hxx>
+#include <optional>
+#include <sdmod.hxx>
+
+namespace {
+const sal_uInt32 SINGLE_CLICK (0x00000001);
+const sal_uInt32 DOUBLE_CLICK (0x00000002);
+const sal_uInt32 LEFT_BUTTON (0x00000010);
+const sal_uInt32 RIGHT_BUTTON (0x00000020);
+const sal_uInt32 MIDDLE_BUTTON (0x00000040);
+const sal_uInt32 BUTTON_DOWN (0x00000100);
+const sal_uInt32 BUTTON_UP (0x00000200);
+const sal_uInt32 MOUSE_MOTION (0x00000400);
+const sal_uInt32 MOUSE_DRAG (0x00000800);
+// The rest leaves the lower 16 bit untouched so that it can be used with
+// key codes.
+const sal_uInt32 OVER_SELECTED_PAGE (0x00010000);
+const sal_uInt32 OVER_UNSELECTED_PAGE (0x00020000);
+const sal_uInt32 SHIFT_MODIFIER (0x00200000);
+const sal_uInt32 CONTROL_MODIFIER (0x00400000);
+
+// Some absent events are defined so they can be expressed explicitly.
+const sal_uInt32 NO_MODIFIER (0x00000000);
+const sal_uInt32 NOT_OVER_PAGE (0x00000000);
+
+// Masks
+const sal_uInt32 MODIFIER_MASK (SHIFT_MODIFIER | CONTROL_MODIFIER);
+
+} // end of anonymous namespace
+
+// Define some macros to make the following switch statement more readable.
+#define ANY_MODIFIER(code) \
+ code|NO_MODIFIER: \
+ case code|SHIFT_MODIFIER: \
+ case code|CONTROL_MODIFIER
+
+namespace sd::slidesorter::controller {
+
+//===== SelectionFunction::EventDescriptor ====================================
+
+class SelectionFunction::EventDescriptor
+{
+public:
+ Point maMousePosition;
+ Point maMouseModelPosition;
+ model::SharedPageDescriptor mpHitDescriptor;
+ SdrPage* mpHitPage;
+ sal_uInt32 mnEventCode;
+ InsertionIndicatorHandler::Mode meDragMode;
+ bool mbIsLeaving;
+
+ EventDescriptor (
+ sal_uInt32 nEventType,
+ const MouseEvent& rEvent,
+ SlideSorter const & rSlideSorter);
+ EventDescriptor (
+ sal_uInt32 nEventType,
+ const AcceptDropEvent& rEvent,
+ const sal_Int8 nDragAction,
+ SlideSorter const & rSlideSorter);
+
+private:
+ /** Compute a numerical code that describes a mouse event and that can
+ be used for fast look up of the appropriate reaction.
+ */
+ sal_uInt32 EncodeMouseEvent (const MouseEvent& rEvent) const;
+
+ /** Compute a numerical code that describes the current state like
+ whether the selection rectangle is visible or whether the page under
+ the mouse or the one that has the focus is selected.
+ */
+ sal_uInt32 EncodeState() const;
+};
+
+//===== SelectionFunction::ModeHandler ========================================
+
+class SelectionFunction::ModeHandler
+{
+public:
+ ModeHandler (
+ SlideSorter& rSlideSorter,
+ SelectionFunction& rSelectionFunction,
+ const bool bIsMouseOverIndicatorAllowed);
+ virtual ~ModeHandler() COVERITY_NOEXCEPT_FALSE;
+
+ virtual Mode GetMode() const = 0;
+ virtual void Abort() = 0;
+ virtual void ProcessEvent (EventDescriptor& rDescriptor);
+
+ /** Set the selection to exactly the specified page and also set it as
+ the current page.
+ */
+ void SetCurrentPage (const model::SharedPageDescriptor& rpDescriptor);
+
+ /// Deselect all pages.
+ void DeselectAllPages();
+ void SelectOnePage (const model::SharedPageDescriptor& rpDescriptor);
+
+ /** When the view on which this selection function is working is the
+ main view then the view is switched to the regular editing view.
+ */
+ void SwitchView (const model::SharedPageDescriptor& rpDescriptor);
+
+ void StartDrag (
+ const Point& rMousePosition);
+
+ bool IsMouseOverIndicatorAllowed() const { return mbIsMouseOverIndicatorAllowed;}
+
+protected:
+ SlideSorter& mrSlideSorter;
+ SelectionFunction& mrSelectionFunction;
+
+ virtual bool ProcessButtonDownEvent (EventDescriptor& rDescriptor);
+ virtual bool ProcessButtonUpEvent (EventDescriptor& rDescriptor);
+ virtual bool ProcessMotionEvent (EventDescriptor& rDescriptor);
+ virtual bool ProcessDragEvent (EventDescriptor& rDescriptor);
+ virtual bool HandleUnprocessedEvent (EventDescriptor& rDescriptor);
+
+ void ReprocessEvent (EventDescriptor& rDescriptor);
+
+private:
+ const bool mbIsMouseOverIndicatorAllowed;
+};
+
+namespace {
+
+/** This is the default handler for processing events. It activates the
+ multi selection or drag-and-drop when the right conditions are met.
+*/
+class NormalModeHandler : public SelectionFunction::ModeHandler
+{
+public:
+ NormalModeHandler (
+ SlideSorter& rSlideSorter,
+ SelectionFunction& rSelectionFunction);
+
+ virtual SelectionFunction::Mode GetMode() const override;
+ virtual void Abort() override;
+
+ void ResetButtonDownLocation();
+
+protected:
+ virtual bool ProcessButtonDownEvent (SelectionFunction::EventDescriptor& rDescriptor) override;
+ virtual bool ProcessButtonUpEvent (SelectionFunction::EventDescriptor& rDescriptor) override;
+ virtual bool ProcessMotionEvent (SelectionFunction::EventDescriptor& rDescriptor) override;
+ virtual bool ProcessDragEvent (SelectionFunction::EventDescriptor& rDescriptor) override;
+
+private:
+ ::std::optional<Point> maButtonDownLocation;
+
+ /** Select all pages between and including the selection anchor and the
+ specified page.
+ */
+ void RangeSelect (const model::SharedPageDescriptor& rpDescriptor);
+};
+
+/** Handle events during a multi selection, which typically is started by
+ pressing the left mouse button when not over a page.
+*/
+class MultiSelectionModeHandler : public SelectionFunction::ModeHandler
+{
+public:
+ /** Start a rectangle selection at the given position.
+ */
+ MultiSelectionModeHandler (
+ SlideSorter& rSlideSorter,
+ SelectionFunction& rSelectionFunction,
+ const Point& rMouseModelPosition,
+ const sal_uInt32 nEventCode);
+
+ virtual ~MultiSelectionModeHandler() override;
+
+ virtual SelectionFunction::Mode GetMode() const override;
+ virtual void Abort() override;
+ virtual void ProcessEvent (SelectionFunction::EventDescriptor& rDescriptor) override;
+
+ enum SelectionMode { SM_Normal, SM_Add, SM_Toggle };
+
+ void SetSelectionMode (const SelectionMode eSelectionMode);
+ void SetSelectionModeFromModifier (const sal_uInt32 nEventCode);
+
+protected:
+ virtual bool ProcessButtonUpEvent (SelectionFunction::EventDescriptor& rDescriptor) override;
+ virtual bool ProcessMotionEvent (SelectionFunction::EventDescriptor& rDescriptor) override;
+ virtual bool HandleUnprocessedEvent (SelectionFunction::EventDescriptor& rDescriptor) override;
+
+private:
+ SelectionMode meSelectionMode;
+ Point maSecondCorner;
+ PointerStyle maSavedPointer;
+ bool mbAutoScrollInstalled;
+ sal_Int32 mnAnchorIndex;
+ sal_Int32 mnSecondIndex;
+
+ void UpdateModelPosition (const Point& rMouseModelPosition);
+ void UpdateSelection();
+
+ /** Update the rectangle selection so that the given position becomes
+ the new second point of the selection rectangle.
+ */
+ void UpdatePosition (
+ const Point& rMousePosition,
+ const bool bAllowAutoScroll);
+
+ void UpdateSelectionState (
+ const model::SharedPageDescriptor& rpDescriptor,
+ const bool bIsInSelection) const;
+};
+
+/** Handle events during drag-and-drop.
+*/
+class DragAndDropModeHandler : public SelectionFunction::ModeHandler
+{
+public:
+ DragAndDropModeHandler (
+ SlideSorter& rSlideSorter,
+ SelectionFunction& rSelectionFunction,
+ const Point& rMousePosition,
+ vcl::Window* pWindow);
+ virtual ~DragAndDropModeHandler() override;
+
+ virtual SelectionFunction::Mode GetMode() const override;
+ virtual void Abort() override;
+
+protected:
+ virtual bool ProcessButtonUpEvent (SelectionFunction::EventDescriptor& rDescriptor) override;
+ virtual bool ProcessDragEvent (SelectionFunction::EventDescriptor& rDescriptor) override;
+
+private:
+ std::unique_ptr<DragAndDropContext, o3tl::default_delete<DragAndDropContext>> mpDragAndDropContext;
+};
+
+}
+
+//===== SelectionFunction =====================================================
+
+
+SelectionFunction::SelectionFunction (
+ SlideSorter& rSlideSorter,
+ SfxRequest& rRequest)
+ : FuPoor (
+ rSlideSorter.GetViewShell(),
+ rSlideSorter.GetContentWindow(),
+ &rSlideSorter.GetView(),
+ rSlideSorter.GetModel().GetDocument(),
+ rRequest),
+ mrSlideSorter(rSlideSorter),
+ mrController(mrSlideSorter.GetController()),
+ mnShiftKeySelectionAnchor(-1),
+ mpModeHandler(std::make_shared<NormalModeHandler>(rSlideSorter, *this))
+{
+}
+
+SelectionFunction::~SelectionFunction()
+{
+ mpModeHandler.reset();
+}
+
+rtl::Reference<FuPoor> SelectionFunction::Create(
+ SlideSorter& rSlideSorter,
+ SfxRequest& rRequest)
+{
+ rtl::Reference<FuPoor> xFunc( new SelectionFunction( rSlideSorter, rRequest ) );
+ return xFunc;
+}
+
+bool SelectionFunction::MouseButtonDown (const MouseEvent& rEvent)
+{
+ // remember button state for creation of own MouseEvents
+ SetMouseButtonCode (rEvent.GetButtons());
+ aMDPos = rEvent.GetPosPixel();
+
+ // mpWindow->CaptureMouse();
+
+ ProcessMouseEvent(BUTTON_DOWN, rEvent);
+
+ return true;
+}
+
+bool SelectionFunction::MouseMove (const MouseEvent& rEvent)
+{
+ ProcessMouseEvent(MOUSE_MOTION, rEvent);
+ return true;
+}
+
+bool SelectionFunction::MouseButtonUp (const MouseEvent& rEvent)
+{
+ mrController.GetScrollBarManager().StopAutoScroll ();
+
+ ProcessMouseEvent(BUTTON_UP, rEvent);
+
+ return true;
+}
+
+void SelectionFunction::NotifyDragFinished()
+{
+ SwitchToNormalMode();
+}
+
+bool SelectionFunction::KeyInput (const KeyEvent& rEvent)
+{
+ view::SlideSorterView::DrawLock aDrawLock (mrSlideSorter);
+ PageSelector::BroadcastLock aBroadcastLock (mrSlideSorter);
+ PageSelector::UpdateLock aLock (mrSlideSorter);
+ FocusManager& rFocusManager (mrController.GetFocusManager());
+ bool bResult = false;
+
+ const vcl::KeyCode& rCode (rEvent.GetKeyCode());
+ switch (rCode.GetCode())
+ {
+ case KEY_RETURN:
+ {
+ model::SharedPageDescriptor pDescriptor (rFocusManager.GetFocusedPageDescriptor());
+ ViewShell* pViewShell = mrSlideSorter.GetViewShell();
+ if (rFocusManager.HasFocus() && pDescriptor && pViewShell!=nullptr)
+ {
+ // The Return key triggers different functions depending on
+ // whether the slide sorter is the main view or displayed in
+ // the right pane.
+ if (pViewShell->IsMainViewShell())
+ {
+ mpModeHandler->SetCurrentPage(pDescriptor);
+ mpModeHandler->SwitchView(pDescriptor);
+ }
+ else if (pViewShell->GetDispatcher() != nullptr)
+ {
+ pViewShell->GetDispatcher()->Execute(
+ SID_INSERTPAGE,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ }
+ bResult = true;
+ }
+ break;
+ }
+
+ case KEY_TAB:
+ if ( ! rFocusManager.IsFocusShowing())
+ {
+ rFocusManager.ShowFocus();
+ bResult = true;
+ }
+ break;
+
+ case KEY_ESCAPE:
+ // When there is an active multiselection or drag-and-drop
+ // operation then stop that.
+ mpModeHandler->Abort();
+ SwitchToNormalMode();
+ bResult = true;
+ break;
+
+ case KEY_SPACE:
+ {
+ // Toggle the selection state.
+ model::SharedPageDescriptor pDescriptor (rFocusManager.GetFocusedPageDescriptor());
+ if (pDescriptor && rCode.IsMod1())
+ {
+ if (pDescriptor->HasState(model::PageDescriptor::ST_Selected))
+ mrController.GetPageSelector().DeselectPage(pDescriptor, false);
+ else
+ mrController.GetPageSelector().SelectPage(pDescriptor);
+ }
+ bResult = true;
+ }
+ break;
+
+ // Move the focus indicator left.
+ case KEY_LEFT:
+ MoveFocus(FocusManager::FocusMoveDirection::Left, rCode.IsShift(), rCode.IsMod1());
+ bResult = true;
+ break;
+
+ // Move the focus indicator right.
+ case KEY_RIGHT:
+ MoveFocus(FocusManager::FocusMoveDirection::Right, rCode.IsShift(), rCode.IsMod1());
+ bResult = true;
+ break;
+
+ // Move the focus indicator up.
+ case KEY_UP:
+ MoveFocus(FocusManager::FocusMoveDirection::Up, rCode.IsShift(), rCode.IsMod1());
+ bResult = true;
+ break;
+
+ // Move the focus indicator down.
+ case KEY_DOWN:
+ MoveFocus(FocusManager::FocusMoveDirection::Down, rCode.IsShift(), rCode.IsMod1());
+ bResult = true;
+ break;
+
+ // Go to previous page. No wrap around.
+ case KEY_PAGEUP:
+ GotoNextPage(-1);
+ bResult = true;
+ break;
+
+ // Go to next page. No wrap around...
+ case KEY_PAGEDOWN:
+ GotoNextPage(+1);
+ bResult = true;
+ break;
+
+ case KEY_HOME:
+ GotoPage(0);
+ bResult = true;
+ break;
+
+ case KEY_END:
+ GotoPage(mrSlideSorter.GetModel().GetPageCount()-1);
+ bResult = true;
+ break;
+
+ case KEY_DELETE:
+ case KEY_BACKSPACE:
+ {
+ if (mrSlideSorter.GetProperties()->IsUIReadOnly())
+ break;
+
+ mrController.GetSelectionManager()->DeleteSelectedPages(rCode.GetCode()==KEY_DELETE);
+
+ mnShiftKeySelectionAnchor = -1;
+ bResult = true;
+ }
+ break;
+
+ case KEY_F10:
+ if (rCode.IsShift())
+ {
+ mpModeHandler->SelectOnePage(
+ mrSlideSorter.GetController().GetFocusManager().GetFocusedPageDescriptor());
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if ( ! bResult)
+ bResult = FuPoor::KeyInput(rEvent);
+
+ return bResult;
+}
+
+void SelectionFunction::MoveFocus (
+ const FocusManager::FocusMoveDirection eDirection,
+ const bool bIsShiftDown,
+ const bool bIsControlDown)
+{
+ // Remember the anchor of shift key multi selection.
+ if (bIsShiftDown)
+ {
+ if (mnShiftKeySelectionAnchor<0)
+ {
+ model::SharedPageDescriptor pFocusedDescriptor (
+ mrController.GetFocusManager().GetFocusedPageDescriptor());
+ mnShiftKeySelectionAnchor = pFocusedDescriptor->GetPageIndex();
+ }
+ }
+ else if ( ! bIsControlDown)
+ ResetShiftKeySelectionAnchor();
+
+ mrController.GetFocusManager().MoveFocus(eDirection);
+
+ PageSelector& rSelector (mrController.GetPageSelector());
+ model::SharedPageDescriptor pFocusedDescriptor (
+ mrController.GetFocusManager().GetFocusedPageDescriptor());
+ if (bIsShiftDown)
+ {
+ // When shift is pressed then select all pages in the range between
+ // the currently and the previously focused pages, including them.
+ if (pFocusedDescriptor)
+ {
+ sal_Int32 nPageRangeEnd (pFocusedDescriptor->GetPageIndex());
+ model::PageEnumeration aPages (
+ model::PageEnumerationProvider::CreateAllPagesEnumeration(
+ mrSlideSorter.GetModel()));
+ while (aPages.HasMoreElements())
+ {
+ model::SharedPageDescriptor pDescriptor (aPages.GetNextElement());
+ if (pDescriptor)
+ {
+ const sal_Int32 nPageIndex(pDescriptor->GetPageIndex());
+ if ((nPageIndex>=mnShiftKeySelectionAnchor && nPageIndex<=nPageRangeEnd)
+ || (nPageIndex<=mnShiftKeySelectionAnchor && nPageIndex>=nPageRangeEnd))
+ {
+ rSelector.SelectPage(pDescriptor);
+ }
+ else
+ {
+ rSelector.DeselectPage(pDescriptor);
+ }
+ }
+ }
+ }
+ }
+ else if (bIsControlDown)
+ {
+ // When control is pressed then do not alter the selection or the
+ // current page, just move the focus.
+ }
+ else
+ {
+ // Without shift just select the focused page.
+ mpModeHandler->SelectOnePage(pFocusedDescriptor);
+ }
+}
+
+void SelectionFunction::DoCut()
+{
+ if ( ! mrSlideSorter.GetProperties()->IsUIReadOnly())
+ {
+ mrController.GetClipboard().DoCut();
+ }
+}
+
+void SelectionFunction::DoCopy()
+{
+ mrController.GetClipboard().DoCopy();
+}
+
+void SelectionFunction::DoPaste()
+{
+ if ( ! mrSlideSorter.GetProperties()->IsUIReadOnly())
+ {
+ mrController.GetClipboard().DoPaste();
+ }
+}
+
+bool SelectionFunction::cancel()
+{
+ mrController.GetFocusManager().ToggleFocus();
+ return true;
+}
+
+void SelectionFunction::GotoNextPage (int nOffset)
+{
+ model::SharedPageDescriptor pDescriptor
+ = mrController.GetCurrentSlideManager()->GetCurrentSlide();
+ if (pDescriptor)
+ {
+ SdPage* pPage = pDescriptor->GetPage();
+ OSL_ASSERT(pPage!=nullptr);
+ sal_Int32 nIndex = (pPage->GetPageNum()-1) / 2;
+ GotoPage(nIndex + nOffset);
+ }
+ ResetShiftKeySelectionAnchor();
+}
+
+void SelectionFunction::GotoPage (int nIndex)
+{
+ sal_uInt16 nPageCount = static_cast<sal_uInt16>(mrSlideSorter.GetModel().GetPageCount());
+
+ if (nIndex >= nPageCount)
+ nIndex = nPageCount - 1;
+ if (nIndex < 0)
+ nIndex = 0;
+
+ mrController.GetFocusManager().SetFocusedPage(nIndex);
+ model::SharedPageDescriptor pNextPageDescriptor (
+ mrSlideSorter.GetModel().GetPageDescriptor (nIndex));
+ if (pNextPageDescriptor)
+ mpModeHandler->SetCurrentPage(pNextPageDescriptor);
+ else
+ {
+ OSL_ASSERT(pNextPageDescriptor);
+ }
+ ResetShiftKeySelectionAnchor();
+}
+
+void SelectionFunction::ProcessMouseEvent (sal_uInt32 nEventType, const MouseEvent& rEvent)
+{
+ // #95491# remember button state for creation of own MouseEvents
+ SetMouseButtonCode (rEvent.GetButtons());
+
+ EventDescriptor aEventDescriptor (nEventType, rEvent, mrSlideSorter);
+ ProcessEvent(aEventDescriptor);
+}
+
+void SelectionFunction::MouseDragged (
+ const AcceptDropEvent& rEvent,
+ const sal_Int8 nDragAction)
+{
+ EventDescriptor aEventDescriptor (MOUSE_DRAG, rEvent, nDragAction, mrSlideSorter);
+ ProcessEvent(aEventDescriptor);
+}
+
+void SelectionFunction::ProcessEvent (EventDescriptor& rDescriptor)
+{
+ // The call to ProcessEvent may switch to another mode handler.
+ // Prevent the untimely destruction of the called handler by acquiring a
+ // temporary reference here.
+ std::shared_ptr<ModeHandler> pModeHandler (mpModeHandler);
+ pModeHandler->ProcessEvent(rDescriptor);
+}
+
+static bool Match (
+ const sal_uInt32 nEventCode,
+ const sal_uInt32 nPositivePattern)
+{
+ return (nEventCode & nPositivePattern)==nPositivePattern;
+}
+
+void SelectionFunction::SwitchToNormalMode()
+{
+ if (mpModeHandler->GetMode() != NormalMode)
+ SwitchMode(std::make_shared<NormalModeHandler>(mrSlideSorter, *this));
+}
+
+void SelectionFunction::SwitchToDragAndDropMode (const Point& rMousePosition)
+{
+ if (mpModeHandler->GetMode() == DragAndDropMode)
+ return;
+
+ SwitchMode(std::make_shared<DragAndDropModeHandler>(mrSlideSorter, *this, rMousePosition, mpWindow));
+}
+
+void SelectionFunction::SwitchToMultiSelectionMode (
+ const Point& rMousePosition,
+ const sal_uInt32 nEventCode)
+{
+ if (mpModeHandler->GetMode() != MultiSelectionMode)
+ SwitchMode(std::make_shared<MultiSelectionModeHandler>(mrSlideSorter, *this, rMousePosition, nEventCode));
+}
+
+void SelectionFunction::SwitchMode (const std::shared_ptr<ModeHandler>& rpHandler)
+{
+ // Not all modes allow mouse over indicator.
+ if (mpModeHandler->IsMouseOverIndicatorAllowed() != rpHandler->IsMouseOverIndicatorAllowed())
+ {
+ if ( ! rpHandler->IsMouseOverIndicatorAllowed())
+ {
+ mrSlideSorter.GetView().SetPageUnderMouse(model::SharedPageDescriptor());
+ }
+ else
+ mrSlideSorter.GetView().UpdatePageUnderMouse();
+ }
+
+ mpModeHandler = rpHandler;
+}
+
+void SelectionFunction::ResetShiftKeySelectionAnchor()
+{
+ mnShiftKeySelectionAnchor = -1;
+}
+
+void SelectionFunction::ResetMouseAnchor()
+{
+ if (mpModeHandler && mpModeHandler->GetMode() == NormalMode)
+ {
+ std::shared_ptr<NormalModeHandler> pHandler (
+ std::dynamic_pointer_cast<NormalModeHandler>(mpModeHandler));
+ if (pHandler)
+ pHandler->ResetButtonDownLocation();
+ }
+}
+
+//===== EventDescriptor =======================================================
+
+SelectionFunction::EventDescriptor::EventDescriptor (
+ const sal_uInt32 nEventType,
+ const MouseEvent& rEvent,
+ SlideSorter const & rSlideSorter)
+ : maMousePosition(rEvent.GetPosPixel()),
+ mpHitPage(),
+ mnEventCode(nEventType),
+ meDragMode(InsertionIndicatorHandler::MoveMode),
+ mbIsLeaving(false)
+{
+ maMouseModelPosition = rSlideSorter.GetContentWindow()->PixelToLogic(maMousePosition);
+ mpHitDescriptor = rSlideSorter.GetController().GetPageAt(maMousePosition);
+ if (mpHitDescriptor)
+ {
+ mpHitPage = mpHitDescriptor->GetPage();
+ }
+
+ mnEventCode |= EncodeMouseEvent(rEvent);
+ mnEventCode |= EncodeState();
+
+ // Detect the mouse leaving the window. When not button is pressed then
+ // we can call IsLeaveWindow at the event. Otherwise we have to make an
+ // explicit test.
+ mbIsLeaving = rEvent.IsLeaveWindow()
+ || ! ::tools::Rectangle(Point(0,0),
+ rSlideSorter.GetContentWindow()->GetOutputSizePixel()).Contains(maMousePosition);
+}
+
+SelectionFunction::EventDescriptor::EventDescriptor (
+ const sal_uInt32 nEventType,
+ const AcceptDropEvent& rEvent,
+ const sal_Int8 nDragAction,
+ SlideSorter const & rSlideSorter)
+ : maMousePosition(rEvent.maPosPixel),
+ mpHitPage(),
+ mnEventCode(nEventType),
+ meDragMode(InsertionIndicatorHandler::GetModeFromDndAction(nDragAction)),
+ mbIsLeaving(false)
+{
+ maMouseModelPosition = rSlideSorter.GetContentWindow()->PixelToLogic(maMousePosition);
+ mpHitDescriptor = rSlideSorter.GetController().GetPageAt(maMousePosition);
+ if (mpHitDescriptor)
+ {
+ mpHitPage = mpHitDescriptor->GetPage();
+ }
+
+ mnEventCode |= EncodeState();
+
+ // Detect the mouse leaving the window. When not button is pressed then
+ // we can call IsLeaveWindow at the event. Otherwise we have to make an
+ // explicit test.
+ mbIsLeaving = rEvent.mbLeaving
+ || ! ::tools::Rectangle(Point(0,0),
+ rSlideSorter.GetContentWindow()->GetOutputSizePixel()).Contains(maMousePosition);
+}
+
+sal_uInt32 SelectionFunction::EventDescriptor::EncodeMouseEvent (
+ const MouseEvent& rEvent) const
+{
+ // Initialize with the type of mouse event.
+ sal_uInt32 nEventCode (mnEventCode & (BUTTON_DOWN | BUTTON_UP | MOUSE_MOTION));
+
+ // Detect the affected button.
+ switch (rEvent.GetButtons())
+ {
+ case MOUSE_LEFT: nEventCode |= LEFT_BUTTON; break;
+ case MOUSE_RIGHT: nEventCode |= RIGHT_BUTTON; break;
+ case MOUSE_MIDDLE: nEventCode |= MIDDLE_BUTTON; break;
+ }
+
+ // Detect the number of clicks.
+ switch (rEvent.GetClicks())
+ {
+ case 1: nEventCode |= SINGLE_CLICK; break;
+ case 2: nEventCode |= DOUBLE_CLICK; break;
+ }
+
+ // Detect pressed modifier keys.
+ if (rEvent.IsShift())
+ nEventCode |= SHIFT_MODIFIER;
+ if (rEvent.IsMod1())
+ nEventCode |= CONTROL_MODIFIER;
+
+ return nEventCode;
+}
+
+sal_uInt32 SelectionFunction::EventDescriptor::EncodeState() const
+{
+ sal_uInt32 nEventCode (0);
+
+ // Detect whether the event has happened over a page object.
+ if (mpHitPage!=nullptr && mpHitDescriptor)
+ {
+ if (mpHitDescriptor->HasState(model::PageDescriptor::ST_Selected))
+ nEventCode |= OVER_SELECTED_PAGE;
+ else
+ nEventCode |= OVER_UNSELECTED_PAGE;
+ }
+
+ return nEventCode;
+}
+
+//===== SelectionFunction::ModeHandler ========================================
+
+SelectionFunction::ModeHandler::ModeHandler (
+ SlideSorter& rSlideSorter,
+ SelectionFunction& rSelectionFunction,
+ const bool bIsMouseOverIndicatorAllowed)
+ : mrSlideSorter(rSlideSorter),
+ mrSelectionFunction(rSelectionFunction),
+ mbIsMouseOverIndicatorAllowed(bIsMouseOverIndicatorAllowed)
+{
+}
+
+SelectionFunction::ModeHandler::~ModeHandler() COVERITY_NOEXCEPT_FALSE
+{
+}
+
+void SelectionFunction::ModeHandler::ReprocessEvent (EventDescriptor& rDescriptor)
+{
+ mrSelectionFunction.ProcessEvent(rDescriptor);
+}
+
+void SelectionFunction::ModeHandler::ProcessEvent (
+ SelectionFunction::EventDescriptor& rDescriptor)
+{
+ PageSelector::BroadcastLock aBroadcastLock (mrSlideSorter);
+ PageSelector::UpdateLock aUpdateLock (mrSlideSorter);
+
+ bool bIsProcessed (false);
+ switch (rDescriptor.mnEventCode & (BUTTON_DOWN | BUTTON_UP | MOUSE_MOTION | MOUSE_DRAG))
+ {
+ case BUTTON_DOWN:
+ bIsProcessed = ProcessButtonDownEvent(rDescriptor);
+ break;
+
+ case BUTTON_UP:
+ bIsProcessed = ProcessButtonUpEvent(rDescriptor);
+ break;
+
+ case MOUSE_MOTION:
+ bIsProcessed = ProcessMotionEvent(rDescriptor);
+ break;
+
+ case MOUSE_DRAG:
+ bIsProcessed = ProcessDragEvent(rDescriptor);
+ break;
+ }
+
+ if ( ! bIsProcessed)
+ HandleUnprocessedEvent(rDescriptor);
+}
+
+bool SelectionFunction::ModeHandler::ProcessButtonDownEvent (EventDescriptor&)
+{
+ return false;
+}
+
+bool SelectionFunction::ModeHandler::ProcessButtonUpEvent (EventDescriptor&)
+{
+ mrSelectionFunction.SwitchToNormalMode();
+ return false;
+}
+
+bool SelectionFunction::ModeHandler::ProcessMotionEvent (EventDescriptor& rDescriptor)
+{
+ if (mbIsMouseOverIndicatorAllowed)
+ mrSlideSorter.GetView().UpdatePageUnderMouse(rDescriptor.maMousePosition);
+
+ if (rDescriptor.mbIsLeaving)
+ {
+ mrSelectionFunction.SwitchToNormalMode();
+ mrSlideSorter.GetView().SetPageUnderMouse(model::SharedPageDescriptor());
+
+ return true;
+ }
+ else
+ return false;
+}
+
+bool SelectionFunction::ModeHandler::ProcessDragEvent (EventDescriptor&)
+{
+ return false;
+}
+
+bool SelectionFunction::ModeHandler::HandleUnprocessedEvent (EventDescriptor&)
+{
+ return false;
+}
+
+void SelectionFunction::ModeHandler::SetCurrentPage (
+ const model::SharedPageDescriptor& rpDescriptor)
+{
+ SelectOnePage(rpDescriptor);
+ mrSlideSorter.GetController().GetCurrentSlideManager()->SwitchCurrentSlide(rpDescriptor);
+}
+
+void SelectionFunction::ModeHandler::DeselectAllPages()
+{
+ mrSlideSorter.GetController().GetPageSelector().DeselectAllPages();
+ mrSelectionFunction.ResetShiftKeySelectionAnchor();
+}
+
+void SelectionFunction::ModeHandler::SelectOnePage (
+ const model::SharedPageDescriptor& rpDescriptor)
+{
+ DeselectAllPages();
+ mrSlideSorter.GetController().GetPageSelector().SelectPage(rpDescriptor);
+}
+
+void SelectionFunction::ModeHandler::SwitchView (const model::SharedPageDescriptor& rpDescriptor)
+{
+ // Switch to the draw view. This is done only when the current
+ // view is the main view.
+ ViewShell* pViewShell = mrSlideSorter.GetViewShell();
+ if (pViewShell==nullptr || !pViewShell->IsMainViewShell())
+ return;
+
+ if (rpDescriptor && rpDescriptor->GetPage()!=nullptr)
+ {
+ mrSlideSorter.GetModel().GetDocument()->SetSelected(rpDescriptor->GetPage(), true);
+ pViewShell->GetFrameView()->SetSelectedPage(
+ (rpDescriptor->GetPage()->GetPageNum()-1)/2);
+ }
+ if (mrSlideSorter.GetViewShellBase() != nullptr)
+ framework::FrameworkHelper::Instance(*mrSlideSorter.GetViewShellBase())->RequestView(
+ framework::FrameworkHelper::msImpressViewURL,
+ framework::FrameworkHelper::msCenterPaneURL);
+}
+
+void SelectionFunction::ModeHandler::StartDrag (
+ const Point& rMousePosition)
+{
+ // Do not start a drag-and-drop operation when one is already active.
+ // (when dragging pages from one document into another, pressing a
+ // modifier key can trigger a MouseMotion event in the originating
+ // window (focus still in there). Together with the mouse button pressed
+ // (drag-and-drop is active) this triggers the start of drag-and-drop.)
+ if (SD_MOD()->pTransferDrag != nullptr)
+ return;
+
+ if ( ! mrSlideSorter.GetProperties()->IsUIReadOnly())
+ {
+ mrSelectionFunction.SwitchToDragAndDropMode(rMousePosition);
+ }
+}
+
+//===== NormalModeHandler =====================================================
+
+NormalModeHandler::NormalModeHandler (
+ SlideSorter& rSlideSorter,
+ SelectionFunction& rSelectionFunction)
+ : ModeHandler(rSlideSorter, rSelectionFunction, true)
+{
+}
+
+SelectionFunction::Mode NormalModeHandler::GetMode() const
+{
+ return SelectionFunction::NormalMode;
+}
+
+void NormalModeHandler::Abort()
+{
+}
+
+bool NormalModeHandler::ProcessButtonDownEvent (
+ SelectionFunction::EventDescriptor& rDescriptor)
+{
+ // Remember the location where the left button is pressed. With
+ // that we can filter away motion events that are caused by key
+ // presses. We also can tune the minimal motion distance that
+ // triggers a drag-and-drop operation.
+ if ((rDescriptor.mnEventCode & BUTTON_DOWN) != 0)
+ maButtonDownLocation = rDescriptor.maMousePosition;
+
+ switch (rDescriptor.mnEventCode)
+ {
+ case BUTTON_DOWN | LEFT_BUTTON | SINGLE_CLICK | OVER_UNSELECTED_PAGE:
+ SetCurrentPage(rDescriptor.mpHitDescriptor);
+ break;
+
+ case BUTTON_DOWN | LEFT_BUTTON | SINGLE_CLICK | OVER_SELECTED_PAGE:
+ break;
+
+ case BUTTON_DOWN | LEFT_BUTTON | DOUBLE_CLICK | OVER_SELECTED_PAGE:
+ case BUTTON_DOWN | LEFT_BUTTON | DOUBLE_CLICK | OVER_UNSELECTED_PAGE:
+ // A double click always shows the selected slide in the center
+ // pane in an edit view.
+ SetCurrentPage(rDescriptor.mpHitDescriptor);
+ SwitchView(rDescriptor.mpHitDescriptor);
+ break;
+
+ case BUTTON_DOWN | LEFT_BUTTON | SINGLE_CLICK | OVER_SELECTED_PAGE | SHIFT_MODIFIER:
+ case BUTTON_DOWN | LEFT_BUTTON | SINGLE_CLICK | OVER_UNSELECTED_PAGE | SHIFT_MODIFIER:
+ // Range selection with the shift modifier.
+ RangeSelect(rDescriptor.mpHitDescriptor);
+ break;
+
+ // Right button for context menu.
+ case BUTTON_DOWN | RIGHT_BUTTON | SINGLE_CLICK | OVER_UNSELECTED_PAGE:
+ // Single right click and shift+F10 select as preparation to
+ // show the context menu. Change the selection only when the
+ // page under the mouse is not selected. In this case the
+ // selection is set to this single page. Otherwise the
+ // selection is not modified.
+ SetCurrentPage(rDescriptor.mpHitDescriptor);
+ break;
+
+ case BUTTON_DOWN | RIGHT_BUTTON | SINGLE_CLICK | OVER_SELECTED_PAGE:
+ // Do not change the selection. Just adjust the insertion indicator.
+ break;
+
+ case BUTTON_DOWN | RIGHT_BUTTON | SINGLE_CLICK | NOT_OVER_PAGE:
+ // Remember the current selection so that when a multi selection
+ // is started, we can restore the previous selection.
+ mrSlideSorter.GetModel().SaveCurrentSelection();
+ DeselectAllPages();
+ break;
+
+ case ANY_MODIFIER(BUTTON_DOWN | LEFT_BUTTON | SINGLE_CLICK | NOT_OVER_PAGE):
+ // Remember the current selection so that when a multi selection
+ // is started, we can restore the previous selection.
+ mrSlideSorter.GetModel().SaveCurrentSelection();
+ DeselectAllPages();
+ break;
+
+ case BUTTON_DOWN | LEFT_BUTTON | DOUBLE_CLICK | NOT_OVER_PAGE:
+ {
+ // Insert a new slide:
+ // First of all we need to set the insertion indicator which sets the
+ // position where the new slide will be inserted.
+ std::shared_ptr<InsertionIndicatorHandler> pInsertionIndicatorHandler
+ = mrSlideSorter.GetController().GetInsertionIndicatorHandler();
+
+ pInsertionIndicatorHandler->Start(false);
+ pInsertionIndicatorHandler->UpdatePosition(
+ rDescriptor.maMousePosition,
+ InsertionIndicatorHandler::MoveMode);
+
+ mrSlideSorter.GetController().GetSelectionManager()->SetInsertionPosition(
+ pInsertionIndicatorHandler->GetInsertionPageIndex());
+
+ mrSlideSorter.GetViewShell()->GetDispatcher()->Execute(
+ SID_INSERTPAGE,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+
+ pInsertionIndicatorHandler->End(Animator::AM_Immediate);
+
+ break;
+ }
+
+ default:
+ return false;
+ }
+ return true;
+}
+
+bool NormalModeHandler::ProcessButtonUpEvent (
+ SelectionFunction::EventDescriptor& rDescriptor)
+{
+ bool bIsProcessed (true);
+ switch (rDescriptor.mnEventCode)
+ {
+ case BUTTON_UP | LEFT_BUTTON | SINGLE_CLICK | OVER_SELECTED_PAGE:
+ SetCurrentPage(rDescriptor.mpHitDescriptor);
+ break;
+
+ // Multi selection with the control modifier.
+ case BUTTON_UP | LEFT_BUTTON | SINGLE_CLICK | OVER_SELECTED_PAGE | CONTROL_MODIFIER:
+ mrSlideSorter.GetController().GetPageSelector().DeselectPage(
+ rDescriptor.mpHitDescriptor);
+ break;
+
+ case BUTTON_UP | LEFT_BUTTON | SINGLE_CLICK | OVER_UNSELECTED_PAGE | CONTROL_MODIFIER:
+ mrSlideSorter.GetController().GetPageSelector().SelectPage(
+ rDescriptor.mpHitDescriptor);
+ mrSlideSorter.GetView().SetPageUnderMouse(rDescriptor.mpHitDescriptor);
+ break;
+ case BUTTON_UP | LEFT_BUTTON | SINGLE_CLICK | NOT_OVER_PAGE:
+ break;
+
+ default:
+ bIsProcessed = false;
+ break;
+ }
+ mrSelectionFunction.SwitchToNormalMode();
+ return bIsProcessed;
+}
+
+bool NormalModeHandler::ProcessMotionEvent (
+ SelectionFunction::EventDescriptor& rDescriptor)
+{
+ if (ModeHandler::ProcessMotionEvent(rDescriptor))
+ return true;
+
+ bool bIsProcessed (true);
+ switch (rDescriptor.mnEventCode)
+ {
+ // A mouse motion without visible substitution starts that.
+ case ANY_MODIFIER(MOUSE_MOTION | LEFT_BUTTON | SINGLE_CLICK | OVER_UNSELECTED_PAGE):
+ case ANY_MODIFIER(MOUSE_MOTION | LEFT_BUTTON | SINGLE_CLICK | OVER_SELECTED_PAGE):
+ {
+ if (maButtonDownLocation)
+ {
+ const sal_Int32 nDistance(std::max(
+ std::abs(maButtonDownLocation->X() - rDescriptor.maMousePosition.X()),
+ std::abs(maButtonDownLocation->Y() - rDescriptor.maMousePosition.Y())));
+ if (nDistance > 3)
+ StartDrag(rDescriptor.maMousePosition);
+ }
+ break;
+ }
+
+ // A mouse motion not over a page starts a rectangle selection.
+ case ANY_MODIFIER(MOUSE_MOTION | LEFT_BUTTON | SINGLE_CLICK | NOT_OVER_PAGE):
+ mrSelectionFunction.SwitchToMultiSelectionMode(
+ rDescriptor.maMouseModelPosition,
+ rDescriptor.mnEventCode);
+ break;
+
+ default:
+ bIsProcessed = false;
+ break;
+ }
+ return bIsProcessed;
+}
+
+bool NormalModeHandler::ProcessDragEvent (SelectionFunction::EventDescriptor& rDescriptor)
+{
+ mrSelectionFunction.SwitchToDragAndDropMode(rDescriptor.maMousePosition);
+ ReprocessEvent(rDescriptor);
+ return true;
+}
+
+void NormalModeHandler::RangeSelect (const model::SharedPageDescriptor& rpDescriptor)
+{
+ PageSelector::UpdateLock aLock (mrSlideSorter);
+ PageSelector& rSelector (mrSlideSorter.GetController().GetPageSelector());
+
+ model::SharedPageDescriptor pAnchor (rSelector.GetSelectionAnchor());
+ DeselectAllPages();
+
+ if (!pAnchor)
+ return;
+
+ // Select all pages between the anchor and the given one, including
+ // the two.
+ const sal_uInt16 nAnchorIndex ((pAnchor->GetPage()->GetPageNum()-1) / 2);
+ const sal_uInt16 nOtherIndex ((rpDescriptor->GetPage()->GetPageNum()-1) / 2);
+
+ // Iterate over all pages in the range. Start with the anchor
+ // page. This way the PageSelector will recognize it again as
+ // anchor (the first selected page after a DeselectAllPages()
+ // becomes the anchor.)
+ const sal_uInt16 nStep ((nAnchorIndex < nOtherIndex) ? +1 : -1);
+ sal_uInt16 nIndex (nAnchorIndex);
+ while (true)
+ {
+ rSelector.SelectPage(nIndex);
+ if (nIndex == nOtherIndex)
+ break;
+ nIndex = nIndex + nStep;
+ }
+}
+
+void NormalModeHandler::ResetButtonDownLocation()
+{
+ maButtonDownLocation = ::std::optional<Point>();
+}
+
+//===== MultiSelectionModeHandler =============================================
+
+MultiSelectionModeHandler::MultiSelectionModeHandler (
+ SlideSorter& rSlideSorter,
+ SelectionFunction& rSelectionFunction,
+ const Point& rMouseModelPosition,
+ const sal_uInt32 nEventCode)
+ : ModeHandler(rSlideSorter, rSelectionFunction, false),
+ meSelectionMode(SM_Normal),
+ maSecondCorner(rMouseModelPosition),
+ maSavedPointer(mrSlideSorter.GetContentWindow()->GetPointer()),
+ mbAutoScrollInstalled(false),
+ mnAnchorIndex(-1),
+ mnSecondIndex(-1)
+{
+
+ mrSlideSorter.GetContentWindow()->SetPointer(PointerStyle::Text);
+ SetSelectionModeFromModifier(nEventCode);
+}
+
+MultiSelectionModeHandler::~MultiSelectionModeHandler()
+{
+ if (mbAutoScrollInstalled)
+ {
+ //a call to this handler's MultiSelectionModeHandler::UpdatePosition
+ //may be still waiting to be called back
+ mrSlideSorter.GetController().GetScrollBarManager().clearAutoScrollFunctor();
+ }
+ mrSlideSorter.GetContentWindow()->SetPointer(maSavedPointer);
+}
+
+SelectionFunction::Mode MultiSelectionModeHandler::GetMode() const
+{
+ return SelectionFunction::MultiSelectionMode;
+}
+
+void MultiSelectionModeHandler::Abort()
+{
+ mrSlideSorter.GetView().RequestRepaint(mrSlideSorter.GetModel().RestoreSelection());
+}
+
+void MultiSelectionModeHandler::ProcessEvent (
+ SelectionFunction::EventDescriptor& rDescriptor)
+{
+ // During a multi selection we do not want sudden jumps of the
+ // visible area caused by moving newly selected pages into view.
+ // Therefore disable that temporarily. The disabled object is
+ // released at the end of the event processing, after the focus and
+ // current slide have been updated.
+ VisibleAreaManager::TemporaryDisabler aDisabler (mrSlideSorter);
+
+ ModeHandler::ProcessEvent(rDescriptor);
+}
+
+bool MultiSelectionModeHandler::ProcessButtonUpEvent (
+ SelectionFunction::EventDescriptor& rDescriptor)
+{
+ if (mbAutoScrollInstalled)
+ {
+ //a call to this handler's MultiSelectionModeHandler::UpdatePosition
+ //may be still waiting to be called back
+ mrSlideSorter.GetController().GetScrollBarManager().clearAutoScrollFunctor();
+ mbAutoScrollInstalled = false;
+ }
+
+ if (Match(rDescriptor.mnEventCode, BUTTON_UP | LEFT_BUTTON | SINGLE_CLICK))
+ {
+ mrSelectionFunction.SwitchToNormalMode();
+ return true;
+ }
+ else
+ return false;
+}
+
+bool MultiSelectionModeHandler::ProcessMotionEvent (
+ SelectionFunction::EventDescriptor& rDescriptor)
+{
+ // The selection rectangle is visible. Handle events accordingly.
+ if (Match(rDescriptor.mnEventCode, MOUSE_MOTION | LEFT_BUTTON | SINGLE_CLICK))
+ {
+ SetSelectionModeFromModifier(rDescriptor.mnEventCode);
+ UpdatePosition(rDescriptor.maMousePosition, true);
+ return true;
+ }
+ else
+ return false;
+}
+
+bool MultiSelectionModeHandler::HandleUnprocessedEvent (
+ SelectionFunction::EventDescriptor& rDescriptor)
+{
+ if ( ! ModeHandler::HandleUnprocessedEvent(rDescriptor))
+ {
+ // If the event has not been processed then stop multi selection.
+ mrSelectionFunction.SwitchToNormalMode();
+ ReprocessEvent(rDescriptor);
+ }
+ return true;
+}
+
+void MultiSelectionModeHandler::UpdatePosition (
+ const Point& rMousePosition,
+ const bool bAllowAutoScroll)
+{
+ VisibleAreaManager::TemporaryDisabler aDisabler (mrSlideSorter);
+
+ // Convert window coordinates into model coordinates (we need the
+ // window coordinates for auto-scrolling because that remains
+ // constant while scrolling.)
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ const Point aMouseModelPosition (pWindow->PixelToLogic(rMousePosition));
+
+ bool bDoAutoScroll = bAllowAutoScroll && mrSlideSorter.GetController().GetScrollBarManager().AutoScroll(
+ rMousePosition,
+ [this, &rMousePosition] () { return this->UpdatePosition(rMousePosition, false); });
+
+ if (!bDoAutoScroll)
+ UpdateModelPosition(aMouseModelPosition);
+
+ mbAutoScrollInstalled |= bDoAutoScroll;
+}
+
+void MultiSelectionModeHandler::SetSelectionModeFromModifier (
+ const sal_uInt32 nEventCode)
+{
+ switch (nEventCode & MODIFIER_MASK)
+ {
+ case NO_MODIFIER:
+ SetSelectionMode(SM_Normal);
+ break;
+
+ case SHIFT_MODIFIER:
+ SetSelectionMode(SM_Add);
+ break;
+
+ case CONTROL_MODIFIER:
+ SetSelectionMode(SM_Toggle);
+ break;
+ }
+}
+
+void MultiSelectionModeHandler::SetSelectionMode (const SelectionMode eSelectionMode)
+{
+ if (meSelectionMode != eSelectionMode)
+ {
+ meSelectionMode = eSelectionMode;
+ UpdateSelection();
+ }
+}
+
+void MultiSelectionModeHandler::UpdateSelectionState (
+ const model::SharedPageDescriptor& rpDescriptor,
+ const bool bIsInSelection) const
+{
+ // Determine whether the page was selected before the rectangle
+ // selection was started.
+ const bool bWasSelected (rpDescriptor->HasState(model::PageDescriptor::ST_WasSelected));
+
+ // Combine the two selection states depending on the selection mode.
+ bool bSelect (false);
+ switch(meSelectionMode)
+ {
+ case SM_Normal:
+ bSelect = bIsInSelection;
+ break;
+
+ case SM_Add:
+ bSelect = bIsInSelection || bWasSelected;
+ break;
+
+ case SM_Toggle:
+ if (bIsInSelection)
+ bSelect = !bWasSelected;
+ else
+ bSelect = bWasSelected;
+ break;
+ }
+
+ // Set the new selection state.
+ if (bSelect)
+ mrSlideSorter.GetController().GetPageSelector().SelectPage(rpDescriptor);
+ else
+ mrSlideSorter.GetController().GetPageSelector().DeselectPage(rpDescriptor);
+}
+
+void MultiSelectionModeHandler::UpdateModelPosition (const Point& rMouseModelPosition)
+{
+ maSecondCorner = rMouseModelPosition;
+ UpdateSelection();
+}
+
+void MultiSelectionModeHandler::UpdateSelection()
+{
+ view::SlideSorterView::DrawLock aLock (mrSlideSorter);
+
+ model::SlideSorterModel& rModel (mrSlideSorter.GetModel());
+ const sal_Int32 nPageCount (rModel.GetPageCount());
+
+ const sal_Int32 nIndexUnderMouse (
+ mrSlideSorter.GetView().GetLayouter().GetIndexAtPoint (
+ maSecondCorner,
+ false,
+ false));
+ if (nIndexUnderMouse < 0 || nIndexUnderMouse >= nPageCount)
+ return;
+
+ if (mnAnchorIndex < 0)
+ mnAnchorIndex = nIndexUnderMouse;
+ mnSecondIndex = nIndexUnderMouse;
+
+ Range aRange (mnAnchorIndex, mnSecondIndex);
+ aRange.Justify();
+
+ for (sal_Int32 nIndex=0; nIndex<nPageCount; ++nIndex)
+ {
+ UpdateSelectionState(rModel.GetPageDescriptor(nIndex), aRange.Contains(nIndex));
+ }
+}
+
+//===== DragAndDropModeHandler ================================================
+
+DragAndDropModeHandler::DragAndDropModeHandler (
+ SlideSorter& rSlideSorter,
+ SelectionFunction& rSelectionFunction,
+ const Point& rMousePosition,
+ vcl::Window* pWindow)
+ : ModeHandler(rSlideSorter, rSelectionFunction, false)
+{
+ SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag;
+ if (pDragTransferable==nullptr && mrSlideSorter.GetViewShell() != nullptr)
+ {
+ SlideSorterViewShell* pSlideSorterViewShell
+ = dynamic_cast<SlideSorterViewShell*>(mrSlideSorter.GetViewShell());
+ if (pSlideSorterViewShell != nullptr)
+ pSlideSorterViewShell->StartDrag(rMousePosition, pWindow);
+ pDragTransferable = SD_MOD()->pTransferDrag;
+ }
+
+ mpDragAndDropContext.reset(new DragAndDropContext(mrSlideSorter));
+ mrSlideSorter.GetController().GetInsertionIndicatorHandler()->Start(
+ pDragTransferable != nullptr
+ && pDragTransferable->GetView()==&mrSlideSorter.GetView());
+}
+
+DragAndDropModeHandler::~DragAndDropModeHandler()
+{
+ if (mpDragAndDropContext)
+ {
+ // Disconnect the substitution handler from this selection function.
+ mpDragAndDropContext->SetTargetSlideSorter();
+ mpDragAndDropContext.reset();
+ }
+ mrSlideSorter.GetController().GetInsertionIndicatorHandler()->End(Animator::AM_Animated);
+}
+
+SelectionFunction::Mode DragAndDropModeHandler::GetMode() const
+{
+ return SelectionFunction::DragAndDropMode;
+}
+
+void DragAndDropModeHandler::Abort()
+{
+ mrSlideSorter.GetController().GetClipboard().Abort();
+ if (mpDragAndDropContext)
+ mpDragAndDropContext->Dispose();
+ // mrSlideSorter.GetView().RequestRepaint(mrSlideSorter.GetModel().RestoreSelection());
+}
+
+bool DragAndDropModeHandler::ProcessButtonUpEvent (
+ SelectionFunction::EventDescriptor& rDescriptor)
+{
+ if (Match(rDescriptor.mnEventCode, BUTTON_UP | LEFT_BUTTON))
+ {
+ // The following Process() call may lead to the destruction
+ // of rDescriptor.mpHitDescriptor so release our reference to it.
+ rDescriptor.mpHitDescriptor.reset();
+ mrSelectionFunction.SwitchToNormalMode();
+ return true;
+ }
+ else
+ return false;
+}
+
+bool DragAndDropModeHandler::ProcessDragEvent (SelectionFunction::EventDescriptor& rDescriptor)
+{
+ OSL_ASSERT(mpDragAndDropContext);
+
+ if (rDescriptor.mbIsLeaving)
+ {
+ mrSelectionFunction.SwitchToNormalMode();
+ }
+ else if (mpDragAndDropContext)
+ {
+ mpDragAndDropContext->UpdatePosition(
+ rDescriptor.maMousePosition,
+ rDescriptor.meDragMode, true);
+ }
+
+ return true;
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx b/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx
new file mode 100644
index 000000000..e1f75b21c
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx
@@ -0,0 +1,309 @@
+/* -*- 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 <controller/SlsSelectionManager.hxx>
+
+#include <SlideSorter.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <controller/SlsFocusManager.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsSelectionObserver.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <view/SlideSorterView.hxx>
+#include <tools/diagnose_ex.h>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <drawview.hxx>
+#include <DrawViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <svx/svxids.hrc>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+
+
+#include <sdresid.hxx>
+#include <strings.hrc>
+#include <app.hrc>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::uno;
+using namespace ::sd::slidesorter::model;
+using namespace ::sd::slidesorter::view;
+using namespace ::sd::slidesorter::controller;
+
+namespace sd::slidesorter::controller {
+
+SelectionManager::SelectionManager (SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter),
+ mrController(rSlideSorter.GetController()),
+ mnInsertionPosition(-1),
+ mpSelectionObserver(std::make_shared<SelectionObserver>(rSlideSorter))
+{
+}
+
+SelectionManager::~SelectionManager()
+{
+}
+
+void SelectionManager::DeleteSelectedPages (const bool bSelectFollowingPage)
+{
+ // Create some locks to prevent updates of the model, view, selection
+ // state while modifying any of them.
+ SlideSorterController::ModelChangeLock aLock (mrController);
+ SlideSorterView::DrawLock aDrawLock (mrSlideSorter);
+ PageSelector::UpdateLock aSelectionLock (mrSlideSorter);
+
+ // Hide focus.
+ bool bIsFocusShowing = mrController.GetFocusManager().IsFocusShowing();
+ if (bIsFocusShowing)
+ mrController.GetFocusManager().ToggleFocus();
+
+ // Store pointers to all selected page descriptors. This is necessary
+ // because the pages get deselected when the first one is deleted.
+ model::PageEnumeration aPageEnumeration (
+ PageEnumerationProvider::CreateSelectedPagesEnumeration(mrSlideSorter.GetModel()));
+ ::std::vector<SdPage*> aSelectedPages;
+ sal_Int32 nNewCurrentSlide (-1);
+ while (aPageEnumeration.HasMoreElements())
+ {
+ SharedPageDescriptor pDescriptor (aPageEnumeration.GetNextElement());
+ aSelectedPages.push_back(pDescriptor->GetPage());
+ if (bSelectFollowingPage || nNewCurrentSlide<0)
+ nNewCurrentSlide = pDescriptor->GetPageIndex();
+ }
+ if (aSelectedPages.empty())
+ return;
+
+ // Determine the slide to select (and thereby make the current slide)
+ // after the deletion.
+ if (bSelectFollowingPage)
+ nNewCurrentSlide -= aSelectedPages.size() - 1;
+ else
+ --nNewCurrentSlide;
+
+ const auto pViewShell = mrSlideSorter.GetViewShell();
+ const auto pDrawViewShell = pViewShell ? std::dynamic_pointer_cast<sd::DrawViewShell>(pViewShell->GetViewShellBase().GetMainViewShell()) : nullptr;
+ const auto pDrawView = pDrawViewShell ? pDrawViewShell->GetDrawView() : nullptr;
+
+ if (pDrawView)
+ pDrawView->BlockPageOrderChangedHint(true);
+
+ // Proper naming for the undo action
+ OUString sUndoComment(SdResId(STR_UNDO_DELETEPAGES));
+ if (mrSlideSorter.GetView().GetDoc().GetDocumentType() == DocumentType::Draw)
+ sUndoComment = SdResId(STR_UNDO_DELETEPAGES_DRAW);
+
+ // The actual deletion of the selected pages is done in one of two
+ // helper functions. They are specialized for normal respectively for
+ // master pages.
+ mrSlideSorter.GetView().BegUndo (sUndoComment);
+ if (mrSlideSorter.GetModel().GetEditMode() == EditMode::Page)
+ DeleteSelectedNormalPages(aSelectedPages);
+ else
+ DeleteSelectedMasterPages(aSelectedPages);
+ mrSlideSorter.GetView().EndUndo ();
+
+ mrController.HandleModelChange();
+ aLock.Release();
+ if (pDrawView)
+ {
+ assert(pDrawViewShell);
+ pDrawView->BlockPageOrderChangedHint(false);
+ pDrawViewShell->ResetActualPage();
+ }
+
+ // Show focus and move it to next valid location.
+ if (bIsFocusShowing)
+ mrController.GetFocusManager().ToggleFocus();
+
+ // Set the new current slide.
+ if (nNewCurrentSlide < 0)
+ nNewCurrentSlide = 0;
+ else if (nNewCurrentSlide >= mrSlideSorter.GetModel().GetPageCount())
+ nNewCurrentSlide = mrSlideSorter.GetModel().GetPageCount()-1;
+ mrController.GetPageSelector().CountSelectedPages();
+ mrController.GetPageSelector().SelectPage(nNewCurrentSlide);
+ mrController.GetFocusManager().SetFocusedPage(nNewCurrentSlide);
+}
+
+void SelectionManager::DeleteSelectedNormalPages (const ::std::vector<SdPage*>& rSelectedPages)
+{
+ // Prepare the deletion via the UNO API.
+ OSL_ASSERT(mrSlideSorter.GetModel().GetEditMode() == EditMode::Page);
+
+ try
+ {
+ Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier( mrSlideSorter.GetModel().GetDocument()->getUnoModel(), UNO_QUERY_THROW );
+ Reference<drawing::XDrawPages> xPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+
+ // Iterate over all pages that were selected when this method was called
+ // and delete the draw page the notes page. The iteration is done in
+ // reverse order so that when one slide is not deleted (to avoid an
+ // empty document) the remaining slide is the first one.
+ ::std::vector<SdPage*>::const_reverse_iterator aI;
+ for (aI=rSelectedPages.rbegin(); aI!=rSelectedPages.rend(); ++aI)
+ {
+ // Do not delete the last slide in the document.
+ if (xPages->getCount() <= 1)
+ break;
+
+ const sal_uInt16 nPage (model::FromCoreIndex((*aI)->GetPageNum()));
+
+ Reference< XDrawPage > xPage( xPages->getByIndex( nPage ), UNO_QUERY_THROW );
+ xPages->remove(xPage);
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "SelectionManager::DeleteSelectedNormalPages()");
+ }
+}
+
+void SelectionManager::DeleteSelectedMasterPages (const ::std::vector<SdPage*>& rSelectedPages)
+{
+ // Prepare the deletion via the UNO API.
+ OSL_ASSERT(mrSlideSorter.GetModel().GetEditMode() == EditMode::MasterPage);
+
+ try
+ {
+ Reference<drawing::XMasterPagesSupplier> xDrawPagesSupplier( mrSlideSorter.GetModel().GetDocument()->getUnoModel(), UNO_QUERY_THROW );
+ Reference<drawing::XDrawPages> xPages( xDrawPagesSupplier->getMasterPages(), UNO_SET_THROW );
+
+ // Iterate over all pages that were selected when this method was called
+ // and delete the draw page the notes page. The iteration is done in
+ // reverse order so that when one slide is not deleted (to avoid an
+ // empty document) the remaining slide is the first one.
+ ::std::vector<SdPage*>::const_reverse_iterator aI;
+ for (aI=rSelectedPages.rbegin(); aI!=rSelectedPages.rend(); ++aI)
+ {
+ // Do not delete the last slide in the document.
+ if (xPages->getCount() <= 1)
+ break;
+
+ const sal_uInt16 nPage (model::FromCoreIndex((*aI)->GetPageNum()));
+
+ Reference< XDrawPage > xPage( xPages->getByIndex( nPage ), UNO_QUERY_THROW );
+ xPages->remove(xPage);
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "SelectionManager::DeleteSelectedMasterPages()");
+ }
+}
+
+void SelectionManager::SelectionHasChanged ()
+{
+ ViewShell* pViewShell = mrSlideSorter.GetViewShell();
+ if (pViewShell == nullptr)
+ return;
+
+ pViewShell->Invalidate (SID_EXPAND_PAGE);
+ pViewShell->Invalidate (SID_SUMMARY_PAGE);
+ pViewShell->Invalidate(SID_SHOW_SLIDE);
+ pViewShell->Invalidate(SID_HIDE_SLIDE);
+ pViewShell->Invalidate(SID_DELETE_PAGE);
+ pViewShell->Invalidate(SID_DELETE_MASTER_PAGE);
+ pViewShell->Invalidate(SID_ASSIGN_LAYOUT);
+
+ // StatusBar
+ pViewShell->Invalidate (SID_STATUS_PAGE);
+ pViewShell->Invalidate (SID_STATUS_LAYOUT);
+ pViewShell->Invalidate (SID_SCALE);
+
+ OSL_ASSERT(mrController.GetCurrentSlideManager());
+ SharedPageDescriptor pDescriptor(mrController.GetCurrentSlideManager()->GetCurrentSlide());
+ if (pDescriptor)
+ pViewShell->UpdatePreview(pDescriptor->GetPage());
+
+ // Tell the selection change listeners that the selection has changed.
+ for (const auto& rLink : maSelectionChangeListeners)
+ {
+ rLink.Call(nullptr);
+ }
+
+ // Reset the insertion position: until set again it is calculated from
+ // the current selection.
+ mnInsertionPosition = -1;
+}
+
+void SelectionManager::AddSelectionChangeListener (const Link<LinkParamNone*,void>& rListener)
+{
+ if (::std::find (
+ maSelectionChangeListeners.begin(),
+ maSelectionChangeListeners.end(),
+ rListener) == maSelectionChangeListeners.end())
+ {
+ maSelectionChangeListeners.push_back (rListener);
+ }
+}
+
+void SelectionManager::RemoveSelectionChangeListener(const Link<LinkParamNone*,void>& rListener)
+{
+ maSelectionChangeListeners.erase (
+ ::std::find (
+ maSelectionChangeListeners.begin(),
+ maSelectionChangeListeners.end(),
+ rListener));
+}
+
+sal_Int32 SelectionManager::GetInsertionPosition() const
+{
+ sal_Int32 nInsertionPosition (mnInsertionPosition);
+ if (nInsertionPosition < 0)
+ {
+ model::PageEnumeration aSelectedPages
+ (model::PageEnumerationProvider::CreateSelectedPagesEnumeration(
+ mrSlideSorter.GetModel()));
+ // Initialize (for the case of an empty selection) with the position
+ // at the end of the document.
+ nInsertionPosition = mrSlideSorter.GetModel().GetPageCount();
+ while (aSelectedPages.HasMoreElements())
+ {
+ const sal_Int32 nPosition (aSelectedPages.GetNextElement()->GetPage()->GetPageNum());
+ // Convert *2+1 index to straight index (n-1)/2 after the page
+ // (+1).
+ nInsertionPosition = model::FromCoreIndex(nPosition) + 1;
+ }
+
+ }
+ return nInsertionPosition;
+}
+
+void SelectionManager::SetInsertionPosition (const sal_Int32 nInsertionPosition)
+{
+ if (nInsertionPosition < 0)
+ mnInsertionPosition = -1;
+ else if (nInsertionPosition > mrSlideSorter.GetModel().GetPageCount())
+ {
+ // Assert but then ignore invalid values.
+ OSL_ASSERT(nInsertionPosition<=mrSlideSorter.GetModel().GetPageCount());
+ return;
+ }
+ else
+ mnInsertionPosition = nInsertionPosition;
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsSelectionObserver.cxx b/sd/source/ui/slidesorter/controller/SlsSelectionObserver.cxx
new file mode 100644
index 000000000..8fb0493a0
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsSelectionObserver.cxx
@@ -0,0 +1,139 @@
+/* -*- 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 <SlideSorter.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsSelectionManager.hxx>
+#include <controller/SlsSelectionObserver.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsFocusManager.hxx>
+#include <sdpage.hxx>
+#include <osl/diagnose.h>
+
+namespace sd::slidesorter::controller
+{
+SelectionObserver::Context::Context(SlideSorter const& rSlideSorter)
+ : mpSelectionObserver(
+ rSlideSorter.GetController().GetSelectionManager()->GetSelectionObserver())
+{
+ if (mpSelectionObserver)
+ mpSelectionObserver->StartObservation();
+}
+
+SelectionObserver::Context::~Context() COVERITY_NOEXCEPT_FALSE
+{
+ if (mpSelectionObserver)
+ mpSelectionObserver->EndObservation();
+}
+
+void SelectionObserver::Context::Abort()
+{
+ if (mpSelectionObserver)
+ {
+ mpSelectionObserver->AbortObservation();
+ mpSelectionObserver.reset();
+ }
+}
+
+//===== SelectionObserver =====================================================
+
+SelectionObserver::SelectionObserver(SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter)
+ , mbIsObservationActive(false)
+ , mbPageEventOccurred(false)
+{
+}
+
+SelectionObserver::~SelectionObserver() {}
+
+void SelectionObserver::NotifyPageEvent(const SdrPage* pSdrPage)
+{
+ if (!mbIsObservationActive)
+ return;
+
+ mbPageEventOccurred = true;
+
+ const SdPage* pPage = dynamic_cast<const SdPage*>(pSdrPage);
+ if (pPage == nullptr)
+ return;
+
+ //NotifyPageEvent is called for add, remove, *and* change position so for
+ //the change position case we must ensure we don't end up with the slide
+ //duplicated in our list
+ std::vector<const SdPage*>::iterator iPage(
+ std::find(maInsertedPages.begin(), maInsertedPages.end(), pPage));
+ if (iPage != maInsertedPages.end())
+ maInsertedPages.erase(iPage);
+
+ if (pPage->IsInserted())
+ maInsertedPages.push_back(pPage);
+}
+
+void SelectionObserver::StartObservation()
+{
+ OSL_ASSERT(!mbIsObservationActive);
+ maInsertedPages.clear();
+ mbIsObservationActive = true;
+}
+
+void SelectionObserver::AbortObservation()
+{
+ OSL_ASSERT(mbIsObservationActive);
+ mbIsObservationActive = false;
+ maInsertedPages.clear();
+}
+
+void SelectionObserver::EndObservation()
+{
+ OSL_ASSERT(mbIsObservationActive);
+ mbIsObservationActive = false;
+
+ if (!mbPageEventOccurred)
+ return;
+
+ PageSelector& rSelector(mrSlideSorter.GetController().GetPageSelector());
+ PageSelector::UpdateLock aUpdateLock(mrSlideSorter);
+ rSelector.DeselectAllPages();
+ if (!maInsertedPages.empty())
+ {
+ // Select the inserted pages.
+ for (const auto& rpPage : maInsertedPages)
+ {
+ rSelector.SelectPage(rpPage);
+ }
+ maInsertedPages.clear();
+ }
+
+ aUpdateLock.Release();
+ FocusManager& rFocusManager = mrSlideSorter.GetController().GetFocusManager();
+ bool bSuccess = rFocusManager.SetFocusedPageToCurrentPage();
+ // tdf#129346 nothing currently selected, select something, if possible
+ // but (tdf#129346) only if setting focus to current page failed
+ if (rSelector.GetPageCount() && rSelector.GetSelectedPageCount() == 0)
+ {
+ if (bSuccess)
+ rSelector.SelectPage(rFocusManager.GetFocusedPageDescriptor());
+ else
+ rSelector.SelectPage(0);
+ }
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx b/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx
new file mode 100644
index 000000000..52e05557e
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx
@@ -0,0 +1,1284 @@
+/* -*- 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 <controller/SlsSlotManager.hxx>
+#include <SlideSorter.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsClipboard.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <controller/SlsInsertionIndicatorHandler.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsSelectionFunction.hxx>
+#include <controller/SlsSelectionManager.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsLayouter.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <Window.hxx>
+#include <fupoor.hxx>
+#include <fucushow.hxx>
+#include <fusldlg.hxx>
+#include <fuexpand.hxx>
+#include <fusumry.hxx>
+#include <slideshow.hxx>
+#include <app.hrc>
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <unokywds.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShellImplementation.hxx>
+#include <sdpage.hxx>
+#include <sdxfer.hxx>
+#include <helpids.h>
+#include <unmodpg.hxx>
+#include <DrawViewShell.hxx>
+#include <sdabstdlg.hxx>
+#include <sdmod.hxx>
+
+#include <vcl/uitest/logger.hxx>
+#include <vcl/uitest/eventdescription.hxx>
+
+#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/sidebar/Sidebar.hxx>
+#include <svx/svxids.hrc>
+#include <svx/svxdlg.hxx>
+#include <svl/intitem.hxx>
+#include <svl/stritem.hxx>
+#include <svl/whiter.hxx>
+#include <svl/itempool.hxx>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/drawing/XDrawPages.hpp>
+#include <osl/diagnose.h>
+
+#include <memory>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+
+namespace sd::slidesorter::controller {
+
+namespace {
+
+/** The state of a set of slides with respect to being excluded from the
+ slide show.
+*/
+enum SlideExclusionState {UNDEFINED, EXCLUDED, INCLUDED, MIXED};
+
+/** Return for the given set of slides whether they included are
+ excluded from the slide show.
+*/
+SlideExclusionState GetSlideExclusionState (model::PageEnumeration& rPageSet);
+
+} // end of anonymous namespace
+
+
+namespace {
+
+void collectUIInformation(std::map<OUString, OUString>&& aParameters, const OUString& rAction)
+{
+ EventDescription aDescription;
+ aDescription.aID = "impress_win_or_draw_win";
+ aDescription.aParameters = std::move(aParameters);
+ aDescription.aAction = rAction;
+ aDescription.aKeyWord = "ImpressWindowUIObject";
+ aDescription.aParent = "MainWindow";
+
+ UITestLogger::getInstance().logEvent(aDescription);
+}
+
+}
+
+SlotManager::SlotManager (SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter)
+{
+}
+
+void SlotManager::FuTemporary (SfxRequest& rRequest)
+{
+ SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument();
+
+ SlideSorterViewShell* pShell
+ = dynamic_cast<SlideSorterViewShell*>(mrSlideSorter.GetViewShell());
+ if (pShell == nullptr)
+ return;
+
+ switch (rRequest.GetSlot())
+ {
+ case SID_PRESENTATION:
+ case SID_PRESENTATION_CURRENT_SLIDE:
+ case SID_REHEARSE_TIMINGS:
+ slideshowhelp::ShowSlideShow(rRequest, *mrSlideSorter.GetModel().GetDocument());
+ pShell->Cancel();
+ rRequest.Done();
+ break;
+
+ case SID_HIDE_SLIDE:
+ ChangeSlideExclusionState(model::SharedPageDescriptor(), true);
+ break;
+
+ case SID_SHOW_SLIDE:
+ ChangeSlideExclusionState(model::SharedPageDescriptor(), false);
+ break;
+
+ case SID_PAGES_PER_ROW:
+ if (rRequest.GetArgs() != nullptr)
+ {
+ const SfxUInt16Item* pPagesPerRow = rRequest.GetArg<SfxUInt16Item>(SID_PAGES_PER_ROW);
+ if (pPagesPerRow != nullptr)
+ {
+ sal_Int32 nColumnCount = pPagesPerRow->GetValue();
+ // Force the given number of columns by setting
+ // the minimal and maximal number of columns to
+ // the same value.
+ mrSlideSorter.GetView().GetLayouter().SetColumnCount (
+ nColumnCount, nColumnCount);
+ // Force a repaint and re-layout.
+ pShell->ArrangeGUIElements ();
+ // Rearrange the UI-elements controlled by the
+ // controller and force a rearrangement of the
+ // view.
+ mrSlideSorter.GetController().Rearrange(true);
+ }
+ }
+ rRequest.Done();
+ break;
+
+ case SID_SELECTALL:
+ mrSlideSorter.GetController().GetPageSelector().SelectAllPages();
+ rRequest.Done();
+ break;
+
+ case SID_SLIDE_TRANSITIONS_PANEL:
+ {
+ // First make sure that the sidebar is visible
+ pShell->GetViewFrame()->ShowChildWindow(SID_SIDEBAR);
+ ::sfx2::sidebar::Sidebar::ShowPanel(
+ u"SdSlideTransitionPanel",
+ pShell->GetViewFrame()->GetFrame().GetFrameInterface());
+ rRequest.Ignore ();
+ break;
+ }
+
+ case SID_MASTER_SLIDES_PANEL:
+ {
+ // First make sure that the sidebar is visible
+ pShell->GetViewFrame()->ShowChildWindow(SID_SIDEBAR);
+ ::sfx2::sidebar::Sidebar::ShowPanel(
+ u"SdAllMasterPagesPanel",
+ pShell->GetViewFrame()->GetFrame().GetFrameInterface());
+ rRequest.Ignore ();
+ break;
+ }
+
+ case SID_PRESENTATION_DLG:
+ FuSlideShowDlg::Create (
+ pShell,
+ mrSlideSorter.GetContentWindow(),
+ &mrSlideSorter.GetView(),
+ pDocument,
+ rRequest);
+ break;
+
+ case SID_CUSTOMSHOW_DLG:
+ FuCustomShowDlg::Create (
+ pShell,
+ mrSlideSorter.GetContentWindow(),
+ &mrSlideSorter.GetView(),
+ pDocument,
+ rRequest);
+ break;
+
+ case SID_EXPAND_PAGE:
+ FuExpandPage::Create (
+ pShell,
+ mrSlideSorter.GetContentWindow(),
+ &mrSlideSorter.GetView(),
+ pDocument,
+ rRequest);
+ break;
+
+ case SID_SUMMARY_PAGE:
+ FuSummaryPage::Create (
+ pShell,
+ mrSlideSorter.GetContentWindow(),
+ &mrSlideSorter.GetView(),
+ pDocument,
+ rRequest);
+ break;
+
+ case SID_INSERTPAGE:
+ case SID_INSERT_MASTER_PAGE:
+ InsertSlide(rRequest);
+ rRequest.Done();
+ break;
+
+ case SID_DUPLICATE_PAGE:
+ DuplicateSelectedSlides(rRequest);
+ rRequest.Done();
+ break;
+
+ case SID_DELETE_PAGE:
+ case SID_DELETE_MASTER_PAGE:
+ case SID_DELETE: // we need SID_CUT to handle the delete key
+ // (DEL -> accelerator -> SID_CUT).
+ if (mrSlideSorter.GetModel().GetPageCount() > 1)
+ {
+ mrSlideSorter.GetView().EndTextEditAllViews();
+ mrSlideSorter.GetController().GetSelectionManager()->DeleteSelectedPages();
+ }
+
+ rRequest.Done();
+ break;
+
+ case SID_RENAMEPAGE:
+ case SID_RENAME_MASTER_PAGE:
+ RenameSlide (rRequest);
+ rRequest.Done ();
+ break;
+
+ case SID_ASSIGN_LAYOUT:
+ {
+ pShell->mpImpl->AssignLayout( rRequest, PageKind::Standard );
+ rRequest.Done ();
+ }
+ break;
+
+ case SID_PHOTOALBUM:
+ {
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ vcl::Window* pWin = mrSlideSorter.GetContentWindow();
+ ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateSdPhotoAlbumDialog(
+ pWin ? pWin->GetFrameWeld() : nullptr,
+ pDocument));
+ pDlg->Execute();
+ rRequest.Done ();
+ }
+ break;
+
+ case SID_REMOTE_DLG:
+ {
+#ifdef ENABLE_SDREMOTE
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ vcl::Window* pWin = mrSlideSorter.GetContentWindow();
+ ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateRemoteDialog(pWin ? pWin->GetFrameWeld() : nullptr));
+ pDlg->Execute();
+#endif
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void SlotManager::FuPermanent (SfxRequest& rRequest)
+{
+ ViewShell* pShell = mrSlideSorter.GetViewShell();
+ if (pShell == nullptr)
+ return;
+
+ if(pShell->GetCurrentFunction().is())
+ {
+ rtl::Reference<FuPoor> xEmpty;
+ if (pShell->GetOldFunction() == pShell->GetCurrentFunction())
+ pShell->SetOldFunction(xEmpty);
+
+ pShell->GetCurrentFunction()->Deactivate();
+ pShell->SetCurrentFunction(xEmpty);
+ }
+
+ switch(rRequest.GetSlot())
+ {
+ case SID_OBJECT_SELECT:
+ pShell->SetCurrentFunction( SelectionFunction::Create(mrSlideSorter, rRequest) );
+ rRequest.Done();
+ break;
+
+ default:
+ break;
+ }
+
+ if(pShell->GetOldFunction().is())
+ {
+ pShell->GetOldFunction()->Deactivate();
+ rtl::Reference<FuPoor> xEmpty;
+ pShell->SetOldFunction(xEmpty);
+ }
+
+ if(pShell->GetCurrentFunction().is())
+ {
+ pShell->GetCurrentFunction()->Activate();
+ pShell->SetOldFunction(pShell->GetCurrentFunction());
+ }
+
+ //! that's only until ENUM-Slots ?are
+ // Invalidate( SID_OBJECT_SELECT );
+}
+
+void SlotManager::FuSupport (SfxRequest& rRequest)
+{
+ switch (rRequest.GetSlot())
+ {
+ case SID_STYLE_FAMILY:
+ if (rRequest.GetArgs() != nullptr)
+ {
+ SdDrawDocument* pDocument
+ = mrSlideSorter.GetModel().GetDocument();
+ if (pDocument != nullptr)
+ {
+ const SfxPoolItem& rItem (
+ rRequest.GetArgs()->Get(SID_STYLE_FAMILY));
+ pDocument->GetDocSh()->SetStyleFamily(
+ static_cast<SfxStyleFamily>(static_cast<const SfxUInt16Item&>(rItem).GetValue()));
+ }
+ }
+ break;
+
+ case SID_PASTE:
+ {
+ SdTransferable* pTransferClip = SD_MOD()->pTransferClip;
+ if( pTransferClip )
+ {
+ SfxObjectShell* pTransferDocShell = pTransferClip->GetDocShell().get();
+
+ DrawDocShell* pDocShell = dynamic_cast<DrawDocShell*>(pTransferDocShell);
+ if (pDocShell && pDocShell->GetDoc()->GetPageCount() > 1)
+ {
+ mrSlideSorter.GetController().GetClipboard().HandleSlotCall(rRequest);
+ break;
+ }
+ }
+ ViewShellBase* pBase = mrSlideSorter.GetViewShellBase();
+ if (pBase != nullptr)
+ {
+ std::shared_ptr<DrawViewShell> pDrawViewShell (
+ std::dynamic_pointer_cast<DrawViewShell>(pBase->GetMainViewShell()));
+ if (pDrawViewShell != nullptr)
+ pDrawViewShell->FuSupport(rRequest);
+ }
+ }
+ break;
+
+ case SID_CUT:
+ case SID_COPY:
+ case SID_DELETE:
+ mrSlideSorter.GetView().EndTextEditAllViews();
+ mrSlideSorter.GetController().GetClipboard().HandleSlotCall(rRequest);
+ break;
+
+ case SID_DRAWINGMODE:
+ case SID_NOTES_MODE:
+ case SID_HANDOUT_MASTER_MODE:
+ case SID_SLIDE_SORTER_MODE:
+ case SID_OUTLINE_MODE:
+ {
+ ViewShellBase* pBase = mrSlideSorter.GetViewShellBase();
+ if (pBase != nullptr)
+ {
+ framework::FrameworkHelper::Instance(*pBase)->HandleModeChangeSlot(
+ rRequest.GetSlot(), rRequest);
+ rRequest.Done();
+ }
+ break;
+ }
+
+ case SID_UNDO:
+ {
+ SlideSorterViewShell* pViewShell
+ = dynamic_cast<SlideSorterViewShell*>(mrSlideSorter.GetViewShell());
+ if (pViewShell != nullptr)
+ {
+ pViewShell->ImpSidUndo (rRequest);
+ }
+ break;
+ }
+
+ case SID_REDO:
+ {
+ SlideSorterViewShell* pViewShell
+ = dynamic_cast<SlideSorterViewShell*>(mrSlideSorter.GetViewShell());
+ if (pViewShell != nullptr)
+ {
+ pViewShell->ImpSidRedo (rRequest);
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+}
+
+void SlotManager::ExecCtrl (SfxRequest& rRequest)
+{
+ ViewShell* pViewShell = mrSlideSorter.GetViewShell();
+ sal_uInt16 nSlot = rRequest.GetSlot();
+ switch (nSlot)
+ {
+ case SID_RELOAD:
+ {
+ // empty Undo-Manager
+ mrSlideSorter.GetModel().GetDocument()->GetDocSh()->ClearUndoBuffer();
+
+ // normal forwarding to ViewFrame for execution
+ if (pViewShell != nullptr)
+ pViewShell->GetViewFrame()->ExecuteSlot(rRequest);
+
+ // has to be finished right away
+ return;
+ }
+
+ case SID_OUTPUT_QUALITY_COLOR:
+ case SID_OUTPUT_QUALITY_GRAYSCALE:
+ case SID_OUTPUT_QUALITY_BLACKWHITE:
+ case SID_OUTPUT_QUALITY_CONTRAST:
+ {
+ // flush page cache
+ if (pViewShell != nullptr)
+ pViewShell->ExecReq (rRequest);
+ break;
+ }
+
+ case SID_MAIL_SCROLLBODY_PAGEDOWN:
+ {
+ if (pViewShell != nullptr)
+ pViewShell->ExecReq (rRequest);
+ break;
+ }
+
+ case SID_OPT_LOCALE_CHANGED:
+ {
+ mrSlideSorter.GetController().UpdateAllPages();
+ if (pViewShell != nullptr)
+ pViewShell->UpdatePreview (pViewShell->GetActualPage());
+ rRequest.Done();
+ break;
+ }
+
+ case SID_SEARCH_DLG:
+ // We have to handle the SID_SEARCH_DLG slot explicitly because
+ // in some cases (when the slide sorter is displayed in the
+ // center pane) we want to disable the search dialog. Therefore
+ // we have to handle the execution of that slot as well.
+ // We try to do that by forwarding the request to the view frame
+ // of the view shell.
+ if (pViewShell != nullptr)
+ pViewShell->GetViewFrame()->ExecuteSlot(rRequest);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void SlotManager::GetAttrState (SfxItemSet& rSet)
+{
+ // Iterate over all items.
+ SfxWhichIter aIter (rSet);
+ sal_uInt16 nWhich = aIter.FirstWhich();
+ while (nWhich)
+ {
+ sal_uInt16 nSlotId (nWhich);
+ if (SfxItemPool::IsWhich(nWhich) && mrSlideSorter.GetViewShell()!=nullptr)
+ nSlotId = mrSlideSorter.GetViewShell()->GetPool().GetSlotId(nWhich);
+ switch (nSlotId)
+ {
+ case SID_PAGES_PER_ROW:
+ rSet.Put (
+ SfxUInt16Item (
+ nSlotId,
+ static_cast<sal_uInt16>(mrSlideSorter.GetView().GetLayouter().GetColumnCount())
+ )
+ );
+ break;
+ }
+ nWhich = aIter.NextWhich();
+ }
+}
+
+void SlotManager::GetMenuState (SfxItemSet& rSet)
+{
+ EditMode eEditMode = mrSlideSorter.GetModel().GetEditMode();
+ ViewShell* pShell = mrSlideSorter.GetViewShell();
+ DrawDocShell* pDocShell = mrSlideSorter.GetModel().GetDocument()->GetDocSh();
+
+ if (pShell!=nullptr && pShell->GetCurrentFunction().is())
+ {
+ sal_uInt16 nSId = pShell->GetCurrentFunction()->GetSlotID();
+
+ rSet.Put( SfxBoolItem( nSId, true ) );
+ }
+ rSet.Put( SfxBoolItem( SID_DRAWINGMODE, false ) );
+ rSet.Put( SfxBoolItem( SID_SLIDE_SORTER_MODE, true ) );
+ rSet.Put( SfxBoolItem( SID_OUTLINE_MODE, false ) );
+ rSet.Put( SfxBoolItem( SID_NOTES_MODE, false ) );
+ rSet.Put( SfxBoolItem( SID_HANDOUT_MASTER_MODE, false ) );
+
+ if (pShell!=nullptr && pShell->IsMainViewShell())
+ {
+ rSet.DisableItem(SID_SPELL_DIALOG);
+ rSet.DisableItem(SID_SEARCH_DLG);
+ }
+
+ if (SfxItemState::DEFAULT == rSet.GetItemState(SID_EXPAND_PAGE))
+ {
+ bool bDisable = true;
+ if (eEditMode == EditMode::Page)
+ {
+ // At least one of the selected pages has to contain an outline
+ // presentation objects in order to enable the expand page menu
+ // entry.
+ model::PageEnumeration aSelectedPages (
+ model::PageEnumerationProvider::CreateSelectedPagesEnumeration(
+ mrSlideSorter.GetModel()));
+ while (aSelectedPages.HasMoreElements())
+ {
+ SdPage* pPage = aSelectedPages.GetNextElement()->GetPage();
+ SdrObject* pObj = pPage->GetPresObj(PresObjKind::Outline);
+ if (pObj!=nullptr )
+ {
+ if( !pObj->IsEmptyPresObj() )
+ {
+ bDisable = false;
+ }
+ else
+ {
+ // check if the object is in edit, then if it's temporarily not empty
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
+ if( pTextObj )
+ {
+ if( pTextObj->CanCreateEditOutlinerParaObject() )
+ {
+ bDisable = false;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (bDisable)
+ rSet.DisableItem (SID_EXPAND_PAGE);
+ }
+
+ if (SfxItemState::DEFAULT == rSet.GetItemState(SID_SUMMARY_PAGE))
+ {
+ bool bDisable = true;
+ if (eEditMode == EditMode::Page)
+ {
+ // At least one of the selected pages has to contain a title
+ // presentation objects in order to enable the summary page menu
+ // entry.
+ model::PageEnumeration aSelectedPages (
+ model::PageEnumerationProvider::CreateSelectedPagesEnumeration(
+ mrSlideSorter.GetModel()));
+ while (aSelectedPages.HasMoreElements())
+ {
+ SdPage* pPage = aSelectedPages.GetNextElement()->GetPage();
+ SdrObject* pObj = pPage->GetPresObj(PresObjKind::Title);
+
+ if (pObj!=nullptr && !pObj->IsEmptyPresObj())
+ bDisable = false;
+ }
+ }
+ if (bDisable)
+ rSet.DisableItem (SID_SUMMARY_PAGE);
+ }
+
+ // starting of presentation possible?
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_PRESENTATION ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_REHEARSE_TIMINGS ) )
+ {
+ bool bDisable = true;
+ model::PageEnumeration aAllPages (
+ model::PageEnumerationProvider::CreateAllPagesEnumeration(mrSlideSorter.GetModel()));
+ while (aAllPages.HasMoreElements())
+ {
+ SdPage* pPage = aAllPages.GetNextElement()->GetPage();
+
+ if( !pPage->IsExcluded() )
+ bDisable = false;
+ }
+ if( bDisable || pDocShell->IsPreview())
+ {
+ rSet.DisableItem( SID_PRESENTATION );
+ rSet.DisableItem( SID_REHEARSE_TIMINGS );
+ }
+ }
+
+ // Disable the rename slots when there are no or more than one slides/master
+ // pages selected; disable the duplicate slot when there are no slides
+ // selected:
+ if (rSet.GetItemState(SID_RENAMEPAGE) == SfxItemState::DEFAULT
+ || rSet.GetItemState(SID_RENAME_MASTER_PAGE) == SfxItemState::DEFAULT
+ || rSet.GetItemState(SID_DUPLICATE_PAGE) == SfxItemState::DEFAULT)
+ {
+ int n = mrSlideSorter.GetController().GetPageSelector()
+ .GetSelectedPageCount();
+ if (n != 1)
+ {
+ rSet.DisableItem(SID_RENAMEPAGE);
+ rSet.DisableItem(SID_RENAME_MASTER_PAGE);
+ }
+ if (n == 0)
+ {
+ rSet.DisableItem(SID_DUPLICATE_PAGE);
+ }
+ }
+
+ if (rSet.GetItemState(SID_HIDE_SLIDE) == SfxItemState::DEFAULT
+ || rSet.GetItemState(SID_SHOW_SLIDE) == SfxItemState::DEFAULT)
+ {
+ model::PageEnumeration aSelectedPages (
+ model::PageEnumerationProvider::CreateSelectedPagesEnumeration(
+ mrSlideSorter.GetModel()));
+ const SlideExclusionState eState (GetSlideExclusionState(aSelectedPages));
+ switch (eState)
+ {
+ case MIXED:
+ // Show both entries.
+ break;
+
+ case EXCLUDED:
+ rSet.DisableItem(SID_HIDE_SLIDE);
+ break;
+
+ case INCLUDED:
+ rSet.DisableItem(SID_SHOW_SLIDE);
+ break;
+
+ case UNDEFINED:
+ rSet.DisableItem(SID_HIDE_SLIDE);
+ rSet.DisableItem(SID_SHOW_SLIDE);
+ break;
+ }
+ }
+
+ if (eEditMode == EditMode::MasterPage)
+ {
+ // Disable some slots when in master page mode.
+ rSet.DisableItem(SID_ASSIGN_LAYOUT);
+ rSet.DisableItem(SID_INSERTPAGE);
+
+ if (rSet.GetItemState(SID_DUPLICATE_PAGE) == SfxItemState::DEFAULT)
+ rSet.DisableItem(SID_DUPLICATE_PAGE);
+ }
+}
+
+void SlotManager::GetClipboardState ( SfxItemSet& rSet)
+{
+ SdTransferable* pTransferClip = SD_MOD()->pTransferClip;
+
+ if (rSet.GetItemState(SID_PASTE) == SfxItemState::DEFAULT
+ || rSet.GetItemState(SID_PASTE_SPECIAL) == SfxItemState::DEFAULT)
+ {
+ // no own clipboard data?
+ if ( !pTransferClip || !pTransferClip->GetDocShell().is() )
+ {
+ rSet.DisableItem(SID_PASTE);
+ rSet.DisableItem(SID_PASTE_SPECIAL);
+ }
+ else
+ {
+ SfxObjectShell* pTransferDocShell = pTransferClip->GetDocShell().get();
+
+ if( !pTransferDocShell || static_cast<DrawDocShell*>(pTransferDocShell)->GetDoc()->GetPageCount() <= 1 )
+ {
+ bool bIsPastingSupported (false);
+
+ // No or just one page. Check if there is anything that can be
+ // pasted via a DrawViewShell.
+ ViewShellBase* pBase = mrSlideSorter.GetViewShellBase();
+ if (pBase != nullptr)
+ {
+ std::shared_ptr<DrawViewShell> pDrawViewShell (
+ std::dynamic_pointer_cast<DrawViewShell>(pBase->GetMainViewShell()));
+ if (pDrawViewShell != nullptr)
+ {
+ TransferableDataHelper aDataHelper (
+ TransferableDataHelper::CreateFromSystemClipboard(
+ pDrawViewShell->GetActiveWindow()));
+ if (aDataHelper.GetFormatCount() > 0)
+ bIsPastingSupported = true;
+ }
+ }
+
+ if ( ! bIsPastingSupported)
+ {
+ rSet.DisableItem(SID_PASTE);
+ rSet.DisableItem(SID_PASTE_SPECIAL);
+ }
+ }
+ }
+ }
+
+ // Cut, copy and paste of master pages is not yet implemented properly
+ if (rSet.GetItemState(SID_COPY) == SfxItemState::DEFAULT
+ || rSet.GetItemState(SID_PASTE) == SfxItemState::DEFAULT
+ || rSet.GetItemState(SID_PASTE_SPECIAL) == SfxItemState::DEFAULT
+ || rSet.GetItemState(SID_CUT) == SfxItemState::DEFAULT)
+ {
+ if (mrSlideSorter.GetModel().GetEditMode() == EditMode::MasterPage)
+ {
+ if (rSet.GetItemState(SID_CUT) == SfxItemState::DEFAULT)
+ rSet.DisableItem(SID_CUT);
+ if (rSet.GetItemState(SID_COPY) == SfxItemState::DEFAULT)
+ rSet.DisableItem(SID_COPY);
+ if (rSet.GetItemState(SID_PASTE) == SfxItemState::DEFAULT)
+ rSet.DisableItem(SID_PASTE);
+ if (rSet.GetItemState(SID_PASTE_SPECIAL) == SfxItemState::DEFAULT)
+ rSet.DisableItem(SID_PASTE_SPECIAL);
+ }
+ }
+
+ ViewShellBase* pBase = mrSlideSorter.GetViewShellBase();
+ if (pBase && pBase->GetObjectShell()->isContentExtractionLocked())
+ {
+ rSet.DisableItem(SID_COPY);
+ rSet.DisableItem(SID_CUT);
+ }
+
+ // Cut, copy, and delete page are disabled when there is no selection.
+ if (!(rSet.GetItemState(SID_CUT) == SfxItemState::DEFAULT
+ || rSet.GetItemState(SID_COPY) == SfxItemState::DEFAULT
+ || rSet.GetItemState(SID_DELETE) == SfxItemState::DEFAULT
+ || rSet.GetItemState(SID_DELETE_PAGE) == SfxItemState::DEFAULT
+ || rSet.GetItemState(SID_DELETE_MASTER_PAGE) == SfxItemState::DEFAULT))
+ return;
+
+ model::PageEnumeration aSelectedPages (
+ model::PageEnumerationProvider::CreateSelectedPagesEnumeration(
+ mrSlideSorter.GetModel()));
+
+ // For copy to work we have to have at least one selected page.
+ if ( ! aSelectedPages.HasMoreElements())
+ rSet.DisableItem(SID_COPY);
+
+ bool bDisable = false;
+ // The operations that lead to the deletion of a page are valid if
+ // a) there is at least one selected page
+ // b) deleting the selected pages leaves at least one page in the
+ // document
+ // c) selected master pages must not be used by slides.
+
+ // Test a).
+ if ( ! aSelectedPages.HasMoreElements())
+ bDisable = true;
+ // Test b): Count the number of selected pages. It has to be less
+ // than the number of all pages.
+ else if (mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount()
+ >= mrSlideSorter.GetController().GetPageSelector().GetPageCount())
+ bDisable = true;
+ // Test c): Iterate over the selected pages and look for a master
+ // page that is used by at least one page.
+ else while (aSelectedPages.HasMoreElements())
+ {
+ SdPage* pPage = aSelectedPages.GetNextElement()->GetPage();
+ int nUseCount (mrSlideSorter.GetModel().GetDocument()
+ ->GetMasterPageUserCount(pPage));
+ if (nUseCount > 0)
+ {
+ bDisable = true;
+ break;
+ }
+ }
+
+ if (bDisable)
+ {
+ rSet.DisableItem(SID_CUT);
+ rSet.DisableItem(SID_DELETE_PAGE);
+ rSet.DisableItem(SID_DELETE_MASTER_PAGE);
+ }
+}
+
+void SlotManager::GetStatusBarState (SfxItemSet& rSet)
+{
+ // page view and layout
+ SdPage* pPage = nullptr;
+ sal_uInt16 nSelectedPages = mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount();
+
+ //Set number of slides
+ if (nSelectedPages > 0)
+ {
+ model::PageEnumeration aSelectedPages (
+ model::PageEnumerationProvider::CreateSelectedPagesEnumeration(
+ mrSlideSorter.GetModel()));
+ model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement());
+ OUString aPageStr;
+ if (pDescriptor)
+ {
+ pPage = pDescriptor->GetPage();
+ sal_uInt16 nFirstPage = (pPage->GetPageNum()/2) + 1;
+ sal_Int32 nPageCount = mrSlideSorter.GetModel().GetPageCount();
+ sal_Int32 nActivePageCount = static_cast<sal_Int32>(mrSlideSorter.GetModel().GetDocument()->GetActiveSdPageCount());
+
+ aPageStr = (nPageCount == nActivePageCount) ? SdResId(STR_SD_PAGE_COUNT) : SdResId(STR_SD_PAGE_COUNT_CUSTOM);
+
+ aPageStr = aPageStr.replaceFirst("%1", OUString::number(nFirstPage));
+ aPageStr = aPageStr.replaceFirst("%2", OUString::number(nPageCount));
+ if(nPageCount != nActivePageCount)
+ aPageStr = aPageStr.replaceFirst("%3", OUString::number(nActivePageCount));
+ }
+ rSet.Put( SfxStringItem( SID_STATUS_PAGE, aPageStr ) );
+ }
+ //Set layout
+ if (nSelectedPages == 1 && pPage != nullptr)
+ {
+ SdPage* pFirstPage = pPage;
+ OUString aLayoutStr = pFirstPage->GetLayoutName();
+ sal_Int32 nIndex = aLayoutStr.indexOf( SD_LT_SEPARATOR );
+ if( nIndex != -1 )
+ aLayoutStr = aLayoutStr.copy(0, nIndex);
+ rSet.Put( SfxStringItem( SID_STATUS_LAYOUT, aLayoutStr ) );
+ }
+ //Scale value
+ const Fraction& aUIScale = mrSlideSorter.GetModel().GetDocument()->GetUIScale();
+ OUString aString = OUString::number(aUIScale.GetNumerator()) +
+ ":" + OUString::number(aUIScale.GetDenominator());
+ rSet.Put( SfxStringItem( SID_SCALE, aString ) );
+}
+
+void SlotManager::RenameSlide(const SfxRequest& rRequest)
+{
+ View* pDrView = &mrSlideSorter.GetView();
+
+ if ( pDrView->IsTextEdit() )
+ {
+ pDrView->SdrEndTextEdit();
+ }
+
+ SdPage* pSelectedPage = nullptr;
+ model::PageEnumeration aSelectedPages (
+ model::PageEnumerationProvider::CreateSelectedPagesEnumeration(
+ mrSlideSorter.GetModel()));
+ if (aSelectedPages.HasMoreElements())
+ pSelectedPage = aSelectedPages.GetNextElement()->GetPage();
+ if (pSelectedPage == nullptr)
+ return;
+
+ // tdf#107183 Set different dialog titles when renaming
+ // master slides or normal ones
+ OUString aTitle;
+ if( rRequest.GetSlot() == SID_RENAME_MASTER_PAGE )
+ aTitle = SdResId( STR_TITLE_RENAMEMASTER );
+ else if (pDrView->GetDoc().GetDocumentType() == DocumentType::Draw)
+ aTitle = SdResId( STR_TITLE_RENAMEPAGE );
+ else
+ aTitle = SdResId( STR_TITLE_RENAMESLIDE );
+
+ OUString aDescr( SdResId( STR_DESC_RENAMESLIDE ) );
+ OUString aPageName = pSelectedPage->GetName();
+
+ if(rRequest.GetArgs())
+ {
+ OUString aName = rRequest.GetArgs()->GetItem<const SfxStringItem>(SID_RENAMEPAGE)->GetValue();
+
+ bool bResult = RenameSlideFromDrawViewShell(pSelectedPage->GetPageNum()/2, aName );
+ DBG_ASSERT( bResult, "Couldn't rename slide or page" );
+ }
+ else
+ {
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ vcl::Window* pWin = mrSlideSorter.GetContentWindow();
+ ScopedVclPtr<AbstractSvxNameDialog> aNameDlg(pFact->CreateSvxNameDialog(
+ pWin ? pWin->GetFrameWeld() : nullptr,
+ aPageName, aDescr));
+ OUString aOldName;
+ aNameDlg->GetName( aOldName );
+ aNameDlg->SetText( aTitle );
+ aNameDlg->SetCheckNameHdl( LINK( this, SlotManager, RenameSlideHdl ), true );
+ aNameDlg->SetCheckNameTooltipHdl( LINK( this, SlotManager, RenameSlideTooltipHdl ) );
+ aNameDlg->SetEditHelpId( HID_SD_NAMEDIALOG_PAGE );
+
+ if( aNameDlg->Execute() == RET_OK )
+ {
+ OUString aNewName;
+ aNameDlg->GetName( aNewName );
+ if (aNewName != aPageName)
+ {
+ bool bResult =
+ RenameSlideFromDrawViewShell(
+ pSelectedPage->GetPageNum()/2, aNewName );
+ DBG_ASSERT( bResult, "Couldn't rename slide or page" );
+ }
+ }
+ OUString aNewName;
+ aNameDlg->GetName( aNewName );
+ collectUIInformation({{"OldName", aOldName}, {"NewName", aNewName}}, "RENAME");
+ aNameDlg.disposeAndClear();
+ }
+ // Tell the slide sorter about the name change (necessary for
+ // accessibility.)
+ mrSlideSorter.GetController().PageNameHasChanged(
+ (pSelectedPage->GetPageNum()-1)/2, aPageName);
+}
+
+IMPL_LINK(SlotManager, RenameSlideHdl, AbstractSvxNameDialog&, rDialog, bool)
+{
+ OUString aNewName;
+ rDialog.GetName( aNewName );
+
+ model::SharedPageDescriptor pDescriptor (
+ mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide());
+ SdPage* pCurrentPage = nullptr;
+ if (pDescriptor)
+ pCurrentPage = pDescriptor->GetPage();
+
+ return (pCurrentPage!=nullptr && aNewName == pCurrentPage->GetName())
+ || (mrSlideSorter.GetViewShell()
+ && mrSlideSorter.GetViewShell()->GetDocSh()->IsNewPageNameValid( aNewName ) );
+}
+
+IMPL_STATIC_LINK_NOARG(SlotManager, RenameSlideTooltipHdl, AbstractSvxNameDialog&, OUString)
+{
+ return SdResId(STR_TOOLTIP_RENAME);
+}
+
+bool SlotManager::RenameSlideFromDrawViewShell( sal_uInt16 nPageId, const OUString & rName )
+{
+ bool bOutDummy;
+ SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument();
+ if( pDocument->GetPageByName( rName, bOutDummy ) != SDRPAGE_NOTFOUND )
+ return false;
+
+ SdPage* pPageToRename = nullptr;
+
+ SfxUndoManager* pManager = pDocument->GetDocSh()->GetUndoManager();
+
+ if( mrSlideSorter.GetModel().GetEditMode() == EditMode::Page )
+ {
+ model::SharedPageDescriptor pDescriptor (
+ mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide());
+ if (pDescriptor)
+ pPageToRename = pDescriptor->GetPage();
+
+ if (pPageToRename != nullptr)
+ {
+ // Undo
+ SdPage* pUndoPage = pPageToRename;
+ SdrLayerAdmin & rLayerAdmin = pDocument->GetLayerAdmin();
+ SdrLayerID nBackground = rLayerAdmin.GetLayerID(sUNO_LayerName_background);
+ SdrLayerID nBgObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects);
+ SdrLayerIDSet aVisibleLayers = pPageToRename->TRG_GetMasterPageVisibleLayers();
+
+ // (#67720#)
+ pManager->AddUndoAction(
+ std::make_unique<ModifyPageUndoAction>(
+ pDocument, pUndoPage, rName, pUndoPage->GetAutoLayout(),
+ aVisibleLayers.IsSet( nBackground ),
+ aVisibleLayers.IsSet( nBgObj )));
+
+ // rename
+ pPageToRename->SetName( rName );
+
+ // also rename notes-page
+ SdPage* pNotesPage = pDocument->GetSdPage( nPageId, PageKind::Notes );
+ if (pNotesPage != nullptr)
+ pNotesPage->SetName (rName);
+ }
+ }
+ else
+ {
+ // rename MasterPage -> rename LayoutTemplate
+ pPageToRename = pDocument->GetMasterSdPage( nPageId, PageKind::Standard );
+ if (pPageToRename != nullptr)
+ {
+ const OUString aOldLayoutName( pPageToRename->GetLayoutName() );
+ pManager->AddUndoAction( std::make_unique<RenameLayoutTemplateUndoAction>( pDocument, aOldLayoutName, rName ) );
+ pDocument->RenameLayoutTemplate( aOldLayoutName, rName );
+ }
+ }
+
+ bool bSuccess = pPageToRename!=nullptr && ( rName == pPageToRename->GetName() );
+
+ if( bSuccess )
+ {
+ // user edited page names may be changed by the page so update control
+ // aTabControl.SetPageText( nPageId, rName );
+
+ // set document to modified state
+ pDocument->SetChanged();
+
+ // inform navigator about change
+ if (mrSlideSorter.GetViewShell() && mrSlideSorter.GetViewShell()->GetViewFrame())
+ mrSlideSorter.GetViewShell()->GetViewFrame()->GetBindings().Invalidate(
+ SID_NAVIGATOR_STATE, true);
+ }
+
+ return bSuccess;
+}
+
+/** Insert a slide. The insertion position depends on a) the selection and
+ b) the mouse position when there is no selection.
+
+ When there is a selection then insertion takes place after the last
+ slide of the selection. For this to work all but the last selected
+ slide are deselected first.
+
+ Otherwise, when there is no selection but the insertion marker is visible
+ the slide is inserted at that position. The slide before that marker is
+ selected first.
+
+ When both the selection and the insertion marker are not visible--can
+ that happen?--the new slide is inserted after the last slide.
+*/
+void SlotManager::InsertSlide (SfxRequest& rRequest)
+{
+ const sal_Int32 nInsertionIndex (GetInsertionPosition());
+
+ PageSelector::BroadcastLock aBroadcastLock (mrSlideSorter);
+
+ SdPage* pNewPage = nullptr;
+ if (mrSlideSorter.GetModel().GetEditMode() == EditMode::Page)
+ {
+ SlideSorterViewShell* pShell = dynamic_cast<SlideSorterViewShell*>(
+ mrSlideSorter.GetViewShell());
+ if (pShell != nullptr)
+ {
+ pNewPage = pShell->CreateOrDuplicatePage (
+ rRequest,
+ PageKind::Standard,
+ nInsertionIndex>=0
+ ? mrSlideSorter.GetModel().GetPageDescriptor(nInsertionIndex)->GetPage()
+ : nullptr);
+ }
+ }
+ else
+ {
+ // Use the API to create a new page.
+ SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument();
+ Reference<drawing::XMasterPagesSupplier> xMasterPagesSupplier (
+ pDocument->getUnoModel(), UNO_QUERY);
+ if (xMasterPagesSupplier.is())
+ {
+ Reference<drawing::XDrawPages> xMasterPages (
+ xMasterPagesSupplier->getMasterPages());
+ if (xMasterPages.is())
+ {
+ xMasterPages->insertNewByIndex (nInsertionIndex+1);
+
+ // Create shapes for the default layout.
+ pNewPage = pDocument->GetMasterSdPage(
+ static_cast<sal_uInt16>(nInsertionIndex+1), PageKind::Standard);
+ pNewPage->CreateTitleAndLayout (true,true);
+ }
+ }
+ }
+ if (pNewPage == nullptr)
+ return;
+
+ // When a new page has been inserted then select it, make it the
+ // current page, and focus it.
+ view::SlideSorterView::DrawLock aDrawLock (mrSlideSorter);
+ PageSelector::UpdateLock aUpdateLock (mrSlideSorter);
+ mrSlideSorter.GetController().GetPageSelector().DeselectAllPages();
+ mrSlideSorter.GetController().GetPageSelector().SelectPage(pNewPage);
+ collectUIInformation({{"POS", OUString::number(nInsertionIndex + 2)}}, "Insert_New_Page_or_Slide");
+}
+
+void SlotManager::DuplicateSelectedSlides (SfxRequest& rRequest)
+{
+ // Create a list of the pages that are to be duplicated. The process of
+ // duplication alters the selection.
+ sal_Int32 nInsertPosition (0);
+ ::std::vector<SdPage*> aPagesToDuplicate;
+ model::PageEnumeration aSelectedPages (
+ model::PageEnumerationProvider::CreateSelectedPagesEnumeration(mrSlideSorter.GetModel()));
+ while (aSelectedPages.HasMoreElements())
+ {
+ model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement());
+ if (pDescriptor && pDescriptor->GetPage())
+ {
+ aPagesToDuplicate.push_back(pDescriptor->GetPage());
+ nInsertPosition = pDescriptor->GetPage()->GetPageNum()+2;
+ }
+ }
+
+ // Duplicate the pages in aPagesToDuplicate and collect the newly
+ // created pages in aPagesToSelect.
+ const bool bUndo (aPagesToDuplicate.size()>1 && mrSlideSorter.GetView().IsUndoEnabled());
+ if (bUndo)
+ mrSlideSorter.GetView().BegUndo(SdResId(STR_INSERTPAGE));
+
+ ::std::vector<SdPage*> aPagesToSelect;
+ for(const auto& rpPage : aPagesToDuplicate)
+ {
+ aPagesToSelect.push_back(
+ mrSlideSorter.GetViewShell()->CreateOrDuplicatePage(
+ rRequest, PageKind::Standard, rpPage, nInsertPosition));
+ nInsertPosition += 2;
+ }
+ aPagesToDuplicate.clear();
+
+ if (bUndo)
+ mrSlideSorter.GetView().EndUndo();
+
+ // Set the selection to the pages in aPagesToSelect.
+ PageSelector& rSelector (mrSlideSorter.GetController().GetPageSelector());
+ rSelector.DeselectAllPages();
+ for (auto const& it: aPagesToSelect)
+ {
+ rSelector.SelectPage(it);
+ }
+
+ collectUIInformation({{"POS", OUString::number(nInsertPosition + 2)}}, "Duplicate");
+}
+
+void SlotManager::ChangeSlideExclusionState (
+ const model::SharedPageDescriptor& rpDescriptor,
+ const bool bExcludeSlide)
+{
+ if (rpDescriptor)
+ {
+ mrSlideSorter.GetView().SetState(
+ rpDescriptor,
+ model::PageDescriptor::ST_Excluded,
+ bExcludeSlide);
+ }
+ else
+ {
+ model::PageEnumeration aSelectedPages (
+ model::PageEnumerationProvider::CreateSelectedPagesEnumeration(
+ mrSlideSorter.GetModel()));
+ while (aSelectedPages.HasMoreElements())
+ {
+ model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement());
+ mrSlideSorter.GetView().SetState(
+ pDescriptor,
+ model::PageDescriptor::ST_Excluded,
+ bExcludeSlide);
+ }
+ }
+
+ SfxBindings& rBindings (mrSlideSorter.GetViewShell()->GetViewFrame()->GetBindings());
+ rBindings.Invalidate(SID_PRESENTATION);
+ rBindings.Invalidate(SID_REHEARSE_TIMINGS);
+ rBindings.Invalidate(SID_HIDE_SLIDE);
+ rBindings.Invalidate(SID_SHOW_SLIDE);
+ mrSlideSorter.GetModel().GetDocument()->SetChanged();
+}
+
+sal_Int32 SlotManager::GetInsertionPosition() const
+{
+ PageSelector& rSelector (mrSlideSorter.GetController().GetPageSelector());
+
+ // The insertion indicator is preferred. After all the user explicitly
+ // used it to define the insertion position.
+ if (mrSlideSorter.GetController().GetInsertionIndicatorHandler()->IsActive())
+ {
+ // Select the page before the insertion indicator.
+ return mrSlideSorter.GetController().GetInsertionIndicatorHandler()->GetInsertionPageIndex()
+ - 1;
+ }
+
+ // Is there a stored insertion position?
+ else if (mrSlideSorter.GetController().GetSelectionManager()->GetInsertionPosition() >= 0)
+ {
+ return mrSlideSorter.GetController().GetSelectionManager()->GetInsertionPosition() - 1;
+ }
+
+ // Use the index of the last selected slide.
+ else if (rSelector.GetSelectedPageCount() > 0)
+ {
+ for (int nIndex=rSelector.GetPageCount()-1; nIndex>=0; --nIndex)
+ if (rSelector.IsPageSelected(nIndex))
+ return nIndex;
+
+ // We should never get here.
+ OSL_ASSERT(false);
+ return rSelector.GetPageCount() - 1;
+ }
+
+ // Select the last page when there is at least one page.
+ else if (rSelector.GetPageCount() > 0)
+ {
+ return rSelector.GetPageCount() - 1;
+ }
+
+ // Hope for the best that CreateOrDuplicatePage() can cope with an empty
+ // selection.
+ else
+ {
+ // We should never get here because there has to be at least one page.
+ OSL_ASSERT(false);
+ return -1;
+ }
+}
+
+void SlotManager::NotifyEditModeChange()
+{
+ SfxBindings& rBindings (mrSlideSorter.GetViewShell()->GetViewFrame()->GetBindings());
+ rBindings.Invalidate(SID_PRESENTATION);
+ rBindings.Invalidate(SID_INSERTPAGE);
+ rBindings.Invalidate(SID_DUPLICATE_PAGE);
+}
+
+namespace {
+
+SlideExclusionState GetSlideExclusionState (model::PageEnumeration& rPageSet)
+{
+ SlideExclusionState eState (UNDEFINED);
+
+ // Get toggle state of the selected pages.
+ while (rPageSet.HasMoreElements() && eState!=MIXED)
+ {
+ const bool bState = rPageSet.GetNextElement()->GetPage()->IsExcluded();
+ switch (eState)
+ {
+ case UNDEFINED:
+ // Use the first selected page to set the initial value.
+ eState = bState ? EXCLUDED : INCLUDED;
+ break;
+
+ case EXCLUDED:
+ // The pages before where all not part of the show,
+ // this one is.
+ if ( ! bState)
+ eState = MIXED;
+ break;
+
+ case INCLUDED:
+ // The pages before where all part of the show,
+ // this one is not.
+ if (bState)
+ eState = MIXED;
+ break;
+
+ default:
+ // No need to change anything.
+ break;
+ }
+ }
+
+ return eState;
+}
+
+} // end of anonymous namespace
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsTransferableData.cxx b/sd/source/ui/slidesorter/controller/SlsTransferableData.cxx
new file mode 100644
index 000000000..f4b89a5ab
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsTransferableData.cxx
@@ -0,0 +1,86 @@
+/* -*- 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 <controller/SlsTransferableData.hxx>
+
+#include <SlideSorterViewShell.hxx>
+
+namespace sd::slidesorter::controller {
+
+rtl::Reference<SdTransferable> TransferableData::CreateTransferable (
+ SdDrawDocument* pSrcDoc,
+ SlideSorterViewShell* pViewShell,
+ ::std::vector<Representative>&& rRepresentatives)
+{
+ rtl::Reference<SdTransferable> pTransferable = new SdTransferable (pSrcDoc, nullptr, false/*bInitOnGetData*/);
+ auto pData = std::make_shared<TransferableData>(pViewShell, std::move(rRepresentatives));
+ pTransferable->AddUserData(pData);
+ return pTransferable;
+}
+
+std::shared_ptr<TransferableData> TransferableData::GetFromTransferable (const SdTransferable* pTransferable)
+{
+ if (pTransferable)
+ {
+ for (sal_Int32 nIndex=0,nCount=pTransferable->GetUserDataCount(); nIndex<nCount; ++nIndex)
+ {
+ std::shared_ptr<TransferableData> xData =
+ std::dynamic_pointer_cast<TransferableData>(pTransferable->GetUserData(nIndex));
+ if (xData)
+ return xData;
+ }
+ }
+ return std::shared_ptr<TransferableData>();
+}
+
+TransferableData::TransferableData (
+ SlideSorterViewShell* pViewShell,
+ ::std::vector<Representative>&& rRepresentatives)
+ : mpViewShell(pViewShell),
+ maRepresentatives(std::move(rRepresentatives))
+{
+ if (mpViewShell != nullptr)
+ StartListening(*mpViewShell);
+}
+
+TransferableData::~TransferableData()
+{
+ if (mpViewShell != nullptr)
+ EndListening(*mpViewShell);
+}
+
+void TransferableData::Notify (SfxBroadcaster&, const SfxHint& rHint)
+{
+ if (mpViewShell)
+ {
+ if (rHint.GetId() == SfxHintId::Dying)
+ {
+ // This hint may come either from the ViewShell or from the
+ // document (registered by SdTransferable). We do not know
+ // which but both are sufficient to disconnect from the
+ // ViewShell.
+ EndListening(*mpViewShell);
+ mpViewShell = nullptr;
+ }
+ }
+}
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/controller/SlsVisibleAreaManager.cxx b/sd/source/ui/slidesorter/controller/SlsVisibleAreaManager.cxx
new file mode 100644
index 000000000..6f85f362d
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsVisibleAreaManager.cxx
@@ -0,0 +1,234 @@
+/* -*- 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 <controller/SlsVisibleAreaManager.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsAnimationFunction.hxx>
+#include <controller/SlsScrollBarManager.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <Window.hxx>
+#include <SlideSorter.hxx>
+#include <view/SlideSorterView.hxx>
+
+namespace sd::slidesorter::controller {
+
+namespace {
+ class VisibleAreaScroller
+ {
+ public:
+ VisibleAreaScroller (
+ SlideSorter& rSlideSorter,
+ const Point& rStart,
+ const Point& rEnd);
+ void operator() (const double nValue);
+ private:
+ SlideSorter& mrSlideSorter;
+ Point maStart;
+ const Point maEnd;
+ const ::std::function<double (double)> maAccelerationFunction;
+ };
+
+} // end of anonymous namespace
+
+VisibleAreaManager::VisibleAreaManager (SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter),
+ mbIsCurrentSlideTrackingActive(true),
+ mnDisableCount(0)
+{
+}
+
+VisibleAreaManager::~VisibleAreaManager()
+{
+}
+
+void VisibleAreaManager::ActivateCurrentSlideTracking()
+{
+ mbIsCurrentSlideTrackingActive = true;
+}
+
+void VisibleAreaManager::DeactivateCurrentSlideTracking()
+{
+ mbIsCurrentSlideTrackingActive = false;
+}
+
+void VisibleAreaManager::RequestVisible (
+ const model::SharedPageDescriptor& rpDescriptor,
+ const bool bForce)
+{
+ if (!rpDescriptor)
+ return;
+
+ if (mnDisableCount == 0)
+ {
+ maVisibleRequests.push_back(
+ mrSlideSorter.GetView().GetLayouter().GetPageObjectBox(
+ rpDescriptor->GetPageIndex(),
+ true));
+ }
+ if (bForce && ! mbIsCurrentSlideTrackingActive)
+ ActivateCurrentSlideTracking();
+ MakeVisible();
+}
+
+void VisibleAreaManager::RequestCurrentSlideVisible()
+{
+ if (mbIsCurrentSlideTrackingActive && mnDisableCount==0)
+ RequestVisible(
+ mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide());
+}
+
+void VisibleAreaManager::MakeVisible()
+{
+ if (maVisibleRequests.empty())
+ return;
+
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if ( ! pWindow)
+ return;
+ const Point aCurrentTopLeft (pWindow->PixelToLogic(Point(0,0)));
+
+ const ::std::optional<Point> aNewVisibleTopLeft (GetRequestedTopLeft());
+ maVisibleRequests.clear();
+ if ( ! aNewVisibleTopLeft)
+ return;
+
+ maRequestedVisibleTopLeft = *aNewVisibleTopLeft;
+ VisibleAreaScroller aAnimation(
+ mrSlideSorter,
+ aCurrentTopLeft,
+ maRequestedVisibleTopLeft);
+ // Execute the animation at its final value.
+ aAnimation(1.0);
+}
+
+::std::optional<Point> VisibleAreaManager::GetRequestedTopLeft() const
+{
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if ( ! pWindow)
+ return ::std::optional<Point>();
+
+ // Get the currently visible area and the model area.
+ const ::tools::Rectangle aVisibleArea (pWindow->PixelToLogic(
+ ::tools::Rectangle(
+ Point(0,0),
+ pWindow->GetOutputSizePixel())));
+ const ::tools::Rectangle aModelArea (mrSlideSorter.GetView().GetModelArea());
+
+ sal_Int32 nVisibleTop (aVisibleArea.Top());
+ const sal_Int32 nVisibleWidth (aVisibleArea.GetWidth());
+ sal_Int32 nVisibleLeft (aVisibleArea.Left());
+ const sal_Int32 nVisibleHeight (aVisibleArea.GetHeight());
+
+ // Find the longest run of boxes whose union fits into the visible area.
+ for (const auto& rBox : maVisibleRequests)
+ {
+ if (nVisibleTop+nVisibleHeight <= rBox.Bottom())
+ nVisibleTop = rBox.Bottom()-nVisibleHeight;
+ if (nVisibleTop > rBox.Top())
+ nVisibleTop = rBox.Top();
+
+ if (nVisibleLeft+nVisibleWidth <= rBox.Right())
+ nVisibleLeft = rBox.Right()-nVisibleWidth;
+ if (nVisibleLeft > rBox.Left())
+ nVisibleLeft = rBox.Left();
+
+ // Make sure the visible area does not move outside the model area.
+ if (nVisibleTop + nVisibleHeight > aModelArea.Bottom())
+ nVisibleTop = aModelArea.Bottom() - nVisibleHeight;
+ if (nVisibleTop < aModelArea.Top())
+ nVisibleTop = aModelArea.Top();
+
+ if (nVisibleLeft + nVisibleWidth > aModelArea.Right())
+ nVisibleLeft = aModelArea.Right() - nVisibleWidth;
+ if (nVisibleLeft < aModelArea.Left())
+ nVisibleLeft = aModelArea.Left();
+ }
+
+ const Point aRequestedTopLeft (nVisibleLeft, nVisibleTop);
+ if (aRequestedTopLeft == aVisibleArea.TopLeft())
+ return ::std::optional<Point>();
+ else
+ return ::std::optional<Point>(aRequestedTopLeft);
+}
+
+//===== VisibleAreaManager::TemporaryDisabler =================================
+
+VisibleAreaManager::TemporaryDisabler::TemporaryDisabler (SlideSorter const & rSlideSorter)
+ : mrVisibleAreaManager(rSlideSorter.GetController().GetVisibleAreaManager())
+{
+ ++mrVisibleAreaManager.mnDisableCount;
+}
+
+VisibleAreaManager::TemporaryDisabler::~TemporaryDisabler()
+{
+ --mrVisibleAreaManager.mnDisableCount;
+}
+
+//===== VerticalVisibleAreaScroller ===========================================
+
+namespace {
+
+const sal_Int32 gnMaxScrollDistance = 300;
+
+VisibleAreaScroller::VisibleAreaScroller (
+ SlideSorter& rSlideSorter,
+ const Point& rStart,
+ const Point& rEnd)
+ : mrSlideSorter(rSlideSorter),
+ maStart(rStart),
+ maEnd(rEnd),
+ maAccelerationFunction(
+ controller::AnimationParametricFunction(
+ controller::AnimationBezierFunction (0.1,0.6)))
+{
+ // When the distance to scroll is larger than a threshold then first
+ // jump to within this distance of the final value and start the
+ // animation from there.
+ if (std::abs(rStart.X()-rEnd.X()) > gnMaxScrollDistance)
+ {
+ if (rStart.X() < rEnd.X())
+ maStart.setX( rEnd.X()-gnMaxScrollDistance );
+ else
+ maStart.setX( rEnd.X()+gnMaxScrollDistance );
+ }
+ if (std::abs(rStart.Y()-rEnd.Y()) > gnMaxScrollDistance)
+ {
+ if (rStart.Y() < rEnd.Y())
+ maStart.setY( rEnd.Y()-gnMaxScrollDistance );
+ else
+ maStart.setY( rEnd.Y()+gnMaxScrollDistance );
+ }
+}
+
+void VisibleAreaScroller::operator() (const double nTime)
+{
+ const double nLocalTime (maAccelerationFunction(nTime));
+ mrSlideSorter.GetController().GetScrollBarManager().SetTopLeft(
+ Point(
+ sal_Int32(0.5 + maStart.X() * (1.0 - nLocalTime) + maEnd.X() * nLocalTime),
+ sal_Int32 (0.5 + maStart.Y() * (1.0 - nLocalTime) + maEnd.Y() * nLocalTime)));
+}
+
+} // end of anonymous namespace
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/cache/SlsCacheContext.hxx b/sd/source/ui/slidesorter/inc/cache/SlsCacheContext.hxx
new file mode 100644
index 000000000..12993fdbb
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/cache/SlsCacheContext.hxx
@@ -0,0 +1,98 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+#include <com/sun/star/uno/Reference.hxx>
+#include <memory>
+#include <vector>
+
+namespace com::sun::star::uno
+{
+class XInterface;
+}
+
+class SdrPage;
+
+namespace sd::slidesorter::cache
+{
+typedef const SdrPage* CacheKey;
+
+/** This interface allows the individualisation of different instances of
+ the PreviewCache.
+*/
+class CacheContext
+{
+public:
+ virtual ~CacheContext() {}
+
+ /** This method is called when the asynchronous creation of a preview
+ has been finished.
+ @param aKey
+ The key of the page for which the preview has been created.
+ */
+ virtual void NotifyPreviewCreation(CacheKey aKey) = 0;
+
+ /** Called to determine whether the system is idle and a preview can be
+ created without annoying the user.
+ */
+ virtual bool IsIdle() = 0;
+
+ /** This method is used to determine whether a page is currently visible
+ or not. It is called when the cache becomes too large and some
+ previews have to be released or scaled down.
+ */
+ virtual bool IsVisible(CacheKey aKey) = 0;
+
+ /** Return the page associated with the given key. Note that different
+ keys may map to a single page (this may be the case with custom
+ slide shows.)
+ */
+ virtual const SdrPage* GetPage(CacheKey aKey) = 0;
+
+ /** This method is used when the request queue is filled. It asks for
+ the list of visible entries and maybe for the list of not visible
+ entries and creates preview creation requests for them.
+ @param bVisible
+ When this is <FALSE/> then the implementation can decide whether
+ to allow rendering of previews that are not visible (ahead of
+ time). When not then return an empty pointer or an empty vector.
+ */
+ virtual std::shared_ptr<std::vector<CacheKey>> GetEntryList(bool bVisible) = 0;
+
+ /** Return the priority that defines the order in which previews are
+ created for different keys/pages. Typically the visible pages come
+ first, then top-down, left-to-right.
+ */
+ virtual sal_Int32 GetPriority(CacheKey aKey) = 0;
+
+ /** Return the model to which the pages belong for which the called
+ cache manages the previews. Different caches that belong to the
+ same model but have different preview sizes may access previews of
+ each other in order to create fast previews of the previews.
+ */
+ virtual css::uno::Reference<css::uno::XInterface> GetModel() = 0;
+};
+
+typedef std::shared_ptr<CacheContext> SharedCacheContext;
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/cache/SlsPageCache.hxx b/sd/source/ui/slidesorter/inc/cache/SlsPageCache.hxx
new file mode 100644
index 000000000..4fb596195
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/cache/SlsPageCache.hxx
@@ -0,0 +1,141 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <cache/SlsCacheContext.hxx>
+#include <vcl/bitmapex.hxx>
+#include <memory>
+
+class Size;
+
+namespace sd::slidesorter::cache
+{
+class GenericPageCache;
+
+/** The page cache is responsible for the creation and storage of preview
+ bitmaps of pages that are shown by the slide sorter.
+
+ <p>Bitmaps for previews and a cache are used to speed up the display
+ (painting) of the slide sorter. But, of course, we have to limit this
+ time-space-tradeoff by limiting the amount of space that can be use to
+ store bitmaps.</p>
+
+ <p>There are several strategies employed by this class to shorten the
+ perceived time that is used to paint the slide sorter:
+ <ul>
+ <li>Rendering pages ahead of time. Additionally to rendering the
+ visible slides we try to render part or all of the slides that are not
+ (yet) visible. This, of course, makes sense only when the computer is
+ otherwise idle while doing that.</li>
+ <li>When the size of the slides on the screen changes we mark the
+ bitmaps as needing an update but use them while the new bitmap in the
+ correct size is not available.</li>
+ <li>Give the UI the chance to handle user events between the rendering
+ of differe slides.</li>
+ <li>Limit the amount of space that may be used for storing preview
+ bitmaps and throw.</li>
+ </p>
+
+ <p>There is another somewhat similar methods for requesting new previews:
+ GetPreviewBitmap() schedules a re-rendering (when necessary) and
+ returns the preview what is currently available, either as a preview of
+ the preview or, when nothing has changed since the last call, as the
+ final thing.
+ </p>
+*/
+class PageCache
+{
+public:
+ /** The page cache is created with a reference to the slide sorter so
+ that it has access to both the view and the model and so can fill
+ itself with requests for all or just the visible pages.
+
+ It is the task of the PageCacheManager to create new objects of this
+ class.
+ */
+ PageCache(const Size& rPreviewSize, const bool bDoSuperSampling,
+ const SharedCacheContext& rpCacheContext);
+
+ ~PageCache();
+
+ void ChangeSize(const Size& rPreviewSize, const bool bDoSuperSampling);
+
+ /** Request a preview bitmap for the specified page object in the
+ specified size. The returned bitmap may be a preview of the
+ preview, i.e. either a scaled (up or down) version of a previous
+ preview (of the wrong size) or an empty bitmap. In this case a
+ request for the generation of a new preview is created and inserted
+ into the request queue. When the preview is available in the right
+ size the page shape will be told to paint itself again. When it
+ then calls this method again if receives the correctly sized preview
+ bitmap.
+ @param rRequestData
+ This data is used to determine the preview.
+ @param bResize
+ When <TRUE/> then when the available bitmap has not the
+ requested size, it is scaled before it is returned. When
+ <FALSE/> then the bitmap is returned in the wrong size and it is
+ the task of the caller to scale it.
+ @return
+ Returns a bitmap that is either empty, contains a scaled (up or
+ down) version or is the requested bitmap.
+ */
+ BitmapEx GetPreviewBitmap(const CacheKey aKey, const bool bResize);
+
+ BitmapEx GetMarkedPreviewBitmap(const CacheKey aKey);
+ void SetMarkedPreviewBitmap(const CacheKey aKey, const BitmapEx& rBitmap);
+
+ /** When the requested preview bitmap does not yet exist or is not
+ up-to-date then the rendering of one is scheduled. Otherwise this
+ method does nothing.
+ */
+ void RequestPreviewBitmap(const CacheKey aKey);
+
+ /** Tell the cache that the bitmap associated with the given request
+ data is not up-to-date anymore. This will invalidate all previews
+ in other caches that represent the same page as well.
+ A new preview is requested and will lead
+ eventually to a repaint of the associated page object.
+ */
+ void InvalidatePreviewBitmap(const CacheKey aKey);
+
+ /** Call this method when all preview bitmaps have to be generated anew.
+ This is the case when the size of the page objects on the screen has
+ changed or when the model has changed.
+ */
+ void InvalidateCache();
+
+ /** With the precious flag you can control whether a bitmap can be
+ removed or reduced in size to make room for other bitmaps or is so
+ precious that it will not touched. A typical use is to set the
+ precious flag for exactly the visible pages.
+ */
+ void SetPreciousFlag(const CacheKey aKey, const bool bIsPrecious);
+
+ void Pause();
+ void Resume();
+
+private:
+ std::unique_ptr<GenericPageCache> mpImplementation;
+};
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/cache/SlsPageCacheManager.hxx b/sd/source/ui/slidesorter/inc/cache/SlsPageCacheManager.hxx
new file mode 100644
index 000000000..eaddea5b2
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/cache/SlsPageCacheManager.hxx
@@ -0,0 +1,155 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+#include <com/sun/star/uno/XInterface.hpp>
+#include <memory>
+#include <vector>
+
+class Size;
+class SdrPage;
+
+namespace sd::slidesorter::cache {
+
+class BitmapCache;
+
+/** Provide and manage the preview bitmap caches for all slide sorter
+ instances. There is one cache per active slide sorter plus a small
+ number of caches that are no longer in use. The later are kept to speed
+ up the switching between views.
+*/
+class PageCacheManager
+{
+public:
+ typedef std::vector< std::pair<Size, std::shared_ptr<BitmapCache> > > BestFittingPageCaches;
+ typedef css::uno::Reference<css::uno::XInterface> DocumentKey;
+
+ /** Return the one instance of the PageCacheManager class.
+ */
+ static std::shared_ptr<PageCacheManager> Instance();
+
+ /** Look up the cache for the given model in which the previews have the
+ specified size. If no such cache exists, then one is created. When
+ a new BitmapCache is created its Recycle() method is called with a
+ sorted list of existing caches from which the new one initialize its
+ previews.
+ @return
+ The returned cache lives as long as somebody keeps a shared
+ pointer and the ReleaseCache() method has not been called.
+ */
+ std::shared_ptr<BitmapCache> GetCache (
+ const DocumentKey& pDocument,
+ const Size& rPreviewSize);
+
+ /** Tell the cache manager to release its own reference to the specified
+ cache. After that the cache will live as long as the caller (and
+ maybe others) holds its reference.
+ */
+ void ReleaseCache (const std::shared_ptr<BitmapCache>& rpCache);
+
+ /** This is an information to the cache manager that the size of preview
+ bitmaps in the specified cache has changed.
+
+ */
+ std::shared_ptr<BitmapCache> ChangeSize (
+ const std::shared_ptr<BitmapCache>& rpCache,
+ const Size& rOldPreviewSize,
+ const Size& rNewPreviewSize);
+
+ /** Invalidate the preview bitmap for one slide that belongs to the
+ specified document. The bitmaps for this slide in all caches are
+ marked as out-of-date and will be re-created when they are requested
+ the next time.
+ */
+ bool InvalidatePreviewBitmap (
+ const DocumentKey& pDocument,
+ const SdrPage* pPage);
+
+ /** Invalidate the preview bitmaps for all slides that belong to the
+ specified document. This is necessary after model changes that
+ affect e.g. page number fields.
+ */
+ void InvalidateAllPreviewBitmaps (const DocumentKey& pDocument);
+
+ /** Invalidate all the caches that are currently in use and destroy
+ those that are not. This is used for example when the high contrast
+ mode is turned on or off.
+ */
+ void InvalidateAllCaches();
+
+ /** Call this method when a page has been deleted and its preview
+ is not needed anymore.
+ */
+ void ReleasePreviewBitmap (const SdrPage* pPage);
+
+private:
+ /** Singleton instance of the cache manager. Note that this is a weak
+ pointer. The (implementation class of) ViewShellBase holds a
+ shared_ptr so that the cache manager has the same life time as the
+ ViewShellBase.
+ */
+ static std::weak_ptr<PageCacheManager> mpInstance;
+
+ /// List of active caches.
+ class PageCacheContainer;
+ std::unique_ptr<PageCacheContainer> mpPageCaches;
+
+ /// List of inactive, recently used caches.
+ class RecentlyUsedPageCaches;
+ std::unique_ptr<RecentlyUsedPageCaches> mpRecentlyUsedPageCaches;
+
+ /** The maximal number of recently used caches that are kept alive after
+ they have become inactive, i.e. after they are not used anymore by a
+ slide sorter.
+ */
+ static const sal_uInt32 mnMaximalRecentlyCacheCount = 2;
+
+ PageCacheManager();
+ ~PageCacheManager();
+
+ class Deleter;
+ friend class Deleter;
+
+ std::shared_ptr<BitmapCache> GetRecentlyUsedCache(
+ const DocumentKey& pDocument,
+ const Size& rSize);
+
+ /** Add the given cache to the list of recently used caches for the
+ document. There is one such list per document. Each least has at
+ most mnMaximalRecentlyCacheCount members.
+ */
+ void PutRecentlyUsedCache(
+ DocumentKey const & pDocument,
+ const Size& rPreviewSize,
+ const std::shared_ptr<BitmapCache>& rpCache);
+
+ /** This method is used internally to initialize a newly created
+ BitmapCache with already existing previews.
+ */
+ void Recycle (
+ const std::shared_ptr<BitmapCache>& rpCache,
+ const DocumentKey& pDocument,
+ const Size& rPreviewSize);
+};
+
+} // end of namespace ::sd::slidesorter::cache
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlideSorterController.hxx b/sd/source/ui/slidesorter/inc/controller/SlideSorterController.hxx
new file mode 100644
index 000000000..10c2aa13e
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlideSorterController.hxx
@@ -0,0 +1,327 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <model/SlsSharedPageDescriptor.hxx>
+#include <pres.hxx>
+
+#include <tools/link.hxx>
+#include <tools/gen.hxx>
+#include <rtl/ref.hxx>
+#include <rtl/ustring.hxx>
+
+#include <sddllapi.h>
+
+#include <memory>
+#include <vector>
+
+namespace com::sun::star::container
+{
+class XIndexAccess;
+}
+namespace com::sun::star::uno
+{
+template <typename> class Reference;
+}
+namespace sd
+{
+class FuPoor;
+}
+namespace sd
+{
+class Window;
+}
+namespace vcl
+{
+class Window;
+}
+
+namespace sd::slidesorter
+{
+class SlideSorter;
+}
+namespace sd::slidesorter::view
+{
+class SlideSorterView;
+}
+namespace sd::slidesorter::model
+{
+class SlideSorterModel;
+}
+
+class CommandEvent;
+class SdPage;
+class SfxItemSet;
+class SfxRequest;
+class VclSimpleEvent;
+class VclWindowEvent;
+
+namespace sd::slidesorter::controller
+{
+class Animator;
+class Clipboard;
+class CurrentSlideManager;
+class FocusManager;
+class InsertionIndicatorHandler;
+class Listener;
+class PageSelector;
+class ScrollBarManager;
+class SelectionFunction;
+class SelectionManager;
+class SlotManager;
+class VisibleAreaManager;
+
+class SlideSorterController final
+{
+public:
+ /** Create a new controller for the slide sorter.
+ @param pParentWindow
+ The window that contains the controls of the new
+ controller.
+ */
+ SlideSorterController(SlideSorter& rSlideSorter);
+
+ /** Late initialization. Call this method once a new object has been
+ created.
+ */
+ void Init();
+
+ ~SlideSorterController();
+
+ void Dispose();
+
+ /** Place and size the scroll bars and the browser window so that the
+ given rectangle is filled.
+ */
+ void Resize(const ::tools::Rectangle& rAvailableSpace);
+
+ /** Determine which of the UI elements--the scroll bars, the scroll bar
+ filler, the actual slide sorter view--are visible and place them in
+ the area last passed to Resize().
+ @param bForce
+ When <TRUE/> is given (<FALSE/> is the default) then the content
+ window and with it the SlideSorterView is resized event when its
+ size does not change (the size does change when the visibility
+ of scroll bars changes.)
+ */
+ void Rearrange(bool bForce);
+
+ /** Return the descriptor of the page that is rendered under the
+ given position. This takes the IsOnlyPreviewTriggersMouseOver
+ property into account.
+ @return
+ Returns a pointer to a page descriptor instead of a
+ reference because when no page is found at the position
+ then NULL is returned to indicate this.
+ */
+ model::SharedPageDescriptor GetPageAt(const Point& rPixelPosition);
+
+ // Exported for unit test
+ SD_DLLPUBLIC PageSelector& GetPageSelector();
+ FocusManager& GetFocusManager();
+ // Exported for unit test
+ SD_DLLPUBLIC controller::Clipboard& GetClipboard();
+
+ /** Return the object that manages the scroll bars.
+ */
+ ScrollBarManager& GetScrollBarManager();
+
+ std::shared_ptr<CurrentSlideManager> const& GetCurrentSlideManager() const;
+ std::shared_ptr<SlotManager> const& GetSlotManager() const;
+ std::shared_ptr<SelectionManager> const& GetSelectionManager() const;
+ std::shared_ptr<InsertionIndicatorHandler> const& GetInsertionIndicatorHandler() const;
+
+ /** This method forwards the call to the SlideSorterView and executes
+ pending operations like moving selected pages into the visible area.
+ */
+ void Paint(const ::tools::Rectangle& rRect, vcl::Window* pWin);
+
+ void FuTemporary(SfxRequest& rRequest);
+ void FuPermanent(SfxRequest& rRequest);
+ void FuSupport(SfxRequest& rRequest);
+ bool Command(const CommandEvent& rEvent, ::sd::Window* pWindow);
+
+ void GetCtrlState(SfxItemSet& rSet);
+ void GetStatusBarState(SfxItemSet& rSet);
+
+ void ExecCtrl(SfxRequest& rRequest);
+ void GetAttrState(SfxItemSet& rSet);
+
+ /** Create an object of this inner class to prevent updates due to model
+ changes.
+ */
+ class ModelChangeLock
+ {
+ public:
+ ModelChangeLock(SlideSorterController& rController);
+ ~ModelChangeLock() COVERITY_NOEXCEPT_FALSE;
+ void Release();
+
+ private:
+ SlideSorterController* mpController;
+ };
+ friend class ModelChangeLock;
+
+ /** Handle a change of the model, that is, handle the removal and
+ insertion of whole pages or a change of the edit mode.
+
+ This method is a convenience function that simply calls
+ PreModelChange() and then PostModelChange().
+ */
+ void HandleModelChange();
+
+ DECL_LINK(WindowEventHandler, VclWindowEvent&, void);
+ DECL_LINK(ApplicationEventHandler, VclSimpleEvent&, void);
+
+ /** Update the display of all pages. This involves a redraw and
+ releasing previews and caches.
+ */
+ void UpdateAllPages();
+
+ /** This factory method creates a selection function.
+ */
+ rtl::Reference<FuPoor> CreateSelectionFunction(SfxRequest& rRequest);
+
+ /** When the current function of the view shell is the slide sorter
+ selection function then return a reference to it. Otherwise return
+ an empty reference.
+ */
+ ::rtl::Reference<SelectionFunction> GetCurrentSelectionFunction() const;
+
+ /** Prepare for a change of the edit mode. Depending on the current
+ edit mode we may save the selection so that it can be restored when
+ later changing back to the current edit mode.
+ */
+ void PrepareEditModeChange();
+
+ /** Set a new edit mode and return whether the edit mode really
+ has been changed. For proper saving and restoring of the selection
+ this method should be called between calls to
+ PrepareEditModeChange() and FinishEditModeChange().
+ */
+ void ChangeEditMode(EditMode eEditMode);
+
+ /** Finish the change of the edit mode. Here we may select a page or
+ restore a previously saved selection.
+ */
+ void FinishEditModeChange();
+
+ /** Call this method when the name of one of the pages has changed.
+ This is then notified to the accessibility object, when that exists.
+ @param nPageIndex
+ The index of the page whose name has been changed.
+ @param rsOldName
+ The old name of the page. The new name can be taken from the
+ page object.
+ */
+ void PageNameHasChanged(int nPageIndex, const OUString& rsOldName);
+
+ /** Provide the set of pages to be displayed in the slide sorter. The
+ GetDocumentSlides() method can be found only in the SlideSorterModel.
+ */
+ void SetDocumentSlides(const css::uno::Reference<css::container::XIndexAccess>& rxSlides);
+
+ /** Return an Animator object.
+ */
+ const std::shared_ptr<Animator>& GetAnimator() const { return mpAnimator; }
+
+ VisibleAreaManager& GetVisibleAreaManager() const;
+
+ void CheckForMasterPageAssignment();
+ void CheckForSlideTransitionAssignment();
+
+private:
+ SlideSorter& mrSlideSorter;
+ model::SlideSorterModel& mrModel;
+ view::SlideSorterView& mrView;
+ std::unique_ptr<PageSelector> mpPageSelector;
+ std::unique_ptr<FocusManager> mpFocusManager;
+ std::shared_ptr<SlotManager> mpSlotManager;
+ std::unique_ptr<ScrollBarManager> mpScrollBarManager;
+ mutable std::shared_ptr<CurrentSlideManager> mpCurrentSlideManager;
+ std::shared_ptr<SelectionManager> mpSelectionManager;
+ std::unique_ptr<controller::Clipboard> mpClipboard;
+ std::shared_ptr<InsertionIndicatorHandler> mpInsertionIndicatorHandler;
+ std::shared_ptr<Animator> mpAnimator;
+ std::unique_ptr<VisibleAreaManager> mpVisibleAreaManager;
+
+ // The listener listens to UNO events and thus is a UNO object.
+ ::rtl::Reference<controller::Listener> mpListener;
+
+ int mnModelChangeLockCount;
+ bool mbIsForcedRearrangePending;
+ bool mbContextMenuOpen;
+
+ bool mbPostModelChangePending;
+
+ /** This array stores the indices of the selected page descriptors at
+ the time when the edit mode is switched to EditMode::MasterPage. With this
+ we can restore the selection when switching back to EditMode::Page mode.
+ */
+ ::std::vector<SdPage*> maSelectionBeforeSwitch;
+ /// The current page before the edit mode is switched to EditMode::MasterPage.
+ int mnCurrentPageBeforeSwitch;
+
+ /** The master page to select after the edit mode is changed. This
+ member is used to pass the pointer from PrepareEditModeChange() to
+ FinishEditModeChange().
+ */
+ SdPage* mpEditModeChangeMasterPage;
+
+ /** This rectangle in the parent window encloses scroll bars and slide
+ sorter window. It is set when Resize() is called.
+ */
+ ::tools::Rectangle maTotalWindowArea;
+
+ /** This counter is used to avoid processing of reentrant calls to
+ Paint().
+ */
+ sal_Int32 mnPaintEntranceCount;
+
+ /** Prepare for several model changes, i.e. prevent time-consuming and
+ non-critical operations like repaints until UnlockModelChange() is
+ called. Critical operations like releasing references to pages that
+ do not exist anymore are executed.
+ */
+ void LockModelChange();
+
+ /** Further calls to HandleModelChange() will result in a full featured
+ update of model, view, and controller. When HandleModelChange() has
+ been called since the last LockModelChange() then this is done right
+ away to bring the view up-to-date.
+ */
+ void UnlockModelChange();
+
+ /** Prepare for a model change. This method does all the things that
+ need to be done _before_ the model changes, e.g. because they need
+ access to the model data before the change.
+ */
+ void PreModelChange();
+
+ /** Complete a model change. This includes the recreation of data
+ structures that depend on the model and the request for a repaint to
+ show the changes.
+ */
+ void PostModelChange();
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsAnimationFunction.hxx b/sd/source/ui/slidesorter/inc/controller/SlsAnimationFunction.hxx
new file mode 100644
index 000000000..b4847de1a
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsAnimationFunction.hxx
@@ -0,0 +1,77 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <basegfx/point/b2dpoint.hxx>
+
+#include <functional>
+#include <vector>
+
+
+namespace sd::slidesorter::controller {
+
+class AnimationBezierFunction
+{
+public:
+ /** Create a cubic bezier curve whose start and end points are given
+ implicitly as P0=(0,0) and P3=(1,1). The second control point is
+ implicitly given as P2=(1-nY1,1-nX1).
+ */
+ AnimationBezierFunction (
+ const double nX1,
+ const double nY1);
+
+ ::basegfx::B2DPoint operator() (const double nT);
+
+private:
+ const double mnX1;
+ const double mnY1;
+ const double mnX2;
+ const double mnY2;
+
+ static double EvaluateComponent (
+ const double nT,
+ const double nV1,
+ const double nV2);
+};
+
+/** Turn a parametric function into one whose y-Values depend on its
+ x-Values. Note a lot of interpolation takes place. The resulting
+ accuracy should be good enough for the purpose of acceleration
+ function for animations.
+*/
+class AnimationParametricFunction
+{
+public:
+ typedef ::std::function<basegfx::B2DPoint (double)> ParametricFunction;
+ AnimationParametricFunction (const ParametricFunction& rFunction);
+
+ double operator() (const double nX);
+
+private:
+ /** y-Values of the parametric function given to the constructor
+ evaluated (and interpolated) for evenly spaced x-Values.
+ */
+ ::std::vector<double> maY;
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsAnimator.hxx b/sd/source/ui/slidesorter/inc/controller/SlsAnimator.hxx
new file mode 100644
index 000000000..8c9ec9e81
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsAnimator.hxx
@@ -0,0 +1,122 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <view/SlideSorterView.hxx>
+#include <canvas/elapsedtime.hxx>
+#include <vcl/idle.hxx>
+#include <sal/types.h>
+#include <o3tl/deleter.hxx>
+
+#include <functional>
+#include <memory>
+#include <vector>
+
+namespace sd::slidesorter { class SlideSorter; }
+
+namespace sd::slidesorter::controller {
+
+/** Experimental class for simple eye candy animations.
+*/
+class Animator
+{
+public:
+ /** In some circumstances we have to avoid animation and jump to the
+ final animation state immediately. Use this enum instead of a bool
+ to be more expressive.
+ */
+ enum AnimationMode { AM_Animated, AM_Immediate };
+
+ explicit Animator (SlideSorter& rSlideSorter);
+ ~Animator();
+ Animator(const Animator&) = delete;
+ Animator& operator=(const Animator&) = delete;
+
+ /** When disposed the animator will stop its work immediately and not
+ process any timer events anymore.
+ */
+ void Dispose();
+
+ /** An animation object is called with values between 0 and 1 as single
+ argument to its operator() method.
+ */
+ typedef ::std::function<void (double)> AnimationFunctor;
+ typedef ::std::function<void ()> FinishFunctor;
+
+ typedef sal_Int32 AnimationId;
+ static const AnimationId NotAnAnimationId = -1;
+
+ /** Schedule a new animation for execution. The () operator of that
+ animation will be called with increasing values between 0 and 1 for
+ the specified duration.
+ @param rAnimation
+ The animation operation.
+ */
+ AnimationId AddAnimation (
+ const AnimationFunctor& rAnimation,
+ const FinishFunctor& rFinishFunctor);
+
+ /** Abort and remove an animation. In order to reduce the bookkeeping
+ on the caller side, it is OK to call this method with an animation
+ function that is not currently being animated. Such a call is
+ silently ignored.
+ */
+ void RemoveAnimation (const AnimationId nAnimationId);
+
+ /** A typical use case for this method is the temporary shutdown of the
+ slidesorter when the slide sorter bar is put into a cache due to a
+ change of the edit mode.
+ */
+ void RemoveAllAnimations();
+
+private:
+ SlideSorter& mrSlideSorter;
+ Idle maIdle;
+ bool mbIsDisposed;
+ class Animation;
+ typedef ::std::vector<std::shared_ptr<Animation> > AnimationList;
+ AnimationList maAnimations;
+ ::canvas::tools::ElapsedTime maElapsedTime;
+
+ std::unique_ptr<view::SlideSorterView::DrawLock, o3tl::default_delete<view::SlideSorterView::DrawLock>> mpDrawLock;
+
+ AnimationId mnNextAnimationId;
+
+ DECL_LINK(TimeoutHandler, Timer *, void);
+
+ /** Execute one step of every active animation.
+ @param nTime
+ Time measured in milliseconds with some arbitrary reference point.
+ @return
+ When one or more animation has finished then <TRUE/> is
+ returned. Call CleanUpAnimationList() in this case.
+ */
+ bool ProcessAnimations (const double nTime);
+
+ /** Remove animations that have expired.
+ */
+ void CleanUpAnimationList();
+
+ void RequestNextFrame();
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsClipboard.hxx b/sd/source/ui/slidesorter/inc/controller/SlsClipboard.hxx
new file mode 100644
index 000000000..6ced17486
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsClipboard.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <ViewClipboard.hxx>
+#include <controller/SlsSelectionObserver.hxx>
+#include <sdxfer.hxx>
+
+#include <sal/types.h>
+#include <o3tl/deleter.hxx>
+#include <svx/svdtypes.hxx>
+
+#include <sddllapi.h>
+
+class SfxRequest;
+struct AcceptDropEvent;
+class DropTargetHelper;
+struct ExecuteDropEvent;
+struct ImplSVEvent;
+class Point;
+class SdPage;
+namespace vcl { class Window; }
+
+namespace sd {
+class Window;
+}
+
+namespace sd::slidesorter { class SlideSorter; }
+
+namespace sd::slidesorter::controller {
+
+class SlideSorterController;
+
+class SAL_DLLPUBLIC_RTTI Clipboard final
+ : public ViewClipboard
+{
+public:
+ Clipboard (SlideSorter& rSlideSorter);
+ virtual ~Clipboard() override;
+
+ /** Create a slide sorter transferable from the given sd
+ transferable. The returned transferable is set up with all
+ information necessary so that it can be dropped on a slide sorter.
+ */
+ static std::shared_ptr<SdTransferable::UserData> CreateTransferableUserData (SdTransferable* pTransferable);
+
+ void HandleSlotCall (SfxRequest& rRequest);
+
+ void DoCut ();
+ // Exported for unit test
+ SD_DLLPUBLIC void DoCopy();
+ // Exported for unit test
+ SD_DLLPUBLIC void DoPaste();
+ void DoDelete ();
+
+ void StartDrag (
+ const Point& rDragPt,
+ vcl::Window* pWindow );
+
+ void DragFinished (
+ sal_Int8 nDropAction);
+
+ sal_Int8 AcceptDrop (
+ const AcceptDropEvent& rEvt,
+ DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer );
+
+ sal_Int8 ExecuteDrop (
+ const ExecuteDropEvent& rEvt,
+ DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer );
+
+ void Abort();
+
+private:
+ virtual sal_uInt16 DetermineInsertPosition () override;
+
+ SlideSorter& mrSlideSorter;
+ SlideSorterController& mrController;
+
+ typedef ::std::vector<SdPage*> PageList;
+ /** Remember the pages that are dragged to another document or to
+ another place in the same document so that they can be removed after
+ a move operation.
+ */
+ PageList maPagesToRemove;
+
+ /** Used when a drop is executed to combine all undo actions into one.
+ Typically created in ExecuteDrop() and released in DragFinish().
+ */
+ class UndoContext;
+ std::unique_ptr<UndoContext> mxUndoContext;
+
+ std::unique_ptr<SelectionObserver::Context, o3tl::default_delete<SelectionObserver::Context>> mxSelectionObserverContext;
+ ImplSVEvent * mnDragFinishedUserEventId;
+
+ void CreateSlideTransferable (
+ vcl::Window* pWindow,
+ bool bDrag);
+
+ /** Determine the position of where to insert the pages in the current
+ transferable of the sd module.
+ @return
+ The index in the range [0,n] (both inclusive) with n the number
+ of pages is returned.
+ */
+ sal_Int32 GetInsertionPosition ();
+
+ /** Paste the pages of the transferable of the sd module at the given
+ position.
+ @param nInsertPosition
+ The position at which to insert the pages. The valid range is
+ [0,n] (both inclusive) with n the number of pages in the
+ document.
+ @return
+ The number of inserted pages is returned.
+ */
+ sal_Int32 PasteTransferable (sal_Int32 nInsertPosition);
+
+ /** Select a range of pages of the model. Typically usage is the
+ selection of newly inserted pages.
+ @param nFirstIndex
+ The index of the first page to select.
+ @param nPageCount
+ The number of pages to select.
+ */
+ void SelectPageRange (sal_Int32 nFirstIndex, sal_Int32 nPageCount);
+
+ /** Return <TRUE/> when the current transferable in the current state of
+ the slidesorter is acceptable to be pasted. For this the
+ transferable has to
+ a) exist,
+ b) contain one or more regular draw pages, no master pages.
+ When master pages are involved, either in the transferable or in the
+ slide sorter (by it displaying master pages) the drop of the
+ transferable is not accepted. The reason is the missing
+ implementation of proper handling master pages copy-and-paste.
+ */
+ enum DropType { DT_PAGE, DT_PAGE_FROM_NAVIGATOR, DT_SHAPE, DT_NONE };
+ DropType IsDropAccepted() const;
+
+ /** This method contains the code for AcceptDrop() and ExecuteDrop() shapes.
+ There are only minor differences for the two cases at this level.
+ @param eCommand
+ This parameter specifies whether to do an AcceptDrop() or
+ ExecuteDrop().
+ @param rPosition
+ Since the event is given as void pointer we can not take the
+ mouse position from it. The caller has to supply it in this
+ parameter.
+ @param pDropEvent
+ Event though the AcceptDropEvent and ExecuteDropEvent are very
+ similar they do not have a common base class. Because of that
+ we have to use a void* to pass these structs.
+ @param nPage
+ When the page number is given as 0xffff then it is replaced by
+ the number of the page at the mouse position. If the mouse is
+ not over a page then neither AcceptDrop() nor ExecuteDrop() are
+ executed.
+ */
+ enum DropCommand { DC_ACCEPT, DC_EXECUTE };
+ sal_Int8 ExecuteOrAcceptShapeDrop (
+ DropCommand eCommand,
+ const Point& rPosition,
+ const void* pDropEvent ,
+ DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer);
+
+ /** Return whether the insertion defined by the transferable is
+ trivial, ie would not change either source nor target document.
+ */
+ bool IsInsertionTrivial (
+ SdTransferable const * pTransferable,
+ const sal_Int8 nDndAction) const;
+
+ /** Asynchronous part of DragFinished. The argument is the sal_Int8
+ nDropAction, disguised as void*.
+ */
+ DECL_DLLPRIVATE_LINK(ProcessDragFinished, void*, void);
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsCurrentSlideManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsCurrentSlideManager.hxx
new file mode 100644
index 000000000..0c5b3b243
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsCurrentSlideManager.hxx
@@ -0,0 +1,112 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <model/SlsSharedPageDescriptor.hxx>
+#include <vcl/timer.hxx>
+#include <tools/link.hxx>
+
+class SdPage;
+
+namespace sd::slidesorter
+{
+class SlideSorter;
+}
+
+namespace sd::slidesorter::controller
+{
+/** Manage the current slide. This includes setting the according flags at
+ the PageDescriptor objects and setting the current slide at the main
+ view shell.
+
+ Switching pages is triggered only after a little delay. This allows
+ fast travelling through a larger set of slides without having to wait
+ for the edit view to update its content after every slide change.
+*/
+class CurrentSlideManager
+{
+public:
+ /** Create a new CurrentSlideManager object that manages the current
+ slide for the given SlideSorter.
+ */
+ CurrentSlideManager(SlideSorter& rSlideSorter);
+
+ ~CurrentSlideManager();
+
+ /** Call this when the current page of the main view shell has been
+ switched. Use SwitchCurrentSlide() to initiate such a switch.
+ */
+ void NotifyCurrentSlideChange(const sal_Int32 nSlideIndex);
+ void NotifyCurrentSlideChange(const SdPage* pPage);
+
+ /** Call this method to switch the current page of the main view shell
+ to the given slide. Use CurrentSlideHasChanged() when the current
+ slide change has been initiated by someone else.
+ @param nSlideIndex
+ Zero based index in the range [0,number-of-slides).
+ The page selection is cleared and only the new
+ current slide is selected.
+ */
+ void SwitchCurrentSlide(const sal_Int32 nSlideIndex);
+ void SwitchCurrentSlide(const model::SharedPageDescriptor& rpSlide,
+ const bool bUpdateSelection = false);
+
+ /** Return the page descriptor for the current slide. Note, that when
+ there is no current slide then the returned pointer is empty.
+ */
+ const model::SharedPageDescriptor& GetCurrentSlide() const { return mpCurrentSlide; }
+
+ /** Release all references to model data.
+ */
+ void PrepareModelChange();
+
+ /** Modify inner state in reaction to a change of the SlideSorterModel.
+ */
+ void HandleModelChange();
+
+private:
+ SlideSorter& mrSlideSorter;
+ sal_Int32 mnCurrentSlideIndex;
+ model::SharedPageDescriptor mpCurrentSlide;
+ /** Timer to control the delay after which to ask
+ XController/ViewShellBase to switch to another slide.
+ */
+ Timer maSwitchPageDelayTimer;
+
+ void SetCurrentSlideAtViewShellBase(const model::SharedPageDescriptor& rpSlide);
+ void SetCurrentSlideAtTabControl(const model::SharedPageDescriptor& rpSlide);
+ void SetCurrentSlideAtXController(const model::SharedPageDescriptor& rpSlide);
+
+ /** When switching from one slide to a new current slide then this
+ method releases all ties to the old slide.
+ */
+ void ReleaseCurrentSlide();
+
+ /** When switching from one slide to a new current slide then this
+ method connects to the new current slide.
+ */
+ void AcquireCurrentSlide(const sal_Int32 nSlideIndex);
+
+ DECL_LINK(SwitchPageCallback, Timer*, void);
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsFocusManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsFocusManager.hxx
new file mode 100644
index 000000000..180b7143f
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsFocusManager.hxx
@@ -0,0 +1,211 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <model/SlsSharedPageDescriptor.hxx>
+
+#include <sal/types.h>
+#include <tools/link.hxx>
+#include <vector>
+
+namespace sd::slidesorter
+{
+class SlideSorter;
+}
+
+namespace sd::slidesorter::controller
+{
+/** This class manages the focus of the slide sorter. There is the focus
+ page which is or is not focused. Initialized to point to the first page
+ it can be set to other pages by using the MoveFocus() method. The
+ focused state of the focus page can be toggled with the ToggleFocus()
+ method.
+*/
+class FocusManager
+{
+public:
+ /** Create a new focus manager that operates on the pages of the model
+ associated with the given controller. The focus page is set to the
+ first page. Focused state is off.
+ */
+ FocusManager(SlideSorter& rSlideSorter);
+
+ ~FocusManager();
+
+ enum class FocusMoveDirection
+ {
+ Left,
+ Right,
+ Up,
+ Down
+ };
+
+ /** Move the focus from the currently focused page to one that is
+ displayed adjacent to it, either vertically or horizontally.
+ @param eDirection
+ Direction in which to move the focus. Wrap around is done
+ differently when moving vertically or horizontally. Vertical
+ wrap around takes place in the same column, i.e. when you are
+ in the top row and move up you come out in the bottom row in the
+ same column. Horizontal wrap around moves to the next
+ (FocusMoveDirection::Right) or previous (FocusMoveDirection::Left) page. Moving to the right
+ from the last page goes to the first page and vice versa.
+ The current page index is set to the nearest valid
+ page index.
+ */
+ void MoveFocus(FocusMoveDirection eDirection);
+
+ /** Show the focus indicator of the current slide.
+ @param bScrollToFocus
+ When <TRUE/> (the default) then the view is scrolled so that the
+ focus rectangle lies inside its visible area.
+ */
+ void ShowFocus(const bool bScrollToFocus = true);
+
+ /** Hide the focus indicator.
+ */
+ void HideFocus();
+
+ /** Toggle the focused state of the current slide.
+ @return
+ Returns the focused state of the focus page after the call.
+ */
+ bool ToggleFocus();
+
+ /** Return whether the window managed by the called focus manager has
+ the input focus of the application.
+ */
+ bool HasFocus() const;
+
+ /** Return the descriptor of the page that currently has the focus.
+ @return
+ When there is no page that currently has the focus then NULL is
+ returned.
+ */
+ model::SharedPageDescriptor GetFocusedPageDescriptor() const;
+
+ /** Return the index of the page that currently has the focus as it is
+ accepted by the slide sorter model.
+ @return
+ When there is no page that currently has the focus then -1 is
+ returned.
+ */
+ sal_Int32 GetFocusedPageIndex() const { return mnPageIndex; }
+
+ /** Set the focused page to the one described by the given page
+ descriptor. The visibility of the focus indicator is not modified.
+ @param rDescriptor
+ One of the page descriptors that are currently managed by the
+ SlideSorterModel.
+ */
+ bool SetFocusedPage(const model::SharedPageDescriptor& rDescriptor);
+
+ /** Set the focused page to the one described by the given page
+ index. The visibility of the focus indicator is not modified.
+ @param nPageIndex
+ A valid page index that is understood by the SlideSorterModel.
+ */
+ void SetFocusedPage(sal_Int32 nPageIndex);
+
+ bool SetFocusedPageToCurrentPage();
+
+ /** Return <TRUE/> when the focus indicator is currently shown. A
+ prerequisite is that the window managed by this focus manager has
+ the input focus as indicated by a <TRUE/> return value of
+ HasFocus(). It is not necessary that the focus indicator is
+ visible. It may have been scrolled outside the visible area.
+ */
+ bool IsFocusShowing() const;
+
+ /** Add a listener that is called when the focus is shown or hidden or
+ set to another page object.
+ @param rListener
+ When this method is called multiple times for the same listener
+ the second and all following calls are ignored. Each listener
+ is added only once.
+ */
+ void AddFocusChangeListener(const Link<LinkParamNone*, void>& rListener);
+
+ /** Remove a focus change listener.
+ @param rListener
+ It is safe to pass a listener that was not added are has been
+ removed previously. Such calls are ignored.
+ */
+ void RemoveFocusChangeListener(const Link<LinkParamNone*, void>& rListener);
+
+ /** Create an instance of this class to temporarily hide the focus
+ indicator. It is restored to its former visibility state when the
+ FocusHider is destroyed.
+ */
+ class FocusHider
+ {
+ public:
+ FocusHider(FocusManager&);
+ ~FocusHider() COVERITY_NOEXCEPT_FALSE;
+
+ private:
+ bool mbFocusVisible;
+ FocusManager& mrManager;
+ };
+
+private:
+ SlideSorter& mrSlideSorter;
+
+ /** Index of the page that may be focused. It is -1 when the model
+ contains no page.
+ */
+ sal_Int32 mnPageIndex;
+
+ /** This flag indicates whether the page pointed to by mpFocusDescriptor
+ has the focus.
+ */
+ bool mbPageIsFocused;
+
+ ::std::vector<Link<LinkParamNone*, void>> maFocusChangeListeners;
+
+ /** Reset the focus state of the given descriptor and request a repaint
+ so that the focus indicator is hidden.
+ @param pDescriptor
+ When NULL is given then the call is ignored.
+ */
+ void HideFocusIndicator(const model::SharedPageDescriptor& rpDescriptor);
+
+ /** Set the focus state of the given descriptor, scroll it into the
+ visible area and request a repaint so that the focus indicator is
+ made visible.
+ @param pDescriptor
+ When NULL is given then the call is ignored.
+ @param bScrollToFocus
+ When <TRUE/> (the default) then the view is scrolled so that the
+ focus rectangle lies inside its visible area.
+ */
+ void ShowFocusIndicator(const model::SharedPageDescriptor& rpDescriptor,
+ const bool bScrollToFocus);
+
+ /** Call all currently registered listeners that a focus change has
+ happened. The focus may be hidden or shown or moved from one page
+ object to another.
+ */
+ void NotifyFocusChangeListeners() const;
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsInsertionIndicatorHandler.hxx b/sd/source/ui/slidesorter/inc/controller/SlsInsertionIndicatorHandler.hxx
new file mode 100644
index 000000000..43f2d2f6a
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsInsertionIndicatorHandler.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <controller/SlsAnimator.hxx>
+
+#include <view/SlsLayouter.hxx>
+
+namespace sd::slidesorter { class SlideSorter; }
+namespace sd::slidesorter::view {
+class InsertAnimator;
+class InsertionIndicatorOverlay;
+}
+
+class SdTransferable;
+
+namespace sd::slidesorter::controller {
+
+/** Manage the visibility and location of the insertion indicator. Its
+ actual display is controlled by the InsertionIndicatorOverlay.
+*/
+class InsertionIndicatorHandler
+{
+public:
+ InsertionIndicatorHandler (SlideSorter& rSlideSorter);
+ ~InsertionIndicatorHandler() COVERITY_NOEXCEPT_FALSE;
+
+ enum Mode { CopyMode, MoveMode, UnknownMode };
+ static Mode GetModeFromDndAction (const sal_Int8 nDndAction);
+
+ /** Activate the insertion marker at the given coordinates.
+ */
+ void Start (const bool bIsOverSourceView);
+
+ /** Deactivate the insertion marker.
+ */
+ void End (const controller::Animator::AnimationMode eMode);
+
+ /** This context make sure that the insertion indicator is shown
+ (provided that the clipboard is not empty) while the context is
+ alive. Typically used while a context menu is displayed.
+ */
+ class ForceShowContext
+ {
+ public:
+ ForceShowContext (const std::shared_ptr<InsertionIndicatorHandler>& rpHandler);
+ ~ForceShowContext() COVERITY_NOEXCEPT_FALSE;
+ private:
+ const std::shared_ptr<InsertionIndicatorHandler> mpHandler;
+ };
+
+ /** Update the indicator icon from the current transferable (from the
+ clipboard or an active drag and drop operation.)
+ */
+ void UpdateIndicatorIcon (const SdTransferable* pTransferable);
+
+ /** Set the position of the insertion marker to the given coordinates.
+ */
+ void UpdatePosition (
+ const Point& rMouseModelPosition,
+ const Mode eMode);
+ void UpdatePosition (
+ const Point& rMouseModelPosition,
+ const sal_Int8 nDndAction);
+
+ /** Return whether the insertion marker is active.
+ */
+ bool IsActive() const { return mbIsActive;}
+
+ /** Return the insertion index that corresponds with the current
+ graphical location of the insertion indicator.
+ */
+ sal_Int32 GetInsertionPageIndex() const;
+
+ /** Determine whether moving the current selection to the current
+ position of the insertion marker would alter the document. This
+ would be the case when the selection is not consecutive or would be
+ moved to a position outside and not adjacent to the selection.
+ */
+ bool IsInsertionTrivial (
+ const sal_Int32 nInsertionIndex,
+ const Mode eMode) const;
+ /** This method is like the other variant. It operates implicitly
+ on the current insertion index as would be returned by
+ GetInsertionPageIndex().
+ */
+ bool IsInsertionTrivial (const sal_Int8 nDndAction);
+
+private:
+ SlideSorter& mrSlideSorter;
+ std::shared_ptr<view::InsertAnimator> mpInsertAnimator;
+ std::shared_ptr<view::InsertionIndicatorOverlay> mpInsertionIndicatorOverlay;
+ view::InsertPosition maInsertPosition;
+ Mode meMode;
+ bool mbIsInsertionTrivial;
+ bool mbIsActive;
+ bool mbIsReadOnly;
+ bool mbIsOverSourceView;
+ Size maIconSize;
+ bool mbIsForcedShow;
+
+ void SetPosition (
+ const Point& rPoint,
+ const Mode eMode);
+ std::shared_ptr<view::InsertAnimator> const & GetInsertAnimator();
+
+ /** Make the insertion indicator visible (that is the show part) and
+ keep it visible, even when the mouse leaves the window (that is the
+ force part). We need this when a context menu is displayed (mouse
+ over the popup menu triggers a mouse leave event) while the
+ insertion indicator remains visible in the background.
+
+ In effect all calls to End() are ignored until ForceEnd() is called.
+ */
+ void ForceShow();
+ void ForceEnd();
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsPageSelector.hxx b/sd/source/ui/slidesorter/inc/controller/SlsPageSelector.hxx
new file mode 100644
index 000000000..6a4b75004
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsPageSelector.hxx
@@ -0,0 +1,219 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <model/SlsSharedPageDescriptor.hxx>
+
+#include <vector>
+#include <memory>
+
+#include <sddllapi.h>
+
+class SdPage;
+
+namespace sd::slidesorter
+{
+class SlideSorter;
+}
+namespace sd::slidesorter::model
+{
+class SlideSorterModel;
+}
+
+namespace sd::slidesorter::controller
+{
+class SlideSorterController;
+
+/** A sub-controller that handles page selection of the slide browser.
+ Selecting a page does not make it the current page (of the main view)
+ automatically as this would not be desired in a multi selection. This
+ has to be done explicitly by calling the
+ CurrentSlideManager::SetCurrentSlide() method.
+
+ Indices of pages relate always to the number of all pages in the model
+ (as returned by GetPageCount()) not just the selected pages.
+*/
+class PageSelector
+{
+public:
+ explicit PageSelector(SlideSorter& rSlideSorter);
+ PageSelector(const PageSelector&) = delete;
+ PageSelector& operator=(const PageSelector&) = delete;
+
+ // Exported for unit test
+ SD_DLLPUBLIC void SelectAllPages();
+ SD_DLLPUBLIC void DeselectAllPages();
+
+ /** Update the selection state of all page descriptors to be the same as
+ that of the corresponding pages of the SdPage objects and issue
+ redraw requests where necessary.
+ */
+ void GetCoreSelection();
+
+ /** Update the selection state of the SdPage objects to be the same as
+ that of the corresponding page descriptors.
+ */
+ void SetCoreSelection();
+
+ /** Select the specified descriptor. The selection state of the other
+ descriptors is not affected.
+ */
+ void SelectPage(int nPageIndex);
+ /** Select the descriptor that is associated with the given page. The
+ selection state of the other descriptors is not affected.
+ */
+ void SelectPage(const SdPage* pPage);
+ /** Select the specified descriptor. The selection state of the other
+ descriptors is not affected.
+ */
+ void SelectPage(const model::SharedPageDescriptor& rpDescriptor);
+
+ /** Return whether the specified page is selected. This convenience
+ method is a substitute for
+ SlideSorterModel::GetPageDescriptor(i)->HasState(ST_Selected) is
+ included here to make this class more self contained.
+ */
+ SD_DLLPUBLIC bool IsPageSelected(int nPageIndex);
+
+ /** Return whether the specified page is visible. This convenience
+ method is a substitute for
+ SlideSorterModel::GetPageDescriptor(i)->HasState(ST_Visible) is
+ included here to make this class more self contained.
+ */
+ bool IsPageVisible(int nPageIndex);
+
+ /** Deselect the descriptor that is associated with the given page.
+ The current page is updated to the first slide
+ of the remaining selection.
+ */
+ void DeselectPage(int nPageIndex);
+ void DeselectPage(const model::SharedPageDescriptor& rpDescriptor,
+ const bool bUpdateCurrentPage = true);
+
+ /** This convenience method returns the same number of pages that
+ SlideSorterModel.GetPageCount() returns. It is included here so
+ that it is self contained for iterating over all pages to select or
+ deselect them.
+ */
+ int GetPageCount() const;
+ int GetSelectedPageCount() const { return mnSelectedPageCount; }
+
+ /** Return the anchor for a range selection. This usually is the first
+ selected page after all pages have been deselected.
+ @return
+ The returned anchor may be NULL.
+ */
+ const model::SharedPageDescriptor& GetSelectionAnchor() const { return mpSelectionAnchor; }
+
+ typedef ::std::vector<SdPage*> PageSelection;
+
+ /** Return an object that describes the current selection. The caller
+ can use that object to later restore the selection.
+ @return
+ The object returned describes the selection via indices. So
+ even if pages are exchanged a later call to SetPageSelection()
+ is valid.
+ */
+ std::shared_ptr<PageSelection> GetPageSelection() const;
+
+ /** Restore a page selection according to the given selection object.
+ @param rSelection
+ Typically obtained by calling GetPageSelection() this object
+ is used to restore the selection. If pages were exchanged since
+ the last call to GetPageSelection() it is still valid to call
+ this method with the selection. When pages have been inserted
+ or removed the result may be unexpected.
+ @param bUpdateCurrentPage
+ When <TRUE/> (the default value) then after setting the
+ selection update the current page to the first page of the
+ selection.
+ When called from within UpdateCurrentPage() then this flag is
+ used to prevent a recursion loop.
+ */
+ void SetPageSelection(const std::shared_ptr<PageSelection>& rSelection,
+ const bool bUpdateCurrentPage);
+
+ /** Call this method after the model has changed to set the number
+ of selected pages.
+ */
+ void CountSelectedPages();
+
+ /** Use the UpdateLock whenever you do a complex selection, i.e. call
+ more than one method in a row. An active lock prevents intermediate
+ changes of the current slide.
+ */
+ class UpdateLock
+ {
+ public:
+ UpdateLock(SlideSorter const& rSlideSorter);
+ UpdateLock(PageSelector& rPageSelector);
+ ~UpdateLock();
+ void Release();
+
+ private:
+ PageSelector* mpSelector;
+ };
+
+ class BroadcastLock
+ {
+ public:
+ BroadcastLock(SlideSorter const& rSlideSorter);
+ BroadcastLock(PageSelector& rPageSelector);
+ ~BroadcastLock();
+
+ private:
+ PageSelector& mrSelector;
+ };
+
+private:
+ model::SlideSorterModel& mrModel;
+ SlideSorter& mrSlideSorter;
+ SlideSorterController& mrController;
+ int mnSelectedPageCount;
+ int mnBroadcastDisableLevel;
+ bool mbSelectionChangeBroadcastPending;
+ model::SharedPageDescriptor mpMostRecentlySelectedPage;
+ /// Anchor for a range selection.
+ model::SharedPageDescriptor mpSelectionAnchor;
+ sal_Int32 mnUpdateLockCount;
+ bool mbIsUpdateCurrentPagePending;
+
+ /** Enable the broadcasting of selection change events. This calls the
+ SlideSorterController::SelectionHasChanged() method to do the actual
+ work. When EnableBroadcasting has been called as many times as
+ DisableBroadcasting() was called before and the selection has been
+ changed in the meantime, this change will be broadcasted.
+ */
+ void EnableBroadcasting();
+
+ /** Disable the broadcasting of selection change events. Subsequent
+ changes of the selection will set a flag that triggers the sending
+ of events when EnableBroadcasting() is called.
+ */
+ void DisableBroadcasting();
+
+ void UpdateCurrentPage(const bool bUpdateOnlyWhenPending = false);
+
+ void CheckConsistency() const;
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsProperties.hxx b/sd/source/ui/slidesorter/inc/controller/SlsProperties.hxx
new file mode 100644
index 000000000..344ac67f3
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsProperties.hxx
@@ -0,0 +1,125 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <tools/color.hxx>
+
+namespace sd::slidesorter::controller
+{
+/** An extensible set of properties used throughout the slide sorter.
+*/
+class Properties
+{
+public:
+ Properties();
+
+ /** Call this method after receiving a VclEventId::ApplicationDataChanged
+ event.
+ */
+ void HandleDataChangeEvent();
+
+ /** When this method returns <TRUE/> then the current slide is
+ highlighted in the view. The default value is <FALSE/>.
+ */
+ bool IsHighlightCurrentSlide() const { return mbIsHighlightCurrentSlide; }
+ void SetHighlightCurrentSlide(const bool bIsHighlightCurrentSlide);
+
+ /** When this method returns <TRUE/> then the selection is indicated in
+ the view (typically by drawing rectangles around the selected
+ slides.) The default value is <TRUE/>.
+ */
+ bool IsShowSelection() const { return mbIsShowSelection; }
+ void SetShowSelection(const bool bIsShowSelection);
+
+ /** When this method returns <TRUE/> then the focusdselection is indicated in
+ the view (typically by drawing dotted rectangles around the selected
+ slides.) The default value is <TRUE/>.
+ */
+ bool IsShowFocus() const { return mbIsShowFocus; }
+ void SetShowFocus(const bool bIsShowFocus);
+
+ /** When this method returns <TRUE/> then on a selection change the
+ visible area is adapted so that the selected slides are shown
+ centered in the view. This can be used to center the current slide
+ by selecting only the current slide. The default value is <FALSE/>.
+ */
+ bool IsCenterSelection() const { return mbIsCenterSelection; }
+ void SetCenterSelection(const bool bIsCenterSelection);
+
+ /** When this method returns <TRUE/> then the view may try to change the
+ visible area by scrolling it smoothly on the screen. Experimental.
+ Default value is <FALSE/>.
+ */
+ bool IsSmoothSelectionScrolling() const { return mbIsSmoothSelectionScrolling; }
+ void SetSmoothSelectionScrolling(const bool bIsSmoothSelectionScrolling);
+
+ /** When this method returns <TRUE/> then during a full screen
+ presentation the previews in a slide sorter are not updated.
+ Default value is <TRUE/>.
+ */
+ bool IsSuspendPreviewUpdatesDuringFullScreenPresentation() const
+ {
+ return mbIsSuspendPreviewUpdatesDuringFullScreenPresentation;
+ }
+ void SetSuspendPreviewUpdatesDuringFullScreenPresentation(const bool bFlag);
+
+ /** Return the background color.
+ */
+ const Color& GetBackgroundColor() const { return maBackgroundColor; }
+ void SetBackgroundColor(const Color& rColor);
+
+ /** Return the text color.
+ */
+ const Color& GetTextColor() const { return maTextColor; }
+ void SetTextColor(const Color& rColor);
+
+ /** Return the color in which selections are to be painted.
+ */
+ const Color& GetSelectionColor() const { return maSelectionColor; }
+ void SetSelectionColor(const Color& rColor);
+
+ /** Return the color used for highlighting e.g. the current slide.
+ */
+ const Color& GetHighlightColor() const { return maHighlightColor; }
+ void SetHighlightColor(const Color& rColor);
+
+ /** The UI can be set to be read only independently from the model status.
+ Used for instance in the presenter view.
+ */
+ bool IsUIReadOnly() const { return mbIsUIReadOnly; }
+ void SetUIReadOnly(const bool bIsUIReadOnly);
+
+private:
+ bool mbIsHighlightCurrentSlide;
+ bool mbIsShowSelection;
+ bool mbIsShowFocus;
+ bool mbIsCenterSelection;
+ bool mbIsSmoothSelectionScrolling;
+ bool mbIsSuspendPreviewUpdatesDuringFullScreenPresentation;
+ Color maBackgroundColor;
+ Color maTextColor;
+ Color maSelectionColor;
+ Color maHighlightColor;
+ bool mbIsUIReadOnly;
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx
new file mode 100644
index 000000000..853d98f4a
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx
@@ -0,0 +1,248 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <tools/link.hxx>
+#include <tools/gen.hxx>
+#include <vcl/timer.hxx>
+#include <vcl/scrbar.hxx>
+#include <vcl/vclptr.hxx>
+
+#include <functional>
+
+namespace sd { class Window; }
+
+namespace sd::slidesorter { class SlideSorter; }
+
+namespace sd::slidesorter::controller {
+
+/** Manage the horizontal and vertical scroll bars. Listen for events, set
+ their sizes, place them in the window, determine their visibilities.
+
+ <p>Handle auto scrolling, i.e. the scrolling of the window when the
+ mouse comes near the window border while dragging a selection.</p>
+
+ <p>In order to make the slide sorter be used in the task pane with its
+ own vertical scrollbars the vertical scrollbar of the use of the slide
+ sorter is optional. When using it the available area in a window is
+ used and the vertical scrollbar is displayed when that area is not large
+ enough. When the vertical scrollbar is not used then the available area
+ is assumed to be modifiable. In that case the PlaceScrollBars() method
+ may return an area larger than the one given.<p>
+*/
+class ScrollBarManager
+{
+public:
+ /** Create a new scroll bar manager that manages three controls: the
+ horizontal scroll bar, the vertical scroll bar, and the little
+ window that fills the gap at the bottom right corner that is left
+ between the two scroll bars. Call LateInitialization() after
+ constructing a new object.
+ */
+ ScrollBarManager (SlideSorter& rSlideSorter);
+
+ ~ScrollBarManager();
+
+ /** Register listeners at the scroll bars. This method is called after
+ startup of a new slide sorter object or after a reactivation of a
+ slide sorter that for example is taken from a cache.
+ */
+ void Connect();
+
+ /** Remove listeners from the scroll bars. This method is called when
+ the slide sorter is destroyed or when it is suspended, e.g. put
+ into a cache for later reuse.
+ */
+ void Disconnect();
+
+ /** Set up the scroll bar, i.e. thumb size and position. Call this
+ method when the content of the browser window changed, i.e. pages
+ were inserted or deleted, the layout or the zoom factor has
+ changed.
+ @param bScrollToCurrentPosition
+ When <TRUE/> then scroll the window to the new offset that is
+ defined by the scroll bars. Otherwise the new offset is simply
+ set and the whole window is repainted.
+ */
+ void UpdateScrollBars (
+ bool bScrollToCurrentPosition);
+
+ /** Place the scroll bars inside the given area. When the available
+ area is not large enough for the content to display the horizontal
+ and/or vertical scroll bar is enabled.
+ @param rAvailableArea
+ The scroll bars will be placed inside this rectangle. It is
+ expected to be given in pixel relative to its parent.
+ @param bIsHorizontalScrollBarAllowed
+ Only when this flag is <TRUE/> the horizontal scroll may be
+ displayed.
+ @param bIsVerticalScrollBarAllowed
+ Only when this flag is <TRUE/> the horizontal scroll may be
+ displayed.
+ @return
+ Returns the space that remains after the scroll bars are
+ placed.
+ */
+ ::tools::Rectangle PlaceScrollBars (
+ const ::tools::Rectangle& rAvailableArea,
+ const bool bIsHorizontalScrollBarAllowed,
+ const bool bIsVerticalScrollBarAllowed);
+
+ /** Update the vertical and horizontal scroll bars so that the visible
+ area has the given top and left values.
+ */
+ void SetTopLeft (const Point& rNewTopLeft);
+
+ /** Return the width of the vertical scroll bar, which--when
+ shown--should be fixed in contrast to its height.
+ @return
+ Returns 0 when the vertical scroll bar is not shown or does not
+ exist, otherwise its width in pixel is returned.
+ */
+ int GetVerticalScrollBarWidth() const;
+
+ /** Return the height of the horizontal scroll bar, which--when
+ shown--should be fixed in contrast to its width.
+ @return
+ Returns 0 when the vertical scroll bar is not shown or does not
+ exist, otherwise its height in pixel is returned.
+ */
+ int GetHorizontalScrollBarHeight() const;
+
+ /** Call this method to scroll a window while the mouse is in dragging a
+ selection. If the mouse is near the window border or is outside the
+ window then scroll the window accordingly.
+ @param rMouseWindowPosition
+ The mouse position for which the scroll amount is calculated.
+ @param rAutoScrollFunctor
+ Every time when the window is scrolled then this functor is executed.
+ @return
+ When the window is scrolled then this method returns <TRUE/>.
+ When the window is not changed then <FALSE/> is returned.
+ */
+ bool AutoScroll (
+ const Point& rMouseWindowPosition,
+ const ::std::function<void ()>& rAutoScrollFunctor);
+
+ void StopAutoScroll();
+
+ void clearAutoScrollFunctor();
+
+ enum Orientation { Orientation_Horizontal, Orientation_Vertical };
+ /** Scroll the slide sorter by setting the thumbs of the scroll bars and
+ by moving the content of the content window.
+ @param eOrientation
+ Defines whether to scroll horizontally or vertically.
+ @param nDistance
+ distance in slides.
+ */
+ void Scroll(
+ const Orientation eOrientation,
+ const sal_Int32 nDistance);
+
+private:
+ SlideSorter& mrSlideSorter;
+
+ /** The horizontal scroll bar. Note that is used but not owned by
+ objects of this class. It is given to the constructor.
+ */
+ VclPtr<ScrollBar> mpHorizontalScrollBar;
+
+ /** The vertical scroll bar. Note that is used but not owned by
+ objects of this class. It is given to the constructor.
+ */
+ VclPtr<ScrollBar> mpVerticalScrollBar;
+
+ /// Relative horizontal position of the visible area in the view.
+ double mnHorizontalPosition;
+ /// Relative vertical position of the visible area in the view.
+ double mnVerticalPosition;
+ /** The width and height of the border at the inside of the window which
+ when entered while in drag mode leads to a scrolling of the window.
+ */
+ Size maScrollBorder;
+ /** The only task of this little window is to paint the little square at
+ the bottom right corner left by the two scroll bars (when both are
+ visible).
+ */
+ VclPtr<ScrollBarBox> mpScrollBarFiller;
+
+ /** The auto scroll timer is used for keep scrolling the window when the
+ mouse reaches its border while dragging a selection. When the mouse
+ is not moved the timer issues events to keep scrolling.
+ */
+ Timer maAutoScrollTimer;
+ Size maAutoScrollOffset;
+ bool mbIsAutoScrollActive;
+
+ /** The content window is the one whose view port is controlled by the
+ scroll bars.
+ */
+ VclPtr<sd::Window> mpContentWindow;
+
+ ::std::function<void ()> maAutoScrollFunctor;
+
+ void SetWindowOrigin (
+ double nHorizontalPosition,
+ double nVerticalPosition);
+
+ /** Determine the visibility of the scroll bars so that the window
+ content is not clipped in any dimension without showing a scroll
+ bar.
+ @param rAvailableArea
+ The area in which the scroll bars, the scroll bar filler, and
+ the SlideSorterView will be placed.
+ @return
+ The area that is enclosed by the scroll bars is returned. It
+ will be filled with the SlideSorterView.
+ */
+ ::tools::Rectangle DetermineScrollBarVisibilities(
+ const ::tools::Rectangle& rAvailableArea,
+ const bool bIsHorizontalScrollBarAllowed,
+ const bool bIsVerticalScrollBarAllowed);
+
+ /** Typically called by DetermineScrollBarVisibilities() this method
+ tests a specific configuration of the two scroll bars being visible
+ or hidden.
+ @return
+ When the window content can be shown with only being clipped in
+ an orientation where the scroll bar would be shown then <TRUE/>
+ is returned.
+ */
+ bool TestScrollBarVisibilities (
+ bool bHorizontalScrollBarVisible,
+ bool bVerticalScrollBarVisible,
+ const ::tools::Rectangle& rAvailableArea);
+
+ void CalcAutoScrollOffset (const Point& rMouseWindowPosition);
+ bool RepeatAutoScroll();
+
+ DECL_LINK(HorizontalScrollBarHandler, ScrollBar*, void);
+ DECL_LINK(VerticalScrollBarHandler, ScrollBar*, void);
+ DECL_LINK(AutoScrollTimeoutHandler, Timer *, void);
+
+ void PlaceHorizontalScrollBar (const ::tools::Rectangle& aArea);
+ void PlaceVerticalScrollBar (const ::tools::Rectangle& aArea);
+ void PlaceFiller (const ::tools::Rectangle& aArea);
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsSelectionFunction.hxx b/sd/source/ui/slidesorter/inc/controller/SlsSelectionFunction.hxx
new file mode 100644
index 000000000..7d80fbd26
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsSelectionFunction.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <controller/SlsFocusManager.hxx>
+#include <fupoor.hxx>
+#include <memory>
+
+namespace sd::slidesorter
+{
+class SlideSorter;
+}
+
+struct AcceptDropEvent;
+
+namespace sd::slidesorter::controller
+{
+class SlideSorterController;
+
+class SelectionFunction final : public FuPoor
+{
+public:
+ SelectionFunction(const SelectionFunction&) = delete;
+ SelectionFunction& operator=(const SelectionFunction&) = delete;
+
+ static rtl::Reference<FuPoor> Create(SlideSorter& rSlideSorter, SfxRequest& rRequest);
+
+ // Mouse- & Key-Events
+ virtual bool KeyInput(const KeyEvent& rKEvt) override;
+ virtual bool MouseMove(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt) override;
+
+ /// Forward to the clipboard manager.
+ virtual void DoCut() override;
+
+ /// Forward to the clipboard manager.
+ virtual void DoCopy() override;
+
+ /// Forward to the clipboard manager.
+ virtual void DoPaste() override;
+
+ /** is called when the current function should be aborted. <p>
+ This is used when a function gets a KEY_ESCAPE but can also
+ be called directly.
+
+ @returns
+ true if an active function was aborted
+ */
+ virtual bool cancel() override;
+
+ void MouseDragged(const AcceptDropEvent& rEvent, const sal_Int8 nDragAction);
+
+ /** Turn of substitution display and insertion indicator.
+ */
+ void NotifyDragFinished();
+
+ class EventDescriptor;
+ class ModeHandler;
+ friend class ModeHandler;
+ enum Mode
+ {
+ NormalMode,
+ MultiSelectionMode,
+ DragAndDropMode
+ };
+ void SwitchToNormalMode();
+ void SwitchToDragAndDropMode(const Point& rMousePosition);
+ void SwitchToMultiSelectionMode(const Point& rMousePosition, const sal_uInt32 nEventCode);
+
+ void ResetShiftKeySelectionAnchor();
+ /** Special case handling for when the context menu is hidden. This
+ method will reinitialize the current mouse position to prevent the
+ mouse motion during the time the context menu is displayed from
+ being interpreted as drag-and-drop start.
+ */
+ void ResetMouseAnchor();
+
+private:
+ SlideSorter& mrSlideSorter;
+ SlideSorterController& mrController;
+
+ SelectionFunction(SlideSorter& rSlideSorter, SfxRequest& rRequest);
+
+ virtual ~SelectionFunction() override;
+
+ /** Remember the slide where the shift key was pressed and started a
+ multiselection via keyboard.
+ */
+ sal_Int32 mnShiftKeySelectionAnchor;
+
+ /** The selection function can be in one of several mutually
+ exclusive modes.
+ */
+ std::shared_ptr<ModeHandler> mpModeHandler;
+
+ /** Make the slide nOffset slides away of the current one the new
+ current slide. When the new index is outside the range of valid
+ page numbers it is clipped to that range.
+ @param nOffset
+ When nOffset is negative then go back. When nOffset if positive go
+ forward. When it is zero then ignore the call.
+ */
+ void GotoNextPage(int nOffset);
+
+ /** Make the slide with the given index the new current slide.
+ @param nIndex
+ Index of the new current slide. When the new index is outside
+ the range of valid page numbers it is clipped to that range.
+ */
+ void GotoPage(int nIndex);
+
+ void ProcessMouseEvent(sal_uInt32 nEventType, const MouseEvent& rEvent);
+
+ // What follows are a couple of helper methods that are used by
+ // ProcessMouseEvent().
+
+ void ProcessEvent(EventDescriptor& rEvent);
+
+ void MoveFocus(const FocusManager::FocusMoveDirection eDirection, const bool bIsShiftDown,
+ const bool bIsControlDown);
+
+ void SwitchMode(const std::shared_ptr<ModeHandler>& rpHandler);
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsSelectionManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsSelectionManager.hxx
new file mode 100644
index 000000000..4f52d49e6
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsSelectionManager.hxx
@@ -0,0 +1,139 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+#include <tools/link.hxx>
+#include <vector>
+#include <memory>
+
+class SdPage;
+
+namespace sd::slidesorter
+{
+class SlideSorter;
+}
+
+namespace sd::slidesorter::controller
+{
+class SlideSorterController;
+class SelectionObserver;
+
+/** This class is a part of the controller and handles the selection of
+ slides.
+ <p>It has methods to modify the selected slides (delete them or
+ move them to other places in the document), change the visible area so
+ to make the selected slides visible, tell listeners when the selection
+ changes.</p>
+*/
+class SelectionManager
+{
+public:
+ /** Create a new SelectionManager for the given slide sorter.
+ */
+ SelectionManager(SlideSorter& rSlideSorter);
+
+ ~SelectionManager();
+
+ /** Delete the currently selected slides. When this method returns the
+ selection is empty.
+ @param bSelectFollowingPage
+ When <TRUE/> then after deleting the selected pages make the
+ slide after the last selected page the new current page.
+ When <FALSE/> then make the first slide before the selected
+ pages the new current slide.
+ */
+ void DeleteSelectedPages(const bool bSelectFollowingPage = true);
+
+ /** Call this method after the selection has changed (possible several
+ calls to the PageSelector) to invalidate the relevant slots and send
+ appropriate events.
+ */
+ void SelectionHasChanged();
+
+ /** Add a listener that is called when the selection of the slide sorter
+ changes.
+ @param rListener
+ When this method is called multiple times for the same listener
+ the second and all following calls are ignored. Each listener
+ is added only once.
+ */
+ void AddSelectionChangeListener(const Link<LinkParamNone*, void>& rListener);
+
+ /** Remove a listener that was called when the selection of the slide
+ sorter changes.
+ @param rListener
+ It is safe to pass a listener that was not added are has been
+ removed previously. Such calls are ignored.
+ */
+ void RemoveSelectionChangeListener(const Link<LinkParamNone*, void>& rListener);
+
+ /** Return the position where to insert pasted slides based on the
+ current selection. When there is a selection then the insert
+ position is behind the last slide. When the selection is empty then
+ most of the time the insert position is at the end of the document.
+ There is an exception right after the display of a popup-menu. The
+ position of the associated insertion marker is stored here and reset
+ the next time the selection changes.
+ */
+ sal_Int32 GetInsertionPosition() const;
+
+ /** Store an insertion position temporarily. It is reset when the
+ selection changes the next time.
+ */
+ void SetInsertionPosition(const sal_Int32 nInsertionPosition);
+
+ const std::shared_ptr<SelectionObserver>& GetSelectionObserver() const
+ {
+ return mpSelectionObserver;
+ }
+
+private:
+ SlideSorter& mrSlideSorter;
+ SlideSorterController& mrController;
+
+ ::std::vector<Link<LinkParamNone*, void>> maSelectionChangeListeners;
+
+ /** The insertion position is only temporarily valid. Negative values
+ indicate that the explicit insertion position is not valid. In this
+ case GetInsertionPosition() calculates it from the current selection.
+ */
+ sal_Int32 mnInsertionPosition;
+
+ std::shared_ptr<SelectionObserver> mpSelectionObserver;
+
+ /** Delete the given list of normal pages. This method is a helper
+ function for DeleteSelectedPages().
+ @param rSelectedNormalPages
+ A list of normal pages. Supplying master pages is an error.
+ */
+ void DeleteSelectedNormalPages(const ::std::vector<SdPage*>& rSelectedNormalPages);
+
+ /** Delete the given list of master pages. This method is a helper
+ function for DeleteSelectedPages().
+ @param rSelectedMasterPages
+ A list of master pages. Supplying normal pages is an error.
+ */
+ void DeleteSelectedMasterPages(const ::std::vector<SdPage*>& rSelectedMasterPages);
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsSelectionObserver.hxx b/sd/source/ui/slidesorter/inc/controller/SlsSelectionObserver.hxx
new file mode 100644
index 000000000..11742b890
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsSelectionObserver.hxx
@@ -0,0 +1,77 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+#include <memory>
+#include <vector>
+
+namespace sd::slidesorter
+{
+class SlideSorter;
+}
+
+class SdrPage;
+class SdPage;
+
+namespace sd::slidesorter::controller
+{
+/** Observe insertions and deletions of pages between calls to
+ StartObservation() and EndObservation(). When the later is called
+ the selection is set to just the newly inserted pages.
+*/
+class SelectionObserver final
+{
+public:
+ SelectionObserver(SlideSorter& rSlideSorter);
+ ~SelectionObserver();
+
+ void NotifyPageEvent(const SdrPage* pPage);
+ void StartObservation();
+ void AbortObservation();
+ void EndObservation();
+
+ /** Use this little class instead of calling StartObservation and
+ EndObservation directly so that EndObservation is not forgotten or
+ omitted due to an exception or some break or return in the middle of
+ code.
+ */
+ class Context
+ {
+ public:
+ Context(SlideSorter const& rSlideSorter);
+ ~Context() COVERITY_NOEXCEPT_FALSE;
+ void Abort();
+
+ private:
+ std::shared_ptr<SelectionObserver> mpSelectionObserver;
+ };
+
+private:
+ SlideSorter& mrSlideSorter;
+ bool mbIsObservationActive;
+ bool mbPageEventOccurred;
+
+ ::std::vector<const SdPage*> maInsertedPages;
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsSlotManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsSlotManager.hxx
new file mode 100644
index 000000000..57de8422a
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsSlotManager.hxx
@@ -0,0 +1,98 @@
+/* -*- 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 .
+ */
+#pragma once
+
+#include <model/SlsSharedPageDescriptor.hxx>
+#include <tools/link.hxx>
+#include <rtl/ustring.hxx>
+
+class AbstractSvxNameDialog;
+class SfxItemSet;
+class SfxRequest;
+
+namespace sd::slidesorter
+{
+class SlideSorter;
+}
+
+namespace sd::slidesorter::controller
+{
+/** This manager takes over the work of handling slot calls from the
+ controller of the slide sorter.
+*/
+class SlotManager
+{
+public:
+ /** Create a new slot manager that handles slot calls for the controller
+ of a slide sorter.
+ @param rController
+ The controller for which to handle the slot calls.
+ */
+ SlotManager(SlideSorter& rSlideSorter);
+
+ void FuTemporary(SfxRequest& rRequest);
+ void FuPermanent(SfxRequest& rRequest);
+ void FuSupport(SfxRequest& rRequest);
+ void GetMenuState(SfxItemSet& rSet);
+ void GetClipboardState(SfxItemSet& rSet);
+ void GetStatusBarState(SfxItemSet& rSet);
+ void ExecCtrl(SfxRequest& rRequest);
+ void GetAttrState(SfxItemSet& rSet);
+
+ /** Exclude or include one slide or all selected slides.
+ @param rpDescriptor
+ When the pointer is empty then apply the new state to all
+ selected pages. Otherwise apply the new state to just the
+ specified state.
+ */
+ void ChangeSlideExclusionState(const model::SharedPageDescriptor& rpDescriptor,
+ const bool bExcludeSlide);
+
+ /** Call this after a change from normal mode to master mode or back.
+ The affected slots are invalidated.
+ */
+ void NotifyEditModeChange();
+
+private:
+ /// The controller for which we manage the slot calls.
+ SlideSorter& mrSlideSorter;
+
+ /** The implementation is a copy of the code for SID_RENAMEPAGE in
+ drviews2.cxx.
+ */
+ void RenameSlide(const SfxRequest& rRequest);
+ DECL_LINK(RenameSlideHdl, AbstractSvxNameDialog&, bool);
+ DECL_STATIC_LINK(SlotManager, RenameSlideTooltipHdl, AbstractSvxNameDialog&, OUString);
+ bool RenameSlideFromDrawViewShell(sal_uInt16 nPageId, const OUString& rName);
+
+ /** Handle SID_INSERTPAGE slot calls.
+ */
+ void InsertSlide(SfxRequest& rRequest);
+
+ void DuplicateSelectedSlides(SfxRequest& rRequest);
+
+ /** Use one of several ways to determine where to insert a new page.
+ This can be the current selection or the insertion indicator.
+ */
+ sal_Int32 GetInsertionPosition() const;
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsTransferableData.hxx b/sd/source/ui/slidesorter/inc/controller/SlsTransferableData.hxx
new file mode 100644
index 000000000..863c2fe73
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsTransferableData.hxx
@@ -0,0 +1,78 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sdxfer.hxx>
+
+#include <vcl/bitmapex.hxx>
+
+#include <vector>
+
+class SdDrawDocument;
+namespace sd::slidesorter { class SlideSorterViewShell; }
+
+namespace sd::slidesorter::controller {
+
+/** Represent previews and other information so that they can be
+ attached to an existing transferable.
+*/
+class TransferableData final
+ : public SdTransferable::UserData,
+ public SfxListener
+{
+public:
+ class Representative
+ {
+ public:
+ Representative (const BitmapEx& rBitmap, const bool bIsExcluded)
+ : maBitmap(rBitmap), mbIsExcluded(bIsExcluded) {}
+
+ BitmapEx maBitmap;
+ bool mbIsExcluded;
+ };
+
+ static rtl::Reference<SdTransferable> CreateTransferable (
+ SdDrawDocument* pSrcDoc,
+ SlideSorterViewShell* pViewShell,
+ ::std::vector<TransferableData::Representative>&& rRepresentatives);
+
+ static std::shared_ptr<TransferableData> GetFromTransferable (const SdTransferable* pTransferable);
+
+ TransferableData (
+ SlideSorterViewShell* pViewShell,
+ ::std::vector<TransferableData::Representative>&& rRepresentatives);
+ virtual ~TransferableData() override;
+
+ const ::std::vector<Representative>& GetRepresentatives() const { return maRepresentatives;}
+
+ /** Return the view shell for which the transferable was created.
+ */
+ SlideSorterViewShell* GetSourceViewShell() const { return mpViewShell;}
+
+private:
+ SlideSorterViewShell* mpViewShell;
+ const ::std::vector<Representative> maRepresentatives;
+
+ virtual void Notify (SfxBroadcaster& rBroadcaster, const SfxHint& rHint) override;
+};
+
+} // end of namespace ::sd::slidesorter::controller
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/controller/SlsVisibleAreaManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsVisibleAreaManager.hxx
new file mode 100644
index 000000000..d9f5845af
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/controller/SlsVisibleAreaManager.hxx
@@ -0,0 +1,90 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <model/SlsSharedPageDescriptor.hxx>
+#include <optional>
+#include <tools/gen.hxx>
+#include <vector>
+
+namespace sd::slidesorter
+{
+class SlideSorter;
+}
+
+namespace sd::slidesorter::controller
+{
+/** Manage requests for scrolling page objects into view.
+*/
+class VisibleAreaManager
+{
+public:
+ explicit VisibleAreaManager(SlideSorter& rSlideSorter);
+ ~VisibleAreaManager();
+ VisibleAreaManager(const VisibleAreaManager&) = delete;
+ VisibleAreaManager& operator=(const VisibleAreaManager&) = delete;
+
+ void ActivateCurrentSlideTracking();
+ void DeactivateCurrentSlideTracking();
+ bool IsCurrentSlideTrackingActive() const { return mbIsCurrentSlideTrackingActive; }
+
+ /** Request the current slide to be moved into the visible area.
+ This request is only obeyed when the current slide tracking is
+ active.
+ @see ActivateCurrentSlideTracking() and DeactivateCurrentSlideTracking()
+ */
+ void RequestCurrentSlideVisible();
+
+ /** Request to make the specified page object visible.
+ */
+ void RequestVisible(const model::SharedPageDescriptor& rpDescriptor, const bool bForce = false);
+
+ /** Temporarily disable the update of the visible area.
+ */
+ class TemporaryDisabler
+ {
+ public:
+ explicit TemporaryDisabler(SlideSorter const& rSlideSorter);
+ ~TemporaryDisabler();
+
+ private:
+ VisibleAreaManager& mrVisibleAreaManager;
+ };
+
+private:
+ SlideSorter& mrSlideSorter;
+
+ /** List of rectangle that someone wants to be moved into the visible
+ area.
+ Cleared on every call to ForgetVisibleRequests() and MakeVisible().
+ */
+ ::std::vector<::tools::Rectangle> maVisibleRequests;
+
+ Point maRequestedVisibleTopLeft;
+ bool mbIsCurrentSlideTrackingActive;
+ int mnDisableCount;
+
+ void MakeVisible();
+ ::std::optional<Point> GetRequestedTopLeft() const;
+};
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/model/SlideSorterModel.hxx b/sd/source/ui/slidesorter/inc/model/SlideSorterModel.hxx
new file mode 100644
index 000000000..90223a1bc
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/model/SlideSorterModel.hxx
@@ -0,0 +1,227 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <model/SlsSharedPageDescriptor.hxx>
+#include <pres.hxx>
+#include <osl/mutex.hxx>
+#include <vcl/region.hxx>
+#include <com/sun/star/uno/Reference.hxx>
+#include <vector>
+
+class SdDrawDocument;
+class SdrPage;
+class SdPage;
+namespace sd::slidesorter
+{
+class SlideSorter;
+}
+namespace com::sun::star::container
+{
+class XIndexAccess;
+}
+namespace com::sun::star::drawing
+{
+class XDrawPage;
+}
+
+namespace sd::slidesorter::model
+{
+inline sal_Int32 FromCoreIndex(const sal_uInt16 nCoreIndex) { return (nCoreIndex - 1) / 2; }
+
+/** The model of the slide sorter gives access to the slides that are to be
+ displayed in the slide sorter view. Via the SetDocumentSlides() method
+ this set of slides can be modified (but do not call it directly, use
+ SlideSorterController::SetDocumentSlides() instead.)
+*/
+class SlideSorterModel final
+{
+public:
+ SlideSorterModel(SlideSorter& rSlideSorter);
+
+ ~SlideSorterModel();
+ void Dispose();
+
+ /** This method is present to let the view create a ShowView for
+ displaying slides.
+ */
+ SdDrawDocument* GetDocument();
+
+ /** Set a new edit mode and return whether the edit mode really
+ has been changed. When the edit mode is changed then the
+ previous page descriptor list is replaced by a new one which
+ has to be repainted.
+ @return
+ A return value of <TRUE/> indicates that the edit mode has
+ changed and thus the page descriptor list has been set up
+ to reflect that change. A repaint is necessary.
+ */
+ bool SetEditMode(EditMode eEditMode);
+
+ EditMode GetEditMode() const { return meEditMode; }
+
+ /** Return the number of slides in the document regardless of whether
+ they are visible or not or whether they are hidden or not.
+ The number of slides depends on the set of slides available through
+ the XIndexAccess given to SetDocumentSlides().
+ */
+ sal_Int32 GetPageCount() const;
+
+ /** Return a page descriptor for the page with the specified index.
+ Page descriptors are created on demand. The page descriptor is
+ found (or not found) in constant time.
+ @param nPageIndex
+ The index of the requested slide. The valid values
+ are 0 to GetPageCount()-1.
+ @param bCreate
+ When <TRUE/> and the requested page descriptor is missing then
+ it is created. When <FALSE/> then an empty reference is
+ returned for missing descriptors.
+ @return
+ When the given index is not valid, i.e. lower than zero or
+ larger than or equal to the number of pages then an empty
+ reference is returned. Note that the page count may change
+ between calls to GetPageCount() and GetPageDescriptor().
+ */
+ SharedPageDescriptor GetPageDescriptor(const sal_Int32 nPageIndex,
+ const bool bCreate = true) const;
+
+ /** Return a page descriptor for the given XDrawPage. Page descriptors
+ are created on demand. The page descriptor is found (or not found)
+ in (at most) linear time. Note that all page descriptors in front of
+ the one associated with the given XDrawPage are created when not yet
+ present. When the XDrawPage is not found then all descriptors are
+ created.
+ @return
+ Returns the index to the requested page descriptor or -1 when
+ there is no such page descriptor.
+ */
+ sal_Int32 GetIndex(const css::uno::Reference<css::drawing::XDrawPage>& rxSlide) const;
+
+ /** Return a page descriptor for the given SdrPage. Page descriptors
+ are created on demand. The page descriptor is found (or not found)
+ in (at most) linear time. Note that all page descriptors in front of
+ the one associated with the given XDrawPage are created when not yet
+ present. When the SdrPage is not found then all descriptors are
+ created.
+ @return
+ Returns the index to the requested page descriptor or -1 when
+ there is no such page descriptor.
+ */
+ sal_Int32 GetIndex(const SdrPage* pPage) const;
+
+ /** Return an index for accessing an SdrModel that corresponds to the
+ given SlideSorterModel index. In many cases we just have to apply
+ the n*2+1 magic. Only when a special model is set, like a custom
+ slide show, then the returned value is different.
+ */
+ sal_uInt16 GetCoreIndex(const sal_Int32 nIndex) const;
+
+ /** Call this method after the document has changed its structure. This
+ will get the model in sync with the SdDrawDocument. This method
+ tries not to throw away too much information already gathered. This
+ is especially important for previews of complex pages that take some
+ time to create.
+ */
+ void Resync();
+
+ /** Delete all descriptors that currently are in the container. The size
+ of the container, however, is not altered. Use the AdaptSize
+ method for that.
+ */
+ void ClearDescriptorList();
+
+ /** Set the selection of the document to exactly that of the called model.
+ */
+ void SynchronizeDocumentSelection();
+
+ /** Set the selection of the called model to exactly that of the document.
+ */
+ void SynchronizeModelSelection();
+
+ /** Return the mutex so that the caller can lock it and then safely
+ access the model.
+ */
+ ::osl::Mutex& GetMutex() { return maMutex; }
+
+ /** Set the XIndexAccess from which the called SlideSorterModel takes
+ its pages.
+ @param rxSlides
+ The set of slides accessible through this XIndexAccess are not
+ necessarily the same as the ones of the XModel of the
+ XController (although it typically is a subset).
+ */
+ void SetDocumentSlides(const css::uno::Reference<css::container::XIndexAccess>& rxSlides);
+
+ /** Return the set of pages that is currently displayed by the slide sorter.
+ */
+ css::uno::Reference<css::container::XIndexAccess> GetDocumentSlides() const;
+
+ /** This method is called when the edit mode has changed. It calls
+ SetDocumentSlides() with the set of slides or master pages obtained
+ from the model of the XController.
+ */
+ void UpdatePageList();
+
+ bool IsReadOnly() const;
+
+ /** The current selection is saved by copying the ST_Selected state into
+ ST_WasSelected for slides.
+ */
+ void SaveCurrentSelection();
+
+ /** The current selection is restored from the ST_WasSelected state from
+ the slides.
+ @returns
+ The returned region has to be repainted to reflect the updated
+ selection states.
+ */
+ vcl::Region RestoreSelection();
+
+ /** Typically called from controller::Listener this method handles the
+ insertion and deletion of single pages.
+ @return
+ Returns <TRUE/> when the given page is relevant for the current
+ page kind and edit mode.
+ */
+ bool NotifyPageEvent(const SdrPage* pPage);
+
+private:
+ mutable ::osl::Mutex maMutex;
+ SlideSorter& mrSlideSorter;
+ css::uno::Reference<css::container::XIndexAccess> mxSlides;
+ EditMode meEditMode;
+ mutable ::std::vector<SharedPageDescriptor> maPageDescriptors;
+
+ /** Resize the descriptor container according to current values of
+ page kind and edit mode.
+ */
+ void AdaptSize();
+
+ SdPage* GetPage(const sal_Int32 nCoreIndex) const;
+ void InsertSlide(SdPage* pPage, bool bMarkSelected);
+ // return if this page was marked as selected before being removed
+ bool DeleteSlide(const SdPage* pPage);
+ void UpdateIndices(const sal_Int32 nFirstIndex);
+};
+
+} // end of namespace ::sd::slidesorter::model
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/model/SlsEnumeration.hxx b/sd/source/ui/slidesorter/inc/model/SlsEnumeration.hxx
new file mode 100644
index 000000000..289f85911
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/model/SlsEnumeration.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 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 .
+ */
+
+#pragma once
+
+#include <memory>
+
+namespace sd::slidesorter::model
+{
+/** Interface to generic enumerations. Designed to operate on shared
+ pointers. Therefore GetNextElement() returns T and not T&.
+*/
+template <class T> class Enumeration
+{
+public:
+ virtual ~Enumeration() {}
+
+ virtual bool HasMoreElements() const = 0;
+ /** Returns T instead of T& so that it can handle shared pointers.
+ */
+ virtual T GetNextElement() = 0;
+ virtual void Rewind() = 0;
+ virtual ::std::unique_ptr<Enumeration<T>> Clone() = 0;
+};
+
+} // end of namespace ::sd::slidesorter::model
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/model/SlsPageDescriptor.hxx b/sd/source/ui/slidesorter/inc/model/SlsPageDescriptor.hxx
new file mode 100644
index 000000000..4f3be3b42
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/model/SlsPageDescriptor.hxx
@@ -0,0 +1,144 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <model/SlsVisualState.hxx>
+#include <tools/gen.hxx>
+#include <com/sun/star/uno/Reference.hxx>
+
+#include <memory>
+
+namespace com::sun::star::drawing { class XDrawPage; }
+
+class SdPage;
+class SdrPage;
+
+namespace sd::slidesorter::model {
+
+/** Each PageDescriptor object represents the preview of one draw page,
+ slide, or master page of a Draw or Impress document as they are displayed
+ in the slide sorter. This class gives access to some associated
+ information like prerendered preview or position on the screen.
+
+ <p>Bounding boxes of page objects come in four varieties:
+ Model and screen/pixel coordinates and the bounding boxes of the actual
+ page objects and the larger bounding boxes that include page names and
+ fade symbol.</p>
+*/
+class PageDescriptor
+ : public ::std::enable_shared_from_this<PageDescriptor>
+{
+public:
+ /** Create a PageDescriptor for the given SdPage object.
+ @param rxPage
+ The page that is represented by the new PageDescriptor object.
+ @param pPage
+ The page pointer can in some situations not be detected from
+ rxPage, e.g. after undo of page deletion. Therefore supply it
+ separately.
+ @param nIndex
+ This index is displayed in the view as page number. It is not
+ necessarily the page index (not even when you add or subtract 1
+ or use (x-1)/2 magic).
+ */
+ PageDescriptor (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxPage,
+ SdPage* pPage,
+ const sal_Int32 nIndex);
+
+ ~PageDescriptor();
+
+ /** Return the page that is represented by the descriptor as SdPage pointer .
+ */
+ SdPage* GetPage() const { return mpPage;}
+
+ /** Return the page that is represented by the descriptor as XDrawPage reference.
+ */
+ const css::uno::Reference<css::drawing::XDrawPage>& GetXDrawPage() const { return mxPage;}
+
+ /** Returns the index of the page as it is displayed in the view as page
+ number. The value may differ from the index returned by the
+ XDrawPage when there are hidden slides and the XIndexAccess used to
+ access the model filters them out.
+ */
+ sal_Int32 GetPageIndex() const { return mnIndex;}
+ void SetPageIndex (const sal_Int32 nIndex);
+
+ bool UpdateMasterPage();
+ bool UpdateTransitionFlag();
+
+ enum State { ST_Visible, ST_Selected, ST_WasSelected,
+ ST_Focused, ST_MouseOver, ST_Current, ST_Excluded };
+
+ bool HasState (const State eState) const;
+
+ bool SetState (const State eState, const bool bStateValue);
+
+ /** Set the internal mbIsSelected flag to the selection state of the
+ page. Use this method to synchronize a page descriptor with the
+ page it describes and determine whether a redraw to update the
+ selection indicator is necessary.
+ @return
+ When the two selection states were different <TRUE/> is
+ returned. When they were the same this method returns
+ <FALSE/>.
+ */
+ bool GetCoreSelection();
+
+ /** Set the selection flags of the SdPage objects to the corresponding
+ selection states of the page descriptors.
+ */
+ void SetCoreSelection();
+
+ VisualState& GetVisualState() { return maVisualState;}
+
+ ::tools::Rectangle GetBoundingBox() const;
+ Point GetLocation (const bool bIgnoreLocation) const;
+ void SetBoundingBox (const ::tools::Rectangle& rBoundingBox);
+
+private:
+ SdPage* mpPage;
+ css::uno::Reference<css::drawing::XDrawPage> mxPage;
+ SdrPage const* mpMasterPage;
+
+ /** This index is displayed as page number in the view. It may or may
+ not be the actual page index.
+ */
+ sal_Int32 mnIndex;
+
+ ::tools::Rectangle maBoundingBox;
+ VisualState maVisualState;
+
+ bool mbIsSelected : 1;
+ bool mbWasSelected : 1;
+ bool mbIsVisible : 1;
+ bool mbIsFocused : 1;
+ bool mbIsCurrent : 1;
+ bool mbIsMouseOver : 1;
+ bool mbHasTransition : 1;
+
+ PageDescriptor (const PageDescriptor& rDescriptor) = delete;
+
+ PageDescriptor& operator= (const PageDescriptor& rDescriptor) = delete;
+};
+
+} // end of namespace ::sd::slidesorter::model
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/model/SlsPageEnumeration.hxx b/sd/source/ui/slidesorter/inc/model/SlsPageEnumeration.hxx
new file mode 100644
index 000000000..6901a9ff1
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/model/SlsPageEnumeration.hxx
@@ -0,0 +1,95 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <model/SlsEnumeration.hxx>
+#include <model/SlsSharedPageDescriptor.hxx>
+
+#include <functional>
+#include <memory>
+
+namespace sd::slidesorter::model
+{
+class SlideSorterModel;
+
+/** Public class of page enumerations that delegates its calls to an
+ implementation object that can filter pages by using a given predicate.
+
+ @see PageEnumerationProvider
+ The PageEnumerationProvider has methods for creating different types
+ of page enumerations.
+*/
+class PageEnumeration final : public Enumeration<SharedPageDescriptor>
+{
+public:
+ /** Create a new page enumeration that enumerates a subset of the pages
+ of the given model.
+ @param rModel
+ The new page enumeration enumerates the pages of this model.
+ @param rPredicate
+ This predicate determines which pages to include in the
+ enumeration. Pages for which rPredicate returns <FALSE/> are
+ exclude.
+ */
+ typedef ::std::function<bool(const SharedPageDescriptor&)> PagePredicate;
+ static PageEnumeration Create(const SlideSorterModel& rModel, const PagePredicate& rPredicate);
+
+ /** This copy constructor creates a copy of the given enumeration.
+ */
+ PageEnumeration(const PageEnumeration& rEnumeration);
+
+ virtual ~PageEnumeration() override;
+
+ /** Create and return an exact copy of the called object.
+ */
+ virtual ::std::unique_ptr<Enumeration<SharedPageDescriptor>> Clone() override;
+
+ PageEnumeration& operator=(const PageEnumeration& rEnumeration);
+
+ /** Return <TRUE/> when the enumeration has more elements, i.e. it is
+ save to call GetNextElement() at least one more time.
+ */
+ virtual bool HasMoreElements() const override;
+
+ /** Return the next element of the enumeration. Call the
+ HasMoreElements() before to make sure that there exists at least one
+ more element. Calling this method with HasMoreElements() returning
+ <FALSE/> is an error.
+ */
+ virtual SharedPageDescriptor GetNextElement() override;
+
+ /** Rewind the enumeration so that the next call to GetNextElement()
+ will return its first element.
+ */
+ virtual void Rewind() override;
+
+private:
+ /// Implementation object.
+ ::std::unique_ptr<Enumeration<SharedPageDescriptor>> mpImpl;
+
+ /** This constructor expects an implementation object that holds
+ the predicate that filters the pages.
+ */
+ PageEnumeration(::std::unique_ptr<Enumeration<SharedPageDescriptor>>&& pImpl);
+};
+
+} // end of namespace ::sd::slidesorter::model
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/model/SlsPageEnumerationProvider.hxx b/sd/source/ui/slidesorter/inc/model/SlsPageEnumerationProvider.hxx
new file mode 100644
index 000000000..b6de98d13
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/model/SlsPageEnumerationProvider.hxx
@@ -0,0 +1,51 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <model/SlsPageEnumeration.hxx>
+
+namespace sd::slidesorter::model
+{
+class SlideSorterModel;
+
+/** Collection of methods that create enumeration of slides.
+*/
+class PageEnumerationProvider
+{
+public:
+ /** The returned enumeration of slides iterates over all slides of the
+ given model.
+ */
+ static PageEnumeration CreateAllPagesEnumeration(const SlideSorterModel& rModel);
+
+ /** The returned enumeration of slides iterates over the currently
+ selected slides of the given model.
+ */
+ static PageEnumeration CreateSelectedPagesEnumeration(const SlideSorterModel& rModel);
+
+ /** The returned enumeration of slides iterates over the slides
+ (partially) inside the visible area.
+ */
+ static PageEnumeration CreateVisiblePagesEnumeration(const SlideSorterModel& rModel);
+};
+
+} // end of namespace ::sd::slidesorter::model
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/model/SlsSharedPageDescriptor.hxx b/sd/source/ui/slidesorter/inc/model/SlsSharedPageDescriptor.hxx
new file mode 100644
index 000000000..6ee1e2b22
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/model/SlsSharedPageDescriptor.hxx
@@ -0,0 +1,32 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+
+namespace sd::slidesorter::model
+{
+class PageDescriptor;
+
+typedef std::shared_ptr<PageDescriptor> SharedPageDescriptor;
+
+} // end of namespace ::sd::slidesorter::model
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/model/SlsVisualState.hxx b/sd/source/ui/slidesorter/inc/model/SlsVisualState.hxx
new file mode 100644
index 000000000..89eae16ca
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/model/SlsVisualState.hxx
@@ -0,0 +1,47 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <sal/types.h>
+#include <tools/gen.hxx>
+
+namespace sd::slidesorter::model
+{
+/** This class gives access to values related to the visualization of page
+ objects. This includes animation state when blending from one state to
+ another.
+*/
+class VisualState
+{
+public:
+ VisualState(const sal_Int32 nPageId);
+
+ const Point& GetLocationOffset() const { return maLocationOffset; }
+ void SetLocationOffset(const Point& rPoint);
+
+ sal_Int32 mnPageId; // For debugging
+
+private:
+ Point maLocationOffset;
+};
+
+} // end of namespace ::sd::slidesorter::model
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx b/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx
new file mode 100644
index 000000000..0f3493ab3
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx
@@ -0,0 +1,225 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <model/SlsPageDescriptor.hxx>
+#include <model/SlsSharedPageDescriptor.hxx>
+#include <view/SlsLayouter.hxx>
+#include <view/SlsILayerPainter.hxx>
+#include <o3tl/deleter.hxx>
+
+#include <View.hxx>
+#include <tools/gen.hxx>
+#include <vcl/region.hxx>
+#include <memory>
+
+namespace sd::slidesorter::cache { class PageCache; }
+namespace sd::slidesorter::model { class SlideSorterModel; }
+namespace sd { class Window; }
+namespace sd::slidesorter { class SlideSorter; }
+namespace sd::slidesorter::view {
+
+class LayeredDevice;
+class PageObjectPainter;
+class ToolTip;
+
+class SlideSorterView final
+ : public sd::View
+{
+public:
+
+ /** Create a new view for the slide sorter.
+ @param rViewShell
+ This reference is simply passed to the base class and not used
+ by this class.
+
+ */
+ explicit SlideSorterView (SlideSorter& rSlideSorter);
+ void Init();
+
+ virtual ~SlideSorterView() override;
+ void Dispose();
+
+ SlideSorterView(const SlideSorterView&) = delete;
+ SlideSorterView& operator=(const SlideSorterView&) = delete;
+
+ /** Set the general way of layouting the page objects. Note that this
+ method does not trigger any repaints or layouts.
+ */
+ bool SetOrientation (const Layouter::Orientation eOrientation);
+ Layouter::Orientation GetOrientation() const { return meOrientation;}
+
+ void RequestRepaint();
+ void RequestRepaint (const model::SharedPageDescriptor& rDescriptor);
+ void RequestRepaint (const ::tools::Rectangle& rRepaintBox);
+ void RequestRepaint (const vcl::Region& rRepaintRegion);
+
+ ::tools::Rectangle GetModelArea() const;
+
+ /** Return the index of the page that is rendered at the given position.
+ @param rPosition
+ The position is expected to be in pixel coordinates.
+ @return
+ The returned index is -1 when there is no page object at the
+ given position.
+ */
+ sal_Int32 GetPageIndexAtPoint (const Point& rPosition) const;
+
+ view::Layouter& GetLayouter();
+
+ virtual void ModelHasChanged() override;
+
+ /** This method is typically called before a model change takes place.
+ All references to model data are released. PostModelChange() has to
+ be called to complete the handling of the model change. When the
+ calls to Pre- and PostModelChange() are very close to each other you
+ may call HandleModelChange() instead.
+ */
+ void PreModelChange();
+
+ /** This method is typically called after a model change took place.
+ References to model data are re-allocated. Call this method only
+ after PreModelChange() has been called.
+ */
+ void PostModelChange();
+
+ /** This method is a convenience function that simply calls
+ PreModelChange() and then PostModelChange().
+ */
+ void HandleModelChange();
+
+ void HandleDrawModeChange();
+
+ void Resize();
+ virtual void CompleteRedraw (
+ OutputDevice* pDevice,
+ const vcl::Region& rPaintArea,
+ sdr::contact::ViewObjectContactRedirector* pRedirector = nullptr) override;
+ void Paint (OutputDevice& rDevice, const ::tools::Rectangle& rRepaintArea);
+
+ virtual void ConfigurationChanged (
+ utl::ConfigurationBroadcaster* pBroadcaster,
+ ConfigurationHints nHint) override;
+
+ void HandleDataChangeEvent();
+
+ void Layout();
+ /** This tells the view that it has to re-determine the visibility of
+ the page objects before painting them the next time.
+ */
+ void InvalidatePageObjectVisibilities();
+
+ std::shared_ptr<cache::PageCache> const & GetPreviewCache();
+
+ /** Return the range of currently visible page objects including the
+ first and last one in that range.
+ @return
+ The returned pair of page object indices is empty when the
+ second index is lower than the first.
+ */
+ Range const & GetVisiblePageRange();
+
+ /** Add a shape to the page. Typically used from inside
+ PostModelChange().
+ */
+ // void AddSdrObject (SdrObject& rObject);
+
+ /** Add a listener that is called when the set of visible slides.
+ @param rListener
+ When this method is called multiple times for the same listener
+ the second and all following calls are ignored. Each listener
+ is added only once.
+ */
+ void AddVisibilityChangeListener (const Link<LinkParamNone*,void>& rListener);
+
+ /** Remove a listener that is called when the set of visible slides changes.
+ @param rListener
+ It is safe to pass a listener that was not added or has been
+ removed previously. Such calls are ignored.
+ */
+ void RemoveVisibilityChangeListener (const Link<LinkParamNone*,void>& rListener);
+
+ /** The page under the mouse is not highlighted in some contexts. Call
+ this method on context changes.
+ */
+ void UpdatePageUnderMouse ();
+ void UpdatePageUnderMouse (const Point& rMousePosition);
+ void SetPageUnderMouse (const model::SharedPageDescriptor& rpDescriptor);
+
+ bool SetState (
+ const model::SharedPageDescriptor& rpDescriptor,
+ const model::PageDescriptor::State eState,
+ const bool bStateValue);
+
+ void UpdateOrientation();
+
+ std::shared_ptr<PageObjectPainter> const & GetPageObjectPainter();
+ const std::shared_ptr<LayeredDevice>& GetLayeredDevice() const { return mpLayeredDevice;}
+
+ class DrawLock
+ {
+ public:
+ DrawLock (SlideSorter const & rSlideSorter);
+ ~DrawLock();
+ /** When the DrawLock is disposed then it will not request a repaint
+ on destruction.
+ */
+ void Dispose();
+ private:
+ view::SlideSorterView& mrView;
+ VclPtr<sd::Window> mpWindow;
+ };
+
+ ToolTip& GetToolTip() const;
+
+ virtual void DragFinished (sal_Int8 nDropAction) override;
+
+private:
+ SlideSorter& mrSlideSorter;
+ model::SlideSorterModel& mrModel;
+ bool mbIsDisposed;
+ ::std::unique_ptr<Layouter> mpLayouter;
+ bool mbPageObjectVisibilitiesValid;
+ std::shared_ptr<cache::PageCache> mpPreviewCache;
+ std::shared_ptr<LayeredDevice> mpLayeredDevice;
+ Range maVisiblePageRange;
+ Size maPreviewSize;
+ bool mbPreciousFlagUpdatePending;
+ Layouter::Orientation meOrientation;
+ model::SharedPageDescriptor mpPageUnderMouse;
+ std::shared_ptr<PageObjectPainter> mpPageObjectPainter;
+ vcl::Region maRedrawRegion;
+ SharedILayerPainter mpBackgroundPainter;
+ std::unique_ptr<ToolTip, o3tl::default_delete<ToolTip>> mpToolTip;
+ bool mbIsRearrangePending;
+ ::std::vector<Link<LinkParamNone*,void>> maVisibilityChangeListeners;
+
+ /** Determine the visibility of all page objects.
+ */
+ void DeterminePageObjectVisibilities();
+
+ void UpdatePreciousFlags();
+ void RequestRearrange();
+ void Rearrange();
+};
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/view/SlsILayerPainter.hxx b/sd/source/ui/slidesorter/inc/view/SlsILayerPainter.hxx
new file mode 100644
index 000000000..57b90af0a
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/view/SlsILayerPainter.hxx
@@ -0,0 +1,53 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+
+class OutputDevice;
+namespace tools { class Rectangle; }
+
+namespace sd::slidesorter::view {
+
+class ILayerInvalidator
+{
+public:
+ virtual ~ILayerInvalidator() {}
+
+ virtual void Invalidate (const ::tools::Rectangle& rInvalidationBox) = 0;
+};
+typedef std::shared_ptr<ILayerInvalidator> SharedILayerInvalidator;
+
+class ILayerPainter
+{
+public:
+ virtual ~ILayerPainter() {}
+
+ virtual void SetLayerInvalidator (
+ const SharedILayerInvalidator& rpInvalidator) = 0;
+ virtual void Paint (
+ OutputDevice& rDevice,
+ const ::tools::Rectangle& rRepaintArea) = 0;
+};
+typedef std::shared_ptr<ILayerPainter> SharedILayerPainter;
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/view/SlsInsertAnimator.hxx b/sd/source/ui/slidesorter/inc/view/SlsInsertAnimator.hxx
new file mode 100644
index 000000000..c74d06cb9
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/view/SlsInsertAnimator.hxx
@@ -0,0 +1,59 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <controller/SlsAnimator.hxx>
+#include <memory>
+
+namespace sd::slidesorter::view
+{
+class InsertPosition;
+
+/** Animate the positions of page objects to make room at the insert
+ position while a move or copy operation takes place.
+*/
+class InsertAnimator
+{
+public:
+ explicit InsertAnimator(SlideSorter& rSlideSorter);
+ InsertAnimator(const InsertAnimator&) = delete;
+ InsertAnimator& operator=(const InsertAnimator&) = delete;
+
+ /** Set the position at which we have to make room for the display of an
+ icon.
+ */
+ void SetInsertPosition(const InsertPosition& rInsertPosition);
+
+ /** Restore the normal position of all page objects.
+ @param eMode
+ This flag controls whether to start an animation that ends in the
+ normal positions of all slides (AM_Animated) or to restore the
+ normal positions immediately (AM_Immediate).
+ */
+ void Reset(const controller::Animator::AnimationMode eMode);
+
+private:
+ class Implementation;
+ std::shared_ptr<Implementation> mpImplementation;
+};
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/view/SlsInsertionIndicatorOverlay.hxx b/sd/source/ui/slidesorter/inc/view/SlsInsertionIndicatorOverlay.hxx
new file mode 100644
index 000000000..3f4cc2218
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/view/SlsInsertionIndicatorOverlay.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <view/SlsILayerPainter.hxx>
+#include <controller/SlsTransferableData.hxx>
+
+#include <tools/gen.hxx>
+#include <vcl/bitmapex.hxx>
+#include <memory>
+#include <vector>
+
+class OutputDevice;
+class SdTransferable;
+
+namespace sd::slidesorter { class SlideSorter; }
+
+namespace sd::slidesorter::view {
+
+class FramePainter;
+
+/** The insertion indicator is painted as a vertical or horizontal bar
+ in the space between slides.
+*/
+class InsertionIndicatorOverlay final
+ : public ILayerPainter,
+ public std::enable_shared_from_this<InsertionIndicatorOverlay>
+{
+public:
+ InsertionIndicatorOverlay (SlideSorter& rSlideSorter);
+ virtual ~InsertionIndicatorOverlay() override;
+
+ virtual void SetLayerInvalidator (const SharedILayerInvalidator& rpInvalidator) override;
+
+ void Create (const SdTransferable* pTransferable);
+
+ /** Given a position in model coordinates this method calculates the
+ insertion marker both as an index in the document and as a location
+ used for drawing the insertion indicator.
+ */
+ void SetLocation (const Point& rPosition);
+
+ Size GetSize() const;
+
+ virtual void Paint (
+ OutputDevice& rDevice,
+ const ::tools::Rectangle& rRepaintArea) override;
+
+ bool IsVisible() const { return mbIsVisible;}
+ void Hide();
+ void Show();
+
+ ::tools::Rectangle GetBoundingBox() const;
+
+private:
+ SlideSorter& mrSlideSorter;
+ bool mbIsVisible;
+ SharedILayerInvalidator mpLayerInvalidator;
+ // Center of the insertion indicator.
+ Point maLocation;
+ BitmapEx maIcon;
+ std::unique_ptr<FramePainter> mpShadowPainter;
+
+ Point PaintRepresentatives (
+ OutputDevice& rContent,
+ const Size& rPreviewSize,
+ const sal_Int32 nOffset,
+ const ::std::vector<controller::TransferableData::Representative>& rPages) const;
+ void PaintPageCount (
+ OutputDevice& rDevice,
+ const sal_Int32 nSelectionCount,
+ const Size& rPreviewSize,
+ const Point& rFirstPageOffset) const;
+ /** Setup the insertion indicator by creating the icon. It consists of
+ scaled down previews of some of the selected pages.
+ */
+ void Create (
+ const ::std::vector<controller::TransferableData::Representative>& rPages,
+ const sal_Int32 nSelectionCount);
+};
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx b/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx
new file mode 100644
index 000000000..b91ae83c5
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx
@@ -0,0 +1,237 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/vclptr.hxx>
+#include <tools/gen.hxx>
+#include <sal/types.h>
+#include <memory>
+
+namespace sd { class Window; }
+namespace sd::slidesorter::model { class SlideSorterModel; }
+namespace sd::slidesorter::view { class PageObjectLayouter; }
+namespace sd::slidesorter::view { class Theme; }
+
+namespace sd::slidesorter::view {
+
+class InsertPosition;
+
+/** Calculate the size and position of page objects displayed by a slide
+ sorter. The layouter takes into account various input values:
+ 1.) Size of the window in which the slide sorter is displayed.
+ 2.) Desired and minimal and maximal widths of page objects.
+ 3.) Minimal and maximal number of columns.
+ 4.) Vertical and horizontal gaps between objects in adjacent columns.
+ 5.) Borders around every page object.
+ 6.) Vertical and horizontal borders between enclosing page and outer
+ page objects.
+ From these, it calculates various output values:
+ 1.) The width of page objects.
+ 2.) The number of columns.
+ 3.) The size of the enclosing page.
+
+ <p>Sizes and lengths are all in pixel except where explicitly stated
+ otherwise.</p>
+
+ <p>The GetIndex... methods may return indices that are larger than or
+ equal to (zero based) the number of pages. This is so because the
+ number of pages is not known to the class instances. Indices are
+ calculated with reference to the general grid layout of page
+ objects.</p>
+*/
+class Layouter
+{
+public:
+ enum Orientation { HORIZONTAL, VERTICAL, GRID };
+
+ Layouter (
+ sd::Window *rpWindow,
+ const std::shared_ptr<Theme>& rpTheme);
+ ~Layouter();
+
+ std::shared_ptr<PageObjectLayouter> const & GetPageObjectLayouter() const;
+ /** Set the interval of valid column counts. When nMinimalColumnCount
+ <= nMaximalColumnCount is not fulfilled then the call is ignored.
+ @param nMinimalColumnCount
+ The default value is 1. The question whether higher values make
+ any sense is left to the caller.
+ @param nMaximalColumnCount
+ The default value is 5.
+ */
+ void SetColumnCount (sal_Int32 nMinimalColumnCount,
+ sal_Int32 nMaximalColumnCount);
+
+ /** Central method of this class. It takes the input values and
+ calculates the output values. Both given sizes must not be 0 in any
+ dimension or the call is ignored.
+ @param eOrientation
+ This defines the generally layout and specifies whether there may
+ be more than one row or more than one column.
+ @param rWindowSize
+ The size of the window in pixels that the slide sorter is
+ displayed in. This can differ from the size of mpWindow during
+ detection of whether or not the scroll bars should be visible.
+ @param rPreviewModelSize
+ Size of each page in model coordinates.
+ @param rpWindow
+ The map mode of this window is adapted to the new layout of the
+ page objects.
+ @return
+ The return value indicates whether the Get... methods can be
+ used to obtain valid values (<TRUE/>).
+ */
+ bool Rearrange (
+ const Orientation eOrientation,
+ const Size& rWindowSize,
+ const Size& rPreviewModelSize,
+ const sal_uInt32 nPageCount);
+
+ /** Return the number of columns.
+ */
+ sal_Int32 GetColumnCount() const;
+
+ sal_Int32 GetIndex (const sal_Int32 nRow, const sal_Int32 nColumn) const;
+
+ Size const & GetPageObjectSize() const;
+
+ /** Return the bounding box in window coordinates of the nIndex-th page
+ object.
+ */
+ ::tools::Rectangle GetPageObjectBox (
+ const sal_Int32 nIndex,
+ const bool bIncludeBorderAndGap) const;
+
+ /** Return the bounding box in model coordinates of the page that
+ contains the given amount of page objects.
+ */
+ ::tools::Rectangle GetTotalBoundingBox() const;
+
+ /** Return the index of the first fully or partially visible page
+ object. This takes into account only the vertical dimension.
+ @return
+ The second index may be larger than the number of existing
+ page objects.
+ */
+ Range GetRangeOfVisiblePageObjects (const ::tools::Rectangle& rVisibleArea) const;
+
+ /** Return the index of the page object that is rendered at the given
+ point.
+ @param rPosition
+ The position is expected to be in model coordinates relative to
+ the page origin.
+ @param bIncludePageBorders
+ When <TRUE/> then include the page borders into the calculation,
+ i.e. when a point lies in the border of a page object but not on
+ the actual page area the index of that page is returned;
+ otherwise -1 would be returned to indicate that no page object
+ has been hit.
+ @param bClampToValidRange
+ When <TRUE/> then values outside the valid range [0,mnPageCount)
+ are mapped to 0 (when smaller than 0) or mnPageCount-1 when
+ equal to or larger than mnPageCount.
+ When <FALSE/> then -1 is returned for values outside the valid range.
+ @return
+ The returned index may be larger than the number of existing
+ page objects.
+ */
+ sal_Int32 GetIndexAtPoint (
+ const Point& rModelPosition,
+ const bool bIncludePageBorders,
+ const bool bClampToValidRange = true) const;
+
+ /** Return an object that describes the logical and visual properties of
+ where to do an insert operation when the user would release the
+ mouse button at the given position after a drag operation and of
+ where and how to display an insertion indicator.
+ @param rModelPosition
+ The position in the model coordinate system for which to
+ determine the insertion page index. The position does not have
+ to be over a page object to return a valid value.
+ @param rIndicatorSize
+ The size of the insertion indicator. This size is used to adapt
+ the location when at the left or right of a row or at the top or
+ bottom of a column.
+ @param rModel
+ The model is used to get access to the selection states of the
+ pages. This in turn is used to determine the visual bounding
+ boxes.
+ */
+ InsertPosition GetInsertPosition (
+ const Point& rModelPosition,
+ const Size& rIndicatorSize,
+ model::SlideSorterModel const & rModel) const;
+
+ Range GetValidHorizontalSizeRange() const;
+ Range GetValidVerticalSizeRange() const;
+
+ class Implementation;
+
+private:
+ std::unique_ptr<Implementation> mpImplementation;
+ VclPtr<sd::Window> mpWindow;
+};
+
+/** Collect all values concerning the logical and visual properties of the
+ insertion position that is used for drag-and-drop and copy-and-paste.
+*/
+class InsertPosition
+{
+public:
+ InsertPosition();
+ bool operator== (const InsertPosition& rInsertPosition) const;
+ bool operator!= (const InsertPosition& rInsertPosition) const;
+
+ void SetLogicalPosition (
+ const sal_Int32 nRow,
+ const sal_Int32 nColumn,
+ const sal_Int32 nIndex,
+ const bool bIsAtRunStart,
+ const bool bIsAtRunEnd,
+ const bool bIsExtraSpaceNeeded);
+ void SetGeometricalPosition(
+ const Point& rLocation,
+ const Point& rLeadingOffset,
+ const Point& rTrailingOffset);
+
+ sal_Int32 GetRow() const { return mnRow; }
+ sal_Int32 GetColumn() const { return mnColumn; }
+ sal_Int32 GetIndex() const { return mnIndex; }
+ const Point& GetLocation() const { return maLocation; }
+ const Point& GetLeadingOffset() const { return maLeadingOffset; }
+ const Point& GetTrailingOffset() const { return maTrailingOffset; }
+ bool IsAtRunStart() const { return mbIsAtRunStart; }
+ bool IsAtRunEnd() const { return mbIsAtRunEnd; }
+ bool IsExtraSpaceNeeded() const { return mbIsExtraSpaceNeeded; }
+
+private:
+ sal_Int32 mnRow;
+ sal_Int32 mnColumn;
+ sal_Int32 mnIndex;
+ bool mbIsAtRunStart : 1;
+ bool mbIsAtRunEnd : 1;
+ bool mbIsExtraSpaceNeeded : 1;
+ Point maLocation;
+ Point maLeadingOffset;
+ Point maTrailingOffset;
+};
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/view/SlsPageObjectLayouter.hxx b/sd/source/ui/slidesorter/inc/view/SlsPageObjectLayouter.hxx
new file mode 100644
index 000000000..8bb77a988
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/view/SlsPageObjectLayouter.hxx
@@ -0,0 +1,144 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <model/SlsSharedPageDescriptor.hxx>
+#include <tools/gen.hxx>
+#include <vcl/image.hxx>
+
+namespace vcl { class Font; }
+namespace sd { class Window; }
+
+namespace sd::slidesorter::view {
+
+/** In contrast to the Layouter that places page objects in the view, the
+ PageObjectLayouter places the parts of individual page objects like page
+ number area, borders, preview.
+*/
+class PageObjectLayouter
+{
+public:
+ /** Create a new PageObjectLayouter object.
+ @param rPageObjectSize
+ In general either the width or the height will be 0 in order to
+ signal that this size component has to be calculated from the other.
+ This calculation will make the preview as large as possible.
+ @param nPageCount
+ The page count is used to determine how wide the page number
+ area has to be, how many digits to except for the largest page number.
+ */
+ PageObjectLayouter(
+ const Size& rPageObjectWindowSize,
+ const Size& rPreviewModelSize,
+ sd::Window *pWindow,
+ const sal_Int32 nPageCount);
+ ~PageObjectLayouter();
+
+ enum class Part {
+ // The focus indicator is painted outside the actual page object.
+ FocusIndicator,
+ // This is the outer bounding box that includes the preview, page
+ // number, title.
+ PageObject,
+ // Bounding box of the actual preview.
+ Preview,
+ // Bounding box of the page number.
+ PageNumber,
+ // Indicator whether or not there is a slide transition associated
+ // with this slide.
+ TransitionEffectIndicator,
+ // Indicator whether or not there is a custom animation associated
+ // with this slide.
+ CustomAnimationEffectIndicator
+ };
+ /** Two coordinate systems are supported. They differ only in
+ translation not in scale. Both relate to pixel values in the window.
+ A position in the model coordinate system does not change when the window content is
+ scrolled up or down. In the window coordinate system (relative
+ to the top left point of the window)scrolling leads to different values.
+ */
+ enum CoordinateSystem {
+ WindowCoordinateSystem,
+ ModelCoordinateSystem
+ };
+
+ /** Return the bounding box of the page object or one of its graphical
+ parts.
+ @param rWindow
+ This device is used to translate between model and window
+ coordinates.
+ @param rpPageDescriptor
+ The page for which to calculate the bounding box. This may be
+ NULL. When it is NULL then a generic bounding box is calculated
+ for the location (0,0).
+ @param ePart
+ The part of the page object for which to return the bounding
+ box.
+ @param eCoordinateSystem
+ The bounding box can be returned in model and in pixel
+ (window) coordinates.
+ @param bIgnoreLocation
+ Return a position ignoring the slides' location, ie. as if
+ we were the first slide.
+ */
+ ::tools::Rectangle GetBoundingBox (
+ const model::SharedPageDescriptor& rpPageDescriptor,
+ const Part ePart,
+ const CoordinateSystem eCoordinateSystem,
+ bool bIgnoreLocation = false);
+
+ /// the size of the embedded preview: position independent, in window coordinate system
+ Size GetPreviewSize();
+
+ /// the maximum size of each tile, also position independent, in window coordinate system
+ Size GetGridMaxSize();
+
+ const Image& GetTransitionEffectIcon() const { return maTransitionEffectIcon;}
+ const Image& GetCustomAnimationEffectIcon() const { return maCustomAnimationEffectIcon;}
+
+private:
+ ::tools::Rectangle GetBoundingBox (
+ const Point& rPageObjectLocation,
+ const Part ePart,
+ const CoordinateSystem eCoordinateSystem);
+
+private:
+ VclPtr<sd::Window> mpWindow;
+ ::tools::Rectangle maFocusIndicatorBoundingBox;
+ ::tools::Rectangle maPageObjectBoundingBox;
+ ::tools::Rectangle maPageNumberAreaBoundingBox;
+ ::tools::Rectangle maPreviewBoundingBox;
+ ::tools::Rectangle maTransitionEffectBoundingBox;
+ ::tools::Rectangle maCustomAnimationEffectBoundingBox;
+ const Image maTransitionEffectIcon;
+ const Image maCustomAnimationEffectIcon;
+ const std::shared_ptr<vcl::Font> mpPageNumberFont;
+
+ Size GetPageNumberAreaSize (const int nPageCount);
+ ::tools::Rectangle CalculatePreviewBoundingBox (
+ Size& rPageObjectSize,
+ const Size& rPreviewModelSize,
+ const sal_Int32 nPageNumberAreaWidth,
+ const sal_Int32 nFocusIndicatorWidth);
+};
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx b/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx
new file mode 100644
index 000000000..747c09500
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <model/SlsSharedPageDescriptor.hxx>
+#include <view/SlsTheme.hxx>
+#include <memory>
+
+namespace sd::slidesorter::cache { class PageCache; }
+namespace sd::slidesorter { class SlideSorter; }
+
+namespace sd::slidesorter::view {
+
+class Layouter;
+class PageObjectLayouter;
+class FramePainter;
+
+class PageObjectPainter
+{
+public:
+ PageObjectPainter (const SlideSorter& rSlideSorter);
+ ~PageObjectPainter();
+
+ void PaintPageObject (
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor);
+
+ /** Called when the theme changes, either because it is replaced with
+ another or because the system colors have changed. So, even when
+ the given theme is the same object as the one already in use by this
+ painter everything that depends on the theme is updated.
+ */
+ void SetTheme (const std::shared_ptr<view::Theme>& rpTheme);
+
+ /** Return a preview bitmap for the given page descriptor. When the
+ page is excluded from the show then the preview is marked
+ accordingly.
+ @rpDescriptor
+ Defines the page for which to return the preview.
+ @pReferenceDevice
+ When not <NULL/> then this reference device is used to created a
+ compatible bitmap.
+ @return
+ The returned bitmap may have a different size then the preview area.
+ */
+ BitmapEx GetPreviewBitmap (
+ const model::SharedPageDescriptor& rpDescriptor,
+ const OutputDevice* pReferenceDevice) const;
+
+private:
+ const Layouter& mrLayouter;
+ std::shared_ptr<cache::PageCache> mpCache;
+ std::shared_ptr<view::Theme> mpTheme;
+ std::shared_ptr<vcl::Font> mpPageNumberFont;
+ std::unique_ptr<FramePainter> mpShadowPainter;
+ std::unique_ptr<FramePainter> mpFocusBorderPainter;
+
+ void PaintBackground (
+ PageObjectLayouter *pPageObjectLayouter,
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor) const;
+ void PaintPreview (
+ PageObjectLayouter *pPageObjectLayouter,
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor) const;
+ void PaintPageNumber (
+ PageObjectLayouter *pPageObjectLayouter,
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor) const;
+ static void PaintTransitionEffect (
+ PageObjectLayouter *pPageObjectLayouter,
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor);
+ static void PaintCustomAnimationEffect (
+ PageObjectLayouter *pPageObjectLayouter,
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor);
+ void PaintBorder (
+ OutputDevice& rDevice,
+ const Theme::GradientColorType eColorType,
+ const ::tools::Rectangle& rBox) const;
+ void PaintBackgroundDetail(
+ PageObjectLayouter *pPageObjectLayouter,
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor) const;
+
+ static BitmapEx CreateMarkedPreview(
+ const Size& rSize,
+ const BitmapEx& rPreview,
+ const BitmapEx& rOverlay,
+ const OutputDevice* pReferenceDevice);
+
+ /** Update the local pointer to the page object layouter to the
+ one owned by the general layouter.
+ Return <TRUE/> when after the call we have a valid page object layouter.
+ */
+ bool UpdatePageObjectLayouter();
+};
+
+} // end of namespace sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx b/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx
new file mode 100644
index 000000000..efb7b2a3e
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx
@@ -0,0 +1,135 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/bitmapex.hxx>
+#include <tools/color.hxx>
+
+#include <memory>
+
+namespace vcl { class Font; }
+
+namespace sd::slidesorter::controller { class Properties; }
+
+namespace sd::slidesorter::view {
+
+const int Theme_FocusIndicatorWidth = 3;
+
+/** Collection of colors and styles that are used to paint the slide sorter
+ view.
+*/
+class Theme
+{
+public:
+ Theme (const std::shared_ptr<controller::Properties>& rpProperties);
+
+ /** Call this method to update some colors as response to a change of
+ a system color change.
+ */
+ void Update (
+ const std::shared_ptr<controller::Properties>& rpProperties);
+
+ // BitmapEx GetInsertIndicatorIcon() const;
+
+ enum FontType {
+ Font_PageNumber,
+ Font_PageCount
+ };
+ static std::shared_ptr<vcl::Font> GetFont (
+ const FontType eType,
+ const OutputDevice& rDevice);
+
+ enum ColorType {
+ Color_Background,
+ Color_PageNumberDefault,
+ Color_PageNumberHover,
+ Color_PageNumberHighContrast,
+ Color_PageNumberBrightBackground,
+ Color_PageNumberDarkBackground,
+ Color_Selection,
+ Color_PreviewBorder,
+ Color_PageCountFontColor,
+ ColorType_Size_
+ };
+ Color GetColor (const ColorType eType);
+
+ enum GradientColorType {
+ Gradient_NormalPage,
+ Gradient_SelectedPage,
+ Gradient_SelectedAndFocusedPage,
+ Gradient_MouseOverPage,
+ Gradient_MouseOverSelected,
+ Gradient_MouseOverSelectedAndFocusedPage,
+ Gradient_FocusedPage,
+ GradientColorType_Size_
+ };
+ enum class GradientColorClass {
+ Border1,
+ Border2,
+ Fill1,
+ Fill2
+ };
+ Color GetGradientColor (
+ const GradientColorType eType,
+ const GradientColorClass eClass);
+ void SetGradient (
+ const GradientColorType eType,
+ const Color aBaseColor,
+ const sal_Int32 nSaturationOverride,
+ const sal_Int32 nBrightnessOverride,
+ const sal_Int32 nFillStartOffset,
+ const sal_Int32 nFillEndOffset,
+ const sal_Int32 nBorderStartOffset,
+ const sal_Int32 nBorderEndOffset);
+
+ enum IconType
+ {
+ Icon_RawShadow,
+ Icon_RawInsertShadow,
+ Icon_HideSlideOverlay,
+ Icon_FocusBorder,
+ IconType_Size_
+ };
+ const BitmapEx& GetIcon (const IconType eType);
+
+private:
+ class GradientDescriptor
+ {
+ public:
+ Color maFillColor1;
+ Color maFillColor2;
+ Color maBorderColor1;
+ Color maBorderColor2;
+ };
+ Color maBackgroundColor;
+ ::std::vector<GradientDescriptor> maGradients;
+ ::std::vector<BitmapEx> maIcons;
+ ::std::vector<Color> maColor;
+
+ GradientDescriptor& GetGradient (const GradientColorType eType);
+ /** Guarded initialization of the specified icon in the maIcons
+ container.
+ */
+ void InitializeIcon(const IconType eType, const OUString& rResourceId);
+};
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/inc/view/SlsToolTip.hxx b/sd/source/ui/slidesorter/inc/view/SlsToolTip.hxx
new file mode 100644
index 000000000..6c3557e64
--- /dev/null
+++ b/sd/source/ui/slidesorter/inc/view/SlsToolTip.hxx
@@ -0,0 +1,75 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <model/SlsSharedPageDescriptor.hxx>
+#include <rtl/ustring.hxx>
+#include <vcl/timer.hxx>
+
+namespace sd::slidesorter
+{
+class SlideSorter;
+}
+
+namespace sd::slidesorter::view
+{
+/** Manage the display of tool tips. The tool tip text changes when the
+ mouse is moved from slide to slide or from button to button.
+ After the mouse enters a slide the first display of the tool tip is
+ delayed for a short time in order to not draw attention from the slide
+ or its button bar.
+*/
+class ToolTip
+{
+public:
+ ToolTip(SlideSorter& rSlideSorter);
+ ~ToolTip();
+
+ /** Set a new page. This modifies the default help text. After a page
+ change a timer is started to delay the display of the tool tip for
+ the new page.
+ @param rpPage
+ When this is empty then the tool tip is hidden.
+ */
+ void SetPage(const model::SharedPageDescriptor& rpPage);
+
+ /** Hide the tool tip.
+ @return
+ Returns whether the tool tip was visible at the time this method
+ was called.
+ */
+ bool Hide();
+
+private:
+ SlideSorter& mrSlideSorter;
+ model::SharedPageDescriptor mpDescriptor;
+ OUString msCurrentHelpText;
+ void* mnHelpWindowHandle;
+ Timer maShowTimer;
+ Timer maHiddenTimer;
+
+ void DoShow();
+
+ DECL_LINK(DelayTrigger, Timer*, void);
+};
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/model/SlideSorterModel.cxx b/sd/source/ui/slidesorter/model/SlideSorterModel.cxx
new file mode 100644
index 000000000..4d3e79656
--- /dev/null
+++ b/sd/source/ui/slidesorter/model/SlideSorterModel.cxx
@@ -0,0 +1,676 @@
+/* -*- 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 <model/SlideSorterModel.hxx>
+
+#include <SlideSorter.hxx>
+#include <sal/log.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <controller/SlsSlotManager.hxx>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/frame/XController.hpp>
+
+#include <vcl/uitest/logger.hxx>
+#include <vcl/uitest/eventdescription.hxx>
+
+#include <ViewShellBase.hxx>
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <FrameView.hxx>
+
+#include <o3tl/safeint.hxx>
+#include <tools/diagnose_ex.h>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd::slidesorter::model {
+
+namespace {
+ bool PrintModel (const SlideSorterModel& rModel)
+ {
+ for (sal_Int32 nIndex=0,nCount=rModel.GetPageCount(); nIndex<nCount; ++nIndex)
+ {
+ SharedPageDescriptor pDescriptor (rModel.GetPageDescriptor(nIndex));
+ if (pDescriptor)
+ {
+ SAL_INFO(
+ "sd.sls",
+ nIndex << " " << pDescriptor->GetPageIndex() << " "
+ << pDescriptor->GetVisualState().mnPageId << " "
+ << FromCoreIndex(pDescriptor->GetPage()->GetPageNum())
+ << " " << pDescriptor->GetPage());
+ }
+ else
+ {
+ SAL_INFO("sd.sls", nIndex);
+ }
+ }
+
+ return true;
+ }
+ bool CheckModel (const SlideSorterModel& rModel)
+ {
+ for (sal_Int32 nIndex=0,nCount=rModel.GetPageCount(); nIndex<nCount; ++nIndex)
+ {
+ SharedPageDescriptor pDescriptor (rModel.GetPageDescriptor(nIndex));
+ if ( ! pDescriptor)
+ {
+ PrintModel(rModel);
+ assert(pDescriptor);
+ return false;
+ }
+ if (nIndex != pDescriptor->GetPageIndex())
+ {
+ PrintModel(rModel);
+ assert(nIndex == pDescriptor->GetPageIndex());
+ return false;
+ }
+ if (nIndex != pDescriptor->GetVisualState().mnPageId)
+ {
+ PrintModel(rModel);
+ assert(nIndex == pDescriptor->GetVisualState().mnPageId);
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
+
+namespace {
+
+void collectUIInformation(const OUString& num, const OUString& rAction)
+{
+ EventDescription aDescription;
+ aDescription.aID = "impress_win_or_draw_win";
+ aDescription.aParameters = {{"POS", num}};
+ aDescription.aAction = rAction;
+ aDescription.aKeyWord = "ImpressWindowUIObject";
+ aDescription.aParent = "MainWindow";
+
+ UITestLogger::getInstance().logEvent(aDescription);
+}
+
+}
+
+SlideSorterModel::SlideSorterModel (SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter),
+ meEditMode(EditMode::Page),
+ maPageDescriptors(0)
+{
+}
+
+SlideSorterModel::~SlideSorterModel()
+{
+ ClearDescriptorList ();
+}
+
+void SlideSorterModel::Dispose()
+{
+ ClearDescriptorList ();
+}
+
+SdDrawDocument* SlideSorterModel::GetDocument()
+{
+ if (mrSlideSorter.GetViewShellBase() != nullptr)
+ return mrSlideSorter.GetViewShellBase()->GetDocument();
+ else
+ return nullptr;
+}
+
+bool SlideSorterModel::SetEditMode (EditMode eEditMode)
+{
+ bool bEditModeChanged = false;
+ if (meEditMode != eEditMode)
+ {
+ meEditMode = eEditMode;
+ UpdatePageList();
+ bEditModeChanged = true;
+ }
+ return bEditModeChanged;
+}
+
+sal_Int32 SlideSorterModel::GetPageCount() const
+{
+ return maPageDescriptors.size();
+}
+
+SharedPageDescriptor SlideSorterModel::GetPageDescriptor (
+ const sal_Int32 nPageIndex,
+ const bool bCreate) const
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ SharedPageDescriptor pDescriptor;
+
+ if (nPageIndex>=0 && nPageIndex<GetPageCount())
+ {
+ pDescriptor = maPageDescriptors[nPageIndex];
+ if (pDescriptor == nullptr && bCreate && mxSlides.is())
+ {
+ SdPage* pPage = GetPage(nPageIndex);
+ pDescriptor = std::make_shared<PageDescriptor>(
+ Reference<drawing::XDrawPage>(mxSlides->getByIndex(nPageIndex),UNO_QUERY),
+ pPage,
+ nPageIndex);
+ maPageDescriptors[nPageIndex] = pDescriptor;
+ }
+ }
+
+ return pDescriptor;
+}
+
+sal_Int32 SlideSorterModel::GetIndex (const Reference<drawing::XDrawPage>& rxSlide) const
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ // First try to guess the right index.
+ Reference<beans::XPropertySet> xSet (rxSlide, UNO_QUERY);
+ if (xSet.is())
+ {
+ try
+ {
+ const Any aNumber (xSet->getPropertyValue("Number"));
+ sal_Int16 nNumber (-1);
+ aNumber >>= nNumber;
+ nNumber -= 1;
+ SharedPageDescriptor pDescriptor (GetPageDescriptor(nNumber, false));
+ if (pDescriptor
+ && pDescriptor->GetXDrawPage() == rxSlide)
+ {
+ return nNumber;
+ }
+ }
+ catch (uno::Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+ }
+
+ // Guess was wrong, iterate over all slides and search for the right
+ // one.
+ const sal_Int32 nCount (maPageDescriptors.size());
+ for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
+ {
+ SharedPageDescriptor pDescriptor (maPageDescriptors[nIndex]);
+
+ // Make sure that the descriptor exists. Without it the given slide
+ // can not be found.
+ if (!pDescriptor)
+ {
+ // Call GetPageDescriptor() to create the missing descriptor.
+ pDescriptor = GetPageDescriptor(nIndex);
+ }
+
+ if (pDescriptor->GetXDrawPage() == rxSlide)
+ return nIndex;
+ }
+
+ return -1;
+}
+
+sal_Int32 SlideSorterModel::GetIndex (const SdrPage* pPage) const
+{
+ if (pPage == nullptr)
+ return -1;
+
+ ::osl::MutexGuard aGuard (maMutex);
+
+ // First try to guess the right index.
+ sal_Int16 nNumber ((pPage->GetPageNum()-1)/2);
+ SharedPageDescriptor pDescriptor (GetPageDescriptor(nNumber, false));
+ if (pDescriptor
+ && pDescriptor->GetPage() == pPage)
+ {
+ return nNumber;
+ }
+
+ // Guess was wrong, iterate over all slides and search for the right
+ // one.
+ const sal_Int32 nCount (maPageDescriptors.size());
+ for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
+ {
+ pDescriptor = maPageDescriptors[nIndex];
+
+ // Make sure that the descriptor exists. Without it the given slide
+ // can not be found.
+ if (!pDescriptor)
+ {
+ // Call GetPageDescriptor() to create the missing descriptor.
+ pDescriptor = GetPageDescriptor(nIndex);
+ }
+
+ if (pDescriptor->GetPage() == pPage)
+ return nIndex;
+ }
+
+ return -1;
+}
+
+sal_uInt16 SlideSorterModel::GetCoreIndex (const sal_Int32 nIndex) const
+{
+ SharedPageDescriptor pDescriptor (GetPageDescriptor(nIndex));
+ if (pDescriptor)
+ return pDescriptor->GetPage()->GetPageNum();
+ else
+ return mxSlides->getCount()*2+1;
+}
+
+/** For now this method uses a trivial algorithm: throw away all descriptors
+ and create them anew (on demand). The main problem that we are facing
+ when designing a better algorithm is that we can not compare pointers to
+ pages stored in the PageDescriptor objects and those obtained from the
+ document: pages may have been deleted and others may have been created
+ at the exact same memory locations.
+*/
+void SlideSorterModel::Resync()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ // Check if document and this model really differ.
+ bool bIsUpToDate (true);
+ SdDrawDocument* pDocument = GetDocument();
+ if (pDocument!=nullptr && maPageDescriptors.size()==pDocument->GetSdPageCount(PageKind::Standard))
+ {
+ for (sal_Int32 nIndex=0,nCount=maPageDescriptors.size(); nIndex<nCount; ++nIndex)
+ {
+ if (maPageDescriptors[nIndex]
+ && maPageDescriptors[nIndex]->GetPage()
+ != GetPage(nIndex))
+ {
+ SAL_INFO("sd.sls", "page " << nIndex << " differs");
+ bIsUpToDate = false;
+ break;
+ }
+ }
+ }
+ else
+ {
+ bIsUpToDate = false;
+ }
+
+ if ( ! bIsUpToDate)
+ {
+ SynchronizeDocumentSelection(); // Try to make the current selection persistent.
+ ClearDescriptorList ();
+ AdaptSize();
+ SynchronizeModelSelection();
+ mrSlideSorter.GetController().GetPageSelector().CountSelectedPages();
+ }
+ CheckModel(*this);
+}
+
+void SlideSorterModel::ClearDescriptorList()
+{
+ ::std::vector<SharedPageDescriptor> aDescriptors;
+
+ {
+ ::osl::MutexGuard aGuard (maMutex);
+ aDescriptors.swap(maPageDescriptors);
+ }
+
+ for (auto& rxDescriptor : aDescriptors)
+ {
+ if (rxDescriptor != nullptr)
+ {
+ if (rxDescriptor.use_count() > 1)
+ {
+ SAL_INFO(
+ "sd.sls",
+ "trying to delete page descriptor that is still used with"
+ " count " << rxDescriptor.use_count());
+ // No assertion here because that can hang the office when
+ // opening a dialog from here.
+ }
+ rxDescriptor.reset();
+ }
+ }
+}
+
+void SlideSorterModel::SynchronizeDocumentSelection()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ PageEnumeration aAllPages (PageEnumerationProvider::CreateAllPagesEnumeration(*this));
+ while (aAllPages.HasMoreElements())
+ {
+ SharedPageDescriptor pDescriptor (aAllPages.GetNextElement());
+ const bool bIsSelected (pDescriptor->HasState(PageDescriptor::ST_Selected));
+ pDescriptor->GetPage()->SetSelected(bIsSelected);
+ }
+}
+
+void SlideSorterModel::SynchronizeModelSelection()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ PageEnumeration aAllPages (PageEnumerationProvider::CreateAllPagesEnumeration(*this));
+ while (aAllPages.HasMoreElements())
+ {
+ SharedPageDescriptor pDescriptor (aAllPages.GetNextElement());
+ const bool bIsSelected (pDescriptor->GetPage()->IsSelected());
+ pDescriptor->SetState(PageDescriptor::ST_Selected, bIsSelected);
+ }
+}
+
+void SlideSorterModel::SetDocumentSlides (
+ const Reference<container::XIndexAccess>& rxSlides)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ // Make the current selection persistent and then release the
+ // current set of pages.
+ SynchronizeDocumentSelection();
+ mxSlides = nullptr;
+ ClearDescriptorList ();
+
+ // Reset the current page to cause everybody to release references to it.
+ mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(-1);
+
+ // Set the new set of pages.
+ mxSlides = rxSlides;
+ AdaptSize();
+ SynchronizeModelSelection();
+ mrSlideSorter.GetController().GetPageSelector().CountSelectedPages();
+
+ model::PageEnumeration aSelectedPages (
+ model::PageEnumerationProvider::CreateSelectedPagesEnumeration(*this));
+ if (aSelectedPages.HasMoreElements())
+ {
+ SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement());
+ mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(
+ pDescriptor->GetPage());
+ }
+
+ ViewShell* pViewShell = mrSlideSorter.GetViewShell();
+ if (pViewShell != nullptr)
+ {
+ SdPage* pPage = pViewShell->getCurrentPage();
+ if (pPage != nullptr)
+ mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(
+ pPage);
+ else
+ {
+ // No current page. This can only be when the slide sorter is
+ // the main view shell. Get current slide form frame view.
+ const FrameView* pFrameView = pViewShell->GetFrameView();
+ if (pFrameView != nullptr)
+ mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(
+ pFrameView->GetSelectedPage());
+ else
+ {
+ // No frame view. As a last resort use the first slide as
+ // current slide.
+ mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(
+ sal_Int32(0));
+ }
+ }
+ }
+
+ mrSlideSorter.GetController().GetSlotManager()->NotifyEditModeChange();
+}
+
+Reference<container::XIndexAccess> SlideSorterModel::GetDocumentSlides() const
+{
+ ::osl::MutexGuard aGuard (maMutex);
+ return mxSlides;
+}
+
+void SlideSorterModel::UpdatePageList()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ Reference<container::XIndexAccess> xPages;
+
+ // Get the list of pages according to the edit mode.
+ Reference<frame::XController> xController (mrSlideSorter.GetXController());
+ if (xController.is())
+ {
+ switch (meEditMode)
+ {
+ case EditMode::MasterPage:
+ {
+ Reference<drawing::XMasterPagesSupplier> xSupplier (
+ xController->getModel(), UNO_QUERY);
+ if (xSupplier.is())
+ {
+ xPages = xSupplier->getMasterPages();
+ }
+ }
+ break;
+
+ case EditMode::Page:
+ {
+ Reference<drawing::XDrawPagesSupplier> xSupplier (
+ xController->getModel(), UNO_QUERY);
+ if (xSupplier.is())
+ {
+ xPages = xSupplier->getDrawPages();
+ }
+ }
+ break;
+
+ default:
+ // We should never get here.
+ assert(false);
+ break;
+ }
+ }
+
+ mrSlideSorter.GetController().SetDocumentSlides(xPages);
+}
+
+void SlideSorterModel::AdaptSize()
+{
+ if (mxSlides.is())
+ maPageDescriptors.resize(mxSlides->getCount());
+ else
+ maPageDescriptors.resize(0);
+}
+
+bool SlideSorterModel::IsReadOnly() const
+{
+ if (mrSlideSorter.GetViewShellBase() != nullptr
+ && mrSlideSorter.GetViewShellBase()->GetDocShell())
+ return mrSlideSorter.GetViewShellBase()->GetDocShell()->IsReadOnly();
+ else
+ return true;
+}
+
+void SlideSorterModel::SaveCurrentSelection()
+{
+ PageEnumeration aPages (PageEnumerationProvider::CreateAllPagesEnumeration(*this));
+ while (aPages.HasMoreElements())
+ {
+ SharedPageDescriptor pDescriptor (aPages.GetNextElement());
+ pDescriptor->SetState(
+ PageDescriptor::ST_WasSelected,
+ pDescriptor->HasState(PageDescriptor::ST_Selected));
+ }
+}
+
+vcl::Region SlideSorterModel::RestoreSelection()
+{
+ vcl::Region aRepaintRegion;
+ PageEnumeration aPages (PageEnumerationProvider::CreateAllPagesEnumeration(*this));
+ while (aPages.HasMoreElements())
+ {
+ SharedPageDescriptor pDescriptor (aPages.GetNextElement());
+ if (pDescriptor->SetState(
+ PageDescriptor::ST_Selected,
+ pDescriptor->HasState(PageDescriptor::ST_WasSelected)))
+ {
+ aRepaintRegion.Union(pDescriptor->GetBoundingBox());
+ }
+ }
+ return aRepaintRegion;
+}
+
+bool SlideSorterModel::NotifyPageEvent (const SdrPage* pSdrPage)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ SdPage* pPage = const_cast<SdPage*>(dynamic_cast<const SdPage*>(pSdrPage));
+ if (pPage == nullptr)
+ return false;
+
+ // We are only interested in pages that are currently served by this
+ // model.
+ if (pPage->GetPageKind() != PageKind::Standard)
+ return false;
+ if (pPage->IsMasterPage() != (meEditMode==EditMode::MasterPage))
+ return false;
+
+ //NotifyPageEvent is called for add, remove, *and* change position so for
+ //the change position case we must ensure we don't end up with the slide
+ //duplicated in our list
+ bool bSelected = DeleteSlide(pPage);
+ if (pPage->IsInserted())
+ {
+ InsertSlide(pPage, bSelected);
+ }
+ CheckModel(*this);
+
+ return true;
+}
+
+void SlideSorterModel::InsertSlide(SdPage* pPage, bool bMarkSelected)
+{
+ // Find the index at which to insert the given page.
+ sal_uInt16 nCoreIndex (pPage->GetPageNum());
+ sal_Int32 nIndex (FromCoreIndex(nCoreIndex));
+ if (pPage != GetPage(nIndex))
+ return;
+
+ // Check that the pages in the document before and after the given page
+ // are present in this model.
+ if (nIndex>0)
+ if (GetPage(nIndex-1) != GetPageDescriptor(nIndex-1)->GetPage())
+ return;
+ if (nIndex < static_cast<sal_Int32>(maPageDescriptors.size()) -1)
+ if (GetPage(nIndex+1) != GetPageDescriptor(nIndex)->GetPage())
+ return;
+
+ auto iter = maPageDescriptors.begin() + nIndex;
+
+ // Insert the given page at index nIndex
+ iter = maPageDescriptors.insert(
+ iter,
+ std::make_shared<PageDescriptor>(
+ Reference<drawing::XDrawPage>(mxSlides->getByIndex(nIndex),UNO_QUERY),
+ pPage,
+ nIndex));
+
+ if (bMarkSelected)
+ (*iter)->SetState(PageDescriptor::ST_Selected, true);
+
+ // Update page indices.
+ UpdateIndices(nIndex+1);
+}
+
+bool SlideSorterModel::DeleteSlide (const SdPage* pPage)
+{
+ sal_Int32 nIndex(0);
+
+ // Caution, GetIndex() may be negative since it uses GetPageNumber()-1
+ // for calculation, so do this only when page is inserted, else the
+ // GetPageNumber() will be zero and thus GetIndex() == -1
+ if(pPage->IsInserted())
+ {
+ nIndex = GetIndex(pPage);
+ }
+ else
+ {
+ // if not inserted, search for page
+ for(; nIndex < static_cast<sal_Int32>(maPageDescriptors.size()); nIndex++)
+ {
+ if(maPageDescriptors[nIndex]->GetPage() == pPage)
+ {
+ break;
+ }
+ }
+ }
+
+ bool bMarkedSelected(false);
+
+ if(nIndex >= 0 && o3tl::make_unsigned(nIndex) < maPageDescriptors.size())
+ {
+ if (maPageDescriptors[nIndex])
+ if (maPageDescriptors[nIndex]->GetPage() != pPage)
+ return false;
+
+ auto iter = maPageDescriptors.begin() + nIndex;
+ bMarkedSelected = (*iter)->HasState(PageDescriptor::ST_Selected);
+ maPageDescriptors.erase(iter);
+ UpdateIndices(nIndex);
+
+ collectUIInformation(OUString::number(nIndex + 1), "Delete_Slide_or_Page");
+ }
+ return bMarkedSelected;
+}
+
+void SlideSorterModel::UpdateIndices (const sal_Int32 nFirstIndex)
+{
+ for (sal_Int32 nDescriptorIndex=0,nCount=maPageDescriptors.size();
+ nDescriptorIndex<nCount;
+ ++nDescriptorIndex)
+ {
+ SharedPageDescriptor& rpDescriptor (maPageDescriptors[nDescriptorIndex]);
+ if (rpDescriptor)
+ {
+ if (nDescriptorIndex < nFirstIndex)
+ {
+ if (rpDescriptor->GetPageIndex()!=nDescriptorIndex)
+ {
+ assert(rpDescriptor->GetPageIndex()==nDescriptorIndex);
+ }
+ }
+ else
+ {
+ rpDescriptor->SetPageIndex(nDescriptorIndex);
+ }
+ }
+ }
+}
+
+SdPage* SlideSorterModel::GetPage (const sal_Int32 nSdIndex) const
+{
+ SdDrawDocument* pModel = const_cast<SlideSorterModel*>(this)->GetDocument();
+ if (pModel != nullptr)
+ {
+ if (meEditMode == EditMode::Page)
+ return pModel->GetSdPage (static_cast<sal_uInt16>(nSdIndex), PageKind::Standard);
+ else
+ return pModel->GetMasterSdPage (static_cast<sal_uInt16>(nSdIndex), PageKind::Standard);
+ }
+ else
+ return nullptr;
+}
+
+} // end of namespace ::sd::slidesorter::model
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/model/SlsPageDescriptor.cxx b/sd/source/ui/slidesorter/model/SlsPageDescriptor.cxx
new file mode 100644
index 000000000..5118cf58e
--- /dev/null
+++ b/sd/source/ui/slidesorter/model/SlsPageDescriptor.cxx
@@ -0,0 +1,226 @@
+/* -*- 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 <model/SlsPageDescriptor.hxx>
+
+#include <sdpage.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star;
+
+namespace sd::slidesorter::model {
+
+PageDescriptor::PageDescriptor (
+ const Reference<drawing::XDrawPage>& rxPage,
+ SdPage* pPage,
+ const sal_Int32 nIndex)
+ : mpPage(pPage),
+ mxPage(rxPage),
+ mpMasterPage(nullptr),
+ mnIndex(nIndex),
+ maVisualState(nIndex),
+ mbIsSelected(false),
+ mbWasSelected(false),
+ mbIsVisible(false),
+ mbIsFocused(false),
+ mbIsCurrent(false),
+ mbIsMouseOver(false),
+ mbHasTransition(false)
+{
+ assert(mpPage);
+ assert(mpPage == SdPage::getImplementation(rxPage));
+ if (mpPage != nullptr)
+ {
+ if (mpPage->TRG_HasMasterPage())
+ mpMasterPage = &mpPage->TRG_GetMasterPage();
+ if (mpPage->getTransitionType() > 0)
+ mbHasTransition = true;
+ }
+}
+
+PageDescriptor::~PageDescriptor()
+{
+}
+
+void PageDescriptor::SetPageIndex (const sal_Int32 nNewIndex)
+{
+ mnIndex = nNewIndex;
+ maVisualState.mnPageId = nNewIndex;
+}
+
+bool PageDescriptor::UpdateMasterPage()
+{
+ const SdrPage* pMaster = nullptr;
+ if (mpPage!=nullptr && mpPage->TRG_HasMasterPage())
+ pMaster = &mpPage->TRG_GetMasterPage();
+ if (mpMasterPage != pMaster)
+ {
+ mpMasterPage = pMaster;
+ return true;
+ }
+ else
+ return false;
+}
+
+bool PageDescriptor::UpdateTransitionFlag()
+{
+ bool bHasSlideTransition (false);
+ if (mpPage != nullptr)
+ bHasSlideTransition = mpPage->getTransitionType() > 0;
+ if (bHasSlideTransition != mbHasTransition)
+ {
+ mbHasTransition = bHasSlideTransition;
+ return true;
+ }
+ else
+ return false;
+}
+
+bool PageDescriptor::HasState (const State eState) const
+{
+ switch (eState)
+ {
+ case ST_Visible:
+ return mbIsVisible;
+
+ case ST_Selected:
+ return mbIsSelected;
+
+ case ST_WasSelected:
+ return mbWasSelected;
+
+ case ST_Focused:
+ return mbIsFocused;
+
+ case ST_MouseOver:
+ return mbIsMouseOver;
+
+ case ST_Current:
+ return mbIsCurrent;
+
+ case ST_Excluded:
+ return mpPage!=nullptr && mpPage->IsExcluded();
+
+ default:
+ assert(false);
+ return false;
+ }
+}
+
+bool PageDescriptor::SetState (const State eState, const bool bNewStateValue)
+{
+ bool bModified (false);
+ switch (eState)
+ {
+ case ST_Visible:
+ bModified = (bNewStateValue!=mbIsVisible);
+ if (bModified)
+ mbIsVisible = bNewStateValue;
+ break;
+
+ case ST_Selected:
+ bModified = (bNewStateValue!=mbIsSelected);
+ if (bModified)
+ mbIsSelected = bNewStateValue;
+ break;
+
+ case ST_WasSelected:
+ bModified = (bNewStateValue!=mbWasSelected);
+ if (bModified)
+ mbWasSelected = bNewStateValue;
+ break;
+
+ case ST_Focused:
+ bModified = (bNewStateValue!=mbIsFocused);
+ if (bModified)
+ mbIsFocused = bNewStateValue;
+ break;
+
+ case ST_MouseOver:
+ bModified = (bNewStateValue!=mbIsMouseOver);
+ if (bModified)
+ mbIsMouseOver = bNewStateValue;
+ break;
+
+ case ST_Current:
+ bModified = (bNewStateValue!=mbIsCurrent);
+ if (bModified)
+ mbIsCurrent = bNewStateValue;
+ break;
+
+ case ST_Excluded:
+ // This is a state of the page and has to be handled differently
+ // from the view-only states.
+ if (mpPage != nullptr)
+ if (bNewStateValue != mpPage->IsExcluded())
+ {
+ mpPage->SetExcluded(bNewStateValue);
+ bModified = true;
+ }
+ break;
+ }
+
+ return bModified;
+}
+
+bool PageDescriptor::GetCoreSelection()
+{
+ if (mpPage!=nullptr && mpPage->IsSelected() != mbIsSelected)
+ return SetState(ST_Selected, !mbIsSelected);
+ else
+ return false;
+}
+
+void PageDescriptor::SetCoreSelection()
+{
+ if (mpPage != nullptr)
+ if (HasState(ST_Selected))
+ mpPage->SetSelected(true);
+ else
+ mpPage->SetSelected(false);
+ else
+ {
+ assert(mpPage!=nullptr);
+ }
+}
+
+::tools::Rectangle PageDescriptor::GetBoundingBox() const
+{
+ ::tools::Rectangle aBox (maBoundingBox);
+ const Point aOffset (maVisualState.GetLocationOffset());
+ aBox.Move(aOffset.X(), aOffset.Y());
+ return aBox;
+}
+
+Point PageDescriptor::GetLocation (const bool bIgnoreOffset) const
+{
+ if (bIgnoreOffset)
+ return maBoundingBox.TopLeft();
+ else
+ return maBoundingBox.TopLeft() + maVisualState.GetLocationOffset();
+}
+
+void PageDescriptor::SetBoundingBox (const ::tools::Rectangle& rBoundingBox)
+{
+ maBoundingBox = rBoundingBox;
+}
+
+} // end of namespace ::sd::slidesorter::model
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/model/SlsPageEnumeration.cxx b/sd/source/ui/slidesorter/model/SlsPageEnumeration.cxx
new file mode 100644
index 000000000..a67f057e7
--- /dev/null
+++ b/sd/source/ui/slidesorter/model/SlsPageEnumeration.cxx
@@ -0,0 +1,202 @@
+/* -*- 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 <memory>
+#include <sal/config.h>
+
+#include <utility>
+
+#include <model/SlsPageEnumeration.hxx>
+#include <model/SlideSorterModel.hxx>
+
+using namespace ::sd::slidesorter;
+using namespace ::sd::slidesorter::model;
+
+namespace {
+
+class PageEnumerationImpl
+ : public Enumeration<SharedPageDescriptor>
+{
+public:
+ PageEnumerationImpl (
+ const SlideSorterModel& rModel,
+ const PageEnumeration::PagePredicate& rPredicate);
+ PageEnumerationImpl(const PageEnumerationImpl&) = delete;
+ PageEnumerationImpl& operator=(const PageEnumerationImpl&) = delete;
+ /** Create a copy of the called enumeration object.
+ */
+ virtual ::std::unique_ptr<Enumeration<SharedPageDescriptor> > Clone() override;
+
+ virtual bool HasMoreElements() const override;
+ virtual SharedPageDescriptor GetNextElement() override;
+ virtual void Rewind() override;
+
+private:
+ const SlideSorterModel& mrModel;
+ const PageEnumeration::PagePredicate maPredicate;
+ int mnIndex;
+
+ /** This constructor sets the internal page index to the given value.
+ It does not call AdvanceToNextValidElement() to skip elements that
+ do not fulfill Predicate.
+ */
+ PageEnumerationImpl (
+ const SlideSorterModel& rModel,
+ const PageEnumeration::PagePredicate& rPredicate,
+ int nIndex);
+
+ /** Skip all elements that do not fulfill Predicate starting with the
+ one pointed to by mnIndex.
+ */
+ void AdvanceToNextValidElement();
+};
+
+} // end of anonymous namespace
+
+namespace sd::slidesorter::model {
+
+PageEnumeration PageEnumeration::Create (
+ const SlideSorterModel& rModel,
+ const PagePredicate& rPredicate)
+{
+ return PageEnumeration(::std::unique_ptr<Enumeration<SharedPageDescriptor> >(
+ new PageEnumerationImpl(rModel, rPredicate)));
+}
+
+PageEnumeration::PageEnumeration (
+ ::std::unique_ptr<Enumeration<SharedPageDescriptor> > && pImpl)
+ : mpImpl(std::move(pImpl))
+{
+}
+
+PageEnumeration::PageEnumeration (const PageEnumeration& rEnumeration )
+: sd::slidesorter::model::Enumeration<sd::slidesorter::model::SharedPageDescriptor>()
+{
+ mpImpl = rEnumeration.mpImpl->Clone();
+}
+
+PageEnumeration::~PageEnumeration()
+{
+}
+
+PageEnumeration& PageEnumeration::operator= (
+ const PageEnumeration& rEnumeration)
+{
+ mpImpl = rEnumeration.mpImpl->Clone();
+ return *this;
+}
+
+::std::unique_ptr<Enumeration<SharedPageDescriptor> > PageEnumeration::Clone()
+{
+ return ::std::unique_ptr<Enumeration<SharedPageDescriptor> >(
+ new PageEnumeration (*this));
+}
+
+bool PageEnumeration::HasMoreElements() const
+{
+ return mpImpl->HasMoreElements();
+}
+
+SharedPageDescriptor PageEnumeration::GetNextElement()
+{
+ return mpImpl->GetNextElement();
+}
+
+void PageEnumeration::Rewind()
+{
+ return mpImpl->Rewind();
+}
+
+} // end of namespace ::sd::slidesorter::model
+
+namespace {
+
+PageEnumerationImpl::PageEnumerationImpl (
+ const SlideSorterModel& rModel,
+ const PageEnumeration::PagePredicate& rPredicate)
+ : mrModel(rModel),
+ maPredicate(rPredicate),
+ mnIndex(0)
+{
+ Rewind();
+}
+
+PageEnumerationImpl::PageEnumerationImpl (
+ const SlideSorterModel& rModel,
+ const PageEnumeration::PagePredicate& rPredicate,
+ int nIndex)
+ : mrModel(rModel),
+ maPredicate(rPredicate),
+ mnIndex(nIndex)
+{
+}
+
+::std::unique_ptr<Enumeration<SharedPageDescriptor> >
+ PageEnumerationImpl::Clone()
+{
+ return ::std::unique_ptr<Enumeration<SharedPageDescriptor> >(
+ new PageEnumerationImpl(mrModel,maPredicate,mnIndex));
+}
+
+bool PageEnumerationImpl::HasMoreElements() const
+{
+ return (mnIndex < mrModel.GetPageCount());
+}
+
+SharedPageDescriptor PageEnumerationImpl::GetNextElement()
+{
+ SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(mnIndex));
+
+ // Go to the following valid element.
+ mnIndex += 1;
+ AdvanceToNextValidElement();
+
+ return pDescriptor;
+}
+
+void PageEnumerationImpl::Rewind()
+{
+ // Go to first valid element.
+ mnIndex = 0;
+ AdvanceToNextValidElement();
+}
+
+void PageEnumerationImpl::AdvanceToNextValidElement()
+{
+ while (mnIndex < mrModel.GetPageCount())
+ {
+ SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(mnIndex));
+
+ // Test for the predicate being fulfilled.
+ if (pDescriptor && maPredicate(pDescriptor))
+ {
+ // This predicate is valid.
+ break;
+ }
+ else
+ {
+ // Advance to next predicate.
+ mnIndex += 1;
+ }
+ }
+}
+
+} // end of anonymous namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/model/SlsPageEnumerationProvider.cxx b/sd/source/ui/slidesorter/model/SlsPageEnumerationProvider.cxx
new file mode 100644
index 000000000..800fa12db
--- /dev/null
+++ b/sd/source/ui/slidesorter/model/SlsPageEnumerationProvider.cxx
@@ -0,0 +1,81 @@
+/* -*- 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 <model/SlsPageEnumerationProvider.hxx>
+#include <model/SlsPageEnumeration.hxx>
+#include <model/SlsPageDescriptor.hxx>
+
+namespace sd::slidesorter::model {
+
+namespace {
+
+class AllPagesPredicate
+{
+public:
+ bool operator() (const SharedPageDescriptor&) const
+ {
+ return true;
+ }
+};
+
+class SelectedPagesPredicate
+{
+public:
+ bool operator() (const SharedPageDescriptor& rpDescriptor)
+ {
+ return rpDescriptor->HasState(PageDescriptor::ST_Selected);
+ }
+};
+
+class VisiblePagesPredicate
+{
+public:
+ bool operator() (const SharedPageDescriptor& rpDescriptor)
+ {
+ return rpDescriptor->HasState(PageDescriptor::ST_Visible);
+ }
+};
+
+}
+
+PageEnumeration PageEnumerationProvider::CreateAllPagesEnumeration (
+ const SlideSorterModel& rModel)
+{
+ return PageEnumeration::Create(rModel, AllPagesPredicate());
+}
+
+PageEnumeration PageEnumerationProvider::CreateSelectedPagesEnumeration (
+ const SlideSorterModel& rModel)
+{
+ return PageEnumeration::Create(
+ rModel,
+ SelectedPagesPredicate());
+}
+
+PageEnumeration PageEnumerationProvider::CreateVisiblePagesEnumeration (
+ const SlideSorterModel& rModel)
+{
+ return PageEnumeration::Create(
+ rModel,
+ VisiblePagesPredicate());
+}
+
+} // end of namespace ::sd::slidesorter::model
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/model/SlsVisualState.cxx b/sd/source/ui/slidesorter/model/SlsVisualState.cxx
new file mode 100644
index 000000000..3e16823ff
--- /dev/null
+++ b/sd/source/ui/slidesorter/model/SlsVisualState.cxx
@@ -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/.
+ *
+ * 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 <model/SlsVisualState.hxx>
+
+namespace sd::slidesorter::model
+{
+VisualState::VisualState(const sal_Int32 nPageId)
+ : mnPageId(nPageId)
+ , maLocationOffset(0, 0)
+{
+}
+
+void VisualState::SetLocationOffset(const Point& rOffset)
+{
+ if (maLocationOffset != rOffset)
+ {
+ maLocationOffset = rOffset;
+ }
+}
+
+} // end of namespace ::sd::slidesorter::model
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/shell/SlideSorter.cxx b/sd/source/ui/slidesorter/shell/SlideSorter.cxx
new file mode 100644
index 000000000..550a40469
--- /dev/null
+++ b/sd/source/ui/slidesorter/shell/SlideSorter.cxx
@@ -0,0 +1,456 @@
+/* -*- 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 <SlideSorter.hxx>
+
+#include <com/sun/star/frame/XController.hpp>
+
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsScrollBarManager.hxx>
+#include <controller/SlsProperties.hxx>
+#include <controller/SlsAnimator.hxx>
+#include <o3tl/deleter.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsTheme.hxx>
+#include <model/SlideSorterModel.hxx>
+
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <Window.hxx>
+
+#include <tools/debug.hxx>
+#include <vcl/scrbar.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/settings.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star;
+
+namespace sd::slidesorter {
+
+namespace {
+class ContentWindow : public ::sd::Window
+{
+public:
+ ContentWindow(vcl::Window& rParent, SlideSorter& rSlideSorter);
+
+ void SetCurrentFunction (const rtl::Reference<FuPoor>& rpFunction);
+ virtual void Paint(vcl::RenderContext& /*rRenderContext*/, const ::tools::Rectangle& rRect) override;
+ virtual void KeyInput (const KeyEvent& rEvent) override;
+ virtual void MouseMove (const MouseEvent& rEvent) override;
+ virtual void MouseButtonUp (const MouseEvent& rEvent) override;
+ virtual void MouseButtonDown (const MouseEvent& rEvent) override;
+ virtual void Command (const CommandEvent& rEvent) override;
+ virtual bool EventNotify (NotifyEvent& rEvent) override;
+
+private:
+ SlideSorter& mrSlideSorter;
+ rtl::Reference<FuPoor> mpCurrentFunction;
+};
+}
+
+//===== SlideSorter ===========================================================
+
+std::shared_ptr<SlideSorter> SlideSorter::CreateSlideSorter(
+ ViewShell& rViewShell,
+ sd::Window* pContentWindow,
+ ScrollBar* pHorizontalScrollBar,
+ ScrollBar* pVerticalScrollBar,
+ ScrollBarBox* pScrollBarBox)
+{
+ std::shared_ptr<SlideSorter> pSlideSorter(
+ new SlideSorter(
+ rViewShell,
+ pContentWindow,
+ pHorizontalScrollBar,
+ pVerticalScrollBar,
+ pScrollBarBox),
+ o3tl::default_delete<SlideSorter>());
+ pSlideSorter->Init();
+ return pSlideSorter;
+}
+
+std::shared_ptr<SlideSorter> SlideSorter::CreateSlideSorter (
+ ViewShellBase& rBase,
+ vcl::Window& rParentWindow)
+{
+ std::shared_ptr<SlideSorter> pSlideSorter(
+ new SlideSorter(
+ rBase,
+ rParentWindow),
+ o3tl::default_delete<SlideSorter>());
+ pSlideSorter->Init();
+ return pSlideSorter;
+}
+
+SlideSorter::SlideSorter (
+ ViewShell& rViewShell,
+ sd::Window* pContentWindow,
+ ScrollBar* pHorizontalScrollBar,
+ ScrollBar* pVerticalScrollBar,
+ ScrollBarBox* pScrollBarBox)
+ : mbIsValid(false),
+ mpViewShell(&rViewShell),
+ mpViewShellBase(&rViewShell.GetViewShellBase()),
+ mpContentWindow(pContentWindow),
+ mpHorizontalScrollBar(pHorizontalScrollBar),
+ mpVerticalScrollBar(pVerticalScrollBar),
+ mpScrollBarBox(pScrollBarBox),
+ mpProperties(std::make_shared<controller::Properties>()),
+ mpTheme(std::make_shared<view::Theme>(mpProperties))
+{
+}
+
+SlideSorter::SlideSorter (
+ ViewShellBase& rBase,
+ vcl::Window& rParentWindow)
+ : mbIsValid(false),
+ mpViewShell(nullptr),
+ mpViewShellBase(&rBase),
+ mpContentWindow(VclPtr<ContentWindow>::Create(rParentWindow,*this )),
+ mpHorizontalScrollBar(VclPtr<ScrollBar>::Create(&rParentWindow,WinBits(WB_HSCROLL | WB_DRAG))),
+ mpVerticalScrollBar(VclPtr<ScrollBar>::Create(&rParentWindow,WinBits(WB_VSCROLL | WB_DRAG))),
+ mpScrollBarBox(VclPtr<ScrollBarBox>::Create(&rParentWindow)),
+ mpProperties(std::make_shared<controller::Properties>()),
+ mpTheme(std::make_shared<view::Theme>(mpProperties))
+{
+}
+
+void SlideSorter::Init()
+{
+ if (mpViewShellBase != nullptr)
+ mxControllerWeak = mpViewShellBase->GetController();
+
+ // Reinitialize colors in Properties with window specific values.
+ if (mpContentWindow)
+ {
+ mpProperties->SetBackgroundColor(
+ mpContentWindow->GetSettings().GetStyleSettings().GetWindowColor());
+ mpProperties->SetTextColor(
+ mpContentWindow->GetSettings().GetStyleSettings().GetWindowTextColor());
+ mpProperties->SetSelectionColor(
+ mpContentWindow->GetSettings().GetStyleSettings().GetMenuHighlightColor());
+ mpProperties->SetHighlightColor(
+ mpContentWindow->GetSettings().GetStyleSettings().GetMenuHighlightColor());
+ }
+
+ CreateModelViewController ();
+
+ SetupListeners ();
+
+ // Initialize the window.
+ sd::Window *pContentWindow = GetContentWindow().get();
+ if (!pContentWindow)
+ return;
+
+ vcl::Window* pParentWindow = pContentWindow->GetParent();
+ if (pParentWindow != nullptr)
+ pParentWindow->SetBackground(Wallpaper());
+ pContentWindow->SetBackground(Wallpaper());
+ pContentWindow->SetViewOrigin (Point(0,0));
+ // We do our own scrolling while dragging a page selection.
+ pContentWindow->SetUseDropScroll (false);
+ // Change the winbits so that the active window accepts the focus.
+ pContentWindow->SetStyle ((pContentWindow->GetStyle() & ~WB_DIALOGCONTROL) | WB_TABSTOP);
+ pContentWindow->Hide();
+
+ // Set view pointer of base class.
+ SetupControls();
+
+ mbIsValid = true;
+}
+
+SlideSorter::~SlideSorter()
+{
+ mbIsValid = false;
+
+ ReleaseListeners();
+
+ // Dispose model, view and controller to avoid calls between them when
+ // they are being destructed and one or two of them are already gone.
+ mpSlideSorterController->Dispose();
+ mpSlideSorterView->Dispose();
+ mpSlideSorterModel->Dispose();
+
+ // Reset the auto pointers explicitly to control the order of destruction.
+ mpSlideSorterController.reset();
+ mpSlideSorterView.reset();
+ mpSlideSorterModel.reset();
+
+ mpHorizontalScrollBar.reset();
+ mpVerticalScrollBar.reset();
+ mpScrollBarBox.reset();
+}
+
+model::SlideSorterModel& SlideSorter::GetModel() const
+{
+ assert(mpSlideSorterModel);
+ return *mpSlideSorterModel;
+}
+
+view::SlideSorterView& SlideSorter::GetView() const
+{
+ assert(mpSlideSorterView);
+ return *mpSlideSorterView;
+}
+
+controller::SlideSorterController& SlideSorter::GetController() const
+{
+ assert(mpSlideSorterController);
+ return *mpSlideSorterController;
+}
+
+Reference<frame::XController> SlideSorter::GetXController() const
+{
+ Reference<frame::XController> xController(mxControllerWeak);
+ return xController;
+}
+
+void SlideSorter::Paint (const ::tools::Rectangle& rRepaintArea)
+{
+ GetController().Paint(
+ rRepaintArea,
+ GetContentWindow());
+}
+
+void SlideSorter::SetupControls()
+{
+ GetVerticalScrollBar()->Show();
+}
+
+void SlideSorter::SetupListeners()
+{
+ sd::Window *pWindow = GetContentWindow().get();
+ if (pWindow)
+ {
+ vcl::Window* pParentWindow = pWindow->GetParent();
+ if (pParentWindow != nullptr)
+ pParentWindow->AddEventListener(
+ LINK(
+ mpSlideSorterController.get(),
+ controller::SlideSorterController,
+ WindowEventHandler));
+ pWindow->AddEventListener(
+ LINK(
+ mpSlideSorterController.get(),
+ controller::SlideSorterController,
+ WindowEventHandler));
+ }
+ Application::AddEventListener(
+ LINK(
+ mpSlideSorterController.get(),
+ controller::SlideSorterController,
+ ApplicationEventHandler));
+
+ mpSlideSorterController->GetScrollBarManager().Connect();
+}
+
+void SlideSorter::ReleaseListeners()
+{
+ mpSlideSorterController->GetScrollBarManager().Disconnect();
+
+ sd::Window *pWindow (GetContentWindow().get());
+ if (pWindow)
+ {
+ pWindow->RemoveEventListener(
+ LINK(mpSlideSorterController.get(),
+ controller::SlideSorterController,
+ WindowEventHandler));
+
+ vcl::Window* pParentWindow = pWindow->GetParent();
+ if (pParentWindow != nullptr)
+ pParentWindow->RemoveEventListener(
+ LINK(mpSlideSorterController.get(),
+ controller::SlideSorterController,
+ WindowEventHandler));
+ }
+ Application::RemoveEventListener(
+ LINK(mpSlideSorterController.get(),
+ controller::SlideSorterController,
+ ApplicationEventHandler));
+}
+
+void SlideSorter::CreateModelViewController()
+{
+ mpSlideSorterModel.reset(CreateModel());
+ DBG_ASSERT(mpSlideSorterModel != nullptr, "Can not create model for slide browser");
+
+ mpSlideSorterView.reset(new view::SlideSorterView (*this));
+ mpSlideSorterController.reset(new controller::SlideSorterController(*this));
+
+ // Now that model, view, and controller are constructed, do the
+ // initialization that relies on all three being in place.
+ mpSlideSorterController->Init();
+ mpSlideSorterView->Init();
+}
+
+model::SlideSorterModel* SlideSorter::CreateModel()
+{
+ // Get pointers to the document.
+ ViewShellBase* pViewShellBase = GetViewShellBase();
+ if (pViewShellBase != nullptr)
+ {
+ assert (pViewShellBase->GetDocument() != nullptr);
+
+ return new model::SlideSorterModel(*this);
+ }
+ else
+ return nullptr;
+}
+
+void SlideSorter::ArrangeGUIElements (
+ const Point& rOffset,
+ const Size& rSize)
+{
+ Point aOrigin (rOffset);
+
+ if (rSize.Width()>0
+ && rSize.Height()>0
+ && GetContentWindow()
+ && GetContentWindow()->IsVisible())
+ {
+ // Prevent untimely redraws while the view is not yet correctly
+ // resized.
+ view::SlideSorterView::DrawLock aLock (*this);
+ GetContentWindow()->EnablePaint (false);
+
+ mpSlideSorterController->Resize (::tools::Rectangle(aOrigin, rSize));
+
+ GetContentWindow()->EnablePaint (true);
+ }
+}
+
+void SlideSorter::RelocateToWindow (vcl::Window* pParentWindow)
+{
+ // Stop all animations for they have been started for the old window.
+ mpSlideSorterController->GetAnimator()->RemoveAllAnimations();
+
+ ReleaseListeners();
+
+ if (mpViewShell)
+ {
+ mpViewShell->ViewShell::RelocateToParentWindow(pParentWindow);
+ }
+
+ SetupControls();
+ SetupListeners();
+
+ // For accessibility we have to shortly hide the content window. This
+ // triggers the construction of a new accessibility object for the new
+ // view shell. (One is created earlier while the constructor of the base
+ // class is executed. But because at that time the correct
+ // accessibility object can not be constructed we do that now.)
+ if (mpContentWindow)
+ {
+ mpContentWindow->Hide();
+ mpContentWindow->Show();
+ }
+}
+
+void SlideSorter::SetCurrentFunction (const rtl::Reference<FuPoor>& rpFunction)
+{
+ if (GetViewShell() != nullptr)
+ {
+ GetViewShell()->SetCurrentFunction(rpFunction);
+ GetViewShell()->SetOldFunction(rpFunction);
+ }
+ else
+ {
+ ContentWindow* pWindow = dynamic_cast<ContentWindow*>(GetContentWindow().get());
+ if (pWindow != nullptr)
+ pWindow->SetCurrentFunction(rpFunction);
+ }
+}
+
+std::shared_ptr<controller::Properties> const & SlideSorter::GetProperties() const
+{
+ assert(mpProperties);
+ return mpProperties;
+}
+
+std::shared_ptr<view::Theme> const & SlideSorter::GetTheme() const
+{
+ assert(mpTheme);
+ return mpTheme;
+}
+
+//===== ContentWindow =========================================================
+
+namespace {
+
+ContentWindow::ContentWindow(
+ vcl::Window& rParent,
+ SlideSorter& rSlideSorter)
+ : ::sd::Window(&rParent),
+ mrSlideSorter(rSlideSorter)
+{
+ SetDialogControlFlags(GetDialogControlFlags() & ~DialogControlFlags::WantFocus);
+ SetStyle(GetStyle() | WB_NOPOINTERFOCUS);
+}
+
+void ContentWindow::SetCurrentFunction (const rtl::Reference<FuPoor>& rpFunction)
+{
+ mpCurrentFunction = rpFunction;
+}
+
+void ContentWindow::Paint (vcl::RenderContext& /*rRenderContext*/, const ::tools::Rectangle& rRect)
+{
+ mrSlideSorter.Paint(rRect);
+}
+
+void ContentWindow::KeyInput (const KeyEvent& rEvent)
+{
+ if (mpCurrentFunction.is())
+ mpCurrentFunction->KeyInput(rEvent);
+}
+
+void ContentWindow::MouseMove (const MouseEvent& rEvent)
+{
+ if (mpCurrentFunction.is())
+ mpCurrentFunction->MouseMove(rEvent);
+}
+
+void ContentWindow::MouseButtonUp(const MouseEvent& rEvent)
+{
+ if (mpCurrentFunction.is())
+ mpCurrentFunction->MouseButtonUp(rEvent);
+}
+
+void ContentWindow::MouseButtonDown(const MouseEvent& rEvent)
+{
+ if (mpCurrentFunction.is())
+ mpCurrentFunction->MouseButtonDown(rEvent);
+}
+
+void ContentWindow::Command(const CommandEvent& rEvent)
+{
+ if (mpCurrentFunction.is())
+ mpCurrentFunction->Command(rEvent);
+}
+
+bool ContentWindow::EventNotify(NotifyEvent&)
+{
+ return false;
+}
+
+} // end of anonymous namespace
+
+} // end of namespace ::sd::slidesorter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/shell/SlideSorterService.cxx b/sd/source/ui/slidesorter/shell/SlideSorterService.cxx
new file mode 100644
index 000000000..a086f3b9e
--- /dev/null
+++ b/sd/source/ui/slidesorter/shell/SlideSorterService.cxx
@@ -0,0 +1,412 @@
+/* -*- 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 "SlideSorterService.hxx"
+#include <SlideSorter.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsProperties.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsLayouter.hxx>
+#include <DrawController.hxx>
+
+#include <comphelper/servicehelper.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+using ::sd::slidesorter::view::Layouter;
+
+namespace sd::slidesorter {
+
+//===== SlideSorterService ==========================================================
+
+SlideSorterService::SlideSorterService()
+{
+}
+
+SlideSorterService::~SlideSorterService()
+{
+}
+
+void SlideSorterService::disposing(std::unique_lock<std::mutex>&)
+{
+ mpSlideSorter.reset();
+
+ if (mxParentWindow.is())
+ {
+ mxParentWindow->removeWindowListener(this);
+ }
+}
+
+//----- XInitialization -------------------------------------------------------
+
+void SAL_CALL SlideSorterService::initialize (const Sequence<Any>& rArguments)
+{
+ ThrowIfDisposed();
+
+ if (rArguments.getLength() != 3)
+ {
+ throw RuntimeException("SlideSorterService: invalid number of arguments",
+ static_cast<drawing::XDrawView*>(this));
+ }
+
+ mxViewId.set(rArguments[0], UNO_QUERY_THROW);
+
+ // Get the XController.
+ Reference<frame::XController> xController (rArguments[1], UNO_QUERY_THROW);
+
+ // Tunnel through the controller to obtain a ViewShellBase.
+ ViewShellBase* pBase = nullptr;
+ Reference<lang::XUnoTunnel> xTunnel (xController, UNO_QUERY_THROW);
+ ::sd::DrawController* pController = comphelper::getFromUnoTunnel<sd::DrawController>(xTunnel);
+ if (pController != nullptr)
+ pBase = pController->GetViewShellBase();
+
+ // Get the parent window.
+ mxParentWindow.set(rArguments[2], UNO_QUERY_THROW);
+ VclPtr<vcl::Window> pParentWindow = VCLUnoHelper::GetWindow(mxParentWindow);
+
+ mxParentWindow->addWindowListener(this);
+
+ if (pBase != nullptr && pParentWindow)
+ mpSlideSorter = SlideSorter::CreateSlideSorter(
+ *pBase,
+ *pParentWindow);
+
+ Resize();
+}
+
+//----- XView -----------------------------------------------------------------
+
+Reference<XResourceId> SAL_CALL SlideSorterService::getResourceId()
+{
+ return mxViewId;
+}
+
+sal_Bool SAL_CALL SlideSorterService::isAnchorOnly()
+{
+ return false;
+}
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL SlideSorterService::windowResized (const awt::WindowEvent&)
+{
+ ThrowIfDisposed();
+
+ Resize();
+}
+
+void SAL_CALL SlideSorterService::windowMoved (const awt::WindowEvent&) {}
+
+void SAL_CALL SlideSorterService::windowShown (const lang::EventObject&)
+{
+ ThrowIfDisposed();
+ Resize();
+}
+
+void SAL_CALL SlideSorterService::windowHidden (const lang::EventObject&)
+{
+ ThrowIfDisposed();
+}
+
+//----- lang::XEventListener --------------------------------------------------
+
+void SAL_CALL SlideSorterService::disposing (const lang::EventObject& rEvent)
+{
+ if (rEvent.Source == mxParentWindow)
+ mxParentWindow = nullptr;
+}
+
+//----- XDrawView -------------------------------------------------------------
+
+void SAL_CALL SlideSorterService::setCurrentPage(const Reference<drawing::XDrawPage>& rxSlide)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr)
+ mpSlideSorter->GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(
+ mpSlideSorter->GetModel().GetIndex(rxSlide));
+}
+
+Reference<drawing::XDrawPage> SAL_CALL SlideSorterService::getCurrentPage()
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr)
+ return mpSlideSorter->GetController().GetCurrentSlideManager()->GetCurrentSlide()->GetXDrawPage();
+ else
+ return nullptr;
+}
+
+//----- attributes ------------------------------------------------------------
+
+Reference<container::XIndexAccess> SAL_CALL SlideSorterService::getDocumentSlides()
+{
+ return mpSlideSorter->GetModel().GetDocumentSlides();
+}
+
+void SAL_CALL SlideSorterService::setDocumentSlides (
+ const Reference<container::XIndexAccess >& rxSlides)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr && mpSlideSorter->IsValid())
+ mpSlideSorter->GetController().SetDocumentSlides(rxSlides);
+}
+
+sal_Bool SAL_CALL SlideSorterService::getIsHighlightCurrentSlide()
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter == nullptr || !mpSlideSorter->IsValid())
+ return false;
+ else
+ return mpSlideSorter->GetProperties()->IsHighlightCurrentSlide();
+}
+
+void SAL_CALL SlideSorterService::setIsHighlightCurrentSlide (sal_Bool bValue)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr && mpSlideSorter->IsValid())
+ {
+ mpSlideSorter->GetProperties()->SetHighlightCurrentSlide(bValue);
+ controller::SlideSorterController::ModelChangeLock aLock (mpSlideSorter->GetController());
+ mpSlideSorter->GetController().HandleModelChange();
+ }
+}
+
+sal_Bool SAL_CALL SlideSorterService::getIsShowSelection()
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter == nullptr || !mpSlideSorter->IsValid())
+ return false;
+ else
+ return mpSlideSorter->GetProperties()->IsShowSelection();
+}
+
+void SAL_CALL SlideSorterService::setIsShowSelection (sal_Bool bValue)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr && mpSlideSorter->IsValid())
+ mpSlideSorter->GetProperties()->SetShowSelection(bValue);
+}
+
+sal_Bool SAL_CALL SlideSorterService::getIsShowFocus()
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter == nullptr || !mpSlideSorter->IsValid())
+ return false;
+ else
+ return mpSlideSorter->GetProperties()->IsShowFocus();
+}
+
+void SAL_CALL SlideSorterService::setIsShowFocus (sal_Bool bValue)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr && mpSlideSorter->IsValid())
+ mpSlideSorter->GetProperties()->SetShowFocus(bValue);
+}
+
+sal_Bool SAL_CALL SlideSorterService::getIsCenterSelection()
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter == nullptr || !mpSlideSorter->IsValid())
+ return false;
+ else
+ return mpSlideSorter->GetProperties()->IsCenterSelection();
+}
+
+void SAL_CALL SlideSorterService::setIsCenterSelection (sal_Bool bValue)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr && mpSlideSorter->IsValid())
+ mpSlideSorter->GetProperties()->SetCenterSelection(bValue);
+}
+
+sal_Bool SAL_CALL SlideSorterService::getIsSuspendPreviewUpdatesDuringFullScreenPresentation()
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter == nullptr || !mpSlideSorter->IsValid())
+ return true;
+ else
+ return mpSlideSorter->GetProperties()
+ ->IsSuspendPreviewUpdatesDuringFullScreenPresentation();
+}
+
+void SAL_CALL SlideSorterService::setIsSuspendPreviewUpdatesDuringFullScreenPresentation (
+ sal_Bool bValue)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr && mpSlideSorter->IsValid())
+ mpSlideSorter->GetProperties()
+ ->SetSuspendPreviewUpdatesDuringFullScreenPresentation(bValue);
+}
+
+sal_Bool SAL_CALL SlideSorterService::getIsOrientationVertical()
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter == nullptr || !mpSlideSorter->IsValid())
+ return true;
+ else
+ return mpSlideSorter->GetView().GetOrientation() != Layouter::HORIZONTAL;
+}
+
+void SAL_CALL SlideSorterService::setIsOrientationVertical (sal_Bool bValue)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr && mpSlideSorter->IsValid())
+ mpSlideSorter->GetView().SetOrientation(bValue
+ ? Layouter::GRID
+ : Layouter::HORIZONTAL);
+}
+
+sal_Bool SAL_CALL SlideSorterService::getIsSmoothScrolling()
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter == nullptr || !mpSlideSorter->IsValid())
+ return false;
+ else
+ return mpSlideSorter->GetProperties()->IsSmoothSelectionScrolling();
+}
+
+void SAL_CALL SlideSorterService::setIsSmoothScrolling (sal_Bool bValue)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr && mpSlideSorter->IsValid())
+ mpSlideSorter->GetProperties()->SetSmoothSelectionScrolling(bValue);
+}
+
+sal_Int32 SAL_CALL SlideSorterService::getBackgroundColor()
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter == nullptr || !mpSlideSorter->IsValid())
+ return util::Color();
+ else
+ return util::Color(
+ mpSlideSorter->GetProperties()->GetBackgroundColor());
+}
+
+void SAL_CALL SlideSorterService::setBackgroundColor (sal_Int32 aBackgroundColor)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr && mpSlideSorter->IsValid())
+ mpSlideSorter->GetProperties()->SetBackgroundColor(Color(ColorTransparency, aBackgroundColor));
+}
+
+sal_Int32 SAL_CALL SlideSorterService::getTextColor()
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter == nullptr || !mpSlideSorter->IsValid())
+ return util::Color();
+ else
+ return util::Color(
+ mpSlideSorter->GetProperties()->GetTextColor());
+}
+
+void SAL_CALL SlideSorterService::setTextColor (sal_Int32 aTextColor)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr && mpSlideSorter->IsValid())
+ mpSlideSorter->GetProperties()->SetTextColor(Color(ColorTransparency, aTextColor));
+}
+
+sal_Int32 SAL_CALL SlideSorterService::getSelectionColor()
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter == nullptr || !mpSlideSorter->IsValid())
+ return util::Color();
+ else
+ return util::Color(
+ mpSlideSorter->GetProperties()->GetSelectionColor());
+}
+
+void SAL_CALL SlideSorterService::setSelectionColor (sal_Int32 aSelectionColor)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr && mpSlideSorter->IsValid())
+ mpSlideSorter->GetProperties()->SetSelectionColor(Color(ColorTransparency, aSelectionColor));
+}
+
+sal_Int32 SAL_CALL SlideSorterService::getHighlightColor()
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter == nullptr || !mpSlideSorter->IsValid())
+ return util::Color();
+ else
+ return util::Color(
+ mpSlideSorter->GetProperties()->GetHighlightColor());
+}
+
+void SAL_CALL SlideSorterService::setHighlightColor (sal_Int32 aHighlightColor)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr && mpSlideSorter->IsValid())
+ mpSlideSorter->GetProperties()->SetHighlightColor(Color(ColorTransparency, aHighlightColor));
+}
+
+sal_Bool SAL_CALL SlideSorterService::getIsUIReadOnly()
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter == nullptr || !mpSlideSorter->IsValid())
+ return true;
+ else
+ return mpSlideSorter->GetProperties()->IsUIReadOnly();
+}
+
+void SAL_CALL SlideSorterService::setIsUIReadOnly (sal_Bool bIsUIReadOnly)
+{
+ ThrowIfDisposed();
+ if (mpSlideSorter != nullptr && mpSlideSorter->IsValid())
+ mpSlideSorter->GetProperties()->SetUIReadOnly(bIsUIReadOnly);
+}
+
+void SlideSorterService::Resize()
+{
+ if (mxParentWindow.is())
+ {
+ awt::Rectangle aWindowBox = mxParentWindow->getPosSize();
+ mpSlideSorter->ArrangeGUIElements(
+ Point(0,0),
+ Size(aWindowBox.Width, aWindowBox.Height));
+ }
+}
+
+void SlideSorterService::ThrowIfDisposed()
+{
+ if (SlideSorterServiceInterfaceBase::m_bDisposed)
+ {
+ throw lang::DisposedException ("SlideSorterService object has already been disposed",
+ static_cast<drawing::XDrawView*>(this));
+ }
+}
+
+} // end of namespace ::sd::slidesorter
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_SlideSorter_get_implementation(css::uno::XComponentContext* /*context*/,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::slidesorter::SlideSorterService);
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/shell/SlideSorterService.hxx b/sd/source/ui/slidesorter/shell/SlideSorterService.hxx
new file mode 100644
index 000000000..579a5bae5
--- /dev/null
+++ b/sd/source/ui/slidesorter/shell/SlideSorterService.hxx
@@ -0,0 +1,153 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/drawing/XSlideSorterBase.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <comphelper/compbase.hxx>
+#include <memory>
+
+namespace com::sun::star::awt { class XWindow; }
+
+namespace sd::slidesorter {
+
+typedef comphelper::WeakComponentImplHelper <
+ css::drawing::XSlideSorterBase,
+ css::lang::XInitialization,
+ css::awt::XWindowListener
+> SlideSorterServiceInterfaceBase;
+
+class SlideSorter;
+
+/** Implementation of the com.sun.star.drawing.SlideSorter service.
+*/
+class SlideSorterService
+ : public SlideSorterServiceInterfaceBase
+{
+public:
+ explicit SlideSorterService();
+ virtual ~SlideSorterService() override;
+ SlideSorterService(const SlideSorterService&) = delete;
+ SlideSorterService& operator=(const SlideSorterService&) = delete;
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+ // XInitialization
+
+ virtual void SAL_CALL initialize (const css::uno::Sequence<css::uno::Any>& rArguments) override;
+
+ // XResourceId
+
+ css::uno::Reference<css::drawing::framework::XResourceId> SAL_CALL getResourceId() override;
+
+ sal_Bool SAL_CALL isAnchorOnly() override;
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override;
+
+ // lang::XEventListener
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+
+ // XDrawView
+
+ virtual void SAL_CALL setCurrentPage(
+ const css::uno::Reference<css::drawing::XDrawPage>& rxSlide) override;
+
+ virtual css::uno::Reference<css::drawing::XDrawPage> SAL_CALL getCurrentPage() override;
+
+ // Attributes
+
+ virtual css::uno::Reference<css::container::XIndexAccess> SAL_CALL getDocumentSlides() override;
+
+ virtual void SAL_CALL setDocumentSlides (
+ const css::uno::Reference<css::container::XIndexAccess >& rxSlides) override;
+
+ virtual sal_Bool SAL_CALL getIsHighlightCurrentSlide() override;
+
+ virtual void SAL_CALL setIsHighlightCurrentSlide (sal_Bool bIsHighlightCurrentSlide) override;
+
+ virtual sal_Bool SAL_CALL getIsShowSelection() override;
+
+ virtual void SAL_CALL setIsShowSelection (sal_Bool bIsShowSelection) override;
+
+ virtual sal_Bool SAL_CALL getIsCenterSelection() override;
+
+ virtual void SAL_CALL setIsCenterSelection (sal_Bool bIsCenterSelection) override;
+
+ virtual sal_Bool SAL_CALL getIsSuspendPreviewUpdatesDuringFullScreenPresentation() override;
+
+ virtual void SAL_CALL setIsSuspendPreviewUpdatesDuringFullScreenPresentation (
+ sal_Bool bIsSuspendPreviewUpdatesDuringFullScreenPresentation) override;
+
+ virtual sal_Bool SAL_CALL getIsOrientationVertical() override;
+
+ virtual void SAL_CALL setIsOrientationVertical (sal_Bool bIsOrientationVertical) override;
+
+ virtual sal_Bool SAL_CALL getIsSmoothScrolling() override;
+
+ virtual void SAL_CALL setIsSmoothScrolling (sal_Bool bIsOrientationVertical) override;
+
+ virtual sal_Int32 SAL_CALL getBackgroundColor() override;
+
+ virtual void SAL_CALL setBackgroundColor (sal_Int32 aBackgroundColor) override;
+
+ virtual sal_Int32 SAL_CALL getTextColor() override;
+
+ virtual void SAL_CALL setTextColor (sal_Int32 aTextColor) override;
+
+ virtual sal_Int32 SAL_CALL getSelectionColor() override;
+
+ virtual void SAL_CALL setSelectionColor (sal_Int32 aSelectionColor) override;
+
+ virtual sal_Int32 SAL_CALL getHighlightColor() override;
+
+ virtual void SAL_CALL setHighlightColor (sal_Int32 aHighlightColor) override;
+
+ virtual sal_Bool SAL_CALL getIsUIReadOnly() override;
+
+ virtual void SAL_CALL setIsUIReadOnly (sal_Bool bIsUIReadOnly) override;
+
+ virtual sal_Bool SAL_CALL getIsShowFocus() override;
+
+ virtual void SAL_CALL setIsShowFocus (sal_Bool bIsShowFocus) override;
+
+private:
+ std::shared_ptr<SlideSorter> mpSlideSorter;
+ css::uno::Reference<css::drawing::framework::XResourceId> mxViewId;
+ css::uno::Reference<css::awt::XWindow> mxParentWindow;
+
+ void Resize();
+
+ /** @throws css::lang::DisposedException when the object has already been
+ disposed.
+ */
+ void ThrowIfDisposed();
+};
+
+} // end of namespace ::sd::slidesorter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx b/sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx
new file mode 100644
index 000000000..af5bd5791
--- /dev/null
+++ b/sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx
@@ -0,0 +1,924 @@
+#/* -*- 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 <SlideSorterViewShell.hxx>
+#include <ViewShellImplementation.hxx>
+
+#include <SlideSorter.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsClipboard.hxx>
+#include <controller/SlsScrollBarManager.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsSlotManager.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <controller/SlsSelectionManager.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsLayouter.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <ViewShellBase.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <app.hrc>
+#include <AccessibleSlideSorterView.hxx>
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <FrameView.hxx>
+#include <SdUnoSlideView.hxx>
+#include <ViewShellManager.hxx>
+#include <Window.hxx>
+#include <drawview.hxx>
+#include <sfx2/msg.hxx>
+#include <sfx2/objface.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/sidebar/SidebarChildWindow.hxx>
+#include <sfx2/devtools/DevelopmentToolChildWindow.hxx>
+#include <svx/svxids.hrc>
+#include <vcl/EnumContext.hxx>
+#include <svx/sidebar/ContextChangeEventMultiplexer.hxx>
+#include <tools/diagnose_ex.h>
+#include <sfx2/sidebar/SidebarController.hxx>
+
+using namespace ::sd::slidesorter;
+#define ShellClass_SlideSorterViewShell
+#include <sdslots.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+using ::sd::framework::FrameworkHelper;
+using ::vcl::EnumContext;
+using namespace sfx2::sidebar;
+
+namespace sd::slidesorter {
+
+namespace {
+
+bool inChartContext(const sd::View* pView)
+{
+ if (!pView)
+ return false;
+
+ SfxViewShell* pViewShell = pView->GetSfxViewShell();
+ SidebarController* pSidebar = SidebarController::GetSidebarControllerForView(pViewShell);
+ if (pSidebar)
+ return pSidebar->hasChartContextCurrently();
+
+ return false;
+}
+
+} // anonymous namespace
+
+
+SFX_IMPL_INTERFACE(SlideSorterViewShell, SfxShell)
+
+void SlideSorterViewShell::InitInterface_Impl()
+{
+ GetStaticInterface()->RegisterChildWindow(::sfx2::sidebar::SidebarChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(DevelopmentToolChildWindow::GetChildWindowId());
+}
+
+
+std::shared_ptr<SlideSorterViewShell> SlideSorterViewShell::Create (
+ SfxViewFrame* pFrame,
+ ViewShellBase& rViewShellBase,
+ vcl::Window* pParentWindow,
+ FrameView* pFrameViewArgument)
+{
+ std::shared_ptr<SlideSorterViewShell> pViewShell;
+ try
+ {
+ pViewShell.reset(
+ new SlideSorterViewShell(pFrame,rViewShellBase,pParentWindow,pFrameViewArgument));
+ pViewShell->Initialize();
+ if (pViewShell->mpSlideSorter == nullptr)
+ pViewShell.reset();
+ }
+ catch(Exception&)
+ {
+ pViewShell.reset();
+ }
+ return pViewShell;
+}
+
+SlideSorterViewShell::SlideSorterViewShell (
+ SfxViewFrame* /*pFrame*/,
+ ViewShellBase& rViewShellBase,
+ vcl::Window* pParentWindow,
+ FrameView* pFrameViewArgument)
+ : ViewShell (pParentWindow, rViewShellBase),
+ mbIsArrangeGUIElementsPending(true)
+{
+ GetContentWindow()->set_id("slidesorter");
+ meShellType = ST_SLIDE_SORTER;
+
+ if (pFrameViewArgument != nullptr)
+ mpFrameView = pFrameViewArgument;
+ else
+ mpFrameView = new FrameView(GetDoc());
+ GetFrameView()->Connect();
+
+ SetName ("SlideSorterViewShell");
+
+ pParentWindow->SetStyle(pParentWindow->GetStyle() | WB_DIALOGCONTROL);
+}
+
+SlideSorterViewShell::~SlideSorterViewShell()
+{
+ DisposeFunctions();
+
+ try
+ {
+ ::sd::Window* pWindow = GetActiveWindow();
+ if (pWindow!=nullptr)
+ {
+ css::uno::Reference<css::lang::XComponent> xComponent (
+ pWindow->GetAccessible(false),
+ css::uno::UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ }
+ catch( css::uno::Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SlideSorterViewShell::~SlideSorterViewShell()" );
+ }
+ GetFrameView()->Disconnect();
+}
+
+void SlideSorterViewShell::Initialize()
+{
+ mpSlideSorter = SlideSorter::CreateSlideSorter(
+ *this,
+ mpContentWindow,
+ mpHorizontalScrollBar,
+ mpVerticalScrollBar,
+ mpScrollBarBox);
+ mpView = &mpSlideSorter->GetView();
+
+ doShow();
+
+ SetPool( &GetDoc()->GetPool() );
+ SetUndoManager( GetDoc()->GetDocSh()->GetUndoManager() );
+
+ // For accessibility we have to shortly hide the content window.
+ // This triggers the construction of a new accessibility object for
+ // the new view shell. (One is created earlier while the constructor
+ // of the base class is executed. At that time the correct
+ // accessibility object can not be constructed.)
+ sd::Window *pWindow (mpSlideSorter->GetContentWindow().get());
+ if (pWindow)
+ {
+ pWindow->Hide();
+ pWindow->Show();
+ }
+}
+
+void SlideSorterViewShell::Init (bool bIsMainViewShell)
+{
+ ViewShell::Init(bIsMainViewShell);
+
+ // since the updatePageList will show focus, the window.show() must be called ahead. This show is deferred from Init()
+ ::sd::Window* pActiveWindow = GetActiveWindow();
+ if (pActiveWindow)
+ pActiveWindow->Show();
+ mpSlideSorter->GetModel().UpdatePageList();
+
+ if (mpContentWindow)
+ mpContentWindow->SetViewShell(this);
+}
+
+SlideSorterViewShell* SlideSorterViewShell::GetSlideSorter (ViewShellBase& rBase)
+{
+ SlideSorterViewShell* pViewShell = nullptr;
+
+ // Test the center and left pane for showing a slide sorter.
+ OUString aPaneURLs[] = {
+ FrameworkHelper::msCenterPaneURL,
+ FrameworkHelper::msFullScreenPaneURL,
+ FrameworkHelper::msLeftImpressPaneURL,
+ FrameworkHelper::msLeftDrawPaneURL,
+ OUString()};
+
+ try
+ {
+ std::shared_ptr<FrameworkHelper> pFrameworkHelper (FrameworkHelper::Instance(rBase));
+ if (pFrameworkHelper->IsValid())
+ for (int i=0; pViewShell==nullptr && !aPaneURLs[i].isEmpty(); ++i)
+ {
+ pViewShell = dynamic_cast<SlideSorterViewShell*>(
+ pFrameworkHelper->GetViewShell(aPaneURLs[i]).get());
+ }
+ }
+ catch (RuntimeException&)
+ {}
+
+ return pViewShell;
+}
+
+Reference<drawing::XDrawSubController> SlideSorterViewShell::CreateSubController()
+{
+ Reference<drawing::XDrawSubController> xSubController;
+
+ if (IsMainViewShell())
+ {
+ // Create uno controller for the main view shell.
+ xSubController.set( new SdUnoSlideView( *mpSlideSorter));
+ }
+
+ return xSubController;
+}
+
+/** If there is a valid controller then create a new instance of
+ <type>AccessibleSlideSorterView</type>. Otherwise delegate this call
+ to the base class to return a default object (probably an empty
+ reference).
+*/
+css::uno::Reference<css::accessibility::XAccessible>
+ SlideSorterViewShell::CreateAccessibleDocumentView (::sd::Window* pWindow)
+{
+ // When the view is not set then the initialization is not yet complete
+ // and we can not yet provide an accessibility object.
+ if (mpView == nullptr || mpSlideSorter == nullptr)
+ return nullptr;
+
+ assert(mpSlideSorter);
+
+ rtl::Reference<::accessibility::AccessibleSlideSorterView> pAccessibleView =
+ new ::accessibility::AccessibleSlideSorterView(
+ *mpSlideSorter,
+ pWindow);
+
+ pAccessibleView->Init();
+
+ return pAccessibleView;
+}
+
+void SlideSorterViewShell::SwitchViewFireFocus(const css::uno::Reference< css::accessibility::XAccessible >& xAcc )
+{
+ if (xAcc)
+ {
+ ::accessibility::AccessibleSlideSorterView* pBase = static_cast< ::accessibility::AccessibleSlideSorterView* >(xAcc.get());
+ if (pBase)
+ {
+ pBase->SwitchViewActivated();
+ }
+ }
+}
+
+SlideSorter& SlideSorterViewShell::GetSlideSorter() const
+{
+ assert(mpSlideSorter);
+ return *mpSlideSorter;
+}
+
+bool SlideSorterViewShell::RelocateToParentWindow (vcl::Window* pParentWindow)
+{
+ assert(mpSlideSorter);
+ if ( ! mpSlideSorter)
+ return false;
+
+ mpSlideSorter->RelocateToWindow(pParentWindow);
+ ReadFrameViewData(mpFrameView);
+
+ return true;
+}
+
+SfxUndoManager* SlideSorterViewShell::ImpGetUndoManager() const
+{
+ SfxShell* pObjectBar = GetViewShellBase().GetViewShellManager()->GetTopShell();
+ if (pObjectBar != nullptr)
+ {
+ // When it exists then return the undo manager of the currently
+ // active object bar. The object bar is missing when the
+ // SlideSorterViewShell is not the main view shell.
+ return pObjectBar->GetUndoManager();
+ }
+ else
+ {
+ // Return the undo manager of this shell when there is no object or
+ // tool bar.
+ return const_cast<SlideSorterViewShell*>(this)->GetUndoManager();
+ }
+}
+
+SdPage* SlideSorterViewShell::getCurrentPage() const
+{
+ // since SlideSorterViewShell::GetActualPage() currently also
+ // returns master pages, which is a wrong behaviour for GetActualPage(),
+ // we can just use that for now
+ return const_cast<SlideSorterViewShell*>(this)->GetActualPage();
+}
+
+SdPage* SlideSorterViewShell::GetActualPage()
+{
+ SdPage* pCurrentPage = nullptr;
+
+ // 1. Try to get the current page from the view shell in the center pane
+ // (if we are that not ourself).
+ if ( ! IsMainViewShell())
+ {
+ std::shared_ptr<ViewShell> pMainViewShell = GetViewShellBase().GetMainViewShell();
+ if (pMainViewShell != nullptr)
+ pCurrentPage = pMainViewShell->GetActualPage();
+ }
+
+ if (pCurrentPage == nullptr)
+ {
+ model::SharedPageDescriptor pDescriptor (
+ mpSlideSorter->GetController().GetCurrentSlideManager()->GetCurrentSlide());
+ if (pDescriptor)
+ pCurrentPage = pDescriptor->GetPage();
+ }
+
+ return pCurrentPage;
+}
+
+void SlideSorterViewShell::GetMenuState ( SfxItemSet& rSet)
+{
+ ViewShell::GetMenuState(rSet);
+ assert(mpSlideSorter);
+ mpSlideSorter->GetController().GetSlotManager()->GetMenuState(rSet);
+}
+
+void SlideSorterViewShell::GetClipboardState ( SfxItemSet& rSet)
+{
+ ViewShell::GetMenuState(rSet);
+ assert(mpSlideSorter);
+ mpSlideSorter->GetController().GetSlotManager()->GetClipboardState(rSet);
+}
+
+void SlideSorterViewShell::ExecCtrl (SfxRequest& rRequest)
+{
+ assert(mpSlideSorter);
+ mpSlideSorter->GetController().ExecCtrl(rRequest);
+}
+
+void SlideSorterViewShell::GetCtrlState (SfxItemSet& rSet)
+{
+ assert(mpSlideSorter);
+ mpSlideSorter->GetController().GetCtrlState(rSet);
+}
+
+void SlideSorterViewShell::FuSupport (SfxRequest& rRequest)
+{
+ assert(mpSlideSorter);
+ mpSlideSorter->GetController().FuSupport(rRequest);
+}
+
+/** We have to handle those slot calls here that need to have access to
+ private or protected members and methods of this class.
+*/
+void SlideSorterViewShell::FuTemporary (SfxRequest& rRequest)
+{
+ assert(mpSlideSorter);
+ switch (rRequest.GetSlot())
+ {
+ case SID_MODIFYPAGE:
+ {
+ SdPage* pCurrentPage = GetActualPage();
+ if (pCurrentPage != nullptr)
+ mpImpl->ProcessModifyPageSlot (
+ rRequest,
+ pCurrentPage,
+ PageKind::Standard);
+ Cancel();
+ rRequest.Done ();
+ }
+ break;
+
+ default:
+ mpSlideSorter->GetController().FuTemporary(rRequest);
+ break;
+ }
+}
+
+void SlideSorterViewShell::GetStatusBarState (SfxItemSet& rSet)
+{
+ assert(mpSlideSorter);
+ mpSlideSorter->GetController().GetStatusBarState(rSet);
+}
+
+void SlideSorterViewShell::FuPermanent (SfxRequest& rRequest)
+{
+ assert(mpSlideSorter);
+ mpSlideSorter->GetController().FuPermanent(rRequest);
+}
+
+void SlideSorterViewShell::GetAttrState (SfxItemSet& rSet)
+{
+ assert(mpSlideSorter);
+ mpSlideSorter->GetController().GetAttrState(rSet);
+}
+
+void SlideSorterViewShell::ExecStatusBar (SfxRequest& )
+{
+}
+
+void SlideSorterViewShell::Paint (
+ const ::tools::Rectangle& rBBox,
+ ::sd::Window* pWindow)
+{
+ SetActiveWindow (pWindow);
+ assert(mpSlideSorter);
+ if (mpSlideSorter)
+ mpSlideSorter->GetController().Paint(rBBox,pWindow);
+}
+
+void SlideSorterViewShell::ArrangeGUIElements()
+{
+ if (IsActive())
+ {
+ assert(mpSlideSorter);
+ mpSlideSorter->ArrangeGUIElements(maViewPos, maViewSize);
+ mbIsArrangeGUIElementsPending = false;
+ }
+ else
+ mbIsArrangeGUIElementsPending = true;
+}
+
+void SlideSorterViewShell::Activate (bool bIsMDIActivate)
+{
+ if(inChartContext(GetView()))
+ {
+ // Avoid context changes for chart during activation / deactivation.
+ const bool bIsContextBroadcasterEnabled (SfxShell::SetContextBroadcasterEnabled(false));
+
+ ViewShell::Activate(bIsMDIActivate);
+
+ SfxShell::SetContextBroadcasterEnabled(bIsContextBroadcasterEnabled);
+ return;
+ }
+
+ ViewShell::Activate(bIsMDIActivate);
+ if (mbIsArrangeGUIElementsPending)
+ ArrangeGUIElements();
+
+ // Determine and broadcast the context that belongs to the main view shell.
+ EnumContext::Context eContext = EnumContext::Context::Unknown;
+ std::shared_ptr<ViewShell> pMainViewShell (GetViewShellBase().GetMainViewShell());
+ ViewShell::ShellType eMainViewShellType (
+ pMainViewShell
+ ? pMainViewShell->GetShellType()
+ : ViewShell::ST_NONE);
+ switch (eMainViewShellType)
+ {
+ case ViewShell::ST_IMPRESS:
+ case ViewShell::ST_SLIDE_SORTER:
+ case ViewShell::ST_NOTES:
+ case ViewShell::ST_DRAW:
+ eContext = EnumContext::Context::DrawPage;
+ if( nullptr != dynamic_cast< const DrawViewShell *>( pMainViewShell.get() ))
+ {
+ DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>(pMainViewShell.get());
+ if (pDrawViewShell != nullptr)
+ eContext = EnumContext::GetContextEnum(pDrawViewShell->GetSidebarContextName());
+ }
+ break;
+
+ default:
+ break;
+ }
+ ContextChangeEventMultiplexer::NotifyContextChange(
+ &GetViewShellBase(),
+ eContext);
+}
+
+void SlideSorterViewShell::Deactivate (bool /*bIsMDIActivate*/)
+{
+ // Save Settings - Specifically SlidesPerRow to retrieve it later
+ WriteFrameViewData();
+}
+
+void SlideSorterViewShell::Command (
+ const CommandEvent& rEvent,
+ ::sd::Window* pWindow)
+{
+ assert(mpSlideSorter);
+ if ( ! mpSlideSorter->GetController().Command (rEvent, pWindow))
+ ViewShell::Command (rEvent, pWindow);
+}
+
+void SlideSorterViewShell::ReadFrameViewData (FrameView* pFrameView)
+{
+ assert(mpSlideSorter);
+ if (pFrameView != nullptr)
+ {
+ view::SlideSorterView& rView (mpSlideSorter->GetView());
+
+ sal_uInt16 nSlidesPerRow (pFrameView->GetSlidesPerRow());
+ if (nSlidesPerRow > 0
+ && rView.GetOrientation() == view::Layouter::GRID
+ && IsMainViewShell())
+ {
+ rView.GetLayouter().SetColumnCount(nSlidesPerRow,nSlidesPerRow);
+ }
+ if (IsMainViewShell())
+ mpSlideSorter->GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(
+ mpFrameView->GetSelectedPage());
+ mpSlideSorter->GetController().Rearrange(true);
+
+ // DrawMode for 'main' window
+ if (GetActiveWindow()->GetOutDev()->GetDrawMode() != pFrameView->GetDrawMode() )
+ GetActiveWindow()->GetOutDev()->SetDrawMode( pFrameView->GetDrawMode() );
+ }
+
+ // When this slide sorter is not displayed in the main window then we do
+ // not share the same frame view and have to find other ways to acquire
+ // certain values.
+ if ( ! IsMainViewShell())
+ {
+ std::shared_ptr<ViewShell> pMainViewShell = GetViewShellBase().GetMainViewShell();
+ if (pMainViewShell != nullptr)
+ mpSlideSorter->GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(
+ pMainViewShell->getCurrentPage());
+ }
+}
+
+void SlideSorterViewShell::WriteFrameViewData()
+{
+ assert(mpSlideSorter);
+ if (mpFrameView == nullptr)
+ return;
+
+ view::SlideSorterView& rView (mpSlideSorter->GetView());
+ mpFrameView->SetSlidesPerRow(static_cast<sal_uInt16>(rView.GetLayouter().GetColumnCount()));
+
+ // DrawMode for 'main' window
+ if( mpFrameView->GetDrawMode() != GetActiveWindow()->GetOutDev()->GetDrawMode() )
+ mpFrameView->SetDrawMode( GetActiveWindow()->GetOutDev()->GetDrawMode() );
+
+ SdPage* pActualPage = GetActualPage();
+ if (pActualPage != nullptr)
+ {
+ if (IsMainViewShell())
+ mpFrameView->SetSelectedPage((pActualPage->GetPageNum()- 1) / 2);
+ // else
+ // The slide sorter is not expected to switch the current page
+ // other than by double clicks. That is handled separately.
+ }
+ else
+ {
+ // We have no current page to set but at least we can make sure
+ // that the index of the frame view has a legal value.
+ if (mpFrameView->GetSelectedPage() >= mpSlideSorter->GetModel().GetPageCount())
+ mpFrameView->SetSelectedPage(static_cast<sal_uInt16>(mpSlideSorter->GetModel().GetPageCount())-1);
+ }
+}
+
+void SlideSorterViewShell::SetZoom (::tools::Long )
+{
+ // Ignored.
+ // The zoom scale is adapted internally to fit a number of columns in
+ // the window.
+}
+
+void SlideSorterViewShell::SetZoomRect (const ::tools::Rectangle& rZoomRect)
+{
+ assert(mpSlideSorter);
+ Size aPageSize (mpSlideSorter->GetView().GetLayouter().GetPageObjectSize());
+
+ ::tools::Rectangle aRect(rZoomRect);
+
+ if (aRect.GetWidth() < aPageSize.Width())
+ {
+ ::tools::Long nWidthDiff = (aPageSize.Width() - aRect.GetWidth()) / 2;
+
+ aRect.AdjustLeft( -nWidthDiff );
+ aRect.AdjustRight(nWidthDiff );
+
+ if (aRect.Left() < 0)
+ {
+ aRect.SetPos(Point(0, aRect.Top()));
+ }
+ }
+
+ if (aRect.GetHeight() < aPageSize.Height())
+ {
+ ::tools::Long nHeightDiff = (aPageSize.Height() - aRect.GetHeight()) / 2;
+
+ aRect.AdjustTop( -nHeightDiff );
+ aRect.AdjustBottom(nHeightDiff );
+
+ if (aRect.Top() < 0)
+ {
+ aRect.SetPos(Point(aRect.Left(), 0));
+ }
+ }
+
+ ViewShell::SetZoomRect(aRect);
+
+ GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
+ GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
+}
+
+void SlideSorterViewShell::UpdateScrollBars()
+{
+ // Do not call the overwritten method of the base class: We do all the
+ // scroll bar setup by ourselves.
+ mpSlideSorter->GetController().GetScrollBarManager().UpdateScrollBars(true);
+}
+
+void SlideSorterViewShell::StartDrag (
+ const Point& rDragPt,
+ vcl::Window* pWindow )
+{
+ assert(mpSlideSorter);
+ mpSlideSorter->GetController().GetClipboard().StartDrag (
+ rDragPt,
+ pWindow);
+}
+
+sal_Int8 SlideSorterViewShell::AcceptDrop (
+ const AcceptDropEvent& rEvt,
+ DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer)
+{
+ assert(mpSlideSorter);
+ return mpSlideSorter->GetController().GetClipboard().AcceptDrop (
+ rEvt,
+ rTargetHelper,
+ pTargetWindow,
+ nPage,
+ nLayer);
+}
+
+sal_Int8 SlideSorterViewShell::ExecuteDrop (
+ const ExecuteDropEvent& rEvt,
+ DropTargetHelper& rTargetHelper,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer)
+{
+ assert(mpSlideSorter);
+ return mpSlideSorter->GetController().GetClipboard().ExecuteDrop (
+ rEvt,
+ rTargetHelper,
+ pTargetWindow,
+ nPage,
+ nLayer);
+}
+
+std::shared_ptr<SlideSorterViewShell::PageSelection>
+ SlideSorterViewShell::GetPageSelection() const
+{
+ assert(mpSlideSorter);
+ return mpSlideSorter->GetController().GetPageSelector().GetPageSelection();
+}
+
+void SlideSorterViewShell::SetPageSelection (
+ const std::shared_ptr<PageSelection>& rSelection)
+{
+ assert(mpSlideSorter);
+ mpSlideSorter->GetController().GetPageSelector().SetPageSelection(rSelection, true);
+}
+
+void SlideSorterViewShell::AddSelectionChangeListener (
+ const Link<LinkParamNone*,void>& rCallback)
+{
+ assert(mpSlideSorter);
+ mpSlideSorter->GetController().GetSelectionManager()->AddSelectionChangeListener(rCallback);
+}
+
+void SlideSorterViewShell::RemoveSelectionChangeListener (
+ const Link<LinkParamNone*,void>& rCallback)
+{
+ assert(mpSlideSorter);
+ mpSlideSorter->GetController().GetSelectionManager()->RemoveSelectionChangeListener(rCallback);
+}
+
+void SlideSorterViewShell::MainViewEndEditAndUnmarkAll()
+{
+ std::shared_ptr<ViewShell> pMainViewShell = GetViewShellBase().GetMainViewShell();
+ DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>(pMainViewShell.get());
+ SdrView* pView = pDrawViewShell ? pDrawViewShell->GetDrawView() : nullptr;
+ if (pView)
+ {
+ pView->SdrEndTextEdit();
+ pView->UnmarkAll();
+ }
+}
+
+std::pair<sal_uInt16, sal_uInt16> SlideSorterViewShell::SyncPageSelectionToDocument(const std::shared_ptr<SlideSorterViewShell::PageSelection> &rpSelection)
+{
+ sal_uInt16 firstSelectedPageNo = SAL_MAX_UINT16;
+ sal_uInt16 lastSelectedPageNo = 0;
+
+ GetDoc()->UnselectAllPages();
+ for (auto& rpPage : *rpSelection)
+ {
+ // Check page number
+ sal_uInt16 pageNo = rpPage->GetPageNum();
+ if (pageNo > lastSelectedPageNo)
+ lastSelectedPageNo = pageNo;
+ if (pageNo < firstSelectedPageNo)
+ firstSelectedPageNo = pageNo;
+ GetDoc()->SetSelected(rpPage, true);
+ }
+
+ return std::make_pair(firstSelectedPageNo, lastSelectedPageNo);
+}
+
+void SlideSorterViewShell::ExecMovePageFirst (SfxRequest& /*rReq*/)
+{
+ MainViewEndEditAndUnmarkAll();
+
+ std::shared_ptr<SlideSorterViewShell::PageSelection> xSelection(GetPageSelection());
+
+ // SdDrawDocument MovePages is based on SdPage IsSelected, so
+ // transfer the SlideSorter selection to SdPages
+ SyncPageSelectionToDocument(xSelection);
+
+ // Moves selected pages after page -1
+ GetDoc()->MovePages( sal_uInt16(-1) );
+
+ PostMoveSlidesActions(xSelection);
+}
+
+void SlideSorterViewShell::GetStateMovePageFirst (SfxItemSet& rSet)
+{
+ if ( ! IsMainViewShell())
+ {
+ std::shared_ptr<ViewShell> pMainViewShell = GetViewShellBase().GetMainViewShell();
+ DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>(pMainViewShell.get());
+ if (pDrawViewShell != nullptr && pDrawViewShell->GetPageKind() == PageKind::Handout)
+ {
+ rSet.DisableItem( SID_MOVE_PAGE_FIRST );
+ rSet.DisableItem( SID_MOVE_PAGE_UP );
+ return;
+ }
+ }
+
+ std::shared_ptr<SlideSorterViewShell::PageSelection> xSelection(GetPageSelection());
+
+ // SdDrawDocument MovePages is based on SdPage IsSelected, so
+ // transfer the SlideSorter selection to SdPages
+ sal_uInt16 firstSelectedPageNo = SyncPageSelectionToDocument(xSelection).first;
+ // Now compute human page number from internal page number
+ firstSelectedPageNo = (firstSelectedPageNo - 1) / 2;
+
+ if (firstSelectedPageNo == 0)
+ {
+ rSet.DisableItem( SID_MOVE_PAGE_FIRST );
+ rSet.DisableItem( SID_MOVE_PAGE_UP );
+ }
+}
+
+void SlideSorterViewShell::ExecMovePageUp (SfxRequest& /*rReq*/)
+{
+ MainViewEndEditAndUnmarkAll();
+
+ std::shared_ptr<SlideSorterViewShell::PageSelection> xSelection(GetPageSelection());
+
+ // SdDrawDocument MovePages is based on SdPage IsSelected, so
+ // transfer the SlideSorter selection to SdPages
+ sal_uInt16 firstSelectedPageNo = SyncPageSelectionToDocument(xSelection).first;
+
+ // In case no slide is selected
+ if (firstSelectedPageNo == SAL_MAX_UINT16)
+ return;
+
+ // Now compute human page number from internal page number
+ firstSelectedPageNo = (firstSelectedPageNo - 1) / 2;
+
+ if (firstSelectedPageNo == 0)
+ return;
+
+ // Move pages before firstSelectedPageNo - 1 (so after firstSelectedPageNo - 2),
+ // remembering that -1 means at first, which is good.
+ GetDoc()->MovePages( firstSelectedPageNo - 2 );
+
+ PostMoveSlidesActions(xSelection);
+}
+
+void SlideSorterViewShell::GetStateMovePageUp (SfxItemSet& rSet)
+{
+ GetStateMovePageFirst(rSet);
+}
+
+void SlideSorterViewShell::ExecMovePageDown (SfxRequest& /*rReq*/)
+{
+ MainViewEndEditAndUnmarkAll();
+
+ std::shared_ptr<SlideSorterViewShell::PageSelection> xSelection(GetPageSelection());
+
+ // SdDrawDocument MovePages is based on SdPage IsSelected, so
+ // transfer the SlideSorter selection to SdPages
+ sal_uInt16 lastSelectedPageNo = SyncPageSelectionToDocument(xSelection).second;
+
+ // Get page number of the last page
+ sal_uInt16 nNoOfPages = GetDoc()->GetSdPageCount(PageKind::Standard);
+
+ // Now compute human page number from internal page number
+ lastSelectedPageNo = (lastSelectedPageNo - 1) / 2;
+ if (lastSelectedPageNo == nNoOfPages - 1)
+ return;
+
+ // Move to position after lastSelectedPageNo
+ GetDoc()->MovePages( lastSelectedPageNo + 1 );
+
+ PostMoveSlidesActions(xSelection);
+}
+
+void SlideSorterViewShell::GetStateMovePageDown (SfxItemSet& rSet)
+{
+ GetStateMovePageLast( rSet );
+}
+
+void SlideSorterViewShell::ExecMovePageLast (SfxRequest& /*rReq*/)
+{
+ MainViewEndEditAndUnmarkAll();
+
+ std::shared_ptr<SlideSorterViewShell::PageSelection> xSelection(GetPageSelection());
+
+ // SdDrawDocument MovePages is based on SdPage IsSelected, so
+ // transfer the SlideSorter selection to SdPages
+ SyncPageSelectionToDocument(xSelection);
+
+ // Get page number of the last page
+ sal_uInt16 nNoOfPages = GetDoc()->GetSdPageCount(PageKind::Standard);
+
+ // Move to position after last page No (=Number of pages - 1)
+ GetDoc()->MovePages( nNoOfPages - 1 );
+
+ PostMoveSlidesActions(xSelection);
+}
+
+void SlideSorterViewShell::GetStateMovePageLast (SfxItemSet& rSet)
+{
+ std::shared_ptr<ViewShell> pMainViewShell = GetViewShellBase().GetMainViewShell();
+ DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>(pMainViewShell.get());
+ if (pDrawViewShell != nullptr && pDrawViewShell->GetPageKind() == PageKind::Handout)
+ {
+ rSet.DisableItem( SID_MOVE_PAGE_LAST );
+ rSet.DisableItem( SID_MOVE_PAGE_DOWN );
+ return;
+ }
+
+ std::shared_ptr<SlideSorterViewShell::PageSelection> xSelection(GetPageSelection());
+
+ // SdDrawDocument MovePages is based on SdPage IsSelected, so
+ // transfer the SlideSorter selection to SdPages
+ sal_uInt16 lastSelectedPageNo = SyncPageSelectionToDocument(xSelection).second;
+
+ // Get page number of the last page
+ sal_uInt16 nNoOfPages = GetDoc()->GetSdPageCount(PageKind::Standard);
+
+ // Now compute human page number from internal page number
+ lastSelectedPageNo = (lastSelectedPageNo - 1) / 2;
+ if (lastSelectedPageNo == nNoOfPages - 1)
+ {
+ rSet.DisableItem( SID_MOVE_PAGE_LAST );
+ rSet.DisableItem( SID_MOVE_PAGE_DOWN );
+ }
+}
+
+void SlideSorterViewShell::PostMoveSlidesActions(const std::shared_ptr<SlideSorterViewShell::PageSelection> &rpSelection)
+{
+ sal_uInt16 nNoOfPages = GetDoc()->GetSdPageCount(PageKind::Standard);
+ for (sal_uInt16 nPage = 0; nPage < nNoOfPages; nPage++)
+ {
+ SdPage* pPage = GetDoc()->GetSdPage(nPage, PageKind::Standard);
+ GetDoc()->SetSelected(pPage, false);
+ }
+
+ mpSlideSorter->GetController().GetPageSelector().DeselectAllPages();
+ for (const auto& rpPage : *rpSelection)
+ {
+ mpSlideSorter->GetController().GetPageSelector().SelectPage(rpPage);
+ }
+
+ // Refresh toolbar icons
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate(SID_MOVE_PAGE_FIRST);
+ rBindings.Invalidate(SID_MOVE_PAGE_UP);
+ rBindings.Invalidate(SID_MOVE_PAGE_DOWN);
+ rBindings.Invalidate(SID_MOVE_PAGE_LAST);
+
+}
+
+} // end of namespace ::sd::slidesorter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlideSorterView.cxx b/sd/source/ui/slidesorter/view/SlideSorterView.cxx
new file mode 100644
index 000000000..390541e37
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlideSorterView.cxx
@@ -0,0 +1,856 @@
+/* -*- 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 <view/SlideSorterView.hxx>
+
+#include <SlideSorter.hxx>
+#include <ViewShell.hxx>
+#include "SlsViewCacheContext.hxx"
+#include "SlsLayeredDevice.hxx"
+#include <view/SlsLayouter.hxx>
+#include <view/SlsPageObjectLayouter.hxx>
+#include <view/SlsPageObjectPainter.hxx>
+#include <view/SlsILayerPainter.hxx>
+#include <view/SlsToolTip.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsClipboard.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <cache/SlsPageCache.hxx>
+#include <cache/SlsPageCacheManager.hxx>
+#include <PaneDockingWindow.hxx>
+
+#include <sdpage.hxx>
+#include <Window.hxx>
+
+#include <comphelper/lok.hxx>
+#include <osl/diagnose.h>
+#include <vcl/svapp.hxx>
+#include <vcl/scrbar.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/graphicfilter.hxx>
+
+#include <algorithm>
+
+//#define DEBUG_TIMING
+#ifdef DEBUG_TIMING
+#include <memory>
+#include <vector>
+#endif
+
+using namespace ::sd::slidesorter::model;
+using namespace ::drawinglayer::primitive2d;
+
+namespace sd::slidesorter::view {
+
+namespace {
+ /** Wrapper around the SlideSorterView that supports the IPainter
+ interface and that allows the LayeredDevice to hold the
+ SlideSorterView (held as unique_ptr by the SlideSorter) as
+ shared_ptr.
+ */
+ class Painter : public ILayerPainter
+ {
+ public:
+ explicit Painter (SlideSorterView& rView) : mrView(rView) {}
+
+ virtual void Paint (OutputDevice& rDevice, const ::tools::Rectangle& rRepaintArea) override
+ {
+ mrView.Paint(rDevice,rRepaintArea);
+ }
+
+ virtual void SetLayerInvalidator (const SharedILayerInvalidator&) override {}
+
+ private:
+ SlideSorterView& mrView;
+ };
+}
+
+namespace {
+
+class BackgroundPainter
+ : public ILayerPainter
+{
+public:
+ explicit BackgroundPainter (const Color& rBackgroundColor) : maBackgroundColor(rBackgroundColor) {}
+ BackgroundPainter(const BackgroundPainter&) = delete;
+ BackgroundPainter& operator=(const BackgroundPainter&) = delete;
+
+ virtual void Paint (OutputDevice& rDevice, const ::tools::Rectangle& rRepaintArea) override
+ {
+ rDevice.SetFillColor(maBackgroundColor);
+ rDevice.SetLineColor();
+ rDevice.DrawRect(rRepaintArea);
+ }
+
+ virtual void SetLayerInvalidator (const SharedILayerInvalidator&) override {}
+
+ void SetColor (const Color& rColor) { maBackgroundColor = rColor; }
+
+private:
+ Color maBackgroundColor;
+};
+
+}
+
+SlideSorterView::SlideSorterView (SlideSorter& rSlideSorter)
+ : ::sd::View (
+ *rSlideSorter.GetModel().GetDocument(),
+ rSlideSorter.GetContentWindow()->GetOutDev(),
+ rSlideSorter.GetViewShell()),
+ mrSlideSorter(rSlideSorter),
+ mrModel(rSlideSorter.GetModel()),
+ mbIsDisposed(false),
+ mpLayouter (new Layouter(rSlideSorter.GetContentWindow(), rSlideSorter.GetTheme())),
+ mbPageObjectVisibilitiesValid (false),
+ mpLayeredDevice(std::make_shared<LayeredDevice>(rSlideSorter.GetContentWindow())),
+ maVisiblePageRange(-1,-1),
+ maPreviewSize(0,0),
+ mbPreciousFlagUpdatePending(true),
+ meOrientation(Layouter::GRID),
+ mpBackgroundPainter(
+ std::make_shared<BackgroundPainter>(mrSlideSorter.GetTheme()->GetColor(Theme::Color_Background))),
+ mpToolTip(new ToolTip(mrSlideSorter)),
+ mbIsRearrangePending(true)
+{
+ // Hide the page that contains the page objects.
+ SetPageVisible (false);
+
+ // Register the background painter on level 1 to avoid the creation of a
+ // background buffer.
+ mpLayeredDevice->RegisterPainter(mpBackgroundPainter, 1);
+
+ // Wrap a shared_ptr-held-wrapper around this view and register it as
+ // painter at the layered device. There is no explicit destruction: in
+ // the SlideSorterView destructor the layered device is destroyed and
+ // with it the only reference to the wrapper which therefore is also
+ // destroyed.
+ SharedILayerPainter pPainter = std::make_shared<Painter>(*this);
+
+ // The painter is placed on level 1 to avoid buffering. This should be
+ // a little faster during animations because the previews are painted
+ // directly into the window, not via the buffer.
+ mpLayeredDevice->RegisterPainter(pPainter, 1);
+}
+
+SlideSorterView::~SlideSorterView()
+{
+ if ( ! mbIsDisposed)
+ {
+ OSL_ASSERT(mbIsDisposed);
+ Dispose();
+ }
+}
+
+void SlideSorterView::Init()
+{
+ HandleModelChange();
+}
+
+void SlideSorterView::Dispose()
+{
+ mpLayeredDevice->Dispose();
+ mpPreviewCache.reset();
+
+ SetPageUnderMouse(SharedPageDescriptor());
+
+ // Hide the page to avoid problems in the view when deleting
+ // visualized objects
+ HideSdrPage();
+
+ // Deletion of the objects and the page will be done in SdrModel
+ // destructor (as long as objects and pages are added)
+
+ OSL_ASSERT(mpLayeredDevice.use_count() == 1);
+ mpLayeredDevice.reset();
+
+ mbIsDisposed = true;
+}
+
+sal_Int32 SlideSorterView::GetPageIndexAtPoint (const Point& rWindowPosition) const
+{
+ sal_Int32 nIndex (-1);
+
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if (pWindow)
+ {
+ nIndex = mpLayouter->GetIndexAtPoint(pWindow->PixelToLogic(rWindowPosition), false, false);
+
+ // Clip the page index against the page count.
+ if (nIndex >= mrModel.GetPageCount())
+ nIndex = -1;
+ }
+
+ return nIndex;
+}
+
+Layouter& SlideSorterView::GetLayouter() { return *mpLayouter; }
+
+void SlideSorterView::ModelHasChanged()
+{
+ // Ignore this call. Rely on hints sent by the model to get informed of
+ // model changes.
+}
+
+void SlideSorterView::PreModelChange()
+{
+ // Reset the slide under the mouse. It will be re-set in PostModelChange().
+ SetPageUnderMouse(SharedPageDescriptor());
+}
+
+void SlideSorterView::PostModelChange()
+{
+ // In PreModelChange() the page objects have been released. Here we
+ // create new ones.
+ ::osl::MutexGuard aGuard (mrModel.GetMutex());
+
+ model::PageEnumerationProvider::CreateAllPagesEnumeration(mrModel);
+
+ // The new page objects have to be scaled and positioned.
+ RequestRearrange();
+ RequestRepaint();
+}
+
+/** At the moment for every model change all page objects are destroyed and
+ re-created again. This can be optimized by accepting hints that
+ describe the type of change so that existing page objects can be
+ reused.
+*/
+void SlideSorterView::HandleModelChange()
+{
+ PreModelChange ();
+ PostModelChange();
+}
+
+void SlideSorterView::HandleDrawModeChange()
+{
+ // Replace the preview cache with a new and empty one. The
+ // PreviewRenderer that is used by the cache is replaced by this as
+ // well.
+ mpPreviewCache.reset();
+ GetPreviewCache()->InvalidateCache();
+
+ RequestRepaint();
+}
+
+void SlideSorterView::HandleDataChangeEvent()
+{
+ GetPageObjectPainter()->SetTheme(mrSlideSorter.GetTheme());
+
+ // Update the color used by the background painter.
+ std::shared_ptr<BackgroundPainter> pPainter (
+ std::dynamic_pointer_cast<BackgroundPainter>(mpBackgroundPainter));
+ if (pPainter)
+ pPainter->SetColor(mrSlideSorter.GetTheme()->GetColor(Theme::Color_Background));
+
+ RequestRepaint();
+}
+
+void SlideSorterView::Resize()
+{
+ UpdateOrientation();
+
+ mpLayeredDevice->Resize();
+ RequestRearrange();
+}
+
+void SlideSorterView::RequestRearrange()
+{
+ mbIsRearrangePending = true;
+ Rearrange();
+}
+
+void SlideSorterView::Rearrange()
+{
+ if ( ! mbIsRearrangePending)
+ return;
+ if (mrModel.GetPageCount() <= 0)
+ return;
+
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if ( ! pWindow)
+ return;
+ const Size aWindowSize (pWindow->GetSizePixel());
+ if (aWindowSize.IsEmpty())
+ return;
+
+ const bool bRearrangeSuccess (
+ mpLayouter->Rearrange (
+ meOrientation,
+ aWindowSize,
+ mrModel.GetPageDescriptor(0)->GetPage()->GetSize(),
+ mrModel.GetPageCount()));
+ if (bRearrangeSuccess)
+ {
+ mbIsRearrangePending = false;
+ Layout();
+ UpdatePageUnderMouse();
+ // RequestRepaint();
+ }
+}
+
+void SlideSorterView::UpdateOrientation()
+{
+ // The layout of slides depends on whether the slide sorter is
+ // displayed in the center or the side pane.
+ if (mrSlideSorter.GetViewShell()->IsMainViewShell())
+ SetOrientation(Layouter::GRID);
+ else
+ {
+ // Get access to the docking window.
+ vcl::Window* pWindow = mrSlideSorter.GetContentWindow();
+ PaneDockingWindow* pDockingWindow = nullptr;
+ while (pWindow!=nullptr && pDockingWindow==nullptr)
+ {
+ pDockingWindow = dynamic_cast<PaneDockingWindow*>(pWindow);
+ pWindow = pWindow->GetParent();
+ }
+
+ if (pDockingWindow != nullptr)
+ {
+ const ::tools::Long nScrollBarSize (
+ Application::GetSettings().GetStyleSettings().GetScrollBarSize());
+ switch (pDockingWindow->GetOrientation())
+ {
+ case PaneDockingWindow::HorizontalOrientation:
+ if (SetOrientation(Layouter::HORIZONTAL))
+ {
+ const Range aRange (mpLayouter->GetValidVerticalSizeRange());
+ pDockingWindow->SetValidSizeRange(Range(
+ aRange.Min() + nScrollBarSize,
+ aRange.Max() + nScrollBarSize));
+ }
+ break;
+
+ case PaneDockingWindow::VerticalOrientation:
+ if (SetOrientation(Layouter::VERTICAL))
+ {
+ const Range aRange (mpLayouter->GetValidHorizontalSizeRange());
+ pDockingWindow->SetValidSizeRange(Range(
+ aRange.Min() + nScrollBarSize,
+ aRange.Max() + nScrollBarSize));
+ }
+ break;
+
+ case PaneDockingWindow::UnknownOrientation:
+ if (SetOrientation(Layouter::GRID))
+ {
+ const sal_Int32 nAdditionalSize (10);
+ pDockingWindow->SetMinOutputSizePixel(Size(
+ mpLayouter->GetValidHorizontalSizeRange().Min()
+ + nScrollBarSize
+ + nAdditionalSize,
+ mpLayouter->GetValidVerticalSizeRange().Min()
+ + nScrollBarSize
+ + nAdditionalSize));
+ }
+ return;
+ }
+ }
+ else
+ {
+ // We are not placed in a docking window. One possible reason
+ // is that the slide sorter is temporarily into a cache and was
+ // reparented to a non-docking window.
+ SetOrientation(Layouter::GRID);
+ }
+ }
+}
+
+void SlideSorterView::Layout ()
+{
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if (pWindow)
+ {
+ // Set the model area, i.e. the smallest rectangle that includes all
+ // page objects.
+ const ::tools::Rectangle aViewBox (mpLayouter->GetTotalBoundingBox());
+ pWindow->SetViewOrigin (aViewBox.TopLeft());
+ pWindow->SetViewSize (aViewBox.GetSize());
+
+ std::shared_ptr<PageObjectLayouter> pPageObjectLayouter(
+ mpLayouter->GetPageObjectLayouter());
+ if (pPageObjectLayouter)
+ {
+ const Size aNewPreviewSize (mpLayouter->GetPageObjectLayouter()->GetPreviewSize());
+ if (maPreviewSize != aNewPreviewSize && GetPreviewCache())
+ {
+ mpPreviewCache->ChangeSize(aNewPreviewSize, Bitmap::HasFastScale());
+ maPreviewSize = aNewPreviewSize;
+ }
+ }
+
+ // Iterate over all page objects and place them relative to the
+ // containing page.
+ model::PageEnumeration aPageEnumeration (
+ model::PageEnumerationProvider::CreateAllPagesEnumeration(mrModel));
+ while (aPageEnumeration.HasMoreElements())
+ {
+ model::SharedPageDescriptor pDescriptor (aPageEnumeration.GetNextElement());
+ pDescriptor->SetBoundingBox(mpLayouter->GetPageObjectBox(pDescriptor->GetPageIndex(), false));
+ }
+ }
+
+ InvalidatePageObjectVisibilities ();
+}
+
+void SlideSorterView::InvalidatePageObjectVisibilities()
+{
+ mbPageObjectVisibilitiesValid = false;
+}
+
+void SlideSorterView::DeterminePageObjectVisibilities()
+{
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if (!pWindow)
+ return;
+
+ // Set this flag to true here so that an invalidate during the
+ // visibility calculation can correctly invalidate it again.
+ mbPageObjectVisibilitiesValid = true;
+
+ ::tools::Rectangle aViewArea (pWindow->PixelToLogic(::tools::Rectangle(Point(0,0),pWindow->GetSizePixel())));
+ const Range aRange (mpLayouter->GetRangeOfVisiblePageObjects(aViewArea));
+ const Range aUnion(
+ ::std::min(maVisiblePageRange.Min(), aRange.Min()),
+ ::std::max(maVisiblePageRange.Max(), aRange.Max()));
+
+ // For page objects that just dropped off the visible area we
+ // decrease the priority of pending requests for preview bitmaps.
+ if (maVisiblePageRange != aRange)
+ mbPreciousFlagUpdatePending |= true;
+
+ model::SharedPageDescriptor pDescriptor;
+ for (::tools::Long nIndex=aUnion.Min(); nIndex<=aUnion.Max(); nIndex++)
+ {
+ pDescriptor = mrModel.GetPageDescriptor(nIndex);
+ if (pDescriptor)
+ SetState(
+ pDescriptor,
+ PageDescriptor::ST_Visible,
+ aRange.Contains(nIndex));
+ }
+
+ // Broadcast a change of the set of visible page objects.
+ if (maVisiblePageRange != aRange)
+ {
+ maVisiblePageRange = aRange;
+
+ // Tell the listeners that the visibility of some objects has
+ // changed.
+ ::std::vector<Link<LinkParamNone*,void>>& aChangeListeners (maVisibilityChangeListeners);
+ for (const auto& rLink : aChangeListeners)
+ {
+ rLink.Call(nullptr);
+ }
+ }
+
+ // Restore the mouse over state.
+ UpdatePageUnderMouse();
+}
+
+void SlideSorterView::UpdatePreciousFlags()
+{
+ if (!mbPreciousFlagUpdatePending)
+ return;
+
+ mbPreciousFlagUpdatePending = false;
+
+ model::SharedPageDescriptor pDescriptor;
+ std::shared_ptr<cache::PageCache> pCache = GetPreviewCache();
+ sal_Int32 nPageCount (mrModel.GetPageCount());
+
+ for (int nIndex=0; nIndex<=nPageCount; ++nIndex)
+ {
+ pDescriptor = mrModel.GetPageDescriptor(nIndex);
+ if (pDescriptor)
+ {
+ pCache->SetPreciousFlag(
+ pDescriptor->GetPage(),
+ maVisiblePageRange.Contains(nIndex));
+ }
+ else
+ {
+ // At least one cache entry can not be updated. Remember to
+ // repeat the whole updating later and leave the loop now.
+ mbPreciousFlagUpdatePending = true;
+ break;
+ }
+ }
+}
+
+bool SlideSorterView::SetOrientation (const Layouter::Orientation eOrientation)
+{
+ if (meOrientation != eOrientation)
+ {
+ meOrientation = eOrientation;
+ return true;
+ }
+ else
+ return false;
+}
+
+void SlideSorterView::RequestRepaint()
+{
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if (pWindow)
+ {
+ mpLayeredDevice->InvalidateAllLayers(
+ ::tools::Rectangle(
+ pWindow->PixelToLogic(Point(0,0)),
+ pWindow->PixelToLogic(pWindow->GetSizePixel())));
+ pWindow->Invalidate();
+ }
+}
+
+void SlideSorterView::RequestRepaint (const model::SharedPageDescriptor& rpDescriptor)
+{
+ if (rpDescriptor)
+ RequestRepaint(rpDescriptor->GetBoundingBox());
+}
+
+void SlideSorterView::RequestRepaint (const ::tools::Rectangle& rRepaintBox)
+{
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if (pWindow)
+ {
+ mpLayeredDevice->InvalidateAllLayers(rRepaintBox);
+ pWindow->Invalidate(rRepaintBox);
+ }
+}
+
+void SlideSorterView::RequestRepaint (const vcl::Region& rRepaintRegion)
+{
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if (pWindow)
+ {
+ mpLayeredDevice->InvalidateAllLayers(rRepaintRegion);
+ pWindow->Invalidate(rRepaintRegion);
+ }
+}
+
+::tools::Rectangle SlideSorterView::GetModelArea() const
+{
+ return mpLayouter->GetTotalBoundingBox();
+}
+
+#ifdef DEBUG_TIMING
+static ::canvas::tools::ElapsedTime gaTimer;
+static const size_t gFrameTimeCount (10);
+static size_t gFrameTimeIndex (0);
+static ::std::vector<double> gFrameTimes (gFrameTimeCount, 0);
+static double gFrameTimeSum (0);
+static const ::tools::Rectangle gFrameTimeBox (10,10,150,20);
+static double gnLastFrameStart = 0;
+#endif
+
+void SlideSorterView::CompleteRedraw (
+ OutputDevice* pDevice,
+ const vcl::Region& rPaintArea,
+ sdr::contact::ViewObjectContactRedirector* pRedirector)
+{
+ (void)pRedirector;
+
+ if (comphelper::LibreOfficeKit::isActive())
+ return;
+
+ if (pDevice == nullptr || pDevice!=mrSlideSorter.GetContentWindow()->GetOutDev())
+ return;
+
+#ifdef DEBUG_TIMING
+ const double nStartTime (gaTimer.getElapsedTime());
+ SAL_INFO("sd.timing", "SlideSorterView::CompleteRedraw start" << (mnLockRedrawSmph ? " locked" : ""));
+#endif
+
+ // The parent implementation of CompleteRedraw is called only when
+ // painting is locked. We do all the painting ourself. When painting
+ // is locked the parent implementation keeps track of the repaint
+ // requests and later, when painting is unlocked, calls CompleteRedraw
+ // for all missed repaints.
+
+ if (mnLockRedrawSmph == 0)
+ {
+ if (mpLayeredDevice->HandleMapModeChange())
+ DeterminePageObjectVisibilities();
+ mpLayeredDevice->Repaint(rPaintArea);
+ }
+ else
+ {
+ maRedrawRegion.Union(rPaintArea);
+ }
+
+#ifdef DEBUG_TIMING
+ const double nEndTime (gaTimer.getElapsedTime());
+ SAL_INFO("sd.timing", "SlideSorterView::CompleteRedraw end after " << (nEndTime-nStartTime)*1000 << " ms");
+ gFrameTimeSum -= gFrameTimes[gFrameTimeIndex];
+ gFrameTimes[gFrameTimeIndex] = nStartTime - gnLastFrameStart;
+ gnLastFrameStart = nStartTime;
+ gFrameTimeSum += gFrameTimes[gFrameTimeIndex];
+ gFrameTimeIndex = (gFrameTimeIndex+1) % gFrameTimeCount;
+
+ mrSlideSorter.GetContentWindow()->SetFillColor(COL_BLUE);
+ mrSlideSorter.GetContentWindow()->DrawRect(gFrameTimeBox);
+ mrSlideSorter.GetContentWindow()->SetTextColor(COL_WHITE);
+ mrSlideSorter.GetContentWindow()->DrawText(
+ gFrameTimeBox,
+ OUString::number(1 / (gFrameTimeSum / gFrameTimeCount)),
+ DrawTextFlags::Right | DrawTextFlags::VCenter);
+ // mrSlideSorter.GetContentWindow()->Invalidate(gFrameTimeBox);
+#endif
+}
+
+void SlideSorterView::Paint (
+ OutputDevice& rDevice,
+ const ::tools::Rectangle& rRepaintArea)
+{
+ if (rRepaintArea.IsEmpty())
+ return;
+
+ if ( ! mpPageObjectPainter)
+ if ( ! GetPageObjectPainter())
+ return;
+
+ // Update the page visibilities when they have been invalidated.
+ if ( ! mbPageObjectVisibilitiesValid)
+ DeterminePageObjectVisibilities();
+
+ if (mbPreciousFlagUpdatePending)
+ UpdatePreciousFlags();
+
+ if (mbIsRearrangePending)
+ Rearrange();
+
+ // Paint all page objects that are fully or partially inside the
+ // repaint region.
+ const Range aRange (mpLayouter->GetRangeOfVisiblePageObjects(rRepaintArea));
+ // Try to prefetch all graphics from the pages to paint. This will be done
+ // in threads to be more efficient than loading them on-demand one by one.
+ std::vector<Graphic*> graphics;
+ for (::tools::Long nIndex=aRange.Min(); nIndex<=aRange.Max(); ++nIndex)
+ {
+ model::SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nIndex));
+ if (!pDescriptor || ! pDescriptor->HasState(PageDescriptor::ST_Visible))
+ continue;
+ pDescriptor->GetPage()->getGraphicsForPrefetch(graphics);
+ }
+ // Handle also one page before and after to have those in advance on scrolling.
+ for (::tools::Long nIndex : { aRange.Min() - 1, aRange.Max() + 1 })
+ {
+ model::SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nIndex));
+ if (!pDescriptor)
+ continue;
+ pDescriptor->GetPage()->getGraphicsForPrefetch(graphics);
+ }
+ if(graphics.size() > 1) // threading does not help with loading just one
+ GraphicFilter::GetGraphicFilter().MakeGraphicsAvailableThreaded(graphics);
+
+ for (::tools::Long nIndex=aRange.Min(); nIndex<=aRange.Max(); ++nIndex)
+ {
+ model::SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nIndex));
+ if (!pDescriptor || ! pDescriptor->HasState(PageDescriptor::ST_Visible))
+ continue;
+
+ mpPageObjectPainter->PaintPageObject(rDevice, pDescriptor);
+ }
+}
+
+void SlideSorterView::ConfigurationChanged (
+ utl::ConfigurationBroadcaster* pBroadcaster,
+ ConfigurationHints nHint)
+{
+ // Some changes of the configuration (some of the colors for example)
+ // may affect the previews. Throw away the old ones and create new ones.
+ cache::PageCacheManager::Instance()->InvalidateAllCaches();
+
+ ::sd::View::ConfigurationChanged(pBroadcaster, nHint);
+ RequestRepaint();
+
+}
+
+std::shared_ptr<cache::PageCache> const & SlideSorterView::GetPreviewCache()
+{
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if (pWindow && mpPreviewCache == nullptr)
+ {
+ mpPreviewCache =
+ std::make_shared<cache::PageCache>(
+ mpLayouter->GetPageObjectSize(),
+ Bitmap::HasFastScale(),
+ std::make_shared<ViewCacheContext>(mrSlideSorter));
+ }
+
+ return mpPreviewCache;
+}
+
+Range const & SlideSorterView::GetVisiblePageRange()
+{
+ if ( ! mbPageObjectVisibilitiesValid)
+ DeterminePageObjectVisibilities();
+ return maVisiblePageRange;
+}
+
+void SlideSorterView::AddVisibilityChangeListener (const Link<LinkParamNone*,void>& rListener)
+{
+ if (::std::find (
+ maVisibilityChangeListeners.begin(),
+ maVisibilityChangeListeners.end(),
+ rListener) == maVisibilityChangeListeners.end())
+ {
+ maVisibilityChangeListeners.push_back(rListener);
+ }
+}
+
+void SlideSorterView::RemoveVisibilityChangeListener(const Link<LinkParamNone*,void>&rListener)
+{
+ maVisibilityChangeListeners.erase (
+ ::std::find (
+ maVisibilityChangeListeners.begin(),
+ maVisibilityChangeListeners.end(),
+ rListener));
+}
+
+ToolTip& SlideSorterView::GetToolTip() const
+{
+ OSL_ASSERT(mpToolTip);
+ return *mpToolTip;
+}
+
+void SlideSorterView::DragFinished (sal_Int8 nDropAction)
+{
+ mrSlideSorter.GetController().GetClipboard().DragFinished(nDropAction);
+
+ View::DragFinished(nDropAction);
+}
+
+void SlideSorterView::UpdatePageUnderMouse ()
+{
+ VclPtr<ScrollBar> pVScrollBar (mrSlideSorter.GetVerticalScrollBar());
+ VclPtr<ScrollBar> pHScrollBar (mrSlideSorter.GetHorizontalScrollBar());
+ if ((pVScrollBar && pVScrollBar->IsVisible() && pVScrollBar->IsTracking())
+ || (pHScrollBar && pHScrollBar->IsVisible() && pHScrollBar->IsTracking()))
+ {
+ // One of the scroll bars is tracking mouse movement. Do not
+ // highlight the slide under the mouse in this case.
+ SetPageUnderMouse(SharedPageDescriptor());
+ return;
+ }
+
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if (pWindow && pWindow->IsVisible() && ! pWindow->IsMouseCaptured())
+ {
+ const Window::PointerState aPointerState (pWindow->GetPointerState());
+ const ::tools::Rectangle aWindowBox (pWindow->GetPosPixel(), pWindow->GetSizePixel());
+ if (aWindowBox.Contains(aPointerState.maPos))
+ {
+ UpdatePageUnderMouse(aPointerState.maPos);
+ return;
+ }
+ }
+
+ SetPageUnderMouse(SharedPageDescriptor());
+}
+
+void SlideSorterView::UpdatePageUnderMouse (
+ const Point& rMousePosition)
+{
+ SetPageUnderMouse(mrSlideSorter.GetController().GetPageAt(rMousePosition));
+}
+
+void SlideSorterView::SetPageUnderMouse (
+ const model::SharedPageDescriptor& rpDescriptor)
+{
+ if (mpPageUnderMouse == rpDescriptor)
+ return;
+
+ if (mpPageUnderMouse)
+ SetState(mpPageUnderMouse, PageDescriptor::ST_MouseOver, false);
+
+ mpPageUnderMouse = rpDescriptor;
+
+ if (mpPageUnderMouse)
+ SetState(mpPageUnderMouse, PageDescriptor::ST_MouseOver, true);
+
+ // Change the quick help text to display the name of the page under
+ // the mouse.
+ mpToolTip->SetPage(rpDescriptor);
+}
+
+bool SlideSorterView::SetState (
+ const model::SharedPageDescriptor& rpDescriptor,
+ const PageDescriptor::State eState,
+ const bool bStateValue)
+{
+ if ( ! rpDescriptor)
+ return false;
+
+ const bool bModified (rpDescriptor->SetState(eState, bStateValue));
+ if ( ! bModified)
+ return false;
+
+ // When the page object is not visible (i.e. not on the screen then
+ // nothing has to be painted.
+ if (rpDescriptor->HasState(PageDescriptor::ST_Visible))
+ {
+ // For most states a change of that state leads to visible
+ // difference and we have to request a repaint.
+ if (eState != PageDescriptor::ST_WasSelected)
+ RequestRepaint(rpDescriptor);
+ }
+
+ return bModified;
+}
+
+std::shared_ptr<PageObjectPainter> const & SlideSorterView::GetPageObjectPainter()
+{
+ if ( ! mpPageObjectPainter)
+ mpPageObjectPainter = std::make_shared<PageObjectPainter>(mrSlideSorter);
+ return mpPageObjectPainter;
+}
+
+//===== SlideSorterView::DrawLock =============================================
+
+SlideSorterView::DrawLock::DrawLock (SlideSorter const & rSlideSorter)
+ : mrView(rSlideSorter.GetView()),
+ mpWindow(rSlideSorter.GetContentWindow())
+{
+ if (mrView.mnLockRedrawSmph == 0)
+ mrView.maRedrawRegion.SetEmpty();
+ ++mrView.mnLockRedrawSmph;
+}
+
+SlideSorterView::DrawLock::~DrawLock()
+{
+ OSL_ASSERT(mrView.mnLockRedrawSmph>0);
+ --mrView.mnLockRedrawSmph;
+ if (mrView.mnLockRedrawSmph == 0)
+ if (mpWindow)
+ {
+ mpWindow->Invalidate(mrView.maRedrawRegion);
+ }
+}
+
+void SlideSorterView::DrawLock::Dispose()
+{
+ mpWindow.reset();
+}
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlsFramePainter.cxx b/sd/source/ui/slidesorter/view/SlsFramePainter.cxx
new file mode 100644
index 000000000..31c301868
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlsFramePainter.cxx
@@ -0,0 +1,225 @@
+/* -*- 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 "SlsFramePainter.hxx"
+#include <vcl/outdev.hxx>
+#include <osl/diagnose.h>
+
+namespace sd::slidesorter::view {
+
+FramePainter::FramePainter (const BitmapEx& rShadowBitmap)
+ : maTopLeft(rShadowBitmap,-1,-1),
+ maTop(rShadowBitmap,0,-1),
+ maTopRight(rShadowBitmap,+1,-1),
+ maLeft(rShadowBitmap,-1,0),
+ maRight(rShadowBitmap,+1,0),
+ maBottomLeft(rShadowBitmap,-1,+1),
+ maBottom(rShadowBitmap,0,+1),
+ maBottomRight(rShadowBitmap,+1,+1),
+ maCenter(rShadowBitmap,0,0),
+ mbIsValid(false)
+{
+ if (rShadowBitmap.GetSizePixel().Width() == rShadowBitmap.GetSizePixel().Height()
+ && (rShadowBitmap.GetSizePixel().Width()-1)%2 == 0
+ && ((rShadowBitmap.GetSizePixel().Width()-1)/2)%2 == 1)
+ {
+ mbIsValid = true;
+ }
+ else
+ {
+ OSL_ASSERT(rShadowBitmap.GetSizePixel().Width() == rShadowBitmap.GetSizePixel().Height());
+ OSL_ASSERT((rShadowBitmap.GetSizePixel().Width()-1)%2 == 0);
+ OSL_ASSERT(((rShadowBitmap.GetSizePixel().Width()-1)/2)%2 == 1);
+ }
+}
+
+FramePainter::~FramePainter()
+{
+}
+
+void FramePainter::PaintFrame (
+ OutputDevice& rDevice,
+ const ::tools::Rectangle& rBox) const
+{
+ if ( ! mbIsValid)
+ return;
+
+ // Paint the shadow.
+ maTopLeft.PaintCorner(rDevice, rBox.TopLeft());
+ maTopRight.PaintCorner(rDevice, rBox.TopRight());
+ maBottomLeft.PaintCorner(rDevice, rBox.BottomLeft());
+ maBottomRight.PaintCorner(rDevice, rBox.BottomRight());
+ maLeft.PaintSide(rDevice, rBox.TopLeft(), rBox.BottomLeft(), maTopLeft, maBottomLeft);
+ maRight.PaintSide(rDevice, rBox.TopRight(), rBox.BottomRight(), maTopRight, maBottomRight);
+ maTop.PaintSide(rDevice, rBox.TopLeft(), rBox.TopRight(), maTopLeft, maTopRight);
+ maBottom.PaintSide(rDevice, rBox.BottomLeft(), rBox.BottomRight(), maBottomLeft, maBottomRight);
+ maCenter.PaintCenter(rDevice,rBox);
+}
+
+void FramePainter::AdaptColor (
+ const Color aNewColor)
+{
+ // Get the source color.
+ if (maCenter.maBitmap.IsEmpty())
+ return;
+ const Color aSourceColor = maCenter.maBitmap.GetPixelColor(0,0);
+
+ // Erase the center bitmap.
+ maCenter.maBitmap.SetEmpty();
+
+ // Replace the color in all bitmaps.
+ maTopLeft.maBitmap.Replace(aSourceColor, aNewColor);
+ maTop.maBitmap.Replace(aSourceColor, aNewColor);
+ maTopRight.maBitmap.Replace(aSourceColor, aNewColor);
+ maLeft.maBitmap.Replace(aSourceColor, aNewColor);
+ maCenter.maBitmap.Replace(aSourceColor, aNewColor);
+ maRight.maBitmap.Replace(aSourceColor, aNewColor);
+ maBottomLeft.maBitmap.Replace(aSourceColor, aNewColor);
+ maBottom.maBitmap.Replace(aSourceColor, aNewColor);
+ maBottomRight.maBitmap.Replace(aSourceColor, aNewColor);
+}
+
+//===== FramePainter::OffsetBitmap ============================================
+
+FramePainter::OffsetBitmap::OffsetBitmap (
+ const BitmapEx& rBitmap,
+ const sal_Int32 nHorizontalPosition,
+ const sal_Int32 nVerticalPosition)
+{
+ OSL_ASSERT(nHorizontalPosition>=-1 && nHorizontalPosition<=+1);
+ OSL_ASSERT(nVerticalPosition>=-1 && nVerticalPosition<=+1);
+
+ const sal_Int32 nS (1);
+ const sal_Int32 nC (::std::max<sal_Int32>(0,(rBitmap.GetSizePixel().Width()-nS)/2));
+ const sal_Int32 nO (nC/2);
+
+ const Point aOrigin(
+ nHorizontalPosition<0 ? 0 : (nHorizontalPosition == 0 ? nC : nC+nS),
+ nVerticalPosition<0 ? 0 : (nVerticalPosition == 0 ? nC : nC+nS));
+ const Size aSize(
+ nHorizontalPosition==0 ? nS : nC,
+ nVerticalPosition==0 ? nS : nC);
+ maBitmap = BitmapEx(rBitmap, aOrigin, aSize);
+ if (maBitmap.IsEmpty())
+ return;
+ maOffset = Point(
+ nHorizontalPosition<0 ? -nO : nHorizontalPosition>0 ? -nO : 0,
+ nVerticalPosition<0 ? -nO : nVerticalPosition>0 ? -nO : 0);
+
+ // Enlarge the side bitmaps so that painting the frame requires less
+ // paint calls.
+ const sal_Int32 nSideBitmapSize (64);
+ if (nHorizontalPosition == 0 && nVerticalPosition == 0)
+ {
+ maBitmap.Scale(Size(nSideBitmapSize,nSideBitmapSize));
+ }
+ else if (nHorizontalPosition == 0)
+ {
+ maBitmap.Scale(Size(nSideBitmapSize,aSize.Height()));
+ }
+ else if (nVerticalPosition == 0)
+ {
+ maBitmap.Scale(Size(maBitmap.GetSizePixel().Width(), nSideBitmapSize));
+ }
+}
+
+void FramePainter::OffsetBitmap::PaintCorner (
+ OutputDevice& rDevice,
+ const Point& rAnchor) const
+{
+ if ( ! maBitmap.IsEmpty())
+ rDevice.DrawBitmapEx(rAnchor+maOffset, maBitmap);
+}
+
+void FramePainter::OffsetBitmap::PaintSide (
+ OutputDevice& rDevice,
+ const Point& rAnchor1,
+ const Point& rAnchor2,
+ const OffsetBitmap& rCornerBitmap1,
+ const OffsetBitmap& rCornerBitmap2) const
+{
+ if (maBitmap.IsEmpty())
+ return;
+
+ const Size aBitmapSize (maBitmap.GetSizePixel());
+ if (rAnchor1.Y() == rAnchor2.Y())
+ {
+ // Side is horizontal.
+ const sal_Int32 nY (rAnchor1.Y() + maOffset.Y());
+ const sal_Int32 nLeft (
+ rAnchor1.X()
+ + rCornerBitmap1.maBitmap.GetSizePixel().Width()
+ + rCornerBitmap1.maOffset.X());
+ const sal_Int32 nRight (
+ rAnchor2.X()
+ + rCornerBitmap2.maOffset.X()
+ - 1);
+ for (sal_Int32 nX=nLeft; nX<=nRight; nX+=aBitmapSize.Width())
+ {
+ rDevice.DrawBitmapEx(
+ Point(nX,nY),
+ Size(std::min(aBitmapSize.Width(),static_cast<::tools::Long>(nRight-nX+1)),aBitmapSize.Height()),
+ maBitmap);
+ }
+ }
+ else if (rAnchor1.X() == rAnchor2.X())
+ {
+ // Side is vertical.
+ const sal_Int32 nX (rAnchor1.X() + maOffset.X());
+ const sal_Int32 nTop (
+ rAnchor1.Y()
+ + rCornerBitmap1.maBitmap.GetSizePixel().Height()
+ + rCornerBitmap1.maOffset.Y());
+ const sal_Int32 nBottom (
+ rAnchor2.Y()
+ + rCornerBitmap2.maOffset.Y()
+ - 1);
+ for (sal_Int32 nY=nTop; nY<=nBottom; nY+=aBitmapSize.Height())
+ {
+ rDevice.DrawBitmapEx(
+ Point(nX,nY),
+ Size(aBitmapSize.Width(), std::min(aBitmapSize.Height(), static_cast<::tools::Long>(nBottom-nY+1))),
+ maBitmap);
+ }
+ }
+ else
+ {
+ // Diagonal sides indicates an error.
+ OSL_ASSERT(false);
+ }
+}
+
+void FramePainter::OffsetBitmap::PaintCenter (
+ OutputDevice& rDevice,
+ const ::tools::Rectangle& rBox) const
+{
+ const Size aBitmapSize (maBitmap.GetSizePixel());
+ for (::tools::Long nY=rBox.Top(); nY<=rBox.Bottom(); nY+=aBitmapSize.Height())
+ for (::tools::Long nX=rBox.Left(); nX<=rBox.Right(); nX+=aBitmapSize.Width())
+ rDevice.DrawBitmapEx(
+ Point(nX,nY),
+ Size(
+ ::std::min(aBitmapSize.Width(), rBox.Right()-nX+1),
+ std::min(aBitmapSize.Height(), rBox.Bottom()-nY+1)),
+ maBitmap);
+}
+
+} // end of namespace sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlsFramePainter.hxx b/sd/source/ui/slidesorter/view/SlsFramePainter.hxx
new file mode 100644
index 000000000..9398cb94e
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlsFramePainter.hxx
@@ -0,0 +1,109 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <vcl/bitmapex.hxx>
+
+namespace sd::slidesorter::view {
+
+class FramePainter
+{
+public:
+ explicit FramePainter (const BitmapEx& rBitmap);
+ ~FramePainter();
+
+ /** Paint a border around the given box by using a set of bitmaps for
+ the corners and sides.
+ */
+ void PaintFrame (OutputDevice&rDevice, const ::tools::Rectangle& rBox) const;
+
+ /** Special functionality that takes the color from the center
+ bitmap and replaces that color in all bitmaps by the given new
+ color. Alpha values are not modified.
+ The center bitmap is erased.
+ */
+ void AdaptColor (const Color aNewColor);
+
+private:
+ /** Bitmap with offset that is used when the bitmap is painted. The bitmap
+ */
+ class OffsetBitmap {
+ public:
+ BitmapEx maBitmap;
+ Point maOffset;
+
+ /** Create one of the eight shadow bitmaps from one that combines
+ them all. This larger bitmap is expected to have dimension NxN
+ with N=1+2*M. Of this larger bitmap there are created four
+ corner bitmaps of size 2*M x 2*M and four side bitmaps of sizes
+ 1xM (top and bottom) and Mx1 (left and right). The corner
+ bitmaps have each one quadrant of size MxM that is painted under
+ the interior of the frame.
+ @param rBitmap
+ The larger bitmap of which the eight shadow bitmaps are cut
+ out from.
+ @param nHorizontalPosition
+ Valid values are -1 (left), 0 (center), and +1 (right).
+ @param nVerticalPosition
+ Valid values are -1 (top), 0 (center), and +1 (bottom).
+ */
+ OffsetBitmap (
+ const BitmapEx& rBitmap,
+ const sal_Int32 nHorizontalPosition,
+ const sal_Int32 nVerticalPosition);
+
+ /** Use the given device to paint the bitmap at the location that is
+ the sum of the given anchor and the internal offset.
+ */
+ void PaintCorner (OutputDevice& rDevice, const Point& rAnchor) const;
+
+ /** Use the given device to paint the bitmap stretched between the
+ two given locations. Offsets of the adjacent corner bitmaps and
+ the offset of the side bitmap are used to determine the area
+ that is to be filled with the side bitmap.
+ */
+ void PaintSide (
+ OutputDevice& rDevice,
+ const Point& rAnchor1,
+ const Point& rAnchor2,
+ const OffsetBitmap& rCornerBitmap1,
+ const OffsetBitmap& rCornerBitmap2) const;
+
+ /** Fill the given rectangle with the bitmap.
+ */
+ void PaintCenter (
+ OutputDevice& rDevice,
+ const ::tools::Rectangle& rBox) const;
+ };
+ OffsetBitmap maTopLeft;
+ OffsetBitmap maTop;
+ OffsetBitmap maTopRight;
+ OffsetBitmap maLeft;
+ OffsetBitmap maRight;
+ OffsetBitmap maBottomLeft;
+ OffsetBitmap maBottom;
+ OffsetBitmap maBottomRight;
+ OffsetBitmap maCenter;
+ bool mbIsValid;
+};
+
+} // end of namespace sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlsInsertAnimator.cxx b/sd/source/ui/slidesorter/view/SlsInsertAnimator.cxx
new file mode 100644
index 000000000..361c55f05
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlsInsertAnimator.cxx
@@ -0,0 +1,428 @@
+/* -*- 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 <view/SlsInsertAnimator.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsAnimationFunction.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsLayouter.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <SlideSorter.hxx>
+#include <Window.hxx>
+#include <osl/diagnose.h>
+
+#include <memory>
+#include <set>
+
+namespace sd::slidesorter::view {
+
+namespace {
+
+class PageObjectRun;
+
+class AnimatorAccess
+{
+public:
+ virtual void AddRun (const std::shared_ptr<PageObjectRun>& rRun) = 0;
+ virtual void RemoveRun (const std::shared_ptr<PageObjectRun>& rRun) = 0;
+ virtual model::SlideSorterModel& GetModel () const = 0;
+ virtual view::SlideSorterView& GetView () const = 0;
+ virtual std::shared_ptr<controller::Animator> GetAnimator () = 0;
+ virtual VclPtr<sd::Window> GetContentWindow () = 0;
+
+protected:
+ ~AnimatorAccess() COVERITY_NOEXCEPT_FALSE {}
+};
+
+/** Controller of the position offsets of all page objects in one row or one
+ column.
+*/
+class PageObjectRun : public std::enable_shared_from_this<PageObjectRun>
+{
+public:
+ PageObjectRun (
+ AnimatorAccess& rAnimatorAccess,
+ const sal_Int32 nRunIndex,
+ const sal_Int32 nStartIndex,
+ const sal_Int32 nEndIndex);
+
+ void operator () (const double nTime);
+
+ void UpdateOffsets(
+ const InsertPosition& rInsertPosition,
+ const view::Layouter& GetLayouter);
+ void ResetOffsets (const controller::Animator::AnimationMode eMode);
+
+ /// Index of the row or column that this run represents.
+ sal_Int32 mnRunIndex;
+ /// The index at which to make place for the insertion indicator (-1 for
+ /// no indicator).
+ sal_Int32 mnLocalInsertIndex;
+ /// Index of the first page in the run.
+ sal_Int32 mnStartIndex;
+ /// Index of the last page in the run.
+ sal_Int32 mnEndIndex;
+ /// Offset of each item in the run at the start of the current animation.
+ ::std::vector<Point> maStartOffset;
+ /// Target offset of each item in the run at the end of the current animation.
+ ::std::vector<Point> maEndOffset;
+ /// Time at which the current animation started.
+ double mnStartTime;
+
+ class Comparator
+ {
+ public: bool operator() (
+ const std::shared_ptr<PageObjectRun>& rpRunA,
+ const std::shared_ptr<PageObjectRun>& rpRunB) const
+ {
+ return rpRunA->mnRunIndex < rpRunB->mnRunIndex;
+ }
+ };
+private:
+ controller::Animator::AnimationId mnAnimationId;
+ AnimatorAccess& mrAnimatorAccess;
+ ::std::function<double (double)> maAccelerationFunction;
+
+ void RestartAnimation();
+};
+typedef std::shared_ptr<PageObjectRun> SharedPageObjectRun;
+
+Point Blend (const Point& rPointA, const Point& rPointB, const double nT)
+{
+ return Point(
+ sal_Int32(rPointA.X() * (1-nT) + rPointB.X() * nT),
+ sal_Int32(rPointA.Y() * (1-nT) + rPointB.Y() * nT));
+}
+
+} // end of anonymous namespace
+
+class InsertAnimator::Implementation : public AnimatorAccess
+{
+public:
+ explicit Implementation (SlideSorter& rSlideSorter);
+ virtual ~Implementation();
+
+ void SetInsertPosition (
+ const InsertPosition& rInsertPosition,
+ const controller::Animator::AnimationMode eAnimationMode);
+
+ virtual void AddRun (const std::shared_ptr<PageObjectRun>& rRun) override;
+ virtual void RemoveRun (const std::shared_ptr<PageObjectRun>& rRun) override;
+
+ virtual model::SlideSorterModel& GetModel() const override { return mrModel; }
+ virtual view::SlideSorterView& GetView() const override { return mrView; }
+ virtual std::shared_ptr<controller::Animator> GetAnimator() override { return mpAnimator; }
+ virtual VclPtr<sd::Window> GetContentWindow() override { return mrSlideSorter.GetContentWindow(); }
+
+private:
+ model::SlideSorterModel& mrModel;
+ view::SlideSorterView& mrView;
+ SlideSorter& mrSlideSorter;
+ std::shared_ptr<controller::Animator> mpAnimator;
+ typedef ::std::set<SharedPageObjectRun, PageObjectRun::Comparator> RunContainer;
+ RunContainer maRuns;
+ InsertPosition maInsertPosition;
+
+ SharedPageObjectRun GetRun (
+ view::Layouter const & rLayouter,
+ const InsertPosition& rInsertPosition);
+ RunContainer::const_iterator FindRun (const sal_Int32 nRunIndex) const;
+};
+
+//===== InsertAnimator ========================================================
+
+InsertAnimator::InsertAnimator (SlideSorter& rSlideSorter)
+ : mpImplementation(std::make_shared<Implementation>(rSlideSorter))
+{
+}
+
+void InsertAnimator::SetInsertPosition (const InsertPosition& rInsertPosition)
+{
+ mpImplementation->SetInsertPosition(rInsertPosition, controller::Animator::AM_Animated);
+}
+
+void InsertAnimator::Reset (const controller::Animator::AnimationMode eMode)
+{
+ mpImplementation->SetInsertPosition(InsertPosition(), eMode);
+}
+
+//===== InsertAnimator::Implementation ========================================
+
+InsertAnimator::Implementation::Implementation (SlideSorter& rSlideSorter)
+ : mrModel(rSlideSorter.GetModel()),
+ mrView(rSlideSorter.GetView()),
+ mrSlideSorter(rSlideSorter),
+ mpAnimator(rSlideSorter.GetController().GetAnimator())
+{
+}
+
+InsertAnimator::Implementation::~Implementation()
+{
+ SetInsertPosition(InsertPosition(), controller::Animator::AM_Immediate);
+}
+
+void InsertAnimator::Implementation::SetInsertPosition (
+ const InsertPosition& rInsertPosition,
+ const controller::Animator::AnimationMode eMode)
+{
+ if (maInsertPosition == rInsertPosition)
+ return;
+
+ SharedPageObjectRun pOldRun (GetRun(mrView.GetLayouter(), maInsertPosition));
+ SharedPageObjectRun pCurrentRun (GetRun(mrView.GetLayouter(), rInsertPosition));
+ maInsertPosition = rInsertPosition;
+
+ // When the new insert position is in a different run then move the page
+ // objects in the old run to their default positions.
+ if (pOldRun != pCurrentRun && pOldRun)
+ pOldRun->ResetOffsets(eMode);
+
+ if (pCurrentRun)
+ {
+ pCurrentRun->UpdateOffsets(rInsertPosition, mrView.GetLayouter());
+ }
+}
+
+SharedPageObjectRun InsertAnimator::Implementation::GetRun (
+ view::Layouter const & rLayouter,
+ const InsertPosition& rInsertPosition)
+{
+ const sal_Int32 nRow (rInsertPosition.GetRow());
+ if (nRow < 0)
+ return SharedPageObjectRun();
+
+ RunContainer::const_iterator iRun (maRuns.end());
+ if (rLayouter.GetColumnCount() == 1)
+ {
+ // There is only one run that contains all slides.
+ if (maRuns.empty())
+ maRuns.insert(std::make_shared<PageObjectRun>(
+ *this,
+ 0,
+ 0,
+ mrModel.GetPageCount()-1));
+ iRun = maRuns.begin();
+ }
+ else
+ {
+ iRun = FindRun(nRow);
+ if (iRun == maRuns.end())
+ {
+ // Create a new run.
+ const sal_Int32 nStartIndex (rLayouter.GetIndex(nRow, 0));
+ const sal_Int32 nEndIndex (rLayouter.GetIndex(nRow, rLayouter.GetColumnCount()-1));
+ if (nStartIndex <= nEndIndex)
+ {
+ iRun = maRuns.insert(std::make_shared<PageObjectRun>(
+ *this,
+ nRow,
+ nStartIndex,
+ nEndIndex)).first;
+ OSL_ASSERT(iRun != maRuns.end());
+ }
+ }
+ }
+
+ if (iRun != maRuns.end())
+ return *iRun;
+ else
+ return SharedPageObjectRun();
+}
+
+InsertAnimator::Implementation::RunContainer::const_iterator
+ InsertAnimator::Implementation::FindRun (const sal_Int32 nRunIndex) const
+{
+ return std::find_if(
+ maRuns.begin(),
+ maRuns.end(),
+ [nRunIndex] (std::shared_ptr<PageObjectRun> const& rRun)
+ { return rRun->mnRunIndex == nRunIndex; });
+}
+
+void InsertAnimator::Implementation::AddRun (const std::shared_ptr<PageObjectRun>& rRun)
+{
+ if (rRun)
+ {
+ maRuns.insert(rRun);
+ }
+ else
+ {
+ OSL_ASSERT(rRun);
+ }
+}
+
+void InsertAnimator::Implementation::RemoveRun (const std::shared_ptr<PageObjectRun>& rRun)
+{
+ if (rRun)
+ {
+ // Do not remove runs that show the space for the insertion indicator.
+ if (rRun->mnLocalInsertIndex == -1)
+ {
+ InsertAnimator::Implementation::RunContainer::const_iterator iRun (FindRun(rRun->mnRunIndex));
+ if (iRun != maRuns.end())
+ {
+ OSL_ASSERT(*iRun == rRun);
+ maRuns.erase(iRun);
+ }
+ }
+ }
+ else
+ {
+ OSL_ASSERT(rRun);
+ }
+}
+
+//===== PageObjectRun =========================================================
+
+PageObjectRun::PageObjectRun (
+ AnimatorAccess& rAnimatorAccess,
+ const sal_Int32 nRunIndex,
+ const sal_Int32 nStartIndex,
+ const sal_Int32 nEndIndex)
+ : mnRunIndex(nRunIndex),
+ mnLocalInsertIndex(-1),
+ mnStartIndex(nStartIndex),
+ mnEndIndex(nEndIndex),
+ mnStartTime(-1),
+ mnAnimationId(controller::Animator::NotAnAnimationId),
+ mrAnimatorAccess(rAnimatorAccess),
+ maAccelerationFunction(
+ controller::AnimationParametricFunction(
+ controller::AnimationBezierFunction (0.1,0.7)))
+{
+ maStartOffset.resize(nEndIndex - nStartIndex + 1);
+ maEndOffset.resize(nEndIndex - nStartIndex + 1);
+}
+
+void PageObjectRun::UpdateOffsets(
+ const InsertPosition& rInsertPosition,
+ const view::Layouter& rLayouter)
+{
+ const bool bIsVertical (rLayouter.GetColumnCount()==1);
+ const sal_Int32 nLocalInsertIndex(bIsVertical
+ ? rInsertPosition.GetRow()
+ : rInsertPosition.GetColumn());
+ if (nLocalInsertIndex == mnLocalInsertIndex)
+ return;
+
+ mnLocalInsertIndex = nLocalInsertIndex;
+
+ model::SlideSorterModel& rModel (mrAnimatorAccess.GetModel());
+ const sal_Int32 nRunLength (mnEndIndex - mnStartIndex + 1);
+ for (sal_Int32 nIndex=0; nIndex<nRunLength; ++nIndex)
+ {
+ model::SharedPageDescriptor pDescriptor(rModel.GetPageDescriptor(nIndex+mnStartIndex));
+ if (pDescriptor)
+ maStartOffset[nIndex] = pDescriptor->GetVisualState().GetLocationOffset();
+ maEndOffset[nIndex] = nIndex < mnLocalInsertIndex
+ ? rInsertPosition.GetLeadingOffset()
+ : rInsertPosition.GetTrailingOffset();
+ if (bIsVertical)
+ maEndOffset[nIndex].setX( 0 );
+ else
+ maEndOffset[nIndex].setY( 0 );
+ }
+ RestartAnimation();
+}
+
+void PageObjectRun::ResetOffsets (const controller::Animator::AnimationMode eMode)
+{
+ mnLocalInsertIndex = -1;
+ const sal_Int32 nRunLength (mnEndIndex - mnStartIndex + 1);
+ model::SlideSorterModel& rModel (mrAnimatorAccess.GetModel());
+ view::SlideSorterView& rView (mrAnimatorAccess.GetView());
+ for (sal_Int32 nIndex=0; nIndex<nRunLength; ++nIndex)
+ {
+ model::SharedPageDescriptor pDescriptor(rModel.GetPageDescriptor(nIndex+mnStartIndex));
+ if (pDescriptor)
+ {
+ if (eMode == controller::Animator::AM_Animated)
+ maStartOffset[nIndex] = pDescriptor->GetVisualState().GetLocationOffset();
+ else
+ {
+ const ::tools::Rectangle aOldBoundingBox (pDescriptor->GetBoundingBox());
+ pDescriptor->GetVisualState().SetLocationOffset(Point(0,0));
+ rView.RequestRepaint(aOldBoundingBox);
+ rView.RequestRepaint(pDescriptor);
+ }
+ }
+ maEndOffset[nIndex] = Point(0,0);
+ }
+ if (eMode == controller::Animator::AM_Animated)
+ RestartAnimation();
+ else
+ mrAnimatorAccess.RemoveRun(shared_from_this());
+}
+
+void PageObjectRun::RestartAnimation()
+{
+ // Stop the current animation.
+ if (mnAnimationId != controller::Animator::NotAnAnimationId)
+ {
+ mrAnimatorAccess.GetAnimator()->RemoveAnimation(mnAnimationId);
+ }
+
+ // Restart the animation.
+ mrAnimatorAccess.AddRun(shared_from_this());
+ auto sharedThis(shared_from_this());
+ mnAnimationId = mrAnimatorAccess.GetAnimator()->AddAnimation(
+ [this] (double const val) { (*this)(val); },
+ [sharedThis] () { sharedThis->mrAnimatorAccess.RemoveRun(sharedThis); }
+ );
+}
+
+void PageObjectRun::operator () (const double nGlobalTime)
+{
+ if (mnStartTime < 0)
+ mnStartTime = nGlobalTime;
+
+ double nLocalTime (nGlobalTime - mnStartTime);
+ if (nLocalTime > 1.0)
+ nLocalTime = 1.0;
+ nLocalTime = maAccelerationFunction(nLocalTime);
+
+ model::SlideSorterModel& rModel (mrAnimatorAccess.GetModel());
+ view::SlideSorterView& rView (mrAnimatorAccess.GetView());
+ for (sal_Int32 nIndex=mnStartIndex; nIndex<=mnEndIndex; ++nIndex)
+ {
+ model::SharedPageDescriptor pDescriptor (rModel.GetPageDescriptor(nIndex));
+ if ( ! pDescriptor)
+ continue;
+ const ::tools::Rectangle aOldBoundingBox (pDescriptor->GetBoundingBox());
+ pDescriptor->GetVisualState().SetLocationOffset(
+ Blend(
+ maStartOffset[nIndex-mnStartIndex],
+ maEndOffset[nIndex-mnStartIndex],
+ nLocalTime));
+
+ // Request a repaint of the old and new bounding box (which largely overlap.)
+ rView.RequestRepaint(aOldBoundingBox);
+ rView.RequestRepaint(pDescriptor);
+ }
+
+ // Call Flush to make
+ // a) animations a bit more smooth and
+ // b) on Mac without the Flush a Reset of the page locations is not properly
+ // visualized when the mouse leaves the window during drag-and-drop.
+ mrAnimatorAccess.GetContentWindow()->GetOutDev()->Flush();
+}
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx b/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx
new file mode 100644
index 000000000..c1eb0ea90
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx
@@ -0,0 +1,360 @@
+/* -*- 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 <view/SlsInsertionIndicatorOverlay.hxx>
+
+#include <SlideSorter.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsLayouter.hxx>
+#include <view/SlsPageObjectLayouter.hxx>
+#include <view/SlsTheme.hxx>
+#include "SlsFramePainter.hxx"
+#include "SlsLayeredDevice.hxx"
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <Window.hxx>
+
+#include <o3tl/safeint.hxx>
+#include <rtl/math.hxx>
+#include <vcl/virdev.hxx>
+#include <basegfx/range/b2drectangle.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+
+namespace {
+
+const double gnPreviewOffsetScale = 1.0 / 8.0;
+
+::tools::Rectangle GrowRectangle (const ::tools::Rectangle& rBox, const sal_Int32 nOffset)
+{
+ return ::tools::Rectangle (
+ rBox.Left() - nOffset,
+ rBox.Top() - nOffset,
+ rBox.Right() + nOffset,
+ rBox.Bottom() + nOffset);
+}
+
+sal_Int32 RoundToInt (const double nValue) { return sal_Int32(::rtl::math::round(nValue)); }
+
+} // end of anonymous namespace
+
+namespace sd::slidesorter::view {
+
+//===== InsertionIndicatorOverlay ===========================================
+
+const sal_Int32 gnShadowBorder = 3;
+const sal_Int32 gnLayerIndex = 2;
+
+InsertionIndicatorOverlay::InsertionIndicatorOverlay (SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter),
+ mbIsVisible(false),
+ mpShadowPainter(
+ new FramePainter(mrSlideSorter.GetTheme()->GetIcon(Theme::Icon_RawInsertShadow)))
+{
+}
+
+InsertionIndicatorOverlay::~InsertionIndicatorOverlay()
+{
+ // cid#1491947 silence Uncaught exception
+ suppress_fun_call_w_exception(Hide());
+}
+
+void InsertionIndicatorOverlay::Create (const SdTransferable* pTransferable)
+{
+ if (pTransferable == nullptr)
+ return;
+
+ std::shared_ptr<controller::TransferableData> pData (
+ controller::TransferableData::GetFromTransferable(pTransferable));
+ if ( ! pData)
+ return;
+ sal_Int32 nSelectionCount (0);
+ if (pTransferable->HasPageBookmarks())
+ nSelectionCount = pTransferable->GetPageBookmarks().size();
+ else
+ {
+ DrawDocShell* pDataDocShell = dynamic_cast<DrawDocShell*>(pTransferable->GetDocShell().get());
+ if (pDataDocShell != nullptr)
+ {
+ SdDrawDocument* pDataDocument = pDataDocShell->GetDoc();
+ if (pDataDocument != nullptr)
+ nSelectionCount = pDataDocument->GetSdPageCount(PageKind::Standard);
+ }
+ }
+ Create(pData->GetRepresentatives(), nSelectionCount);
+}
+
+void InsertionIndicatorOverlay::Create (
+ const ::std::vector<controller::TransferableData::Representative>& rRepresentatives,
+ const sal_Int32 nSelectionCount)
+{
+ view::Layouter& rLayouter (mrSlideSorter.GetView().GetLayouter());
+ const std::shared_ptr<view::PageObjectLayouter>& pPageObjectLayouter (
+ rLayouter.GetPageObjectLayouter());
+ std::shared_ptr<view::Theme> pTheme (mrSlideSorter.GetTheme());
+ const Size aOriginalPreviewSize (pPageObjectLayouter->GetPreviewSize());
+
+ const double nPreviewScale (0.5);
+ const Size aPreviewSize (
+ RoundToInt(aOriginalPreviewSize.Width()*nPreviewScale),
+ RoundToInt(aOriginalPreviewSize.Height()*nPreviewScale));
+ const sal_Int32 nOffset (
+ RoundToInt(std::min(aPreviewSize.Width(),aPreviewSize.Height()) * gnPreviewOffsetScale));
+
+ // Determine size and offset depending on the number of previews.
+ sal_Int32 nCount (rRepresentatives.size());
+ if (nCount > 0)
+ --nCount;
+ Size aIconSize(
+ aPreviewSize.Width() + 2 * gnShadowBorder + nCount*nOffset,
+ aPreviewSize.Height() + 2 * gnShadowBorder + nCount*nOffset);
+
+ // Create virtual devices for bitmap and mask whose bitmaps later be
+ // combined to form the BitmapEx of the icon.
+ ScopedVclPtrInstance<VirtualDevice> pContent(
+ *mrSlideSorter.GetContentWindow()->GetOutDev(), DeviceFormat::DEFAULT, DeviceFormat::DEFAULT);
+ pContent->SetOutputSizePixel(aIconSize);
+
+ pContent->SetFillColor();
+ pContent->SetLineColor(pTheme->GetColor(Theme::Color_PreviewBorder));
+ const Point aOffset = PaintRepresentatives(*pContent, aPreviewSize, nOffset, rRepresentatives);
+
+ PaintPageCount(*pContent, nSelectionCount, aPreviewSize, aOffset);
+
+ maIcon = pContent->GetBitmapEx(Point(0,0), aIconSize);
+ maIcon.Scale(aIconSize);
+}
+
+Point InsertionIndicatorOverlay::PaintRepresentatives (
+ OutputDevice& rContent,
+ const Size& rPreviewSize,
+ const sal_Int32 nOffset,
+ const ::std::vector<controller::TransferableData::Representative>& rRepresentatives) const
+{
+ const Point aOffset (0,rRepresentatives.size()==1 ? -nOffset : 0);
+
+ // Paint the pages.
+ Point aPageOffset (0,0);
+ double nTransparency (0);
+ const BitmapEx aExclusionOverlay (mrSlideSorter.GetTheme()->GetIcon(Theme::Icon_HideSlideOverlay));
+ for (sal_Int32 nIndex=2; nIndex>=0; --nIndex)
+ {
+ if (rRepresentatives.size() <= o3tl::make_unsigned(nIndex))
+ continue;
+ switch(nIndex)
+ {
+ case 0 :
+ aPageOffset = Point(0, nOffset);
+ nTransparency = 0.85;
+ break;
+ case 1:
+ aPageOffset = Point(nOffset, 0);
+ nTransparency = 0.75;
+ break;
+ case 2:
+ aPageOffset = Point(2*nOffset, 2*nOffset);
+ nTransparency = 0.65;
+ break;
+ }
+ aPageOffset += aOffset;
+ aPageOffset.AdjustX(gnShadowBorder );
+ aPageOffset.AdjustY(gnShadowBorder );
+
+ // Paint the preview.
+ BitmapEx aPreview (rRepresentatives[nIndex].maBitmap);
+ aPreview.Scale(rPreviewSize, BmpScaleFlag::BestQuality);
+ rContent.DrawBitmapEx(aPageOffset, aPreview);
+
+ // When the page is marked as excluded from the slide show then
+ // paint an overlay that visualizes this.
+ if (rRepresentatives[nIndex].mbIsExcluded)
+ {
+ const vcl::Region aSavedClipRegion (rContent.GetClipRegion());
+ rContent.IntersectClipRegion(::tools::Rectangle(aPageOffset, rPreviewSize));
+ // Paint bitmap tiled over the preview to mark it as excluded.
+ const sal_Int32 nIconWidth (aExclusionOverlay.GetSizePixel().Width());
+ const sal_Int32 nIconHeight (aExclusionOverlay.GetSizePixel().Height());
+ if (nIconWidth>0 && nIconHeight>0)
+ {
+ for (::tools::Long nX=0; nX<rPreviewSize.Width(); nX+=nIconWidth)
+ for (::tools::Long nY=0; nY<rPreviewSize.Height(); nY+=nIconHeight)
+ rContent.DrawBitmapEx(Point(nX,nY)+aPageOffset, aExclusionOverlay);
+ }
+ rContent.SetClipRegion(aSavedClipRegion);
+ }
+
+ // Tone down the bitmap. The further back the darker it becomes.
+ ::tools::Rectangle aBox (
+ aPageOffset.X(),
+ aPageOffset.Y(),
+ aPageOffset.X()+rPreviewSize.Width()-1,
+ aPageOffset.Y()+rPreviewSize.Height()-1);
+ rContent.SetFillColor(COL_BLACK);
+ rContent.SetLineColor();
+ rContent.DrawTransparent(
+ basegfx::B2DHomMatrix(),
+ ::basegfx::B2DPolyPolygon(::basegfx::utils::createPolygonFromRect(
+ ::basegfx::B2DRectangle(aBox.Left(), aBox.Top(), aBox.Right()+1, aBox.Bottom()+1),
+ 0,
+ 0)),
+ nTransparency);
+
+ // Draw border around preview.
+ ::tools::Rectangle aBorderBox (GrowRectangle(aBox, 1));
+ rContent.SetLineColor(COL_GRAY);
+ rContent.SetFillColor();
+ rContent.DrawRect(aBorderBox);
+
+ // Draw shadow around preview.
+ mpShadowPainter->PaintFrame(rContent, aBorderBox);
+ }
+
+ return aPageOffset;
+}
+
+void InsertionIndicatorOverlay::PaintPageCount (
+ OutputDevice& rDevice,
+ const sal_Int32 nSelectionCount,
+ const Size& rPreviewSize,
+ const Point& rFirstPageOffset) const
+{
+ // Paint the number of slides.
+ std::shared_ptr<view::Theme> pTheme (mrSlideSorter.GetTheme());
+ std::shared_ptr<vcl::Font> pFont(Theme::GetFont(Theme::Font_PageCount, rDevice));
+ if (!pFont)
+ return;
+
+ OUString sNumber (OUString::number(nSelectionCount));
+
+ // Determine the size of the (painted) text and create a bounding
+ // box that centers the text on the first preview.
+ rDevice.SetFont(*pFont);
+ ::tools::Rectangle aTextBox;
+ rDevice.GetTextBoundRect(aTextBox, sNumber);
+ Point aTextOffset (aTextBox.TopLeft());
+ Size aTextSize (aTextBox.GetSize());
+ // Place text inside the first page preview.
+ Point aTextLocation(rFirstPageOffset);
+ // Center the text.
+ aTextLocation += Point(
+ (rPreviewSize.Width()-aTextBox.GetWidth())/2,
+ (rPreviewSize.Height()-aTextBox.GetHeight())/2);
+ aTextBox = ::tools::Rectangle(aTextLocation, aTextSize);
+
+ // Paint background, border and text.
+ static const sal_Int32 nBorder = 5;
+ rDevice.SetFillColor(pTheme->GetColor(Theme::Color_Selection));
+ rDevice.SetLineColor(pTheme->GetColor(Theme::Color_Selection));
+ rDevice.DrawRect(GrowRectangle(aTextBox, nBorder));
+
+ rDevice.SetFillColor();
+ rDevice.SetLineColor(pTheme->GetColor(Theme::Color_PageCountFontColor));
+ rDevice.DrawRect(GrowRectangle(aTextBox, nBorder-1));
+
+ rDevice.SetTextColor(pTheme->GetColor(Theme::Color_PageCountFontColor));
+ rDevice.DrawText(aTextBox.TopLeft()-aTextOffset, sNumber);
+}
+
+void InsertionIndicatorOverlay::SetLocation (const Point& rLocation)
+{
+ const Point aTopLeft (
+ rLocation - Point(
+ maIcon.GetSizePixel().Width()/2,
+ maIcon.GetSizePixel().Height()/2));
+ if (maLocation != aTopLeft)
+ {
+ const ::tools::Rectangle aOldBoundingBox (GetBoundingBox());
+
+ maLocation = aTopLeft;
+
+ if (mpLayerInvalidator && IsVisible())
+ {
+ mpLayerInvalidator->Invalidate(aOldBoundingBox);
+ mpLayerInvalidator->Invalidate(GetBoundingBox());
+ }
+ }
+}
+
+void InsertionIndicatorOverlay::Paint (
+ OutputDevice& rDevice,
+ const ::tools::Rectangle&)
+{
+ if ( ! IsVisible())
+ return;
+
+ rDevice.DrawImage(maLocation, Image(maIcon));
+}
+
+void InsertionIndicatorOverlay::SetLayerInvalidator (const SharedILayerInvalidator& rpInvalidator)
+{
+ mpLayerInvalidator = rpInvalidator;
+
+ if (mbIsVisible && mpLayerInvalidator)
+ mpLayerInvalidator->Invalidate(GetBoundingBox());
+}
+
+void InsertionIndicatorOverlay::Show()
+{
+ if ( mbIsVisible)
+ return;
+
+ mbIsVisible = true;
+
+ std::shared_ptr<LayeredDevice> pLayeredDevice (
+ mrSlideSorter.GetView().GetLayeredDevice());
+ if (pLayeredDevice)
+ {
+ pLayeredDevice->RegisterPainter(shared_from_this(), gnLayerIndex);
+ if (mpLayerInvalidator)
+ mpLayerInvalidator->Invalidate(GetBoundingBox());
+ }
+}
+
+void InsertionIndicatorOverlay::Hide()
+{
+ if (!mbIsVisible)
+ return;
+
+ mbIsVisible = false;
+
+ std::shared_ptr<LayeredDevice> pLayeredDevice (
+ mrSlideSorter.GetView().GetLayeredDevice());
+ if (pLayeredDevice)
+ {
+ if (mpLayerInvalidator)
+ mpLayerInvalidator->Invalidate(GetBoundingBox());
+ pLayeredDevice->RemovePainter(shared_from_this(), gnLayerIndex);
+ }
+}
+
+::tools::Rectangle InsertionIndicatorOverlay::GetBoundingBox() const
+{
+ return ::tools::Rectangle(maLocation, maIcon.GetSizePixel());
+}
+
+Size InsertionIndicatorOverlay::GetSize() const
+{
+ return Size(
+ maIcon.GetSizePixel().Width() + 10,
+ maIcon.GetSizePixel().Height() + 10);
+}
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlsLayeredDevice.cxx b/sd/source/ui/slidesorter/view/SlsLayeredDevice.cxx
new file mode 100644
index 000000000..b41bbe307
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlsLayeredDevice.cxx
@@ -0,0 +1,491 @@
+/* -*- 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 "SlsLayeredDevice.hxx"
+#include <Window.hxx>
+
+#include <vcl/virdev.hxx>
+#include <sal/log.hxx>
+#include <o3tl/safeint.hxx>
+#include <osl/diagnose.h>
+
+#include <tools/gen.hxx>
+#include <tools/fract.hxx>
+
+#include <functional>
+
+namespace sd::slidesorter::view {
+
+namespace {
+const sal_Int32 gnMaximumLayerCount = 8;
+
+class LayerInvalidator : public ILayerInvalidator
+{
+public:
+ LayerInvalidator (
+ const std::shared_ptr<LayeredDevice>& rpLayeredDevice,
+ sd::Window *pTargetWindow,
+ const int nLayer)
+ : mpLayeredDevice(rpLayeredDevice),
+ mpTargetWindow(pTargetWindow),
+ mnLayer(nLayer)
+ {
+ }
+
+ virtual void Invalidate (const ::tools::Rectangle& rInvalidationBox) override
+ {
+ mpLayeredDevice->Invalidate(rInvalidationBox, mnLayer);
+ mpTargetWindow->Invalidate(rInvalidationBox);
+ }
+
+private:
+ const std::shared_ptr<LayeredDevice> mpLayeredDevice;
+ VclPtr<sd::Window> mpTargetWindow;
+ const int mnLayer;
+};
+
+void DeviceCopy (
+ vcl::RenderContext& rTargetDevice,
+ vcl::RenderContext const & rSourceDevice,
+ const ::tools::Rectangle& rBox)
+{
+ rTargetDevice.DrawOutDev(
+ rBox.TopLeft(),
+ rBox.GetSize(),
+ rBox.TopLeft(),
+ rBox.GetSize(),
+ rSourceDevice);
+}
+
+void ForAllRectangles (const vcl::Region& rRegion, const std::function<void (const ::tools::Rectangle&)>& aFunction)
+{
+ OSL_ASSERT(aFunction);
+ RectangleVector aRectangles;
+ rRegion.GetRegionRectangles(aRectangles);
+
+ if(aRectangles.empty())
+ {
+ aFunction(::tools::Rectangle());
+ }
+ else
+ {
+ for(const auto& rRect : aRectangles)
+ {
+ aFunction(rRect);
+ }
+
+ //Region aMutableRegionCopy (rRegion);
+ //RegionHandle aHandle(aMutableRegionCopy.BeginEnumRects());
+ //Rectangle aBox;
+ //while (aMutableRegionCopy.GetEnumRects(aHandle, aBox))
+ // aFunction(aBox);
+ //aMutableRegionCopy.EndEnumRects(aHandle);
+ }
+}
+
+class Layer
+{
+public:
+ Layer();
+ Layer(const Layer&) = delete;
+ Layer& operator=(const Layer&) = delete;
+
+ void Initialize (sd::Window *pTargetWindow);
+ void InvalidateRectangle (const ::tools::Rectangle& rInvalidationBox);
+ void InvalidateRegion (const vcl::Region& rInvalidationRegion);
+ void Validate (const MapMode& rMapMode);
+ void Repaint (
+ OutputDevice& rTargetDevice,
+ const ::tools::Rectangle& rRepaintRectangle);
+ void Resize (const Size& rSize);
+ void AddPainter (const SharedILayerPainter& rpPainter);
+ void RemovePainter (const SharedILayerPainter& rpPainter);
+ bool HasPainter() const;
+ void Dispose();
+
+private:
+ ScopedVclPtr<VirtualDevice> mpLayerDevice;
+ ::std::vector<SharedILayerPainter> maPainters;
+ vcl::Region maInvalidationRegion;
+
+ void ValidateRectangle (const ::tools::Rectangle& rBox);
+};
+typedef std::shared_ptr<Layer> SharedLayer;
+
+} // end of anonymous namespace
+
+class LayeredDevice::LayerContainer
+{
+public:
+ LayerContainer() {}
+
+ bool empty() const { return mvLayers.empty(); }
+
+ size_t size() const { return mvLayers.size(); }
+
+ const SharedLayer& back() const { return mvLayers.back(); }
+
+ ::std::vector<SharedLayer>::const_iterator begin() const { return mvLayers.begin(); }
+ ::std::vector<SharedLayer>::const_iterator end() const { return mvLayers.end(); }
+
+ void clear() { mvLayers.clear(); }
+
+ void pop_back() { mvLayers.pop_back(); }
+
+ void resize(size_t n) { mvLayers.resize(n); }
+
+ SharedLayer& operator[](size_t i) { return mvLayers[i]; }
+
+private:
+ ::std::vector<SharedLayer> mvLayers;
+};
+
+//===== LayeredDevice =========================================================
+
+LayeredDevice::LayeredDevice (const VclPtr<sd::Window>& pTargetWindow)
+ : mpTargetWindow(pTargetWindow),
+ mpLayers(new LayerContainer()),
+ mpBackBuffer(VclPtr<VirtualDevice>::Create(*mpTargetWindow->GetOutDev())),
+ maSavedMapMode(pTargetWindow->GetMapMode())
+{
+ mpBackBuffer->SetOutputSizePixel(mpTargetWindow->GetSizePixel());
+}
+
+LayeredDevice::~LayeredDevice()
+{
+}
+
+void LayeredDevice::Invalidate (
+ const ::tools::Rectangle& rInvalidationArea,
+ const sal_Int32 nLayer)
+{
+ if (nLayer<0 || o3tl::make_unsigned(nLayer)>=mpLayers->size())
+ {
+ OSL_ASSERT(nLayer>=0 && o3tl::make_unsigned(nLayer)<mpLayers->size());
+ return;
+ }
+
+ (*mpLayers)[nLayer]->InvalidateRectangle(rInvalidationArea);
+}
+
+void LayeredDevice::InvalidateAllLayers (const ::tools::Rectangle& rInvalidationArea)
+{
+ for (size_t nLayer=0; nLayer<mpLayers->size(); ++nLayer)
+ (*mpLayers)[nLayer]->InvalidateRectangle(rInvalidationArea);
+}
+
+void LayeredDevice::InvalidateAllLayers (const vcl::Region& rInvalidationRegion)
+{
+ for (size_t nLayer=0; nLayer<mpLayers->size(); ++nLayer)
+ (*mpLayers)[nLayer]->InvalidateRegion(rInvalidationRegion);
+}
+
+void LayeredDevice::RegisterPainter (
+ const SharedILayerPainter& rpPainter,
+ const sal_Int32 nLayer)
+{
+ OSL_ASSERT(mpLayers);
+ if ( ! rpPainter)
+ {
+ OSL_ASSERT(rpPainter);
+ return;
+ }
+ if (nLayer<0 || nLayer>=gnMaximumLayerCount)
+ {
+ OSL_ASSERT(nLayer>=0 && nLayer<gnMaximumLayerCount);
+ return;
+ }
+
+ // Provide the layers.
+ if (o3tl::make_unsigned(nLayer) >= mpLayers->size())
+ {
+ const sal_Int32 nOldLayerCount (mpLayers->size());
+ mpLayers->resize(nLayer+1);
+
+ for (size_t nIndex=nOldLayerCount; nIndex<mpLayers->size(); ++nIndex)
+ (*mpLayers)[nIndex] = std::make_shared<Layer>();
+ }
+
+ (*mpLayers)[nLayer]->AddPainter(rpPainter);
+ if (nLayer == 0)
+ (*mpLayers)[nLayer]->Initialize(mpTargetWindow);
+
+ rpPainter->SetLayerInvalidator(
+ std::make_shared<LayerInvalidator>(shared_from_this(),mpTargetWindow,nLayer));
+}
+
+void LayeredDevice::RemovePainter (
+ const SharedILayerPainter& rpPainter,
+ const sal_Int32 nLayer)
+{
+ if ( ! rpPainter)
+ {
+ OSL_ASSERT(rpPainter);
+ return;
+ }
+ if (nLayer<0 || o3tl::make_unsigned(nLayer)>=mpLayers->size())
+ {
+ OSL_ASSERT(nLayer>=0 && o3tl::make_unsigned(nLayer)<mpLayers->size());
+ return;
+ }
+
+ rpPainter->SetLayerInvalidator(SharedILayerInvalidator());
+
+ (*mpLayers)[nLayer]->RemovePainter(rpPainter);
+
+ // Remove top most layers that do not contain any painters.
+ while ( ! mpLayers->empty() && ! mpLayers->back()->HasPainter())
+ mpLayers->pop_back();
+}
+
+void LayeredDevice::Repaint (const vcl::Region& rRepaintRegion)
+{
+ // Validate the contents of all layers (that have their own devices.)
+ for (auto const& it : *mpLayers)
+ {
+ it->Validate(mpTargetWindow->GetMapMode());
+ }
+
+ ForAllRectangles(rRepaintRegion,
+ [this] (::tools::Rectangle const& r) { this->RepaintRectangle(r); });
+}
+
+void LayeredDevice::RepaintRectangle (const ::tools::Rectangle& rRepaintRectangle)
+{
+ if (mpLayers->empty())
+ return;
+ else if (mpLayers->size() == 1)
+ {
+ // Just copy the main layer into the target device.
+ (*mpLayers)[0]->Repaint(*mpTargetWindow->GetOutDev(), rRepaintRectangle);
+ }
+ else
+ {
+ // Paint all layers first into the back buffer (to avoid flickering
+ // due to synchronous paints) and then copy that into the target
+ // device.
+ mpBackBuffer->SetMapMode(mpTargetWindow->GetMapMode());
+ for (auto const& it : *mpLayers)
+ {
+ it->Repaint(*mpBackBuffer, rRepaintRectangle);
+ }
+ DeviceCopy(*mpTargetWindow->GetOutDev(), *mpBackBuffer, rRepaintRectangle);
+ }
+}
+
+void LayeredDevice::Resize()
+{
+ const Size aSize (mpTargetWindow->GetSizePixel());
+ mpBackBuffer->SetOutputSizePixel(aSize);
+ for (auto const& it : *mpLayers)
+ {
+ it->Resize(aSize);
+ }
+}
+
+void LayeredDevice::Dispose()
+{
+ for (auto const& it : *mpLayers)
+ {
+ it->Dispose();
+ }
+ mpLayers->clear();
+}
+
+bool LayeredDevice::HandleMapModeChange()
+{
+ const MapMode& rMapMode (mpTargetWindow->GetMapMode());
+ if (maSavedMapMode == rMapMode)
+ return false;
+
+ const ::tools::Rectangle aLogicWindowBox (
+ mpTargetWindow->PixelToLogic(::tools::Rectangle(Point(0,0), mpTargetWindow->GetSizePixel())));
+ if (maSavedMapMode.GetScaleX() != rMapMode.GetScaleX()
+ || maSavedMapMode.GetScaleY() != rMapMode.GetScaleY()
+ || maSavedMapMode.GetMapUnit() != rMapMode.GetMapUnit())
+ {
+ // When the scale has changed then we have to paint everything.
+ InvalidateAllLayers(aLogicWindowBox);
+ }
+ else if (maSavedMapMode.GetOrigin() != rMapMode.GetOrigin())
+ {
+ // Window has been scrolled. Adapt contents of backbuffers and
+ // layer devices.
+ const Point aDelta (rMapMode.GetOrigin() - maSavedMapMode.GetOrigin());
+ mpBackBuffer->CopyArea(
+ aLogicWindowBox.TopLeft(),
+ mpTargetWindow->PixelToLogic(Point(0,0), maSavedMapMode),
+ aLogicWindowBox.GetSize());
+
+ // Invalidate the area(s) that have been exposed.
+ const ::tools::Rectangle aWindowBox (Point(0,0), mpTargetWindow->GetSizePixel());
+ if (aDelta.Y() < 0)
+ InvalidateAllLayers(mpTargetWindow->PixelToLogic(::tools::Rectangle(
+ aWindowBox.Left(),
+ aWindowBox.Bottom()+aDelta.Y(),
+ aWindowBox.Right(),
+ aWindowBox.Bottom())));
+ else if (aDelta.Y() > 0)
+ InvalidateAllLayers(mpTargetWindow->PixelToLogic(::tools::Rectangle(
+ aWindowBox.Left(),
+ aWindowBox.Top(),
+ aWindowBox.Right(),
+ aWindowBox.Top()+aDelta.Y())));
+ if (aDelta.X() < 0)
+ InvalidateAllLayers(mpTargetWindow->PixelToLogic(::tools::Rectangle(
+ aWindowBox.Right()+aDelta.X(),
+ aWindowBox.Top(),
+ aWindowBox.Right(),
+ aWindowBox.Bottom())));
+ else if (aDelta.X() > 0)
+ InvalidateAllLayers(mpTargetWindow->PixelToLogic(::tools::Rectangle(
+ aWindowBox.Left(),
+ aWindowBox.Top(),
+ aWindowBox.Left()+aDelta.X(),
+ aWindowBox.Bottom())));
+ }
+ else
+ {
+ // Can this happen? Lets trigger a warning when it does.
+ OSL_ASSERT(false);
+ }
+
+ maSavedMapMode = rMapMode;
+
+ return true;
+}
+
+//===== Layer =================================================================
+
+Layer::Layer()
+{
+}
+
+void Layer::Initialize (sd::Window *pTargetWindow)
+{
+#if 0
+ (void)pTargetWindow;
+#else
+ if ( ! mpLayerDevice)
+ {
+ mpLayerDevice.disposeAndReset(VclPtr<VirtualDevice>::Create(*pTargetWindow->GetOutDev()));
+ mpLayerDevice->SetOutputSizePixel(pTargetWindow->GetSizePixel());
+ }
+#endif
+}
+
+void Layer::InvalidateRectangle (const ::tools::Rectangle& rInvalidationBox)
+{
+ maInvalidationRegion.Union(rInvalidationBox);
+}
+
+void Layer::InvalidateRegion (const vcl::Region& rInvalidationRegion)
+{
+ maInvalidationRegion.Union(rInvalidationRegion);
+}
+
+void Layer::Validate (const MapMode& rMapMode)
+{
+ if (mpLayerDevice && ! maInvalidationRegion.IsEmpty())
+ {
+ vcl::Region aRegion (maInvalidationRegion);
+ maInvalidationRegion.SetEmpty();
+
+ mpLayerDevice->SetMapMode(rMapMode);
+ ForAllRectangles(
+ aRegion,
+ [this] (::tools::Rectangle const& r) { return this->ValidateRectangle(r); });
+ }
+}
+
+void Layer::ValidateRectangle (const ::tools::Rectangle& rBox)
+{
+ if ( ! mpLayerDevice)
+ return;
+ const vcl::Region aSavedClipRegion (mpLayerDevice->GetClipRegion());
+ mpLayerDevice->IntersectClipRegion(rBox);
+
+ for (const auto& rxPainter : maPainters)
+ {
+ rxPainter->Paint(*mpLayerDevice, rBox);
+ }
+
+ mpLayerDevice->SetClipRegion(aSavedClipRegion);
+}
+
+void Layer::Repaint (
+ OutputDevice& rTargetDevice,
+ const ::tools::Rectangle& rRepaintRectangle)
+{
+ if (mpLayerDevice)
+ {
+ DeviceCopy(rTargetDevice, *mpLayerDevice, rRepaintRectangle);
+ }
+ else
+ {
+ for (auto const& it : maPainters)
+ {
+ it->Paint(rTargetDevice, rRepaintRectangle);
+ }
+ }
+}
+
+void Layer::Resize (const Size& rSize)
+{
+ if (mpLayerDevice)
+ {
+ mpLayerDevice->SetOutputSizePixel(rSize);
+ maInvalidationRegion = ::tools::Rectangle(Point(0,0), rSize);
+ }
+}
+
+void Layer::AddPainter (const SharedILayerPainter& rpPainter)
+{
+ OSL_ASSERT(::std::find(maPainters.begin(), maPainters.end(), rpPainter) == maPainters.end());
+
+ maPainters.push_back(rpPainter);
+}
+
+void Layer::RemovePainter (const SharedILayerPainter& rpPainter)
+{
+ const ::std::vector<SharedILayerPainter>::iterator iPainter (
+ ::std::find(maPainters.begin(), maPainters.end(), rpPainter));
+ if (iPainter != maPainters.end())
+ {
+ maPainters.erase(iPainter);
+ }
+ else
+ {
+ SAL_WARN("sd", "LayeredDevice::RemovePainter called for painter that is not registered");
+ }
+}
+
+bool Layer::HasPainter() const
+{
+ return !maPainters.empty();
+}
+
+void Layer::Dispose()
+{
+ maPainters.clear();
+}
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlsLayeredDevice.hxx b/sd/source/ui/slidesorter/view/SlsLayeredDevice.hxx
new file mode 100644
index 000000000..5ec0d0e9f
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlsLayeredDevice.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <view/SlsILayerPainter.hxx>
+
+#include <vcl/vclptr.hxx>
+#include <vcl/mapmod.hxx>
+
+#include <memory>
+
+namespace sd { class Window; }
+namespace tools { class Rectangle; }
+namespace vcl { class Region; }
+
+class VirtualDevice;
+
+namespace sd::slidesorter::view {
+
+/** A simple wrapper around an OutputDevice that provides support for
+ independent layers and buffering.
+ Each layer may contain any number of painters.
+*/
+class LayeredDevice
+ : public std::enable_shared_from_this<LayeredDevice>
+
+{
+public:
+ explicit LayeredDevice (const VclPtr<sd::Window>& pTargetWindow);
+ ~LayeredDevice ();
+
+ void Invalidate (
+ const ::tools::Rectangle& rInvalidationBox,
+ const sal_Int32 nLayer);
+ void InvalidateAllLayers (
+ const ::tools::Rectangle& rInvalidationBox);
+ void InvalidateAllLayers (
+ const vcl::Region& rInvalidationRegion);
+
+ void RegisterPainter (
+ const SharedILayerPainter& rPainter,
+ const sal_Int32 nLayer);
+
+ void RemovePainter (
+ const SharedILayerPainter& rPainter,
+ const sal_Int32 nLayer);
+
+ bool HandleMapModeChange();
+ void Repaint (const vcl::Region& rRepaintRegion);
+
+ void Resize();
+
+ void Dispose();
+
+private:
+ VclPtr<sd::Window> mpTargetWindow;
+ class LayerContainer;
+ std::unique_ptr<LayerContainer> mpLayers;
+ ScopedVclPtr<VirtualDevice> mpBackBuffer;
+ MapMode maSavedMapMode;
+
+ void RepaintRectangle (const ::tools::Rectangle& rRepaintRectangle);
+};
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlsLayouter.cxx b/sd/source/ui/slidesorter/view/SlsLayouter.cxx
new file mode 100644
index 000000000..21f0be13c
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlsLayouter.cxx
@@ -0,0 +1,1225 @@
+/* -*- 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 <view/SlsPageObjectLayouter.hxx>
+#include <view/SlsTheme.hxx>
+#include <view/SlsLayouter.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <Window.hxx>
+#include <osl/diagnose.h>
+
+namespace sd::slidesorter::view {
+
+class Layouter::Implementation
+{
+public:
+ VclPtr<sd::Window> mpWindow;
+ static const sal_Int32 mnRequestedLeftBorder = 5;
+ static const sal_Int32 mnRequestedRightBorder = 5;
+ static const sal_Int32 mnRequestedTopBorder = 5;
+ static const sal_Int32 mnRequestedBottomBorder = 5;
+ sal_Int32 mnLeftBorder;
+ sal_Int32 mnRightBorder;
+ sal_Int32 mnTopBorder;
+ sal_Int32 mnBottomBorder;
+ static const sal_Int32 gnVerticalGap = 10 - 2*Theme_FocusIndicatorWidth;
+ static const sal_Int32 gnHorizontalGap = 10 - 2*Theme_FocusIndicatorWidth;
+ Size maMinimalSize;
+ Size maPreferredSize;
+ Size maMaximalSize;
+ sal_Int32 mnMinimalColumnCount;
+ sal_Int32 mnMaximalColumnCount;
+ sal_Int32 mnPageCount;
+ sal_Int32 mnColumnCount;
+ sal_Int32 mnRowCount;
+ /// The maximum number of columns. Can only be larger than the current
+ /// number of columns when there are not enough pages to fill all
+ /// available columns.
+ sal_Int32 mnMaxColumnCount;
+ /// The maximum number of rows. Can only be larger than the current
+ /// number of rows when there are not enough pages to fill all available
+ /// rows.
+ sal_Int32 mnMaxRowCount;
+ Size maPageObjectSize;
+ std::shared_ptr<PageObjectLayouter> mpPageObjectLayouter;
+ std::shared_ptr<view::Theme> mpTheme;
+
+ /** Specify how the gap between two page objects is associated with the
+ page objects.
+ */
+ enum GapMembership {
+ GM_NONE, // Gap is not associated with any page object.
+ GM_PREVIOUS, // The whole gap is associated with the previous page
+ // object (left or above the gap.)
+ GM_BOTH, // Half of the gap is associated with previous, half
+ // with the next page object.
+ GM_NEXT, // The whole gap is associated with the next page
+ // object (right or below the gap.)
+ GM_PAGE_BORDER
+ };
+
+ static Implementation* Create (
+ const Implementation& rImplementation,
+ const Layouter::Orientation eOrientation);
+
+ virtual Layouter::Orientation GetOrientation() const = 0;
+
+ bool Rearrange (
+ const Size& rWindowSize,
+ const Size& rPreviewModelSize,
+ const sal_uInt32 nPageCount);
+
+ /** Calculate the row that the point with the given vertical coordinate
+ is over. The horizontal component is ignored.
+ @param nYPosition
+ Vertical position in model coordinates.
+ @param bIncludeBordersAndGaps
+ When this flag is <TRUE/> then the area of borders and gaps are
+ interpreted as belonging to one of the rows.
+ @param eGapMembership
+ Specifies to what row the gap areas belong. Here GM_NONE
+ corresponds to bIncludeBordersAndGaps being <FALSE/>. When
+ GM_BOTH is given then the upper half is associated to the row
+ above and the lower half to the row below. Values of
+ GM_PREVIOUS and GM_NEXT associate the whole gap area with the
+ row above or below respectively.
+ */
+ sal_Int32 GetRowAtPosition (
+ sal_Int32 nYPosition,
+ bool bIncludeBordersAndGaps,
+ GapMembership eGapMembership) const;
+
+ /** Calculate the column that the point with the given horizontal
+ coordinate is over. The vertical component is ignored.
+ @param nXPosition
+ Horizontal position in model coordinates.
+ @param bIncludeBordersAndGaps
+ When this flag is <TRUE/> then the area of borders and gaps are
+ interpreted as belonging to one of the columns.
+ @param eGapMembership
+ Specifies to what column the gap areas belong.
+ */
+ sal_Int32 GetColumnAtPosition (
+ sal_Int32 nXPosition,
+ bool bIncludeBordersAndGaps,
+ GapMembership eGapMembership) const;
+
+ /** This method is typically called from GetRowAtPosition() and
+ GetColumnAtPosition() to handle a position that lies inside the gap
+ between two adjacent rows or columns.
+ @param nDistanceIntoGap
+ Vertical distance from the bottom of the upper row down into the
+ gap or horizontal distance from the right edge right into the
+ gap.
+ @param eGapMemberhship
+ This value decides what areas in the gap belong to which (or no)
+ row or column.
+ @param nIndex
+ The row index of the upper row or the column index of the left
+ column.
+ @param nGap
+ Width or height of the gap in model coordinates between the
+ page borders.
+ @return
+ Returns either the index of the upper row (as given as nRow), the
+ index of the lower row (nRow+1) or -1 to indicate that the
+ position belongs to no row.
+ */
+ static sal_Int32 ResolvePositionInGap (
+ sal_Int32 nDistanceIntoGap,
+ GapMembership eGapMembership,
+ sal_Int32 nIndex,
+ sal_Int32 nGap);
+
+ /** Calculate the logical part of the insert position, i.e. the page
+ after which to insert.
+ */
+ virtual void CalculateLogicalInsertPosition (
+ const Point& rModelPosition,
+ InsertPosition& rPosition) const = 0;
+
+ /** Calculate the geometrical part of the insert position, i.e. the
+ location of where to display the insertion indicator and the
+ distances about which the leading and trailing pages have to be
+ moved to make room for the indicator.
+ */
+ void CalculateGeometricPosition (
+ InsertPosition& rPosition,
+ const Size& rIndicatorSize,
+ const bool bIsVertical,
+ model::SlideSorterModel const & rModel) const;
+
+ /** Return the bounding box of the preview or, when selected, of the page
+ object. Thus, it returns something like a visual bounding box.
+ */
+ ::tools::Rectangle GetInnerBoundingBox (
+ model::SlideSorterModel const & rModel,
+ const sal_Int32 nIndex) const;
+
+ Range GetValidHorizontalSizeRange() const;
+ Range GetValidVerticalSizeRange() const;
+
+ Range GetRangeOfVisiblePageObjects (const ::tools::Rectangle& aVisibleArea) const;
+ sal_Int32 GetIndex (
+ const sal_Int32 nRow,
+ const sal_Int32 nColumn,
+ const bool bClampToValidRange) const;
+
+ ::tools::Rectangle GetPageObjectBox (
+ const sal_Int32 nIndex,
+ const bool bIncludeBorderAndGap = false) const;
+
+ ::tools::Rectangle GetPageObjectBox (
+ const sal_Int32 nRow,
+ const sal_Int32 nColumn) const;
+
+ ::tools::Rectangle AddBorderAndGap (
+ const ::tools::Rectangle& rBoundingBox,
+ const sal_Int32 nRow,
+ const sal_Int32 nColumn) const;
+
+ ::tools::Rectangle GetTotalBoundingBox() const;
+
+ virtual ~Implementation();
+
+protected:
+ Implementation (
+ sd::Window *pWindow,
+ const std::shared_ptr<view::Theme>& rpTheme);
+ explicit Implementation (const Implementation& rImplementation);
+
+ virtual void CalculateRowAndColumnCount (const Size& rWindowSize) = 0;
+ virtual void CalculateMaxRowAndColumnCount (const Size& rWindowSize) = 0;
+ virtual Size CalculateTargetSize (
+ const Size& rWindowSize) const = 0;
+ Size GetTargetSize (
+ const Size& rWindowSize,
+ const bool bCalculateWidth,
+ const bool bCalculateHeight) const;
+ void CalculateVerticalLogicalInsertPosition (
+ const Point& rModelPosition,
+ InsertPosition& rPosition) const;
+};
+
+namespace {
+
+/** The vertical layouter has one column and as many rows as there are
+ pages.
+*/
+class VerticalImplementation : public Layouter::Implementation
+{
+public:
+ explicit VerticalImplementation (const Implementation& rImplementation);
+
+ virtual Layouter::Orientation GetOrientation() const override;
+
+ void CalculateLogicalInsertPosition (
+ const Point& rModelPosition,
+ InsertPosition& rPosition) const override;
+
+protected:
+ virtual void CalculateRowAndColumnCount (const Size& rWindowSize) override;
+ virtual void CalculateMaxRowAndColumnCount (const Size& rWindowSize) override;
+ virtual Size CalculateTargetSize (
+ const Size& rWindowSize) const override;
+};
+
+/** The horizontal layouter has one row and as many columns as there are
+ pages.
+*/
+class HorizontalImplementation : public Layouter::Implementation
+{
+public:
+ explicit HorizontalImplementation(const Implementation& rImplementation);
+
+ virtual Layouter::Orientation GetOrientation() const override;
+
+ void CalculateLogicalInsertPosition (
+ const Point& rModelPosition,
+ InsertPosition& rPosition) const override;
+
+protected:
+ virtual void CalculateRowAndColumnCount (const Size& rWindowSize) override;
+ virtual void CalculateMaxRowAndColumnCount (const Size& rWindowSize) override;
+ virtual Size CalculateTargetSize (
+ const Size& rWindowSize) const override;
+};
+
+/** The number of columns of the grid layouter is defined via a control in
+ the slide sorter tool bar. The number of rows is calculated from the
+ number of columns and the number of pages.
+*/
+class GridImplementation : public Layouter::Implementation
+{
+public:
+ GridImplementation (
+ sd::Window *pWindow,
+ const std::shared_ptr<view::Theme>& rpTheme);
+ explicit GridImplementation(const Implementation& rImplementation);
+
+ virtual Layouter::Orientation GetOrientation() const override;
+
+ void CalculateLogicalInsertPosition (
+ const Point& rModelPosition,
+ InsertPosition& rPosition) const override;
+
+protected:
+ virtual void CalculateRowAndColumnCount (const Size& rWindowSize) override;
+ virtual void CalculateMaxRowAndColumnCount (const Size& rWindowSize) override;
+ virtual Size CalculateTargetSize (
+ const Size& rWindowSize) const override;
+};
+
+}
+
+//===== Layouter ==============================================================
+
+Layouter::Layouter (
+ sd::Window *pWindow,
+ const std::shared_ptr<Theme>& rpTheme)
+ : mpImplementation(new GridImplementation(pWindow, rpTheme)),
+ mpWindow(pWindow)
+{
+}
+
+Layouter::~Layouter()
+{
+}
+
+std::shared_ptr<PageObjectLayouter> const & Layouter::GetPageObjectLayouter() const
+{
+ return mpImplementation->mpPageObjectLayouter;
+}
+
+void Layouter::SetColumnCount (
+ sal_Int32 nMinimalColumnCount,
+ sal_Int32 nMaximalColumnCount)
+{
+ if (nMinimalColumnCount <= nMaximalColumnCount)
+ {
+ mpImplementation->mnMinimalColumnCount = nMinimalColumnCount;
+ mpImplementation->mnMaximalColumnCount = nMaximalColumnCount;
+ }
+}
+
+bool Layouter::Rearrange (
+ const Orientation eOrientation,
+ const Size& rWindowSize,
+ const Size& rPageSize,
+ const sal_uInt32 nPageCount)
+{
+ OSL_ASSERT(mpWindow);
+
+ if (eOrientation != mpImplementation->GetOrientation())
+ mpImplementation.reset(Implementation::Create(*mpImplementation, eOrientation));
+
+ return mpImplementation->Rearrange(rWindowSize, rPageSize, nPageCount);
+}
+
+sal_Int32 Layouter::GetColumnCount() const
+{
+ return mpImplementation->mnColumnCount;
+}
+
+sal_Int32 Layouter::GetIndex (const sal_Int32 nRow, const sal_Int32 nColumn) const
+{
+ return mpImplementation->GetIndex(nRow,nColumn,true);
+}
+
+Size const & Layouter::GetPageObjectSize() const
+{
+ return mpImplementation->maPageObjectSize;
+}
+
+::tools::Rectangle Layouter::GetPageObjectBox (
+ const sal_Int32 nIndex,
+ const bool bIncludeBorderAndGap) const
+{
+ return mpImplementation->GetPageObjectBox(nIndex, bIncludeBorderAndGap);
+}
+
+::tools::Rectangle Layouter::GetTotalBoundingBox() const
+{
+ return mpImplementation->GetTotalBoundingBox();
+}
+
+InsertPosition Layouter::GetInsertPosition (
+ const Point& rModelPosition,
+ const Size& rIndicatorSize,
+ model::SlideSorterModel const & rModel) const
+{
+ InsertPosition aPosition;
+ mpImplementation->CalculateLogicalInsertPosition(
+ rModelPosition,
+ aPosition);
+ mpImplementation->CalculateGeometricPosition(
+ aPosition,
+ rIndicatorSize,
+ GetColumnCount()==1,
+ rModel);
+ return aPosition;
+}
+
+Range Layouter::GetValidHorizontalSizeRange() const
+{
+ return mpImplementation->GetValidHorizontalSizeRange();
+}
+
+Range Layouter::GetValidVerticalSizeRange() const
+{
+ return mpImplementation->GetValidVerticalSizeRange();
+}
+
+Range Layouter::GetRangeOfVisiblePageObjects (const ::tools::Rectangle& aVisibleArea) const
+{
+ return mpImplementation->GetRangeOfVisiblePageObjects(aVisibleArea);
+}
+
+sal_Int32 Layouter::GetIndexAtPoint (
+ const Point& rPosition,
+ const bool bIncludePageBorders,
+ const bool bClampToValidRange) const
+{
+ const sal_Int32 nRow (
+ mpImplementation->GetRowAtPosition (
+ rPosition.Y(),
+ bIncludePageBorders,
+ bIncludePageBorders ? Implementation::GM_PAGE_BORDER : Implementation::GM_NONE));
+ const sal_Int32 nColumn (
+ mpImplementation->GetColumnAtPosition (
+ rPosition.X(),
+ bIncludePageBorders,
+ bIncludePageBorders ? Implementation::GM_PAGE_BORDER : Implementation::GM_NONE));
+
+ return mpImplementation->GetIndex(nRow,nColumn,bClampToValidRange);
+}
+
+//===== Layouter::Implementation ==============================================
+
+Layouter::Implementation* Layouter::Implementation::Create (
+ const Implementation& rImplementation,
+ const Layouter::Orientation eOrientation)
+{
+ switch (eOrientation)
+ {
+ case HORIZONTAL: return new HorizontalImplementation(rImplementation);
+ case VERTICAL: return new VerticalImplementation(rImplementation);
+ case GRID:
+ default: return new GridImplementation(rImplementation);
+ }
+}
+
+Layouter::Implementation::Implementation (
+ sd::Window *pWindow,
+ const std::shared_ptr<view::Theme>& rpTheme)
+ : mpWindow(pWindow),
+ mnLeftBorder(5),
+ mnRightBorder(5),
+ mnTopBorder(5),
+ mnBottomBorder(5),
+ maMinimalSize(132,98),
+ maPreferredSize(200,150),
+ maMaximalSize(600,400),
+ mnMinimalColumnCount(1),
+ mnMaximalColumnCount(15),
+ mnPageCount(0),
+ mnColumnCount(1),
+ mnRowCount(0),
+ mnMaxColumnCount(0),
+ mnMaxRowCount(0),
+ maPageObjectSize(1,1),
+ mpTheme(rpTheme)
+{
+}
+
+Layouter::Implementation::Implementation (const Implementation& rImplementation)
+ : mpWindow(rImplementation.mpWindow),
+ mnLeftBorder(rImplementation.mnLeftBorder),
+ mnRightBorder(rImplementation.mnRightBorder),
+ mnTopBorder(rImplementation.mnTopBorder),
+ mnBottomBorder(rImplementation.mnBottomBorder),
+ maMinimalSize(rImplementation.maMinimalSize),
+ maPreferredSize(rImplementation.maPreferredSize),
+ maMaximalSize(rImplementation.maMaximalSize),
+ mnMinimalColumnCount(rImplementation.mnMinimalColumnCount),
+ mnMaximalColumnCount(rImplementation.mnMaximalColumnCount),
+ mnPageCount(rImplementation.mnPageCount),
+ mnColumnCount(rImplementation.mnColumnCount),
+ mnRowCount(rImplementation.mnRowCount),
+ mnMaxColumnCount(rImplementation.mnMaxColumnCount),
+ mnMaxRowCount(rImplementation.mnMaxRowCount),
+ maPageObjectSize(rImplementation.maPageObjectSize),
+ mpTheme(rImplementation.mpTheme)
+{
+}
+
+Layouter::Implementation::~Implementation()
+{
+}
+
+bool Layouter::Implementation::Rearrange (
+ const Size& rWindowSize,
+ const Size& rPreviewModelSize,
+ const sal_uInt32 nPageCount)
+{
+ mnPageCount = nPageCount;
+
+ // Return early when the window or the model have not yet been initialized.
+ if (rWindowSize.IsEmpty())
+ return false;
+ if (rPreviewModelSize.IsEmpty())
+ return false;
+
+ CalculateRowAndColumnCount(rWindowSize);
+
+ // Update the border values.
+ mnLeftBorder = mnRequestedLeftBorder;
+ mnTopBorder = mnRequestedTopBorder;
+ mnRightBorder = mnRequestedRightBorder;
+ mnBottomBorder = mnRequestedBottomBorder;
+ if (mnColumnCount > 1)
+ {
+ int nMinimumBorderWidth = gnHorizontalGap/2;
+ if (mnLeftBorder < nMinimumBorderWidth)
+ mnLeftBorder = nMinimumBorderWidth;
+ if (mnRightBorder < nMinimumBorderWidth)
+ mnRightBorder = nMinimumBorderWidth;
+ }
+ else
+ {
+ int nMinimumBorderHeight = gnVerticalGap/2;
+ if (mnTopBorder < nMinimumBorderHeight)
+ mnTopBorder = nMinimumBorderHeight;
+ if (mnBottomBorder < nMinimumBorderHeight)
+ mnBottomBorder = nMinimumBorderHeight;
+ }
+
+ mpPageObjectLayouter =
+ std::make_shared<PageObjectLayouter>(
+ CalculateTargetSize(rWindowSize),
+ rPreviewModelSize,
+ mpWindow,
+ mnPageCount);
+
+ maPageObjectSize = mpPageObjectLayouter->GetGridMaxSize();
+
+ CalculateMaxRowAndColumnCount(rWindowSize);
+
+ return true;
+}
+
+sal_Int32 Layouter::Implementation::GetRowAtPosition (
+ sal_Int32 nYPosition,
+ bool bIncludeBordersAndGaps,
+ GapMembership eGapMembership) const
+{
+ sal_Int32 nRow = -1;
+
+ const sal_Int32 nY = nYPosition - mnTopBorder;
+ if (nY >= 0)
+ {
+ // Vertical distance from one row to the next.
+ const sal_Int32 nRowOffset (maPageObjectSize.Height() + gnVerticalGap);
+
+ // Calculate row consisting of page objects and gap below.
+ nRow = nY / nRowOffset;
+
+ const sal_Int32 nDistanceIntoGap ((nY - nRow*nRowOffset) - maPageObjectSize.Height());
+ // When inside the gap below then nYPosition is not over a page
+ // object.
+ if (nDistanceIntoGap > 0)
+ {
+ sal_Int32 nResolvedRow = ResolvePositionInGap(
+ nDistanceIntoGap,
+ eGapMembership,
+ nRow,
+ gnVerticalGap);
+ if (!bIncludeBordersAndGaps || nResolvedRow != -1)
+ nRow = nResolvedRow;
+ }
+ }
+ else if (bIncludeBordersAndGaps)
+ {
+ // We are in the top border area. Set nRow to the first row when
+ // the top border shall be considered to belong to the first row.
+ nRow = 0;
+ }
+
+ return nRow;
+}
+
+sal_Int32 Layouter::Implementation::GetColumnAtPosition (
+ sal_Int32 nXPosition,
+ bool bIncludeBordersAndGaps,
+ GapMembership eGapMembership) const
+{
+ sal_Int32 nColumn = -1;
+
+ sal_Int32 nX = nXPosition - mnLeftBorder;
+ if (nX >= 0)
+ {
+ // Horizontal distance from one column to the next.
+ const sal_Int32 nColumnOffset (maPageObjectSize.Width() + gnHorizontalGap);
+
+ // Calculate row consisting of page objects and gap below.
+ nColumn = nX / nColumnOffset;
+ if (nColumn < 0)
+ nColumn = 0;
+ else if (nColumn >= mnColumnCount)
+ nColumn = mnColumnCount-1;
+
+ const sal_Int32 nDistanceIntoGap ((nX - nColumn*nColumnOffset) - maPageObjectSize.Width());
+ // When inside the gap at the right then nXPosition is not over a
+ // page object.
+ if (nDistanceIntoGap > 0)
+ {
+ sal_Int32 nResolvedColumn = ResolvePositionInGap(
+ nDistanceIntoGap,
+ eGapMembership,
+ nColumn,
+ gnHorizontalGap);
+ if (!bIncludeBordersAndGaps || nResolvedColumn != -1)
+ nColumn = nResolvedColumn;
+ }
+ }
+ else if (bIncludeBordersAndGaps)
+ {
+ // We are in the left border area. Set nColumn to the first column
+ // when the left border shall be considered to belong to the first
+ // column.
+ nColumn = 0;
+ }
+ return nColumn;
+}
+
+sal_Int32 Layouter::Implementation::ResolvePositionInGap (
+ sal_Int32 nDistanceIntoGap,
+ GapMembership eGapMembership,
+ sal_Int32 nIndex,
+ sal_Int32 nGap)
+{
+ switch (eGapMembership)
+ {
+ case GM_NONE:
+ // The gap is no man's land.
+ nIndex = -1;
+ break;
+
+ case GM_BOTH:
+ {
+ // The lower half of the gap belongs to the next row or column.
+ sal_Int32 nFirstHalfGapWidth = nGap / 2;
+ if (nDistanceIntoGap > nFirstHalfGapWidth)
+ nIndex ++;
+ break;
+ }
+
+ case GM_PREVIOUS:
+ // Row or column already at correct value.
+ break;
+
+ case GM_NEXT:
+ // The complete gap belongs to the next row or column.
+ nIndex ++;
+ break;
+
+ case GM_PAGE_BORDER:
+ if (nDistanceIntoGap > 0)
+ {
+ if (nDistanceIntoGap > nGap)
+ {
+ // Inside the border of the next row or column.
+ nIndex ++;
+ }
+ else
+ {
+ // Inside the gap between the page borders.
+ nIndex = -1;
+ }
+ }
+ break;
+
+ default:
+ nIndex = -1;
+ }
+
+ return nIndex;
+}
+
+void Layouter::Implementation::CalculateGeometricPosition (
+ InsertPosition& rPosition,
+ const Size& rIndicatorSize,
+ const bool bIsVertical,
+ model::SlideSorterModel const & rModel) const
+{
+ // 1. Determine right/bottom of the leading page and the left/top of the
+ // trailing page object and how to distribute the missing space.
+ sal_Int32 nLeadingLocation (0);
+ sal_Int32 nTrailingLocation (0);
+ bool bIsLeadingFixed (false);
+ bool bIsTrailingFixed (false);
+ sal_Int32 nSecondaryLocation (0);
+ const sal_Int32 nIndex (rPosition.GetIndex());
+
+ if (rPosition.IsAtRunStart())
+ {
+ // Place indicator at the top of the column.
+ const ::tools::Rectangle aOuterBox (GetPageObjectBox(nIndex));
+ const ::tools::Rectangle aInnerBox (GetInnerBoundingBox(rModel, nIndex));
+ if (bIsVertical)
+ {
+ nLeadingLocation = aOuterBox.Top();
+ nTrailingLocation = aInnerBox.Top();
+ nSecondaryLocation = aInnerBox.Center().X();
+ }
+ else
+ {
+ nLeadingLocation = aOuterBox.Left();
+ nTrailingLocation = aInnerBox.Left();
+ nSecondaryLocation = aInnerBox.Center().Y();
+ }
+ bIsLeadingFixed = true;
+ }
+ else if (rPosition.IsAtRunEnd())
+ {
+ // Place indicator at the bottom/right of the column/row.
+
+ const ::tools::Rectangle aOuterBox (GetPageObjectBox(nIndex-1));
+ const ::tools::Rectangle aInnerBox (GetInnerBoundingBox(rModel, nIndex-1));
+ if (bIsVertical)
+ {
+ nLeadingLocation = aInnerBox.Bottom();
+ nTrailingLocation = aOuterBox.Bottom();
+ nSecondaryLocation = aInnerBox.Center().X();
+ }
+ else
+ {
+ nLeadingLocation = aInnerBox.Right();
+ nTrailingLocation = aOuterBox.Right();
+ nSecondaryLocation = aInnerBox.Center().Y();
+ }
+ bIsTrailingFixed = true;
+ if ( ! rPosition.IsExtraSpaceNeeded())
+ bIsLeadingFixed = true;
+ }
+ else
+ {
+ // Place indicator between two rows/columns.
+ const ::tools::Rectangle aBox1 (GetInnerBoundingBox(rModel, nIndex-1));
+ const ::tools::Rectangle aBox2 (GetInnerBoundingBox(rModel, nIndex));
+ if (bIsVertical)
+ {
+ nLeadingLocation = aBox1.Bottom();
+ nTrailingLocation = aBox2.Top();
+ nSecondaryLocation = (aBox1.Center().X() + aBox2.Center().X()) / 2;
+ }
+ else
+ {
+ nLeadingLocation = aBox1.Right();
+ nTrailingLocation = aBox2.Left();
+ nSecondaryLocation = (aBox1.Center().Y() + aBox2.Center().Y()) / 2;
+ }
+ }
+
+ // 2. Calculate the location of the insert indicator and the offsets of
+ // leading and trailing pages.
+ const sal_Int32 nAvailableSpace (nTrailingLocation - nLeadingLocation);
+ const sal_Int32 nRequiredSpace (bIsVertical ? rIndicatorSize.Height():rIndicatorSize.Width());
+ const sal_Int32 nMissingSpace (::std::max(sal_Int32(0), nRequiredSpace - nAvailableSpace));
+ sal_Int32 nPrimaryLocation (0);
+ sal_Int32 nLeadingOffset (0);
+ sal_Int32 nTrailingOffset (0);
+ if (bIsLeadingFixed)
+ {
+ nPrimaryLocation = nLeadingLocation + nRequiredSpace/2;
+ if ( ! bIsTrailingFixed)
+ nTrailingOffset = nMissingSpace;
+ }
+ else if (bIsTrailingFixed)
+ {
+ nPrimaryLocation = nTrailingLocation - nRequiredSpace/2;
+ nLeadingOffset = -nMissingSpace;
+ }
+ else
+ {
+ nPrimaryLocation = (nLeadingLocation + nTrailingLocation) /2;
+ nLeadingOffset = -nMissingSpace/2;
+ nTrailingOffset = nMissingSpace + nLeadingOffset;
+ }
+
+ if (bIsVertical)
+ {
+ rPosition.SetGeometricalPosition(
+ Point(nSecondaryLocation, nPrimaryLocation),
+ Point(0, nLeadingOffset),
+ Point(0, nTrailingOffset));
+ }
+ else
+ {
+ rPosition.SetGeometricalPosition(
+ Point(nPrimaryLocation, nSecondaryLocation),
+ Point(nLeadingOffset, 0),
+ Point(nTrailingOffset, 0));
+ }
+}
+
+::tools::Rectangle Layouter::Implementation::GetInnerBoundingBox (
+ model::SlideSorterModel const & rModel,
+ const sal_Int32 nIndex) const
+{
+ model::SharedPageDescriptor pDescriptor (rModel.GetPageDescriptor(nIndex));
+ if ( ! pDescriptor)
+ return ::tools::Rectangle();
+
+ PageObjectLayouter::Part ePart = PageObjectLayouter::Part::Preview;
+
+ if (pDescriptor->HasState(model::PageDescriptor::ST_Selected))
+ ePart = PageObjectLayouter::Part::PageObject;
+
+ return mpPageObjectLayouter->GetBoundingBox(
+ pDescriptor, ePart,
+ PageObjectLayouter::ModelCoordinateSystem, true);
+}
+
+Range Layouter::Implementation::GetValidHorizontalSizeRange() const
+{
+ return Range(
+ mnLeftBorder + maMinimalSize.Width() + mnRightBorder,
+ mnLeftBorder + maMaximalSize.Width() + mnRightBorder);
+}
+
+Range Layouter::Implementation::GetValidVerticalSizeRange() const
+{
+ return Range(
+ mnTopBorder + maMinimalSize.Height() + mnBottomBorder,
+ mnTopBorder + maMaximalSize.Height() + mnBottomBorder);
+}
+
+Range Layouter::Implementation::GetRangeOfVisiblePageObjects (const ::tools::Rectangle& aVisibleArea) const
+{
+ // technically that's not empty, but it's the default, so...
+ if (aVisibleArea.IsEmpty())
+ return Range(-1, -1);
+
+ const sal_Int32 nRow0 (GetRowAtPosition(aVisibleArea.Top(), true, GM_NEXT));
+ const sal_Int32 nCol0 (GetColumnAtPosition(aVisibleArea.Left(),true, GM_NEXT));
+ const sal_Int32 nRow1 (GetRowAtPosition(aVisibleArea.Bottom(), true, GM_PREVIOUS));
+ const sal_Int32 nCol1 (GetColumnAtPosition(aVisibleArea.Right(), true, GM_PREVIOUS));
+
+ // When start and end lie in different rows then the range may include
+ // slides outside (left or right of) the given area.
+ return Range(GetIndex(nRow0,nCol0,true), GetIndex(nRow1,nCol1,true));
+}
+
+Size Layouter::Implementation::GetTargetSize (
+ const Size& rWindowSize,
+ const bool bCalculateWidth,
+ const bool bCalculateHeight) const
+{
+ if (mnColumnCount<=0 || mnRowCount<=0)
+ return maPreferredSize;
+ if ( ! (bCalculateWidth || bCalculateHeight))
+ {
+ OSL_ASSERT(bCalculateWidth || bCalculateHeight);
+ return maPreferredSize;
+ }
+
+ // Calculate the width of each page object.
+ Size aTargetSize (0,0);
+ if (bCalculateWidth)
+ aTargetSize.setWidth(
+ (rWindowSize.Width() - mnLeftBorder - mnRightBorder
+ - (mnColumnCount-1) * gnHorizontalGap)
+ / mnColumnCount);
+ else if (bCalculateHeight)
+ aTargetSize.setHeight(
+ (rWindowSize.Height() - mnTopBorder - mnBottomBorder
+ - (mnRowCount-1) * gnVerticalGap)
+ / mnRowCount);
+
+ if (bCalculateWidth)
+ {
+ if (aTargetSize.Width() < maMinimalSize.Width())
+ aTargetSize.setWidth(maMinimalSize.Width());
+ else if (aTargetSize.Width() > maMaximalSize.Width())
+ aTargetSize.setWidth(maMaximalSize.Width());
+ }
+ else if (bCalculateHeight)
+ {
+ if (aTargetSize.Height() < maMinimalSize.Height())
+ aTargetSize.setHeight(maMinimalSize.Height());
+ else if (aTargetSize.Height() > maMaximalSize.Height())
+ aTargetSize.setHeight(maMaximalSize.Height());
+ }
+
+ return aTargetSize;
+}
+
+sal_Int32 Layouter::Implementation::GetIndex (
+ const sal_Int32 nRow,
+ const sal_Int32 nColumn,
+ const bool bClampToValidRange) const
+{
+ if (nRow >= 0 && nColumn >= 0)
+ {
+ const sal_Int32 nIndex (nRow * mnColumnCount + nColumn);
+ if (nIndex >= mnPageCount)
+ if (bClampToValidRange)
+ return mnPageCount-1;
+ else
+ return -1;
+ else
+ return nIndex;
+ }
+ else if (bClampToValidRange)
+ return 0;
+ else
+ return -1;
+}
+
+::tools::Rectangle Layouter::Implementation::GetPageObjectBox (
+ const sal_Int32 nIndex,
+ const bool bIncludeBorderAndGap) const
+{
+ const sal_Int32 nRow (nIndex / mnColumnCount);
+ const sal_Int32 nColumn (nIndex % mnColumnCount);
+
+ const ::tools::Rectangle aBoundingBox (GetPageObjectBox(nRow,nColumn));
+ if (bIncludeBorderAndGap)
+ return AddBorderAndGap(aBoundingBox, nRow, nColumn);
+ else
+ return aBoundingBox;
+}
+
+::tools::Rectangle Layouter::Implementation::GetPageObjectBox (
+ const sal_Int32 nRow,
+ const sal_Int32 nColumn) const
+{
+ return ::tools::Rectangle(
+ Point (mnLeftBorder
+ + nColumn * maPageObjectSize.Width()
+ + std::max<sal_Int32>(nColumn,0) * gnHorizontalGap,
+ mnTopBorder
+ + nRow * maPageObjectSize.Height()
+ + std::max<sal_Int32>(nRow,0) * gnVerticalGap),
+ maPageObjectSize);
+}
+
+::tools::Rectangle Layouter::Implementation::AddBorderAndGap (
+ const ::tools::Rectangle& rBoundingBox,
+ const sal_Int32 nRow,
+ const sal_Int32 nColumn) const
+{
+ ::tools::Rectangle aBoundingBox (rBoundingBox);
+
+ if (nColumn == 0)
+ aBoundingBox.SetLeft( 0 );
+ else
+ aBoundingBox.AdjustLeft( -(gnHorizontalGap/2) );
+ if (nColumn == mnColumnCount-1)
+ aBoundingBox.AdjustRight(mnRightBorder );
+ else
+ aBoundingBox.AdjustRight(gnHorizontalGap/2 );
+ if (nRow == 0)
+ aBoundingBox.SetTop( 0 );
+ else
+ aBoundingBox.AdjustTop( -(gnVerticalGap/2) );
+ if (nRow == mnRowCount-1)
+ aBoundingBox.AdjustBottom(mnBottomBorder );
+ else
+ aBoundingBox.AdjustBottom(gnVerticalGap/2 );
+ return aBoundingBox;
+}
+
+::tools::Rectangle Layouter::Implementation::GetTotalBoundingBox() const
+{
+ sal_Int32 nHorizontalSize = 0;
+ sal_Int32 nVerticalSize = 0;
+ if (mnColumnCount > 0)
+ {
+ sal_Int32 nRowCount = (mnPageCount+mnColumnCount-1) / mnColumnCount;
+ nHorizontalSize =
+ mnLeftBorder
+ + mnRightBorder
+ + mnColumnCount * maPageObjectSize.Width();
+ if (mnColumnCount > 1)
+ nHorizontalSize += (mnColumnCount-1) * gnHorizontalGap;
+ nVerticalSize =
+ mnTopBorder
+ + mnBottomBorder
+ + nRowCount * maPageObjectSize.Height();
+ if (nRowCount > 1)
+ nVerticalSize += (nRowCount-1) * gnVerticalGap;
+ }
+
+ return ::tools::Rectangle (
+ Point(0,0),
+ Size (nHorizontalSize, nVerticalSize)
+ );
+}
+
+void Layouter::Implementation::CalculateVerticalLogicalInsertPosition (
+ const Point& rModelPosition,
+ InsertPosition& rPosition) const
+{
+ const sal_Int32 nY = rModelPosition.Y() - mnTopBorder + maPageObjectSize.Height()/2;
+ const sal_Int32 nRowHeight (maPageObjectSize.Height() + gnVerticalGap);
+ const sal_Int32 nRow (::std::min(mnPageCount, nY / nRowHeight));
+ rPosition.SetLogicalPosition (
+ nRow,
+ 0,
+ nRow,
+ (nRow == 0),
+ (nRow == mnRowCount),
+ (nRow >= mnMaxRowCount));
+}
+
+//===== HorizontalImplementation ================================================
+
+HorizontalImplementation::HorizontalImplementation (const Implementation& rImplementation)
+ : Implementation(rImplementation)
+{
+}
+
+Layouter::Orientation HorizontalImplementation::GetOrientation() const
+{
+ return Layouter::HORIZONTAL;
+}
+
+void HorizontalImplementation::CalculateRowAndColumnCount (const Size&)
+{
+ // Row and column count are fixed (for a given page count.)
+ mnColumnCount = mnPageCount;
+ mnRowCount = 1;
+}
+
+void HorizontalImplementation::CalculateMaxRowAndColumnCount (const Size& rWindowSize)
+{
+ mnMaxColumnCount = (rWindowSize.Width() - mnLeftBorder - mnRightBorder)
+ / (maPageObjectSize.Width() + gnHorizontalGap);
+ mnMaxRowCount = 1;
+}
+
+Size HorizontalImplementation::CalculateTargetSize (
+ const Size& rWindowSize) const
+{
+ return Implementation::GetTargetSize(rWindowSize, false, true);
+}
+
+void HorizontalImplementation::CalculateLogicalInsertPosition (
+ const Point& rModelPosition,
+ InsertPosition& rPosition) const
+{
+ const sal_Int32 nX = rModelPosition.X() - mnLeftBorder + maPageObjectSize.Width()/2;
+ const sal_Int32 nColumnWidth (maPageObjectSize.Width() + gnHorizontalGap);
+ const sal_Int32 nColumn (::std::min(mnPageCount, nX / nColumnWidth));
+ rPosition.SetLogicalPosition (
+ 0,
+ nColumn,
+ nColumn,
+ (nColumn == 0),
+ (nColumn == mnColumnCount),
+ (nColumn >= mnMaxColumnCount));
+}
+
+//===== VerticalImplementation ================================================
+
+VerticalImplementation::VerticalImplementation (const Implementation& rImplementation)
+ : Implementation(rImplementation)
+{
+}
+
+Layouter::Orientation VerticalImplementation::GetOrientation() const
+{
+ return Layouter::VERTICAL;
+}
+
+void VerticalImplementation::CalculateRowAndColumnCount (const Size&)
+{
+ // Row and column count are fixed (for a given page count.)
+ mnRowCount = mnPageCount;
+ mnColumnCount = 1;
+
+}
+
+void VerticalImplementation::CalculateMaxRowAndColumnCount (const Size& rWindowSize)
+{
+ mnMaxRowCount = (rWindowSize.Height() - mnTopBorder - mnBottomBorder)
+ / (maPageObjectSize.Height() + gnVerticalGap);
+ mnMaxColumnCount = 1;
+}
+
+Size VerticalImplementation::CalculateTargetSize (
+ const Size& rWindowSize) const
+{
+ return Implementation::GetTargetSize(rWindowSize, true, false);
+}
+
+void VerticalImplementation::CalculateLogicalInsertPosition (
+ const Point& rModelPosition,
+ InsertPosition& rPosition) const
+{
+ return CalculateVerticalLogicalInsertPosition(rModelPosition, rPosition);
+}
+
+//===== GridImplementation ================================================
+
+GridImplementation::GridImplementation (
+ sd::Window *pWindow,
+ const std::shared_ptr<view::Theme>& rpTheme)
+ : Implementation(pWindow, rpTheme)
+{
+}
+
+GridImplementation::GridImplementation (const Implementation& rImplementation)
+ : Implementation(rImplementation)
+{
+}
+
+Layouter::Orientation GridImplementation::GetOrientation() const
+{
+ return Layouter::GRID;
+}
+
+void GridImplementation::CalculateRowAndColumnCount (const Size& rWindowSize)
+{
+ // Calculate the column count.
+ mnColumnCount
+ = (rWindowSize.Width() - mnRequestedLeftBorder - mnRequestedRightBorder)
+ / (maPreferredSize.Width() + gnHorizontalGap);
+ if (mnColumnCount < mnMinimalColumnCount)
+ mnColumnCount = mnMinimalColumnCount;
+ if (mnColumnCount > mnMaximalColumnCount)
+ mnColumnCount = mnMaximalColumnCount;
+ mnRowCount = (mnPageCount + mnColumnCount-1)/mnColumnCount;
+}
+
+void GridImplementation::CalculateMaxRowAndColumnCount (const Size& rWindowSize)
+{
+ mnMaxColumnCount = (rWindowSize.Width() - mnLeftBorder - mnRightBorder)
+ / (maPageObjectSize.Width() + gnHorizontalGap);
+ mnMaxRowCount = (rWindowSize.Height() - mnTopBorder - mnBottomBorder)
+ / (maPageObjectSize.Height() + gnVerticalGap);
+}
+
+Size GridImplementation::CalculateTargetSize (
+ const Size& rWindowSize) const
+{
+ return Implementation::GetTargetSize(rWindowSize, true, true);
+}
+
+void GridImplementation::CalculateLogicalInsertPosition (
+ const Point& rModelPosition,
+ InsertPosition& rPosition) const
+{
+ if (mnColumnCount == 1)
+ {
+ CalculateVerticalLogicalInsertPosition(rModelPosition, rPosition);
+ }
+ else
+ {
+ // Handle the general case of more than one column.
+ sal_Int32 nRow (::std::min(
+ mnRowCount-1,
+ GetRowAtPosition (rModelPosition.Y(), true, GM_BOTH)));
+ const sal_Int32 nX = rModelPosition.X() - mnLeftBorder + maPageObjectSize.Width()/2;
+ const sal_Int32 nColumnWidth (maPageObjectSize.Width() + gnHorizontalGap);
+ sal_Int32 nColumn (::std::min(mnColumnCount, nX / nColumnWidth));
+ sal_Int32 nIndex (nRow * mnColumnCount + nColumn);
+ bool bIsAtRunEnd (nColumn == mnColumnCount);
+
+ if (nIndex >= mnPageCount)
+ {
+ nIndex = mnPageCount;
+ nRow = mnRowCount-1;
+ nColumn = ::std::min(::std::min(mnPageCount, mnColumnCount), nColumn);
+ bIsAtRunEnd = true;
+ }
+
+ rPosition.SetLogicalPosition (
+ nRow,
+ nColumn,
+ nIndex,
+ (nColumn == 0),
+ bIsAtRunEnd,
+ (nColumn >= mnMaxColumnCount));
+ }
+}
+
+//===== InsertPosition ========================================================
+
+InsertPosition::InsertPosition()
+ : mnRow(-1),
+ mnColumn(-1),
+ mnIndex(-1),
+ mbIsAtRunStart(false),
+ mbIsAtRunEnd(false),
+ mbIsExtraSpaceNeeded(false),
+ maLocation(0,0),
+ maLeadingOffset(0,0),
+ maTrailingOffset(0,0)
+{
+}
+
+bool InsertPosition::operator== (const InsertPosition& rInsertPosition) const
+{
+ // Do not compare the geometrical information (maLocation).
+ return mnRow==rInsertPosition.mnRow
+ && mnColumn==rInsertPosition.mnColumn
+ && mnIndex==rInsertPosition.mnIndex
+ && mbIsAtRunStart==rInsertPosition.mbIsAtRunStart
+ && mbIsAtRunEnd==rInsertPosition.mbIsAtRunEnd
+ && mbIsExtraSpaceNeeded==rInsertPosition.mbIsExtraSpaceNeeded;
+}
+
+bool InsertPosition::operator!= (const InsertPosition& rInsertPosition) const
+{
+ return !operator==(rInsertPosition);
+}
+
+void InsertPosition::SetLogicalPosition (
+ const sal_Int32 nRow,
+ const sal_Int32 nColumn,
+ const sal_Int32 nIndex,
+ const bool bIsAtRunStart,
+ const bool bIsAtRunEnd,
+ const bool bIsExtraSpaceNeeded)
+{
+ mnRow = nRow;
+ mnColumn = nColumn;
+ mnIndex = nIndex;
+ mbIsAtRunStart = bIsAtRunStart;
+ mbIsAtRunEnd = bIsAtRunEnd;
+ mbIsExtraSpaceNeeded = bIsExtraSpaceNeeded;
+}
+
+void InsertPosition::SetGeometricalPosition(
+ const Point& rLocation,
+ const Point& rLeadingOffset,
+ const Point& rTrailingOffset)
+{
+ maLocation = rLocation;
+ maLeadingOffset = rLeadingOffset;
+ maTrailingOffset = rTrailingOffset;
+}
+
+} // end of namespace ::sd::slidesorter::namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlsPageObjectLayouter.cxx b/sd/source/ui/slidesorter/view/SlsPageObjectLayouter.cxx
new file mode 100644
index 000000000..b26eb0746
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlsPageObjectLayouter.cxx
@@ -0,0 +1,259 @@
+/* -*- 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 <view/SlsPageObjectLayouter.hxx>
+
+#include <model/SlsPageDescriptor.hxx>
+#include <view/SlsTheme.hxx>
+#include <tools/IconCache.hxx>
+#include <Window.hxx>
+
+#include <bitmaps.hlst>
+#include <osl/diagnose.h>
+
+namespace sd::slidesorter::view {
+
+namespace {
+const sal_Int32 gnLeftPageNumberOffset = 2;
+const sal_Int32 gnRightPageNumberOffset = 5;
+const sal_Int32 gnOuterBorderWidth = 5;
+const sal_Int32 gnInfoAreaMinWidth = 26;
+}
+
+PageObjectLayouter::PageObjectLayouter (
+ const Size& rPageObjectWindowSize,
+ const Size& rPageSize,
+ sd::Window *pWindow,
+ const sal_Int32 nPageCount)
+ : mpWindow(pWindow),
+ maTransitionEffectIcon(IconCache::Instance().GetIcon(BMP_FADE_EFFECT_INDICATOR)),
+ maCustomAnimationEffectIcon(IconCache::Instance().GetIcon(BMP_CUSTOM_ANIMATION_INDICATOR)),
+ mpPageNumberFont(Theme::GetFont(Theme::Font_PageNumber, *pWindow->GetOutDev()))
+{
+ const Size aPageNumberAreaSize (GetPageNumberAreaSize(nPageCount));
+
+ const int nMaximumBorderWidth (gnOuterBorderWidth);
+ const int nFocusIndicatorWidth (Theme_FocusIndicatorWidth);
+
+ Size aPageObjectSize(rPageObjectWindowSize.Width(), rPageObjectWindowSize.Height());
+ maPreviewBoundingBox = CalculatePreviewBoundingBox(
+ aPageObjectSize,
+ Size(rPageSize.Width(), rPageSize.Height()),
+ aPageNumberAreaSize.Width(),
+ nFocusIndicatorWidth);
+ maFocusIndicatorBoundingBox = ::tools::Rectangle(Point(0,0), aPageObjectSize);
+ maPageObjectBoundingBox = ::tools::Rectangle(
+ Point(
+ nFocusIndicatorWidth,
+ nFocusIndicatorWidth),
+ Size(
+ aPageObjectSize.Width()-2*nFocusIndicatorWidth,
+ aPageObjectSize.Height()-2*nFocusIndicatorWidth));
+
+ maPageNumberAreaBoundingBox = ::tools::Rectangle(
+ Point(
+ std::max(gnLeftPageNumberOffset,
+ sal_Int32(maPreviewBoundingBox.Left()
+ - gnRightPageNumberOffset
+ - aPageNumberAreaSize.Width())),
+ nMaximumBorderWidth),
+ aPageNumberAreaSize);
+
+ const Size aIconSize (maTransitionEffectIcon.GetSizePixel());
+ maTransitionEffectBoundingBox = ::tools::Rectangle(
+ Point(
+ (maPreviewBoundingBox.Left() - 2*aIconSize.Width()) / 2,
+ maPreviewBoundingBox.Bottom() - aIconSize.Height()),
+ aIconSize);
+ maCustomAnimationEffectBoundingBox = ::tools::Rectangle(
+ Point(
+ (maPreviewBoundingBox.Left() - 2*aIconSize.Width()) / 2,
+ maPreviewBoundingBox.Bottom() - 2*aIconSize.Height()),
+ aIconSize);
+}
+
+PageObjectLayouter::~PageObjectLayouter()
+{
+}
+
+::tools::Rectangle PageObjectLayouter::CalculatePreviewBoundingBox (
+ Size& rPageObjectSize,
+ const Size& rPageSize,
+ const sal_Int32 nPageNumberAreaWidth,
+ const sal_Int32 nFocusIndicatorWidth)
+{
+ const sal_Int32 nIconWidth (maTransitionEffectIcon.GetSizePixel().Width());
+ const sal_Int32 nLeftAreaWidth (
+ ::std::max(
+ gnInfoAreaMinWidth,
+ gnRightPageNumberOffset
+ + ::std::max(
+ nPageNumberAreaWidth,
+ nIconWidth)));
+ sal_Int32 nPreviewWidth;
+ sal_Int32 nPreviewHeight;
+ const double nPageAspectRatio (double(rPageSize.Width()) / double(rPageSize.Height()));
+ if (rPageObjectSize.Height() == 0)
+ {
+ // Calculate height so that the preview fills the available
+ // horizontal space completely while observing the aspect ratio of
+ // the preview.
+ nPreviewWidth = rPageObjectSize.Width()
+ - nLeftAreaWidth - gnOuterBorderWidth - 2*nFocusIndicatorWidth - 1;
+ nPreviewHeight = ::basegfx::fround(nPreviewWidth / nPageAspectRatio);
+ rPageObjectSize.setHeight(nPreviewHeight + 2*gnOuterBorderWidth + 2*nFocusIndicatorWidth + 1);
+ }
+ else if (rPageObjectSize.Width() == 0)
+ {
+ // Calculate the width of the page object so that the preview fills
+ // the available vertical space completely while observing the
+ // aspect ratio of the preview.
+ nPreviewHeight = rPageObjectSize.Height() - 2*gnOuterBorderWidth - 2*nFocusIndicatorWidth - 1;
+ nPreviewWidth = ::basegfx::fround(nPreviewHeight * nPageAspectRatio);
+ rPageObjectSize.setWidth(nPreviewWidth
+ + nLeftAreaWidth + gnOuterBorderWidth + 2*nFocusIndicatorWidth + 1);
+
+ }
+ else
+ {
+ // The size of the page object is given. Calculate the size of the
+ // preview.
+ nPreviewWidth = rPageObjectSize.Width()
+ - nLeftAreaWidth - gnOuterBorderWidth - 2*nFocusIndicatorWidth - 1;
+ nPreviewHeight = rPageObjectSize.Height()
+ - gnOuterBorderWidth - 2*nFocusIndicatorWidth - 1;
+ if (double(nPreviewWidth)/double(nPreviewHeight) > nPageAspectRatio)
+ nPreviewWidth = ::basegfx::fround(nPreviewHeight * nPageAspectRatio);
+ else
+ nPreviewHeight = ::basegfx::fround(nPreviewWidth / nPageAspectRatio);
+ }
+ // When the preview does not fill the available space completely then
+ // place it flush right and vertically centered.
+ const int nLeft (rPageObjectSize.Width()
+ - gnOuterBorderWidth - nPreviewWidth - nFocusIndicatorWidth - 1);
+ const int nTop ((rPageObjectSize.Height() - nPreviewHeight)/2);
+ return ::tools::Rectangle(
+ nLeft,
+ nTop,
+ nLeft + nPreviewWidth,
+ nTop + nPreviewHeight);
+}
+
+::tools::Rectangle PageObjectLayouter::GetBoundingBox (
+ const model::SharedPageDescriptor& rpPageDescriptor,
+ const Part ePart,
+ const CoordinateSystem eCoordinateSystem,
+ bool bIgnoreLocation)
+{
+ OSL_ASSERT(rpPageDescriptor);
+ Point aLocation(0,0);
+ if (rpPageDescriptor)
+ aLocation = rpPageDescriptor->GetLocation( bIgnoreLocation );
+ return GetBoundingBox(aLocation, ePart, eCoordinateSystem);
+}
+
+::tools::Rectangle PageObjectLayouter::GetBoundingBox (
+ const Point& rPageObjectLocation,
+ const Part ePart,
+ const CoordinateSystem eCoordinateSystem)
+{
+ ::tools::Rectangle aBoundingBox;
+ switch (ePart)
+ {
+ case Part::FocusIndicator:
+ aBoundingBox = maFocusIndicatorBoundingBox;
+ break;
+
+ case Part::PageObject:
+ aBoundingBox = maPageObjectBoundingBox;
+ break;
+
+ case Part::Preview:
+ aBoundingBox = maPreviewBoundingBox;
+ break;
+
+ case Part::PageNumber:
+ aBoundingBox = maPageNumberAreaBoundingBox;
+ break;
+
+ case Part::TransitionEffectIndicator:
+ aBoundingBox = maTransitionEffectBoundingBox;
+ break;
+ case Part::CustomAnimationEffectIndicator:
+ aBoundingBox = maCustomAnimationEffectBoundingBox;
+ break;
+ }
+
+ // Adapt coordinates to the requested coordinate system.
+ Point aLocation (rPageObjectLocation);
+ if (eCoordinateSystem == WindowCoordinateSystem)
+ aLocation += mpWindow->GetMapMode().GetOrigin();
+
+ return ::tools::Rectangle(
+ aBoundingBox.TopLeft() + aLocation,
+ aBoundingBox.BottomRight() + aLocation);
+}
+
+Size PageObjectLayouter::GetPreviewSize ()
+{
+ return GetBoundingBox(Point(0,0), PageObjectLayouter::Part::Preview,
+ WindowCoordinateSystem).GetSize();
+}
+
+Size PageObjectLayouter::GetGridMaxSize()
+{
+ return GetBoundingBox(Point(0,0), PageObjectLayouter::Part::FocusIndicator,
+ WindowCoordinateSystem).GetSize();
+}
+
+Size PageObjectLayouter::GetPageNumberAreaSize (const int nPageCount)
+{
+ OSL_ASSERT(mpWindow);
+
+ // Set the correct font.
+ vcl::Font aOriginalFont (mpWindow->GetFont());
+ if (mpPageNumberFont)
+ mpWindow->SetFont(*mpPageNumberFont);
+
+ OUString sPageNumberTemplate;
+ if (nPageCount < 10)
+ sPageNumberTemplate = "9";
+ else if (nPageCount < 100)
+ sPageNumberTemplate = "99";
+ else if (nPageCount < 200)
+ // Just for the case that 1 is narrower than 9.
+ sPageNumberTemplate = "199";
+ else if (nPageCount < 1000)
+ sPageNumberTemplate = "999";
+ else
+ sPageNumberTemplate = "9999";
+ // More than 9999 pages are not handled.
+
+ const Size aSize (
+ mpWindow->GetTextWidth(sPageNumberTemplate),
+ mpWindow->GetTextHeight());
+
+ mpWindow->SetFont(aOriginalFont);
+
+ return aSize;
+}
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx b/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx
new file mode 100644
index 000000000..feaf5a5fa
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx
@@ -0,0 +1,442 @@
+/* -*- 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 <view/SlsPageObjectPainter.hxx>
+
+#include <model/SlsPageDescriptor.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsPageObjectLayouter.hxx>
+#include <view/SlsLayouter.hxx>
+#include <view/SlsTheme.hxx>
+#include <SlideSorter.hxx>
+#include "SlsFramePainter.hxx"
+#include <cache/SlsPageCache.hxx>
+#include <Window.hxx>
+#include <sdpage.hxx>
+#include <vcl/virdev.hxx>
+#include <CustomAnimationEffect.hxx>
+#include <osl/diagnose.h>
+#include <memory>
+
+using namespace ::drawinglayer::primitive2d;
+
+namespace sd::slidesorter::view {
+
+//===== PageObjectPainter =====================================================
+
+PageObjectPainter::PageObjectPainter (
+ const SlideSorter& rSlideSorter)
+ : mrLayouter(rSlideSorter.GetView().GetLayouter()),
+ mpCache(rSlideSorter.GetView().GetPreviewCache()),
+ mpTheme(rSlideSorter.GetTheme()),
+ mpPageNumberFont(Theme::GetFont(Theme::Font_PageNumber, *rSlideSorter.GetContentWindow()->GetOutDev())),
+ mpShadowPainter(new FramePainter(mpTheme->GetIcon(Theme::Icon_RawShadow))),
+ mpFocusBorderPainter(new FramePainter(mpTheme->GetIcon(Theme::Icon_FocusBorder)))
+{
+ // Replace the color (not the alpha values) in the focus border with a
+ // color derived from the current selection color.
+ Color aColor (mpTheme->GetColor(Theme::Color_Selection));
+ sal_uInt16 nHue, nSat, nBri;
+ aColor.RGBtoHSB(nHue, nSat, nBri);
+ aColor = Color::HSBtoRGB(nHue, 28, 65);
+ mpFocusBorderPainter->AdaptColor(aColor);
+}
+
+PageObjectPainter::~PageObjectPainter()
+{
+}
+
+void PageObjectPainter::PaintPageObject (
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor)
+{
+ if (!UpdatePageObjectLayouter())
+ return;
+
+ PageObjectLayouter *pPageObjectLayouter = mrLayouter.GetPageObjectLayouter().get();
+ // Turn off antialiasing to avoid the bitmaps from being
+ // shifted by fractions of a pixel and thus show blurry edges.
+ const AntialiasingFlags nSavedAntialiasingMode (rDevice.GetAntialiasing());
+ rDevice.SetAntialiasing(nSavedAntialiasingMode & ~AntialiasingFlags::Enable);
+
+ PaintBackground(pPageObjectLayouter, rDevice, rpDescriptor);
+ PaintPreview(pPageObjectLayouter, rDevice, rpDescriptor);
+ PaintPageNumber(pPageObjectLayouter, rDevice, rpDescriptor);
+ PaintTransitionEffect(pPageObjectLayouter, rDevice, rpDescriptor);
+ if (rpDescriptor->GetPage()->hasAnimationNode())
+ PaintCustomAnimationEffect(pPageObjectLayouter, rDevice, rpDescriptor);
+ rDevice.SetAntialiasing(nSavedAntialiasingMode);
+}
+
+bool PageObjectPainter::UpdatePageObjectLayouter()
+{
+ // The page object layouter is quite volatile. It may have been replaced
+ // since the last call. Update it now.
+ PageObjectLayouter *pPageObjectLayouter = mrLayouter.GetPageObjectLayouter().get();
+ if ( ! pPageObjectLayouter)
+ {
+ OSL_FAIL("no page object layouter");
+ return false;
+ }
+
+ return true;
+}
+
+void PageObjectPainter::SetTheme (const std::shared_ptr<view::Theme>& rpTheme)
+{
+ mpTheme = rpTheme;
+}
+
+void PageObjectPainter::PaintBackground (
+ PageObjectLayouter *pPageObjectLayouter,
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor) const
+{
+ PaintBackgroundDetail(pPageObjectLayouter, rDevice, rpDescriptor);
+
+ // Fill the interior of the preview area with the default background
+ // color of the page.
+ SdPage* pPage = rpDescriptor->GetPage();
+ if (pPage != nullptr)
+ {
+ rDevice.SetFillColor(pPage->GetPageBackgroundColor(nullptr));
+ rDevice.SetLineColor(pPage->GetPageBackgroundColor(nullptr));
+ const ::tools::Rectangle aPreviewBox (pPageObjectLayouter->GetBoundingBox(
+ rpDescriptor,
+ PageObjectLayouter::Part::Preview,
+ PageObjectLayouter::ModelCoordinateSystem));
+ rDevice.DrawRect(aPreviewBox);
+ }
+}
+
+void PageObjectPainter::PaintPreview (
+ PageObjectLayouter *pPageObjectLayouter,
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor) const
+{
+ const ::tools::Rectangle aBox (pPageObjectLayouter->GetBoundingBox(
+ rpDescriptor,
+ PageObjectLayouter::Part::Preview,
+ PageObjectLayouter::ModelCoordinateSystem));
+
+ if (mpCache == nullptr)
+ return;
+
+ const SdrPage* pPage = rpDescriptor->GetPage();
+ mpCache->SetPreciousFlag(pPage, true);
+
+ const BitmapEx aPreview (GetPreviewBitmap(rpDescriptor, &rDevice));
+ if ( ! aPreview.IsEmpty())
+ {
+ if (aPreview.GetSizePixel() != aBox.GetSize())
+ rDevice.DrawBitmapEx(aBox.TopLeft(), aBox.GetSize(), aPreview);
+ else
+ rDevice.DrawBitmapEx(aBox.TopLeft(), aPreview);
+ }
+}
+
+BitmapEx PageObjectPainter::CreateMarkedPreview (
+ const Size& rSize,
+ const BitmapEx& rPreview,
+ const BitmapEx& rOverlay,
+ const OutputDevice* pReferenceDevice)
+{
+ ScopedVclPtr<VirtualDevice> pDevice;
+ if (pReferenceDevice != nullptr)
+ pDevice.disposeAndReset(VclPtr<VirtualDevice>::Create(*pReferenceDevice));
+ else
+ pDevice.disposeAndReset(VclPtr<VirtualDevice>::Create());
+ pDevice->SetOutputSizePixel(rSize);
+
+ pDevice->DrawBitmapEx(Point(0,0), rSize, rPreview);
+
+ // Paint bitmap tiled over the preview to mark it as excluded.
+ const sal_Int32 nIconWidth (rOverlay.GetSizePixel().Width());
+ const sal_Int32 nIconHeight (rOverlay.GetSizePixel().Height());
+ if (nIconWidth>0 && nIconHeight>0)
+ {
+ for (::tools::Long nX=0; nX<rSize.Width(); nX+=nIconWidth)
+ for (::tools::Long nY=0; nY<rSize.Height(); nY+=nIconHeight)
+ pDevice->DrawBitmapEx(Point(nX,nY), rOverlay);
+ }
+ return pDevice->GetBitmapEx(Point(0,0), rSize);
+}
+
+BitmapEx PageObjectPainter::GetPreviewBitmap (
+ const model::SharedPageDescriptor& rpDescriptor,
+ const OutputDevice* pReferenceDevice) const
+{
+ const SdrPage* pPage = rpDescriptor->GetPage();
+ const bool bIsExcluded (rpDescriptor->HasState(model::PageDescriptor::ST_Excluded));
+
+ if (bIsExcluded)
+ {
+ PageObjectLayouter *pPageObjectLayouter = mrLayouter.GetPageObjectLayouter().get();
+
+ BitmapEx aMarkedPreview (mpCache->GetMarkedPreviewBitmap(pPage));
+ const ::tools::Rectangle aPreviewBox (pPageObjectLayouter->GetBoundingBox(
+ rpDescriptor,
+ PageObjectLayouter::Part::Preview,
+ PageObjectLayouter::ModelCoordinateSystem));
+ if (aMarkedPreview.IsEmpty() || aMarkedPreview.GetSizePixel()!=aPreviewBox.GetSize())
+ {
+ aMarkedPreview = CreateMarkedPreview(
+ aPreviewBox.GetSize(),
+ mpCache->GetPreviewBitmap(pPage,true),
+ mpTheme->GetIcon(Theme::Icon_HideSlideOverlay),
+ pReferenceDevice);
+ mpCache->SetMarkedPreviewBitmap(pPage, aMarkedPreview);
+ }
+ return aMarkedPreview;
+ }
+ else
+ {
+ return mpCache->GetPreviewBitmap(pPage,false);
+ }
+}
+
+void PageObjectPainter::PaintPageNumber (
+ PageObjectLayouter *pPageObjectLayouter,
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor) const
+{
+ const ::tools::Rectangle aBox (pPageObjectLayouter->GetBoundingBox(
+ rpDescriptor,
+ PageObjectLayouter::Part::PageNumber,
+ PageObjectLayouter::ModelCoordinateSystem));
+
+ // Determine the color of the page number.
+ Color aPageNumberColor (mpTheme->GetColor(Theme::Color_PageNumberDefault));
+ if (rpDescriptor->HasState(model::PageDescriptor::ST_MouseOver) ||
+ rpDescriptor->HasState(model::PageDescriptor::ST_Selected))
+ {
+ // Page number is painted on background for hover or selection or
+ // both. Each of these background colors has a predefined luminance
+ // which is compatible with the PageNumberHover color.
+ aPageNumberColor = mpTheme->GetColor(Theme::Color_PageNumberHover);
+ }
+ else
+ {
+ const Color aBackgroundColor (mpTheme->GetColor(Theme::Color_Background));
+ const sal_Int32 nBackgroundLuminance (aBackgroundColor.GetLuminance());
+ // When the background color is black then this is interpreted as
+ // high contrast mode and the font color is set to white.
+ if (nBackgroundLuminance == 0)
+ aPageNumberColor = mpTheme->GetColor(Theme::Color_PageNumberHighContrast);
+ else
+ {
+ // Compare luminance of default page number color and background
+ // color. When the two are similar then use a darker
+ // (preferred) or brighter font color.
+ const sal_Int32 nFontLuminance (aPageNumberColor.GetLuminance());
+ if (abs(nBackgroundLuminance - nFontLuminance) < 60)
+ {
+ if (nBackgroundLuminance > nFontLuminance-30)
+ aPageNumberColor = mpTheme->GetColor(Theme::Color_PageNumberBrightBackground);
+ else
+ aPageNumberColor = mpTheme->GetColor(Theme::Color_PageNumberDarkBackground);
+ }
+ }
+ }
+
+ // Paint the page number.
+ OSL_ASSERT(rpDescriptor->GetPage()!=nullptr);
+ const sal_Int32 nPageNumber ((rpDescriptor->GetPage()->GetPageNum() - 1) / 2 + 1);
+ const OUString sPageNumber(OUString::number(nPageNumber));
+ rDevice.SetFont(*mpPageNumberFont);
+ rDevice.SetTextColor(aPageNumberColor);
+ rDevice.DrawText(aBox, sPageNumber, DrawTextFlags::Right | DrawTextFlags::VCenter);
+}
+
+void PageObjectPainter::PaintTransitionEffect (
+ PageObjectLayouter *pPageObjectLayouter,
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor)
+{
+ const SdPage* pPage = rpDescriptor->GetPage();
+ if (pPage!=nullptr && pPage->getTransitionType() > 0)
+ {
+ const ::tools::Rectangle aBox (pPageObjectLayouter->GetBoundingBox(
+ rpDescriptor,
+ PageObjectLayouter::Part::TransitionEffectIndicator,
+ PageObjectLayouter::ModelCoordinateSystem));
+
+ rDevice.DrawBitmapEx(
+ aBox.TopCenter(),
+ pPageObjectLayouter->GetTransitionEffectIcon().GetBitmapEx());
+ }
+}
+
+void PageObjectPainter::PaintCustomAnimationEffect (
+ PageObjectLayouter *pPageObjectLayouter,
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor)
+{
+ SdPage* pPage = rpDescriptor->GetPage();
+ std::shared_ptr< MainSequence > aMainSequence = pPage->getMainSequence();
+ EffectSequence::iterator aIter = aMainSequence->getBegin();
+ EffectSequence::iterator aEnd = aMainSequence->getEnd();
+ if ( aIter != aEnd )
+ {
+ const ::tools::Rectangle aBox (pPageObjectLayouter->GetBoundingBox(
+ rpDescriptor,
+ PageObjectLayouter::Part::CustomAnimationEffectIndicator,
+ PageObjectLayouter::ModelCoordinateSystem));
+ rDevice.DrawBitmapEx(
+ aBox.TopCenter(),
+ pPageObjectLayouter->GetCustomAnimationEffectIcon().GetBitmapEx());
+ }
+}
+
+void PageObjectPainter::PaintBackgroundDetail (
+ PageObjectLayouter *pPageObjectLayouter,
+ OutputDevice& rDevice,
+ const model::SharedPageDescriptor& rpDescriptor) const
+{
+ enum State { None = 0x00, Selected = 0x01, MouseOver = 0x02, Focused = 0x04 };
+ const int eState =
+ (rpDescriptor->HasState(model::PageDescriptor::ST_Selected) ? Selected : None)
+ | (rpDescriptor->HasState(model::PageDescriptor::ST_MouseOver) ? MouseOver : None)
+ | (rpDescriptor->HasState(model::PageDescriptor::ST_Focused) ? Focused : None);
+
+ bool bHasFocusBorder;
+ Theme::GradientColorType eColorType;
+
+ switch (eState)
+ {
+ case MouseOver | Selected | Focused:
+ eColorType = Theme::Gradient_MouseOverSelectedAndFocusedPage;
+ bHasFocusBorder = true;
+ break;
+
+ case MouseOver | Selected:
+ eColorType = Theme::Gradient_MouseOverSelected;
+ bHasFocusBorder = false;
+ break;
+
+ case MouseOver:
+ eColorType = Theme::Gradient_MouseOverPage;
+ bHasFocusBorder = false;
+ break;
+
+ case MouseOver | Focused:
+ eColorType = Theme::Gradient_MouseOverPage;
+ bHasFocusBorder = true;
+ break;
+
+ case Selected | Focused:
+ eColorType = Theme::Gradient_SelectedAndFocusedPage;
+ bHasFocusBorder = true;
+ break;
+
+ case Selected:
+ eColorType = Theme::Gradient_SelectedPage;
+ bHasFocusBorder = false;
+ break;
+
+ case Focused:
+ eColorType = Theme::Gradient_FocusedPage;
+ bHasFocusBorder = true;
+ break;
+
+ case None:
+ default:
+ eColorType = Theme::Gradient_NormalPage;
+ bHasFocusBorder = false;
+ break;
+ }
+
+ const ::tools::Rectangle aFocusSize (pPageObjectLayouter->GetBoundingBox(
+ rpDescriptor,
+ PageObjectLayouter::Part::FocusIndicator,
+ PageObjectLayouter::ModelCoordinateSystem));
+
+ const ::tools::Rectangle aPageObjectBox (pPageObjectLayouter->GetBoundingBox(
+ rpDescriptor,
+ PageObjectLayouter::Part::PageObject,
+ PageObjectLayouter::ModelCoordinateSystem));
+
+ // Fill the background with the background color of the slide sorter.
+ const Color aBackgroundColor (mpTheme->GetColor(Theme::Color_Background));
+ rDevice.SetFillColor(aBackgroundColor);
+ rDevice.SetLineColor(aBackgroundColor);
+ rDevice.DrawRect(aFocusSize);
+
+ // Paint the slide area with a linear gradient that starts some pixels
+ // below the top and ends some pixels above the bottom.
+ const Color aTopColor(mpTheme->GetGradientColor(eColorType, Theme::GradientColorClass::Fill1));
+ const Color aBottomColor(mpTheme->GetGradientColor(eColorType, Theme::GradientColorClass::Fill2));
+ if (aTopColor != aBottomColor)
+ {
+ Gradient gradient(GradientStyle::Linear, aTopColor, aBottomColor);
+ rDevice.DrawGradient(aPageObjectBox, gradient);
+ }
+ else
+ {
+ rDevice.SetFillColor(aTopColor);
+ rDevice.DrawRect(aPageObjectBox);
+ }
+
+ // Paint the simple border and, for some backgrounds, the focus border.
+ if (bHasFocusBorder)
+ mpFocusBorderPainter->PaintFrame(rDevice, aPageObjectBox);
+ else
+ PaintBorder(rDevice, eColorType, aPageObjectBox);
+
+ // Get bounding box of the preview around which a shadow is painted.
+ // Compensate for the border around the preview.
+ const ::tools::Rectangle aBox (pPageObjectLayouter->GetBoundingBox(
+ rpDescriptor,
+ PageObjectLayouter::Part::Preview,
+ PageObjectLayouter::ModelCoordinateSystem));
+ ::tools::Rectangle aFrameBox (aBox.Left()-1,aBox.Top()-1,aBox.Right()+1,aBox.Bottom()+1);
+ mpShadowPainter->PaintFrame(rDevice, aFrameBox);
+}
+
+void PageObjectPainter::PaintBorder (
+ OutputDevice& rDevice,
+ const Theme::GradientColorType eColorType,
+ const ::tools::Rectangle& rBox) const
+{
+ rDevice.SetFillColor();
+ const sal_Int32 nBorderWidth (1);
+ for (int nIndex=0; nIndex<nBorderWidth; ++nIndex)
+ {
+ const int nDelta (nIndex);
+ rDevice.SetLineColor(mpTheme->GetGradientColor(eColorType, Theme::GradientColorClass::Border2));
+ rDevice.DrawLine(
+ Point(rBox.Left()-nDelta, rBox.Top()-nDelta),
+ Point(rBox.Left()-nDelta, rBox.Bottom()+nDelta));
+ rDevice.DrawLine(
+ Point(rBox.Left()-nDelta, rBox.Bottom()+nDelta),
+ Point(rBox.Right()+nDelta, rBox.Bottom()+nDelta));
+ rDevice.DrawLine(
+ Point(rBox.Right()+nDelta, rBox.Bottom()+nDelta),
+ Point(rBox.Right()+nDelta, rBox.Top()-nDelta));
+
+ rDevice.SetLineColor(mpTheme->GetGradientColor(eColorType, Theme::GradientColorClass::Border1));
+ rDevice.DrawLine(
+ Point(rBox.Left()-nDelta, rBox.Top()-nDelta),
+ Point(rBox.Right()+nDelta, rBox.Top()-nDelta));
+ }
+}
+
+} // end of namespace sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlsTheme.cxx b/sd/source/ui/slidesorter/view/SlsTheme.cxx
new file mode 100644
index 000000000..5172e6241
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlsTheme.cxx
@@ -0,0 +1,239 @@
+/* -*- 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 <bitmaps.hlst>
+#include <view/SlsTheme.hxx>
+#include <controller/SlsProperties.hxx>
+#include <tools/color.hxx>
+#include <vcl/outdev.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/settings.hxx>
+
+#include <osl/diagnose.h>
+
+namespace sd::slidesorter::view {
+
+const Color Black(0x000000);
+const Color White(0xffffff);
+
+static Color ChangeLuminance (Color aColor, const int nValue)
+{
+ if (nValue > 0)
+ aColor.IncreaseLuminance(nValue);
+ else
+ aColor.DecreaseLuminance(-nValue);
+ return aColor;
+}
+
+static Color HGBAdapt (
+ const Color aColor,
+ const sal_Int32 nNewSaturation,
+ const sal_Int32 nNewBrightness)
+{
+ sal_uInt16 nHue (0);
+ sal_uInt16 nSaturation (0);
+ sal_uInt16 nBrightness (0);
+ aColor.RGBtoHSB(nHue, nSaturation, nBrightness);
+ return Color::HSBtoRGB(
+ nHue,
+ nNewSaturation>=0 ? nNewSaturation : nSaturation,
+ nNewBrightness>=0 ? nNewBrightness : nBrightness);
+}
+
+Theme::Theme (const std::shared_ptr<controller::Properties>& rpProperties)
+ : maBackgroundColor(rpProperties->GetBackgroundColor())
+{
+ maColor.resize(ColorType_Size_);
+ maColor[Color_Background] = maBackgroundColor;
+ maColor[Color_PageNumberDefault] = Color(0x0808080);
+ maColor[Color_PageNumberHover] = Color(0x4c4c4c);
+ maColor[Color_PageNumberHighContrast] = White;
+ maColor[Color_PageNumberBrightBackground] = Color(0x333333);
+ maColor[Color_PageNumberDarkBackground] = Color(0xcccccc);
+ maColor[Color_PreviewBorder] = Color(0x949599);
+
+ Update(rpProperties);
+}
+
+void Theme::Update (const std::shared_ptr<controller::Properties>& rpProperties)
+{
+ // Set up colors.
+ maBackgroundColor = rpProperties->GetBackgroundColor();
+
+ maColor[Color_Background] = maBackgroundColor;
+
+ maGradients.resize(GradientColorType_Size_);
+
+ maColor[Color_Background] = maBackgroundColor;
+ const Color aSelectionColor (rpProperties->GetSelectionColor());
+ maColor[Color_Selection] = aSelectionColor;
+ if (aSelectionColor.IsBright())
+ maColor[Color_PageCountFontColor] = Black;
+ else
+ maColor[Color_PageCountFontColor] = White;
+
+ // Set up gradients.
+ SetGradient(Gradient_MouseOverPage, aSelectionColor, 0, 60, +80,+100, +50,+25);
+ SetGradient(Gradient_SelectedPage, aSelectionColor, 50, 50, +80,+100, +50,+25);
+ SetGradient(Gradient_FocusedPage, aSelectionColor, -1,-1, 0,0, -50,-75);
+ SetGradient(Gradient_MouseOverSelected, aSelectionColor, 55, 60, +80,+100, +50,+25);
+ SetGradient(Gradient_SelectedAndFocusedPage, aSelectionColor, 50, 50, +80,+100, -50,-75);
+ SetGradient(Gradient_MouseOverSelectedAndFocusedPage, aSelectionColor, 55, 60, +80,+100, -50,-75);
+
+ SetGradient(Gradient_NormalPage, maBackgroundColor, -1,-1, 0,0, 0,0);
+
+ // The focused gradient needs special handling because its fill color is
+ // like that of the NormalPage gradient.
+ GetGradient(Gradient_FocusedPage).maFillColor1 = GetGradient(Gradient_NormalPage).maFillColor1;
+ GetGradient(Gradient_FocusedPage).maFillColor2 = GetGradient(Gradient_NormalPage).maFillColor2;
+
+ // Set up icons.
+ if (maIcons.empty())
+ {
+ maIcons.resize(IconType_Size_);
+
+ InitializeIcon(Icon_RawShadow, IMAGE_SHADOW);
+ InitializeIcon(Icon_RawInsertShadow, IMAGE_INSERT_SHADOW);
+ InitializeIcon(Icon_HideSlideOverlay, IMAGE_HIDE_SLIDE_OVERLAY);
+ InitializeIcon(Icon_FocusBorder, IMAGE_FOCUS_BORDER);
+ }
+}
+
+std::shared_ptr<vcl::Font> Theme::GetFont (
+ const FontType eType,
+ const OutputDevice& rDevice)
+{
+ std::shared_ptr<vcl::Font> pFont;
+
+ switch (eType)
+ {
+ case Font_PageNumber:
+ pFont = std::make_shared<vcl::Font>(Application::GetSettings().GetStyleSettings().GetAppFont());
+ pFont->SetTransparent(true);
+ pFont->SetWeight(WEIGHT_BOLD);
+ break;
+
+ case Font_PageCount:
+ pFont = std::make_shared<vcl::Font>(Application::GetSettings().GetStyleSettings().GetAppFont());
+ pFont->SetTransparent(true);
+ pFont->SetWeight(WEIGHT_NORMAL);
+ {
+ const Size aSize (pFont->GetFontSize());
+ pFont->SetFontSize(Size(aSize.Width()*5/3, aSize.Height()*5/3));
+ }
+ break;
+ }
+
+ if (pFont)
+ {
+ // Transform the point size to pixel size.
+ const MapMode aFontMapMode (MapUnit::MapPoint);
+ const Size aFontSize (rDevice.LogicToPixel(pFont->GetFontSize(), aFontMapMode));
+
+ // Transform the font size to the logical coordinates of the device.
+ pFont->SetFontSize(rDevice.PixelToLogic(aFontSize));
+ }
+
+ return pFont;
+}
+
+Color Theme::GetColor (const ColorType eType)
+{
+ if (sal_uInt32(eType)<maColor.size())
+ return maColor[eType];
+ else
+ return Color(0);
+}
+
+Color Theme::GetGradientColor (
+ const GradientColorType eType,
+ const GradientColorClass eClass)
+{
+ GradientDescriptor& rDescriptor (GetGradient(eType));
+
+ switch (eClass)
+ {
+ case GradientColorClass::Border1: return rDescriptor.maBorderColor1;
+ case GradientColorClass::Border2: return rDescriptor.maBorderColor2;
+ case GradientColorClass::Fill1: return rDescriptor.maFillColor1;
+ case GradientColorClass::Fill2: return rDescriptor.maFillColor2;
+ }
+ return Color(0);
+}
+
+void Theme::SetGradient (
+ const GradientColorType eType,
+ const Color aBaseColor,
+ const sal_Int32 nSaturationOverride,
+ const sal_Int32 nBrightnessOverride,
+ const sal_Int32 nFillStartOffset,
+ const sal_Int32 nFillEndOffset,
+ const sal_Int32 nBorderStartOffset,
+ const sal_Int32 nBorderEndOffset)
+{
+ GradientDescriptor& rGradient (GetGradient(eType));
+
+ const Color aColor (nSaturationOverride>=0 || nBrightnessOverride>=0
+ ? HGBAdapt(aBaseColor, nSaturationOverride, nBrightnessOverride)
+ : aBaseColor);
+
+ rGradient.maFillColor1 = ChangeLuminance(aColor, nFillStartOffset);
+ rGradient.maFillColor2 = ChangeLuminance(aColor, nFillEndOffset);
+ rGradient.maBorderColor1 = ChangeLuminance(aColor, nBorderStartOffset);
+ rGradient.maBorderColor2 = ChangeLuminance(aColor, nBorderEndOffset);
+}
+
+const BitmapEx& Theme::GetIcon (const IconType eType)
+{
+ if (size_t(eType)<maIcons.size())
+ return maIcons[eType];
+ else
+ {
+ OSL_ASSERT(eType>=0 && size_t(eType)<maIcons.size());
+ return maIcons[0];
+ }
+}
+
+Theme::GradientDescriptor& Theme::GetGradient (const GradientColorType eType)
+{
+ if (size_t(eType)<maGradients.size())
+ return maGradients[eType];
+ else
+ {
+ OSL_ASSERT(eType>=0 && size_t(eType)<maGradients.size());
+ return maGradients[0];
+ }
+}
+
+void Theme::InitializeIcon(const IconType eType, const OUString& rResourceId)
+{
+ if (size_t(eType)<maIcons.size())
+ {
+ const BitmapEx aIcon(rResourceId);
+ maIcons[eType] = aIcon;
+ }
+ else
+ {
+ OSL_ASSERT(eType>=0 && size_t(eType)<maIcons.size());
+ }
+}
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlsToolTip.cxx b/sd/source/ui/slidesorter/view/SlsToolTip.cxx
new file mode 100644
index 000000000..c266bbe3d
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlsToolTip.cxx
@@ -0,0 +1,160 @@
+/* -*- 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 <view/SlsPageObjectLayouter.hxx>
+#include <view/SlsToolTip.hxx>
+#include <view/SlideSorterView.hxx>
+#include <view/SlsLayouter.hxx>
+#include <SlideSorter.hxx>
+#include <Window.hxx>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <strings.hrc>
+
+#include <osl/diagnose.h>
+#include <vcl/settings.hxx>
+#include <vcl/help.hxx>
+
+namespace sd::slidesorter::view {
+
+ToolTip::ToolTip (SlideSorter& rSlideSorter)
+ : mrSlideSorter(rSlideSorter),
+ mnHelpWindowHandle(nullptr),
+ maShowTimer("sd::slidesorter::view::ToolTip maShowTimer"),
+ maHiddenTimer("sd::slidesorter::view::ToolTip maHiddenTimer")
+{
+ maShowTimer.SetTimeout(HelpSettings::GetTipDelay());
+ maShowTimer.SetInvokeHandler(LINK(this, ToolTip, DelayTrigger));
+ maHiddenTimer.SetTimeout(HelpSettings::GetTipDelay());
+}
+
+ToolTip::~ToolTip()
+{
+ maShowTimer.Stop();
+ maHiddenTimer.Stop();
+ Hide();
+}
+
+void ToolTip::SetPage (const model::SharedPageDescriptor& rpDescriptor)
+{
+ if (mpDescriptor == rpDescriptor)
+ return;
+
+ maShowTimer.Stop();
+ bool bWasVisible = Hide();
+
+ if (bWasVisible)
+ {
+ maHiddenTimer.Start();
+ }
+
+ mpDescriptor = rpDescriptor;
+
+ if (mpDescriptor)
+ {
+ SdPage* pPage = mpDescriptor->GetPage();
+ OUString sHelpText;
+ if (pPage != nullptr)
+ sHelpText = pPage->GetName();
+ else
+ {
+ OSL_ASSERT(mpDescriptor->GetPage() != nullptr);
+ }
+ if (sHelpText.isEmpty())
+ {
+ sHelpText = SdResId(STR_PAGE) +
+ OUString::number(mpDescriptor->GetPageIndex()+1);
+ }
+
+ msCurrentHelpText = sHelpText;
+ // show new tooltip immediately, if last one was recently hidden
+ if(maHiddenTimer.IsActive())
+ DoShow();
+ else
+ maShowTimer.Start();
+ }
+ else
+ {
+ msCurrentHelpText.clear();
+ }
+}
+
+void ToolTip::DoShow()
+{
+ if (maShowTimer.IsActive())
+ {
+ // The delay timer is active. Wait for it to trigger the showing of
+ // the tool tip.
+ return;
+ }
+
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ if (msCurrentHelpText.isEmpty() || !pWindow)
+ return;
+
+ ::tools::Rectangle aBox (
+ mrSlideSorter.GetView().GetLayouter().GetPageObjectLayouter()->GetBoundingBox(
+ mpDescriptor,
+ PageObjectLayouter::Part::Preview,
+ PageObjectLayouter::WindowCoordinateSystem));
+
+ // Do not show the help text when the (lower edge of the ) preview
+ // is not visible. The tool tip itself may still be outside the
+ // window.
+ if (aBox.Bottom() >= pWindow->GetSizePixel().Height())
+ return;
+
+ vcl::Window* pParent (pWindow);
+ while (pParent!=nullptr && pParent->GetParent()!=nullptr)
+ pParent = pParent->GetParent();
+ const Point aOffset (pWindow->GetWindowExtentsRelative(pParent).TopLeft());
+
+ // We do not know how high the tool tip will be but want its top
+ // edge not its bottom to be at a specific position (a little below
+ // the preview). Therefore we use a little trick and place the tool
+ // tip at the top of a rectangle that is placed below the preview.
+ aBox.Move(aOffset.X(), aOffset.Y() + aBox.GetHeight() + 3);
+ mnHelpWindowHandle = Help::ShowPopover(
+ pWindow,
+ aBox,
+ msCurrentHelpText,
+ QuickHelpFlags::Center | QuickHelpFlags::Top);
+}
+
+bool ToolTip::Hide()
+{
+ if (mnHelpWindowHandle)
+ {
+ sd::Window *pWindow (mrSlideSorter.GetContentWindow().get());
+ Help::HidePopover(pWindow, mnHelpWindowHandle);
+ mnHelpWindowHandle = nullptr;
+ return true;
+ }
+ else
+ return false;
+}
+
+IMPL_LINK_NOARG(ToolTip, DelayTrigger, Timer *, void)
+{
+ DoShow();
+}
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx b/sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx
new file mode 100644
index 000000000..ce27cec28
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx
@@ -0,0 +1,117 @@
+/* -*- 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 "SlsViewCacheContext.hxx"
+
+#include <SlideSorter.hxx>
+#include <model/SlideSorterModel.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <view/SlideSorterView.hxx>
+#include <sdpage.hxx>
+#include <Window.hxx>
+#include <drawdoc.hxx>
+#include <tools/IdleDetection.hxx>
+#include <svx/svdpage.hxx>
+
+namespace sd::slidesorter::view {
+
+ViewCacheContext::ViewCacheContext (SlideSorter& rSlideSorter)
+ : mrModel(rSlideSorter.GetModel()),
+ mrSlideSorter(rSlideSorter)
+{
+}
+
+ViewCacheContext::~ViewCacheContext()
+{
+}
+
+void ViewCacheContext::NotifyPreviewCreation(cache::CacheKey aKey)
+{
+ const model::SharedPageDescriptor pDescriptor (GetDescriptor(aKey));
+ if (pDescriptor)
+ {
+ // Force a repaint that will trigger their re-creation.
+ mrSlideSorter.GetView().RequestRepaint(pDescriptor);
+ }
+ else
+ {
+ // It is OK when a preview was created for a page that is not
+ // currently displayed because both normal and master pages are
+ // kept in the same cache.
+ }
+}
+
+bool ViewCacheContext::IsIdle()
+{
+ tools::IdleState nIdleState (tools::IdleDetection::GetIdleState(mrSlideSorter.GetContentWindow()));
+ return nIdleState == tools::IdleState::Idle;
+}
+
+bool ViewCacheContext::IsVisible (cache::CacheKey aKey)
+{
+ const model::SharedPageDescriptor pDescriptor (GetDescriptor(aKey));
+ return pDescriptor && pDescriptor->HasState(model::PageDescriptor::ST_Visible);
+}
+
+const SdrPage* ViewCacheContext::GetPage (cache::CacheKey aKey)
+{
+ return aKey;
+}
+
+std::shared_ptr<std::vector<cache::CacheKey> > ViewCacheContext::GetEntryList (bool bVisible)
+{
+ auto pKeys = std::make_shared<std::vector<cache::CacheKey>>();
+
+ model::PageEnumeration aPageEnumeration (
+ bVisible
+ ? model::PageEnumerationProvider::CreateVisiblePagesEnumeration(mrModel)
+ : model::PageEnumerationProvider::CreateAllPagesEnumeration(mrModel));
+
+ while (aPageEnumeration.HasMoreElements())
+ {
+ model::SharedPageDescriptor pDescriptor (aPageEnumeration.GetNextElement());
+ pKeys->push_back(pDescriptor->GetPage());
+ }
+
+ return pKeys;
+}
+
+sal_Int32 ViewCacheContext::GetPriority (cache::CacheKey aKey)
+{
+ return - (aKey->GetPageNum()-1) / 2;
+}
+
+model::SharedPageDescriptor ViewCacheContext::GetDescriptor (cache::CacheKey aKey)
+{
+ sal_uInt16 nPageIndex ((aKey->GetPageNum() - 1) / 2);
+ return mrModel.GetPageDescriptor(nPageIndex);
+}
+
+css::uno::Reference<css::uno::XInterface> ViewCacheContext::GetModel()
+{
+ if (mrModel.GetDocument() == nullptr)
+ return nullptr;
+ else
+ return mrModel.GetDocument()->getUnoModel();
+}
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/slidesorter/view/SlsViewCacheContext.hxx b/sd/source/ui/slidesorter/view/SlsViewCacheContext.hxx
new file mode 100644
index 000000000..501517cb8
--- /dev/null
+++ b/sd/source/ui/slidesorter/view/SlsViewCacheContext.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <cache/SlsCacheContext.hxx>
+#include <model/SlsSharedPageDescriptor.hxx>
+
+namespace sd::slidesorter::model
+{
+class SlideSorterModel;
+}
+namespace sd::slidesorter
+{
+class SlideSorter;
+}
+
+namespace sd::slidesorter::view
+{
+/** The cache context for the SlideSorter as used by Draw and Impress. See
+ the base class for documentation of the individual methods.
+*/
+class ViewCacheContext : public cache::CacheContext
+{
+public:
+ explicit ViewCacheContext(SlideSorter& rSlideSorter);
+ virtual ~ViewCacheContext() override;
+ virtual void NotifyPreviewCreation(cache::CacheKey aKey) override;
+ virtual bool IsIdle() override;
+ virtual bool IsVisible(cache::CacheKey aKey) override;
+ virtual const SdrPage* GetPage(cache::CacheKey aKey) override;
+ virtual std::shared_ptr<std::vector<cache::CacheKey>> GetEntryList(bool bVisible) override;
+ virtual sal_Int32 GetPriority(cache::CacheKey aKey) override;
+ virtual css::uno::Reference<css::uno::XInterface> GetModel() override;
+
+private:
+ model::SlideSorterModel& mrModel;
+ SlideSorter& mrSlideSorter;
+
+ model::SharedPageDescriptor GetDescriptor(cache::CacheKey aKey);
+};
+
+} // end of namespace ::sd::slidesorter::view
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/table/TableDesignPane.cxx b/sd/source/ui/table/TableDesignPane.cxx
new file mode 100644
index 000000000..82d4485fb
--- /dev/null
+++ b/sd/source/ui/table/TableDesignPane.cxx
@@ -0,0 +1,763 @@
+/* -*- 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 <string_view>
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/view/XSelectionSupplier.hpp>
+#include <com/sun/star/style/XStyle.hpp>
+#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
+
+#include <comphelper/sequence.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <vcl/image.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/virdev.hxx>
+
+#include <tools/debug.hxx>
+#include <tools/diagnose_ex.h>
+#include <svl/style.hxx>
+#include <svl/stritem.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/app.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svx/svxids.hrc>
+#include <svx/svdetc.hxx>
+#include <editeng/boxitem.hxx>
+#include <editeng/borderline.hxx>
+#include <editeng/colritem.hxx>
+#include <editeng/eeitem.hxx>
+#include <svx/sdr/table/tabledesign.hxx>
+#include <o3tl/enumrange.hxx>
+
+#include <TableDesignPane.hxx>
+
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <EventMultiplexer.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::view;
+using namespace ::com::sun::star::style;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::ui;
+
+namespace sd {
+
+const sal_Int32 nPreviewColumns = 5;
+const sal_Int32 nPreviewRows = 5;
+const sal_Int32 nCellWidth = 12; // one pixel is shared with the next cell!
+const sal_Int32 nCellHeight = 7; // one pixel is shared with the next cell!
+const sal_Int32 nBitmapWidth = (nCellWidth * nPreviewColumns) - (nPreviewColumns - 1);
+const sal_Int32 nBitmapHeight = (nCellHeight * nPreviewRows) - (nPreviewRows - 1);
+
+const std::string_view gPropNames[CB_COUNT] =
+{
+ "UseFirstRowStyle",
+ "UseLastRowStyle",
+ "UseBandingRowStyle",
+ "UseFirstColumnStyle",
+ "UseLastColumnStyle",
+ "UseBandingColumnStyle"
+};
+
+TableDesignWidget::TableDesignWidget(weld::Builder& rBuilder, ViewShellBase& rBase)
+ : mrBase(rBase)
+ , m_xValueSet(new TableValueSet(rBuilder.weld_scrolled_window("previewswin", true)))
+ , m_xValueSetWin(new weld::CustomWeld(rBuilder, "previews", *m_xValueSet))
+{
+ m_xValueSet->SetStyle(m_xValueSet->GetStyle() | WB_NO_DIRECTSELECT | WB_FLATVALUESET | WB_ITEMBORDER);
+ m_xValueSet->SetExtraSpacing(8);
+ m_xValueSet->setModal(false);
+ m_xValueSet->SetColor();
+ m_xValueSet->SetSelectHdl(LINK(this, TableDesignWidget, implValueSetHdl));
+
+ for (sal_uInt16 i = CB_HEADER_ROW; i <= CB_BANDED_COLUMNS; ++i)
+ {
+ m_aCheckBoxes[i] = rBuilder.weld_check_button(OString(gPropNames[i].data(), gPropNames[i].size()));
+ m_aCheckBoxes[i]->connect_toggled(LINK(this, TableDesignWidget, implCheckBoxHdl));
+ }
+
+ // get current controller and initialize listeners
+ try
+ {
+ mxView.set(mrBase.GetController(), UNO_QUERY);
+ addListener();
+
+ Reference< XController > xController( mrBase.GetController(), UNO_SET_THROW );
+ Reference< XStyleFamiliesSupplier > xFamiliesSupp( xController->getModel(), UNO_QUERY_THROW );
+ Reference< XNameAccess > xFamilies( xFamiliesSupp->getStyleFamilies() );
+ mxTableFamily.set( xFamilies->getByName( "table" ), UNO_QUERY_THROW );
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::CustomAnimationPane::CustomAnimationPane()" );
+ }
+
+ onSelectionChanged();
+ updateControls();
+}
+
+TableDesignWidget::~TableDesignWidget()
+{
+ removeListener();
+}
+
+static SfxBindings* getBindings( ViewShellBase const & rBase )
+{
+ if( rBase.GetMainViewShell() && rBase.GetMainViewShell()->GetViewFrame() )
+ return &rBase.GetMainViewShell()->GetViewFrame()->GetBindings();
+ else
+ return nullptr;
+}
+
+static SfxDispatcher* getDispatcher( ViewShellBase const & rBase )
+{
+ if( rBase.GetMainViewShell() && rBase.GetMainViewShell()->GetViewFrame() )
+ return rBase.GetMainViewShell()->GetViewFrame()->GetDispatcher();
+ else
+ return nullptr;
+}
+
+IMPL_LINK_NOARG(TableDesignWidget, implValueSetHdl, ValueSet*, void)
+{
+ ApplyStyle();
+}
+
+void TableDesignWidget::ApplyStyle()
+{
+ try
+ {
+ OUString sStyleName;
+ sal_Int32 nIndex = static_cast< sal_Int32 >( m_xValueSet->GetSelectedItemId() ) - 1;
+
+ if( (nIndex >= 0) && (nIndex < mxTableFamily->getCount()) )
+ {
+ Reference< XNameAccess > xNames( mxTableFamily, UNO_QUERY_THROW );
+ sStyleName = xNames->getElementNames()[nIndex];
+ }
+
+ if( sStyleName.isEmpty() )
+ return;
+
+ SdrView* pView = mrBase.GetDrawView();
+ if( mxSelectedTable.is() )
+ {
+ if( pView )
+ {
+ SfxRequest aReq( SID_TABLE_STYLE, SfxCallMode::SYNCHRON, SfxGetpApp()->GetPool() );
+ aReq.AppendItem( SfxStringItem( SID_TABLE_STYLE, sStyleName ) );
+
+ const rtl::Reference< sdr::SelectionController >& xController( pView->getSelectionController() );
+ if( xController.is() )
+ xController->Execute( aReq );
+
+ SfxBindings* pBindings = getBindings( mrBase );
+ if( pBindings )
+ {
+ pBindings->Invalidate( SID_UNDO );
+ pBindings->Invalidate( SID_REDO );
+ }
+ }
+ }
+ else
+ {
+ SfxDispatcher* pDispatcher = getDispatcher( mrBase );
+ SfxStringItem aArg( SID_TABLE_STYLE, sStyleName );
+ pDispatcher->ExecuteList(SID_INSERT_TABLE, SfxCallMode::ASYNCHRON,
+ { &aArg });
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "TableDesignWidget::implValueSetHdl()");
+ }
+}
+
+IMPL_LINK_NOARG(TableDesignWidget, implCheckBoxHdl, weld::Toggleable&, void)
+{
+ ApplyOptions();
+ FillDesignPreviewControl();
+}
+
+void TableDesignWidget::ApplyOptions()
+{
+ static const sal_uInt16 gParamIds[CB_COUNT] =
+ {
+ ID_VAL_USEFIRSTROWSTYLE, ID_VAL_USELASTROWSTYLE, ID_VAL_USEBANDINGROWSTYLE,
+ ID_VAL_USEFIRSTCOLUMNSTYLE, ID_VAL_USELASTCOLUMNSTYLE, ID_VAL_USEBANDINGCOLUMNSTYLE
+ };
+
+ if( !mxSelectedTable.is() )
+ return;
+
+ SfxRequest aReq( SID_TABLE_STYLE_SETTINGS, SfxCallMode::SYNCHRON, SfxGetpApp()->GetPool() );
+
+ for( sal_uInt16 i = CB_HEADER_ROW; i <= CB_BANDED_COLUMNS; ++i )
+ {
+ aReq.AppendItem( SfxBoolItem( gParamIds[i], m_aCheckBoxes[i]->get_active() ) );
+ }
+
+ SdrView* pView = mrBase.GetDrawView();
+ if( !pView )
+ return;
+
+ const rtl::Reference< sdr::SelectionController >& xController( pView->getSelectionController() );
+ if( xController.is() )
+ {
+ xController->Execute( aReq );
+
+ SfxBindings* pBindings = getBindings( mrBase );
+ if( pBindings )
+ {
+ pBindings->Invalidate( SID_UNDO );
+ pBindings->Invalidate( SID_REDO );
+ }
+ }
+}
+
+void TableDesignWidget::onSelectionChanged()
+{
+ Reference< XPropertySet > xNewSelection;
+
+ if( mxView.is() ) try
+ {
+ Reference< XSelectionSupplier > xSel( mxView, UNO_QUERY_THROW );
+ Any aSel( xSel->getSelection() );
+ Sequence< XShape > xShapeSeq;
+ if( aSel >>= xShapeSeq )
+ {
+ if( xShapeSeq.getLength() == 1 )
+ aSel <<= xShapeSeq[0];
+ }
+ else
+ {
+ Reference< XShapes > xShapes( aSel, UNO_QUERY );
+ if( xShapes.is() && (xShapes->getCount() == 1) )
+ aSel = xShapes->getByIndex(0);
+ }
+
+ Reference< XShapeDescriptor > xDesc( aSel, UNO_QUERY );
+ if( xDesc.is() && ( xDesc->getShapeType() == "com.sun.star.drawing.TableShape" || xDesc->getShapeType() == "com.sun.star.presentation.TableShape" ) )
+ {
+ xNewSelection.set( xDesc, UNO_QUERY );
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::TableDesignWidget::onSelectionChanged()" );
+ }
+
+ if( mxSelectedTable != xNewSelection )
+ {
+ mxSelectedTable = xNewSelection;
+ updateControls();
+ }
+}
+
+void TableValueSet::Resize()
+{
+ ValueSet::Resize();
+ // Calculate the number of rows and columns.
+ if( GetItemCount() <= 0 )
+ return;
+
+ Size aValueSetSize = GetOutputSizePixel();
+
+ Image aImage = GetItemImage(GetItemId(0));
+ Size aItemSize = aImage.GetSizePixel();
+
+ aItemSize.AdjustHeight(10 );
+ int nColumnCount = (aValueSetSize.Width() - GetScrollWidth()) / aItemSize.Width();
+ if (nColumnCount < 1)
+ nColumnCount = 1;
+
+ int nRowCount = (GetItemCount() + nColumnCount - 1) / nColumnCount;
+ if (nRowCount < 1)
+ nRowCount = 1;
+
+ int nVisibleRowCount = (aValueSetSize.Height()+2) / aItemSize.Height();
+
+ SetColCount (static_cast<sal_uInt16>(nColumnCount));
+ SetLineCount (static_cast<sal_uInt16>(nRowCount));
+
+ if( !m_bModal )
+ {
+ WinBits nStyle = GetStyle() & ~WB_VSCROLL;
+ if( nRowCount > nVisibleRowCount )
+ {
+ nStyle |= WB_VSCROLL;
+ }
+ SetStyle( nStyle );
+ }
+}
+
+TableValueSet::TableValueSet(std::unique_ptr<weld::ScrolledWindow> pScrolledWindow)
+ : ValueSet(std::move(pScrolledWindow))
+ , m_bModal(false)
+{
+}
+
+void TableValueSet::StyleUpdated()
+{
+ updateSettings();
+}
+
+void TableValueSet::updateSettings()
+{
+ if( !m_bModal )
+ {
+ Color aColor = Application::GetSettings().GetStyleSettings().GetWindowColor();
+ SetColor(aColor);
+ SetExtraSpacing(8);
+ }
+}
+
+void TableDesignWidget::updateControls()
+{
+ static const bool gDefaults[CB_COUNT] = { true, false, true, false, false, false };
+
+ const bool bHasTable = mxSelectedTable.is();
+
+ for (sal_uInt16 i = CB_HEADER_ROW; i <= CB_BANDED_COLUMNS; ++i)
+ {
+ bool bUse = gDefaults[i];
+ if( bHasTable ) try
+ {
+ mxSelectedTable->getPropertyValue( OUString::createFromAscii(gPropNames[i]) ) >>= bUse;
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::TableDesignWidget::updateControls()");
+ }
+ m_aCheckBoxes[i]->set_active(bUse);
+ m_aCheckBoxes[i]->set_sensitive(bHasTable);
+ }
+
+ FillDesignPreviewControl();
+ m_xValueSet->updateSettings();
+ m_xValueSet->Resize();
+
+ sal_uInt16 nSelection = 0;
+ if( mxSelectedTable.is() )
+ {
+ Reference< XNamed > xNamed( mxSelectedTable->getPropertyValue( "TableTemplate" ), UNO_QUERY );
+ if( xNamed.is() )
+ {
+ const OUString sStyleName( xNamed->getName() );
+
+ Reference< XNameAccess > xNames( mxTableFamily, UNO_QUERY );
+ if( xNames.is() )
+ {
+ Sequence< OUString > aNames( xNames->getElementNames() );
+ sal_Int32 nIndex = comphelper::findValue(aNames, sStyleName);
+ if (nIndex != -1)
+ nSelection = static_cast<sal_uInt16>(nIndex) + 1;
+ }
+ }
+ }
+ m_xValueSet->SelectItem( nSelection );
+}
+
+void TableDesignWidget::addListener()
+{
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,TableDesignWidget,EventMultiplexerListener) );
+ mrBase.GetEventMultiplexer()->AddEventListener( aLink );
+}
+
+void TableDesignWidget::removeListener()
+{
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,TableDesignWidget,EventMultiplexerListener) );
+ mrBase.GetEventMultiplexer()->RemoveEventListener( aLink );
+}
+
+IMPL_LINK(TableDesignWidget,EventMultiplexerListener,
+ tools::EventMultiplexerEvent&, rEvent, void)
+{
+ switch (rEvent.meEventId)
+ {
+ case EventMultiplexerEventId::CurrentPageChanged:
+ case EventMultiplexerEventId::EditViewSelection:
+ onSelectionChanged();
+ break;
+
+ case EventMultiplexerEventId::MainViewRemoved:
+ mxView.clear();
+ onSelectionChanged();
+ break;
+
+ case EventMultiplexerEventId::MainViewAdded:
+ mxView.set( mrBase.GetController(), UNO_QUERY );
+ onSelectionChanged();
+ break;
+
+ default: break;
+ }
+}
+
+namespace {
+
+struct CellInfo
+{
+ Color maCellColor;
+ Color maTextColor;
+ std::shared_ptr<SvxBoxItem> maBorder;
+
+ explicit CellInfo( const Reference< XStyle >& xStyle );
+};
+
+}
+
+CellInfo::CellInfo( const Reference< XStyle >& xStyle )
+: maBorder(std::make_shared<SvxBoxItem>(SDRATTR_TABLE_BORDER))
+{
+ SfxStyleSheet* pStyleSheet = SfxUnoStyleSheet::getUnoStyleSheet( xStyle );
+ if( !pStyleSheet )
+ return;
+
+ SfxItemSet& rSet = pStyleSheet->GetItemSet();
+
+ // get style fill color
+ if( !GetDraftFillColor(rSet, maCellColor) )
+ maCellColor = COL_TRANSPARENT;
+
+ // get style text color
+ const SvxColorItem* pTextColor = rSet.GetItem(EE_CHAR_COLOR);
+ if( pTextColor )
+ maTextColor = pTextColor->GetValue();
+ else
+ maTextColor = COL_TRANSPARENT;
+
+ // get border
+ const SvxBoxItem* pBoxItem = rSet.GetItem( SDRATTR_TABLE_BORDER );
+ if( pBoxItem )
+ maBorder.reset(pBoxItem->Clone());
+}
+
+typedef std::vector< std::shared_ptr< CellInfo > > CellInfoVector;
+typedef std::shared_ptr< CellInfo > CellInfoMatrix[nPreviewColumns * nPreviewRows];
+
+namespace {
+
+struct TableStyleSettings
+{
+ bool mbUseFirstRow;
+ bool mbUseLastRow;
+ bool mbUseFirstColumn;
+ bool mbUseLastColumn;
+ bool mbUseRowBanding;
+ bool mbUseColumnBanding;
+
+ TableStyleSettings()
+ : mbUseFirstRow(true)
+ , mbUseLastRow(false)
+ , mbUseFirstColumn(false)
+ , mbUseLastColumn(false)
+ , mbUseRowBanding(true)
+ , mbUseColumnBanding(false) {}
+};
+
+}
+
+static void FillCellInfoVector( const Reference< XIndexAccess >& xTableStyle, CellInfoVector& rVector )
+{
+ DBG_ASSERT( xTableStyle.is() && (xTableStyle->getCount() == sdr::table::style_count ), "sd::FillCellInfoVector(), invalid table style!" );
+ if( !xTableStyle.is() )
+ return;
+
+ try
+ {
+ rVector.resize( sdr::table::style_count );
+
+ for( sal_Int32 nStyle = 0; nStyle < sdr::table::style_count; ++nStyle )
+ {
+ Reference< XStyle > xStyle( xTableStyle->getByIndex( nStyle ), UNO_QUERY );
+ if( xStyle.is() )
+ rVector[nStyle] = std::make_shared<CellInfo>( xStyle );
+ }
+ }
+ catch(Exception&)
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::FillCellInfoVector()");
+ }
+}
+
+static void FillCellInfoMatrix( const CellInfoVector& rStyle, const TableStyleSettings& rSettings, CellInfoMatrix& rMatrix )
+{
+ for( sal_Int32 nRow = 0; nRow < nPreviewColumns; ++nRow )
+ {
+ const bool bFirstRow = rSettings.mbUseFirstRow && (nRow == 0);
+ const bool bLastRow = rSettings.mbUseLastRow && (nRow == nPreviewColumns - 1);
+
+ for( sal_Int32 nCol = 0; nCol < nPreviewColumns; ++nCol )
+ {
+ std::shared_ptr< CellInfo > xCellInfo;
+
+ // first and last row win first, if used and available
+ if( bFirstRow )
+ {
+ xCellInfo = rStyle[sdr::table::first_row_style];
+ }
+ else if( bLastRow )
+ {
+ xCellInfo = rStyle[sdr::table::last_row_style];
+ }
+
+ if( !xCellInfo )
+ {
+ // next come first and last column, if used and available
+ if( rSettings.mbUseFirstColumn && (nCol == 0) )
+ {
+ xCellInfo = rStyle[sdr::table::first_column_style];
+ }
+ else if( rSettings.mbUseLastColumn && (nCol == nPreviewColumns-1) )
+ {
+ xCellInfo = rStyle[sdr::table::last_column_style];
+ }
+ }
+
+ if( !xCellInfo )
+ {
+ if( rSettings.mbUseRowBanding )
+ {
+ if( (nRow & 1) == 0 )
+ {
+ xCellInfo = rStyle[sdr::table::even_rows_style];
+ }
+ else
+ {
+ xCellInfo = rStyle[sdr::table::odd_rows_style];
+ }
+ }
+ }
+
+ if( !xCellInfo )
+ {
+ if( rSettings.mbUseColumnBanding )
+ {
+ if( (nCol & 1) == 0 )
+ {
+ xCellInfo = rStyle[sdr::table::even_columns_style];
+ }
+ else
+ {
+ xCellInfo = rStyle[sdr::table::odd_columns_style];
+ }
+ }
+ }
+
+ if( !xCellInfo )
+ {
+ // use default cell style if non found yet
+ xCellInfo = rStyle[sdr::table::body_style];
+ }
+
+ rMatrix[(nCol * nPreviewColumns) + nRow] = xCellInfo;
+ }
+ }
+}
+
+static BitmapEx CreateDesignPreview( const Reference< XIndexAccess >& xTableStyle, const TableStyleSettings& rSettings, bool bIsPageDark )
+{
+ CellInfoVector aCellInfoVector(sdr::table::style_count);
+ FillCellInfoVector( xTableStyle, aCellInfoVector );
+
+ CellInfoMatrix aMatrix;
+ FillCellInfoMatrix( aCellInfoVector, rSettings, aMatrix );
+
+ // bbbbbbbbbbbb w = 12 pixel
+ // bccccccccccb h = 7 pixel
+ // bccccccccccb b = border color
+ // bcttttttttcb c = cell color
+ // bccccccccccb t = text color
+ // bccccccccccb
+ // bbbbbbbbbbbb
+
+ ScopedVclPtr<VirtualDevice> pVirDev(VclPtr<VirtualDevice>::Create());
+ Size aBmpSize(nBitmapWidth, nBitmapHeight);
+ pVirDev->SetOutputSizePixel(aBmpSize);
+
+ pVirDev->SetBackground( bIsPageDark ? COL_BLACK : COL_WHITE );
+ pVirDev->Erase();
+
+ // first draw cell background and text line previews
+ sal_Int32 nY = 0;
+ sal_Int32 nRow;
+ for( nRow = 0; nRow < nPreviewRows; ++nRow, nY += nCellHeight-1 )
+ {
+ sal_Int32 nX = 0;
+ for( sal_Int32 nCol = 0; nCol < nPreviewColumns; ++nCol, nX += nCellWidth-1 )
+ {
+ std::shared_ptr< CellInfo > xCellInfo(aMatrix[(nCol * nPreviewColumns) + nRow]);
+
+ Color aTextColor( COL_AUTO );
+ if( xCellInfo )
+ {
+ // fill cell background
+ const ::tools::Rectangle aRect( nX, nY, nX + nCellWidth - 1, nY + nCellHeight - 1 );
+
+ if( xCellInfo->maCellColor != COL_TRANSPARENT )
+ {
+ pVirDev->SetFillColor( xCellInfo->maCellColor );
+ pVirDev->DrawRect( aRect );
+ }
+
+ aTextColor = xCellInfo->maTextColor;
+ }
+
+ // draw text preview line
+ if( aTextColor == COL_AUTO )
+ aTextColor = bIsPageDark ? COL_WHITE : COL_BLACK;
+ pVirDev->SetLineColor( aTextColor );
+ const Point aPnt1( nX + 2, nY + ((nCellHeight - 1 ) >> 1) );
+ const Point aPnt2( nX + nCellWidth - 3, aPnt1.Y() );
+ pVirDev->DrawLine( aPnt1, aPnt2 );
+ }
+ }
+
+ // second draw border lines
+ nY = 0;
+ for( nRow = 0; nRow < nPreviewRows; ++nRow, nY += nCellHeight-1 )
+ {
+ sal_Int32 nX = 0;
+ for( sal_Int32 nCol = 0; nCol < nPreviewColumns; ++nCol, nX += nCellWidth-1 )
+ {
+ std::shared_ptr< CellInfo > xCellInfo(aMatrix[(nCol * nPreviewColumns) + nRow]);
+
+ if( xCellInfo )
+ {
+ const Point aPntTL( nX, nY );
+ const Point aPntTR( nX + nCellWidth - 1, nY );
+ const Point aPntBL( nX, nY + nCellHeight - 1 );
+ const Point aPntBR( nX + nCellWidth - 1, nY + nCellHeight - 1 );
+
+ sal_Int32 border_diffs[8] = { 0,-1, 0,1, -1,0, 1,0 };
+ sal_Int32* pDiff = &border_diffs[0];
+
+ // draw top border
+ for( SvxBoxItemLine nLine : o3tl::enumrange<SvxBoxItemLine>() )
+ {
+ const ::editeng::SvxBorderLine* pBorderLine = xCellInfo->maBorder->GetLine(nLine);
+ if( !pBorderLine || ((pBorderLine->GetOutWidth() == 0) && (pBorderLine->GetInWidth()==0)) )
+ continue;
+
+ sal_Int32 nBorderCol = nCol + *pDiff++;
+ sal_Int32 nBorderRow = nRow + *pDiff++;
+ if( (nBorderCol >= 0) && (nBorderCol < nPreviewColumns) && (nBorderRow >= 0) && (nBorderRow < nPreviewRows) )
+ {
+ // check border
+ std::shared_ptr< CellInfo > xBorderInfo(aMatrix[(nBorderCol * nPreviewColumns) + nBorderRow]);
+ if( xBorderInfo )
+ {
+ const ::editeng::SvxBorderLine* pBorderLine2 = xBorderInfo->maBorder->GetLine(static_cast<SvxBoxItemLine>(static_cast<int>(nLine)^1));
+ if( pBorderLine2 && pBorderLine2->HasPriority(*pBorderLine) )
+ continue; // other border line wins
+ }
+ }
+
+ pVirDev->SetLineColor( pBorderLine->GetColor() );
+ switch( nLine )
+ {
+ case SvxBoxItemLine::TOP: pVirDev->DrawLine( aPntTL, aPntTR ); break;
+ case SvxBoxItemLine::BOTTOM: pVirDev->DrawLine( aPntBL, aPntBR ); break;
+ case SvxBoxItemLine::LEFT: pVirDev->DrawLine( aPntTL, aPntBL ); break;
+ case SvxBoxItemLine::RIGHT: pVirDev->DrawLine( aPntTR, aPntBR ); break;
+ }
+ }
+ }
+ }
+ }
+
+ return pVirDev->GetBitmapEx(Point(0,0), aBmpSize);
+}
+
+void TableDesignWidget::FillDesignPreviewControl()
+{
+ sal_uInt16 nSelectedItem = m_xValueSet->GetSelectedItemId();
+ m_xValueSet->Clear();
+ try
+ {
+ TableStyleSettings aSettings;
+ if( mxSelectedTable.is() )
+ {
+ aSettings.mbUseFirstRow = m_aCheckBoxes[CB_HEADER_ROW]->get_active();
+ aSettings.mbUseLastRow = m_aCheckBoxes[CB_TOTAL_ROW]->get_active();
+ aSettings.mbUseRowBanding = m_aCheckBoxes[CB_BANDED_ROWS]->get_active();
+ aSettings.mbUseFirstColumn = m_aCheckBoxes[CB_FIRST_COLUMN]->get_active();
+ aSettings.mbUseLastColumn = m_aCheckBoxes[CB_LAST_COLUMN]->get_active();
+ aSettings.mbUseColumnBanding = m_aCheckBoxes[CB_BANDED_COLUMNS]->get_active();
+ }
+
+ bool bIsPageDark = false;
+ if( mxView.is() )
+ {
+ Reference< XPropertySet > xPageSet( mxView->getCurrentPage(), UNO_QUERY );
+ if( xPageSet.is() )
+ {
+ xPageSet->getPropertyValue("IsBackgroundDark") >>= bIsPageDark;
+ }
+ }
+
+ sal_Int32 nCount = mxTableFamily->getCount();
+ for( sal_Int32 nIndex = 0; nIndex < nCount; ++nIndex ) try
+ {
+ Reference< XIndexAccess > xTableStyle( mxTableFamily->getByIndex( nIndex ), UNO_QUERY );
+ if( xTableStyle.is() )
+ m_xValueSet->InsertItem( sal::static_int_cast<sal_uInt16>( nIndex + 1 ), Image( CreateDesignPreview( xTableStyle, aSettings, bIsPageDark ) ) );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::TableDesignWidget::FillDesignPreviewControl()");
+ }
+ sal_Int32 nCols = 3;
+ sal_Int32 nRows = (nCount+2)/3;
+ m_xValueSet->SetColCount(nCols);
+ m_xValueSet->SetLineCount(nRows);
+ WinBits nStyle = m_xValueSet->GetStyle() & ~WB_VSCROLL;
+ m_xValueSet->SetStyle(nStyle);
+
+ m_xValueSet->SetOptimalSize();
+ weld::DrawingArea* pDrawingArea = m_xValueSet->GetDrawingArea();
+ Size aSize = pDrawingArea->get_preferred_size();
+ aSize.AdjustWidth(10 * nCols);
+ aSize.AdjustHeight(10 * nRows);
+ pDrawingArea->set_size_request(aSize.Width(), aSize.Height());
+
+ m_xValueSet->Resize();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::TableDesignWidget::FillDesignPreviewControl()");
+ }
+ m_xValueSet->SelectItem(nSelectedItem);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/table/tablefunction.cxx b/sd/source/ui/table/tablefunction.cxx
new file mode 100644
index 000000000..c19445429
--- /dev/null
+++ b/sd/source/ui/table/tablefunction.cxx
@@ -0,0 +1,292 @@
+/* -*- 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 <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/drawing/XSelectionFunction.hpp>
+
+#include <comphelper/lok.hxx>
+
+#include <svx/svdotable.hxx>
+#include <svx/svxids.hrc>
+#include <svx/svdpagv.hxx>
+#include <svx/svxdlg.hxx>
+
+#include <svl/intitem.hxx>
+#include <svl/stritem.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/sidebar/Sidebar.hxx>
+#include <svl/style.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <tablefunction.hxx>
+#include <DrawViewShell.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <Window.hxx>
+#include <drawview.hxx>
+#include <sdmod.hxx>
+
+#include <memory>
+
+using namespace ::sd;
+using namespace sdr::table;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::linguistic2;
+
+namespace sd
+{
+
+static void apply_table_style( SdrTableObj* pObj, SdrModel const * pModel, const OUString& sTableStyle )
+{
+ if( !(pModel && pObj) )
+ return;
+
+ Reference< XNameAccess > xPool( dynamic_cast< XNameAccess* >( pModel->GetStyleSheetPool() ) );
+ if( !xPool.is() )
+ return;
+
+ try
+ {
+ Reference< XNameContainer > xTableFamily( xPool->getByName( "table" ), UNO_QUERY_THROW );
+ OUString aStdName( "default" );
+ if( !sTableStyle.isEmpty() )
+ aStdName = sTableStyle;
+ Reference< XIndexAccess > xStyle( xTableFamily->getByName( aStdName ), UNO_QUERY_THROW );
+ pObj->setTableStyle( xStyle );
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::apply_default_table_style()");
+ }
+}
+
+static void InsertTableImpl(const DrawViewShell* pShell,
+ ::sd::View* pView,
+ sal_Int32 nColumns,
+ sal_Int32 nRows,
+ const OUString& sTableStyle)
+{
+ ::tools::Rectangle aRect;
+
+ SdrObject* pPickObj = pView->GetEmptyPresentationObject( PresObjKind::Table );
+ if( pPickObj )
+ {
+ aRect = pPickObj->GetLogicRect();
+ aRect.setHeight( 200 );
+ }
+ else
+ {
+ Size aSize( 14100, 2000 );
+
+ Point aPos;
+ ::tools::Rectangle aWinRect(aPos, pShell->GetActiveWindow()->GetOutputSizePixel());
+ aWinRect = pShell->GetActiveWindow()->PixelToLogic(aWinRect);
+
+ // make sure that the default size of the table fits on the paper and is inside the viewing area.
+ // if zoomed in close, don't make the table bigger than the viewing window.
+ Size aMaxSize = pShell->getCurrentPage()->GetSize();
+
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ // aWinRect is nonsensical in the LOK case
+ aWinRect = ::tools::Rectangle(aPos, aMaxSize);
+ }
+ else
+ {
+ if( aMaxSize.Height() > aWinRect.getHeight() )
+ aMaxSize.setHeight( aWinRect.getHeight() );
+ if( aMaxSize.Width() > aWinRect.getWidth() )
+ aMaxSize.setWidth( aWinRect.getWidth() );
+ }
+
+ if( aSize.Width() > aMaxSize.getWidth() )
+ aSize.setWidth( aMaxSize.getWidth() );
+
+ // adjust height based on # of rows.
+ if( nRows > 0 )
+ {
+ aSize.setHeight( aSize.Height() * nRows );
+ if( aSize.Height() > aMaxSize.getHeight() )
+ aSize.setHeight( aMaxSize.getHeight() );
+ }
+
+ aPos = aWinRect.Center();
+ aPos.AdjustX( -(aSize.Width() / 2) );
+ aPos.AdjustY( -(aSize.Height() / 2) );
+ aRect = ::tools::Rectangle(aPos, aSize);
+ }
+
+ sdr::table::SdrTableObj* pObj = new sdr::table::SdrTableObj(
+ *pShell->GetDoc(), // TTTT should be reference
+ aRect,
+ nColumns,
+ nRows);
+ pObj->NbcSetStyleSheet( pShell->GetDoc()->GetDefaultStyleSheet(), true );
+ apply_table_style( pObj, pShell->GetDoc(), sTableStyle );
+ SdrPageView* pPV = pView->GetSdrPageView();
+
+ // #i123359# if an object is to be replaced/manipulated it may be that it is in text edit mode,
+ // so to be on the safe side call SdrEndTextEdit here
+ SdrTextObj* pCheckForTextEdit = dynamic_cast< SdrTextObj* >(pPickObj);
+
+ if(pCheckForTextEdit && pCheckForTextEdit->IsInEditMode())
+ {
+ pView->SdrEndTextEdit();
+ }
+
+ // if we have a pick obj we need to make this new ole a pres obj replacing the current pick obj
+ if( pPickObj )
+ {
+ SdPage* pPage = static_cast< SdPage* >(pPickObj->getSdrPageFromSdrObject());
+ if(pPage && pPage->IsPresObj(pPickObj))
+ {
+ pObj->SetUserCall( pPickObj->GetUserCall() );
+ pPage->InsertPresObj( pObj, PresObjKind::Table );
+ }
+ }
+
+ pShell->GetParentWindow()->GrabFocus();
+ if( pPickObj )
+ pView->ReplaceObjectAtView(pPickObj, *pPV, pObj );
+ else
+ pView->InsertObjectAtView(pObj, *pPV, SdrInsertFlags::SETDEFLAYER);
+}
+
+void DrawViewShell::FuTable(SfxRequest& rReq)
+{
+ switch( rReq.GetSlot() )
+ {
+ case SID_INSERT_TABLE:
+ {
+ sal_Int32 nColumns = 0;
+ sal_Int32 nRows = 0;
+ OUString sTableStyle;
+ DrawViewShell* pShell = this;
+ ::sd::View* pView = mpView;
+
+ const SfxUInt16Item* pCols = rReq.GetArg<SfxUInt16Item>(SID_ATTR_TABLE_COLUMN);
+ const SfxUInt16Item* pRows = rReq.GetArg<SfxUInt16Item>(SID_ATTR_TABLE_ROW);
+ const SfxStringItem* pStyle = rReq.GetArg<SfxStringItem>(SID_TABLE_STYLE);
+
+ if( pCols )
+ nColumns = pCols->GetValue();
+
+ if( pRows )
+ nRows = pRows->GetValue();
+
+ if( pStyle )
+ sTableStyle = pStyle->GetValue();
+
+ if( (nColumns == 0) || (nRows == 0) )
+ {
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ std::shared_ptr<SvxAbstractNewTableDialog> pDlg( pFact->CreateSvxNewTableDialog(rReq.GetFrameWeld()) );
+
+ weld::DialogController::runAsync(pDlg->getDialogController(),
+ [pDlg, pShell, pView, sTableStyle] (sal_Int32 nResult) {
+ if (nResult == RET_OK)
+ {
+ sal_Int32 nColumnsIn = pDlg->getColumns();
+ sal_Int32 nRowsIn = pDlg->getRows();
+
+ InsertTableImpl(pShell, pView, nColumnsIn, nRowsIn, sTableStyle);
+ }
+ });
+ }
+ else
+ {
+ InsertTableImpl(pShell, pView, nColumns, nRows, sTableStyle);
+ }
+
+ rReq.Ignore();
+ SfxViewShell* pViewShell = GetViewShell();
+ OSL_ASSERT (pViewShell!=nullptr);
+ SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_INSERT_TABLE, true );
+ break;
+ }
+ case SID_TABLEDESIGN:
+ {
+ // First make sure that the sidebar is visible
+ GetViewFrame()->ShowChildWindow(SID_SIDEBAR);
+ ::sfx2::sidebar::Sidebar::ShowPanel(
+ u"SdTableDesignPanel",
+ GetViewFrame()->GetFrame().GetFrameInterface());
+
+ Cancel();
+ rReq.Done ();
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+void DrawViewShell::GetTableMenuState( SfxItemSet &rSet )
+{
+ OUString aActiveLayer = mpDrawView->GetActiveLayer();
+ SdrPageView* pPV = mpDrawView->GetSdrPageView();
+
+ if(
+ ( !aActiveLayer.isEmpty() && pPV && ( pPV->IsLayerLocked(aActiveLayer) ||
+ !pPV->IsLayerVisible(aActiveLayer) ) ) ||
+ SD_MOD()->GetWaterCan() )
+ {
+ rSet.DisableItem( SID_INSERT_TABLE );
+ }
+}
+
+void CreateTableFromRTF( SvStream& rStream, SdDrawDocument* pModel )
+{
+ rStream.Seek( 0 );
+
+ if( !pModel )
+ return;
+
+ SdrPage* pPage = pModel->GetPage(0);
+ if( !pPage )
+ return;
+
+ Size aSize( 200, 200 );
+ ::tools::Rectangle aRect (Point(), aSize);
+ sdr::table::SdrTableObj* pObj = new sdr::table::SdrTableObj(
+ *pModel,
+ aRect,
+ 1,
+ 1);
+ pObj->NbcSetStyleSheet( pModel->GetDefaultStyleSheet(), true );
+ apply_table_style( pObj, pModel, OUString() );
+
+ pPage->NbcInsertObject( pObj );
+
+ sdr::table::ImportAsRTF( rStream, *pObj );
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/table/tableobjectbar.cxx b/sd/source/ui/table/tableobjectbar.cxx
new file mode 100644
index 000000000..62d81d980
--- /dev/null
+++ b/sd/source/ui/table/tableobjectbar.cxx
@@ -0,0 +1,224 @@
+/* -*- 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 <sfx2/bindings.hxx>
+#include <sfx2/msg.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/objface.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/msgpool.hxx>
+#include <vcl/EnumContext.hxx>
+#include <svl/intitem.hxx>
+#include <svx/svxdlg.hxx>
+#include <svx/svxids.hrc>
+
+#include <createtableobjectbar.hxx>
+#include <registerinterfaces.hxx>
+
+#include <strings.hrc>
+#include <DrawDocShell.hxx>
+#include <ViewShell.hxx>
+#include <sdmod.hxx>
+#include <sdresid.hxx>
+#include <DrawViewShell.hxx>
+
+#include "tableobjectbar.hxx"
+
+using namespace sd;
+using namespace sd::ui::table;
+
+#define ShellClass_TableObjectBar
+#include <sdslots.hxx>
+
+namespace sd::ui::table {
+
+/** creates a table object bar for the given ViewShell */
+SfxShell* CreateTableObjectBar( ViewShell& rShell, ::sd::View* pView )
+{
+ return new TableObjectBar( &rShell, pView );
+}
+
+/** registers the interfaces from the table ui */
+void RegisterInterfaces(const SfxModule* pMod)
+{
+ TableObjectBar::RegisterInterface(pMod);
+}
+
+
+SFX_IMPL_INTERFACE(TableObjectBar, SfxShell)
+
+void TableObjectBar::InitInterface_Impl()
+{
+}
+
+TableObjectBar::TableObjectBar( ViewShell* pSdViewShell, ::sd::View* pSdView )
+: SfxShell( pSdViewShell->GetViewShell() )
+, mpView( pSdView )
+, mpViewSh( pSdViewShell )
+{
+ DrawDocShell* pDocShell = mpViewSh->GetDocSh();
+ if( pDocShell )
+ {
+ SetPool( &pDocShell->GetPool() );
+ SetUndoManager( pDocShell->GetUndoManager() );
+ }
+ SetRepeatTarget( mpView );
+ SetName( SdResId( RID_DRAW_TABLE_TOOLBOX ) );
+ SetContextName(vcl::EnumContext::GetContextName(vcl::EnumContext::Context::Table));
+}
+
+TableObjectBar::~TableObjectBar()
+{
+ SetRepeatTarget( nullptr );
+}
+
+void TableObjectBar::GetState( SfxItemSet& rSet )
+{
+ if( mpView )
+ {
+ rtl::Reference< sdr::SelectionController > xController( mpView->getSelectionController() );
+ if( xController.is() )
+ {
+ xController->GetState( rSet );
+ }
+ }
+}
+
+void TableObjectBar::GetAttrState( SfxItemSet& rSet )
+{
+ DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >( mpViewSh );
+ if( pDrawViewShell )
+ pDrawViewShell->GetAttrState( rSet );
+}
+
+void TableObjectBar::Execute( SfxRequest& rReq )
+{
+ if( !mpView )
+ return;
+
+ SdrView* pView = mpView;
+ SfxBindings* pBindings = &mpViewSh->GetViewFrame()->GetBindings();
+
+ rtl::Reference< sdr::SelectionController > xController( mpView->getSelectionController() );
+ sal_uLong nSlotId = rReq.GetSlot();
+ if( xController.is() )
+ {
+ switch( nSlotId )
+ {
+ case SID_TABLE_INSERT_ROW_DLG:
+ case SID_TABLE_INSERT_ROW_BEFORE:
+ case SID_TABLE_INSERT_ROW_AFTER:
+ case SID_TABLE_INSERT_COL_DLG:
+ case SID_TABLE_INSERT_COL_BEFORE:
+ case SID_TABLE_INSERT_COL_AFTER:
+ {
+ ScopedVclPtr<SvxAbstractInsRowColDlg> pDlg;
+ if (nSlotId == SID_TABLE_INSERT_ROW_DLG || nSlotId == SID_TABLE_INSERT_COL_DLG)
+ {
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ vcl::Window* pWin = mpView->GetViewShell()->GetParentWindow();
+ pDlg.disposeAndReset( pFact->CreateSvxInsRowColDlg(pWin ? pWin->GetFrameWeld() : nullptr,
+ nSlotId == SID_TABLE_INSERT_COL_DLG,
+ SD_MOD()->GetSlotPool()->GetSlot(nSlotId)->GetCommand()) );
+
+ if (pDlg->Execute() != 1)
+ break;
+ }
+
+ sal_uInt16 nCount = 1;
+ bool bInsertAfter = (nSlotId == SID_TABLE_INSERT_ROW_AFTER) || (nSlotId == SID_TABLE_INSERT_COL_AFTER);
+
+ if (nSlotId == SID_TABLE_INSERT_ROW_DLG)
+ {
+ nCount = pDlg->getInsertCount();
+ bInsertAfter = !pDlg->isInsertBefore();
+ }
+ else if (nSlotId == SID_TABLE_INSERT_COL_DLG)
+ {
+ nCount = pDlg->getInsertCount();
+ bInsertAfter = !pDlg->isInsertBefore();
+ }
+
+ if (nSlotId == SID_TABLE_INSERT_ROW_DLG || nSlotId == SID_TABLE_INSERT_ROW_BEFORE || nSlotId == SID_TABLE_INSERT_ROW_AFTER)
+ nSlotId = SID_TABLE_INSERT_ROW;
+ else
+ nSlotId = SID_TABLE_INSERT_COL;
+
+ rReq.AppendItem(SfxInt16Item(static_cast<sal_uInt16>(nSlotId), nCount));
+ rReq.AppendItem(SfxBoolItem(SID_TABLE_PARAM_INSERT_AFTER, bInsertAfter));
+
+ rReq.SetSlot( static_cast<sal_uInt16>(nSlotId) );
+ }
+ }
+
+ xController->Execute( rReq );
+ }
+
+ // note: we may be deleted at this point, no more member access possible
+
+ switch( rReq.GetSlot() )
+ {
+ case SID_ATTR_BORDER:
+ case SID_TABLE_MERGE_CELLS:
+ case SID_TABLE_SPLIT_CELLS:
+ case SID_OPTIMIZE_TABLE:
+ case SID_TABLE_DELETE_ROW:
+ case SID_TABLE_DELETE_COL:
+ case SID_TABLE_DELETE_TABLE:
+ case SID_FORMAT_TABLE_DLG:
+ case SID_TABLE_INSERT_ROW:
+ case SID_TABLE_INSERT_COL:
+ {
+ pView->AdjustMarkHdl();
+ pBindings->Invalidate( SID_TABLE_DELETE_ROW );
+ pBindings->Invalidate( SID_TABLE_DELETE_COL );
+ pBindings->Invalidate( SID_TABLE_DELETE_TABLE );
+ pBindings->Invalidate( SID_FRAME_LINESTYLE );
+ pBindings->Invalidate( SID_FRAME_LINECOLOR );
+ pBindings->Invalidate( SID_ATTR_BORDER );
+ pBindings->Invalidate( SID_ATTR_FILL_STYLE );
+ pBindings->Invalidate( SID_ATTR_FILL_USE_SLIDE_BACKGROUND );
+ pBindings->Invalidate( SID_ATTR_FILL_TRANSPARENCE );
+ pBindings->Invalidate( SID_ATTR_FILL_FLOATTRANSPARENCE );
+ pBindings->Invalidate( SID_TABLE_MERGE_CELLS );
+ pBindings->Invalidate( SID_TABLE_SPLIT_CELLS );
+ pBindings->Invalidate( SID_OPTIMIZE_TABLE );
+ pBindings->Invalidate( SID_TABLE_VERT_BOTTOM );
+ pBindings->Invalidate( SID_TABLE_VERT_CENTER );
+ pBindings->Invalidate( SID_TABLE_VERT_NONE );
+ break;
+ }
+ case SID_TABLE_VERT_BOTTOM:
+ case SID_TABLE_VERT_CENTER:
+ case SID_TABLE_VERT_NONE:
+ {
+ pBindings->Invalidate( SID_TABLE_VERT_BOTTOM );
+ pBindings->Invalidate( SID_TABLE_VERT_CENTER );
+ pBindings->Invalidate( SID_TABLE_VERT_NONE );
+ break;
+ }
+ }
+
+ pBindings->Invalidate( SID_UNDO );
+ pBindings->Invalidate( SID_REDO );
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/table/tableobjectbar.hxx b/sd/source/ui/table/tableobjectbar.hxx
new file mode 100644
index 000000000..c5d513bff
--- /dev/null
+++ b/sd/source/ui/table/tableobjectbar.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sfx2/shell.hxx>
+#include <glob.hxx>
+
+namespace sd {
+
+class View;
+class ViewShell;
+
+}
+
+namespace sd::ui::table {
+
+class TableObjectBar final : public SfxShell
+{
+public:
+ SFX_DECL_INTERFACE( SD_IF_SDDRAWTABLEOBJECTBAR )
+
+ TableObjectBar( ::sd::ViewShell* pSdViewShell, ::sd::View* pSdView);
+ virtual ~TableObjectBar() override;
+
+ void GetState( SfxItemSet& rSet );
+ void GetAttrState( SfxItemSet& rSet );
+ void Execute( SfxRequest& rReq );
+
+private:
+ /// SfxInterface initializer.
+ static void InitInterface_Impl();
+
+ ::sd::View* mpView;
+ ::sd::ViewShell* mpViewSh;
+};
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/tools/AsynchronousCall.cxx b/sd/source/ui/tools/AsynchronousCall.cxx
new file mode 100644
index 000000000..b7b70f63a
--- /dev/null
+++ b/sd/source/ui/tools/AsynchronousCall.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/.
+ *
+ * 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 <memory>
+#include <tools/AsynchronousCall.hxx>
+
+namespace sd::tools
+{
+AsynchronousCall::AsynchronousCall()
+ : maTimer("sd AsynchronousCall")
+{
+ maTimer.SetInvokeHandler(LINK(this, AsynchronousCall, TimerCallback));
+}
+
+AsynchronousCall::~AsynchronousCall()
+{
+ mpFunction.reset();
+ maTimer.Stop();
+}
+
+void AsynchronousCall::Post(const AsynchronousFunction& rFunction)
+{
+ mpFunction.reset(new AsynchronousFunction(rFunction));
+ maTimer.SetTimeout(10);
+ maTimer.Start();
+}
+
+IMPL_LINK(AsynchronousCall, TimerCallback, Timer*, pTimer, void)
+{
+ if (pTimer == &maTimer)
+ {
+ ::std::unique_ptr<AsynchronousFunction> pFunction;
+ pFunction.swap(mpFunction);
+ (*pFunction)();
+ }
+}
+
+} // end of namespace ::sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/tools/ConfigurationAccess.cxx b/sd/source/ui/tools/ConfigurationAccess.cxx
new file mode 100644
index 000000000..d359aeb18
--- /dev/null
+++ b/sd/source/ui/tools/ConfigurationAccess.cxx
@@ -0,0 +1,173 @@
+/* -*- 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 <tools/ConfigurationAccess.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/configuration/theDefaultProvider.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertysequence.hxx>
+#include <tools/diagnose_ex.h>
+#include <sal/log.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd::tools {
+
+ConfigurationAccess::ConfigurationAccess (
+ const Reference<XComponentContext>& rxContext,
+ const OUString& rsRootName,
+ const WriteMode eMode)
+{
+ Reference<lang::XMultiServiceFactory> xProvider =
+ configuration::theDefaultProvider::get( rxContext );
+ Initialize(xProvider, rsRootName, eMode);
+}
+
+ConfigurationAccess::ConfigurationAccess (
+ const OUString& rsRootName,
+ const WriteMode eMode)
+{
+ Reference<lang::XMultiServiceFactory> xProvider =
+ configuration::theDefaultProvider::get( ::comphelper::getProcessComponentContext() );
+ Initialize(xProvider, rsRootName, eMode);
+}
+
+void ConfigurationAccess::Initialize (
+ const Reference<lang::XMultiServiceFactory>& rxProvider,
+ const OUString& rsRootName,
+ const WriteMode eMode)
+{
+ try
+ {
+ Sequence<Any> aCreationArguments(comphelper::InitAnyPropertySequence(
+ {
+ {"nodepath", Any(rsRootName)},
+ {"depth", Any(sal_Int32(-1))}
+ }));
+
+ OUString sAccessService;
+ if (eMode == READ_ONLY)
+ sAccessService = "com.sun.star.configuration.ConfigurationAccess";
+ else
+ sAccessService = "com.sun.star.configuration.ConfigurationUpdateAccess";
+
+ mxRoot = rxProvider->createInstanceWithArguments(
+ sAccessService,
+ aCreationArguments);
+ }
+ catch (Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd.tools");
+ }
+}
+
+Any ConfigurationAccess::GetConfigurationNode (
+ const OUString& sPathToNode)
+{
+ return GetConfigurationNode(
+ Reference<container::XHierarchicalNameAccess>(mxRoot, UNO_QUERY),
+ sPathToNode);
+}
+
+Any ConfigurationAccess::GetConfigurationNode (
+ const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode,
+ const OUString& sPathToNode)
+{
+ if (sPathToNode.isEmpty())
+ return Any(rxNode);
+
+ try
+ {
+ if (rxNode.is())
+ {
+ return rxNode->getByHierarchicalName(sPathToNode);
+ }
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION("sd", "caught exception while getting configuration node" << sPathToNode);
+ }
+
+ return Any();
+}
+
+void ConfigurationAccess::CommitChanges()
+{
+ Reference<util::XChangesBatch> xConfiguration (mxRoot, UNO_QUERY);
+ if (xConfiguration.is())
+ xConfiguration->commitChanges();
+}
+
+void ConfigurationAccess::ForAll (
+ const Reference<container::XNameAccess>& rxContainer,
+ const ::std::vector<OUString>& rArguments,
+ const Functor& rFunctor)
+{
+ if (!rxContainer.is())
+ return;
+
+ ::std::vector<Any> aValues(rArguments.size());
+ const Sequence<OUString> aKeys (rxContainer->getElementNames());
+ for (const OUString& rsKey : aKeys)
+ {
+ Reference<container::XNameAccess> xSetItem (rxContainer->getByName(rsKey), UNO_QUERY);
+ if (xSetItem.is())
+ {
+ // Get from the current item of the container the children
+ // that match the names in the rArguments list.
+ for (size_t nValueIndex=0; nValueIndex<aValues.size(); ++nValueIndex)
+ aValues[nValueIndex] = xSetItem->getByName(rArguments[nValueIndex]);
+ }
+ rFunctor(rsKey, aValues);
+ }
+}
+
+void ConfigurationAccess::FillList(
+ const Reference<container::XNameAccess>& rxContainer,
+ const OUString& rsArgument,
+ ::std::vector<OUString>& rList)
+{
+ try
+ {
+ if (rxContainer.is())
+ {
+ Sequence<OUString> aKeys (rxContainer->getElementNames());
+ rList.resize(aKeys.getLength());
+ for (sal_Int32 nItemIndex=0; nItemIndex<aKeys.getLength(); ++nItemIndex)
+ {
+ Reference<container::XNameAccess> xSetItem (
+ rxContainer->getByName(aKeys[nItemIndex]), UNO_QUERY);
+ if (xSetItem.is())
+ {
+ xSetItem->getByName(rsArgument) >>= rList[nItemIndex];
+ }
+ }
+ }
+ }
+ catch (RuntimeException&)
+ {}
+}
+
+} // end of namespace sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/tools/EventMultiplexer.cxx b/sd/source/ui/tools/EventMultiplexer.cxx
new file mode 100644
index 000000000..a61413ac6
--- /dev/null
+++ b/sd/source/ui/tools/EventMultiplexer.cxx
@@ -0,0 +1,661 @@
+/* -*- 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 <EventMultiplexer.hxx>
+
+#include <ViewShellBase.hxx>
+#include <drawdoc.hxx>
+#include <DrawController.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <sal/log.hxx>
+#include <tools/debug.hxx>
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/frame/XFrame.hpp>
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <comphelper/compbase.hxx>
+#include <sfx2/viewfrm.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+using ::sd::framework::FrameworkHelper;
+
+class SdDrawDocument;
+
+namespace {
+const sal_Int32 ResourceActivationEvent = 0;
+const sal_Int32 ResourceDeactivationEvent = 1;
+const sal_Int32 ConfigurationUpdateEvent = 2;
+}
+
+namespace sd::tools {
+
+typedef comphelper::WeakComponentImplHelper<
+ css::beans::XPropertyChangeListener,
+ css::frame::XFrameActionListener,
+ css::view::XSelectionChangeListener,
+ css::drawing::framework::XConfigurationChangeListener
+ > EventMultiplexerImplementationInterfaceBase;
+
+class EventMultiplexer::Implementation
+ : public EventMultiplexerImplementationInterfaceBase,
+ public SfxListener
+{
+public:
+ explicit Implementation (ViewShellBase& rBase);
+ virtual ~Implementation() override;
+
+ void AddEventListener (
+ const Link<EventMultiplexerEvent&,void>& rCallback);
+
+ void RemoveEventListener (
+ const Link<EventMultiplexerEvent&,void>& rCallback);
+
+ void CallListeners (EventMultiplexerEvent& rEvent);
+
+ //===== lang::XEventListener ==============================================
+ virtual void SAL_CALL
+ disposing (const css::lang::EventObject& rEventObject) override;
+
+ //===== beans::XPropertySetListener =======================================
+ virtual void SAL_CALL
+ propertyChange (
+ const css::beans::PropertyChangeEvent& rEvent) override;
+
+ //===== view::XSelectionChangeListener ====================================
+ virtual void SAL_CALL
+ selectionChanged (
+ const css::lang::EventObject& rEvent) override;
+
+ //===== frame::XFrameActionListener ======================================
+ /** For certain actions the listener connects to a new controller of the
+ frame it is listening to. This usually happens when the view shell
+ in the center pane is replaced by another view shell.
+ */
+ virtual void SAL_CALL
+ frameAction (const css::frame::FrameActionEvent& rEvent) override;
+
+ //===== drawing::framework::XConfigurationChangeListener ==================
+ virtual void SAL_CALL
+ notifyConfigurationChange (
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent) override;
+
+ virtual void disposing(std::unique_lock<std::mutex>&) override;
+
+protected:
+ virtual void Notify (
+ SfxBroadcaster& rBroadcaster,
+ const SfxHint& rHint) override;
+
+private:
+ ViewShellBase& mrBase;
+ typedef ::std::vector<Link<EventMultiplexerEvent&,void>> ListenerList;
+ ListenerList maListeners;
+
+ /// Remember whether we are listening to the UNO controller.
+ bool mbListeningToController;
+ /// Remember whether we are listening to the frame.
+ bool mbListeningToFrame;
+
+ css::uno::WeakReference<css::frame::XController> mxControllerWeak;
+ css::uno::WeakReference<css::frame::XFrame> mxFrameWeak;
+ SdDrawDocument* mpDocument;
+ css::uno::WeakReference<css::drawing::framework::XConfigurationController>
+ mxConfigurationControllerWeak;
+
+ void ReleaseListeners();
+
+ void ConnectToController();
+ void DisconnectFromController();
+
+ void CallListeners (
+ EventMultiplexerEventId eId,
+ void const * pUserData = nullptr);
+
+ DECL_LINK(SlideSorterSelectionChangeListener, LinkParamNone*, void);
+};
+
+constexpr OUStringLiteral aCurrentPagePropertyName = u"CurrentPage";
+constexpr OUStringLiteral aEditModePropertyName = u"IsMasterPageMode";
+
+//===== EventMultiplexer ======================================================
+
+EventMultiplexer::EventMultiplexer (ViewShellBase& rBase)
+ : mpImpl (new EventMultiplexer::Implementation(rBase))
+{
+}
+
+EventMultiplexer::~EventMultiplexer()
+{
+ try
+ {
+ mpImpl->dispose();
+ }
+ catch (const RuntimeException&)
+ {
+ }
+ catch (const Exception&)
+ {
+ }
+}
+
+void EventMultiplexer::AddEventListener (
+ const Link<EventMultiplexerEvent&,void>& rCallback)
+{
+ mpImpl->AddEventListener(rCallback);
+}
+
+void EventMultiplexer::RemoveEventListener (
+ const Link<EventMultiplexerEvent&,void>& rCallback)
+{
+ mpImpl->RemoveEventListener(rCallback);
+}
+
+void EventMultiplexer::MultiplexEvent(
+ EventMultiplexerEventId eEventId,
+ void const * pUserData )
+{
+ EventMultiplexerEvent aEvent(eEventId, pUserData);
+ mpImpl->CallListeners(aEvent);
+}
+
+//===== EventMultiplexer::Implementation ======================================
+
+EventMultiplexer::Implementation::Implementation (ViewShellBase& rBase)
+ : mrBase (rBase),
+ mbListeningToController (false),
+ mbListeningToFrame (false),
+ mxControllerWeak(nullptr),
+ mxFrameWeak(nullptr),
+ mpDocument(nullptr)
+{
+ // Connect to the frame to listen for controllers being exchanged.
+ // Listen to changes of certain properties.
+ Reference<frame::XFrame> xFrame =
+ mrBase.GetFrame()->GetFrame().GetFrameInterface();
+ mxFrameWeak = xFrame;
+ if (xFrame.is())
+ {
+ xFrame->addFrameActionListener ( Reference<frame::XFrameActionListener>(this) );
+ mbListeningToFrame = true;
+ }
+
+ // Connect to the current controller.
+ ConnectToController ();
+
+ // Listen for document changes.
+ mpDocument = mrBase.GetDocument();
+ if (mpDocument != nullptr)
+ StartListening (*mpDocument);
+
+ // Listen for configuration changes.
+ Reference<XControllerManager> xControllerManager (
+ Reference<XWeak>(&mrBase.GetDrawController()), UNO_QUERY);
+ if (!xControllerManager.is())
+ return;
+
+ Reference<XConfigurationController> xConfigurationController (
+ xControllerManager->getConfigurationController());
+ mxConfigurationControllerWeak = xConfigurationController;
+ if (!xConfigurationController.is())
+ return;
+
+ Reference<XComponent> xComponent (xConfigurationController, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->addEventListener(static_cast<beans::XPropertyChangeListener*>(this));
+
+ xConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msResourceActivationEvent,
+ Any(ResourceActivationEvent));
+ xConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msResourceDeactivationEvent,
+ Any(ResourceDeactivationEvent));
+ xConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msConfigurationUpdateEndEvent,
+ Any(ConfigurationUpdateEvent));
+}
+
+EventMultiplexer::Implementation::~Implementation()
+{
+ DBG_ASSERT( !mbListeningToFrame,
+ "sd::EventMultiplexer::Implementation::~Implementation(), disposing was not called!" );
+}
+
+void EventMultiplexer::Implementation::ReleaseListeners()
+{
+ if (mbListeningToFrame)
+ {
+ mbListeningToFrame = false;
+
+ // Stop listening for changes of certain properties.
+ Reference<frame::XFrame> xFrame (mxFrameWeak);
+ if (xFrame.is())
+ {
+ xFrame->removeFrameActionListener (
+ Reference<frame::XFrameActionListener>(this) );
+ }
+ }
+
+ DisconnectFromController ();
+
+ if (mpDocument != nullptr)
+ {
+ EndListening (*mpDocument);
+ mpDocument = nullptr;
+ }
+
+ // Stop listening for configuration changes.
+ Reference<XConfigurationController> xConfigurationController (mxConfigurationControllerWeak);
+ if (xConfigurationController.is())
+ {
+ Reference<XComponent> xComponent (xConfigurationController, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->removeEventListener(static_cast<beans::XPropertyChangeListener*>(this));
+
+ xConfigurationController->removeConfigurationChangeListener(this);
+ }
+}
+
+void EventMultiplexer::Implementation::AddEventListener (
+ const Link<EventMultiplexerEvent&,void>& rCallback)
+{
+ for (auto const & i : maListeners)
+ if (i == rCallback)
+ return;
+ maListeners.push_back(rCallback);
+}
+
+void EventMultiplexer::Implementation::RemoveEventListener (
+ const Link<EventMultiplexerEvent&,void>& rCallback)
+{
+ auto iListener = std::find(maListeners.begin(), maListeners.end(), rCallback);
+ if (iListener != maListeners.end())
+ maListeners.erase(iListener);
+}
+
+void EventMultiplexer::Implementation::ConnectToController()
+{
+ // Just in case that we missed some event we now disconnect from the old
+ // controller.
+ DisconnectFromController ();
+
+ // Register at the controller of the main view shell.
+
+ // We have to store a (weak) reference to the controller so that we can
+ // unregister without having to ask the mrBase member (which at that
+ // time may be destroyed.)
+ Reference<frame::XController> xController = mrBase.GetController();
+ mxControllerWeak = mrBase.GetController();
+
+ try
+ {
+ // Listen for disposing events.
+ if (xController.is())
+ {
+ xController->addEventListener (
+ Reference<lang::XEventListener>(
+ static_cast<XWeak*>(this), UNO_QUERY));
+ mbListeningToController = true;
+ }
+
+ // Listen to changes of certain properties.
+ Reference<beans::XPropertySet> xSet (xController, UNO_QUERY);
+ if (xSet.is())
+ {
+ try
+ {
+ xSet->addPropertyChangeListener(aCurrentPagePropertyName, this);
+ }
+ catch (const beans::UnknownPropertyException&)
+ {
+ SAL_WARN("sd", "EventMultiplexer::ConnectToController: CurrentPage unknown");
+ }
+
+ try
+ {
+ xSet->addPropertyChangeListener(aEditModePropertyName, this);
+ }
+ catch (const beans::UnknownPropertyException&)
+ {
+ SAL_WARN("sd", "EventMultiplexer::ConnectToController: IsMasterPageMode unknown");
+ }
+ }
+
+ // Listen for selection change events.
+ Reference<view::XSelectionSupplier> xSelection (xController, UNO_QUERY);
+ if (xSelection.is())
+ {
+ xSelection->addSelectionChangeListener(this);
+ }
+ }
+ catch (const lang::DisposedException&)
+ {
+ mbListeningToController = false;
+ }
+}
+
+void EventMultiplexer::Implementation::DisconnectFromController()
+{
+ if (!mbListeningToController)
+ return;
+
+ mbListeningToController = false;
+
+ Reference<frame::XController> xController = mxControllerWeak;
+
+ Reference<beans::XPropertySet> xSet (xController, UNO_QUERY);
+ // Remove the property listener.
+ if (xSet.is())
+ {
+ try
+ {
+ xSet->removePropertyChangeListener(aCurrentPagePropertyName, this);
+ }
+ catch (const beans::UnknownPropertyException&)
+ {
+ SAL_WARN("sd", "DisconnectFromController: CurrentPage unknown");
+ }
+
+ try
+ {
+ xSet->removePropertyChangeListener(aEditModePropertyName, this);
+ }
+ catch (const beans::UnknownPropertyException&)
+ {
+ SAL_WARN("sd", "DisconnectFromController: IsMasterPageMode unknown");
+ }
+ }
+
+ // Remove selection change listener.
+ Reference<view::XSelectionSupplier> xSelection (xController, UNO_QUERY);
+ if (xSelection.is())
+ {
+ xSelection->removeSelectionChangeListener(this);
+ }
+
+ // Remove listener for disposing events.
+ if (xController.is())
+ {
+ xController->removeEventListener (
+ Reference<lang::XEventListener>(static_cast<XWeak*>(this), UNO_QUERY));
+ }
+}
+
+//===== lang::XEventListener ================================================
+
+void SAL_CALL EventMultiplexer::Implementation::disposing (
+ const lang::EventObject& rEventObject)
+{
+ if (mbListeningToController)
+ {
+ Reference<frame::XController> xController (mxControllerWeak);
+ if (rEventObject.Source == xController)
+ {
+ mbListeningToController = false;
+ }
+ }
+
+ Reference<XConfigurationController> xConfigurationController (
+ mxConfigurationControllerWeak);
+ if (xConfigurationController.is()
+ && rEventObject.Source == xConfigurationController)
+ {
+ mxConfigurationControllerWeak.clear();
+ }
+}
+
+//===== beans::XPropertySetListener =========================================
+
+void SAL_CALL EventMultiplexer::Implementation::propertyChange (
+ const beans::PropertyChangeEvent& rEvent)
+{
+ if (m_bDisposed)
+ {
+ throw lang::DisposedException (
+ "SlideSorterController object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+
+ if ( rEvent.PropertyName == aCurrentPagePropertyName )
+ {
+ CallListeners(EventMultiplexerEventId::CurrentPageChanged);
+ }
+ else if ( rEvent.PropertyName == aEditModePropertyName )
+ {
+ bool bIsMasterPageMode (false);
+ rEvent.NewValue >>= bIsMasterPageMode;
+ if (bIsMasterPageMode)
+ CallListeners(EventMultiplexerEventId::EditModeMaster);
+ else
+ CallListeners(EventMultiplexerEventId::EditModeNormal);
+ }
+}
+
+//===== frame::XFrameActionListener ==========================================
+
+void SAL_CALL EventMultiplexer::Implementation::frameAction (
+ const frame::FrameActionEvent& rEvent)
+{
+ Reference<frame::XFrame> xFrame (mxFrameWeak);
+ if (rEvent.Frame != xFrame)
+ return;
+
+ switch (rEvent.Action)
+ {
+ case frame::FrameAction_COMPONENT_DETACHING:
+ DisconnectFromController();
+ CallListeners (EventMultiplexerEventId::ControllerDetached);
+ break;
+
+ case frame::FrameAction_COMPONENT_REATTACHED:
+ CallListeners (EventMultiplexerEventId::ControllerDetached);
+ DisconnectFromController();
+ ConnectToController();
+ CallListeners (EventMultiplexerEventId::ControllerAttached);
+ break;
+
+ case frame::FrameAction_COMPONENT_ATTACHED:
+ ConnectToController();
+ CallListeners (EventMultiplexerEventId::ControllerAttached);
+ break;
+
+ default:
+ break;
+ }
+}
+
+//===== view::XSelectionChangeListener ========================================
+
+void SAL_CALL EventMultiplexer::Implementation::selectionChanged (
+ const lang::EventObject& )
+{
+ CallListeners (EventMultiplexerEventId::EditViewSelection);
+}
+
+//===== drawing::framework::XConfigurationChangeListener ==================
+
+void SAL_CALL EventMultiplexer::Implementation::notifyConfigurationChange (
+ const ConfigurationChangeEvent& rEvent)
+{
+ sal_Int32 nEventType = 0;
+ rEvent.UserData >>= nEventType;
+ switch (nEventType)
+ {
+ case ResourceActivationEvent:
+ if (rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix))
+ {
+ CallListeners (EventMultiplexerEventId::ViewAdded);
+
+ if (rEvent.ResourceId->isBoundToURL(
+ FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
+ {
+ CallListeners (EventMultiplexerEventId::MainViewAdded);
+ }
+
+ // Add selection change listener at slide sorter.
+ if (rEvent.ResourceId->getResourceURL() == FrameworkHelper::msSlideSorterURL)
+ {
+ slidesorter::SlideSorterViewShell* pViewShell
+ = dynamic_cast<slidesorter::SlideSorterViewShell*>(
+ FrameworkHelper::GetViewShell(
+ Reference<XView>(rEvent.ResourceObject,UNO_QUERY)).get());
+ if (pViewShell != nullptr)
+ pViewShell->AddSelectionChangeListener (
+ LINK(this,
+ EventMultiplexer::Implementation,
+ SlideSorterSelectionChangeListener));
+ }
+ }
+ break;
+
+ case ResourceDeactivationEvent:
+ if (rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix))
+ {
+ if (rEvent.ResourceId->isBoundToURL(
+ FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
+ {
+ CallListeners (EventMultiplexerEventId::MainViewRemoved);
+ }
+
+ // Remove selection change listener from slide sorter. Add
+ // selection change listener at slide sorter.
+ if (rEvent.ResourceId->getResourceURL() == FrameworkHelper::msSlideSorterURL)
+ {
+ slidesorter::SlideSorterViewShell* pViewShell
+ = dynamic_cast<slidesorter::SlideSorterViewShell*>(
+ FrameworkHelper::GetViewShell(
+ Reference<XView>(rEvent.ResourceObject, UNO_QUERY)).get());
+ if (pViewShell != nullptr)
+ pViewShell->RemoveSelectionChangeListener (
+ LINK(this,
+ EventMultiplexer::Implementation,
+ SlideSorterSelectionChangeListener));
+ }
+ }
+ break;
+
+ case ConfigurationUpdateEvent:
+ CallListeners (EventMultiplexerEventId::ConfigurationUpdated);
+ break;
+ }
+
+}
+
+void EventMultiplexer::Implementation::disposing(std::unique_lock<std::mutex>& rGuard)
+{
+ ListenerList aCopyListeners( maListeners );
+
+ rGuard.unlock();
+
+ EventMultiplexerEvent rEvent(EventMultiplexerEventId::Disposing, nullptr);
+ for (const auto& rListener : aCopyListeners)
+ rListener.Call(rEvent);
+
+ rGuard.lock();
+
+ ReleaseListeners();
+}
+
+void EventMultiplexer::Implementation::Notify (
+ SfxBroadcaster&,
+ const SfxHint& rHint)
+{
+ if (rHint.GetId() == SfxHintId::ThisIsAnSdrHint)
+ {
+ const SdrHint* pSdrHint = static_cast<const SdrHint*>(&rHint);
+ switch (pSdrHint->GetKind())
+ {
+ case SdrHintKind::ModelCleared:
+ case SdrHintKind::PageOrderChange:
+ CallListeners (EventMultiplexerEventId::PageOrder);
+ break;
+
+ case SdrHintKind::SwitchToPage:
+ CallListeners (EventMultiplexerEventId::CurrentPageChanged);
+ break;
+
+ case SdrHintKind::ObjectChange:
+ CallListeners(EventMultiplexerEventId::ShapeChanged,
+ static_cast<const void*>(pSdrHint->GetPage()));
+ break;
+
+ case SdrHintKind::ObjectInserted:
+ CallListeners(EventMultiplexerEventId::ShapeInserted,
+ static_cast<const void*>(pSdrHint->GetPage()));
+ break;
+
+ case SdrHintKind::ObjectRemoved:
+ CallListeners(EventMultiplexerEventId::ShapeRemoved,
+ static_cast<const void*>(pSdrHint->GetPage()));
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ if (rHint.GetId() == SfxHintId::Dying)
+ mpDocument = nullptr;
+ }
+}
+
+void EventMultiplexer::Implementation::CallListeners (
+ EventMultiplexerEventId eId,
+ void const * pUserData)
+{
+ EventMultiplexerEvent aEvent(eId, pUserData);
+ CallListeners(aEvent);
+}
+
+void EventMultiplexer::Implementation::CallListeners (EventMultiplexerEvent& rEvent)
+{
+ ListenerList aCopyListeners( maListeners );
+ for (const auto& rListener : aCopyListeners)
+ {
+ rListener.Call(rEvent);
+ }
+}
+
+IMPL_LINK_NOARG(EventMultiplexer::Implementation, SlideSorterSelectionChangeListener, LinkParamNone*, void)
+{
+ CallListeners(EventMultiplexerEventId::SlideSortedSelection);
+}
+
+//===== EventMultiplexerEvent =================================================
+
+EventMultiplexerEvent::EventMultiplexerEvent (
+ EventMultiplexerEventId eEventId,
+ const void* pUserData)
+ : meEventId(eEventId),
+ mpUserData(pUserData)
+{
+}
+
+} // end of namespace ::sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/tools/GraphicSizeCheck.cxx b/sd/source/ui/tools/GraphicSizeCheck.cxx
new file mode 100644
index 000000000..492a2d70b
--- /dev/null
+++ b/sd/source/ui/tools/GraphicSizeCheck.cxx
@@ -0,0 +1,221 @@
+/* -*- 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 <tools/GraphicSizeCheck.hxx>
+#include <svx/strings.hrc>
+#include <svx/svdobj.hxx>
+#include <svx/svdpage.hxx>
+#include <svx/svxids.hrc>
+#include <sfx2/dispatch.hxx>
+
+#include <sdresid.hxx>
+#include <DrawDocShell.hxx>
+#include <ViewShell.hxx>
+
+namespace sd
+{
+namespace
+{
+/**
+ * Interface for the visitor class, which handles each visited SdrObject
+ * in the DOM.
+ */
+class ModelTraverseHandler
+{
+public:
+ virtual ~ModelTraverseHandler() {}
+
+ virtual void handleSdrObject(SdrObject* pObject) = 0;
+};
+
+/**
+ * Traverses the DOM and calls a handler for each object (SdrObject) it
+ * encounters.
+ */
+class ModelTraverser
+{
+private:
+ std::vector<std::shared_ptr<ModelTraverseHandler>> m_pNodeHandler;
+ SdDrawDocument* m_pDocument;
+
+public:
+ ModelTraverser(SdDrawDocument* pDocument)
+ : m_pDocument(pDocument)
+ {
+ }
+
+ void traverse()
+ {
+ if (!m_pDocument)
+ return;
+
+ for (sal_uInt16 nPage = 0; nPage < m_pDocument->GetPageCount(); ++nPage)
+ {
+ SdrPage* pPage = m_pDocument->GetPage(nPage);
+ if (pPage)
+ {
+ for (size_t nObject = 0; nObject < pPage->GetObjCount(); ++nObject)
+ {
+ SdrObject* pObject = pPage->GetObj(nObject);
+ if (pObject)
+ {
+ for (auto& pNodeHandler : m_pNodeHandler)
+ {
+ pNodeHandler->handleSdrObject(pObject);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ void addNodeHandler(std::shared_ptr<ModelTraverseHandler> pHandler)
+ {
+ m_pNodeHandler.push_back(pHandler);
+ }
+};
+}
+
+GraphicSizeViolation::GraphicSizeViolation(sal_Int32 nDPI, SdrGrafObj* pGraphicObject)
+ : m_pGraphicObject(pGraphicObject)
+{
+ constexpr double fLowPercentage = 110;
+ constexpr double fHighPercentage = 50;
+
+ m_nLowDPILimit = sal_Int32(100.0 / fLowPercentage * nDPI);
+ m_nHighDPILimit = sal_Int32(100.0 / fHighPercentage * nDPI);
+}
+
+bool GraphicSizeViolation::check()
+{
+ Graphic aGraphic = m_pGraphicObject->GetGraphic();
+ Size aSizePixel = aGraphic.GetSizePixel();
+ Size aGraphicSize = m_pGraphicObject->GetLogicRect().GetSize();
+
+ double nSizeXInch
+ = o3tl::convert(double(aGraphicSize.Width()), o3tl::Length::mm100, o3tl::Length::in);
+ double nSizeYInch
+ = o3tl::convert(double(aGraphicSize.Height()), o3tl::Length::mm100, o3tl::Length::in);
+
+ m_nDPIX = sal_Int32(aSizePixel.Width() / nSizeXInch);
+ m_nDPIY = sal_Int32(aSizePixel.Height() / nSizeYInch);
+
+ return isDPITooLow() || isDPITooHigh();
+}
+
+const OUString& GraphicSizeViolation::getGraphicName() { return m_pGraphicObject->GetName(); }
+
+namespace
+{
+class GraphicSizeCheckHandler : public ModelTraverseHandler
+{
+ sal_Int32 m_nDPI;
+ std::vector<std::unique_ptr<GraphicSizeViolation>>& m_rGraphicSizeViolationList;
+
+public:
+ GraphicSizeCheckHandler(
+ sal_Int32 nDPI,
+ std::vector<std::unique_ptr<GraphicSizeViolation>>& rGraphicSizeViolationList)
+ : m_nDPI(nDPI)
+ , m_rGraphicSizeViolationList(rGraphicSizeViolationList)
+ {
+ }
+
+ void handleSdrObject(SdrObject* pObject) override
+ {
+ auto* pGraphicObject = dynamic_cast<SdrGrafObj*>(pObject);
+ if (!pGraphicObject)
+ return;
+
+ auto pEntry = std::make_unique<GraphicSizeViolation>(m_nDPI, pGraphicObject);
+ if (pEntry->check())
+ {
+ m_rGraphicSizeViolationList.push_back(std::move(pEntry));
+ }
+ }
+};
+
+} // end anonymous namespace
+
+void GraphicSizeCheck::check()
+{
+ if (!m_pDocument)
+ return;
+
+ sal_Int32 nDPI = m_pDocument->getImagePreferredDPI();
+ if (nDPI == 0)
+ return;
+
+ auto pHandler = std::make_shared<GraphicSizeCheckHandler>(nDPI, m_aGraphicSizeViolationList);
+
+ ModelTraverser aModelTraverser(m_pDocument);
+ aModelTraverser.addNodeHandler(pHandler);
+ aModelTraverser.traverse();
+}
+
+OUString GraphicSizeCheckGUIEntry::getText()
+{
+ OUString sText;
+
+ if (m_pViolation->isDPITooLow())
+ {
+ sText = SdResId(STR_WARNING_GRAPHIC_PIXEL_COUNT_LOW);
+ }
+ else if (m_pViolation->isDPITooHigh())
+ {
+ sText = SdResId(STR_WARNING_GRAPHIC_PIXEL_COUNT_HIGH);
+ }
+
+ sText = sText.replaceAll("%NAME%", m_pViolation->getGraphicName());
+ sText = sText.replaceAll("%DPIX%", OUString::number(m_pViolation->getDPIX()));
+ sText = sText.replaceAll("%DPIY%", OUString::number(m_pViolation->getDPIY()));
+
+ return sText;
+}
+
+void GraphicSizeCheckGUIEntry::markObject()
+{
+ sd::ViewShell* pViewShell = m_pDocument->GetDocSh()->GetViewShell();
+ SdrView* pView = pViewShell->GetView();
+ pView->ShowSdrPage(m_pViolation->getObject()->getSdrPageFromSdrObject());
+ pView->UnmarkAll();
+ pView->MarkObj(m_pViolation->getObject(), pView->GetSdrPageView());
+}
+
+void GraphicSizeCheckGUIEntry::runProperties()
+{
+ markObject();
+ sd::ViewShell* pViewShell = m_pDocument->GetDocSh()->GetViewShell();
+ pViewShell->GetDispatcher()->Execute(SID_ATTR_GRAF_CROP, SfxCallMode::SYNCHRON);
+}
+
+GraphicSizeCheckGUIResult::GraphicSizeCheckGUIResult(SdDrawDocument* pDocument)
+{
+ GraphicSizeCheck aCheck(pDocument);
+ aCheck.check();
+
+ auto& rCollection = getCollection();
+ for (auto& rpViolation : aCheck.getViolationList())
+ {
+ auto rGUIEntry
+ = std::make_unique<GraphicSizeCheckGUIEntry>(pDocument, std::move(rpViolation));
+ rCollection.push_back(std::move(rGUIEntry));
+ }
+}
+
+OUString GraphicSizeCheckGUIResult::getTitle()
+{
+ return SdResId(STR_GRAPHIC_SIZE_CHECK_DIALOG_TITLE);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/tools/IconCache.cxx b/sd/source/ui/tools/IconCache.cxx
new file mode 100644
index 000000000..0ce80922b
--- /dev/null
+++ b/sd/source/ui/tools/IconCache.cxx
@@ -0,0 +1,106 @@
+/* -*- 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 <memory>
+#include <tools/IconCache.hxx>
+
+#include <tools/debug.hxx>
+#include <osl/doublecheckedlocking.h>
+#include <osl/getglobalmutex.hxx>
+#include <unordered_map>
+
+namespace sd
+{
+//===== IconCache::Implementation =============================================
+
+class IconCache::Implementation
+{
+private:
+ friend class IconCache;
+
+ /** This pointer holds a valid reference from first time that
+ IconCache::Instance() is called to the end of the sd module when the
+ cache is destroyed from SdGlobalResourceContainer.
+ */
+ static IconCache* s_pIconCache;
+
+ typedef std::unordered_map<OUString, Image> ImageContainer;
+ ImageContainer maContainer;
+
+ Image GetIcon(const OUString& rResourceId);
+};
+
+IconCache* IconCache::Implementation::s_pIconCache = nullptr;
+
+Image IconCache::Implementation::GetIcon(const OUString& rResourceId)
+{
+ Image aResult;
+ ImageContainer::iterator iImage = maContainer.find(rResourceId);
+ if (iImage == maContainer.end())
+ {
+ aResult = Image(StockImage::Yes, rResourceId);
+ maContainer[rResourceId] = aResult;
+ }
+ else
+ aResult = iImage->second;
+ return aResult;
+}
+
+//===== IconCache =============================================================
+
+//static
+IconCache& IconCache::Instance()
+{
+ if (Implementation::s_pIconCache == nullptr)
+ {
+ ::osl::GetGlobalMutex aMutexFunctor;
+ ::osl::MutexGuard aGuard(aMutexFunctor());
+ if (Implementation::s_pIconCache == nullptr)
+ {
+ IconCache* pCache = new IconCache();
+ SdGlobalResourceContainer::Instance().AddResource(
+ ::std::unique_ptr<SdGlobalResource>(pCache));
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ Implementation::s_pIconCache = pCache;
+ }
+ }
+ else
+ {
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ }
+
+ DBG_ASSERT(Implementation::s_pIconCache != nullptr, "IconCache::Instance(): instance is NULL");
+ return *Implementation::s_pIconCache;
+}
+
+Image IconCache::GetIcon(const OUString& rResourceId) { return mpImpl->GetIcon(rResourceId); }
+
+IconCache::IconCache()
+ : mpImpl(new Implementation)
+{
+}
+
+IconCache::~IconCache()
+{
+ // empty
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/tools/IdleDetection.cxx b/sd/source/ui/tools/IdleDetection.cxx
new file mode 100644
index 000000000..988bd849b
--- /dev/null
+++ b/sd/source/ui/tools/IdleDetection.cxx
@@ -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/.
+ *
+ * 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 <tools/IdleDetection.hxx>
+
+#include <slideshow.hxx>
+#include <ViewShellBase.hxx>
+
+#include <vcl/window.hxx>
+#include <sfx2/viewfrm.hxx>
+
+#include <com/sun/star/frame/XFrame.hpp>
+#include <vcl/svapp.hxx>
+
+using namespace ::com::sun::star;
+
+namespace sd::tools {
+
+IdleState IdleDetection::GetIdleState (const vcl::Window* pWindow)
+{
+ IdleState nResult (CheckInputPending() | CheckSlideShowRunning());
+ if (pWindow != nullptr)
+ nResult |= CheckWindowPainting(*pWindow);
+ return nResult;
+}
+
+IdleState IdleDetection::CheckInputPending()
+{
+ if (Application::AnyInput(VclInputFlags::MOUSE | VclInputFlags::KEYBOARD | VclInputFlags::PAINT))
+ return IdleState::SystemEventPending;
+ else
+ return IdleState::Idle;
+}
+
+IdleState IdleDetection::CheckSlideShowRunning()
+{
+ IdleState eResult (IdleState::Idle);
+
+ // Iterate over all view frames.
+ for (SfxViewFrame* pViewFrame = SfxViewFrame::GetFirst();
+ pViewFrame!=nullptr;
+ pViewFrame = SfxViewFrame::GetNext(*pViewFrame))
+ {
+ // Ignore the current frame when it does not exist, is not valid, or
+ // is not active.
+ bool bIgnoreFrame (true);
+ uno::Reference<frame::XFrame> xFrame (pViewFrame->GetFrame().GetFrameInterface());
+ try
+ {
+ if (xFrame.is() && xFrame->isActive())
+ bIgnoreFrame = false;
+ }
+ catch (const uno::RuntimeException&)
+ {
+ }
+ if (bIgnoreFrame)
+ continue;
+
+ // Get sd::ViewShell from active frame.
+ ViewShellBase* pBase = ViewShellBase::GetViewShellBase(pViewFrame);
+ if (pBase != nullptr)
+ {
+ rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( *pBase ) );
+ if( xSlideShow.is() && xSlideShow->isRunning() )
+ {
+ if (xSlideShow->isFullScreen())
+ eResult |= IdleState::FullScreenShowActive;
+ else
+ eResult |= IdleState::WindowShowActive;
+ }
+ }
+ }
+
+ return eResult;
+}
+
+IdleState IdleDetection::CheckWindowPainting (const vcl::Window& rWindow)
+{
+ if (rWindow.IsInPaint())
+ return IdleState::WindowPainting;
+ else
+ return IdleState::Idle;
+}
+
+} // end of namespace ::sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/tools/PreviewRenderer.cxx b/sd/source/ui/tools/PreviewRenderer.cxx
new file mode 100644
index 000000000..be8d8ca20
--- /dev/null
+++ b/sd/source/ui/tools/PreviewRenderer.cxx
@@ -0,0 +1,532 @@
+/* -*- 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 <PreviewRenderer.hxx>
+
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <drawview.hxx>
+#include <sdpage.hxx>
+#include <ViewShell.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/settings.hxx>
+
+#include <svx/svdpagv.hxx>
+#include <svx/svdoutl.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/editstat.hxx>
+#include <vcl/svapp.hxx>
+#include <tools/diagnose_ex.h>
+#include <svx/sdr/contact/viewobjectcontact.hxx>
+#include <svx/sdr/contact/viewcontact.hxx>
+
+#include <memory>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd {
+
+const int PreviewRenderer::snSubstitutionTextSize = 11;
+const int PreviewRenderer::snFrameWidth = 1;
+
+namespace {
+ /** This incarnation of the ViewObjectContactRedirector filters away all
+ PageObj objects, unconditionally.
+ */
+ class ViewRedirector : public sdr::contact::ViewObjectContactRedirector
+ {
+ public:
+ ViewRedirector();
+
+ virtual void createRedirectedPrimitive2DSequence(
+ const sdr::contact::ViewObjectContact& rOriginal,
+ const sdr::contact::DisplayInfo& rDisplayInfo,
+ drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) override;
+ };
+}
+
+//===== PreviewRenderer =======================================================
+
+PreviewRenderer::PreviewRenderer (
+ const bool bHasFrame)
+ : mpPreviewDevice (VclPtr<VirtualDevice>::Create()),
+ mpDocShellOfView(nullptr),
+ maFrameColor (svtools::ColorConfig().GetColorValue(svtools::DOCBOUNDARIES).nColor),
+ mbHasFrame(bHasFrame)
+{
+ mpPreviewDevice->SetBackground(Wallpaper(
+ Application::GetSettings().GetStyleSettings().GetWindowColor()));
+}
+
+PreviewRenderer::~PreviewRenderer()
+{
+ if (mpDocShellOfView != nullptr)
+ EndListening (*mpDocShellOfView);
+}
+
+Image PreviewRenderer::RenderPage (
+ const SdPage* pPage,
+ const sal_Int32 nWidth)
+{
+ if (pPage != nullptr)
+ {
+ const Size aPageModelSize (pPage->GetSize());
+ const double nAspectRatio (
+ double(aPageModelSize.Width()) / double(aPageModelSize.Height()));
+ const sal_Int32 nFrameWidth (mbHasFrame ? snFrameWidth : 0);
+ const sal_Int32 nHeight (sal::static_int_cast<sal_Int32>(
+ (nWidth - 2*nFrameWidth) / nAspectRatio + 2*nFrameWidth + 0.5));
+ return RenderPage (
+ pPage,
+ Size(nWidth,nHeight),
+ false/*bObeyHighContrastMode*/);
+ }
+ else
+ return Image();
+}
+
+Image PreviewRenderer::RenderPage (
+ const SdPage* pPage,
+ Size aPixelSize,
+ const bool bObeyHighContrastMode,
+ const bool bDisplayPresentationObjects)
+{
+ Image aPreview;
+
+ if (pPage != nullptr)
+ {
+ try
+ {
+ if (Initialize(pPage, aPixelSize, bObeyHighContrastMode))
+ {
+ PaintPage(pPage, bDisplayPresentationObjects);
+ PaintSubstitutionText("");
+ PaintFrame();
+
+ Size aSize (mpPreviewDevice->GetOutputSizePixel());
+ aPreview = Image(mpPreviewDevice->GetBitmapEx(
+ mpPreviewDevice->PixelToLogic(Point(0,0)),
+ mpPreviewDevice->PixelToLogic(aSize)));
+
+ mpView->HideSdrPage();
+ }
+ }
+ catch (const css::uno::Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd.tools");
+ }
+ }
+
+ return aPreview;
+}
+
+Image PreviewRenderer::RenderSubstitution (
+ const Size& rPreviewPixelSize,
+ const OUString& rSubstitutionText)
+{
+ Image aPreview;
+
+ try
+ {
+ // Set size.
+ mpPreviewDevice->SetOutputSizePixel(rPreviewPixelSize);
+
+ // Adjust contrast mode.
+ const bool bUseContrast (
+ Application::GetSettings().GetStyleSettings().GetHighContrastMode());
+ mpPreviewDevice->SetDrawMode (bUseContrast
+ ? sd::OUTPUT_DRAWMODE_CONTRAST
+ : sd::OUTPUT_DRAWMODE_COLOR);
+
+ // Set a map mode that makes a typical substitution text completely
+ // visible.
+ MapMode aMapMode (mpPreviewDevice->GetMapMode());
+ aMapMode.SetMapUnit(MapUnit::Map100thMM);
+ Fraction aFinalScale(25 * rPreviewPixelSize.Width(), 28000);
+ aMapMode.SetScaleX(aFinalScale);
+ aMapMode.SetScaleY(aFinalScale);
+ const sal_Int32 nFrameWidth (mbHasFrame ? snFrameWidth : 0);
+ aMapMode.SetOrigin(mpPreviewDevice->PixelToLogic(
+ Point(nFrameWidth,nFrameWidth),aMapMode));
+ mpPreviewDevice->SetMapMode (aMapMode);
+
+ // Clear the background.
+ const ::tools::Rectangle aPaintRectangle (
+ Point(0,0),
+ mpPreviewDevice->GetOutputSizePixel());
+ mpPreviewDevice->EnableMapMode(false);
+ mpPreviewDevice->SetLineColor();
+ svtools::ColorConfig aColorConfig;
+ mpPreviewDevice->SetFillColor(aColorConfig.GetColorValue(svtools::DOCCOLOR).nColor);
+ mpPreviewDevice->DrawRect (aPaintRectangle);
+ mpPreviewDevice->EnableMapMode();
+
+ // Paint substitution text and a frame around it.
+ PaintSubstitutionText (rSubstitutionText);
+ PaintFrame();
+
+ const Size aSize (mpPreviewDevice->GetOutputSizePixel());
+ aPreview = Image(mpPreviewDevice->GetBitmapEx(
+ mpPreviewDevice->PixelToLogic(Point(0,0)),
+ mpPreviewDevice->PixelToLogic(aSize)));
+ }
+ catch (const css::uno::Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd.tools");
+ }
+
+ return aPreview;
+}
+
+bool PreviewRenderer::Initialize (
+ const SdPage* pPage,
+ const Size& rPixelSize,
+ const bool bObeyHighContrastMode)
+{
+ if (!pPage)
+ return false;
+
+ SetupOutputSize(*pPage, rPixelSize);
+ SdDrawDocument& rDocument(static_cast< SdDrawDocument& >(pPage->getSdrModelFromSdrPage()));
+ DrawDocShell* pDocShell = rDocument.GetDocSh();
+
+ if (!pDocShell)
+ return false;
+
+ // Create view
+ ProvideView (pDocShell);
+ if (mpView == nullptr)
+ return false;
+
+ // Adjust contrast mode.
+ bool bUseContrast (bObeyHighContrastMode
+ && Application::GetSettings().GetStyleSettings().GetHighContrastMode());
+ mpPreviewDevice->SetDrawMode (bUseContrast
+ ? sd::OUTPUT_DRAWMODE_CONTRAST
+ : sd::OUTPUT_DRAWMODE_COLOR);
+ mpPreviewDevice->SetSettings(Application::GetSettings());
+
+ // Tell the view to show the given page.
+ SdPage* pNonConstPage = const_cast<SdPage*>(pPage);
+ if (pPage->IsMasterPage())
+ {
+ mpView->ShowSdrPage(mpView->GetModel()->GetMasterPage(pPage->GetPageNum()));
+ }
+ else
+ {
+ mpView->ShowSdrPage(pNonConstPage);
+ }
+
+ // Make sure that a page view exists.
+ SdrPageView* pPageView = mpView->GetSdrPageView();
+
+ if (pPageView == nullptr)
+ return false;
+
+ // #i121224# No need to set SetApplicationBackgroundColor (which is the color
+ // of the area 'behind' the page (formerly called 'Wiese') since the page previews
+ // produced exactly cover the page's area, so it would never be visible. What
+ // needs to be set is the ApplicationDocumentColor which is derived from
+ // svtools::DOCCOLOR normally
+ Color aApplicationDocumentColor;
+
+ if (pPageView->GetApplicationDocumentColor() == COL_AUTO)
+ {
+ svtools::ColorConfig aColorConfig;
+ aApplicationDocumentColor = aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor;
+ }
+ else
+ {
+ aApplicationDocumentColor = pPageView->GetApplicationDocumentColor();
+ }
+
+ pPageView->SetApplicationDocumentColor(aApplicationDocumentColor);
+ SdrOutliner& rOutliner(rDocument.GetDrawOutliner());
+ rOutliner.SetBackgroundColor(aApplicationDocumentColor);
+ rOutliner.SetDefaultLanguage(rDocument.GetLanguage(EE_CHAR_LANGUAGE));
+ mpPreviewDevice->SetBackground(Wallpaper(aApplicationDocumentColor));
+ mpPreviewDevice->Erase();
+
+ return true;
+}
+
+void PreviewRenderer::PaintPage (
+ const SdPage* pPage,
+ const bool bDisplayPresentationObjects)
+{
+ // Paint the page.
+ ::tools::Rectangle aPaintRectangle (Point(0,0), pPage->GetSize());
+ vcl::Region aRegion (aPaintRectangle);
+
+ // Turn off online spelling and redlining.
+ SdrOutliner* pOutliner = nullptr;
+ EEControlBits nSavedControlWord = EEControlBits::NONE;
+ if (mpDocShellOfView!=nullptr && mpDocShellOfView->GetDoc()!=nullptr)
+ {
+ pOutliner = &mpDocShellOfView->GetDoc()->GetDrawOutliner();
+ nSavedControlWord = pOutliner->GetControlWord();
+ pOutliner->SetControlWord(nSavedControlWord & ~EEControlBits::ONLINESPELLING);
+ }
+
+ // Use a special redirector to prevent PresObj shapes from being painted.
+ std::unique_ptr<ViewRedirector> pRedirector;
+ if ( ! bDisplayPresentationObjects)
+ pRedirector.reset(new ViewRedirector());
+
+ try
+ {
+ mpView->CompleteRedraw(mpPreviewDevice.get(), aRegion, pRedirector.get());
+ }
+ catch (const css::uno::Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd.tools");
+ }
+
+ // Restore the previous online spelling and redlining states.
+ if (pOutliner != nullptr)
+ pOutliner->SetControlWord(nSavedControlWord);
+}
+
+void PreviewRenderer::PaintSubstitutionText (const OUString& rSubstitutionText)
+{
+ if (rSubstitutionText.isEmpty())
+ return;
+
+ // Set the font size.
+ const vcl::Font& rOriginalFont (mpPreviewDevice->GetFont());
+ vcl::Font aFont (mpPreviewDevice->GetSettings().GetStyleSettings().GetAppFont());
+ sal_Int32 nHeight (mpPreviewDevice->PixelToLogic(Size(0,snSubstitutionTextSize)).Height());
+ aFont.SetFontHeight(nHeight);
+ mpPreviewDevice->SetFont (aFont);
+
+ // Paint the substitution text.
+ ::tools::Rectangle aTextBox (
+ Point(0,0),
+ mpPreviewDevice->PixelToLogic(
+ mpPreviewDevice->GetOutputSizePixel()));
+ DrawTextFlags const nTextStyle =
+ DrawTextFlags::Center
+ | DrawTextFlags::VCenter
+ | DrawTextFlags::MultiLine
+ | DrawTextFlags::WordBreak;
+ mpPreviewDevice->DrawText (aTextBox, rSubstitutionText, nTextStyle);
+
+ // Restore the font.
+ mpPreviewDevice->SetFont (rOriginalFont);
+}
+
+void PreviewRenderer::PaintFrame()
+{
+ if (mbHasFrame)
+ {
+ // Paint a frame around the preview.
+ ::tools::Rectangle aPaintRectangle (
+ Point(0,0),
+ mpPreviewDevice->GetOutputSizePixel());
+ mpPreviewDevice->EnableMapMode(false);
+ mpPreviewDevice->SetLineColor(maFrameColor);
+ mpPreviewDevice->SetFillColor();
+ mpPreviewDevice->DrawRect(aPaintRectangle);
+ mpPreviewDevice->EnableMapMode();
+ }
+}
+
+void PreviewRenderer::SetupOutputSize (
+ const SdPage& rPage,
+ const Size& rFramePixelSize)
+{
+ // First set the map mode to some arbitrary scale that is numerically
+ // stable.
+ MapMode aMapMode (mpPreviewDevice->GetMapMode());
+ aMapMode.SetMapUnit(MapUnit::MapPixel);
+
+ // Adapt it to the desired width.
+ const Size aPageModelSize (rPage.GetSize());
+ if (!aPageModelSize.IsEmpty())
+ {
+ const sal_Int32 nFrameWidth (mbHasFrame ? snFrameWidth : 0);
+ aMapMode.SetScaleX(
+ Fraction(rFramePixelSize.Width()-2*nFrameWidth-1, aPageModelSize.Width()));
+ aMapMode.SetScaleY(
+ Fraction(rFramePixelSize.Height()-2*nFrameWidth-1, aPageModelSize.Height()));
+ aMapMode.SetOrigin(mpPreviewDevice->PixelToLogic(Point(nFrameWidth,nFrameWidth),aMapMode));
+ }
+ else
+ {
+ // We should never get here.
+ OSL_ASSERT(false);
+ aMapMode.SetScaleX(Fraction(1.0));
+ aMapMode.SetScaleY(Fraction(1.0));
+ }
+ mpPreviewDevice->SetMapMode (aMapMode);
+ mpPreviewDevice->SetOutputSizePixel(rFramePixelSize);
+}
+
+void PreviewRenderer::ProvideView (DrawDocShell* pDocShell)
+{
+ if (pDocShell != mpDocShellOfView)
+ {
+ // Destroy the view that is connected to the current doc shell.
+ mpView.reset();
+
+ // Switch our attention, i.e. listening for DYING events, to
+ // the new doc shell.
+ if (mpDocShellOfView != nullptr)
+ EndListening (*mpDocShellOfView);
+ mpDocShellOfView = pDocShell;
+ if (mpDocShellOfView != nullptr)
+ StartListening (*mpDocShellOfView);
+ }
+ if (mpView == nullptr)
+ {
+ mpView.reset (new DrawView (pDocShell, mpPreviewDevice.get(), nullptr));
+ }
+ mpView->SetPreviewRenderer(true);
+#if 1
+ mpView->SetPageVisible(false);
+ mpView->SetPageBorderVisible();
+ mpView->SetBordVisible(false);
+ mpView->SetGridVisible(false);
+ mpView->SetHlplVisible(false);
+ mpView->SetGlueVisible(false);
+
+#else
+ // This works in the slide sorter but prevents the master page
+ // background being painted in the list of current master pages in the
+ // task manager.
+ mpView->SetPagePaintingAllowed(false);
+#endif
+}
+
+Image PreviewRenderer::ScaleBitmap (
+ const BitmapEx& rBitmapEx,
+ int nWidth)
+{
+ Image aPreview;
+
+ do
+ {
+ // Adjust contrast mode.
+ bool bUseContrast = Application::GetSettings().GetStyleSettings().
+ GetHighContrastMode();
+ mpPreviewDevice->SetDrawMode (bUseContrast
+ ? sd::OUTPUT_DRAWMODE_CONTRAST
+ : sd::OUTPUT_DRAWMODE_COLOR);
+
+ // Set output size.
+ Size aSize (rBitmapEx.GetSizePixel());
+ if (aSize.Width() <= 0)
+ break;
+ Size aFrameSize (
+ nWidth,
+ static_cast<::tools::Long>((nWidth*1.0 * aSize.Height()) / aSize.Width() + 0.5));
+ Size aPreviewSize (aFrameSize.Width()-2,aFrameSize.Height()-2);
+ MapMode aMapMode (mpPreviewDevice->GetMapMode());
+ aMapMode.SetMapUnit(MapUnit::MapPixel);
+ aMapMode.SetOrigin (Point());
+ aMapMode.SetScaleX (Fraction(1.0));
+ aMapMode.SetScaleY (Fraction(1.0));
+ mpPreviewDevice->SetMapMode (aMapMode);
+ mpPreviewDevice->SetOutputSize (aFrameSize);
+
+ // Paint a frame around the preview.
+ mpPreviewDevice->SetLineColor (maFrameColor);
+ mpPreviewDevice->SetFillColor ();
+ mpPreviewDevice->DrawRect (::tools::Rectangle(Point(0,0), aFrameSize));
+
+ // Paint the bitmap scaled to the desired width.
+ BitmapEx aScaledBitmap(rBitmapEx);
+ aScaledBitmap.Scale (aPreviewSize, BmpScaleFlag::BestQuality);
+ mpPreviewDevice->DrawBitmapEx (
+ Point(1,1),
+ aPreviewSize,
+ aScaledBitmap);
+
+ // Get the resulting bitmap.
+ aPreview = Image(mpPreviewDevice->GetBitmapEx(Point(0,0), aFrameSize));
+ }
+ while (false);
+
+ return aPreview;
+}
+
+void PreviewRenderer::Notify(SfxBroadcaster&, const SfxHint& rHint)
+{
+ if (!mpDocShellOfView)
+ return;
+
+ if (rHint.GetId() == SfxHintId::Dying)
+ {
+ // The doc shell is dying. Our view uses its item pool and
+ // has to be destroyed as well. The next call to
+ // ProvideView will create a new one (for another
+ // doc shell, of course.)
+ mpView.reset();
+ mpDocShellOfView = nullptr;
+ }
+}
+
+//===== ViewRedirector ========================================================
+
+namespace {
+
+ViewRedirector::ViewRedirector()
+{
+}
+
+void ViewRedirector::createRedirectedPrimitive2DSequence(
+ const sdr::contact::ViewObjectContact& rOriginal,
+ const sdr::contact::DisplayInfo& rDisplayInfo,
+ drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor)
+{
+ SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject();
+
+ if (pObject==nullptr || pObject->getSdrPageFromSdrObject() == nullptr)
+ {
+ // not a SdrObject visualisation (maybe e.g. page) or no page
+ sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
+ rOriginal,
+ rDisplayInfo,
+ rVisitor);
+ return;
+ }
+
+ const bool bDoCreateGeometry (pObject->getSdrPageFromSdrObject()->checkVisibility( rOriginal, rDisplayInfo, true));
+
+ if ( ! bDoCreateGeometry
+ && (pObject->GetObjInventor() != SdrInventor::Default || pObject->GetObjIdentifier() != SdrObjKind::Page))
+ {
+ return;
+ }
+
+ if (pObject->IsEmptyPresObj())
+ return;
+
+ sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
+ rOriginal,
+ rDisplayInfo,
+ rVisitor);
+}
+
+} // end of anonymous namespace
+
+} // end of namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/tools/PropertySet.cxx b/sd/source/ui/tools/PropertySet.cxx
new file mode 100644
index 000000000..057b7dd96
--- /dev/null
+++ b/sd/source/ui/tools/PropertySet.cxx
@@ -0,0 +1,158 @@
+/* -*- 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 <tools/PropertySet.hxx>
+#include <algorithm>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd::tools {
+
+PropertySet::PropertySet()
+ : PropertySetInterfaceBase(m_aMutex),
+ mpChangeListeners(new ChangeListenerContainer)
+{
+}
+
+PropertySet::~PropertySet()
+{
+}
+
+void SAL_CALL PropertySet::disposing()
+{
+}
+
+//----- XPropertySet ----------------------------------------------------------
+
+Reference<beans::XPropertySetInfo> SAL_CALL PropertySet::getPropertySetInfo()
+{
+ return nullptr;
+}
+
+void SAL_CALL PropertySet::setPropertyValue (
+ const OUString& rsPropertyName,
+ const css::uno::Any& rsPropertyValue)
+{
+ ThrowIfDisposed();
+
+ Any aOldValue (SetPropertyValue(rsPropertyName,rsPropertyValue));
+ if (aOldValue == rsPropertyValue)
+ return;
+
+ // Inform listeners that are registered specifically for the
+ // property and those registered for any property.
+ beans::PropertyChangeEvent aEvent(
+ static_cast<XWeak*>(this),
+ rsPropertyName,
+ false,
+ -1,
+ aOldValue,
+ rsPropertyValue);
+ CallListeners(rsPropertyName, aEvent);
+ CallListeners(OUString(), aEvent);
+}
+
+Any SAL_CALL PropertySet::getPropertyValue (const OUString& rsPropertyName)
+{
+ ThrowIfDisposed();
+
+ return GetPropertyValue(rsPropertyName);
+}
+
+void SAL_CALL PropertySet::addPropertyChangeListener (
+ const OUString& rsPropertyName,
+ const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener)
+{
+ if ( ! rxListener.is())
+ throw lang::IllegalArgumentException();
+
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ return;
+
+ mpChangeListeners->emplace(rsPropertyName, rxListener);
+}
+
+void SAL_CALL PropertySet::removePropertyChangeListener (
+ const OUString& rsPropertyName,
+ const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener)
+{
+ ::std::pair<ChangeListenerContainer::iterator,ChangeListenerContainer::iterator>
+ aRange (mpChangeListeners->equal_range(rsPropertyName));
+
+ ChangeListenerContainer::iterator iListener (
+ ::std::find_if(
+ aRange.first,
+ aRange.second,
+ [&rxListener] (const ChangeListenerContainer::value_type& listener) {
+ return listener.second == rxListener;
+ }));
+
+ if (iListener == mpChangeListeners->end())
+ {
+ throw lang::IllegalArgumentException();
+ }
+
+ mpChangeListeners->erase(iListener);
+
+}
+
+void SAL_CALL PropertySet::addVetoableChangeListener (
+ const OUString&,
+ const css::uno::Reference<css::beans::XVetoableChangeListener>&)
+{
+ // Constraint properties are not supported and thus no vetoable
+ // listeners.
+}
+
+void SAL_CALL PropertySet::removeVetoableChangeListener (
+ const OUString&,
+ const css::uno::Reference<css::beans::XVetoableChangeListener>&)
+{
+ // Constraint properties are not supported and thus no vetoable
+ // listeners.
+}
+
+void PropertySet::CallListeners (
+ const OUString& rsPropertyName,
+ const beans::PropertyChangeEvent& rEvent)
+{
+ ::std::pair<ChangeListenerContainer::iterator,ChangeListenerContainer::iterator>
+ aRange (mpChangeListeners->equal_range(rsPropertyName));
+ ChangeListenerContainer::const_iterator iListener;
+ for (iListener=aRange.first; iListener!=aRange.second; ++iListener)
+ {
+ if (iListener->second.is())
+ iListener->second->propertyChange(rEvent);
+ }
+}
+
+void PropertySet::ThrowIfDisposed()
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PropertySet object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+} // end of namespace ::sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/tools/SdGlobalResourceContainer.cxx b/sd/source/ui/tools/SdGlobalResourceContainer.cxx
new file mode 100644
index 000000000..a7dbc5f25
--- /dev/null
+++ b/sd/source/ui/tools/SdGlobalResourceContainer.cxx
@@ -0,0 +1,197 @@
+/* -*- 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 <tools/SdGlobalResourceContainer.hxx>
+
+#include <../cache/SlsCacheConfiguration.hxx>
+
+#include <comphelper/processfactory.hxx>
+#include <comphelper/unique_disposing_ptr.hxx>
+
+#include <com/sun/star/frame/Desktop.hpp>
+
+#include <sal/log.hxx>
+#include <tools/debug.hxx>
+
+#include <algorithm>
+#include <memory>
+#include <vector>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd {
+
+class SdGlobalResourceContainerInstance
+ : public comphelper::unique_disposing_solar_mutex_reset_ptr<SdGlobalResourceContainer>
+{
+public:
+ SdGlobalResourceContainerInstance()
+ : comphelper::unique_disposing_solar_mutex_reset_ptr<SdGlobalResourceContainer>(
+ uno::Reference<lang::XComponent>(frame::Desktop::create(comphelper::getProcessComponentContext()), uno::UNO_QUERY_THROW),
+ new SdGlobalResourceContainer, true)
+ {
+ }
+};
+
+namespace {
+
+SdGlobalResourceContainerInstance& theSdGlobalResourceContainerInstance()
+{
+ static SdGlobalResourceContainerInstance SINGLETON;
+ return SINGLETON;
+}
+
+} // namespace
+
+//===== SdGlobalResourceContainer::Implementation =============================
+
+class SdGlobalResourceContainer::Implementation
+{
+private:
+ friend class SdGlobalResourceContainer;
+
+ ::osl::Mutex maMutex;
+
+ /** All instances of SdGlobalResource in this vector are owned by the
+ container and will be destroyed when the container is destroyed.
+ */
+ std::vector<std::unique_ptr<SdGlobalResource>> maResources;
+
+ typedef ::std::vector<std::shared_ptr<SdGlobalResource> > SharedResourceList;
+ SharedResourceList maSharedResources;
+
+ typedef ::std::vector<Reference<XInterface> > XInterfaceResourceList;
+ XInterfaceResourceList maXInterfaceResources;
+};
+
+// static
+SdGlobalResourceContainer& SdGlobalResourceContainer::Instance()
+{
+ SdGlobalResourceContainer *const pRet(theSdGlobalResourceContainerInstance().get());
+ assert(pRet); // error if it has been deleted and is null
+ return *pRet;
+}
+
+//===== SdGlobalResourceContainer =============================================
+
+void SdGlobalResourceContainer::AddResource (
+ ::std::unique_ptr<SdGlobalResource> pResource)
+{
+ ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ assert( std::none_of(
+ mpImpl->maResources.begin(),
+ mpImpl->maResources.end(),
+ [&](const std::unique_ptr<SdGlobalResource>& p) { return p == pResource; })
+ && "duplicate resource?");
+
+ mpImpl->maResources.push_back(std::move(pResource));
+}
+
+void SdGlobalResourceContainer::AddResource (
+ const std::shared_ptr<SdGlobalResource>& pResource)
+{
+ ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ Implementation::SharedResourceList::iterator iResource = ::std::find (
+ mpImpl->maSharedResources.begin(),
+ mpImpl->maSharedResources.end(),
+ pResource);
+ if (iResource == mpImpl->maSharedResources.end())
+ mpImpl->maSharedResources.push_back(pResource);
+ else
+ {
+ SAL_WARN ("sd.tools",
+ "SdGlobalResourceContainer:AddResource(): Resource added twice.");
+ }
+}
+
+void SdGlobalResourceContainer::AddResource (const Reference<XInterface>& rxResource)
+{
+ ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ Implementation::XInterfaceResourceList::iterator iResource = ::std::find (
+ mpImpl->maXInterfaceResources.begin(),
+ mpImpl->maXInterfaceResources.end(),
+ rxResource);
+ if (iResource == mpImpl->maXInterfaceResources.end())
+ mpImpl->maXInterfaceResources.push_back(rxResource);
+ else
+ {
+ SAL_WARN ("sd.tools",
+ "SdGlobalResourceContainer:AddResource(): Resource added twice.");
+ }
+}
+
+SdGlobalResourceContainer::SdGlobalResourceContainer()
+ : mpImpl (new SdGlobalResourceContainer::Implementation)
+{
+}
+
+SdGlobalResourceContainer::~SdGlobalResourceContainer()
+{
+ ::osl::MutexGuard aGuard (mpImpl->maMutex);
+
+ // Release the resources in reversed order of their addition to the
+ // container. This is because a resource A added before resource B
+ // may have been created due to a request of B. Thus B depends on A and
+ // should be destroyed first.
+ for (auto iResource = mpImpl->maResources.rbegin();
+ iResource != mpImpl->maResources.rend();
+ ++iResource)
+ {
+ iResource->reset();
+ }
+
+
+ // The SharedResourceList has not to be released manually. We just
+ // assert resources that are still held by someone other than us.
+ Implementation::SharedResourceList::reverse_iterator iSharedResource;
+ for (iSharedResource = mpImpl->maSharedResources.rbegin();
+ iSharedResource != mpImpl->maSharedResources.rend();
+ ++iSharedResource)
+ {
+ if (iSharedResource->use_count() > 1)
+ {
+ SdGlobalResource* pResource = iSharedResource->get();
+ SAL_INFO(
+ "sd.tools", pResource << " " << iSharedResource->use_count());
+ DBG_ASSERT(iSharedResource->use_count() == 1,
+ "SdGlobalResource still held in ~SdGlobalResourceContainer");
+ }
+ }
+
+ Implementation::XInterfaceResourceList::reverse_iterator iXInterfaceResource;
+ for (iXInterfaceResource = mpImpl->maXInterfaceResources.rbegin();
+ iXInterfaceResource != mpImpl->maXInterfaceResources.rend();
+ ++iXInterfaceResource)
+ {
+ Reference<lang::XComponent> xComponent (*iXInterfaceResource, UNO_QUERY);
+ *iXInterfaceResource = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ sd::slidesorter::cache::CacheConfiguration::Shutdown();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/tools/SlotStateListener.cxx b/sd/source/ui/tools/SlotStateListener.cxx
new file mode 100644
index 000000000..9b75b322e
--- /dev/null
+++ b/sd/source/ui/tools/SlotStateListener.cxx
@@ -0,0 +1,153 @@
+/* -*- 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 <tools/SlotStateListener.hxx>
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/frame/XDispatch.hpp>
+#include <com/sun/star/util/URLTransformer.hpp>
+#include <com/sun/star/util/XURLTransformer.hpp>
+
+#include <comphelper/processfactory.hxx>
+
+using namespace ::com::sun::star;
+
+namespace sd::tools {
+
+SlotStateListener::SlotStateListener (
+ Link<const OUString&,void> const & rCallback,
+ const uno::Reference<frame::XDispatchProvider>& rxDispatchProvider,
+ const OUString& rSlotName)
+ : mxDispatchProviderWeak(nullptr)
+{
+ SetCallback(rCallback);
+ ConnectToDispatchProvider(rxDispatchProvider);
+ ObserveSlot(rSlotName);
+}
+
+SlotStateListener::~SlotStateListener()
+{
+ ReleaseListeners();
+}
+
+void SlotStateListener::SetCallback (const Link<const OUString&,void>& rCallback)
+{
+ ThrowIfDisposed();
+
+ maCallback = rCallback;
+}
+
+void SlotStateListener::ConnectToDispatchProvider (
+ const uno::Reference<frame::XDispatchProvider>& rxDispatchProvider)
+{
+ ThrowIfDisposed();
+
+ // When we are listening to state changes of slots of another frame then
+ // release these listeners first.
+ if ( ! maRegisteredURLList.empty())
+ ReleaseListeners();
+
+ mxDispatchProviderWeak = rxDispatchProvider;
+}
+
+void SlotStateListener::ObserveSlot (const OUString& rSlotName)
+{
+ ThrowIfDisposed();
+
+ if (maCallback.IsSet())
+ {
+ // Connect the state change listener.
+ util::URL aURL (MakeURL(rSlotName));
+ uno::Reference<frame::XDispatch> xDispatch (GetDispatch(aURL));
+ if (xDispatch.is())
+ {
+ maRegisteredURLList.push_back(aURL);
+ xDispatch->addStatusListener(this,aURL);
+ }
+ }
+}
+
+void SlotStateListener::disposing(std::unique_lock<std::mutex>&)
+{
+ ReleaseListeners();
+ mxDispatchProviderWeak.clear();
+ maCallback = Link<const OUString&,void>();
+}
+
+util::URL SlotStateListener::MakeURL (const OUString& rSlotName)
+{
+ util::URL aURL;
+ aURL.Complete = rSlotName;
+
+ uno::Reference<util::XURLTransformer> xTransformer(util::URLTransformer::create(::comphelper::getProcessComponentContext()));
+ xTransformer->parseStrict(aURL);
+
+ return aURL;
+}
+
+uno::Reference<frame::XDispatch>
+ SlotStateListener::GetDispatch (const util::URL& rURL) const
+{
+ uno::Reference<frame::XDispatch> xDispatch;
+
+ uno::Reference<frame::XDispatchProvider> xDispatchProvider (mxDispatchProviderWeak);
+ if (xDispatchProvider.is())
+ xDispatch = xDispatchProvider->queryDispatch(rURL, OUString(), 0);
+
+ return xDispatch;
+}
+
+void SlotStateListener::statusChanged (
+ const frame::FeatureStateEvent& rState)
+{
+ ThrowIfDisposed();
+ OUString sSlotName (rState.FeatureURL.Complete);
+ maCallback.Call(sSlotName);
+}
+
+void SlotStateListener::ReleaseListeners()
+{
+ for (const auto& rURL : maRegisteredURLList)
+ {
+ uno::Reference<frame::XDispatch> xDispatch (GetDispatch(rURL));
+ if (xDispatch.is())
+ {
+ xDispatch->removeStatusListener(this,rURL);
+ }
+ }
+}
+
+//===== lang::XEventListener ================================================
+
+void SAL_CALL SlotStateListener::disposing (
+ const lang::EventObject& )
+{
+}
+
+void SlotStateListener::ThrowIfDisposed()
+{
+ if (m_bDisposed)
+ {
+ throw lang::DisposedException ("SlideSorterController object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+} // end of namespace ::sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/tools/TimerBasedTaskExecution.cxx b/sd/source/ui/tools/TimerBasedTaskExecution.cxx
new file mode 100644
index 000000000..ae1f2233f
--- /dev/null
+++ b/sd/source/ui/tools/TimerBasedTaskExecution.cxx
@@ -0,0 +1,130 @@
+/* -*- 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 <tools/TimerBasedTaskExecution.hxx>
+#include <tools/AsynchronousTask.hxx>
+#include <tools/time.hxx>
+#include <sal/log.hxx>
+#include <memory>
+
+namespace sd::tools {
+
+/** Used by the shared_ptr instead of the private destructor.
+*/
+class TimerBasedTaskExecution::Deleter
+{
+public:
+ void operator() (TimerBasedTaskExecution* pObject)
+ {
+ delete pObject;
+ }
+};
+
+std::shared_ptr<TimerBasedTaskExecution> TimerBasedTaskExecution::Create (
+ const std::shared_ptr<AsynchronousTask>& rpTask,
+ sal_uInt32 nMillisecondsBetweenSteps,
+ sal_uInt32 nMaxTimePerStep)
+{
+ std::shared_ptr<TimerBasedTaskExecution> pExecution(
+ new TimerBasedTaskExecution(rpTask,nMillisecondsBetweenSteps,nMaxTimePerStep),
+ Deleter());
+ // Let the new object have a shared_ptr to itself, so that it can
+ // release itself when the AsynchronousTask has been executed
+ // completely.
+ if (pExecution->mpTask != nullptr)
+ pExecution->mpSelf = pExecution;
+ return pExecution;
+}
+
+void TimerBasedTaskExecution::Release()
+{
+ maTimer.Stop();
+ mpSelf.reset();
+}
+
+//static
+void TimerBasedTaskExecution::ReleaseTask (
+ const std::weak_ptr<TimerBasedTaskExecution>& rpExecution)
+{
+ if ( rpExecution.expired())
+ return;
+
+ try
+ {
+ std::shared_ptr<tools::TimerBasedTaskExecution> pExecution (rpExecution);
+ pExecution->Release();
+ }
+ catch (const std::bad_weak_ptr&)
+ {
+ // When a bad_weak_ptr has been thrown then the object pointed
+ // to by rpTask has been released right after we checked that it
+ // still existed. Too bad, but that means, that we have nothing
+ // more do.
+ }
+}
+
+TimerBasedTaskExecution::TimerBasedTaskExecution (
+ const std::shared_ptr<AsynchronousTask>& rpTask,
+ sal_uInt32 nMillisecondsBetweenSteps,
+ sal_uInt32 nMaxTimePerStep)
+ : mpTask(rpTask),
+ maTimer("sd TimerBasedTaskExecution maTimer"),
+ mnMaxTimePerStep(nMaxTimePerStep)
+{
+ maTimer.SetInvokeHandler( LINK(this,TimerBasedTaskExecution,TimerCallback) );
+ maTimer.SetTimeout(nMillisecondsBetweenSteps);
+ maTimer.Start();
+}
+
+TimerBasedTaskExecution::~TimerBasedTaskExecution()
+{
+ maTimer.Stop();
+}
+
+IMPL_LINK_NOARG(TimerBasedTaskExecution, TimerCallback, Timer *, void)
+{
+ if (mpTask == nullptr)
+ return;
+
+ if (mpTask->HasNextStep())
+ {
+ // Execute as many steps as fit into the time span of length
+ // mnMaxTimePerStep. Note that the last step may take longer
+ // than allowed.
+ sal_uInt32 nStartTime (::tools::Time( ::tools::Time::SYSTEM ).GetMSFromTime());
+ SAL_INFO("sd.tools", __func__ << ": starting TimerBasedTaskExecution at " << nStartTime);
+ do
+ {
+ mpTask->RunNextStep();
+ sal_uInt32 nDuration (::tools::Time( ::tools::Time::SYSTEM ).GetMSFromTime()-nStartTime);
+ SAL_INFO("sd.tools", __func__ << ": executed step in " << nDuration);
+ if (nDuration > mnMaxTimePerStep)
+ break;
+ }
+ while (mpTask->HasNextStep());
+ SAL_INFO("sd.tools", __func__ << ": TimerBasedTaskExecution sleeping");
+ maTimer.Start();
+ }
+ else
+ mpSelf.reset();
+}
+
+} // end of namespace ::sd::tools
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/uitest/uiobject.cxx b/sd/source/ui/uitest/uiobject.cxx
new file mode 100644
index 000000000..afd130ee2
--- /dev/null
+++ b/sd/source/ui/uitest/uiobject.cxx
@@ -0,0 +1,183 @@
+/* -*- 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 <uiobject.hxx>
+
+#include <Window.hxx>
+#include <DrawViewShell.hxx>
+#include <sdpage.hxx>
+
+#include <sfx2/sidebar/Sidebar.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <svx/uiobject.hxx>
+#include <tools/debug.hxx>
+
+namespace
+{
+class ImpressSdrObject : public SdrUIObject
+{
+public:
+ ImpressSdrObject(const VclPtr<sd::Window>& xImpressWin, const OUString& rName);
+
+ SdrObject* get_object() override;
+
+private:
+ VclPtr<sd::Window> mxWindow;
+
+ OUString maName;
+};
+
+sd::DrawViewShell* getViewShell(const VclPtr<sd::Window>& xWindow)
+{
+ sd::DrawViewShell* pViewShell = dynamic_cast<sd::DrawViewShell*>(xWindow->GetViewShell());
+ assert(pViewShell);
+
+ return pViewShell;
+}
+
+OUString getObjectName(SdrObject const* pObject)
+{
+ if (pObject->GetName().isEmpty())
+ return "Unnamed Drawinglayer object " + OUString::number(pObject->GetOrdNum());
+ else
+ return pObject->GetName();
+}
+
+SdrObject* getObject(const VclPtr<sd::Window>& xWindow, std::u16string_view rName)
+{
+ SdrPage* pPage = getViewShell(xWindow)->getCurrentPage();
+
+ if (!pPage)
+ return nullptr;
+
+ size_t nObjs = pPage->GetObjCount();
+ for (size_t i = 0; i < nObjs; ++i)
+ {
+ SdrObject* pObj = pPage->GetObj(i);
+ if (rName == getObjectName(pObj))
+ return pObj;
+ }
+
+ return nullptr;
+}
+}
+
+ImpressSdrObject::ImpressSdrObject(const VclPtr<sd::Window>& xImpressWin, const OUString& rName)
+ : mxWindow(xImpressWin)
+ , maName(rName)
+{
+}
+
+SdrObject* ImpressSdrObject::get_object() { return getObject(mxWindow, maName); }
+
+ImpressWindowUIObject::ImpressWindowUIObject(const VclPtr<sd::Window>& xWindow)
+ : WindowUIObject(xWindow)
+ , mxWindow(xWindow)
+{
+}
+
+StringMap ImpressWindowUIObject::get_state()
+{
+ StringMap aMap = WindowUIObject::get_state();
+
+ aMap["SelectedText"] = getViewShell(mxWindow)->GetSelectionText(false);
+ aMap["CurrentSlide"] = OUString::number(getViewShell(mxWindow)->GetCurPagePos() + 1);
+ aMap["Zoom"] = OUString::number(getViewShell(mxWindow)->GetZoom());
+
+ return aMap;
+}
+
+void ImpressWindowUIObject::execute(const OUString& rAction, const StringMap& rParameters)
+{
+ if (rAction == "SET")
+ {
+ if (rParameters.find("ZOOM") != rParameters.end())
+ {
+ auto itr = rParameters.find("ZOOM");
+ OUString aVal = itr->second;
+ sal_Int32 nVal = aVal.toInt32();
+ getViewShell(mxWindow)->SetZoom(nVal);
+ }
+ }
+ else if (rAction == "GOTO")
+ {
+ if (rParameters.find("PAGE") != rParameters.end())
+ {
+ auto itr = rParameters.find("PAGE");
+ OUString aVal = itr->second;
+ sal_Int32 nVal = aVal.toInt32();
+ getViewShell(mxWindow)->SwitchPage(nVal - 1);
+ }
+ }
+ else if (rAction == "SELECT")
+ {
+ if (rParameters.find("OBJECT") != rParameters.end())
+ {
+ auto itr = rParameters.find("OBJECT");
+ OUString aName = itr->second;
+ SdrObject* pObj = getObject(mxWindow, aName);
+ SdrPageView* pPageView = getViewShell(mxWindow)->GetView()->GetSdrPageView();
+ getViewShell(mxWindow)->GetView()->MarkObj(pObj, pPageView);
+ }
+ }
+ else if (rAction == "SIDEBAR")
+ {
+ SfxViewFrame* pViewFrm = SfxViewFrame::Current();
+ DBG_ASSERT(pViewFrm, "ImpressWindowUIObject::execute: no viewframe");
+ pViewFrm->ShowChildWindow(SID_SIDEBAR);
+
+ auto itr = rParameters.find("PANEL");
+ if (itr != rParameters.end())
+ {
+ OUString aVal = itr->second;
+ ::sfx2::sidebar::Sidebar::ShowPanel(aVal, pViewFrm->GetFrame().GetFrameInterface());
+ }
+ }
+ else if (rAction == "DESELECT")
+ {
+ getViewShell(mxWindow)->GetView()->UnMarkAll();
+ }
+ else
+ WindowUIObject::execute(rAction, rParameters);
+}
+
+std::unique_ptr<UIObject> ImpressWindowUIObject::get_child(const OUString& rID)
+{
+ return std::unique_ptr<UIObject>(new ImpressSdrObject(mxWindow, rID));
+}
+
+std::set<OUString> ImpressWindowUIObject::get_children() const
+{
+ SdrPage* pPage = getViewShell(mxWindow)->getCurrentPage();
+
+ std::set<OUString> aRet;
+ if (!pPage)
+ return aRet;
+
+ size_t nObjs = pPage->GetObjCount();
+ for (size_t i = 0; i < nObjs; ++i)
+ {
+ SdrObject* pObject = pPage->GetObj(i);
+ aRet.insert(getObjectName(pObject));
+ }
+
+ return aRet;
+}
+
+OUString ImpressWindowUIObject::get_name() const { return "ImpressWindowUIObject"; }
+
+std::unique_ptr<UIObject> ImpressWindowUIObject::create(vcl::Window* pWindow)
+{
+ sd::Window* pWin = dynamic_cast<sd::Window*>(pWindow);
+ assert(pWin);
+ return std::unique_ptr<UIObject>(new ImpressWindowUIObject(pWin));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/DrawController.cxx b/sd/source/ui/unoidl/DrawController.cxx
new file mode 100644
index 000000000..e4afc842a
--- /dev/null
+++ b/sd/source/ui/unoidl/DrawController.cxx
@@ -0,0 +1,815 @@
+/* -*- 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 <DrawController.hxx>
+
+#include <sdpage.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShellManager.hxx>
+#include <FormShellManager.hxx>
+#include <Window.hxx>
+
+#include <comphelper/processfactory.hxx>
+#include <comphelper/sequence.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <cppuhelper/typeprovider.hxx>
+
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/drawing/framework/ConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/ModuleController.hpp>
+#include <com/sun/star/drawing/XDrawSubController.hpp>
+#include <com/sun/star/drawing/XLayer.hpp>
+
+#include <slideshow.hxx>
+
+#include <sal/log.hxx>
+#include <svx/fmshell.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/EnumContext.hxx>
+#include <svx/sidebar/ContextChangeEventMultiplexer.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <memory>
+
+using namespace ::std;
+using namespace ::cppu;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+using vcl::EnumContext;
+
+namespace sd {
+
+DrawController::DrawController (ViewShellBase& rBase) noexcept
+ : DrawControllerInterfaceBase(&rBase),
+ BroadcastHelperOwner(SfxBaseController::m_aMutex),
+ OPropertySetHelper(BroadcastHelperOwner::maBroadcastHelper),
+ mpCurrentLayer(nullptr),
+ m_aSelectionTypeIdentifier(
+ cppu::UnoType<view::XSelectionChangeListener>::get()),
+ mpBase(&rBase),
+ mpCurrentPage(nullptr),
+ mbMasterPageMode(false),
+ mbLayerMode(false),
+ mbDisposing(false)
+{
+ ProvideFrameworkControllers();
+}
+
+DrawController::~DrawController() noexcept
+{
+}
+
+void DrawController::SetSubController (
+ const Reference<drawing::XDrawSubController>& rxSubController)
+{
+ // Update the internal state.
+ mxSubController = rxSubController;
+ mpPropertyArrayHelper.reset();
+ maLastVisArea = ::tools::Rectangle();
+
+ // Inform listeners about the changed state.
+ FireSelectionChangeListener();
+}
+
+// XInterface
+
+IMPLEMENT_FORWARD_XINTERFACE2(
+ DrawController,
+ DrawControllerInterfaceBase,
+ OPropertySetHelper);
+
+// XTypeProvider
+
+Sequence<Type> SAL_CALL DrawController::getTypes()
+{
+ ThrowIfDisposed();
+ // OPropertySetHelper does not provide getTypes, so we have to
+ // implement this method manually and list its three interfaces.
+ OTypeCollection aTypeCollection (
+ cppu::UnoType<beans::XMultiPropertySet>::get(),
+ cppu::UnoType<beans::XFastPropertySet>::get(),
+ cppu::UnoType<beans::XPropertySet>::get());
+
+ return ::comphelper::concatSequences(
+ SfxBaseController::getTypes(),
+ aTypeCollection.getTypes(),
+ DrawControllerInterfaceBase::getTypes());
+}
+
+IMPLEMENT_GET_IMPLEMENTATION_ID(DrawController);
+
+// XComponent
+
+void SAL_CALL DrawController::dispose()
+{
+ if( mbDisposing )
+ return;
+
+ SolarMutexGuard aGuard;
+
+ if( mbDisposing )
+ return;
+
+ mbDisposing = true;
+
+ std::shared_ptr<ViewShell> pViewShell;
+ if (mpBase)
+ pViewShell = mpBase->GetMainViewShell();
+ if ( pViewShell )
+ {
+ pViewShell->DeactivateCurrentFunction();
+ auto* pView = pViewShell->GetView();
+ if (pView)
+ pView->getSearchContext().resetSearchFunction();
+ }
+ pViewShell.reset();
+
+ // When the controller has not been detached from its view
+ // shell, i.e. mpViewShell is not NULL, then tell PaneManager
+ // and ViewShellManager to clear the shell stack.
+ if (mxSubController.is() && mpBase!=nullptr)
+ {
+ mpBase->DisconnectAllClients();
+ mpBase->GetViewShellManager()->Shutdown();
+ }
+
+ OPropertySetHelper::disposing();
+
+ DisposeFrameworkControllers();
+
+ SfxBaseController::dispose();
+}
+
+void SAL_CALL DrawController::addEventListener(
+ const Reference<lang::XEventListener >& xListener)
+{
+ ThrowIfDisposed();
+ SfxBaseController::addEventListener( xListener );
+}
+
+void SAL_CALL DrawController::removeEventListener (
+ const Reference<lang::XEventListener >& aListener)
+{
+ if(!rBHelper.bDisposed && !rBHelper.bInDispose && !mbDisposing)
+ SfxBaseController::removeEventListener( aListener );
+}
+
+// XController
+sal_Bool SAL_CALL DrawController::suspend( sal_Bool Suspend )
+{
+ if( Suspend )
+ {
+ ViewShellBase* pViewShellBase = GetViewShellBase();
+ if( pViewShellBase )
+ {
+ // do not allow suspend if a slideshow needs this controller!
+ rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( *pViewShellBase ) );
+ if( xSlideShow.is() && xSlideShow->dependsOn(pViewShellBase) )
+ return false;
+ }
+ }
+
+ return SfxBaseController::suspend( Suspend );
+}
+
+// XServiceInfo
+OUString SAL_CALL DrawController::getImplementationName( )
+{
+ // Do not throw an exception at the moment. This leads to a crash
+ // under Solaris on reload. See issue i70929 for details.
+ // ThrowIfDisposed();
+ return "DrawController" ;
+}
+
+constexpr OUStringLiteral ssServiceName = u"com.sun.star.drawing.DrawingDocumentDrawView";
+
+sal_Bool SAL_CALL DrawController::supportsService (const OUString& rsServiceName)
+{
+ return cppu::supportsService(this, rsServiceName);
+}
+
+Sequence<OUString> SAL_CALL DrawController::getSupportedServiceNames()
+{
+ ThrowIfDisposed();
+ Sequence<OUString> aSupportedServices { ssServiceName };
+ return aSupportedServices;
+}
+
+//------ XSelectionSupplier --------------------------------------------
+sal_Bool SAL_CALL DrawController::select (const Any& aSelection)
+{
+ ThrowIfDisposed();
+ SolarMutexGuard aGuard;
+
+ if (mxSubController.is())
+ return mxSubController->select(aSelection);
+ else
+ return false;
+}
+
+Any SAL_CALL DrawController::getSelection()
+{
+ ThrowIfDisposed();
+ SolarMutexGuard aGuard;
+
+ if (mxSubController.is())
+ return mxSubController->getSelection();
+ else
+ return Any();
+}
+
+void SAL_CALL DrawController::addSelectionChangeListener(
+ const Reference< view::XSelectionChangeListener >& xListener)
+{
+ if( mbDisposing )
+ throw lang::DisposedException();
+
+ BroadcastHelperOwner::maBroadcastHelper.addListener (m_aSelectionTypeIdentifier, xListener);
+}
+
+void SAL_CALL DrawController::removeSelectionChangeListener(
+ const Reference< view::XSelectionChangeListener >& xListener )
+{
+ if (rBHelper.bDisposed)
+ throw lang::DisposedException();
+
+ BroadcastHelperOwner::maBroadcastHelper.removeListener (m_aSelectionTypeIdentifier, xListener);
+}
+
+//===== lang::XEventListener ================================================
+
+void SAL_CALL
+ DrawController::disposing (const lang::EventObject& )
+{
+}
+
+//===== view::XSelectionChangeListener ======================================
+
+void SAL_CALL
+ DrawController::selectionChanged (const lang::EventObject& rEvent)
+{
+ ThrowIfDisposed();
+ // Have to forward the event to our selection change listeners.
+ OInterfaceContainerHelper* pListeners = BroadcastHelperOwner::maBroadcastHelper.getContainer(
+ cppu::UnoType<view::XSelectionChangeListener>::get());
+ if (!pListeners)
+ return;
+
+ // Re-send the event to all of our listeners.
+ OInterfaceIteratorHelper aIterator (*pListeners);
+ while (aIterator.hasMoreElements())
+ {
+ try
+ {
+ view::XSelectionChangeListener* pListener =
+ static_cast<view::XSelectionChangeListener*>(
+ aIterator.next());
+ if (pListener != nullptr)
+ pListener->selectionChanged (rEvent);
+ }
+ catch (const RuntimeException&)
+ {
+ }
+ }
+}
+
+// XDrawView
+
+void SAL_CALL DrawController::setCurrentPage( const Reference< drawing::XDrawPage >& xPage )
+{
+ ThrowIfDisposed();
+ SolarMutexGuard aGuard;
+
+ if (mxSubController.is())
+ mxSubController->setCurrentPage(xPage);
+}
+
+Reference< drawing::XDrawPage > SAL_CALL DrawController::getCurrentPage()
+{
+ ThrowIfDisposed();
+ SolarMutexGuard aGuard;
+ Reference<drawing::XDrawPage> xPage;
+
+ // Get current page from sub controller.
+ if (mxSubController.is())
+ xPage = mxSubController->getCurrentPage();
+
+ // When there is not yet a sub controller (during initialization) then fall back
+ // to the current page in mpCurrentPage.
+ if ( ! xPage.is() )
+ if (rtl::Reference<SdPage> pPage = mpCurrentPage.get())
+ xPage.set(pPage->getUnoPage(), UNO_QUERY);
+
+ return xPage;
+}
+
+void DrawController::FireVisAreaChanged (const ::tools::Rectangle& rVisArea) noexcept
+{
+ if( maLastVisArea == rVisArea )
+ return;
+
+ Any aNewValue;
+ aNewValue <<= awt::Rectangle(
+ rVisArea.Left(),
+ rVisArea.Top(),
+ rVisArea.GetWidth(),
+ rVisArea.GetHeight() );
+
+ Any aOldValue;
+ aOldValue <<= awt::Rectangle(
+ maLastVisArea.Left(),
+ maLastVisArea.Top(),
+ maLastVisArea.GetWidth(),
+ maLastVisArea.GetHeight() );
+
+ FirePropertyChange (PROPERTY_WORKAREA, aNewValue, aOldValue);
+
+ maLastVisArea = rVisArea;
+}
+
+void DrawController::FireSelectionChangeListener() noexcept
+{
+ OInterfaceContainerHelper * pLC = BroadcastHelperOwner::maBroadcastHelper.getContainer(
+ m_aSelectionTypeIdentifier);
+ if( !pLC )
+ return;
+
+ Reference< XInterface > xSource( static_cast<XWeak*>(this) );
+ const lang::EventObject aEvent( xSource );
+
+ // iterate over all listeners and send events
+ OInterfaceIteratorHelper aIt( *pLC);
+ while( aIt.hasMoreElements() )
+ {
+ try
+ {
+ view::XSelectionChangeListener * pL =
+ static_cast<view::XSelectionChangeListener*>(aIt.next());
+ if (pL != nullptr)
+ pL->selectionChanged( aEvent );
+ }
+ catch (const RuntimeException&)
+ {
+ }
+ }
+}
+
+void DrawController::FireChangeEditMode (bool bMasterPageMode) noexcept
+{
+ if (bMasterPageMode != mbMasterPageMode )
+ {
+ FirePropertyChange(
+ PROPERTY_MASTERPAGEMODE,
+ Any(bMasterPageMode),
+ Any(mbMasterPageMode));
+
+ mbMasterPageMode = bMasterPageMode;
+ }
+}
+
+void DrawController::FireChangeLayerMode (bool bLayerMode) noexcept
+{
+ if (bLayerMode != mbLayerMode)
+ {
+ FirePropertyChange(
+ PROPERTY_LAYERMODE,
+ Any(bLayerMode),
+ Any(mbLayerMode));
+
+ mbLayerMode = bLayerMode;
+ }
+}
+
+void DrawController::FireSwitchCurrentPage (SdPage* pNewCurrentPage) noexcept
+{
+ rtl::Reference<SdrPage> pCurrentPage = mpCurrentPage.get();
+ if (pNewCurrentPage == pCurrentPage.get())
+ return;
+
+ try
+ {
+ Any aNewValue (
+ Any(Reference<drawing::XDrawPage>(pNewCurrentPage->getUnoPage(), UNO_QUERY)));
+
+ Any aOldValue;
+ if (pCurrentPage != nullptr)
+ {
+ Reference<drawing::XDrawPage> xOldPage (pCurrentPage->getUnoPage(), UNO_QUERY);
+ aOldValue <<= xOldPage;
+ }
+
+ FirePropertyChange(PROPERTY_CURRENTPAGE, aNewValue, aOldValue);
+
+ mpCurrentPage = pNewCurrentPage;
+ }
+ catch (const uno::Exception&)
+ {
+ TOOLS_WARN_EXCEPTION("sd", "sd::SdUnoDrawView::FireSwitchCurrentPage()");
+ }
+}
+
+void DrawController::NotifyAccUpdate()
+{
+ sal_Int32 nHandle = PROPERTY_UPDATEACC;
+ Any aNewValue, aOldValue;
+ fire (&nHandle, &aNewValue, &aOldValue, 1, false);
+}
+
+void DrawController::fireChangeLayer( css::uno::Reference< css::drawing::XLayer>* pCurrentLayer ) noexcept
+{
+ if( pCurrentLayer != mpCurrentLayer )
+ {
+ sal_Int32 nHandle = PROPERTY_ACTIVE_LAYER;
+
+ Any aNewValue ( *pCurrentLayer);
+
+ Any aOldValue ;
+
+ fire (&nHandle, &aNewValue, &aOldValue, 1, false);
+
+ mpCurrentLayer = pCurrentLayer;
+ }
+}
+
+// This method is only called in slide show and outline view
+//void DrawController::fireSwitchCurrentPage(String pageName ) throw()
+void DrawController::fireSwitchCurrentPage(sal_Int32 pageIndex ) noexcept
+{
+ Any aNewValue;
+ Any aOldValue;
+ //OUString aPageName( pageName );
+ //aNewValue <<= aPageName ;
+ aNewValue <<= pageIndex;
+
+ // Use new property to handle page change event
+ sal_Int32 nHandles = PROPERTY_PAGE_CHANGE;
+ fire( &nHandles, &aNewValue, &aOldValue, 1, false );
+}
+
+void DrawController::FirePropertyChange (
+ sal_Int32 nHandle,
+ const Any& rNewValue,
+ const Any& rOldValue)
+{
+ try
+ {
+ fire (&nHandle, &rNewValue, &rOldValue, 1, false);
+ }
+ catch (const RuntimeException&)
+ {
+ // Ignore this exception. Exceptions should be handled in the
+ // fire() function so that all listeners are called. This is
+ // not the case at the moment, so we simply ignore the
+ // exception.
+ }
+
+}
+
+void DrawController::BroadcastContextChange() const
+{
+ std::shared_ptr<ViewShell> pViewShell (mpBase->GetMainViewShell());
+ if ( ! pViewShell)
+ return;
+
+ EnumContext::Context eContext (EnumContext::Context::Unknown);
+ switch (pViewShell->GetShellType())
+ {
+ case ViewShell::ST_IMPRESS:
+ case ViewShell::ST_DRAW:
+ if (mbMasterPageMode)
+ eContext = EnumContext::Context::MasterPage;
+ else
+ eContext = EnumContext::Context::DrawPage;
+ break;
+
+ case ViewShell::ST_NOTES:
+ eContext = EnumContext::Context::NotesPage;
+ break;
+
+ case ViewShell::ST_HANDOUT:
+ eContext = EnumContext::Context::HandoutPage;
+ break;
+
+ case ViewShell::ST_OUTLINE:
+ eContext = EnumContext::Context::OutlineText;
+ break;
+
+ case ViewShell::ST_SLIDE_SORTER:
+ eContext = EnumContext::Context::SlidesorterPage;
+ break;
+
+ case ViewShell::ST_PRESENTATION:
+ case ViewShell::ST_NONE:
+ default:
+ eContext = EnumContext::Context::Empty;
+ break;
+ }
+
+ ContextChangeEventMultiplexer::NotifyContextChange(mpBase, eContext);
+}
+
+void DrawController::ReleaseViewShellBase()
+{
+ DisposeFrameworkControllers();
+ mpBase = nullptr;
+}
+
+//===== XControllerManager ==============================================================
+
+Reference<XConfigurationController> SAL_CALL
+ DrawController::getConfigurationController()
+{
+ ThrowIfDisposed();
+
+ return mxConfigurationController;
+}
+
+Reference<XModuleController> SAL_CALL
+ DrawController::getModuleController()
+{
+ ThrowIfDisposed();
+
+ return mxModuleController;
+}
+
+//===== XUnoTunnel ============================================================
+
+const Sequence<sal_Int8>& DrawController::getUnoTunnelId()
+{
+ static const comphelper::UnoIdInit theDrawControllerUnoTunnelId;
+ return theDrawControllerUnoTunnelId.getSeq();
+}
+
+sal_Int64 SAL_CALL DrawController::getSomething (const Sequence<sal_Int8>& rId)
+{
+ return comphelper::getSomethingImpl(rId, this);
+}
+
+//===== Properties ============================================================
+
+void DrawController::FillPropertyTable (
+ ::std::vector<beans::Property>& rProperties)
+{
+ rProperties.emplace_back("VisibleArea",
+ PROPERTY_WORKAREA,
+ ::cppu::UnoType< css::awt::Rectangle>::get(),
+ beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY);
+ rProperties.emplace_back(
+ "SubController",
+ PROPERTY_SUB_CONTROLLER,
+ cppu::UnoType<drawing::XDrawSubController>::get(),
+ beans::PropertyAttribute::BOUND);
+ rProperties.emplace_back(
+ "CurrentPage",
+ PROPERTY_CURRENTPAGE,
+ cppu::UnoType<drawing::XDrawPage>::get(),
+ beans::PropertyAttribute::BOUND );
+ rProperties.emplace_back("IsLayerMode",
+ PROPERTY_LAYERMODE,
+ cppu::UnoType<bool>::get(),
+ beans::PropertyAttribute::BOUND );
+ rProperties.emplace_back("IsMasterPageMode",
+ PROPERTY_MASTERPAGEMODE,
+ cppu::UnoType<bool>::get(),
+ beans::PropertyAttribute::BOUND );
+ rProperties.emplace_back("ActiveLayer",
+ PROPERTY_ACTIVE_LAYER,
+ cppu::UnoType<drawing::XLayer>::get(),
+ beans::PropertyAttribute::BOUND );
+ rProperties.emplace_back("ZoomValue",
+ PROPERTY_ZOOMVALUE,
+ ::cppu::UnoType<sal_Int16>::get(),
+ beans::PropertyAttribute::BOUND );
+ rProperties.emplace_back("ZoomType",
+ PROPERTY_ZOOMTYPE,
+ ::cppu::UnoType<sal_Int16>::get(),
+ beans::PropertyAttribute::BOUND );
+ rProperties.emplace_back("ViewOffset",
+ PROPERTY_VIEWOFFSET,
+ ::cppu::UnoType< css::awt::Point>::get(),
+ beans::PropertyAttribute::BOUND );
+ rProperties.emplace_back("DrawViewMode",
+ PROPERTY_DRAWVIEWMODE,
+ ::cppu::UnoType< css::awt::Point>::get(),
+ beans::PropertyAttribute::BOUND|beans::PropertyAttribute::READONLY|beans::PropertyAttribute::MAYBEVOID );
+ // add new property to update current page's acc information
+ rProperties.emplace_back( "UpdateAcc",
+ PROPERTY_UPDATEACC,
+ ::cppu::UnoType<sal_Int16>::get(),
+ beans::PropertyAttribute::BOUND );
+ rProperties.emplace_back( "PageChange",
+ PROPERTY_PAGE_CHANGE,
+ ::cppu::UnoType<sal_Int16>::get(),
+ beans::PropertyAttribute::BOUND );
+}
+
+IPropertyArrayHelper & DrawController::getInfoHelper()
+{
+ SolarMutexGuard aGuard;
+
+ if (mpPropertyArrayHelper == nullptr)
+ {
+ ::std::vector<beans::Property> aProperties;
+ FillPropertyTable(aProperties);
+ mpPropertyArrayHelper.reset(new OPropertyArrayHelper(comphelper::containerToSequence(aProperties), false));
+ }
+
+ return *mpPropertyArrayHelper;
+}
+
+Reference < beans::XPropertySetInfo > DrawController::getPropertySetInfo()
+{
+ SolarMutexGuard aGuard;
+
+ static Reference < beans::XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
+ return xInfo;
+}
+
+uno::Reference< form::runtime::XFormController > SAL_CALL DrawController::getFormController( const uno::Reference< form::XForm >& Form )
+{
+ SolarMutexGuard aGuard;
+
+ FmFormShell* pFormShell = mpBase->GetFormShellManager()->GetFormShell();
+ SdrView* pSdrView = mpBase->GetDrawView();
+ std::shared_ptr<ViewShell> pViewShell = mpBase->GetMainViewShell();
+ ::sd::Window* pWindow = pViewShell ? pViewShell->GetActiveWindow() : nullptr;
+
+ uno::Reference< form::runtime::XFormController > xController;
+ if ( pFormShell && pSdrView && pWindow )
+ xController = FmFormShell::GetFormController( Form, *pSdrView, *pWindow->GetOutDev() );
+ return xController;
+}
+
+sal_Bool SAL_CALL DrawController::isFormDesignMode( )
+{
+ SolarMutexGuard aGuard;
+
+ bool bIsDesignMode = true;
+
+ FmFormShell* pFormShell = mpBase->GetFormShellManager()->GetFormShell();
+ if ( pFormShell )
+ bIsDesignMode = pFormShell->IsDesignMode();
+
+ return bIsDesignMode;
+}
+
+void SAL_CALL DrawController::setFormDesignMode( sal_Bool DesignMode )
+{
+ SolarMutexGuard aGuard;
+
+ FmFormShell* pFormShell = mpBase->GetFormShellManager()->GetFormShell();
+ if ( pFormShell )
+ pFormShell->SetDesignMode( DesignMode );
+}
+
+uno::Reference< awt::XControl > SAL_CALL DrawController::getControl( const uno::Reference< awt::XControlModel >& xModel )
+{
+ SolarMutexGuard aGuard;
+
+ FmFormShell* pFormShell = mpBase->GetFormShellManager()->GetFormShell();
+ SdrView* pSdrView = mpBase->GetDrawView();
+ std::shared_ptr<ViewShell> pViewShell = mpBase->GetMainViewShell();
+ ::sd::Window* pWindow = pViewShell ? pViewShell->GetActiveWindow() : nullptr;
+
+ uno::Reference< awt::XControl > xControl;
+ if ( pFormShell && pSdrView && pWindow )
+ pFormShell->GetFormControl( xModel, *pSdrView, *pWindow->GetOutDev(), xControl );
+ return xControl;
+}
+
+sal_Bool DrawController::convertFastPropertyValue (
+ Any & rConvertedValue,
+ Any & rOldValue,
+ sal_Int32 nHandle,
+ const Any& rValue)
+{
+ bool bResult = false;
+
+ if (nHandle == PROPERTY_SUB_CONTROLLER)
+ {
+ rOldValue <<= mxSubController;
+ rConvertedValue <<= Reference<drawing::XDrawSubController>(rValue, UNO_QUERY);
+ bResult = (rOldValue != rConvertedValue);
+ }
+ else if (mxSubController.is())
+ {
+ rConvertedValue = rValue;
+ try
+ {
+ rOldValue = mxSubController->getFastPropertyValue(nHandle);
+ bResult = (rOldValue != rConvertedValue);
+ }
+ catch (const beans::UnknownPropertyException&)
+ {
+ // The property is unknown and thus an illegal argument to this method.
+ throw css::lang::IllegalArgumentException();
+ }
+ }
+
+ return bResult;
+}
+
+void DrawController::setFastPropertyValue_NoBroadcast (
+ sal_Int32 nHandle,
+ const Any& rValue)
+{
+ SolarMutexGuard aGuard;
+ if (nHandle == PROPERTY_SUB_CONTROLLER)
+ SetSubController(Reference<drawing::XDrawSubController>(rValue, UNO_QUERY));
+ else if (mxSubController.is())
+ mxSubController->setFastPropertyValue(nHandle, rValue);
+}
+
+void DrawController::getFastPropertyValue (
+ Any & rRet,
+ sal_Int32 nHandle ) const
+{
+ SolarMutexGuard aGuard;
+
+ switch( nHandle )
+ {
+ case PROPERTY_WORKAREA:
+ rRet <<= awt::Rectangle(
+ maLastVisArea.Left(),
+ maLastVisArea.Top(),
+ maLastVisArea.GetWidth(),
+ maLastVisArea.GetHeight());
+ break;
+
+ case PROPERTY_SUB_CONTROLLER:
+ rRet <<= mxSubController;
+ break;
+
+ default:
+ if (mxSubController.is())
+ rRet = mxSubController->getFastPropertyValue(nHandle);
+ break;
+ }
+}
+
+void DrawController::ProvideFrameworkControllers()
+{
+ SolarMutexGuard aGuard;
+ try
+ {
+ Reference<XController> xController (this);
+ const Reference<XComponentContext> xContext (
+ ::comphelper::getProcessComponentContext() );
+ mxConfigurationController = ConfigurationController::create(
+ xContext,
+ xController);
+ mxModuleController = ModuleController::create(
+ xContext,
+ xController);
+ }
+ catch (const RuntimeException&)
+ {
+ mxConfigurationController = nullptr;
+ mxModuleController = nullptr;
+ }
+}
+
+void DrawController::DisposeFrameworkControllers()
+{
+ Reference<XComponent> xComponent (mxModuleController, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+
+ xComponent.set(mxConfigurationController, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+}
+
+void DrawController::ThrowIfDisposed() const
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose || mbDisposing)
+ {
+ SAL_WARN("sd", "Calling disposed DrawController object. Throwing exception:");
+ throw lang::DisposedException (
+ "DrawController object has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/SdUnoDrawView.cxx b/sd/source/ui/unoidl/SdUnoDrawView.cxx
new file mode 100644
index 000000000..379a2956f
--- /dev/null
+++ b/sd/source/ui/unoidl/SdUnoDrawView.cxx
@@ -0,0 +1,548 @@
+/* -*- 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 <SdUnoDrawView.hxx>
+
+#include <DrawController.hxx>
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <drawdoc.hxx>
+#include "unolayer.hxx"
+#include <unomodel.hxx>
+#include <Window.hxx>
+#include <pres.hxx>
+
+#include <comphelper/processfactory.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/unopage.hxx>
+#include <sfx2/zoomitem.hxx>
+#include <com/sun/star/drawing/DrawViewMode.hpp>
+#include <com/sun/star/drawing/ShapeCollection.hpp>
+#include <com/sun/star/drawing/XLayerManager.hpp>
+#include <com/sun/star/view/DocumentZoomType.hpp>
+
+#include <vector>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing;
+
+namespace sd {
+
+SdUnoDrawView::SdUnoDrawView(
+ DrawViewShell& rViewShell,
+ View& rView) noexcept
+ : DrawSubControllerInterfaceBase(m_aMutex),
+ mrDrawViewShell(rViewShell),
+ mrView(rView)
+{
+}
+
+SdUnoDrawView::~SdUnoDrawView() noexcept
+{
+}
+
+bool SdUnoDrawView::getMasterPageMode() const noexcept
+{
+ return (mrDrawViewShell.GetEditMode() == EditMode::MasterPage);
+}
+
+void SdUnoDrawView::setMasterPageMode (bool bMasterPageMode) noexcept
+{
+ if ((mrDrawViewShell.GetEditMode() == EditMode::MasterPage) != bMasterPageMode)
+ {
+ mrDrawViewShell.ChangeEditMode (
+ bMasterPageMode ? EditMode::MasterPage : EditMode::Page,
+ mrDrawViewShell.IsLayerModeActive());
+ }
+}
+
+bool SdUnoDrawView::getLayerMode() const noexcept
+{
+ return mrDrawViewShell.IsLayerModeActive();
+}
+
+void SdUnoDrawView::setLayerMode (bool bLayerMode) noexcept
+{
+ if (mrDrawViewShell.IsLayerModeActive() != bLayerMode)
+ {
+ mrDrawViewShell.ChangeEditMode (
+ mrDrawViewShell.GetEditMode(),
+ bLayerMode);
+ }
+}
+
+Reference<drawing::XLayer> SdUnoDrawView::getActiveLayer() const
+{
+ Reference<drawing::XLayer> xCurrentLayer;
+
+ do
+ {
+ // Retrieve the layer manager from the model.
+ SdXImpressDocument* pModel = GetModel();
+ if (pModel == nullptr)
+ break;
+
+ SdDrawDocument* pSdModel = pModel->GetDoc();
+ if (pSdModel == nullptr)
+ break;
+
+ // From the model get the current SdrLayer object via the layer admin.
+ SdrLayerAdmin& rLayerAdmin = pSdModel->GetLayerAdmin ();
+ SdrLayer* pLayer = rLayerAdmin.GetLayer (mrView.GetActiveLayer());
+ if (pLayer == nullptr)
+ break;
+
+ // Get the corresponding XLayer object from the implementation
+ // object of the layer manager.
+ Reference<drawing::XLayerManager> xManager (pModel->getLayerManager(), uno::UNO_QUERY);
+ SdLayerManager* pManager = comphelper::getFromUnoTunnel<SdLayerManager> (xManager);
+ if (pManager != nullptr)
+ xCurrentLayer = pManager->GetLayer (pLayer);
+ }
+ while (false);
+
+ return xCurrentLayer;
+}
+
+void SdUnoDrawView::setActiveLayer (const Reference<drawing::XLayer>& rxLayer)
+{
+ // Get the SdrLayer object corresponding to the given reference.
+ if ( ! rxLayer.is())
+ return;
+
+ SdLayer* pLayer = comphelper::getFromUnoTunnel<SdLayer> (rxLayer);
+ if (pLayer == nullptr)
+ return;
+
+ SdrLayer* pSdrLayer = pLayer->GetSdrLayer();
+ if (pSdrLayer == nullptr)
+ return;
+
+ // Set the new active layer and make the change visible.
+ mrView.SetActiveLayer (pSdrLayer->GetName());
+ mrDrawViewShell.ResetActualLayer ();
+}
+
+// XSelectionSupplier
+
+sal_Bool SAL_CALL SdUnoDrawView::select( const Any& aSelection )
+{
+ bool bOk = true;
+
+ ::std::vector<SdrObject*> aObjects;
+
+ SdrPage* pSdrPage = nullptr;
+
+ Reference< drawing::XShape > xShape;
+ aSelection >>= xShape;
+
+ if(xShape.is())
+ {
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xShape );
+ if( pObj )
+ {
+ pSdrPage = pObj->getSdrPageFromSdrObject();
+ aObjects.push_back( pObj );
+ }
+ else
+ {
+ bOk = false;
+ }
+ }
+ else
+ {
+ Reference< drawing::XShapes > xShapes;
+ aSelection >>= xShapes;
+ if( xShapes.is() )
+ {
+ const sal_uInt32 nCount = xShapes->getCount();
+ for( sal_uInt32 i = 0; i < nCount; i++ )
+ {
+ xShapes->getByIndex(i) >>= xShape;
+ if( xShape.is() )
+ {
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape(xShape);
+ if( !pObj )
+ {
+ bOk = false;
+ break;
+ }
+
+ if( pSdrPage == nullptr )
+ {
+ pSdrPage = pObj->getSdrPageFromSdrObject();
+ }
+ else if( pSdrPage != pObj->getSdrPageFromSdrObject() )
+ {
+ bOk = false;
+ break;
+ }
+
+ aObjects.push_back( pObj );
+ }
+ }
+ }
+ }
+
+ if( bOk )
+ {
+ if( pSdrPage )
+ {
+ setMasterPageMode( pSdrPage->IsMasterPage() );
+ mrDrawViewShell.SwitchPage( (pSdrPage->GetPageNum() - 1) >> 1 );
+ mrDrawViewShell.WriteFrameViewData();
+ }
+
+ SdrPageView *pPV = mrView.GetSdrPageView();
+
+ if(pPV)
+ {
+ // first deselect all
+ mrView.UnmarkAllObj( pPV );
+
+ for( SdrObject* pObj : aObjects )
+ {
+ mrView.MarkObj( pObj, pPV );
+ }
+ }
+ else
+ {
+ bOk = false;
+ }
+ }
+
+ return bOk;
+}
+
+Any SAL_CALL SdUnoDrawView::getSelection()
+{
+ Any aAny;
+
+ if( mrView.IsTextEdit() )
+ mrView.getTextSelection( aAny );
+
+ if( !aAny.hasValue() )
+ {
+ const SdrMarkList& rMarkList = mrView.GetMarkedObjectList();
+ const size_t nCount = rMarkList.GetMarkCount();
+ if( nCount )
+ {
+ Reference< drawing::XShapes > xShapes = drawing::ShapeCollection::create(
+ comphelper::getProcessComponentContext());
+ for( size_t nNum = 0; nNum < nCount; ++nNum)
+ {
+ SdrMark *pMark = rMarkList.GetMark(nNum);
+ if(pMark==nullptr)
+ continue;
+
+ SdrObject *pObj = pMark->GetMarkedSdrObj();
+ if(pObj==nullptr || pObj->getSdrPageFromSdrObject() == nullptr)
+ continue;
+
+ Reference< drawing::XDrawPage > xPage( pObj->getSdrPageFromSdrObject()->getUnoPage(), UNO_QUERY);
+
+ if(!xPage.is())
+ continue;
+
+ SvxDrawPage* pDrawPage = comphelper::getFromUnoTunnel<SvxDrawPage>( xPage );
+
+ if(pDrawPage==nullptr)
+ continue;
+
+ Reference< drawing::XShape > xShape( pObj->getUnoShape(), UNO_QUERY );
+
+ if(xShape.is())
+ xShapes->add(xShape);
+ }
+ aAny <<= xShapes;
+ }
+ }
+
+ return aAny;
+}
+
+void SAL_CALL SdUnoDrawView::addSelectionChangeListener (
+ const css::uno::Reference<css::view::XSelectionChangeListener>&)
+{}
+
+void SAL_CALL SdUnoDrawView::removeSelectionChangeListener (
+ const css::uno::Reference<css::view::XSelectionChangeListener>&)
+{}
+
+void SdUnoDrawView::setFastPropertyValue (
+ sal_Int32 nHandle,
+ const Any& rValue)
+{
+ switch( nHandle )
+ {
+ case DrawController::PROPERTY_CURRENTPAGE:
+ {
+ Reference< drawing::XDrawPage > xPage;
+ rValue >>= xPage;
+ setCurrentPage( xPage );
+ }
+ break;
+
+ case DrawController::PROPERTY_MASTERPAGEMODE:
+ {
+ bool bValue = false;
+ rValue >>= bValue;
+ setMasterPageMode( bValue );
+ }
+ break;
+
+ case DrawController::PROPERTY_LAYERMODE:
+ {
+ bool bValue = false;
+ rValue >>= bValue;
+ setLayerMode( bValue );
+ }
+ break;
+ case DrawController::PROPERTY_ACTIVE_LAYER:
+ {
+ Reference<drawing::XLayer> xLayer;
+ rValue >>= xLayer;
+ setActiveLayer (xLayer);
+ }
+ break;
+ case DrawController::PROPERTY_ZOOMVALUE:
+ {
+ sal_Int16 nZoom = 0;
+ rValue >>= nZoom;
+ SetZoom( nZoom );
+ }
+ break;
+ case DrawController::PROPERTY_ZOOMTYPE:
+ {
+ sal_Int16 nType = 0;
+ rValue >>= nType;
+ SetZoomType( nType );
+ }
+ break;
+ case DrawController::PROPERTY_VIEWOFFSET:
+ {
+ awt::Point aOffset;
+ rValue >>= aOffset;
+ SetViewOffset( aOffset );
+ }
+ break;
+ default:
+ throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast<cppu::OWeakObject*>(this));
+ }
+}
+
+Any SAL_CALL SdUnoDrawView::getFastPropertyValue (
+ sal_Int32 nHandle)
+{
+ Any aValue;
+ switch( nHandle )
+ {
+ case DrawController::PROPERTY_CURRENTPAGE:
+ aValue <<= getCurrentPage();
+ break;
+
+ case DrawController::PROPERTY_MASTERPAGEMODE:
+ aValue <<= getMasterPageMode();
+ break;
+
+ case DrawController::PROPERTY_LAYERMODE:
+ aValue <<= getLayerMode();
+ break;
+
+ case DrawController::PROPERTY_ACTIVE_LAYER:
+ aValue <<= getActiveLayer();
+ break;
+
+ case DrawController::PROPERTY_ZOOMVALUE:
+ aValue <<= GetZoom();
+ break;
+ case DrawController::PROPERTY_ZOOMTYPE:
+ aValue <<= sal_Int16(css::view::DocumentZoomType::BY_VALUE);
+ break;
+ case DrawController::PROPERTY_VIEWOFFSET:
+ aValue <<= GetViewOffset();
+ break;
+
+ case DrawController::PROPERTY_DRAWVIEWMODE:
+ aValue = getDrawViewMode();
+ break;
+
+ default:
+ throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast<cppu::OWeakObject*>(this));
+ }
+
+ return aValue;
+}
+
+// XDrawView
+
+void SAL_CALL SdUnoDrawView::setCurrentPage (
+ const Reference< drawing::XDrawPage >& xPage )
+{
+ SvxDrawPage* pDrawPage = comphelper::getFromUnoTunnel<SvxDrawPage>( xPage );
+ SdrPage *pSdrPage = pDrawPage ? pDrawPage->GetSdrPage() : nullptr;
+
+ if(pSdrPage)
+ {
+ // End editing of text. Otherwise the edited text object would
+ // still be visible on the new page.
+ mrDrawViewShell.GetView()->SdrEndTextEdit();
+
+ setMasterPageMode( pSdrPage->IsMasterPage() );
+ mrDrawViewShell.SwitchPage( (pSdrPage->GetPageNum() - 1) >> 1 );
+ mrDrawViewShell.WriteFrameViewData();
+ }
+}
+
+Reference< drawing::XDrawPage > SAL_CALL SdUnoDrawView::getCurrentPage()
+{
+ Reference< drawing::XDrawPage > xPage;
+
+ SdrPageView *pPV = mrView.GetSdrPageView();
+ SdrPage* pPage = pPV ? pPV->GetPage() : nullptr;
+
+ if(pPage)
+ xPage.set( pPage->getUnoPage(), UNO_QUERY );
+
+ return xPage;
+}
+
+sal_Int16 SdUnoDrawView::GetZoom() const
+{
+ if (mrDrawViewShell.GetActiveWindow() )
+ {
+ return static_cast<sal_Int16>(mrDrawViewShell.GetActiveWindow()->GetZoom());
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+void SdUnoDrawView::SetZoom( sal_Int16 nZoom )
+{
+ SvxZoomItem aZoomItem( SvxZoomType::PERCENT, nZoom );
+
+ SfxViewFrame* pViewFrame = mrDrawViewShell.GetViewFrame();
+ if( pViewFrame )
+ {
+ SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
+ if( pDispatcher )
+ {
+ pDispatcher->ExecuteList(SID_ATTR_ZOOM, SfxCallMode::SYNCHRON,
+ { &aZoomItem });
+ }
+ }
+}
+
+void SdUnoDrawView::SetViewOffset(const awt::Point& rWinPos )
+{
+ Point aWinPos( rWinPos.X, rWinPos.Y );
+ aWinPos += mrDrawViewShell.GetViewOrigin();
+ mrDrawViewShell.SetWinViewPos( aWinPos );
+}
+
+awt::Point SdUnoDrawView::GetViewOffset() const
+{
+ Point aRet = mrDrawViewShell.GetWinViewPos();
+ aRet -= mrDrawViewShell.GetViewOrigin();
+
+ return awt::Point( aRet.X(), aRet.Y() );
+}
+
+void SdUnoDrawView::SetZoomType ( sal_Int16 nType )
+{
+ SfxViewFrame* pViewFrame = mrDrawViewShell.GetViewFrame();
+ if( !pViewFrame )
+ return;
+
+ SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
+ if( !pDispatcher )
+ return;
+
+ SvxZoomType eZoomType;
+ switch( nType )
+ {
+ case css::view::DocumentZoomType::OPTIMAL:
+ eZoomType = SvxZoomType::OPTIMAL;
+ break;
+
+ case css::view::DocumentZoomType::PAGE_WIDTH:
+ case css::view::DocumentZoomType::PAGE_WIDTH_EXACT:
+ eZoomType = SvxZoomType::PAGEWIDTH;
+ break;
+
+ case css::view::DocumentZoomType::ENTIRE_PAGE:
+ eZoomType = SvxZoomType::WHOLEPAGE;
+ break;
+
+ default:
+ return;
+ }
+ SvxZoomItem aZoomItem( eZoomType );
+ pDispatcher->ExecuteList(SID_ATTR_ZOOM, SfxCallMode::SYNCHRON,
+ { &aZoomItem });
+}
+
+SdXImpressDocument* SdUnoDrawView::GetModel() const noexcept
+{
+ if (mrView.GetDocSh()!=nullptr)
+ {
+ Reference<frame::XModel> xModel (mrView.GetDocSh()->GetModel());
+ return comphelper::getFromUnoTunnel<SdXImpressDocument>(xModel);
+ }
+ else
+ return nullptr;
+}
+
+Any SdUnoDrawView::getDrawViewMode() const
+{
+ Any aRet;
+ switch( mrDrawViewShell.GetPageKind() )
+ {
+ case PageKind::Notes: aRet <<= DrawViewMode_NOTES; break;
+ case PageKind::Handout: aRet <<= DrawViewMode_HANDOUT; break;
+ case PageKind::Standard: aRet <<= DrawViewMode_DRAW; break;
+ }
+ return aRet;
+}
+
+// XServiceInfo
+OUString SAL_CALL SdUnoDrawView::getImplementationName( )
+{
+ return "com.sun.star.comp.sd.SdUnoDrawView" ;
+}
+
+sal_Bool SAL_CALL SdUnoDrawView::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+Sequence< OUString > SAL_CALL SdUnoDrawView::getSupportedServiceNames( )
+{
+ return { "com.sun.star.drawing.DrawingDocumentDrawView" };
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/SdUnoOutlineView.cxx b/sd/source/ui/unoidl/SdUnoOutlineView.cxx
new file mode 100644
index 000000000..6b98f2140
--- /dev/null
+++ b/sd/source/ui/unoidl/SdUnoOutlineView.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/.
+ *
+ * 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 <SdUnoOutlineView.hxx>
+
+#include <DrawController.hxx>
+#include <OutlineViewShell.hxx>
+#include <sdpage.hxx>
+
+#include <cppuhelper/supportsservice.hxx>
+#include <svx/unopage.hxx>
+
+using namespace ::cppu;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd {
+
+SdUnoOutlineView::SdUnoOutlineView(
+ OutlineViewShell& rViewShell) noexcept
+ : DrawSubControllerInterfaceBase(m_aMutex),
+ mrOutlineViewShell(rViewShell)
+{
+}
+
+SdUnoOutlineView::~SdUnoOutlineView() noexcept
+{
+}
+
+void SAL_CALL SdUnoOutlineView::disposing()
+{
+}
+
+//----- XSelectionSupplier ----------------------------------------------------
+
+sal_Bool SAL_CALL SdUnoOutlineView::select( const Any& )
+{
+ // todo: add selections for text ranges
+ return false;
+}
+
+Any SAL_CALL SdUnoOutlineView::getSelection()
+{
+ Any aAny;
+ return aAny;
+}
+
+void SAL_CALL SdUnoOutlineView::addSelectionChangeListener (
+ const css::uno::Reference<css::view::XSelectionChangeListener>&)
+{}
+
+void SAL_CALL SdUnoOutlineView::removeSelectionChangeListener (
+ const css::uno::Reference<css::view::XSelectionChangeListener>&)
+{}
+
+//----- XDrawView -------------------------------------------------------------
+void SAL_CALL SdUnoOutlineView::setCurrentPage (
+ const Reference< drawing::XDrawPage >& xPage)
+{
+ SvxDrawPage* pDrawPage = comphelper::getFromUnoTunnel<SvxDrawPage>( xPage );
+ SdrPage *pSdrPage = pDrawPage ? pDrawPage->GetSdrPage() : nullptr;
+ SdPage *pSdPage = dynamic_cast<SdPage*>(pSdrPage);
+
+ if (pSdPage != nullptr)
+ mrOutlineViewShell.SetCurrentPage(pSdPage);
+}
+
+Reference< drawing::XDrawPage > SAL_CALL SdUnoOutlineView::getCurrentPage()
+{
+ Reference<drawing::XDrawPage> xPage;
+
+ SdPage* pPage = mrOutlineViewShell.getCurrentPage();
+ if (pPage != nullptr)
+ xPage.set(pPage->getUnoPage(), UNO_QUERY);
+
+ return xPage;
+}
+
+void SdUnoOutlineView::setFastPropertyValue (
+ sal_Int32 nHandle,
+ const Any& rValue)
+{
+ switch( nHandle )
+ {
+ case DrawController::PROPERTY_CURRENTPAGE:
+ {
+ Reference< drawing::XDrawPage > xPage;
+ rValue >>= xPage;
+ setCurrentPage( xPage );
+ }
+ break;
+
+ default:
+ throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast<cppu::OWeakObject*>(this));
+ }
+}
+
+Any SAL_CALL SdUnoOutlineView::getFastPropertyValue (
+ sal_Int32 nHandle)
+{
+ Any aValue;
+
+ switch( nHandle )
+ {
+ case DrawController::PROPERTY_CURRENTPAGE:
+ {
+ SdPage* pPage = mrOutlineViewShell.GetActualPage();
+ if (pPage != nullptr)
+ aValue <<= pPage->getUnoPage();
+ }
+ break;
+ case DrawController::PROPERTY_VIEWOFFSET:
+ break;
+
+ default:
+ throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast<cppu::OWeakObject*>(this));
+ }
+
+ return aValue;
+}
+
+// XServiceInfo
+OUString SAL_CALL SdUnoOutlineView::getImplementationName( )
+{
+ return "com.sun.star.comp.sd.SdUnoOutlineView";
+}
+
+sal_Bool SAL_CALL SdUnoOutlineView::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+Sequence< OUString > SAL_CALL SdUnoOutlineView::getSupportedServiceNames( )
+{
+ return { "com.sun.star.presentation.OutlineView" };
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/SdUnoSlideView.cxx b/sd/source/ui/unoidl/SdUnoSlideView.cxx
new file mode 100644
index 000000000..c30962ed7
--- /dev/null
+++ b/sd/source/ui/unoidl/SdUnoSlideView.cxx
@@ -0,0 +1,172 @@
+/* -*- 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 <cppuhelper/supportsservice.hxx>
+
+#include <DrawController.hxx>
+#include <SdUnoSlideView.hxx>
+
+#include <SlideSorter.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsCurrentSlideManager.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <sdpage.hxx>
+#include <com/sun/star/beans/XPropertySet.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd {
+
+SdUnoSlideView::SdUnoSlideView (
+ slidesorter::SlideSorter& rSlideSorter) noexcept
+ : DrawSubControllerInterfaceBase(m_aMutex),
+ mrSlideSorter(rSlideSorter)
+{
+}
+
+SdUnoSlideView::~SdUnoSlideView() noexcept
+{
+}
+
+//----- XSelectionSupplier ----------------------------------------------------
+
+sal_Bool SAL_CALL SdUnoSlideView::select (const Any& aSelection)
+{
+ slidesorter::controller::SlideSorterController& rSlideSorterController
+ = mrSlideSorter.GetController();
+ slidesorter::controller::PageSelector& rSelector (rSlideSorterController.GetPageSelector());
+ rSelector.DeselectAllPages();
+ Sequence<Reference<drawing::XDrawPage> > xPages;
+ aSelection >>= xPages;
+ for (const auto& rPage : std::as_const(xPages))
+ {
+ Reference<beans::XPropertySet> xSet (rPage, UNO_QUERY);
+ if (xSet.is())
+ {
+ try
+ {
+ Any aNumber = xSet->getPropertyValue("Number");
+ sal_Int32 nPageNumber = 0;
+ aNumber >>= nPageNumber;
+ nPageNumber -=1; // Transform 1-based page numbers to 0-based ones.
+ rSelector.SelectPage(nPageNumber);
+ }
+ catch (const RuntimeException&)
+ {
+ }
+ }
+ }
+
+ return true;
+}
+
+Any SAL_CALL SdUnoSlideView::getSelection()
+{
+ Any aResult;
+
+ slidesorter::model::PageEnumeration aSelectedPages (
+ slidesorter::model::PageEnumerationProvider::CreateSelectedPagesEnumeration(
+ mrSlideSorter.GetModel()));
+ int nSelectedPageCount (
+ mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount());
+
+ Sequence<Reference<XInterface> > aPages(nSelectedPageCount);
+ auto aPagesRange = asNonConstRange(aPages);
+ int nIndex = 0;
+ while (aSelectedPages.HasMoreElements() && nIndex<nSelectedPageCount)
+ {
+ slidesorter::model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement());
+ aPagesRange[nIndex++] = pDescriptor->GetPage()->getUnoPage();
+ }
+ aResult <<= aPages;
+
+ return aResult;
+}
+
+void SAL_CALL SdUnoSlideView::addSelectionChangeListener (
+ const css::uno::Reference<css::view::XSelectionChangeListener>&)
+{}
+
+void SAL_CALL SdUnoSlideView::removeSelectionChangeListener (
+ const css::uno::Reference<css::view::XSelectionChangeListener>&)
+{}
+
+//----- XDrawView -------------------------------------------------------------
+
+void SAL_CALL SdUnoSlideView::setCurrentPage (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxDrawPage)
+{
+ Reference<beans::XPropertySet> xProperties (rxDrawPage, UNO_QUERY);
+ if (xProperties.is())
+ {
+ sal_uInt16 nPageNumber(0);
+ if (xProperties->getPropertyValue("Number") >>= nPageNumber)
+ {
+ mrSlideSorter.GetController().GetCurrentSlideManager()->SwitchCurrentSlide(
+ nPageNumber-1);
+ }
+ }
+}
+
+css::uno::Reference<css::drawing::XDrawPage > SAL_CALL
+ SdUnoSlideView::getCurrentPage()
+{
+ return mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide()->GetXDrawPage();
+}
+
+//----- XFastPropertySet ------------------------------------------------------
+
+void SdUnoSlideView::setFastPropertyValue (
+ sal_Int32 nHandle,
+ const Any&)
+{
+ throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast<cppu::OWeakObject*>(this));
+}
+
+Any SAL_CALL SdUnoSlideView::getFastPropertyValue (
+ sal_Int32 nHandle)
+{
+ if( nHandle != DrawController::PROPERTY_VIEWOFFSET )
+ throw beans::UnknownPropertyException( OUString::number(nHandle), static_cast<cppu::OWeakObject*>(this));
+
+ return Any();
+}
+
+// XServiceInfo
+OUString SAL_CALL SdUnoSlideView::getImplementationName( )
+{
+ return "com.sun.star.comp.sd.SdUnoSlideView";
+}
+
+sal_Bool SAL_CALL SdUnoSlideView::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+Sequence< OUString > SAL_CALL SdUnoSlideView::getSupportedServiceNames( )
+{
+ return { "com.sun.star.presentation.SlidesView" };
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/UnoDocumentSettings.cxx b/sd/source/ui/unoidl/UnoDocumentSettings.cxx
new file mode 100644
index 000000000..331f90b53
--- /dev/null
+++ b/sd/source/ui/unoidl/UnoDocumentSettings.cxx
@@ -0,0 +1,1431 @@
+/* -*- 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 <memory>
+#include <utility>
+#include <com/sun/star/embed/XStorage.hpp>
+#include <com/sun/star/embed/ElementModes.hpp>
+#include <com/sun/star/embed/XTransactedObject.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/beans/XMultiPropertySet.hpp>
+#include <com/sun/star/i18n/XForbiddenCharacters.hpp>
+#include <cppuhelper/implbase.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <comphelper/propertysethelper.hxx>
+#include <comphelper/propertysetinfo.hxx>
+#include <o3tl/string_view.hxx>
+#include <tools/debug.hxx>
+#include <tools/urlobj.hxx>
+#include <svx/xtable.hxx>
+#include <vcl/svapp.hxx>
+
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include "UnoDocumentSettings.hxx"
+#include <unomodel.hxx>
+
+#include <optsitem.hxx>
+#include <sfx2/printer.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <sdattr.hrc>
+#include <sdmod.hxx>
+#include <Outliner.hxx>
+#include <xmloff/settingsstore.hxx>
+#include <editeng/editstat.hxx>
+#include <svx/unoapi.hxx>
+
+using namespace ::comphelper;
+using namespace ::cppu;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::document;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::i18n;
+
+namespace sd
+{
+ namespace {
+
+ class DocumentSettings : public WeakImplHelper< XPropertySet, XMultiPropertySet, XServiceInfo >,
+ public comphelper::PropertySetHelper,
+ public DocumentSettingsSerializer
+ {
+ public:
+ explicit DocumentSettings( SdXImpressDocument* pModel );
+
+ // XInterface
+ virtual Any SAL_CALL queryInterface( const Type& aType ) override;
+ virtual void SAL_CALL acquire( ) noexcept override;
+ virtual void SAL_CALL release( ) noexcept override;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override;
+ virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override;
+ virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override;
+ virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+ virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+
+ // XMultiPropertySet
+ virtual void SAL_CALL setPropertyValues( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Sequence< css::uno::Any >& aValues ) override;
+ virtual css::uno::Sequence< css::uno::Any > SAL_CALL getPropertyValues( const css::uno::Sequence< OUString >& aPropertyNames ) override;
+ virtual void SAL_CALL addPropertiesChangeListener( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertiesChangeListener( const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override;
+ virtual void SAL_CALL firePropertiesChangeEvent( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Reference< css::beans::XPropertiesChangeListener >& xListener ) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName( ) override;
+ virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
+ virtual Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override;
+
+ // DocumentSettingsSerializer cf. xmloff
+ virtual uno::Sequence<beans::PropertyValue>
+ filterStreamsFromStorage(OUString const & referer,
+ const uno::Reference< embed::XStorage > &xStorage,
+ const uno::Sequence<beans::PropertyValue>& aConfigProps ) override;
+ virtual uno::Sequence<beans::PropertyValue>
+ filterStreamsToStorage(const uno::Reference< embed::XStorage > &xStorage,
+ const uno::Sequence<beans::PropertyValue>& aConfigProps ) override;
+
+ protected:
+ virtual void _setPropertyValues( const comphelper::PropertyMapEntry** ppEntries, const css::uno::Any* pValues ) override;
+ virtual void _getPropertyValues( const comphelper::PropertyMapEntry** ppEntries, css::uno::Any* pValue ) override;
+
+ private:
+ bool LoadList( XPropertyListType t, const OUString &rPath,
+ const OUString &rReferer,
+ const uno::Reference< embed::XStorage > &xStorage );
+ void AssignURL( XPropertyListType t, const Any* pValue, bool *pOk, bool *pChanged );
+ void ExtractURL( XPropertyListType t, Any* pValue );
+ rtl::Reference<SdXImpressDocument> mxModel;
+ };
+
+ }
+
+ Reference< XInterface > DocumentSettings_createInstance( SdXImpressDocument* pModel )
+ noexcept
+ {
+ DBG_ASSERT( pModel, "I need a model for the DocumentSettings!" );
+ return static_cast<XWeak*>(new DocumentSettings( pModel ));
+ }
+
+namespace {
+
+enum SdDocumentSettingsPropertyHandles
+{
+ HANDLE_PRINTDRAWING, HANDLE_PRINTNOTES, HANDLE_PRINTHANDOUT, HANDLE_PRINTOUTLINE, HANDLE_MEASUREUNIT, HANDLE_SCALE_NUM,
+ HANDLE_SCALE_DOM, HANDLE_TABSTOP, HANDLE_PRINTPAGENAME, HANDLE_PRINTDATE, HANDLE_PRINTTIME,
+ HANDLE_PRINTHIDDENPAGES, HANDLE_PRINTFITPAGE, HANDLE_PRINTTILEPAGE, HANDLE_PRINTBOOKLET, HANDLE_PRINTBOOKLETFRONT,
+ HANDLE_PRINTBOOKLETBACK, HANDLE_PRINTQUALITY, HANDLE_COLORTABLEURL, HANDLE_DASHTABLEURL, HANDLE_LINEENDTABLEURL, HANDLE_HATCHTABLEURL,
+ HANDLE_GRADIENTTABLEURL, HANDLE_BITMAPTABLEURL, HANDLE_FORBIDDENCHARS, HANDLE_APPLYUSERDATA, HANDLE_SAVETHUMBNAIL, HANDLE_PAGENUMFMT,
+ HANDLE_PRINTERNAME, HANDLE_PRINTERJOB, HANDLE_PRINTERPAPERSIZE, HANDLE_PARAGRAPHSUMMATION, HANDLE_CHARCOMPRESS, HANDLE_ASIANPUNCT,
+ HANDLE_UPDATEFROMTEMPLATE, HANDLE_PRINTER_INDEPENDENT_LAYOUT
+ // #i33095#
+ ,HANDLE_LOAD_READONLY, HANDLE_MODIFY_PASSWD, HANDLE_SAVE_VERSION
+ ,HANDLE_SLIDESPERHANDOUT, HANDLE_HANDOUTHORIZONTAL,
+ HANDLE_EMBED_FONTS, HANDLE_EMBED_USED_FONTS,
+ HANDLE_EMBED_LATIN_SCRIPT_FONTS, HANDLE_EMBED_ASIAN_SCRIPT_FONTS, HANDLE_EMBED_COMPLEX_SCRIPT_FONTS,
+ HANDLE_IMAGE_PREFERRED_DPI
+};
+
+}
+
+#define MID_PRINTER 1
+
+ static rtl::Reference<PropertySetInfo> createSettingsInfoImpl( bool bIsDraw )
+ {
+ static PropertyMapEntry const aImpressSettingsInfoMap[] =
+ {
+ { OUString("IsPrintDrawing"), HANDLE_PRINTDRAWING, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ { OUString("IsPrintNotes"), HANDLE_PRINTNOTES, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ { OUString("IsPrintHandout"), HANDLE_PRINTHANDOUT, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ { OUString("IsPrintOutline"), HANDLE_PRINTOUTLINE, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ { OUString("SlidesPerHandout"), HANDLE_SLIDESPERHANDOUT, ::cppu::UnoType<sal_Int16>::get(), 0, MID_PRINTER },
+ { OUString("HandoutsHorizontal"), HANDLE_HANDOUTHORIZONTAL, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ };
+
+ static PropertyMapEntry const aDrawSettingsInfoMap[] =
+ {
+ { OUString("MeasureUnit"), HANDLE_MEASUREUNIT, ::cppu::UnoType<sal_Int16>::get(), 0, 0 },
+ { OUString("ScaleNumerator"), HANDLE_SCALE_NUM, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
+ { OUString("ScaleDenominator"), HANDLE_SCALE_DOM, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
+ };
+
+ static PropertyMapEntry const aCommonSettingsInfoMap[] =
+ {
+ { OUString("DefaultTabStop"), HANDLE_TABSTOP, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
+ { OUString("PrinterName"), HANDLE_PRINTERNAME, ::cppu::UnoType<OUString>::get(), 0, 0 },
+ { OUString("PrinterSetup"), HANDLE_PRINTERJOB, cppu::UnoType<uno::Sequence < sal_Int8 >>::get(), 0, MID_PRINTER },
+ { OUString("PrinterPaperFromSetup"), HANDLE_PRINTERPAPERSIZE, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+
+ { OUString("IsPrintPageName"), HANDLE_PRINTPAGENAME, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ { OUString("IsPrintDate"), HANDLE_PRINTDATE, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ { OUString("IsPrintTime"), HANDLE_PRINTTIME, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ { OUString("IsPrintHiddenPages"), HANDLE_PRINTHIDDENPAGES, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ { OUString("IsPrintFitPage"), HANDLE_PRINTFITPAGE, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ { OUString("IsPrintTilePage"), HANDLE_PRINTTILEPAGE, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ { OUString("IsPrintBooklet"), HANDLE_PRINTBOOKLET, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ { OUString("IsPrintBookletFront"), HANDLE_PRINTBOOKLETFRONT, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ { OUString("IsPrintBookletBack"), HANDLE_PRINTBOOKLETBACK, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
+ { OUString("PrintQuality"), HANDLE_PRINTQUALITY, ::cppu::UnoType<sal_Int32>::get(), 0, MID_PRINTER },
+ { OUString("ColorTableURL"), HANDLE_COLORTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
+ { OUString("DashTableURL"), HANDLE_DASHTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
+ { OUString("LineEndTableURL"), HANDLE_LINEENDTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
+ { OUString("HatchTableURL"), HANDLE_HATCHTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
+ { OUString("GradientTableURL"), HANDLE_GRADIENTTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
+ { OUString("BitmapTableURL"), HANDLE_BITMAPTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
+
+ { OUString("ForbiddenCharacters"), HANDLE_FORBIDDENCHARS, cppu::UnoType<XForbiddenCharacters>::get(), 0, 0 },
+ { OUString("ApplyUserData"), HANDLE_APPLYUSERDATA, cppu::UnoType<bool>::get(), 0, 0 },
+ { OUString("SaveThumbnail"), HANDLE_SAVETHUMBNAIL, cppu::UnoType<bool>::get(), 0, 0 },
+
+ { OUString("PageNumberFormat"), HANDLE_PAGENUMFMT, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
+ { OUString("ParagraphSummation"), HANDLE_PARAGRAPHSUMMATION, cppu::UnoType<bool>::get(), 0, 0 },
+ { OUString("CharacterCompressionType"),HANDLE_CHARCOMPRESS, ::cppu::UnoType<sal_Int16>::get(), 0, 0 },
+ { OUString("IsKernAsianPunctuation"),HANDLE_ASIANPUNCT, cppu::UnoType<bool>::get(), 0, 0 },
+ { OUString("UpdateFromTemplate"), HANDLE_UPDATEFROMTEMPLATE, cppu::UnoType<bool>::get(), 0, 0 },
+ { OUString("PrinterIndependentLayout"),HANDLE_PRINTER_INDEPENDENT_LAYOUT,::cppu::UnoType<sal_Int16>::get(), 0, 0 },
+ // --> #i33095#
+ { OUString("LoadReadonly"), HANDLE_LOAD_READONLY, cppu::UnoType<bool>::get(), 0, 0 },
+ { OUString("ModifyPasswordInfo"), HANDLE_MODIFY_PASSWD, cppu::UnoType<uno::Sequence < beans::PropertyValue >>::get(), 0, 0 },
+ { OUString("SaveVersionOnClose"), HANDLE_SAVE_VERSION, cppu::UnoType<bool>::get(), 0, 0 },
+ { OUString("EmbedFonts"), HANDLE_EMBED_FONTS, cppu::UnoType<bool>::get(), 0, 0 },
+ { OUString("EmbedOnlyUsedFonts"), HANDLE_EMBED_USED_FONTS, cppu::UnoType<bool>::get(), 0, 0 },
+ { OUString("EmbedLatinScriptFonts"), HANDLE_EMBED_LATIN_SCRIPT_FONTS, cppu::UnoType<bool>::get(), 0, 0 },
+ { OUString("EmbedAsianScriptFonts"), HANDLE_EMBED_ASIAN_SCRIPT_FONTS, cppu::UnoType<bool>::get(), 0, 0 },
+ { OUString("EmbedComplexScriptFonts"), HANDLE_EMBED_COMPLEX_SCRIPT_FONTS, cppu::UnoType<bool>::get(), 0, 0 },
+ { OUString("ImagePreferredDPI"), HANDLE_IMAGE_PREFERRED_DPI, cppu::UnoType<sal_Int32>::get(), 0, 0 },
+ };
+
+ rtl::Reference<PropertySetInfo> xInfo = new PropertySetInfo( aCommonSettingsInfoMap );
+ if (bIsDraw)
+ xInfo->add( aDrawSettingsInfoMap );
+ else
+ xInfo->add( aImpressSettingsInfoMap );
+
+ return xInfo;
+ }
+}
+
+using namespace ::sd;
+
+DocumentSettings::DocumentSettings( SdXImpressDocument* pModel )
+: PropertySetHelper( createSettingsInfoImpl( !pModel->IsImpressDocument() ) ),
+ mxModel( pModel )
+{
+}
+
+bool DocumentSettings::LoadList( XPropertyListType t, const OUString &rInPath,
+ const OUString &rReferer,
+ const uno::Reference< embed::XStorage > &xStorage )
+{
+ SdDrawDocument* pDoc = mxModel->GetDoc();
+
+ sal_Int32 nSlash = rInPath.lastIndexOf('/');
+ OUString aPath, aName;
+ if (nSlash < 0)
+ aName = rInPath;
+ else {
+ aName = rInPath.copy( nSlash + 1 );
+ aPath = rInPath.copy( 0, nSlash );
+ }
+
+ XPropertyListRef pList = XPropertyList::CreatePropertyList(
+ t, aPath, rReferer );
+ pList->SetName( aName );
+
+ if( pList->LoadFrom( xStorage, rInPath, rReferer ) )
+ {
+ pDoc->SetPropertyList( pList );
+ return true;
+ }
+
+ return false;
+}
+
+void DocumentSettings::AssignURL( XPropertyListType t, const Any* pValue,
+ bool *pOk, bool *pChanged )
+{
+ OUString aURL;
+ if( !( *pValue >>= aURL ) )
+ return;
+
+ if( LoadList( t, aURL, ""/*TODO?*/, uno::Reference< embed::XStorage >() ) )
+ *pOk = *pChanged = true;
+}
+
+struct {
+ const char *pName;
+ XPropertyListType t;
+} const aURLPropertyNames[] = {
+ { "ColorTableURL", XPropertyListType::Color },
+ { "DashTableURL", XPropertyListType::Dash },
+ { "LineEndTableURL", XPropertyListType::LineEnd },
+ { "HatchTableURL", XPropertyListType::Hatch },
+ { "GradientTableURL", XPropertyListType::Gradient },
+ { "BitmapTableURL", XPropertyListType::Bitmap }
+};
+
+static XPropertyListType getTypeOfName( std::u16string_view aName )
+{
+ for(const auto & rURLPropertyName : aURLPropertyNames) {
+ if( o3tl::equalsAscii( aName, rURLPropertyName.pName ) )
+ return rURLPropertyName.t;
+ }
+ return XPropertyListType::Unknown;
+}
+
+static OUString getNameOfType( XPropertyListType t )
+{
+ for(const auto & rURLPropertyName : aURLPropertyNames) {
+ if( t == rURLPropertyName.t )
+ return OUString( rURLPropertyName.pName,
+ strlen( rURLPropertyName.pName ) - 3,
+ RTL_TEXTENCODING_ASCII_US );
+ }
+ return OUString();
+}
+
+uno::Sequence<beans::PropertyValue>
+ DocumentSettings::filterStreamsFromStorage(
+ OUString const & referer,
+ const uno::Reference< embed::XStorage > &xStorage,
+ const uno::Sequence<beans::PropertyValue>& aConfigProps )
+{
+ uno::Sequence<beans::PropertyValue> aRet( aConfigProps.getLength() );
+ auto aRetRange = asNonConstRange(aRet);
+ int nRet = 0;
+ for( const auto& rConfigProp : aConfigProps )
+ {
+ XPropertyListType t = getTypeOfName( rConfigProp.Name );
+ if (t == XPropertyListType::Unknown)
+ aRetRange[nRet++] = rConfigProp;
+ else
+ {
+ OUString aURL;
+ rConfigProp.Value >>= aURL;
+ LoadList( t, aURL, referer, xStorage );
+ }
+ }
+ aRet.realloc( nRet );
+ return aRet;
+}
+
+uno::Sequence<beans::PropertyValue>
+ DocumentSettings::filterStreamsToStorage(
+ const uno::Reference< embed::XStorage > &xStorage,
+ const uno::Sequence<beans::PropertyValue>& aConfigProps )
+{
+ uno::Sequence<beans::PropertyValue> aRet( aConfigProps.getLength() );
+
+ bool bHasEmbed = false;
+ SdDrawDocument* pDoc = mxModel->GetDoc();
+ for( size_t i = 0; i < SAL_N_ELEMENTS( aURLPropertyNames ); i++ )
+ {
+ const XPropertyListRef& pList = pDoc->GetPropertyList( static_cast<XPropertyListType>(i) );
+ bHasEmbed = pList.is() && pList->IsEmbedInDocument();
+ if( bHasEmbed )
+ break;
+ }
+ if( !bHasEmbed )
+ return aConfigProps;
+
+ try {
+ // create Settings/ sub storage.
+ uno::Reference< embed::XStorage > xSubStorage = xStorage->openStorageElement( "Settings" ,
+ embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE );
+ if( !xSubStorage.is() )
+ return aRet;
+
+ auto aRetRange = asNonConstRange(aRet);
+ // now populate it
+ for( sal_Int32 i = 0; i < aConfigProps.getLength(); i++ )
+ {
+ XPropertyListType t = getTypeOfName( aConfigProps[i].Name );
+ aRetRange[i] = aConfigProps[i];
+ if (t != XPropertyListType::Unknown) {
+ const XPropertyListRef& pList = pDoc->GetPropertyList( t );
+ if( !pList.is() || !pList->IsEmbedInDocument() )
+ continue; // no change ...
+ else
+ {
+ // Such specific path construction is grim.
+
+ OUString aName( getNameOfType( t ) );
+ OUString aResult;
+ if( pList->SaveTo( xSubStorage, aName, &aResult ) )
+ {
+ OUString aRealPath = "Settings/" + aResult;
+ aRetRange[i].Value <<= aRealPath;
+ }
+ }
+ }
+ }
+
+ // surprisingly difficult to make it really exist
+ uno::Reference< embed::XTransactedObject > xTrans( xSubStorage, UNO_QUERY );
+ if( xTrans.is() )
+ xTrans->commit();
+ if( xSubStorage.is() )
+ xSubStorage->dispose();
+ } catch (const uno::Exception &) {
+// fprintf (stderr, "saving etc. exception '%s'\n",
+// OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr());
+ }
+
+ return aRet;
+}
+
+// Most of the code reading/writing UNO document settings is the same in
+// sd, sc and sw and it is mostly copy-pasted back and forth.
+// TODO: Move _setPropertyValues and _getPropertyValues to some shared
+// place, at least for the settings that are common to sd, sc and sw
+void
+DocumentSettings::_setPropertyValues(const PropertyMapEntry** ppEntries,
+ const Any* pValues)
+{
+ ::SolarMutexGuard aGuard;
+
+ SdDrawDocument* pDoc = mxModel->GetDoc();
+ ::sd::DrawDocShell* pDocSh = mxModel->GetDocShell();
+ if( nullptr == pDoc || nullptr == pDocSh )
+ {
+ throw RuntimeException("Document or Shell missing",
+ static_cast<OWeakObject *>(this));
+ }
+
+ bool bValue = false;
+ bool bOk, bChanged = false, bOptionsChanged = false;
+
+ SdOptionsPrintItem aOptionsPrintItem;
+
+ VclPtr<SfxPrinter> pPrinter = pDocSh->GetPrinter( false );
+ if( pPrinter )
+ {
+ SdOptionsPrintItem const * pPrinterOptions = pPrinter->GetOptions().GetItemIfSet( ATTR_OPTIONS_PRINT, false );
+ if(pPrinterOptions)
+ aOptionsPrintItem.GetOptionsPrint() = pPrinterOptions->GetOptionsPrint();
+ }
+ else
+ {
+ aOptionsPrintItem.SetOptions( SD_MOD()->GetSdOptions(pDoc->GetDocumentType()) );
+ }
+ SdOptionsPrint& aPrintOpts = aOptionsPrintItem.GetOptionsPrint();
+
+ for( ; *ppEntries; ppEntries++, pValues++ )
+ {
+ bOk = false;
+
+ switch( (*ppEntries)->mnHandle )
+ {
+ case HANDLE_COLORTABLEURL:
+ AssignURL( XPropertyListType::Color, pValues, &bOk, &bChanged );
+ break;
+
+ case HANDLE_DASHTABLEURL:
+ AssignURL( XPropertyListType::Dash, pValues, &bOk, &bChanged );
+ break;
+
+ case HANDLE_LINEENDTABLEURL:
+ AssignURL( XPropertyListType::LineEnd, pValues, &bOk, &bChanged );
+ break;
+
+ case HANDLE_HATCHTABLEURL:
+ AssignURL( XPropertyListType::Hatch, pValues, &bOk, &bChanged );
+ break;
+
+ case HANDLE_GRADIENTTABLEURL:
+ AssignURL( XPropertyListType::Gradient, pValues, &bOk, &bChanged );
+ break;
+
+ case HANDLE_BITMAPTABLEURL:
+ AssignURL( XPropertyListType::Bitmap, pValues, &bOk, &bChanged );
+ break;
+
+ case HANDLE_FORBIDDENCHARS:
+ bOk = true;
+ break;
+
+ case HANDLE_APPLYUSERDATA:
+ {
+ bool bApplyUserData = false;
+ if( *pValues >>= bApplyUserData )
+ {
+ bChanged = ( bApplyUserData != pDocSh->IsUseUserData() );
+ pDocSh->SetUseUserData( bApplyUserData );
+ bOk = true;
+ }
+ }
+ break;
+ case HANDLE_SAVETHUMBNAIL:
+ {
+ bool bSaveThumbnail = false;
+ if (*pValues >>= bSaveThumbnail)
+ {
+ bChanged = (bSaveThumbnail != pDocSh->IsUseThumbnailSave());
+ pDocSh->SetUseThumbnailSave(bSaveThumbnail);
+ bOk = true;
+ }
+ }
+ break;
+
+ case HANDLE_PRINTDRAWING:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsDraw() != bValue )
+ {
+ aPrintOpts.SetDraw( bValue );
+ bOptionsChanged = true;
+ }
+
+ bOk = true;
+ }
+ break;
+ case HANDLE_PRINTNOTES:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsNotes() != bValue )
+ {
+ aPrintOpts.SetNotes( bValue );
+ bOptionsChanged = true;
+ }
+
+ bOk = true;
+ }
+ break;
+ case HANDLE_PRINTHANDOUT:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsHandout() != bValue)
+ {
+ aPrintOpts.SetHandout( bValue );
+ bOptionsChanged = true;
+ }
+
+ bOk = true;
+ }
+ break;
+ case HANDLE_PRINTOUTLINE:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsOutline() != bValue)
+ {
+ aPrintOpts.SetOutline( bValue );
+ bOptionsChanged = true;
+ }
+ bOk = true;
+ }
+ break;
+ case HANDLE_SLIDESPERHANDOUT:
+ {
+ sal_Int16 nValue = 0;
+ if( (*pValues >>= nValue) && (nValue >= 1) && (nValue <= 9) )
+ {
+ if( static_cast<sal_Int16>( aPrintOpts.GetHandoutPages() ) != nValue )
+ {
+ aPrintOpts.SetHandoutPages( static_cast< sal_uInt16 >( nValue ) );
+ bOptionsChanged = true;
+ }
+ bOk = true;
+ }
+ }
+ break;
+ case HANDLE_HANDOUTHORIZONTAL:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsHandoutHorizontal() != bValue )
+ {
+ aPrintOpts.SetHandoutHorizontal( bValue );
+ bOptionsChanged = true;
+ }
+ bOk = true;
+ }
+ break;
+
+ case HANDLE_PRINTPAGENAME:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsPagename() != bValue)
+ {
+ aPrintOpts.SetPagename( bValue );
+ bOptionsChanged = true;
+ }
+ bOk = true;
+ }
+ break;
+ case HANDLE_PRINTDATE:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsDate() != bValue)
+ {
+ aPrintOpts.SetDate( bValue );
+ bOptionsChanged = true;
+ }
+ bOk = true;
+ }
+ break;
+ case HANDLE_PRINTTIME:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsDate() != bValue)
+ {
+ aPrintOpts.SetTime( bValue );
+ bOptionsChanged = true;
+ }
+ bOk = true;
+ }
+ break;
+ case HANDLE_PRINTHIDDENPAGES:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsHiddenPages() != bValue)
+ {
+ aPrintOpts.SetHiddenPages( bValue );
+ bOptionsChanged = true;
+ }
+ bOk = true;
+ }
+ break;
+ case HANDLE_PRINTFITPAGE:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsPagesize() != bValue)
+ {
+ aPrintOpts.SetPagesize( bValue );
+ bOptionsChanged = true;
+ }
+ bOk = true;
+ }
+ break;
+ case HANDLE_PRINTTILEPAGE:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsPagetile() != bValue)
+ {
+ aPrintOpts.SetPagetile( bValue );
+ bOptionsChanged = true;
+ }
+ bOk = true;
+ }
+ break;
+ case HANDLE_PRINTBOOKLET:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsBooklet() != bValue)
+ {
+ aPrintOpts.SetBooklet( bValue );
+ bOptionsChanged = true;
+ }
+ bOk = true;
+ }
+ break;
+ case HANDLE_PRINTBOOKLETFRONT:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsFrontPage() != bValue)
+ {
+ aPrintOpts.SetFrontPage( bValue );
+ bOptionsChanged = true;
+ }
+ bOk = true;
+ }
+ break;
+ case HANDLE_PRINTBOOKLETBACK:
+ if( *pValues >>= bValue )
+ {
+ if( aPrintOpts.IsBackPage() != bValue)
+ {
+ aPrintOpts.SetBackPage( bValue );
+ bOptionsChanged = true;
+ }
+ bOk = true;
+ }
+ break;
+ case HANDLE_PRINTQUALITY:
+ {
+ sal_Int32 nValue = 0;
+ if( *pValues >>= nValue )
+ {
+ if( aPrintOpts.GetOutputQuality() != nValue)
+ {
+ aPrintOpts.SetOutputQuality( static_cast<sal_uInt16>(nValue) );
+ bOptionsChanged = true;
+ }
+ bOk = true;
+ }
+ }
+ break;
+ case HANDLE_MEASUREUNIT:
+ {
+ sal_Int16 nValue = 0;
+ if( *pValues >>= nValue )
+ {
+ FieldUnit nFieldUnit;
+ if( SvxMeasureUnitToFieldUnit( nValue, nFieldUnit ) )
+ {
+ pDoc->SetUIUnit( nFieldUnit );
+ bOk = true;
+ }
+ }
+ }
+ break;
+ case HANDLE_SCALE_NUM:
+ {
+ sal_Int32 nValue = 0;
+ if( *pValues >>= nValue )
+ {
+ Fraction aFract( nValue, pDoc->GetUIScale().GetDenominator() );
+ pDoc->SetUIScale( aFract );
+ bOk = true;
+ bChanged = true;
+ }
+ }
+ break;
+ case HANDLE_SCALE_DOM:
+ {
+ sal_Int32 nValue = 0;
+ if( *pValues >>= nValue )
+ {
+ auto nNumerator = pDoc->GetUIScale().GetNumerator();
+ assert(nNumerator != 0);
+ Fraction aFract(nNumerator, nValue);
+ pDoc->SetUIScale( aFract );
+ bOk = true;
+ bChanged = true;
+ }
+ }
+ break;
+
+ case HANDLE_TABSTOP:
+ {
+ sal_Int32 nValue = 0;
+ if( (*pValues >>= nValue) && (nValue >= 0) )
+ {
+ pDoc->SetDefaultTabulator(static_cast<sal_uInt16>(nValue));
+ bOk = true;
+ bChanged = true;
+ }
+ }
+ break;
+ case HANDLE_PAGENUMFMT:
+ {
+ sal_Int32 nValue = 0;
+ if( (*pValues >>= nValue ) && (nValue >= css::style::NumberingType::CHARS_UPPER_LETTER ) && (nValue <= css::style::NumberingType::PAGE_DESCRIPTOR) )
+ {
+ pDoc->SetPageNumType(static_cast<SvxNumType>(nValue));
+ bOk = true;
+ bChanged = true;
+ }
+ }
+ break;
+ case HANDLE_PRINTERNAME:
+ {
+ OUString aPrinterName;
+ if( *pValues >>= aPrinterName )
+ {
+ bOk = true;
+ if( !aPrinterName.isEmpty() && pDocSh->GetCreateMode() != SfxObjectCreateMode::EMBEDDED )
+ {
+ SfxPrinter *pTempPrinter = pDocSh->GetPrinter( true );
+ if (pTempPrinter)
+ {
+ VclPtr<SfxPrinter> pNewPrinter = VclPtr<SfxPrinter>::Create( pTempPrinter->GetOptions().Clone(), aPrinterName );
+ pDocSh->SetPrinter( pNewPrinter );
+ }
+ }
+ }
+ }
+ break;
+ case HANDLE_PRINTERJOB:
+ {
+ Sequence < sal_Int8 > aSequence;
+ if ( *pValues >>= aSequence )
+ {
+ bOk = true;
+ sal_uInt32 nSize = aSequence.getLength();
+ if( nSize )
+ {
+ SvMemoryStream aStream (aSequence.getArray(), nSize, StreamMode::READ );
+ aStream.Seek ( STREAM_SEEK_TO_BEGIN );
+ std::unique_ptr<SfxItemSet> pItemSet;
+
+ bool bPreferPrinterPapersize = false;
+ if( pPrinter )
+ {
+ pItemSet = pPrinter->GetOptions().Clone();
+ bPreferPrinterPapersize = pPrinter->GetPrinterSettingsPreferred();
+ }
+ else
+ {
+ pItemSet = std::make_unique<SfxItemSetFixed
+ <SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN,
+ SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC,
+ ATTR_OPTIONS_PRINT, ATTR_OPTIONS_PRINT>>(pDoc->GetPool());
+ }
+
+ pPrinter = SfxPrinter::Create ( aStream, std::move(pItemSet) );
+ pPrinter->SetPrinterSettingsPreferred( bPreferPrinterPapersize );
+
+ MapMode aMM (pPrinter->GetMapMode());
+ aMM.SetMapUnit(MapUnit::Map100thMM);
+ pPrinter->SetMapMode(aMM);
+
+ pDocSh->SetPrinter( pPrinter );
+
+ pPrinter = nullptr;
+ }
+ }
+ }
+ break;
+
+ case HANDLE_PRINTERPAPERSIZE:
+ {
+ bool bPreferPrinterPapersize;
+ if( *pValues >>= bPreferPrinterPapersize )
+ {
+ bOk = true;
+ if( pDocSh->GetCreateMode() != SfxObjectCreateMode::EMBEDDED )
+ {
+ SfxPrinter *pTempPrinter = pDocSh->GetPrinter( true );
+ if (pTempPrinter)
+ pTempPrinter->SetPrinterSettingsPreferred( bPreferPrinterPapersize );
+ }
+ }
+ }
+ break;
+
+ case HANDLE_PARAGRAPHSUMMATION :
+ {
+ bool bIsSummationOfParagraphs = false;
+ if ( *pValues >>= bIsSummationOfParagraphs )
+ {
+ bOk = true;
+ bChanged = true;
+ if ( pDoc->GetDocumentType() == DocumentType::Impress )
+ {
+ EEControlBits nSum = bIsSummationOfParagraphs ? EEControlBits::ULSPACESUMMATION : EEControlBits::NONE;
+ EEControlBits nCntrl;
+
+ pDoc->SetSummationOfParagraphs( bIsSummationOfParagraphs );
+ SdDrawDocument* pDocument = pDocSh->GetDoc();
+ SdrOutliner& rOutl = pDocument->GetDrawOutliner();
+ nCntrl = rOutl.GetControlWord() &~ EEControlBits::ULSPACESUMMATION;
+ rOutl.SetControlWord( nCntrl | nSum );
+ SdOutliner* pOutl = pDocument->GetOutliner( false );
+ if( pOutl )
+ {
+ nCntrl = pOutl->GetControlWord() &~ EEControlBits::ULSPACESUMMATION;
+ pOutl->SetControlWord( nCntrl | nSum );
+ }
+ pOutl = pDocument->GetInternalOutliner( false );
+ if( pOutl )
+ {
+ nCntrl = pOutl->GetControlWord() &~ EEControlBits::ULSPACESUMMATION;
+ pOutl->SetControlWord( nCntrl | nSum );
+ }
+ }
+ }
+ }
+ break;
+
+ case HANDLE_CHARCOMPRESS:
+ {
+ sal_Int16 nCharCompressType = 0;
+ if( *pValues >>= nCharCompressType )
+ {
+ bOk = true;
+
+ pDoc->SetCharCompressType( static_cast<CharCompressType>(nCharCompressType) );
+ SdDrawDocument* pDocument = pDocSh->GetDoc();
+ SdrOutliner& rOutl = pDocument->GetDrawOutliner();
+ rOutl.SetAsianCompressionMode( static_cast<CharCompressType>(nCharCompressType) );
+ SdOutliner* pOutl = pDocument->GetOutliner( false );
+ if( pOutl )
+ {
+ pOutl->SetAsianCompressionMode( static_cast<CharCompressType>(nCharCompressType) );
+ }
+ pOutl = pDocument->GetInternalOutliner( false );
+ if( pOutl )
+ {
+ pOutl->SetAsianCompressionMode( static_cast<CharCompressType>(nCharCompressType) );
+ }
+ }
+ break;
+
+ }
+ case HANDLE_ASIANPUNCT:
+ {
+ bool bAsianPunct = false;
+ if( *pValues >>= bAsianPunct )
+ {
+ bOk = true;
+
+ pDoc->SetKernAsianPunctuation( bAsianPunct );
+ SdDrawDocument* pDocument = pDocSh->GetDoc();
+ SdrOutliner& rOutl = pDocument->GetDrawOutliner();
+ rOutl.SetKernAsianPunctuation( bAsianPunct );
+ SdOutliner* pOutl = pDocument->GetOutliner( false );
+ if( pOutl )
+ {
+ pOutl->SetKernAsianPunctuation( bAsianPunct );
+ }
+ pOutl = pDocument->GetInternalOutliner( false );
+ if( pOutl )
+ {
+ pOutl->SetKernAsianPunctuation( bAsianPunct );
+ }
+ }
+ break;
+
+ }
+ case HANDLE_UPDATEFROMTEMPLATE:
+ {
+ bool value = false;
+ if( *pValues >>= value )
+ {
+ bChanged = ( value != pDocSh->IsQueryLoadTemplate() );
+ pDocSh->SetQueryLoadTemplate( value );
+ bOk = true;
+ }
+ }
+ break;
+
+ case HANDLE_PRINTER_INDEPENDENT_LAYOUT:
+ {
+ // Just propagate the new printer independent layout mode to
+ // the document and determine it really differs from the old
+ // one.
+ sal_Int16 nOldValue =
+ static_cast<sal_Int16>(pDoc->GetPrinterIndependentLayout ());
+ sal_Int16 nValue = 0;
+ if (*pValues >>= nValue)
+ {
+ pDoc->SetPrinterIndependentLayout (nValue);
+ bChanged = (nValue != nOldValue);
+ bOk = true;
+ }
+ }
+ break;
+
+ // --> #i33095#
+ case HANDLE_LOAD_READONLY:
+ {
+ bool bNewValue = false;
+ if ( *pValues >>= bNewValue )
+ {
+ bChanged = ( pDocSh->IsLoadReadonly() != bNewValue );
+ pDocSh->SetLoadReadonly( bNewValue );
+ bOk = true;
+ }
+ }
+ break;
+
+ case HANDLE_MODIFY_PASSWD:
+ {
+ uno::Sequence< beans::PropertyValue > aInfo;
+ if ( !( *pValues >>= aInfo ) )
+ throw lang::IllegalArgumentException(
+ "Value of type Sequence<PropertyValue> expected!",
+ uno::Reference< uno::XInterface >(),
+ 2 );
+
+ if ( !pDocSh->SetModifyPasswordInfo( aInfo ) )
+ throw beans::PropertyVetoException(
+ "The hash is not allowed to be changed now!" );
+
+ bOk = true
+;
+
+ }
+ break;
+
+ case HANDLE_SAVE_VERSION:
+ {
+ bool bNewValue = false;
+ if ( *pValues >>= bNewValue )
+ {
+ bChanged = ( pDocSh->IsSaveVersionOnClose() != bNewValue );
+ pDocSh->SetSaveVersionOnClose( bNewValue );
+ bOk = true;
+ }
+ }
+ break;
+
+ case HANDLE_EMBED_FONTS:
+ {
+ if (pValues->has<bool>())
+ {
+ bool bNewValue = pValues->get<bool>();
+ bChanged = (pDoc->IsEmbedFonts() != bNewValue);
+ pDoc->SetEmbedFonts(bNewValue);
+ bOk = true;
+ }
+ }
+ break;
+
+ case HANDLE_EMBED_USED_FONTS:
+ {
+ if (pValues->has<bool>())
+ {
+ bool bNewValue = pValues->get<bool>();
+ bChanged = (pDoc->IsEmbedUsedFontsOnly() != bNewValue);
+ pDoc->SetEmbedUsedFontsOnly(bNewValue);
+ bOk = true;
+ }
+ }
+ break;
+
+ case HANDLE_EMBED_LATIN_SCRIPT_FONTS:
+ {
+ if (pValues->has<bool>())
+ {
+ bool bNewValue = pValues->get<bool>();
+ bChanged = (pDoc->IsEmbedFontScriptLatin() != bNewValue);
+ pDoc->SetEmbedFontScriptLatin(bNewValue);
+ bOk = true;
+ }
+ }
+ break;
+
+ case HANDLE_EMBED_ASIAN_SCRIPT_FONTS:
+ {
+ if (pValues->has<bool>())
+ {
+ bool bNewValue = pValues->get<bool>();
+ bChanged = (pDoc->IsEmbedFontScriptAsian() != bNewValue);
+ pDoc->SetEmbedFontScriptAsian(bNewValue);
+ bOk = true;
+ }
+ }
+ break;
+
+ case HANDLE_EMBED_COMPLEX_SCRIPT_FONTS:
+ {
+ if (pValues->has<bool>())
+ {
+ bool bNewValue = pValues->get<bool>();
+ bChanged = (pDoc->IsEmbedFontScriptComplex() != bNewValue);
+ pDoc->SetEmbedFontScriptComplex(bNewValue);
+ bOk = true;
+ }
+ }
+ break;
+
+ case HANDLE_IMAGE_PREFERRED_DPI:
+ {
+ if (pValues->has<sal_Int32>())
+ {
+ auto nNewValue = pValues->get<sal_Int32>();
+ bChanged = (pDoc->getImagePreferredDPI() != nNewValue);
+ pDoc->setImagePreferredDPI(nNewValue);
+ bOk = true;
+ }
+ }
+ break;
+
+ default:
+ throw UnknownPropertyException( OUString::number((*ppEntries)->mnHandle), static_cast<cppu::OWeakObject*>(this));
+ }
+
+ if( !bOk )
+ throw IllegalArgumentException();
+ }
+
+ if( bOptionsChanged )
+ {
+ if( !pPrinter )
+ pPrinter = pDocSh->GetPrinter( true );
+ SfxItemSet aNewOptions( pPrinter->GetOptions() );
+ aNewOptions.Put( aOptionsPrintItem );
+ pPrinter->SetOptions( aNewOptions );
+ }
+
+ if( bChanged || bOptionsChanged )
+ mxModel->SetModified();
+}
+
+void DocumentSettings::ExtractURL( XPropertyListType t, Any* pValue )
+{
+ XPropertyListRef pList = mxModel->GetDoc()->GetPropertyList( t );
+ if( !pList.is() )
+ return;
+
+ INetURLObject aPathURL( pList->GetPath() );
+ aPathURL.insertName( pList->GetName() );
+ aPathURL.setExtension( pList->GetDefaultExt() );
+ OUString aPath( aPathURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
+ *pValue <<= aPath;
+}
+
+void
+DocumentSettings::_getPropertyValues(
+ const PropertyMapEntry** ppEntries, Any* pValue)
+{
+ ::SolarMutexGuard aGuard;
+
+ SdDrawDocument* pDoc = mxModel->GetDoc();
+ ::sd::DrawDocShell* pDocSh = mxModel->GetDocShell();
+ if( nullptr == pDoc || nullptr == pDocSh )
+ {
+ throw RuntimeException("Document or Shell missing",
+ static_cast<OWeakObject *>(this));
+ }
+
+ SdOptionsPrintItem aOptionsPrintItem;
+
+ SfxPrinter* pPrinter = pDocSh->GetPrinter( false );
+ if( pPrinter )
+ {
+ SdOptionsPrintItem const * pPrinterOptions = pPrinter->GetOptions().GetItemIfSet( ATTR_OPTIONS_PRINT, false );
+ if (pPrinterOptions)
+ aOptionsPrintItem.GetOptionsPrint() = pPrinterOptions->GetOptionsPrint();
+ }
+ else
+ {
+ aOptionsPrintItem.SetOptions( SD_MOD()->GetSdOptions(pDoc->GetDocumentType()) );
+ }
+ SdOptionsPrint& aPrintOpts = aOptionsPrintItem.GetOptionsPrint();
+
+ for( ; *ppEntries; ppEntries++, pValue++ )
+ {
+ switch( (*ppEntries)->mnHandle )
+ {
+ case HANDLE_COLORTABLEURL:
+ ExtractURL( XPropertyListType::Color, pValue );
+ break;
+ case HANDLE_DASHTABLEURL:
+ ExtractURL( XPropertyListType::Dash, pValue );
+ break;
+ case HANDLE_LINEENDTABLEURL:
+ ExtractURL( XPropertyListType::LineEnd, pValue );
+ break;
+ case HANDLE_HATCHTABLEURL:
+ ExtractURL( XPropertyListType::Hatch, pValue );
+ break;
+ case HANDLE_GRADIENTTABLEURL:
+ ExtractURL( XPropertyListType::Gradient, pValue );
+ break;
+ case HANDLE_BITMAPTABLEURL:
+ ExtractURL( XPropertyListType::Bitmap, pValue );
+ break;
+ case HANDLE_FORBIDDENCHARS:
+ *pValue <<= mxModel->getForbiddenCharsTable();
+ break;
+ case HANDLE_APPLYUSERDATA:
+ *pValue <<= pDocSh->IsUseUserData();
+ break;
+ case HANDLE_SAVETHUMBNAIL:
+ *pValue <<= pDocSh->IsUseThumbnailSave();
+ break;
+ case HANDLE_PRINTDRAWING:
+ *pValue <<= aPrintOpts.IsDraw();
+ break;
+ case HANDLE_PRINTNOTES:
+ *pValue <<= aPrintOpts.IsNotes();
+ break;
+ case HANDLE_PRINTHANDOUT:
+ *pValue <<= aPrintOpts.IsHandout();
+ break;
+ case HANDLE_PRINTOUTLINE:
+ *pValue <<= aPrintOpts.IsOutline();
+ break;
+ case HANDLE_SLIDESPERHANDOUT:
+ *pValue <<= static_cast<sal_Int16>(aPrintOpts.GetHandoutPages());
+ break;
+ case HANDLE_HANDOUTHORIZONTAL:
+ *pValue <<= aPrintOpts.IsHandoutHorizontal();
+ break;
+ case HANDLE_PRINTPAGENAME:
+ *pValue <<= aPrintOpts.IsPagename();
+ break;
+ case HANDLE_PRINTDATE:
+ *pValue <<= aPrintOpts.IsDate();
+ break;
+ case HANDLE_PRINTTIME:
+ *pValue <<= aPrintOpts.IsTime();
+ break;
+ case HANDLE_PRINTHIDDENPAGES:
+ *pValue <<= aPrintOpts.IsHiddenPages();
+ break;
+ case HANDLE_PRINTFITPAGE:
+ *pValue <<= aPrintOpts.IsPagesize();
+ break;
+ case HANDLE_PRINTTILEPAGE:
+ *pValue <<= aPrintOpts.IsPagetile();
+ break;
+ case HANDLE_PRINTBOOKLET:
+ *pValue <<= aPrintOpts.IsBooklet();
+ break;
+ case HANDLE_PRINTBOOKLETFRONT:
+ *pValue <<= aPrintOpts.IsFrontPage();
+ break;
+ case HANDLE_PRINTBOOKLETBACK:
+ *pValue <<= aPrintOpts.IsBackPage();
+ break;
+ case HANDLE_PRINTQUALITY:
+ *pValue <<= static_cast<sal_Int32>(aPrintOpts.GetOutputQuality());
+ break;
+ case HANDLE_MEASUREUNIT:
+ {
+ short nMeasure;
+ SvxFieldUnitToMeasureUnit( pDoc->GetUIUnit(), nMeasure );
+ *pValue <<= static_cast<sal_Int16>(nMeasure);
+ }
+ break;
+ case HANDLE_SCALE_NUM:
+ *pValue <<= pDoc->GetUIScale().GetNumerator();
+ break;
+ case HANDLE_SCALE_DOM:
+ *pValue <<= pDoc->GetUIScale().GetDenominator();
+ break;
+ case HANDLE_TABSTOP:
+ *pValue <<= static_cast<sal_Int32>(pDoc->GetDefaultTabulator());
+ break;
+ case HANDLE_PAGENUMFMT:
+ *pValue <<= static_cast<sal_Int32>(pDoc->GetPageNumType());
+ break;
+ case HANDLE_PRINTERNAME:
+ {
+ SfxPrinter *pTempPrinter = pDocSh->GetPrinter( false );
+ *pValue <<= pTempPrinter ? pTempPrinter->GetName() : OUString();
+ }
+ break;
+ case HANDLE_PRINTERJOB:
+ {
+ SfxPrinter *pTempPrinter = pDocSh->GetPrinter( false );
+ if (pTempPrinter)
+ {
+ SvMemoryStream aStream;
+ pTempPrinter->Store( aStream );
+ *pValue <<= Sequence< sal_Int8 >( static_cast< const sal_Int8* >( aStream.GetData() ),
+ aStream.TellEnd() );
+ }
+ else
+ {
+ Sequence < sal_Int8 > aSequence;
+ *pValue <<= aSequence;
+ }
+ }
+ break;
+
+ case HANDLE_PRINTERPAPERSIZE:
+ {
+ SfxPrinter *pTempPrinter = pDocSh->GetPrinter( false );
+ *pValue <<= pTempPrinter && pTempPrinter->GetPrinterSettingsPreferred();
+ }
+ break;
+
+ case HANDLE_PARAGRAPHSUMMATION :
+ {
+ bool bIsSummationOfParagraphs = pDoc->IsSummationOfParagraphs();
+ *pValue <<= bIsSummationOfParagraphs;
+ }
+ break;
+
+ case HANDLE_CHARCOMPRESS:
+ {
+ *pValue <<= static_cast<sal_Int16>(pDoc->GetCharCompressType());
+ break;
+ }
+
+ case HANDLE_ASIANPUNCT:
+ {
+ *pValue <<= pDoc->IsKernAsianPunctuation();
+ break;
+ }
+
+ case HANDLE_UPDATEFROMTEMPLATE:
+ {
+ *pValue <<= pDocSh->IsQueryLoadTemplate();
+ }
+ break;
+
+ case HANDLE_PRINTER_INDEPENDENT_LAYOUT:
+ {
+ sal_Int16 nPrinterIndependentLayout =
+ static_cast<sal_Int16>(pDoc->GetPrinterIndependentLayout());
+ *pValue <<= nPrinterIndependentLayout;
+ }
+ break;
+
+ // --> #i33095#
+ case HANDLE_LOAD_READONLY:
+ {
+ *pValue <<= pDocSh->IsLoadReadonly();
+ }
+ break;
+
+ case HANDLE_MODIFY_PASSWD:
+ {
+ *pValue <<= pDocSh->GetModifyPasswordInfo();
+ }
+ break;
+
+ case HANDLE_SAVE_VERSION:
+ {
+ *pValue <<= pDocSh->IsSaveVersionOnClose();
+ }
+ break;
+
+ case HANDLE_EMBED_FONTS:
+ {
+ *pValue <<= pDoc->IsEmbedFonts();
+ }
+ break;
+
+ case HANDLE_EMBED_USED_FONTS:
+ {
+ *pValue <<= pDoc->IsEmbedUsedFontsOnly();
+ }
+ break;
+
+ case HANDLE_EMBED_LATIN_SCRIPT_FONTS:
+ {
+ *pValue <<= pDoc->IsEmbedFontScriptLatin();
+ }
+ break;
+
+ case HANDLE_EMBED_ASIAN_SCRIPT_FONTS:
+ {
+ *pValue <<= pDoc->IsEmbedFontScriptAsian();
+ }
+ break;
+
+ case HANDLE_EMBED_COMPLEX_SCRIPT_FONTS:
+ {
+ *pValue <<= pDoc->IsEmbedFontScriptComplex();
+ }
+ break;
+
+ case HANDLE_IMAGE_PREFERRED_DPI:
+ {
+ *pValue <<= pDoc->getImagePreferredDPI();
+ }
+ break;
+
+ default:
+ throw UnknownPropertyException( OUString::number((*ppEntries)->mnHandle), static_cast<cppu::OWeakObject*>(this));
+ }
+ }
+}
+
+// XInterface
+Any SAL_CALL DocumentSettings::queryInterface( const Type& aType )
+{
+ return WeakImplHelper< XPropertySet, XMultiPropertySet, XServiceInfo >::queryInterface( aType );
+}
+
+void SAL_CALL DocumentSettings::acquire( ) noexcept
+{
+ WeakImplHelper< XPropertySet, XMultiPropertySet, XServiceInfo >::acquire();
+}
+
+void SAL_CALL DocumentSettings::release( ) noexcept
+{
+ WeakImplHelper< XPropertySet, XMultiPropertySet, XServiceInfo >::release();
+}
+
+// XPropertySet
+Reference< XPropertySetInfo > SAL_CALL DocumentSettings::getPropertySetInfo( )
+{
+ return PropertySetHelper::getPropertySetInfo();
+}
+
+void SAL_CALL DocumentSettings::setPropertyValue( const OUString& aPropertyName, const Any& aValue )
+{
+ PropertySetHelper::setPropertyValue( aPropertyName, aValue );
+}
+
+Any SAL_CALL DocumentSettings::getPropertyValue( const OUString& PropertyName )
+{
+ return PropertySetHelper::getPropertyValue( PropertyName );
+}
+
+void SAL_CALL DocumentSettings::addPropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& xListener )
+{
+ PropertySetHelper::addPropertyChangeListener( aPropertyName, xListener );
+}
+
+void SAL_CALL DocumentSettings::removePropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& aListener )
+{
+ PropertySetHelper::removePropertyChangeListener( aPropertyName, aListener );
+}
+
+void SAL_CALL DocumentSettings::addVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener )
+{
+ PropertySetHelper::addVetoableChangeListener( PropertyName, aListener );
+}
+
+void SAL_CALL DocumentSettings::removeVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener )
+{
+ PropertySetHelper::removeVetoableChangeListener( PropertyName, aListener );
+}
+
+// XMultiPropertySet
+void SAL_CALL DocumentSettings::setPropertyValues( const Sequence< OUString >& aPropertyNames, const Sequence< Any >& aValues )
+{
+ PropertySetHelper::setPropertyValues( aPropertyNames, aValues );
+}
+
+Sequence< Any > SAL_CALL DocumentSettings::getPropertyValues( const Sequence< OUString >& aPropertyNames )
+{
+ return PropertySetHelper::getPropertyValues( aPropertyNames );
+}
+
+void SAL_CALL DocumentSettings::addPropertiesChangeListener( const Sequence< OUString >& aPropertyNames, const Reference< XPropertiesChangeListener >& xListener )
+{
+ PropertySetHelper::addPropertiesChangeListener( aPropertyNames, xListener );
+}
+
+void SAL_CALL DocumentSettings::removePropertiesChangeListener( const Reference< XPropertiesChangeListener >& xListener )
+{
+ PropertySetHelper::removePropertiesChangeListener( xListener );
+}
+
+void SAL_CALL DocumentSettings::firePropertiesChangeEvent( const Sequence< OUString >& aPropertyNames, const Reference< XPropertiesChangeListener >& xListener )
+{
+ PropertySetHelper::firePropertiesChangeEvent( aPropertyNames, xListener );
+}
+
+// XServiceInfo
+OUString SAL_CALL DocumentSettings::getImplementationName( )
+{
+ return "com.sun.star.comp.Draw.DocumentSettings";
+}
+
+sal_Bool SAL_CALL DocumentSettings::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+Sequence< OUString > SAL_CALL DocumentSettings::getSupportedServiceNames( )
+{
+ return { "com.sun.star.document.Settings" ,
+ mxModel->IsImpressDocument()?OUString("com.sun.star.presentation.DocumentSettings"):OUString("com.sun.star.drawing.DocumentSettings") };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/UnoDocumentSettings.hxx b/sd/source/ui/unoidl/UnoDocumentSettings.hxx
new file mode 100644
index 000000000..bba3c66b1
--- /dev/null
+++ b/sd/source/ui/unoidl/UnoDocumentSettings.hxx
@@ -0,0 +1,37 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Reference.hxx>
+
+namespace com::sun::star::uno
+{
+class XInterface;
+}
+
+class SdXImpressDocument;
+
+namespace sd
+{
+css::uno::Reference<css::uno::XInterface>
+DocumentSettings_createInstance(SdXImpressDocument* pDoc) noexcept;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/randomnode.cxx b/sd/source/ui/unoidl/randomnode.cxx
new file mode 100644
index 000000000..a87ae1783
--- /dev/null
+++ b/sd/source/ui/unoidl/randomnode.cxx
@@ -0,0 +1,573 @@
+/* -*- 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 <com/sun/star/animations/XTimeContainer.hpp>
+#include <com/sun/star/presentation/ParagraphTarget.hpp>
+#include <com/sun/star/animations/AnimationFill.hpp>
+#include <com/sun/star/animations/AnimationNodeType.hpp>
+#include <com/sun/star/animations/XAnimate.hpp>
+#include <com/sun/star/animations/AnimationRestart.hpp>
+#include <com/sun/star/animations/ParallelTimeContainer.hpp>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/util/XCloneable.hpp>
+#include <comphelper/processfactory.hxx>
+
+#include <cppuhelper/implbase.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <cppuhelper/weakref.hxx>
+#include <osl/mutex.hxx>
+#include <CustomAnimationPreset.hxx>
+#include <randomnode.hxx>
+
+using ::osl::Mutex;
+using ::osl::Guard;
+
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::Sequence;
+using ::com::sun::star::uno::Any;
+using ::com::sun::star::uno::UNO_QUERY;
+using ::com::sun::star::uno::XInterface;
+using ::com::sun::star::uno::WeakReference;
+using ::com::sun::star::beans::NamedValue;
+using ::com::sun::star::lang::IllegalArgumentException;
+using ::com::sun::star::container::XEnumeration;
+using ::com::sun::star::container::XEnumerationAccess;
+using ::com::sun::star::util::XCloneable;
+using ::com::sun::star::lang::XServiceInfo;
+using ::com::sun::star::lang::XInitialization;
+using ::com::sun::star::uno::Type;
+using ::com::sun::star::uno::XWeak;
+using ::com::sun::star::presentation::ParagraphTarget;
+using ::com::sun::star::drawing::XShape;
+
+using namespace ::com::sun::star::animations;
+
+namespace sd
+{
+
+typedef ::cppu::WeakImplHelper< XTimeContainer, XEnumerationAccess, XCloneable, XServiceInfo, XInitialization > RandomAnimationNodeBase;
+
+namespace {
+
+class RandomAnimationNode : public RandomAnimationNodeBase
+{
+public:
+ RandomAnimationNode( const RandomAnimationNode& rNode );
+ explicit RandomAnimationNode( sal_Int16 nPresetClass );
+ RandomAnimationNode();
+
+ void init( sal_Int16 nPresetClass );
+
+ // XInitialization
+ void SAL_CALL initialize( const Sequence< Any >& aArguments ) override;
+
+ // XChild
+ Reference< XInterface > SAL_CALL getParent( ) override;
+ void SAL_CALL setParent( const Reference< XInterface >& Parent ) override;
+
+ // XCloneable
+ virtual Reference< XCloneable > SAL_CALL createClone() override;
+
+ // XServiceInfo
+ OUString SAL_CALL getImplementationName() override;
+ Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
+ sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+
+ // XAnimationNode
+ ::sal_Int16 SAL_CALL getType() override;
+ Any SAL_CALL getBegin() override;
+ void SAL_CALL setBegin( const Any& _begin ) override;
+ Any SAL_CALL getDuration() override;
+ void SAL_CALL setDuration( const Any& _duration ) override;
+ Any SAL_CALL getEnd() override;
+ void SAL_CALL setEnd( const Any& _end ) override;
+ Any SAL_CALL getEndSync() override;
+ void SAL_CALL setEndSync( const Any& _endsync ) override;
+ Any SAL_CALL getRepeatCount() override;
+ void SAL_CALL setRepeatCount( const Any& _repeatcount ) override;
+ Any SAL_CALL getRepeatDuration() override;
+ void SAL_CALL setRepeatDuration( const Any& _repeatduration ) override;
+ ::sal_Int16 SAL_CALL getFill() override;
+ void SAL_CALL setFill( ::sal_Int16 _fill ) override;
+ ::sal_Int16 SAL_CALL getFillDefault() override;
+ void SAL_CALL setFillDefault( ::sal_Int16 _filldefault ) override;
+ ::sal_Int16 SAL_CALL getRestart() override;
+ void SAL_CALL setRestart( ::sal_Int16 _restart ) override;
+ ::sal_Int16 SAL_CALL getRestartDefault() override;
+ void SAL_CALL setRestartDefault( ::sal_Int16 _restartdefault ) override;
+ double SAL_CALL getAcceleration() override;
+ void SAL_CALL setAcceleration( double _acceleration ) override;
+ double SAL_CALL getDecelerate() override;
+ void SAL_CALL setDecelerate( double _decelerate ) override;
+ sal_Bool SAL_CALL getAutoReverse() override;
+ void SAL_CALL setAutoReverse( sal_Bool _autoreverse ) override;
+ Sequence< NamedValue > SAL_CALL getUserData() override;
+ void SAL_CALL setUserData( const Sequence< NamedValue >& _userdata ) override;
+
+ // XElementAccess
+ virtual Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() override;
+
+ // XEnumerationAccess
+ virtual Reference< XEnumeration > SAL_CALL createEnumeration() override;
+
+ // XTimeContainer
+ Reference< XAnimationNode > SAL_CALL insertBefore( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& refChild ) override;
+ Reference< XAnimationNode > SAL_CALL insertAfter( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& refChild ) override;
+ Reference< XAnimationNode > SAL_CALL replaceChild( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& oldChild ) override;
+ Reference< XAnimationNode > SAL_CALL removeChild( const Reference< XAnimationNode >& oldChild ) override;
+ Reference< XAnimationNode > SAL_CALL appendChild( const Reference< XAnimationNode >& newChild ) override;
+
+private:
+ // our first, last and only protection from multi-threads!
+ Mutex maMutex;
+
+ sal_Int16 mnPresetClass;
+ WeakReference<XInterface> mxParent;
+
+ Any maBegin, maDuration, maEnd, maEndSync, maRepeatCount, maRepeatDuration, maTarget;
+ sal_Int16 mnFill, mnFillDefault, mnRestart, mnRestartDefault;
+ double mfAcceleration, mfDecelerate;
+ bool mbAutoReverse;
+ Sequence< NamedValue > maUserData;
+
+ Reference< XAnimate > mxFirstNode;
+};
+
+}
+
+Reference< XInterface > RandomAnimationNode_createInstance( sal_Int16 nPresetClass )
+{
+ Reference< XInterface > xInt( static_cast<XWeak*>( new RandomAnimationNode( nPresetClass ) ) );
+ return xInt;
+}
+
+RandomAnimationNode::RandomAnimationNode( const RandomAnimationNode& rNode )
+: RandomAnimationNodeBase(rNode),
+ mnPresetClass( rNode.mnPresetClass ),
+ maBegin( rNode.maBegin ),
+ maDuration( rNode.maDuration ),
+ maEnd( rNode.maEnd ),
+ maEndSync( rNode.maEndSync ),
+ maRepeatCount( rNode.maRepeatCount ),
+ maRepeatDuration( rNode.maRepeatDuration ),
+ maTarget( rNode.maTarget ),
+ mnFill( rNode.mnFill ),
+ mnFillDefault( rNode.mnFillDefault ),
+ mnRestart( rNode.mnRestart ),
+ mnRestartDefault( rNode.mnRestartDefault ),
+ mfAcceleration( rNode.mfAcceleration ),
+ mfDecelerate( rNode.mfDecelerate ),
+ mbAutoReverse( rNode.mbAutoReverse ),
+ maUserData( rNode.maUserData )
+{
+}
+
+RandomAnimationNode::RandomAnimationNode( sal_Int16 nPresetClass )
+{
+ init( nPresetClass );
+}
+
+RandomAnimationNode::RandomAnimationNode()
+{
+ init( 1 );
+}
+
+void RandomAnimationNode::init( sal_Int16 nPresetClass )
+{
+ mnPresetClass = nPresetClass;
+ mnFill = AnimationFill::DEFAULT;
+ mnFillDefault = AnimationFill::INHERIT;
+ mnRestart = AnimationRestart::DEFAULT;
+ mnRestartDefault = AnimationRestart::INHERIT;
+ mfAcceleration = 0.0;
+ mfDecelerate = 0.0;
+ mbAutoReverse = false;
+}
+
+// XInitialization
+void SAL_CALL RandomAnimationNode::initialize( const Sequence< Any >& aArguments )
+{
+ if( aArguments.getLength() != 1 )
+ throw IllegalArgumentException();
+
+ if( aArguments[0].getValueType() == ::cppu::UnoType<sal_Int16>::get() )
+ {
+ aArguments[0] >>= mnPresetClass;
+ }
+ else if( aArguments[0].getValueType() != ::cppu::UnoType<ParagraphTarget>::get() )
+ {
+ Reference< XShape > xShape;
+ aArguments[0] >>= xShape;
+ if( !xShape.is() )
+ throw IllegalArgumentException();
+ }
+ maTarget = aArguments[0];
+}
+
+// XAnimationNode
+sal_Int16 SAL_CALL RandomAnimationNode::getType()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return css::animations::AnimationNodeType::PAR;
+}
+
+// XAnimationNode
+Any SAL_CALL RandomAnimationNode::getBegin()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return maBegin;
+}
+
+// XAnimationNode
+void SAL_CALL RandomAnimationNode::setBegin( const Any& _begin )
+{
+ Guard< Mutex > aGuard( maMutex );
+ maBegin = _begin;
+}
+
+// XAnimationNode
+Any SAL_CALL RandomAnimationNode::getDuration()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return maDuration;
+}
+
+// XAnimationNode
+void SAL_CALL RandomAnimationNode::setDuration( const Any& _duration )
+{
+ Guard< Mutex > aGuard( maMutex );
+ maDuration = _duration;
+}
+
+// XAnimationNode
+Any SAL_CALL RandomAnimationNode::getEnd()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return maEnd;
+}
+
+// XAnimationNode
+void SAL_CALL RandomAnimationNode::setEnd( const Any& _end )
+{
+ Guard< Mutex > aGuard( maMutex );
+ maEnd = _end;
+}
+
+// XAnimationNode
+Any SAL_CALL RandomAnimationNode::getEndSync()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return maEndSync;
+}
+
+// XAnimationNode
+void SAL_CALL RandomAnimationNode::setEndSync( const Any& _endsync )
+{
+ Guard< Mutex > aGuard( maMutex );
+ maEndSync = _endsync;
+}
+
+// XAnimationNode
+Any SAL_CALL RandomAnimationNode::getRepeatCount()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return maRepeatCount;
+}
+
+// XAnimationNode
+void SAL_CALL RandomAnimationNode::setRepeatCount( const Any& _repeatcount )
+{
+ Guard< Mutex > aGuard( maMutex );
+ maRepeatCount = _repeatcount;
+}
+
+// XAnimationNode
+Any SAL_CALL RandomAnimationNode::getRepeatDuration()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return maRepeatDuration;
+}
+
+// XAnimationNode
+void SAL_CALL RandomAnimationNode::setRepeatDuration( const Any& _repeatduration )
+{
+ Guard< Mutex > aGuard( maMutex );
+ maRepeatDuration = _repeatduration;
+}
+
+// XAnimationNode
+sal_Int16 SAL_CALL RandomAnimationNode::getFill()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return mnFill;
+}
+
+// XAnimationNode
+void SAL_CALL RandomAnimationNode::setFill( sal_Int16 _fill )
+{
+ Guard< Mutex > aGuard( maMutex );
+ mnFill = _fill;
+}
+
+// XAnimationNode
+sal_Int16 SAL_CALL RandomAnimationNode::getFillDefault()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return mnFillDefault;
+}
+
+// XAnimationNode
+void SAL_CALL RandomAnimationNode::setFillDefault( sal_Int16 _filldefault )
+{
+ Guard< Mutex > aGuard( maMutex );
+ mnFillDefault = _filldefault;
+}
+
+// XAnimationNode
+sal_Int16 SAL_CALL RandomAnimationNode::getRestart()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return mnRestart;
+}
+
+// XAnimationNode
+void SAL_CALL RandomAnimationNode::setRestart( sal_Int16 _restart )
+{
+ Guard< Mutex > aGuard( maMutex );
+ mnRestart = _restart;
+}
+
+// XAnimationNode
+sal_Int16 SAL_CALL RandomAnimationNode::getRestartDefault()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return mnRestartDefault;
+}
+
+// XAnimationNode
+void SAL_CALL RandomAnimationNode::setRestartDefault( sal_Int16 _restartdefault )
+{
+ Guard< Mutex > aGuard( maMutex );
+ mnRestartDefault = _restartdefault;
+}
+
+// XAnimationNode
+double SAL_CALL RandomAnimationNode::getAcceleration()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return mfAcceleration;
+}
+
+// XAnimationNode
+void SAL_CALL RandomAnimationNode::setAcceleration( double _acceleration )
+{
+ Guard< Mutex > aGuard( maMutex );
+ mfAcceleration = _acceleration;
+}
+
+// XAnimationNode
+double SAL_CALL RandomAnimationNode::getDecelerate()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return mfDecelerate;
+}
+
+// XAnimationNode
+void SAL_CALL RandomAnimationNode::setDecelerate( double _decelerate )
+{
+ Guard< Mutex > aGuard( maMutex );
+ mfDecelerate = _decelerate;
+}
+
+// XAnimationNode
+sal_Bool SAL_CALL RandomAnimationNode::getAutoReverse()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return mbAutoReverse;
+}
+
+// XAnimationNode
+void SAL_CALL RandomAnimationNode::setAutoReverse( sal_Bool _autoreverse )
+{
+ Guard< Mutex > aGuard( maMutex );
+ mbAutoReverse = _autoreverse;
+}
+
+Sequence< NamedValue > SAL_CALL RandomAnimationNode::getUserData()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return maUserData;
+}
+
+void SAL_CALL RandomAnimationNode::setUserData( const Sequence< NamedValue >& _userdata )
+{
+ Guard< Mutex > aGuard( maMutex );
+ maUserData = _userdata;
+}
+
+// XChild
+Reference< XInterface > SAL_CALL RandomAnimationNode::getParent()
+{
+ Guard< Mutex > aGuard( maMutex );
+ return mxParent.get();
+}
+
+// XChild
+void SAL_CALL RandomAnimationNode::setParent( const Reference< XInterface >& Parent )
+{
+ Guard< Mutex > aGuard( maMutex );
+ mxParent = Parent;
+}
+
+// XCloneable
+Reference< XCloneable > SAL_CALL RandomAnimationNode::createClone()
+{
+ Reference< XCloneable > xNewNode( new RandomAnimationNode( *this ) );
+ return xNewNode;
+}
+
+// XElementAccess
+Type SAL_CALL RandomAnimationNode::getElementType()
+{
+ return cppu::UnoType<XAnimationNode>::get();
+}
+
+// XElementAccess
+sal_Bool SAL_CALL RandomAnimationNode::hasElements()
+{
+ return true;
+}
+
+// XEnumerationAccess
+Reference< XEnumeration > SAL_CALL RandomAnimationNode::createEnumeration()
+{
+ Guard< Mutex > aGuard( maMutex );
+
+ if( !maTarget.hasValue() && mxFirstNode.is() )
+ {
+ Any aTarget( mxFirstNode->getTarget() );
+ if( aTarget.hasValue() )
+ {
+ maTarget = aTarget;
+ mxFirstNode.clear();
+ }
+ }
+
+ Reference< XEnumeration > xEnum;
+
+ Reference< XEnumerationAccess > aEnumAccess( CustomAnimationPresets::getCustomAnimationPresets().getRandomPreset( mnPresetClass ), UNO_QUERY );
+
+ if( aEnumAccess.is() )
+ {
+ Reference< XEnumeration > xEnumeration = aEnumAccess->createEnumeration();
+ if( xEnumeration.is() )
+ {
+ while( xEnumeration->hasMoreElements() )
+ {
+ Reference< XAnimate > xAnimate( xEnumeration->nextElement(), UNO_QUERY );
+ if( xAnimate.is() )
+ xAnimate->setTarget( maTarget );
+ }
+ }
+ xEnum = aEnumAccess->createEnumeration();
+ }
+ else
+ {
+ // no presets? give empty node!
+ Reference< XParallelTimeContainer > xTimeContainer = ParallelTimeContainer::create( comphelper::getProcessComponentContext() );
+ xEnum = xTimeContainer->createEnumeration();
+ }
+
+ return xEnum;
+}
+
+// XTimeContainer
+Reference< XAnimationNode > SAL_CALL RandomAnimationNode::insertBefore( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& )
+{
+ return appendChild( newChild );
+}
+
+// XTimeContainer
+Reference< XAnimationNode > SAL_CALL RandomAnimationNode::insertAfter( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& )
+{
+ return appendChild( newChild );
+}
+
+// XTimeContainer
+Reference< XAnimationNode > SAL_CALL RandomAnimationNode::replaceChild( const Reference< XAnimationNode >& newChild, const Reference< XAnimationNode >& )
+{
+ return appendChild( newChild );
+}
+
+// XTimeContainer
+Reference< XAnimationNode > SAL_CALL RandomAnimationNode::removeChild( const Reference< XAnimationNode >& oldChild )
+{
+ return oldChild;
+}
+
+// XTimeContainer
+Reference< XAnimationNode > SAL_CALL RandomAnimationNode::appendChild( const Reference< XAnimationNode >& newChild )
+{
+ Reference< XAnimate > xAnimate( newChild, UNO_QUERY );
+ if( xAnimate.is() )
+ {
+ Any aTarget( xAnimate->getTarget() );
+ if( aTarget.hasValue() )
+ maTarget = aTarget;
+ }
+
+ if( !maTarget.hasValue() && !mxFirstNode.is() )
+ mxFirstNode = xAnimate;
+
+ return newChild;
+}
+
+// XServiceInfo
+OUString RandomAnimationNode::getImplementationName()
+{
+ return "sd::RandomAnimationNode" ;
+}
+
+// XServiceInfo
+sal_Bool RandomAnimationNode::supportsService(const OUString& ServiceName)
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+// XServiceInfo
+Sequence< OUString > RandomAnimationNode::getSupportedServiceNames()
+{
+ return { "com.sun.star.animations.ParallelTimeContainer", "com.sun.star.comp.sd.RandomAnimationNode" };
+}
+
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+RandomAnimationNode_get_implementation(css::uno::XComponentContext*,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new sd::RandomAnimationNode());
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/sddetect.cxx b/sd/source/ui/unoidl/sddetect.cxx
new file mode 100644
index 000000000..cfa50d141
--- /dev/null
+++ b/sd/source/ui/unoidl/sddetect.cxx
@@ -0,0 +1,160 @@
+/* -*- 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 "sddetect.hxx"
+
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <cppuhelper/supportsservice.hxx>
+#include <com/sun/star/io/XInputStream.hpp>
+#include <com/sun/star/ucb/ContentCreationException.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <vcl/graphicfilter.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/docfilt.hxx>
+#include <sfx2/fcontnr.hxx>
+#include <vcl/FilterConfigItem.hxx>
+#include <sot/storage.hxx>
+#include <unotools/mediadescriptor.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::io;
+using namespace ::com::sun::star::task;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::lang;
+using utl::MediaDescriptor;
+
+SdFilterDetect::SdFilterDetect()
+{
+}
+
+SdFilterDetect::~SdFilterDetect()
+{
+}
+
+OUString SAL_CALL SdFilterDetect::detect( Sequence< beans::PropertyValue >& lDescriptor )
+{
+ MediaDescriptor aMediaDesc( lDescriptor );
+ OUString aTypeName = aMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_TYPENAME, OUString() );
+ uno::Reference< io::XInputStream > xInStream ( aMediaDesc[MediaDescriptor::PROP_INPUTSTREAM], uno::UNO_QUERY );
+ if ( !xInStream.is() )
+ return OUString();
+
+ SfxMedium aMedium;
+ aMedium.UseInteractionHandler( false );
+ aMedium.setStreamToLoadFrom( xInStream, true );
+
+ SvStream *pInStrm = aMedium.GetInStream();
+ if ( !pInStrm || pInStrm->GetError() )
+ return OUString();
+
+ if ( aTypeName.startsWith( "impress_MS_PowerPoint_97" ) )
+ {
+ // Do not attempt to create an SotStorage on a
+ // 0-length stream as that would create the compound
+ // document header on the stream and effectively write to
+ // disk!
+ pInStrm->Seek( STREAM_SEEK_TO_BEGIN );
+ if ( pInStrm->remainingSize() == 0 )
+ return OUString();
+
+ try
+ {
+ tools::SvRef<SotStorage> aStorage = new SotStorage( pInStrm, false );
+ if ( !aStorage->GetError() && aStorage->IsStream( "PowerPoint Document" ) )
+ return aTypeName;
+ }
+ catch (const css::ucb::ContentCreationException&)
+ {
+ }
+ }
+ else
+ {
+ pInStrm->Seek( STREAM_SEEK_TO_BEGIN );
+
+ const OUString aFileName( aMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_URL, OUString() ) );
+ GraphicDescriptor aDesc( *pInStrm, &aFileName );
+ if( !aDesc.Detect() )
+ {
+ INetURLObject aCheckURL( aFileName );
+ if( aCheckURL.getExtension().equalsIgnoreAsciiCase("cgm") )
+ {
+ sal_uInt8 n8;
+ pInStrm->Seek( STREAM_SEEK_TO_BEGIN );
+ pInStrm->ReadUChar( n8 );
+ if ( ( n8 & 0xf0 ) == 0 )
+ // we are supporting binary cgm format only, so
+ // this is a small test to exclude cgm text
+ return "impress_CGM_Computer_Graphics_Metafile";
+ }
+ }
+ else
+ {
+ OUString aShortName( GraphicDescriptor::GetImportFormatShortName( aDesc.GetFileFormat() ) );
+ GraphicFilter &rGrfFilter = GraphicFilter::GetGraphicFilter();
+ const OUString aName( rGrfFilter.GetImportFormatTypeName( rGrfFilter.GetImportFormatNumberForShortName( aShortName ) ) );
+
+ if ( aShortName.equalsIgnoreAsciiCase( "PCD" ) ) // there is a multiple pcd selection possible
+ {
+ sal_Int32 nBase = 2; // default Base0
+ if ( aTypeName == "pcd_Photo_CD_Base4" )
+ nBase = 1;
+ else if ( aTypeName == "pcd_Photo_CD_Base16" )
+ nBase = 0;
+ FilterConfigItem aFilterConfigItem( u"Office.Common/Filter/Graphic/Import/PCD" );
+ aFilterConfigItem.WriteInt32( "Resolution" , nBase );
+ }
+
+ SfxFilterMatcher aMatch("sdraw");
+ std::shared_ptr<const SfxFilter> pFilter = aMatch.GetFilter4FilterName( aName );
+ if ( pFilter )
+ return pFilter->GetRealTypeName();
+ }
+ }
+
+ return OUString();
+}
+
+// XServiceInfo
+OUString SAL_CALL SdFilterDetect::getImplementationName()
+{
+ return "com.sun.star.comp.draw.FormatDetector";
+}
+
+// XServiceInfo
+sal_Bool SAL_CALL SdFilterDetect::supportsService( const OUString& sServiceName )
+{
+ return cppu::supportsService(this, sServiceName);
+}
+
+// XServiceInfo
+Sequence< OUString > SAL_CALL SdFilterDetect::getSupportedServiceNames()
+{
+ return { "com.sun.star.frame.ExtendedTypeDetection" };
+}
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_draw_FormatDetector_get_implementation(css::uno::XComponentContext*,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ return cppu::acquire(new SdFilterDetect());
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/sddetect.hxx b/sd/source/ui/unoidl/sddetect.hxx
new file mode 100644
index 000000000..3d22cc12c
--- /dev/null
+++ b/sd/source/ui/unoidl/sddetect.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <rtl/ustring.hxx>
+#include <com/sun/star/document/XExtendedFilterDetection.hpp>
+#include <cppuhelper/implbase.hxx>
+
+#include <com/sun/star/lang/XServiceInfo.hpp>
+
+
+namespace com::sun::star::beans { struct PropertyValue; }
+
+class SdFilterDetect : public ::cppu::WeakImplHelper< css::document::XExtendedFilterDetection, css::lang::XServiceInfo >
+{
+public:
+ SdFilterDetect();
+ virtual ~SdFilterDetect() override;
+
+ // XServiceInfo
+
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService( const OUString& sServiceName ) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
+
+ // XExtendedFilterDetect
+
+ virtual OUString SAL_CALL detect( css::uno::Sequence< css::beans::PropertyValue >& lDescriptor ) override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unocpres.cxx b/sd/source/ui/unoidl/unocpres.cxx
new file mode 100644
index 000000000..cc57b1e79
--- /dev/null
+++ b/sd/source/ui/unoidl/unocpres.cxx
@@ -0,0 +1,450 @@
+/* -*- 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 <algorithm>
+
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <o3tl/safeint.hxx>
+#include <vcl/svapp.hxx>
+#include <svx/svdpage.hxx>
+#include <cppuhelper/supportsservice.hxx>
+
+#include <createunocustomshow.hxx>
+#include <unomodel.hxx>
+#include <drawdoc.hxx>
+#include "unocpres.hxx"
+#include <cusshow.hxx>
+#include <unopage.hxx>
+#include <customshowlist.hxx>
+
+using namespace ::com::sun::star;
+
+uno::Reference< uno::XInterface > createUnoCustomShow( SdCustomShow* pShow )
+{
+ return static_cast<cppu::OWeakObject*>(new SdXCustomPresentation( pShow ));
+}
+
+SdXCustomPresentation::SdXCustomPresentation() noexcept
+: mpSdCustomShow(nullptr), mpModel(nullptr),
+ aDisposeListeners( aDisposeContainerMutex ),
+ bDisposing( false )
+{
+}
+
+SdXCustomPresentation::SdXCustomPresentation( SdCustomShow* pShow) noexcept
+: mpSdCustomShow(pShow), mpModel(nullptr),
+ aDisposeListeners( aDisposeContainerMutex ),
+ bDisposing( false )
+{
+}
+
+SdXCustomPresentation::~SdXCustomPresentation() noexcept
+{
+}
+
+UNO3_GETIMPLEMENTATION_IMPL( SdXCustomPresentation );
+
+// XServiceInfo
+OUString SAL_CALL SdXCustomPresentation::getImplementationName()
+{
+ return "SdXCustomPresentation" ;
+}
+
+sal_Bool SAL_CALL SdXCustomPresentation::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+uno::Sequence< OUString > SAL_CALL SdXCustomPresentation::getSupportedServiceNames()
+{
+ return { "com.sun.star.presentation.CustomPresentation" };
+}
+
+// XIndexContainer
+void SAL_CALL SdXCustomPresentation::insertByIndex( sal_Int32 Index, const uno::Any& Element )
+{
+ SolarMutexGuard aGuard;
+
+ if( bDisposing )
+ throw lang::DisposedException();
+
+ if( Index < 0 || o3tl::make_unsigned(Index) > ( mpSdCustomShow ? mpSdCustomShow->PagesVector().size() : 0 ) )
+ throw lang::IndexOutOfBoundsException();
+
+ uno::Reference< drawing::XDrawPage > xPage;
+ Element >>= xPage;
+
+ if(!xPage.is())
+ throw lang::IllegalArgumentException();
+
+ SdDrawPage* pPage = comphelper::getFromUnoTunnel<SdDrawPage>( xPage );
+
+ if(pPage)
+ {
+ if( nullptr == mpModel )
+ mpModel = pPage->GetModel();
+
+ if( nullptr != mpModel && nullptr == mpSdCustomShow && mpModel->GetDoc() )
+ mpSdCustomShow = new SdCustomShow;
+
+ mpSdCustomShow->PagesVector().insert(mpSdCustomShow->PagesVector().begin() + Index,
+ static_cast<SdPage*>(pPage->GetSdrPage()));
+ }
+
+ if( mpModel )
+ mpModel->SetModified();
+}
+
+void SAL_CALL SdXCustomPresentation::removeByIndex( sal_Int32 Index )
+{
+ SolarMutexGuard aGuard;
+
+ if( bDisposing )
+ throw lang::DisposedException();
+
+ if(mpSdCustomShow)
+ {
+ uno::Reference< drawing::XDrawPage > xPage;
+ getByIndex( Index ) >>= xPage;
+
+ if( xPage.is() )
+ {
+ SvxDrawPage* pPage = comphelper::getFromUnoTunnel<SvxDrawPage>( xPage );
+ if(pPage)
+ {
+ SdCustomShow::PageVec::iterator it = std::find(
+ mpSdCustomShow->PagesVector().begin(),
+ mpSdCustomShow->PagesVector().end(),
+ pPage->GetSdrPage());
+ if (it != mpSdCustomShow->PagesVector().end())
+ mpSdCustomShow->PagesVector().erase(it);
+ }
+ }
+ }
+
+ if( mpModel )
+ mpModel->SetModified();
+}
+
+// XIndexReplace
+void SAL_CALL SdXCustomPresentation::replaceByIndex( sal_Int32 Index, const uno::Any& Element )
+{
+ removeByIndex( Index );
+ insertByIndex( Index, Element );
+}
+
+// XElementAccess
+uno::Type SAL_CALL SdXCustomPresentation::getElementType()
+{
+ return cppu::UnoType<drawing::XDrawPage>::get();
+}
+
+sal_Bool SAL_CALL SdXCustomPresentation::hasElements()
+{
+ SolarMutexGuard aGuard;
+
+ if( bDisposing )
+ throw lang::DisposedException();
+
+ return getCount() > 0;
+}
+
+// XIndexAccess
+sal_Int32 SAL_CALL SdXCustomPresentation::getCount()
+{
+ SolarMutexGuard aGuard;
+ if( bDisposing )
+ throw lang::DisposedException();
+
+ return mpSdCustomShow ? mpSdCustomShow->PagesVector().size() : 0;
+}
+
+uno::Any SAL_CALL SdXCustomPresentation::getByIndex( sal_Int32 Index )
+{
+ SolarMutexGuard aGuard;
+
+ if( bDisposing )
+ throw lang::DisposedException();
+
+ if (Index < 0 || !mpSdCustomShow || o3tl::make_unsigned(Index) >= mpSdCustomShow->PagesVector().size())
+ throw lang::IndexOutOfBoundsException();
+
+ uno::Any aAny;
+ SdrPage * pPage = const_cast<SdPage *>(mpSdCustomShow->PagesVector()[Index]);
+
+ if( pPage )
+ {
+ uno::Reference< drawing::XDrawPage > xRef( pPage->getUnoPage(), uno::UNO_QUERY );
+ aAny <<= xRef;
+ }
+
+ return aAny;
+}
+
+// XNamed
+OUString SAL_CALL SdXCustomPresentation::getName()
+{
+ SolarMutexGuard aGuard;
+
+ if( bDisposing )
+ throw lang::DisposedException();
+
+ if(mpSdCustomShow)
+ return mpSdCustomShow->GetName();
+
+ return OUString();
+}
+
+void SAL_CALL SdXCustomPresentation::setName( const OUString& aName )
+{
+ SolarMutexGuard aGuard;
+
+ if( bDisposing )
+ throw lang::DisposedException();
+
+ if(mpSdCustomShow)
+ mpSdCustomShow->SetName( aName );
+}
+
+// XComponent
+void SAL_CALL SdXCustomPresentation::dispose()
+{
+ SolarMutexGuard aGuard;
+
+ if( bDisposing )
+ return; // caught a recursion
+
+ bDisposing = true;
+
+ uno::Reference< uno::XInterface > xSource( static_cast<cppu::OWeakObject*>(this) );
+
+ lang::EventObject aEvt;
+ aEvt.Source = xSource;
+ aDisposeListeners.disposeAndClear(aEvt);
+
+ mpSdCustomShow = nullptr;
+}
+
+void SAL_CALL SdXCustomPresentation::addEventListener( const uno::Reference< lang::XEventListener >& xListener )
+{
+ if( bDisposing )
+ throw lang::DisposedException();
+
+ aDisposeListeners.addInterface(xListener);
+}
+
+void SAL_CALL SdXCustomPresentation::removeEventListener( const uno::Reference< lang::XEventListener >& aListener )
+{
+ if( !bDisposing )
+ aDisposeListeners.removeInterface(aListener);
+}
+
+/*===========================================================================*
+ * class SdXCustomPresentationAccess : public XCustomPresentationAccess, *
+ * public UsrObject *
+ *===========================================================================*/
+
+SdXCustomPresentationAccess::SdXCustomPresentationAccess(SdXImpressDocument& rMyModel) noexcept
+: mrModel(rMyModel)
+{
+}
+
+SdXCustomPresentationAccess::~SdXCustomPresentationAccess() noexcept
+{
+}
+
+// XServiceInfo
+OUString SAL_CALL SdXCustomPresentationAccess::getImplementationName()
+{
+ return "SdXCustomPresentationAccess";
+}
+
+sal_Bool SAL_CALL SdXCustomPresentationAccess::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+uno::Sequence< OUString > SAL_CALL SdXCustomPresentationAccess::getSupportedServiceNames()
+{
+ return { "com.sun.star.presentation.CustomPresentationAccess" };
+}
+
+// XSingleServiceFactory
+uno::Reference< uno::XInterface > SAL_CALL SdXCustomPresentationAccess::createInstance()
+{
+ uno::Reference< uno::XInterface > xRef( static_cast<cppu::OWeakObject*>(new SdXCustomPresentation()) );
+ return xRef;
+}
+
+uno::Reference< uno::XInterface > SAL_CALL SdXCustomPresentationAccess::createInstanceWithArguments( const uno::Sequence< uno::Any >& )
+{
+ return createInstance();
+}
+
+// XNameContainer
+void SAL_CALL SdXCustomPresentationAccess::insertByName( const OUString& aName, const uno::Any& aElement )
+{
+ SolarMutexGuard aGuard;
+
+ // get the documents custom show list
+ SdCustomShowList* pList = nullptr;
+ if(mrModel.GetDoc())
+ pList = mrModel.GetDoc()->GetCustomShowList(true);
+
+ // no list, no cookies
+ if( nullptr == pList)
+ throw uno::RuntimeException();
+
+ // do we have a container::XIndexContainer?
+ SdXCustomPresentation* pXShow = nullptr;
+
+ uno::Reference< container::XIndexContainer > xContainer;
+ if( (aElement >>= xContainer) && xContainer.is() )
+ pXShow = comphelper::getFromUnoTunnel<SdXCustomPresentation>(xContainer);
+
+ if( nullptr == pXShow )
+ throw lang::IllegalArgumentException();
+
+ // get the internal custom show from the api wrapper
+ SdCustomShow* pShow = pXShow->GetSdCustomShow();
+ if( nullptr == pShow )
+ {
+ pShow = new SdCustomShow( xContainer );
+ pXShow->SetSdCustomShow( pShow );
+ }
+ else
+ {
+ if( nullptr == pXShow->GetModel() || *pXShow->GetModel() != mrModel )
+ throw lang::IllegalArgumentException();
+ }
+
+ // give it a name
+ pShow->SetName( aName);
+
+ // check if this or another customshow with the same name already exists
+ for( SdCustomShow* pCompare = pList->First();
+ pCompare;
+ pCompare = pList->Next() )
+ {
+ if( pCompare == pShow || pCompare->GetName() == pShow->GetName() )
+ throw container::ElementExistException();
+ }
+
+ pList->push_back(std::unique_ptr<SdCustomShow>(pShow));
+
+ mrModel.SetModified();
+}
+
+void SAL_CALL SdXCustomPresentationAccess::removeByName( const OUString& Name )
+{
+ SolarMutexGuard aGuard;
+
+ SdCustomShow* pShow = getSdCustomShow(Name);
+
+ SdCustomShowList* pList = GetCustomShowList();
+ if(!pList || !pShow)
+ throw container::NoSuchElementException();
+
+ pList->erase( pShow );
+
+ mrModel.SetModified();
+}
+
+// XNameReplace
+void SAL_CALL SdXCustomPresentationAccess::replaceByName( const OUString& aName, const uno::Any& aElement )
+{
+ removeByName( aName );
+ insertByName( aName, aElement );
+}
+
+// XNameAccess
+uno::Any SAL_CALL SdXCustomPresentationAccess::getByName( const OUString& aName )
+{
+ SolarMutexGuard aGuard;
+
+ SdCustomShow* pShow = getSdCustomShow(aName);
+ if(!pShow)
+ {
+ throw container::NoSuchElementException();
+ }
+
+ uno::Reference< container::XIndexContainer > xRef( pShow->getUnoCustomShow(), uno::UNO_QUERY );
+ return uno::Any(xRef);
+}
+
+uno::Sequence< OUString > SAL_CALL SdXCustomPresentationAccess::getElementNames()
+{
+ SolarMutexGuard aGuard;
+
+ SdCustomShowList* pList = GetCustomShowList();
+ const sal_uInt32 nCount = pList ? pList->size() : 0;
+
+ uno::Sequence< OUString > aSequence( nCount );
+ OUString* pStringList = aSequence.getArray();
+
+ sal_uInt32 nIdx = 0;
+ while( nIdx < nCount )
+ {
+ const SdCustomShow* pShow = (*pList)[nIdx].get();
+ pStringList[nIdx] = pShow->GetName();
+ nIdx++;
+ }
+
+ return aSequence;
+}
+
+sal_Bool SAL_CALL SdXCustomPresentationAccess::hasByName( const OUString& aName )
+{
+ SolarMutexGuard aGuard;
+ return getSdCustomShow(aName) != nullptr;
+}
+
+// XElementAccess
+uno::Type SAL_CALL SdXCustomPresentationAccess::getElementType()
+{
+ return cppu::UnoType<container::XIndexContainer>::get();
+}
+
+sal_Bool SAL_CALL SdXCustomPresentationAccess::hasElements()
+{
+ SolarMutexGuard aGuard;
+
+ SdCustomShowList* pList = GetCustomShowList();
+ return pList && !pList->empty();
+}
+
+SdCustomShow * SdXCustomPresentationAccess::getSdCustomShow( std::u16string_view rName ) const noexcept
+{
+ sal_uInt32 nIdx = 0;
+
+ SdCustomShowList* pList = GetCustomShowList();
+ const sal_uInt32 nCount = pList ? pList->size() : 0;
+
+ while( nIdx < nCount )
+ {
+ SdCustomShow* pShow = (*pList)[nIdx].get();
+ if( pShow->GetName() == rName )
+ return pShow;
+ nIdx++;
+ }
+ return nullptr;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unocpres.hxx b/sd/source/ui/unoidl/unocpres.hxx
new file mode 100644
index 000000000..e32dce956
--- /dev/null
+++ b/sd/source/ui/unoidl/unocpres.hxx
@@ -0,0 +1,147 @@
+/* -*- 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 .
+ */
+#pragma once
+
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/container/XIndexContainer.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+#include <comphelper/interfacecontainer3.hxx>
+#include <osl/mutex.hxx>
+
+#include <cppuhelper/implbase.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+
+#include <unomodel.hxx>
+#include <drawdoc.hxx>
+
+
+class SdCustomShow;
+
+class SdXCustomPresentation : public ::cppu::WeakImplHelper< css::container::XIndexContainer,
+ css::container::XNamed,
+ css::lang::XUnoTunnel,
+ css::lang::XComponent,
+ css::lang::XServiceInfo >
+{
+private:
+ SdCustomShow* mpSdCustomShow;
+ SdXImpressDocument* mpModel;
+
+ // for xComponent
+ ::osl::Mutex aDisposeContainerMutex;
+ ::comphelper::OInterfaceContainerHelper3<css::lang::XEventListener> aDisposeListeners;
+ bool bDisposing;
+
+public:
+ SdXCustomPresentation() noexcept;
+ explicit SdXCustomPresentation( SdCustomShow* mpSdCustomShow ) noexcept;
+ virtual ~SdXCustomPresentation() noexcept override;
+
+ // internal
+ SdCustomShow* GetSdCustomShow() const noexcept { return mpSdCustomShow; }
+ void SetSdCustomShow( SdCustomShow* pShow ) noexcept { mpSdCustomShow = pShow; }
+ SdXImpressDocument* GetModel() const noexcept { return mpModel; }
+
+ // uno helper
+ UNO3_GETIMPLEMENTATION_DECL(SdXCustomPresentation)
+
+ // 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;
+
+ // XIndexContainer
+ virtual void SAL_CALL insertByIndex( sal_Int32 Index, const css::uno::Any& Element ) override;
+ virtual void SAL_CALL removeByIndex( sal_Int32 Index ) override;
+
+ // XIndexReplace
+ virtual void SAL_CALL replaceByIndex( sal_Int32 Index, const css::uno::Any& Element ) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() override;
+
+ // XIndexAccess
+ virtual sal_Int32 SAL_CALL getCount() override ;
+ virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override;
+
+ // XNamed
+ virtual OUString SAL_CALL getName( ) override;
+ virtual void SAL_CALL setName( const OUString& aName ) override;
+
+ // XComponent
+ virtual void SAL_CALL dispose( ) override;
+ virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override;
+ virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override;
+};
+
+class SdXCustomPresentationAccess : public ::cppu::WeakImplHelper< css::container::XNameContainer,
+ css::lang::XSingleServiceFactory,
+ css::lang::XServiceInfo >
+{
+private:
+ SdXImpressDocument& mrModel;
+
+ // intern
+ inline SdCustomShowList* GetCustomShowList() const noexcept;
+ SdCustomShow * getSdCustomShow( std::u16string_view Name ) const noexcept;
+
+public:
+ explicit SdXCustomPresentationAccess(SdXImpressDocument& rMyModel) noexcept;
+ virtual ~SdXCustomPresentationAccess() noexcept 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;
+
+ // XSingleServiceFactory
+ virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance( ) override;
+ virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArguments( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
+
+ // XNameContainer
+ virtual void SAL_CALL insertByName( const OUString& aName, const css::uno::Any& aElement ) override;
+ virtual void SAL_CALL removeByName( const OUString& Name ) override;
+
+ // XNameReplace
+ virtual void SAL_CALL replaceByName( const OUString& aName, const css::uno::Any& aElement ) override;
+
+ // XNameAccess
+ virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override;
+ virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() override;
+};
+
+inline SdCustomShowList* SdXCustomPresentationAccess::GetCustomShowList() const noexcept
+{
+ if(mrModel.GetDoc())
+ return mrModel.GetDoc()->GetCustomShowList();
+ else
+ return nullptr;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unodoc.cxx b/sd/source/ui/unoidl/unodoc.cxx
new file mode 100644
index 000000000..cfb97c186
--- /dev/null
+++ b/sd/source/ui/unoidl/unodoc.cxx
@@ -0,0 +1,73 @@
+/* -*- 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 <sfx2/sfxmodelfactory.hxx>
+#include <com/sun/star/frame/XModel.hpp>
+
+#include <sddll.hxx>
+#include <DrawDocShell.hxx>
+#include <GraphicDocShell.hxx>
+#include <vcl/svapp.hxx>
+
+using namespace ::com::sun::star;
+
+// com.sun.star.comp.Draw.DrawingDocument
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+sd_DrawingDocument_get_implementation(
+ css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any> const& args)
+{
+ SolarMutexGuard aGuard;
+
+ SdDLL::Init();
+
+ css::uno::Reference<css::uno::XInterface> xInterface = sfx2::createSfxModelInstance(args,
+ [](SfxModelFlags _nCreationFlags)
+ {
+ SfxObjectShell* pShell = new ::sd::GraphicDocShell( _nCreationFlags );
+ return uno::Reference< uno::XInterface >( pShell->GetModel() );
+ });
+ xInterface->acquire();
+ return xInterface.get();
+}
+
+
+// com.sun.star.comp.Draw.PresentationDocument
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+sd_PresentationDocument_get_implementation(
+ css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any> const& args)
+{
+ SolarMutexGuard aGuard;
+
+ SdDLL::Init();
+
+ css::uno::Reference<css::uno::XInterface> xInterface = sfx2::createSfxModelInstance(args,
+ [](SfxModelFlags _nCreationFlags)
+ {
+ SfxObjectShell* pShell =
+ new ::sd::DrawDocShell(
+ _nCreationFlags, false, DocumentType::Impress );
+ return pShell->GetModel();
+ });
+ xInterface->acquire();
+ return xInterface.get();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unolayer.cxx b/sd/source/ui/unoidl/unolayer.cxx
new file mode 100644
index 000000000..c6bc3cdf3
--- /dev/null
+++ b/sd/source/ui/unoidl/unolayer.cxx
@@ -0,0 +1,707 @@
+/* -*- 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 <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+
+#include "unolayer.hxx"
+
+#include <comphelper/extract.hxx>
+#include <editeng/unoipset.hxx>
+#include <osl/diagnose.h>
+#include <svl/itemprop.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdobj.hxx>
+#include <cppuhelper/supportsservice.hxx>
+
+// following ones for InsertSdPage()
+#include <svx/svdlayer.hxx>
+
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <unomodel.hxx>
+#include <unoprnms.hxx>
+#include <com/sun/star/lang/NoSupportException.hpp>
+#include <svx/svdpool.hxx>
+#include <FrameView.hxx>
+#include <DrawViewShell.hxx>
+#include <View.hxx>
+#include <ViewShell.hxx>
+#include <strings.hrc>
+#include <sdresid.hxx>
+
+#include "unowcntr.hxx"
+#include <vcl/svapp.hxx>
+
+using namespace ::com::sun::star;
+
+// class SdLayer
+#define WID_LAYER_LOCKED 1
+#define WID_LAYER_PRINTABLE 2
+#define WID_LAYER_VISIBLE 3
+#define WID_LAYER_NAME 4
+#define WID_LAYER_TITLE 5
+#define WID_LAYER_DESC 6
+
+static const SvxItemPropertySet* ImplGetSdLayerPropertySet()
+{
+ static const SfxItemPropertyMapEntry aSdLayerPropertyMap_Impl[] =
+ {
+ { u"" UNO_NAME_LAYER_LOCKED, WID_LAYER_LOCKED, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"" UNO_NAME_LAYER_PRINTABLE, WID_LAYER_PRINTABLE,cppu::UnoType<bool>::get(), 0, 0 },
+ { u"" UNO_NAME_LAYER_VISIBLE, WID_LAYER_VISIBLE, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"" UNO_NAME_LAYER_NAME, WID_LAYER_NAME, ::cppu::UnoType<OUString>::get(), 0, 0 },
+ { u"Title", WID_LAYER_TITLE, ::cppu::UnoType<OUString>::get(), 0, 0 },
+ { u"Description", WID_LAYER_DESC, ::cppu::UnoType<OUString>::get(), 0, 0 },
+ { u"", 0, css::uno::Type(), 0, 0 }
+ };
+ static SvxItemPropertySet aSDLayerPropertySet_Impl( aSdLayerPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
+ return &aSDLayerPropertySet_Impl;
+}
+
+SdLayer::SdLayer(SdLayerManager* pLayerManager_, SdrLayer* pSdrLayer_)
+: mxLayerManager(pLayerManager_)
+, pLayer(pSdrLayer_)
+, pPropSet(ImplGetSdLayerPropertySet())
+{
+ // no defaults possible yet, a "set" would overwrite existing information
+ // in view, which is currently needed for saving, because pLayer is not updated
+ // from view.
+}
+
+SdLayer::~SdLayer() noexcept
+{
+}
+
+// uno helper
+UNO3_GETIMPLEMENTATION_IMPL( SdLayer );
+
+// XServiceInfo
+OUString SAL_CALL SdLayer::getImplementationName()
+{
+ return "SdUnoLayer";
+}
+
+sal_Bool SAL_CALL SdLayer::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+uno::Sequence< OUString > SAL_CALL SdLayer::getSupportedServiceNames()
+{
+ return { "com.sun.star.drawing.Layer" };
+}
+
+// beans::XPropertySet
+uno::Reference< beans::XPropertySetInfo > SAL_CALL SdLayer::getPropertySetInfo( )
+{
+ SolarMutexGuard aGuard;
+ return pPropSet->getPropertySetInfo();
+}
+
+void SAL_CALL SdLayer::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
+{
+ SolarMutexGuard aGuard;
+
+ if(pLayer == nullptr || mxLayerManager == nullptr)
+ throw lang::DisposedException();
+
+ const SfxItemPropertyMapEntry* pEntry = pPropSet->getPropertyMapEntry(aPropertyName);
+
+ switch( pEntry ? pEntry->nWID : -1 )
+ {
+ case WID_LAYER_LOCKED:
+ {
+ pLayer->SetLockedODF( cppu::any2bool(aValue) );
+ set(LOCKED, cppu::any2bool(aValue)); // changes the View, if any exists
+ break;
+ }
+ case WID_LAYER_PRINTABLE:
+ {
+ pLayer->SetPrintableODF( cppu::any2bool(aValue) );
+ set(PRINTABLE, cppu::any2bool(aValue)); // changes the View, if any exists
+ break;
+ }
+ case WID_LAYER_VISIBLE:
+ {
+ pLayer->SetVisibleODF( cppu::any2bool(aValue) );
+ set(VISIBLE, cppu::any2bool(aValue)); // changes the View, if any exists
+ break;
+ }
+ case WID_LAYER_NAME:
+ {
+ OUString aName;
+ if(!(aValue >>= aName))
+ throw lang::IllegalArgumentException();
+
+ pLayer->SetName(aName);
+ mxLayerManager->UpdateLayerView();
+ break;
+ }
+
+ case WID_LAYER_TITLE:
+ {
+ OUString sTitle;
+ if(!(aValue >>= sTitle))
+ throw lang::IllegalArgumentException();
+
+ pLayer->SetTitle(sTitle);
+ break;
+ }
+
+ case WID_LAYER_DESC:
+ {
+ OUString sDescription;
+ if(!(aValue >>= sDescription))
+ throw lang::IllegalArgumentException();
+
+ pLayer->SetDescription(sDescription);
+ break;
+ }
+
+ default:
+ throw beans::UnknownPropertyException( aPropertyName, static_cast<cppu::OWeakObject*>(this));
+ }
+
+ if( mxLayerManager->GetDocShell() )
+ mxLayerManager->GetDocShell()->SetModified();
+}
+
+uno::Any SAL_CALL SdLayer::getPropertyValue( const OUString& PropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ if(pLayer == nullptr || mxLayerManager == nullptr)
+ throw lang::DisposedException();
+
+ const SfxItemPropertyMapEntry* pEntry = pPropSet->getPropertyMapEntry(PropertyName);
+
+ uno::Any aValue;
+
+ switch( pEntry ? pEntry->nWID : -1 )
+ {
+ case WID_LAYER_LOCKED:
+ aValue <<= get( LOCKED );
+ break;
+ case WID_LAYER_PRINTABLE:
+ aValue <<= get( PRINTABLE );
+ break;
+ case WID_LAYER_VISIBLE:
+ aValue <<= get( VISIBLE );
+ break;
+ case WID_LAYER_NAME:
+ {
+ OUString aRet(pLayer->GetName());
+ aValue <<= aRet;
+ break;
+ }
+ case WID_LAYER_TITLE:
+ aValue <<= pLayer->GetTitle();
+ break;
+ case WID_LAYER_DESC:
+ aValue <<= pLayer->GetDescription();
+ break;
+ default:
+ throw beans::UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this));
+ }
+
+ return aValue;
+}
+
+void SAL_CALL SdLayer::addPropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) {}
+void SAL_CALL SdLayer::removePropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) {}
+void SAL_CALL SdLayer::addVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) {}
+void SAL_CALL SdLayer::removeVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) {}
+
+bool SdLayer::get( LayerAttribute what ) noexcept
+{
+ if(pLayer && mxLayerManager.is())
+ {
+ // Try 1. is an arbitrary page open?
+ ::sd::View *pView = mxLayerManager->GetView();
+ SdrPageView* pSdrPageView = nullptr;
+ if(pView)
+ pSdrPageView = pView->GetSdrPageView();
+
+ if(pSdrPageView)
+ {
+ OUString aLayerName = pLayer->GetName();
+ switch(what)
+ {
+ case VISIBLE: return pSdrPageView->IsLayerVisible(aLayerName);
+ case PRINTABLE: return pSdrPageView->IsLayerPrintable(aLayerName);
+ case LOCKED: return pSdrPageView->IsLayerLocked(aLayerName);
+ }
+ }
+
+ // Try 2. get info from FrameView
+ if(mxLayerManager->GetDocShell())
+ {
+ ::sd::FrameView *pFrameView = mxLayerManager->GetDocShell()->GetFrameView();
+ if(pFrameView)
+ switch(what)
+ {
+ case VISIBLE: return pFrameView->GetVisibleLayers().IsSet(pLayer->GetID());
+ case PRINTABLE: return pFrameView->GetPrintableLayers().IsSet(pLayer->GetID());
+ case LOCKED: return pFrameView->GetLockedLayers().IsSet(pLayer->GetID());
+ }
+ }
+
+ // no view at all, e.g. Draw embedded as OLE in text document, ODF default values
+ switch(what)
+ {
+ case VISIBLE: return true;
+ case PRINTABLE: return true;
+ case LOCKED: return false;
+ }
+
+ }
+ return false; //TODO: uno::Exception?
+}
+
+void SdLayer::set( LayerAttribute what, bool flag ) noexcept
+{
+ if(!(pLayer && mxLayerManager.is()))
+ return;
+
+ // Try 1. is an arbitrary page open?
+ ::sd::View *pView = mxLayerManager->GetView();
+ SdrPageView* pSdrPageView = nullptr;
+ if(pView)
+ pSdrPageView = pView->GetSdrPageView();
+
+ if(pSdrPageView)
+ {
+ OUString aLayerName(pLayer->GetName());
+ switch(what)
+ {
+ case VISIBLE: pSdrPageView->SetLayerVisible(aLayerName,flag);
+ break;
+ case PRINTABLE: pSdrPageView->SetLayerPrintable(aLayerName,flag);
+ break;
+ case LOCKED: pSdrPageView->SetLayerLocked(aLayerName,flag);
+ break;
+ }
+ }
+
+ // Try 2. get info from FrameView
+ if(!mxLayerManager->GetDocShell())
+ return;
+
+ ::sd::FrameView *pFrameView = mxLayerManager->GetDocShell()->GetFrameView();
+
+ if(!pFrameView)
+ return;
+
+ SdrLayerIDSet aNewLayers;
+ switch(what)
+ {
+ case VISIBLE: aNewLayers = pFrameView->GetVisibleLayers();
+ break;
+ case PRINTABLE: aNewLayers = pFrameView->GetPrintableLayers();
+ break;
+ case LOCKED: aNewLayers = pFrameView->GetLockedLayers();
+ break;
+ }
+
+ aNewLayers.Set(pLayer->GetID(),flag);
+
+ switch(what)
+ {
+ case VISIBLE: pFrameView->SetVisibleLayers(aNewLayers);
+ break;
+ case PRINTABLE: pFrameView->SetPrintableLayers(aNewLayers);
+ break;
+ case LOCKED: pFrameView->SetLockedLayers(aNewLayers);
+ break;
+ }
+ return;
+ //TODO: uno::Exception?
+}
+
+// css::container::XChild
+uno::Reference<uno::XInterface> SAL_CALL SdLayer::getParent()
+{
+ SolarMutexGuard aGuard;
+
+ if( !mxLayerManager.is() )
+ throw lang::DisposedException();
+
+ return uno::Reference<uno::XInterface> (static_cast<cppu::OWeakObject*>(mxLayerManager.get()), uno::UNO_QUERY);
+}
+
+void SAL_CALL SdLayer::setParent (const uno::Reference<uno::XInterface >& )
+{
+ throw lang::NoSupportException ();
+}
+
+// XComponent
+void SAL_CALL SdLayer::dispose( )
+{
+ mxLayerManager.clear();
+ pLayer = nullptr;
+}
+
+void SAL_CALL SdLayer::addEventListener( const uno::Reference< lang::XEventListener >& )
+{
+ OSL_FAIL("not implemented!");
+}
+
+void SAL_CALL SdLayer::removeEventListener( const uno::Reference< lang::XEventListener >& )
+{
+ OSL_FAIL("not implemented!");
+}
+
+// class SdLayerManager
+SdLayerManager::SdLayerManager( SdXImpressDocument& rMyModel ) noexcept
+:mpModel( &rMyModel)
+{
+ mpLayers.reset(new SvUnoWeakContainer);
+}
+
+SdLayerManager::~SdLayerManager() noexcept
+{
+ dispose();
+}
+
+// uno helper
+UNO3_GETIMPLEMENTATION_IMPL( SdLayerManager );
+
+// XComponent
+void SAL_CALL SdLayerManager::dispose( )
+{
+ mpModel = nullptr;
+ if( mpLayers )
+ {
+ mpLayers->dispose();
+ mpLayers.reset();
+ }
+}
+
+void SAL_CALL SdLayerManager::addEventListener( const uno::Reference< lang::XEventListener >& )
+{
+ OSL_FAIL("not implemented!");
+}
+
+void SAL_CALL SdLayerManager::removeEventListener( const uno::Reference< lang::XEventListener >& )
+{
+ OSL_FAIL("not implemented!");
+}
+
+// XServiceInfo
+OUString SAL_CALL SdLayerManager::getImplementationName()
+{
+ return "SdUnoLayerManager";
+}
+
+sal_Bool SAL_CALL SdLayerManager::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+uno::Sequence< OUString > SAL_CALL SdLayerManager::getSupportedServiceNames()
+{
+ return {"com.sun.star.drawing.LayerManager"};
+}
+
+// XLayerManager
+uno::Reference< drawing::XLayer > SAL_CALL SdLayerManager::insertNewByIndex( sal_Int32 nIndex )
+{
+ SolarMutexGuard aGuard;
+
+ if( mpModel == nullptr )
+ throw lang::DisposedException();
+
+ uno::Reference< drawing::XLayer > xLayer;
+
+ if( mpModel->mpDoc )
+ {
+ SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
+ sal_uInt16 nLayerCnt = rLayerAdmin.GetLayerCount();
+ sal_Int32 nLayer = nLayerCnt - 2 + 1;
+ OUString aLayerName;
+
+ // Test for existing names
+ while( aLayerName.isEmpty() || rLayerAdmin.GetLayer( aLayerName ) )
+ {
+ aLayerName = SdResId(STR_LAYER) + OUString::number(nLayer);
+ ++nLayer;
+ }
+
+ SdrLayerAdmin& rLA=mpModel->mpDoc->GetLayerAdmin();
+ const sal_Int32 nMax=rLA.GetLayerCount();
+ if (nIndex>nMax) nIndex=nMax;
+ xLayer = GetLayer (rLA.NewLayer(aLayerName,static_cast<sal_uInt16>(nIndex)));
+ mpModel->SetModified();
+ }
+ return xLayer;
+}
+
+void SAL_CALL SdLayerManager::remove( const uno::Reference< drawing::XLayer >& xLayer )
+{
+ SolarMutexGuard aGuard;
+
+ if( mpModel == nullptr )
+ throw lang::DisposedException();
+
+ SdLayer* pSdLayer = comphelper::getFromUnoTunnel<SdLayer>(xLayer);
+
+ if(pSdLayer && GetView())
+ {
+ const SdrLayer* pSdrLayer = pSdLayer->GetSdrLayer();
+ GetView()->DeleteLayer( pSdrLayer->GetName() );
+
+ UpdateLayerView();
+ }
+
+ mpModel->SetModified();
+}
+
+void SAL_CALL SdLayerManager::attachShapeToLayer( const uno::Reference< drawing::XShape >& xShape, const uno::Reference< drawing::XLayer >& xLayer )
+{
+ SolarMutexGuard aGuard;
+
+ if( mpModel == nullptr )
+ throw lang::DisposedException();
+
+ SdLayer* pSdLayer = comphelper::getFromUnoTunnel<SdLayer>(xLayer);
+ SdrLayer* pSdrLayer = pSdLayer?pSdLayer->GetSdrLayer():nullptr;
+ if(pSdrLayer==nullptr)
+ return;
+
+ SdrObject* pSdrObject = SdrObject::getSdrObjectFromXShape( xShape );
+
+ if(pSdrObject)
+ pSdrObject->SetLayer(pSdrLayer->GetID());
+
+ mpModel->SetModified();
+}
+
+uno::Reference< drawing::XLayer > SAL_CALL SdLayerManager::getLayerForShape( const uno::Reference< drawing::XShape >& xShape )
+{
+ SolarMutexGuard aGuard;
+
+ if( mpModel == nullptr )
+ throw lang::DisposedException();
+
+ uno::Reference< drawing::XLayer > xLayer;
+
+ if(mpModel->mpDoc)
+ {
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xShape );
+ if(pObj)
+ {
+ SdrLayerID aId = pObj->GetLayer();
+ SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
+ xLayer = GetLayer (rLayerAdmin.GetLayerPerID(aId));
+ }
+ }
+ return xLayer;
+}
+
+// XIndexAccess
+sal_Int32 SAL_CALL SdLayerManager::getCount()
+{
+ SolarMutexGuard aGuard;
+
+ if( mpModel == nullptr )
+ throw lang::DisposedException();
+
+ if( mpModel->mpDoc )
+ {
+ SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
+ return rLayerAdmin.GetLayerCount();
+ }
+
+ return 0;
+}
+
+uno::Any SAL_CALL SdLayerManager::getByIndex( sal_Int32 nLayer )
+{
+ SolarMutexGuard aGuard;
+
+ if( mpModel == nullptr )
+ throw lang::DisposedException();
+
+ if( nLayer >= getCount() || nLayer < 0 )
+ throw lang::IndexOutOfBoundsException();
+
+ uno::Any aAny;
+
+ if( mpModel->mpDoc )
+ {
+ SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
+ uno::Reference<drawing::XLayer> xLayer (GetLayer (rLayerAdmin.GetLayer(static_cast<sal_uInt16>(nLayer))));
+ aAny <<= xLayer;
+ }
+ return aAny;
+}
+
+// XNameAccess
+uno::Any SAL_CALL SdLayerManager::getByName( const OUString& aName )
+{
+ SolarMutexGuard aGuard;
+
+ if( (mpModel == nullptr) || (mpModel->mpDoc == nullptr ) )
+ throw lang::DisposedException();
+
+ SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
+ SdrLayer* pLayer = rLayerAdmin.GetLayer(aName);
+ if( pLayer == nullptr )
+ throw container::NoSuchElementException();
+
+ return uno::Any( GetLayer (pLayer) );
+}
+
+uno::Sequence< OUString > SAL_CALL SdLayerManager::getElementNames()
+{
+ SolarMutexGuard aGuard;
+
+ if( mpModel == nullptr )
+ throw lang::DisposedException();
+
+ SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
+ const sal_uInt16 nLayerCount = rLayerAdmin.GetLayerCount();
+
+ uno::Sequence< OUString > aSeq( nLayerCount );
+
+ OUString* pStrings = aSeq.getArray();
+
+ for( sal_uInt16 nLayer = 0; nLayer < nLayerCount; nLayer++ )
+ {
+ SdrLayer* pLayer = rLayerAdmin.GetLayer( nLayer );
+ if( pLayer )
+ *pStrings++ = pLayer->GetName();
+ }
+
+ return aSeq;
+}
+
+sal_Bool SAL_CALL SdLayerManager::hasByName( const OUString& aName )
+{
+ SolarMutexGuard aGuard;
+
+ if( mpModel == nullptr )
+ throw lang::DisposedException();
+
+ SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
+
+ return nullptr != rLayerAdmin.GetLayer(aName);
+}
+
+// XElementAccess
+uno::Type SAL_CALL SdLayerManager::getElementType()
+{
+ return cppu::UnoType<drawing::XLayer>::get();
+}
+
+sal_Bool SAL_CALL SdLayerManager::hasElements()
+{
+ return getCount() > 0;
+}
+
+/**
+ * If something was changed at the layers, this methods takes care that the
+ * changes are made visible in sdbcx::View.
+ */
+void SdLayerManager::UpdateLayerView() const noexcept
+{
+ if(!mpModel->mpDocShell)
+ return;
+
+ ::sd::DrawViewShell* pDrViewSh = dynamic_cast< ::sd::DrawViewShell* >( mpModel->mpDocShell->GetViewShell());
+
+ if(pDrViewSh)
+ {
+ bool bLayerMode = pDrViewSh->IsLayerModeActive();
+ pDrViewSh->ChangeEditMode(pDrViewSh->GetEditMode(), !bLayerMode);
+ pDrViewSh->ChangeEditMode(pDrViewSh->GetEditMode(), bLayerMode);
+ }
+
+ mpModel->mpDoc->SetChanged();
+}
+
+/** */
+::sd::View* SdLayerManager::GetView() const noexcept
+{
+ if( mpModel->mpDocShell )
+ {
+ ::sd::ViewShell* pViewSh = mpModel->mpDocShell->GetViewShell();
+ if(pViewSh)
+ return pViewSh->GetView();
+ }
+ return nullptr;
+}
+
+namespace
+{
+/** Compare two pointers to <type>SdrLayer</type> objects.
+ @param xRef
+ The implementing SdLayer class provides the first pointer by the
+ <member>SdLayer::GetSdrLayer</member> method.
+ @param pSearchData
+ This void pointer is the second pointer to an <type>SdrLayer</type>
+ object.
+ @return
+ Return </True> if both pointers point to the same object.
+*/
+bool compare_layers (const uno::WeakReference<uno::XInterface>& xRef, void const * pSearchData)
+{
+ uno::Reference<uno::XInterface> xLayer (xRef);
+ if (xLayer.is())
+ {
+ SdLayer* pSdLayer = comphelper::getFromUnoTunnel<SdLayer> (xRef);
+ if (pSdLayer != nullptr)
+ {
+ SdrLayer* pSdrLayer = pSdLayer->GetSdrLayer ();
+ if (pSdrLayer == static_cast<SdrLayer const *>(pSearchData))
+ return true;
+ }
+ }
+ return false;
+}
+}
+
+/** Use the <member>mpLayers</member> container of weak references to either
+ retrieve and return a previously created <type>XLayer</type> object for
+ the given <type>SdrLayer</type> object or create and remember a new one.
+*/
+uno::Reference<drawing::XLayer> SdLayerManager::GetLayer (SdrLayer* pLayer)
+{
+ uno::WeakReference<uno::XInterface> xRef;
+ uno::Reference<drawing::XLayer> xLayer;
+
+ // Search existing xLayer for the given pLayer.
+ if (mpLayers->findRef (xRef, static_cast<void*>(pLayer), compare_layers))
+ xLayer.set(xRef, uno::UNO_QUERY);
+
+ // Create the xLayer if necessary.
+ if ( ! xLayer.is())
+ {
+ xLayer = new SdLayer (this, pLayer);
+
+ // Remember the new xLayer for future calls.
+ uno::WeakReference<uno::XInterface> wRef(xLayer);
+ mpLayers->insert(wRef);
+ }
+
+ return xLayer;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unolayer.hxx b/sd/source/ui/unoidl/unolayer.hxx
new file mode 100644
index 000000000..aa7d4891b
--- /dev/null
+++ b/sd/source/ui/unoidl/unolayer.hxx
@@ -0,0 +1,169 @@
+/* -*- 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 .
+ */
+#pragma once
+
+#include <com/sun/star/drawing/XLayer.hpp>
+#include <com/sun/star/drawing/XLayerManager.hpp>
+
+#include <cppuhelper/implbase.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <rtl/ref.hxx>
+
+#include <unomodel.hxx>
+
+class SdrLayer;
+class SdLayerManager;
+class SvUnoWeakContainer;
+
+namespace sd {
+class View;
+}
+enum LayerAttribute { VISIBLE, PRINTABLE, LOCKED };
+
+/***********************************************************************
+* *
+***********************************************************************/
+class SdLayer : public ::cppu::WeakImplHelper< css::drawing::XLayer,
+ css::lang::XServiceInfo,
+ css::container::XChild,
+ css::lang::XUnoTunnel,
+ css::lang::XComponent >
+{
+public:
+ SdLayer(SdLayerManager* pLayerManager_, SdrLayer* pSdrLayer_);
+ virtual ~SdLayer() noexcept override;
+
+ // intern
+ SdrLayer* GetSdrLayer() const noexcept { return pLayer; }
+
+ // uno helper
+ UNO3_GETIMPLEMENTATION_DECL( SdLayer )
+
+ // 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;
+
+ // css::beans::XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override;
+ virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override;
+ virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override;
+ virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+ virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+
+ // css::container::XChild
+
+ /** Returns the layer manager that manages this layer.
+ */
+ virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getParent( ) override;
+
+ // XComponent
+ virtual void SAL_CALL dispose( ) override;
+ virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override;
+ virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override;
+
+ /** Not implemented. Always throws an exception.
+ @throws NoSupportException.
+ */
+ virtual void SAL_CALL setParent( const css::uno::Reference< css::uno::XInterface >& Parent ) override;
+
+private:
+ rtl::Reference<SdLayerManager> mxLayerManager;
+ SdrLayer* pLayer;
+ const SvxItemPropertySet* pPropSet;
+
+ bool get( LayerAttribute what ) noexcept;
+ void set( LayerAttribute what, bool flag ) noexcept;
+
+};
+
+/***********************************************************************
+* *
+***********************************************************************/
+
+class SdLayerManager : public ::cppu::WeakImplHelper< css::drawing::XLayerManager,
+ css::container::XNameAccess,
+ css::lang::XServiceInfo,
+ css::lang::XUnoTunnel,
+ css::lang::XComponent >
+{
+ friend class SdLayer;
+
+public:
+ explicit SdLayerManager( SdXImpressDocument& rMyModel ) noexcept;
+ virtual ~SdLayerManager() noexcept override;
+
+ // uno helper
+ UNO3_GETIMPLEMENTATION_DECL( SdLayerManager )
+
+ // 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;
+
+ // XLayerManager
+ virtual css::uno::Reference< css::drawing::XLayer > SAL_CALL insertNewByIndex( sal_Int32 nIndex ) override;
+ virtual void SAL_CALL remove( const css::uno::Reference< css::drawing::XLayer >& xLayer ) override;
+ virtual void SAL_CALL attachShapeToLayer( const css::uno::Reference< css::drawing::XShape >& xShape, const css::uno::Reference< css::drawing::XLayer >& xLayer ) override;
+ virtual css::uno::Reference< css::drawing::XLayer > SAL_CALL getLayerForShape( const css::uno::Reference< css::drawing::XShape >& xShape ) override;
+
+ // XIndexAccess
+ virtual sal_Int32 SAL_CALL getCount() override ;
+ virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override;
+
+ // XNameAccess
+ virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override;
+ virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() override;
+
+ /** Return the <type>XLayer</type> object that is associated with the
+ given <type>SdrLayer</type> object. If the requested object does
+ not yet exist it is created. All calls with the same argument
+ return the same object.
+ @param pLayer
+ The <type>SdrLayer</type> object for which to return the
+ associated <type>XLayer</type> object.
+ @return
+ The returned value is the unique <type>XLayer</type> object
+ associated with the specified argument. If no layer can be
+ created for the argument than an empty reference is returned.
+ */
+ css::uno::Reference< css::drawing::XLayer> GetLayer (SdrLayer* pLayer);
+
+ // XComponent
+ virtual void SAL_CALL dispose( ) override;
+ virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override;
+ virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override;
+
+private:
+ SdXImpressDocument* mpModel;
+ std::unique_ptr<SvUnoWeakContainer> mpLayers;
+
+ ::sd::View* GetView() const noexcept;
+ ::sd::DrawDocShell* GetDocShell() const noexcept { return mpModel->mpDocShell; }
+ void UpdateLayerView() const noexcept;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
new file mode 100644
index 000000000..758ce1380
--- /dev/null
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -0,0 +1,3491 @@
+/* -*- 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 <memory>
+
+#include <com/sun/star/presentation/XPresentation2.hpp>
+
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <com/sun/star/lang/ServiceNotRegisteredException.hpp>
+#include <com/sun/star/lang/Locale.hpp>
+#include <com/sun/star/awt/XDevice.hpp>
+#include <com/sun/star/document/IndexedPropertyValues.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+
+#include <com/sun/star/embed/Aspects.hpp>
+
+#include <officecfg/Office/Common.hxx>
+#include <comphelper/indexedpropertyvalues.hxx>
+#include <comphelper/lok.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <comphelper/sequence.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/profilezone.hxx>
+
+#include <sal/log.hxx>
+#include <editeng/unofield.hxx>
+#include <notifydocumentevent.hxx>
+#include <tpaction.hxx>
+#include <unomodel.hxx>
+#include "unopool.hxx"
+#include <sfx2/lokhelper.hxx>
+#include <sfx2/dispatch.hxx>
+#include <vcl/svapp.hxx>
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+
+#include <editeng/UnoForbiddenCharsTable.hxx>
+#include <svx/svdoutl.hxx>
+#include <o3tl/safeint.hxx>
+#include <o3tl/string_view.hxx>
+#include <o3tl/unit_conversion.hxx>
+#include <svx/UnoNamespaceMap.hxx>
+#include <svx/svdlayer.hxx>
+#include <svx/svdsob.hxx>
+#include <svx/svdundo.hxx>
+#include <svx/unoapi.hxx>
+#include <svx/unofill.hxx>
+#include <svx/sdrpagewindow.hxx>
+#include <svx/sdrpaintwindow.hxx>
+#include <editeng/fontitem.hxx>
+#include <toolkit/awt/vclxdevice.hxx>
+#include <svx/svdpool.hxx>
+#include <svx/svdpagv.hxx>
+#include <svtools/unoimap.hxx>
+#include <svtools/slidesorterbaropt.hxx>
+#include <svx/unoshape.hxx>
+#include <editeng/unonrule.hxx>
+#include <editeng/eeitem.hxx>
+#include <unotools/datetime.hxx>
+#include <xmloff/autolayout.hxx>
+
+// Support creation of GraphicStorageHandler and EmbeddedObjectResolver
+#include <svx/xmleohlp.hxx>
+#include <svx/xmlgrhlp.hxx>
+#include <DrawDocShell.hxx>
+#include <ViewShellBase.hxx>
+#include "UnoDocumentSettings.hxx"
+
+#include <Annotation.hxx>
+#include <drawdoc.hxx>
+#include <sdmod.hxx>
+#include <sdresid.hxx>
+#include <sdpage.hxx>
+
+#include <strings.hrc>
+#include <strings.hxx>
+#include "unolayer.hxx"
+#include <unopage.hxx>
+#include "unocpres.hxx"
+#include "unoobj.hxx"
+#include <stlpool.hxx>
+#include "unopback.hxx"
+#include <unokywds.hxx>
+
+#include <FrameView.hxx>
+#include <ClientView.hxx>
+#include <DrawViewShell.hxx>
+#include <ViewShell.hxx>
+#include <Window.hxx>
+#include <optsitem.hxx>
+
+#include <vcl/pdfextoutdevdata.hxx>
+#include <com/sun/star/presentation/AnimationSpeed.hpp>
+#include <com/sun/star/presentation/ClickAction.hpp>
+#include <svx/sdr/contact/viewobjectcontact.hxx>
+#include <svx/sdr/contact/viewcontact.hxx>
+#include <svx/sdr/contact/displayinfo.hxx>
+
+#include <com/sun/star/office/XAnnotation.hpp>
+#include <com/sun/star/office/XAnnotationAccess.hpp>
+#include <com/sun/star/office/XAnnotationEnumeration.hpp>
+#include <com/sun/star/geometry/RealPoint2D.hpp>
+#include <com/sun/star/util/DateTime.hpp>
+
+#include <drawinglayer/primitive2d/structuretagprimitive2d.hxx>
+
+#include <sfx2/lokcomponenthelpers.hxx>
+#include <tools/gen.hxx>
+#include <tools/debug.hxx>
+#include <tools/diagnose_ex.h>
+#include <tools/json_writer.hxx>
+#include <tools/UnitConversion.hxx>
+#include <svx/ColorSets.hxx>
+
+#include <app.hrc>
+
+using namespace ::cppu;
+using namespace ::com::sun::star;
+using namespace ::sd;
+
+TranslateId SdTPAction::GetClickActionSdResId( presentation::ClickAction eCA )
+{
+ switch( eCA )
+ {
+ case presentation::ClickAction_NONE: return STR_CLICK_ACTION_NONE;
+ case presentation::ClickAction_PREVPAGE: return STR_CLICK_ACTION_PREVPAGE;
+ case presentation::ClickAction_NEXTPAGE: return STR_CLICK_ACTION_NEXTPAGE;
+ case presentation::ClickAction_FIRSTPAGE: return STR_CLICK_ACTION_FIRSTPAGE;
+ case presentation::ClickAction_LASTPAGE: return STR_CLICK_ACTION_LASTPAGE;
+ case presentation::ClickAction_BOOKMARK: return STR_CLICK_ACTION_BOOKMARK;
+ case presentation::ClickAction_DOCUMENT: return STR_CLICK_ACTION_DOCUMENT;
+ case presentation::ClickAction_PROGRAM: return STR_CLICK_ACTION_PROGRAM;
+ case presentation::ClickAction_MACRO: return STR_CLICK_ACTION_MACRO;
+ case presentation::ClickAction_SOUND: return STR_CLICK_ACTION_SOUND;
+ case presentation::ClickAction_VERB: return STR_CLICK_ACTION_VERB;
+ case presentation::ClickAction_STOPPRESENTATION: return STR_CLICK_ACTION_STOPPRESENTATION;
+ default: OSL_FAIL( "No StringResource for ClickAction available!" );
+ }
+ return {};
+}
+
+namespace {
+
+class SdUnoForbiddenCharsTable : public SvxUnoForbiddenCharsTable,
+ public SfxListener
+{
+public:
+ explicit SdUnoForbiddenCharsTable(SdrModel* pModel);
+ virtual ~SdUnoForbiddenCharsTable() override;
+
+ // SfxListener
+ virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) noexcept override;
+protected:
+ virtual void onChange() override;
+
+private:
+ SdrModel* mpModel;
+};
+
+}
+
+SdUnoForbiddenCharsTable::SdUnoForbiddenCharsTable( SdrModel* pModel )
+: SvxUnoForbiddenCharsTable( pModel->GetForbiddenCharsTable() ), mpModel( pModel )
+{
+ StartListening( *pModel );
+}
+
+void SdUnoForbiddenCharsTable::onChange()
+{
+ if( mpModel )
+ {
+ mpModel->ReformatAllTextObjects();
+ }
+}
+
+SdUnoForbiddenCharsTable::~SdUnoForbiddenCharsTable()
+{
+ SolarMutexGuard g;
+
+ if( mpModel )
+ EndListening( *mpModel );
+}
+
+void SdUnoForbiddenCharsTable::Notify( SfxBroadcaster&, const SfxHint& rHint ) noexcept
+{
+ if (rHint.GetId() != SfxHintId::ThisIsAnSdrHint)
+ return;
+ const SdrHint* pSdrHint = static_cast<const SdrHint*>( &rHint );
+ if( SdrHintKind::ModelCleared == pSdrHint->GetKind() )
+ {
+ mpModel = nullptr;
+ }
+}
+
+const sal_uInt16 WID_MODEL_LANGUAGE = 1;
+const sal_uInt16 WID_MODEL_TABSTOP = 2;
+const sal_uInt16 WID_MODEL_VISAREA = 3;
+const sal_uInt16 WID_MODEL_MAPUNIT = 4;
+const sal_uInt16 WID_MODEL_FORBCHARS = 5;
+const sal_uInt16 WID_MODEL_CONTFOCUS = 6;
+const sal_uInt16 WID_MODEL_DSGNMODE = 7;
+const sal_uInt16 WID_MODEL_BASICLIBS = 8;
+const sal_uInt16 WID_MODEL_RUNTIMEUID = 9;
+const sal_uInt16 WID_MODEL_BUILDID = 10;
+const sal_uInt16 WID_MODEL_HASVALIDSIGNATURES = 11;
+const sal_uInt16 WID_MODEL_DIALOGLIBS = 12;
+const sal_uInt16 WID_MODEL_FONTS = 13;
+const sal_uInt16 WID_MODEL_INTEROPGRABBAG = 14;
+const sal_uInt16 WID_MODEL_THEME = 15;
+
+static const SvxItemPropertySet* ImplGetDrawModelPropertySet()
+{
+ // Attention: the first parameter HAS TO BE sorted!!!
+ const static SfxItemPropertyMapEntry aDrawModelPropertyMap_Impl[] =
+ {
+ { u"BuildId", WID_MODEL_BUILDID, ::cppu::UnoType<OUString>::get(), 0, 0},
+ { sUNO_Prop_CharLocale, WID_MODEL_LANGUAGE, ::cppu::UnoType<lang::Locale>::get(), 0, 0},
+ { sUNO_Prop_TabStop, WID_MODEL_TABSTOP, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { sUNO_Prop_VisibleArea, WID_MODEL_VISAREA, ::cppu::UnoType<awt::Rectangle>::get(), 0, 0},
+ { sUNO_Prop_MapUnit, WID_MODEL_MAPUNIT, ::cppu::UnoType<sal_Int16>::get(), beans::PropertyAttribute::READONLY, 0},
+ { sUNO_Prop_ForbiddenCharacters, WID_MODEL_FORBCHARS, cppu::UnoType<i18n::XForbiddenCharacters>::get(), beans::PropertyAttribute::READONLY, 0},
+ { sUNO_Prop_AutomContFocus, WID_MODEL_CONTFOCUS, cppu::UnoType<bool>::get(), 0, 0},
+ { sUNO_Prop_ApplyFrmDsgnMode, WID_MODEL_DSGNMODE, cppu::UnoType<bool>::get(), 0, 0},
+ { u"BasicLibraries", WID_MODEL_BASICLIBS, cppu::UnoType<script::XLibraryContainer>::get(), beans::PropertyAttribute::READONLY, 0},
+ { u"DialogLibraries", WID_MODEL_DIALOGLIBS, cppu::UnoType<script::XLibraryContainer>::get(), beans::PropertyAttribute::READONLY, 0},
+ { sUNO_Prop_RuntimeUID, WID_MODEL_RUNTIMEUID, ::cppu::UnoType<OUString>::get(), beans::PropertyAttribute::READONLY, 0},
+ { sUNO_Prop_HasValidSignatures, WID_MODEL_HASVALIDSIGNATURES, ::cppu::UnoType<sal_Bool>::get(), beans::PropertyAttribute::READONLY, 0},
+ { u"Fonts", WID_MODEL_FONTS, cppu::UnoType<uno::Sequence<uno::Any>>::get(), beans::PropertyAttribute::READONLY, 0},
+ { sUNO_Prop_InteropGrabBag, WID_MODEL_INTEROPGRABBAG, cppu::UnoType<uno::Sequence< beans::PropertyValue >>::get(), 0, 0},
+ { sUNO_Prop_Theme, WID_MODEL_THEME, cppu::UnoType<uno::Sequence< beans::PropertyValue >>::get(), 0, 0},
+ { u"", 0, css::uno::Type(), 0, 0 }
+ };
+ static SvxItemPropertySet aDrawModelPropertySet_Impl( aDrawModelPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
+ return &aDrawModelPropertySet_Impl;
+}
+
+// this ctor is used from the DocShell
+SdXImpressDocument::SdXImpressDocument(::sd::DrawDocShell* pShell, bool bClipBoard)
+: SfxBaseModel( pShell ),
+ mpDocShell( pShell ),
+ mpDoc( pShell ? pShell->GetDoc() : nullptr ),
+ mbDisposed(false),
+ mbImpressDoc( pShell && pShell->GetDoc() && pShell->GetDoc()->GetDocumentType() == DocumentType::Impress ),
+ mbClipBoard( bClipBoard ),
+ mpPropSet( ImplGetDrawModelPropertySet() )
+{
+ if( mpDoc )
+ {
+ StartListening( *mpDoc );
+ }
+ else
+ {
+ OSL_FAIL("DocShell is invalid");
+ }
+}
+
+SdXImpressDocument::SdXImpressDocument(SdDrawDocument* pDoc, bool bClipBoard)
+: SfxBaseModel( nullptr ),
+ mpDocShell( nullptr ),
+ mpDoc( pDoc ),
+ mbDisposed(false),
+ mbImpressDoc( pDoc && pDoc->GetDocumentType() == DocumentType::Impress ),
+ mbClipBoard( bClipBoard ),
+ mpPropSet( ImplGetDrawModelPropertySet() )
+{
+ if( mpDoc )
+ {
+ StartListening( *mpDoc );
+ }
+ else
+ {
+ OSL_FAIL("SdDrawDocument is invalid");
+ }
+}
+
+/***********************************************************************
+* *
+***********************************************************************/
+SdXImpressDocument::~SdXImpressDocument() noexcept
+{
+}
+
+// XInterface
+uno::Any SAL_CALL SdXImpressDocument::queryInterface( const uno::Type & rType )
+{
+ uno::Any aAny;
+
+ if (rType == cppu::UnoType<lang::XServiceInfo>::get())
+ aAny <<= uno::Reference<lang::XServiceInfo>(this);
+ else if (rType == cppu::UnoType<beans::XPropertySet>::get())
+ aAny <<= uno::Reference<beans::XPropertySet>(this);
+ else if (rType == cppu::UnoType<lang::XMultiServiceFactory>::get())
+ aAny <<= uno::Reference<lang::XMultiServiceFactory>(this);
+ else if (rType == cppu::UnoType<drawing::XDrawPageDuplicator>::get())
+ aAny <<= uno::Reference<drawing::XDrawPageDuplicator>(this);
+ else if (rType == cppu::UnoType<drawing::XLayerSupplier>::get())
+ aAny <<= uno::Reference<drawing::XLayerSupplier>(this);
+ else if (rType == cppu::UnoType<drawing::XMasterPagesSupplier>::get())
+ aAny <<= uno::Reference<drawing::XMasterPagesSupplier>(this);
+ else if (rType == cppu::UnoType<drawing::XDrawPagesSupplier>::get())
+ aAny <<= uno::Reference<drawing::XDrawPagesSupplier>(this);
+ else if (rType == cppu::UnoType<presentation::XHandoutMasterSupplier>::get())
+ aAny <<= uno::Reference<presentation::XHandoutMasterSupplier>(this);
+ else if (rType == cppu::UnoType<document::XLinkTargetSupplier>::get())
+ aAny <<= uno::Reference<document::XLinkTargetSupplier>(this);
+ else if (rType == cppu::UnoType<style::XStyleFamiliesSupplier>::get())
+ aAny <<= uno::Reference<style::XStyleFamiliesSupplier>(this);
+ else if (rType == cppu::UnoType<css::ucb::XAnyCompareFactory>::get())
+ aAny <<= uno::Reference<css::ucb::XAnyCompareFactory>(this);
+ else if (rType == cppu::UnoType<view::XRenderable>::get())
+ aAny <<= uno::Reference<view::XRenderable>(this);
+ else if (mbImpressDoc && rType == cppu::UnoType<presentation::XPresentationSupplier>::get())
+ aAny <<= uno::Reference< presentation::XPresentationSupplier >(this);
+ else if (mbImpressDoc && rType == cppu::UnoType<presentation::XCustomPresentationSupplier>::get())
+ aAny <<= uno::Reference< presentation::XCustomPresentationSupplier >(this);
+ else
+ return SfxBaseModel::queryInterface(rType);
+
+ return aAny;
+}
+
+void SAL_CALL SdXImpressDocument::acquire() noexcept
+{
+ SfxBaseModel::acquire();
+}
+
+void SAL_CALL SdXImpressDocument::release() noexcept
+{
+ if (osl_atomic_decrement( &m_refCount ) != 0)
+ return;
+
+ // restore reference count:
+ osl_atomic_increment( &m_refCount );
+ if(!mbDisposed)
+ {
+ try
+ {
+ dispose();
+ }
+ catch (const uno::RuntimeException&)
+ {
+ // don't break throw ()
+ TOOLS_WARN_EXCEPTION( "sd", "" );
+ }
+ }
+ SfxBaseModel::release();
+}
+
+// XUnoTunnel
+const css::uno::Sequence< sal_Int8 > & SdXImpressDocument::getUnoTunnelId() noexcept
+{
+ static const comphelper::UnoIdInit theSdXImpressDocumentUnoTunnelId;
+ return theSdXImpressDocumentUnoTunnelId.getSeq();
+}
+
+sal_Int64 SAL_CALL SdXImpressDocument::getSomething( const css::uno::Sequence< sal_Int8 >& rIdentifier )
+{
+ if (comphelper::isUnoTunnelId<SdrModel>(rIdentifier))
+ return comphelper::getSomething_cast(mpDoc);
+
+ return comphelper::getSomethingImpl(rIdentifier, this,
+ comphelper::FallbackToGetSomethingOf<SfxBaseModel>{});
+}
+
+// XTypeProvider
+uno::Sequence< uno::Type > SAL_CALL SdXImpressDocument::getTypes( )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( !maTypeSequence.hasElements() )
+ {
+ uno::Sequence< uno::Type > aTypes( SfxBaseModel::getTypes() );
+ aTypes = comphelper::concatSequences(aTypes,
+ uno::Sequence {
+ cppu::UnoType<beans::XPropertySet>::get(),
+ cppu::UnoType<lang::XServiceInfo>::get(),
+ cppu::UnoType<lang::XMultiServiceFactory>::get(),
+ cppu::UnoType<drawing::XDrawPageDuplicator>::get(),
+ cppu::UnoType<drawing::XLayerSupplier>::get(),
+ cppu::UnoType<drawing::XMasterPagesSupplier>::get(),
+ cppu::UnoType<drawing::XDrawPagesSupplier>::get(),
+ cppu::UnoType<document::XLinkTargetSupplier>::get(),
+ cppu::UnoType<style::XStyleFamiliesSupplier>::get(),
+ cppu::UnoType<css::ucb::XAnyCompareFactory>::get(),
+ cppu::UnoType<view::XRenderable>::get() });
+ if( mbImpressDoc )
+ {
+ aTypes = comphelper::concatSequences(aTypes,
+ uno::Sequence {
+ cppu::UnoType<presentation::XPresentationSupplier>::get(),
+ cppu::UnoType<presentation::XCustomPresentationSupplier>::get(),
+ cppu::UnoType<presentation::XHandoutMasterSupplier>::get() });
+ }
+ maTypeSequence = aTypes;
+ }
+
+ return maTypeSequence;
+}
+
+uno::Sequence< sal_Int8 > SAL_CALL SdXImpressDocument::getImplementationId( )
+{
+ return css::uno::Sequence<sal_Int8>();
+}
+
+/***********************************************************************
+* *
+***********************************************************************/
+void SdXImpressDocument::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
+{
+ if( mpDoc )
+ {
+ if (rHint.GetId() == SfxHintId::ThisIsAnSdrHint)
+ {
+ const SdrHint* pSdrHint = static_cast<const SdrHint*>( &rHint );
+ if( hasEventListeners() )
+ {
+ document::EventObject aEvent;
+ if( SvxUnoDrawMSFactory::createEvent( mpDoc, pSdrHint, aEvent ) )
+ notifyEvent( aEvent );
+ }
+
+ if( pSdrHint->GetKind() == SdrHintKind::ModelCleared )
+ {
+ if( mpDoc )
+ EndListening( *mpDoc );
+ mpDoc = nullptr;
+ mpDocShell = nullptr;
+ }
+ }
+ else
+ {
+ // did our SdDrawDocument just died?
+ if(rHint.GetId() == SfxHintId::Dying)
+ {
+ // yes, so we ask for a new one
+ if( mpDocShell )
+ {
+ SdDrawDocument *pNewDoc = mpDocShell->GetDoc();
+
+ // is there a new one?
+ if( pNewDoc != mpDoc )
+ {
+ mpDoc = pNewDoc;
+ if(mpDoc)
+ StartListening( *mpDoc );
+ }
+ }
+ }
+ }
+ }
+ SfxBaseModel::Notify( rBC, rHint );
+}
+
+/******************************************************************************
+* *
+******************************************************************************/
+SdPage* SdXImpressDocument::InsertSdPage( sal_uInt16 nPage, bool bDuplicate )
+{
+ sal_uInt16 nPageCount = mpDoc->GetSdPageCount( PageKind::Standard );
+ SdrLayerAdmin& rLayerAdmin = mpDoc->GetLayerAdmin();
+ SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background);
+ SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects);
+
+ rtl::Reference<SdPage> pStandardPage;
+
+ if( 0 == nPageCount )
+ {
+ // this is only used for clipboard where we only have one page
+ pStandardPage = mpDoc->AllocSdPage(false);
+
+ Size aDefSize(21000, 29700); // A4 portrait orientation
+ pStandardPage->SetSize( aDefSize );
+ mpDoc->InsertPage(pStandardPage.get(), 0);
+ }
+ else
+ {
+ // here we determine the page after which we should insert
+ SdPage* pPreviousStandardPage = mpDoc->GetSdPage( std::min( static_cast<sal_uInt16>(nPageCount - 1), nPage ), PageKind::Standard );
+ SdrLayerIDSet aVisibleLayers = pPreviousStandardPage->TRG_GetMasterPageVisibleLayers();
+ bool bIsPageBack = aVisibleLayers.IsSet( aBckgrnd );
+ bool bIsPageObj = aVisibleLayers.IsSet( aBckgrndObj );
+
+ // AutoLayouts must be ready
+ mpDoc->StopWorkStartupDelay();
+
+ /* First we create a standard page and then a notes page. It is
+ guaranteed, that after a standard page the corresponding notes page
+ follows. */
+
+ sal_uInt16 nStandardPageNum = pPreviousStandardPage->GetPageNum() + 2;
+ SdPage* pPreviousNotesPage = static_cast<SdPage*>( mpDoc->GetPage( nStandardPageNum - 1 ) );
+ sal_uInt16 nNotesPageNum = nStandardPageNum + 1;
+
+ /**************************************************************
+ * standard page
+ **************************************************************/
+ if( bDuplicate )
+ pStandardPage = static_cast<SdPage*>( pPreviousStandardPage->CloneSdrPage(*mpDoc).get() );
+ else
+ pStandardPage = mpDoc->AllocSdPage(false);
+
+ pStandardPage->SetSize( pPreviousStandardPage->GetSize() );
+ pStandardPage->SetBorder( pPreviousStandardPage->GetLeftBorder(),
+ pPreviousStandardPage->GetUpperBorder(),
+ pPreviousStandardPage->GetRightBorder(),
+ pPreviousStandardPage->GetLowerBorder() );
+ pStandardPage->SetOrientation( pPreviousStandardPage->GetOrientation() );
+ pStandardPage->SetName(OUString());
+
+ // insert page after current page
+ mpDoc->InsertPage(pStandardPage.get(), nStandardPageNum);
+
+ if( !bDuplicate )
+ {
+ // use MasterPage of the current page
+ pStandardPage->TRG_SetMasterPage(pPreviousStandardPage->TRG_GetMasterPage());
+ pStandardPage->SetLayoutName( pPreviousStandardPage->GetLayoutName() );
+ pStandardPage->SetAutoLayout(AUTOLAYOUT_NONE, true );
+ }
+
+ aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background);
+ aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects);
+ aVisibleLayers.Set(aBckgrnd, bIsPageBack);
+ aVisibleLayers.Set(aBckgrndObj, bIsPageObj);
+ pStandardPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+
+ /**************************************************************
+ * notes page
+ **************************************************************/
+ rtl::Reference<SdPage> pNotesPage;
+
+ if( bDuplicate )
+ pNotesPage = static_cast<SdPage*>( pPreviousNotesPage->CloneSdrPage(*mpDoc).get() );
+ else
+ pNotesPage = mpDoc->AllocSdPage(false);
+
+ pNotesPage->SetSize( pPreviousNotesPage->GetSize() );
+ pNotesPage->SetBorder( pPreviousNotesPage->GetLeftBorder(),
+ pPreviousNotesPage->GetUpperBorder(),
+ pPreviousNotesPage->GetRightBorder(),
+ pPreviousNotesPage->GetLowerBorder() );
+ pNotesPage->SetOrientation( pPreviousNotesPage->GetOrientation() );
+ pNotesPage->SetName(OUString());
+ pNotesPage->SetPageKind(PageKind::Notes);
+
+ // insert page after current page
+ mpDoc->InsertPage(pNotesPage.get(), nNotesPageNum);
+
+ if( !bDuplicate )
+ {
+ // use MasterPage of the current page
+ pNotesPage->TRG_SetMasterPage(pPreviousNotesPage->TRG_GetMasterPage());
+ pNotesPage->SetLayoutName( pPreviousNotesPage->GetLayoutName() );
+ pNotesPage->SetAutoLayout(AUTOLAYOUT_NOTES, true );
+ }
+ }
+
+ SetModified();
+
+ return pStandardPage.get();
+}
+
+void SdXImpressDocument::SetModified() noexcept
+{
+ if( mpDoc )
+ mpDoc->SetChanged();
+}
+
+// XModel
+void SAL_CALL SdXImpressDocument::lockControllers( )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ mpDoc->setLock(true);
+}
+
+void SAL_CALL SdXImpressDocument::unlockControllers( )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ if( mpDoc->isLocked() )
+ {
+ mpDoc->setLock(false);
+ }
+}
+
+sal_Bool SAL_CALL SdXImpressDocument::hasControllersLocked( )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ return mpDoc->isLocked();
+}
+
+uno::Reference < container::XIndexAccess > SAL_CALL SdXImpressDocument::getViewData()
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ uno::Reference < container::XIndexAccess > xRet( SfxBaseModel::getViewData() );
+
+ if( !xRet.is() )
+ {
+ const std::vector<std::unique_ptr<sd::FrameView>> &rList = mpDoc->GetFrameViewList();
+
+ if( !rList.empty() )
+ {
+ xRet = new comphelper::IndexedPropertyValuesContainer();
+
+ uno::Reference < container::XIndexContainer > xCont( xRet, uno::UNO_QUERY );
+ DBG_ASSERT( xCont.is(), "SdXImpressDocument::getViewData() failed for OLE object" );
+ if( xCont.is() )
+ {
+ for( sal_uInt32 i = 0, n = rList.size(); i < n; i++ )
+ {
+ ::sd::FrameView* pFrameView = rList[ i ].get();
+
+ uno::Sequence< beans::PropertyValue > aSeq;
+ pFrameView->WriteUserDataSequence( aSeq );
+ xCont->insertByIndex( i, uno::Any( aSeq ) );
+ }
+ }
+ }
+ }
+
+ return xRet;
+}
+
+void SAL_CALL SdXImpressDocument::setViewData( const uno::Reference < container::XIndexAccess >& xData )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ SfxBaseModel::setViewData( xData );
+ if( !(mpDocShell && (mpDocShell->GetCreateMode() == SfxObjectCreateMode::EMBEDDED) && xData.is()) )
+ return;
+
+ const sal_Int32 nCount = xData->getCount();
+
+ std::vector<std::unique_ptr<sd::FrameView>> &rViews = mpDoc->GetFrameViewList();
+
+ rViews.clear();
+
+ uno::Sequence< beans::PropertyValue > aSeq;
+ for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ )
+ {
+ if( xData->getByIndex( nIndex ) >>= aSeq )
+ {
+ std::unique_ptr<::sd::FrameView> pFrameView(new ::sd::FrameView( mpDoc ));
+ pFrameView->ReadUserDataSequence( aSeq );
+ rViews.push_back( std::move(pFrameView) );
+ }
+ }
+}
+
+// XDrawPageDuplicator
+uno::Reference< drawing::XDrawPage > SAL_CALL SdXImpressDocument::duplicate( const uno::Reference< drawing::XDrawPage >& xPage )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ // get pPage from xPage and determine the Id (nPos ) afterwards
+ SvxDrawPage* pSvxPage = comphelper::getFromUnoTunnel<SvxDrawPage>( xPage );
+ if( pSvxPage )
+ {
+ SdPage* pPage = static_cast<SdPage*>( pSvxPage->GetSdrPage() );
+ sal_uInt16 nPos = pPage->GetPageNum();
+ nPos = ( nPos - 1 ) / 2;
+ pPage = InsertSdPage( nPos, true );
+ if( pPage )
+ {
+ uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY );
+ return xDrawPage;
+ }
+ }
+
+ uno::Reference< drawing::XDrawPage > xDrawPage;
+ return xDrawPage;
+}
+
+// XDrawPagesSupplier
+uno::Reference< drawing::XDrawPages > SAL_CALL SdXImpressDocument::getDrawPages()
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ uno::Reference< drawing::XDrawPages > xDrawPages( mxDrawPagesAccess );
+
+ if( !xDrawPages.is() )
+ {
+ initializeDocument();
+ mxDrawPagesAccess = xDrawPages = new SdDrawPagesAccess(*this);
+ }
+
+ return xDrawPages;
+}
+
+// XMasterPagesSupplier
+uno::Reference< drawing::XDrawPages > SAL_CALL SdXImpressDocument::getMasterPages()
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ uno::Reference< drawing::XDrawPages > xMasterPages( mxMasterPagesAccess );
+
+ if( !xMasterPages.is() )
+ {
+ if ( !hasControllersLocked() )
+ initializeDocument();
+ mxMasterPagesAccess = xMasterPages = new SdMasterPagesAccess(*this);
+ }
+
+ return xMasterPages;
+}
+
+// XLayerManagerSupplier
+uno::Reference< container::XNameAccess > SAL_CALL SdXImpressDocument::getLayerManager( )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ uno::Reference< container::XNameAccess > xLayerManager( mxLayerManager );
+
+ if( !xLayerManager.is() )
+ mxLayerManager = xLayerManager = new SdLayerManager(*this);
+
+ return xLayerManager;
+}
+
+// XCustomPresentationSupplier
+uno::Reference< container::XNameContainer > SAL_CALL SdXImpressDocument::getCustomPresentations()
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ uno::Reference< container::XNameContainer > xCustomPres( mxCustomPresentationAccess );
+
+ if( !xCustomPres.is() )
+ mxCustomPresentationAccess = xCustomPres = new SdXCustomPresentationAccess(*this);
+
+ return xCustomPres;
+}
+
+// XPresentationSupplier
+uno::Reference< presentation::XPresentation > SAL_CALL SdXImpressDocument::getPresentation()
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ return mpDoc->getPresentation();
+}
+
+// XHandoutMasterSupplier
+uno::Reference< drawing::XDrawPage > SAL_CALL SdXImpressDocument::getHandoutMasterPage()
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ uno::Reference< drawing::XDrawPage > xPage;
+
+ initializeDocument();
+ SdPage* pPage = mpDoc->GetMasterSdPage(0, PageKind::Handout);
+ if (pPage)
+ xPage.set(pPage->getUnoPage(), uno::UNO_QUERY);
+ return xPage;
+}
+
+// XMultiServiceFactory ( SvxFmMSFactory )
+
+css::uno::Reference<css::uno::XInterface> SdXImpressDocument::create(
+ OUString const & aServiceSpecifier, OUString const & referer)
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ if( aServiceSpecifier == "com.sun.star.drawing.DashTable" )
+ {
+ if( !mxDashTable.is() )
+ mxDashTable = SvxUnoDashTable_createInstance( mpDoc );
+
+ return mxDashTable;
+ }
+ if( aServiceSpecifier == "com.sun.star.drawing.GradientTable" )
+ {
+ if( !mxGradientTable.is() )
+ mxGradientTable = SvxUnoGradientTable_createInstance( mpDoc );
+
+ return mxGradientTable;
+ }
+ if( aServiceSpecifier == "com.sun.star.drawing.HatchTable" )
+ {
+ if( !mxHatchTable.is() )
+ mxHatchTable = SvxUnoHatchTable_createInstance( mpDoc );
+
+ return mxHatchTable;
+ }
+ if( aServiceSpecifier == "com.sun.star.drawing.BitmapTable" )
+ {
+ if( !mxBitmapTable.is() )
+ mxBitmapTable = SvxUnoBitmapTable_createInstance( mpDoc );
+
+ return mxBitmapTable;
+ }
+ if( aServiceSpecifier == "com.sun.star.drawing.TransparencyGradientTable" )
+ {
+ if( !mxTransGradientTable.is() )
+ mxTransGradientTable = SvxUnoTransGradientTable_createInstance( mpDoc );
+
+ return mxTransGradientTable;
+ }
+ if( aServiceSpecifier == "com.sun.star.drawing.MarkerTable" )
+ {
+ if( !mxMarkerTable.is() )
+ mxMarkerTable = SvxUnoMarkerTable_createInstance( mpDoc );
+
+ return mxMarkerTable;
+ }
+ if( aServiceSpecifier == "com.sun.star.text.NumberingRules" )
+ {
+ return uno::Reference< uno::XInterface >( SvxCreateNumRule( mpDoc ), uno::UNO_QUERY );
+ }
+ if( aServiceSpecifier == "com.sun.star.drawing.Background" )
+ {
+ return uno::Reference< uno::XInterface >(
+ static_cast<uno::XWeak*>(new SdUnoPageBackground( mpDoc )));
+ }
+
+ if( aServiceSpecifier == "com.sun.star.drawing.Defaults" )
+ {
+ if( !mxDrawingPool.is() )
+ mxDrawingPool = SdUnoCreatePool( mpDoc );
+
+ return mxDrawingPool;
+
+ }
+
+ if ( aServiceSpecifier == sUNO_Service_ImageMapRectangleObject )
+ {
+ return SvUnoImageMapRectangleObject_createInstance( ImplGetSupportedMacroItems() );
+ }
+
+ if ( aServiceSpecifier == sUNO_Service_ImageMapCircleObject )
+ {
+ return SvUnoImageMapCircleObject_createInstance( ImplGetSupportedMacroItems() );
+ }
+
+ if ( aServiceSpecifier == sUNO_Service_ImageMapPolygonObject )
+ {
+ return SvUnoImageMapPolygonObject_createInstance( ImplGetSupportedMacroItems() );
+ }
+
+ if( aServiceSpecifier == "com.sun.star.document.Settings" ||
+ ( !mbImpressDoc && ( aServiceSpecifier == "com.sun.star.drawing.DocumentSettings" ) ) ||
+ ( mbImpressDoc && ( aServiceSpecifier == "com.sun.star.presentation.DocumentSettings" ) ) )
+ {
+ return sd::DocumentSettings_createInstance( this );
+ }
+
+ if( aServiceSpecifier == "com.sun.star.text.TextField.DateTime" ||
+ aServiceSpecifier == "com.sun.star.text.textfield.DateTime" )
+ {
+ return static_cast<cppu::OWeakObject *>(new SvxUnoTextField( text::textfield::Type::DATE ));
+ }
+
+ if( aServiceSpecifier == "com.sun.star.presentation.TextField.Header" ||
+ aServiceSpecifier == "com.sun.star.presentation.textfield.Header" )
+ {
+ return static_cast<cppu::OWeakObject *>(new SvxUnoTextField( text::textfield::Type::PRESENTATION_HEADER ));
+ }
+
+ if( aServiceSpecifier == "com.sun.star.presentation.TextField.Footer" ||
+ aServiceSpecifier == "com.sun.star.presentation.textfield.Footer" )
+ {
+ return static_cast<cppu::OWeakObject *>(new SvxUnoTextField( text::textfield::Type::PRESENTATION_FOOTER ));
+ }
+
+ if( aServiceSpecifier == "com.sun.star.presentation.TextField.DateTime" ||
+ aServiceSpecifier == "com.sun.star.presentation.textfield.DateTime" )
+ {
+ return static_cast<cppu::OWeakObject *>(new SvxUnoTextField( text::textfield::Type::PRESENTATION_DATE_TIME ));
+ }
+
+ if( aServiceSpecifier == "com.sun.star.text.TextField.PageName" ||
+ aServiceSpecifier == "com.sun.star.text.textfield.PageName" )
+ {
+ return static_cast<cppu::OWeakObject *>(new SvxUnoTextField( text::textfield::Type::PAGE_NAME ));
+ }
+
+ if (aServiceSpecifier == "com.sun.star.text.TextField.DocInfo.Custom" ||
+ aServiceSpecifier == "com.sun.star.text.textfield.DocInfo.Custom")
+ {
+ return static_cast<cppu::OWeakObject *>(new SvxUnoTextField(text::textfield::Type::DOCINFO_CUSTOM));
+ }
+
+ if( aServiceSpecifier == "com.sun.star.xml.NamespaceMap" )
+ {
+ static sal_uInt16 aWhichIds[] = { SDRATTR_XMLATTRIBUTES, EE_CHAR_XMLATTRIBS, EE_PARA_XMLATTRIBS, 0 };
+
+ return svx::NamespaceMap_createInstance( aWhichIds, &mpDoc->GetItemPool() );
+ }
+
+ // Support creation of GraphicStorageHandler and EmbeddedObjectResolver
+ if (aServiceSpecifier == "com.sun.star.document.ExportGraphicStorageHandler")
+ {
+ return static_cast<cppu::OWeakObject *>(new SvXMLGraphicHelper( SvXMLGraphicHelperMode::Write ));
+ }
+
+ if (aServiceSpecifier == "com.sun.star.document.ImportGraphicStorageHandler")
+ {
+ return static_cast<cppu::OWeakObject *>(new SvXMLGraphicHelper( SvXMLGraphicHelperMode::Read ));
+ }
+
+ if( aServiceSpecifier == "com.sun.star.document.ExportEmbeddedObjectResolver" )
+ {
+ comphelper::IEmbeddedHelper* pPersist = mpDoc->GetPersist();
+ if( nullptr == pPersist )
+ throw lang::DisposedException();
+
+ return static_cast<cppu::OWeakObject *>(new SvXMLEmbeddedObjectHelper( *pPersist, SvXMLEmbeddedObjectHelperMode::Write ));
+ }
+
+ if( aServiceSpecifier == "com.sun.star.document.ImportEmbeddedObjectResolver" )
+ {
+ comphelper::IEmbeddedHelper* pPersist = mpDoc->GetPersist();
+ if( nullptr == pPersist )
+ throw lang::DisposedException();
+
+ return static_cast<cppu::OWeakObject *>(new SvXMLEmbeddedObjectHelper( *pPersist, SvXMLEmbeddedObjectHelperMode::Read ));
+ }
+
+ uno::Reference< uno::XInterface > xRet;
+
+ if( aServiceSpecifier.startsWith( "com.sun.star.presentation.") )
+ {
+ const std::u16string_view aType( aServiceSpecifier.subView(26) );
+ rtl::Reference<SvxShape> pShape;
+
+ SdrObjKind nType = SdrObjKind::Text;
+ // create a shape wrapper
+ if( o3tl::starts_with(aType, u"TitleTextShape" ) )
+ {
+ nType = SdrObjKind::Text;
+ }
+ else if( o3tl::starts_with(aType, u"OutlinerShape" ) )
+ {
+ nType = SdrObjKind::Text;
+ }
+ else if( o3tl::starts_with(aType, u"SubtitleShape" ) )
+ {
+ nType = SdrObjKind::Text;
+ }
+ else if( o3tl::starts_with(aType, u"GraphicObjectShape" ) )
+ {
+ nType = SdrObjKind::Graphic;
+ }
+ else if( o3tl::starts_with(aType, u"PageShape" ) )
+ {
+ nType = SdrObjKind::Page;
+ }
+ else if( o3tl::starts_with(aType, u"OLE2Shape" ) )
+ {
+ nType = SdrObjKind::OLE2;
+ }
+ else if( o3tl::starts_with(aType, u"ChartShape" ) )
+ {
+ nType = SdrObjKind::OLE2;
+ }
+ else if( o3tl::starts_with(aType, u"CalcShape" ) )
+ {
+ nType = SdrObjKind::OLE2;
+ }
+ else if( o3tl::starts_with(aType, u"TableShape" ) )
+ {
+ nType = SdrObjKind::Table;
+ }
+ else if( o3tl::starts_with(aType, u"OrgChartShape" ) )
+ {
+ nType = SdrObjKind::OLE2;
+ }
+ else if( o3tl::starts_with(aType, u"NotesShape" ) )
+ {
+ nType = SdrObjKind::Text;
+ }
+ else if( o3tl::starts_with(aType, u"HandoutShape" ) )
+ {
+ nType = SdrObjKind::Page;
+ }
+ else if( o3tl::starts_with(aType, u"FooterShape" ) )
+ {
+ nType = SdrObjKind::Text;
+ }
+ else if( o3tl::starts_with(aType, u"HeaderShape" ) )
+ {
+ nType = SdrObjKind::Text;
+ }
+ else if( o3tl::starts_with(aType, u"SlideNumberShape" ) )
+ {
+ nType = SdrObjKind::Text;
+ }
+ else if( o3tl::starts_with(aType, u"DateTimeShape" ) )
+ {
+ nType = SdrObjKind::Text;
+ }
+ else if( o3tl::starts_with(aType, u"MediaShape" ) )
+ {
+ nType = SdrObjKind::Media;
+ }
+ else
+ {
+ throw lang::ServiceNotRegisteredException();
+ }
+
+ // create the API wrapper
+ pShape = CreateSvxShapeByTypeAndInventor( nType, SdrInventor::Default, referer );
+
+ // set shape type
+ if( pShape && !mbClipBoard )
+ pShape->SetShapeType(aServiceSpecifier);
+
+ xRet = static_cast<uno::XWeak*>(pShape.get());
+ }
+ else if ( aServiceSpecifier == "com.sun.star.drawing.TableShape" )
+ {
+ rtl::Reference<SvxShape> pShape = CreateSvxShapeByTypeAndInventor( SdrObjKind::Table, SdrInventor::Default, referer );
+ if( pShape && !mbClipBoard )
+ pShape->SetShapeType(aServiceSpecifier);
+
+ xRet = static_cast<uno::XWeak*>(pShape.get());
+ }
+ else
+ {
+ xRet = SvxFmMSFactory::createInstance( aServiceSpecifier );
+ }
+
+ uno::Reference< drawing::XShape > xShape( xRet, uno::UNO_QUERY );
+ SvxShape* pShape = xShape.is() ? comphelper::getFromUnoTunnel<SvxShape>(xShape) : nullptr;
+ if (pShape)
+ {
+ xRet.clear();
+ new SdXShape( pShape, this );
+ xRet = xShape;
+ xShape.clear();
+ }
+
+ return xRet;
+}
+
+uno::Reference< uno::XInterface > SAL_CALL SdXImpressDocument::createInstance( const OUString& aServiceSpecifier )
+{
+ return create(aServiceSpecifier, "");
+}
+
+css::uno::Reference<css::uno::XInterface>
+SdXImpressDocument::createInstanceWithArguments(
+ OUString const & ServiceSpecifier,
+ css::uno::Sequence<css::uno::Any> const & Arguments)
+{
+ OUString arg;
+ if ((ServiceSpecifier == "com.sun.star.drawing.GraphicObjectShape"
+ || ServiceSpecifier == "com.sun.star.drawing.MediaShape"
+ || ServiceSpecifier == "com.sun.star.presentation.MediaShape")
+ && Arguments.getLength() == 1 && (Arguments[0] >>= arg))
+ {
+ return create(ServiceSpecifier, arg);
+ }
+ return SvxFmMSFactory::createInstanceWithArguments(
+ ServiceSpecifier, Arguments);
+}
+
+uno::Sequence< OUString > SAL_CALL SdXImpressDocument::getAvailableServiceNames()
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ const uno::Sequence< OUString > aSNS_ORG( SvxFmMSFactory::getAvailableServiceNames() );
+
+ uno::Sequence< OUString > aSNS_Common{ "com.sun.star.drawing.DashTable",
+ "com.sun.star.drawing.GradientTable",
+ "com.sun.star.drawing.HatchTable",
+ "com.sun.star.drawing.BitmapTable",
+ "com.sun.star.drawing.TransparencyGradientTable",
+ "com.sun.star.drawing.MarkerTable",
+ "com.sun.star.text.NumberingRules",
+ "com.sun.star.drawing.Background",
+ "com.sun.star.document.Settings",
+ sUNO_Service_ImageMapRectangleObject,
+ sUNO_Service_ImageMapCircleObject,
+ sUNO_Service_ImageMapPolygonObject,
+ "com.sun.star.xml.NamespaceMap",
+
+ // Support creation of GraphicStorageHandler and EmbeddedObjectResolver
+ "com.sun.star.document.ExportGraphicStorageHandler",
+ "com.sun.star.document.ImportGraphicStorageHandler",
+ "com.sun.star.document.ExportEmbeddedObjectResolver",
+ "com.sun.star.document.ImportEmbeddedObjectResolver",
+ "com.sun.star.drawing.TableShape" };
+
+ uno::Sequence< OUString > aSNS_Specific;
+
+ if(mbImpressDoc)
+ aSNS_Specific = { "com.sun.star.presentation.TitleTextShape",
+ "com.sun.star.presentation.OutlinerShape",
+ "com.sun.star.presentation.SubtitleShape",
+ "com.sun.star.presentation.GraphicObjectShape",
+ "com.sun.star.presentation.ChartShape",
+ "com.sun.star.presentation.PageShape",
+ "com.sun.star.presentation.OLE2Shape",
+ "com.sun.star.presentation.TableShape",
+ "com.sun.star.presentation.OrgChartShape",
+ "com.sun.star.presentation.NotesShape",
+ "com.sun.star.presentation.HandoutShape",
+ "com.sun.star.presentation.DocumentSettings",
+ "com.sun.star.presentation.FooterShape",
+ "com.sun.star.presentation.HeaderShape",
+ "com.sun.star.presentation.SlideNumberShape",
+ "com.sun.star.presentation.DateTimeShape",
+ "com.sun.star.presentation.CalcShape",
+ "com.sun.star.presentation.MediaShape" };
+ else
+ aSNS_Specific = { "com.sun.star.drawing.DocumentSettings" };
+
+ return comphelper::concatSequences( aSNS_ORG, aSNS_Common, aSNS_Specific );
+}
+
+// lang::XServiceInfo
+OUString SAL_CALL SdXImpressDocument::getImplementationName()
+{
+ return "SdXImpressDocument";
+ /* // Matching the .component information:
+ return mbImpressDoc
+ ? OUString("com.sun.star.comp.Draw.PresentationDocument")
+ : OUString("com.sun.star.comp.Draw.DrawingDocument");
+ */
+}
+
+sal_Bool SAL_CALL SdXImpressDocument::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+uno::Sequence< OUString > SAL_CALL SdXImpressDocument::getSupportedServiceNames()
+{
+ ::SolarMutexGuard aGuard;
+
+ return { "com.sun.star.document.OfficeDocument",
+ "com.sun.star.drawing.GenericDrawingDocument",
+ "com.sun.star.drawing.DrawingDocumentFactory",
+ mbImpressDoc?OUString("com.sun.star.presentation.PresentationDocument"):OUString("com.sun.star.drawing.DrawingDocument") };
+}
+
+// XPropertySet
+uno::Reference< beans::XPropertySetInfo > SAL_CALL SdXImpressDocument::getPropertySetInfo( )
+{
+ ::SolarMutexGuard aGuard;
+ return mpPropSet->getPropertySetInfo();
+}
+
+void SAL_CALL SdXImpressDocument::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(aPropertyName);
+
+ switch( pEntry ? pEntry->nWID : -1 )
+ {
+ case WID_MODEL_LANGUAGE:
+ {
+ lang::Locale aLocale;
+ if(!(aValue >>= aLocale))
+ throw lang::IllegalArgumentException();
+
+ mpDoc->SetLanguage( LanguageTag::convertToLanguageType(aLocale), EE_CHAR_LANGUAGE );
+ break;
+ }
+ case WID_MODEL_TABSTOP:
+ {
+ sal_Int32 nValue = 0;
+ if(!(aValue >>= nValue) || nValue < 0 )
+ throw lang::IllegalArgumentException();
+
+ mpDoc->SetDefaultTabulator(static_cast<sal_uInt16>(nValue));
+ break;
+ }
+ case WID_MODEL_VISAREA:
+ {
+ SfxObjectShell* pEmbeddedObj = mpDoc->GetDocSh();
+ if( !pEmbeddedObj )
+ break;
+
+ awt::Rectangle aVisArea;
+ if( !(aValue >>= aVisArea) || (aVisArea.Width < 0) || (aVisArea.Height < 0) )
+ throw lang::IllegalArgumentException();
+
+ sal_Int32 nRight, nTop;
+ if (o3tl::checked_add(aVisArea.X, aVisArea.Width, nRight) || o3tl::checked_add(aVisArea.Y, aVisArea.Height, nTop))
+ throw lang::IllegalArgumentException();
+
+ pEmbeddedObj->SetVisArea(::tools::Rectangle(aVisArea.X, aVisArea.Y, nRight, nTop));
+ }
+ break;
+ case WID_MODEL_CONTFOCUS:
+ {
+ bool bFocus = false;
+ if( !(aValue >>= bFocus ) )
+ throw lang::IllegalArgumentException();
+ mpDoc->SetAutoControlFocus( bFocus );
+ }
+ break;
+ case WID_MODEL_DSGNMODE:
+ {
+ bool bMode = false;
+ if( !(aValue >>= bMode ) )
+ throw lang::IllegalArgumentException();
+ mpDoc->SetOpenInDesignMode( bMode );
+ }
+ break;
+ case WID_MODEL_BUILDID:
+ aValue >>= maBuildId;
+ return;
+ case WID_MODEL_MAPUNIT:
+ case WID_MODEL_BASICLIBS:
+ case WID_MODEL_RUNTIMEUID: // is read-only
+ case WID_MODEL_DIALOGLIBS:
+ case WID_MODEL_FONTS:
+ throw beans::PropertyVetoException();
+ case WID_MODEL_INTEROPGRABBAG:
+ setGrabBagItem(aValue);
+ break;
+ case WID_MODEL_THEME:
+ {
+ SdrModel& rModel = getSdrModelFromUnoModel();
+ std::unique_ptr<svx::Theme> pTheme = svx::Theme::FromAny(aValue);
+ rModel.SetTheme(std::move(pTheme));
+ }
+ break;
+ default:
+ throw beans::UnknownPropertyException( aPropertyName, static_cast<cppu::OWeakObject*>(this));
+ }
+
+ SetModified();
+}
+
+uno::Any SAL_CALL SdXImpressDocument::getPropertyValue( const OUString& PropertyName )
+{
+ ::SolarMutexGuard aGuard;
+
+ uno::Any aAny;
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(PropertyName);
+
+ switch( pEntry ? pEntry->nWID : -1 )
+ {
+ case WID_MODEL_LANGUAGE:
+ {
+ LanguageType eLang = mpDoc->GetLanguage( EE_CHAR_LANGUAGE );
+ aAny <<= LanguageTag::convertToLocale( eLang);
+ break;
+ }
+ case WID_MODEL_TABSTOP:
+ aAny <<= static_cast<sal_Int32>(mpDoc->GetDefaultTabulator());
+ break;
+ case WID_MODEL_VISAREA:
+ {
+ SfxObjectShell* pEmbeddedObj = mpDoc->GetDocSh();
+ if( !pEmbeddedObj )
+ break;
+
+ const ::tools::Rectangle& aRect = pEmbeddedObj->GetVisArea();
+ awt::Rectangle aVisArea( aRect.Left(), aRect.Top(), aRect.getWidth(), aRect.getHeight() );
+ aAny <<= aVisArea;
+ }
+ break;
+ case WID_MODEL_MAPUNIT:
+ {
+ SfxObjectShell* pEmbeddedObj = mpDoc->GetDocSh();
+ if( !pEmbeddedObj )
+ break;
+
+ sal_Int16 nMeasureUnit = 0;
+ SvxMapUnitToMeasureUnit( pEmbeddedObj->GetMapUnit(), nMeasureUnit );
+ aAny <<= nMeasureUnit;
+ }
+ break;
+ case WID_MODEL_FORBCHARS:
+ {
+ aAny <<= getForbiddenCharsTable();
+ }
+ break;
+ case WID_MODEL_CONTFOCUS:
+ aAny <<= mpDoc->GetAutoControlFocus();
+ break;
+ case WID_MODEL_DSGNMODE:
+ aAny <<= mpDoc->GetOpenInDesignMode();
+ break;
+ case WID_MODEL_BASICLIBS:
+ aAny <<= mpDocShell->GetBasicContainer();
+ break;
+ case WID_MODEL_DIALOGLIBS:
+ aAny <<= mpDocShell->GetDialogContainer();
+ break;
+ case WID_MODEL_RUNTIMEUID:
+ aAny <<= getRuntimeUID();
+ break;
+ case WID_MODEL_BUILDID:
+ return uno::Any( maBuildId );
+ case WID_MODEL_HASVALIDSIGNATURES:
+ aAny <<= hasValidSignatures();
+ break;
+ case WID_MODEL_FONTS:
+ {
+ uno::Sequence<uno::Any> aSeq;
+ int nSeqIndex = 0;
+
+ sal_uInt16 const aWhichIds[] { EE_CHAR_FONTINFO, EE_CHAR_FONTINFO_CJK,
+ EE_CHAR_FONTINFO_CTL };
+
+ const SfxItemPool& rPool = mpDoc->GetPool();
+
+ for(sal_uInt16 nWhichId : aWhichIds)
+ {
+ sal_uInt32 nItems = rPool.GetItemCount2( nWhichId );
+
+ aSeq.realloc( aSeq.getLength() + nItems*5 + 5 );
+ auto pSeq = aSeq.getArray();
+
+ for (const SfxPoolItem* pItem : rPool.GetItemSurrogates(nWhichId))
+ {
+ const SvxFontItem *pFont = static_cast<const SvxFontItem *>(pItem);
+
+ pSeq[nSeqIndex++] <<= pFont->GetFamilyName();
+ pSeq[nSeqIndex++] <<= pFont->GetStyleName();
+ pSeq[nSeqIndex++] <<= sal_Int16(pFont->GetFamily());
+ pSeq[nSeqIndex++] <<= sal_Int16(pFont->GetPitch());
+ pSeq[nSeqIndex++] <<= sal_Int16(pFont->GetCharSet());
+ }
+
+ const SvxFontItem& rFont = static_cast<const SvxFontItem&>(rPool.GetDefaultItem( nWhichId ));
+
+ pSeq[nSeqIndex++] <<= rFont.GetFamilyName();
+ pSeq[nSeqIndex++] <<= rFont.GetStyleName();
+ pSeq[nSeqIndex++] <<= sal_Int16(rFont.GetFamily());
+ pSeq[nSeqIndex++] <<= sal_Int16(rFont.GetPitch());
+ pSeq[nSeqIndex++] <<= sal_Int16(rFont.GetCharSet());
+
+ }
+
+ aSeq.realloc( nSeqIndex );
+ aAny <<= aSeq;
+ break;
+ }
+ case WID_MODEL_INTEROPGRABBAG:
+ getGrabBagItem(aAny);
+ break;
+ case WID_MODEL_THEME:
+ {
+ SdrModel& rModel = getSdrModelFromUnoModel();
+ svx::Theme* pTheme = rModel.GetTheme();
+ if (pTheme)
+ {
+ pTheme->ToAny(aAny);
+ }
+ else
+ {
+ beans::PropertyValues aValues;
+ aAny <<= aValues;
+ }
+ break;
+ }
+ default:
+ throw beans::UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this));
+ }
+
+ return aAny;
+}
+
+void SAL_CALL SdXImpressDocument::addPropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) {}
+void SAL_CALL SdXImpressDocument::removePropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) {}
+void SAL_CALL SdXImpressDocument::addVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) {}
+void SAL_CALL SdXImpressDocument::removeVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) {}
+
+// XLinkTargetSupplier
+uno::Reference< container::XNameAccess > SAL_CALL SdXImpressDocument::getLinks()
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ uno::Reference< container::XNameAccess > xLinks( mxLinks );
+ if( !xLinks.is() )
+ mxLinks = xLinks = new SdDocLinkTargets( *this );
+ return xLinks;
+}
+
+// XStyleFamiliesSupplier
+uno::Reference< container::XNameAccess > SAL_CALL SdXImpressDocument::getStyleFamilies( )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ uno::Reference< container::XNameAccess > xStyles( dynamic_cast< container::XNameAccess* >( mpDoc->GetStyleSheetPool()) );
+ return xStyles;
+}
+
+// XAnyCompareFactory
+uno::Reference< css::ucb::XAnyCompare > SAL_CALL SdXImpressDocument::createAnyCompareByName( const OUString& )
+{
+ return SvxCreateNumRuleCompare();
+}
+
+// XRenderable
+sal_Int32 SAL_CALL SdXImpressDocument::getRendererCount( const uno::Any& rSelection,
+ const uno::Sequence< beans::PropertyValue >& )
+{
+ ::SolarMutexGuard aGuard;
+ sal_Int32 nRet = 0;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ if (mpDocShell)
+ {
+ uno::Reference< frame::XModel > xModel;
+
+ rSelection >>= xModel;
+
+ if( xModel == mpDocShell->GetModel() )
+ nRet = mpDoc->GetSdPageCount( PageKind::Standard );
+ else
+ {
+ uno::Reference< drawing::XShapes > xShapes;
+
+ rSelection >>= xShapes;
+
+ if( xShapes.is() && xShapes->getCount() )
+ nRet = 1;
+ }
+ }
+ return nRet;
+}
+
+uno::Sequence< beans::PropertyValue > SAL_CALL SdXImpressDocument::getRenderer( sal_Int32 , const uno::Any& ,
+ const uno::Sequence< beans::PropertyValue >& rxOptions )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ bool bExportNotesPages = false;
+ for( const auto& rOption : rxOptions )
+ {
+ if ( rOption.Name == "ExportNotesPages" )
+ rOption.Value >>= bExportNotesPages;
+ }
+ uno::Sequence< beans::PropertyValue > aRenderer;
+ if (mpDocShell)
+ {
+ awt::Size aPageSize;
+ if ( bExportNotesPages )
+ {
+ Size aNotesPageSize = mpDoc->GetSdPage( 0, PageKind::Notes )->GetSize();
+ aPageSize = awt::Size( aNotesPageSize.Width(), aNotesPageSize.Height() );
+ }
+ else
+ {
+ const ::tools::Rectangle aVisArea( mpDocShell->GetVisArea( embed::Aspects::MSOLE_DOCPRINT ) );
+ aPageSize = awt::Size( aVisArea.GetWidth(), aVisArea.GetHeight() );
+ }
+ aRenderer = { comphelper::makePropertyValue("PageSize", aPageSize) };
+ }
+ return aRenderer;
+}
+
+namespace {
+
+class ImplRenderPaintProc : public sdr::contact::ViewObjectContactRedirector
+{
+ const SdrLayerAdmin& rLayerAdmin;
+ SdrPageView* pSdrPageView;
+
+public:
+ bool IsVisible ( const SdrObject* pObj ) const;
+ bool IsPrintable( const SdrObject* pObj ) const;
+
+ ImplRenderPaintProc(const SdrLayerAdmin& rLA, SdrPageView* pView);
+
+ // all default implementations just call the same methods at the original. To do something
+ // different, override the method and at least do what the method does.
+ virtual void createRedirectedPrimitive2DSequence(
+ const sdr::contact::ViewObjectContact& rOriginal,
+ const sdr::contact::DisplayInfo& rDisplayInfo,
+ drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) override;
+};
+
+}
+
+ImplRenderPaintProc::ImplRenderPaintProc(const SdrLayerAdmin& rLA, SdrPageView *const pView)
+ : rLayerAdmin(rLA)
+ , pSdrPageView(pView)
+{
+}
+
+static sal_Int32 ImplPDFGetBookmarkPage( const OUString& rBookmark, SdDrawDocument const & rDoc )
+{
+ sal_Int32 nPage = -1;
+
+ OUString aBookmark( rBookmark );
+
+ if( rBookmark.startsWith("#") )
+ aBookmark = rBookmark.copy( 1 );
+
+ // is the bookmark a page ?
+ bool bIsMasterPage;
+ sal_uInt16 nPgNum = rDoc.GetPageByName( aBookmark, bIsMasterPage );
+
+ if ( nPgNum == SDRPAGE_NOTFOUND )
+ {
+ // is the bookmark an object ?
+ SdrObject* pObj = rDoc.GetObj( aBookmark );
+ if (pObj)
+ nPgNum = pObj->getSdrPageFromSdrObject()->GetPageNum();
+ }
+ if ( nPgNum != SDRPAGE_NOTFOUND )
+ nPage = ( nPgNum - 1 ) / 2;
+ return nPage;
+}
+
+static void ImplPDFExportComments( const uno::Reference< drawing::XDrawPage >& xPage, vcl::PDFExtOutDevData& rPDFExtOutDevData )
+{
+ try
+ {
+ uno::Reference< office::XAnnotationAccess > xAnnotationAccess( xPage, uno::UNO_QUERY_THROW );
+ uno::Reference< office::XAnnotationEnumeration > xAnnotationEnumeration( xAnnotationAccess->createAnnotationEnumeration() );
+
+ while( xAnnotationEnumeration->hasMoreElements() )
+ {
+ uno::Reference< office::XAnnotation > xAnnotation( xAnnotationEnumeration->nextElement() );
+
+ geometry::RealPoint2D aRealPoint2D( xAnnotation->getPosition() );
+ uno::Reference< text::XText > xText( xAnnotation->getTextRange() );
+
+ vcl::PDFNote aNote;
+ aNote.Title = xAnnotation->getAuthor();
+ aNote.Contents = xText->getString();
+ aNote.maModificationDate = xAnnotation->getDateTime();
+
+ rPDFExtOutDevData.CreateNote( ::tools::Rectangle( Point( static_cast< ::tools::Long >( aRealPoint2D.X * 100 ),
+ static_cast< ::tools::Long >( aRealPoint2D.Y * 100 ) ), Size( 1000, 1000 ) ), aNote );
+ }
+ }
+ catch (const uno::Exception&)
+ {
+ }
+}
+
+static void ImplPDFExportShapeInteraction( const uno::Reference< drawing::XShape >& xShape, SdDrawDocument& rDoc, vcl::PDFExtOutDevData& rPDFExtOutDevData )
+{
+ if ( xShape->getShapeType() == "com.sun.star.drawing.GroupShape" )
+ {
+ uno::Reference< container::XIndexAccess > xIndexAccess( xShape, uno::UNO_QUERY );
+ if ( xIndexAccess.is() )
+ {
+ sal_Int32 i, nCount = xIndexAccess->getCount();
+ for ( i = 0; i < nCount; i++ )
+ {
+ uno::Reference< drawing::XShape > xSubShape( xIndexAccess->getByIndex( i ), uno::UNO_QUERY );
+ if ( xSubShape.is() )
+ ImplPDFExportShapeInteraction( xSubShape, rDoc, rPDFExtOutDevData );
+ }
+ }
+ }
+ else
+ {
+ uno::Reference< beans::XPropertySet > xShapePropSet( xShape, uno::UNO_QUERY );
+ if( xShapePropSet.is() )
+ {
+ Size aPageSize( rDoc.GetSdPage( 0, PageKind::Standard )->GetSize() );
+ Point aPoint( 0, 0 );
+ ::tools::Rectangle aPageRect( aPoint, aPageSize );
+
+ awt::Point aShapePos( xShape->getPosition() );
+ awt::Size aShapeSize( xShape->getSize() );
+ ::tools::Rectangle aLinkRect( Point( aShapePos.X, aShapePos.Y ), Size( aShapeSize.Width, aShapeSize.Height ) );
+
+ // Handle linked videos.
+ if (xShape->getShapeType() == "com.sun.star.drawing.MediaShape" || xShape->getShapeType() == "com.sun.star.presentation.MediaShape")
+ {
+ OUString aMediaURL;
+ xShapePropSet->getPropertyValue("MediaURL") >>= aMediaURL;
+ if (!aMediaURL.isEmpty())
+ {
+ sal_Int32 nScreenId = rPDFExtOutDevData.CreateScreen(aLinkRect, rPDFExtOutDevData.GetCurrentPageNumber());
+ if (aMediaURL.startsWith("vnd.sun.star.Package:"))
+ {
+ OUString aTempFileURL;
+ xShapePropSet->getPropertyValue("PrivateTempFileURL") >>= aTempFileURL;
+ rPDFExtOutDevData.SetScreenStream(nScreenId, aTempFileURL);
+ }
+ else
+ rPDFExtOutDevData.SetScreenURL(nScreenId, aMediaURL);
+ }
+ }
+
+ presentation::ClickAction eCa;
+ uno::Any aAny( xShapePropSet->getPropertyValue( "OnClick" ) );
+ if ( aAny >>= eCa )
+ {
+ OUString const actionName(SdResId(SdTPAction::GetClickActionSdResId(eCa)));
+ switch ( eCa )
+ {
+ case presentation::ClickAction_LASTPAGE :
+ {
+ sal_Int32 nCount = rDoc.GetSdPageCount( PageKind::Standard );
+ sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, nCount - 1, vcl::PDFWriter::DestAreaType::FitRectangle );
+ sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink(aLinkRect, actionName);
+ rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId );
+ }
+ break;
+ case presentation::ClickAction_FIRSTPAGE :
+ {
+ sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, 0, vcl::PDFWriter::DestAreaType::FitRectangle );
+ sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink(aLinkRect, actionName);
+ rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId );
+ }
+ break;
+ case presentation::ClickAction_PREVPAGE :
+ {
+ sal_Int32 nDestPage = rPDFExtOutDevData.GetCurrentPageNumber();
+ if ( nDestPage )
+ nDestPage--;
+ sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, nDestPage, vcl::PDFWriter::DestAreaType::FitRectangle );
+ sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink(aLinkRect, actionName);
+ rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId );
+ }
+ break;
+ case presentation::ClickAction_NEXTPAGE :
+ {
+ sal_Int32 nDestPage = rPDFExtOutDevData.GetCurrentPageNumber() + 1;
+ sal_Int32 nLastPage = rDoc.GetSdPageCount( PageKind::Standard ) - 1;
+ if ( nDestPage > nLastPage )
+ nDestPage = nLastPage;
+ sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, nDestPage, vcl::PDFWriter::DestAreaType::FitRectangle );
+ sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink(aLinkRect, actionName);
+ rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId );
+ }
+ break;
+
+ case presentation::ClickAction_PROGRAM :
+ case presentation::ClickAction_BOOKMARK :
+ case presentation::ClickAction_DOCUMENT :
+ {
+ OUString aBookmark;
+ xShapePropSet->getPropertyValue( "Bookmark" ) >>= aBookmark;
+ if( !aBookmark.isEmpty() )
+ {
+ switch( eCa )
+ {
+ case presentation::ClickAction_DOCUMENT :
+ case presentation::ClickAction_PROGRAM :
+ {
+ sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink(aLinkRect, actionName);
+ rPDFExtOutDevData.SetLinkURL( nLinkId, aBookmark );
+ }
+ break;
+ case presentation::ClickAction_BOOKMARK :
+ {
+ sal_Int32 nPage = ImplPDFGetBookmarkPage( aBookmark, rDoc );
+ if ( nPage != -1 )
+ {
+ sal_Int32 nDestId = rPDFExtOutDevData.CreateDest( aPageRect, nPage, vcl::PDFWriter::DestAreaType::FitRectangle );
+ sal_Int32 nLinkId = rPDFExtOutDevData.CreateLink(aLinkRect, actionName);
+ rPDFExtOutDevData.SetLinkDest( nLinkId, nDestId );
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ break;
+
+ case presentation::ClickAction_STOPPRESENTATION :
+ case presentation::ClickAction_SOUND :
+ case presentation::ClickAction_INVISIBLE :
+ case presentation::ClickAction_VERB :
+ case presentation::ClickAction_VANISH :
+ case presentation::ClickAction_MACRO :
+ default :
+ break;
+ }
+ }
+ }
+ }
+}
+
+void ImplRenderPaintProc::createRedirectedPrimitive2DSequence(
+ const sdr::contact::ViewObjectContact& rOriginal,
+ const sdr::contact::DisplayInfo& rDisplayInfo,
+ drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor)
+{
+ SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject();
+ if(!pObject)
+ {
+ // not an object, maybe a page
+ sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo, rVisitor);
+ return;
+ }
+ SdrPage* pSdrPage(pObject->getSdrPageFromSdrObject());
+ if(!pSdrPage)
+ return;
+ if(!pSdrPage->checkVisibility(rOriginal, rDisplayInfo, false))
+ return;
+ if(!IsVisible(pObject) || !IsPrintable(pObject))
+ return;
+
+ sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo, rVisitor);
+}
+
+bool ImplRenderPaintProc::IsVisible( const SdrObject* pObj ) const
+{
+ bool bVisible = true;
+ SdrLayerID nLayerId = pObj->GetLayer();
+ if( pSdrPageView )
+ {
+ const SdrLayer* pSdrLayer = rLayerAdmin.GetLayerPerID( nLayerId );
+ if ( pSdrLayer )
+ {
+ const OUString& aLayerName = pSdrLayer->GetName();
+ bVisible = pSdrPageView->IsLayerVisible( aLayerName );
+ }
+ }
+ return bVisible;
+}
+bool ImplRenderPaintProc::IsPrintable( const SdrObject* pObj ) const
+{
+ bool bPrintable = true;
+ SdrLayerID nLayerId = pObj->GetLayer();
+ if( pSdrPageView )
+ {
+ const SdrLayer* pSdrLayer = rLayerAdmin.GetLayerPerID( nLayerId );
+ if ( pSdrLayer )
+ {
+ const OUString& aLayerName = pSdrLayer->GetName();
+ bPrintable = pSdrPageView->IsLayerPrintable( aLayerName );
+ }
+ }
+ return bPrintable;
+
+}
+
+namespace
+{
+ sal_Int16 CalcOutputPageNum(vcl::PDFExtOutDevData const * pPDFExtOutDevData, SdDrawDocument const *pDoc, sal_Int16 nPageNumber)
+ {
+ //export all pages, simple one to one case
+ if (pPDFExtOutDevData && pPDFExtOutDevData->GetIsExportHiddenSlides())
+ return nPageNumber-1;
+ //check all preceding pages, and only count non-hidden ones
+ sal_Int16 nRet = 0;
+ for (sal_Int16 i = 0; i < nPageNumber-1; ++i)
+ {
+ if (!pDoc->GetSdPage(i, PageKind::Standard)->IsExcluded())
+ ++nRet;
+ }
+ return nRet;
+ }
+}
+
+void SAL_CALL SdXImpressDocument::render( sal_Int32 nRenderer, const uno::Any& rSelection,
+ const uno::Sequence< beans::PropertyValue >& rxOptions )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpDoc )
+ throw lang::DisposedException();
+
+ if (!mpDocShell)
+ return;
+
+ uno::Reference< awt::XDevice > xRenderDevice;
+ const sal_Int32 nPageNumber = nRenderer + 1;
+ PageKind ePageKind = PageKind::Standard;
+ bool bExportNotesPages = false;
+
+ for( const auto& rOption : rxOptions )
+ {
+ if ( rOption.Name == "RenderDevice" )
+ rOption.Value >>= xRenderDevice;
+ else if ( rOption.Name == "ExportNotesPages" )
+ {
+ rOption.Value >>= bExportNotesPages;
+ if ( bExportNotesPages )
+ ePageKind = PageKind::Notes;
+ }
+ }
+
+ if( !(xRenderDevice.is() && nPageNumber && ( nPageNumber <= mpDoc->GetSdPageCount( ePageKind ) )) )
+ return;
+
+ VCLXDevice* pDevice = comphelper::getFromUnoTunnel<VCLXDevice>( xRenderDevice );
+ VclPtr< OutputDevice> pOut = pDevice ? pDevice->GetOutputDevice() : VclPtr< OutputDevice >();
+
+ if( !pOut )
+ return;
+
+ vcl::PDFExtOutDevData* pPDFExtOutDevData = dynamic_cast<vcl::PDFExtOutDevData* >( pOut->GetExtOutDevData() );
+
+ if ( mpDoc->GetSdPage(static_cast<sal_Int16>(nPageNumber)-1, PageKind::Standard)->IsExcluded() &&
+ !(pPDFExtOutDevData && pPDFExtOutDevData->GetIsExportHiddenSlides()) )
+ return;
+
+ if (pPDFExtOutDevData)
+ {
+ css::lang::Locale const docLocale(Application::GetSettings().GetLanguageTag().getLocale());
+ pPDFExtOutDevData->SetDocumentLocale(docLocale);
+ }
+
+ ::sd::ClientView aView( mpDocShell, pOut );
+ ::tools::Rectangle aVisArea( Point(), mpDoc->GetSdPage( static_cast<sal_uInt16>(nPageNumber) - 1, ePageKind )->GetSize() );
+ vcl::Region aRegion( aVisArea );
+
+ ::sd::ViewShell* pOldViewSh = mpDocShell->GetViewShell();
+ ::sd::View* pOldSdView = pOldViewSh ? pOldViewSh->GetView() : nullptr;
+
+ if ( pOldSdView )
+ pOldSdView->SdrEndTextEdit();
+
+ aView.SetHlplVisible( false );
+ aView.SetGridVisible( false );
+ aView.SetBordVisible( false );
+ aView.SetPageVisible( false );
+ aView.SetGlueVisible( false );
+
+ pOut->SetMapMode(MapMode(MapUnit::Map100thMM));
+ pOut->IntersectClipRegion( aVisArea );
+
+ uno::Reference< frame::XModel > xModel;
+ rSelection >>= xModel;
+
+ if( xModel == mpDocShell->GetModel() )
+ {
+ aView.ShowSdrPage( mpDoc->GetSdPage( static_cast<sal_uInt16>(nPageNumber) - 1, ePageKind ));
+ SdrPageView* pPV = aView.GetSdrPageView();
+
+ if( pOldSdView )
+ {
+ SdrPageView* pOldPV = pOldSdView->GetSdrPageView();
+ if( pPV && pOldPV )
+ {
+ pPV->SetVisibleLayers( pOldPV->GetVisibleLayers() );
+ pPV->SetPrintableLayers( pOldPV->GetPrintableLayers() );
+ }
+ }
+
+ ImplRenderPaintProc aImplRenderPaintProc( mpDoc->GetLayerAdmin(),
+ pPV);
+
+ // background color for outliner :o
+ SdPage* pPage = pPV ? static_cast<SdPage*>(pPV->GetPage()) : nullptr;
+ if( pPage )
+ {
+ SdrOutliner& rOutl = mpDoc->GetDrawOutliner();
+ bool bScreenDisplay(true);
+
+ // #i75566# printing; suppress AutoColor BackgroundColor generation
+ // for visibility reasons by giving GetPageBackgroundColor()
+ // the needed hint
+ // #i75566# PDF export; suppress AutoColor BackgroundColor generation (see printing)
+ if (pOut && ((OUTDEV_PRINTER == pOut->GetOutDevType())
+ || (OUTDEV_PDF == pOut->GetOutDevType())))
+ bScreenDisplay = false;
+
+ // #i75566# Name change GetBackgroundColor -> GetPageBackgroundColor and
+ // hint value if screen display. Only then the AutoColor mechanisms shall be applied
+ rOutl.SetBackgroundColor( pPage->GetPageBackgroundColor( pPV, bScreenDisplay ) );
+ }
+ aView.SdrPaintView::CompleteRedraw( pOut, aRegion, &aImplRenderPaintProc );
+
+ if ( pPDFExtOutDevData && pPage )
+ {
+ try
+ {
+ uno::Any aAny;
+ uno::Reference< drawing::XDrawPage > xPage( uno::Reference< drawing::XDrawPage >::query( pPage->getUnoPage() ) );
+ if ( xPage.is() )
+ {
+ if ( pPDFExtOutDevData->GetIsExportNotes() )
+ ImplPDFExportComments( xPage, *pPDFExtOutDevData );
+ uno::Reference< beans::XPropertySet > xPagePropSet( xPage, uno::UNO_QUERY );
+ if( xPagePropSet.is() )
+ {
+ // exporting object interactions to pdf
+
+ // if necessary, the master page interactions will be exported first
+ bool bIsBackgroundObjectsVisible = false; // #i39428# IsBackgroundObjectsVisible not available for Draw
+ if ( mbImpressDoc && xPagePropSet->getPropertySetInfo()->hasPropertyByName( "IsBackgroundObjectsVisible" ) )
+ xPagePropSet->getPropertyValue( "IsBackgroundObjectsVisible" ) >>= bIsBackgroundObjectsVisible;
+ if ( bIsBackgroundObjectsVisible && !pPDFExtOutDevData->GetIsExportNotesPages() )
+ {
+ uno::Reference< drawing::XMasterPageTarget > xMasterPageTarget( xPage, uno::UNO_QUERY );
+ if ( xMasterPageTarget.is() )
+ {
+ uno::Reference< drawing::XDrawPage > xMasterPage = xMasterPageTarget->getMasterPage();
+ if ( xMasterPage.is() )
+ {
+ sal_Int32 i, nCount = xMasterPage->getCount();
+ for ( i = 0; i < nCount; i++ )
+ {
+ aAny = xMasterPage->getByIndex( i );
+ uno::Reference< drawing::XShape > xShape;
+ if ( aAny >>= xShape )
+ ImplPDFExportShapeInteraction( xShape, *mpDoc, *pPDFExtOutDevData );
+ }
+ }
+ }
+ }
+
+ // exporting slide page object interactions
+ sal_Int32 i, nCount = xPage->getCount();
+ for ( i = 0; i < nCount; i++ )
+ {
+ aAny = xPage->getByIndex( i );
+ uno::Reference< drawing::XShape > xShape;
+ if ( aAny >>= xShape )
+ ImplPDFExportShapeInteraction( xShape, *mpDoc, *pPDFExtOutDevData );
+ }
+
+ // exporting transition effects to pdf
+ if ( mbImpressDoc && !pPDFExtOutDevData->GetIsExportNotesPages() && pPDFExtOutDevData->GetIsExportTransitionEffects() )
+ {
+ static const OUStringLiteral sEffect( u"Effect" );
+ static const OUStringLiteral sSpeed ( u"Speed" );
+ sal_Int32 nTime = 800;
+ presentation::AnimationSpeed aAs;
+ if ( xPagePropSet->getPropertySetInfo( )->hasPropertyByName( sSpeed ) )
+ {
+ aAny = xPagePropSet->getPropertyValue( sSpeed );
+ if ( aAny >>= aAs )
+ {
+ switch( aAs )
+ {
+ case presentation::AnimationSpeed_SLOW : nTime = 1500; break;
+ case presentation::AnimationSpeed_FAST : nTime = 300; break;
+ default:
+ case presentation::AnimationSpeed_MEDIUM : nTime = 800;
+ }
+ }
+ }
+ presentation::FadeEffect eFe;
+ vcl::PDFWriter::PageTransition eType = vcl::PDFWriter::PageTransition::Regular;
+ if ( xPagePropSet->getPropertySetInfo( )->hasPropertyByName( sEffect ) )
+ {
+ aAny = xPagePropSet->getPropertyValue( sEffect );
+ if ( aAny >>= eFe )
+ {
+ switch( eFe )
+ {
+ case presentation::FadeEffect_HORIZONTAL_LINES :
+ case presentation::FadeEffect_HORIZONTAL_CHECKERBOARD :
+ case presentation::FadeEffect_HORIZONTAL_STRIPES : eType = vcl::PDFWriter::PageTransition::BlindsHorizontal; break;
+
+ case presentation::FadeEffect_VERTICAL_LINES :
+ case presentation::FadeEffect_VERTICAL_CHECKERBOARD :
+ case presentation::FadeEffect_VERTICAL_STRIPES : eType = vcl::PDFWriter::PageTransition::BlindsVertical; break;
+
+ case presentation::FadeEffect_UNCOVER_TO_RIGHT :
+ case presentation::FadeEffect_UNCOVER_TO_UPPERRIGHT :
+ case presentation::FadeEffect_ROLL_FROM_LEFT :
+ case presentation::FadeEffect_FADE_FROM_UPPERLEFT :
+ case presentation::FadeEffect_MOVE_FROM_UPPERLEFT :
+ case presentation::FadeEffect_FADE_FROM_LEFT :
+ case presentation::FadeEffect_MOVE_FROM_LEFT : eType = vcl::PDFWriter::PageTransition::WipeLeftToRight; break;
+
+ case presentation::FadeEffect_UNCOVER_TO_BOTTOM :
+ case presentation::FadeEffect_UNCOVER_TO_LOWERRIGHT :
+ case presentation::FadeEffect_ROLL_FROM_TOP :
+ case presentation::FadeEffect_FADE_FROM_UPPERRIGHT :
+ case presentation::FadeEffect_MOVE_FROM_UPPERRIGHT :
+ case presentation::FadeEffect_FADE_FROM_TOP :
+ case presentation::FadeEffect_MOVE_FROM_TOP : eType = vcl::PDFWriter::PageTransition::WipeTopToBottom; break;
+
+ case presentation::FadeEffect_UNCOVER_TO_LEFT :
+ case presentation::FadeEffect_UNCOVER_TO_LOWERLEFT :
+ case presentation::FadeEffect_ROLL_FROM_RIGHT :
+
+ case presentation::FadeEffect_FADE_FROM_LOWERRIGHT :
+ case presentation::FadeEffect_MOVE_FROM_LOWERRIGHT :
+ case presentation::FadeEffect_FADE_FROM_RIGHT :
+ case presentation::FadeEffect_MOVE_FROM_RIGHT : eType = vcl::PDFWriter::PageTransition::WipeRightToLeft; break;
+
+ case presentation::FadeEffect_UNCOVER_TO_TOP :
+ case presentation::FadeEffect_UNCOVER_TO_UPPERLEFT :
+ case presentation::FadeEffect_ROLL_FROM_BOTTOM :
+ case presentation::FadeEffect_FADE_FROM_LOWERLEFT :
+ case presentation::FadeEffect_MOVE_FROM_LOWERLEFT :
+ case presentation::FadeEffect_FADE_FROM_BOTTOM :
+ case presentation::FadeEffect_MOVE_FROM_BOTTOM : eType = vcl::PDFWriter::PageTransition::WipeBottomToTop; break;
+
+ case presentation::FadeEffect_OPEN_VERTICAL : eType = vcl::PDFWriter::PageTransition::SplitHorizontalInward; break;
+ case presentation::FadeEffect_CLOSE_HORIZONTAL : eType = vcl::PDFWriter::PageTransition::SplitHorizontalOutward; break;
+
+ case presentation::FadeEffect_OPEN_HORIZONTAL : eType = vcl::PDFWriter::PageTransition::SplitVerticalInward; break;
+ case presentation::FadeEffect_CLOSE_VERTICAL : eType = vcl::PDFWriter::PageTransition::SplitVerticalOutward; break;
+
+ case presentation::FadeEffect_FADE_TO_CENTER : eType = vcl::PDFWriter::PageTransition::BoxInward; break;
+ case presentation::FadeEffect_FADE_FROM_CENTER : eType = vcl::PDFWriter::PageTransition::BoxOutward; break;
+
+ case presentation::FadeEffect_NONE : eType = vcl::PDFWriter::PageTransition::Regular; break;
+
+ case presentation::FadeEffect_RANDOM :
+ case presentation::FadeEffect_DISSOLVE :
+ default: eType = vcl::PDFWriter::PageTransition::Dissolve; break;
+ }
+ }
+ }
+
+ if ( xPagePropSet->getPropertySetInfo( )->hasPropertyByName( sEffect ) ||
+ xPagePropSet->getPropertySetInfo( )->hasPropertyByName( sSpeed ) )
+ {
+ pPDFExtOutDevData->SetPageTransition( eType, nTime );
+ }
+ }
+ }
+ }
+
+ Size aPageSize( mpDoc->GetSdPage( 0, PageKind::Standard )->GetSize() );
+ Point aPoint( 0, 0 );
+ ::tools::Rectangle aPageRect( aPoint, aPageSize );
+
+ // resolving links found in this page by the method ImpEditEngine::Paint
+ std::vector< vcl::PDFExtOutDevBookmarkEntry >& rBookmarks = pPDFExtOutDevData->GetBookmarks();
+ for ( const auto& rBookmark : rBookmarks )
+ {
+ sal_Int32 nPage = ImplPDFGetBookmarkPage( rBookmark.aBookmark, *mpDoc );
+ if ( nPage != -1 )
+ {
+ if ( rBookmark.nLinkId != -1 )
+ pPDFExtOutDevData->SetLinkDest( rBookmark.nLinkId, pPDFExtOutDevData->CreateDest( aPageRect, nPage, vcl::PDFWriter::DestAreaType::FitRectangle ) );
+ else
+ pPDFExtOutDevData->DescribeRegisteredDest( rBookmark.nDestId, aPageRect, nPage, vcl::PDFWriter::DestAreaType::FitRectangle );
+ }
+ else
+ pPDFExtOutDevData->SetLinkURL( rBookmark.nLinkId, rBookmark.aBookmark );
+ }
+ rBookmarks.clear();
+ //---> #i56629, #i40318
+ //get the page name, will be used as outline element in PDF bookmark pane
+ OUString aPageName = mpDoc->GetSdPage( static_cast<sal_uInt16>(nPageNumber) - 1 , PageKind::Standard )->GetName();
+ if( !aPageName.isEmpty() )
+ {
+ // Destination PageNum
+ const sal_Int32 nDestPageNum = CalcOutputPageNum(pPDFExtOutDevData, mpDoc, nPageNumber);
+
+ // insert the bookmark to this page into the NamedDestinations
+ if( pPDFExtOutDevData->GetIsExportNamedDestinations() )
+ pPDFExtOutDevData->CreateNamedDest(aPageName, aPageRect, nDestPageNum);
+
+ // add the name to the outline, (almost) same code as in sc/source/ui/unoobj/docuno.cxx
+ // issue #i40318.
+
+ if( pPDFExtOutDevData->GetIsExportBookmarks() )
+ {
+ // Destination Export
+ const sal_Int32 nDestId =
+ pPDFExtOutDevData->CreateDest(aPageRect , nDestPageNum);
+
+ // Create a new outline item:
+ pPDFExtOutDevData->CreateOutlineItem( -1 , aPageName, nDestId );
+ }
+ }
+ //<--- #i56629, #i40318
+ }
+ catch (const uno::Exception&)
+ {
+ }
+
+ }
+ }
+ else
+ {
+ uno::Reference< drawing::XShapes > xShapes;
+ rSelection >>= xShapes;
+
+ if( xShapes.is() && xShapes->getCount() )
+ {
+ SdrPageView* pPV = nullptr;
+
+ ImplRenderPaintProc aImplRenderPaintProc( mpDoc->GetLayerAdmin(),
+ pOldSdView ? pOldSdView->GetSdrPageView() : nullptr);
+
+ for( sal_uInt32 i = 0, nCount = xShapes->getCount(); i < nCount; i++ )
+ {
+ uno::Reference< drawing::XShape > xShape;
+ xShapes->getByIndex( i ) >>= xShape;
+
+ if( xShape.is() )
+ {
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xShape );
+ if( pObj && pObj->getSdrPageFromSdrObject()
+ && aImplRenderPaintProc.IsVisible( pObj )
+ && aImplRenderPaintProc.IsPrintable( pObj ) )
+ {
+ if( !pPV )
+ pPV = aView.ShowSdrPage( pObj->getSdrPageFromSdrObject() );
+
+ if( pPV )
+ aView.MarkObj( pObj, pPV );
+ }
+ }
+ }
+ aView.DrawMarkedObj(*pOut);
+ }
+ }
+}
+
+DrawViewShell* SdXImpressDocument::GetViewShell()
+{
+ DrawViewShell* pViewSh = dynamic_cast<DrawViewShell*>(mpDocShell->GetViewShell());
+ if (!pViewSh)
+ {
+ SAL_WARN("sd", "DrawViewShell not available!");
+ return nullptr;
+ }
+ return pViewSh;
+}
+
+void SdXImpressDocument::paintTile( VirtualDevice& rDevice,
+ int nOutputWidth, int nOutputHeight,
+ int nTilePosX, int nTilePosY,
+ ::tools::Long nTileWidth, ::tools::Long nTileHeight )
+{
+ DrawViewShell* pViewSh = GetViewShell();
+ if (!pViewSh)
+ return;
+
+ // Setup drawing layer to work properly. Since we use a custom VirtualDevice
+ // for the drawing, SdrPaintView::BeginCompleteRedraw() will call FindPaintWindow()
+ // unsuccessfully and use a temporary window that doesn't keep state. So patch
+ // the existing SdrPageWindow to use a temporary, and this way the state will be kept.
+ // Well, at least that's how I understand it based on Writer's RenderContextGuard,
+ // as the drawing layer classes lack documentation.
+ SdrPageWindow* patchedPageWindow = nullptr;
+ SdrPaintWindow* previousPaintWindow = nullptr;
+ std::unique_ptr<SdrPaintWindow> temporaryPaintWindow;
+ if(SdrView* pDrawView = pViewSh->GetDrawView())
+ {
+ if(SdrPageView* pSdrPageView = pDrawView->GetSdrPageView())
+ {
+ patchedPageWindow = pSdrPageView->FindPageWindow(*getDocWindow()->GetOutDev());
+ temporaryPaintWindow.reset(new SdrPaintWindow(*pDrawView, rDevice));
+ if (patchedPageWindow)
+ previousPaintWindow = patchedPageWindow->patchPaintWindow(*temporaryPaintWindow);
+ }
+ }
+
+ // Scaling. Must convert from pixels to twips. We know
+ // that VirtualDevices use a DPI of 96.
+ // We specifically calculate these scales first as we're still
+ // in TWIPs, and might as well minimize the number of conversions.
+ const Fraction scale = conversionFract(o3tl::Length::px, o3tl::Length::twip);
+ Fraction scaleX = Fraction(nOutputWidth, nTileWidth) * scale;
+ Fraction scaleY = Fraction(nOutputHeight, nTileHeight) * scale;
+
+ // svx seems to be the only component that works natively in
+ // 100th mm rather than TWIP. It makes most sense just to
+ // convert here and in getDocumentSize, and leave the tiled
+ // rendering API working in TWIPs.
+ ::tools::Long nTileWidthHMM = convertTwipToMm100( nTileWidth );
+ ::tools::Long nTileHeightHMM = convertTwipToMm100( nTileHeight );
+ int nTilePosXHMM = convertTwipToMm100( nTilePosX );
+ int nTilePosYHMM = convertTwipToMm100( nTilePosY );
+
+ MapMode aMapMode = rDevice.GetMapMode();
+ aMapMode.SetMapUnit( MapUnit::Map100thMM );
+ aMapMode.SetOrigin( Point( -nTilePosXHMM,
+ -nTilePosYHMM) );
+ aMapMode.SetScaleX( scaleX );
+ aMapMode.SetScaleY( scaleY );
+
+ rDevice.SetMapMode( aMapMode );
+
+ rDevice.SetOutputSizePixel( Size(nOutputWidth, nOutputHeight) );
+
+ Point aPoint(nTilePosXHMM, nTilePosYHMM);
+ Size aSize(nTileWidthHMM, nTileHeightHMM);
+ ::tools::Rectangle aRect(aPoint, aSize);
+
+ pViewSh->GetView()->CompleteRedraw(&rDevice, vcl::Region(aRect));
+
+ LokChartHelper::PaintAllChartsOnTile(rDevice, nOutputWidth, nOutputHeight,
+ nTilePosX, nTilePosY, nTileWidth, nTileHeight);
+
+ if(patchedPageWindow != nullptr)
+ patchedPageWindow->unpatchPaintWindow(previousPaintWindow);
+}
+
+void SdXImpressDocument::selectPart(int nPart, int nSelect)
+{
+ DrawViewShell* pViewSh = GetViewShell();
+ if (!pViewSh)
+ return;
+
+ pViewSh->SelectPage(nPart, nSelect);
+}
+
+void SdXImpressDocument::moveSelectedParts(int nPosition, bool bDuplicate)
+{
+ // Duplicating is currently unsupported.
+ if (!bDuplicate)
+ mpDoc->MovePages(nPosition);
+}
+
+OUString SdXImpressDocument::getPartInfo(int nPart)
+{
+ DrawViewShell* pViewSh = GetViewShell();
+ if (!pViewSh)
+ return OUString();
+
+ const bool bIsVisible = pViewSh->IsVisible(nPart);
+ const bool bIsSelected = pViewSh->IsSelected(nPart);
+ const sal_Int16 nMasterPageCount= pViewSh->GetDoc()->GetMasterSdPageCount(pViewSh->GetPageKind());
+
+ OUString aPartInfo = "{ \"visible\": \"" +
+ OUString::number(static_cast<unsigned int>(bIsVisible)) +
+ "\", \"selected\": \"" +
+ OUString::number(static_cast<unsigned int>(bIsSelected)) +
+ "\", \"masterPageCount\": \"" +
+ OUString::number(nMasterPageCount) +
+ "\" }";
+ return aPartInfo;
+}
+
+void SdXImpressDocument::setPart( int nPart, bool bAllowChangeFocus )
+{
+ DrawViewShell* pViewSh = GetViewShell();
+ if (!pViewSh)
+ return;
+
+ pViewSh->SwitchPage( nPart, bAllowChangeFocus );
+}
+
+int SdXImpressDocument::getParts()
+{
+ if (!mpDoc)
+ return 0;
+
+ if (isMasterViewMode())
+ return mpDoc->GetMasterSdPageCount(PageKind::Standard);
+
+ return mpDoc->GetSdPageCount(PageKind::Standard);
+}
+
+int SdXImpressDocument::getPart()
+{
+ DrawViewShell* pViewSh = GetViewShell();
+ if (!pViewSh)
+ return 0;
+
+ return pViewSh->GetViewShellBase().getPart();
+}
+
+OUString SdXImpressDocument::getPartName(int nPart)
+{
+ SdPage* pPage;
+ if (isMasterViewMode())
+ pPage = mpDoc->GetMasterSdPage(nPart, PageKind::Standard);
+ else
+ pPage = mpDoc->GetSdPage(nPart, PageKind::Standard);
+
+ if (!pPage)
+ {
+ SAL_WARN("sd", "DrawViewShell not available!");
+ return OUString();
+ }
+
+ return pPage->GetName();
+}
+
+OUString SdXImpressDocument::getPartHash(int nPart)
+{
+ SdPage* pPage;
+ if (isMasterViewMode())
+ pPage = mpDoc->GetMasterSdPage(nPart, PageKind::Standard);
+ else
+ pPage = mpDoc->GetSdPage(nPart, PageKind::Standard);
+
+ if (!pPage)
+ {
+ SAL_WARN("sd", "DrawViewShell not available!");
+ return OUString();
+ }
+
+ return OUString::number(pPage->GetHashCode());
+}
+
+bool SdXImpressDocument::isMasterViewMode()
+{
+ DrawViewShell* pViewSh = GetViewShell();
+ if (!pViewSh)
+ return false;
+
+ if (pViewSh->GetDispatcher())
+ {
+ const SfxBoolItem* isMasterViewMode = nullptr;
+ pViewSh->GetDispatcher()->QueryState(SID_SLIDE_MASTER_MODE, isMasterViewMode);
+ if (isMasterViewMode && isMasterViewMode->GetValue())
+ return true;
+ }
+ return false;
+}
+
+VclPtr<vcl::Window> SdXImpressDocument::getDocWindow()
+{
+ SolarMutexGuard aGuard;
+ DrawViewShell* pViewShell = GetViewShell();
+ VclPtr<vcl::Window> pWindow;
+ if (pViewShell)
+ pWindow = pViewShell->GetActiveWindow();
+
+ LokChartHelper aChartHelper(pViewShell->GetViewShell());
+ VclPtr<vcl::Window> pChartWindow = aChartHelper.GetWindow();
+ if (pChartWindow)
+ pWindow = pChartWindow;
+
+ return pWindow;
+}
+
+void SdXImpressDocument::setPartMode( int nPartMode )
+{
+ DrawViewShell* pViewSh = GetViewShell();
+ if (!pViewSh)
+ return;
+
+ PageKind aPageKind( PageKind::Standard );
+ switch ( nPartMode )
+ {
+ case LOK_PARTMODE_SLIDES:
+ break;
+ case LOK_PARTMODE_NOTES:
+ aPageKind = PageKind::Notes;
+ break;
+ }
+ pViewSh->SetPageKind( aPageKind );
+}
+
+Size SdXImpressDocument::getDocumentSize()
+{
+ DrawViewShell* pViewSh = GetViewShell();
+ if (!pViewSh)
+ return Size();
+
+ SdrView *pSdrView = pViewSh->GetView();
+ if (!pSdrView)
+ return Size();
+
+ SdrPageView* pCurPageView = pSdrView->GetSdrPageView();
+ if (!pCurPageView)
+ return Size();
+
+ Size aSize = pCurPageView->GetPageRect().GetSize();
+ // Convert the size in 100th mm to TWIP
+ // See paintTile above for further info.
+ return o3tl::convert(aSize, o3tl::Length::mm100, o3tl::Length::twip);
+}
+
+void SdXImpressDocument::getPostIts(::tools::JsonWriter& rJsonWriter)
+{
+ auto commentsNode = rJsonWriter.startNode("comments");
+ // Return annotations on master pages too ?
+ const sal_uInt16 nMaxPages = mpDoc->GetPageCount();
+ SdPage* pPage;
+ for (sal_uInt16 nPage = 0; nPage < nMaxPages; ++nPage)
+ {
+ pPage = static_cast<SdPage*>(mpDoc->GetPage(nPage));
+ const sd::AnnotationVector& aPageAnnotations = pPage->getAnnotations();
+
+ for (const uno::Reference<office::XAnnotation>& xAnnotation : aPageAnnotations)
+ {
+ sal_uInt32 nID = sd::getAnnotationId(xAnnotation);
+ OString nodeName = "comment" + OString::number(nID);
+ auto commentNode = rJsonWriter.startNode(nodeName.getStr());
+ rJsonWriter.put("id", nID);
+ rJsonWriter.put("author", xAnnotation->getAuthor());
+ rJsonWriter.put("dateTime", utl::toISO8601(xAnnotation->getDateTime()));
+ uno::Reference<text::XText> xText(xAnnotation->getTextRange());
+ rJsonWriter.put("text", xText->getString());
+ rJsonWriter.put("parthash", pPage->GetHashCode());
+ geometry::RealPoint2D const & rPoint = xAnnotation->getPosition();
+ geometry::RealSize2D const & rSize = xAnnotation->getSize();
+ ::tools::Rectangle aRectangle(Point(rPoint.X * 100.0, rPoint.Y * 100.0), Size(rSize.Width * 100.0, rSize.Height * 100.0));
+ aRectangle = o3tl::toTwips(aRectangle, o3tl::Length::mm100);
+ OString sRectangle = aRectangle.toString();
+ rJsonWriter.put("rectangle", sRectangle.getStr());
+ }
+ }
+}
+
+void SdXImpressDocument::initializeForTiledRendering(const css::uno::Sequence<css::beans::PropertyValue>& rArguments)
+{
+ SolarMutexGuard aGuard;
+
+ if (DrawViewShell* pViewShell = GetViewShell())
+ {
+ DrawView* pDrawView = pViewShell->GetDrawView();
+ for (const beans::PropertyValue& rValue : rArguments)
+ {
+ if (rValue.Name == ".uno:ShowBorderShadow" && rValue.Value.has<bool>())
+ pDrawView->SetPageShadowVisible(rValue.Value.get<bool>());
+ else if (rValue.Name == ".uno:Author" && rValue.Value.has<OUString>())
+ pDrawView->SetAuthor(rValue.Value.get<OUString>());
+ else if (rValue.Name == ".uno:SpellOnline" && rValue.Value.has<bool>())
+ mpDoc->SetOnlineSpell(rValue.Value.get<bool>());
+ }
+
+ // Disable comments if requested
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(mpDoc->GetDocumentType());
+ pOptions->SetShowComments(comphelper::LibreOfficeKit::isTiledAnnotations());
+
+ pViewShell->SetRuler(false);
+ pViewShell->SetScrollBarsVisible(false);
+
+ if (sd::Window* pWindow = pViewShell->GetActiveWindow())
+ {
+ // get the full page size in pixels
+ pWindow->EnableMapMode();
+ Size aSize(pWindow->LogicToPixel(pDrawView->GetSdrPageView()->GetPage()->GetSize()));
+ // Disable map mode, so that it's possible to send mouse event
+ // coordinates in logic units
+ pWindow->EnableMapMode(false);
+
+ // arrange UI elements again with new view size
+ pViewShell->GetParentWindow()->SetSizePixel(aSize);
+ pViewShell->Resize();
+ }
+
+ // Forces all images to be swapped in synchronously, this
+ // ensures that images are available when paintTile is called
+ // (whereas with async loading images start being loaded after
+ // we have painted the tile, resulting in an invalidate, followed
+ // by the tile being rerendered - which is wasteful and ugly).
+ pDrawView->SetSwapAsynchron(false);
+ }
+
+ // when the "This document may contain formatting or content that cannot
+ // be saved..." dialog appears, it is auto-cancelled with tiled rendering,
+ // causing 'Save' being disabled; so let's always save to the original
+ // format
+ auto xChanges = comphelper::ConfigurationChanges::create();
+ officecfg::Office::Common::Save::Document::WarnAlienFormat::set(false, xChanges);
+ xChanges->commit();
+
+ if (!getenv("LO_TESTNAME"))
+ SvtSlideSorterBarOptions().SetVisibleImpressView(true);
+}
+
+void SdXImpressDocument::postKeyEvent(int nType, int nCharCode, int nKeyCode)
+{
+ SolarMutexGuard aGuard;
+ SfxLokHelper::postKeyEventAsync(getDocWindow(), nType, nCharCode, nKeyCode);
+}
+
+void SdXImpressDocument::postMouseEvent(int nType, int nX, int nY, int nCount, int nButtons, int nModifier)
+{
+ SolarMutexGuard aGuard;
+
+ DrawViewShell* pViewShell = GetViewShell();
+ if (!pViewShell)
+ return;
+
+ constexpr double fScale = o3tl::convert(1.0, o3tl::Length::twip, o3tl::Length::px);
+
+ // check if user hit a chart which is being edited by him
+ LokChartHelper aChartHelper(pViewShell->GetViewShell());
+ if (aChartHelper.postMouseEvent(nType, nX, nY,
+ nCount, nButtons, nModifier,
+ fScale, fScale))
+ return;
+
+ // check if the user hit a chart which is being edited by someone else
+ // and, if so, skip current mouse event
+ if (nType != LOK_MOUSEEVENT_MOUSEMOVE)
+ {
+ if (LokChartHelper::HitAny(Point(nX, nY)))
+ return;
+ }
+
+ const Point aPos(Point(convertTwipToMm100(nX), convertTwipToMm100(nY)));
+ LokMouseEventData aMouseEventData(nType, aPos, nCount, MouseEventModifiers::SIMPLECLICK,
+ nButtons, nModifier);
+ SfxLokHelper::postMouseEventAsync(pViewShell->GetActiveWindow(), aMouseEventData);
+}
+
+void SdXImpressDocument::setTextSelection(int nType, int nX, int nY)
+{
+ SolarMutexGuard aGuard;
+
+ DrawViewShell* pViewShell = GetViewShell();
+ if (!pViewShell)
+ return;
+
+ LokChartHelper aChartHelper(pViewShell->GetViewShell());
+ if (aChartHelper.setTextSelection(nType, nX, nY))
+ return;
+
+ Point aPoint(convertTwipToMm100(nX), convertTwipToMm100(nY));
+ switch (nType)
+ {
+ case LOK_SETTEXTSELECTION_START:
+ pViewShell->SetCursorMm100Position(aPoint, /*bPoint=*/false, /*bClearMark=*/false);
+ break;
+ case LOK_SETTEXTSELECTION_END:
+ pViewShell->SetCursorMm100Position(aPoint, /*bPoint=*/true, /*bClearMark=*/false);
+ break;
+ case LOK_SETTEXTSELECTION_RESET:
+ pViewShell->SetCursorMm100Position(aPoint, /*bPoint=*/true, /*bClearMark=*/true);
+ break;
+ default:
+ assert(false);
+ break;
+ }
+}
+
+uno::Reference<datatransfer::XTransferable> SdXImpressDocument::getSelection()
+{
+ SolarMutexGuard aGuard;
+
+ DrawViewShell* pViewShell = GetViewShell();
+ if (!pViewShell)
+ return uno::Reference<datatransfer::XTransferable>();
+
+ return pViewShell->GetSelectionTransferrable();
+}
+
+void SdXImpressDocument::setGraphicSelection(int nType, int nX, int nY)
+{
+ SolarMutexGuard aGuard;
+
+ DrawViewShell* pViewShell = GetViewShell();
+ if (!pViewShell)
+ return;
+
+ constexpr double fScale = o3tl::convert(1.0, o3tl::Length::twip, o3tl::Length::px);
+
+ LokChartHelper aChartHelper(pViewShell->GetViewShell());
+ if (aChartHelper.setGraphicSelection(nType, nX, nY, fScale, fScale))
+ return;
+
+ Point aPoint(convertTwipToMm100(nX), convertTwipToMm100(nY));
+ switch (nType)
+ {
+ case LOK_SETGRAPHICSELECTION_START:
+ pViewShell->SetGraphicMm100Position(/*bStart=*/true, aPoint);
+ break;
+ case LOK_SETGRAPHICSELECTION_END:
+ pViewShell->SetGraphicMm100Position(/*bStart=*/false, aPoint);
+ break;
+ default:
+ assert(false);
+ break;
+ }
+}
+
+void SdXImpressDocument::resetSelection()
+{
+ SolarMutexGuard aGuard;
+
+ DrawViewShell* pViewShell = GetViewShell();
+ if (!pViewShell)
+ return;
+
+ SdrView* pSdrView = pViewShell->GetView();
+ if (!pSdrView)
+ return;
+
+ if (pSdrView->IsTextEdit())
+ {
+ // Reset the editeng selection.
+ pSdrView->UnmarkAll();
+ // Finish editing.
+ pSdrView->SdrEndTextEdit();
+ }
+ // Reset graphic selection.
+ pSdrView->UnmarkAll();
+}
+
+void SdXImpressDocument::setClientVisibleArea(const ::tools::Rectangle& rRectangle)
+{
+ SolarMutexGuard aGuard;
+
+ DrawViewShell* pViewShell = GetViewShell();
+ if (!pViewShell)
+ return;
+
+ pViewShell->GetViewShellBase().setLOKVisibleArea(rRectangle);
+}
+
+void SdXImpressDocument::setClipboard(const uno::Reference<datatransfer::clipboard::XClipboard>& xClipboard)
+{
+ SolarMutexGuard aGuard;
+
+ DrawViewShell* pViewShell = GetViewShell();
+ if (!pViewShell)
+ return;
+
+ pViewShell->GetActiveWindow()->SetClipboard(xClipboard);
+}
+
+bool SdXImpressDocument::isMimeTypeSupported()
+{
+ SolarMutexGuard aGuard;
+ DrawViewShell* pViewShell = GetViewShell();
+ if (!pViewShell)
+ return false;
+
+ TransferableDataHelper aDataHelper(TransferableDataHelper::CreateFromSystemClipboard(pViewShell->GetActiveWindow()));
+ return EditEngine::HasValidData(aDataHelper.GetTransferable());
+}
+
+PointerStyle SdXImpressDocument::getPointer()
+{
+ SolarMutexGuard aGuard;
+ DrawViewShell* pViewShell = GetViewShell();
+ if (!pViewShell)
+ return PointerStyle::Arrow;
+
+ Window* pWindow = pViewShell->GetActiveWindow();
+ if (!pWindow)
+ return PointerStyle::Arrow;
+
+ return pWindow->GetPointer();
+}
+
+uno::Reference< i18n::XForbiddenCharacters > SdXImpressDocument::getForbiddenCharsTable()
+{
+ uno::Reference< i18n::XForbiddenCharacters > xForb(mxForbiddenCharacters);
+
+ if( !xForb.is() )
+ mxForbiddenCharacters = xForb = new SdUnoForbiddenCharsTable( mpDoc );
+
+ return xForb;
+}
+
+void SdXImpressDocument::initializeDocument()
+{
+ if( mbClipBoard )
+ return;
+
+ switch( mpDoc->GetPageCount() )
+ {
+ case 1:
+ {
+ // nasty hack to detect clipboard document
+ mbClipBoard = true;
+ break;
+ }
+ case 0:
+ {
+ mpDoc->CreateFirstPages();
+ mpDoc->StopWorkStartupDelay();
+ break;
+ }
+ }
+}
+
+SdrModel& SdXImpressDocument::getSdrModelFromUnoModel() const
+{
+ OSL_ENSURE(GetDoc(), "No SdrModel in draw/Impress, should not happen");
+ return *GetDoc(); // TTTT should be reference
+}
+
+void SAL_CALL SdXImpressDocument::dispose()
+{
+ if( mbDisposed )
+ return;
+
+ ::SolarMutexGuard aGuard;
+
+ if( mpDoc )
+ {
+ EndListening( *mpDoc );
+ mpDoc = nullptr;
+ }
+
+ // Call the base class dispose() before setting the mbDisposed flag
+ // to true. The reason for this is that if close() has not yet been
+ // called this is done in SfxBaseModel::dispose(). At the end of
+ // that dispose() is called again. It is important to forward this
+ // second dispose() to the base class, too.
+ // As a consequence the following code has to be able to be run twice.
+ SfxBaseModel::dispose();
+ mbDisposed = true;
+
+ uno::Reference< container::XNameAccess > xLinks( mxLinks );
+ if( xLinks.is() )
+ {
+ uno::Reference< lang::XComponent > xComp( xLinks, uno::UNO_QUERY );
+ if( xComp.is() )
+ xComp->dispose();
+
+ xLinks = nullptr;
+ }
+
+ uno::Reference< drawing::XDrawPages > xDrawPagesAccess( mxDrawPagesAccess );
+ if( xDrawPagesAccess.is() )
+ {
+ uno::Reference< lang::XComponent > xComp( xDrawPagesAccess, uno::UNO_QUERY );
+ if( xComp.is() )
+ xComp->dispose();
+
+ xDrawPagesAccess = nullptr;
+ }
+
+ uno::Reference< drawing::XDrawPages > xMasterPagesAccess( mxMasterPagesAccess );
+ if( xDrawPagesAccess.is() )
+ {
+ uno::Reference< lang::XComponent > xComp( xMasterPagesAccess, uno::UNO_QUERY );
+ if( xComp.is() )
+ xComp->dispose();
+
+ xDrawPagesAccess = nullptr;
+ }
+
+ uno::Reference< container::XNameAccess > xLayerManager( mxLayerManager );
+ if( xLayerManager.is() )
+ {
+ uno::Reference< lang::XComponent > xComp( xLayerManager, uno::UNO_QUERY );
+ if( xComp.is() )
+ xComp->dispose();
+
+ xLayerManager = nullptr;
+ }
+
+ uno::Reference< container::XNameContainer > xCustomPresentationAccess( mxCustomPresentationAccess );
+ if( xCustomPresentationAccess.is() )
+ {
+ uno::Reference< lang::XComponent > xComp( xCustomPresentationAccess, uno::UNO_QUERY );
+ if( xComp.is() )
+ xComp->dispose();
+
+ xCustomPresentationAccess = nullptr;
+ }
+
+ mxDashTable = nullptr;
+ mxGradientTable = nullptr;
+ mxHatchTable = nullptr;
+ mxBitmapTable = nullptr;
+ mxTransGradientTable = nullptr;
+ mxMarkerTable = nullptr;
+ mxDrawingPool = nullptr;
+}
+
+
+SdDrawPagesAccess::SdDrawPagesAccess( SdXImpressDocument& rMyModel ) noexcept
+: mpModel( &rMyModel)
+{
+}
+
+SdDrawPagesAccess::~SdDrawPagesAccess() noexcept
+{
+}
+
+// XIndexAccess
+sal_Int32 SAL_CALL SdDrawPagesAccess::getCount()
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpModel )
+ throw lang::DisposedException();
+
+ return mpModel->mpDoc->GetSdPageCount( PageKind::Standard );
+}
+
+uno::Any SAL_CALL SdDrawPagesAccess::getByIndex( sal_Int32 Index )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpModel )
+ throw lang::DisposedException();
+
+ uno::Any aAny;
+
+ if( (Index < 0) || (Index >= mpModel->mpDoc->GetSdPageCount( PageKind::Standard ) ) )
+ throw lang::IndexOutOfBoundsException();
+
+ SdPage* pPage = mpModel->mpDoc->GetSdPage( static_cast<sal_uInt16>(Index), PageKind::Standard );
+ if( pPage )
+ {
+ uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY );
+ aAny <<= xDrawPage;
+ }
+
+ return aAny;
+}
+
+// XNameAccess
+uno::Any SAL_CALL SdDrawPagesAccess::getByName( const OUString& aName )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpModel )
+ throw lang::DisposedException();
+
+ if( !aName.isEmpty() )
+ {
+ const sal_uInt16 nCount = mpModel->mpDoc->GetSdPageCount( PageKind::Standard );
+ sal_uInt16 nPage;
+ for( nPage = 0; nPage < nCount; nPage++ )
+ {
+ SdPage* pPage = mpModel->mpDoc->GetSdPage( nPage, PageKind::Standard );
+ if(nullptr == pPage)
+ continue;
+
+ if( aName == SdDrawPage::getPageApiName( pPage ) )
+ {
+ uno::Any aAny;
+ uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY );
+ aAny <<= xDrawPage;
+ return aAny;
+ }
+ }
+ }
+
+ throw container::NoSuchElementException();
+}
+
+uno::Sequence< OUString > SAL_CALL SdDrawPagesAccess::getElementNames()
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpModel )
+ throw lang::DisposedException();
+
+ const sal_uInt16 nCount = mpModel->mpDoc->GetSdPageCount( PageKind::Standard );
+ uno::Sequence< OUString > aNames( nCount );
+ OUString* pNames = aNames.getArray();
+
+ sal_uInt16 nPage;
+ for( nPage = 0; nPage < nCount; nPage++ )
+ {
+ SdPage* pPage = mpModel->mpDoc->GetSdPage( nPage, PageKind::Standard );
+ *pNames++ = SdDrawPage::getPageApiName( pPage );
+ }
+
+ return aNames;
+}
+
+sal_Bool SAL_CALL SdDrawPagesAccess::hasByName( const OUString& aName )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpModel )
+ throw lang::DisposedException();
+
+ const sal_uInt16 nCount = mpModel->mpDoc->GetSdPageCount( PageKind::Standard );
+ sal_uInt16 nPage;
+ for( nPage = 0; nPage < nCount; nPage++ )
+ {
+ SdPage* pPage = mpModel->mpDoc->GetSdPage( nPage, PageKind::Standard );
+ if(nullptr == pPage)
+ continue;
+
+ if( aName == SdDrawPage::getPageApiName( pPage ) )
+ return true;
+ }
+
+ return false;
+}
+
+// XElementAccess
+uno::Type SAL_CALL SdDrawPagesAccess::getElementType()
+{
+ return cppu::UnoType<drawing::XDrawPage>::get();
+}
+
+sal_Bool SAL_CALL SdDrawPagesAccess::hasElements()
+{
+ return getCount() > 0;
+}
+
+// XDrawPages
+
+/**
+ * Creates a new page with model at the specified position.
+ * @returns corresponding SdDrawPage
+ */
+uno::Reference< drawing::XDrawPage > SAL_CALL SdDrawPagesAccess::insertNewByIndex( sal_Int32 nIndex )
+{
+ ::SolarMutexGuard aGuard;
+ comphelper::ProfileZone aZone("insertNewByIndex");
+
+ if( nullptr == mpModel )
+ throw lang::DisposedException();
+
+ if( mpModel->mpDoc )
+ {
+ SdPage* pPage = mpModel->InsertSdPage( static_cast<sal_uInt16>(nIndex), false );
+ if( pPage )
+ {
+ uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY );
+ return xDrawPage;
+ }
+ }
+ uno::Reference< drawing::XDrawPage > xDrawPage;
+ return xDrawPage;
+}
+
+/**
+ * Removes the specified SdDrawPage from the model and the internal list. It
+ * only works, if there is at least one *normal* page in the model after
+ * removing this page.
+ */
+void SAL_CALL SdDrawPagesAccess::remove( const uno::Reference< drawing::XDrawPage >& xPage )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpModel || mpModel->mpDoc == nullptr )
+ throw lang::DisposedException();
+
+ SdDrawDocument& rDoc = *mpModel->mpDoc;
+
+ sal_uInt16 nPageCount = rDoc.GetSdPageCount( PageKind::Standard );
+ if( nPageCount > 1 )
+ {
+ // get pPage from xPage and determine the Id (nPos ) afterwards
+ SdDrawPage* pSvxPage = comphelper::getFromUnoTunnel<SdDrawPage>( xPage );
+ if( pSvxPage )
+ {
+ SdPage* pPage = static_cast<SdPage*>(pSvxPage->GetSdrPage());
+ if(pPage && ( pPage->GetPageKind() == PageKind::Standard ) )
+ {
+ sal_uInt16 nPage = pPage->GetPageNum();
+
+ SdPage* pNotesPage = static_cast< SdPage* >( rDoc.GetPage( nPage+1 ) );
+
+ bool bUndo = rDoc.IsUndoEnabled();
+ if( bUndo )
+ {
+ // Add undo actions and delete the pages. The order of adding
+ // the undo actions is important.
+ rDoc.BegUndo( SdResId( STR_UNDO_DELETEPAGES ) );
+ rDoc.AddUndo(rDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pNotesPage));
+ rDoc.AddUndo(rDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage));
+ }
+
+ rDoc.RemovePage( nPage ); // the page
+ rDoc.RemovePage( nPage ); // the notes page
+
+ if( bUndo )
+ {
+ rDoc.EndUndo();
+ }
+ }
+ }
+ }
+
+ mpModel->SetModified();
+}
+
+// XServiceInfo
+
+OUString SAL_CALL SdDrawPagesAccess::getImplementationName( )
+{
+ return "SdDrawPagesAccess";
+}
+
+sal_Bool SAL_CALL SdDrawPagesAccess::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+uno::Sequence< OUString > SAL_CALL SdDrawPagesAccess::getSupportedServiceNames( )
+{
+ return { "com.sun.star.drawing.DrawPages" };
+}
+
+// XComponent
+void SAL_CALL SdDrawPagesAccess::dispose( )
+{
+ mpModel = nullptr;
+}
+
+void SAL_CALL SdDrawPagesAccess::addEventListener( const uno::Reference< lang::XEventListener >& )
+{
+ OSL_FAIL( "not implemented!" );
+}
+
+void SAL_CALL SdDrawPagesAccess::removeEventListener( const uno::Reference< lang::XEventListener >& )
+{
+ OSL_FAIL( "not implemented!" );
+}
+
+
+SdMasterPagesAccess::SdMasterPagesAccess( SdXImpressDocument& rMyModel ) noexcept
+: mpModel(&rMyModel)
+{
+}
+
+SdMasterPagesAccess::~SdMasterPagesAccess() noexcept
+{
+}
+
+// XComponent
+void SAL_CALL SdMasterPagesAccess::dispose( )
+{
+ mpModel = nullptr;
+}
+
+void SAL_CALL SdMasterPagesAccess::addEventListener( const uno::Reference< lang::XEventListener >& )
+{
+ OSL_FAIL( "not implemented!" );
+}
+
+void SAL_CALL SdMasterPagesAccess::removeEventListener( const uno::Reference< lang::XEventListener >& )
+{
+ OSL_FAIL( "not implemented!" );
+}
+
+// XIndexAccess
+sal_Int32 SAL_CALL SdMasterPagesAccess::getCount()
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpModel->mpDoc )
+ throw lang::DisposedException();
+
+ return mpModel->mpDoc->GetMasterSdPageCount(PageKind::Standard);
+}
+
+/**
+ * Provides a drawing::XDrawPage interface for accessing the Masterpage at the
+ * specified position in the model.
+ */
+uno::Any SAL_CALL SdMasterPagesAccess::getByIndex( sal_Int32 Index )
+{
+ ::SolarMutexGuard aGuard;
+ comphelper::ProfileZone aZone("SdMasterPagesAccess::getByIndex");
+
+ if( nullptr == mpModel )
+ throw lang::DisposedException();
+
+ uno::Any aAny;
+
+ if( (Index < 0) || (Index >= mpModel->mpDoc->GetMasterSdPageCount( PageKind::Standard ) ) )
+ throw lang::IndexOutOfBoundsException();
+
+ SdPage* pPage = mpModel->mpDoc->GetMasterSdPage( static_cast<sal_uInt16>(Index), PageKind::Standard );
+ if( pPage )
+ {
+ uno::Reference< drawing::XDrawPage > xDrawPage( pPage->getUnoPage(), uno::UNO_QUERY );
+ aAny <<= xDrawPage;
+ }
+
+ return aAny;
+}
+
+// XElementAccess
+uno::Type SAL_CALL SdMasterPagesAccess::getElementType()
+{
+ return cppu::UnoType<drawing::XDrawPage>::get();
+}
+
+sal_Bool SAL_CALL SdMasterPagesAccess::hasElements()
+{
+ return getCount() > 0;
+}
+
+// XDrawPages
+uno::Reference< drawing::XDrawPage > SAL_CALL SdMasterPagesAccess::insertNewByIndex( sal_Int32 nInsertPos )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpModel )
+ throw lang::DisposedException();
+
+ uno::Reference< drawing::XDrawPage > xDrawPage;
+
+ SdDrawDocument* pDoc = mpModel->mpDoc;
+ if( pDoc )
+ {
+ // calculate internal index and check for range errors
+ const sal_Int32 nMPageCount = pDoc->GetMasterPageCount();
+ nInsertPos = nInsertPos * 2 + 1;
+ if( nInsertPos < 0 || nInsertPos > nMPageCount )
+ nInsertPos = nMPageCount;
+
+ // now generate a unique name for the new masterpage
+ const OUString aStdPrefix( SdResId(STR_LAYOUT_DEFAULT_NAME) );
+ OUString aPrefix( aStdPrefix );
+
+ bool bUnique = true;
+
+ std::vector<OUString> aPageNames;
+ for (sal_Int32 nMaster = 1; nMaster < nMPageCount; ++nMaster)
+ {
+ const SdPage* pPage = static_cast<const SdPage*>(pDoc->GetMasterPage(static_cast<sal_uInt16>(nMaster)));
+ if (!pPage)
+ continue;
+ aPageNames.push_back(pPage->GetName());
+ if (aPageNames.back() == aPrefix)
+ bUnique = false;
+ }
+
+ sal_Int32 i = 0;
+ while (!bUnique)
+ {
+ aPrefix = aStdPrefix + " " + OUString::number(++i);
+ bUnique = std::find(aPageNames.begin(), aPageNames.end(), aPrefix) == aPageNames.end();
+ }
+
+ OUString aLayoutName = aPrefix + SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE;
+
+ // create styles
+ static_cast<SdStyleSheetPool*>(pDoc->GetStyleSheetPool())->CreateLayoutStyleSheets( aPrefix );
+
+ // get the first page for initial size and border settings
+ SdPage* pPage = mpModel->mpDoc->GetSdPage( sal_uInt16(0), PageKind::Standard );
+ SdPage* pRefNotesPage = mpModel->mpDoc->GetSdPage( sal_uInt16(0), PageKind::Notes);
+
+ // create and insert new draw masterpage
+ rtl::Reference<SdPage> pMPage = mpModel->mpDoc->AllocSdPage(true);
+ pMPage->SetSize( pPage->GetSize() );
+ pMPage->SetBorder( pPage->GetLeftBorder(),
+ pPage->GetUpperBorder(),
+ pPage->GetRightBorder(),
+ pPage->GetLowerBorder() );
+ pMPage->SetLayoutName( aLayoutName );
+ pDoc->InsertMasterPage(pMPage.get(), static_cast<sal_uInt16>(nInsertPos));
+
+ {
+ // ensure default MasterPage fill
+ pMPage->EnsureMasterPageDefaultBackground();
+ }
+
+ xDrawPage.set( pMPage->getUnoPage(), uno::UNO_QUERY );
+
+ // create and insert new notes masterpage
+ rtl::Reference<SdPage> pMNotesPage = mpModel->mpDoc->AllocSdPage(true);
+ pMNotesPage->SetSize( pRefNotesPage->GetSize() );
+ pMNotesPage->SetPageKind(PageKind::Notes);
+ pMNotesPage->SetBorder( pRefNotesPage->GetLeftBorder(),
+ pRefNotesPage->GetUpperBorder(),
+ pRefNotesPage->GetRightBorder(),
+ pRefNotesPage->GetLowerBorder() );
+ pMNotesPage->SetLayoutName( aLayoutName );
+ pDoc->InsertMasterPage(pMNotesPage.get(), static_cast<sal_uInt16>(nInsertPos) + 1);
+ pMNotesPage->SetAutoLayout(AUTOLAYOUT_NOTES, true, true);
+ mpModel->SetModified();
+ }
+
+ return xDrawPage;
+}
+
+/**
+ * Removes the specified SdMasterPage from the model and the internal list. It
+ * only works, if there is no *normal* page using this page as MasterPage in
+ * the model.
+ */
+void SAL_CALL SdMasterPagesAccess::remove( const uno::Reference< drawing::XDrawPage >& xPage )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpModel || mpModel->mpDoc == nullptr )
+ throw lang::DisposedException();
+
+ SdMasterPage* pSdPage = comphelper::getFromUnoTunnel<SdMasterPage>( xPage );
+ if(pSdPage == nullptr)
+ return;
+
+ SdPage* pPage = dynamic_cast< SdPage* > (pSdPage->GetSdrPage());
+
+ DBG_ASSERT( pPage && pPage->IsMasterPage(), "SdMasterPage is not masterpage?");
+
+ if( !pPage || !pPage->IsMasterPage() || (mpModel->mpDoc->GetMasterPageUserCount(pPage) > 0))
+ return; //Todo: this should be excepted
+
+ // only standard pages can be removed directly
+ if( pPage->GetPageKind() != PageKind::Standard )
+ return;
+
+ sal_uInt16 nPage = pPage->GetPageNum();
+
+ SdDrawDocument& rDoc = *mpModel->mpDoc;
+
+ SdPage* pNotesPage = static_cast< SdPage* >( rDoc.GetMasterPage( nPage+1 ) );
+
+ bool bUndo = rDoc.IsUndoEnabled();
+ if( bUndo )
+ {
+ // Add undo actions and delete the pages. The order of adding
+ // the undo actions is important.
+ rDoc.BegUndo( SdResId( STR_UNDO_DELETEPAGES ) );
+ rDoc.AddUndo(rDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pNotesPage));
+ rDoc.AddUndo(rDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage));
+ }
+
+ // remove both pages
+ rDoc.RemoveMasterPage( nPage );
+ rDoc.RemoveMasterPage( nPage );
+
+ if( bUndo )
+ {
+ rDoc.EndUndo();
+ }
+}
+
+// XServiceInfo
+
+OUString SAL_CALL SdMasterPagesAccess::getImplementationName( )
+{
+ return "SdMasterPagesAccess";
+}
+
+sal_Bool SAL_CALL SdMasterPagesAccess::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+uno::Sequence< OUString > SAL_CALL SdMasterPagesAccess::getSupportedServiceNames( )
+{
+ return { "com.sun.star.drawing.MasterPages" };
+}
+
+
+SdDocLinkTargets::SdDocLinkTargets( SdXImpressDocument& rMyModel ) noexcept
+: mpModel( &rMyModel )
+{
+}
+
+SdDocLinkTargets::~SdDocLinkTargets() noexcept
+{
+}
+
+// XComponent
+void SAL_CALL SdDocLinkTargets::dispose( )
+{
+ mpModel = nullptr;
+}
+
+void SAL_CALL SdDocLinkTargets::addEventListener( const uno::Reference< lang::XEventListener >& )
+{
+ OSL_FAIL( "not implemented!" );
+}
+
+void SAL_CALL SdDocLinkTargets::removeEventListener( const uno::Reference< lang::XEventListener >& )
+{
+ OSL_FAIL( "not implemented!" );
+}
+
+// XNameAccess
+uno::Any SAL_CALL SdDocLinkTargets::getByName( const OUString& aName )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpModel )
+ throw lang::DisposedException();
+
+ SdPage* pPage = FindPage( aName );
+
+ if( pPage == nullptr )
+ throw container::NoSuchElementException();
+
+ uno::Any aAny;
+
+ uno::Reference< beans::XPropertySet > xProps( pPage->getUnoPage(), uno::UNO_QUERY );
+ if( xProps.is() )
+ aAny <<= xProps;
+
+ return aAny;
+}
+
+uno::Sequence< OUString > SAL_CALL SdDocLinkTargets::getElementNames()
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpModel )
+ throw lang::DisposedException();
+
+ SdDrawDocument* pDoc = mpModel->GetDoc();
+ if( pDoc == nullptr )
+ {
+ return { };
+ }
+
+ if( pDoc->GetDocumentType() == DocumentType::Draw )
+ {
+ const sal_uInt16 nMaxPages = pDoc->GetSdPageCount( PageKind::Standard );
+ const sal_uInt16 nMaxMasterPages = pDoc->GetMasterSdPageCount( PageKind::Standard );
+
+ uno::Sequence< OUString > aSeq( nMaxPages + nMaxMasterPages );
+ OUString* pStr = aSeq.getArray();
+
+ sal_uInt16 nPage;
+ // standard pages
+ for( nPage = 0; nPage < nMaxPages; nPage++ )
+ *pStr++ = pDoc->GetSdPage( nPage, PageKind::Standard )->GetName();
+
+ // master pages
+ for( nPage = 0; nPage < nMaxMasterPages; nPage++ )
+ *pStr++ = pDoc->GetMasterSdPage( nPage, PageKind::Standard )->GetName();
+ return aSeq;
+ }
+ else
+ {
+ const sal_uInt16 nMaxPages = pDoc->GetPageCount();
+ const sal_uInt16 nMaxMasterPages = pDoc->GetMasterPageCount();
+
+ uno::Sequence< OUString > aSeq( nMaxPages + nMaxMasterPages );
+ OUString* pStr = aSeq.getArray();
+
+ sal_uInt16 nPage;
+ // standard pages
+ for( nPage = 0; nPage < nMaxPages; nPage++ )
+ *pStr++ = static_cast<SdPage*>(pDoc->GetPage( nPage ))->GetName();
+
+ // master pages
+ for( nPage = 0; nPage < nMaxMasterPages; nPage++ )
+ *pStr++ = static_cast<SdPage*>(pDoc->GetMasterPage( nPage ))->GetName();
+ return aSeq;
+ }
+}
+
+sal_Bool SAL_CALL SdDocLinkTargets::hasByName( const OUString& aName )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpModel )
+ throw lang::DisposedException();
+
+ return FindPage( aName ) != nullptr;
+}
+
+// container::XElementAccess
+uno::Type SAL_CALL SdDocLinkTargets::getElementType()
+{
+ return cppu::UnoType<beans::XPropertySet>::get();
+}
+
+sal_Bool SAL_CALL SdDocLinkTargets::hasElements()
+{
+ ::SolarMutexGuard aGuard;
+
+ if( nullptr == mpModel )
+ throw lang::DisposedException();
+
+ return mpModel->GetDoc() != nullptr;
+}
+
+SdPage* SdDocLinkTargets::FindPage( std::u16string_view rName ) const
+{
+ SdDrawDocument* pDoc = mpModel->GetDoc();
+ if( pDoc == nullptr )
+ return nullptr;
+
+ const sal_uInt16 nMaxPages = pDoc->GetPageCount();
+ const sal_uInt16 nMaxMasterPages = pDoc->GetMasterPageCount();
+
+ sal_uInt16 nPage;
+ SdPage* pPage;
+
+ const bool bDraw = pDoc->GetDocumentType() == DocumentType::Draw;
+
+ // standard pages
+ for( nPage = 0; nPage < nMaxPages; nPage++ )
+ {
+ pPage = static_cast<SdPage*>(pDoc->GetPage( nPage ));
+ if( (pPage->GetName() == rName) && (!bDraw || (pPage->GetPageKind() == PageKind::Standard)) )
+ return pPage;
+ }
+
+ // master pages
+ for( nPage = 0; nPage < nMaxMasterPages; nPage++ )
+ {
+ pPage = static_cast<SdPage*>(pDoc->GetMasterPage( nPage ));
+ if( (pPage->GetName() == rName) && (!bDraw || (pPage->GetPageKind() == PageKind::Standard)) )
+ return pPage;
+ }
+
+ return nullptr;
+}
+
+// XServiceInfo
+OUString SAL_CALL SdDocLinkTargets::getImplementationName()
+{
+ return "SdDocLinkTargets";
+}
+
+sal_Bool SAL_CALL SdDocLinkTargets::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+uno::Sequence< OUString > SAL_CALL SdDocLinkTargets::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.LinkTargets" };
+}
+
+rtl::Reference< SdXImpressDocument > SdXImpressDocument::GetModel( SdDrawDocument const & rDocument )
+{
+ rtl::Reference< SdXImpressDocument > xRet;
+ ::sd::DrawDocShell* pDocShell(rDocument.GetDocSh());
+ if( pDocShell )
+ {
+ uno::Reference<frame::XModel> xModel(pDocShell->GetModel());
+
+ xRet.set( dynamic_cast< SdXImpressDocument* >( xModel.get() ) );
+ }
+
+ return xRet;
+}
+
+void NotifyDocumentEvent( SdDrawDocument const & rDocument, const OUString& rEventName )
+{
+ rtl::Reference< SdXImpressDocument > xModel( SdXImpressDocument::GetModel( rDocument ) );
+
+ if( xModel.is() )
+ {
+ uno::Reference< uno::XInterface > xSource( static_cast<uno::XWeak*>( xModel.get() ) );
+ css::document::EventObject aEvent( xSource, rEventName );
+ xModel->notifyEvent(aEvent );
+ }
+}
+
+void NotifyDocumentEvent( SdDrawDocument const & rDocument, const OUString& rEventName, const uno::Reference< uno::XInterface >& xSource )
+{
+ rtl::Reference< SdXImpressDocument > xModel( SdXImpressDocument::GetModel( rDocument ) );
+
+ if( xModel.is() )
+ {
+ css::document::EventObject aEvent( xSource, rEventName );
+ xModel->notifyEvent(aEvent );
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unomodule.cxx b/sd/source/ui/unoidl/unomodule.cxx
new file mode 100644
index 000000000..d862f7c9d
--- /dev/null
+++ b/sd/source/ui/unoidl/unomodule.cxx
@@ -0,0 +1,132 @@
+/* -*- 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 <com/sun/star/frame/DispatchResultState.hpp>
+#include <cppuhelper/supportsservice.hxx>
+
+#include <sddll.hxx>
+#include <sdmod.hxx>
+#include "unomodule.hxx"
+#include <sfx2/objface.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/request.hxx>
+#include <vcl/svapp.hxx>
+
+using namespace ::com::sun::star;
+
+ // XNotifyingDispatch
+void SAL_CALL SdUnoModule::dispatchWithNotification( const util::URL& aURL, const uno::Sequence< beans::PropertyValue >& aArgs, const uno::Reference< frame::XDispatchResultListener >& xListener )
+{
+ // there is no guarantee, that we are holded alive during this method!
+ // May the outside dispatch container will be updated by a CONTEXT_CHANGED
+ // asynchronous ...
+ uno::Reference< uno::XInterface > xThis(static_cast< frame::XNotifyingDispatch* >(this));
+
+ SolarMutexGuard aGuard;
+ SdDLL::Init();
+ const SfxSlot* pSlot = SD_MOD()->GetInterface()->GetSlot( aURL.Complete );
+
+ sal_Int16 aState = frame::DispatchResultState::DONTKNOW;
+ if ( !pSlot )
+ aState = frame::DispatchResultState::FAILURE;
+ else
+ {
+ SfxRequest aReq( pSlot, aArgs, SfxCallMode::SYNCHRON, SD_MOD()->GetPool() );
+ const SfxPoolItem* pResult = SD_MOD()->ExecuteSlot( aReq );
+ if ( pResult )
+ aState = frame::DispatchResultState::SUCCESS;
+ else
+ aState = frame::DispatchResultState::FAILURE;
+ }
+
+ if ( xListener.is() )
+ {
+ xListener->dispatchFinished(
+ frame::DispatchResultEvent(
+ xThis, aState, uno::Any()));
+ }
+}
+ // XDispatch
+void SAL_CALL SdUnoModule::dispatch( const util::URL& aURL, const uno::Sequence< beans::PropertyValue >& aArgs )
+{
+ dispatchWithNotification(aURL, aArgs, uno::Reference< frame::XDispatchResultListener >());
+}
+
+void SAL_CALL SdUnoModule::addStatusListener(const uno::Reference< frame::XStatusListener > &, const util::URL&)
+{
+}
+
+void SAL_CALL SdUnoModule::removeStatusListener(const uno::Reference< frame::XStatusListener > &, const util::URL&)
+{
+}
+
+uno::Sequence< uno::Reference< frame::XDispatch > > SAL_CALL SdUnoModule::queryDispatches( const uno::Sequence< frame::DispatchDescriptor >& seqDescripts )
+{
+ sal_Int32 nCount = seqDescripts.getLength();
+ uno::Sequence< uno::Reference< frame::XDispatch > > lDispatcher( nCount );
+
+ std::transform(seqDescripts.begin(), seqDescripts.end(), lDispatcher.getArray(),
+ [this](const frame::DispatchDescriptor& rDescr) -> uno::Reference<frame::XDispatch> {
+ return queryDispatch(rDescr.FeatureURL, rDescr.FrameName, rDescr.SearchFlags); });
+
+ return lDispatcher;
+}
+
+// XDispatchProvider
+uno::Reference< frame::XDispatch > SAL_CALL SdUnoModule::queryDispatch( const util::URL& aURL, const OUString&, sal_Int32 )
+{
+ SolarMutexGuard aGuard;
+ SdDLL::Init();
+ const SfxSlot* pSlot = SD_MOD()->GetInterface()->GetSlot( aURL.Complete );
+
+ uno::Reference< frame::XDispatch > xSlot;
+ if ( pSlot )
+ xSlot = this;
+
+ return xSlot;
+}
+
+// XServiceInfo
+OUString SAL_CALL SdUnoModule::getImplementationName( )
+{
+ return "com.sun.star.comp.Draw.DrawingModule";
+}
+
+sal_Bool SAL_CALL SdUnoModule::supportsService( const OUString& sServiceName )
+{
+ return cppu::supportsService(this, sServiceName);
+}
+
+uno::Sequence< OUString > SAL_CALL SdUnoModule::getSupportedServiceNames( )
+{
+ return { "com.sun.star.drawing.ModuleDispatcher" };
+}
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+com_sun_star_comp_Draw_DrawingModule_get_implementation(css::uno::XComponentContext* ,
+ css::uno::Sequence<css::uno::Any> const &)
+{
+ SolarMutexGuard aGuard;
+
+ return cppu::acquire(new SdUnoModule);
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unomodule.hxx b/sd/source/ui/unoidl/unomodule.hxx
new file mode 100644
index 000000000..bc78c6b19
--- /dev/null
+++ b/sd/source/ui/unoidl/unomodule.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <rtl/ustring.hxx>
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/frame/XNotifyingDispatch.hpp>
+#include <com/sun/star/uno/Reference.h>
+#include <cppuhelper/implbase.hxx>
+
+#include <com/sun/star/lang/XServiceInfo.hpp>
+
+namespace com::sun::star::beans { struct PropertyValue; }
+namespace com::sun::star::frame { struct DispatchDescriptor; }
+
+class SdUnoModule : public ::cppu::WeakImplHelper< css::frame::XDispatchProvider, css::frame::XNotifyingDispatch, css::lang::XServiceInfo >
+{
+public:
+ SdUnoModule() {}
+
+ // XnotifyingDispatch
+ virtual void SAL_CALL dispatchWithNotification( const css::util::URL& URL, const css::uno::Sequence< css::beans::PropertyValue >& Arguments, const css::uno::Reference< css::frame::XDispatchResultListener >& Listener ) override;
+
+ // XDispatch
+ virtual void SAL_CALL dispatch( const css::util::URL& aURL, const css::uno::Sequence< css::beans::PropertyValue >& aArgs ) override;
+ virtual void SAL_CALL addStatusListener(const css::uno::Reference< css::frame::XStatusListener > & xControl, const css::util::URL& aURL) override;
+ virtual void SAL_CALL removeStatusListener(const css::uno::Reference< css::frame::XStatusListener > & xControl, const css::util::URL& aURL) override;
+
+ // XDispatchProvider
+ virtual css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL queryDispatches( const css::uno::Sequence< css::frame::DispatchDescriptor >& seqDescriptor ) override ;
+ virtual css::uno::Reference< css::frame::XDispatch > SAL_CALL queryDispatch( const css::util::URL & aURL ,
+ const OUString & sTargetFrameName,
+ sal_Int32 eSearchFlags ) 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;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unoobj.cxx b/sd/source/ui/unoidl/unoobj.cxx
new file mode 100644
index 000000000..6ed6729f9
--- /dev/null
+++ b/sd/source/ui/unoidl/unoobj.cxx
@@ -0,0 +1,1627 @@
+/* -*- 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 <memory>
+#include <string_view>
+#include <utility>
+
+#include <com/sun/star/style/XStyle.hpp>
+#include <com/sun/star/presentation/ClickAction.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/beans/PropertyState.hpp>
+#include <rtl/ustrbuf.hxx>
+#include <svl/itemprop.hxx>
+#include <svl/style.hxx>
+#include <svx/svdpool.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/app.hxx>
+#include <svtools/unoimap.hxx>
+#include <svtools/unoevent.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/event.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <comphelper/extract.hxx>
+#include <cppuhelper/implbase.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <svx/unoshape.hxx>
+#include <svx/svdotext.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/ImageMapInfo.hxx>
+#include <filter/msfilter/msdffimp.hxx>
+#include <svl/instrm.hxx>
+#include <editeng/outlobj.hxx>
+#include <Outliner.hxx>
+#include <comphelper/sequence.hxx>
+#include <svx/svdogrp.hxx>
+#include <o3tl/typed_flags_set.hxx>
+#include <vcl/svapp.hxx>
+#include <tools/debug.hxx>
+
+#include <anminfo.hxx>
+#include "unoobj.hxx"
+#include <unoprnms.hxx>
+#include <unomodel.hxx>
+#include <drawdoc.hxx>
+#include <sdmod.hxx>
+#include <sdpage.hxx>
+#include <ViewShell.hxx>
+#include <unopage.hxx>
+#include <DrawDocShell.hxx>
+#include <EffectMigration.hxx>
+
+using namespace ::sd;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::presentation;
+using namespace ::com::sun::star::animations;
+
+using ::com::sun::star::uno::Any;
+using ::com::sun::star::drawing::XShape;
+
+#define WID_EFFECT 1
+#define WID_SPEED 2
+#define WID_TEXTEFFECT 3
+#define WID_BOOKMARK 4
+#define WID_CLICKACTION 5
+#define WID_PLAYFULL 6
+#define WID_SOUNDFILE 7
+#define WID_SOUNDON 8
+#define WID_BLUESCREEN 9
+#define WID_VERB 10
+#define WID_DIMCOLOR 11
+#define WID_DIMHIDE 12
+#define WID_DIMPREV 13
+#define WID_PRESORDER 14
+#define WID_STYLE 15
+#define WID_ANIMPATH 16
+#define WID_IMAGEMAP 17
+#define WID_ISANIMATION 18
+#define WID_THAT_NEED_ANIMINFO 19
+
+#define WID_ISEMPTYPRESOBJ 20
+#define WID_ISPRESOBJ 21
+#define WID_MASTERDEPEND 22
+
+#define WID_NAVORDER 23
+#define WID_PLACEHOLDERTEXT 24
+#define WID_LEGACYFRAGMENT 25
+
+#define IMPRESS_MAP_ENTRIES \
+ { u"" UNO_NAME_OBJ_LEGACYFRAGMENT,WID_LEGACYFRAGMENT, cppu::UnoType<drawing::XShape>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_ANIMATIONPATH, WID_ANIMPATH, cppu::UnoType<drawing::XShape>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_BOOKMARK, WID_BOOKMARK, cppu::UnoType<OUString>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_DIMCOLOR, WID_DIMCOLOR, cppu::UnoType<sal_Int32>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_DIMHIDE, WID_DIMHIDE, cppu::UnoType<bool>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_DIMPREV, WID_DIMPREV, cppu::UnoType<bool>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_EFFECT, WID_EFFECT, cppu::UnoType<presentation::AnimationEffect>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_ISEMPTYPRESOBJ,WID_ISEMPTYPRESOBJ, cppu::UnoType<bool>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_ISPRESOBJ, WID_ISPRESOBJ, cppu::UnoType<bool>::get(), css::beans::PropertyAttribute::READONLY, 0},\
+ { u"" UNO_NAME_OBJ_MASTERDEPENDENT,WID_MASTERDEPEND, cppu::UnoType<bool>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_CLICKACTION, WID_CLICKACTION, cppu::UnoType<presentation::ClickAction>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_PLAYFULL, WID_PLAYFULL, cppu::UnoType<bool>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_PRESORDER, WID_PRESORDER, cppu::UnoType<sal_Int32>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_STYLE, WID_STYLE, cppu::UnoType<style::XStyle>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},\
+ { u"" UNO_NAME_OBJ_SOUNDFILE, WID_SOUNDFILE, cppu::UnoType<OUString>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_SOUNDON, WID_SOUNDON, cppu::UnoType<bool>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_SPEED, WID_SPEED, cppu::UnoType<presentation::AnimationSpeed>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_TEXTEFFECT, WID_TEXTEFFECT, cppu::UnoType<presentation::AnimationEffect>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_BLUESCREEN, WID_BLUESCREEN, cppu::UnoType<sal_Int32>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_VERB, WID_VERB, cppu::UnoType<sal_Int32>::get(), 0, 0},\
+ { u"IsAnimation", WID_ISANIMATION, cppu::UnoType<bool>::get(), 0, 0},\
+ { u"NavigationOrder", WID_NAVORDER, cppu::UnoType<sal_Int32>::get(), 0, 0},\
+ { u"PlaceholderText", WID_PLACEHOLDERTEXT, cppu::UnoType<OUString>::get(), 0, 0},\
+ { u"", 0, css::uno::Type(), 0, 0 }
+
+ static const SfxItemPropertyMapEntry* lcl_GetImpress_SdXShapePropertyGraphicMap_Impl()
+ {
+
+ static const SfxItemPropertyMapEntry aImpress_SdXShapePropertyGraphicMap_Impl[] =
+ {
+ { u"ImageMap", WID_IMAGEMAP, cppu::UnoType<container::XIndexContainer>::get(), 0, 0 },
+ IMPRESS_MAP_ENTRIES
+ };
+ return aImpress_SdXShapePropertyGraphicMap_Impl;
+ }
+
+ static const SfxItemPropertyMapEntry* lcl_GetImpress_SdXShapePropertySimpleMap_Impl()
+ {
+
+ static const SfxItemPropertyMapEntry aImpress_SdXShapePropertySimpleMap_Impl[] =
+ {
+ IMPRESS_MAP_ENTRIES
+ };
+ return aImpress_SdXShapePropertySimpleMap_Impl;
+ }
+
+ #define DRAW_MAP_ENTRIES\
+ { u"" UNO_NAME_OBJ_BOOKMARK, WID_BOOKMARK, cppu::UnoType<OUString>::get(), 0, 0},\
+ { u"" UNO_NAME_OBJ_CLICKACTION, WID_CLICKACTION, cppu::UnoType<presentation::ClickAction>::get(),0, 0},\
+ { u"" UNO_NAME_OBJ_STYLE, WID_STYLE, cppu::UnoType<style::XStyle>::get(), css::beans::PropertyAttribute::MAYBEVOID, 0},\
+ { u"NavigationOrder", WID_NAVORDER, cppu::UnoType<sal_Int32>::get(), 0, 0},\
+ { u"", 0, css::uno::Type(), 0, 0 }
+
+ static const SfxItemPropertyMapEntry* lcl_GetDraw_SdXShapePropertySimpleMap_Impl()
+ {
+ static const SfxItemPropertyMapEntry aDraw_SdXShapePropertyMap_Impl[] =
+ {
+ DRAW_MAP_ENTRIES
+ };
+ return aDraw_SdXShapePropertyMap_Impl;
+ }
+ static const SfxItemPropertyMapEntry* lcl_GetDraw_SdXShapePropertyGraphicMap_Impl()
+ {
+ static const SfxItemPropertyMapEntry aDraw_SdXShapePropertyGraphicMap_Impl[] =
+ {
+ { u"ImageMap", WID_IMAGEMAP, cppu::UnoType<container::XIndexContainer>::get(), 0, 0 },
+ DRAW_MAP_ENTRIES
+ };
+ return aDraw_SdXShapePropertyGraphicMap_Impl;
+ }
+ static const SfxItemPropertyMapEntry* lcl_ImplGetShapePropertyMap( bool bImpress, bool bGraphicObj )
+ {
+ const SfxItemPropertyMapEntry* pRet = nullptr;
+ if( bImpress )
+ {
+ if( bGraphicObj )
+ pRet = lcl_GetImpress_SdXShapePropertyGraphicMap_Impl();
+ else
+ pRet = lcl_GetImpress_SdXShapePropertySimpleMap_Impl();
+ }
+ else
+ {
+ if( bGraphicObj )
+ pRet = lcl_GetDraw_SdXShapePropertyGraphicMap_Impl();
+ else
+ pRet = lcl_GetDraw_SdXShapePropertySimpleMap_Impl();
+ }
+ return pRet;
+
+ }
+ static const SvxItemPropertySet* lcl_ImplGetShapePropertySet( bool bImpress, bool bGraphicObj )
+ {
+ const SvxItemPropertySet* pRet = nullptr;
+ if( bImpress )
+ {
+ if( bGraphicObj )
+ {
+ static SvxItemPropertySet aImpress_SdXShapePropertyGraphicSet_Impl( lcl_GetImpress_SdXShapePropertyGraphicMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool());
+ pRet = &aImpress_SdXShapePropertyGraphicSet_Impl;
+ }
+ else
+ {
+ static SvxItemPropertySet aImpress_SdXShapePropertySet_Impl(lcl_GetImpress_SdXShapePropertySimpleMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool());
+ pRet = &aImpress_SdXShapePropertySet_Impl;
+ }
+ }
+ else
+ {
+ if( bGraphicObj )
+ {
+ static SvxItemPropertySet aDraw_SdXShapePropertyGraphicSet_Impl(lcl_GetDraw_SdXShapePropertyGraphicMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool());
+ pRet = &aDraw_SdXShapePropertyGraphicSet_Impl;
+ }
+ else
+ {
+ static SvxItemPropertySet aDraw_SdXShapePropertySet_Impl( lcl_GetDraw_SdXShapePropertySimpleMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool());
+ pRet = &aDraw_SdXShapePropertySet_Impl;
+ }
+ }
+ return pRet;
+ }
+ static const SfxItemPropertyMapEntry* lcl_GetEmpty_SdXShapePropertyMap_Impl()
+ {
+ static const SfxItemPropertyMapEntry aEmpty_SdXShapePropertyMap_Impl[] =
+ {
+ { u"", 0, css::uno::Type(), 0, 0 }
+ };
+ return aEmpty_SdXShapePropertyMap_Impl;
+ }
+
+ static const SvxItemPropertySet* lcl_GetEmpty_SdXShapePropertySet_Impl()
+ {
+ static SvxItemPropertySet aEmptyPropSet( lcl_GetEmpty_SdXShapePropertyMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool() );
+ return &aEmptyPropSet;
+ }
+const SvEventDescription* ImplGetSupportedMacroItems()
+{
+ static const SvEventDescription aMacroDescriptionsImpl[] =
+ {
+ { SvMacroItemId::OnMouseOver, "OnMouseOver" },
+ { SvMacroItemId::OnMouseOut, "OnMouseOut" },
+ { SvMacroItemId::NONE, nullptr }
+ };
+
+ return aMacroDescriptionsImpl;
+}
+
+SdXShape::SdXShape(SvxShape* pShape, SdXImpressDocument* pModel)
+: mpShape( pShape ),
+ mpPropSet( pModel?
+ lcl_ImplGetShapePropertySet(pModel->IsImpressDocument(), pShape->getShapeKind() == SdrObjKind::Graphic )
+ : lcl_GetEmpty_SdXShapePropertySet_Impl() ),
+ mpMap( pModel?
+ lcl_ImplGetShapePropertyMap(pModel->IsImpressDocument(), pShape->getShapeKind() == SdrObjKind::Graphic )
+ : lcl_GetEmpty_SdXShapePropertyMap_Impl() ),
+ mpModel(pModel)
+{
+
+ pShape->setMaster( this );
+}
+
+SdXShape::~SdXShape() noexcept
+{
+}
+
+void SdXShape::dispose()
+{
+ mpShape->setMaster( nullptr );
+ delete this;
+}
+
+uno::Any SAL_CALL SdXShape::queryInterface( const uno::Type & rType )
+{
+ return mpShape->queryInterface( rType );
+}
+
+void SAL_CALL SdXShape::acquire() noexcept
+{
+ mpShape->acquire();
+}
+
+void SAL_CALL SdXShape::release() noexcept
+{
+ mpShape->release();
+}
+
+bool SdXShape::queryAggregation( const css::uno::Type & rType, css::uno::Any& aAny )
+{
+ if( mpModel && mpModel ->IsImpressDocument() )
+ {
+ if( rType == cppu::UnoType<document::XEventsSupplier>::get())
+ {
+ aAny <<= uno::Reference< document::XEventsSupplier >(this);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+uno::Sequence< uno::Type > SAL_CALL SdXShape::getTypes()
+{
+ if( mpModel && !mpModel->IsImpressDocument() )
+ {
+ return mpShape->_getTypes();
+ }
+ else
+ {
+ SdrObjKind nObjId = mpShape->getShapeKind();
+ uno::Sequence< uno::Type > aTypes;
+ SdTypesCache& gImplTypesCache = SD_MOD()->gImplTypesCache;
+ SdTypesCache::iterator aIter( gImplTypesCache.find( nObjId ) );
+ if( aIter == gImplTypesCache.end() )
+ {
+ aTypes = mpShape->_getTypes();
+ sal_uInt32 nCount = aTypes.getLength();
+ aTypes.realloc( nCount+1 );
+ aTypes.getArray()[nCount] = cppu::UnoType<lang::XTypeProvider>::get();
+
+ gImplTypesCache.insert(std::make_pair(nObjId, aTypes));
+ }
+ else
+ {
+ // use the already computed implementation id
+ aTypes = (*aIter).second;
+ }
+ return aTypes;
+ }
+}
+
+// XPropertyState
+beans::PropertyState SAL_CALL SdXShape::getPropertyState( const OUString& PropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ if( mpPropSet->getPropertyMapEntry(PropertyName) )
+ {
+ return beans::PropertyState_DIRECT_VALUE;
+ }
+ else
+ {
+ SdrObject* pObj = mpShape->GetSdrObject();
+ if( pObj == nullptr || ( pObj->getSdrPageFromSdrObject()->IsMasterPage() && pObj->IsEmptyPresObj() ) )
+ return beans::PropertyState_DEFAULT_VALUE;
+
+ return mpShape->_getPropertyState( PropertyName );
+ }
+}
+
+void SAL_CALL SdXShape::setPropertyToDefault( const OUString& PropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ if( mpPropSet->getPropertyMapEntry(PropertyName) )
+ {
+ return;
+ }
+ else
+ {
+ mpShape->_setPropertyToDefault(PropertyName);
+ }
+}
+
+uno::Any SAL_CALL SdXShape::getPropertyDefault( const OUString& aPropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ if( mpPropSet->getPropertyMapEntry(aPropertyName) )
+ {
+ return getPropertyValue( aPropertyName );
+ }
+ else
+ {
+ uno::Any aRet( mpShape->_getPropertyDefault(aPropertyName) );
+ return aRet;
+ }
+}
+
+//XPropertySet
+css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL SdXShape::getPropertySetInfo()
+{
+ SfxItemPropertyMapEntry const * nObjId = mpShape->getPropertyMapEntries();
+ css::uno::Reference<css::beans::XPropertySetInfo> pInfo;
+
+ SdExtPropertySetInfoCache& rCache = (mpModel && mpModel->IsImpressDocument()) ?
+ SD_MOD()->gImplImpressPropertySetInfoCache : SD_MOD()->gImplDrawPropertySetInfoCache;
+
+ SdExtPropertySetInfoCache::iterator aIter( rCache.find( nObjId ) );
+ if( aIter == rCache.end() )
+ {
+ uno::Reference< beans::XPropertySetInfo > xInfo( mpShape->_getPropertySetInfo() );
+ pInfo = new SfxExtItemPropertySetInfo( mpMap, xInfo->getProperties() );
+
+ rCache.insert(std::make_pair(nObjId, pInfo));
+ }
+ else
+ {
+ // use the already computed implementation id
+ pInfo = (*aIter).second;
+ }
+
+ return pInfo;
+}
+
+void SAL_CALL SdXShape::setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue )
+{
+ SolarMutexGuard aGuard;
+
+ const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(aPropertyName);
+
+ if( pEntry )
+ {
+ SdrObject* pObj = mpShape->GetSdrObject();
+ if( pObj )
+ {
+ SdAnimationInfo* pInfo = GetAnimationInfo(pEntry->nWID <= WID_THAT_NEED_ANIMINFO);
+
+ switch(pEntry->nWID)
+ {
+ case WID_NAVORDER:
+ {
+ sal_Int32 nNavOrder = 0;
+ if(!(aValue >>= nNavOrder))
+ throw lang::IllegalArgumentException();
+
+ SdrObjList* pObjList = pObj->getParentSdrObjListFromSdrObject();
+ if( pObjList )
+ pObjList->SetObjectNavigationPosition( *pObj, (nNavOrder < 0) ? SAL_MAX_UINT32 : static_cast< sal_uInt32 >( nNavOrder ) );
+ break;
+ }
+
+ case WID_EFFECT:
+ {
+ AnimationEffect eEffect;
+ if(!(aValue >>= eEffect))
+ throw lang::IllegalArgumentException();
+
+ EffectMigration::SetAnimationEffect( mpShape, eEffect );
+ break;
+ }
+ case WID_TEXTEFFECT:
+ {
+ AnimationEffect eEffect;
+ if(!(aValue >>= eEffect))
+ throw lang::IllegalArgumentException();
+
+ EffectMigration::SetTextAnimationEffect( mpShape, eEffect );
+ break;
+ }
+ case WID_SPEED:
+ {
+ AnimationSpeed eSpeed;
+ if(!(aValue>>=eSpeed))
+ throw lang::IllegalArgumentException();
+
+ EffectMigration::SetAnimationSpeed( mpShape, eSpeed );
+ break;
+ }
+ case WID_ISANIMATION:
+ {
+ bool bIsAnimation(false);
+
+ if(!(aValue >>= bIsAnimation))
+ {
+ throw lang::IllegalArgumentException();
+ }
+
+ if(bIsAnimation)
+ {
+ SdrObjGroup* pGroup = dynamic_cast< SdrObjGroup* >(pObj);
+ SdPage* pPage = pGroup ? dynamic_cast< SdPage* >(pGroup->getSdrPageFromSdrObject()) : nullptr;
+
+ if (pPage)
+ {
+ // #i42894# Animated Group object, migrate that effect
+ EffectMigration::CreateAnimatedGroup(*pGroup, *pPage);
+
+ // #i42894# unfortunately when doing this all group members have to
+ // be moved to the page as direct members, else the currently
+ // available forms of animation do not work. If it succeeds,
+ // the group is empty and can be removed and deleted
+ if(!pGroup->GetSubList()->GetObjCount())
+ {
+ pPage->NbcRemoveObject(pGroup->GetOrdNum());
+
+ // always use SdrObject::Free(...) for SdrObjects (!)
+ SdrObject* pTemp(pGroup);
+ SdrObject::Free(pTemp);
+ }
+ }
+ }
+ //pInfo->mbIsMovie = bIsAnimation;
+ break;
+ }
+ case WID_BOOKMARK:
+ {
+ OUString aString;
+ if(!(aValue >>= aString))
+ throw lang::IllegalArgumentException();
+
+ pInfo->SetBookmark( SdDrawPage::getUiNameFromPageApiName( aString ) );
+ break;
+ }
+ case WID_CLICKACTION:
+ ::cppu::any2enum< presentation::ClickAction >( pInfo->meClickAction, aValue);
+ break;
+
+// TODO: WID_PLAYFULL:
+ case WID_SOUNDFILE:
+ {
+ OUString aString;
+ if(!(aValue >>= aString))
+ throw lang::IllegalArgumentException();
+ pInfo->maSoundFile = aString;
+ EffectMigration::UpdateSoundEffect( mpShape, pInfo );
+ break;
+ }
+
+ case WID_SOUNDON:
+ {
+ if( !(aValue >>= pInfo->mbSoundOn) )
+ throw lang::IllegalArgumentException();
+ EffectMigration::UpdateSoundEffect( mpShape, pInfo );
+ break;
+ }
+ case WID_VERB:
+ {
+ sal_Int32 nVerb = 0;
+ if(!(aValue >>= nVerb))
+ throw lang::IllegalArgumentException();
+
+ pInfo->mnVerb = static_cast<sal_uInt16>(nVerb);
+ break;
+ }
+ case WID_DIMCOLOR:
+ {
+ sal_Int32 nColor = 0;
+
+ if( !(aValue >>= nColor) )
+ throw lang::IllegalArgumentException();
+
+ EffectMigration::SetDimColor( mpShape, nColor );
+ break;
+ }
+ case WID_DIMHIDE:
+ {
+ bool bDimHide = false;
+ if( !(aValue >>= bDimHide) )
+ throw lang::IllegalArgumentException();
+
+ EffectMigration::SetDimHide( mpShape, bDimHide );
+ break;
+ }
+ case WID_DIMPREV:
+ {
+ bool bDimPrevious = false;
+ if( !(aValue >>= bDimPrevious) )
+ throw lang::IllegalArgumentException();
+
+ EffectMigration::SetDimPrevious( mpShape, bDimPrevious );
+ break;
+ }
+ case WID_PRESORDER:
+ {
+ sal_Int32 nNewPos = 0;
+ if( !(aValue >>= nNewPos) )
+ throw lang::IllegalArgumentException();
+
+ EffectMigration::SetPresentationOrder( mpShape, nNewPos );
+ break;
+ }
+ case WID_STYLE:
+ SetStyleSheet( aValue );
+ break;
+ case WID_ISEMPTYPRESOBJ:
+ SetEmptyPresObj( ::cppu::any2bool(aValue) );
+ break;
+ case WID_MASTERDEPEND:
+ SetMasterDepend( ::cppu::any2bool(aValue) );
+ break;
+
+ case WID_LEGACYFRAGMENT:
+ {
+ uno::Reference< io::XInputStream > xInputStream;
+ aValue >>= xInputStream;
+ if( xInputStream.is() )
+ {
+ SvInputStream aStream( xInputStream );
+ SdrObject* pObject = mpShape->GetSdrObject();
+ SvxMSDffManager::ReadObjText( aStream, pObject );
+ }
+ }
+ break;
+
+ case WID_ANIMPATH:
+ {
+ uno::Reference< drawing::XShape > xShape( aValue, uno::UNO_QUERY );
+ SdrPathObj* pObj2 = xShape.is() ? dynamic_cast<SdrPathObj*>(SdrObject::getSdrObjectFromXShape(xShape)) : nullptr;
+
+ if( pObj2 == nullptr )
+ throw lang::IllegalArgumentException();
+
+ EffectMigration::SetAnimationPath( mpShape, pObj2 );
+ break;
+ }
+ case WID_IMAGEMAP:
+ {
+ SdDrawDocument* pDoc = mpModel?mpModel->GetDoc():nullptr;
+ if( pDoc )
+ {
+ ImageMap aImageMap;
+ uno::Reference< uno::XInterface > xImageMap;
+ aValue >>= xImageMap;
+
+ if( !xImageMap.is() || !SvUnoImageMap_fillImageMap( xImageMap, aImageMap ) )
+ throw lang::IllegalArgumentException();
+
+ SvxIMapInfo* pIMapInfo = SvxIMapInfo::GetIMapInfo(pObj);
+ if( pIMapInfo )
+ {
+ // replace existing image map
+ pIMapInfo->SetImageMap( aImageMap );
+ }
+ else
+ {
+ // insert new user data with image map
+ pObj->AppendUserData(std::unique_ptr<SdrObjUserData>(new SvxIMapInfo(aImageMap) ));
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ else
+ {
+ mpShape->_setPropertyValue(aPropertyName, aValue);
+ }
+
+ if( mpModel )
+ mpModel->SetModified();
+}
+
+css::uno::Any SAL_CALL SdXShape::getPropertyValue( const OUString& PropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ uno::Any aRet;
+
+ const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(PropertyName);
+
+ if( pEntry && mpShape->GetSdrObject() )
+ {
+ SdAnimationInfo* pInfo = GetAnimationInfo();
+
+ switch(pEntry->nWID)
+ {
+ case WID_NAVORDER:
+ {
+ const sal_uInt32 nNavOrder = mpShape->GetSdrObject()->GetNavigationPosition();
+ aRet <<= nNavOrder == SAL_MAX_UINT32 ? static_cast<sal_Int32>(-1) : static_cast< sal_Int32 >(nNavOrder);
+ }
+ break;
+ case WID_EFFECT:
+ aRet <<= EffectMigration::GetAnimationEffect( mpShape );
+ break;
+ case WID_TEXTEFFECT:
+ aRet <<= EffectMigration::GetTextAnimationEffect( mpShape );
+ break;
+ case WID_ISPRESOBJ:
+ aRet <<= IsPresObj();
+ break;
+ case WID_ISEMPTYPRESOBJ:
+ aRet <<= IsEmptyPresObj();
+ break;
+ case WID_MASTERDEPEND:
+ aRet <<= IsMasterDepend();
+ break;
+ case WID_SPEED:
+ aRet <<= EffectMigration::GetAnimationSpeed( mpShape );
+ break;
+ case WID_ISANIMATION:
+ aRet <<= (pInfo && pInfo->mbIsMovie);
+ break;
+ case WID_PLACEHOLDERTEXT:
+ aRet <<= GetPlaceholderText();
+ break;
+ case WID_BOOKMARK:
+ {
+ OUString aString;
+ SdDrawDocument* pDoc = mpModel ? mpModel->GetDoc() : nullptr;
+ if (pInfo && pDoc)
+ {
+ // is the bookmark a page?
+ bool bIsMasterPage;
+ if(pDoc->GetPageByName( pInfo->GetBookmark(), bIsMasterPage ) != SDRPAGE_NOTFOUND)
+ {
+ aString = SdDrawPage::getPageApiNameFromUiName( pInfo->GetBookmark() );
+ }
+ else
+ {
+ aString = pInfo->GetBookmark() ;
+ sal_Int32 nPos = aString.lastIndexOf( '#' );
+ if( nPos >= 0 )
+ {
+ OUString aURL( aString.copy( 0, nPos+1 ) );
+ OUString aName( aString.copy( nPos+1 ) );
+ if(pDoc->GetPageByName( aName, bIsMasterPage ) != SDRPAGE_NOTFOUND)
+ {
+ aURL += SdDrawPage::getPageApiNameFromUiName( aName );
+ aString = aURL;
+ }
+ }
+ }
+ }
+
+ aRet <<= aString;
+ break;
+ }
+ case WID_CLICKACTION:
+ aRet <<= ( pInfo?pInfo->meClickAction:presentation::ClickAction_NONE );
+ break;
+ case WID_PLAYFULL:
+ aRet <<= ( pInfo && pInfo->mbPlayFull );
+ break;
+ case WID_SOUNDFILE:
+ aRet <<= EffectMigration::GetSoundFile( mpShape );
+ break;
+ case WID_SOUNDON:
+ aRet <<= EffectMigration::GetSoundOn( mpShape );
+ break;
+ case WID_BLUESCREEN:
+ aRet <<= pInfo ? pInfo->maBlueScreen : Color(0x00ffffff);
+ break;
+ case WID_VERB:
+ aRet <<= static_cast<sal_Int32>( pInfo?pInfo->mnVerb:0 );
+ break;
+ case WID_DIMCOLOR:
+ aRet <<= EffectMigration::GetDimColor( mpShape );
+ break;
+ case WID_DIMHIDE:
+ aRet <<= EffectMigration::GetDimHide( mpShape );
+ break;
+ case WID_DIMPREV:
+ aRet <<= EffectMigration::GetDimPrevious( mpShape );
+ break;
+ case WID_PRESORDER:
+ aRet <<= EffectMigration::GetPresentationOrder( mpShape );
+ break;
+ case WID_STYLE:
+ aRet = GetStyleSheet();
+ break;
+ case WID_IMAGEMAP:
+ {
+ uno::Reference< uno::XInterface > xImageMap;
+
+ SdDrawDocument* pDoc = mpModel?mpModel->GetDoc():nullptr;
+ if( pDoc )
+ {
+
+ SvxIMapInfo* pIMapInfo = SvxIMapInfo::GetIMapInfo(mpShape->GetSdrObject());
+ if( pIMapInfo )
+ {
+ const ImageMap& rIMap = pIMapInfo->GetImageMap();
+ xImageMap = SvUnoImageMap_createInstance( rIMap, ImplGetSupportedMacroItems() );
+ }
+ else
+ {
+ xImageMap = SvUnoImageMap_createInstance();
+ }
+ }
+
+ aRet <<= uno::Reference< container::XIndexContainer >::query( xImageMap );
+ break;
+ }
+ }
+ }
+ else
+ {
+ aRet = mpShape->_getPropertyValue(PropertyName);
+ }
+
+ return aRet;
+}
+
+/** */
+SdAnimationInfo* SdXShape::GetAnimationInfo( bool bCreate ) const
+{
+ SdAnimationInfo* pInfo = nullptr;
+
+ SdrObject* pObj = mpShape->GetSdrObject();
+ if(pObj)
+ pInfo = SdDrawDocument::GetShapeUserData(*pObj, bCreate);
+
+ return pInfo;
+}
+
+uno::Sequence< OUString > SAL_CALL SdXShape::getSupportedServiceNames()
+{
+ std::vector<std::u16string_view> aAdd{ u"com.sun.star.presentation.Shape",
+ u"com.sun.star.document.LinkTarget" };
+
+ SdrObject* pObj = mpShape->GetSdrObject();
+ if(pObj && pObj->GetObjInventor() == SdrInventor::Default )
+ {
+ SdrObjKind nInventor = pObj->GetObjIdentifier();
+ switch( nInventor )
+ {
+ case SdrObjKind::TitleText:
+ aAdd.emplace_back(u"com.sun.star.presentation.TitleTextShape");
+ break;
+ case SdrObjKind::OutlineText:
+ aAdd.emplace_back(u"com.sun.star.presentation.OutlinerShape");
+ break;
+ default: ;
+ }
+ }
+ return comphelper::concatSequences(mpShape->_getSupportedServiceNames(), aAdd);
+}
+
+/** checks if this is a presentation object
+ */
+bool SdXShape::IsPresObj() const
+{
+ SdrObject* pObj = mpShape->GetSdrObject();
+ if(pObj)
+ {
+ SdPage* pPage = dynamic_cast<SdPage* >(pObj->getSdrPageFromSdrObject());
+ if(pPage)
+ return pPage->GetPresObjKind(pObj) != PresObjKind::NONE;
+ }
+ return false;
+}
+
+/** checks if this presentation object is empty
+ */
+bool SdXShape::IsEmptyPresObj() const
+{
+ SdrObject* pObj = mpShape->GetSdrObject();
+ if( (pObj != nullptr) && pObj->IsEmptyPresObj() )
+ {
+ // check if the object is in edit, then if it's temporarily not empty
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
+ if( pTextObj == nullptr )
+ return true;
+
+ return !pTextObj->CanCreateEditOutlinerParaObject();
+ }
+
+ return false;
+}
+
+OUString SdXShape::GetPlaceholderText() const
+{
+ // only possible if this actually *is* a presentation object
+ if( !IsPresObj() )
+ return OUString();
+
+ SdrObject* pObj = mpShape->GetSdrObject();
+ if( pObj == nullptr )
+ return OUString();
+
+ SdPage* pPage = dynamic_cast< SdPage* >(pObj->getSdrPageFromSdrObject());
+ DBG_ASSERT( pPage, "no page?" );
+ if( pPage == nullptr )
+ return OUString();
+
+ return pPage->GetPresObjText( pPage->GetPresObjKind(pObj) );
+}
+
+/** sets/reset the empty status of a presentation object
+*/
+void SdXShape::SetEmptyPresObj(bool bEmpty)
+{
+ // only possible if this actually *is* a presentation object
+ if( !IsPresObj() )
+ return;
+
+ SdrObject* pObj = mpShape->GetSdrObject();
+ if( pObj == nullptr )
+ return;
+
+ if( pObj->IsEmptyPresObj() == bEmpty )
+ return;
+
+ if(!bEmpty)
+ {
+ OutlinerParaObject* pOutlinerParaObject = pObj->GetOutlinerParaObject();
+ const bool bVertical = pOutlinerParaObject && pOutlinerParaObject->IsEffectivelyVertical();
+
+ // really delete SdrOutlinerObj at pObj
+ pObj->NbcSetOutlinerParaObject(std::nullopt);
+ if( bVertical )
+ if (auto pTextObj = dynamic_cast<SdrTextObj*>( pObj ) )
+ pTextObj->SetVerticalWriting( true );
+
+ SdrGrafObj* pGraphicObj = dynamic_cast<SdrGrafObj*>( pObj );
+ if( pGraphicObj )
+ {
+ Graphic aEmpty;
+ pGraphicObj->SetGraphic(aEmpty);
+ }
+ else
+ {
+ SdrOle2Obj* pOleObj = dynamic_cast< SdrOle2Obj* >( pObj );
+ if( pOleObj )
+ {
+ pOleObj->ClearGraphic();
+ }
+ }
+ }
+ else
+ {
+ // now set an empty OutlinerParaObject at pObj without
+ // any content but with the style of the old OutlinerParaObjects
+ // first paragraph
+ do
+ {
+ SdDrawDocument* pDoc = mpModel?mpModel->GetDoc():nullptr;
+ DBG_ASSERT( pDoc, "no document?" );
+ if( pDoc == nullptr)
+ break;
+
+ SdOutliner* pOutliner = pDoc->GetInternalOutliner();
+ DBG_ASSERT( pOutliner, "no outliner?" );
+ if( pOutliner == nullptr )
+ break;
+
+ SdPage* pPage = dynamic_cast< SdPage* >(pObj->getSdrPageFromSdrObject());
+ DBG_ASSERT( pPage, "no page?" );
+ if( pPage == nullptr )
+ break;
+
+ OutlinerParaObject* pOutlinerParaObject = pObj->GetOutlinerParaObject();
+ pOutliner->SetText( *pOutlinerParaObject );
+ const bool bVertical = pOutliner->IsVertical();
+
+ pOutliner->Clear();
+ pOutliner->SetVertical( bVertical );
+ pOutliner->SetStyleSheetPool( static_cast<SfxStyleSheetPool*>(pDoc->GetStyleSheetPool()) );
+ pOutliner->SetStyleSheet( 0, pPage->GetTextStyleSheetForObject( pObj ) );
+ pOutliner->Insert( pPage->GetPresObjText( pPage->GetPresObjKind(pObj) ) );
+ pObj->SetOutlinerParaObject( pOutliner->CreateParaObject() );
+ pOutliner->Clear();
+ }
+ while(false);
+ }
+
+ pObj->SetEmptyPresObj(bEmpty);
+}
+
+bool SdXShape::IsMasterDepend() const noexcept
+{
+ SdrObject* pObj = mpShape->GetSdrObject();
+ return pObj && pObj->GetUserCall() != nullptr;
+}
+
+void SdXShape::SetMasterDepend( bool bDepend ) noexcept
+{
+ if( IsMasterDepend() == bDepend )
+ return;
+
+ SdrObject* pObj = mpShape->GetSdrObject();
+ if( pObj )
+ {
+ if( bDepend )
+ {
+ SdPage* pPage = dynamic_cast< SdPage* >(pObj->getSdrPageFromSdrObject());
+ pObj->SetUserCall( pPage );
+ }
+ else
+ {
+ pObj->SetUserCall( nullptr );
+ }
+ }
+}
+
+void SdXShape::SetStyleSheet( const uno::Any& rAny )
+{
+ SdrObject* pObj = mpShape->GetSdrObject();
+ if( pObj == nullptr )
+ throw beans::UnknownPropertyException();
+
+ uno::Reference< style::XStyle > xStyle( rAny, uno::UNO_QUERY );
+ SfxStyleSheet* pStyleSheet = SfxUnoStyleSheet::getUnoStyleSheet( xStyle );
+
+ const SfxStyleSheet* pOldStyleSheet = pObj->GetStyleSheet();
+ if( pOldStyleSheet == pStyleSheet )
+ return;
+
+ if( pStyleSheet == nullptr || (pStyleSheet->GetFamily() != SfxStyleFamily::Para && pStyleSheet->GetFamily() != SfxStyleFamily::Page) )
+ throw lang::IllegalArgumentException();
+
+ pObj->SetStyleSheet( pStyleSheet, false );
+
+ SdDrawDocument* pDoc = mpModel? mpModel->GetDoc() : nullptr;
+ if( pDoc )
+ {
+ ::sd::DrawDocShell* pDocSh = pDoc->GetDocSh();
+ ::sd::ViewShell* pViewSh = pDocSh ? pDocSh->GetViewShell() : nullptr;
+
+ if( pViewSh )
+ pViewSh->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 );
+ }
+}
+
+uno::Any SdXShape::GetStyleSheet() const
+{
+ SdrObject* pObj = mpShape->GetSdrObject();
+ if( pObj == nullptr )
+ throw beans::UnknownPropertyException();
+
+ SfxStyleSheet* pStyleSheet = pObj->GetStyleSheet();
+ // it is possible for shapes inside a draw to have a presentation style
+ // but we don't want this for the api
+ if( (pStyleSheet == nullptr) || ((pStyleSheet->GetFamily() != SfxStyleFamily::Para) && !mpModel->IsImpressDocument()) )
+ return Any();
+
+ return Any( uno::Reference< style::XStyle >( dynamic_cast< SfxUnoStyleSheet* >( pStyleSheet ) ) );
+}
+
+class SdUnoEventsAccess : public cppu::WeakImplHelper< css::container::XNameReplace, css::lang::XServiceInfo >
+{
+private:
+ SdXShape* mpShape;
+
+public:
+ explicit SdUnoEventsAccess(SdXShape* pShape) noexcept;
+
+ // XNameReplace
+ virtual void SAL_CALL replaceByName( const OUString& aName, const css::uno::Any& aElement ) override;
+
+ // XNameAccess
+ virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
+ virtual css::uno::Sequence< OUString > SAL_CALL getElementNames( ) override;
+ virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
+
+ // XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType( ) override;
+ virtual sal_Bool SAL_CALL hasElements( ) 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;
+};
+
+// XEventsSupplier
+uno::Reference< container::XNameReplace > SAL_CALL SdXShape::getEvents( )
+{
+ return new SdUnoEventsAccess( this );
+}
+
+constexpr OUStringLiteral gaStrOnClick( u"OnClick" );
+constexpr OUStringLiteral gaStrServiceName( u"com.sun.star.documents.Events" );
+constexpr OUStringLiteral gaStrEventType( u"EventType" );
+constexpr OUStringLiteral gaStrPresentation( u"Presentation" );
+constexpr OUStringLiteral gaStrLibrary(u"Library");
+constexpr OUStringLiteral gaStrMacroName(u"MacroName");
+constexpr OUStringLiteral gaStrClickAction( u"ClickAction" );
+constexpr OUStringLiteral gaStrBookmark( u"Bookmark" );
+constexpr OUStringLiteral gaStrEffect( u"Effect" );
+constexpr OUStringLiteral gaStrPlayFull( u"PlayFull" );
+constexpr OUStringLiteral gaStrVerb( u"Verb" );
+constexpr OUStringLiteral gaStrSoundURL( u"SoundURL" );
+constexpr OUStringLiteral gaStrSpeed( u"Speed" );
+constexpr OUStringLiteral gaStrStarBasic( u"StarBasic" );
+constexpr OUStringLiteral gaStrScript( u"Script" );
+
+SdUnoEventsAccess::SdUnoEventsAccess( SdXShape* pShape ) noexcept
+ : mpShape( pShape )
+{
+}
+
+namespace {
+
+enum class FoundFlags {
+ NONE = 0x0000,
+ ClickAction = 0x0001,
+ Bookmark = 0x0002,
+ Effect = 0x0004,
+ PlayFull = 0x0008,
+ Verb = 0x0010,
+ SoundUrl = 0x0020,
+ Speed = 0x0040,
+ EventType = 0x0080,
+ Macro = 0x0100,
+ Library = 0x0200,
+};
+
+}
+
+namespace o3tl {
+ template<> struct typed_flags<FoundFlags> : is_typed_flags<FoundFlags, 0x03ff> {};
+}
+
+static void clearEventsInAnimationInfo( SdAnimationInfo* pInfo )
+{
+ pInfo->SetBookmark( "" );
+ pInfo->mbSecondSoundOn = false;
+ pInfo->mbSecondPlayFull = false;
+ pInfo->meClickAction = presentation::ClickAction_NONE;
+ pInfo->meSecondEffect = presentation::AnimationEffect_NONE;
+ pInfo->meSecondSpeed = presentation::AnimationSpeed_MEDIUM;
+ pInfo->mnVerb = 0;
+}
+
+// XNameReplace
+void SAL_CALL SdUnoEventsAccess::replaceByName( const OUString& aName, const uno::Any& aElement )
+{
+ if( mpShape == nullptr || aName != gaStrOnClick )
+ throw container::NoSuchElementException();
+
+ uno::Sequence< beans::PropertyValue > aProperties;
+ if( !aElement.hasValue() || aElement.getValueType() != getElementType() || !(aElement >>= aProperties) )
+ throw lang::IllegalArgumentException();
+
+ FoundFlags nFound = FoundFlags::NONE;
+
+ OUString aStrEventType;
+ presentation::ClickAction eClickAction = presentation::ClickAction_NONE;
+ presentation::AnimationEffect eEffect = presentation::AnimationEffect_NONE;
+ presentation::AnimationSpeed eSpeed = presentation::AnimationSpeed_MEDIUM;
+ OUString aStrSoundURL;
+ bool bPlayFull = false;
+ sal_Int32 nVerb = 0;
+ OUString aStrMacro;
+ OUString aStrLibrary;
+ OUString aStrBookmark;
+
+ for( const beans::PropertyValue& rProperty : std::as_const(aProperties) )
+ {
+ if( !( nFound & FoundFlags::EventType ) && rProperty.Name == gaStrEventType )
+ {
+ if( rProperty.Value >>= aStrEventType )
+ {
+ nFound |= FoundFlags::EventType;
+ continue;
+ }
+ }
+ else if( !( nFound & FoundFlags::ClickAction ) && rProperty.Name == gaStrClickAction )
+ {
+ if( rProperty.Value >>= eClickAction )
+ {
+ nFound |= FoundFlags::ClickAction;
+ continue;
+ }
+ }
+ else if( !( nFound & FoundFlags::Macro ) && ( rProperty.Name == gaStrMacroName || rProperty.Name == gaStrScript ) )
+ {
+ if( rProperty.Value >>= aStrMacro )
+ {
+ nFound |= FoundFlags::Macro;
+ continue;
+ }
+ }
+ else if( !( nFound & FoundFlags::Library ) && rProperty.Name == gaStrLibrary )
+ {
+ if( rProperty.Value >>= aStrLibrary )
+ {
+ nFound |= FoundFlags::Library;
+ continue;
+ }
+ }
+ else if( !( nFound & FoundFlags::Effect ) && rProperty.Name == gaStrEffect )
+ {
+ if( rProperty.Value >>= eEffect )
+ {
+ nFound |= FoundFlags::Effect;
+ continue;
+ }
+ }
+ else if( !( nFound & FoundFlags::Bookmark ) && rProperty.Name == gaStrBookmark )
+ {
+ if( rProperty.Value >>= aStrBookmark )
+ {
+ nFound |= FoundFlags::Bookmark;
+ continue;
+ }
+ }
+ else if( !( nFound & FoundFlags::Speed ) && rProperty.Name == gaStrSpeed )
+ {
+ if( rProperty.Value >>= eSpeed )
+ {
+ nFound |= FoundFlags::Speed;
+ continue;
+ }
+ }
+ else if( !( nFound & FoundFlags::SoundUrl ) && rProperty.Name == gaStrSoundURL )
+ {
+ if( rProperty.Value >>= aStrSoundURL )
+ {
+ nFound |= FoundFlags::SoundUrl;
+ continue;
+ }
+ }
+ else if( !( nFound & FoundFlags::PlayFull ) && rProperty.Name == gaStrPlayFull )
+ {
+ if( rProperty.Value >>= bPlayFull )
+ {
+ nFound |= FoundFlags::PlayFull;
+ continue;
+ }
+ }
+ else if( !( nFound & FoundFlags::Verb ) && rProperty.Name == gaStrVerb )
+ {
+ if( rProperty.Value >>= nVerb )
+ {
+ nFound |= FoundFlags::Verb;
+ continue;
+ }
+ }
+
+ throw lang::IllegalArgumentException();
+ }
+
+ bool bOk = false;
+ do
+ {
+ if( !( nFound & FoundFlags::EventType ) )
+ break;
+
+ if( aStrEventType == gaStrPresentation )
+ {
+ if( !( nFound & FoundFlags::ClickAction ) )
+ break;
+
+ SdAnimationInfo* pInfo = mpShape->GetAnimationInfo();
+ if( presentation::ClickAction_NONE == eClickAction && nullptr == pInfo )
+ {
+ bOk = true;
+ break;
+ }
+
+ if( nullptr == pInfo )
+ pInfo = mpShape->GetAnimationInfo( true );
+
+ DBG_ASSERT( pInfo, "shape animation info could not be created!" );
+ if( nullptr == pInfo )
+ break;
+
+ clearEventsInAnimationInfo( pInfo );
+ pInfo->meClickAction = eClickAction;
+
+ switch( eClickAction )
+ {
+ case presentation::ClickAction_NONE:
+ case presentation::ClickAction_PREVPAGE:
+ case presentation::ClickAction_NEXTPAGE:
+ case presentation::ClickAction_FIRSTPAGE:
+ case presentation::ClickAction_LASTPAGE:
+ case presentation::ClickAction_INVISIBLE:
+ case presentation::ClickAction_STOPPRESENTATION:
+ {
+ bOk = true;
+ }
+ break;
+
+ case presentation::ClickAction_PROGRAM:
+ case presentation::ClickAction_BOOKMARK:
+ case presentation::ClickAction_DOCUMENT:
+ if( nFound & FoundFlags::Bookmark )
+ {
+ if( eClickAction == presentation::ClickAction_BOOKMARK )
+ {
+ aStrBookmark = getUiNameFromPageApiNameImpl( aStrBookmark );
+ }
+ else if( eClickAction == presentation::ClickAction_DOCUMENT )
+ {
+ sal_Int32 nPos = aStrBookmark.lastIndexOf( '#' );
+ if( nPos >= 0 )
+ {
+ OUString aURL = aStrBookmark.subView( 0, nPos+1 )
+ + getUiNameFromPageApiNameImpl( aStrBookmark.copy( nPos+1 ) );
+ aStrBookmark = aURL;
+ }
+ }
+
+ pInfo->SetBookmark( aStrBookmark );
+ bOk = true;
+ }
+ break;
+
+ case presentation::ClickAction_MACRO:
+ if( nFound & FoundFlags::Macro )
+ {
+ pInfo->SetBookmark( aStrMacro );
+ bOk = true;
+ }
+ break;
+
+ case presentation::ClickAction_VERB:
+ if( nFound & FoundFlags::Verb )
+ {
+ pInfo->mnVerb = static_cast<sal_uInt16>(nVerb);
+ bOk = true;
+ }
+ break;
+
+ case presentation::ClickAction_VANISH:
+ if( !( nFound & FoundFlags::Effect ) )
+ break;
+
+ pInfo->meSecondEffect = eEffect;
+ pInfo->meSecondSpeed = nFound & FoundFlags::Speed ? eSpeed : presentation::AnimationSpeed_MEDIUM;
+
+ bOk = true;
+
+ [[fallthrough]];
+
+ case presentation::ClickAction_SOUND:
+ if( nFound & FoundFlags::SoundUrl )
+ {
+ pInfo->SetBookmark( aStrSoundURL );
+ if( eClickAction != presentation::ClickAction_SOUND )
+ pInfo->mbSecondSoundOn = !aStrSoundURL.isEmpty();
+ pInfo->mbSecondPlayFull = (nFound & FoundFlags::PlayFull) && bPlayFull;
+
+ bOk = true;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ SdAnimationInfo* pInfo = mpShape->GetAnimationInfo( true );
+
+ DBG_ASSERT( pInfo, "shape animation info could not be created!" );
+ if( nullptr == pInfo )
+ break;
+
+ clearEventsInAnimationInfo( pInfo );
+ pInfo->meClickAction = presentation::ClickAction_MACRO;
+
+ if ( SfxApplication::IsXScriptURL( aStrMacro ) )
+ {
+ pInfo->SetBookmark( aStrMacro );
+ }
+ else
+ {
+ sal_Int32 nIdx{ 0 };
+ const std::u16string_view aLibName = o3tl::getToken(aStrMacro, 0, '.', nIdx);
+ const std::u16string_view aModulName = o3tl::getToken(aStrMacro, 0, '.', nIdx);
+ const std::u16string_view aMacroName = o3tl::getToken(aStrMacro, 0, '.', nIdx);
+
+ OUStringBuffer sBuffer(
+ OUString::Concat(aMacroName) + OUStringChar('.') + aModulName + OUStringChar('.') + aLibName + OUStringChar('.') );
+
+ if ( aStrLibrary == "StarOffice" )
+ {
+ sBuffer.append( "BASIC" );
+ }
+ else
+ {
+ sBuffer.append( aStrLibrary );
+ }
+
+ pInfo->SetBookmark( sBuffer.makeStringAndClear() );
+ }
+ bOk = true;
+ }
+ }
+ while(false);
+
+ if( !bOk )
+ throw lang::IllegalArgumentException();
+}
+
+// XNameAccess
+uno::Any SAL_CALL SdUnoEventsAccess::getByName( const OUString& aName )
+{
+ if( mpShape == nullptr || aName != gaStrOnClick )
+ throw container::NoSuchElementException();
+
+ SdAnimationInfo* pInfo = mpShape->GetAnimationInfo();
+
+ presentation::ClickAction eClickAction = presentation::ClickAction_NONE;
+ if( pInfo )
+ eClickAction = pInfo->meClickAction;
+
+ sal_Int32 nPropertyCount = 2;
+ switch( eClickAction )
+ {
+ case presentation::ClickAction_NONE:
+ case presentation::ClickAction_PREVPAGE:
+ case presentation::ClickAction_NEXTPAGE:
+ case presentation::ClickAction_FIRSTPAGE:
+ case presentation::ClickAction_LASTPAGE:
+ case presentation::ClickAction_INVISIBLE:
+ case presentation::ClickAction_STOPPRESENTATION:
+ break;
+ case presentation::ClickAction_PROGRAM:
+ case presentation::ClickAction_VERB:
+ case presentation::ClickAction_BOOKMARK:
+ case presentation::ClickAction_DOCUMENT:
+ case presentation::ClickAction_MACRO:
+ if ( !SfxApplication::IsXScriptURL( pInfo->GetBookmark() ) )
+ nPropertyCount += 1;
+ break;
+
+ case presentation::ClickAction_SOUND:
+ nPropertyCount += 2;
+ break;
+
+ case presentation::ClickAction_VANISH:
+ nPropertyCount += 4;
+ break;
+ default:
+ break;
+ }
+
+ uno::Sequence< beans::PropertyValue > aProperties( nPropertyCount );
+ beans::PropertyValue* pProperties = aProperties.getArray();
+
+ uno::Any aAny;
+
+ if( eClickAction == presentation::ClickAction_MACRO )
+ {
+ if ( SfxApplication::IsXScriptURL( pInfo->GetBookmark() ) )
+ {
+ // Scripting Framework URL
+ aAny <<= OUString(gaStrScript);
+ pProperties->Name = gaStrEventType;
+ pProperties->Handle = -1;
+ pProperties->Value = aAny;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ pProperties++;
+
+ aAny <<= pInfo->GetBookmark();
+ pProperties->Name = gaStrScript;
+ pProperties->Handle = -1;
+ pProperties->Value = aAny;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ pProperties++;
+ }
+ else
+ {
+ // Old Basic macro URL
+ aAny <<= OUString(gaStrStarBasic);
+ pProperties->Name = gaStrEventType;
+ pProperties->Handle = -1;
+ pProperties->Value = aAny;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ pProperties++;
+
+ OUString aMacro = pInfo->GetBookmark();
+
+ // aMacro has got following format:
+ // "Macroname.Modulname.Libname.Documentname" or
+ // "Macroname.Modulname.Libname.Applicationname"
+ sal_Int32 nIdx{ 0 };
+ const std::u16string_view aMacroName = o3tl::getToken(aMacro, 0, '.', nIdx);
+ const std::u16string_view aModulName = o3tl::getToken(aMacro, 0, '.', nIdx);
+ const std::u16string_view aLibName = o3tl::getToken(aMacro, 0, '.', nIdx);
+
+ OUString sBuffer = OUString::Concat(aLibName) +
+ "." +
+ aModulName +
+ "." +
+ aMacroName;
+
+ aAny <<= sBuffer;
+ pProperties->Name = gaStrMacroName;
+ pProperties->Handle = -1;
+ pProperties->Value = aAny;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ pProperties++;
+
+ aAny <<= OUString( "StarOffice" );
+ pProperties->Name = gaStrLibrary;
+ pProperties->Handle = -1;
+ pProperties->Value = aAny;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ }
+ }
+ else
+ {
+ aAny <<= OUString(gaStrPresentation);
+ pProperties->Name = gaStrEventType;
+ pProperties->Handle = -1;
+ pProperties->Value = aAny;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ pProperties++;
+
+ aAny <<= eClickAction;
+ pProperties->Name = gaStrClickAction;
+ pProperties->Handle = -1;
+ pProperties->Value = aAny;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ pProperties++;
+
+ switch( eClickAction )
+ {
+ case presentation::ClickAction_NONE:
+ case presentation::ClickAction_PREVPAGE:
+ case presentation::ClickAction_NEXTPAGE:
+ case presentation::ClickAction_FIRSTPAGE:
+ case presentation::ClickAction_LASTPAGE:
+ case presentation::ClickAction_INVISIBLE:
+ case presentation::ClickAction_STOPPRESENTATION:
+ break;
+ case presentation::ClickAction_BOOKMARK:
+ {
+ const OUString aStrBookmark( getPageApiNameFromUiName( pInfo->GetBookmark()) );
+ pProperties->Name = gaStrBookmark;
+ pProperties->Handle = -1;
+ pProperties->Value <<= aStrBookmark;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ }
+ break;
+
+ case presentation::ClickAction_DOCUMENT:
+ case presentation::ClickAction_PROGRAM:
+ {
+ OUString aString( pInfo->GetBookmark());
+ sal_Int32 nPos = aString.lastIndexOf( '#' );
+ if( nPos >= 0 )
+ {
+ OUString aURL = aString.subView( 0, nPos+1 ) +
+ getPageApiNameFromUiName( aString.copy( nPos+1 ) );
+ aString = aURL;
+ }
+ pProperties->Name = gaStrBookmark;
+ pProperties->Handle = -1;
+ pProperties->Value <<= aString;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ }
+ break;
+
+ case presentation::ClickAction_VANISH:
+ aAny <<= pInfo->meSecondEffect;
+ pProperties->Name = gaStrEffect;
+ pProperties->Handle = -1;
+ pProperties->Value = aAny;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ pProperties++;
+
+ aAny <<= pInfo->meSecondSpeed;
+ pProperties->Name = gaStrSpeed;
+ pProperties->Handle = -1;
+ pProperties->Value = aAny;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ pProperties++;
+
+ [[fallthrough]];
+
+ case presentation::ClickAction_SOUND:
+ if( eClickAction == presentation::ClickAction_SOUND || pInfo->mbSecondSoundOn )
+ {
+ aAny <<= pInfo->GetBookmark();
+ pProperties->Name = gaStrSoundURL;
+ pProperties->Handle = -1;
+ pProperties->Value = aAny;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ pProperties++;
+
+ pProperties->Name = gaStrPlayFull;
+ pProperties->Handle = -1;
+ pProperties->Value <<= pInfo->mbSecondPlayFull;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ }
+ break;
+
+ case presentation::ClickAction_VERB:
+ aAny <<= static_cast<sal_Int32>(pInfo->mnVerb);
+ pProperties->Name = gaStrVerb;
+ pProperties->Handle = -1;
+ pProperties->Value = aAny;
+ pProperties->State = beans::PropertyState_DIRECT_VALUE;
+ break;
+ default:
+ break;
+ }
+ }
+
+ aAny <<= aProperties;
+ return aAny;
+}
+
+uno::Sequence< OUString > SAL_CALL SdUnoEventsAccess::getElementNames( )
+{
+ return { gaStrOnClick };
+}
+
+sal_Bool SAL_CALL SdUnoEventsAccess::hasByName( const OUString& aName )
+{
+ return aName == gaStrOnClick;
+}
+
+// XElementAccess
+uno::Type SAL_CALL SdUnoEventsAccess::getElementType( )
+{
+ return cppu::UnoType<uno::Sequence< beans::PropertyValue >>::get();
+}
+
+sal_Bool SAL_CALL SdUnoEventsAccess::hasElements( )
+{
+ return true;
+}
+
+// XServiceInfo
+OUString SAL_CALL SdUnoEventsAccess::getImplementationName( )
+{
+ return "SdUnoEventsAccess";
+}
+
+sal_Bool SAL_CALL SdUnoEventsAccess::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+uno::Sequence< OUString > SAL_CALL SdUnoEventsAccess::getSupportedServiceNames( )
+{
+ return { gaStrServiceName };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unoobj.hxx b/sd/source/ui/unoidl/unoobj.hxx
new file mode 100644
index 000000000..3f01cbed1
--- /dev/null
+++ b/sd/source/ui/unoidl/unoobj.hxx
@@ -0,0 +1,100 @@
+/* -*- 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 .
+ */
+#pragma once
+
+#include <com/sun/star/beans/PropertyState.hpp>
+#include <com/sun/star/document/XEventsSupplier.hpp>
+#include <svx/unomaster.hxx>
+
+namespace com::sun::star::beans { class XPropertySetInfo; }
+
+class SdXImpressDocument;
+class SdAnimationInfo;
+class SvxItemPropertySet;
+class SvxShape;
+struct SfxItemPropertyMapEntry;
+
+class SdXShape : public SvxShapeMaster,
+ public css::document::XEventsSupplier
+{
+ friend class SdUnoEventsAccess;
+
+private:
+ SvxShape* mpShape;
+ const SvxItemPropertySet* mpPropSet;
+ const SfxItemPropertyMapEntry* mpMap;
+ SdXImpressDocument* mpModel;
+
+ /// @throws css::lang::IllegalArgumentException
+ /// @throws css::beans::UnknownPropertyException
+ /// @throws css::uno::RuntimeException
+ void SetStyleSheet( const css::uno::Any& rAny );
+ /// @throws css::beans::UnknownPropertyException
+ css::uno::Any GetStyleSheet() const;
+
+ // Intern
+ /// @throws std::exception
+ SdAnimationInfo* GetAnimationInfo( bool bCreate = false ) const;
+ /// @throws std::exception
+ bool IsPresObj() const;
+
+ bool IsEmptyPresObj() const;
+ void SetEmptyPresObj(bool bEmpty);
+
+ bool IsMasterDepend() const noexcept;
+ void SetMasterDepend( bool bDepend ) noexcept;
+
+ OUString GetPlaceholderText() const;
+
+public:
+ SdXShape(SvxShape* pShape, SdXImpressDocument* pModel);
+ virtual ~SdXShape() noexcept;
+
+ virtual bool queryAggregation( const css::uno::Type & rType, css::uno::Any& aAny ) override;
+ virtual void dispose() override;
+
+ // XInterface
+ virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override;
+ virtual void SAL_CALL acquire() noexcept override;
+ virtual void SAL_CALL release() noexcept override;
+
+ // XServiceInfo
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
+
+ //XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override;
+ virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override;
+
+ //XPropertyState
+ virtual css::beans::PropertyState SAL_CALL getPropertyState( const OUString& PropertyName ) override;
+ virtual void SAL_CALL setPropertyToDefault( const OUString& PropertyName ) override;
+ virtual css::uno::Any SAL_CALL getPropertyDefault( const OUString& aPropertyName ) override;
+
+ // XTypeProvider
+ virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override;
+
+ // XEventsSupplier
+ virtual css::uno::Reference< css::container::XNameReplace > SAL_CALL getEvents( ) override;
+};
+
+struct SvEventDescription;
+const SvEventDescription* ImplGetSupportedMacroItems();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unopage.cxx b/sd/source/ui/unoidl/unopage.cxx
new file mode 100644
index 000000000..8a9549c51
--- /dev/null
+++ b/sd/source/ui/unoidl/unopage.cxx
@@ -0,0 +1,3056 @@
+/* -*- 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 <initializer_list>
+#include <string_view>
+
+#include <com/sun/star/awt/XBitmap.hpp>
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <com/sun/star/presentation/FadeEffect.hpp>
+#include <com/sun/star/presentation/AnimationSpeed.hpp>
+#include <com/sun/star/view/PaperOrientation.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <cppuhelper/implbase.hxx>
+#include <comphelper/profilezone.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <vcl/bitmapex.hxx>
+#include <vcl/filter/SvmWriter.hxx>
+#include <vcl/metaact.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <tools/diagnose_ex.h>
+#include <vcl/svapp.hxx>
+#include <AnnotationEnumeration.hxx>
+#include <createunopageimpl.hxx>
+#include <unomodel.hxx>
+#include <unopage.hxx>
+#include <svl/itemset.hxx>
+#include <svx/svdmodel.hxx>
+#include <sdresid.hxx>
+#include <strings.hrc>
+#include <sdpage.hxx>
+#include <unoprnms.hxx>
+#include <drawdoc.hxx>
+#include <svx/unoshape.hxx>
+#include <svl/style.hxx>
+#include <comphelper/extract.hxx>
+#include <comphelper/sequence.hxx>
+#include <svx/svditer.hxx>
+#include <vcl/wmf.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdpool.hxx>
+#include <svx/svdview.hxx>
+#include <svx/xfillit0.hxx>
+#include <DrawDocShell.hxx>
+#include <ViewShell.hxx>
+#include <DrawViewShell.hxx>
+#include <editeng/unoprnms.hxx>
+#include "unoobj.hxx"
+
+#include <strings.hxx>
+#include <bitmaps.hlst>
+#include <unokywds.hxx>
+#include "unopback.hxx"
+#include <vcl/dibtools.hxx>
+#include <tools/debug.hxx>
+#include <tools/stream.hxx>
+#include <o3tl/string_view.hxx>
+
+using ::com::sun::star::animations::XAnimationNode;
+using ::com::sun::star::animations::XAnimationNodeSupplier;
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::office;
+
+namespace {
+
+// this are the ids for page properties
+enum WID_PAGE
+{
+ WID_PAGE_LEFT, WID_PAGE_RIGHT, WID_PAGE_TOP, WID_PAGE_BOTTOM, WID_PAGE_WIDTH,
+ WID_PAGE_HEIGHT, WID_PAGE_EFFECT, WID_PAGE_CHANGE, WID_PAGE_SPEED, WID_PAGE_NUMBER,
+ WID_PAGE_ORIENT, WID_PAGE_LAYOUT, WID_PAGE_DURATION, WID_PAGE_HIGHRESDURATION, WID_PAGE_LDNAME, WID_PAGE_LDBITMAP,
+ WID_PAGE_BACK, WID_PAGE_PREVIEW, WID_PAGE_PREVIEWBITMAP, WID_PAGE_VISIBLE, WID_PAGE_SOUNDFILE, WID_PAGE_BACKFULL,
+ WID_PAGE_BACKVIS, WID_PAGE_BACKOBJVIS, WID_PAGE_USERATTRIBS, WID_PAGE_BOOKMARK, WID_PAGE_ISDARK,
+ WID_PAGE_HEADERVISIBLE, WID_PAGE_HEADERTEXT, WID_PAGE_FOOTERVISIBLE, WID_PAGE_FOOTERTEXT,
+ WID_PAGE_PAGENUMBERVISIBLE, WID_PAGE_DATETIMEVISIBLE, WID_PAGE_DATETIMEFIXED,
+ WID_PAGE_DATETIMETEXT, WID_PAGE_DATETIMEFORMAT, WID_TRANSITION_TYPE, WID_TRANSITION_SUBTYPE,
+ WID_TRANSITION_DIRECTION, WID_TRANSITION_FADE_COLOR, WID_TRANSITION_DURATION, WID_LOOP_SOUND,
+ WID_NAVORDER, WID_PAGE_PREVIEWMETAFILE, WID_PAGE_THEME
+};
+
+}
+
+constexpr OUStringLiteral sEmptyPageName = u"page";
+
+// this function stores the property maps for draw pages in impress and draw
+static const SvxItemPropertySet* ImplGetDrawPagePropertySet( bool bImpress, PageKind ePageKind )
+{
+ static const SfxItemPropertyMapEntry aDrawPagePropertyMap_Impl[] =
+ {
+ { u"" UNO_NAME_PAGE_BACKGROUND, WID_PAGE_BACK, cppu::UnoType<beans::XPropertySet>::get(), beans::PropertyAttribute::MAYBEVOID,0},
+ { u"" UNO_NAME_PAGE_BOTTOM, WID_PAGE_BOTTOM, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_LEFT, WID_PAGE_LEFT, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_RIGHT, WID_PAGE_RIGHT, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_TOP, WID_PAGE_TOP, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_CHANGE, WID_PAGE_CHANGE, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_DURATION, WID_PAGE_DURATION, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_EFFECT, WID_PAGE_EFFECT, ::cppu::UnoType<presentation::FadeEffect>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_HEIGHT, WID_PAGE_HEIGHT, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_LAYOUT, WID_PAGE_LAYOUT, ::cppu::UnoType<sal_Int16>::get(), 0, 0},
+ { UNO_NAME_LINKDISPLAYBITMAP, WID_PAGE_LDBITMAP, cppu::UnoType<awt::XBitmap>::get(), beans::PropertyAttribute::READONLY, 0},
+ { UNO_NAME_LINKDISPLAYNAME, WID_PAGE_LDNAME, ::cppu::UnoType<OUString>::get(), beans::PropertyAttribute::READONLY, 0},
+ { u"" UNO_NAME_PAGE_NUMBER, WID_PAGE_NUMBER, ::cppu::UnoType<sal_Int16>::get(), beans::PropertyAttribute::READONLY, 0},
+ { u"" UNO_NAME_PAGE_ORIENTATION, WID_PAGE_ORIENT, ::cppu::UnoType<view::PaperOrientation>::get(),0, 0},
+ { u"" UNO_NAME_PAGE_SPEED, WID_PAGE_SPEED, ::cppu::UnoType<presentation::AnimationSpeed>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_WIDTH, WID_PAGE_WIDTH, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_PREVIEW, WID_PAGE_PREVIEW, cppu::UnoType<css::uno::Sequence<sal_Int8>>::get(), css::beans::PropertyAttribute::READONLY, 0},
+ { u"" UNO_NAME_PAGE_PREVIEWBITMAP, WID_PAGE_PREVIEWBITMAP, cppu::UnoType<css::uno::Sequence<sal_Int8>>::get(), css::beans::PropertyAttribute::READONLY, 0},
+ { u"" UNO_NAME_PAGE_PREVIEWMETAFILE, WID_PAGE_PREVIEWMETAFILE, cppu::UnoType<css::uno::Sequence<sal_Int8>>::get(), css::beans::PropertyAttribute::READONLY, 0},
+ { u"" UNO_NAME_PAGE_VISIBLE, WID_PAGE_VISIBLE, cppu::UnoType<bool>::get(), 0, 0},
+ { u"" UNO_NAME_OBJ_SOUNDFILE, WID_PAGE_SOUNDFILE, cppu::UnoType<Any>::get(), 0, 0},
+ { sUNO_Prop_IsBackgroundVisible, WID_PAGE_BACKVIS, cppu::UnoType<bool>::get(), 0, 0},
+ { sUNO_Prop_IsBackgroundObjectsVisible, WID_PAGE_BACKOBJVIS, cppu::UnoType<bool>::get(), 0, 0},
+ { sUNO_Prop_UserDefinedAttributes,WID_PAGE_USERATTRIBS, cppu::UnoType<css::container::XNameContainer>::get(), 0, 0},
+ { sUNO_Prop_BookmarkURL, WID_PAGE_BOOKMARK, ::cppu::UnoType<OUString>::get(), 0, 0},
+ { u"HighResDuration", WID_PAGE_HIGHRESDURATION, ::cppu::UnoType<double>::get(), 0, 0},
+ { u"IsBackgroundDark" , WID_PAGE_ISDARK, cppu::UnoType<bool>::get(), beans::PropertyAttribute::READONLY, 0},
+ { u"IsFooterVisible", WID_PAGE_FOOTERVISIBLE, cppu::UnoType<bool>::get(), 0, 0},
+ { u"FooterText", WID_PAGE_FOOTERTEXT, ::cppu::UnoType<OUString>::get(), 0, 0},
+ { u"IsPageNumberVisible", WID_PAGE_PAGENUMBERVISIBLE, cppu::UnoType<bool>::get(), 0, 0},
+ { u"IsDateTimeVisible", WID_PAGE_DATETIMEVISIBLE, cppu::UnoType<bool>::get(), 0, 0},
+ { u"IsDateTimeFixed", WID_PAGE_DATETIMEFIXED, cppu::UnoType<bool>::get(), 0, 0},
+ { u"DateTimeText", WID_PAGE_DATETIMETEXT, ::cppu::UnoType<OUString>::get(), 0, 0},
+ { u"DateTimeFormat", WID_PAGE_DATETIMEFORMAT, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"TransitionType", WID_TRANSITION_TYPE, ::cppu::UnoType<sal_Int16>::get(), 0, 0},
+ { u"TransitionSubtype", WID_TRANSITION_SUBTYPE, ::cppu::UnoType<sal_Int16>::get(), 0, 0},
+ { u"TransitionDirection", WID_TRANSITION_DIRECTION, ::cppu::UnoType<sal_Bool>::get(), 0, 0},
+ { u"TransitionFadeColor", WID_TRANSITION_FADE_COLOR, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_TRANSITION_DURATION, WID_TRANSITION_DURATION, ::cppu::UnoType<double>::get(), 0, 0},
+ { u"LoopSound", WID_LOOP_SOUND, cppu::UnoType<bool>::get(), 0, 0},
+ { u"NavigationOrder", WID_NAVORDER, cppu::UnoType<css::container::XIndexAccess>::get(),0, 0},
+ { u"", 0, css::uno::Type(), 0, 0 }
+ };
+
+#define DRAW_PAGE_NOTES_PROPERTIES \
+ { u"" UNO_NAME_PAGE_BOTTOM, WID_PAGE_BOTTOM, ::cppu::UnoType<sal_Int32>::get(), 0, 0}, \
+ { u"" UNO_NAME_PAGE_LEFT, WID_PAGE_LEFT, ::cppu::UnoType<sal_Int32>::get(), 0, 0}, \
+ { u"" UNO_NAME_PAGE_RIGHT, WID_PAGE_RIGHT, ::cppu::UnoType<sal_Int32>::get(), 0, 0}, \
+ { u"" UNO_NAME_PAGE_TOP, WID_PAGE_TOP, ::cppu::UnoType<sal_Int32>::get(), 0, 0}, \
+ { u"" UNO_NAME_PAGE_HEIGHT, WID_PAGE_HEIGHT, ::cppu::UnoType<sal_Int32>::get(), 0, 0}, \
+ { u"" UNO_NAME_PAGE_LAYOUT, WID_PAGE_LAYOUT, ::cppu::UnoType<sal_Int16>::get(), 0, 0}, \
+ { UNO_NAME_LINKDISPLAYBITMAP, WID_PAGE_LDBITMAP, cppu::UnoType<awt::XBitmap>::get(), beans::PropertyAttribute::READONLY, 0}, \
+ { UNO_NAME_LINKDISPLAYNAME, WID_PAGE_LDNAME, ::cppu::UnoType<OUString>::get(), beans::PropertyAttribute::READONLY, 0}, \
+ { u"" UNO_NAME_PAGE_NUMBER, WID_PAGE_NUMBER, ::cppu::UnoType<sal_Int16>::get(), beans::PropertyAttribute::READONLY, 0}, \
+ { u"" UNO_NAME_PAGE_ORIENTATION, WID_PAGE_ORIENT, ::cppu::UnoType<view::PaperOrientation>::get(),0, 0}, \
+ { u"" UNO_NAME_PAGE_WIDTH, WID_PAGE_WIDTH, ::cppu::UnoType<sal_Int32>::get(), 0, 0}, \
+ { sUNO_Prop_UserDefinedAttributes,WID_PAGE_USERATTRIBS, cppu::UnoType<css::container::XNameContainer>::get(), 0, 0},\
+ { u"IsHeaderVisible", WID_PAGE_HEADERVISIBLE, cppu::UnoType<bool>::get(), 0, 0}, \
+ { u"HeaderText", WID_PAGE_HEADERTEXT, ::cppu::UnoType<OUString>::get(), 0, 0}, \
+ { u"IsBackgroundDark", WID_PAGE_ISDARK, cppu::UnoType<bool>::get(), beans::PropertyAttribute::READONLY, 0}, \
+ { u"IsFooterVisible", WID_PAGE_FOOTERVISIBLE, cppu::UnoType<bool>::get(), 0, 0}, \
+ { u"FooterText", WID_PAGE_FOOTERTEXT, ::cppu::UnoType<OUString>::get(), 0, 0}, \
+ { u"IsPageNumberVisible", WID_PAGE_PAGENUMBERVISIBLE, cppu::UnoType<bool>::get(), 0, 0}, \
+ { u"IsDateTimeVisible", WID_PAGE_DATETIMEVISIBLE, cppu::UnoType<bool>::get(), 0, 0}, \
+ { u"IsDateTimeFixed", WID_PAGE_DATETIMEFIXED, cppu::UnoType<bool>::get(), 0, 0}, \
+ { u"DateTimeText", WID_PAGE_DATETIMETEXT, ::cppu::UnoType<OUString>::get(), 0, 0}, \
+ { u"DateTimeFormat", WID_PAGE_DATETIMEFORMAT, ::cppu::UnoType<sal_Int32>::get(), 0, 0}, \
+ { u"NavigationOrder", WID_NAVORDER, cppu::UnoType<css::container::XIndexAccess>::get(),0, 0}, \
+ { u"", 0, css::uno::Type(), 0, 0 }
+
+ static const SfxItemPropertyMapEntry aDrawPageNotesHandoutPropertyMap_Impl[] =
+ {
+ // this must be the first two entries so they can be excluded for PageKind::Standard
+ { u"" UNO_NAME_PAGE_BACKGROUND, WID_PAGE_BACK, cppu::UnoType<beans::XPropertySet>::get(), beans::PropertyAttribute::MAYBEVOID,0},
+ DRAW_PAGE_NOTES_PROPERTIES
+ };
+ static const SfxItemPropertyMapEntry aDrawPageNotesHandoutPropertyNoBackMap_Impl[] =
+ {
+ DRAW_PAGE_NOTES_PROPERTIES
+ };
+
+#define GRAPHIC_PAGE_PROPERTIES \
+ { u"" UNO_NAME_PAGE_BOTTOM, WID_PAGE_BOTTOM, ::cppu::UnoType<sal_Int32>::get(), 0, 0}, \
+ { u"" UNO_NAME_PAGE_LEFT, WID_PAGE_LEFT, ::cppu::UnoType<sal_Int32>::get(), 0, 0}, \
+ { u"" UNO_NAME_PAGE_RIGHT, WID_PAGE_RIGHT, ::cppu::UnoType<sal_Int32>::get(), 0, 0}, \
+ { u"" UNO_NAME_PAGE_TOP, WID_PAGE_TOP, ::cppu::UnoType<sal_Int32>::get(), 0, 0}, \
+ { u"" UNO_NAME_PAGE_HEIGHT, WID_PAGE_HEIGHT, ::cppu::UnoType<sal_Int32>::get(), 0, 0}, \
+ { UNO_NAME_LINKDISPLAYBITMAP, WID_PAGE_LDBITMAP, cppu::UnoType<awt::XBitmap>::get(), beans::PropertyAttribute::READONLY, 0}, \
+ { UNO_NAME_LINKDISPLAYNAME, WID_PAGE_LDNAME, ::cppu::UnoType<OUString>::get(), beans::PropertyAttribute::READONLY, 0}, \
+ { u"" UNO_NAME_PAGE_NUMBER, WID_PAGE_NUMBER, ::cppu::UnoType<sal_Int16>::get(), beans::PropertyAttribute::READONLY, 0}, \
+ { u"" UNO_NAME_PAGE_ORIENTATION, WID_PAGE_ORIENT, ::cppu::UnoType<view::PaperOrientation>::get(),0, 0}, \
+ { u"" UNO_NAME_PAGE_WIDTH, WID_PAGE_WIDTH, ::cppu::UnoType<sal_Int32>::get(), 0, 0}, \
+ { u"" UNO_NAME_PAGE_PREVIEW, WID_PAGE_PREVIEW, cppu::UnoType<css::uno::Sequence<sal_Int8>>::get(), css::beans::PropertyAttribute::READONLY, 0}, \
+ { u"" UNO_NAME_PAGE_PREVIEWBITMAP, WID_PAGE_PREVIEWBITMAP, cppu::UnoType<css::uno::Sequence<sal_Int8>>::get(), css::beans::PropertyAttribute::READONLY, 0},\
+ { u"" UNO_NAME_PAGE_PREVIEWMETAFILE, WID_PAGE_PREVIEWMETAFILE, cppu::UnoType<css::uno::Sequence<sal_Int8>>::get(), css::beans::PropertyAttribute::READONLY, 0},\
+ { sUNO_Prop_UserDefinedAttributes,WID_PAGE_USERATTRIBS, cppu::UnoType<css::container::XNameContainer>::get(), 0, 0}, \
+ { sUNO_Prop_BookmarkURL, WID_PAGE_BOOKMARK, ::cppu::UnoType<OUString>::get(), 0, 0}, \
+ { u"IsBackgroundDark", WID_PAGE_ISDARK, cppu::UnoType<bool>::get(), beans::PropertyAttribute::READONLY, 0}, \
+ { u"NavigationOrder", WID_NAVORDER, cppu::UnoType<css::container::XIndexAccess>::get(),0, 0}, \
+ { u"", 0, css::uno::Type(), 0, 0 }
+
+ static const SfxItemPropertyMapEntry aGraphicPagePropertyMap_Impl[] =
+ {
+ { u"" UNO_NAME_PAGE_BACKGROUND, WID_PAGE_BACK, cppu::UnoType<beans::XPropertySet>::get(), beans::PropertyAttribute::MAYBEVOID,0},
+ GRAPHIC_PAGE_PROPERTIES
+ };
+ static const SfxItemPropertyMapEntry aGraphicPagePropertyNoBackMap_Impl[] =
+ {
+ GRAPHIC_PAGE_PROPERTIES
+ };
+
+ bool bWithoutBackground = ePageKind != PageKind::Standard && ePageKind != PageKind::Handout;
+ const SvxItemPropertySet* pRet = nullptr;
+ if( bImpress )
+ {
+ if( ePageKind == PageKind::Standard )
+ {
+ //PageKind::Standard always has a background property
+ static SvxItemPropertySet aDrawPagePropertySet_Impl( aDrawPagePropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
+ pRet = &aDrawPagePropertySet_Impl;
+ }
+ else
+ {
+ if(bWithoutBackground)
+ {
+ static SvxItemPropertySet aDrawPageNotesHandoutPropertyNoBackSet_Impl( aDrawPageNotesHandoutPropertyNoBackMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
+ pRet = &aDrawPageNotesHandoutPropertyNoBackSet_Impl;
+ }
+ else
+ {
+ static SvxItemPropertySet aDrawPageNotesHandoutPropertySet_Impl( aDrawPageNotesHandoutPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
+ pRet = &aDrawPageNotesHandoutPropertySet_Impl;
+ }
+ }
+ }
+ else
+ {
+ if(bWithoutBackground)
+ {
+ static SvxItemPropertySet aGraphicPagePropertyNoBackSet_Impl( aGraphicPagePropertyNoBackMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
+ pRet = &aGraphicPagePropertyNoBackSet_Impl;
+ }
+ else
+ {
+ static SvxItemPropertySet aGraphicPagePropertySet_Impl( aGraphicPagePropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
+ pRet = &aGraphicPagePropertySet_Impl;
+ }
+ }
+ return pRet;
+}
+
+/** this function stores the property map for master pages in impress and draw */
+static const SvxItemPropertySet* ImplGetMasterPagePropertySet( PageKind ePageKind )
+{
+ static const SfxItemPropertyMapEntry aMasterPagePropertyMap_Impl[] =
+ {
+ { u"" UNO_NAME_PAGE_BACKGROUND, WID_PAGE_BACK, cppu::UnoType<beans::XPropertySet>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_BOTTOM, WID_PAGE_BOTTOM, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_LEFT, WID_PAGE_LEFT, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_RIGHT, WID_PAGE_RIGHT, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_TOP, WID_PAGE_TOP, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_HEIGHT, WID_PAGE_HEIGHT, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { UNO_NAME_LINKDISPLAYBITMAP, WID_PAGE_LDBITMAP, cppu::UnoType<awt::XBitmap>::get(), beans::PropertyAttribute::READONLY, 0},
+ { UNO_NAME_LINKDISPLAYNAME, WID_PAGE_LDNAME, ::cppu::UnoType<OUString>::get(), beans::PropertyAttribute::READONLY, 0},
+ { u"" UNO_NAME_PAGE_NUMBER, WID_PAGE_NUMBER, ::cppu::UnoType<sal_Int16>::get(), beans::PropertyAttribute::READONLY, 0},
+ { u"" UNO_NAME_PAGE_ORIENTATION, WID_PAGE_ORIENT, ::cppu::UnoType<view::PaperOrientation>::get(),0, 0},
+ { u"" UNO_NAME_PAGE_WIDTH, WID_PAGE_WIDTH, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"BackgroundFullSize", WID_PAGE_BACKFULL, cppu::UnoType<bool>::get(), 0, 0},
+ { sUNO_Prop_UserDefinedAttributes,WID_PAGE_USERATTRIBS, cppu::UnoType<css::container::XNameContainer>::get(), 0, 0},
+ { u"IsBackgroundDark", WID_PAGE_ISDARK, cppu::UnoType<bool>::get(), beans::PropertyAttribute::READONLY, 0},
+ { u"Theme", WID_PAGE_THEME, cppu::UnoType<uno::Sequence< beans::PropertyValue >>::get(), 0, 0},
+ { u"", 0, css::uno::Type(), 0, 0 }
+ };
+
+ static const SfxItemPropertyMapEntry aHandoutMasterPagePropertyMap_Impl[] =
+ {
+ { u"" UNO_NAME_PAGE_BOTTOM, WID_PAGE_BOTTOM, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_LEFT, WID_PAGE_LEFT, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_RIGHT, WID_PAGE_RIGHT, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_TOP, WID_PAGE_TOP, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_HEIGHT, WID_PAGE_HEIGHT, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_ORIENTATION, WID_PAGE_ORIENT, ::cppu::UnoType<view::PaperOrientation>::get(),0, 0},
+ { u"" UNO_NAME_PAGE_NUMBER, WID_PAGE_NUMBER, ::cppu::UnoType<sal_Int16>::get(), beans::PropertyAttribute::READONLY, 0},
+ { u"" UNO_NAME_PAGE_WIDTH, WID_PAGE_WIDTH, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"" UNO_NAME_PAGE_LAYOUT, WID_PAGE_LAYOUT, ::cppu::UnoType<sal_Int16>::get(), 0, 0},
+ { sUNO_Prop_UserDefinedAttributes,WID_PAGE_USERATTRIBS, cppu::UnoType<css::container::XNameContainer>::get(), 0, 0},
+ { u"IsBackgroundDark", WID_PAGE_ISDARK, cppu::UnoType<bool>::get(), beans::PropertyAttribute::READONLY, 0},
+ { u"IsHeaderVisible", WID_PAGE_HEADERVISIBLE, cppu::UnoType<bool>::get(), 0, 0},
+ { u"HeaderText", WID_PAGE_HEADERTEXT, ::cppu::UnoType<OUString>::get(), 0, 0},
+ { u"IsFooterVisible", WID_PAGE_FOOTERVISIBLE, cppu::UnoType<bool>::get(), 0, 0},
+ { u"FooterText", WID_PAGE_FOOTERTEXT, ::cppu::UnoType<OUString>::get(), 0, 0},
+ { u"IsPageNumberVisible", WID_PAGE_PAGENUMBERVISIBLE, cppu::UnoType<bool>::get(), 0, 0},
+ { u"IsDateTimeVisible", WID_PAGE_DATETIMEVISIBLE, cppu::UnoType<bool>::get(), 0, 0},
+ { u"IsDateTimeFixed", WID_PAGE_DATETIMEFIXED, cppu::UnoType<bool>::get(), 0, 0},
+ { u"DateTimeText", WID_PAGE_DATETIMETEXT, ::cppu::UnoType<OUString>::get(), 0, 0},
+ { u"DateTimeFormat", WID_PAGE_DATETIMEFORMAT, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
+ { u"", 0, css::uno::Type(), 0, 0 }
+ };
+
+ const SvxItemPropertySet* pRet = nullptr;
+ if( ePageKind == PageKind::Handout )
+ {
+ static SvxItemPropertySet aHandoutMasterPagePropertySet_Impl( aHandoutMasterPagePropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
+ pRet = &aHandoutMasterPagePropertySet_Impl;
+ }
+ else
+ {
+ static SvxItemPropertySet aMasterPagePropertySet_Impl( aMasterPagePropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
+ pRet = &aMasterPagePropertySet_Impl;
+ }
+ return pRet;
+}
+
+const css::uno::Sequence< sal_Int8 > & SdGenericDrawPage::getUnoTunnelId() noexcept
+{
+ static const comphelper::UnoIdInit theSdGenericDrawPageUnoTunnelId;
+ return theSdGenericDrawPageUnoTunnelId.getSeq();
+}
+
+sal_Int64 SAL_CALL SdGenericDrawPage::getSomething( const css::uno::Sequence< sal_Int8 >& rId )
+{
+ return comphelper::getSomethingImpl(rId, this,
+ comphelper::FallbackToGetSomethingOf<SvxFmDrawPage>{});
+}
+
+SdGenericDrawPage::SdGenericDrawPage(SdXImpressDocument* _pModel, SdPage* pInPage, const SvxItemPropertySet* _pSet)
+: SvxFmDrawPage( static_cast<SdrPage*>(pInPage) ),
+ SdUnoSearchReplaceShape(this),
+ mpDocModel( _pModel ),
+ mpSdrModel(nullptr),
+ mbIsImpressDocument(false),
+ mnTempPageNumber(0),
+ mpPropSet ( _pSet )
+{
+ mpSdrModel = SvxFmDrawPage::mpModel;
+ if( mpDocModel )
+ mbIsImpressDocument = mpDocModel->IsImpressDocument();
+
+}
+
+SdGenericDrawPage::~SdGenericDrawPage() noexcept
+{
+}
+
+void SdGenericDrawPage::throwIfDisposed() const
+{
+ if( (SvxFmDrawPage::mpModel == nullptr) || (mpDocModel == nullptr) || (SvxFmDrawPage::mpPage == nullptr) )
+ throw lang::DisposedException();
+}
+
+SdXImpressDocument* SdGenericDrawPage::GetModel() const
+{
+ if( mpSdrModel != SvxFmDrawPage::mpModel )
+ const_cast<SdGenericDrawPage*>(this)->UpdateModel();
+ return mpDocModel;
+}
+
+bool SdGenericDrawPage::IsImpressDocument() const
+{
+ if( mpSdrModel != SvxFmDrawPage::mpModel )
+ const_cast<SdGenericDrawPage*>(this)->UpdateModel();
+ return mbIsImpressDocument;
+}
+
+
+void SdGenericDrawPage::UpdateModel()
+{
+ mpSdrModel = SvxFmDrawPage::mpModel;
+ if( mpSdrModel )
+ {
+ uno::Reference< uno::XInterface > xModel( SvxFmDrawPage::mpModel->getUnoModel() );
+ mpDocModel = comphelper::getFromUnoTunnel<SdXImpressDocument>( xModel );
+ }
+ else
+ {
+ mpDocModel = nullptr;
+ }
+ mbIsImpressDocument = mpDocModel && mpDocModel->IsImpressDocument();
+}
+
+// this is called whenever a SdrObject must be created for an empty api shape wrapper
+SdrObject * SdGenericDrawPage::CreateSdrObject_( const Reference< drawing::XShape >& xShape )
+{
+ if( nullptr == SvxFmDrawPage::mpPage || !xShape.is() )
+ return nullptr;
+
+ OUString aType( xShape->getShapeType() );
+ static const OUStringLiteral aPrefix( u"com.sun.star.presentation." );
+ if( !aType.startsWith( aPrefix ) )
+ {
+ SdrObject* pObj = SvxFmDrawPage::CreateSdrObject_( xShape );
+ return pObj;
+ }
+
+ aType = aType.copy( aPrefix.getLength() );
+
+ PresObjKind eObjKind = PresObjKind::NONE;
+
+ if( aType == "TitleTextShape" )
+ {
+ eObjKind = PresObjKind::Title;
+ }
+ else if( aType == "OutlinerShape" )
+ {
+ eObjKind = PresObjKind::Outline;
+ }
+ else if( aType == "SubtitleShape" )
+ {
+ eObjKind = PresObjKind::Text;
+ }
+ else if( aType == "OLE2Shape" )
+ {
+ eObjKind = PresObjKind::Object;
+ }
+ else if( aType == "ChartShape" )
+ {
+ eObjKind = PresObjKind::Chart;
+ }
+ else if( aType == "CalcShape" )
+ {
+ eObjKind = PresObjKind::Calc;
+ }
+ else if( aType == "TableShape" )
+ {
+ eObjKind = PresObjKind::Table;
+ }
+ else if( aType == "GraphicObjectShape" )
+ {
+ eObjKind = PresObjKind::Graphic;
+ }
+ else if( aType == "OrgChartShape" )
+ {
+ eObjKind = PresObjKind::OrgChart;
+ }
+ else if( aType == "PageShape" )
+ {
+ if( GetPage()->GetPageKind() == PageKind::Notes && GetPage()->IsMasterPage() )
+ eObjKind = PresObjKind::Title;
+ else
+ eObjKind = PresObjKind::Page;
+ }
+ else if( aType == "NotesShape" )
+ {
+ eObjKind = PresObjKind::Notes;
+ }
+ else if( aType == "HandoutShape" )
+ {
+ eObjKind = PresObjKind::Handout;
+ }
+ else if( aType == "FooterShape" )
+ {
+ eObjKind = PresObjKind::Footer;
+ }
+ else if( aType == "HeaderShape" )
+ {
+ eObjKind = PresObjKind::Header;
+ }
+ else if( aType == "SlideNumberShape" )
+ {
+ eObjKind = PresObjKind::SlideNumber;
+ }
+ else if( aType == "DateTimeShape" )
+ {
+ eObjKind = PresObjKind::DateTime;
+ }
+ else if( aType == "MediaShape" )
+ {
+ eObjKind = PresObjKind::Media;
+ }
+
+ ::tools::Rectangle aRect( eObjKind == PresObjKind::Title ? GetPage()->GetTitleRect() : GetPage()->GetLayoutRect() );
+
+ const awt::Point aPos( aRect.Left(), aRect.Top() );
+ xShape->setPosition( aPos );
+
+ const awt::Size aSize( aRect.GetWidth(), aRect.GetHeight() );
+ xShape->setSize( aSize );
+
+ SdrObject *pPresObj = nullptr;
+ if( (eObjKind == PresObjKind::Table) || (eObjKind == PresObjKind::Media) )
+ {
+ pPresObj = SvxFmDrawPage::CreateSdrObject_( xShape );
+ if( pPresObj )
+ {
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage()));
+ pPresObj->NbcSetStyleSheet(rDoc.GetDefaultStyleSheet(), true);
+ GetPage()->InsertPresObj( pPresObj, eObjKind );
+ }
+ }
+ else
+ {
+ pPresObj = GetPage()->CreatePresObj( eObjKind, false, aRect );
+ }
+
+ if( pPresObj )
+ pPresObj->SetUserCall( GetPage() );
+
+ return pPresObj;
+}
+
+// XInterface
+Any SAL_CALL SdGenericDrawPage::queryInterface( const uno::Type & rType )
+{
+ Any aAny;
+
+ if (rType == cppu::UnoType<beans::XPropertySet>::get())
+ {
+ aAny <<= Reference<beans::XPropertySet>(this);
+ }
+ else if (rType == cppu::UnoType<container::XNamed>::get())
+ {
+ aAny <<= Reference<container::XNamed>(this);
+ }
+ else if (rType == cppu::UnoType<util::XReplaceable>::get())
+ {
+ aAny <<= Reference<util::XReplaceable>(this);
+ }
+ else if (rType == cppu::UnoType<util::XSearchable>::get())
+ {
+ aAny <<= Reference<util::XSearchable>(this);
+ }
+ else if (rType == cppu::UnoType<document::XLinkTargetSupplier>::get())
+ {
+ aAny <<= Reference<document::XLinkTargetSupplier>(this);
+ }
+ else if (rType == cppu::UnoType<drawing::XShapeCombiner>::get())
+ {
+ aAny <<= Reference<drawing::XShapeCombiner>(this);
+ }
+ else if (rType == cppu::UnoType<drawing::XShapeBinder>::get())
+ {
+ aAny <<= Reference<drawing::XShapeBinder>(this);
+ }
+ else if (rType == cppu::UnoType<beans::XMultiPropertySet>::get())
+ {
+ aAny <<= Reference<beans::XMultiPropertySet>(this);
+ }
+ else if (rType == cppu::UnoType<office::XAnnotationAccess>::get())
+ {
+ aAny <<= Reference<office::XAnnotationAccess>(this);
+ }
+ else if (IsImpressDocument() && rType == cppu::UnoType<XAnimationNodeSupplier>::get())
+ {
+ const PageKind ePageKind = GetPage() ? GetPage()->GetPageKind() : PageKind::Standard;
+
+ if( ePageKind == PageKind::Standard )
+ return Any( Reference< XAnimationNodeSupplier >( this ) );
+ }
+ else
+ return SvxDrawPage::queryInterface( rType );
+
+ return aAny;
+}
+
+// XPropertySet
+Reference< beans::XPropertySetInfo > SAL_CALL SdGenericDrawPage::getPropertySetInfo()
+{
+ ::SolarMutexGuard aGuard;
+ throwIfDisposed();
+ return mpPropSet->getPropertySetInfo();
+}
+
+void SAL_CALL SdGenericDrawPage::setPropertyValue( const OUString& aPropertyName, const Any& aValue )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(aPropertyName);
+
+ switch( pEntry ? pEntry->nWID : -1 )
+ {
+ case WID_NAVORDER:
+ setNavigationOrder( aValue );
+ break;
+ case WID_PAGE_LEFT:
+ case WID_PAGE_RIGHT:
+ case WID_PAGE_TOP:
+ case WID_PAGE_BOTTOM:
+ case WID_PAGE_LAYOUT:
+ case WID_PAGE_DURATION:
+ case WID_PAGE_CHANGE:
+ {
+ sal_Int32 nValue = 0;
+ if(!(aValue >>= nValue))
+ throw lang::IllegalArgumentException();
+
+ switch( pEntry->nWID )
+ {
+ case WID_PAGE_LEFT:
+ SetLeftBorder(nValue);
+ break;
+ case WID_PAGE_RIGHT:
+ SetRightBorder( nValue );
+ break;
+ case WID_PAGE_TOP:
+ SetUpperBorder( nValue );
+ break;
+ case WID_PAGE_BOTTOM:
+ SetLowerBorder( nValue );
+ break;
+ case WID_PAGE_CHANGE:
+ GetPage()->SetPresChange( static_cast<PresChange>(nValue) );
+ break;
+ case WID_PAGE_LAYOUT:
+ GetPage()->SetAutoLayout( static_cast<AutoLayout>(nValue), true );
+ break;
+ case WID_PAGE_DURATION:
+ GetPage()->SetTime(nValue);
+ break;
+ }
+ break;
+ }
+ case WID_PAGE_HIGHRESDURATION:
+ {
+ double fValue = 0;
+ if(!(aValue >>= fValue))
+ throw lang::IllegalArgumentException();
+
+ GetPage()->SetTime(fValue);
+ break;
+ }
+ case WID_PAGE_WIDTH:
+ {
+ sal_Int32 nWidth = 0;
+ if(!(aValue >>= nWidth))
+ throw lang::IllegalArgumentException();
+
+ SetWidth( nWidth );
+ break;
+ }
+ case WID_PAGE_HEIGHT:
+ {
+ sal_Int32 nHeight = 0;
+ if(!(aValue >>= nHeight))
+ throw lang::IllegalArgumentException();
+
+ SetHeight( nHeight );
+ break;
+ }
+ case WID_PAGE_ORIENT:
+ {
+ sal_Int32 nEnum = 0;
+ if(!::cppu::enum2int( nEnum, aValue ))
+ throw lang::IllegalArgumentException();
+
+ Orientation eOri = (static_cast<view::PaperOrientation>(nEnum) == view::PaperOrientation_PORTRAIT)?Orientation::Portrait:Orientation::Landscape;
+
+ if( eOri != GetPage()->GetOrientation() )
+ {
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage()));
+ const PageKind ePageKind = GetPage()->GetPageKind();
+
+ sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind);
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind);
+ pPage->SetOrientation( eOri );
+ }
+
+ nPageCnt = rDoc.GetSdPageCount(ePageKind);
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetSdPage(i, ePageKind);
+ pPage->SetOrientation( eOri );
+ }
+ }
+ break;
+ }
+ case WID_PAGE_EFFECT:
+ {
+ sal_Int32 nEnum = 0;
+ if(!::cppu::enum2int( nEnum, aValue ))
+ throw lang::IllegalArgumentException();
+
+ GetPage()->SetFadeEffect( static_cast<presentation::FadeEffect>(nEnum) );
+ break;
+ }
+ case WID_PAGE_BACK:
+ setBackground( aValue );
+ break;
+ case WID_PAGE_SPEED:
+ {
+ sal_Int32 nEnum = 0;
+ if(!::cppu::enum2int( nEnum, aValue ))
+ throw lang::IllegalArgumentException();
+
+ GetPage()->setTransitionDuration( nEnum == 0 ? 3.0 : (nEnum == 1 ? 2.0 : 1.0 ) );
+ break;
+ }
+ case WID_PAGE_VISIBLE :
+ {
+ bool bVisible = false;
+ if( ! ( aValue >>= bVisible ) )
+ throw lang::IllegalArgumentException();
+ GetPage()->SetExcluded( !bVisible );
+ break;
+ }
+ case WID_PAGE_SOUNDFILE :
+ {
+ OUString aURL;
+ if( aValue >>= aURL )
+ {
+ GetPage()->SetSoundFile( aURL );
+ GetPage()->SetSound( !aURL.isEmpty() );
+ break;
+ }
+ else
+ {
+ bool bStopSound = false;
+ if( aValue >>= bStopSound )
+ {
+ GetPage()->SetStopSound( bStopSound );
+ break;
+ }
+ }
+
+ throw lang::IllegalArgumentException();
+ }
+ case WID_LOOP_SOUND:
+ {
+ bool bLoop = false;
+ if( ! (aValue >>= bLoop) )
+ throw lang::IllegalArgumentException();
+
+ GetPage()->SetLoopSound( bLoop );
+ break;
+ }
+ case WID_PAGE_BACKFULL:
+ {
+ bool bFullSize = false;
+ if( ! ( aValue >>= bFullSize ) )
+ throw lang::IllegalArgumentException();
+ GetPage()->SetBackgroundFullSize( bFullSize );
+ break;
+ }
+ case WID_PAGE_BACKVIS:
+ {
+ bool bVisible = false;
+ if( ! ( aValue >>= bVisible ) )
+ throw lang::IllegalArgumentException();
+
+ SdrPage* pPage = GetPage();
+ if( pPage )
+ {
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(pPage->getSdrModelFromSdrPage()));
+ if( rDoc.GetMasterPageCount() )
+ {
+ SdrLayerAdmin& rLayerAdmin = rDoc.GetLayerAdmin();
+ SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
+ aVisibleLayers.Set(rLayerAdmin.GetLayerID(sUNO_LayerName_background), bVisible);
+ pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+ }
+ }
+ break;
+ }
+ case WID_PAGE_BACKOBJVIS:
+ {
+ bool bVisible = false;
+ if( ! ( aValue >>= bVisible ) )
+ throw lang::IllegalArgumentException();
+
+ SdrPage* pPage = GetPage();
+ if( pPage )
+ {
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(pPage->getSdrModelFromSdrPage()));
+ if( rDoc.GetMasterPageCount() )
+ {
+ SdrLayerAdmin& rLayerAdmin = rDoc.GetLayerAdmin();
+ SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
+ aVisibleLayers.Set(rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects), bVisible);
+ pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+ }
+ }
+
+ break;
+ }
+ case WID_PAGE_USERATTRIBS:
+ {
+ if( !GetPage()->setAlienAttributes( aValue ) )
+ throw lang::IllegalArgumentException();
+ break;
+ }
+ case WID_PAGE_BOOKMARK:
+ {
+ OUString aBookmarkURL;
+ if( ! ( aValue >>= aBookmarkURL ) )
+ throw lang::IllegalArgumentException();
+
+ setBookmarkURL( aBookmarkURL );
+ break;
+ }
+
+ case WID_PAGE_HEADERVISIBLE:
+ case WID_PAGE_HEADERTEXT:
+ case WID_PAGE_FOOTERVISIBLE:
+ case WID_PAGE_FOOTERTEXT:
+ case WID_PAGE_PAGENUMBERVISIBLE:
+ case WID_PAGE_DATETIMEVISIBLE:
+ case WID_PAGE_DATETIMEFIXED:
+ case WID_PAGE_DATETIMETEXT:
+ case WID_PAGE_DATETIMEFORMAT:
+ {
+ sd::HeaderFooterSettings aHeaderFooterSettings( GetPage()->getHeaderFooterSettings() );
+
+ switch( pEntry->nWID )
+ {
+ case WID_PAGE_HEADERVISIBLE:
+ {
+ bool bVisible = false;
+ if( ! ( aValue >>= bVisible ) )
+ throw lang::IllegalArgumentException();
+
+ aHeaderFooterSettings.mbHeaderVisible = bVisible;
+ break;
+ }
+ case WID_PAGE_HEADERTEXT:
+ {
+ OUString aText;
+ if( ! ( aValue >>= aText ) )
+ throw lang::IllegalArgumentException();
+
+ aHeaderFooterSettings.maHeaderText = aText;
+ break;
+ }
+ case WID_PAGE_FOOTERVISIBLE:
+ {
+ bool bVisible = false;
+ if( ! ( aValue >>= bVisible ) )
+ throw lang::IllegalArgumentException();
+
+ aHeaderFooterSettings.mbFooterVisible = bVisible;
+ break;
+ }
+ case WID_PAGE_FOOTERTEXT:
+ {
+ OUString aText;
+ if( ! ( aValue >>= aText ) )
+ throw lang::IllegalArgumentException();
+
+ aHeaderFooterSettings.maFooterText = aText;
+ break;
+ }
+ case WID_PAGE_PAGENUMBERVISIBLE:
+ {
+ bool bVisible = false;
+ if( ! ( aValue >>= bVisible ) )
+ throw lang::IllegalArgumentException();
+
+ aHeaderFooterSettings.mbSlideNumberVisible = bVisible;
+ break;
+ }
+ case WID_PAGE_DATETIMEVISIBLE:
+ {
+ bool bVisible = false;
+ if( ! ( aValue >>= bVisible ) )
+ throw lang::IllegalArgumentException();
+
+ aHeaderFooterSettings.mbDateTimeVisible = bVisible;
+ break;
+ }
+ case WID_PAGE_DATETIMEFIXED:
+ {
+ bool bVisible = false;
+ if( ! ( aValue >>= bVisible ) )
+ throw lang::IllegalArgumentException();
+
+ aHeaderFooterSettings.mbDateTimeIsFixed = bVisible;
+ break;
+ }
+ case WID_PAGE_DATETIMETEXT:
+ {
+ OUString aText;
+ if( ! ( aValue >>= aText ) )
+ throw lang::IllegalArgumentException();
+
+ aHeaderFooterSettings.maDateTimeText = aText;
+ break;
+ }
+ case WID_PAGE_DATETIMEFORMAT:
+ {
+ sal_Int32 nValue = 0;
+ if( ! ( aValue >>= nValue ) )
+ throw lang::IllegalArgumentException();
+
+ aHeaderFooterSettings.meDateFormat = static_cast<SvxDateFormat>(nValue & 0x0f);
+ aHeaderFooterSettings.meTimeFormat = static_cast<SvxTimeFormat>((nValue >> 4) & 0x0f);
+ break;
+ }
+ }
+
+ if( !(aHeaderFooterSettings == GetPage()->getHeaderFooterSettings()) )
+ GetPage()->setHeaderFooterSettings( aHeaderFooterSettings );
+
+ break;
+ }
+
+ case WID_PAGE_NUMBER:
+ if( (GetPage()->GetPageKind() == PageKind::Handout) && !GetPage()->IsMasterPage() )
+ {
+ if( !(aValue >>= mnTempPageNumber) )
+ throw lang::IllegalArgumentException();
+
+ break;
+ }
+ throw beans::PropertyVetoException();
+
+ case WID_PAGE_LDBITMAP:
+ case WID_PAGE_LDNAME:
+ case WID_PAGE_ISDARK:
+ throw beans::PropertyVetoException();
+
+ case WID_TRANSITION_TYPE:
+ {
+ sal_Int16 nValue = 0;
+ if( ! ( aValue >>= nValue ) )
+ throw lang::IllegalArgumentException();
+
+ GetPage()->setTransitionType( nValue );
+ break;
+ }
+
+ case WID_TRANSITION_SUBTYPE:
+ {
+ sal_Int16 nValue = 0;
+ if( ! ( aValue >>= nValue ) )
+ throw lang::IllegalArgumentException();
+
+ GetPage()->setTransitionSubtype( nValue );
+ break;
+ }
+
+ case WID_TRANSITION_DIRECTION:
+ {
+ bool bValue = false;
+ if( ! ( aValue >>= bValue ) )
+ throw lang::IllegalArgumentException();
+
+ GetPage()->setTransitionDirection( bValue );
+ break;
+ }
+
+ case WID_TRANSITION_FADE_COLOR:
+ {
+ sal_Int32 nValue = 0;
+ if( ! ( aValue >>= nValue ) )
+ throw lang::IllegalArgumentException();
+
+ GetPage()->setTransitionFadeColor( nValue );
+ break;
+ }
+
+ case WID_TRANSITION_DURATION:
+ {
+ double fValue = 0.0;
+ if( ! ( aValue >>= fValue ) )
+ throw lang::IllegalArgumentException();
+
+ GetPage()->setTransitionDuration( fValue );
+ break;
+ }
+
+ case WID_PAGE_THEME:
+ {
+ SdrPage* pPage = GetPage();
+ std::unique_ptr<svx::Theme> pTheme = svx::Theme::FromAny(aValue);
+ pPage->getSdrPageProperties().SetTheme(std::move(pTheme));
+ break;
+ }
+
+ default:
+ throw beans::UnknownPropertyException( aPropertyName, static_cast<cppu::OWeakObject*>(this));
+ }
+
+ GetModel()->SetModified();
+}
+
+Any SAL_CALL SdGenericDrawPage::getPropertyValue( const OUString& PropertyName )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ uno::Any aAny;
+
+ const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(PropertyName);
+
+ sal_Int16 nEntry = pEntry ? pEntry->nWID : -1;
+ switch (nEntry)
+ {
+ case WID_NAVORDER:
+ aAny = getNavigationOrder();
+ break;
+ case WID_PAGE_LEFT:
+ aAny <<= GetPage()->GetLeftBorder();
+ break;
+ case WID_PAGE_RIGHT:
+ aAny <<= GetPage()->GetRightBorder();
+ break;
+ case WID_PAGE_TOP:
+ aAny <<= GetPage()->GetUpperBorder();
+ break;
+ case WID_PAGE_BOTTOM:
+ aAny <<= GetPage()->GetLowerBorder();
+ break;
+ case WID_PAGE_WIDTH:
+ aAny <<= static_cast<sal_Int32>( GetPage()->GetSize().getWidth() );
+ break;
+ case WID_PAGE_HEIGHT:
+ aAny <<= static_cast<sal_Int32>( GetPage()->GetSize().getHeight() );
+ break;
+ case WID_PAGE_ORIENT:
+ aAny <<=
+ GetPage()->GetOrientation() == Orientation::Portrait
+ ? view::PaperOrientation_PORTRAIT
+ : view::PaperOrientation_LANDSCAPE;
+ break;
+ case WID_PAGE_EFFECT:
+ aAny <<= GetPage()->GetFadeEffect();
+ break;
+ case WID_PAGE_CHANGE:
+ aAny <<= static_cast<sal_Int32>( GetPage()->GetPresChange() );
+ break;
+ case WID_PAGE_SPEED:
+ {
+ const double fDuration = GetPage()->getTransitionDuration();
+ aAny <<= presentation::AnimationSpeed(
+ fDuration < 2.0 ? 2 : fDuration > 2.0 ? 0 : 1);
+ }
+ break;
+ case WID_PAGE_LAYOUT:
+ aAny <<= static_cast<sal_Int16>( GetPage()->GetAutoLayout() );
+ break;
+ case WID_PAGE_NUMBER:
+ {
+ const sal_uInt16 nPageNumber(GetPage()->GetPageNum());
+
+ if(nPageNumber > 0)
+ {
+ // for all other pages calculate the number
+ aAny <<= static_cast<sal_Int16>(static_cast<sal_uInt16>((nPageNumber-1)>>1) + 1);
+ }
+ else
+ {
+ aAny <<= mnTempPageNumber;
+ }
+ }
+ break;
+ case WID_PAGE_DURATION:
+ aAny <<= static_cast<sal_Int32>( GetPage()->GetTime() + .5 );
+ break;
+ case WID_PAGE_HIGHRESDURATION:
+ aAny <<= GetPage()->GetTime();
+ break;
+ case WID_PAGE_LDNAME:
+ {
+ const OUString aName( GetPage()->GetName() );
+ aAny <<= aName;
+ break;
+ }
+ case WID_PAGE_LDBITMAP:
+ {
+ Reference< awt::XBitmap > xBitmap(VCLUnoHelper::CreateBitmap(BitmapEx(BMP_PAGE)));
+ aAny <<= xBitmap;
+ }
+ break;
+ case WID_PAGE_BACK:
+ getBackground( aAny );
+ break;
+ case WID_PAGE_PREVIEW :
+ case WID_PAGE_PREVIEWMETAFILE :
+ {
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage()));
+ ::sd::DrawDocShell* pDocShell = rDoc.GetDocSh();
+ if ( pDocShell )
+ {
+ sal_uInt16 nPgNum = 0;
+ sal_uInt16 nPageCount = rDoc.GetSdPageCount( PageKind::Standard );
+ sal_uInt16 nPageNumber = static_cast<sal_uInt16>( ( GetPage()->GetPageNum() - 1 ) >> 1 );
+ while( nPgNum < nPageCount )
+ {
+ rDoc.SetSelected( rDoc.GetSdPage( nPgNum, PageKind::Standard ), nPgNum == nPageNumber );
+ nPgNum++;
+ }
+ std::shared_ptr<GDIMetaFile> xMetaFile = pDocShell->GetPreviewMetaFile();
+ if (xMetaFile)
+ {
+ Size aSize( GetPage()->GetSize() );
+ xMetaFile->AddAction( new MetaFillColorAction( COL_WHITE, true ), 0 );
+ xMetaFile->AddAction( new MetaRectAction( ::tools::Rectangle( Point(), aSize ) ), 1 );
+ xMetaFile->SetPrefMapMode(MapMode(MapUnit::Map100thMM));
+ xMetaFile->SetPrefSize( aSize );
+
+ SvMemoryStream aDestStrm( 65535, 65535 );
+ if (nEntry == WID_PAGE_PREVIEW)
+ // Preview: WMF format.
+ ConvertGDIMetaFileToWMF(*xMetaFile, aDestStrm, nullptr, false);
+ else
+ {
+ // PreviewMetafile: SVM format.
+ SvmWriter aWriter(aDestStrm);
+ aWriter.Write(*xMetaFile);
+ }
+ Sequence<sal_Int8> aSeq( static_cast<sal_Int8 const *>(aDestStrm.GetData()), aDestStrm.Tell() );
+ aAny <<= aSeq;
+ }
+ }
+ }
+ break;
+
+ case WID_PAGE_PREVIEWBITMAP :
+ {
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage()));
+ ::sd::DrawDocShell* pDocShell = rDoc.GetDocSh();
+ if ( pDocShell )
+ {
+ sal_uInt16 nPgNum = 0;
+ sal_uInt16 nPageCount = rDoc.GetSdPageCount( PageKind::Standard );
+ sal_uInt16 nPageNumber = static_cast<sal_uInt16>( ( GetPage()->GetPageNum() - 1 ) >> 1 );
+ while( nPgNum < nPageCount )
+ {
+ rDoc.SetSelected( rDoc.GetSdPage( nPgNum, PageKind::Standard ), nPgNum == nPageNumber );
+ nPgNum++;
+ }
+ std::shared_ptr<GDIMetaFile> xMetaFile = pDocShell->GetPreviewMetaFile();
+ BitmapEx aBitmap;
+ if (xMetaFile && xMetaFile->CreateThumbnail(aBitmap))
+ {
+ SvMemoryStream aMemStream;
+ WriteDIB(aBitmap.GetBitmap(), aMemStream, false, false);
+ uno::Sequence<sal_Int8> aSeq( static_cast<sal_Int8 const *>(aMemStream.GetData()), aMemStream.Tell() );
+ aAny <<= aSeq;
+ }
+ }
+ }
+ break;
+
+ case WID_PAGE_VISIBLE :
+ {
+ bool bVisible = !GetPage()->IsExcluded();
+ aAny <<= bVisible;
+ break;
+ }
+
+ case WID_PAGE_SOUNDFILE :
+ {
+ if( GetPage()->IsStopSound() )
+ {
+ aAny <<= true;
+ }
+ else
+ {
+ OUString aURL;
+ if( GetPage()->IsSoundOn() )
+ aURL = GetPage()->GetSoundFile();
+ aAny <<= aURL;
+ }
+ break;
+ }
+ case WID_LOOP_SOUND:
+ {
+ aAny <<= GetPage()->IsLoopSound();
+ break;
+ }
+ case WID_PAGE_BACKFULL:
+ {
+ bool bFullSize = GetPage()->IsBackgroundFullSize();
+ aAny <<= bFullSize;
+ break;
+ }
+ case WID_PAGE_BACKVIS:
+ {
+ SdrPage* pPage = GetPage();
+ if( pPage )
+ {
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(pPage->getSdrModelFromSdrPage()));
+ if( rDoc.GetMasterPageCount() )
+ {
+ SdrLayerAdmin& rLayerAdmin = rDoc.GetLayerAdmin();
+ SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
+ aAny <<= aVisibleLayers.IsSet(rLayerAdmin.GetLayerID(sUNO_LayerName_background));
+ }
+ else
+ {
+ aAny <<= false;
+ }
+ }
+ break;
+ }
+ case WID_PAGE_BACKOBJVIS:
+ {
+ SdrPage* pPage = GetPage();
+ if( pPage )
+ {
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(pPage->getSdrModelFromSdrPage()));
+ if( rDoc.GetMasterPageCount() )
+ {
+ SdrLayerAdmin& rLayerAdmin = rDoc.GetLayerAdmin();
+ SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
+ aAny <<= aVisibleLayers.IsSet(rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects));
+ }
+ else
+ {
+ aAny <<= false;
+ }
+ }
+ break;
+ }
+ case WID_PAGE_USERATTRIBS:
+ {
+ GetPage()->getAlienAttributes( aAny );
+ break;
+ }
+ case WID_PAGE_BOOKMARK:
+ {
+ aAny <<= getBookmarkURL();
+ break;
+ }
+ case WID_PAGE_ISDARK:
+ {
+ aAny <<= GetPage()->GetPageBackgroundColor().IsDark();
+ break;
+ }
+ case WID_PAGE_HEADERVISIBLE:
+ aAny <<= GetPage()->getHeaderFooterSettings().mbHeaderVisible;
+ break;
+ case WID_PAGE_HEADERTEXT:
+ {
+ const OUString aText( GetPage()->getHeaderFooterSettings().maHeaderText );
+ aAny <<= aText;
+ }
+ break;
+ case WID_PAGE_FOOTERVISIBLE:
+ aAny <<= GetPage()->getHeaderFooterSettings().mbFooterVisible;
+ break;
+ case WID_PAGE_FOOTERTEXT:
+ {
+ const OUString aText( GetPage()->getHeaderFooterSettings().maFooterText );
+ aAny <<= aText;
+ }
+ break;
+ case WID_PAGE_PAGENUMBERVISIBLE:
+ aAny <<= GetPage()->getHeaderFooterSettings().mbSlideNumberVisible;
+ break;
+ case WID_PAGE_DATETIMEVISIBLE:
+ aAny <<= GetPage()->getHeaderFooterSettings().mbDateTimeVisible;
+ break;
+ case WID_PAGE_DATETIMEFIXED:
+ aAny <<= GetPage()->getHeaderFooterSettings().mbDateTimeIsFixed;
+ break;
+ case WID_PAGE_DATETIMETEXT:
+ {
+ const OUString aText( GetPage()->getHeaderFooterSettings().maDateTimeText );
+ aAny <<= aText;
+ }
+ break;
+ case WID_PAGE_DATETIMEFORMAT:
+ {
+ auto const & rSettings = GetPage()->getHeaderFooterSettings();
+ sal_Int32 x = static_cast<sal_Int32>(rSettings.meDateFormat) | (static_cast<sal_Int32>(rSettings.meTimeFormat) << 4);
+ aAny <<= x;
+ }
+ break;
+
+ case WID_TRANSITION_TYPE:
+ aAny <<= GetPage()->getTransitionType();
+ break;
+
+ case WID_TRANSITION_SUBTYPE:
+ aAny <<= GetPage()->getTransitionSubtype();
+ break;
+
+ case WID_TRANSITION_DIRECTION:
+ aAny <<= GetPage()->getTransitionDirection();
+ break;
+
+ case WID_TRANSITION_FADE_COLOR:
+ aAny <<= GetPage()->getTransitionFadeColor();
+ break;
+
+ case WID_TRANSITION_DURATION:
+ aAny <<= GetPage()->getTransitionDuration();
+ break;
+
+ case WID_PAGE_THEME:
+ {
+ SdrPage* pPage = GetPage();
+ svx::Theme* pTheme = pPage->getSdrPageProperties().GetTheme();
+ if (pTheme)
+ {
+ pTheme->ToAny(aAny);
+ }
+ else
+ {
+ beans::PropertyValues aValues;
+ aAny <<= aValues;
+ }
+ break;
+ }
+
+ default:
+ throw beans::UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this));
+ }
+ return aAny;
+}
+
+void SAL_CALL SdGenericDrawPage::addPropertyChangeListener( const OUString& , const Reference< beans::XPropertyChangeListener >& ) {}
+void SAL_CALL SdGenericDrawPage::removePropertyChangeListener( const OUString& , const Reference< beans::XPropertyChangeListener >& ) {}
+void SAL_CALL SdGenericDrawPage::addVetoableChangeListener( const OUString& , const Reference< beans::XVetoableChangeListener >& ) {}
+void SAL_CALL SdGenericDrawPage::removeVetoableChangeListener( const OUString& , const Reference< beans::XVetoableChangeListener >& ) {}
+
+// XMultiPropertySet
+void SAL_CALL SdGenericDrawPage::setPropertyValues( const Sequence< OUString >& aPropertyNames, const Sequence< Any >& aValues )
+{
+ if( aPropertyNames.getLength() != aValues.getLength() )
+ throw lang::IllegalArgumentException();
+
+ const OUString* pNames = aPropertyNames.getConstArray();
+ const Any* pValues = aValues.getConstArray();
+ sal_uInt32 nCount = aValues.getLength();
+ while( nCount-- )
+ {
+ try
+ {
+ setPropertyValue( *pNames++, *pValues++ );
+ }
+ catch( beans::UnknownPropertyException& )
+ {
+ // ignore for multi property set
+ // todo: optimize this!
+ }
+ }
+}
+
+Sequence< Any > SAL_CALL SdGenericDrawPage::getPropertyValues( const Sequence< OUString >& aPropertyNames )
+{
+ sal_Int32 nCount = aPropertyNames.getLength();
+ Sequence< Any > aValues( nCount );
+ std::transform(aPropertyNames.begin(), aPropertyNames.end(), aValues.getArray(),
+ [this](const OUString& rName) -> Any {
+ Any aValue;
+ try
+ {
+ aValue = getPropertyValue(rName);
+ }
+ catch( beans::UnknownPropertyException& )
+ {
+ // ignore for multi property set
+ // todo: optimize this!
+ }
+ return aValue;
+ });
+ return aValues;
+}
+
+void SAL_CALL SdGenericDrawPage::addPropertiesChangeListener( const Sequence< OUString >& , const Reference< beans::XPropertiesChangeListener >& )
+{
+}
+
+void SAL_CALL SdGenericDrawPage::removePropertiesChangeListener( const Reference< beans::XPropertiesChangeListener >& )
+{
+}
+
+void SAL_CALL SdGenericDrawPage::firePropertiesChangeEvent( const Sequence< OUString >& , const Reference< beans::XPropertiesChangeListener >& )
+{
+}
+
+Reference< drawing::XShape > SdGenericDrawPage::CreateShape(SdrObject *pObj) const
+{
+ DBG_ASSERT( GetPage(), "SdGenericDrawPage::CreateShape(), can't create shape for disposed page!" );
+ DBG_ASSERT( pObj, "SdGenericDrawPage::CreateShape(), invalid call with pObj == 0!" );
+
+ if (!pObj)
+ return Reference< drawing::XShape >();
+
+ if (GetPage())
+ {
+ PresObjKind eKind = GetPage()->GetPresObjKind(pObj);
+
+ rtl::Reference<SvxShape> pShape;
+
+ if(pObj->GetObjInventor() == SdrInventor::Default)
+ {
+ SdrObjKind nInventor = pObj->GetObjIdentifier();
+ switch( nInventor )
+ {
+ case SdrObjKind::TitleText:
+ pShape = new SvxShapeText( pObj );
+ if( GetPage()->GetPageKind() == PageKind::Notes && GetPage()->IsMasterPage() )
+ {
+ // fake an empty PageShape if it's a title shape on the master page
+ pShape->SetShapeType("com.sun.star.presentation.PageShape");
+ }
+ else
+ {
+ pShape->SetShapeType("com.sun.star.presentation.TitleTextShape");
+ }
+ eKind = PresObjKind::NONE;
+ break;
+ case SdrObjKind::OutlineText:
+ pShape = new SvxShapeText( pObj );
+ pShape->SetShapeType("com.sun.star.presentation.OutlinerShape");
+ eKind = PresObjKind::NONE;
+ break;
+ default: ;
+ }
+ }
+
+ Reference< drawing::XShape > xShape( pShape );
+
+ if(!xShape.is())
+ xShape = SvxFmDrawPage::CreateShape( pObj );
+
+ if( eKind != PresObjKind::NONE )
+ {
+ OUString aShapeType("com.sun.star.presentation.");
+
+ switch( eKind )
+ {
+ case PresObjKind::Title:
+ aShapeType += "TitleTextShape";
+ break;
+ case PresObjKind::Outline:
+ aShapeType += "OutlinerShape";
+ break;
+ case PresObjKind::Text:
+ aShapeType += "SubtitleShape";
+ break;
+ case PresObjKind::Graphic:
+ aShapeType += "GraphicObjectShape";
+ break;
+ case PresObjKind::Object:
+ aShapeType += "OLE2Shape";
+ break;
+ case PresObjKind::Chart:
+ aShapeType += "ChartShape";
+ break;
+ case PresObjKind::OrgChart:
+ aShapeType += "OrgChartShape";
+ break;
+ case PresObjKind::Calc:
+ aShapeType += "CalcShape";
+ break;
+ case PresObjKind::Table:
+ aShapeType += "TableShape";
+ break;
+ case PresObjKind::Media:
+ aShapeType += "MediaShape";
+ break;
+ case PresObjKind::Page:
+ aShapeType += "PageShape";
+ break;
+ case PresObjKind::Handout:
+ aShapeType += "HandoutShape";
+ break;
+ case PresObjKind::Notes:
+ aShapeType += "NotesShape";
+ break;
+ case PresObjKind::Footer:
+ aShapeType += "FooterShape";
+ break;
+ case PresObjKind::Header:
+ aShapeType += "HeaderShape";
+ break;
+ case PresObjKind::SlideNumber:
+ aShapeType += "SlideNumberShape";
+ break;
+ case PresObjKind::DateTime:
+ aShapeType += "DateTimeShape";
+ break;
+ // coverity[dead_error_begin] - following conditions exist to avoid compiler warning
+ case PresObjKind::NONE:
+ break;
+ }
+
+ if( !pShape )
+ pShape = comphelper::getFromUnoTunnel<SvxShape>( xShape );
+
+ if( pShape )
+ pShape->SetShapeType( aShapeType );
+ }
+
+ SvxShape *pSdShape = comphelper::getFromUnoTunnel<SvxShape>(xShape);
+ if (pSdShape)
+ {
+ // SdXShape aggregates SvxShape
+ new SdXShape(pSdShape, GetModel());
+ }
+ return xShape;
+ }
+ else
+ {
+ return SvxFmDrawPage::CreateShape( pObj );
+ }
+
+}
+
+// XServiceInfo
+Sequence< OUString > SAL_CALL SdGenericDrawPage::getSupportedServiceNames()
+{
+ return comphelper::concatSequences(
+ SvxFmDrawPage::getSupportedServiceNames(),
+ std::initializer_list<std::u16string_view>{ u"com.sun.star.drawing.GenericDrawPage",
+ u"com.sun.star.document.LinkTarget",
+ u"com.sun.star.document.LinkTargetSupplier" });
+}
+
+// XLinkTargetSupplier
+Reference< container::XNameAccess > SAL_CALL SdGenericDrawPage::getLinks( )
+{
+ return new SdPageLinkTargets( this );
+}
+
+void SdGenericDrawPage::setBackground( const Any& )
+{
+ OSL_FAIL( "Don't call me, I'm useless!" );
+}
+
+void SdGenericDrawPage::getBackground( Any& )
+{
+ OSL_FAIL( "Don't call me, I'm useless!" );
+}
+
+OUString SdGenericDrawPage::getBookmarkURL() const
+{
+ OUStringBuffer aRet;
+ if( SvxFmDrawPage::mpPage )
+ {
+ OUString aFileName( static_cast<SdPage*>(SvxFmDrawPage::mpPage)->GetFileName() );
+ if( !aFileName.isEmpty() )
+ {
+ const OUString aBookmarkName( SdDrawPage::getPageApiNameFromUiName( static_cast<SdPage*>(SvxFmDrawPage::mpPage)->GetBookmarkName() ) );
+ aRet.append( aFileName );
+ aRet.append( '#' );
+ aRet.append( aBookmarkName );
+ }
+ }
+
+ return aRet.makeStringAndClear();
+}
+
+void SdGenericDrawPage::setBookmarkURL( std::u16string_view rURL )
+{
+ if( !SvxFmDrawPage::mpPage )
+ return;
+
+ size_t nIndex = rURL.find( '#' );
+ if( nIndex == std::u16string_view::npos )
+ return;
+
+ const OUString aFileName( rURL.substr( 0, nIndex ) );
+ const OUString aBookmarkName( SdDrawPage::getUiNameFromPageApiName( OUString(rURL.substr( nIndex+1 )) ) );
+
+ if( !aFileName.isEmpty() && !aBookmarkName.isEmpty() )
+ {
+ static_cast<SdPage*>(SvxFmDrawPage::mpPage)->DisconnectLink();
+ static_cast<SdPage*>(SvxFmDrawPage::mpPage)->SetFileName( aFileName );
+ static_cast<SdPage*>(SvxFmDrawPage::mpPage)->SetBookmarkName( aBookmarkName );
+ static_cast<SdPage*>(SvxFmDrawPage::mpPage)->ConnectLink();
+ }
+}
+
+Reference< drawing::XShape > SAL_CALL SdGenericDrawPage::combine( const Reference< drawing::XShapes >& xShapes )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ DBG_ASSERT(SvxFmDrawPage::mpPage,"SdrPage is NULL! [CL]");
+ DBG_ASSERT(mpView, "SdrView is NULL! [CL]");
+
+ Reference< drawing::XShape > xShape;
+ if(mpView==nullptr||!xShapes.is()||GetPage()==nullptr)
+ return xShape;
+
+ SdrPageView* pPageView = mpView->ShowSdrPage( GetPage() );
+
+ SelectObjectsInView( xShapes, pPageView );
+
+ mpView->CombineMarkedObjects( false );
+
+ mpView->AdjustMarkHdl();
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ if( rMarkList.GetMarkCount() == 1 )
+ {
+ SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ if( pObj )
+ xShape.set( pObj->getUnoShape(), UNO_QUERY );
+ }
+
+ mpView->HideSdrPage();
+
+ GetModel()->SetModified();
+
+ return xShape;
+}
+
+void SAL_CALL SdGenericDrawPage::split( const Reference< drawing::XShape >& xGroup )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ if(mpView==nullptr||!xGroup.is()||GetPage()==nullptr)
+ return;
+
+ SdrPageView* pPageView = mpView->ShowSdrPage( GetPage() );
+ SelectObjectInView( xGroup, pPageView );
+ mpView->DismantleMarkedObjects();
+ mpView->HideSdrPage();
+
+ GetModel()->SetModified();
+}
+
+Reference< drawing::XShape > SAL_CALL SdGenericDrawPage::bind( const Reference< drawing::XShapes >& xShapes )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ uno::Reference< drawing::XShape > xShape;
+ if(mpView==nullptr||!xShapes.is()||GetPage()==nullptr)
+ return xShape;
+
+ SdrPageView* pPageView = mpView->ShowSdrPage( GetPage() );
+
+ SelectObjectsInView( xShapes, pPageView );
+
+ mpView->CombineMarkedObjects();
+
+ mpView->AdjustMarkHdl();
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ if( rMarkList.GetMarkCount() == 1 )
+ {
+ SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ if( pObj )
+ xShape.set( pObj->getUnoShape(), UNO_QUERY );
+ }
+
+ mpView->HideSdrPage();
+
+ GetModel()->SetModified();
+
+ return xShape;
+}
+
+void SAL_CALL SdGenericDrawPage::unbind( const Reference< drawing::XShape >& xShape )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ if(mpView==nullptr||!xShape.is()||GetPage()==nullptr)
+ return;
+
+ SdrPageView* pPageView = mpView->ShowSdrPage( GetPage() );
+ SelectObjectInView( xShape, pPageView );
+ mpView->DismantleMarkedObjects( true );
+ mpView->HideSdrPage();
+
+ GetModel()->SetModified();
+}
+
+void SdGenericDrawPage::SetLeftBorder( sal_Int32 nValue )
+{
+ if( nValue == GetPage()->GetLeftBorder() )
+ return;
+
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage()));
+ const PageKind ePageKind = GetPage()->GetPageKind();
+
+ sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind);
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind);
+ pPage->SetLeftBorder( nValue );
+ }
+
+ nPageCnt = rDoc.GetSdPageCount(ePageKind);
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetSdPage(i, ePageKind);
+ pPage->SetLeftBorder( nValue );
+ }
+}
+
+void SdGenericDrawPage::SetRightBorder( sal_Int32 nValue )
+{
+ if( nValue == GetPage()->GetRightBorder() )
+ return;
+
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage()));
+ const PageKind ePageKind = GetPage()->GetPageKind();
+
+ sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind);
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind);
+ pPage->SetRightBorder( nValue );
+ }
+
+ nPageCnt = rDoc.GetSdPageCount(ePageKind);
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetSdPage(i, ePageKind);
+ pPage->SetRightBorder( nValue );
+ }
+}
+
+void SdGenericDrawPage::SetUpperBorder( sal_Int32 nValue )
+{
+ if( nValue == GetPage()->GetUpperBorder() )
+ return;
+
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage()));
+ const PageKind ePageKind = GetPage()->GetPageKind();
+
+ sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind);
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind);
+ pPage->SetUpperBorder( nValue );
+ }
+
+ nPageCnt = rDoc.GetSdPageCount(ePageKind);
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetSdPage(i, ePageKind);
+ pPage->SetUpperBorder( nValue );
+ }
+}
+
+void SdGenericDrawPage::SetLowerBorder( sal_Int32 nValue )
+{
+ if( nValue == GetPage()->GetLowerBorder() )
+ return;
+
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage()));
+ const PageKind ePageKind = GetPage()->GetPageKind();
+
+ sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind);
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind);
+ pPage->SetLowerBorder( nValue );
+ }
+
+ nPageCnt = rDoc.GetSdPageCount(ePageKind);
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetSdPage(i, ePageKind);
+ pPage->SetLowerBorder( nValue );
+ }
+}
+
+static void refreshpage( SdDrawDocument* pDoc, const PageKind ePageKind )
+{
+ ::sd::DrawDocShell* pDocShell = pDoc->GetDocSh();
+ if ( !pDocShell )
+ return;
+
+ ::sd::ViewShell* pViewSh = pDocShell->GetViewShell();
+
+ if( !pViewSh )
+ return;
+
+ if( auto pDrawViewShell = dynamic_cast<::sd::DrawViewShell* >(pViewSh) )
+ pDrawViewShell->ResetActualPage();
+
+ Size aPageSize = pDoc->GetSdPage(0, ePageKind)->GetSize();
+ const tools::Long nWidth = aPageSize.Width();
+ const tools::Long nHeight = aPageSize.Height();
+
+ Point aPageOrg(nWidth, nHeight / 2);
+ Size aViewSize(nWidth * 3, nHeight * 2);
+
+ pDoc->SetMaxObjSize(aViewSize);
+
+ pViewSh->InitWindows(aPageOrg, aViewSize, Point(-1, -1), true);
+
+ pViewSh->UpdateScrollBars();
+}
+
+void SdGenericDrawPage::SetWidth( sal_Int32 nWidth )
+{
+ Size aSize( GetPage()->GetSize() );
+ if( aSize.getWidth() == nWidth )
+ return;
+
+ aSize.setWidth( nWidth );
+
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage()));
+ const PageKind ePageKind = GetPage()->GetPageKind();
+
+ sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind);
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind);
+ pPage->SetSize(aSize);
+ }
+
+ nPageCnt = rDoc.GetSdPageCount(ePageKind);
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetSdPage(i, ePageKind);
+ pPage->SetSize(aSize);
+ }
+
+ refreshpage( &rDoc, ePageKind );
+}
+
+void SdGenericDrawPage::SetHeight( sal_Int32 nHeight )
+{
+ Size aSize( GetPage()->GetSize() );
+ if( aSize.getHeight() == nHeight )
+ return;
+
+ aSize.setHeight( nHeight );
+
+ SdDrawDocument& rDoc(static_cast< SdDrawDocument& >(GetPage()->getSdrModelFromSdrPage()));
+ const PageKind ePageKind = GetPage()->GetPageKind();
+
+ sal_uInt16 i, nPageCnt = rDoc.GetMasterSdPageCount(ePageKind);
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetMasterSdPage(i, ePageKind);
+ pPage->SetSize(aSize);
+ }
+
+ nPageCnt = rDoc.GetSdPageCount(ePageKind);
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = rDoc.GetSdPage(i, ePageKind);
+ pPage->SetSize(aSize);
+ }
+
+ refreshpage( &rDoc, ePageKind );
+}
+
+// XInterface
+void SdGenericDrawPage::release() noexcept
+{
+
+ OWeakAggObject::release();
+}
+
+// XComponent
+void SdGenericDrawPage::disposing() noexcept
+{
+ mpDocModel = nullptr;
+ SvxFmDrawPage::disposing();
+}
+
+// XAnimationNodeSupplier
+Reference< XAnimationNode > SAL_CALL SdGenericDrawPage::getAnimationNode()
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ SdPage *pSdPage = static_cast<SdPage*>(SvxFmDrawPage::mpPage);
+
+ return pSdPage->getAnimationNode();
+}
+
+// SdPageLinkTargets
+SdPageLinkTargets::SdPageLinkTargets( SdGenericDrawPage* pUnoPage ) noexcept
+{
+ mxPage = pUnoPage;
+ mpUnoPage = pUnoPage;
+}
+
+SdPageLinkTargets::~SdPageLinkTargets() noexcept
+{
+}
+
+// XElementAccess
+uno::Type SAL_CALL SdPageLinkTargets::getElementType()
+{
+ return cppu::UnoType<beans::XPropertySet>::get();
+}
+
+sal_Bool SAL_CALL SdPageLinkTargets::hasElements()
+{
+ ::SolarMutexGuard aGuard;
+
+ SdPage* pPage = mpUnoPage->GetPage();
+ if( pPage != nullptr )
+ {
+ SdrObjListIter aIter( pPage, SdrIterMode::DeepWithGroups );
+
+ while( aIter.IsMore() )
+ {
+ SdrObject* pObj = aIter.Next();
+ OUString aStr( pObj->GetName() );
+ if( aStr.isEmpty() )
+ if (auto pOleObj = dynamic_cast< const SdrOle2Obj *>( pObj ))
+ aStr = pOleObj->GetPersistName();
+ if( !aStr.isEmpty() )
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// container::XNameAccess
+
+// XNameAccess
+Any SAL_CALL SdPageLinkTargets::getByName( const OUString& aName )
+{
+ ::SolarMutexGuard aGuard;
+
+ SdPage* pPage = mpUnoPage->GetPage();
+ if( pPage != nullptr )
+ {
+ SdrObject* pObj = FindObject( aName );
+ if( pObj )
+ {
+ Reference< beans::XPropertySet > aRef( pObj->getUnoShape(), uno::UNO_QUERY );
+ return Any( aRef );
+ }
+ }
+
+ throw container::NoSuchElementException();
+}
+
+Sequence< OUString > SAL_CALL SdPageLinkTargets::getElementNames()
+{
+ ::SolarMutexGuard aGuard;
+
+ sal_uInt32 nObjCount = 0;
+
+ SdPage* pPage = mpUnoPage->GetPage();
+ if( pPage != nullptr )
+ {
+ SdrObjListIter aIter( pPage, SdrIterMode::DeepWithGroups );
+ while( aIter.IsMore() )
+ {
+ SdrObject* pObj = aIter.Next();
+ OUString aStr( pObj->GetName() );
+ if( aStr.isEmpty() )
+ if (auto pOleObj = dynamic_cast< const SdrOle2Obj *>( pObj ))
+ aStr = pOleObj->GetPersistName();
+ if( !aStr.isEmpty() )
+ nObjCount++;
+ }
+ }
+
+ Sequence< OUString > aSeq( nObjCount );
+ if( nObjCount > 0 )
+ {
+ OUString* pStr = aSeq.getArray();
+
+ SdrObjListIter aIter( pPage, SdrIterMode::DeepWithGroups );
+ while( aIter.IsMore() )
+ {
+ SdrObject* pObj = aIter.Next();
+ OUString aStr( pObj->GetName() );
+ if( aStr.isEmpty() )
+ if (auto pOleObj = dynamic_cast< const SdrOle2Obj *>( pObj ))
+ aStr = pOleObj->GetPersistName();
+ if( !aStr.isEmpty() )
+ *pStr++ = aStr;
+ }
+ }
+
+ return aSeq;
+}
+
+sal_Bool SAL_CALL SdPageLinkTargets::hasByName( const OUString& aName )
+{
+ ::SolarMutexGuard aGuard;
+
+ return FindObject( aName ) != nullptr;
+}
+
+SdrObject* SdPageLinkTargets::FindObject( std::u16string_view rName ) const noexcept
+{
+ SdPage* pPage = mpUnoPage->GetPage();
+ if( pPage == nullptr )
+ return nullptr;
+
+ SdrObjListIter aIter( pPage, SdrIterMode::DeepWithGroups );
+
+ while( aIter.IsMore() )
+ {
+ SdrObject* pObj = aIter.Next();
+ OUString aStr( pObj->GetName() );
+ if( aStr.isEmpty() )
+ if (auto pOleObj = dynamic_cast< const SdrOle2Obj *>( pObj ))
+ aStr = pOleObj->GetPersistName();
+ if( !aStr.isEmpty() && (aStr == rName) )
+ return pObj;
+ }
+
+ return nullptr;
+}
+
+// XServiceInfo
+OUString SAL_CALL SdPageLinkTargets::getImplementationName()
+{
+ return "SdPageLinkTargets";
+}
+
+sal_Bool SAL_CALL SdPageLinkTargets::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+Sequence< OUString > SAL_CALL SdPageLinkTargets::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.LinkTargets" };
+}
+
+// SdDrawPage
+SdDrawPage::SdDrawPage(SdXImpressDocument* pModel, SdPage* pPage)
+ : SdGenericDrawPage( pModel, pPage, ImplGetDrawPagePropertySet( pModel->IsImpressDocument(), pPage->GetPageKind() ) )
+{
+}
+
+SdDrawPage::~SdDrawPage() noexcept
+{
+}
+
+// XInterface
+Any SAL_CALL SdDrawPage::queryInterface( const uno::Type & rType )
+{
+ if( rType == cppu::UnoType<drawing::XMasterPageTarget>::get() )
+ {
+ return Any( Reference< drawing::XMasterPageTarget >( this ) );
+ }
+ else if( IsImpressDocument()
+ && rType == cppu::UnoType<presentation::XPresentationPage>::get() )
+ {
+ SdPage * p = dynamic_cast<SdPage *>(SvxDrawPage::mpPage);
+ if( p == nullptr || p->GetPageKind() != PageKind::Handout )
+ {
+ return Any( Reference< presentation::XPresentationPage >( this ) );
+ }
+ }
+
+ return SdGenericDrawPage::queryInterface( rType );
+}
+
+void SAL_CALL SdDrawPage::acquire() noexcept
+{
+ SvxDrawPage::acquire();
+}
+
+void SAL_CALL SdDrawPage::release() noexcept
+{
+ SvxDrawPage::release();
+}
+
+UNO3_GETIMPLEMENTATION2_IMPL( SdDrawPage, SdGenericDrawPage );
+
+// XTypeProvider
+Sequence< uno::Type > SAL_CALL SdDrawPage::getTypes()
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ if( !maTypeSequence.hasElements() )
+ {
+ const PageKind ePageKind = GetPage() ? GetPage()->GetPageKind() : PageKind::Standard;
+ bool bPresPage = IsImpressDocument() && ePageKind != PageKind::Handout;
+
+ // Collect the types of this class.
+ ::std::vector<uno::Type> aTypes;
+ aTypes.reserve(13);
+ aTypes.push_back(cppu::UnoType<drawing::XDrawPage>::get());
+ aTypes.push_back(cppu::UnoType<beans::XPropertySet>::get());
+ aTypes.push_back(cppu::UnoType<container::XNamed>::get());
+ aTypes.push_back(cppu::UnoType<drawing::XMasterPageTarget>::get());
+ aTypes.push_back(cppu::UnoType<lang::XServiceInfo>::get());
+ aTypes.push_back(cppu::UnoType<util::XReplaceable>::get());
+ aTypes.push_back(cppu::UnoType<document::XLinkTargetSupplier>::get());
+ aTypes.push_back(cppu::UnoType<drawing::XShapeCombiner>::get());
+ aTypes.push_back(cppu::UnoType<drawing::XShapeBinder>::get());
+ aTypes.push_back(cppu::UnoType<office::XAnnotationAccess>::get());
+ aTypes.push_back(cppu::UnoType<beans::XMultiPropertySet>::get());
+ if( bPresPage )
+ aTypes.push_back(cppu::UnoType<presentation::XPresentationPage>::get());
+ if( bPresPage && ePageKind == PageKind::Standard )
+ aTypes.push_back(cppu::UnoType<XAnimationNodeSupplier>::get());
+
+ // Get types of base class.
+ // Join those types in a sequence.
+ return comphelper::concatSequences(
+ comphelper::containerToSequence(aTypes),
+ SdGenericDrawPage::getTypes() );
+ }
+
+ return maTypeSequence;
+}
+
+Sequence< sal_Int8 > SAL_CALL SdDrawPage::getImplementationId()
+{
+ return css::uno::Sequence<sal_Int8>();
+}
+
+OUString SdDrawPage::getPageApiName( SdPage const * pPage )
+{
+ return ::getPageApiName( pPage );
+}
+
+OUString getPageApiName( SdPage const * pPage )
+{
+ OUString aPageName;
+
+ if(pPage)
+ {
+ aPageName = pPage->GetRealName();
+
+ if( aPageName.isEmpty() )
+ {
+ const sal_Int32 nPageNum = ( ( pPage->GetPageNum() - 1 ) >> 1 ) + 1;
+ aPageName = sEmptyPageName + OUString::number( nPageNum );
+ }
+ }
+
+ return aPageName;
+}
+
+OUString getPageApiNameFromUiName( const OUString& rUIName )
+{
+ OUString aApiName;
+
+ OUString aDefPageName(SdResId(STR_PAGE) + " ");
+
+ if( rUIName.startsWith( aDefPageName ) )
+ {
+ aApiName = OUString::Concat(sEmptyPageName) + rUIName.subView( aDefPageName.getLength() );
+ }
+ else
+ {
+ aApiName = rUIName;
+ }
+
+ return aApiName;
+}
+
+OUString SdDrawPage::getPageApiNameFromUiName( const OUString& rUIName )
+{
+ return ::getPageApiNameFromUiName( rUIName );
+}
+
+OUString getUiNameFromPageApiNameImpl( const OUString& rApiName )
+{
+ const OUString aDefPageName( sEmptyPageName );
+ if( rApiName.startsWith( aDefPageName ) )
+ {
+ std::u16string_view aNumber( rApiName.subView( aDefPageName.getLength() ) );
+
+ // create the page number
+ sal_Int32 nPageNumber = o3tl::toInt32(aNumber);
+
+ // check if there are non number characters in the number part
+ const size_t nChars = aNumber.size();
+ const sal_Unicode* pString = aNumber.data();
+ for( size_t nChar = 0; nChar < nChars; nChar++, pString++ )
+ {
+ if((*pString < '0') || (*pString > '9'))
+ {
+ // found a non number character, so this is not the default
+ // name for this page
+ nPageNumber = -1;
+ break;
+ }
+ }
+
+ if( nPageNumber != -1)
+ {
+ return SdResId(STR_PAGE) + " " + aNumber;
+ }
+ }
+
+ return rApiName;
+}
+
+OUString SdDrawPage::getUiNameFromPageApiName( const OUString& rApiName )
+{
+ return getUiNameFromPageApiNameImpl( rApiName );
+}
+
+// XServiceInfo
+OUString SAL_CALL SdDrawPage::getImplementationName()
+{
+ return "SdDrawPage";
+}
+
+Sequence< OUString > SAL_CALL SdDrawPage::getSupportedServiceNames()
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ std::vector<std::u16string_view> aAdd{ u"com.sun.star.drawing.DrawPage" };
+
+ if( IsImpressDocument() )
+ aAdd.emplace_back(u"com.sun.star.presentation.DrawPage");
+
+ return comphelper::concatSequences(SdGenericDrawPage::getSupportedServiceNames(), aAdd);
+}
+
+sal_Bool SAL_CALL SdDrawPage::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+// XNamed
+void SAL_CALL SdDrawPage::setName( const OUString& rName )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ DBG_ASSERT( GetPage() && !GetPage()->IsMasterPage(), "Don't call base implementation for masterpages!" );
+
+ OUString aName( rName );
+
+ if(!(GetPage() && GetPage()->GetPageKind() != PageKind::Notes))
+ return;
+
+ // check if this is the default 'page1234' name
+ OUString aNumber;
+ if(aName.startsWith( sEmptyPageName, &aNumber ))
+ {
+ // ok, it maybe is, aNumber is the number part after 'page'
+
+ // create the page number
+ sal_Int32 nPageNumber = aNumber.toInt32();
+
+ // check if there are non number characters in the number part
+ const sal_Int32 nChars = aNumber.getLength();
+ const sal_Unicode* pString = aNumber.getStr();
+ sal_Int32 nChar;
+ for( nChar = 0; nChar < nChars; nChar++, pString++ )
+ {
+ if((*pString < '0') || (*pString > '9'))
+ {
+ // found a non number character, so this is not the default
+ // name for this page
+ nPageNumber = -1;
+ break;
+ }
+ }
+
+ if( nPageNumber == ( ( GetPage()->GetPageNum() - 1 ) >> 1 ) + 1 )
+ aName.clear();
+ }
+ else
+ {
+ OUString aDefaultPageName( SdResId(STR_PAGE) + " " );
+ if( aName.startsWith( aDefaultPageName ) )
+ aName.clear();
+ }
+
+ GetPage()->SetName( aName );
+
+ sal_uInt16 nNotesPageNum = (GetPage()->GetPageNum()-1)>>1;
+ if( GetModel()->GetDoc()->GetSdPageCount( PageKind::Notes ) > nNotesPageNum )
+ {
+ SdPage* pNotesPage = GetModel()->GetDoc()->GetSdPage( nNotesPageNum, PageKind::Notes );
+ if( pNotesPage )
+ pNotesPage->SetName(aName);
+ }
+
+ // fake a mode change to repaint the page tab bar
+ ::sd::DrawDocShell* pDocSh = GetModel()->GetDocShell();
+ ::sd::ViewShell* pViewSh = pDocSh ? pDocSh->GetViewShell() : nullptr;
+ if( auto pDrawViewSh = dynamic_cast<::sd::DrawViewShell* >(pViewSh) )
+ {
+ EditMode eMode = pDrawViewSh->GetEditMode();
+ if( eMode == EditMode::Page )
+ {
+ bool bLayer = pDrawViewSh->IsLayerModeActive();
+
+ pDrawViewSh->ChangeEditMode( eMode, !bLayer );
+ pDrawViewSh->ChangeEditMode( eMode, bLayer );
+ }
+ }
+
+ GetModel()->SetModified();
+}
+
+OUString SAL_CALL SdDrawPage::getName()
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ return getPageApiName( GetPage() );
+}
+
+// XMasterPageTarget
+Reference< drawing::XDrawPage > SAL_CALL SdDrawPage::getMasterPage( )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ if(GetPage())
+ {
+ Reference< drawing::XDrawPage > xPage;
+
+ if(SvxFmDrawPage::mpPage->TRG_HasMasterPage())
+ {
+ SdrPage& rMasterPage = SvxFmDrawPage::mpPage->TRG_GetMasterPage();
+ xPage.set( rMasterPage.getUnoPage(), uno::UNO_QUERY );
+ }
+
+ return xPage;
+ }
+ return nullptr;
+}
+
+void SAL_CALL SdDrawPage::setMasterPage( const Reference< drawing::XDrawPage >& xMasterPage )
+{
+ ::SolarMutexGuard aGuard;
+ comphelper::ProfileZone aZone("setMasterPage");
+
+ throwIfDisposed();
+
+ if(!SvxFmDrawPage::mpPage)
+ return;
+
+ SdMasterPage* pMasterPage = comphelper::getFromUnoTunnel<SdMasterPage>( xMasterPage );
+ if( !(pMasterPage && pMasterPage->isValid()) )
+ return;
+
+ SvxFmDrawPage::mpPage->TRG_ClearMasterPage();
+
+ SdPage* pSdPage = static_cast<SdPage*>(pMasterPage->GetSdrPage());
+ SvxFmDrawPage::mpPage->TRG_SetMasterPage(*pSdPage);
+
+ SvxFmDrawPage::mpPage->SetBorder(pSdPage->GetLeftBorder(),pSdPage->GetUpperBorder(),
+ pSdPage->GetRightBorder(),pSdPage->GetLowerBorder() );
+
+ SvxFmDrawPage::mpPage->SetSize( pSdPage->GetSize() );
+ SvxFmDrawPage::mpPage->SetOrientation( pSdPage->GetOrientation() );
+ static_cast<SdPage*>(SvxFmDrawPage::mpPage)->SetLayoutName( pSdPage->GetLayoutName() );
+
+ // set notes master also
+ SdPage* pNotesPage = GetModel()->GetDoc()->GetSdPage( (SvxFmDrawPage::mpPage->GetPageNum()-1)>>1, PageKind::Notes );
+
+ pNotesPage->TRG_ClearMasterPage();
+ sal_uInt16 nNum = SvxFmDrawPage::mpPage->TRG_GetMasterPage().GetPageNum() + 1;
+ pNotesPage->TRG_SetMasterPage(*SvxFmDrawPage::mpPage->getSdrModelFromSdrPage().GetMasterPage(nNum));
+ pNotesPage->SetLayoutName( pSdPage->GetLayoutName() );
+
+ GetModel()->SetModified();
+}
+
+// XPresentationPage
+Reference< drawing::XDrawPage > SAL_CALL SdDrawPage::getNotesPage()
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ if(SvxFmDrawPage::mpPage && GetModel()->GetDoc() && SvxFmDrawPage::mpPage->GetPageNum() )
+ {
+ SdPage* pNotesPage = GetModel()->GetDoc()->GetSdPage( (SvxFmDrawPage::mpPage->GetPageNum()-1)>>1, PageKind::Notes );
+ if( pNotesPage )
+ {
+ Reference< drawing::XDrawPage > xPage( pNotesPage->getUnoPage(), uno::UNO_QUERY );
+ return xPage;
+ }
+ }
+ return nullptr;
+}
+
+// XIndexAccess
+sal_Int32 SAL_CALL SdDrawPage::getCount()
+{
+ return SdGenericDrawPage::getCount();
+}
+
+Any SAL_CALL SdDrawPage::getByIndex( sal_Int32 Index )
+{
+ return SdGenericDrawPage::getByIndex( Index );
+}
+
+// XElementAccess
+uno::Type SAL_CALL SdDrawPage::getElementType()
+{
+ return SdGenericDrawPage::getElementType();
+}
+
+sal_Bool SAL_CALL SdDrawPage::hasElements()
+{
+ return SdGenericDrawPage::hasElements();
+}
+
+// XShapes
+void SAL_CALL SdDrawPage::add( const Reference< drawing::XShape >& xShape )
+{
+ SdGenericDrawPage::add( xShape );
+}
+
+void SAL_CALL SdDrawPage::remove( const Reference< drawing::XShape >& xShape )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xShape );
+ if( pObj )
+ {
+ GetPage()->RemovePresObj(pObj);
+ pObj->SetUserCall(nullptr);
+ }
+
+ SdGenericDrawPage::remove( xShape );
+}
+
+void SdDrawPage::setBackground( const Any& rValue )
+{
+ Reference< beans::XPropertySet > xSet;
+
+ if( !(rValue >>= xSet) && !rValue.hasValue() )
+ throw lang::IllegalArgumentException();
+
+ if( !xSet.is() )
+ {
+ // the easy case, no background set. Set drawing::FillStyle_NONE to represent this
+ GetPage()->getSdrPageProperties().PutItem(XFillStyleItem(drawing::FillStyle_NONE));
+ return;
+ }
+
+ // is it our own implementation?
+ SdUnoPageBackground* pBack = comphelper::getFromUnoTunnel<SdUnoPageBackground>( xSet );
+
+ SfxItemSetFixed<XATTR_FILL_FIRST, XATTR_FILL_LAST> aSet( GetModel()->GetDoc()->GetPool() );
+
+ if( pBack )
+ {
+ pBack->fillItemSet( static_cast<SdDrawDocument*>(&GetPage()->getSdrModelFromSdrPage()), aSet );
+ }
+ else
+ {
+ rtl::Reference<SdUnoPageBackground> pBackground = new SdUnoPageBackground();
+
+ Reference< beans::XPropertySetInfo > xSetInfo( xSet->getPropertySetInfo() );
+ Reference< beans::XPropertySetInfo > xDestSetInfo( pBackground->getPropertySetInfo() );
+
+ const Sequence< beans::Property > aProperties( xDestSetInfo->getProperties() );
+
+ for( const beans::Property& rProp : aProperties )
+ {
+ const OUString aPropName( rProp.Name );
+ if( xSetInfo->hasPropertyByName( aPropName ) )
+ pBackground->setPropertyValue( aPropName,
+ xSet->getPropertyValue( aPropName ) );
+ }
+
+ pBackground->fillItemSet( static_cast<SdDrawDocument*>(&GetPage()->getSdrModelFromSdrPage()), aSet );
+ }
+
+ if( aSet.Count() == 0 )
+ {
+ // no background fill, represent by setting drawing::FillStyle_NONE
+ GetPage()->getSdrPageProperties().PutItem(XFillStyleItem(drawing::FillStyle_NONE));
+ }
+ else
+ {
+ // background fill, set at page (not sure if ClearItem is needed)
+ GetPage()->getSdrPageProperties().ClearItem();
+ GetPage()->getSdrPageProperties().PutItemSet(aSet);
+ }
+
+ // repaint only
+ SvxFmDrawPage::mpPage->ActionChanged();
+}
+
+// XAnnotationAccess:
+Reference< XAnnotation > SAL_CALL SdGenericDrawPage::createAndInsertAnnotation()
+{
+ if( !GetPage() )
+ throw DisposedException();
+
+ Reference< XAnnotation > xRet;
+ GetPage()->createAnnotation(xRet);
+ return xRet;
+}
+
+void SAL_CALL SdGenericDrawPage::removeAnnotation(const Reference< XAnnotation > & annotation)
+{
+ GetPage()->removeAnnotation(annotation);
+}
+
+Reference< XAnnotationEnumeration > SAL_CALL SdGenericDrawPage::createAnnotationEnumeration()
+{
+ return ::sd::createAnnotationEnumeration( std::vector(GetPage()->getAnnotations()) );
+}
+
+void SdDrawPage::getBackground(Any& rValue)
+{
+ const SfxItemSet& rFillAttributes = GetPage()->getSdrPageProperties().GetItemSet();
+
+ if(drawing::FillStyle_NONE == rFillAttributes.Get(XATTR_FILLSTYLE).GetValue())
+ {
+ // no fill set (switched off by drawing::FillStyle_NONE), clear rValue to represent this
+ rValue.clear();
+ }
+ else
+ {
+ // there is a fill set, export to rValue
+ Reference< beans::XPropertySet > xSet(new SdUnoPageBackground(
+ GetModel()->GetDoc(),
+ &GetPage()->getSdrPageProperties().GetItemSet()));
+ rValue <<= xSet;
+ }
+}
+
+void SdGenericDrawPage::setNavigationOrder( const Any& rValue )
+{
+ Reference< XIndexAccess > xIA( rValue, UNO_QUERY );
+ if( xIA.is() )
+ {
+ if( dynamic_cast< SdDrawPage* >( xIA.get() ) == this )
+ {
+ if( GetPage()->HasObjectNavigationOrder() )
+ GetPage()->ClearObjectNavigationOrder();
+
+ return;
+ }
+ else if( static_cast<size_t>(xIA->getCount()) == GetPage()->GetObjCount() )
+ {
+ GetPage()->SetNavigationOrder(xIA);
+ return;
+ }
+ }
+ throw IllegalArgumentException();
+}
+
+namespace {
+
+class SdNavigationOrderAccess : public ::cppu::WeakImplHelper< XIndexAccess >
+{
+public:
+ explicit SdNavigationOrderAccess(SdrPage const * pPage);
+
+ // XIndexAccess
+ virtual sal_Int32 SAL_CALL getCount( ) override;
+ virtual Any SAL_CALL getByIndex( sal_Int32 Index ) override;
+
+ // XElementAccess
+ virtual Type SAL_CALL getElementType( ) override;
+ virtual sal_Bool SAL_CALL hasElements( ) override;
+
+private:
+ std::vector< Reference< XShape > > maShapes;
+};
+
+}
+
+SdNavigationOrderAccess::SdNavigationOrderAccess( SdrPage const * pPage )
+: maShapes( pPage ? pPage->GetObjCount() : 0 )
+{
+ if( pPage )
+ {
+ const size_t nCount = pPage->GetObjCount();
+ for( size_t nIndex = 0; nIndex < nCount; ++nIndex )
+ {
+ SdrObject* pObj = pPage->GetObj( nIndex );
+ sal_uInt32 nNavPos = pObj->GetNavigationPosition();
+ DBG_ASSERT( !maShapes[nNavPos].is(), "sd::SdNavigationOrderAccess::SdNavigationOrderAccess(), duplicate navigation positions from core!" );
+ maShapes[nNavPos].set( pObj->getUnoShape(), UNO_QUERY );
+ }
+ }
+}
+
+// XIndexAccess
+sal_Int32 SAL_CALL SdNavigationOrderAccess::getCount( )
+{
+ return static_cast< sal_Int32 >( maShapes.size() );
+}
+
+Any SAL_CALL SdNavigationOrderAccess::getByIndex( sal_Int32 Index )
+{
+ if( (Index < 0) || (Index > getCount()) )
+ throw IndexOutOfBoundsException();
+
+ return Any( maShapes[Index] );
+}
+
+// XElementAccess
+Type SAL_CALL SdNavigationOrderAccess::getElementType( )
+{
+ return cppu::UnoType<XShape>::get();
+}
+
+sal_Bool SAL_CALL SdNavigationOrderAccess::hasElements( )
+{
+ return !maShapes.empty();
+}
+
+Any SdGenericDrawPage::getNavigationOrder()
+{
+ if( GetPage()->HasObjectNavigationOrder() )
+ {
+ return Any( Reference< XIndexAccess >( new SdNavigationOrderAccess( GetPage() ) ) );
+ }
+ else
+ {
+ return Any( Reference< XIndexAccess >( this ) );
+ }
+}
+
+SdMasterPage::SdMasterPage(SdXImpressDocument* pModel, SdPage* pPage)
+ : SdGenericDrawPage(pModel, pPage, ImplGetMasterPagePropertySet(pPage->GetPageKind()))
+{
+}
+
+SdMasterPage::~SdMasterPage() noexcept
+{
+}
+
+// XInterface
+Any SAL_CALL SdMasterPage::queryInterface( const uno::Type & rType )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ uno::Any aAny;
+
+ if( rType == cppu::UnoType<container::XIndexAccess>::get() )
+ aAny <<= Reference< container::XIndexAccess >(static_cast<presentation::XPresentationPage*>(this));
+ else if( rType == cppu::UnoType<container::XElementAccess>::get() )
+ aAny <<= Reference< container::XElementAccess >(static_cast<presentation::XPresentationPage*>(this));
+ else if( rType == cppu::UnoType<container::XNamed>::get() )
+ aAny <<= Reference< container::XNamed >(this);
+ else if( rType == cppu::UnoType<presentation::XPresentationPage>::get() &&
+ ( IsImpressDocument() &&
+ GetPage() && GetPage()->GetPageKind() != PageKind::Handout) )
+ aAny <<= Reference< presentation::XPresentationPage >( this );
+ else
+ return SdGenericDrawPage::queryInterface( rType );
+
+ return aAny;
+}
+
+void SAL_CALL SdMasterPage::acquire() noexcept
+{
+ SvxDrawPage::acquire();
+}
+
+void SAL_CALL SdMasterPage::release() noexcept
+{
+ SvxDrawPage::release();
+}
+
+UNO3_GETIMPLEMENTATION2_IMPL( SdMasterPage, SdGenericDrawPage );
+
+// XTypeProvider
+Sequence< uno::Type > SAL_CALL SdMasterPage::getTypes()
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ if( !maTypeSequence.hasElements() )
+ {
+ const PageKind ePageKind = GetPage() ? GetPage()->GetPageKind() : PageKind::Standard;
+ bool bPresPage = IsImpressDocument() && SvxFmDrawPage::mpPage && ePageKind != PageKind::Handout;
+
+ // Collect the types of this class.
+ ::std::vector<uno::Type> aTypes;
+ aTypes.reserve(12);
+ aTypes.push_back(cppu::UnoType<drawing::XDrawPage>::get());
+ aTypes.push_back(cppu::UnoType<beans::XPropertySet>::get());
+ aTypes.push_back(cppu::UnoType<container::XNamed>::get());
+ aTypes.push_back(cppu::UnoType<lang::XServiceInfo>::get());
+ aTypes.push_back(cppu::UnoType<util::XReplaceable>::get());
+ aTypes.push_back(cppu::UnoType<document::XLinkTargetSupplier>::get());
+ aTypes.push_back(cppu::UnoType<drawing::XShapeCombiner>::get());
+ aTypes.push_back(cppu::UnoType<drawing::XShapeBinder>::get());
+ aTypes.push_back(cppu::UnoType<office::XAnnotationAccess>::get());
+ aTypes.push_back(cppu::UnoType<beans::XMultiPropertySet>::get());
+ if( bPresPage )
+ aTypes.push_back(cppu::UnoType<presentation::XPresentationPage>::get());
+ if( bPresPage && ePageKind == PageKind::Standard )
+ aTypes.push_back(cppu::UnoType<XAnimationNodeSupplier>::get());
+
+ // Get types of base class.
+ // Join those types in a sequence.
+ return comphelper::concatSequences(
+ comphelper::containerToSequence(aTypes),
+ SdGenericDrawPage::getTypes() );
+ }
+
+ return maTypeSequence;
+}
+
+Sequence< sal_Int8 > SAL_CALL SdMasterPage::getImplementationId()
+{
+ return css::uno::Sequence<sal_Int8>();
+}
+
+// XServiceInfo
+OUString SAL_CALL SdMasterPage::getImplementationName()
+{
+ return "SdMasterPage";
+}
+
+Sequence< OUString > SAL_CALL SdMasterPage::getSupportedServiceNames()
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ std::vector<std::u16string_view> aAdd{ u"com.sun.star.drawing.MasterPage" };
+
+ if( SvxFmDrawPage::mpPage && static_cast<SdPage*>(SvxFmDrawPage::mpPage)->GetPageKind() == PageKind::Handout )
+ aAdd.emplace_back(u"com.sun.star.presentation.HandoutMasterPage");
+
+ return comphelper::concatSequences(SdGenericDrawPage::getSupportedServiceNames(), aAdd);
+}
+
+sal_Bool SAL_CALL SdMasterPage::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+// XElementAccess
+sal_Bool SAL_CALL SdMasterPage::hasElements()
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ if( SvxFmDrawPage::mpPage == nullptr )
+ return false;
+
+ return SvxFmDrawPage::mpPage->GetObjCount() > 0;
+}
+
+uno::Type SAL_CALL SdMasterPage::getElementType()
+{
+ return SdGenericDrawPage::getElementType();
+}
+
+// XIndexAccess
+sal_Int32 SAL_CALL SdMasterPage::getCount()
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ return SdGenericDrawPage::getCount();
+}
+
+Any SAL_CALL SdMasterPage::getByIndex( sal_Int32 Index )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ return SdGenericDrawPage::getByIndex(Index);
+}
+
+// intern
+void SdMasterPage::setBackground( const Any& rValue )
+{
+ // we need at least a beans::XPropertySet
+ Reference< beans::XPropertySet > xInputSet( rValue, UNO_QUERY );
+ if( !xInputSet.is() )
+ throw lang::IllegalArgumentException();
+
+ try
+ {
+ if( GetModel() && IsImpressDocument() )
+ {
+ Reference< container::XNameAccess > xFamilies( GetModel()->getStyleFamilies(), UNO_SET_THROW );
+ Reference< container::XNameAccess > xFamily( xFamilies->getByName( getName() ), UNO_QUERY_THROW ) ;
+
+ Reference< beans::XPropertySet > xStyleSet( xFamily->getByName( sUNO_PseudoSheet_Background ), UNO_QUERY_THROW );
+
+ Reference< beans::XPropertySetInfo > xSetInfo( xInputSet->getPropertySetInfo(), UNO_SET_THROW );
+ Reference< beans::XPropertyState > xSetStates( xInputSet, UNO_QUERY );
+
+ for( const auto pProp : ImplGetPageBackgroundPropertySet()->getPropertyMap().getPropertyEntries() )
+ {
+ const OUString& rPropName = pProp->aName;
+ if( xSetInfo->hasPropertyByName( rPropName ) )
+ {
+ if( !xSetStates.is() || xSetStates->getPropertyState( rPropName ) == beans::PropertyState_DIRECT_VALUE )
+ xStyleSet->setPropertyValue( rPropName, xInputSet->getPropertyValue( rPropName ) );
+ else
+ xSetStates->setPropertyToDefault( rPropName );
+ }
+ }
+ }
+ else
+ {
+ // first fill an item set
+ // is it our own implementation?
+ SdUnoPageBackground* pBack = comphelper::getFromUnoTunnel<SdUnoPageBackground>( xInputSet );
+
+ SfxItemSetFixed<XATTR_FILL_FIRST, XATTR_FILL_LAST> aSet( GetModel()->GetDoc()->GetPool() );
+
+ if( pBack )
+ {
+ pBack->fillItemSet( static_cast<SdDrawDocument*>(&GetPage()->getSdrModelFromSdrPage()), aSet );
+ }
+ else
+ {
+ rtl::Reference<SdUnoPageBackground> pBackground = new SdUnoPageBackground();
+
+ Reference< beans::XPropertySetInfo > xInputSetInfo( xInputSet->getPropertySetInfo(), UNO_SET_THROW );
+ Reference< beans::XPropertySetInfo > xDestSetInfo( pBackground->getPropertySetInfo(), UNO_SET_THROW );
+
+ const uno::Sequence< beans::Property> aProperties( xDestSetInfo->getProperties() );
+
+ for( const beans::Property& rProp : aProperties )
+ {
+ const OUString aPropName( rProp.Name );
+ if( xInputSetInfo->hasPropertyByName( aPropName ) )
+ pBackground->setPropertyValue( aPropName, xInputSet->getPropertyValue( aPropName ) );
+ }
+
+ pBackground->fillItemSet( static_cast<SdDrawDocument*>(&SvxFmDrawPage::mpPage->getSdrModelFromSdrPage()), aSet );
+ }
+
+ // if we find the background style, copy the set to the background
+ SdDrawDocument* pDoc = static_cast<SdDrawDocument*>(&SvxFmDrawPage::mpPage->getSdrModelFromSdrPage());
+ SfxStyleSheetBasePool* pSSPool = pDoc->GetStyleSheetPool();
+ if(pSSPool)
+ {
+ OUString aLayoutName( static_cast< SdPage* >( SvxFmDrawPage::mpPage )->GetLayoutName() );
+ aLayoutName = OUString::Concat(aLayoutName.subView(0, aLayoutName.indexOf(SD_LT_SEPARATOR)+4)) +
+ STR_LAYOUT_BACKGROUND;
+ SfxStyleSheetBase* pStyleSheet = pSSPool->Find( aLayoutName, SfxStyleFamily::Page );
+
+ if( pStyleSheet )
+ {
+ pStyleSheet->GetItemSet().Put( aSet );
+
+ // repaint only
+ SvxFmDrawPage::mpPage->ActionChanged();
+ return;
+ }
+ }
+
+ // if no background style is available, set at page directly. This
+ // is an error and should NOT happen (and will be asserted from the SdrPage)
+ GetPage()->getSdrPageProperties().PutItemSet(aSet);
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SdMasterPage::setBackground()");
+ }
+}
+
+void SdMasterPage::getBackground( Any& rValue )
+{
+ if( !GetModel() )
+ return;
+
+ try
+ {
+ if( IsImpressDocument() )
+ {
+ Reference< container::XNameAccess > xFamilies( GetModel()->getStyleFamilies(), UNO_SET_THROW );
+ Reference< container::XNameAccess > xFamily( xFamilies->getByName( getName() ), UNO_QUERY_THROW );
+
+ rValue <<= Reference< beans::XPropertySet >( xFamily->getByName( sUNO_PseudoSheet_Background ), UNO_QUERY_THROW );
+ }
+ else
+ {
+ SdDrawDocument* pDoc = static_cast<SdDrawDocument*>(&SvxFmDrawPage::mpPage->getSdrModelFromSdrPage());
+ SfxStyleSheetBasePool* pSSPool = pDoc->GetStyleSheetPool();
+ if(pSSPool)
+ {
+ OUString aLayoutName( static_cast< SdPage* >(SvxFmDrawPage::mpPage)->GetLayoutName() );
+ aLayoutName = OUString::Concat(aLayoutName.subView(0, aLayoutName.indexOf(SD_LT_SEPARATOR)+4)) +
+ STR_LAYOUT_BACKGROUND;
+ SfxStyleSheetBase* pStyleSheet = pSSPool->Find( aLayoutName, SfxStyleFamily::Page );
+
+ if( pStyleSheet )
+ {
+ SfxItemSet aStyleSet( pStyleSheet->GetItemSet());
+ if( aStyleSet.Count() )
+ {
+ rValue <<= Reference< beans::XPropertySet >( new SdUnoPageBackground( pDoc, &aStyleSet ) );
+ return;
+ }
+ }
+ }
+
+ // No style found, use fill attributes from page background. This
+ // should NOT happen and is an error
+ const SfxItemSet& rFallbackItemSet(SvxFmDrawPage::mpPage->getSdrPageProperties().GetItemSet());
+
+ if(drawing::FillStyle_NONE == rFallbackItemSet.Get(XATTR_FILLSTYLE).GetValue())
+ {
+ rValue <<= Reference< beans::XPropertySet >(
+ new SdUnoPageBackground(GetModel()->GetDoc(), &rFallbackItemSet));
+ }
+ else
+ {
+ rValue.clear();
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::SdMasterPage::getBackground()");
+ rValue.clear();
+ }
+}
+
+// XNamed
+void SAL_CALL SdMasterPage::setName( const OUString& rName )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ if(!(SvxFmDrawPage::mpPage && GetPage()->GetPageKind() != PageKind::Notes))
+ return;
+
+ SdDrawDocument* pDoc = GetModel()->GetDoc();
+ bool bOutDummy;
+
+ // Slide Name has to be unique
+ if( pDoc && pDoc->GetPageByName( rName, bOutDummy ) != SDRPAGE_NOTFOUND )
+ return; // throw Exception ?
+
+ GetPage()->SetName( rName );
+
+ if( pDoc )
+ pDoc->RenameLayoutTemplate( GetPage()->GetLayoutName(), rName );
+
+ // fake a mode change to repaint the page tab bar
+ ::sd::DrawDocShell* pDocSh = GetModel()->GetDocShell();
+ ::sd::ViewShell* pViewSh = pDocSh ? pDocSh->GetViewShell() : nullptr;
+ if( auto pDrawViewSh = dynamic_cast< ::sd::DrawViewShell* >(pViewSh) )
+ {
+ EditMode eMode = pDrawViewSh->GetEditMode();
+ if( eMode == EditMode::MasterPage )
+ {
+ bool bLayer = pDrawViewSh->IsLayerModeActive();
+
+ pDrawViewSh->ChangeEditMode( eMode, !bLayer );
+ pDrawViewSh->ChangeEditMode( eMode, bLayer );
+ }
+ }
+
+ GetModel()->SetModified();
+}
+
+OUString SAL_CALL SdMasterPage::getName( )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ if(SvxFmDrawPage::mpPage)
+ {
+ OUString aLayoutName( GetPage()->GetLayoutName() );
+ return aLayoutName.copy(0, aLayoutName.indexOf(SD_LT_SEPARATOR));
+ }
+
+ return OUString();
+}
+
+// XPresentationPage
+Reference< drawing::XDrawPage > SAL_CALL SdMasterPage::getNotesPage()
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ if(SvxFmDrawPage::mpPage && GetModel()->GetDoc() )
+ {
+ SdPage* pNotesPage = GetModel()->GetDoc()->GetMasterSdPage( (SvxFmDrawPage::mpPage->GetPageNum()-1)>>1, PageKind::Notes );
+ if( pNotesPage )
+ {
+ Reference< drawing::XDrawPage > xPage( pNotesPage->getUnoPage(), uno::UNO_QUERY );
+ return xPage;
+ }
+ }
+ return nullptr;
+}
+
+// XShapes
+void SAL_CALL SdMasterPage::add( const Reference< drawing::XShape >& xShape )
+{
+ SdGenericDrawPage::add( xShape );
+}
+
+void SAL_CALL SdMasterPage::remove( const Reference< drawing::XShape >& xShape )
+{
+ ::SolarMutexGuard aGuard;
+
+ throwIfDisposed();
+
+ SdrObject* pObj = SdrObject::getSdrObjectFromXShape( xShape );
+ if( pObj && GetPage()->IsPresObj( pObj ) )
+ GetPage()->RemovePresObj(pObj);
+
+ SdGenericDrawPage::remove( xShape );
+}
+
+Reference< uno::XInterface > createUnoPageImpl( SdPage* pPage )
+{
+ Reference< uno::XInterface > xPage;
+
+ if( pPage )
+ {
+ SdXImpressDocument* pModel = comphelper::getFromUnoTunnel<SdXImpressDocument>( pPage->getSdrModelFromSdrPage().getUnoModel() );
+ if( pModel )
+ {
+ if( pPage->IsMasterPage() )
+ {
+ xPage = static_cast<cppu::OWeakObject*>(new SdMasterPage( pModel, pPage ));
+ }
+ else
+ {
+ xPage = static_cast<cppu::OWeakObject*>(new SdDrawPage( pModel, pPage ));
+ }
+ }
+ }
+
+ return xPage;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unopback.cxx b/sd/source/ui/unoidl/unopback.cxx
new file mode 100644
index 000000000..508b1f866
--- /dev/null
+++ b/sd/source/ui/unoidl/unopback.cxx
@@ -0,0 +1,410 @@
+/* -*- 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 <com/sun/star/drawing/BitmapMode.hpp>
+#include <vcl/svapp.hxx>
+#include <svl/itemset.hxx>
+#include <svx/svdpool.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <svx/xflbstit.hxx>
+#include <svx/xflbmtit.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/unoshape.hxx>
+#include <svx/unoshprp.hxx>
+
+#include "unopback.hxx"
+#include <drawdoc.hxx>
+#include <unokywds.hxx>
+
+using namespace ::com::sun::star;
+
+const SvxItemPropertySet* ImplGetPageBackgroundPropertySet()
+{
+ static const SfxItemPropertyMapEntry aPageBackgroundPropertyMap_Impl[] =
+ {
+ FILL_PROPERTIES
+ { u"", 0, css::uno::Type(), 0, 0 }
+ };
+
+ static SvxItemPropertySet aPageBackgroundPropertySet_Impl( aPageBackgroundPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
+ return &aPageBackgroundPropertySet_Impl;
+}
+
+UNO3_GETIMPLEMENTATION_IMPL( SdUnoPageBackground );
+
+SdUnoPageBackground::SdUnoPageBackground(
+ SdDrawDocument* pDoc /* = NULL */,
+ const SfxItemSet* pSet /* = NULL */)
+: mpPropSet(ImplGetPageBackgroundPropertySet()),
+ mpDoc(pDoc)
+{
+ if( pDoc )
+ {
+ StartListening( *pDoc );
+ mpSet = std::make_unique<SfxItemSetFixed<XATTR_FILL_FIRST, XATTR_FILL_LAST>>( pDoc->GetPool() );
+
+ if( pSet )
+ mpSet->Put(*pSet);
+ }
+}
+
+SdUnoPageBackground::~SdUnoPageBackground() noexcept
+{
+ SolarMutexGuard g;
+
+ if( mpDoc )
+ EndListening( *mpDoc );
+}
+
+void SdUnoPageBackground::Notify( SfxBroadcaster&, const SfxHint& rHint )
+{
+ if (rHint.GetId() != SfxHintId::ThisIsAnSdrHint)
+ return;
+ const SdrHint* pSdrHint = static_cast<const SdrHint*>( &rHint );
+
+ // delete item set if document is dying because then the pool
+ // will also die
+ if( pSdrHint->GetKind() == SdrHintKind::ModelCleared )
+ {
+ mpSet.reset();
+ mpDoc = nullptr;
+ }
+}
+
+void SdUnoPageBackground::fillItemSet( SdDrawDocument* pDoc, SfxItemSet& rSet )
+{
+ rSet.ClearItem();
+
+ if( mpSet == nullptr )
+ {
+ StartListening( *pDoc );
+ mpDoc = pDoc;
+
+ mpSet = std::make_unique<SfxItemSetFixed<XATTR_FILL_FIRST, XATTR_FILL_LAST>>( *rSet.GetPool() );
+
+ if( maUsrAnys.AreThereOwnUsrAnys() )
+ {
+ for( const auto pProp : mpPropSet->getPropertyMap().getPropertyEntries() )
+ {
+ uno::Any* pAny = maUsrAnys.GetUsrAnyForID( *pProp );
+ if( pAny )
+ {
+ const OUString & aPropertyName = pProp->aName;
+ switch( pProp->nWID )
+ {
+ case XATTR_FILLFLOATTRANSPARENCE :
+ case XATTR_FILLGRADIENT :
+ {
+ if ( ( pAny->getValueType() == ::cppu::UnoType< css::awt::Gradient>::get() )
+ && ( pProp->nMemberId == MID_FILLGRADIENT ) )
+ {
+ setPropertyValue( aPropertyName, *pAny );
+ }
+ else if ( ( pAny->getValueType() == ::cppu::UnoType<OUString>::get() ) &&
+ ( pProp->nMemberId == MID_NAME ) )
+ {
+ setPropertyValue( aPropertyName, *pAny );
+ }
+ }
+ break;
+ case XATTR_FILLHATCH :
+ {
+ if ( ( pAny->getValueType() == ::cppu::UnoType< css::drawing::Hatch>::get() )
+ && ( pProp->nMemberId == MID_FILLHATCH ) )
+ {
+ setPropertyValue( aPropertyName, *pAny );
+ }
+ else if ( ( pAny->getValueType() == ::cppu::UnoType<OUString>::get() ) &&
+ ( pProp->nMemberId == MID_NAME ) )
+ {
+ setPropertyValue( aPropertyName, *pAny );
+ }
+ }
+ break;
+ case XATTR_FILLBITMAP :
+ {
+ if (pProp->nMemberId == MID_BITMAP &&
+ (pAny->getValueType() == cppu::UnoType<css::awt::XBitmap>::get() ||
+ pAny->getValueType() == cppu::UnoType<css::graphic::XGraphic>::get()))
+ {
+ setPropertyValue( aPropertyName, *pAny );
+ }
+ else if (pAny->getValueType() == ::cppu::UnoType<OUString>::get() && pProp->nMemberId == MID_NAME)
+ {
+ setPropertyValue( aPropertyName, *pAny );
+ }
+ }
+ break;
+
+ default:
+ setPropertyValue( aPropertyName, *pAny );
+ }
+ }
+ }
+ }
+ }
+
+ rSet.Put( *mpSet );
+}
+
+// XServiceInfo
+OUString SAL_CALL SdUnoPageBackground::getImplementationName()
+{
+ return "SdUnoPageBackground";
+}
+
+sal_Bool SAL_CALL SdUnoPageBackground::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+uno::Sequence< OUString > SAL_CALL SdUnoPageBackground::getSupportedServiceNames()
+{
+ return { sUNO_Service_PageBackground, sUNO_Service_FillProperties };
+}
+
+// XPropertySet
+uno::Reference< beans::XPropertySetInfo > SAL_CALL SdUnoPageBackground::getPropertySetInfo()
+{
+ return mpPropSet->getPropertySetInfo();
+}
+
+void SAL_CALL SdUnoPageBackground::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
+{
+ SolarMutexGuard aGuard;
+
+ const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry( aPropertyName );
+
+ if( pEntry == nullptr )
+ {
+ throw beans::UnknownPropertyException( aPropertyName, static_cast<cppu::OWeakObject*>(this));
+ }
+
+ if( mpSet )
+ {
+ if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
+ {
+ drawing::BitmapMode eMode;
+ if( aValue >>= eMode )
+ {
+ mpSet->Put( XFillBmpStretchItem( eMode == drawing::BitmapMode_STRETCH ) );
+ mpSet->Put( XFillBmpTileItem( eMode == drawing::BitmapMode_REPEAT ) );
+ return;
+ }
+ throw lang::IllegalArgumentException();
+ }
+
+ SfxItemPool& rPool = *mpSet->GetPool();
+ SfxItemSet aSet( rPool, pEntry->nWID, pEntry->nWID);
+ aSet.Put( *mpSet );
+
+ if( !aSet.Count() )
+ aSet.Put( rPool.GetDefaultItem( pEntry->nWID ) );
+
+ if( pEntry->nMemberId == MID_NAME && ( pEntry->nWID == XATTR_FILLBITMAP || pEntry->nWID == XATTR_FILLGRADIENT || pEntry->nWID == XATTR_FILLHATCH || pEntry->nWID == XATTR_FILLFLOATTRANSPARENCE ) )
+ {
+ OUString aName;
+ if(!(aValue >>= aName ))
+ throw lang::IllegalArgumentException();
+
+ SvxShape::SetFillAttribute( pEntry->nWID, aName, aSet );
+ }
+ else
+ {
+ SvxItemPropertySet_setPropertyValue( pEntry, aValue, aSet );
+ }
+
+ mpSet->Put( aSet );
+ }
+ else
+ {
+ if(pEntry->nWID)
+ SvxItemPropertySet::setPropertyValue( pEntry, aValue, maUsrAnys );
+ }
+}
+
+uno::Any SAL_CALL SdUnoPageBackground::getPropertyValue( const OUString& PropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ uno::Any aAny;
+ const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry(PropertyName);
+
+ if( pEntry == nullptr )
+ {
+ throw beans::UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this));
+ }
+
+ if( mpSet )
+ {
+ if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
+ {
+ const XFillBmpStretchItem* pStretchItem = mpSet->GetItem<XFillBmpStretchItem>(XATTR_FILLBMP_STRETCH);
+ const XFillBmpTileItem* pTileItem = mpSet->GetItem<XFillBmpTileItem>(XATTR_FILLBMP_TILE);
+
+ if( pStretchItem && pTileItem )
+ {
+ if( pTileItem->GetValue() )
+ aAny <<= drawing::BitmapMode_REPEAT;
+ else if( pStretchItem->GetValue() )
+ aAny <<= drawing::BitmapMode_STRETCH;
+ else
+ aAny <<= drawing::BitmapMode_NO_REPEAT;
+ }
+ }
+ else
+ {
+ SfxItemPool& rPool = *mpSet->GetPool();
+ SfxItemSet aSet( rPool, pEntry->nWID, pEntry->nWID);
+ aSet.Put( *mpSet );
+
+ if( !aSet.Count() )
+ aSet.Put( rPool.GetDefaultItem( pEntry->nWID ) );
+
+ // get value from ItemSet
+ aAny = SvxItemPropertySet_getPropertyValue( pEntry, aSet );
+ }
+ }
+ else
+ {
+ if(pEntry->nWID)
+ aAny = mpPropSet->getPropertyValue( pEntry, maUsrAnys );
+ }
+ return aAny;
+}
+
+void SAL_CALL SdUnoPageBackground::addPropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) {}
+void SAL_CALL SdUnoPageBackground::removePropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) {}
+void SAL_CALL SdUnoPageBackground::addVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) {}
+void SAL_CALL SdUnoPageBackground::removeVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) {}
+
+// XPropertyState
+beans::PropertyState SAL_CALL SdUnoPageBackground::getPropertyState( const OUString& PropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry(PropertyName);
+
+ if( pEntry == nullptr )
+ throw beans::UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this));
+
+ if( mpSet )
+ {
+ if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
+ {
+ if( mpSet->GetItemState( XATTR_FILLBMP_STRETCH, false ) == SfxItemState::SET ||
+ mpSet->GetItemState( XATTR_FILLBMP_TILE, false ) == SfxItemState::SET )
+ {
+ return beans::PropertyState_DIRECT_VALUE;
+ }
+ else
+ {
+ return beans::PropertyState_AMBIGUOUS_VALUE;
+ }
+ }
+
+ switch( mpSet->GetItemState( pEntry->nWID, false ) )
+ {
+ case SfxItemState::SET:
+ return beans::PropertyState_DIRECT_VALUE;
+ case SfxItemState::DEFAULT:
+ return beans::PropertyState_DEFAULT_VALUE;
+ default:
+// case SfxItemState::DONTCARE:
+// case SfxItemState::DISABLED:
+ return beans::PropertyState_AMBIGUOUS_VALUE;
+ }
+ }
+ else
+ {
+ if( nullptr == maUsrAnys.GetUsrAnyForID(*pEntry) )
+ return beans::PropertyState_DEFAULT_VALUE;
+ else
+ return beans::PropertyState_DIRECT_VALUE;
+ }
+}
+
+uno::Sequence< beans::PropertyState > SAL_CALL SdUnoPageBackground::getPropertyStates( const uno::Sequence< OUString >& aPropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ sal_Int32 nCount = aPropertyName.getLength();
+
+ uno::Sequence< beans::PropertyState > aPropertyStateSequence( nCount );
+
+ std::transform(aPropertyName.begin(), aPropertyName.end(), aPropertyStateSequence.getArray(),
+ [this](const OUString& rName) -> beans::PropertyState { return getPropertyState(rName); });
+
+ return aPropertyStateSequence;
+}
+
+void SAL_CALL SdUnoPageBackground::setPropertyToDefault( const OUString& PropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry(PropertyName);
+
+ if( pEntry == nullptr )
+ throw beans::UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this));
+
+ if( mpSet )
+ {
+ if( pEntry->nWID == OWN_ATTR_FILLBMP_MODE )
+ {
+ mpSet->ClearItem( XATTR_FILLBMP_STRETCH );
+ mpSet->ClearItem( XATTR_FILLBMP_TILE );
+ }
+ else
+ {
+ mpSet->ClearItem( pEntry->nWID );
+ }
+ }
+}
+
+uno::Any SAL_CALL SdUnoPageBackground::getPropertyDefault( const OUString& aPropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ const SfxItemPropertyMapEntry* pEntry = getPropertyMapEntry(aPropertyName);
+ if( pEntry == nullptr || mpSet == nullptr )
+ throw beans::UnknownPropertyException( aPropertyName, static_cast<cppu::OWeakObject*>(this));
+
+ uno::Any aAny;
+ if (pEntry->nWID == OWN_ATTR_FILLBMP_MODE)
+ {
+ aAny <<= drawing::BitmapMode_REPEAT;
+ }
+ else
+ {
+ SfxItemPool& rPool = *mpSet->GetPool();
+ SfxItemSet aSet(rPool, pEntry->nWID, pEntry->nWID);
+ aSet.Put(rPool.GetDefaultItem(pEntry->nWID));
+
+ aAny = SvxItemPropertySet_getPropertyValue(pEntry, aSet);
+ }
+ return aAny;
+}
+
+/** this is used because our property map is not sorted yet */
+const SfxItemPropertyMapEntry* SdUnoPageBackground::getPropertyMapEntry( std::u16string_view rPropertyName ) const noexcept
+{
+ return mpPropSet->getPropertyMap().getByName(rPropertyName);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unopback.hxx b/sd/source/ui/unoidl/unopback.hxx
new file mode 100644
index 000000000..c70cc2fea
--- /dev/null
+++ b/sd/source/ui/unoidl/unopback.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/.
+ *
+ * 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 .
+ */
+#pragma once
+
+#include <sal/config.h>
+
+#include <memory>
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/beans/XPropertyState.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+
+#include <svl/lstner.hxx>
+#include <comphelper/servicehelper.hxx>
+
+#include <cppuhelper/implbase.hxx>
+#include <editeng/unoipset.hxx>
+
+class SdDrawDocument;
+class SdrModel;
+class SfxItemSet;
+class SvxItemPropertySet;
+struct SfxItemPropertyMapEntry;
+
+const SvxItemPropertySet* ImplGetPageBackgroundPropertySet();
+
+class SdUnoPageBackground final : public ::cppu::WeakImplHelper<
+ css::beans::XPropertySet,
+ css::lang::XServiceInfo,
+ css::beans::XPropertyState,
+ css::lang::XUnoTunnel>,
+ public SfxListener
+{
+ const SvxItemPropertySet* mpPropSet;
+ SvxItemPropertySetUsrAnys maUsrAnys;
+ std::unique_ptr<SfxItemSet> mpSet;
+ SdrModel* mpDoc;
+
+ const SfxItemPropertyMapEntry* getPropertyMapEntry( std::u16string_view rPropertyName ) const noexcept;
+public:
+ SdUnoPageBackground( SdDrawDocument* pDoc = nullptr, const SfxItemSet* pSet = nullptr);
+ virtual ~SdUnoPageBackground() noexcept override;
+
+ // internal
+ void fillItemSet( SdDrawDocument* pDoc, SfxItemSet& rSet );
+ virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
+
+ // uno helper
+ UNO3_GETIMPLEMENTATION_DECL( SdUnoPageBackground )
+
+ // 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;
+
+ // XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue ) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override;
+ virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override;
+ virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override;
+ virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+ virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
+
+ // XPropertyState
+ virtual css::beans::PropertyState SAL_CALL getPropertyState( const OUString& PropertyName ) override;
+ virtual css::uno::Sequence< css::beans::PropertyState > SAL_CALL getPropertyStates( const css::uno::Sequence< OUString >& aPropertyName ) override;
+ virtual void SAL_CALL setPropertyToDefault( const OUString& PropertyName ) override;
+ virtual css::uno::Any SAL_CALL getPropertyDefault( const OUString& aPropertyName ) override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unopool.cxx b/sd/source/ui/unoidl/unopool.cxx
new file mode 100644
index 000000000..7345dc45d
--- /dev/null
+++ b/sd/source/ui/unoidl/unopool.cxx
@@ -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/.
+ *
+ * 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 <i18nlangtag/languagetag.hxx>
+#include <comphelper/propertysetinfo.hxx>
+#include <editeng/eeitem.hxx>
+#include <svx/unopool.hxx>
+
+#include <drawdoc.hxx>
+#include "unopool.hxx"
+
+using namespace ::com::sun::star;
+using namespace ::cppu;
+using namespace ::comphelper;
+
+static LanguageType SdUnoGetLanguage( const lang::Locale& rLocale )
+{
+ // empty language -> LANGUAGE_SYSTEM
+ if ( rLocale.Language.getLength() == 0 )
+ return LANGUAGE_SYSTEM;
+
+ LanguageType eRet = LanguageTag::convertToLanguageType( rLocale, false);
+ if ( eRet == LANGUAGE_NONE )
+ eRet = LANGUAGE_SYSTEM; //! or throw an exception?
+
+ return eRet;
+}
+
+namespace {
+
+class SdUnoDrawPool : public SvxUnoDrawPool
+{
+public:
+ explicit SdUnoDrawPool(SdDrawDocument* pModel);
+
+protected:
+ virtual void putAny( SfxItemPool* pPool, const PropertyMapEntry* pEntry, const uno::Any& rValue ) override;
+
+private:
+ SdDrawDocument* mpDrawModel;
+};
+
+}
+
+SdUnoDrawPool::SdUnoDrawPool(SdDrawDocument* pModel)
+: SvxUnoDrawPool( pModel ), mpDrawModel( pModel )
+{
+}
+
+void SdUnoDrawPool::putAny( SfxItemPool* pPool, const comphelper::PropertyMapEntry* pEntry, const uno::Any& rValue )
+{
+ switch( pEntry->mnHandle )
+ {
+ case EE_CHAR_LANGUAGE:
+ case EE_CHAR_LANGUAGE_CJK:
+ case EE_CHAR_LANGUAGE_CTL:
+ {
+ lang::Locale aLocale;
+ if( rValue >>= aLocale )
+ mpDrawModel->SetLanguage(
+ SdUnoGetLanguage( aLocale ),
+ static_cast<sal_uInt16>(pEntry->mnHandle) );
+ }
+ }
+ SvxUnoDrawPool::putAny( pPool, pEntry, rValue );
+}
+
+uno::Reference< uno::XInterface > SdUnoCreatePool( SdDrawDocument* pDrawModel )
+{
+ return static_cast<uno::XAggregation*>(new SdUnoDrawPool( pDrawModel ));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unopool.hxx b/sd/source/ui/unoidl/unopool.hxx
new file mode 100644
index 000000000..4188e80a9
--- /dev/null
+++ b/sd/source/ui/unoidl/unopool.hxx
@@ -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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <drawdoc.hxx>
+
+css::uno::Reference<css::uno::XInterface> SdUnoCreatePool(SdDrawDocument* pDrawModel);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unosrch.cxx b/sd/source/ui/unoidl/unosrch.cxx
new file mode 100644
index 000000000..f1005819d
--- /dev/null
+++ b/sd/source/ui/unoidl/unosrch.cxx
@@ -0,0 +1,778 @@
+/* -*- 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 <memory>
+#include <sal/config.h>
+
+#include <com/sun/star/drawing/XShapes.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <vcl/svapp.hxx>
+
+#include <svx/svdobj.hxx>
+#include <svx/svdpool.hxx>
+#include <editeng/unoipset.hxx>
+#include <editeng/unotext.hxx>
+#include <tools/debug.hxx>
+
+#include <unoprnms.hxx>
+#include <unosrch.hxx>
+
+using namespace ::com::sun::star;
+
+#define WID_SEARCH_BACKWARDS 0
+#define WID_SEARCH_CASE 1
+#define WID_SEARCH_WORDS 2
+
+static const SfxItemPropertyMapEntry* ImplGetSearchPropertyMap()
+{
+ static const SfxItemPropertyMapEntry aSearchPropertyMap_Impl[] =
+ {
+ { u"" UNO_NAME_SEARCH_BACKWARDS, WID_SEARCH_BACKWARDS, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"" UNO_NAME_SEARCH_CASE, WID_SEARCH_CASE, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"" UNO_NAME_SEARCH_WORDS, WID_SEARCH_WORDS, cppu::UnoType<bool>::get(), 0, 0 },
+ { u"", 0, css::uno::Type(), 0, 0 }
+ };
+
+ return aSearchPropertyMap_Impl;
+}
+
+namespace {
+
+class SearchContext_impl
+{
+ uno::Reference< drawing::XShapes > mxShapes;
+ sal_Int32 mnIndex;
+
+public:
+ SearchContext_impl(uno::Reference<drawing::XShapes> const& xShapes)
+ : mxShapes( xShapes ), mnIndex( -1 ) {}
+
+ uno::Reference< drawing::XShape > firstShape()
+ {
+ mnIndex = -1;
+ return nextShape();
+ }
+
+ uno::Reference< drawing::XShape > nextShape()
+ {
+ uno::Reference< drawing::XShape > xShape;
+ mnIndex++;
+ if( mxShapes.is() && mxShapes->getCount() > mnIndex )
+ {
+ mxShapes->getByIndex( mnIndex ) >>= xShape;
+ }
+ return xShape;
+ }
+};
+
+}
+
+/* ================================================================= */
+/** this class implements a search or replace operation on a given
+ page or a given sdrobj
+ */
+
+SdUnoSearchReplaceShape::SdUnoSearchReplaceShape( drawing::XDrawPage* pPage ) noexcept
+ : mpPage(pPage)
+{
+}
+
+SdUnoSearchReplaceShape::~SdUnoSearchReplaceShape() noexcept
+{
+}
+
+// util::XReplaceable
+uno::Reference< util::XReplaceDescriptor > SAL_CALL SdUnoSearchReplaceShape::createReplaceDescriptor()
+{
+ return new SdUnoSearchReplaceDescriptor;
+}
+
+sal_Int32 SAL_CALL SdUnoSearchReplaceShape::replaceAll( const uno::Reference< util::XSearchDescriptor >& xDesc )
+{
+ SdUnoSearchReplaceDescriptor* pDescr = comphelper::getFromUnoTunnel<SdUnoSearchReplaceDescriptor>( xDesc );
+ if( pDescr == nullptr )
+ return 0;
+
+ sal_Int32 nFound = 0;
+
+ uno::Reference< drawing::XShapes > xShapes;
+ uno::Reference< drawing::XShape > xShape;
+
+ std::vector<SearchContext_impl> aContexts;
+ if(mpPage)
+ {
+ xShapes = mpPage;
+
+ if( xShapes->getCount() )
+ {
+ aContexts.push_back(SearchContext_impl(xShapes));
+ xShape = aContexts.back().firstShape();
+ }
+ else
+ {
+ xShapes = nullptr;
+ }
+ }
+
+ while( xShape.is() )
+ {
+ // replace in xShape
+ uno::Reference< text::XText > xText(xShape, uno::UNO_QUERY);
+ uno::Reference< text::XTextRange > xRange = xText;
+ uno::Reference< text::XTextRange > xFound;
+
+ while( xRange.is() )
+ {
+ xFound = Search( xRange, pDescr );
+ if( !xFound.is() )
+ break;
+
+ xFound->setString( pDescr->getReplaceString() );
+ xRange = xFound->getEnd();
+ nFound++;
+ }
+ // done with xShape -> get next shape
+
+ // test if it's a group
+ uno::Reference< drawing::XShapes > xGroupShape( xShape, uno::UNO_QUERY );
+ if( xGroupShape.is() && ( xGroupShape->getCount() > 0 ) )
+ {
+ aContexts.push_back(SearchContext_impl(xGroupShape));
+ xShape = aContexts.back().firstShape();
+ }
+ else
+ {
+ if (!aContexts.empty())
+ xShape = aContexts.back().nextShape();
+ else
+ xShape = nullptr;
+ }
+
+ // test parent contexts for next shape if none
+ // is found in the current context
+ while (!aContexts.empty() && !xShape.is())
+ {
+ aContexts.pop_back();
+ if (!aContexts.empty())
+ xShape = aContexts.back().nextShape();
+ }
+ }
+
+ return nFound;
+}
+
+// XSearchable
+uno::Reference< css::util::XSearchDescriptor > SAL_CALL SdUnoSearchReplaceShape::createSearchDescriptor( )
+{
+ return new SdUnoSearchReplaceDescriptor;
+}
+
+uno::Reference< css::container::XIndexAccess > SAL_CALL SdUnoSearchReplaceShape::findAll( const css::uno::Reference< css::util::XSearchDescriptor >& xDesc )
+{
+ SdUnoSearchReplaceDescriptor* pDescr = comphelper::getFromUnoTunnel<SdUnoSearchReplaceDescriptor>( xDesc );
+ if( pDescr == nullptr )
+ return uno::Reference< container::XIndexAccess > ();
+
+ sal_Int32 nSequence = 32;
+ sal_Int32 nFound = 0;
+
+ uno::Sequence < uno::Reference< uno::XInterface > > aSeq( nSequence );
+
+ uno::Reference< uno::XInterface > * pArray = aSeq.getArray();
+
+ uno::Reference< drawing::XShapes > xShapes;
+ uno::Reference< drawing::XShape > xShape;
+
+ std::vector<SearchContext_impl> aContexts;
+ if(mpPage)
+ {
+ xShapes = mpPage;
+
+ if( xShapes->getCount() > 0 )
+ {
+ aContexts.push_back(SearchContext_impl(xShapes));
+ xShape = aContexts.back().firstShape();
+ }
+ else
+ {
+ xShapes = nullptr;
+ }
+ }
+
+ while( xShape.is() )
+ {
+ // find in xShape
+ uno::Reference< text::XText > xText(xShape, uno::UNO_QUERY);
+ uno::Reference< text::XTextRange > xRange = xText;
+ uno::Reference< text::XTextRange > xFound;
+
+ while( xRange.is() )
+ {
+ xFound = Search( xRange, pDescr );
+ if( !xFound.is() )
+ break;
+
+ if( nFound >= nSequence )
+ {
+ nSequence += 32;
+ aSeq.realloc( nSequence );
+ pArray = aSeq.getArray();
+ }
+
+ pArray[nFound++] = xFound;
+
+ xRange = xFound->getEnd();
+ }
+ // done with shape -> get next shape
+
+ // test if it's a group
+ uno::Reference< drawing::XShapes > xGroupShape;
+ xGroupShape.set( xShape, uno::UNO_QUERY );
+
+ if( xGroupShape.is() && xGroupShape->getCount() > 0 )
+ {
+ aContexts.push_back(SearchContext_impl(xGroupShape));
+ xShape = aContexts.back().firstShape();
+ }
+ else
+ {
+ if (!aContexts.empty())
+ xShape = aContexts.back().nextShape();
+ else
+ xShape = nullptr;
+ }
+
+ // test parent contexts for next shape if none
+ // is found in the current context
+ while (!aContexts.empty() && !xShape.is())
+ {
+ aContexts.pop_back();
+ if (!aContexts.empty())
+ xShape = aContexts.back().nextShape();
+ }
+ }
+
+ if( nFound != nSequence )
+ aSeq.realloc( nFound );
+
+ uno::Reference<css::container::XIndexAccess> xRet(new SdUnoFindAllAccess(aSeq));
+ return xRet;
+}
+
+uno::Reference< css::uno::XInterface > SAL_CALL SdUnoSearchReplaceShape::findFirst( const css::uno::Reference< css::util::XSearchDescriptor >& xDesc )
+{
+ uno::Reference< text::XTextRange > xRange( GetCurrentShape(), uno::UNO_QUERY );
+ if( xRange.is() )
+ return findNext( xRange, xDesc );
+
+ return uno::Reference< uno::XInterface > ();
+}
+
+uno::Reference< drawing::XShape > SdUnoSearchReplaceShape::GetCurrentShape() const noexcept
+{
+ uno::Reference< drawing::XShape > xShape;
+
+ if( mpPage && mpPage->getCount() > 0)
+ mpPage->getByIndex(0) >>= xShape;
+
+ return xShape;
+
+}
+
+uno::Reference< css::uno::XInterface > SAL_CALL SdUnoSearchReplaceShape::findNext( const css::uno::Reference< css::uno::XInterface >& xStartAt, const css::uno::Reference< css::util::XSearchDescriptor >& xDesc )
+{
+ SdUnoSearchReplaceDescriptor* pDescr = comphelper::getFromUnoTunnel<SdUnoSearchReplaceDescriptor>( xDesc );
+
+ uno::Reference< uno::XInterface > xFound;
+
+ uno::Reference< text::XTextRange > xRange( xStartAt, uno::UNO_QUERY );
+ if(pDescr && xRange.is() )
+ {
+
+ uno::Reference< text::XTextRange > xCurrentRange( xStartAt, uno::UNO_QUERY );
+
+ uno::Reference< drawing::XShape > xCurrentShape( GetShape( xCurrentRange ) );
+
+ while(!xFound.is() && xRange.is())
+ {
+ xFound = Search( xRange, pDescr );
+ if(!xFound.is())
+ {
+ // we need a new starting range now
+ xRange = nullptr;
+
+ if(mpPage)
+ {
+ // we do a page wide search, so skip to the next shape here
+ // get next shape on our page
+ uno::Reference< drawing::XShape > xFound2( GetNextShape( mpPage, xCurrentShape ) );
+ if( xFound2.is() && (xFound2.get() != xCurrentShape.get()) )
+ xCurrentShape = xFound2;
+ else
+ xCurrentShape = nullptr;
+
+ xRange.set( xCurrentShape, uno::UNO_QUERY );
+ if(!(xCurrentShape.is() && (xRange.is())))
+ xRange = nullptr;
+ }
+ else
+ {
+ // we search only in this shape, so end search if we have
+ // not found anything
+ }
+ }
+ }
+ }
+ return xFound;
+}
+
+/** this method returns the shape that follows xCurrentShape in the shape collection xShapes.
+ It steps recursive into groupshapes and returns the xCurrentShape if it is the last
+ shape in this collection */
+uno::Reference< drawing::XShape > SdUnoSearchReplaceShape::GetNextShape( const uno::Reference< container::XIndexAccess >& xShapes, const uno::Reference< drawing::XShape >& xCurrentShape ) noexcept
+{
+ uno::Reference< drawing::XShape > xFound;
+
+ if(xShapes.is() && xCurrentShape.is())
+ {
+ const sal_Int32 nCount = xShapes->getCount();
+ for( sal_Int32 i = 0; i < nCount; i++ )
+ {
+ uno::Reference< drawing::XShape > xSearchShape;
+ xShapes->getByIndex(i) >>= xSearchShape;
+
+ if( xSearchShape.is() )
+ {
+ uno::Reference< container::XIndexAccess > xGroup( xSearchShape, uno::UNO_QUERY );
+
+ if( xCurrentShape.get() == xSearchShape.get() )
+ {
+ if( xGroup.is() && xGroup->getCount() > 0 )
+ {
+ xGroup->getByIndex( 0 ) >>= xFound;
+ }
+ else
+ {
+ i++;
+ if( i < nCount )
+ xShapes->getByIndex( i ) >>= xFound;
+ else
+ xFound = xCurrentShape;
+ }
+
+ break;
+ }
+ else if( xGroup.is() )
+ {
+ xFound = GetNextShape( xGroup, xCurrentShape );
+ if( xFound.is() )
+ {
+ if( xFound.get() == xCurrentShape.get() )
+ {
+ // the current shape was found at the end of the group
+ i++;
+ if( i < nCount )
+ {
+ xShapes->getByIndex(i) >>= xFound;
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return xFound;
+}
+
+uno::Reference< text::XTextRange > SdUnoSearchReplaceShape::Search( const uno::Reference< text::XTextRange >& xText, SdUnoSearchReplaceDescriptor* pDescr )
+{
+ if(!xText.is())
+ return uno::Reference< text::XTextRange > ();
+
+ uno::Reference< text::XText > xParent( xText->getText() );
+
+ if( !xParent.is() )
+ {
+ xParent.set( xText, uno::UNO_QUERY );
+ }
+
+ const OUString aText( xParent->getString() );
+
+ const sal_Int32 nTextLen = aText.getLength();
+
+ std::unique_ptr<sal_Int32[]> pConvertPos( new sal_Int32[nTextLen+2] );
+ std::unique_ptr<sal_Int32[]> pConvertPara( new sal_Int32[nTextLen+2] );
+
+ sal_Int32* pPos = pConvertPos.get();
+ sal_Int32* pPara = pConvertPara.get();
+
+ sal_Int32 nLastPos = 0, nLastPara = 0;
+
+ uno::Reference< container::XEnumerationAccess > xEnumAccess( xParent, uno::UNO_QUERY );
+
+ // first we fill the arrays with the position and paragraph for every character
+ // inside the text
+ if( xEnumAccess.is() )
+ {
+ uno::Reference< container::XEnumeration > xParaEnum( xEnumAccess->createEnumeration() );
+
+ while(xParaEnum->hasMoreElements())
+ {
+ int ndbg = 0;
+ uno::Reference< text::XTextContent > xParagraph( xParaEnum->nextElement(), uno::UNO_QUERY );
+ if( xParagraph.is() )
+ xEnumAccess.set(xParagraph, css::uno::UNO_QUERY);
+ else
+ xEnumAccess.clear();
+
+ if( xEnumAccess.is() )
+ {
+ uno::Reference< container::XEnumeration > xPortionEnum( xEnumAccess->createEnumeration() );
+ if( xPortionEnum.is() )
+ {
+ while(xPortionEnum->hasMoreElements())
+ {
+ uno::Reference< text::XTextRange > xPortion( xPortionEnum->nextElement(), uno::UNO_QUERY );
+ if( xPortion.is() )
+ {
+ const OUString aPortion( xPortion->getString() );
+ const sal_Int32 nLen = aPortion.getLength();
+
+ ESelection aStartSel( GetSelection( xPortion->getStart() ) );
+ ESelection aEndSel( GetSelection( xPortion->getEnd() ) );
+
+ // special case for empty portions with content or length one portions with content (fields)
+ if( (aStartSel.nStartPos == aEndSel.nStartPos) || ( (aStartSel.nStartPos == (aEndSel.nStartPos - 1)) && (nLen > 1) ) )
+ {
+ for( sal_Int32 i = 0; i < nLen; i++ )
+ {
+ if( ndbg < (nTextLen+2) )
+ {
+ *pPos++ = aStartSel.nStartPos;
+ *pPara++ = aStartSel.nStartPara;
+
+ ndbg += 1;
+ }
+ else
+ {
+ OSL_FAIL( "array overflow while searching" );
+ }
+ }
+
+ nLastPos = aStartSel.nStartPos;
+ }
+ // normal case
+ else
+ {
+ for( sal_Int32 i = 0; i < nLen; i++ )
+ {
+ if( ndbg < (nTextLen+2) )
+ {
+ *pPos++ = aStartSel.nStartPos++;
+ *pPara++ = aStartSel.nStartPara;
+
+ ndbg += 1;
+ }
+ else
+ {
+ OSL_FAIL( "array overflow while searching" );
+ }
+ }
+
+ nLastPos = aStartSel.nStartPos - 1;
+ DBG_ASSERT( aEndSel.nStartPos == aStartSel.nStartPos, "Search is not working" );
+ }
+ nLastPara = aStartSel.nStartPara;
+ }
+ }
+ }
+ }
+
+ if( ndbg < (nTextLen+2) )
+ {
+ *pPos++ = nLastPos + 1;
+ *pPara++ = nLastPara;
+ }
+ else
+ {
+ OSL_FAIL( "array overflow while searching" );
+ }
+ }
+ }
+
+ uno::Reference< text::XTextRange > xFound;
+ ESelection aSel;
+
+ if( xText.is() )
+ aSel = GetSelection( xText );
+
+ sal_Int32 nStartPos;
+ sal_Int32 nEndPos = 0;
+ for( nStartPos = 0; nStartPos < nTextLen; nStartPos++ )
+ {
+ if( pConvertPara[nStartPos] == aSel.nStartPara && pConvertPos[nStartPos] == aSel.nStartPos )
+ break;
+ }
+
+ if( Search( aText, nStartPos, nEndPos, pDescr ) )
+ {
+ if( nStartPos <= nTextLen && nEndPos <= nTextLen )
+ {
+ ESelection aSelection( pConvertPara[nStartPos], pConvertPos[nStartPos],
+ pConvertPara[nEndPos], pConvertPos[nEndPos] );
+
+ SvxUnoTextBase* pParent = comphelper::getFromUnoTunnel<SvxUnoTextBase>( xParent );
+
+ if(pParent)
+ {
+ rtl::Reference<SvxUnoTextRange> pRange = new SvxUnoTextRange( *pParent );
+ xFound = pRange;
+ pRange->SetSelection(aSelection);
+ }
+ }
+ else
+ {
+ OSL_FAIL("Array overflow while searching!");
+ }
+ }
+
+ return xFound;
+}
+
+bool SdUnoSearchReplaceShape::Search( const OUString& rText, sal_Int32& nStartPos, sal_Int32& nEndPos, SdUnoSearchReplaceDescriptor* pDescr ) noexcept
+{
+ OUString aSearchStr( pDescr->getSearchString() );
+ OUString aText( rText );
+
+ if( !pDescr->IsCaseSensitive() )
+ {
+ aText = aText.toAsciiLowerCase();
+ aSearchStr = aSearchStr.toAsciiLowerCase();
+ }
+
+ sal_Int32 nFound = aText.indexOf( aSearchStr, nStartPos );
+ if( nFound != -1 )
+ {
+ nStartPos = nFound;
+ nEndPos = nFound + aSearchStr.getLength();
+
+ if(pDescr->IsWords())
+ {
+ if( (nStartPos > 0 && aText[nStartPos-1] > ' ') ||
+ (nEndPos < aText.getLength() && aText[nEndPos] > ' ') )
+ {
+ nStartPos++;
+ return Search( aText, nStartPos, nEndPos, pDescr );
+ }
+ }
+
+ return true;
+ }
+ else
+ return false;
+}
+
+ESelection SdUnoSearchReplaceShape::GetSelection( const uno::Reference< text::XTextRange >& xTextRange ) noexcept
+{
+ ESelection aSel;
+ SvxUnoTextRangeBase* pRange = comphelper::getFromUnoTunnel<SvxUnoTextRangeBase>( xTextRange );
+
+ if(pRange)
+ aSel = pRange->GetSelection();
+
+ return aSel;
+}
+
+uno::Reference< drawing::XShape > SdUnoSearchReplaceShape::GetShape( const uno::Reference< text::XTextRange >& xTextRange ) noexcept
+{
+ uno::Reference< drawing::XShape > xShape;
+
+ if(xTextRange.is())
+ {
+ uno::Reference< text::XText > xText( xTextRange->getText() );
+
+ if(xText.is())
+ {
+ do
+ {
+ xShape.set( xText, uno::UNO_QUERY );
+ if(!xShape.is())
+ {
+ uno::Reference< text::XText > xParent( xText->getText() );
+ if(!xParent.is() || xText.get() == xParent.get())
+ return xShape;
+
+ xText = xParent;
+ }
+ } while( !xShape.is() );
+ }
+ }
+
+ return xShape;
+}
+
+/* ================================================================= */
+/** this class holds the parameters and status of a search or replace
+ operation performed by class SdUnoSearchReplaceShape
+ */
+
+UNO3_GETIMPLEMENTATION_IMPL( SdUnoSearchReplaceDescriptor );
+
+SdUnoSearchReplaceDescriptor::SdUnoSearchReplaceDescriptor()
+{
+ mpPropSet.reset( new SvxItemPropertySet(ImplGetSearchPropertyMap(), SdrObject::GetGlobalDrawObjectItemPool()) );
+
+ mbBackwards = false;
+ mbCaseSensitive = false;
+ mbWords = false;
+}
+
+SdUnoSearchReplaceDescriptor::~SdUnoSearchReplaceDescriptor() noexcept
+{
+}
+
+// XSearchDescriptor
+OUString SAL_CALL SdUnoSearchReplaceDescriptor::getSearchString()
+{
+ return maSearchStr;
+}
+
+void SAL_CALL SdUnoSearchReplaceDescriptor::setSearchString( const OUString& aString )
+{
+ maSearchStr = aString;
+}
+
+// XReplaceDescriptor
+OUString SAL_CALL SdUnoSearchReplaceDescriptor::getReplaceString()
+{
+ return maReplaceStr;
+}
+
+void SAL_CALL SdUnoSearchReplaceDescriptor::setReplaceString( const OUString& aReplaceString )
+{
+ maReplaceStr = aReplaceString;
+}
+
+// XPropertySet
+uno::Reference< css::beans::XPropertySetInfo > SAL_CALL SdUnoSearchReplaceDescriptor::getPropertySetInfo()
+{
+ SolarMutexGuard aGuard;
+ return mpPropSet->getPropertySetInfo();
+}
+
+void SAL_CALL SdUnoSearchReplaceDescriptor::setPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue )
+{
+ SolarMutexGuard aGuard;
+
+ const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(aPropertyName);
+
+ bool bOk = false;
+
+ switch( pEntry ? pEntry->nWID : -1 )
+ {
+ case WID_SEARCH_BACKWARDS:
+ bOk = (aValue >>= mbBackwards);
+ break;
+ case WID_SEARCH_CASE:
+ bOk = (aValue >>= mbCaseSensitive);
+ break;
+ case WID_SEARCH_WORDS:
+ bOk = (aValue >>= mbWords);
+ break;
+ default:
+ throw beans::UnknownPropertyException( aPropertyName, static_cast<cppu::OWeakObject*>(this));
+ }
+
+ if( !bOk )
+ throw lang::IllegalArgumentException();
+}
+
+uno::Any SAL_CALL SdUnoSearchReplaceDescriptor::getPropertyValue( const OUString& PropertyName )
+{
+ SolarMutexGuard aGuard;
+
+ uno::Any aAny;
+
+ const SfxItemPropertyMapEntry* pEntry = mpPropSet->getPropertyMapEntry(PropertyName);
+
+ switch( pEntry ? pEntry->nWID : -1 )
+ {
+ case WID_SEARCH_BACKWARDS:
+ aAny <<= mbBackwards;
+ break;
+ case WID_SEARCH_CASE:
+ aAny <<= mbCaseSensitive;
+ break;
+ case WID_SEARCH_WORDS:
+ aAny <<= mbWords;
+ break;
+ default:
+ throw beans::UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this));
+ }
+
+ return aAny;
+}
+
+void SAL_CALL SdUnoSearchReplaceDescriptor::addPropertyChangeListener( const OUString& , const css::uno::Reference< css::beans::XPropertyChangeListener >& ) {}
+void SAL_CALL SdUnoSearchReplaceDescriptor::removePropertyChangeListener( const OUString& , const css::uno::Reference< css::beans::XPropertyChangeListener >& ) {}
+void SAL_CALL SdUnoSearchReplaceDescriptor::addVetoableChangeListener( const OUString& , const css::uno::Reference< css::beans::XVetoableChangeListener >& ) {}
+void SAL_CALL SdUnoSearchReplaceDescriptor::removeVetoableChangeListener( const OUString& , const css::uno::Reference< css::beans::XVetoableChangeListener >& ) {}
+
+/* ================================================================= */
+
+SdUnoFindAllAccess::SdUnoFindAllAccess( uno::Sequence< uno::Reference< uno::XInterface > > const & rSequence ) noexcept
+:maSequence( rSequence )
+{
+}
+
+SdUnoFindAllAccess::~SdUnoFindAllAccess() noexcept
+{
+}
+
+// XElementAccess
+uno::Type SAL_CALL SdUnoFindAllAccess::getElementType()
+{
+ return cppu::UnoType<text::XTextRange>::get();
+}
+
+sal_Bool SAL_CALL SdUnoFindAllAccess::hasElements()
+{
+ return maSequence.hasElements();
+}
+
+// XIndexAccess
+sal_Int32 SAL_CALL SdUnoFindAllAccess::getCount()
+{
+ return maSequence.getLength();
+}
+
+uno::Any SAL_CALL SdUnoFindAllAccess::getByIndex( sal_Int32 Index )
+{
+ if( Index < 0 || Index >= getCount() )
+ throw lang::IndexOutOfBoundsException();
+
+ uno::Any aAny;
+ aAny <<= maSequence[Index];
+ return aAny;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unowcntr.cxx b/sd/source/ui/unoidl/unowcntr.cxx
new file mode 100644
index 000000000..1079477ef
--- /dev/null
+++ b/sd/source/ui/unoidl/unowcntr.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/.
+ *
+ * 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 <com/sun/star/lang/XComponent.hpp>
+
+#include "unowcntr.hxx"
+
+using namespace ::com::sun::star;
+
+SvUnoWeakContainer::SvUnoWeakContainer() noexcept
+{
+}
+
+SvUnoWeakContainer::~SvUnoWeakContainer() noexcept
+{
+}
+
+/** inserts the given ref into this container */
+void SvUnoWeakContainer::insert( const uno::WeakReference< uno::XInterface >& xRef ) noexcept
+{
+ for ( auto it = maVector.begin(); it != maVector.end(); )
+ {
+ uno::WeakReference< uno::XInterface > & rWeakRef = *it;
+ uno::Reference< uno::XInterface > xTestRef( rWeakRef );
+ if ( !xTestRef.is() )
+ {
+ it = maVector.erase( it );
+ }
+ else
+ {
+ if ( rWeakRef == xRef )
+ return;
+ ++it;
+ }
+ }
+ maVector.emplace_back( xRef );
+}
+
+/** searches the container for a ref that returns true on the given
+ search function
+*/
+bool SvUnoWeakContainer::findRef(
+ uno::WeakReference< uno::XInterface >& rRef,
+ void const * pSearchData,
+ weakref_searchfunc pSearchFunc
+)
+{
+ for ( auto it = maVector.begin(); it != maVector.end(); )
+ {
+ uno::WeakReference< uno::XInterface > & itRef = *it;
+ uno::Reference< uno::XInterface > xTestRef( itRef );
+ if ( !xTestRef.is() )
+ {
+ it = maVector.erase( it );
+ }
+ else
+ {
+ if( (*pSearchFunc)( itRef, pSearchData ) )
+ {
+ rRef = itRef;
+ return true;
+ }
+ ++it;
+ }
+ }
+ return false;
+}
+
+void SvUnoWeakContainer::dispose()
+{
+ for (auto const& elem : maVector)
+ {
+ uno::Reference< uno::XInterface > xTestRef( elem );
+ if ( xTestRef.is() )
+ {
+ uno::Reference< lang::XComponent > xComp( xTestRef, uno::UNO_QUERY );
+ if( xComp.is() )
+ xComp->dispose();
+ }
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/unoidl/unowcntr.hxx b/sd/source/ui/unoidl/unowcntr.hxx
new file mode 100644
index 000000000..a863f0929
--- /dev/null
+++ b/sd/source/ui/unoidl/unowcntr.hxx
@@ -0,0 +1,47 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <cppuhelper/weakref.hxx>
+#include <vector>
+
+typedef bool (*weakref_searchfunc)( const css::uno::WeakReference< css::uno::XInterface >& xRef, void const * pSearchData );
+
+class SvUnoWeakContainer
+{
+private:
+ std::vector< css::uno::WeakReference< css::uno::XInterface > > maVector;
+
+public:
+ SvUnoWeakContainer() noexcept;
+ ~SvUnoWeakContainer() noexcept;
+
+ /** inserts the given ref into this container */
+ void insert( const css::uno::WeakReference< css::uno::XInterface >& xRef ) noexcept;
+
+ /** searches the container for a ref that returns true on the given
+ search function
+ */
+ bool findRef( css::uno::WeakReference< css::uno::XInterface >& rRef, void const * pSearchData, weakref_searchfunc pSearchFunc );
+
+ void dispose();
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/DocumentRenderer.cxx b/sd/source/ui/view/DocumentRenderer.cxx
new file mode 100644
index 000000000..eee1a759e
--- /dev/null
+++ b/sd/source/ui/view/DocumentRenderer.cxx
@@ -0,0 +1,2256 @@
+/* -*- 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 <com/sun/star/beans/XPropertySet.hpp>
+
+#include <DocumentRenderer.hxx>
+#include <DocumentRenderer.hrc>
+#include <ViewShellBase.hxx>
+
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <strings.hrc>
+#include <drawview.hxx>
+#include <DrawViewShell.hxx>
+#include <FrameView.hxx>
+#include <Outliner.hxx>
+#include <OutlineViewShell.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <DrawDocShell.hxx>
+
+#include <tools/multisel.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <comphelper/sequence.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <editeng/editstat.hxx>
+#include <editeng/outlobj.hxx>
+#include <svx/svdetc.hxx>
+#include <svx/svditer.hxx>
+#include <svx/svdopage.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/xlnclit.hxx>
+#include <toolkit/awt/vclxdevice.hxx>
+#include <unotools/localedatawrapper.hxx>
+#include <vcl/print.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <unotools/moduleoptions.hxx>
+#include <xmloff/autolayout.hxx>
+#include <sfx2/objsh.hxx>
+
+#include <officecfg/Office/Draw.hxx>
+#include <officecfg/Office/Impress.hxx>
+
+#include <algorithm>
+#include <memory>
+#include <vector>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd {
+
+namespace {
+
+ /** Convenience class to extract values from the sequence of properties
+ given to one of the XRenderable methods.
+ */
+ class PrintOptions
+ {
+ public:
+ PrintOptions (
+ const vcl::PrinterOptionsHelper& rHelper,
+ std::vector<sal_Int32>&& rSlidesPerPage)
+ : mrProperties(rHelper),
+ maSlidesPerPage(std::move(rSlidesPerPage))
+ {
+ }
+
+ bool IsWarningOrientation() const
+ {
+ return GetBoolValue(nullptr, true);
+ }
+
+ bool IsPrintPageName() const
+ {
+ return GetBoolValue("IsPrintName", false);
+ }
+
+ bool IsDate() const
+ {
+ return GetBoolValue("IsPrintDateTime", false);
+ }
+
+ bool IsTime() const
+ {
+ return GetBoolValue("IsPrintDateTime", false);
+ }
+
+ bool IsHiddenPages() const
+ {
+ return GetBoolValue("IsPrintHidden", false);
+ }
+
+ bool IsHandoutHorizontal() const
+ {
+ return GetBoolValue("SlidesPerPageOrder", sal_Int32(0));
+ }
+
+ sal_Int32 GetHandoutPageCount() const
+ {
+ sal_uInt32 nIndex = static_cast<sal_Int32>(mrProperties.getIntValue("SlidesPerPage", sal_Int32(0)));
+ if (nIndex<maSlidesPerPage.size())
+ return maSlidesPerPage[nIndex];
+ else if ( ! maSlidesPerPage.empty())
+ return maSlidesPerPage[0];
+ else
+ return 0;
+ }
+
+ bool IsDraw() const
+ {
+ return GetBoolValue("PageContentType", sal_Int32(0));
+ }
+
+ bool IsHandout() const
+ {
+ return GetBoolValue("PageContentType", sal_Int32(1));
+ }
+
+ bool IsNotes() const
+ {
+ return GetBoolValue("PageContentType", sal_Int32(2));
+ }
+
+ bool IsOutline() const
+ {
+ return GetBoolValue("PageContentType", sal_Int32(3));
+ }
+
+ sal_uLong GetOutputQuality() const
+ {
+ sal_Int32 nQuality = static_cast<sal_Int32>(mrProperties.getIntValue( "Quality", sal_Int32(0) ));
+ return nQuality;
+ }
+
+ bool IsPageSize() const
+ {
+ return GetBoolValue("PageOptions", sal_Int32(1));
+ }
+
+ bool IsTilePage() const
+ {
+ return GetBoolValue("PageOptions", sal_Int32(2)) || GetBoolValue("PageOptions", sal_Int32(3));
+ }
+
+ bool IsCutPage() const
+ {
+ return GetBoolValue("PageOptions", sal_Int32(0));
+ }
+
+ bool IsBooklet() const
+ {
+ return GetBoolValue("PrintProspect", false);
+ }
+
+ bool IsPrinterPreferred(DocumentType eDocType) const
+ {
+ bool bIsDraw = eDocType == DocumentType::Draw;
+ return IsTilePage() || IsPageSize() || IsBooklet() || (!bIsDraw && !IsNotes());
+ }
+
+ bool IsPrintExcluded() const
+ {
+ return (IsNotes() || IsDraw() || IsHandout()) && IsHiddenPages();
+ }
+
+ bool IsPrintFrontPage() const
+ {
+ sal_Int32 nInclude = static_cast<sal_Int32>(mrProperties.getIntValue( "EvenOdd", 0 ));
+ return nInclude != 2;
+ }
+
+ bool IsPrintBackPage() const
+ {
+ sal_Int32 nInclude = static_cast<sal_Int32>(mrProperties.getIntValue( "EvenOdd", 0 ));
+ return nInclude != 1;
+ }
+
+ bool IsPaperBin() const
+ {
+ return GetBoolValue("PrintPaperFromSetup", false);
+ }
+
+ bool IsPrintMarkedOnly() const
+ {
+ return GetBoolValue("PrintContent", sal_Int32(4));
+ }
+
+ OUString GetPrinterSelection (sal_Int32 nPageCount, sal_Int32 nCurrentPageIndex) const
+ {
+ sal_Int32 nContent = static_cast<sal_Int32>(mrProperties.getIntValue( "PrintContent", 0 ));
+ OUString sFullRange = "1-" + OUString::number(nPageCount);
+
+ if (nContent == 0) // all pages/slides
+ {
+ return sFullRange;
+ }
+
+ if (nContent == 1) // range
+ {
+ OUString sValue = mrProperties.getStringValue("PageRange");
+ return sValue.isEmpty() ? sFullRange : sValue;
+ }
+
+ if (nContent == 2 && // selection
+ nCurrentPageIndex >= 0)
+ {
+ return OUString::number(nCurrentPageIndex + 1);
+ }
+
+ return OUString();
+ }
+
+ private:
+ const vcl::PrinterOptionsHelper& mrProperties;
+ const std::vector<sal_Int32> maSlidesPerPage;
+
+ /** When the value of the property with name pName is a boolean then
+ return its value. When the property is unknown then
+ bDefaultValue is returned. Otherwise <FALSE/> is returned.
+ */
+ bool GetBoolValue (
+ const char* pName,
+ const bool bDefaultValue) const
+ {
+ bool bValue = mrProperties.getBoolValue( pName, bDefaultValue );
+ return bValue;
+ }
+
+ /** Return <TRUE/> when the value of the property with name pName is
+ an integer and its value is nTriggerValue. Otherwise <FALSE/> is
+ returned.
+ */
+ bool GetBoolValue (
+ const char* pName,
+ const sal_Int32 nTriggerValue) const
+ {
+ sal_Int32 nValue = static_cast<sal_Int32>(mrProperties.getIntValue( pName, 0 ));
+ return nValue == nTriggerValue;
+ }
+ };
+
+ /** A collection of values that helps to reduce the number of arguments
+ given to some functions. Note that not all values are set at the
+ same time.
+ */
+ class PrintInfo
+ {
+ public:
+ PrintInfo (
+ Printer* pPrinter,
+ const bool bPrintMarkedOnly)
+ : mpPrinter(pPrinter),
+ mnDrawMode(DrawModeFlags::Default),
+ maPrintSize(0,0),
+ maPageSize(0,0),
+ meOrientation(Orientation::Portrait),
+ mbPrintMarkedOnly(bPrintMarkedOnly)
+ {}
+
+ const VclPtr<Printer> mpPrinter;
+ DrawModeFlags mnDrawMode;
+ OUString msTimeDate;
+ OUString msPageString;
+ Size maPrintSize;
+ Size maPageSize;
+ Orientation meOrientation;
+ MapMode maMap;
+ const bool mbPrintMarkedOnly;
+ };
+
+ /** Output one page of the document to the given printer. Note that
+ more than one document page may be output to one printer page.
+ */
+ void PrintPage (
+ Printer& rPrinter,
+ ::sd::View& rPrintView,
+ SdPage& rPage,
+ View const * pView,
+ const bool bPrintMarkedOnly,
+ const SdrLayerIDSet& rVisibleLayers,
+ const SdrLayerIDSet& rPrintableLayers)
+ {
+ rPrintView.ShowSdrPage(&rPage);
+
+ const MapMode aOriginalMapMode (rPrinter.GetMapMode());
+
+ // Set the visible layers
+ SdrPageView* pPageView = rPrintView.GetSdrPageView();
+ OSL_ASSERT(pPageView!=nullptr);
+ pPageView->SetVisibleLayers(rVisibleLayers);
+ pPageView->SetPrintableLayers(rPrintableLayers);
+
+ if (pView!=nullptr && bPrintMarkedOnly)
+ pView->DrawMarkedObj(rPrinter);
+ else
+ rPrintView.CompleteRedraw(&rPrinter,
+ vcl::Region(::tools::Rectangle(Point(0,0), rPage.GetSize())));
+
+ rPrinter.SetMapMode(aOriginalMapMode);
+
+ rPrintView.HideSdrPage();
+ }
+
+ /** Output a string (that typically is not part of a document page) to
+ the given printer.
+ */
+ void PrintMessage (
+ Printer& rPrinter,
+ const OUString& rsPageString,
+ const Point& rPageStringOffset)
+ {
+ const vcl::Font aOriginalFont (rPrinter.OutputDevice::GetFont());
+ rPrinter.SetFont(vcl::Font(FAMILY_SWISS, Size(0, 423)));
+ rPrinter.DrawText(rPageStringOffset, rsPageString);
+ rPrinter.SetFont(aOriginalFont);
+ }
+
+ /** Read the resources and process then into a sequence of properties
+ that can be passed to the printing dialog.
+ */
+ class DialogCreator
+ {
+ public:
+ DialogCreator (ViewShellBase &rBase, bool bImpress, sal_Int32 nCurPage)
+ : mrBase(rBase)
+ , mbImpress(bImpress)
+ , mnCurPage(nCurPage)
+ {
+ ProcessResource();
+ }
+
+ const std::vector< beans::PropertyValue >& GetDialogControls() const
+ {
+ return maProperties;
+ }
+
+ const std::vector<sal_Int32>& GetSlidesPerPage() const
+ {
+ return maSlidesPerPage;
+ }
+
+ private:
+ ViewShellBase &mrBase;
+ std::vector<beans::PropertyValue> maProperties;
+ std::vector<sal_Int32> maSlidesPerPage;
+ bool mbImpress;
+ sal_Int32 mnCurPage;
+
+ void ProcessResource()
+ {
+ // load the writer PrinterOptions into the custom tab
+ beans::PropertyValue aOptionsUIFile;
+ aOptionsUIFile.Name = "OptionsUIFile";
+ if( mbImpress )
+ aOptionsUIFile.Value <<= OUString("modules/simpress/ui/impressprinteroptions.ui");
+ else
+ aOptionsUIFile.Value <<= OUString("modules/sdraw/ui/drawprinteroptions.ui");
+ maProperties.push_back(aOptionsUIFile);
+
+ SvtModuleOptions aOpt;
+ OUString aAppGroupname(SdResId(STR_IMPRESS_PRINT_UI_GROUP_NAME));
+ aAppGroupname = aAppGroupname.replaceFirst("%s", aOpt.GetModuleName(
+ mbImpress ? SvtModuleOptions::EModule::IMPRESS : SvtModuleOptions::EModule::DRAW));
+ AddDialogControl(vcl::PrinterOptionsHelper::setGroupControlOpt("tabcontrol-page2", aAppGroupname, ".HelpID:vcl:PrintDialog:TabPage:AppPage"));
+
+ uno::Sequence< OUString > aHelpIds, aWidgetIds;
+ if( mbImpress )
+ {
+ aHelpIds = { ".HelpID:vcl:PrintDialog:PageContentType:ListBox" };
+ AddDialogControl( vcl::PrinterOptionsHelper::setChoiceListControlOpt(
+ "impressdocument",
+ SdResId(STR_IMPRESS_PRINT_UI_CONTENT),
+ aHelpIds,
+ "PageContentType" ,
+ CreateChoice(STR_IMPRESS_PRINT_UI_CONTENT_CHOICES, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_CONTENT_CHOICES)),
+ 0)
+ );
+
+ aHelpIds = { ".HelpID:vcl:PrintDialog:SlidesPerPage:ListBox" };
+ vcl::PrinterOptionsHelper::UIControlOptions aContentOpt( "PageContentType" , 1 );
+ AddDialogControl( vcl::PrinterOptionsHelper::setChoiceListControlOpt(
+ "slidesperpage",
+ SdResId(STR_IMPRESS_PRINT_UI_SLIDESPERPAGE),
+ aHelpIds,
+ "SlidesPerPage" ,
+ GetSlidesPerPageSequence(),
+ 0,
+ Sequence< sal_Bool >(),
+ aContentOpt
+ )
+ );
+
+ aHelpIds = { ".HelpID:vcl:PrintDialog:SlidesPerPageOrder:ListBox" };
+ vcl::PrinterOptionsHelper::UIControlOptions aSlidesPerPageOpt( "SlidesPerPage" , -1, true );
+ AddDialogControl( vcl::PrinterOptionsHelper::setChoiceListControlOpt(
+ "slidesperpageorder",
+ SdResId(STR_IMPRESS_PRINT_UI_ORDER),
+ aHelpIds,
+ "SlidesPerPageOrder" ,
+ CreateChoice(STR_IMPRESS_PRINT_UI_ORDER_CHOICES, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_ORDER_CHOICES)),
+ 0,
+ Sequence< sal_Bool >(),
+ aSlidesPerPageOpt )
+ );
+ }
+
+ AddDialogControl( vcl::PrinterOptionsHelper::setSubgroupControlOpt("contents",
+ SdResId(STR_IMPRESS_PRINT_UI_INCLUDE_CONTENT), "" ) );
+
+ if( mbImpress )
+ {
+ AddDialogControl( vcl::PrinterOptionsHelper::setBoolControlOpt("printname",
+ SdResId(STR_IMPRESS_PRINT_UI_IS_PRINT_NAME),
+ ".HelpID:vcl:PrintDialog:IsPrintName:CheckBox" ,
+ "IsPrintName" ,
+ officecfg::Office::Impress::Print::Other::PageName::get()
+ )
+ );
+ }
+ else
+ {
+ AddDialogControl( vcl::PrinterOptionsHelper::setBoolControlOpt("printname",
+ SdResId(STR_DRAW_PRINT_UI_IS_PRINT_NAME),
+ ".HelpID:vcl:PrintDialog:IsPrintName:CheckBox" ,
+ "IsPrintName" ,
+ officecfg::Office::Draw::Print::Other::PageName::get()
+ )
+ );
+ }
+
+ AddDialogControl( vcl::PrinterOptionsHelper::setBoolControlOpt("printdatetime",
+ SdResId(STR_IMPRESS_PRINT_UI_IS_PRINT_DATE),
+ ".HelpID:vcl:PrintDialog:IsPrintDateTime:CheckBox" ,
+ "IsPrintDateTime" ,
+ // Separate settings for time and date in Impress/Draw -> Print page, check that both are set
+ mbImpress ?
+ officecfg::Office::Impress::Print::Other::Date::get() &&
+ officecfg::Office::Impress::Print::Other::Time::get() :
+ officecfg::Office::Draw::Print::Other::Date::get() &&
+ officecfg::Office::Draw::Print::Other::Time::get()
+ )
+ );
+
+ if( mbImpress )
+ {
+ AddDialogControl( vcl::PrinterOptionsHelper::setBoolControlOpt("printhidden",
+ SdResId(STR_IMPRESS_PRINT_UI_IS_PRINT_HIDDEN),
+ ".HelpID:vcl:PrintDialog:IsPrintHidden:CheckBox" ,
+ "IsPrintHidden" ,
+ officecfg::Office::Impress::Print::Other::HiddenPage::get()
+ )
+ );
+ }
+
+ AddDialogControl( vcl::PrinterOptionsHelper::setSubgroupControlOpt("color",
+ SdResId(STR_IMPRESS_PRINT_UI_QUALITY), "" ) );
+
+ aHelpIds = { ".HelpID:vcl:PrintDialog:Quality:RadioButton:0",
+ ".HelpID:vcl:PrintDialog:Quality:RadioButton:1",
+ ".HelpID:vcl:PrintDialog:Quality:RadioButton:2" };
+ aWidgetIds = { "originalcolors", "grayscale", "blackandwhite" };
+ AddDialogControl( vcl::PrinterOptionsHelper::setChoiceRadiosControlOpt(
+ aWidgetIds,
+ "",
+ aHelpIds,
+ "Quality" ,
+ CreateChoice(STR_IMPRESS_PRINT_UI_QUALITY_CHOICES, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_QUALITY_CHOICES)),
+ mbImpress ? officecfg::Office::Impress::Print::Other::Quality::get() :
+ officecfg::Office::Draw::Print::Other::Quality::get() )
+
+ );
+
+ AddDialogControl( vcl::PrinterOptionsHelper::setSubgroupControlOpt("pagesizes",
+ SdResId(STR_IMPRESS_PRINT_UI_PAGE_OPTIONS), "" ) );
+
+ aHelpIds = { ".HelpID:vcl:PrintDialog:PageOptions:RadioButton:0",
+ ".HelpID:vcl:PrintDialog:PageOptions:RadioButton:1",
+ ".HelpID:vcl:PrintDialog:PageOptions:RadioButton:2",
+ ".HelpID:vcl:PrintDialog:PageOptions:RadioButton:3" };
+ aWidgetIds = { "originalsize", "fittoprintable", "distributeonmultiple", "tilesheet" };
+
+ // Mutually exclusive page options settings are stored in separate config keys...
+ // TODO: There is no config key to set the distributeonmultiple option as default
+ sal_Int32 nDefaultChoice = 0;
+ if ( mbImpress ? officecfg::Office::Impress::Print::Page::PageSize::get() :
+ officecfg::Office::Draw::Print::Page::PageSize::get() )
+ {
+ nDefaultChoice = 1;
+ }
+ else if ( mbImpress ? officecfg::Office::Impress::Print::Page::PageTile::get() :
+ officecfg::Office::Draw::Print::Page::PageTile::get() )
+ {
+ nDefaultChoice = 3;
+ }
+ vcl::PrinterOptionsHelper::UIControlOptions aPageOptionsOpt("PrintProspect", 0);
+ AddDialogControl( vcl::PrinterOptionsHelper::setChoiceRadiosControlOpt(
+ aWidgetIds,
+ "",
+ aHelpIds,
+ "PageOptions" ,
+ mbImpress ? CreateChoice(STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES)) :
+ CreateChoice(STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW)),
+ nDefaultChoice,
+ Sequence< sal_Bool >(),
+ aPageOptionsOpt
+ )
+ );
+
+ vcl::PrinterOptionsHelper::UIControlOptions aBrochureOpt;
+ aBrochureOpt.maGroupHint = "LayoutPage" ;
+ AddDialogControl( vcl::PrinterOptionsHelper::setSubgroupControlOpt("pagesides",
+ SdResId(STR_IMPRESS_PRINT_UI_PAGE_SIDES), "",
+ aBrochureOpt ) );
+
+ // brochure printing
+ AddDialogControl( vcl::PrinterOptionsHelper::setBoolControlOpt("brochure",
+ SdResId(STR_IMPRESS_PRINT_UI_BROCHURE),
+ ".HelpID:vcl:PrintDialog:PrintProspect:CheckBox" ,
+ "PrintProspect" ,
+ mbImpress ? officecfg::Office::Impress::Print::Page::Booklet::get() :
+ officecfg::Office::Draw::Print::Page::Booklet::get(),
+ aBrochureOpt
+ )
+ );
+
+ vcl::PrinterOptionsHelper::UIControlOptions
+ aIncludeOpt( "PrintProspect" , -1, false );
+ aIncludeOpt.maGroupHint = "LayoutPage" ;
+ aHelpIds = { ".HelpID:vcl:PrintDialog:PrintProspectInclude:ListBox" };
+ AddDialogControl( vcl::PrinterOptionsHelper::setChoiceListControlOpt(
+ "brochureinclude",
+ SdResId(STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE),
+ aHelpIds,
+ "PrintProspectInclude" ,
+ CreateChoice(STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE_LIST, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE_LIST)),
+ 0,
+ Sequence< sal_Bool >(),
+ aIncludeOpt
+ )
+ );
+
+ // paper tray (on options page)
+ vcl::PrinterOptionsHelper::UIControlOptions aPaperTrayOpt;
+ aPaperTrayOpt.maGroupHint = "OptionsPageOptGroup" ;
+ AddDialogControl( vcl::PrinterOptionsHelper::setBoolControlOpt("printpaperfromsetup",
+ SdResId(STR_IMPRESS_PRINT_UI_PAPER_TRAY),
+ ".HelpID:vcl:PrintDialog:PrintPaperFromSetup:CheckBox" ,
+ "PrintPaperFromSetup" ,
+ false,
+ aPaperTrayOpt
+ )
+ );
+ // print range selection
+ vcl::PrinterOptionsHelper::UIControlOptions aPrintRangeOpt;
+ aPrintRangeOpt.mbInternalOnly = true;
+ aPrintRangeOpt.maGroupHint = "PrintRange" ;
+ AddDialogControl( vcl::PrinterOptionsHelper::setSubgroupControlOpt("printrange",
+ mbImpress ? SdResId(STR_IMPRESS_PRINT_UI_SLIDE_RANGE) : SdResId(STR_IMPRESS_PRINT_UI_PAGE_RANGE),
+ "",
+ aPrintRangeOpt )
+ );
+
+ // check if there is a selection of slides
+ OUString aPageRange(OUString::number(mnCurPage + 1));
+ int nPrintRange(0);
+ using sd::slidesorter::SlideSorterViewShell;
+ SlideSorterViewShell* const pSSViewSh(SlideSorterViewShell::GetSlideSorter(mrBase));
+ if (pSSViewSh)
+ {
+ const std::shared_ptr<SlideSorterViewShell::PageSelection> pPageSelection(pSSViewSh->GetPageSelection());
+ if (bool(pPageSelection) && pPageSelection->size() > 1)
+ {
+ OUStringBuffer aBuf;
+ // TODO: this could be improved by writing ranges instead of consecutive page
+ // numbers if appropriate. Do we have a helper function for that somewhere?
+ bool bFirst(true);
+ for (auto pPage: *pPageSelection)
+ {
+ if (bFirst)
+ bFirst = false;
+ else
+ aBuf.append(',');
+ aBuf.append(static_cast<sal_Int32>(pPage->GetPageNum() / 2 + 1));
+ }
+ aPageRange = aBuf.makeStringAndClear();
+ nPrintRange = 1;
+ }
+ }
+/*
+ OUString aPrintRangeName( "PrintContent" );
+ aHelpIds.realloc( 1 );
+ aHelpIds[0] = ".HelpID:vcl:PrintDialog:PageContentType:ListBox";
+ AddDialogControl( vcl::PrinterOptionsHelper::setChoiceListControlOpt( "printpagesbox", OUString(),
+ aHelpIds, aPrintRangeName,
+ mbImpress ? CreateChoice( STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE ) ) :
+ CreateChoice( STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE, SAL_N_ELEMENTS(STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE ) ),
+ nPrintRange ) );
+*/
+ OUString aPrintRangeName( "PrintContent" );
+ aHelpIds = { ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:0",
+ ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:1",
+ ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:2" };
+ aWidgetIds = { "rbAllPages", "rbRangePages", "rbRangeSelection" };
+
+ AddDialogControl( vcl::PrinterOptionsHelper::setChoiceRadiosControlOpt(aWidgetIds, OUString(),
+ aHelpIds, aPrintRangeName,
+ mbImpress ? CreateChoice(STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE)) :
+ CreateChoice(STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE, SAL_N_ELEMENTS(STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE)),
+ nPrintRange )
+ );
+ // create an Edit dependent on "Pages" selected
+ vcl::PrinterOptionsHelper::UIControlOptions aPageRangeOpt( aPrintRangeName, 1, true );
+ AddDialogControl(vcl::PrinterOptionsHelper::setEditControlOpt("pagerange", "",
+ ".HelpID:vcl:PrintDialog:PageRange:Edit", "PageRange",
+ aPageRange, aPageRangeOpt));
+ vcl::PrinterOptionsHelper::UIControlOptions aEvenOddOpt(aPrintRangeName, -1, true);
+ AddDialogControl(vcl::PrinterOptionsHelper::setChoiceListControlOpt("evenoddbox", "",
+ uno::Sequence<OUString>(), "EvenOdd", uno::Sequence<OUString>(),
+ 0, uno::Sequence<sal_Bool>(), aEvenOddOpt));
+ }
+
+ void AddDialogControl( const Any& i_rCtrl )
+ {
+ beans::PropertyValue aVal;
+ aVal.Value = i_rCtrl;
+ maProperties.push_back( aVal );
+ }
+
+ static Sequence<OUString> CreateChoice(const TranslateId* pResourceId, size_t nCount)
+ {
+ Sequence<OUString> aChoices (nCount);
+ std::transform(pResourceId, pResourceId + nCount, aChoices.getArray(),
+ [](const auto& id) { return SdResId(id); });
+ return aChoices;
+ }
+
+ Sequence<OUString> GetSlidesPerPageSequence()
+ {
+ const Sequence<OUString> aChoice (
+ CreateChoice(STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES, SAL_N_ELEMENTS(STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES)));
+ maSlidesPerPage.clear();
+ maSlidesPerPage.push_back(0); // first is using the default
+ std::transform(std::next(aChoice.begin()), aChoice.end(), std::back_inserter(maSlidesPerPage),
+ [](const OUString& rChoice) -> sal_Int32 { return rChoice.toInt32(); });
+ return aChoice;
+ }
+ };
+
+ /** The Prepare... methods of the DocumentRenderer::Implementation class
+ create a set of PrinterPage objects that contain all necessary
+ information to do the actual printing. There is one PrinterPage
+ object per printed page. Derived classes implement the actual, mode
+ specific printing.
+
+ This and all derived classes support the asynchronous printing
+ process by not storing pointers to any data with lifetime shorter
+ than the PrinterPage objects, i.e. slides, shapes, (one of) the
+ outliner (of the document).
+ */
+ class PrinterPage
+ {
+ public:
+ PrinterPage (
+ const PageKind ePageKind,
+ const MapMode& rMapMode,
+ const bool bPrintMarkedOnly,
+ const OUString& rsPageString,
+ const Point& rPageStringOffset,
+ const DrawModeFlags nDrawMode,
+ const Orientation eOrientation,
+ const sal_uInt16 nPaperTray)
+ : mePageKind(ePageKind),
+ maMap(rMapMode),
+ mbPrintMarkedOnly(bPrintMarkedOnly),
+ msPageString(rsPageString),
+ maPageStringOffset(rPageStringOffset),
+ mnDrawMode(nDrawMode),
+ meOrientation(eOrientation),
+ mnPaperTray(nPaperTray)
+ {
+ }
+
+ virtual ~PrinterPage() {}
+
+ virtual void Print (
+ Printer& rPrinter,
+ SdDrawDocument& rDocument,
+ ViewShell& rViewShell,
+ View* pView,
+ DrawView& rPrintView,
+ const SdrLayerIDSet& rVisibleLayers,
+ const SdrLayerIDSet& rPrintableLayers) const = 0;
+
+ DrawModeFlags GetDrawMode() const { return mnDrawMode; }
+ Orientation GetOrientation() const { return meOrientation; }
+ sal_uInt16 GetPaperTray() const { return mnPaperTray; }
+
+ protected:
+ const PageKind mePageKind;
+ const MapMode maMap;
+ const bool mbPrintMarkedOnly;
+ const OUString msPageString;
+ const Point maPageStringOffset;
+ const DrawModeFlags mnDrawMode;
+ const Orientation meOrientation;
+ const sal_uInt16 mnPaperTray;
+ };
+
+ /** The RegularPrinterPage is used for printing one regular slide (no
+ notes, handout, or outline) to one printer page.
+ */
+ class RegularPrinterPage : public PrinterPage
+ {
+ public:
+ RegularPrinterPage (
+ const sal_uInt16 nPageIndex,
+ const PageKind ePageKind,
+ const MapMode& rMapMode,
+ const bool bPrintMarkedOnly,
+ const OUString& rsPageString,
+ const Point& rPageStringOffset,
+ const DrawModeFlags nDrawMode,
+ const Orientation eOrientation,
+ const sal_uInt16 nPaperTray)
+ : PrinterPage(ePageKind, rMapMode, bPrintMarkedOnly, rsPageString,
+ rPageStringOffset, nDrawMode, eOrientation, nPaperTray),
+ mnPageIndex(nPageIndex)
+ {
+ }
+
+ virtual void Print (
+ Printer& rPrinter,
+ SdDrawDocument& rDocument,
+ ViewShell&,
+ View* pView,
+ DrawView& rPrintView,
+ const SdrLayerIDSet& rVisibleLayers,
+ const SdrLayerIDSet& rPrintableLayers) const override
+ {
+ SdPage* pPageToPrint = rDocument.GetSdPage(mnPageIndex, mePageKind);
+ rPrinter.SetMapMode(maMap);
+ PrintPage(
+ rPrinter,
+ rPrintView,
+ *pPageToPrint,
+ pView,
+ mbPrintMarkedOnly,
+ rVisibleLayers,
+ rPrintableLayers);
+ PrintMessage(
+ rPrinter,
+ msPageString,
+ maPageStringOffset);
+ }
+
+ private:
+ const sal_uInt16 mnPageIndex;
+ };
+
+ /** Print one slide multiple times on a printer page so that the whole
+ printer page is covered.
+ */
+ class TiledPrinterPage : public PrinterPage
+ {
+ public:
+ TiledPrinterPage (
+ const sal_uInt16 nPageIndex,
+ const PageKind ePageKind,
+ const bool bPrintMarkedOnly,
+ const OUString& rsPageString,
+ const Point& rPageStringOffset,
+ const DrawModeFlags nDrawMode,
+ const Orientation eOrientation,
+ const sal_uInt16 nPaperTray)
+ : PrinterPage(ePageKind, MapMode(), bPrintMarkedOnly, rsPageString,
+ rPageStringOffset, nDrawMode, eOrientation, nPaperTray),
+ mnPageIndex(nPageIndex)
+ {
+ }
+
+ virtual void Print (
+ Printer& rPrinter,
+ SdDrawDocument& rDocument,
+ ViewShell&,
+ View* pView,
+ DrawView& rPrintView,
+ const SdrLayerIDSet& rVisibleLayers,
+ const SdrLayerIDSet& rPrintableLayers) const override
+ {
+ SdPage* pPageToPrint = rDocument.GetSdPage(mnPageIndex, mePageKind);
+ if (pPageToPrint==nullptr)
+ return;
+ MapMode aMap (rPrinter.GetMapMode());
+
+ const Size aPageSize (pPageToPrint->GetSize());
+ const Size aPrintSize (rPrinter.GetOutputSize());
+
+ const sal_Int32 nPageWidth (aPageSize.Width() + mnGap
+ - pPageToPrint->GetLeftBorder() - pPageToPrint->GetRightBorder());
+ const sal_Int32 nPageHeight (aPageSize.Height() + mnGap
+ - pPageToPrint->GetUpperBorder() - pPageToPrint->GetLowerBorder());
+ if (nPageWidth<=0 || nPageHeight<=0)
+ return;
+
+ // Print at least two rows and columns. More if the document
+ // page fits completely onto the printer page.
+ const sal_Int32 nColumnCount (std::max(sal_Int32(2),
+ sal_Int32(aPrintSize.Width() / nPageWidth)));
+ const sal_Int32 nRowCount (std::max(sal_Int32(2),
+ sal_Int32(aPrintSize.Height() / nPageHeight)));
+ for (sal_Int32 nRow=0; nRow<nRowCount; ++nRow)
+ for (sal_Int32 nColumn=0; nColumn<nColumnCount; ++nColumn)
+ {
+ aMap.SetOrigin(Point(nColumn*nPageWidth,nRow*nPageHeight));
+ rPrinter.SetMapMode(aMap);
+ PrintPage(
+ rPrinter,
+ rPrintView,
+ *pPageToPrint,
+ pView,
+ mbPrintMarkedOnly,
+ rVisibleLayers,
+ rPrintableLayers);
+ }
+
+ PrintMessage(
+ rPrinter,
+ msPageString,
+ maPageStringOffset);
+ }
+
+ private:
+ const sal_uInt16 mnPageIndex;
+ static const sal_Int32 mnGap = 500;
+ };
+
+ /** Print two slides to one printer page so that the resulting pages
+ form a booklet.
+ */
+ class BookletPrinterPage : public PrinterPage
+ {
+ public:
+ BookletPrinterPage (
+ const sal_uInt16 nFirstPageIndex,
+ const sal_uInt16 nSecondPageIndex,
+ const Point& rFirstOffset,
+ const Point& rSecondOffset,
+ const PageKind ePageKind,
+ const MapMode& rMapMode,
+ const bool bPrintMarkedOnly,
+ const DrawModeFlags nDrawMode,
+ const Orientation eOrientation,
+ const sal_uInt16 nPaperTray)
+ : PrinterPage(ePageKind, rMapMode, bPrintMarkedOnly, "",
+ Point(), nDrawMode, eOrientation, nPaperTray),
+ mnFirstPageIndex(nFirstPageIndex),
+ mnSecondPageIndex(nSecondPageIndex),
+ maFirstOffset(rFirstOffset),
+ maSecondOffset(rSecondOffset)
+ {
+ }
+
+ virtual void Print (
+ Printer& rPrinter,
+ SdDrawDocument& rDocument,
+ ViewShell&,
+ View* pView,
+ DrawView& rPrintView,
+ const SdrLayerIDSet& rVisibleLayers,
+ const SdrLayerIDSet& rPrintableLayers) const override
+ {
+ MapMode aMap (maMap);
+ SdPage* pPageToPrint = rDocument.GetSdPage(mnFirstPageIndex, mePageKind);
+ if (pPageToPrint)
+ {
+ aMap.SetOrigin(maFirstOffset);
+ rPrinter.SetMapMode(aMap);
+ PrintPage(
+ rPrinter,
+ rPrintView,
+ *pPageToPrint,
+ pView,
+ mbPrintMarkedOnly,
+ rVisibleLayers,
+ rPrintableLayers);
+ }
+
+ pPageToPrint = rDocument.GetSdPage(mnSecondPageIndex, mePageKind);
+ if( !pPageToPrint )
+ return;
+
+ aMap.SetOrigin(maSecondOffset);
+ rPrinter.SetMapMode(aMap);
+ PrintPage(
+ rPrinter,
+ rPrintView,
+ *pPageToPrint,
+ pView,
+ mbPrintMarkedOnly,
+ rVisibleLayers,
+ rPrintableLayers);
+ }
+
+ private:
+ const sal_uInt16 mnFirstPageIndex;
+ const sal_uInt16 mnSecondPageIndex;
+ const Point maFirstOffset;
+ const Point maSecondOffset;
+ };
+
+ /** One handout page displays one to nine slides.
+ */
+ class HandoutPrinterPage : public PrinterPage
+ {
+ public:
+ HandoutPrinterPage (
+ const sal_uInt16 nHandoutPageIndex,
+ std::vector<sal_uInt16>&& rPageIndices,
+ const MapMode& rMapMode,
+ const OUString& rsPageString,
+ const Point& rPageStringOffset,
+ const DrawModeFlags nDrawMode,
+ const Orientation eOrientation,
+ const sal_uInt16 nPaperTray)
+ : PrinterPage(PageKind::Handout, rMapMode, false, rsPageString,
+ rPageStringOffset, nDrawMode, eOrientation, nPaperTray),
+ mnHandoutPageIndex(nHandoutPageIndex),
+ maPageIndices(std::move(rPageIndices))
+ {
+ }
+
+ virtual void Print (
+ Printer& rPrinter,
+ SdDrawDocument& rDocument,
+ ViewShell& rViewShell,
+ View* pView,
+ DrawView& rPrintView,
+ const SdrLayerIDSet& rVisibleLayers,
+ const SdrLayerIDSet& rPrintableLayers) const override
+ {
+ SdPage& rHandoutPage (*rDocument.GetSdPage(0, PageKind::Handout));
+
+ Reference< css::beans::XPropertySet > xHandoutPage( rHandoutPage.getUnoPage(), UNO_QUERY );
+ static const OUStringLiteral sPageNumber( u"Number" );
+
+ // Collect the page objects of the handout master.
+ std::vector<SdrPageObj*> aHandoutPageObjects;
+ SdrObjListIter aShapeIter (&rHandoutPage);
+ while (aShapeIter.IsMore())
+ {
+ SdrPageObj* pPageObj = dynamic_cast<SdrPageObj*>(aShapeIter.Next());
+ if (pPageObj)
+ aHandoutPageObjects.push_back(pPageObj);
+ }
+ if (aHandoutPageObjects.empty())
+ return;
+
+ // Connect page objects with pages.
+ std::vector<SdrPageObj*>::iterator aPageObjIter (aHandoutPageObjects.begin());
+ for (std::vector<sal_uInt16>::const_iterator
+ iPageIndex(maPageIndices.begin()),
+ iEnd(maPageIndices.end());
+ iPageIndex!=iEnd && aPageObjIter!=aHandoutPageObjects.end();
+ ++iPageIndex)
+ {
+ // Check if the page still exists.
+ if (*iPageIndex >= rDocument.GetSdPageCount(PageKind::Standard))
+ continue;
+
+ SdrPageObj* pPageObj = *aPageObjIter++;
+ pPageObj->SetReferencedPage(rDocument.GetSdPage(*iPageIndex, PageKind::Standard));
+ }
+
+ // if there are more page objects than pages left, set the rest to invisible
+ int nHangoverCount = 0;
+ while (aPageObjIter != aHandoutPageObjects.end())
+ {
+ (*aPageObjIter++)->SetReferencedPage(nullptr);
+ nHangoverCount++;
+ }
+
+ // Hide outlines for objects that have pages attached.
+ if (nHangoverCount > 0)
+ {
+ int nSkip = aHandoutPageObjects.size() - nHangoverCount;
+ aShapeIter.Reset();
+ while (aShapeIter.IsMore())
+ {
+ SdrPathObj* pPathObj = dynamic_cast<SdrPathObj*>(aShapeIter.Next());
+ if (pPathObj)
+ {
+ if (nSkip > 0)
+ --nSkip;
+ else
+ pPathObj->SetMergedItem(XLineStyleItem(drawing::LineStyle_NONE));
+ }
+ }
+ }
+
+ if( xHandoutPage.is() ) try
+ {
+ xHandoutPage->setPropertyValue( sPageNumber, Any( static_cast<sal_Int16>(mnHandoutPageIndex) ) );
+ }
+ catch( Exception& )
+ {
+ }
+ rViewShell.SetPrintedHandoutPageNum( mnHandoutPageIndex + 1 );
+
+ rPrinter.SetMapMode(maMap);
+
+ PrintPage(
+ rPrinter,
+ rPrintView,
+ rHandoutPage,
+ pView,
+ false,
+ rVisibleLayers,
+ rPrintableLayers);
+ PrintMessage(
+ rPrinter,
+ msPageString,
+ maPageStringOffset);
+
+ if( xHandoutPage.is() ) try
+ {
+ xHandoutPage->setPropertyValue( sPageNumber, Any( static_cast<sal_Int16>(0) ) );
+ }
+ catch( Exception& )
+ {
+ }
+ rViewShell.SetPrintedHandoutPageNum(1);
+
+ // Restore outlines.
+ if (nHangoverCount > 0)
+ {
+ aShapeIter.Reset();
+ while (aShapeIter.IsMore())
+ {
+ SdrPathObj* pPathObj = dynamic_cast<SdrPathObj*>(aShapeIter.Next());
+ if (pPathObj != nullptr)
+ pPathObj->SetMergedItem(XLineStyleItem(drawing::LineStyle_SOLID));
+ }
+ }
+
+ }
+
+ private:
+ const sal_uInt16 mnHandoutPageIndex;
+ const std::vector<sal_uInt16> maPageIndices;
+ };
+
+ /** The outline information (title, subtitle, outline objects) of the
+ document. There is no fixed mapping of slides to printer pages.
+ */
+ class OutlinerPrinterPage : public PrinterPage
+ {
+ public:
+ OutlinerPrinterPage (
+ std::optional<OutlinerParaObject> pParaObject,
+ const MapMode& rMapMode,
+ const OUString& rsPageString,
+ const Point& rPageStringOffset,
+ const DrawModeFlags nDrawMode,
+ const Orientation eOrientation,
+ const sal_uInt16 nPaperTray)
+ : PrinterPage(PageKind::Handout, rMapMode, false, rsPageString,
+ rPageStringOffset, nDrawMode, eOrientation, nPaperTray),
+ mpParaObject(std::move(pParaObject))
+ {
+ }
+
+ virtual void Print (
+ Printer& rPrinter,
+ SdDrawDocument& rDocument,
+ ViewShell&,
+ View*,
+ DrawView&,
+ const SdrLayerIDSet&,
+ const SdrLayerIDSet&) const override
+ {
+ // Set up the printer.
+ rPrinter.SetMapMode(maMap);
+
+ // Get and set up the outliner.
+ const ::tools::Rectangle aOutRect (rPrinter.GetPageOffset(), rPrinter.GetOutputSize());
+ Outliner* pOutliner = rDocument.GetInternalOutliner();
+ const OutlinerMode nSavedOutlMode (pOutliner->GetOutlinerMode());
+ const bool bSavedUpdateMode (pOutliner->IsUpdateLayout());
+ const Size aSavedPaperSize (pOutliner->GetPaperSize());
+
+ pOutliner->Init(OutlinerMode::OutlineView);
+ pOutliner->SetPaperSize(aOutRect.GetSize());
+ pOutliner->SetUpdateLayout(true);
+ pOutliner->Clear();
+ pOutliner->SetText(*mpParaObject);
+
+ pOutliner->Draw(rPrinter, aOutRect);
+
+ PrintMessage(
+ rPrinter,
+ msPageString,
+ maPageStringOffset);
+
+ // Restore outliner and printer.
+ pOutliner->Clear();
+ pOutliner->SetUpdateLayout(bSavedUpdateMode);
+ pOutliner->SetPaperSize(aSavedPaperSize);
+ pOutliner->Init(nSavedOutlMode);
+ }
+
+ private:
+ std::optional<OutlinerParaObject> mpParaObject;
+ };
+}
+
+//===== DocumentRenderer::Implementation ======================================
+
+class DocumentRenderer::Implementation
+ : public SfxListener,
+ public vcl::PrinterOptionsHelper
+{
+public:
+ explicit Implementation (ViewShellBase& rBase)
+ : mxObjectShell(rBase.GetDocShell())
+ , mrBase(rBase)
+ , mbIsDisposed(false)
+ , mpPrinter(nullptr)
+ , mbHasOrientationWarningBeenShown(false)
+ {
+ DialogCreator aCreator( mrBase, mrBase.GetDocShell()->GetDocumentType() == DocumentType::Impress, GetCurrentPageIndex() );
+ m_aUIProperties = aCreator.GetDialogControls();
+ maSlidesPerPage = aCreator.GetSlidesPerPage();
+
+ StartListening(mrBase);
+ }
+
+ virtual ~Implementation() override
+ {
+ EndListening(mrBase);
+ }
+
+ virtual void Notify (SfxBroadcaster& rBroadcaster, const SfxHint& rHint) override
+ {
+ if (&rBroadcaster != &static_cast<SfxBroadcaster&>(mrBase))
+ return;
+
+ if (rHint.GetId() == SfxHintId::Dying)
+ {
+ mbIsDisposed = true;
+ }
+ }
+
+ /** Process the sequence of properties given to one of the XRenderable
+ methods.
+ */
+ void ProcessProperties (const css::uno::Sequence<css::beans::PropertyValue >& rOptions)
+ {
+ OSL_ASSERT(!mbIsDisposed);
+ if (mbIsDisposed)
+ return;
+
+ bool bIsValueChanged = processProperties( rOptions );
+ bool bIsPaperChanged = false;
+
+ // The RenderDevice property is handled specially: its value is
+ // stored in mpPrinter instead of being retrieved on demand.
+ Any aDev( getValue( "RenderDevice" ) );
+ Reference<awt::XDevice> xRenderDevice;
+
+ if (aDev >>= xRenderDevice)
+ {
+ VCLXDevice* pDevice = comphelper::getFromUnoTunnel<VCLXDevice>(xRenderDevice);
+ VclPtr< OutputDevice > pOut = pDevice ? pDevice->GetOutputDevice()
+ : VclPtr< OutputDevice >();
+ mpPrinter = dynamic_cast<Printer*>(pOut.get());
+ Size aPageSizePixel = mpPrinter ? mpPrinter->GetPaperSizePixel() : Size();
+ if( aPageSizePixel != maPrinterPageSizePixel )
+ {
+ bIsPaperChanged = true;
+ maPrinterPageSizePixel = aPageSizePixel;
+ }
+ }
+
+ if (bIsValueChanged && ! mpOptions )
+ mpOptions.reset(new PrintOptions(*this, std::vector(maSlidesPerPage)));
+ if( bIsValueChanged || bIsPaperChanged )
+ PreparePages();
+ }
+
+ /** Return the number of pages that are to be printed.
+ */
+ sal_Int32 GetPrintPageCount() const
+ {
+ OSL_ASSERT(!mbIsDisposed);
+ if (mbIsDisposed)
+ return 0;
+ else
+ return maPrinterPages.size();
+ }
+
+ /** Return a sequence of properties that can be returned by the
+ XRenderable::getRenderer() method.
+ */
+ css::uno::Sequence<css::beans::PropertyValue> GetProperties () const
+ {
+ css::uno::Sequence<css::beans::PropertyValue> aProperties{
+ comphelper::makePropertyValue("ExtraPrintUIOptions",
+ comphelper::containerToSequence(m_aUIProperties)),
+ comphelper::makePropertyValue("PageSize", maPrintSize),
+ // FIXME: is this always true ?
+ comphelper::makePropertyValue("PageIncludesNonprintableArea", true)
+ };
+
+ return aProperties;
+ }
+
+ /** Print one of the prepared pages.
+ */
+ void PrintPage (const sal_Int32 nIndex)
+ {
+ OSL_ASSERT(!mbIsDisposed);
+ if (mbIsDisposed)
+ return;
+
+ Printer& rPrinter (*mpPrinter);
+
+ std::shared_ptr<ViewShell> pViewShell (mrBase.GetMainViewShell());
+ if ( ! pViewShell)
+ return;
+
+ SdDrawDocument* pDocument = pViewShell->GetDoc();
+ OSL_ASSERT(pDocument!=nullptr);
+
+ std::shared_ptr<DrawViewShell> pDrawViewShell(
+ std::dynamic_pointer_cast<DrawViewShell>(mrBase.GetMainViewShell()));
+
+ if (!mpPrintView)
+ mpPrintView.reset(new DrawView(mrBase.GetDocShell(), &rPrinter, nullptr));
+
+ if (nIndex<0 || sal::static_int_cast<sal_uInt32>(nIndex)>=maPrinterPages.size())
+ return;
+
+ const std::shared_ptr<PrinterPage> pPage (maPrinterPages[nIndex]);
+ OSL_ASSERT(pPage);
+ if ( ! pPage)
+ return;
+
+ const Orientation eSavedOrientation (rPrinter.GetOrientation());
+ const DrawModeFlags nSavedDrawMode (rPrinter.GetDrawMode());
+ const MapMode aSavedMapMode (rPrinter.GetMapMode());
+ const sal_uInt16 nSavedPaperBin (rPrinter.GetPaperBin());
+
+ // Set page orientation.
+ if ( ! rPrinter.SetOrientation(pPage->GetOrientation()))
+ {
+ if ( ! mbHasOrientationWarningBeenShown
+ && mpOptions->IsWarningOrientation())
+ {
+ mbHasOrientationWarningBeenShown = true;
+ // Show warning that the orientation could not be set.
+ std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(
+ pViewShell->GetFrameWeld(), VclMessageType::Warning, VclButtonsType::OkCancel,
+ SdResId(STR_WARN_PRINTFORMAT_FAILURE)));
+ xWarn->set_default_response(RET_CANCEL);
+ if (xWarn->run() != RET_OK)
+ return;
+ }
+ }
+
+ // Set the draw mode.
+ rPrinter.SetDrawMode(pPage->GetDrawMode());
+
+ // Set paper tray.
+ rPrinter.SetPaperBin(pPage->GetPaperTray());
+
+ // Print the actual page.
+ pPage->Print(
+ rPrinter,
+ *pDocument,
+ *pViewShell,
+ pDrawViewShell ? pDrawViewShell->GetView() : nullptr,
+ *mpPrintView,
+ pViewShell->GetFrameView()->GetVisibleLayers(),
+ pViewShell->GetFrameView()->GetPrintableLayers());
+
+ rPrinter.SetOrientation(eSavedOrientation);
+ rPrinter.SetDrawMode(nSavedDrawMode);
+ rPrinter.SetMapMode(aSavedMapMode);
+ rPrinter.SetPaperBin(nSavedPaperBin);
+ }
+
+private:
+ // rhbz#657394: keep the document alive: prevents crash when
+ SfxObjectShellRef mxObjectShell; // destroying mpPrintView
+ ViewShellBase& mrBase;
+ bool mbIsDisposed;
+ VclPtr<Printer> mpPrinter;
+ Size maPrinterPageSizePixel;
+ std::unique_ptr<PrintOptions> mpOptions;
+ std::vector< std::shared_ptr< ::sd::PrinterPage> > maPrinterPages;
+ std::unique_ptr<DrawView> mpPrintView;
+ bool mbHasOrientationWarningBeenShown;
+ std::vector<sal_Int32> maSlidesPerPage;
+ awt::Size maPrintSize;
+
+ sal_Int32 GetCurrentPageIndex() const
+ {
+ const ViewShell *pShell = mrBase.GetMainViewShell().get();
+ const SdPage *pCurrentPage = pShell ? pShell->getCurrentPage() : nullptr;
+ return pCurrentPage ? (pCurrentPage->GetPageNum()-1)/2 : -1;
+ }
+
+ /** Determine and set the paper orientation.
+ */
+ void SetupPaperOrientation (
+ const PageKind ePageKind,
+ PrintInfo& rInfo)
+ {
+ SdDrawDocument* pDocument = mrBase.GetMainViewShell()->GetDoc();
+ rInfo.meOrientation = Orientation::Portrait;
+
+ if( ! mpOptions->IsBooklet())
+ {
+ rInfo.meOrientation = pDocument->GetSdPage(0, ePageKind)->GetOrientation();
+ }
+ else if (rInfo.maPageSize.Width() < rInfo.maPageSize.Height())
+ rInfo.meOrientation = Orientation::Landscape;
+
+ // Draw and Notes should usually abide by their specified paper size
+ Size aPaperSize;
+ if (!mpOptions->IsPrinterPreferred(pDocument->GetDocumentType()))
+ {
+ aPaperSize.setWidth(rInfo.maPageSize.Width());
+ aPaperSize.setHeight(rInfo.maPageSize.Height());
+ }
+ else
+ {
+ aPaperSize.setWidth(rInfo.mpPrinter->GetPaperSize().Width());
+ aPaperSize.setHeight(rInfo.mpPrinter->GetPaperSize().Height());
+ }
+
+ maPrintSize = awt::Size(aPaperSize.Width(), aPaperSize.Height());
+
+ if (mpOptions->IsPrinterPreferred(pDocument->GetDocumentType()))
+ {
+ if( (rInfo.meOrientation == Orientation::Landscape &&
+ (aPaperSize.Width() < aPaperSize.Height()))
+ ||
+ (rInfo.meOrientation == Orientation::Portrait &&
+ (aPaperSize.Width() > aPaperSize.Height()))
+ )
+ {
+ maPrintSize = awt::Size(aPaperSize.Height(), aPaperSize.Width());
+ }
+ }
+ }
+
+ /** Top most method for preparing printer pages. In this and the other
+ Prepare... methods the various special cases are detected and
+ handled.
+ For every page that is to be printed (that may contain several
+ slides) one PrinterPage object is created and inserted into
+ maPrinterPages.
+ */
+ void PreparePages()
+ {
+ mpPrintView.reset();
+ maPrinterPages.clear();
+ mbHasOrientationWarningBeenShown = false;
+
+ ViewShell* pShell = mrBase.GetMainViewShell().get();
+
+ PrintInfo aInfo (mpPrinter, mpOptions->IsPrintMarkedOnly());
+
+ if (aInfo.mpPrinter==nullptr || pShell==nullptr)
+ return;
+
+ MapMode aMap (aInfo.mpPrinter->GetMapMode());
+ aMap.SetMapUnit(MapUnit::Map100thMM);
+ aInfo.maMap = aMap;
+ mpPrinter->SetMapMode(aMap);
+
+ ::Outliner& rOutliner = mrBase.GetDocument()->GetDrawOutliner();
+ const EEControlBits nSavedControlWord (rOutliner.GetControlWord());
+ EEControlBits nCntrl = nSavedControlWord;
+ nCntrl &= ~EEControlBits::MARKFIELDS;
+ nCntrl &= ~EEControlBits::ONLINESPELLING;
+ rOutliner.SetControlWord( nCntrl );
+
+ // When in outline view then apply all pending changes to the model.
+ if( auto pOutlineViewShell = dynamic_cast< OutlineViewShell *>( pShell ) )
+ pOutlineViewShell->PrepareClose (false);
+
+ // Collect some frequently used data.
+ if (mpOptions->IsDate())
+ {
+ aInfo.msTimeDate += GetSdrGlobalData().GetLocaleData()->getDate( Date( Date::SYSTEM ) );
+ aInfo.msTimeDate += " ";
+ }
+
+ if (mpOptions->IsTime())
+ aInfo.msTimeDate += GetSdrGlobalData().GetLocaleData()->getTime( ::tools::Time( ::tools::Time::SYSTEM ), false );
+
+ // Draw and Notes should usually use specified paper size when printing
+ if (!mpOptions->IsPrinterPreferred(mrBase.GetDocShell()->GetDocumentType()))
+ {
+ aInfo.maPrintSize = mrBase.GetDocument()->GetSdPage(0, PageKind::Standard)->GetSize();
+ maPrintSize = awt::Size(aInfo.maPrintSize.Width(),
+ aInfo.maPrintSize.Height());
+ }
+ else
+ {
+ aInfo.maPrintSize = aInfo.mpPrinter->GetOutputSize();
+ maPrintSize = awt::Size(
+ aInfo.mpPrinter->GetPaperSize().Width(),
+ aInfo.mpPrinter->GetPaperSize().Height());
+ }
+
+ switch (mpOptions->GetOutputQuality())
+ {
+ case 1: // Grayscale
+ aInfo.mnDrawMode = DrawModeFlags::GrayLine | DrawModeFlags::GrayFill
+ | DrawModeFlags::GrayText | DrawModeFlags::GrayBitmap
+ | DrawModeFlags::GrayGradient;
+ break;
+
+ case 2: // Black & White
+ aInfo.mnDrawMode = DrawModeFlags::BlackLine | DrawModeFlags::WhiteFill
+ | DrawModeFlags::BlackText | DrawModeFlags::GrayBitmap
+ | DrawModeFlags::WhiteGradient;
+ break;
+
+ default:
+ aInfo.mnDrawMode = DrawModeFlags::Default;
+ }
+
+ if (mpOptions->IsDraw())
+ PrepareStdOrNotes(PageKind::Standard, aInfo);
+ if (mpOptions->IsNotes())
+ PrepareStdOrNotes(PageKind::Notes, aInfo);
+ if (mpOptions->IsHandout())
+ {
+ InitHandoutTemplate();
+ PrepareHandout(aInfo);
+ }
+ if (mpOptions->IsOutline())
+ PrepareOutline(aInfo);
+
+ rOutliner.SetControlWord(nSavedControlWord);
+ }
+
+ /** Create the page objects of the handout template. When the actual
+ printing takes place then the page objects are assigned different
+ sets of slides for each printed page (see HandoutPrinterPage::Print).
+ */
+ void InitHandoutTemplate()
+ {
+ const sal_Int32 nSlidesPerHandout (mpOptions->GetHandoutPageCount());
+ const bool bHandoutHorizontal (mpOptions->IsHandoutHorizontal());
+
+ AutoLayout eLayout = AUTOLAYOUT_HANDOUT6;
+ switch (nSlidesPerHandout)
+ {
+ case 0: eLayout = AUTOLAYOUT_NONE; break; // AUTOLAYOUT_HANDOUT1; break;
+ case 1: eLayout = AUTOLAYOUT_HANDOUT1; break;
+ case 2: eLayout = AUTOLAYOUT_HANDOUT2; break;
+ case 3: eLayout = AUTOLAYOUT_HANDOUT3; break;
+ case 4: eLayout = AUTOLAYOUT_HANDOUT4; break;
+ default:
+ case 6: eLayout = AUTOLAYOUT_HANDOUT6; break;
+ case 9: eLayout = AUTOLAYOUT_HANDOUT9; break;
+ }
+
+ if( !mrBase.GetDocument() )
+ return;
+
+ SdDrawDocument& rModel = *mrBase.GetDocument();
+
+ // first, prepare handout page (not handout master)
+
+ SdPage* pHandout = rModel.GetSdPage(0, PageKind::Handout);
+ if( !pHandout )
+ return;
+
+ // delete all previous shapes from handout page
+ while( pHandout->GetObjCount() )
+ {
+ SdrObject* pObj = pHandout->NbcRemoveObject(0);
+ if( pObj )
+ SdrObject::Free( pObj );
+ }
+
+ const bool bDrawLines (eLayout == AUTOLAYOUT_HANDOUT3);
+
+ std::vector< ::tools::Rectangle > aAreas;
+ SdPage::CalculateHandoutAreas( rModel, eLayout, bHandoutHorizontal, aAreas );
+
+ std::vector< ::tools::Rectangle >::iterator iter( aAreas.begin() );
+ while( iter != aAreas.end() )
+ {
+ pHandout->NbcInsertObject(
+ new SdrPageObj(
+ rModel,
+ (*iter++)));
+
+ if( bDrawLines && (iter != aAreas.end()) )
+ {
+ ::tools::Rectangle aRect( *iter++ );
+
+ basegfx::B2DPolygon aPoly;
+ aPoly.insert(0, basegfx::B2DPoint( aRect.Left(), aRect.Top() ) );
+ aPoly.insert(1, basegfx::B2DPoint( aRect.Right(), aRect.Top() ) );
+
+ basegfx::B2DHomMatrix aMatrix;
+ aMatrix.translate( 0.0, static_cast< double >( aRect.GetHeight() / 7 ) );
+
+ basegfx::B2DPolyPolygon aPathPoly;
+ for( sal_uInt16 nLine = 0; nLine < 7; nLine++ )
+ {
+ aPoly.transform( aMatrix );
+ aPathPoly.append( aPoly );
+ }
+
+ SdrPathObj* pPathObj = new SdrPathObj(
+ rModel,
+ SdrObjKind::PathLine,
+ aPathPoly);
+ pPathObj->SetMergedItem(XLineStyleItem(drawing::LineStyle_SOLID));
+ pPathObj->SetMergedItem(XLineColorItem(OUString(), COL_BLACK));
+
+ pHandout->NbcInsertObject( pPathObj );
+ }
+ }
+ }
+
+ /** Detect whether the specified slide is to be printed.
+ @return
+ When the slide is not to be printed then <NULL/> is returned.
+ Otherwise a pointer to the slide is returned.
+ */
+ SdPage* GetFilteredPage (
+ const sal_Int32 nPageIndex,
+ const PageKind ePageKind) const
+ {
+ OSL_ASSERT(mrBase.GetDocument() != nullptr);
+ OSL_ASSERT(nPageIndex>=0);
+ SdPage* pPage = mrBase.GetDocument()->GetSdPage(
+ sal::static_int_cast<sal_uInt16>(nPageIndex),
+ ePageKind);
+ if (pPage == nullptr)
+ return nullptr;
+ if ( ! pPage->IsExcluded() || mpOptions->IsPrintExcluded())
+ return pPage;
+ else
+ return nullptr;
+ }
+
+ /** Prepare the outline of the document for printing. There is no fixed
+ number of slides whose outline data is put onto one printer page.
+ If the current printer page has enough room for the outline of the
+ current slide then that is added. Otherwise a new printer page is
+ started.
+ */
+ void PrepareOutline (PrintInfo const & rInfo)
+ {
+ MapMode aMap (rInfo.maMap);
+ Point aPageOfs (rInfo.mpPrinter->GetPageOffset() );
+ aMap.SetScaleX(Fraction(1,2));
+ aMap.SetScaleY(Fraction(1,2));
+ mpPrinter->SetMapMode(aMap);
+
+ ::tools::Rectangle aOutRect(aPageOfs, rInfo.mpPrinter->GetOutputSize());
+ if( aOutRect.GetWidth() > aOutRect.GetHeight() )
+ {
+ Size aPaperSize( rInfo.mpPrinter->PixelToLogic( rInfo.mpPrinter->GetPaperSizePixel(), MapMode( MapUnit::Map100thMM ) ) );
+ maPrintSize.Width = aPaperSize.Height();
+ maPrintSize.Height = aPaperSize.Width();
+ const auto nRotatedWidth = aOutRect.GetHeight();
+ const auto nRotatedHeight = aOutRect.GetWidth();
+ const auto nRotatedX = aPageOfs.Y();
+ const auto nRotatedY = aPageOfs.X();
+ aOutRect = ::tools::Rectangle(Point( nRotatedX, nRotatedY),
+ Size(nRotatedWidth, nRotatedHeight));
+ }
+
+ Outliner* pOutliner = mrBase.GetDocument()->GetInternalOutliner();
+ pOutliner->Init(OutlinerMode::OutlineView);
+ const OutlinerMode nSavedOutlMode (pOutliner->GetOutlinerMode());
+ const bool bSavedUpdateMode (pOutliner->IsUpdateLayout());
+ const Size aSavedPaperSize (pOutliner->GetPaperSize());
+ const MapMode aSavedMapMode (pOutliner->GetRefMapMode());
+ pOutliner->SetPaperSize(aOutRect.GetSize());
+ pOutliner->SetUpdateLayout(true);
+
+ ::tools::Long nPageH = aOutRect.GetHeight();
+
+ std::vector< sal_Int32 > aPages;
+ sal_Int32 nPageCount = mrBase.GetDocument()->GetSdPageCount(PageKind::Standard);
+ StringRangeEnumerator::getRangesFromString(
+ mpOptions->GetPrinterSelection(nPageCount, GetCurrentPageIndex()),
+ aPages, 0, nPageCount-1);
+
+ for (size_t nIndex = 0, nCount = aPages.size(); nIndex < nCount;)
+ {
+ pOutliner->Clear();
+
+ Paragraph* pPara = nullptr;
+ ::tools::Long nH (0);
+ while (nH < nPageH && nIndex<nCount)
+ {
+ SdPage* pPage = GetFilteredPage(aPages[nIndex], PageKind::Standard);
+ ++nIndex;
+ if (pPage == nullptr)
+ continue;
+
+ SdrTextObj* pTextObj = nullptr;
+ size_t nObj (0);
+
+ while (pTextObj==nullptr && nObj < pPage->GetObjCount())
+ {
+ SdrObject* pObj = pPage->GetObj(nObj++);
+ if (pObj->GetObjInventor() == SdrInventor::Default
+ && pObj->GetObjIdentifier() == SdrObjKind::TitleText)
+ {
+ pTextObj = dynamic_cast<SdrTextObj*>(pObj);
+ }
+ }
+
+ pPara = pOutliner->GetParagraph(pOutliner->GetParagraphCount() - 1);
+
+ if (pTextObj!=nullptr
+ && !pTextObj->IsEmptyPresObj()
+ && pTextObj->GetOutlinerParaObject())
+ {
+ pOutliner->AddText(*(pTextObj->GetOutlinerParaObject()));
+ }
+ else
+ pOutliner->Insert(OUString());
+
+ pTextObj = nullptr;
+ nObj = 0;
+
+ while (pTextObj==nullptr && nObj<pPage->GetObjCount())
+ {
+ SdrObject* pObj = pPage->GetObj(nObj++);
+ if (pObj->GetObjInventor() == SdrInventor::Default
+ && pObj->GetObjIdentifier() == SdrObjKind::OutlineText)
+ {
+ pTextObj = dynamic_cast<SdrTextObj*>(pObj);
+ }
+ }
+
+ bool bSubTitle (false);
+ if (!pTextObj)
+ {
+ bSubTitle = true;
+ pTextObj = dynamic_cast<SdrTextObj*>(pPage->GetPresObj(PresObjKind::Text)); // is there a subtitle?
+ }
+
+ sal_Int32 nParaCount1 = pOutliner->GetParagraphCount();
+
+ if (pTextObj!=nullptr
+ && !pTextObj->IsEmptyPresObj()
+ && pTextObj->GetOutlinerParaObject())
+ {
+ pOutliner->AddText(*(pTextObj->GetOutlinerParaObject()));
+ }
+
+ if (bSubTitle )
+ {
+ const sal_Int32 nParaCount2 (pOutliner->GetParagraphCount());
+ for (sal_Int32 nPara=nParaCount1; nPara<nParaCount2; ++nPara)
+ {
+ Paragraph* pP = pOutliner->GetParagraph(nPara);
+ if (pP!=nullptr && pOutliner->GetDepth(nPara) > 0)
+ pOutliner->SetDepth(pP, 0);
+ }
+ }
+
+ nH = pOutliner->GetTextHeight();
+ }
+
+ // Remove the last paragraph when that does not fit completely on
+ // the current page.
+ if (nH > nPageH && pPara!=nullptr)
+ {
+ sal_Int32 nCnt = pOutliner->GetAbsPos(
+ pOutliner->GetParagraph( pOutliner->GetParagraphCount() - 1 ) );
+ sal_Int32 nParaPos = pOutliner->GetAbsPos( pPara );
+ nCnt -= nParaPos;
+ pPara = pOutliner->GetParagraph( ++nParaPos );
+ if ( nCnt && pPara )
+ {
+ pOutliner->Remove(pPara, nCnt);
+ --nIndex;
+ }
+ }
+
+ if ( CheckForFrontBackPages( nIndex ) )
+ {
+ maPrinterPages.push_back(
+ std::make_shared<OutlinerPrinterPage>(
+ pOutliner->CreateParaObject(),
+ aMap,
+ rInfo.msTimeDate,
+ aPageOfs,
+ rInfo.mnDrawMode,
+ rInfo.meOrientation,
+ rInfo.mpPrinter->GetPaperBin()));
+ }
+ }
+
+ pOutliner->SetRefMapMode(aSavedMapMode);
+ pOutliner->SetUpdateLayout(bSavedUpdateMode);
+ pOutliner->SetPaperSize(aSavedPaperSize);
+ pOutliner->Init(nSavedOutlMode);
+ }
+
+ /** Prepare handout pages for slides that are to be printed.
+ */
+ void PrepareHandout (PrintInfo& rInfo)
+ {
+ SdDrawDocument* pDocument = mrBase.GetDocument();
+ OSL_ASSERT(pDocument != nullptr);
+ SdPage& rHandoutPage (*pDocument->GetSdPage(0, PageKind::Handout));
+
+ const bool bScalePage (mpOptions->IsPageSize());
+
+ sal_uInt16 nPaperBin;
+ if ( ! mpOptions->IsPaperBin())
+ nPaperBin = rHandoutPage.GetPaperBin();
+ else
+ nPaperBin = rInfo.mpPrinter->GetPaperBin();
+
+ // Change orientation?
+ SdPage& rMaster (dynamic_cast<SdPage&>(rHandoutPage.TRG_GetMasterPage()));
+ rInfo.meOrientation = rMaster.GetOrientation();
+
+ const Size aPaperSize (rInfo.mpPrinter->GetPaperSize());
+ if( (rInfo.meOrientation == Orientation::Landscape &&
+ (aPaperSize.Width() < aPaperSize.Height()))
+ ||
+ (rInfo.meOrientation == Orientation::Portrait &&
+ (aPaperSize.Width() > aPaperSize.Height()))
+ )
+ {
+ maPrintSize = awt::Size(aPaperSize.Height(), aPaperSize.Width());
+ }
+ else
+ {
+ maPrintSize = awt::Size(aPaperSize.Width(), aPaperSize.Height());
+ }
+
+ MapMode aMap (rInfo.maMap);
+ const Point aPageOfs (rInfo.mpPrinter->GetPageOffset());
+
+ if ( bScalePage )
+ {
+ const Size aPageSize (rHandoutPage.GetSize());
+ const Size aPrintSize (rInfo.mpPrinter->GetOutputSize());
+
+ const double fHorz = static_cast<double>(aPrintSize.Width()) / aPageSize.Width();
+ const double fVert = static_cast<double>(aPrintSize.Height()) / aPageSize.Height();
+
+ Fraction aFract;
+ if ( fHorz < fVert )
+ aFract = Fraction(aPrintSize.Width(), aPageSize.Width());
+ else
+ aFract = Fraction(aPrintSize.Height(), aPageSize.Height());
+
+ aMap.SetScaleX(aFract);
+ aMap.SetScaleY(aFract);
+ aMap.SetOrigin(Point());
+ }
+
+ std::shared_ptr<ViewShell> pViewShell (mrBase.GetMainViewShell());
+ pViewShell->WriteFrameViewData();
+
+ // Count page shapes.
+ sal_uInt32 nShapeCount (0);
+ SdrObjListIter aShapeIter (&rHandoutPage);
+ while (aShapeIter.IsMore())
+ {
+ SdrPageObj* pPageObj = dynamic_cast<SdrPageObj*>(aShapeIter.Next());
+ if (pPageObj)
+ ++nShapeCount;
+ }
+
+ const sal_uInt16 nPageCount = mrBase.GetDocument()->GetSdPageCount(PageKind::Standard);
+ const sal_uInt16 nHandoutPageCount = nShapeCount ? (nPageCount + nShapeCount - 1) / nShapeCount : 0;
+ pViewShell->SetPrintedHandoutPageCount( nHandoutPageCount );
+ mrBase.GetDocument()->setHandoutPageCount( nHandoutPageCount );
+
+ // Distribute pages to handout pages.
+ StringRangeEnumerator aRangeEnum(
+ mpOptions->GetPrinterSelection(nPageCount, GetCurrentPageIndex()),
+ 0, nPageCount-1);
+ std::vector<sal_uInt16> aPageIndices;
+ sal_uInt16 nPrinterPageIndex = 0;
+ StringRangeEnumerator::Iterator it = aRangeEnum.begin(), itEnd = aRangeEnum.end();
+ bool bLastLoop = (it == itEnd);
+ while (!bLastLoop)
+ {
+ sal_Int32 nPageIndex = *it;
+ ++it;
+ bLastLoop = (it == itEnd);
+
+ if (GetFilteredPage(nPageIndex, PageKind::Standard))
+ aPageIndices.push_back(nPageIndex);
+ else if (!bLastLoop)
+ continue;
+
+ // Create a printer page when we have found one page for each
+ // placeholder or when this is the last (and special) loop.
+ if ( !aPageIndices.empty() && CheckForFrontBackPages( nPageIndex )
+ && (aPageIndices.size() == nShapeCount || bLastLoop) )
+ {
+ maPrinterPages.push_back(
+ std::make_shared<HandoutPrinterPage>(
+ nPrinterPageIndex++,
+ std::move(aPageIndices),
+ aMap,
+ rInfo.msTimeDate,
+ aPageOfs,
+ rInfo.mnDrawMode,
+ rInfo.meOrientation,
+ nPaperBin));
+ aPageIndices.clear();
+ }
+ }
+ }
+
+ /** Prepare the notes pages or regular slides.
+ */
+ void PrepareStdOrNotes (
+ const PageKind ePageKind,
+ PrintInfo& rInfo)
+ {
+ OSL_ASSERT(rInfo.mpPrinter != nullptr);
+
+ // Fill in page kind specific data.
+ SdDrawDocument* pDocument = mrBase.GetMainViewShell()->GetDoc();
+ if (pDocument->GetSdPageCount(ePageKind) == 0)
+ return;
+ SdPage* pRefPage = pDocument->GetSdPage(0, ePageKind);
+ rInfo.maPageSize = pRefPage->GetSize();
+
+ SetupPaperOrientation(ePageKind, rInfo);
+
+ MapMode aMap (rInfo.maMap);
+ rInfo.maMap = aMap;
+
+ if (mpOptions->IsBooklet())
+ PrepareBooklet(ePageKind, rInfo);
+ else
+ PrepareRegularPages(ePageKind, rInfo);
+ }
+
+ /** Prepare slides in a non-booklet way: one slide per one to many
+ printer pages.
+ */
+ void PrepareRegularPages (
+ const PageKind ePageKind,
+ PrintInfo& rInfo)
+ {
+ std::shared_ptr<ViewShell> pViewShell (mrBase.GetMainViewShell());
+ pViewShell->WriteFrameViewData();
+
+ sal_Int32 nPageCount = mrBase.GetDocument()->GetSdPageCount(PageKind::Standard);
+ StringRangeEnumerator aRangeEnum(
+ mpOptions->GetPrinterSelection(nPageCount, GetCurrentPageIndex()),
+ 0, nPageCount-1);
+ for (StringRangeEnumerator::Iterator
+ it = aRangeEnum.begin(),
+ itEnd = aRangeEnum.end();
+ it != itEnd;
+ ++it)
+ {
+ SdPage* pPage = GetFilteredPage(*it, ePageKind);
+ if (pPage == nullptr)
+ continue;
+
+ MapMode aMap (rInfo.maMap);
+ // is it possible that the page size changed?
+ const Size aPageSize = pPage->GetSize();
+
+ if (mpOptions->IsPageSize())
+ {
+ const double fHorz (static_cast<double>(rInfo.maPrintSize.Width()) / aPageSize.Width());
+ const double fVert (static_cast<double>(rInfo.maPrintSize.Height()) / aPageSize.Height());
+
+ Fraction aFract;
+ if (fHorz < fVert)
+ aFract = Fraction(rInfo.maPrintSize.Width(), aPageSize.Width());
+ else
+ aFract = Fraction(rInfo.maPrintSize.Height(), aPageSize.Height());
+
+ aMap.SetScaleX(aFract);
+ aMap.SetScaleY(aFract);
+ aMap.SetOrigin(Point());
+ }
+
+ if (mpOptions->IsPrintPageName())
+ {
+ rInfo.msPageString = pPage->GetName() + " ";
+ }
+ else
+ rInfo.msPageString.clear();
+ rInfo.msPageString += rInfo.msTimeDate;
+
+ ::tools::Long aPageWidth = aPageSize.Width() - pPage->GetLeftBorder() - pPage->GetRightBorder();
+ ::tools::Long aPageHeight = aPageSize.Height() - pPage->GetUpperBorder() - pPage->GetLowerBorder();
+ // Bugfix for 44530:
+ // if it was implicitly changed (Landscape/Portrait),
+ // this is considered for tiling, respectively for the splitting up
+ // (Poster)
+ if( ( rInfo.maPrintSize.Width() > rInfo.maPrintSize.Height()
+ && aPageWidth < aPageHeight )
+ || ( rInfo.maPrintSize.Width() < rInfo.maPrintSize.Height()
+ && aPageWidth > aPageHeight ) )
+ {
+ const sal_Int32 nTmp (rInfo.maPrintSize.Width());
+ rInfo.maPrintSize.setWidth( rInfo.maPrintSize.Height() );
+ rInfo.maPrintSize.setHeight( nTmp );
+ }
+
+ if (mpOptions->IsTilePage()
+ && aPageWidth < rInfo.maPrintSize.Width()
+ && aPageHeight < rInfo.maPrintSize.Height())
+ {
+ // Put multiple slides on one printer page.
+ PrepareTiledPage(*it, *pPage, ePageKind, rInfo);
+ }
+ else
+ {
+ rInfo.maMap = aMap;
+ PrepareScaledPage(*it, *pPage, ePageKind, rInfo);
+ }
+ }
+ }
+
+ /** Put two slides on one printer page.
+ */
+ void PrepareBooklet (
+ const PageKind ePageKind,
+ const PrintInfo& rInfo)
+ {
+ MapMode aStdMap (rInfo.maMap);
+ Point aOffset;
+ Size aPrintSize_2 (rInfo.maPrintSize);
+ Size aPageSize_2 (rInfo.maPageSize);
+
+ if (rInfo.meOrientation == Orientation::Landscape)
+ aPrintSize_2.setWidth( aPrintSize_2.Width() >> 1 );
+ else
+ aPrintSize_2.setHeight( aPrintSize_2.Height() >> 1 );
+
+ const double fPageWH = static_cast<double>(aPageSize_2.Width()) / aPageSize_2.Height();
+ const double fPrintWH = static_cast<double>(aPrintSize_2.Width()) / aPrintSize_2.Height();
+
+ if( fPageWH < fPrintWH )
+ {
+ aPageSize_2.setWidth( static_cast<::tools::Long>( aPrintSize_2.Height() * fPageWH ) );
+ aPageSize_2.setHeight( aPrintSize_2.Height() );
+ }
+ else
+ {
+ aPageSize_2.setWidth( aPrintSize_2.Width() );
+ aPageSize_2.setHeight( static_cast<::tools::Long>( aPrintSize_2.Width() / fPageWH ) );
+ }
+
+ MapMode aMap (rInfo.maMap);
+ aMap.SetScaleX( Fraction( aPageSize_2.Width(), rInfo.maPageSize.Width() ) );
+ aMap.SetScaleY( Fraction( aPageSize_2.Height(), rInfo.maPageSize.Height() ) );
+
+ // calculate adjusted print size
+ const Size aAdjustedPrintSize (OutputDevice::LogicToLogic(
+ rInfo.maPrintSize,
+ aStdMap,
+ aMap));
+
+ if (rInfo.meOrientation == Orientation::Landscape)
+ {
+ aOffset.setX( ( ( aAdjustedPrintSize.Width() >> 1 ) - rInfo.maPageSize.Width() ) >> 1 );
+ aOffset.setY( ( aAdjustedPrintSize.Height() - rInfo.maPageSize.Height() ) >> 1 );
+ }
+ else
+ {
+ aOffset.setX( ( aAdjustedPrintSize.Width() - rInfo.maPageSize.Width() ) >> 1 );
+ aOffset.setY( ( ( aAdjustedPrintSize.Height() >> 1 ) - rInfo.maPageSize.Height() ) >> 1 );
+ }
+
+ // create vector of pages to print
+ sal_Int32 nPageCount = mrBase.GetDocument()->GetSdPageCount(ePageKind);
+ StringRangeEnumerator aRangeEnum(
+ mpOptions->GetPrinterSelection(nPageCount, GetCurrentPageIndex()),
+ 0, nPageCount-1);
+ std::vector< sal_uInt16 > aPageVector;
+ for (StringRangeEnumerator::Iterator
+ it = aRangeEnum.begin(),
+ itEnd = aRangeEnum.end();
+ it != itEnd;
+ ++it)
+ {
+ SdPage* pPage = GetFilteredPage(*it, ePageKind);
+ if (pPage != nullptr)
+ aPageVector.push_back(*it);
+ }
+
+ // create pairs of pages to print on each page
+ std::vector< std::pair< sal_uInt16, sal_uInt16 > > aPairVector;
+ if ( ! aPageVector.empty())
+ {
+ sal_uInt32 nFirstIndex = 0, nLastIndex = aPageVector.size() - 1;
+
+ if( aPageVector.size() & 1 )
+ aPairVector.emplace_back( sal_uInt16(65535), aPageVector[ nFirstIndex++ ] );
+ else
+ aPairVector.emplace_back( aPageVector[ nLastIndex-- ], aPageVector[ nFirstIndex++ ] );
+
+ while( nFirstIndex < nLastIndex )
+ {
+ if( nFirstIndex & 1 )
+ aPairVector.emplace_back( aPageVector[ nFirstIndex++ ], aPageVector[ nLastIndex-- ] );
+ else
+ aPairVector.emplace_back( aPageVector[ nLastIndex-- ], aPageVector[ nFirstIndex++ ] );
+ }
+ }
+
+ for (sal_uInt32
+ nIndex=0,
+ nCount=aPairVector.size();
+ nIndex < nCount;
+ ++nIndex)
+ {
+ if ( CheckForFrontBackPages( nIndex ) )
+ {
+ const std::pair<sal_uInt16, sal_uInt16> aPair (aPairVector[nIndex]);
+ Point aSecondOffset (aOffset);
+ if (rInfo.meOrientation == Orientation::Landscape)
+ aSecondOffset.AdjustX( aAdjustedPrintSize.Width() / 2 );
+ else
+ aSecondOffset.AdjustY( aAdjustedPrintSize.Height() / 2 );
+ maPrinterPages.push_back(
+ std::make_shared<BookletPrinterPage>(
+ aPair.first,
+ aPair.second,
+ aOffset,
+ aSecondOffset,
+ ePageKind,
+ aMap,
+ rInfo.mbPrintMarkedOnly,
+ rInfo.mnDrawMode,
+ rInfo.meOrientation,
+ rInfo.mpPrinter->GetPaperBin()));
+
+ }
+ }
+ }
+
+ /** Print one slide multiple times on one printer page so that the whole
+ printer page is covered.
+ */
+ void PrepareTiledPage (
+ const sal_Int32 nPageIndex,
+ const SdPage& rPage,
+ const PageKind ePageKind,
+ const PrintInfo& rInfo)
+ {
+ sal_uInt16 nPaperBin;
+ if ( ! mpOptions->IsPaperBin())
+ nPaperBin = rPage.GetPaperBin();
+ else
+ nPaperBin = rInfo.mpPrinter->GetPaperBin();
+
+ if ( !CheckForFrontBackPages( nPageIndex ) )
+ return;
+
+ maPrinterPages.push_back(
+ std::make_shared<TiledPrinterPage>(
+ sal::static_int_cast<sal_uInt16>(nPageIndex),
+ ePageKind,
+ rInfo.mbPrintMarkedOnly,
+ rInfo.msPageString,
+ rInfo.mpPrinter->GetPageOffset(),
+ rInfo.mnDrawMode,
+ rInfo.meOrientation,
+ nPaperBin));
+ }
+
+ /** Print one standard slide or notes page on one to many printer
+ pages. More than on printer page is used when the slide is larger
+ than the printable area.
+ */
+ void PrepareScaledPage (
+ const sal_Int32 nPageIndex,
+ const SdPage& rPage,
+ const PageKind ePageKind,
+ const PrintInfo& rInfo)
+ {
+ const Point aPageOffset (rInfo.mpPrinter->GetPageOffset());
+
+ sal_uInt16 nPaperBin;
+ if ( ! mpOptions->IsPaperBin())
+ nPaperBin = rPage.GetPaperBin();
+ else
+ nPaperBin = rInfo.mpPrinter->GetPaperBin();
+
+ // For pages larger then the printable area there
+ // are three options:
+ // 1. Scale down to the page to the printable area.
+ // 2. Print only the upper left part of the page
+ // (without the unprintable borders).
+ // 3. Split the page into parts of the size of the
+ // printable area.
+ const bool bScalePage (mpOptions->IsPageSize());
+ const bool bCutPage (mpOptions->IsCutPage());
+ MapMode aMap (rInfo.maMap);
+ if ( (bScalePage || bCutPage) && CheckForFrontBackPages( nPageIndex ) )
+ {
+ // Handle 1 and 2.
+
+ // if CutPage is set then do not move it, otherwise move the
+ // scaled page to printable area
+ maPrinterPages.push_back(
+ std::make_shared<RegularPrinterPage>(
+ sal::static_int_cast<sal_uInt16>(nPageIndex),
+ ePageKind,
+ aMap,
+ rInfo.mbPrintMarkedOnly,
+ rInfo.msPageString,
+ aPageOffset,
+ rInfo.mnDrawMode,
+ rInfo.meOrientation,
+ nPaperBin));
+ }
+ else
+ {
+ // Handle 3. Print parts of the page in the size of the
+ // printable area until the whole page is covered.
+
+ // keep the page content at its position if it fits, otherwise
+ // move it to the printable area
+ const ::tools::Long nPageWidth (
+ rInfo.maPageSize.Width() - rPage.GetLeftBorder() - rPage.GetRightBorder());
+ const ::tools::Long nPageHeight (
+ rInfo.maPageSize.Height() - rPage.GetUpperBorder() - rPage.GetLowerBorder());
+
+ Point aOrigin ( 0, 0 );
+
+ for (Point aPageOrigin = aOrigin;
+ -aPageOrigin.Y()<nPageHeight;
+ aPageOrigin.AdjustY( -rInfo.maPrintSize.Height() ))
+ {
+ for (aPageOrigin.setX(aOrigin.X());
+ -aPageOrigin.X()<nPageWidth;
+ aPageOrigin.AdjustX(-rInfo.maPrintSize.Width()))
+ {
+ if ( CheckForFrontBackPages( nPageIndex ) )
+ {
+ aMap.SetOrigin(aPageOrigin);
+ maPrinterPages.push_back(
+ std::make_shared<RegularPrinterPage>(
+ sal::static_int_cast<sal_uInt16>(nPageIndex),
+ ePageKind,
+ aMap,
+ rInfo.mbPrintMarkedOnly,
+ rInfo.msPageString,
+ aPageOffset,
+ rInfo.mnDrawMode,
+ rInfo.meOrientation,
+ nPaperBin));
+ }
+ }
+ }
+ }
+ }
+
+bool CheckForFrontBackPages( sal_Int32 nPage )
+{
+ const bool bIsIndexOdd(nPage & 1);
+ if ((!bIsIndexOdd && mpOptions->IsPrintFrontPage())
+ || (bIsIndexOdd && mpOptions->IsPrintBackPage()))
+ {
+ return true;
+ }
+ else
+ return false;
+}
+};
+
+//===== DocumentRenderer ======================================================
+
+DocumentRenderer::DocumentRenderer (ViewShellBase& rBase)
+ : mpImpl(new Implementation(rBase))
+{
+}
+
+DocumentRenderer::~DocumentRenderer()
+{
+}
+
+//----- XRenderable -----------------------------------------------------------
+
+sal_Int32 SAL_CALL DocumentRenderer::getRendererCount (
+ const css::uno::Any&,
+ const css::uno::Sequence<css::beans::PropertyValue >& rOptions)
+{
+ mpImpl->ProcessProperties(rOptions);
+ return mpImpl->GetPrintPageCount();
+}
+
+Sequence<beans::PropertyValue> SAL_CALL DocumentRenderer::getRenderer (
+ sal_Int32,
+ const css::uno::Any&,
+ const css::uno::Sequence<css::beans::PropertyValue>& rOptions)
+{
+ mpImpl->ProcessProperties(rOptions);
+ return mpImpl->GetProperties();
+}
+
+void SAL_CALL DocumentRenderer::render (
+ sal_Int32 nRenderer,
+ const css::uno::Any&,
+ const css::uno::Sequence<css::beans::PropertyValue>& rOptions)
+{
+ mpImpl->ProcessProperties(rOptions);
+ mpImpl->PrintPage(nRenderer);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/FormShellManager.cxx b/sd/source/ui/view/FormShellManager.cxx
new file mode 100644
index 000000000..3efa9bed7
--- /dev/null
+++ b/sd/source/ui/view/FormShellManager.cxx
@@ -0,0 +1,319 @@
+/* -*- 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 <FormShellManager.hxx>
+
+#include <EventMultiplexer.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShellManager.hxx>
+#include <Window.hxx>
+#include <vcl/vclevent.hxx>
+#include <svx/fmshell.hxx>
+#include <osl/diagnose.h>
+
+namespace sd {
+
+namespace {
+
+/** This factory is responsible for creating and deleting the FmFormShell.
+*/
+class FormShellManagerFactory
+ : public ::sd::ShellFactory<SfxShell>
+{
+public:
+ FormShellManagerFactory (ViewShell& rViewShell, FormShellManager& rManager);
+ virtual FmFormShell* CreateShell (ShellId nId) override;
+ virtual void ReleaseShell (SfxShell* pShell) override;
+
+private:
+ ::sd::ViewShell& mrViewShell;
+ FormShellManager& mrFormShellManager;
+};
+
+} // end of anonymous namespace
+
+FormShellManager::FormShellManager (ViewShellBase& rBase)
+ : mrBase(rBase),
+ mpFormShell(nullptr),
+ mbFormShellAboveViewShell(false),
+ mbIsMainViewChangePending(false),
+ mpMainViewShellWindow(nullptr)
+{
+ // Register at the EventMultiplexer to be informed about changes in the
+ // center pane.
+ Link<sd::tools::EventMultiplexerEvent&,void> aLink (LINK(this, FormShellManager, ConfigurationUpdateHandler));
+ mrBase.GetEventMultiplexer()->AddEventListener(aLink);
+
+ RegisterAtCenterPane();
+}
+
+FormShellManager::~FormShellManager()
+{
+ SetFormShell(nullptr);
+ UnregisterAtCenterPane();
+
+ // Unregister from the EventMultiplexer.
+ Link<sd::tools::EventMultiplexerEvent&,void> aLink (LINK(this, FormShellManager, ConfigurationUpdateHandler));
+ mrBase.GetEventMultiplexer()->RemoveEventListener(aLink);
+
+ if (mpSubShellFactory)
+ {
+ ViewShell* pShell = mrBase.GetMainViewShell().get();
+ if (pShell != nullptr)
+ mrBase.GetViewShellManager()->RemoveSubShellFactory(pShell,mpSubShellFactory);
+ }
+}
+
+void FormShellManager::SetFormShell (FmFormShell* pFormShell)
+{
+ if (mpFormShell == pFormShell)
+ return;
+
+ // Disconnect from the old form shell.
+ if (mpFormShell != nullptr)
+ {
+ mpFormShell->SetControlActivationHandler(Link<LinkParamNone*,void>());
+ EndListening(*mpFormShell);
+ mpFormShell->SetView(nullptr);
+ }
+
+ mpFormShell = pFormShell;
+
+ // Connect to the new form shell.
+ if (mpFormShell != nullptr)
+ {
+ mpFormShell->SetControlActivationHandler(
+ LINK(
+ this,
+ FormShellManager,
+ FormControlActivated));
+ StartListening(*mpFormShell);
+
+ ViewShell* pMainViewShell = mrBase.GetMainViewShell().get();
+ if (pMainViewShell != nullptr)
+ {
+ // Prevent setting the view twice at the FmFormShell.
+ FmFormView* pFormView = pMainViewShell->GetView();
+ if (mpFormShell->GetFormView() != pFormView)
+ mpFormShell->SetView(pFormView);
+ }
+ }
+
+ // Tell the ViewShellManager where on the stack to place the form shell.
+ mrBase.GetViewShellManager()->SetFormShell(
+ mrBase.GetMainViewShell().get(),
+ mpFormShell,
+ mbFormShellAboveViewShell);
+}
+
+void FormShellManager::RegisterAtCenterPane()
+{
+ ViewShell* pShell = mrBase.GetMainViewShell().get();
+ if (pShell == nullptr)
+ return;
+
+ // No form shell for the slide sorter. Besides that it is not
+ // necessary, using both together results in crashes.
+ if (pShell->GetShellType() == ViewShell::ST_SLIDE_SORTER)
+ return;
+
+ mpMainViewShellWindow = pShell->GetActiveWindow();
+ if (mpMainViewShellWindow == nullptr)
+ return;
+
+ // Register at the window to get informed when to move the form
+ // shell to the bottom of the shell stack.
+ mpMainViewShellWindow->AddEventListener(
+ LINK(
+ this,
+ FormShellManager,
+ WindowEventHandler));
+
+ // Create a shell factory and with it activate the form shell.
+ OSL_ASSERT(!mpSubShellFactory);
+ mpSubShellFactory = std::make_shared<FormShellManagerFactory>(*pShell, *this);
+ mrBase.GetViewShellManager()->AddSubShellFactory(pShell,mpSubShellFactory);
+ mrBase.GetViewShellManager()->ActivateSubShell(*pShell, ToolbarId::FormLayer_Toolbox);
+}
+
+void FormShellManager::UnregisterAtCenterPane()
+{
+ if (mpMainViewShellWindow != nullptr)
+ {
+ // Unregister from the window.
+ mpMainViewShellWindow->RemoveEventListener(
+ LINK(
+ this,
+ FormShellManager,
+ WindowEventHandler));
+ mpMainViewShellWindow = nullptr;
+ }
+
+ // Unregister form at the form shell.
+ SetFormShell(nullptr);
+
+ // Deactivate the form shell and destroy the shell factory.
+ ViewShell* pShell = mrBase.GetMainViewShell().get();
+ if (pShell != nullptr)
+ {
+ mrBase.GetViewShellManager()->DeactivateSubShell(*pShell, ToolbarId::FormLayer_Toolbox);
+ mrBase.GetViewShellManager()->RemoveSubShellFactory(pShell, mpSubShellFactory);
+ }
+
+ mpSubShellFactory.reset();
+}
+
+IMPL_LINK_NOARG(FormShellManager, FormControlActivated, LinkParamNone*, void)
+{
+ // The form shell has been activated. To give it priority in reacting to
+ // slot calls the form shell is moved to the top of the object bar shell
+ // stack.
+ ViewShell* pShell = mrBase.GetMainViewShell().get();
+ if (pShell!=nullptr && !mbFormShellAboveViewShell)
+ {
+ mbFormShellAboveViewShell = true;
+
+ ViewShellManager::UpdateLock aLock (mrBase.GetViewShellManager());
+ mrBase.GetViewShellManager()->SetFormShell(pShell,mpFormShell,mbFormShellAboveViewShell);
+ }
+}
+
+IMPL_LINK(FormShellManager, ConfigurationUpdateHandler, sd::tools::EventMultiplexerEvent&, rEvent, void)
+{
+ switch (rEvent.meEventId)
+ {
+ case EventMultiplexerEventId::MainViewRemoved:
+ UnregisterAtCenterPane();
+ break;
+
+ case EventMultiplexerEventId::MainViewAdded:
+ mbIsMainViewChangePending = true;
+ break;
+
+ case EventMultiplexerEventId::ConfigurationUpdated:
+ if (mbIsMainViewChangePending)
+ {
+ mbIsMainViewChangePending = false;
+ RegisterAtCenterPane();
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+IMPL_LINK(FormShellManager, WindowEventHandler, VclWindowEvent&, rEvent, void)
+{
+ switch (rEvent.GetId())
+ {
+ case VclEventId::WindowGetFocus:
+ {
+ // The window of the center pane got the focus. Therefore
+ // the form shell is moved to the bottom of the object bar
+ // stack.
+ ViewShell* pShell = mrBase.GetMainViewShell().get();
+ if (pShell!=nullptr && mbFormShellAboveViewShell)
+ {
+ mbFormShellAboveViewShell = false;
+ ViewShellManager::UpdateLock aLock (mrBase.GetViewShellManager());
+ mrBase.GetViewShellManager()->SetFormShell(
+ pShell,
+ mpFormShell,
+ mbFormShellAboveViewShell);
+ }
+ }
+ break;
+
+ case VclEventId::WindowLoseFocus:
+ // We follow the sloppy focus policy. Losing the focus is
+ // ignored. We wait for the focus to be placed either in
+ // the window or the form shell. The later, however, is
+ // notified over the FormControlActivated handler, not this
+ // one.
+ break;
+
+ case VclEventId::ObjectDying:
+ mpMainViewShellWindow = nullptr;
+ break;
+
+ default: break;
+ }
+}
+
+void FormShellManager::Notify(SfxBroadcaster&, const SfxHint& rHint)
+{
+ if (rHint.GetId()!=SfxHintId::Dying)
+ return;
+
+ // If all goes well this listener is called after the
+ // FormShellManager was notified about the dying form shell by the
+ // FormShellManagerFactory.
+ OSL_ASSERT(mpFormShell==nullptr);
+ if (mpFormShell != nullptr)
+ {
+ mpFormShell = nullptr;
+ mrBase.GetViewShellManager()->SetFormShell(
+ mrBase.GetMainViewShell().get(),
+ nullptr,
+ false);
+ }
+}
+
+//===== FormShellManagerFactory ===============================================
+
+namespace {
+
+FormShellManagerFactory::FormShellManagerFactory (
+ ::sd::ViewShell& rViewShell,
+ FormShellManager& rManager)
+ : mrViewShell(rViewShell),
+ mrFormShellManager(rManager)
+{
+}
+
+FmFormShell* FormShellManagerFactory::CreateShell( ::sd::ShellId nId )
+{
+ FmFormShell* pShell = nullptr;
+
+ ::sd::View* pView = mrViewShell.GetView();
+ if (nId == ToolbarId::FormLayer_Toolbox)
+ {
+ pShell = new FmFormShell(&mrViewShell.GetViewShellBase(), pView);
+ mrFormShellManager.SetFormShell(pShell);
+ }
+
+ return pShell;
+}
+
+void FormShellManagerFactory::ReleaseShell (SfxShell* pShell)
+{
+ if (pShell != nullptr)
+ {
+ mrFormShellManager.SetFormShell(nullptr);
+ delete pShell;
+ }
+}
+
+} // end of anonymous namespace
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/GraphicObjectBar.cxx b/sd/source/ui/view/GraphicObjectBar.cxx
new file mode 100644
index 000000000..60cab73f7
--- /dev/null
+++ b/sd/source/ui/view/GraphicObjectBar.cxx
@@ -0,0 +1,141 @@
+/* -*- 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 <GraphicObjectBar.hxx>
+
+#include <sfx2/shell.hxx>
+#include <svx/svxids.hrc>
+#include <sfx2/request.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/grfflt.hxx>
+#include <svx/grafctrl.hxx>
+
+#include <sfx2/objface.hxx>
+
+#include <strings.hrc>
+#include <DrawDocShell.hxx>
+#include <ViewShell.hxx>
+#include <sdresid.hxx>
+
+using namespace sd;
+#define ShellClass_GraphicObjectBar
+#include <sdslots.hxx>
+
+namespace sd {
+
+
+SFX_IMPL_INTERFACE(GraphicObjectBar, SfxShell)
+
+void GraphicObjectBar::InitInterface_Impl()
+{
+}
+
+
+GraphicObjectBar::GraphicObjectBar (
+ const ViewShell* pSdViewShell,
+ ::sd::View* pSdView )
+ : SfxShell (pSdViewShell->GetViewShell()),
+ mpView ( pSdView )
+{
+ DrawDocShell* pDocShell = pSdViewShell->GetDocSh();
+
+ SetPool( &pDocShell->GetPool() );
+ SetUndoManager( pDocShell->GetUndoManager() );
+ SetRepeatTarget( mpView );
+ SetName( "Graphic objectbar");
+}
+
+GraphicObjectBar::~GraphicObjectBar()
+{
+ SetRepeatTarget( nullptr );
+}
+
+void GraphicObjectBar::GetAttrState( SfxItemSet& rSet )
+{
+ if( mpView )
+ SvxGrafAttrHelper::GetGrafAttrState( rSet, *mpView );
+}
+
+void GraphicObjectBar::Execute( SfxRequest& rReq )
+{
+ if( mpView )
+ {
+ SvxGrafAttrHelper::ExecuteGrafAttr( rReq, *mpView );
+ Invalidate();
+ }
+}
+
+void GraphicObjectBar::GetFilterState( SfxItemSet& rSet )
+{
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ bool bEnable = false;
+
+ if( rMarkList.GetMarkCount() == 1 )
+ {
+ SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
+
+ if( auto pGrafObj = dynamic_cast< SdrGrafObj *>( pObj ) )
+ if( pGrafObj->GetGraphicType() == GraphicType::Bitmap )
+ bEnable = true;
+ }
+
+ if( !bEnable )
+ SvxGraphicFilter::DisableGraphicFilterSlots( rSet );
+}
+
+void GraphicObjectBar::ExecuteFilter( SfxRequest const & rReq )
+{
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ if( rMarkList.GetMarkCount() == 1 )
+ {
+ SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
+
+ if( auto pGrafObj = dynamic_cast< SdrGrafObj *>( pObj ) )
+ if( pGrafObj->GetGraphicType() == GraphicType::Bitmap )
+ {
+ GraphicObject aFilterObj( pGrafObj->GetGraphicObject() );
+
+ if( SvxGraphicFilterResult::NONE ==
+ SvxGraphicFilter::ExecuteGrfFilterSlot( rReq, aFilterObj ) )
+ {
+ SdrPageView* pPageView = mpView->GetSdrPageView();
+
+ if( pPageView )
+ {
+ SdrGrafObj* pFilteredObj = static_cast<SdrGrafObj*>( pObj->CloneSdrObject(pObj->getSdrModelFromSdrObject()) );
+ OUString aStr = mpView->GetDescriptionOfMarkedObjects() +
+ " " + SdResId(STR_UNDO_GRAFFILTER);
+ mpView->BegUndo( aStr );
+ pFilteredObj->SetGraphicObject( aFilterObj );
+ ::sd::View* const pView = mpView;
+ pView->ReplaceObjectAtView( pObj, *pPageView, pFilteredObj );
+ pView->EndUndo();
+ return;
+ }
+ }
+ }
+ }
+
+ Invalidate();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/GraphicViewShellBase.cxx b/sd/source/ui/view/GraphicViewShellBase.cxx
new file mode 100644
index 000000000..d58c8a0d2
--- /dev/null
+++ b/sd/source/ui/view/GraphicViewShellBase.cxx
@@ -0,0 +1,93 @@
+/* -*- 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 <GraphicViewShellBase.hxx>
+
+#include <GraphicDocShell.hxx>
+#include <app.hrc>
+#include <framework/DrawModule.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfac.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/viewsh.hxx>
+
+namespace sd
+{
+// We have to expand the SFX_IMPL_VIEWFACTORY macro to call LateInit() after a
+// new GraphicViewShellBase object has been constructed.
+
+SfxViewFactory* GraphicViewShellBase::s_pFactory;
+SfxViewShell* GraphicViewShellBase::CreateInstance(SfxViewFrame* pFrame, SfxViewShell* pOldView)
+{
+ GraphicViewShellBase* pBase = new GraphicViewShellBase(pFrame, pOldView);
+ pBase->LateInit(framework::FrameworkHelper::msDrawViewURL);
+ return pBase;
+}
+void GraphicViewShellBase::RegisterFactory(SfxInterfaceId nPrio)
+{
+ s_pFactory = new SfxViewFactory(&CreateInstance, nPrio, "Default");
+ InitFactory();
+}
+void GraphicViewShellBase::InitFactory() { SFX_VIEW_REGISTRATION(GraphicDocShell); }
+
+GraphicViewShellBase::GraphicViewShellBase(SfxViewFrame* _pFrame, SfxViewShell* pOldShell)
+ : ViewShellBase(_pFrame, pOldShell)
+{
+}
+
+GraphicViewShellBase::~GraphicViewShellBase() {}
+
+void GraphicViewShellBase::Execute(SfxRequest& rRequest)
+{
+ sal_uInt16 nSlotId = rRequest.GetSlot();
+
+ switch (nSlotId)
+ {
+ case SID_NOTES_WINDOW:
+ case SID_SLIDE_SORTER_MULTI_PANE_GUI:
+ case SID_SLIDE_SORTER_MODE:
+ case SID_SLIDE_MASTER_MODE:
+ case SID_OUTLINE_MODE:
+ case SID_NOTES_MODE:
+ case SID_NOTES_MASTER_MODE:
+ case SID_HANDOUT_MASTER_MODE:
+ // Prevent some Impress-only slots from being executed.
+ rRequest.Cancel();
+ break;
+
+ case SID_SWITCH_SHELL:
+ case SID_LEFT_PANE_DRAW:
+ case SID_LEFT_PANE_IMPRESS:
+ default:
+ // The remaining requests are forwarded to our base class.
+ ViewShellBase::Execute(rRequest);
+ break;
+ }
+}
+
+void GraphicViewShellBase::InitializeFramework()
+{
+ css::uno::Reference<css::frame::XController> xController(GetController());
+ sd::framework::DrawModule::Initialize(xController);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/ImpressViewShellBase.cxx b/sd/source/ui/view/ImpressViewShellBase.cxx
new file mode 100644
index 000000000..96b0b5aa9
--- /dev/null
+++ b/sd/source/ui/view/ImpressViewShellBase.cxx
@@ -0,0 +1,97 @@
+/* -*- 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 <ImpressViewShellBase.hxx>
+
+#include <DrawDocShell.hxx>
+#include <app.hrc>
+#include <framework/FrameworkHelper.hxx>
+#include <framework/ImpressModule.hxx>
+#include <MasterPageObserver.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfac.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/viewsh.hxx>
+#include <comphelper/lok.hxx>
+
+namespace sd {
+
+
+// We have to expand the SFX_IMPL_VIEWFACTORY macro to call LateInit() after a
+// new ImpressViewShellBase object has been constructed.
+
+SfxViewFactory* ImpressViewShellBase::s_pFactory;
+SfxViewShell* ImpressViewShellBase::CreateInstance (
+ SfxViewFrame *pFrame, SfxViewShell *pOldView)
+{
+ ImpressViewShellBase* pBase = new ImpressViewShellBase(pFrame, pOldView);
+ pBase->LateInit(comphelper::LibreOfficeKit::isActive() ? framework::FrameworkHelper::msImpressViewURL : "");
+ return pBase;
+}
+void ImpressViewShellBase::RegisterFactory( SfxInterfaceId nPrio )
+{
+ s_pFactory = new SfxViewFactory(&CreateInstance,nPrio,"Default");
+ InitFactory();
+}
+void ImpressViewShellBase::InitFactory()
+{
+ SFX_VIEW_REGISTRATION(DrawDocShell);
+}
+
+ImpressViewShellBase::ImpressViewShellBase (
+ SfxViewFrame* _pFrame,
+ SfxViewShell* pOldShell)
+ : ViewShellBase (_pFrame, pOldShell)
+{
+ MasterPageObserver::Instance().RegisterDocument (*GetDocShell()->GetDoc());
+}
+
+ImpressViewShellBase::~ImpressViewShellBase()
+{
+ MasterPageObserver::Instance().UnregisterDocument (*GetDocShell()->GetDoc());
+}
+
+void ImpressViewShellBase::Execute (SfxRequest& rRequest)
+{
+ sal_uInt16 nSlotId = rRequest.GetSlot();
+
+ switch (nSlotId)
+ {
+ case SID_LEFT_PANE_DRAW:
+ // Prevent a Draw-only slots from being executed.
+ rRequest.Cancel();
+ break;
+
+ default:
+ // The remaining requests are forwarded to our base class.
+ ViewShellBase::Execute(rRequest);
+ break;
+ }
+}
+
+void ImpressViewShellBase::InitializeFramework()
+{
+ css::uno::Reference<css::frame::XController>
+ xController (GetController());
+ sd::framework::ImpressModule::Initialize(xController);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/MediaObjectBar.cxx b/sd/source/ui/view/MediaObjectBar.cxx
new file mode 100644
index 000000000..232535240
--- /dev/null
+++ b/sd/source/ui/view/MediaObjectBar.cxx
@@ -0,0 +1,77 @@
+/* -*- 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 <MediaObjectBar.hxx>
+#include <avmedia/mediaitem.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <sfx2/objface.hxx>
+#include <svx/MediaShellHelpers.hxx>
+
+#include <strings.hrc>
+#include <DrawDocShell.hxx>
+#include <ViewShell.hxx>
+#include <sdresid.hxx>
+#include <drawdoc.hxx>
+
+using namespace sd;
+using namespace svx;
+
+#define ShellClass_MediaObjectBar
+#include <sdslots.hxx>
+
+namespace sd
+{
+SFX_IMPL_INTERFACE(MediaObjectBar, SfxShell)
+
+void MediaObjectBar::InitInterface_Impl() {}
+
+MediaObjectBar::MediaObjectBar(const ViewShell* pSdViewShell, ::sd::View* pSdView)
+ : SfxShell(pSdViewShell->GetViewShell())
+ , mpView(pSdView)
+{
+ DrawDocShell* pDocShell = pSdViewShell->GetDocSh();
+
+ SetPool(&pDocShell->GetPool());
+ SetUndoManager(pDocShell->GetUndoManager());
+ SetRepeatTarget(mpView);
+ SetName(SdResId(RID_DRAW_MEDIA_TOOLBOX));
+}
+
+MediaObjectBar::~MediaObjectBar() { SetRepeatTarget(nullptr); }
+
+void MediaObjectBar::GetState(SfxItemSet& rSet) { MediaShellHelpers::GetState(mpView, rSet); }
+
+void MediaObjectBar::Execute(SfxRequest const& rReq)
+{
+ const ::avmedia::MediaItem* pMediaItem = MediaShellHelpers::Execute(mpView, rReq);
+ if (!pMediaItem)
+ return;
+
+ //if only changing state then don't set modified flag (e.g. playing a video)
+ if (!(pMediaItem->getMaskSet() & AVMediaSetMask::STATE))
+ {
+ //fdo #32598: after changing playback opts, set document's modified flag
+ SdDrawDocument& rDoc = mpView->GetDoc();
+ rDoc.SetChanged();
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/OutlineViewShellBase.cxx b/sd/source/ui/view/OutlineViewShellBase.cxx
new file mode 100644
index 000000000..8da1bcbca
--- /dev/null
+++ b/sd/source/ui/view/OutlineViewShellBase.cxx
@@ -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/.
+ *
+ * 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 <OutlineViewShellBase.hxx>
+#include <DrawDocShell.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <sfx2/viewfac.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/viewsh.hxx>
+
+namespace sd {
+
+class DrawDocShell;
+
+
+// We have to expand the SFX_IMPL_VIEWFACTORY macro to call LateInit() after a
+// new OutlineViewShellBase object has been constructed.
+
+SfxViewFactory* OutlineViewShellBase::s_pFactory;
+SfxViewShell* OutlineViewShellBase::CreateInstance (
+ SfxViewFrame *pFrame, SfxViewShell *pOldView)
+{
+ OutlineViewShellBase* pBase = new OutlineViewShellBase(pFrame, pOldView);
+ pBase->LateInit(framework::FrameworkHelper::msOutlineViewURL);
+ return pBase;
+}
+void OutlineViewShellBase::RegisterFactory( SfxInterfaceId nPrio )
+{
+ s_pFactory = new SfxViewFactory(&CreateInstance,nPrio,"Outline");
+ InitFactory();
+}
+void OutlineViewShellBase::InitFactory()
+{
+ SFX_VIEW_REGISTRATION(DrawDocShell);
+}
+
+OutlineViewShellBase::OutlineViewShellBase (
+ SfxViewFrame* _pFrame,
+ SfxViewShell* pOldShell)
+ : ImpressViewShellBase (_pFrame, pOldShell)
+{
+}
+
+OutlineViewShellBase::~OutlineViewShellBase()
+{
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/Outliner.cxx b/sd/source/ui/view/Outliner.cxx
new file mode 100644
index 000000000..a63337692
--- /dev/null
+++ b/sd/source/ui/view/Outliner.cxx
@@ -0,0 +1,2066 @@
+/* -*- 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 <Outliner.hxx>
+#include <boost/property_tree/json_parser.hpp>
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+
+#include <svl/srchitem.hxx>
+#include <svl/intitem.hxx>
+#include <editeng/editstat.hxx>
+#include <vcl/canvastools.hxx>
+#include <vcl/outdev.hxx>
+#include <vcl/weld.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svx/svdotext.hxx>
+#include <svx/svdograf.hxx>
+#include <editeng/unolingu.hxx>
+#include <com/sun/star/linguistic2/XSpellChecker1.hpp>
+#include <svx/srchdlg.hxx>
+#include <unotools/linguprops.hxx>
+#include <unotools/lingucfg.hxx>
+#include <editeng/editeng.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <tools/debug.hxx>
+#include <tools/diagnose_ex.h>
+
+#include <strings.hrc>
+#include <editeng/outliner.hxx>
+#include <sdmod.hxx>
+#include <Window.hxx>
+#include <sdresid.hxx>
+#include <DrawViewShell.hxx>
+#include <OutlineView.hxx>
+#include <OutlineViewShell.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <drawview.hxx>
+#include <ViewShellBase.hxx>
+#include <SpellDialogChildWindow.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <svx/svxids.hrc>
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+#include <comphelper/string.hxx>
+#include <comphelper/lok.hxx>
+#include <comphelper/scopeguard.hxx>
+#include <VectorGraphicSearchContext.hxx>
+#include <fusearch.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::linguistic2;
+
+class SfxStyleSheetPool;
+
+class SdOutliner::Implementation
+{
+public:
+ /** The original edit mode directly after switching to a different view
+ mode. Used for restoring the edit mode when leaving that view mode
+ again.
+ */
+ EditMode meOriginalEditMode;
+
+ Implementation();
+ ~Implementation();
+
+ /** Return the OutlinerView that was provided by the last call to
+ ProvideOutlinerView() (or NULL when there was no such call.)
+ */
+ OutlinerView* GetOutlinerView() { return mpOutlineView;}
+
+ /** Provide in the member mpOutlineView an instance of OutlinerView that
+ is either taken from the ViewShell, when it is an OutlineViewShell,
+ or is created. When an OutlinerView already exists it is initialized.
+ */
+ void ProvideOutlinerView (
+ Outliner& rOutliner,
+ const std::shared_ptr<sd::ViewShell>& rpViewShell,
+ vcl::Window* pWindow);
+
+ /** This method is called when the OutlinerView is no longer used.
+ */
+ void ReleaseOutlinerView();
+
+ sd::VectorGraphicSearchContext& getVectorGraphicSearchContext() { return maVectorGraphicSearchContext; }
+
+private:
+ /** Flag that specifies whether we own the outline view pointed to by
+ <member>mpOutlineView</member> and thus have to
+ delete it in <member>EndSpelling()</member>.
+ */
+ bool mbOwnOutlineView;
+
+ /** The outline view used for searching and spelling. If searching or
+ spell checking an outline view this data member points to that view.
+ For all other views an instance is created. The
+ <member>mbOwnOutlineView</member> distinguishes between both cases.
+ */
+ OutlinerView* mpOutlineView;
+
+ sd::VectorGraphicSearchContext maVectorGraphicSearchContext;
+};
+
+namespace
+{
+
+sd::ViewShellBase* getViewShellBase()
+{
+ return dynamic_cast<sd::ViewShellBase*>(SfxViewShell::Current());
+}
+
+} // end anonymous namespace
+
+SdOutliner::SdOutliner( SdDrawDocument* pDoc, OutlinerMode nMode )
+ : SdrOutliner( &pDoc->GetItemPool(), nMode ),
+ mpImpl(new Implementation()),
+ meMode(SEARCH),
+ mpView(nullptr),
+ mpWindow(nullptr),
+ mpDrawDocument(pDoc),
+ mnConversionLanguage(LANGUAGE_NONE),
+ mnIgnoreCurrentPageChangesLevel(0),
+ mbStringFound(false),
+ mbMatchMayExist(false),
+ mnPageCount(0),
+ mbEndOfSearch(false),
+ mbFoundObject(false),
+ mbDirectionIsForward(true),
+ mbRestrictSearchToSelection(false),
+ mpObj(nullptr),
+ mpFirstObj(nullptr),
+ mpSearchSpellTextObj(nullptr),
+ mnText(0),
+ mpParaObj(nullptr),
+ meStartViewMode(PageKind::Standard),
+ meStartEditMode(EditMode::Page),
+ mnStartPageIndex(sal_uInt16(-1)),
+ mpStartEditedObject(nullptr),
+ mbPrepareSpellingPending(true)
+{
+ SetStyleSheetPool(static_cast<SfxStyleSheetPool*>( mpDrawDocument->GetStyleSheetPool() ));
+ SetEditTextObjectPool( &pDoc->GetItemPool() );
+ SetCalcFieldValueHdl(LINK(SD_MOD(), SdModule, CalcFieldValueHdl));
+ SetForbiddenCharsTable( pDoc->GetForbiddenCharsTable() );
+
+ EEControlBits nCntrl = GetControlWord();
+ nCntrl |= EEControlBits::ALLOWBIGOBJS;
+ nCntrl |= EEControlBits::MARKFIELDS;
+ nCntrl |= EEControlBits::AUTOCORRECT;
+
+ bool bOnlineSpell = false;
+
+ sd::DrawDocShell* pDocSh = mpDrawDocument->GetDocSh();
+
+ if (pDocSh)
+ {
+ bOnlineSpell = mpDrawDocument->GetOnlineSpell();
+ }
+ else
+ {
+ bOnlineSpell = false;
+
+ try
+ {
+ const SvtLinguConfig aLinguConfig;
+ Any aAny = aLinguConfig.GetProperty( UPN_IS_SPELL_AUTO );
+ aAny >>= bOnlineSpell;
+ }
+ catch( ... )
+ {
+ OSL_FAIL( "Ill. type in linguistic property" );
+ }
+ }
+
+ if (bOnlineSpell)
+ nCntrl |= EEControlBits::ONLINESPELLING;
+ else
+ nCntrl &= ~EEControlBits::ONLINESPELLING;
+
+ SetControlWord(nCntrl);
+
+ Reference< XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() );
+ if ( xSpellChecker.is() )
+ SetSpeller( xSpellChecker );
+
+ Reference< XHyphenator > xHyphenator( LinguMgr::GetHyphenator() );
+ if( xHyphenator.is() )
+ SetHyphenator( xHyphenator );
+
+ SetDefaultLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() );
+}
+
+/// Nothing spectacular in the destructor.
+SdOutliner::~SdOutliner()
+{
+}
+
+OutlinerView* SdOutliner::getOutlinerView()
+{
+ return mpImpl->GetOutlinerView();
+}
+
+/** Prepare find&replace or spellchecking. This distinguishes between three
+ cases:
+ <ol>
+ <li>The current shell is a <type>DrawViewShell</type>: Create a
+ <type>OutlinerView</type> object and search all objects of (i) the
+ current mark list, (ii) of the current view, or (iii) of all the view
+ combinations:
+ <ol>
+ <li>Draw view, slide view</li>
+ <li>Draw view, background view</li>
+ <li>Notes view, slide view</li>
+ <li>Notes view, background view</li>
+ <li>Handout view, slide view</li>
+ <li>Handout view, background view</li>
+ </ol>
+
+ <li>When the current shell is a <type>SdOutlineViewShell</type> then
+ directly operate on it. No switching into other views takes place.</li>
+ </ol>
+*/
+void SdOutliner::PrepareSpelling()
+{
+ mbPrepareSpellingPending = false;
+
+ sd::ViewShellBase* pBase = getViewShellBase();
+ if (pBase != nullptr)
+ SetViewShell (pBase->GetMainViewShell());
+ SetRefDevice( SD_MOD()->GetVirtualRefDevice() );
+
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ if (pViewShell)
+ {
+ mbStringFound = false;
+
+ // Supposed that we are not located at the very beginning/end of
+ // the document then there may be a match in the document
+ // prior/after the current position.
+ mbMatchMayExist = true;
+
+ maObjectIterator = sd::outliner::Iterator();
+ maSearchStartPosition = sd::outliner::Iterator();
+ RememberStartPosition();
+
+ mpImpl->ProvideOutlinerView(*this, pViewShell, mpWindow);
+
+ HandleChangedSelection ();
+ }
+ ClearModifyFlag();
+}
+
+void SdOutliner::StartSpelling()
+{
+ meMode = SPELL;
+ mbDirectionIsForward = true;
+ mpSearchItem.reset();
+}
+
+/** Free all resources acquired during the search/spell check. After a
+ spell check the start position is restored here.
+*/
+void SdOutliner::EndSpelling()
+{
+ // Keep old view shell alive until we release the outliner view.
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ std::shared_ptr<sd::ViewShell> pOldViewShell (pViewShell);
+
+ sd::ViewShellBase* pBase = getViewShellBase();
+ if (pBase != nullptr)
+ pViewShell = pBase->GetMainViewShell();
+ else
+ pViewShell.reset();
+ mpWeakViewShell = pViewShell;
+
+ // When in <member>PrepareSpelling()</member> a new outline view has
+ // been created then delete it here.
+ bool bViewIsDrawViewShell(dynamic_cast< const sd::DrawViewShell *>( pViewShell.get() ));
+ if (bViewIsDrawViewShell)
+ {
+ SetStatusEventHdl(Link<EditStatus&,void>());
+ mpView = pViewShell->GetView();
+ mpView->UnmarkAllObj (mpView->GetSdrPageView());
+ mpView->SdrEndTextEdit();
+ // Make FuSelection the current function.
+ pViewShell->GetDispatcher()->Execute(
+ SID_OBJECT_SELECT,
+ SfxCallMode::SYNCHRON | SfxCallMode::RECORD);
+
+ // Remove and, if previously created by us, delete the outline
+ // view.
+ OutlinerView* pOutlinerView = getOutlinerView();
+ if (pOutlinerView != nullptr)
+ {
+ RemoveView(pOutlinerView);
+ mpImpl->ReleaseOutlinerView();
+ }
+
+ SetUpdateLayout(true);
+ }
+
+ // Before clearing the modify flag use it as a hint that
+ // changes were done at SpellCheck
+ if(IsModified())
+ {
+ if(auto pOutlineView = dynamic_cast<sd::OutlineView *>( mpView ))
+ pOutlineView->PrepareClose();
+ if(mpDrawDocument && !mpDrawDocument->IsChanged())
+ mpDrawDocument->SetChanged();
+ }
+
+ // Now clear the modify flag to have a specified state of
+ // Outliner
+ ClearModifyFlag();
+
+ // When spell checking then restore the start position.
+ if (meMode==SPELL || meMode==TEXT_CONVERSION)
+ RestoreStartPosition ();
+
+ mpWeakViewShell.reset();
+ mpView = nullptr;
+ mpWindow = nullptr;
+ mnStartPageIndex = sal_uInt16(-1);
+}
+
+bool SdOutliner::SpellNextDocument()
+{
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ if( nullptr != dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() ))
+ {
+ // When doing a spell check in the outline view then there is
+ // only one document.
+ mbEndOfSearch = true;
+ EndOfSearch ();
+ }
+ else
+ {
+ if( auto pOutlineView = dynamic_cast<sd::OutlineView *>( mpView ))
+ pOutlineView->PrepareClose();
+ mpDrawDocument->GetDocSh()->SetWaitCursor( true );
+
+ Initialize (true);
+
+ mpWindow = pViewShell->GetActiveWindow();
+ OutlinerView* pOutlinerView = getOutlinerView();
+ if (pOutlinerView != nullptr)
+ pOutlinerView->SetWindow(mpWindow);
+ ProvideNextTextObject ();
+
+ mpDrawDocument->GetDocSh()->SetWaitCursor( false );
+ ClearModifyFlag();
+ }
+
+ return !mbEndOfSearch;
+}
+
+/**
+ * check next text object
+ */
+svx::SpellPortions SdOutliner::GetNextSpellSentence()
+{
+ svx::SpellPortions aResult;
+
+ DetectChange();
+ // Iterate over sentences and text shapes until a sentence with a
+ // spelling error has been found. If no such sentence can be
+ // found the loop is left through a break.
+ // It is the responsibility of the sd outliner object to correctly
+ // iterate over all text shapes, i.e. switch between views, wrap
+ // around at the end of the document, stop when all text shapes
+ // have been examined exactly once.
+ bool bFoundNextSentence = false;
+ while ( ! bFoundNextSentence)
+ {
+ OutlinerView* pOutlinerView = GetView(0);
+ if (pOutlinerView != nullptr)
+ {
+ ESelection aCurrentSelection (pOutlinerView->GetSelection());
+ if ( ! mbMatchMayExist
+ && maStartSelection < aCurrentSelection)
+ EndOfSearch();
+
+ // Advance to the next sentence.
+ bFoundNextSentence = SpellSentence( pOutlinerView->GetEditView(), aResult);
+ }
+
+ // When no sentence with spelling errors has been found in the
+ // currently selected text shape or there is no selected text
+ // shape then advance to the next text shape.
+ if ( ! bFoundNextSentence)
+ if ( ! SpellNextDocument())
+ // All text objects have been processed so exit the
+ // loop and return an empty portions list.
+ break;
+ }
+
+ return aResult;
+}
+
+/** Go to next match.
+*/
+bool SdOutliner::StartSearchAndReplace (const SvxSearchItem* pSearchItem)
+{
+ bool bEndOfSearch = true;
+
+ // clear the search toolbar entry
+ SvxSearchDialogWrapper::SetSearchLabel(SearchLabel::Empty);
+
+ mpDrawDocument->GetDocSh()->SetWaitCursor( true );
+
+ // Since REPLACE is really a replaceAndSearchNext instead of a searchAndReplace,
+ // make sure that the search portion has not changed since the last FIND.
+ if (!mbPrepareSpellingPending && mpSearchItem
+ && pSearchItem->GetCommand() == SvxSearchCmd::REPLACE
+ && !mpSearchItem->equalsIgnoring(*pSearchItem, /*bIgnoreReplace=*/true,
+ /*bIgnoreCommand=*/true))
+ {
+ EndSpelling();
+ mbPrepareSpellingPending = true;
+ }
+
+ if (mbPrepareSpellingPending)
+ PrepareSpelling();
+ sd::ViewShellBase* pBase = getViewShellBase();
+ // Determine whether we have to abort the search. This is necessary
+ // when the main view shell does not support searching.
+ bool bAbort = false;
+ if (pBase != nullptr)
+ {
+ std::shared_ptr<sd::ViewShell> pShell (pBase->GetMainViewShell());
+ SetViewShell(pShell);
+ if (pShell == nullptr)
+ bAbort = true;
+ else
+ switch (pShell->GetShellType())
+ {
+ case sd::ViewShell::ST_DRAW:
+ case sd::ViewShell::ST_IMPRESS:
+ case sd::ViewShell::ST_NOTES:
+ case sd::ViewShell::ST_HANDOUT:
+ case sd::ViewShell::ST_OUTLINE:
+ bAbort = false;
+ break;
+ default:
+ bAbort = true;
+ break;
+ }
+ }
+
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ if ( ! pViewShell)
+ {
+ OSL_ASSERT(pViewShell);
+ return true;
+ }
+
+ if ( ! bAbort)
+ {
+ meMode = SEARCH;
+ mpSearchItem.reset(pSearchItem->Clone());
+
+ mbFoundObject = false;
+
+ Initialize ( ! mpSearchItem->GetBackward());
+
+ const SvxSearchCmd nCommand (mpSearchItem->GetCommand());
+ if (nCommand == SvxSearchCmd::FIND_ALL || nCommand == SvxSearchCmd::REPLACE_ALL)
+ {
+ bEndOfSearch = SearchAndReplaceAll ();
+ }
+ else
+ {
+ RememberStartPosition ();
+ bEndOfSearch = SearchAndReplaceOnce ();
+ // restore start position if nothing was found
+ if(!mbStringFound)
+ {
+ RestoreStartPosition ();
+ // Nothing was changed, no need to restart the spellchecker.
+ if (nCommand == SvxSearchCmd::FIND)
+ bEndOfSearch = false;
+ }
+ mnStartPageIndex = sal_uInt16(-1);
+ }
+ }
+
+ mpDrawDocument->GetDocSh()->SetWaitCursor( false );
+
+ return bEndOfSearch;
+}
+
+void SdOutliner::Initialize (bool bDirectionIsForward)
+{
+ const bool bIsAtEnd (maObjectIterator == sd::outliner::OutlinerContainer(this).end());
+ const bool bOldDirectionIsForward = mbDirectionIsForward;
+ mbDirectionIsForward = bDirectionIsForward;
+
+ if (maObjectIterator == sd::outliner::Iterator())
+ {
+ // Initialize a new search.
+ maObjectIterator = sd::outliner::OutlinerContainer(this).current();
+ maCurrentPosition = *maObjectIterator;
+
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ if ( ! pViewShell)
+ {
+ OSL_ASSERT(pViewShell);
+ return;
+ }
+
+ // In case we are searching in an outline view then first remove the
+ // current selection and place cursor at its start or end.
+ if( nullptr != dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() ))
+ {
+ ESelection aSelection = getOutlinerView()->GetSelection ();
+ if (mbDirectionIsForward)
+ {
+ aSelection.nEndPara = aSelection.nStartPara;
+ aSelection.nEndPos = aSelection.nStartPos;
+ }
+ else
+ {
+ aSelection.nStartPara = aSelection.nEndPara;
+ aSelection.nStartPos = aSelection.nEndPos;
+ }
+ getOutlinerView()->SetSelection (aSelection);
+ }
+
+ // When not beginning the search at the beginning of the search area
+ // then there may be matches before the current position.
+ mbMatchMayExist = (maObjectIterator!=sd::outliner::OutlinerContainer(this).begin());
+ }
+ else if (bOldDirectionIsForward != mbDirectionIsForward)
+ {
+ // Requested iteration direction has changed. Turn around the iterator.
+ maObjectIterator.Reverse();
+ if (bIsAtEnd)
+ {
+ // The iterator has pointed to end(), which after the search
+ // direction is reversed, becomes begin().
+ maObjectIterator = sd::outliner::OutlinerContainer(this).begin();
+ }
+ else
+ {
+ // The iterator has pointed to the object one ahead/before the current
+ // one. Now move it to the one before/ahead the current one.
+ ++maObjectIterator;
+ if (maObjectIterator != sd::outliner::OutlinerContainer(this).end())
+ {
+ ++maObjectIterator;
+ }
+ }
+
+ mbMatchMayExist = true;
+ }
+
+ // Initialize the last valid position with where the search starts so
+ // that it always points to a valid position.
+ maLastValidPosition = *sd::outliner::OutlinerContainer(this).current();
+}
+
+bool SdOutliner::SearchAndReplaceAll()
+{
+ bool bRet = true;
+
+ // Save the current position to be restored after having replaced all
+ // matches.
+ RememberStartPosition ();
+
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ if ( ! pViewShell)
+ {
+ OSL_ASSERT(pViewShell);
+ return true;
+ }
+
+ std::vector<sd::SearchSelection> aSelections;
+ if( nullptr != dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() ))
+ {
+ // Put the cursor to the beginning/end of the outliner.
+ getOutlinerView()->SetSelection (GetSearchStartPosition ());
+
+ // The outliner does all the work for us when we are in this mode.
+ SearchAndReplaceOnce();
+ }
+ else if( nullptr != dynamic_cast< const sd::DrawViewShell *>( pViewShell.get() ))
+ {
+ // Disable selection change notifications during search all.
+ SfxViewShell& rSfxViewShell = pViewShell->GetViewShellBase();
+ rSfxViewShell.setTiledSearching(true);
+ comphelper::ScopeGuard aGuard([&rSfxViewShell]()
+ {
+ rSfxViewShell.setTiledSearching(false);
+ });
+
+ // Go to beginning/end of document.
+ maObjectIterator = sd::outliner::OutlinerContainer(this).begin();
+ // Switch to the first object which contains the search string.
+ ProvideNextTextObject();
+ if( !mbStringFound )
+ {
+ RestoreStartPosition ();
+ mnStartPageIndex = sal_uInt16(-1);
+ return true;
+ }
+ // Reset the iterator back to the beginning
+ maObjectIterator = sd::outliner::OutlinerContainer(this).begin();
+
+ // Search/replace until the end of the document is reached.
+ bool bFoundMatch;
+ do
+ {
+ bFoundMatch = ! SearchAndReplaceOnce(&aSelections);
+ if (mpSearchItem->GetCommand() == SvxSearchCmd::FIND_ALL && comphelper::LibreOfficeKit::isActive() && bFoundMatch && aSelections.size() == 1)
+ {
+ // Without this, RememberStartPosition() will think it already has a remembered position.
+ mnStartPageIndex = sal_uInt16(-1);
+
+ RememberStartPosition();
+
+ // So when RestoreStartPosition() restores the first match, then spellchecker doesn't kill the selection.
+ bRet = false;
+ }
+ }
+ while (bFoundMatch);
+
+ if (mpSearchItem->GetCommand() == SvxSearchCmd::FIND_ALL && comphelper::LibreOfficeKit::isActive() && !aSelections.empty())
+ {
+ boost::property_tree::ptree aTree;
+ aTree.put("searchString", mpSearchItem->GetSearchString().toUtf8().getStr());
+ aTree.put("highlightAll", true);
+
+ boost::property_tree::ptree aChildren;
+ for (const sd::SearchSelection& rSelection : aSelections)
+ {
+ boost::property_tree::ptree aChild;
+ aChild.put("part", OString::number(rSelection.m_nPage).getStr());
+ aChild.put("rectangles", rSelection.m_aRectangles.getStr());
+ aChildren.push_back(std::make_pair("", aChild));
+ }
+ aTree.add_child("searchResultSelection", aChildren);
+
+ std::stringstream aStream;
+ boost::property_tree::write_json(aStream, aTree);
+ OString aPayload = aStream.str().c_str();
+ rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_SEARCH_RESULT_SELECTION, aPayload.getStr());
+ }
+ }
+
+ RestoreStartPosition ();
+
+ if (mpSearchItem->GetCommand() == SvxSearchCmd::FIND_ALL && comphelper::LibreOfficeKit::isActive() && !bRet)
+ {
+ // Find-all, tiled rendering and we have at least one match.
+ OString aPayload = OString::number(mnStartPageIndex);
+ SfxViewShell& rSfxViewShell = pViewShell->GetViewShellBase();
+ rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_SET_PART, aPayload.getStr());
+
+ // Emit a selection callback here:
+ // 1) The original one is no longer valid, as we there was a SET_PART in between
+ // 2) The underlying editeng will only talk about the first match till
+ // it doesn't support multi-selection.
+ std::vector<OString> aRectangles;
+ for (const sd::SearchSelection& rSelection : aSelections)
+ {
+ if (rSelection.m_nPage == mnStartPageIndex)
+ aRectangles.push_back(rSelection.m_aRectangles);
+ }
+ OString sRectangles = comphelper::string::join("; ", aRectangles);
+ rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_TEXT_SELECTION, sRectangles.getStr());
+ }
+
+ mnStartPageIndex = sal_uInt16(-1);
+
+ return bRet;
+}
+
+namespace
+{
+
+basegfx::B2DRectangle getPDFSelection(const std::unique_ptr<VectorGraphicSearch> & rVectorGraphicSearch,
+ const SdrObject* pObject)
+{
+ basegfx::B2DRectangle aSelection;
+
+ auto const & rTextRectangles = rVectorGraphicSearch->getTextRectangles();
+ if (rTextRectangles.empty())
+ return aSelection;
+
+ basegfx::B2DSize aPdfPageSizeHMM = rVectorGraphicSearch->pageSize();
+
+ basegfx::B2DRectangle aObjectB2DRectHMM(vcl::unotools::b2DRectangleFromRectangle(pObject->GetLogicRect()));
+
+ // Setup coordinate conversion matrix to convert the inner PDF
+ // coordinates to the page relative coordinates
+ basegfx::B2DHomMatrix aB2DMatrix;
+
+ aB2DMatrix.scale(aObjectB2DRectHMM.getWidth() / aPdfPageSizeHMM.getX(),
+ aObjectB2DRectHMM.getHeight() / aPdfPageSizeHMM.getY());
+
+ aB2DMatrix.translate(aObjectB2DRectHMM.getMinX(), aObjectB2DRectHMM.getMinY());
+
+
+ for (auto const & rRectangle : rVectorGraphicSearch->getTextRectangles())
+ {
+ basegfx::B2DRectangle aRectangle(rRectangle);
+ aRectangle *= aB2DMatrix;
+
+ if (aSelection.isEmpty())
+ aSelection = aRectangle;
+ else
+ aSelection.expand(aRectangle);
+ }
+
+ return aSelection;
+}
+
+} // end namespace
+
+void SdOutliner::sendLOKSearchResultCallback(const std::shared_ptr<sd::ViewShell> & pViewShell,
+ const OutlinerView* pOutlinerView,
+ std::vector<sd::SearchSelection>* pSelections)
+{
+ std::vector<::tools::Rectangle> aLogicRects;
+ auto& rVectorGraphicSearchContext = mpImpl->getVectorGraphicSearchContext();
+ if (rVectorGraphicSearchContext.mbCurrentIsVectorGraphic)
+ {
+ basegfx::B2DRectangle aSelectionHMM = getPDFSelection(rVectorGraphicSearchContext.mpVectorGraphicSearch, mpObj);
+
+ tools::Rectangle aSelection(Point(aSelectionHMM.getMinX(), aSelectionHMM.getMinY()),
+ Size(aSelectionHMM.getWidth(), aSelectionHMM.getHeight()));
+ aSelection = o3tl::convert(aSelection, o3tl::Length::mm100, o3tl::Length::twip);
+ aLogicRects.push_back(aSelection);
+ }
+ else
+ {
+ pOutlinerView->GetSelectionRectangles(aLogicRects);
+
+ // convert to twips if in 100thmm (seems as if LibreOfficeKit is based on twips?). Do this
+ // here where we have the only place needing this, *not* in ImpEditView::GetSelectionRectangles
+ // which makes that method unusable for others
+ if (pOutlinerView->GetWindow() && MapUnit::Map100thMM == pOutlinerView->GetWindow()->GetMapMode().GetMapUnit())
+ {
+ for (tools::Rectangle& rRectangle : aLogicRects)
+ {
+ rRectangle = o3tl::convert(rRectangle, o3tl::Length::mm100, o3tl::Length::twip);
+ }
+ }
+ }
+
+ std::vector<OString> aLogicRectStrings;
+ std::transform(aLogicRects.begin(), aLogicRects.end(), std::back_inserter(aLogicRectStrings),
+ [](const ::tools::Rectangle& rRectangle)
+ {
+ return rRectangle.toString();
+ });
+
+ OString sRectangles = comphelper::string::join("; ", aLogicRectStrings);
+
+ if (!pSelections)
+ {
+ // notify LibreOfficeKit about changed page
+ OString aPayload = OString::number(maCurrentPosition.mnPageIndex);
+ SfxViewShell& rSfxViewShell = pViewShell->GetViewShellBase();
+ rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_SET_PART, aPayload.getStr());
+
+ // also about search result selections
+ boost::property_tree::ptree aTree;
+ aTree.put("searchString", mpSearchItem->GetSearchString().toUtf8().getStr());
+ aTree.put("highlightAll", false);
+
+ boost::property_tree::ptree aChildren;
+ boost::property_tree::ptree aChild;
+ aChild.put("part", OString::number(maCurrentPosition.mnPageIndex).getStr());
+ aChild.put("rectangles", sRectangles.getStr());
+ aChildren.push_back(std::make_pair("", aChild));
+ aTree.add_child("searchResultSelection", aChildren);
+
+ std::stringstream aStream;
+ boost::property_tree::write_json(aStream, aTree);
+ aPayload = aStream.str().c_str();
+ rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_SEARCH_RESULT_SELECTION, aPayload.getStr());
+
+ if (rVectorGraphicSearchContext.mbCurrentIsVectorGraphic)
+ {
+ rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_TEXT_SELECTION, sRectangles.getStr());
+ }
+ }
+ else
+ {
+ sd::SearchSelection aSelection(maCurrentPosition.mnPageIndex, sRectangles);
+ bool bDuplicate = !pSelections->empty() && pSelections->back() == aSelection;
+ if (!bDuplicate)
+ pSelections->push_back(aSelection);
+ }
+}
+
+bool SdOutliner::SearchAndReplaceOnce(std::vector<sd::SearchSelection>* pSelections)
+{
+ DetectChange ();
+
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+
+ if (!getOutlinerView() || !GetEditEngine().HasView(&getOutlinerView()->GetEditView()))
+ {
+ std::shared_ptr<sd::DrawViewShell> pDrawViewShell (
+ std::dynamic_pointer_cast<sd::DrawViewShell>(pViewShell));
+
+ // Perhaps the user switched to a different page/slide between searches.
+ // If so, reset the starting search position to the current slide like DetectChange does
+ if (pDrawViewShell && pDrawViewShell->GetCurPagePos() != maCurrentPosition.mnPageIndex)
+ maObjectIterator = sd::outliner::OutlinerContainer(this).current();
+
+ mpImpl->ProvideOutlinerView(*this, pViewShell, mpWindow);
+ }
+
+ if (pViewShell)
+ {
+ mpView = pViewShell->GetView();
+ mpWindow = pViewShell->GetActiveWindow();
+ getOutlinerView()->SetWindow(mpWindow);
+ auto& rVectorGraphicSearchContext = mpImpl->getVectorGraphicSearchContext();
+ if (nullptr != dynamic_cast<const sd::DrawViewShell*>(pViewShell.get()))
+ {
+ sal_uLong nMatchCount = 0;
+
+ if (rVectorGraphicSearchContext.mbCurrentIsVectorGraphic)
+ {
+ OUString const & rString = mpSearchItem->GetSearchString();
+ bool bBackwards = mpSearchItem->GetBackward();
+
+ VectorGraphicSearchOptions aOptions;
+ aOptions.meStartPosition = bBackwards ? SearchStartPosition::End : SearchStartPosition::Begin;
+ aOptions.mbMatchCase = mpSearchItem->GetExact();
+ aOptions.mbMatchWholeWord = mpSearchItem->GetWordOnly();
+
+ bool bResult = rVectorGraphicSearchContext.mpVectorGraphicSearch->search(rString, aOptions);
+
+ if (bResult)
+ {
+ if (bBackwards)
+ bResult = rVectorGraphicSearchContext.mpVectorGraphicSearch->previous();
+ else
+ bResult = rVectorGraphicSearchContext.mpVectorGraphicSearch->next();
+ }
+
+ if (bResult)
+ {
+ nMatchCount = 1;
+
+ SdrPageView* pPageView = mpView->GetSdrPageView();
+ mpView->UnmarkAllObj(pPageView);
+
+ std::vector<basegfx::B2DRectangle> aSubSelections;
+ basegfx::B2DRectangle aSubSelection = getPDFSelection(rVectorGraphicSearchContext.mpVectorGraphicSearch, mpObj);
+ if (!aSubSelection.isEmpty())
+ aSubSelections.push_back(aSubSelection);
+ mpView->MarkObj(mpObj, pPageView, false, false, std::move(aSubSelections));
+ }
+ else
+ {
+ rVectorGraphicSearchContext.reset();
+ }
+ }
+ else
+ {
+ // When replacing we first check if there is a selection
+ // indicating a match. If there is then replace it. The
+ // following call to StartSearchAndReplace will then search for
+ // the next match.
+ if (meMode == SEARCH && mpSearchItem->GetCommand() == SvxSearchCmd::REPLACE)
+ {
+ if (getOutlinerView()->GetSelection().HasRange())
+ getOutlinerView()->StartSearchAndReplace(*mpSearchItem);
+ }
+
+ // Search for the next match.
+ if (mpSearchItem->GetCommand() != SvxSearchCmd::REPLACE_ALL)
+ {
+ nMatchCount = getOutlinerView()->StartSearchAndReplace(*mpSearchItem);
+ }
+ }
+
+ // Go to the next text object when there have been no matches in
+ // the current object or the whole object has already been
+ // processed.
+ if (nMatchCount==0 || mpSearchItem->GetCommand()==SvxSearchCmd::REPLACE_ALL)
+ {
+ ProvideNextTextObject ();
+
+ if (!mbEndOfSearch && !rVectorGraphicSearchContext.mbCurrentIsVectorGraphic)
+ {
+ // Remember the current position as the last one with a
+ // text object.
+ maLastValidPosition = maCurrentPosition;
+
+ // Now that the mbEndOfSearch flag guards this block the
+ // following assertion and return should not be
+ // necessary anymore.
+ DBG_ASSERT(GetEditEngine().HasView(&getOutlinerView()->GetEditView() ),
+ "SearchAndReplace without valid view!" );
+ if ( ! GetEditEngine().HasView( &getOutlinerView()->GetEditView() ) )
+ {
+ mpDrawDocument->GetDocSh()->SetWaitCursor( false );
+ return true;
+ }
+
+ if (meMode == SEARCH)
+ getOutlinerView()->StartSearchAndReplace(*mpSearchItem);
+ }
+ }
+ }
+ else if (nullptr != dynamic_cast<const sd::OutlineViewShell*>(pViewShell.get()))
+ {
+ mpDrawDocument->GetDocSh()->SetWaitCursor(false);
+ // The following loop is executed more than once only when a
+ // wrap around search is done.
+ while (true)
+ {
+ int nResult = getOutlinerView()->StartSearchAndReplace(*mpSearchItem);
+ if (nResult == 0)
+ {
+ if (HandleFailedSearch ())
+ {
+ getOutlinerView()->SetSelection (GetSearchStartPosition ());
+ continue;
+ }
+ }
+ else
+ mbStringFound = true;
+ break;
+ }
+ }
+ }
+
+ mpDrawDocument->GetDocSh()->SetWaitCursor( false );
+
+ if (pViewShell && comphelper::LibreOfficeKit::isActive() && mbStringFound)
+ {
+ sendLOKSearchResultCallback(pViewShell, getOutlinerView(), pSelections);
+ }
+
+ return mbEndOfSearch;
+}
+
+/** Try to detect whether the document or the view (shell) has changed since
+ the last time <member>StartSearchAndReplace()</member> has been called.
+*/
+void SdOutliner::DetectChange()
+{
+ sd::outliner::IteratorPosition aPosition (maCurrentPosition);
+
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ std::shared_ptr<sd::DrawViewShell> pDrawViewShell (
+ std::dynamic_pointer_cast<sd::DrawViewShell>(pViewShell));
+
+ // Detect whether the view has been switched from the outside.
+ if (pDrawViewShell != nullptr
+ && (aPosition.meEditMode != pDrawViewShell->GetEditMode()
+ || aPosition.mePageKind != pDrawViewShell->GetPageKind()))
+ {
+ // Either the edit mode or the page kind has changed.
+ SetStatusEventHdl(Link<EditStatus&,void>());
+
+ SdrPageView* pPageView = mpView->GetSdrPageView();
+ if (pPageView != nullptr)
+ mpView->UnmarkAllObj (pPageView);
+ mpView->SdrEndTextEdit();
+ SetUpdateLayout(false);
+ OutlinerView* pOutlinerView = getOutlinerView();
+ if (pOutlinerView != nullptr)
+ pOutlinerView->SetOutputArea( ::tools::Rectangle( Point(), Size(1, 1) ) );
+ if (meMode == SPELL)
+ SetPaperSize( Size(1, 1) );
+ SetText(OUString(), GetParagraph(0));
+
+ RememberStartPosition ();
+
+ mnPageCount = mpDrawDocument->GetSdPageCount(pDrawViewShell->GetPageKind());
+ maObjectIterator = sd::outliner::OutlinerContainer(this).current();
+ }
+
+ // Detect change of the set of selected objects. If their number has
+ // changed start again with the first selected object.
+ else if (DetectSelectionChange())
+ {
+ HandleChangedSelection ();
+ maObjectIterator = sd::outliner::OutlinerContainer(this).current();
+ }
+
+ // Detect change of page count. Restart search at first/last page in
+ // that case.
+ else if (aPosition.meEditMode == EditMode::Page
+ && mpDrawDocument->GetSdPageCount(aPosition.mePageKind) != mnPageCount)
+ {
+ // The number of pages has changed.
+ mnPageCount = mpDrawDocument->GetSdPageCount(aPosition.mePageKind);
+ maObjectIterator = sd::outliner::OutlinerContainer(this).current();
+ }
+ else if (aPosition.meEditMode == EditMode::MasterPage
+ && mpDrawDocument->GetSdPageCount(aPosition.mePageKind) != mnPageCount)
+ {
+ // The number of master pages has changed.
+ mnPageCount = mpDrawDocument->GetSdPageCount(aPosition.mePageKind);
+ maObjectIterator = sd::outliner::OutlinerContainer(this).current();
+ }
+}
+
+bool SdOutliner::DetectSelectionChange()
+{
+ bool bSelectionHasChanged = false;
+
+ // If mpObj is NULL then we have not yet found our first match.
+ // Detecting a change makes no sense.
+ if (mpObj != nullptr)
+ {
+ const size_t nMarkCount = mpView ? mpView->GetMarkedObjectList().GetMarkCount() : 0;
+ switch (nMarkCount)
+ {
+ case 0:
+ // The selection has changed when previously there have been
+ // selected objects.
+ bSelectionHasChanged = mbRestrictSearchToSelection;
+ break;
+ case 1:
+ // Check if the only selected object is not the one that we
+ // had selected.
+ if (mpView != nullptr)
+ {
+ SdrMark* pMark = mpView->GetMarkedObjectList().GetMark(0);
+ if (pMark != nullptr)
+ bSelectionHasChanged = (mpObj != pMark->GetMarkedSdrObj ());
+ }
+ break;
+ default:
+ // We had selected exactly one object.
+ bSelectionHasChanged = true;
+ break;
+ }
+ }
+
+ return bSelectionHasChanged;
+}
+
+void SdOutliner::RememberStartPosition()
+{
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ if ( ! pViewShell)
+ {
+ OSL_ASSERT(pViewShell);
+ return;
+ }
+
+ if ( mnStartPageIndex != sal_uInt16(-1) )
+ return;
+
+ if( nullptr != dynamic_cast< const sd::DrawViewShell *>( pViewShell.get() ))
+ {
+ std::shared_ptr<sd::DrawViewShell> pDrawViewShell (
+ std::dynamic_pointer_cast<sd::DrawViewShell>(pViewShell));
+ if (pDrawViewShell != nullptr)
+ {
+ meStartViewMode = pDrawViewShell->GetPageKind();
+ meStartEditMode = pDrawViewShell->GetEditMode();
+ mnStartPageIndex = pDrawViewShell->GetCurPagePos();
+ }
+
+ if (mpView != nullptr)
+ {
+ mpStartEditedObject = mpView->GetTextEditObject();
+ if (mpStartEditedObject != nullptr)
+ {
+ // Try to retrieve current caret position only when there is an
+ // edited object.
+ ::Outliner* pOutliner =
+ static_cast<sd::DrawView*>(mpView)->GetTextEditOutliner();
+ if (pOutliner!=nullptr && pOutliner->GetViewCount()>0)
+ {
+ OutlinerView* pOutlinerView = pOutliner->GetView(0);
+ maStartSelection = pOutlinerView->GetSelection();
+ }
+ }
+ }
+ }
+ else if( nullptr != dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() ))
+ {
+ // Remember the current cursor position.
+ OutlinerView* pView = GetView(0);
+ if (pView != nullptr)
+ pView->GetSelection();
+ }
+ else
+ {
+ mnStartPageIndex = sal_uInt16(-1);
+ }
+}
+
+void SdOutliner::RestoreStartPosition()
+{
+ bool bRestore = true;
+ // Take a negative start page index as indicator that restoring the
+ // start position is not requested.
+ if (mnStartPageIndex == sal_uInt16(-1) )
+ bRestore = false;
+ // Don't restore when the view shell is not valid.
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ if (pViewShell == nullptr)
+ bRestore = false;
+
+ if (!bRestore)
+ return;
+
+ if( nullptr != dynamic_cast< const sd::DrawViewShell *>( pViewShell.get() ))
+ {
+ std::shared_ptr<sd::DrawViewShell> pDrawViewShell (
+ std::dynamic_pointer_cast<sd::DrawViewShell>(pViewShell));
+ SetViewMode (meStartViewMode);
+ if (pDrawViewShell != nullptr)
+ {
+ SetPage (meStartEditMode, mnStartPageIndex);
+ mpObj = mpStartEditedObject;
+ if (mpObj)
+ {
+ PutTextIntoOutliner();
+ EnterEditMode(false);
+ if (getOutlinerView())
+ getOutlinerView()->SetSelection(maStartSelection);
+ }
+ }
+ }
+ else if( nullptr != dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() ))
+ {
+ // Set cursor to its old position.
+ OutlinerView* pView = GetView(0);
+ if (pView != nullptr)
+ pView->SetSelection (maStartSelection);
+ }
+}
+
+namespace
+{
+
+bool lclIsValidTextObject(const sd::outliner::IteratorPosition& rPosition)
+{
+ auto* pObject = dynamic_cast< SdrTextObj* >( rPosition.mxObject.get() );
+ return (pObject != nullptr) && pObject->HasText() && ! pObject->IsEmptyPresObj();
+}
+
+bool isValidVectorGraphicObject(const sd::outliner::IteratorPosition& rPosition)
+{
+ auto* pGraphicObject = dynamic_cast<SdrGrafObj*>(rPosition.mxObject.get());
+ if (pGraphicObject)
+ {
+ auto const& pVectorGraphicData = pGraphicObject->GetGraphic().getVectorGraphicData();
+ if (pVectorGraphicData && VectorGraphicDataType::Pdf == pVectorGraphicData->getType())
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+} // end anonymous namespace
+
+
+/** The main purpose of this method is to iterate over all shape objects of
+ the search area (current selection, current view, or whole document)
+ until a text object has been found that contains at least one match or
+ until no such object can be found anymore. These two conditions are
+ expressed by setting one of the flags <member>mbFoundObject</member> or
+ <member>mbEndOfSearch</member> to <TRUE/>.
+*/
+void SdOutliner::ProvideNextTextObject()
+{
+ mbEndOfSearch = false;
+ mbFoundObject = false;
+
+ // reset the vector search
+ auto& rVectorGraphicSearchContext = mpImpl->getVectorGraphicSearchContext();
+ rVectorGraphicSearchContext.reset();
+
+ mpView->UnmarkAllObj (mpView->GetSdrPageView());
+ try
+ {
+ mpView->SdrEndTextEdit();
+ }
+ catch (const css::uno::Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd.view");
+ }
+ SetUpdateLayout(false);
+ OutlinerView* pOutlinerView = getOutlinerView();
+ if (pOutlinerView != nullptr)
+ pOutlinerView->SetOutputArea( ::tools::Rectangle( Point(), Size(1, 1) ) );
+ if (meMode == SPELL)
+ SetPaperSize( Size(1, 1) );
+ SetText(OUString(), GetParagraph(0));
+
+ mpSearchSpellTextObj = nullptr;
+
+ // Iterate until a valid text object has been found or the search ends.
+ do
+ {
+ mpObj = nullptr;
+ mpParaObj = nullptr;
+
+ if (maObjectIterator != sd::outliner::OutlinerContainer(this).end())
+ {
+ maCurrentPosition = *maObjectIterator;
+
+ // LOK: do not descent to notes or master pages when searching
+ bool bForbiddenPage = comphelper::LibreOfficeKit::isActive() && (maCurrentPosition.mePageKind != PageKind::Standard || maCurrentPosition.meEditMode != EditMode::Page);
+
+ rVectorGraphicSearchContext.reset();
+
+ if (!bForbiddenPage)
+ {
+ // Switch to the current object only if it is a valid text object.
+ if (lclIsValidTextObject(maCurrentPosition))
+ {
+ // Don't set yet in case of searching: the text object may not match.
+ if (meMode != SEARCH)
+ mpObj = SetObject(maCurrentPosition);
+ else
+ mpObj = maCurrentPosition.mxObject.get();
+ }
+ // Or if the object is a valid graphic object which contains vector graphic
+ else if (meMode == SEARCH && isValidVectorGraphicObject(maCurrentPosition))
+ {
+ mpObj = maCurrentPosition.mxObject.get();
+ rVectorGraphicSearchContext.mbCurrentIsVectorGraphic = true;
+ }
+ }
+
+ // Advance to the next object
+ ++maObjectIterator;
+
+ if (mpObj)
+ {
+ if (rVectorGraphicSearchContext.mbCurrentIsVectorGraphic)
+ {
+ // We know here the object is a SdrGrafObj and that it
+ // contains a vector graphic
+ auto* pGraphicObject = static_cast<SdrGrafObj*>(mpObj);
+ OUString const & rString = mpSearchItem->GetSearchString();
+ bool bBackwards = mpSearchItem->GetBackward();
+
+ VectorGraphicSearchOptions aOptions;
+ aOptions.meStartPosition = bBackwards ? SearchStartPosition::End : SearchStartPosition::Begin;
+ aOptions.mbMatchCase = mpSearchItem->GetExact();
+ aOptions.mbMatchWholeWord = mpSearchItem->GetWordOnly();
+
+ rVectorGraphicSearchContext.mpVectorGraphicSearch = std::make_unique<VectorGraphicSearch>(pGraphicObject->GetGraphic());
+
+ bool bResult = rVectorGraphicSearchContext.mpVectorGraphicSearch->search(rString, aOptions);
+ if (bResult)
+ {
+ if (bBackwards)
+ bResult = rVectorGraphicSearchContext.mpVectorGraphicSearch->previous();
+ else
+ bResult = rVectorGraphicSearchContext.mpVectorGraphicSearch->next();
+ }
+
+ if (bResult)
+ {
+ mpObj = SetObject(maCurrentPosition);
+
+ mbStringFound = true;
+ mbMatchMayExist = true;
+ mbFoundObject = true;
+
+ SdrPageView* pPageView = mpView->GetSdrPageView();
+ mpView->UnmarkAllObj(pPageView);
+
+ std::vector<basegfx::B2DRectangle> aSubSelections;
+ basegfx::B2DRectangle aSubSelection = getPDFSelection(rVectorGraphicSearchContext.mpVectorGraphicSearch, mpObj);
+ if (!aSubSelection.isEmpty())
+ aSubSelections.push_back(aSubSelection);
+
+ mpView->MarkObj(mpObj, pPageView, false, false, std::move(aSubSelections));
+
+ mpDrawDocument->GetDocSh()->SetWaitCursor( false );
+ }
+ else
+ {
+ rVectorGraphicSearchContext.reset();
+ }
+ }
+ else
+ {
+ PutTextIntoOutliner();
+
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ if (pViewShell != nullptr)
+ {
+ switch (meMode)
+ {
+ case SEARCH:
+ PrepareSearchAndReplace ();
+ break;
+ case SPELL:
+ PrepareSpellCheck ();
+ break;
+ case TEXT_CONVERSION:
+ PrepareConversion();
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ rVectorGraphicSearchContext.reset();
+
+ if (meMode == SEARCH)
+ // Instead of doing a full-blown SetObject(), which would do the same -- but would also possibly switch pages.
+ mbStringFound = false;
+
+ mbEndOfSearch = true;
+ EndOfSearch ();
+ }
+ }
+ while ( ! (mbFoundObject || mbEndOfSearch));
+}
+
+void SdOutliner::EndOfSearch()
+{
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ if ( ! pViewShell)
+ {
+ OSL_ASSERT(pViewShell);
+ return;
+ }
+
+ // Before we display a dialog we first jump to where the last valid text
+ // object was found. All page and view mode switching since then was
+ // temporary and should not be visible to the user.
+ if( nullptr == dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() ))
+ SetObject (maLastValidPosition);
+
+ if (mbRestrictSearchToSelection)
+ ShowEndOfSearchDialog ();
+ else
+ {
+ // When no match has been found so far then terminate the search.
+ if ( ! mbMatchMayExist)
+ {
+ ShowEndOfSearchDialog ();
+ mbEndOfSearch = true;
+ }
+ // Ask the user whether to wrap around and continue the search or
+ // to terminate.
+ else if (meMode==TEXT_CONVERSION || ShowWrapAroundDialog ())
+ {
+ mbMatchMayExist = false;
+ // Everything back to beginning (or end?) of the document.
+ maObjectIterator = sd::outliner::OutlinerContainer(this).begin();
+ if( nullptr != dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() ))
+ {
+ // Set cursor to first character of the document.
+ OutlinerView* pOutlinerView = getOutlinerView();
+ if (pOutlinerView != nullptr)
+ pOutlinerView->SetSelection (GetSearchStartPosition ());
+ }
+
+ mbEndOfSearch = false;
+ }
+ else
+ {
+ // No wrap around.
+ mbEndOfSearch = true;
+ }
+ }
+}
+
+void SdOutliner::ShowEndOfSearchDialog()
+{
+ if (meMode == SEARCH)
+ {
+ if (!mbStringFound)
+ {
+ SvxSearchDialogWrapper::SetSearchLabel(SearchLabel::NotFound);
+ std::shared_ptr<sd::ViewShell> pViewShell(mpWeakViewShell.lock());
+ if (pViewShell)
+ {
+ SfxViewShell& rSfxViewShell = pViewShell->GetViewShellBase();
+ rSfxViewShell.libreOfficeKitViewCallback(LOK_CALLBACK_SEARCH_NOT_FOUND, mpSearchItem->GetSearchString().toUtf8().getStr());
+ }
+ }
+
+ // don't do anything else for search
+ return;
+ }
+
+ OUString aString;
+ if (mpView->AreObjectsMarked())
+ aString = SdResId(STR_END_SPELLING_OBJ);
+ else
+ aString = SdResId(STR_END_SPELLING);
+
+ // Show the message in an info box that is modal with respect to the whole application.
+ weld::Window* pParent = GetMessageBoxParent();
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(pParent,
+ VclMessageType::Info, VclButtonsType::Ok, aString));
+ xInfoBox->run();
+}
+
+bool SdOutliner::ShowWrapAroundDialog()
+{
+ // Determine whether to show the dialog.
+ if (mpSearchItem)
+ {
+ // When searching display the dialog only for single find&replace.
+ const SvxSearchCmd nCommand(mpSearchItem->GetCommand());
+ if (nCommand == SvxSearchCmd::REPLACE || nCommand == SvxSearchCmd::FIND)
+ {
+ if (mbDirectionIsForward)
+ SvxSearchDialogWrapper::SetSearchLabel(SearchLabel::End);
+ else
+ SvxSearchDialogWrapper::SetSearchLabel(SearchLabel::Start);
+
+ return true;
+ }
+ else
+ return false;
+ }
+
+ // show dialog only for spelling
+ if (meMode != SPELL)
+ return false;
+
+ // The question text depends on the search direction.
+ bool bImpress = mpDrawDocument && mpDrawDocument->GetDocumentType() == DocumentType::Impress;
+
+ TranslateId pStringId;
+ if (mbDirectionIsForward)
+ pStringId = bImpress ? STR_SAR_WRAP_FORWARD : STR_SAR_WRAP_FORWARD_DRAW;
+ else
+ pStringId = bImpress ? STR_SAR_WRAP_BACKWARD : STR_SAR_WRAP_BACKWARD_DRAW;
+
+ // Pop up question box that asks the user whether to wrap around.
+ // The dialog is made modal with respect to the whole application.
+ weld::Window* pParent = GetMessageBoxParent();
+ std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(pParent,
+ VclMessageType::Question, VclButtonsType::YesNo, SdResId(pStringId)));
+ sal_uInt16 nBoxResult = xQueryBox->run();
+
+ return (nBoxResult == RET_YES);
+}
+
+void SdOutliner::PutTextIntoOutliner()
+{
+ mpSearchSpellTextObj = dynamic_cast<SdrTextObj*>( mpObj );
+ if ( mpSearchSpellTextObj && mpSearchSpellTextObj->HasText() && !mpSearchSpellTextObj->IsEmptyPresObj() )
+ {
+ SdrText* pText = mpSearchSpellTextObj->getText( maCurrentPosition.mnText );
+ mpParaObj = pText ? pText->GetOutlinerParaObject() : nullptr;
+
+ if (mpParaObj != nullptr)
+ {
+ SetText(*mpParaObj);
+
+ ClearModifyFlag();
+ }
+ }
+ else
+ {
+ mpSearchSpellTextObj = nullptr;
+ }
+}
+
+void SdOutliner::PrepareSpellCheck()
+{
+ EESpellState eState = HasSpellErrors();
+ DBG_ASSERT(eState != EESpellState::NoSpeller, "No SpellChecker");
+
+ if (eState == EESpellState::Ok)
+ return;
+
+ // When spell checking we have to test whether we have processed the
+ // whole document and have reached the start page again.
+ if (meMode == SPELL)
+ {
+ if (maSearchStartPosition == sd::outliner::Iterator())
+ // Remember the position of the first text object so that we
+ // know when we have processed the whole document.
+ maSearchStartPosition = maObjectIterator;
+ else if (maSearchStartPosition == maObjectIterator)
+ {
+ mbEndOfSearch = true;
+ }
+ }
+
+ EnterEditMode( false );
+}
+
+void SdOutliner::PrepareSearchAndReplace()
+{
+ if (!HasText( *mpSearchItem ))
+ return;
+
+ // Set the object now that we know it matches.
+ mpObj = SetObject(maCurrentPosition);
+
+ mbStringFound = true;
+ mbMatchMayExist = true;
+
+ EnterEditMode(false);
+
+ mpDrawDocument->GetDocSh()->SetWaitCursor( false );
+ // Start search at the right end of the current object's text
+ // depending on the search direction.
+ OutlinerView* pOutlinerView = getOutlinerView();
+ if (pOutlinerView != nullptr)
+ pOutlinerView->SetSelection (GetSearchStartPosition ());
+}
+
+void SdOutliner::SetViewMode (PageKind ePageKind)
+{
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ std::shared_ptr<sd::DrawViewShell> pDrawViewShell(
+ std::dynamic_pointer_cast<sd::DrawViewShell>(pViewShell));
+ if (pDrawViewShell == nullptr || ePageKind == pDrawViewShell->GetPageKind())
+ return;
+
+ // Restore old edit mode.
+ pDrawViewShell->ChangeEditMode(mpImpl->meOriginalEditMode, false);
+
+ SetStatusEventHdl(Link<EditStatus&,void>());
+ OUString sViewURL;
+ switch (ePageKind)
+ {
+ case PageKind::Standard:
+ default:
+ sViewURL = sd::framework::FrameworkHelper::msImpressViewURL;
+ break;
+ case PageKind::Notes:
+ sViewURL = sd::framework::FrameworkHelper::msNotesViewURL;
+ break;
+ case PageKind::Handout:
+ sViewURL = sd::framework::FrameworkHelper::msHandoutViewURL;
+ break;
+ }
+ // The text object iterator is destroyed when the shells are
+ // switched but we need it so save it and restore it afterwards.
+ sd::outliner::Iterator aIterator (maObjectIterator);
+ bool bMatchMayExist = mbMatchMayExist;
+
+ sd::ViewShellBase& rBase = pViewShell->GetViewShellBase();
+
+ rtl::Reference<sd::FuSearch> xFuSearch;
+ if (pViewShell->GetView())
+ xFuSearch = pViewShell->GetView()->getSearchContext().getFunctionSearch();
+
+ SetViewShell(std::shared_ptr<sd::ViewShell>());
+ sd::framework::FrameworkHelper::Instance(rBase)->RequestView(
+ sViewURL,
+ sd::framework::FrameworkHelper::msCenterPaneURL);
+
+ // Force (well, request) a synchronous update of the configuration.
+ // In a better world we would handle the asynchronous view update
+ // instead. But that would involve major restructuring of the
+ // Outliner code.
+ sd::framework::FrameworkHelper::Instance(rBase)->RequestSynchronousUpdate();
+
+ auto pNewViewShell = rBase.GetMainViewShell();
+ SetViewShell(pNewViewShell);
+ if (xFuSearch.is() && pNewViewShell->GetView())
+ pNewViewShell->GetView()->getSearchContext().setSearchFunction(xFuSearch);
+
+ // Switching to another view shell has intermediatly called
+ // EndSpelling(). A PrepareSpelling() is pending, so call that now.
+ PrepareSpelling();
+
+ // Update the number of pages so that
+ // <member>DetectChange()</member> has the correct value to compare
+ // to.
+ mnPageCount = mpDrawDocument->GetSdPageCount(ePageKind);
+
+ maObjectIterator = aIterator;
+ mbMatchMayExist = bMatchMayExist;
+
+ // Save edit mode so that it can be restored when switching the view
+ // shell again.
+ pDrawViewShell = std::dynamic_pointer_cast<sd::DrawViewShell>(pViewShell);
+ OSL_ASSERT(pDrawViewShell != nullptr);
+ if (pDrawViewShell != nullptr)
+ mpImpl->meOriginalEditMode = pDrawViewShell->GetEditMode();
+}
+
+void SdOutliner::SetPage (EditMode eEditMode, sal_uInt16 nPageIndex)
+{
+ if ( ! mbRestrictSearchToSelection)
+ {
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ std::shared_ptr<sd::DrawViewShell> pDrawViewShell(
+ std::dynamic_pointer_cast<sd::DrawViewShell>(pViewShell));
+ OSL_ASSERT(pDrawViewShell != nullptr);
+ if (pDrawViewShell != nullptr)
+ {
+ pDrawViewShell->ChangeEditMode(eEditMode, false);
+ pDrawViewShell->SwitchPage(nPageIndex);
+ }
+ }
+}
+
+void SdOutliner::EnterEditMode (bool bGrabFocus)
+{
+ OutlinerView* pOutlinerView = getOutlinerView();
+ if (!(pOutlinerView && mpSearchSpellTextObj))
+ return;
+
+ pOutlinerView->SetOutputArea( ::tools::Rectangle( Point(), Size(1, 1)));
+ SetPaperSize( mpSearchSpellTextObj->GetLogicRect().GetSize() );
+ SdrPageView* pPV = mpView->GetSdrPageView();
+
+ // Make FuText the current function.
+ SfxUInt16Item aItem (SID_TEXTEDIT, 1);
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ if (!(pViewShell && pViewShell->GetDispatcher()))
+ return;
+
+ pViewShell->GetDispatcher()->ExecuteList(
+ SID_TEXTEDIT, SfxCallMode::SYNCHRON | SfxCallMode::RECORD, {&aItem});
+
+ if (mpView->IsTextEdit())
+ {
+ // end text edition before starting it again
+ mpView->SdrEndTextEdit();
+ }
+
+ // To be consistent with the usual behaviour in the Office the text
+ // object that is put into edit mode would have also to be selected.
+ // Starting the text edit mode is not enough so we do it here by
+ // hand.
+ mpView->UnmarkAllObj(pPV);
+ mpView->MarkObj(mpSearchSpellTextObj, pPV);
+
+ mpSearchSpellTextObj->setActiveText(mnText);
+
+ // Turn on the edit mode for the text object.
+ SetUpdateLayout(true);
+ mpView->SdrBeginTextEdit(mpSearchSpellTextObj, pPV, mpWindow, true, this,
+ pOutlinerView, true, true, bGrabFocus);
+
+ mbFoundObject = true;
+}
+
+ESelection SdOutliner::GetSearchStartPosition() const
+{
+ ESelection aPosition;
+ if (mbDirectionIsForward)
+ {
+ // The default constructor uses the beginning of the text as default.
+ aPosition = ESelection ();
+ }
+ else
+ {
+ // Retrieve the position after the last character in the last
+ // paragraph.
+ sal_Int32 nParagraphCount = GetParagraphCount();
+ if (nParagraphCount == 0)
+ aPosition = ESelection();
+ else
+ {
+ sal_Int32 nLastParagraphLength = GetEditEngine().GetTextLen (
+ nParagraphCount-1);
+ aPosition = ESelection (nParagraphCount-1, nLastParagraphLength);
+ }
+ }
+
+ return aPosition;
+}
+
+bool SdOutliner::HasNoPreviousMatch()
+{
+ OutlinerView* pOutlinerView = getOutlinerView();
+
+ DBG_ASSERT (pOutlinerView!=nullptr, "outline view in SdOutliner::HasNoPreviousMatch is NULL");
+
+ // Detect whether the cursor stands at the beginning
+ // resp. at the end of the text.
+ return pOutlinerView->GetSelection() == GetSearchStartPosition();
+}
+
+bool SdOutliner::HandleFailedSearch()
+{
+ bool bContinueSearch = false;
+
+ OutlinerView* pOutlinerView = getOutlinerView();
+ if (pOutlinerView && mpSearchItem)
+ {
+ // Detect whether there is/may be a prior match. If there is then
+ // ask the user whether to wrap around. Otherwise tell the user
+ // that there is no match.
+ if (HasNoPreviousMatch ())
+ {
+ // No match found in the whole presentation.
+ SvxSearchDialogWrapper::SetSearchLabel(SearchLabel::NotFound);
+ }
+
+ else
+ {
+ // No further matches found. Ask the user whether to wrap
+ // around and start again.
+ bContinueSearch = ShowWrapAroundDialog();
+ }
+ }
+
+ return bContinueSearch;
+}
+
+SdrObject* SdOutliner::SetObject (
+ const sd::outliner::IteratorPosition& rPosition)
+{
+ SetViewMode (rPosition.mePageKind);
+ SetPage (rPosition.meEditMode, static_cast<sal_uInt16>(rPosition.mnPageIndex));
+ mnText = rPosition.mnText;
+ return rPosition.mxObject.get();
+}
+
+void SdOutliner::SetViewShell (const std::shared_ptr<sd::ViewShell>& rpViewShell)
+{
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ if (pViewShell == rpViewShell)
+ return;
+
+ // Set the new view shell.
+ mpWeakViewShell = rpViewShell;
+ // When the outline view is not owned by us then we have to clear
+ // that pointer so that the current one for the new view shell will
+ // be used (in ProvideOutlinerView).
+ if (rpViewShell)
+ {
+ mpView = rpViewShell->GetView();
+
+ mpWindow = rpViewShell->GetActiveWindow();
+
+ mpImpl->ProvideOutlinerView(*this, rpViewShell, mpWindow);
+ OutlinerView* pOutlinerView = getOutlinerView();
+ if (pOutlinerView != nullptr)
+ pOutlinerView->SetWindow(mpWindow);
+ }
+ else
+ {
+ mpView = nullptr;
+ mpWindow = nullptr;
+ }
+}
+
+void SdOutliner::HandleChangedSelection()
+{
+ maMarkListCopy.clear();
+ mbRestrictSearchToSelection = mpView->AreObjectsMarked();
+ if (!mbRestrictSearchToSelection)
+ return;
+
+ // Make a copy of the current mark list.
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ const size_t nCount = rMarkList.GetMarkCount();
+ if (nCount > 0)
+ {
+ maMarkListCopy.clear();
+ maMarkListCopy.reserve (nCount);
+ for (size_t i=0; i<nCount; ++i)
+ maMarkListCopy.emplace_back(rMarkList.GetMark(i)->GetMarkedSdrObj ());
+ }
+ else
+ // No marked object. Is this case possible?
+ mbRestrictSearchToSelection = false;
+}
+
+void SdOutliner::StartConversion( LanguageType nSourceLanguage, LanguageType nTargetLanguage,
+ const vcl::Font *pTargetFont, sal_Int32 nOptions, bool bIsInteractive )
+{
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ bool bMultiDoc = nullptr != dynamic_cast< const sd::DrawViewShell *>( pViewShell.get() );
+
+ meMode = TEXT_CONVERSION;
+ mbDirectionIsForward = true;
+ mpSearchItem.reset();
+ mnConversionLanguage = nSourceLanguage;
+
+ BeginConversion();
+
+ OutlinerView* pOutlinerView = getOutlinerView();
+ if (pOutlinerView != nullptr)
+ {
+ pOutlinerView->StartTextConversion(
+ GetMessageBoxParent(),
+ nSourceLanguage,
+ nTargetLanguage,
+ pTargetFont,
+ nOptions,
+ bIsInteractive,
+ bMultiDoc);
+ }
+
+ EndConversion();
+}
+
+/** Prepare to do a text conversion on the current text object. This
+ includes putting it into edit mode.
+*/
+void SdOutliner::PrepareConversion()
+{
+ SetUpdateLayout(true);
+ if( HasConvertibleTextPortion( mnConversionLanguage ) )
+ {
+ SetUpdateLayout(false);
+ mbStringFound = true;
+ mbMatchMayExist = true;
+
+ EnterEditMode(true);
+
+ mpDrawDocument->GetDocSh()->SetWaitCursor( false );
+ // Start search at the right end of the current object's text
+ // depending on the search direction.
+ }
+ else
+ {
+ SetUpdateLayout(false);
+ }
+}
+
+void SdOutliner::BeginConversion()
+{
+ SetRefDevice( SD_MOD()->GetVirtualRefDevice() );
+
+ sd::ViewShellBase* pBase = getViewShellBase();
+ if (pBase != nullptr)
+ SetViewShell (pBase->GetMainViewShell());
+
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ if (pViewShell)
+ {
+ mbStringFound = false;
+
+ // Supposed that we are not located at the very beginning/end of the
+ // document then there may be a match in the document prior/after
+ // the current position.
+ mbMatchMayExist = true;
+
+ maObjectIterator = sd::outliner::Iterator();
+ maSearchStartPosition = sd::outliner::Iterator();
+ RememberStartPosition();
+
+ mpImpl->ProvideOutlinerView(*this, pViewShell, mpWindow);
+
+ HandleChangedSelection ();
+ }
+ ClearModifyFlag();
+}
+
+void SdOutliner::EndConversion()
+{
+ EndSpelling();
+}
+
+bool SdOutliner::ConvertNextDocument()
+{
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ if (dynamic_cast< const sd::OutlineViewShell *>( pViewShell.get() ) )
+ return false;
+
+ mpDrawDocument->GetDocSh()->SetWaitCursor( true );
+
+ Initialize ( true );
+
+ OutlinerView* pOutlinerView = getOutlinerView();
+ if (pOutlinerView != nullptr)
+ {
+ mpWindow = pViewShell->GetActiveWindow();
+ pOutlinerView->SetWindow(mpWindow);
+ }
+ ProvideNextTextObject ();
+
+ mpDrawDocument->GetDocSh()->SetWaitCursor( false );
+ ClearModifyFlag();
+
+ // for text conversion we automatically wrap around one
+ // time and stop at the start shape
+ if( mpFirstObj )
+ {
+ if( (mnText == 0) && (mpFirstObj == mpObj) )
+ return false;
+ }
+ else
+ {
+ mpFirstObj = mpObj;
+ }
+
+ return !mbEndOfSearch;
+}
+
+weld::Window* SdOutliner::GetMessageBoxParent()
+{
+ // We assume that the parent of the given message box is NULL, i.e. it is
+ // modal with respect to the top application window. However, this
+ // does not affect the search dialog. Therefore we have to lock it here
+ // while the message box is being shown. We also have to take into
+ // account that we are called during a spell check and the search dialog
+ // is not available.
+ weld::Window* pSearchDialog = nullptr;
+ SfxChildWindow* pChildWindow = nullptr;
+ switch (meMode)
+ {
+ case SEARCH:
+ if (SfxViewFrame* pViewFrm = SfxViewFrame::Current())
+ pChildWindow = pViewFrm->GetChildWindow(
+ SvxSearchDialogWrapper::GetChildWindowId());
+ break;
+
+ case SPELL:
+ if (SfxViewFrame* pViewFrm = SfxViewFrame::Current())
+ pChildWindow = pViewFrm->GetChildWindow(
+ sd::SpellDialogChildWindow::GetChildWindowId());
+ break;
+
+ case TEXT_CONVERSION:
+ // There should no messages boxes be displayed while doing the
+ // hangul hanja conversion.
+ break;
+ }
+
+ if (pChildWindow != nullptr)
+ {
+ auto xController = pChildWindow->GetController();
+ pSearchDialog = xController ? xController->getDialog() : nullptr;
+ }
+
+ if (pSearchDialog)
+ return pSearchDialog;
+
+ std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+ auto pWin = pViewShell->GetActiveWindow();
+ return pWin ? pWin->GetFrameWeld() : nullptr;
+}
+
+//===== SdOutliner::Implementation ==============================================
+
+SdOutliner::Implementation::Implementation()
+ : meOriginalEditMode(EditMode::Page),
+ mbOwnOutlineView(false),
+ mpOutlineView(nullptr)
+{
+}
+
+SdOutliner::Implementation::~Implementation()
+{
+ if (mbOwnOutlineView && mpOutlineView!=nullptr)
+ {
+ mpOutlineView->SetWindow(nullptr);
+ delete mpOutlineView;
+ mpOutlineView = nullptr;
+ }
+}
+
+/** We try to create a new OutlinerView only when there is none available,
+ either from an OutlinerViewShell or a previous call to
+ ProvideOutlinerView(). This is necessary to support the spell checker
+ which can not cope with exchanging the OutlinerView.
+*/
+void SdOutliner::Implementation::ProvideOutlinerView (
+ Outliner& rOutliner,
+ const std::shared_ptr<sd::ViewShell>& rpViewShell,
+ vcl::Window* pWindow)
+{
+ if (rpViewShell == nullptr)
+ return;
+
+ switch (rpViewShell->GetShellType())
+ {
+ case sd::ViewShell::ST_DRAW:
+ case sd::ViewShell::ST_IMPRESS:
+ case sd::ViewShell::ST_NOTES:
+ case sd::ViewShell::ST_HANDOUT:
+ {
+ // Create a new outline view to do the search on.
+ bool bInsert = false;
+ if (mpOutlineView != nullptr && !mbOwnOutlineView)
+ mpOutlineView = nullptr;
+
+ if (mpOutlineView == nullptr || !rOutliner.GetEditEngine().HasView(&mpOutlineView->GetEditView()))
+ {
+ delete mpOutlineView;
+ mpOutlineView = new OutlinerView(&rOutliner, pWindow);
+ mbOwnOutlineView = true;
+ bInsert = true;
+ }
+ else
+ mpOutlineView->SetWindow(pWindow);
+
+ EVControlBits nStat = mpOutlineView->GetControlWord();
+ nStat &= ~EVControlBits::AUTOSCROLL;
+ mpOutlineView->SetControlWord(nStat);
+
+ if (bInsert)
+ rOutliner.InsertView( mpOutlineView );
+
+ rOutliner.SetUpdateLayout(false);
+ mpOutlineView->SetOutputArea (::tools::Rectangle (Point(), Size(1, 1)));
+ rOutliner.SetPaperSize( Size(1, 1) );
+ rOutliner.SetText(OUString(), rOutliner.GetParagraph(0));
+
+ meOriginalEditMode =
+ std::static_pointer_cast<sd::DrawViewShell>(rpViewShell)->GetEditMode();
+ }
+ break;
+
+ case sd::ViewShell::ST_OUTLINE:
+ {
+ if (mpOutlineView!=nullptr && mbOwnOutlineView)
+ delete mpOutlineView;
+ mpOutlineView = rOutliner.GetView(0);
+ mbOwnOutlineView = false;
+ }
+ break;
+
+ default:
+ case sd::ViewShell::ST_NONE:
+ case sd::ViewShell::ST_PRESENTATION:
+ // Ignored
+ break;
+ }
+}
+
+void SdOutliner::Implementation::ReleaseOutlinerView()
+{
+ if (mbOwnOutlineView)
+ {
+ OutlinerView* pView = mpOutlineView;
+ mpOutlineView = nullptr;
+ mbOwnOutlineView = false;
+ if (pView != nullptr)
+ {
+ pView->SetWindow(nullptr);
+ delete pView;
+ }
+ }
+ else
+ {
+ mpOutlineView = nullptr;
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/OutlinerIterator.cxx b/sd/source/ui/view/OutlinerIterator.cxx
new file mode 100644
index 000000000..8cdb29330
--- /dev/null
+++ b/sd/source/ui/view/OutlinerIterator.cxx
@@ -0,0 +1,798 @@
+/* -*- 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 <OutlinerIterator.hxx>
+#include <OutlinerIteratorImpl.hxx>
+#include <svx/svditer.hxx>
+#include <tools/debug.hxx>
+#include <osl/diagnose.h>
+#include <Outliner.hxx>
+
+#include <drawdoc.hxx>
+#include <DrawViewShell.hxx>
+#include <sdpage.hxx>
+
+namespace sd::outliner {
+
+//===== IteratorPosition ======================================================
+
+IteratorPosition::IteratorPosition()
+: mnText(0)
+, mnPageIndex(-1)
+, mePageKind(PageKind::Standard)
+, meEditMode(EditMode::Page)
+{
+}
+
+bool IteratorPosition::operator== (const IteratorPosition& aPosition) const
+{
+ return mxObject.get() == aPosition.mxObject.get()
+ && mnText == aPosition.mnText
+ && mnPageIndex == aPosition.mnPageIndex
+ && mePageKind == aPosition.mePageKind
+ && meEditMode == aPosition.meEditMode;
+}
+
+//===== Iterator ==============================================================
+
+Iterator::Iterator()
+{
+}
+
+Iterator::Iterator (const Iterator& rIterator)
+ : mxIterator(rIterator.mxIterator ? rIterator.mxIterator->Clone() : nullptr)
+{
+}
+
+Iterator::Iterator(Iterator&& rIterator) noexcept
+ : mxIterator(std::move(rIterator.mxIterator))
+{
+}
+
+Iterator::Iterator (std::unique_ptr<IteratorImplBase> pObject)
+ : mxIterator(std::move(pObject))
+{
+}
+
+Iterator::~Iterator()
+{
+}
+
+Iterator& Iterator::operator= (const Iterator& rIterator)
+{
+ if (this != &rIterator)
+ {
+ if (rIterator.mxIterator)
+ mxIterator.reset(rIterator.mxIterator->Clone());
+ else
+ mxIterator.reset();
+ }
+ return *this;
+}
+
+Iterator& Iterator::operator=(Iterator&& rIterator) noexcept
+{
+ mxIterator = std::move(rIterator.mxIterator);
+ return *this;
+}
+
+const IteratorPosition& Iterator::operator* () const
+{
+ DBG_ASSERT (mxIterator, "::sd::outliner::Iterator::operator* : missing implementation object");
+ return mxIterator->GetPosition();
+}
+
+Iterator& Iterator::operator++ ()
+{
+ if (mxIterator)
+ mxIterator->GotoNextText();
+ return *this;
+}
+
+bool Iterator::operator== (const Iterator& rIterator) const
+{
+ if (!mxIterator || !rIterator.mxIterator)
+ return mxIterator.get() == rIterator.mxIterator.get();
+ else
+ return *mxIterator == *rIterator.mxIterator;
+}
+
+bool Iterator::operator!= (const Iterator& rIterator) const
+{
+ return ! operator==(rIterator);
+}
+
+void Iterator::Reverse()
+{
+ if (mxIterator)
+ mxIterator->Reverse();
+}
+
+//===== IteratorFactory =======================================================
+
+OutlinerContainer::OutlinerContainer (SdOutliner* pOutliner)
+: mpOutliner(pOutliner)
+{
+}
+
+Iterator OutlinerContainer::begin()
+{
+ return CreateIterator (BEGIN);
+}
+
+Iterator OutlinerContainer::end()
+{
+ return CreateIterator (END);
+}
+
+Iterator OutlinerContainer::current()
+{
+ return CreateIterator (CURRENT);
+}
+
+Iterator OutlinerContainer::CreateIterator (IteratorLocation aLocation)
+{
+ // Decide on certain features of the outliner which kind of iterator to
+ // use.
+ if (mpOutliner->mbRestrictSearchToSelection)
+ // There is a selection. Search only in this.
+ return CreateSelectionIterator (
+ mpOutliner->maMarkListCopy,
+ mpOutliner->mpDrawDocument,
+ mpOutliner->mpWeakViewShell.lock(),
+ mpOutliner->mbDirectionIsForward,
+ aLocation);
+ else
+ // Search in the whole document.
+ return CreateDocumentIterator (
+ mpOutliner->mpDrawDocument,
+ mpOutliner->mpWeakViewShell.lock(),
+ mpOutliner->mbDirectionIsForward,
+ aLocation);
+}
+
+Iterator OutlinerContainer::CreateSelectionIterator (
+ const ::std::vector<::tools::WeakReference<SdrObject>>& rObjectList,
+ SdDrawDocument* pDocument,
+ const std::shared_ptr<ViewShell>& rpViewShell,
+ bool bDirectionIsForward,
+ IteratorLocation aLocation)
+{
+ OSL_ASSERT(rpViewShell);
+
+ sal_Int32 nObjectIndex;
+
+ if (bDirectionIsForward)
+ switch (aLocation)
+ {
+ case CURRENT:
+ case BEGIN:
+ default:
+ nObjectIndex = 0;
+ break;
+ case END:
+ nObjectIndex = rObjectList.size();
+ break;
+ }
+ else
+ switch (aLocation)
+ {
+ case CURRENT:
+ case BEGIN:
+ default:
+ nObjectIndex = rObjectList.size()-1;
+ break;
+ case END:
+ nObjectIndex = -1;
+ break;
+ }
+
+ return Iterator (std::make_unique<SelectionIteratorImpl> (
+ rObjectList, nObjectIndex, pDocument, rpViewShell, bDirectionIsForward));
+}
+
+Iterator OutlinerContainer::CreateDocumentIterator (
+ SdDrawDocument* pDocument,
+ const std::shared_ptr<ViewShell>& rpViewShell,
+ bool bDirectionIsForward,
+ IteratorLocation aLocation)
+{
+ OSL_ASSERT(rpViewShell);
+
+ PageKind ePageKind;
+ EditMode eEditMode;
+
+ switch (aLocation)
+ {
+ case BEGIN:
+ default:
+ if (bDirectionIsForward)
+ {
+ ePageKind = PageKind::Standard;
+ eEditMode = EditMode::Page;
+ }
+ else
+ {
+ ePageKind = PageKind::Handout;
+ eEditMode = EditMode::MasterPage;
+ }
+ break;
+
+ case END:
+ if (bDirectionIsForward)
+ {
+ ePageKind = PageKind::Handout;
+ eEditMode = EditMode::MasterPage;
+ }
+ else
+ {
+ ePageKind = PageKind::Standard;
+ eEditMode = EditMode::Page;
+ }
+ break;
+
+ case CURRENT:
+ const std::shared_ptr<DrawViewShell> pDrawViewShell(
+ std::dynamic_pointer_cast<DrawViewShell>(rpViewShell));
+ if (pDrawViewShell)
+ {
+ ePageKind = pDrawViewShell->GetPageKind();
+ eEditMode = pDrawViewShell->GetEditMode();
+ }
+ else
+ {
+ ePageKind = PageKind::Standard;
+ eEditMode = EditMode::Page;
+ }
+ break;
+ }
+
+ sal_Int32 nPageIndex = GetPageIndex (pDocument, rpViewShell,
+ ePageKind, eEditMode, bDirectionIsForward, aLocation);
+
+ return Iterator (
+ std::make_unique<DocumentIteratorImpl> (nPageIndex, ePageKind, eEditMode,
+ pDocument, rpViewShell, bDirectionIsForward));
+}
+
+sal_Int32 OutlinerContainer::GetPageIndex (
+ SdDrawDocument const * pDocument,
+ const std::shared_ptr<ViewShell>& rpViewShell,
+ PageKind ePageKind,
+ EditMode eEditMode,
+ bool bDirectionIsForward,
+ IteratorLocation aLocation)
+{
+ OSL_ASSERT(rpViewShell);
+
+ sal_Int32 nPageIndex;
+ sal_Int32 nPageCount;
+
+ const std::shared_ptr<DrawViewShell> pDrawViewShell(
+ std::dynamic_pointer_cast<DrawViewShell>(rpViewShell));
+
+ switch (eEditMode)
+ {
+ case EditMode::Page:
+ nPageCount = pDocument->GetSdPageCount (ePageKind);
+ break;
+ case EditMode::MasterPage:
+ nPageCount = pDocument->GetMasterSdPageCount(ePageKind);
+ break;
+ default:
+ nPageCount = 0;
+ }
+
+ switch (aLocation)
+ {
+ case CURRENT:
+ if (pDrawViewShell)
+ nPageIndex = pDrawViewShell->GetCurPagePos();
+ else
+ {
+ const SdPage* pPage = rpViewShell->GetActualPage();
+ if (pPage != nullptr)
+ nPageIndex = (pPage->GetPageNum()-1)/2;
+ else
+ nPageIndex = 0;
+ }
+ break;
+
+ case BEGIN:
+ default:
+ if (bDirectionIsForward)
+ nPageIndex = 0;
+ else
+ nPageIndex = nPageCount-1;
+ break;
+
+ case END:
+ if (bDirectionIsForward)
+ nPageIndex = nPageCount;
+ else
+ nPageIndex = -1;
+ break;
+ }
+
+ return nPageIndex;
+}
+
+//===== IteratorImplBase ====================================================
+
+IteratorImplBase::IteratorImplBase(SdDrawDocument* pDocument,
+ const std::weak_ptr<ViewShell>& rpViewShellWeak,
+ bool bDirectionIsForward)
+: mpDocument (pDocument)
+, mpViewShellWeak (rpViewShellWeak)
+, mbDirectionIsForward (bDirectionIsForward)
+{
+ std::shared_ptr<DrawViewShell> pDrawViewShell;
+ if ( ! mpViewShellWeak.expired())
+ pDrawViewShell = std::dynamic_pointer_cast<DrawViewShell>(rpViewShellWeak.lock());
+
+ if (pDrawViewShell)
+ {
+ maPosition.mePageKind = pDrawViewShell->GetPageKind();
+ maPosition.meEditMode = pDrawViewShell->GetEditMode();
+ }
+ else
+ {
+ maPosition.mePageKind = PageKind::Standard;
+ maPosition.meEditMode = EditMode::Page;
+ }
+}
+
+IteratorImplBase::IteratorImplBase( SdDrawDocument* pDocument,
+ const std::weak_ptr<ViewShell>& rpViewShellWeak,
+ bool bDirectionIsForward, PageKind ePageKind, EditMode eEditMode)
+: mpDocument (pDocument)
+, mpViewShellWeak (rpViewShellWeak)
+, mbDirectionIsForward (bDirectionIsForward)
+{
+ maPosition.mePageKind = ePageKind;
+ maPosition.meEditMode = eEditMode;
+}
+
+IteratorImplBase::~IteratorImplBase()
+{}
+
+bool IteratorImplBase::operator== (const IteratorImplBase& rIterator) const
+{
+ return maPosition == rIterator.maPosition;
+}
+
+bool IteratorImplBase::IsEqualSelection(const IteratorImplBase& rIterator) const
+{
+ // When this method is executed instead of the ones from derived classes
+ // then the argument is of another type then the object itself. In this
+ // just compare the position objects.
+ return maPosition == rIterator.maPosition;
+}
+
+const IteratorPosition& IteratorImplBase::GetPosition()
+{
+ return maPosition;
+}
+
+IteratorImplBase* IteratorImplBase::Clone (IteratorImplBase* pObject) const
+{
+ if (pObject != nullptr)
+ {
+ pObject->maPosition = maPosition;
+ pObject->mpDocument = mpDocument;
+ pObject->mpViewShellWeak = mpViewShellWeak;
+ pObject->mbDirectionIsForward = mbDirectionIsForward;
+ }
+ return pObject;
+}
+
+void IteratorImplBase::Reverse()
+{
+ mbDirectionIsForward = ! mbDirectionIsForward;
+}
+
+//===== SelectionIteratorImpl ===========================================
+
+SelectionIteratorImpl::SelectionIteratorImpl (
+ const ::std::vector<::tools::WeakReference<SdrObject>>& rObjectList,
+ sal_Int32 nObjectIndex,
+ SdDrawDocument* pDocument,
+ const std::weak_ptr<ViewShell>& rpViewShellWeak,
+ bool bDirectionIsForward)
+ : IteratorImplBase (pDocument, rpViewShellWeak, bDirectionIsForward),
+ mrObjectList(rObjectList),
+ mnObjectIndex(nObjectIndex)
+{
+}
+
+SelectionIteratorImpl::~SelectionIteratorImpl()
+{}
+
+IteratorImplBase* SelectionIteratorImpl::Clone (IteratorImplBase* pObject) const
+{
+ SelectionIteratorImpl* pIterator = static_cast<SelectionIteratorImpl*>(pObject);
+ if (pIterator == nullptr)
+ pIterator = new SelectionIteratorImpl (
+ mrObjectList, mnObjectIndex, mpDocument, mpViewShellWeak, mbDirectionIsForward);
+ return pIterator;
+}
+
+void SelectionIteratorImpl::GotoNextText()
+{
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mrObjectList.at(mnObjectIndex).get() );
+ if (mbDirectionIsForward)
+ {
+ if( pTextObj )
+ {
+ ++maPosition.mnText;
+ if( maPosition.mnText >= pTextObj->getTextCount() )
+ {
+ maPosition.mnText = 0;
+ ++mnObjectIndex;
+ }
+ }
+ else
+ {
+ ++mnObjectIndex;
+ }
+ }
+ else
+ {
+ if( pTextObj )
+ {
+ --maPosition.mnText;
+ if( maPosition.mnText < 0 )
+ {
+ maPosition.mnText = -1;
+ --mnObjectIndex;
+ }
+ }
+ else
+ {
+ --mnObjectIndex;
+ maPosition.mnText = -1;
+ }
+
+ if( (maPosition.mnText == -1) && (mnObjectIndex >= 0) )
+ {
+ pTextObj = dynamic_cast< SdrTextObj* >( mrObjectList.at(mnObjectIndex).get() );
+ if( pTextObj )
+ maPosition.mnText = pTextObj->getTextCount() - 1;
+ }
+
+ if( maPosition.mnText == -1 )
+ maPosition.mnText = 0;
+ }
+}
+
+const IteratorPosition& SelectionIteratorImpl::GetPosition()
+{
+ maPosition.mxObject = mrObjectList.at(mnObjectIndex);
+
+ return maPosition;
+}
+
+bool SelectionIteratorImpl::operator== (const IteratorImplBase& rIterator) const
+{
+ return rIterator.IsEqualSelection(*this);
+}
+
+bool SelectionIteratorImpl::IsEqualSelection(const IteratorImplBase& rIterator) const
+{
+ const SelectionIteratorImpl* pSelectionIterator =
+ static_cast<const SelectionIteratorImpl*>(&rIterator);
+ return mpDocument == pSelectionIterator->mpDocument
+ && mnObjectIndex == pSelectionIterator->mnObjectIndex;
+}
+
+//===== ViewIteratorImpl ================================================
+
+ViewIteratorImpl::ViewIteratorImpl (
+ sal_Int32 nPageIndex,
+ SdDrawDocument* pDocument,
+ const std::weak_ptr<ViewShell>& rpViewShellWeak,
+ bool bDirectionIsForward)
+ : IteratorImplBase (pDocument, rpViewShellWeak, bDirectionIsForward),
+ mbPageChangeOccurred(false),
+ mpPage(nullptr)
+{
+ SetPage (nPageIndex);
+}
+
+ViewIteratorImpl::ViewIteratorImpl (
+ sal_Int32 nPageIndex,
+ SdDrawDocument* pDocument,
+ const std::weak_ptr<ViewShell>& rpViewShellWeak,
+ bool bDirectionIsForward,
+ PageKind ePageKind,
+ EditMode eEditMode)
+ : IteratorImplBase (pDocument, rpViewShellWeak, bDirectionIsForward, ePageKind, eEditMode),
+ mbPageChangeOccurred(false),
+ mpPage(nullptr)
+{
+ SetPage (nPageIndex);
+}
+
+ViewIteratorImpl::~ViewIteratorImpl()
+{
+}
+
+IteratorImplBase* ViewIteratorImpl::Clone (IteratorImplBase* pObject) const
+{
+
+ ViewIteratorImpl* pIterator = static_cast<ViewIteratorImpl*>(pObject);
+ if (pIterator == nullptr)
+ pIterator = new ViewIteratorImpl (
+ maPosition.mnPageIndex, mpDocument, mpViewShellWeak, mbDirectionIsForward);
+
+ IteratorImplBase::Clone (pObject);
+
+ if (mpObjectIterator != nullptr)
+ {
+ pIterator->mpObjectIterator.reset( new SdrObjListIter(mpPage, SdrIterMode::DeepNoGroups, !mbDirectionIsForward) );
+
+ // No direct way to set the object iterator to the current object.
+ pIterator->maPosition.mxObject.reset(nullptr);
+ while (pIterator->mpObjectIterator->IsMore() && pIterator->maPosition.mxObject!=maPosition.mxObject)
+ pIterator->maPosition.mxObject.reset(pIterator->mpObjectIterator->Next());
+ }
+ else
+ pIterator->mpObjectIterator.reset();
+
+ return pIterator;
+}
+
+void ViewIteratorImpl::GotoNextText()
+{
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( maPosition.mxObject.get() );
+ if( pTextObj )
+ {
+ if (mbDirectionIsForward)
+ {
+ ++maPosition.mnText;
+ if( maPosition.mnText < pTextObj->getTextCount() )
+ return;
+ }
+ else
+ {
+ --maPosition.mnText;
+ if( maPosition.mnText >= 0 )
+ return;
+ }
+ }
+
+ if (mpObjectIterator != nullptr && mpObjectIterator->IsMore())
+ maPosition.mxObject.reset(mpObjectIterator->Next());
+ else
+ maPosition.mxObject.reset(nullptr);
+
+ if (!maPosition.mxObject.is() )
+ {
+ if (mbDirectionIsForward)
+ SetPage (maPosition.mnPageIndex+1);
+ else
+ SetPage (maPosition.mnPageIndex-1);
+
+ if (mpPage != nullptr)
+ mpObjectIterator.reset( new SdrObjListIter(mpPage, SdrIterMode::DeepNoGroups, !mbDirectionIsForward) );
+ if (mpObjectIterator!=nullptr && mpObjectIterator->IsMore())
+ maPosition.mxObject.reset(mpObjectIterator->Next());
+ else
+ maPosition.mxObject.reset(nullptr);
+ }
+
+ maPosition.mnText = 0;
+ if( !mbDirectionIsForward && maPosition.mxObject.is() )
+ {
+ pTextObj = dynamic_cast< SdrTextObj* >( maPosition.mxObject.get() );
+ if( pTextObj )
+ maPosition.mnText = pTextObj->getTextCount() - 1;
+ }
+}
+
+void ViewIteratorImpl::SetPage (sal_Int32 nPageIndex)
+{
+ mbPageChangeOccurred = (maPosition.mnPageIndex!=nPageIndex);
+ if (mbPageChangeOccurred)
+ {
+ maPosition.mnPageIndex = nPageIndex;
+
+ sal_Int32 nPageCount;
+ if (maPosition.meEditMode == EditMode::Page)
+ nPageCount = mpDocument->GetSdPageCount(maPosition.mePageKind);
+ else
+ nPageCount = mpDocument->GetMasterSdPageCount(
+ maPosition.mePageKind);
+
+ // Get page pointer. Here we have three cases: regular pages,
+ // master pages and invalid page indices. The later ones are not
+ // errors but the effect of the iterator advancing to the next page
+ // and going past the last one. This dropping of the rim at the far
+ // side is detected here and has to be reacted to by the caller.
+ if (nPageIndex>=0 && nPageIndex < nPageCount)
+ {
+ if (maPosition.meEditMode == EditMode::Page)
+ mpPage = mpDocument->GetSdPage (
+ static_cast<sal_uInt16>(nPageIndex),
+ maPosition.mePageKind);
+ else
+ mpPage = mpDocument->GetMasterSdPage (
+ static_cast<sal_uInt16>(nPageIndex),
+ maPosition.mePageKind);
+ }
+ else
+ mpPage = nullptr;
+ }
+
+ // Set up object list iterator.
+ if (mpPage != nullptr)
+ mpObjectIterator.reset( new SdrObjListIter(mpPage, SdrIterMode::DeepNoGroups, ! mbDirectionIsForward) );
+ else
+ mpObjectIterator.reset();
+
+ // Get object pointer.
+ if (mpObjectIterator!=nullptr && mpObjectIterator->IsMore())
+ maPosition.mxObject.reset( mpObjectIterator->Next() );
+ else
+ maPosition.mxObject.reset(nullptr);
+
+ maPosition.mnText = 0;
+ if( !mbDirectionIsForward && maPosition.mxObject.is() )
+ {
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( maPosition.mxObject.get() );
+ if( pTextObj )
+ maPosition.mnText = pTextObj->getTextCount() - 1;
+ }
+
+}
+
+void ViewIteratorImpl::Reverse()
+{
+ IteratorImplBase::Reverse ();
+
+ // Create reversed object list iterator.
+ if (mpPage != nullptr)
+ mpObjectIterator.reset( new SdrObjListIter(mpPage, SdrIterMode::DeepNoGroups, ! mbDirectionIsForward) );
+ else
+ mpObjectIterator.reset();
+
+ // Move iterator to the current object.
+ ::tools::WeakReference<SdrObject> xObject = std::move(maPosition.mxObject);
+
+ if (!mpObjectIterator)
+ return;
+
+ while (mpObjectIterator->IsMore() && maPosition.mxObject != xObject)
+ maPosition.mxObject.reset(mpObjectIterator->Next());
+}
+
+//===== DocumentIteratorImpl ============================================
+
+DocumentIteratorImpl::DocumentIteratorImpl (
+ sal_Int32 nPageIndex,
+ PageKind ePageKind, EditMode eEditMode,
+ SdDrawDocument* pDocument,
+ const std::weak_ptr<ViewShell>& rpViewShellWeak,
+ bool bDirectionIsForward)
+ : ViewIteratorImpl (nPageIndex, pDocument, rpViewShellWeak, bDirectionIsForward,
+ ePageKind, eEditMode)
+{
+ if (eEditMode == EditMode::Page)
+ mnPageCount = pDocument->GetSdPageCount (ePageKind);
+ else
+ mnPageCount = pDocument->GetMasterSdPageCount(ePageKind);
+}
+
+DocumentIteratorImpl::~DocumentIteratorImpl()
+{}
+
+IteratorImplBase* DocumentIteratorImpl::Clone (IteratorImplBase* pObject) const
+{
+ DocumentIteratorImpl* pIterator = static_cast<DocumentIteratorImpl*>(pObject);
+ if (pIterator == nullptr)
+ pIterator = new DocumentIteratorImpl (
+ maPosition.mnPageIndex, maPosition.mePageKind, maPosition.meEditMode,
+ mpDocument, mpViewShellWeak, mbDirectionIsForward);
+ // Finish the cloning.
+ return ViewIteratorImpl::Clone (pIterator);
+}
+
+void DocumentIteratorImpl::GotoNextText()
+{
+ bool bSetToOnePastLastPage = false;
+ bool bViewChanged = false;
+
+ ViewIteratorImpl::GotoNextText();
+
+ if (mbDirectionIsForward)
+ {
+ if (maPosition.mnPageIndex >= mnPageCount)
+ {
+ // Switch to master page.
+ if (maPosition.meEditMode == EditMode::Page)
+ {
+ maPosition.meEditMode = EditMode::MasterPage;
+ SetPage (0);
+ }
+
+ // Switch to next view mode.
+ else
+ {
+ if (maPosition.mePageKind == PageKind::Handout)
+ // Not really necessary but makes things more clear.
+ bSetToOnePastLastPage = true;
+ else
+ {
+ maPosition.meEditMode = EditMode::Page;
+ if (maPosition.mePageKind == PageKind::Standard)
+ maPosition.mePageKind = PageKind::Notes;
+ else if (maPosition.mePageKind == PageKind::Notes)
+ maPosition.mePageKind = PageKind::Handout;
+ SetPage (0);
+ }
+ }
+ bViewChanged = true;
+ }
+ }
+ else
+ if (maPosition.mnPageIndex < 0)
+ {
+ // Switch from master pages to draw pages.
+ if (maPosition.meEditMode == EditMode::MasterPage)
+ {
+ maPosition.meEditMode = EditMode::Page;
+ bSetToOnePastLastPage = true;
+ }
+
+ // Switch to previous view mode.
+ else
+ {
+ if (maPosition.mePageKind == PageKind::Standard)
+ SetPage (-1);
+ else
+ {
+ maPosition.meEditMode = EditMode::MasterPage;
+ if (maPosition.mePageKind == PageKind::Handout)
+ maPosition.mePageKind = PageKind::Notes;
+ else if (maPosition.mePageKind == PageKind::Notes)
+ maPosition.mePageKind = PageKind::Standard;
+ bSetToOnePastLastPage = true;
+ }
+ }
+ bViewChanged = true;
+ }
+
+ if (!bViewChanged)
+ return;
+
+ // Get new page count;
+ sal_Int32 nPageCount;
+ if (maPosition.meEditMode == EditMode::Page)
+ nPageCount = mpDocument->GetSdPageCount (maPosition.mePageKind);
+ else
+ nPageCount = mpDocument->GetMasterSdPageCount(maPosition.mePageKind);
+
+ // Now that we know the number of pages we can set the current page index.
+ if (bSetToOnePastLastPage)
+ SetPage (nPageCount);
+}
+
+} // end of namespace ::sd::outliner
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/PresentationViewShellBase.cxx b/sd/source/ui/view/PresentationViewShellBase.cxx
new file mode 100644
index 000000000..789afbbdd
--- /dev/null
+++ b/sd/source/ui/view/PresentationViewShellBase.cxx
@@ -0,0 +1,94 @@
+/* -*- 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 <PresentationViewShellBase.hxx>
+#include <DrawDocShell.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <framework/PresentationModule.hxx>
+
+#include <sfx2/viewfac.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/viewsh.hxx>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/frame/XFrame.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sd {
+
+class DrawDocShell;
+
+
+// We have to expand the SFX_IMPL_VIEWFACTORY macro to call LateInit() after a
+// new PresentationViewShellBase object has been constructed.
+
+SfxViewFactory* PresentationViewShellBase::s_pFactory;
+SfxViewShell* PresentationViewShellBase::CreateInstance (
+ SfxViewFrame *_pFrame, SfxViewShell *pOldView)
+{
+ PresentationViewShellBase* pBase =
+ new PresentationViewShellBase(_pFrame, pOldView);
+ pBase->LateInit(framework::FrameworkHelper::msPresentationViewURL);
+ return pBase;
+}
+void PresentationViewShellBase::RegisterFactory( SfxInterfaceId nPrio )
+{
+ s_pFactory = new SfxViewFactory(
+ &CreateInstance,nPrio,"FullScreenPresentation");
+ InitFactory();
+}
+void PresentationViewShellBase::InitFactory()
+{
+ SFX_VIEW_REGISTRATION(DrawDocShell);
+}
+
+PresentationViewShellBase::PresentationViewShellBase (
+ SfxViewFrame* _pFrame,
+ SfxViewShell* pOldShell)
+ : ViewShellBase (_pFrame, pOldShell)
+{
+ // Hide the automatic (non-context sensitive) tool bars.
+ Reference<beans::XPropertySet> xFrameSet (
+ _pFrame->GetFrame().GetFrameInterface(),
+ UNO_QUERY);
+ if (xFrameSet.is())
+ {
+ Reference<beans::XPropertySet> xLayouterSet(xFrameSet->getPropertyValue("LayoutManager"), UNO_QUERY);
+ if (xLayouterSet.is())
+ {
+ xLayouterSet->setPropertyValue("AutomaticToolbars", Any(false));
+ }
+ }
+}
+
+PresentationViewShellBase::~PresentationViewShellBase()
+{
+}
+
+void PresentationViewShellBase::InitializeFramework()
+{
+ css::uno::Reference<css::frame::XController>
+ xController (GetController());
+ sd::framework::PresentationModule::Initialize(xController);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/SlideSorterViewShellBase.cxx b/sd/source/ui/view/SlideSorterViewShellBase.cxx
new file mode 100644
index 000000000..ecf679c98
--- /dev/null
+++ b/sd/source/ui/view/SlideSorterViewShellBase.cxx
@@ -0,0 +1,68 @@
+/* -*- 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 <SlideSorterViewShellBase.hxx>
+#include <DrawDocShell.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <sfx2/viewfac.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/viewsh.hxx>
+
+namespace sd {
+
+class DrawDocShell;
+
+
+// We have to expand the SFX_IMPL_VIEWFACTORY macro to call LateInit() after a
+// new SlideSorterViewShellBase object has been constructed.
+
+SfxViewFactory* SlideSorterViewShellBase::s_pFactory;
+SfxViewShell* SlideSorterViewShellBase::CreateInstance (
+ SfxViewFrame *pFrame, SfxViewShell *pOldView)
+{
+ SlideSorterViewShellBase* pBase = new SlideSorterViewShellBase(pFrame, pOldView);
+ pBase->LateInit(framework::FrameworkHelper::msSlideSorterURL);
+ return pBase;
+}
+
+void SlideSorterViewShellBase::RegisterFactory( SfxInterfaceId nPrio )
+{
+ s_pFactory = new SfxViewFactory(&CreateInstance,nPrio,"SlideSorter");
+ InitFactory();
+}
+
+void SlideSorterViewShellBase::InitFactory()
+{
+ SFX_VIEW_REGISTRATION(DrawDocShell);
+}
+
+SlideSorterViewShellBase::SlideSorterViewShellBase (
+ SfxViewFrame* _pFrame,
+ SfxViewShell* pOldShell)
+ : ImpressViewShellBase (_pFrame, pOldShell)
+{
+}
+
+SlideSorterViewShellBase::~SlideSorterViewShellBase()
+{
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/ToolBarManager.cxx b/sd/source/ui/view/ToolBarManager.cxx
new file mode 100644
index 000000000..0bb0f9528
--- /dev/null
+++ b/sd/source/ui/view/ToolBarManager.cxx
@@ -0,0 +1,1375 @@
+/* -*- 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 <ToolBarManager.hxx>
+
+#include <DrawViewShell.hxx>
+#include <EventMultiplexer.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShellManager.hxx>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/frame/XLayoutManager.hpp>
+
+#include <sal/log.hxx>
+#include <osl/mutex.hxx>
+#include <o3tl/deleter.hxx>
+#include <o3tl/enumrange.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/objsh.hxx>
+#include <sfx2/toolbarids.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svl/eitem.hxx>
+#include <svx/svxids.hrc>
+#include <svx/extrusionbar.hxx>
+#include <svx/fontworkbar.hxx>
+#include <tools/debug.hxx>
+#include <tools/link.hxx>
+#include <vcl/svapp.hxx>
+#include <osl/diagnose.h>
+
+#include <map>
+#include <utility>
+#include <memory>
+#include <string_view>
+#include <vector>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace {
+
+using namespace sd;
+
+class ToolBarRules;
+
+/** Lock of the frame::XLayoutManager.
+*/
+class LayouterLock
+{
+ Reference<frame::XLayoutManager> mxLayouter;
+public:
+ explicit LayouterLock (const Reference<frame::XLayoutManager>& rxLayouter);
+ ~LayouterLock();
+ bool is() const { return mxLayouter.is(); }
+};
+
+/** Store a list of tool bars for each of the tool bar groups. From
+ this the list of requested tool bars is built.
+*/
+class ToolBarList
+{
+public:
+ ToolBarList();
+
+ void ClearGroup (sd::ToolBarManager::ToolBarGroup eGroup);
+ void AddToolBar (sd::ToolBarManager::ToolBarGroup eGroup, const OUString& rsName);
+ bool RemoveToolBar (sd::ToolBarManager::ToolBarGroup eGroup, const OUString& rsName);
+
+ void GetToolBarsToActivate (std::vector<OUString>& rToolBars) const;
+ void GetToolBarsToDeactivate (std::vector<OUString>& rToolBars) const;
+
+ void MarkToolBarAsActive (const OUString& rsName);
+ void MarkToolBarAsNotActive (const OUString& rsName);
+ void MarkAllToolBarsAsNotActive();
+
+private:
+ typedef ::std::map<sd::ToolBarManager::ToolBarGroup, std::vector<OUString> > Groups;
+ Groups maGroups;
+ std::vector<OUString> maActiveToolBars;
+
+ void MakeRequestedToolBarList (std::vector<OUString>& rToolBars) const;
+};
+
+/** Manage tool bars that are implemented as sub shells of a view shell.
+ The typical procedure of updating the sub shells of a view shell is to
+ rebuild a list of sub shells that the caller would like to have active.
+ The methods ClearGroup() and AddShellId() allow the caller to do that. A
+ final call to UpdateShells() activates the requested shells that are not
+ active and deactivates the active shells that are not requested .
+
+ This is done by maintaining two lists. One (the current list)
+ reflects the current state. The other (the requested list) contains the
+ currently requested shells. UpdateShells() makes the requested
+ list the current list and clears the current list.
+
+ Each shell belongs to one group. Different groups can be modified
+ separately.
+*/
+class ToolBarShellList
+{
+public:
+ /** Create a new object with an empty current list and an empty
+ requested list.
+ */
+ ToolBarShellList();
+
+ /** Remove all shells from a group. Calling this method should normally
+ not be necessary because after the construction or after a call to
+ UpdateShells() the requested list is empty.
+ @param eGroup
+ The group to clear. Shells in other groups are not modified.
+ */
+ void ClearGroup (sd::ToolBarManager::ToolBarGroup eGroup);
+
+ /** Add a shell. When the specified shell has already been requested
+ for another group then it is moved to this group.
+ @param eGroup
+ The group to which to add the shell.
+ @param nId
+ The id of the shell to add.
+ */
+ void AddShellId (sd::ToolBarManager::ToolBarGroup eGroup, sd::ShellId nId);
+
+ /** Releasing all shells means that the given ToolBarRules object is
+ informed that every shell managed by the called ToolBarShellList is
+ about to be removed and that the associated framework tool bars can
+ be removed as well. The caller still has to call UpdateShells().
+ */
+ void ReleaseAllShells (ToolBarRules& rRules);
+
+ /** The requested list is made the current list by activating all
+ shells in the requested list and by deactivating the shells in the
+ current list that are not in the requested list.
+ @param pMainViewShell
+ The shells that are activated or deactivated are sub shells of
+ this view shell.
+ @param rManager
+ This ViewShellManager is used to activate or deactivate shells.
+ */
+ void UpdateShells (
+ const std::shared_ptr<ViewShell>& rpMainViewShell,
+ const std::shared_ptr<ViewShellManager>& rpManager);
+
+private:
+ class ShellDescriptor
+ {public:
+ ShellDescriptor (ShellId nId,sd::ToolBarManager::ToolBarGroup eGroup);
+ ShellId mnId;
+ sd::ToolBarManager::ToolBarGroup meGroup;
+ friend bool operator<(const ShellDescriptor& r1, const ShellDescriptor& r2)
+ { return r1.mnId < r2.mnId; }
+ };
+
+ /** The requested list of tool bar shells that will be active after the
+ next call to UpdateShells().
+ */
+ typedef ::std::set<ShellDescriptor> GroupedShellList;
+ GroupedShellList maNewList;
+
+ /** The list of tool bar shells that are currently on the shell stack.
+ Using a GroupedShellList is not strictly necessary but it makes
+ things easier and does not waste too much memory.
+ */
+ GroupedShellList maCurrentList;
+};
+
+/** This class concentrates the knowledge about when to show what tool bars
+ in one place.
+*/
+class ToolBarRules
+{
+public:
+ ToolBarRules (
+ const std::shared_ptr<ToolBarManager>& rpToolBarManager,
+ const std::shared_ptr<ViewShellManager>& rpViewShellManager);
+
+ /** This method calls MainViewShellChanged() and SelectionHasChanged()
+ for the current main view shell and its view.
+ */
+ void Update (ViewShellBase const & rBase);
+
+ /** Reset all tool bars in all groups and add tool bars and tool bar
+ shells to the ToolBarGroup::Permanent group for the specified ViewShell type.
+ */
+ void MainViewShellChanged (ViewShell::ShellType nShellType);
+
+ /** Reset all tool bars in all groups and add tool bars and tool bar
+ shells to the ToolBarGroup::Permanent group for the specified ViewShell.
+ */
+ void MainViewShellChanged (const ViewShell& rMainViewShell);
+
+ /** Reset all tool bars in the ToolBarGroup::Function group and add tool bars and tool bar
+ shells to this group for the current selection.
+ */
+ void SelectionHasChanged (
+ const ::sd::ViewShell& rViewShell,
+ const SdrView& rView);
+
+ /** Add a tool bar for the specified tool bar shell.
+ */
+ void SubShellAdded (
+ ::sd::ToolBarManager::ToolBarGroup eGroup,
+ sd::ShellId nShellId);
+
+ /** Remove a tool bar for the specified tool bar shell.
+ */
+ void SubShellRemoved (
+ ::sd::ToolBarManager::ToolBarGroup eGroup,
+ sd::ShellId nShellId);
+
+private:
+ std::shared_ptr<ToolBarManager> mpToolBarManager;
+ std::shared_ptr<ViewShellManager> mpViewShellManager;
+};
+
+} // end of anonymous namespace
+
+namespace sd {
+
+//===== ToolBarManager::Implementation ========================================
+
+class ToolBarManager::Implementation
+{
+public:
+ /** This constructor takes three arguments even though the
+ ToolBarManager could be taken from the ViewShellBase. This is so to
+ state explicitly which information has to be present when this
+ constructor is called. The ViewShellBase may not have been fully
+ initialized at this point and must not be asked for this values.
+ */
+ Implementation (
+ ViewShellBase& rBase,
+ const std::shared_ptr<sd::tools::EventMultiplexer>& rpMultiplexer,
+ const std::shared_ptr<ViewShellManager>& rpViewShellManager,
+ const std::shared_ptr<ToolBarManager>& rpToolBarManager);
+ ~Implementation();
+
+ void SetValid (bool bValid);
+
+ void ResetToolBars (ToolBarGroup eGroup);
+ void ResetAllToolBars();
+ void AddToolBar (ToolBarGroup eGroup, const OUString& rsToolBarName);
+ void AddToolBarShell (ToolBarGroup eGroup, ShellId nToolBarId);
+ void RemoveToolBar (ToolBarGroup eGroup, const OUString& rsToolBarName);
+
+ /** Release all tool bar shells and the associated framework tool bars.
+ Typically called when the main view shell is being replaced by
+ another, all tool bar shells are released. In that process the
+ shells are destroyed anyway and without calling this method they
+ would still be referenced.
+ */
+ void ReleaseAllToolBarShells();
+
+ void ToolBarsDestroyed();
+
+ void RequestUpdate();
+
+ void PreUpdate();
+ void PostUpdate();
+ /** Tell the XLayoutManager about the tool bars that we would like to be
+ shown.
+ @param rpLayouterLock
+ This typically is the mpSynchronousLayouterLock that is used in
+ this method and that is either released at its end or assigned
+ to mpAsynchronousLock in order to be unlocked later.
+ */
+ void Update (::std::unique_ptr<LayouterLock> pLayouterLock);
+
+ class UpdateLockImplementation
+ {
+ public:
+ explicit UpdateLockImplementation (Implementation& rImplementation)
+ : mrImplementation(rImplementation) { mrImplementation.LockUpdate(); }
+ ~UpdateLockImplementation() { mrImplementation.UnlockUpdate(); }
+ private:
+ Implementation& mrImplementation;
+ };
+
+ void LockViewShellManager();
+ void LockUpdate();
+ void UnlockUpdate();
+
+ ToolBarRules& GetToolBarRules() { return maToolBarRules;}
+
+private:
+ mutable ::osl::Mutex maMutex;
+ ViewShellBase& mrBase;
+ std::shared_ptr<sd::tools::EventMultiplexer> mpEventMultiplexer;
+ bool mbIsValid;
+ ToolBarList maToolBarList;
+ ToolBarShellList maToolBarShellList;
+ Reference<frame::XLayoutManager> mxLayouter;
+ sal_Int32 mnLockCount;
+ bool mbPreUpdatePending;
+ bool mbPostUpdatePending;
+ /** The layouter locks manage the locking of the XLayoutManager. The
+ lock() and unlock() functions are not called directly because the
+ (final) unlocking is usually done asynchronously *after* the
+ list of requested toolbars is updated.
+ */
+ ::std::unique_ptr<LayouterLock> mpSynchronousLayouterLock;
+ ::std::unique_ptr<LayouterLock> mpAsynchronousLayouterLock;
+ ::std::unique_ptr<ViewShellManager::UpdateLock, o3tl::default_delete<ViewShellManager::UpdateLock>> mpViewShellManagerLock;
+ ImplSVEvent * mnPendingUpdateCall;
+ ImplSVEvent * mnPendingSetValidCall;
+ ToolBarRules maToolBarRules;
+
+ static OUString GetToolBarResourceName (std::u16string_view rsBaseName);
+ bool CheckPlugInMode (std::u16string_view rsName) const;
+
+ DECL_LINK(UpdateCallback, void *, void);
+ DECL_LINK(EventMultiplexerCallback, sd::tools::EventMultiplexerEvent&, void);
+ DECL_LINK(SetValidCallback, void*, void);
+};
+
+//===== ToolBarManager ========================================================
+
+std::shared_ptr<ToolBarManager> ToolBarManager::Create (
+ ViewShellBase& rBase,
+ const std::shared_ptr<sd::tools::EventMultiplexer>& rpMultiplexer,
+ const std::shared_ptr<ViewShellManager>& rpViewShellManager)
+{
+ std::shared_ptr<ToolBarManager> pManager (new ToolBarManager());
+ pManager->mpImpl.reset(
+ new Implementation(rBase,rpMultiplexer,rpViewShellManager,pManager));
+ return pManager;
+}
+
+ToolBarManager::ToolBarManager()
+{
+}
+
+ToolBarManager::~ToolBarManager()
+{
+}
+
+void ToolBarManager::Shutdown()
+{
+ if (mpImpl != nullptr)
+ mpImpl.reset();
+}
+
+void ToolBarManager::ResetToolBars (ToolBarGroup eGroup)
+{
+ if (mpImpl != nullptr)
+ {
+ UpdateLock aLock (shared_from_this());
+ mpImpl->ResetToolBars(eGroup);
+ }
+}
+
+void ToolBarManager::ResetAllToolBars()
+{
+ if (mpImpl != nullptr)
+ {
+ UpdateLock aLock (shared_from_this());
+ mpImpl->ResetAllToolBars();
+ }
+}
+
+void ToolBarManager::AddToolBar (
+ ToolBarGroup eGroup,
+ const OUString& rsToolBarName)
+{
+ if (mpImpl != nullptr)
+ {
+ UpdateLock aLock (shared_from_this());
+ mpImpl->AddToolBar(eGroup,rsToolBarName);
+ }
+}
+
+void ToolBarManager::AddToolBarShell (
+ ToolBarGroup eGroup,
+ ShellId nToolBarId)
+{
+ if (mpImpl != nullptr)
+ {
+ UpdateLock aLock (shared_from_this());
+ mpImpl->AddToolBarShell(eGroup,nToolBarId);
+ }
+}
+
+void ToolBarManager::RemoveToolBar (
+ ToolBarGroup eGroup,
+ const OUString& rsToolBarName)
+{
+ if (mpImpl != nullptr)
+ {
+ UpdateLock aLock (shared_from_this());
+ mpImpl->RemoveToolBar(eGroup,rsToolBarName);
+ }
+}
+
+void ToolBarManager::SetToolBar (
+ ToolBarGroup eGroup,
+ const OUString& rsToolBarName)
+{
+ if (mpImpl != nullptr)
+ {
+ UpdateLock aLock (shared_from_this());
+ mpImpl->ResetToolBars(eGroup);
+ mpImpl->AddToolBar(eGroup,rsToolBarName);
+ }
+}
+
+void ToolBarManager::SetToolBarShell (
+ ToolBarGroup eGroup,
+ ShellId nToolBarId)
+{
+ if (mpImpl != nullptr)
+ {
+ UpdateLock aLock (shared_from_this());
+ mpImpl->ResetToolBars(eGroup);
+ mpImpl->AddToolBarShell(eGroup,nToolBarId);
+ }
+}
+
+void ToolBarManager::PreUpdate()
+{
+ if (mpImpl != nullptr)
+ mpImpl->PreUpdate();
+}
+
+void ToolBarManager::RequestUpdate()
+{
+ if (mpImpl != nullptr)
+ mpImpl->RequestUpdate();
+}
+
+void ToolBarManager::LockViewShellManager()
+{
+ if (mpImpl != nullptr)
+ mpImpl->LockViewShellManager();
+}
+
+void ToolBarManager::LockUpdate()
+{
+ if (mpImpl != nullptr)
+ mpImpl->LockUpdate();
+}
+
+void ToolBarManager::UnlockUpdate()
+{
+ if (mpImpl != nullptr)
+ mpImpl->UnlockUpdate();
+}
+
+void ToolBarManager::MainViewShellChanged ()
+{
+ if (mpImpl != nullptr)
+ {
+ mpImpl->ReleaseAllToolBarShells();
+ mpImpl->GetToolBarRules().MainViewShellChanged(ViewShell::ST_NONE);
+ }
+}
+
+void ToolBarManager::MainViewShellChanged (const ViewShell& rMainViewShell)
+{
+ if (mpImpl != nullptr)
+ {
+ mpImpl->ReleaseAllToolBarShells();
+ mpImpl->GetToolBarRules().MainViewShellChanged(rMainViewShell);
+ }
+}
+
+void ToolBarManager::SelectionHasChanged (
+ const ViewShell& rViewShell,
+ const SdrView& rView)
+{
+ if (mpImpl != nullptr)
+ mpImpl->GetToolBarRules().SelectionHasChanged(rViewShell,rView);
+}
+
+void ToolBarManager::ToolBarsDestroyed()
+{
+ if (mpImpl != nullptr)
+ mpImpl->ToolBarsDestroyed();
+}
+
+//===== ToolBarManager::Implementation =======================================
+
+ToolBarManager::Implementation::Implementation (
+ ViewShellBase& rBase,
+ const std::shared_ptr<sd::tools::EventMultiplexer>& rpMultiplexer,
+ const std::shared_ptr<ViewShellManager>& rpViewShellManager,
+ const std::shared_ptr<ToolBarManager>& rpToolBarManager)
+ : mrBase(rBase),
+ mpEventMultiplexer(rpMultiplexer),
+ mbIsValid(false),
+ mnLockCount(0),
+ mbPreUpdatePending(false),
+ mbPostUpdatePending(false),
+ mnPendingUpdateCall(nullptr),
+ mnPendingSetValidCall(nullptr),
+ maToolBarRules(rpToolBarManager,rpViewShellManager)
+{
+ Link<tools::EventMultiplexerEvent&,void> aLink (LINK(this,ToolBarManager::Implementation,EventMultiplexerCallback));
+ mpEventMultiplexer->AddEventListener( aLink );
+}
+
+/** The order of statements is important.
+ First unregister listeners, which may post user events.
+ Then remove pending user events.
+*/
+ToolBarManager::Implementation::~Implementation()
+{
+ // Unregister at broadcasters.
+ Link<tools::EventMultiplexerEvent&,void> aLink (LINK(this,ToolBarManager::Implementation,EventMultiplexerCallback));
+ mpEventMultiplexer->RemoveEventListener(aLink);
+
+ // Abort pending user calls.
+ if (mnPendingUpdateCall != nullptr)
+ Application::RemoveUserEvent(mnPendingUpdateCall);
+ if (mnPendingSetValidCall != nullptr)
+ Application::RemoveUserEvent(mnPendingSetValidCall);
+}
+
+void ToolBarManager::Implementation::ToolBarsDestroyed()
+{
+ maToolBarList.MarkAllToolBarsAsNotActive();
+}
+
+void ToolBarManager::Implementation::SetValid (bool bValid)
+{
+ ::osl::MutexGuard aGuard(maMutex);
+
+ if (mbIsValid == bValid)
+ return;
+
+ UpdateLockImplementation aUpdateLock (*this);
+
+ mbIsValid = bValid;
+ if (mbIsValid)
+ {
+ Reference<frame::XFrame> xFrame;
+ if (mrBase.GetViewFrame() != nullptr)
+ xFrame = mrBase.GetViewFrame()->GetFrame().GetFrameInterface();
+ try
+ {
+ Reference<beans::XPropertySet> xFrameProperties (xFrame, UNO_QUERY_THROW);
+ Any aValue (xFrameProperties->getPropertyValue("LayoutManager"));
+ aValue >>= mxLayouter;
+ // tdf#119997 if mpSynchronousLayouterLock was created before mxLayouter was
+ // set then update it now that its available
+ if (mpSynchronousLayouterLock && !mpSynchronousLayouterLock->is())
+ mpSynchronousLayouterLock.reset(new LayouterLock(mxLayouter));
+ }
+ catch (const RuntimeException&)
+ {
+ }
+
+ GetToolBarRules().Update(mrBase);
+ }
+ else
+ {
+ ResetAllToolBars();
+ mxLayouter = nullptr;
+ }
+}
+
+void ToolBarManager::Implementation::ResetToolBars (ToolBarGroup eGroup)
+{
+ ::osl::MutexGuard aGuard(maMutex);
+
+ maToolBarList.ClearGroup(eGroup);
+ maToolBarShellList.ClearGroup(eGroup);
+
+ mbPreUpdatePending = true;
+}
+
+void ToolBarManager::Implementation::ResetAllToolBars()
+{
+ SAL_INFO("sd.view", __func__ << ": resetting all tool bars");
+ for (auto i : o3tl::enumrange<ToolBarGroup>())
+ ResetToolBars(i);
+}
+
+void ToolBarManager::Implementation::AddToolBar (
+ ToolBarGroup eGroup,
+ const OUString& rsToolBarName)
+{
+ ::osl::MutexGuard aGuard(maMutex);
+
+ if (CheckPlugInMode(rsToolBarName))
+ {
+ maToolBarList.AddToolBar(eGroup,rsToolBarName);
+
+ mbPostUpdatePending = true;
+ if (mnLockCount == 0)
+ PostUpdate();
+ }
+}
+
+void ToolBarManager::Implementation::RemoveToolBar (
+ ToolBarGroup eGroup,
+ const OUString& rsToolBarName)
+{
+ ::osl::MutexGuard aGuard(maMutex);
+
+ if (maToolBarList.RemoveToolBar(eGroup,rsToolBarName))
+ {
+ mbPreUpdatePending = true;
+ if (mnLockCount == 0)
+ PreUpdate();
+ }
+}
+
+void ToolBarManager::Implementation::AddToolBarShell (
+ ToolBarGroup eGroup,
+ ShellId nToolBarId)
+{
+ ViewShell* pMainViewShell = mrBase.GetMainViewShell().get();
+ if (pMainViewShell != nullptr)
+ {
+ maToolBarShellList.AddShellId(eGroup,nToolBarId);
+ GetToolBarRules().SubShellAdded(eGroup, nToolBarId);
+ }
+}
+
+void ToolBarManager::Implementation::ReleaseAllToolBarShells()
+{
+ maToolBarShellList.ReleaseAllShells(GetToolBarRules());
+ maToolBarShellList.UpdateShells(mrBase.GetMainViewShell(), mrBase.GetViewShellManager());
+}
+
+void ToolBarManager::Implementation::RequestUpdate()
+{
+ if (mnPendingUpdateCall == nullptr)
+ {
+ mnPendingUpdateCall = Application::PostUserEvent(
+ LINK(this,ToolBarManager::Implementation,UpdateCallback));
+ }
+}
+
+void ToolBarManager::Implementation::PreUpdate()
+{
+ ::osl::MutexGuard aGuard(maMutex);
+
+ if (!(mbIsValid
+ && mbPreUpdatePending
+ && mxLayouter.is()))
+ return;
+
+ mbPreUpdatePending = false;
+
+ SAL_INFO("sd.view", __func__ << ": ToolBarManager::PreUpdate [");
+
+ // Get the list of tool bars that are not used anymore and are to be
+ // deactivated.
+ std::vector<OUString> aToolBars;
+ maToolBarList.GetToolBarsToDeactivate(aToolBars);
+
+ // Turn off the tool bars.
+ for (const auto& aToolBar : aToolBars)
+ {
+ OUString sFullName (GetToolBarResourceName(aToolBar));
+ SAL_INFO("sd.view", __func__ << ": turning off tool bar " << sFullName);
+ mxLayouter->destroyElement(sFullName);
+ maToolBarList.MarkToolBarAsNotActive(aToolBar);
+ }
+
+ SAL_INFO("sd.view", __func__ << ": ToolBarManager::PreUpdate ]");
+}
+
+void ToolBarManager::Implementation::PostUpdate()
+{
+ ::osl::MutexGuard aGuard(maMutex);
+
+ if (!(mbIsValid
+ && mbPostUpdatePending
+ && mxLayouter.is()))
+ return;
+
+ mbPostUpdatePending = false;
+
+ // Create the list of requested tool bars.
+ std::vector<OUString> aToolBars;
+ maToolBarList.GetToolBarsToActivate(aToolBars);
+
+ SAL_INFO("sd.view", __func__ << ": ToolBarManager::PostUpdate [");
+
+ // Turn on the tool bars that are visible in the new context.
+ for (const auto& aToolBar : aToolBars)
+ {
+ OUString sFullName (GetToolBarResourceName(aToolBar));
+ SAL_INFO("sd.view", __func__ << ": turning on tool bar " << sFullName);
+ mxLayouter->requestElement(sFullName);
+ maToolBarList.MarkToolBarAsActive(aToolBar);
+ }
+
+ SAL_INFO("sd.view", __func__ << ": ToolBarManager::PostUpdate ]");
+}
+
+void ToolBarManager::Implementation::LockViewShellManager()
+{
+ if (mpViewShellManagerLock == nullptr)
+ mpViewShellManagerLock.reset(
+ new ViewShellManager::UpdateLock(mrBase.GetViewShellManager()));
+}
+
+void ToolBarManager::Implementation::LockUpdate()
+{
+ SAL_INFO("sd.view", __func__ << ": LockUpdate " << mnLockCount);
+ ::osl::MutexGuard aGuard(maMutex);
+
+ DBG_ASSERT(mnLockCount<100, "ToolBarManager lock count unusually high");
+ if (mnLockCount == 0)
+ {
+ OSL_ASSERT(mpSynchronousLayouterLock == nullptr);
+
+ mpSynchronousLayouterLock.reset(new LayouterLock(mxLayouter));
+ }
+ ++mnLockCount;
+}
+
+void ToolBarManager::Implementation::UnlockUpdate()
+{
+ SAL_INFO("sd.view", __func__ << ": UnlockUpdate " << mnLockCount);
+ ::osl::MutexGuard aGuard(maMutex);
+
+ OSL_ASSERT(mnLockCount>0);
+ --mnLockCount;
+ if (mnLockCount == 0)
+ {
+ Update(std::move(mpSynchronousLayouterLock));
+ }
+}
+
+void ToolBarManager::Implementation::Update (
+ ::std::unique_ptr<LayouterLock> pLocalLayouterLock)
+{
+ // When the lock is released and there are pending changes to the set of
+ // tool bars then update this set now.
+ if (mnLockCount != 0)
+ return;
+
+ // During creation of ViewShellBase we may have the situation that
+ // the controller has already been created and attached to the frame
+ // but that the ToolBarManager has not yet completed its
+ // initialization (by initializing the mxLayouter member.) We do
+ // this here so that we do not have to wait for the next Update()
+ // call to show the tool bars.
+ if (mnPendingSetValidCall != nullptr)
+ {
+ Application::RemoveUserEvent(mnPendingSetValidCall);
+ mnPendingSetValidCall = nullptr;
+ SetValid(true);
+ }
+
+ if (mbIsValid && mxLayouter.is() && (mbPreUpdatePending || mbPostUpdatePending))
+ {
+ // 1) Release UNO tool bars that are no longer used. Do this
+ // now so that they are not updated when the SFX shell stack is
+ // modified.
+ if (mbPreUpdatePending)
+ PreUpdate();
+
+ // 2) Update the requested shells that represent tool bar
+ // functionality. Those that are not used anymore are
+ // deactivated now. Those that are missing are activated in the
+ // next step together with the view shells.
+ if (mpViewShellManagerLock == nullptr)
+ mpViewShellManagerLock.reset(
+ new ViewShellManager::UpdateLock(mrBase.GetViewShellManager()));
+ maToolBarShellList.UpdateShells(
+ mrBase.GetMainViewShell(),
+ mrBase.GetViewShellManager());
+
+ // 3) Unlock the ViewShellManager::UpdateLock. This updates the
+ // shell stack.
+ mpViewShellManagerLock.reset();
+
+ // 4) Make the UNO tool bars visible. The outstanding call to
+ // PostUpdate() is done via PostUserEvent() so that it is
+ // guaranteed to be executed when the SFX shell stack has been
+ // updated (under the assumption that our lock to the
+ // ViewShellManager was the only one open. If that is not the
+ // case then all should still be well but not as fast.)
+
+ // Note that the lock count may have been increased since
+ // entering this method. In that case one of the next
+ // UnlockUpdate() calls will post the UpdateCallback.
+ if (mnLockCount==0)
+ {
+ mpAsynchronousLayouterLock = std::move(pLocalLayouterLock);
+ if (mnPendingUpdateCall==nullptr)
+ {
+ mnPendingUpdateCall = Application::PostUserEvent(
+ LINK(this,ToolBarManager::Implementation,UpdateCallback));
+ }
+ }
+ }
+ else
+ {
+ mpViewShellManagerLock.reset();
+ pLocalLayouterLock.reset();
+ }
+}
+
+IMPL_LINK_NOARG(ToolBarManager::Implementation, UpdateCallback, void*, void)
+{
+ mnPendingUpdateCall = nullptr;
+ if (mnLockCount == 0)
+ {
+ if (mbPreUpdatePending)
+ PreUpdate();
+ if (mbPostUpdatePending)
+ PostUpdate();
+ if (mbIsValid && mxLayouter.is())
+ mpAsynchronousLayouterLock.reset();
+ }
+}
+
+IMPL_LINK(ToolBarManager::Implementation,EventMultiplexerCallback,
+ sd::tools::EventMultiplexerEvent&, rEvent, void)
+{
+ SolarMutexGuard g;
+ switch (rEvent.meEventId)
+ {
+ case EventMultiplexerEventId::ControllerAttached:
+ if (mnPendingSetValidCall == nullptr)
+ mnPendingSetValidCall
+ = Application::PostUserEvent(LINK(this,Implementation,SetValidCallback));
+ break;
+
+ case EventMultiplexerEventId::ControllerDetached:
+ SetValid(false);
+ break;
+
+ default: break;
+ }
+}
+
+IMPL_LINK_NOARG(ToolBarManager::Implementation, SetValidCallback, void*, void)
+{
+ mnPendingSetValidCall = nullptr;
+ SetValid(true);
+}
+
+OUString ToolBarManager::Implementation::GetToolBarResourceName (
+ std::u16string_view rsBaseName)
+{
+ return OUString::Concat("private:resource/toolbar/") + rsBaseName;
+}
+
+bool ToolBarManager::Implementation::CheckPlugInMode (std::u16string_view rsName) const
+{
+ bool bValid (false);
+
+ // Determine the plug in mode.
+ bool bIsPlugInMode (false);
+ do
+ {
+ SfxObjectShell* pObjectShell = mrBase.GetObjectShell();
+ if (pObjectShell == nullptr)
+ break;
+
+ SfxMedium* pMedium = pObjectShell->GetMedium();
+ if (pMedium == nullptr)
+ break;
+
+ const SfxBoolItem* pViewOnlyItem = SfxItemSet::GetItem<SfxBoolItem>(pMedium->GetItemSet(), SID_VIEWONLY, false);
+ if (pViewOnlyItem == nullptr)
+ break;
+
+ bIsPlugInMode = pViewOnlyItem->GetValue();
+ }
+ while (false);
+
+ if (rsName == msViewerToolBar)
+ bValid = bIsPlugInMode;
+ else
+ bValid = ! bIsPlugInMode;
+
+ return bValid;
+}
+
+} // end of namespace sd
+
+namespace {
+
+using namespace ::sd;
+
+//===== LayouterLock ==========================================================
+
+LayouterLock::LayouterLock (const Reference<frame::XLayoutManager>& rxLayouter)
+ : mxLayouter(rxLayouter)
+{
+ SAL_INFO("sd.view", __func__ << ": LayouterLock " << (mxLayouter.is() ? 1 :0));
+ if (mxLayouter.is())
+ mxLayouter->lock();
+}
+
+LayouterLock::~LayouterLock()
+{
+ SAL_INFO("sd.view", __func__ << ": ~LayouterLock " << (mxLayouter.is() ? 1 :0));
+ if (mxLayouter.is())
+ mxLayouter->unlock();
+}
+
+//===== ToolBarRules ==========================================================
+
+ToolBarRules::ToolBarRules (
+ const std::shared_ptr<sd::ToolBarManager>& rpToolBarManager,
+ const std::shared_ptr<sd::ViewShellManager>& rpViewShellManager)
+ : mpToolBarManager(rpToolBarManager),
+ mpViewShellManager(rpViewShellManager)
+{
+}
+
+void ToolBarRules::Update (ViewShellBase const & rBase)
+{
+ ViewShell* pMainViewShell = rBase.GetMainViewShell().get();
+ if (pMainViewShell != nullptr)
+ {
+ MainViewShellChanged(pMainViewShell->GetShellType());
+ if (pMainViewShell->GetView())
+ SelectionHasChanged (*pMainViewShell, *pMainViewShell->GetView());
+ }
+ else
+ MainViewShellChanged(ViewShell::ST_NONE);
+}
+
+void ToolBarRules::MainViewShellChanged (ViewShell::ShellType nShellType)
+{
+ ::sd::ToolBarManager::UpdateLock aToolBarManagerLock (mpToolBarManager);
+ ::sd::ViewShellManager::UpdateLock aViewShellManagerLock (mpViewShellManager);
+
+ mpToolBarManager->ResetAllToolBars();
+
+ switch(nShellType)
+ {
+ case ::sd::ViewShell::ST_IMPRESS:
+ case ::sd::ViewShell::ST_NOTES:
+ case ::sd::ViewShell::ST_HANDOUT:
+ mpToolBarManager->AddToolBar(
+ ToolBarManager::ToolBarGroup::Permanent,
+ ToolBarManager::msToolBar);
+ mpToolBarManager->AddToolBar(
+ ToolBarManager::ToolBarGroup::Permanent,
+ ToolBarManager::msOptionsToolBar);
+ mpToolBarManager->AddToolBar(
+ ToolBarManager::ToolBarGroup::Permanent,
+ ToolBarManager::msViewerToolBar);
+ break;
+
+ case ::sd::ViewShell::ST_DRAW:
+ mpToolBarManager->AddToolBar(
+ ToolBarManager::ToolBarGroup::Permanent,
+ ToolBarManager::msToolBar);
+ mpToolBarManager->AddToolBar(
+ ToolBarManager::ToolBarGroup::Permanent,
+ ToolBarManager::msOptionsToolBar);
+ mpToolBarManager->AddToolBar(
+ ToolBarManager::ToolBarGroup::Permanent,
+ ToolBarManager::msViewerToolBar);
+ break;
+
+ case ViewShell::ST_OUTLINE:
+ mpToolBarManager->AddToolBar(
+ ToolBarManager::ToolBarGroup::Permanent,
+ ToolBarManager::msOutlineToolBar);
+ mpToolBarManager->AddToolBar(
+ ToolBarManager::ToolBarGroup::Permanent,
+ ToolBarManager::msViewerToolBar);
+ mpToolBarManager->AddToolBarShell(
+ ToolBarManager::ToolBarGroup::Permanent, ToolbarId::Draw_Text_Toolbox_Sd);
+ break;
+
+ case ViewShell::ST_SLIDE_SORTER:
+ mpToolBarManager->AddToolBar(
+ ToolBarManager::ToolBarGroup::Permanent,
+ ToolBarManager::msViewerToolBar);
+ mpToolBarManager->AddToolBar(
+ ToolBarManager::ToolBarGroup::Permanent,
+ ToolBarManager::msSlideSorterToolBar);
+ mpToolBarManager->AddToolBar(
+ ToolBarManager::ToolBarGroup::Permanent,
+ ToolBarManager::msSlideSorterObjectBar);
+ break;
+
+ case ViewShell::ST_NONE:
+ case ViewShell::ST_PRESENTATION:
+ case ViewShell::ST_SIDEBAR:
+ default:
+ break;
+ }
+}
+
+void ToolBarRules::MainViewShellChanged (const ViewShell& rMainViewShell)
+{
+ ::sd::ToolBarManager::UpdateLock aToolBarManagerLock (mpToolBarManager);
+ ::sd::ViewShellManager::UpdateLock aViewShellManagerLock (mpViewShellManager);
+
+ MainViewShellChanged(rMainViewShell.GetShellType());
+ switch(rMainViewShell.GetShellType())
+ {
+ case ::sd::ViewShell::ST_IMPRESS:
+ case ::sd::ViewShell::ST_DRAW:
+ case ::sd::ViewShell::ST_NOTES:
+ {
+ const DrawViewShell* pDrawViewShell
+ = dynamic_cast<const DrawViewShell*>(&rMainViewShell);
+ if (pDrawViewShell != nullptr)
+ {
+ if (pDrawViewShell->GetEditMode() == EditMode::MasterPage)
+ mpToolBarManager->AddToolBar(
+ ToolBarManager::ToolBarGroup::MasterMode,
+ ToolBarManager::msMasterViewToolBar);
+ else if ( rMainViewShell.GetShellType() != ::sd::ViewShell::ST_DRAW )
+ mpToolBarManager->AddToolBar(
+ ToolBarManager::ToolBarGroup::CommonTask,
+ ToolBarManager::msCommonTaskToolBar);
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+}
+
+void ToolBarRules::SelectionHasChanged (
+ const ::sd::ViewShell& rViewShell,
+ const SdrView& rView)
+{
+ ::sd::ToolBarManager::UpdateLock aLock (mpToolBarManager);
+ mpToolBarManager->LockViewShellManager();
+ bool bTextEdit = rView.IsTextEdit();
+
+ mpToolBarManager->ResetToolBars(ToolBarManager::ToolBarGroup::Function);
+
+ switch (rView.GetContext())
+ {
+ case SdrViewContext::Graphic:
+ if( !bTextEdit )
+ mpToolBarManager->SetToolBarShell(ToolBarManager::ToolBarGroup::Function, ToolbarId::Draw_Graf_Toolbox);
+ break;
+
+ case SdrViewContext::Media:
+ if( !bTextEdit )
+ mpToolBarManager->SetToolBarShell(ToolBarManager::ToolBarGroup::Function, ToolbarId::Draw_Media_Toolbox);
+ break;
+
+ case SdrViewContext::Table:
+ mpToolBarManager->SetToolBarShell(ToolBarManager::ToolBarGroup::Function, ToolbarId::Draw_Table_Toolbox);
+ bTextEdit = true;
+ break;
+
+ case SdrViewContext::Standard:
+ default:
+ if( !bTextEdit )
+ {
+ switch(rViewShell.GetShellType())
+ {
+ case ::sd::ViewShell::ST_IMPRESS:
+ case ::sd::ViewShell::ST_DRAW:
+ case ::sd::ViewShell::ST_NOTES:
+ case ::sd::ViewShell::ST_HANDOUT:
+ mpToolBarManager->SetToolBar(
+ ToolBarManager::ToolBarGroup::Function,
+ ToolBarManager::msDrawingObjectToolBar);
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ }
+
+ if( bTextEdit )
+ mpToolBarManager->AddToolBarShell(ToolBarManager::ToolBarGroup::Function, ToolbarId::Draw_Text_Toolbox_Sd);
+
+ SdrView* pView = &const_cast<SdrView&>(rView);
+ // Check if the extrusion tool bar and the fontwork tool bar have to
+ // be activated.
+ if (svx::checkForSelectedCustomShapes(pView, true /* bOnlyExtruded */ ))
+ mpToolBarManager->AddToolBarShell(ToolBarManager::ToolBarGroup::Function, ToolbarId::Svx_Extrusion_Bar);
+
+ if (svx::checkForSelectedFontWork(pView))
+ mpToolBarManager->AddToolBarShell(ToolBarManager::ToolBarGroup::Function, ToolbarId::Svx_Fontwork_Bar);
+
+ // Switch on additional context-sensitive tool bars.
+ if (rView.GetContext() == SdrViewContext::PointEdit)
+ mpToolBarManager->AddToolBarShell(ToolBarManager::ToolBarGroup::Function, ToolbarId::Bezier_Toolbox_Sd);
+}
+
+void ToolBarRules::SubShellAdded (
+ ::sd::ToolBarManager::ToolBarGroup eGroup,
+ sd::ShellId nShellId)
+{
+ // For some tool bar shells (those defined in sd) we have to add the
+ // actual tool bar here.
+ switch (nShellId)
+ {
+ case ToolbarId::Draw_Graf_Toolbox:
+ mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msGraphicObjectBar);
+ break;
+
+ case ToolbarId::Draw_Media_Toolbox:
+ mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msMediaObjectBar);
+ break;
+
+ case ToolbarId::Draw_Text_Toolbox_Sd:
+ mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msTextObjectBar);
+ break;
+
+ case ToolbarId::Bezier_Toolbox_Sd:
+ mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msBezierObjectBar);
+ break;
+
+ case ToolbarId::Draw_Table_Toolbox:
+ mpToolBarManager->AddToolBar(eGroup, ToolBarManager::msTableObjectBar);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void ToolBarRules::SubShellRemoved (
+ ::sd::ToolBarManager::ToolBarGroup eGroup,
+ sd::ShellId nShellId)
+{
+ // For some tool bar shells (those defined in sd) we have to add the
+ // actual tool bar here.
+ switch (nShellId)
+ {
+ case ToolbarId::Draw_Graf_Toolbox:
+ mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msGraphicObjectBar);
+ break;
+
+ case ToolbarId::Draw_Media_Toolbox:
+ mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msMediaObjectBar);
+ break;
+
+ case ToolbarId::Draw_Text_Toolbox_Sd:
+ mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msTextObjectBar);
+ break;
+
+ case ToolbarId::Bezier_Toolbox_Sd:
+ mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msBezierObjectBar);
+ break;
+
+ case ToolbarId::Draw_Table_Toolbox:
+ mpToolBarManager->RemoveToolBar(eGroup, ToolBarManager::msTableObjectBar);
+ break;
+
+ default:
+ break;
+ }
+}
+
+//===== ToolBarList ===========================================================
+
+ToolBarList::ToolBarList()
+{
+}
+
+void ToolBarList::ClearGroup (sd::ToolBarManager::ToolBarGroup eGroup)
+{
+ Groups::iterator iGroup (maGroups.find(eGroup));
+ if (iGroup != maGroups.end())
+ {
+ iGroup->second.clear();
+ }
+}
+
+void ToolBarList::AddToolBar (
+ sd::ToolBarManager::ToolBarGroup eGroup,
+ const OUString& rsName)
+{
+ Groups::iterator iGroup (maGroups.find(eGroup));
+ if (iGroup == maGroups.end())
+ iGroup = maGroups.emplace(eGroup,std::vector<OUString>()).first;
+
+ if (iGroup != maGroups.end())
+ {
+ auto iBar (std::find(iGroup->second.cbegin(),iGroup->second.cend(),rsName));
+ if (iBar == iGroup->second.cend())
+ {
+ iGroup->second.push_back(rsName);
+ }
+ }
+}
+
+bool ToolBarList::RemoveToolBar (
+ sd::ToolBarManager::ToolBarGroup eGroup,
+ const OUString& rsName)
+{
+ Groups::iterator iGroup (maGroups.find(eGroup));
+ if (iGroup != maGroups.end())
+ {
+ auto iBar (std::find(iGroup->second.begin(),iGroup->second.end(),rsName));
+ if (iBar != iGroup->second.end())
+ {
+ iGroup->second.erase(iBar);
+ return true;
+ }
+ }
+ return false;
+}
+
+void ToolBarList::MakeRequestedToolBarList (std::vector<OUString>& rRequestedToolBars) const
+{
+ for (auto eGroup : o3tl::enumrange<sd::ToolBarManager::ToolBarGroup>())
+ {
+ Groups::const_iterator iGroup (maGroups.find(eGroup));
+ if (iGroup != maGroups.end())
+ rRequestedToolBars.insert( rRequestedToolBars.end(),
+ iGroup->second.begin(),
+ iGroup->second.end() );
+ }
+}
+
+void ToolBarList::GetToolBarsToActivate (std::vector<OUString>& rToolBars) const
+{
+ std::vector<OUString> aRequestedToolBars;
+ MakeRequestedToolBarList(aRequestedToolBars);
+
+ for (const auto& aToolBar : aRequestedToolBars)
+ {
+ if (::std::find(maActiveToolBars.begin(),maActiveToolBars.end(),aToolBar)
+ == maActiveToolBars.end())
+ {
+ rToolBars.push_back(aToolBar);
+ }
+ }
+}
+
+void ToolBarList::GetToolBarsToDeactivate (std::vector<OUString>& rToolBars) const
+{
+ std::vector<OUString> aRequestedToolBars;
+ MakeRequestedToolBarList(aRequestedToolBars);
+
+ for (auto& aToolBar : maActiveToolBars)
+ {
+ if (::std::find(aRequestedToolBars.begin(),aRequestedToolBars.end(),aToolBar)
+ == aRequestedToolBars.end())
+ {
+ rToolBars.push_back(aToolBar);
+ }
+ }
+}
+
+void ToolBarList::MarkToolBarAsActive (const OUString& rsName)
+{
+ maActiveToolBars.push_back(rsName);
+}
+
+void ToolBarList::MarkToolBarAsNotActive (const OUString& rsName)
+{
+ maActiveToolBars.erase(
+ ::std::find(maActiveToolBars.begin(),maActiveToolBars.end(), rsName));
+}
+
+void ToolBarList::MarkAllToolBarsAsNotActive()
+{
+ maActiveToolBars.clear();
+}
+
+//===== ToolBarShellList ======================================================
+
+ToolBarShellList::ShellDescriptor::ShellDescriptor (
+ ShellId nId,
+ sd::ToolBarManager::ToolBarGroup eGroup)
+ : mnId(nId),
+ meGroup(eGroup)
+{
+}
+
+ToolBarShellList::ToolBarShellList()
+{
+}
+
+void ToolBarShellList::ClearGroup (sd::ToolBarManager::ToolBarGroup eGroup)
+{
+ for (GroupedShellList::iterator iDescriptor = maNewList.begin(); iDescriptor != maNewList.end(); )
+ if (iDescriptor->meGroup == eGroup)
+ iDescriptor = maNewList.erase(iDescriptor);
+ else
+ ++iDescriptor;
+}
+
+void ToolBarShellList::AddShellId (sd::ToolBarManager::ToolBarGroup eGroup, sd::ShellId nId)
+{
+ // Make sure that the shell is not added twice (and possibly in
+ // different groups.)
+ ShellDescriptor aDescriptor (nId,eGroup);
+ GroupedShellList::iterator iDescriptor (maNewList.find(aDescriptor));
+ if (iDescriptor != maNewList.end())
+ {
+ // The shell is already requested.
+ if (iDescriptor->meGroup != eGroup)
+ {
+ // It is now being requested for another group.
+ // (Is this an error?)
+ // Move it to that group.
+ maNewList.erase(iDescriptor);
+ maNewList.insert(aDescriptor);
+ }
+ // else nothing to do.
+ }
+ else
+ maNewList.insert(aDescriptor);
+}
+
+void ToolBarShellList::ReleaseAllShells (ToolBarRules& rRules)
+{
+ // Release the currently active tool bars.
+ GroupedShellList aList (maCurrentList);
+ for (const auto& rDescriptor : aList)
+ {
+ rRules.SubShellRemoved(rDescriptor.meGroup, rDescriptor.mnId);
+ }
+
+ // Clear the list of requested tool bars.
+ maNewList.clear();
+}
+
+void ToolBarShellList::UpdateShells (
+ const std::shared_ptr<ViewShell>& rpMainViewShell,
+ const std::shared_ptr<ViewShellManager>& rpManager)
+{
+ if (rpMainViewShell == nullptr)
+ return;
+
+ GroupedShellList aList;
+
+ // Deactivate shells that are in maCurrentList, but not in
+ // maNewList.
+ ::std::set_difference(maCurrentList.begin(), maCurrentList.end(),
+ maNewList.begin(), maNewList.end(),
+ std::insert_iterator<GroupedShellList>(aList,aList.begin()));
+ for (const auto& rShell : aList)
+ {
+ SAL_INFO("sd.view", __func__ << ": deactivating tool bar shell " << static_cast<sal_uInt32>(rShell.mnId));
+ rpManager->DeactivateSubShell(*rpMainViewShell, rShell.mnId);
+ }
+
+ // Activate shells that are in maNewList, but not in
+ // maCurrentList.
+ aList.clear();
+ ::std::set_difference(maNewList.begin(), maNewList.end(),
+ maCurrentList.begin(), maCurrentList.end(),
+ std::insert_iterator<GroupedShellList>(aList,aList.begin()));
+ for (const auto& rShell : aList)
+ {
+ SAL_INFO("sd.view", __func__ << ": activating tool bar shell " << static_cast<sal_uInt32>(rShell.mnId));
+ rpManager->ActivateSubShell(*rpMainViewShell, rShell.mnId);
+ }
+
+ // The maNewList now reflects the current state and thus is made
+ // maCurrentList.
+ maCurrentList = maNewList;
+}
+
+} // end of anonymous namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/ViewClipboard.cxx b/sd/source/ui/view/ViewClipboard.cxx
new file mode 100644
index 000000000..c17bf7de1
--- /dev/null
+++ b/sd/source/ui/view/ViewClipboard.cxx
@@ -0,0 +1,240 @@
+/* -*- 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 <ViewClipboard.hxx>
+
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <View.hxx>
+#include <ViewShell.hxx>
+#include <Window.hxx>
+
+#include <drawdoc.hxx>
+#include <sdmod.hxx>
+#include <sdpage.hxx>
+#include <sdxfer.hxx>
+#include <strings.hxx>
+
+#include <svx/svdpagv.hxx>
+#include <vcl/svapp.hxx>
+
+namespace sd {
+
+ViewClipboard::ViewClipboard (::sd::View& rView)
+ : mrView(rView)
+{
+}
+
+ViewClipboard::~ViewClipboard()
+{
+}
+
+void ViewClipboard::HandlePageDrop (const SdTransferable& rTransferable)
+{
+ // Determine whether to insert the given set of slides or to assign a
+ // given master page.
+ // tdf#113405 only assign master pages to normal pages, don't attempt to assign a master
+ // page to a master page
+ sd::DrawViewShell* pDrawViewShell = dynamic_cast<::sd::DrawViewShell*>(mrView.GetViewShell());
+ SdPage* pMasterPage = (pDrawViewShell && pDrawViewShell->GetEditMode() == EditMode::Page) ? GetFirstMasterPage(rTransferable) : nullptr;
+ if (pMasterPage)
+ AssignMasterPage (rTransferable, pMasterPage);
+ else
+ InsertSlides (rTransferable, DetermineInsertPosition ());
+}
+
+SdPage* ViewClipboard::GetFirstMasterPage (const SdTransferable& rTransferable)
+{
+ SdPage* pFirstMasterPage = nullptr;
+
+ if (rTransferable.HasPageBookmarks())
+ {
+ do
+ {
+ const std::vector<OUString> &rBookmarks = rTransferable.GetPageBookmarks();
+
+ if (rBookmarks.empty())
+ break;
+
+ DrawDocShell* pDocShell = rTransferable.GetPageDocShell();
+ if (pDocShell == nullptr)
+ break;
+
+ SdDrawDocument* pDocument = pDocShell->GetDoc();
+ if (pDocument == nullptr)
+ break;
+
+ for (const OUString& sName : rBookmarks)
+ {
+ bool bIsMasterPage;
+
+ // SdPage* GetMasterSdPage(sal_uInt16 nPgNum, PageKind ePgKind);
+ // sal_uInt16 GetMasterSdPageCount(PageKind ePgKind) const;
+
+ sal_uInt16 nBMPage = pDocument->GetPageByName (
+ sName, bIsMasterPage);
+ if ( ! bIsMasterPage)
+ {
+ // At least one regular slide: return NULL to indicate
+ // that not all bookmarks point to master pages.
+ pFirstMasterPage = nullptr;
+ break;
+ }
+ else if (pFirstMasterPage == nullptr)
+ {
+ // Remember the first master page for later.
+ if (nBMPage != SDRPAGE_NOTFOUND)
+ pFirstMasterPage = static_cast<SdPage*>(
+ pDocument->GetMasterPage(nBMPage));
+ }
+ }
+ }
+ while (false);
+ }
+
+ return pFirstMasterPage;
+}
+
+void ViewClipboard::AssignMasterPage (
+ const SdTransferable& rTransferable,
+ SdPage const * pMasterPage)
+{
+ if (pMasterPage == nullptr)
+ return;
+
+ // Get the target page to which the master page is assigned.
+ SdrPageView* pPageView = mrView.GetSdrPageView();
+ if (pPageView == nullptr)
+ return;
+
+ SdPage* pPage = static_cast<SdPage*>(pPageView->GetPage());
+ if (pPage == nullptr)
+ return;
+
+ SdDrawDocument& rDocument = mrView.GetDoc();
+
+ if ( ! rTransferable.HasPageBookmarks())
+ return;
+
+ DrawDocShell* pDataDocShell = rTransferable.GetPageDocShell();
+ if (pDataDocShell == nullptr)
+ return;
+
+ SdDrawDocument* pSourceDocument = pDataDocShell->GetDoc();
+ if (pSourceDocument == nullptr)
+ return;
+
+ // We have to remove the layout suffix from the layout name which is
+ // appended again by SetMasterPage() to the given name. Don't ask.
+ OUString sLayoutSuffix = SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE;
+ sal_Int32 nLength = sLayoutSuffix.getLength();
+ OUString sLayoutName = pMasterPage->GetLayoutName();
+ if (sLayoutName.endsWith(sLayoutSuffix))
+ sLayoutName = sLayoutName.copy(0, sLayoutName.getLength() - nLength);
+
+ rDocument.SetMasterPage (
+ pPage->GetPageNum() / 2,
+ sLayoutName,
+ pSourceDocument,
+ false, // Exchange the master page of only the target page.
+ false // Keep unused master pages.
+ );
+}
+
+sal_uInt16 ViewClipboard::DetermineInsertPosition ()
+{
+ SdDrawDocument& rDoc = mrView.GetDoc();
+ sal_uInt16 nPgCnt = rDoc.GetSdPageCount( PageKind::Standard );
+
+ // Insert position is the behind the last selected page or behind the
+ // last page when the selection is empty.
+ sal_uInt16 nInsertPos = rDoc.GetSdPageCount( PageKind::Standard ) * 2 + 1;
+ for( sal_uInt16 nPage = 0; nPage < nPgCnt; nPage++ )
+ {
+ SdPage* pPage = rDoc.GetSdPage( nPage, PageKind::Standard );
+
+ if( pPage->IsSelected() )
+ nInsertPos = nPage * 2 + 3;
+ }
+
+ return nInsertPos;
+}
+
+sal_uInt16 ViewClipboard::InsertSlides (
+ const SdTransferable& rTransferable,
+ sal_uInt16 nInsertPosition)
+{
+ SdDrawDocument& rDoc = mrView.GetDoc();
+
+ sal_uInt16 nInsertPgCnt = 0;
+ bool bMergeMasterPages = !rTransferable.HasSourceDoc( &rDoc );
+
+ // Prepare the insertion.
+ const std::vector<OUString> *pBookmarkList = nullptr;
+ DrawDocShell* pDataDocSh;
+ if (rTransferable.HasPageBookmarks())
+ {
+ // When the transferable contains page bookmarks then the referenced
+ // pages are inserted.
+ pBookmarkList = &rTransferable.GetPageBookmarks();
+ pDataDocSh = rTransferable.GetPageDocShell();
+ nInsertPgCnt = static_cast<sal_uInt16>(pBookmarkList->size());
+ }
+ else
+ {
+ // Otherwise all pages of the document of the transferable are
+ // inserted.
+ SfxObjectShell* pShell = rTransferable.GetDocShell().get();
+ pDataDocSh = static_cast<DrawDocShell*>(pShell);
+ SdDrawDocument* pDataDoc = pDataDocSh->GetDoc();
+
+ if (pDataDoc!=nullptr && pDataDoc->GetSdPageCount(PageKind::Standard))
+ nInsertPgCnt = pDataDoc->GetSdPageCount(PageKind::Standard);
+ }
+ if (nInsertPgCnt > 0)
+ {
+ const SolarMutexGuard aGuard;
+ ::sd::Window* pWin = mrView.GetViewShell()->GetActiveWindow();
+ const bool bWait = pWin && pWin->IsWait();
+
+ if( bWait )
+ pWin->LeaveWait();
+
+ rDoc.InsertBookmarkAsPage(
+ pBookmarkList ? *pBookmarkList : std::vector<OUString>(),
+ nullptr,
+ false,
+ false,
+ nInsertPosition,
+ (&rTransferable == SD_MOD()->pTransferDrag),
+ pDataDocSh,
+ true,
+ bMergeMasterPages,
+ false);
+
+ if( bWait )
+ pWin->EnterWait();
+ }
+
+ return nInsertPgCnt;
+}
+
+} // end of namespace ::sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/ViewShellBase.cxx b/sd/source/ui/view/ViewShellBase.cxx
new file mode 100644
index 000000000..26245971f
--- /dev/null
+++ b/sd/source/ui/view/ViewShellBase.cxx
@@ -0,0 +1,1456 @@
+/* -*- 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 <comphelper/processfactory.hxx>
+
+#include <ViewShellBase.hxx>
+#include <algorithm>
+#include <EventMultiplexer.hxx>
+#include <cache/SlsPageCacheManager.hxx>
+#include <app.hrc>
+#include <slideshow.hxx>
+#include <unokywds.hxx>
+#include <svx/svxids.hrc>
+#include <DrawDocShell.hxx>
+#include <ViewShellManager.hxx>
+#include <DrawController.hxx>
+#include <FrameView.hxx>
+#include <ViewTabBar.hxx>
+#include <sfx2/event.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/printer.hxx>
+#include <DrawViewShell.hxx>
+#include <FormShellManager.hxx>
+#include <ToolBarManager.hxx>
+#include <Window.hxx>
+#include <framework/ConfigurationController.hxx>
+#include <DocumentRenderer.hxx>
+#include <optsitem.hxx>
+#include <sdmod.hxx>
+
+#include <com/sun/star/document/XViewDataSupplier.hpp>
+#include <com/sun/star/container/XIndexAccess.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/ResourceId.hpp>
+#include <framework/FrameworkHelper.hxx>
+
+#include <sal/log.hxx>
+#include <rtl/ref.hxx>
+#include <sfx2/msg.hxx>
+#include <sfx2/objface.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svl/whiter.hxx>
+#include <vcl/commandinfoprovider.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+
+#include <sfx2/notebookbar/SfxNotebookBar.hxx>
+
+#include <tools/diagnose_ex.h>
+#include <sfx2/lokhelper.hxx>
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+#include <editeng/editview.hxx>
+#include <tools/svborder.hxx>
+
+#include <fubullet.hxx>
+#include <drawview.hxx>
+
+using namespace sd;
+#define ShellClass_ViewShellBase
+#include <sdslots.hxx>
+
+using ::sd::framework::FrameworkHelper;
+
+using namespace com::sun::star;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::container;
+using namespace com::sun::star::drawing::framework;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::uno;
+
+namespace {
+
+class CurrentPageSetter
+{
+public:
+ explicit CurrentPageSetter (ViewShellBase& rBase);
+ void operator () (bool);
+private:
+ ViewShellBase& mrBase;
+};
+
+} // end of anonymous namespace
+
+namespace sd {
+
+class ViewShellBase::Implementation
+{
+public:
+ /** Main controller of the view shell. During the switching from one
+ stacked shell to another this pointer may be NULL.
+ */
+ ::rtl::Reference<DrawController> mpController;
+
+ /** The view tab bar is the control for switching between different
+ views in one pane.
+ */
+ ::rtl::Reference<ViewTabBar> mpViewTabBar;
+
+ // contains the complete area of the current view relative to the frame window
+ ::tools::Rectangle maClientArea;
+
+ // This is set to true when PrepareClose() is called.
+ bool mbIsClosing;
+
+ /** The view window is the parent of all UI elements that belong to the
+ view or ViewShell. This comprises the rulers, the scroll bars, and
+ the content window.
+ It does not include the ViewTabBar.
+ */
+ VclPtr<vcl::Window> mpViewWindow;
+ std::shared_ptr<ToolBarManager> mpToolBarManager;
+ std::shared_ptr<ViewShellManager> mpViewShellManager;
+ std::shared_ptr<tools::EventMultiplexer> mpEventMultiplexer;
+ std::shared_ptr<FormShellManager> mpFormShellManager;
+
+ explicit Implementation (ViewShellBase& rBase);
+ ~Implementation();
+
+ void LateInit();
+
+ /** Show or hide the ViewTabBar.
+ @param bShow
+ When <TRUE/> then the ViewTabBar is shown, otherwise it is hidden.
+ */
+ void ShowViewTabBar (bool bShow);
+
+ void SetUserWantsTabBar(bool inValue);
+ bool GetUserWantsTabBar() const { return mbUserWantsTabBar; }
+
+ /** Common code of ViewShellBase::OuterResizePixel() and
+ ViewShellBase::InnerResizePixel().
+ */
+ void ResizePixel (
+ const Point& rOrigin,
+ const Size& rSize,
+ bool bOuterResize);
+
+ /** Show or hide the specified pane. The visibility state is taken
+ from the given request.
+ @param rRequest
+ The request determines the new visibility state. The state can
+ either be toggled or be set to a given value.
+ @param rsPaneURL
+ This URL specifies the pane whose visibility state to set.
+ @param rsViewURL
+ When the pane becomes visible then this view URL specifies which
+ type of view to show in it.
+ */
+ void SetPaneVisibility (
+ const SfxRequest& rRequest,
+ const OUString& rsPaneURL,
+ const OUString& rsViewURL);
+
+ void GetSlotState (SfxItemSet& rSet);
+
+ void ProcessRestoreEditingViewSlot();
+
+private:
+ ViewShellBase& mrBase;
+ bool mbUserWantsTabBar;
+ bool mbTabBarShouldBeVisible;
+ /** Hold a reference to the page cache manager of the slide sorter in
+ order to ensure that it stays alive while the ViewShellBase is
+ alive.
+ */
+ std::shared_ptr<slidesorter::cache::PageCacheManager> mpPageCacheManager;
+};
+
+namespace {
+/** The only task of this window is to forward key presses to the content
+ window of the main view shell. With the key press it forwards the focus
+ so that it is not called very often.
+*/
+class FocusForwardingWindow : public vcl::Window
+{
+public:
+ FocusForwardingWindow (vcl::Window& rParentWindow, ViewShellBase& rBase);
+ virtual ~FocusForwardingWindow() override;
+ virtual void dispose() override;
+ virtual void KeyInput (const KeyEvent& rEvent) override;
+ virtual void Command (const CommandEvent& rEvent) override;
+
+private:
+ ViewShellBase& mrBase;
+};
+} // end of anonymous namespace
+
+//===== ViewShellBase =========================================================
+
+
+// We have to expand the SFX_IMPL_VIEWFACTORY macro to call LateInit() after a
+// new ViewShellBase object has been constructed.
+
+SFX_IMPL_SUPERCLASS_INTERFACE(ViewShellBase, SfxViewShell)
+
+void ViewShellBase::InitInterface_Impl()
+{
+}
+
+ViewShellBase::ViewShellBase (
+ SfxViewFrame* _pFrame,
+ SfxViewShell*)
+ : SfxViewShell (_pFrame, SfxViewShellFlags::HAS_PRINTOPTIONS),
+ mpDocShell (nullptr),
+ mpDocument (nullptr)
+{
+ mpImpl.reset(new Implementation(*this));
+ mpImpl->mpViewWindow = VclPtr<FocusForwardingWindow>::Create(_pFrame->GetWindow(),*this);
+ mpImpl->mpViewWindow->SetBackground(Wallpaper());
+
+ _pFrame->GetWindow().SetBackground(Application::GetSettings().GetStyleSettings().GetLightColor());
+
+ // Set up the members in the correct order.
+ if (auto pDrawDocShell = dynamic_cast< DrawDocShell *>( GetViewFrame()->GetObjectShell() ))
+ mpDocShell = pDrawDocShell;
+ if (mpDocShell != nullptr)
+ mpDocument = mpDocShell->GetDoc();
+ mpImpl->mpViewShellManager = std::make_shared<ViewShellManager>(*this);
+
+ SetWindow(mpImpl->mpViewWindow.get());
+
+ // Hide the window to avoid complaints from Sfx...SwitchViewShell...
+ _pFrame->GetWindow().Hide();
+}
+
+/** In this destructor the order in which some of the members are destroyed
+ (and/or being prepared to being destroyed) is important. Change it only
+ when you know what you are doing.
+*/
+ViewShellBase::~ViewShellBase()
+{
+ // Notify other LOK views that we are going away.
+ SfxLokHelper::notifyOtherViews(this, LOK_CALLBACK_VIEW_CURSOR_VISIBLE, "visible", "false");
+ SfxLokHelper::notifyOtherViews(this, LOK_CALLBACK_TEXT_VIEW_SELECTION, "selection", "");
+ SfxLokHelper::notifyOtherViews(this, LOK_CALLBACK_GRAPHIC_VIEW_SELECTION, "selection", "EMPTY");
+
+ sfx2::SfxNotebookBar::CloseMethod(GetFrame()->GetBindings());
+
+ rtl::Reference<SlideShow> xSlideShow(SlideShow::GetSlideShow(*this));
+ if (xSlideShow.is() && xSlideShow->dependsOn(this))
+ SlideShow::Stop(*this);
+ xSlideShow.clear();
+
+ // Tell the controller that the ViewShellBase is not available anymore.
+ if (mpImpl->mpController)
+ mpImpl->mpController->ReleaseViewShellBase();
+
+ // We have to hide the main window to prevent SFX complaining after a
+ // reload about it being already visible.
+ ViewShell* pShell = GetMainViewShell().get();
+ if (pShell!=nullptr
+ && pShell->GetActiveWindow()!=nullptr
+ && pShell->GetActiveWindow()->GetParent()!=nullptr)
+ {
+ pShell->GetActiveWindow()->GetParent()->Hide();
+ }
+
+ mpImpl->mpToolBarManager->Shutdown();
+ mpImpl->mpViewShellManager->Shutdown();
+
+ EndListening(*GetViewFrame());
+ EndListening(*GetDocShell());
+
+ SetWindow(nullptr);
+
+ mpImpl->mpFormShellManager.reset();
+}
+
+void ViewShellBase::LateInit (const OUString& rsDefaultView)
+{
+ StartListening(*GetViewFrame(), DuplicateHandling::Prevent);
+ StartListening(*GetDocShell(), DuplicateHandling::Prevent);
+ mpImpl->LateInit();
+ InitializeFramework();
+
+ mpImpl->mpEventMultiplexer = std::make_shared<tools::EventMultiplexer>(*this);
+
+ mpImpl->mpFormShellManager = std::make_shared<FormShellManager>(*this);
+
+ mpImpl->mpToolBarManager = ToolBarManager::Create(
+ *this,
+ mpImpl->mpEventMultiplexer,
+ mpImpl->mpViewShellManager);
+
+ try
+ {
+ Reference<XControllerManager> xControllerManager (GetDrawController(), UNO_QUERY_THROW);
+ Reference<XConfigurationController> xConfigurationController (
+ xControllerManager->getConfigurationController());
+ if (xConfigurationController.is())
+ {
+ OUString sView (rsDefaultView);
+ if (sView.isEmpty())
+ sView = GetInitialViewShellType();
+
+ FrameworkHelper::Instance(*this);
+
+ // Create the resource ids for the center pane and view.
+ const Reference<drawing::framework::XResourceId> xCenterPaneId (
+ FrameworkHelper::CreateResourceId(FrameworkHelper::msCenterPaneURL));
+ const Reference<drawing::framework::XResourceId> xCenterViewId (
+ FrameworkHelper::CreateResourceId(sView, xCenterPaneId));
+
+ // Request center pane and view.
+ xConfigurationController->requestResourceActivation(xCenterPaneId, ResourceActivationMode_ADD);
+ xConfigurationController->requestResourceActivation(xCenterViewId, ResourceActivationMode_REPLACE);
+
+ // Process configuration events synchronously until the center view
+ // has been created.
+ sd::framework::ConfigurationController* pConfigurationController
+ = dynamic_cast<sd::framework::ConfigurationController*>(xConfigurationController.get());
+ if (pConfigurationController != nullptr)
+ {
+ while (
+ ! pConfigurationController->getResource(xCenterViewId).is()
+ && pConfigurationController->hasPendingRequests())
+ {
+ pConfigurationController->ProcessEvent();
+ }
+ }
+ }
+ }
+ catch (const RuntimeException&)
+ {
+ }
+
+ // AutoLayouts have to be ready.
+ GetDocument()->StopWorkStartupDelay();
+
+ UpdateBorder();
+
+ // Remember the type of the current main view shell in the frame view.
+ ViewShell* pViewShell = GetMainViewShell().get();
+ if (pViewShell != nullptr)
+ {
+ FrameView* pFrameView = pViewShell->GetFrameView();
+ if (pFrameView != nullptr)
+ pFrameView->SetViewShellTypeOnLoad(pViewShell->GetShellType());
+ }
+ // Show/Hide the TabBar
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDocument()->GetDocumentType());
+ bool bIsTabBarVisible = pOptions->IsTabBarVisible();
+ mpImpl->SetUserWantsTabBar( bIsTabBarVisible );
+}
+
+std::shared_ptr<ViewShellManager> const & ViewShellBase::GetViewShellManager() const
+{
+ return mpImpl->mpViewShellManager;
+}
+
+std::shared_ptr<ViewShell> ViewShellBase::GetMainViewShell() const
+{
+ std::shared_ptr<ViewShell> pMainViewShell (
+ framework::FrameworkHelper::Instance(*const_cast<ViewShellBase*>(this))
+ ->GetViewShell(framework::FrameworkHelper::msCenterPaneURL));
+ if (pMainViewShell == nullptr)
+ pMainViewShell = framework::FrameworkHelper::Instance(*const_cast<ViewShellBase*>(this))
+ ->GetViewShell(framework::FrameworkHelper::msFullScreenPaneURL);
+ return pMainViewShell;
+}
+
+ViewShellBase* ViewShellBase::GetViewShellBase (SfxViewFrame const * pViewFrame)
+{
+ ViewShellBase* pBase = nullptr;
+
+ if (pViewFrame != nullptr)
+ {
+ // Get the view shell for the frame and cast it to
+ // sd::ViewShellBase.
+ SfxViewShell* pSfxViewShell = pViewFrame->GetViewShell();
+ pBase = dynamic_cast< ::sd::ViewShellBase *>( pSfxViewShell );
+ }
+
+ return pBase;
+}
+
+void ViewShellBase::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
+{
+ SfxViewShell::Notify(rBC, rHint);
+
+ const SfxEventHint* pEventHint = dynamic_cast<const SfxEventHint*>(&rHint);
+ if (pEventHint)
+ {
+ switch (pEventHint->GetEventId())
+ {
+ case SfxEventHintId::OpenDoc:
+ if( GetDocument() && GetDocument()->IsStartWithPresentation() )
+ {
+ if( GetViewFrame() )
+ {
+ GetViewFrame()->GetDispatcher()->Execute(
+ SID_PRESENTATION, SfxCallMode::ASYNCHRON );
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ else
+ {
+ const SfxHintId nSlot = rHint.GetId();
+ switch ( nSlot )
+ {
+ case SfxHintId::LanguageChanged:
+ {
+ GetViewFrame()->GetBindings().Invalidate(SID_LANGUAGE_STATUS);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void ViewShellBase::InitializeFramework()
+{
+}
+
+OUString ViewShellBase::GetSelectionText(bool bCompleteWords, bool /*bOnlyASample*/)
+{
+ std::shared_ptr<ViewShell> const pMainShell(GetMainViewShell());
+ DrawViewShell *const pDrawViewShell(
+ dynamic_cast<DrawViewShell*>(pMainShell.get()));
+ return pDrawViewShell
+ ? pDrawViewShell->GetSelectionText(bCompleteWords)
+ : SfxViewShell::GetSelectionText(bCompleteWords);
+}
+
+bool ViewShellBase::HasSelection(bool bText) const
+{
+ std::shared_ptr<ViewShell> const pMainShell(GetMainViewShell());
+ DrawViewShell *const pDrawViewShell(
+ dynamic_cast<DrawViewShell*>(pMainShell.get()));
+ return pDrawViewShell
+ ? pDrawViewShell->HasSelection(bText)
+ : SfxViewShell::HasSelection(bText);
+}
+
+void ViewShellBase::InnerResizePixel (const Point& rOrigin, const Size &rSize, bool)
+{
+ Size aObjSize = GetObjectShell()->GetVisArea().GetSize();
+ if ( !aObjSize.IsEmpty() )
+ {
+ SvBorder aBorder( GetBorderPixel() );
+ Size aSize( rSize );
+ aSize.AdjustWidth( -(aBorder.Left() + aBorder.Right()) );
+ aSize.AdjustHeight( -(aBorder.Top() + aBorder.Bottom()) );
+ Size aObjSizePixel = mpImpl->mpViewWindow->LogicToPixel(aObjSize, MapMode(MapUnit::Map100thMM));
+ SfxViewShell::SetZoomFactor(
+ Fraction( aSize.Width(), std::max( aObjSizePixel.Width(), static_cast<::tools::Long>(1) ) ),
+ Fraction( aSize.Height(), std::max( aObjSizePixel.Height(), static_cast<::tools::Long>(1)) ) );
+ }
+
+ mpImpl->ResizePixel(rOrigin, rSize, false);
+}
+
+void ViewShellBase::OuterResizePixel (const Point& rOrigin, const Size &rSize)
+{
+ mpImpl->ResizePixel (rOrigin, rSize, true);
+}
+
+void ViewShellBase::Rearrange()
+{
+ OSL_ASSERT(GetViewFrame()!=nullptr);
+
+ // There is a bug in the communication between embedded objects and the
+ // framework::LayoutManager that leads to missing resize updates. The
+ // following workaround enforces such an update by cycling the border to
+ // zero and back to the current value.
+ if (GetWindow() != nullptr)
+ {
+ SetBorderPixel(SvBorder());
+ UpdateBorder(true);
+ }
+ else
+ {
+ SAL_WARN("sd.view", "Rearrange: window missing");
+ }
+
+ GetViewFrame()->Resize(true);
+}
+
+ErrCode ViewShellBase::DoVerb(sal_Int32 nVerb)
+{
+ ErrCode aResult = ERRCODE_NONE;
+
+ ::sd::ViewShell* pShell = GetMainViewShell().get();
+ if (pShell != nullptr)
+ aResult = pShell->DoVerb(nVerb);
+
+ return aResult;
+}
+
+Reference<view::XRenderable> ViewShellBase::GetRenderable()
+{
+ // Create a new DocumentRenderer on every call. It observes the life
+ // time of this ViewShellBase object.
+ return Reference<view::XRenderable>(new DocumentRenderer(*this));
+}
+
+SfxPrinter* ViewShellBase::GetPrinter (bool bCreate)
+{
+ OSL_ASSERT(mpImpl != nullptr);
+
+ return GetDocShell()->GetPrinter (bCreate);
+}
+
+sal_uInt16 ViewShellBase::SetPrinter (
+ SfxPrinter* pNewPrinter,
+ SfxPrinterChangeFlags nDiffFlags)
+{
+ OSL_ASSERT(mpImpl != nullptr);
+
+ GetDocShell()->SetPrinter(pNewPrinter);
+
+ if ( (nDiffFlags & SfxPrinterChangeFlags::CHG_ORIENTATION ||
+ nDiffFlags & SfxPrinterChangeFlags::CHG_SIZE) && pNewPrinter )
+ {
+ MapMode aMap = pNewPrinter->GetMapMode();
+ aMap.SetMapUnit(MapUnit::Map100thMM);
+ MapMode aOldMap = pNewPrinter->GetMapMode();
+ pNewPrinter->SetMapMode(aMap);
+ Size aNewSize = pNewPrinter->GetOutputSize();
+
+ std::shared_ptr<DrawViewShell> pDrawViewShell (
+ std::dynamic_pointer_cast<DrawViewShell>(GetMainViewShell()));
+ if (pDrawViewShell)
+ {
+ SdPage* pPage = GetDocument()->GetSdPage(
+ 0, PageKind::Standard );
+ pDrawViewShell->SetPageSizeAndBorder (
+ pDrawViewShell->GetPageKind(),
+ aNewSize,
+ -1,-1,-1,-1,
+ false/*bScaleAll*/,
+ pNewPrinter->GetOrientation(),
+ pPage->GetPaperBin(),
+ pPage->IsBackgroundFullSize());
+ }
+
+ pNewPrinter->SetMapMode(aOldMap);
+ }
+
+ return 0;
+}
+
+void ViewShellBase::UIActivating( SfxInPlaceClient* pClient )
+{
+ mpImpl->ShowViewTabBar(false);
+
+ ViewShell* pViewShell = GetMainViewShell().get();
+ if ( pViewShell )
+ pViewShell->UIActivating( pClient );
+
+ SfxViewShell::UIActivating( pClient );
+}
+
+void ViewShellBase::UIDeactivated( SfxInPlaceClient* pClient )
+{
+ SfxViewShell::UIDeactivated( pClient );
+
+ mpImpl->ShowViewTabBar(true);
+
+ ViewShell* pViewShell = GetMainViewShell().get();
+ if ( pViewShell )
+ pViewShell->UIDeactivated( pClient );
+}
+
+SvBorder ViewShellBase::GetBorder (bool )
+{
+ int nTop = 0;
+ if (mpImpl->mpViewTabBar.is() && mpImpl->mpViewTabBar->GetTabControl()->IsVisible())
+ nTop = mpImpl->mpViewTabBar->GetHeight();
+ return SvBorder(0,nTop,0,0);
+}
+
+void ViewShellBase::Execute (SfxRequest& rRequest)
+{
+ sal_uInt16 nSlotId = rRequest.GetSlot();
+
+ switch (nSlotId)
+ {
+ case SID_SWITCH_SHELL:
+ {
+ Reference<XControllerManager> xControllerManager (GetController(), UNO_QUERY);
+ if (xControllerManager.is())
+ {
+ Reference<XConfigurationController> xConfigurationController (
+ xControllerManager->getConfigurationController());
+ if (xConfigurationController.is())
+ xConfigurationController->update();
+ }
+ }
+ break;
+
+ case SID_LEFT_PANE_DRAW:
+ mpImpl->SetPaneVisibility(
+ rRequest,
+ framework::FrameworkHelper::msLeftDrawPaneURL,
+ framework::FrameworkHelper::msSlideSorterURL);
+ break;
+
+ case SID_LEFT_PANE_IMPRESS:
+ mpImpl->SetPaneVisibility(
+ rRequest,
+ framework::FrameworkHelper::msLeftImpressPaneURL,
+ framework::FrameworkHelper::msSlideSorterURL);
+ break;
+
+ case SID_TOGGLE_TABBAR_VISIBILITY:
+ {
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDocument()->GetDocumentType());
+ bool bIsTabBarVisible = pOptions->IsTabBarVisible();
+ pOptions->SetTabBarVisible( !bIsTabBarVisible );
+ mpImpl->SetUserWantsTabBar( !bIsTabBarVisible );
+ rRequest.Done();
+ }
+ break;
+
+ // draw
+ case SID_DRAWINGMODE:
+ // impress normal
+ case SID_NORMAL_MULTI_PANE_GUI:
+ case SID_NOTES_MODE:
+ case SID_OUTLINE_MODE:
+ case SID_SLIDE_SORTER_MULTI_PANE_GUI:
+ case SID_SLIDE_SORTER_MODE:
+ // impress master
+ case SID_SLIDE_MASTER_MODE:
+ case SID_NOTES_MASTER_MODE:
+ case SID_HANDOUT_MASTER_MODE:
+ framework::FrameworkHelper::Instance(*this)->HandleModeChangeSlot(nSlotId, rRequest);
+ break;
+
+ case SID_WIN_FULLSCREEN:
+ // The full screen mode is not supported. Ignore the request.
+ break;
+
+ case SID_RESTORE_EDITING_VIEW:
+ mpImpl->ProcessRestoreEditingViewSlot();
+ break;
+
+ default:
+ // Ignore any other slot.
+ rRequest.Ignore ();
+ break;
+ }
+}
+
+void ViewShellBase::GetState (SfxItemSet& rSet)
+{
+ mpImpl->GetSlotState(rSet);
+
+ FuBullet::GetSlotState( rSet, nullptr, GetViewFrame() );
+}
+
+void ViewShellBase::WriteUserDataSequence (
+ css::uno::Sequence< css::beans::PropertyValue >& rSequence)
+{
+ // Forward call to main sub shell.
+ ViewShell* pShell = GetMainViewShell().get();
+ if (pShell != nullptr)
+ pShell->WriteUserDataSequence (rSequence);
+}
+
+void ViewShellBase::ReadUserDataSequence (
+ const css::uno::Sequence< css::beans::PropertyValue >& rSequence)
+{
+ // Forward call to main sub shell.
+ ViewShell* pShell = GetMainViewShell().get();
+ if (pShell == nullptr)
+ return;
+
+ pShell->ReadUserDataSequence (rSequence);
+
+ // For certain shell types ReadUserDataSequence may have changed the
+ // type to another one. Make sure that the center pane shows the
+ // right view shell.
+ switch (pShell->GetShellType())
+ {
+ case ViewShell::ST_IMPRESS:
+ case ViewShell::ST_NOTES:
+ case ViewShell::ST_HANDOUT:
+ {
+ OUString sViewURL;
+ switch (dynamic_cast<DrawViewShell&>(*pShell).GetPageKind())
+ {
+ default:
+ case PageKind::Standard:
+ sViewURL = framework::FrameworkHelper::msImpressViewURL;
+ break;
+ case PageKind::Notes:
+ sViewURL = framework::FrameworkHelper::msNotesViewURL;
+ break;
+ case PageKind::Handout:
+ sViewURL = framework::FrameworkHelper::msHandoutViewURL;
+ break;
+ }
+ if (!sViewURL.isEmpty())
+ framework::FrameworkHelper::Instance(*this)->RequestView(
+ sViewURL,
+ framework::FrameworkHelper::msCenterPaneURL);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void ViewShellBase::Activate (bool bIsMDIActivate)
+{
+ SfxViewShell::Activate(bIsMDIActivate);
+
+ Reference<XControllerManager> xControllerManager (GetController(), UNO_QUERY);
+ if (xControllerManager.is())
+ {
+ Reference<XConfigurationController> xConfigurationController (
+ xControllerManager->getConfigurationController());
+ if (xConfigurationController.is())
+ xConfigurationController->update();
+ }
+ GetToolBarManager()->RequestUpdate();
+}
+
+void ViewShellBase::SetZoomFactor (
+ const Fraction &rZoomX,
+ const Fraction &rZoomY)
+{
+ SfxViewShell::SetZoomFactor (rZoomX, rZoomY);
+ // Forward call to main sub shell.
+ ViewShell* pShell = GetMainViewShell().get();
+ if (pShell != nullptr)
+ pShell->SetZoomFactor (rZoomX, rZoomY);
+}
+
+bool ViewShellBase::PrepareClose (bool bUI)
+{
+ bool bResult = SfxViewShell::PrepareClose (bUI);
+
+ if (bResult)
+ {
+ mpImpl->mbIsClosing = true;
+
+ // Forward call to main sub shell.
+ ViewShell* pShell = GetMainViewShell().get();
+ if (pShell != nullptr)
+ bResult = pShell->PrepareClose (bUI);
+ }
+
+ return bResult;
+}
+
+void ViewShellBase::WriteUserData (OUString& rString, bool bBrowse)
+{
+ SfxViewShell::WriteUserData (rString, bBrowse);
+
+ // Forward call to main sub shell.
+ ViewShell* pShell = GetMainViewShell().get();
+ if (pShell != nullptr)
+ pShell->WriteUserData();
+}
+
+void ViewShellBase::ReadUserData (const OUString& rString, bool bBrowse)
+{
+ SfxViewShell::ReadUserData (rString, bBrowse);
+
+ // Forward call to main sub shell.
+ ViewShell* pShell = GetMainViewShell().get();
+ if (pShell != nullptr)
+ pShell->ReadUserData();
+}
+
+SdrView* ViewShellBase::GetDrawView() const
+{
+ // Forward call to main sub shell.
+ ViewShell* pShell = GetMainViewShell().get();
+ if (pShell != nullptr)
+ return pShell->GetDrawView ();
+ else
+ return SfxViewShell::GetDrawView();
+}
+
+void ViewShellBase::SetBusyState (bool bBusy)
+{
+ if (GetDocShell() != nullptr)
+ GetDocShell()->SetWaitCursor (bBusy);
+}
+
+void ViewShellBase::UpdateBorder ( bool bForce /* = false */ )
+{
+ // The following calls to SetBorderPixel() and InvalidateBorder() are
+ // made only for the main view shell. This not only avoids unnecessary
+ // calls for the views in side panes but prevents calling an already
+ // dying SfxViewShell base class.
+ // We have to check the existence of the window, too.
+ // The SfxViewFrame accesses the window without checking it.
+ ViewShell* pMainViewShell = GetMainViewShell().get();
+ if (pMainViewShell == nullptr || GetWindow()==nullptr)
+ return;
+
+ SvBorder aCurrentBorder (GetBorderPixel());
+ bool bOuterResize ( ! GetDocShell()->IsInPlaceActive());
+ SvBorder aBorder (GetBorder(bOuterResize));
+ aBorder += pMainViewShell->GetBorder();
+
+ if (bForce || (aBorder != aCurrentBorder))
+ {
+ SetBorderPixel (aBorder);
+ InvalidateBorder();
+ }
+}
+
+void ViewShellBase::ShowUIControls (bool bVisible)
+{
+ mpImpl->ShowViewTabBar(bVisible);
+
+ ViewShell* pMainViewShell = GetMainViewShell().get();
+ if (pMainViewShell != nullptr)
+ pMainViewShell->ShowUIControls (bVisible);
+
+ UpdateBorder();
+ if (bVisible)
+ Rearrange();
+}
+
+OUString ViewShellBase::GetInitialViewShellType() const
+{
+ OUString sRequestedView (FrameworkHelper::msImpressViewURL);
+
+ do
+ {
+ Reference<document::XViewDataSupplier> xViewDataSupplier (
+ GetDocShell()->GetModel(), UNO_QUERY);
+ if ( ! xViewDataSupplier.is())
+ break;
+
+ Reference<container::XIndexAccess> xViewData (xViewDataSupplier->getViewData());
+ if ( ! xViewData.is())
+ break;
+ if (xViewData->getCount() == 0)
+ break;
+
+ css::uno::Any aAny = xViewData->getByIndex(0);
+ Sequence<beans::PropertyValue> aProperties;
+ if ( ! (aAny >>= aProperties))
+ break;
+
+ // Search the properties for the one that tells us what page kind to
+ // use.
+ auto pProperty = std::find_if(std::cbegin(aProperties), std::cend(aProperties),
+ [](const beans::PropertyValue& rProperty) { return rProperty.Name == sUNO_View_PageKind; });
+ if (pProperty != std::cend(aProperties))
+ {
+ sal_Int16 nPageKind = 0;
+ pProperty->Value >>= nPageKind;
+ switch (static_cast<PageKind>(nPageKind))
+ {
+ case PageKind::Standard:
+ sRequestedView = FrameworkHelper::msImpressViewURL;
+ break;
+
+ case PageKind::Handout:
+ sRequestedView = FrameworkHelper::msHandoutViewURL;
+ break;
+
+ case PageKind::Notes:
+ sRequestedView = FrameworkHelper::msNotesViewURL;
+ break;
+
+ default:
+ // The page kind is invalid. This is probably an
+ // error by the caller. We use the standard type to
+ // keep things going.
+ SAL_WARN( "sd.view", "ViewShellBase::GetInitialViewShellType: invalid page kind");
+ sRequestedView = FrameworkHelper::msImpressViewURL;
+ break;
+ }
+ }
+ }
+ while (false);
+
+ return sRequestedView;
+}
+
+std::shared_ptr<tools::EventMultiplexer> const & ViewShellBase::GetEventMultiplexer() const
+{
+ OSL_ASSERT(mpImpl != nullptr);
+ OSL_ASSERT(mpImpl->mpEventMultiplexer != nullptr);
+
+ return mpImpl->mpEventMultiplexer;
+}
+
+const ::tools::Rectangle& ViewShellBase::getClientRectangle() const
+{
+ return mpImpl->maClientArea;
+}
+
+std::shared_ptr<ToolBarManager> const & ViewShellBase::GetToolBarManager() const
+{
+ OSL_ASSERT(mpImpl != nullptr);
+ OSL_ASSERT(mpImpl->mpToolBarManager != nullptr);
+
+ return mpImpl->mpToolBarManager;
+}
+
+std::shared_ptr<FormShellManager> const & ViewShellBase::GetFormShellManager() const
+{
+ OSL_ASSERT(mpImpl != nullptr);
+ OSL_ASSERT(mpImpl->mpFormShellManager != nullptr);
+
+ return mpImpl->mpFormShellManager;
+}
+
+DrawController& ViewShellBase::GetDrawController() const
+{
+ OSL_ASSERT(mpImpl != nullptr);
+
+ return *mpImpl->mpController;
+}
+
+void ViewShellBase::SetViewTabBar (const ::rtl::Reference<ViewTabBar>& rViewTabBar)
+{
+ OSL_ASSERT(mpImpl != nullptr);
+
+ mpImpl->mpViewTabBar = rViewTabBar;
+}
+
+vcl::Window* ViewShellBase::GetViewWindow()
+{
+ OSL_ASSERT(mpImpl != nullptr);
+
+ return mpImpl->mpViewWindow.get();
+}
+
+OUString ViewShellBase::RetrieveLabelFromCommand( const OUString& aCmdURL ) const
+{
+ OUString aModuleName(vcl::CommandInfoProvider::GetModuleIdentifier(GetMainViewShell()->GetViewFrame()->GetFrame().GetFrameInterface()));
+ auto aProperties = vcl::CommandInfoProvider::GetCommandProperties(aCmdURL, aModuleName);
+ return vcl::CommandInfoProvider::GetLabelForCommand(aProperties);
+}
+
+int ViewShellBase::getPart() const
+{
+ ViewShell* pViewShell = framework::FrameworkHelper::Instance(*const_cast<ViewShellBase*>(this))->GetViewShell(FrameworkHelper::msCenterPaneURL).get();
+
+ if (DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>(pViewShell))
+ {
+ return pDrawViewShell->GetCurPagePos();
+ }
+
+ return 0;
+}
+
+void ViewShellBase::NotifyCursor(SfxViewShell* pOtherShell) const
+{
+ ViewShell* pThisShell = framework::FrameworkHelper::Instance(*const_cast<ViewShellBase*>(this))->GetViewShell(FrameworkHelper::msCenterPaneURL).get();
+
+ DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>(pThisShell);
+ if (!pDrawViewShell)
+ return;
+
+ if (this == pOtherShell)
+ return;
+
+ DrawView* pDrawView = pDrawViewShell->GetDrawView();
+ if (!pDrawView)
+ return;
+
+ if (pDrawView->GetTextEditObject())
+ {
+ // Blinking cursor.
+ EditView& rEditView = pDrawView->GetTextEditOutlinerView()->GetEditView();
+ rEditView.RegisterOtherShell(pOtherShell);
+ rEditView.ShowCursor();
+ rEditView.RegisterOtherShell(nullptr);
+ // Text selection, if any.
+ rEditView.DrawSelectionXOR(pOtherShell);
+
+ // Shape text lock.
+ if (OutlinerView* pOutlinerView = pDrawView->GetTextEditOutlinerView())
+ {
+ ::tools::Rectangle aRectangle = pOutlinerView->GetOutputArea();
+ vcl::Window* pWin = pThisShell->GetActiveWindow();
+ if (pWin && pWin->GetMapMode().GetMapUnit() == MapUnit::Map100thMM)
+ aRectangle = o3tl::toTwips(aRectangle, o3tl::Length::mm100);
+ OString sRectangle = aRectangle.toString();
+ SfxLokHelper::notifyOtherView(&pDrawViewShell->GetViewShellBase(), pOtherShell, LOK_CALLBACK_VIEW_LOCK, "rectangle", sRectangle);
+ }
+ }
+ else
+ {
+ // Graphic selection.
+ pDrawView->AdjustMarkHdl(pOtherShell);
+ }
+}
+
+//===== ViewShellBase::Implementation =========================================
+
+ViewShellBase::Implementation::Implementation (ViewShellBase& rBase)
+ : mbIsClosing(false),
+ mrBase(rBase),
+ mbUserWantsTabBar(false),
+ mbTabBarShouldBeVisible(true),
+ mpPageCacheManager(slidesorter::cache::PageCacheManager::Instance())
+{
+}
+
+ViewShellBase::Implementation::~Implementation()
+{
+ mpController = nullptr;
+ mpViewTabBar = nullptr;
+ mpViewWindow.disposeAndClear();
+ mpToolBarManager.reset();
+}
+
+void ViewShellBase::Implementation::LateInit()
+{
+ mpController = new DrawController(mrBase);
+}
+
+void ViewShellBase::Implementation::ProcessRestoreEditingViewSlot()
+{
+ ViewShell* pViewShell = mrBase.GetMainViewShell().get();
+ if (pViewShell == nullptr)
+ return;
+
+ FrameView* pFrameView = pViewShell->GetFrameView();
+ if (pFrameView == nullptr)
+ return;
+
+ // Set view shell, edit mode, and page kind.
+ // pFrameView->SetViewShEditMode(
+ // pFrameView->GetViewShEditModeOnLoad(),
+ // pFrameView->GetPageKindOnLoad());
+ pFrameView->SetViewShEditMode(
+ pFrameView->GetViewShEditModeOnLoad() );
+ pFrameView->SetPageKind(
+ pFrameView->GetPageKindOnLoad());
+ std::shared_ptr<FrameworkHelper> pHelper (FrameworkHelper::Instance(mrBase));
+ pHelper->RequestView(
+ FrameworkHelper::GetViewURL(pFrameView->GetViewShellTypeOnLoad()),
+ FrameworkHelper::msCenterPaneURL);
+ pHelper->RunOnConfigurationEvent("ConfigurationUpdateEnd", CurrentPageSetter(mrBase));
+}
+
+void ViewShellBase::Implementation::SetUserWantsTabBar(bool inValue)
+{
+ mbUserWantsTabBar = inValue;
+ // Call ShowViewTabBar to refresh the TabBar visibility
+ ShowViewTabBar(mbTabBarShouldBeVisible);
+}
+
+void ViewShellBase::Implementation::ShowViewTabBar (bool bShow)
+{
+ mbTabBarShouldBeVisible = bShow;
+ bShow = bShow && mbUserWantsTabBar;
+
+ if (mpViewTabBar.is()
+ && mpViewTabBar->GetTabControl()->IsVisible() != bShow)
+ {
+ mpViewTabBar->GetTabControl()->Show(bShow);
+ mrBase.Rearrange();
+ }
+}
+
+void ViewShellBase::Implementation::ResizePixel (
+ const Point& rOrigin,
+ const Size &rSize,
+ bool bOuterResize)
+{
+ if (mbIsClosing)
+ return;
+
+ // Forward the call to both the base class and the main stacked sub
+ // shell only when main sub shell exists.
+ ViewShell* pMainViewShell = mrBase.GetMainViewShell().get();
+
+ // Set the ViewTabBar temporarily to full size so that, when asked
+ // later, it can return its true height.
+ mrBase.SetWindow (mpViewWindow.get());
+ if (mpViewTabBar.is() && mpViewTabBar->GetTabControl()->IsVisible())
+ mpViewTabBar->GetTabControl()->SetPosSizePixel (rOrigin, rSize);
+
+ // Calculate and set the border before the controls are placed.
+ SvBorder aBorder;
+ if (pMainViewShell != nullptr)
+ aBorder = pMainViewShell->GetBorder();
+ aBorder += mrBase.GetBorder(bOuterResize);
+ if (mrBase.GetBorderPixel() != aBorder)
+ mrBase.SetBorderPixel(aBorder);
+
+ // Place the ViewTabBar at the top. It is part of the border.
+ SvBorder aBaseBorder;
+ if (mpViewTabBar.is() && mpViewTabBar->GetTabControl()->IsVisible())
+ {
+ aBaseBorder.Top() = mpViewTabBar->GetHeight();
+ mpViewTabBar->GetTabControl()->SetPosSizePixel(
+ rOrigin, Size(rSize.Width(),aBaseBorder.Top()));
+ }
+
+ // The view window gets the remaining space.
+ Point aViewWindowPosition (
+ rOrigin.X()+aBaseBorder.Left(),
+ rOrigin.Y()+aBaseBorder.Top());
+
+ Size aViewWindowSize (
+ rSize.Width() - aBaseBorder.Left() - aBaseBorder.Right(),
+ rSize.Height() - aBaseBorder.Top() - aBaseBorder.Bottom());
+ mpViewWindow->SetPosSizePixel(aViewWindowPosition, aViewWindowSize);
+
+ maClientArea = ::tools::Rectangle(Point(0,0), aViewWindowSize);
+}
+
+void ViewShellBase::Implementation::SetPaneVisibility (
+ const SfxRequest& rRequest,
+ const OUString& rsPaneURL,
+ const OUString& rsViewURL)
+{
+ try
+ {
+ Reference<XControllerManager> xControllerManager (mrBase.GetController(), UNO_QUERY_THROW);
+
+ const Reference< XComponentContext > xContext(
+ ::comphelper::getProcessComponentContext() );
+ Reference<XResourceId> xPaneId (ResourceId::create(
+ xContext, rsPaneURL));
+ Reference<XResourceId> xViewId (ResourceId::createWithAnchorURL(
+ xContext, rsViewURL, rsPaneURL));
+
+ // Determine the new visibility state.
+ const SfxItemSet* pArguments = rRequest.GetArgs();
+ bool bShowChildWindow;
+ sal_uInt16 nSlotId = rRequest.GetSlot();
+ if (pArguments != nullptr)
+ bShowChildWindow = static_cast<const SfxBoolItem&>(
+ pArguments->Get(nSlotId)).GetValue();
+ else
+ {
+ Reference<XConfigurationController> xConfigurationController (
+ xControllerManager->getConfigurationController());
+ if ( ! xConfigurationController.is())
+ throw RuntimeException();
+ Reference<XConfiguration> xConfiguration (
+ xConfigurationController->getRequestedConfiguration());
+ if ( ! xConfiguration.is())
+ throw RuntimeException();
+
+ bShowChildWindow = ! xConfiguration->hasResource(xPaneId);
+ }
+
+ // Set the desired visibility state at the current configuration
+ // and update it accordingly.
+ Reference<XConfigurationController> xConfigurationController (
+ xControllerManager->getConfigurationController());
+ if ( ! xConfigurationController.is())
+ throw RuntimeException();
+ if (bShowChildWindow)
+ {
+ xConfigurationController->requestResourceActivation(
+ xPaneId,
+ ResourceActivationMode_ADD);
+ xConfigurationController->requestResourceActivation(
+ xViewId,
+ ResourceActivationMode_REPLACE);
+ }
+ else
+ xConfigurationController->requestResourceDeactivation(
+ xPaneId);
+ }
+ catch (const Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd.view");
+ }
+}
+
+void ViewShellBase::Implementation::GetSlotState (SfxItemSet& rSet)
+{
+ try
+ {
+ // Get some frequently used values.
+ Reference<XControllerManager> xControllerManager (mrBase.GetController(), UNO_QUERY_THROW);
+ Reference<XConfigurationController> xConfigurationController (
+ xControllerManager->getConfigurationController());
+ if ( ! xConfigurationController.is())
+ throw RuntimeException();
+ Reference<XConfiguration> xConfiguration (
+ xConfigurationController->getRequestedConfiguration());
+ if ( ! xConfiguration.is())
+ throw RuntimeException();
+
+ const Reference< XComponentContext > xContext(
+ ::comphelper::getProcessComponentContext() );
+ SfxWhichIter aSetIterator (rSet);
+ sal_uInt16 nItemId (aSetIterator.FirstWhich());
+
+ while (nItemId > 0)
+ {
+ bool bState (false);
+ Reference<XResourceId> xResourceId;
+ try
+ {
+ // Check if the right view is active
+ switch (nItemId)
+ {
+ case SID_LEFT_PANE_IMPRESS:
+ xResourceId = ResourceId::create(
+ xContext, FrameworkHelper::msLeftImpressPaneURL);
+ bState = xConfiguration->hasResource(xResourceId);
+ break;
+
+ case SID_LEFT_PANE_DRAW:
+ xResourceId = ResourceId::create(
+ xContext, FrameworkHelper::msLeftDrawPaneURL);
+ bState = xConfiguration->hasResource(xResourceId);
+ break;
+
+ case SID_DRAWINGMODE:
+ case SID_NORMAL_MULTI_PANE_GUI:
+ case SID_SLIDE_MASTER_MODE:
+ xResourceId = ResourceId::createWithAnchorURL(
+ xContext, FrameworkHelper::msImpressViewURL,
+ FrameworkHelper::msCenterPaneURL);
+ bState = xConfiguration->hasResource(xResourceId);
+ break;
+
+ case SID_SLIDE_SORTER_MULTI_PANE_GUI:
+ case SID_SLIDE_SORTER_MODE:
+ xResourceId = ResourceId::createWithAnchorURL(
+ xContext,
+ FrameworkHelper::msSlideSorterURL,
+ FrameworkHelper::msCenterPaneURL);
+ bState = xConfiguration->hasResource(xResourceId);
+ break;
+
+ case SID_OUTLINE_MODE:
+ xResourceId = ResourceId::createWithAnchorURL(
+ xContext,
+ FrameworkHelper::msOutlineViewURL,
+ FrameworkHelper::msCenterPaneURL);
+ bState = xConfiguration->hasResource(xResourceId);
+ break;
+
+ case SID_HANDOUT_MASTER_MODE:
+ xResourceId = ResourceId::createWithAnchorURL(
+ xContext, FrameworkHelper::msHandoutViewURL,
+ FrameworkHelper::msCenterPaneURL);
+ bState = xConfiguration->hasResource(xResourceId);
+ break;
+
+ case SID_NOTES_MODE:
+ case SID_NOTES_MASTER_MODE:
+ xResourceId = ResourceId::createWithAnchorURL(
+ xContext, FrameworkHelper::msNotesViewURL,
+ FrameworkHelper::msCenterPaneURL);
+ bState = xConfiguration->hasResource(xResourceId);
+ break;
+
+ case SID_TOGGLE_TABBAR_VISIBILITY:
+ bState = GetUserWantsTabBar();
+ break;
+
+ default:
+ // Ignore all other items. They are not meant to be
+ // handled by us.
+ break;
+ }
+ }
+ catch (const DeploymentException&)
+ {
+ }
+
+ // Check if edit mode fits too
+ if (bState)
+ {
+ ViewShell* const pCenterViewShell = FrameworkHelper::Instance(mrBase)->GetViewShell(
+ FrameworkHelper::msCenterPaneURL).get();
+ DrawViewShell* const pShell = dynamic_cast<DrawViewShell*>(pCenterViewShell);
+ if (pShell)
+ {
+ switch (nItemId)
+ {
+ case SID_DRAWINGMODE:
+ case SID_NORMAL_MULTI_PANE_GUI:
+ case SID_NOTES_MODE:
+ bState = pShell->GetEditMode() == EditMode::Page;
+ break;
+ case SID_SLIDE_MASTER_MODE:
+ case SID_NOTES_MASTER_MODE:
+ bState = pShell->GetEditMode() == EditMode::MasterPage;
+ break;
+ }
+ }
+ }
+
+ // And finally set the state.
+ rSet.Put(SfxBoolItem(nItemId, bState));
+
+ nItemId = aSetIterator.NextWhich();
+ }
+ }
+ catch (const RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd.view");
+ }
+
+}
+
+} // end of namespace sd
+
+//===== CurrentPageSetter ===========================================
+
+namespace {
+
+CurrentPageSetter::CurrentPageSetter (ViewShellBase& rBase)
+ : mrBase(rBase)
+{
+}
+
+void CurrentPageSetter::operator() (bool)
+{
+ FrameView* pFrameView = nullptr;
+
+ if (mrBase.GetMainViewShell() != nullptr)
+ {
+ pFrameView = mrBase.GetMainViewShell()->GetFrameView();
+ }
+
+ if (pFrameView==nullptr)
+ return;
+
+ try
+ {
+ // Get the current page either from the DrawPagesSupplier or the
+ // MasterPagesSupplier.
+ Any aPage;
+ if (pFrameView->GetViewShEditModeOnLoad() == EditMode::Page)
+ {
+ Reference<drawing::XDrawPagesSupplier> xPagesSupplier (
+ mrBase.GetController()->getModel(), UNO_QUERY_THROW);
+ Reference<container::XIndexAccess> xPages (
+ xPagesSupplier->getDrawPages(), UNO_QUERY_THROW);
+ aPage = xPages->getByIndex(pFrameView->GetSelectedPageOnLoad());
+ }
+ else
+ {
+ Reference<drawing::XMasterPagesSupplier> xPagesSupplier (
+ mrBase.GetController()->getModel(), UNO_QUERY_THROW);
+ Reference<container::XIndexAccess> xPages (
+ xPagesSupplier->getMasterPages(), UNO_QUERY_THROW);
+ aPage = xPages->getByIndex(pFrameView->GetSelectedPageOnLoad());
+ }
+ // Switch to the page last edited by setting the CurrentPage
+ // property.
+ Reference<beans::XPropertySet> xSet (mrBase.GetController(), UNO_QUERY_THROW);
+ xSet->setPropertyValue ("CurrentPage", aPage);
+ }
+ catch (const RuntimeException&)
+ {
+ // We have not been able to set the current page at the main view.
+ // This is sad but still leaves us in a valid state. Therefore,
+ // this exception is silently ignored.
+ }
+ catch (const beans::UnknownPropertyException&)
+ {
+ SAL_WARN("sd.view", "CurrentPage property unknown");
+ }
+}
+
+} // end of anonymous namespace
+
+//===== FocusForwardingWindow =================================================
+
+namespace sd {
+namespace {
+
+FocusForwardingWindow::FocusForwardingWindow (
+ vcl::Window& rParentWindow,
+ ViewShellBase& rBase)
+ : vcl::Window(&rParentWindow, WinBits(WB_CLIPCHILDREN | WB_DIALOGCONTROL)),
+ mrBase(rBase)
+{
+ SAL_INFO("sd.view", "created FocusForwardingWindow at " << this);
+}
+
+FocusForwardingWindow::~FocusForwardingWindow()
+{
+ disposeOnce();
+}
+
+void FocusForwardingWindow::dispose()
+{
+ SAL_INFO("sd.view", "destroyed FocusForwardingWindow at " << this);
+ vcl::Window::dispose();
+}
+
+void FocusForwardingWindow::KeyInput (const KeyEvent& rKEvt)
+{
+ std::shared_ptr<ViewShell> pViewShell = mrBase.GetMainViewShell();
+ if (pViewShell != nullptr)
+ {
+ vcl::Window* pWindow = pViewShell->GetActiveWindow();
+ if (pWindow != nullptr)
+ {
+ // Forward the focus so that the window is called directly the
+ // next time.
+ pWindow->GrabFocus();
+ // Forward the key press as well.
+ pWindow->KeyInput(rKEvt);
+ }
+ }
+}
+
+void FocusForwardingWindow::Command (const CommandEvent& rEvent)
+{
+ std::shared_ptr<ViewShell> pViewShell = mrBase.GetMainViewShell();
+ if (pViewShell != nullptr)
+ {
+ vcl::Window* pWindow = pViewShell->GetActiveWindow();
+ if (pWindow != nullptr)
+ {
+ pWindow->Command(rEvent);
+ }
+ }
+}
+
+} // end of anonymous namespace
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/ViewShellHint.cxx b/sd/source/ui/view/ViewShellHint.cxx
new file mode 100644
index 000000000..b86cbaa32
--- /dev/null
+++ b/sd/source/ui/view/ViewShellHint.cxx
@@ -0,0 +1,31 @@
+/* -*- 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 <ViewShellHint.hxx>
+
+namespace sd
+{
+ViewShellHint::ViewShellHint(HintId eHintId)
+ : meHintId(eHintId)
+{
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/ViewShellImplementation.cxx b/sd/source/ui/view/ViewShellImplementation.cxx
new file mode 100644
index 000000000..a0c025ce5
--- /dev/null
+++ b/sd/source/ui/view/ViewShellImplementation.cxx
@@ -0,0 +1,379 @@
+/* -*- 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 <config_features.h>
+
+#include <ViewShellImplementation.hxx>
+
+#include <sdpage.hxx>
+#include <drawdoc.hxx>
+#include <sdresid.hxx>
+#include <unokywds.hxx>
+#include <strings.hrc>
+#include <app.hrc>
+#include <unmodpg.hxx>
+#include <DrawDocShell.hxx>
+#include <FactoryIds.hxx>
+#include <ViewShellBase.hxx>
+
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/sidebar/Sidebar.hxx>
+#include <svl/intitem.hxx>
+#include <svl/stritem.hxx>
+#include <svx/imapdlg.hxx>
+#include <basic/sbstar.hxx>
+#include <basic/sberrors.hxx>
+#include <xmloff/autolayout.hxx>
+#include <vcl/svapp.hxx>
+
+#include <undo/undoobjects.hxx>
+
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sd {
+
+ViewShell::Implementation::Implementation (ViewShell& rViewShell)
+ : mbIsMainViewShell(false),
+ mbIsInitialized(false),
+ mbArrangeActive(false),
+ mrViewShell(rViewShell)
+{
+}
+
+ViewShell::Implementation::~Implementation() COVERITY_NOEXCEPT_FALSE
+{
+ if ( ! mpUpdateLockForMouse.expired())
+ {
+ std::shared_ptr<ToolBarManagerLock> pLock(mpUpdateLockForMouse);
+ if (pLock != nullptr)
+ {
+ // Force the ToolBarManagerLock to be released even when the
+ // IsUICaptured() returns <TRUE/>.
+ pLock->Release(true);
+ }
+ }
+}
+
+void ViewShell::Implementation::ProcessModifyPageSlot (
+ SfxRequest& rRequest,
+ SdPage* pCurrentPage,
+ PageKind ePageKind)
+{
+ SdDrawDocument* pDocument = mrViewShell.GetDoc();
+ SdrLayerAdmin& rLayerAdmin = pDocument->GetLayerAdmin();
+ SdrLayerIDSet aVisibleLayers;
+ bool bHandoutMode = false;
+ SdPage* pHandoutMPage = nullptr;
+ OUString aNewName;
+
+ AutoLayout aNewAutoLayout;
+
+ bool bBVisible;
+ bool bBObjsVisible;
+ const SfxItemSet* pArgs = rRequest.GetArgs();
+
+ if (pCurrentPage != nullptr && pCurrentPage->TRG_HasMasterPage())
+ aVisibleLayers = pCurrentPage->TRG_GetMasterPageVisibleLayers();
+ else
+ aVisibleLayers.SetAll();
+
+ do
+ {
+ if (pCurrentPage == nullptr)
+ break;
+
+ if (!pArgs || pArgs->Count() == 1 || pArgs->Count() == 2 )
+ {
+ // First make sure that the sidebar is visible
+ mrViewShell.GetDrawView()->SdrEndTextEdit();
+ mrViewShell.GetDrawView()->UnmarkAll();
+ mrViewShell.GetViewFrame()->ShowChildWindow(SID_SIDEBAR);
+ sfx2::sidebar::Sidebar::TogglePanel(
+ u"SdLayoutsPanel",
+ mrViewShell.GetViewFrame()->GetFrame().GetFrameInterface());
+ break;
+ }
+ else if (pArgs->Count() == 4)
+ {
+ const SfxStringItem* pNewName = rRequest.GetArg<SfxStringItem>(ID_VAL_PAGENAME);
+ const SfxUInt32Item* pNewAutoLayout = rRequest.GetArg<SfxUInt32Item>(ID_VAL_WHATLAYOUT);
+ const SfxBoolItem* pBVisible = rRequest.GetArg<SfxBoolItem>(ID_VAL_ISPAGEBACK);
+ const SfxBoolItem* pBObjsVisible = rRequest.GetArg<SfxBoolItem>(ID_VAL_ISPAGEOBJ);
+ AutoLayout aLayout (static_cast<AutoLayout>(pNewAutoLayout->GetValue ()));
+ if (aLayout >= AUTOLAYOUT_START
+ && aLayout < AUTOLAYOUT_END)
+ {
+ aNewName = pNewName->GetValue ();
+ aNewAutoLayout = static_cast<AutoLayout>(pNewAutoLayout->GetValue ());
+ bBVisible = pBVisible->GetValue ();
+ bBObjsVisible = pBObjsVisible->GetValue ();
+ }
+ else
+ {
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE);
+#endif
+ rRequest.Ignore ();
+ break;
+ }
+ if (ePageKind == PageKind::Handout)
+ {
+ bHandoutMode = true;
+ pHandoutMPage = pDocument->GetMasterSdPage(0, PageKind::Handout);
+ }
+ }
+ else
+ {
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ rRequest.Ignore ();
+ break;
+ }
+
+ SdPage* pUndoPage =
+ bHandoutMode ? pHandoutMPage : pCurrentPage;
+
+ SfxUndoManager* pUndoManager = mrViewShell.GetDocSh()->GetUndoManager();
+ DBG_ASSERT(pUndoManager, "No UNDO MANAGER ?!?");
+
+ if( pUndoManager )
+ {
+ OUString aComment( SdResId(STR_UNDO_MODIFY_PAGE) );
+ pUndoManager->EnterListAction(aComment, aComment, 0, mrViewShell.GetViewShellBase().GetViewShellId());
+ pUndoManager->AddUndoAction(
+ std::make_unique<ModifyPageUndoAction>(
+ pDocument, pUndoPage, aNewName, aNewAutoLayout, bBVisible, bBObjsVisible));
+
+ // Clear the selection because the selected object may be removed as
+ // a result of the assignment of the layout.
+ mrViewShell.GetDrawView()->UnmarkAll();
+
+ if (!bHandoutMode)
+ {
+ if (pCurrentPage->GetName() != aNewName)
+ {
+ pCurrentPage->SetName(aNewName);
+
+ if (ePageKind == PageKind::Standard)
+ {
+ sal_uInt16 nPage = (pCurrentPage->GetPageNum()-1) / 2;
+ SdPage* pNotesPage = pDocument->GetSdPage(nPage, PageKind::Notes);
+ if (pNotesPage != nullptr)
+ pNotesPage->SetName(aNewName);
+ }
+ }
+
+ pCurrentPage->SetAutoLayout(aNewAutoLayout, true);
+
+ SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background);
+ SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects);
+ aVisibleLayers.Set(aBckgrnd, bBVisible);
+ aVisibleLayers.Set(aBckgrndObj, bBObjsVisible);
+ pCurrentPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+ }
+ else
+ {
+ pHandoutMPage->SetAutoLayout(aNewAutoLayout, true);
+ }
+
+ mrViewShell.GetViewFrame()->GetDispatcher()->Execute(SID_SWITCHPAGE,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+
+ bool bSetModified = true;
+
+ if (pArgs->Count() == 1)
+ {
+ bSetModified = static_cast<const SfxBoolItem&>(pArgs->Get(SID_MODIFYPAGE)).GetValue();
+ }
+
+ pUndoManager->AddUndoAction( std::make_unique<UndoAutoLayoutPosAndSize>( *pUndoPage ) );
+ pUndoManager->LeaveListAction();
+
+ pDocument->SetChanged(bSetModified);
+ }
+ }
+ while (false);
+
+ mrViewShell.Cancel();
+ rRequest.Done ();
+}
+
+void ViewShell::Implementation::AssignLayout ( SfxRequest const & rRequest, PageKind ePageKind )
+{
+ const SfxUInt32Item* pWhatPage = rRequest.GetArg<SfxUInt32Item>(ID_VAL_WHATPAGE);
+ const SfxUInt32Item* pWhatLayout = rRequest.GetArg<SfxUInt32Item>(ID_VAL_WHATLAYOUT);
+
+ SdDrawDocument* pDocument = mrViewShell.GetDoc();
+ if( !pDocument )
+ return;
+
+ SdPage* pPage = nullptr;
+ if( pWhatPage )
+ {
+ pPage = pDocument->GetSdPage(static_cast<sal_uInt16>(pWhatPage->GetValue()), ePageKind);
+ }
+
+ if( pPage == nullptr )
+ pPage = mrViewShell.getCurrentPage();
+
+ if( !pPage )
+ return;
+
+ AutoLayout eLayout = pPage->GetAutoLayout();
+
+ if( pWhatLayout )
+ eLayout = static_cast< AutoLayout >( pWhatLayout->GetValue() );
+
+ // Transform the given request into the four argument form that is
+ // understood by ProcessModifyPageSlot().
+ SdrLayerAdmin& rLayerAdmin (mrViewShell.GetViewShellBase().GetDocument()->GetLayerAdmin());
+ SdrLayerID aBackground (rLayerAdmin.GetLayerID(sUNO_LayerName_background));
+ SdrLayerID aBackgroundObject (rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects));
+
+ SdrLayerIDSet aVisibleLayers;
+
+ if( pPage->GetPageKind() == PageKind::Handout )
+ aVisibleLayers.SetAll();
+ else
+ aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
+
+ SfxRequest aRequest (mrViewShell.GetViewShellBase().GetViewFrame(), SID_MODIFYPAGE);
+ aRequest.AppendItem(SfxStringItem (ID_VAL_PAGENAME, pPage->GetName()));
+ aRequest.AppendItem(SfxUInt32Item (ID_VAL_WHATLAYOUT, eLayout));
+ aRequest.AppendItem(SfxBoolItem(ID_VAL_ISPAGEBACK, aVisibleLayers.IsSet(aBackground)));
+ aRequest.AppendItem(SfxBoolItem(ID_VAL_ISPAGEOBJ, aVisibleLayers.IsSet(aBackgroundObject)));
+
+ // Forward the call with the new arguments.
+ ProcessModifyPageSlot( aRequest, pPage, pPage->GetPageKind());
+}
+
+SfxInterfaceId ViewShell::Implementation::GetViewId() const
+{
+ switch (mrViewShell.GetShellType())
+ {
+ case ViewShell::ST_IMPRESS:
+ case ViewShell::ST_NOTES:
+ case ViewShell::ST_HANDOUT:
+ return IMPRESS_FACTORY_ID;
+
+ case ViewShell::ST_DRAW:
+ return DRAW_FACTORY_ID;
+
+ case ViewShell::ST_OUTLINE:
+ return OUTLINE_FACTORY_ID;
+
+ case ViewShell::ST_SLIDE_SORTER:
+ return SLIDE_SORTER_FACTORY_ID;
+
+ case ViewShell::ST_PRESENTATION:
+ return PRESENTATION_FACTORY_ID;
+
+ // Since we have to return a view id for every possible shell type
+ // and there is not (yet) a proper ViewShellBase sub class for the
+ // remaining types we chose the Impress factory as a fall back.
+ case ViewShell::ST_SIDEBAR:
+ case ViewShell::ST_NONE:
+ default:
+ return IMPRESS_FACTORY_ID;
+ }
+}
+
+SvxIMapDlg* ViewShell::Implementation::GetImageMapDialog()
+{
+ SfxViewFrame* pViewFrm = SfxViewFrame::Current();
+ if (!pViewFrm)
+ return nullptr;
+
+ SfxChildWindow* pChildWindow = pViewFrm->GetChildWindow(
+ SvxIMapDlgChildWindow::GetChildWindowId());
+ if (pChildWindow == nullptr)
+ return nullptr;
+
+ return dynamic_cast<SvxIMapDlg*>(pChildWindow->GetController().get());
+}
+
+//===== ToolBarManagerLock ====================================================
+
+class ViewShell::Implementation::ToolBarManagerLock::Deleter { public:
+ void operator() (ToolBarManagerLock* pObject) { delete pObject; }
+};
+
+std::shared_ptr<ViewShell::Implementation::ToolBarManagerLock>
+ ViewShell::Implementation::ToolBarManagerLock::Create (
+ const std::shared_ptr<ToolBarManager>& rpManager)
+{
+ std::shared_ptr<ToolBarManagerLock> pLock (
+ new ViewShell::Implementation::ToolBarManagerLock(rpManager),
+ ViewShell::Implementation::ToolBarManagerLock::Deleter());
+ pLock->mpSelf = pLock;
+ return pLock;
+}
+
+ViewShell::Implementation::ToolBarManagerLock::ToolBarManagerLock (
+ const std::shared_ptr<ToolBarManager>& rpManager)
+ : mpLock(new ToolBarManager::UpdateLock(rpManager)),
+ maTimer("sd ToolBarManagerLock maTimer")
+{
+ // Start a timer that will unlock the ToolBarManager update lock when
+ // that is not done explicitly by calling Release().
+ maTimer.SetInvokeHandler(LINK(this,ToolBarManagerLock,TimeoutCallback));
+ maTimer.SetTimeout(100);
+ maTimer.Start();
+}
+
+IMPL_LINK_NOARG(ViewShell::Implementation::ToolBarManagerLock, TimeoutCallback, Timer *, void)
+{
+ // If possible then release the lock now. Otherwise start the timer
+ // and try again later.
+ if (Application::IsUICaptured())
+ {
+ maTimer.Start();
+ }
+ else
+ {
+ mpSelf.reset();
+ }
+}
+
+void ViewShell::Implementation::ToolBarManagerLock::Release (bool bForce)
+{
+ // If possible then release the lock now. Otherwise try again when the
+ // timer expires.
+ if (bForce || ! Application::IsUICaptured())
+ {
+ mpSelf.reset();
+ }
+}
+
+ViewShell::Implementation::ToolBarManagerLock::~ToolBarManagerLock()
+{
+ mpLock.reset();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/ViewShellManager.cxx b/sd/source/ui/view/ViewShellManager.cxx
new file mode 100644
index 000000000..db2ee5f8f
--- /dev/null
+++ b/sd/source/ui/view/ViewShellManager.cxx
@@ -0,0 +1,1168 @@
+/* -*- 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 <ViewShellManager.hxx>
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+#include <Window.hxx>
+#include <DrawDocShell.hxx>
+
+#include <sal/log.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svx/svxids.hrc>
+#include <svx/fmshell.hxx>
+#include <vcl/vclevent.hxx>
+#include <osl/diagnose.h>
+
+#include <iterator>
+#include <list>
+#include <unordered_map>
+
+namespace sd {
+
+namespace {
+
+/** The ShellDescriptor class is used to shells together with their ids and
+ the factory that was used to create the shell.
+
+ The shell pointer may be NULL. In that case the shell is created on
+ demand by a factory.
+
+ The factory pointer may be NULL. In that case the shell pointer is
+ given to the ViewShellManager.
+
+ Shell pointer and factory pointer can but should not be NULL at the same
+ time.
+*/
+class ShellDescriptor {
+public:
+ SfxShell* mpShell;
+ ShellId mnId;
+ ViewShellManager::SharedShellFactory mpFactory;
+ bool mbIsListenerAddedToWindow;
+
+ ShellDescriptor ();
+ explicit ShellDescriptor (ShellId nId);
+ vcl::Window* GetWindow() const;
+};
+
+/** This functor can be used to search for a shell in an STL container when the
+ shell pointer is given.
+*/
+class IsShell
+{
+public:
+ explicit IsShell (const SfxShell* pShell) : mpShell(pShell) {}
+ bool operator() (const ShellDescriptor& rDescriptor)
+ { return rDescriptor.mpShell == mpShell; }
+private:
+ const SfxShell* mpShell;
+};
+
+/** This functor can be used to search for a shell in an STL container when the
+ id of the shell is given.
+*/
+class IsId
+{
+public:
+ explicit IsId (ShellId nId) : mnId(nId) {}
+ bool operator() (const ShellDescriptor& rDescriptor)
+ { return rDescriptor.mnId == mnId; }
+private:
+ ShellId mnId;
+};
+
+} // end of anonymous namespace
+
+class ViewShellManager::Implementation
+{
+public:
+ Implementation (
+ ViewShellBase& rBase);
+ ~Implementation() COVERITY_NOEXCEPT_FALSE;
+
+ void AddShellFactory (
+ const SfxShell* pViewShell,
+ const SharedShellFactory& rpFactory);
+ void RemoveShellFactory (
+ const SfxShell* pViewShell,
+ const SharedShellFactory& rpFactory);
+ void ActivateViewShell (
+ ViewShell* pViewShell);
+ void DeactivateViewShell (const ViewShell& rShell);
+ void ActivateShell (SfxShell& rShell);
+ void DeactivateShell (const SfxShell& rShell);
+ void ActivateShell (const ShellDescriptor& rDescriptor);
+ void SetFormShell (const ViewShell* pViewShell, FmFormShell* pFormShell, bool bAbove);
+ void ActivateSubShell (const SfxShell& rParentShell, ShellId nId);
+ void DeactivateSubShell (const SfxShell& rParentShell, ShellId nId);
+ void MoveToTop (const SfxShell& rParentShell);
+ SfxShell* GetShell (ShellId nId) const;
+ SfxShell* GetTopShell() const;
+ SfxShell* GetTopViewShell() const;
+ void Shutdown();
+ void InvalidateAllSubShells (const SfxShell* pParentShell);
+
+ /** Remove all shells from the SFX stack above and including the given
+ shell.
+ */
+ void TakeShellsFromStack (const SfxShell* pShell);
+
+ class UpdateLock
+ {
+ public:
+ explicit UpdateLock (Implementation& rImpl) : mrImpl(rImpl) {mrImpl.LockUpdate();}
+ ~UpdateLock() COVERITY_NOEXCEPT_FALSE {mrImpl.UnlockUpdate();}
+ private:
+ Implementation& mrImpl;
+ };
+
+ /** Prevent updates of the shell stack. While the sub shell manager is
+ locked it will update its internal data structures but not alter the
+ shell stack. Use this method when there are several modifications
+ to the shell stack to prevent multiple rebuilds of the shell stack
+ and resulting broadcasts.
+ */
+ void LockUpdate();
+
+ /** Allow updates of the shell stack. This method has to be called the
+ same number of times as LockUpdate() to really allow a rebuild of
+ the shell stack.
+ */
+ void UnlockUpdate();
+
+private:
+ ViewShellBase& mrBase;
+ mutable ::osl::Mutex maMutex;
+
+ class ShellHash { public: size_t operator()(const SfxShell* p) const { return reinterpret_cast<size_t>(p);} };
+ typedef std::unordered_multimap<const SfxShell*,SharedShellFactory,ShellHash>
+ FactoryList;
+ FactoryList maShellFactories;
+
+ /** List of the active view shells. In order to create gather all shells
+ to put on the shell stack each view shell in this list is asked for
+ its sub-shells (typically toolbars).
+ */
+ typedef std::list<ShellDescriptor> ActiveShellList;
+ ActiveShellList maActiveViewShells;
+
+ typedef std::list<ShellDescriptor> SubShellSubList;
+ typedef std::unordered_map<const SfxShell*,SubShellSubList,ShellHash> SubShellList;
+ SubShellList maActiveSubShells;
+
+ /** In this member we remember what shells we have pushed on the shell
+ stack.
+ */
+ typedef ::std::vector<SfxShell*> ShellStack;
+
+ int mnUpdateLockCount;
+
+ /** The UpdateShellStack() method can be called recursively. This flag
+ is used to communicate between different levels of invocation: if
+ the stack has been updated in an inner call the outer call can (has
+ to) stop and return immediately.
+ */
+ bool mbShellStackIsUpToDate;
+
+ SfxShell* mpFormShell;
+ const ViewShell* mpFormShellParent;
+ bool mbFormShellAboveParent;
+
+ SfxShell* mpTopShell;
+ SfxShell* mpTopViewShell;
+
+
+ void UpdateShellStack();
+
+ void CreateShells();
+
+ /** This method rebuilds the stack of shells that are stacked upon the
+ view shell base.
+ */
+ void CreateTargetStack (ShellStack& rStack) const;
+
+ DECL_LINK(WindowEventHandler, VclWindowEvent&, void);
+
+#if OSL_DEBUG_LEVEL >= 2
+ void DumpShellStack (const ShellStack& rStack);
+ void DumpSfxShellStack();
+#endif
+
+ /** To be called before a shell is taken from the SFX shell stack. This
+ method deactivates an active text editing to avoid problems with
+ undo managers.
+ Afterwards the Deactivate() of the shell is called.
+ */
+ static void Deactivate (SfxShell* pShell);
+
+ ShellDescriptor CreateSubShell (
+ SfxShell const * pShell,
+ ShellId nShellId);
+ void DestroyViewShell (ShellDescriptor& rDescriptor);
+ static void DestroySubShell (const ShellDescriptor& rDescriptor);
+};
+
+//===== ViewShellManager ======================================================
+
+ViewShellManager::ViewShellManager (ViewShellBase& rBase)
+ : mpImpl(new Implementation(rBase)),
+ mbValid(true)
+{
+}
+
+ViewShellManager::~ViewShellManager()
+{
+}
+
+void ViewShellManager::AddSubShellFactory (
+ ViewShell const * pViewShell,
+ const SharedShellFactory& rpFactory)
+{
+ if (mbValid)
+ mpImpl->AddShellFactory(pViewShell, rpFactory);
+}
+
+void ViewShellManager::RemoveSubShellFactory (
+ ViewShell const * pViewShell,
+ const SharedShellFactory& rpFactory)
+{
+ if (mbValid)
+ mpImpl->RemoveShellFactory(pViewShell, rpFactory);
+}
+
+void ViewShellManager::ActivateViewShell (ViewShell* pViewShell)
+{
+ if (mbValid)
+ return mpImpl->ActivateViewShell(pViewShell);
+}
+
+void ViewShellManager::DeactivateViewShell (const ViewShell* pShell)
+{
+ if (mbValid && pShell!=nullptr)
+ mpImpl->DeactivateViewShell(*pShell);
+}
+
+void ViewShellManager::SetFormShell (
+ const ViewShell* pParentShell,
+ FmFormShell* pFormShell,
+ bool bAbove)
+{
+ if (mbValid)
+ mpImpl->SetFormShell(pParentShell,pFormShell,bAbove);
+}
+
+void ViewShellManager::ActivateSubShell (const ViewShell& rViewShell, ShellId nId)
+{
+ if (mbValid)
+ mpImpl->ActivateSubShell(rViewShell,nId);
+}
+
+void ViewShellManager::DeactivateSubShell (const ViewShell& rViewShell, ShellId nId)
+{
+ if (mbValid)
+ mpImpl->DeactivateSubShell(rViewShell,nId);
+}
+
+void ViewShellManager::InvalidateAllSubShells (ViewShell const * pViewShell)
+{
+ if (mbValid)
+ mpImpl->InvalidateAllSubShells(pViewShell);
+}
+
+void ViewShellManager::ActivateShell (SfxShell* pShell)
+{
+ if (mbValid && pShell!=nullptr)
+ mpImpl->ActivateShell(*pShell);
+}
+
+void ViewShellManager::DeactivateShell (const SfxShell* pShell)
+{
+ if (mbValid && pShell!=nullptr)
+ mpImpl->DeactivateShell(*pShell);
+}
+
+void ViewShellManager::MoveToTop (const ViewShell& rParentShell)
+{
+ if (mbValid)
+ mpImpl->MoveToTop(rParentShell);
+}
+
+SfxShell* ViewShellManager::GetShell (ShellId nId) const
+{
+ if (mbValid)
+ return mpImpl->GetShell(nId);
+ else
+ return nullptr;
+}
+
+SfxShell* ViewShellManager::GetTopShell() const
+{
+ if (mbValid)
+ return mpImpl->GetTopShell();
+ else
+ return nullptr;
+}
+
+SfxShell* ViewShellManager::GetTopViewShell() const
+{
+ if (mbValid)
+ return mpImpl->GetTopViewShell();
+ else
+ return nullptr;
+}
+
+void ViewShellManager::Shutdown()
+{
+ if (mbValid)
+ {
+ mpImpl->Shutdown();
+ mbValid = false;
+ }
+}
+
+void ViewShellManager::LockUpdate()
+{
+ mpImpl->LockUpdate();
+}
+
+void ViewShellManager::UnlockUpdate()
+{
+ mpImpl->UnlockUpdate();
+}
+
+//===== ViewShellManager::Implementation ======================================
+
+ViewShellManager::Implementation::Implementation (
+ ViewShellBase& rBase)
+ : mrBase(rBase),
+ mnUpdateLockCount(0),
+ mbShellStackIsUpToDate(true),
+ mpFormShell(nullptr),
+ mpFormShellParent(nullptr),
+ mbFormShellAboveParent(true),
+ mpTopShell(nullptr),
+ mpTopViewShell(nullptr)
+{}
+
+ViewShellManager::Implementation::~Implementation() COVERITY_NOEXCEPT_FALSE
+{
+ Shutdown();
+}
+
+void ViewShellManager::Implementation::AddShellFactory (
+ const SfxShell* pViewShell,
+ const SharedShellFactory& rpFactory)
+{
+ bool bAlreadyAdded (false);
+
+ // Check that the given factory has not already been added.
+ ::std::pair<FactoryList::iterator,FactoryList::iterator> aRange(
+ maShellFactories.equal_range(pViewShell));
+ for (FactoryList::const_iterator iFactory=aRange.first; iFactory!=aRange.second; ++iFactory)
+ if (iFactory->second == rpFactory)
+ {
+ bAlreadyAdded = true;
+ break;
+ }
+
+ // Add the factory if it is not already present.
+ if ( ! bAlreadyAdded)
+ maShellFactories.emplace(pViewShell, rpFactory);
+}
+
+void ViewShellManager::Implementation::RemoveShellFactory (
+ const SfxShell* pViewShell,
+ const SharedShellFactory& rpFactory)
+{
+ ::std::pair<FactoryList::iterator,FactoryList::iterator> aRange(
+ maShellFactories.equal_range(pViewShell));
+ for (FactoryList::iterator iFactory=aRange.first; iFactory!=aRange.second; ++iFactory)
+ if (iFactory->second == rpFactory)
+ {
+ maShellFactories.erase(iFactory);
+ break;
+ }
+}
+
+void ViewShellManager::Implementation::ActivateViewShell (ViewShell* pViewShell)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ ShellDescriptor aResult;
+ aResult.mpShell = pViewShell;
+
+ // Register as window listener so that the shells of the current
+ // window can be moved to the top of the shell stack.
+ if (aResult.mpShell != nullptr)
+ {
+ vcl::Window* pWindow = aResult.GetWindow();
+ if (pWindow != nullptr)
+ {
+ pWindow->AddEventListener(
+ LINK(this, ViewShellManager::Implementation, WindowEventHandler));
+ aResult.mbIsListenerAddedToWindow = true;
+ }
+ else
+ {
+ SAL_WARN("sd.view",
+ "ViewShellManager::ActivateViewShell: "
+ "new view shell has no active window");
+ }
+ }
+
+ ActivateShell(aResult);
+}
+
+void ViewShellManager::Implementation::DeactivateViewShell (const ViewShell& rShell)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ ActiveShellList::iterator iShell (::std::find_if (
+ maActiveViewShells.begin(),
+ maActiveViewShells.end(),
+ IsShell(&rShell)));
+ if (iShell == maActiveViewShells.end())
+ return;
+
+ UpdateLock aLocker (*this);
+
+ ShellDescriptor aDescriptor(*iShell);
+ mrBase.GetDocShell()->Disconnect(dynamic_cast<ViewShell*>(aDescriptor.mpShell));
+ maActiveViewShells.erase(iShell);
+ TakeShellsFromStack(aDescriptor.mpShell);
+
+ // Deactivate sub shells.
+ SubShellList::iterator iList (maActiveSubShells.find(&rShell));
+ if (iList != maActiveSubShells.end())
+ {
+ SubShellSubList& rList (iList->second);
+ while ( ! rList.empty())
+ DeactivateSubShell(rShell, rList.front().mnId);
+ }
+
+ DestroyViewShell(aDescriptor);
+}
+
+void ViewShellManager::Implementation::ActivateShell (SfxShell& rShell)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ // Create a new shell or recycle on in the cache.
+ ShellDescriptor aDescriptor;
+ aDescriptor.mpShell = &rShell;
+
+ ActivateShell(aDescriptor);
+}
+
+void ViewShellManager::Implementation::ActivateShell (const ShellDescriptor& rDescriptor)
+{
+ // Put shell on top of the active view shells.
+ if (rDescriptor.mpShell != nullptr)
+ {
+ maActiveViewShells.insert( maActiveViewShells.begin(), rDescriptor);
+ }
+}
+
+void ViewShellManager::Implementation::DeactivateShell (const SfxShell& rShell)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ ActiveShellList::iterator iShell (::std::find_if (
+ maActiveViewShells.begin(),
+ maActiveViewShells.end(),
+ IsShell(&rShell)));
+ if (iShell == maActiveViewShells.end())
+ return;
+
+ UpdateLock aLocker (*this);
+
+ ShellDescriptor aDescriptor(*iShell);
+ mrBase.GetDocShell()->Disconnect(dynamic_cast<ViewShell*>(aDescriptor.mpShell));
+ maActiveViewShells.erase(iShell);
+ TakeShellsFromStack(aDescriptor.mpShell);
+
+ // Deactivate sub shells.
+ SubShellList::iterator iList (maActiveSubShells.find(&rShell));
+ if (iList != maActiveSubShells.end())
+ {
+ SubShellSubList& rList (iList->second);
+ while ( ! rList.empty())
+ DeactivateSubShell(rShell, rList.front().mnId);
+ }
+
+ DestroyViewShell(aDescriptor);
+}
+
+void ViewShellManager::Implementation::ActivateSubShell (
+ const SfxShell& rParentShell,
+ ShellId nId)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ // Check that the given view shell is active.
+ if (std::none_of (maActiveViewShells.begin(), maActiveViewShells.end(), IsShell(&rParentShell)))
+ return;
+
+ // Create the sub shell list if it does not yet exist.
+ SubShellList::iterator iList (maActiveSubShells.find(&rParentShell));
+ if (iList == maActiveSubShells.end())
+ iList = maActiveSubShells.emplace(&rParentShell,SubShellSubList()).first;
+
+ // Do not activate an object bar that is already active. Requesting
+ // this is not exactly an error but may be an indication of one.
+ SubShellSubList& rList (iList->second);
+ if (std::any_of(rList.begin(),rList.end(), IsId(nId)))
+ return;
+
+ // Add just the id of the sub shell. The actual shell is created
+ // later in CreateShells().
+ UpdateLock aLock (*this);
+ rList.emplace_back(nId);
+}
+
+void ViewShellManager::Implementation::DeactivateSubShell (
+ const SfxShell& rParentShell,
+ ShellId nId)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ // Check that the given view shell is active.
+ SubShellList::iterator iList (maActiveSubShells.find(&rParentShell));
+ if (iList == maActiveSubShells.end())
+ return;
+
+ // Look up the sub shell.
+ SubShellSubList& rList (iList->second);
+ SubShellSubList::iterator iShell (
+ ::std::find_if(rList.begin(),rList.end(), IsId(nId)));
+ if (iShell == rList.end())
+ return;
+ SfxShell* pShell = iShell->mpShell;
+ if (pShell == nullptr)
+ return;
+
+ UpdateLock aLock (*this);
+
+ ShellDescriptor aDescriptor(*iShell);
+ // Remove the sub shell from both the internal structure as well as the
+ // SFX shell stack above and including the sub shell.
+ rList.erase(iShell);
+ TakeShellsFromStack(pShell);
+
+ DestroySubShell(aDescriptor);
+}
+
+void ViewShellManager::Implementation::MoveToTop (const SfxShell& rShell)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ // Check that we have access to a dispatcher. If not, then we are
+ // (probably) called while the view shell is still being created or
+ // initialized. Without dispatcher we can not rebuild the shell stack
+ // to move the requested shell to the top. So return right away instead
+ // of making a mess without being able to clean up afterwards.
+ if (mrBase.GetDispatcher() == nullptr)
+ return;
+
+ ActiveShellList::iterator iShell (::std::find_if (
+ maActiveViewShells.begin(),
+ maActiveViewShells.end(),
+ IsShell(&rShell)));
+ bool bMove = true;
+ if (iShell != maActiveViewShells.end())
+ {
+ // Is the shell already at the top of the stack? We have to keep
+ // the case in mind that mbKeepMainViewShellOnTop is true. Shells
+ // that are not the main view shell are placed on the second-to-top
+ // position in this case.
+ if (iShell == maActiveViewShells.begin())
+ {
+ // The shell is at the top position and is either a) the main
+ // view shell or b) another shell but the main view shell is not
+ // kept at the top position. We do not have to move the shell.
+ bMove = false;
+ }
+ }
+ else
+ {
+ // The shell is not on the stack. Therefore it can not be moved.
+ // We could insert it but we don't. Use ActivateViewShell() for
+ // that.
+ bMove = false;
+ }
+
+ // When the shell is not at the right position it is removed from the
+ // internal list of shells and inserted at the correct position.
+ if (bMove)
+ {
+ UpdateLock aLock (*this);
+
+ ShellDescriptor aDescriptor(*iShell);
+
+ TakeShellsFromStack(&rShell);
+ maActiveViewShells.erase(iShell);
+
+ maActiveViewShells.insert(maActiveViewShells.begin(), aDescriptor);
+ }
+}
+
+SfxShell* ViewShellManager::Implementation::GetShell (ShellId nId) const
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ SfxShell* pShell = nullptr;
+
+ // First search the active view shells.
+ ActiveShellList::const_iterator iShell (
+ ::std::find_if (
+ maActiveViewShells.begin(),
+ maActiveViewShells.end(),
+ IsId(nId)));
+ if (iShell != maActiveViewShells.end())
+ pShell = iShell->mpShell;
+ else
+ {
+ // Now search the active sub shells of every active view shell.
+ for (auto const& activeSubShell : maActiveSubShells)
+ {
+ const SubShellSubList& rList (activeSubShell.second);
+ SubShellSubList::const_iterator iSubShell(
+ ::std::find_if(rList.begin(),rList.end(), IsId(nId)));
+ if (iSubShell != rList.end())
+ {
+ pShell = iSubShell->mpShell;
+ break;
+ }
+ }
+ }
+
+ return pShell;
+}
+
+SfxShell* ViewShellManager::Implementation::GetTopShell() const
+{
+ OSL_ASSERT(mpTopShell == mrBase.GetSubShell(0));
+ return mpTopShell;
+}
+
+SfxShell* ViewShellManager::Implementation::GetTopViewShell() const
+{
+ return mpTopViewShell;
+}
+
+void ViewShellManager::Implementation::LockUpdate()
+{
+ mnUpdateLockCount++;
+}
+
+void ViewShellManager::Implementation::UnlockUpdate()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ mnUpdateLockCount--;
+ if (mnUpdateLockCount < 0)
+ {
+ // This should not happen.
+ OSL_ASSERT (mnUpdateLockCount>=0);
+ mnUpdateLockCount = 0;
+ }
+ if (mnUpdateLockCount == 0)
+ UpdateShellStack();
+}
+
+/** Update the SFX shell stack (the portion that is visible to us) so that
+ it matches the internal shell stack. This is done in six steps:
+ 1. Create the missing view shells and sub shells.
+ 2. Set up the internal shell stack.
+ 3. Get the SFX shell stack.
+ 4. Find the lowest shell in which the two stacks differ.
+ 5. Remove all shells above and including that shell from the SFX stack.
+ 6. Push all shells of the internal stack on the SFX shell stack that are
+ not already present on the later.
+*/
+void ViewShellManager::Implementation::UpdateShellStack()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ // Remember the undo manager from the top-most shell on the stack.
+ SfxShell* pTopMostShell = mrBase.GetSubShell(0);
+ SfxUndoManager* pUndoManager = (pTopMostShell!=nullptr)
+ ? pTopMostShell->GetUndoManager()
+ : nullptr;
+
+ // 1. Create the missing shells.
+ CreateShells();
+
+ // Update the pointer to the top-most active view shell.
+ mpTopViewShell = (maActiveViewShells.empty())
+ ? nullptr : maActiveViewShells.begin()->mpShell;
+
+
+ // 2. Create the internal target stack.
+ ShellStack aTargetStack;
+ CreateTargetStack(aTargetStack);
+
+ // 3. Get SFX shell stack.
+ ShellStack aSfxShellStack;
+ sal_uInt16 nIndex (0);
+ while (mrBase.GetSubShell(nIndex)!=nullptr)
+ ++nIndex;
+ aSfxShellStack.reserve(nIndex);
+ while (nIndex-- > 0)
+ aSfxShellStack.push_back(mrBase.GetSubShell(nIndex));
+
+#if OSL_DEBUG_LEVEL >= 2
+ SAL_INFO("sd.view", __func__ << ": Current SFX Stack");
+ DumpShellStack(aSfxShellStack);
+ SAL_INFO("sd.view", __func__ << ": Target Stack");
+ DumpShellStack(aTargetStack);
+#endif
+
+ // 4. Find the lowest shell in which the two stacks differ.
+ auto mismatchIters = std::mismatch(aSfxShellStack.begin(), aSfxShellStack.end(),
+ aTargetStack.begin(), aTargetStack.end());
+ ShellStack::iterator iSfxShell (mismatchIters.first);
+ ShellStack::iterator iTargetShell (mismatchIters.second);
+
+ // 5. Remove all shells above and including the differing shell from the
+ // SFX stack starting with the shell on top of the stack.
+ for (std::reverse_iterator<ShellStack::const_iterator> i(aSfxShellStack.end()), iLast(iSfxShell);
+ i != iLast; ++i)
+ {
+ SfxShell* const pShell = *i;
+ SAL_INFO("sd.view", __func__ << ": removing shell " << pShell << " from stack");
+ mrBase.RemoveSubShell(pShell);
+ }
+ aSfxShellStack.erase(iSfxShell, aSfxShellStack.end());
+
+ // 6. Push shells from the given stack onto the SFX stack.
+ mbShellStackIsUpToDate = false;
+ while (iTargetShell != aTargetStack.end())
+ {
+ SAL_INFO("sd.view", __func__ << ": pushing shell " << *iTargetShell << " on stack");
+ mrBase.AddSubShell(**iTargetShell);
+ ++iTargetShell;
+
+ // The pushing of the shell on to the shell stack may have lead to
+ // another invocation of this method. In this case we have to abort
+ // pushing shells on the stack and return immediately.
+ if (mbShellStackIsUpToDate)
+ break;
+ }
+ if (mrBase.GetDispatcher() != nullptr)
+ mrBase.GetDispatcher()->Flush();
+
+ // Update the pointer to the top-most shell and set its undo manager
+ // to the one of the previous top-most shell.
+ mpTopShell = mrBase.GetSubShell(0);
+ if (mpTopShell!=nullptr && pUndoManager!=nullptr && mpTopShell->GetUndoManager()==nullptr)
+ mpTopShell->SetUndoManager(pUndoManager);
+
+ // Finally tell an invocation of this method on a higher level that it can (has
+ // to) abort and return immediately.
+ mbShellStackIsUpToDate = true;
+
+#if OSL_DEBUG_LEVEL >= 2
+ SAL_INFO("sd.view", __func__ << ": New current stack");
+ DumpSfxShellStack();
+#endif
+}
+
+void ViewShellManager::Implementation::TakeShellsFromStack (const SfxShell* pShell)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ // Remember the undo manager from the top-most shell on the stack.
+ SfxShell* pTopMostShell = mrBase.GetSubShell(0);
+ SfxUndoManager* pUndoManager = (pTopMostShell!=nullptr)
+ ? pTopMostShell->GetUndoManager()
+ : nullptr;
+
+#if OSL_DEBUG_LEVEL >= 2
+ SAL_INFO("sd.view", __func__ << "TakeShellsFromStack( " << pShell << ")");
+ DumpSfxShellStack();
+#endif
+
+ // 0.Make sure that the given shell is on the stack. This is a
+ // preparation for the following assertion.
+ for (sal_uInt16 nIndex=0; true; nIndex++)
+ {
+ SfxShell* pShellOnStack = mrBase.GetSubShell(nIndex);
+ if (pShellOnStack == nullptr)
+ {
+ // Set pShell to NULL to indicate the following code that the
+ // shell is not on the stack.
+ pShell = nullptr;
+ break;
+ }
+ else if (pShellOnStack == pShell)
+ break;
+ }
+
+ if (pShell == nullptr)
+ return;
+
+ // 1. Deactivate our shells on the stack before they are removed so
+ // that during the Deactivation() calls the stack is still intact.
+ for (sal_uInt16 nIndex=0; true; nIndex++)
+ {
+ SfxShell* pShellOnStack = mrBase.GetSubShell(nIndex);
+ Deactivate(pShellOnStack);
+ if (pShellOnStack == pShell)
+ break;
+ }
+
+ // 2. Remove the shells from the stack.
+ while (true)
+ {
+ SfxShell* pShellOnStack = mrBase.GetSubShell(0);
+ SAL_INFO("sd.view", __func__ << "removing shell " << pShellOnStack << " from stack");
+ mrBase.RemoveSubShell(pShellOnStack);
+ if (pShellOnStack == pShell)
+ break;
+ }
+
+ // 3. Update the stack.
+ if (mrBase.GetDispatcher() != nullptr)
+ mrBase.GetDispatcher()->Flush();
+
+ // Update the pointer to the top-most shell and set its undo manager
+ // to the one of the previous top-most shell.
+ mpTopShell = mrBase.GetSubShell(0);
+ if (mpTopShell!=nullptr && pUndoManager!=nullptr && mpTopShell->GetUndoManager()==nullptr)
+ mpTopShell->SetUndoManager(pUndoManager);
+
+#if OSL_DEBUG_LEVEL >= 2
+ SAL_INFO("sd.view", __func__ << "Sfx shell stack is:");
+ DumpSfxShellStack();
+#endif
+}
+
+void ViewShellManager::Implementation::CreateShells()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ // Iterate over all view shells.
+ ActiveShellList::reverse_iterator iShell;
+ for (iShell=maActiveViewShells.rbegin(); iShell!=maActiveViewShells.rend(); ++iShell)
+ {
+ // Get the list of associated sub shells.
+ SubShellList::iterator iList (maActiveSubShells.find(iShell->mpShell));
+ if (iList != maActiveSubShells.end())
+ {
+ SubShellSubList& rList (iList->second);
+
+ // Iterate over all sub shells of the current view shell.
+ for (auto & subShell : rList)
+ {
+ if (subShell.mpShell == nullptr)
+ {
+ subShell = CreateSubShell(iShell->mpShell,subShell.mnId);
+ }
+ }
+ }
+ }
+}
+
+void ViewShellManager::Implementation::CreateTargetStack (ShellStack& rStack) const
+{
+ // Create a local stack of the shells that are to push on the shell
+ // stack. We can thus safely create the required shells while still
+ // having a valid shell stack.
+ for (ActiveShellList::const_reverse_iterator iViewShell (maActiveViewShells.rbegin());
+ iViewShell != maActiveViewShells.rend();
+ ++iViewShell)
+ {
+ // Possibly place the form shell below the current view shell.
+ if ( ! mbFormShellAboveParent
+ && mpFormShell!=nullptr
+ && iViewShell->mpShell==mpFormShellParent)
+ {
+ rStack.push_back(mpFormShell);
+ }
+
+ // Put the view shell itself on the local stack.
+ rStack.push_back (iViewShell->mpShell);
+
+ // Possibly place the form shell above the current view shell.
+ if (mbFormShellAboveParent
+ && mpFormShell!=nullptr
+ && iViewShell->mpShell==mpFormShellParent)
+ {
+ rStack.push_back(mpFormShell);
+ }
+
+ // Add all other sub shells.
+ SubShellList::const_iterator iList (maActiveSubShells.find(iViewShell->mpShell));
+ if (iList != maActiveSubShells.end())
+ {
+ const SubShellSubList& rList (iList->second);
+ SubShellSubList::const_reverse_iterator iSubShell;
+ for (iSubShell=rList.rbegin(); iSubShell!=rList.rend(); ++iSubShell)
+ if (iSubShell->mpShell != mpFormShell)
+ rStack.push_back(iSubShell->mpShell);
+ }
+ }
+}
+
+IMPL_LINK(ViewShellManager::Implementation, WindowEventHandler, VclWindowEvent&, rEvent, void)
+{
+ vcl::Window* pEventWindow = rEvent.GetWindow();
+
+ switch (rEvent.GetId())
+ {
+ case VclEventId::WindowGetFocus:
+ {
+ for (auto const& activeShell : maActiveViewShells)
+ {
+ if (pEventWindow == activeShell.GetWindow())
+ {
+ MoveToTop(*activeShell.mpShell);
+ break;
+ }
+ }
+ }
+ break;
+
+ case VclEventId::WindowLoseFocus:
+ break;
+
+ case VclEventId::ObjectDying:
+ // Remember that we do not have to remove the window
+ // listener for this window.
+ for (auto & activeViewShell : maActiveViewShells)
+ {
+ if (activeViewShell.GetWindow() == pEventWindow)
+ {
+ activeViewShell.mbIsListenerAddedToWindow = false;
+ break;
+ }
+ }
+ break;
+
+ default: break;
+ }
+}
+
+ShellDescriptor ViewShellManager::Implementation::CreateSubShell (
+ SfxShell const * pParentShell,
+ ShellId nShellId)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+ ShellDescriptor aResult;
+
+ // Look up the factories for the parent shell.
+ ::std::pair<FactoryList::iterator,FactoryList::iterator> aRange(
+ maShellFactories.equal_range(pParentShell));
+
+ // Try all factories to create the shell.
+ for (FactoryList::const_iterator iFactory=aRange.first; iFactory!=aRange.second; ++iFactory)
+ {
+ SharedShellFactory pFactory = iFactory->second;
+ if (pFactory != nullptr)
+ aResult.mpShell = pFactory->CreateShell(nShellId);
+
+ // Exit the loop when the shell has been successfully created.
+ if (aResult.mpShell != nullptr)
+ {
+ aResult.mpFactory = pFactory;
+ aResult.mnId = nShellId;
+ break;
+ }
+ }
+
+ return aResult;
+}
+
+void ViewShellManager::Implementation::DestroyViewShell (
+ ShellDescriptor& rDescriptor)
+{
+ OSL_ASSERT(rDescriptor.mpShell != nullptr);
+
+ if (rDescriptor.mbIsListenerAddedToWindow)
+ {
+ rDescriptor.mbIsListenerAddedToWindow = false;
+ vcl::Window* pWindow = rDescriptor.GetWindow();
+ if (pWindow != nullptr)
+ {
+ pWindow->RemoveEventListener(
+ LINK(this, ViewShellManager::Implementation, WindowEventHandler));
+ }
+ }
+
+ // Destroy the sub shell factories.
+ ::std::pair<FactoryList::iterator,FactoryList::iterator> aRange(
+ maShellFactories.equal_range(rDescriptor.mpShell));
+ if (aRange.first != maShellFactories.end())
+ maShellFactories.erase(aRange.first, aRange.second);
+
+ // Release the shell.
+ if (rDescriptor.mpFactory)
+ rDescriptor.mpFactory->ReleaseShell(rDescriptor.mpShell);
+}
+
+void ViewShellManager::Implementation::DestroySubShell (
+ const ShellDescriptor& rDescriptor)
+{
+ OSL_ASSERT(rDescriptor.mpFactory);
+ rDescriptor.mpFactory->ReleaseShell(rDescriptor.mpShell);
+}
+
+void ViewShellManager::Implementation::InvalidateAllSubShells (const SfxShell* pParentShell)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ SubShellList::iterator iList (maActiveSubShells.find(pParentShell));
+ if (iList != maActiveSubShells.end())
+ {
+ SubShellSubList& rList (iList->second);
+ for (auto const& shell : rList)
+ if (shell.mpShell != nullptr)
+ shell.mpShell->Invalidate();
+ }
+}
+
+void ViewShellManager::Implementation::Shutdown()
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ // Take stacked shells from stack.
+ if ( ! maActiveViewShells.empty())
+ {
+ UpdateLock aLock (*this);
+
+ while ( ! maActiveViewShells.empty())
+ {
+ SfxShell* pShell = maActiveViewShells.front().mpShell;
+ if (pShell != nullptr)
+ {
+ ViewShell* pViewShell = dynamic_cast<ViewShell*>(pShell);
+ if (pViewShell != nullptr)
+ DeactivateViewShell(*pViewShell);
+ else
+ DeactivateShell(*pShell);
+ }
+ else
+ {
+ SAL_WARN("sd.view",
+ "ViewShellManager::Implementation::Shutdown(): empty active shell descriptor");
+ maActiveViewShells.pop_front();
+ }
+ }
+ }
+ mrBase.RemoveSubShell ();
+
+ maShellFactories.clear();
+}
+
+#if OSL_DEBUG_LEVEL >= 2
+void ViewShellManager::Implementation::DumpShellStack (const ShellStack& rStack)
+{
+ ShellStack::const_reverse_iterator iEntry;
+ for (iEntry=rStack.rbegin(); iEntry!=rStack.rend(); ++iEntry)
+ if (*iEntry != NULL)
+ SAL_INFO("sd.view", __func__ << ": " <<
+ *iEntry << " : " <<
+ (*iEntry)->GetName());
+ else
+ SAL_INFO("sd.view", __func__ << " null");
+}
+
+void ViewShellManager::Implementation::DumpSfxShellStack()
+{
+ ShellStack aSfxShellStack;
+ sal_uInt16 nIndex (0);
+ while (mrBase.GetSubShell(nIndex)!=NULL)
+ ++nIndex;
+ aSfxShellStack.reserve(nIndex);
+ while (nIndex-- > 0)
+ aSfxShellStack.push_back(mrBase.GetSubShell(nIndex));
+ DumpShellStack(aSfxShellStack);
+}
+#endif
+
+void ViewShellManager::Implementation::Deactivate (SfxShell* pShell)
+{
+ OSL_ASSERT(pShell!=nullptr);
+
+ // We have to end a text edit for view shells that are to be taken from
+ // the shell stack.
+ ViewShell* pViewShell = dynamic_cast<ViewShell*>(pShell);
+ if (pViewShell != nullptr)
+ {
+ sd::View* pView = pViewShell->GetView();
+ if (pView!=nullptr && pView->IsTextEdit())
+ {
+ pView->SdrEndTextEdit();
+ pView->UnmarkAll();
+ pViewShell->GetViewFrame()->GetDispatcher()->Execute(
+ SID_OBJECT_SELECT,
+ SfxCallMode::ASYNCHRON);
+ }
+ }
+
+ // Now we can deactivate the shell.
+ pShell->Deactivate(true);
+}
+
+void ViewShellManager::Implementation::SetFormShell (
+ const ViewShell* pFormShellParent,
+ FmFormShell* pFormShell,
+ bool bFormShellAboveParent)
+{
+ ::osl::MutexGuard aGuard (maMutex);
+
+ mpFormShellParent = pFormShellParent;
+ mpFormShell = pFormShell;
+ mbFormShellAboveParent = bFormShellAboveParent;
+}
+
+namespace {
+
+ShellDescriptor::ShellDescriptor()
+ : mpShell(nullptr),
+ mnId(ToolbarId::None),
+ mbIsListenerAddedToWindow(false)
+{
+}
+
+ShellDescriptor::ShellDescriptor (
+ ShellId nId)
+ : mpShell(nullptr),
+ mnId(nId),
+ mbIsListenerAddedToWindow(false)
+{
+}
+
+vcl::Window* ShellDescriptor::GetWindow() const
+{
+ ViewShell* pViewShell = dynamic_cast<ViewShell*>(mpShell);
+ if (pViewShell != nullptr)
+ return pViewShell->GetActiveWindow();
+ else
+ return nullptr;
+}
+
+} // end of anonymous namespace
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/ViewTabBar.cxx b/sd/source/ui/view/ViewTabBar.cxx
new file mode 100644
index 000000000..18a408e83
--- /dev/null
+++ b/sd/source/ui/view/ViewTabBar.cxx
@@ -0,0 +1,561 @@
+/* -*- 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 <ViewTabBar.hxx>
+
+#include <ViewShellBase.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <framework/Pane.hxx>
+#include <DrawController.hxx>
+
+#include <Client.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <com/sun/star/drawing/framework/ResourceId.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/sequence.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <tools/diagnose_ex.h>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+using ::sd::framework::FrameworkHelper;
+
+namespace sd {
+
+namespace {
+bool IsEqual (const TabBarButton& rButton1, const TabBarButton& rButton2)
+{
+ return ((rButton1.ResourceId.is()
+ && rButton2.ResourceId.is()
+ && rButton1.ResourceId->compareTo(rButton2.ResourceId) == 0)
+ || rButton1.ButtonLabel == rButton2.ButtonLabel);
+}
+
+} // end of anonymous namespace
+
+ViewTabBar::ViewTabBar (
+ const Reference<XResourceId>& rxViewTabBarId,
+ const Reference<frame::XController>& rxController)
+ : mpTabControl(VclPtr<TabBarControl>::Create(GetAnchorWindow(rxViewTabBarId,rxController), this)),
+ mxController(rxController),
+ mxViewTabBarId(rxViewTabBarId),
+ mpViewShellBase(nullptr),
+ mnNoteBookWidthPadding(0)
+{
+ // Tunnel through the controller and use the ViewShellBase to obtain the
+ // view frame.
+ try
+ {
+ Reference<lang::XUnoTunnel> xTunnel (mxController, UNO_QUERY_THROW);
+ if (auto pController = comphelper::getFromUnoTunnel<DrawController>(xTunnel))
+ mpViewShellBase = pController->GetViewShellBase();
+ }
+ catch (const RuntimeException&)
+ {
+ }
+
+ // Register as listener at XConfigurationController.
+ Reference<XControllerManager> xControllerManager (mxController, UNO_QUERY);
+ if (xControllerManager.is())
+ {
+ mxConfigurationController = xControllerManager->getConfigurationController();
+ if (mxConfigurationController.is())
+ {
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msResourceActivationEvent,
+ Any());
+ }
+ }
+
+ mpTabControl->Show();
+
+ if (mpViewShellBase != nullptr
+ && rxViewTabBarId->isBoundToURL(
+ FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
+ {
+ mpViewShellBase->SetViewTabBar(this);
+ }
+}
+
+ViewTabBar::~ViewTabBar()
+{
+}
+
+void ViewTabBar::disposing(std::unique_lock<std::mutex>&)
+{
+ if (mpViewShellBase != nullptr
+ && mxViewTabBarId->isBoundToURL(
+ FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
+ {
+ mpViewShellBase->SetViewTabBar(nullptr);
+ }
+
+ if (mxConfigurationController.is())
+ {
+ // Unregister listener from XConfigurationController.
+ try
+ {
+ mxConfigurationController->removeConfigurationChangeListener(this);
+ }
+ catch (const lang::DisposedException&)
+ {
+ // Receiving a disposed exception is the normal case. Is there
+ // a way to avoid it?
+ }
+ mxConfigurationController = nullptr;
+ }
+
+ {
+ const SolarMutexGuard aSolarGuard;
+ mpTabControl.disposeAndClear();
+ }
+
+ mxController = nullptr;
+}
+
+vcl::Window* ViewTabBar::GetAnchorWindow(
+ const Reference<XResourceId>& rxViewTabBarId,
+ const Reference<frame::XController>& rxController)
+{
+ vcl::Window* pWindow = nullptr;
+ ViewShellBase* pBase = nullptr;
+
+ // Tunnel through the controller and use the ViewShellBase to obtain the
+ // view frame.
+ try
+ {
+ Reference<lang::XUnoTunnel> xTunnel (rxController, UNO_QUERY_THROW);
+ if (auto pController = comphelper::getFromUnoTunnel<DrawController>(xTunnel))
+ pBase = pController->GetViewShellBase();
+ }
+ catch (const RuntimeException&)
+ {
+ }
+
+ // The ViewTabBar supports at the moment only the center pane.
+ if (rxViewTabBarId.is()
+ && rxViewTabBarId->isBoundToURL(
+ FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT))
+ {
+ if (pBase != nullptr && pBase->GetViewFrame() != nullptr)
+ pWindow = &pBase->GetViewFrame()->GetWindow();
+ }
+
+ // The rest is (at the moment) just for the emergency case.
+ if (pWindow == nullptr)
+ {
+ Reference<XPane> xPane;
+ try
+ {
+ Reference<XControllerManager> xControllerManager (rxController, UNO_QUERY_THROW);
+ Reference<XConfigurationController> xCC (
+ xControllerManager->getConfigurationController());
+ if (xCC.is())
+ xPane.set(xCC->getResource(rxViewTabBarId->getAnchor()), UNO_QUERY);
+ }
+ catch (const RuntimeException&)
+ {
+ }
+
+ // Tunnel through the XWindow to the VCL side.
+ try
+ {
+ Reference<lang::XUnoTunnel> xTunnel (xPane, UNO_QUERY_THROW);
+ if (auto pPane = comphelper::getFromUnoTunnel<framework::Pane>(xTunnel))
+ pWindow = pPane->GetWindow()->GetParent();
+ }
+ catch (const RuntimeException&)
+ {
+ }
+ }
+
+ return pWindow;
+}
+
+//----- XConfigurationChangeListener ------------------------------------------
+
+void SAL_CALL ViewTabBar::notifyConfigurationChange (
+ const ConfigurationChangeEvent& rEvent)
+{
+ if (rEvent.Type == FrameworkHelper::msResourceActivationEvent
+ && rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix)
+ && rEvent.ResourceId->isBoundTo(mxViewTabBarId->getAnchor(), AnchorBindingMode_DIRECT))
+ {
+ UpdateActiveButton();
+ }
+}
+
+//----- XEventListener --------------------------------------------------------
+
+void SAL_CALL ViewTabBar::disposing(
+ const lang::EventObject& rEvent)
+{
+ if (rEvent.Source == mxConfigurationController)
+ {
+ mxConfigurationController = nullptr;
+ mxController = nullptr;
+ }
+}
+
+//----- XTabBar ---------------------------------------------------------------
+
+void SAL_CALL ViewTabBar::addTabBarButtonAfter (
+ const TabBarButton& rButton,
+ const TabBarButton& rAnchor)
+{
+ const SolarMutexGuard aSolarGuard;
+ AddTabBarButton(rButton, rAnchor);
+}
+
+void SAL_CALL ViewTabBar::appendTabBarButton (const TabBarButton& rButton)
+{
+ const SolarMutexGuard aSolarGuard;
+ AddTabBarButton(rButton);
+}
+
+void SAL_CALL ViewTabBar::removeTabBarButton (const TabBarButton& rButton)
+{
+ const SolarMutexGuard aSolarGuard;
+ RemoveTabBarButton(rButton);
+}
+
+sal_Bool SAL_CALL ViewTabBar::hasTabBarButton (const TabBarButton& rButton)
+{
+ const SolarMutexGuard aSolarGuard;
+ return HasTabBarButton(rButton);
+}
+
+Sequence<TabBarButton> SAL_CALL ViewTabBar::getTabBarButtons()
+{
+ const SolarMutexGuard aSolarGuard;
+ return GetTabBarButtons();
+}
+
+//----- XResource -------------------------------------------------------------
+
+Reference<XResourceId> SAL_CALL ViewTabBar::getResourceId()
+{
+ return mxViewTabBarId;
+}
+
+sal_Bool SAL_CALL ViewTabBar::isAnchorOnly()
+{
+ return false;
+}
+
+//----- XUnoTunnel ------------------------------------------------------------
+
+const Sequence<sal_Int8>& ViewTabBar::getUnoTunnelId()
+{
+ static const comphelper::UnoIdInit theViewTabBarUnoTunnelId;
+ return theViewTabBarUnoTunnelId.getSeq();
+}
+
+sal_Int64 SAL_CALL ViewTabBar::getSomething (const Sequence<sal_Int8>& rId)
+{
+ return comphelper::getSomethingImpl(rId, this);
+}
+
+bool ViewTabBar::ActivatePage(size_t nIndex)
+{
+ try
+ {
+ Reference<XControllerManager> xControllerManager (mxController,UNO_QUERY_THROW);
+ Reference<XConfigurationController> xConfigurationController (
+ xControllerManager->getConfigurationController());
+ if ( ! xConfigurationController.is())
+ throw RuntimeException();
+ Reference<XView> xView;
+ try
+ {
+ xView.set(xConfigurationController->getResource(
+ ResourceId::create(
+ ::comphelper::getProcessComponentContext(),
+ FrameworkHelper::msCenterPaneURL)),
+ UNO_QUERY);
+ }
+ catch (const DeploymentException&)
+ {
+ }
+
+ Client* pIPClient = nullptr;
+ if (mpViewShellBase != nullptr)
+ pIPClient = dynamic_cast<Client*>(mpViewShellBase->GetIPClient());
+ if (pIPClient==nullptr || ! pIPClient->IsObjectInPlaceActive())
+ {
+ if (nIndex < maTabBarButtons.size())
+ {
+ xConfigurationController->requestResourceActivation(
+ maTabBarButtons[nIndex].ResourceId,
+ ResourceActivationMode_REPLACE);
+ }
+
+ return true;
+ }
+ }
+ catch (const RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd.view");
+ }
+
+ return false;
+}
+
+int ViewTabBar::GetHeight() const
+{
+ int nHeight (0);
+
+ if (!maTabBarButtons.empty())
+ {
+ if (mpTabControl->IsReallyVisible())
+ {
+ weld::Notebook& rNotebook = mpTabControl->GetNotebook();
+ int nAllocatedWidth = mpTabControl->GetAllocatedWidth();
+ int nPageWidth = nAllocatedWidth - mnNoteBookWidthPadding;
+
+ // set each page width-request to the size it takes to fit the notebook allocation
+ for (int nIndex = 1, nPageCount = rNotebook.get_n_pages(); nIndex <= nPageCount; ++nIndex)
+ {
+ OString sIdent(OString::number(nIndex));
+ weld::Container* pContainer = rNotebook.get_page(sIdent);
+ pContainer->set_size_request(nPageWidth, -1);
+ }
+
+ // get the height-for-width for this allocation
+ nHeight = mpTabControl->get_preferred_size().Height();
+ }
+
+ if (nHeight <= 0)
+ {
+ // Using a default when the real height can not be determined.
+ // To get correct height this method should be called when the
+ // control is visible.
+ nHeight = 21;
+ }
+ }
+
+ return nHeight;
+}
+
+void ViewTabBar::AddTabBarButton (
+ const css::drawing::framework::TabBarButton& rButton,
+ const css::drawing::framework::TabBarButton& rAnchor)
+{
+ TabBarButtonList::size_type nIndex;
+
+ if ( ! rAnchor.ResourceId.is()
+ || (rAnchor.ResourceId->getResourceURL().isEmpty()
+ && rAnchor.ButtonLabel.isEmpty()))
+ {
+ nIndex = 0;
+ }
+ else
+ {
+ for (nIndex=0; nIndex<maTabBarButtons.size(); ++nIndex)
+ {
+ if (IsEqual(maTabBarButtons[nIndex], rAnchor))
+ {
+ ++nIndex;
+ break;
+ }
+ }
+ }
+
+ AddTabBarButton(rButton,nIndex);
+}
+
+void ViewTabBar::AddTabBarButton (
+ const css::drawing::framework::TabBarButton& rButton)
+{
+ AddTabBarButton(rButton, maTabBarButtons.size());
+}
+
+void ViewTabBar::AddTabBarButton (
+ const css::drawing::framework::TabBarButton& rButton,
+ sal_Int32 nPosition)
+{
+ if (nPosition >= 0 &&
+ nPosition <= mpTabControl->GetNotebook().get_n_pages())
+ {
+ // Insert the button into our local array.
+ maTabBarButtons.insert(maTabBarButtons.begin() + nPosition, rButton);
+ UpdateTabBarButtons();
+ UpdateActiveButton();
+ }
+}
+
+void ViewTabBar::RemoveTabBarButton (
+ const css::drawing::framework::TabBarButton& rButton)
+{
+ for (TabBarButtonList::size_type nIndex=0; nIndex<maTabBarButtons.size(); ++nIndex)
+ {
+ if (IsEqual(maTabBarButtons[nIndex], rButton))
+ {
+ maTabBarButtons.erase(maTabBarButtons.begin()+nIndex);
+ UpdateTabBarButtons();
+ UpdateActiveButton();
+ break;
+ }
+ }
+}
+
+bool ViewTabBar::HasTabBarButton (
+ const css::drawing::framework::TabBarButton& rButton)
+{
+ bool bResult (false);
+
+ for (const css::drawing::framework::TabBarButton & r : maTabBarButtons)
+ {
+ if (IsEqual(r, rButton))
+ {
+ bResult = true;
+ break;
+ }
+ }
+
+ return bResult;
+}
+
+css::uno::Sequence<css::drawing::framework::TabBarButton>
+ ViewTabBar::GetTabBarButtons()
+{
+ return comphelper::containerToSequence(maTabBarButtons);
+}
+
+void ViewTabBar::UpdateActiveButton()
+{
+ Reference<XView> xView;
+ if (mpViewShellBase != nullptr)
+ xView = FrameworkHelper::Instance(*mpViewShellBase)->GetView(
+ mxViewTabBarId->getAnchor());
+ if (!xView.is())
+ return;
+
+ Reference<XResourceId> xViewId (xView->getResourceId());
+ for (size_t nIndex=0; nIndex<maTabBarButtons.size(); ++nIndex)
+ {
+ if (maTabBarButtons[nIndex].ResourceId->compareTo(xViewId) == 0)
+ {
+ mpTabControl->GetNotebook().set_current_page(nIndex);
+ break;
+ }
+ }
+}
+
+void ViewTabBar::UpdateTabBarButtons()
+{
+ int nMaxPageWidthReq(0);
+
+ weld::Notebook& rNotebook = mpTabControl->GetNotebook();
+ int nPageCount(rNotebook.get_n_pages());
+ int nIndex = 1;
+ for (const auto& rTab : maTabBarButtons)
+ {
+ OString sIdent(OString::number(nIndex));
+ // Create a new tab when there are not enough.
+ if (nPageCount < nIndex)
+ rNotebook.append_page(sIdent, rTab.ButtonLabel);
+ else
+ {
+ // Update the tab.
+ rNotebook.set_tab_label_text(sIdent, rTab.ButtonLabel);
+ }
+
+ // Set a fairly arbitrary initial width request for the pages so we can
+ // measure what extra width the notebook itself uses
+ weld::Container* pContainer = rNotebook.get_page(sIdent);
+ int nTextWidth = pContainer->get_pixel_size(rTab.ButtonLabel).Width();
+ pContainer->set_size_request(nTextWidth, -1);
+ nMaxPageWidthReq = std::max(nMaxPageWidthReq, nTextWidth);
+
+ ++nIndex;
+ }
+
+ // Delete tabs that are no longer used.
+ for (; nIndex<=nPageCount; ++nIndex)
+ rNotebook.remove_page(OString::number(nIndex));
+
+ int nWidthReq = rNotebook.get_preferred_size().Width();
+ // The excess width over the page request that the notebook uses we will
+ // use this later to help measure the best height-for-width given the
+ // eventual allocated width of the notebook
+ mnNoteBookWidthPadding = nWidthReq - nMaxPageWidthReq;
+}
+
+//===== TabBarControl =========================================================
+
+TabBarControl::TabBarControl (
+ vcl::Window* pParentWindow,
+ const ::rtl::Reference<ViewTabBar>& rpViewTabBar)
+ : InterimItemWindow(pParentWindow, "modules/simpress/ui/tabviewbar.ui", "TabViewBar")
+ , mxTabControl(m_xBuilder->weld_notebook("tabcontrol"))
+ , mpViewTabBar(rpViewTabBar)
+ , mnAllocatedWidth(0)
+{
+ // Because the actual window background is transparent--to avoid
+ // flickering due to multiple background paintings by this and by child
+ // windows--we have to paint the background for this control explicitly:
+ // the actual control is not painted over its whole bounding box.
+ SetPaintTransparent(false);
+ SetBackground(Application::GetSettings().GetStyleSettings().GetDialogColor());
+
+ InitControlBase(mxTabControl.get());
+
+ mxTabControl->connect_enter_page(LINK(this, TabBarControl, ActivatePageHdl));
+ mxTabControl->connect_size_allocate(LINK(this, TabBarControl, NotebookSizeAllocHdl));
+}
+
+void TabBarControl::dispose()
+{
+ mxTabControl.reset();
+ InterimItemWindow::dispose();
+}
+
+TabBarControl::~TabBarControl()
+{
+ disposeOnce();
+}
+
+IMPL_LINK(TabBarControl, NotebookSizeAllocHdl, const Size&, rSize, void)
+{
+ mnAllocatedWidth = rSize.Width();
+}
+
+IMPL_LINK(TabBarControl, ActivatePageHdl, const OString&, rPage, void)
+{
+ if (!mpViewTabBar->ActivatePage(mxTabControl->get_page_index(rPage)))
+ {
+ // When we run into this else branch then we have an active OLE
+ // object. We ignore the request to switch views. Additionally
+ // we put the active tab back to the one for the current view.
+ mpViewTabBar->UpdateActiveButton();
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/WindowUpdater.cxx b/sd/source/ui/view/WindowUpdater.cxx
new file mode 100644
index 000000000..c3f1bb53e
--- /dev/null
+++ b/sd/source/ui/view/WindowUpdater.cxx
@@ -0,0 +1,131 @@
+/* -*- 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 <WindowUpdater.hxx>
+#include <drawdoc.hxx>
+
+#include <vcl/outdev.hxx>
+#include <vcl/vclptr.hxx>
+#include <vcl/window.hxx>
+
+#include <algorithm>
+
+namespace sd {
+
+WindowUpdater::WindowUpdater()
+ : mpDocument (nullptr)
+{
+ maCTLOptions.AddListener(this);
+}
+
+WindowUpdater::~WindowUpdater() noexcept
+{
+ maCTLOptions.RemoveListener(this);
+}
+
+void WindowUpdater::RegisterWindow (vcl::Window* pWindow)
+{
+ if (pWindow != nullptr)
+ {
+ tWindowList::iterator aWindowIterator (
+ ::std::find (
+ maWindowList.begin(), maWindowList.end(), pWindow));
+ if (aWindowIterator == maWindowList.end())
+ {
+ // Update the device once right now and add it to the list.
+ Update (pWindow->GetOutDev());
+ maWindowList.emplace_back(pWindow);
+ }
+ }
+}
+
+void WindowUpdater::UnregisterWindow (vcl::Window* pWindow)
+{
+ tWindowList::iterator aWindowIterator (
+ ::std::find (
+ maWindowList.begin(), maWindowList.end(), pWindow));
+ if (aWindowIterator != maWindowList.end())
+ {
+ maWindowList.erase (aWindowIterator);
+ }
+}
+
+void WindowUpdater::SetDocument (SdDrawDocument* pDocument)
+{
+ mpDocument = pDocument;
+}
+
+void WindowUpdater::Update (
+ OutputDevice* pDevice) const
+{
+ if (pDevice != nullptr)
+ {
+ UpdateWindow (pDevice);
+ }
+}
+
+void WindowUpdater::UpdateWindow (OutputDevice* pDevice) const
+{
+ if (pDevice == nullptr)
+ return;
+
+ SvtCTLOptions::TextNumerals aNumeralMode (maCTLOptions.GetCTLTextNumerals());
+
+ LanguageType aLanguage;
+ // Now this is a bit confusing. The numerals in arabic languages
+ // are Hindi numerals and what the western world generally uses are
+ // arabic numerals. The digits used in the Hindi language are not
+ // used at all.
+ switch (aNumeralMode)
+ {
+ case SvtCTLOptions::NUMERALS_HINDI:
+ aLanguage = LANGUAGE_ARABIC_SAUDI_ARABIA;
+ break;
+
+ case SvtCTLOptions::NUMERALS_SYSTEM:
+ aLanguage = LANGUAGE_SYSTEM;
+ break;
+
+ case SvtCTLOptions::NUMERALS_ARABIC:
+ default:
+ aLanguage = LANGUAGE_ENGLISH;
+ break;
+ }
+
+ pDevice->SetDigitLanguage (aLanguage);
+}
+
+void WindowUpdater::ConfigurationChanged( utl::ConfigurationBroadcaster*, ConfigurationHints )
+{
+ // Set the current state at all registered output devices.
+ for (auto& rxWindow : maWindowList)
+ Update (rxWindow->GetOutDev());
+
+ // Reformat the document for the modified state to take effect.
+ if (mpDocument != nullptr)
+ mpDocument->ReformatAllTextObjects();
+
+ // Invalidate the windows to make the modified state visible.
+ for (auto& rxWindow : maWindowList)
+ rxWindow->Invalidate();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/clview.cxx b/sd/source/ui/view/clview.cxx
new file mode 100644
index 000000000..9f11839da
--- /dev/null
+++ b/sd/source/ui/view/clview.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/.
+ *
+ * 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 <ClientView.hxx>
+#include <drawview.hxx>
+
+namespace sd
+{
+class DrawDocShell;
+class DrawViewShell;
+
+/**
+ * ClientView is used for DrawDocShell::Draw()
+ */
+
+ClientView::ClientView(DrawDocShell* pDocSh, OutputDevice* pOutDev)
+ : DrawView(pDocSh, pOutDev, nullptr)
+{
+}
+
+ClientView::~ClientView() {}
+
+/**
+ * If View should not Invalidate() the windows, this method has
+ * to be overridden and properly handled.
+ */
+
+void ClientView::InvalidateOneWin(OutputDevice& rWin)
+{
+ vcl::Region aRegion;
+ CompleteRedraw(&rWin, aRegion);
+}
+
+/**
+ * If View should not Invalidate() the windows, this method has
+ * to be overridden and properly handled.
+ */
+
+void ClientView::InvalidateOneWin(OutputDevice& rWin, const ::tools::Rectangle& rRect)
+{
+ CompleteRedraw(&rWin, vcl::Region(rRect));
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drawview.cxx b/sd/source/ui/view/drawview.cxx
new file mode 100644
index 000000000..e4cdf0107
--- /dev/null
+++ b/sd/source/ui/view/drawview.cxx
@@ -0,0 +1,634 @@
+/* -*- 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 <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <svl/style.hxx>
+#include <editeng/outliner.hxx>
+#include <svx/svdotext.hxx>
+#include <svl/poolitem.hxx>
+#include <editeng/eeitem.hxx>
+#include <svl/whiter.hxx>
+#include <sal/log.hxx>
+#include <tools/debug.hxx>
+
+#include <svx/svdundo.hxx>
+#include <svx/strings.hrc>
+#include <svx/dialmgr.hxx>
+
+#include <strings.hrc>
+#include <View.hxx>
+#include <drawview.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <sdpage.hxx>
+#include <ViewShellBase.hxx>
+#include <DrawViewShell.hxx>
+#include <pres.hxx>
+#include <sdresid.hxx>
+#include <unchss.hxx>
+#include <slideshow.hxx>
+
+#include <undo/undomanager.hxx>
+
+using namespace ::com::sun::star;
+
+namespace sd {
+
+
+/**
+ * Shows the first page of document at position 0,0. In the case
+ * that there is no page a page is created.
+ */
+
+DrawView::DrawView(
+ DrawDocShell* pDocSh,
+ OutputDevice* pOutDev,
+ DrawViewShell* pShell)
+: ::sd::View(*pDocSh->GetDoc(), pOutDev, pShell)
+ ,mpDocShell(pDocSh)
+ ,mpDrawViewShell(pShell)
+ ,mnPOCHSmph(0)
+{
+ SetCurrentObj(SdrObjKind::Rectangle);
+}
+
+DrawView::~DrawView()
+{
+}
+
+/**
+ * Virtual method from SdrView, called at selection change.
+ */
+
+void DrawView::MarkListHasChanged()
+{
+ ::sd::View::MarkListHasChanged();
+
+ if (mpDrawViewShell)
+ mpDrawViewShell->SelectionHasChanged();
+}
+
+/**
+ * Virtual method from SdrView, called at model change.
+ */
+
+void DrawView::ModelHasChanged()
+{
+ ::sd::View::ModelHasChanged();
+
+ // force framer to rerender
+ SfxStyleSheetBasePool* pSSPool = mrDoc.GetStyleSheetPool();
+ pSSPool->Broadcast(SfxStyleSheetPoolHint());
+
+ if( mpDrawViewShell )
+ mpDrawViewShell->ModelHasChanged();
+
+}
+
+/**
+ * Redirect attributes onto title and outline text and background
+ * rectangle of a masterpage into templates, otherwise pass on baseclass.
+ */
+
+bool DrawView::SetAttributes(const SfxItemSet& rSet,
+ bool bReplaceAll, bool bSlide, bool bMaster)
+{
+ bool bOk = false;
+
+ if (mpDrawViewShell && bMaster)
+ {
+ SfxStyleSheetBasePool* pStShPool = mrDoc.GetStyleSheetPool();
+ SdPage& rPage = *mpDrawViewShell->getCurrentPage();
+ SdrPage& rMasterPage = rPage.TRG_GetMasterPage();
+ size_t nObjCount = rMasterPage.GetObjCount();
+ for (size_t nObj = 0; nObj < nObjCount; ++nObj)
+ {
+ SdrObject* pObject = rMasterPage.GetObj(nObj);
+ SetMasterAttributes(pObject, rPage, rSet, pStShPool, bOk, bMaster, bSlide);
+ }
+ return bOk;
+ }
+ if (mpDrawViewShell && bSlide)
+ {
+ SfxStyleSheetBasePool* pStShPool = mrDoc.GetStyleSheetPool();
+ SdPage& rPage = *mpDrawViewShell->getCurrentPage();
+ size_t nObjCount = rPage.GetObjCount();
+ for (size_t nObj = 0; nObj < nObjCount; ++nObj)
+ {
+ SdrObject* pObject = rPage.GetObj(nObj);
+ SetMasterAttributes(pObject, rPage, rSet, pStShPool, bOk, bMaster, bSlide);
+ }
+ return bOk;
+ }
+
+ // is there a masterpage edit?
+ if ( mpDrawViewShell && (mpDrawViewShell->GetEditMode() == EditMode::MasterPage) )
+ {
+ SfxStyleSheetBasePool* pStShPool = mrDoc.GetStyleSheetPool();
+ SdPage& rPage = *mpDrawViewShell->getCurrentPage();
+ SdrTextObj* pEditObject = GetTextEditObject();
+
+ if (pEditObject)
+ {
+ // Textedit
+
+ SdrInventor nInv = pEditObject->GetObjInventor();
+
+ if (nInv == SdrInventor::Default)
+ {
+ SdrObjKind eObjKind = pEditObject->GetObjIdentifier();
+ PresObjKind ePresObjKind = rPage.GetPresObjKind(pEditObject);
+
+ if ( ePresObjKind == PresObjKind::Title ||
+ ePresObjKind == PresObjKind::Notes )
+ {
+ // Presentation object (except outline)
+ SfxStyleSheet* pSheet = rPage.GetStyleSheetForPresObj( ePresObjKind );
+ DBG_ASSERT(pSheet, "StyleSheet not found");
+
+ SfxItemSet aTempSet( pSheet->GetItemSet() );
+ aTempSet.Put( rSet );
+ aTempSet.ClearInvalidItems();
+
+ // Undo-Action
+ mpDocSh->GetUndoManager()->AddUndoAction(
+ std::make_unique<StyleSheetUndoAction>(&mrDoc, pSheet, &aTempSet));
+
+ pSheet->GetItemSet().Put(aTempSet);
+ pSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+ bOk = true;
+ }
+ else if (eObjKind == SdrObjKind::OutlineText)
+ {
+ // Presentation object outline
+ OutlinerView* pOV = GetTextEditOutlinerView();
+ ::Outliner* pOutliner = pOV->GetOutliner();
+
+ pOutliner->SetUpdateLayout(false);
+ mpDocSh->SetWaitCursor( true );
+
+ // replace placeholder by template name
+ OUString aComment(SdResId(STR_UNDO_CHANGE_PRES_OBJECT));
+ aComment = aComment.replaceFirst("$", SdResId(STR_PSEUDOSHEET_OUTLINE));
+ mpDocSh->GetUndoManager()->EnterListAction( aComment, OUString(), 0, mpDrawViewShell->GetViewShellBase().GetViewShellId() );
+
+ std::vector<Paragraph*> aSelList;
+ pOV->CreateSelectionList(aSelList);
+
+ std::vector<Paragraph*>::reverse_iterator iter = aSelList.rbegin();
+ Paragraph* pPara = iter != aSelList.rend() ? *iter : nullptr;
+
+ while (pPara)
+ {
+ sal_Int32 nParaPos = pOutliner->GetAbsPos( pPara );
+ sal_Int16 nDepth = pOutliner->GetDepth( nParaPos );
+ OUString aName = rPage.GetLayoutName() + " " +
+ OUString::number((nDepth <= 0) ? 1 : nDepth + 1);
+ SfxStyleSheet* pSheet = static_cast<SfxStyleSheet*>(pStShPool->Find(aName, SfxStyleFamily::Page));
+ //We have no stylesheet if we access outline level 10
+ //in the master preview, there is no true style backing
+ //that entry
+ SAL_WARN_IF(!pSheet, "sd", "StyleSheet " << aName << " not found");
+ if (pSheet)
+ {
+ SfxItemSet aTempSet( pSheet->GetItemSet() );
+ aTempSet.Put( rSet );
+ aTempSet.ClearInvalidItems();
+
+ if( nDepth > 0 && aTempSet.GetItemState( EE_PARA_NUMBULLET ) == SfxItemState::SET )
+ {
+ // no SvxNumBulletItem in outline level 1 to 8!
+ aTempSet.ClearItem( EE_PARA_NUMBULLET );
+ }
+
+ // Undo-Action
+ mpDocSh->GetUndoManager()->AddUndoAction(
+ std::make_unique<StyleSheetUndoAction>(&mrDoc, pSheet, &aTempSet));
+
+ pSheet->GetItemSet().Put(aTempSet);
+ pSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+
+ // now also broadcast any child sheets
+ sal_Int16 nChild;
+ for( nChild = nDepth + 1; nChild < 9; nChild++ )
+ {
+ OUString aSheetName = rPage.GetLayoutName() + " " +
+ OUString::number((nChild <= 0) ? 1 : nChild + 1);
+ SfxStyleSheet* pOutlSheet = static_cast< SfxStyleSheet* >(pStShPool->Find(aSheetName, SfxStyleFamily::Page));
+
+ if( pOutlSheet )
+ pOutlSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+ }
+ }
+
+ ++iter;
+ pPara = iter != aSelList.rend() ? *iter : nullptr;
+
+ bool bJumpToLevel1 = false;
+ if( !pPara && nDepth > 0 && rSet.GetItemState( EE_PARA_NUMBULLET ) == SfxItemState::SET )
+ bJumpToLevel1 = true;
+
+ if (bJumpToLevel1)
+ {
+ iter = aSelList.rend();
+ --iter;
+
+ if (pOutliner->GetDepth(pOutliner->GetAbsPos(*iter)) > 0)
+ pPara = pOutliner->GetParagraph( 0 ); // Put NumBulletItem in outline level 1
+ }
+ }
+
+ mpDocSh->SetWaitCursor( false );
+ pOV->GetOutliner()->SetUpdateLayout(true);
+
+ mpDocSh->GetUndoManager()->LeaveListAction();
+
+ bOk = true;
+ }
+ else
+ {
+ bOk = ::sd::View::SetAttributes(rSet, bReplaceAll);
+ }
+ }
+ }
+ else
+ {
+ // Selection
+ const SdrMarkList& rList = GetMarkedObjectList();
+ const size_t nMarkCount = rList.GetMarkCount();
+ for (size_t nMark = 0; nMark < nMarkCount; ++nMark)
+ {
+ SdrObject* pObject = rList.GetMark(nMark)->GetMarkedSdrObj();
+ SetMasterAttributes(pObject, rPage, rSet, pStShPool, bOk, bMaster, bSlide);
+ }
+
+ if(!bOk)
+ bOk = ::sd::View::SetAttributes(rSet, bReplaceAll);
+ }
+ }
+ else // not at masterpage
+ {
+ bOk = ::sd::View::SetAttributes(rSet, bReplaceAll);
+ }
+
+ return bOk;
+}
+
+void DrawView::SetMasterAttributes( SdrObject* pObject, const SdPage& rPage, SfxItemSet rSet, SfxStyleSheetBasePool* pStShPool, bool& bOk, bool bMaster, bool bSlide )
+{
+ SdrInventor nInv = pObject->GetObjInventor();
+
+ if (nInv != SdrInventor::Default)
+ return;
+
+ SdrObjKind eObjKind = pObject->GetObjIdentifier();
+ PresObjKind ePresObjKind = rPage.GetPresObjKind(pObject);
+ if (bSlide && eObjKind == SdrObjKind::Text)
+ {
+ // Presentation object (except outline)
+ SfxStyleSheet* pSheet = rPage.GetTextStyleSheetForObject(pObject);
+ DBG_ASSERT(pSheet, "StyleSheet not found");
+
+ SfxItemSet aTempSet( pSheet->GetItemSet() );
+ aTempSet.Put( rSet );
+ aTempSet.ClearInvalidItems();
+
+ // Undo-Action
+ mpDocSh->GetUndoManager()->AddUndoAction(
+ std::make_unique<StyleSheetUndoAction>(&mrDoc, pSheet, &aTempSet));
+
+ pSheet->GetItemSet().Put(aTempSet,false);
+ pSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+ bOk = true;
+ }
+
+ if (!bSlide &&
+ (ePresObjKind == PresObjKind::Title ||
+ ePresObjKind == PresObjKind::Notes))
+ {
+ // Presentation object (except outline)
+ SfxStyleSheet* pSheet = rPage.GetStyleSheetForPresObj( ePresObjKind );
+ DBG_ASSERT(pSheet, "StyleSheet not found");
+
+ SfxItemSet aTempSet( pSheet->GetItemSet() );
+ aTempSet.Put( rSet );
+ aTempSet.ClearInvalidItems();
+
+ // Undo-Action
+ mpDocSh->GetUndoManager()->AddUndoAction(
+ std::make_unique<StyleSheetUndoAction>(&mrDoc, pSheet, &aTempSet));
+
+ pSheet->GetItemSet().Put(aTempSet,false);
+ pSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+ bOk = true;
+ }
+ else if (eObjKind == SdrObjKind::OutlineText)
+ {
+ // tdf#127900: do not forget to apply master style to placeholders
+ if (!rSet.HasItem(EE_PARA_NUMBULLET) || bMaster)
+ {
+ // Presentation object outline
+ for (sal_uInt16 nLevel = 9; nLevel > 0; nLevel--)
+ {
+ OUString aName = rPage.GetLayoutName() + " " +
+ OUString::number(nLevel);
+ SfxStyleSheet* pSheet = static_cast<SfxStyleSheet*>(pStShPool->
+ Find(aName, SfxStyleFamily::Page));
+ DBG_ASSERT(pSheet, "StyleSheet not found");
+
+ SfxItemSet aTempSet( pSheet->GetItemSet() );
+
+ if( nLevel > 1 )
+ {
+ // for all levels over 1, clear all items that will be
+ // hard set to level 1
+ SfxWhichIter aWhichIter(rSet);
+ sal_uInt16 nWhich(aWhichIter.FirstWhich());
+ while( nWhich )
+ {
+ if( SfxItemState::SET == aWhichIter.GetItemState() )
+ aTempSet.ClearItem( nWhich );
+ nWhich = aWhichIter.NextWhich();
+ }
+
+ }
+ else
+ {
+ // put the items hard into level one
+ aTempSet.Put( rSet );
+ }
+
+ aTempSet.ClearInvalidItems();
+
+ // Undo-Action
+ mpDocSh->GetUndoManager()->AddUndoAction(
+ std::make_unique<StyleSheetUndoAction>(&mrDoc, pSheet, &aTempSet));
+
+ pSheet->GetItemSet().Set(aTempSet,false);
+ pSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
+ }
+
+ // remove all hard set items from shape that are now set in style
+ SfxWhichIter aWhichIter(rSet);
+ sal_uInt16 nWhich(aWhichIter.FirstWhich());
+ while( nWhich )
+ {
+ if( SfxItemState::SET == aWhichIter.GetItemState() )
+ pObject->ClearMergedItem( nWhich );
+ nWhich = aWhichIter.NextWhich();
+ }
+ }
+ else
+ pObject->SetMergedItemSet(rSet);
+
+ bOk = true;
+ }
+}
+
+/**
+ * Notify for change of site arrangement
+ */
+
+void DrawView::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
+{
+ if ( mpDrawViewShell && rHint.GetId() == SfxHintId::ThisIsAnSdrHint )
+ {
+ SdrHintKind eHintKind = static_cast<const SdrHint&>(rHint).GetKind();
+
+ if ( mnPOCHSmph == 0 && eHintKind == SdrHintKind::PageOrderChange )
+ {
+ mpDrawViewShell->ResetActualPage();
+ }
+ else if ( eHintKind == SdrHintKind::LayerChange || eHintKind == SdrHintKind::LayerOrderChange )
+ {
+ mpDrawViewShell->ResetActualLayer();
+ }
+
+ // switch to that page when it's not a master page
+ if(SdrHintKind::SwitchToPage == eHintKind)
+ {
+ // We switch page only in the current view, which triggered this event
+ // and keep other views untouched.
+ SfxViewShell* pViewShell = SfxViewShell::Current();
+ if(pViewShell && pViewShell != &mpDrawViewShell->GetViewShellBase())
+ return;
+
+ const SdrPage* pPage = static_cast<const SdrHint&>(rHint).GetPage();
+ if(pPage && !pPage->IsMasterPage())
+ {
+ if(mpDrawViewShell->GetActualPage() != pPage)
+ {
+ sal_uInt16 nPageNum = (pPage->GetPageNum() - 1) / 2; // Sdr --> Sd
+ mpDrawViewShell->SwitchPage(nPageNum);
+ }
+ }
+ }
+ }
+
+ ::sd::View::Notify(rBC, rHint);
+}
+
+/**
+ * Lock/Unlock PageOrderChangedHint
+ */
+
+void DrawView::BlockPageOrderChangedHint(bool bBlock)
+{
+ if (bBlock)
+ mnPOCHSmph++;
+ else
+ {
+ DBG_ASSERT(mnPOCHSmph, "counter overflow");
+ mnPOCHSmph--;
+ }
+}
+
+/**
+ * If presentation objects are selected, intercept stylesheet-positioning at
+ * masterpage.
+ */
+
+bool DrawView::SetStyleSheet(SfxStyleSheet* pStyleSheet, bool bDontRemoveHardAttr)
+{
+ bool bResult = true;
+
+ // is there a masterpage edit?
+ if (mpDrawViewShell && mpDrawViewShell->GetEditMode() == EditMode::MasterPage)
+ {
+ if (IsPresObjSelected(false))
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(mpDrawViewShell->GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ bResult = false;
+ }
+ else
+ {
+ bResult = ::sd::View::SetStyleSheet(pStyleSheet, bDontRemoveHardAttr);
+ }
+ }
+ else
+ {
+ bResult = ::sd::View::SetStyleSheet(pStyleSheet, bDontRemoveHardAttr);
+ }
+ return bResult;
+}
+
+/**
+ * Paint-method: Redirect event to the view
+ */
+
+void DrawView::CompleteRedraw(OutputDevice* pOutDev, const vcl::Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector /*=0*/)
+{
+ bool bStandardPaint = true;
+
+ SdDrawDocument* pDoc = mpDocShell->GetDoc();
+ if( pDoc && pDoc->GetDocumentType() == DocumentType::Impress)
+ {
+ rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( pDoc ) );
+ if(xSlideshow.is() && xSlideshow->isRunning())
+ {
+ OutputDevice* pShowWindow = xSlideshow->getShowWindow();
+ if( (pShowWindow == pOutDev) || (xSlideshow->getAnimationMode() == ANIMATIONMODE_PREVIEW) )
+ {
+ if( pShowWindow == pOutDev && mpViewSh )
+ xSlideshow->paint();
+ bStandardPaint = false;
+ }
+ }
+ }
+
+ if(bStandardPaint)
+ {
+ ::sd::View::CompleteRedraw(pOutDev, rReg, pRedirector);
+ }
+}
+
+/**
+ * Make passed region visible (scrolling if necessary)
+ */
+
+void DrawView::MakeVisible(const ::tools::Rectangle& rRect, vcl::Window& rWin)
+{
+ if (!rRect.IsEmpty() && mpDrawViewShell)
+ {
+ mpDrawViewShell->MakeVisible(rRect, rWin);
+ }
+}
+
+/**
+ * Hide page.
+ */
+
+void DrawView::HideSdrPage()
+{
+ if (mpDrawViewShell)
+ {
+ mpDrawViewShell->HidePage();
+ }
+
+ ::sd::View::HideSdrPage();
+}
+
+void DrawView::DeleteMarked()
+{
+ sd::UndoManager* pUndoManager = mrDoc.GetUndoManager();
+ DBG_ASSERT( pUndoManager, "sd::DrawView::DeleteMarked(), ui action without undo manager!?" );
+
+ if( pUndoManager )
+ {
+ OUString aUndo(SvxResId(STR_EditDelete));
+ aUndo = aUndo.replaceFirst("%1", GetDescriptionOfMarkedObjects());
+ ViewShellId nViewShellId = mpDrawViewShell ? mpDrawViewShell->GetViewShellBase().GetViewShellId() : ViewShellId(-1);
+ pUndoManager->EnterListAction(aUndo, aUndo, 0, nViewShellId);
+ }
+
+ SdPage* pPage = nullptr;
+ bool bResetLayout = false;
+
+ const size_t nMarkCount = GetMarkedObjectList().GetMarkCount();
+ if( nMarkCount )
+ {
+ SdrMarkList aList( GetMarkedObjectList() );
+ for (size_t nMark = 0; nMark < nMarkCount; ++nMark)
+ {
+ SdrObject* pObj = aList.GetMark(nMark)->GetMarkedSdrObj();
+ if( pObj && !pObj->IsEmptyPresObj() && pObj->GetUserCall() )
+ {
+ pPage = static_cast< SdPage* >( pObj->getSdrPageFromSdrObject() );
+ if (pPage)
+ {
+ PresObjKind ePresObjKind(pPage->GetPresObjKind(pObj));
+ switch( ePresObjKind )
+ {
+ case PresObjKind::NONE:
+ continue; // ignore it
+ case PresObjKind::Graphic:
+ case PresObjKind::Object:
+ case PresObjKind::Chart:
+ case PresObjKind::OrgChart:
+ case PresObjKind::Table:
+ case PresObjKind::Calc:
+ case PresObjKind::Media:
+ ePresObjKind = PresObjKind::Outline;
+ break;
+ default:
+ break;
+ }
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
+ bool bVertical = pTextObj && pTextObj->IsVerticalWriting();
+ ::tools::Rectangle aRect( pObj->GetLogicRect() );
+ SdrObject* pNewObj = pPage->InsertAutoLayoutShape( nullptr, ePresObjKind, bVertical, aRect, true );
+
+ // pUndoManager should not be NULL (see assert above)
+ // but since we have defensive code
+ // for it earlier and later in the function
+ // we might as well be consistent
+ if(pUndoManager)
+ {
+ // Move the new PresObj to the position before the
+ // object it will replace.
+ pUndoManager->AddUndoAction(
+ mrDoc.GetSdrUndoFactory().CreateUndoObjectOrdNum(
+ *pNewObj,
+ pNewObj->GetOrdNum(),
+ pObj->GetOrdNum()));
+ }
+ pPage->SetObjectOrdNum( pNewObj->GetOrdNum(), pObj->GetOrdNum() );
+
+ bResetLayout = true;
+ }
+ }
+ }
+ }
+
+ ::sd::View::DeleteMarked();
+
+ if( pPage && bResetLayout )
+ pPage->SetAutoLayout( pPage->GetAutoLayout() );
+
+ if( pUndoManager )
+ pUndoManager->LeaveListAction();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drbezob.cxx b/sd/source/ui/view/drbezob.cxx
new file mode 100644
index 000000000..c84489042
--- /dev/null
+++ b/sd/source/ui/view/drbezob.cxx
@@ -0,0 +1,320 @@
+/* -*- 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 <BezierObjectBar.hxx>
+#include <sfx2/msg.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/objface.hxx>
+
+#include <svx/svxids.hrc>
+#include <svl/eitem.hxx>
+#include <sfx2/request.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/svdundo.hxx>
+#include <sfx2/dispatch.hxx>
+
+#include <sdresid.hxx>
+
+
+#include <strings.hrc>
+
+#include <DrawDocShell.hxx>
+#include <ViewShell.hxx>
+#include <drawdoc.hxx>
+#include <fusel.hxx>
+#include <fuconbez.hxx>
+
+using namespace sd;
+#define ShellClass_BezierObjectBar
+#include <sdslots.hxx>
+
+namespace sd {
+
+/**
+ * Declare default interface (Slotmap must not be empty)
+ */
+SFX_IMPL_INTERFACE(BezierObjectBar, ::SfxShell)
+
+void BezierObjectBar::InitInterface_Impl()
+{
+}
+
+
+BezierObjectBar::BezierObjectBar(
+ ViewShell* pSdViewShell,
+ ::sd::View* pSdView)
+ : SfxShell(pSdViewShell->GetViewShell()),
+ mpView(pSdView),
+ mpViewSh(pSdViewShell)
+{
+ DrawDocShell* pDocShell = mpViewSh->GetDocSh();
+ SetPool(&pDocShell->GetPool());
+ SetUndoManager(pDocShell->GetUndoManager());
+ SetRepeatTarget(mpView);
+}
+
+BezierObjectBar::~BezierObjectBar()
+{
+ SetRepeatTarget(nullptr);
+}
+
+/**
+ * Status of attribute items.
+ */
+
+void BezierObjectBar::GetAttrState(SfxItemSet& rSet)
+{
+ SfxItemSet aAttrSet( mpView->GetDoc().GetPool() );
+ mpView->GetAttributes( aAttrSet );
+ rSet.Put(aAttrSet, false); // <- sal_False, so DontCare-Status gets acquired
+
+ rtl::Reference<FuPoor> xFunc( mpViewSh->GetCurrentFunction() );
+
+ if(xFunc.is())
+ {
+ if( auto pFuSelection = dynamic_cast< const FuSelection *>( xFunc.get() ))
+ {
+ sal_uInt16 nEditMode = pFuSelection->GetEditMode();
+ rSet.Put(SfxBoolItem(nEditMode, true));
+ }
+ else if( auto pFuPolygon = dynamic_cast< const FuConstructBezierPolygon *>( xFunc.get() ))
+ {
+ sal_uInt16 nEditMode = pFuPolygon->GetEditMode();
+ rSet.Put(SfxBoolItem(nEditMode, true));
+ }
+ }
+
+ if(!mpView->IsMoveAllowed() || !mpView->IsResizeAllowed())
+ {
+ // #i77187# if object is move and/or size protected, do not allow point editing at all
+ rSet.DisableItem(SID_BEZIER_MOVE);
+ rSet.DisableItem(SID_BEZIER_INSERT);
+
+ rSet.DisableItem(SID_BEZIER_DELETE);
+ rSet.DisableItem(SID_BEZIER_CUTLINE);
+ rSet.DisableItem(SID_BEZIER_CONVERT);
+
+ rSet.DisableItem(SID_BEZIER_EDGE);
+ rSet.DisableItem(SID_BEZIER_SMOOTH);
+ rSet.DisableItem(SID_BEZIER_SYMMTR);
+
+ rSet.DisableItem(SID_BEZIER_CLOSE);
+
+ rSet.DisableItem(SID_BEZIER_ELIMINATE_POINTS);
+ }
+ else
+ {
+ IPolyPolygonEditorController* pIPPEC = nullptr;
+ if( mpView->GetMarkedObjectList().GetMarkCount() )
+ pIPPEC = mpView;
+ else
+ pIPPEC = dynamic_cast< IPolyPolygonEditorController* >( mpView->getSmartTags().getSelected().get() );
+
+ if ( !pIPPEC || !pIPPEC->IsRipUpAtMarkedPointsPossible())
+ {
+ rSet.DisableItem(SID_BEZIER_CUTLINE);
+ }
+ if (!pIPPEC || !pIPPEC->IsDeleteMarkedPointsPossible())
+ {
+ rSet.DisableItem(SID_BEZIER_DELETE);
+ }
+ if (!pIPPEC || !pIPPEC->IsSetMarkedSegmentsKindPossible())
+ {
+ rSet.DisableItem(SID_BEZIER_CONVERT);
+ }
+ else
+ {
+ SdrPathSegmentKind eSegm = pIPPEC->GetMarkedSegmentsKind();
+ switch (eSegm)
+ {
+ case SdrPathSegmentKind::DontCare: rSet.InvalidateItem(SID_BEZIER_CONVERT); break;
+ case SdrPathSegmentKind::Line : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,false)); break; // Button down = curve
+ case SdrPathSegmentKind::Curve : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,true)); break;
+ default: break;
+ }
+ }
+ if (!pIPPEC || !pIPPEC->IsSetMarkedPointsSmoothPossible())
+ {
+ rSet.DisableItem(SID_BEZIER_EDGE);
+ rSet.DisableItem(SID_BEZIER_SMOOTH);
+ rSet.DisableItem(SID_BEZIER_SYMMTR);
+ }
+ else
+ {
+ SdrPathSmoothKind eSmooth = pIPPEC->GetMarkedPointsSmooth();
+ switch (eSmooth)
+ {
+ case SdrPathSmoothKind::DontCare : break;
+ case SdrPathSmoothKind::Angular : rSet.Put(SfxBoolItem(SID_BEZIER_EDGE, true)); break;
+ case SdrPathSmoothKind::Asymmetric: rSet.Put(SfxBoolItem(SID_BEZIER_SMOOTH,true)); break;
+ case SdrPathSmoothKind::Symmetric : rSet.Put(SfxBoolItem(SID_BEZIER_SYMMTR,true)); break;
+ }
+ }
+ if (!pIPPEC || !pIPPEC->IsOpenCloseMarkedObjectsPossible())
+ {
+ rSet.DisableItem(SID_BEZIER_CLOSE);
+ }
+ else
+ {
+ SdrObjClosedKind eClose = pIPPEC->GetMarkedObjectsClosedState();
+ switch (eClose)
+ {
+ case SdrObjClosedKind::DontCare: rSet.InvalidateItem(SID_BEZIER_CLOSE); break;
+ case SdrObjClosedKind::Open : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,false)); break;
+ case SdrObjClosedKind::Closed : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,true)); break;
+ default: break;
+ }
+ }
+
+ if(pIPPEC == mpView)
+ rSet.Put(SfxBoolItem(SID_BEZIER_ELIMINATE_POINTS, mpView->IsEliminatePolyPoints()));
+ else
+ rSet.DisableItem( SID_BEZIER_ELIMINATE_POINTS ); // only works for views
+ }
+}
+
+/**
+ * Process SfxRequests
+ */
+
+void BezierObjectBar::Execute(SfxRequest& rReq)
+{
+ sal_uInt16 nSId = rReq.GetSlot();
+
+ switch (nSId)
+ {
+ case SID_BEZIER_CUTLINE:
+ case SID_BEZIER_CONVERT:
+ case SID_BEZIER_DELETE:
+ case SID_BEZIER_EDGE:
+ case SID_BEZIER_SMOOTH:
+ case SID_BEZIER_SYMMTR:
+ case SID_BEZIER_CLOSE:
+ {
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+
+ IPolyPolygonEditorController* pIPPEC = nullptr;
+ if( rMarkList.GetMarkCount() )
+ pIPPEC = mpView;
+ else
+ pIPPEC = dynamic_cast< IPolyPolygonEditorController* >( mpView->getSmartTags().getSelected().get() );
+
+ if( pIPPEC && !mpView->IsAction())
+ {
+ switch (nSId)
+ {
+ case SID_BEZIER_DELETE:
+ pIPPEC->DeleteMarkedPoints();
+ break;
+
+ case SID_BEZIER_CUTLINE:
+ pIPPEC->RipUpAtMarkedPoints();
+ break;
+
+ case SID_BEZIER_CONVERT:
+ {
+ pIPPEC->SetMarkedSegmentsKind(SdrPathSegmentKind::Toggle);
+ break;
+ }
+
+ case SID_BEZIER_EDGE:
+ case SID_BEZIER_SMOOTH:
+ case SID_BEZIER_SYMMTR:
+ {
+ SdrPathSmoothKind eKind;
+
+ switch (nSId)
+ {
+ default:
+ case SID_BEZIER_EDGE: eKind = SdrPathSmoothKind::Angular; break;
+ case SID_BEZIER_SMOOTH: eKind = SdrPathSmoothKind::Asymmetric; break;
+ case SID_BEZIER_SYMMTR: eKind = SdrPathSmoothKind::Symmetric; break;
+ }
+
+ pIPPEC->SetMarkedPointsSmooth(eKind);
+ break;
+ }
+
+ case SID_BEZIER_CLOSE:
+ {
+ SdrPathObj* pPathObj = static_cast<SdrPathObj*>( rMarkList.GetMark(0)->GetMarkedSdrObj() );
+ const bool bUndo = mpView->IsUndoEnabled();
+ if( bUndo )
+ mpView->BegUndo(SdResId(STR_UNDO_BEZCLOSE));
+
+ mpView->UnmarkAllPoints();
+
+ if( bUndo )
+ mpView->AddUndo(mpView->GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pPathObj));
+
+ pPathObj->ToggleClosed();
+
+ if( bUndo )
+ mpView->EndUndo();
+ break;
+ }
+ }
+ }
+
+ if( (pIPPEC == mpView) && !mpView->AreObjectsMarked() )
+ mpViewSh->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+
+ rReq.Ignore();
+ }
+ break;
+
+ case SID_BEZIER_ELIMINATE_POINTS:
+ {
+ mpView->SetEliminatePolyPoints(!mpView->IsEliminatePolyPoints());
+ Invalidate(SID_BEZIER_ELIMINATE_POINTS);
+ rReq.Done();
+ }
+ break;
+
+ case SID_BEZIER_MOVE:
+ case SID_BEZIER_INSERT:
+ {
+ rtl::Reference<FuPoor> xFunc( mpViewSh->GetCurrentFunction() );
+
+ if(xFunc.is())
+ {
+ if( auto pFuSelection = dynamic_cast<FuSelection *>( xFunc.get() ))
+ {
+ pFuSelection->SetEditMode(rReq.GetSlot());
+ }
+ else if( auto pFuPolygon = dynamic_cast<FuConstructBezierPolygon *>( xFunc.get() ))
+ {
+ pFuPolygon->SetEditMode(rReq.GetSlot());
+ }
+ }
+
+ rReq.Ignore ();
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ Invalidate();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drtxtob.cxx b/sd/source/ui/view/drtxtob.cxx
new file mode 100644
index 000000000..b10af0828
--- /dev/null
+++ b/sd/source/ui/view/drtxtob.cxx
@@ -0,0 +1,625 @@
+/* -*- 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 <TextObjectBar.hxx>
+
+#include <svx/svxids.hrc>
+
+#include <com/sun/star/linguistic2/XThesaurus.hpp>
+
+#include <editeng/eeitem.hxx>
+#include <editeng/udlnitem.hxx>
+#include <editeng/ulspitem.hxx>
+#include <editeng/lspcitem.hxx>
+#include <editeng/adjustitem.hxx>
+#include <editeng/editview.hxx>
+#include <editeng/outliner.hxx>
+#include <editeng/unolingu.hxx>
+#include <editeng/kernitem.hxx>
+#include <svl/whiter.hxx>
+#include <svl/itempool.hxx>
+#include <svl/stritem.hxx>
+#include <svl/style.hxx>
+#include <svl/languageoptions.hxx>
+#include <svl/cjkoptions.hxx>
+#include <svl/ctloptions.hxx>
+#include <sfx2/tplpitem.hxx>
+#include <editeng/escapementitem.hxx>
+#include <svx/svdoutl.hxx>
+#include <editeng/scripttypeitem.hxx>
+#include <editeng/writingmodeitem.hxx>
+#include <editeng/frmdiritem.hxx>
+#include <editeng/fhgtitem.hxx>
+
+#include <sfx2/objface.hxx>
+
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <OutlineViewShell.hxx>
+#include <Window.hxx>
+#include <OutlineView.hxx>
+
+using namespace sd;
+using namespace ::com::sun::star;
+
+#define ShellClass_TextObjectBar
+#include <sdslots.hxx>
+
+namespace sd {
+
+/**
+ * Declare default interface (Slotmap must not be empty, therefore enter
+ * something that (hopefully) never occurs.
+ */
+SFX_IMPL_INTERFACE(TextObjectBar, SfxShell)
+
+void TextObjectBar::InitInterface_Impl()
+{
+}
+
+
+TextObjectBar::TextObjectBar (
+ ViewShell* pSdViewSh,
+ SfxItemPool& rItemPool,
+ ::sd::View* pSdView )
+ : SfxShell(pSdViewSh->GetViewShell()),
+ mpViewShell( pSdViewSh ),
+ mpView( pSdView )
+{
+ SetPool(&rItemPool);
+
+ if( mpView )
+ {
+ OutlineView* pOutlinerView = dynamic_cast< OutlineView* >( mpView );
+ if( pOutlinerView )
+ {
+ SetUndoManager(&pOutlinerView->GetOutliner().GetUndoManager());
+ }
+ else
+ {
+ DrawDocShell* pDocShell = mpView->GetDoc().GetDocSh();
+ if( pDocShell )
+ {
+ SetUndoManager(pDocShell->GetUndoManager());
+ DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >( pSdViewSh );
+ if ( pDrawViewShell )
+ SetRepeatTarget(pSdView);
+ }
+ }
+ }
+
+ SetName( "TextObjectBar");
+
+ // SetHelpId( SD_IF_SDDRAWTEXTOBJECTBAR );
+}
+
+TextObjectBar::~TextObjectBar()
+{
+ SetRepeatTarget(nullptr);
+}
+
+void TextObjectBar::GetCharState( SfxItemSet& rSet )
+{
+ SfxItemSet aCharAttrSet( mpView->GetDoc().GetPool() );
+ mpView->GetAttributes( aCharAttrSet );
+
+ SfxItemSetFixed<EE_ITEMS_START,EE_ITEMS_END> aNewAttr( mpViewShell->GetPool() );
+
+ aNewAttr.Put(aCharAttrSet, false);
+ rSet.Put(aNewAttr, false);
+
+ SvxKerningItem aKern = aCharAttrSet.Get( EE_CHAR_KERNING );
+ //aKern.SetWhich(SID_ATTR_CHAR_KERNING);
+ rSet.Put(aKern);
+
+ SfxItemState eState = aCharAttrSet.GetItemState( EE_CHAR_KERNING );
+ if ( eState == SfxItemState::DONTCARE )
+ {
+ rSet.InvalidateItem(EE_CHAR_KERNING);
+ }
+}
+
+/**
+ * Status of attribute items.
+ */
+void TextObjectBar::GetAttrState( SfxItemSet& rSet )
+{
+ SfxWhichIter aIter( rSet );
+ sal_uInt16 nWhich = aIter.FirstWhich();
+ SfxItemSet aAttrSet( mpView->GetDoc().GetPool() );
+ bool bDisableParagraphTextDirection = !SvtCTLOptions().IsCTLFontEnabled();
+ bool bDisableVerticalText = !SvtCJKOptions::IsVerticalTextEnabled();
+
+ mpView->GetAttributes( aAttrSet );
+
+ while ( nWhich )
+ {
+ sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich)
+ ? GetPool().GetSlotId(nWhich)
+ : nWhich;
+
+ switch ( nSlotId )
+ {
+ case SID_ATTR_CHAR_FONT:
+ case SID_ATTR_CHAR_FONTHEIGHT:
+ case SID_ATTR_CHAR_WEIGHT:
+ case SID_ATTR_CHAR_POSTURE:
+ case SID_ATTR_CHAR_SHADOWED:
+ case SID_ATTR_CHAR_STRIKEOUT:
+ case SID_ATTR_CHAR_CASEMAP:
+ {
+ sal_uInt16 stretchX = 100;
+ SvxScriptSetItem aSetItem( nSlotId, GetPool() );
+ aSetItem.GetItemSet().Put( aAttrSet, false );
+
+ SvtScriptType nScriptType = mpView->GetScriptType();
+
+ if( (nSlotId == SID_ATTR_CHAR_FONT) || (nSlotId == SID_ATTR_CHAR_FONTHEIGHT) )
+ {
+ // input language should be preferred over
+ // current cursor position to detect script type
+ OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
+ SdrOutliner *pOutliner = mpView->GetTextEditOutliner();
+
+ assert(mpViewShell);
+
+ if (OutlineView* pOView = dynamic_cast<OutlineView*>(mpView))
+ pOLV = pOView->GetViewByWindow(mpViewShell->GetActiveWindow());
+
+ sal_uInt16 stretchY = 100;
+ if( pOutliner )
+ pOutliner->GetGlobalCharStretching( stretchX, stretchY );
+
+ if(pOLV && !pOLV->GetSelection().HasRange())
+ {
+ if (mpViewShell->GetViewShell() && mpViewShell->GetViewShell()->GetWindow())
+ {
+ LanguageType nInputLang = mpViewShell->GetViewShell()->GetWindow()->GetInputLanguage();
+ if(nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM)
+ nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang );
+ }
+ }
+ }
+
+ const SfxPoolItem* pI = aSetItem.GetItemOfScript( nScriptType );
+ if( pI )
+ {
+ if( nSlotId == SID_ATTR_CHAR_FONTHEIGHT )
+ {
+ SvxFontHeightItem aFontItem = dynamic_cast<const SvxFontHeightItem&>(*pI);
+ aFontItem.SetHeight(aFontItem.GetHeight(), stretchX, aFontItem.GetPropUnit());
+ aFontItem.SetWhich(nWhich);
+ aAttrSet.Put( aFontItem );
+ }
+ else
+ {
+ aAttrSet.Put( pI->CloneSetWhich(nWhich) );
+ }
+ }
+ else
+ {
+ aAttrSet.InvalidateItem( nWhich );
+ }
+ }
+ break;
+
+ case SID_STYLE_APPLY:
+ case SID_STYLE_FAMILY2:
+ {
+ SfxStyleSheet* pStyleSheet = mpView->GetStyleSheetFromMarked();
+ if( pStyleSheet )
+ rSet.Put( SfxTemplateItem( nWhich, pStyleSheet->GetName() ) );
+ else
+ {
+ rSet.Put( SfxTemplateItem( nWhich, OUString() ) );
+ }
+ }
+ break;
+
+ case SID_OUTLINE_LEFT:
+ case SID_OUTLINE_RIGHT:
+ case SID_OUTLINE_UP:
+ case SID_OUTLINE_DOWN:
+ {
+ bool bDisableLeft = true;
+ bool bDisableRight = true;
+ bool bDisableUp = true;
+ bool bDisableDown = true;
+
+ //fdo#78151 it doesn't make sense to promote or demote outline levels in master view.
+ const DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >(mpViewShell);
+ const bool bInMasterView = pDrawViewShell && pDrawViewShell->GetEditMode() == EditMode::MasterPage;
+
+ if (!bInMasterView)
+ {
+ OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
+
+ if (OutlineView* pOView = dynamic_cast<OutlineView*>(mpView))
+ pOLV = pOView->GetViewByWindow(mpViewShell->GetActiveWindow());
+
+ bool bOutlineViewSh = dynamic_cast< const OutlineViewShell *>( mpViewShell ) != nullptr;
+
+ if (pOLV)
+ {
+ // Outliner at outline-mode
+ ::Outliner* pOutl = pOLV->GetOutliner();
+
+ std::vector<Paragraph*> aSelList;
+ pOLV->CreateSelectionList(aSelList);
+ Paragraph* pPara = aSelList.empty() ? nullptr : *(aSelList.begin());
+
+ // find out if we are an OutlineView
+ bool bIsOutlineView(OutlinerMode::OutlineView == pOLV->GetOutliner()->GetOutlinerMode());
+
+ // This is ONLY for OutlineViews
+ if(bIsOutlineView)
+ {
+ // allow move up if position is 2 or greater OR it
+ // is a title object (and thus depth==1)
+ if(pOutl->GetAbsPos(pPara) > 1 || ( ::Outliner::HasParaFlag(pPara,ParaFlag::ISPAGE) && pOutl->GetAbsPos(pPara) > 0 ) )
+ {
+ // not at top
+ bDisableUp = false;
+ }
+ }
+ else
+ {
+ // old behaviour for OutlinerMode::OutlineObject
+ if(pOutl->GetAbsPos(pPara) > 0)
+ {
+ // not at top
+ bDisableUp = false;
+ }
+ }
+
+ for (const auto& rpItem : aSelList)
+ {
+ pPara = rpItem;
+
+ sal_Int16 nDepth = pOutl->GetDepth( pOutl->GetAbsPos( pPara ) );
+
+ if (nDepth > 0 || (bOutlineViewSh && (nDepth <= 0) && !::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE )) )
+ {
+ // not minimum depth
+ bDisableLeft = false;
+ }
+
+ if( (nDepth < pOLV->GetOutliner()->GetMaxDepth() && ( !bOutlineViewSh || pOutl->GetAbsPos(pPara) != 0 )) ||
+ (bOutlineViewSh && (nDepth <= 0) && ::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) && pOutl->GetAbsPos(pPara) != 0) )
+ {
+ // not maximum depth and not at top
+ bDisableRight = false;
+ }
+ }
+
+ if ( ( pOutl->GetAbsPos(pPara) < pOutl->GetParagraphCount() - 1 ) &&
+ ( pOutl->GetParagraphCount() > 1 || !bOutlineViewSh) )
+ {
+ // not last paragraph
+ bDisableDown = false;
+ }
+
+ // disable when first para and 2nd is not a title
+ pPara = aSelList.empty() ? nullptr : *(aSelList.begin());
+
+ if(!bDisableDown && bIsOutlineView
+ && pPara
+ && 0 == pOutl->GetAbsPos(pPara)
+ && pOutl->GetParagraphCount() > 1
+ && !::Outliner::HasParaFlag( pOutl->GetParagraph(1), ParaFlag::ISPAGE ) )
+ {
+ // Needs to be disabled
+ bDisableDown = true;
+ }
+ }
+ }
+
+ if (bDisableLeft)
+ rSet.DisableItem(SID_OUTLINE_LEFT);
+ if (bDisableRight)
+ rSet.DisableItem(SID_OUTLINE_RIGHT);
+ if (bDisableUp)
+ rSet.DisableItem(SID_OUTLINE_UP);
+ if (bDisableDown)
+ rSet.DisableItem(SID_OUTLINE_DOWN);
+ }
+ break;
+
+ case SID_TEXTDIRECTION_LEFT_TO_RIGHT:
+ case SID_TEXTDIRECTION_TOP_TO_BOTTOM:
+ {
+ if ( bDisableVerticalText )
+ {
+ rSet.DisableItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT );
+ rSet.DisableItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM );
+ }
+ else
+ {
+ bool bLeftToRight = true;
+
+ SdrOutliner* pOutl = mpView->GetTextEditOutliner();
+ if( pOutl )
+ {
+ if( pOutl->IsVertical() )
+ bLeftToRight = false;
+ }
+ else
+ bLeftToRight = aAttrSet.Get( SDRATTR_TEXTDIRECTION ).GetValue() == css::text::WritingMode_LR_TB;
+
+ rSet.Put( SfxBoolItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT, bLeftToRight ) );
+ rSet.Put( SfxBoolItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM, !bLeftToRight ) );
+
+ if( !bLeftToRight )
+ bDisableParagraphTextDirection = true;
+ }
+ }
+ break;
+
+ case SID_ULINE_VAL_NONE:
+ case SID_ULINE_VAL_SINGLE:
+ case SID_ULINE_VAL_DOUBLE:
+ case SID_ULINE_VAL_DOTTED:
+ {
+ if( aAttrSet.GetItemState( EE_CHAR_UNDERLINE ) >= SfxItemState::DEFAULT )
+ {
+ FontLineStyle eLineStyle = aAttrSet.Get(EE_CHAR_UNDERLINE).GetLineStyle();
+
+ switch (nSlotId)
+ {
+ case SID_ULINE_VAL_NONE:
+ rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_NONE));
+ break;
+ case SID_ULINE_VAL_SINGLE:
+ rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_SINGLE));
+ break;
+ case SID_ULINE_VAL_DOUBLE:
+ rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_DOUBLE));
+ break;
+ case SID_ULINE_VAL_DOTTED:
+ rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_DOTTED));
+ break;
+ }
+ }
+ }
+ break;
+
+ case SID_GROW_FONT_SIZE:
+ case SID_SHRINK_FONT_SIZE:
+ {
+ // todo
+ }
+ break;
+
+ case SID_THES:
+ {
+ if (mpView->GetTextEditOutlinerView())
+ {
+ EditView & rEditView = mpView->GetTextEditOutlinerView()->GetEditView();
+ OUString aStatusVal;
+ LanguageType nLang = LANGUAGE_NONE;
+ bool bIsLookUpWord = GetStatusValueForThesaurusFromContext( aStatusVal, nLang, rEditView );
+ rSet.Put( SfxStringItem( SID_THES, aStatusVal ) );
+
+ // disable "Thesaurus" context menu entry if there is nothing to look up
+ uno::Reference< linguistic2::XThesaurus > xThes( LinguMgr::GetThesaurus() );
+ if (!bIsLookUpWord ||
+ !xThes.is() || nLang == LANGUAGE_NONE || !xThes->hasLocale( LanguageTag( nLang). getLocale() ))
+ rSet.DisableItem( SID_THES );
+ }
+ else
+ {
+ rSet.DisableItem( SID_THES );
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ nWhich = aIter.NextWhich();
+ }
+
+ rSet.Put( aAttrSet, false ); // <- sal_False, so DontCare-Status gets acquired
+
+ // these are disabled in outline-mode
+ if (!mpViewShell || dynamic_cast< const DrawViewShell *>( mpViewShell ) == nullptr)
+ {
+ rSet.DisableItem( SID_ATTR_PARA_ADJUST_LEFT );
+ rSet.DisableItem( SID_ATTR_PARA_ADJUST_RIGHT );
+ rSet.DisableItem( SID_ATTR_PARA_ADJUST_CENTER );
+ rSet.DisableItem( SID_ATTR_PARA_ADJUST_BLOCK );
+ rSet.DisableItem( SID_ATTR_PARA_LINESPACE_10 );
+ rSet.DisableItem( SID_ATTR_PARA_LINESPACE_15 );
+ rSet.DisableItem( SID_ATTR_PARA_LINESPACE_20 );
+ rSet.DisableItem( SID_DEC_INDENT );
+ rSet.DisableItem( SID_INC_INDENT );
+ rSet.DisableItem( SID_PARASPACE_INCREASE );
+ rSet.DisableItem( SID_PARASPACE_DECREASE );
+ rSet.DisableItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM );
+ rSet.DisableItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT );
+ rSet.DisableItem( SID_ATTR_PARA_LEFT_TO_RIGHT );
+ rSet.DisableItem( SID_ATTR_PARA_RIGHT_TO_LEFT );
+ }
+ else
+ {
+ // paragraph spacing
+ OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
+ if( pOLV )
+ {
+ ESelection aSel = pOLV->GetSelection();
+ aSel.Adjust();
+ sal_Int32 nStartPara = aSel.nStartPara;
+ sal_Int32 nEndPara = aSel.nEndPara;
+ if( !aSel.HasRange() )
+ {
+ nStartPara = 0;
+ nEndPara = pOLV->GetOutliner()->GetParagraphCount() - 1;
+ }
+ ::tools::Long nUpper = 0;
+
+ for( sal_Int32 nPara = nStartPara; nPara <= nEndPara; nPara++ )
+ {
+ const SfxItemSet& rItems = pOLV->GetOutliner()->GetParaAttribs( nPara );
+ const SvxULSpaceItem& rItem = rItems.Get( EE_PARA_ULSPACE );
+ nUpper = std::max( nUpper, static_cast<::tools::Long>(rItem.GetUpper()) );
+ }
+ if( nUpper == 0 )
+ rSet.DisableItem( SID_PARASPACE_DECREASE );
+ }
+ else
+ {
+ // never disabled at the moment!
+ //rSet.DisableItem( SID_PARASPACE_INCREASE );
+ //rSet.DisableItem( SID_PARASPACE_DECREASE );
+ }
+
+ // paragraph justification
+ const SvxLRSpaceItem& aLR = aAttrSet.Get( EE_PARA_LRSPACE );
+ rSet.Put(aLR);
+ SvxAdjust eAdj = aAttrSet.Get( EE_PARA_JUST ).GetAdjust();
+ switch( eAdj )
+ {
+ case SvxAdjust::Left:
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_LEFT, true ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_CENTER, false ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, false ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, false ) );
+ break;
+ case SvxAdjust::Center:
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_CENTER, true ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_LEFT, false ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, false ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, false ) );
+ break;
+ case SvxAdjust::Right:
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, true ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_CENTER, false ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_LEFT, false ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, false ) );
+ break;
+ case SvxAdjust::Block:
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, true ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_CENTER, false ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, false ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_LEFT, false ) );
+ break;
+ default:
+ break;
+ }
+
+ Invalidate(SID_ATTR_PARA_ADJUST_LEFT);
+ Invalidate(SID_ATTR_PARA_ADJUST_CENTER);
+ Invalidate(SID_ATTR_PARA_ADJUST_RIGHT);
+ Invalidate(SID_ATTR_PARA_ADJUST_BLOCK);
+ Invalidate(SID_ATTR_PARA_LINESPACE);
+ Invalidate(SID_ATTR_PARA_ULSPACE);
+
+ // paragraph text direction
+ if( bDisableParagraphTextDirection )
+ {
+ rSet.DisableItem( SID_ATTR_PARA_LEFT_TO_RIGHT );
+ rSet.DisableItem( SID_ATTR_PARA_RIGHT_TO_LEFT );
+ }
+ else
+ {
+ switch( aAttrSet.Get( EE_PARA_WRITINGDIR ).GetValue() )
+ {
+ case SvxFrameDirection::Vertical_LR_TB:
+ case SvxFrameDirection::Vertical_RL_TB:
+ {
+ rSet.DisableItem( SID_ATTR_PARA_LEFT_TO_RIGHT );
+ rSet.DisableItem( SID_ATTR_PARA_RIGHT_TO_LEFT );
+ }
+ break;
+
+ case SvxFrameDirection::Horizontal_LR_TB:
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_LEFT_TO_RIGHT, true ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_RIGHT_TO_LEFT, false ) );
+ break;
+
+ case SvxFrameDirection::Horizontal_RL_TB:
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_LEFT_TO_RIGHT, false ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_RIGHT_TO_LEFT, true ) );
+ break;
+
+ // The case for the superordinate object is missing.
+ case SvxFrameDirection::Environment:
+ {
+ SdDrawDocument& rDoc = mpView->GetDoc();
+ css::text::WritingMode eMode = rDoc.GetDefaultWritingMode();
+ bool bIsLeftToRight(false);
+
+ if(css::text::WritingMode_LR_TB == eMode
+ || css::text::WritingMode_TB_RL == eMode)
+ {
+ bIsLeftToRight = true;
+ }
+
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_LEFT_TO_RIGHT, bIsLeftToRight ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_RIGHT_TO_LEFT, !bIsLeftToRight ) );
+ }
+ break;
+ default: break;
+ }
+ }
+
+ SvxLRSpaceItem aLRSpace = aAttrSet.Get( EE_PARA_LRSPACE );
+ aLRSpace.SetWhich(SID_ATTR_PARA_LRSPACE);
+ rSet.Put(aLRSpace);
+ Invalidate(SID_ATTR_PARA_LRSPACE);
+
+ //Added by xuxu
+ SfxItemState eState = aAttrSet.GetItemState( EE_PARA_LRSPACE );
+ if ( eState == SfxItemState::DONTCARE )
+ {
+ rSet.InvalidateItem(EE_PARA_LRSPACE);
+ rSet.InvalidateItem(SID_ATTR_PARA_LRSPACE);
+ }
+ sal_uInt16 nLineSpace = aAttrSet.Get( EE_PARA_SBL ).GetPropLineSpace();
+ switch( nLineSpace )
+ {
+ case 100:
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_10, true ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_15, false ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_20, false ) );
+ break;
+ case 150:
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_15, true ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_10, false ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_20, false ) );
+ break;
+ case 200:
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_20, true ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_10, false ) );
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_15, false ) );
+ break;
+ }
+ }
+
+ // justification (superscript, subscript) is also needed in outline-mode
+ SvxEscapement eEsc = static_cast<SvxEscapement>(aAttrSet.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue());
+ rSet.Put(SfxBoolItem(SID_SET_SUPER_SCRIPT, eEsc == SvxEscapement::Superscript));
+ rSet.Put(SfxBoolItem(SID_SET_SUB_SCRIPT, eEsc == SvxEscapement::Subscript));
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drtxtob1.cxx b/sd/source/ui/view/drtxtob1.cxx
new file mode 100644
index 000000000..86b7a698a
--- /dev/null
+++ b/sd/source/ui/view/drtxtob1.cxx
@@ -0,0 +1,865 @@
+/* -*- 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 <TextObjectBar.hxx>
+
+#include <svx/svxids.hrc>
+
+#include <editeng/eeitem.hxx>
+#include <editeng/editview.hxx>
+#include <editeng/outliner.hxx>
+#include <editeng/ulspitem.hxx>
+#include <editeng/lspcitem.hxx>
+#include <editeng/adjustitem.hxx>
+#include <editeng/numitem.hxx>
+#include <svl/itempool.hxx>
+#include <svl/stritem.hxx>
+#include <svl/style.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/dispatch.hxx>
+#include <editeng/escapementitem.hxx>
+#include <editeng/wghtitem.hxx>
+#include <editeng/postitem.hxx>
+#include <editeng/udlnitem.hxx>
+#include <editeng/crossedoutitem.hxx>
+#include <editeng/contouritem.hxx>
+#include <editeng/shdditem.hxx>
+#include <svx/svdpagv.hxx>
+#include <editeng/flstitem.hxx>
+#include <editeng/scripttypeitem.hxx>
+#include <editeng/writingmodeitem.hxx>
+#include <editeng/frmdiritem.hxx>
+#include <editeng/cmapitem.hxx>
+
+#include <app.hrc>
+#include <strings.hrc>
+#include <sdresid.hxx>
+#include <prlayout.hxx>
+#include <ViewShell.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <stlpool.hxx>
+#include <stlsheet.hxx>
+#include <OutlineView.hxx>
+#include <Window.hxx>
+#include <futempl.hxx>
+#include <DrawDocShell.hxx>
+#include <futext.hxx>
+#include <editeng/colritem.hxx>
+
+#include <memory>
+
+namespace
+{
+ void lcl_convertStringArguments(sal_uInt16 nSlot, const std::unique_ptr<SfxItemSet>& pArgs)
+ {
+ Color aColor;
+ OUString sColor;
+ const SfxPoolItem* pColorStringItem = nullptr;
+
+ if (SfxItemState::SET != pArgs->GetItemState(SID_ATTR_COLOR_STR, false, &pColorStringItem))
+ return;
+
+ sColor = static_cast<const SfxStringItem*>(pColorStringItem)->GetValue();
+
+ if (sColor == "transparent")
+ aColor = COL_TRANSPARENT;
+ else
+ aColor = Color(ColorTransparency, sColor.toInt32(16));
+
+ switch (nSlot)
+ {
+ case SID_ATTR_CHAR_COLOR:
+ {
+ SvxColorItem aColorItem(aColor, EE_CHAR_COLOR);
+ pArgs->Put(aColorItem);
+ break;
+ }
+
+ case SID_ATTR_CHAR_BACK_COLOR:
+ {
+ SvxColorItem pBackgroundItem(aColor, EE_CHAR_BKGCOLOR);
+ pArgs->Put(pBackgroundItem);
+ break;
+ }
+ }
+ }
+}
+
+namespace sd {
+
+/**
+ * Process SfxRequests
+ */
+
+void TextObjectBar::Execute( SfxRequest &rReq )
+{
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ sal_uInt16 nSlot = rReq.GetSlot();
+ OutlinerView* pOLV = mpView->GetTextEditOutlinerView();
+
+ std::unique_ptr<OutlineViewModelChangeGuard, o3tl::default_delete<OutlineViewModelChangeGuard>> aGuard;
+
+ assert(mpViewShell);
+
+ if (OutlineView* pOView = dynamic_cast<OutlineView*>(mpView))
+ {
+ pOLV = pOView->GetViewByWindow(mpViewShell->GetActiveWindow());
+ aGuard.reset( new OutlineViewModelChangeGuard( static_cast<OutlineView&>(*mpView) ) );
+ }
+
+ switch (nSlot)
+ {
+ case SID_STYLE_APPLY:
+ {
+ if( pArgs )
+ {
+ SdDrawDocument& rDoc = mpView->GetDoc();
+ assert(mpViewShell->GetViewShell());
+ rtl::Reference<FuPoor> xFunc( FuTemplate::Create( mpViewShell, static_cast< ::sd::Window*>( mpViewShell->GetViewShell()->GetWindow()), mpView, &rDoc, rReq ) );
+
+ if(xFunc.is())
+ {
+ xFunc->Activate();
+ xFunc->Deactivate();
+
+ if( rReq.GetSlot() == SID_STYLE_APPLY )
+ {
+ if (mpViewShell->GetViewFrame())
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_APPLY );
+ }
+ }
+ }
+ else
+ {
+ if (mpViewShell->GetViewFrame())
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_STYLE_DESIGNER, SfxCallMode::ASYNCHRON );
+ }
+
+ rReq.Done();
+ }
+ break;
+
+ case SID_INC_INDENT:
+ case SID_DEC_INDENT:
+ {
+ if( pOLV )
+ {
+ ESelection aSel = pOLV->GetSelection();
+ aSel.Adjust();
+ sal_Int32 nStartPara = aSel.nStartPara;
+ sal_Int32 nEndPara = aSel.nEndPara;
+ if( !aSel.HasRange() )
+ {
+ nStartPara = 0;
+ nEndPara = pOLV->GetOutliner()->GetParagraphCount() - 1;
+ }
+
+ pOLV->GetOutliner()->UndoActionStart( OLUNDO_ATTR );
+ for( sal_Int32 nPara = nStartPara; nPara <= nEndPara; nPara++ )
+ {
+ SfxStyleSheet* pStyleSheet = nullptr;
+ if (pOLV->GetOutliner() != nullptr)
+ pStyleSheet = pOLV->GetOutliner()->GetStyleSheet(nPara);
+ if (pStyleSheet != nullptr)
+ {
+ SfxItemSet aAttr( pStyleSheet->GetItemSet() );
+ SfxItemSet aTmpSet( pOLV->GetOutliner()->GetParaAttribs( nPara ) );
+ aAttr.Put( aTmpSet, false );
+ const SvxLRSpaceItem& rItem = aAttr.Get( EE_PARA_LRSPACE );
+ std::unique_ptr<SvxLRSpaceItem> pNewItem(rItem.Clone());
+
+ ::tools::Long nLeft = pNewItem->GetLeft();
+ if( nSlot == SID_INC_INDENT )
+ nLeft += 1000;
+ else
+ {
+ nLeft -= 1000;
+ nLeft = std::max<::tools::Long>( nLeft, 0 );
+ }
+ pNewItem->SetLeftValue( static_cast<sal_uInt16>(nLeft) );
+
+ SfxItemSet aNewAttrs( aAttr );
+ aNewAttrs.Put( std::move(pNewItem) );
+ pOLV->GetOutliner()->SetParaAttribs( nPara, aNewAttrs );
+ }
+ }
+ pOLV->GetOutliner()->UndoActionEnd();
+ mpViewShell->Invalidate( SID_UNDO );
+ }
+ rReq.Done();
+
+ Invalidate();
+ // to refresh preview (in outline mode), slot has to be invalidated:
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true );
+
+ }
+ break;
+
+ case SID_PARASPACE_INCREASE:
+ case SID_PARASPACE_DECREASE:
+ {
+ if( pOLV )
+ {
+ ESelection aSel = pOLV->GetSelection();
+ aSel.Adjust();
+ sal_Int32 nStartPara = aSel.nStartPara;
+ sal_Int32 nEndPara = aSel.nEndPara;
+ if( !aSel.HasRange() )
+ {
+ nStartPara = 0;
+ nEndPara = pOLV->GetOutliner()->GetParagraphCount() - 1;
+ }
+
+ pOLV->GetOutliner()->UndoActionStart( OLUNDO_ATTR );
+ for( sal_Int32 nPara = nStartPara; nPara <= nEndPara; nPara++ )
+ {
+ SfxStyleSheet* pStyleSheet = nullptr;
+ if (pOLV->GetOutliner() != nullptr)
+ pStyleSheet = pOLV->GetOutliner()->GetStyleSheet(nPara);
+ if (pStyleSheet != nullptr)
+ {
+ SfxItemSet aAttr( pStyleSheet->GetItemSet() );
+ SfxItemSet aTmpSet( pOLV->GetOutliner()->GetParaAttribs( nPara ) );
+ aAttr.Put( aTmpSet, false ); // sal_False= InvalidItems is not default, handle it as "holes"
+ const SvxULSpaceItem& rItem = aAttr.Get( EE_PARA_ULSPACE );
+ std::unique_ptr<SvxULSpaceItem> pNewItem(rItem.Clone());
+
+ ::tools::Long nUpper = pNewItem->GetUpper();
+ if( nSlot == SID_PARASPACE_INCREASE )
+ nUpper += 100;
+ else
+ {
+ nUpper -= 100;
+ nUpper = std::max<::tools::Long>( nUpper, 0 );
+ }
+ pNewItem->SetUpper( static_cast<sal_uInt16>(nUpper) );
+
+ ::tools::Long nLower = pNewItem->GetLower();
+ if( nSlot == SID_PARASPACE_INCREASE )
+ nLower += 100;
+ else
+ {
+ nLower -= 100;
+ nLower = std::max<::tools::Long>( nLower, 0 );
+ }
+ pNewItem->SetLower( static_cast<sal_uInt16>(nLower) );
+
+ SfxItemSet aNewAttrs( aAttr );
+ aNewAttrs.Put( std::move(pNewItem) );
+ pOLV->GetOutliner()->SetParaAttribs( nPara, aNewAttrs );
+ }
+ }
+ pOLV->GetOutliner()->UndoActionEnd();
+ mpViewShell->Invalidate( SID_UNDO );
+ }
+ else
+ {
+ // the following code could be enabled, if I get a correct
+ // DontCare status from JOE.
+
+ // gets enabled, through it doesn't really work (see above)
+ SfxItemSet aEditAttr( mpView->GetDoc().GetPool() );
+ mpView->GetAttributes( aEditAttr );
+ if( aEditAttr.GetItemState( EE_PARA_ULSPACE ) >= SfxItemState::DEFAULT )
+ {
+ SfxItemSet aNewAttrs(*(aEditAttr.GetPool()), aEditAttr.GetRanges());
+ const SvxULSpaceItem& rItem = aEditAttr.Get( EE_PARA_ULSPACE );
+ std::unique_ptr<SvxULSpaceItem> pNewItem(rItem.Clone());
+ ::tools::Long nUpper = pNewItem->GetUpper();
+
+ if( nSlot == SID_PARASPACE_INCREASE )
+ nUpper += 100;
+ else
+ {
+ nUpper -= 100;
+ nUpper = std::max<::tools::Long>( nUpper, 0 );
+ }
+ pNewItem->SetUpper( static_cast<sal_uInt16>(nUpper) );
+
+ ::tools::Long nLower = pNewItem->GetLower();
+ if( nSlot == SID_PARASPACE_INCREASE )
+ nLower += 100;
+ else
+ {
+ nLower -= 100;
+ nLower = std::max<::tools::Long>( nLower, 0 );
+ }
+ pNewItem->SetLower( static_cast<sal_uInt16>(nLower) );
+
+ aNewAttrs.Put( std::move(pNewItem) );
+
+ mpView->SetAttributes( aNewAttrs );
+ }
+ }
+ rReq.Done();
+
+ Invalidate();
+ // to refresh preview (in outline mode), slot has to be invalidated:
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true );
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_PARA_ULSPACE, true );
+ }
+ break;
+
+ case SID_OUTLINE_LEFT:
+ {
+ if (pOLV)
+ {
+ pOLV->AdjustDepth( -1 );
+
+ // Ensure bold/italic etc. icon state updates
+ Invalidate();
+ // trigger preview refresh
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true );
+ }
+ rReq.Done();
+ }
+ break;
+
+ case SID_OUTLINE_RIGHT:
+ {
+ if (pOLV)
+ {
+ pOLV->AdjustDepth( 1 );
+
+ // Ensure bold/italic etc. icon state updates
+ Invalidate();
+ // trigger preview refresh
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true );
+ }
+ rReq.Done();
+ }
+ break;
+
+ case SID_ATTR_PARA_LRSPACE:
+ {
+ SvxLRSpaceItem aLRSpace = static_cast<const SvxLRSpaceItem&>(pArgs->Get(
+ SID_ATTR_PARA_LRSPACE));
+
+ SfxItemSetFixed<EE_PARA_LRSPACE, EE_PARA_LRSPACE> aEditAttr( GetPool() );
+ aLRSpace.SetWhich( EE_PARA_LRSPACE );
+
+ aEditAttr.Put( aLRSpace );
+ mpView->SetAttributes( aEditAttr );
+
+ Invalidate(SID_ATTR_PARA_LRSPACE);
+ }
+ break;
+
+ case SID_HANGING_INDENT:
+ {
+ SfxItemSetFixed<EE_PARA_LRSPACE, EE_PARA_LRSPACE> aLRSpaceSet( GetPool() );
+ mpView->GetAttributes( aLRSpaceSet );
+ SvxLRSpaceItem aParaMargin( aLRSpaceSet.Get( EE_PARA_LRSPACE ) );
+
+ SvxLRSpaceItem aNewMargin( EE_PARA_LRSPACE );
+ aNewMargin.SetTextLeft( aParaMargin.GetTextLeft() + aParaMargin.GetTextFirstLineOffset() );
+ aNewMargin.SetRight( aParaMargin.GetRight() );
+ aNewMargin.SetTextFirstLineOffset( ( aParaMargin.GetTextFirstLineOffset() ) * -1 );
+ aLRSpaceSet.Put( aNewMargin );
+ mpView->SetAttributes( aLRSpaceSet );
+
+ Invalidate(SID_ATTR_PARA_LRSPACE);
+ }
+ break;
+
+ case SID_OUTLINE_UP:
+ {
+ if (pOLV)
+ {
+ pOLV->AdjustHeight( -1 );
+
+ // trigger preview refresh
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true );
+ }
+ rReq.Done();
+ }
+ break;
+
+ case SID_OUTLINE_DOWN:
+ {
+ if (pOLV)
+ {
+ pOLV->AdjustHeight( 1 );
+
+ // trigger preview refresh
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true );
+ }
+ rReq.Done();
+ }
+ break;
+
+ case SID_TEXTDIRECTION_LEFT_TO_RIGHT:
+ case SID_TEXTDIRECTION_TOP_TO_BOTTOM:
+ {
+ mpView->SdrEndTextEdit();
+ // tdf#131571: SdrEndTextEdit invalidates pTextEditOutlinerView, the pointer retrieved for pOLV
+ // so reinitialize pOLV
+ pOLV=mpView->GetTextEditOutlinerView();
+ SfxItemSetFixed<SDRATTR_TEXTDIRECTION, SDRATTR_TEXTDIRECTION> aAttr( mpView->GetDoc().GetPool() );
+ aAttr.Put( SvxWritingModeItem(
+ nSlot == SID_TEXTDIRECTION_LEFT_TO_RIGHT ?
+ css::text::WritingMode_LR_TB : css::text::WritingMode_TB_RL,
+ SDRATTR_TEXTDIRECTION ) );
+ rReq.Done( aAttr );
+ mpView->SetAttributes( aAttr );
+ Invalidate();
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true );
+ }
+ break;
+
+ case FN_NUM_BULLET_ON:
+ {
+ if (pOLV)
+ {
+ bool bMasterPage = false;
+ SdrPageView* pPageView = mpView->GetSdrPageView();
+ if (pPageView)
+ {
+ SdPage* pPage = static_cast<SdPage*>(pPageView->GetPage());
+ bMasterPage = pPage && (pPage->GetPageKind() == PageKind::Standard) && pPage->IsMasterPage();
+ }
+
+ if (!bMasterPage)
+ pOLV->ToggleBullets();
+ else
+ {
+ //Resolves: fdo#78151 in master pages if we toggle bullets on
+ //and off then just disable/enable the bulleting, but do not
+ //change the *level* of the paragraph, because the paragraph is
+ //effectively a preview of the equivalent style level, and
+ //changing the level disconnects it from the style
+
+ ::Outliner* pOL = pOLV->GetOutliner();
+ if (pOL)
+ {
+ const SvxNumBulletItem *pItem = nullptr;
+ SfxStyleSheetBasePool* pSSPool = mpView->GetDocSh()->GetStyleSheetPool();
+ OUString sStyleName(SdResId(STR_PSEUDOSHEET_OUTLINE) + " 1");
+ SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find(sStyleName, SfxStyleFamily::Pseudo);
+ if( pFirstStyleSheet )
+ pItem = pFirstStyleSheet->GetItemSet().GetItemIfSet(EE_PARA_NUMBULLET, false);
+
+ if (pItem )
+ {
+ SvxNumRule aNewRule(pItem->GetNumRule());
+ ESelection aSel = pOLV->GetSelection();
+ aSel.Adjust();
+ sal_Int32 nStartPara = aSel.nStartPara;
+ sal_Int32 nEndPara = aSel.nEndPara;
+ for (sal_Int32 nPara = nStartPara; nPara <= nEndPara; ++nPara)
+ {
+ sal_uInt16 nLevel = pOL->GetDepth(nPara);
+ SvxNumberFormat aFmt(aNewRule.GetLevel(nLevel));
+
+ if (aFmt.GetNumberingType() == SVX_NUM_NUMBER_NONE)
+ {
+ aFmt.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
+ SdStyleSheetPool::setDefaultOutlineNumberFormatBulletAndIndent(nLevel, aFmt);
+ }
+ else
+ {
+ aFmt.SetNumberingType(SVX_NUM_NUMBER_NONE);
+ aFmt.SetAbsLSpace(0);
+ aFmt.SetFirstLineOffset(0);
+ }
+
+ aNewRule.SetLevel(nLevel, aFmt);
+ }
+
+ pFirstStyleSheet->GetItemSet().Put(SvxNumBulletItem(std::move(aNewRule), EE_PARA_NUMBULLET));
+
+ SdStyleSheet::BroadcastSdStyleSheetChange(pFirstStyleSheet, PresentationObjects::Outline_1, pSSPool);
+ }
+ }
+ }
+ }
+ break;
+ }
+ case SID_GROW_FONT_SIZE:
+ case SID_SHRINK_FONT_SIZE:
+ {
+ const SvxFontListItem* pFonts = static_cast<const SvxFontListItem*>(mpViewShell->GetDocSh()->GetItem( SID_ATTR_CHAR_FONTLIST ));
+ const FontList* pFontList = pFonts ? pFonts->GetFontList(): nullptr;
+ if( pFontList )
+ {
+ FuText::ChangeFontSize( nSlot == SID_GROW_FONT_SIZE, pOLV, pFontList, mpView );
+ if( pOLV )
+ pOLV->SetAttribs( pOLV->GetEditView().GetEmptyItemSet() );
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
+ }
+ rReq.Done();
+ }
+ break;
+
+ case SID_THES:
+ {
+ OUString aReplaceText;
+ const SfxStringItem* pItem2 = rReq.GetArg(FN_PARAM_THES_WORD_REPLACE);
+ if (pItem2)
+ aReplaceText = pItem2->GetValue();
+ if (!aReplaceText.isEmpty())
+ ReplaceTextWithSynonym( pOLV->GetEditView(), aReplaceText );
+ }
+ break;
+
+ default:
+ {
+ SfxItemSet aEditAttr( mpView->GetDoc().GetPool() );
+ mpView->GetAttributes( aEditAttr );
+ SfxItemSet aNewAttr(*(aEditAttr.GetPool()), aEditAttr.GetRanges());
+
+ if( !pArgs )
+ {
+ //aNewAttr.InvalidateAllItems(); <- produces problems (#35465#)
+
+ switch ( nSlot )
+ {
+ case SID_ATTR_CHAR_WEIGHT:
+ {
+ FontWeight eFW = aEditAttr.Get( EE_CHAR_WEIGHT ).GetWeight();
+ aNewAttr.Put( SvxWeightItem( eFW == WEIGHT_NORMAL ?
+ WEIGHT_BOLD : WEIGHT_NORMAL,
+ EE_CHAR_WEIGHT ) );
+ }
+ break;
+ case SID_ATTR_CHAR_POSTURE:
+ {
+ FontItalic eFI = aEditAttr.Get( EE_CHAR_ITALIC ).GetPosture();
+ aNewAttr.Put( SvxPostureItem( eFI == ITALIC_NORMAL ?
+ ITALIC_NONE : ITALIC_NORMAL,
+ EE_CHAR_ITALIC ) );
+ }
+ break;
+ case SID_ATTR_CHAR_UNDERLINE:
+ {
+ FontLineStyle eFU = aEditAttr.Get( EE_CHAR_UNDERLINE ).GetLineStyle();
+ aNewAttr.Put( SvxUnderlineItem( eFU == LINESTYLE_SINGLE ?
+ LINESTYLE_NONE : LINESTYLE_SINGLE,
+ EE_CHAR_UNDERLINE ) );
+ }
+ break;
+
+ case SID_ULINE_VAL_NONE:
+ {
+ aNewAttr.Put(SvxUnderlineItem(LINESTYLE_NONE, EE_CHAR_UNDERLINE));
+ break;
+ }
+
+ case SID_ULINE_VAL_SINGLE:
+ case SID_ULINE_VAL_DOUBLE:
+ case SID_ULINE_VAL_DOTTED:
+ {
+ FontLineStyle eOld = aEditAttr.Get(EE_CHAR_UNDERLINE).GetLineStyle();
+ FontLineStyle eNew = eOld;
+
+ switch (nSlot)
+ {
+ case SID_ULINE_VAL_SINGLE:
+ eNew = ( eOld == LINESTYLE_SINGLE ) ? LINESTYLE_NONE : LINESTYLE_SINGLE;
+ break;
+ case SID_ULINE_VAL_DOUBLE:
+ eNew = ( eOld == LINESTYLE_DOUBLE ) ? LINESTYLE_NONE : LINESTYLE_DOUBLE;
+ break;
+ case SID_ULINE_VAL_DOTTED:
+ eNew = ( eOld == LINESTYLE_DOTTED ) ? LINESTYLE_NONE : LINESTYLE_DOTTED;
+ break;
+ }
+
+ SvxUnderlineItem aUnderline(eNew, EE_CHAR_UNDERLINE);
+ aNewAttr.Put(aUnderline);
+ }
+ break;
+
+ case SID_ATTR_CHAR_OVERLINE:
+ {
+ FontLineStyle eFO = aEditAttr.Get( EE_CHAR_OVERLINE ).GetLineStyle();
+ aNewAttr.Put( SvxOverlineItem( eFO == LINESTYLE_SINGLE ?
+ LINESTYLE_NONE : LINESTYLE_SINGLE,
+ EE_CHAR_OVERLINE ) );
+ }
+ break;
+ case SID_ATTR_CHAR_CONTOUR:
+ {
+ aNewAttr.Put( SvxContourItem( !aEditAttr.Get( EE_CHAR_OUTLINE ).GetValue(), EE_CHAR_OUTLINE ) );
+ }
+ break;
+ case SID_ATTR_CHAR_SHADOWED:
+ {
+ aNewAttr.Put( SvxShadowedItem( !aEditAttr.Get( EE_CHAR_SHADOW ).GetValue(), EE_CHAR_SHADOW ) );
+ }
+ break;
+ case SID_ATTR_CHAR_CASEMAP:
+ {
+ aNewAttr.Put( aEditAttr.Get( EE_CHAR_CASEMAP ) );
+ }
+ break;
+ case SID_ATTR_CHAR_STRIKEOUT:
+ {
+ FontStrikeout eFSO = aEditAttr.Get( EE_CHAR_STRIKEOUT ).GetStrikeout();
+ aNewAttr.Put( SvxCrossedOutItem( eFSO == STRIKEOUT_SINGLE ?
+ STRIKEOUT_NONE : STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT ) );
+ }
+ break;
+
+ case SID_ATTR_PARA_ADJUST_LEFT:
+ {
+ aNewAttr.Put( SvxAdjustItem( SvxAdjust::Left, EE_PARA_JUST ) );
+ }
+ break;
+ case SID_ATTR_PARA_ADJUST_CENTER:
+ {
+ aNewAttr.Put( SvxAdjustItem( SvxAdjust::Center, EE_PARA_JUST ) );
+ }
+ break;
+ case SID_ATTR_PARA_ADJUST_RIGHT:
+ {
+ aNewAttr.Put( SvxAdjustItem( SvxAdjust::Right, EE_PARA_JUST ) );
+ }
+ break;
+ case SID_ATTR_PARA_ADJUST_BLOCK:
+ {
+ aNewAttr.Put( SvxAdjustItem( SvxAdjust::Block, EE_PARA_JUST ) );
+ }
+ break;
+ case SID_ATTR_PARA_LINESPACE_10:
+ {
+ SvxLineSpacingItem aItem( LINE_SPACE_DEFAULT_HEIGHT, EE_PARA_SBL );
+ aItem.SetPropLineSpace( 100 );
+ aNewAttr.Put( aItem );
+ }
+ break;
+ case SID_ATTR_PARA_LINESPACE_15:
+ {
+ SvxLineSpacingItem aItem( LINE_SPACE_DEFAULT_HEIGHT, EE_PARA_SBL );
+ aItem.SetPropLineSpace( 150 );
+ aNewAttr.Put( aItem );
+ }
+ break;
+ case SID_ATTR_PARA_LINESPACE_20:
+ {
+ SvxLineSpacingItem aItem( LINE_SPACE_DEFAULT_HEIGHT, EE_PARA_SBL );
+ aItem.SetPropLineSpace( 200 );
+ aNewAttr.Put( aItem );
+ }
+ break;
+ case SID_SET_SUPER_SCRIPT:
+ {
+ SvxEscapementItem aItem( EE_CHAR_ESCAPEMENT );
+ SvxEscapement eEsc = static_cast<SvxEscapement>(aEditAttr.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue());
+
+ if( eEsc == SvxEscapement::Superscript )
+ aItem.SetEscapement( SvxEscapement::Off );
+ else
+ aItem.SetEscapement( SvxEscapement::Superscript );
+ aNewAttr.Put( aItem );
+ }
+ break;
+ case SID_SET_SUB_SCRIPT:
+ {
+ SvxEscapementItem aItem( EE_CHAR_ESCAPEMENT );
+ SvxEscapement eEsc = static_cast<SvxEscapement>(aEditAttr.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue());
+
+ if( eEsc == SvxEscapement::Subscript )
+ aItem.SetEscapement( SvxEscapement::Off );
+ else
+ aItem.SetEscapement( SvxEscapement::Subscript );
+ aNewAttr.Put( aItem );
+ }
+ break;
+
+ // attributes for TextObjectBar
+ case SID_ATTR_CHAR_FONT:
+ mpViewShell->GetViewFrame()->GetDispatcher()->
+ Execute( SID_CHAR_DLG, SfxCallMode::ASYNCHRON );
+ break;
+ case SID_ATTR_CHAR_FONTHEIGHT:
+ mpViewShell->GetViewFrame()->GetDispatcher()->
+ Execute( SID_CHAR_DLG, SfxCallMode::ASYNCHRON );
+ break;
+ case SID_ATTR_CHAR_COLOR:
+ break;
+// #i35937# removed need for FN_NUM_BULLET_ON handling
+ }
+
+ rReq.Done( aNewAttr );
+ pArgs = rReq.GetArgs();
+ }
+ else if ( nSlot == SID_ATTR_PARA_LEFT_TO_RIGHT ||
+ nSlot == SID_ATTR_PARA_RIGHT_TO_LEFT )
+ {
+ bool bLeftToRight = nSlot == SID_ATTR_PARA_LEFT_TO_RIGHT;
+
+ SvxAdjust nAdjust = SvxAdjust::Left;
+ if( const SvxAdjustItem* pAdjustItem = aEditAttr.GetItemIfSet(EE_PARA_JUST) )
+ nAdjust = pAdjustItem->GetAdjust();
+
+ if( bLeftToRight )
+ {
+ aNewAttr.Put( SvxFrameDirectionItem( SvxFrameDirection::Horizontal_LR_TB, EE_PARA_WRITINGDIR ) );
+ if( nAdjust == SvxAdjust::Right )
+ aNewAttr.Put( SvxAdjustItem( SvxAdjust::Left, EE_PARA_JUST ) );
+ }
+ else
+ {
+ aNewAttr.Put( SvxFrameDirectionItem( SvxFrameDirection::Horizontal_RL_TB, EE_PARA_WRITINGDIR ) );
+ if( nAdjust == SvxAdjust::Left )
+ aNewAttr.Put( SvxAdjustItem( SvxAdjust::Right, EE_PARA_JUST ) );
+ }
+
+ rReq.Done( aNewAttr );
+ pArgs = rReq.GetArgs();
+
+ Invalidate( SID_RULER_TEXT_RIGHT_TO_LEFT );
+ }
+ else if ( nSlot == SID_ATTR_CHAR_FONT ||
+ nSlot == SID_ATTR_CHAR_FONTHEIGHT ||
+ nSlot == SID_ATTR_CHAR_POSTURE ||
+ nSlot == SID_ATTR_CHAR_WEIGHT )
+ {
+ // #i78017 establish the same behaviour as in Writer
+ SvtScriptType nScriptType = SvtScriptType::LATIN | SvtScriptType::ASIAN | SvtScriptType::COMPLEX;
+ if (nSlot == SID_ATTR_CHAR_FONT)
+ nScriptType = mpView->GetScriptType();
+
+ SfxItemPool& rPool = mpView->GetDoc().GetPool();
+ SvxScriptSetItem aSvxScriptSetItem( nSlot, rPool );
+ aSvxScriptSetItem.PutItemForScriptType( nScriptType, pArgs->Get( rPool.GetWhich( nSlot ) ) );
+ aNewAttr.Put( aSvxScriptSetItem.GetItemSet() );
+ rReq.Done( aNewAttr );
+ pArgs = rReq.GetArgs();
+ }
+ else if (nSlot == SID_ATTR_PARA_ADJUST_LEFT ||
+ nSlot == SID_ATTR_PARA_ADJUST_CENTER ||
+ nSlot == SID_ATTR_PARA_ADJUST_RIGHT ||
+ nSlot == SID_ATTR_PARA_ADJUST_BLOCK)
+ {
+ switch( nSlot )
+ {
+ case SID_ATTR_PARA_ADJUST_LEFT:
+ {
+ aNewAttr.Put( SvxAdjustItem( SvxAdjust::Left, EE_PARA_JUST ) );
+ }
+ break;
+ case SID_ATTR_PARA_ADJUST_CENTER:
+ {
+ aNewAttr.Put( SvxAdjustItem( SvxAdjust::Center, EE_PARA_JUST ) );
+ }
+ break;
+ case SID_ATTR_PARA_ADJUST_RIGHT:
+ {
+ aNewAttr.Put( SvxAdjustItem( SvxAdjust::Right, EE_PARA_JUST ) );
+ }
+ break;
+ case SID_ATTR_PARA_ADJUST_BLOCK:
+ {
+ aNewAttr.Put( SvxAdjustItem( SvxAdjust::Block, EE_PARA_JUST ) );
+ }
+ break;
+ }
+ rReq.Done( aNewAttr );
+ pArgs = rReq.GetArgs();
+ }
+ else if(nSlot == SID_ATTR_CHAR_KERNING)
+ {
+ aNewAttr.Put(pArgs->Get(pArgs->GetPool()->GetWhich(nSlot)));
+ rReq.Done( aNewAttr );
+ pArgs = rReq.GetArgs();
+ }
+ else if(nSlot == SID_SET_SUPER_SCRIPT )
+ {
+ SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
+ SvxEscapement eEsc = static_cast<SvxEscapement>(aEditAttr.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue());
+
+ if( eEsc == SvxEscapement::Superscript )
+ aItem.SetEscapement( SvxEscapement::Off );
+ else
+ aItem.SetEscapement( SvxEscapement::Superscript );
+ aNewAttr.Put( aItem );
+ rReq.Done( aNewAttr );
+ pArgs = rReq.GetArgs();
+ }
+ else if( nSlot == SID_SET_SUB_SCRIPT )
+ {
+ SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
+ SvxEscapement eEsc = static_cast<SvxEscapement>(aEditAttr.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue());
+
+ if( eEsc == SvxEscapement::Subscript )
+ aItem.SetEscapement( SvxEscapement::Off );
+ else
+ aItem.SetEscapement( SvxEscapement::Subscript );
+ aNewAttr.Put( aItem );
+ rReq.Done( aNewAttr );
+ pArgs = rReq.GetArgs();
+ }
+
+ std::unique_ptr<SfxItemSet> pNewArgs = pArgs->Clone();
+ lcl_convertStringArguments(nSlot, pNewArgs);
+
+ // Merge the color parameters to the color itself.
+ std::unique_ptr<SvxColorItem> pColorItem;
+ if (nSlot == SID_ATTR_CHAR_COLOR)
+ {
+ pColorItem = std::make_unique<SvxColorItem>(pNewArgs->Get(EE_CHAR_COLOR));
+ }
+ if (const SfxInt16Item* pIntItem = pArgs->GetItemIfSet(SID_ATTR_COLOR_THEME_INDEX, false))
+ {
+ pColorItem->GetThemeColor().SetThemeIndex(pIntItem->GetValue());
+ }
+ if (const SfxInt16Item* pIntItem = pArgs->GetItemIfSet(SID_ATTR_COLOR_LUM_MOD, false))
+ {
+ pColorItem->GetThemeColor().SetLumMod(pIntItem->GetValue());
+ }
+ if (const SfxInt16Item* pIntItem = pArgs->GetItemIfSet(SID_ATTR_COLOR_LUM_OFF, false))
+ {
+ pColorItem->GetThemeColor().SetLumOff(pIntItem->GetValue());
+ }
+ if (pColorItem)
+ {
+ pNewArgs->Put(std::move(pColorItem));
+ }
+
+ mpView->SetAttributes(*pNewArgs);
+
+ // invalidate entire shell because of performance and
+ // extension reasons
+ Invalidate();
+
+ // to refresh preview (in outline mode), slot has to be invalidated:
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_PREVIEW_STATE, true );
+ }
+ break;
+ }
+
+ if ( nSlot != SID_STYLE_APPLY && pOLV )
+ {
+ pOLV->ShowCursor();
+ pOLV->GetWindow()->GrabFocus();
+ }
+
+ Invalidate( SID_OUTLINE_LEFT );
+ Invalidate( SID_OUTLINE_RIGHT );
+ Invalidate( SID_OUTLINE_UP );
+ Invalidate( SID_OUTLINE_DOWN );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviews1.cxx b/sd/source/ui/view/drviews1.cxx
new file mode 100644
index 000000000..085bc93f2
--- /dev/null
+++ b/sd/source/ui/view/drviews1.cxx
@@ -0,0 +1,1360 @@
+/* -*- 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 <DrawViewShell.hxx>
+#include <ViewShellImplementation.hxx>
+
+#include <DrawController.hxx>
+#include <com/sun/star/embed/XEmbeddedObject.hpp>
+
+#include <comphelper/scopeguard.hxx>
+#include <rtl/ref.hxx>
+
+#include <svx/svxids.hrc>
+#include <svx/svdpagv.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/bindings.hxx>
+#include <svx/svdoole2.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/module.hxx>
+#include <vcl/scrbar.hxx>
+#include <svx/svdopage.hxx>
+#include <svx/fmshell.hxx>
+#include <tools/debug.hxx>
+#include <tools/diagnose_ex.h>
+#include <vcl/graphicfilter.hxx>
+
+#include <view/viewoverlaymanager.hxx>
+
+#include <app.hrc>
+
+#include <fupoor.hxx>
+#include <unokywds.hxx>
+#include <sdpage.hxx>
+#include <FrameView.hxx>
+#include <Window.hxx>
+#include <drawview.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <Ruler.hxx>
+#include <Client.hxx>
+#include <slideshow.hxx>
+#include <AnimationChildWindow.hxx>
+#include <ToolBarManager.hxx>
+#include <FormShellManager.hxx>
+#include <ViewShellBase.hxx>
+#include <LayerTabBar.hxx>
+#include <ViewShellManager.hxx>
+#include <ViewShellHint.hxx>
+#include <SlideSorter.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsPageSelector.hxx>
+
+#include <comphelper/lok.hxx>
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+#include <vcl/uitest/logger.hxx>
+#include <vcl/uitest/eventdescription.hxx>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+void DrawViewShell::Activate(bool bIsMDIActivate)
+{
+ ViewShell::Activate(bIsMDIActivate);
+
+ // When the mode is switched to normal the main view shell grabs focus.
+ // This is done for getting cut/copy/paste commands on slides in the left
+ // pane (slide sorter view shell) to work properly.
+ SfxShell* pTopViewShell = this->GetViewShellBase().GetViewShellManager()->GetTopViewShell();
+ if (pTopViewShell && pTopViewShell == this)
+ {
+ this->GetActiveWindow()->GrabFocus();
+ }
+}
+
+void DrawViewShell::UIActivating( SfxInPlaceClient* pCli )
+{
+ ViewShell::UIActivating(pCli);
+
+ // Disable own controls
+ maTabControl->Disable();
+ if (GetLayerTabControl() != nullptr)
+ GetLayerTabControl()->Disable();
+}
+
+void DrawViewShell::UIDeactivated( SfxInPlaceClient* pCli )
+{
+ // Enable own controls
+ maTabControl->Enable();
+ if (GetLayerTabControl() != nullptr)
+ GetLayerTabControl()->Enable();
+
+ ViewShell::UIDeactivated(pCli);
+}
+
+void DrawViewShell::Deactivate(bool bIsMDIActivate)
+{
+ // Temporarily disable context broadcasting while the Deactivate()
+ // call is forwarded to our base class.
+ const bool bIsContextBroadcasterEnabled (SfxShell::SetContextBroadcasterEnabled(false));
+
+ ViewShell::Deactivate(bIsMDIActivate);
+
+ SfxShell::SetContextBroadcasterEnabled(bIsContextBroadcasterEnabled);
+}
+
+namespace
+{
+ class LockUI
+ {
+ private:
+ void Lock(bool bLock);
+ SfxViewFrame *mpFrame;
+ public:
+ explicit LockUI(SfxViewFrame *pFrame) : mpFrame(pFrame) { Lock(true); }
+ ~LockUI() { Lock(false); }
+
+ };
+
+ void LockUI::Lock(bool bLock)
+ {
+ if (!mpFrame)
+ return;
+ mpFrame->Enable( !bLock );
+ }
+}
+
+/**
+ * Called, if state of selection of view is changed
+ */
+
+void DrawViewShell::SelectionHasChanged()
+{
+ Invalidate();
+
+ //Update3DWindow(); // 3D-Controller
+ SfxBoolItem aItem( SID_3D_STATE, true );
+ GetViewFrame()->GetDispatcher()->ExecuteList(
+ SID_3D_STATE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, { &aItem });
+
+ SdrOle2Obj* pOleObj = nullptr;
+
+ if ( mpDrawView->AreObjectsMarked() )
+ {
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+
+ SdrInventor nInv = pObj->GetObjInventor();
+ SdrObjKind nSdrObjKind = pObj->GetObjIdentifier();
+
+ if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::OLE2)
+ {
+ pOleObj = static_cast<SdrOle2Obj*>(pObj);
+ UpdateIMapDlg( pObj );
+ }
+ else if (nSdrObjKind == SdrObjKind::Graphic)
+ UpdateIMapDlg( pObj );
+ }
+ }
+
+ ViewShellBase& rBase = GetViewShellBase();
+ rBase.SetVerbs( uno::Sequence< embed::VerbDescriptor >() );
+
+ try
+ {
+ Client* pIPClient = static_cast<Client*>(rBase.GetIPClient());
+ if ( pIPClient && pIPClient->IsObjectInPlaceActive() )
+ {
+ // as appropriate take ole-objects into account and deactivate
+
+ // this means we recently deselected an inplace active ole object so
+ // we need to deselect it now
+ if (!pOleObj)
+ {
+ //#i47279# disable frame until after object has completed unload
+ LockUI aUILock(GetViewFrame());
+ pIPClient->DeactivateObject();
+ //HMHmpDrView->ShowMarkHdl();
+ }
+ else
+ {
+ const uno::Reference < embed::XEmbeddedObject >& xObj = pOleObj->GetObjRef();
+ if ( xObj.is() )
+ {
+ rBase.SetVerbs( xObj->getSupportedVerbs() );
+ }
+ else
+ {
+ rBase.SetVerbs( uno::Sequence < embed::VerbDescriptor >() );
+ }
+ }
+ }
+ else
+ {
+ if ( pOleObj )
+ {
+ const uno::Reference < embed::XEmbeddedObject >& xObj = pOleObj->GetObjRef();
+ if ( xObj.is() )
+ {
+ rBase.SetVerbs( xObj->getSupportedVerbs() );
+ }
+ else
+ {
+ rBase.SetVerbs( uno::Sequence < embed::VerbDescriptor >() );
+ }
+ }
+ else
+ {
+ rBase.SetVerbs( uno::Sequence < embed::VerbDescriptor >() );
+ }
+ }
+ }
+ catch( css::uno::Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "sd::DrawViewShell::SelectionHasChanged()" );
+ }
+
+ if( HasCurrentFunction() )
+ {
+ GetCurrentFunction()->SelectionHasChanged();
+ }
+ else
+ {
+ GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*this,*mpDrawView);
+ }
+
+ // Invalidate for every subshell
+ GetViewShellBase().GetViewShellManager()->InvalidateAllSubShells(this);
+
+ mpDrawView->UpdateSelectionClipboard();
+
+ GetViewShellBase().GetDrawController().FireSelectionChangeListener();
+}
+
+namespace {
+
+void collectUIInformation(const OUString& aZoom)
+{
+ EventDescription aDescription;
+ aDescription.aID = "impress_win";
+ aDescription.aParameters = {{"ZOOM", aZoom}};
+ aDescription.aAction = "SET";
+ aDescription.aKeyWord = "ImpressWindowUIObject";
+ aDescription.aParent = "MainWindow";
+
+ UITestLogger::getInstance().logEvent(aDescription);
+}
+
+}
+
+/**
+ * set zoom factor
+ */
+void DrawViewShell::SetZoom( ::tools::Long nZoom )
+{
+ // Make sure that the zoom factor will not be recalculated on
+ // following window resizings.
+ mbZoomOnPage = false;
+ ViewShell::SetZoom( nZoom );
+ GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
+ GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
+ mpViewOverlayManager->onZoomChanged();
+ collectUIInformation(OUString::number(nZoom));
+}
+
+/**
+ * Set zoom rectangle for active window
+ */
+
+void DrawViewShell::SetZoomRect( const ::tools::Rectangle& rZoomRect )
+{
+ ViewShell::SetZoomRect( rZoomRect );
+ GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
+ GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
+ mpViewOverlayManager->onZoomChanged();
+}
+
+/**
+ * PrepareClose, as appropriate end text input, so other viewshells
+ * discover a refreshed text object.
+ */
+
+bool DrawViewShell::PrepareClose( bool bUI )
+{
+ if ( !ViewShell::PrepareClose(bUI) )
+ return false;
+
+ if( HasCurrentFunction() )
+ {
+ sal_uInt16 nID = GetCurrentFunction()->GetSlotID();
+ if (nID == SID_TEXTEDIT || nID == SID_ATTR_CHAR)
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+ }
+
+ return true;
+}
+
+
+/**
+ * Set status (enabled/disabled) of menu SfxSlots
+ */
+
+void DrawViewShell::ChangeEditMode(EditMode eEMode, bool bIsLayerModeActive)
+{
+ if (meEditMode == eEMode && mbIsLayerModeActive == bIsLayerModeActive)
+ return;
+
+ ViewShellManager::UpdateLock aLock (GetViewShellBase().GetViewShellManager());
+
+ sal_uInt16 nActualPageId = maTabControl->GetPageId(0);
+
+ if (mePageKind == PageKind::Handout)
+ {
+ // at handouts only allow MasterPage
+ eEMode = EditMode::MasterPage;
+ }
+
+ GetViewShellBase().GetDrawController().FireChangeEditMode (eEMode == EditMode::MasterPage);
+ GetViewShellBase().GetDrawController().FireChangeLayerMode (bIsLayerModeActive);
+
+ if ( mpDrawView->IsTextEdit() )
+ {
+ // This exits the text edit mode when going in and out of window focus, which is not needed
+ // Let's keep this call as comment for now as it probably just needs a better conditional.
+ // mpDrawView->SdrEndTextEdit();
+ }
+
+ LayerTabBar* pLayerBar = GetLayerTabControl();
+ if (pLayerBar != nullptr)
+ pLayerBar->EndEditMode();
+ maTabControl->EndEditMode();
+
+ GetViewShellBase().GetDrawController().BroadcastContextChange();
+
+ meEditMode = eEMode;
+
+ if(pLayerBar)
+ {
+ // #i87182# only switch activation mode of LayerTabBar when there is one,
+ // else it will not get initialized with the current set of Layers as needed
+ mbIsLayerModeActive = bIsLayerModeActive;
+ }
+
+ // Determine whether to show the master view toolbar. The master
+ // page mode has to be active and the shell must not be a handout
+ // view.
+ bool bShowMasterViewToolbar (meEditMode == EditMode::MasterPage
+ && GetShellType() != ViewShell::ST_HANDOUT);
+ bool bShowPresentationToolbar (meEditMode != EditMode::MasterPage
+ && GetShellType() != ViewShell::ST_HANDOUT
+ && GetShellType() != ViewShell::ST_DRAW);
+
+ // If the master view toolbar is not shown we hide it before
+ // switching the edit mode.
+ if (::sd::ViewShell::mpImpl->mbIsInitialized
+ && IsMainViewShell())
+ {
+ if ( !bShowMasterViewToolbar )
+ GetViewShellBase().GetToolBarManager()->ResetToolBars(ToolBarManager::ToolBarGroup::MasterMode);
+ if ( !bShowPresentationToolbar )
+ GetViewShellBase().GetToolBarManager()->ResetToolBars(ToolBarManager::ToolBarGroup::CommonTask);
+ }
+
+ ConfigureAppBackgroundColor();
+
+ if (meEditMode == EditMode::Page)
+ {
+ /******************************************************************
+ * PAGEMODE
+ ******************************************************************/
+
+ maTabControl->Clear();
+
+ SdPage* pPage;
+ sal_uInt16 nPageCnt = GetDoc()->GetSdPageCount(mePageKind);
+
+ for (sal_uInt16 i = 0; i < nPageCnt; i++)
+ {
+ pPage = GetDoc()->GetSdPage(i, mePageKind);
+ OUString aPageName = pPage->GetName();
+ maTabControl->InsertPage(pPage->getPageId(), aPageName);
+
+ if ( pPage->IsSelected() )
+ {
+ nActualPageId = pPage->getPageId();
+ }
+ }
+
+ maTabControl->SetCurPageId(nActualPageId);
+
+ SwitchPage(maTabControl->GetPagePos(nActualPageId));
+
+ //tdf#102343 re-enable common undo on switch back from master mode
+ mpDrawView->GetModel()->SetDisableTextEditUsesCommonUndoManager(false);
+ }
+ else
+ {
+ /******************************************************************
+ * MASTERPAGE
+ ******************************************************************/
+ GetViewFrame()->SetChildWindow(
+ AnimationChildWindow::GetChildWindowId(), false );
+
+ if (comphelper::LibreOfficeKit::isActive())
+ GetViewShell()->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED,
+ ".uno:SlideMasterPage=true");
+ if (!mpActualPage)
+ {
+ // as long as there is no mpActualPage, take first
+ mpActualPage = GetDoc()->GetSdPage(0, mePageKind);
+ }
+
+ maTabControl->Clear();
+ sal_uInt16 nActualMasterPageId = maTabControl->GetPageId(0);
+ sal_uInt16 nMasterPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind);
+
+ for (sal_uInt16 i = 0; i < nMasterPageCnt; i++)
+ {
+ SdPage* pMaster = GetDoc()->GetMasterSdPage(i, mePageKind);
+ OUString aLayoutName = pMaster->GetLayoutName();
+ sal_Int32 nPos = aLayoutName.indexOf(SD_LT_SEPARATOR);
+ if (nPos != -1)
+ aLayoutName = aLayoutName.copy(0, nPos);
+
+ maTabControl->InsertPage(pMaster->getPageId(), aLayoutName);
+
+ if (&(mpActualPage->TRG_GetMasterPage()) == pMaster)
+ {
+ nActualMasterPageId = pMaster->getPageId();
+ }
+ }
+
+ maTabControl->SetCurPageId(nActualMasterPageId);
+ SwitchPage(maTabControl->GetPagePos(nActualMasterPageId));
+
+ //tdf#102343 changing attributes of textboxes in master typically
+ //changes the stylesheet they are linked to, so if the common
+ //undo manager is in use, those stylesheet changes are thrown
+ //away at present
+ mpDrawView->GetModel()->SetDisableTextEditUsesCommonUndoManager(true);
+ }
+
+ // If the master view toolbar is to be shown we turn it on after the
+ // edit mode has been changed.
+ if (::sd::ViewShell::mpImpl->mbIsInitialized
+ && IsMainViewShell())
+ {
+ if (bShowMasterViewToolbar)
+ GetViewShellBase().GetToolBarManager()->SetToolBar(
+ ToolBarManager::ToolBarGroup::MasterMode,
+ ToolBarManager::msMasterViewToolBar);
+ if (bShowPresentationToolbar)
+ GetViewShellBase().GetToolBarManager()->SetToolBar(
+ ToolBarManager::ToolBarGroup::CommonTask,
+ ToolBarManager::msCommonTaskToolBar);
+ }
+
+ if ( ! mbIsLayerModeActive)
+ {
+ maTabControl->Show();
+ // Set the tab control only for draw pages. For master page
+ // this has been done already above.
+ if (meEditMode == EditMode::Page)
+ maTabControl->SetCurPageId (nActualPageId);
+ }
+
+ ResetActualLayer();
+
+ Invalidate( SID_PAGEMODE );
+ Invalidate( SID_LAYERMODE );
+ Invalidate( SID_MASTERPAGE );
+ Invalidate( SID_DELETE_MASTER_PAGE );
+ Invalidate( SID_DELETE_PAGE );
+ Invalidate( SID_SLIDE_MASTER_MODE );
+ Invalidate( SID_NOTES_MASTER_MODE );
+ Invalidate( SID_HANDOUT_MASTER_MODE );
+ InvalidateWindows();
+
+ SetContextName(GetSidebarContextName());
+
+}
+
+/**
+ * Generate horizontal ruler
+ */
+
+VclPtr<SvxRuler> DrawViewShell::CreateHRuler (::sd::Window* pWin)
+{
+ VclPtr<Ruler> pRuler;
+ WinBits aWBits;
+ SvxRulerSupportFlags nFlags = SvxRulerSupportFlags::OBJECT;
+
+ aWBits = WB_HSCROLL | WB_3DLOOK | WB_BORDER | WB_EXTRAFIELD;
+ nFlags |= SvxRulerSupportFlags::SET_NULLOFFSET |
+ SvxRulerSupportFlags::TABS |
+ SvxRulerSupportFlags::PARAGRAPH_MARGINS; // new
+
+ pRuler = VclPtr<Ruler>::Create(*this, GetParentWindow(), pWin, nFlags,
+ GetViewFrame()->GetBindings(), aWBits);
+
+ // Metric ...
+ sal_uInt16 nMetric = static_cast<sal_uInt16>(GetDoc()->GetUIUnit());
+
+ if( nMetric == 0xffff )
+ nMetric = static_cast<sal_uInt16>(GetViewShellBase().GetViewFrame()->GetDispatcher()->GetModule()->GetFieldUnit());
+
+ pRuler->SetUnit( FieldUnit( nMetric ) );
+
+ // ... and also set DefTab at the ruler
+ pRuler->SetDefTabDist( GetDoc()->GetDefaultTabulator() ); // new
+
+ Fraction aUIScale(pWin->GetMapMode().GetScaleX());
+ aUIScale *= GetDoc()->GetUIScale();
+ pRuler->SetZoom(aUIScale);
+
+ return pRuler;
+}
+
+/**
+ * Generate vertical ruler
+ */
+
+VclPtr<SvxRuler> DrawViewShell::CreateVRuler(::sd::Window* pWin)
+{
+ VclPtr<SvxRuler> pRuler;
+ WinBits aWBits = WB_VSCROLL | WB_3DLOOK | WB_BORDER;
+ SvxRulerSupportFlags nFlags = SvxRulerSupportFlags::OBJECT;
+
+ pRuler = VclPtr<Ruler>::Create(*this, GetParentWindow(), pWin, nFlags,
+ GetViewFrame()->GetBindings(), aWBits);
+
+ // Metric same as HRuler, use document setting
+ sal_uInt16 nMetric = static_cast<sal_uInt16>(GetDoc()->GetUIUnit());
+
+ if( nMetric == 0xffff )
+ nMetric = static_cast<sal_uInt16>(GetViewShellBase().GetViewFrame()->GetDispatcher()->GetModule()->GetFieldUnit());
+
+ pRuler->SetUnit( FieldUnit( nMetric ) );
+
+ Fraction aUIScale(pWin->GetMapMode().GetScaleY());
+ aUIScale *= GetDoc()->GetUIScale();
+ pRuler->SetZoom(aUIScale);
+
+ return pRuler;
+}
+
+/**
+ * Refresh horizontal ruler
+ */
+
+void DrawViewShell::UpdateHRuler()
+{
+ Invalidate( SID_ATTR_LONG_LRSPACE );
+ Invalidate( SID_RULER_PAGE_POS );
+ Invalidate( SID_RULER_OBJECT );
+ Invalidate( SID_RULER_TEXT_RIGHT_TO_LEFT );
+
+ if (mpHorizontalRuler)
+ mpHorizontalRuler->ForceUpdate();
+}
+
+/**
+ * Refresh vertical ruler
+ */
+
+void DrawViewShell::UpdateVRuler()
+{
+ Invalidate( SID_ATTR_LONG_LRSPACE );
+ Invalidate( SID_RULER_PAGE_POS );
+ Invalidate( SID_RULER_OBJECT );
+
+ if (mpVerticalRuler)
+ mpVerticalRuler->ForceUpdate();
+}
+
+/**
+ * Refresh TabControl on splitter change
+ */
+
+IMPL_LINK( DrawViewShell, TabSplitHdl, TabBar *, pTab, void )
+{
+ const ::tools::Long nMax = maViewSize.Width() - maScrBarWH.Width()
+ - maTabControl->GetPosPixel().X() ;
+
+ Size aTabSize = maTabControl->GetSizePixel();
+ aTabSize.setWidth( std::min(pTab->GetSplitSize(), static_cast<::tools::Long>(nMax-1)) );
+
+ maTabControl->SetSizePixel(aTabSize);
+
+ if(GetLayerTabControl()) // #i87182#
+ {
+ GetLayerTabControl()->SetSizePixel(aTabSize);
+ }
+
+ Point aPos = maTabControl->GetPosPixel();
+ aPos.AdjustX(aTabSize.Width() );
+
+ Size aScrSize(nMax - aTabSize.Width(), maScrBarWH.Height());
+ mpHorizontalScrollBar->SetPosSizePixel(aPos, aScrSize);
+}
+
+/// inherited from sd::ViewShell
+SdPage* DrawViewShell::getCurrentPage() const
+{
+ const sal_uInt16 nPageCount = (meEditMode == EditMode::Page)?
+ GetDoc()->GetSdPageCount(mePageKind):
+ GetDoc()->GetMasterSdPageCount(mePageKind);
+
+ sal_uInt16 nCurrentPage = maTabControl->GetCurPagePos();
+ DBG_ASSERT((nCurrentPage<nPageCount), "sd::DrawViewShell::getCurrentPage(), illegal page index!");
+ if (nCurrentPage >= nPageCount)
+ nCurrentPage = 0; // play safe here
+
+ if (meEditMode == EditMode::Page)
+ {
+ return GetDoc()->GetSdPage(nCurrentPage, mePageKind);
+ }
+ else // EditMode::MasterPage
+ {
+ return GetDoc()->GetMasterSdPage(nCurrentPage, mePageKind);
+ }
+}
+
+/**
+ * Select new refreshed page, in case of a page order change (eg. by undo)
+ */
+
+void DrawViewShell::ResetActualPage()
+{
+ if (!GetDoc())
+ return;
+
+ sal_uInt16 nCurrentPageId = maTabControl->GetCurPageId();
+ sal_uInt16 nNewPageId = nCurrentPageId;
+ sal_uInt16 nCurrentPageNum = maTabControl->GetPagePos(nCurrentPageId);
+ sal_uInt16 nPageCount = (meEditMode == EditMode::Page)?GetDoc()->GetSdPageCount(mePageKind):GetDoc()->GetMasterSdPageCount(mePageKind);
+
+ if (meEditMode == EditMode::Page)
+ {
+
+ // Update for TabControl
+ maTabControl->Clear();
+
+ SdPage* pPage = nullptr;
+
+ for (sal_uInt16 i = 0; i < nPageCount; i++)
+ {
+ pPage = GetDoc()->GetSdPage(i, mePageKind);
+ OUString aPageName = pPage->GetName();
+ maTabControl->InsertPage(pPage->getPageId(), aPageName);
+
+ if (nCurrentPageId == pPage->getPageId())
+ {
+ nCurrentPageNum = i;
+ GetDoc()->SetSelected(pPage, true);
+ }
+ else
+ GetDoc()->SetSelected(pPage, false);
+ }
+
+ nNewPageId = maTabControl->GetPageId(nCurrentPageNum);
+ maTabControl->SetCurPageId(nNewPageId);
+ }
+ else // EditMode::MasterPage
+ {
+ maTabControl->Clear();
+
+ sal_uInt16 nMasterPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind);
+ for (sal_uInt16 i = 0; i < nMasterPageCnt; i++)
+ {
+ SdPage* pMaster = GetDoc()->GetMasterSdPage(i, mePageKind);
+ OUString aLayoutName = pMaster->GetLayoutName();
+ sal_Int32 nPos = aLayoutName.indexOf(SD_LT_SEPARATOR);
+ if (nPos != -1)
+ aLayoutName = aLayoutName.copy(0, nPos);
+ maTabControl->InsertPage(pMaster->getPageId(), aLayoutName);
+
+ if (pMaster->getPageId() == nCurrentPageId)
+ nCurrentPageNum = i;
+ }
+
+ nNewPageId = maTabControl->GetPageId(nCurrentPageNum);
+ maTabControl->SetCurPageId(nNewPageId);
+ SwitchPage(nCurrentPageNum);
+ }
+
+ bool bAllowChangeFocus = nNewPageId != nCurrentPageId;
+ SfxBoolItem aI(SID_SWITCHPAGE, bAllowChangeFocus);
+ GetViewFrame()->GetDispatcher()->ExecuteList(SID_SWITCHPAGE,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aI });
+}
+
+/**
+ * Apply "Verb" on OLE-object.
+ */
+ErrCode DrawViewShell::DoVerb(sal_Int32 nVerb)
+{
+ if ( mpDrawView->AreObjectsMarked() )
+ {
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+
+ SdrInventor nInv = pObj->GetObjInventor();
+ SdrObjKind nSdrObjKind = pObj->GetObjIdentifier();
+
+ if (nInv == SdrInventor::Default && nSdrObjKind == SdrObjKind::OLE2)
+ {
+ ActivateObject( static_cast<SdrOle2Obj*>(pObj), nVerb);
+ }
+ }
+ }
+
+ return ERRCODE_NONE;
+}
+
+/**
+ * Activate OLE-object
+ */
+bool DrawViewShell::ActivateObject(SdrOle2Obj* pObj, sal_Int32 nVerb)
+{
+ bool bActivated = false;
+
+ if ( !GetDocSh()->IsUIActive() )
+ {
+ ToolBarManager::UpdateLock aLock (GetViewShellBase().GetToolBarManager());
+
+ bActivated = ViewShell::ActivateObject(pObj, nVerb);
+ }
+
+ return bActivated;
+}
+
+/**
+ * Mark the desired page as selected (1), deselected (0), toggle (2).
+ * nPage refers to the page in question.
+ */
+bool DrawViewShell::SelectPage(sal_uInt16 nPage, sal_uInt16 nSelect)
+{
+ SdPage* pPage = GetDoc()->GetSdPage(nPage, PageKind::Standard);
+
+ //page selector marks pages to selected in view
+ auto &pageSelector = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase())->GetSlideSorter().GetController().GetPageSelector();
+
+ if (pPage)
+ {
+ if (nSelect == 0)
+ {
+ GetDoc()->SetSelected(pPage, false); // Deselect.
+ pageSelector.DeselectPage(nPage);
+ }
+ else if (nSelect == 1)
+ {
+ GetDoc()->SetSelected(pPage, true); // Select.
+ pageSelector.SelectPage(nPage);
+ }
+ else
+ {
+ // Toggle.
+ if (pPage->IsSelected())
+ {
+ GetDoc()->SetSelected(pPage, false);
+ pageSelector.DeselectPage(nPage);
+ }
+ else
+ {
+ GetDoc()->SetSelected(pPage, true);
+ pageSelector.SelectPage(nPage);
+ }
+ }
+ return true;
+ }
+
+ return false;
+}
+
+bool DrawViewShell::IsSelected(sal_uInt16 nPage)
+{
+ slidesorter::SlideSorterViewShell* pVShell
+ = slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase());
+ if (pVShell != nullptr)
+ return pVShell->GetSlideSorter().GetController().GetPageSelector().IsPageSelected(nPage);
+
+ return false;
+}
+
+bool DrawViewShell::IsVisible(sal_uInt16 nPage)
+{
+ slidesorter::SlideSorterViewShell* pVShell
+ = slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase());
+ if (pVShell != nullptr)
+ return pVShell->GetSlideSorter().GetController().GetPageSelector().IsPageVisible(nPage);
+
+ return false;
+}
+
+/**
+ * Switch to desired page.
+ * nSelectPage refers to the current EditMode
+ * bAllowChangeFocus set to false when slide is inserted before current page
+ * and we need to only update the current page number,
+ * do not disturb editing in that case
+ */
+bool DrawViewShell::SwitchPage(sal_uInt16 nSelectedPage, bool bAllowChangeFocus)
+{
+ /** Under some circumstances there are nested calls to SwitchPage() and
+ may crash the application (activation of form controls when the
+ shell of the edit view is not on top of the shell stack, see issue
+ 83888 for details.) Therefore the nested calls are ignored (they
+ would jump to the wrong page anyway.)
+ */
+
+ if (mbIsInSwitchPage)
+ return false;
+ mbIsInSwitchPage = true;
+ comphelper::ScopeGuard aGuard(
+ [this] () { this->mbIsInSwitchPage = false; } );
+
+ if (GetActiveWindow()->IsInPaint())
+ {
+ // Switching the current page while a Paint is being executed is
+ // dangerous. So, post it for later execution and return.
+ maAsynchronousSwitchPageCall.Post(
+ [this, nSelectedPage] () { this->SwitchPage(nSelectedPage); } );
+ return false;
+ }
+
+ bool bOK = false;
+
+ // With the current implementation of FuSlideShow there is a problem
+ // when it displays the show in a window: when the show is stopped it
+ // returns at one point in time SDRPAGE_NOTFOUND as current page index.
+ // Because FuSlideShow is currently being rewritten this bug is fixed
+ // here.
+ // This is not as bad a hack as it may look because making SwitchPage()
+ // more robust with respect to invalid page numbers is a good thing
+ // anyway.
+ if (nSelectedPage == SDRPAGE_NOTFOUND)
+ {
+ nSelectedPage = 0;
+ }
+ else
+ {
+ // Make sure that the given page index points to an existing page. Move
+ // the index into the valid range if necessary.
+ sal_uInt16 nPageCount = (meEditMode == EditMode::Page)
+ ? GetDoc()->GetSdPageCount(mePageKind)
+ : GetDoc()->GetMasterSdPageCount(mePageKind);
+ if (nSelectedPage >= nPageCount)
+ nSelectedPage = nPageCount-1;
+ }
+
+ if (IsSwitchPageAllowed())
+ {
+ ModifyGuard aGuard2( GetDoc() );
+
+ bOK = true;
+
+ if (mpActualPage)
+ {
+ SdPage* pNewPage = nullptr;
+
+ if (meEditMode == EditMode::MasterPage)
+ {
+ if( GetDoc()->GetMasterSdPageCount(mePageKind) > nSelectedPage )
+ pNewPage = GetDoc()->GetMasterSdPage(nSelectedPage, mePageKind);
+
+ if( pNewPage )
+ {
+ SdrPageView* pPV = mpDrawView->GetSdrPageView();
+ OUString sPageText(pNewPage->GetLayoutName());
+ sal_Int32 nPos = sPageText.indexOf(SD_LT_SEPARATOR);
+ if (nPos != -1)
+ sPageText = sPageText.copy(0, nPos);
+ if (pPV
+ && pNewPage == dynamic_cast< SdPage* >( pPV->GetPage() )
+ && sPageText == maTabControl->GetPageText(maTabControl->GetPageId(nSelectedPage)))
+ {
+ // this slide is already visible
+ return true;
+ }
+ }
+ }
+ else
+ {
+ OSL_ASSERT(mpFrameView!=nullptr);
+ mpFrameView->SetSelectedPage(nSelectedPage);
+
+ if (GetDoc()->GetSdPageCount(mePageKind) > nSelectedPage)
+ pNewPage = GetDoc()->GetSdPage(nSelectedPage, mePageKind);
+
+ if (mpActualPage == pNewPage)
+ {
+ SdrPageView* pPV = mpDrawView->GetSdrPageView();
+
+ SdPage* pCurrentPage = pPV ? dynamic_cast<SdPage*>(pPV->GetPage()) : nullptr;
+ if (pCurrentPage
+ && pNewPage == pCurrentPage
+ && maTabControl->GetPageText(maTabControl->GetPageId(nSelectedPage)) == pNewPage->GetName())
+ {
+ // this slide is already visible
+ return true;
+ }
+ }
+ }
+ }
+
+ if (bAllowChangeFocus)
+ mpDrawView->SdrEndTextEdit();
+
+ mpActualPage = nullptr;
+
+ if (meEditMode == EditMode::Page)
+ {
+ mpActualPage = GetDoc()->GetSdPage(nSelectedPage, mePageKind);
+ }
+ else
+ {
+ SdPage* pMaster = GetDoc()->GetMasterSdPage(nSelectedPage, mePageKind);
+
+ // does the selected page fit to the masterpage?
+ sal_uInt16 nPageCount = GetDoc()->GetSdPageCount(mePageKind);
+ for (sal_uInt16 i = 0; i < nPageCount; i++)
+ {
+ SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind);
+ if(pPage && pPage->IsSelected() && pMaster == &(pPage->TRG_GetMasterPage()))
+ {
+ mpActualPage = pPage;
+ break;
+ }
+ }
+
+ if (!mpActualPage)
+ {
+ // take the first page, that fits to the masterpage
+ for (sal_uInt16 i = 0; i < nPageCount; i++)
+ {
+ SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind);
+ if(pPage && pMaster == &(pPage->TRG_GetMasterPage()))
+ {
+ mpActualPage = pPage;
+ break;
+ }
+ }
+ }
+ }
+
+ for (sal_uInt16 i = 0; i < GetDoc()->GetSdPageCount(mePageKind); i++)
+ {
+ // deselect all pages
+ GetDoc()->SetSelected( GetDoc()->GetSdPage(i, mePageKind), false);
+ }
+
+ if (!mpActualPage)
+ {
+ // as far as there is no mpActualPage, take the first
+ mpActualPage = GetDoc()->GetSdPage(0, mePageKind);
+ }
+
+ // also select this page (mpActualPage always points at a drawing page,
+ // never at a masterpage)
+ GetDoc()->SetSelected(mpActualPage, true);
+
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ // notify LibreOfficeKit about changed page
+ OString aPayload = OString::number(nSelectedPage);
+ if (SfxViewShell* pViewShell = GetViewShell())
+ pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_SET_PART, aPayload.getStr());
+ }
+
+ rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetDoc() ) );
+ if( !xSlideshow.is() || !xSlideshow->isRunning() || ( xSlideshow->getAnimationMode() != ANIMATIONMODE_SHOW ) )
+ {
+ // tighten VisArea, to possibly deactivate objects
+ // !!! only if we are not in presentation mode (#96279) !!!
+ OSL_ASSERT (GetViewShell()!=nullptr);
+ GetViewShell()->DisconnectAllClients();
+ VisAreaChanged(::tools::Rectangle(Point(), Size(1, 1)));
+ }
+
+ // Try to prefetch all graphics for the active page. This will be done
+ // in threads to be more efficient than loading them on-demand one by one.
+ std::vector<Graphic*> graphics;
+ mpActualPage->getGraphicsForPrefetch(graphics);
+ if(graphics.size() > 1) // threading does not help with loading just one
+ GraphicFilter::GetGraphicFilter().MakeGraphicsAvailableThreaded(graphics);
+
+ if (meEditMode == EditMode::Page)
+ {
+ /**********************************************************************
+ * PAGEMODE
+ **********************************************************************/
+ GetDoc()->SetSelected(mpActualPage, true);
+
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+
+ if (pPageView)
+ {
+ mpFrameView->SetVisibleLayers( pPageView->GetVisibleLayers() );
+ mpFrameView->SetPrintableLayers( pPageView->GetPrintableLayers() );
+ mpFrameView->SetLockedLayers( pPageView->GetLockedLayers() );
+
+ if (mePageKind == PageKind::Notes)
+ {
+ mpFrameView->SetNotesHelpLines( pPageView->GetHelpLines() );
+ }
+ else if (mePageKind == PageKind::Handout)
+ {
+ mpFrameView->SetHandoutHelpLines( pPageView->GetHelpLines() );
+ }
+ else
+ {
+ mpFrameView->SetStandardHelpLines( pPageView->GetHelpLines() );
+ }
+ }
+
+ mpDrawView->HideSdrPage();
+ maTabControl->SetCurPageId(maTabControl->GetPageId(nSelectedPage));
+ mpDrawView->ShowSdrPage(mpActualPage);
+ GetViewShellBase().GetDrawController().FireSwitchCurrentPage(mpActualPage);
+
+ SdrPageView* pNewPageView = mpDrawView->GetSdrPageView();
+
+ if (pNewPageView)
+ {
+ pNewPageView->SetVisibleLayers( mpFrameView->GetVisibleLayers() );
+ pNewPageView->SetPrintableLayers( mpFrameView->GetPrintableLayers() );
+ pNewPageView->SetLockedLayers( mpFrameView->GetLockedLayers() );
+
+ if (mePageKind == PageKind::Notes)
+ {
+ pNewPageView->SetHelpLines( mpFrameView->GetNotesHelpLines() );
+ }
+ else if (mePageKind == PageKind::Handout)
+ {
+ pNewPageView->SetHelpLines( mpFrameView->GetHandoutHelpLines() );
+ }
+ else
+ {
+ pNewPageView->SetHelpLines( mpFrameView->GetStandardHelpLines() );
+ }
+ }
+
+ OUString aPageName = mpActualPage->GetName();
+
+ if (maTabControl->GetPageText(maTabControl->GetPageId(nSelectedPage)) != aPageName)
+ {
+ maTabControl->SetPageText(maTabControl->GetPageId(nSelectedPage), aPageName);
+ }
+ }
+ else
+ {
+ /**********************************************************************
+ * MASTERPAGE
+ **********************************************************************/
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+
+ if (pPageView)
+ {
+ mpFrameView->SetVisibleLayers( pPageView->GetVisibleLayers() );
+ mpFrameView->SetPrintableLayers( pPageView->GetPrintableLayers() );
+ mpFrameView->SetLockedLayers( pPageView->GetLockedLayers() );
+
+ if (mePageKind == PageKind::Notes)
+ {
+ mpFrameView->SetNotesHelpLines( pPageView->GetHelpLines() );
+ }
+ else if (mePageKind == PageKind::Handout)
+ {
+ mpFrameView->SetHandoutHelpLines( pPageView->GetHelpLines() );
+ }
+ else
+ {
+ mpFrameView->SetStandardHelpLines( pPageView->GetHelpLines() );
+ }
+ }
+
+ mpDrawView->HideSdrPage();
+ maTabControl->SetCurPageId(maTabControl->GetPageId(nSelectedPage));
+
+ SdPage* pMaster = GetDoc()->GetMasterSdPage(nSelectedPage, mePageKind);
+
+ if( !pMaster ) // if this page should not exist
+ pMaster = GetDoc()->GetMasterSdPage(0, mePageKind);
+
+ sal_uInt16 nNum = pMaster->GetPageNum();
+ mpDrawView->ShowSdrPage(mpDrawView->GetModel()->GetMasterPage(nNum));
+
+ GetViewShellBase().GetDrawController().FireSwitchCurrentPage(pMaster);
+
+ SdrPageView* pNewPageView = mpDrawView->GetSdrPageView();
+
+ if (pNewPageView)
+ {
+ pNewPageView->SetVisibleLayers( mpFrameView->GetVisibleLayers() );
+ pNewPageView->SetPrintableLayers( mpFrameView->GetPrintableLayers() );
+ pNewPageView->SetLockedLayers( mpFrameView->GetLockedLayers() );
+
+ if (mePageKind == PageKind::Notes)
+ {
+ pNewPageView->SetHelpLines( mpFrameView->GetNotesHelpLines() );
+ }
+ else if (mePageKind == PageKind::Handout)
+ {
+ pNewPageView->SetHelpLines( mpFrameView->GetHandoutHelpLines() );
+ }
+ else
+ {
+ pNewPageView->SetHelpLines( mpFrameView->GetStandardHelpLines() );
+ }
+ }
+
+ OUString aLayoutName(pMaster->GetLayoutName());
+ sal_Int32 nPos = aLayoutName.indexOf(SD_LT_SEPARATOR);
+ if (nPos != -1)
+ aLayoutName = aLayoutName.copy(0, nPos);
+
+ if (maTabControl->GetPageText(maTabControl->GetPageId(nSelectedPage)) != aLayoutName)
+ {
+ maTabControl->SetPageText(maTabControl->GetPageId(nSelectedPage), aLayoutName);
+ }
+
+ if( mePageKind == PageKind::Handout )
+ {
+ // set pages for all available handout presentation objects
+ sd::ShapeList& rShapeList = pMaster->GetPresentationShapeList();
+ SdrObject* pObj = nullptr;
+ rShapeList.seekShape(0);
+
+ while( (pObj = rShapeList.getNextShape()) )
+ {
+ if( pMaster->GetPresObjKind(pObj) == PresObjKind::Handout )
+ {
+ // #i105146# We want no content to be displayed for PageKind::Handout,
+ // so just never set a page as content
+ static_cast<SdrPageObj*>(pObj)->SetReferencedPage(nullptr);
+ }
+ }
+ }
+ }
+
+ Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel();
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) );
+ VisAreaChanged(aVisAreaWin);
+ mpDrawView->VisAreaChanged(GetActiveWindow()->GetOutDev());
+
+ // so navigator (and effect window) notice that
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate(SID_NAVIGATOR_STATE, true);
+ rBindings.Invalidate(SID_NAVIGATOR_PAGENAME, true);
+ rBindings.Invalidate(SID_STATUS_PAGE, true);
+ rBindings.Invalidate(SID_DELETE_MASTER_PAGE, true);
+ rBindings.Invalidate(SID_DELETE_PAGE, true);
+ rBindings.Invalidate(SID_ASSIGN_LAYOUT, true);
+ rBindings.Invalidate(SID_INSERTPAGE, true);
+ UpdatePreview( mpActualPage );
+
+ mpDrawView->AdjustMarkHdl();
+ }
+
+ return bOK;
+}
+
+/**
+ * Check if page change is allowed
+ */
+
+bool DrawViewShell::IsSwitchPageAllowed() const
+{
+ bool bOK = true;
+
+ FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell();
+ if (pFormShell != nullptr && !pFormShell->PrepareClose(false))
+ bOK = false;
+
+ return bOK;
+}
+
+/**
+ * Select new refreshed page, in case of a page order change (eg. by undo)
+ */
+
+void DrawViewShell::ResetActualLayer()
+{
+ LayerTabBar* pLayerBar = GetLayerTabControl();
+ if (pLayerBar == nullptr)
+ return;
+
+ // remember old tab count and current tab id
+ // this is needed when one layer is renamed to
+ // restore current tab
+ sal_uInt16 nOldLayerCnt = pLayerBar->GetPageCount(); // actually it is tab count
+ sal_uInt16 nOldLayerPos = pLayerBar->GetCurPageId(); // actually it is a tab nId
+
+ /**
+ * Update for LayerTab
+ */
+ pLayerBar->Clear();
+
+ OUString aName; // a real layer name
+ OUString aActiveLayer = mpDrawView->GetActiveLayer();
+ sal_uInt16 nActiveLayerPos = SDRLAYERPOS_NOTFOUND;
+ SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin();
+ sal_uInt16 nLayerCnt = rLayerAdmin.GetLayerCount();
+
+ for ( sal_uInt16 nLayerPos = 0; nLayerPos < nLayerCnt; nLayerPos++ )
+ {
+ aName = rLayerAdmin.GetLayer(nLayerPos)->GetName();
+
+ if ( aName == aActiveLayer )
+ {
+ nActiveLayerPos = nLayerPos;
+ }
+
+ if ( aName != sUNO_LayerName_background ) // layer "background" has never a tab
+ {
+ if (meEditMode == EditMode::MasterPage)
+ {
+ // don't show page layer onto the masterpage
+ if (aName != sUNO_LayerName_layout &&
+ aName != sUNO_LayerName_controls &&
+ aName != sUNO_LayerName_measurelines)
+ {
+ TabBarPageBits nBits = TabBarPageBits::NONE;
+ SdrPageView* pPV = mpDrawView->GetSdrPageView();
+ if (pPV)
+ {
+ if (!pPV->IsLayerVisible(aName))
+ {
+ nBits |= TabBarPageBits::Blue;
+ }
+ if (pPV->IsLayerLocked(aName))
+ {
+ nBits |= TabBarPageBits::Italic;
+ }
+ if (!pPV->IsLayerPrintable(aName))
+ {
+ nBits |= TabBarPageBits::Underline;
+ }
+ }
+
+ pLayerBar->InsertPage(nLayerPos+1, aName, nBits); // why +1? It is a nId, not a position. Position is APPEND.
+ }
+ }
+ else
+ {
+ // don't show masterpage layer onto the page
+ if (aName != sUNO_LayerName_background_objects)
+ {
+ TabBarPageBits nBits = TabBarPageBits::NONE;
+ if (!mpDrawView->GetSdrPageView()->IsLayerVisible(aName))
+ {
+ nBits = TabBarPageBits::Blue;
+ }
+ if (mpDrawView->GetSdrPageView()->IsLayerLocked(aName))
+ {
+ nBits |= TabBarPageBits::Italic;
+ }
+ if (!mpDrawView->GetSdrPageView()->IsLayerPrintable(aName))
+ {
+ nBits |= TabBarPageBits::Underline;
+ }
+
+ pLayerBar->InsertPage(nLayerPos+1, aName, nBits);// why +1?
+ }
+ }
+ }
+ }
+
+ if ( nActiveLayerPos == SDRLAYERPOS_NOTFOUND )
+ {
+ if( nOldLayerCnt == pLayerBar->GetPageCount() )
+ {
+ nActiveLayerPos = nOldLayerPos - 1;
+ }
+ else
+ {
+ nActiveLayerPos = ( meEditMode == EditMode::MasterPage ) ? 2 : 0;
+ }
+
+ mpDrawView->SetActiveLayer( pLayerBar->GetLayerName(nActiveLayerPos + 1) );// why +1?
+ }
+
+ pLayerBar->SetCurPageId(nActiveLayerPos + 1);
+ GetViewFrame()->GetBindings().Invalidate( SID_MODIFYLAYER );
+ GetViewFrame()->GetBindings().Invalidate( SID_DELETE_LAYER );
+}
+
+/**
+ * AcceptDrop
+ */
+
+sal_Int8 DrawViewShell::AcceptDrop (
+ const AcceptDropEvent& rEvt,
+ DropTargetHelper& rTargetHelper,
+ ::sd::Window* /*pTargetWindow*/,
+ sal_uInt16 /*nPage*/,
+ SdrLayerID nLayer )
+{
+ if( SlideShow::IsRunning( GetViewShellBase() ) )
+ return DND_ACTION_NONE;
+
+ return mpDrawView->AcceptDrop( rEvt, rTargetHelper, nLayer );
+}
+
+/**
+ * ExecuteDrop
+ */
+
+sal_Int8 DrawViewShell::ExecuteDrop (
+ const ExecuteDropEvent& rEvt,
+ DropTargetHelper& /*rTargetHelper*/,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer)
+{
+ if( nPage != SDRPAGE_NOTFOUND )
+ nPage = GetDoc()->GetSdPage( nPage, mePageKind )->GetPageNum();
+
+ if( SlideShow::IsRunning( GetViewShellBase() ) )
+ return DND_ACTION_NONE;
+
+ Broadcast(ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_START));
+ sal_Int8 nResult (mpDrawView->ExecuteDrop( rEvt, pTargetWindow, nPage, nLayer ));
+ Broadcast(ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_END));
+
+ return nResult;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviews2.cxx b/sd/source/ui/view/drviews2.cxx
new file mode 100644
index 000000000..8be942743
--- /dev/null
+++ b/sd/source/ui/view/drviews2.cxx
@@ -0,0 +1,4004 @@
+/* -*- 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 <config_features.h>
+
+#include <avmedia/mediaplayer.hxx>
+
+#include <basic/sberrors.hxx>
+#include <basic/sbstar.hxx>
+
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/drawing/XDrawPages.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
+#include <com/sun/star/ui/dialogs/XSLTFilterDialog.hpp>
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/util/URLTransformer.hpp>
+#include <com/sun/star/util/XURLTransformer.hpp>
+#include <com/sun/star/scanner/XScannerManager2.hpp>
+#include <com/sun/star/document/XDocumentProperties.hpp>
+
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertysequence.hxx>
+#include <comphelper/scopeguard.hxx>
+#include <comphelper/lok.hxx>
+
+#include <editeng/contouritem.hxx>
+#include <editeng/editdata.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/flditem.hxx>
+#include <editeng/section.hxx>
+#include <editeng/editobj.hxx>
+#include <editeng/CustomPropertyField.hxx>
+#include <editeng/urlfieldhelper.hxx>
+
+#include <sal/log.hxx>
+
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/msgpool.hxx>
+#include <sfx2/msg.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/zoomitem.hxx>
+
+#include <svx/compressgraphicdialog.hxx>
+#include <svx/ClassificationDialog.hxx>
+#include <svx/ClassificationCommon.hxx>
+#include <svx/bmpmask.hxx>
+#include <svx/extedit.hxx>
+#include <svx/extrusionbar.hxx>
+#include <svx/f3dchild.hxx>
+#include <svx/fontwork.hxx>
+#include <svx/fontworkbar.hxx>
+#include <svx/graphichelper.hxx>
+#include <svx/hlnkitem.hxx>
+#include <svx/imapdlg.hxx>
+#include <svx/sdtagitm.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdundo.hxx>
+#include <svx/svxdlg.hxx>
+#include <svx/svxids.hrc>
+#include <svx/sdtfsitm.hxx>
+#include <svx/sdmetitm.hxx>
+#include <svx/zoomslideritem.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xlnwtit.hxx>
+#include <svx/chrtitem.hxx>
+#include <svx/xlnclit.hxx>
+#include <svx/xflgrit.hxx>
+
+#include <tools/diagnose_ex.h>
+#include <tools/UnitConversion.hxx>
+
+#include <unotools/useroptions.hxx>
+
+#include <vcl/abstdlg.hxx>
+#include <vcl/graph.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/unohelp2.hxx>
+#include <vcl/weld.hxx>
+
+#include <editeng/cmapitem.hxx>
+#include <editeng/escapementitem.hxx>
+#include <editeng/kernitem.hxx>
+#include <editeng/wghtitem.hxx>
+#include <editeng/postitem.hxx>
+#include <editeng/udlnitem.hxx>
+#include <editeng/crossedoutitem.hxx>
+#include <editeng/shdditem.hxx>
+#include <editeng/numitem.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/SvxColorChildWindow.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/flstitem.hxx>
+#include <editeng/fontitem.hxx>
+#include <editeng/fhgtitem.hxx>
+#include <editeng/colritem.hxx>
+
+#include <svl/poolitem.hxx>
+#include <svl/style.hxx>
+#include <svl/whiter.hxx>
+
+#include <app.hrc>
+#include <strings.hrc>
+
+#include <AnimationChildWindow.hxx>
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <LayerTabBar.hxx>
+#include <Outliner.hxx>
+#include <ViewShellHint.hxx>
+#include <ViewShellImplementation.hxx>
+#include <Window.hxx>
+#include <drawdoc.hxx>
+#include <drawview.hxx>
+#include <fuarea.hxx>
+#include <fubullet.hxx>
+#include <fuchar.hxx>
+#include <fucushow.hxx>
+#include <fuconnct.hxx>
+#include <fucopy.hxx>
+#include <fudspord.hxx>
+#include <fuexecuteinteraction.hxx>
+#include <fuexpand.hxx>
+#include <fuinsert.hxx>
+#include <fuinsfil.hxx>
+#include <fuline.hxx>
+#include <fulinend.hxx>
+#include <fulink.hxx>
+#include <fumeasur.hxx>
+#include <fumorph.hxx>
+#include <fuoaprms.hxx>
+#include <fuolbull.hxx>
+#include <fupage.hxx>
+#include <fuparagr.hxx>
+#include <fuprlout.hxx>
+#include <fuscale.hxx>
+#include <fusel.hxx>
+#include <fusldlg.hxx>
+#include <fusnapln.hxx>
+#include <fusumry.hxx>
+#include <futempl.hxx>
+#include <futhes.hxx>
+#include <futransf.hxx>
+#include <futxtatt.hxx>
+#include <fuvect.hxx>
+#include <futext.hxx>
+#include <helpids.h>
+#include <sdabstdlg.hxx>
+#include <sdattr.hxx>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <unokywds.hxx>
+#include <slideshow.hxx>
+#include <stlsheet.hxx>
+#include <undolayer.hxx>
+#include <sfx2/sidebar/Sidebar.hxx>
+#include <sfx2/classificationhelper.hxx>
+#include <sdmod.hxx>
+#include <model/SlsPageDescriptor.hxx>
+#include <model/SlsPageEnumerationProvider.hxx>
+#include <SlideSorter.hxx>
+#include <view/SlideSorterView.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <tools/GraphicSizeCheck.hxx>
+
+#include <ViewShellBase.hxx>
+#include <memory>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+#define MIN_ACTIONS_FOR_DIALOG 5000 ///< if there are more meta objects, we show a dialog during the break up
+
+namespace sd {
+
+namespace {
+
+const SvxFieldItem* findField(editeng::Section const & rSection)
+{
+ for (SfxPoolItem const * pPool: rSection.maAttributes)
+ {
+ if (pPool->Which() == EE_FEATURE_FIELD)
+ return static_cast<const SvxFieldItem*>(pPool);
+ }
+ return nullptr;
+}
+
+bool hasCustomPropertyField(std::vector<editeng::Section> const & aSections, std::u16string_view rName)
+{
+ for (editeng::Section const & rSection : aSections)
+ {
+ const SvxFieldItem* pFieldItem = findField(rSection);
+ if (pFieldItem)
+ {
+ const editeng::CustomPropertyField* pCustomPropertyField = dynamic_cast<const editeng::CustomPropertyField*>(pFieldItem->GetField());
+ if (pCustomPropertyField && pCustomPropertyField->GetName() == rName)
+ return true;
+ }
+ }
+ return false;
+}
+
+OUString getWeightString(SfxItemSet const & rItemSet)
+{
+ OUString sWeightString = "NORMAL";
+
+ if (const SfxPoolItem* pItem = rItemSet.GetItem(EE_CHAR_WEIGHT, false))
+ {
+ const SvxWeightItem* pWeightItem = dynamic_cast<const SvxWeightItem*>(pItem);
+ if (pWeightItem && pWeightItem->GetWeight() == WEIGHT_BOLD)
+ sWeightString = "BOLD";
+ }
+ return sWeightString;
+}
+
+class ClassificationCommon
+{
+protected:
+ sd::DrawViewShell& m_rDrawViewShell;
+ uno::Reference<document::XDocumentProperties> m_xDocumentProperties;
+ uno::Reference<beans::XPropertyContainer> m_xPropertyContainer;
+ sfx::ClassificationKeyCreator m_aKeyCreator;
+public:
+ ClassificationCommon(sd::DrawViewShell& rDrawViewShell, const css::uno::Reference<css::document::XDocumentProperties>& rDocProps)
+ : m_rDrawViewShell(rDrawViewShell)
+ , m_xDocumentProperties(rDocProps)
+ , m_xPropertyContainer(m_xDocumentProperties->getUserDefinedProperties())
+ , m_aKeyCreator(SfxClassificationHelper::getPolicyType())
+ {}
+};
+
+class ClassificationCollector : public ClassificationCommon
+{
+private:
+ std::vector<svx::ClassificationResult> m_aResults;
+
+ void iterateSectionsAndCollect(std::vector<editeng::Section> const & rSections, EditTextObject const & rEditText)
+ {
+ sal_Int32 nCurrentParagraph = -1;
+ OUString sBlank;
+
+ for (editeng::Section const & rSection : rSections)
+ {
+ // Insert new paragraph if needed
+ while (nCurrentParagraph < rSection.mnParagraph)
+ {
+ nCurrentParagraph++;
+ // Get Weight of current paragraph
+ OUString sWeightProperty = getWeightString(rEditText.GetParaAttribs(nCurrentParagraph));
+ // Insert new paragraph into collection
+ m_aResults.push_back({ svx::ClassificationType::PARAGRAPH, sWeightProperty, sBlank, sBlank });
+ }
+
+ const SvxFieldItem* pFieldItem = findField(rSection);
+ const editeng::CustomPropertyField* pCustomPropertyField = pFieldItem ?
+ dynamic_cast<const editeng::CustomPropertyField*>(pFieldItem->GetField()) :
+ nullptr;
+ if (pCustomPropertyField)
+ {
+ const OUString& aKey = pCustomPropertyField->GetName();
+ if (m_aKeyCreator.isMarkingTextKey(aKey))
+ {
+ OUString aValue = svx::classification::getProperty(m_xPropertyContainer, aKey);
+ m_aResults.push_back({ svx::ClassificationType::TEXT, aValue, sBlank, sBlank });
+ }
+ else if (m_aKeyCreator.isCategoryNameKey(aKey) || m_aKeyCreator.isCategoryIdentifierKey(aKey))
+ {
+ OUString aValue = svx::classification::getProperty(m_xPropertyContainer, aKey);
+ m_aResults.push_back({ svx::ClassificationType::CATEGORY, aValue, sBlank, sBlank });
+ }
+ else if (m_aKeyCreator.isMarkingKey(aKey))
+ {
+ OUString aValue = svx::classification::getProperty(m_xPropertyContainer, aKey);
+ m_aResults.push_back({ svx::ClassificationType::MARKING, aValue, sBlank, sBlank });
+ }
+ else if (m_aKeyCreator.isIntellectualPropertyPartKey(aKey))
+ {
+ OUString aValue = svx::classification::getProperty(m_xPropertyContainer, aKey);
+ m_aResults.push_back({ svx::ClassificationType::INTELLECTUAL_PROPERTY_PART, aValue, sBlank, sBlank });
+ }
+ }
+ }
+ }
+
+public:
+ ClassificationCollector(sd::DrawViewShell & rDrawViewShell, const css::uno::Reference<css::document::XDocumentProperties>& rDocProps)
+ : ClassificationCommon(rDrawViewShell, rDocProps)
+ {}
+
+ std::vector<svx::ClassificationResult> const & getResults() const
+ {
+ return m_aResults;
+ }
+
+ void collect()
+ {
+ // Set to MASTER mode
+ EditMode eOldMode = m_rDrawViewShell.GetEditMode();
+ if (eOldMode != EditMode::MasterPage)
+ m_rDrawViewShell.ChangeEditMode(EditMode::MasterPage, false);
+
+ // Scoped guard to revert to the previous mode
+ comphelper::ScopeGuard const aGuard([this, eOldMode] () {
+ m_rDrawViewShell.ChangeEditMode(eOldMode, false);
+ });
+
+ const sal_uInt16 nCount = m_rDrawViewShell.GetDoc()->GetMasterSdPageCount(PageKind::Standard);
+
+ for (sal_uInt16 nPageIndex = 0; nPageIndex < nCount; ++nPageIndex)
+ {
+ SdPage* pMasterPage = m_rDrawViewShell.GetDoc()->GetMasterSdPage(nPageIndex, PageKind::Standard);
+ for (size_t nObject = 0; nObject < pMasterPage->GetObjCount(); ++nObject)
+ {
+ SdrObject* pObject = pMasterPage->GetObj(nObject);
+ SdrRectObj* pRectObject = dynamic_cast<SdrRectObj*>(pObject);
+ if (pRectObject && pRectObject->GetTextKind() == SdrObjKind::Text)
+ {
+ OutlinerParaObject* pOutlinerParagraphObject = pRectObject->GetOutlinerParaObject();
+ if (pOutlinerParagraphObject)
+ {
+ const EditTextObject& rEditText = pOutlinerParagraphObject->GetTextObject();
+ std::vector<editeng::Section> aSections;
+ rEditText.GetAllSections(aSections);
+
+ // Search for a custom property field that has the classification category identifier key
+ if (hasCustomPropertyField(aSections, m_aKeyCreator.makeCategoryNameKey()))
+ {
+ iterateSectionsAndCollect(aSections, rEditText);
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+};
+
+class ClassificationInserter : public ClassificationCommon
+{
+private:
+ /// Delete the previous existing classification object(s) - if they exist
+ void deleteExistingObjects()
+ {
+ OUString sKey = m_aKeyCreator.makeCategoryNameKey();
+
+ const sal_uInt16 nCount = m_rDrawViewShell.GetDoc()->GetMasterSdPageCount(PageKind::Standard);
+
+ for (sal_uInt16 nPageIndex = 0; nPageIndex < nCount; ++nPageIndex)
+ {
+ SdPage* pMasterPage = m_rDrawViewShell.GetDoc()->GetMasterSdPage(nPageIndex, PageKind::Standard);
+ for (size_t nObject = 0; nObject < pMasterPage->GetObjCount(); ++nObject)
+ {
+ SdrObject* pObject = pMasterPage->GetObj(nObject);
+ SdrRectObj* pRectObject = dynamic_cast<SdrRectObj*>(pObject);
+ if (pRectObject && pRectObject->GetTextKind() == SdrObjKind::Text)
+ {
+ OutlinerParaObject* pOutlinerParagraphObject = pRectObject->GetOutlinerParaObject();
+ if (pOutlinerParagraphObject)
+ {
+ const EditTextObject& rEditText = pOutlinerParagraphObject->GetTextObject();
+ std::vector<editeng::Section> aSections;
+ rEditText.GetAllSections(aSections);
+
+ if (hasCustomPropertyField(aSections, sKey))
+ {
+ pMasterPage->RemoveObject(pRectObject->GetOrdNum());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ void fillTheOutliner(Outliner* pOutliner, std::vector<svx::ClassificationResult> const & rResults)
+ {
+ sal_Int32 nParagraph = -1;
+ for (svx::ClassificationResult const & rResult : rResults)
+ {
+
+ ESelection aPosition(nParagraph, EE_TEXTPOS_MAX_COUNT, nParagraph, EE_TEXTPOS_MAX_COUNT);
+
+ switch (rResult.meType)
+ {
+ case svx::ClassificationType::TEXT:
+ {
+ OUString sKey = m_aKeyCreator.makeNumberedTextKey();
+ svx::classification::addOrInsertDocumentProperty(m_xPropertyContainer, sKey, rResult.msName);
+ pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey, rResult.msName), EE_FEATURE_FIELD), aPosition);
+ }
+ break;
+
+ case svx::ClassificationType::CATEGORY:
+ {
+ OUString sKey = m_aKeyCreator.makeCategoryNameKey();
+ pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey, rResult.msName), EE_FEATURE_FIELD), aPosition);
+ }
+ break;
+
+ case svx::ClassificationType::MARKING:
+ {
+ OUString sKey = m_aKeyCreator.makeNumberedMarkingKey();
+ svx::classification::addOrInsertDocumentProperty(m_xPropertyContainer, sKey, rResult.msName);
+ pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey, rResult.msName), EE_FEATURE_FIELD), aPosition);
+ }
+ break;
+
+ case svx::ClassificationType::INTELLECTUAL_PROPERTY_PART:
+ {
+ OUString sKey = m_aKeyCreator.makeNumberedIntellectualPropertyPartKey();
+ svx::classification::addOrInsertDocumentProperty(m_xPropertyContainer, sKey, rResult.msName);
+ pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey, rResult.msName), EE_FEATURE_FIELD), aPosition);
+ }
+ break;
+
+ case svx::ClassificationType::PARAGRAPH:
+ {
+ nParagraph++;
+ pOutliner->Insert("");
+
+ SfxItemSetFixed<EE_ITEMS_START, EE_ITEMS_END> aItemSet(m_rDrawViewShell.GetDoc()->GetPool());
+
+ if (rResult.msName == "BOLD")
+ aItemSet.Put(SvxWeightItem(WEIGHT_BOLD, EE_CHAR_WEIGHT));
+ else
+ aItemSet.Put(SvxWeightItem(WEIGHT_NORMAL, EE_CHAR_WEIGHT));
+
+ SvxNumRule aDefaultNumRule(SvxNumRuleFlags::NONE, 0, false);
+ aItemSet.Put(SvxNumBulletItem(std::move(aDefaultNumRule), EE_PARA_NUMBULLET));
+
+ pOutliner->SetParaAttribs(nParagraph, aItemSet);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+public:
+ ClassificationInserter(sd::DrawViewShell & rDrawViewShell, const css::uno::Reference<css::document::XDocumentProperties>& rDocProps)
+ : ClassificationCommon(rDrawViewShell, rDocProps)
+ {
+ }
+
+ void insert(std::vector<svx::ClassificationResult> const & rResults)
+ {
+ // Set to MASTER mode
+ EditMode eOldMode = m_rDrawViewShell.GetEditMode();
+ if (eOldMode != EditMode::MasterPage)
+ m_rDrawViewShell.ChangeEditMode(EditMode::MasterPage, false);
+
+ // Scoped guard to revert the mode
+ comphelper::ScopeGuard const aGuard([this, eOldMode] () {
+ m_rDrawViewShell.ChangeEditMode(eOldMode, false);
+ });
+
+ // Delete the previous existing object - if exists
+ deleteExistingObjects();
+
+ // Clear properties
+ svx::classification::removeAllProperties(m_xPropertyContainer);
+
+ SfxClassificationHelper aHelper(m_xDocumentProperties);
+
+ // Apply properties from the BA policy
+ for (svx::ClassificationResult const & rResult : rResults)
+ {
+ if (rResult.meType == svx::ClassificationType::CATEGORY)
+ aHelper.SetBACName(rResult.msName, SfxClassificationHelper::getPolicyType());
+ }
+
+ // Insert full text as document property
+ svx::classification::insertFullTextualRepresentationAsDocumentProperty(m_xPropertyContainer, m_aKeyCreator, rResults);
+
+ // Create the outliner from the
+ Outliner* pOutliner = m_rDrawViewShell.GetDoc()->GetInternalOutliner();
+ OutlinerMode eOutlinerMode = pOutliner->GetOutlinerMode();
+
+ comphelper::ScopeGuard const aOutlinerGuard([pOutliner, eOutlinerMode] () {
+ pOutliner->Init(eOutlinerMode);
+ });
+
+ pOutliner->Init(OutlinerMode::TextObject);
+
+ // Fill the outliner with the text from classification result
+ fillTheOutliner(pOutliner, rResults);
+
+ // Calculate to outliner text size
+ pOutliner->UpdateFields();
+ pOutliner->SetUpdateLayout(true);
+ Size aTextSize(pOutliner->CalcTextSize());
+ pOutliner->SetUpdateLayout(false);
+
+ // Create objects, apply the outliner and add them (objects) to all master pages
+ const sal_uInt16 nCount = m_rDrawViewShell.GetDoc()->GetMasterSdPageCount(PageKind::Standard);
+
+ for (sal_uInt16 nPageIndex = 0; nPageIndex < nCount; ++nPageIndex)
+ {
+ SdPage* pMasterPage = m_rDrawViewShell.GetDoc()->GetMasterSdPage(nPageIndex, PageKind::Standard);
+ if (!pMasterPage)
+ continue;
+
+ SdrRectObj* pObject = new SdrRectObj(
+ *m_rDrawViewShell.GetDoc(), // TTTT should be reference
+ SdrObjKind::Text);
+ pObject->SetMergedItem(makeSdrTextAutoGrowWidthItem(true));
+ pObject->SetOutlinerParaObject(pOutliner->CreateParaObject());
+ pMasterPage->InsertObject(pObject);
+
+ // Calculate position
+ ::tools::Rectangle aRectangle(Point(), pMasterPage->GetSize());
+ Point aPosition(aRectangle.Center().X(), aRectangle.Bottom());
+
+ aPosition.AdjustX( -(aTextSize.Width() / 2) );
+ aPosition.AdjustY( -(aTextSize.Height()) );
+
+ pObject->SetLogicRect(::tools::Rectangle(aPosition, aTextSize));
+ }
+ }
+};
+
+ void lcl_convertStringArguments(sal_uInt16 nSlot, const std::unique_ptr<SfxItemSet>& pArgs)
+ {
+ Color aColor;
+ const SfxPoolItem* pItem = nullptr;
+
+ if (SfxItemState::SET == pArgs->GetItemState(SID_ATTR_LINE_WIDTH_ARG, false, &pItem))
+ {
+ double fValue = static_cast<const SvxDoubleItem*>(pItem)->GetValue();
+ // FIXME: different units...
+ int nPow = 100;
+ int nValue = fValue * nPow;
+
+ XLineWidthItem aItem(nValue);
+ pArgs->Put(aItem);
+ }
+ if (SfxItemState::SET == pArgs->GetItemState(SID_ATTR_COLOR_STR, false, &pItem))
+ {
+ OUString sColor = static_cast<const SfxStringItem*>(pItem)->GetValue();
+
+ if (sColor == "transparent")
+ aColor = COL_TRANSPARENT;
+ else
+ aColor = Color(ColorTransparency, sColor.toInt32(16));
+
+ switch (nSlot)
+ {
+ case SID_ATTR_LINE_COLOR:
+ {
+ XLineColorItem aLineColorItem(OUString(), aColor);
+ pArgs->Put(aLineColorItem);
+ break;
+ }
+
+ case SID_ATTR_FILL_COLOR:
+ {
+ XFillColorItem aFillColorItem(OUString(), aColor);
+ pArgs->Put(aFillColorItem);
+ break;
+ }
+ }
+ }
+ if (SfxItemState::SET == pArgs->GetItemState(SID_FILL_GRADIENT_JSON, false, &pItem))
+ {
+ const SfxStringItem* pJSON = static_cast<const SfxStringItem*>(pItem);
+ if (pJSON)
+ {
+ XGradient aGradient = XGradient::fromJSON(pJSON->GetValue());
+ XFillGradientItem aItem(aGradient);
+ pArgs->Put(aItem);
+ }
+ }
+
+ if (nSlot == SID_ATTR_FILL_COLOR)
+ {
+ // Merge the color parameters to the color itself.
+ const XFillColorItem* pColorItem = static_cast<const XFillColorItem*>(pArgs->GetItem(SID_ATTR_FILL_COLOR));
+ if (pColorItem)
+ {
+ XFillColorItem aColorItem(*pColorItem);
+ if (pArgs->GetItemState(SID_ATTR_COLOR_THEME_INDEX, false, &pItem) == SfxItemState::SET)
+ {
+ auto pIntItem = static_cast<const SfxInt16Item*>(pItem);
+ aColorItem.GetThemeColor().SetThemeIndex(pIntItem->GetValue());
+ }
+ if (pArgs->GetItemState(SID_ATTR_COLOR_LUM_MOD, false, &pItem) == SfxItemState::SET)
+ {
+ auto pIntItem = static_cast<const SfxInt16Item*>(pItem);
+ aColorItem.GetThemeColor().SetLumMod(pIntItem->GetValue());
+ }
+ if (pArgs->GetItemState(SID_ATTR_COLOR_LUM_OFF, false, &pItem) == SfxItemState::SET)
+ {
+ auto pIntItem = static_cast<const SfxInt16Item*>(pItem);
+ aColorItem.GetThemeColor().SetLumOff(pIntItem->GetValue());
+ }
+ pArgs->Put(aColorItem);
+ }
+ }
+ }
+}
+
+/**
+ * SfxRequests for temporary actions
+ */
+
+void DrawViewShell::FuTemporary(SfxRequest& rReq)
+{
+ // during a native slide show nothing gets executed!
+ if(SlideShow::IsRunning( GetViewShellBase() ) && (rReq.GetSlot() != SID_NAVIGATOR))
+ return;
+
+ DBG_ASSERT( mpDrawView, "sd::DrawViewShell::FuTemporary(), no draw view!" );
+ if( !mpDrawView )
+ return;
+
+ CheckLineTo (rReq);
+
+ DeactivateCurrentFunction();
+
+ sal_uInt16 nSId = rReq.GetSlot();
+
+ switch ( nSId )
+ {
+ case SID_OUTLINE_TEXT_AUTOFIT:
+ {
+ SfxUndoManager* pUndoManager = GetDocSh()->GetUndoManager();
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ if( rMarkList.GetMarkCount() == 1 )
+ {
+ pUndoManager->EnterListAction("", "", 0, GetViewShellBase().GetViewShellId());
+ mpDrawView->BegUndo();
+
+ SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ bool bSet = pObj->GetMergedItemSet().GetItem<SdrTextFitToSizeTypeItem>(SDRATTR_TEXT_FITTOSIZE)->GetValue() != drawing::TextFitToSizeType_NONE;
+
+ mpDrawView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoAttrObject(*pObj));
+
+ if (!bSet)
+ {
+ //If we are turning on AutoFit we have to turn these off if already on
+ if (pObj->GetMergedItemSet().GetItem<SdrOnOffItem>(SDRATTR_TEXT_AUTOGROWHEIGHT)->GetValue())
+ pObj->SetMergedItem(makeSdrTextAutoGrowHeightItem(false));
+ if (pObj->GetMergedItemSet().GetItem<SdrOnOffItem>(SDRATTR_TEXT_AUTOGROWWIDTH)->GetValue())
+ pObj->SetMergedItem(makeSdrTextAutoGrowWidthItem(false));
+ }
+
+ pObj->SetMergedItem(SdrTextFitToSizeTypeItem(bSet ? drawing::TextFitToSizeType_NONE : drawing::TextFitToSizeType_AUTOFIT));
+
+ mpDrawView->EndUndo();
+ pUndoManager->LeaveListAction();
+ }
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ // area and line attributes: shall have
+ // an own Execute method (like StateMethode)
+ case SID_ATTR_FILL_STYLE:
+ case SID_ATTR_FILL_COLOR:
+ case SID_ATTR_FILL_GRADIENT:
+ case SID_ATTR_FILL_HATCH:
+ case SID_ATTR_FILL_BITMAP:
+ case SID_ATTR_FILL_SHADOW:
+ case SID_ATTR_SHADOW_COLOR:
+ case SID_ATTR_SHADOW_TRANSPARENCE:
+ case SID_ATTR_SHADOW_BLUR:
+ case SID_ATTR_SHADOW_XDISTANCE:
+ case SID_ATTR_SHADOW_YDISTANCE:
+ case SID_ATTR_FILL_USE_SLIDE_BACKGROUND:
+ case SID_ATTR_FILL_TRANSPARENCE:
+ case SID_ATTR_FILL_FLOATTRANSPARENCE:
+
+ case SID_ATTR_LINE_STYLE:
+ case SID_ATTR_LINE_DASH:
+ case SID_ATTR_LINE_WIDTH:
+ case SID_ATTR_LINE_COLOR:
+ case SID_ATTR_LINEEND_STYLE:
+ case SID_ATTR_LINE_START:
+ case SID_ATTR_LINE_END:
+ case SID_ATTR_LINE_TRANSPARENCE:
+ case SID_ATTR_LINE_JOINT:
+ case SID_ATTR_LINE_CAP:
+
+ case SID_ATTR_TEXT_FITTOSIZE:
+ {
+ if( rReq.GetArgs() )
+ {
+ std::unique_ptr<SfxItemSet> pNewArgs = rReq.GetArgs()->Clone();
+ lcl_convertStringArguments(rReq.GetSlot(), pNewArgs);
+ mpDrawView->SetAttributes(*pNewArgs);
+ rReq.Done();
+ }
+ else
+ {
+ switch( rReq.GetSlot() )
+ {
+ case SID_ATTR_FILL_SHADOW:
+ case SID_ATTR_SHADOW_COLOR:
+ case SID_ATTR_SHADOW_TRANSPARENCE:
+ case SID_ATTR_SHADOW_BLUR:
+ case SID_ATTR_SHADOW_XDISTANCE:
+ case SID_ATTR_SHADOW_YDISTANCE:
+ case SID_ATTR_FILL_STYLE:
+ case SID_ATTR_FILL_COLOR:
+ case SID_ATTR_FILL_GRADIENT:
+ case SID_ATTR_FILL_HATCH:
+ case SID_ATTR_FILL_BITMAP:
+ case SID_ATTR_FILL_USE_SLIDE_BACKGROUND:
+ case SID_ATTR_FILL_TRANSPARENCE:
+ case SID_ATTR_FILL_FLOATTRANSPARENCE:
+ GetViewFrame()->GetDispatcher()->Execute( SID_ATTRIBUTES_AREA, SfxCallMode::ASYNCHRON );
+ break;
+ case SID_ATTR_LINE_STYLE:
+ case SID_ATTR_LINE_DASH:
+ case SID_ATTR_LINE_WIDTH:
+ case SID_ATTR_LINE_COLOR:
+ case SID_ATTR_LINE_TRANSPARENCE:
+ case SID_ATTR_LINE_JOINT:
+ case SID_ATTR_LINE_CAP:
+ GetViewFrame()->GetDispatcher()->Execute( SID_ATTRIBUTES_LINE, SfxCallMode::ASYNCHRON );
+ break;
+ case SID_ATTR_TEXT_FITTOSIZE:
+ GetViewFrame()->GetDispatcher()->Execute( SID_TEXTATTR_DLG, SfxCallMode::ASYNCHRON );
+ break;
+ }
+ }
+ Cancel();
+ }
+ break;
+
+ case SID_HYPHENATION:
+ {
+ const SfxBoolItem* pItem = rReq.GetArg<SfxBoolItem>(SID_HYPHENATION);
+
+ if( pItem )
+ {
+ SfxItemSetFixed<EE_PARA_HYPHENATE, EE_PARA_HYPHENATE> aSet( GetPool() );
+ bool bValue = pItem->GetValue();
+ aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, bValue ) );
+ mpDrawView->SetAttributes( aSet );
+ }
+ else // only for testing purpose
+ {
+ OSL_FAIL(" no value for hyphenation!");
+ SfxItemSetFixed<EE_PARA_HYPHENATE, EE_PARA_HYPHENATE> aSet( GetPool() );
+ aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, true ) );
+ mpDrawView->SetAttributes( aSet );
+ }
+ rReq.Done();
+ Cancel();
+ }
+ break;
+
+ case SID_INSERTPAGE:
+ case SID_INSERTPAGE_QUICK:
+ {
+ SdPage* pNewPage = CreateOrDuplicatePage (rReq, mePageKind, GetActualPage());
+ Cancel();
+ if(HasCurrentFunction(SID_BEZIER_EDIT) )
+ GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+ if (pNewPage != nullptr)
+ SwitchPage((pNewPage->GetPageNum()-1)/2);
+ rReq.Done ();
+ }
+ break;
+
+ case SID_DUPLICATE_PAGE:
+ {
+ auto slideSorter = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase());
+ SdPage* pNewPage = nullptr;
+ if(slideSorter)
+ DuplicateSelectedSlides(rReq);
+ else
+ pNewPage = CreateOrDuplicatePage (rReq, mePageKind, GetActualPage());
+ Cancel();
+ if(HasCurrentFunction(SID_BEZIER_EDIT) )
+ GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+ if(!slideSorter && pNewPage != nullptr)
+ SwitchPage((pNewPage->GetPageNum()-1)/2);
+ rReq.Done();
+ }
+ break;
+
+ case SID_INSERT_MASTER_PAGE:
+ {
+ // Use the API to create a new page.
+ Reference<drawing::XMasterPagesSupplier> xMasterPagesSupplier (
+ GetDoc()->getUnoModel(), UNO_QUERY);
+ if (xMasterPagesSupplier.is())
+ {
+ Reference<drawing::XDrawPages> xMasterPages (
+ xMasterPagesSupplier->getMasterPages());
+ if (xMasterPages.is())
+ {
+ sal_uInt16 nIndex = GetCurPagePos() + 1;
+ xMasterPages->insertNewByIndex (nIndex);
+
+ // Create shapes for the default layout.
+ SdPage* pMasterPage = GetDoc()->GetMasterSdPage(
+ nIndex, PageKind::Standard);
+ pMasterPage->CreateTitleAndLayout (true,true);
+ }
+ }
+
+ Cancel();
+ if(HasCurrentFunction(SID_BEZIER_EDIT))
+ GetViewFrame()->GetDispatcher()->Execute(
+ SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+ rReq.Done ();
+ }
+ break;
+
+ case SID_MODIFYPAGE:
+ {
+ if (mePageKind==PageKind::Standard || mePageKind==PageKind::Notes ||
+ (mePageKind==PageKind::Handout && meEditMode==EditMode::MasterPage) )
+ {
+ if ( mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+ sal_uInt16 nPage = maTabControl->GetCurPagePos();
+ mpActualPage = GetDoc()->GetSdPage(nPage, mePageKind);
+ ::sd::ViewShell::mpImpl->ProcessModifyPageSlot (
+ rReq,
+ mpActualPage,
+ mePageKind);
+ }
+
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_ASSIGN_LAYOUT:
+ {
+ if (mePageKind==PageKind::Standard || mePageKind==PageKind::Notes || (mePageKind==PageKind::Handout && meEditMode==EditMode::MasterPage))
+ {
+ if ( mpDrawView->IsTextEdit() )
+ mpDrawView->SdrEndTextEdit();
+
+ ::sd::ViewShell::mpImpl->AssignLayout(rReq, mePageKind);
+ }
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_RENAMEPAGE:
+ case SID_RENAME_MASTER_PAGE:
+ {
+ if (mePageKind==PageKind::Standard || mePageKind==PageKind::Notes )
+ {
+ if ( mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+
+ sal_uInt16 nPage = maTabControl->GetCurPagePos();
+ SdPage* pCurrentPage = ( GetEditMode() == EditMode::Page )
+ ? GetDoc()->GetSdPage( nPage, GetPageKind() )
+ : GetDoc()->GetMasterSdPage( nPage, GetPageKind() );
+
+ OUString aTitle = SdResId(STR_TITLE_RENAMESLIDE);
+ OUString aDescr = SdResId(STR_DESC_RENAMESLIDE);
+ const OUString& aPageName = pCurrentPage->GetName();
+
+ if(rReq.GetArgs())
+ {
+ OUString aName = rReq.GetArgs()->GetItem<const SfxStringItem>(SID_RENAMEPAGE)->GetValue();
+
+ bool bResult = RenameSlide( maTabControl->GetPageId(nPage), aName );
+ DBG_ASSERT( bResult, "Couldn't rename slide" );
+ }
+ else
+ {
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractSvxNameDialog> aNameDlg(pFact->CreateSvxNameDialog(GetFrameWeld(), aPageName, aDescr));
+ aNameDlg->SetText( aTitle );
+ aNameDlg->SetCheckNameHdl( LINK( this, DrawViewShell, RenameSlideHdl ), true );
+ aNameDlg->SetEditHelpId( HID_SD_NAMEDIALOG_PAGE );
+
+ if( aNameDlg->Execute() == RET_OK )
+ {
+ OUString aNewName;
+ aNameDlg->GetName( aNewName );
+ if (aNewName != aPageName)
+ {
+ bool bResult = RenameSlide( maTabControl->GetPageId(nPage), aNewName );
+ DBG_ASSERT( bResult, "Couldn't rename slide" );
+ }
+ }
+ }
+ }
+ Cancel();
+ rReq.Ignore();
+ }
+ break;
+
+ case SID_RENAMEPAGE_QUICK:
+ {
+ if (mePageKind==PageKind::Standard || mePageKind==PageKind::Notes )
+ {
+ if ( mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+
+ maTabControl->StartEditMode( maTabControl->GetCurPageId() );
+ }
+
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_PAGESIZE : // either this (no menu entries or something else!)
+ {
+ const SfxItemSet *pArgs = rReq.GetArgs ();
+
+ if (pArgs && pArgs->Count () == 3)
+ {
+ const SfxUInt32Item* pWidth = rReq.GetArg<SfxUInt32Item>(ID_VAL_PAGEWIDTH);
+ const SfxUInt32Item* pHeight = rReq.GetArg<SfxUInt32Item>(ID_VAL_PAGEHEIGHT);
+ const SfxBoolItem* pScaleAll = rReq.GetArg<SfxBoolItem>(ID_VAL_SCALEOBJECTS);
+
+ Size aSize (pWidth->GetValue (), pHeight->GetValue ());
+
+ SetupPage (aSize, 0, 0, 0, 0, true, false, pScaleAll->GetValue ());
+ rReq.Ignore ();
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ rReq.Ignore ();
+ break;
+ }
+
+ case SID_PAGEMARGIN : // or this (no menu entries or something else!)
+ {
+ const SfxItemSet *pArgs = rReq.GetArgs ();
+
+ if (pArgs && pArgs->Count () == 5)
+ {
+ const SfxUInt32Item* pLeft = rReq.GetArg<SfxUInt32Item>(ID_VAL_PAGELEFT);
+ const SfxUInt32Item* pRight = rReq.GetArg<SfxUInt32Item>(ID_VAL_PAGERIGHT);
+ const SfxUInt32Item* pUpper = rReq.GetArg<SfxUInt32Item>(ID_VAL_PAGETOP);
+ const SfxUInt32Item* pLower = rReq.GetArg<SfxUInt32Item>(ID_VAL_PAGEBOTTOM);
+ const SfxBoolItem* pScaleAll = rReq.GetArg<SfxBoolItem>(ID_VAL_SCALEOBJECTS);
+
+ Size aEmptySize (0, 0);
+
+ SetupPage (aEmptySize, pLeft->GetValue (), pRight->GetValue (),
+ pUpper->GetValue (), pLower->GetValue (),
+ false, true, pScaleAll->GetValue ());
+ rReq.Ignore ();
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ rReq.Ignore ();
+ break;
+ }
+
+ case SID_ATTR_ZOOMSLIDER:
+ {
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ const SfxUInt16Item* pScale = (pArgs && pArgs->Count () == 1) ?
+ rReq.GetArg(SID_ATTR_ZOOMSLIDER) : nullptr;
+ if (pScale && CHECK_RANGE (5, pScale->GetValue (), 3000))
+ {
+ SetZoom (pScale->GetValue ());
+
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_ATTR_ZOOM );
+ rBindings.Invalidate( SID_ZOOM_IN );
+ rBindings.Invalidate( SID_ZOOM_OUT );
+ rBindings.Invalidate( SID_ATTR_ZOOMSLIDER );
+
+ }
+
+ Cancel();
+ rReq.Done ();
+ break;
+ }
+
+ case SID_ATTR_ZOOM:
+ {
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ mbZoomOnPage = false;
+
+ if ( pArgs )
+ {
+ SvxZoomType eZT = pArgs->Get( SID_ATTR_ZOOM ).GetType();
+ switch( eZT )
+ {
+ case SvxZoomType::PERCENT:
+ SetZoom( static_cast<::tools::Long>( pArgs->Get( SID_ATTR_ZOOM ).GetValue()) );
+ break;
+
+ case SvxZoomType::OPTIMAL:
+ GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_ALL,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+ break;
+
+ case SvxZoomType::PAGEWIDTH:
+ GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_PAGE_WIDTH,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+ break;
+
+ case SvxZoomType::WHOLEPAGE:
+ GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_PAGE,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+ break;
+ case SvxZoomType::PAGEWIDTH_NOBORDER:
+ OSL_FAIL("sd::DrawViewShell::FuTemporary(), SvxZoomType::PAGEWIDTH_NOBORDER not handled!" );
+ break;
+ }
+ rReq.Ignore ();
+ }
+ else
+ {
+ // open zoom dialog
+ SetCurrentFunction( FuScale::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ }
+ Cancel();
+ }
+ break;
+
+ case SID_CHANGEBEZIER:
+ case SID_CHANGEPOLYGON:
+ if ( mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+ }
+
+ if ( mpDrawView->IsPresObjSelected() )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ if( rReq.GetSlot() == SID_CHANGEBEZIER )
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->ConvertMarkedToPathObj(false);
+ }
+ else
+ {
+ if( mpDrawView->IsVectorizeAllowed() )
+ {
+ SetCurrentFunction( FuVectorize::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ }
+ else
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->ConvertMarkedToPolyObj();
+ }
+ }
+
+ Invalidate(SID_CHANGEBEZIER);
+ Invalidate(SID_CHANGEPOLYGON);
+ }
+ Cancel();
+
+ if( HasCurrentFunction(SID_BEZIER_EDIT) )
+ { // where applicable, activate right edit action
+ GetViewFrame()->GetDispatcher()->Execute(SID_SWITCH_POINTEDIT,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ }
+ rReq.Ignore ();
+ break;
+
+ case SID_CONVERT_TO_CONTOUR:
+ if ( mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+ }
+
+ if ( mpDrawView->IsPresObjSelected() )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->ConvertMarkedToPathObj(true);
+
+ Invalidate(SID_CONVERT_TO_CONTOUR);
+ }
+ Cancel();
+
+ rReq.Ignore ();
+ break;
+
+ case SID_CONVERT_TO_METAFILE:
+ case SID_CONVERT_TO_BITMAP:
+ {
+ // End text edit mode when it is active because the metafile or
+ // bitmap that will be created does not support it.
+ if ( mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+ }
+
+ if ( mpDrawView->IsPresObjSelected(true,true,true) )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+
+ // create SdrGrafObj from metafile/bitmap
+ Graphic aGraphic;
+ switch (nSId)
+ {
+ case SID_CONVERT_TO_METAFILE:
+ {
+ // switch on undo for the next operations
+ mpDrawView->BegUndo(SdResId(STR_UNDO_CONVERT_TO_METAFILE));
+ GDIMetaFile aMetaFile(mpDrawView->GetMarkedObjMetaFile());
+ aGraphic = Graphic(aMetaFile);
+ }
+ break;
+ case SID_CONVERT_TO_BITMAP:
+ {
+ // Disable spelling during conversion
+ bool bOnlineSpell = GetDoc()->GetOnlineSpell();
+ GetDoc()->SetOnlineSpell(false);
+
+ // switch on undo for the next operations
+ mpDrawView->BegUndo(SdResId(STR_UNDO_CONVERT_TO_BITMAP));
+ bool bDone(false);
+
+ // I have to get the image here directly since GetMarkedObjBitmapEx works
+ // based on Bitmaps, but not on BitmapEx, thus throwing away the alpha
+ // channel. Argh! GetMarkedObjBitmapEx itself is too widely used to safely
+ // change that, e.g. in the exchange formats. For now I can only add this
+ // exception to get good results for Svgs. This is how the code gets more
+ // and more crowded, at last I made a remark for myself to change this
+ // as one of the next tasks.
+ if(1 == mpDrawView->GetMarkedObjectCount())
+ {
+ const SdrGrafObj* pSdrGrafObj = dynamic_cast< const SdrGrafObj* >(mpDrawView->GetMarkedObjectByIndex(0));
+
+ if(pSdrGrafObj && pSdrGrafObj->isEmbeddedVectorGraphicData())
+ {
+ aGraphic = Graphic(pSdrGrafObj->GetGraphic().getVectorGraphicData()->getReplacement());
+ bDone = true;
+ }
+ }
+
+ if(!bDone)
+ {
+ aGraphic = Graphic(mpDrawView->GetMarkedObjBitmapEx());
+ }
+ // Restore online spelling
+ GetDoc()->SetOnlineSpell(bOnlineSpell);
+ }
+ break;
+ }
+
+ // create new object
+ SdrGrafObj* pGraphicObj = new SdrGrafObj(
+ *GetDoc(),
+ aGraphic);
+
+ // get some necessary info and ensure it
+ const SdrMarkList& rMarkList(mpDrawView->GetMarkedObjectList());
+ const size_t nMarkCount(rMarkList.GetMarkCount());
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+ OSL_ENSURE(nMarkCount, "DrawViewShell::FuTemporary: SID_CONVERT_TO_BITMAP with empty selection (!)");
+ OSL_ENSURE(pPageView, "DrawViewShell::FuTemporary: SID_CONVERT_TO_BITMAP without SdrPageView (!)");
+
+ // fit rectangle of new graphic object to selection's mark rect
+ ::tools::Rectangle aAllMarkedRect;
+ rMarkList.TakeBoundRect(pPageView, aAllMarkedRect);
+ pGraphicObj->SetLogicRect(aAllMarkedRect);
+
+ // #i71540# to keep the order, it is necessary to replace the lowest object
+ // of the selection with the new object. This also means that with multi
+ // selection, all other objects need to be deleted first
+ SdrMark* pFirstMark = rMarkList.GetMark(0);
+ SdrObject* pReplacementCandidate = pFirstMark->GetMarkedSdrObj();
+
+ if(nMarkCount > 1)
+ {
+ // take first object out of selection
+ mpDrawView->MarkObj(pReplacementCandidate, pPageView, true, true);
+
+ // clear remaining selection
+ mpDrawView->DeleteMarkedObj();
+ }
+
+ // #i124816# copy layer from lowest object which gets replaced
+ pGraphicObj->SetLayer(pReplacementCandidate->GetLayer());
+
+ // now replace lowest object with new one
+ mpDrawView->ReplaceObjectAtView(pReplacementCandidate, *pPageView, pGraphicObj);
+
+ // switch off undo
+ mpDrawView->EndUndo();
+ }
+ }
+
+ Cancel();
+
+ rReq.Done ();
+ break;
+
+ case SID_REMOVE_HYPERLINK:
+ {
+ if (mpDrawView->IsTextEdit())
+ {
+ // First make sure the field is selected
+ OutlinerView* pOutView = mpDrawView->GetTextEditOutlinerView();
+ if (pOutView)
+ {
+ pOutView->SelectFieldAtCursor();
+ URLFieldHelper::RemoveURLField(pOutView->GetEditView());
+ }
+ }
+ }
+ Cancel();
+ rReq.Done ();
+ break;
+
+ case SID_SET_DEFAULT:
+ {
+ std::optional<SfxItemSet> pSet;
+
+ if (mpDrawView->IsTextEdit())
+ {
+ pSet.emplace( GetPool(), svl::Items<EE_ITEMS_START, EE_ITEMS_END> );
+ mpDrawView->SetAttributes( *pSet, true );
+ }
+ else
+ {
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ const size_t nCount = rMarkList.GetMarkCount();
+
+ // For every presentation object a SfxItemSet of hard attributes
+ // and the UserCall is stored in this list. This is because
+ // at the following mpDrawView->SetAttributes( *pSet, sal_True )
+ // they get lost and have to be restored.
+ std::vector<std::pair<std::unique_ptr<SfxItemSet>,SdrObjUserCall*> > aAttrList;
+ SdPage* pPresPage = static_cast<SdPage*>( mpDrawView->GetSdrPageView()->GetPage() );
+
+ for ( size_t i = 0; i < nCount; ++i )
+ {
+ SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
+
+ if( pPresPage->IsPresObj( pObj ) )
+ {
+ auto pNewSet = std::make_unique<SfxItemSetFixed<SDRATTR_TEXT_MINFRAMEHEIGHT, SDRATTR_TEXT_AUTOGROWHEIGHT>>( GetDoc()->GetPool() );
+ pNewSet->Put(pObj->GetMergedItemSet());
+ aAttrList.emplace_back(std::move(pNewSet), pObj->GetUserCall());
+ }
+ }
+
+ pSet.emplace( GetPool() );
+ mpDrawView->SetAttributes( *pSet, true );
+
+ sal_uLong j = 0;
+
+ for ( size_t i = 0; i < nCount; ++i )
+ {
+ SfxStyleSheet* pSheet = nullptr;
+ SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
+
+ if (pObj->GetObjIdentifier() == SdrObjKind::TitleText)
+ {
+ pSheet = mpActualPage->GetStyleSheetForPresObj(PresObjKind::Title);
+ if (pSheet)
+ pObj->SetStyleSheet(pSheet, false);
+ }
+ else if(pObj->GetObjIdentifier() == SdrObjKind::OutlineText)
+ {
+ for (sal_uInt16 nLevel = 1; nLevel < 10; nLevel++)
+ {
+ pSheet = mpActualPage->GetStyleSheetForPresObj( PresObjKind::Outline );
+ DBG_ASSERT(pSheet, "Template for outline object not found");
+ if (pSheet)
+ {
+ pObj->StartListening(*pSheet);
+
+ if( nLevel == 1 )
+ // text frame listens on StyleSheet of level1
+ pObj->NbcSetStyleSheet(pSheet, false);
+ }
+ }
+ }
+
+ if( pPresPage->IsPresObj( pObj ) )
+ {
+ std::pair<std::unique_ptr<SfxItemSet>,SdrObjUserCall*> &rAttr = aAttrList[j++];
+
+ std::unique_ptr<SfxItemSet> & pNewSet(rAttr.first);
+ SdrObjUserCall* pUserCall = rAttr.second;
+
+ if ( pNewSet && pNewSet->GetItemState( SDRATTR_TEXT_MINFRAMEHEIGHT ) == SfxItemState::SET )
+ {
+ pObj->SetMergedItem(pNewSet->Get(SDRATTR_TEXT_MINFRAMEHEIGHT));
+ }
+
+ if ( pNewSet && pNewSet->GetItemState( SDRATTR_TEXT_AUTOGROWHEIGHT ) == SfxItemState::SET )
+ {
+ pObj->SetMergedItem(pNewSet->Get(SDRATTR_TEXT_AUTOGROWHEIGHT));
+ }
+
+ if( pUserCall )
+ pObj->SetUserCall( pUserCall );
+ }
+ }
+ }
+
+ pSet.reset();
+ Cancel();
+ }
+ break;
+
+ case SID_DELETE_SNAPITEM:
+ {
+ SdrPageView* pPV;
+ Point aMPos = GetActiveWindow()->PixelToLogic( maMousePos );
+ sal_uInt16 nHitLog = static_cast<sal_uInt16>(GetActiveWindow()->PixelToLogic( Size(
+ FuPoor::HITPIX, 0 ) ).Width());
+ sal_uInt16 nHelpLine;
+
+ if( mpDrawView->PickHelpLine( aMPos, nHitLog, *GetActiveWindow()->GetOutDev(), nHelpLine, pPV) )
+ {
+ pPV->DeleteHelpLine( nHelpLine );
+ }
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_DELETE_PAGE:
+ case SID_DELETE_MASTER_PAGE:
+ DeleteActualPage();
+ Cancel();
+ rReq.Ignore ();
+ break;
+
+ case SID_DELETE_LAYER:
+ DeleteActualLayer();
+ Cancel();
+ rReq.Ignore ();
+ break;
+
+ case SID_ORIGINAL_SIZE:
+ mpDrawView->SetMarkedOriginalSize();
+ Cancel();
+ rReq.Done();
+ break;
+
+ case SID_DRAW_FONTWORK:
+ case SID_DRAW_FONTWORK_VERTICAL:
+ {
+ svx::FontworkBar::execute(*mpView, rReq, GetViewFrame()->GetBindings()); // SJ: can be removed (I think)
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_SAVE_GRAPHIC:
+ {
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ if( rMarkList.GetMarkCount() == 1 )
+ {
+ const SdrGrafObj* pObj = dynamic_cast<const SdrGrafObj*>(rMarkList.GetMark(0)->GetMarkedSdrObj());
+ if (pObj && pObj->GetGraphicType() == GraphicType::Bitmap)
+ {
+ weld::Window* pFrame = GetFrameWeld();
+ GraphicAttr aGraphicAttr = pObj->GetGraphicAttr();
+ short nState = RET_CANCEL;
+ if (aGraphicAttr != GraphicAttr()) // the image has been modified
+ {
+ if (pFrame)
+ {
+ nState = GraphicHelper::HasToSaveTransformedImage(pFrame);
+ }
+ }
+ else
+ {
+ nState = RET_NO;
+ }
+
+ if (nState == RET_YES)
+ {
+ GraphicHelper::ExportGraphic(pFrame, pObj->GetTransformedGraphic(), "");
+ }
+ else if (nState == RET_NO)
+ {
+ const GraphicObject& aGraphicObject(pObj->GetGraphicObject());
+ GraphicHelper::ExportGraphic(pFrame, aGraphicObject.GetGraphic(), "");
+ }
+ }
+ }
+ Cancel();
+ rReq.Ignore();
+ }
+ break;
+
+ case SID_EXTERNAL_EDIT:
+ {
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ if( rMarkList.GetMarkCount() == 1 )
+ {
+ SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
+ if( auto pGraphicObj = dynamic_cast<SdrGrafObj*>( pObj ) )
+ if( pGraphicObj->GetGraphicType() == GraphicType::Bitmap )
+ {
+ GraphicObject aGraphicObject( pGraphicObj->GetGraphicObject() );
+ m_ExternalEdits.push_back(
+ std::make_unique<SdrExternalToolEdit>(
+ mpDrawView.get(), pObj));
+ m_ExternalEdits.back()->Edit( &aGraphicObject );
+ }
+ }
+ Cancel();
+ rReq.Ignore();
+ }
+ break;
+
+ case SID_COMPRESS_GRAPHIC:
+ {
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ if( rMarkList.GetMarkCount() == 1 )
+ {
+ SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
+
+ if( auto pGraphicObj = dynamic_cast<SdrGrafObj*>( pObj ) )
+ if( pGraphicObj->GetGraphicType() == GraphicType::Bitmap )
+ {
+ CompressGraphicsDialog dialog(GetFrameWeld(), pGraphicObj, GetViewFrame()->GetBindings() );
+ if (dialog.run() == RET_OK)
+ {
+ SdrGrafObj* pNewObject = dialog.GetCompressedSdrGrafObj();
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+ OUString aUndoString = mpDrawView->GetDescriptionOfMarkedObjects() + " Compress";
+ mpDrawView->BegUndo( aUndoString );
+ mpDrawView->ReplaceObjectAtView( pObj, *pPageView, pNewObject );
+ mpDrawView->EndUndo();
+ }
+ }
+ }
+ Cancel();
+ rReq.Ignore();
+ }
+ break;
+
+ case SID_GRAPHIC_SIZE_CHECK:
+ {
+ sd::GraphicSizeCheckGUIResult aResult(GetDoc());
+ svx::GenericCheckDialog aDialog(GetFrameWeld(), aResult);
+ aDialog.run();
+
+ Cancel();
+ rReq.Ignore();
+ }
+ break;
+
+ case SID_ATTRIBUTES_LINE: // BASIC
+ {
+ SetCurrentFunction( FuLine::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ if (rReq.GetArgs())
+ Cancel();
+ }
+ break;
+
+ case SID_ATTRIBUTES_AREA: // BASIC
+ {
+ SetCurrentFunction( FuArea::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ if (rReq.GetArgs())
+ Cancel();
+ }
+ break;
+
+ case SID_ATTR_TRANSFORM:
+ {
+ SetCurrentFunction( FuTransform::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ // tdf#138963 conditions tested for here must be the same as those
+ // of the early returns from FuTransform::DoExecute
+ if (rReq.GetArgs() || !mpDrawView->AreObjectsMarked())
+ {
+ Invalidate(SID_RULER_OBJECT);
+ Cancel();
+ }
+ }
+ break;
+ case SID_MOVE_SHAPE_HANDLE:
+ {
+ const SfxItemSet *pArgs = rReq.GetArgs ();
+ if (pArgs && pArgs->Count () >= 3)
+ {
+ const SfxUInt32Item* handleNumItem = rReq.GetArg<SfxUInt32Item>(FN_PARAM_1);
+ const SfxUInt32Item* newPosXTwips = rReq.GetArg<SfxUInt32Item>(FN_PARAM_2);
+ const SfxUInt32Item* newPosYTwips = rReq.GetArg<SfxUInt32Item>(FN_PARAM_3);
+ const SfxInt32Item* OrdNum = rReq.GetArg<SfxInt32Item>(FN_PARAM_4);
+
+ const sal_uLong handleNum = handleNumItem->GetValue();
+ const sal_uLong newPosX = convertTwipToMm100(newPosXTwips->GetValue());
+ const sal_uLong newPosY = convertTwipToMm100(newPosYTwips->GetValue());
+
+ mpDrawView->MoveShapeHandle(handleNum, Point(newPosX, newPosY), OrdNum ? OrdNum->GetValue() : -1);
+ Cancel();
+ }
+ break;
+ }
+ case SID_CHAR_DLG_EFFECT:
+ case SID_CHAR_DLG: // BASIC
+ {
+ SetCurrentFunction( FuChar::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case SID_PARA_DLG:
+ {
+ SetCurrentFunction( FuParagraph::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case FN_NUM_BULLET_ON:
+ {
+ // The value (sal_uInt16)0xFFFF means set bullet on/off.
+ SfxUInt16Item aItem(FN_SVX_SET_BULLET, sal_uInt16(0xFFFF));
+ GetViewFrame()->GetDispatcher()->ExecuteList(FN_SVX_SET_BULLET,
+ SfxCallMode::RECORD, { &aItem });
+ }
+ break;
+
+ case FN_NUM_NUMBERING_ON:
+ {
+ // The value (sal_uInt16)0xFFFF means set bullet on/off.
+ SfxUInt16Item aItem(FN_SVX_SET_NUMBER, sal_uInt16(0xFFFF));
+ GetViewFrame()->GetDispatcher()->ExecuteList(FN_SVX_SET_NUMBER,
+ SfxCallMode::RECORD, { &aItem });
+ }
+ break;
+
+ case SID_OUTLINE_BULLET:
+ case FN_SVX_SET_BULLET:
+ case FN_SVX_SET_NUMBER:
+ {
+ SetCurrentFunction( FuBulletAndPosition::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case FN_INSERT_SOFT_HYPHEN:
+ case FN_INSERT_HARDHYPHEN:
+ case FN_INSERT_HARD_SPACE:
+ case FN_INSERT_NNBSP:
+ case SID_INSERT_RLM :
+ case SID_INSERT_LRM :
+ case SID_INSERT_WJ :
+ case SID_INSERT_ZWSP:
+ case SID_CHARMAP:
+ {
+ SetCurrentFunction( FuBullet::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case SID_PRESENTATION_LAYOUT:
+ {
+ SetCurrentFunction( FuPresentationLayout::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) );
+ Cancel();
+ }
+ break;
+
+ case SID_PASTE_SPECIAL:
+ {
+ SetCurrentFunction( FuInsertClipboard::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_CHANGE_PICTURE:
+ case SID_INSERT_GRAPHIC:
+ {
+ SetCurrentFunction( FuInsertGraphic::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq,
+ nSId == SID_CHANGE_PICTURE ) );
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_INSERT_AVMEDIA:
+ {
+ SetCurrentFunction( FuInsertAVMedia::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_INSERT_OBJECT:
+ case SID_INSERT_FLOATINGFRAME:
+ case SID_INSERT_MATH:
+ case SID_INSERT_DIAGRAM:
+ case SID_ATTR_TABLE:
+ {
+ SetCurrentFunction( FuInsertOLE::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ // Set the selection tool as the old one. This in particular important for the
+ // zoom function, in which clicking without dragging zooms as well, and that
+ // makes exiting the object editing mode impossible.
+ if (dynamic_cast<FuSelection*>( GetOldFunction().get() ) == nullptr)
+ SetOldFunction( FuSelection::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+ case SID_CLASSIFICATION_APPLY:
+ {
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ const SfxPoolItem* pItem = nullptr;
+ if (pArgs && pArgs->GetItemState(nSId, false, &pItem) == SfxItemState::SET)
+ {
+ const OUString& rName = static_cast<const SfxStringItem*>(pItem)->GetValue();
+ auto eType = SfxClassificationPolicyType::IntellectualProperty;
+ if (pArgs->GetItemState(SID_TYPE_NAME, false, &pItem) == SfxItemState::SET)
+ {
+ const OUString& rType = static_cast<const SfxStringItem*>(pItem)->GetValue();
+ eType = SfxClassificationHelper::stringToPolicyType(rType);
+ }
+ if (SfxViewFrame* pViewFrame = GetViewFrame())
+ {
+ if (SfxObjectShell* pObjectShell = pViewFrame->GetObjectShell())
+ {
+ SfxClassificationHelper aHelper(pObjectShell->getDocProperties());
+ aHelper.SetBACName(rName, eType);
+ }
+ }
+ }
+ else
+ SAL_WARN("sd.ui", "missing parameter for SID_CLASSIFICATION_APPLY");
+
+ Cancel();
+ rReq.Ignore();
+ }
+ break;
+
+ case SID_CLASSIFICATION_DIALOG:
+ {
+ if (SfxObjectShell* pObjShell = SfxObjectShell::Current())
+ {
+ css::uno::Reference<css::document::XDocumentProperties> xDocProps(pObjShell->getDocProperties());
+ auto xDialog = std::make_shared<svx::ClassificationDialog>(GetFrameWeld(), xDocProps, false, [](){} );
+ ClassificationCollector aCollector(*this, xDocProps);
+ aCollector.collect();
+
+ xDialog->setupValues(std::vector(aCollector.getResults()));
+
+ if (RET_OK == xDialog->run())
+ {
+ ClassificationInserter aInserter(*this, xDocProps);
+ aInserter.insert(xDialog->getResult());
+ }
+ xDialog.reset();
+ }
+
+ Cancel();
+ rReq.Ignore();
+ }
+ break;
+
+ case SID_COPYOBJECTS:
+ {
+ if ( mpDrawView->IsPresObjSelected(false) )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ if ( mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+
+ SetCurrentFunction( FuCopy::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ }
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_INSERTFILE: // BASIC
+ {
+ Broadcast (ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_START));
+ SetCurrentFunction( FuInsertFile::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Broadcast (ViewShellHint(ViewShellHint::HINT_COMPLEX_MODEL_CHANGE_END));
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_SELECT_BACKGROUND:
+ case SID_SAVE_BACKGROUND:
+ case SID_ATTR_PAGE_SIZE:
+ case SID_ATTR_PAGE:
+ case SID_PAGESETUP: // BASIC ??
+ {
+ SetCurrentFunction( FuPage::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ rReq.Ignore (); // we generate independent macros !!
+ }
+ break;
+
+ case SID_BEFORE_OBJ:
+ case SID_BEHIND_OBJ:
+ {
+ SetCurrentFunction( FuDisplayOrder::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) );
+ rReq.Done();
+ // finishes itself, no Cancel() needed!
+ }
+ break;
+
+ case SID_REVERSE_ORDER: // BASIC
+ {
+ mpDrawView->ReverseOrderOfMarked();
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_ANIMATION_EFFECTS:
+ {
+ SetCurrentFunction( FuObjectAnimationParameters::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) );
+ Cancel();
+ }
+ break;
+
+ case SID_EXECUTE_ANIMATION_EFFECT:
+ {
+ SetCurrentFunction(FuExecuteInteraction::Create(this, GetActiveWindow(),
+ mpDrawView.get(), GetDoc(), rReq));
+ Cancel();
+ }
+ break;
+
+ case SID_LINEEND_POLYGON:
+ {
+ SetCurrentFunction( FuLineEnd::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case SID_CAPTUREPOINT:
+ // negative value to signal call from menu
+ maMousePos = Point(-1,-1);
+ [[fallthrough]];
+ case SID_SET_SNAPITEM:
+ {
+ SetCurrentFunction( FuSnapLine::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) );
+ Cancel();
+ }
+ break;
+
+ case SID_MANAGE_LINKS:
+ {
+ SetCurrentFunction( FuLink::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_THESAURUS:
+ {
+ SetCurrentFunction( FuThesaurus::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_TEXTATTR_DLG:
+ {
+ if (mpDrawView->IsTextEdit())
+ mpDrawView->SdrEndTextEdit();
+ SetCurrentFunction( FuTextAttrDlg::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_MEASURE_DLG:
+ {
+ SetCurrentFunction( FuMeasureDlg::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_CONNECTION_DLG:
+ {
+ SetCurrentFunction( FuConnectionDlg::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_CONNECTION_NEW_ROUTING:
+ {
+ SfxItemSetFixed<SDRATTR_EDGELINE1DELTA, SDRATTR_EDGELINE3DELTA> aDefAttr( GetPool() );
+ GetView()->SetAttributes( aDefAttr, true ); // (ReplaceAll)
+
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_TWAIN_SELECT:
+ {
+ if( mxScannerManager.is() )
+ {
+ try
+ {
+ const css::uno::Sequence< css::scanner::ScannerContext >
+ aContexts( mxScannerManager->getAvailableScanners() );
+
+ if( aContexts.hasElements() )
+ {
+ css::scanner::ScannerContext aContext( aContexts.getConstArray()[ 0 ] );
+
+ Reference<lang::XInitialization> xInit(mxScannerManager, UNO_QUERY);
+ if (xInit.is())
+ {
+ // initialize dialog
+ weld::Window* pWindow = rReq.GetFrameWeld();
+ uno::Sequence<uno::Any> aSeq(comphelper::InitAnyPropertySequence(
+ {
+ {"ParentWindow", pWindow ? uno::Any(pWindow->GetXWindow()) : uno::Any(Reference<awt::XWindow>())}
+ }));
+ xInit->initialize( aSeq );
+ }
+
+ mxScannerManager->configureScannerAndScan( aContext, mxScannerListener );
+ }
+ }
+ catch(...)
+ {
+ }
+ }
+
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_TWAIN_TRANSFER:
+ {
+ bool bDone = false;
+
+ if( mxScannerManager.is() )
+ {
+ try
+ {
+ const css::uno::Sequence< css::scanner::ScannerContext > aContexts( mxScannerManager->getAvailableScanners() );
+
+ if( aContexts.hasElements() )
+ {
+ mxScannerManager->startScan( aContexts.getConstArray()[ 0 ], mxScannerListener );
+ bDone = true;
+ }
+ }
+ catch( ... )
+ {
+ }
+ }
+
+ if( !bDone )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+#ifndef UNX
+ SdResId(STR_TWAIN_NO_SOURCE)
+#else
+ SdResId(STR_TWAIN_NO_SOURCE_UNX)
+#endif
+ ));
+ xInfoBox->run();
+
+ }
+ else
+ {
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_TWAIN_SELECT );
+ rBindings.Invalidate( SID_TWAIN_TRANSFER );
+ }
+
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_POLYGON_MORPHING:
+ {
+ SetCurrentFunction( FuMorph::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case SID_INSERTLAYER:
+ {
+ if ( mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+
+ SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin();
+ sal_uInt16 nLayerCnt = rLayerAdmin.GetLayerCount();
+ sal_uInt16 nLayer = nLayerCnt - 2 + 1;
+ OUString aLayerName = SdResId(STR_LAYER) + OUString::number(nLayer);
+ OUString aLayerTitle, aLayerDesc;
+ bool bIsVisible = false;
+ bool bIsLocked = false;
+ bool bIsPrintable = false;
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ if (! pArgs)
+ {
+ SfxItemSetFixed<ATTR_LAYER_START, ATTR_LAYER_END> aNewAttr( GetDoc()->GetPool() );
+
+ aNewAttr.Put( makeSdAttrLayerName( aLayerName ) );
+ aNewAttr.Put( makeSdAttrLayerTitle() );
+ aNewAttr.Put( makeSdAttrLayerDesc() );
+ aNewAttr.Put( makeSdAttrLayerVisible() );
+ aNewAttr.Put( makeSdAttrLayerPrintable() );
+ aNewAttr.Put( makeSdAttrLayerLocked() );
+ aNewAttr.Put( makeSdAttrLayerThisPage() );
+
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ vcl::Window* pWin = GetActiveWindow();
+ ScopedVclPtr<AbstractSdInsertLayerDlg> pDlg( pFact->CreateSdInsertLayerDlg(pWin ? pWin->GetFrameWeld() : nullptr, aNewAttr, true, SdResId(STR_INSERTLAYER)) );
+ pDlg->SetHelpId( SD_MOD()->GetSlotPool()->GetSlot( SID_INSERTLAYER )->GetCommand() );
+
+ // test for already existing names
+ bool bLoop = true;
+ while( bLoop && pDlg->Execute() == RET_OK )
+ {
+ pDlg->GetAttr( aNewAttr );
+ aLayerName = static_cast<const SfxStringItem &>( aNewAttr.Get (ATTR_LAYER_NAME)).GetValue ();
+
+ if( rLayerAdmin.GetLayer( aLayerName )
+ || aLayerName.isEmpty()
+ || LayerTabBar::IsLocalizedNameOfStandardLayer( aLayerName) )
+ {
+ // name already exists
+ std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Warning, VclButtonsType::Ok,
+ SdResId(STR_WARN_NAME_DUPLICATE)));
+ xWarn->run();
+ }
+ else
+ bLoop = false;
+ }
+ if( bLoop ) // was canceled
+ {
+ pDlg.disposeAndClear();
+ Cancel();
+ rReq.Ignore ();
+ break;
+ }
+ else
+ {
+ aLayerTitle = static_cast<const SfxStringItem &>( aNewAttr.Get (ATTR_LAYER_TITLE)).GetValue ();
+ aLayerDesc = static_cast<const SfxStringItem &>( aNewAttr.Get (ATTR_LAYER_DESC)).GetValue ();
+ bIsVisible = static_cast<const SfxBoolItem &>( aNewAttr.Get (ATTR_LAYER_VISIBLE)).GetValue ();
+ bIsLocked = static_cast<const SfxBoolItem &>( aNewAttr.Get (ATTR_LAYER_LOCKED)).GetValue () ;
+ bIsPrintable = static_cast<const SfxBoolItem &>( aNewAttr.Get (ATTR_LAYER_PRINTABLE)).GetValue () ;
+ }
+ }
+ else if (pArgs->Count () != 4)
+ {
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ Cancel();
+ rReq.Ignore ();
+ break;
+ }
+ else
+ {
+ const SfxStringItem* pLayerName = rReq.GetArg<SfxStringItem>(ID_VAL_LAYERNAME);
+ const SfxBoolItem* pIsVisible = rReq.GetArg<SfxBoolItem>(ID_VAL_ISVISIBLE);
+ const SfxBoolItem* pIsLocked = rReq.GetArg<SfxBoolItem>(ID_VAL_ISLOCKED);
+ const SfxBoolItem* pIsPrintable = rReq.GetArg<SfxBoolItem>(ID_VAL_ISPRINTABLE);
+
+ aLayerName = pLayerName->GetValue ();
+ bIsVisible = pIsVisible->GetValue ();
+ bIsLocked = pIsLocked->GetValue ();
+ bIsPrintable = pIsPrintable->GetValue ();
+ }
+
+ OUString aPrevLayer = mpDrawView->GetActiveLayer();
+ SdrLayer* pLayer;
+ sal_uInt16 nPrevLayer = 0;
+ nLayerCnt = rLayerAdmin.GetLayerCount();
+
+ for ( nLayer = 0; nLayer < nLayerCnt; nLayer++ )
+ {
+ pLayer = rLayerAdmin.GetLayer(nLayer);
+ OUString aName = pLayer->GetName();
+
+ if ( aPrevLayer == aName )
+ {
+ nPrevLayer = std::max(nLayer, sal_uInt16(4));
+ }
+ }
+
+ mpDrawView->InsertNewLayer(aLayerName, nPrevLayer + 1);
+ pLayer = rLayerAdmin.GetLayer(aLayerName);
+ if( pLayer )
+ {
+ pLayer->SetTitle( aLayerTitle );
+ pLayer->SetDescription( aLayerDesc );
+ }
+
+ mpDrawView->SetLayerVisible( aLayerName, bIsVisible );
+ mpDrawView->SetLayerLocked( aLayerName, bIsLocked);
+ mpDrawView->SetLayerPrintable(aLayerName, bIsPrintable);
+
+ mpDrawView->SetActiveLayer(aLayerName);
+
+ ResetActualLayer();
+
+ GetDoc()->SetChanged();
+
+ GetViewFrame()->GetDispatcher()->Execute(SID_SWITCHLAYER,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_MODIFYLAYER:
+ {
+ if(!GetLayerTabControl()) // #i87182#
+ {
+ OSL_ENSURE(false, "No LayerTabBar (!)");
+ Cancel();
+ rReq.Ignore();
+ break;
+ }
+
+ if ( mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+
+ SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin();
+ sal_uInt16 nCurPage = GetLayerTabControl()->GetCurPageId();
+ OUString aLayerName = GetLayerTabControl()->GetLayerName(nCurPage);
+ SdrLayer* pLayer = rLayerAdmin.GetLayer(aLayerName);
+
+ OUString aLayerTitle = pLayer->GetTitle();
+ OUString aLayerDesc = pLayer->GetDescription();
+
+ OUString aOldLayerName(aLayerName);
+ OUString aOldLayerTitle(aLayerTitle);
+ OUString aOldLayerDesc(aLayerDesc);
+
+ bool bIsVisible, bIsLocked, bIsPrintable;
+ bool bOldIsVisible = bIsVisible = mpDrawView->IsLayerVisible(aLayerName);
+ bool bOldIsLocked = bIsLocked = mpDrawView->IsLayerLocked(aLayerName);
+ bool bOldIsPrintable = bIsPrintable = mpDrawView->IsLayerPrintable(aLayerName);
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ // is it allowed to delete the layer?
+ bool bDelete = !( LayerTabBar::IsRealNameOfStandardLayer(aLayerName) );
+
+ if (! pArgs)
+ {
+ SfxItemSetFixed<ATTR_LAYER_START, ATTR_LAYER_END> aNewAttr( GetDoc()->GetPool() );
+
+ aNewAttr.Put( makeSdAttrLayerName( aLayerName ) );
+ aNewAttr.Put( makeSdAttrLayerTitle( aLayerTitle ) );
+ aNewAttr.Put( makeSdAttrLayerDesc( aLayerDesc ) );
+ aNewAttr.Put( makeSdAttrLayerVisible( bIsVisible ) );
+ aNewAttr.Put( makeSdAttrLayerLocked( bIsLocked ) );
+ aNewAttr.Put( makeSdAttrLayerPrintable( bIsPrintable ) );
+ aNewAttr.Put( makeSdAttrLayerThisPage() );
+
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ vcl::Window* pWin = GetActiveWindow();
+ ScopedVclPtr<AbstractSdInsertLayerDlg> pDlg( pFact->CreateSdInsertLayerDlg(pWin ? pWin->GetFrameWeld() : nullptr, aNewAttr, bDelete, SdResId(STR_MODIFYLAYER)) );
+ pDlg->SetHelpId( SD_MOD()->GetSlotPool()->GetSlot( SID_MODIFYLAYER )->GetCommand() );
+
+ // test for already existing names
+ bool bLoop = true;
+ sal_uInt16 nRet = 0;
+ while( bLoop )
+ {
+ nRet = pDlg->Execute();
+ if (nRet != RET_OK)
+ break;
+ pDlg->GetAttr( aNewAttr );
+ aLayerName = static_cast<const SfxStringItem &>( aNewAttr.Get (ATTR_LAYER_NAME)).GetValue ();
+ if (bDelete)
+ {
+ if( (rLayerAdmin.GetLayer( aLayerName ) && aLayerName != aOldLayerName)
+ || LayerTabBar::IsRealNameOfStandardLayer(aLayerName)
+ || LayerTabBar::IsLocalizedNameOfStandardLayer(aLayerName)
+ || aLayerName.isEmpty() )
+ {
+ // name already exists
+ std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Warning, VclButtonsType::Ok,
+ SdResId(STR_WARN_NAME_DUPLICATE)));
+ xWarn->run();
+ }
+ else
+ bLoop = false;
+ }
+ else
+ bLoop = false; // altering name is already disabled in the dialog itself
+ }
+ switch (nRet)
+ {
+ case RET_OK :
+ aLayerTitle = static_cast<const SfxStringItem &>( aNewAttr.Get (ATTR_LAYER_TITLE)).GetValue ();
+ aLayerDesc = static_cast<const SfxStringItem &>( aNewAttr.Get (ATTR_LAYER_DESC)).GetValue ();
+ bIsVisible = static_cast<const SfxBoolItem &>( aNewAttr.Get (ATTR_LAYER_VISIBLE)).GetValue ();
+ bIsLocked = static_cast<const SfxBoolItem &>( aNewAttr.Get (ATTR_LAYER_LOCKED)).GetValue ();
+ bIsPrintable = static_cast<const SfxBoolItem &>( aNewAttr.Get (ATTR_LAYER_PRINTABLE)).GetValue ();
+ break;
+
+ default :
+ pDlg.disposeAndClear();
+ rReq.Ignore ();
+ Cancel ();
+ return;
+ }
+ }
+ else if (pArgs->Count () == 4)
+ {
+ const SfxStringItem* pLayerName = rReq.GetArg<SfxStringItem>(ID_VAL_LAYERNAME);
+ const SfxBoolItem* pIsVisible = rReq.GetArg<SfxBoolItem>(ID_VAL_ISVISIBLE);
+ const SfxBoolItem* pIsLocked = rReq.GetArg<SfxBoolItem>(ID_VAL_ISLOCKED);
+ const SfxBoolItem* pIsPrintable = rReq.GetArg<SfxBoolItem>(ID_VAL_ISPRINTABLE);
+
+ aLayerName = pLayerName->GetValue ();
+ bIsVisible = pIsVisible->GetValue ();
+ bIsLocked = pIsLocked->GetValue ();
+ bIsPrintable = pIsPrintable->GetValue ();
+ }
+ else
+ {
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ Cancel ();
+ rReq.Ignore ();
+ break;
+ }
+
+ SfxUndoManager* pManager = GetDoc()->GetDocSh()->GetUndoManager();
+ std::unique_ptr<SdLayerModifyUndoAction> pAction( new SdLayerModifyUndoAction(
+ GetDoc(),
+ pLayer,
+ // old values
+ aOldLayerName,
+ aOldLayerTitle,
+ aOldLayerDesc,
+ bOldIsVisible,
+ bOldIsLocked,
+ bOldIsPrintable,
+ // new values
+ aLayerName,
+ aLayerTitle,
+ aLayerDesc,
+ bIsVisible,
+ bIsLocked,
+ bIsPrintable
+ ) );
+ pManager->AddUndoAction( std::move(pAction) );
+
+ ModifyLayer( pLayer, aLayerName, aLayerTitle, aLayerDesc, bIsVisible, bIsLocked, bIsPrintable );
+
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_RENAMELAYER:
+ {
+ if ( mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+
+ if(GetLayerTabControl()) // #i87182#
+ {
+ GetLayerTabControl()->StartEditMode(GetLayerTabControl()->GetCurPageId());
+ }
+ else
+ {
+ OSL_ENSURE(false, "No LayerTabBar (!)");
+ }
+
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_EDIT_HYPERLINK :
+ {
+ // Ensure the field is selected first
+ OutlinerView* pOutView = mpDrawView->GetTextEditOutlinerView();
+ if (pOutView)
+ pOutView->SelectFieldAtCursor();
+
+ GetViewFrame()->GetDispatcher()->Execute( SID_HYPERLINK_DIALOG );
+
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_OPEN_HYPERLINK:
+ {
+ OutlinerView* pOutView = mpDrawView->GetTextEditOutlinerView();
+ if ( pOutView )
+ {
+ const SvxFieldData* pField = pOutView->GetFieldAtCursor();
+ if( auto pURLField = dynamic_cast< const SvxURLField *>( pField ) )
+ {
+ SfxStringItem aUrl( SID_FILE_NAME, pURLField->GetURL() );
+ SfxStringItem aTarget( SID_TARGETNAME, pURLField->GetTargetFrame() );
+
+ OUString aReferName;
+ SfxViewFrame* pFrame = GetViewFrame();
+ SfxMedium* pMed = pFrame->GetObjectShell()->GetMedium();
+ if (pMed)
+ aReferName = pMed->GetName();
+
+ SfxFrameItem aFrm( SID_DOCFRAME, pFrame );
+ SfxStringItem aReferer( SID_REFERER, aReferName );
+
+ SfxBoolItem aNewView( SID_OPEN_NEW_VIEW, false );
+ SfxBoolItem aBrowsing( SID_BROWSE, true );
+
+ SfxViewFrame* pViewFrm = SfxViewFrame::Current();
+ if (pViewFrm)
+ {
+ pViewFrm->GetDispatcher()->ExecuteList(SID_OPENDOC,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aUrl, &aTarget, &aFrm, &aReferer,
+ &aNewView, &aBrowsing });
+ }
+ }
+ }
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_COPY_HYPERLINK_LOCATION:
+ {
+ OutlinerView* pOutView = mpDrawView->GetTextEditOutlinerView();
+ if ( pOutView )
+ {
+ const SvxFieldData* pField = pOutView->GetFieldAtCursor();
+ if (const SvxURLField* pURLField = dynamic_cast<const SvxURLField*>(pField))
+ {
+ uno::Reference<datatransfer::clipboard::XClipboard> xClipboard
+ = pOutView->GetWindow()->GetClipboard();
+
+ vcl::unohelper::TextDataObject::CopyStringTo(pURLField->GetURL(), xClipboard, SfxViewShell::Current());
+ }
+ }
+
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_HYPERLINK_SETLINK:
+ {
+ const SfxItemSet* pReqArgs = rReq.GetArgs();
+
+ if (pReqArgs)
+ {
+ const SvxHyperlinkItem* pHLItem =
+ &pReqArgs->Get(SID_HYPERLINK_SETLINK);
+
+ if (pHLItem->GetInsertMode() == HLINK_FIELD)
+ {
+ InsertURLField(pHLItem->GetURL(), pHLItem->GetName(),
+ pHLItem->GetTargetFrame());
+ }
+ else if (pHLItem->GetInsertMode() == HLINK_BUTTON)
+ {
+ InsertURLButton(pHLItem->GetURL(), pHLItem->GetName(),
+ pHLItem->GetTargetFrame(), nullptr);
+ }
+ else if (pHLItem->GetInsertMode() == HLINK_DEFAULT)
+ {
+ OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView();
+
+ if (pOlView || comphelper::LibreOfficeKit::isActive())
+ {
+ InsertURLField(pHLItem->GetURL(), pHLItem->GetName(),
+ pHLItem->GetTargetFrame());
+ }
+ else
+ {
+ InsertURLButton(pHLItem->GetURL(), pHLItem->GetName(),
+ pHLItem->GetTargetFrame(), nullptr);
+ }
+ }
+ }
+
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_HIDE_LAST_LEVEL:
+ {
+ ESelection aSel;
+ // fdo#78151 editing a PresObjKind::Outline in a master page ?
+ ::Outliner* pOL = GetOutlinerForMasterPageOutlineTextObj(aSel);
+ if (pOL)
+ {
+ //we are on the last paragraph
+ aSel.Adjust();
+ if (aSel.nEndPara == pOL->GetParagraphCount() - 1)
+ {
+ sal_uInt16 nDepth = pOL->GetDepth(aSel.nEndPara);
+ //there exists a previous numbering level
+ if (nDepth != sal_uInt16(-1) && nDepth > 0)
+ {
+ Paragraph* pPara = pOL->GetParagraph(aSel.nEndPara);
+ pOL->Remove(pPara, 1);
+ }
+ }
+ }
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_SHOW_NEXT_LEVEL:
+ {
+ const TranslateId STR_PRESOBJ_MPOUTLINE_ARY[]
+ {
+ STR_PRESOBJ_MPOUTLINE,
+ STR_PRESOBJ_MPOUTLLAYER2,
+ STR_PRESOBJ_MPOUTLLAYER3,
+ STR_PRESOBJ_MPOUTLLAYER4,
+ STR_PRESOBJ_MPOUTLLAYER5,
+ STR_PRESOBJ_MPOUTLLAYER6,
+ STR_PRESOBJ_MPOUTLLAYER7,
+ STR_PRESOBJ_MPNOTESTITLE,
+ STR_PRESOBJ_MPNOTESTEXT,
+ STR_PRESOBJ_NOTESTEXT
+ };
+
+ ESelection aSel;
+ // fdo#78151 editing a PresObjKind::Outline in a master page ?
+ ::Outliner* pOL = GetOutlinerForMasterPageOutlineTextObj(aSel);
+ if (pOL)
+ {
+ //we are on the last paragraph
+ aSel.Adjust();
+ if (aSel.nEndPara == pOL->GetParagraphCount() - 1)
+ {
+ sal_uInt16 nDepth = pOL->GetDepth(aSel.nEndPara);
+ //there exists a previous numbering level
+ if (nDepth < 8)
+ {
+ sal_uInt16 nNewDepth = nDepth+1;
+ pOL->Insert(SdResId(STR_PRESOBJ_MPOUTLINE_ARY[nNewDepth]), EE_PARA_APPEND, nNewDepth);
+ }
+ }
+ }
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_INSERT_FLD_DATE_FIX:
+ case SID_INSERT_FLD_DATE_VAR:
+ case SID_INSERT_FLD_TIME_FIX:
+ case SID_INSERT_FLD_TIME_VAR:
+ case SID_INSERT_FLD_AUTHOR:
+ case SID_INSERT_FLD_PAGE:
+ case SID_INSERT_FLD_PAGE_TITLE:
+ case SID_INSERT_FLD_PAGES:
+ case SID_INSERT_FLD_FILE:
+ {
+ sal_uInt16 nMul = 1;
+ std::unique_ptr<SvxFieldItem> pFieldItem;
+
+ switch( nSId )
+ {
+ case SID_INSERT_FLD_DATE_FIX:
+ pFieldItem.reset(new SvxFieldItem(
+ SvxDateField( Date( Date::SYSTEM ), SvxDateType::Fix ), EE_FEATURE_FIELD ));
+ break;
+
+ case SID_INSERT_FLD_DATE_VAR:
+ pFieldItem.reset(new SvxFieldItem( SvxDateField(), EE_FEATURE_FIELD ));
+ break;
+
+ case SID_INSERT_FLD_TIME_FIX:
+ pFieldItem.reset(new SvxFieldItem(
+ SvxExtTimeField( ::tools::Time( ::tools::Time::SYSTEM ), SvxTimeType::Fix ), EE_FEATURE_FIELD ));
+ break;
+
+ case SID_INSERT_FLD_TIME_VAR:
+ pFieldItem.reset(new SvxFieldItem( SvxExtTimeField(), EE_FEATURE_FIELD ));
+ break;
+
+ case SID_INSERT_FLD_AUTHOR:
+ {
+ SvtUserOptions aUserOptions;
+ pFieldItem.reset(new SvxFieldItem(
+ SvxAuthorField(
+ aUserOptions.GetFirstName(), aUserOptions.GetLastName(), aUserOptions.GetID() ), EE_FEATURE_FIELD ));
+ }
+ break;
+
+ case SID_INSERT_FLD_PAGE:
+ {
+ pFieldItem.reset(new SvxFieldItem( SvxPageField(), EE_FEATURE_FIELD ));
+ nMul = 3;
+ }
+ break;
+
+ case SID_INSERT_FLD_PAGE_TITLE:
+ {
+ pFieldItem.reset(new SvxFieldItem( SvxPageTitleField(), EE_FEATURE_FIELD));
+ nMul = 3;
+ }
+ break;
+
+ case SID_INSERT_FLD_PAGES:
+ {
+ pFieldItem.reset(new SvxFieldItem( SvxPagesField(), EE_FEATURE_FIELD ));
+ nMul = 3;
+ }
+ break;
+
+ case SID_INSERT_FLD_FILE:
+ {
+ OUString aName;
+ if( GetDocSh()->HasName() )
+ aName = GetDocSh()->GetMedium()->GetName();
+ pFieldItem.reset(new SvxFieldItem( SvxExtFileField( aName ), EE_FEATURE_FIELD ));
+ }
+ break;
+ }
+
+ OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
+
+ if( pOLV )
+ {
+ const SvxFieldItem* pOldFldItem = pOLV->GetFieldAtSelection();
+
+ if( pOldFldItem && ( nullptr != dynamic_cast< const SvxURLField *>( pOldFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxDateField *>( pOldFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxTimeField *>( pOldFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtTimeField *>( pOldFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtFileField *>( pOldFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxAuthorField *>( pOldFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxPageField *>( pOldFldItem->GetField() ) ) )
+ {
+ // select field, then it will be deleted when inserting
+ ESelection aSel = pOLV->GetSelection();
+ if( aSel.nStartPos == aSel.nEndPos )
+ aSel.nEndPos++;
+ pOLV->SetSelection( aSel );
+ }
+
+ if( pFieldItem )
+ pOLV->InsertField( *pFieldItem );
+ }
+ else
+ {
+ Outliner* pOutl = GetDoc()->GetInternalOutliner();
+ pOutl->Init( OutlinerMode::TextObject );
+ OutlinerMode nOutlMode = pOutl->GetOutlinerMode();
+ pOutl->SetStyleSheet( 0, nullptr );
+ pOutl->QuickInsertField( *pFieldItem, ESelection() );
+ std::optional<OutlinerParaObject> pOutlParaObject = pOutl->CreateParaObject();
+
+ SdrRectObj* pRectObj = new SdrRectObj(
+ *GetDoc(),
+ SdrObjKind::Text);
+ pRectObj->SetMergedItem(makeSdrTextAutoGrowWidthItem(true));
+
+ pOutl->UpdateFields();
+ pOutl->SetUpdateLayout( true );
+ Size aSize( pOutl->CalcTextSize() );
+ aSize.setWidth( aSize.Width() * nMul );
+ pOutl->SetUpdateLayout( false );
+
+ Point aPos;
+ ::tools::Rectangle aRect( aPos, GetActiveWindow()->GetOutputSizePixel() );
+ aPos = aRect.Center();
+ aPos = GetActiveWindow()->PixelToLogic(aPos);
+ aPos.AdjustX( -(aSize.Width() / 2) );
+ aPos.AdjustY( -(aSize.Height() / 2) );
+
+ ::tools::Rectangle aLogicRect(aPos, aSize);
+ pRectObj->SetLogicRect(aLogicRect);
+ pRectObj->SetOutlinerParaObject( std::move(pOutlParaObject) );
+ mpDrawView->InsertObjectAtView(pRectObj, *mpDrawView->GetSdrPageView());
+ pOutl->Init( nOutlMode );
+ }
+
+ pFieldItem.reset();
+
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_MODIFY_FIELD:
+ {
+ OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
+
+ if( pOLV )
+ {
+ const SvxFieldItem* pFldItem = pOLV->GetFieldAtSelection();
+
+ if( pFldItem && (nullptr != dynamic_cast< const SvxDateField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxAuthorField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtFileField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtTimeField *>( pFldItem->GetField() ) ) )
+ {
+ // Dialog...
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ vcl::Window* pWin = GetActiveWindow();
+ ScopedVclPtr<AbstractSdModifyFieldDlg> pDlg( pFact->CreateSdModifyFieldDlg(pWin ? pWin->GetFrameWeld() : nullptr, pFldItem->GetField(), pOLV->GetAttribs() ) );
+ if( pDlg->Execute() == RET_OK )
+ {
+ // To make a correct SetAttribs() call at the utlinerView
+ // it is necessary to split the actions here
+ std::unique_ptr<SvxFieldData> pField(pDlg->GetField());
+ ESelection aSel = pOLV->GetSelection();
+ bool bSelectionWasModified(false);
+
+ if( pField )
+ {
+ SvxFieldItem aFieldItem( *pField, EE_FEATURE_FIELD );
+
+ if( aSel.nStartPos == aSel.nEndPos )
+ {
+ bSelectionWasModified = true;
+ aSel.nEndPos++;
+ pOLV->SetSelection( aSel );
+ }
+
+ pOLV->InsertField( aFieldItem );
+
+ // select again for eventual SetAttribs call
+ pOLV->SetSelection( aSel );
+ }
+
+ SfxItemSet aSet( pDlg->GetItemSet() );
+
+ if( aSet.Count() )
+ {
+ pOLV->SetAttribs( aSet );
+
+ ::Outliner* pOutliner = pOLV->GetOutliner();
+ if( pOutliner )
+ pOutliner->UpdateFields();
+ }
+
+ if(pField)
+ {
+ // restore selection to original
+ if(bSelectionWasModified)
+ {
+ aSel.nEndPos--;
+ pOLV->SetSelection( aSel );
+ }
+ }
+ }
+ }
+ }
+
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_OPEN_XML_FILTERSETTINGS:
+ {
+ try
+ {
+ css::uno::Reference < css::ui::dialogs::XExecutableDialog > xDialog = css::ui::dialogs::XSLTFilterDialog::create( ::comphelper::getProcessComponentContext() );
+ xDialog->execute();
+ }
+ catch( css::uno::RuntimeException& )
+ {
+ DBG_UNHANDLED_EXCEPTION("sd.view");
+ }
+
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_GROUP: // BASIC
+ {
+ if ( mpDrawView->IsPresObjSelected( true, true, true ) )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ mpDrawView->GroupMarked();
+ }
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_UNGROUP: // BASIC
+ {
+ mpDrawView->UnGroupMarked();
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_NAME_GROUP:
+ {
+ // only allow for single object selection since the name of an object needs
+ // to be unique
+ if(1 == mpDrawView->GetMarkedObjectCount())
+ {
+ // #i68101#
+ SdrObject* pSelected = mpDrawView->GetMarkedObjectByIndex(0);
+ OSL_ENSURE(pSelected, "DrawViewShell::FuTemp03: nMarkCount, but no object (!)");
+ OUString aName(pSelected->GetName());
+
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractSvxObjectNameDialog> pDlg(pFact->CreateSvxObjectNameDialog(GetFrameWeld(), aName));
+
+ pDlg->SetCheckNameHdl(LINK(this, DrawViewShell, NameObjectHdl));
+
+ if(RET_OK == pDlg->Execute())
+ {
+ pDlg->GetName(aName);
+ pSelected->SetName(aName);
+
+ SdPage* pPage = GetActualPage();
+ if (pPage)
+ pPage->notifyObjectRenamed(pSelected);
+ }
+ }
+
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_NAVIGATOR_STATE, true );
+ rBindings.Invalidate( SID_CONTEXT );
+
+ Cancel();
+ rReq.Ignore();
+ break;
+ }
+
+ // #i68101#
+ case SID_OBJECT_TITLE_DESCRIPTION:
+ {
+ if(1 == mpDrawView->GetMarkedObjectCount())
+ {
+ SdrObject* pSelected = mpDrawView->GetMarkedObjectByIndex(0);
+ OSL_ENSURE(pSelected, "DrawViewShell::FuTemp03: nMarkCount, but no object (!)");
+ OUString aTitle(pSelected->GetTitle());
+ OUString aDescription(pSelected->GetDescription());
+
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractSvxObjectTitleDescDialog> pDlg(pFact->CreateSvxObjectTitleDescDialog(
+ GetFrameWeld(), aTitle, aDescription));
+
+ if(RET_OK == pDlg->Execute())
+ {
+ pDlg->GetTitle(aTitle);
+ pDlg->GetDescription(aDescription);
+ pSelected->SetTitle(aTitle);
+ pSelected->SetDescription(aDescription);
+ }
+ }
+
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_NAVIGATOR_STATE, true );
+ rBindings.Invalidate( SID_CONTEXT );
+
+ Cancel();
+ rReq.Ignore();
+ break;
+ }
+
+ case SID_ENTER_GROUP: // BASIC
+ {
+ mpDrawView->EnterMarkedGroup();
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_LEAVE_GROUP: // BASIC
+ {
+ mpDrawView->LeaveOneGroup();
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_LEAVE_ALL_GROUPS: // BASIC
+ {
+ mpDrawView->LeaveAllGroup();
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_TEXT_COMBINE: // BASIC
+ {
+ // End text edit to avoid conflicts
+ if(mpDrawView->IsTextEdit())
+ mpDrawView->SdrEndTextEdit();
+
+ if ( mpDrawView->IsPresObjSelected() )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->CombineMarkedTextObjects();
+ }
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_COMBINE: // BASIC
+ {
+ // End text edit to avoid conflicts
+ if(mpDrawView->IsTextEdit())
+ mpDrawView->SdrEndTextEdit();
+
+ if ( mpDrawView->IsPresObjSelected() )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->CombineMarkedObjects(false);
+ }
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_DISTRIBUTE_HLEFT:
+ case SID_DISTRIBUTE_HCENTER:
+ case SID_DISTRIBUTE_HDISTANCE:
+ case SID_DISTRIBUTE_HRIGHT:
+ case SID_DISTRIBUTE_VTOP:
+ case SID_DISTRIBUTE_VCENTER:
+ case SID_DISTRIBUTE_VDISTANCE:
+ case SID_DISTRIBUTE_VBOTTOM:
+ {
+ if ( mpDrawView->IsPresObjSelected() )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ mpDrawView->DistributeMarkedObjects(nSId);
+ }
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+ case SID_POLY_MERGE:
+ {
+ // End text edit to avoid conflicts
+ if(mpDrawView->IsTextEdit())
+ mpDrawView->SdrEndTextEdit();
+
+ if ( mpDrawView->IsPresObjSelected() )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->MergeMarkedObjects(SdrMergeMode::Merge);
+ }
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_POLY_SUBSTRACT:
+ {
+ // End text edit to avoid conflicts
+ if(mpDrawView->IsTextEdit())
+ mpDrawView->SdrEndTextEdit();
+
+ if ( mpDrawView->IsPresObjSelected() )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->MergeMarkedObjects(SdrMergeMode::Subtract);
+ }
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_POLY_INTERSECT:
+ {
+ // End text edit to avoid conflicts
+ if(mpDrawView->IsTextEdit())
+ mpDrawView->SdrEndTextEdit();
+
+ if ( mpDrawView->IsPresObjSelected() )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->MergeMarkedObjects(SdrMergeMode::Intersect);
+ }
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_EQUALIZEWIDTH:
+ case SID_EQUALIZEHEIGHT:
+ {
+ // End text edit to avoid conflicts
+ if(mpDrawView->IsTextEdit())
+ mpDrawView->SdrEndTextEdit();
+
+ mpDrawView->EqualizeMarkedObjects(nSId == SID_EQUALIZEWIDTH);
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_DISMANTLE: // BASIC
+ {
+ if ( mpDrawView->IsDismantlePossible() )
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->DismantleMarkedObjects();
+ }
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_CONNECT: // BASIC
+ {
+ if ( mpDrawView->IsPresObjSelected() )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->CombineMarkedObjects();
+ }
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_BREAK: // BASIC
+ {
+ if ( mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+
+ if ( mpDrawView->IsBreak3DObjPossible() )
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->Break3DObj();
+ }
+ else if ( mpDrawView->IsDismantlePossible(true) )
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->DismantleMarkedObjects(true);
+ }
+ else if ( mpDrawView->IsImportMtfPossible() )
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ const size_t nCnt=rMarkList.GetMarkCount();
+
+ // determine the sum of meta objects of all selected meta files
+ sal_uLong nCount = 0;
+ for(size_t nm=0; nm<nCnt; ++nm)
+ {
+ SdrMark* pM=rMarkList.GetMark(nm);
+ SdrObject* pObj=pM->GetMarkedSdrObj();
+ SdrGrafObj* pGraf= dynamic_cast< SdrGrafObj *>( pObj );
+ SdrOle2Obj* pOle2= dynamic_cast< SdrOle2Obj *>( pObj );
+
+ if (pGraf != nullptr)
+ {
+ if (pGraf->HasGDIMetaFile())
+ {
+ nCount += pGraf->GetGraphic().GetGDIMetaFile().GetActionSize();
+ }
+ else if (pGraf->isEmbeddedVectorGraphicData())
+ {
+ nCount += pGraf->getMetafileFromEmbeddedVectorGraphicData().GetActionSize();
+ }
+ }
+
+ if(pOle2 && pOle2->GetGraphic())
+ {
+ nCount += pOle2->GetGraphic()->GetGDIMetaFile().GetActionSize();
+ }
+ }
+
+ // decide with the sum of all meta objects if we should show a dialog
+ if(nCount < MIN_ACTIONS_FOR_DIALOG)
+ {
+ // nope, no dialog
+ mpDrawView->DoImportMarkedMtf();
+ }
+ else
+ {
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateBreakDlg(GetFrameWeld(), mpDrawView.get(), GetDocSh(), nCount, static_cast<sal_uLong>(nCnt) ));
+ pDlg->Execute();
+ }
+ }
+
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_CONVERT_TO_3D:
+ {
+ if ( mpDrawView->IsPresObjSelected() )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ if (mpDrawView->IsConvertTo3DObjPossible())
+ {
+ if (mpDrawView->IsTextEdit())
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->ConvertMarkedObjTo3D();
+ }
+ }
+
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_FRAME_TO_TOP: // BASIC
+ {
+ mpDrawView->PutMarkedToTop();
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_MOREFRONT: // BASIC
+ case SID_FRAME_UP: // BASIC
+ {
+ mpDrawView->MovMarkedToTop();
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_MOREBACK: // BASIC
+ case SID_FRAME_DOWN: // BASIC
+ {
+ mpDrawView->MovMarkedToBtm();
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_FRAME_TO_BOTTOM: // BASIC
+ {
+ mpDrawView->PutMarkedToBtm();
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_HORIZONTAL: // BASIC
+ case SID_FLIP_HORIZONTAL:
+ {
+ mpDrawView->MirrorAllMarkedHorizontal();
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_VERTICAL: // BASIC
+ case SID_FLIP_VERTICAL:
+ {
+ mpDrawView->MirrorAllMarkedVertical();
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_OBJECT_ALIGN_LEFT: // BASIC
+ {
+ mpDrawView->AlignMarkedObjects(SdrHorAlign::Left, SdrVertAlign::NONE);
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_OBJECT_ALIGN_CENTER: // BASIC
+ {
+ mpDrawView->AlignMarkedObjects(SdrHorAlign::Center, SdrVertAlign::NONE);
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_OBJECT_ALIGN_RIGHT: // BASIC
+ {
+ mpDrawView->AlignMarkedObjects(SdrHorAlign::Right, SdrVertAlign::NONE);
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_OBJECT_ALIGN_UP: // BASIC
+ {
+ mpDrawView->AlignMarkedObjects(SdrHorAlign::NONE, SdrVertAlign::Top);
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_OBJECT_ALIGN_MIDDLE: // BASIC
+ {
+ mpDrawView->AlignMarkedObjects(SdrHorAlign::NONE, SdrVertAlign::Center);
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_OBJECT_ALIGN_DOWN: // BASIC
+ {
+ mpDrawView->AlignMarkedObjects(SdrHorAlign::NONE, SdrVertAlign::Bottom);
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_SELECTALL: // BASIC
+ {
+ if( (dynamic_cast<FuSelection*>( GetOldFunction().get() ) != nullptr) &&
+ !GetView()->IsFrameDragSingles() && GetView()->HasMarkablePoints())
+ {
+ if ( !mpDrawView->IsAction() )
+ mpDrawView->MarkAllPoints();
+ }
+ else
+ mpDrawView->SelectAll();
+
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_STYLE_NEW: // BASIC ???
+ case SID_STYLE_APPLY:
+ case SID_STYLE_EDIT:
+ case SID_STYLE_DELETE:
+ case SID_STYLE_HIDE:
+ case SID_STYLE_SHOW:
+ case SID_STYLE_FAMILY:
+ case SID_STYLE_WATERCAN:
+ case SID_STYLE_UPDATE_BY_EXAMPLE:
+ case SID_STYLE_NEW_BY_EXAMPLE:
+ {
+ if( rReq.GetSlot() == SID_STYLE_EDIT && !rReq.GetArgs() )
+ {
+ SfxStyleSheet* pStyleSheet = mpDrawView->GetStyleSheet();
+ if( pStyleSheet && pStyleSheet->GetFamily() == SfxStyleFamily::Page)
+ pStyleSheet = static_cast<SdStyleSheet*>(pStyleSheet)->GetPseudoStyleSheet();
+
+ if( (pStyleSheet == nullptr) && GetView()->IsTextEdit() )
+ {
+ GetView()->SdrEndTextEdit();
+
+ pStyleSheet = mpDrawView->GetStyleSheet();
+ if(pStyleSheet && pStyleSheet->GetFamily() == SfxStyleFamily::Page)
+ pStyleSheet = static_cast<SdStyleSheet*>(pStyleSheet)->GetPseudoStyleSheet();
+ }
+
+ if( pStyleSheet == nullptr )
+ {
+ rReq.Ignore();
+ break;
+ }
+
+ SfxAllItemSet aSet(GetDoc()->GetPool());
+
+ SfxStringItem aStyleNameItem( SID_STYLE_EDIT, pStyleSheet->GetName() );
+ aSet.Put(aStyleNameItem);
+
+ SfxUInt16Item aStyleFamilyItem( SID_STYLE_FAMILY, static_cast<sal_uInt16>(pStyleSheet->GetFamily()) );
+ aSet.Put(aStyleFamilyItem);
+
+ rReq.SetArgs(aSet);
+ }
+
+ if( rReq.GetArgs() )
+ {
+ SetCurrentFunction( FuTemplate::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ if( rReq.GetSlot() == SID_STYLE_APPLY )
+ GetViewFrame()->GetBindings().Invalidate( SID_STYLE_APPLY );
+ Cancel();
+ }
+ else if( rReq.GetSlot() == SID_STYLE_APPLY )
+ GetViewFrame()->GetDispatcher()->Execute( SID_STYLE_DESIGNER, SfxCallMode::ASYNCHRON );
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_IMAP:
+ {
+ sal_uInt16 nId = SvxIMapDlgChildWindow::GetChildWindowId();
+
+ GetViewFrame()->ToggleChildWindow( nId );
+ GetViewFrame()->GetBindings().Invalidate( SID_IMAP );
+
+ if ( GetViewFrame()->HasChildWindow( nId )
+ && ( ( ViewShell::Implementation::GetImageMapDialog() ) != nullptr ) )
+ {
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+
+ if ( rMarkList.GetMarkCount() == 1 )
+ UpdateIMapDlg( rMarkList.GetMark( 0 )->GetMarkedSdrObj() );
+ }
+
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_GRID_FRONT:
+ {
+ mpDrawView->SetGridFront( !mpDrawView->IsGridFront() );
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_HELPLINES_FRONT:
+ {
+ mpDrawView->SetHlplFront( !mpDrawView->IsHlplFront() );
+ Cancel();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_FONTWORK:
+ {
+ if ( rReq.GetArgs() )
+ {
+ GetViewFrame()->SetChildWindow(SvxFontWorkChildWindow::GetChildWindowId(),
+ static_cast<const SfxBoolItem&>(rReq.GetArgs()->
+ Get(SID_FONTWORK)).GetValue());
+ }
+ else
+ {
+ GetViewFrame()->ToggleChildWindow( SvxFontWorkChildWindow::GetChildWindowId() );
+ }
+
+ GetViewFrame()->GetBindings().Invalidate(SID_FONTWORK);
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_COLOR_CONTROL:
+ {
+ if ( rReq.GetArgs() )
+ GetViewFrame()->SetChildWindow(SvxColorChildWindow::GetChildWindowId(),
+ static_cast<const SfxBoolItem&>(rReq.GetArgs()->
+ Get(SID_COLOR_CONTROL)).GetValue());
+ else
+ GetViewFrame()->ToggleChildWindow(SvxColorChildWindow::GetChildWindowId() );
+
+ GetViewFrame()->GetBindings().Invalidate(SID_COLOR_CONTROL);
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_EXTRUSION_TOGGLE:
+ case SID_EXTRUSION_TILT_DOWN:
+ case SID_EXTRUSION_TILT_UP:
+ case SID_EXTRUSION_TILT_LEFT:
+ case SID_EXTRUSION_TILT_RIGHT:
+ case SID_EXTRUSION_3D_COLOR:
+ case SID_EXTRUSION_DEPTH:
+ case SID_EXTRUSION_DIRECTION:
+ case SID_EXTRUSION_PROJECTION:
+ case SID_EXTRUSION_LIGHTING_DIRECTION:
+ case SID_EXTRUSION_LIGHTING_INTENSITY:
+ case SID_EXTRUSION_SURFACE:
+ case SID_EXTRUSION_DEPTH_FLOATER:
+ case SID_EXTRUSION_DIRECTION_FLOATER:
+ case SID_EXTRUSION_LIGHTING_FLOATER:
+ case SID_EXTRUSION_SURFACE_FLOATER:
+ case SID_EXTRUSION_DEPTH_DIALOG:
+ svx::ExtrusionBar::execute( mpDrawView.get(), rReq, GetViewFrame()->GetBindings() );
+ Cancel();
+ rReq.Ignore ();
+ break;
+
+ case SID_FONTWORK_SHAPE:
+ case SID_FONTWORK_SHAPE_TYPE:
+ case SID_FONTWORK_ALIGNMENT:
+ case SID_FONTWORK_SAME_LETTER_HEIGHTS:
+ case SID_FONTWORK_CHARACTER_SPACING:
+ case SID_FONTWORK_KERN_CHARACTER_PAIRS:
+ case SID_FONTWORK_GALLERY_FLOATER:
+ case SID_FONTWORK_CHARACTER_SPACING_FLOATER:
+ case SID_FONTWORK_ALIGNMENT_FLOATER:
+ case SID_FONTWORK_CHARACTER_SPACING_DIALOG:
+ svx::FontworkBar::execute(*mpDrawView, rReq, GetViewFrame()->GetBindings());
+ Cancel();
+ rReq.Ignore ();
+ break;
+
+ case SID_BMPMASK:
+ {
+ GetViewFrame()->ToggleChildWindow( SvxBmpMaskChildWindow::GetChildWindowId() );
+ GetViewFrame()->GetBindings().Invalidate( SID_BMPMASK );
+
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_NAVIGATOR:
+ {
+ if ( rReq.GetArgs() )
+ GetViewFrame()->SetChildWindow(SID_NAVIGATOR,
+ static_cast<const SfxBoolItem&>(rReq.GetArgs()->
+ Get(SID_NAVIGATOR)).GetValue());
+ else
+ GetViewFrame()->ToggleChildWindow( SID_NAVIGATOR );
+
+ GetViewFrame()->GetBindings().Invalidate(SID_NAVIGATOR);
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_SLIDE_TRANSITIONS_PANEL:
+ case SID_MASTER_SLIDES_PANEL:
+ case SID_CUSTOM_ANIMATION_PANEL:
+ case SID_GALLERY:
+ {
+ // First make sure that the sidebar is visible
+ GetViewFrame()->ShowChildWindow(SID_SIDEBAR);
+
+ OUString panelId;
+ if (nSId == SID_CUSTOM_ANIMATION_PANEL)
+ panelId = "SdCustomAnimationPanel";
+ else if (nSId == SID_GALLERY)
+ panelId = "GalleryPanel";
+ else if (nSId == SID_SLIDE_TRANSITIONS_PANEL)
+ panelId = "SdSlideTransitionPanel";
+ else if (nSId == SID_MASTER_SLIDES_PANEL)
+ panelId = "SdAllMasterPagesPanel";
+
+ ::sfx2::sidebar::Sidebar::TogglePanel(
+ panelId,
+ GetViewFrame()->GetFrame().GetFrameInterface());
+
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_ANIMATION_OBJECTS:
+ {
+ if ( rReq.GetArgs() )
+ GetViewFrame()->SetChildWindow(
+ AnimationChildWindow::GetChildWindowId(),
+ static_cast<const SfxBoolItem&>(rReq.GetArgs()->
+ Get(SID_ANIMATION_OBJECTS)).GetValue());
+ else
+ GetViewFrame()->ToggleChildWindow(
+ AnimationChildWindow::GetChildWindowId() );
+
+ GetViewFrame()->GetBindings().Invalidate(SID_ANIMATION_OBJECTS);
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_3D_WIN:
+ {
+ if ( rReq.GetArgs() )
+ GetViewFrame()->SetChildWindow( Svx3DChildWindow::GetChildWindowId(),
+ static_cast<const SfxBoolItem&>(rReq.GetArgs()->
+ Get( SID_3D_WIN )).GetValue());
+ else
+ GetViewFrame()->ToggleChildWindow( Svx3DChildWindow::GetChildWindowId() );
+
+ GetViewFrame()->GetBindings().Invalidate( SID_3D_WIN );
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_CONVERT_TO_3D_LATHE_FAST:
+ {
+ /* The call is enough. The initialization via Start3DCreation and
+ CreateMirrorPolygons is no longer needed if the parameter
+ sal_True is provided. Then a tilted rotary body with an axis left
+ besides the bounding rectangle of the selected objects is drawn
+ immediately and without user interaction. */
+ mpDrawView->SdrEndTextEdit();
+ if(GetActiveWindow())
+ GetActiveWindow()->EnterWait();
+ mpDrawView->End3DCreation(true);
+ Cancel();
+ rReq.Ignore();
+ if(GetActiveWindow())
+ GetActiveWindow()->LeaveWait();
+ }
+ break;
+
+ case SID_PRESENTATION_DLG:
+ {
+ SetCurrentFunction( FuSlideShowDlg::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case SID_REMOTE_DLG:
+ {
+#ifdef ENABLE_SDREMOTE
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateRemoteDialog(GetFrameWeld()));
+ pDlg->Execute();
+#endif
+ }
+ break;
+
+ case SID_CUSTOMSHOW_DLG:
+ {
+ SetCurrentFunction( FuCustomShowDlg::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case SID_EXPAND_PAGE:
+ {
+ SetCurrentFunction( FuExpandPage::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case SID_SUMMARY_PAGE:
+ {
+ mpDrawView->SdrEndTextEdit();
+ SetCurrentFunction( FuSummaryPage::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+#if HAVE_FEATURE_AVMEDIA
+ case SID_AVMEDIA_PLAYER:
+ {
+ GetViewFrame()->ToggleChildWindow( ::avmedia::MediaPlayer::GetChildWindowId() );
+ GetViewFrame()->GetBindings().Invalidate( SID_AVMEDIA_PLAYER );
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+#endif
+
+ case SID_PRESENTATION_MINIMIZER:
+ {
+ Reference<XComponentContext> xContext(::comphelper::getProcessComponentContext());
+ Reference<util::XURLTransformer> xParser(util::URLTransformer::create(xContext));
+ Reference<frame::XDispatchProvider> xProvider(GetViewShellBase().GetController()->getFrame(), UNO_QUERY);
+ if (xProvider.is())
+ {
+ util::URL aURL;
+ aURL.Complete = "vnd.com.sun.star.comp.PresentationMinimizer:execute";
+ xParser->parseStrict(aURL);
+ uno::Reference<frame::XDispatch> xDispatch(xProvider->queryDispatch(aURL, OUString(), 0));
+ if (xDispatch.is())
+ {
+ xDispatch->dispatch(aURL, uno::Sequence< beans::PropertyValue >());
+ }
+ }
+ Cancel();
+ rReq.Ignore();
+ }
+ break;
+
+ case SID_DISPLAY_MASTER_BACKGROUND:
+ case SID_DISPLAY_MASTER_OBJECTS:
+ {
+ // Determine current page and toggle visibility of layers
+ // associated with master page background or master page shapes.
+ // FIXME: This solution is wrong, because shapes of master pages need
+ // not be on layer "background" or "backgroundobjects".
+ // See tdf#118613
+ SdPage* pPage = GetActualPage();
+ if (pPage != nullptr
+ && GetDoc() != nullptr)
+ {
+ SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
+ SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin();
+ SdrLayerID aLayerId;
+ if (nSId == SID_DISPLAY_MASTER_BACKGROUND)
+ aLayerId = rLayerAdmin.GetLayerID(sUNO_LayerName_background);
+ else
+ aLayerId = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects);
+ aVisibleLayers.Set(aLayerId, !aVisibleLayers.IsSet(aLayerId));
+ pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+ }
+ Cancel();
+ rReq.Done(); // Mark task as done to auto-update the state of each buttons tdf#132816
+ }
+ break;
+
+ case SID_PHOTOALBUM:
+ {
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ vcl::Window* pWin = GetActiveWindow();
+ ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateSdPhotoAlbumDialog(
+ pWin ? pWin->GetFrameWeld() : nullptr,
+ GetDoc()));
+
+ pDlg->Execute();
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_INSERT_QRCODE:
+ case SID_EDIT_QRCODE:
+ {
+ VclAbstractDialogFactory* pFact = VclAbstractDialogFactory::Create();
+ const uno::Reference<frame::XModel> xModel = GetViewShellBase().GetController()->getModel();
+ ScopedVclPtr<AbstractQrCodeGenDialog> pDlg(pFact->CreateQrCodeGenDialog(
+ GetFrameWeld(), xModel, rReq.GetSlot() == SID_EDIT_QRCODE));
+ pDlg->Execute();
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_ADDITIONS_DIALOG:
+ {
+ OUString sAdditionsTag = "";
+
+ const SfxStringItem* pStringArg = rReq.GetArg<SfxStringItem>(FN_PARAM_ADDITIONS_TAG);
+ if (pStringArg)
+ sAdditionsTag = pStringArg->GetValue();
+
+ VclAbstractDialogFactory* pFact = VclAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractAdditionsDialog> pDlg(
+ pFact->CreateAdditionsDialog(GetFrameWeld(), sAdditionsTag));
+ pDlg->Execute();
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_ATTR_GLOW_COLOR:
+ case SID_ATTR_GLOW_RADIUS:
+ case SID_ATTR_GLOW_TRANSPARENCY:
+ case SID_ATTR_SOFTEDGE_RADIUS:
+ case SID_ATTR_TEXTCOLUMNS_NUMBER:
+ case SID_ATTR_TEXTCOLUMNS_SPACING:
+ if (const SfxItemSet* pNewArgs = rReq.GetArgs())
+ mpDrawView->SetAttributes(*pNewArgs);
+ rReq.Done();
+ Cancel();
+ break;
+
+ default:
+ {
+ SAL_WARN( "sd.ui", "Slot without function" );
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+ }
+
+ if(HasCurrentFunction())
+ {
+ GetCurrentFunction()->Activate();
+ }
+}
+
+void DrawViewShell::ExecChar( SfxRequest &rReq )
+{
+ SdDrawDocument* pDoc = GetDoc();
+ if (!pDoc || !mpDrawView)
+ return;
+
+ SfxItemSet aEditAttr( pDoc->GetPool() );
+ mpDrawView->GetAttributes( aEditAttr );
+
+ //modified by wj for sym2_1580, if put old itemset into new set,
+ //when mpDrawView->SetAttributes(aNewAttr) it will invalidate all the item
+ // and use old attr to update all the attributes
+// SfxItemSet aNewAttr( GetPool(),
+// EE_ITEMS_START, EE_ITEMS_END );
+// aNewAttr.Put( aEditAttr, sal_False );
+ SfxItemSet aNewAttr( pDoc->GetPool() );
+ //modified end
+
+ sal_uInt16 nSId = rReq.GetSlot();
+
+ switch ( nSId )
+ {
+ case SID_ATTR_CHAR_FONT:
+ if( rReq.GetArgs() )
+ {
+ const SvxFontItem* pItem = rReq.GetArg<SvxFontItem>(SID_ATTR_CHAR_FONT);
+ if (pItem)
+ {
+ aNewAttr.Put(*pItem);
+ }
+ }
+ break;
+ case SID_ATTR_CHAR_FONTHEIGHT:
+ if( rReq.GetArgs() )
+ {
+ const SvxFontHeightItem* pItem = rReq.GetArg<SvxFontHeightItem>(SID_ATTR_CHAR_FONTHEIGHT);
+ if (pItem)
+ {
+ aNewAttr.Put(*pItem);
+ }
+ }
+ break;
+ case SID_ATTR_CHAR_WEIGHT:
+ if( rReq.GetArgs() )
+ {
+ const SvxWeightItem* pItem = rReq.GetArg<SvxWeightItem>(SID_ATTR_CHAR_WEIGHT);
+ if (pItem)
+ {
+ aNewAttr.Put(*pItem);
+ }
+ }
+ break;
+ case SID_ATTR_CHAR_POSTURE:
+ if( rReq.GetArgs() )
+ {
+ const SvxPostureItem* pItem = rReq.GetArg<SvxPostureItem>(SID_ATTR_CHAR_POSTURE);
+ if (pItem)
+ {
+ aNewAttr.Put(*pItem);
+ }
+ }
+ break;
+ case SID_ATTR_CHAR_UNDERLINE:
+ if( rReq.GetArgs() )
+ {
+ const SvxUnderlineItem* pItem = rReq.GetArg<SvxUnderlineItem>(SID_ATTR_CHAR_UNDERLINE);
+ if (pItem)
+ {
+ aNewAttr.Put(*pItem);
+ }
+ else
+ {
+ FontLineStyle eFU = aEditAttr.Get( EE_CHAR_UNDERLINE ).GetLineStyle();
+ aNewAttr.Put( SvxUnderlineItem( eFU != LINESTYLE_NONE ?LINESTYLE_NONE : LINESTYLE_SINGLE, EE_CHAR_UNDERLINE ) );
+ }
+ }
+ break;
+ case SID_ATTR_CHAR_OVERLINE:
+ if( rReq.GetArgs() )
+ {
+ const SvxOverlineItem* pItem = rReq.GetArg<SvxOverlineItem>(SID_ATTR_CHAR_OVERLINE);
+ if (pItem)
+ {
+ aNewAttr.Put(*pItem);
+ }
+ else
+ {
+ FontLineStyle eFU = aEditAttr.Get( EE_CHAR_OVERLINE ).GetLineStyle();
+ aNewAttr.Put( SvxOverlineItem( eFU != LINESTYLE_NONE ?LINESTYLE_NONE : LINESTYLE_SINGLE, EE_CHAR_OVERLINE ) );
+ }
+ }
+ break;
+
+ case SID_ULINE_VAL_NONE:
+ {
+ aNewAttr.Put(SvxUnderlineItem(LINESTYLE_NONE, EE_CHAR_UNDERLINE));
+ break;
+ }
+
+ case SID_ULINE_VAL_SINGLE:
+ case SID_ULINE_VAL_DOUBLE:
+ case SID_ULINE_VAL_DOTTED:
+ {
+ FontLineStyle eOld = aEditAttr.Get(EE_CHAR_UNDERLINE).GetLineStyle();
+ FontLineStyle eNew = eOld;
+
+ switch (nSId)
+ {
+ case SID_ULINE_VAL_SINGLE:
+ eNew = ( eOld == LINESTYLE_SINGLE ) ? LINESTYLE_NONE : LINESTYLE_SINGLE;
+ break;
+ case SID_ULINE_VAL_DOUBLE:
+ eNew = ( eOld == LINESTYLE_DOUBLE ) ? LINESTYLE_NONE : LINESTYLE_DOUBLE;
+ break;
+ case SID_ULINE_VAL_DOTTED:
+ eNew = ( eOld == LINESTYLE_DOTTED ) ? LINESTYLE_NONE : LINESTYLE_DOTTED;
+ break;
+ }
+
+ SvxUnderlineItem aUnderline(eNew, EE_CHAR_UNDERLINE);
+ aNewAttr.Put(aUnderline);
+ }
+ break;
+
+ case SID_ATTR_CHAR_SHADOWED:
+ if( rReq.GetArgs() )
+ {
+ const SvxShadowedItem* pItem = rReq.GetArg<SvxShadowedItem>(SID_ATTR_CHAR_SHADOWED);
+ if (pItem)
+ {
+ aNewAttr.Put(*pItem);
+ }
+ }
+ break;
+ case SID_ATTR_CHAR_CONTOUR:
+ if( rReq.GetArgs() )
+ {
+ const SvxContourItem* pItem = rReq.GetArg<SvxContourItem>(SID_ATTR_CHAR_CONTOUR);
+ if (pItem)
+ {
+ aNewAttr.Put(*pItem);
+ }
+ }
+ break;
+
+ case SID_ATTR_CHAR_STRIKEOUT:
+ if( rReq.GetArgs() )
+ {
+ const SvxCrossedOutItem* pItem = rReq.GetArg<SvxCrossedOutItem>(SID_ATTR_CHAR_STRIKEOUT);
+ if (pItem)
+ {
+ aNewAttr.Put(*pItem);
+ }
+ }
+ break;
+ case SID_ATTR_CHAR_COLOR:
+ if( rReq.GetArgs() )
+ {
+ const SvxColorItem* pItem = rReq.GetArg<SvxColorItem>(SID_ATTR_CHAR_COLOR);
+ if (pItem)
+ {
+ aNewAttr.Put(*pItem);
+ }
+ }
+ break;
+ case SID_ATTR_CHAR_KERNING:
+ if( rReq.GetArgs() )
+ {
+ const SvxKerningItem* pItem = rReq.GetArg<SvxKerningItem>(SID_ATTR_CHAR_KERNING);
+ if (pItem)
+ {
+ aNewAttr.Put(*pItem);
+ }
+ }
+ break;
+ case SID_ATTR_CHAR_CASEMAP:
+ if( rReq.GetArgs() )
+ {
+ const SvxCaseMapItem* pItem = rReq.GetArg<SvxCaseMapItem>(SID_ATTR_CHAR_CASEMAP);
+ if (pItem)
+ {
+ aNewAttr.Put(*pItem);
+ }
+ }
+ break;
+ case SID_SET_SUB_SCRIPT:
+ {
+ SvxEscapementItem aItem( EE_CHAR_ESCAPEMENT );
+ SvxEscapement eEsc = static_cast<SvxEscapement>(aEditAttr.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue());
+ if( eEsc == SvxEscapement::Subscript )
+ aItem.SetEscapement( SvxEscapement::Off );
+ else
+ aItem.SetEscapement( SvxEscapement::Subscript );
+ aNewAttr.Put( aItem );
+ }
+ break;
+ case SID_SET_SUPER_SCRIPT:
+ {
+ SvxEscapementItem aItem( EE_CHAR_ESCAPEMENT );
+ SvxEscapement eEsc = static_cast<SvxEscapement>(aEditAttr.Get( EE_CHAR_ESCAPEMENT ).GetEnumValue());
+ if( eEsc == SvxEscapement::Superscript )
+ aItem.SetEscapement( SvxEscapement::Off );
+ else
+ aItem.SetEscapement( SvxEscapement::Superscript );
+ aNewAttr.Put( aItem );
+ }
+ break;
+ case SID_SHRINK_FONT_SIZE:
+ case SID_GROW_FONT_SIZE:
+ {
+ const SvxFontListItem* pFonts = dynamic_cast<const SvxFontListItem*>(GetDocSh()->GetItem( SID_ATTR_CHAR_FONTLIST ) );
+ const FontList* pFontList = pFonts ? pFonts->GetFontList() : nullptr;
+ if( pFontList )
+ {
+ FuText::ChangeFontSize( nSId == SID_GROW_FONT_SIZE, nullptr, pFontList, mpView );
+ GetViewFrame()->GetBindings().Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
+ }
+ break;
+ }
+ case SID_ATTR_CHAR_BACK_COLOR:
+ if( rReq.GetArgs() )
+ {
+ const SvxColorItem* pItem = rReq.GetArg<SvxColorItem>(SID_ATTR_CHAR_BACK_COLOR);
+ if (pItem)
+ {
+ aNewAttr.Put(*pItem);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ mpDrawView->SetAttributes(aNewAttr);
+ rReq.Done();
+ Cancel();
+}
+
+/** This method consists basically of three parts:
+ 1. Process the arguments of the SFX request.
+ 2. Use the model to create a new page or duplicate an existing one.
+ 3. Update the tab control and switch to the new page.
+*/
+SdPage* DrawViewShell::CreateOrDuplicatePage (
+ SfxRequest& rRequest,
+ PageKind ePageKind,
+ SdPage* pPage,
+ const sal_Int32 nInsertPosition)
+{
+ SdPage* pNewPage = nullptr;
+ if (ePageKind == PageKind::Standard && meEditMode != EditMode::MasterPage)
+ {
+ if ( mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+ pNewPage = ViewShell::CreateOrDuplicatePage (rRequest, ePageKind, pPage, nInsertPosition);
+ }
+ return pNewPage;
+}
+
+void DrawViewShell::DuplicateSelectedSlides (SfxRequest& rRequest)
+{
+ // Create a list of the pages that are to be duplicated. The process of
+ // duplication alters the selection.
+ sal_Int32 nInsertPosition (0);
+ ::std::vector<SdPage*> aPagesToDuplicate;
+ sd::slidesorter::SlideSorter &mrSlideSorter = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase())->GetSlideSorter();
+ sd::slidesorter::model::PageEnumeration aSelectedPages (
+ sd::slidesorter::model::PageEnumerationProvider::CreateSelectedPagesEnumeration(mrSlideSorter.GetModel()));
+ while (aSelectedPages.HasMoreElements())
+ {
+ sd::slidesorter::model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement());
+ if (pDescriptor && pDescriptor->GetPage())
+ {
+ aPagesToDuplicate.push_back(pDescriptor->GetPage());
+ nInsertPosition = pDescriptor->GetPage()->GetPageNum()+2;
+ }
+ }
+
+ // Duplicate the pages in aPagesToDuplicate and collect the newly
+ // created pages in aPagesToSelect.
+ const bool bUndo (aPagesToDuplicate.size()>1 && mrSlideSorter.GetView().IsUndoEnabled());
+ if (bUndo)
+ mrSlideSorter.GetView().BegUndo(SdResId(STR_INSERTPAGE));
+
+ ::std::vector<SdPage*> aPagesToSelect;
+ for(::std::vector<SdPage*>::const_iterator
+ iPage(aPagesToDuplicate.begin()),
+ iEnd(aPagesToDuplicate.end());
+ iPage!=iEnd;
+ ++iPage, nInsertPosition+=2)
+ {
+ aPagesToSelect.push_back(
+ mrSlideSorter.GetViewShell()->CreateOrDuplicatePage(
+ rRequest, PageKind::Standard, *iPage, nInsertPosition));
+ }
+ aPagesToDuplicate.clear();
+
+ if (bUndo)
+ mrSlideSorter.GetView().EndUndo();
+
+ // Set the selection to the pages in aPagesToSelect.
+ sd::slidesorter::controller::PageSelector& rSelector (mrSlideSorter.GetController().GetPageSelector());
+ rSelector.DeselectAllPages();
+ for (auto const& it: aPagesToSelect)
+ {
+ rSelector.SelectPage(it);
+ }
+}
+
+void DrawViewShell::ExecutePropPanelAttr (SfxRequest const & rReq)
+{
+ if(SlideShow::IsRunning( GetViewShellBase() ))
+ return;
+
+ SdDrawDocument* pDoc = GetDoc();
+ if (!pDoc || !mpDrawView)
+ return;
+
+ sal_uInt16 nSId = rReq.GetSlot();
+ SfxItemSet aAttrs( pDoc->GetPool() );
+
+ switch ( nSId )
+ {
+ case SID_TABLE_VERT_NONE:
+ case SID_TABLE_VERT_CENTER:
+ case SID_TABLE_VERT_BOTTOM:
+ SdrTextVertAdjust eTVA = SDRTEXTVERTADJUST_TOP;
+ if (nSId == SID_TABLE_VERT_CENTER)
+ eTVA = SDRTEXTVERTADJUST_CENTER;
+ else if (nSId == SID_TABLE_VERT_BOTTOM)
+ eTVA = SDRTEXTVERTADJUST_BOTTOM;
+
+ aAttrs.Put( SdrTextVertAdjustItem(eTVA) );
+ mpDrawView->SetAttributes(aAttrs);
+
+ break;
+ }
+}
+
+void DrawViewShell::GetStatePropPanelAttr(SfxItemSet& rSet)
+{
+ SfxWhichIter aIter( rSet );
+ sal_uInt16 nWhich = aIter.FirstWhich();
+
+ SdDrawDocument* pDoc = GetDoc();
+ if (!pDoc || !mpDrawView)
+ return;
+
+ SfxItemSet aAttrs( pDoc->GetPool() );
+ mpDrawView->GetAttributes( aAttrs );
+
+ while ( nWhich )
+ {
+ sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich)
+ ? GetPool().GetSlotId(nWhich)
+ : nWhich;
+ switch ( nSlotId )
+ {
+ case SID_TABLE_VERT_NONE:
+ case SID_TABLE_VERT_CENTER:
+ case SID_TABLE_VERT_BOTTOM:
+ bool bContour = false;
+ SfxItemState eConState = aAttrs.GetItemState( SDRATTR_TEXT_CONTOURFRAME );
+ if( eConState != SfxItemState::DONTCARE )
+ {
+ bContour = aAttrs.Get( SDRATTR_TEXT_CONTOURFRAME ).GetValue();
+ }
+ if (bContour) break;
+
+ SfxItemState eVState = aAttrs.GetItemState( SDRATTR_TEXT_VERTADJUST );
+ //SfxItemState eHState = aAttrs.GetItemState( SDRATTR_TEXT_HORZADJUST );
+
+ //if(SfxItemState::DONTCARE != eVState && SfxItemState::DONTCARE != eHState)
+ if(SfxItemState::DONTCARE != eVState)
+ {
+ SdrTextVertAdjust eTVA = aAttrs.Get(SDRATTR_TEXT_VERTADJUST).GetValue();
+ bool bSet = (nSlotId == SID_TABLE_VERT_NONE && eTVA == SDRTEXTVERTADJUST_TOP) ||
+ (nSlotId == SID_TABLE_VERT_CENTER && eTVA == SDRTEXTVERTADJUST_CENTER) ||
+ (nSlotId == SID_TABLE_VERT_BOTTOM && eTVA == SDRTEXTVERTADJUST_BOTTOM);
+ rSet.Put(SfxBoolItem(nSlotId, bSet));
+ }
+ else
+ {
+ rSet.Put(SfxBoolItem(nSlotId, false));
+ }
+ break;
+ }
+ nWhich = aIter.NextWhich();
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviews3.cxx b/sd/source/ui/view/drviews3.cxx
new file mode 100644
index 000000000..3f16136ff
--- /dev/null
+++ b/sd/source/ui/view/drviews3.cxx
@@ -0,0 +1,1106 @@
+/* -*- 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 <config_features.h>
+
+#include <DrawViewShell.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/tstpitem.hxx>
+#include <editeng/lrspitem.hxx>
+#include <editeng/protitem.hxx>
+#include <editeng/frmdiritem.hxx>
+#include <editeng/adjustitem.hxx>
+#include <svx/svdotable.hxx>
+#include <editeng/numitem.hxx>
+#include <svx/rulritem.hxx>
+#include <svx/svxids.hrc>
+#include <svx/svdpagv.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/dispatch.hxx>
+#include <tools/urlobj.hxx>
+#include <svl/eitem.hxx>
+#include <svl/rectitem.hxx>
+#include <svl/stritem.hxx>
+#include <svx/svdoole2.hxx>
+#include <svl/itempool.hxx>
+#include <svl/ptitem.hxx>
+#include <basic/sbstar.hxx>
+#include <basic/sberrors.hxx>
+#include <svx/fmshell.hxx>
+#include <svx/f3dchild.hxx>
+#include <svx/float3d.hxx>
+#include <svx/sdmetitm.hxx>
+#include <svx/svdogrp.hxx>
+#include <svx/diagram/IDiagramHelper.hxx>
+
+#include <app.hrc>
+#include <strings.hrc>
+
+#include <sdundogr.hxx>
+#include <undopage.hxx>
+#include <fupoor.hxx>
+#include <slideshow.hxx>
+#include <sdpage.hxx>
+#include <Window.hxx>
+#include <sdresid.hxx>
+#include <unokywds.hxx>
+#include <drawview.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <sdabstdlg.hxx>
+#include <sfx2/ipclient.hxx>
+#include <tools/diagnose_ex.h>
+#include <ViewShellBase.hxx>
+#include <FormShellManager.hxx>
+#include <LayerTabBar.hxx>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/XConfiguration.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
+#include <com/sun/star/frame/XFrame.hpp>
+#include <editeng/lspcitem.hxx>
+#include <editeng/ulspitem.hxx>
+#include <memory>
+#include <comphelper/processfactory.hxx>
+#include <oox/drawingml/diagram/diagram.hxx>
+#include <oox/export/drawingml.hxx>
+#include <oox/shape/ShapeFilterBase.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+using ::com::sun::star::frame::XFrame;
+using ::com::sun::star::frame::XController;
+
+namespace sd {
+
+/**
+ * handle SfxRequests for controller
+ */
+void DrawViewShell::ExecCtrl(SfxRequest& rReq)
+{
+ // except a page switch and jumps to bookmarks, nothing is executed during
+ // a slide show
+ if( HasCurrentFunction(SID_PRESENTATION) &&
+ rReq.GetSlot() != SID_SWITCHPAGE &&
+ rReq.GetSlot() != SID_JUMPTOMARK)
+ return;
+
+ CheckLineTo (rReq);
+
+ // End text edit mode for some requests.
+ sal_uInt16 nSlot = rReq.GetSlot();
+ bool bAllowFocusChange = true;
+ switch (nSlot)
+ {
+ case SID_OUTPUT_QUALITY_COLOR:
+ case SID_OUTPUT_QUALITY_GRAYSCALE:
+ case SID_OUTPUT_QUALITY_BLACKWHITE:
+ case SID_OUTPUT_QUALITY_CONTRAST:
+ // Do nothing.
+ break;
+ case SID_SWITCHPAGE:
+ if (rReq.GetArgs() && rReq.GetArgs()->Count () == 1)
+ {
+ const SfxBoolItem* pAllowFocusChange = rReq.GetArg<SfxBoolItem>(SID_SWITCHPAGE);
+ bAllowFocusChange = pAllowFocusChange->GetValue();
+ if (!bAllowFocusChange)
+ break;
+ }
+ [[fallthrough]];
+ default:
+ if ( mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+ }
+
+ // sal_uInt16 nSlot = rReq.GetSlot();
+ switch (nSlot)
+ {
+ case SID_SWITCHPAGE: // BASIC
+ {
+ // switch page in running slide show
+ if(SlideShow::IsRunning(GetViewShellBase()) && rReq.GetArgs())
+ {
+ if (const SfxUInt32Item* pWhatPage = rReq.GetArg<SfxUInt32Item>(ID_VAL_WHATPAGE))
+ SlideShow::GetSlideShow(GetViewShellBase())->jumpToPageNumber(static_cast<sal_Int32>((pWhatPage->GetValue()-1)>>1));
+ }
+ else
+ {
+ const SfxItemSet *pArgs = rReq.GetArgs ();
+ sal_uInt16 nSelectedPage = 0;
+
+ if (! pArgs || pArgs->Count () == 1)
+ {
+ nSelectedPage = maTabControl->GetCurPagePos();
+ }
+ else if (pArgs->Count () == 2)
+ {
+ const SfxUInt32Item* pWhatPage = rReq.GetArg<SfxUInt32Item>(ID_VAL_WHATPAGE);
+ const SfxUInt32Item* pWhatKind = rReq.GetArg<SfxUInt32Item>(ID_VAL_WHATKIND);
+
+ sal_Int32 nWhatPage = static_cast<sal_Int32>(pWhatPage->GetValue ());
+ PageKind nWhatKind = static_cast<PageKind>(pWhatKind->GetValue ());
+ if (nWhatKind < PageKind::Standard || nWhatKind > PageKind::Handout)
+ {
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE);
+#endif
+ rReq.Ignore ();
+ break;
+ }
+ else if (meEditMode != EditMode::MasterPage)
+ {
+ if (! CHECK_RANGE (0, nWhatPage, GetDoc()->GetSdPageCount(nWhatKind)))
+ {
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE);
+#endif
+ rReq.Ignore ();
+ break;
+ }
+
+ nSelectedPage = static_cast<short>(nWhatPage);
+ mePageKind = nWhatKind;
+ }
+ }
+ else
+ {
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ rReq.Ignore ();
+ break;
+ }
+
+ if( GetDocSh() && (GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED))
+ GetDocSh()->SetModified();
+
+ SwitchPage(nSelectedPage, bAllowFocusChange);
+
+ if(HasCurrentFunction(SID_BEZIER_EDIT))
+ GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+
+ Invalidate();
+ InvalidateWindows();
+ rReq.Done ();
+ }
+ break;
+ }
+
+ case SID_SWITCHLAYER: // BASIC
+ {
+ const SfxItemSet *pArgs = rReq.GetArgs ();
+
+ // #i87182#
+ bool bCurPageValid(false);
+ sal_uInt16 nCurPage(0);
+
+ if(GetLayerTabControl())
+ {
+ nCurPage = GetLayerTabControl()->GetCurPageId();
+ bCurPageValid = true;
+ }
+
+ if(pArgs && 1 == pArgs->Count())
+ {
+ const SfxUInt32Item* pWhatLayer = rReq.GetArg<SfxUInt32Item>(ID_VAL_WHATLAYER);
+
+ if(pWhatLayer)
+ {
+ nCurPage = static_cast<short>(pWhatLayer->GetValue());
+ bCurPageValid = true;
+ }
+ }
+
+ if(bCurPageValid)
+ {
+ OUString aLayerName( GetLayerTabControl()->GetLayerName(nCurPage));
+ if (!aLayerName.isEmpty())
+ {
+ mpDrawView->SetActiveLayer(aLayerName);
+ }
+ Invalidate();
+ }
+
+ rReq.Done ();
+
+ break;
+ }
+
+ case SID_PAGEMODE: // BASIC
+ {
+
+ const SfxItemSet *pArgs = rReq.GetArgs();
+
+ if (pArgs && pArgs->Count () == 2)
+ {
+ const SfxBoolItem* pIsActive = rReq.GetArg<SfxBoolItem>(ID_VAL_ISACTIVE);
+ const SfxUInt32Item* pWhatKind = rReq.GetArg<SfxUInt32Item>(ID_VAL_WHATKIND);
+
+ PageKind nWhatKind = static_cast<PageKind>(pWhatKind->GetValue());
+ if ( nWhatKind >= PageKind::Standard && nWhatKind <= PageKind::Handout)
+ {
+ mbIsLayerModeActive = pIsActive->GetValue();
+ mePageKind = nWhatKind;
+ }
+ }
+
+ // turn on default layer of page
+ mpDrawView->SetActiveLayer(sUNO_LayerName_layout);
+
+ ChangeEditMode(EditMode::Page, mbIsLayerModeActive);
+
+ Invalidate();
+ rReq.Done ();
+
+ break;
+ }
+
+ case SID_LAYERMODE: // BASIC
+ {
+ const SfxItemSet *pArgs = rReq.GetArgs();
+
+ if (pArgs && pArgs->Count() == 2)
+ {
+ const SfxUInt32Item* pWhatLayer = rReq.GetArg<SfxUInt32Item>(ID_VAL_WHATLAYER);
+ EditMode nWhatLayer = static_cast<EditMode>(pWhatLayer->GetValue());
+ if (nWhatLayer == EditMode::Page || nWhatLayer == EditMode::MasterPage)
+ {
+ mbIsLayerModeActive = rReq.GetArg<SfxBoolItem>(ID_VAL_ISACTIVE)->GetValue();
+ meEditMode = nWhatLayer;
+ }
+ }
+
+ ChangeEditMode(meEditMode, !mbIsLayerModeActive);
+
+ Invalidate();
+ rReq.Done();
+
+ break;
+ }
+
+ case SID_HEADER_AND_FOOTER:
+ case SID_INSERT_PAGE_NUMBER:
+ case SID_INSERT_DATE_TIME:
+ {
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ vcl::Window* pWin = GetActiveWindow();
+ VclPtr<AbstractHeaderFooterDialog> pDlg(pFact->CreateHeaderFooterDialog(this, pWin ? pWin->GetFrameWeld() : nullptr, GetDoc(), mpActualPage));
+ auto xRequest = std::make_shared<SfxRequest>(rReq);
+ rReq.Ignore(); // the 'old' request is not relevant any more
+ pDlg->StartExecuteAsync([this, pDlg, xRequest](sal_Int32 /*nResult*/){
+ GetActiveWindow()->Invalidate();
+ UpdatePreview( mpActualPage );
+
+ Invalidate();
+ xRequest->Done();
+
+ pDlg->disposeOnce();
+ });
+ break;
+ }
+
+ case SID_MASTER_LAYOUTS:
+ {
+ SdPage* pPage = GetActualPage();
+ if (meEditMode == EditMode::MasterPage)
+ // Use the master page of the current page.
+ pPage = static_cast<SdPage*>(&pPage->TRG_GetMasterPage());
+
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ vcl::Window* pWin = GetActiveWindow();
+ ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateMasterLayoutDialog(pWin ? pWin->GetFrameWeld() : nullptr, GetDoc(), pPage));
+ pDlg->Execute();
+ Invalidate();
+ rReq.Done ();
+ break;
+ }
+ case SID_OBJECTRESIZE:
+ {
+ // The server likes to change the client size
+ OSL_ASSERT (GetViewShell()!=nullptr);
+ SfxInPlaceClient* pIPClient = GetViewShell()->GetIPClient();
+
+ if ( pIPClient && pIPClient->IsObjectInPlaceActive() )
+ {
+ const SfxRectangleItem& rRect =
+ rReq.GetArgs()->Get(SID_OBJECTRESIZE);
+ ::tools::Rectangle aRect( GetActiveWindow()->PixelToLogic( rRect.GetValue() ) );
+
+ if ( mpDrawView->AreObjectsMarked() )
+ {
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+
+ SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( pObj );
+ if(pOle2Obj)
+ {
+ if( pOle2Obj->GetObjRef().is() )
+ {
+ pOle2Obj->SetLogicRect(aRect);
+ }
+ }
+ }
+ }
+ }
+ rReq.Ignore ();
+ break;
+ }
+
+ case SID_RELOAD:
+ {
+ sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId();
+ SfxViewFrame* pFrame = GetViewFrame();
+
+ try
+ {
+ Reference< XFrame > xFrame( pFrame->GetFrame().GetFrameInterface(), UNO_SET_THROW );
+
+ // Save the current configuration of panes and views.
+ Reference<XControllerManager> xControllerManager (
+ GetViewShellBase().GetController(), UNO_QUERY_THROW);
+ Reference<XConfigurationController> xConfigurationController (
+ xControllerManager->getConfigurationController(), UNO_SET_THROW );
+ Reference<XConfiguration> xConfiguration (
+ xConfigurationController->getRequestedConfiguration(), UNO_SET_THROW );
+
+ SfxChildWindow* pWindow = pFrame->GetChildWindow(nId);
+ if(pWindow)
+ {
+ Svx3DWin* p3DWin = static_cast<Svx3DWin*>(pWindow->GetWindow());
+ if(p3DWin)
+ p3DWin->DocumentReload();
+ }
+
+ // normal forwarding to ViewFrame for execution
+ GetViewFrame()->ExecuteSlot(rReq);
+
+ // From here on we must cope with this object and the frame already being
+ // deleted. Do not call any methods or use data members.
+ Reference<XController> xController( xFrame->getController(), UNO_SET_THROW );
+
+ // Restore the configuration.
+ xControllerManager.set( xController, UNO_QUERY_THROW );
+ xConfigurationController.set( xControllerManager->getConfigurationController() );
+ if ( ! xConfigurationController.is())
+ throw RuntimeException();
+ xConfigurationController->restoreConfiguration(xConfiguration);
+ }
+ catch (RuntimeException&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sd.view");
+ }
+
+ // We have to return immediately to avoid accessing this object.
+ return;
+ }
+
+ case SID_JUMPTOMARK:
+ {
+ if( rReq.GetArgs() )
+ {
+ const SfxStringItem* pBookmark = rReq.GetArg<SfxStringItem>(SID_JUMPTOMARK);
+
+ if (pBookmark)
+ {
+ OUString sBookmark(INetURLObject::decode(pBookmark->GetValue(), INetURLObject::DecodeMechanism::WithCharset));
+
+ rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetViewShellBase() ) );
+ if(xSlideshow.is() && xSlideshow->isRunning())
+ {
+ xSlideshow->jumpToBookmark(sBookmark);
+ }
+ else
+ {
+ GotoBookmark(sBookmark);
+ }
+ }
+ }
+ rReq.Done();
+ break;
+ }
+
+ case SID_OUTPUT_QUALITY_COLOR:
+ case SID_OUTPUT_QUALITY_GRAYSCALE:
+ case SID_OUTPUT_QUALITY_BLACKWHITE:
+ case SID_OUTPUT_QUALITY_CONTRAST:
+ {
+ ExecReq( rReq );
+ break;
+ }
+
+ case SID_MAIL_SCROLLBODY_PAGEDOWN:
+ {
+ ExecReq( rReq );
+ break;
+ }
+
+ case SID_ATTR_YEAR2000:
+ {
+ FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell();
+ if (pFormShell != nullptr)
+ {
+ const SfxPoolItem* pItem;
+ if (rReq.GetArgs()->GetItemState(
+ SID_ATTR_YEAR2000, true, &pItem) == SfxItemState::SET)
+ pFormShell->SetY2KState (
+ static_cast<const SfxUInt16Item*>(pItem)->GetValue());
+ }
+
+ rReq.Done();
+ }
+ break;
+
+ case SID_OPT_LOCALE_CHANGED:
+ {
+ GetActiveWindow()->Invalidate();
+ UpdatePreview( mpActualPage );
+ rReq.Done();
+ }
+ break;
+
+ case SID_REGENERATE_DIAGRAM:
+ case SID_EDIT_DIAGRAM:
+ {
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+
+ if (1 == rMarkList.GetMarkCount())
+ {
+ SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+
+ // Support advanced DiagramHelper
+ if(nullptr != pObj && pObj->isDiagram())
+ {
+ if(SID_REGENERATE_DIAGRAM == nSlot)
+ {
+ mpDrawView->UnmarkAll();
+ pObj->getDiagramHelper()->reLayout(*static_cast<SdrObjGroup*>(pObj));
+ mpDrawView->MarkObj(pObj, mpDrawView->GetSdrPageView());
+ }
+ else // SID_EDIT_DIAGRAM
+ {
+ VclAbstractDialogFactory* pFact = VclAbstractDialogFactory::Create();
+ ScopedVclPtr<VclAbstractDialog> pDlg = pFact->CreateDiagramDialog(
+ GetFrameWeld(),
+ *static_cast<SdrObjGroup*>(pObj));
+ pDlg->Execute();
+ }
+ }
+ }
+
+ rReq.Done();
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void DrawViewShell::ExecRuler(SfxRequest& rReq)
+{
+ // nothing is executed during a slide show!
+ if(HasCurrentFunction(SID_PRESENTATION))
+ return;
+
+ CheckLineTo (rReq);
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ const Point aPagePos( GetActiveWindow()->GetViewOrigin() );
+ Size aPageSize = mpActualPage->GetSize();
+ Size aViewSize = GetActiveWindow()->GetViewSize();
+
+ switch ( rReq.GetSlot() )
+ {
+ case SID_ATTR_LONG_LRSPACE:
+ if (pArgs)
+ {
+ std::unique_ptr<SdUndoGroup> pUndoGroup(new SdUndoGroup(GetDoc()));
+ pUndoGroup->SetComment(SdResId(STR_UNDO_CHANGE_PAGEBORDER));
+
+ const SvxLongLRSpaceItem& rLRSpace =
+ pArgs->Get(SID_ATTR_LONG_LRSPACE);
+
+ if( mpDrawView->IsTextEdit() )
+ {
+ ::tools::Rectangle aRect = maMarkRect;
+ aRect.SetPos(aRect.TopLeft() + aPagePos);
+ aRect.SetLeft( rLRSpace.GetLeft() );
+ aRect.SetRight( aViewSize.Width() - rLRSpace.GetRight() );
+ aRect.SetPos(aRect.TopLeft() - aPagePos);
+ if ( aRect != maMarkRect)
+ {
+ mpDrawView->SetAllMarkedRect(aRect);
+ maMarkRect = mpDrawView->GetAllMarkedRect();
+ Invalidate( SID_RULER_OBJECT );
+ }
+ }
+ else
+ {
+ ::tools::Long nLeft = std::max(::tools::Long(0), rLRSpace.GetLeft() - aPagePos.X());
+ ::tools::Long nRight = std::max(::tools::Long(0), rLRSpace.GetRight() + aPagePos.X() +
+ aPageSize.Width() - aViewSize.Width());
+
+ sal_uInt16 nPageCnt = GetDoc()->GetSdPageCount(mePageKind);
+ sal_uInt16 i;
+ for ( i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind);
+ SdUndoAction* pUndo = new SdPageLRUndoAction(GetDoc(),
+ pPage,
+ pPage->GetLeftBorder(),
+ pPage->GetRightBorder(),
+ nLeft, nRight);
+ pUndoGroup->AddAction(pUndo);
+ pPage->SetLeftBorder(nLeft);
+ pPage->SetRightBorder(nRight);
+ }
+ nPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind);
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = GetDoc()->GetMasterSdPage(i, mePageKind);
+ SdUndoAction* pUndo = new SdPageLRUndoAction(GetDoc(),
+ pPage,
+ pPage->GetLeftBorder(),
+ pPage->GetRightBorder(),
+ nLeft, nRight);
+ pUndoGroup->AddAction(pUndo);
+ pPage->SetLeftBorder(nLeft);
+ pPage->SetRightBorder(nRight);
+ }
+ InvalidateWindows();
+ }
+
+ // give the undo group to the undo manager
+ GetViewFrame()->GetObjectShell()->GetUndoManager()->
+ AddUndoAction(std::move(pUndoGroup));
+ }
+ break;
+ case SID_ATTR_LONG_ULSPACE:
+ if (pArgs)
+ {
+ std::unique_ptr<SdUndoGroup> pUndoGroup(new SdUndoGroup(GetDoc()));
+ pUndoGroup->SetComment(SdResId(STR_UNDO_CHANGE_PAGEBORDER));
+
+ const SvxLongULSpaceItem& rULSpace =
+ pArgs->Get(SID_ATTR_LONG_ULSPACE);
+
+ if( mpDrawView->IsTextEdit() )
+ {
+ ::tools::Rectangle aRect = maMarkRect;
+ aRect.SetPos(aRect.TopLeft() + aPagePos);
+ aRect.SetTop( rULSpace.GetUpper() );
+ aRect.SetBottom( aViewSize.Height() - rULSpace.GetLower() );
+ aRect.SetPos(aRect.TopLeft() - aPagePos);
+
+ if ( aRect != maMarkRect)
+ {
+ mpDrawView->SetAllMarkedRect(aRect);
+ maMarkRect = mpDrawView->GetAllMarkedRect();
+ Invalidate( SID_RULER_OBJECT );
+ }
+ }
+ else
+ {
+ ::tools::Long nUpper = std::max(::tools::Long(0), rULSpace.GetUpper() - aPagePos.Y());
+ ::tools::Long nLower = std::max(::tools::Long(0), rULSpace.GetLower() + aPagePos.Y() +
+ aPageSize.Height() - aViewSize.Height());
+
+ sal_uInt16 nPageCnt = GetDoc()->GetSdPageCount(mePageKind);
+ sal_uInt16 i;
+ for ( i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind);
+ SdUndoAction* pUndo = new SdPageULUndoAction(GetDoc(),
+ pPage,
+ pPage->GetUpperBorder(),
+ pPage->GetLowerBorder(),
+ nUpper, nLower);
+ pUndoGroup->AddAction(pUndo);
+ pPage->SetUpperBorder(nUpper);
+ pPage->SetLowerBorder(nLower);
+ }
+ nPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind);
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ SdPage* pPage = GetDoc()->GetMasterSdPage(i, mePageKind);
+ SdUndoAction* pUndo = new SdPageULUndoAction(GetDoc(),
+ pPage,
+ pPage->GetUpperBorder(),
+ pPage->GetLowerBorder(),
+ nUpper, nLower);
+ pUndoGroup->AddAction(pUndo);
+ pPage->SetUpperBorder(nUpper);
+ pPage->SetLowerBorder(nLower);
+ }
+ InvalidateWindows();
+ }
+
+ // give the undo group to the undo manager
+ GetViewFrame()->GetObjectShell()->GetUndoManager()->
+ AddUndoAction(std::move(pUndoGroup));
+ }
+ break;
+ case SID_RULER_OBJECT:
+ if (pArgs)
+ {
+ ::tools::Rectangle aRect = maMarkRect;
+ aRect.SetPos(aRect.TopLeft() + aPagePos);
+
+ const SvxObjectItem& rOI = pArgs->Get(SID_RULER_OBJECT);
+
+ if ( rOI.GetStartX() != rOI.GetEndX() )
+ {
+ aRect.SetLeft( rOI.GetStartX() );
+ aRect.SetRight( rOI.GetEndX() );
+ }
+ if ( rOI.GetStartY() != rOI.GetEndY() )
+ {
+ aRect.SetTop( rOI.GetStartY() );
+ aRect.SetBottom( rOI.GetEndY() );
+ }
+ aRect.SetPos(aRect.TopLeft() - aPagePos);
+ if ( aRect != maMarkRect)
+ {
+ mpDrawView->SetAllMarkedRect(aRect);
+ maMarkRect = mpDrawView->GetAllMarkedRect();
+ Invalidate( SID_RULER_OBJECT );
+ }
+ }
+ break;
+ case SID_ATTR_TABSTOP:
+ if (pArgs && mpDrawView->IsTextEdit())
+ {
+ const SvxTabStopItem& rItem = pArgs->Get( EE_PARA_TABS );
+
+ SfxItemSetFixed<EE_PARA_TABS, EE_PARA_TABS> aEditAttr( GetPool() );
+
+ aEditAttr.Put( rItem );
+ mpDrawView->SetAttributes( aEditAttr );
+
+ Invalidate(SID_ATTR_TABSTOP);
+ }
+ break;
+ case SID_ATTR_PARA_LINESPACE:
+ if (pArgs)
+ {
+ SvxLineSpacingItem aParaLineSP = pArgs->Get(
+ GetPool().GetWhich(SID_ATTR_PARA_LINESPACE));
+
+ SfxItemSetFixed<EE_PARA_SBL, EE_PARA_SBL> aEditAttr( GetPool() );
+ aParaLineSP.SetWhich( EE_PARA_SBL );
+
+ aEditAttr.Put( aParaLineSP );
+ mpDrawView->SetAttributes( aEditAttr );
+
+ Invalidate(SID_ATTR_PARA_LINESPACE);
+ }
+ break;
+ case SID_ATTR_PARA_ADJUST_LEFT:
+ {
+ SvxAdjustItem aItem( SvxAdjust::Left, EE_PARA_JUST );
+ SfxItemSetFixed<EE_PARA_JUST, EE_PARA_JUST> aEditAttr( GetPool() );
+
+ aEditAttr.Put( aItem );
+ mpDrawView->SetAttributes( aEditAttr );
+
+ Invalidate(SID_ATTR_PARA_ADJUST_LEFT);
+ break;
+ }
+ case SID_ATTR_PARA_ADJUST_CENTER:
+ {
+ SvxAdjustItem aItem( SvxAdjust::Center, EE_PARA_JUST );
+ SfxItemSetFixed<EE_PARA_JUST, EE_PARA_JUST> aEditAttr( GetPool() );
+
+ aEditAttr.Put( aItem );
+ mpDrawView->SetAttributes( aEditAttr );
+
+ Invalidate(SID_ATTR_PARA_ADJUST_CENTER);
+ break;
+ }
+ case SID_ATTR_PARA_ADJUST_RIGHT:
+ {
+ SvxAdjustItem aItem( SvxAdjust::Right, EE_PARA_JUST );
+ SfxItemSetFixed<EE_PARA_JUST, EE_PARA_JUST> aEditAttr( GetPool() );
+
+ aEditAttr.Put( aItem );
+ mpDrawView->SetAttributes( aEditAttr );
+
+ Invalidate(SID_ATTR_PARA_ADJUST_RIGHT);
+ break;
+ }
+ case SID_ATTR_PARA_ADJUST_BLOCK:
+ {
+ SvxAdjustItem aItem( SvxAdjust::Block, EE_PARA_JUST );
+ SfxItemSetFixed<EE_PARA_JUST, EE_PARA_JUST> aEditAttr( GetPool() );
+
+ aEditAttr.Put( aItem );
+ mpDrawView->SetAttributes( aEditAttr );
+
+ Invalidate(SID_ATTR_PARA_ADJUST_BLOCK);
+ break;
+ }
+ case SID_ATTR_PARA_ULSPACE:
+ if (pArgs)
+ {
+ SvxULSpaceItem aULSP = static_cast<const SvxULSpaceItem&>(pArgs->Get(
+ SID_ATTR_PARA_ULSPACE));
+ SfxItemSetFixed<EE_PARA_ULSPACE, EE_PARA_ULSPACE> aEditAttr( GetPool() );
+ aULSP.SetWhich( EE_PARA_ULSPACE );
+
+ aEditAttr.Put( aULSP );
+ mpDrawView->SetAttributes( aEditAttr );
+
+ Invalidate(SID_ATTR_PARA_ULSPACE);
+ }
+ break;
+ case SID_ATTR_PARA_LRSPACE:
+ if (pArgs)
+ {
+ SvxLRSpaceItem aLRSpace = static_cast<const SvxLRSpaceItem&>(pArgs->Get(
+ SID_ATTR_PARA_LRSPACE));
+
+ SfxItemSetFixed<EE_PARA_LRSPACE, EE_PARA_LRSPACE> aEditAttr( GetPool() );
+ aLRSpace.SetWhich( EE_PARA_LRSPACE );
+
+ aEditAttr.Put( aLRSpace );
+ mpDrawView->SetAttributes( aEditAttr );
+
+ Invalidate(SID_ATTR_PARA_LRSPACE);
+ }
+ break;
+ case SID_ATTR_LRSPACE:
+ if (pArgs && mpDrawView->IsTextEdit())
+ {
+ sal_uInt16 nId = SID_ATTR_PARA_LRSPACE;
+ const SvxLRSpaceItem& rItem = static_cast<const SvxLRSpaceItem&>(
+ pArgs->Get( nId ));
+
+ SfxItemSetFixed<
+ EE_PARA_NUMBULLET, EE_PARA_NUMBULLET,
+ EE_PARA_OUTLLEVEL, EE_PARA_OUTLLEVEL,
+ EE_PARA_LRSPACE, EE_PARA_LRSPACE> aEditAttr( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aEditAttr );
+
+ nId = EE_PARA_LRSPACE;
+ SvxLRSpaceItem aLRSpaceItem( rItem.GetLeft(),
+ rItem.GetRight(), rItem.GetTextLeft(),
+ rItem.GetTextFirstLineOffset(), nId );
+
+ const sal_Int16 nOutlineLevel = aEditAttr.Get( EE_PARA_OUTLLEVEL ).GetValue();
+ const SvxLRSpaceItem& rOrigLRSpaceItem = aEditAttr.Get( EE_PARA_LRSPACE );
+ const SvxNumBulletItem& rNumBulletItem = aEditAttr.Get( EE_PARA_NUMBULLET );
+ if( nOutlineLevel != -1 &&
+ rNumBulletItem.GetNumRule().GetLevelCount() > nOutlineLevel )
+ {
+ const SvxNumberFormat& rFormat = rNumBulletItem.GetNumRule().GetLevel(nOutlineLevel);
+ SvxNumberFormat aFormat(rFormat);
+
+ // left margin gets distributed onto LRSpace item
+ // and number format AbsLSpace - this fixes
+ // n#707779 (previously, LRSpace left indent could
+ // become negative - EditEngine really does not
+ // like that.
+ const auto nAbsLSpace=aFormat.GetAbsLSpace();
+ const ::tools::Long nTxtLeft=rItem.GetTextLeft();
+ const ::tools::Long nLeftIndent=std::max(::tools::Long(0),nTxtLeft - nAbsLSpace);
+ aLRSpaceItem.SetTextLeft(nLeftIndent);
+ // control for clipped left indent - remainder
+ // reduces number format first line indent
+ aFormat.SetAbsLSpace(nTxtLeft - nLeftIndent);
+
+ // negative first line indent goes to the number
+ // format, positive to the lrSpace item
+ if( rItem.GetTextFirstLineOffset() < 0 )
+ {
+ aFormat.SetFirstLineOffset(
+ rItem.GetTextFirstLineOffset()
+ - rOrigLRSpaceItem.GetTextFirstLineOffset()
+ + aFormat.GetCharTextDistance());
+ aLRSpaceItem.SetTextFirstLineOffset(0);
+ }
+ else
+ {
+ aFormat.SetFirstLineOffset(0);
+ aLRSpaceItem.SetTextFirstLineOffset(
+ rItem.GetTextFirstLineOffset()
+ - aFormat.GetFirstLineOffset() //TODO: overflow
+ + aFormat.GetCharTextDistance());
+ }
+
+ if( rFormat != aFormat )
+ {
+ // put all items
+ const_cast<SvxNumRule&>(rNumBulletItem.GetNumRule()).SetLevel(nOutlineLevel,aFormat);
+ aEditAttr.Put( rNumBulletItem );
+ aEditAttr.Put( aLRSpaceItem );
+ mpDrawView->SetAttributes( aEditAttr );
+
+ Invalidate(SID_ATTR_PARA_LRSPACE);
+ break;
+ }
+ }
+
+ // only put lrSpace item
+ SfxItemSetFixed<EE_PARA_LRSPACE, EE_PARA_LRSPACE> aEditAttrReduced( GetDoc()->GetPool() );
+ aEditAttrReduced.Put( aLRSpaceItem );
+ mpDrawView->SetAttributes( aEditAttrReduced );
+
+ Invalidate(SID_ATTR_PARA_LRSPACE);
+ }
+ break;
+ }
+}
+
+void DrawViewShell::GetRulerState(SfxItemSet& rSet)
+{
+ Point aOrigin;
+
+ if (mpDrawView->GetSdrPageView())
+ {
+ aOrigin = mpDrawView->GetSdrPageView()->GetPageOrigin();
+ }
+
+ Size aViewSize = GetActiveWindow()->GetViewSize();
+
+ const Point aPagePos( GetActiveWindow()->GetViewOrigin() );
+ Size aPageSize = mpActualPage->GetSize();
+
+ ::tools::Rectangle aRect(aPagePos, Point( aViewSize.Width() - (aPagePos.X() + aPageSize.Width()),
+ aViewSize.Height() - (aPagePos.Y() + aPageSize.Height())));
+
+ if( mpDrawView->IsTextEdit() )
+ {
+ Point aPnt1 = GetActiveWindow()->GetWinViewPos();
+ ::tools::Rectangle aMinMaxRect( aPnt1, Size(-1, -1) );
+ rSet.Put( SfxRectangleItem(SID_RULER_LR_MIN_MAX, aMinMaxRect) );
+ }
+ else
+ {
+ rSet.Put( SfxRectangleItem(SID_RULER_LR_MIN_MAX, aRect) );
+ }
+
+ SvxLongLRSpaceItem aLRSpace(aPagePos.X() + mpActualPage->GetLeftBorder(),
+ aRect.Right() + mpActualPage->GetRightBorder(),
+ SID_ATTR_LONG_LRSPACE);
+ SvxLongULSpaceItem aULSpace(aPagePos.Y() + mpActualPage->GetUpperBorder(),
+ aRect.Bottom() + mpActualPage->GetLowerBorder(),
+ SID_ATTR_LONG_ULSPACE);
+ rSet.Put(SvxPagePosSizeItem(Point(0,0) - aPagePos, aViewSize.Width(),
+ aViewSize.Height()));
+ SfxPointItem aPointItem( SID_RULER_NULL_OFFSET, aPagePos + aOrigin );
+
+ SvxProtectItem aProtect( SID_RULER_PROTECT );
+
+ maMarkRect = mpDrawView->GetAllMarkedRect();
+
+ const bool bRTL = GetDoc() && GetDoc()->GetDefaultWritingMode() == css::text::WritingMode_RL_TB;
+ rSet.Put(SfxBoolItem(SID_RULER_TEXT_RIGHT_TO_LEFT, bRTL));
+
+ if( mpDrawView->AreObjectsMarked() )
+ {
+ if( mpDrawView->IsTextEdit() )
+ {
+ SdrObject* pObj = mpDrawView->GetMarkedObjectList().GetMark( 0 )->GetMarkedSdrObj();
+ if( pObj->GetObjInventor() == SdrInventor::Default)
+ {
+ SfxItemSet aEditAttr( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aEditAttr );
+ if( aEditAttr.GetItemState( EE_PARA_TABS ) >= SfxItemState::DEFAULT )
+ {
+ const SvxTabStopItem& rItem = aEditAttr.Get( EE_PARA_TABS );
+ rSet.Put( rItem );
+
+ const SvxLRSpaceItem& rLRSpaceItem = aEditAttr.Get( EE_PARA_LRSPACE );
+ SvxLRSpaceItem aLRSpaceItem( rLRSpaceItem.GetLeft(),
+ rLRSpaceItem.GetRight(), rLRSpaceItem.GetTextLeft(),
+ rLRSpaceItem.GetTextFirstLineOffset(), SID_ATTR_PARA_LRSPACE );
+
+ const sal_Int16 nOutlineLevel = aEditAttr.Get( EE_PARA_OUTLLEVEL ).GetValue();
+ const SvxNumBulletItem& rNumBulletItem = aEditAttr.Get( EE_PARA_NUMBULLET );
+ if( nOutlineLevel != -1 &&
+ rNumBulletItem.GetNumRule().GetLevelCount() > nOutlineLevel )
+ {
+ const SvxNumberFormat& rFormat = rNumBulletItem.GetNumRule().GetLevel(nOutlineLevel);
+ aLRSpaceItem.SetTextLeft(rFormat.GetAbsLSpace() + rLRSpaceItem.GetTextLeft());
+ aLRSpaceItem.SetTextFirstLineOffset(
+ rLRSpaceItem.GetTextFirstLineOffset() + rFormat.GetFirstLineOffset()
+ //TODO: overflow
+ - rFormat.GetCharTextDistance());
+ }
+
+ rSet.Put( aLRSpaceItem );
+
+ Point aPos( aPagePos + maMarkRect.TopLeft() );
+
+ if ( aEditAttr.GetItemState( SDRATTR_TEXT_LEFTDIST ) == SfxItemState::SET )
+ {
+ const SdrMetricItem& rTLDItem = aEditAttr.Get( SDRATTR_TEXT_LEFTDIST );
+ ::tools::Long nLD = rTLDItem.GetValue();
+ aPos.AdjustX(nLD );
+ }
+
+ aPointItem.SetValue( aPos );
+
+ ::tools::Rectangle aParaRect(maMarkRect);
+ if (pObj->GetObjIdentifier() == SdrObjKind::Table)
+ {
+ sdr::table::SdrTableObj* pTable = static_cast<sdr::table::SdrTableObj*>(pObj);
+ sdr::table::CellPos cellpos;
+ pTable->getActiveCellPos(cellpos);
+ pTable->getCellBounds(cellpos, aParaRect);
+ }
+
+ aLRSpace.SetLeft(aPagePos.X() + aParaRect.Left());
+
+ if ( aEditAttr.GetItemState( SDRATTR_TEXT_LEFTDIST ) == SfxItemState::SET )
+ {
+ const SdrMetricItem& rTLDItem = aEditAttr.Get( SDRATTR_TEXT_LEFTDIST );
+ ::tools::Long nLD = rTLDItem.GetValue();
+ aLRSpace.SetLeft( aLRSpace.GetLeft() + nLD );
+ }
+
+ aLRSpace.SetRight(aRect.Right() + aPageSize.Width() - aParaRect.Right());
+
+ if ( aEditAttr.GetItemState( SDRATTR_TEXT_RIGHTDIST ) == SfxItemState::SET )
+ {
+ const SdrMetricItem& rTRDItem = aEditAttr.Get( SDRATTR_TEXT_RIGHTDIST );
+ ::tools::Long nRD = rTRDItem.GetValue();
+ aLRSpace.SetRight( aLRSpace.GetRight() + nRD );
+ }
+
+ aULSpace.SetUpper( aPagePos.Y() + maMarkRect.Top() );
+ aULSpace.SetLower( aRect.Bottom() + aPageSize.Height() - maMarkRect.Bottom() );
+
+ rSet.DisableItem( SID_RULER_OBJECT );
+
+ // lock page margins
+ aProtect.SetSizeProtect( true );
+ aProtect.SetPosProtect( true );
+ }
+
+ if( aEditAttr.GetItemState( EE_PARA_WRITINGDIR ) >= SfxItemState::DEFAULT )
+ {
+ const SvxFrameDirectionItem& rItem = aEditAttr.Get( EE_PARA_WRITINGDIR );
+ rSet.Put(SfxBoolItem(SID_RULER_TEXT_RIGHT_TO_LEFT, rItem.GetValue() == SvxFrameDirection::Horizontal_RL_TB));
+ }
+ }
+ }
+ else
+ {
+ rSet.DisableItem( EE_PARA_TABS );
+ rSet.DisableItem( SID_RULER_TEXT_RIGHT_TO_LEFT );
+
+ if( mpDrawView->IsResizeAllowed(true) )
+ {
+ ::tools::Rectangle aResizeRect( maMarkRect );
+
+ aResizeRect.SetPos(aResizeRect.TopLeft() + aPagePos);
+ SvxObjectItem aObjItem(aResizeRect.Left(), aResizeRect.Right(),
+ aResizeRect.Top(), aResizeRect.Bottom());
+ rSet.Put(aObjItem);
+ rSet.DisableItem( EE_PARA_TABS );
+ }
+ else
+ {
+ rSet.DisableItem( SID_RULER_OBJECT );
+ }
+ }
+ }
+ else
+ {
+ rSet.DisableItem( SID_RULER_OBJECT );
+ rSet.DisableItem( EE_PARA_TABS );
+ }
+
+ rSet.Put( aLRSpace );
+ rSet.Put( aULSpace );
+
+ rSet.Put( aPointItem );
+ rSet.Put( aProtect );
+}
+
+void DrawViewShell::ExecStatusBar(SfxRequest& rReq)
+{
+ // nothing is executed during a slide show!
+ if(HasCurrentFunction(SID_PRESENTATION))
+ return;
+
+ CheckLineTo (rReq);
+
+ switch ( rReq.GetSlot() )
+ {
+ case SID_ATTR_SIZE:
+ {
+ GetViewFrame()->GetDispatcher()->Execute( SID_ATTR_TRANSFORM, SfxCallMode::ASYNCHRON );
+ }
+ break;
+
+ case SID_STATUS_LAYOUT:
+ {
+ GetViewFrame()->GetDispatcher()->Execute( SID_PRESENTATION_LAYOUT, SfxCallMode::ASYNCHRON );
+ }
+ break;
+ }
+}
+
+/**
+ * set state of snap object entries in popup
+ */
+void DrawViewShell::GetSnapItemState( SfxItemSet &rSet )
+{
+ SdrPageView* pPV;
+ Point aMPos = GetActiveWindow()->PixelToLogic(maMousePos);
+ sal_uInt16 nHitLog = static_cast<sal_uInt16>(GetActiveWindow()->PixelToLogic(
+ Size(FuPoor::HITPIX,0)).Width());
+ sal_uInt16 nHelpLine;
+
+ if ( !mpDrawView->PickHelpLine(aMPos, nHitLog, *GetActiveWindow()->GetOutDev(), nHelpLine, pPV) )
+ return;
+
+ const SdrHelpLine& rHelpLine = (pPV->GetHelpLines())[nHelpLine];
+
+ if ( rHelpLine.GetKind() == SdrHelpLineKind::Point )
+ {
+ rSet.Put( SfxStringItem( SID_SET_SNAPITEM,
+ SdResId( STR_POPUP_EDIT_SNAPPOINT)) );
+ rSet.Put( SfxStringItem( SID_DELETE_SNAPITEM,
+ SdResId( STR_POPUP_DELETE_SNAPPOINT)) );
+ }
+ else
+ {
+ rSet.Put( SfxStringItem( SID_SET_SNAPITEM,
+ SdResId( STR_POPUP_EDIT_SNAPLINE)) );
+ rSet.Put( SfxStringItem( SID_DELETE_SNAPITEM,
+ SdResId( STR_POPUP_DELETE_SNAPLINE)) );
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviews4.cxx b/sd/source/ui/view/drviews4.cxx
new file mode 100644
index 000000000..df251880d
--- /dev/null
+++ b/sd/source/ui/view/drviews4.cxx
@@ -0,0 +1,982 @@
+/* -*- 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 <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+
+#include <DrawViewShell.hxx>
+#include <svl/intitem.hxx>
+#include <svl/stritem.hxx>
+#include <svl/urlbmk.hxx>
+#include <svx/svdpagv.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/flditem.hxx>
+#include <svx/svxids.hrc>
+#include <svx/ruler.hxx>
+#include <svx/svdobjkind.hxx>
+#include <editeng/outliner.hxx>
+#include <sfx2/ipclient.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svx/svdopath.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <editeng/editview.hxx>
+#include <tools/diagnose_ex.h>
+#include <vcl/cursor.hxx>
+#include <vcl/commandevent.hxx>
+#include <vcl/dialoghelper.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weldutils.hxx>
+
+#include <app.hrc>
+#include <strings.hrc>
+
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <Window.hxx>
+#include <fupoor.hxx>
+#include <sdmod.hxx>
+#include <Ruler.hxx>
+#include <sdresid.hxx>
+#include <sdpage.hxx>
+#include <slideshow.hxx>
+#include <sdpopup.hxx>
+#include <drawview.hxx>
+#include <svx/bmpmask.hxx>
+#include <LayerTabBar.hxx>
+#include <ViewShellBase.hxx>
+
+#include <SlideSorterViewShell.hxx>
+#include <svx/svditer.hxx>
+
+#include <navigatr.hxx>
+#include <memory>
+
+namespace {
+ void EndTextEditOnPage(sal_uInt16 nPageId)
+ {
+ SfxViewShell* pShell = SfxViewShell::GetFirst();
+ while (pShell)
+ {
+ ::sd::ViewShellBase* pBase = dynamic_cast<::sd::ViewShellBase*>(pShell);
+ if (pBase)
+ {
+ ::sd::ViewShell* pViewSh = pBase->GetMainViewShell().get();
+ ::sd::DrawViewShell* pDrawSh = dynamic_cast<::sd::DrawViewShell*>(pViewSh);
+ if (pDrawSh && pDrawSh->GetDrawView() && pDrawSh->getCurrentPage()->getPageId() == nPageId)
+ pDrawSh->GetDrawView()->SdrEndTextEdit();
+ }
+
+ pShell = SfxViewShell::GetNext(*pShell);
+ }
+ }
+}
+
+namespace sd {
+
+#define PIPETTE_RANGE 0
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing;
+
+void DrawViewShell::DeleteActualPage()
+{
+ mpDrawView->SdrEndTextEdit();
+
+ try
+ {
+ Reference<XDrawPagesSupplier> xDrawPagesSupplier( GetDoc()->getUnoModel(), UNO_QUERY_THROW );
+ Reference<XDrawPages> xPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+ sal_uInt16 nPageCount = GetDoc()->GetSdPageCount(mePageKind);
+ SdPage* pPage = nullptr;
+ std::vector<Reference<XDrawPage>> pagesToDelete;
+
+ GetView()->BegUndo(SdResId(STR_UNDO_DELETEPAGES));
+
+ for (sal_uInt16 i = 0; i < nPageCount; i++)
+ {
+ pPage = GetDoc()->GetSdPage(i, mePageKind);
+ sal_uInt16 nPageIndex = maTabControl->GetPagePos(pPage->getPageId());
+
+ slidesorter::SlideSorterViewShell* pVShell
+ = slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase());
+ bool bUseSlideSorter = pVShell != nullptr;
+
+ if((bUseSlideSorter && IsSelected(nPageIndex)) || (!bUseSlideSorter && pPage->IsSelected()))
+ {
+ EndTextEditOnPage(pPage->getPageId());
+ Reference< XDrawPage > xPage( xPages->getByIndex( nPageIndex ), UNO_QUERY_THROW );
+ pagesToDelete.push_back(xPage);
+ }
+ }
+ for (const auto &xPage: pagesToDelete)
+ {
+ xPages->remove(xPage);
+ }
+
+ GetView()->EndUndo();
+ }
+ catch( Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "sd", "SelectionManager::DeleteSelectedMasterPages()");
+ }
+}
+
+void DrawViewShell::DeleteActualLayer()
+{
+ if(!GetLayerTabControl()) // #i87182#
+ {
+ OSL_ENSURE(false, "No LayerTabBar (!)");
+ return;
+ }
+
+ SdrLayerAdmin& rAdmin = GetDoc()->GetLayerAdmin();
+ sal_uInt16 nId = GetLayerTabControl()->GetCurPageId();
+ const OUString& rName = GetLayerTabControl()->GetLayerName(nId);
+ if(LayerTabBar::IsRealNameOfStandardLayer(rName))
+ {
+ assert(false && "Standard layer may not be deleted.");
+ return;
+ }
+ const OUString& rDisplayName(GetLayerTabControl()->GetPageText(nId));
+ OUString aString(SdResId(STR_ASK_DELETE_LAYER));
+
+ // replace placeholder
+ aString = aString.replaceFirst("$", rDisplayName);
+
+ std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Question, VclButtonsType::YesNo,
+ aString));
+ if (xQueryBox->run() == RET_YES)
+ {
+ const SdrLayer* pLayer = rAdmin.GetLayer(rName);
+ mpDrawView->DeleteLayer( pLayer->GetName() );
+
+ /* in order to redraw TabBar and Window; should be initiated later on by
+ a hint from Joe (as by a change if the layer order). */
+ // ( View::Notify() --> ViewShell::ResetActualLayer() )
+
+ mbIsLayerModeActive = false; // so that ChangeEditMode() does something
+ ChangeEditMode(GetEditMode(), true);
+ }
+}
+
+bool DrawViewShell::KeyInput (const KeyEvent& rKEvt, ::sd::Window* pWin)
+{
+ bool bRet = false;
+
+ if (!IsInputLocked() || (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE))
+ {
+ if(KEY_RETURN == rKEvt.GetKeyCode().GetCode()
+ && rKEvt.GetKeyCode().IsMod1()
+ && GetView()->IsTextEdit())
+ {
+ // this should be used for cursor travelling.
+ SdPage* pActualPage = GetActualPage();
+ const SdrMarkList& rMarkList = GetView()->GetMarkedObjectList();
+ SdrTextObj* pCandidate = nullptr;
+
+ if(pActualPage && 1 == rMarkList.GetMarkCount())
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+
+ // remember which object was the text in edit mode
+ SdrObject* pOldObj = pMark->GetMarkedSdrObj();
+
+ // end text edit now
+ GetView()->SdrEndTextEdit();
+
+ // look for a new candidate, a successor of pOldObj
+ SdrObjListIter aIter(pActualPage, SdrIterMode::DeepNoGroups);
+ bool bDidVisitOldObject(false);
+
+ while(aIter.IsMore() && !pCandidate)
+ {
+ SdrObject* pObj = aIter.Next();
+
+ if(auto pSdrTextObj = dynamic_cast<SdrTextObj *>( pObj ))
+ {
+ SdrInventor nInv(pObj->GetObjInventor());
+ SdrObjKind nKnd(pObj->GetObjIdentifier());
+
+ if(SdrInventor::Default == nInv &&
+ (SdrObjKind::TitleText == nKnd || SdrObjKind::OutlineText == nKnd || SdrObjKind::Text == nKnd)
+ && bDidVisitOldObject)
+ {
+ pCandidate = pSdrTextObj;
+ }
+
+ if(pObj == pOldObj)
+ {
+ bDidVisitOldObject = true;
+ }
+ }
+ }
+ }
+
+ if(pCandidate)
+ {
+ // set the new candidate to text edit mode
+ GetView()->UnMarkAll();
+ GetView()->MarkObj(pCandidate, GetView()->GetSdrPageView());
+
+ GetViewFrame()->GetDispatcher()->Execute(
+ SID_ATTR_CHAR, SfxCallMode::ASYNCHRON);
+ }
+ else
+ {
+ // insert a new page with the same page layout
+ GetViewFrame()->GetDispatcher()->Execute(
+ SID_INSERTPAGE_QUICK, SfxCallMode::ASYNCHRON);
+ }
+ }
+ else
+ {
+ bRet = ViewShell::KeyInput(rKEvt, pWin);
+ //If object is marked , the corresponding entry is set true , else
+ //the corresponding entry is set false .
+ if(KEY_TAB == rKEvt.GetKeyCode().GetCode())
+ {
+ FreshNavigatrTree();
+ }
+ }
+ if (!bRet && !mbReadOnly) // tdf#139804
+ {
+ bRet = GetView()->KeyInput(rKEvt, pWin);
+ }
+ }
+
+ return bRet;
+}
+
+/**
+ * Start with Drag from ruler (helper lines, origin)
+ */
+void DrawViewShell::StartRulerDrag (
+ const Ruler& rRuler,
+ const MouseEvent& rMEvt)
+{
+ GetActiveWindow()->CaptureMouse();
+
+ Point aWPos = GetActiveWindow()->PixelToLogic(GetActiveWindow()->GetPointerPosPixel());
+
+ if ( rRuler.GetExtraRect().Contains(rMEvt.GetPosPixel()) )
+ {
+ mpDrawView->BegSetPageOrg(aWPos);
+ mbIsRulerDrag = true;
+ }
+ else
+ {
+ // #i34536# if no guide-lines are visible yet, that show them
+ if( ! mpDrawView->IsHlplVisible())
+ mpDrawView->SetHlplVisible();
+
+ SdrHelpLineKind eKind;
+
+ if ( rMEvt.IsMod1() )
+ eKind = SdrHelpLineKind::Point;
+ else if ( rRuler.IsHorizontal() )
+ eKind = SdrHelpLineKind::Horizontal;
+ else
+ eKind = SdrHelpLineKind::Vertical;
+
+ mpDrawView->BegDragHelpLine(aWPos, eKind);
+ mbIsRulerDrag = true;
+ }
+}
+
+void DrawViewShell::FreshNavigatrTree()
+{
+ SfxChildWindow* pWindow = GetViewFrame()->GetChildWindow( SID_NAVIGATOR );
+ if( pWindow )
+ {
+ SdNavigatorFloat* pNavWin = static_cast<SdNavigatorFloat*>( pWindow->GetWindow() );
+ if( pNavWin )
+ pNavWin->FreshTree( GetDoc() );
+ }
+}
+
+void DrawViewShell::MouseButtonDown(const MouseEvent& rMEvt,
+ ::sd::Window* pWin)
+{
+ mbMouseButtonDown = true;
+ mbMouseSelecting = false;
+
+ // We have to check if a context menu is shown and we have an UI
+ // active inplace client. In that case we have to ignore the mouse
+ // button down event. Otherwise we would crash (context menu has been
+ // opened by inplace client and we would deactivate the inplace client,
+ // the context menu is closed by VCL asynchronously which in the end
+ // would work on deleted objects or the context menu has no parent anymore)
+ SfxInPlaceClient* pIPClient = GetViewShell()->GetIPClient();
+ bool bIsOleActive = ( pIPClient && pIPClient->IsObjectInPlaceActive() );
+
+ if (bIsOleActive && vcl::IsInPopupMenuExecute())
+ return;
+
+ if ( IsInputLocked() )
+ return;
+
+ ViewShell::MouseButtonDown(rMEvt, pWin);
+
+ //If object is marked , the corresponding entry is set true ,
+ //else the corresponding entry is set false .
+ FreshNavigatrTree();
+ if (mbPipette)
+ {
+ SfxChildWindow* pWnd = GetViewFrame()->GetChildWindow(SvxBmpMaskChildWindow::GetChildWindowId());
+ SvxBmpMask* pBmpMask = pWnd ? static_cast<SvxBmpMask*>(pWnd->GetWindow()) : nullptr;
+ if (pBmpMask)
+ pBmpMask->PipetteClicked();
+ }
+}
+
+void DrawViewShell::MouseMove(const MouseEvent& rMEvt, ::sd::Window* pWin)
+{
+ if ( IsMouseButtonDown() )
+ mbMouseSelecting = true;
+
+ if ( IsInputLocked() )
+ return;
+
+ if ( mpDrawView->IsAction() )
+ {
+ ::tools::Rectangle aOutputArea(Point(0,0), GetActiveWindow()->GetOutputSizePixel());
+
+ if ( !aOutputArea.Contains(rMEvt.GetPosPixel()) )
+ {
+ bool bInsideOtherWindow = false;
+
+ if (mpContentWindow)
+ {
+ aOutputArea = ::tools::Rectangle(Point(0,0),
+ mpContentWindow->GetOutputSizePixel());
+
+ Point aPos = mpContentWindow->GetPointerPosPixel();
+ if ( aOutputArea.Contains(aPos) )
+ bInsideOtherWindow = true;
+ }
+
+ if (! GetActiveWindow()->HasFocus ())
+ {
+ GetActiveWindow()->ReleaseMouse ();
+ mpDrawView->BrkAction ();
+ return;
+ }
+ else if ( bInsideOtherWindow )
+ {
+ GetActiveWindow()->ReleaseMouse();
+ pWin->CaptureMouse ();
+ }
+ }
+ else if ( pWin != GetActiveWindow() )
+ pWin->CaptureMouse();
+ }
+
+ // Since the next MouseMove may execute a IsSolidDraggingNow() in
+ // SdrCreateView::MovCreateObj and there the ApplicationBackgroundColor
+ // is needed it is necessary to set it here.
+ if (GetDoc())
+ {
+ ConfigureAppBackgroundColor();
+ mpDrawView->SetApplicationBackgroundColor( mnAppBackgroundColor );
+ }
+
+ ViewShell::MouseMove(rMEvt, pWin);
+
+ maMousePos = rMEvt.GetPosPixel();
+
+ ::tools::Rectangle aRect;
+
+ if ( mbIsRulerDrag )
+ {
+ Point aLogPos = GetActiveWindow()->PixelToLogic(maMousePos);
+ mpDrawView->MovAction(aLogPos);
+ }
+
+ if ( mpDrawView->IsAction() )
+ {
+ mpDrawView->TakeActionRect(aRect);
+ aRect = GetActiveWindow()->LogicToPixel(aRect);
+ }
+ else
+ {
+ aRect = ::tools::Rectangle(maMousePos, maMousePos);
+ }
+
+ ShowMousePosInfo(aRect, pWin);
+
+ SvxBmpMask* pBmpMask = nullptr;
+ if (mbPipette && GetViewFrame()->HasChildWindow(SvxBmpMaskChildWindow::GetChildWindowId()))
+ {
+ SfxChildWindow* pWnd = GetViewFrame()->GetChildWindow(SvxBmpMaskChildWindow::GetChildWindowId());
+ pBmpMask = pWnd ? static_cast<SvxBmpMask*>(pWnd->GetWindow()) : nullptr;
+ }
+
+ if (!pBmpMask)
+ return;
+
+ const ::tools::Long nStartX = maMousePos.X() - PIPETTE_RANGE;
+ const ::tools::Long nEndX = maMousePos.X() + PIPETTE_RANGE;
+ const ::tools::Long nStartY = maMousePos.Y() - PIPETTE_RANGE;
+ const ::tools::Long nEndY = maMousePos.Y() + PIPETTE_RANGE;
+ ::tools::Long nRed = 0;
+ ::tools::Long nGreen = 0;
+ ::tools::Long nBlue = 0;
+ const double fDiv = ( ( PIPETTE_RANGE << 1 ) + 1 ) * ( ( PIPETTE_RANGE << 1 ) + 1 );
+
+ for ( ::tools::Long nY = nStartY; nY <= nEndY; nY++ )
+ {
+ for( ::tools::Long nX = nStartX; nX <= nEndX; nX++ )
+ {
+ const Color aCol( pWin->GetOutDev()->GetPixel( pWin->PixelToLogic( Point( nX, nY ) ) ) );
+
+ nRed += aCol.GetRed();
+ nGreen += aCol.GetGreen();
+ nBlue += aCol.GetBlue();
+ }
+ }
+
+ pBmpMask->SetColor( Color( static_cast<sal_uInt8>( nRed / fDiv + .5 ),
+ static_cast<sal_uInt8>( nGreen / fDiv + .5 ),
+ static_cast<sal_uInt8>( nBlue / fDiv + .5 ) ) );
+}
+
+void DrawViewShell::MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin)
+{
+ mbMouseButtonDown = false;
+
+ if ( !IsInputLocked() )
+ {
+ bool bIsSetPageOrg = mpDrawView->IsSetPageOrg();
+
+ if (mbIsRulerDrag)
+ {
+ ::tools::Rectangle aOutputArea(Point(0,0), GetActiveWindow()->GetOutputSizePixel());
+
+ if (aOutputArea.Contains(rMEvt.GetPosPixel()))
+ {
+ mpDrawView->EndAction();
+
+ if (bIsSetPageOrg)
+ GetViewFrame()->GetBindings().Invalidate(SID_RULER_NULL_OFFSET);
+ }
+ else if (rMEvt.IsLeft() && bIsSetPageOrg)
+ {
+ mpDrawView->BrkAction();
+ SdPage* pPage = static_cast<SdPage*>( mpDrawView->GetSdrPageView()->GetPage() );
+ Point aOrg(pPage->GetLeftBorder(), pPage->GetUpperBorder());
+ mpDrawView->GetSdrPageView()->SetPageOrigin(aOrg);
+ GetViewFrame()->GetBindings().Invalidate(SID_RULER_NULL_OFFSET);
+ }
+ else
+ {
+ mpDrawView->BrkAction();
+ }
+
+ GetActiveWindow()->ReleaseMouse();
+ mbIsRulerDrag = false;
+ }
+ else
+ ViewShell::MouseButtonUp(rMEvt, pWin);
+ //If object is marked , the corresponding entry is set true ,
+ //else the corresponding entry is set false .
+ FreshNavigatrTree();
+ }
+ mbMouseSelecting = false;
+}
+
+void DrawViewShell::Command(const CommandEvent& rCEvt, ::sd::Window* pWin)
+{
+ // The command event is send to the window after a possible context
+ // menu from an inplace client is closed. Now we have the chance to
+ // deactivate the inplace client without any problem regarding parent
+ // windows and code on the stack.
+ SfxInPlaceClient* pIPClient = GetViewShell()->GetIPClient();
+ bool bIsOleActive = ( pIPClient && pIPClient->IsObjectInPlaceActive() );
+ if ( bIsOleActive && ( rCEvt.GetCommand() == CommandEventId::ContextMenu ))
+ {
+ // Deactivate OLE object
+ mpDrawView->UnmarkAll();
+ SelectionHasChanged();
+ return;
+ }
+
+ if ( IsInputLocked() )
+ return;
+
+ if( GetView() &&GetView()->getSmartTags().Command(rCEvt) )
+ return;
+
+ const bool bNativeShow (SlideShow::IsRunning(GetViewShellBase()));
+
+ if( rCEvt.GetCommand() == CommandEventId::PasteSelection && !bNativeShow )
+ {
+ TransferableDataHelper aDataHelper(TransferableDataHelper::CreateFromPrimarySelection());
+
+ if( aDataHelper.GetTransferable().is() )
+ {
+ Point aPos;
+ sal_Int8 nDnDAction = DND_ACTION_COPY;
+
+ if( GetActiveWindow() )
+ aPos = GetActiveWindow()->PixelToLogic( rCEvt.GetMousePosPixel() );
+
+ if( !mpDrawView->InsertData( aDataHelper, aPos, nDnDAction, false ) )
+ {
+ INetBookmark aINetBookmark( "", "" );
+
+ if( ( aDataHelper.HasFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK ) &&
+ aDataHelper.GetINetBookmark( SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark ) ) ||
+ ( aDataHelper.HasFormat( SotClipboardFormatId::FILEGRPDESCRIPTOR ) &&
+ aDataHelper.GetINetBookmark( SotClipboardFormatId::FILEGRPDESCRIPTOR, aINetBookmark ) ) ||
+ ( aDataHelper.HasFormat( SotClipboardFormatId::UNIFORMRESOURCELOCATOR ) &&
+ aDataHelper.GetINetBookmark( SotClipboardFormatId::UNIFORMRESOURCELOCATOR, aINetBookmark ) ) )
+ {
+ InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), "" );
+ }
+ }
+ }
+ }
+ else if( rCEvt.GetCommand() == CommandEventId::ContextMenu && !bNativeShow &&
+ pWin != nullptr && !mpDrawView->IsAction() && !SD_MOD()->GetWaterCan() )
+ {
+ OUString aPopupId; // Resource name for popup menu
+
+ // is there a snap object under the cursor?
+ SdrPageView* pPV;
+ Point aMPos = pWin->PixelToLogic( maMousePos );
+ sal_uInt16 nHitLog = static_cast<sal_uInt16>(GetActiveWindow()->PixelToLogic(
+ Size(FuPoor::HITPIX, 0 ) ).Width());
+ sal_uInt16 nHelpLine;
+ // for gluepoints
+ SdrObject* pObj = nullptr;
+ sal_uInt16 nPickId = 0;
+ // for field command
+ OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
+ const SvxFieldItem* pFldItem = nullptr;
+ if( pOLV )
+ pFldItem = pOLV->GetFieldAtSelection();
+
+ // helper line
+ if ( mpDrawView->PickHelpLine( aMPos, nHitLog, *GetActiveWindow()->GetOutDev(), nHelpLine, pPV) )
+ {
+ ::tools::Rectangle aRect(rCEvt.GetMousePosPixel(), Size(10, 10));
+ weld::Window* pParent = weld::GetPopupParent(*pWin, aRect);
+ ShowSnapLineContextMenu(pParent, aRect, *pPV, nHelpLine);
+ return;
+ }
+ // is gluepoint under cursor marked?
+ else if( mpDrawView->PickGluePoint( aMPos, pObj, nPickId, pPV ) &&
+ mpDrawView->IsGluePointMarked( pObj, nPickId ) )
+ {
+ aPopupId = "gluepoint";
+ }
+ // field command?
+ else if( pFldItem && (nullptr != dynamic_cast< const SvxDateField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtTimeField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtFileField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxAuthorField *>( pFldItem->GetField() ) ) )
+ {
+ LanguageType eLanguage( LANGUAGE_SYSTEM );
+
+ // Format popup with outliner language, if possible
+ if( pOLV->GetOutliner() )
+ {
+ ESelection aSelection( pOLV->GetSelection() );
+ eLanguage = pOLV->GetOutliner()->GetLanguage( aSelection.nStartPara, aSelection.nStartPos );
+ }
+
+ //fdo#44998 if the outliner has captured the mouse events release the lock
+ //so the SdFieldPopup can get them
+ pOLV->ReleaseMouse();
+ SdFieldPopup aFieldPopup(pFldItem->GetField(), eLanguage);
+
+ if ( rCEvt.IsMouseEvent() )
+ aMPos = rCEvt.GetMousePosPixel();
+ else
+ aMPos = Point( 20, 20 );
+ ::tools::Rectangle aRect(aMPos, Size(1, 1));
+ weld::Window* pParent = weld::GetPopupParent(*pWin, aRect);
+
+ aFieldPopup.Execute(pParent, aRect);
+
+ std::unique_ptr<SvxFieldData> pField(aFieldPopup.GetField());
+ if (pField)
+ {
+ SvxFieldItem aFieldItem( *pField, EE_FEATURE_FIELD );
+ // select field, so that it will be deleted on insert
+ ESelection aSel = pOLV->GetSelection();
+ bool bSel = true;
+ if( aSel.nStartPos == aSel.nEndPos )
+ {
+ bSel = false;
+ aSel.nEndPos++;
+ }
+ pOLV->SetSelection( aSel );
+
+ pOLV->InsertField( aFieldItem );
+
+ // reset selection back to original state
+ if( !bSel )
+ aSel.nEndPos--;
+ pOLV->SetSelection( aSel );
+ }
+ }
+ else
+ {
+ // is something selected?
+ if (mpDrawView->AreObjectsMarked() &&
+ mpDrawView->GetMarkedObjectList().GetMarkCount() == 1 )
+ {
+ pObj = mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
+ if( HasCurrentFunction(SID_BEZIER_EDIT) && (dynamic_cast< SdrPathObj * >( pObj ) != nullptr ) )
+ {
+ aPopupId = "bezier";
+ }
+ else
+ {
+ if( mpDrawView->GetTextEditObject() )
+ {
+ OutlinerView* pOutlinerView = mpDrawView->GetTextEditOutlinerView();
+ Point aPos(rCEvt.GetMousePosPixel());
+
+ if ( pOutlinerView )
+ {
+ if( ( rCEvt.IsMouseEvent() && pOutlinerView->IsWrongSpelledWordAtPos(aPos) ) ||
+ ( !rCEvt.IsMouseEvent() && pOutlinerView->IsCursorAtWrongSpelledWord() ) )
+ {
+ // Popup for Online-Spelling now handled by DrawDocShell
+ Link<SpellCallbackInfo&,void> aLink = LINK(GetDocSh(), DrawDocShell, OnlineSpellCallback);
+
+ if( !rCEvt.IsMouseEvent() )
+ {
+ aPos = GetActiveWindow()->LogicToPixel( pOutlinerView->GetEditView().GetCursor()->GetPos() );
+ }
+ // While showing the spell context menu
+ // we lock the input so that another
+ // context menu can not be opened during
+ // that time (crash #i43235#). In order
+ // to not lock the UI completely we
+ // first release the mouse.
+ GetActiveWindow()->ReleaseMouse();
+ LockInput();
+ pOutlinerView->ExecuteSpellPopup(aPos, aLink);
+ pOutlinerView->GetEditView().Invalidate();
+ UnlockInput();
+ }
+ else
+ {
+ if( (pObj->GetObjInventor() == SdrInventor::Default) && (pObj->GetObjIdentifier() == SdrObjKind::Table) )
+ {
+ aPopupId = "table";
+ }
+ else
+ {
+ aPopupId = "drawtext";
+ }
+ }
+ }
+ }
+ else
+ {
+ SdrInventor nInv = pObj->GetObjInventor();
+ SdrObjKind nId = pObj->GetObjIdentifier();
+
+ if (nInv == SdrInventor::Default)
+ {
+ switch ( nId )
+ {
+ case SdrObjKind::OutlineText:
+ case SdrObjKind::Caption:
+ case SdrObjKind::TitleText:
+ case SdrObjKind::Text:
+ aPopupId = "textbox";
+ break;
+
+ case SdrObjKind::PathLine:
+ case SdrObjKind::PolyLine:
+ aPopupId = "curve";
+ break;
+
+ case SdrObjKind::FreehandLine:
+ case SdrObjKind::Edge:
+ aPopupId = "connector";
+ break;
+
+ case SdrObjKind::Line:
+ aPopupId = "line";
+ break;
+
+ case SdrObjKind::Measure:
+ aPopupId = "measure";
+ break;
+
+ case SdrObjKind::Rectangle:
+ case SdrObjKind::CircleOrEllipse:
+ case SdrObjKind::FreehandFill:
+ case SdrObjKind::PathFill:
+ case SdrObjKind::Polygon:
+ case SdrObjKind::CircleSection:
+ case SdrObjKind::CircleArc:
+ case SdrObjKind::CircleCut:
+ case SdrObjKind::CustomShape:
+ aPopupId = "draw";
+ break;
+
+ case SdrObjKind::Group:
+ aPopupId = "group";
+ break;
+
+ case SdrObjKind::Graphic:
+ aPopupId = "graphic";
+ break;
+
+ case SdrObjKind::OLE2:
+ aPopupId = "oleobject";
+ break;
+ case SdrObjKind::Media:
+ aPopupId = "media";
+ break;
+ case SdrObjKind::Table:
+ aPopupId = "table";
+ break;
+ default: ;
+ }
+ }
+ else if( nInv == SdrInventor::E3d )
+ {
+ if( nId == SdrObjKind::E3D_Scene )
+ {
+ if( !mpDrawView->IsGroupEntered() )
+ aPopupId = "3dscene";
+ else
+ aPopupId = "3dscene2";
+ }
+ else
+ aPopupId = "3dobject";
+ }
+ else if( nInv == SdrInventor::FmForm )
+ {
+ aPopupId = "form";
+ }
+ }
+ }
+ }
+
+ // multiple selection
+ else if (mpDrawView->AreObjectsMarked() &&
+ mpDrawView->GetMarkedObjectList().GetMarkCount() > 1 )
+ {
+ aPopupId = "multiselect";
+ }
+
+ // nothing selected
+ else
+ {
+ aPopupId = "page";
+ }
+ }
+ // show Popup-Menu
+ if (!aPopupId.isEmpty())
+ {
+ GetActiveWindow()->ReleaseMouse();
+
+ // tdf#137445 at this context menu popup time get what the
+ // DisableEditHyperlink would be for this position
+ bool bShouldDisableEditHyperlink = ShouldDisableEditHyperlink();
+
+ if(rCEvt.IsMouseEvent())
+ GetViewFrame()->GetDispatcher()->ExecutePopup( aPopupId );
+ else
+ {
+ //don't open contextmenu at mouse position if not opened via mouse
+
+ //middle of the window if nothing is marked
+ Point aMenuPos(GetActiveWindow()->GetSizePixel().Width()/2
+ ,GetActiveWindow()->GetSizePixel().Height()/2);
+
+ //middle of the bounding rect if something is marked
+ if( mpDrawView->AreObjectsMarked() && mpDrawView->GetMarkedObjectList().GetMarkCount() >= 1 )
+ {
+ ::tools::Rectangle aMarkRect;
+ mpDrawView->GetMarkedObjectList().TakeBoundRect(nullptr,aMarkRect);
+ aMenuPos = GetActiveWindow()->LogicToPixel( aMarkRect.Center() );
+
+ //move the point into the visible window area
+ if( aMenuPos.X() < 0 )
+ aMenuPos.setX( 0 );
+ if( aMenuPos.Y() < 0 )
+ aMenuPos.setY( 0 );
+ if( aMenuPos.X() > GetActiveWindow()->GetSizePixel().Width() )
+ aMenuPos.setX( GetActiveWindow()->GetSizePixel().Width() );
+ if( aMenuPos.Y() > GetActiveWindow()->GetSizePixel().Height() )
+ aMenuPos.setY( GetActiveWindow()->GetSizePixel().Height() );
+ }
+
+ //open context menu at that point
+ GetViewFrame()->GetDispatcher()->ExecutePopup( aPopupId, GetActiveWindow(), &aMenuPos );
+ }
+
+ if (!bShouldDisableEditHyperlink)
+ {
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ // tdf#137445 set what the menu popup state for this was
+ EnableEditHyperlink();
+ // ensure moAtContextMenu_DisableEditHyperlink will be cleared
+ // in the case that EditHyperlink is not dispatched by the menu
+ rBindings.Invalidate(SID_EDIT_HYPERLINK);
+ }
+ }
+ }
+ else
+ {
+ ViewShell::Command(rCEvt, pWin);
+ }
+}
+
+void DrawViewShell::EnableEditHyperlink()
+{
+ moAtContextMenu_DisableEditHyperlink = false;
+}
+
+void DrawViewShell::ShowMousePosInfo(const ::tools::Rectangle& rRect,
+ ::sd::Window const * pWin)
+{
+ if (mbHasRulers && pWin )
+ {
+ RulerLine pHLines[2];
+ RulerLine pVLines[2];
+ ::tools::Long nHOffs = 0;
+ ::tools::Long nVOffs = 0;
+ sal_uInt16 nCnt;
+
+ if (mpHorizontalRuler)
+ mpHorizontalRuler->SetLines();
+
+ if (mpVerticalRuler)
+ mpVerticalRuler->SetLines();
+
+ if (mpHorizontalRuler)
+ {
+ nHOffs = mpHorizontalRuler->GetNullOffset() +
+ mpHorizontalRuler->GetPageOffset();
+ }
+
+ if (mpVerticalRuler)
+ {
+ nVOffs = mpVerticalRuler->GetNullOffset() +
+ mpVerticalRuler->GetPageOffset();
+ }
+
+ nCnt = 1;
+ pHLines[0].nPos = rRect.Left() - nHOffs;
+ pVLines[0].nPos = rRect.Top() - nVOffs;
+
+ if ( rRect.Right() != rRect.Left() || rRect.Bottom() != rRect.Top() )
+ {
+ pHLines[1].nPos = rRect.Right() - nHOffs;
+ pVLines[1].nPos = rRect.Bottom() - nVOffs;
+ nCnt++;
+ }
+
+ if (mpHorizontalRuler)
+ mpHorizontalRuler->SetLines(nCnt, pHLines);
+ if (mpVerticalRuler)
+ mpVerticalRuler->SetLines(nCnt, pVLines);
+ }
+
+ // display with coordinates in StatusBar
+ OSL_ASSERT (GetViewShell()!=nullptr);
+ if ( GetViewShell()->GetUIActiveClient() )
+ return;
+
+ SfxItemSetFixed<
+ SID_CONTEXT, SID_CONTEXT,
+ SID_ATTR_POSITION, SID_ATTR_SIZE> aSet(GetPool());
+
+ GetStatusBarState(aSet);
+
+ aSet.Put( SfxStringItem( SID_CONTEXT, mpDrawView->GetStatusText() ) );
+
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.SetState(aSet);
+ rBindings.Invalidate(SID_CONTEXT);
+ rBindings.Invalidate(SID_ATTR_POSITION);
+ rBindings.Invalidate(SID_ATTR_SIZE);
+}
+
+void DrawViewShell::LockInput()
+{
+ mnLockCount++;
+}
+
+void DrawViewShell::UnlockInput()
+{
+ DBG_ASSERT( mnLockCount, "Input for this shell is not locked!" );
+ if ( mnLockCount )
+ mnLockCount--;
+}
+
+void DrawViewShell::ShowSnapLineContextMenu(weld::Window* pParent, const ::tools::Rectangle& rRect,
+ SdrPageView& rPageView, const sal_uInt16 nSnapLineIndex)
+{
+ const SdrHelpLine& rHelpLine (rPageView.GetHelpLines()[nSnapLineIndex]);
+ std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(nullptr, "modules/simpress/ui/snapmenu.ui"));
+ std::unique_ptr<weld::Menu> xMenu(xBuilder->weld_menu("menu"));
+
+ if (rHelpLine.GetKind() == SdrHelpLineKind::Point)
+ {
+ xMenu->append(OUString::number(SID_SET_SNAPITEM), SdResId(STR_POPUP_EDIT_SNAPPOINT));
+ xMenu->append_separator("separator");
+ xMenu->append(OUString::number(SID_DELETE_SNAPITEM), SdResId(STR_POPUP_DELETE_SNAPPOINT));
+ }
+ else
+ {
+ xMenu->append(OUString::number(SID_SET_SNAPITEM), SdResId(STR_POPUP_EDIT_SNAPLINE));
+ xMenu->append_separator("separator");
+ xMenu->append(OUString::number(SID_DELETE_SNAPITEM), SdResId(STR_POPUP_DELETE_SNAPLINE));
+ }
+
+ const int nResult = xMenu->popup_at_rect(pParent, rRect).toInt32();
+ switch (nResult)
+ {
+ case SID_SET_SNAPITEM:
+ {
+ SfxUInt32Item aHelpLineItem (ID_VAL_INDEX, nSnapLineIndex);
+ const SfxPoolItem* aArguments[] = {&aHelpLineItem, nullptr};
+ GetViewFrame()->GetDispatcher()->Execute(
+ SID_SET_SNAPITEM,
+ SfxCallMode::SLOT,
+ aArguments);
+ }
+ break;
+
+ case SID_DELETE_SNAPITEM:
+ {
+ rPageView.DeleteHelpLine(nSnapLineIndex);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviews5.cxx b/sd/source/ui/view/drviews5.cxx
new file mode 100644
index 000000000..3eb9f39c3
--- /dev/null
+++ b/sd/source/ui/view/drviews5.cxx
@@ -0,0 +1,650 @@
+/* -*- 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 <DrawViewShell.hxx>
+#include <editeng/outliner.hxx>
+#include <svx/svxids.hrc>
+#include <sfx2/request.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdoutl.hxx>
+
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+#include <sdcommands.h>
+#include <sal/log.hxx>
+
+#include <svx/fmshell.hxx>
+#include <editeng/eeitem.hxx>
+#include <AccessibleDrawDocumentView.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <LayerTabBar.hxx>
+
+#include <app.hrc>
+#include <helpids.h>
+#include <optsitem.hxx>
+#include <sdmod.hxx>
+#include <FrameView.hxx>
+#include <Window.hxx>
+#include <drawview.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <Client.hxx>
+#include <slideshow.hxx>
+#include <unokywds.hxx>
+#include <sdpage.hxx>
+#include <SdUnoDrawView.hxx>
+#include <ViewShellBase.hxx>
+#include <FormShellManager.hxx>
+#include <DrawController.hxx>
+#include <memory>
+#include <comphelper/lok.hxx>
+
+namespace sd {
+
+void DrawViewShell::ModelHasChanged()
+{
+ Invalidate();
+ // that the navigator also gets an up to date state
+ GetViewFrame()->GetBindings().Invalidate( SID_NAVIGATOR_STATE, true );
+
+ SfxBoolItem aItem( SID_3D_STATE, true );
+ GetViewFrame()->GetDispatcher()->ExecuteList(
+ SID_3D_STATE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, { &aItem });
+
+ // now initialize the TextEditOutliner which was newly created by the draw engine
+ ::Outliner* pOutliner = mpDrawView->GetTextEditOutliner();
+ if (pOutliner)
+ {
+ SfxStyleSheetPool* pSPool = static_cast<SfxStyleSheetPool*>( GetDocSh()->GetStyleSheetPool() );
+ pOutliner->SetStyleSheetPool(pSPool);
+ }
+}
+
+void DrawViewShell::Resize()
+{
+ ViewShell::Resize();
+
+ // tdf#151621 Do not set if the embedded object is opening in a new window.
+ if (GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED
+ && GetDocSh()->IsInPlaceActive())
+ {
+ SetZoomRect(GetDocSh()->GetVisArea(ASPECT_CONTENT));
+ }
+
+ rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetViewShellBase() ) );
+ if( xSlideshow.is() && xSlideshow->isRunning() && !xSlideshow->isFullScreen() )
+ {
+ xSlideshow->resize(maViewSize);
+ }
+}
+
+void DrawViewShell::ArrangeGUIElements()
+{
+ // Retrieve the current size (thickness) of the scroll bars. That is
+ // the width of the vertical and the height of the horizontal scroll
+ // bar.
+ int nScrollBarSize = GetParentWindow()->GetSettings().GetStyleSettings().GetScrollBarSize();
+ maScrBarWH = Size (nScrollBarSize, nScrollBarSize);
+
+ ViewShell::ArrangeGUIElements ();
+
+ maTabControl->Hide();
+
+ OSL_ASSERT (GetViewShell()!=nullptr);
+ Client* pIPClient = static_cast<Client*>(GetViewShell()->GetIPClient());
+ bool bClientActive = false;
+ if ( pIPClient && pIPClient->IsObjectInPlaceActive() )
+ bClientActive = true;
+
+ bool bInPlaceActive = GetViewFrame()->GetFrame().IsInPlace();
+
+ if ( mbZoomOnPage && !bInPlaceActive && !bClientActive )
+ {
+ // with split, always resize first window
+ //af pWindow = mpContentWindow.get();
+ SfxRequest aReq(SID_SIZE_PAGE, SfxCallMode::SLOT, GetDoc()->GetItemPool());
+ ExecuteSlot( aReq );
+ }
+}
+
+/**
+ * Apply data of the FrameView on the current view
+ */
+void DrawViewShell::ReadFrameViewData(FrameView* pView)
+{
+ ModifyGuard aGuard( GetDoc() );
+
+ // this option has to be adjust at the model
+ GetDoc()->SetPickThroughTransparentTextFrames(
+ SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType())->IsPickThrough());
+
+ // initialization of the Character-(Screen-) attribute
+ if (HasRuler() != pView->HasRuler())
+ SetRuler( pView->HasRuler() );
+
+ if (mpDrawView->GetGridCoarse() != pView->GetGridCoarse())
+ mpDrawView->SetGridCoarse( pView->GetGridCoarse() );
+
+ if (mpDrawView->GetGridFine() != pView->GetGridFine())
+ mpDrawView->SetGridFine( pView->GetGridFine() );
+
+ if (mpDrawView->GetSnapGridWidthX() != pView->GetSnapGridWidthX() || mpDrawView->GetSnapGridWidthY() != pView->GetSnapGridWidthY())
+ mpDrawView->SetSnapGridWidth(pView->GetSnapGridWidthX(), pView->GetSnapGridWidthY());
+
+ if (mpDrawView->IsGridVisible() != pView->IsGridVisible())
+ mpDrawView->SetGridVisible( pView->IsGridVisible() );
+
+ if (mpDrawView->IsGridFront() != pView->IsGridFront())
+ mpDrawView->SetGridFront( pView->IsGridFront() );
+
+ if (mpDrawView->GetSnapAngle() != pView->GetSnapAngle())
+ mpDrawView->SetSnapAngle( pView->GetSnapAngle() );
+
+ if (mpDrawView->IsGridSnap() != pView->IsGridSnap() )
+ mpDrawView->SetGridSnap( pView->IsGridSnap() );
+
+ if (mpDrawView->IsBordSnap() != pView->IsBordSnap() )
+ mpDrawView->SetBordSnap( pView->IsBordSnap() );
+
+ if (mpDrawView->IsHlplSnap() != pView->IsHlplSnap() )
+ mpDrawView->SetHlplSnap( pView->IsHlplSnap() );
+
+ if (mpDrawView->IsOFrmSnap() != pView->IsOFrmSnap() )
+ mpDrawView->SetOFrmSnap( pView->IsOFrmSnap() );
+
+ if (mpDrawView->IsOPntSnap() != pView->IsOPntSnap() )
+ mpDrawView->SetOPntSnap( pView->IsOPntSnap() );
+
+ if (mpDrawView->IsOConSnap() != pView->IsOConSnap() )
+ mpDrawView->SetOConSnap( pView->IsOConSnap() );
+
+ if (mpDrawView->IsHlplVisible() != pView->IsHlplVisible() )
+ mpDrawView->SetHlplVisible( pView->IsHlplVisible() );
+
+ if (mpDrawView->IsDragStripes() != pView->IsDragStripes() )
+ mpDrawView->SetDragStripes( pView->IsDragStripes() );
+
+ if (mpDrawView->IsPlusHandlesAlwaysVisible() != pView->IsPlusHandlesAlwaysVisible() )
+ mpDrawView->SetPlusHandlesAlwaysVisible( pView->IsPlusHandlesAlwaysVisible() );
+
+ if (mpDrawView->GetSnapMagneticPixel() != pView->GetSnapMagneticPixel() )
+ mpDrawView->SetSnapMagneticPixel( pView->GetSnapMagneticPixel() );
+
+ if (mpDrawView->IsMarkedHitMovesAlways() != pView->IsMarkedHitMovesAlways() )
+ mpDrawView->SetMarkedHitMovesAlways( pView->IsMarkedHitMovesAlways() );
+
+ if (mpDrawView->IsMoveOnlyDragging() != pView->IsMoveOnlyDragging() )
+ mpDrawView->SetMoveOnlyDragging( pView->IsMoveOnlyDragging() );
+
+ if (mpDrawView->IsNoDragXorPolys() != pView->IsNoDragXorPolys() )
+ mpDrawView->SetNoDragXorPolys( pView->IsNoDragXorPolys() );
+
+ if (mpDrawView->IsCrookNoContortion() != pView->IsCrookNoContortion() )
+ mpDrawView->SetCrookNoContortion( pView->IsCrookNoContortion() );
+
+ if (mpDrawView->IsAngleSnapEnabled() != pView->IsAngleSnapEnabled() )
+ mpDrawView->SetAngleSnapEnabled( pView->IsAngleSnapEnabled() );
+
+ if (mpDrawView->IsBigOrtho() != pView->IsBigOrtho() )
+ mpDrawView->SetBigOrtho( pView->IsBigOrtho() );
+
+ if (mpDrawView->IsOrtho() != pView->IsOrtho() )
+ mpDrawView->SetOrtho( pView->IsOrtho() );
+
+ if (mpDrawView->GetEliminatePolyPointLimitAngle() != pView->GetEliminatePolyPointLimitAngle() )
+ mpDrawView->SetEliminatePolyPointLimitAngle( pView->GetEliminatePolyPointLimitAngle() );
+
+ if (mpDrawView->IsEliminatePolyPoints() != pView->IsEliminatePolyPoints() )
+ mpDrawView->SetEliminatePolyPoints( pView->IsEliminatePolyPoints() );
+
+ if (mpDrawView->IsSolidDragging() != pView->IsSolidDragging() )
+ mpDrawView->SetSolidDragging( pView->IsSolidDragging() );
+
+ if (mpDrawView->IsQuickTextEditMode() != pView->IsQuickEdit())
+ mpDrawView->SetQuickTextEditMode( pView->IsQuickEdit() );
+
+ // #i26631#
+ if (mpDrawView->IsMasterPagePaintCaching() != pView->IsMasterPagePaintCaching())
+ mpDrawView->SetMasterPagePaintCaching( pView->IsMasterPagePaintCaching() );
+
+ // handle size: 9 pixels
+ sal_uInt16 nTmp = mpDrawView->GetMarkHdlSizePixel();
+ if( nTmp != 9 )
+ mpDrawView->SetMarkHdlSizePixel( 9 );
+
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+ if (pPageView)
+ {
+ if ( pPageView->GetVisibleLayers() != pView->GetVisibleLayers() )
+ pPageView->SetVisibleLayers( pView->GetVisibleLayers() );
+
+ if ( pPageView->GetPrintableLayers() != pView->GetPrintableLayers() )
+ pPageView->SetPrintableLayers( pView->GetPrintableLayers() );
+
+ if ( pPageView->GetLockedLayers() != pView->GetLockedLayers() )
+ pPageView->SetLockedLayers( pView->GetLockedLayers() );
+
+ if (mePageKind == PageKind::Notes)
+ {
+ if (pPageView->GetHelpLines() != pView->GetNotesHelpLines())
+ pPageView->SetHelpLines( pView->GetNotesHelpLines() );
+ }
+ else if (mePageKind == PageKind::Handout)
+ {
+ if (pPageView->GetHelpLines() != pView->GetHandoutHelpLines())
+ pPageView->SetHelpLines( pView->GetHandoutHelpLines() );
+ }
+ else
+ {
+ if (pPageView->GetHelpLines() != pView->GetStandardHelpLines())
+ pPageView->SetHelpLines( pView->GetStandardHelpLines() );
+ }
+ }
+
+ if ( mpDrawView->GetActiveLayer() != pView->GetActiveLayer() )
+ mpDrawView->SetActiveLayer( pView->GetActiveLayer() );
+
+ sal_uInt16 nSelectedPage = 0;
+
+ if (mePageKind != PageKind::Handout)
+ {
+ nSelectedPage = pView->GetSelectedPage();
+ }
+
+ EditMode eNewEditMode = pView->GetViewShEditMode(/*mePageKind*/);
+ bool bNewLayerMode = pView->IsLayerMode();
+
+ if(IsLayerModeActive() && bNewLayerMode)
+ {
+ // #i57936# Force mbIsLayerModeActive to false so that ChangeEditMode
+ // below does something regarding LayerTabBar content refresh. That refresh
+ // is only done when IsLayerModeActive changes. It needs to be done
+ // since e.g. Layer visibility was changed above and this may need
+ // a refresh to show the correct graphical representation
+ mbIsLayerModeActive = false;
+ }
+
+ ChangeEditMode(eNewEditMode, bNewLayerMode);
+ SwitchPage(nSelectedPage);
+
+ // restore DrawMode for 'normal' window
+ if(GetActiveWindow()->GetOutDev()->GetDrawMode() != pView->GetDrawMode())
+ GetActiveWindow()->GetOutDev()->SetDrawMode(pView->GetDrawMode());
+
+ if ( mpDrawView->IsDesignMode() != pView->IsDesignMode() )
+ {
+ SfxBoolItem aDesignModeItem( SID_FM_DESIGN_MODE, pView->IsDesignMode() );
+ GetViewFrame()->GetDispatcher()->ExecuteList(SID_FM_DESIGN_MODE,
+ SfxCallMode::SYNCHRON | SfxCallMode::RECORD,
+ { &aDesignModeItem });
+ }
+
+ // has to be called in the end, because it executes a WriteFrameViewData()
+ if (mpDrawView->IsFrameDragSingles() != pView->IsFrameDragSingles() )
+ mpDrawView->SetFrameDragSingles( pView->IsFrameDragSingles() );
+}
+
+/**
+ * Apply data of the current view on the FrameView
+ */
+void DrawViewShell::WriteFrameViewData()
+{
+ // store character-(screen-) attribute of FrameView
+ mpFrameView->SetRuler( HasRuler() );
+ mpFrameView->SetGridCoarse( mpDrawView->GetGridCoarse() );
+ mpFrameView->SetGridFine( mpDrawView->GetGridFine() );
+ mpFrameView->SetSnapGridWidth(mpDrawView->GetSnapGridWidthX(), mpDrawView->GetSnapGridWidthY());
+ mpFrameView->SetGridVisible( mpDrawView->IsGridVisible() );
+ mpFrameView->SetGridFront( mpDrawView->IsGridFront() );
+ mpFrameView->SetSnapAngle( mpDrawView->GetSnapAngle() );
+ mpFrameView->SetGridSnap( mpDrawView->IsGridSnap() );
+ mpFrameView->SetBordSnap( mpDrawView->IsBordSnap() );
+ mpFrameView->SetHlplSnap( mpDrawView->IsHlplSnap() );
+ mpFrameView->SetOFrmSnap( mpDrawView->IsOFrmSnap() );
+ mpFrameView->SetOPntSnap( mpDrawView->IsOPntSnap() );
+ mpFrameView->SetOConSnap( mpDrawView->IsOConSnap() );
+ mpFrameView->SetHlplVisible( mpDrawView->IsHlplVisible() );
+ mpFrameView->SetDragStripes( mpDrawView->IsDragStripes() );
+ mpFrameView->SetPlusHandlesAlwaysVisible( mpDrawView->IsPlusHandlesAlwaysVisible() );
+ mpFrameView->SetFrameDragSingles( mpDrawView->IsFrameDragSingles() );
+ mpFrameView->SetMarkedHitMovesAlways( mpDrawView->IsMarkedHitMovesAlways() );
+ mpFrameView->SetMoveOnlyDragging( mpDrawView->IsMoveOnlyDragging() );
+ mpFrameView->SetNoDragXorPolys( mpDrawView->IsNoDragXorPolys() );
+ mpFrameView->SetCrookNoContortion( mpDrawView->IsCrookNoContortion() );
+ mpFrameView->SetBigOrtho( mpDrawView->IsBigOrtho() );
+ mpFrameView->SetEliminatePolyPointLimitAngle( mpDrawView->GetEliminatePolyPointLimitAngle() );
+ mpFrameView->SetEliminatePolyPoints( mpDrawView->IsEliminatePolyPoints() );
+
+ mpFrameView->SetSolidDragging( mpDrawView->IsSolidDragging() );
+ mpFrameView->SetQuickEdit( mpDrawView->IsQuickTextEditMode() );
+
+ mpFrameView->SetDesignMode( mpDrawView->IsDesignMode() );
+
+ Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel();
+ ::tools::Rectangle aVisArea = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) );
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ // aVisArea is nonsensical in the LOK case, use the slide size
+ aVisArea = ::tools::Rectangle(Point(), getCurrentPage()->GetSize());
+ }
+
+ mpFrameView->SetVisArea(aVisArea);
+
+ if( mePageKind == PageKind::Handout )
+ mpFrameView->SetSelectedPage(0);
+ else
+ {
+ mpFrameView->SetSelectedPage( maTabControl->GetCurPagePos() );
+ }
+
+ mpFrameView->SetViewShEditMode(meEditMode);
+ mpFrameView->SetLayerMode(IsLayerModeActive());
+
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+
+ if (pPageView)
+ {
+ if ( mpFrameView->GetVisibleLayers() != pPageView->GetVisibleLayers() )
+ mpFrameView->SetVisibleLayers( pPageView->GetVisibleLayers() );
+
+ if ( mpFrameView->GetPrintableLayers() != pPageView->GetPrintableLayers() )
+ mpFrameView->SetPrintableLayers( pPageView->GetPrintableLayers() );
+
+ if ( mpFrameView->GetLockedLayers() != pPageView->GetLockedLayers() )
+ mpFrameView->SetLockedLayers( pPageView->GetLockedLayers() );
+
+ if (mePageKind == PageKind::Notes)
+ {
+ mpFrameView->SetNotesHelpLines( pPageView->GetHelpLines() );
+ }
+ else if (mePageKind == PageKind::Handout)
+ {
+ mpFrameView->SetHandoutHelpLines( pPageView->GetHelpLines() );
+ }
+ else
+ {
+ mpFrameView->SetStandardHelpLines( pPageView->GetHelpLines() );
+ }
+ }
+
+ if ( mpFrameView->GetActiveLayer() != mpDrawView->GetActiveLayer() )
+ mpFrameView->SetActiveLayer( mpDrawView->GetActiveLayer() );
+
+ // store DrawMode for 'normal' window
+ if(mpFrameView->GetDrawMode() != GetActiveWindow()->GetOutDev()->GetDrawMode())
+ mpFrameView->SetDrawMode(GetActiveWindow()->GetOutDev()->GetDrawMode());
+}
+
+void DrawViewShell::PrePaint()
+{
+ mpDrawView->PrePaint();
+}
+
+/**
+ * The event is forwarded to the Viewshell and the current function by the
+ * window pWin.
+ *
+ * Remark: pWin==NULL, if Paint() is called from ShowWindow!
+ */
+void DrawViewShell::Paint(const ::tools::Rectangle& rRect, ::sd::Window* pWin)
+{
+ /* This is done before each text edit, so why not do it before every paint.
+ The default language is only used if the outliner only contains one
+ character in a symbol font */
+ GetDoc()->GetDrawOutliner().SetDefaultLanguage( GetDoc()->GetLanguage( EE_CHAR_LANGUAGE ) );
+
+ // Set Application Background color for usage in SdrPaintView(s)
+ mpDrawView->SetApplicationBackgroundColor( mnAppBackgroundColor );
+
+ /* This is done before each text edit, so why not do it before every paint.
+ The default language is only used if the outliner only contains one
+ character in a symbol font */
+ GetDoc()->GetDrawOutliner().SetDefaultLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() );
+
+ mpDrawView->CompleteRedraw( pWin->GetOutDev(), vcl::Region( rRect ) );
+}
+
+/**
+ * adjust zoom factor for InPlace
+ */
+void DrawViewShell::SetZoomFactor(const Fraction& rZoomX, const Fraction& rZoomY)
+{
+ ViewShell::SetZoomFactor(rZoomX, rZoomY);
+ mbZoomOnPage = false;
+ Point aOrigin = GetActiveWindow()->GetViewOrigin();
+ GetActiveWindow()->SetWinViewPos(aOrigin);
+}
+
+void DrawViewShell::HidePage()
+{
+ FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell();
+ if (pFormShell != nullptr)
+ pFormShell->PrepareClose(false);
+}
+
+void DrawViewShell::WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& rSequence )
+{
+ WriteFrameViewData();
+
+ ViewShell::WriteUserDataSequence( rSequence );
+
+ const sal_Int32 nIndex = rSequence.getLength();
+ rSequence.realloc( nIndex + 1 );
+ auto pSequence = rSequence.getArray();
+ pSequence[nIndex].Name = sUNO_View_ZoomOnPage ;
+ pSequence[nIndex].Value <<= mbZoomOnPage;
+
+ // Common SdrModel processing
+ GetDocSh()->GetDoc()->WriteUserDataSequence(rSequence);
+}
+
+void DrawViewShell::ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& rSequence )
+{
+ WriteFrameViewData();
+
+ ViewShell::ReadUserDataSequence( rSequence );
+
+ for (const css::beans::PropertyValue& rValue : rSequence)
+ {
+ if ( rValue.Name == sUNO_View_ZoomOnPage )
+ {
+ bool bZoomPage = false;
+ if( rValue.Value >>= bZoomPage )
+ {
+ mbZoomOnPage = bZoomPage;
+ }
+ }
+ // Fallback to common SdrModel processing
+ else GetDocSh()->GetDoc()->ReadUserDataSequenceValue(&rValue);
+ }
+
+ // The parameter rSequence contains the config-items from
+ // <config:config-item-set config:name="ooo:view-settings">. Determine, whether
+ // they contain "VisibleLayers", "PrintableLayers" and "LockedLayers". If not, it
+ // is a foreign document or a new document after transition period and the corresponding
+ // information were read from <draw:layer-set>. In that case we need to bring
+ // the information from model to view.
+ bool bHasVisiPrnLockSettings(false);
+ for ( auto & rPropertyValue : rSequence )
+ {
+ if ( rPropertyValue.Name == sUNO_View_VisibleLayers
+ || rPropertyValue.Name == sUNO_View_PrintableLayers
+ || rPropertyValue.Name == sUNO_View_LockedLayers )
+ {
+ bHasVisiPrnLockSettings = true;
+ break;
+ }
+ }
+ if ( !bHasVisiPrnLockSettings )
+ {
+ const SdrLayerAdmin& rLayerAdmin = GetDocSh()->GetDoc()->GetLayerAdmin();
+ SdrLayerIDSet aSdrLayerIDSet;
+ rLayerAdmin.getVisibleLayersODF( aSdrLayerIDSet );
+ mpFrameView -> SetVisibleLayers( aSdrLayerIDSet );
+ rLayerAdmin.getPrintableLayersODF( aSdrLayerIDSet );
+ mpFrameView -> SetPrintableLayers( aSdrLayerIDSet );
+ rLayerAdmin.getLockedLayersODF( aSdrLayerIDSet );
+ mpFrameView -> SetLockedLayers( aSdrLayerIDSet );
+ }
+ else
+ {
+ // tdf#129898 repair layer "DrawnInSlideshow", which was wrongly written
+ // in LO 6.2 to 6.4. The ODF defaults were corrected when reading draw:layer-set, but
+ // not in reading config settings, because there the name is not known.
+ const SdrLayerAdmin& rLayerAdmin = GetDocSh()->GetDoc()->GetLayerAdmin();
+ if (rLayerAdmin.GetLayer("DrawnInSlideshow"))
+ {
+ SdrLayerIDSet aSdrLayerIDSet;
+ rLayerAdmin.getVisibleLayersODF( aSdrLayerIDSet );
+ mpFrameView -> SetVisibleLayers( aSdrLayerIDSet );
+ rLayerAdmin.getPrintableLayersODF( aSdrLayerIDSet );
+ mpFrameView -> SetPrintableLayers( aSdrLayerIDSet );
+ rLayerAdmin.getLockedLayersODF( aSdrLayerIDSet );
+ mpFrameView -> SetLockedLayers( aSdrLayerIDSet );
+ }
+ }
+
+
+ if( mpFrameView->GetPageKind() != mePageKind )
+ {
+ mePageKind = mpFrameView->GetPageKind();
+
+ if (mePageKind == PageKind::Notes)
+ {
+ GetActiveWindow()->SetHelpId( CMD_SID_NOTES_MODE );
+ }
+ else if (mePageKind == PageKind::Handout)
+ {
+ GetActiveWindow()->SetHelpId( CMD_SID_HANDOUT_MASTER_MODE );
+ }
+ else
+ {
+ GetActiveWindow()->SetHelpId( HID_SDDRAWVIEWSHELL );
+ }
+ }
+
+ ReadFrameViewData( mpFrameView );
+
+ if( !mbZoomOnPage )
+ {
+ const ::tools::Rectangle aVisArea( mpFrameView->GetVisArea() );
+
+ // tdf#151621 Do not set if the embedded object is opening in a new window.
+ if (GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED
+ && GetDocSh()->IsInPlaceActive())
+ {
+ GetDocSh()->SetVisArea(aVisArea);
+ }
+
+ VisAreaChanged(aVisArea);
+
+ ::sd::View* pView = GetView();
+
+ if (pView)
+ {
+ pView->VisAreaChanged(GetActiveWindow()->GetOutDev());
+ }
+
+ SetZoomRect(aVisArea);
+ }
+ ChangeEditMode (meEditMode, ! IsLayerModeActive());
+ ResetActualLayer();
+}
+
+void DrawViewShell::VisAreaChanged(const ::tools::Rectangle& rRect)
+{
+ ViewShell::VisAreaChanged( rRect );
+
+ DrawController& rController = GetViewShellBase().GetDrawController();
+ rController.FireVisAreaChanged (rRect);
+}
+
+/** If there is a valid controller then create a new instance of
+ <type>AccessibleDrawDocumentView</type>. Otherwise return an empty
+ reference.
+*/
+css::uno::Reference<css::accessibility::XAccessible>
+ DrawViewShell::CreateAccessibleDocumentView (::sd::Window* pWindow)
+{
+ if (GetViewShellBase().GetController() != nullptr)
+ {
+ rtl::Reference<accessibility::AccessibleDrawDocumentView> pDocumentView =
+ new accessibility::AccessibleDrawDocumentView (
+ pWindow,
+ this,
+ GetViewShellBase().GetController(),
+ pWindow->GetAccessibleParentWindow()->GetAccessible());
+ pDocumentView->Init();
+ return pDocumentView;
+ }
+
+ SAL_WARN("sd", "DrawViewShell::CreateAccessibleDocumentView: no controller");
+ return css::uno::Reference< css::accessibility::XAccessible>();
+}
+
+int DrawViewShell::GetActiveTabLayerIndex() const
+{
+ const LayerTabBar* pBar
+ = const_cast<DrawViewShell*>(this)->GetLayerTabControl ();
+ if (pBar != nullptr)
+ return pBar->GetPagePos (pBar->GetCurPageId());
+ else
+ return -1;
+}
+
+void DrawViewShell::SetActiveTabLayerIndex (int nIndex)
+{
+ LayerTabBar* pBar = GetLayerTabControl ();
+ if (pBar == nullptr)
+ return;
+
+ // Ignore invalid indices silently.
+ if (nIndex>=0 && nIndex<pBar->GetPageCount())
+ {
+ // Tell the draw view and the tab control of the new active layer.
+ mpDrawView->SetActiveLayer (pBar->GetLayerName (pBar->GetPageId (static_cast<sal_uInt16>(nIndex))));
+ pBar->SetCurPageId (pBar->GetPageId (static_cast<sal_uInt16>(nIndex)));
+ rtl::Reference<SdUnoDrawView> pUnoDrawView(new SdUnoDrawView (
+ *this,
+ *GetView()));
+ css::uno::Reference< css::drawing::XLayer> rLayer = pUnoDrawView->getActiveLayer();
+ GetViewShellBase().GetDrawController().fireChangeLayer( &rLayer );
+ }
+}
+
+LayerTabBar* DrawViewShell::GetLayerTabControl()
+{
+ return mpLayerTabBar.get();
+}
+
+int DrawViewShell::GetTabLayerCount() const
+{
+ const LayerTabBar* pBar
+ = const_cast<DrawViewShell*>(this)->GetLayerTabControl ();
+ if (pBar != nullptr)
+ return pBar->GetPageCount();
+ else
+ return 0;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviews6.cxx b/sd/source/ui/view/drviews6.cxx
new file mode 100644
index 000000000..7d85151f7
--- /dev/null
+++ b/sd/source/ui/view/drviews6.cxx
@@ -0,0 +1,339 @@
+/* -*- 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 <config_features.h>
+
+#include <DrawViewShell.hxx>
+#include <sfx2/request.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svxids.hrc>
+#include <svx/fontwork.hxx>
+#include <svx/bmpmask.hxx>
+#include <svx/imapdlg.hxx>
+#include <svx/SvxColorChildWindow.hxx>
+#include <svx/f3dchild.hxx>
+#include <avmedia/mediaplayer.hxx>
+#include <svl/intitem.hxx>
+
+#include <app.hrc>
+#include <strings.hrc>
+
+#include <animobjs.hxx>
+#include <AnimationChildWindow.hxx>
+#include <sdresid.hxx>
+#include <drawdoc.hxx>
+#include <drawview.hxx>
+#include <svx/svdoashp.hxx>
+
+namespace sd {
+
+/**
+ * handle SfxRequests for FontWork
+ */
+void DrawViewShell::ExecFormText(SfxRequest& rReq)
+{
+ // nothing is executed during a slide show!
+ if(HasCurrentFunction(SID_PRESENTATION))
+ return;
+
+ CheckLineTo (rReq);
+
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+
+ if ( rMarkList.GetMarkCount() == 1 && rReq.GetArgs() &&
+ !mpDrawView->IsPresObjSelected() )
+ {
+ const SfxItemSet& rSet = *rReq.GetArgs();
+
+ if ( mpDrawView->IsTextEdit() )
+ mpDrawView->SdrEndTextEdit();
+
+ mpDrawView->SetAttributes(rSet);
+ }
+}
+
+/**
+ * Return state values for FontWork
+ */
+void DrawViewShell::GetFormTextState(SfxItemSet& rSet)
+{
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ const SdrObject* pObj = nullptr;
+
+ if ( rMarkList.GetMarkCount() == 1 )
+ pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+
+ const SdrTextObj* pTextObj = dynamic_cast< const SdrTextObj* >(pObj);
+ const bool bDeactivate(
+ !pObj ||
+ !pTextObj ||
+ !pTextObj->HasText() ||
+ dynamic_cast< const SdrObjCustomShape* >(pObj)); // #121538# no FontWork for CustomShapes
+
+ if(bDeactivate)
+ {
+// automatic open/close the FontWork-Dialog; first deactivate it
+
+ rSet.DisableItem(XATTR_FORMTXTSTYLE);
+ rSet.DisableItem(XATTR_FORMTXTADJUST);
+ rSet.DisableItem(XATTR_FORMTXTDISTANCE);
+ rSet.DisableItem(XATTR_FORMTXTSTART);
+ rSet.DisableItem(XATTR_FORMTXTMIRROR);
+ rSet.DisableItem(XATTR_FORMTXTHIDEFORM);
+ rSet.DisableItem(XATTR_FORMTXTOUTLINE);
+ rSet.DisableItem(XATTR_FORMTXTSHADOW);
+ rSet.DisableItem(XATTR_FORMTXTSHDWCOLOR);
+ rSet.DisableItem(XATTR_FORMTXTSHDWXVAL);
+ rSet.DisableItem(XATTR_FORMTXTSHDWYVAL);
+ }
+ else
+ {
+ SfxItemSet aSet( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aSet );
+ rSet.Set( aSet );
+ }
+}
+
+void DrawViewShell::ExecAnimationWin( SfxRequest& rReq )
+{
+ // nothing is executed during a slide show!
+ if (HasCurrentFunction(SID_PRESENTATION))
+ return;
+
+ CheckLineTo (rReq);
+
+ sal_uInt16 nSId = rReq.GetSlot();
+
+ switch( nSId )
+ {
+ case SID_ANIMATOR_INIT:
+ case SID_ANIMATOR_ADD:
+ case SID_ANIMATOR_CREATE:
+ {
+ AnimationWindow* pAnimWin;
+ sal_uInt16 nId = AnimationChildWindow::GetChildWindowId();
+
+ SfxChildWindow* pWnd = GetViewFrame()->GetChildWindow(nId);
+
+ pAnimWin = pWnd ? static_cast<AnimationWindow*>(pWnd->GetWindow()) : nullptr;
+
+ if ( pAnimWin )
+ {
+ if( nSId == SID_ANIMATOR_ADD )
+ pAnimWin->AddObj( *mpDrawView );
+ else if( nSId == SID_ANIMATOR_CREATE )
+ pAnimWin->CreateAnimObj( *mpDrawView );
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+/**
+ * Return status values for animator
+ *
+ * nValue == 0 -> No button
+ * nValue == 1 -> Button 'accept'
+ * nValue == 2 -> Button 'accept individually'
+ * nValue == 3 -> Buttons 'accept' and 'accept individually'
+ */
+void DrawViewShell::GetAnimationWinState( SfxItemSet& rSet )
+{
+ // here we could disable buttons etc.
+ sal_uInt16 nValue;
+
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ const size_t nMarkCount = rMarkList.GetMarkCount();
+
+ if( nMarkCount == 0 )
+ nValue = 0;
+ else if( nMarkCount > 1 )
+ nValue = 3;
+ else // 1 Object
+ {
+ const SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
+ SdrInventor nInv = pObj->GetObjInventor();
+ SdrObjKind nId = pObj->GetObjIdentifier();
+ // 1 selected group object
+ if( nInv == SdrInventor::Default && nId == SdrObjKind::Group )
+ nValue = 3;
+ else if( nInv == SdrInventor::Default && nId == SdrObjKind::Graphic ) // Animated GIF ?
+ {
+ sal_uInt16 nCount = 0;
+
+ if( static_cast<const SdrGrafObj*>(pObj)->IsAnimated() )
+ nCount = static_cast<const SdrGrafObj*>(pObj)->GetGraphic().GetAnimation().Count();
+ if( nCount > 0 )
+ nValue = 2;
+ else
+ nValue = 1;
+ }
+ else
+ nValue = 1;
+ }
+ rSet.Put( SfxUInt16Item( SID_ANIMATOR_STATE, nValue ) );
+}
+
+void DrawViewShell::SetChildWindowState( SfxItemSet& rSet )
+{
+ // State of SfxChild-Windows (Animator, Fontwork etc.)
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_FONTWORK ) )
+ {
+ sal_uInt16 nId = SvxFontWorkChildWindow::GetChildWindowId();
+ rSet.Put(SfxBoolItem(SID_FONTWORK, GetViewFrame()->HasChildWindow(nId)));
+ }
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_COLOR_CONTROL ) )
+ {
+ sal_uInt16 nId = SvxColorChildWindow::GetChildWindowId();
+ rSet.Put(SfxBoolItem(SID_COLOR_CONTROL, GetViewFrame()->HasChildWindow(nId)));
+ }
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ANIMATION_OBJECTS ) )
+ {
+ sal_uInt16 nId = AnimationChildWindow::GetChildWindowId();
+ rSet.Put( SfxBoolItem( SID_ANIMATION_OBJECTS, GetViewFrame()->HasChildWindow( nId ) ) );
+ }
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_NAVIGATOR ) )
+ {
+ rSet.Put( SfxBoolItem( SID_NAVIGATOR, GetViewFrame()->HasChildWindow( SID_NAVIGATOR ) ) );
+ }
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_BMPMASK ) )
+ {
+ sal_uInt16 nId = SvxBmpMaskChildWindow::GetChildWindowId();
+ rSet.Put( SfxBoolItem( SID_BMPMASK, GetViewFrame()->HasChildWindow( nId ) ) );
+ }
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_IMAP ) )
+ {
+ sal_uInt16 nId = SvxIMapDlgChildWindow::GetChildWindowId();
+ rSet.Put( SfxBoolItem( SID_IMAP, GetViewFrame()->HasChildWindow( nId ) ) );
+ }
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_3D_WIN ) )
+ {
+ sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId();
+ rSet.Put( SfxBoolItem( SID_3D_WIN, GetViewFrame()->HasChildWindow( nId ) ) );
+ }
+#if HAVE_FEATURE_AVMEDIA
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_AVMEDIA_PLAYER ) )
+ {
+ sal_uInt16 nId = ::avmedia::MediaPlayer::GetChildWindowId();
+ rSet.Put( SfxBoolItem( SID_AVMEDIA_PLAYER, GetViewFrame()->HasChildWindow( nId ) ) );
+ }
+#endif
+}
+
+/**
+ * Handle SfxRequests for pipette
+ */
+void DrawViewShell::ExecBmpMask( SfxRequest const & rReq )
+{
+ // nothing is executed during a slide show!
+ if (HasCurrentFunction(SID_PRESENTATION))
+ return;
+
+ switch ( rReq.GetSlot() )
+ {
+ case SID_BMPMASK_PIPETTE :
+ {
+ mbPipette = static_cast<const SfxBoolItem&>( rReq.GetArgs()->
+ Get( SID_BMPMASK_PIPETTE ) ).GetValue();
+ }
+ break;
+
+ case SID_BMPMASK_EXEC :
+ {
+ SdrGrafObj* pObj = nullptr;
+ if( mpDrawView && mpDrawView->GetMarkedObjectList().GetMarkCount() )
+ pObj = dynamic_cast< SdrGrafObj* >( mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj() );
+
+ if ( pObj && !mpDrawView->IsTextEdit() )
+ {
+ typedef std::unique_ptr< SdrGrafObj, SdrObjectFreeOp > SdrGrafObjPtr;
+ SdrGrafObjPtr xNewObj(pObj->CloneSdrObject(pObj->getSdrModelFromSdrObject()));
+ bool bCont = true;
+
+ if (xNewObj->IsLinkedGraphic())
+ {
+ std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(GetFrameWeld(), "modules/sdraw/ui/queryunlinkimagedialog.ui"));
+ std::unique_ptr<weld::MessageDialog> xQueryBox(xBuilder->weld_message_dialog("QueryUnlinkImageDialog"));
+
+ if (RET_YES == xQueryBox->run())
+ xNewObj->ReleaseGraphicLink();
+ else
+ bCont = false;
+ }
+
+ SfxChildWindow* pWnd = GetViewFrame()->GetChildWindow(
+ SvxBmpMaskChildWindow::GetChildWindowId());
+ SvxBmpMask* pBmpMask = pWnd ? static_cast<SvxBmpMask*>(pWnd->GetWindow()) : nullptr;
+ assert(pBmpMask);
+ if (bCont && pBmpMask)
+ {
+ const Graphic& rOldGraphic = xNewObj->GetGraphic();
+ const Graphic aNewGraphic(pBmpMask->Mask(rOldGraphic));
+
+ if( aNewGraphic != rOldGraphic )
+ {
+ SdrPageView* pPV = mpDrawView->GetSdrPageView();
+
+ xNewObj->SetEmptyPresObj(false);
+ xNewObj->SetGraphic(pBmpMask->Mask(xNewObj->GetGraphic()));
+
+ OUString aStr = mpDrawView->GetDescriptionOfMarkedObjects() +
+ " " + SdResId(STR_EYEDROPPER);
+
+ mpDrawView->BegUndo( aStr );
+ mpDrawView->ReplaceObjectAtView(pObj, *pPV, xNewObj.release());
+ mpDrawView->EndUndo();
+ }
+ }
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void DrawViewShell::GetBmpMaskState( SfxItemSet& rSet )
+{
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ const SdrObject* pObj = nullptr;
+ bool bEnable = false;
+
+ if ( rMarkList.GetMarkCount() == 1 )
+ pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+
+ // valid graphic object?
+ if( auto pGrafObj = dynamic_cast< const SdrGrafObj *>( pObj ) )
+ if (!pGrafObj->IsEPS() && !mpDrawView->IsTextEdit() )
+ bEnable = true;
+
+ // put value
+ rSet.Put( SfxBoolItem( SID_BMPMASK_EXEC, bEnable ) );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviews7.cxx b/sd/source/ui/view/drviews7.cxx
new file mode 100644
index 000000000..4f375dc6a
--- /dev/null
+++ b/sd/source/ui/view/drviews7.cxx
@@ -0,0 +1,1991 @@
+/* -*- 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 <memory>
+
+#include <sal/config.h>
+#include <sal/log.hxx>
+
+#include <utility>
+
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/linguistic2/XThesaurus.hpp>
+#include <svx/pageitem.hxx>
+#include <svx/rulritem.hxx>
+#include <svx/svdouno.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/sizeitem.hxx>
+#include <editeng/urlfieldhelper.hxx>
+#include <officecfg/Office/Impress.hxx>
+#include <svx/svxids.hrc>
+#include <svx/svdpagv.hxx>
+#include <svx/clipfmtitem.hxx>
+#include <svl/eitem.hxx>
+#include <svl/intitem.hxx>
+#include <svl/itemset.hxx>
+#include <svl/stritem.hxx>
+#include <svl/visitem.hxx>
+#include <svl/whiter.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xflgrit.hxx>
+#include <svx/xflhtit.hxx>
+#include <svx/xbtmpit.hxx>
+#include <editeng/unolingu.hxx>
+#include <svx/extrusionbar.hxx>
+#include <svx/fontworkbar.hxx>
+
+// #UndoRedo#
+#include <svtools/insdlg.hxx>
+#include <unotools/moduleoptions.hxx>
+#include <svl/cjkoptions.hxx>
+#include <comphelper/processfactory.hxx>
+#include <sfx2/request.hxx>
+
+#include <svtools/cliplistener.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/viewfrm.hxx>
+
+#include <app.hrc>
+
+#include <PresentationViewShell.hxx>
+
+#include <drawdoc.hxx>
+#include <DrawViewShell.hxx>
+#include <sdmod.hxx>
+#include <unokywds.hxx>
+#include <sdpage.hxx>
+#include <DrawDocShell.hxx>
+#include <zoomlist.hxx>
+#include <slideshow.hxx>
+#include <drawview.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShellManager.hxx>
+#include <LayerTabBar.hxx>
+#include <fupoor.hxx>
+#include <Window.hxx>
+#include <fuediglu.hxx>
+#include <fubullet.hxx>
+#include <fuconcs.hxx>
+#include <fuformatpaintbrush.hxx>
+#include <stlsheet.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::linguistic2;
+
+/** Create a list of clipboard formats that are supported both from the
+ current clipboard content and the DrawViewShell.
+ The list is stored in a new instance of SvxClipboardFormatItem.
+*/
+static ::std::unique_ptr<SvxClipboardFormatItem> GetSupportedClipboardFormats (
+ TransferableDataHelper& rDataHelper)
+{
+ ::std::unique_ptr<SvxClipboardFormatItem> pResult (
+ new SvxClipboardFormatItem(SID_CLIPBOARD_FORMAT_ITEMS));
+
+ sal_uInt32 nFormatCount (rDataHelper.GetFormatCount());
+ for (sal_uInt32 i=0; i<nFormatCount; i++)
+ {
+ const SotClipboardFormatId nTestFormat = rDataHelper.GetFormat(i);
+
+ // Check if the current format is the same as one that has already
+ // been handled.
+ bool bDuplicate (false);
+ for (sal_uInt32 j=0; j<i; j++)
+ {
+ if (nTestFormat == rDataHelper.GetFormat(j))
+ {
+ bDuplicate = true;
+ break;
+ }
+ }
+
+ // Look up the format among those that are supported by the
+ // DrawViewShell.
+ if ( ! bDuplicate)
+ {
+ switch (nTestFormat)
+ {
+ case SotClipboardFormatId::EMBED_SOURCE:
+ {
+ OUString sName;
+
+ TransferableObjectDescriptor aDescriptor;
+ if (rDataHelper.GetTransferableObjectDescriptor(
+ SotClipboardFormatId::OBJECTDESCRIPTOR, aDescriptor))
+ {
+ sName = aDescriptor.maTypeName;
+ }
+ if (!sName.isEmpty())
+ pResult->AddClipbrdFormat(nTestFormat, sName);
+ else
+ pResult->AddClipbrdFormat(nTestFormat);
+
+ break;
+ }
+
+
+ case SotClipboardFormatId::LINK_SOURCE:
+ case SotClipboardFormatId::DRAWING:
+ case SotClipboardFormatId::SVXB:
+ case SotClipboardFormatId::GDIMETAFILE:
+ case SotClipboardFormatId::BITMAP:
+ case SotClipboardFormatId::NETSCAPE_BOOKMARK:
+ case SotClipboardFormatId::STRING:
+ case SotClipboardFormatId::HTML:
+ case SotClipboardFormatId::RTF:
+ case SotClipboardFormatId::RICHTEXT:
+ case SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT:
+ pResult->AddClipbrdFormat(nTestFormat);
+ break;
+ default: break;
+ }
+ }
+ }
+
+ // Check some OLE formats whose names are handled differently.
+ SotClipboardFormatId nFormat (SotClipboardFormatId::EMBED_SOURCE_OLE);
+ bool bHasFormat (rDataHelper.HasFormat(nFormat));
+ if ( ! bHasFormat)
+ {
+ bHasFormat = rDataHelper.HasFormat(nFormat);
+ }
+ if (bHasFormat)
+ {
+ OUString sName;
+ OUString sSource;
+ if (SvPasteObjectHelper::GetEmbeddedName (rDataHelper, sName, sSource, nFormat))
+ pResult->AddClipbrdFormat (nFormat, sName);
+ }
+
+ return pResult;
+}
+
+namespace sd {
+
+IMPL_LINK( DrawViewShell, ClipboardChanged, TransferableDataHelper*, pDataHelper, void )
+{
+ mbPastePossible = ( pDataHelper->GetFormatCount() != 0 );
+
+ // Update the list of supported clipboard formats according to the
+ // new clipboard content.
+ // There are some stack traces that indicate the possibility of the
+ // DrawViewShell destructor called during the call to
+ // GetSupportedClipboardFormats(). If that really has happened then
+ // exit immediately.
+ TransferableDataHelper aDataHelper (
+ TransferableDataHelper::CreateFromSystemClipboard(GetActiveWindow()));
+ ::std::unique_ptr<SvxClipboardFormatItem> pFormats (GetSupportedClipboardFormats(aDataHelper));
+ if (mpDrawView == nullptr)
+ return;
+ mpCurrentClipboardFormats = std::move(pFormats);
+
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_PASTE );
+ rBindings.Invalidate( SID_PASTE_SPECIAL );
+ rBindings.Invalidate( SID_PASTE_UNFORMATTED );
+ rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
+}
+
+void DrawViewShell::GetDrawAttrState(SfxItemSet& rSet)
+{
+ SfxItemSet aSet( mpDrawView->GetGeoAttrFromMarked() );
+ rSet.Put(aSet,false);
+}
+
+::Outliner* DrawViewShell::GetOutlinerForMasterPageOutlineTextObj(ESelection &rSel)
+{
+ if( !mpDrawView )
+ return nullptr;
+
+ //when there is one object selected
+ if (!mpDrawView->AreObjectsMarked() || (mpDrawView->GetMarkedObjectList().GetMarkCount() != 1))
+ return nullptr;
+
+ //and we are editing the outline object
+ if (!mpDrawView->IsTextEdit())
+ return nullptr;
+
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+ if (!pPageView)
+ return nullptr;
+
+ SdPage* pPage = static_cast<SdPage*>(pPageView->GetPage());
+ //only show these in a normal master page
+ if (!pPage || (pPage->GetPageKind() != PageKind::Standard) || !pPage->IsMasterPage())
+ return nullptr;
+
+ OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
+ ::Outliner* pOL = pOLV ? pOLV->GetOutliner() : nullptr;
+ if (!pOL)
+ return nullptr;
+ rSel = pOLV->GetSelection();
+
+ return pOL;
+}
+
+void DrawViewShell::GetMarginProperties( SfxItemSet &rSet )
+{
+ SdPage *pPage = getCurrentPage();
+ SfxWhichIter aIter( rSet );
+ sal_uInt16 nWhich = aIter.FirstWhich();
+ while ( nWhich )
+ {
+ switch ( nWhich )
+ {
+ case SID_ATTR_PAGE_LRSPACE:
+ {
+ // const SvxLRSpaceItem aTmpPageLRSpace ( rDesc.GetMaster().GetLRSpace() );
+ const SvxLongLRSpaceItem aLongLR(
+ static_cast<::tools::Long>(pPage->GetLeftBorder()),
+ static_cast<::tools::Long>(pPage->GetRightBorder()),
+ SID_ATTR_PAGE_LRSPACE );
+ rSet.Put( aLongLR );
+ }
+ break;
+
+ case SID_ATTR_PAGE_ULSPACE:
+ {
+ // const SvxULSpaceItem aUL( rDesc.GetMaster().GetULSpace() );
+ SvxLongULSpaceItem aLongUL(
+ static_cast<::tools::Long>(pPage->GetUpperBorder()),
+ static_cast<::tools::Long>(pPage->GetLowerBorder()),
+ SID_ATTR_PAGE_ULSPACE );
+ rSet.Put( aLongUL );
+ }
+ break;
+
+ default:
+ break;
+ }
+ nWhich = aIter.NextWhich();
+ }
+}
+
+bool DrawViewShell::ShouldDisableEditHyperlink() const
+{
+ if (!mpDrawView)
+ return true;
+ if (!mpDrawView->AreObjectsMarked())
+ return true;
+ if (mpDrawView->GetMarkedObjectList().GetMarkCount() != 1)
+ return true;
+
+ bool bDisableEditHyperlink = true;
+ if( mpDrawView->IsTextEdit() )
+ {
+ if (URLFieldHelper::IsCursorAtURLField(mpDrawView->GetTextEditOutlinerView()))
+ bDisableEditHyperlink = false;
+ }
+ else
+ {
+ SdrUnoObj* pUnoCtrl = dynamic_cast<SdrUnoObj*>( mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj() );
+
+ if ( pUnoCtrl && SdrInventor::FmForm == pUnoCtrl->GetObjInventor() )
+ {
+ const uno::Reference< awt::XControlModel >& xControlModel( pUnoCtrl->GetUnoControlModel() );
+ if( xControlModel.is() )
+ {
+ uno::Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY );
+ if( xPropSet.is() )
+ {
+ uno::Reference< beans::XPropertySetInfo > xPropInfo( xPropSet->getPropertySetInfo() );
+ if( xPropInfo.is() && xPropInfo->hasPropertyByName( "TargetURL") )
+ {
+ bDisableEditHyperlink = false;
+ }
+ }
+ }
+ }
+ }
+ return bDisableEditHyperlink;
+}
+
+void DrawViewShell::GetMenuState( SfxItemSet &rSet )
+{
+ if (mpDrawView == nullptr)
+ {
+ // This assertion and return are here to prevent crashes.
+ DBG_ASSERT(mpDrawView!=nullptr, "Please report this assertion to the Impress team.");
+ return;
+ }
+
+ ViewShell::GetMenuState(rSet);
+ bool bDisableVerticalText = !SvtCJKOptions::IsVerticalTextEnabled();
+
+ if ( bDisableVerticalText )
+ {
+ rSet.DisableItem( SID_DRAW_FONTWORK_VERTICAL );
+ rSet.DisableItem( SID_DRAW_CAPTION_VERTICAL );
+ rSet.DisableItem( SID_TEXT_FITTOSIZE_VERTICAL );
+ rSet.DisableItem( SID_DRAW_TEXT_VERTICAL );
+ }
+
+ bool bConvertToPathPossible = mpDrawView->IsConvertToPathObjPossible();
+
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ const size_t nMarkCount = rMarkList.GetMarkCount();
+
+ if( nMarkCount == 1 )
+ {
+ bool bDisable = true;
+ SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ if( auto pGrafObj = dynamic_cast<const SdrGrafObj*>( pObj) )
+ if( pGrafObj->getQrCode() )
+ bDisable = false;
+ if(bDisable)
+ {
+ rSet.DisableItem(SID_EDIT_QRCODE);
+ }
+ }
+
+ //format paintbrush
+ FuFormatPaintBrush::GetMenuState( *this, rSet );
+
+ // State of SfxChild-Windows (Animator, Fontwork etc.)
+ SetChildWindowState( rSet );
+
+ if(HasCurrentFunction())
+ {
+ sal_uInt16 nSId = GetCurrentFunction()->GetSlotID();
+ rSet.Put( SfxBoolItem( nSId, true ) );
+ }
+
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+
+ GetMenuStateSel(rSet);
+
+ if (SfxItemState::DEFAULT == rSet.GetItemState(SID_ASSIGN_LAYOUT))
+ {
+ bool bDisable = true;
+ if( pPageView )
+ {
+ SdPage* pPage = dynamic_cast< SdPage* >( pPageView->GetPage() );
+
+ if( pPage && !pPage->IsMasterPage() )
+ {
+ rSet.Put( SfxUInt32Item( SID_ASSIGN_LAYOUT, static_cast< sal_uInt32 >(pPage->GetAutoLayout()) ) );
+ bDisable = false;
+ }
+ }
+
+ if(bDisable)
+ {
+ rSet.DisableItem(SID_ASSIGN_LAYOUT);
+ }
+ }
+
+ if (SfxItemState::DEFAULT == rSet.GetItemState(SID_EXPAND_PAGE))
+ {
+ bool bDisable = true;
+ if( pPageView )
+ {
+ SdPage* pPage = dynamic_cast< SdPage* >( pPageView->GetPage() );
+
+ if( pPage && (pPage->GetPageKind() == PageKind::Standard) && !pPage->IsMasterPage() )
+ {
+ SdrObject* pObj = pPage->GetPresObj(PresObjKind::Outline);
+
+ if (pObj!=nullptr )
+ {
+ if( !pObj->IsEmptyPresObj() )
+ {
+ bDisable = false;
+ }
+ else
+ {
+ // check if the object is in edit, then if it's temporarily not empty
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
+ if( pTextObj )
+ {
+ if( pTextObj->CanCreateEditOutlinerParaObject() )
+ {
+ bDisable = false;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(bDisable)
+ {
+ rSet.DisableItem(SID_EXPAND_PAGE);
+ }
+ }
+
+ if (SfxItemState::DEFAULT == rSet.GetItemState(SID_SUMMARY_PAGE))
+ {
+ bool bDisable = true;
+ if( pPageView )
+ {
+ SdPage* pPage = dynamic_cast< SdPage* >( pPageView->GetPage() );
+
+ if( pPage && (pPage->GetPageKind() == PageKind::Standard) && !pPage->IsMasterPage() )
+ {
+ SdrObject* pObj = pPage->GetPresObj(PresObjKind::Title);
+
+ if(pObj && !pObj->IsEmptyPresObj())
+ {
+ bDisable = false;
+ }
+ }
+ }
+
+ if(bDisable)
+ {
+ rSet.DisableItem(SID_SUMMARY_PAGE);
+ }
+ }
+
+ if (SfxItemState::DEFAULT == rSet.GetItemState(SID_ASSIGN_LAYOUT))
+ {
+ bool bDisable = true;
+ if( pPageView )
+ {
+ SdPage* pPage = dynamic_cast< SdPage* >( pPageView->GetPage() );
+
+ if( pPage && !pPage->IsMasterPage() )
+ {
+ rSet.Put( SfxUInt32Item(SID_ASSIGN_LAYOUT, pPage->GetAutoLayout()) );
+ bDisable = false;
+ }
+ }
+
+ if(bDisable)
+ {
+ rSet.DisableItem(SID_ASSIGN_LAYOUT);
+ }
+ }
+
+ // is it possible to start the presentation?
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_PRESENTATION ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_REHEARSE_TIMINGS ) )
+ {
+ bool bDisable = true;
+ sal_uInt16 nCount = GetDoc()->GetSdPageCount( PageKind::Standard );
+
+ for( sal_uInt16 i = 0; i < nCount && bDisable; i++ )
+ {
+ SdPage* pPage = GetDoc()->GetSdPage(i, PageKind::Standard);
+
+ if( !pPage->IsExcluded() )
+ bDisable = false;
+ }
+
+ if( bDisable || GetDocSh()->IsPreview())
+ {
+ rSet.DisableItem( SID_PRESENTATION );
+ rSet.DisableItem( SID_REHEARSE_TIMINGS );
+ }
+ }
+
+ // gluepoints
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_EDITMODE ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_INSERT_POINT ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_PERCENT ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR_LEFT ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR_RIGHT ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR_TOP ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR_BOTTOM ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_HORZALIGN_CENTER ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_HORZALIGN_LEFT ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_HORZALIGN_RIGHT ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_VERTALIGN_CENTER ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_VERTALIGN_TOP ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_VERTALIGN_BOTTOM ) )
+ {
+ // percent
+ TriState eState = mpDrawView->IsMarkedGluePointsPercent();
+ if( eState == TRISTATE_INDET )
+ rSet.InvalidateItem( SID_GLUE_PERCENT );
+ else
+ rSet.Put( SfxBoolItem( SID_GLUE_PERCENT, eState == TRISTATE_TRUE ) );
+
+ // alignment has no effect by percent
+ if( eState == TRISTATE_TRUE )
+ {
+ rSet.DisableItem( SID_GLUE_HORZALIGN_CENTER );
+ rSet.DisableItem( SID_GLUE_HORZALIGN_LEFT );
+ rSet.DisableItem( SID_GLUE_HORZALIGN_RIGHT );
+ rSet.DisableItem( SID_GLUE_VERTALIGN_CENTER );
+ rSet.DisableItem( SID_GLUE_VERTALIGN_TOP );
+ rSet.DisableItem( SID_GLUE_VERTALIGN_BOTTOM );
+ }
+ else
+ {
+ // horizontal alignment
+ SdrAlign nHorz = mpDrawView->GetMarkedGluePointsAlign( false );
+ rSet.Put( SfxBoolItem( SID_GLUE_HORZALIGN_CENTER, nHorz == SdrAlign::HORZ_CENTER ) );
+ rSet.Put( SfxBoolItem( SID_GLUE_HORZALIGN_LEFT, nHorz == SdrAlign::HORZ_LEFT ) );
+ rSet.Put( SfxBoolItem( SID_GLUE_HORZALIGN_RIGHT, nHorz == SdrAlign::HORZ_RIGHT ) );
+ // vertical alignment
+ SdrAlign nVert = mpDrawView->GetMarkedGluePointsAlign( true );
+ rSet.Put( SfxBoolItem( SID_GLUE_VERTALIGN_CENTER, nVert == SdrAlign::VERT_CENTER ) );
+ rSet.Put( SfxBoolItem( SID_GLUE_VERTALIGN_TOP, nVert == SdrAlign::VERT_TOP ) );
+ rSet.Put( SfxBoolItem( SID_GLUE_VERTALIGN_BOTTOM, nVert == SdrAlign::VERT_BOTTOM ) );
+ }
+
+ // insert point
+ rSet.Put( SfxBoolItem( SID_GLUE_INSERT_POINT, mpDrawView->IsInsGluePointMode() ) );
+
+ // Escape direction
+ // left
+ eState = mpDrawView->IsMarkedGluePointsEscDir( SdrEscapeDirection::LEFT );
+ if( eState == TRISTATE_INDET )
+ rSet.InvalidateItem( SID_GLUE_ESCDIR_LEFT );
+ else
+ rSet.Put( SfxBoolItem( SID_GLUE_ESCDIR_LEFT, eState == TRISTATE_TRUE ) );
+ // right
+ eState = mpDrawView->IsMarkedGluePointsEscDir( SdrEscapeDirection::RIGHT );
+ if( eState == TRISTATE_INDET )
+ rSet.InvalidateItem( SID_GLUE_ESCDIR_RIGHT );
+ else
+ rSet.Put( SfxBoolItem( SID_GLUE_ESCDIR_RIGHT, eState == TRISTATE_TRUE ) );
+ // top
+ eState = mpDrawView->IsMarkedGluePointsEscDir( SdrEscapeDirection::TOP );
+ if( eState == TRISTATE_INDET )
+ rSet.InvalidateItem( SID_GLUE_ESCDIR_TOP );
+ else
+ rSet.Put( SfxBoolItem( SID_GLUE_ESCDIR_TOP, eState == TRISTATE_TRUE ) );
+ // bottom
+ eState = mpDrawView->IsMarkedGluePointsEscDir( SdrEscapeDirection::BOTTOM );
+ if( eState == TRISTATE_INDET )
+ rSet.InvalidateItem( SID_GLUE_ESCDIR_BOTTOM );
+ else
+ rSet.Put( SfxBoolItem( SID_GLUE_ESCDIR_BOTTOM, eState == TRISTATE_TRUE ) );
+ }
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_GRID_FRONT ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_HELPLINES_FRONT ) )
+ {
+ rSet.Put( SfxBoolItem( SID_GRID_FRONT, mpDrawView->IsGridFront() ) );
+ rSet.Put( SfxBoolItem( SID_HELPLINES_FRONT, mpDrawView->IsHlplFront() ) );
+ }
+
+ if (!mpDrawView->IsFrameDragSingles())
+ rSet.Put(SfxBoolItem(SID_BEZIER_EDIT, true));
+ else
+ rSet.Put(SfxBoolItem(SID_BEZIER_EDIT, false));
+
+ if(dynamic_cast<FuEditGluePoints*>( GetCurrentFunction().get()))
+ rSet.Put(SfxBoolItem(SID_GLUE_EDITMODE, true));
+ else
+ rSet.Put(SfxBoolItem(SID_GLUE_EDITMODE, false));
+
+ if( !mpDrawView->IsMirrorAllowed( true, true ) )
+ {
+ rSet.DisableItem( SID_HORIZONTAL );
+ rSet.DisableItem( SID_VERTICAL );
+ rSet.DisableItem( SID_FLIP_HORIZONTAL );
+ rSet.DisableItem( SID_FLIP_VERTICAL );
+ }
+
+ if( !mpDrawView->IsMirrorAllowed() )
+ {
+ rSet.DisableItem( SID_OBJECT_MIRROR );
+// rSet.DisableItem( SID_CONVERT_TO_3D_LATHE );
+// rSet.DisableItem( SID_CONVERT_TO_3D_LATHE_FAST );
+ }
+
+ // interactive transparence control
+ if(!mpDrawView->IsTransparenceAllowed())
+ {
+ rSet.DisableItem( SID_OBJECT_TRANSPARENCE );
+ }
+
+ // interactive gradient control
+ if(!mpDrawView->IsGradientAllowed())
+ {
+ rSet.DisableItem( SID_OBJECT_GRADIENT );
+ }
+
+ // disable morphing if necessary
+ if ( !mpDrawView->IsMorphingAllowed() )
+ rSet.DisableItem( SID_POLYGON_MORPHING );
+
+ if( !mpDrawView->IsReverseOrderPossible() )
+ {
+ rSet.DisableItem( SID_REVERSE_ORDER );
+ }
+
+ if ( !bConvertToPathPossible &&
+ !mpDrawView->IsCrookAllowed( mpDrawView->IsCrookNoContortion() ) )
+ {
+ // implicit transformation into curve not possible
+ rSet.DisableItem(SID_OBJECT_CROOK_ROTATE);
+ rSet.DisableItem(SID_OBJECT_CROOK_SLANT);
+ rSet.DisableItem(SID_OBJECT_CROOK_STRETCH);
+ }
+
+ if ( !mpDrawView->IsGroupEntered() )
+ {
+ rSet.DisableItem( SID_LEAVE_GROUP );
+ rSet.Put( SfxBoolItem( SID_LEAVE_ALL_GROUPS, false ) );
+ rSet.ClearItem( SID_LEAVE_ALL_GROUPS );
+ rSet.DisableItem( SID_LEAVE_ALL_GROUPS );
+ }
+ else
+ rSet.Put( SfxBoolItem( SID_LEAVE_ALL_GROUPS, true ) );
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_THESAURUS ) )
+ {
+ if ( !mpDrawView->IsTextEdit() )
+ {
+ rSet.DisableItem( SID_THESAURUS );
+ }
+ else
+ {
+ LanguageType eLang = GetDoc()->GetLanguage( EE_CHAR_LANGUAGE );
+ Reference< XThesaurus > xThesaurus( LinguMgr::GetThesaurus() );
+
+ if (!xThesaurus.is() || eLang == LANGUAGE_NONE || !xThesaurus->hasLocale( LanguageTag::convertToLocale( eLang)) )
+ rSet.DisableItem( SID_THESAURUS );
+ }
+ }
+
+ if ( !mpDrawView->IsTextEdit() )
+ {
+ rSet.DisableItem( SID_THESAURUS );
+ }
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_SELECTALL ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_SIZE_ALL ) )
+ {
+ if( pPageView && pPageView->GetObjList()->GetObjCount() == 0 )
+ {
+ // should be disabled if there is no object on the draw area:
+ rSet.DisableItem( SID_SELECTALL );
+ rSet.DisableItem( SID_SIZE_ALL );
+ }
+ }
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_CONTEXT ) )
+ rSet.Put( SfxStringItem( SID_CONTEXT, mpDrawView->GetStatusText() ) );
+
+ // clipboard (paste)
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_PASTE ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_PASTE_SPECIAL ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_PASTE_UNFORMATTED ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_CLIPBOARD_FORMAT_ITEMS ) )
+ {
+ if ( !mxClipEvtLstnr.is() )
+ {
+ // avoid clipboard initialization for
+ // read-only presentation views (workaround for NT4.0
+ // clipboard prob...)
+ if( dynamic_cast< const PresentationViewShell *>( this ) == nullptr )
+ {
+ // create listener
+ mxClipEvtLstnr = new TransferableClipboardListener( LINK( this, DrawViewShell, ClipboardChanged ) );
+ mxClipEvtLstnr->AddListener( GetActiveWindow() );
+
+ // get initial state
+ TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) );
+ mbPastePossible = ( aDataHelper.GetFormatCount() != 0 );
+ mpCurrentClipboardFormats = GetSupportedClipboardFormats( aDataHelper );
+ }
+ else
+ mbPastePossible = false;
+ }
+
+ if( !mbPastePossible )
+ {
+ rSet.DisableItem( SID_PASTE );
+ rSet.DisableItem( SID_PASTE_SPECIAL );
+ rSet.DisableItem( SID_PASTE_UNFORMATTED );
+ rSet.DisableItem( SID_CLIPBOARD_FORMAT_ITEMS );
+ }
+ else if( SfxItemState::DEFAULT == rSet.GetItemState( SID_CLIPBOARD_FORMAT_ITEMS ) )
+ {
+ if (mpCurrentClipboardFormats != nullptr)
+ rSet.Put(*mpCurrentClipboardFormats);
+ }
+ }
+
+ if ( !bConvertToPathPossible )
+ {
+ rSet.DisableItem(SID_CHANGEBEZIER);
+ }
+
+ if (mpDrawView == nullptr)
+ {
+ // The mpDrawView was not NULL but is now.
+ // The reason for this may be that the DrawViewShell has been
+ // destroyed in the meantime.
+ // We can only return immediately and hope that the deleted
+ // DrawViewShell is not called again.
+ DBG_ASSERT(mpDrawView!=nullptr, "Please report this assertion to the Impress team.");
+ return;
+ }
+
+ if( !( mpDrawView->IsConvertToPolyObjPossible() || mpDrawView->IsVectorizeAllowed() ) )
+ rSet.DisableItem(SID_CHANGEPOLYGON);
+
+ if( !( mpDrawView->IsConvertToPolyObjPossible() || mpDrawView->IsConvertToContourPossible() ) )
+ rSet.DisableItem(SID_CONVERT_TO_CONTOUR);
+
+ if ( !mpDrawView->IsConvertTo3DObjPossible() )
+ {
+ rSet.DisableItem(SID_CONVERT_TO_3D);
+ rSet.DisableItem(SID_CONVERT_TO_3D_LATHE);
+ rSet.DisableItem(SID_CONVERT_TO_3D_LATHE_FAST);
+ }
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_MANAGE_LINKS ) )
+ {
+ if ( GetDoc()->GetLinkCount() == 0 )
+ {
+ rSet.DisableItem(SID_MANAGE_LINKS);
+ }
+ }
+
+ if (mePageKind == PageKind::Handout)
+ {
+ rSet.DisableItem(SID_PRESENTATION_LAYOUT);
+ rSet.DisableItem(SID_SELECT_BACKGROUND);
+ rSet.DisableItem(SID_SAVE_BACKGROUND);
+ }
+
+ if (mePageKind == PageKind::Notes)
+ {
+ rSet.DisableItem(SID_INSERTPAGE);
+ rSet.DisableItem(SID_RENAMEPAGE);
+ rSet.DisableItem(SID_RENAMEPAGE_QUICK);
+ rSet.DisableItem(SID_DUPLICATE_PAGE);
+ rSet.ClearItem(SID_ANIMATION_OBJECTS);
+ rSet.DisableItem(SID_ANIMATION_OBJECTS);
+ rSet.DisableItem(SID_ANIMATION_EFFECTS);
+ rSet.DisableItem(SID_EXECUTE_ANIMATION_EFFECT);
+
+ if (meEditMode == EditMode::MasterPage)
+ rSet.DisableItem(SID_MODIFYPAGE);
+
+ rSet.DisableItem(SID_SELECT_BACKGROUND);
+ rSet.DisableItem(SID_SAVE_BACKGROUND);
+ rSet.DisableItem(SID_INSERTLAYER);
+ rSet.DisableItem(SID_LAYERMODE);
+ rSet.DisableItem(SID_INSERTFILE);
+ }
+ else if (mePageKind == PageKind::Handout)
+ {
+ rSet.DisableItem(SID_INSERTPAGE);
+ rSet.DisableItem(SID_DUPLICATE_PAGE);
+ rSet.ClearItem(SID_ANIMATION_OBJECTS);
+ rSet.DisableItem(SID_ANIMATION_OBJECTS);
+ rSet.DisableItem(SID_ANIMATION_EFFECTS);
+ rSet.DisableItem(SID_EXECUTE_ANIMATION_EFFECT);
+ rSet.DisableItem(SID_RENAMEPAGE);
+ rSet.DisableItem(SID_RENAMEPAGE_QUICK);
+ rSet.DisableItem(SID_INSERTLAYER);
+ rSet.DisableItem(SID_MODIFYLAYER);
+ rSet.DisableItem(SID_RENAMELAYER);
+ rSet.DisableItem(SID_LAYERMODE);
+ rSet.DisableItem(SID_INSERTFILE);
+ rSet.DisableItem(SID_PAGEMODE);
+ rSet.DisableItem(SID_SELECT_BACKGROUND);
+ rSet.DisableItem(SID_SAVE_BACKGROUND);
+ }
+ else
+ {
+ if (meEditMode == EditMode::MasterPage)
+ {
+ rSet.DisableItem(SID_INSERTPAGE);
+ rSet.DisableItem(SID_DUPLICATE_PAGE);
+ rSet.DisableItem(SID_MODIFYPAGE);
+ rSet.ClearItem(SID_ANIMATION_OBJECTS);
+ rSet.DisableItem(SID_ANIMATION_OBJECTS);
+ }
+
+ rSet.Put (SfxBoolItem (SID_LAYERMODE, IsLayerModeActive()));
+ }
+
+ if ( ! IsLayerModeActive())
+ {
+ rSet.DisableItem( SID_INSERTLAYER );
+ rSet.DisableItem( SID_MODIFYLAYER );
+ rSet.DisableItem( SID_DELETE_LAYER );
+ rSet.DisableItem( SID_RENAMELAYER );
+ }
+
+ if (meEditMode == EditMode::Page)
+ {
+ /**********************************************************************
+ * page mode
+ **********************************************************************/
+ rSet.Put(SfxBoolItem(SID_PAGEMODE, true));
+ rSet.Put(SfxBoolItem(SID_MASTERPAGE, false));
+ rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false));
+ rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false));
+ rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false));
+
+ rSet.DisableItem (SID_INSERT_MASTER_PAGE);
+ rSet.DisableItem (SID_DELETE_MASTER_PAGE);
+ rSet.DisableItem (SID_RENAME_MASTER_PAGE);
+ rSet.DisableItem (SID_CLOSE_MASTER_VIEW);
+ }
+ else
+ {
+ rSet.Put(SfxBoolItem(SID_PAGEMODE, false));
+ rSet.Put(SfxBoolItem(SID_MASTERPAGE, true));
+
+ /**********************************************************************
+ * Background page mode
+ **********************************************************************/
+ if (mePageKind == PageKind::Standard)
+ {
+ rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, true));
+ rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false));
+ rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false));
+
+ }
+ else if (mePageKind == PageKind::Notes)
+ {
+ rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false));
+ rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, true));
+ rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false));
+ }
+ else if (mePageKind == PageKind::Handout)
+ {
+ rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false));
+ rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false));
+ rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, true));
+ }
+ }
+
+ // set state of the ruler
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_RULER ) )
+ rSet.Put( SfxBoolItem( SID_RULER, HasRuler() ) );
+
+ // do not delete the last page or a master page
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_DELETE_PAGE )
+ || SfxItemState::DEFAULT == rSet.GetItemState( SID_DELETE_MASTER_PAGE ) )
+ {
+ if (maTabControl->GetPageCount() == 1 ||
+ meEditMode == EditMode::MasterPage ||
+ mePageKind == PageKind::Notes ||
+ mePageKind == PageKind::Handout ||
+ (GetShellType()!=ST_DRAW&&IsLayerModeActive()))
+ {
+ if (rSet.GetItemState(SID_DELETE_PAGE) == SfxItemState::DEFAULT)
+ rSet.DisableItem(SID_DELETE_PAGE);
+ if (rSet.GetItemState(SID_DELETE_MASTER_PAGE)==SfxItemState::DEFAULT)
+ rSet.DisableItem(SID_DELETE_MASTER_PAGE);
+ }
+ }
+
+ // is it allowed to delete the current layer?
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_DELETE_LAYER )
+ || SfxItemState::DEFAULT == rSet.GetItemState( SID_RENAMELAYER ) )
+ {
+ if(GetLayerTabControl()) // #i87182#
+ {
+ sal_uInt16 nCurrentLayer = GetLayerTabControl()->GetCurPageId();
+ const OUString& rName = GetLayerTabControl()->GetLayerName(nCurrentLayer);
+
+ if (!IsLayerModeActive() || LayerTabBar::IsRealNameOfStandardLayer(rName))
+ {
+ rSet.DisableItem(SID_DELETE_LAYER);
+ rSet.DisableItem(SID_RENAMELAYER);
+ }
+ }
+ else
+ {
+ OSL_ENSURE(false, "No LayerTabBar (!)");
+ }
+ }
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_CUT ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_COPY ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_OUTLINE_BULLET ))
+ {
+ OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView();
+
+ // special treatment of for SID_OUTLINE_BULLET if objects with different
+ // kinds of NumBullets are marked
+ bool bHasOutliner = false;
+ bool bHasOther = false;
+ for(size_t nNum = 0; nNum < nMarkCount; ++nNum)
+ {
+ SdrObject* pObj = rMarkList.GetMark(nNum)->GetMarkedSdrObj();
+ if( pObj->GetObjInventor() == SdrInventor::Default )
+ {
+ if( pObj->GetObjIdentifier() == SdrObjKind::OutlineText )
+ {
+ bHasOutliner = true;
+ if(bHasOther)
+ break;
+ }
+ else
+ {
+ bHasOther = true;
+ if(bHasOutliner)
+ break;
+ }
+ }
+ }
+
+ if( bHasOther && bHasOutliner )
+ rSet.DisableItem( SID_OUTLINE_BULLET );
+
+ if (pOlView)
+ {
+ if (pOlView->GetSelected().isEmpty() || GetObjectShell()->isContentExtractionLocked())
+ {
+ rSet.DisableItem( SID_CUT );
+ rSet.DisableItem( SID_COPY );
+ }
+ }
+
+ }
+
+ FuBullet::GetSlotState( rSet, this, GetViewFrame() );
+
+ if ( GetDocSh()->IsUIActive() )
+ {
+ rSet.DisableItem( SID_INSERT_OBJECT );
+ rSet.DisableItem( SID_INSERT_FLOATINGFRAME );
+ rSet.DisableItem( SID_INSERT_MATH );
+ rSet.DisableItem( SID_INSERT_DIAGRAM );
+ rSet.DisableItem( SID_ATTR_TABLE );
+ rSet.DisableItem( SID_SIZE_REAL );
+ rSet.DisableItem( SID_SIZE_OPTIMAL );
+ rSet.DisableItem( SID_SIZE_ALL );
+ rSet.DisableItem( SID_SIZE_PAGE_WIDTH );
+ rSet.DisableItem( SID_SIZE_PAGE );
+ rSet.DisableItem( SID_DUPLICATE_PAGE );
+ rSet.DisableItem( SID_ZOOM_TOOLBOX );
+ }
+
+ // Zoom-State
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ZOOM_IN ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_ZOOM_OUT )||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_ZOOM_PANNING ) )
+ {
+ if( GetActiveWindow()->GetZoom() <= GetActiveWindow()->GetMinZoom() || GetDocSh()->IsUIActive() )
+ {
+ rSet.DisableItem( SID_ZOOM_OUT );
+ rSet.DisableItem( SID_ZOOM_PANNING );
+ }
+ if( GetActiveWindow()->GetZoom() >= GetActiveWindow()->GetMaxZoom() || GetDocSh()->IsUIActive() )
+ rSet.DisableItem( SID_ZOOM_IN );
+ }
+
+ if (!mpZoomList->IsNextPossible())
+ {
+ rSet.DisableItem(SID_ZOOM_NEXT);
+ }
+ if (!mpZoomList->IsPreviousPossible())
+ {
+ rSet.DisableItem(SID_ZOOM_PREV);
+ }
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_REMOTE_DLG ) )
+ {
+
+ bool bDisableSdremoteForGood = false;
+#ifndef ENABLE_SDREMOTE
+ bDisableSdremoteForGood = true;
+#endif
+ bDisableSdremoteForGood |= ! ( /*officecfg::Office::Common::Misc::ExperimentalMode::get() &&*/
+ officecfg::Office::Impress::Misc::Start::EnableSdremote::get() );
+
+ // This dialog is only useful for TCP/IP remote control
+ // which is unusual, under-tested and a security issue.
+ if ( bDisableSdremoteForGood )
+ {
+ rSet.Put(SfxVisibilityItem(SID_REMOTE_DLG, false));
+ }
+ }
+
+ // EditText active
+ if (GetViewShellBase().GetViewShellManager()->GetShell(ToolbarId::Draw_Text_Toolbox_Sd) != nullptr)
+ {
+ sal_uInt16 nCurrentSId = SID_ATTR_CHAR;
+
+ if(HasCurrentFunction())
+ {
+ nCurrentSId = GetCurrentFunction()->GetSlotID();
+ }
+ if( nCurrentSId != SID_TEXT_FITTOSIZE &&
+ nCurrentSId != SID_TEXT_FITTOSIZE_VERTICAL &&
+ nCurrentSId != SID_ATTR_CHAR_VERTICAL )
+ nCurrentSId = SID_ATTR_CHAR;
+
+ rSet.Put( SfxBoolItem( nCurrentSId, true ) );
+ }
+
+ if ( GetDocSh()->IsReadOnly() )
+ {
+ rSet.DisableItem( SID_AUTOSPELL_CHECK );
+ }
+ else
+ {
+ if (GetDoc()->GetOnlineSpell())
+ {
+ rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, true));
+ }
+ else
+ {
+ rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, false));
+ }
+ }
+
+ SdrPageView* pPV = mpDrawView->GetSdrPageView();
+ OUString aActiveLayer = mpDrawView->GetActiveLayer();
+
+ if ( ( !aActiveLayer.isEmpty() && pPV && ( pPV->IsLayerLocked(aActiveLayer) ||
+ !pPV->IsLayerVisible(aActiveLayer) ) ) ||
+ SD_MOD()->GetWaterCan() )
+ {
+ rSet.DisableItem( SID_PASTE );
+ rSet.DisableItem( SID_PASTE_SPECIAL );
+ rSet.DisableItem( SID_PASTE_UNFORMATTED );
+ rSet.DisableItem( SID_CLIPBOARD_FORMAT_ITEMS );
+
+ rSet.DisableItem( SID_INSERT_FLD_DATE_FIX );
+ rSet.DisableItem( SID_INSERT_FLD_DATE_VAR );
+ rSet.DisableItem( SID_INSERT_FLD_TIME_FIX );
+ rSet.DisableItem( SID_INSERT_FLD_TIME_VAR );
+ rSet.DisableItem( SID_INSERT_FLD_AUTHOR );
+ rSet.DisableItem( SID_INSERT_FLD_PAGE );
+ rSet.DisableItem( SID_INSERT_FLD_PAGE_TITLE );
+ rSet.DisableItem( SID_INSERT_FLD_PAGES );
+ rSet.DisableItem( SID_INSERT_FLD_FILE );
+
+ rSet.DisableItem( SID_INSERT_GRAPHIC );
+ rSet.DisableItem( SID_INSERT_AVMEDIA );
+ rSet.DisableItem( SID_INSERT_DIAGRAM );
+ rSet.DisableItem( SID_INSERT_OBJECT );
+ rSet.DisableItem( SID_INSERT_FLOATINGFRAME );
+
+ rSet.DisableItem( SID_INSERT_MATH );
+ rSet.DisableItem( SID_INSERT_FRAME );
+ rSet.DisableItem( SID_INSERTFILE );
+ rSet.DisableItem( SID_ATTR_TABLE );
+ rSet.DisableItem( SID_COPYOBJECTS );
+
+ rSet.DisableItem( SID_SCAN );
+ rSet.DisableItem( SID_TWAIN_SELECT );
+ rSet.DisableItem( SID_TWAIN_TRANSFER );
+
+// rSet.DisableItem( SID_BEZIER_EDIT );
+ rSet.DisableItem( SID_GLUE_EDITMODE );
+ rSet.DisableItem( SID_OBJECT_ROTATE );
+ rSet.DisableItem( SID_OBJECT_SHEAR );
+ rSet.DisableItem( SID_OBJECT_MIRROR );
+ rSet.DisableItem( SID_OBJECT_CROP );
+ rSet.DisableItem( SID_ATTR_GRAF_CROP );
+ rSet.DisableItem( SID_OBJECT_TRANSPARENCE );
+ rSet.DisableItem( SID_OBJECT_GRADIENT );
+ rSet.DisableItem( SID_OBJECT_CROOK_ROTATE );
+ rSet.DisableItem( SID_OBJECT_CROOK_SLANT );
+ rSet.DisableItem( SID_OBJECT_CROOK_STRETCH );
+
+ // Disable all object-creating tools
+ rSet.ClearItem( SID_ATTR_CHAR );
+ rSet.DisableItem( SID_ATTR_CHAR );
+ rSet.ClearItem( SID_ATTR_CHAR_VERTICAL );
+ rSet.DisableItem( SID_ATTR_CHAR_VERTICAL );
+ rSet.ClearItem(SID_DRAW_LINE);
+ rSet.DisableItem(SID_DRAW_LINE);
+ rSet.ClearItem(SID_DRAW_MEASURELINE);
+ rSet.DisableItem(SID_DRAW_MEASURELINE);
+ rSet.ClearItem(SID_DRAW_XLINE);
+ rSet.DisableItem(SID_DRAW_XLINE);
+ rSet.ClearItem( SID_LINE_ARROW_START );
+ rSet.DisableItem( SID_LINE_ARROW_START );
+ rSet.ClearItem( SID_LINE_ARROW_END );
+ rSet.DisableItem( SID_LINE_ARROW_END );
+ rSet.ClearItem( SID_LINE_ARROWS );
+ rSet.DisableItem( SID_LINE_ARROWS );
+ rSet.ClearItem( SID_LINE_ARROW_CIRCLE );
+ rSet.DisableItem( SID_LINE_ARROW_CIRCLE );
+ rSet.ClearItem( SID_LINE_CIRCLE_ARROW );
+ rSet.DisableItem( SID_LINE_CIRCLE_ARROW );
+ rSet.ClearItem( SID_LINE_ARROW_SQUARE );
+ rSet.DisableItem( SID_LINE_ARROW_SQUARE );
+ rSet.ClearItem( SID_LINE_SQUARE_ARROW );
+ rSet.DisableItem( SID_LINE_SQUARE_ARROW );
+
+ rSet.ClearItem(SID_DRAW_RECT);
+ rSet.DisableItem(SID_DRAW_RECT);
+ rSet.ClearItem(SID_DRAW_RECT_NOFILL);
+ rSet.DisableItem(SID_DRAW_RECT_NOFILL);
+ rSet.ClearItem(SID_DRAW_RECT_ROUND);
+ rSet.DisableItem(SID_DRAW_RECT_ROUND);
+ rSet.ClearItem(SID_DRAW_RECT_ROUND_NOFILL);
+ rSet.DisableItem(SID_DRAW_RECT_ROUND_NOFILL);
+ rSet.ClearItem(SID_DRAW_SQUARE);
+ rSet.DisableItem(SID_DRAW_SQUARE);
+ rSet.ClearItem(SID_DRAW_SQUARE_NOFILL);
+ rSet.DisableItem(SID_DRAW_SQUARE_NOFILL);
+ rSet.ClearItem(SID_DRAW_SQUARE_ROUND);
+ rSet.DisableItem(SID_DRAW_SQUARE_ROUND);
+ rSet.ClearItem(SID_DRAW_SQUARE_ROUND_NOFILL);
+ rSet.DisableItem(SID_DRAW_SQUARE_ROUND_NOFILL);
+ rSet.ClearItem(SID_DRAW_ELLIPSE);
+ rSet.DisableItem(SID_DRAW_ELLIPSE);
+ rSet.ClearItem(SID_DRAW_ELLIPSE_NOFILL);
+ rSet.DisableItem(SID_DRAW_ELLIPSE_NOFILL);
+ rSet.ClearItem(SID_DRAW_CIRCLE);
+ rSet.DisableItem(SID_DRAW_CIRCLE);
+ rSet.ClearItem(SID_DRAW_CIRCLE_NOFILL);
+ rSet.DisableItem(SID_DRAW_CIRCLE_NOFILL);
+ rSet.ClearItem(SID_DRAW_CAPTION);
+ rSet.DisableItem(SID_DRAW_CAPTION);
+ rSet.ClearItem(SID_DRAW_FONTWORK);
+ rSet.DisableItem(SID_DRAW_FONTWORK);
+ rSet.ClearItem(SID_DRAW_FONTWORK_VERTICAL);
+ rSet.DisableItem(SID_DRAW_FONTWORK_VERTICAL);
+ rSet.ClearItem(SID_DRAW_CAPTION_VERTICAL);
+ rSet.DisableItem(SID_DRAW_CAPTION_VERTICAL);
+ rSet.ClearItem(SID_TEXT_FITTOSIZE);
+ rSet.DisableItem(SID_TEXT_FITTOSIZE);
+ rSet.ClearItem(SID_TEXT_FITTOSIZE_VERTICAL);
+ rSet.DisableItem(SID_TEXT_FITTOSIZE_VERTICAL);
+ rSet.ClearItem(SID_TOOL_CONNECTOR);
+ rSet.DisableItem(SID_TOOL_CONNECTOR);
+ rSet.ClearItem(SID_CONNECTOR_ARROW_START);
+ rSet.DisableItem(SID_CONNECTOR_ARROW_START);
+ rSet.ClearItem(SID_CONNECTOR_ARROW_END);
+ rSet.DisableItem(SID_CONNECTOR_ARROW_END);
+ rSet.ClearItem(SID_CONNECTOR_ARROWS);
+ rSet.DisableItem(SID_CONNECTOR_ARROWS);
+ rSet.ClearItem(SID_CONNECTOR_CIRCLE_START);
+ rSet.DisableItem(SID_CONNECTOR_CIRCLE_START);
+ rSet.ClearItem(SID_CONNECTOR_CIRCLE_END);
+ rSet.DisableItem(SID_CONNECTOR_CIRCLE_END);
+ rSet.ClearItem(SID_CONNECTOR_CIRCLES);
+ rSet.DisableItem(SID_CONNECTOR_CIRCLES);
+ rSet.ClearItem(SID_CONNECTOR_LINE);
+ rSet.DisableItem(SID_CONNECTOR_LINE);
+ rSet.ClearItem(SID_CONNECTOR_LINE_ARROW_START);
+ rSet.DisableItem(SID_CONNECTOR_LINE_ARROW_START);
+ rSet.ClearItem(SID_CONNECTOR_LINE_ARROW_END);
+ rSet.DisableItem(SID_CONNECTOR_LINE_ARROW_END);
+ rSet.ClearItem(SID_CONNECTOR_LINE_ARROWS);
+ rSet.DisableItem(SID_CONNECTOR_LINE_ARROWS);
+ rSet.ClearItem(SID_CONNECTOR_LINE_CIRCLE_START);
+ rSet.DisableItem(SID_CONNECTOR_LINE_CIRCLE_START);
+ rSet.ClearItem(SID_CONNECTOR_LINE_CIRCLE_END);
+ rSet.DisableItem(SID_CONNECTOR_LINE_CIRCLE_END);
+ rSet.ClearItem(SID_CONNECTOR_LINE_CIRCLES);
+ rSet.DisableItem(SID_CONNECTOR_LINE_CIRCLES);
+ rSet.ClearItem(SID_CONNECTOR_CURVE);
+ rSet.DisableItem(SID_CONNECTOR_CURVE);
+ rSet.ClearItem(SID_CONNECTOR_CURVE_ARROW_START);
+ rSet.DisableItem(SID_CONNECTOR_CURVE_ARROW_START);
+ rSet.ClearItem(SID_CONNECTOR_CURVE_ARROW_END);
+ rSet.DisableItem(SID_CONNECTOR_CURVE_ARROW_END);
+ rSet.ClearItem(SID_CONNECTOR_CURVE_ARROWS);
+ rSet.DisableItem(SID_CONNECTOR_CURVE_ARROWS);
+ rSet.ClearItem(SID_CONNECTOR_CURVE_CIRCLE_START);
+ rSet.DisableItem(SID_CONNECTOR_CURVE_CIRCLE_START);
+ rSet.ClearItem(SID_CONNECTOR_CURVE_CIRCLE_END);
+ rSet.DisableItem(SID_CONNECTOR_CURVE_CIRCLE_END);
+ rSet.ClearItem(SID_CONNECTOR_CURVE_CIRCLES);
+ rSet.DisableItem(SID_CONNECTOR_CURVE_CIRCLES);
+ rSet.ClearItem(SID_CONNECTOR_LINES);
+ rSet.DisableItem(SID_CONNECTOR_LINES);
+ rSet.ClearItem(SID_CONNECTOR_LINES_ARROW_START);
+ rSet.DisableItem(SID_CONNECTOR_LINES_ARROW_START);
+ rSet.ClearItem(SID_CONNECTOR_LINES_ARROW_END);
+ rSet.DisableItem(SID_CONNECTOR_LINES_ARROW_END);
+ rSet.ClearItem(SID_CONNECTOR_LINES_ARROWS);
+ rSet.DisableItem(SID_CONNECTOR_LINES_ARROWS);
+ rSet.ClearItem(SID_CONNECTOR_LINES_CIRCLE_START);
+ rSet.DisableItem(SID_CONNECTOR_LINES_CIRCLE_START);
+ rSet.ClearItem(SID_CONNECTOR_LINES_CIRCLE_END);
+ rSet.DisableItem(SID_CONNECTOR_LINES_CIRCLE_END);
+ rSet.ClearItem(SID_CONNECTOR_LINES_CIRCLES);
+ rSet.DisableItem(SID_CONNECTOR_LINES_CIRCLES);
+ rSet.ClearItem(SID_DRAW_ARC);
+ rSet.DisableItem(SID_DRAW_ARC);
+ rSet.ClearItem(SID_DRAW_CIRCLEARC);
+ rSet.DisableItem(SID_DRAW_CIRCLEARC);
+ rSet.ClearItem(SID_DRAW_PIE);
+ rSet.DisableItem(SID_DRAW_PIE);
+ rSet.ClearItem(SID_DRAW_PIE_NOFILL);
+ rSet.DisableItem(SID_DRAW_PIE_NOFILL);
+ rSet.ClearItem(SID_DRAW_CIRCLEPIE);
+ rSet.DisableItem(SID_DRAW_CIRCLEPIE);
+ rSet.ClearItem(SID_DRAW_CIRCLEPIE_NOFILL);
+ rSet.DisableItem(SID_DRAW_CIRCLEPIE_NOFILL);
+ rSet.ClearItem(SID_DRAW_ELLIPSECUT);
+ rSet.DisableItem(SID_DRAW_ELLIPSECUT);
+ rSet.ClearItem(SID_DRAW_ELLIPSECUT_NOFILL);
+ rSet.DisableItem(SID_DRAW_ELLIPSECUT_NOFILL);
+ rSet.ClearItem(SID_DRAW_CIRCLECUT);
+ rSet.DisableItem(SID_DRAW_CIRCLECUT);
+ rSet.ClearItem(SID_DRAW_CIRCLECUT_NOFILL);
+ rSet.DisableItem(SID_DRAW_CIRCLECUT_NOFILL);
+ rSet.ClearItem(SID_DRAW_POLYGON);
+ rSet.DisableItem(SID_DRAW_POLYGON);
+ rSet.ClearItem(SID_DRAW_POLYGON_NOFILL);
+ rSet.DisableItem(SID_DRAW_POLYGON_NOFILL);
+ rSet.ClearItem(SID_DRAW_FREELINE);
+ rSet.DisableItem(SID_DRAW_FREELINE);
+ rSet.ClearItem(SID_DRAW_FREELINE_NOFILL);
+ rSet.DisableItem(SID_DRAW_FREELINE_NOFILL);
+ rSet.ClearItem(SID_DRAW_XPOLYGON);
+ rSet.DisableItem(SID_DRAW_XPOLYGON);
+ rSet.ClearItem(SID_DRAW_XPOLYGON_NOFILL);
+ rSet.DisableItem(SID_DRAW_XPOLYGON_NOFILL);
+ rSet.ClearItem(SID_DRAW_BEZIER_FILL);
+ rSet.DisableItem(SID_DRAW_BEZIER_FILL);
+ rSet.ClearItem(SID_DRAW_BEZIER_NOFILL);
+ rSet.DisableItem(SID_DRAW_BEZIER_NOFILL);
+ rSet.ClearItem(SID_3D_CUBE);
+ rSet.DisableItem(SID_3D_CUBE);
+ rSet.ClearItem(SID_3D_SHELL);
+ rSet.DisableItem(SID_3D_SHELL);
+ rSet.ClearItem(SID_3D_SPHERE);
+ rSet.DisableItem(SID_3D_SPHERE);
+ rSet.ClearItem(SID_3D_HALF_SPHERE);
+ rSet.DisableItem(SID_3D_HALF_SPHERE);
+ rSet.ClearItem(SID_3D_CYLINDER);
+ rSet.DisableItem(SID_3D_CYLINDER);
+ rSet.ClearItem(SID_3D_CONE);
+ rSet.DisableItem(SID_3D_CONE);
+ rSet.ClearItem(SID_3D_TORUS);
+ rSet.DisableItem(SID_3D_TORUS);
+ rSet.ClearItem(SID_3D_PYRAMID);
+ rSet.DisableItem(SID_3D_PYRAMID);
+ }
+
+ // are the modules available?
+
+ if (!SvtModuleOptions().IsCalc())
+ {
+ // remove menu entry if module is not available
+ rSet.Put( SfxVisibilityItem( SID_ATTR_TABLE, false ) );
+ }
+ if (!SvtModuleOptions().IsChart())
+ {
+ rSet.DisableItem( SID_INSERT_DIAGRAM );
+ }
+ if (!SvtModuleOptions().IsMath())
+ {
+ rSet.DisableItem( SID_INSERT_MATH );
+ }
+
+ rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetViewShellBase() ) );
+ if( (xSlideshow.is() && xSlideshow->isRunning() && (xSlideshow->getAnimationMode() != ANIMATIONMODE_PREVIEW) ) || GetDocSh()->IsPreview() )
+ {
+ // Own Slots
+ rSet.DisableItem( SID_PRESENTATION );
+ rSet.DisableItem( SID_ZOOM_IN );
+ rSet.DisableItem( SID_ZOOM_OUT );
+ rSet.DisableItem( SID_ZOOM_PANNING );
+ rSet.DisableItem( SID_ZOOM_MODE );
+ rSet.DisableItem( SID_ZOOM_NEXT );
+ rSet.DisableItem( SID_ZOOM_PREV );
+ rSet.DisableItem( SID_SIZE_REAL );
+ rSet.DisableItem( SID_SIZE_OPTIMAL );
+ rSet.DisableItem( SID_SIZE_ALL );
+ rSet.DisableItem( SID_SIZE_PAGE_WIDTH );
+ rSet.DisableItem( SID_SIZE_PAGE );
+ rSet.DisableItem( SID_INSERTPAGE );
+ rSet.DisableItem( SID_DUPLICATE_PAGE );
+ rSet.DisableItem( SID_MODIFYPAGE );
+ rSet.DisableItem( SID_RENAMEPAGE );
+ rSet.DisableItem( SID_RENAMEPAGE_QUICK );
+ rSet.DisableItem( SID_DELETE_PAGE );
+ rSet.DisableItem( SID_PAGESETUP );
+
+ if( xSlideshow.is() && xSlideshow->isRunning() )
+ {
+ rSet.ClearItem(SID_INSERTFILE);
+ rSet.ClearItem(SID_OBJECT_ROTATE);
+ rSet.ClearItem(SID_FM_CONFIG);
+ rSet.ClearItem(SID_ANIMATION_EFFECTS);
+ rSet.ClearItem(SID_EXECUTE_ANIMATION_EFFECT);
+ rSet.ClearItem(SID_ANIMATION_OBJECTS);
+ rSet.ClearItem(SID_3D_WIN);
+
+ rSet.DisableItem(SID_OBJECT_ALIGN);
+ rSet.DisableItem(SID_ZOOM_TOOLBOX);
+ rSet.DisableItem(SID_OBJECT_CHOOSE_MODE);
+ rSet.DisableItem(SID_DRAWTBX_TEXT);
+ rSet.DisableItem(SID_DRAWTBX_RECTANGLES);
+ rSet.DisableItem(SID_DRAWTBX_ELLIPSES);
+ rSet.DisableItem(SID_DRAWTBX_LINES);
+ rSet.DisableItem(SID_DRAWTBX_ARROWS);
+ rSet.DisableItem(SID_DRAWTBX_3D_OBJECTS);
+ rSet.DisableItem(SID_DRAWTBX_CONNECTORS);
+ rSet.DisableItem(SID_OBJECT_CHOOSE_MODE );
+ rSet.DisableItem(SID_DRAWTBX_INSERT);
+ rSet.DisableItem(SID_INSERTFILE);
+ rSet.DisableItem(SID_OBJECT_ROTATE);
+ rSet.DisableItem(SID_POSITION);
+ rSet.DisableItem(SID_FM_CONFIG);
+ rSet.DisableItem(SID_ANIMATION_EFFECTS);
+ rSet.DisableItem(SID_EXECUTE_ANIMATION_EFFECT);
+ rSet.DisableItem(SID_ANIMATION_OBJECTS);
+ rSet.DisableItem(SID_3D_WIN);
+ }
+ }
+
+ // Menuoption: Change->Convert->To Bitmap, Change->Convert->To Metafile
+ // disable, if there only Bitmap or Metafiles marked
+ // Menuoption: Format->Area, Format->Line
+ // disabled, if the marked objects not able to handle
+ // these attributes
+
+ bool bSingleGraphicSelected = false;
+
+ if (!mpDrawView->AreObjectsMarked())
+ {
+ rSet.DisableItem (SID_CONVERT_TO_METAFILE);
+ rSet.DisableItem (SID_CONVERT_TO_BITMAP);
+ }
+ else
+ {
+ // get marklist
+ SdrMarkList aMarkList = mpDrawView->GetMarkedObjectList();
+
+ bool bFoundBitmap = false;
+ bool bFoundMetafile = false;
+ bool bFoundObjNoArea = false;
+ bool bFoundNoGraphicObj = false;
+ bool bFoundAny = false;
+ bool bFoundTable = false;
+
+// const size_t nMarkCount = aMarkList.GetMarkCount();
+ for (size_t i=0; i < nMarkCount && !bFoundAny; ++i)
+ {
+ SdrObject* pObj = aMarkList.GetMark(i)->GetMarkedSdrObj();
+ SdrObjKind nId = pObj->GetObjIdentifier();
+ SdrInventor nInv = pObj->GetObjInventor();
+
+ if(nInv == SdrInventor::Default)
+ {
+ // 2D objects
+ switch( nId )
+ {
+ case SdrObjKind::PathLine :
+ case SdrObjKind::PolyLine :
+ case SdrObjKind::Line:
+ case SdrObjKind::FreehandLine :
+ case SdrObjKind::Edge:
+ case SdrObjKind::CircleArc :
+ bFoundObjNoArea = true;
+ bFoundNoGraphicObj = true;
+ break;
+ case SdrObjKind::OLE2 :
+ // #i118485# #i118525# Allow Line, Area and Graphic (Metafile, Bitmap)
+ bSingleGraphicSelected = nMarkCount == 1;
+ bFoundBitmap = true;
+ bFoundMetafile = true;
+ break;
+ case SdrObjKind::Graphic :
+ {
+ bSingleGraphicSelected = nMarkCount == 1;
+ const SdrGrafObj* pSdrGrafObj = static_cast< const SdrGrafObj* >(pObj);
+
+ // Current size of the OBJ_GRAF
+ const ::tools::Rectangle aRect = pObj->GetLogicRect();
+ const Size aCurrentSizeofObj = aRect.GetSize();
+
+ // Original size of the OBJ_GRAF
+ const Size aOriginalSizeofObj = pSdrGrafObj->getOriginalSize();
+
+ if(aCurrentSizeofObj == aOriginalSizeofObj )
+ rSet.DisableItem(SID_ORIGINAL_SIZE);
+
+ switch(pSdrGrafObj->GetGraphicType())
+ {
+ case GraphicType::Bitmap :
+ bFoundBitmap = true;
+ if(pSdrGrafObj->isEmbeddedVectorGraphicData())
+ {
+ bFoundMetafile = true;
+ }
+ break;
+ case GraphicType::GdiMetafile :
+ bFoundMetafile = true;
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ case SdrObjKind::Table:
+ bFoundTable = true;
+ break;
+ default :
+ bFoundAny = true;
+ }
+ }
+ else if(nInv == SdrInventor::E3d)
+ {
+ // 3D objects
+ bFoundAny = true;
+ }
+ }
+
+ if( bFoundTable )
+ rSet.DisableItem( SID_ATTRIBUTES_LINE );
+
+ if (!bFoundAny)
+ {
+ // Disable menuitem for area-dialog
+ if( bFoundObjNoArea ) // #i25616#
+ rSet.DisableItem( SID_ATTRIBUTES_AREA );
+
+ if( bFoundBitmap && !bFoundMetafile && !bFoundNoGraphicObj ) // only Bitmaps marked
+ rSet.DisableItem( SID_CONVERT_TO_BITMAP );
+ else if( !bFoundBitmap && bFoundMetafile && !bFoundNoGraphicObj ) // only Metafiles marked
+ rSet.DisableItem( SID_CONVERT_TO_METAFILE );
+ else if( !bFoundBitmap && !bFoundMetafile && !bFoundNoGraphicObj ) // nothing to do
+ {
+ rSet.DisableItem( SID_CONVERT_TO_BITMAP );
+ rSet.DisableItem( SID_CONVERT_TO_METAFILE );
+ }
+ }
+ }
+
+ if( !bSingleGraphicSelected )
+ {
+ rSet.DisableItem (SID_OBJECT_CROP);
+ rSet.DisableItem (SID_ATTR_GRAF_CROP);
+ }
+
+ // Menuoption: Edit->Hyperlink
+ // Disable, if there is no hyperlink
+ bool bDisableEditHyperlink;
+ if (!moAtContextMenu_DisableEditHyperlink)
+ bDisableEditHyperlink = ShouldDisableEditHyperlink();
+ else
+ {
+ // tdf#137445 if a popup menu was active, use the state as of when the popup was launched and then drop
+ // moAtContextMenu_DisableEditHyperlink
+ bDisableEditHyperlink = *moAtContextMenu_DisableEditHyperlink;
+ moAtContextMenu_DisableEditHyperlink.reset();
+ }
+
+ //highlight selected custom shape
+ {
+ if(HasCurrentFunction())
+ {
+ rtl::Reference< FuPoor > xFunc( GetCurrentFunction() );
+ FuConstructCustomShape* pShapeFunc = dynamic_cast< FuConstructCustomShape* >( xFunc.get() );
+
+ static const sal_uInt16 nCSTbArray[] = { SID_DRAWTBX_CS_BASIC, SID_DRAWTBX_CS_SYMBOL,
+ SID_DRAWTBX_CS_ARROW, SID_DRAWTBX_CS_FLOWCHART,
+ SID_DRAWTBX_CS_CALLOUT, SID_DRAWTBX_CS_STAR };
+
+ const sal_uInt16 nCurrentSId = GetCurrentFunction()->GetSlotID();
+ for (sal_uInt16 i : nCSTbArray)
+ {
+ rSet.ClearItem( i ); // Why is this necessary?
+ rSet.Put( SfxStringItem( i, nCurrentSId == i && pShapeFunc
+ ? pShapeFunc->GetShapeType() : OUString() ) );
+ }
+ }
+ }
+
+ if ( bDisableEditHyperlink || GetDocSh()->IsReadOnly() )
+ rSet.DisableItem( SID_EDIT_HYPERLINK );
+
+ if ( bDisableEditHyperlink )
+ {
+ rSet.DisableItem( SID_OPEN_HYPERLINK );
+ rSet.DisableItem( SID_COPY_HYPERLINK_LOCATION );
+ }
+
+ //fdo#78151 enable show next level/hide last level if editing a master page
+ //PresObjKind::Outline object and the current selection allow that to happen
+ {
+ bool bDisableShowNextLevel = true;
+ bool bDisableHideLastLevel = true;
+
+ ESelection aSel;
+ ::Outliner* pOL = GetOutlinerForMasterPageOutlineTextObj(aSel);
+ if (pOL)
+ {
+ //and are on the last paragraph
+ aSel.Adjust();
+ if (aSel.nEndPara == pOL->GetParagraphCount() - 1)
+ {
+ sal_uInt16 nDepth = pOL->GetDepth(aSel.nEndPara);
+ if (nDepth != sal_uInt16(-1))
+ {
+ //there exists another numbering level that
+ //is currently hidden
+ if (nDepth < 8)
+ bDisableShowNextLevel = false;
+ //there exists a previous numbering level
+ if (nDepth > 0)
+ bDisableHideLastLevel = false;
+ }
+ }
+ }
+
+ if (bDisableShowNextLevel)
+ rSet.DisableItem(SID_SHOW_NEXT_LEVEL);
+
+ if (bDisableHideLastLevel)
+ rSet.DisableItem(SID_HIDE_LAST_LEVEL);
+ }
+
+#if defined(_WIN32) || defined UNX
+ if( !mxScannerManager.is() )
+ {
+ rSet.DisableItem( SID_TWAIN_SELECT );
+ rSet.DisableItem( SID_TWAIN_TRANSFER );
+ }
+#endif
+
+ // Set the state of two entries in the 'Slide' context sub-menu
+ // concerning the visibility of master page background and master page
+ // shapes.
+ if (rSet.GetItemState(SID_DISPLAY_MASTER_BACKGROUND) == SfxItemState::DEFAULT
+ || rSet.GetItemState(SID_DISPLAY_MASTER_OBJECTS) == SfxItemState::DEFAULT)
+ {
+ SdPage* pPage = GetActualPage();
+ if (pPage != nullptr && GetDoc() != nullptr)
+ {
+ SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
+ SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin();
+ SdrLayerID aBackgroundId = rLayerAdmin.GetLayerID(sUNO_LayerName_background);
+ SdrLayerID aObjectId = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects);
+ rSet.Put(SfxBoolItem(SID_DISPLAY_MASTER_BACKGROUND,
+ aVisibleLayers.IsSet(aBackgroundId)));
+ rSet.Put(SfxBoolItem(SID_DISPLAY_MASTER_OBJECTS,
+ aVisibleLayers.IsSet(aObjectId)));
+ }
+ }
+
+ if (rSet.GetItemState(SID_SAVE_BACKGROUND) == SfxItemState::DEFAULT)
+ {
+ bool bDisableSaveBackground = true;
+ SdPage* pPage = GetActualPage();
+ if (pPage != nullptr && GetDoc() != nullptr)
+ {
+ SfxItemSetFixed<XATTR_FILL_FIRST, XATTR_FILL_LAST> aMergedAttr(GetDoc()->GetPool());
+ SdStyleSheet* pStyleSheet = pPage->getPresentationStyle(HID_PSEUDOSHEET_BACKGROUND);
+ MergePageBackgroundFilling(pPage, pStyleSheet, meEditMode == EditMode::MasterPage, aMergedAttr);
+ if (drawing::FillStyle_BITMAP == aMergedAttr.Get(XATTR_FILLSTYLE).GetValue())
+ {
+ bDisableSaveBackground = false;
+ }
+ }
+ if (bDisableSaveBackground)
+ rSet.DisableItem(SID_SAVE_BACKGROUND);
+ }
+
+ if (GetObjectShell()->isExportLocked())
+ rSet.DisableItem(SID_PRESENTATION_MINIMIZER);
+
+ if (rSet.GetItemState(SID_INSERT_SIGNATURELINE) == SfxItemState::DEFAULT)
+ {
+ if (!GetObjectShell()->IsSignPDF())
+ {
+ // Currently SID_INSERT_SIGNATURELINE assumes a PDF that was opened for signing, disable
+ // it otherwise.
+ rSet.DisableItem(SID_INSERT_SIGNATURELINE);
+ }
+ }
+
+ GetModeSwitchingMenuState (rSet);
+}
+
+void DrawViewShell::GetModeSwitchingMenuState (SfxItemSet &rSet)
+{
+ //DrawView
+ rSet.Put(SfxBoolItem(SID_SLIDE_SORTER_MODE, false));
+ rSet.Put(SfxBoolItem(SID_OUTLINE_MODE, false));
+ rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false));
+ rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false));
+ if (mePageKind == PageKind::Notes)
+ {
+ rSet.Put(SfxBoolItem(SID_DRAWINGMODE, false));
+ rSet.Put(SfxBoolItem(SID_NOTES_MODE, true));
+ rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false));
+ }
+ else if (mePageKind == PageKind::Handout)
+ {
+ rSet.Put(SfxBoolItem(SID_DRAWINGMODE, false));
+ rSet.Put(SfxBoolItem(SID_NOTES_MODE, false));
+ rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, true));
+ }
+ else
+ {
+ rSet.Put(SfxBoolItem(SID_DRAWINGMODE, true));
+ rSet.Put(SfxBoolItem(SID_NOTES_MODE, false));
+ rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false));
+ }
+
+ // Removed [GetDocSh()->GetCurrentFunction() ||] from the following
+ // clause because the current function of the docshell can only be
+ // search and replace or spell checking and in that case switching the
+ // view mode is allowed.
+ const bool bIsRunning = SlideShow::IsRunning(GetViewShellBase());
+
+ if (GetViewFrame()->GetFrame().IsInPlace() || bIsRunning)
+ {
+ if ( !GetViewFrame()->GetFrame().IsInPlace() )
+ {
+ rSet.ClearItem( SID_DRAWINGMODE );
+ rSet.DisableItem( SID_DRAWINGMODE );
+ }
+
+ rSet.ClearItem( SID_NOTES_MODE );
+ rSet.DisableItem( SID_NOTES_MODE );
+
+ rSet.ClearItem( SID_HANDOUT_MASTER_MODE );
+ rSet.DisableItem( SID_HANDOUT_MASTER_MODE );
+
+ rSet.ClearItem( SID_OUTLINE_MODE );
+ rSet.DisableItem( SID_OUTLINE_MODE );
+
+ rSet.ClearItem( SID_SLIDE_MASTER_MODE );
+ rSet.DisableItem( SID_SLIDE_MASTER_MODE );
+
+ rSet.ClearItem( SID_NOTES_MASTER_MODE );
+ rSet.DisableItem( SID_NOTES_MASTER_MODE );
+
+ rSet.ClearItem( SID_SLIDE_SORTER_MODE );
+ rSet.DisableItem( SID_SLIDE_SORTER_MODE );
+ }
+
+ if (GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED)
+ {
+ // Outplace-Edit: do not allow switch
+ rSet.ClearItem( SID_OUTLINE_MODE );
+ rSet.DisableItem( SID_OUTLINE_MODE );
+
+ rSet.ClearItem( SID_SLIDE_SORTER_MODE );
+ rSet.DisableItem( SID_SLIDE_SORTER_MODE );
+
+ rSet.ClearItem( SID_NOTES_MODE );
+ rSet.DisableItem( SID_NOTES_MODE );
+
+ rSet.ClearItem( SID_HANDOUT_MASTER_MODE );
+ rSet.DisableItem( SID_HANDOUT_MASTER_MODE );
+
+ rSet.ClearItem( SID_SLIDE_MASTER_MODE );
+ rSet.DisableItem( SID_SLIDE_MASTER_MODE );
+
+ rSet.ClearItem( SID_NOTES_MASTER_MODE );
+ rSet.DisableItem( SID_NOTES_MASTER_MODE );
+ }
+
+ svx::ExtrusionBar::getState( mpDrawView.get(), rSet );
+ svx::FontworkBar::getState( mpDrawView.get(), rSet );
+}
+
+void DrawViewShell::GetPageProperties( SfxItemSet &rSet )
+{
+ SdPage *pPage = getCurrentPage();
+
+ if (pPage == nullptr || GetDoc() == nullptr)
+ return;
+
+ SvxPageItem aPageItem(SID_ATTR_PAGE);
+ aPageItem.SetLandscape( pPage->GetOrientation() == Orientation::Landscape );
+
+ rSet.Put(SvxSizeItem( SID_ATTR_PAGE_SIZE, pPage->GetSize() ));
+ rSet.Put(aPageItem);
+
+ const SfxItemSet &rPageAttr = pPage->getSdrPageProperties().GetItemSet();
+ const XFillStyleItem* pFillStyle = rPageAttr.GetItem(XATTR_FILLSTYLE);
+ if (!pFillStyle)
+ return;
+
+ drawing::FillStyle eXFS = pFillStyle->GetValue();
+ XFillStyleItem aFillStyleItem( eXFS );
+ aFillStyleItem.SetWhich( SID_ATTR_PAGE_FILLSTYLE );
+ rSet.Put(aFillStyleItem);
+
+ switch (eXFS)
+ {
+ case drawing::FillStyle_SOLID:
+ if (const XFillColorItem* pColorItem = rPageAttr.GetItem(XATTR_FILLCOLOR))
+ {
+ Color aColor = pColorItem->GetColorValue();
+ XFillColorItem aFillColorItem( OUString(), aColor );
+ aFillColorItem.SetWhich( SID_ATTR_PAGE_COLOR );
+ rSet.Put( aFillColorItem );
+ }
+ break;
+
+ case drawing::FillStyle_GRADIENT:
+ {
+ const XFillGradientItem *pGradient = rPageAttr.GetItem( XATTR_FILLGRADIENT );
+ XFillGradientItem aFillGradientItem( pGradient->GetName(), pGradient->GetGradientValue(), SID_ATTR_PAGE_GRADIENT );
+ rSet.Put( aFillGradientItem );
+ }
+ break;
+
+ case drawing::FillStyle_HATCH:
+ {
+ const XFillHatchItem *pFillHatchItem( rPageAttr.GetItem( XATTR_FILLHATCH ) );
+ XFillHatchItem aFillHatchItem( pFillHatchItem->GetName(), pFillHatchItem->GetHatchValue());
+ aFillHatchItem.SetWhich( SID_ATTR_PAGE_HATCH );
+ rSet.Put( aFillHatchItem );
+ }
+ break;
+
+ case drawing::FillStyle_BITMAP:
+ {
+ const XFillBitmapItem *pFillBitmapItem = rPageAttr.GetItem( XATTR_FILLBITMAP );
+ XFillBitmapItem aFillBitmapItem( pFillBitmapItem->GetName(), pFillBitmapItem->GetGraphicObject() );
+ aFillBitmapItem.SetWhich( SID_ATTR_PAGE_BITMAP );
+ rSet.Put( aFillBitmapItem );
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void DrawViewShell::SetPageProperties (SfxRequest& rReq)
+{
+ SdPage *pPage = getCurrentPage();
+ if (!pPage)
+ return;
+ sal_uInt16 nSlotId = rReq.GetSlot();
+ const SfxItemSet *pArgs = rReq.GetArgs();
+ if (!pArgs)
+ return;
+
+ if ( ( nSlotId >= SID_ATTR_PAGE_COLOR ) && ( nSlotId <= SID_ATTR_PAGE_FILLSTYLE ) )
+ {
+ SdrPageProperties& rPageProperties = pPage->getSdrPageProperties();
+ const SfxItemSet &aPageItemSet = rPageProperties.GetItemSet();
+ SfxItemSet aTempSet = aPageItemSet.CloneAsValue(false, &mpDrawView->GetModel()->GetItemPool());
+ const SfxPoolItem* pItem = nullptr;
+
+ rPageProperties.ClearItem(XATTR_FILLSTYLE);
+ rPageProperties.ClearItem(XATTR_FILLGRADIENT);
+ rPageProperties.ClearItem(XATTR_FILLHATCH);
+ rPageProperties.ClearItem(XATTR_FILLBITMAP);
+
+ switch (nSlotId)
+ {
+ case SID_ATTR_PAGE_FILLSTYLE:
+ {
+ XFillStyleItem aFSItem( pArgs->Get( XATTR_FILLSTYLE ) );
+ drawing::FillStyle eXFS = aFSItem.GetValue();
+
+ if ( eXFS == drawing::FillStyle_NONE )
+ rPageProperties.PutItem( XFillStyleItem( eXFS ) );
+ }
+ break;
+
+ case SID_ATTR_PAGE_COLOR:
+ {
+ if (SfxItemState::SET == pArgs->GetItemState(SID_ATTR_COLOR_STR, false, &pItem))
+ {
+ Color aColor;
+ OUString sColor;
+
+ sColor = static_cast<const SfxStringItem*>(pItem)->GetValue();
+
+ if (sColor == "transparent")
+ aColor = COL_TRANSPARENT;
+ else
+ aColor = Color(ColorTransparency, sColor.toInt32(16));
+
+ XFillColorItem aColorItem(OUString(), aColor);
+ rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_SOLID ) );
+ rPageProperties.PutItem( aColorItem );
+ }
+ else
+ {
+ XFillColorItem aColorItem( pArgs->Get( XATTR_FILLCOLOR ) );
+ rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_SOLID ) );
+ rPageProperties.PutItem( aColorItem );
+ }
+ }
+ break;
+
+ case SID_ATTR_PAGE_GRADIENT:
+ {
+ if (SfxItemState::SET == pArgs->GetItemState(SID_FILL_GRADIENT_JSON, false, &pItem))
+ {
+ const SfxStringItem* pJSON = static_cast<const SfxStringItem*>(pItem);
+ XFillGradientItem aGradientItem( XGradient::fromJSON(pJSON->GetValue()) );
+
+ // MigrateItemSet guarantees unique gradient names
+ SfxItemSetFixed<XATTR_FILLGRADIENT, XATTR_FILLGRADIENT> aMigrateSet( mpDrawView->GetModel()->GetItemPool() );
+ aMigrateSet.Put( aGradientItem );
+ SdrModel::MigrateItemSet( &aMigrateSet, &aTempSet, mpDrawView->GetModel() );
+
+ rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_GRADIENT ) );
+ rPageProperties.PutItemSet( aTempSet );
+ }
+ else
+ {
+ XFillGradientItem aGradientItem( pArgs->Get( XATTR_FILLGRADIENT ) );
+
+ // MigrateItemSet guarantees unique gradient names
+ SfxItemSetFixed<XATTR_FILLGRADIENT, XATTR_FILLGRADIENT> aMigrateSet( mpDrawView->GetModel()->GetItemPool() );
+ aMigrateSet.Put( aGradientItem );
+ SdrModel::MigrateItemSet( &aMigrateSet, &aTempSet, mpDrawView->GetModel() );
+
+ rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_GRADIENT ) );
+ rPageProperties.PutItemSet( aTempSet );
+ }
+ }
+ break;
+
+ case SID_ATTR_PAGE_HATCH:
+ {
+ XFillHatchItem aHatchItem( pArgs->Get( XATTR_FILLHATCH ) );
+ rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_HATCH ) );
+ rPageProperties.PutItem( aHatchItem );
+ }
+ break;
+
+ case SID_ATTR_PAGE_BITMAP:
+ {
+ XFillBitmapItem aBitmapItem( pArgs->Get( XATTR_FILLBITMAP ) );
+ rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_BITMAP ) );
+ rPageProperties.PutItem( aBitmapItem );
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ rReq.Done();
+ }
+ else
+ {
+ PageKind ePageKind = GetPageKind();
+ const SfxPoolItem* pPoolItem = nullptr;
+ Size aNewSize(pPage->GetSize());
+ sal_Int32 nLeft = -1, nRight = -1, nUpper = -1, nLower = -1;
+ bool bScaleAll = true;
+ Orientation eOrientation = pPage->GetOrientation();
+ SdPage* pMasterPage = pPage->IsMasterPage() ? pPage : &static_cast<SdPage&>(pPage->TRG_GetMasterPage());
+ bool bFullSize = pMasterPage->IsBackgroundFullSize();
+ sal_uInt16 nPaperBin = pPage->GetPaperBin();
+
+ switch (nSlotId)
+ {
+ case SID_ATTR_PAGE_LRSPACE:
+ if( pArgs->GetItemState(SID_ATTR_PAGE_LRSPACE,
+ true,&pPoolItem) == SfxItemState::SET )
+ {
+ nLeft = static_cast<const SvxLongLRSpaceItem*>(pPoolItem)->GetLeft();
+ nRight = static_cast<const SvxLongLRSpaceItem*>(pPoolItem)->GetRight();
+ if (nLeft != -1)
+ {
+ nUpper = pPage->GetUpperBorder();
+ nLower = pPage->GetLowerBorder();
+ }
+ SetPageSizeAndBorder(ePageKind, aNewSize, nLeft, nRight, nUpper, nLower, bScaleAll, eOrientation, nPaperBin, bFullSize );
+ }
+ break;
+
+ case SID_ATTR_PAGE_ULSPACE:
+ if( pArgs->GetItemState(SID_ATTR_PAGE_ULSPACE,
+ true,&pPoolItem) == SfxItemState::SET )
+ {
+ nUpper = static_cast<const SvxLongULSpaceItem*>(pPoolItem)->GetUpper();
+ nLower = static_cast<const SvxLongULSpaceItem*>(pPoolItem)->GetLower();
+ if (nUpper != -1)
+ {
+ nLeft = pPage->GetLeftBorder();
+ nRight = pPage->GetRightBorder();
+ }
+ SetPageSizeAndBorder(ePageKind, aNewSize, nLeft, nRight, nUpper, nLower, bScaleAll, eOrientation, nPaperBin, bFullSize );
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void DrawViewShell::GetState (SfxItemSet& rSet)
+{
+ // Iterate over all requested items in the set.
+ SfxWhichIter aIter( rSet );
+ sal_uInt16 nWhich = aIter.FirstWhich();
+ while (nWhich)
+ {
+ switch (nWhich)
+ {
+ case SID_SEARCH_ITEM:
+ case SID_SEARCH_OPTIONS:
+ // Forward this request to the common (old) code of the
+ // document shell.
+ GetDocSh()->GetState (rSet);
+ break;
+ default:
+ SAL_WARN("sd", "DrawViewShell::GetState(): can not handle which id " << nWhich);
+ break;
+ }
+ nWhich = aIter.NextWhich();
+ }
+}
+
+void DrawViewShell::Execute (SfxRequest& rReq)
+{
+ if(SlideShow::IsRunning(GetViewShellBase()))
+ {
+ // Do not execute anything during a native slide show.
+ return;
+ }
+
+ switch (rReq.GetSlot())
+ {
+ case SID_SEARCH_ITEM:
+ // Forward this request to the common (old) code of the
+ // document shell.
+ GetDocSh()->Execute (rReq);
+ break;
+
+ case SID_SPELL_DIALOG:
+ {
+ SfxViewFrame* pViewFrame = GetViewFrame();
+ if (rReq.GetArgs() != nullptr)
+ pViewFrame->SetChildWindow (SID_SPELL_DIALOG,
+ static_cast<const SfxBoolItem&>(rReq.GetArgs()->
+ Get(SID_SPELL_DIALOG)).GetValue());
+ else
+ pViewFrame->ToggleChildWindow(SID_SPELL_DIALOG);
+
+ pViewFrame->GetBindings().Invalidate(SID_SPELL_DIALOG);
+ rReq.Ignore ();
+ }
+ break;
+
+ default:
+ SAL_WARN("sd", "DrawViewShell::Execute(): can not handle slot " << rReq.GetSlot());
+ break;
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviews8.cxx b/sd/source/ui/view/drviews8.cxx
new file mode 100644
index 000000000..e5ae5cd97
--- /dev/null
+++ b/sd/source/ui/view/drviews8.cxx
@@ -0,0 +1,135 @@
+/* -*- 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 <DrawViewShell.hxx>
+
+#include <com/sun/star/scanner/XScannerManager2.hpp>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <svx/svxids.hrc>
+#include <sfx2/bindings.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdpagv.hxx>
+
+#include <Window.hxx>
+#include <drawview.hxx>
+#include <tools/helpers.hxx>
+#include <vcl/svapp.hxx>
+
+namespace sd {
+
+void DrawViewShell::ScannerEvent()
+{
+ if( mxScannerManager.is() )
+ {
+ const css::scanner::ScannerContext aContext( mxScannerManager->getAvailableScanners().getConstArray()[ 0 ] );
+ const css::scanner::ScanError eError = mxScannerManager->getError( aContext );
+
+ if( css::scanner::ScanError_ScanErrorNone == eError )
+ {
+ const css::uno::Reference< css::awt::XBitmap > xBitmap( mxScannerManager->getBitmap( aContext ) );
+
+ if( xBitmap.is() )
+ {
+ const BitmapEx aScanBmp( VCLUnoHelper::GetBitmap( xBitmap ) );
+
+ if( !aScanBmp.IsEmpty() )
+ {
+ const SolarMutexGuard aGuard;
+ SdrPage* pPage = mpDrawView->GetSdrPageView()->GetPage();
+ Size aBmpSize( aScanBmp.GetPrefSize() ), aPageSize( pPage->GetSize() );
+ const MapMode aMap100( MapUnit::Map100thMM );
+
+ if( !aBmpSize.Width() || !aBmpSize.Height() )
+ aBmpSize = aScanBmp.GetSizePixel();
+
+ if( aScanBmp.GetPrefMapMode().GetMapUnit() == MapUnit::MapPixel )
+ aBmpSize = GetActiveWindow()->PixelToLogic( aBmpSize, aMap100 );
+ else
+ aBmpSize = OutputDevice::LogicToLogic( aBmpSize, aScanBmp.GetPrefMapMode(), aMap100 );
+
+ aPageSize.AdjustWidth( -(pPage->GetLeftBorder() + pPage->GetRightBorder()) );
+ aPageSize.AdjustHeight( -(pPage->GetUpperBorder() + pPage->GetLowerBorder()) );
+
+ if( ( ( aBmpSize.Height() > aPageSize.Height() ) || ( aBmpSize.Width() > aPageSize.Width() ) ) && aBmpSize.Height() && aPageSize.Height() )
+ {
+ double fGrfWH = static_cast<double>(aBmpSize.Width()) / aBmpSize.Height();
+ double fWinWH = static_cast<double>(aPageSize.Width()) / aPageSize.Height();
+
+ if( fGrfWH < fWinWH )
+ {
+ aBmpSize.setWidth( FRound( aPageSize.Height() * fGrfWH ) );
+ aBmpSize.setHeight( aPageSize.Height() );
+ }
+ else if( fGrfWH > 0.F )
+ {
+ aBmpSize.setWidth( aPageSize.Width() );
+ aBmpSize.setHeight( FRound( aPageSize.Width() / fGrfWH ) );
+ }
+ }
+
+ Point aPnt ( ( aPageSize.Width() - aBmpSize.Width() ) >> 1, ( aPageSize.Height() - aBmpSize.Height() ) >> 1 );
+ aPnt += Point( pPage->GetLeftBorder(), pPage->GetUpperBorder() );
+ ::tools::Rectangle aRect( aPnt, aBmpSize );
+ bool bInsertNewObject = true;
+
+ if( GetView()->AreObjectsMarked() )
+ {
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+
+ if( rMarkList.GetMarkCount() == 1 )
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+
+ if( auto pGrafObj = dynamic_cast< SdrGrafObj *>( pObj ) )
+ {
+ if( pGrafObj->IsEmptyPresObj() )
+ {
+ bInsertNewObject = false;
+ pGrafObj->SetEmptyPresObj(false);
+ pGrafObj->SetOutlinerParaObject(std::nullopt);
+ pGrafObj->SetGraphic( Graphic( aScanBmp ) );
+ }
+ }
+ }
+ }
+
+ if( bInsertNewObject )
+ {
+ auto pGrafObj = new SdrGrafObj(
+ GetView()->getSdrModelFromSdrView(),
+ Graphic(aScanBmp),
+ aRect);
+ SdrPageView* pPV = GetView()->GetSdrPageView();
+ GetView()->InsertObjectAtView( pGrafObj, *pPV, SdrInsertFlags::SETDEFLAYER );
+ }
+ }
+ }
+ }
+ }
+
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_TWAIN_SELECT );
+ rBindings.Invalidate( SID_TWAIN_TRANSFER );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviews9.cxx b/sd/source/ui/view/drviews9.cxx
new file mode 100644
index 000000000..f80419587
--- /dev/null
+++ b/sd/source/ui/view/drviews9.cxx
@@ -0,0 +1,886 @@
+/* -*- 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 <config_features.h>
+
+#include <DrawViewShell.hxx>
+#include <svx/xgrad.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xlineit0.hxx>
+#include <svx/xlnwtit.hxx>
+#include <svx/xlndsit.hxx>
+#include <svx/xflhtit.hxx>
+#include <svx/xflgrit.hxx>
+#include <svx/xlnclit.hxx>
+#include <svx/xflclit.hxx>
+#include <sfx2/bindings.hxx>
+
+#include <sfx2/dispatch.hxx>
+#include <svl/intitem.hxx>
+#include <sfx2/request.hxx>
+#include <svl/stritem.hxx>
+#include <svx/svxids.hrc>
+#include <svx/xtable.hxx>
+#include <vcl/graph.hxx>
+#include <svx/svdograf.hxx>
+#include <svl/whiter.hxx>
+#include <basic/sbstar.hxx>
+#include <basic/sberrors.hxx>
+
+#include <sfx2/viewfrm.hxx>
+
+#include <app.hrc>
+#include <strings.hrc>
+#include <Window.hxx>
+#include <drawdoc.hxx>
+#include <drawview.hxx>
+#include <DrawDocShell.hxx>
+#include <sdresid.hxx>
+
+#include <svx/galleryitem.hxx>
+#include <com/sun/star/gallery/GalleryItemType.hpp>
+#include <com/sun/star/drawing/LineStyle.hpp>
+#include <memory>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+void DrawViewShell::ExecGallery(SfxRequest const & rReq)
+{
+ // nothing is executed during a slide show!
+ if(HasCurrentFunction(SID_PRESENTATION))
+ return;
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ const SvxGalleryItem* pGalleryItem = SfxItemSet::GetItem<SvxGalleryItem>(pArgs, SID_GALLERY_FORMATS, false);
+ if ( !pGalleryItem )
+ return;
+
+ GetDocSh()->SetWaitCursor( true );
+
+ sal_Int8 nType( pGalleryItem->GetType() );
+ // insert graphic
+ if (nType == css::gallery::GalleryItemType::GRAPHIC)
+ {
+ Graphic aGraphic( pGalleryItem->GetGraphic() );
+
+ // reduce size if necessary
+ ScopedVclPtrInstance< Window > aWindow(GetActiveWindow());
+ aWindow->SetMapMode(aGraphic.GetPrefMapMode());
+ Size aSizePix = aWindow->LogicToPixel(aGraphic.GetPrefSize());
+ aWindow->SetMapMode( MapMode(MapUnit::Map100thMM) );
+ Size aSize = aWindow->PixelToLogic(aSizePix);
+
+ // constrain size to page size if necessary
+ SdrPage* pPage = mpDrawView->GetSdrPageView()->GetPage();
+ Size aPageSize = pPage->GetSize();
+ aPageSize.AdjustWidth( -(pPage->GetLeftBorder() + pPage->GetRightBorder()) );
+ aPageSize.AdjustHeight( -(pPage->GetUpperBorder() + pPage->GetLowerBorder()) );
+
+ // If the image is too large we make it fit into the page
+ if ( ( ( aSize.Height() > aPageSize.Height() ) || ( aSize.Width() > aPageSize.Width() ) ) &&
+ aSize.Height() && aPageSize.Height() )
+ {
+ float fGrfWH = static_cast<float>(aSize.Width()) /
+ static_cast<float>(aSize.Height());
+ float fWinWH = static_cast<float>(aPageSize.Width()) /
+ static_cast<float>(aPageSize.Height());
+
+ // constrain size to page size if necessary
+ if ((fGrfWH != 0.F) && (fGrfWH < fWinWH))
+ {
+ aSize.setWidth( static_cast<::tools::Long>(aPageSize.Height() * fGrfWH) );
+ aSize.setHeight( aPageSize.Height() );
+ }
+ else
+ {
+ aSize.setWidth( aPageSize.Width() );
+ aSize.setHeight( static_cast<::tools::Long>(aPageSize.Width() / fGrfWH) );
+ }
+ }
+
+ // set output rectangle for graphic
+ Point aPnt ((aPageSize.Width() - aSize.Width()) / 2,
+ (aPageSize.Height() - aSize.Height()) / 2);
+ aPnt += Point(pPage->GetLeftBorder(), pPage->GetUpperBorder());
+ ::tools::Rectangle aRect (aPnt, aSize);
+
+ SdrGrafObj* pGrafObj = nullptr;
+
+ bool bInsertNewObject = true;
+
+ if ( mpDrawView->AreObjectsMarked() )
+ {
+ // is there an empty graphic object?
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+
+ if (pObj->GetObjInventor() == SdrInventor::Default && pObj->GetObjIdentifier() == SdrObjKind::Graphic)
+ {
+ pGrafObj = static_cast<SdrGrafObj*>(pObj);
+
+ if( pGrafObj->IsEmptyPresObj() )
+ {
+ // the empty graphic object gets a new graphic
+ bInsertNewObject = false;
+
+ SdrGrafObj* pNewGrafObj(pGrafObj->CloneSdrObject(pGrafObj->getSdrModelFromSdrObject()));
+ pNewGrafObj->SetEmptyPresObj(false);
+ pNewGrafObj->SetOutlinerParaObject(std::nullopt);
+ pNewGrafObj->SetGraphic(aGraphic);
+
+ OUString aStr = mpDrawView->GetDescriptionOfMarkedObjects() +
+ " " + SdResId(STR_UNDO_REPLACE);
+ mpDrawView->BegUndo(aStr);
+ SdrPageView* pPV = mpDrawView->GetSdrPageView();
+ mpDrawView->ReplaceObjectAtView(pGrafObj, *pPV, pNewGrafObj);
+ mpDrawView->EndUndo();
+ }
+ }
+ }
+ }
+
+ if( bInsertNewObject )
+ {
+ pGrafObj = new SdrGrafObj(
+ GetView()->getSdrModelFromSdrView(),
+ aGraphic,
+ aRect);
+ SdrPageView* pPV = mpDrawView->GetSdrPageView();
+ mpDrawView->InsertObjectAtView(pGrafObj, *pPV, SdrInsertFlags::SETDEFLAYER);
+ }
+ }
+ // insert sound
+ else if( nType == css::gallery::GalleryItemType::MEDIA )
+ {
+ const SfxStringItem aMediaURLItem( SID_INSERT_AVMEDIA, pGalleryItem->GetURL() );
+ GetViewFrame()->GetDispatcher()->ExecuteList(SID_INSERT_AVMEDIA,
+ SfxCallMode::SYNCHRON, { &aMediaURLItem });
+ }
+
+ GetDocSh()->SetWaitCursor( false );
+}
+
+/**
+ * Edit macros for attribute configuration
+ */
+
+/* the work flow to adjust the attributes is nearly everywhere the same
+ 1. read existing attributes
+ 2. read parameter from the basic-set
+ 3. delete selected item from the attribute-set
+ 4. create new attribute-item
+ 5. insert item into set */
+void DrawViewShell::AttrExec (SfxRequest &rReq)
+{
+ // nothing is executed during a slide show!
+ if(HasCurrentFunction(SID_PRESENTATION))
+ return;
+
+ CheckLineTo (rReq);
+
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ SfxItemSet aAttr( GetDoc()->GetPool() );
+
+ GetView()->GetAttributes( aAttr );
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ switch (rReq.GetSlot ())
+ {
+ // set new fill-style
+ case SID_SETFILLSTYLE :
+ if (pArgs && pArgs->Count () == 1)
+ {
+ const SfxUInt32Item* pFillStyle = rReq.GetArg<SfxUInt32Item>(ID_VAL_STYLE);
+ if (CHECK_RANGE (drawing::FillStyle_NONE, static_cast<drawing::FillStyle>(pFillStyle->GetValue ()), drawing::FillStyle_BITMAP))
+ {
+ aAttr.ClearItem (XATTR_FILLSTYLE);
+ XFillStyleItem aStyleItem(static_cast<drawing::FillStyle>(pFillStyle->GetValue ()));
+ aStyleItem.SetWhich(XATTR_FILLSTYLE);
+ aAttr.Put (aStyleItem);
+ rBindings.Invalidate (SID_ATTR_FILL_STYLE);
+ rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE);
+ }
+#if HAVE_FEATURE_SCRIPTING
+ else StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE);
+#endif
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ break;
+
+ // determine new line style
+ case SID_SETLINESTYLE :
+ if (pArgs && pArgs->Count () == 1)
+ {
+ const SfxUInt32Item* pLineStyle = rReq.GetArg<SfxUInt32Item>(ID_VAL_STYLE);
+ if (CHECK_RANGE (sal_Int32(drawing::LineStyle_NONE), static_cast<sal_Int32>(pLineStyle->GetValue()), sal_Int32(drawing::LineStyle_DASH)))
+ {
+ aAttr.ClearItem (XATTR_LINESTYLE);
+ XLineStyleItem aStyleItem(static_cast<drawing::LineStyle>(pLineStyle->GetValue()));
+ aStyleItem.SetWhich(XATTR_LINESTYLE);
+ aAttr.Put(aStyleItem);
+ rBindings.Invalidate (SID_ATTR_LINE_STYLE);
+ }
+#if HAVE_FEATURE_SCRIPTING
+ else StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE);
+#endif
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ break;
+
+ // set line width
+ case SID_SETLINEWIDTH :
+ if (pArgs && pArgs->Count () == 1)
+ {
+ const SfxUInt32Item* pLineWidth = rReq.GetArg<SfxUInt32Item>(ID_VAL_WIDTH);
+ aAttr.ClearItem (XATTR_LINEWIDTH);
+ XLineWidthItem aWidthItem(pLineWidth->GetValue());
+ aWidthItem.SetWhich(XATTR_LINEWIDTH);
+ aAttr.Put(aWidthItem);
+ rBindings.Invalidate (SID_ATTR_LINE_WIDTH);
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ break;
+
+ case SID_SETFILLCOLOR :
+ if (pArgs && pArgs->Count () == 3)
+ {
+ const SfxUInt32Item* pRed = rReq.GetArg<SfxUInt32Item>(ID_VAL_RED);
+ const SfxUInt32Item* pGreen = rReq.GetArg<SfxUInt32Item>(ID_VAL_GREEN);
+ const SfxUInt32Item* pBlue = rReq.GetArg<SfxUInt32Item>(ID_VAL_BLUE);
+
+ aAttr.ClearItem (XATTR_FILLCOLOR);
+ aAttr.ClearItem (XATTR_FILLSTYLE);
+ XFillColorItem aColorItem(-1, Color (static_cast<sal_uInt8>(pRed->GetValue ()),
+ static_cast<sal_uInt8>(pGreen->GetValue ()),
+ static_cast<sal_uInt8>(pBlue->GetValue ())));
+ aColorItem.SetWhich(XATTR_FILLCOLOR);
+ aAttr.Put(aColorItem);
+ rBindings.Invalidate (SID_ATTR_FILL_COLOR);
+ rBindings.Invalidate (SID_ATTR_PAGE_COLOR);
+ rBindings.Invalidate (SID_ATTR_FILL_STYLE);
+ rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE);
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ break;
+
+ case SID_SETLINECOLOR :
+ if (pArgs && pArgs->Count () == 3)
+ {
+ const SfxUInt32Item* pRed = rReq.GetArg<SfxUInt32Item>(ID_VAL_RED);
+ const SfxUInt32Item* pGreen = rReq.GetArg<SfxUInt32Item>(ID_VAL_GREEN);
+ const SfxUInt32Item* pBlue = rReq.GetArg<SfxUInt32Item>(ID_VAL_BLUE);
+
+ aAttr.ClearItem (XATTR_LINECOLOR);
+ XLineColorItem aColorItem(-1, Color(static_cast<sal_uInt8>(pRed->GetValue()),
+ static_cast<sal_uInt8>(pGreen->GetValue()),
+ static_cast<sal_uInt8>(pBlue->GetValue())));
+ aColorItem.SetWhich(XATTR_LINECOLOR);
+ aAttr.Put(aColorItem);
+ rBindings.Invalidate (SID_ATTR_LINE_COLOR);
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ break;
+
+ case SID_SETGRADSTARTCOLOR :
+ case SID_SETGRADENDCOLOR :
+ if (pArgs && pArgs->Count () == 4)
+ {
+ const SfxStringItem* pName = rReq.GetArg<SfxStringItem>(ID_VAL_INDEX);
+ const SfxUInt32Item* pRed = rReq.GetArg<SfxUInt32Item>(ID_VAL_RED);
+ const SfxUInt32Item* pGreen = rReq.GetArg<SfxUInt32Item>(ID_VAL_GREEN);
+ const SfxUInt32Item* pBlue = rReq.GetArg<SfxUInt32Item>(ID_VAL_BLUE);
+
+ XGradientListRef pGradientList = GetDoc()->GetGradientList ();
+ ::tools::Long nCounts = pGradientList->Count ();
+ Color aColor (static_cast<sal_uInt8>(pRed->GetValue ()),
+ static_cast<sal_uInt8>(pGreen->GetValue ()),
+ static_cast<sal_uInt8>(pBlue->GetValue ()));
+ ::tools::Long i;
+
+ aAttr.ClearItem (XATTR_FILLGRADIENT);
+ aAttr.ClearItem (XATTR_FILLSTYLE);
+
+ for ( i = 0; i < nCounts; i ++)
+ {
+ const XGradientEntry* pEntry = pGradientList->GetGradient(i);
+
+ if (pEntry->GetName () == pName->GetValue ())
+ {
+ XGradient aGradient(pEntry->GetGradient());
+
+ if (rReq.GetSlot () == SID_SETGRADSTARTCOLOR) aGradient.SetStartColor (aColor);
+ else aGradient.SetEndColor (aColor);
+
+ XFillStyleItem aStyleItem(drawing::FillStyle_GRADIENT);
+ aStyleItem.SetWhich(XATTR_FILLSTYLE);
+ aAttr.Put(aStyleItem);
+ XFillGradientItem aGradientItem(pName->GetValue (), aGradient);
+ aGradientItem.SetWhich(XATTR_FILLGRADIENT);
+ aAttr.Put(aGradientItem);
+ break;
+ }
+ }
+
+ if (i >= nCounts)
+ {
+ Color aBlack (0, 0, 0);
+ XGradient aGradient ((rReq.GetSlot () == SID_SETGRADSTARTCOLOR)
+ ? aColor
+ : aBlack,
+ (rReq.GetSlot () == SID_SETGRADENDCOLOR)
+ ? aColor
+ : aBlack);
+
+ GetDoc()->GetGradientList()->Insert(std::make_unique<XGradientEntry>(aGradient, pName->GetValue()));
+
+ XFillStyleItem aStyleItem(drawing::FillStyle_GRADIENT);
+ aStyleItem.SetWhich(XATTR_FILLSTYLE);
+ aAttr.Put(aStyleItem);
+ XFillGradientItem aGradientItem(pName->GetValue(), aGradient);
+ aGradientItem.SetWhich(XATTR_FILLGRADIENT);
+ aAttr.Put(aGradientItem);
+ }
+
+ rBindings.Invalidate (SID_ATTR_FILL_STYLE);
+ rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE);
+ rBindings.Invalidate (SID_ATTR_FILL_GRADIENT);
+ rBindings.Invalidate (SID_ATTR_PAGE_GRADIENT);
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ break;
+
+ case SID_SETHATCHCOLOR :
+ if (pArgs && pArgs->Count () == 4)
+ {
+ const SfxStringItem* pName = rReq.GetArg<SfxStringItem>(ID_VAL_INDEX);
+ const SfxUInt32Item* pRed = rReq.GetArg<SfxUInt32Item>(ID_VAL_RED);
+ const SfxUInt32Item* pGreen = rReq.GetArg<SfxUInt32Item>(ID_VAL_GREEN);
+ const SfxUInt32Item* pBlue = rReq.GetArg<SfxUInt32Item>(ID_VAL_BLUE);
+
+ XHatchListRef pHatchList = GetDoc()->GetHatchList ();
+ ::tools::Long nCounts = pHatchList->Count ();
+ Color aColor (static_cast<sal_uInt8>(pRed->GetValue ()),
+ static_cast<sal_uInt8>(pGreen->GetValue ()),
+ static_cast<sal_uInt8>(pBlue->GetValue ()));
+ ::tools::Long i;
+
+ aAttr.ClearItem (XATTR_FILLHATCH);
+ aAttr.ClearItem (XATTR_FILLSTYLE);
+
+ for ( i = 0; i < nCounts; i ++)
+ {
+ const XHatchEntry* pEntry = pHatchList->GetHatch(i);
+
+ if (pEntry->GetName () == pName->GetValue ())
+ {
+ XHatch aHatch(pEntry->GetHatch());
+
+ aHatch.SetColor (aColor);
+
+ XFillStyleItem aStyleItem(drawing::FillStyle_HATCH);
+ aStyleItem.SetWhich(XATTR_FILLSTYLE);
+ aAttr.Put(aStyleItem);
+ XFillHatchItem aHatchItem(pName->GetValue(), aHatch);
+ aHatchItem.SetWhich(XATTR_FILLHATCH);
+ aAttr.Put(aHatchItem);
+ break;
+ }
+ }
+
+ if (i >= nCounts)
+ {
+ XHatch aHatch (aColor);
+
+ GetDoc()->GetHatchList()->Insert(std::make_unique<XHatchEntry>(aHatch, pName->GetValue()));
+
+ XFillStyleItem aStyleItem(drawing::FillStyle_HATCH);
+ aStyleItem.SetWhich(XATTR_FILLSTYLE);
+ aAttr.Put(aStyleItem);
+ XFillHatchItem aHatchItem(pName->GetValue (), aHatch);
+ aHatchItem.SetWhich(XATTR_FILLHATCH);
+ aAttr.Put(aHatchItem);
+ }
+
+ rBindings.Invalidate (SID_ATTR_FILL_HATCH);
+ rBindings.Invalidate (SID_ATTR_PAGE_HATCH);
+ rBindings.Invalidate (SID_ATTR_FILL_STYLE);
+ rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE);
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ break;
+
+ // configuration for line-dash
+ case SID_DASH :
+ if (pArgs && pArgs->Count () == 7)
+ {
+ const SfxStringItem* pName = rReq.GetArg<SfxStringItem>(ID_VAL_INDEX);
+ const SfxUInt32Item* pStyle = rReq.GetArg<SfxUInt32Item>(ID_VAL_STYLE);
+ const SfxUInt32Item* pDots = rReq.GetArg<SfxUInt32Item>(ID_VAL_DOTS);
+ const SfxUInt32Item* pDotLen = rReq.GetArg<SfxUInt32Item>(ID_VAL_DOTLEN);
+ const SfxUInt32Item* pDashes = rReq.GetArg<SfxUInt32Item>(ID_VAL_DASHES);
+ const SfxUInt32Item* pDashLen = rReq.GetArg<SfxUInt32Item>(ID_VAL_DASHLEN);
+ const SfxUInt32Item* pDistance = rReq.GetArg<SfxUInt32Item>(ID_VAL_DISTANCE);
+
+ if (CHECK_RANGE (sal_Int32(css::drawing::DashStyle_RECT), static_cast<sal_Int32>(pStyle->GetValue()), sal_Int32(css::drawing::DashStyle_ROUNDRELATIVE)))
+ {
+ XDash aNewDash (static_cast<css::drawing::DashStyle>(pStyle->GetValue ()), static_cast<short>(pDots->GetValue ()), pDotLen->GetValue (),
+ static_cast<short>(pDashes->GetValue ()), pDashLen->GetValue (), pDistance->GetValue ());
+
+ aAttr.ClearItem (XATTR_LINEDASH);
+ aAttr.ClearItem (XATTR_LINESTYLE);
+
+ XDashListRef pDashList = GetDoc()->GetDashList();
+ ::tools::Long nCounts = pDashList->Count ();
+ std::unique_ptr<XDashEntry> pEntry = std::make_unique<XDashEntry>(aNewDash, pName->GetValue());
+ ::tools::Long i;
+
+ for ( i = 0; i < nCounts; i++ )
+ if (pDashList->GetDash (i)->GetName () == pName->GetValue ())
+ break;
+
+ if (i < nCounts)
+ pDashList->Replace(std::move(pEntry), i);
+ else
+ pDashList->Insert(std::move(pEntry));
+
+ XLineDashItem aDashItem(pName->GetValue(), aNewDash);
+ aDashItem.SetWhich(XATTR_LINEDASH);
+ aAttr.Put(aDashItem);
+ XLineStyleItem aStyleItem(drawing::LineStyle_DASH);
+ aStyleItem.SetWhich(XATTR_LINESTYLE);
+ aAttr.Put(aStyleItem);
+ rBindings.Invalidate (SID_ATTR_LINE_DASH);
+ rBindings.Invalidate (SID_ATTR_FILL_STYLE);
+ }
+#if HAVE_FEATURE_SCRIPTING
+ else StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE);
+#endif
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ break;
+
+ // configuration for gradients
+ case SID_GRADIENT :
+ if (pArgs && pArgs->Count () == 8)
+ {
+ const SfxStringItem* pName = rReq.GetArg<SfxStringItem>(ID_VAL_INDEX);
+ const SfxUInt32Item* pStyle = rReq.GetArg<SfxUInt32Item>(ID_VAL_STYLE);
+ const SfxUInt32Item* pAngle = rReq.GetArg<SfxUInt32Item>(ID_VAL_ANGLE);
+ const SfxUInt32Item* pBorder = rReq.GetArg<SfxUInt32Item>(ID_VAL_BORDER);
+ const SfxUInt32Item* pCenterX = rReq.GetArg<SfxUInt32Item>(ID_VAL_CENTER_X);
+ const SfxUInt32Item* pCenterY = rReq.GetArg<SfxUInt32Item>(ID_VAL_CENTER_Y);
+ const SfxUInt32Item* pStart = rReq.GetArg<SfxUInt32Item>(ID_VAL_STARTINTENS);
+ const SfxUInt32Item* pEnd = rReq.GetArg<SfxUInt32Item>(ID_VAL_ENDINTENS);
+
+ if (CHECK_RANGE (sal_Int32(css::awt::GradientStyle_LINEAR), static_cast<sal_Int32>(pStyle->GetValue()), sal_Int32(css::awt::GradientStyle_RECT)) &&
+ CHECK_RANGE (0, static_cast<sal_Int32>(pAngle->GetValue ()), 360) &&
+ CHECK_RANGE (0, static_cast<sal_Int32>(pBorder->GetValue ()), 100) &&
+ CHECK_RANGE (0, static_cast<sal_Int32>(pCenterX->GetValue ()), 100) &&
+ CHECK_RANGE (0, static_cast<sal_Int32>(pCenterY->GetValue ()), 100) &&
+ CHECK_RANGE (0, static_cast<sal_Int32>(pStart->GetValue ()), 100) &&
+ CHECK_RANGE (0, static_cast<sal_Int32>(pEnd->GetValue ()), 100))
+ {
+ aAttr.ClearItem (XATTR_FILLGRADIENT);
+ aAttr.ClearItem (XATTR_FILLSTYLE);
+
+ XGradientListRef pGradientList = GetDoc()->GetGradientList ();
+ ::tools::Long nCounts = pGradientList->Count ();
+ ::tools::Long i;
+
+ for ( i = 0; i < nCounts; i++ )
+ {
+ const XGradientEntry* pEntry = pGradientList->GetGradient(i);
+
+ if (pEntry->GetName () == pName->GetValue ())
+ {
+ XGradient aGradient(pEntry->GetGradient());
+
+ aGradient.SetGradientStyle (static_cast<css::awt::GradientStyle>(pStyle->GetValue ()));
+ aGradient.SetAngle (Degree10(pAngle->GetValue () * 10));
+ aGradient.SetBorder (static_cast<short>(pBorder->GetValue ()));
+ aGradient.SetXOffset (static_cast<short>(pCenterX->GetValue ()));
+ aGradient.SetYOffset (static_cast<short>(pCenterY->GetValue ()));
+ aGradient.SetStartIntens (static_cast<short>(pStart->GetValue ()));
+ aGradient.SetEndIntens (static_cast<short>(pEnd->GetValue ()));
+
+ XFillStyleItem aStyleItem(drawing::FillStyle_GRADIENT);
+ aStyleItem.SetWhich(XATTR_FILLSTYLE);
+ aAttr.Put(aStyleItem);
+ XFillGradientItem aGradientItem(pName->GetValue (), aGradient);
+ aGradientItem.SetWhich(XATTR_FILLGRADIENT);
+ aAttr.Put(aGradientItem);
+ break;
+ }
+ }
+
+ if (i >= nCounts)
+ {
+ Color aBlack (0, 0, 0);
+ XGradient aGradient (aBlack, aBlack, static_cast<css::awt::GradientStyle>(pStyle->GetValue ()),
+ Degree10(pAngle->GetValue () * 10), static_cast<short>(pCenterX->GetValue ()),
+ static_cast<short>(pCenterY->GetValue ()), static_cast<short>(pBorder->GetValue ()),
+ static_cast<short>(pStart->GetValue ()), static_cast<short>(pEnd->GetValue ()));
+
+ pGradientList->Insert(std::make_unique<XGradientEntry>(aGradient, pName->GetValue()));
+ XFillStyleItem aStyleItem(drawing::FillStyle_GRADIENT);
+ aStyleItem.SetWhich(XATTR_FILLSTYLE);
+ aAttr.Put(aStyleItem);
+ XFillGradientItem aGradientItem(pName->GetValue (), aGradient);
+ aGradientItem.SetWhich(XATTR_FILLGRADIENT);
+ aAttr.Put(aGradientItem);
+ }
+
+ rBindings.Invalidate (SID_ATTR_FILL_GRADIENT);
+ rBindings.Invalidate (SID_ATTR_PAGE_GRADIENT);
+ rBindings.Invalidate (SID_ATTR_FILL_STYLE);
+ rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE);
+ }
+#if HAVE_FEATURE_SCRIPTING
+ else StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE);
+#endif
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ break;
+
+ // configuration for hatch
+ case SID_HATCH :
+ if (pArgs && pArgs->Count () == 4)
+ {
+ const SfxStringItem* pName = rReq.GetArg<SfxStringItem>(ID_VAL_INDEX);
+ const SfxUInt32Item* pStyle = rReq.GetArg<SfxUInt32Item>(ID_VAL_STYLE);
+ const SfxUInt32Item* pDistance = rReq.GetArg<SfxUInt32Item>(ID_VAL_DISTANCE);
+ const SfxUInt32Item* pAngle = rReq.GetArg<SfxUInt32Item>(ID_VAL_ANGLE);
+
+ if (CHECK_RANGE (sal_Int32(css::drawing::HatchStyle_SINGLE), static_cast<sal_Int32>(pStyle->GetValue()), sal_Int32(css::drawing::HatchStyle_TRIPLE)) &&
+ CHECK_RANGE (0, static_cast<sal_Int32>(pAngle->GetValue ()), 360))
+ {
+ aAttr.ClearItem (XATTR_FILLHATCH);
+ aAttr.ClearItem (XATTR_FILLSTYLE);
+
+ XHatchListRef pHatchList = GetDoc()->GetHatchList ();
+ ::tools::Long nCounts = pHatchList->Count ();
+ ::tools::Long i;
+
+ for ( i = 0; i < nCounts; i++ )
+ {
+ const XHatchEntry* pEntry = pHatchList->GetHatch(i);
+
+ if (pEntry->GetName () == pName->GetValue ())
+ {
+ XHatch aHatch(pEntry->GetHatch());
+
+ aHatch.SetHatchStyle (static_cast<css::drawing::HatchStyle>(pStyle->GetValue ()));
+ aHatch.SetDistance (pDistance->GetValue ());
+ aHatch.SetAngle (Degree10(pAngle->GetValue () * 10));
+
+ XFillStyleItem aStyleItem(drawing::FillStyle_HATCH);
+ aStyleItem.SetWhich(XATTR_FILLSTYLE);
+ aAttr.Put(aStyleItem);
+ XFillHatchItem aHatchItem(pName->GetValue (), aHatch);
+ aHatchItem.SetWhich(XATTR_FILLHATCH);
+ aAttr.Put(aHatchItem);
+ break;
+ }
+ }
+
+ if (i >= nCounts)
+ {
+ XHatch aHatch (Color(0), static_cast<css::drawing::HatchStyle>(pStyle->GetValue ()), pDistance->GetValue (),
+ Degree10(pAngle->GetValue () * 10));
+
+ pHatchList->Insert(std::make_unique<XHatchEntry>(aHatch, pName->GetValue()));
+ XFillStyleItem aStyleItem(drawing::FillStyle_HATCH);
+ aStyleItem.SetWhich(XATTR_FILLSTYLE);
+ aAttr.Put(aStyleItem);
+ XFillHatchItem aHatchItem(pName->GetValue (), aHatch);
+ aHatchItem.SetWhich(XATTR_FILLHATCH);
+ aAttr.Put(aHatchItem);
+ }
+
+ rBindings.Invalidate (SID_ATTR_FILL_HATCH);
+ rBindings.Invalidate (SID_ATTR_FILL_STYLE);
+ }
+#if HAVE_FEATURE_SCRIPTING
+ else StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE);
+#endif
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ break;
+
+ case SID_SELECTGRADIENT :
+ if (pArgs && (pArgs->Count () == 1))
+ {
+ const SfxStringItem* pName = rReq.GetArg<SfxStringItem>(ID_VAL_INDEX);
+
+ XGradientListRef pGradientList = GetDoc()->GetGradientList ();
+ ::tools::Long nCounts = pGradientList->Count ();
+
+ for (::tools::Long i = 0; i < nCounts; i ++)
+ {
+ const XGradientEntry* pEntry = pGradientList->GetGradient(i);
+
+ if (pEntry->GetName () == pName->GetValue ())
+ {
+ aAttr.ClearItem (XATTR_FILLGRADIENT);
+ aAttr.ClearItem (XATTR_FILLSTYLE);
+ XFillStyleItem aStyleItem(drawing::FillStyle_GRADIENT);
+ aStyleItem.SetWhich(XATTR_FILLSTYLE);
+ aAttr.Put(aStyleItem);
+ XFillGradientItem aGradientItem(pName->GetValue (), pEntry->GetGradient ());
+ aGradientItem.SetWhich(XATTR_FILLGRADIENT);
+ aAttr.Put(aGradientItem);
+ rBindings.Invalidate (SID_ATTR_FILL_GRADIENT);
+ rBindings.Invalidate (SID_ATTR_PAGE_GRADIENT);
+ rBindings.Invalidate (SID_ATTR_FILL_STYLE);
+ rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE);
+ break;
+ }
+ }
+
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ break;
+
+ case SID_SELECTHATCH :
+ if (pArgs && pArgs->Count () == 1)
+ {
+ const SfxStringItem* pName = rReq.GetArg<SfxStringItem>(ID_VAL_INDEX);
+
+ XHatchListRef pHatchList = GetDoc()->GetHatchList ();
+ ::tools::Long nCounts = pHatchList->Count ();
+
+ for (::tools::Long i = 0; i < nCounts; i ++)
+ {
+ const XHatchEntry* pEntry = pHatchList->GetHatch(i);
+
+ if (pEntry->GetName () == pName->GetValue ())
+ {
+ aAttr.ClearItem (XATTR_FILLHATCH);
+ aAttr.ClearItem (XATTR_FILLSTYLE);
+ XFillStyleItem aStyleItem(drawing::FillStyle_HATCH);
+ aStyleItem.SetWhich(XATTR_FILLSTYLE);
+ aAttr.Put(aStyleItem);
+ XFillHatchItem aHatchItem(pName->GetValue (), pEntry->GetHatch ());
+ aHatchItem.SetWhich(XATTR_FILLHATCH);
+ aAttr.Put(aHatchItem);
+
+ rBindings.Invalidate (SID_ATTR_FILL_HATCH);
+ rBindings.Invalidate (SID_ATTR_PAGE_HATCH);
+ rBindings.Invalidate (SID_ATTR_FILL_STYLE);
+ rBindings.Invalidate (SID_ATTR_PAGE_FILLSTYLE);
+ break;
+ }
+ }
+
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ break;
+
+ case SID_UNSELECT :
+ mpDrawView->UnmarkAll ();
+ break;
+
+ case SID_GETRED :
+ if (pArgs && pArgs->Count () == 1)
+ {
+ break;
+ }
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ break;
+
+/* case SID_SETFONTFAMILYNAME :
+ case SID_SETFONTSTYLENAME :
+ case SID_SETFONTFAMILY :
+ case SID_SETFONTPITCH :
+ case SID_SETFONTCHARSET :
+ case SID_SETFONTPOSTURE :
+ case SID_SETFONTWEIGHT :
+ case SID_SETFONTUNDERLINE :
+ case SID_SETFONTCROSSEDOUT :
+ case SID_SETFONTSHADOWED :
+ case SID_SETFONTCONTOUR :
+ case SID_SETFONTCOLOR :
+ case SID_SETFONTLANGUAGE :
+ case SID_SETFONTWORDLINE :
+ case SID_SETFONTCASEMAP :
+ case SID_SETFONTESCAPE :
+ case SID_SETFONTKERNING :
+ break;*/
+
+ default :
+ ;
+ }
+
+ mpDrawView->SetAttributes (const_cast<const SfxItemSet &>(aAttr));
+ rReq.Ignore ();
+}
+
+/**
+ * Edit macros for attribute configuration
+ */
+void DrawViewShell::AttrState (SfxItemSet& rSet)
+{
+ SfxWhichIter aIter (rSet);
+ sal_uInt16 nWhich = aIter.FirstWhich ();
+ SfxItemSet aAttr( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aAttr );
+
+ while (nWhich)
+ {
+ switch (nWhich)
+ {
+ case SID_GETFILLSTYLE :
+ {
+ const XFillStyleItem &rFillStyleItem = aAttr.Get (XATTR_FILLSTYLE);
+
+ rSet.Put (SfxUInt32Item (nWhich, static_cast<::tools::Long>(rFillStyleItem.GetValue ())));
+ break;
+ }
+
+ case SID_GETLINESTYLE :
+ {
+ const XLineStyleItem &rLineStyleItem = aAttr.Get (XATTR_LINESTYLE);
+
+ rSet.Put (SfxUInt32Item (nWhich, static_cast<::tools::Long>(rLineStyleItem.GetValue ())));
+ break;
+ }
+
+ case SID_GETLINEWIDTH :
+ {
+ const XLineWidthItem &rLineWidthItem = aAttr.Get (XATTR_LINEWIDTH);
+
+ rSet.Put (SfxUInt32Item (nWhich, static_cast<::tools::Long>(rLineWidthItem.GetValue ())));
+ break;
+ }
+
+ case SID_GETGREEN :
+ case SID_GETRED :
+ case SID_GETBLUE :
+ {
+ const SfxUInt32Item &rWhatKind = static_cast<const SfxUInt32Item &>( rSet.Get (ID_VAL_WHATKIND) );
+ Color aColor;
+
+ switch (rWhatKind.GetValue ())
+ {
+ case 1 :
+ {
+ const XLineColorItem &rLineColorItem = aAttr.Get (XATTR_LINECOLOR);
+
+ aColor = rLineColorItem.GetColorValue ();
+ break;
+ }
+
+ case 2 :
+ {
+ const XFillColorItem &rFillColorItem = aAttr.Get (XATTR_FILLCOLOR);
+
+ aColor = rFillColorItem.GetColorValue ();
+ break;
+ }
+
+ case 3 :
+ case 4 :
+ {
+ const XFillGradientItem &rFillGradientItem = aAttr.Get (XATTR_FILLGRADIENT);
+ const XGradient &rGradient = rFillGradientItem.GetGradientValue ();
+
+ aColor = (rWhatKind.GetValue () == 3)
+ ? rGradient.GetStartColor ()
+ : rGradient.GetEndColor ();
+ break;
+ }
+
+ case 5:
+ {
+ const XFillHatchItem &rFillHatchItem = aAttr.Get (XATTR_FILLHATCH);
+ const XHatch &rHatch = rFillHatchItem.GetHatchValue ();
+
+ aColor = rHatch.GetColor ();
+ break;
+ }
+
+ default :
+ ;
+ }
+
+ rSet.Put (SfxUInt32Item (nWhich, static_cast<::tools::Long>((nWhich == SID_GETRED)
+ ? aColor.GetRed ()
+ : (nWhich == SID_GETGREEN)
+ ? aColor.GetGreen ()
+ : aColor.GetBlue ())));
+ break;
+ }
+
+ default :
+ ;
+ }
+
+ nWhich = aIter.NextWhich ();
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviewsa.cxx b/sd/source/ui/view/drviewsa.cxx
new file mode 100644
index 000000000..a61d64599
--- /dev/null
+++ b/sd/source/ui/view/drviewsa.cxx
@@ -0,0 +1,848 @@
+/* -*- 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 <DrawViewShell.hxx>
+#include <com/sun/star/scanner/ScannerManager.hpp>
+#include <cppuhelper/implbase.hxx>
+#include <comphelper/processfactory.hxx>
+#include <editeng/sizeitem.hxx>
+#include <svx/svdlayer.hxx>
+#include <sfx2/zoomitem.hxx>
+#include <svx/svdpagv.hxx>
+#include <svl/ptitem.hxx>
+#include <svl/stritem.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svx/zoomslideritem.hxx>
+#include <svl/eitem.hxx>
+
+#include <sdcommands.h>
+#include <svx/f3dchild.hxx>
+#include <svx/clipfmtitem.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <svtools/cliplistener.hxx>
+#include <svx/float3d.hxx>
+#include <svx/extedit.hxx>
+#include <svx/sidebar/SelectionAnalyzer.hxx>
+#include <svx/sidebar/SelectionChangeHandler.hxx>
+#include <helpids.h>
+
+#include <view/viewoverlaymanager.hxx>
+#include <app.hrc>
+#include <strings.hrc>
+#include <sdmod.hxx>
+#include <sdpage.hxx>
+#include <FrameView.hxx>
+#include <drawdoc.hxx>
+#include <sdresid.hxx>
+#include <DrawDocShell.hxx>
+#include <Window.hxx>
+#include <fupoor.hxx>
+#include <fusel.hxx>
+#include <funavig.hxx>
+#include <drawview.hxx>
+#include <SdUnoDrawView.hxx>
+#include <ViewShellBase.hxx>
+#include <slideshow.hxx>
+#include <annotationmanager.hxx>
+#include <DrawController.hxx>
+#include <tools/diagnose_ex.h>
+#include <LayerTabBar.hxx>
+
+#include <memory>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using vcl::EnumContext;
+
+namespace sd {
+
+bool DrawViewShell::mbPipette = false;
+
+namespace {
+
+class ScannerEventListener : public ::cppu::WeakImplHelper< lang::XEventListener >
+{
+private:
+
+ DrawViewShell* mpParent;
+
+public:
+
+ explicit ScannerEventListener( DrawViewShell* pParent ) : mpParent( pParent ) {}
+
+ // XEventListener
+ virtual void SAL_CALL disposing( const lang::EventObject& rEventObject ) override;
+
+ void ParentDestroyed() { mpParent = nullptr; }
+};
+
+}
+
+void SAL_CALL ScannerEventListener::disposing( const lang::EventObject& /*rEventObject*/ )
+{
+ if( mpParent )
+ mpParent->ScannerEvent();
+}
+
+DrawViewShell::DrawViewShell( ViewShellBase& rViewShellBase, vcl::Window* pParentWindow, PageKind ePageKind, FrameView* pFrameViewArgument )
+ : ViewShell (pParentWindow, rViewShellBase)
+ , maTabControl(VclPtr<sd::TabControl>::Create(this, pParentWindow))
+ , mbIsLayerModeActive(false)
+ , mbIsInSwitchPage(false)
+ , mpSelectionChangeHandler(new svx::sidebar::SelectionChangeHandler(
+ [this] () { return this->GetSidebarContextName(); },
+ uno::Reference<frame::XController>(&rViewShellBase.GetDrawController()),
+ vcl::EnumContext::Context::Default))
+ , mbMouseButtonDown(false)
+ , mbMouseSelecting(false)
+{
+ if (pFrameViewArgument != nullptr)
+ mpFrameView = pFrameViewArgument;
+ else
+ mpFrameView = new FrameView(GetDoc());
+ Construct(GetDocSh(), ePageKind);
+
+ mpSelectionChangeHandler->Connect();
+
+ SetContextName(GetSidebarContextName());
+
+ doShow();
+
+ ConfigureAppBackgroundColor();
+ SD_MOD()->GetColorConfig().AddListener(this);
+}
+
+DrawViewShell::~DrawViewShell()
+{
+ SD_MOD()->GetColorConfig().RemoveListener(this);
+
+ mpSelectionChangeHandler->Disconnect();
+
+ mpAnnotationManager.reset();
+ mpViewOverlayManager.reset();
+
+ OSL_ASSERT (GetViewShell()!=nullptr);
+
+ if( mxScannerListener.is() )
+ static_cast< ScannerEventListener* >( mxScannerListener.get() )->ParentDestroyed();
+
+ // Remove references to items within Svx3DWin
+ // (maybe do a listening sometime in Svx3DWin)
+ sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId();
+ SfxChildWindow* pWindow = GetViewFrame() ? GetViewFrame()->GetChildWindow(nId) : nullptr;
+ if(pWindow)
+ {
+ Svx3DWin* p3DWin = static_cast< Svx3DWin* > (pWindow->GetWindow());
+ if(p3DWin)
+ p3DWin->DocumentReload();
+ }
+
+ EndListening (*GetDoc());
+ EndListening (*GetDocSh());
+
+ if( SlideShow::IsRunning(*this) )
+ StopSlideShow();
+
+ DisposeFunctions();
+
+ sal_uInt16 aPageCnt = GetDoc()->GetSdPageCount(mePageKind);
+
+ for (sal_uInt16 i = 0; i < aPageCnt; i++)
+ {
+ SdPage* pPage = GetDoc()->GetSdPage(i, mePageKind);
+
+ if (pPage == mpActualPage)
+ {
+ GetDoc()->SetSelected(pPage, true);
+ }
+ else
+ {
+ GetDoc()->SetSelected(pPage, false);
+ }
+ }
+
+ if ( mxClipEvtLstnr.is() )
+ {
+ mxClipEvtLstnr->RemoveListener( GetActiveWindow() );
+ mxClipEvtLstnr->ClearCallbackLink(); // prevent callback if another thread is waiting
+ mxClipEvtLstnr.clear();
+ }
+
+ mpDrawView.reset();
+ // Set mpView to NULL so that the destructor of the ViewShell base class
+ // does not access it.
+ mpView = nullptr;
+
+ mpFrameView->Disconnect();
+ maTabControl.disposeAndClear();
+}
+
+/**
+ * common part of both constructors
+ */
+void DrawViewShell::Construct(DrawDocShell* pDocSh, PageKind eInitialPageKind)
+{
+ mpActualPage = nullptr;
+ mbReadOnly = GetDocSh()->IsReadOnly();
+ mxClipEvtLstnr.clear();
+ mbPastePossible = false;
+ mbIsLayerModeActive = false;
+
+ mpFrameView->Connect();
+
+ OSL_ASSERT (GetViewShell()!=nullptr);
+
+ SetPool( &GetDoc()->GetPool() );
+
+ GetDoc()->CreateFirstPages();
+
+ mpDrawView.reset( new DrawView(pDocSh, GetActiveWindow()->GetOutDev(), this) );
+ mpView = mpDrawView.get(); // Pointer of base class ViewShell
+ mpDrawView->SetSwapAsynchron(); // Asynchronous load of graphics
+
+ // We do not read the page kind from the frame view anymore so we have
+ // to set it in order to resync frame view and this view.
+ mpFrameView->SetPageKind(eInitialPageKind);
+ mePageKind = eInitialPageKind;
+ meEditMode = EditMode::Page;
+ DocumentType eDocType = GetDoc()->GetDocumentType(); // RTTI does not work here
+ switch (mePageKind)
+ {
+ case PageKind::Standard:
+ meShellType = ST_IMPRESS;
+ break;
+
+ case PageKind::Notes:
+ meShellType = ST_NOTES;
+ break;
+
+ case PageKind::Handout:
+ meShellType = ST_HANDOUT;
+ break;
+ }
+
+ Size aPageSize( GetDoc()->GetSdPage(0, mePageKind)->GetSize() );
+ Point aPageOrg( aPageSize.Width(), aPageSize.Height() / 2);
+ Size aSize(aPageSize.Width() * 3, aPageSize.Height() * 2);
+ InitWindows(aPageOrg, aSize, Point(-1, -1));
+
+ Point aVisAreaPos;
+
+ if ( pDocSh->GetCreateMode() == SfxObjectCreateMode::EMBEDDED )
+ {
+ aVisAreaPos = pDocSh->GetVisArea(ASPECT_CONTENT).TopLeft();
+ }
+
+ mpDrawView->SetWorkArea(::tools::Rectangle(Point() - aVisAreaPos - aPageOrg, aSize));
+
+ // objects can not grow bigger than ViewSize
+ GetDoc()->SetMaxObjSize(aSize);
+
+ // Split-Handler for TabControls
+ maTabControl->SetSplitHdl( LINK( this, DrawViewShell, TabSplitHdl ) );
+
+ /* In order to set the correct EditMode of the FrameView, we select another
+ one (small trick). */
+ if (mpFrameView->GetViewShEditMode(/*mePageKind*/) == EditMode::Page)
+ {
+ meEditMode = EditMode::MasterPage;
+ }
+ else
+ {
+ meEditMode = EditMode::Page;
+ }
+
+ // Use configuration of FrameView
+ ReadFrameViewData(mpFrameView);
+
+ if( eDocType == DocumentType::Draw )
+ {
+ GetActiveWindow()->SetHelpId( HID_SDGRAPHICVIEWSHELL );
+ }
+ else
+ {
+ if (mePageKind == PageKind::Notes)
+ {
+ GetActiveWindow()->SetHelpId( CMD_SID_NOTES_MODE );
+
+ // AutoLayouts have to be created
+ GetDoc()->StopWorkStartupDelay();
+ }
+ else if (mePageKind == PageKind::Handout)
+ {
+ GetActiveWindow()->SetHelpId( CMD_SID_HANDOUT_MASTER_MODE );
+
+ // AutoLayouts have to be created
+ GetDoc()->StopWorkStartupDelay();
+ }
+ else
+ {
+ GetActiveWindow()->SetHelpId( HID_SDDRAWVIEWSHELL );
+ }
+ }
+
+ // start selection function
+ SfxRequest aReq(SID_OBJECT_SELECT, SfxCallMode::SLOT, GetDoc()->GetItemPool());
+ FuPermanent(aReq);
+ mpDrawView->SetFrameDragSingles();
+
+ if (pDocSh->GetCreateMode() == SfxObjectCreateMode::EMBEDDED)
+ {
+ mbZoomOnPage = false;
+ }
+ else
+ {
+ mbZoomOnPage = true;
+ }
+
+ mbIsRulerDrag = false;
+
+ SetName ("DrawViewShell");
+
+ mnLockCount = 0;
+
+ uno::Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
+
+ try
+ {
+ mxScannerManager = scanner::ScannerManager::create( xContext );
+
+ mxScannerListener = new ScannerEventListener( this );
+ }
+ catch (Exception const &)
+ {
+ // Eat the exception and log it
+ // We can still continue if scanner manager is not available.
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+
+ mpAnnotationManager.reset( new AnnotationManager( GetViewShellBase() ) );
+ mpViewOverlayManager.reset( new ViewOverlayManager( GetViewShellBase() ) );
+}
+
+void DrawViewShell::Init (bool bIsMainViewShell)
+{
+ ViewShell::Init(bIsMainViewShell);
+
+ if (!IsListening(*GetDocSh()))
+ StartListening (*GetDocSh());
+}
+
+void DrawViewShell::Shutdown()
+{
+ ViewShell::Shutdown();
+
+ if(SlideShow::IsRunning( GetViewShellBase() ) )
+ {
+ // Turn off effects.
+ GetDrawView()->SetAnimationMode(SdrAnimationMode::Disable);
+ }
+}
+
+css::uno::Reference<css::drawing::XDrawSubController> DrawViewShell::CreateSubController()
+{
+ css::uno::Reference<css::drawing::XDrawSubController> xSubController;
+
+ if (IsMainViewShell())
+ {
+ // Create uno sub controller for the main view shell.
+ xSubController.set( new SdUnoDrawView( *this, *GetView()));
+ }
+
+ return xSubController;
+}
+
+bool DrawViewShell::RelocateToParentWindow (vcl::Window* pParentWindow)
+{
+ // DrawViewShells can not be relocated to a new parent window at the
+ // moment, so return <FALSE/> except when the given parent window is the
+ // parent window that is already in use.
+ return pParentWindow==GetParentWindow();
+}
+
+/**
+ * check if we have to draw a polyline
+ */
+
+/*
+ Polylines are represented by macros as a sequence of:
+ MoveTo (x, y)
+ LineTo (x, y) [or BezierTo (x, y)]
+ LineTo (x, y)
+ :
+ There is no end command for polylines. Therefore, we have to test all
+ commands in the requests for LineTo (BezierTo) and we have to gather
+ the point-parameter. The first not-LineTo leads to the creation of the
+ polyline from the gathered points.
+*/
+
+void DrawViewShell::CheckLineTo(SfxRequest& rReq)
+{
+#ifdef DBG_UTIL
+ if(rReq.IsAPI())
+ {
+ if(SID_LINETO == rReq.GetSlot() || SID_BEZIERTO == rReq.GetSlot() || SID_MOVETO == rReq.GetSlot() )
+ {
+ OSL_FAIL("DrawViewShell::CheckLineTo: slots SID_LINETO, SID_BEZIERTO, SID_MOVETO no longer supported.");
+ }
+ }
+#endif
+
+ rReq.Ignore ();
+}
+
+/**
+ * Change page parameter if SID_PAGESIZE or SID_PAGEMARGIN
+ */
+void DrawViewShell::SetupPage (Size const &rSize,
+ ::tools::Long nLeft,
+ ::tools::Long nRight,
+ ::tools::Long nUpper,
+ ::tools::Long nLower,
+ bool bSize,
+ bool bMargin,
+ bool bScaleAll)
+{
+ sal_uInt16 nPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind);
+ sal_uInt16 i;
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ // first, handle all master pages
+ SdPage *pPage = GetDoc()->GetMasterSdPage(i, mePageKind);
+
+ if( pPage )
+ {
+ if( bSize )
+ {
+ ::tools::Rectangle aBorderRect(nLeft, nUpper, nRight, nLower);
+ pPage->ScaleObjects(rSize, aBorderRect, bScaleAll);
+ pPage->SetSize(rSize);
+
+ }
+ if( bMargin )
+ {
+ pPage->SetLeftBorder(nLeft);
+ pPage->SetRightBorder(nRight);
+ pPage->SetUpperBorder(nUpper);
+ pPage->SetLowerBorder(nLower);
+ }
+
+ if ( mePageKind == PageKind::Standard )
+ {
+ GetDoc()->GetMasterSdPage(i, PageKind::Notes)->CreateTitleAndLayout();
+ }
+
+ pPage->CreateTitleAndLayout();
+ }
+ }
+
+ nPageCnt = GetDoc()->GetSdPageCount(mePageKind);
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ // then, handle all pages
+ SdPage *pPage = GetDoc()->GetSdPage(i, mePageKind);
+
+ if( pPage )
+ {
+ if( bSize )
+ {
+ ::tools::Rectangle aBorderRect(nLeft, nUpper, nRight, nLower);
+ pPage->ScaleObjects(rSize, aBorderRect, bScaleAll);
+ pPage->SetSize(rSize);
+ }
+ if( bMargin )
+ {
+ pPage->SetLeftBorder(nLeft);
+ pPage->SetRightBorder(nRight);
+ pPage->SetUpperBorder(nUpper);
+ pPage->SetLowerBorder(nLower);
+ }
+
+ if ( mePageKind == PageKind::Standard )
+ {
+ SdPage* pNotesPage = GetDoc()->GetSdPage(i, PageKind::Notes);
+ pNotesPage->SetAutoLayout( pNotesPage->GetAutoLayout() );
+ }
+
+ pPage->SetAutoLayout( pPage->GetAutoLayout() );
+ }
+ }
+
+ if ( mePageKind == PageKind::Standard )
+ {
+ SdPage* pHandoutPage = GetDoc()->GetSdPage(0, PageKind::Handout);
+ pHandoutPage->CreateTitleAndLayout(true);
+ }
+
+ ::tools::Long nWidth = mpActualPage->GetSize().Width();
+ ::tools::Long nHeight = mpActualPage->GetSize().Height();
+
+ Point aPageOrg(nWidth, nHeight / 2);
+ Size aSize( nWidth * 3, nHeight * 2);
+
+ InitWindows(aPageOrg, aSize, Point(-1, -1), true);
+
+ Point aVisAreaPos;
+
+ if ( GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED )
+ {
+ aVisAreaPos = GetDocSh()->GetVisArea(ASPECT_CONTENT).TopLeft();
+ }
+
+ GetView()->SetWorkArea(::tools::Rectangle(Point() - aVisAreaPos - aPageOrg, aSize));
+
+ UpdateScrollBars();
+
+ Point aNewOrigin(mpActualPage->GetLeftBorder(), mpActualPage->GetUpperBorder());
+ GetView()->GetSdrPageView()->SetPageOrigin(aNewOrigin);
+
+ GetViewFrame()->GetBindings().Invalidate(SID_RULER_NULL_OFFSET);
+
+ // zoom onto (new) page size
+ GetViewFrame()->GetDispatcher()->Execute(SID_SIZE_PAGE,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+}
+
+void DrawViewShell::GetStatusBarState(SfxItemSet& rSet)
+{
+ /* Zoom-Item
+ Here we should propagate the corresponding value (Optimal ?, page width
+ or page) with the help of the ZoomItems !!! */
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_ZOOM ) )
+ {
+ if (GetDocSh()->IsUIActive() || SlideShow::IsRunning(GetViewShellBase())
+ || !GetActiveWindow())
+ {
+ rSet.DisableItem( SID_ATTR_ZOOM );
+ }
+ else
+ {
+ std::unique_ptr<SvxZoomItem> pZoomItem;
+ sal_uInt16 nZoom = static_cast<sal_uInt16>(GetActiveWindow()->GetZoom());
+
+ if( mbZoomOnPage )
+ pZoomItem.reset(new SvxZoomItem( SvxZoomType::WHOLEPAGE, nZoom ));
+ else
+ pZoomItem.reset(new SvxZoomItem( SvxZoomType::PERCENT, nZoom ));
+
+ // constrain area
+ SvxZoomEnableFlags nZoomValues = SvxZoomEnableFlags::ALL;
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+
+ if( pPageView && pPageView->GetObjList()->GetObjCount() == 0 )
+ {
+ nZoomValues &= ~SvxZoomEnableFlags::OPTIMAL;
+ }
+
+ pZoomItem->SetValueSet( nZoomValues );
+ rSet.Put( std::move(pZoomItem) );
+ }
+ }
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_ZOOMSLIDER ) )
+ {
+ rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetDoc() ) );
+ if (GetDocSh()->IsUIActive() || (xSlideshow.is() && xSlideshow->isRunning()) || !GetActiveWindow() )
+ {
+ rSet.DisableItem( SID_ATTR_ZOOMSLIDER );
+ }
+ else
+ {
+ sd::Window * pActiveWindow = GetActiveWindow();
+ SvxZoomSliderItem aZoomItem( static_cast<sal_uInt16>(pActiveWindow->GetZoom()), static_cast<sal_uInt16>(pActiveWindow->GetMinZoom()), static_cast<sal_uInt16>(pActiveWindow->GetMaxZoom()) ) ;
+
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+ if( pPageView )
+ {
+ Point aPagePos(0, 0);
+ Size aPageSize = pPageView->GetPage()->GetSize();
+
+ aPagePos.AdjustX(aPageSize.Width() / 2 );
+ aPageSize.setWidth( static_cast<::tools::Long>(aPageSize.Width() * 1.03) );
+
+ aPagePos.AdjustY(aPageSize.Height() / 2 );
+ aPageSize.setHeight( static_cast<::tools::Long>(aPageSize.Height() * 1.03) );
+ aPagePos.AdjustY( -(aPageSize.Height() / 2) );
+
+ aPagePos.AdjustX( -(aPageSize.Width() / 2) );
+
+ ::tools::Rectangle aFullPageZoomRect( aPagePos, aPageSize );
+ aZoomItem.AddSnappingPoint( pActiveWindow->GetZoomForRect( aFullPageZoomRect ) );
+ }
+ aZoomItem.AddSnappingPoint(100);
+ rSet.Put( aZoomItem );
+ }
+ }
+
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+ if (pPageView)
+ {
+ Point aPos = GetActiveWindow()->PixelToLogic(maMousePos);
+ pPageView->LogicToPagePos(aPos);
+ Fraction aUIScale(GetDoc()->GetUIScale());
+ aPos.setX( ::tools::Long(aPos.X() / aUIScale) );
+ aPos.setY( ::tools::Long(aPos.Y() / aUIScale) );
+
+ // position- and size items
+ if ( mpDrawView->IsAction() )
+ {
+ ::tools::Rectangle aRect;
+ mpDrawView->TakeActionRect( aRect );
+
+ if ( aRect.IsEmpty() )
+ rSet.Put( SfxPointItem(SID_ATTR_POSITION, aPos) );
+ else
+ {
+ pPageView->LogicToPagePos(aRect);
+ aPos = aRect.TopLeft();
+ aPos.setX( ::tools::Long(aPos.X() / aUIScale) );
+ aPos.setY( ::tools::Long(aPos.Y() / aUIScale) );
+ rSet.Put( SfxPointItem( SID_ATTR_POSITION, aPos) );
+ Size aSize( aRect.Right() - aRect.Left(), aRect.Bottom() - aRect.Top() );
+ aSize.setHeight( ::tools::Long(aSize.Height() / aUIScale) );
+ aSize.setWidth( ::tools::Long(aSize.Width() / aUIScale) );
+ rSet.Put( SvxSizeItem( SID_ATTR_SIZE, aSize) );
+ }
+ }
+ else
+ {
+ if ( mpDrawView->AreObjectsMarked() )
+ {
+ ::tools::Rectangle aRect = mpDrawView->GetAllMarkedRect();
+ pPageView->LogicToPagePos(aRect);
+
+ // Show the position of the selected shape(s)
+ Point aShapePosition (aRect.TopLeft());
+ aShapePosition.setX( ::tools::Long(aShapePosition.X() / aUIScale) );
+ aShapePosition.setY( ::tools::Long(aShapePosition.Y() / aUIScale) );
+ rSet.Put (SfxPointItem(SID_ATTR_POSITION, aShapePosition));
+
+ Size aSize( aRect.Right() - aRect.Left(), aRect.Bottom() - aRect.Top() );
+ aSize.setHeight( ::tools::Long(aSize.Height() / aUIScale) );
+ aSize.setWidth( ::tools::Long(aSize.Width() / aUIScale) );
+ rSet.Put( SvxSizeItem( SID_ATTR_SIZE, aSize) );
+ }
+ else
+ {
+ rSet.Put( SfxPointItem(SID_ATTR_POSITION, aPos) );
+ rSet.Put( SvxSizeItem( SID_ATTR_SIZE, Size( 0, 0 ) ) );
+ }
+ }
+ }
+
+ // Display of current page and layer.
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_STATUS_PAGE ) )
+ {
+ sal_Int32 nPageCount = sal_Int32(GetDoc()->GetSdPageCount(mePageKind));
+ sal_Int32 nActivePageCount = sal_Int32(GetDoc()->GetActiveSdPageCount());
+ // Always show the slide/page number.
+ OUString aOUString = (nPageCount == nActivePageCount) ? SdResId(STR_SD_PAGE_COUNT) : SdResId(STR_SD_PAGE_COUNT_CUSTOM);
+
+ aOUString = aOUString.replaceFirst("%1", OUString::number(maTabControl->GetCurPagePos() + 1));
+ aOUString = aOUString.replaceFirst("%2", OUString::number(nPageCount));
+ if(nPageCount != nActivePageCount)
+ aOUString = aOUString.replaceFirst("%3", OUString::number(nActivePageCount));
+
+ // If in layer mode additionally show the layer that contains all
+ // selected shapes of the page. If the shapes are distributed on
+ // more than one layer, no layer name is shown.
+ if (IsLayerModeActive())
+ {
+ SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin();
+ SdrLayerID nLayer(0), nOldLayer(0);
+ SdrObject* pObj = nullptr;
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ const size_t nMarkCount = rMarkList.GetMarkCount();
+ bool bOneLayer = true;
+
+ // Use the first ten selected shapes as a (hopefully
+ // representative) sample of all shapes of the current page.
+ // Detect whether they belong to the same layer.
+ for( size_t j = 0; j < nMarkCount && bOneLayer && j < 10; ++j )
+ {
+ pObj = rMarkList.GetMark( j )->GetMarkedSdrObj();
+ if( pObj )
+ {
+ nLayer = pObj->GetLayer();
+
+ if( j != 0 && nLayer != nOldLayer )
+ bOneLayer = false;
+
+ nOldLayer = nLayer;
+ }
+ }
+
+ // Append the layer name to the current page number.
+ if( bOneLayer && nMarkCount )
+ {
+ SdrLayer* pLayer = rLayerAdmin.GetLayerPerID( nLayer );
+ if( pLayer )
+ {
+ aOUString += " (" + LayerTabBar::convertToLocalizedName(pLayer->GetName()) + ")";
+ }
+ }
+ }
+
+ rSet.Put (SfxStringItem (SID_STATUS_PAGE, aOUString));
+ }
+ // Layout
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_STATUS_LAYOUT ) )
+ {
+ OUString aString = mpActualPage->GetLayoutName();
+ sal_Int32 nPos = aString.indexOf(SD_LT_SEPARATOR);
+ if (nPos != -1)
+ aString = aString.copy(0, nPos);
+ rSet.Put( SfxStringItem( SID_STATUS_LAYOUT, aString ) );
+ }
+ // Scale
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_SCALE ) )
+ {
+ const Fraction& aUIScale = GetDoc()->GetUIScale();
+ OUString aString = OUString::number(aUIScale.GetNumerator()) +
+ ":" + OUString::number(aUIScale.GetDenominator());
+ rSet.Put( SfxStringItem( SID_SCALE, aString ) );
+ }
+}
+
+void DrawViewShell::Notify (SfxBroadcaster&, const SfxHint& rHint)
+{
+ if (rHint.GetId()!=SfxHintId::ModeChanged)
+ return;
+
+ // Change to selection when turning on read-only mode.
+ if(GetDocSh()->IsReadOnly() && dynamic_cast< FuSelection* >( GetCurrentFunction().get() ) )
+ {
+ SfxRequest aReq(SID_OBJECT_SELECT, SfxCallMode::SLOT, GetDoc()->GetItemPool());
+ FuPermanent(aReq);
+ }
+
+ // Turn on design mode when document is not read-only.
+ if (GetDocSh()->IsReadOnly() != mbReadOnly )
+ {
+ mbReadOnly = GetDocSh()->IsReadOnly();
+
+ SfxBoolItem aItem( SID_FM_DESIGN_MODE, !mbReadOnly );
+ GetViewFrame()->GetDispatcher()->ExecuteList(SID_FM_DESIGN_MODE,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, { &aItem });
+ }
+
+}
+
+void DrawViewShell::ExecuteAnnotation (SfxRequest const & rRequest)
+{
+ if (mpAnnotationManager)
+ mpAnnotationManager->ExecuteAnnotation( rRequest );
+}
+
+void DrawViewShell::GetAnnotationState (SfxItemSet& rItemSet )
+{
+ if (mpAnnotationManager)
+ mpAnnotationManager->GetAnnotationState( rItemSet );
+}
+
+OUString const & DrawViewShell::GetSidebarContextName() const
+{
+ svx::sidebar::SelectionAnalyzer::ViewType eViewType (svx::sidebar::SelectionAnalyzer::ViewType::Standard);
+ switch (mePageKind)
+ {
+ case PageKind::Handout:
+ eViewType = svx::sidebar::SelectionAnalyzer::ViewType::Handout;
+ break;
+ case PageKind::Notes:
+ eViewType = svx::sidebar::SelectionAnalyzer::ViewType::Notes;
+ break;
+ case PageKind::Standard:
+ if (meEditMode == EditMode::MasterPage)
+ eViewType = svx::sidebar::SelectionAnalyzer::ViewType::Master;
+ else
+ eViewType = svx::sidebar::SelectionAnalyzer::ViewType::Standard;
+ break;
+ }
+ return EnumContext::GetContextName(
+ svx::sidebar::SelectionAnalyzer::GetContextForSelection_SD(
+ mpDrawView->GetMarkedObjectList(),
+ eViewType));
+}
+
+void DrawViewShell::ExecGoToNextPage (SfxRequest& rReq)
+{
+ SetCurrentFunction( FuNavigation::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) );
+ Cancel();
+}
+
+void DrawViewShell::GetStateGoToNextPage (SfxItemSet& rSet)
+{
+ SdPage* pPage = GetActualPage();
+ sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2;
+ sal_uInt16 totalPages = GetDoc()->GetSdPageCount(pPage->GetPageKind());
+ if (nSdPage + 1 >= totalPages)
+ rSet.DisableItem( SID_GO_TO_NEXT_PAGE );
+}
+
+void DrawViewShell::ExecGoToPreviousPage (SfxRequest& rReq)
+{
+ SetCurrentFunction( FuNavigation::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) );
+ Cancel();
+}
+
+void DrawViewShell::GetStateGoToPreviousPage (SfxItemSet& rSet)
+{
+ SdPage* pPage = GetActualPage();
+ sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2;
+ if (nSdPage == 0)
+ rSet.DisableItem( SID_GO_TO_PREVIOUS_PAGE );
+}
+
+
+void DrawViewShell::ExecGoToFirstPage (SfxRequest& rReq)
+{
+ SetCurrentFunction( FuNavigation::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) );
+ Cancel();
+}
+
+void DrawViewShell::GetStateGoToFirstPage (SfxItemSet& rSet)
+{
+ SdPage* pPage = GetActualPage();
+ sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2;
+ if (nSdPage == 0)
+ rSet.DisableItem( SID_GO_TO_FIRST_PAGE );
+}
+
+void DrawViewShell::ExecGoToLastPage (SfxRequest& rReq)
+{
+ SetCurrentFunction( FuNavigation::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) );
+ Cancel();
+}
+
+void DrawViewShell::GetStateGoToLastPage (SfxItemSet& rSet)
+{
+ SdPage* pPage = GetActualPage();
+ sal_uInt16 nSdPage = (pPage->GetPageNum() - 1) / 2;
+ sal_uInt16 totalPages = GetDoc()->GetSdPageCount(pPage->GetPageKind());
+ if (nSdPage + 1 >= totalPages)
+ rSet.DisableItem( SID_GO_TO_LAST_PAGE );
+}
+
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviewsb.cxx b/sd/source/ui/view/drviewsb.cxx
new file mode 100644
index 000000000..6f6bba855
--- /dev/null
+++ b/sd/source/ui/view/drviewsb.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/.
+ *
+ * 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 <svx/svdlayer.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svx/fmshell.hxx>
+#include <svx/svxdlg.hxx>
+#include <osl/diagnose.h>
+
+#include <app.hrc>
+
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <unokywds.hxx>
+#include <sdpage.hxx>
+#include <DrawViewShell.hxx>
+#include <drawview.hxx>
+#include <unmodpg.hxx>
+#include <ViewShellBase.hxx>
+#include <FormShellManager.hxx>
+#include <LayerTabBar.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <SlideSorter.hxx>
+#include <controller/SlideSorterController.hxx>
+
+namespace sd {
+
+bool DrawViewShell::RenameSlide( sal_uInt16 nPageId, const OUString & rName )
+{
+ bool bOutDummy;
+ if( GetDoc()->GetPageByName( rName, bOutDummy ) != SDRPAGE_NOTFOUND )
+ return false;
+
+ SdPage* pPageToRename = nullptr;
+ PageKind ePageKind = GetPageKind();
+
+ if( GetEditMode() == EditMode::Page )
+ {
+ pPageToRename = GetDoc()->GetSdPage( maTabControl->GetPagePos(nPageId), ePageKind );
+
+ // Undo
+ SdPage* pUndoPage = pPageToRename;
+ SdrLayerAdmin & rLayerAdmin = GetDoc()->GetLayerAdmin();
+ SdrLayerID nBackground = rLayerAdmin.GetLayerID(sUNO_LayerName_background);
+ SdrLayerID nBgObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects);
+ SdrLayerIDSet aVisibleLayers = mpActualPage->TRG_GetMasterPageVisibleLayers();
+
+ SfxUndoManager* pManager = GetDoc()->GetDocSh()->GetUndoManager();
+ pManager->AddUndoAction(
+ std::make_unique<ModifyPageUndoAction>(
+ GetDoc(), pUndoPage, rName, pUndoPage->GetAutoLayout(),
+ aVisibleLayers.IsSet( nBackground ),
+ aVisibleLayers.IsSet( nBgObj )));
+
+ // rename
+ pPageToRename->SetName( rName );
+
+ if( ePageKind == PageKind::Standard )
+ {
+ // also rename notes-page
+ SdPage* pNotesPage = GetDoc()->GetSdPage( maTabControl->GetPagePos(nPageId), PageKind::Notes );
+ pNotesPage->SetName( rName );
+ }
+ }
+ else
+ {
+ // rename MasterPage -> rename LayoutTemplate
+ pPageToRename = GetDoc()->GetMasterSdPage( maTabControl->GetPagePos(nPageId), ePageKind );
+ GetDoc()->RenameLayoutTemplate( pPageToRename->GetLayoutName(), rName );
+ }
+
+ bool bSuccess = (rName == pPageToRename->GetName());
+
+ if( bSuccess )
+ {
+ // user edited page names may be changed by the page so update control
+ maTabControl->SetPageText( nPageId, rName );
+
+ // set document to modified state
+ GetDoc()->SetChanged();
+
+ // inform navigator about change
+ if (GetViewFrame())
+ {
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate(SID_NAVIGATOR_STATE, true);
+ }
+
+ // Tell the slide sorter about the name change (necessary for
+ // accessibility.)
+ slidesorter::SlideSorterViewShell* pSlideSorterViewShell
+ = slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase());
+ if (pSlideSorterViewShell != nullptr)
+ {
+ pSlideSorterViewShell->GetSlideSorter().GetController().PageNameHasChanged(
+ maTabControl->GetPagePos(nPageId), rName);
+ }
+ }
+
+ return bSuccess;
+}
+
+IMPL_LINK( DrawViewShell, RenameSlideHdl, AbstractSvxNameDialog&, rDialog, bool )
+{
+ OUString aNewName;
+ rDialog.GetName( aNewName );
+
+ SdPage* pCurrentPage = GetDoc()->GetSdPage( maTabControl->GetCurPagePos(), GetPageKind() );
+
+ return pCurrentPage && ( aNewName == pCurrentPage->GetName() || GetDocSh()->IsNewPageNameValid( aNewName ) );
+}
+
+void DrawViewShell::ModifyLayer (
+ SdrLayer* pLayer,
+ const OUString& rLayerName,
+ const OUString& rLayerTitle,
+ const OUString& rLayerDesc,
+ bool bIsVisible,
+ bool bIsLocked,
+ bool bIsPrintable)
+{
+ if(!GetLayerTabControl()) // #i87182#
+ {
+ OSL_ENSURE(false, "No LayerTabBar (!)");
+ return;
+ }
+
+ if( !pLayer )
+ return;
+
+ const sal_uInt16 nPageCount = GetLayerTabControl()->GetPageCount();
+ sal_uInt16 nCurPage = 0;
+ sal_uInt16 nPos;
+ for( nPos = 0; nPos < nPageCount; nPos++ )
+ {
+ sal_uInt16 nId = GetLayerTabControl()->GetPageId( nPos );
+ if (GetLayerTabControl()->GetLayerName(nId) == pLayer->GetName())
+ {
+ nCurPage = nId;
+ break;
+ }
+ }
+
+ pLayer->SetName( rLayerName );
+ pLayer->SetTitle( rLayerTitle );
+ pLayer->SetDescription( rLayerDesc );
+ mpDrawView->SetLayerVisible( rLayerName, bIsVisible );
+ mpDrawView->SetLayerLocked( rLayerName, bIsLocked);
+ mpDrawView->SetLayerPrintable(rLayerName, bIsPrintable);
+
+ GetDoc()->SetChanged();
+
+ GetLayerTabControl()->SetPageText(nCurPage, rLayerName);
+
+ // Set page bits for modified tab name display
+
+ TabBarPageBits nBits = TabBarPageBits::NONE;
+
+ if (!bIsVisible)
+ {
+ nBits = TabBarPageBits::Blue;
+ }
+ if (bIsLocked)
+ {
+ nBits |= TabBarPageBits::Italic;
+ }
+ if (!bIsPrintable)
+ {
+ nBits |= TabBarPageBits::Underline;
+ }
+
+ // Save the bits
+
+ GetLayerTabControl()->SetPageBits(nCurPage, nBits);
+
+ GetViewFrame()->GetDispatcher()->Execute(
+ SID_SWITCHLAYER,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+
+ // Call Invalidate at the form shell.
+ FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell();
+ if (pFormShell != nullptr)
+ pFormShell->Invalidate();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviewsc.cxx b/sd/source/ui/view/drviewsc.cxx
new file mode 100644
index 000000000..6be86e63c
--- /dev/null
+++ b/sd/source/ui/view/drviewsc.cxx
@@ -0,0 +1,72 @@
+/* -*- 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 <DrawViewShell.hxx>
+
+#include <svx/imapdlg.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svxdlg.hxx>
+#include <svx/ImageMapInfo.hxx>
+
+#include <sfx2/viewfrm.hxx>
+
+#include <drawdoc.hxx>
+#include <drawview.hxx>
+#include <memory>
+
+namespace sd {
+
+void DrawViewShell::UpdateIMapDlg( SdrObject* pObj )
+{
+ if( ( dynamic_cast< SdrGrafObj *>( pObj ) == nullptr && dynamic_cast< SdrOle2Obj *>( pObj ) == nullptr )
+ || mpDrawView->IsTextEdit()
+ || !GetViewFrame()->HasChildWindow( SvxIMapDlgChildWindow::GetChildWindowId() ) )
+ return;
+
+ Graphic aGraphic;
+ ImageMap* pIMap = nullptr;
+ std::unique_ptr<TargetList> pTargetList;
+ SvxIMapInfo* pIMapInfo = SvxIMapInfo::GetIMapInfo( pObj );
+
+ // get graphic from shape
+ SdrGrafObj* pGrafObj = dynamic_cast< SdrGrafObj* >( pObj );
+ if( pGrafObj )
+ aGraphic = pGrafObj->GetGraphic();
+
+ if ( pIMapInfo )
+ {
+ pIMap = const_cast<ImageMap*>(&pIMapInfo->GetImageMap());
+ pTargetList.reset(new TargetList);
+ SfxViewFrame::GetTargetList( *pTargetList );
+ }
+
+ SvxIMapDlgChildWindow::UpdateIMapDlg( aGraphic, pIMap, pTargetList.get(), pObj );
+}
+
+IMPL_LINK( DrawViewShell, NameObjectHdl, AbstractSvxObjectNameDialog&, rDialog, bool )
+{
+ OUString aName;
+ rDialog.GetName( aName );
+ return aName.isEmpty() || ( GetDoc() && !GetDoc()->GetObj( aName ) );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviewsd.cxx b/sd/source/ui/view/drviewsd.cxx
new file mode 100644
index 000000000..31fe06dde
--- /dev/null
+++ b/sd/source/ui/view/drviewsd.cxx
@@ -0,0 +1,193 @@
+/* -*- 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 <DrawViewShell.hxx>
+
+#include <svx/svxids.hrc>
+#include <svl/stritem.hxx>
+#include <sfx2/childwin.hxx>
+#include <sfx2/docfile.hxx>
+#include <svl/intitem.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/request.hxx>
+
+#include <sfx2/viewfrm.hxx>
+
+#include <app.hrc>
+#include <sdpage.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <pgjump.hxx>
+#include <navigatr.hxx>
+#include <drawview.hxx>
+
+namespace sd {
+
+/**
+ * handle SfxRequests for navigator
+ */
+void DrawViewShell::ExecNavigatorWin( SfxRequest& rReq )
+{
+ CheckLineTo (rReq);
+
+ sal_uInt16 nSId = rReq.GetSlot();
+
+ switch( nSId )
+ {
+ case SID_NAVIGATOR_INIT:
+ {
+ SfxChildWindow* pWindow = GetViewFrame()->GetChildWindow( SID_NAVIGATOR );
+ if( pWindow )
+ {
+ SdNavigatorFloat* pNavWin = static_cast<SdNavigatorFloat*>(pWindow->GetWindow());
+ if( pNavWin )
+ pNavWin->InitTreeLB( GetDoc() );
+ }
+ }
+ break;
+
+ case SID_NAVIGATOR_PAGE:
+ case SID_NAVIGATOR_OBJECT:
+ {
+ if (nSId == SID_NAVIGATOR_PAGE)
+ {
+ if ( mpDrawView->IsTextEdit() )
+ mpDrawView->SdrEndTextEdit();
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ PageJump eJump = static_cast<PageJump>(static_cast<const SfxUInt16Item&>( pArgs->
+ Get(SID_NAVIGATOR_PAGE)).GetValue());
+
+ switch (eJump)
+ {
+ case PAGE_FIRST:
+ {
+ // jump to first page
+ SwitchPage(0);
+ }
+ break;
+
+ case PAGE_LAST:
+ {
+ // jump to last page
+ SwitchPage(GetDoc()->GetSdPageCount(mpActualPage->GetPageKind()) - 1);
+ }
+ break;
+
+ case PAGE_NEXT:
+ {
+ // jump to next page
+ sal_uInt16 nSdPage = (mpActualPage->GetPageNum() - 1) / 2;
+
+ if (nSdPage < GetDoc()->GetSdPageCount(mpActualPage->GetPageKind()) - 1)
+ {
+ SwitchPage(nSdPage + 1);
+ }
+ }
+ break;
+
+ case PAGE_PREVIOUS:
+ {
+ // jump to previous page
+ sal_uInt16 nSdPage = (mpActualPage->GetPageNum() - 1) / 2;
+
+ if (nSdPage > 0)
+ {
+ SwitchPage(nSdPage - 1);
+ }
+ }
+ break;
+
+ case PAGE_NONE:
+ break;
+ }
+ }
+ else if (nSId == SID_NAVIGATOR_OBJECT)
+ {
+ OUString aBookmarkStr("#");
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ OUString aTarget = static_cast<const SfxStringItem&>( pArgs->
+ Get(SID_NAVIGATOR_OBJECT)).GetValue();
+ aBookmarkStr += aTarget;
+ SfxStringItem aStrItem(SID_FILE_NAME, aBookmarkStr);
+ SfxStringItem aReferer(SID_REFERER, GetDocSh()->GetMedium()->GetName());
+ SfxViewFrame* pFrame = GetViewFrame();
+ SfxFrameItem aFrameItem(SID_DOCFRAME, pFrame);
+ SfxBoolItem aBrowseItem(SID_BROWSE, true);
+ pFrame->GetDispatcher()->
+ ExecuteList(SID_OPENDOC, SfxCallMode::SYNCHRON | SfxCallMode::RECORD,
+ { &aStrItem, &aFrameItem, &aBrowseItem, &aReferer });
+ }
+
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_NAVIGATOR_STATE );
+ rBindings.Invalidate( SID_NAVIGATOR_PAGENAME );
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void DrawViewShell::GetNavigatorWinState( SfxItemSet& rSet )
+{
+ NavState nState = NavState::NONE;
+ sal_uInt16 nCurrentPage = 0;
+ sal_uInt16 nLastPage;
+ OUString aPageName;
+
+ nState |= NavState::TableUpdate;
+
+ if (mpActualPage != nullptr)
+ {
+ nCurrentPage = ( mpActualPage->GetPageNum() - 1 ) / 2;
+ aPageName = mpActualPage->GetName();
+ }
+ nLastPage = GetDoc()->GetSdPageCount( mePageKind ) - 1;
+
+
+ // first page / previous page
+ if( nCurrentPage == 0 )
+ {
+ nState |= NavState::BtnFirstDisabled | NavState::BtnPrevDisabled;
+ }
+ else
+ {
+ nState |= NavState::BtnFirstEnabled | NavState::BtnPrevEnabled;
+ }
+
+ // last page / next page
+ if( nCurrentPage == nLastPage )
+ {
+ nState |= NavState::BtnLastDisabled | NavState::BtnNextDisabled;
+ }
+ else
+ {
+ nState |= NavState::BtnLastEnabled | NavState::BtnNextEnabled;
+ }
+
+ rSet.Put( SfxUInt32Item( SID_NAVIGATOR_STATE, static_cast<sal_uInt32>(nState) ) );
+ rSet.Put( SfxStringItem( SID_NAVIGATOR_PAGENAME, aPageName ) );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviewse.cxx b/sd/source/ui/view/drviewse.cxx
new file mode 100644
index 000000000..309eb2b85
--- /dev/null
+++ b/sd/source/ui/view/drviewse.cxx
@@ -0,0 +1,1701 @@
+/* -*- 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 <config_features.h>
+
+#include <com/sun/star/presentation/XPresentation2.hpp>
+#include <com/sun/star/form/FormButtonType.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <i18nutil/unicode.hxx>
+#include <i18nutil/transliteration.hxx>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/uno/Any.hxx>
+
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+#include <comphelper/lok.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <editeng/editstat.hxx>
+#include <editeng/outlobj.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <svl/urlbmk.hxx>
+#include <svx/clipfmtitem.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/svdundo.hxx>
+#include <svx/svdorect.hxx>
+#include <svl/eitem.hxx>
+#include <svl/intitem.hxx>
+#include <svl/poolitem.hxx>
+#include <svl/stritem.hxx>
+#include <editeng/eeitem.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/request.hxx>
+#include <svx/svxids.hrc>
+#include <editeng/flditem.hxx>
+#include <svx/obj3d.hxx>
+#include <svx/svdobjkind.hxx>
+#include <svx/svdouno.hxx>
+#include <svx/dataaccessdescriptor.hxx>
+#include <tools/urlobj.hxx>
+#include <sfx2/ipclient.hxx>
+#include <avmedia/mediawindow.hxx>
+#include <svl/urihelper.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/notebookbar/SfxNotebookBar.hxx>
+#include <osl/diagnose.h>
+
+#include <DrawViewShell.hxx>
+#include <slideshow.hxx>
+#include <ViewShellHint.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <app.hrc>
+#include <strings.hrc>
+
+#include <drawdoc.hxx>
+#include <fusel.hxx>
+#include <futext.hxx>
+#include <fuconrec.hxx>
+#include <fuconcs.hxx>
+#include <fuconuno.hxx>
+#include <fuconbez.hxx>
+#include <fuediglu.hxx>
+#include <fuconarc.hxx>
+#include <fucon3d.hxx>
+#include <sdresid.hxx>
+#include <unokywds.hxx>
+#include <Outliner.hxx>
+#include <sdpage.hxx>
+#include <FrameView.hxx>
+#include <zoomlist.hxx>
+#include <drawview.hxx>
+#include <DrawDocShell.hxx>
+#include <ViewShellBase.hxx>
+#include <ToolBarManager.hxx>
+#include <anminfo.hxx>
+#include <optsitem.hxx>
+#include <Window.hxx>
+#include <fuformatpaintbrush.hxx>
+#include <fuzoom.hxx>
+#include <sdmod.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::presentation;
+using namespace ::com::sun::star::beans;
+
+namespace sd {
+
+// Permanent Functions
+
+static void ImpAddPrintableCharactersToTextEdit(SfxRequest const & rReq, ::sd::View* pView)
+{
+ // evtl. feed characters to activated textedit
+ const SfxItemSet* pSet = rReq.GetArgs();
+
+ if(!pSet)
+ return;
+
+ OUString aInputString;
+
+ if(SfxItemState::SET == pSet->GetItemState(SID_ATTR_CHAR))
+ aInputString = static_cast<const SfxStringItem&>(pSet->Get(SID_ATTR_CHAR)).GetValue();
+
+ if(aInputString.isEmpty())
+ return;
+
+ OutlinerView* pOLV = pView->GetTextEditOutlinerView();
+
+ if(pOLV)
+ {
+ for(sal_Int32 a(0); a < aInputString.getLength(); a++)
+ {
+ vcl::KeyCode aKeyCode;
+ // tdf#38669 - create the key event using a Unicode character
+ KeyEvent aKeyEvent(aInputString[a], aKeyCode);
+
+ // add actual character
+ pOLV->PostKeyEvent(aKeyEvent);
+ }
+ }
+}
+
+void DrawViewShell::FuPermanent(SfxRequest& rReq)
+{
+ // We do not execute a thing during a native slide show
+
+ if (SlideShow::IsRunning(GetViewShellBase()))
+ return;
+
+ sal_uInt16 nSId = rReq.GetSlot();
+
+ if( HasCurrentFunction() &&
+ ( nSId == SID_TEXTEDIT || nSId == SID_ATTR_CHAR || nSId == SID_TEXT_FITTOSIZE ||
+ nSId == SID_ATTR_CHAR_VERTICAL || nSId == SID_TEXT_FITTOSIZE_VERTICAL ) )
+ {
+ rtl::Reference<FuPoor> xFunc( GetCurrentFunction() );
+
+ FuText* pFuText = dynamic_cast< FuText* >( xFunc.get() );
+
+ if( pFuText )
+ {
+ pFuText->SetPermanent(true);
+ xFunc->ReceiveRequest( rReq );
+
+ Invalidate();
+
+ // evtl. feed characters to activated textedit
+ if(SID_ATTR_CHAR == nSId && GetView() && GetView()->IsTextEdit())
+ ImpAddPrintableCharactersToTextEdit(rReq, GetView());
+
+ rReq.Done();
+ return;
+ }
+ }
+
+ CheckLineTo (rReq);
+ sal_uInt16 nOldSId = 0;
+ bool bPermanent = false;
+
+ if( !mpDrawView )
+ return;
+
+ if(HasCurrentFunction())
+ {
+ if( (nSId == SID_FORMATPAINTBRUSH) && (GetCurrentFunction()->GetSlotID() == SID_TEXTEDIT) )
+ {
+ // save text edit mode for format paintbrush!
+ SetOldFunction( GetCurrentFunction() );
+ }
+ else
+ {
+ if(GetOldFunction() == GetCurrentFunction())
+ {
+ SetOldFunction(nullptr);
+ }
+ }
+
+ if ( nSId != SID_TEXTEDIT && nSId != SID_ATTR_CHAR && nSId != SID_TEXT_FITTOSIZE &&
+ nSId != SID_ATTR_CHAR_VERTICAL && nSId != SID_TEXT_FITTOSIZE_VERTICAL &&
+ nSId != SID_FORMATPAINTBRUSH &&
+ mpDrawView->IsTextEdit() )
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+
+ if( HasCurrentFunction() )
+ {
+ nOldSId = GetCurrentFunction()->GetSlotID();
+
+ if (nOldSId == nSId ||
+ ((nOldSId == SID_TEXTEDIT || nOldSId == SID_ATTR_CHAR || nOldSId == SID_TEXT_FITTOSIZE ||
+ nOldSId == SID_ATTR_CHAR_VERTICAL || nOldSId == SID_TEXT_FITTOSIZE_VERTICAL) &&
+ (nSId == SID_TEXTEDIT || nSId == SID_ATTR_CHAR || nSId == SID_TEXT_FITTOSIZE ||
+ nSId == SID_ATTR_CHAR_VERTICAL || nSId == SID_TEXT_FITTOSIZE_VERTICAL )))
+ {
+ bPermanent = true;
+ }
+
+ GetCurrentFunction()->Deactivate();
+ }
+
+ SetCurrentFunction(nullptr);
+
+ SfxBindings& rBind = GetViewFrame()->GetBindings();
+ rBind.Invalidate(nOldSId);
+ rBind.Update(nOldSId);
+ }
+
+ // for LibreOfficeKit - choosing a shape should construct it directly
+ bool bCreateDirectly = false;
+
+ switch ( nSId )
+ {
+ case SID_TEXTEDIT: // BASIC ???
+ case SID_ATTR_CHAR:
+ case SID_ATTR_CHAR_VERTICAL:
+ case SID_TEXT_FITTOSIZE:
+ case SID_TEXT_FITTOSIZE_VERTICAL:
+ {
+ SetCurrentFunction( FuText::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) );
+ GetCurrentFunction()->DoExecute(rReq);
+
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_ATTR_CHAR );
+ rBindings.Invalidate( SID_ATTR_CHAR_VERTICAL );
+ rBindings.Invalidate( SID_TEXT_FITTOSIZE );
+ rBindings.Invalidate( SID_TEXT_FITTOSIZE_VERTICAL );
+
+ // evtl. feed characters to activated textedit
+ if(SID_ATTR_CHAR == nSId && GetView() && GetView()->IsTextEdit())
+ ImpAddPrintableCharactersToTextEdit(rReq, GetView());
+
+ rReq.Done();
+
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ if (pArgs && pArgs->HasItem(FN_PARAM_1))
+ bCreateDirectly = static_cast<const SfxBoolItem&>(pArgs->Get(FN_PARAM_1)).GetValue();
+ }
+ break;
+
+ case SID_FM_CREATE_CONTROL:
+ {
+ SetCurrentFunction( FuConstructUnoControl::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent ) );
+ rReq.Done();
+ }
+ break;
+
+ case SID_FM_CREATE_FIELDCONTROL:
+ {
+ const SfxUnoAnyItem* pDescriptorItem = rReq.GetArg<SfxUnoAnyItem>(SID_FM_DATACCESS_DESCRIPTOR);
+ DBG_ASSERT( pDescriptorItem, "DrawViewShell::FuPermanent(SID_FM_CREATE_FIELDCONTROL): invalid request args!" );
+
+ if(pDescriptorItem)
+ {
+ // get the form view
+ FmFormView* pFormView = mpDrawView.get();
+ SdrPageView* pPageView = pFormView ? pFormView->GetSdrPageView() : nullptr;
+
+ if(pPageView)
+ {
+ svx::ODataAccessDescriptor aDescriptor(pDescriptorItem->GetValue());
+ SdrObjectUniquePtr pNewDBField = pFormView->CreateFieldControl(aDescriptor);
+
+ if(pNewDBField)
+ {
+ ::tools::Rectangle aVisArea = GetActiveWindow()->PixelToLogic(::tools::Rectangle(Point(0,0), GetActiveWindow()->GetOutputSizePixel()));
+ Point aObjPos(aVisArea.Center());
+ Size aObjSize(pNewDBField->GetLogicRect().GetSize());
+ aObjPos.AdjustX( -(aObjSize.Width() / 2) );
+ aObjPos.AdjustY( -(aObjSize.Height() / 2) );
+ ::tools::Rectangle aNewObjectRectangle(aObjPos, aObjSize);
+
+ pNewDBField->SetLogicRect(aNewObjectRectangle);
+
+ GetView()->InsertObjectAtView(pNewDBField.release(), *pPageView);
+ }
+ }
+ }
+ rReq.Done();
+ }
+ break;
+
+ case SID_OBJECT_SELECT:
+ case SID_OBJECT_ROTATE:
+ case SID_OBJECT_MIRROR:
+ case SID_OBJECT_CROP:
+ case SID_OBJECT_TRANSPARENCE:
+ case SID_OBJECT_GRADIENT:
+ case SID_OBJECT_SHEAR:
+ case SID_OBJECT_CROOK_ROTATE:
+ case SID_OBJECT_CROOK_SLANT:
+ case SID_OBJECT_CROOK_STRETCH:
+ case SID_CONVERT_TO_3D_LATHE:
+ {
+ sal_uInt16 nSlotId = rReq.GetSlot();
+
+ // toggle function
+ if( nOldSId == nSlotId )
+ {
+ nSlotId = SID_OBJECT_SELECT;
+ rReq.SetSlot( nSlotId );
+ }
+
+ if (nSlotId == SID_OBJECT_CROOK_ROTATE ||
+ nSlotId == SID_OBJECT_CROOK_SLANT ||
+ nSlotId == SID_OBJECT_CROOK_STRETCH)
+ {
+ if ( mpDrawView->GetMarkedObjectList().GetMarkCount() > 0 &&
+ !mpDrawView->IsCrookAllowed( mpDrawView->IsCrookNoContortion() ) )
+ {
+ if ( mpDrawView->IsPresObjSelected() )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Question, VclButtonsType::YesNo,
+ SdResId(STR_ASK_FOR_CONVERT_TO_BEZIER)));
+ if (xQueryBox->run() == RET_YES )
+ {
+ // implicit transformation into bezier
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->ConvertMarkedToPathObj(false);
+ }
+ }
+ }
+ }
+ else if (nSlotId == SID_OBJECT_SHEAR)
+ {
+ size_t i = 0;
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ const size_t nMarkCnt = rMarkList.GetMarkCount();
+ bool b3DObjMarked = false;
+
+ while (i < nMarkCnt && !b3DObjMarked)
+ {
+ if (nullptr != dynamic_cast< E3dObject *>( rMarkList.GetMark(i)->GetMarkedSdrObj() ))
+ {
+ b3DObjMarked = true;
+ }
+ else
+ {
+ i++;
+ }
+ }
+
+ if ( nMarkCnt > 0 && !b3DObjMarked &&
+ (!mpDrawView->IsShearAllowed() || !mpDrawView->IsDistortAllowed()) )
+ {
+ if ( mpDrawView->IsPresObjSelected() )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Question, VclButtonsType::YesNo,
+ SdResId(STR_ASK_FOR_CONVERT_TO_BEZIER)));
+ if (xQueryBox->run() == RET_YES)
+ {
+ // implicit transformation into bezier
+ weld::WaitObject aWait(GetFrameWeld());
+ mpDrawView->ConvertMarkedToPathObj(false);
+ }
+ }
+ }
+ }
+
+ SetCurrentFunction( FuSelection::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq) );
+ rReq.Done();
+ Invalidate( SID_OBJECT_SELECT );
+ }
+ break;
+
+ case SID_DRAW_LINE:
+ case SID_DRAW_XLINE:
+ case SID_DRAW_MEASURELINE:
+ case SID_LINE_ARROW_START:
+ case SID_LINE_ARROW_END:
+ case SID_LINE_ARROWS:
+ case SID_LINE_ARROW_CIRCLE:
+ case SID_LINE_CIRCLE_ARROW:
+ case SID_LINE_ARROW_SQUARE:
+ case SID_LINE_SQUARE_ARROW:
+
+ case SID_DRAW_RECT:
+ case SID_DRAW_RECT_NOFILL:
+ case SID_DRAW_RECT_ROUND:
+ case SID_DRAW_RECT_ROUND_NOFILL:
+ case SID_DRAW_SQUARE:
+ case SID_DRAW_SQUARE_NOFILL:
+ case SID_DRAW_SQUARE_ROUND:
+ case SID_DRAW_SQUARE_ROUND_NOFILL:
+ case SID_DRAW_ELLIPSE:
+ case SID_DRAW_ELLIPSE_NOFILL:
+ case SID_DRAW_CIRCLE:
+ case SID_DRAW_CIRCLE_NOFILL:
+ case SID_DRAW_CAPTION:
+ case SID_DRAW_CAPTION_VERTICAL:
+ case SID_TOOL_CONNECTOR:
+ case SID_CONNECTOR_ARROW_START:
+ case SID_CONNECTOR_ARROW_END:
+ case SID_CONNECTOR_ARROWS:
+ case SID_CONNECTOR_CIRCLE_START:
+ case SID_CONNECTOR_CIRCLE_END:
+ case SID_CONNECTOR_CIRCLES:
+ case SID_CONNECTOR_LINE:
+ case SID_CONNECTOR_LINE_ARROW_START:
+ case SID_CONNECTOR_LINE_ARROW_END:
+ case SID_CONNECTOR_LINE_ARROWS:
+ case SID_CONNECTOR_LINE_CIRCLE_START:
+ case SID_CONNECTOR_LINE_CIRCLE_END:
+ case SID_CONNECTOR_LINE_CIRCLES:
+ case SID_CONNECTOR_CURVE:
+ case SID_CONNECTOR_CURVE_ARROW_START:
+ case SID_CONNECTOR_CURVE_ARROW_END:
+ case SID_CONNECTOR_CURVE_ARROWS:
+ case SID_CONNECTOR_CURVE_CIRCLE_START:
+ case SID_CONNECTOR_CURVE_CIRCLE_END:
+ case SID_CONNECTOR_CURVE_CIRCLES:
+ case SID_CONNECTOR_LINES:
+ case SID_CONNECTOR_LINES_ARROW_START:
+ case SID_CONNECTOR_LINES_ARROW_END:
+ case SID_CONNECTOR_LINES_ARROWS:
+ case SID_CONNECTOR_LINES_CIRCLE_START:
+ case SID_CONNECTOR_LINES_CIRCLE_END:
+ case SID_CONNECTOR_LINES_CIRCLES:
+ case SID_INSERT_SIGNATURELINE:
+ {
+ bCreateDirectly = comphelper::LibreOfficeKit::isActive();
+ SetCurrentFunction( FuConstructRectangle::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent ) );
+ rReq.Done();
+ }
+ break;
+ case SID_DRAW_POLYGON:
+ case SID_DRAW_POLYGON_NOFILL:
+ case SID_DRAW_XPOLYGON:
+ case SID_DRAW_XPOLYGON_NOFILL:
+ case SID_DRAW_FREELINE:
+ case SID_DRAW_FREELINE_NOFILL:
+ case SID_DRAW_BEZIER_FILL: // BASIC
+ case SID_DRAW_BEZIER_NOFILL: // BASIC
+ {
+ SetCurrentFunction( FuConstructBezierPolygon::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent) );
+ rReq.Done();
+ }
+ break;
+
+ case SID_GLUE_EDITMODE:
+ {
+ if (nOldSId != SID_GLUE_EDITMODE)
+ {
+ SetCurrentFunction( FuEditGluePoints::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent ) );
+ }
+ else
+ {
+ GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+ }
+
+ rReq.Done();
+ }
+ break;
+
+ case SID_DRAW_ARC:
+ case SID_DRAW_CIRCLEARC:
+ case SID_DRAW_PIE:
+ case SID_DRAW_PIE_NOFILL:
+ case SID_DRAW_CIRCLEPIE:
+ case SID_DRAW_CIRCLEPIE_NOFILL:
+ case SID_DRAW_ELLIPSECUT:
+ case SID_DRAW_ELLIPSECUT_NOFILL:
+ case SID_DRAW_CIRCLECUT:
+ case SID_DRAW_CIRCLECUT_NOFILL:
+ {
+ SetCurrentFunction( FuConstructArc::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent) );
+ rReq.Done();
+ }
+ break;
+
+ case SID_3D_CUBE:
+ case SID_3D_SHELL:
+ case SID_3D_SPHERE:
+ case SID_3D_TORUS:
+ case SID_3D_HALF_SPHERE:
+ case SID_3D_CYLINDER:
+ case SID_3D_CONE:
+ case SID_3D_PYRAMID:
+ {
+ SetCurrentFunction( FuConstruct3dObject::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent ) );
+ rReq.Done();
+ }
+ break;
+
+ case SID_DRAWTBX_CS_BASIC :
+ case SID_DRAWTBX_CS_SYMBOL :
+ case SID_DRAWTBX_CS_ARROW :
+ case SID_DRAWTBX_CS_FLOWCHART :
+ case SID_DRAWTBX_CS_CALLOUT :
+ case SID_DRAWTBX_CS_STAR :
+ case SID_DRAW_CS_ID :
+ {
+ SetCurrentFunction( FuConstructCustomShape::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq, bPermanent ) );
+ rReq.Done();
+
+ bCreateDirectly = comphelper::LibreOfficeKit::isActive();
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ if (pArgs && pArgs->HasItem(FN_PARAM_1))
+ {
+ bCreateDirectly = static_cast<const SfxBoolItem&>(pArgs->Get(FN_PARAM_1)).GetValue();
+ }
+
+ if ( nSId != SID_DRAW_CS_ID )
+ {
+ SfxBindings& rBind = GetViewFrame()->GetBindings();
+ rBind.Invalidate( nSId );
+ rBind.Update( nSId );
+ }
+ }
+ break;
+
+ case SID_FORMATPAINTBRUSH:
+ {
+ SetCurrentFunction( FuFormatPaintBrush::Create( this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ rReq.Done();
+ SfxBindings& rBind = GetViewFrame()->GetBindings();
+ rBind.Invalidate( nSId );
+ rBind.Update( nSId );
+ break;
+ }
+
+ case SID_ZOOM_MODE:
+ case SID_ZOOM_PANNING:
+ {
+ if (nOldSId != nSId)
+ {
+ mbZoomOnPage = false;
+ SetCurrentFunction( FuZoom::Create(this, GetActiveWindow(), mpDrawView.get(), GetDoc(), rReq ) );
+ }
+ else
+ {
+ GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+ }
+ rReq.Done();
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if(HasOldFunction())
+ {
+ sal_uInt16 nSlotId = GetOldFunction()->GetSlotID();
+
+ GetOldFunction()->Deactivate();
+ SetOldFunction(nullptr);
+
+ SfxBindings& rBind = GetViewFrame()->GetBindings();
+ rBind.Invalidate( nSlotId );
+ rBind.Update( nSlotId );
+ }
+
+ if(HasCurrentFunction())
+ {
+ GetCurrentFunction()->Activate();
+ SetOldFunction( GetCurrentFunction() );
+ }
+
+ // invalidate shell, is faster than every individually (says MI)
+ // now explicit the last slot incl. Update()
+ Invalidate();
+
+ // CTRL-SID_OBJECT_SELECT -> select first draw object if none is selected yet
+ if(SID_OBJECT_SELECT == nSId && HasCurrentFunction() && (rReq.GetModifier() & KEY_MOD1))
+ {
+ if(!GetView()->AreObjectsMarked())
+ {
+ // select first object
+ GetView()->UnmarkAllObj();
+ GetView()->MarkNextObj(true);
+
+ // ...and make it visible
+ if(GetView()->AreObjectsMarked())
+ GetView()->MakeVisible(GetView()->GetAllMarkedRect(), *GetActiveWindow());
+ }
+ }
+
+ // with qualifier construct directly
+ if(!(HasCurrentFunction() && ((rReq.GetModifier() & KEY_MOD1) || bCreateDirectly)))
+ return;
+
+ // disable interactive drawing for LOK
+ if (bCreateDirectly)
+ GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+
+ // get SdOptions
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType());
+ sal_uInt32 nDefaultObjectSizeWidth(pOptions->GetDefaultObjectSizeWidth());
+ sal_uInt32 nDefaultObjectSizeHeight(pOptions->GetDefaultObjectSizeHeight());
+
+ // calc position and size
+ ::tools::Rectangle aVisArea = GetActiveWindow()->PixelToLogic(::tools::Rectangle(Point(0,0), GetActiveWindow()->GetOutputSizePixel()));
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ // aVisArea is nonsensical in the LOK case, use the slide size
+ aVisArea = ::tools::Rectangle(Point(), getCurrentPage()->GetSize());
+ }
+
+ Point aPagePos = aVisArea.Center();
+ aPagePos.AdjustX( -sal_Int32(nDefaultObjectSizeWidth / 2) );
+ aPagePos.AdjustY( -sal_Int32(nDefaultObjectSizeHeight / 2) );
+ ::tools::Rectangle aNewObjectRectangle(aPagePos, Size(nDefaultObjectSizeWidth, nDefaultObjectSizeHeight));
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+
+ if(!pPageView)
+ return;
+
+ // create the default object
+ SdrObjectUniquePtr pObj = GetCurrentFunction()->CreateDefaultObject(nSId, aNewObjectRectangle);
+
+ if(!pObj)
+ return;
+
+ auto pObjTmp = pObj.get();
+ // insert into page
+ GetView()->InsertObjectAtView(pObj.release(), *pPageView);
+
+ // Now that pFuActual has done what it was created for we
+ // can switch on the edit mode for callout objects.
+ switch (nSId)
+ {
+ case SID_DRAW_CAPTION:
+ case SID_DRAW_CAPTION_VERTICAL:
+ {
+ // Make FuText the current function.
+ SfxUInt16Item aItem (SID_TEXTEDIT, 1);
+ GetViewFrame()->GetDispatcher()->
+ ExecuteList(SID_TEXTEDIT, SfxCallMode::SYNCHRON |
+ SfxCallMode::RECORD, { &aItem });
+ // Put text object into edit mode.
+ GetView()->SdrBeginTextEdit(static_cast<SdrTextObj*>(pObjTmp), pPageView);
+ break;
+ }
+ }
+}
+
+void DrawViewShell::FuDeleteSelectedObjects()
+{
+ if( !mpDrawView )
+ return;
+
+ bool bConsumed = false;
+
+ //if any placeholders are selected
+ if (mpDrawView->IsPresObjSelected(false))
+ {
+ //If there are placeholders in the list which can be toggled
+ //off in edit->master->master elements then do that here,
+ std::vector<SdrObject*> aPresMarksToRemove;
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ for (size_t i=0; i < rMarkList.GetMarkCount(); ++i)
+ {
+ SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
+ SdPage* pPage = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject());
+ PresObjKind eKind = pPage->GetPresObjKind(pObj);
+ if (eKind == PresObjKind::Footer || eKind == PresObjKind::Header ||
+ eKind == PresObjKind::DateTime || eKind == PresObjKind::SlideNumber)
+ {
+ aPresMarksToRemove.push_back(pObj);
+ }
+ }
+
+ for (SdrObject* pObj : aPresMarksToRemove)
+ {
+ //Unmark object
+ mpDrawView->MarkObj(pObj, mpDrawView->GetSdrPageView(), true);
+ SdPage* pPage = static_cast<SdPage*>(pObj->getSdrPageFromSdrObject());
+ //remove placeholder from master page
+ pPage->DestroyDefaultPresObj(pPage->GetPresObjKind(pObj));
+ }
+
+ bConsumed = true;
+ }
+
+ // placeholders which cannot be deleted selected
+ if (mpDrawView->IsPresObjSelected(false, true, false, true))
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ bConsumed = true;
+ }
+
+ if (bConsumed)
+ return;
+
+ vcl::KeyCode aKCode(KEY_DELETE);
+ KeyEvent aKEvt( 0, aKCode);
+
+ bConsumed = mpDrawView->getSmartTags().KeyInput( aKEvt );
+
+ if (!bConsumed && HasCurrentFunction())
+ bConsumed = GetCurrentFunction()->KeyInput(aKEvt);
+
+ if (!bConsumed)
+ mpDrawView->DeleteMarked();
+}
+
+void DrawViewShell::FuSupport(SfxRequest& rReq)
+{
+ if( rReq.GetSlot() == SID_STYLE_FAMILY && rReq.GetArgs())
+ GetDocSh()->SetStyleFamily(static_cast<SfxStyleFamily>(rReq.GetArgs()->Get( SID_STYLE_FAMILY ).GetValue()));
+
+ // We do not execute a thing during a native slide show
+ if(SlideShow::IsRunning(GetViewShellBase()) &&
+ (rReq.GetSlot() != SID_PRESENTATION_END &&
+ rReq.GetSlot() != SID_SIZE_PAGE))
+ return;
+
+ CheckLineTo (rReq);
+
+ if( !mpDrawView )
+ return;
+
+ sal_uInt16 nSId = rReq.GetSlot();
+
+ switch ( nSId )
+ {
+ case SID_CLEAR_UNDO_STACK:
+ {
+ GetDocSh()->ClearUndoBuffer();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_PRESENTATION:
+ case SID_PRESENTATION_CURRENT_SLIDE:
+ case SID_REHEARSE_TIMINGS:
+ {
+ slideshowhelp::ShowSlideShow(rReq, *GetDoc());
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_PRESENTATION_END:
+ {
+ StopSlideShow();
+
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_BEZIER_EDIT:
+ {
+ mpDrawView->SetFrameDragSingles(!mpDrawView->IsFrameDragSingles());
+
+ /******************************************************************
+ * turn ObjectBar on
+ ******************************************************************/
+ if( dynamic_cast< FuSelection* >( GetCurrentFunction().get() ) || dynamic_cast< FuConstructBezierPolygon* >( GetCurrentFunction().get() ) )
+ {
+ // Tell the tool bar manager about the context change.
+ GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*this,*mpDrawView);
+ }
+
+ Invalidate(SID_BEZIER_EDIT);
+ rReq.Ignore();
+ }
+ break;
+
+ case SID_OBJECT_CLOSE:
+ {
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ if ( rMarkList.GetMark(0) && !mpDrawView->IsAction() )
+ {
+ SdrPathObj* pPathObj = static_cast<SdrPathObj*>( rMarkList.GetMark(0)->GetMarkedSdrObj());
+ const bool bUndo = mpDrawView->IsUndoEnabled();
+ if( bUndo )
+ mpDrawView->BegUndo(SdResId(STR_UNDO_BEZCLOSE));
+
+ mpDrawView->UnmarkAllPoints();
+
+ if( bUndo )
+ mpDrawView->AddUndo(std::make_unique<SdrUndoGeoObj>(*pPathObj));
+
+ pPathObj->ToggleClosed();
+
+ if( bUndo )
+ mpDrawView->EndUndo();
+ }
+ rReq.Done();
+ }
+ break;
+
+ case SID_CUT:
+ {
+ if ( mpDrawView->IsPresObjSelected(false, true, false, true) )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ //tdf#126197: EndTextEdit in all views if current one is not in TextEdit
+ if ( !mpDrawView->IsTextEdit() )
+ mpDrawView->EndTextEditAllViews();
+
+ if(HasCurrentFunction())
+ {
+ GetCurrentFunction()->DoCut();
+ }
+ else if(mpDrawView)
+ {
+ mpDrawView->DoCut();
+ }
+ }
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_COPY:
+ {
+ if ( mpDrawView->IsPresObjSelected(false, true, false, true) )
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+ else
+ {
+ if(HasCurrentFunction())
+ {
+ GetCurrentFunction()->DoCopy();
+ }
+ else if( mpDrawView )
+ {
+ mpDrawView->DoCopy();
+ }
+ }
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_PASTE:
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+
+ if(HasCurrentFunction())
+ {
+ GetCurrentFunction()->DoPaste();
+ }
+ else if(mpDrawView)
+ {
+ mpDrawView->DoPaste();
+ }
+
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_UNICODE_NOTATION_TOGGLE:
+ {
+ if( mpDrawView->IsTextEdit() )
+ {
+ OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
+ if( pOLV )
+ {
+ OUString sInput = pOLV->GetSurroundingText();
+ ESelection aSel( pOLV->GetSelection() );
+ if( aSel.nStartPos > aSel.nEndPos )
+ aSel.nEndPos = aSel.nStartPos;
+
+ //calculate a valid end-position by reading logical characters
+ sal_Int32 nUtf16Pos=0;
+ while( (nUtf16Pos < sInput.getLength()) && (nUtf16Pos < aSel.nEndPos) )
+ {
+ sInput.iterateCodePoints(&nUtf16Pos);
+ //The mouse can set the cursor in the middle of a multi-unit character,
+ // so reset to the proper end of the logical characters
+ if( nUtf16Pos > aSel.nEndPos )
+ aSel.nEndPos = nUtf16Pos;
+ }
+
+ ToggleUnicodeCodepoint aToggle;
+ while( nUtf16Pos && aToggle.AllowMoreInput( sInput[nUtf16Pos-1]) )
+ --nUtf16Pos;
+ OUString sReplacement = aToggle.ReplacementString();
+ if( !sReplacement.isEmpty() )
+ {
+ OUString sStringToReplace = aToggle.StringToReplace();
+ mpDrawView->BegUndo(sStringToReplace +"->"+ sReplacement);
+ aSel.nStartPos = aSel.nEndPos - sStringToReplace.getLength();
+ pOLV->SetSelection( aSel );
+ pOLV->InsertText(sReplacement, true);
+ mpDrawView->EndUndo();
+ }
+ }
+ }
+ }
+ break;
+
+ case SID_PASTE_UNFORMATTED:
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+
+ if(HasCurrentFunction())
+ {
+ GetCurrentFunction()->DoPasteUnformatted();
+ }
+ else if(mpDrawView)
+ {
+ TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) );
+ if (aDataHelper.GetTransferable().is())
+ {
+ sal_Int8 nAction = DND_ACTION_COPY;
+ mpDrawView->InsertData( aDataHelper,
+ GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(), GetActiveWindow()->GetOutputSizePixel() ).Center() ),
+ nAction, false, SotClipboardFormatId::STRING);
+ }
+ }
+
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_CLIPBOARD_FORMAT_ITEMS:
+ {
+ weld::WaitObject aWait(GetFrameWeld());
+ TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) );
+ const SfxItemSet* pReqArgs = rReq.GetArgs();
+ SotClipboardFormatId nFormat = SotClipboardFormatId::NONE;
+
+ if( pReqArgs )
+ {
+ const SfxUInt32Item* pIsActive = rReq.GetArg<SfxUInt32Item>(SID_CLIPBOARD_FORMAT_ITEMS);
+ nFormat = static_cast<SotClipboardFormatId>(pIsActive->GetValue());
+ }
+
+ if( nFormat != SotClipboardFormatId::NONE && aDataHelper.GetTransferable().is() )
+ {
+ sal_Int8 nAction = DND_ACTION_COPY;
+
+ if( !mpDrawView->InsertData( aDataHelper,
+ GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(), GetActiveWindow()->GetOutputSizePixel() ).Center() ),
+ nAction, false, nFormat ) )
+ {
+ INetBookmark aINetBookmark( "", "" );
+
+ if( ( aDataHelper.HasFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK ) &&
+ aDataHelper.GetINetBookmark( SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark ) ) ||
+ ( aDataHelper.HasFormat( SotClipboardFormatId::FILEGRPDESCRIPTOR ) &&
+ aDataHelper.GetINetBookmark( SotClipboardFormatId::FILEGRPDESCRIPTOR, aINetBookmark ) ) ||
+ ( aDataHelper.HasFormat( SotClipboardFormatId::UNIFORMRESOURCELOCATOR ) &&
+ aDataHelper.GetINetBookmark( SotClipboardFormatId::UNIFORMRESOURCELOCATOR, aINetBookmark ) ) )
+ {
+ InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), "" );
+ }
+ }
+ }
+ }
+ break;
+
+ case SID_DELETE:
+ {
+ if ( mpDrawView->IsTextEdit() )
+ {
+ OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
+
+ if (pOLV)
+ {
+ vcl::KeyCode aKCode(KEY_DELETE);
+ KeyEvent aKEvt( 0, aKCode);
+ // We use SdrObjEditView to handle DEL for underflow handling
+ (void)mpDrawView->KeyInput(aKEvt, nullptr);
+ }
+ }
+ else
+ {
+ mpDrawView->EndTextEditAllViews();
+ FuDeleteSelectedObjects();
+ }
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_NOTES_MODE:
+ case SID_SLIDE_MASTER_MODE:
+ case SID_NOTES_MASTER_MODE:
+ case SID_HANDOUT_MASTER_MODE:
+
+ // AutoLayouts have to be ready.
+ GetDoc()->StopWorkStartupDelay();
+ [[fallthrough]];
+
+ case SID_DRAWINGMODE:
+ case SID_SLIDE_SORTER_MODE:
+ case SID_OUTLINE_MODE:
+ // Let the sub-shell manager handle the slot handling.
+ framework::FrameworkHelper::Instance(GetViewShellBase())->HandleModeChangeSlot(
+ nSId,
+ rReq);
+ rReq.Ignore ();
+ break;
+
+ case SID_MASTERPAGE: // BASIC
+ {
+ if (comphelper::LibreOfficeKit::isActive())
+ GetViewShell()->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED,
+ ".uno:SlideMasterPage=true");
+
+ // AutoLayouts needs to be finished
+ GetDoc()->StopWorkStartupDelay();
+
+ const SfxItemSet* pReqArgs = rReq.GetArgs();
+
+ if ( pReqArgs )
+ {
+ const SfxBoolItem* pIsActive = rReq.GetArg<SfxBoolItem>(SID_MASTERPAGE);
+ mbIsLayerModeActive = pIsActive->GetValue ();
+ }
+
+ Broadcast (
+ ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START));
+
+ // turn on default layer of MasterPage
+ mpDrawView->SetActiveLayer(sUNO_LayerName_background_objects);
+
+ ChangeEditMode(EditMode::MasterPage, mbIsLayerModeActive);
+
+ if(HasCurrentFunction(SID_BEZIER_EDIT))
+ GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+
+ Broadcast (
+ ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END));
+
+ InvalidateWindows();
+ Invalidate();
+
+ rReq.Done();
+ }
+ break;
+
+ case SID_CLOSE_MASTER_VIEW:
+ {
+ // Notify of disabling master view, which is enabled in DrawViewShell::ChangeEditMode.
+ if (comphelper::LibreOfficeKit::isActive())
+ GetViewShell()->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED,
+ ".uno:SlideMasterPage=false");
+
+ Broadcast (
+ ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START));
+
+ // Switch page back to the first one. Not doing so leads to a
+ // crash. This seems to be some bug in the edit mode switching
+ // and page switching methods.
+ SwitchPage (0);
+ ChangeEditMode(EditMode::Page, IsLayerModeActive());
+ Broadcast (
+ ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END));
+
+ if(HasCurrentFunction(SID_BEZIER_EDIT))
+ {
+ GetViewFrame()->GetDispatcher()->Execute(
+ SID_OBJECT_SELECT,
+ SfxCallMode::ASYNCHRON);
+ }
+
+ rReq.Done();
+ }
+ break;
+
+ case SID_RULER:
+ {
+ const SfxItemSet* pReqArgs = rReq.GetArgs();
+
+ // Remember old ruler state
+ bool bOldHasRuler(HasRuler());
+
+ if ( pReqArgs )
+ {
+ const SfxBoolItem* pIsActive = rReq.GetArg<SfxBoolItem>(SID_RULER);
+ SetRuler (pIsActive->GetValue ());
+ }
+ else SetRuler (!HasRuler());
+
+ // Did ruler state change? Tell that to SdOptions, too.
+ bool bHasRuler(HasRuler());
+
+ if(bOldHasRuler != bHasRuler)
+ {
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType());
+
+ if(pOptions && pOptions->IsRulerVisible() != bHasRuler)
+ {
+ pOptions->SetRulerVisible(bHasRuler);
+ }
+ }
+
+ Invalidate (SID_RULER);
+ Resize();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_SIZE_PAGE:
+ case SID_SIZE_PAGE_WIDTH: // BASIC
+ {
+ mbZoomOnPage = ( rReq.GetSlot() == SID_SIZE_PAGE );
+
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+
+ if ( pPageView )
+ {
+ Point aPagePos(0, 0); // = pPageView->GetOffset();
+ Size aPageSize = pPageView->GetPage()->GetSize();
+
+ aPagePos.AdjustX(aPageSize.Width() / 2 );
+ aPageSize.setWidth( static_cast<::tools::Long>(aPageSize.Width() * 1.03) );
+
+ if( rReq.GetSlot() == SID_SIZE_PAGE )
+ {
+ aPagePos.AdjustY(aPageSize.Height() / 2 );
+ aPageSize.setHeight( static_cast<::tools::Long>(aPageSize.Height() * 1.03) );
+ aPagePos.AdjustY( -(aPageSize.Height() / 2) );
+ }
+ else
+ {
+ Point aPt = GetActiveWindow()->PixelToLogic( Point( 0, GetActiveWindow()->GetSizePixel().Height() / 2 ) );
+ aPagePos.AdjustY(aPt.Y() );
+ aPageSize.setHeight( 2 );
+ }
+
+ aPagePos.AdjustX( -(aPageSize.Width() / 2) );
+
+ SetZoomRect( ::tools::Rectangle( aPagePos, aPageSize ) );
+
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0),
+ GetActiveWindow()->GetOutputSizePixel()) );
+ mpZoomList->InsertZoomRect(aVisAreaWin);
+ }
+ Invalidate( SID_ZOOM_IN );
+ Invalidate( SID_ZOOM_OUT );
+ Invalidate( SID_ZOOM_PANNING );
+ rReq.Done ();
+ }
+ break;
+
+ case SID_SIZE_REAL: // BASIC
+ {
+ mbZoomOnPage = false;
+ SetZoom( 100 );
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0),
+ GetActiveWindow()->GetOutputSizePixel()) );
+ mpZoomList->InsertZoomRect(aVisAreaWin);
+ Invalidate( SID_ZOOM_IN );
+ Invalidate( SID_ZOOM_OUT );
+ Invalidate( SID_ZOOM_PANNING );
+ rReq.Done ();
+ }
+ break;
+
+ case SID_ZOOM_OUT: // BASIC
+ {
+ mbZoomOnPage = false;
+ SetZoom( std::max<::tools::Long>( GetActiveWindow()->GetZoom() / 2, GetActiveWindow()->GetMinZoom() ) );
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0),
+ GetActiveWindow()->GetOutputSizePixel()) );
+ mpZoomList->InsertZoomRect(aVisAreaWin);
+ Invalidate( SID_ZOOM_IN );
+ Invalidate( SID_ZOOM_OUT );
+ Invalidate( SID_ZOOM_PANNING );
+ rReq.Done ();
+ }
+ break;
+
+ case SID_ZOOM_IN:
+ {
+ mbZoomOnPage = false;
+ SetZoom( std::min<::tools::Long>( GetActiveWindow()->GetZoom() * 2, GetActiveWindow()->GetMaxZoom() ) );
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0),
+ GetActiveWindow()->GetOutputSizePixel()) );
+ mpZoomList->InsertZoomRect(aVisAreaWin);
+ Invalidate( SID_ZOOM_IN );
+ Invalidate(SID_ZOOM_OUT);
+ Invalidate( SID_ZOOM_PANNING );
+ rReq.Done ();
+ }
+ break;
+
+ case SID_SIZE_VISAREA:
+ {
+ ::tools::Rectangle aVisArea = mpFrameView->GetVisArea();
+ Size aVisAreaSize = aVisArea.GetSize();
+
+ if (!aVisAreaSize.IsEmpty())
+ {
+ mbZoomOnPage = false;
+ SetZoomRect(aVisArea);
+ Invalidate( SID_ZOOM_IN );
+ Invalidate( SID_ZOOM_OUT );
+ Invalidate( SID_ZOOM_PANNING );
+ }
+ rReq.Done ();
+ }
+ break;
+
+ // name confusion: SID_SIZE_OPTIMAL -> Zoom onto selected objects
+ // --> Is offered as object zoom in program
+ case SID_SIZE_OPTIMAL: // BASIC
+ {
+ mbZoomOnPage = false;
+ if ( mpDrawView->AreObjectsMarked() )
+ {
+ maMarkRect = mpDrawView->GetAllMarkedRect();
+ ::tools::Long nW = static_cast<::tools::Long>(maMarkRect.GetWidth() * 1.03);
+ ::tools::Long nH = static_cast<::tools::Long>(maMarkRect.GetHeight() * 1.03);
+ Point aPos = maMarkRect.Center();
+ aPos.AdjustX( -(nW / 2) );
+ aPos.AdjustY( -(nH / 2) );
+ if ( nW && nH )
+ {
+ SetZoomRect(::tools::Rectangle(aPos, Size(nW, nH)));
+
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0),
+ GetActiveWindow()->GetOutputSizePixel()) );
+ mpZoomList->InsertZoomRect(aVisAreaWin);
+ }
+ }
+ Invalidate( SID_ZOOM_IN );
+ Invalidate( SID_ZOOM_OUT );
+ Invalidate( SID_ZOOM_PANNING );
+ rReq.Done ();
+ }
+ break;
+
+ // name confusion: SID_SIZE_ALL -> Zoom onto all objects
+ // --> Is offered as optimal in program
+ case SID_SIZE_ALL: // BASIC
+ {
+ mbZoomOnPage = false;
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+
+ if( pPageView )
+ {
+ ::tools::Rectangle aBoundRect( pPageView->GetObjList()->GetAllObjBoundRect() );
+
+ ::tools::Long nW = static_cast<::tools::Long>(aBoundRect.GetWidth() * 1.03);
+ ::tools::Long nH = static_cast<::tools::Long>(aBoundRect.GetHeight() * 1.03);
+ Point aPos = aBoundRect.Center();
+ aPos.AdjustX( -(nW / 2) );
+ aPos.AdjustY( -(nH / 2) );
+ if ( nW && nH )
+ {
+ SetZoomRect( ::tools::Rectangle( aPos, Size( nW, nH ) ) );
+
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0),
+ GetActiveWindow()->GetOutputSizePixel()) );
+ mpZoomList->InsertZoomRect(aVisAreaWin);
+ }
+
+ Invalidate( SID_ZOOM_IN );
+ Invalidate( SID_ZOOM_OUT );
+ Invalidate( SID_ZOOM_PANNING );
+ }
+ rReq.Done ();
+ }
+ break;
+
+ case SID_ZOOM_PREV:
+ {
+ if (mpDrawView->IsTextEdit())
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+
+ if (mpZoomList->IsPreviousPossible())
+ {
+ // set previous ZoomRect
+ SetZoomRect(mpZoomList->GetPreviousZoomRect());
+ }
+ rReq.Done ();
+ }
+ break;
+
+ case SID_ZOOM_NEXT:
+ {
+ if (mpDrawView->IsTextEdit())
+ {
+ mpDrawView->SdrEndTextEdit();
+ }
+
+ if (mpZoomList->IsNextPossible())
+ {
+ // set next ZoomRect
+ SetZoomRect(mpZoomList->GetNextZoomRect());
+ }
+ rReq.Done ();
+ }
+ break;
+
+ case SID_GLUE_INSERT_POINT:
+ case SID_GLUE_PERCENT:
+ case SID_GLUE_ESCDIR:
+ case SID_GLUE_ESCDIR_LEFT:
+ case SID_GLUE_ESCDIR_RIGHT:
+ case SID_GLUE_ESCDIR_TOP:
+ case SID_GLUE_ESCDIR_BOTTOM:
+ case SID_GLUE_HORZALIGN_CENTER:
+ case SID_GLUE_HORZALIGN_LEFT:
+ case SID_GLUE_HORZALIGN_RIGHT:
+ case SID_GLUE_VERTALIGN_CENTER:
+ case SID_GLUE_VERTALIGN_TOP:
+ case SID_GLUE_VERTALIGN_BOTTOM:
+ {
+ rtl::Reference<FuPoor> xFunc( GetCurrentFunction() );
+ FuEditGluePoints* pFunc = dynamic_cast< FuEditGluePoints* >( xFunc.get() );
+
+ if(pFunc)
+ pFunc->ReceiveRequest(rReq);
+
+ rReq.Done();
+ }
+ break;
+
+ case SID_AUTOSPELL_CHECK:
+ {
+ bool bOnlineSpell;
+ const SfxPoolItem* pItem;
+
+ if (rReq.GetArgs()->HasItem(FN_PARAM_1, &pItem))
+ bOnlineSpell = static_cast<const SfxBoolItem*>(pItem)->GetValue();
+ else // Toggle
+ bOnlineSpell = !GetDoc()->GetOnlineSpell();
+
+ GetDoc()->SetOnlineSpell(bOnlineSpell);
+
+ ::Outliner* pOL = mpDrawView->GetTextEditOutliner();
+
+ if (pOL)
+ {
+ EEControlBits nCntrl = pOL->GetControlWord();
+
+ if (bOnlineSpell)
+ nCntrl |= EEControlBits::ONLINESPELLING;
+ else
+ nCntrl &= ~EEControlBits::ONLINESPELLING;
+
+ pOL->SetControlWord(nCntrl);
+ }
+
+ GetActiveWindow()->Invalidate();
+ rReq.Done ();
+ }
+ break;
+
+ case SID_TRANSLITERATE_SENTENCE_CASE:
+ case SID_TRANSLITERATE_TITLE_CASE:
+ case SID_TRANSLITERATE_TOGGLE_CASE:
+ case SID_TRANSLITERATE_UPPER:
+ case SID_TRANSLITERATE_LOWER:
+ case SID_TRANSLITERATE_HALFWIDTH:
+ case SID_TRANSLITERATE_FULLWIDTH:
+ case SID_TRANSLITERATE_HIRAGANA:
+ case SID_TRANSLITERATE_KATAKANA:
+ {
+ OutlinerView* pOLV = GetView()->GetTextEditOutlinerView();
+ if( pOLV )
+ {
+ TransliterationFlags nType = TransliterationFlags::NONE;
+
+ switch( nSId )
+ {
+ case SID_TRANSLITERATE_SENTENCE_CASE:
+ nType = TransliterationFlags::SENTENCE_CASE;
+ break;
+ case SID_TRANSLITERATE_TITLE_CASE:
+ nType = TransliterationFlags::TITLE_CASE;
+ break;
+ case SID_TRANSLITERATE_TOGGLE_CASE:
+ nType = TransliterationFlags::TOGGLE_CASE;
+ break;
+ case SID_TRANSLITERATE_UPPER:
+ nType = TransliterationFlags::LOWERCASE_UPPERCASE;
+ break;
+ case SID_TRANSLITERATE_LOWER:
+ nType = TransliterationFlags::UPPERCASE_LOWERCASE;
+ break;
+ case SID_TRANSLITERATE_HALFWIDTH:
+ nType = TransliterationFlags::FULLWIDTH_HALFWIDTH;
+ break;
+ case SID_TRANSLITERATE_FULLWIDTH:
+ nType = TransliterationFlags::HALFWIDTH_FULLWIDTH;
+ break;
+ case SID_TRANSLITERATE_HIRAGANA:
+ nType = TransliterationFlags::KATAKANA_HIRAGANA;
+ break;
+ case SID_TRANSLITERATE_KATAKANA:
+ nType = TransliterationFlags::HIRAGANA_KATAKANA;
+ break;
+ }
+
+ pOLV->TransliterateText( nType );
+ }
+
+ rReq.Done();
+ }
+ break;
+
+ // #UndoRedo#
+ case SID_UNDO :
+ {
+ // moved implementation to BaseClass
+ ImpSidUndo(rReq);
+ }
+ break;
+ case SID_REDO :
+ {
+ // moved implementation to BaseClass
+ ImpSidRedo(rReq);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void DrawViewShell::FuSupportRotate(SfxRequest const &rReq)
+{
+ if( rReq.GetSlot() != SID_TRANSLITERATE_ROTATE_CASE )
+ return;
+
+ ::sd::View* pView = GetView();
+
+ if (!pView)
+ return;
+
+ OutlinerView* pOLV = pView->GetTextEditOutlinerView();
+
+ if (!pOLV)
+ return;
+
+ pOLV->TransliterateText( m_aRotateCase.getNextMode() );
+}
+
+void DrawViewShell::InsertURLField(const OUString& rURL, const OUString& rText,
+ const OUString& rTarget)
+{
+ OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
+
+ if (pOLV)
+ {
+ ESelection aSel( pOLV->GetSelection() );
+ SvxFieldItem aURLItem( SvxURLField( rURL, rText, SvxURLFormat::Repr ), EE_FEATURE_FIELD );
+ pOLV->InsertField( aURLItem );
+ if ( aSel.nStartPos <= aSel.nEndPos )
+ aSel.nEndPos = aSel.nStartPos + 1;
+ else
+ aSel.nStartPos = aSel.nEndPos + 1;
+ pOLV->SetSelection( aSel );
+ }
+ else
+ {
+ Outliner* pOutl = GetDoc()->GetInternalOutliner();
+ pOutl->Init( OutlinerMode::TextObject );
+ OutlinerMode nOutlMode = pOutl->GetOutlinerMode();
+
+ SvxURLField aURLField(rURL, rText, SvxURLFormat::Repr);
+ aURLField.SetTargetFrame(rTarget);
+ SvxFieldItem aURLItem(aURLField, EE_FEATURE_FIELD);
+ pOutl->QuickInsertField( aURLItem, ESelection() );
+ std::optional<OutlinerParaObject> pOutlParaObject = pOutl->CreateParaObject();
+
+ SdrRectObj* pRectObj = new SdrRectObj(
+ GetView()->getSdrModelFromSdrView(),
+ SdrObjKind::Text);
+
+ pOutl->UpdateFields();
+ pOutl->SetUpdateLayout( true );
+ Size aSize(pOutl->CalcTextSize());
+ pOutl->SetUpdateLayout( false );
+
+ Point aPos;
+ ::tools::Rectangle aRect(aPos, GetActiveWindow()->GetOutputSizePixel() );
+ aPos = aRect.Center();
+ aPos = GetActiveWindow()->PixelToLogic(aPos);
+
+ if (aPos.getX() - (aSize.Width() / 2) >= 0)
+ aPos.AdjustX( -(aSize.Width() / 2) );
+ if (aPos.getY() - (aSize.Height() / 2) >= 0)
+ aPos.AdjustY( -(aSize.Height() / 2) );
+
+ ::tools::Rectangle aLogicRect(aPos, aSize);
+ pRectObj->SetLogicRect(aLogicRect);
+ pRectObj->SetOutlinerParaObject( std::move(pOutlParaObject) );
+ mpDrawView->InsertObjectAtView(pRectObj, *mpDrawView->GetSdrPageView());
+ pOutl->Init( nOutlMode );
+ }
+}
+
+void DrawViewShell::InsertURLButton(const OUString& rURL, const OUString& rText,
+ const OUString& rTarget, const Point* pPos)
+{
+ bool bNewObj = true;
+
+ const OUString sTargetURL( ::URIHelper::SmartRel2Abs( INetURLObject( GetDocSh()->GetMedium()->GetBaseURL() ), rURL, URIHelper::GetMaybeFileHdl(), true, false,
+ INetURLObject::EncodeMechanism::WasEncoded,
+ INetURLObject::DecodeMechanism::Unambiguous ) );
+ if (mpDrawView->GetMarkedObjectList().GetMarkCount() > 0)
+ {
+ SdrObject* pMarkedObj = mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
+ if( pMarkedObj ) try
+ {
+ // change first marked object
+ if( SdrInventor::FmForm == pMarkedObj->GetObjInventor() && pMarkedObj->GetObjIdentifier() == SdrObjKind::FormButton )
+ {
+ bNewObj = false;
+
+ SdrUnoObj* pUnoCtrl = static_cast< SdrUnoObj* >( pMarkedObj );
+
+ Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), UNO_SET_THROW );
+ Reference< beans::XPropertySet > xPropSet( xControlModel, UNO_QUERY_THROW );
+
+ xPropSet->setPropertyValue("Label" , Any( rText ) );
+ xPropSet->setPropertyValue("TargetURL" , Any( sTargetURL ) );
+
+ if( !rTarget.isEmpty() )
+ xPropSet->setPropertyValue("TargetFrame" , Any( rTarget ) );
+
+ xPropSet->setPropertyValue( "ButtonType" , Any( form::FormButtonType_URL ) );
+#if HAVE_FEATURE_AVMEDIA
+ if ( ::avmedia::MediaWindow::isMediaURL( rURL, ""/*TODO?*/ ) )
+ {
+ xPropSet->setPropertyValue( "DispatchURLInternal" , Any( true ) );
+ }
+#endif
+ }
+ else
+ {
+ // add url as interaction for first selected shape
+ bNewObj = false;
+
+ SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pMarkedObj, true);
+ pInfo->meClickAction = presentation::ClickAction_DOCUMENT;
+ pInfo->SetBookmark( sTargetURL );
+ }
+ }
+ catch( uno::Exception& )
+ {
+ }
+ }
+
+ if (!bNewObj)
+ return;
+
+ try
+ {
+ SdrUnoObj* pUnoCtrl = static_cast< SdrUnoObj* >(
+ SdrObjFactory::MakeNewObject(
+ GetView()->getSdrModelFromSdrView(),
+ SdrInventor::FmForm,
+ SdrObjKind::FormButton)); //,
+ //mpDrawView->GetSdrPageView()->GetPage()));
+
+ Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), uno::UNO_SET_THROW );
+ Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY_THROW );
+
+ xPropSet->setPropertyValue( "Label" , Any( rText ) );
+ xPropSet->setPropertyValue( "TargetURL" , Any( sTargetURL ) );
+
+ if( !rTarget.isEmpty() )
+ xPropSet->setPropertyValue( "TargetFrame" , Any( rTarget ) );
+
+ xPropSet->setPropertyValue( "ButtonType" , Any( form::FormButtonType_URL ) );
+#if HAVE_FEATURE_AVMEDIA
+ if ( ::avmedia::MediaWindow::isMediaURL( rURL, ""/*TODO?*/ ) )
+ xPropSet->setPropertyValue( "DispatchURLInternal" , Any( true ) );
+#endif
+
+ Point aPos;
+
+ if (pPos)
+ {
+ aPos = *pPos;
+ }
+ else
+ {
+ aPos = ::tools::Rectangle(aPos, GetActiveWindow()->GetOutputSizePixel()).Center();
+ aPos = GetActiveWindow()->PixelToLogic(aPos);
+ }
+
+ Size aSize(4000, 1000);
+ aPos.AdjustX( -(aSize.Width() / 2) );
+ aPos.AdjustY( -(aSize.Height() / 2) );
+ pUnoCtrl->SetLogicRect(::tools::Rectangle(aPos, aSize));
+
+ SdrInsertFlags nOptions = SdrInsertFlags::SETDEFLAYER;
+
+ OSL_ASSERT (GetViewShell()!=nullptr);
+ SfxInPlaceClient* pIpClient = GetViewShell()->GetIPClient();
+ if (pIpClient!=nullptr && pIpClient->IsObjectInPlaceActive())
+ {
+ nOptions |= SdrInsertFlags::DONTMARK;
+ }
+
+ mpDrawView->InsertObjectAtView(pUnoCtrl, *mpDrawView->GetSdrPageView(), nOptions);
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+void DrawViewShell::ShowUIControls (bool bVisible)
+{
+ ViewShell::ShowUIControls (bVisible);
+ maTabControl->Show (bVisible);
+}
+
+namespace slideshowhelp
+{
+ void ShowSlideShow(SfxRequest const & rReq, SdDrawDocument &rDoc)
+ {
+ Reference< XPresentation2 > xPresentation( rDoc.getPresentation() );
+ if( !xPresentation.is() )
+ return;
+
+ sfx2::SfxNotebookBar::LockNotebookBar();
+ if (SID_REHEARSE_TIMINGS == rReq.GetSlot())
+ xPresentation->rehearseTimings();
+ else if (rDoc.getPresentationSettings().mbCustomShow)
+ {
+ //fdo#69975 if a custom show has been set, then
+ //use it whether or not we've been asked to
+ //start from the current or first slide
+ xPresentation->start();
+
+ // if the custom show not set by default, only show it.
+ if (rDoc.getPresentationSettings().mbStartCustomShow)
+ rDoc.getPresentationSettings().mbCustomShow = false;
+ }
+ else if (SID_PRESENTATION_CURRENT_SLIDE == rReq.GetSlot())
+ {
+ //If there is no custom show set, start will automatically
+ //start at the current page
+ xPresentation->start();
+ }
+ else
+ {
+ //Start at page 0, this would blow away any custom
+ //show settings if any were set
+ Sequence< PropertyValue > aArguments{ comphelper::makePropertyValue("FirstPage",
+ OUString("0")) };
+ xPresentation->startWithArguments( aArguments );
+ }
+ sfx2::SfxNotebookBar::UnlockNotebookBar();
+ }
+}
+
+void DrawViewShell::StopSlideShow()
+{
+ Reference< XPresentation2 > xPresentation( GetDoc()->getPresentation() );
+ if(xPresentation.is() && xPresentation->isRunning())
+ {
+ if( mpDrawView->IsTextEdit() )
+ mpDrawView->SdrEndTextEdit();
+
+ xPresentation->end();
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviewsf.cxx b/sd/source/ui/view/drviewsf.cxx
new file mode 100644
index 000000000..8aab2c576
--- /dev/null
+++ b/sd/source/ui/view/drviewsf.cxx
@@ -0,0 +1,826 @@
+/* -*- 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 <DrawViewShell.hxx>
+#include <com/sun/star/form/FormButtonType.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <comphelper/string.hxx>
+#include <svx/svxids.hrc>
+#include <svx/sdmetitm.hxx>
+#include <svx/hlnkitem.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/flditem.hxx>
+#include <editeng/udlnitem.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svl/whiter.hxx>
+#include <svl/eitem.hxx>
+#include <svl/intitem.hxx>
+#include <svl/itempool.hxx>
+#include <sfx2/tplpitem.hxx>
+#include <sfx2/bindings.hxx>
+#include <svx/xdef.hxx>
+#include <svx/svdoutl.hxx>
+#include <svx/svdouno.hxx>
+#include <svx/fmshell.hxx>
+#include <svl/cjkoptions.hxx>
+
+#include <app.hrc>
+
+#include <sdmod.hxx>
+#include <stlsheet.hxx>
+#include <drawview.hxx>
+#include <drawdoc.hxx>
+#include <Window.hxx>
+#include <ViewShellBase.hxx>
+#include <FormShellManager.hxx>
+#include <anminfo.hxx>
+
+#include <editeng/lspcitem.hxx>
+#include <editeng/ulspitem.hxx>
+#include <editeng/lrspitem.hxx>
+#include <editeng/escapementitem.hxx>
+#include <editeng/numitem.hxx>
+#include <editeng/adjustitem.hxx>
+#include <editeng/urlfieldhelper.hxx>
+#include <svx/nbdtmgfact.hxx>
+#include <svx/nbdtmg.hxx>
+#include <memory>
+
+using namespace com::sun::star::drawing;
+using namespace svx::sidebar;
+using namespace ::com::sun::star;
+
+namespace sd {
+
+/**
+ * Set state of controller SfxSlots
+ */
+void DrawViewShell::GetCtrlState(SfxItemSet &rSet)
+{
+ if (rSet.GetItemState(SID_RELOAD) != SfxItemState::UNKNOWN)
+ {
+ // let "last version" of SFx en/disable
+ GetViewFrame()->GetSlotState (SID_RELOAD, nullptr, &rSet);
+ }
+
+ if (SfxItemState::DEFAULT == rSet.GetItemState(SID_HYPERLINK_GETLINK))
+ {
+ SvxHyperlinkItem aHLinkItem;
+
+ OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
+
+ if (pOLV)
+ {
+ const SvxFieldData* pField = pOLV->GetFieldAtCursor();
+ if( auto pUrlField = dynamic_cast< const SvxURLField *>( pField ) )
+ {
+ aHLinkItem.SetName(pUrlField->GetRepresentation());
+ aHLinkItem.SetURL(pUrlField->GetURL());
+ aHLinkItem.SetTargetFrame(pUrlField->GetTargetFrame());
+ }
+ else
+ {
+ // use selected text as name for urls
+ OUString sReturn = pOLV->GetSelected();
+ if (sReturn.getLength() > 255)
+ sReturn = sReturn.copy(0, 255);
+ aHLinkItem.SetName(comphelper::string::stripEnd(sReturn, ' '));
+ }
+ }
+ else
+ {
+ if (mpDrawView->GetMarkedObjectList().GetMarkCount() > 0)
+ {
+ bool bFound = false;
+
+ SdrObject* pMarkedObj = mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
+ if( pMarkedObj && (SdrInventor::FmForm == pMarkedObj->GetObjInventor()) )
+ {
+ SdrUnoObj* pUnoCtrl = dynamic_cast< SdrUnoObj* >( pMarkedObj );
+
+ if(pUnoCtrl) try
+ {
+ uno::Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), uno::UNO_SET_THROW );
+ uno::Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY_THROW );
+ uno::Reference< beans::XPropertySetInfo > xPropInfo( xPropSet->getPropertySetInfo(), uno::UNO_SET_THROW );
+
+ form::FormButtonType eButtonType = form::FormButtonType_URL;
+ static const OUStringLiteral sButtonType( u"ButtonType" );
+ if(xPropInfo->hasPropertyByName( sButtonType ) && (xPropSet->getPropertyValue( sButtonType ) >>= eButtonType ) )
+ {
+ OUString aString;
+
+ // Label
+ static const OUStringLiteral sLabel( u"Label" );
+ if(xPropInfo->hasPropertyByName(sLabel))
+ {
+ if( xPropSet->getPropertyValue(sLabel) >>= aString )
+ aHLinkItem.SetName(aString);
+ }
+
+ // URL
+ static const OUStringLiteral sTargetURL( u"TargetURL" );
+ if(xPropInfo->hasPropertyByName(sTargetURL))
+ {
+ if( xPropSet->getPropertyValue(sTargetURL) >>= aString )
+ aHLinkItem.SetURL(aString);
+ }
+
+ // Target
+ static const OUStringLiteral sTargetFrame( u"TargetFrame" );
+ if(xPropInfo->hasPropertyByName(sTargetFrame) )
+ {
+ if( xPropSet->getPropertyValue(sTargetFrame) >>= aString )
+ aHLinkItem.SetTargetFrame(aString);
+ }
+
+ aHLinkItem.SetInsertMode(HLINK_BUTTON);
+ bFound = true;
+ }
+ }
+ catch( uno::Exception& )
+ {
+ }
+ }
+
+ // try interaction link
+ if( !bFound && pMarkedObj )
+ {
+ SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pMarkedObj);
+ if( pInfo && (pInfo->meClickAction == presentation::ClickAction_DOCUMENT) )
+ aHLinkItem.SetURL( pInfo->GetBookmark());
+ aHLinkItem.SetInsertMode(HLINK_BUTTON);
+ }
+ }
+ }
+
+ rSet.Put(aHLinkItem);
+ }
+ rSet.Put( SfxBoolItem( SID_READONLY_MODE, mbReadOnly ) );
+
+ // output quality
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_OUTPUT_QUALITY_COLOR ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_OUTPUT_QUALITY_GRAYSCALE ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_OUTPUT_QUALITY_BLACKWHITE ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_OUTPUT_QUALITY_CONTRAST ) )
+ {
+ const sal_uLong nMode = static_cast<sal_Int32>(GetActiveWindow()->GetOutDev()->GetDrawMode());
+ rSet.Put( SfxBoolItem( SID_OUTPUT_QUALITY_COLOR, sal_uLong(OUTPUT_DRAWMODE_COLOR) == nMode ) );
+ rSet.Put( SfxBoolItem( SID_OUTPUT_QUALITY_GRAYSCALE, static_cast<sal_uLong>(OUTPUT_DRAWMODE_GRAYSCALE) == nMode ) );
+ rSet.Put( SfxBoolItem( SID_OUTPUT_QUALITY_BLACKWHITE, static_cast<sal_uLong>(OUTPUT_DRAWMODE_BLACKWHITE) == nMode ) );
+ rSet.Put( SfxBoolItem( SID_OUTPUT_QUALITY_CONTRAST, static_cast<sal_uLong>(OUTPUT_DRAWMODE_CONTRAST) == nMode ) );
+ }
+
+ if ( SfxItemState::DEFAULT == rSet.GetItemState(SID_MAIL_SCROLLBODY_PAGEDOWN) )
+ {
+ rSet.Put( SfxBoolItem( SID_MAIL_SCROLLBODY_PAGEDOWN, true ) );
+ }
+
+ if ( SfxItemState::DEFAULT == rSet.GetItemState(SID_ATTR_YEAR2000) )
+ {
+ FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell();
+ if (pFormShell != nullptr)
+ {
+ sal_uInt16 nState = 0;
+ if (pFormShell->GetY2KState(nState))
+ rSet.Put( SfxUInt16Item( SID_ATTR_YEAR2000, nState ) );
+ else
+ rSet.DisableItem( SID_ATTR_YEAR2000 );
+ }
+ }
+
+ if ( !GetView()->GetTextEditOutliner() )
+ {
+ if( !SvtCJKOptions::IsChangeCaseMapEnabled() )
+ {
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, false );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, false );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, false );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAKANA, false );
+ }
+ else
+ {
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, true );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, true );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, true );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAKANA, true );
+ }
+
+ rSet.DisableItem( SID_TRANSLITERATE_SENTENCE_CASE );
+ rSet.DisableItem( SID_TRANSLITERATE_TITLE_CASE );
+ rSet.DisableItem( SID_TRANSLITERATE_TOGGLE_CASE );
+ rSet.DisableItem( SID_TRANSLITERATE_UPPER );
+ rSet.DisableItem( SID_TRANSLITERATE_LOWER );
+ rSet.DisableItem( SID_TRANSLITERATE_HALFWIDTH );
+ rSet.DisableItem( SID_TRANSLITERATE_FULLWIDTH );
+ rSet.DisableItem( SID_TRANSLITERATE_HIRAGANA );
+ rSet.DisableItem( SID_TRANSLITERATE_KATAKANA );
+ }
+ else
+ {
+ if( !SvtCJKOptions::IsChangeCaseMapEnabled() )
+ {
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, false );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, false );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, false );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAKANA, false );
+ rSet.DisableItem( SID_TRANSLITERATE_HALFWIDTH );
+ rSet.DisableItem( SID_TRANSLITERATE_FULLWIDTH );
+ rSet.DisableItem( SID_TRANSLITERATE_HIRAGANA );
+ rSet.DisableItem( SID_TRANSLITERATE_KATAKANA );
+ }
+ else
+ {
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, true );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, true );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, true );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAKANA, true );
+ }
+ }
+}
+
+void DrawViewShell::GetAttrState( SfxItemSet& rSet )
+{
+ SfxWhichIter aIter( rSet );
+ sal_uInt16 nWhich = aIter.FirstWhich();
+
+ bool bAttr = false;
+ SfxAllItemSet aAllSet( *rSet.GetPool() );
+
+ while ( nWhich )
+ {
+ sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich)
+ ? GetPool().GetSlotId(nWhich)
+ : nWhich;
+ switch ( nSlotId )
+ {
+ case SID_ATTR_PARA_ADJUST_LEFT:
+ {
+ SfxItemSet aAttrs( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aAttrs );
+
+ SvxAdjust eAdj = aAttrs.Get( EE_PARA_JUST ).GetAdjust();
+ if ( eAdj == SvxAdjust::Left)
+ {
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_LEFT, true ) );
+ }
+
+ bAttr = true;
+
+ Invalidate(nSlotId);
+ }
+ break;
+ case SID_ATTR_PARA_ADJUST_CENTER:
+ {
+ SfxItemSet aAttrs( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aAttrs );
+
+ SvxAdjust eAdj = aAttrs.Get( EE_PARA_JUST ).GetAdjust();
+ if ( eAdj == SvxAdjust::Center)
+ {
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_CENTER, true ) );
+ }
+
+ bAttr = true;
+
+ Invalidate(nSlotId);
+ }
+ break;
+ case SID_ATTR_PARA_ADJUST_RIGHT:
+ {
+ SfxItemSet aAttrs( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aAttrs );
+
+ SvxAdjust eAdj = aAttrs.Get( EE_PARA_JUST ).GetAdjust();
+ if ( eAdj == SvxAdjust::Right)
+ {
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, true ) );
+ }
+
+ bAttr = true;
+
+ Invalidate(nSlotId);
+ }
+ break;
+ case SID_ATTR_PARA_ADJUST_BLOCK:
+ {
+ SfxItemSet aAttrs( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aAttrs );
+
+ SvxAdjust eAdj = aAttrs.Get( EE_PARA_JUST ).GetAdjust();
+ if ( eAdj == SvxAdjust::Block)
+ {
+ rSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, true ) );
+ }
+
+ bAttr = true;
+
+ Invalidate(nSlotId);
+ }
+ break;
+ case SID_ATTR_PARA_LRSPACE:
+ {
+ SfxItemSet aAttrs( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aAttrs );
+ SvxLRSpaceItem aLRSpace = aAttrs.Get( EE_PARA_LRSPACE );
+ aLRSpace.SetWhich(SID_ATTR_PARA_LRSPACE);
+ rSet.Put(aLRSpace);
+ bAttr = true;
+ Invalidate(SID_ATTR_PARA_LRSPACE);
+ }
+ break;
+ case SID_ATTR_PARA_LINESPACE:
+ {
+ SfxItemSet aAttrs( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aAttrs );
+ SvxLineSpacingItem aLineLR = aAttrs.Get( EE_PARA_SBL );
+ rSet.Put(aLineLR);
+ bAttr = true;
+ Invalidate(SID_ATTR_PARA_LINESPACE);
+ }
+ break;
+ case SID_ATTR_PARA_ULSPACE:
+ {
+ SfxItemSet aAttrs( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aAttrs );
+ SvxULSpaceItem aULSP = aAttrs.Get( EE_PARA_ULSPACE );
+ aULSP.SetWhich(SID_ATTR_PARA_ULSPACE);
+ rSet.Put(aULSP);
+ bAttr = true;
+ Invalidate(SID_ATTR_PARA_ULSPACE);
+ }
+ break;
+ case SID_ULINE_VAL_NONE:
+ case SID_ULINE_VAL_SINGLE:
+ case SID_ULINE_VAL_DOUBLE:
+ case SID_ULINE_VAL_DOTTED:
+ {
+ SfxItemSet aAttrs( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aAttrs );
+ if( aAttrs.GetItemState( EE_CHAR_UNDERLINE ) >= SfxItemState::DEFAULT )
+ {
+ FontLineStyle eLineStyle = aAttrs.Get(EE_CHAR_UNDERLINE).GetLineStyle();
+
+ switch (nSlotId)
+ {
+ case SID_ULINE_VAL_NONE:
+ rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_NONE));
+ break;
+ case SID_ULINE_VAL_SINGLE:
+ rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_SINGLE));
+ break;
+ case SID_ULINE_VAL_DOUBLE:
+ rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_DOUBLE));
+ break;
+ case SID_ULINE_VAL_DOTTED:
+ rSet.Put(SfxBoolItem(nSlotId, eLineStyle == LINESTYLE_DOTTED));
+ break;
+ }
+ }
+
+ bAttr = true;
+
+ Invalidate(nSlotId);
+ }
+ break;
+ case SID_ATTR_FILL_STYLE:
+ case SID_ATTR_FILL_COLOR:
+ case SID_ATTR_FILL_GRADIENT:
+ case SID_ATTR_FILL_HATCH:
+ case SID_ATTR_FILL_BITMAP:
+ case SID_ATTR_FILL_SHADOW:
+ case SID_ATTR_SHADOW_COLOR:
+ case SID_ATTR_SHADOW_TRANSPARENCE:
+ case SID_ATTR_SHADOW_BLUR:
+ case SID_ATTR_SHADOW_XDISTANCE:
+ case SID_ATTR_SHADOW_YDISTANCE:
+ case SID_ATTR_FILL_USE_SLIDE_BACKGROUND:
+ case SID_ATTR_FILL_TRANSPARENCE:
+ case SID_ATTR_FILL_FLOATTRANSPARENCE:
+ case SID_ATTR_LINE_STYLE:
+ case SID_ATTR_LINE_DASH:
+ case SID_ATTR_LINE_WIDTH:
+ case SID_ATTR_LINE_COLOR:
+ case SID_ATTR_LINE_TRANSPARENCE:
+ case SID_ATTR_LINE_JOINT:
+ case SID_ATTR_LINE_CAP:
+ case SID_ATTR_TEXT_FITTOSIZE:
+ case SID_ATTR_CHAR_FONT:
+ case SID_ATTR_CHAR_FONTHEIGHT:
+ case SID_ATTR_CHAR_SHADOWED:
+ case SID_ATTR_CHAR_POSTURE:
+ case SID_ATTR_CHAR_OVERLINE:
+ case SID_ATTR_CHAR_UNDERLINE:
+ case SID_ATTR_CHAR_STRIKEOUT:
+ case SID_ATTR_CHAR_CONTOUR:
+ case SID_ATTR_CHAR_WEIGHT:
+ case SID_ATTR_CHAR_COLOR:
+ case SID_ATTR_CHAR_KERNING:
+ case SID_ATTR_CHAR_CASEMAP:
+ case SID_ATTR_GLOW_COLOR:
+ case SID_ATTR_GLOW_RADIUS:
+ case SID_ATTR_GLOW_TRANSPARENCY:
+ case SID_ATTR_SOFTEDGE_RADIUS:
+ case SID_SET_SUB_SCRIPT:
+ case SID_SET_SUPER_SCRIPT:
+ {
+ bAttr = true;
+ }
+ break;
+
+ case SID_ATTR_TEXTCOLUMNS_NUMBER:
+ case SID_ATTR_TEXTCOLUMNS_SPACING:
+ {
+ SfxItemSet aAttrs(GetDoc()->GetPool());
+ mpDrawView->GetAttributes(aAttrs);
+ const sal_uInt16 nActWhich = nSlotId == SID_ATTR_TEXTCOLUMNS_NUMBER
+ ? SDRATTR_TEXTCOLUMNS_NUMBER
+ : SDRATTR_TEXTCOLUMNS_SPACING;
+ rSet.Put(aAttrs.Get(nActWhich).CloneSetWhich(nSlotId));
+ }
+ break;
+
+ case SID_HYPHENATION:
+ {
+ SfxItemSet aAttrs( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aAttrs );
+ if( aAttrs.GetItemState( EE_PARA_HYPHENATE ) >= SfxItemState::DEFAULT )
+ {
+ bool bValue = aAttrs.Get( EE_PARA_HYPHENATE ).GetValue();
+ rSet.Put( SfxBoolItem( SID_HYPHENATION, bValue ) );
+ }
+ }
+ break;
+
+ case SID_STYLE_FAMILY2:
+ case SID_STYLE_FAMILY3:
+ case SID_STYLE_FAMILY5:
+ case SID_STYLE_APPLY: // StyleControl
+ {
+ SfxStyleSheet* pStyleSheet = mpDrawView->GetStyleSheet();
+ if( pStyleSheet )
+ {
+ if( nSlotId != SID_STYLE_APPLY && !mpDrawView->AreObjectsMarked() )
+ {
+ SfxTemplateItem aTmpItem( nWhich, OUString() );
+ aAllSet.Put( aTmpItem, aTmpItem.Which() );
+ }
+ else
+ {
+ if (pStyleSheet->GetFamily() == SfxStyleFamily::Page)
+ pStyleSheet = static_cast<SdStyleSheet*>(pStyleSheet)->GetPseudoStyleSheet();
+
+ if( pStyleSheet )
+ {
+ SfxStyleFamily eFamily = pStyleSheet->GetFamily();
+
+ if ((eFamily == SfxStyleFamily::Para && nSlotId == SID_STYLE_FAMILY2) ||
+ (eFamily == SfxStyleFamily::Frame && nSlotId == SID_STYLE_FAMILY3) ||
+ (eFamily == SfxStyleFamily::Pseudo && nSlotId == SID_STYLE_FAMILY5))
+ {
+ SfxTemplateItem aTmpItem ( nWhich, pStyleSheet->GetName() );
+ aAllSet.Put( aTmpItem, aTmpItem.Which() );
+ }
+ else
+ {
+ SfxTemplateItem aTmpItem(nWhich, OUString());
+ aAllSet.Put(aTmpItem,aTmpItem.Which() );
+ }
+ }
+ }
+ }
+ else
+ { SfxTemplateItem aItem( nWhich, OUString() );
+ aAllSet.Put( aItem, aItem.Which() );
+ }
+ }
+ break;
+
+ case SID_SET_DEFAULT:
+ {
+ if( !mpDrawView->GetMarkedObjectList().GetMarkCount() ||
+ ( !mpDrawView->IsTextEdit() && !mpDrawView->GetStyleSheet() )
+ )
+ rSet.DisableItem( nWhich );
+ }
+ break;
+
+ case SID_REMOVE_HYPERLINK:
+ {
+ if (!URLFieldHelper::IsCursorAtURLField(mpDrawView->GetTextEditOutlinerView()))
+ rSet.DisableItem(nWhich);
+ }
+ break;
+
+ case SID_STYLE_WATERCAN:
+ {
+ std::unique_ptr<SfxUInt16Item> pFamilyItem;
+ GetViewFrame()->GetBindings().QueryState(SID_STYLE_FAMILY, pFamilyItem);
+ if (pFamilyItem && static_cast<SfxStyleFamily>(pFamilyItem->GetValue()) == SfxStyleFamily::Pseudo)
+ rSet.Put(SfxBoolItem(nWhich,false));
+ else
+ {
+ SfxBoolItem aItem(nWhich, SD_MOD()->GetWaterCan());
+ aAllSet.Put( aItem, aItem.Which());
+ }
+ }
+ break;
+
+ case SID_STYLE_NEW:
+ {
+ std::unique_ptr<SfxUInt16Item> pFamilyItem;
+ GetViewFrame()->GetBindings().QueryState(SID_STYLE_FAMILY, pFamilyItem);
+ if (pFamilyItem && static_cast<SfxStyleFamily>(pFamilyItem->GetValue()) == SfxStyleFamily::Pseudo)
+ {
+ rSet.DisableItem(nWhich);
+ }
+ }
+ break;
+
+ case SID_STYLE_DRAGHIERARCHIE:
+ {
+ std::unique_ptr<SfxUInt16Item> pFamilyItem;
+ GetViewFrame()->GetBindings().QueryState(SID_STYLE_FAMILY, pFamilyItem);
+ if (pFamilyItem && static_cast<SfxStyleFamily>(pFamilyItem->GetValue()) == SfxStyleFamily::Pseudo)
+ rSet.DisableItem(nWhich);
+ }
+ break;
+
+ case SID_STYLE_NEW_BY_EXAMPLE:
+ {
+ // It is not possible to create PseudoStyleSheets 'by Example';
+ // normal style sheets need a selected object for that
+
+ std::unique_ptr<SfxUInt16Item> pFamilyItem;
+ GetViewFrame()->GetBindings().QueryState(SID_STYLE_FAMILY, pFamilyItem);
+ if (pFamilyItem)
+ {
+ if (static_cast<SfxStyleFamily>(pFamilyItem->GetValue()) == SfxStyleFamily::Pseudo)
+ {
+ rSet.DisableItem(nWhich);
+ }
+ else if (static_cast<SfxStyleFamily>(pFamilyItem->GetValue()) == SfxStyleFamily::Para)
+ {
+ if (!mpDrawView->AreObjectsMarked())
+ {
+ rSet.DisableItem(nWhich);
+ }
+ }
+ }
+ // if there is no (yet) a style designer, we have to go back into the
+ // view state; an actual set family can not be considered
+ else
+ {
+ if (!mpDrawView->AreObjectsMarked())
+ {
+ rSet.DisableItem(nWhich);
+ }
+ }
+ }
+ break;
+
+ case SID_STYLE_UPDATE_BY_EXAMPLE:
+ {
+ if (!mpDrawView->AreObjectsMarked())
+ {
+ rSet.DisableItem(nWhich);
+ }
+ }
+ break;
+ case FN_BUL_NUM_RULE_INDEX:
+ case FN_NUM_NUM_RULE_INDEX:
+ {
+ SfxItemSet aEditAttr( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( aEditAttr );
+
+ SfxItemSetFixed<EE_ITEMS_START, EE_ITEMS_END> aNewAttr( GetPool() );
+ aNewAttr.Put( aEditAttr, false );
+
+ std::unique_ptr<SvxNumRule> pNumRule;
+ const SfxPoolItem* pTmpItem=nullptr;
+ TypedWhichId<SvxNumBulletItem> nNumItemId = SID_ATTR_NUMBERING_RULE;
+ sal_uInt16 nActNumLvl = mpDrawView->GetSelectionLevel();
+ pTmpItem=GetNumBulletItem(aNewAttr, nNumItemId);
+
+ if (pTmpItem)
+ pNumRule.reset(new SvxNumRule(static_cast<const SvxNumBulletItem*>(pTmpItem)->GetNumRule()));
+
+ if ( pNumRule )
+ {
+ sal_uInt16 nMask = 1;
+ sal_uInt16 nCount = 0;
+ sal_uInt16 nCurLevel = sal_uInt16(0xFFFF);
+ for(sal_uInt16 i = 0; i < pNumRule->GetLevelCount(); i++)
+ {
+ if(nActNumLvl & nMask)
+ {
+ nCount++;
+ nCurLevel = i;
+ }
+ nMask <<= 1;
+ }
+ if ( nCount == 1 )
+ {
+ const SvxNumberFormat* pNumFmt = pNumRule->Get(nCurLevel);
+ if ( pNumFmt )
+ {
+ bool bBullets = false;
+ switch(pNumFmt->GetNumberingType())
+ {
+ case SVX_NUM_CHAR_SPECIAL:
+ case SVX_NUM_BITMAP:
+ bBullets = true;
+ break;
+
+ default:
+ bBullets = false;
+ }
+
+ rSet.Put(SfxUInt16Item(FN_BUL_NUM_RULE_INDEX,sal_uInt16(0xFFFF)));
+ rSet.Put(SfxUInt16Item(FN_NUM_NUM_RULE_INDEX,sal_uInt16(0xFFFF)));
+ if ( bBullets )
+ {
+ NBOTypeMgrBase* pBullets = NBOutlineTypeMgrFact::CreateInstance(NBOType::Bullets);
+ if ( pBullets )
+ {
+ sal_uInt16 nBulIndex = pBullets->GetNBOIndexForNumRule(*pNumRule,nActNumLvl);
+ rSet.Put(SfxUInt16Item(FN_BUL_NUM_RULE_INDEX,nBulIndex));
+ }
+ }else
+ {
+ NBOTypeMgrBase* pNumbering = NBOutlineTypeMgrFact::CreateInstance(NBOType::Numbering);
+ if ( pNumbering )
+ {
+ sal_uInt16 nBulIndex = pNumbering->GetNBOIndexForNumRule(*pNumRule,nActNumLvl);
+ rSet.Put(SfxUInt16Item(FN_NUM_NUM_RULE_INDEX,nBulIndex));
+ }
+ }
+ }
+ }
+ }
+ }
+ break;
+ case FN_NUM_BULLET_ON:
+ case FN_NUM_NUMBERING_ON:
+ {
+ bool bEnable = false;
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ const size_t nMarkCount = rMarkList.GetMarkCount();
+ for (size_t nIndex = 0; nIndex < nMarkCount; ++nIndex)
+ {
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >(rMarkList.GetMark(nIndex)->GetMarkedSdrObj());
+ if (pTextObj && pTextObj->GetObjInventor() == SdrInventor::Default)
+ {
+ if (pTextObj->GetObjIdentifier() != SdrObjKind::OLE2)
+ {
+ bEnable = true;
+ break;
+ }
+ }
+ }
+ if (bEnable)
+ {
+ rSet.Put(SfxBoolItem(FN_NUM_BULLET_ON, false));
+ rSet.Put(SfxBoolItem(FN_NUM_NUMBERING_ON, false));
+ }
+ else
+ {
+ rSet.DisableItem(FN_NUM_BULLET_ON);
+ rSet.DisableItem(FN_NUM_NUMBERING_ON);
+ }
+ }
+ break;
+ }
+ nWhich = aIter.NextWhich();
+ }
+
+ std::optional<SfxItemSet> pSet;
+
+ if( bAttr )
+ {
+ pSet.emplace( GetDoc()->GetPool() );
+ mpDrawView->GetAttributes( *pSet );
+ rSet.Put( *pSet, false );
+ }
+
+ rSet.Put( aAllSet, false );
+
+ // there were changes at area and/or line attributes
+ if( !(bAttr && pSet) )
+ return;
+
+ // if the view owns selected objects, corresponding items have to be
+ // changed from SfxItemState::DEFAULT (_ON) to SfxItemState::DISABLED
+ if( mpDrawView->AreObjectsMarked() )
+ {
+ SfxWhichIter aNewIter( *pSet );
+ nWhich = aNewIter.FirstWhich();
+ while( nWhich )
+ {
+ if (nWhich >= XATTR_LINE_FIRST && nWhich <= XATTR_LINE_LAST
+ && SfxItemState::DEFAULT == aNewIter.GetItemState() )
+ {
+ rSet.ClearItem( nWhich );
+ rSet.DisableItem( nWhich );
+ }
+ nWhich = aNewIter.NextWhich();
+ }
+ }
+
+ SfxItemState eState = pSet->GetItemState( EE_PARA_LRSPACE );
+ if ( eState == SfxItemState::DONTCARE )
+ {
+ rSet.InvalidateItem(EE_PARA_LRSPACE);
+ rSet.InvalidateItem(SID_ATTR_PARA_LRSPACE);
+ }
+ eState = pSet->GetItemState( EE_PARA_SBL );
+ if ( eState == SfxItemState::DONTCARE )
+ {
+ rSet.InvalidateItem(EE_PARA_SBL);
+ rSet.InvalidateItem(SID_ATTR_PARA_LINESPACE);
+ }
+ eState = pSet->GetItemState( EE_PARA_ULSPACE );
+ if ( eState == SfxItemState::DONTCARE )
+ {
+ rSet.InvalidateItem(EE_PARA_ULSPACE);
+ rSet.InvalidateItem(SID_ATTR_PARA_ULSPACE);
+ }
+
+ SvxEscapement eEsc = static_cast<SvxEscapement>(pSet->Get( EE_CHAR_ESCAPEMENT ).GetEnumValue());
+ rSet.Put(SfxBoolItem(SID_SET_SUPER_SCRIPT, eEsc == SvxEscapement::Superscript));
+ rSet.Put(SfxBoolItem(SID_SET_SUB_SCRIPT, eEsc == SvxEscapement::Subscript));
+
+ eState = pSet->GetItemState( EE_CHAR_KERNING );
+ if ( eState == SfxItemState::DONTCARE )
+ {
+ rSet.InvalidateItem(EE_CHAR_KERNING);
+ rSet.InvalidateItem(SID_ATTR_CHAR_KERNING);
+ }
+}
+
+OUString DrawViewShell::GetSelectionText(bool bCompleteWords)
+{
+ OUString aStrSelection;
+ ::Outliner* pOl = mpDrawView->GetTextEditOutliner();
+ OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView();
+
+ if (pOl && pOlView)
+ {
+ if (bCompleteWords)
+ {
+ ESelection aSel = pOlView->GetSelection();
+ OUString aStrCurrentDelimiters = pOl->GetWordDelimiters();
+
+ pOl->SetWordDelimiters(" .,;\"'");
+ aStrSelection = pOl->GetWord( aSel.nEndPara, aSel.nEndPos );
+ pOl->SetWordDelimiters( aStrCurrentDelimiters );
+ }
+ else
+ {
+ aStrSelection = pOlView->GetSelected();
+ }
+ }
+
+ return aStrSelection;
+}
+
+bool DrawViewShell::HasSelection(bool bText) const
+{
+ bool bReturn = false;
+
+ if (bText)
+ {
+ OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView();
+
+ if (pOlView && !pOlView->GetSelected().isEmpty())
+ {
+ bReturn = true;
+ }
+ }
+ else if (mpDrawView->GetMarkedObjectList().GetMarkCount() != 0)
+ {
+ bReturn = true;
+ }
+
+ return bReturn;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviewsg.cxx b/sd/source/ui/view/drviewsg.cxx
new file mode 100644
index 000000000..e3930fa7e
--- /dev/null
+++ b/sd/source/ui/view/drviewsg.cxx
@@ -0,0 +1,232 @@
+/* -*- 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 <DrawViewShell.hxx>
+#include <ViewShellImplementation.hxx>
+
+#include <svx/svxids.hrc>
+#include <svx/imapdlg.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/ImageMapInfo.hxx>
+
+#include <app.hrc>
+
+#include <drawdoc.hxx>
+#include <sdmod.hxx>
+#include <optsitem.hxx>
+#include <FrameView.hxx>
+#include <drawview.hxx>
+
+namespace sd {
+
+void DrawViewShell::ExecIMap( SfxRequest const & rReq )
+{
+ // during a slide show, nothing is executed!
+ if(HasCurrentFunction(SID_PRESENTATION) )
+ return;
+
+ if ( rReq.GetSlot() != SID_IMAP_EXEC )
+ return;
+
+ SdrMark* pMark = mpDrawView->GetMarkedObjectList().GetMark(0);
+
+ if ( !pMark )
+ return;
+
+ SdrObject* pSdrObj = pMark->GetMarkedSdrObj();
+ SvxIMapDlg* pDlg = ViewShell::Implementation::GetImageMapDialog();
+
+ if ( pDlg->GetEditingObject() == static_cast<void*>(pSdrObj) )
+ {
+ const ImageMap& rImageMap = pDlg->GetImageMap();
+ SvxIMapInfo* pIMapInfo = SvxIMapInfo::GetIMapInfo( pSdrObj );
+
+ if ( !pIMapInfo )
+ pSdrObj->AppendUserData( std::unique_ptr<SdrObjUserData>(new SvxIMapInfo( rImageMap )) );
+ else
+ pIMapInfo->SetImageMap( rImageMap );
+
+ GetDoc()->SetChanged();
+ }
+}
+
+void DrawViewShell::GetIMapState( SfxItemSet& rSet )
+{
+ bool bDisable = true;
+
+ if( GetViewFrame()->HasChildWindow( SvxIMapDlgChildWindow::GetChildWindowId() ) )
+ {
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+
+ if ( rMarkList.GetMarkCount() == 1 )
+ {
+ const SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
+
+ SvxIMapDlg* pImageMapDialog = ViewShell::Implementation::GetImageMapDialog();
+ if ( ( dynamic_cast< const SdrGrafObj *>( pObj ) != nullptr /*|| pObj->ISA( SdrOle2Obj )*/ )
+ && pImageMapDialog!=nullptr
+ && ( pImageMapDialog->GetEditingObject() == static_cast<void const *>(pObj) ) )
+ {
+ bDisable = false;
+ }
+ }
+ }
+
+ rSet.Put( SfxBoolItem( SID_IMAP_EXEC, bDisable ) );
+}
+
+void DrawViewShell::ExecOptionsBar( SfxRequest& rReq )
+{
+ // during a slide show, nothing is executed!
+ if(HasCurrentFunction(SID_PRESENTATION))
+ return;
+
+ bool bDefault = false;
+ sal_uInt16 nSlot = rReq.GetSlot();
+
+ SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType());
+
+ switch( nSlot )
+ {
+ case SID_SOLID_CREATE:
+ pOptions->SetSolidDragging( !mpDrawView->IsSolidDragging() );
+ break;
+
+ // Grid- / Help lines option
+ case SID_GRID_VISIBLE: // not here yet!
+ {
+ pOptions->SetGridVisible( !mpDrawView->IsGridVisible() );
+ }
+ break;
+
+ case SID_GRID_USE:
+ {
+ pOptions->SetUseGridSnap( !mpDrawView->IsGridSnap() );
+ }
+ break;
+
+ case SID_HELPLINES_VISIBLE: // not here yet!
+ {
+ pOptions->SetHelplines( !mpDrawView->IsHlplVisible() );
+ }
+ break;
+
+ case SID_HELPLINES_USE:
+ {
+ pOptions->SetSnapHelplines( !mpDrawView->IsHlplSnap() );
+ }
+ break;
+
+ case SID_HELPLINES_MOVE:
+ {
+ pOptions->SetDragStripes( !mpDrawView->IsDragStripes() );
+ }
+ break;
+
+ case SID_SNAP_BORDER:
+ {
+ pOptions->SetSnapBorder( !mpDrawView->IsBordSnap() );
+ }
+ break;
+
+ case SID_SNAP_FRAME:
+ {
+ pOptions->SetSnapFrame( !mpDrawView->IsOFrmSnap() );
+ }
+ break;
+
+ case SID_SNAP_POINTS:
+ {
+ pOptions->SetSnapPoints( !mpDrawView->IsOPntSnap() );
+ }
+ break;
+
+ case SID_QUICKEDIT:
+ {
+ pOptions->SetQuickEdit( !mpDrawView->IsQuickTextEditMode() );
+ }
+ break;
+
+ case SID_PICK_THROUGH:
+ {
+ pOptions->SetPickThrough(
+ !mpDrawView->GetModel()->IsPickThroughTransparentTextFrames() );
+ }
+ break;
+
+ case SID_DOUBLECLICK_TEXTEDIT:
+ {
+ pOptions->SetDoubleClickTextEdit( !mpFrameView->IsDoubleClickTextEdit() );
+ }
+ break;
+
+ case SID_CLICK_CHANGE_ROTATION:
+ {
+ pOptions->SetClickChangeRotation( !mpFrameView->IsClickChangeRotation() );
+ }
+ break;
+
+ default:
+ bDefault = true;
+ break;
+ }
+
+ if( bDefault )
+ return;
+
+ pOptions->StoreConfig();
+
+ // Saves the configuration IMMEDIATELY
+ // SfxGetpApp()->SaveConfiguration();
+ WriteFrameViewData();
+
+ mpFrameView->Update( pOptions );
+ ReadFrameViewData( mpFrameView );
+
+ Invalidate( nSlot );
+ rReq.Done();
+
+}
+
+void DrawViewShell::GetOptionsBarState( SfxItemSet& rSet )
+{
+ rSet.Put( SfxBoolItem( SID_SOLID_CREATE, mpDrawView->IsSolidDragging() ) );
+ rSet.Put( SfxBoolItem( SID_GRID_VISIBLE, mpDrawView->IsGridVisible() ) );
+ rSet.Put( SfxBoolItem( SID_GRID_USE, mpDrawView->IsGridSnap() ) );
+ rSet.Put( SfxBoolItem( SID_HELPLINES_VISIBLE, mpDrawView->IsHlplVisible() ) );
+ rSet.Put( SfxBoolItem( SID_HELPLINES_USE, mpDrawView->IsHlplSnap() ) );
+ rSet.Put( SfxBoolItem( SID_HELPLINES_MOVE, mpDrawView->IsDragStripes() ) );
+
+ rSet.Put( SfxBoolItem( SID_SNAP_BORDER, mpDrawView->IsBordSnap() ) );
+ rSet.Put( SfxBoolItem( SID_SNAP_FRAME, mpDrawView->IsOFrmSnap() ) );
+ rSet.Put( SfxBoolItem( SID_SNAP_POINTS, mpDrawView->IsOPntSnap() ) );
+
+ rSet.Put( SfxBoolItem( SID_QUICKEDIT, mpDrawView->IsQuickTextEditMode() ) );
+ rSet.Put( SfxBoolItem( SID_PICK_THROUGH,
+ mpDrawView->GetModel()->IsPickThroughTransparentTextFrames() ) );
+
+ rSet.Put( SfxBoolItem( SID_DOUBLECLICK_TEXTEDIT, mpFrameView->IsDoubleClickTextEdit() ) );
+ rSet.Put( SfxBoolItem( SID_CLICK_CHANGE_ROTATION, mpFrameView->IsClickChangeRotation() ) );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviewsh.cxx b/sd/source/ui/view/drviewsh.cxx
new file mode 100644
index 000000000..c0e09a478
--- /dev/null
+++ b/sd/source/ui/view/drviewsh.cxx
@@ -0,0 +1,203 @@
+/* -*- 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 <DrawViewShell.hxx>
+
+#include <sal/log.hxx>
+#include <rtl/math.hxx>
+#include <comphelper/lok.hxx>
+
+#include <DrawDocShell.hxx>
+
+#include <slideshow.hxx>
+
+namespace sd {
+
+void DrawViewShell::GotoBookmark(std::u16string_view rBookmark)
+{
+ ::sd::DrawDocShell* pDocSh = GetDocSh();
+ if( pDocSh )
+ {
+ if( !pDocSh->GetViewShell() ) //#i26016# this case occurs if the jump-target-document was opened already with file open dialog before triggering the jump via hyperlink
+ pDocSh->Connect(this);
+ pDocSh->GotoBookmark(rBookmark);
+ }
+}
+
+/**
+ * Make area visible (scroll part of picture)
+|*
+\************************************************************************/
+
+void DrawViewShell::MakeVisible(const ::tools::Rectangle& rRect, vcl::Window& rWin)
+{
+ if ( (IsMouseButtonDown() && !IsMouseSelecting()) || SlideShow::IsRunning( GetViewShellBase() ) )
+ return;
+
+ // tdf#98646 check if Rectangle which contains the bounds of the region to
+ // be shown eventually contains values that cause overflows when processing
+ // e.g. when calling GetWidth()
+ const bool bOverflowInX(!rtl::math::approxEqual(static_cast<double>(rRect.getWidth()), static_cast<double>(rRect.Right()) - static_cast<double>(rRect.Left())));
+ const bool bOverflowInY(!rtl::math::approxEqual(static_cast<double>(rRect.getHeight()), static_cast<double>(rRect.Bottom()) - static_cast<double>(rRect.Top())));
+
+ if(bOverflowInX || bOverflowInY)
+ {
+ SAL_WARN("sd", "The given Rectangle contains values that lead to numerical overflows (!)");
+ return;
+ }
+
+ // In older versions, if in X or Y the size of the object was
+ // smaller than the visible area, the user-defined zoom was
+ // changed. This was decided to be a bug for
+ // StarOffice 6.x (Apr 2002), thus I developed a
+ // version which instead handles X/Y bigger/smaller and visibility
+ // questions separately
+ const Size aLogicSize(rRect.GetSize());
+
+ // visible area
+ Size aVisSizePixel(rWin.GetOutputSizePixel());
+ bool bTiledRendering = comphelper::LibreOfficeKit::isActive() && !rWin.IsMapModeEnabled();
+ if (bTiledRendering)
+ {
+ rWin.GetOutDev()->Push(vcl::PushFlags::MAPMODE);
+ rWin.EnableMapMode();
+ }
+ ::tools::Rectangle aVisArea(rWin.PixelToLogic(::tools::Rectangle(Point(0,0), aVisSizePixel)));
+ if (bTiledRendering)
+ rWin.GetOutDev()->Pop();
+ Size aVisAreaSize(aVisArea.GetSize());
+
+ if ( aVisArea.Contains(rRect) )
+ return;
+
+ // object is not entirely in visible area
+ sal_Int32 nFreeSpaceX(aVisAreaSize.Width() - aLogicSize.Width());
+ sal_Int32 nFreeSpaceY(aVisAreaSize.Height() - aLogicSize.Height());
+
+ // allow a mode for move-only visibility without zooming.
+ const sal_Int32 nPercentBorder(30);
+ const ::tools::Rectangle aInnerRectangle(
+ aVisArea.Left() + ((aVisAreaSize.Width() * nPercentBorder) / 200),
+ aVisArea.Top() + ((aVisAreaSize.Height() * nPercentBorder) / 200),
+ aVisArea.Right() - ((aVisAreaSize.Width() * nPercentBorder) / 200),
+ aVisArea.Bottom() - ((aVisAreaSize.Height() * nPercentBorder) / 200)
+ );
+ Point aNewPos(aVisArea.TopLeft());
+
+ if(nFreeSpaceX < 0)
+ {
+ if(aInnerRectangle.Left() > rRect.Right())
+ {
+ // object moves out to the left
+ aNewPos.AdjustX( -(aVisAreaSize.Width() / 2) );
+ }
+
+ if(aInnerRectangle.Right() < rRect.Left())
+ {
+ // object moves out to the right
+ aNewPos.AdjustX(aVisAreaSize.Width() / 2 );
+ }
+ }
+ else
+ {
+ if(nFreeSpaceX > rRect.GetWidth())
+ {
+ nFreeSpaceX = rRect.GetWidth();
+ }
+
+ if(nFreeSpaceX <= 0)
+ {
+ SAL_WARN("sd", "The given Rectangle contains values that lead to numerical overflows (!)");
+ }
+ else
+ {
+ const ::tools::Long distRight(rRect.Right() - aNewPos.X() - aVisAreaSize.Width());
+
+ if(distRight > 0)
+ {
+ ::tools::Long mult = (distRight / nFreeSpaceX) + 1;
+ aNewPos.AdjustX(mult * nFreeSpaceX );
+ }
+
+ const ::tools::Long distLeft(aNewPos.X() - rRect.Left());
+
+ if(distLeft > 0)
+ {
+ ::tools::Long mult = (distLeft / nFreeSpaceX) + 1;
+ aNewPos.AdjustX( -(mult * nFreeSpaceX) );
+ }
+ }
+ }
+
+ if(nFreeSpaceY < 0)
+ {
+ if(aInnerRectangle.Top() > rRect.Bottom())
+ {
+ // object moves out to the top
+ aNewPos.AdjustY( -(aVisAreaSize.Height() / 2) );
+ }
+
+ if(aInnerRectangle.Bottom() < rRect.Top())
+ {
+ // object moves out to the right
+ aNewPos.AdjustY(aVisAreaSize.Height() / 2 );
+ }
+ }
+ else
+ {
+ if(nFreeSpaceY > rRect.GetHeight())
+ {
+ nFreeSpaceY = rRect.GetHeight();
+ }
+
+ if(nFreeSpaceY <= 0)
+ {
+ SAL_WARN("sd", "The given Rectangle contains values that lead to numerical overflows (!)");
+ }
+ else
+ {
+ const ::tools::Long distBottom(rRect.Bottom() - aNewPos.Y() - aVisAreaSize.Height());
+
+ if(distBottom > 0)
+ {
+ ::tools::Long mult = (distBottom / nFreeSpaceY) + 1;
+ aNewPos.AdjustY(mult * nFreeSpaceY );
+ }
+
+ const ::tools::Long distTop(aNewPos.Y() - rRect.Top());
+
+ if(distTop > 0)
+ {
+ ::tools::Long mult = (distTop / nFreeSpaceY) + 1;
+ aNewPos.AdjustY( -(mult * nFreeSpaceY) );
+ }
+ }
+ }
+
+ // did position change? Does it need to be set?
+ if(aNewPos != aVisArea.TopLeft())
+ {
+ aVisArea.SetPos(aNewPos);
+ SetZoomRect(aVisArea);
+ }
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviewsi.cxx b/sd/source/ui/view/drviewsi.cxx
new file mode 100644
index 000000000..039840824
--- /dev/null
+++ b/sd/source/ui/view/drviewsi.cxx
@@ -0,0 +1,165 @@
+/* -*- 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 <DrawViewShell.hxx>
+#include <svx/xfillit0.hxx>
+#include <editeng/eeitem.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svx/svxids.hrc>
+#include <sfx2/dispatch.hxx>
+#include <svx/float3d.hxx>
+#include <svx/f3dchild.hxx>
+#include <vcl/weld.hxx>
+
+#include <strings.hrc>
+
+#include <drawdoc.hxx>
+#include <Window.hxx>
+#include <sdresid.hxx>
+
+using namespace ::com::sun::star;
+
+namespace sd {
+
+/**
+ * Handle SfxRequests for EffekteWindow
+ */
+void DrawViewShell::ExecEffectWin( SfxRequest& rReq )
+{
+ CheckLineTo (rReq);
+
+ sal_uInt16 nSId = rReq.GetSlot();
+
+ switch( nSId )
+ {
+ case SID_3D_INIT:
+ {
+ sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId();
+ SfxChildWindow* pWindow = GetViewFrame()->GetChildWindow( nId );
+ if( pWindow )
+ {
+ Svx3DWin* p3DWin = static_cast<Svx3DWin*>( pWindow->GetWindow() );
+ if( p3DWin )
+ p3DWin->InitColorLB();
+ }
+ }
+ break;
+
+ case SID_3D_STATE:
+ {
+ Update3DWindow();
+ }
+ break;
+
+ case SID_3D_ASSIGN:
+ {
+ AssignFrom3DWindow();
+ }
+ break;
+
+ }
+}
+
+void DrawViewShell::Update3DWindow()
+{
+ sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId();
+ SfxChildWindow* pWindow = GetViewFrame()->GetChildWindow( nId );
+ if( pWindow )
+ {
+ Svx3DWin* p3DWin = static_cast<Svx3DWin*>( pWindow->GetWindow() );
+ if( p3DWin && p3DWin->IsUpdateMode() )
+ {
+ SfxItemSet aTmpItemSet = GetView()->Get3DAttributes();
+ p3DWin->Update( aTmpItemSet );
+ }
+ }
+}
+
+/*----------------------------------------------------------------------------*/
+
+void DrawViewShell::AssignFrom3DWindow()
+{
+ sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId();
+ SfxChildWindow* pWin = GetViewFrame()->GetChildWindow( nId );
+ if( !pWin )
+ return;
+
+ Svx3DWin* p3DWin = static_cast<Svx3DWin*>( pWin->GetWindow() );
+ if( !(p3DWin && GetView()) )
+ return;
+
+ if(!GetView()->IsPresObjSelected())
+ {
+ SfxItemSetFixed<SDRATTR_START, SDRATTR_END> aSet( GetDoc()->GetPool() );
+ p3DWin->GetAttr( aSet );
+
+ // own UNDO-compounding also around transformation in 3D
+ GetView()->BegUndo(SdResId(STR_UNDO_APPLY_3D_FAVOURITE));
+
+ if(GetView()->IsConvertTo3DObjPossible())
+ {
+ // assign only text-attribute
+ SfxItemSetFixed<EE_ITEMS_START, EE_ITEMS_END> aTextSet( GetDoc()->GetPool() );
+ aTextSet.Put( aSet, false );
+ GetView()->SetAttributes( aTextSet );
+
+ // transform text into 3D
+ sal_uInt16 nSId = SID_CONVERT_TO_3D;
+ SfxBoolItem aItem( nSId, true );
+ GetViewFrame()->GetDispatcher()->ExecuteList(
+ nSId, SfxCallMode::SYNCHRON | SfxCallMode::RECORD,
+ { &aItem });
+
+ // Determine if a FILL attribute is set.
+ // If not, hard set a fill attribute
+ drawing::FillStyle eFillStyle = aSet.Get(XATTR_FILLSTYLE).GetValue();
+ if(eFillStyle == drawing::FillStyle_NONE)
+ aSet.Put(XFillStyleItem (drawing::FillStyle_SOLID));
+
+ // remove some 3DSCENE attributes since these were
+ // created by convert to 3D and may not be changed
+ // to the defaults again.
+ aSet.ClearItem(SDRATTR_3DSCENE_DISTANCE);
+ aSet.ClearItem(SDRATTR_3DSCENE_FOCAL_LENGTH);
+ aSet.ClearItem(SDRATTR_3DOBJ_DEPTH);
+ }
+
+ // assign attribute
+ GetView()->Set3DAttributes( aSet );
+
+ // end UNDO
+ GetView()->EndUndo();
+ }
+ else
+ {
+ vcl::Window* pWindow = GetActiveWindow();
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(pWindow ? pWindow->GetFrameWeld() : nullptr,
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+ }
+
+ // get focus back
+ GetActiveWindow()->GrabFocus();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviewsj.cxx b/sd/source/ui/view/drviewsj.cxx
new file mode 100644
index 000000000..a1a7d899f
--- /dev/null
+++ b/sd/source/ui/view/drviewsj.cxx
@@ -0,0 +1,567 @@
+/* -*- 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 <DrawViewShell.hxx>
+#include <com/sun/star/embed/EmbedMisc.hpp>
+#include <com/sun/star/embed/XEmbeddedObject.hpp>
+#include <com/sun/star/presentation/ClickAction.hpp>
+#include <sfx2/objsh.hxx>
+#include <svx/svxids.hrc>
+#include <svx/sdmetitm.hxx>
+#include <editeng/flditem.hxx>
+#include <svx/svdogrp.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/sdtfsitm.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/obj3d.hxx>
+#include <svx/scene3d.hxx>
+
+#include <app.hrc>
+
+#include <anminfo.hxx>
+#include <drawdoc.hxx>
+#include <drawview.hxx>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+/**
+ * Set state (Enabled/Disabled) of Menu-SfxSlots
+ */
+void DrawViewShell::GetMenuStateSel( SfxItemSet &rSet )
+{
+ // Status of menu entries (Buttons,...)
+
+ // Single selection
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ const size_t nMarkCount = rMarkList.GetMarkCount();
+
+ if ( nMarkCount == 1 )
+ {
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_BEZIER_EDIT ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_UNGROUP ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_ENTER_GROUP ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_NAME_GROUP ) ||
+
+ // #i68101#
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_TITLE_DESCRIPTION ) ||
+
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_FILL_STYLE ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_FILL_USE_SLIDE_BACKGROUND ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_FILL_TRANSPARENCE ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_FILL_FLOATTRANSPARENCE ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_CHANGEBEZIER ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_CHANGEPOLYGON ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_LINEEND_POLYGON ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_MEASURE_DLG ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_CONNECTION_DLG ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_CONNECTION_NEW_ROUTING ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_SHEAR ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_ALIGN_LEFT ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_ALIGN_CENTER ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_ALIGN_RIGHT ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_ALIGN_UP ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_ALIGN_MIDDLE ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_OBJECT_ALIGN_DOWN ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_FRAME_TO_TOP ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_MOREFRONT ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_FRAME_UP ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_MOREBACK ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_FRAME_DOWN ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_FRAME_TO_BOTTOM ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_BEFORE_OBJ ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_BEHIND_OBJ ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_REVERSE_ORDER ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_ORIGINAL_SIZE ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_SAVE_GRAPHIC ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_COMPRESS_GRAPHIC ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_TEXTATTR_DLG ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_EXECUTE_ANIMATION_EFFECT ))
+ {
+ const SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ const SdrGrafObj* pSdrGrafObj = dynamic_cast< const SdrGrafObj* >(pObj);
+ const SdrOle2Obj* pSdrOle2Obj = dynamic_cast< const SdrOle2Obj* >(pObj);
+ const SdAnimationInfo* pAnimationInfo
+ = SdDrawDocument::GetAnimationInfo(rMarkList.GetMark(0)->GetMarkedSdrObj());
+ SdrInventor nInv = pObj->GetObjInventor();
+ SdrObjKind nId = pObj->GetObjIdentifier();
+ SdrObjTransformInfoRec aInfoRec;
+ pObj->TakeObjInfo( aInfoRec );
+
+ // don't show original size entry if not possible
+ if(pSdrOle2Obj)
+ {
+ if (pSdrOle2Obj->GetObjRef().is() &&
+ (pSdrOle2Obj->GetObjRef()->getStatus( pSdrOle2Obj->GetAspect() ) & embed::EmbedMisc::MS_EMBED_RECOMPOSEONRESIZE) )
+ rSet.DisableItem(SID_ORIGINAL_SIZE);
+ }
+
+ if(!pSdrGrafObj)
+ {
+ rSet.DisableItem(SID_SAVE_GRAPHIC);
+ rSet.DisableItem(SID_COMPRESS_GRAPHIC);
+ }
+
+ if (!pAnimationInfo
+ || pAnimationInfo->meClickAction == presentation::ClickAction::ClickAction_NONE
+ // Sound does not work in edit mode
+ || pAnimationInfo->meClickAction == presentation::ClickAction::ClickAction_SOUND
+ // No point in exiting the presentation in edit mode
+ || pAnimationInfo->meClickAction
+ == presentation::ClickAction::ClickAction_STOPPRESENTATION)
+ {
+ rSet.DisableItem(SID_EXECUTE_ANIMATION_EFFECT);
+ }
+
+ /* If it is not a group object or 3D object, we disable "enter
+ group". */
+ const auto* pSdrObjGroup = dynamic_cast<const SdrObjGroup*>(pObj);
+
+ if( !( ( pSdrObjGroup != nullptr && nInv == SdrInventor::Default ) ||
+ ( dynamic_cast< const E3dScene* >(pObj) != nullptr ) ) )
+ {
+ rSet.DisableItem( SID_ENTER_GROUP );
+ }
+
+ // Don't allow enter Diagrams
+ if(nullptr != pSdrObjGroup && pSdrObjGroup->isDiagram())
+ {
+ rSet.DisableItem( SID_ENTER_GROUP );
+ }
+
+ // If it is not a group object, we disable "ungroup"
+ if(pSdrObjGroup == nullptr || nInv != SdrInventor::Default)
+ {
+ rSet.DisableItem(SID_UNGROUP);
+ }
+
+ // Support advanced DiagramHelper
+ if(!pSdrObjGroup || !pSdrObjGroup->isDiagram())
+ {
+ rSet.DisableItem( SID_REGENERATE_DIAGRAM );
+ rSet.DisableItem( SID_EDIT_DIAGRAM );
+ }
+
+ if( nInv == SdrInventor::Default &&
+ (nId == SdrObjKind::Line ||
+ nId == SdrObjKind::PolyLine ||
+ nId == SdrObjKind::PathLine ||
+ nId == SdrObjKind::FreehandLine ))
+ {
+ //rSet.DisableItem( SID_ATTRIBUTES_AREA ); // remove again!
+ rSet.DisableItem( SID_ATTR_FILL_STYLE );
+ rSet.DisableItem( SID_ATTR_FILL_USE_SLIDE_BACKGROUND );
+ rSet.DisableItem( SID_ATTR_FILL_TRANSPARENCE );
+ rSet.DisableItem( SID_ATTR_FILL_FLOATTRANSPARENCE );
+ }
+ if( (dynamic_cast< const SdrPathObj *>( pObj ) == nullptr&& !aInfoRec.bCanConvToPath) || dynamic_cast< const SdrObjGroup *>( pObj ) != nullptr ) // As long as JOE handles it incorrectly!
+ { // JOE: a group object may can be converted into a PathObj
+ rSet.DisableItem( SID_LINEEND_POLYGON );
+ }
+ if(nInv == SdrInventor::Default &&
+ (nId == SdrObjKind::PathFill || nId == SdrObjKind::PathLine || !aInfoRec.bCanConvToPath))
+ rSet.DisableItem( SID_CHANGEBEZIER );
+
+ if( nInv == SdrInventor::Default &&
+ ( nId == SdrObjKind::Polygon || nId == SdrObjKind::PolyLine || !aInfoRec.bCanConvToPoly ) &&
+ !GetView()->IsVectorizeAllowed() )
+ {
+ rSet.DisableItem( SID_CHANGEPOLYGON );
+ }
+
+ if(nInv == SdrInventor::Default && nId == SdrObjKind::Table )
+ {
+ rSet.DisableItem( SID_TEXTATTR_DLG );
+ }
+
+ if( nInv != SdrInventor::Default || nId != SdrObjKind::Measure )
+ rSet.DisableItem( SID_MEASURE_DLG );
+
+ if( nInv != SdrInventor::Default || nId != SdrObjKind::Edge )
+ rSet.DisableItem( SID_CONNECTION_DLG );
+ else
+ {
+ bool bDisable = true;
+ SfxItemSet aAttrSet( GetDoc()->GetPool() );
+ GetView()->GetAttributes( aAttrSet );
+
+ if( aAttrSet.GetItemState( SDRATTR_EDGELINE1DELTA ) >= SfxItemState::DEFAULT &&
+ aAttrSet.GetItemState( SDRATTR_EDGELINE2DELTA ) >= SfxItemState::DEFAULT &&
+ aAttrSet.GetItemState( SDRATTR_EDGELINE3DELTA ) >= SfxItemState::DEFAULT )
+ {
+ ::tools::Long nVal1 = aAttrSet.Get( SDRATTR_EDGELINE1DELTA ).GetValue();
+ ::tools::Long nVal2 = aAttrSet.Get( SDRATTR_EDGELINE2DELTA ).GetValue();
+ ::tools::Long nVal3 = aAttrSet.Get( SDRATTR_EDGELINE3DELTA ).GetValue();
+ {
+ if( nVal1 != 0 || nVal2 != 0 || nVal3 != 0 )
+ bDisable = false;
+ }
+ }
+ if( bDisable )
+ rSet.DisableItem( SID_CONNECTION_NEW_ROUTING );
+ }
+
+ if ( nInv == SdrInventor::E3d ||
+ (!mpDrawView->IsConvertToPathObjPossible() &&
+ !mpDrawView->IsShearAllowed() &&
+ !mpDrawView->IsDistortAllowed()) )
+ {
+ rSet.DisableItem( SID_OBJECT_SHEAR );
+ }
+
+ if(dynamic_cast< const E3dCompoundObject *>( pObj ) != nullptr)
+ {
+ rSet.DisableItem( SID_OBJECT_ALIGN );
+ rSet.DisableItem( SID_OBJECT_ALIGN_LEFT );
+ rSet.DisableItem( SID_OBJECT_ALIGN_CENTER );
+ rSet.DisableItem( SID_OBJECT_ALIGN_RIGHT );
+ rSet.DisableItem( SID_OBJECT_ALIGN_UP );
+ rSet.DisableItem( SID_OBJECT_ALIGN_MIDDLE );
+ rSet.DisableItem( SID_OBJECT_ALIGN_DOWN );
+ rSet.DisableItem( SID_FRAME_TO_TOP );
+ rSet.DisableItem( SID_MOREFRONT );
+ rSet.DisableItem( SID_FRAME_UP );
+ rSet.DisableItem( SID_MOREBACK );
+ rSet.DisableItem( SID_FRAME_DOWN );
+ rSet.DisableItem( SID_FRAME_TO_BOTTOM );
+ rSet.DisableItem( SID_BEFORE_OBJ );
+ rSet.DisableItem( SID_BEHIND_OBJ );
+ rSet.DisableItem( SID_REVERSE_ORDER );
+ rSet.DisableItem( SID_POSITION );
+ }
+ }
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_DISMANTLE ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_BREAK ) )
+ {
+ if ( !mpDrawView->IsDismantlePossible() )
+ {
+ rSet.DisableItem( SID_DISMANTLE );
+ }
+
+ if ( !mpDrawView->IsDismantlePossible(true) &&
+ !mpDrawView->IsImportMtfPossible() &&
+ !mpDrawView->IsBreak3DObjPossible() )
+ {
+ rSet.DisableItem( SID_BREAK );
+ }
+ }
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_MODIFY_FIELD ) )
+ {
+ OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
+
+ if( pOLV )
+ {
+ const SvxFieldItem* pFldItem = pOLV->GetFieldAtSelection();
+
+ if( !( pFldItem && (nullptr != dynamic_cast< const SvxDateField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxAuthorField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtFileField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtTimeField *>( pFldItem->GetField() ) ) ) )
+ {
+ rSet.DisableItem( SID_MODIFY_FIELD );
+ }
+ }
+ else
+ rSet.DisableItem( SID_MODIFY_FIELD );
+ }
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_OUTLINE_TEXT_AUTOFIT ) )
+ {
+ const SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
+ const SdrTextFitToSizeTypeItem* pItem = pObj->GetMergedItemSet().GetItem<SdrTextFitToSizeTypeItem>(SDRATTR_TEXT_FITTOSIZE);
+ const bool bSet = pItem && pItem->GetValue() != drawing::TextFitToSizeType_NONE;
+ rSet.Put(SfxBoolItem(SID_OUTLINE_TEXT_AUTOFIT, bSet));
+ }
+
+ rSet.DisableItem(SID_GROUP);
+ rSet.DisableItem(SID_TEXT_COMBINE);
+ rSet.DisableItem(SID_COMBINE);
+ rSet.DisableItem(SID_DISTRIBUTE_HLEFT);
+ rSet.DisableItem(SID_DISTRIBUTE_HCENTER);
+ rSet.DisableItem(SID_DISTRIBUTE_HDISTANCE);
+ rSet.DisableItem(SID_DISTRIBUTE_HRIGHT);
+ rSet.DisableItem(SID_DISTRIBUTE_VTOP);
+ rSet.DisableItem(SID_DISTRIBUTE_VCENTER);
+ rSet.DisableItem(SID_DISTRIBUTE_VDISTANCE);
+ rSet.DisableItem(SID_DISTRIBUTE_VBOTTOM);
+ rSet.DisableItem(SID_POLY_MERGE);
+ rSet.DisableItem(SID_POLY_SUBSTRACT);
+ rSet.DisableItem(SID_POLY_INTERSECT);
+ rSet.DisableItem(SID_EQUALIZEWIDTH);
+ rSet.DisableItem(SID_EQUALIZEHEIGHT);
+ rSet.DisableItem(SID_CONNECT);
+ }
+ // multi-selection
+ else if( nMarkCount > 1 )
+ {
+ // distribute dialog for 3+n objects
+ if(nMarkCount <= 2)
+ {
+ rSet.DisableItem(SID_DISTRIBUTE_HLEFT);
+ rSet.DisableItem(SID_DISTRIBUTE_HCENTER);
+ rSet.DisableItem(SID_DISTRIBUTE_HDISTANCE);
+ rSet.DisableItem(SID_DISTRIBUTE_HRIGHT);
+ rSet.DisableItem(SID_DISTRIBUTE_VTOP);
+ rSet.DisableItem(SID_DISTRIBUTE_VCENTER);
+ rSet.DisableItem(SID_DISTRIBUTE_VDISTANCE);
+ rSet.DisableItem(SID_DISTRIBUTE_VBOTTOM);
+ }
+
+ rSet.DisableItem( SID_LINEEND_POLYGON );
+ rSet.DisableItem( SID_ENTER_GROUP );
+ // Now names for objects have to be unique
+ rSet.DisableItem( SID_NAME_GROUP );
+ // #i68101#
+ rSet.DisableItem( SID_OBJECT_TITLE_DESCRIPTION );
+ rSet.DisableItem( SID_MODIFY_FIELD );
+
+ {
+ bool bText = false;
+ bool bLine = false;
+ bool bGroup = false;
+ bool bDrawObj = false;
+ bool b3dObj = false;
+ bool bTable = false;
+ bool bMeasureObj = false;
+ bool bEdgeObj = false; // Connector
+ bool bE3dCompoundObject = false;
+
+ for( size_t i = 0; i < nMarkCount && !bText && i < 50; ++i )
+ {
+ SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
+ SdrInventor nInv = pObj->GetObjInventor();
+ SdrObjKind nId = pObj->GetObjIdentifier();
+
+ if (nInv == SdrInventor::Default)
+ {
+ switch (nId)
+ {
+ case SdrObjKind::Text: bText = true; break;
+
+ case SdrObjKind::Line: bLine = true; break;
+
+ case SdrObjKind::Edge: bEdgeObj = true; break;
+
+ case SdrObjKind::Measure: bMeasureObj = true; break;
+
+ case SdrObjKind::Rectangle:
+ case SdrObjKind::CircleOrEllipse:
+ case SdrObjKind::FreehandLine:
+ case SdrObjKind::FreehandFill:
+ case SdrObjKind::PathFill:
+ case SdrObjKind::PathLine:
+ case SdrObjKind::CircleSection:
+ case SdrObjKind::CircleArc:
+ case SdrObjKind::CircleCut: bDrawObj = true; break;
+
+ case SdrObjKind::Group: bGroup = true; break;
+
+ case SdrObjKind::Graphic: break;
+
+ case SdrObjKind::Table: bTable = true; break;
+ default: ;
+ }
+ }
+ else if (nInv == SdrInventor::E3d)
+ {
+ if(dynamic_cast< const E3dScene *>( pObj ) != nullptr)
+ b3dObj = true;
+ else if(dynamic_cast< const E3dCompoundObject* >(pObj) != nullptr)
+ bE3dCompoundObject = true;
+ }
+ }
+ if( bLine && !bText && !bDrawObj &&!b3dObj)
+ {
+ rSet.DisableItem( SID_ATTR_FILL_STYLE );
+ rSet.DisableItem( SID_ATTR_FILL_USE_SLIDE_BACKGROUND );
+ rSet.DisableItem( SID_ATTR_FILL_TRANSPARENCE );
+ rSet.DisableItem( SID_ATTR_FILL_FLOATTRANSPARENCE );
+ }
+ if( !bEdgeObj )
+ rSet.DisableItem( SID_CONNECTION_DLG );
+
+ if (b3dObj)
+ {
+ rSet.DisableItem( SID_COMBINE );
+ rSet.DisableItem(SID_POLY_MERGE);
+ rSet.DisableItem(SID_POLY_SUBSTRACT);
+ rSet.DisableItem(SID_POLY_INTERSECT);
+ rSet.DisableItem(SID_EQUALIZEWIDTH);
+ rSet.DisableItem(SID_EQUALIZEHEIGHT);
+ }
+
+ if (b3dObj ||
+ (!mpDrawView->IsConvertToPathObjPossible() &&
+ !mpDrawView->IsShearAllowed() &&
+ !mpDrawView->IsDistortAllowed()) )
+ {
+ rSet.DisableItem( SID_OBJECT_SHEAR );
+ }
+
+ if( !bGroup )
+ {
+ rSet.DisableItem( SID_UNGROUP );
+ }
+ if( bTable )
+ rSet.DisableItem( SID_TEXTATTR_DLG );
+
+ if( !bMeasureObj )
+ rSet.DisableItem( SID_MEASURE_DLG );
+
+ if(bE3dCompoundObject)
+ {
+ rSet.DisableItem( SID_OBJECT_ALIGN );
+ rSet.DisableItem( SID_OBJECT_ALIGN_LEFT );
+ rSet.DisableItem( SID_OBJECT_ALIGN_CENTER );
+ rSet.DisableItem( SID_OBJECT_ALIGN_RIGHT );
+ rSet.DisableItem( SID_OBJECT_ALIGN_UP );
+ rSet.DisableItem( SID_OBJECT_ALIGN_MIDDLE );
+ rSet.DisableItem( SID_OBJECT_ALIGN_DOWN );
+ rSet.DisableItem( SID_FRAME_TO_TOP );
+ rSet.DisableItem( SID_MOREFRONT );
+ rSet.DisableItem( SID_FRAME_UP );
+ rSet.DisableItem( SID_MOREBACK );
+ rSet.DisableItem( SID_FRAME_DOWN );
+ rSet.DisableItem( SID_FRAME_TO_BOTTOM );
+ rSet.DisableItem( SID_BEFORE_OBJ );
+ rSet.DisableItem( SID_BEHIND_OBJ );
+ rSet.DisableItem( SID_REVERSE_ORDER );
+ rSet.DisableItem( SID_POSITION );
+ }
+ }
+
+ if ( !mpDrawView->IsDismantlePossible() )
+ {
+ rSet.DisableItem( SID_DISMANTLE );
+ }
+ if ( !mpDrawView->IsDismantlePossible(true) &&
+ !mpDrawView->IsImportMtfPossible() &&
+ !mpDrawView->IsBreak3DObjPossible() )
+ {
+ rSet.DisableItem( SID_BREAK );
+ }
+ if ( !mpDrawView->IsCombinePossible() )
+ {
+ rSet.DisableItem(SID_COMBINE);
+ rSet.DisableItem(SID_POLY_MERGE);
+ rSet.DisableItem(SID_POLY_SUBSTRACT);
+ rSet.DisableItem(SID_POLY_INTERSECT);
+ rSet.DisableItem(SID_EQUALIZEWIDTH);
+ rSet.DisableItem(SID_EQUALIZEHEIGHT);
+ }
+ if ( !mpDrawView->IsCombinePossible(true) )
+ {
+ rSet.DisableItem( SID_CONNECT );
+ }
+ if ( !mpDrawView->IsGroupPossible() )
+ {
+ rSet.DisableItem( SID_GROUP );
+ }
+ if ( !mpDrawView->IsUnGroupPossible() )
+ {
+ rSet.DisableItem( SID_UNGROUP );
+ }
+ }
+ // select no object
+ else
+ {
+ rSet.DisableItem( SID_ENTER_GROUP );
+ rSet.DisableItem( SID_CUT );
+ rSet.DisableItem( SID_COPY );
+ rSet.DisableItem( SID_DELETE );
+ rSet.DisableItem( SID_ATTR_TRANSFORM );
+
+ rSet.DisableItem( SID_OBJECT_ALIGN );
+ rSet.DisableItem( SID_OBJECT_ALIGN_LEFT );
+ rSet.DisableItem( SID_OBJECT_ALIGN_CENTER );
+ rSet.DisableItem( SID_OBJECT_ALIGN_RIGHT );
+ rSet.DisableItem( SID_OBJECT_ALIGN_UP );
+ rSet.DisableItem( SID_OBJECT_ALIGN_MIDDLE );
+ rSet.DisableItem( SID_OBJECT_ALIGN_DOWN );
+
+ rSet.DisableItem( SID_FRAME_TO_TOP );
+ rSet.DisableItem( SID_MOREFRONT );
+ rSet.DisableItem( SID_FRAME_UP );
+ rSet.DisableItem( SID_MOREBACK );
+ rSet.DisableItem( SID_FRAME_DOWN );
+ rSet.DisableItem( SID_FRAME_TO_BOTTOM );
+ rSet.DisableItem( SID_BEFORE_OBJ );
+ rSet.DisableItem( SID_BEHIND_OBJ );
+ rSet.DisableItem( SID_POSITION );
+
+ rSet.DisableItem( SID_SIZE_OPTIMAL );
+ rSet.DisableItem( SID_LINEEND_POLYGON );
+ rSet.DisableItem( SID_COPYOBJECTS );
+ rSet.DisableItem( SID_HORIZONTAL );
+ rSet.DisableItem( SID_VERTICAL );
+ rSet.DisableItem( SID_FLIP_HORIZONTAL );
+ rSet.DisableItem( SID_FLIP_VERTICAL );
+ rSet.DisableItem( SID_GROUP );
+ rSet.DisableItem( SID_UNGROUP );
+ rSet.DisableItem( SID_NAME_GROUP );
+
+ // #i68101#
+ rSet.DisableItem( SID_OBJECT_TITLE_DESCRIPTION );
+
+ rSet.DisableItem( SID_DISMANTLE );
+ rSet.DisableItem( SID_BREAK );
+ rSet.DisableItem( SID_TEXT_COMBINE );
+ rSet.DisableItem( SID_COMBINE );
+ rSet.DisableItem(SID_DISTRIBUTE_DLG);
+ rSet.DisableItem(SID_DISTRIBUTE_HLEFT);
+ rSet.DisableItem(SID_DISTRIBUTE_HCENTER);
+ rSet.DisableItem(SID_DISTRIBUTE_HDISTANCE);
+ rSet.DisableItem(SID_DISTRIBUTE_HRIGHT);
+ rSet.DisableItem(SID_DISTRIBUTE_VTOP);
+ rSet.DisableItem(SID_DISTRIBUTE_VCENTER);
+ rSet.DisableItem(SID_DISTRIBUTE_VDISTANCE);
+ rSet.DisableItem(SID_DISTRIBUTE_VBOTTOM);
+ rSet.DisableItem(SID_POLY_MERGE);
+ rSet.DisableItem(SID_POLY_SUBSTRACT);
+ rSet.DisableItem(SID_POLY_INTERSECT);
+ rSet.DisableItem(SID_EQUALIZEWIDTH);
+ rSet.DisableItem(SID_EQUALIZEHEIGHT);
+ rSet.DisableItem( SID_CONNECT );
+ rSet.DisableItem( SID_ANIMATION_EFFECTS );
+ rSet.DisableItem( SID_EXECUTE_ANIMATION_EFFECT );
+ rSet.DisableItem( SID_MODIFY_FIELD );
+ rSet.DisableItem (SID_OBJECT_SHEAR);
+ }
+
+ if (GetObjectShell()->isContentExtractionLocked())
+ {
+ rSet.DisableItem(SID_COPY);
+ rSet.DisableItem(SID_CUT);
+ }
+ if(GetObjectShell()->isExportLocked())
+ {
+ rSet.DisableItem(SID_SAVE_GRAPHIC);
+ rSet.DisableItem(SID_EXTERNAL_EDIT);
+ }
+ if (GetDoc()->getImagePreferredDPI() <= 0)
+ {
+ rSet.DisableItem(SID_GRAPHIC_SIZE_CHECK);
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/drviewsk.cxx b/sd/source/ui/view/drviewsk.cxx
new file mode 100644
index 000000000..9daeecc02
--- /dev/null
+++ b/sd/source/ui/view/drviewsk.cxx
@@ -0,0 +1,37 @@
+/* -*- 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 <DrawViewShell.hxx>
+#include <sdmod.hxx>
+
+#include <comphelper/lok.hxx>
+
+namespace sd {
+
+void DrawViewShell::ConfigurationChanged( utl::ConfigurationBroadcaster* pCb, ConfigurationHints )
+{
+ ConfigureAppBackgroundColor( dynamic_cast<svtools::ColorConfig*>(pCb) );
+}
+
+void DrawViewShell::ConfigureAppBackgroundColor( svtools::ColorConfig *pColorConfig )
+{
+ if (!pColorConfig)
+ pColorConfig = &SD_MOD()->GetColorConfig();
+ Color aFillColor( pColorConfig->GetColorValue( svtools::APPBACKGROUND ).nColor );
+ if (comphelper::LibreOfficeKit::isActive())
+ aFillColor = COL_TRANSPARENT;
+ // tdf#87905 Use darker background color for master view
+ if (meEditMode == EditMode::MasterPage)
+ aFillColor.DecreaseLuminance( 64 );
+ mnAppBackgroundColor = aFillColor;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sd/source/ui/view/drvwshrg.cxx b/sd/source/ui/view/drvwshrg.cxx
new file mode 100644
index 000000000..792d5b833
--- /dev/null
+++ b/sd/source/ui/view/drvwshrg.cxx
@@ -0,0 +1,110 @@
+/* -*- 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 <config_features.h>
+
+#include <DrawViewShell.hxx>
+#include <sfx2/infobar.hxx>
+
+#include <svx/fontwork.hxx>
+#include <svx/bmpmask.hxx>
+#include <svx/imapdlg.hxx>
+#include <svx/SvxColorChildWindow.hxx>
+#include <sfx2/objface.hxx>
+#include <sfx2/sidebar/SidebarChildWindow.hxx>
+#include <sfx2/devtools/DevelopmentToolChildWindow.hxx>
+#include <svx/f3dchild.hxx>
+
+#include <svx/svxids.hrc>
+#include <svx/hyperdlg.hxx>
+#include <avmedia/mediaplayer.hxx>
+
+#include <app.hrc>
+
+#include <SpellDialogChildWindow.hxx>
+#include <GraphicViewShell.hxx>
+#include <AnimationChildWindow.hxx>
+
+using namespace sd;
+#define ShellClass_DrawViewShell
+#include <sdslots.hxx>
+#define ShellClass_GraphicViewShell
+#include <sdgslots.hxx>
+
+namespace sd
+{
+/**
+ * Declare SFX-Slotmap and Standardinterface
+ */
+
+SFX_IMPL_INTERFACE(DrawViewShell, SfxShell)
+
+void DrawViewShell::InitInterface_Impl()
+{
+ GetStaticInterface()->RegisterPopupMenu("drawtext");
+
+ GetStaticInterface()->RegisterChildWindow(SID_NAVIGATOR, true);
+
+ GetStaticInterface()->RegisterChildWindow(SfxInfoBarContainerChild::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SvxFontWorkChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SvxColorChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(AnimationChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(Svx3DChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SvxBmpMaskChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SvxIMapDlgChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SvxHlinkDlgWrapper::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(::sd::SpellDialogChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SID_SEARCH_DLG);
+#if HAVE_FEATURE_AVMEDIA
+ GetStaticInterface()->RegisterChildWindow(::avmedia::MediaPlayer::GetChildWindowId());
+#endif
+ GetStaticInterface()->RegisterChildWindow(
+ sfx2::sidebar::SidebarChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(DevelopmentToolChildWindow::GetChildWindowId());
+}
+
+// SdGraphicViewShell
+SFX_IMPL_INTERFACE(GraphicViewShell, SfxShell)
+
+void GraphicViewShell::InitInterface_Impl()
+{
+ GetStaticInterface()->RegisterPopupMenu("drawtext");
+
+ GetStaticInterface()->RegisterChildWindow(SID_NAVIGATOR, true);
+
+ GetStaticInterface()->RegisterChildWindow(SfxInfoBarContainerChild::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SvxFontWorkChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SvxColorChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(Svx3DChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SvxBmpMaskChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SvxIMapDlgChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SvxHlinkDlgWrapper::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(::sd::SpellDialogChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SID_SEARCH_DLG);
+#if HAVE_FEATURE_AVMEDIA
+ GetStaticInterface()->RegisterChildWindow(::avmedia::MediaPlayer::GetChildWindowId());
+#endif
+ GetStaticInterface()->RegisterChildWindow(
+ sfx2::sidebar::SidebarChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(DevelopmentToolChildWindow::GetChildWindowId());
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/frmview.cxx b/sd/source/ui/view/frmview.cxx
new file mode 100644
index 000000000..fad0dc9ad
--- /dev/null
+++ b/sd/source/ui/view/frmview.cxx
@@ -0,0 +1,916 @@
+/* -*- 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 <FrameView.hxx>
+
+#include <svx/svxids.hrc>
+#include <com/sun/star/drawing/framework/ResourceId.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <rtl/ustrbuf.hxx>
+#include <unokywds.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/svapp.hxx>
+#include <osl/diagnose.h>
+
+#include <vector>
+#include <ViewShell.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <optsitem.hxx>
+#include <ViewShellBase.hxx>
+#include <sdmod.hxx>
+#include <pres.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <comphelper/processfactory.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <officecfg/Office/Common.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::std;
+
+namespace sd {
+
+FrameView::FrameView(SdDrawDocument* pDrawDoc, FrameView* pFrameView /* = NULL */)
+: SdrView(*pDrawDoc, nullptr), // TTTT SdDrawDocument* -> should be reference
+ mnRefCount(0),
+ mnPresViewShellId(SID_VIEWSHELL0),
+ mbIsNavigatorShowingAllShapes(false)
+{
+ EndListening(*pDrawDoc);
+
+ EnableExtendedKeyInputDispatcher(false);
+ EnableExtendedMouseEventDispatcher(false);
+
+ SetGridFront( false );
+ SetHlplFront( false );
+ SetOConSnap( false );
+ SetFrameDragSingles();
+ SetSlidesPerRow(4);
+
+ if( nullptr == pFrameView )
+ {
+ DrawDocShell* pDocShell = pDrawDoc->GetDocSh();
+
+ if ( pDocShell )
+ {
+ // document is loaded, is there a FrameView?
+ sal_uLong nSdViewShellCount = 0;
+ SfxViewFrame* pSfxViewFrame = SfxViewFrame::GetFirst(pDocShell);
+
+ while (pSfxViewFrame)
+ {
+ // Count the FrameViews and remember the type of the main
+ // view shell.
+ SfxViewShell* pSfxViewSh = pSfxViewFrame->GetViewShell();
+ ViewShellBase* pBase = dynamic_cast<ViewShellBase*>( pSfxViewSh );
+
+ if (pBase != nullptr)
+ {
+ nSdViewShellCount++;
+
+ OUString sViewURL;
+ Reference<drawing::framework::XView> xView (
+ framework::FrameworkHelper::Instance(*pBase)->GetView(
+ drawing::framework::ResourceId::create(
+ ::comphelper::getProcessComponentContext(),
+ framework::FrameworkHelper::msCenterPaneURL)));
+ if (xView.is())
+ sViewURL = xView->getResourceId()->getResourceURL();
+
+ switch (framework::FrameworkHelper::GetViewId(sViewURL))
+ {
+ default:
+// case ViewShell::ST_IMPRESS:
+// case ViewShell::ST_NOTES:
+// case ViewShell::ST_HANDOUT:
+ mnPresViewShellId = SID_VIEWSHELL0;
+ break;
+
+ case ViewShell::ST_SLIDE_SORTER:
+ mnPresViewShellId = SID_VIEWSHELL1;
+ break;
+
+ case ViewShell::ST_OUTLINE:
+ mnPresViewShellId = SID_VIEWSHELL2;
+ break;
+ }
+ }
+
+ pSfxViewFrame = SfxViewFrame::GetNext(*pSfxViewFrame, pDocShell);
+ }
+
+ SdDrawDocument* pDoc = pDocShell->GetDoc();
+ pFrameView = pDoc->GetFrameView(nSdViewShellCount);
+ }
+ }
+
+ if (pFrameView)
+ {
+ // initialize FrameView with the FrameView of the DocShell
+ SetRuler( pFrameView->HasRuler() );
+ SetGridCoarse( pFrameView->GetGridCoarse() );
+ SetGridFine( pFrameView->GetGridFine() );
+ SetSnapGridWidth(pFrameView->GetSnapGridWidthX(), pFrameView->GetSnapGridWidthY());
+ SetGridVisible( pFrameView->IsGridVisible() );
+ SetGridFront( pFrameView->IsGridFront() );
+ SetSnapAngle( pFrameView->GetSnapAngle() );
+ SetGridSnap( pFrameView->IsGridSnap() );
+ SetBordSnap( pFrameView->IsBordSnap() );
+ SetHlplSnap( pFrameView->IsHlplSnap() );
+ SetOFrmSnap( pFrameView->IsOFrmSnap() );
+ SetOPntSnap( pFrameView->IsOPntSnap() );
+ SetOConSnap( pFrameView->IsOConSnap() );
+ SetHlplVisible( pFrameView->IsHlplVisible() );
+ SetDragStripes( pFrameView->IsDragStripes() );
+ SetPlusHandlesAlwaysVisible( pFrameView->IsPlusHandlesAlwaysVisible() );
+ SetFrameDragSingles( pFrameView->IsFrameDragSingles() );
+ SetSnapMagneticPixel( pFrameView->GetSnapMagneticPixel() );
+ SetMarkedHitMovesAlways( pFrameView->IsMarkedHitMovesAlways() );
+ SetMoveOnlyDragging( pFrameView->IsMoveOnlyDragging() );
+ SetCrookNoContortion( pFrameView->IsCrookNoContortion() );
+ SetSlantButShear( pFrameView->IsSlantButShear() );
+ SetNoDragXorPolys( pFrameView->IsNoDragXorPolys() );
+ SetAngleSnapEnabled( pFrameView->IsAngleSnapEnabled() );
+ SetBigOrtho( pFrameView->IsBigOrtho() );
+ SetOrtho( pFrameView->IsOrtho() );
+ SetEliminatePolyPointLimitAngle( pFrameView->GetEliminatePolyPointLimitAngle() );
+ SetEliminatePolyPoints( pFrameView->IsEliminatePolyPoints() );
+ SetDesignMode( pFrameView->IsDesignMode() );
+
+ SetSolidDragging( pFrameView->IsSolidDragging() );
+
+ maVisibleLayers = pFrameView->GetVisibleLayers();
+ maPrintableLayers = pFrameView->GetPrintableLayers();
+ maLockedLayers = pFrameView->GetLockedLayers();
+ maStandardHelpLines = pFrameView->GetStandardHelpLines();
+ maNotesHelpLines = pFrameView->GetNotesHelpLines();
+ maHandoutHelpLines = pFrameView->GetHandoutHelpLines();
+ SetActiveLayer( pFrameView->GetActiveLayer() );
+ mbNoColors = pFrameView->IsNoColors();
+ mbNoAttribs = pFrameView->IsNoAttribs() ;
+ maVisArea = pFrameView->GetVisArea();
+ mePageKind = pFrameView->GetPageKind();
+ mePageKindOnLoad = pFrameView->GetPageKindOnLoad();
+ mnSelectedPage = pFrameView->GetSelectedPage();
+ mnSelectedPageOnLoad = pFrameView->GetSelectedPageOnLoad();
+ mePageEditMode = pFrameView->GetViewShEditMode();
+ // meStandardEditMode = pFrameView->GetViewShEditMode(PageKind::Standard);
+ // meNotesEditMode = pFrameView->GetViewShEditMode(PageKind::Notes);
+ // meHandoutEditMode = pFrameView->GetViewShEditMode(PageKind::Handout);
+ SetViewShEditModeOnLoad(pFrameView->GetViewShEditModeOnLoad());
+ mbLayerMode = pFrameView->IsLayerMode();
+ mbQuickEdit = pFrameView->IsQuickEdit();
+
+ // #i26631#
+ SetMasterPagePaintCaching( pFrameView->IsMasterPagePaintCaching() );
+
+ SetDragWithCopy( pFrameView->IsDragWithCopy() );
+ mbDoubleClickTextEdit = pFrameView->IsDoubleClickTextEdit();
+ mbClickChangeRotation = pFrameView->IsClickChangeRotation();
+ mnSlidesPerRow = pFrameView->GetSlidesPerRow();
+ mnDrawMode = pFrameView->GetDrawMode();
+ mbIsNavigatorShowingAllShapes = pFrameView->IsNavigatorShowingAllShapes();
+ SetPreviousViewShellType (pFrameView->GetPreviousViewShellType());
+ SetViewShellTypeOnLoad (pFrameView->GetViewShellTypeOnLoad());
+ }
+ else
+ {
+ // initialize FrameView with the application data
+
+ // Layers need to be set, otherwise they are not visible and not printable in
+ // Impress documents. The document contains already the actual layers and their
+ // settings for visible, printable and locked. In case not read from <draw:layer-set>,
+ // ODF defaults are used.
+ SdrLayerAdmin rLayerAdmin = pDrawDoc -> GetLayerAdmin();
+ rLayerAdmin.getVisibleLayersODF(maVisibleLayers);
+ rLayerAdmin.getPrintableLayersODF(maPrintableLayers);
+ rLayerAdmin.getLockedLayersODF(maLockedLayers);
+ SetGridCoarse( Size( 1000, 1000 ) );
+ SetSnapGridWidth(Fraction(1000, 1), Fraction(1000, 1));
+ SetActiveLayer(sUNO_LayerName_layout);
+ mbNoColors = true;
+ mbNoAttribs = false;
+ maVisArea = ::tools::Rectangle( Point(), Size(0, 0) );
+ mePageKind = PageKind::Standard;
+ mePageKindOnLoad = PageKind::Standard;
+ mnSelectedPage = 0;
+ mnSelectedPageOnLoad = 0;
+ mePageEditMode = EditMode::Page;
+ // meStandardEditMode = EditMode::Page;
+ // meNotesEditMode = EditMode::Page;
+ // meHandoutEditMode = EditMode::MasterPage;
+ SetViewShEditModeOnLoad(EditMode::Page);
+ mbLayerMode = false;
+ SetEliminatePolyPoints(false);
+ mbDoubleClickTextEdit = false;
+ mbClickChangeRotation = false;
+ mnSlidesPerRow = 4;
+
+ {
+ bool bUseContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
+ mnDrawMode = bUseContrast ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR;
+ }
+ mbIsNavigatorShowingAllShapes = true;
+ SetPreviousViewShellType (ViewShell::ST_NONE);
+ SetViewShellTypeOnLoad (ViewShell::ST_IMPRESS);
+
+ // get default for design mode
+ bool bInitDesignMode = pDrawDoc->GetOpenInDesignMode();
+ if( pDrawDoc->OpenInDesignModeIsDefaulted() )
+ {
+ bInitDesignMode = true;
+ }
+
+ SfxObjectShell* pObjShell = pDrawDoc->GetObjectShell();
+ if( pObjShell && pObjShell->IsReadOnly() )
+ bInitDesignMode = false;
+ SetDesignMode( bInitDesignMode );
+
+ Update( SD_MOD()->GetSdOptions(pDrawDoc->GetDocumentType()) );
+ }
+
+}
+
+FrameView::~FrameView()
+{
+}
+
+void FrameView::Connect()
+{
+ mnRefCount++;
+}
+
+void FrameView::Disconnect()
+{
+ if (mnRefCount > 0)
+ {
+ mnRefCount--;
+ }
+
+ if (mnRefCount == 0)
+ {
+ delete this;
+ }
+}
+
+/**
+ * Update with data from the specified SdOptions
+ */
+void FrameView::Update(SdOptions const * pOptions)
+{
+ if (!pOptions)
+ return;
+
+ mbRuler = pOptions->IsRulerVisible();
+ SetGridVisible( pOptions->IsGridVisible() );
+ SetSnapAngle( pOptions->GetAngle() );
+ SetGridSnap( pOptions->IsUseGridSnap() );
+ SetBordSnap( pOptions->IsSnapBorder() );
+ SetHlplSnap( pOptions->IsSnapHelplines() );
+ SetOFrmSnap( pOptions->IsSnapFrame() );
+ SetOPntSnap( pOptions->IsSnapPoints() );
+ SetHlplVisible( pOptions->IsHelplines() );
+ SetDragStripes( pOptions->IsDragStripes() );
+ SetPlusHandlesAlwaysVisible( pOptions->IsHandlesBezier() );
+ SetSnapMagneticPixel( pOptions->GetSnapArea() );
+ SetMarkedHitMovesAlways( pOptions->IsMarkedHitMovesAlways() );
+ SetMoveOnlyDragging( pOptions->IsMoveOnlyDragging() );
+ SetSlantButShear( pOptions->IsMoveOnlyDragging() );
+ SetNoDragXorPolys ( !pOptions->IsMoveOutline() );
+ SetCrookNoContortion( pOptions->IsCrookNoContortion() );
+ SetAngleSnapEnabled( pOptions->IsRotate() );
+ SetBigOrtho( pOptions->IsBigOrtho() );
+ SetOrtho( pOptions->IsOrtho() );
+ SetEliminatePolyPointLimitAngle( pOptions->GetEliminatePolyPointLimitAngle() );
+ GetModel()->SetPickThroughTransparentTextFrames( pOptions->IsPickThrough() );
+
+ SetSolidDragging( pOptions->IsSolidDragging() );
+
+ SetGridCoarse( Size( pOptions->GetFieldDrawX(), pOptions->GetFieldDrawY() ) );
+ SetGridFine( Size( pOptions->GetFieldDivisionX(), pOptions->GetFieldDivisionY() ) );
+ Fraction aFractX(pOptions->GetFieldDrawX(), pOptions->GetFieldDrawX() / ( pOptions->GetFieldDivisionX() ? pOptions->GetFieldDivisionX() : 1 ));
+ Fraction aFractY(pOptions->GetFieldDrawY(), pOptions->GetFieldDrawY() / ( pOptions->GetFieldDivisionY() ? pOptions->GetFieldDivisionY() : 1 ));
+ SetSnapGridWidth(aFractX, aFractY);
+ SetQuickEdit(pOptions->IsQuickEdit());
+
+ // #i26631#
+ SetMasterPagePaintCaching( pOptions->IsMasterPagePaintCaching() );
+
+ SetDragWithCopy(pOptions->IsDragWithCopy());
+ SetDoubleClickTextEdit( pOptions->IsDoubleClickTextEdit() );
+ SetClickChangeRotation( pOptions->IsClickChangeRotation() );
+}
+
+/**
+ * Set EditMode (Page or MasterPage) of working mode
+ */
+void FrameView::SetViewShEditMode(EditMode eMode)
+{
+ mePageEditMode = eMode;
+}
+
+/**
+ * Return EditMode (Page or MasterPage) of working mode
+ */
+EditMode FrameView::GetViewShEditMode() const
+{
+ return mePageEditMode;
+}
+
+void FrameView::SetViewShEditModeOnLoad (EditMode eMode)
+{
+ meEditModeOnLoad = eMode;
+}
+
+static OUString createHelpLinesString( const SdrHelpLineList& rHelpLines )
+{
+ OUStringBuffer aLines;
+
+ const sal_uInt16 nCount = rHelpLines.GetCount();
+ for( sal_uInt16 nHlpLine = 0; nHlpLine < nCount; nHlpLine++ )
+ {
+ const SdrHelpLine& rHelpLine = rHelpLines[nHlpLine];
+ const Point& rPos = rHelpLine.GetPos();
+
+ switch( rHelpLine.GetKind() )
+ {
+ case SdrHelpLineKind::Point:
+ aLines.append( 'P' );
+ aLines.append( static_cast<sal_Int32>(rPos.X()) );
+ aLines.append( ',' );
+ aLines.append( static_cast<sal_Int32>(rPos.Y()) );
+ break;
+ case SdrHelpLineKind::Vertical:
+ aLines.append( 'V' );
+ aLines.append( static_cast<sal_Int32>(rPos.X()) );
+ break;
+ case SdrHelpLineKind::Horizontal:
+ aLines.append( 'H' );
+ aLines.append( static_cast<sal_Int32>(rPos.Y()) );
+ break;
+ default:
+ OSL_FAIL( "Unsupported helpline Kind!" );
+ }
+ }
+
+ return aLines.makeStringAndClear();
+}
+
+void FrameView::WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& rValues )
+{
+ std::vector< std::pair< OUString, Any > > aUserData;
+ aUserData.reserve(41); // worst case
+
+ aUserData.emplace_back( sUNO_View_GridIsVisible, Any( IsGridVisible() ) );
+ aUserData.emplace_back( sUNO_View_GridIsFront, Any( IsGridFront() ) );
+ aUserData.emplace_back( sUNO_View_IsSnapToGrid, Any( IsGridSnap() ) );
+ aUserData.emplace_back( sUNO_View_IsSnapToPageMargins, Any( IsBordSnap() ) );
+ aUserData.emplace_back( sUNO_View_IsSnapToSnapLines, Any( IsHlplSnap() ) );
+ aUserData.emplace_back( sUNO_View_IsSnapToObjectFrame, Any( IsOFrmSnap() ) );
+ aUserData.emplace_back( sUNO_View_IsSnapToObjectPoints, Any( IsOPntSnap() ) );
+
+ aUserData.emplace_back( sUNO_View_IsPlusHandlesAlwaysVisible, Any( IsPlusHandlesAlwaysVisible() ) );
+ aUserData.emplace_back( sUNO_View_IsFrameDragSingles, Any( IsFrameDragSingles() ) );
+
+ aUserData.emplace_back( sUNO_View_EliminatePolyPointLimitAngle, Any( static_cast<sal_Int32>(GetEliminatePolyPointLimitAngle()) ) );
+ aUserData.emplace_back( sUNO_View_IsEliminatePolyPoints, Any( IsEliminatePolyPoints() ) );
+
+ if ( officecfg::Office::Common::Misc::WriteLayerStateAsConfigItem::get() )
+ {
+ SdrLayerAdmin& rLayerAdmin = getSdrModelFromSdrView().GetLayerAdmin();
+ Any aAny;
+ rLayerAdmin.QueryValue(GetVisibleLayers(), aAny);
+ aUserData.emplace_back( sUNO_View_VisibleLayers, aAny );
+
+ rLayerAdmin.QueryValue(GetPrintableLayers(), aAny);
+ aUserData.emplace_back( sUNO_View_PrintableLayers, aAny );
+
+ rLayerAdmin.QueryValue(GetLockedLayers(), aAny);
+ aUserData.emplace_back( sUNO_View_LockedLayers, aAny );
+ }
+
+ aUserData.emplace_back( sUNO_View_NoAttribs, Any( IsNoAttribs() ) );
+ aUserData.emplace_back( sUNO_View_NoColors, Any( IsNoColors() ) );
+
+ if( GetStandardHelpLines().GetCount() )
+ aUserData.emplace_back( sUNO_View_SnapLinesDrawing, Any( createHelpLinesString( GetStandardHelpLines() ) ) );
+
+ if( GetNotesHelpLines().GetCount() )
+ aUserData.emplace_back( sUNO_View_SnapLinesNotes, Any( createHelpLinesString( GetNotesHelpLines() ) ) );
+
+ if( GetHandoutHelpLines().GetCount() )
+ aUserData.emplace_back( sUNO_View_SnapLinesHandout, Any( createHelpLinesString( GetHandoutHelpLines() ) ) );
+
+ aUserData.emplace_back( sUNO_View_RulerIsVisible, Any( HasRuler() ) );
+ aUserData.emplace_back( sUNO_View_PageKind, Any( static_cast<sal_Int16>(GetPageKind()) ) );
+ aUserData.emplace_back( sUNO_View_SelectedPage, Any( static_cast<sal_Int16>(GetSelectedPage()) ) );
+ aUserData.emplace_back( sUNO_View_IsLayerMode, Any( IsLayerMode() ) );
+
+ aUserData.emplace_back( sUNO_View_IsDoubleClickTextEdit, Any( IsDoubleClickTextEdit() ) );
+ aUserData.emplace_back( sUNO_View_IsClickChangeRotation, Any( IsClickChangeRotation() ) );
+
+ aUserData.emplace_back( sUNO_View_SlidesPerRow, Any( static_cast<sal_Int16>(GetSlidesPerRow()) ) );
+ aUserData.emplace_back( sUNO_View_EditMode, Any( static_cast<sal_Int32>(GetViewShEditMode()) ) );
+ // aUserData.emplace_back( sUNO_View_EditModeStandard, makeAny( (sal_Int32)GetViewShEditMode( PageKind::Standard ) ) );
+ // aUserData.emplace_back( sUNO_View_EditModeNotes, makeAny( (sal_Int32)GetViewShEditMode( PageKind::Notes ) ) );
+ // aUserData.emplace_back( sUNO_View_EditModeHandout, makeAny( (sal_Int32)GetViewShEditMode( PageKind::Handout ) ) );
+
+ {
+ const ::tools::Rectangle aVisArea = GetVisArea();
+
+ aUserData.emplace_back( sUNO_View_VisibleAreaTop, Any( static_cast<sal_Int32>(aVisArea.Top()) ) );
+ aUserData.emplace_back( sUNO_View_VisibleAreaLeft, Any( static_cast<sal_Int32>(aVisArea.Left()) ) );
+ aUserData.emplace_back( sUNO_View_VisibleAreaWidth, Any( static_cast<sal_Int32>(aVisArea.GetWidth()) ) );
+ aUserData.emplace_back( sUNO_View_VisibleAreaHeight, Any( static_cast<sal_Int32>(aVisArea.GetHeight()) ) );
+ }
+
+ aUserData.emplace_back( sUNO_View_GridCoarseWidth, Any( static_cast<sal_Int32>(GetGridCoarse().Width()) ) );
+ aUserData.emplace_back( sUNO_View_GridCoarseHeight, Any( static_cast<sal_Int32>(GetGridCoarse().Height()) ) );
+ aUserData.emplace_back( sUNO_View_GridFineWidth, Any( static_cast<sal_Int32>(GetGridFine().Width()) ) );
+ aUserData.emplace_back( sUNO_View_GridFineHeight, Any( static_cast<sal_Int32>(GetGridFine().Height()) ) );
+ aUserData.emplace_back( sUNO_View_GridSnapWidthXNumerator, Any( GetSnapGridWidthX().GetNumerator() ) );
+ aUserData.emplace_back( sUNO_View_GridSnapWidthXDenominator, Any( GetSnapGridWidthX().GetDenominator() ) );
+ aUserData.emplace_back( sUNO_View_GridSnapWidthYNumerator, Any( GetSnapGridWidthY().GetNumerator() ) );
+ aUserData.emplace_back( sUNO_View_GridSnapWidthYDenominator, Any( GetSnapGridWidthY().GetDenominator() ) );
+ aUserData.emplace_back( sUNO_View_IsAngleSnapEnabled, Any( IsAngleSnapEnabled() ) );
+ aUserData.emplace_back( sUNO_View_SnapAngle, Any( static_cast<sal_Int32>(GetSnapAngle()) ) );
+
+ const sal_Int32 nOldLength = rValues.getLength();
+ rValues.realloc( nOldLength + aUserData.size() );
+
+ PropertyValue* pValue = &(rValues.getArray()[nOldLength]);
+
+ for( const auto& rItem : aUserData )
+ {
+ pValue->Name = rItem.first;
+ pValue->Value = rItem.second;
+ ++pValue;
+ }
+}
+
+static void createHelpLinesFromString( const OUString& rLines, SdrHelpLineList& rHelpLines )
+{
+ const sal_Unicode * pStr = rLines.getStr();
+ SdrHelpLine aNewHelpLine;
+ OUStringBuffer sBuffer;
+
+ while( *pStr )
+ {
+ Point aPoint;
+
+ switch( *pStr )
+ {
+ case 'P':
+ aNewHelpLine.SetKind( SdrHelpLineKind::Point );
+ break;
+ case 'V':
+ aNewHelpLine.SetKind( SdrHelpLineKind::Vertical );
+ break;
+ case 'H':
+ aNewHelpLine.SetKind( SdrHelpLineKind::Horizontal );
+ break;
+ default:
+ OSL_FAIL( "syntax error in snap lines settings string" );
+ return;
+ }
+
+ pStr++;
+
+ while( (*pStr >= '0' && *pStr <= '9') || (*pStr == '+') || (*pStr == '-') )
+ {
+ sBuffer.append( *pStr++ );
+ }
+
+ sal_Int32 nValue = sBuffer.makeStringAndClear().toInt32();
+
+ if( aNewHelpLine.GetKind() == SdrHelpLineKind::Horizontal )
+ {
+ aPoint.setY( nValue );
+ }
+ else
+ {
+ aPoint.setX( nValue );
+
+ if( aNewHelpLine.GetKind() == SdrHelpLineKind::Point )
+ {
+ if( *pStr++ != ',' )
+ return;
+
+ while( (*pStr >= '0' && *pStr <= '9') || (*pStr == '+') || (*pStr == '-') )
+ {
+ sBuffer.append( *pStr++ );
+ }
+
+ aPoint.setY( sBuffer.makeStringAndClear().toInt32() );
+
+ }
+ }
+
+ aNewHelpLine.SetPos( aPoint );
+ rHelpLines.Insert( aNewHelpLine );
+ }
+}
+
+void FrameView::ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& rSequence )
+{
+ const sal_Int32 nLength = rSequence.getLength();
+ if (!nLength)
+ return;
+
+ SdDrawDocument* pDrawDocument = dynamic_cast<SdDrawDocument*>(GetModel());
+ const bool bImpress = pDrawDocument && pDrawDocument->GetDocumentType() == DocumentType::Impress;
+
+ bool bBool = false;
+ sal_Int32 nInt32 = 0;
+ sal_Int16 nInt16 = 0;
+ OUString aString;
+
+ sal_Int32 aSnapGridWidthXNum = GetSnapGridWidthX().GetNumerator();
+ sal_Int32 aSnapGridWidthXDom = GetSnapGridWidthX().GetDenominator();
+
+ sal_Int32 aSnapGridWidthYNum = GetSnapGridWidthY().GetNumerator();
+ sal_Int32 aSnapGridWidthYDom = GetSnapGridWidthY().GetDenominator();
+
+ for (const css::beans::PropertyValue& rValue : rSequence)
+ {
+ if ( rValue.Name == sUNO_View_ViewId )
+ {
+ }
+ else if ( rValue.Name == sUNO_View_SnapLinesDrawing )
+ {
+ if( rValue.Value >>= aString )
+ {
+ SdrHelpLineList aHelpLines;
+ createHelpLinesFromString( aString, aHelpLines );
+ SetStandardHelpLines( aHelpLines );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_SnapLinesNotes )
+ {
+ if( rValue.Value >>= aString )
+ {
+ SdrHelpLineList aHelpLines;
+ createHelpLinesFromString( aString, aHelpLines );
+ SetNotesHelpLines( aHelpLines );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_SnapLinesHandout )
+ {
+ if( rValue.Value >>= aString )
+ {
+ SdrHelpLineList aHelpLines;
+ createHelpLinesFromString( aString, aHelpLines );
+ SetHandoutHelpLines( aHelpLines );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_RulerIsVisible )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetRuler( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_PageKind )
+ {
+ if( rValue.Value >>= nInt16 )
+ {
+ SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( GetModel() );
+ if( pDoc && pDoc->GetDocSh() && ( SfxObjectCreateMode::EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) )
+ SetPageKind( static_cast<PageKind>(nInt16) );
+
+ SetPageKindOnLoad( static_cast<PageKind>(nInt16) );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_SelectedPage )
+ {
+ if( rValue.Value >>= nInt16 )
+ {
+ SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( GetModel() );
+ if( pDoc && pDoc->GetDocSh() && ( SfxObjectCreateMode::EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) )
+ SetSelectedPage( static_cast<sal_uInt16>(nInt16) );
+
+ SetSelectedPageOnLoad( static_cast<sal_uInt16>(nInt16) );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_IsLayerMode )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetLayerMode( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_IsDoubleClickTextEdit )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetDoubleClickTextEdit( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_IsClickChangeRotation )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetClickChangeRotation( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_SlidesPerRow )
+ {
+ if( rValue.Value >>= nInt16 )
+ {
+ SetSlidesPerRow( static_cast<sal_uInt16>(nInt16) );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_EditMode )
+ {
+ if( rValue.Value >>= nInt32 )
+ {
+ SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( GetModel() );
+ if( pDoc && pDoc->GetDocSh() && ( SfxObjectCreateMode::EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) )
+ SetViewShEditMode( static_cast<EditMode>(nInt32) );
+ }
+ }
+ // This one is kept for compatibility. Old value read from sUNO_View_EditModeStandard
+ // is used. New value will be written into sUNO_View_EditMode.
+ // Values from sUNO_View_EditModeNotes and sUNO_View_EditModeHangout will be ignored.
+ else if ( rValue.Name == sUNO_View_EditModeStandard )
+ {
+ if( rValue.Value >>= nInt32 )
+ {
+ SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( GetModel() );
+ if( pDoc && pDoc->GetDocSh() && ( SfxObjectCreateMode::EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) )
+ SetViewShEditMode( static_cast<EditMode>(nInt32) );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_VisibleAreaTop )
+ {
+ sal_Int32 nTop = 0;
+ if( rValue.Value >>= nTop )
+ {
+ ::tools::Rectangle aVisArea( GetVisArea() );
+ aVisArea.AdjustBottom(nTop - aVisArea.Top() );
+ aVisArea.SetTop( nTop );
+ SetVisArea( aVisArea );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_VisibleAreaLeft )
+ {
+ sal_Int32 nLeft = 0;
+ if( rValue.Value >>= nLeft )
+ {
+ ::tools::Rectangle aVisArea( GetVisArea() );
+ aVisArea.AdjustRight(nLeft - aVisArea.Left() );
+ aVisArea.SetLeft( nLeft );
+ SetVisArea( aVisArea );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_VisibleAreaWidth )
+ {
+ sal_Int32 nWidth = 0;
+ if( rValue.Value >>= nWidth )
+ {
+ ::tools::Rectangle aVisArea( GetVisArea() );
+ aVisArea.SetRight( aVisArea.Left() + nWidth - 1 );
+ SetVisArea( aVisArea );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_VisibleAreaHeight )
+ {
+ sal_Int32 nHeight = 0;
+ if( rValue.Value >>= nHeight )
+ {
+ ::tools::Rectangle aVisArea( GetVisArea() );
+ aVisArea.SetBottom( nHeight + aVisArea.Top() - 1 );
+ SetVisArea( aVisArea );
+ }
+ }
+
+ else if ( rValue.Name == sUNO_View_GridIsVisible )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetGridVisible( bBool );
+ }
+ }
+
+ else if ( rValue.Name == sUNO_View_IsSnapToGrid )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetGridSnap( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_GridIsFront )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetGridFront( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_IsSnapToPageMargins )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetBordSnap( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_IsSnapToSnapLines )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetHlplSnap( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_IsSnapToObjectFrame )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetOFrmSnap( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_IsSnapToObjectPoints )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetOPntSnap( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_IsPlusHandlesAlwaysVisible )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetPlusHandlesAlwaysVisible( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_IsFrameDragSingles )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetFrameDragSingles( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_EliminatePolyPointLimitAngle )
+ {
+ if( rValue.Value >>= nInt32 )
+ {
+ SetEliminatePolyPointLimitAngle( Degree100(nInt32) );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_IsEliminatePolyPoints )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetEliminatePolyPoints( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_ActiveLayer )
+ {
+ if( rValue.Value >>= aString )
+ {
+ SetActiveLayer( aString );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_NoAttribs )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetNoAttribs( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_NoColors )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetNoColors( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_GridCoarseWidth )
+ {
+ if( rValue.Value >>= nInt32 )
+ {
+ const Size aCoarse( nInt32, GetGridCoarse().Height() );
+ SetGridCoarse( aCoarse );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_GridCoarseHeight )
+ {
+ if( rValue.Value >>= nInt32 )
+ {
+ const Size aCoarse( GetGridCoarse().Width(), nInt32 );
+ SetGridCoarse( aCoarse );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_GridFineWidth )
+ {
+ if( rValue.Value >>= nInt32 )
+ {
+ const Size aCoarse( nInt32, GetGridFine().Height() );
+ SetGridFine( aCoarse );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_GridFineHeight )
+ {
+ if( rValue.Value >>= nInt32 )
+ {
+ const Size aCoarse( GetGridFine().Width(), nInt32 );
+ SetGridFine( aCoarse );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_IsAngleSnapEnabled )
+ {
+ if( rValue.Value >>= bBool )
+ {
+ SetAngleSnapEnabled( bBool );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_SnapAngle )
+ {
+ if( rValue.Value >>= nInt32 )
+ {
+ SetSnapAngle( Degree100(nInt32) );
+ }
+ }
+ else if ( rValue.Name == sUNO_View_GridSnapWidthXNumerator )
+ {
+ rValue.Value >>= aSnapGridWidthXNum;
+ }
+ else if ( rValue.Name == sUNO_View_GridSnapWidthXDenominator )
+ {
+ rValue.Value >>= aSnapGridWidthXDom;
+ }
+ else if ( rValue.Name == sUNO_View_GridSnapWidthYNumerator )
+ {
+ rValue.Value >>= aSnapGridWidthYNum;
+ }
+ else if ( rValue.Name == sUNO_View_GridSnapWidthYDenominator )
+ {
+ rValue.Value >>= aSnapGridWidthYDom;
+ }
+ else if (!bImpress && rValue.Name == sUNO_View_VisibleLayers )
+ {
+ SdrLayerIDSet aSdrLayerIDSets;
+ aSdrLayerIDSets.PutValue( rValue.Value );
+ SetVisibleLayers( aSdrLayerIDSets );
+ }
+ else if (!bImpress && rValue.Name == sUNO_View_PrintableLayers )
+ {
+ SdrLayerIDSet aSdrLayerIDSets;
+ aSdrLayerIDSets.PutValue( rValue.Value );
+ SetPrintableLayers( aSdrLayerIDSets );
+ }
+ else if (!bImpress && rValue.Name == sUNO_View_LockedLayers )
+ {
+ SdrLayerIDSet aSdrLayerIDSets;
+ aSdrLayerIDSets.PutValue( rValue.Value );
+ SetLockedLayers( aSdrLayerIDSets );
+ }
+ }
+
+ SetViewShEditModeOnLoad(EditMode::Page);
+
+ const Fraction aSnapGridWidthX( aSnapGridWidthXNum, aSnapGridWidthXDom );
+ const Fraction aSnapGridWidthY( aSnapGridWidthYNum, aSnapGridWidthYDom );
+
+ SetSnapGridWidth( aSnapGridWidthX, aSnapGridWidthY );
+}
+
+void FrameView::SetPreviousViewShellType (ViewShell::ShellType eType)
+{
+ mePreviousViewShellType = eType;
+}
+
+void FrameView::SetViewShellTypeOnLoad (ViewShell::ShellType eType)
+{
+ meViewShellTypeOnLoad = eType;
+}
+
+void FrameView::SetSelectedPage(sal_uInt16 nPage)
+{
+ mnSelectedPage = nPage;
+}
+
+void FrameView::SetIsNavigatorShowingAllShapes (const bool bIsNavigatorShowingAllShapes)
+{
+ mbIsNavigatorShowingAllShapes = bIsNavigatorShowingAllShapes;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/grviewsh.cxx b/sd/source/ui/view/grviewsh.cxx
new file mode 100644
index 000000000..b914b2da8
--- /dev/null
+++ b/sd/source/ui/view/grviewsh.cxx
@@ -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/.
+ *
+ * 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 <GraphicViewShell.hxx>
+#include <LayerTabBar.hxx>
+#include <FrameView.hxx>
+#include <sfx2/objsh.hxx>
+#include <sfx2/viewfrm.hxx>
+
+constexpr sal_Int32 TAB_HEIGHT_MARGIN = 10;
+
+namespace sd {
+
+GraphicViewShell::GraphicViewShell (
+ ViewShellBase& rViewShellBase,
+ vcl::Window* pParentWindow,
+ FrameView* pFrameView)
+ : DrawViewShell (
+ rViewShellBase,
+ pParentWindow,
+ PageKind::Standard,
+ pFrameView)
+{
+ ConstructGraphicViewShell();
+}
+
+GraphicViewShell::~GraphicViewShell()
+{
+}
+
+void GraphicViewShell::ConstructGraphicViewShell()
+{
+ meShellType = ST_DRAW;
+
+ mpLayerTabBar.reset (VclPtr<LayerTabBar>::Create(this, GetParentWindow()));
+
+ // #i67363# no layer tabbar in preview mode
+ if ( !GetObjectShell()->IsPreview() )
+ mpLayerTabBar->Show();
+}
+
+void GraphicViewShell::ChangeEditMode (
+ EditMode eMode,
+ bool )
+{
+ // There is no page tab that could be shown instead of the layer tab.
+ // Therefore we have it always visible regardless of what the caller
+ // said. (We have to change the callers behaviour, of course.)
+ DrawViewShell::ChangeEditMode (eMode, true);
+}
+
+void GraphicViewShell::ArrangeGUIElements()
+{
+ if (mpLayerTabBar && mpLayerTabBar->IsVisible())
+ {
+ Size aSize = mpLayerTabBar->GetSizePixel();
+ const Size aFrameSize (GetViewFrame()->GetWindow().GetOutputSizePixel());
+
+ aSize.setHeight(GetParentWindow()->GetFont().GetFontHeight() + TAB_HEIGHT_MARGIN);
+ aSize.setWidth( aFrameSize.Width() );
+
+ Point aPos (0, maViewSize.Height() - aSize.Height());
+
+ mpLayerTabBar->SetPosSizePixel (aPos, aSize);
+ }
+
+ DrawViewShell::ArrangeGUIElements();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/outlnvs2.cxx b/sd/source/ui/view/outlnvs2.cxx
new file mode 100644
index 000000000..2a890cec1
--- /dev/null
+++ b/sd/source/ui/view/outlnvs2.cxx
@@ -0,0 +1,636 @@
+/* -*- 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 <OutlineViewShell.hxx>
+
+#include <app.hrc>
+#include <svx/hlnkitem.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/zoomitem.hxx>
+#include <svx/svxids.hrc>
+#include <svx/svdoutl.hxx>
+#include <svx/zoomslideritem.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/flditem.hxx>
+#include <editeng/editstat.hxx>
+#include <unotools/useroptions.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <Window.hxx>
+#include <fubullet.hxx>
+#include <fuolbull.hxx>
+#include <fuscale.hxx>
+#include <fuchar.hxx>
+#include <fuinsfil.hxx>
+#include <fuprobjs.hxx>
+#include <futhes.hxx>
+#include <futempl.hxx>
+#include <fusldlg.hxx>
+#include <zoomlist.hxx>
+#include <fuexpand.hxx>
+#include <fusumry.hxx>
+#include <fucushow.hxx>
+#include <sdabstdlg.hxx>
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <OutlineView.hxx>
+#include <slideshow.hxx>
+#include <memory>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+
+namespace sd {
+
+/************************************************************************/
+
+/**
+ * SfxRequests for temporary functions
+ */
+
+void OutlineViewShell::FuTemporary(SfxRequest &rReq)
+{
+ DeactivateCurrentFunction();
+
+ OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() );
+ sal_uInt16 nSId = rReq.GetSlot();
+
+ switch( nSId )
+ {
+ case SID_ATTR_ZOOM:
+ {
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ if ( pArgs )
+ {
+ SvxZoomType eZT = pArgs->Get( SID_ATTR_ZOOM ).GetType();
+ switch( eZT )
+ {
+ case SvxZoomType::PERCENT:
+ SetZoom( static_cast<::tools::Long>( pArgs->Get( SID_ATTR_ZOOM ).GetValue()) );
+ Invalidate( SID_ATTR_ZOOM );
+ Invalidate( SID_ATTR_ZOOMSLIDER );
+ break;
+ default:
+ break;
+ }
+ rReq.Done();
+ }
+ else
+ {
+ // open the zoom dialog here
+ SetCurrentFunction( FuScale::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) );
+ }
+ Cancel();
+ }
+ break;
+
+ case SID_ATTR_ZOOMSLIDER:
+ {
+ const SfxItemSet* pArgs = rReq.GetArgs();
+
+ const SfxUInt16Item* pScale = (pArgs && pArgs->Count () == 1) ?
+ rReq.GetArg(SID_ATTR_ZOOMSLIDER) : nullptr;
+ if (pScale && CHECK_RANGE (5, pScale->GetValue (), 3000))
+ {
+ SetZoom (pScale->GetValue ());
+
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_ATTR_ZOOM );
+ rBindings.Invalidate( SID_ZOOM_IN );
+ rBindings.Invalidate( SID_ZOOM_OUT );
+ rBindings.Invalidate( SID_ATTR_ZOOMSLIDER );
+
+ }
+
+ Cancel();
+ rReq.Done ();
+ break;
+ }
+
+ case SID_ZOOM_IN:
+ {
+ SetZoom( std::min<::tools::Long>( GetActiveWindow()->GetZoom() * 2, GetActiveWindow()->GetMaxZoom() ) );
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0),
+ GetActiveWindow()->GetOutputSizePixel()) );
+ mpZoomList->InsertZoomRect(aVisAreaWin);
+ Invalidate( SID_ATTR_ZOOM );
+ Invalidate( SID_ZOOM_IN );
+ Invalidate(SID_ZOOM_OUT);
+ Invalidate( SID_ATTR_ZOOMSLIDER );
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_SIZE_REAL:
+ {
+ SetZoom( 100 );
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0),
+ GetActiveWindow()->GetOutputSizePixel()) );
+ mpZoomList->InsertZoomRect(aVisAreaWin);
+ Invalidate( SID_ATTR_ZOOM );
+ Invalidate( SID_ATTR_ZOOMSLIDER );
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_ZOOM_OUT:
+ {
+ SetZoom( std::max<::tools::Long>( GetActiveWindow()->GetZoom() / 2, GetActiveWindow()->GetMinZoom() ) );
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0),
+ GetActiveWindow()->GetOutputSizePixel()) );
+ mpZoomList->InsertZoomRect(aVisAreaWin);
+ Invalidate( SID_ATTR_ZOOM );
+ Invalidate( SID_ZOOM_OUT);
+ Invalidate( SID_ZOOM_IN );
+ Invalidate( SID_ATTR_ZOOMSLIDER );
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_OUTLINE_COLLAPSE_ALL:
+ {
+ pOutlinerView->CollapseAll();
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_OUTLINE_COLLAPSE:
+ {
+ pOutlinerView->Collapse();
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_OUTLINE_EXPAND_ALL:
+ {
+ pOutlinerView->ExpandAll();
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_OUTLINE_EXPAND:
+ {
+ pOutlinerView->Expand();
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_OUTLINE_FORMAT:
+ {
+ ::Outliner* pOutl = pOutlinerView->GetOutliner();
+ pOutl->SetFlatMode( !pOutl->IsFlatMode() );
+ Invalidate( SID_COLORVIEW );
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_SELECTALL:
+ {
+ ::Outliner& rOutl = pOlView->GetOutliner();
+ sal_Int32 nParaCount = rOutl.GetParagraphCount();
+ if (nParaCount > 0)
+ {
+ pOutlinerView->SelectRange( 0, nParaCount );
+ }
+ Cancel();
+ }
+ break;
+
+ case SID_PRESENTATION:
+ case SID_PRESENTATION_CURRENT_SLIDE:
+ case SID_REHEARSE_TIMINGS:
+ {
+ pOlView->PrepareClose();
+ slideshowhelp::ShowSlideShow(rReq, *GetDoc());
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_COLORVIEW:
+ {
+ ::Outliner* pOutl = pOutlinerView->GetOutliner();
+ EEControlBits nCntrl = pOutl->GetControlWord();
+
+ if ( !(nCntrl & EEControlBits::NOCOLORS) )
+ {
+ // color view is enabled: disable
+ pOutl->SetControlWord(nCntrl | EEControlBits::NOCOLORS);
+ }
+ else
+ {
+ // color view is disabled: enable
+ pOutl->SetControlWord(nCntrl & ~EEControlBits::NOCOLORS);
+ }
+
+ InvalidateWindows();
+ Invalidate( SID_COLORVIEW );
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_STYLE_EDIT:
+ case SID_STYLE_UPDATE_BY_EXAMPLE:
+ {
+ if( rReq.GetArgs() )
+ {
+ SetCurrentFunction( FuTemplate::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_PRESENTATION_DLG:
+ {
+ SetCurrentFunction( FuSlideShowDlg::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case SID_REMOTE_DLG:
+ {
+#ifdef ENABLE_SDREMOTE
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateRemoteDialog(GetFrameWeld()));
+ pDlg->Execute();
+#endif
+ }
+ break;
+
+ case SID_CUSTOMSHOW_DLG:
+ {
+ SetCurrentFunction( FuCustomShowDlg::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case SID_PHOTOALBUM:
+ {
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ vcl::Window* pWin = GetActiveWindow();
+ ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateSdPhotoAlbumDialog(
+ pWin ? pWin->GetFrameWeld() : nullptr,
+ GetDoc()));
+
+ pDlg->Execute();
+
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+ }
+
+ if(HasCurrentFunction())
+ GetCurrentFunction()->Activate();
+
+ Invalidate( SID_OUTLINE_COLLAPSE_ALL );
+ Invalidate( SID_OUTLINE_COLLAPSE );
+ Invalidate( SID_OUTLINE_EXPAND_ALL );
+ Invalidate( SID_OUTLINE_EXPAND );
+
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_OUTLINE_LEFT );
+ rBindings.Invalidate( SID_OUTLINE_RIGHT );
+ rBindings.Invalidate( SID_OUTLINE_UP );
+ rBindings.Invalidate( SID_OUTLINE_DOWN );
+
+ Invalidate( SID_OUTLINE_FORMAT );
+ Invalidate( SID_COLORVIEW );
+ Invalidate(SID_CUT);
+ Invalidate(SID_COPY);
+ Invalidate(SID_PASTE);
+ Invalidate(SID_PASTE_UNFORMATTED);
+}
+
+void OutlineViewShell::FuTemporaryModify(SfxRequest &rReq)
+{
+ sal_uInt16 nSId = rReq.GetSlot();
+ std::unique_ptr<OutlineViewModelChangeGuard, o3tl::default_delete<OutlineViewModelChangeGuard>> aGuard;
+ if (nSId != SID_OUTLINE_BULLET && nSId != FN_SVX_SET_BULLET && nSId != FN_SVX_SET_NUMBER)
+ {
+ aGuard.reset( new OutlineViewModelChangeGuard(*pOlView) );
+ }
+ DeactivateCurrentFunction();
+
+ OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() );
+ //sal_uInt16 nSId = rReq.GetSlot();
+
+ switch( nSId )
+ {
+ case SID_HYPERLINK_SETLINK:
+ {
+ const SfxItemSet* pReqArgs = rReq.GetArgs();
+
+ if (pReqArgs)
+ {
+ const SvxHyperlinkItem* pHLItem =
+ &pReqArgs->Get(SID_HYPERLINK_SETLINK);
+
+ SvxFieldItem aURLItem(SvxURLField(pHLItem->GetURL(),
+ pHLItem->GetName(),
+ SvxURLFormat::Repr), EE_FEATURE_FIELD);
+ ESelection aSel( pOutlinerView->GetSelection() );
+ pOutlinerView->InsertField(aURLItem);
+ if ( aSel.nStartPos <= aSel.nEndPos )
+ aSel.nEndPos = aSel.nStartPos + 1;
+ else
+ aSel.nStartPos = aSel.nEndPos + 1;
+ pOutlinerView->SetSelection( aSel );
+ }
+
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case FN_INSERT_SOFT_HYPHEN:
+ case FN_INSERT_HARDHYPHEN:
+ case FN_INSERT_HARD_SPACE:
+ case FN_INSERT_NNBSP:
+ case SID_INSERT_RLM :
+ case SID_INSERT_LRM :
+ case SID_INSERT_WJ :
+ case SID_INSERT_ZWSP:
+ case SID_CHARMAP:
+ {
+ SetCurrentFunction( FuBullet::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case SID_OUTLINE_BULLET:
+ case FN_SVX_SET_BULLET:
+ case FN_SVX_SET_NUMBER:
+ {
+ SetCurrentFunction( FuBulletAndPosition::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case SID_THESAURUS:
+ {
+ SetCurrentFunction( FuThesaurus::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) );
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_CHAR_DLG_EFFECT:
+ case SID_CHAR_DLG:
+ {
+ SetCurrentFunction( FuChar::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) );
+ Cancel();
+ }
+ break;
+
+ case SID_INSERTFILE:
+ {
+ SetCurrentFunction( FuInsertFile::Create(this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq) );
+ Cancel();
+ }
+ break;
+
+ case SID_PRESENTATIONOBJECT:
+ {
+ SetCurrentFunction( FuPresentationObjects::Create(this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq) );
+ Cancel();
+ }
+ break;
+
+ case SID_SET_DEFAULT:
+ {
+ pOutlinerView->RemoveAttribs(true); // sal_True = also paragraph attributes
+ Cancel();
+ rReq.Done();
+ }
+ break;
+
+ case SID_SUMMARY_PAGE:
+ {
+ pOlView->SetSelectedPages();
+ SetCurrentFunction( FuSummaryPage::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) );
+ pOlView->GetOutliner().Clear();
+ pOlView->FillOutliner();
+ pOlView->GetActualPage();
+ Cancel();
+ }
+ break;
+
+ case SID_EXPAND_PAGE:
+ {
+ pOlView->SetSelectedPages();
+ SetCurrentFunction( FuExpandPage::Create( this, GetActiveWindow(), pOlView.get(), GetDoc(), rReq ) );
+ pOlView->GetOutliner().Clear();
+ pOlView->FillOutliner();
+ pOlView->GetActualPage();
+ Cancel();
+ }
+ break;
+
+ case SID_INSERT_FLD_DATE_FIX:
+ case SID_INSERT_FLD_DATE_VAR:
+ case SID_INSERT_FLD_TIME_FIX:
+ case SID_INSERT_FLD_TIME_VAR:
+ case SID_INSERT_FLD_AUTHOR:
+ case SID_INSERT_FLD_PAGE:
+ case SID_INSERT_FLD_PAGE_TITLE:
+ case SID_INSERT_FLD_PAGES:
+ case SID_INSERT_FLD_FILE:
+ {
+ std::unique_ptr<SvxFieldItem> pFieldItem;
+
+ switch( nSId )
+ {
+ case SID_INSERT_FLD_DATE_FIX:
+ pFieldItem.reset(new SvxFieldItem(
+ SvxDateField( Date( Date::SYSTEM ), SvxDateType::Fix ), EE_FEATURE_FIELD ));
+ break;
+
+ case SID_INSERT_FLD_DATE_VAR:
+ pFieldItem.reset(new SvxFieldItem( SvxDateField(), EE_FEATURE_FIELD ));
+ break;
+
+ case SID_INSERT_FLD_TIME_FIX:
+ pFieldItem.reset(new SvxFieldItem(
+ SvxExtTimeField( ::tools::Time( ::tools::Time::SYSTEM ), SvxTimeType::Fix ), EE_FEATURE_FIELD ));
+ break;
+
+ case SID_INSERT_FLD_TIME_VAR:
+ pFieldItem.reset(new SvxFieldItem( SvxExtTimeField(), EE_FEATURE_FIELD ));
+ break;
+
+ case SID_INSERT_FLD_AUTHOR:
+ {
+ SvtUserOptions aUserOptions;
+ pFieldItem.reset(new SvxFieldItem(
+ SvxAuthorField(
+ aUserOptions.GetFirstName(), aUserOptions.GetLastName(), aUserOptions.GetID() )
+ , EE_FEATURE_FIELD ));
+ }
+ break;
+
+ case SID_INSERT_FLD_PAGE:
+ pFieldItem.reset(new SvxFieldItem( SvxPageField(), EE_FEATURE_FIELD ));
+ break;
+
+ case SID_INSERT_FLD_PAGE_TITLE:
+ pFieldItem.reset(new SvxFieldItem( SvxPageTitleField(), EE_FEATURE_FIELD));
+ break;
+
+ case SID_INSERT_FLD_PAGES:
+ pFieldItem.reset(new SvxFieldItem( SvxPagesField(), EE_FEATURE_FIELD ));
+ break;
+
+ case SID_INSERT_FLD_FILE:
+ {
+ OUString aName;
+ if( GetDocSh()->HasName() )
+ aName = GetDocSh()->GetMedium()->GetName();
+ //else
+ // aName = GetDocSh()->GetName();
+ pFieldItem.reset(new SvxFieldItem( SvxExtFileField( aName ), EE_FEATURE_FIELD ));
+ }
+ break;
+ }
+
+ const SvxFieldItem* pOldFldItem = pOutlinerView->GetFieldAtSelection();
+
+ if( pOldFldItem && ( nullptr != dynamic_cast< const SvxURLField *>( pOldFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxDateField *>( pOldFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxTimeField *>( pOldFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtTimeField *>( pOldFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtFileField *>( pOldFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxAuthorField *>( pOldFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxPageField *>( pOldFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxPagesField *>( pOldFldItem->GetField() )) )
+ {
+ // select field, so it gets deleted on Insert
+ ESelection aSel = pOutlinerView->GetSelection();
+ if( aSel.nStartPos == aSel.nEndPos )
+ aSel.nEndPos++;
+ pOutlinerView->SetSelection( aSel );
+ }
+
+ if( pFieldItem )
+ pOutlinerView->InsertField( *pFieldItem );
+
+ pFieldItem.reset();
+
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+
+ case SID_MODIFY_FIELD:
+ {
+ const SvxFieldItem* pFldItem = pOutlinerView->GetFieldAtSelection();
+
+ if( pFldItem && (nullptr != dynamic_cast< const SvxDateField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxAuthorField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtFileField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtTimeField *>( pFldItem->GetField() ) ) )
+ {
+ // Dialog...
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ vcl::Window* pWin = GetActiveWindow();
+ ScopedVclPtr<AbstractSdModifyFieldDlg> pDlg(pFact->CreateSdModifyFieldDlg(pWin ? pWin->GetFrameWeld() : nullptr, pFldItem->GetField(), pOutlinerView->GetAttribs() ));
+ if( pDlg->Execute() == RET_OK )
+ {
+ std::unique_ptr<SvxFieldData> pField(pDlg->GetField());
+ if( pField )
+ {
+ SvxFieldItem aFieldItem( *pField, EE_FEATURE_FIELD );
+ //pOLV->DeleteSelected(); <-- unfortunately missing!
+ // select field, so it gets deleted on Insert
+ ESelection aSel = pOutlinerView->GetSelection();
+ bool bSel = true;
+ if( aSel.nStartPos == aSel.nEndPos )
+ {
+ bSel = false;
+ aSel.nEndPos++;
+ }
+ pOutlinerView->SetSelection( aSel );
+
+ pOutlinerView->InsertField( aFieldItem );
+
+ // reset selection to original state
+ if( !bSel )
+ aSel.nEndPos--;
+ pOutlinerView->SetSelection( aSel );
+
+ pField.reset();
+ }
+
+ SfxItemSet aSet( pDlg->GetItemSet() );
+ if( aSet.Count() )
+ {
+ pOutlinerView->SetAttribs( aSet );
+
+ ::Outliner* pOutliner = pOutlinerView->GetOutliner();
+ if( pOutliner )
+ pOutliner->UpdateFields();
+ }
+ }
+ }
+
+ Cancel();
+ rReq.Ignore ();
+ }
+ break;
+ }
+
+ if(HasCurrentFunction())
+ GetCurrentFunction()->Activate();
+
+ Invalidate( SID_OUTLINE_COLLAPSE_ALL );
+ Invalidate( SID_OUTLINE_COLLAPSE );
+ Invalidate( SID_OUTLINE_EXPAND_ALL );
+ Invalidate( SID_OUTLINE_EXPAND );
+
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_OUTLINE_LEFT );
+ rBindings.Invalidate( SID_OUTLINE_RIGHT );
+ rBindings.Invalidate( SID_OUTLINE_UP );
+ rBindings.Invalidate( SID_OUTLINE_DOWN );
+
+ Invalidate( SID_OUTLINE_FORMAT );
+ Invalidate( SID_COLORVIEW );
+ Invalidate(SID_CUT);
+ Invalidate(SID_COPY);
+ Invalidate(SID_PASTE);
+ Invalidate(SID_PASTE_UNFORMATTED);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/outlnvsh.cxx b/sd/source/ui/view/outlnvsh.cxx
new file mode 100644
index 000000000..0eb351f91
--- /dev/null
+++ b/sd/source/ui/view/outlnvsh.cxx
@@ -0,0 +1,1883 @@
+/* -*- 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 <OutlineViewShell.hxx>
+
+#include <helpids.h>
+#include <app.hrc>
+#include <svx/hyperdlg.hxx>
+#include <svx/zoomslideritem.hxx>
+#include <svx/svdundo.hxx>
+
+#include <sfx2/infobar.hxx>
+#include <sfx2/objface.hxx>
+#include <sfx2/zoomitem.hxx>
+#include <editeng/editview.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/flditem.hxx>
+#include <sfx2/shell.hxx>
+#include <sfx2/request.hxx>
+#include <svx/hlnkitem.hxx>
+#include <svx/svdotext.hxx>
+#include <svx/svdoutl.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <vcl/commandevent.hxx>
+#include <vcl/scrbar.hxx>
+#include <vcl/settings.hxx>
+
+#include <sal/log.hxx>
+#include <svl/stritem.hxx>
+#include <svl/whiter.hxx>
+#include <editeng/editstat.hxx>
+#include <svl/itempool.hxx>
+#include <sfx2/tplpitem.hxx>
+#include <sfx2/sidebar/SidebarChildWindow.hxx>
+#include <vcl/EnumContext.hxx>
+#include <sot/formats.hxx>
+#include <com/sun/star/linguistic2/XThesaurus.hpp>
+#include <editeng/unolingu.hxx>
+#include <editeng/outlobj.hxx>
+#include <svl/cjkoptions.hxx>
+#include <svtools/cliplistener.hxx>
+#include <svl/srchitem.hxx>
+#include <editeng/editobj.hxx>
+#include <fubullet.hxx>
+
+#include <strings.hrc>
+
+#include <Window.hxx>
+#include <drawdoc.hxx>
+#include <sdresid.hxx>
+#include <sdpage.hxx>
+#include <fuoltext.hxx>
+#include <FrameView.hxx>
+#include <zoomlist.hxx>
+#include <stlsheet.hxx>
+#include <SdUnoOutlineView.hxx>
+#include <SpellDialogChildWindow.hxx>
+
+#include <AccessibleOutlineView.hxx>
+#include <ViewShellBase.hxx>
+#include <DrawController.hxx>
+#include <DrawDocShell.hxx>
+#include <OutlineView.hxx>
+#include <framework/FrameworkHelper.hxx>
+#include <sfx2/devtools/DevelopmentToolChildWindow.hxx>
+
+#include <memory>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::linguistic2;
+
+using namespace sd;
+
+#define ShellClass_OutlineViewShell
+#include <sdslots.hxx>
+
+namespace sd {
+
+#define MIN_ZOOM 10 // minimum zoom factor
+#define MAX_ZOOM 1000 // maximum zoom factor
+
+/**
+ * Declare SFX-Slotmap and standard interface
+ */
+SFX_IMPL_INTERFACE(OutlineViewShell, SfxShell)
+
+void OutlineViewShell::InitInterface_Impl()
+{
+ GetStaticInterface()->RegisterPopupMenu("outline");
+
+ GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_TOOLS, SfxVisibilityFlags::Standard | SfxVisibilityFlags::FullScreen | SfxVisibilityFlags::Server,
+ ToolbarId::Outline_Toolbox);
+ GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_APPLICATION, SfxVisibilityFlags::Standard | SfxVisibilityFlags::Client | SfxVisibilityFlags::Viewer | SfxVisibilityFlags::ReadonlyDoc,
+ ToolbarId::Draw_Viewer_Toolbox);
+
+ GetStaticInterface()->RegisterChildWindow(SfxInfoBarContainerChild::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SvxHlinkDlgWrapper::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(::sd::SpellDialogChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(SID_SEARCH_DLG);
+ GetStaticInterface()->RegisterChildWindow(sfx2::sidebar::SidebarChildWindow::GetChildWindowId());
+ GetStaticInterface()->RegisterChildWindow(DevelopmentToolChildWindow::GetChildWindowId());
+}
+
+
+/**
+ * common initialization part of both constructors
+ */
+void OutlineViewShell::Construct()
+{
+ bool bModified = GetDoc()->IsChanged();
+
+ meShellType = ST_OUTLINE;
+ Size aSize(29700, 21000);
+ Point aWinPos (0, 0);
+ Point aViewOrigin(0, 0);
+ GetActiveWindow()->SetMinZoomAutoCalc(false);
+ GetActiveWindow()->SetMinZoom( MIN_ZOOM );
+ GetActiveWindow()->SetMaxZoom( MAX_ZOOM );
+ InitWindows(aViewOrigin, aSize, aWinPos);
+ pOlView.reset( new OutlineView(*GetDocSh(), GetActiveWindow(), *this) );
+ mpView = pOlView.get(); // Pointer of base class ViewShell
+
+ SetPool( &GetDoc()->GetPool() );
+
+ SetZoom(69);
+
+ // Apply settings of FrameView
+ ReadFrameViewData(mpFrameView);
+
+ ::Outliner& rOutl = pOlView->GetOutliner();
+ rOutl.SetUpdateLayout(true);
+
+ if (!bModified)
+ {
+ rOutl.ClearModifyFlag();
+ }
+
+ pLastPage = GetActualPage();
+
+ SetName( "OutlineViewShell" );
+
+ GetActiveWindow()->SetHelpId( HID_SDOUTLINEVIEWSHELL );
+}
+
+Reference<drawing::XDrawSubController> OutlineViewShell::CreateSubController()
+{
+ Reference<drawing::XDrawSubController> xSubController;
+
+ if (IsMainViewShell())
+ {
+ // Create uno sub controller for the main view shell.
+ xSubController.set( new SdUnoOutlineView(*this) );
+ }
+
+ return xSubController;
+}
+
+/**
+ * Default constructor, windows must not center themselves automatically
+ */
+OutlineViewShell::OutlineViewShell (
+ SfxViewFrame* /*pFrame*/,
+ ViewShellBase& rViewShellBase,
+ vcl::Window* pParentWindow,
+ FrameView* pFrameViewArgument)
+ : ViewShell(pParentWindow, rViewShellBase),
+ pLastPage( nullptr ),
+ bPastePossible(false),
+ mbInitialized(false)
+
+{
+ if (pFrameViewArgument != nullptr)
+ mpFrameView = pFrameViewArgument;
+ else
+ mpFrameView = new FrameView(GetDoc());
+
+ mpFrameView->Connect();
+
+ Construct();
+
+ SetContextName(vcl::EnumContext::GetContextName(vcl::EnumContext::Context::OutlineText));
+
+ m_StrOldPageName.clear();
+
+ doShow();
+}
+
+OutlineViewShell::~OutlineViewShell()
+{
+ DisposeFunctions();
+
+ pOlView.reset();
+
+ mpFrameView->Disconnect();
+
+ if ( mxClipEvtLstnr.is() )
+ {
+ mxClipEvtLstnr->RemoveListener( GetActiveWindow() );
+ mxClipEvtLstnr->ClearCallbackLink(); // prevent callback if another thread is waiting
+ }
+}
+
+void OutlineViewShell::Shutdown()
+{
+ ViewShell::Shutdown();
+
+ PrepareClose();
+}
+
+/**
+ * Paint method: the event gets forwarded from pWindow to the Viewshell
+ * and the current function
+ */
+void OutlineViewShell::Paint(const ::tools::Rectangle& rRect, ::sd::Window* pWin)
+{
+ if (pOlView)
+ {
+ pOlView->Paint(rRect, pWin);
+ }
+}
+
+void OutlineViewShell::ArrangeGUIElements ()
+{
+ // Retrieve the current size (thickness) of the scroll bars. That is
+ // the width of the vertical and the height of the horizontal scroll
+ // bar.
+ int nScrollBarSize =
+ GetParentWindow()->GetSettings().GetStyleSettings().GetScrollBarSize();
+ maScrBarWH = Size (nScrollBarSize, nScrollBarSize);
+
+ ViewShell::ArrangeGUIElements ();
+
+ ::sd::Window* pWindow = mpContentWindow.get();
+ if (pWindow == nullptr)
+ return;
+
+ pWindow->SetMinZoomAutoCalc(false);
+
+ // change OutputArea of the OutlinerView
+ OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWindow);
+
+ ::tools::Rectangle aWin(Point(0,0), pWindow->GetOutputSizePixel());
+
+ aWin = pWindow->PixelToLogic(aWin);
+ pOutlinerView->SetOutputArea(aWin);
+
+ ::tools::Rectangle aVis = pOutlinerView->GetVisArea();
+
+ ::tools::Rectangle aText(Point(0,0),
+ Size(pOlView->GetPaperWidth(),
+ pOlView->GetOutliner().GetTextHeight()));
+ if (aWin.GetHeight() > aText.Bottom())
+ aText.SetBottom( aWin.GetHeight() );
+
+ if (!aWin.IsEmpty()) // not when opening
+ {
+ InitWindows(Point(0,0), aText.GetSize(), aVis.TopLeft());
+ UpdateScrollBars();
+ }
+}
+
+/**
+ * Handle SfxRequest for the Controller
+ */
+void OutlineViewShell::ExecCtrl(SfxRequest &rReq)
+{
+ sal_uInt16 nSlot = rReq.GetSlot();
+ switch ( nSlot )
+ {
+ case SID_MAIL_SCROLLBODY_PAGEDOWN:
+ {
+ ExecReq( rReq );
+ break;
+ }
+
+ case SID_OPT_LOCALE_CHANGED:
+ {
+ pOlView->GetOutliner().UpdateFields();
+ UpdatePreview( GetActualPage() );
+ rReq.Done();
+ break;
+ }
+
+ default:
+ break;
+ }
+}
+
+/**
+ * Activate(): during the first invocation the fields get updated
+ */
+void OutlineViewShell::Activate( bool bIsMDIActivate )
+{
+ if ( ! mbInitialized)
+ {
+ mbInitialized = true;
+ SfxRequest aRequest (SID_EDIT_OUTLINER, SfxCallMode::SLOT, GetDoc()->GetItemPool());
+ FuPermanent (aRequest);
+ }
+
+ ViewShell::Activate( bIsMDIActivate );
+ SfxShell::BroadcastContextForActivation(true);
+
+ pOlView->SetLinks();
+ pOlView->ConnectToApplication();
+
+ if( bIsMDIActivate )
+ {
+ OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() );
+ ::Outliner* pOutl = pOutlinerView->GetOutliner();
+ pOutl->UpdateFields();
+ }
+}
+
+void OutlineViewShell::Deactivate( bool bIsMDIActivate )
+{
+ pOlView->DisconnectFromApplication();
+
+ // Links must be kept also on deactivated viewshell, to allow drag'n'drop
+ // to function properly
+ ViewShell::Deactivate( bIsMDIActivate );
+}
+
+/**
+ * Set status of Controller-SfxSlots
+ */
+void OutlineViewShell::GetCtrlState(SfxItemSet &rSet)
+{
+ if (SfxItemState::DEFAULT == rSet.GetItemState(SID_HYPERLINK_GETLINK))
+ {
+ SvxHyperlinkItem aHLinkItem;
+
+ OutlinerView* pOLV = pOlView->GetViewByWindow(GetActiveWindow());
+ if (pOLV)
+ {
+ const SvxFieldItem* pFieldItem = pOLV->GetFieldAtSelection();
+ if (pFieldItem)
+ {
+ ESelection aSel = pOLV->GetSelection();
+ if ( abs( aSel.nEndPos - aSel.nStartPos ) == 1 )
+ {
+ const SvxFieldData* pField = pFieldItem->GetField();
+ if ( auto pUrlField = dynamic_cast< const SvxURLField *>( pField ) )
+ {
+ aHLinkItem.SetName(pUrlField->GetRepresentation());
+ aHLinkItem.SetURL(pUrlField->GetURL());
+ aHLinkItem.SetTargetFrame(pUrlField->GetTargetFrame());
+ }
+ }
+ }
+ }
+ rSet.Put(aHLinkItem);
+ }
+ rSet.Put( SfxBoolItem( SID_READONLY_MODE, GetDocSh()->IsReadOnly() ) );
+
+ if ( SfxItemState::DEFAULT == rSet.GetItemState(SID_MAIL_SCROLLBODY_PAGEDOWN) )
+ rSet.Put( SfxBoolItem( SID_MAIL_SCROLLBODY_PAGEDOWN, true ) );
+
+ if ( !(SfxItemState::DEFAULT == rSet.GetItemState(SID_TRANSLITERATE_HALFWIDTH) ||
+ SfxItemState::DEFAULT == rSet.GetItemState(SID_TRANSLITERATE_FULLWIDTH) ||
+ SfxItemState::DEFAULT == rSet.GetItemState(SID_TRANSLITERATE_HIRAGANA) ||
+ SfxItemState::DEFAULT == rSet.GetItemState(SID_TRANSLITERATE_KATAKANA)) )
+ return;
+
+ if( !SvtCJKOptions::IsChangeCaseMapEnabled() )
+ {
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, false );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, false );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, false );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAKANA, false );
+ rSet.DisableItem( SID_TRANSLITERATE_HALFWIDTH );
+ rSet.DisableItem( SID_TRANSLITERATE_FULLWIDTH );
+ rSet.DisableItem( SID_TRANSLITERATE_HIRAGANA );
+ rSet.DisableItem( SID_TRANSLITERATE_KATAKANA );
+ }
+ else
+ {
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, true );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, true );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, true );
+ GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAKANA, true );
+ }
+}
+
+/**
+ * SfxRequests for support functions
+ */
+void OutlineViewShell::FuSupport(SfxRequest &rReq)
+{
+ if( rReq.GetSlot() == SID_STYLE_FAMILY && rReq.GetArgs())
+ GetDocSh()->SetStyleFamily(static_cast<SfxStyleFamily>(rReq.GetArgs()->Get( SID_STYLE_FAMILY ).GetValue()));
+
+ bool bPreviewState = false;
+ sal_uLong nSlot = rReq.GetSlot();
+
+ std::unique_ptr<OutlineViewModelChangeGuard, o3tl::default_delete<OutlineViewModelChangeGuard>> aGuard;
+ if( pOlView && (
+ (nSlot == SID_TRANSLITERATE_SENTENCE_CASE) ||
+ (nSlot == SID_TRANSLITERATE_TITLE_CASE) ||
+ (nSlot == SID_TRANSLITERATE_TOGGLE_CASE) ||
+ (nSlot == SID_TRANSLITERATE_UPPER) ||
+ (nSlot == SID_TRANSLITERATE_LOWER) ||
+ (nSlot == SID_TRANSLITERATE_HALFWIDTH) ||
+ (nSlot == SID_TRANSLITERATE_FULLWIDTH) ||
+ (nSlot == SID_TRANSLITERATE_HIRAGANA) ||
+ (nSlot == SID_TRANSLITERATE_KATAKANA) ||
+ (nSlot == SID_CUT) ||
+ (nSlot == SID_PASTE) ||
+ (nSlot == SID_PASTE_UNFORMATTED) ||
+ (nSlot == SID_DELETE)))
+ {
+ aGuard.reset( new OutlineViewModelChangeGuard( *pOlView ) );
+ }
+
+ switch ( nSlot )
+ {
+ case SID_CUT:
+ {
+ if(HasCurrentFunction())
+ {
+ GetCurrentFunction()->DoCut();
+ }
+ else if (pOlView)
+ {
+ pOlView->DoCut();
+ }
+ rReq.Done();
+ bPreviewState = true;
+ }
+ break;
+
+ case SID_COPY:
+ {
+ if(HasCurrentFunction())
+ {
+ GetCurrentFunction()->DoCopy();
+ }
+ else if (pOlView)
+ {
+ pOlView->DoCopy();
+ }
+ rReq.Done();
+ bPreviewState = true;
+ }
+ break;
+
+ case SID_PASTE:
+ {
+ OutlineViewPageChangesGuard aGuard2(pOlView.get());
+
+ if(HasCurrentFunction())
+ {
+ GetCurrentFunction()->DoPaste();
+ }
+ else if (pOlView)
+ {
+ pOlView->DoPaste();
+ }
+ rReq.Done();
+ bPreviewState = true;
+ }
+ break;
+
+ case SID_PASTE_UNFORMATTED:
+ {
+ OutlineViewPageChangesGuard aGuard2(pOlView.get());
+
+ if(HasCurrentFunction())
+ {
+ GetCurrentFunction()->DoPasteUnformatted();
+ }
+ else if(pOlView)
+ {
+ TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) );
+ if (aDataHelper.GetTransferable().is())
+ {
+ sal_Int8 nAction = DND_ACTION_COPY;
+ pOlView->InsertData( aDataHelper,
+ GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(), GetActiveWindow()->GetOutputSizePixel() ).Center() ),
+ nAction, false, SotClipboardFormatId::STRING);
+ }
+ }
+
+ rReq.Ignore ();
+ }
+ break;
+ case SID_DELETE:
+ {
+ if( pOlView )
+ {
+ OutlinerView* pOutlView = pOlView->GetViewByWindow(GetActiveWindow());
+ if (pOutlView)
+ {
+ OutlineViewPageChangesGuard aGuard2(pOlView.get());
+
+ vcl::KeyCode aKCode(KEY_DELETE);
+ KeyEvent aKEvt( 0, aKCode );
+ pOutlView->PostKeyEvent(aKEvt);
+
+ rtl::Reference<FuPoor> xFunc( GetCurrentFunction() );
+ FuOutlineText* pFuOutlineText = dynamic_cast< FuOutlineText* >( xFunc.get() );
+ if( pFuOutlineText )
+ pFuOutlineText->UpdateForKeyPress (aKEvt);
+ }
+ }
+ rReq.Done();
+ bPreviewState = true;
+ }
+ break;
+
+ case SID_DRAWINGMODE:
+ case SID_SLIDE_MASTER_MODE:
+ case SID_NOTES_MODE:
+ case SID_NOTES_MASTER_MODE:
+ case SID_HANDOUT_MASTER_MODE:
+ case SID_SLIDE_SORTER_MODE:
+ case SID_OUTLINE_MODE:
+ framework::FrameworkHelper::Instance(GetViewShellBase())->HandleModeChangeSlot(
+ nSlot,
+ rReq);
+ rReq.Done();
+ break;
+
+ case SID_RULER:
+ SetRuler( !HasRuler() );
+ Invalidate( SID_RULER );
+ rReq.Done();
+ break;
+
+ case SID_ZOOM_PREV:
+ {
+ if (mpZoomList->IsPreviousPossible())
+ {
+ SetZoomRect(mpZoomList->GetPreviousZoomRect());
+ }
+ rReq.Done ();
+ }
+ break;
+
+ case SID_ZOOM_NEXT:
+ {
+ if (mpZoomList->IsNextPossible())
+ {
+ SetZoomRect(mpZoomList->GetNextZoomRect());
+ }
+ rReq.Done ();
+ }
+ break;
+
+ case SID_AUTOSPELL_CHECK:
+ {
+ GetDoc()->SetOnlineSpell(!GetDoc()->GetOnlineSpell());
+ rReq.Done ();
+ }
+ break;
+
+ case SID_TRANSLITERATE_SENTENCE_CASE:
+ case SID_TRANSLITERATE_TITLE_CASE:
+ case SID_TRANSLITERATE_TOGGLE_CASE:
+ case SID_TRANSLITERATE_UPPER:
+ case SID_TRANSLITERATE_LOWER:
+ case SID_TRANSLITERATE_HALFWIDTH:
+ case SID_TRANSLITERATE_FULLWIDTH:
+ case SID_TRANSLITERATE_HIRAGANA:
+ case SID_TRANSLITERATE_KATAKANA:
+ {
+ OutlinerView* pOLV = pOlView ? pOlView->GetViewByWindow( GetActiveWindow() ) : nullptr;
+ if( pOLV )
+ {
+ TransliterationFlags nType = TransliterationFlags::NONE;
+
+ switch( nSlot )
+ {
+ case SID_TRANSLITERATE_SENTENCE_CASE:
+ nType = TransliterationFlags::SENTENCE_CASE;
+ break;
+ case SID_TRANSLITERATE_TITLE_CASE:
+ nType = TransliterationFlags::TITLE_CASE;
+ break;
+ case SID_TRANSLITERATE_TOGGLE_CASE:
+ nType = TransliterationFlags::TOGGLE_CASE;
+ break;
+ case SID_TRANSLITERATE_UPPER:
+ nType = TransliterationFlags::LOWERCASE_UPPERCASE;
+ break;
+ case SID_TRANSLITERATE_LOWER:
+ nType = TransliterationFlags::UPPERCASE_LOWERCASE;
+ break;
+ case SID_TRANSLITERATE_HALFWIDTH:
+ nType = TransliterationFlags::FULLWIDTH_HALFWIDTH;
+ break;
+ case SID_TRANSLITERATE_FULLWIDTH:
+ nType = TransliterationFlags::HALFWIDTH_FULLWIDTH;
+ break;
+ case SID_TRANSLITERATE_HIRAGANA:
+ nType = TransliterationFlags::KATAKANA_HIRAGANA;
+ break;
+ case SID_TRANSLITERATE_KATAKANA:
+ nType = TransliterationFlags::HIRAGANA_KATAKANA;
+ break;
+ }
+
+ pOLV->TransliterateText( nType );
+ }
+
+ rReq.Done();
+ bPreviewState = true;
+ }
+ break;
+
+ // added Undo/Redo handling
+ case SID_UNDO :
+ {
+ OutlineViewPageChangesGuard aGuard2(pOlView.get());
+ ImpSidUndo(rReq);
+ }
+ break;
+ case SID_REDO :
+ {
+ OutlineViewPageChangesGuard aGuard2(pOlView.get());
+ ImpSidRedo(rReq);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if( bPreviewState )
+ Invalidate( SID_PREVIEW_STATE );
+
+ Invalidate(SID_CUT);
+ Invalidate(SID_COPY);
+ Invalidate(SID_PASTE);
+}
+
+/**
+ * SfxRequests for permanent functions
+ */
+void OutlineViewShell::FuPermanent(SfxRequest &rReq)
+{
+ if(HasCurrentFunction())
+ {
+ DeactivateCurrentFunction(true);
+ }
+
+ switch ( rReq.GetSlot() )
+ {
+ case SID_EDIT_OUTLINER:
+ {
+ ::Outliner& rOutl = pOlView->GetOutliner();
+ rOutl.GetUndoManager().Clear();
+ rOutl.UpdateFields();
+
+ SetCurrentFunction( FuOutlineText::Create(this,GetActiveWindow(),pOlView.get(),GetDoc(),rReq) );
+
+ rReq.Done();
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if(HasOldFunction())
+ {
+ GetOldFunction()->Deactivate();
+ SetOldFunction(nullptr);
+ }
+
+ if(HasCurrentFunction())
+ {
+ GetCurrentFunction()->Activate();
+ SetOldFunction(GetCurrentFunction());
+ }
+}
+
+IMPL_LINK( OutlineViewShell, ClipboardChanged, TransferableDataHelper*, pDataHelper, void )
+{
+ bPastePossible = pDataHelper->GetFormatCount() != 0 &&
+ ( pDataHelper->HasFormat( SotClipboardFormatId::STRING ) ||
+ pDataHelper->HasFormat( SotClipboardFormatId::RTF ) ||
+ pDataHelper->HasFormat( SotClipboardFormatId::RICHTEXT ) ||
+ pDataHelper->HasFormat( SotClipboardFormatId::HTML ) );
+
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_PASTE );
+ rBindings.Invalidate( SID_PASTE_SPECIAL );
+ rBindings.Invalidate( SID_PASTE_UNFORMATTED );
+ rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
+}
+
+/**
+ * Set Status (Enabled/Disabled) of Menu-SfxSlots
+ */
+void OutlineViewShell::GetMenuState( SfxItemSet &rSet )
+{
+ ViewShell::GetMenuState(rSet);
+
+ rSet.Put(SfxBoolItem(SID_SLIDE_SORTER_MODE, false));
+ rSet.Put(SfxBoolItem(SID_DRAWINGMODE, false));
+ rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false));
+ rSet.Put(SfxBoolItem(SID_OUTLINE_MODE, true));
+ rSet.Put(SfxBoolItem(SID_NOTES_MODE, false));
+ rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false));
+ rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false));
+
+ if (!mpZoomList->IsNextPossible())
+ {
+ rSet.DisableItem(SID_ZOOM_NEXT);
+ }
+ if (!mpZoomList->IsPreviousPossible())
+ {
+ rSet.DisableItem(SID_ZOOM_PREV);
+ }
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ZOOM_IN ) ||
+ SfxItemState::DEFAULT == rSet.GetItemState( SID_ZOOM_OUT ) )
+ {
+ if( GetActiveWindow()->GetZoom() <= GetActiveWindow()->GetMinZoom() || GetDocSh()->IsUIActive() )
+ rSet.DisableItem( SID_ZOOM_OUT );
+ if( GetActiveWindow()->GetZoom() >= GetActiveWindow()->GetMaxZoom() || GetDocSh()->IsUIActive() )
+ rSet.DisableItem( SID_ZOOM_IN );
+ }
+
+ ::Outliner& rOutl = pOlView->GetOutliner();
+
+ // allow 'Select All'?
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_SELECTALL ) )
+ {
+ sal_Int32 nParaCount = rOutl.GetParagraphCount();
+ bool bDisable = nParaCount == 0;
+ if (!bDisable && nParaCount == 1)
+ {
+ OUString aTest = rOutl.GetText(rOutl.GetParagraph(0));
+ if (aTest.isEmpty())
+ {
+ bDisable = true;
+ }
+ }
+ if (bDisable)
+ rSet.DisableItem(SID_SELECTALL);
+ }
+
+ // set status of Ruler
+ rSet.Put( SfxBoolItem( SID_RULER, HasRuler() ) );
+
+ // Enable formatting?
+ rSet.Put( SfxBoolItem( SID_OUTLINE_FORMAT, !rOutl.IsFlatMode() ) );
+
+ if( rOutl.IsFlatMode() )
+ rSet.DisableItem( SID_COLORVIEW );
+ else
+ {
+ // Enable color view?
+ EEControlBits nCntrl = rOutl.GetControlWord();
+ bool bNoColor = false;
+ if (nCntrl & EEControlBits::NOCOLORS)
+ bNoColor = true;
+
+ rSet.Put( SfxBoolItem( SID_COLORVIEW, bNoColor ) );
+ }
+
+ // Buttons of toolbar
+ // first the selection dependent ones: COLLAPSE, EXPAND
+ bool bDisableCollapse = true;
+ bool bDisableExpand = true;
+ bool bUnique = true;
+ OutlinerView* pOutlinerView = pOlView->GetViewByWindow(GetActiveWindow());
+
+ std::vector<Paragraph*> aSelList;
+ pOutlinerView->CreateSelectionList(aSelList);
+
+ if (!aSelList.empty())
+ {
+ sal_Int16 nTmpDepth = rOutl.GetDepth( rOutl.GetAbsPos( aSelList.front() ) );
+ bool bPage = ::Outliner::HasParaFlag( aSelList.front(), ParaFlag::ISPAGE );
+
+ for (const Paragraph* pPara : aSelList)
+ {
+ sal_Int16 nDepth = rOutl.GetDepth( rOutl.GetAbsPos( pPara ) );
+
+ if( nDepth != nTmpDepth || bPage != ::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ))
+ bUnique = false;
+
+ if (rOutl.HasChildren(pPara))
+ {
+ if (!rOutl.IsExpanded(pPara))
+ bDisableExpand = false;
+ else
+ bDisableCollapse = false;
+ }
+ }
+ }
+
+ if (bDisableExpand)
+ rSet.DisableItem(SID_OUTLINE_EXPAND);
+ if (bDisableCollapse)
+ rSet.DisableItem(SID_OUTLINE_COLLAPSE);
+
+ // does the selection provide a unique presentation layout?
+ // if not, the templates must not be edited
+ SfxItemSetFixed<SID_STATUS_LAYOUT, SID_STATUS_LAYOUT> aSet(*rSet.GetPool());
+ GetStatusBarState(aSet);
+ OUString aTest = static_cast<const SfxStringItem&>(aSet.Get(SID_STATUS_LAYOUT)).GetValue();
+ if (aTest.isEmpty())
+ {
+ bUnique = false;
+ }
+
+ if (!bUnique)
+ rSet.DisableItem( SID_PRESENTATIONOBJECT );
+
+ // now the selection independent ones: COLLAPSE_ALL, EXPAND_ALL
+ bool bDisableCollapseAll = true;
+ bool bDisableExpandAll = true;
+
+ // does the selection contain something collapsible/expandable?
+ if (!bDisableCollapse)
+ bDisableCollapseAll = false;
+ if (!bDisableExpand)
+ bDisableExpandAll = false;
+
+ // otherwise look through all paragraphs
+ if (bDisableCollapseAll || bDisableExpandAll)
+ {
+ sal_Int32 nParaPos = 0;
+ Paragraph* pPara = rOutl.GetParagraph( nParaPos );
+ while (pPara && (bDisableCollapseAll || bDisableExpandAll))
+ {
+ if (!rOutl.IsExpanded(pPara) && rOutl.HasChildren(pPara))
+ bDisableExpandAll = false;
+
+ if (rOutl.IsExpanded(pPara) && rOutl.HasChildren(pPara))
+ bDisableCollapseAll = false;
+
+ pPara = rOutl.GetParagraph( ++nParaPos );
+ }
+ }
+
+ if (bDisableExpandAll)
+ rSet.DisableItem(SID_OUTLINE_EXPAND_ALL);
+ if (bDisableCollapseAll)
+ rSet.DisableItem(SID_OUTLINE_COLLAPSE_ALL);
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_PASTE ) )
+ {
+ if ( !mxClipEvtLstnr.is() )
+ {
+ // create listener
+ mxClipEvtLstnr = new TransferableClipboardListener( LINK( this, OutlineViewShell, ClipboardChanged ) );
+ mxClipEvtLstnr->AddListener( GetActiveWindow() );
+
+ // get initial state
+ TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) );
+ bPastePossible = ( aDataHelper.GetFormatCount() != 0 &&
+ ( aDataHelper.HasFormat( SotClipboardFormatId::STRING ) ||
+ aDataHelper.HasFormat( SotClipboardFormatId::RTF ) ||
+ aDataHelper.HasFormat( SotClipboardFormatId::RICHTEXT ) ||
+ aDataHelper.HasFormat( SotClipboardFormatId::HTML ) ) );
+ }
+
+ if( !bPastePossible )
+ {
+ rSet.DisableItem( SID_PASTE );
+ }
+ }
+
+ if (!pOlView->GetViewByWindow(GetActiveWindow())->HasSelection()
+ || GetObjectShell()->isContentExtractionLocked())
+ {
+ rSet.DisableItem(SID_CUT);
+ rSet.DisableItem(SID_COPY);
+ }
+
+ if (pOlView->GetOutliner().IsModified())
+ {
+ GetDoc()->SetChanged();
+ }
+
+ // the status has to be set here because of overriding
+ if( !GetDocSh()->IsModified() )
+ {
+ rSet.DisableItem( SID_SAVEDOC );
+ }
+
+ if ( GetDocSh()->IsReadOnly() )
+ {
+ rSet.DisableItem( SID_AUTOSPELL_CHECK );
+ }
+ else
+ {
+ if (GetDoc()->GetOnlineSpell())
+ {
+ rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, true));
+ }
+ else
+ {
+ rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, false));
+ }
+ }
+
+ // field commands
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_MODIFY_FIELD ) )
+ {
+ const SvxFieldItem* pFldItem = pOutlinerView->GetFieldAtSelection();
+
+ if( !( pFldItem && (nullptr != dynamic_cast< const SvxDateField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxAuthorField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtFileField *>( pFldItem->GetField() ) ||
+ nullptr != dynamic_cast< const SvxExtTimeField *>( pFldItem->GetField() ) ) ) )
+ {
+ rSet.DisableItem( SID_MODIFY_FIELD );
+ }
+ }
+
+ if (SfxItemState::DEFAULT == rSet.GetItemState(SID_EXPAND_PAGE))
+ {
+ bool bDisable = true;
+ sal_uInt16 i = 0;
+ sal_uInt16 nCount = GetDoc()->GetSdPageCount(PageKind::Standard);
+ pOlView->SetSelectedPages();
+
+ while (i < nCount && bDisable)
+ {
+ SdPage* pPage = GetDoc()->GetSdPage(i, PageKind::Standard);
+
+ if (pPage->IsSelected())
+ {
+ SdrObject* pObj = pPage->GetPresObj(PresObjKind::Outline);
+
+ if (pObj!=nullptr )
+ {
+ if( !pObj->IsEmptyPresObj() )
+ {
+ bDisable = false;
+ }
+ else
+ {
+ // check if the object is in edit, then if it's temporarily not empty
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
+ if( pTextObj )
+ {
+ if( pTextObj->CanCreateEditOutlinerParaObject() )
+ {
+ bDisable = false;
+ }
+ }
+ }
+ }
+ }
+
+ i++;
+ }
+
+ if (bDisable)
+ {
+ rSet.DisableItem(SID_EXPAND_PAGE);
+ }
+ }
+
+ if (SfxItemState::DEFAULT == rSet.GetItemState(SID_SUMMARY_PAGE))
+ {
+ bool bDisable = true;
+ sal_uInt16 i = 0;
+ sal_uInt16 nCount = GetDoc()->GetSdPageCount(PageKind::Standard);
+ pOlView->SetSelectedPages();
+
+ while (i < nCount && bDisable)
+ {
+ SdPage* pPage = GetDoc()->GetSdPage(i, PageKind::Standard);
+
+ if (pPage->IsSelected())
+ {
+ SdrObject* pObj = pPage->GetPresObj(PresObjKind::Title);
+
+ if (pObj && !pObj->IsEmptyPresObj())
+ {
+ bDisable = false;
+ }
+ }
+
+ i++;
+ }
+
+ if (bDisable)
+ {
+ rSet.DisableItem(SID_SUMMARY_PAGE);
+ }
+ }
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_THESAURUS ) )
+ {
+ if ( !pOlView->IsTextEdit() )
+ {
+ rSet.DisableItem( SID_THESAURUS );
+ }
+ else
+ {
+ LanguageType eLang = GetDoc()->GetLanguage( EE_CHAR_LANGUAGE );
+ Reference< XThesaurus > xThesaurus( LinguMgr::GetThesaurus() );
+
+ if (!xThesaurus.is() || eLang == LANGUAGE_NONE || !xThesaurus->hasLocale( LanguageTag::convertToLocale( eLang)))
+ rSet.DisableItem( SID_THESAURUS );
+ }
+ }
+
+ // is starting the presentation possible?
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_PRESENTATION ) )
+ {
+ bool bDisable = true;
+ sal_uInt16 nCount = GetDoc()->GetSdPageCount( PageKind::Standard );
+
+ for( sal_uInt16 i = 0; i < nCount && bDisable; i++ )
+ {
+ SdPage* pPage = GetDoc()->GetSdPage(i, PageKind::Standard);
+
+ if( !pPage->IsExcluded() )
+ bDisable = false;
+ }
+ if( bDisable || GetDocSh()->IsPreview())
+ {
+ rSet.DisableItem( SID_PRESENTATION );
+ }
+ }
+
+ FuBullet::GetSlotState( rSet, this, GetViewFrame() );
+
+}
+
+/**
+ * gets invoked when ScrollBar is used
+ */
+void OutlineViewShell::VirtHScrollHdl(ScrollBar* pHScroll)
+{
+ ::tools::Long nThumb = pHScroll->GetThumbPos();
+ ::tools::Long nRange = pHScroll->GetRange().Len();
+ double fX = static_cast<double>(nThumb) / nRange;
+
+ Window* pWin = mpContentWindow.get();
+ OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWin);
+ ::tools::Long nViewWidth = pWin->PixelToLogic(
+ pWin->GetSizePixel()).Width();
+ ::tools::Long nTextWidth = pOlView->GetPaperWidth();
+ nViewWidth = std::max(nViewWidth, nTextWidth);
+ ::tools::Long nCurrentPos = pOutlinerView->GetVisArea().Left();
+ ::tools::Long nTargetPos = static_cast<::tools::Long>(fX * nViewWidth);
+ ::tools::Long nDelta = nTargetPos - nCurrentPos;
+
+ pOutlinerView->HideCursor();
+ pOutlinerView->Scroll(-nDelta, 0);
+ pOutlinerView->ShowCursor(false);
+}
+
+void OutlineViewShell::VirtVScrollHdl(ScrollBar* pVScroll)
+{
+ ::tools::Long nThumb = pVScroll->GetThumbPos();
+ ::tools::Long nRange = pVScroll->GetRange().Len();
+ double fY = static_cast<double>(nThumb) / nRange;
+
+ Window* pWin = mpContentWindow.get();
+ OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWin);
+ ::tools::Long nViewHeight = pWin->PixelToLogic(
+ pWin->GetSizePixel()).Height();
+ ::tools::Long nTextHeight = pOlView->GetOutliner().GetTextHeight();
+ nViewHeight += nTextHeight;
+ ::tools::Long nCurrentPos = pOutlinerView->GetVisArea().Top();
+ ::tools::Long nTargetPos = static_cast<::tools::Long>(fY * nViewHeight);
+ ::tools::Long nDelta = nTargetPos - nCurrentPos;
+
+ pOutlinerView->HideCursor();
+ pOutlinerView->Scroll(0, -nDelta);
+ pOutlinerView->ShowCursor(false);
+}
+
+/**
+ * PrepareClose, gets called when the Shell shall be destroyed.
+ * Forwards the invocation to the View
+ */
+bool OutlineViewShell::PrepareClose( bool bUI )
+{
+ if( !ViewShell::PrepareClose(bUI) )
+ return false;
+
+ if (pOlView)
+ pOlView->PrepareClose();
+ return true;
+}
+
+/**
+ * Zoom with zoom factor. Inform OutlinerView
+ */
+void OutlineViewShell::SetZoom(::tools::Long nZoom)
+{
+ ViewShell::SetZoom(nZoom);
+
+ ::sd::Window* pWindow = mpContentWindow.get();
+ if (pWindow)
+ {
+ // change OutputArea of OutlinerView
+ OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWindow);
+ ::tools::Rectangle aWin(Point(0,0), pWindow->GetOutputSizePixel());
+ aWin = pWindow->PixelToLogic(aWin);
+ pOutlinerView->SetOutputArea(aWin);
+ }
+
+ GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
+ GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
+}
+
+/**
+ * Zoom with zoom rectangle. Inform OutlinerView
+ */
+void OutlineViewShell::SetZoomRect(const ::tools::Rectangle& rZoomRect)
+{
+ ViewShell::SetZoomRect(rZoomRect);
+
+ ::sd::Window* pWindow = mpContentWindow.get();
+ if (pWindow)
+ {
+ // change OutputArea of OutlinerView
+ OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWindow);
+ ::tools::Rectangle aWin(Point(0,0), pWindow->GetOutputSizePixel());
+ aWin = pWindow->PixelToLogic(aWin);
+ pOutlinerView->SetOutputArea(aWin);
+ }
+
+ GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
+ GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
+}
+
+/**
+ * Before saving: Update Model of the Drawing Engine, then forward the
+ * invocation to the ObjectShell.
+ */
+void OutlineViewShell::Execute(SfxRequest& rReq)
+{
+ bool bForwardCall = true;
+
+ switch(rReq.GetSlot())
+ {
+ case SID_SAVEDOC:
+ case SID_SAVEASDOC:
+ PrepareClose();
+ break;
+
+ case SID_SEARCH_ITEM:
+ // Forward this request to the common (old) code of the
+ // document shell.
+ GetDocSh()->Execute (rReq);
+ bForwardCall = false;
+ break;
+
+ case SID_SPELL_DIALOG:
+ {
+ SfxViewFrame* pViewFrame = GetViewFrame();
+ if (rReq.GetArgs() != nullptr)
+ pViewFrame->SetChildWindow (SID_SPELL_DIALOG,
+ static_cast<const SfxBoolItem&>(rReq.GetArgs()->
+ Get(SID_SPELL_DIALOG)).GetValue());
+ else
+ pViewFrame->ToggleChildWindow(SID_SPELL_DIALOG);
+
+ pViewFrame->GetBindings().Invalidate(SID_SPELL_DIALOG);
+ rReq.Done ();
+
+ bForwardCall = false;
+ }
+ break;
+
+ default:
+ SAL_WARN("sd", "OutlineViewShell::Execute(): can not handle slot " << rReq.GetSlot());
+ break;
+
+ }
+
+ if (bForwardCall)
+ static_cast<DrawDocShell*>(GetViewFrame()->GetObjectShell())->ExecuteSlot( rReq );
+}
+
+/**
+ * Read FrameViews data and set actual views data
+ */
+void OutlineViewShell::ReadFrameViewData(FrameView* pView)
+{
+ ::Outliner& rOutl = pOlView->GetOutliner();
+
+ rOutl.SetFlatMode( pView->IsNoAttribs() );
+
+ EEControlBits nCntrl = rOutl.GetControlWord();
+
+ if ( pView->IsNoColors() )
+ rOutl.SetControlWord(nCntrl | EEControlBits::NOCOLORS);
+ else
+ rOutl.SetControlWord(nCntrl & ~EEControlBits::NOCOLORS);
+
+ sal_uInt16 nPage = mpFrameView->GetSelectedPage();
+ pLastPage = GetDoc()->GetSdPage( nPage, PageKind::Standard );
+ pOlView->SetActualPage(pLastPage);
+}
+
+/**
+ * Write actual views data to FrameView
+ */
+void OutlineViewShell::WriteFrameViewData()
+{
+ ::Outliner& rOutl = pOlView->GetOutliner();
+
+ EEControlBits nCntrl = rOutl.GetControlWord();
+ bool bNoColor = false;
+ if (nCntrl & EEControlBits::NOCOLORS)
+ bNoColor = true;
+ mpFrameView->SetNoColors(bNoColor);
+ mpFrameView->SetNoAttribs( rOutl.IsFlatMode() );
+ SdPage* pActualPage = pOlView->GetActualPage();
+ DBG_ASSERT(pActualPage, "No current page");
+ if( pActualPage )
+ mpFrameView->SetSelectedPage((pActualPage->GetPageNum() - 1) / 2);
+}
+
+/**
+ * Handle SfxRequests for the StatusBar
+ */
+void OutlineViewShell::ExecStatusBar(SfxRequest&)
+{
+}
+
+void OutlineViewShell::GetStatusBarState(SfxItemSet& rSet)
+{
+ // Zoom-Item
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_ZOOM ) )
+ {
+ sal_uInt16 nZoom = static_cast<sal_uInt16>(GetActiveWindow()->GetZoom());
+
+ std::unique_ptr<SvxZoomItem> pZoomItem(new SvxZoomItem( SvxZoomType::PERCENT, nZoom ));
+
+ // limit area
+ SvxZoomEnableFlags nZoomValues = SvxZoomEnableFlags::ALL;
+ nZoomValues &= ~SvxZoomEnableFlags::OPTIMAL;
+ nZoomValues &= ~SvxZoomEnableFlags::WHOLEPAGE;
+ nZoomValues &= ~SvxZoomEnableFlags::PAGEWIDTH;
+
+ pZoomItem->SetValueSet( nZoomValues );
+ rSet.Put( std::move(pZoomItem) );
+ }
+
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ATTR_ZOOMSLIDER ) )
+ {
+ if (GetDocSh()->IsUIActive() || !GetActiveWindow() )
+ {
+ rSet.DisableItem( SID_ATTR_ZOOMSLIDER );
+ }
+ else
+ {
+ sd::Window * pActiveWindow = GetActiveWindow();
+ SvxZoomSliderItem aZoomItem( static_cast<sal_uInt16>(pActiveWindow->GetZoom()), static_cast<sal_uInt16>(pActiveWindow->GetMinZoom()), static_cast<sal_uInt16>(pActiveWindow->GetMaxZoom()) ) ;
+ aZoomItem.AddSnappingPoint(100);
+ rSet.Put( aZoomItem );
+ }
+ }
+
+ // page view and layout
+
+ sal_uInt16 nPageCount = GetDoc()->GetSdPageCount( PageKind::Standard );
+ OUString aPageStr, aLayoutStr;
+
+ ::sd::Window* pWin = GetActiveWindow();
+ OutlinerView* pActiveView = pOlView->GetViewByWindow( pWin );
+
+ std::vector<Paragraph*> aSelList;
+ pActiveView->CreateSelectionList(aSelList);
+
+ Paragraph *pFirstPara = nullptr;
+ Paragraph *pLastPara = nullptr;
+
+ if (!aSelList.empty())
+ {
+ pFirstPara = *(aSelList.begin());
+ pLastPara = *(aSelList.rbegin());
+ }
+
+ if( !::Outliner::HasParaFlag(pFirstPara,ParaFlag::ISPAGE) )
+ pFirstPara = pOlView->GetPrevTitle( pFirstPara );
+
+ if( !::Outliner::HasParaFlag(pLastPara, ParaFlag::ISPAGE) )
+ pLastPara = pOlView->GetPrevTitle( pLastPara );
+
+ // only one page selected?
+ if( pFirstPara == pLastPara )
+ {
+ // how many pages are we before the selected page?
+ sal_uLong nPos = 0;
+ while( pFirstPara )
+ {
+ pFirstPara = pOlView->GetPrevTitle( pFirstPara );
+ if( pFirstPara )
+ nPos++;
+ }
+
+ if( nPos >= GetDoc()->GetSdPageCount( PageKind::Standard ) )
+ nPos = 0;
+
+ SdrPage* pPage = GetDoc()->GetSdPage( static_cast<sal_uInt16>(nPos), PageKind::Standard );
+
+ aPageStr = SdResId(STR_SD_PAGE_COUNT);
+
+ aPageStr = aPageStr.replaceFirst("%1", OUString::number(static_cast<sal_Int32>(nPos + 1)));
+ aPageStr = aPageStr.replaceFirst("%2", OUString::number(nPageCount));
+
+ aLayoutStr = pPage->GetLayoutName();
+ sal_Int32 nIndex = aLayoutStr.indexOf(SD_LT_SEPARATOR);
+ if (nIndex != -1)
+ aLayoutStr = aLayoutStr.copy(0, nIndex);
+ //Now, CurrentPage property change is already sent for DrawView and OutlineView, so it is not necessary to send again here
+ if(m_StrOldPageName!=aPageStr)
+ {
+ GetViewShellBase().GetDrawController().fireSwitchCurrentPage(nPos);
+ m_StrOldPageName = aPageStr;
+ }
+ }
+ rSet.Put( SfxStringItem( SID_STATUS_PAGE, aPageStr ) );
+ rSet.Put( SfxStringItem( SID_STATUS_LAYOUT, aLayoutStr ) );
+}
+
+void OutlineViewShell::Command( const CommandEvent& rCEvt, ::sd::Window* pWin )
+{
+ if ( rCEvt.GetCommand() == CommandEventId::ContextMenu )
+ {
+ GetActiveWindow()->ReleaseMouse();
+
+ OutlinerView* pOLV = pOlView->GetViewByWindow(GetActiveWindow());
+ Point aPos(rCEvt.GetMousePosPixel());
+
+ if (pOLV && pOLV->IsWrongSpelledWordAtPos(aPos))
+ {
+ // Popup for Online-Spelling now handled by DrawDocShell
+ Link<SpellCallbackInfo&,void> aLink = LINK(GetDocSh(), DrawDocShell, OnlineSpellCallback);
+
+ pOLV->ExecuteSpellPopup(aPos, aLink);
+ pOLV->GetEditView().Invalidate();
+ }
+ else
+ {
+ GetViewFrame()->GetDispatcher()->ExecutePopup("outline");
+ }
+ }
+ else
+ {
+ ViewShell::Command( rCEvt, pWin );
+
+ // if necessary communicate the new context to the Preview
+ Invalidate( SID_PREVIEW_STATE );
+
+ }
+}
+
+bool OutlineViewShell::KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin)
+{
+ bool bReturn = false;
+ OutlineViewPageChangesGuard aGuard(pOlView.get());
+
+ if (pWin == nullptr && HasCurrentFunction())
+ {
+ bReturn = GetCurrentFunction()->KeyInput(rKEvt);
+ }
+
+ // no, forward to base class
+ else
+ {
+ bReturn = ViewShell::KeyInput(rKEvt, pWin);
+ }
+
+ Invalidate(SID_STYLE_EDIT);
+ Invalidate(SID_STYLE_NEW);
+ Invalidate(SID_STYLE_DELETE);
+ Invalidate(SID_STYLE_HIDE);
+ Invalidate(SID_STYLE_SHOW);
+ Invalidate(SID_STYLE_UPDATE_BY_EXAMPLE);
+ Invalidate(SID_STYLE_NEW_BY_EXAMPLE);
+ Invalidate(SID_STYLE_WATERCAN);
+ Invalidate(SID_STYLE_FAMILY5);
+
+ // check and distinguish cursor movements- or input-keys
+ vcl::KeyCode aKeyGroup( rKEvt.GetKeyCode().GetGroup() );
+ if( (aKeyGroup != KEYGROUP_CURSOR && aKeyGroup != KEYGROUP_FKEYS) ||
+ (GetActualPage() != pLastPage) )
+ {
+ Invalidate( SID_PREVIEW_STATE );
+ }
+
+ return bReturn;
+}
+
+/**
+ * Status of Attribute-Items
+ */
+void OutlineViewShell::GetAttrState( SfxItemSet& rSet )
+{
+ SfxWhichIter aIter( rSet );
+ sal_uInt16 nWhich = aIter.FirstWhich();
+ SfxAllItemSet aAllSet( *rSet.GetPool() );
+
+ while ( nWhich )
+ {
+ sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich)
+ ? GetPool().GetSlotId(nWhich)
+ : nWhich;
+
+ switch ( nSlotId )
+ {
+ case SID_STYLE_FAMILY2:
+ case SID_STYLE_FAMILY3:
+ {
+ rSet.DisableItem( nWhich );
+ }
+ break;
+
+ case SID_STYLE_FAMILY5:
+ {
+ SfxStyleSheet* pStyleSheet = pOlView->GetViewByWindow(GetActiveWindow())->GetStyleSheet();
+
+ if( pStyleSheet )
+ {
+ pStyleSheet = static_cast<SdStyleSheet*>(pStyleSheet)->GetPseudoStyleSheet();
+
+ if (pStyleSheet)
+ {
+ SfxTemplateItem aItem( nWhich, pStyleSheet->GetName() );
+ aAllSet.Put( aItem, aItem.Which() );
+ }
+ }
+
+ if( !pStyleSheet )
+ {
+ SfxTemplateItem aItem( nWhich, OUString() );
+ aAllSet.Put( aItem, aItem.Which() );
+ // rSet.DisableItem( nWhich );
+ }
+ }
+ break;
+
+ case SID_STYLE_EDIT:
+ {
+ std::unique_ptr<SfxUInt16Item> pFamilyItem;
+ GetViewFrame()->GetBindings().QueryState(SID_STYLE_FAMILY, pFamilyItem);
+ if (pFamilyItem && static_cast<SfxStyleFamily>(pFamilyItem->GetValue()) == SfxStyleFamily::Pseudo)
+ {
+ SfxItemSetFixed<SID_STATUS_LAYOUT, SID_STATUS_LAYOUT> aSet(*rSet.GetPool());
+ GetStatusBarState(aSet);
+ OUString aRealStyle = static_cast<const SfxStringItem&>(aSet.Get(SID_STATUS_LAYOUT)).GetValue();
+ if (aRealStyle.isEmpty())
+ {
+ // no unique layout name found
+ rSet.DisableItem(nWhich);
+ }
+ }
+ }
+ break;
+
+ case SID_STYLE_UPDATE_BY_EXAMPLE:
+ {
+ ::sd::Window* pActWin = GetActiveWindow();
+ OutlinerView* pOV = pOlView->GetViewByWindow(pActWin);
+ ESelection aESel(pOV->GetSelection());
+
+ if (aESel.nStartPara != aESel.nEndPara ||
+ aESel.nStartPos != aESel.nEndPos)
+ // spanned selection, i.e. StyleSheet and/or
+ // attribution not necessarily unique
+ rSet.DisableItem(nWhich);
+ }
+ break;
+
+ case SID_STYLE_NEW:
+ case SID_STYLE_DELETE:
+ case SID_STYLE_HIDE:
+ case SID_STYLE_SHOW:
+ case SID_STYLE_NEW_BY_EXAMPLE:
+ case SID_STYLE_WATERCAN:
+ {
+ rSet.DisableItem(nWhich);
+ }
+ break;
+ }
+
+ nWhich = aIter.NextWhich();
+ }
+
+ rSet.Put( aAllSet, false );
+}
+
+void OutlineViewShell::MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin)
+{
+ // first the base classes
+ ViewShell::MouseButtonUp(rMEvt, pWin);
+
+ Invalidate(SID_STYLE_EDIT);
+ Invalidate(SID_STYLE_NEW);
+ Invalidate(SID_STYLE_DELETE);
+ Invalidate(SID_STYLE_HIDE);
+ Invalidate(SID_STYLE_SHOW);
+ Invalidate(SID_STYLE_UPDATE_BY_EXAMPLE);
+ Invalidate(SID_STYLE_NEW_BY_EXAMPLE);
+ Invalidate(SID_STYLE_WATERCAN);
+ Invalidate(SID_STYLE_FAMILY5);
+
+ // if necessary communicate the new context to the Preview
+ if( GetActualPage() != pLastPage )
+ Invalidate( SID_PREVIEW_STATE );
+}
+
+SdPage* OutlineViewShell::getCurrentPage() const
+{
+ // since there are no master pages in outline view, we can
+ // for now use the GetActualPage method
+ return const_cast<OutlineViewShell*>(this)->GetActualPage();
+}
+
+/**
+ * Returns the first selected page.
+ * If nothing is selected, the first page is returned.
+ */
+SdPage* OutlineViewShell::GetActualPage()
+{
+ return pOlView->GetActualPage();
+}
+
+void OutlineViewShell::UpdatePreview( SdPage* pPage )
+{
+ const bool bNewPage = pPage != pLastPage;
+ pLastPage = pPage;
+ if (bNewPage)
+ {
+ OutlineViewPageChangesGuard aGuard(pOlView.get());
+ SetCurrentPage(pPage);
+ }
+}
+
+void OutlineViewShell::UpdateTitleObject( SdPage* pPage, Paragraph const * pPara )
+{
+ DBG_ASSERT( pPage, "sd::OutlineViewShell::UpdateTitleObject(), pPage == 0?" );
+ DBG_ASSERT( pPara, "sd::OutlineViewShell::UpdateTitleObject(), pPara == 0?" );
+
+ if( !pPage || !pPara )
+ return;
+
+ ::Outliner& rOutliner = pOlView->GetOutliner();
+ SdrTextObj* pTO = OutlineView::GetTitleTextObject( pPage );
+
+ OUString aTest = rOutliner.GetText(pPara);
+ bool bText = !aTest.isEmpty();
+
+ if( bText )
+ {
+ bool bNewObject = false;
+ // create a title object if we don't have one but have text
+ if( !pTO )
+ {
+ DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" );
+ pTO = OutlineView::CreateTitleTextObject(pPage);
+ bNewObject = true;
+ }
+
+ // if we have a title object and a text, set the text
+ std::optional<OutlinerParaObject> pOPO;
+ if (pTO)
+ pOPO = rOutliner.CreateParaObject(rOutliner.GetAbsPos(pPara), 1);
+ if (pOPO)
+ {
+ pOPO->SetOutlinerMode( OutlinerMode::TitleObject );
+ assert(pTO);
+ pOPO->SetVertical( pTO->IsVerticalWriting() );
+ if( pTO->GetOutlinerParaObject() && (pOPO->GetTextObject() == pTO->GetOutlinerParaObject()->GetTextObject()) )
+ {
+ // do nothing, same text already set
+ }
+ else
+ {
+ DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" );
+ if( !bNewObject && pOlView->isRecordingUndo() )
+ pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0));
+
+ pTO->SetOutlinerParaObject( std::move(pOPO) );
+ pTO->SetEmptyPresObj( false );
+ pTO->ActionChanged();
+ }
+ }
+ }
+ else if( pTO )
+ {
+ // no text but object available?
+ // outline object available, but we have no text
+ if(pPage->IsPresObj(pTO))
+ {
+ // if it is not already empty
+ if( !pTO->IsEmptyPresObj() )
+ {
+ DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" );
+
+ // make it empty
+ if( pOlView->isRecordingUndo() )
+ pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0));
+ pPage->RestoreDefaultText( pTO );
+ pTO->SetEmptyPresObj(true);
+ pTO->ActionChanged();
+ }
+ }
+ else
+ {
+ DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" );
+ // outline object is not part of the layout, delete it
+ if( pOlView->isRecordingUndo() )
+ pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoRemoveObject(*pTO));
+ pPage->RemoveObject(pTO->GetOrdNum());
+ }
+ }
+}
+
+void OutlineViewShell::UpdateOutlineObject( SdPage* pPage, Paragraph* pPara )
+{
+ DBG_ASSERT( pPage, "sd::OutlineViewShell::UpdateOutlineObject(), pPage == 0?" );
+ DBG_ASSERT( pPara, "sd::OutlineViewShell::UpdateOutlineObject(), pPara == 0?" );
+
+ if( !pPage || !pPara )
+ return;
+
+ ::Outliner& rOutliner = pOlView->GetOutliner();
+ std::optional<OutlinerParaObject> pOPO;
+ SdrTextObj* pTO = nullptr;
+
+ OutlinerMode eOutlinerMode = OutlinerMode::TitleObject;
+ pTO = static_cast<SdrTextObj*>(pPage->GetPresObj( PresObjKind::Text ));
+ if( !pTO )
+ {
+ eOutlinerMode = OutlinerMode::OutlineObject;
+ pTO = OutlineView::GetOutlineTextObject( pPage );
+ }
+
+ // how many paragraphs in the outline?
+ sal_Int32 nTitlePara = rOutliner.GetAbsPos( pPara );
+ sal_Int32 nPara = nTitlePara + 1;
+ sal_Int32 nParasInLayout = 0;
+ pPara = rOutliner.GetParagraph( nPara );
+ while( pPara && !::Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE) )
+ {
+ nParasInLayout++;
+ pPara = rOutliner.GetParagraph( ++nPara );
+ }
+ if( nParasInLayout )
+ {
+ // create an OutlinerParaObject
+ pOPO = rOutliner.CreateParaObject( nTitlePara + 1, nParasInLayout );
+ }
+
+ if( pOPO )
+ {
+ DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateOutlineObject(), no undo for model change!?" );
+ bool bNewObject = false;
+
+ // do we need an outline text object?
+ if( !pTO )
+ {
+ pTO = OutlineView::CreateOutlineTextObject( pPage );
+ bNewObject = true;
+ }
+
+ // page object, outline text in Outliner:
+ // apply text
+ if( pTO )
+ {
+ pOPO->SetVertical( pTO->IsVerticalWriting() );
+ pOPO->SetOutlinerMode( eOutlinerMode );
+ if( pTO->GetOutlinerParaObject() && (pOPO->GetTextObject() == pTO->GetOutlinerParaObject()->GetTextObject()) )
+ {
+ // do nothing, same text already set
+ }
+ else
+ {
+ if( !bNewObject && pOlView->isRecordingUndo() )
+ pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0));
+
+ pTO->SetOutlinerParaObject( std::move(pOPO) );
+ pTO->SetEmptyPresObj( false );
+ pTO->ActionChanged();
+ }
+ }
+ }
+ else if( pTO )
+ {
+ // page object but no outline text:
+ // if the object is in the outline of the page -> default text
+
+ // otherwise delete object
+ if( pPage->IsPresObj(pTO) )
+ {
+ if( !pTO->IsEmptyPresObj() )
+ {
+ DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateOutlineObject(), no undo for model change!?" );
+
+ // delete old OutlinerParaObject, too
+ if( pOlView->isRecordingUndo() )
+ pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0));
+ pPage->RestoreDefaultText( pTO );
+ pTO->SetEmptyPresObj(true);
+ pTO->ActionChanged();
+ }
+ }
+ else
+ {
+ DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateOutlineObject(), no undo for model change!?" );
+ if( pOlView->isRecordingUndo() )
+ pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoRemoveObject(*pTO));
+ pPage->RemoveObject(pTO->GetOrdNum());
+ }
+ }
+}
+
+/**
+ * Fill Outliner from Stream
+ */
+ErrCode OutlineViewShell::ReadRtf(SvStream& rInput)
+{
+ ErrCode bRet = ERRCODE_NONE;
+
+ ::Outliner& rOutl = pOlView->GetOutliner();
+
+ OutlineViewPageChangesGuard aGuard( pOlView.get() );
+ OutlineViewModelChangeGuard aGuard2( *pOlView );
+
+ bRet = rOutl.Read( rInput, OUString(), EETextFormat::Rtf, GetDocSh()->GetHeaderAttributes() );
+
+ SdPage* pPage = GetDoc()->GetSdPage( GetDoc()->GetSdPageCount(PageKind::Standard) - 1, PageKind::Standard );
+ SfxStyleSheet* pTitleSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Title );
+ SfxStyleSheet* pOutlSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Outline );
+
+ sal_Int32 nParaCount = rOutl.GetParagraphCount();
+ if ( nParaCount > 0 )
+ {
+ for ( sal_Int32 nPara = 0; nPara < nParaCount; nPara++ )
+ {
+ pOlView->UpdateParagraph( nPara );
+
+ sal_Int16 nDepth = rOutl.GetDepth( nPara );
+
+ if( (nDepth == 0) || !nPara )
+ {
+ Paragraph* pPara = rOutl.GetParagraph( nPara );
+ rOutl.SetDepth(pPara, -1);
+ rOutl.SetParaFlag(pPara, ParaFlag::ISPAGE);
+
+ rOutl.SetStyleSheet( nPara, pTitleSheet );
+
+ if( nPara ) // first slide already exists
+ pOlView->InsertSlideForParagraph( pPara );
+ }
+ else
+ {
+ rOutl.SetDepth( rOutl.GetParagraph( nPara ), nDepth - 1 );
+ OUString aStyleSheetName = pOutlSheet->GetName();
+ if (!aStyleSheetName.isEmpty())
+ aStyleSheetName = aStyleSheetName.copy(0, aStyleSheetName.getLength() - 1);
+ aStyleSheetName += OUString::number( nDepth );
+ SfxStyleSheetBasePool* pStylePool = GetDoc()->GetStyleSheetPool();
+ SfxStyleSheet* pStyle = static_cast<SfxStyleSheet*>( pStylePool->Find( aStyleSheetName, pOutlSheet->GetFamily() ) );
+ DBG_ASSERT( pStyle, "AutoStyleSheetName - Style not found!" );
+ if ( pStyle )
+ rOutl.SetStyleSheet( nPara, pStyle );
+ }
+ }
+ }
+
+ rOutl.GetUndoManager().Clear();
+
+ return bRet;
+}
+
+void OutlineViewShell::WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& rSequence )
+{
+ WriteFrameViewData();
+
+ ViewShell::WriteUserDataSequence( rSequence );
+}
+
+void OutlineViewShell::ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& rSequence )
+{
+ WriteFrameViewData();
+
+ ViewShell::ReadUserDataSequence( rSequence );
+
+ ReadFrameViewData( mpFrameView );
+}
+
+void OutlineViewShell::VisAreaChanged(const ::tools::Rectangle& rRect)
+{
+ ViewShell::VisAreaChanged( rRect );
+
+ GetViewShellBase().GetDrawController().FireVisAreaChanged(rRect);
+}
+
+/** If there is a valid controller then create a new instance of
+ <type>AccessibleDrawDocumentView</type>. Otherwise return an empty
+ reference.
+*/
+css::uno::Reference<css::accessibility::XAccessible>
+ OutlineViewShell::CreateAccessibleDocumentView (::sd::Window* pWindow)
+{
+ OSL_ASSERT (GetViewShell()!=nullptr);
+ if (GetViewShell()->GetController() != nullptr)
+ {
+ rtl::Reference<::accessibility::AccessibleOutlineView> pDocumentView =
+ new ::accessibility::AccessibleOutlineView (
+ pWindow,
+ this,
+ GetViewShell()->GetController(),
+ pWindow->GetAccessibleParentWindow()->GetAccessible());
+ pDocumentView->Init();
+ return pDocumentView;
+ }
+
+ SAL_WARN("sd", "OutlineViewShell::CreateAccessibleDocumentView: no controller");
+ return css::uno::Reference< css::accessibility::XAccessible >();
+}
+
+void OutlineViewShell::GetState (SfxItemSet& rSet)
+{
+ // Iterate over all requested items in the set.
+ SfxWhichIter aIter( rSet );
+ sal_uInt16 nWhich = aIter.FirstWhich();
+ while (nWhich)
+ {
+ switch (nWhich)
+ {
+ case SID_SEARCH_ITEM:
+ case SID_SEARCH_OPTIONS:
+ // Call common (old) implementation in the document shell.
+ GetDocSh()->GetState (rSet);
+ break;
+ default:
+ SAL_WARN("sd", "OutlineViewShell::GetState(): can not handle which id " << nWhich);
+ break;
+ }
+ nWhich = aIter.NextWhich();
+ }
+}
+
+void OutlineViewShell::SetCurrentPage (SdPage* pPage)
+{
+ // Adapt the selection of the model.
+ for (sal_uInt16 i=0; i<GetDoc()->GetSdPageCount(PageKind::Standard); i++)
+ GetDoc()->SetSelected(
+ GetDoc()->GetSdPage(i, PageKind::Standard),
+ false);
+ GetDoc()->SetSelected (pPage, true);
+
+ DrawController& rController(GetViewShellBase().GetDrawController());
+ rController.FireSelectionChangeListener();
+ rController.FireSwitchCurrentPage (pPage);
+
+ pOlView->SetActualPage(pPage);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/outlview.cxx b/sd/source/ui/view/outlview.cxx
new file mode 100644
index 000000000..c3b7a57ca
--- /dev/null
+++ b/sd/source/ui/view/outlview.cxx
@@ -0,0 +1,1720 @@
+/* -*- 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 <OutlineView.hxx>
+#include <sfx2/progress.hxx>
+#include <vcl/commandinfoprovider.hxx>
+#include <vcl/svapp.hxx>
+#include <svx/svxids.hrc>
+#include <editeng/outliner.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/editstat.hxx>
+#include <editeng/lrspitem.hxx>
+#include <svx/svdotext.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svl/style.hxx>
+#include <svx/svdundo.hxx>
+#include <editeng/numitem.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/editeng.hxx>
+#include <xmloff/autolayout.hxx>
+#include <tools/debug.hxx>
+
+#include <editeng/editobj.hxx>
+#include <editeng/editund2.hxx>
+
+#include <editeng/editview.hxx>
+
+#include <com/sun/star/frame/XFrame.hpp>
+
+#include <DrawDocShell.hxx>
+#include <drawdoc.hxx>
+#include <Window.hxx>
+#include <sdpage.hxx>
+#include <pres.hxx>
+#include <OutlineViewShell.hxx>
+#include <app.hrc>
+#include <strings.hrc>
+#include <sdmod.hxx>
+#include <sdresid.hxx>
+#include <Outliner.hxx>
+#include <EventMultiplexer.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShellManager.hxx>
+#include <undo/undomanager.hxx>
+#include <stlsheet.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::frame;
+
+namespace sd {
+
+// a progress bar gets displayed when more than
+// PROCESS_WITH_PROGRESS_THRESHOLD pages are concerned
+#define PROCESS_WITH_PROGRESS_THRESHOLD 5
+
+OutlineView::OutlineView( DrawDocShell& rDocSh, vcl::Window* pWindow, OutlineViewShell& rOutlineViewShell)
+: ::sd::View(*rDocSh.GetDoc(), pWindow->GetOutDev(), &rOutlineViewShell)
+, mrOutlineViewShell(rOutlineViewShell)
+, mrOutliner(*mrDoc.GetOutliner())
+, mnPagesToProcess(0)
+, mnPagesProcessed(0)
+, mbFirstPaint(true)
+, maDocColor( COL_WHITE )
+, maLRSpaceItem( 0, 0, 2000, 0, EE_PARA_OUTLLRSPACE )
+{
+ bool bInitOutliner = false;
+
+ if (mrOutliner.GetViewCount() == 0)
+ {
+ // initialize Outliner: set Reference Device
+ bInitOutliner = true;
+ mrOutliner.Init( OutlinerMode::OutlineView );
+ mrOutliner.SetRefDevice( SD_MOD()->GetVirtualRefDevice() );
+ //viewsize without the width of the image and number in front
+ mnPaperWidth = (mrOutlineViewShell.GetActiveWindow()->GetViewSize().Width() - 4000);
+ mrOutliner.SetPaperSize(Size(mnPaperWidth, 400000000));
+ }
+ else
+ {
+ // width: DIN A4, two margins at 1 cm each
+ mnPaperWidth = 19000;
+ }
+
+ mpOutlinerViews[0].reset( new OutlinerView(&mrOutliner, pWindow) );
+ mpOutlinerViews[0]->SetOutputArea(::tools::Rectangle());
+ mrOutliner.SetUpdateLayout(false);
+ mrOutliner.InsertView(mpOutlinerViews[0].get(), EE_APPEND);
+
+ onUpdateStyleSettings( true );
+
+ if (bInitOutliner)
+ {
+ // fill Outliner with contents
+ FillOutliner();
+ }
+
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,OutlineView,EventMultiplexerListener) );
+ mrOutlineViewShell.GetViewShellBase().GetEventMultiplexer()->AddEventListener(aLink);
+
+ Reference<XFrame> xFrame = mrOutlineViewShell.GetViewShellBase().GetFrame()->GetFrame().GetFrameInterface();
+ maSlideImage = vcl::CommandInfoProvider::GetImageForCommand(".uno:ShowSlide", xFrame, vcl::ImageType::Size26);
+
+ // Tell undo manager of the document about the undo manager of the
+ // outliner, so that the former can synchronize with the later.
+ sd::UndoManager* pDocUndoMgr = dynamic_cast<sd::UndoManager*>(mpDocSh->GetUndoManager());
+ if (pDocUndoMgr != nullptr)
+ pDocUndoMgr->SetLinkedUndoManager(&mrOutliner.GetUndoManager());
+}
+
+/**
+ * Destructor, restore Links, clear Outliner
+ */
+OutlineView::~OutlineView()
+{
+ DBG_ASSERT(maDragAndDropModelGuard == nullptr,
+ "sd::OutlineView::~OutlineView(), prior drag operation not finished correctly!");
+
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,OutlineView,EventMultiplexerListener) );
+ mrOutlineViewShell.GetViewShellBase().GetEventMultiplexer()->RemoveEventListener( aLink );
+ DisconnectFromApplication();
+
+ mpProgress.reset();
+
+ // unregister OutlinerViews and destroy them
+ for (auto & rpView : mpOutlinerViews)
+ {
+ if (rpView)
+ {
+ mrOutliner.RemoveView( rpView.get() );
+ rpView.reset();
+ }
+ }
+
+ if (mrOutliner.GetViewCount() == 0)
+ {
+ // uninitialize Outliner: enable color display
+ ResetLinks();
+ EEControlBits nCntrl = mrOutliner.GetControlWord();
+ mrOutliner.SetUpdateLayout(false); // otherwise there will be drawn on SetControlWord
+ mrOutliner.SetControlWord(nCntrl & ~EEControlBits::NOCOLORS);
+ SvtAccessibilityOptions aOptions;
+ mrOutliner.ForceAutoColor( aOptions.GetIsAutomaticFontColor() );
+ mrOutliner.Clear();
+ }
+}
+
+void OutlineView::ConnectToApplication()
+{
+ // When the mode is switched to outline the main view shell grabs focus.
+ // This is done for getting cut/copy/paste commands on slides in the left
+ // pane (slide sorter view shell) to work properly.
+ SfxShell* pTopViewShell = mrOutlineViewShell.GetViewShellBase().GetViewShellManager()->GetTopViewShell();
+ if (pTopViewShell && pTopViewShell == &mrOutlineViewShell)
+ {
+ mrOutlineViewShell.GetActiveWindow()->GrabFocus();
+ }
+
+ Application::AddEventListener(LINK(this, OutlineView, AppEventListenerHdl));
+}
+
+void OutlineView::DisconnectFromApplication()
+{
+ Application::RemoveEventListener(LINK(this, OutlineView, AppEventListenerHdl));
+}
+
+void OutlineView::Paint(const ::tools::Rectangle& rRect, ::sd::Window const * pWin)
+{
+ OutlinerView* pOlView = GetViewByWindow(pWin);
+
+ if (pOlView)
+ {
+ pOlView->HideCursor();
+ pOlView->Paint(rRect);
+
+ pOlView->ShowCursor(mbFirstPaint);
+
+ mbFirstPaint = false;
+ }
+}
+
+void OutlineView::AddWindowToPaintView(OutputDevice* pWin, vcl::Window* pWindow)
+{
+ bool bAdded = false;
+ bool bValidArea = false;
+ ::tools::Rectangle aOutputArea;
+ const Color aWhiteColor( COL_WHITE );
+ sal_uInt16 nView = 0;
+
+ while (nView < MAX_OUTLINERVIEWS && !bAdded)
+ {
+ if (mpOutlinerViews[nView] == nullptr)
+ {
+ mpOutlinerViews[nView].reset( new OutlinerView(&mrOutliner, dynamic_cast< ::sd::Window* >(pWin->GetOwnerWindow())) );
+ mpOutlinerViews[nView]->SetBackgroundColor( aWhiteColor );
+ mrOutliner.InsertView(mpOutlinerViews[nView].get(), EE_APPEND);
+ bAdded = true;
+
+ if (bValidArea)
+ {
+ mpOutlinerViews[nView]->SetOutputArea(aOutputArea);
+ }
+ }
+ else if (!bValidArea)
+ {
+ aOutputArea = mpOutlinerViews[nView]->GetOutputArea();
+ bValidArea = true;
+ }
+
+ nView++;
+ }
+
+ // white background in Outliner
+ pWin->SetBackground( Wallpaper( aWhiteColor ) );
+
+ ::sd::View::AddWindowToPaintView(pWin, pWindow);
+}
+
+void OutlineView::DeleteWindowFromPaintView(OutputDevice* pWin)
+{
+ bool bRemoved = false;
+ sal_uInt16 nView = 0;
+ vcl::Window* pWindow;
+
+ while (nView < MAX_OUTLINERVIEWS && !bRemoved)
+ {
+ if (mpOutlinerViews[nView] != nullptr)
+ {
+ pWindow = mpOutlinerViews[nView]->GetWindow();
+
+ if (pWindow->GetOutDev() == pWin)
+ {
+ mrOutliner.RemoveView( mpOutlinerViews[nView].get() );
+ mpOutlinerViews[nView].reset();
+ bRemoved = true;
+ }
+ }
+
+ nView++;
+ }
+
+ ::sd::View::DeleteWindowFromPaintView(pWin);
+}
+
+/**
+ * Return a pointer to the OutlinerView corresponding to the window
+ */
+OutlinerView* OutlineView::GetViewByWindow (vcl::Window const * pWin) const
+{
+ OutlinerView* pOlView = nullptr;
+ for (std::unique_ptr<OutlinerView> const & pView : mpOutlinerViews)
+ {
+ if (pView != nullptr)
+ {
+ if ( pWin == pView->GetWindow() )
+ {
+ pOlView = pView.get();
+ }
+ }
+ }
+ return pOlView;
+}
+
+/**
+ * Return the title before a random paragraph
+ */
+Paragraph* OutlineView::GetPrevTitle(const Paragraph* pPara)
+{
+ sal_Int32 nPos = mrOutliner.GetAbsPos(pPara);
+
+ if (nPos > 0)
+ {
+ while(nPos)
+ {
+ pPara = mrOutliner.GetParagraph(--nPos);
+ if( ::Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE) )
+ {
+ return const_cast< Paragraph* >( pPara );
+ }
+ }
+
+ }
+ return nullptr;
+}
+
+/**
+ * Return the title after a random paragraph
+ */
+Paragraph* OutlineView::GetNextTitle(const Paragraph* pPara)
+{
+ Paragraph* pResult = const_cast< Paragraph* >( pPara );
+
+ sal_Int32 nPos = mrOutliner.GetAbsPos(pResult);
+
+ do
+ {
+ pResult = mrOutliner.GetParagraph(++nPos);
+ if( pResult && ::Outliner::HasParaFlag(pResult, ParaFlag::ISPAGE) )
+ return pResult;
+ }
+ while( pResult );
+
+ return nullptr;
+}
+
+/**
+ * Handler for inserting pages (paragraphs)
+ */
+IMPL_LINK( OutlineView, ParagraphInsertedHdl, Outliner::ParagraphHdlParam, aParam, void )
+{
+ // we get calls to this handler during binary insert of drag and drop contents but
+ // we ignore it here and handle it later in OnEndPasteOrDrop()
+ if (maDragAndDropModelGuard != nullptr)
+ return;
+
+ OutlineViewPageChangesGuard aGuard(this);
+
+ sal_Int32 nAbsPos = mrOutliner.GetAbsPos( aParam.pPara );
+
+ UpdateParagraph( nAbsPos );
+
+ if( (nAbsPos == 0) ||
+ ::Outliner::HasParaFlag(aParam.pPara, ParaFlag::ISPAGE) ||
+ ::Outliner::HasParaFlag(mrOutliner.GetParagraph( nAbsPos-1 ), ParaFlag::ISPAGE) )
+ {
+ InsertSlideForParagraph( aParam.pPara );
+ }
+}
+
+/** creates and inserts an empty slide for the given paragraph */
+SdPage* OutlineView::InsertSlideForParagraph( Paragraph* pPara )
+{
+ DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::InsertSlideForParagraph(), model change without undo?!" );
+
+ OutlineViewPageChangesGuard aGuard(this);
+
+ mrOutliner.SetParaFlag( pPara, ParaFlag::ISPAGE );
+ // how many titles are there before the new title paragraph?
+ sal_uLong nExample = 0; // position of the "example" page
+ sal_uLong nTarget = 0; // position of insertion
+ while(pPara)
+ {
+ pPara = GetPrevTitle(pPara);
+ if (pPara)
+ nTarget++;
+ }
+
+ // if a new paragraph is created via RETURN before the first paragraph, the
+ // Outliner reports the old paragraph (which was moved down) as a new
+ // paragraph
+ if (nTarget == 1)
+ {
+ OUString aTest = mrOutliner.GetText(mrOutliner.GetParagraph(0));
+ if (aTest.isEmpty())
+ {
+ nTarget = 0;
+ }
+ }
+
+ // the "example" page is the previous page - if it is available
+ if (nTarget > 0)
+ {
+ nExample = nTarget - 1;
+
+ sal_uInt16 nPageCount = mrDoc.GetSdPageCount( PageKind::Standard );
+ if( nExample >= nPageCount )
+ nExample = nPageCount - 1;
+ }
+
+ /**********************************************************************
+ * All the time, a standard page is created before a notes page.
+ * It is ensured that after each standard page the corresponding notes page
+ * follows. A handout page is exactly one handout page.
+ **********************************************************************/
+
+ // this page is exemplary
+ SdPage* pExample = mrDoc.GetSdPage(static_cast<sal_uInt16>(nExample), PageKind::Standard);
+ rtl::Reference<SdPage> pPage = mrDoc.AllocSdPage(false);
+
+ pPage->SetLayoutName(pExample->GetLayoutName());
+
+ // insert (page)
+ mrDoc.InsertPage(pPage.get(), static_cast<sal_uInt16>(nTarget) * 2 + 1);
+ if( isRecordingUndo() )
+ AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoNewPage(*pPage));
+
+ // assign a master page to the standard page
+ pPage->TRG_SetMasterPage(pExample->TRG_GetMasterPage());
+
+ // set page size
+ pPage->SetSize(pExample->GetSize());
+ pPage->SetBorder( pExample->GetLeftBorder(),
+ pExample->GetUpperBorder(),
+ pExample->GetRightBorder(),
+ pExample->GetLowerBorder() );
+
+ // create new presentation objects (after <Title> or <Title with subtitle>
+ // follows <Title with outline>, otherwise apply the layout of the previous
+ // page
+ AutoLayout eAutoLayout = pExample->GetAutoLayout();
+ if (eAutoLayout == AUTOLAYOUT_TITLE ||
+ eAutoLayout == AUTOLAYOUT_TITLE_ONLY)
+ {
+ pPage->SetAutoLayout(AUTOLAYOUT_TITLE_CONTENT, true);
+ }
+ else
+ {
+ pPage->SetAutoLayout(pExample->GetAutoLayout(), true);
+ }
+
+ /**********************************************************************
+ |* now the notes page
+ \*********************************************************************/
+ pExample = mrDoc.GetSdPage(static_cast<sal_uInt16>(nExample), PageKind::Notes);
+ rtl::Reference<SdPage> pNotesPage = mrDoc.AllocSdPage(false);
+
+ pNotesPage->SetLayoutName(pExample->GetLayoutName());
+
+ pNotesPage->SetPageKind(PageKind::Notes);
+
+ // insert (notes page)
+ mrDoc.InsertPage(pNotesPage.get(), static_cast<sal_uInt16>(nTarget) * 2 + 2);
+ if( isRecordingUndo() )
+ AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoNewPage(*pNotesPage));
+
+ // assign a master page to the notes page
+ pNotesPage->TRG_SetMasterPage(pExample->TRG_GetMasterPage());
+
+ // set page size, there must be already one page available
+ pNotesPage->SetSize(pExample->GetSize());
+ pNotesPage->SetBorder( pExample->GetLeftBorder(),
+ pExample->GetUpperBorder(),
+ pExample->GetRightBorder(),
+ pExample->GetLowerBorder() );
+
+ // create presentation objects
+ pNotesPage->SetAutoLayout(pExample->GetAutoLayout(), true);
+
+ mrOutliner.UpdateFields();
+
+ return pPage.get();
+}
+
+/**
+ * Handler for deleting pages (paragraphs)
+ */
+IMPL_LINK( OutlineView, ParagraphRemovingHdl, ::Outliner::ParagraphHdlParam, aParam, void )
+{
+ DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::ParagraphRemovingHdl(), model change without undo?!" );
+
+ OutlineViewPageChangesGuard aGuard(this);
+
+ Paragraph* pPara = aParam.pPara;
+ if( !::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) )
+ return;
+
+ // how many titles are in front of the title paragraph in question?
+ sal_uLong nPos = 0;
+ while(pPara)
+ {
+ pPara = GetPrevTitle(pPara);
+ if (pPara) nPos++;
+ }
+
+ // delete page and notes page
+ sal_uInt16 nAbsPos = static_cast<sal_uInt16>(nPos) * 2 + 1;
+ SdrPage* pPage = mrDoc.GetPage(nAbsPos);
+ if( isRecordingUndo() )
+ AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage));
+ mrDoc.RemovePage(nAbsPos);
+
+ nAbsPos = static_cast<sal_uInt16>(nPos) * 2 + 1;
+ pPage = mrDoc.GetPage(nAbsPos);
+ if( isRecordingUndo() )
+ AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage));
+ mrDoc.RemovePage(nAbsPos);
+
+ // progress display if necessary
+ if (mnPagesToProcess)
+ {
+ mnPagesProcessed++;
+
+ if(mpProgress)
+ mpProgress->SetState(mnPagesProcessed);
+
+ if (mnPagesProcessed == mnPagesToProcess)
+ {
+ mpProgress.reset();
+ mnPagesToProcess = 0;
+ mnPagesProcessed = 0;
+ }
+ }
+ aParam.pOutliner->UpdateFields();
+}
+
+/**
+ * Handler for changing the indentation depth of paragraphs (requires inserting
+ * or deleting of pages in some cases)
+ */
+IMPL_LINK( OutlineView, DepthChangedHdl, ::Outliner::DepthChangeHdlParam, aParam, void )
+{
+ DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::DepthChangedHdl(), no undo for model change?!" );
+
+ OutlineViewPageChangesGuard aGuard(this);
+
+ Paragraph* pPara = aParam.pPara;
+ ::Outliner* pOutliner = aParam.pOutliner;
+ if( ::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) && ((aParam.nPrevFlags & ParaFlag::ISPAGE) == ParaFlag::NONE) )
+ {
+ // the current paragraph is transformed into a slide
+
+ mrOutliner.SetDepth( pPara, -1 );
+
+ // are multiple level 1 paragraphs being brought to level 0 and we
+ // should start a progress view or a timer and didn't already?
+ if (mnPagesToProcess == 0)
+ {
+ Window* pActWin = mrOutlineViewShell.GetActiveWindow();
+ OutlinerView* pOlView = GetViewByWindow(pActWin);
+
+ std::vector<Paragraph*> aSelList;
+ pOlView->CreateSelectionList(aSelList);
+
+ mnPagesToProcess = std::count_if(aSelList.begin(), aSelList.end(),
+ [&pOutliner](const Paragraph *pParagraph) {
+ return !Outliner::HasParaFlag(pParagraph, ParaFlag::ISPAGE) &&
+ (pOutliner->GetDepth(pOutliner->GetAbsPos(pParagraph)) <= 0);
+ });
+
+ mnPagesToProcess++; // the paragraph being in level 0 already
+ // should be included
+ mnPagesProcessed = 0;
+
+ if (mnPagesToProcess > PROCESS_WITH_PROGRESS_THRESHOLD)
+ {
+ mpProgress.reset( new SfxProgress( GetDocSh(), SdResId(STR_CREATE_PAGES), mnPagesToProcess ) );
+ }
+ else
+ {
+ mpDocSh->SetWaitCursor( true );
+ }
+ }
+
+ ParagraphInsertedHdl( { aParam.pOutliner, aParam.pPara } );
+
+ mnPagesProcessed++;
+
+ // should there be a progress display?
+ if (mnPagesToProcess > PROCESS_WITH_PROGRESS_THRESHOLD)
+ {
+ if (mpProgress)
+ mpProgress->SetState(mnPagesProcessed);
+ }
+
+ // was this the last page?
+ if (mnPagesProcessed == mnPagesToProcess)
+ {
+ if (mnPagesToProcess > PROCESS_WITH_PROGRESS_THRESHOLD && mpProgress)
+ {
+ mpProgress.reset();
+ }
+ else
+ mpDocSh->SetWaitCursor( false );
+
+ mnPagesToProcess = 0;
+ mnPagesProcessed = 0;
+ }
+ pOutliner->UpdateFields();
+ }
+ else if( !::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE ) && ((aParam.nPrevFlags & ParaFlag::ISPAGE) != ParaFlag::NONE) )
+ {
+ // the paragraph was a page but now becomes a normal paragraph
+
+ // how many titles are before the title paragraph in question?
+ sal_uLong nPos = 0;
+ Paragraph* pParagraph = pPara;
+ while(pParagraph)
+ {
+ pParagraph = GetPrevTitle(pParagraph);
+ if (pParagraph)
+ nPos++;
+ }
+ // delete page and notes page
+
+ sal_uInt16 nAbsPos = static_cast<sal_uInt16>(nPos) * 2 + 1;
+ SdrPage* pPage = mrDoc.GetPage(nAbsPos);
+ if( isRecordingUndo() )
+ AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage));
+ mrDoc.RemovePage(nAbsPos);
+
+ nAbsPos = static_cast<sal_uInt16>(nPos) * 2 + 1;
+ pPage = mrDoc.GetPage(nAbsPos);
+ if( isRecordingUndo() )
+ AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoDeletePage(*pPage));
+ mrDoc.RemovePage(nAbsPos);
+
+ pPage = GetPageForParagraph( pPara );
+
+ mrOutliner.SetDepth( pPara, (pPage && (static_cast<SdPage*>(pPage)->GetAutoLayout() == AUTOLAYOUT_TITLE)) ? -1 : 0 );
+
+ // progress display if necessary
+ if (mnPagesToProcess)
+ {
+ mnPagesProcessed++;
+ if (mpProgress)
+ mpProgress->SetState(mnPagesProcessed);
+
+ if (mnPagesProcessed == mnPagesToProcess)
+ {
+ mpProgress.reset();
+ mnPagesToProcess = 0;
+ mnPagesProcessed = 0;
+ }
+ }
+ pOutliner->UpdateFields();
+ }
+ else if ( (pOutliner->GetPrevDepth() == 1) && ( pOutliner->GetDepth( pOutliner->GetAbsPos( pPara ) ) == 2 ) )
+ {
+ // how many titles are in front of the title paragraph in question?
+ sal_Int32 nPos = -1;
+
+ Paragraph* pParagraph = pPara;
+ while(pParagraph)
+ {
+ pParagraph = GetPrevTitle(pParagraph);
+ if (pParagraph)
+ nPos++;
+ }
+
+ if(nPos >= 0)
+ {
+ SdPage*pPage = mrDoc.GetSdPage( static_cast<sal_uInt16>(nPos), PageKind::Standard);
+
+ if(pPage && pPage->GetPresObj(PresObjKind::Text))
+ pOutliner->SetDepth( pPara, 0 );
+ }
+
+ }
+ // how many titles are in front of the title paragraph in question?
+ sal_Int32 nPos = -1;
+
+ Paragraph* pTempPara = pPara;
+ while(pTempPara)
+ {
+ pTempPara = GetPrevTitle(pTempPara);
+ if (pTempPara)
+ nPos++;
+ }
+
+ if( nPos < 0 )
+ return;
+
+ SdPage* pPage = mrDoc.GetSdPage( static_cast<sal_uInt16>(nPos), PageKind::Standard );
+
+ if( !pPage )
+ return;
+
+ SfxStyleSheet* pStyleSheet = nullptr;
+ sal_Int32 nPara = pOutliner->GetAbsPos( pPara );
+ sal_Int16 nDepth = pOutliner->GetDepth( nPara );
+ bool bSubTitle = pPage->GetPresObj(PresObjKind::Text) != nullptr;
+
+ if( ::Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE) )
+ {
+ pStyleSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Title );
+ }
+ else if( bSubTitle )
+ {
+ pStyleSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Text );
+ }
+ else
+ {
+ pStyleSheet = pPage->GetStyleSheetForPresObj( PresObjKind::Outline );
+
+ if( nDepth > 0 )
+ {
+ OUString aNewStyleSheetName = pStyleSheet->GetName();
+ if (!aNewStyleSheetName.isEmpty())
+ aNewStyleSheetName = aNewStyleSheetName.copy(0, aNewStyleSheetName.getLength() - 1);
+ aNewStyleSheetName += OUString::number( nDepth+1 );
+ SfxStyleSheetBasePool* pStylePool = mrDoc.GetStyleSheetPool();
+ pStyleSheet = static_cast<SfxStyleSheet*>( pStylePool->Find( aNewStyleSheetName, pStyleSheet->GetFamily() ) );
+ }
+ }
+
+ // before we set the style sheet we need to preserve the bullet item
+ // since all items will be deleted while setting a new style sheet
+ SfxItemSet aOldAttrs( pOutliner->GetParaAttribs( nPara ) );
+
+ pOutliner->SetStyleSheet( nPara, pStyleSheet );
+
+ // restore the old bullet item but not if the style changed
+ if ( pOutliner->GetPrevDepth() != -1 && nDepth != -1 &&
+ aOldAttrs.GetItemState( EE_PARA_NUMBULLET ) == SfxItemState::SET )
+ {
+ SfxItemSet aAttrs( pOutliner->GetParaAttribs( nPara ) );
+ aAttrs.Put( *aOldAttrs.GetItem( EE_PARA_NUMBULLET ) );
+ pOutliner->SetParaAttribs( nPara, aAttrs );
+ }
+}
+
+/**
+ * Handler for StatusEvents
+ */
+IMPL_LINK_NOARG(OutlineView, StatusEventHdl, EditStatus&, void)
+{
+ ::sd::Window* pWin = mrOutlineViewShell.GetActiveWindow();
+ OutlinerView* pOutlinerView = GetViewByWindow(pWin);
+ ::tools::Rectangle aVis = pOutlinerView->GetVisArea();
+ ::tools::Rectangle aText(Point(0,0),
+ Size(mnPaperWidth,
+ mrOutliner.GetTextHeight()));
+ ::tools::Rectangle aWin(Point(0,0), pWin->GetOutputSizePixel());
+ aWin = pWin->PixelToLogic(aWin);
+
+ if (!aVis.IsEmpty()) // not when opening
+ {
+ if (aWin.GetHeight() > aText.Bottom())
+ aText.SetBottom( aWin.GetHeight() );
+
+ mrOutlineViewShell.InitWindows(Point(0,0), aText.GetSize(), aVis.TopLeft());
+ mrOutlineViewShell.UpdateScrollBars();
+ }
+}
+
+IMPL_LINK_NOARG(OutlineView, BeginDropHdl, EditView*, void)
+{
+ DBG_ASSERT(maDragAndDropModelGuard == nullptr,
+ "sd::OutlineView::BeginDropHdl(), prior drag operation not finished correctly!");
+
+ maDragAndDropModelGuard.reset( new OutlineViewModelChangeGuard( *this ) );
+}
+
+IMPL_LINK_NOARG(OutlineView, EndDropHdl, EditView*, void)
+{
+ maDragAndDropModelGuard.reset();
+}
+
+/**
+ * Handler for the start of a paragraph movement
+ */
+IMPL_LINK( OutlineView, BeginMovingHdl, ::Outliner *, pOutliner, void )
+{
+ OutlineViewPageChangesGuard aGuard(this);
+
+ // list of selected title paragraphs
+ mpOutlinerViews[0]->CreateSelectionList(maSelectedParas);
+
+ maSelectedParas.erase(std::remove_if(maSelectedParas.begin(), maSelectedParas.end(),
+ [](const Paragraph* pPara) { return !Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE); }),
+ maSelectedParas.end());
+
+ // select the pages belonging to the paragraphs on level 0 to select
+ sal_uInt16 nPos = 0;
+ sal_Int32 nParaPos = 0;
+ Paragraph* pPara = pOutliner->GetParagraph( 0 );
+ std::vector<Paragraph*>::const_iterator fiter;
+
+ while(pPara)
+ {
+ if( ::Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE) ) // one page?
+ {
+ maOldParaOrder.push_back(pPara);
+ SdPage* pPage = mrDoc.GetSdPage(nPos, PageKind::Standard);
+
+ fiter = std::find(maSelectedParas.begin(),maSelectedParas.end(),pPara);
+
+ pPage->SetSelected(fiter != maSelectedParas.end());
+
+ ++nPos;
+ }
+ pPara = pOutliner->GetParagraph( ++nParaPos );
+ }
+}
+
+/**
+ * Handler for the end of a paragraph movement
+ */
+IMPL_LINK( OutlineView, EndMovingHdl, ::Outliner *, pOutliner, void )
+{
+ OutlineViewPageChangesGuard aGuard(this);
+
+ DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::EndMovingHdl(), model change without undo?!" );
+
+ // look for insertion position via the first paragraph
+ Paragraph* pSearchIt = maSelectedParas.empty() ? nullptr : *(maSelectedParas.begin());
+
+ // look for the first of the selected paragraphs in the new ordering
+ sal_uInt16 nPosNewOrder = 0;
+ sal_Int32 nParaPos = 0;
+ Paragraph* pPara = pOutliner->GetParagraph( 0 );
+ Paragraph* pPrev = nullptr;
+ while (pPara && pPara != pSearchIt)
+ {
+ if( ::Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE) )
+ {
+ nPosNewOrder++;
+ pPrev = pPara;
+ }
+ pPara = pOutliner->GetParagraph( ++nParaPos );
+ }
+
+ sal_uInt16 nPos = nPosNewOrder; // don't change nPosNewOrder
+ if (nPos == 0)
+ {
+ nPos = sal_uInt16(-1); // insert before the first page
+ }
+ else
+ {
+ // look for the predecessor in the old ordering
+ std::vector<Paragraph*>::const_iterator it = std::find(maOldParaOrder.begin(),
+ maOldParaOrder.end(),
+ pPrev);
+
+ if (it != maOldParaOrder.end())
+ nPos = static_cast<sal_uInt16>(it-maOldParaOrder.begin());
+ else
+ nPos = 0xffff;
+
+ DBG_ASSERT(nPos != 0xffff, "Paragraph not found");
+ }
+
+ mrDoc.MovePages(nPos);
+
+ // deselect the pages again
+ sal_uInt16 nPageCount = static_cast<sal_uInt16>(maSelectedParas.size());
+ while (nPageCount)
+ {
+ SdPage* pPage = mrDoc.GetSdPage(nPosNewOrder, PageKind::Standard);
+ pPage->SetSelected(false);
+ nPosNewOrder++;
+ nPageCount--;
+ }
+
+ pOutliner->UpdateFields();
+
+ maSelectedParas.clear();
+ maOldParaOrder.clear();
+}
+
+/**
+ * Look for the title text object in one page of the model
+ */
+SdrTextObj* OutlineView::GetTitleTextObject(SdrPage const * pPage)
+{
+ const size_t nObjectCount = pPage->GetObjCount();
+ SdrTextObj* pResult = nullptr;
+
+ for (size_t nObject = 0; nObject < nObjectCount; ++nObject)
+ {
+ SdrObject* pObject = pPage->GetObj(nObject);
+ if (pObject->GetObjInventor() == SdrInventor::Default &&
+ pObject->GetObjIdentifier() == SdrObjKind::TitleText)
+ {
+ pResult = static_cast<SdrTextObj*>(pObject);
+ break;
+ }
+ }
+ return pResult;
+}
+
+/**
+ * Look for the outline text object in one page of the model
+ */
+SdrTextObj* OutlineView::GetOutlineTextObject(SdrPage const * pPage)
+{
+ const size_t nObjectCount = pPage->GetObjCount();
+ SdrTextObj* pResult = nullptr;
+
+ for (size_t nObject = 0; nObject < nObjectCount; ++nObject)
+ {
+ SdrObject* pObject = pPage->GetObj(nObject);
+ if (pObject->GetObjInventor() == SdrInventor::Default &&
+ pObject->GetObjIdentifier() == SdrObjKind::OutlineText)
+ {
+ pResult = static_cast<SdrTextObj*>(pObject);
+ break;
+ }
+ }
+ return pResult;
+}
+
+SdrTextObj* OutlineView::CreateTitleTextObject(SdPage* pPage)
+{
+ DBG_ASSERT( GetTitleTextObject(pPage) == nullptr, "sd::OutlineView::CreateTitleTextObject(), there is already a title text object!" );
+
+ if( pPage->GetAutoLayout() == AUTOLAYOUT_NONE )
+ {
+ // simple case
+ pPage->SetAutoLayout( AUTOLAYOUT_TITLE_ONLY, true );
+ }
+ else
+ {
+ // we already have a layout with a title but the title
+ // object was deleted, create a new one
+ pPage->InsertAutoLayoutShape( nullptr, PresObjKind::Title, false, pPage->GetTitleRect(), true );
+ }
+
+ return GetTitleTextObject(pPage);
+}
+
+SdrTextObj* OutlineView::CreateOutlineTextObject(SdPage* pPage)
+{
+ DBG_ASSERT( GetOutlineTextObject(pPage) == nullptr, "sd::OutlineView::CreateOutlineTextObject(), there is already a layout text object!" );
+
+ AutoLayout eNewLayout = pPage->GetAutoLayout();
+ switch( eNewLayout )
+ {
+ case AUTOLAYOUT_NONE:
+ case AUTOLAYOUT_TITLE_ONLY:
+ case AUTOLAYOUT_TITLE: eNewLayout = AUTOLAYOUT_TITLE_CONTENT; break;
+
+ case AUTOLAYOUT_CHART: eNewLayout = AUTOLAYOUT_CHARTTEXT; break;
+
+ case AUTOLAYOUT_ORG:
+ case AUTOLAYOUT_TAB:
+ case AUTOLAYOUT_OBJ: eNewLayout = AUTOLAYOUT_OBJTEXT; break;
+ default:
+ break;
+ }
+
+ if( eNewLayout != pPage->GetAutoLayout() )
+ {
+ pPage->SetAutoLayout( eNewLayout, true );
+ }
+ else
+ {
+ // we already have a layout with a text but the text
+ // object was deleted, create a new one
+ pPage->InsertAutoLayoutShape( nullptr,
+ PresObjKind::Outline,
+ false, pPage->GetLayoutRect(), true );
+ }
+
+ return GetOutlineTextObject(pPage);
+}
+
+/** updates draw model with all changes from outliner model */
+void OutlineView::PrepareClose()
+{
+ ::sd::UndoManager* pDocUndoMgr = dynamic_cast<sd::UndoManager*>(mpDocSh->GetUndoManager());
+ if (pDocUndoMgr != nullptr)
+ pDocUndoMgr->SetLinkedUndoManager(nullptr);
+
+ mrOutliner.GetUndoManager().Clear();
+
+ BegUndo(SdResId(STR_UNDO_CHANGE_TITLE_AND_LAYOUT));
+ UpdateDocument();
+ EndUndo();
+ mrDoc.SetSelected(GetActualPage(), true);
+}
+
+/**
+ * Set attributes of the selected text
+ */
+bool OutlineView::SetAttributes(const SfxItemSet& rSet, bool /*bSlide*/, bool /*bReplaceAll*/, bool /*bMaster*/)
+{
+ bool bOk = false;
+
+ OutlinerView* pOlView = GetViewByWindow(mrOutlineViewShell.GetActiveWindow());
+
+ if (pOlView)
+ {
+ pOlView->SetAttribs(rSet);
+ bOk = true;
+ }
+
+ mrOutlineViewShell.Invalidate (SID_PREVIEW_STATE);
+
+ return bOk;
+}
+
+/**
+ * Get attributes of the selected text
+ */
+void OutlineView::GetAttributes( SfxItemSet& rTargetSet, bool ) const
+{
+ OutlinerView* pOlView = GetViewByWindow(
+ mrOutlineViewShell.GetActiveWindow());
+ assert(pOlView && "No OutlinerView found");
+
+ rTargetSet.Put( pOlView->GetAttribs(), false );
+}
+
+/** creates outliner model from draw model */
+void OutlineView::FillOutliner()
+{
+ mrOutliner.GetUndoManager().Clear();
+ mrOutliner.EnableUndo(false);
+ ResetLinks();
+ const bool bPrevUpdateLayout = mrOutliner.SetUpdateLayout(false);
+
+ Paragraph* pTitleToSelect = nullptr;
+ sal_uInt16 nPageCount = mrDoc.GetSdPageCount(PageKind::Standard);
+
+ // fill outliner with paragraphs from slides title & (outlines|subtitles)
+ for (sal_uInt16 nPage = 0; nPage < nPageCount; nPage++)
+ {
+ SdPage* pPage = mrDoc.GetSdPage(nPage, PageKind::Standard);
+ Paragraph * pPara = nullptr;
+
+ // take text from title shape
+ SdrTextObj* pTO = GetTitleTextObject(pPage);
+ if(pTO && !(pTO->IsEmptyPresObj()))
+ {
+ OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
+ if (pOPO)
+ {
+ bool bVertical = pOPO->IsEffectivelyVertical();
+ pOPO->SetVertical( false );
+ mrOutliner.AddText(*pOPO);
+ pOPO->SetVertical( bVertical );
+ pPara = mrOutliner.GetParagraph( mrOutliner.GetParagraphCount()-1 );
+ }
+ }
+
+ if( pPara == nullptr ) // no title, insert an empty paragraph
+ {
+ pPara = mrOutliner.Insert(OUString());
+ mrOutliner.SetDepth(pPara, -1);
+
+ // do not apply hard attributes from the previous paragraph
+ mrOutliner.SetParaAttribs( mrOutliner.GetAbsPos(pPara),
+ mrOutliner.GetEmptyItemSet() );
+
+ mrOutliner.SetStyleSheet( mrOutliner.GetAbsPos( pPara ), pPage->GetStyleSheetForPresObj( PresObjKind::Title ) );
+ }
+
+ mrOutliner.SetParaFlag( pPara, ParaFlag::ISPAGE );
+
+ sal_Int32 nPara = mrOutliner.GetAbsPos( pPara );
+
+ UpdateParagraph( nPara );
+
+ // remember paragraph of currently selected page
+ if (pPage->IsSelected())
+ pTitleToSelect = pPara;
+
+ // take text from subtitle or outline
+ pTO = static_cast<SdrTextObj*>(pPage->GetPresObj(PresObjKind::Text));
+ const bool bSubTitle = pTO != nullptr;
+
+ if (!pTO) // if no subtile found, try outline
+ pTO = GetOutlineTextObject(pPage);
+
+ if(pTO && !(pTO->IsEmptyPresObj())) // found some text
+ {
+ OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
+ if (pOPO)
+ {
+ sal_Int32 nParaCount1 = mrOutliner.GetParagraphCount();
+ bool bVertical = pOPO->IsEffectivelyVertical();
+ pOPO->SetVertical( false );
+ mrOutliner.AddText(*pOPO);
+ pOPO->SetVertical( bVertical );
+
+ sal_Int32 nParaCount2 = mrOutliner.GetParagraphCount();
+ for (sal_Int32 n = nParaCount1; n < nParaCount2; n++)
+ {
+ if( bSubTitle )
+ {
+ Paragraph* p = mrOutliner.GetParagraph(n);
+ if(p && mrOutliner.GetDepth( n ) > 0 )
+ mrOutliner.SetDepth(p, 0);
+ }
+
+ UpdateParagraph( n );
+ }
+ }
+ }
+ }
+
+ // place cursor at the start
+ Paragraph* pFirstPara = mrOutliner.GetParagraph( 0 );
+ mpOutlinerViews[0]->Select( pFirstPara );
+ mpOutlinerViews[0]->Select( pFirstPara, false );
+
+ // select title of slide that was selected
+ if (pTitleToSelect)
+ mpOutlinerViews[0]->Select(pTitleToSelect);
+
+ SetLinks();
+
+ mrOutliner.EnableUndo(true);
+
+ mrOutliner.SetUpdateLayout(bPrevUpdateLayout);
+}
+
+/**
+ * Handler for deleting of level 0 paragraphs (pages): Warning
+ */
+IMPL_LINK_NOARG(OutlineView, RemovingPagesHdl, OutlinerView*, bool)
+{
+ sal_Int32 nNumOfPages = mrOutliner.GetSelPageCount();
+
+ if (nNumOfPages > PROCESS_WITH_PROGRESS_THRESHOLD)
+ {
+ mnPagesToProcess = nNumOfPages;
+ mnPagesProcessed = 0;
+ }
+
+ if (mnPagesToProcess)
+ {
+ mpProgress.reset( new SfxProgress( GetDocSh(), SdResId(STR_DELETE_PAGES), mnPagesToProcess ) );
+ }
+ mrOutliner.UpdateFields();
+
+ return true;
+}
+
+/**
+ * Handler for indenting level 0 paragraphs (pages): Warning
+ */
+IMPL_LINK( OutlineView, IndentingPagesHdl, OutlinerView *, pOutlinerView, bool )
+{
+ return RemovingPagesHdl(pOutlinerView);
+}
+
+/** returns the first slide that is selected in the outliner or where
+ the cursor is located */
+SdPage* OutlineView::GetActualPage()
+{
+ ::sd::Window* pWin = mrOutlineViewShell.GetActiveWindow();
+ OutlinerView* pActiveView = GetViewByWindow(pWin);
+
+ std::vector<Paragraph*> aSelList;
+ pActiveView->CreateSelectionList(aSelList);
+
+ Paragraph *pPar = aSelList.empty() ? nullptr : *(aSelList.begin());
+ SdPage* pCurrent = GetPageForParagraph(pPar);
+
+ DBG_ASSERT( pCurrent ||
+ (mpDocSh->GetUndoManager() && static_cast< sd::UndoManager *>(mpDocSh->GetUndoManager())->IsDoing()) ||
+ maDragAndDropModelGuard,
+ "sd::OutlineView::GetActualPage(), no current page?" );
+
+ if( pCurrent )
+ return pCurrent;
+
+ return mrDoc.GetSdPage( 0, PageKind::Standard );
+}
+
+SdPage* OutlineView::GetPageForParagraph( Paragraph* pPara )
+{
+ if( !::Outliner::HasParaFlag(pPara,ParaFlag::ISPAGE) )
+ pPara = GetPrevTitle(pPara);
+
+ sal_uInt32 nPageToSelect = 0;
+ while(pPara)
+ {
+ pPara = GetPrevTitle(pPara);
+ if(pPara)
+ nPageToSelect++;
+ }
+
+ if( nPageToSelect < static_cast<sal_uInt32>(mrDoc.GetSdPageCount( PageKind::Standard )) )
+ return mrDoc.GetSdPage( static_cast<sal_uInt16>(nPageToSelect), PageKind::Standard );
+
+ return nullptr;
+}
+
+Paragraph* OutlineView::GetParagraphForPage( ::Outliner const & rOutl, SdPage const * pPage )
+{
+ // get the number of paragraphs with ident 0 we need to skip before
+ // we find the actual page
+ sal_uInt32 nPagesToSkip = (pPage->GetPageNum() - 1) >> 1;
+
+ sal_Int32 nParaPos = 0;
+ Paragraph* pPara = rOutl.GetParagraph( 0 );
+ while( pPara )
+ {
+ // if this paragraph is a page...
+ if( ::Outliner::HasParaFlag(pPara,ParaFlag::ISPAGE) )
+ {
+ // see if we already skipped enough pages
+ if( 0 == nPagesToSkip )
+ break; // and if so, end the loop
+
+ // we skipped another page
+ nPagesToSkip--;
+ }
+
+ // get next paragraph
+ pPara = mrOutliner.GetParagraph( ++nParaPos );
+ }
+
+ return pPara;
+}
+
+/** selects the paragraph for the given page at the outliner view*/
+void OutlineView::SetActualPage( SdPage const * pActual )
+{
+ if( pActual && dynamic_cast<SdOutliner&>(mrOutliner).GetIgnoreCurrentPageChangesLevel()==0 && !mbFirstPaint)
+ {
+ // if we found a paragraph, select its text at the outliner view
+ Paragraph* pPara = GetParagraphForPage( mrOutliner, pActual );
+ if( pPara )
+ mpOutlinerViews[0]->Select( pPara );
+ }
+}
+
+/**
+ * Get StyleSheet from the selection
+ */
+SfxStyleSheet* OutlineView::GetStyleSheet() const
+{
+ ::sd::Window* pActWin = mrOutlineViewShell.GetActiveWindow();
+ OutlinerView* pOlView = GetViewByWindow(pActWin);
+ SfxStyleSheet* pResult = pOlView->GetStyleSheet();
+ return pResult;
+}
+
+/**
+ * Mark pages as selected / not selected
+ */
+void OutlineView::SetSelectedPages()
+{
+ // list of selected title paragraphs
+ std::vector<Paragraph*> aSelParas;
+ mpOutlinerViews[0]->CreateSelectionList(aSelParas);
+
+ aSelParas.erase(std::remove_if(aSelParas.begin(), aSelParas.end(),
+ [](const Paragraph* pPara) { return !Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE); }),
+ aSelParas.end());
+
+ // select the pages belonging to the paragraphs on level 0 to select
+ sal_uInt16 nPos = 0;
+ sal_Int32 nParaPos = 0;
+ Paragraph *pPara = mrOutliner.GetParagraph( 0 );
+ std::vector<Paragraph*>::const_iterator fiter;
+
+ while(pPara)
+ {
+ if( ::Outliner::HasParaFlag(pPara, ParaFlag::ISPAGE) ) // one page
+ {
+ SdPage* pPage = mrDoc.GetSdPage(nPos, PageKind::Standard);
+ DBG_ASSERT(pPage!=nullptr,
+ "Trying to select non-existing page OutlineView::SetSelectedPages()");
+
+ if (pPage)
+ {
+ fiter = std::find(aSelParas.begin(),aSelParas.end(),pPara);
+ pPage->SetSelected(fiter != aSelParas.end());
+ }
+
+ nPos++;
+ }
+
+ pPara = mrOutliner.GetParagraph( ++nParaPos );
+ }
+}
+
+/**
+ * Set new links
+ */
+void OutlineView::SetLinks()
+{
+ // set notification links
+ mrOutliner.SetParaInsertedHdl(LINK(this, OutlineView, ParagraphInsertedHdl));
+ mrOutliner.SetParaRemovingHdl(LINK(this, OutlineView, ParagraphRemovingHdl));
+ mrOutliner.SetDepthChangedHdl(LINK(this, OutlineView, DepthChangedHdl));
+ mrOutliner.SetBeginMovingHdl(LINK(this, OutlineView, BeginMovingHdl));
+ mrOutliner.SetEndMovingHdl(LINK(this, OutlineView, EndMovingHdl));
+ mrOutliner.SetRemovingPagesHdl(LINK(this, OutlineView, RemovingPagesHdl));
+ mrOutliner.SetIndentingPagesHdl(LINK(this, OutlineView, IndentingPagesHdl));
+ mrOutliner.SetStatusEventHdl(LINK(this, OutlineView, StatusEventHdl));
+ mrOutliner.SetBeginDropHdl(LINK(this,OutlineView, BeginDropHdl));
+ mrOutliner.SetEndDropHdl(LINK(this,OutlineView, EndDropHdl));
+ mrOutliner.SetPaintFirstLineHdl(LINK(this,OutlineView,PaintingFirstLineHdl));
+ mrOutliner.SetBeginPasteOrDropHdl(LINK(this,OutlineView, BeginPasteOrDropHdl));
+ mrOutliner.SetEndPasteOrDropHdl(LINK(this,OutlineView, EndPasteOrDropHdl));
+}
+
+/**
+ * Restore old links
+ */
+void OutlineView::ResetLinks() const
+{
+ mrOutliner.SetParaInsertedHdl(Link<::Outliner::ParagraphHdlParam,void>());
+ mrOutliner.SetParaRemovingHdl(Link<::Outliner::ParagraphHdlParam,void>());
+ mrOutliner.SetDepthChangedHdl(Link<::Outliner::DepthChangeHdlParam,void>());
+ mrOutliner.SetBeginMovingHdl(Link<::Outliner*,void>());
+ mrOutliner.SetEndMovingHdl(Link<::Outliner*,void>());
+ mrOutliner.SetStatusEventHdl(Link<EditStatus&,void>());
+ mrOutliner.SetRemovingPagesHdl(Link<OutlinerView*,bool>());
+ mrOutliner.SetIndentingPagesHdl(Link<OutlinerView*,bool>());
+ mrOutliner.SetDrawPortionHdl(Link<DrawPortionInfo*,void>());
+ mrOutliner.SetBeginPasteOrDropHdl(Link<PasteOrDropInfos*,void>());
+ mrOutliner.SetEndPasteOrDropHdl(Link<PasteOrDropInfos*,void>());
+}
+
+sal_Int8 OutlineView::AcceptDrop( const AcceptDropEvent&, DropTargetHelper&, SdrLayerID)
+{
+ return DND_ACTION_NONE;
+}
+
+sal_Int8 OutlineView::ExecuteDrop( const ExecuteDropEvent&, ::sd::Window*, sal_uInt16, SdrLayerID)
+{
+ return DND_ACTION_NONE;
+}
+
+// Re-implement GetScriptType for this view to get correct results
+SvtScriptType OutlineView::GetScriptType() const
+{
+ SvtScriptType nScriptType = ::sd::View::GetScriptType();
+
+ std::optional<OutlinerParaObject> pTempOPObj = mrOutliner.CreateParaObject();
+ if(pTempOPObj)
+ {
+ nScriptType = pTempOPObj->GetTextObject().GetScriptType();
+ }
+
+ return nScriptType;
+}
+
+void OutlineView::onUpdateStyleSettings( bool bForceUpdate /* = false */ )
+{
+ svtools::ColorConfig aColorConfig;
+ const Color aDocColor( aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor );
+ if( !(bForceUpdate || (maDocColor != aDocColor)) )
+ return;
+
+ sal_uInt16 nView;
+ for( nView = 0; nView < MAX_OUTLINERVIEWS; nView++ )
+ {
+ if (mpOutlinerViews[nView] != nullptr)
+ {
+ mpOutlinerViews[nView]->SetBackgroundColor( aDocColor );
+
+ vcl::Window* pWindow = mpOutlinerViews[nView]->GetWindow();
+
+ if( pWindow )
+ pWindow->SetBackground( Wallpaper( aDocColor ) );
+
+ }
+ }
+
+ mrOutliner.SetBackgroundColor( aDocColor );
+
+ maDocColor = aDocColor;
+}
+
+IMPL_LINK_NOARG(OutlineView, AppEventListenerHdl, VclSimpleEvent&, void)
+{
+ onUpdateStyleSettings(false);
+}
+
+IMPL_LINK(OutlineView, EventMultiplexerListener, ::sd::tools::EventMultiplexerEvent&, rEvent, void)
+{
+ switch (rEvent.meEventId)
+ {
+ case EventMultiplexerEventId::CurrentPageChanged:
+ SetActualPage(mrOutlineViewShell.GetActualPage());
+ break;
+
+ case EventMultiplexerEventId::PageOrder:
+ if (dynamic_cast<SdOutliner&>(mrOutliner).GetIgnoreCurrentPageChangesLevel()==0)
+ {
+ if (((mrDoc.GetPageCount()-1)%2) == 0)
+ {
+ mrOutliner.Clear();
+ FillOutliner();
+ ::sd::Window* pWindow = mrOutlineViewShell.GetActiveWindow();
+ if (pWindow != nullptr)
+ pWindow->Invalidate();
+ }
+ }
+ break;
+
+ default: break;
+ }
+}
+
+void OutlineView::IgnoreCurrentPageChanges (bool bIgnoreChanges)
+{
+ if (bIgnoreChanges)
+ dynamic_cast<SdOutliner&>(mrOutliner).IncreIgnoreCurrentPageChangesLevel();
+ else
+ dynamic_cast<SdOutliner&>(mrOutliner).DecreIgnoreCurrentPageChangesLevel();
+}
+
+/** call this method before you do anything that can modify the outliner
+ and or the drawing document model. It will create needed undo actions */
+void OutlineView::BeginModelChange()
+{
+ mrOutliner.GetUndoManager().EnterListAction("", "", 0, mrOutlineViewShell.GetViewShellBase().GetViewShellId());
+ BegUndo(SdResId(STR_UNDO_CHANGE_TITLE_AND_LAYOUT));
+}
+
+/** call this method after BeginModelChange(), when all possible model
+ changes are done. */
+void OutlineView::EndModelChange()
+{
+ UpdateDocument();
+
+ SfxUndoManager* pDocUndoMgr = mpDocSh->GetUndoManager();
+
+ bool bHasUndoActions = pDocUndoMgr->GetUndoActionCount() != 0;
+
+ EndUndo();
+
+ DBG_ASSERT( bHasUndoActions == (mrOutliner.GetUndoManager().GetUndoActionCount() != 0), "sd::OutlineView::EndModelChange(), undo actions not in sync!" );
+
+ mrOutliner.GetUndoManager().LeaveListAction();
+
+ if( bHasUndoActions && mrOutliner.GetEditEngine().HasTriedMergeOnLastAddUndo() )
+ TryToMergeUndoActions();
+
+ mrOutlineViewShell.Invalidate( SID_UNDO );
+ mrOutlineViewShell.Invalidate( SID_REDO );
+}
+
+/** updates all changes in the outliner model to the draw model */
+void OutlineView::UpdateDocument()
+{
+ OutlineViewPageChangesGuard aGuard(this);
+
+ const sal_uInt32 nPageCount = mrDoc.GetSdPageCount(PageKind::Standard);
+ Paragraph* pPara = mrOutliner.GetParagraph( 0 );
+ sal_uInt32 nPage;
+ for (nPage = 0; nPage < nPageCount; nPage++)
+ {
+ SdPage* pPage = mrDoc.GetSdPage( static_cast<sal_uInt16>(nPage), PageKind::Standard);
+ mrDoc.SetSelected(pPage, false);
+
+ mrOutlineViewShell.UpdateTitleObject( pPage, pPara );
+ mrOutlineViewShell.UpdateOutlineObject( pPage, pPara );
+
+ if( pPara )
+ pPara = GetNextTitle(pPara);
+ }
+
+ DBG_ASSERT( pPara == nullptr, "sd::OutlineView::UpdateDocument(), slides are out of sync, creating missing ones" );
+ while( pPara )
+ {
+ SdPage* pPage = InsertSlideForParagraph( pPara );
+ mrDoc.SetSelected(pPage, false);
+
+ mrOutlineViewShell.UpdateTitleObject( pPage, pPara );
+ mrOutlineViewShell.UpdateOutlineObject( pPage, pPara );
+
+ pPara = GetNextTitle(pPara);
+ }
+}
+
+/** merge edit engine undo actions if possible */
+void OutlineView::TryToMergeUndoActions()
+{
+ SfxUndoManager& rOutlineUndo = mrOutliner.GetUndoManager();
+ if( rOutlineUndo.GetUndoActionCount() <= 1 )
+ return;
+
+ SfxListUndoAction* pListAction = dynamic_cast< SfxListUndoAction* >( rOutlineUndo.GetUndoAction() );
+ SfxListUndoAction* pPrevListAction = dynamic_cast< SfxListUndoAction* >( rOutlineUndo.GetUndoAction(1) );
+ if( !(pListAction && pPrevListAction) )
+ return;
+
+ // find the top EditUndo action in the top undo action list
+ size_t nAction = pListAction->maUndoActions.size();
+ EditUndo* pEditUndo = nullptr;
+ while( !pEditUndo && nAction )
+ {
+ pEditUndo = dynamic_cast< EditUndo* >(pListAction->GetUndoAction(--nAction));
+ }
+
+ sal_uInt16 nEditPos = nAction; // we need this later to remove the merged undo actions
+
+ // make sure it is the only EditUndo action in the top undo list
+ while( pEditUndo && nAction )
+ {
+ if( dynamic_cast< EditUndo* >(pListAction->GetUndoAction(--nAction)) )
+ pEditUndo = nullptr;
+ }
+
+ // do we have one and only one EditUndo action in the top undo list?
+ if( !pEditUndo )
+ return;
+
+ // yes, see if we can merge it with the prev undo list
+
+ nAction = pPrevListAction->maUndoActions.size();
+ EditUndo* pPrevEditUndo = nullptr;
+ while( !pPrevEditUndo && nAction )
+ pPrevEditUndo = dynamic_cast< EditUndo* >(pPrevListAction->GetUndoAction(--nAction));
+
+ if( !(pPrevEditUndo && pPrevEditUndo->Merge( pEditUndo )) )
+ return;
+
+ // ok we merged the only EditUndo of the top undo list with
+ // the top EditUndo of the previous undo list
+
+ // first remove the merged undo action
+ assert( pListAction->GetUndoAction(nEditPos) == pEditUndo &&
+ "sd::OutlineView::TryToMergeUndoActions(), wrong edit pos!" );
+ pListAction->Remove(nEditPos);
+
+ if ( !pListAction->maUndoActions.empty() )
+ {
+ // now we have to move all remaining doc undo actions from the top undo
+ // list to the previous undo list and remove the top undo list
+
+ size_t nCount = pListAction->maUndoActions.size();
+ size_t nDestAction = pPrevListAction->maUndoActions.size();
+ while( nCount-- )
+ {
+ std::unique_ptr<SfxUndoAction> pTemp = pListAction->Remove(0);
+ pPrevListAction->Insert( std::move(pTemp), nDestAction++ );
+ }
+ pPrevListAction->nCurUndoAction = pPrevListAction->maUndoActions.size();
+ }
+
+ rOutlineUndo.RemoveLastUndoAction();
+}
+
+IMPL_LINK(OutlineView, PaintingFirstLineHdl, PaintFirstLineInfo*, pInfo, void)
+{
+ if( !pInfo )
+ return;
+
+ Paragraph* pPara = mrOutliner.GetParagraph( pInfo->mnPara );
+ EditEngine& rEditEngine = const_cast< EditEngine& >( mrOutliner.GetEditEngine() );
+
+ Size aImageSize( pInfo->mpOutDev->PixelToLogic( maSlideImage.GetSizePixel() ) );
+ Size aOffset( 100, 100 );
+
+ // paint slide number
+ if( !(pPara && ::Outliner::HasParaFlag(pPara,ParaFlag::ISPAGE)) )
+ return;
+
+ ::tools::Long nPage = 0; // todo, printing??
+ for ( sal_Int32 n = 0; n <= pInfo->mnPara; n++ )
+ {
+ Paragraph* p = mrOutliner.GetParagraph( n );
+ if ( ::Outliner::HasParaFlag(p,ParaFlag::ISPAGE) )
+ nPage++;
+ }
+
+ ::tools::Long nBulletHeight = static_cast<::tools::Long>(mrOutliner.GetLineHeight( pInfo->mnPara ));
+ ::tools::Long nFontHeight = 0;
+ if ( !rEditEngine.IsFlatMode() )
+ {
+ nFontHeight = nBulletHeight / 5;
+ }
+ else
+ {
+ nFontHeight = (nBulletHeight * 10) / 25;
+ }
+
+ Size aFontSz( 0, nFontHeight );
+
+ Size aOutSize( 2000, nBulletHeight );
+
+ const float fImageHeight = (static_cast<float>(aOutSize.Height()) * float(4)) / float(7);
+ if (aImageSize.Width() != 0)
+ {
+ const float fImageRatio = static_cast<float>(aImageSize.Height()) / static_cast<float>(aImageSize.Width());
+ aImageSize.setWidth( static_cast<::tools::Long>( fImageRatio * fImageHeight ) );
+ }
+ aImageSize.setHeight( static_cast<::tools::Long>(fImageHeight) );
+
+ Point aImagePos( pInfo->mrStartPos );
+ aImagePos.AdjustX(aOutSize.Width() - aImageSize.Width() - aOffset.Width() ) ;
+ aImagePos.AdjustY((aOutSize.Height() - aImageSize.Height()) / 2 );
+
+ pInfo->mpOutDev->DrawImage( aImagePos, aImageSize, maSlideImage );
+
+ const bool bVertical = mrOutliner.IsVertical();
+ const bool bRightToLeftPara = rEditEngine.IsRightToLeft( pInfo->mnPara );
+
+ LanguageType eLang = rEditEngine.GetDefaultLanguage();
+
+ Point aTextPos( aImagePos.X() - aOffset.Width(), pInfo->mrStartPos.Y() );
+ vcl::Font aNewFont( OutputDevice::GetDefaultFont( DefaultFontType::SANS_UNICODE, eLang, GetDefaultFontFlags::NONE ) );
+ aNewFont.SetFontSize( aFontSz );
+ aNewFont.SetVertical( bVertical );
+ aNewFont.SetOrientation( Degree10(bVertical ? 2700 : 0) );
+ aNewFont.SetColor( COL_AUTO );
+ pInfo->mpOutDev->SetFont( aNewFont );
+ OUString aPageText = OUString::number( nPage );
+ Size aTextSz;
+ aTextSz.setWidth( pInfo->mpOutDev->GetTextWidth( aPageText ) );
+ aTextSz.setHeight( pInfo->mpOutDev->GetTextHeight() );
+ if ( !bVertical )
+ {
+ aTextPos.AdjustY((aOutSize.Height() - aTextSz.Height()) / 2 );
+ if ( !bRightToLeftPara )
+ {
+ aTextPos.AdjustX( -(aTextSz.Width()) );
+ }
+ else
+ {
+ aTextPos.AdjustX(aTextSz.Width() );
+ }
+ }
+ else
+ {
+ aTextPos.AdjustY( -(aTextSz.Width()) );
+ aTextPos.AdjustX(nBulletHeight / 2 );
+ }
+ pInfo->mpOutDev->DrawText( aTextPos, aPageText );
+}
+
+void OutlineView::UpdateParagraph( sal_Int32 nPara )
+{
+ SfxItemSet aNewAttrs2( mrOutliner.GetParaAttribs( nPara ) );
+ aNewAttrs2.Put( maLRSpaceItem );
+ mrOutliner.SetParaAttribs( nPara, aNewAttrs2 );
+}
+
+void OutlineView::OnBeginPasteOrDrop( PasteOrDropInfos* /*pInfo*/ )
+{
+}
+
+/** this is called after a paste or drop operation, make sure that the newly inserted paragraphs
+ get the correct style sheet and new slides are inserted. */
+void OutlineView::OnEndPasteOrDrop( PasteOrDropInfos* pInfo )
+{
+ SdPage* pPage = nullptr;
+ SfxStyleSheetBasePool* pStylePool = GetDoc().GetStyleSheetPool();
+
+ for( sal_Int32 nPara = pInfo->nStartPara; nPara <= pInfo->nEndPara; nPara++ )
+ {
+ Paragraph* pPara = mrOutliner.GetParagraph( nPara );
+
+ bool bPage = ::Outliner::HasParaFlag( pPara, ParaFlag::ISPAGE );
+
+ if( !bPage )
+ {
+ SdStyleSheet* pStyleSheet = dynamic_cast< SdStyleSheet* >( mrOutliner.GetStyleSheet( nPara ) );
+ if( pStyleSheet )
+ {
+ if ( pStyleSheet->GetApiName() == "title" )
+ bPage = true;
+ }
+ }
+
+ if( !pPara )
+ continue; // fatality!?
+
+ if( bPage && (nPara != pInfo->nStartPara) )
+ {
+ // insert new slide for this paragraph
+ pPage = InsertSlideForParagraph( pPara );
+ }
+ else
+ {
+ // newly inserted non page paragraphs get the outline style
+ if( !pPage )
+ pPage = GetPageForParagraph( pPara );
+
+ if( pPage )
+ {
+ SfxStyleSheet* pStyle = pPage->GetStyleSheetForPresObj( bPage ? PresObjKind::Title : PresObjKind::Outline );
+
+ if( !bPage )
+ {
+ const sal_Int16 nDepth = mrOutliner.GetDepth( nPara );
+ if( nDepth > 0 )
+ {
+ OUString aStyleSheetName = pStyle->GetName();
+ if (!aStyleSheetName.isEmpty())
+ aStyleSheetName = aStyleSheetName.copy(0, aStyleSheetName.getLength() - 1);
+ aStyleSheetName += OUString::number( nDepth );
+ pStyle = static_cast<SfxStyleSheet*>( pStylePool->Find( aStyleSheetName, pStyle->GetFamily() ) );
+ DBG_ASSERT( pStyle, "sd::OutlineView::OnEndPasteOrDrop(), Style not found!" );
+ }
+ }
+
+ mrOutliner.SetStyleSheet( nPara, pStyle );
+ }
+
+ UpdateParagraph( nPara );
+ }
+ }
+}
+
+
+OutlineViewModelChangeGuard::OutlineViewModelChangeGuard( OutlineView& rView )
+: mrView( rView )
+{
+ mrView.BeginModelChange();
+}
+
+OutlineViewModelChangeGuard::~OutlineViewModelChangeGuard() COVERITY_NOEXCEPT_FALSE
+{
+ mrView.EndModelChange();
+}
+
+
+OutlineViewPageChangesGuard::OutlineViewPageChangesGuard( OutlineView* pView )
+: mpView( pView )
+{
+ if( mpView )
+ mpView->IgnoreCurrentPageChanges( true );
+}
+
+OutlineViewPageChangesGuard::~OutlineViewPageChangesGuard()
+{
+ if( mpView )
+ mpView->IgnoreCurrentPageChanges( false );
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/presvish.cxx b/sd/source/ui/view/presvish.cxx
new file mode 100644
index 000000000..34a789f4d
--- /dev/null
+++ b/sd/source/ui/view/presvish.cxx
@@ -0,0 +1,172 @@
+/* -*- 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 <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+
+#include <PresentationViewShell.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/objface.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svx/svxids.hrc>
+#include <svx/ruler.hxx>
+#include <FrameView.hxx>
+#include <DrawDocShell.hxx>
+#include <slideshow.hxx>
+#include <app.hrc>
+#include <ViewShellBase.hxx>
+
+#include <fupoor.hxx>
+#include <Window.hxx>
+
+#define ShellClass_PresentationViewShell
+using namespace sd;
+#include <sdslots.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::beans;
+
+namespace sd {
+
+SFX_IMPL_INTERFACE(PresentationViewShell, DrawViewShell)
+
+void PresentationViewShell::InitInterface_Impl()
+{
+ GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_TOOLS, SfxVisibilityFlags::Standard | SfxVisibilityFlags::FullScreen | SfxVisibilityFlags::Server,
+ ToolbarId::Draw_Toolbox_Sd);
+ GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_APPLICATION, SfxVisibilityFlags::Standard | SfxVisibilityFlags::Client | SfxVisibilityFlags::Viewer | SfxVisibilityFlags::ReadonlyDoc,
+ ToolbarId::Draw_Viewer_Toolbox);
+ GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_OPTIONS, SfxVisibilityFlags::Standard | SfxVisibilityFlags::Server,
+ ToolbarId::Draw_Options_Toolbox);
+ GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_COMMONTASK, SfxVisibilityFlags::Standard | SfxVisibilityFlags::Server,
+ ToolbarId::Draw_CommonTask_Toolbox);
+}
+
+
+PresentationViewShell::PresentationViewShell( ViewShellBase& rViewShellBase, vcl::Window* pParentWindow, FrameView* pFrameView)
+ : DrawViewShell(rViewShellBase, pParentWindow, PageKind::Standard, pFrameView)
+ , mnAbortSlideShowEvent(nullptr)
+{
+ if( GetDocSh() && GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED )
+ maOldVisArea = GetDocSh()->GetVisArea( ASPECT_CONTENT );
+ meShellType = ST_PRESENTATION;
+}
+
+PresentationViewShell::~PresentationViewShell()
+{
+ if (mnAbortSlideShowEvent)
+ Application::RemoveUserEvent(mnAbortSlideShowEvent);
+
+ if( GetDocSh() && GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED && !maOldVisArea.IsEmpty() )
+ GetDocSh()->SetVisArea( maOldVisArea );
+}
+
+void PresentationViewShell::FinishInitialization( FrameView* pFrameView )
+{
+ DrawViewShell::Init(true);
+
+ // Use the frame view that comes form the view shell that initiated our
+ // creation.
+ if (pFrameView != nullptr)
+ {
+ GetFrameView()->Disconnect();
+ SetFrameView (pFrameView);
+ pFrameView->Connect();
+ }
+ SetRuler(false);
+ WriteFrameViewData();
+
+ GetActiveWindow()->GrabFocus();
+}
+
+VclPtr<SvxRuler> PresentationViewShell::CreateHRuler(::sd::Window*)
+{
+ return nullptr;
+}
+
+VclPtr<SvxRuler> PresentationViewShell::CreateVRuler(::sd::Window*)
+{
+ return nullptr;
+}
+
+IMPL_LINK_NOARG(PresentationViewShell, AbortSlideShowHdl, void*, void)
+{
+ mnAbortSlideShowEvent = nullptr;
+ rtl::Reference<SlideShow> xSlideShow(SlideShow::GetSlideShow(GetViewShellBase()));
+ if (xSlideShow.is())
+ xSlideShow->end();
+}
+
+void PresentationViewShell::Activate( bool bIsMDIActivate )
+{
+ DrawViewShell::Activate( bIsMDIActivate );
+
+ if( bIsMDIActivate )
+ {
+ SfxBoolItem aItem( SID_NAVIGATOR_INIT, true );
+
+ GetViewFrame()->GetDispatcher()->ExecuteList(SID_NAVIGATOR_INIT,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, { &aItem });
+
+ rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
+ if( xSlideShow.is() )
+ {
+ bool bSuccess = xSlideShow->activate(GetViewShellBase());
+ if (!bSuccess)
+ {
+ /* tdf#64711 PresentationViewShell is deleted by 'end' due to end closing
+ the object shell. So if we call xSlideShow->end during Activate there are
+ a lot of places in the call stack of Activate which understandable don't
+ expect this ViewShell to be deleted during use. Defer to the next event
+ loop the abort of the slideshow
+ */
+ if (!mnAbortSlideShowEvent)
+ mnAbortSlideShowEvent = Application::PostUserEvent(LINK(this, PresentationViewShell, AbortSlideShowHdl));
+ }
+ }
+
+ if( HasCurrentFunction() )
+ GetCurrentFunction()->Activate();
+
+ ReadFrameViewData(mpFrameView);
+ }
+
+ GetDocSh()->Connect( this );
+}
+
+void PresentationViewShell::Paint( const ::tools::Rectangle& /*rRect*/, ::sd::Window* )
+{
+ rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
+ if( xSlideShow.is() )
+ xSlideShow->paint();
+}
+
+void PresentationViewShell::Resize()
+{
+ ViewShell::Resize(); // do not call DrawViewShell here!
+
+ rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetViewShellBase() ) );
+ if( xSlideshow.is() )
+ xSlideshow->resize(maViewSize);
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/sdruler.cxx b/sd/source/ui/view/sdruler.cxx
new file mode 100644
index 000000000..571ffb37f
--- /dev/null
+++ b/sd/source/ui/view/sdruler.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/.
+ *
+ * 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 <Ruler.hxx>
+#include <svl/ptitem.hxx>
+#include <svx/ruler.hxx>
+#include <svx/svxids.hrc>
+#include <sfx2/ctrlitem.hxx>
+#include <sfx2/bindings.hxx>
+#include <vcl/commandevent.hxx>
+
+#include <View.hxx>
+#include <DrawViewShell.hxx>
+#include <Window.hxx>
+
+#include <helpids.h>
+
+namespace sd {
+
+/**
+ * Controller-Item for ruler
+ */
+class RulerCtrlItem : public SfxControllerItem
+{
+ Ruler &rRuler;
+
+ protected:
+ virtual void StateChangedAtToolBoxControl( sal_uInt16 nSId, SfxItemState eState,
+ const SfxPoolItem* pItem ) override;
+
+ public:
+ RulerCtrlItem(Ruler& rRlr, SfxBindings& rBind);
+};
+
+RulerCtrlItem::RulerCtrlItem(Ruler& rRlr, SfxBindings& rBind)
+: SfxControllerItem(SID_RULER_NULL_OFFSET, rBind)
+, rRuler(rRlr)
+{
+}
+
+void RulerCtrlItem::StateChangedAtToolBoxControl( sal_uInt16 nSId, SfxItemState, const SfxPoolItem* pState )
+{
+ switch( nSId )
+ {
+ case SID_RULER_NULL_OFFSET:
+ {
+ const SfxPointItem* pItem = dynamic_cast< const SfxPointItem* >(pState);
+ DBG_ASSERT(pState == nullptr || pItem != nullptr, "SfxPointItem expected");
+ if ( pItem )
+ rRuler.SetNullOffset(pItem->GetValue());
+ }
+ break;
+ }
+}
+
+Ruler::Ruler( DrawViewShell& rViewSh, vcl::Window* pParent, ::sd::Window* pWin, SvxRulerSupportFlags nRulerFlags, SfxBindings& rBindings, WinBits nWinStyle)
+ : SvxRuler(pParent, pWin, nRulerFlags, rBindings, nWinStyle)
+ , pDrViewShell(&rViewSh)
+{
+ rBindings.EnterRegistrations();
+ pCtrlItem.reset( new RulerCtrlItem(*this, rBindings) );
+ rBindings.LeaveRegistrations();
+
+ if ( nWinStyle & WB_HSCROLL )
+ {
+ bHorz = true;
+ SetHelpId( HID_SD_RULER_HORIZONTAL );
+ }
+ else
+ {
+ bHorz = false;
+ SetHelpId( HID_SD_RULER_VERTICAL );
+ }
+}
+
+Ruler::~Ruler()
+{
+ disposeOnce();
+}
+
+void Ruler::dispose()
+{
+ SfxBindings& rBindings = pCtrlItem->GetBindings();
+ rBindings.EnterRegistrations();
+ pCtrlItem.reset();
+ rBindings.LeaveRegistrations();
+ SvxRuler::dispose();
+}
+
+void Ruler::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ Point aMPos = rMEvt.GetPosPixel();
+ RulerType eType = GetRulerType(aMPos);
+
+ if ( !pDrViewShell->GetView()->IsTextEdit() &&
+ rMEvt.IsLeft() && rMEvt.GetClicks() == 1 &&
+ (eType == RulerType::DontKnow || eType == RulerType::Outside) )
+ {
+ pDrViewShell->StartRulerDrag(*this, rMEvt);
+ }
+ else
+ SvxRuler::MouseButtonDown(rMEvt);
+}
+
+void Ruler::SetNullOffset(const Point& rOffset)
+{
+ ::tools::Long nOffset;
+
+ if ( bHorz ) nOffset = rOffset.X();
+ else nOffset = rOffset.Y();
+
+ SetNullOffsetLogic(nOffset);
+}
+
+void Ruler::Command(const CommandEvent& rCEvt)
+{
+ if( rCEvt.GetCommand() == CommandEventId::ContextMenu &&
+ !pDrViewShell->GetView()->IsTextEdit() )
+ {
+ SvxRuler::Command( rCEvt );
+ }
+}
+
+void Ruler::ExtraDown()
+{
+ if( !pDrViewShell->GetView()->IsTextEdit() )
+ SvxRuler::ExtraDown();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/sdview.cxx b/sd/source/ui/view/sdview.cxx
new file mode 100644
index 000000000..f27622fd1
--- /dev/null
+++ b/sd/source/ui/view/sdview.cxx
@@ -0,0 +1,1395 @@
+/* -*- 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 <com/sun/star/embed/NoVisualAreaSizeException.hpp>
+#include <com/sun/star/embed/XEmbeddedObject.hpp>
+#include <com/sun/star/linguistic2/XSpellChecker1.hpp>
+
+#include <View.hxx>
+#include <avmedia/mediawindow.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/unolingu.hxx>
+#include <o3tl/deleter.hxx>
+#include <svx/obj3d.hxx>
+#include <svx/fmview.hxx>
+#include <editeng/outliner.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdundo.hxx>
+
+#include <vcl/settings.hxx>
+
+#include <officecfg/Office/Common.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdoutl.hxx>
+#include <svx/sdr/contact/displayinfo.hxx>
+
+#include <svx/svdetc.hxx>
+#include <editeng/editstat.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <svx/xfillit0.hxx>
+
+#include <app.hrc>
+#include <strings.hrc>
+#include <Window.hxx>
+#include <Client.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+#include <sdmod.hxx>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <unokywds.hxx>
+#include <ViewClipboard.hxx>
+#include <undo/undomanager.hxx>
+#include <svx/sdr/contact/viewobjectcontact.hxx>
+#include <svx/sdr/contact/viewcontact.hxx>
+#include <svx/svdotable.hxx>
+#include <EventMultiplexer.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShell.hxx>
+
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/color/bcolor.hxx>
+#include <drawinglayer/attribute/lineattribute.hxx>
+#include <drawinglayer/attribute/strokeattribute.hxx>
+#include <drawinglayer/primitive2d/textlayoutdevice.hxx>
+#include <drawinglayer/primitive2d/PolygonStrokePrimitive2D.hxx>
+#include <svx/sdr/contact/objectcontact.hxx>
+#include <svx/sdr/table/tablecontroller.hxx>
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <drawinglayer/primitive2d/textprimitive2d.hxx>
+#include <svx/unoapi.hxx>
+#include <basegfx/matrix/b2dhommatrixtools.hxx>
+#include <comphelper/lok.hxx>
+#include <sfx2/lokhelper.hxx>
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+#include <DrawController.hxx>
+#include <svtools/optionsdrawinglayer.hxx>
+
+#include <memory>
+#include <numeric>
+
+using namespace com::sun::star;
+using namespace com::sun::star::uno;
+using namespace sdr::table;
+namespace sd {
+
+View::View(
+ SdDrawDocument& rDrawDoc,
+ OutputDevice* pOutDev,
+ ViewShell* pViewShell)
+: FmFormView(rDrawDoc, pOutDev),
+ mrDoc(rDrawDoc),
+ mpDocSh(rDrawDoc.GetDocSh()),
+ mpViewSh(pViewShell),
+ mpDropMarkerObj(nullptr),
+ mnDragSrcPgNum(SDRPAGE_NOTFOUND),
+ mnAction(DND_ACTION_NONE),
+ maDropErrorIdle("sd View DropError"),
+ maDropInsertFileIdle("sd View DropInsertFile"),
+ mnLockRedrawSmph(0),
+ mbIsDropAllowed(true),
+ maSmartTags(*this),
+ mpClipboard (new ViewClipboard (*this))
+{
+ // #i73602# Use default from the configuration
+ SetBufferedOverlayAllowed(SvtOptionsDrawinglayer::IsOverlayBuffer_DrawImpress());
+
+ // #i74769#, #i75172# Use default from the configuration
+ SetBufferedOutputAllowed(SvtOptionsDrawinglayer::IsPaintBuffer_DrawImpress());
+
+ EnableExtendedKeyInputDispatcher(false);
+ EnableExtendedMouseEventDispatcher(false);
+
+ SetUseIncompatiblePathCreateInterface(false);
+
+ SetMinMoveDistancePixel(2);
+ SetHitTolerancePixel(2);
+ SetMeasureLayer(sUNO_LayerName_measurelines);
+
+ // Timer for delayed drop (has to be for MAC)
+ maDropErrorIdle.SetInvokeHandler( LINK(this, View, DropErrorHdl) );
+ maDropInsertFileIdle.SetInvokeHandler( LINK(this, View, DropInsertFileHdl) );
+}
+
+void View::ImplClearDrawDropMarker()
+{
+ mpDropMarker.reset();
+}
+
+View::~View()
+{
+ maSmartTags.Dispose();
+
+ // release content of selection clipboard, if we own the content
+ ClearSelectionClipboard();
+
+ if (mxDropMediaSizeListener)
+ {
+ suppress_fun_call_w_exception(mxDropMediaSizeListener->dispose());
+ mxDropMediaSizeListener.clear();
+ }
+
+ maDropErrorIdle.Stop();
+ maDropInsertFileIdle.Stop();
+
+ ImplClearDrawDropMarker();
+
+ while(PaintWindowCount())
+ {
+ // remove all registered OutDevs
+ suppress_fun_call_w_exception(DeleteWindowFromPaintView(GetFirstOutputDevice()));
+ }
+}
+
+namespace {
+
+class ViewRedirector : public sdr::contact::ViewObjectContactRedirector
+{
+public:
+ ViewRedirector();
+
+ // all default implementations just call the same methods at the original. To do something
+ // different, override the method and at least do what the method does.
+ virtual void createRedirectedPrimitive2DSequence(
+ const sdr::contact::ViewObjectContact& rOriginal,
+ const sdr::contact::DisplayInfo& rDisplayInfo,
+ drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) override;
+};
+
+}
+
+ViewRedirector::ViewRedirector()
+{
+}
+
+void ViewRedirector::createRedirectedPrimitive2DSequence(
+ const sdr::contact::ViewObjectContact& rOriginal,
+ const sdr::contact::DisplayInfo& rDisplayInfo,
+ drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor)
+{
+ SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject();
+ SdrPage* pSdrPage = pObject ? pObject->getSdrPageFromSdrObject() : nullptr;
+ if(!pObject || !pSdrPage)
+ {
+ // not a SdrObject visualisation (maybe e.g. page) or no page
+ sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo, rVisitor);
+ return;
+ }
+
+ const bool bDoCreateGeometry(pSdrPage->checkVisibility( rOriginal, rDisplayInfo, true ));
+
+ if(!bDoCreateGeometry &&
+ (( pObject->GetObjInventor() != SdrInventor::Default ) || ( pObject->GetObjIdentifier() != SdrObjKind::Page )) )
+ return;
+
+ PresObjKind eKind(PresObjKind::NONE);
+ const bool bSubContentProcessing(rDisplayInfo.GetSubContentActive());
+ const bool bIsMasterPageObject(pSdrPage->IsMasterPage());
+ const bool bIsPrinting(rOriginal.GetObjectContact().isOutputToPrinter());
+ const SdrPageView* pPageView = rOriginal.GetObjectContact().TryToGetSdrPageView();
+ const SdrPage* pVisualizedPage = GetSdrPageFromXDrawPage(rOriginal.GetObjectContact().getViewInformation2D().getVisualizedPage());
+ const SdPage* pObjectsSdPage = dynamic_cast< SdPage* >(pSdrPage);
+ const bool bIsInsidePageObj(pPageView && pPageView->GetPage() != pVisualizedPage);
+
+ // check if we need to draw a placeholder border. Never do it for
+ // objects inside a SdrPageObj and never when printing
+ if(!bIsInsidePageObj && !bIsPrinting)
+ {
+ bool bCreateOutline(false);
+
+ if( pObject->IsEmptyPresObj() && dynamic_cast< SdrTextObj *>( pObject ) != nullptr )
+ {
+ if( !bSubContentProcessing || !pObject->IsNotVisibleAsMaster() )
+ {
+ eKind = pObjectsSdPage ? pObjectsSdPage->GetPresObjKind(pObject) : PresObjKind::NONE;
+ bCreateOutline = true;
+ }
+ }
+ else if( ( pObject->GetObjInventor() == SdrInventor::Default ) && ( pObject->GetObjIdentifier() == SdrObjKind::Text ) )
+ {
+ if( pObjectsSdPage )
+ {
+ eKind = pObjectsSdPage->GetPresObjKind(pObject);
+
+ if((eKind == PresObjKind::Footer) || (eKind == PresObjKind::Header) || (eKind == PresObjKind::DateTime) || (eKind == PresObjKind::SlideNumber) )
+ {
+ if( !bSubContentProcessing )
+ {
+ // only draw a boundary for header&footer objects on the masterpage itself
+ bCreateOutline = true;
+ }
+ }
+ }
+ }
+ else if( ( pObject->GetObjInventor() == SdrInventor::Default ) && ( pObject->GetObjIdentifier() == SdrObjKind::Page ) )
+ {
+ // only for handout page, else this frame will be created for each
+ // page preview object in SlideSorter and PagePane
+ if(pObjectsSdPage && PageKind::Handout == pObjectsSdPage->GetPageKind())
+ {
+ bCreateOutline = true;
+ }
+ }
+
+ if(bCreateOutline)
+ {
+ // empty presentation objects get a gray frame
+ const svtools::ColorConfig aColorConfig;
+ const svtools::ColorConfigValue aColor( aColorConfig.GetColorValue( svtools::OBJECTBOUNDARIES ) );
+
+ if( aColor.bIsVisible )
+ {
+ // get basic object transformation
+ const basegfx::BColor aRGBColor(aColor.nColor.getBColor());
+ basegfx::B2DHomMatrix aObjectMatrix;
+ basegfx::B2DPolyPolygon aObjectPolyPolygon;
+ pObject->TRGetBaseGeometry(aObjectMatrix, aObjectPolyPolygon);
+
+ // create dashed border
+ {
+ // create object polygon
+ basegfx::B2DPolygon aPolygon(basegfx::utils::createUnitPolygon());
+ aPolygon.transform(aObjectMatrix);
+
+ // create line and stroke attribute
+ ::std::vector< double > aDotDashArray { 160.0, 80.0 };
+
+ const double fFullDotDashLen(::std::accumulate(aDotDashArray.begin(), aDotDashArray.end(), 0.0));
+ const drawinglayer::attribute::LineAttribute aLine(aRGBColor);
+ const drawinglayer::attribute::StrokeAttribute aStroke(std::move(aDotDashArray), fFullDotDashLen);
+
+ // create primitive and add
+ const drawinglayer::primitive2d::Primitive2DReference xRef(new drawinglayer::primitive2d::PolygonStrokePrimitive2D(
+ aPolygon,
+ aLine,
+ aStroke));
+ rVisitor.visit(xRef);
+ }
+
+ // now paint the placeholder description, but only when masterpage
+ // is displayed as page directly (MasterPage view)
+ if(!bSubContentProcessing && bIsMasterPageObject)
+ {
+ OUString aObjectString;
+
+ switch( eKind )
+ {
+ case PresObjKind::Title:
+ {
+ if(pObjectsSdPage && pObjectsSdPage->GetPageKind() == PageKind::Standard)
+ {
+ static OUString aTitleAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_TITLE));
+ aObjectString = aTitleAreaStr;
+ }
+
+ break;
+ }
+ case PresObjKind::Outline:
+ {
+ static OUString aOutlineAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_OUTLINE));
+ aObjectString = aOutlineAreaStr;
+ break;
+ }
+ case PresObjKind::Footer:
+ {
+ static OUString aFooterAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_FOOTER));
+ aObjectString = aFooterAreaStr;
+ break;
+ }
+ case PresObjKind::Header:
+ {
+ static OUString aHeaderAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_HEADER));
+ aObjectString = aHeaderAreaStr;
+ break;
+ }
+ case PresObjKind::DateTime:
+ {
+ static OUString aDateTimeStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_DATETIME));
+ aObjectString = aDateTimeStr;
+ break;
+ }
+ case PresObjKind::Notes:
+ {
+ static OUString aDateTimeStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_NOTES));
+ aObjectString = aDateTimeStr;
+ break;
+ }
+ case PresObjKind::SlideNumber:
+ {
+ if(pObjectsSdPage && pObjectsSdPage->GetPageKind() == PageKind::Standard)
+ {
+ static OUString aSlideAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_SLIDE));
+ aObjectString = aSlideAreaStr;
+ }
+ else
+ {
+ static OUString aNumberAreaStr(SdResId(STR_PLACEHOLDER_DESCRIPTION_NUMBER));
+ aObjectString = aNumberAreaStr;
+ }
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ if( !aObjectString.isEmpty() )
+ {
+ // decompose object matrix to be able to place text correctly
+ basegfx::B2DTuple aScale;
+ basegfx::B2DTuple aTranslate;
+ double fRotate, fShearX;
+ aObjectMatrix.decompose(aScale, aTranslate, fRotate, fShearX);
+
+ // create font
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObject );
+ const SdrTextVertAdjust eTVA(pTextObj ? pTextObj->GetTextVerticalAdjust() : SDRTEXTVERTADJUST_CENTER);
+ vcl::Font aScaledVclFont;
+
+ // use a text size factor to get more reliable text sizes from the text layouter
+ // (and from vcl), tipp from HDU
+ static const sal_uInt32 nTextSizeFactor(100);
+
+ // use a factor to get more linear text size calculations
+ aScaledVclFont.SetFontHeight( 500 * nTextSizeFactor );
+
+ // get basic geometry and get text size
+ drawinglayer::primitive2d::TextLayouterDevice aTextLayouter;
+ aTextLayouter.setFont(aScaledVclFont);
+ const sal_Int32 nTextLength(aObjectString.getLength());
+
+ // do not forget to use the factor again to get the width for the 500
+ const double fTextWidth(aTextLayouter.getTextWidth(aObjectString, 0, nTextLength) * (1.0 / nTextSizeFactor));
+ const double fTextHeight(aTextLayouter.getTextHeight() * (1.0 / nTextSizeFactor));
+
+ // calculate text primitive position. If text is at bottom, use top for
+ // the extra text and vice versa
+ const double fHorDist(125);
+ const double fVerDist(125);
+ const double fPosX((aTranslate.getX() + aScale.getX()) - fTextWidth - fHorDist);
+ const double fPosY((SDRTEXTVERTADJUST_BOTTOM == eTVA)
+ ? aTranslate.getY() - fVerDist + fTextHeight
+ : (aTranslate.getY() + aScale.getY()) - fVerDist);
+
+ // get font attributes; use normally scaled font
+ vcl::Font aVclFont;
+ basegfx::B2DVector aTextSizeAttribute;
+
+ aVclFont.SetFontHeight( 500 );
+
+ const drawinglayer::attribute::FontAttribute aFontAttribute(
+ drawinglayer::primitive2d::getFontAttributeFromVclFont(
+ aTextSizeAttribute,
+ aVclFont,
+ false,
+ false));
+
+ // fill text matrix
+ const basegfx::B2DHomMatrix aTextMatrix(basegfx::utils::createScaleShearXRotateTranslateB2DHomMatrix(
+ aTextSizeAttribute.getX(), aTextSizeAttribute.getY(),
+ fShearX,
+ fRotate,
+ fPosX, fPosY));
+
+ // create DXTextArray (can be empty one)
+ ::std::vector< double > aDXArray{};
+
+ // create locale; this may need some more information in the future
+ const css::lang::Locale aLocale;
+
+ // create primitive and add
+ const drawinglayer::primitive2d::Primitive2DReference xRef(
+ new drawinglayer::primitive2d::TextSimplePortionPrimitive2D(
+ aTextMatrix,
+ aObjectString,
+ 0,
+ nTextLength,
+ std::move(aDXArray),
+ aFontAttribute,
+ aLocale,
+ aRGBColor));
+ rVisitor.visit(xRef);
+ }
+ }
+ }
+ }
+ }
+
+ if(bDoCreateGeometry)
+ {
+ sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(
+ rOriginal,
+ rDisplayInfo, rVisitor);
+ }
+}
+
+namespace
+{
+ void setOutlinerBgFromPage(::Outliner& rOutl, SdrPageView& rPgView, bool bScreenDisplay)
+ {
+ SdPage* pPage = static_cast<SdPage*>(rPgView.GetPage());
+ if (pPage)
+ {
+ // #i75566# Name change GetBackgroundColor -> GetPageBackgroundColor and
+ // hint value if screen display. Only then the AutoColor mechanisms shall be applied
+ rOutl.SetBackgroundColor(pPage->GetPageBackgroundColor(&rPgView, bScreenDisplay));
+ }
+ }
+}
+
+/**
+ * The event will be forwarded to the View
+ */
+void View::CompleteRedraw(OutputDevice* pOutDev, const vcl::Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector /*=0*/)
+{
+ // execute ??
+ if (mnLockRedrawSmph != 0)
+ return;
+
+ SdrPageView* pPgView = GetSdrPageView();
+
+ if (pPgView)
+ {
+ SdPage* pPage = static_cast<SdPage*>( pPgView->GetPage() );
+ if( pPage )
+ {
+ SdrOutliner& rOutl = mrDoc.GetDrawOutliner();
+ bool bScreenDisplay(true);
+
+ // #i75566# printing; suppress AutoColor BackgroundColor generation
+ // for visibility reasons by giving GetPageBackgroundColor()
+ // the needed hint
+ // #i75566# PDF export; suppress AutoColor BackgroundColor generation (see printing)
+ if (pOutDev && ((OUTDEV_PRINTER == pOutDev->GetOutDevType())
+ || (OUTDEV_PDF == pOutDev->GetOutDevType())))
+ bScreenDisplay = false;
+
+ setOutlinerBgFromPage(rOutl, *pPgView, bScreenDisplay);
+ }
+ }
+
+ ViewRedirector aViewRedirector;
+ FmFormView::CompleteRedraw(pOutDev, rReg, pRedirector ? pRedirector : &aViewRedirector);
+}
+
+void View::MarkListHasChanged()
+{
+ FmFormView::MarkListHasChanged();
+
+ if( GetMarkedObjectCount() > 0 )
+ maSmartTags.deselect();
+}
+
+bool View::SetAttributes(const SfxItemSet& rSet, bool bReplaceAll, bool /*bSlide*/, bool /*bMaster*/)
+{
+ bool bOk = FmFormView::SetAttributes(rSet, bReplaceAll);
+ return bOk;
+}
+
+void View::GetAttributes( SfxItemSet& rTargetSet, bool bOnlyHardAttr ) const
+{
+ FmFormView::GetAttributes( rTargetSet, bOnlyHardAttr );
+}
+
+/**
+ * Is a presentation object selected?
+ */
+bool View::IsPresObjSelected(bool bOnPage, bool bOnMasterPage, bool bCheckPresObjListOnly, bool bCheckLayoutOnly) const
+{
+ SdrMarkList* pMarkList;
+
+ if (mnDragSrcPgNum != SDRPAGE_NOTFOUND &&
+ mnDragSrcPgNum != GetSdrPageView()->GetPage()->GetPageNum())
+ {
+ /* Drag&Drop is in progress
+ Source and destination page are different:
+ we use the saved mark list */
+ pMarkList = mpDragSrcMarkList.get();
+ }
+ else
+ {
+ // We use the current mark list
+ pMarkList = new SdrMarkList(GetMarkedObjectList());
+ }
+
+ SdrMark* pMark;
+ SdPage* pPage;
+
+ bool bSelected = false;
+ bool bMasterPage = false;
+
+ for (size_t nMark = pMarkList->GetMarkCount(); nMark && !bSelected; )
+ {
+ --nMark;
+ // Backwards through mark list
+ pMark = pMarkList->GetMark(nMark);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+
+ if ( pObj && ( bCheckPresObjListOnly || pObj->IsEmptyPresObj() || pObj->GetUserCall() ) )
+ {
+ pPage = static_cast<SdPage*>( pObj->getSdrPageFromSdrObject() );
+ bMasterPage = pPage && pPage->IsMasterPage();
+
+ if ( (bMasterPage && bOnMasterPage) || (!bMasterPage && bOnPage) )
+ {
+ if ( pPage && pPage->IsPresObj(pObj) )
+ {
+ if( bCheckLayoutOnly )
+ {
+ PresObjKind eKind = pPage->GetPresObjKind(pObj);
+
+ if((eKind != PresObjKind::Footer) && (eKind != PresObjKind::Header) && (eKind != PresObjKind::DateTime) && (eKind != PresObjKind::SlideNumber) )
+ bSelected = true;
+ }
+ else
+ {
+ bSelected = true;
+ }
+ }
+ }
+ }
+ }
+
+ if (pMarkList != mpDragSrcMarkList.get())
+ {
+ delete pMarkList;
+ }
+
+ return bSelected;
+}
+
+void View::SelectAll()
+{
+ if ( IsTextEdit() )
+ {
+ OutlinerView* pOLV = GetTextEditOutlinerView();
+ const ::Outliner* pOutliner = GetTextEditOutliner();
+ pOLV->SelectRange( 0, pOutliner->GetParagraphCount() );
+ }
+ else
+ {
+ MarkAll();
+ }
+}
+
+bool View::SetStyleSheet(SfxStyleSheet* pStyleSheet, bool bDontRemoveHardAttr)
+{
+ // forward to SdrView
+ FmFormView::SetStyleSheet(pStyleSheet, bDontRemoveHardAttr);
+ return true;
+}
+
+/**
+ * Start text input
+ */
+static void SetSpellOptions( const SdDrawDocument& rDoc, EEControlBits& rCntrl )
+{
+ bool bOnlineSpell = rDoc.GetOnlineSpell();
+
+ if( bOnlineSpell )
+ rCntrl |= EEControlBits::ONLINESPELLING;
+ else
+ rCntrl &= ~EEControlBits::ONLINESPELLING;
+}
+
+void OutlinerMasterViewFilter::Start(SdrOutliner *pOutl)
+{
+ m_pOutl = pOutl;
+ OutlinerView* pOutlView = m_pOutl->GetView(0);
+ m_bReadOnly = pOutlView->IsReadOnly();
+ pOutlView->SetReadOnly(true);
+}
+
+void OutlinerMasterViewFilter::End()
+{
+ if (m_pOutl)
+ {
+ OutlinerView* pOutlView = m_pOutl->GetView(0);
+ pOutlView->SetReadOnly(m_bReadOnly);
+ m_pOutl = nullptr;
+ }
+}
+
+SfxViewShell* View::GetSfxViewShell() const
+{
+ SfxViewShell* pRet = nullptr;
+
+ if (mpViewSh)
+ pRet = &mpViewSh->GetViewShellBase();
+
+ return pRet;
+}
+
+// Create a new view-local UndoManager manager for Impress/Draw
+std::unique_ptr<SdrUndoManager> View::createLocalTextUndoManager()
+{
+ std::unique_ptr<SdrUndoManager> pUndoManager(new sd::UndoManager);
+ pUndoManager->SetDocShell(mpDocSh);
+ return pUndoManager;
+}
+
+bool View::SdrBeginTextEdit(
+ SdrObject* pObj, SdrPageView* pPV, vcl::Window* pWin,
+ bool bIsNewObj,
+ SdrOutliner* pOutl, OutlinerView* pGivenOutlinerView,
+ bool bDontDeleteOutliner, bool bOnlyOneView, bool bGrabFocus )
+{
+ SdrPage* pPage = pObj ? pObj->getSdrPageFromSdrObject() : nullptr;
+ bool bMasterPage = pPage && pPage->IsMasterPage();
+
+ GetViewShell()->GetViewShellBase().GetEventMultiplexer()->MultiplexEvent(
+ EventMultiplexerEventId::BeginTextEdit, static_cast<void*>(pObj) );
+
+ if( pOutl==nullptr && pObj )
+ pOutl = SdrMakeOutliner(OutlinerMode::TextObject, pObj->getSdrModelFromSdrObject()).release();
+
+ // make draw&impress specific initialisations
+ if( pOutl )
+ {
+ pOutl->SetStyleSheetPool(static_cast<SfxStyleSheetPool*>( mrDoc.GetStyleSheetPool() ));
+ pOutl->SetCalcFieldValueHdl(LINK(SD_MOD(), SdModule, CalcFieldValueHdl));
+ EEControlBits nCntrl = pOutl->GetControlWord();
+ nCntrl |= EEControlBits::ALLOWBIGOBJS;
+ nCntrl |= EEControlBits::MARKFIELDS;
+ nCntrl |= EEControlBits::AUTOCORRECT;
+
+ nCntrl &= ~EEControlBits::ULSPACESUMMATION;
+ if ( mrDoc.IsSummationOfParagraphs() )
+ nCntrl |= EEControlBits::ULSPACESUMMATION;
+
+ SetSpellOptions( mrDoc, nCntrl );
+
+ pOutl->SetControlWord(nCntrl);
+
+ Reference< linguistic2::XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() );
+ if ( xSpellChecker.is() )
+ pOutl->SetSpeller( xSpellChecker );
+
+ Reference< linguistic2::XHyphenator > xHyphenator( LinguMgr::GetHyphenator() );
+ if( xHyphenator.is() )
+ pOutl->SetHyphenator( xHyphenator );
+
+ pOutl->SetDefaultLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() );
+ }
+
+ bool bReturn = FmFormView::SdrBeginTextEdit(
+ pObj, pPV, pWin, bIsNewObj, pOutl,
+ pGivenOutlinerView, bDontDeleteOutliner,
+ bOnlyOneView, bGrabFocus);
+
+ if ( mpViewSh )
+ {
+ mpViewSh->GetViewShellBase().GetDrawController().FireSelectionChangeListener();
+
+ if (pObj && pObj->GetObjIdentifier() == SdrObjKind::Table)
+ mpViewSh->UpdateScrollBars();
+
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ if (OutlinerView* pView = GetTextEditOutlinerView())
+ {
+ ::tools::Rectangle aRectangle = pView->GetOutputArea();
+ if (pWin && pWin->GetMapMode().GetMapUnit() == MapUnit::Map100thMM)
+ {
+ aRectangle = o3tl::convert(aRectangle, o3tl::Length::mm100, o3tl::Length::twip);
+ }
+ OString sRectangle = aRectangle.toString();
+ SfxLokHelper::notifyOtherViews(&mpViewSh->GetViewShellBase(), LOK_CALLBACK_VIEW_LOCK, "rectangle", sRectangle);
+ }
+ }
+ }
+
+ if (::Outliner* pOL = bReturn ? GetTextEditOutliner() : nullptr)
+ {
+ if (pObj)
+ {
+ if( pObj->GetObjInventor() == SdrInventor::Default && pObj->GetObjIdentifier() == SdrObjKind::Table )
+ {
+ Color aBackground = GetTextEditBackgroundColor(*this);
+ pOL->SetBackgroundColor( aBackground );
+ }
+ else
+ {
+ // tdf#148140 Set the background to determine autocolor.
+ // Use any explicit bg with fallback to underlying page if
+ // none found
+ if (!pObj->setSuitableOutlinerBg(*pOL) && pPV)
+ setOutlinerBgFromPage(*pOL, *pPV, true);
+ }
+ }
+
+ pOL->SetParaInsertedHdl(LINK(this, View, OnParagraphInsertedHdl));
+ pOL->SetParaRemovingHdl(LINK(this, View, OnParagraphRemovingHdl));
+ }
+
+ if (bMasterPage && bReturn && pOutl)
+ {
+ const SdrTextObj* pTextObj = pOutl->GetTextObj();
+ const SdPage* pSdPage = pTextObj ? static_cast<const SdPage*>(pTextObj->getSdrPageFromSdrObject()) : nullptr;
+ const PresObjKind eKind = pSdPage ? pSdPage->GetPresObjKind(const_cast<SdrTextObj*>(pTextObj)) : PresObjKind::NONE;
+ switch (eKind)
+ {
+ case PresObjKind::Title:
+ case PresObjKind::Outline:
+ case PresObjKind::Text:
+ maMasterViewFilter.Start(pOutl);
+ break;
+ default:
+ break;
+ }
+ }
+
+ return bReturn;
+}
+
+/** ends current text editing */
+SdrEndTextEditKind View::SdrEndTextEdit(bool bDontDeleteReally)
+{
+ maMasterViewFilter.End();
+
+ ::tools::WeakReference<SdrTextObj> xObj( GetTextEditObject() );
+
+ bool bDefaultTextRestored = RestoreDefaultText( xObj.get() );
+
+ SdrEndTextEditKind eKind = FmFormView::SdrEndTextEdit(bDontDeleteReally);
+
+ if( bDefaultTextRestored )
+ {
+ if( xObj.is() && !xObj->IsEmptyPresObj() )
+ {
+ xObj->SetEmptyPresObj( true );
+ }
+ else
+ {
+ eKind = SdrEndTextEditKind::Unchanged;
+ }
+ }
+ else if( xObj.is() && xObj->IsEmptyPresObj() )
+ {
+ SdrTextObj* pObj = xObj.get();
+ if( pObj && pObj->HasText() )
+ {
+ SdrPage* pPage = pObj->getSdrPageFromSdrObject();
+ if( !pPage || !pPage->IsMasterPage() )
+ pObj->SetEmptyPresObj( false );
+ }
+ }
+
+ GetViewShell()->GetViewShellBase().GetEventMultiplexer()->MultiplexEvent(
+ EventMultiplexerEventId::EndTextEdit,
+ static_cast<void*>(xObj.get()) );
+
+ if( xObj.is() )
+ {
+ if ( mpViewSh )
+ {
+ mpViewSh->GetViewShellBase().GetDrawController().FireSelectionChangeListener();
+
+ if (comphelper::LibreOfficeKit::isActive())
+ SfxLokHelper::notifyOtherViews(&mpViewSh->GetViewShellBase(), LOK_CALLBACK_VIEW_LOCK, "rectangle", "EMPTY");
+
+ }
+
+ SdPage* pPage = dynamic_cast< SdPage* >( xObj->getSdrPageFromSdrObject() );
+ if( pPage )
+ pPage->onEndTextEdit( xObj.get() );
+ }
+
+ return eKind;
+}
+
+/** restores the default text if the given text object is currently in edit mode and
+ no text has been entered already. Is only useful just before text edit ends. */
+bool View::RestoreDefaultText( SdrTextObj* pTextObj )
+{
+ bool bRestored = false;
+
+ if( pTextObj && (pTextObj == GetTextEditObject()) )
+ {
+ if( !pTextObj->HasText() )
+ {
+ SdPage* pPage = dynamic_cast< SdPage* >( pTextObj->getSdrPageFromSdrObject() );
+
+ if(pPage)
+ {
+ bRestored = pPage->RestoreDefaultText( pTextObj );
+ if( bRestored )
+ {
+ SdrOutliner* pOutliner = GetTextEditOutliner();
+ pTextObj->SetTextEditOutliner( pOutliner );
+ OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject();
+ if (pOutliner)
+ pOutliner->SetText(*pParaObj);
+ }
+ }
+ }
+ }
+
+ return bRestored;
+}
+
+/**
+ * Sets the original size of the marked objects.
+ */
+void View::SetMarkedOriginalSize()
+{
+ std::unique_ptr<SdrUndoGroup> pUndoGroup(new SdrUndoGroup(mrDoc));
+ const size_t nCount = GetMarkedObjectCount();
+ bool bOK = false;
+
+ for( size_t i = 0; i < nCount; ++i )
+ {
+ SdrObject* pObj = GetMarkedObjectByIndex(i);
+
+ if( pObj->GetObjInventor() == SdrInventor::Default )
+ {
+ if( pObj->GetObjIdentifier() == SdrObjKind::OLE2 )
+ {
+ uno::Reference < embed::XEmbeddedObject > xObj = static_cast<SdrOle2Obj*>(pObj)->GetObjRef();
+ if( xObj.is() )
+ {
+ // TODO/LEAN: working with VisualArea can switch object to running state
+
+ sal_Int64 nAspect = static_cast<SdrOle2Obj*>(pObj)->GetAspect();
+ Size aOleSize;
+
+ if ( nAspect == embed::Aspects::MSOLE_ICON )
+ {
+ MapMode aMap100( MapUnit::Map100thMM );
+ aOleSize = static_cast<SdrOle2Obj*>(pObj)->GetOrigObjSize( &aMap100 );
+ bOK = true;
+ }
+ else
+ {
+ MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
+ try
+ {
+ awt::Size aSz = xObj->getVisualAreaSize( nAspect );
+ aOleSize = OutputDevice::LogicToLogic(Size(aSz.Width, aSz.Height), MapMode(aUnit), MapMode(MapUnit::Map100thMM));
+ bOK = true;
+ }
+ catch( embed::NoVisualAreaSizeException& )
+ {}
+ }
+
+ if ( bOK )
+ {
+ ::tools::Rectangle aDrawRect( pObj->GetLogicRect() );
+
+ pUndoGroup->AddAction( mrDoc.GetSdrUndoFactory().CreateUndoGeoObject( *pObj ) );
+ pObj->Resize( aDrawRect.TopLeft(), Fraction( aOleSize.Width(), aDrawRect.GetWidth() ),
+ Fraction( aOleSize.Height(), aDrawRect.GetHeight() ) );
+ }
+ }
+ }
+ else if( pObj->GetObjIdentifier() == SdrObjKind::Graphic )
+ {
+ const SdrGrafObj* pSdrGrafObj = static_cast< const SdrGrafObj* >(pObj);
+ const Size aSize = pSdrGrafObj->getOriginalSize( );
+ pUndoGroup->AddAction( GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj ) );
+ ::tools::Rectangle aRect( pObj->GetLogicRect() );
+ aRect.SetSize( aSize );
+ pObj->SetLogicRect( aRect );
+ bOK = true;
+ }
+ }
+ }
+
+ if( bOK )
+ {
+ pUndoGroup->SetComment(SdResId(STR_UNDO_ORIGINALSIZE));
+ mpDocSh->GetUndoManager()->AddUndoAction(std::move(pUndoGroup));
+ }
+}
+
+/**
+ * Connect OLE object to client.
+ */
+void View::DoConnect(SdrOle2Obj* pObj)
+{
+ if (!mpViewSh)
+ return;
+
+ uno::Reference < embed::XEmbeddedObject > xObj( pObj->GetObjRef() );
+ if( !xObj.is() )
+ return;
+
+ ::sd::Window* pWindow = mpViewSh->GetActiveWindow();
+ SfxInPlaceClient* pSdClient = mpViewSh-> GetViewShellBase().FindIPClient( xObj, pWindow );
+ if ( pSdClient )
+ return;
+
+ pSdClient = new Client(pObj, mpViewSh, pWindow);
+ ::tools::Rectangle aRect = pObj->GetLogicRect();
+ {
+ // TODO/LEAN: working with visual area can switch object to running state
+ Size aDrawSize = aRect.GetSize();
+
+ MapMode aMapMode( mrDoc.GetScaleUnit() );
+ Size aObjAreaSize = pObj->GetOrigObjSize( &aMapMode );
+
+ Fraction aScaleWidth (aDrawSize.Width(), aObjAreaSize.Width() );
+ Fraction aScaleHeight(aDrawSize.Height(), aObjAreaSize.Height() );
+ aScaleWidth.ReduceInaccurate(10); // compatible to SdrOle2Obj
+ aScaleHeight.ReduceInaccurate(10);
+ pSdClient->SetSizeScale(aScaleWidth, aScaleHeight);
+
+ // visible area is only changed in-place!
+ // the object area must be set after the scaling, since it triggers resize
+ aRect.SetSize(aObjAreaSize);
+ pSdClient->SetObjArea(aRect);
+ }
+}
+
+bool View::IsMorphingAllowed() const
+{
+ const SdrMarkList& rMarkList = GetMarkedObjectList();
+ bool bRet = false;
+
+ if ( rMarkList.GetMarkCount() == 2 )
+ {
+ const SdrObject* pObj1 = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
+ const SdrObject* pObj2 = rMarkList.GetMark( 1 )->GetMarkedSdrObj();
+ const SdrObjKind nKind1 = pObj1->GetObjIdentifier();
+ const SdrObjKind nKind2 = pObj2->GetObjIdentifier();
+
+ if ( ( nKind1 != SdrObjKind::Text && nKind2 != SdrObjKind::Text ) &&
+ ( nKind1 != SdrObjKind::TitleText && nKind2 != SdrObjKind::TitleText ) &&
+ ( nKind1 != SdrObjKind::OutlineText && nKind2 != SdrObjKind::OutlineText ) &&
+ ( nKind1 != SdrObjKind::Group && nKind2 != SdrObjKind::Group ) &&
+ ( nKind1 != SdrObjKind::Line && nKind2 != SdrObjKind::Line ) &&
+ ( nKind1 != SdrObjKind::PolyLine && nKind2 != SdrObjKind::PolyLine ) &&
+ ( nKind1 != SdrObjKind::PathLine && nKind2 != SdrObjKind::PathLine ) &&
+ ( nKind1 != SdrObjKind::FreehandLine && nKind2 != SdrObjKind::FreehandLine ) &&
+ ( nKind1 != SdrObjKind::PathPolyLine && nKind2 != SdrObjKind::PathPolyLine ) &&
+ ( nKind1 != SdrObjKind::Measure && nKind2 != SdrObjKind::Measure ) &&
+ ( nKind1 != SdrObjKind::Edge && nKind2 != SdrObjKind::Edge ) &&
+ ( nKind1 != SdrObjKind::Graphic && nKind2 != SdrObjKind::Graphic ) &&
+ ( nKind1 != SdrObjKind::OLE2 && nKind2 != SdrObjKind::OLE2 ) &&
+ ( nKind1 != SdrObjKind::Caption && nKind2 != SdrObjKind::Caption ) &&
+ dynamic_cast< const E3dObject *>( pObj1 ) == nullptr && dynamic_cast< const E3dObject *>( pObj2 ) == nullptr )
+ {
+ SfxItemSetFixed<XATTR_FILLSTYLE, XATTR_FILLSTYLE> aSet1( mrDoc.GetPool() );
+ SfxItemSetFixed<XATTR_FILLSTYLE, XATTR_FILLSTYLE> aSet2( mrDoc.GetPool() );
+
+ aSet1.Put(pObj1->GetMergedItemSet());
+ aSet2.Put(pObj2->GetMergedItemSet());
+
+ const drawing::FillStyle eFillStyle1 = aSet1.Get( XATTR_FILLSTYLE ).GetValue();
+ const drawing::FillStyle eFillStyle2 = aSet2.Get( XATTR_FILLSTYLE ).GetValue();
+
+ if( ( eFillStyle1 == drawing::FillStyle_NONE || eFillStyle1 == drawing::FillStyle_SOLID ) &&
+ ( eFillStyle2 == drawing::FillStyle_NONE || eFillStyle2 == drawing::FillStyle_SOLID ) )
+ bRet = true;
+ }
+ }
+
+ return bRet;
+}
+
+bool View::IsVectorizeAllowed() const
+{
+ const SdrMarkList& rMarkList = GetMarkedObjectList();
+ bool bRet = false;
+
+ if( rMarkList.GetMarkCount() == 1 )
+ {
+ const SdrGrafObj* pObj = dynamic_cast< const SdrGrafObj* >(rMarkList.GetMark( 0 )->GetMarkedSdrObj());
+
+ if(pObj)
+ {
+ if(GraphicType::Bitmap == pObj->GetGraphicType() && !pObj->isEmbeddedVectorGraphicData())
+ {
+ bRet = true;
+ }
+ }
+ }
+
+ return bRet;
+}
+
+void View::onAccessibilityOptionsChanged()
+{
+ if( !mpViewSh )
+ return;
+
+ ::sd::Window* pWindow = mpViewSh->GetActiveWindow();
+ if( !pWindow )
+ return;
+
+ const StyleSettings& rStyleSettings = pWindow->GetSettings().GetStyleSettings();
+
+ if( mpViewSh->GetViewFrame() && mpViewSh->GetViewFrame()->GetDispatcher() )
+ {
+ sal_uInt16 nOutputSlot, nPreviewSlot;
+
+ if( rStyleSettings.GetHighContrastMode() )
+ {
+ nOutputSlot = SID_OUTPUT_QUALITY_CONTRAST;
+ }
+ else
+ {
+ nOutputSlot = SID_OUTPUT_QUALITY_COLOR;
+ }
+
+ if( rStyleSettings.GetHighContrastMode()
+ && officecfg::Office::Common::Accessibility::IsForPagePreviews::get() )
+ {
+ nPreviewSlot = SID_PREVIEW_QUALITY_CONTRAST;
+ }
+ else
+ {
+ nPreviewSlot = SID_PREVIEW_QUALITY_COLOR;
+ }
+
+ mpViewSh->GetViewFrame()->GetDispatcher()->Execute( nOutputSlot, SfxCallMode::ASYNCHRON );
+ mpViewSh->GetViewFrame()->GetDispatcher()->Execute( nPreviewSlot, SfxCallMode::ASYNCHRON );
+ }
+
+ mpViewSh->Invalidate();
+}
+
+IMPL_LINK( View, OnParagraphInsertedHdl, ::Outliner::ParagraphHdlParam, aParam, void )
+{
+ SdrObject* pObj = GetTextEditObject();
+
+ if( aParam.pPara && pObj )
+ {
+ SdPage* pPage = dynamic_cast< SdPage* >( pObj->getSdrPageFromSdrObject() );
+ if( pPage )
+ pPage->onParagraphInserted( aParam.pOutliner, aParam.pPara, pObj );
+ }
+}
+
+/**
+ * Handler for the deletion of the pages (paragraphs).
+ */
+IMPL_LINK( View, OnParagraphRemovingHdl, ::Outliner::ParagraphHdlParam, aParam, void )
+{
+ SdrObject* pObj = GetTextEditObject();
+
+ if( aParam.pPara && pObj )
+ {
+ SdPage* pPage = dynamic_cast< SdPage* >( pObj->getSdrPageFromSdrObject() );
+ if( pPage )
+ pPage->onParagraphRemoving( aParam.pOutliner, aParam.pPara, pObj );
+ }
+}
+
+bool View::isRecordingUndo() const
+{
+ if( mrDoc.IsUndoEnabled() )
+ {
+ sd::UndoManager* pUndoManager = mrDoc.GetUndoManager();
+ return pUndoManager && pUndoManager->IsInListAction();
+ }
+ else
+ {
+ return false;
+ }
+}
+
+void View::AddCustomHdl()
+{
+ maSmartTags.addCustomHandles( maHdlList );
+}
+
+void View::updateHandles()
+{
+ AdjustMarkHdl();
+}
+
+SdrViewContext View::GetContext() const
+{
+ SdrViewContext eContext = SdrViewContext::Standard;
+ if( maSmartTags.getContext( eContext ) )
+ return eContext;
+ else
+ return FmFormView::GetContext();
+}
+
+bool View::HasMarkablePoints() const
+{
+ if( maSmartTags.HasMarkablePoints() )
+ return true;
+ else
+ return FmFormView::HasMarkablePoints();
+}
+
+sal_Int32 View::GetMarkablePointCount() const
+{
+ sal_Int32 nCount = FmFormView::GetMarkablePointCount();
+ nCount += maSmartTags.GetMarkablePointCount();
+ return nCount;
+}
+
+bool View::HasMarkedPoints() const
+{
+ if( maSmartTags.HasMarkedPoints() )
+ return true;
+ else
+ return FmFormView::HasMarkedPoints();
+}
+
+bool View::MarkPoint(SdrHdl& rHdl, bool bUnmark )
+{
+ if( maSmartTags.MarkPoint( rHdl, bUnmark ) )
+ return true;
+ else
+ return FmFormView::MarkPoint( rHdl, bUnmark );
+}
+
+bool View::MarkPoints(const ::tools::Rectangle* pRect, bool bUnmark)
+{
+ if( maSmartTags.MarkPoints( pRect, bUnmark ) )
+ return true;
+ else
+ return FmFormView::MarkPoints( pRect, bUnmark );
+}
+
+void View::CheckPossibilities()
+{
+ FmFormView::CheckPossibilities();
+ maSmartTags.CheckPossibilities();
+}
+
+void View::OnBeginPasteOrDrop( PasteOrDropInfos* pInfo )
+{
+ SdrOutliner* pOutliner = GetTextEditOutliner();
+ if (!pOutliner)
+ return;
+
+ // Turn character attributes of the paragraph of the insert position into
+ // character-level attributes, so they are not lost when OnEndPasteOrDrop()
+ // sets the paragraph stylesheet.
+ SfxItemSet aSet(pOutliner->GetParaAttribs(pInfo->nStartPara));
+ pOutliner->SetCharAttribs(pInfo->nStartPara, aSet);
+}
+
+/** this is called after a paste or drop operation, make sure that the newly inserted paragraphs
+ get the correct style sheet. */
+void View::OnEndPasteOrDrop( PasteOrDropInfos* pInfo )
+{
+ /* Style Sheet handling */
+ SdrTextObj* pTextObj = GetTextEditObject();
+ SdrOutliner* pOutliner = GetTextEditOutliner();
+ if( !pOutliner || !pTextObj || !pTextObj->getSdrPageFromSdrObject() )
+ return;
+
+ SdPage* pPage = static_cast< SdPage* >( pTextObj->getSdrPageFromSdrObject() );
+ const PresObjKind eKind = pPage->GetPresObjKind(pTextObj);
+
+ // outline kinds are taken care of in Outliner::ImplSetLevelDependentStyleSheet
+ if( eKind == PresObjKind::Outline )
+ return;
+
+ SfxStyleSheet* pStyleSheet = nullptr;
+ if( eKind != PresObjKind::NONE )
+ pStyleSheet = pPage->GetStyleSheetForPresObj(eKind);
+ else
+ pStyleSheet = pTextObj->GetStyleSheet();
+ // just put the object style on each new paragraph
+ for ( sal_Int32 nPara = pInfo->nStartPara; nPara <= pInfo->nEndPara; nPara++ )
+ {
+ pOutliner->SetStyleSheet( nPara, pStyleSheet );
+ }
+}
+
+bool View::ShouldToggleOn(
+ const bool bBulletOnOffMode,
+ const bool bNormalBullet)
+{
+ // If setting bullets/numbering by the dialog, always should toggle on.
+ if (!bBulletOnOffMode)
+ return true;
+ SdrModel* pSdrModel = GetModel();
+ if (!pSdrModel)
+ return false;
+
+ bool bToggleOn = false;
+ std::unique_ptr<SdrOutliner> pOutliner(SdrMakeOutliner(OutlinerMode::TextObject, *pSdrModel));
+ const size_t nMarkCount = GetMarkedObjectCount();
+ for (size_t nIndex = 0; nIndex < nMarkCount && !bToggleOn; ++nIndex)
+ {
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >(GetMarkedObjectByIndex(nIndex));
+ if (!pTextObj || pTextObj->IsTextEditActive())
+ continue;
+ if( dynamic_cast< const SdrTableObj *>( pTextObj ) != nullptr)
+ {
+ SdrTableObj* pTableObj = dynamic_cast< SdrTableObj* >(pTextObj);
+ if (!pTableObj)
+ continue;
+ CellPos aStart, aEnd;
+ SvxTableController* pTableController = dynamic_cast< SvxTableController* >(getSelectionController().get());
+ if (pTableController)
+ {
+ pTableController->getSelectedCells(aStart, aEnd);
+ }
+ else
+ {
+ aStart = SdrTableObj::getFirstCell();
+ aEnd = pTableObj->getLastCell();
+ }
+ sal_Int32 nColCount = pTableObj->getColumnCount();
+ for (sal_Int32 nRow = aStart.mnRow; nRow <= aEnd.mnRow && !bToggleOn; nRow++)
+ {
+ for (sal_Int32 nCol = aStart.mnCol; nCol <= aEnd.mnCol && !bToggleOn; nCol++)
+ {
+ sal_Int32 nCellIndex = nRow * nColCount + nCol;
+ SdrText* pText = pTableObj->getText(nCellIndex);
+ if (!pText || !pText->GetOutlinerParaObject())
+ continue;
+ pOutliner->SetText(*(pText->GetOutlinerParaObject()));
+ sal_Int16 nStatus = pOutliner->GetBulletsNumberingStatus();
+ bToggleOn = (bNormalBullet && nStatus != 0) || (!bNormalBullet && nStatus != 1);
+ pOutliner->Clear();
+ }
+ }
+ }
+ else
+ {
+ OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject();
+ if (!pParaObj)
+ continue;
+ pOutliner->SetText(*pParaObj);
+ sal_Int16 nStatus = pOutliner->GetBulletsNumberingStatus();
+ bToggleOn = (bNormalBullet && nStatus != 0) || (!bNormalBullet && nStatus != 1);
+ pOutliner->Clear();
+ }
+ }
+ return bToggleOn;
+}
+
+void View::ChangeMarkedObjectsBulletsNumbering(
+ const bool bToggle,
+ const bool bHandleBullets,
+ const SvxNumRule* pNumRule )
+{
+ SdrModel* pSdrModel = GetModel();
+ OutputDevice* pOut = GetFirstOutputDevice();
+ vcl::Window* pWindow = pOut ? pOut->GetOwnerWindow() : nullptr;
+ if (!pSdrModel || !pWindow)
+ return;
+
+ const bool bUndoEnabled = pSdrModel->IsUndoEnabled();
+ std::unique_ptr<SdrUndoGroup> pUndoGroup(bUndoEnabled ? new SdrUndoGroup(*pSdrModel) : nullptr);
+
+ const bool bToggleOn = ShouldToggleOn( bToggle, bHandleBullets );
+
+ std::unique_ptr<SdrOutliner> pOutliner(SdrMakeOutliner(OutlinerMode::TextObject, *pSdrModel));
+ OutlinerView aOutlinerView(pOutliner.get(), pWindow);
+
+ const size_t nMarkCount = GetMarkedObjectCount();
+ for (size_t nIndex = 0; nIndex < nMarkCount; ++nIndex)
+ {
+ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >(GetMarkedObjectByIndex(nIndex));
+ if (!pTextObj || pTextObj->IsTextEditActive())
+ continue;
+ if( dynamic_cast< SdrTableObj *>( pTextObj ) != nullptr)
+ {
+ SdrTableObj* pTableObj = dynamic_cast< SdrTableObj* >(pTextObj);
+ if (!pTableObj)
+ continue;
+ CellPos aStart, aEnd;
+ SvxTableController* pTableController = dynamic_cast< SvxTableController* >(getSelectionController().get());
+ if (pTableController)
+ {
+ pTableController->getSelectedCells(aStart, aEnd);
+ }
+ else
+ {
+ aStart = SdrTableObj::getFirstCell();
+ aEnd = pTableObj->getLastCell();
+ }
+ sal_Int32 nColCount = pTableObj->getColumnCount();
+ for (sal_Int32 nRow = aStart.mnRow; nRow <= aEnd.mnRow; nRow++)
+ {
+ for (sal_Int32 nCol = aStart.mnCol; nCol <= aEnd.mnCol; nCol++)
+ {
+ sal_Int32 nCellIndex = nRow * nColCount + nCol;
+ SdrText* pText = pTableObj->getText(nCellIndex);
+ if (!pText || !pText->GetOutlinerParaObject())
+ continue;
+
+ pOutliner->SetText(*(pText->GetOutlinerParaObject()));
+ if (bUndoEnabled)
+ {
+ pUndoGroup->AddAction(pSdrModel->GetSdrUndoFactory().CreateUndoObjectSetText(*pTextObj, nCellIndex));
+ }
+ if ( !bToggleOn )
+ {
+ aOutlinerView.SwitchOffBulletsNumbering();
+ }
+ else
+ {
+ aOutlinerView.ApplyBulletsNumbering( bHandleBullets, pNumRule, bToggle );
+ }
+ sal_uInt32 nParaCount = pOutliner->GetParagraphCount();
+ pText->SetOutlinerParaObject(pOutliner->CreateParaObject(0, static_cast<sal_uInt16>(nParaCount)));
+ pOutliner->Clear();
+ }
+ }
+ // Broadcast the object change event.
+ if (!pTextObj->AdjustTextFrameWidthAndHeight())
+ {
+ pTextObj->SetChanged();
+ pTextObj->BroadcastObjectChange();
+ }
+ }
+ else
+ {
+ OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject();
+ if (!pParaObj)
+ continue;
+ pOutliner->SetText(*pParaObj);
+ if (bUndoEnabled)
+ {
+ pUndoGroup->AddAction(
+ pSdrModel->GetSdrUndoFactory().CreateUndoObjectSetText(*pTextObj, 0));
+ }
+ if ( !bToggleOn )
+ {
+ aOutlinerView.SwitchOffBulletsNumbering();
+ }
+ else
+ {
+ aOutlinerView.ApplyBulletsNumbering( bHandleBullets, pNumRule, bToggle );
+ }
+ sal_uInt32 nParaCount = pOutliner->GetParagraphCount();
+ pTextObj->SetOutlinerParaObject(pOutliner->CreateParaObject(0, static_cast<sal_uInt16>(nParaCount)));
+ pOutliner->Clear();
+ }
+ }
+
+ if ( bUndoEnabled && pUndoGroup->GetActionCount() > 0 )
+ {
+ pSdrModel->BegUndo();
+ pSdrModel->AddUndo(std::move(pUndoGroup));
+ pSdrModel->EndUndo();
+ }
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/sdview2.cxx b/sd/source/ui/view/sdview2.cxx
new file mode 100644
index 000000000..a5b3d4413
--- /dev/null
+++ b/sd/source/ui/view/sdview2.cxx
@@ -0,0 +1,908 @@
+/* -*- 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 <View.hxx>
+
+#include <vector>
+#include <com/sun/star/embed/XEmbedPersist.hpp>
+#include <com/sun/star/embed/XEmbeddedObject.hpp>
+#include <comphelper/sequenceashashmap.hxx>
+#include <tools/urlobj.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svxdlg.hxx>
+#include <sfx2/docfile.hxx>
+#include <svx/svdundo.hxx>
+#include <svx/svdpagv.hxx>
+#include <svl/urlbmk.hxx>
+#include <editeng/outliner.hxx>
+#include <svx/xflclit.hxx>
+#include <sot/formats.hxx>
+#include <editeng/editeng.hxx>
+
+#include <svtools/embedtransfer.hxx>
+#include <tools/debug.hxx>
+
+#include <anminfo.hxx>
+#include <strings.hrc>
+#include <sdxfer.hxx>
+#include <sdresid.hxx>
+#include <sdmod.hxx>
+#include <sdtreelb.hxx>
+#include <DrawViewShell.hxx>
+#include <DrawDocShell.hxx>
+#include <fudraw.hxx>
+#include <drawdoc.hxx>
+#include <Window.hxx>
+#include <sdpage.hxx>
+#include <unoaprms.hxx>
+#include <helpids.h>
+#include <vcl/svapp.hxx>
+
+#include <slideshow.hxx>
+#include <memory>
+
+namespace sd {
+
+using namespace ::com::sun::star;
+
+namespace {
+
+struct SdNavigatorDropEvent : public ExecuteDropEvent
+{
+ VclPtr< ::sd::Window> mpTargetWindow;
+
+ SdNavigatorDropEvent (
+ const ExecuteDropEvent& rEvt,
+ ::sd::Window* pTargetWindow )
+ : ExecuteDropEvent( rEvt ),
+ mpTargetWindow( pTargetWindow )
+ {}
+};
+
+}
+
+css::uno::Reference< css::datatransfer::XTransferable > View::CreateClipboardDataObject()
+{
+ // since SdTransferable::CopyToClipboard is called, this
+ // dynamically created object is destroyed automatically
+ rtl::Reference<SdTransferable> pTransferable = new SdTransferable( &mrDoc, nullptr, false );
+
+ SD_MOD()->pTransferClip = pTransferable.get();
+
+ mrDoc.CreatingDataObj( pTransferable.get() );
+ pTransferable->SetWorkDocument( static_cast<SdDrawDocument*>(CreateMarkedObjModel().release()) );
+ mrDoc.CreatingDataObj( nullptr );
+
+ // #112978# need to use GetAllMarkedBoundRect instead of GetAllMarkedRect to get
+ // fat lines correctly
+ const ::tools::Rectangle aMarkRect( GetAllMarkedBoundRect() );
+ std::unique_ptr<TransferableObjectDescriptor> pObjDesc(new TransferableObjectDescriptor);
+ SdrOle2Obj* pSdrOleObj = nullptr;
+ SdrPageView* pPgView = GetSdrPageView();
+ SdPage* pOldPage = pPgView ? static_cast<SdPage*>( pPgView->GetPage() ) : nullptr;
+ SdPage* pNewPage = const_cast<SdPage*>(static_cast<const SdPage*>( pTransferable->GetWorkDocument()->GetPage( 0 ) ));
+
+ if( pOldPage )
+ {
+ pNewPage->SetSize( pOldPage->GetSize() );
+ pNewPage->SetLayoutName( pOldPage->GetLayoutName() );
+ }
+
+ if( GetMarkedObjectCount() == 1 )
+ {
+ SdrObject* pObj = GetMarkedObjectByIndex(0);
+
+ if( auto pOle2Obj = dynamic_cast<SdrOle2Obj *>( pObj ) )
+ if( pOle2Obj->GetObjRef() )
+ {
+ // If object has no persistence it must be copied as part of the document
+ try
+ {
+ uno::Reference< embed::XEmbedPersist > xPersObj( pOle2Obj->GetObjRef(), uno::UNO_QUERY );
+ if ( xPersObj.is() && xPersObj->hasEntry() )
+ pSdrOleObj = pOle2Obj;
+ }
+ catch( uno::Exception& )
+ {}
+ }
+ }
+
+ if( pSdrOleObj )
+ SvEmbedTransferHelper::FillTransferableObjectDescriptor( *pObjDesc, pSdrOleObj->GetObjRef(), pSdrOleObj->GetGraphic(), pSdrOleObj->GetAspect() );
+ else
+ pTransferable->GetWorkDocument()->GetDocSh()->FillTransferableObjectDescriptor( *pObjDesc );
+
+ if( mpDocSh )
+ pObjDesc->maDisplayName = mpDocSh->GetMedium()->GetURLObject().GetURLNoPass();
+
+ pObjDesc->maSize = aMarkRect.GetSize();
+
+ pTransferable->SetStartPos( aMarkRect.TopLeft() );
+ pTransferable->SetObjectDescriptor( std::move(pObjDesc) );
+ pTransferable->CopyToClipboard( mpViewSh->GetActiveWindow() );
+
+ return pTransferable;
+}
+
+css::uno::Reference< css::datatransfer::XTransferable > View::CreateDragDataObject( View* pWorkView, vcl::Window& rWindow, const Point& rDragPos )
+{
+ rtl::Reference<SdTransferable> pTransferable = new SdTransferable( &mrDoc, pWorkView, false );
+
+ SD_MOD()->pTransferDrag = pTransferable.get();
+
+ std::unique_ptr<TransferableObjectDescriptor> pObjDesc(new TransferableObjectDescriptor);
+ OUString aDisplayName;
+ SdrOle2Obj* pSdrOleObj = nullptr;
+
+ if( GetMarkedObjectCount() == 1 )
+ {
+ SdrObject* pObj = GetMarkedObjectByIndex( 0 );
+
+ if( auto pOle2Obj = dynamic_cast<SdrOle2Obj *>( pObj ) )
+ if( pOle2Obj->GetObjRef() )
+ {
+ // If object has no persistence it must be copied as part of the document
+ try
+ {
+ uno::Reference< embed::XEmbedPersist > xPersObj( pOle2Obj->GetObjRef(), uno::UNO_QUERY );
+ if ( xPersObj.is() && xPersObj->hasEntry() )
+ pSdrOleObj = pOle2Obj;
+ }
+ catch( uno::Exception& )
+ {}
+ }
+ }
+
+ if( mpDocSh )
+ aDisplayName = mpDocSh->GetMedium()->GetURLObject().GetURLNoPass();
+
+ if( pSdrOleObj )
+ SvEmbedTransferHelper::FillTransferableObjectDescriptor( *pObjDesc, pSdrOleObj->GetObjRef(), pSdrOleObj->GetGraphic(), pSdrOleObj->GetAspect() );
+ else if (mpDocSh)
+ mpDocSh->FillTransferableObjectDescriptor( *pObjDesc );
+
+ pObjDesc->maSize = GetAllMarkedRect().GetSize();
+ pObjDesc->maDragStartPos = rDragPos;
+ pObjDesc->maDisplayName = aDisplayName;
+
+ pTransferable->SetStartPos( rDragPos );
+ pTransferable->SetObjectDescriptor( std::move(pObjDesc) );
+ pTransferable->StartDrag( &rWindow, DND_ACTION_COPYMOVE | DND_ACTION_LINK );
+
+ return pTransferable;
+}
+
+css::uno::Reference< css::datatransfer::XTransferable > View::CreateSelectionDataObject( View* pWorkView )
+{
+ rtl::Reference<SdTransferable> pTransferable = new SdTransferable( &mrDoc, pWorkView, true );
+ std::unique_ptr<TransferableObjectDescriptor> pObjDesc(new TransferableObjectDescriptor);
+ const ::tools::Rectangle aMarkRect( GetAllMarkedRect() );
+
+ SD_MOD()->pTransferSelection = pTransferable.get();
+
+ if( mpDocSh )
+ {
+ mpDocSh->FillTransferableObjectDescriptor( *pObjDesc );
+ pObjDesc->maDisplayName = mpDocSh->GetMedium()->GetURLObject().GetURLNoPass();
+ }
+
+ pObjDesc->maSize = aMarkRect.GetSize();
+
+ pTransferable->SetStartPos( aMarkRect.TopLeft() );
+ pTransferable->SetObjectDescriptor( std::move(pObjDesc) );
+ pTransferable->CopyToPrimarySelection();
+
+ return pTransferable;
+}
+
+void View::UpdateSelectionClipboard() // false case
+{
+ if (!mpViewSh)
+ return;
+ if (!mpViewSh->GetActiveWindow())
+ return;
+ if (GetMarkedObjectList().GetMarkCount())
+ CreateSelectionDataObject( this );
+ else
+ ClearSelectionClipboard();
+}
+
+void View::ClearSelectionClipboard() // true case
+{
+ if (!mpViewSh)
+ return;
+ if (!mpViewSh->GetActiveWindow())
+ return;
+ if (SD_MOD()->pTransferSelection && SD_MOD()->pTransferSelection->GetView() == this)
+ {
+ TransferableHelper::ClearPrimarySelection();
+ SD_MOD()->pTransferSelection = nullptr;
+ }
+}
+
+void View::DoCut()
+{
+ const OutlinerView* pOLV = GetTextEditOutlinerView();
+
+ if( pOLV )
+ const_cast<OutlinerView*>(pOLV)->Cut();
+ else if( AreObjectsMarked() )
+ {
+ OUString aStr(SdResId(STR_UNDO_CUT));
+
+ DoCopy();
+ BegUndo(aStr + " " + GetDescriptionOfMarkedObjects());
+ DeleteMarked();
+ EndUndo();
+ }
+}
+
+void View::DoCopy()
+{
+ const OutlinerView* pOLV = GetTextEditOutlinerView();
+
+ if( pOLV )
+ const_cast<OutlinerView*>(pOLV)->Copy();
+ else if( AreObjectsMarked() )
+ {
+ BrkAction();
+ CreateClipboardDataObject();
+ }
+}
+
+void View::DoPaste (::sd::Window* pWindow)
+{
+ TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( mpViewSh->GetActiveWindow() ) );
+ if( !aDataHelper.GetTransferable().is() )
+ return; // empty clipboard?
+
+ const OutlinerView* pOLV = GetTextEditOutlinerView();
+
+ if( pOLV && EditEngine::HasValidData( aDataHelper.GetTransferable() ) )
+ {
+ const_cast< OutlinerView* >(pOLV)->PasteSpecial();
+
+ SdrObject* pObj = GetTextEditObject();
+ SdPage* pPage = static_cast<SdPage*>( pObj ? pObj->getSdrPageFromSdrObject() : nullptr );
+ ::Outliner* pOutliner = pOLV->GetOutliner();
+
+ if( pOutliner)
+ {
+ if( pObj && pPage && pPage->GetPresObjKind(pObj) == PresObjKind::Title )
+ {
+ // remove all hard linebreaks from the title
+ if (pOutliner->GetParagraphCount() > 1)
+ {
+ bool bOldUpdateMode = pOutliner->SetUpdateLayout( false );
+
+ const EditEngine& rEdit = pOutliner->GetEditEngine();
+ const sal_Int32 nParaCount = rEdit.GetParagraphCount();
+
+ for( sal_Int32 nPara = nParaCount - 2; nPara >= 0; nPara-- )
+ {
+ const sal_Int32 nParaLen = rEdit.GetTextLen( nPara );
+ pOutliner->QuickDelete( ESelection( nPara, nParaLen, nPara+1, 0 ) );
+ pOutliner->QuickInsertLineBreak( ESelection( nPara, nParaLen, nPara, nParaLen ) );
+ }
+
+ DBG_ASSERT( rEdit.GetParagraphCount() <= 1, "Titleobject contains hard line breaks" );
+ pOutliner->SetUpdateLayout(bOldUpdateMode);
+ }
+ }
+
+ if( !mrDoc.IsChanged() )
+ {
+ if (pOutliner->IsModified())
+ mrDoc.SetChanged();
+ }
+ }
+ }
+ else
+ {
+ Point aPos = pWindow->GetVisibleCenter();
+ DrawViewShell* pDrViewSh = static_cast<DrawViewShell*>( mpDocSh->GetViewShell() );
+
+ if (pDrViewSh != nullptr)
+ {
+ sal_Int8 nDnDAction = DND_ACTION_COPY;
+ if( !InsertData( aDataHelper, aPos, nDnDAction, false ) )
+ {
+ INetBookmark aINetBookmark( "", "" );
+
+ if( ( aDataHelper.HasFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK ) &&
+ aDataHelper.GetINetBookmark( SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark ) ) ||
+ ( aDataHelper.HasFormat( SotClipboardFormatId::FILEGRPDESCRIPTOR ) &&
+ aDataHelper.GetINetBookmark( SotClipboardFormatId::FILEGRPDESCRIPTOR, aINetBookmark ) ) ||
+ ( aDataHelper.HasFormat( SotClipboardFormatId::UNIFORMRESOURCELOCATOR ) &&
+ aDataHelper.GetINetBookmark( SotClipboardFormatId::UNIFORMRESOURCELOCATOR, aINetBookmark ) ) )
+ {
+ pDrViewSh->InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), "" );
+ }
+ }
+ }
+ }
+}
+
+void View::StartDrag( const Point& rStartPos, vcl::Window* pWindow )
+{
+ if (!AreObjectsMarked() || !IsAction() || !mpViewSh || !pWindow)
+ return;
+
+ BrkAction();
+
+ if( IsTextEdit() )
+ SdrEndTextEdit();
+
+ if (DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>(mpDocSh ? mpDocSh->GetViewShell() : nullptr))
+ {
+ const rtl::Reference<FuPoor>& xFunction(pDrawViewShell->GetCurrentFunction());
+ if (FuDraw* pFunction = dynamic_cast<FuDraw*>(xFunction.get()))
+ pFunction->ForcePointer();
+ }
+
+ mpDragSrcMarkList.reset( new SdrMarkList(GetMarkedObjectList()) );
+ mnDragSrcPgNum = GetSdrPageView()->GetPage()->GetPageNum();
+
+ CreateDragDataObject( this, *pWindow, rStartPos );
+}
+
+void View::DragFinished( sal_Int8 nDropAction )
+{
+ const bool bUndo = IsUndoEnabled();
+ const bool bGroupUndo = bUndo && mpDragSrcMarkList;
+ if (bGroupUndo)
+ {
+ OUString aStr(SdResId(STR_UNDO_DRAGDROP));
+ BegUndo(aStr + " " + mpDragSrcMarkList->GetMarkDescription());
+ }
+
+ SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag;
+
+ if( pDragTransferable )
+ pDragTransferable->SetView( nullptr );
+
+ if( ( nDropAction & DND_ACTION_MOVE ) &&
+ pDragTransferable && !pDragTransferable->IsInternalMove() &&
+ mpDragSrcMarkList && mpDragSrcMarkList->GetMarkCount() &&
+ !IsPresObjSelected() )
+ {
+ mpDragSrcMarkList->ForceSort();
+
+ if( bUndo )
+ BegUndo();
+
+ const size_t nCnt = mpDragSrcMarkList->GetMarkCount();
+
+ for( size_t nm = nCnt; nm>0; )
+ {
+ --nm;
+ SdrMark* pM=mpDragSrcMarkList->GetMark(nm);
+ if( bUndo )
+ AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoDeleteObject(*pM->GetMarkedSdrObj()));
+ }
+
+ mpDragSrcMarkList->GetMark(0)->GetMarkedSdrObj()->GetOrdNum();
+
+ for (size_t nm = nCnt; nm>0;)
+ {
+ --nm;
+ SdrMark* pM=mpDragSrcMarkList->GetMark(nm);
+ SdrObject* pObj=pM->GetMarkedSdrObj();
+
+ if( pObj && pObj->getSdrPageFromSdrObject() )
+ {
+ const size_t nOrdNum = pObj->GetOrdNumDirect();
+ SdrObject* pChkObj = pObj->getSdrPageFromSdrObject()->RemoveObject(nOrdNum);
+ DBG_ASSERT(pChkObj==pObj,"pChkObj!=pObj in RemoveObject()");
+ }
+ }
+
+ if( bUndo )
+ EndUndo();
+ }
+
+ if( pDragTransferable )
+ pDragTransferable->SetInternalMove( false );
+
+ if (bGroupUndo)
+ EndUndo();
+ mnDragSrcPgNum = SDRPAGE_NOTFOUND;
+ mpDragSrcMarkList.reset();
+}
+
+sal_Int8 View::AcceptDrop( const AcceptDropEvent& rEvt, DropTargetHelper& rTargetHelper,
+ SdrLayerID nLayer )
+{
+ OUString aLayerName = GetActiveLayer();
+ SdrPageView* pPV = GetSdrPageView();
+ sal_Int8 nDropAction = rEvt.mnAction;
+ sal_Int8 nRet = DND_ACTION_NONE;
+
+ if( nLayer != SDRLAYER_NOTFOUND )
+ {
+ SdrLayerAdmin& rLayerAdmin = mrDoc.GetLayerAdmin();
+ aLayerName = rLayerAdmin.GetLayerPerID(nLayer)->GetName();
+ }
+
+ if( mbIsDropAllowed && !pPV->IsLayerLocked( aLayerName ) && pPV->IsLayerVisible( aLayerName ) )
+ {
+ const OutlinerView* pOLV = GetTextEditOutlinerView();
+ bool bIsInsideOutlinerView = false;
+
+ if( pOLV )
+ {
+ ::tools::Rectangle aRect( pOLV->GetOutputArea() );
+
+ if (GetMarkedObjectCount() == 1)
+ {
+ SdrMark* pMark = GetSdrMarkByIndex(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+ aRect.Union( pObj->GetLogicRect() );
+ }
+
+ if( aRect.Contains( pOLV->GetWindow()->PixelToLogic( rEvt.maPosPixel ) ) )
+ {
+ bIsInsideOutlinerView = true;
+ }
+ }
+
+ if( !bIsInsideOutlinerView )
+ {
+ SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag;
+
+ if(pDragTransferable && (nDropAction & DND_ACTION_LINK))
+ {
+ // suppress own data when it's intention is to use it as fill information
+ pDragTransferable = nullptr;
+ }
+
+ if( pDragTransferable )
+ {
+ const View* pSourceView = pDragTransferable->GetView();
+
+ if( pDragTransferable->IsPageTransferable() )
+ {
+ nRet = DND_ACTION_COPY;
+ }
+ else if( pSourceView )
+ {
+ if( !( nDropAction & DND_ACTION_LINK ) ||
+ !pSourceView->GetDocSh()->GetMedium()->GetName().isEmpty() )
+ {
+ nRet = nDropAction;
+ }
+ }
+ }
+ else
+ {
+ const bool bDrawing = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::DRAWING );
+ const bool bGraphic = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::SVXB );
+ const bool bMtf = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::GDIMETAFILE );
+ const bool bBitmap = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::BITMAP );
+ bool bBookmark = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::NETSCAPE_BOOKMARK );
+ bool bXFillExchange = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::XFA );
+
+ // check handle insert
+ if ((bXFillExchange && (SdrDragMode::Gradient == GetDragMode()))
+ || (SdrDragMode::Transparence == GetDragMode()))
+ {
+ const SdrHdlList& rHdlList = GetHdlList();
+
+ for( size_t n = 0; n < rHdlList.GetHdlCount(); ++n )
+ {
+ SdrHdl* pIAOHandle = rHdlList.GetHdl( n );
+
+ if( pIAOHandle && ( SdrHdlKind::Color == pIAOHandle->GetKind() ) )
+ {
+ if(pIAOHandle->getOverlayObjectList().isHitPixel(rEvt.maPosPixel))
+ {
+ nRet = nDropAction;
+ static_cast< SdrHdlColor* >( pIAOHandle )->SetSize( SDR_HANDLE_COLOR_SIZE_SELECTED );
+ }
+ else
+ {
+ static_cast< SdrHdlColor* >( pIAOHandle )->SetSize( SDR_HANDLE_COLOR_SIZE_NORMAL );
+ }
+ }
+ }
+ }
+
+ // check object insert
+ if( !nRet && ( bXFillExchange || ( ( bDrawing || bGraphic || bMtf || bBitmap || bBookmark ) && ( nDropAction & DND_ACTION_LINK ) ) ) )
+ {
+ SdrPageView* pPageView = nullptr;
+ ::sd::Window* pWindow = mpViewSh->GetActiveWindow();
+ Point aPos( pWindow->PixelToLogic( rEvt.maPosPixel ) );
+ SdrObject* pPickObj = PickObj(aPos, getHitTolLog(), pPageView);
+ bool bIsPresTarget = false;
+
+ if (pPickObj && (pPickObj->IsEmptyPresObj() || pPickObj->GetUserCall()))
+ {
+ SdPage* pPage = static_cast<SdPage*>( pPickObj->getSdrPageFromSdrObject() );
+
+ if( pPage && pPage->IsMasterPage() )
+ bIsPresTarget = pPage->IsPresObj( pPickObj );
+ }
+
+ if (pPickObj && !bIsPresTarget && (bGraphic || bMtf || bBitmap || bXFillExchange))
+ {
+ if( mpDropMarkerObj != pPickObj )
+ {
+ mpDropMarkerObj = pPickObj;
+ ImplClearDrawDropMarker();
+
+ if(mpDropMarkerObj)
+ {
+ mpDropMarker.reset( new SdrDropMarkerOverlay(*this, *mpDropMarkerObj) );
+ }
+ }
+
+ nRet = nDropAction;
+ }
+ else
+ bXFillExchange = false;
+ }
+
+ // check normal insert
+ if( !nRet )
+ {
+ const bool bSBAFormat = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::SVX_FORMFIELDEXCH );
+ const bool bEditEngineODF = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT );
+ const bool bString = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::STRING );
+ const bool bRTF = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::RTF );
+ const bool bFile = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::SIMPLE_FILE );
+ const bool bFileList = rTargetHelper.IsDropFormatSupported( SotClipboardFormatId::FILE_LIST );
+
+ if( mpDropMarker )
+ {
+ ImplClearDrawDropMarker();
+ mpDropMarkerObj = nullptr;
+ }
+
+ if( bBookmark && bFile && ( nDropAction & DND_ACTION_MOVE ) && mpViewSh && SlideShow::IsRunning(mpViewSh->GetViewShellBase()) )
+ bBookmark = false;
+
+ if( bDrawing || bGraphic || bMtf || bBitmap || bBookmark || bFile || bFileList || bXFillExchange || bSBAFormat || bEditEngineODF || bString || bRTF )
+ nRet = nDropAction;
+
+ // For entries from the navigator, change action copy.
+ if (bBookmark
+ && rTargetHelper.IsDropFormatSupported(
+ SdPageObjsTLV::SdPageObjsTransferable::GetListBoxDropFormatId())
+ && (nDropAction & DND_ACTION_MOVE)!=0)
+ {
+ nRet = DND_ACTION_COPY;
+ }
+ }
+ }
+ }
+ }
+
+ // destroy drop marker if this is a leaving event
+ if( rEvt.mbLeaving && mpDropMarker )
+ {
+ ImplClearDrawDropMarker();
+ mpDropMarkerObj = nullptr;
+ }
+
+ return nRet;
+}
+
+sal_Int8 View::ExecuteDrop( const ExecuteDropEvent& rEvt,
+ ::sd::Window* pTargetWindow, sal_uInt16 nPage, SdrLayerID nLayer )
+{
+ SdrPageView* pPV = GetSdrPageView();
+ OUString aActiveLayer = GetActiveLayer();
+ sal_Int8 nDropAction = rEvt.mnAction;
+ sal_Int8 nRet = DND_ACTION_NONE;
+
+ // destroy drop marker if it is shown
+ if( mpDropMarker )
+ {
+ ImplClearDrawDropMarker();
+ mpDropMarkerObj = nullptr;
+ }
+
+ if( !pPV->IsLayerLocked( aActiveLayer ) )
+ {
+ const OutlinerView* pOLV = GetTextEditOutlinerView();
+ bool bIsInsideOutlinerView = false;
+
+ if( pOLV )
+ {
+ ::tools::Rectangle aRect( pOLV->GetOutputArea() );
+
+ if( GetMarkedObjectCount() == 1 )
+ {
+ SdrMark* pMark = GetSdrMarkByIndex(0);
+ SdrObject* pObj = pMark->GetMarkedSdrObj();
+ aRect.Union( pObj->GetLogicRect() );
+ }
+
+ Point aPos( pOLV->GetWindow()->PixelToLogic( rEvt.maPosPixel ) );
+
+ if( aRect.Contains( aPos ) )
+ {
+ bIsInsideOutlinerView = true;
+ }
+ }
+
+ if( !bIsInsideOutlinerView )
+ {
+ Point aPos;
+ TransferableDataHelper aDataHelper( rEvt.maDropEvent.Transferable );
+
+ if( pTargetWindow )
+ aPos = pTargetWindow->PixelToLogic( rEvt.maPosPixel );
+
+ // handle insert?
+ if ((SdrDragMode::Gradient == GetDragMode())
+ || ((SdrDragMode::Transparence == GetDragMode())
+ && aDataHelper.HasFormat(SotClipboardFormatId::XFA)))
+ {
+ const SdrHdlList& rHdlList = GetHdlList();
+
+ for( size_t n = 0; !nRet && n < rHdlList.GetHdlCount(); ++n )
+ {
+ SdrHdl* pIAOHandle = rHdlList.GetHdl( n );
+
+ if( pIAOHandle && ( SdrHdlKind::Color == pIAOHandle->GetKind() ) )
+ {
+ if(pIAOHandle->getOverlayObjectList().isHitPixel(rEvt.maPosPixel))
+ {
+ uno::Any const data(aDataHelper.GetAny(SotClipboardFormatId::XFA, ""));
+ uno::Sequence<beans::NamedValue> props;
+ if (data >>= props)
+ {
+ ::comphelper::SequenceAsHashMap const map(props);
+ Color aColor(COL_BLACK);
+ auto const it = map.find("FillColor");
+ if (it != map.end())
+ {
+ XFillColorItem color;
+ color.PutValue(it->second, 0);
+ aColor = color.GetColorValue();
+ }
+ static_cast< SdrHdlColor* >( pIAOHandle )->SetColor( aColor, true );
+ nRet = nDropAction;
+ }
+ }
+ }
+ }
+ }
+
+ // standard insert?
+ if( !nRet && InsertData( aDataHelper, aPos, nDropAction, true, SotClipboardFormatId::NONE, nPage, nLayer ) )
+ nRet = nDropAction;
+
+ // special insert?
+ if( !nRet && mpViewSh )
+ {
+ INetBookmark aINetBookmark( (OUString()), (OUString()) );
+
+ // insert bookmark
+ if( aDataHelper.HasFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK ) &&
+ aDataHelper.GetINetBookmark( SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark ) )
+ {
+ SdPageObjsTLV::SdPageObjsTransferable* pPageObjsTransferable = SdPageObjsTLV::SdPageObjsTransferable::getImplementation( aDataHelper.GetXTransferable() );
+
+ if( pPageObjsTransferable &&
+ ( NAVIGATOR_DRAGTYPE_LINK == pPageObjsTransferable->GetDragType() ||
+ NAVIGATOR_DRAGTYPE_EMBEDDED == pPageObjsTransferable->GetDragType() ) )
+ {
+ // insert bookmark from own navigator (handled async. due to possible message box )
+ Application::PostUserEvent( LINK( this, View, ExecuteNavigatorDrop ),
+ new SdNavigatorDropEvent( rEvt, pTargetWindow ) );
+ nRet = nDropAction;
+ }
+ else
+ {
+ SdrPageView* pPageView = nullptr;
+
+ SdrObject* pPickObj = PickObj(aPos, getHitTolLog(), pPageView);
+ if (pPickObj)
+ {
+ // insert as clip action => jump
+ OUString aBookmark( aINetBookmark.GetURL() );
+ SdAnimationInfo* pInfo = SdDrawDocument::GetAnimationInfo( pPickObj );
+
+ if( !aBookmark.isEmpty() )
+ {
+ bool bCreated = false;
+
+ presentation::ClickAction eClickAction = presentation::ClickAction_DOCUMENT;
+
+ sal_Int32 nIndex = aBookmark.indexOf( '#' );
+ if( nIndex != -1 )
+ {
+ const std::u16string_view aDocName( aBookmark.subView( 0, nIndex ) );
+
+ if (mpDocSh->GetMedium()->GetName() == aDocName || aDocName == mpDocSh->GetName())
+ {
+ // internal jump, only use the part after and including '#'
+ eClickAction = presentation::ClickAction_BOOKMARK;
+ aBookmark = aBookmark.copy( nIndex+1 );
+ }
+ }
+
+ if( !pInfo )
+ {
+ pInfo = SdDrawDocument::GetShapeUserData( *pPickObj, true );
+ bCreated = true;
+ }
+
+ // create undo action with old and new sizes
+ std::unique_ptr<SdAnimationPrmsUndoAction> pAction(new SdAnimationPrmsUndoAction(&mrDoc, pPickObj, bCreated));
+ pAction->SetActive(pInfo->mbActive, pInfo->mbActive);
+ pAction->SetEffect(pInfo->meEffect, pInfo->meEffect);
+ pAction->SetTextEffect(pInfo->meTextEffect, pInfo->meTextEffect);
+ pAction->SetSpeed(pInfo->meSpeed, pInfo->meSpeed);
+ pAction->SetDim(pInfo->mbDimPrevious, pInfo->mbDimPrevious);
+ pAction->SetDimColor(pInfo->maDimColor, pInfo->maDimColor);
+ pAction->SetDimHide(pInfo->mbDimHide, pInfo->mbDimHide);
+ pAction->SetSoundOn(pInfo->mbSoundOn, pInfo->mbSoundOn);
+ pAction->SetSound(pInfo->maSoundFile, pInfo->maSoundFile);
+ pAction->SetPlayFull(pInfo->mbPlayFull, pInfo->mbPlayFull);
+ pAction->SetClickAction(pInfo->meClickAction, eClickAction);
+ pAction->SetBookmark(pInfo->GetBookmark(), aBookmark);
+ pAction->SetVerb(pInfo->mnVerb, pInfo->mnVerb);
+ pAction->SetSecondEffect(pInfo->meSecondEffect, pInfo->meSecondEffect);
+ pAction->SetSecondSpeed(pInfo->meSecondSpeed, pInfo->meSecondSpeed);
+ pAction->SetSecondSoundOn(pInfo->mbSecondSoundOn, pInfo->mbSecondSoundOn);
+ pAction->SetSecondPlayFull(pInfo->mbSecondPlayFull, pInfo->mbSecondPlayFull);
+
+ OUString aString(SdResId(STR_UNDO_ANIMATION));
+ pAction->SetComment(aString);
+ mpDocSh->GetUndoManager()->AddUndoAction(std::move(pAction));
+ pInfo->meClickAction = eClickAction;
+ pInfo->SetBookmark( aBookmark );
+ mrDoc.SetChanged();
+
+ nRet = nDropAction;
+ }
+ }
+ else if( auto pDrawViewShell = dynamic_cast< DrawViewShell *>( mpViewSh ) )
+ {
+ // insert as normal URL button
+ pDrawViewShell->InsertURLButton( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), OUString(), &aPos );
+ nRet = nDropAction;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return nRet;
+}
+
+IMPL_LINK( View, ExecuteNavigatorDrop, void*, p, void )
+{
+ SdNavigatorDropEvent* pSdNavigatorDropEvent = static_cast<SdNavigatorDropEvent*>(p);
+ TransferableDataHelper aDataHelper( pSdNavigatorDropEvent->maDropEvent.Transferable );
+ SdPageObjsTLV::SdPageObjsTransferable* pPageObjsTransferable = SdPageObjsTLV::SdPageObjsTransferable::getImplementation( aDataHelper.GetXTransferable() );
+ INetBookmark aINetBookmark;
+
+ if( pPageObjsTransferable && aDataHelper.GetINetBookmark( SotClipboardFormatId::NETSCAPE_BOOKMARK, aINetBookmark ) )
+ {
+ Point aPos;
+ OUString aBookmark;
+ SdPage* pPage = static_cast<SdPage*>( GetSdrPageView()->GetPage() );
+ sal_uInt16 nPgPos = 0xFFFF;
+
+ if( pSdNavigatorDropEvent->mpTargetWindow )
+ aPos = pSdNavigatorDropEvent->mpTargetWindow->PixelToLogic( pSdNavigatorDropEvent->maPosPixel );
+
+ const OUString& aURL( aINetBookmark.GetURL() );
+ sal_Int32 nIndex = aURL.indexOf( '#' );
+ if( nIndex != -1 )
+ aBookmark = aURL.copy( nIndex+1 );
+
+ std::vector<OUString> aExchangeList;
+ std::vector<OUString> aBookmarkList(1,aBookmark);
+
+ if( !pPage->IsMasterPage() )
+ {
+ if( pPage->GetPageKind() == PageKind::Standard )
+ nPgPos = pPage->GetPageNum() + 2;
+ else if( pPage->GetPageKind() == PageKind::Notes )
+ nPgPos = pPage->GetPageNum() + 1;
+ }
+
+ /* In order t ensure unique page names, we test the ones we want to
+ insert. If necessary. we put them into and replacement list (bNameOK
+ == sal_False -> User canceled). */
+ bool bLink = pPageObjsTransferable->GetDragType() == NAVIGATOR_DRAGTYPE_LINK;
+ bool bNameOK = GetExchangeList( aExchangeList, aBookmarkList, 2 );
+
+ /* Since we don't know the type (page or object), we fill a list with
+ pages and objects.
+ Of course we have problems if there are pages and objects with the
+ same name!!! */
+ if( bNameOK )
+ {
+ mrDoc.InsertBookmark( aBookmarkList, aExchangeList,
+ bLink, nPgPos,
+ &pPageObjsTransferable->GetDocShell(),
+ &aPos );
+ }
+ }
+
+ delete pSdNavigatorDropEvent;
+}
+
+bool View::GetExchangeList (std::vector<OUString> &rExchangeList,
+ std::vector<OUString> &rBookmarkList,
+ const sal_uInt16 nType)
+{
+ assert(rExchangeList.empty());
+
+ bool bListIdentical = true; ///< Bookmark list and exchange list are identical
+ bool bNameOK = true; ///< name is unique
+
+ for ( const auto& rBookmark : rBookmarkList )
+ {
+ OUString aNewName = rBookmark;
+
+ if( nType == 0 || nType == 2 )
+ bNameOK = mpDocSh->CheckPageName(mpViewSh->GetFrameWeld(), aNewName);
+
+ if( bNameOK && ( nType == 1 || nType == 2 ) )
+ {
+ if( mrDoc.GetObj( aNewName ) )
+ {
+ OUString aTitle(SdResId(STR_TITLE_NAMEGROUP));
+ OUString aDesc(SdResId(STR_DESC_NAMEGROUP));
+
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ ScopedVclPtr<AbstractSvxNameDialog> pDlg(pFact->CreateSvxNameDialog(mpViewSh->GetFrameWeld(), aNewName, aDesc));
+
+ pDlg->SetEditHelpId( HID_SD_NAMEDIALOG_OBJECT );
+
+ bNameOK = false;
+ pDlg->SetText( aTitle );
+
+ while( !bNameOK && pDlg->Execute() == RET_OK )
+ {
+ pDlg->GetName( aNewName );
+
+ if( !mrDoc.GetObj( aNewName ) )
+ bNameOK = true;
+ }
+ }
+ }
+
+ bListIdentical = rBookmark == aNewName;
+
+ rExchangeList.push_back(aNewName);
+
+ if (!bNameOK)
+ break;
+ }
+
+ // Exchange list is identical to bookmark list
+ if( !rExchangeList.empty() && bListIdentical )
+ rExchangeList.clear();
+
+ return bNameOK;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/sdview3.cxx b/sd/source/ui/view/sdview3.cxx
new file mode 100644
index 000000000..b72e837c4
--- /dev/null
+++ b/sd/source/ui/view/sdview3.cxx
@@ -0,0 +1,1596 @@
+/* -*- 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 <View.hxx>
+#include <com/sun/star/embed/XEmbedObjectClipboardCreator.hpp>
+#include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
+#include <com/sun/star/embed/MSOLEObjectSystemCreator.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <sot/filelist.hxx>
+#include <editeng/editdata.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xlnclit.hxx>
+#include <svx/svdpagv.hxx>
+#include <sfx2/docfile.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdundo.hxx>
+#include <svl/itempool.hxx>
+#include <sot/formats.hxx>
+#include <editeng/outliner.hxx>
+#include <svx/obj3d.hxx>
+#include <svx/e3dundo.hxx>
+#include <svx/unomodel.hxx>
+#include <svx/ImageMapInfo.hxx>
+#include <unotools/streamwrap.hxx>
+#include <vcl/graph.hxx>
+#include <vcl/metaact.hxx>
+#include <vcl/pdfread.hxx>
+#include <vcl/TypeSerializer.hxx>
+#include <svx/svxids.hrc>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <svtools/embedhlp.hxx>
+#include <osl/diagnose.h>
+#include <DrawDocShell.hxx>
+#include <fupoor.hxx>
+#include <tablefunction.hxx>
+#include <Window.hxx>
+#include <sdxfer.hxx>
+#include <sdpage.hxx>
+#include <drawdoc.hxx>
+#include <sdmod.hxx>
+#include <sdresid.hxx>
+#include <strings.hrc>
+#include <SlideSorterViewShell.hxx>
+#include <unomodel.hxx>
+#include <ViewClipboard.hxx>
+#include <sfx2/ipclient.hxx>
+#include <sfx2/classificationhelper.hxx>
+#include <comphelper/sequenceashashmap.hxx>
+#include <comphelper/storagehelper.hxx>
+#include <comphelper/processfactory.hxx>
+#include <svx/sdrhittesthelper.hxx>
+#include <svx/xbtmpit.hxx>
+#include <memory>
+
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::io;
+using namespace ::com::sun::star::datatransfer;
+using namespace ::com::sun::star::datatransfer::clipboard;
+
+namespace sd {
+
+#define CHECK_FORMAT_TRANS( _def_Type ) ( ( nFormat == (_def_Type) || nFormat == SotClipboardFormatId::NONE ) && aDataHelper.HasFormat( _def_Type ) )
+
+/*************************************************************************
+|*
+|* Paste
+|*
+\************************************************************************/
+
+namespace {
+
+struct ImpRememberOrigAndClone
+{
+ SdrObject* pOrig;
+ SdrObject* pClone;
+};
+
+}
+
+static SdrObject* ImpGetClone(std::vector<ImpRememberOrigAndClone>& aConnectorContainer, SdrObject const * pConnObj)
+{
+ for(const ImpRememberOrigAndClone& rImp : aConnectorContainer)
+ {
+ if(pConnObj == rImp.pOrig)
+ return rImp.pClone;
+ }
+ return nullptr;
+}
+
+// restrict movement to WorkArea
+static void ImpCheckInsertPos(Point& rPos, const Size& rSize, const ::tools::Rectangle& rWorkArea)
+{
+ if(rWorkArea.IsEmpty())
+ return;
+
+ ::tools::Rectangle aMarkRect(Point(rPos.X() - (rSize.Width() / 2), rPos.Y() - (rSize.Height() / 2)), rSize);
+
+ if(aMarkRect.Contains(rWorkArea))
+ return;
+
+ if(aMarkRect.Left() < rWorkArea.Left())
+ {
+ rPos.AdjustX(rWorkArea.Left() - aMarkRect.Left() );
+ }
+
+ if(aMarkRect.Right() > rWorkArea.Right())
+ {
+ rPos.AdjustX( -(aMarkRect.Right() - rWorkArea.Right()) );
+ }
+
+ if(aMarkRect.Top() < rWorkArea.Top())
+ {
+ rPos.AdjustY(rWorkArea.Top() - aMarkRect.Top() );
+ }
+
+ if(aMarkRect.Bottom() > rWorkArea.Bottom())
+ {
+ rPos.AdjustY( -(aMarkRect.Bottom() - rWorkArea.Bottom()) );
+ }
+}
+
+bool View::InsertMetaFile( const TransferableDataHelper& rDataHelper, const Point& rPos, ImageMap const * pImageMap, bool bOptimize )
+{
+ GDIMetaFile aMtf;
+
+ if( !rDataHelper.GetGDIMetaFile( SotClipboardFormatId::GDIMETAFILE, aMtf ) )
+ return false;
+
+ bool bVector = false;
+ Graphic aGraphic;
+
+ // check if metafile only contains a pixel image, if so insert a bitmap instead
+ if( bOptimize )
+ {
+ MetaAction* pAction = aMtf.FirstAction();
+ while( pAction && !bVector )
+ {
+ switch( pAction->GetType() )
+ {
+ case MetaActionType::POINT:
+ case MetaActionType::LINE:
+ case MetaActionType::RECT:
+ case MetaActionType::ROUNDRECT:
+ case MetaActionType::ELLIPSE:
+ case MetaActionType::ARC:
+ case MetaActionType::PIE:
+ case MetaActionType::CHORD:
+ case MetaActionType::POLYLINE:
+ case MetaActionType::POLYGON:
+ case MetaActionType::POLYPOLYGON:
+ case MetaActionType::TEXT:
+ case MetaActionType::TEXTARRAY:
+ case MetaActionType::STRETCHTEXT:
+ case MetaActionType::TEXTRECT:
+ case MetaActionType::GRADIENT:
+ case MetaActionType::HATCH:
+ case MetaActionType::WALLPAPER:
+ case MetaActionType::EPS:
+ case MetaActionType::TEXTLINE:
+ case MetaActionType::FLOATTRANSPARENT:
+ case MetaActionType::GRADIENTEX:
+ case MetaActionType::BMPSCALEPART:
+ case MetaActionType::BMPEXSCALEPART:
+ bVector = true;
+ break;
+ case MetaActionType::BMP:
+ case MetaActionType::BMPSCALE:
+ case MetaActionType::BMPEX:
+ case MetaActionType::BMPEXSCALE:
+ if( aGraphic.GetType() != GraphicType::NONE )
+ {
+ bVector = true;
+ }
+ else switch( pAction->GetType() )
+ {
+ case MetaActionType::BMP:
+ {
+ MetaBmpAction* pBmpAction = dynamic_cast< MetaBmpAction* >( pAction );
+ if( pBmpAction )
+ aGraphic = Graphic(BitmapEx(pBmpAction->GetBitmap()));
+ }
+ break;
+ case MetaActionType::BMPSCALE:
+ {
+ MetaBmpScaleAction* pBmpScaleAction = dynamic_cast< MetaBmpScaleAction* >( pAction );
+ if( pBmpScaleAction )
+ aGraphic = Graphic(BitmapEx(pBmpScaleAction->GetBitmap()));
+ }
+ break;
+ case MetaActionType::BMPEX:
+ {
+ MetaBmpExAction* pBmpExAction = dynamic_cast< MetaBmpExAction* >( pAction );
+ if( pBmpExAction )
+ aGraphic = Graphic(pBmpExAction->GetBitmapEx() );
+ }
+ break;
+ case MetaActionType::BMPEXSCALE:
+ {
+ MetaBmpExScaleAction* pBmpExScaleAction = dynamic_cast< MetaBmpExScaleAction* >( pAction );
+ if( pBmpExScaleAction )
+ aGraphic = Graphic( pBmpExScaleAction->GetBitmapEx() );
+ }
+ break;
+ default: break;
+ }
+ break;
+ default: break;
+ }
+
+ pAction = aMtf.NextAction();
+ }
+ }
+
+ // it is not a vector metafile but it also has no graphic?
+ if( !bVector && (aGraphic.GetType() == GraphicType::NONE) )
+ bVector = true;
+
+ // restrict movement to WorkArea
+ Point aInsertPos( rPos );
+ Size aImageSize = bVector ? aMtf.GetPrefSize() : aGraphic.GetSizePixel();
+ ImpCheckInsertPos(aInsertPos, aImageSize, GetWorkArea());
+
+ if( bVector )
+ aGraphic = Graphic( aMtf );
+
+ aGraphic.SetPrefMapMode( aMtf.GetPrefMapMode() );
+ aGraphic.SetPrefSize( aMtf.GetPrefSize() );
+ InsertGraphic( aGraphic, mnAction, aInsertPos, nullptr, pImageMap );
+
+ return true;
+}
+
+bool View::InsertData( const TransferableDataHelper& rDataHelper,
+ const Point& rPos, sal_Int8& rDnDAction, bool bDrag,
+ SotClipboardFormatId nFormat, sal_uInt16 nPage, SdrLayerID nLayer )
+{
+ maDropPos = rPos;
+ mnAction = rDnDAction;
+ mbIsDropAllowed = false;
+
+ TransferableDataHelper aDataHelper( rDataHelper );
+ SdrObject* pPickObj = nullptr;
+ SdPage* pPage = nullptr;
+ std::unique_ptr<ImageMap> pImageMap;
+ bool bReturn = false;
+ bool bLink = ( ( mnAction & DND_ACTION_LINK ) != 0 );
+ bool bCopy = ( ( ( mnAction & DND_ACTION_COPY ) != 0 ) || bLink );
+ SdrInsertFlags nPasteOptions = SdrInsertFlags::SETDEFLAYER;
+
+ if (mpViewSh != nullptr)
+ {
+ OSL_ASSERT (mpViewSh->GetViewShell()!=nullptr);
+ SfxInPlaceClient* pIpClient = mpViewSh->GetViewShell()->GetIPClient();
+ if( dynamic_cast< ::sd::slidesorter::SlideSorterViewShell *>( mpViewSh ) != nullptr
+ || (pIpClient!=nullptr && pIpClient->IsObjectInPlaceActive()))
+ nPasteOptions |= SdrInsertFlags::DONTMARK;
+ }
+
+ if( bDrag )
+ {
+ SdrPageView* pPV = nullptr;
+ pPickObj = PickObj(rPos, getHitTolLog(), pPV);
+ }
+
+ if( nPage != SDRPAGE_NOTFOUND )
+ pPage = static_cast<SdPage*>( mrDoc.GetPage( nPage ) );
+
+ SdTransferable* pOwnData = nullptr;
+ SdTransferable* pImplementation = SdTransferable::getImplementation( aDataHelper.GetTransferable() );
+
+ if(pImplementation && (rDnDAction & DND_ACTION_LINK))
+ {
+ // suppress own data when it's intention is to use it as fill information
+ pImplementation = nullptr;
+ }
+
+ bool bSelfDND = false;
+
+ // try to get own transfer data
+ if( pImplementation )
+ {
+ if( SD_MOD()->pTransferClip == pImplementation )
+ pOwnData = SD_MOD()->pTransferClip;
+ else if( SD_MOD()->pTransferDrag == pImplementation )
+ {
+ pOwnData = SD_MOD()->pTransferDrag;
+ bSelfDND = true;
+ }
+ else if( SD_MOD()->pTransferSelection == pImplementation )
+ pOwnData = SD_MOD()->pTransferSelection;
+ }
+
+ const bool bGroupUndoFromDragWithDrop = bSelfDND && mpDragSrcMarkList && IsUndoEnabled();
+ if (bGroupUndoFromDragWithDrop)
+ {
+ OUString aStr(SdResId(STR_UNDO_DRAGDROP));
+ BegUndo(aStr + " " + mpDragSrcMarkList->GetMarkDescription());
+ }
+
+ // ImageMap?
+ if( !pOwnData && aDataHelper.HasFormat( SotClipboardFormatId::SVIM ) )
+ {
+ ::tools::SvRef<SotTempStream> xStm;
+
+ if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::SVIM, xStm ) )
+ {
+ pImageMap.reset(new ImageMap);
+ // mba: clipboard always must contain absolute URLs (could be from alien source)
+ pImageMap->Read( *xStm );
+ }
+ }
+
+ bool bTable = false;
+ // check special cases for pasting table formats as RTL
+ if( !bLink && (nFormat == SotClipboardFormatId::NONE || (nFormat == SotClipboardFormatId::RTF) || (nFormat == SotClipboardFormatId::RICHTEXT)) )
+ {
+ // if the object supports rtf and there is a table involved, default is to create a table
+ bool bIsRTF = aDataHelper.HasFormat( SotClipboardFormatId::RTF );
+ if( ( bIsRTF || aDataHelper.HasFormat( SotClipboardFormatId::RICHTEXT ) )
+ && ! aDataHelper.HasFormat( SotClipboardFormatId::DRAWING ) )
+ {
+ ::tools::SvRef<SotTempStream> xStm;
+
+ if( aDataHelper.GetSotStorageStream( bIsRTF ? SotClipboardFormatId::RTF : SotClipboardFormatId::RICHTEXT, xStm ) )
+ {
+ xStm->Seek( 0 );
+
+ OStringBuffer aLine;
+ while (xStm->ReadLine(aLine))
+ {
+ size_t x = std::string_view(aLine).find( "\\trowd" );
+ if (x != std::string_view::npos)
+ {
+ bTable = true;
+ nFormat = bIsRTF ? SotClipboardFormatId::RTF : SotClipboardFormatId::RICHTEXT;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Changed the whole decision tree to be dependent of bReturn as a flag that
+ // the work was done; this allows to check multiple formats and not just fail
+ // when a CHECK_FORMAT_TRANS(*format*) detected format does not work. This is
+ // e.g. necessary for SotClipboardFormatId::BITMAP
+
+ if (!bReturn && pOwnData)
+ {
+ // Paste only if SfxClassificationHelper recommends so.
+ const SfxObjectShellRef& pSource = pOwnData->GetDocShell();
+ SfxObjectShell* pDestination = mrDoc.GetDocSh();
+ if (pSource.is() && pDestination)
+ {
+ SfxClassificationCheckPasteResult eResult = SfxClassificationHelper::CheckPaste(pSource->getDocProperties(), pDestination->getDocProperties());
+ if (!SfxClassificationHelper::ShowPasteInfo(eResult))
+ bReturn = true;
+ }
+ }
+
+ if( !bReturn && pOwnData && nFormat == SotClipboardFormatId::NONE )
+ {
+ const View* pSourceView = pOwnData->GetView();
+
+ if( pOwnData->GetDocShell().is() && pOwnData->IsPageTransferable() )
+ {
+ mpClipboard->HandlePageDrop (*pOwnData);
+ bReturn = true;
+ }
+ else if( pSourceView )
+ {
+ if( pSourceView == this )
+ {
+ // same view
+ if( nLayer != SDRLAYER_NOTFOUND )
+ {
+ // drop on layer tab bar
+ SdrLayerAdmin& rLayerAdmin = mrDoc.GetLayerAdmin();
+ SdrLayer* pLayer = rLayerAdmin.GetLayerPerID( nLayer );
+ SdrPageView* pPV = GetSdrPageView();
+ OUString aLayer = pLayer->GetName();
+
+ if( !pPV->IsLayerLocked( aLayer ) )
+ {
+ pOwnData->SetInternalMove( true );
+ SortMarkedObjects();
+
+ for( size_t nM = 0; nM < GetMarkedObjectCount(); ++nM )
+ {
+ SdrMark* pM = GetSdrMarkByIndex( nM );
+ SdrObject* pO = pM->GetMarkedSdrObj();
+
+ if( pO )
+ {
+ // #i11702#
+ if( IsUndoEnabled() )
+ {
+ BegUndo(SdResId(STR_MODIFYLAYER));
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoObjectLayerChange(*pO, pO->GetLayer(), nLayer));
+ EndUndo();
+ }
+
+ pO->SetLayer( nLayer );
+ }
+ }
+
+ bReturn = true;
+ }
+ }
+ else
+ {
+ SdrPageView* pPV = GetSdrPageView();
+ bool bDropOnTabBar = true;
+
+ if( !pPage && pPV->GetPage()->GetPageNum() != mnDragSrcPgNum )
+ {
+ pPage = static_cast<SdPage*>( pPV->GetPage() );
+ bDropOnTabBar = false;
+ }
+
+ if( pPage )
+ {
+ // drop on other page
+ OUString aActiveLayer = GetActiveLayer();
+
+ if( !pPV->IsLayerLocked( aActiveLayer ) )
+ {
+ if( !IsPresObjSelected() )
+ {
+ SdrMarkList* pMarkList;
+
+ if( (mnDragSrcPgNum != SDRPAGE_NOTFOUND) && (mnDragSrcPgNum != pPV->GetPage()->GetPageNum()) )
+ {
+ pMarkList = mpDragSrcMarkList.get();
+ }
+ else
+ {
+ // actual mark list is used
+ pMarkList = new SdrMarkList( GetMarkedObjectList());
+ }
+
+ pMarkList->ForceSort();
+
+ // stuff to remember originals and clones
+ std::vector<ImpRememberOrigAndClone> aConnectorContainer;
+ size_t nConnectorCount = 0;
+ Point aCurPos;
+
+ // calculate real position of current
+ // source objects, if necessary (#103207)
+ if( pOwnData == SD_MOD()->pTransferSelection )
+ {
+ ::tools::Rectangle aCurBoundRect;
+
+ if( pMarkList->TakeBoundRect( pPV, aCurBoundRect ) )
+ aCurPos = aCurBoundRect.TopLeft();
+ else
+ aCurPos = pOwnData->GetStartPos();
+ }
+ else
+ aCurPos = pOwnData->GetStartPos();
+
+ const Size aVector( maDropPos.X() - aCurPos.X(), maDropPos.Y() - aCurPos.Y() );
+
+ std::unordered_set<rtl::OUString> aNameSet;
+ for(size_t a = 0; a < pMarkList->GetMarkCount(); ++a)
+ {
+ SdrMark* pM = pMarkList->GetMark(a);
+ SdrObject* pObj(pM->GetMarkedSdrObj()->CloneSdrObject(pPage->getSdrModelFromSdrPage()));
+
+ if(pObj)
+ {
+ if(!bDropOnTabBar)
+ {
+ // do a NbcMove(...) instead of setting SnapRects here
+ pObj->NbcMove(aVector);
+ }
+
+ SdrObject* pMarkParent = pM->GetMarkedSdrObj()->getParentSdrObjectFromSdrObject();
+ if (bCopy || (pMarkParent && pMarkParent->IsGroupObject()))
+ pPage->InsertObjectThenMakeNameUnique(pObj, aNameSet);
+ else
+ pPage->InsertObject(pObj);
+
+ if( IsUndoEnabled() )
+ {
+ BegUndo(SdResId(STR_UNDO_DRAGDROP));
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoNewObject(*pObj));
+ EndUndo();
+ }
+
+ ImpRememberOrigAndClone aRem;
+ aRem.pOrig = pM->GetMarkedSdrObj();
+ aRem.pClone = pObj;
+ aConnectorContainer.push_back(aRem);
+
+ if(dynamic_cast< SdrEdgeObj *>( pObj ) != nullptr)
+ nConnectorCount++;
+ }
+ }
+
+ // try to re-establish connections at clones
+ if(nConnectorCount)
+ {
+ for(size_t a = 0; a < aConnectorContainer.size(); ++a)
+ {
+ ImpRememberOrigAndClone* pRem = &aConnectorContainer[a];
+
+ if(auto pCloneEdge = dynamic_cast<SdrEdgeObj *>( pRem->pClone ))
+ {
+ SdrEdgeObj* pOrigEdge = static_cast<SdrEdgeObj*>(pRem->pOrig);
+
+ // test first connection
+ SdrObjConnection& rConn0 = pOrigEdge->GetConnection(false);
+ SdrObject* pConnObj = rConn0.GetObject();
+ if(pConnObj)
+ {
+ SdrObject* pConnClone = ImpGetClone(aConnectorContainer, pConnObj);
+ if(pConnClone)
+ {
+ // if dest obj was cloned, too, re-establish connection
+ pCloneEdge->ConnectToNode(false, pConnClone);
+ pCloneEdge->GetConnection(false).SetConnectorId(rConn0.GetConnectorId());
+ }
+ else
+ {
+ // set position of connection point of original connected object
+ const SdrGluePointList* pGlueList = pConnObj->GetGluePointList();
+ if(pGlueList)
+ {
+ sal_uInt16 nInd = pGlueList->FindGluePoint(rConn0.GetConnectorId());
+
+ if(SDRGLUEPOINT_NOTFOUND != nInd)
+ {
+ const SdrGluePoint& rGluePoint = (*pGlueList)[nInd];
+ Point aPosition = rGluePoint.GetAbsolutePos(*pConnObj);
+ aPosition.AdjustX(aVector.Width() );
+ aPosition.AdjustY(aVector.Height() );
+ pCloneEdge->SetTailPoint(false, aPosition);
+ }
+ }
+ }
+ }
+
+ // test second connection
+ SdrObjConnection& rConn1 = pOrigEdge->GetConnection(true);
+ pConnObj = rConn1.GetObject();
+ if(pConnObj)
+ {
+ SdrObject* pConnClone = ImpGetClone(aConnectorContainer, pConnObj);
+ if(pConnClone)
+ {
+ // if dest obj was cloned, too, re-establish connection
+ pCloneEdge->ConnectToNode(true, pConnClone);
+ pCloneEdge->GetConnection(true).SetConnectorId(rConn1.GetConnectorId());
+ }
+ else
+ {
+ // set position of connection point of original connected object
+ const SdrGluePointList* pGlueList = pConnObj->GetGluePointList();
+ if(pGlueList)
+ {
+ sal_uInt16 nInd = pGlueList->FindGluePoint(rConn1.GetConnectorId());
+
+ if(SDRGLUEPOINT_NOTFOUND != nInd)
+ {
+ const SdrGluePoint& rGluePoint = (*pGlueList)[nInd];
+ Point aPosition = rGluePoint.GetAbsolutePos(*pConnObj);
+ aPosition.AdjustX(aVector.Width() );
+ aPosition.AdjustY(aVector.Height() );
+ pCloneEdge->SetTailPoint(true, aPosition);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if( pMarkList != mpDragSrcMarkList.get() )
+ delete pMarkList;
+
+ bReturn = true;
+ }
+ else
+ {
+ maDropErrorIdle.Start();
+ bReturn = false;
+ }
+ }
+ }
+ else
+ {
+ pOwnData->SetInternalMove( true );
+ MoveAllMarked( Size( maDropPos.X() - pOwnData->GetStartPos().X(),
+ maDropPos.Y() - pOwnData->GetStartPos().Y() ), bCopy );
+ bReturn = true;
+ }
+ }
+ }
+ else
+ {
+ // different views
+ if( !pSourceView->IsPresObjSelected() )
+ {
+ // model is owned by from AllocModel() created DocShell
+ SdDrawDocument* pSourceDoc = static_cast<SdDrawDocument*>( pSourceView->GetModel() );
+ pSourceDoc->CreatingDataObj( pOwnData );
+ SdDrawDocument* pModel = static_cast<SdDrawDocument*>( pSourceView->CreateMarkedObjModel().release() );
+ bReturn = Paste(*pModel, maDropPos, pPage, nPasteOptions);
+
+ if( !pPage )
+ pPage = static_cast<SdPage*>( GetSdrPageView()->GetPage() );
+
+ OUString aLayout = pPage->GetLayoutName();
+ sal_Int32 nPos = aLayout.indexOf(SD_LT_SEPARATOR);
+ if (nPos != -1)
+ aLayout = aLayout.copy(0, nPos);
+ pPage->SetPresentationLayout( aLayout, false, false );
+ pSourceDoc->CreatingDataObj( nullptr );
+ }
+ else
+ {
+ maDropErrorIdle.Start();
+ bReturn = false;
+ }
+ }
+ }
+ else
+ {
+ SdDrawDocument* pWorkModel = const_cast<SdDrawDocument*>(pOwnData->GetWorkDocument());
+ SdPage* pWorkPage = pWorkModel->GetSdPage( 0, PageKind::Standard );
+
+ pWorkPage->SetSdrObjListRectsDirty();
+
+ // #i120393# Clipboard data uses full object geometry range
+ const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
+
+ maDropPos.setX( pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 ) );
+ maDropPos.setY( pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 ) );
+
+ // delete pages, that are not of any interest for us
+ for( ::tools::Long i = pWorkModel->GetPageCount() - 1; i >= 0; i-- )
+ {
+ SdPage* pP = static_cast< SdPage* >( pWorkModel->GetPage( static_cast<sal_uInt16>(i) ) );
+
+ if( pP->GetPageKind() != PageKind::Standard )
+ pWorkModel->DeletePage( static_cast<sal_uInt16>(i) );
+ }
+
+ bReturn = Paste(*pWorkModel, maDropPos, pPage, nPasteOptions);
+
+ if( !pPage )
+ pPage = static_cast<SdPage*>( GetSdrPageView()->GetPage() );
+
+ OUString aLayout = pPage->GetLayoutName();
+ sal_Int32 nPos = aLayout.indexOf(SD_LT_SEPARATOR);
+ if (nPos != -1)
+ aLayout = aLayout.copy(0, nPos);
+ pPage->SetPresentationLayout( aLayout, false, false );
+ }
+ }
+
+ if(!bReturn && CHECK_FORMAT_TRANS( SotClipboardFormatId::PDF ))
+ {
+ ::tools::SvRef<SotTempStream> xStm;
+ if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::PDF, xStm ) )
+ {
+ Point aInsertPos(rPos);
+ Graphic aGraphic;
+ if (vcl::ImportPDF(*xStm, aGraphic))
+ {
+ std::unique_ptr<sal_uInt8[]> pGraphicContent;
+
+ const sal_Int32 nGraphicContentSize(xStm->Tell());
+ pGraphicContent.reset(new sal_uInt8[nGraphicContentSize]);
+ xStm->Seek(0);
+ xStm->ReadBytes(pGraphicContent.get(), nGraphicContentSize);
+ aGraphic.SetGfxLink(std::make_shared<GfxLink>(std::move(pGraphicContent), nGraphicContentSize, GfxLinkType::NativePdf));
+
+ InsertGraphic(aGraphic, mnAction, aInsertPos, nullptr, nullptr);
+ bReturn = true;
+ }
+ }
+ }
+
+ if(!bReturn && CHECK_FORMAT_TRANS( SotClipboardFormatId::DRAWING ))
+ {
+ ::tools::SvRef<SotTempStream> xStm;
+
+ if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::DRAWING, xStm ) )
+ {
+ DrawDocShellRef xShell = new DrawDocShell(SfxObjectCreateMode::INTERNAL, false, DocumentType::Impress);
+ xShell->DoInitNew();
+
+ SdDrawDocument* pModel = xShell->GetDoc();
+ pModel->InsertPage(pModel->AllocPage(false).get());
+
+ Reference< XComponent > xComponent = xShell->GetModel();
+ xStm->Seek( 0 );
+
+ css::uno::Reference< css::io::XInputStream > xInputStream( new utl::OInputStreamWrapper( *xStm ) );
+ bReturn = SvxDrawingLayerImport( pModel, xInputStream, xComponent, "com.sun.star.comp.Impress.XMLOasisImporter" );
+
+ if( pModel->GetPageCount() == 0 )
+ {
+ OSL_FAIL("empty or invalid drawing xml document on clipboard!" );
+ }
+ else
+ {
+ bool bChanged = false;
+
+ if( bReturn )
+ {
+ if( pModel->GetSdPage( 0, PageKind::Standard )->GetObjCount() == 1 )
+ {
+ // only one object
+ SdrObject* pObj = pModel->GetSdPage( 0, PageKind::Standard )->GetObj( 0 );
+ SdrPageView* pPV = nullptr;
+ SdrObject* pPickObj2 = PickObj(rPos, getHitTolLog(), pPV);
+
+ if( ( mnAction & DND_ACTION_MOVE ) && pPickObj2 && pObj )
+ {
+ // replace object
+ SdrPage* pWorkPage = GetSdrPageView()->GetPage();
+ SdrObject* pNewObj(pObj->CloneSdrObject(pWorkPage->getSdrModelFromSdrPage()));
+ ::tools::Rectangle aPickObjRect( pPickObj2->GetCurrentBoundRect() );
+ Size aPickObjSize( aPickObjRect.GetSize() );
+ Point aVec( aPickObjRect.TopLeft() );
+ ::tools::Rectangle aObjRect( pNewObj->GetCurrentBoundRect() );
+ Size aObjSize( aObjRect.GetSize() );
+
+ Fraction aScaleWidth( aPickObjSize.Width(), aObjSize.Width() );
+ Fraction aScaleHeight( aPickObjSize.Height(), aObjSize.Height() );
+ pNewObj->NbcResize( aObjRect.TopLeft(), aScaleWidth, aScaleHeight );
+
+ aVec -= aObjRect.TopLeft();
+ pNewObj->NbcMove( Size( aVec.X(), aVec.Y() ) );
+
+ const bool bUndo = IsUndoEnabled();
+
+ if( bUndo )
+ BegUndo(SdResId(STR_UNDO_DRAGDROP));
+ pNewObj->NbcSetLayer( pPickObj->GetLayer() );
+ pWorkPage->InsertObject( pNewObj );
+ if( bUndo )
+ {
+ AddUndo( mrDoc.GetSdrUndoFactory().CreateUndoNewObject( *pNewObj ) );
+ AddUndo( mrDoc.GetSdrUndoFactory().CreateUndoDeleteObject( *pPickObj2 ) );
+ }
+ pWorkPage->RemoveObject( pPickObj2->GetOrdNum() );
+
+ if( bUndo )
+ {
+ EndUndo();
+ }
+ else
+ {
+ SdrObject::Free(pPickObj2 );
+ }
+ bChanged = true;
+ mnAction = DND_ACTION_COPY;
+ }
+ else if( ( mnAction & DND_ACTION_LINK ) && pPickObj && pObj &&
+ dynamic_cast< const SdrGrafObj *>( pPickObj ) == nullptr &&
+ dynamic_cast< const SdrOle2Obj *>( pPickObj ) == nullptr )
+ {
+ SfxItemSet aSet( mrDoc.GetPool() );
+
+ // set new attributes to object
+ const bool bUndo = IsUndoEnabled();
+ if( bUndo )
+ {
+ BegUndo( SdResId(STR_UNDO_DRAGDROP) );
+ AddUndo( mrDoc.GetSdrUndoFactory().CreateUndoAttrObject( *pPickObj ) );
+ }
+
+ aSet.Put( pObj->GetMergedItemSet() );
+
+ /* Do not take over corner radius. There are
+ gradients (rectangles) in the gallery with corner
+ radius of 0. We should not use that on the
+ object. */
+ aSet.ClearItem( SDRATTR_CORNER_RADIUS );
+
+ const SdrGrafObj* pSdrGrafObj = dynamic_cast< const SdrGrafObj* >(pObj);
+
+ if(pSdrGrafObj)
+ {
+ // If we have a graphic as source object, use its graphic
+ // content as fill style
+ aSet.Put(XFillStyleItem(drawing::FillStyle_BITMAP));
+ aSet.Put(XFillBitmapItem(pSdrGrafObj->GetGraphic()));
+ }
+
+ pPickObj->SetMergedItemSetAndBroadcast( aSet );
+
+ if( dynamic_cast< E3dObject *>( pPickObj ) != nullptr && dynamic_cast< E3dObject *>( pObj ) != nullptr )
+ {
+ // handle 3D attribute in addition
+ SfxItemSetFixed<SID_ATTR_3D_START, SID_ATTR_3D_END> aNewSet( mrDoc.GetPool() );
+ SfxItemSetFixed<SID_ATTR_3D_START, SID_ATTR_3D_END> aOldSet( mrDoc.GetPool() );
+
+ aOldSet.Put(pPickObj->GetMergedItemSet());
+ aNewSet.Put( pObj->GetMergedItemSet() );
+
+ if( bUndo )
+ AddUndo(
+ std::make_unique<E3dAttributesUndoAction>(
+ *static_cast< E3dObject* >(pPickObj),
+ aNewSet,
+ aOldSet));
+ pPickObj->SetMergedItemSetAndBroadcast( aNewSet );
+ }
+
+ if( bUndo )
+ EndUndo();
+ bChanged = true;
+ }
+ }
+ }
+
+ if( !bChanged )
+ {
+ SdrPage* pWorkPage = pModel->GetSdPage( 0, PageKind::Standard );
+
+ pWorkPage->SetSdrObjListRectsDirty();
+
+ if( pOwnData )
+ {
+ // #i120393# Clipboard data uses full object geometry range
+ const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
+
+ maDropPos.setX( pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 ) );
+ maDropPos.setY( pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 ) );
+ }
+
+ bReturn = Paste(*pModel, maDropPos, pPage, nPasteOptions);
+ }
+
+ xShell->DoClose();
+ }
+ }
+ }
+
+ if(!bReturn && CHECK_FORMAT_TRANS(SotClipboardFormatId::SBA_FIELDDATAEXCHANGE))
+ {
+ OUString aOUString;
+
+ if( aDataHelper.GetString( SotClipboardFormatId::SBA_FIELDDATAEXCHANGE, aOUString ) )
+ {
+ SdrObjectUniquePtr pObj = CreateFieldControl( aOUString );
+
+ if( pObj )
+ {
+ ::tools::Rectangle aRect( pObj->GetLogicRect() );
+ Size aSize( aRect.GetSize() );
+
+ maDropPos.AdjustX( -( aSize.Width() >> 1 ) );
+ maDropPos.AdjustY( -( aSize.Height() >> 1 ) );
+
+ aRect.SetPos( maDropPos );
+ pObj->SetLogicRect( aRect );
+ InsertObjectAtView( pObj.release(), *GetSdrPageView(), SdrInsertFlags::SETDEFLAYER );
+ bReturn = true;
+ }
+ }
+ }
+
+ if(!bReturn &&
+ !bLink &&
+ (CHECK_FORMAT_TRANS(SotClipboardFormatId::EMBED_SOURCE) || CHECK_FORMAT_TRANS(SotClipboardFormatId::EMBEDDED_OBJ)) &&
+ aDataHelper.HasFormat(SotClipboardFormatId::OBJECTDESCRIPTOR))
+ {
+ //TODO/LATER: is it possible that this format is binary?! (from old versions of SO)
+ uno::Reference < io::XInputStream > xStm;
+ TransferableObjectDescriptor aObjDesc;
+
+ if (aDataHelper.GetTransferableObjectDescriptor(SotClipboardFormatId::OBJECTDESCRIPTOR, aObjDesc))
+ {
+ OUString aDocShellID = SfxObjectShell::CreateShellID(mrDoc.GetDocSh());
+ xStm = aDataHelper.GetInputStream(nFormat != SotClipboardFormatId::NONE ? nFormat : SotClipboardFormatId::EMBED_SOURCE, aDocShellID);
+ if (!xStm.is())
+ xStm = aDataHelper.GetInputStream(SotClipboardFormatId::EMBEDDED_OBJ, aDocShellID);
+ }
+
+ if (xStm.is())
+ {
+ if( mrDoc.GetDocSh() && ( mrDoc.GetDocSh()->GetClassName() == aObjDesc.maClassName ) )
+ {
+ uno::Reference < embed::XStorage > xStore( ::comphelper::OStorageHelper::GetStorageFromInputStream( xStm ) );
+ ::sd::DrawDocShellRef xDocShRef( new ::sd::DrawDocShell( SfxObjectCreateMode::EMBEDDED, true, mrDoc.GetDocumentType() ) );
+
+ // mba: BaseURL doesn't make sense for clipboard functionality
+ SfxMedium *pMedium = new SfxMedium( xStore, OUString() );
+ if( xDocShRef->DoLoad( pMedium ) )
+ {
+ SdDrawDocument* pModel = xDocShRef->GetDoc();
+ SdPage* pWorkPage = pModel->GetSdPage( 0, PageKind::Standard );
+
+ pWorkPage->SetSdrObjListRectsDirty();
+
+ if( pOwnData )
+ {
+ // #i120393# Clipboard data uses full object geometry range
+ const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
+
+ maDropPos.setX( pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 ) );
+ maDropPos.setY( pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 ) );
+ }
+
+ // delete pages, that are not of any interest for us
+ for( ::tools::Long i = pModel->GetPageCount() - 1; i >= 0; i-- )
+ {
+ SdPage* pP = static_cast< SdPage* >( pModel->GetPage( static_cast<sal_uInt16>(i) ) );
+
+ if( pP->GetPageKind() != PageKind::Standard )
+ pModel->DeletePage( static_cast<sal_uInt16>(i) );
+ }
+
+ bReturn = Paste(*pModel, maDropPos, pPage, nPasteOptions);
+
+ if( !pPage )
+ pPage = static_cast<SdPage*>(GetSdrPageView()->GetPage());
+
+ OUString aLayout = pPage->GetLayoutName();
+ sal_Int32 nPos = aLayout.indexOf(SD_LT_SEPARATOR);
+ if (nPos != -1)
+ aLayout = aLayout.copy(0, nPos);
+ pPage->SetPresentationLayout( aLayout, false, false );
+ }
+
+ xDocShRef->DoClose();
+ xDocShRef.clear();
+
+ }
+ else
+ {
+ OUString aName;
+ uno::Reference < embed::XEmbeddedObject > xObj = mpDocSh->GetEmbeddedObjectContainer().InsertEmbeddedObject( xStm, aName );
+ if ( xObj.is() )
+ {
+ svt::EmbeddedObjectRef aObjRef( xObj, aObjDesc.mnViewAspect );
+
+ Size aSize;
+ if ( aObjDesc.mnViewAspect == embed::Aspects::MSOLE_ICON )
+ {
+ if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() )
+ aSize = aObjDesc.maSize;
+ else
+ {
+ MapMode aMapMode( MapUnit::Map100thMM );
+ aSize = aObjRef.GetSize( &aMapMode );
+ }
+ }
+ else
+ {
+ awt::Size aSz;
+ MapUnit aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( aObjDesc.mnViewAspect ) );
+ if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() )
+ {
+ Size aTmp(OutputDevice::LogicToLogic(aObjDesc.maSize, MapMode(MapUnit::Map100thMM), MapMode(aMapUnit)));
+ aSz.Width = aTmp.Width();
+ aSz.Height = aTmp.Height();
+ xObj->setVisualAreaSize( aObjDesc.mnViewAspect, aSz );
+ }
+
+ try
+ {
+ aSz = xObj->getVisualAreaSize( aObjDesc.mnViewAspect );
+ }
+ catch( embed::NoVisualAreaSizeException& )
+ {
+ // if the size still was not set the default size will be set later
+ }
+
+ aSize = Size( aSz.Width, aSz.Height );
+
+ if( !aSize.Width() || !aSize.Height() )
+ {
+ aSize.setWidth( 14100 );
+ aSize.setHeight( 10000 );
+ aSize = OutputDevice::LogicToLogic(Size(14100, 10000), MapMode(MapUnit::Map100thMM), MapMode(aMapUnit));
+ aSz.Width = aSize.Width();
+ aSz.Height = aSize.Height();
+ xObj->setVisualAreaSize( aObjDesc.mnViewAspect, aSz );
+ }
+
+ aSize = OutputDevice::LogicToLogic(aSize, MapMode(aMapUnit), MapMode(MapUnit::Map100thMM));
+ }
+
+ Size aMaxSize( mrDoc.GetMaxObjSize() );
+
+ maDropPos.AdjustX( -(std::min( aSize.Width(), aMaxSize.Width() ) >> 1) );
+ maDropPos.AdjustY( -(std::min( aSize.Height(), aMaxSize.Height() ) >> 1) );
+
+ ::tools::Rectangle aRect( maDropPos, aSize );
+ SdrOle2Obj* pObj = new SdrOle2Obj(
+ getSdrModelFromSdrView(),
+ aObjRef,
+ aName,
+ aRect);
+ SdrPageView* pPV = GetSdrPageView();
+ SdrInsertFlags nOptions = SdrInsertFlags::SETDEFLAYER;
+
+ if (mpViewSh!=nullptr)
+ {
+ OSL_ASSERT (mpViewSh->GetViewShell()!=nullptr);
+ SfxInPlaceClient* pIpClient
+ = mpViewSh->GetViewShell()->GetIPClient();
+ if (pIpClient!=nullptr && pIpClient->IsObjectInPlaceActive())
+ nOptions |= SdrInsertFlags::DONTMARK;
+ }
+
+ // bInserted of false means that pObj has been deleted
+ bool bInserted = InsertObjectAtView( pObj, *pPV, nOptions );
+
+ if (bInserted && pImageMap)
+ pObj->AppendUserData( std::unique_ptr<SdrObjUserData>(new SvxIMapInfo( *pImageMap )) );
+
+ if (bInserted && pObj->IsChart())
+ {
+ bool bDisableDataTableDialog = false;
+ svt::EmbeddedObjectRef::TryRunningState( xObj );
+ uno::Reference< beans::XPropertySet > xProps( xObj->getComponent(), uno::UNO_QUERY );
+ if ( xProps.is() &&
+ ( xProps->getPropertyValue( "DisableDataTableDialog" ) >>= bDisableDataTableDialog ) &&
+ bDisableDataTableDialog )
+ {
+ xProps->setPropertyValue( "DisableDataTableDialog" , uno::Any( false ) );
+ xProps->setPropertyValue( "DisableComplexChartTypes" , uno::Any( false ) );
+ uno::Reference< util::XModifiable > xModifiable( xProps, uno::UNO_QUERY );
+ if ( xModifiable.is() )
+ {
+ xModifiable->setModified( true );
+ }
+ }
+ }
+
+ bReturn = true;
+ }
+ }
+ }
+ }
+
+ if(!bReturn &&
+ !bLink &&
+ (CHECK_FORMAT_TRANS(SotClipboardFormatId::EMBEDDED_OBJ_OLE) || CHECK_FORMAT_TRANS(SotClipboardFormatId::EMBED_SOURCE_OLE)) &&
+ aDataHelper.HasFormat(SotClipboardFormatId::OBJECTDESCRIPTOR_OLE))
+ {
+ // online insert ole if format is forced or no gdi metafile is available
+ if( (nFormat != SotClipboardFormatId::NONE) || !aDataHelper.HasFormat( SotClipboardFormatId::GDIMETAFILE ) )
+ {
+ uno::Reference < io::XInputStream > xStm;
+ TransferableObjectDescriptor aObjDesc;
+
+ if ( aDataHelper.GetTransferableObjectDescriptor( SotClipboardFormatId::OBJECTDESCRIPTOR_OLE, aObjDesc ) )
+ {
+ uno::Reference < embed::XEmbeddedObject > xObj;
+ OUString aName;
+
+ xStm = aDataHelper.GetInputStream(nFormat != SotClipboardFormatId::NONE ? nFormat : SotClipboardFormatId::EMBED_SOURCE_OLE, OUString());
+ if (!xStm.is())
+ xStm = aDataHelper.GetInputStream(SotClipboardFormatId::EMBEDDED_OBJ_OLE, OUString());
+
+ if (xStm.is())
+ {
+ xObj = mpDocSh->GetEmbeddedObjectContainer().InsertEmbeddedObject( xStm, aName );
+ }
+ else
+ {
+ try
+ {
+ uno::Reference< embed::XStorage > xTmpStor = ::comphelper::OStorageHelper::GetTemporaryStorage();
+ uno::Reference < embed::XEmbedObjectClipboardCreator > xClipboardCreator =
+ embed::MSOLEObjectSystemCreator::create( ::comphelper::getProcessComponentContext() );
+
+ embed::InsertedObjectInfo aInfo = xClipboardCreator->createInstanceInitFromClipboard(
+ xTmpStor,
+ "DummyName" ,
+ uno::Sequence< beans::PropertyValue >() );
+
+ // TODO/LATER: in future InsertedObjectInfo will be used to get container related information
+ // for example whether the object should be an iconified one
+ xObj = aInfo.Object;
+ if ( xObj.is() )
+ mpDocSh->GetEmbeddedObjectContainer().InsertEmbeddedObject( xObj, aName );
+ }
+ catch( uno::Exception& )
+ {}
+ }
+
+ if ( xObj.is() )
+ {
+ svt::EmbeddedObjectRef aObjRef( xObj, aObjDesc.mnViewAspect );
+
+ // try to get the replacement image from the clipboard
+ Graphic aGraphic;
+ SotClipboardFormatId nGrFormat = SotClipboardFormatId::NONE;
+
+// (for Selection Manager in Trusted Solaris)
+#ifndef __sun
+ if( aDataHelper.GetGraphic( SotClipboardFormatId::SVXB, aGraphic ) )
+ nGrFormat = SotClipboardFormatId::SVXB;
+ else if( aDataHelper.GetGraphic( SotClipboardFormatId::GDIMETAFILE, aGraphic ) )
+ nGrFormat = SotClipboardFormatId::GDIMETAFILE;
+ else if( aDataHelper.GetGraphic( SotClipboardFormatId::BITMAP, aGraphic ) )
+ nGrFormat = SotClipboardFormatId::BITMAP;
+#endif
+
+ // insert replacement image ( if there is one ) into the object helper
+ if ( nGrFormat != SotClipboardFormatId::NONE )
+ {
+ datatransfer::DataFlavor aDataFlavor;
+ SotExchange::GetFormatDataFlavor( nGrFormat, aDataFlavor );
+ aObjRef.SetGraphic( aGraphic, aDataFlavor.MimeType );
+ }
+
+ Size aSize;
+ if ( aObjDesc.mnViewAspect == embed::Aspects::MSOLE_ICON )
+ {
+ if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() )
+ aSize = aObjDesc.maSize;
+ else
+ {
+ MapMode aMapMode( MapUnit::Map100thMM );
+ aSize = aObjRef.GetSize( &aMapMode );
+ }
+ }
+ else
+ {
+ MapUnit aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( aObjDesc.mnViewAspect ) );
+
+ awt::Size aSz;
+ try{
+ aSz = xObj->getVisualAreaSize( aObjDesc.mnViewAspect );
+ }
+ catch( embed::NoVisualAreaSizeException& )
+ {
+ // the default size will be set later
+ }
+
+ if( aObjDesc.maSize.Width() && aObjDesc.maSize.Height() )
+ {
+ Size aTmp(OutputDevice::LogicToLogic(aObjDesc.maSize, MapMode(MapUnit::Map100thMM), MapMode(aMapUnit)));
+ if ( aSz.Width != aTmp.Width() || aSz.Height != aTmp.Height() )
+ {
+ aSz.Width = aTmp.Width();
+ aSz.Height = aTmp.Height();
+ xObj->setVisualAreaSize( aObjDesc.mnViewAspect, aSz );
+ }
+ }
+
+ aSize = Size( aSz.Width, aSz.Height );
+
+ if( !aSize.Width() || !aSize.Height() )
+ {
+ aSize = OutputDevice::LogicToLogic(Size(14100, 10000), MapMode(MapUnit::Map100thMM), MapMode(aMapUnit));
+ aSz.Width = aSize.Width();
+ aSz.Height = aSize.Height();
+ xObj->setVisualAreaSize( aObjDesc.mnViewAspect, aSz );
+ }
+
+ aSize = OutputDevice::LogicToLogic(aSize, MapMode(aMapUnit), MapMode(MapUnit::Map100thMM));
+ }
+
+ Size aMaxSize( mrDoc.GetMaxObjSize() );
+
+ maDropPos.AdjustX( -(std::min( aSize.Width(), aMaxSize.Width() ) >> 1) );
+ maDropPos.AdjustY( -(std::min( aSize.Height(), aMaxSize.Height() ) >> 1) );
+
+ ::tools::Rectangle aRect( maDropPos, aSize );
+ SdrOle2Obj* pObj = new SdrOle2Obj(
+ getSdrModelFromSdrView(),
+ aObjRef,
+ aName,
+ aRect);
+ SdrPageView* pPV = GetSdrPageView();
+ SdrInsertFlags nOptions = SdrInsertFlags::SETDEFLAYER;
+
+ if (mpViewSh!=nullptr)
+ {
+ OSL_ASSERT (mpViewSh->GetViewShell()!=nullptr);
+ SfxInPlaceClient* pIpClient
+ = mpViewSh->GetViewShell()->GetIPClient();
+ if (pIpClient!=nullptr && pIpClient->IsObjectInPlaceActive())
+ nOptions |= SdrInsertFlags::DONTMARK;
+ }
+
+ bReturn = InsertObjectAtView( pObj, *pPV, nOptions );
+
+ if (bReturn)
+ {
+ if( pImageMap )
+ pObj->AppendUserData( std::unique_ptr<SdrObjUserData>(new SvxIMapInfo( *pImageMap )) );
+
+ // let the object stay in loaded state after insertion
+ pObj->Unload();
+ }
+ }
+ }
+ }
+
+ if( !bReturn && aDataHelper.HasFormat( SotClipboardFormatId::GDIMETAFILE ) )
+ {
+ // if no object was inserted, insert a picture
+ InsertMetaFile( aDataHelper, rPos, pImageMap.get(), true );
+ bReturn = true;
+ }
+ }
+
+ if(!bReturn && (!bLink || pPickObj) && CHECK_FORMAT_TRANS(SotClipboardFormatId::SVXB))
+ {
+ ::tools::SvRef<SotTempStream> xStm;
+
+ if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::SVXB, xStm ) )
+ {
+ Point aInsertPos( rPos );
+ Graphic aGraphic;
+
+ TypeSerializer aSerializer(*xStm);
+ aSerializer.readGraphic(aGraphic);
+
+ if( pOwnData && pOwnData->GetWorkDocument() )
+ {
+ const SdDrawDocument* pWorkModel = pOwnData->GetWorkDocument();
+ SdrPage* pWorkPage = const_cast<SdrPage*>( ( pWorkModel->GetPageCount() > 1 ) ?
+ pWorkModel->GetSdPage( 0, PageKind::Standard ) :
+ pWorkModel->GetPage( 0 ) );
+
+ pWorkPage->SetSdrObjListRectsDirty();
+
+ // #i120393# Clipboard data uses full object geometry range
+ const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
+
+ aInsertPos.setX( pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 ) );
+ aInsertPos.setY( pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 ) );
+ }
+
+ // restrict movement to WorkArea
+ Size aImageMapSize = OutputDevice::LogicToLogic(aGraphic.GetPrefSize(),
+ aGraphic.GetPrefMapMode(), MapMode(MapUnit::Map100thMM));
+
+ ImpCheckInsertPos(aInsertPos, aImageMapSize, GetWorkArea());
+
+ InsertGraphic( aGraphic, mnAction, aInsertPos, nullptr, pImageMap.get() );
+ bReturn = true;
+ }
+ }
+
+ if(!bReturn && (!bLink || pPickObj) && CHECK_FORMAT_TRANS(SotClipboardFormatId::GDIMETAFILE))
+ {
+ Point aInsertPos( rPos );
+
+ if( pOwnData && pOwnData->GetWorkDocument() )
+
+ {
+ const SdDrawDocument* pWorkModel = pOwnData->GetWorkDocument();
+ SdrPage* pWorkPage = const_cast<SdrPage*>( ( pWorkModel->GetPageCount() > 1 ) ?
+ pWorkModel->GetSdPage( 0, PageKind::Standard ) :
+ pWorkModel->GetPage( 0 ) );
+
+ pWorkPage->SetSdrObjListRectsDirty();
+
+ // #i120393# Clipboard data uses full object geometry range
+ const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
+
+ aInsertPos.setX( pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 ) );
+ aInsertPos.setY( pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 ) );
+ }
+
+ bReturn = InsertMetaFile( aDataHelper, aInsertPos, pImageMap.get(), nFormat == SotClipboardFormatId::NONE );
+ }
+
+ if(!bReturn && (!bLink || pPickObj) && CHECK_FORMAT_TRANS(SotClipboardFormatId::BITMAP))
+ {
+ BitmapEx aBmpEx;
+
+ // get basic Bitmap data
+ aDataHelper.GetBitmapEx(SotClipboardFormatId::BITMAP, aBmpEx);
+
+ if(aBmpEx.IsEmpty())
+ {
+ // if this did not work, try to get graphic formats and convert these to bitmap
+ Graphic aGraphic;
+
+ if(aDataHelper.GetGraphic(SotClipboardFormatId::GDIMETAFILE, aGraphic))
+ {
+ aBmpEx = aGraphic.GetBitmapEx();
+ }
+ else if(aDataHelper.GetGraphic(SotClipboardFormatId::SVXB, aGraphic))
+ {
+ aBmpEx = aGraphic.GetBitmapEx();
+ }
+ else if(aDataHelper.GetGraphic(SotClipboardFormatId::BITMAP, aGraphic))
+ {
+ aBmpEx = aGraphic.GetBitmapEx();
+ }
+ }
+
+ if(!aBmpEx.IsEmpty())
+ {
+ Point aInsertPos( rPos );
+
+ if( pOwnData && pOwnData->GetWorkDocument() )
+ {
+ const SdDrawDocument* pWorkModel = pOwnData->GetWorkDocument();
+ SdrPage* pWorkPage = const_cast<SdrPage*>( ( pWorkModel->GetPageCount() > 1 ) ?
+ pWorkModel->GetSdPage( 0, PageKind::Standard ) :
+ pWorkModel->GetPage( 0 ) );
+
+ pWorkPage->SetSdrObjListRectsDirty();
+
+ // #i120393# Clipboard data uses full object geometry range
+ const Size aSize( pWorkPage->GetAllObjBoundRect().GetSize() );
+
+ aInsertPos.setX( pOwnData->GetStartPos().X() + ( aSize.Width() >> 1 ) );
+ aInsertPos.setY( pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 ) );
+ }
+
+ // restrict movement to WorkArea
+ Size aImageMapSize(aBmpEx.GetPrefSize());
+ ImpCheckInsertPos(aInsertPos, aImageMapSize, GetWorkArea());
+
+ InsertGraphic( aBmpEx, mnAction, aInsertPos, nullptr, pImageMap.get() );
+ bReturn = true;
+ }
+ }
+
+ if(!bReturn && pPickObj && CHECK_FORMAT_TRANS( SotClipboardFormatId::XFA ) )
+ {
+ uno::Any const data(aDataHelper.GetAny(SotClipboardFormatId::XFA, ""));
+ uno::Sequence<beans::NamedValue> props;
+ if (data >>= props)
+ {
+ if( IsUndoEnabled() )
+ {
+ BegUndo( SdResId(STR_UNDO_DRAGDROP) );
+ AddUndo( GetModel()->GetSdrUndoFactory().CreateUndoAttrObject( *pPickObj ) );
+ EndUndo();
+ }
+
+ ::comphelper::SequenceAsHashMap const map(props);
+ drawing::FillStyle eFill(drawing::FillStyle_BITMAP); // default to something that's ignored
+ Color aColor(COL_BLACK);
+ auto it = map.find("FillStyle");
+ if (it != map.end())
+ {
+ XFillStyleItem style;
+ style.PutValue(it->second, 0);
+ eFill = style.GetValue();
+ }
+ it = map.find("FillColor");
+ if (it != map.end())
+ {
+ XFillColorItem color;
+ color.PutValue(it->second, 0);
+ aColor = color.GetColorValue();
+ }
+
+ if( eFill == drawing::FillStyle_SOLID || eFill == drawing::FillStyle_NONE )
+ {
+ SfxItemSet aSet( mrDoc.GetPool() );
+ bool bClosed = pPickObj->IsClosedObj();
+ ::sd::Window* pWin = mpViewSh->GetActiveWindow();
+ sal_uInt16 nHitLog = static_cast<sal_uInt16>(pWin->PixelToLogic(
+ Size(FuPoor::HITPIX, 0 ) ).Width());
+ const ::tools::Long n2HitLog = nHitLog << 1;
+ Point aHitPosR( rPos );
+ Point aHitPosL( rPos );
+ Point aHitPosT( rPos );
+ Point aHitPosB( rPos );
+ const SdrLayerIDSet* pVisiLayer = &GetSdrPageView()->GetVisibleLayers();
+
+ aHitPosR.AdjustX(n2HitLog );
+ aHitPosL.AdjustX( -n2HitLog );
+ aHitPosT.AdjustY(n2HitLog );
+ aHitPosB.AdjustY( -n2HitLog );
+
+ if( bClosed &&
+ SdrObjectPrimitiveHit(*pPickObj, aHitPosR, nHitLog, *GetSdrPageView(), pVisiLayer, false) &&
+ SdrObjectPrimitiveHit(*pPickObj, aHitPosL, nHitLog, *GetSdrPageView(), pVisiLayer, false) &&
+ SdrObjectPrimitiveHit(*pPickObj, aHitPosT, nHitLog, *GetSdrPageView(), pVisiLayer, false) &&
+ SdrObjectPrimitiveHit(*pPickObj, aHitPosB, nHitLog, *GetSdrPageView(), pVisiLayer, false) )
+ {
+ // area fill
+ if(eFill == drawing::FillStyle_SOLID )
+ aSet.Put(XFillColorItem("", aColor));
+
+ aSet.Put( XFillStyleItem( eFill ) );
+ }
+ else
+ aSet.Put( XLineColorItem( "", aColor ) );
+
+ // add text color
+ pPickObj->SetMergedItemSetAndBroadcast( aSet );
+ }
+ bReturn = true;
+ }
+ }
+
+ if(!bReturn && !bLink && CHECK_FORMAT_TRANS(SotClipboardFormatId::HTML))
+ {
+ ::tools::SvRef<SotTempStream> xStm;
+
+ if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::HTML, xStm ) )
+ {
+ xStm->Seek( 0 );
+ // mba: clipboard always must contain absolute URLs (could be from alien source)
+ bReturn = SdrView::Paste( *xStm, EETextFormat::Html, maDropPos, pPage, nPasteOptions );
+ }
+ }
+
+ if(!bReturn && !bLink && CHECK_FORMAT_TRANS(SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT))
+ {
+ ::tools::SvRef<SotTempStream> xStm;
+ if( aDataHelper.GetSotStorageStream( SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT, xStm ) )
+ {
+ OutlinerView* pOLV = GetTextEditOutlinerView();
+
+ xStm->Seek( 0 );
+
+ if( pOLV )
+ {
+ ::tools::Rectangle aRect( pOLV->GetOutputArea() );
+ Point aPos( pOLV->GetWindow()->PixelToLogic( maDropPos ) );
+
+ if( aRect.Contains( aPos ) || ( !bDrag && IsTextEdit() ) )
+ {
+ // mba: clipboard always must contain absolute URLs (could be from alien source)
+ pOLV->Read( *xStm, EETextFormat::Xml, mpDocSh->GetHeaderAttributes() );
+ bReturn = true;
+ }
+ }
+
+ if( !bReturn )
+ // mba: clipboard always must contain absolute URLs (could be from alien source)
+ bReturn = SdrView::Paste( *xStm, EETextFormat::Xml, maDropPos, pPage, nPasteOptions );
+ }
+ }
+
+ if(!bReturn && !bLink)
+ {
+ bool bIsRTF = CHECK_FORMAT_TRANS(SotClipboardFormatId::RTF);
+ if (bIsRTF || CHECK_FORMAT_TRANS(SotClipboardFormatId::RICHTEXT))
+ {
+ ::tools::SvRef<SotTempStream> xStm;
+
+ if( aDataHelper.GetSotStorageStream( bIsRTF ? SotClipboardFormatId::RTF : SotClipboardFormatId::RICHTEXT, xStm ) )
+ {
+ xStm->Seek( 0 );
+
+ if( bTable )
+ {
+ bReturn = PasteRTFTable( xStm, pPage, nPasteOptions );
+ }
+ else
+ {
+ OutlinerView* pOLV = GetTextEditOutlinerView();
+
+ if( pOLV )
+ {
+ ::tools::Rectangle aRect( pOLV->GetOutputArea() );
+ Point aPos( pOLV->GetWindow()->PixelToLogic( maDropPos ) );
+
+ if( aRect.Contains( aPos ) || ( !bDrag && IsTextEdit() ) )
+ {
+ // mba: clipboard always must contain absolute URLs (could be from alien source)
+ pOLV->Read( *xStm, EETextFormat::Rtf, mpDocSh->GetHeaderAttributes() );
+ bReturn = true;
+ }
+ }
+
+ if( !bReturn )
+ // mba: clipboard always must contain absolute URLs (could be from alien source)
+ bReturn = SdrView::Paste( *xStm, EETextFormat::Rtf, maDropPos, pPage, nPasteOptions );
+ }
+ }
+ }
+ }
+
+ if(!bReturn && CHECK_FORMAT_TRANS(SotClipboardFormatId::FILE_LIST))
+ {
+ FileList aDropFileList;
+
+ if( aDataHelper.GetFileList( SotClipboardFormatId::FILE_LIST, aDropFileList ) )
+ {
+ maDropFileVector.clear();
+
+ for( sal_uLong i = 0, nCount = aDropFileList.Count(); i < nCount; i++ )
+ maDropFileVector.push_back( aDropFileList.GetFile( i ) );
+
+ maDropInsertFileIdle.Start();
+ }
+
+ bReturn = true;
+ }
+
+ if(!bReturn && CHECK_FORMAT_TRANS(SotClipboardFormatId::SIMPLE_FILE))
+ {
+ OUString aDropFile;
+
+ if( aDataHelper.GetString( SotClipboardFormatId::SIMPLE_FILE, aDropFile ) )
+ {
+ maDropFileVector.clear();
+ maDropFileVector.push_back( aDropFile );
+ maDropInsertFileIdle.Start();
+ }
+
+ bReturn = true;
+ }
+
+ if(!bReturn && !bLink && CHECK_FORMAT_TRANS(SotClipboardFormatId::STRING))
+ {
+ if( ( SotClipboardFormatId::STRING == nFormat ) ||
+ ( !aDataHelper.HasFormat( SotClipboardFormatId::SOLK ) &&
+ !aDataHelper.HasFormat( SotClipboardFormatId::NETSCAPE_BOOKMARK ) &&
+ !aDataHelper.HasFormat( SotClipboardFormatId::FILENAME ) ) )
+ {
+ OUString aOUString;
+
+ if( aDataHelper.GetString( SotClipboardFormatId::STRING, aOUString ) )
+ {
+ OutlinerView* pOLV = GetTextEditOutlinerView();
+
+ if( pOLV )
+ {
+ pOLV->InsertText( aOUString );
+ bReturn = true;
+ }
+
+ if( !bReturn )
+ bReturn = SdrView::Paste( aOUString, maDropPos, pPage, nPasteOptions );
+ }
+ }
+ }
+
+ MarkListHasChanged();
+ mbIsDropAllowed = true;
+ rDnDAction = mnAction;
+
+ if (bGroupUndoFromDragWithDrop)
+ {
+ // this is called eventually by the underlying toolkit anyway in the case of a self-dnd
+ // but we call it early in this case to group its undo actions into this open dnd undo group
+ // and rely on that repeated calls to View::DragFinished are safe to do
+ DragFinished(mnAction);
+ EndUndo();
+ }
+
+ return bReturn;
+}
+
+bool View::PasteRTFTable( const ::tools::SvRef<SotTempStream>& xStm, SdrPage* pPage, SdrInsertFlags nPasteOptions )
+{
+ SdDrawDocument aModel( DocumentType::Impress, mpDocSh );
+ aModel.NewOrLoadCompleted(DocCreationMode::New);
+ aModel.GetItemPool().SetDefaultMetric(MapUnit::Map100thMM);
+ aModel.InsertPage(aModel.AllocPage(false).get());
+
+ Reference< XComponent > xComponent( new SdXImpressDocument( &aModel, true ) );
+ aModel.setUnoModel( Reference< XInterface >::query( xComponent ) );
+
+ CreateTableFromRTF( *xStm, &aModel );
+ bool bRet = Paste(aModel, maDropPos, pPage, nPasteOptions);
+
+ xComponent->dispose();
+ xComponent.clear();
+
+ return bRet;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/sdview4.cxx b/sd/source/ui/view/sdview4.cxx
new file mode 100644
index 000000000..7a3c7c226
--- /dev/null
+++ b/sd/source/ui/view/sdview4.cxx
@@ -0,0 +1,645 @@
+/* -*- 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 <config_features.h>
+
+#include <View.hxx>
+
+#include <comphelper/propertyvalue.hxx>
+#include <osl/file.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/docfilt.hxx>
+#include <sfx2/fcontnr.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/sfxsids.hrc>
+#include <vcl/outdev.hxx>
+#include <vcl/pdfread.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/xbtmpit.hxx>
+#include <svx/svdundo.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdomedia.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/ImageMapInfo.hxx>
+#include <sfx2/app.hxx>
+#include <avmedia/mediawindow.hxx>
+#include <svtools/ehdl.hxx>
+#include <svtools/sfxecode.hxx>
+#include <svtools/embedhlp.hxx>
+#include <vcl/graphicfilter.hxx>
+#include <app.hrc>
+#include <Window.hxx>
+#include <DrawDocShell.hxx>
+#include <DrawViewShell.hxx>
+#include <fuinsfil.hxx>
+#include <drawdoc.hxx>
+#include <sdresid.hxx>
+#include <strings.hrc>
+#include <sdpage.hxx>
+#include <view/SlideSorterView.hxx>
+#include <com/sun/star/embed/XEmbedPersist.hpp>
+#include <com/sun/star/embed/Aspects.hpp>
+#include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
+#include <com/sun/star/embed/XEmbeddedObject.hpp>
+#include <com/sun/star/media/XPlayer.hpp>
+#include <svtools/soerr.hxx>
+#include <sfx2/ipclient.hxx>
+#include <tools/debug.hxx>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+/**
+ * If an empty graphic object is provided, we fill it. Otherwise we fill an
+ * existing object at the specified position. If there is no object at the
+ * position, we create a new object and return a pointer to it.
+ */
+SdrGrafObj* View::InsertGraphic( const Graphic& rGraphic, sal_Int8& rAction,
+ const Point& rPos, SdrObject* pObj, ImageMap const * pImageMap )
+{
+ SdrEndTextEdit();
+ mnAction = rAction;
+
+ // Is there an object at the position rPos?
+ SdrGrafObj* pNewGrafObj = nullptr;
+ SdrPageView* pPV = GetSdrPageView();
+ SdrObject* pPickObj = pObj;
+ const bool bOnMaster = pPV && pPV->GetPage() && pPV->GetPage()->IsMasterPage();
+
+ if(pPV && dynamic_cast< const ::sd::slidesorter::view::SlideSorterView* >(this) != nullptr)
+ {
+ if(!pPV->GetPageRect().Contains(rPos))
+ pPV = nullptr;
+ }
+
+ if( !pPickObj && pPV )
+ {
+ SdrPageView* pPageView = pPV;
+ pPickObj = PickObj(rPos, getHitTolLog(), pPageView);
+ }
+
+ const bool bIsGraphic(dynamic_cast< const SdrGrafObj* >(pPickObj) != nullptr);
+
+ if (DND_ACTION_LINK == mnAction
+ && pPickObj
+ && pPV
+ && (bIsGraphic || (pPickObj->IsEmptyPresObj() && !bOnMaster))) // #121603# Do not use pObj, it may be NULL
+ {
+ // hit on SdrGrafObj with wanted new linked graphic (or PresObj placeholder hit)
+ if( IsUndoEnabled() )
+ BegUndo(SdResId(STR_INSERTGRAPHIC));
+
+ SdPage* pPage = static_cast<SdPage*>( pPickObj->getSdrPageFromSdrObject() );
+
+ if( bIsGraphic )
+ {
+ // We fill the object with the Bitmap
+ pNewGrafObj = static_cast<SdrGrafObj*>( pPickObj->CloneSdrObject(pPickObj->getSdrModelFromSdrObject()) );
+ pNewGrafObj->SetGraphic(rGraphic);
+ }
+ else
+ {
+ pNewGrafObj = new SdrGrafObj(
+ getSdrModelFromSdrView(),
+ rGraphic,
+ pPickObj->GetLogicRect());
+ pNewGrafObj->SetEmptyPresObj(true);
+ }
+
+ if ( pNewGrafObj->IsEmptyPresObj() )
+ {
+ ::tools::Rectangle aRect( pNewGrafObj->GetLogicRect() );
+ pNewGrafObj->AdjustToMaxRect( aRect );
+ pNewGrafObj->SetOutlinerParaObject(std::nullopt);
+ pNewGrafObj->SetEmptyPresObj(false);
+ }
+
+ if (pPage && pPage->IsPresObj(pPickObj))
+ {
+ // Insert new PresObj into the list
+ pPage->InsertPresObj( pNewGrafObj, PresObjKind::Graphic );
+ pNewGrafObj->SetUserCall(pPickObj->GetUserCall());
+ }
+
+ if (pImageMap)
+ pNewGrafObj->AppendUserData(std::unique_ptr<SdrObjUserData>(new SvxIMapInfo(*pImageMap)));
+
+ ReplaceObjectAtView(pPickObj, *pPV, pNewGrafObj); // maybe ReplaceObjectAtView
+
+ if( IsUndoEnabled() )
+ EndUndo();
+ }
+ else if (DND_ACTION_LINK == mnAction
+ && pPickObj
+ && !bIsGraphic
+ && pPickObj->IsClosedObj()
+ && !dynamic_cast< const SdrOle2Obj* >(pPickObj))
+ {
+ // fill style change (fill object with graphic), independent of mnAction
+ // and thus of DND_ACTION_LINK or DND_ACTION_MOVE
+ if( IsUndoEnabled() )
+ {
+ BegUndo(SdResId(STR_UNDO_DRAGDROP));
+ AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoAttrObject(*pPickObj));
+ EndUndo();
+ }
+
+ SfxItemSetFixed<XATTR_FILLSTYLE, XATTR_FILLBITMAP> aSet(mpDocSh->GetPool());
+
+ aSet.Put(XFillStyleItem(drawing::FillStyle_BITMAP));
+ aSet.Put(XFillBitmapItem(rGraphic));
+ pPickObj->SetMergedItemSetAndBroadcast(aSet);
+ }
+
+ else if ( pPV )
+ {
+ Size aSizePixel = rGraphic.GetSizePixel();
+
+ // create new object
+ Size aSize;
+
+ if ( rGraphic.GetPrefMapMode().GetMapUnit() == MapUnit::MapPixel )
+ {
+ ::OutputDevice* pOutDev = nullptr;
+ if( mpViewSh )
+ pOutDev = mpViewSh->GetActiveWindow()->GetOutDev();
+
+ if( !pOutDev )
+ pOutDev = Application::GetDefaultDevice();
+
+ if( pOutDev )
+ aSize = pOutDev->PixelToLogic(rGraphic.GetPrefSize(), MapMode(MapUnit::Map100thMM));
+ }
+ else
+ {
+ aSize = OutputDevice::LogicToLogic( rGraphic.GetPrefSize(),
+ rGraphic.GetPrefMapMode(),
+ MapMode( MapUnit::Map100thMM ) );
+ }
+
+ sal_Int32 nPreferredDPI = mrDoc.getImagePreferredDPI();
+
+ if (rGraphic.GetGfxLink().GetType() == GfxLinkType::NativePdf && nPreferredDPI == 0 && vcl::PDF_INSERT_MAGIC_SCALE_FACTOR > 1)
+ nPreferredDPI = Application::GetDefaultDevice()->GetDPIX() * vcl::PDF_INSERT_MAGIC_SCALE_FACTOR;
+
+ if (nPreferredDPI > 0)
+ {
+ auto nWidth = o3tl::convert(aSizePixel.Width() / double(nPreferredDPI), o3tl::Length::in, o3tl::Length::mm100);
+ auto nHeight = o3tl::convert(aSizePixel.Height() / double(nPreferredDPI), o3tl::Length::in, o3tl::Length::mm100);
+ if (nWidth > 0 && nHeight > 0)
+ aSize = Size(nWidth, nHeight);
+ }
+
+ pNewGrafObj = new SdrGrafObj(getSdrModelFromSdrView(), rGraphic, ::tools::Rectangle(rPos, aSize));
+
+ if (nPreferredDPI > 0)
+ {
+ // move to the center of insertion point
+ pNewGrafObj->NbcMove(Size(-aSize.Width() / 2, -aSize.Height() / 2));
+ }
+ else
+ {
+ SdrPage* pPage = pPV->GetPage();
+ Size aPageSize( pPage->GetSize() );
+ aPageSize.AdjustWidth( -(pPage->GetLeftBorder() + pPage->GetRightBorder()) );
+ aPageSize.AdjustHeight( -(pPage->GetUpperBorder() + pPage->GetLowerBorder()) );
+ pNewGrafObj->AdjustToMaxRect( ::tools::Rectangle( Point(), aPageSize ), true );
+ }
+
+ SdrInsertFlags nOptions = SdrInsertFlags::SETDEFLAYER;
+ bool bIsPresTarget = false;
+
+ if ((mpViewSh
+ && mpViewSh->GetViewShell()!=nullptr
+ && mpViewSh->GetViewShell()->GetIPClient()
+ && mpViewSh->GetViewShell()->GetIPClient()->IsObjectInPlaceActive())
+ || dynamic_cast<const ::sd::slidesorter::view::SlideSorterView* >(this))
+ nOptions |= SdrInsertFlags::DONTMARK;
+
+ if( ( mnAction & DND_ACTION_MOVE ) && pPickObj && (pPickObj->IsEmptyPresObj() || pPickObj->GetUserCall()) )
+ {
+ SdPage* pP = static_cast< SdPage* >( pPickObj->getSdrPageFromSdrObject() );
+
+ if ( pP && pP->IsMasterPage() )
+ bIsPresTarget = pP->IsPresObj(pPickObj);
+ }
+
+ if( ( mnAction & DND_ACTION_MOVE ) && pPickObj && !bIsPresTarget )
+ {
+ // replace object
+ if (pImageMap)
+ pNewGrafObj->AppendUserData(std::unique_ptr<SdrObjUserData>(new SvxIMapInfo(*pImageMap)));
+
+ ::tools::Rectangle aPickObjRect(pPickObj->GetCurrentBoundRect());
+ Size aPickObjSize(aPickObjRect.GetSize());
+ ::tools::Rectangle aObjRect(pNewGrafObj->GetCurrentBoundRect());
+ Size aObjSize(aObjRect.GetSize());
+
+ Fraction aScaleWidth(aPickObjSize.Width(), aObjSize.Width());
+ Fraction aScaleHeight(aPickObjSize.Height(), aObjSize.Height());
+ pNewGrafObj->NbcResize(aObjRect.TopLeft(), aScaleWidth, aScaleHeight);
+
+ Point aVec = aPickObjRect.TopLeft() - aObjRect.TopLeft();
+ pNewGrafObj->NbcMove(Size(aVec.X(), aVec.Y()));
+
+ const bool bUndo = IsUndoEnabled();
+
+ if( bUndo )
+ BegUndo(SdResId(STR_UNDO_DRAGDROP));
+ pNewGrafObj->NbcSetLayer(pPickObj->GetLayer());
+ SdrPage* pP = pPV->GetPage();
+ pP->InsertObject(pNewGrafObj);
+ if( bUndo )
+ {
+ AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoNewObject(*pNewGrafObj));
+ AddUndo(mrDoc.GetSdrUndoFactory().CreateUndoDeleteObject(*pPickObj));
+ }
+ pP->RemoveObject(pPickObj->GetOrdNum());
+
+ if( bUndo )
+ {
+ EndUndo();
+ }
+ else
+ {
+ SdrObject::Free(pPickObj);
+ }
+ mnAction = DND_ACTION_COPY;
+ }
+ else
+ {
+ bool bSuccess = InsertObjectAtView(pNewGrafObj, *pPV, nOptions);
+ if (!bSuccess)
+ pNewGrafObj = nullptr;
+ else if (pImageMap)
+ pNewGrafObj->AppendUserData(std::unique_ptr<SdrObjUserData>(new SvxIMapInfo(*pImageMap)));
+ }
+ }
+
+ rAction = mnAction;
+
+ return pNewGrafObj;
+}
+
+void View::InsertMediaURL( const OUString& rMediaURL, sal_Int8& rAction,
+ const Point& rPos, const Size& rSize,
+ bool const bLink )
+{
+ OUString realURL;
+ if (bLink)
+ {
+ realURL = rMediaURL;
+ }
+ else
+ {
+ uno::Reference<frame::XModel> const xModel(
+ GetDoc().GetObjectShell()->GetModel());
+#if HAVE_FEATURE_AVMEDIA
+ bool const bRet = ::avmedia::EmbedMedia(xModel, rMediaURL, realURL);
+ if (!bRet) { return; }
+#else
+ return;
+#endif
+ }
+
+ InsertMediaObj( realURL, "application/vnd.sun.star.media", rAction, rPos, rSize );
+}
+
+SdrMediaObj* View::InsertMediaObj( const OUString& rMediaURL, const OUString& rMimeType, sal_Int8& rAction,
+ const Point& rPos, const Size& rSize )
+{
+ SdrEndTextEdit();
+ mnAction = rAction;
+
+ SdrMediaObj* pNewMediaObj = nullptr;
+ SdrPageView* pPV = GetSdrPageView();
+ SdrObject* pPickObj = GetEmptyPresentationObject( PresObjKind::Media );
+
+ if(pPV && dynamic_cast<const ::sd::slidesorter::view::SlideSorterView* >(this) )
+ {
+ if(!pPV->GetPageRect().Contains(rPos))
+ pPV = nullptr;
+ }
+
+ if( mnAction == DND_ACTION_LINK && pPV && dynamic_cast< SdrMediaObj *>( pPickObj ) )
+ {
+ pNewMediaObj = static_cast< SdrMediaObj* >( pPickObj->CloneSdrObject(pPickObj->getSdrModelFromSdrObject()) );
+ pNewMediaObj->setURL( rMediaURL, ""/*TODO?*/, rMimeType );
+
+ BegUndo(SdResId(STR_UNDO_DRAGDROP));
+ ReplaceObjectAtView(pPickObj, *pPV, pNewMediaObj);
+ EndUndo();
+ }
+ else if( pPV )
+ {
+ ::tools::Rectangle aRect( rPos, rSize );
+ SdrObjUserCall* pUserCall = nullptr;
+ if( pPickObj )
+ {
+ aRect = pPickObj->GetLogicRect();
+ pUserCall = pPickObj->GetUserCall(); // ReplaceObjectAtView can free pPickObj
+ }
+
+ pNewMediaObj = new SdrMediaObj(
+ getSdrModelFromSdrView(),
+ aRect);
+
+ bool bIsPres = false;
+ if( pPickObj )
+ {
+ SdPage* pPage = static_cast< SdPage* >(pPickObj->getSdrPageFromSdrObject());
+ bIsPres = pPage && pPage->IsPresObj(pPickObj);
+ if( bIsPres )
+ {
+ pPage->InsertPresObj( pNewMediaObj, PresObjKind::Media );
+ }
+ }
+
+ if( pPickObj )
+ ReplaceObjectAtView(pPickObj, *pPV, pNewMediaObj);
+ else
+ {
+ if (!InsertObjectAtView(pNewMediaObj, *pPV, SdrInsertFlags::SETDEFLAYER))
+ pNewMediaObj = nullptr;
+ }
+
+ OUString referer;
+ DrawDocShell * sh = GetDocSh();
+ if (sh != nullptr && sh->HasName()) {
+ referer = sh->GetMedium()->GetName();
+ }
+
+ if (pNewMediaObj)
+ {
+ pNewMediaObj->setURL( rMediaURL, referer, rMimeType );
+
+ if( pPickObj )
+ {
+ pNewMediaObj->AdjustToMaxRect( aRect );
+ if( bIsPres )
+ pNewMediaObj->SetUserCall( pUserCall );
+ }
+ }
+ }
+
+ rAction = mnAction;
+
+ return pNewMediaObj;
+}
+
+/**
+ * Timer handler for InsertFile at Drop()
+ */
+IMPL_LINK_NOARG(View, DropInsertFileHdl, Timer *, void)
+{
+ DBG_ASSERT( mpViewSh, "sd::View::DropInsertFileHdl(), I need a view shell to work!" );
+ if( !mpViewSh )
+ return;
+
+ SfxErrorContext aEc( ERRCTX_ERROR, mpViewSh->GetFrameWeld(), RID_SO_ERRCTX );
+ ErrCode nError = ERRCODE_NONE;
+
+ ::std::vector< OUString >::const_iterator aIter( maDropFileVector.begin() );
+
+ while( (aIter != maDropFileVector.end()) && !nError )
+ {
+ OUString aCurrentDropFile( *aIter );
+ INetURLObject aURL( aCurrentDropFile );
+ bool bHandled = false;
+
+ if( aURL.GetProtocol() == INetProtocol::NotValid )
+ {
+ OUString aURLStr;
+ osl::FileBase::getFileURLFromSystemPath( aCurrentDropFile, aURLStr );
+ aURL = INetURLObject( aURLStr );
+ }
+
+ GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter();
+ Graphic aGraphic;
+
+ aCurrentDropFile = aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE );
+
+#if HAVE_FEATURE_AVMEDIA
+ if( !::avmedia::MediaWindow::isMediaURL( aCurrentDropFile, ""/*TODO?*/ ) )
+#else
+#endif
+ {
+ if( !rGraphicFilter.ImportGraphic( aGraphic, aURL ) )
+ {
+ sal_Int8 nTempAction = ( aIter == maDropFileVector.begin() ) ? mnAction : 0;
+ const bool bLink = ( ( nTempAction & DND_ACTION_LINK ) != 0 );
+ SdrGrafObj* pGrafObj = InsertGraphic( aGraphic, nTempAction, maDropPos, nullptr, nullptr );
+ if(pGrafObj && bLink)
+ {
+ pGrafObj->SetGraphicLink( aCurrentDropFile );
+ }
+
+ // return action from first inserted graphic
+ if( aIter == maDropFileVector.begin() )
+ mnAction = nTempAction;
+
+ bHandled = true;
+ }
+ if (!bHandled)
+ {
+ std::shared_ptr<const SfxFilter> pFoundFilter;
+ SfxMedium aSfxMedium( aCurrentDropFile, StreamMode::READ | StreamMode::SHARE_DENYNONE );
+ ErrCode nErr = SfxGetpApp()->GetFilterMatcher().GuessFilter( aSfxMedium, pFoundFilter );
+
+ if( pFoundFilter && !nErr )
+ {
+ ::std::vector< OUString > aFilterVector;
+ OUString aFilterName = pFoundFilter->GetFilterName();
+ OUString aLowerAsciiFileName = aCurrentDropFile.toAsciiLowerCase();
+
+ FuInsertFile::GetSupportedFilterVector( aFilterVector );
+
+ if( ( ::std::find( aFilterVector.begin(), aFilterVector.end(), pFoundFilter->GetMimeType() ) != aFilterVector.end() ) ||
+ aFilterName.indexOf( "Text" ) != -1 ||
+ aFilterName.indexOf( "Rich" ) != -1 ||
+ aFilterName.indexOf( "RTF" ) != -1 ||
+ aFilterName.indexOf( "HTML" ) != -1 ||
+ aLowerAsciiFileName.indexOf(".sdd") != -1 ||
+ aLowerAsciiFileName.indexOf(".sda") != -1 ||
+ aLowerAsciiFileName.indexOf(".sxd") != -1 ||
+ aLowerAsciiFileName.indexOf(".sxi") != -1 ||
+ aLowerAsciiFileName.indexOf(".std") != -1 ||
+ aLowerAsciiFileName.indexOf(".sti") != -1 )
+ {
+ ::sd::Window* pWin = mpViewSh->GetActiveWindow();
+ SfxRequest aReq(SID_INSERTFILE, ::SfxCallMode::SLOT, mrDoc.GetItemPool());
+ SfxStringItem aItem1( ID_VAL_DUMMY0, aCurrentDropFile ), aItem2( ID_VAL_DUMMY1, pFoundFilter->GetFilterName() );
+
+ aReq.AppendItem( aItem1 );
+ aReq.AppendItem( aItem2 );
+ FuInsertFile::Create( mpViewSh, pWin, this, &mrDoc, aReq );
+ bHandled = true;
+ }
+ }
+ }
+ }
+
+#if HAVE_FEATURE_AVMEDIA
+ if (!bHandled)
+ {
+ bool bShallowDetect = ::avmedia::MediaWindow::isMediaURL(aCurrentDropFile, ""/*TODO?*/);
+ if (bShallowDetect)
+ {
+ mxDropMediaSizeListener.set(new avmedia::PlayerListener(
+ [this, aCurrentDropFile](const css::uno::Reference<css::media::XPlayer>& rPlayer){
+ SolarMutexGuard g;
+
+ css::awt::Size aSize = rPlayer->getPreferredPlayerWindowSize();
+ Size aPrefSize(aSize.Width, aSize.Height);
+
+ if (aPrefSize.Width() && aPrefSize.Height())
+ {
+ ::sd::Window* pWin = mpViewSh->GetActiveWindow();
+
+ if( pWin )
+ aPrefSize = pWin->PixelToLogic(aPrefSize, MapMode(MapUnit::Map100thMM));
+ else
+ aPrefSize = Application::GetDefaultDevice()->PixelToLogic(aPrefSize, MapMode(MapUnit::Map100thMM));
+ }
+ else
+ aPrefSize = Size( 5000, 5000 );
+
+ InsertMediaURL(aCurrentDropFile, mnAction, maDropPos, aPrefSize, true);
+
+ mxDropMediaSizeListener.clear();
+ }));
+ }
+ bHandled = bShallowDetect && ::avmedia::MediaWindow::isMediaURL(aCurrentDropFile, ""/*TODO?*/, true, mxDropMediaSizeListener);
+ }
+#endif
+
+ if (!bHandled)
+ {
+ if( mnAction & DND_ACTION_LINK )
+ static_cast< DrawViewShell* >( mpViewSh )->InsertURLButton( aCurrentDropFile, aCurrentDropFile, OUString(), &maDropPos );
+ else
+ {
+ if( mpViewSh )
+ {
+ try
+ {
+ //TODO/MBA: testing
+ OUString aName;
+ uno::Sequence < beans::PropertyValue > aMedium{ comphelper::makePropertyValue(
+ "URL", aCurrentDropFile) };
+
+ uno::Reference < embed::XEmbeddedObject > xObj = mpDocSh->GetEmbeddedObjectContainer().
+ InsertEmbeddedObject( aMedium, aName );
+
+ uno::Reference < embed::XEmbedPersist > xPersist( xObj, uno::UNO_QUERY );
+ if ( xPersist.is())
+ {
+ // TODO/LEAN: VisualArea access can switch the object to running state
+ sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT;
+
+ xPersist->storeOwn();
+
+ awt::Size aSz;
+ try
+ {
+ aSz = xObj->getVisualAreaSize( nAspect );
+ }
+ catch( embed::NoVisualAreaSizeException& )
+ {
+ // the default size will be set later
+ }
+
+ Size aSize( aSz.Width, aSz.Height );
+ ::tools::Rectangle aRect;
+
+ if (!aSize.Width() || !aSize.Height())
+ {
+ aSize.setWidth( 1410 );
+ aSize.setHeight( 1000 );
+ }
+
+ aRect = ::tools::Rectangle( maDropPos, aSize );
+
+ SdrOle2Obj* pOleObj = new SdrOle2Obj(
+ getSdrModelFromSdrView(),
+ svt::EmbeddedObjectRef(xObj, nAspect),
+ aName,
+ aRect);
+ SdrInsertFlags nOptions = SdrInsertFlags::SETDEFLAYER;
+
+ if (mpViewSh != nullptr)
+ {
+ OSL_ASSERT (mpViewSh->GetViewShell()!=nullptr);
+ SfxInPlaceClient* pIpClient =
+ mpViewSh->GetViewShell()->GetIPClient();
+ if (pIpClient!=nullptr && pIpClient->IsObjectInPlaceActive())
+ nOptions |= SdrInsertFlags::DONTMARK;
+ }
+
+ if (InsertObjectAtView( pOleObj, *GetSdrPageView(), nOptions ))
+ pOleObj->SetLogicRect( aRect );
+ aSz.Width = aRect.GetWidth();
+ aSz.Height = aRect.GetHeight();
+ xObj->setVisualAreaSize( nAspect,aSz );
+ }
+ }
+ catch( uno::Exception& )
+ {
+ nError = ERRCODE_IO_GENERAL;
+ // TODO/LATER: better error handling
+ }
+ }
+ }
+ }
+
+ ++aIter;
+ }
+
+ if( nError )
+ ErrorHandler::HandleError( nError );
+}
+
+/**
+ * Timer handler for Errorhandling at Drop()
+ */
+IMPL_LINK_NOARG(View, DropErrorHdl, Timer *, void)
+{
+ vcl::Window* pWin = mpViewSh ? mpViewSh->GetActiveWindow() : nullptr;
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(pWin ? pWin->GetFrameWeld() : nullptr,
+ VclMessageType::Info, VclButtonsType::Ok,
+ SdResId(STR_ACTION_NOTPOSSIBLE)));
+ xInfoBox->run();
+}
+
+/**
+ * @returns StyleSheet from selection
+ */
+SfxStyleSheet* View::GetStyleSheet() const
+{
+ return SdrView::GetStyleSheet();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/sdview5.cxx b/sd/source/ui/view/sdview5.cxx
new file mode 100644
index 000000000..c3ac066bc
--- /dev/null
+++ b/sd/source/ui/view/sdview5.cxx
@@ -0,0 +1,118 @@
+/* -*- 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 <sdpage.hxx>
+#include <View.hxx>
+#include <pres.hxx>
+
+#include <svx/svdpagv.hxx>
+
+namespace sd {
+
+static bool implIsMultiPresObj( PresObjKind eKind )
+{
+ switch( eKind )
+ {
+ case PresObjKind::Outline:
+ case PresObjKind::Graphic:
+ case PresObjKind::Object:
+ case PresObjKind::Chart:
+ case PresObjKind::OrgChart:
+ case PresObjKind::Table:
+ case PresObjKind::Media:
+ return true;
+ default:
+ return false;
+ }
+}
+
+SdPage* View::GetPage()
+{
+ SdPage* pPage = nullptr;
+ SdrPageView* pPV = GetSdrPageView();
+ if( pPV )
+ {
+ pPage = static_cast< SdPage* >( pPV->GetPage() );
+ }
+
+ return pPage;
+}
+
+// returns selected object in case there's just one object in the selection
+SdrObject* View::GetSelectedSingleObject(SdPage const * pPage)
+{
+ SdrObject* pRet = nullptr;
+ if( pPage )
+ {
+ // first try selected shape
+ if ( AreObjectsMarked() )
+ {
+ const SdrMarkList& rMarkList = GetMarkedObjectList();
+
+ if (rMarkList.GetMarkCount() == 1)
+ {
+ SdrMark* pMark = rMarkList.GetMark(0);
+ pRet = pMark->GetMarkedSdrObj();
+ }
+ }
+ }
+
+ return pRet;
+}
+
+SdrObject* View::GetEmptyPresentationObject( PresObjKind eKind )
+{
+ SdPage* pPage = GetPage();
+ SdrObject* pEmptyObj = nullptr;
+
+ if ( pPage && !pPage->IsMasterPage() ) {
+ SdrObject* pObj = GetSelectedSingleObject( pPage );
+
+ if( pObj && pObj->IsEmptyPresObj() && implIsMultiPresObj( pPage->GetPresObjKind(pObj) ) )
+ pEmptyObj = pObj;
+
+ // try to find empty pres obj of same type
+ if( !pEmptyObj )
+ {
+ int nIndex = 1;
+ do
+ {
+ pEmptyObj = pPage->GetPresObj(eKind, nIndex++ );
+ }
+ while( (pEmptyObj != nullptr) && (!pEmptyObj->IsEmptyPresObj()) );
+ }
+
+ // last try to find empty pres obj of multiple type
+ if( !pEmptyObj )
+ {
+ const std::list< SdrObject* >& rShapes = pPage->GetPresentationShapeList().getList();
+
+ auto iter = std::find_if(rShapes.begin(), rShapes.end(),
+ [&pPage](SdrObject* pShape) { return pShape->IsEmptyPresObj() && implIsMultiPresObj(pPage->GetPresObjKind(pShape)); });
+ if (iter != rShapes.end())
+ pEmptyObj = (*iter);
+ }
+ }
+
+ return pEmptyObj;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/sdwindow.cxx b/sd/source/ui/view/sdwindow.cxx
new file mode 100644
index 000000000..f639b463e
--- /dev/null
+++ b/sd/source/ui/view/sdwindow.cxx
@@ -0,0 +1,1097 @@
+/* -*- 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 <Window.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/request.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <svx/svxids.hrc>
+
+#include <editeng/outliner.hxx>
+#include <editeng/editview.hxx>
+#include <editeng/editeng.hxx>
+
+#include <app.hrc>
+#include <ViewShell.hxx>
+#include <DrawViewShell.hxx>
+#include <DrawDocShell.hxx>
+#include <PresentationViewShell.hxx>
+#include <View.hxx>
+#include <FrameView.hxx>
+#include <OutlineViewShell.hxx>
+#include <OutlineView.hxx>
+#include <drawdoc.hxx>
+#include <WindowUpdater.hxx>
+#include <ViewShellBase.hxx>
+#include <uiobject.hxx>
+
+#include <officecfg/Office/Common.hxx>
+#include <sal/log.hxx>
+#include <tools/debug.hxx>
+#include <vcl/commandevent.hxx>
+#include <vcl/settings.hxx>
+#include <comphelper/lok.hxx>
+#include <sfx2/lokhelper.hxx>
+
+namespace sd {
+
+#define SCROLL_LINE_FACT 0.05 ///< factor for line scrolling
+#define SCROLL_PAGE_FACT 0.5 ///< factor for page scrolling
+#define SCROLL_SENSITIVE 20 ///< sensitive area in pixel
+#define ZOOM_MULTIPLICATOR 10000 ///< multiplier to avoid rounding errors
+#define MIN_ZOOM 5 ///< minimal zoom factor
+#define MAX_ZOOM 3000 ///< maximal zoom factor
+
+Window::Window(vcl::Window* pParent)
+ : vcl::Window(pParent, WinBits(WB_CLIPCHILDREN | WB_DIALOGCONTROL)),
+ DropTargetHelper( this ),
+ maWinPos(0, 0), // precautionary; but the values should be set
+ maViewOrigin(0, 0), // again from the owner of the window
+ maViewSize(1000, 1000),
+ maPrevSize(-1,-1),
+ mnMinZoom(MIN_ZOOM),
+ mnMaxZoom(MAX_ZOOM),
+ mbMinZoomAutoCalc(false),
+ mbCenterAllowed(true),
+ mnTicks (0),
+ mpViewShell(nullptr),
+ mbUseDropScroll (true)
+{
+ SetDialogControlFlags( DialogControlFlags::Return | DialogControlFlags::WantFocus );
+
+ MapMode aMap(GetMapMode());
+ aMap.SetMapUnit(MapUnit::Map100thMM);
+ SetMapMode(aMap);
+
+ // with it, the vcl::WindowColor is used in the slide mode
+ SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetWindowColor() ) );
+
+ // adjust contrast mode initially
+ bool bUseContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
+ GetOutDev()->SetDrawMode( bUseContrast
+ ? sd::OUTPUT_DRAWMODE_CONTRAST
+ : sd::OUTPUT_DRAWMODE_COLOR );
+
+ // #i78183# Added after discussed with AF
+ EnableRTL(false);
+}
+
+Window::~Window()
+{
+ disposeOnce();
+}
+
+void Window::dispose()
+{
+ if (mpViewShell != nullptr)
+ {
+ WindowUpdater* pWindowUpdater = mpViewShell->GetWindowUpdater();
+ if (pWindowUpdater != nullptr)
+ pWindowUpdater->UnregisterWindow (this);
+ }
+ DropTargetHelper::dispose();
+ vcl::Window::dispose();
+}
+
+void Window::SetViewShell (ViewShell* pViewSh)
+{
+ WindowUpdater* pWindowUpdater = nullptr;
+ // Unregister at device updater of old view shell.
+ if (mpViewShell != nullptr)
+ {
+ pWindowUpdater = mpViewShell->GetWindowUpdater();
+ if (pWindowUpdater != nullptr)
+ pWindowUpdater->UnregisterWindow (this);
+ }
+
+ mpViewShell = pViewSh;
+
+ // Register at device updater of new view shell
+ if (mpViewShell != nullptr)
+ {
+ pWindowUpdater = mpViewShell->GetWindowUpdater();
+ if (pWindowUpdater != nullptr)
+ pWindowUpdater->RegisterWindow (this);
+ }
+}
+
+ViewShell* Window::GetViewShell()
+{
+ return mpViewShell;
+}
+
+void Window::CalcMinZoom()
+{
+ // Are we entitled to change the minimal zoom factor?
+ if ( !mbMinZoomAutoCalc )
+ return;
+
+ // Get current zoom factor.
+ ::tools::Long nZoom = GetZoom();
+
+ // Get the rectangle of the output area in logical coordinates
+ // and calculate the scaling factors that would lead to the view
+ // area (also called application area) to completely fill the
+ // window.
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+ sal_uLong nX = static_cast<sal_uLong>(static_cast<double>(aWinSize.Width())
+ * double(ZOOM_MULTIPLICATOR) / static_cast<double>(maViewSize.Width()));
+ sal_uLong nY = static_cast<sal_uLong>(static_cast<double>(aWinSize.Height())
+ * double(ZOOM_MULTIPLICATOR) / static_cast<double>(maViewSize.Height()));
+
+ // Decide whether to take the larger or the smaller factor.
+ sal_uLong nFact = std::min(nX, nY);
+
+ // The factor is transformed according to the current zoom factor.
+ nFact = nFact * nZoom / ZOOM_MULTIPLICATOR;
+ mnMinZoom = std::max(sal_uInt16(MIN_ZOOM), static_cast<sal_uInt16>(nFact));
+
+ // If the current zoom factor is smaller than the calculated minimal
+ // zoom factor then set the new minimal factor as the current zoom
+ // factor.
+ if ( nZoom < static_cast<::tools::Long>(mnMinZoom) )
+ SetZoomFactor(mnMinZoom);
+}
+
+void Window::SetMinZoom (::tools::Long nMin)
+{
+ mnMinZoom = static_cast<sal_uInt16>(nMin);
+}
+
+void Window::SetMaxZoom (::tools::Long nMax)
+{
+ mnMaxZoom = static_cast<sal_uInt16>(nMax);
+}
+
+::tools::Long Window::GetZoom() const
+{
+ if( GetMapMode().GetScaleX().GetDenominator() )
+ {
+ return ::tools::Long(GetMapMode().GetScaleX() * 100);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+void Window::Resize()
+{
+ vcl::Window::Resize();
+ CalcMinZoom();
+
+ if( mpViewShell && mpViewShell->GetViewFrame() )
+ mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
+}
+
+void Window::PrePaint(vcl::RenderContext& /*rRenderContext*/)
+{
+ if ( mpViewShell )
+ mpViewShell->PrePaint();
+}
+
+void Window::Paint(vcl::RenderContext& /*rRenderContext*/, const ::tools::Rectangle& rRect)
+{
+ if ( mpViewShell )
+ mpViewShell->Paint(rRect, this);
+}
+
+void Window::KeyInput(const KeyEvent& rKEvt)
+{
+ if (getenv("SD_DEBUG") && rKEvt.GetKeyCode().GetCode() == KEY_F12 && mpViewShell)
+ {
+ mpViewShell->GetDoc()->dumpAsXml(nullptr);
+ if (OutlinerView *pOLV = mpViewShell->GetView()->GetTextEditOutlinerView())
+ pOLV->GetEditView().GetEditEngine()->dumpAsXmlEditDoc(nullptr);
+ return;
+ }
+
+ if (!(mpViewShell && mpViewShell->KeyInput(rKEvt, this)))
+ {
+ if (mpViewShell && rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE)
+ {
+ mpViewShell->GetViewShell()->Escape();
+ }
+ else
+ {
+ vcl::Window::KeyInput(rKEvt);
+ }
+ }
+}
+
+void Window::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ if ( mpViewShell )
+ mpViewShell->MouseButtonDown(rMEvt, this);
+}
+
+void Window::MouseMove(const MouseEvent& rMEvt)
+{
+ if ( mpViewShell )
+ mpViewShell->MouseMove(rMEvt, this);
+}
+
+void Window::MouseButtonUp(const MouseEvent& rMEvt)
+{
+ mnTicks = 0;
+
+ if ( mpViewShell )
+ mpViewShell->MouseButtonUp(rMEvt, this);
+}
+
+void Window::Command(const CommandEvent& rCEvt)
+{
+ if (mpViewShell)
+ mpViewShell->Command(rCEvt, this);
+ //pass at least alt press/release to parent impl
+ if (rCEvt.GetCommand() == CommandEventId::ModKeyChange)
+ vcl::Window::Command(rCEvt);
+ //show the text edit outliner view cursor
+ else if (mpViewShell && !HasFocus() && rCEvt.GetCommand() == CommandEventId::CursorPos)
+ {
+ // tdf#138855 Getting Focus may destroy TextEditOutlinerView so Grab if
+ // text editing active, but fetch the TextEditOutlinerView post-grab
+ if (mpViewShell->GetView()->IsTextEdit())
+ {
+ GrabFocus();
+ OutlinerView* pOLV = mpViewShell->GetView()->GetTextEditOutlinerView();
+ if (pOLV && this == pOLV->GetWindow())
+ pOLV->ShowCursor();
+ }
+ }
+}
+
+bool Window::EventNotify( NotifyEvent& rNEvt )
+{
+ bool bResult = false;
+ if ( mpViewShell )
+ {
+ bResult = mpViewShell->Notify(rNEvt, this);
+ }
+ if( !bResult )
+ bResult = vcl::Window::EventNotify(rNEvt);
+
+ return bResult;
+}
+
+void Window::RequestHelp(const HelpEvent& rEvt)
+{
+ if (!mpViewShell || !mpViewShell->RequestHelp(rEvt))
+ vcl::Window::RequestHelp( rEvt );
+}
+
+/**
+ * Set the position of the upper left corner from the visible area of the
+ * window.
+ */
+void Window::SetWinViewPos(const Point& rPnt)
+{
+ maWinPos = rPnt;
+}
+
+/**
+ * Set origin of the representation in respect to the whole working area.
+ */
+void Window::SetViewOrigin(const Point& rPnt)
+{
+ maViewOrigin = rPnt;
+}
+
+/**
+ * Set size of the whole working area which can be seen with the window.
+ */
+void Window::SetViewSize(const Size& rSize)
+{
+ maViewSize = rSize;
+ CalcMinZoom();
+}
+
+void Window::SetCenterAllowed (bool bIsAllowed)
+{
+ mbCenterAllowed = bIsAllowed;
+}
+
+::tools::Long Window::SetZoomFactor(::tools::Long nZoom)
+{
+ // Clip the zoom factor to the valid range marked by nMinZoom as
+ // calculated by CalcMinZoom() and the constant MAX_ZOOM.
+ if ( nZoom > MAX_ZOOM )
+ nZoom = MAX_ZOOM;
+ if ( nZoom < static_cast<::tools::Long>(mnMinZoom) )
+ nZoom = mnMinZoom;
+
+ // Set the zoom factor at the window's map mode.
+ if (!comphelper::LibreOfficeKit::isActive())
+ {
+ MapMode aMap(GetMapMode());
+ aMap.SetScaleX(Fraction(nZoom, 100));
+ aMap.SetScaleY(Fraction(nZoom, 100));
+ SetMapMode(aMap);
+ }
+
+ // invalidate previous size - it was relative to the old scaling
+ maPrevSize = Size(-1,-1);
+
+ // Update the map mode's origin (to what effect?).
+ UpdateMapOrigin();
+
+ // Update the view's snapping to the new zoom factor.
+ if ( auto pDrawViewShell = dynamic_cast< DrawViewShell *>( mpViewShell ) )
+ pDrawViewShell->GetView()->RecalcLogicSnapMagnetic(*GetOutDev());
+
+ // Return the zoom factor just in case it has been changed above to lie
+ // inside the valid range.
+ return nZoom;
+}
+
+void Window::SetZoomIntegral(::tools::Long nZoom)
+{
+ // Clip the zoom factor to the valid range marked by nMinZoom as
+ // previously calculated by <member>CalcMinZoom()</member> and the
+ // MAX_ZOOM constant.
+ if ( nZoom > MAX_ZOOM )
+ nZoom = MAX_ZOOM;
+ if ( nZoom < static_cast<::tools::Long>(mnMinZoom) )
+ nZoom = mnMinZoom;
+
+ // Calculate the window's new origin.
+ Size aSize = PixelToLogic(GetOutputSizePixel());
+ ::tools::Long nW = aSize.Width() * GetZoom() / nZoom;
+ ::tools::Long nH = aSize.Height() * GetZoom() / nZoom;
+ maWinPos.AdjustX((aSize.Width() - nW) / 2 );
+ maWinPos.AdjustY((aSize.Height() - nH) / 2 );
+ if ( maWinPos.X() < 0 ) maWinPos.setX( 0 );
+ if ( maWinPos.Y() < 0 ) maWinPos.setY( 0 );
+
+ // Finally update this window's map mode to the given zoom factor that
+ // has been clipped to the valid range.
+ SetZoomFactor(nZoom);
+}
+
+::tools::Long Window::GetZoomForRect( const ::tools::Rectangle& rZoomRect )
+{
+ ::tools::Long nRetZoom = 100;
+
+ if( (rZoomRect.GetWidth() != 0) && (rZoomRect.GetHeight() != 0))
+ {
+ // Calculate the scale factors which will lead to the given
+ // rectangle being fully visible (when translated accordingly) as
+ // large as possible in the output area independently in both
+ // coordinate directions .
+ sal_uLong nX(0);
+ sal_uLong nY(0);
+
+ const Size aWinSize( PixelToLogic(GetOutputSizePixel()) );
+ if(rZoomRect.GetHeight())
+ {
+ nX = static_cast<sal_uLong>(static_cast<double>(aWinSize.Height())
+ * double(ZOOM_MULTIPLICATOR) / static_cast<double>(rZoomRect.GetHeight()));
+ }
+
+ if(rZoomRect.GetWidth())
+ {
+ nY = static_cast<sal_uLong>(static_cast<double>(aWinSize.Width())
+ * double(ZOOM_MULTIPLICATOR) / static_cast<double>(rZoomRect.GetWidth()));
+ }
+
+ // Use the smaller one of both so that the zoom rectangle will be
+ // fully visible with respect to both coordinate directions.
+ sal_uLong nFact = std::min(nX, nY);
+
+ // Transform the current zoom factor so that it leads to the desired
+ // scaling.
+ nRetZoom = nFact * GetZoom() / ZOOM_MULTIPLICATOR;
+
+ // Calculate the new origin.
+ if ( nFact == 0 )
+ {
+ // Don't change anything if the scale factor is degenerate.
+ nRetZoom = GetZoom();
+ }
+ else
+ {
+ // Clip the zoom factor to the valid range marked by nMinZoom as
+ // previously calculated by <member>CalcMinZoom()</member> and the
+ // MAX_ZOOM constant.
+ if ( nRetZoom > MAX_ZOOM )
+ nRetZoom = MAX_ZOOM;
+ if ( nRetZoom < static_cast<::tools::Long>(mnMinZoom) )
+ nRetZoom = mnMinZoom;
+ }
+ }
+
+ return nRetZoom;
+}
+
+/** Recalculate the zoom factor and translation so that the given rectangle
+ is displayed centered and as large as possible while still being fully
+ visible in the window.
+*/
+::tools::Long Window::SetZoomRect (const ::tools::Rectangle& rZoomRect)
+{
+ ::tools::Long nNewZoom = 100;
+
+ if (rZoomRect.GetWidth() == 0 || rZoomRect.GetHeight() == 0)
+ {
+ // The given rectangle is degenerate. Use the default zoom factor
+ // (above) of 100%.
+ SetZoomIntegral(nNewZoom);
+ }
+ else
+ {
+ Point aPos = rZoomRect.TopLeft();
+ // Transform the output area from pixel coordinates into logical
+ // coordinates.
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+ // Paranoia! The degenerate case of zero width or height has been
+ // taken care of above.
+ DBG_ASSERT(rZoomRect.GetWidth(), "ZoomRect-Width = 0!");
+ DBG_ASSERT(rZoomRect.GetHeight(), "ZoomRect-Height = 0!");
+
+ // Calculate the scale factors which will lead to the given
+ // rectangle being fully visible (when translated accordingly) as
+ // large as possible in the output area independently in both
+ // coordinate directions .
+ sal_uLong nX(0);
+ sal_uLong nY(0);
+
+ if(rZoomRect.GetHeight())
+ {
+ nX = static_cast<sal_uLong>(static_cast<double>(aWinSize.Height())
+ * double(ZOOM_MULTIPLICATOR) / static_cast<double>(rZoomRect.GetHeight()));
+ }
+
+ if(rZoomRect.GetWidth())
+ {
+ nY = static_cast<sal_uLong>(static_cast<double>(aWinSize.Width())
+ * double(ZOOM_MULTIPLICATOR) / static_cast<double>(rZoomRect.GetWidth()));
+ }
+
+ // Use the smaller one of both so that the zoom rectangle will be
+ // fully visible with respect to both coordinate directions.
+ sal_uLong nFact = std::min(nX, nY);
+
+ // Transform the current zoom factor so that it leads to the desired
+ // scaling.
+ ::tools::Long nZoom = nFact * GetZoom() / ZOOM_MULTIPLICATOR;
+
+ // Calculate the new origin.
+ if ( nFact == 0 )
+ {
+ // Don't change anything if the scale factor is degenerate.
+ nNewZoom = GetZoom();
+ }
+ else
+ {
+ // Calculate the new window position that centers the given
+ // rectangle on the screen.
+ if ( nZoom > MAX_ZOOM )
+ nFact = nFact * MAX_ZOOM / nZoom;
+
+ maWinPos = maViewOrigin + aPos;
+
+ aWinSize.setWidth( static_cast<::tools::Long>(static_cast<double>(aWinSize.Width()) * double(ZOOM_MULTIPLICATOR) / static_cast<double>(nFact)) );
+ maWinPos.AdjustX((rZoomRect.GetWidth() - aWinSize.Width()) / 2 );
+ aWinSize.setHeight( static_cast<::tools::Long>(static_cast<double>(aWinSize.Height()) * double(ZOOM_MULTIPLICATOR) / static_cast<double>(nFact)) );
+ maWinPos.AdjustY((rZoomRect.GetHeight() - aWinSize.Height()) / 2 );
+
+ if ( maWinPos.X() < 0 ) maWinPos.setX( 0 );
+ if ( maWinPos.Y() < 0 ) maWinPos.setY( 0 );
+
+ // Adapt the window's map mode to the new zoom factor.
+ nNewZoom = SetZoomFactor(nZoom);
+ }
+ }
+
+ return nNewZoom;
+}
+
+void Window::SetMinZoomAutoCalc (bool bAuto)
+{
+ mbMinZoomAutoCalc = bAuto;
+}
+
+/**
+ * Calculate and set new MapMode origin.
+ * If aWinPos.X()/Y() == -1, then we center the corresponding position (e.g. for
+ * initialization).
+ */
+void Window::UpdateMapOrigin(bool bInvalidate)
+{
+ bool bChanged = false;
+ const Size aWinSize = PixelToLogic(GetOutputSizePixel());
+
+ if ( mbCenterAllowed )
+ {
+ if( maPrevSize != Size(-1,-1) )
+ {
+ // keep view centered around current pos, when window
+ // resizes
+ maWinPos.AdjustX( -((aWinSize.Width() - maPrevSize.Width()) / 2) );
+ maWinPos.AdjustY( -((aWinSize.Height() - maPrevSize.Height()) / 2) );
+ bChanged = true;
+ }
+
+ if ( maWinPos.X() > maViewSize.Width() - aWinSize.Width() )
+ {
+ maWinPos.setX( maViewSize.Width() - aWinSize.Width() );
+ bChanged = true;
+ }
+ if ( maWinPos.Y() > maViewSize.Height() - aWinSize.Height() )
+ {
+ maWinPos.setY( maViewSize.Height() - aWinSize.Height() );
+ bChanged = true;
+ }
+ if ( aWinSize.Width() > maViewSize.Width() || maWinPos.X() < 0 )
+ {
+ maWinPos.setX( maViewSize.Width() / 2 - aWinSize.Width() / 2 );
+ bChanged = true;
+ }
+ if ( aWinSize.Height() > maViewSize.Height() || maWinPos.Y() < 0 )
+ {
+ maWinPos.setY( maViewSize.Height() / 2 - aWinSize.Height() / 2 );
+ bChanged = true;
+ }
+ }
+
+ UpdateMapMode ();
+
+ maPrevSize = aWinSize;
+
+ // When tiled rendering, the above UpdateMapMode() call doesn't touch the map mode.
+ if (bChanged && bInvalidate && !comphelper::LibreOfficeKit::isActive())
+ Invalidate();
+}
+
+void Window::UpdateMapMode()
+{
+ maWinPos -= maViewOrigin;
+ Size aPix(maWinPos.X(), maWinPos.Y());
+ aPix = LogicToPixel(aPix);
+ // Size has to be a multiple of BRUSH_SIZE due to the correct depiction of
+ // pattern
+ // #i2237#
+ // removed old stuff here which still forced zoom to be
+ // %BRUSH_SIZE which is outdated now
+
+ if (dynamic_cast< DrawViewShell *>( mpViewShell ))
+ {
+ // page should not "stick" to the window border
+ if (aPix.Width() == 0)
+ {
+ // #i2237#
+ // Since BRUSH_SIZE alignment is outdated now, i use the
+ // former constant here directly
+ aPix.AdjustWidth( -8 );
+ }
+ if (aPix.Height() == 0)
+ {
+ // #i2237#
+ // Since BRUSH_SIZE alignment is outdated now, i use the
+ // former constant here directly
+ aPix.AdjustHeight( -8 );
+ }
+ }
+
+ aPix = PixelToLogic(aPix);
+ maWinPos.setX( aPix.Width() );
+ maWinPos.setY( aPix.Height() );
+ Point aNewOrigin (-maWinPos.X(), -maWinPos.Y());
+ maWinPos += maViewOrigin;
+
+ if (!comphelper::LibreOfficeKit::isActive())
+ {
+ MapMode aMap(GetMapMode());
+ aMap.SetOrigin(aNewOrigin);
+ SetMapMode(aMap);
+ }
+}
+
+/**
+ * @returns X position of the visible area as fraction (< 1) of the whole
+ * working area.
+ */
+double Window::GetVisibleX() const
+{
+ return maViewSize.Width() == 0 ? 0 : (static_cast<double>(maWinPos.X()) / maViewSize.Width());
+}
+
+/**
+ * @returns Y position of the visible area as fraction (< 1) of the whole
+ * working area.
+ */
+double Window::GetVisibleY() const
+{
+ return maViewSize.Height() == 0 ? 0 : (static_cast<double>(maWinPos.Y()) / maViewSize.Height());
+}
+
+/**
+ * Set x and y position of the visible area as fraction (< 1) of the whole
+ * working area. Negative values are ignored.
+ */
+void Window::SetVisibleXY(double fX, double fY)
+{
+ ::tools::Long nOldX = maWinPos.X();
+ ::tools::Long nOldY = maWinPos.Y();
+
+ if ( fX >= 0 )
+ maWinPos.setX( static_cast<::tools::Long>(fX * maViewSize.Width()) );
+ if ( fY >= 0 )
+ maWinPos.setY( static_cast<::tools::Long>(fY * maViewSize.Height()) );
+ UpdateMapOrigin(false);
+ Scroll(nOldX - maWinPos.X(), nOldY - maWinPos.Y(), ScrollFlags::Children);
+ PaintImmediately();
+}
+
+/**
+ * @returns width of the visible area in proportion to the width of the whole
+ * working area.
+ */
+double Window::GetVisibleWidth() const
+{
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+ if ( aWinSize.Width() > maViewSize.Width() )
+ aWinSize.setWidth( maViewSize.Width() );
+ return
+ maViewSize.Width() == 0 ? 0 : (static_cast<double>(aWinSize.Width()) / maViewSize.Width());
+}
+
+/**
+ * @returns height of the visible area in proportion to the height of the whole
+ * working area.
+ */
+double Window::GetVisibleHeight() const
+{
+ Size aWinSize = PixelToLogic(GetOutputSizePixel());
+ if ( aWinSize.Height() > maViewSize.Height() )
+ aWinSize.setHeight( maViewSize.Height() );
+ return maViewSize.Height() == 0
+ ? 0 : (static_cast<double>(aWinSize.Height()) / maViewSize.Height());
+}
+
+Point Window::GetVisibleCenter()
+{
+ Point aPos = ::tools::Rectangle(Point(), GetOutputSizePixel()).Center();
+
+ // For LOK
+ bool bMapModeWasEnabled(IsMapModeEnabled());
+ EnableMapMode(/*true*/);
+ aPos = PixelToLogic(aPos);
+ EnableMapMode(bMapModeWasEnabled);
+
+ return aPos;
+}
+
+/**
+ * @returns width of a scroll column in proportion to the width of the whole
+ * working area.
+ */
+double Window::GetScrlLineWidth() const
+{
+ return (GetVisibleWidth() * SCROLL_LINE_FACT);
+}
+
+/**
+ * @returns height of a scroll column in proportion to the height of the whole
+ * working area.
+ */
+double Window::GetScrlLineHeight() const
+{
+ return (GetVisibleHeight() * SCROLL_LINE_FACT);
+}
+
+/**
+ * @returns width of a scroll page in proportion to the width of the whole
+ * working area.
+ */
+double Window::GetScrlPageWidth() const
+{
+ return (GetVisibleWidth() * SCROLL_PAGE_FACT);
+}
+
+/**
+ * @returns height of a scroll page in proportion to the height of the whole
+ * working area.
+ */
+double Window::GetScrlPageHeight() const
+{
+ return (GetVisibleHeight() * SCROLL_PAGE_FACT);
+}
+
+/**
+ * Deactivate window.
+ */
+void Window::LoseFocus()
+{
+ mnTicks = 0;
+ vcl::Window::LoseFocus ();
+}
+
+/**
+ * Activate window.
+ */
+void Window::GrabFocus()
+{
+ mnTicks = 0;
+ vcl::Window::GrabFocus ();
+}
+
+void Window::DataChanged( const DataChangedEvent& rDCEvt )
+{
+ vcl::Window::DataChanged( rDCEvt );
+
+ /* Omit PRINTER by all documents which are not using a printer.
+ Omit FONTS and FONTSUBSTITUTION if no text output is available or if the
+ document does not allow text. */
+
+ if ( !((rDCEvt.GetType() == DataChangedEventType::PRINTER) ||
+ (rDCEvt.GetType() == DataChangedEventType::DISPLAY) ||
+ (rDCEvt.GetType() == DataChangedEventType::FONTS) ||
+ (rDCEvt.GetType() == DataChangedEventType::FONTSUBSTITUTION) ||
+ ((rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
+ (rDCEvt.GetFlags() & AllSettingsFlags::STYLE))) )
+ return;
+
+ if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
+ (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
+ {
+ /* Rearrange or initiate Resize for scroll bars since the size of
+ the scroll bars my have changed. Within this, inside the resize-
+ handler, the size of the scroll bars will be asked from the
+ Settings. */
+ Resize();
+
+ /* Re-set data, which are from system control or from Settings. May
+ have to re-set more data since the resolution may also has
+ changed. */
+ if( mpViewShell )
+ {
+ const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
+ DrawModeFlags nOutputMode;
+ sal_uInt16 nPreviewSlot;
+
+ if( rStyleSettings.GetHighContrastMode() )
+ nOutputMode = sd::OUTPUT_DRAWMODE_CONTRAST;
+ else
+ nOutputMode = sd::OUTPUT_DRAWMODE_COLOR;
+
+ if( rStyleSettings.GetHighContrastMode()
+ && officecfg::Office::Common::Accessibility::IsForPagePreviews::get() )
+ nPreviewSlot = SID_PREVIEW_QUALITY_CONTRAST;
+ else
+ nPreviewSlot = SID_PREVIEW_QUALITY_COLOR;
+
+ if( dynamic_cast< DrawViewShell *>( mpViewShell ) != nullptr )
+ {
+ GetOutDev()->SetDrawMode( nOutputMode );
+ mpViewShell->GetFrameView()->SetDrawMode( nOutputMode );
+ Invalidate();
+ }
+
+ // Overwrite window color for OutlineView
+ if( dynamic_cast< OutlineViewShell *>( mpViewShell ) != nullptr )
+ {
+ svtools::ColorConfig aColorConfig;
+ const Color aDocColor( aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor );
+ SetBackground( Wallpaper( aDocColor ) );
+ }
+
+ SfxRequest aReq( nPreviewSlot, SfxCallMode::SLOT, mpViewShell->GetDocSh()->GetDoc()->GetItemPool() );
+ mpViewShell->ExecReq( aReq );
+ mpViewShell->Invalidate();
+ mpViewShell->ArrangeGUIElements();
+
+ // re-create handles to show new outfit
+ if(dynamic_cast< DrawViewShell *>( mpViewShell ) != nullptr)
+ {
+ mpViewShell->GetView()->AdjustMarkHdl();
+ }
+ }
+ }
+
+ if ( (rDCEvt.GetType() == DataChangedEventType::DISPLAY) ||
+ ((rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
+ (rDCEvt.GetFlags() & AllSettingsFlags::STYLE)) )
+ {
+ /* Virtual devices, which also depends on the resolution or the
+ system control, should be updated. Otherwise, we should update
+ the virtual devices at least at DataChangedEventType::DISPLAY since some
+ systems allow to change the resolution and color depth during
+ runtime. Or the virtual devices have to be updated when the color
+ palette has changed since a different color matching can be used
+ when outputting. */
+ }
+
+ if ( rDCEvt.GetType() == DataChangedEventType::FONTS )
+ {
+ /* If the document provides font choose boxes, we have to update
+ them. I don't know how this looks like (also not really me, I
+ only translated the comment ;). We may can handle it global. We
+ have to discuss it with PB, but he is ill at the moment.
+ Before we handle it here, discuss it with PB and me. */
+ }
+
+ if ( (rDCEvt.GetType() == DataChangedEventType::FONTS) ||
+ (rDCEvt.GetType() == DataChangedEventType::FONTSUBSTITUTION) )
+ {
+ /* Do reformatting since the fonts of the document may no longer
+ exist, or exist now, or are replaced with others. */
+ if( mpViewShell )
+ {
+ DrawDocShell* pDocSh = mpViewShell->GetDocSh();
+ if( pDocSh )
+ pDocSh->SetPrinter( pDocSh->GetPrinter( true ) );
+ }
+ }
+
+ if ( rDCEvt.GetType() == DataChangedEventType::PRINTER )
+ {
+ /* I don't know how the handling should look like. Maybe we delete a
+ printer and look what we have to do. Maybe I have to add
+ something to the VCL, in case the used printer is deleted.
+ Otherwise I may recalculate the formatting here if the current
+ printer is destroyed. */
+ if( mpViewShell )
+ {
+ DrawDocShell* pDocSh = mpViewShell->GetDocSh();
+ if( pDocSh )
+ pDocSh->SetPrinter( pDocSh->GetPrinter( true ) );
+ }
+ }
+
+ // Update everything
+ Invalidate();
+}
+
+sal_Int8 Window::AcceptDrop( const AcceptDropEvent& rEvt )
+{
+ sal_Int8 nRet = DND_ACTION_NONE;
+
+ if( mpViewShell && !mpViewShell->GetDocSh()->IsReadOnly() )
+ {
+ nRet = mpViewShell->AcceptDrop( rEvt, *this, this, SDRPAGE_NOTFOUND, SDRLAYER_NOTFOUND );
+
+ if (mbUseDropScroll && dynamic_cast< OutlineViewShell *>( mpViewShell ) == nullptr)
+ DropScroll( rEvt.maPosPixel );
+ }
+
+ return nRet;
+}
+
+sal_Int8 Window::ExecuteDrop( const ExecuteDropEvent& rEvt )
+{
+ sal_Int8 nRet = DND_ACTION_NONE;
+
+ if( mpViewShell )
+ {
+ nRet = mpViewShell->ExecuteDrop( rEvt, *this, this, SDRPAGE_NOTFOUND, SDRLAYER_NOTFOUND );
+ }
+
+ return nRet;
+}
+
+void Window::SetUseDropScroll (bool bUseDropScroll)
+{
+ mbUseDropScroll = bUseDropScroll;
+}
+
+void Window::DropScroll(const Point& rMousePos)
+{
+ short nDx = 0;
+ short nDy = 0;
+
+ Size aSize = GetOutputSizePixel();
+
+ if (aSize.Width() > SCROLL_SENSITIVE * 3)
+ {
+ if ( rMousePos.X() < SCROLL_SENSITIVE )
+ {
+ nDx = -1;
+ }
+
+ if ( rMousePos.X() >= aSize.Width() - SCROLL_SENSITIVE )
+ {
+ nDx = 1;
+ }
+ }
+
+ if (aSize.Height() > SCROLL_SENSITIVE * 3)
+ {
+ if ( rMousePos.Y() < SCROLL_SENSITIVE )
+ {
+ nDy = -1;
+ }
+
+ if ( rMousePos.Y() >= aSize.Height() - SCROLL_SENSITIVE )
+ {
+ nDy = 1;
+ }
+ }
+
+ if ( (nDx || nDy) && (rMousePos.X()!=0 || rMousePos.Y()!=0 ) )
+ {
+ if (mnTicks > 20)
+ mpViewShell->ScrollLines(nDx, nDy);
+ else
+ mnTicks ++;
+ }
+}
+
+css::uno::Reference<css::accessibility::XAccessible>
+ Window::CreateAccessible()
+{
+ // If current viewshell is PresentationViewShell, just return empty because the correct ShowWin will be created later.
+ if (dynamic_cast< PresentationViewShell *>( mpViewShell ))
+ {
+ return vcl::Window::CreateAccessible ();
+ }
+ css::uno::Reference< css::accessibility::XAccessible > xAcc = GetAccessible(false);
+ if (xAcc)
+ {
+ return xAcc;
+ }
+ if (mpViewShell != nullptr)
+ {
+ xAcc = mpViewShell->CreateAccessibleDocumentView (this);
+ SetAccessible(xAcc);
+ return xAcc;
+ }
+ else
+ {
+ SAL_WARN("sd", "::sd::Window::CreateAccessible: no view shell");
+ return vcl::Window::CreateAccessible ();
+ }
+}
+
+OutlinerView* Window::GetOutlinerView() const
+{
+ OutlinerView *pOLV = nullptr;
+ sd::View* pView = mpViewShell->GetView();
+ if (mpViewShell->GetShellType() == ViewShell::ST_OUTLINE)
+ {
+ if (OutlineView* pOView = dynamic_cast<OutlineView*>(pView))
+ pOLV = pOView->GetViewByWindow(this);
+ }
+ else if (pView->IsTextEdit())
+ {
+ pOLV = pView->GetTextEditOutlinerView();
+ }
+ return pOLV;
+}
+
+OUString Window::GetSurroundingText() const
+{
+ OutlinerView *pOLV = GetOutlinerView();
+ if (pOLV)
+ return pOLV->GetEditView().GetSurroundingText();
+ return OUString();
+}
+
+Selection Window::GetSurroundingTextSelection() const
+{
+ OutlinerView *pOLV = GetOutlinerView();
+ if (pOLV)
+ return pOLV->GetEditView().GetSurroundingTextSelection();
+ return Selection( 0, 0 );
+}
+
+bool Window::DeleteSurroundingText(const Selection& rSelection)
+{
+ OutlinerView *pOLV = GetOutlinerView();
+ if (pOLV)
+ return pOLV->GetEditView().DeleteSurroundingText(rSelection);
+ return false;
+}
+
+void Window::LogicInvalidate(const ::tools::Rectangle* pRectangle)
+{
+ DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>(mpViewShell);
+ if (!pDrawViewShell || pDrawViewShell->IsInSwitchPage())
+ return;
+
+ if (!comphelper::LibreOfficeKit::isActive())
+ return;
+ ::tools::Rectangle aRectangle;
+ ::tools::Rectangle* pResultRectangle;
+ if (!pRectangle)
+ pResultRectangle = nullptr;
+ else
+ {
+ aRectangle = *pRectangle;
+ if (GetMapMode().GetMapUnit() == MapUnit::Map100thMM)
+ {
+ aRectangle = o3tl::convert(aRectangle, o3tl::Length::mm100, o3tl::Length::twip);
+ }
+ pResultRectangle = &aRectangle;
+ }
+ SfxViewShell& rSfxViewShell = pDrawViewShell->GetViewShellBase();
+ SfxLokHelper::notifyInvalidation(&rSfxViewShell, pResultRectangle);
+}
+
+void Window::LogicMouseButtonDown(const MouseEvent& rMouseEvent)
+{
+ // When we're not doing tiled rendering, then positions must be passed as pixels.
+ assert(comphelper::LibreOfficeKit::isActive());
+
+ Point aPoint = GetPointerPosPixel();
+ SetLastMousePos(rMouseEvent.GetPosPixel());
+
+ mpViewShell->MouseButtonDown(rMouseEvent, this);
+
+ SetPointerPosPixel(aPoint);
+}
+
+void Window::LogicMouseButtonUp(const MouseEvent& rMouseEvent)
+{
+ // When we're not doing tiled rendering, then positions must be passed as pixels.
+ assert(comphelper::LibreOfficeKit::isActive());
+
+ Point aPoint = GetPointerPosPixel();
+ SetLastMousePos(rMouseEvent.GetPosPixel());
+
+ mpViewShell->MouseButtonUp(rMouseEvent, this);
+
+ SetPointerPosPixel(aPoint);
+}
+
+void Window::LogicMouseMove(const MouseEvent& rMouseEvent)
+{
+ // When we're not doing tiled rendering, then positions must be passed as pixels.
+ assert(comphelper::LibreOfficeKit::isActive());
+
+ Point aPoint = GetPointerPosPixel();
+ SetLastMousePos(rMouseEvent.GetPosPixel());
+
+ mpViewShell->MouseMove(rMouseEvent, this);
+
+ SetPointerPosPixel(aPoint);
+}
+
+FactoryFunction Window::GetUITestFactory() const
+{
+ if (get_id() == "impress_win")
+ return ImpressWindowUIObject::create;
+
+ return WindowUIObject::create;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/tabcontr.cxx b/sd/source/ui/view/tabcontr.cxx
new file mode 100644
index 000000000..b09a254e9
--- /dev/null
+++ b/sd/source/ui/view/tabcontr.cxx
@@ -0,0 +1,358 @@
+/* -*- 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 <TabControl.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/dispatch.hxx>
+#include <vcl/commandevent.hxx>
+#include <vcl/vclevent.hxx>
+
+#include <app.hrc>
+
+#include <DrawViewShell.hxx>
+#include <helpids.h>
+#include <View.hxx>
+#include <drawdoc.hxx>
+#include <DrawDocShell.hxx>
+
+namespace sd {
+
+
+TabControl::TabControlTransferable::~TabControlTransferable()
+{
+}
+
+void TabControl::TabControlTransferable::AddSupportedFormats()
+{
+ AddFormat( SotClipboardFormatId::STARDRAW_TABBAR );
+}
+
+bool TabControl::TabControlTransferable::GetData( const css::datatransfer::DataFlavor& /*rFlavor*/, const OUString& /*rDestDoc*/ )
+{
+ return false;
+}
+
+void TabControl::TabControlTransferable::DragFinished( sal_Int8 /*nDropAction*/ )
+{
+ mrParent.DragFinished();
+}
+
+TabControl::TabControl(DrawViewShell* pViewSh, vcl::Window* pParent) :
+ TabBar( pParent, WinBits( WB_BORDER | WB_3DLOOK | WB_SCROLL | WB_SIZEABLE | WB_DRAG) ),
+ DragSourceHelper( this ),
+ DropTargetHelper( this ),
+ pDrViewSh(pViewSh),
+ bInternalMove(false)
+{
+ EnableEditMode();
+ SetSizePixel(Size(0, 0));
+ SetMaxPageWidth( 150 );
+ SetHelpId( HID_SD_TABBAR_PAGES );
+}
+
+TabControl::~TabControl()
+{
+ disposeOnce();
+}
+
+void TabControl::dispose()
+{
+ DragSourceHelper::dispose();
+ DropTargetHelper::dispose();
+ TabBar::dispose();
+}
+
+void TabControl::Select()
+{
+ SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
+ pDispatcher->Execute(SID_SWITCHPAGE, SfxCallMode::ASYNCHRON |
+ SfxCallMode::RECORD);
+}
+
+void TabControl::MouseButtonDown(const MouseEvent& rMEvt)
+{
+ if (rMEvt.IsLeft()
+ && !rMEvt.IsMod1()
+ && !rMEvt.IsMod2()
+ && !rMEvt.IsShift())
+ {
+ Point aPos = PixelToLogic( rMEvt.GetPosPixel() );
+ sal_uInt16 aPageId = GetPageId(aPos);
+
+ //initialize
+ if (aPageId == 0)
+ {
+ SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
+
+ pDispatcher->Execute(SID_INSERTPAGE_QUICK,
+ SfxCallMode::SYNCHRON | SfxCallMode::RECORD);
+ }
+ }
+
+ // A single left click with pressed control key on a tab page first
+ // switches to that page before the usual handling (copying with drag
+ // and drop) takes place.
+ else if (rMEvt.IsLeft() && rMEvt.IsMod1() && !rMEvt.IsMod2() && !rMEvt.IsShift())
+ {
+ pDrViewSh->SwitchPage (GetPageId (rMEvt.GetPosPixel()) - 1);
+ }
+
+ // When only the right button is pressed then first process a
+ // synthesized left button click to make the page the current one
+ // whose tab has been clicked. When then the actual right button
+ // click is processed the resulting context menu relates to the
+ // now current page.
+ if (rMEvt.IsRight() && ! rMEvt.IsLeft())
+ {
+ MouseEvent aSyntheticEvent (
+ rMEvt.GetPosPixel(),
+ rMEvt.GetClicks(),
+ rMEvt.GetMode(),
+ MOUSE_LEFT,
+ rMEvt.GetModifier());
+ TabBar::MouseButtonDown(aSyntheticEvent);
+ }
+
+ TabBar::MouseButtonDown(rMEvt);
+}
+
+void TabControl::DoubleClick()
+{
+ if (GetCurPageId() != 0)
+ {
+ SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
+ pDispatcher->Execute( SID_MODIFYPAGE,
+ SfxCallMode::SYNCHRON | SfxCallMode::RECORD );
+ }
+}
+
+void TabControl::StartDrag( sal_Int8, const Point& )
+{
+ bInternalMove = true;
+
+ // object is delete by reference mechanism
+ ( new TabControl::TabControlTransferable( *this ) )->StartDrag( this, DND_ACTION_COPYMOVE );
+}
+
+void TabControl::DragFinished()
+{
+ bInternalMove = false;
+}
+
+sal_Int8 TabControl::AcceptDrop( const AcceptDropEvent& rEvt )
+{
+ sal_Int8 nRet = DND_ACTION_NONE;
+
+ if( rEvt.mbLeaving )
+ EndSwitchPage();
+
+ if( !pDrViewSh->GetDocSh()->IsReadOnly() )
+ {
+ SdDrawDocument* pDoc = pDrViewSh->GetDoc();
+ Point aPos( rEvt.maPosPixel );
+
+ if( bInternalMove )
+ {
+ if( rEvt.mbLeaving || ( pDrViewSh->GetEditMode() == EditMode::MasterPage ) )
+ HideDropPos();
+ else
+ {
+ ShowDropPos( aPos );
+ nRet = rEvt.mnAction;
+ }
+ }
+ else
+ {
+ HideDropPos();
+
+ sal_Int32 nPageId = GetPageId( aPos ) - 1;
+
+ if( ( nPageId >= 0 ) && pDoc->GetPage( static_cast<sal_uInt16>(nPageId) ) )
+ {
+ nRet = pDrViewSh->AcceptDrop( rEvt, *this, nullptr, static_cast<sal_uInt16>(nPageId), SDRLAYER_NOTFOUND );
+ SwitchPage( aPos );
+ }
+ }
+ }
+
+ return nRet;
+}
+
+sal_Int8 TabControl::ExecuteDrop( const ExecuteDropEvent& rEvt )
+{
+ SdDrawDocument* pDoc = pDrViewSh->GetDoc();
+ Point aPos( rEvt.maPosPixel );
+ sal_Int8 nRet = DND_ACTION_NONE;
+
+ if( bInternalMove )
+ {
+ sal_uInt16 nPageId = ShowDropPos( aPos ) - 1;
+
+ switch (rEvt.mnAction)
+ {
+ case DND_ACTION_MOVE:
+ if( pDrViewSh->IsSwitchPageAllowed() && pDoc->MovePages( nPageId ) )
+ {
+ SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
+ pDispatcher->Execute(SID_SWITCHPAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ }
+ break;
+
+ case DND_ACTION_COPY:
+ {
+ // Copying the selected page to the place that rEvt points
+ // takes place in three steps:
+ // 1. Create a copy of the selected page. This copy will
+ // lie directly behind the selected page.
+ // 2. Move the copy to the desired place.
+ // 3. Select the copy.
+ if (pDrViewSh->IsSwitchPageAllowed())
+ {
+ // 1. Create a copy.
+ sal_uInt16 nPageNumOfCopy = pDoc->DuplicatePage (GetCurPageId() - 1);
+ // 2. Move page. For this first switch to the copy:
+ // MovePages operates on the currently selected page(s).
+ pDrViewSh->SwitchPage (nPageNumOfCopy);
+ // Adapt target page id when necessary, i.e. page copy
+ // has been inserted in front of the target page.
+ sal_uInt16 nPageNum = nPageId;
+ if ((nPageNumOfCopy <= nPageNum) && (nPageNum != sal_uInt16(-1)))
+ nPageNum += 1;
+ if (pDoc->MovePages(nPageNum))
+ {
+ // 3. Switch to the copy that has been moved to its
+ // final destination. Use an asynchron slot call to
+ // be executed after the still pending ones.
+ if (nPageNumOfCopy >= nPageNum || (nPageNum == sal_uInt16(-1)))
+ nPageNum += 1;
+ SetCurPageId (GetPageId(nPageNum));
+ SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
+ pDispatcher->Execute(SID_SWITCHPAGE,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ }
+ }
+
+ break;
+ }
+ }
+
+ nRet = rEvt.mnAction;
+ }
+ else
+ {
+ sal_Int32 nPageId = GetPageId( aPos ) - 1;
+
+ if( ( nPageId >= 0 ) && pDoc->GetPage( static_cast<sal_uInt16>(nPageId) ) )
+ {
+ nRet = pDrViewSh->ExecuteDrop( rEvt, *this, nullptr, static_cast<sal_uInt16>(nPageId), SDRLAYER_NOTFOUND );
+ }
+ }
+
+ HideDropPos();
+ EndSwitchPage();
+
+ return nRet;
+}
+
+void TabControl::Command(const CommandEvent& rCEvt)
+{
+ if ( rCEvt.GetCommand() == CommandEventId::ContextMenu )
+ {
+ SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
+ pDispatcher->ExecutePopup("pagetab");
+ }
+}
+
+bool TabControl::StartRenaming()
+{
+ bool bOK = false;
+
+ if (pDrViewSh->GetPageKind() == PageKind::Standard)
+ {
+ bOK = true;
+
+ ::sd::View* pView = pDrViewSh->GetView();
+
+ if ( pView->IsTextEdit() )
+ pView->SdrEndTextEdit();
+ }
+
+ return bOK;
+}
+
+TabBarAllowRenamingReturnCode TabControl::AllowRenaming()
+{
+ bool bOK = true;
+
+ OUString aNewName( GetEditText() );
+ OUString aCompareName( GetPageText( GetEditPageId() ) );
+
+ if( aCompareName != aNewName )
+ {
+ // rename page
+ if (pDrViewSh->GetDocSh()->CheckPageName(GetFrameWeld(), aNewName))
+ {
+ SetEditText( aNewName );
+ EndRenaming();
+ }
+ else
+ {
+ bOK = false;
+ }
+ }
+ return bOK ? TABBAR_RENAMING_YES : TABBAR_RENAMING_NO;
+}
+
+void TabControl::EndRenaming()
+{
+ if( !IsEditModeCanceled() )
+ pDrViewSh->RenameSlide( GetEditPageId(), GetEditText() );
+}
+
+void TabControl::ActivatePage()
+{
+ if ( /*IsInSwitching && */ pDrViewSh->IsSwitchPageAllowed() )
+ {
+ SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
+ pDispatcher->Execute(SID_SWITCHPAGE,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ }
+}
+
+bool TabControl::DeactivatePage()
+{
+ return pDrViewSh->IsSwitchPageAllowed();
+}
+
+void TabControl::SendActivatePageEvent()
+{
+ CallEventListeners (VclEventId::TabbarPageActivated,
+ reinterpret_cast<void*>(GetCurPageId()));
+}
+
+void TabControl::SendDeactivatePageEvent()
+{
+ CallEventListeners (VclEventId::TabbarPageDeactivated,
+ reinterpret_cast<void*>(GetCurPageId()));
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/unmodpg.cxx b/sd/source/ui/view/unmodpg.cxx
new file mode 100644
index 000000000..03d907d14
--- /dev/null
+++ b/sd/source/ui/view/unmodpg.cxx
@@ -0,0 +1,210 @@
+/* -*- 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 <svx/svdlayer.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <svx/svdviter.hxx>
+#include <svx/svdview.hxx>
+#include <tools/debug.hxx>
+
+#include <strings.hrc>
+#include <strings.hxx>
+#include <glob.hxx>
+#include <app.hrc>
+
+#include <unmodpg.hxx>
+#include <sdpage.hxx>
+#include <sdresid.hxx>
+#include <unokywds.hxx>
+#include <drawdoc.hxx>
+
+
+ModifyPageUndoAction::ModifyPageUndoAction(
+ SdDrawDocument* pTheDoc,
+ SdPage* pThePage,
+ const OUString& aTheNewName,
+ AutoLayout eTheNewAutoLayout,
+ bool bTheNewBckgrndVisible,
+ bool bTheNewBckgrndObjsVisible)
+: SdUndoAction(pTheDoc)
+{
+ DBG_ASSERT(pThePage, "Undo without a page???");
+
+ mpPage = pThePage;
+ maNewName = aTheNewName;
+ meNewAutoLayout = eTheNewAutoLayout;
+ mbNewBckgrndVisible = bTheNewBckgrndVisible;
+ mbNewBckgrndObjsVisible = bTheNewBckgrndObjsVisible;
+
+ meOldAutoLayout = mpPage->GetAutoLayout();
+
+ if (!mpPage->IsMasterPage())
+ {
+ maOldName = mpPage->GetName();
+ SdrLayerAdmin& rLayerAdmin = mpDoc->GetLayerAdmin();
+ SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background);
+ SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects);
+ SdrLayerIDSet aVisibleLayers = mpPage->TRG_GetMasterPageVisibleLayers();
+
+ mbOldBckgrndVisible = aVisibleLayers.IsSet(aBckgrnd);
+ mbOldBckgrndObjsVisible = aVisibleLayers.IsSet(aBckgrndObj);
+ }
+ else
+ {
+ mbOldBckgrndVisible = false;
+ mbOldBckgrndObjsVisible = false;
+ }
+
+ if (pTheDoc && pTheDoc->GetDocumentType() == DocumentType::Draw)
+ SetComment( SdResId(STR_UNDO_MODIFY_PAGE_DRAW) );
+ else
+ SetComment( SdResId(STR_UNDO_MODIFY_PAGE) );
+}
+
+void ModifyPageUndoAction::Undo()
+{
+ // invalidate Selection, there could be objects deleted in this UNDO
+ // which are no longer allowed to be selected then.
+ SdrViewIter aIter(mpPage);
+ SdrView* pView = aIter.FirstView();
+
+ while(pView)
+ {
+ if(pView->AreObjectsMarked())
+ pView->UnmarkAll();
+ pView = aIter.NextView();
+ }
+
+ mpPage->SetAutoLayout( meOldAutoLayout );
+
+ if (!mpPage->IsMasterPage())
+ {
+ if (mpPage->GetName() != maOldName)
+ {
+ mpPage->SetName(maOldName);
+
+ if (mpPage->GetPageKind() == PageKind::Standard)
+ {
+ SdPage* pNotesPage = static_cast<SdPage*>(mpDoc->GetPage(mpPage->GetPageNum() + 1));
+ pNotesPage->SetName(maOldName);
+ }
+ }
+
+ SdrLayerAdmin& rLayerAdmin = mpDoc->GetLayerAdmin();
+ SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background);
+ SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects);
+ SdrLayerIDSet aVisibleLayers;
+ aVisibleLayers.Set(aBckgrnd, mbOldBckgrndVisible);
+ aVisibleLayers.Set(aBckgrndObj, mbOldBckgrndObjsVisible);
+ mpPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+ }
+
+ // Redisplay
+ SfxViewFrame* pCurrent = SfxViewFrame::Current();
+ if( pCurrent )
+ {
+ pCurrent->GetDispatcher()->Execute(
+ SID_SWITCHPAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+ }
+}
+
+void ModifyPageUndoAction::Redo()
+{
+ // invalidate Selection, there could be objects deleted in this UNDO
+ // which are no longer allowed to be selected then.
+ SdrViewIter aIter(mpPage);
+ SdrView* pView = aIter.FirstView();
+
+ while(pView)
+ {
+ if(pView->AreObjectsMarked())
+ pView->UnmarkAll();
+ pView = aIter.NextView();
+ }
+
+ mpPage->meAutoLayout = meNewAutoLayout;
+
+ if (!mpPage->IsMasterPage())
+ {
+ if (mpPage->GetName() != maNewName)
+ {
+ mpPage->SetName(maNewName);
+
+ if (mpPage->GetPageKind() == PageKind::Standard)
+ {
+ SdPage* pNotesPage = static_cast<SdPage*>(mpDoc->GetPage(mpPage->GetPageNum() + 1));
+ pNotesPage->SetName(maNewName);
+ }
+ }
+
+ SdrLayerAdmin& rLayerAdmin = mpDoc->GetLayerAdmin();
+ SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background);
+ SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects);
+ SdrLayerIDSet aVisibleLayers;
+ aVisibleLayers.Set(aBckgrnd, mbNewBckgrndVisible);
+ aVisibleLayers.Set(aBckgrndObj, mbNewBckgrndObjsVisible);
+ mpPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+ }
+
+ // Redisplay
+ SfxViewFrame* pCurrent = SfxViewFrame::Current();
+ if( pCurrent )
+ {
+ pCurrent->GetDispatcher()->Execute(
+ SID_SWITCHPAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD );
+ }
+}
+
+ModifyPageUndoAction::~ModifyPageUndoAction()
+{
+}
+
+RenameLayoutTemplateUndoAction::RenameLayoutTemplateUndoAction(
+ SdDrawDocument* pDocument,
+ const OUString& rOldLayoutName,
+ const OUString& rNewLayoutName)
+ : SdUndoAction(pDocument)
+ , maOldName(rOldLayoutName)
+ , maNewName(rNewLayoutName)
+ , maComment(SdResId(STR_TITLE_RENAMESLIDE))
+{
+ sal_Int32 nPos = maOldName.indexOf(SD_LT_SEPARATOR);
+ if (nPos != -1)
+ maOldName = maOldName.copy(0, nPos);
+}
+
+void RenameLayoutTemplateUndoAction::Undo()
+{
+ OUString aLayoutName(maNewName + SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE);
+ mpDoc->RenameLayoutTemplate( aLayoutName, maOldName );
+}
+
+void RenameLayoutTemplateUndoAction::Redo()
+{
+ OUString aLayoutName(maOldName + SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE);
+ mpDoc->RenameLayoutTemplate( aLayoutName, maNewName );
+}
+
+OUString RenameLayoutTemplateUndoAction::GetComment() const
+{
+ return maComment;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/viewoverlaymanager.cxx b/sd/source/ui/view/viewoverlaymanager.cxx
new file mode 100644
index 000000000..3cdfb9787
--- /dev/null
+++ b/sd/source/ui/view/viewoverlaymanager.cxx
@@ -0,0 +1,546 @@
+/* -*- 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 <sfx2/viewfrm.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+
+#include <vcl/help.hxx>
+#include <vcl/lazydelete.hxx>
+#include <vcl/ptrstyle.hxx>
+#include <vcl/svapp.hxx>
+
+#include <svx/sdrpagewindow.hxx>
+#include <svx/sdrpaintwindow.hxx>
+#include <svx/sdr/overlay/overlaybitmapex.hxx>
+#include <svx/sdr/overlay/overlaymanager.hxx>
+#include <svx/svxids.hrc>
+#include <svx/svdpagv.hxx>
+
+#include <view/viewoverlaymanager.hxx>
+
+
+#include <DrawDocShell.hxx>
+#include <strings.hrc>
+#include <bitmaps.hlst>
+#include <sdresid.hxx>
+#include <EventMultiplexer.hxx>
+#include <View.hxx>
+#include <ViewShellBase.hxx>
+#include <ViewShell.hxx>
+#include <sdpage.hxx>
+#include <smarttag.hxx>
+
+using namespace ::com::sun::star::uno;
+
+namespace sd {
+
+namespace {
+
+class ImageButtonHdl;
+
+}
+
+const sal_uInt16 gButtonSlots[] = { SID_INSERT_TABLE, SID_INSERT_DIAGRAM, SID_INSERT_GRAPHIC, SID_INSERT_AVMEDIA };
+const TranslateId gButtonToolTips[] = { STR_INSERT_TABLE, STR_INSERT_CHART, STR_INSERT_PICTURE, STR_INSERT_MOVIE };
+
+constexpr rtl::OUStringConstExpr aSmallPlaceHolders[] =
+{
+ BMP_PLACEHOLDER_TABLE_SMALL,
+ BMP_PLACEHOLDER_CHART_SMALL,
+ BMP_PLACEHOLDER_IMAGE_SMALL,
+ BMP_PLACEHOLDER_MOVIE_SMALL,
+ BMP_PLACEHOLDER_TABLE_SMALL_HOVER,
+ BMP_PLACEHOLDER_CHART_SMALL_HOVER,
+ BMP_PLACEHOLDER_IMAGE_SMALL_HOVER,
+ BMP_PLACEHOLDER_MOVIE_SMALL_HOVER
+};
+
+constexpr rtl::OUStringConstExpr aBigPlaceHolders[] =
+{
+ BMP_PLACEHOLDER_TABLE_LARGE,
+ BMP_PLACEHOLDER_CHART_LARGE,
+ BMP_PLACEHOLDER_IMAGE_LARGE,
+ BMP_PLACEHOLDER_MOVIE_LARGE,
+ BMP_PLACEHOLDER_TABLE_LARGE_HOVER,
+ BMP_PLACEHOLDER_CHART_LARGE_HOVER,
+ BMP_PLACEHOLDER_IMAGE_LARGE_HOVER,
+ BMP_PLACEHOLDER_MOVIE_LARGE_HOVER
+};
+
+static BitmapEx* getButtonImage( int index, bool large )
+{
+ static vcl::DeleteOnDeinit< BitmapEx > gSmallButtonImages[SAL_N_ELEMENTS(aSmallPlaceHolders)] = { vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty };
+ static vcl::DeleteOnDeinit< BitmapEx > gLargeButtonImages[SAL_N_ELEMENTS(aBigPlaceHolders)] = { vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty, vcl::DeleteOnDeinitFlag::Empty };
+
+ assert(SAL_N_ELEMENTS(aSmallPlaceHolders) == SAL_N_ELEMENTS(aBigPlaceHolders));
+
+ if( !gSmallButtonImages[0].get() )
+ {
+ for (size_t i = 0; i < SAL_N_ELEMENTS(aSmallPlaceHolders); i++ )
+ {
+ gSmallButtonImages[i].set(OUString(aSmallPlaceHolders[i]));
+ gLargeButtonImages[i].set(OUString(aBigPlaceHolders[i]));
+ }
+ }
+
+ if( large )
+ {
+ return gLargeButtonImages[index].get();
+ }
+ else
+ {
+ return gSmallButtonImages[index].get();
+ }
+}
+
+const sal_uInt32 SMART_TAG_HDL_NUM = SAL_MAX_UINT32;
+
+namespace {
+
+class ChangePlaceholderTag : public SmartTag
+{
+ friend class ImageButtonHdl;
+public:
+ ChangePlaceholderTag( ::sd::View& rView, SdrObject& rPlaceholderObj );
+
+ /** returns true if the SmartTag handled the event. */
+ virtual bool MouseButtonDown( const MouseEvent&, SmartHdl& ) override;
+
+ /** returns true if the SmartTag consumes this event. */
+ virtual bool KeyInput( const KeyEvent& rKEvt ) override;
+
+ BitmapEx createOverlayImage( int nHighlight );
+
+protected:
+ virtual void addCustomHandles( SdrHdlList& rHandlerList ) override;
+
+private:
+ ::tools::WeakReference<SdrObject> mxPlaceholderObj;
+};
+
+class ImageButtonHdl : public SmartHdl
+{
+public:
+ ImageButtonHdl( const SmartTagReference& xTag, /* sal_uInt16 nSID, const Image& rImage, const Image& rImageMO, */ const Point& rPnt );
+ virtual ~ImageButtonHdl() override;
+ virtual void CreateB2dIAObject() override;
+ virtual bool IsFocusHdl() const override;
+ virtual PointerStyle GetPointer() const override;
+
+ virtual void onMouseEnter(const MouseEvent& rMEvt) override;
+ virtual void onHelpRequest() override;
+ virtual void onMouseLeave() override;
+
+ int getHighlightId() const { return mnHighlightId; }
+
+ void ShowTip();
+ static void HideTip();
+
+private:
+ rtl::Reference< ChangePlaceholderTag > mxChangePlaceholderTag;
+
+ int mnHighlightId;
+ Size maImageSize;
+};
+
+}
+
+ImageButtonHdl::ImageButtonHdl( const SmartTagReference& xTag /*, sal_uInt16 nSID, const Image& rImage, const Image& rImageMO*/, const Point& rPnt )
+: SmartHdl( xTag, rPnt, SdrHdlKind::SmartTag )
+, mxChangePlaceholderTag( dynamic_cast< ChangePlaceholderTag* >( xTag.get() ) )
+, mnHighlightId( -1 )
+, maImageSize( 42, 42 )
+{
+}
+
+ImageButtonHdl::~ImageButtonHdl()
+{
+ HideTip();
+}
+
+void ImageButtonHdl::HideTip()
+{
+ Help::HideBalloonAndQuickHelp();
+}
+
+void ImageButtonHdl::ShowTip()
+{
+ if (!pHdlList || !pHdlList->GetView() || mnHighlightId == -1)
+ return;
+
+ OutputDevice* pDev = pHdlList->GetView()->GetFirstOutputDevice();
+ if( pDev == nullptr )
+ pDev = Application::GetDefaultDevice();
+
+ OUString aHelpText(SdResId(gButtonToolTips[mnHighlightId]));
+ Point aHelpPos(pDev->LogicToPixel(GetPos()));
+ if (mnHighlightId == 1)
+ aHelpPos.Move(maImageSize.Width(), 0);
+ else if (mnHighlightId == 2)
+ aHelpPos.Move(0, maImageSize.Height());
+ else if (mnHighlightId == 3)
+ aHelpPos.Move(maImageSize.Width(), maImageSize.Height());
+ ::tools::Rectangle aLogicPix(aHelpPos, maImageSize);
+ vcl::Window* pWindow = pHdlList->GetView()->GetFirstOutputDevice()->GetOwnerWindow();
+ ::tools::Rectangle aScreenRect(pWindow->OutputToScreenPixel(aLogicPix.TopLeft()),
+ pWindow->OutputToScreenPixel(aLogicPix.BottomRight()));
+ Help::ShowQuickHelp(pWindow, aScreenRect, aHelpText);
+}
+
+void ImageButtonHdl::onHelpRequest()
+{
+ ShowTip();
+}
+
+void ImageButtonHdl::onMouseEnter(const MouseEvent& rMEvt)
+{
+ if( !(pHdlList && pHdlList->GetView()))
+ return;
+
+ int nHighlightId = 0;
+ OutputDevice* pDev = pHdlList->GetView()->GetFirstOutputDevice();
+ if( pDev == nullptr )
+ pDev = Application::GetDefaultDevice();
+
+ Point aMDPos( rMEvt.GetPosPixel() );
+ aMDPos -= pDev->LogicToPixel( GetPos() );
+
+ nHighlightId += aMDPos.X() > maImageSize.Width() ? 1 : 0;
+ nHighlightId += aMDPos.Y() > maImageSize.Height() ? 2 : 0;
+
+ if( mnHighlightId != nHighlightId )
+ {
+ HideTip();
+
+ mnHighlightId = nHighlightId;
+
+ ShowTip();
+
+ Touch();
+ }
+}
+
+void ImageButtonHdl::onMouseLeave()
+{
+ mnHighlightId = -1;
+ HideTip();
+ Touch();
+}
+
+void ImageButtonHdl::CreateB2dIAObject()
+{
+ // first throw away old one
+ GetRidOfIAObject();
+
+ const Point aTagPos( GetPos() );
+ basegfx::B2DPoint aPosition( aTagPos.X(), aTagPos.Y() );
+
+ BitmapEx aBitmapEx( mxChangePlaceholderTag->createOverlayImage( mnHighlightId ) ); // maImageMO.GetBitmapEx() : maImage.GetBitmapEx() );
+ maImageSize = aBitmapEx.GetSizePixel();
+ maImageSize.setWidth( maImageSize.Width() >> 1 );
+ maImageSize.setHeight( maImageSize.Height() >> 1 );
+
+ if(!pHdlList)
+ return;
+
+ SdrMarkView* pView = pHdlList->GetView();
+
+ if(!pView || pView->areMarkHandlesHidden())
+ return;
+
+ SdrPageView* pPageView = pView->GetSdrPageView();
+
+ if(!pPageView)
+ return;
+
+ for(sal_uInt32 b = 0; b < pPageView->PageWindowCount(); b++)
+ {
+ const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(b);
+
+ SdrPaintWindow& rPaintWindow = rPageWindow.GetPaintWindow();
+ const rtl::Reference< sdr::overlay::OverlayManager >& xManager = rPageWindow.GetOverlayManager();
+ if(rPaintWindow.OutputToWindow() && xManager.is() )
+ {
+ std::unique_ptr<sdr::overlay::OverlayObject> pOverlayObject(
+ new sdr::overlay::OverlayBitmapEx( aPosition, aBitmapEx, 0, 0 ));
+
+ // OVERLAYMANAGER
+ insertNewlyCreatedOverlayObjectForSdrHdl(
+ std::move(pOverlayObject),
+ rPageWindow.GetObjectContact(),
+ *xManager);
+ }
+ }
+}
+
+bool ImageButtonHdl::IsFocusHdl() const
+{
+ return false;
+}
+
+PointerStyle ImageButtonHdl::GetPointer() const
+{
+ return PointerStyle::Arrow;
+}
+
+ChangePlaceholderTag::ChangePlaceholderTag( ::sd::View& rView, SdrObject& rPlaceholderObj )
+: SmartTag( rView )
+, mxPlaceholderObj( &rPlaceholderObj )
+{
+}
+
+/** returns true if the ChangePlaceholderTag handled the event. */
+bool ChangePlaceholderTag::MouseButtonDown( const MouseEvent& /*rMEvt*/, SmartHdl& rHdl )
+{
+ int nHighlightId = static_cast< ImageButtonHdl& >(rHdl).getHighlightId();
+ if( nHighlightId >= 0 )
+ {
+ sal_uInt16 nSID = gButtonSlots[nHighlightId];
+
+ if( mxPlaceholderObj )
+ {
+ // mark placeholder if it is not currently marked (or if also others are marked)
+ if( !mrView.IsObjMarked( mxPlaceholderObj.get() ) || (mrView.GetMarkedObjectList().GetMarkCount() != 1) )
+ {
+ SdrPageView* pPV = mrView.GetSdrPageView();
+ mrView.UnmarkAllObj(pPV );
+ mrView.MarkObj(mxPlaceholderObj.get(), pPV);
+ }
+ }
+
+ mrView.GetViewShell()->GetViewFrame()->GetDispatcher()->Execute( nSID, SfxCallMode::ASYNCHRON);
+ }
+ return false;
+}
+
+/** returns true if the SmartTag consumes this event. */
+bool ChangePlaceholderTag::KeyInput( const KeyEvent& rKEvt )
+{
+ sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
+ switch( nCode )
+ {
+ case KEY_DOWN:
+ case KEY_UP:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ case KEY_ESCAPE:
+ case KEY_TAB:
+ case KEY_RETURN:
+ case KEY_SPACE:
+ default:
+ return false;
+ }
+}
+
+BitmapEx ChangePlaceholderTag::createOverlayImage( int nHighlight )
+{
+ BitmapEx aRet;
+ if( mxPlaceholderObj.is() )
+ {
+ SdrObject* pPlaceholder = mxPlaceholderObj.get();
+ SmartTagReference xThis( this );
+ const ::tools::Rectangle& rSnapRect = pPlaceholder->GetSnapRect();
+
+ OutputDevice* pDev = mrView.GetFirstOutputDevice();
+ if( pDev == nullptr )
+ pDev = Application::GetDefaultDevice();
+
+ Size aShapeSizePix = pDev->LogicToPixel(rSnapRect.GetSize());
+ ::tools::Long nShapeSizePix = std::min(aShapeSizePix.Width(),aShapeSizePix.Height());
+
+ bool bLarge = nShapeSizePix > 250;
+
+ Size aSize( getButtonImage( 0, bLarge )->GetSizePixel() );
+
+ aRet.Scale(Size(aSize.Width() << 1, aSize.Height() << 1));
+
+ const ::tools::Rectangle aRectSrc( Point( 0, 0 ), aSize );
+
+ aRet = *(getButtonImage((nHighlight == 0) ? 4 : 0, bLarge));
+ aRet.Expand( aSize.Width(), aSize.Height(), true );
+
+ aRet.CopyPixel( ::tools::Rectangle( Point( aSize.Width(), 0 ), aSize ), aRectSrc, getButtonImage((nHighlight == 1) ? 5 : 1, bLarge) );
+ aRet.CopyPixel( ::tools::Rectangle( Point( 0, aSize.Height() ), aSize ), aRectSrc, getButtonImage((nHighlight == 2) ? 6 : 2, bLarge) );
+ aRet.CopyPixel( ::tools::Rectangle( Point( aSize.Width(), aSize.Height() ), aSize ), aRectSrc, getButtonImage((nHighlight == 3) ? 7 : 3, bLarge) );
+ }
+
+ return aRet;
+}
+
+void ChangePlaceholderTag::addCustomHandles( SdrHdlList& rHandlerList )
+{
+ if( !mxPlaceholderObj.is() )
+ return;
+
+ SdrObject* pPlaceholder = mxPlaceholderObj.get();
+ SmartTagReference xThis( this );
+ const ::tools::Rectangle& rSnapRect = pPlaceholder->GetSnapRect();
+ const Point aPoint;
+
+ OutputDevice* pDev = mrView.GetFirstOutputDevice();
+ if( pDev == nullptr )
+ pDev = Application::GetDefaultDevice();
+
+ Size aShapeSizePix = pDev->LogicToPixel(rSnapRect.GetSize());
+ ::tools::Long nShapeSizePix = std::min(aShapeSizePix.Width(),aShapeSizePix.Height());
+ if( 50 > nShapeSizePix )
+ return;
+
+ bool bLarge = nShapeSizePix > 250;
+
+ Size aButtonSize( pDev->PixelToLogic( getButtonImage(0, bLarge )->GetSizePixel()) );
+
+ const int nColumns = 2;
+ const int nRows = 2;
+
+ ::tools::Long all_width = nColumns * aButtonSize.Width();
+ ::tools::Long all_height = nRows * aButtonSize.Height();
+
+ Point aPos( rSnapRect.Center() );
+ aPos.AdjustX( -(all_width >> 1) );
+ aPos.AdjustY( -(all_height >> 1) );
+
+ std::unique_ptr<ImageButtonHdl> pHdl(new ImageButtonHdl( xThis, aPoint ));
+ pHdl->SetObjHdlNum( SMART_TAG_HDL_NUM );
+ pHdl->SetPageView( mrView.GetSdrPageView() );
+
+ pHdl->SetPos( aPos );
+
+ rHandlerList.AddHdl( std::move(pHdl) );
+}
+
+ViewOverlayManager::ViewOverlayManager( ViewShellBase& rViewShellBase )
+: mrBase( rViewShellBase )
+, mnUpdateTagsEvent( nullptr )
+{
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,ViewOverlayManager,EventMultiplexerListener) );
+ mrBase.GetEventMultiplexer()->AddEventListener(aLink);
+
+ StartListening( *mrBase.GetDocShell() );
+}
+
+ViewOverlayManager::~ViewOverlayManager()
+{
+ Link<tools::EventMultiplexerEvent&,void> aLink( LINK(this,ViewOverlayManager,EventMultiplexerListener) );
+ mrBase.GetEventMultiplexer()->RemoveEventListener( aLink );
+
+ if( mnUpdateTagsEvent )
+ {
+ Application::RemoveUserEvent( mnUpdateTagsEvent );
+ mnUpdateTagsEvent = nullptr;
+ }
+
+ DisposeTags();
+}
+
+void ViewOverlayManager::Notify(SfxBroadcaster&, const SfxHint& rHint)
+{
+ if (rHint.GetId() == SfxHintId::DocChanged)
+ {
+ UpdateTags();
+ }
+}
+
+void ViewOverlayManager::onZoomChanged()
+{
+ if( !maTagVector.empty() )
+ {
+ UpdateTags();
+ }
+}
+
+void ViewOverlayManager::UpdateTags()
+{
+ if( !mnUpdateTagsEvent )
+ mnUpdateTagsEvent = Application::PostUserEvent( LINK( this, ViewOverlayManager, UpdateTagsHdl ) );
+}
+
+IMPL_LINK_NOARG(ViewOverlayManager, UpdateTagsHdl, void*, void)
+{
+ mnUpdateTagsEvent = nullptr;
+ bool bChanges = DisposeTags();
+ bChanges |= CreateTags();
+
+ if( bChanges && mrBase.GetDrawView() )
+ static_cast< ::sd::View* >( mrBase.GetDrawView() )->updateHandles();
+}
+
+bool ViewOverlayManager::CreateTags()
+{
+ bool bChanges = false;
+
+ std::shared_ptr<ViewShell> aMainShell = mrBase.GetMainViewShell();
+
+ SdPage* pPage = aMainShell ? aMainShell->getCurrentPage() : nullptr;
+
+ if( pPage && !pPage->IsMasterPage() && (pPage->GetPageKind() == PageKind::Standard) )
+ {
+ const std::list< SdrObject* >& rShapes = pPage->GetPresentationShapeList().getList();
+
+ for( SdrObject* pShape : rShapes )
+ {
+ if( pShape->IsEmptyPresObj() && (pShape->GetObjIdentifier() == SdrObjKind::OutlineText) && (mrBase.GetDrawView()->GetTextEditObject() != pShape) )
+ {
+ rtl::Reference< SmartTag > xTag( new ChangePlaceholderTag( *mrBase.GetMainViewShell()->GetView(), *pShape ) );
+ maTagVector.push_back(xTag);
+ bChanges = true;
+ }
+ }
+ }
+
+ return bChanges;
+}
+
+bool ViewOverlayManager::DisposeTags()
+{
+ if( !maTagVector.empty() )
+ {
+ ViewTagVector vec;
+ vec.swap( maTagVector );
+
+ for (auto& rxViewTag : vec)
+ rxViewTag->Dispose();
+ return true;
+ }
+
+ return false;
+}
+
+IMPL_LINK(ViewOverlayManager,EventMultiplexerListener,
+ tools::EventMultiplexerEvent&, rEvent, void)
+{
+ switch (rEvent.meEventId)
+ {
+ case EventMultiplexerEventId::MainViewAdded:
+ case EventMultiplexerEventId::ViewAdded:
+ case EventMultiplexerEventId::BeginTextEdit:
+ case EventMultiplexerEventId::EndTextEdit:
+ case EventMultiplexerEventId::CurrentPageChanged:
+ UpdateTags();
+ break;
+ default: break;
+ }
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/viewshe2.cxx b/sd/source/ui/view/viewshe2.cxx
new file mode 100644
index 000000000..8b16124ba
--- /dev/null
+++ b/sd/source/ui/view/viewshe2.cxx
@@ -0,0 +1,958 @@
+/* -*- 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 <com/sun/star/embed/EmbedVerbs.hpp>
+#include <com/sun/star/embed/XEmbeddedObject.hpp>
+
+#include <ViewShell.hxx>
+#include <ViewShellHint.hxx>
+
+#include <ViewShellImplementation.hxx>
+#include <FactoryIds.hxx>
+
+#include <svx/svxids.hrc>
+#include <vcl/scrbar.hxx>
+#include <svx/svdpagv.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svx/ruler.hxx>
+#include <editeng/outliner.hxx>
+#include <svtools/ehdl.hxx>
+#include <svx/svdoole2.hxx>
+#include <svtools/sfxecode.hxx>
+#include <unotools/moduleoptions.hxx>
+#include <comphelper/classids.hxx>
+#include <osl/diagnose.h>
+
+#include <strings.hrc>
+#include <app.hrc>
+#include <unokywds.hxx>
+
+#include <sdundogr.hxx>
+#include <FrameView.hxx>
+#include <sdresid.hxx>
+#include <drawdoc.hxx>
+#include <View.hxx>
+#include <fupoor.hxx>
+#include <Client.hxx>
+#include <DrawDocShell.hxx>
+#include <sdpage.hxx>
+#include <DrawViewShell.hxx>
+#include <ViewShellBase.hxx>
+
+#include <Window.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <svtools/soerr.hxx>
+#include <svx/charthelper.hxx>
+#include <comphelper/lok.hxx>
+
+using namespace com::sun::star;
+
+namespace sd {
+
+/**
+ * adjust Thumbpos and VisibleSize
+ */
+void ViewShell::UpdateScrollBars()
+{
+ if (mpHorizontalScrollBar)
+ {
+ ::tools::Long nW = static_cast<::tools::Long>(mpContentWindow->GetVisibleWidth() * 32000);
+ ::tools::Long nX = static_cast<::tools::Long>(mpContentWindow->GetVisibleX() * 32000);
+ mpHorizontalScrollBar->SetVisibleSize(nW);
+ mpHorizontalScrollBar->SetThumbPos(nX);
+ nW = 32000 - nW;
+ ::tools::Long nLine = static_cast<::tools::Long>(mpContentWindow->GetScrlLineWidth() * nW);
+ ::tools::Long nPage = static_cast<::tools::Long>(mpContentWindow->GetScrlPageWidth() * nW);
+ mpHorizontalScrollBar->SetLineSize(nLine);
+ mpHorizontalScrollBar->SetPageSize(nPage);
+ }
+
+ if (mpVerticalScrollBar)
+ {
+ ::tools::Long nH = static_cast<::tools::Long>(mpContentWindow->GetVisibleHeight() * 32000);
+ ::tools::Long nY = static_cast<::tools::Long>(mpContentWindow->GetVisibleY() * 32000);
+
+ if(IsPageFlipMode()) // ie in zoom mode where no panning
+ {
+ SdPage* pPage = static_cast<DrawViewShell*>(this)->GetActualPage();
+ sal_uInt16 nCurPage = (pPage->GetPageNum() - 1) / 2;
+ sal_uInt16 nTotalPages = GetDoc()->GetSdPageCount(pPage->GetPageKind());
+ mpVerticalScrollBar->SetRange(Range(0,256*nTotalPages));
+ mpVerticalScrollBar->SetVisibleSize(256);
+ mpVerticalScrollBar->SetThumbPos(256*nCurPage);
+ mpVerticalScrollBar->SetLineSize(256);
+ mpVerticalScrollBar->SetPageSize(256);
+ }
+ else
+ {
+ mpVerticalScrollBar->SetRange(Range(0,32000));
+ mpVerticalScrollBar->SetVisibleSize(nH);
+ mpVerticalScrollBar->SetThumbPos(nY);
+ nH = 32000 - nH;
+ ::tools::Long nLine = static_cast<::tools::Long>(mpContentWindow->GetScrlLineHeight() * nH);
+ ::tools::Long nPage = static_cast<::tools::Long>(mpContentWindow->GetScrlPageHeight() * nH);
+ mpVerticalScrollBar->SetLineSize(nLine);
+ mpVerticalScrollBar->SetPageSize(nPage);
+ }
+ }
+
+ if (mbHasRulers)
+ {
+ UpdateHRuler();
+ UpdateVRuler();
+ }
+
+}
+/**
+ * Handling for horizontal Scrollbars
+ */
+IMPL_LINK(ViewShell, HScrollHdl, ScrollBar *, pHScroll, void )
+{
+ VirtHScrollHdl(pHScroll);
+}
+
+/**
+ * virtual scroll handler for horizontal Scrollbars
+ */
+void ViewShell::VirtHScrollHdl(ScrollBar* pHScroll)
+{
+ ::tools::Long nDelta = pHScroll->GetDelta();
+
+ if (nDelta == 0)
+ return;
+
+ double fX = static_cast<double>(pHScroll->GetThumbPos()) / pHScroll->GetRange().Len();
+
+ // scroll all windows of the column
+ ::sd::View* pView = GetView();
+ OutlinerView* pOLV = nullptr;
+
+ if (pView)
+ pOLV = pView->GetTextEditOutlinerView();
+
+ if (pOLV)
+ pOLV->HideCursor();
+
+ mpContentWindow->SetVisibleXY(fX, -1);
+
+ ::tools::Rectangle aVisArea = GetDocSh()->GetVisArea(ASPECT_CONTENT);
+ Point aVisAreaPos = GetActiveWindow()->PixelToLogic( Point(0,0) );
+ aVisArea.SetPos(aVisAreaPos);
+ GetDocSh()->SetVisArea(aVisArea);
+
+ Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel();
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) );
+ VisAreaChanged(aVisAreaWin);
+
+ if (pView)
+ {
+ pView->VisAreaChanged(GetActiveWindow()->GetOutDev());
+ }
+
+ if (pOLV)
+ pOLV->ShowCursor();
+
+ if (mbHasRulers)
+ UpdateHRuler();
+}
+
+/**
+ * handling for vertical Scrollbars
+ */
+IMPL_LINK(ViewShell, VScrollHdl, ScrollBar *, pVScroll, void )
+{
+ VirtVScrollHdl(pVScroll);
+}
+
+/**
+ * handling for vertical Scrollbars
+ */
+void ViewShell::VirtVScrollHdl(ScrollBar* pVScroll)
+{
+ if(IsPageFlipMode())
+ {
+ SdPage* pPage = static_cast<DrawViewShell*>(this)->GetActualPage();
+ sal_uInt16 nCurPage = (pPage->GetPageNum() - 1) >> 1;
+ sal_uInt16 nNewPage = static_cast<sal_uInt16>(pVScroll->GetThumbPos())/256;
+ if( nCurPage != nNewPage )
+ static_cast<DrawViewShell*>(this)->SwitchPage(nNewPage);
+ }
+ else //panning mode
+ {
+ double fY = static_cast<double>(pVScroll->GetThumbPos()) / pVScroll->GetRange().Len();
+
+ ::sd::View* pView = GetView();
+ OutlinerView* pOLV = nullptr;
+
+ if (pView)
+ pOLV = pView->GetTextEditOutlinerView();
+
+ if (pOLV)
+ pOLV->HideCursor();
+
+ mpContentWindow->SetVisibleXY(-1, fY);
+
+ ::tools::Rectangle aVisArea = GetDocSh()->GetVisArea(ASPECT_CONTENT);
+ Point aVisAreaPos = GetActiveWindow()->PixelToLogic( Point(0,0) );
+ aVisArea.SetPos(aVisAreaPos);
+ GetDocSh()->SetVisArea(aVisArea);
+
+ Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel();
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) );
+ VisAreaChanged(aVisAreaWin);
+
+ if (pView)
+ {
+ pView->VisAreaChanged(GetActiveWindow()->GetOutDev());
+ }
+
+ if (pOLV)
+ pOLV->ShowCursor();
+
+ if (mbHasRulers)
+ UpdateVRuler();
+
+ }
+}
+
+VclPtr<SvxRuler> ViewShell::CreateHRuler(::sd::Window* )
+{
+ return nullptr;
+}
+
+VclPtr<SvxRuler> ViewShell::CreateVRuler(::sd::Window* )
+{
+ return nullptr;
+}
+
+void ViewShell::UpdateHRuler()
+{
+}
+
+void ViewShell::UpdateVRuler()
+{
+}
+
+/**
+ * Scroll a specific number of lines. Is used in the automatic scrolling
+ * (character/drag).
+ */
+void ViewShell::ScrollLines(::tools::Long nLinesX, ::tools::Long nLinesY)
+{
+ if ( nLinesX )
+ {
+ nLinesX *= mpHorizontalScrollBar->GetLineSize();
+ }
+ if ( nLinesY )
+ {
+ nLinesY *= mpVerticalScrollBar->GetLineSize();
+ }
+
+ Scroll(nLinesX, nLinesY);
+}
+
+void ViewShell::Scroll(::tools::Long nScrollX, ::tools::Long nScrollY)
+{
+ if (nScrollX)
+ {
+ ::tools::Long nNewThumb = mpHorizontalScrollBar->GetThumbPos() + nScrollX;
+ mpHorizontalScrollBar->SetThumbPos(nNewThumb);
+ }
+ if (nScrollY)
+ {
+ ::tools::Long nNewThumb = mpVerticalScrollBar->GetThumbPos() + nScrollY;
+ mpVerticalScrollBar->SetThumbPos(nNewThumb);
+ }
+ double fX = static_cast<double>(mpHorizontalScrollBar->GetThumbPos()) /
+ mpHorizontalScrollBar->GetRange().Len();
+ double fY = static_cast<double>(mpVerticalScrollBar->GetThumbPos()) /
+ mpVerticalScrollBar->GetRange().Len();
+
+ GetActiveWindow()->SetVisibleXY(fX, fY);
+
+ ::tools::Rectangle aVisArea = GetDocSh()->GetVisArea(ASPECT_CONTENT);
+ Point aVisAreaPos = GetActiveWindow()->PixelToLogic( Point(0,0) );
+ aVisArea.SetPos(aVisAreaPos);
+ GetDocSh()->SetVisArea(aVisArea);
+
+ Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel();
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) );
+ VisAreaChanged(aVisAreaWin);
+
+ ::sd::View* pView = GetView();
+ if (pView)
+ {
+ pView->VisAreaChanged(GetActiveWindow()->GetOutDev());
+ }
+
+ if (mbHasRulers)
+ {
+ UpdateHRuler();
+ UpdateVRuler();
+ }
+}
+
+/**
+ * Set zoom factor for all split windows.
+ */
+void ViewShell::SetZoom(::tools::Long nZoom)
+{
+ Fraction aUIScale(nZoom, 100);
+ aUIScale *= GetDoc()->GetUIScale();
+
+ if (mpHorizontalRuler)
+ mpHorizontalRuler->SetZoom(aUIScale);
+
+ if (mpVerticalRuler)
+ mpVerticalRuler->SetZoom(aUIScale);
+
+ if (mpContentWindow)
+ {
+ mpContentWindow->SetZoomIntegral(nZoom);
+
+ // #i74769# Here is a 2nd way (besides Window::Scroll) to set the visible prt
+ // of the window. It needs - like Scroll(ScrollFlags::Children) does - also to move
+ // the child windows. I am trying InvalidateFlags::Children here which makes things better,
+ // but does not solve the problem completely. Need to ask PL.
+ mpContentWindow->Invalidate(InvalidateFlags::Children);
+ }
+
+ Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel();
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) );
+ VisAreaChanged(aVisAreaWin);
+
+ ::sd::View* pView = GetView();
+ if (pView)
+ {
+ pView->VisAreaChanged(GetActiveWindow()->GetOutDev());
+ }
+
+ UpdateScrollBars();
+}
+
+::tools::Long ViewShell::GetZoom() const
+{
+ if (mpContentWindow)
+ {
+ return mpContentWindow->GetZoom();
+ }
+
+ return 0;
+}
+
+/**
+ * Set zoom rectangle for active window. Sets all split windows to the same zoom
+ * factor.
+ */
+void ViewShell::SetZoomRect(const ::tools::Rectangle& rZoomRect)
+{
+ ::tools::Long nZoom = GetActiveWindow()->SetZoomRect(rZoomRect);
+ Fraction aUIScale(nZoom, 100);
+ aUIScale *= GetDoc()->GetUIScale();
+
+ Point aPos = GetActiveWindow()->GetWinViewPos();
+
+ if (mpHorizontalRuler)
+ mpHorizontalRuler->SetZoom(aUIScale);
+
+ if (mpVerticalRuler)
+ mpVerticalRuler->SetZoom(aUIScale);
+
+ if (mpContentWindow)
+ {
+ Point aNewPos = mpContentWindow->GetWinViewPos();
+ aNewPos.setX( aPos.X() );
+ aNewPos.setY( aPos.Y() );
+ mpContentWindow->SetZoomIntegral(nZoom);
+ mpContentWindow->SetWinViewPos(aNewPos);
+ mpContentWindow->UpdateMapOrigin();
+
+ // When tiled rendering, UpdateMapOrigin() doesn't touch the map mode.
+ if (!comphelper::LibreOfficeKit::isActive())
+ // #i74769# see above
+ mpContentWindow->Invalidate(InvalidateFlags::Children);
+ }
+
+ Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel();
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) );
+ VisAreaChanged(aVisAreaWin);
+
+ ::sd::View* pView = GetView();
+ if (pView)
+ {
+ pView->VisAreaChanged(GetActiveWindow()->GetOutDev());
+ }
+
+ UpdateScrollBars();
+}
+
+/**
+ * Initialize imaging parameters for all split windows.
+ */
+void ViewShell::InitWindows(const Point& rViewOrigin, const Size& rViewSize,
+ const Point& rWinPos, bool bUpdate)
+{
+ if (mpContentWindow)
+ {
+ mpContentWindow->SetViewOrigin(rViewOrigin);
+ mpContentWindow->SetViewSize(rViewSize);
+ mpContentWindow->SetWinViewPos(rWinPos);
+
+ if ( bUpdate )
+ {
+ mpContentWindow->UpdateMapOrigin();
+ mpContentWindow->Invalidate();
+ }
+ }
+
+ Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel();
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) );
+ VisAreaChanged(aVisAreaWin);
+
+ ::sd::View* pView = GetView();
+ if (pView)
+ {
+ pView->VisAreaChanged(GetActiveWindow()->GetOutDev());
+ }
+}
+
+/**
+ * Invalidate all split windows below the ?provided rectangle.
+ */
+void ViewShell::InvalidateWindows()
+{
+ if (mpContentWindow)
+ mpContentWindow->Invalidate();
+}
+
+/**
+ * Draw a selection rectangle with the ?provided pen on all split windows.
+ */
+void ViewShell::DrawMarkRect(const ::tools::Rectangle& rRect) const
+{
+ if (mpContentWindow)
+ {
+ mpContentWindow->InvertTracking(rRect, ShowTrackFlags::Object | ShowTrackFlags::TrackWindow);
+ }
+}
+
+void ViewShell::SetPageSizeAndBorder(PageKind ePageKind, const Size& rNewSize,
+ ::tools::Long nLeft, ::tools::Long nRight,
+ ::tools::Long nUpper, ::tools::Long nLower, bool bScaleAll,
+ Orientation eOrientation, sal_uInt16 nPaperBin,
+ bool bBackgroundFullSize)
+{
+ const sal_uInt16 nMasterPageCnt(GetDoc()->GetMasterSdPageCount(ePageKind));
+ const sal_uInt16 nPageCnt(GetDoc()->GetSdPageCount(ePageKind));
+
+ if(0 == nPageCnt && 0 == nMasterPageCnt)
+ {
+ return;
+ }
+
+ std::unique_ptr<SdUndoGroup> pUndoGroup;
+ SfxViewShell* pViewShell(GetViewShell());
+ if (pViewShell)
+ {
+ pUndoGroup.reset(new SdUndoGroup(GetDoc()));
+ pUndoGroup->SetComment(SdResId(STR_UNDO_CHANGE_PAGEFORMAT));
+ }
+ Broadcast (ViewShellHint(ViewShellHint::HINT_PAGE_RESIZE_START));
+
+ // use Model-based method at SdDrawDocument
+ GetDoc()->AdaptPageSizeForAllPages(
+ rNewSize,
+ ePageKind,
+ pUndoGroup.get(),
+ nLeft,
+ nRight,
+ nUpper,
+ nLower,
+ bScaleAll,
+ eOrientation,
+ nPaperBin,
+ bBackgroundFullSize);
+
+ // adjust handout page to new format of the standard page
+ if(0 != nPageCnt && ((ePageKind == PageKind::Standard) || (ePageKind == PageKind::Handout)))
+ {
+ GetDoc()->GetSdPage(0, PageKind::Handout)->CreateTitleAndLayout(true);
+ }
+
+ // handed over undo group to undo manager
+ if (pViewShell)
+ {
+ pViewShell->GetViewFrame()->GetObjectShell()->GetUndoManager()->AddUndoAction(std::move(pUndoGroup));
+ }
+
+ // calculate View-Sizes
+ SdPage* pPage(0 != nPageCnt
+ ? GetDoc()->GetSdPage(0, ePageKind)
+ : GetDoc()->GetMasterSdPage(0, ePageKind));
+ const ::tools::Long nWidth(pPage->GetSize().Width());
+ const ::tools::Long nHeight(pPage->GetSize().Height());
+ const Point aPageOrg(nWidth, nHeight / 2);
+ const Size aViewSize(nWidth * 3, nHeight * 2);
+ Point aVisAreaPos;
+ ::sd::View* pView(GetView());
+ const Point aNewOrigin(pPage->GetLeftBorder(), pPage->GetUpperBorder());
+
+ InitWindows(aPageOrg, aViewSize, Point(-1, -1), true);
+
+ if ( GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED )
+ {
+ aVisAreaPos = GetDocSh()->GetVisArea(ASPECT_CONTENT).TopLeft();
+ }
+
+ if (pView)
+ {
+ pView->SetWorkArea(::tools::Rectangle(Point() - aVisAreaPos - aPageOrg, aViewSize));
+ }
+
+ UpdateScrollBars();
+
+ if (pView)
+ {
+ pView->GetSdrPageView()->SetPageOrigin(aNewOrigin);
+ }
+
+ if(nullptr != pViewShell)
+ {
+ pViewShell->GetViewFrame()->GetBindings().Invalidate(SID_RULER_NULL_OFFSET);
+ // zoom onto (new) page size
+ pViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_SIZE_PAGE, SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+ }
+
+ Broadcast(ViewShellHint(ViewShellHint::HINT_PAGE_RESIZE_END));
+}
+
+/**
+ * Set zoom factor for InPlace
+ */
+void ViewShell::SetZoomFactor(const Fraction& rZoomX, const Fraction&)
+{
+ ::tools::Long nZoom = static_cast<::tools::Long>(static_cast<double>(rZoomX) * 100);
+ SetZoom(nZoom);
+}
+
+void ViewShell::SetActiveWindow (::sd::Window* pWin)
+{
+ SfxViewShell* pViewShell = GetViewShell();
+ OSL_ASSERT (pViewShell!=nullptr);
+
+ if (pViewShell->GetWindow() != pWin)
+ {
+ // #i31551# was wrong, it may have been a problem with the repaint at that time.
+ // For transparent form controls, it is necessary to have that flag set, all apps
+ // do set it. Enabling again.
+ if (pWin)
+ {
+ pWin->EnableChildTransparentMode();
+ }
+ }
+
+ if (mpActiveWindow.get() != pWin)
+ mpActiveWindow = pWin;
+
+ // The rest of this function is not guarded anymore against calling this
+ // method with an already active window because the functions may still
+ // point to the old window when the new one has already been assigned to
+ // pWindow elsewhere.
+ ::sd::View* pView = GetView();
+ if (pView)
+ {
+ pView->SetActualWin(pWin->GetOutDev());
+ }
+ if(HasCurrentFunction())
+ {
+ GetCurrentFunction()->SetWindow(pWin);
+ }
+}
+
+bool ViewShell::RequestHelp(const HelpEvent& rHEvt)
+{
+ bool bReturn = false;
+
+ if (bool(rHEvt.GetMode()))
+ {
+ if(HasCurrentFunction())
+ {
+ bReturn = GetCurrentFunction()->RequestHelp(rHEvt);
+ }
+ }
+
+ return bReturn;
+}
+
+void ViewShell::SetFrameView (FrameView* pNewFrameView)
+{
+ mpFrameView = pNewFrameView;
+ ReadFrameViewData (mpFrameView);
+}
+
+/*************************************************************************
+|*
+|* Read FrameViews data and set actual views data
+|*
+\************************************************************************/
+
+void ViewShell::ReadFrameViewData(FrameView*)
+{
+}
+
+/*************************************************************************
+|*
+|* Write actual views data to FrameView
+|*
+\************************************************************************/
+
+void ViewShell::WriteFrameViewData()
+{
+}
+
+bool ViewShell::ActivateObject(SdrOle2Obj* pObj, sal_Int32 nVerb)
+{
+ ErrCode aErrCode = ERRCODE_NONE;
+
+ SfxErrorContext aEC(ERRCTX_SO_DOVERB, GetFrameWeld(), RID_SO_ERRCTX);
+ bool bAbort = false;
+ GetDocSh()->SetWaitCursor( true );
+ SfxViewShell* pViewShell = GetViewShell();
+ OSL_ASSERT (pViewShell!=nullptr);
+ bool bChangeDefaultsForChart = false;
+
+ uno::Reference < embed::XEmbeddedObject > xObj = pObj->GetObjRef();
+ if ( !xObj.is() )
+ {
+ // provide OLE object to empty OLE object
+ OUString aName = pObj->GetProgName();
+ OUString aObjName;
+ SvGlobalName aClass;
+
+ if( aName == "StarChart" || aName == "StarOrg" )
+ {
+ if( SvtModuleOptions().IsChart() )
+ {
+ aClass = SvGlobalName( SO3_SCH_CLASSID );
+ bChangeDefaultsForChart = true;
+ }
+ }
+ else if( aName == "StarCalc" )
+ {
+ if( SvtModuleOptions().IsCalc() )
+ aClass = SvGlobalName( SO3_SC_CLASSID );
+ }
+ else if( aName == "StarMath" )
+ {
+ if( SvtModuleOptions().IsMath() )
+ aClass = SvGlobalName( SO3_SM_CLASSID );
+ }
+
+ if ( aClass != SvGlobalName() )
+ xObj = GetDocSh()->GetEmbeddedObjectContainer().CreateEmbeddedObject( aClass.GetByteSequence(), aObjName );
+
+ if( !xObj.is() )
+ {
+ aName.clear();
+
+ // call dialog "insert OLE object"
+ GetDocSh()->SetWaitCursor( false );
+ pViewShell->GetViewFrame()->GetDispatcher()->Execute(
+ SID_INSERT_OBJECT,
+ SfxCallMode::SYNCHRON | SfxCallMode::RECORD);
+ xObj = pObj->GetObjRef();
+ GetDocSh()->SetWaitCursor( true );
+
+ if (!xObj.is())
+ {
+ bAbort = true;
+ }
+ }
+
+ if ( xObj.is() )
+ {
+ // OLE object is no longer empty
+ pObj->SetEmptyPresObj(false);
+ pObj->SetOutlinerParaObject(std::nullopt);
+ pObj->ClearGraphic();
+
+ // the empty OLE object gets a new IPObj
+ if (!aName.isEmpty())
+ {
+ pObj->SetObjRef(xObj);
+ pObj->SetName(aObjName);
+ pObj->SetPersistName(aObjName);
+ }
+ else
+ {
+ // insertion was done by the dialog
+ pObj->SetObjRef(xObj);
+ }
+
+ ::tools::Rectangle aRect = pObj->GetLogicRect();
+
+ if ( pObj->GetAspect() != embed::Aspects::MSOLE_ICON )
+ {
+ awt::Size aSz;
+ aSz.Width = aRect.GetWidth();
+ aSz.Height = aRect.GetHeight();
+ xObj->setVisualAreaSize( pObj->GetAspect(), aSz );
+ }
+
+ GetViewShellBase().SetVerbs( xObj->getSupportedVerbs() );
+
+ nVerb = embed::EmbedVerbs::MS_OLEVERB_SHOW;
+ }
+ else
+ {
+ aErrCode = ERRCODE_SFX_OLEGENERAL;
+ }
+ }
+
+ if( aErrCode == ERRCODE_NONE )
+ {
+ ::sd::View* pView = GetView();
+
+ if (pView->IsTextEdit())
+ {
+ pView->SdrEndTextEdit();
+ }
+
+ SfxInPlaceClient* pSdClient =
+ pViewShell->FindIPClient(pObj->GetObjRef(), GetActiveWindow());
+
+ if ( !pSdClient )
+ {
+ pSdClient = new Client(pObj, this, GetActiveWindow());
+ }
+
+ ::tools::Rectangle aRect = pObj->GetLogicRect();
+
+ {
+ // #i118485# center on BoundRect for activation,
+ // OLE may be sheared/rotated now
+ const ::tools::Rectangle& rBoundRect = pObj->GetCurrentBoundRect();
+ const Point aDelta(rBoundRect.Center() - aRect.Center());
+ aRect.Move(aDelta.X(), aDelta.Y());
+ }
+
+ Size aDrawSize = aRect.GetSize();
+
+ MapMode aMapMode( GetDoc()->GetScaleUnit() );
+ Size aObjAreaSize = pObj->GetOrigObjSize( &aMapMode );
+ if( pObj->IsChart() ) //charts never should be stretched see #i84323# for example
+ aObjAreaSize = aDrawSize;
+
+ Fraction aScaleWidth (aDrawSize.Width(), aObjAreaSize.Width() );
+ Fraction aScaleHeight(aDrawSize.Height(), aObjAreaSize.Height() );
+ aScaleWidth.ReduceInaccurate(10); // compatible to the SdrOle2Obj
+ aScaleHeight.ReduceInaccurate(10);
+ pSdClient->SetSizeScale(aScaleWidth, aScaleHeight);
+
+ // visible section is only changed in-place!
+ aRect.SetSize(aObjAreaSize);
+ // the object area size must be set after scaling, since it triggers the resizing
+ pSdClient->SetObjArea(aRect);
+
+ if( bChangeDefaultsForChart && xObj.is())
+ {
+ ChartHelper::AdaptDefaultsForChart( xObj );
+ }
+
+ pSdClient->DoVerb(nVerb); // if necessary, ErrCode is outputted by Sfx
+ pViewShell->GetViewFrame()->GetBindings().Invalidate(
+ SID_NAVIGATOR_STATE, true);
+ }
+
+ GetDocSh()->SetWaitCursor( false );
+
+ if (aErrCode != ERRCODE_NONE && !bAbort)
+ {
+ ErrorHandler::HandleError(* new StringErrorInfo(aErrCode, OUString() ) );
+ }
+
+ return aErrCode == ERRCODE_NONE;
+}
+
+/**
+ * @returns enclosing rectangle of all (split-) windows.
+ */
+const ::tools::Rectangle& ViewShell::GetAllWindowRect()
+{
+ maAllWindowRectangle.SetPos(
+ mpContentWindow->OutputToScreenPixel(Point(0,0)));
+ return maAllWindowRectangle;
+}
+
+void ViewShell::ReadUserData()
+{
+ // zoom onto VisArea from FrameView
+ GetViewShell()->GetViewFrame()->GetDispatcher()->Execute(SID_SIZE_VISAREA,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD);
+}
+
+void ViewShell::WriteUserData()
+{
+ // writing of our data is always done in WriteFrameViewData()
+ WriteFrameViewData();
+}
+
+/**
+ * Switch ruler on/off
+ */
+void ViewShell::SetRuler(bool bRuler)
+{
+ mbHasRulers = ( bRuler && !GetDocSh()->IsPreview() ); // no rulers on preview mode
+
+ if (mpHorizontalRuler)
+ {
+ if (mbHasRulers)
+ {
+ mpHorizontalRuler->Show();
+ }
+ else
+ {
+ mpHorizontalRuler->Hide();
+ }
+ }
+
+ if (mpVerticalRuler)
+ {
+ if (mbHasRulers)
+ {
+ mpVerticalRuler->Show();
+ }
+ else
+ {
+ mpVerticalRuler->Hide();
+ }
+ }
+
+ OSL_ASSERT(GetViewShell()!=nullptr);
+ if (IsMainViewShell())
+ GetViewShell()->InvalidateBorder();
+}
+
+void ViewShell::SetScrollBarsVisible(bool bVisible)
+{
+ if (mpVerticalScrollBar)
+ mpVerticalScrollBar->Show( bVisible );
+
+ if (mpHorizontalScrollBar)
+ mpHorizontalScrollBar->Show( bVisible );
+
+ if (mpScrollBarBox)
+ mpScrollBarBox->Show(bVisible);
+}
+
+sal_Int8 ViewShell::AcceptDrop (
+ const AcceptDropEvent& rEvt,
+ DropTargetHelper& rTargetHelper,
+ ::sd::Window* /*pTargetWindow*/,
+ sal_uInt16 /*nPage*/,
+ SdrLayerID nLayer)
+{
+ ::sd::View* pView = GetView();
+ return( pView ? pView->AcceptDrop( rEvt, rTargetHelper, nLayer ) : DND_ACTION_NONE );
+}
+
+sal_Int8 ViewShell::ExecuteDrop (
+ const ExecuteDropEvent& rEvt,
+ DropTargetHelper& /*rTargetHelper*/,
+ ::sd::Window* pTargetWindow,
+ sal_uInt16 nPage,
+ SdrLayerID nLayer)
+{
+ ::sd::View* pView = GetView();
+ return pView ? pView->ExecuteDrop( rEvt, pTargetWindow, nPage, nLayer ) : DND_ACTION_NONE;
+}
+
+void ViewShell::WriteUserDataSequence ( css::uno::Sequence < css::beans::PropertyValue >& rSequence )
+{
+ const sal_Int32 nIndex = rSequence.getLength();
+ rSequence.realloc( nIndex + 1 );
+ auto pSequence = rSequence.getArray();
+
+ OSL_ASSERT (GetViewShell()!=nullptr);
+ // Get the view id from the view shell in the center pane. This will
+ // usually be the called view shell, but to be on the safe side we call
+ // the main view shell explicitly.
+ SfxInterfaceId nViewID (IMPRESS_FACTORY_ID);
+ if (GetViewShellBase().GetMainViewShell() != nullptr)
+ nViewID = GetViewShellBase().GetMainViewShell()->mpImpl->GetViewId();
+ pSequence[nIndex].Name = sUNO_View_ViewId;
+ pSequence[nIndex].Value <<= "view" + OUString::number( static_cast<sal_uInt16>(nViewID));
+
+ mpFrameView->WriteUserDataSequence( rSequence );
+}
+
+void ViewShell::ReadUserDataSequence ( const css::uno::Sequence < css::beans::PropertyValue >& rSequence )
+{
+ mpFrameView->ReadUserDataSequence( rSequence );
+}
+
+void ViewShell::VisAreaChanged(const ::tools::Rectangle& /*rRect*/)
+{
+ OSL_ASSERT (GetViewShell()!=nullptr);
+ GetViewShell()->VisAreaChanged();
+}
+
+void ViewShell::SetWinViewPos(const Point& rWinPos)
+{
+ if (mpContentWindow)
+ {
+ mpContentWindow->SetWinViewPos(rWinPos);
+
+ mpContentWindow->UpdateMapOrigin();
+ mpContentWindow->Invalidate();
+ }
+
+ if (mbHasRulers)
+ {
+ UpdateHRuler();
+ UpdateVRuler();
+ }
+
+ UpdateScrollBars();
+
+ Size aVisSizePixel = GetActiveWindow()->GetOutputSizePixel();
+ ::tools::Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( ::tools::Rectangle( Point(0,0), aVisSizePixel) );
+ VisAreaChanged(aVisAreaWin);
+
+ ::sd::View* pView = GetView();
+ if (pView)
+ {
+ pView->VisAreaChanged(GetActiveWindow()->GetOutDev());
+ }
+}
+
+Point const & ViewShell::GetWinViewPos() const
+{
+ return mpContentWindow->GetWinViewPos();
+}
+
+Point const & ViewShell::GetViewOrigin() const
+{
+ return mpContentWindow->GetViewOrigin();
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/viewshe3.cxx b/sd/source/ui/view/viewshe3.cxx
new file mode 100644
index 000000000..7ebf88b44
--- /dev/null
+++ b/sd/source/ui/view/viewshe3.cxx
@@ -0,0 +1,383 @@
+/* -*- 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 <config_features.h>
+
+#include <ViewShell.hxx>
+#include <ViewShellBase.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <svtools/strings.hrc>
+#include <svtools/svtresid.hxx>
+
+#include <app.hrc>
+#include <strings.hrc>
+
+#include <sal/log.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/bindings.hxx>
+#include <svx/svdundo.hxx>
+#include <svl/intitem.hxx>
+#include <svl/style.hxx>
+#include <svl/stritem.hxx>
+#include <stlsheet.hxx>
+#include <DrawViewShell.hxx>
+
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <DrawDocShell.hxx>
+#include <sdresid.hxx>
+#include <unokywds.hxx>
+
+#include <svx/svxids.hrc>
+#include <sfx2/request.hxx>
+#include <basic/sbstar.hxx>
+#include <basic/sberrors.hxx>
+#include <xmloff/autolayout.hxx>
+
+using namespace ::com::sun::star;
+
+namespace sd {
+
+/**
+ * set state (enabled/disabled) of Menu SfxSlots
+ */
+void ViewShell::GetMenuState( SfxItemSet &rSet )
+{
+ if( SfxItemState::DEFAULT == rSet.GetItemState( SID_STYLE_FAMILY ) )
+ {
+ SfxStyleFamily const nFamily = GetDocSh()->GetStyleFamily();
+
+ SdrView* pDrView = GetDrawView();
+
+ if( pDrView->AreObjectsMarked() )
+ {
+ SfxStyleSheet* pStyleSheet = pDrView->GetStyleSheet();
+ if( pStyleSheet )
+ {
+ if (pStyleSheet->GetFamily() == SfxStyleFamily::Page)
+ pStyleSheet = static_cast<SdStyleSheet*>(pStyleSheet)->GetPseudoStyleSheet();
+
+ if( pStyleSheet )
+ {
+ GetDocSh()->SetStyleFamily(pStyleSheet->GetFamily());
+ }
+ }
+ }
+
+ rSet.Put(SfxUInt16Item(SID_STYLE_FAMILY, static_cast<sal_uInt16>(nFamily)));
+ }
+
+ if(SfxItemState::DEFAULT == rSet.GetItemState(SID_GETUNDOSTRINGS))
+ {
+ ImpGetUndoStrings(rSet);
+ }
+
+ if(SfxItemState::DEFAULT == rSet.GetItemState(SID_GETREDOSTRINGS))
+ {
+ ImpGetRedoStrings(rSet);
+ }
+
+ if(SfxItemState::DEFAULT == rSet.GetItemState(SID_UNDO))
+ {
+ SfxUndoManager* pUndoManager = ImpGetUndoManager();
+ if(pUndoManager)
+ {
+ if(pUndoManager->GetUndoActionCount() != 0)
+ {
+ // If another view created the first undo action, prevent redoing it from this view.
+ const SfxUndoAction* pAction = pUndoManager->GetUndoAction();
+ if (pAction->GetViewShellId() != GetViewShellBase().GetViewShellId())
+ {
+ rSet.Put(SfxUInt32Item(SID_UNDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE)));
+ }
+ else
+ {
+ // Set the necessary string like in
+ // sfx2/source/view/viewfrm.cxx ver 1.23 ln 1072 ff.
+ OUString aTmp = SvtResId(STR_UNDO) +
+ pUndoManager->GetUndoActionComment();
+ rSet.Put(SfxStringItem(SID_UNDO, aTmp));
+ }
+ }
+ else
+ {
+ rSet.DisableItem(SID_UNDO);
+ }
+ }
+ }
+
+ if(SfxItemState::DEFAULT != rSet.GetItemState(SID_REDO))
+ return;
+
+ SfxUndoManager* pUndoManager = ImpGetUndoManager();
+ if(!pUndoManager)
+ return;
+
+ if(pUndoManager->GetRedoActionCount() != 0)
+ {
+ // If another view created the first undo action, prevent redoing it from this view.
+ const SfxUndoAction* pAction = pUndoManager->GetRedoAction();
+ if (pAction->GetViewShellId() != GetViewShellBase().GetViewShellId())
+ {
+ rSet.Put(SfxUInt32Item(SID_REDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE)));
+ }
+ else
+ {
+ // Set the necessary string like in
+ // sfx2/source/view/viewfrm.cxx ver 1.23 ln 1081 ff.
+ OUString aTmp = SvtResId(STR_REDO) + pUndoManager->GetRedoActionComment();
+ rSet.Put(SfxStringItem(SID_REDO, aTmp));
+ }
+ }
+ else
+ {
+ rSet.DisableItem(SID_REDO);
+ }
+}
+
+/** This method consists basically of three parts:
+ 1. Process the arguments of the SFX request.
+ 2. Use the model to create a new page or duplicate an existing one.
+ 3. Update the tab control and switch to the new page.
+*/
+SdPage* ViewShell::CreateOrDuplicatePage (
+ SfxRequest& rRequest,
+ PageKind ePageKind,
+ SdPage* pPage,
+ const sal_Int32 nInsertPosition)
+{
+ sal_uInt16 nSId = rRequest.GetSlot();
+ SdDrawDocument* pDocument = GetDoc();
+ SdrLayerAdmin& rLayerAdmin = pDocument->GetLayerAdmin();
+ SdrLayerID aBckgrnd = rLayerAdmin.GetLayerID(sUNO_LayerName_background);
+ SdrLayerID aBckgrndObj = rLayerAdmin.GetLayerID(sUNO_LayerName_background_objects);
+ SdrLayerIDSet aVisibleLayers;
+ // Determine the page from which to copy some values, such as layers,
+ // size, master page, to the new page. This is usually the given page.
+ // When the given page is NULL then use the first page of the document.
+ SdPage* pTemplatePage = pPage;
+ if (pTemplatePage == nullptr)
+ pTemplatePage = pDocument->GetSdPage(0, ePageKind);
+ if (pTemplatePage != nullptr && pTemplatePage->TRG_HasMasterPage())
+ aVisibleLayers = pTemplatePage->TRG_GetMasterPageVisibleLayers();
+ else
+ aVisibleLayers.SetAll();
+
+ OUString aStandardPageName;
+ OUString aNotesPageName;
+ AutoLayout eStandardLayout (AUTOLAYOUT_NONE);
+ AutoLayout eNotesLayout (AUTOLAYOUT_NOTES);
+ bool bIsPageBack = aVisibleLayers.IsSet(aBckgrnd);
+ bool bIsPageObj = aVisibleLayers.IsSet(aBckgrndObj);
+
+ // 1. Process the arguments.
+ const SfxItemSet* pArgs = rRequest.GetArgs();
+ if (! pArgs)
+ {
+ // AutoLayouts must be ready
+ pDocument->StopWorkStartupDelay();
+
+ // Use the layouts of the previous page and notes page as template.
+ if (pTemplatePage != nullptr)
+ {
+ eStandardLayout = pTemplatePage->GetAutoLayout();
+ if( eStandardLayout == AUTOLAYOUT_TITLE )
+ eStandardLayout = AUTOLAYOUT_TITLE_CONTENT;
+
+ SdPage* pNotesTemplatePage = static_cast<SdPage*>(pDocument->GetPage(pTemplatePage->GetPageNum()+1));
+ if (pNotesTemplatePage != nullptr)
+ eNotesLayout = pNotesTemplatePage->GetAutoLayout();
+ }
+ }
+ else if (pArgs->Count() == 1)
+ {
+ pDocument->StopWorkStartupDelay();
+ const SfxUInt32Item* pLayout = rRequest.GetArg<SfxUInt32Item>(ID_VAL_WHATLAYOUT);
+ if( pLayout )
+ {
+ if (ePageKind == PageKind::Notes)
+ {
+ eNotesLayout = static_cast<AutoLayout>(pLayout->GetValue ());
+ }
+ else
+ {
+ eStandardLayout = static_cast<AutoLayout>(pLayout->GetValue ());
+ }
+ }
+ }
+ else if (pArgs->Count() == 4)
+ {
+ // AutoLayouts must be ready
+ pDocument->StopWorkStartupDelay();
+
+ const SfxStringItem* pPageName = rRequest.GetArg<SfxStringItem>(ID_VAL_PAGENAME);
+ const SfxUInt32Item* pLayout = rRequest.GetArg<SfxUInt32Item>(ID_VAL_WHATLAYOUT);
+ const SfxBoolItem* pIsPageBack = rRequest.GetArg<SfxBoolItem>(ID_VAL_ISPAGEBACK);
+ const SfxBoolItem* pIsPageObj = rRequest.GetArg<SfxBoolItem>(ID_VAL_ISPAGEOBJ);
+
+ if (CHECK_RANGE (AUTOLAYOUT_START, static_cast<AutoLayout>(pLayout->GetValue ()), AUTOLAYOUT_END))
+ {
+ if (ePageKind == PageKind::Notes)
+ {
+ aNotesPageName = pPageName->GetValue ();
+ eNotesLayout = static_cast<AutoLayout>(pLayout->GetValue ());
+ }
+ else
+ {
+ aStandardPageName = pPageName->GetValue ();
+ eStandardLayout = static_cast<AutoLayout>(pLayout->GetValue ());
+ }
+
+ bIsPageBack = pIsPageBack->GetValue ();
+ bIsPageObj = pIsPageObj->GetValue ();
+ }
+ else
+ {
+ Cancel();
+
+ if(HasCurrentFunction( SID_BEZIER_EDIT ) )
+ GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_BAD_PROP_VALUE);
+#endif
+ rRequest.Ignore ();
+ return nullptr;
+ }
+ }
+ else
+ {
+ Cancel();
+
+ if(HasCurrentFunction(SID_BEZIER_EDIT) )
+ GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SfxCallMode::ASYNCHRON);
+#if HAVE_FEATURE_SCRIPTING
+ StarBASIC::FatalError (ERRCODE_BASIC_WRONG_ARGS);
+#endif
+ rRequest.Ignore ();
+ return nullptr;
+ }
+
+ // 2. Create a new page or duplicate an existing one.
+ View* pDrView = GetView();
+ const bool bUndo = pDrView && pDrView->IsUndoEnabled();
+ if( bUndo && GetDoc()->GetDocumentType() == DocumentType::Draw)
+ pDrView->BegUndo(SdResId(STR_INSERT_PAGE_DRAW));
+ else if (bUndo)
+ pDrView->BegUndo(SdResId(STR_INSERTPAGE));
+
+
+
+ sal_uInt16 nNewPageIndex = 0xffff;
+ switch (nSId)
+ {
+ case SID_INSERTPAGE:
+ case SID_INSERTPAGE_QUICK:
+ case SID_INSERT_MASTER_PAGE:
+ // There are three cases. a) pPage is not NULL: we use it as a
+ // template and create a new slide behind it. b) pPage is NULL
+ // but the document is not empty: we use the first slide/notes
+ // page as template, create a new slide after it and move it
+ // then to the head of the document. c) pPage is NULL and the
+ // document is empty: We use CreateFirstPages to create the
+ // first page of the document.
+ if (pPage == nullptr)
+ if (pTemplatePage == nullptr)
+ {
+ pDocument->CreateFirstPages();
+ nNewPageIndex = 0;
+ }
+ else
+ {
+ // Create a new page with the first page as template and
+ // insert it after the first page.
+ nNewPageIndex = pDocument->CreatePage (
+ pTemplatePage,
+ ePageKind,
+ aStandardPageName,
+ aNotesPageName,
+ eStandardLayout,
+ eNotesLayout,
+ bIsPageBack,
+ bIsPageObj,
+ nInsertPosition);
+ // Select exactly the new page.
+ sal_uInt16 nPageCount (pDocument->GetSdPageCount(ePageKind));
+ for (sal_uInt16 i=0; i<nPageCount; i++)
+ {
+ pDocument->GetSdPage(i, PageKind::Standard)->SetSelected(
+ i == nNewPageIndex);
+ pDocument->GetSdPage(i, PageKind::Notes)->SetSelected(
+ i == nNewPageIndex);
+ }
+ // Move the selected page to the head of the document
+ pDocument->MovePages (sal_uInt16(-1));
+ nNewPageIndex = 0;
+ }
+ else
+ nNewPageIndex = pDocument->CreatePage (
+ pPage,
+ ePageKind,
+ aStandardPageName,
+ aNotesPageName,
+ eStandardLayout,
+ eNotesLayout,
+ bIsPageBack,
+ bIsPageObj,
+ nInsertPosition);
+ break;
+
+ case SID_DUPLICATE_PAGE:
+ // Duplication makes no sense when pPage is NULL.
+ if (pPage != nullptr)
+ nNewPageIndex = pDocument->DuplicatePage (
+ pPage,
+ ePageKind,
+ aStandardPageName,
+ aNotesPageName,
+ bIsPageBack,
+ bIsPageObj,
+ nInsertPosition);
+ break;
+
+ default:
+ SAL_INFO("sd", "wrong slot id given to CreateOrDuplicatePage");
+ // Try to handle another slot id gracefully.
+ }
+ SdPage* pNewPage = nullptr;
+ if(nNewPageIndex != 0xffff)
+ pNewPage = pDocument->GetSdPage(nNewPageIndex, PageKind::Standard);
+
+ if( bUndo )
+ {
+ if( pNewPage )
+ {
+ pDrView->AddUndo(pDocument->GetSdrUndoFactory().CreateUndoNewPage(*pNewPage));
+ pDrView->AddUndo(pDocument->GetSdrUndoFactory().CreateUndoNewPage(*pDocument->GetSdPage (nNewPageIndex, PageKind::Notes)));
+ }
+
+ pDrView->EndUndo();
+ }
+
+ return pNewPage;
+}
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/viewshel.cxx b/sd/source/ui/view/viewshel.cxx
new file mode 100644
index 000000000..866b79461
--- /dev/null
+++ b/sd/source/ui/view/viewshel.cxx
@@ -0,0 +1,1634 @@
+/* -*- 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 <memory>
+#include <ViewShell.hxx>
+#include <ViewShellImplementation.hxx>
+#include <createtableobjectbar.hxx>
+
+#include <ViewShellBase.hxx>
+#include <ShellFactory.hxx>
+#include <DrawController.hxx>
+#include <LayerTabBar.hxx>
+
+#include <sal/log.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <vcl/commandevent.hxx>
+#include <vcl/scrbar.hxx>
+#include <svl/eitem.hxx>
+#include <svx/ruler.hxx>
+#include <svx/svxids.hrc>
+#include <svx/fmshell.hxx>
+#include <WindowUpdater.hxx>
+#include <sdxfer.hxx>
+
+#include <app.hrc>
+
+#include <OutlineView.hxx>
+#include <DrawViewShell.hxx>
+#include <DrawDocShell.hxx>
+#include <slideshow.hxx>
+#include <drawdoc.hxx>
+#include <sdpage.hxx>
+#include <zoomlist.hxx>
+#include <FrameView.hxx>
+#include <BezierObjectBar.hxx>
+#include <TextObjectBar.hxx>
+#include <GraphicObjectBar.hxx>
+#include <MediaObjectBar.hxx>
+#include <SlideSorter.hxx>
+#include <SlideSorterViewShell.hxx>
+#include <ViewShellManager.hxx>
+#include <FormShellManager.hxx>
+#include <svx/extrusionbar.hxx>
+#include <svx/fontworkbar.hxx>
+#include <svx/svdoutl.hxx>
+#include <tools/svborder.hxx>
+#include <comphelper/lok.hxx>
+
+#include <svl/slstitm.hxx>
+#include <sfx2/request.hxx>
+#include <SpellDialogChildWindow.hxx>
+#include <controller/SlideSorterController.hxx>
+#include <controller/SlsPageSelector.hxx>
+#include <controller/SlsSelectionObserver.hxx>
+#include <view/SlideSorterView.hxx>
+
+#include <basegfx/utils/zoomtools.hxx>
+
+#include <Window.hxx>
+#include <fupoor.hxx>
+#include <futext.hxx>
+
+#include <editeng/numitem.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/editview.hxx>
+#include <editeng/editeng.hxx>
+#include <svl/itempool.hxx>
+#include <svl/intitem.hxx>
+#include <svl/poolitem.hxx>
+#include <strings.hxx>
+#include <sdmod.hxx>
+#include <AccessibleDocumentViewBase.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::presentation;
+
+namespace {
+
+class ViewShellObjectBarFactory
+ : public ::sd::ShellFactory<SfxShell>
+{
+public:
+ explicit ViewShellObjectBarFactory (::sd::ViewShell& rViewShell);
+ virtual SfxShell* CreateShell( ::sd::ShellId nId ) override;
+ virtual void ReleaseShell (SfxShell* pShell) override;
+private:
+ ::sd::ViewShell& mrViewShell;
+};
+
+} // end of anonymous namespace
+
+namespace sd {
+
+bool ViewShell::IsPageFlipMode() const
+{
+ return dynamic_cast< const DrawViewShell *>( this ) != nullptr && mpContentWindow &&
+ mpContentWindow->GetVisibleHeight() >= 1.0;
+}
+
+SfxViewFrame* ViewShell::GetViewFrame() const
+{
+ const SfxViewShell* pViewShell = GetViewShell();
+ if (pViewShell != nullptr)
+ {
+ return pViewShell->GetViewFrame();
+ }
+ else
+ {
+ OSL_ASSERT (GetViewShell()!=nullptr);
+ return nullptr;
+ }
+}
+
+/// declare SFX-Slotmap and standard interface
+
+ViewShell::ViewShell( vcl::Window* pParentWindow, ViewShellBase& rViewShellBase)
+: SfxShell(&rViewShellBase)
+, mpParentWindow(pParentWindow)
+{
+ construct();
+}
+
+ViewShell::~ViewShell()
+{
+ // Keep the content window from accessing in its destructor the
+ // WindowUpdater.
+ if (mpContentWindow)
+ mpContentWindow->SetViewShell(nullptr);
+
+ mpZoomList.reset();
+
+ mpLayerTabBar.disposeAndClear();
+
+ if (mpImpl->mpSubShellFactory)
+ GetViewShellBase().GetViewShellManager()->RemoveSubShellFactory(
+ this,mpImpl->mpSubShellFactory);
+
+ if (mpContentWindow)
+ {
+ SAL_INFO(
+ "sd.view",
+ "destroying mpContentWindow at " << mpContentWindow.get()
+ << " with parent " << mpContentWindow->GetParent());
+ mpContentWindow.disposeAndClear();
+ }
+
+ mpScrollBarBox.disposeAndClear();
+ mpVerticalRuler.disposeAndClear();
+ mpHorizontalRuler.disposeAndClear();
+ mpVerticalScrollBar.disposeAndClear();
+ mpHorizontalScrollBar.disposeAndClear();
+}
+
+/**
+ * common initialization part of both constructors
+ */
+void ViewShell::construct()
+{
+ mbHasRulers = false;
+ mpActiveWindow = nullptr;
+ mpView = nullptr;
+ mpFrameView = nullptr;
+ mpZoomList = nullptr;
+ mbStartShowWithDialog = false;
+ mnPrintedHandoutPageNum = 1;
+ mnPrintedHandoutPageCount = 0;
+ mpWindowUpdater.reset( new ::sd::WindowUpdater() );
+ mpImpl.reset(new Implementation(*this));
+ meShellType = ST_NONE;
+
+ OSL_ASSERT (GetViewShell()!=nullptr);
+
+ if (IsMainViewShell())
+ GetDocSh()->Connect (this);
+
+ mpZoomList.reset( new ZoomList( this ) );
+
+ mpContentWindow.reset(VclPtr< ::sd::Window >::Create(GetParentWindow()));
+ SetActiveWindow (mpContentWindow.get());
+
+ GetParentWindow()->SetBackground (Wallpaper());
+ mpContentWindow->SetBackground (Wallpaper());
+ mpContentWindow->SetCenterAllowed(true);
+ mpContentWindow->SetViewShell(this);
+ mpContentWindow->SetPosSizePixel(
+ GetParentWindow()->GetPosPixel(),GetParentWindow()->GetSizePixel());
+
+ if ( ! GetDocSh()->IsPreview())
+ {
+ // Create scroll bars and the filler between the scroll bars.
+ mpHorizontalScrollBar.reset (VclPtr<ScrollBar>::Create(GetParentWindow(), WinBits(WB_HSCROLL | WB_DRAG)));
+ mpHorizontalScrollBar->EnableRTL (false);
+ mpHorizontalScrollBar->SetRange(Range(0, 32000));
+ mpHorizontalScrollBar->SetScrollHdl(LINK(this, ViewShell, HScrollHdl));
+
+ mpVerticalScrollBar.reset (VclPtr<ScrollBar>::Create(GetParentWindow(), WinBits(WB_VSCROLL | WB_DRAG)));
+ mpVerticalScrollBar->SetRange(Range(0, 32000));
+ mpVerticalScrollBar->SetScrollHdl(LINK(this, ViewShell, VScrollHdl));
+
+ mpScrollBarBox.reset(VclPtr<ScrollBarBox>::Create(GetParentWindow(), WB_SIZEABLE));
+ }
+
+ SetName ("ViewShell");
+
+ GetDoc()->StartOnlineSpelling(false);
+
+ mpWindowUpdater->SetDocument (GetDoc());
+
+ // Re-initialize the spell dialog.
+ ::sd::SpellDialogChildWindow* pSpellDialog =
+ static_cast< ::sd::SpellDialogChildWindow*> (
+ GetViewFrame()->GetChildWindow (
+ ::sd::SpellDialogChildWindow::GetChildWindowId()));
+ if (pSpellDialog != nullptr)
+ pSpellDialog->InvalidateSpellDialog();
+
+ // Register the sub shell factory.
+ mpImpl->mpSubShellFactory = std::make_shared<ViewShellObjectBarFactory>(*this);
+ GetViewShellBase().GetViewShellManager()->AddSubShellFactory(this,mpImpl->mpSubShellFactory);
+}
+
+void ViewShell::doShow()
+{
+ mpContentWindow->Show();
+ static_cast< vcl::Window*>(mpContentWindow.get())->Resize();
+ SAL_INFO(
+ "sd.view",
+ "content window has size " << mpContentWindow->GetSizePixel().Width()
+ << " " << mpContentWindow->GetSizePixel().Height());
+
+ if ( ! GetDocSh()->IsPreview())
+ {
+ // Show scroll bars
+ mpHorizontalScrollBar->Show();
+
+ mpVerticalScrollBar->Show();
+ maScrBarWH = Size(
+ mpVerticalScrollBar->GetSizePixel().Width(),
+ mpHorizontalScrollBar->GetSizePixel().Height());
+
+ mpScrollBarBox->Show();
+ }
+
+ GetParentWindow()->Show();
+}
+
+void ViewShell::Init (bool bIsMainViewShell)
+{
+ mpImpl->mbIsInitialized = true;
+ SetIsMainViewShell(bIsMainViewShell);
+ if (bIsMainViewShell)
+ SetActiveWindow (mpContentWindow.get());
+}
+
+void ViewShell::Exit()
+{
+ sd::View* pView = GetView();
+ if (pView!=nullptr && pView->IsTextEdit())
+ {
+ pView->SdrEndTextEdit();
+ pView->UnmarkAll();
+ }
+
+ Deactivate (true);
+
+ if (IsMainViewShell())
+ GetDocSh()->Disconnect(this);
+
+ SetIsMainViewShell(false);
+}
+
+/**
+ * set focus to working window
+ */
+void ViewShell::Activate(bool bIsMDIActivate)
+{
+ // Do not forward to SfxShell::Activate()
+
+ /* According to MI, nobody is allowed to call GrabFocus, who does not
+ exactly know from which window the focus is grabbed. Since Activate()
+ is sent sometimes asynchronous, it can happen, that the wrong window
+ gets the focus. */
+
+ if (mpHorizontalRuler)
+ mpHorizontalRuler->SetActive();
+ if (mpVerticalRuler)
+ mpVerticalRuler->SetActive();
+
+ if (bIsMDIActivate)
+ {
+ // thus, the Navigator will also get a current status
+ SfxBoolItem aItem( SID_NAVIGATOR_INIT, true );
+ if (GetDispatcher() != nullptr)
+ GetDispatcher()->ExecuteList(
+ SID_NAVIGATOR_INIT,
+ SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
+ { &aItem });
+
+ SfxViewShell* pViewShell = GetViewShell();
+ OSL_ASSERT (pViewShell!=nullptr);
+ SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings();
+ rBindings.Invalidate( SID_3D_STATE, true );
+
+ rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
+ if (xSlideShow.is() && xSlideShow->isRunning())
+ {
+ bool bSuccess = xSlideShow->activate(GetViewShellBase());
+ assert(bSuccess && "can only return false with a PresentationViewShell"); (void)bSuccess;
+ }
+
+ if(HasCurrentFunction())
+ GetCurrentFunction()->Activate();
+
+ if(!GetDocSh()->IsUIActive())
+ UpdatePreview( GetActualPage() );
+ }
+
+ ReadFrameViewData( mpFrameView );
+
+ if (IsMainViewShell())
+ GetDocSh()->Connect(this);
+}
+
+void ViewShell::UIActivating( SfxInPlaceClient* )
+{
+ OSL_ASSERT (GetViewShell()!=nullptr);
+ GetViewShellBase().GetToolBarManager()->ToolBarsDestroyed();
+}
+
+void ViewShell::UIDeactivated( SfxInPlaceClient* )
+{
+ OSL_ASSERT (GetViewShell()!=nullptr);
+ GetViewShellBase().GetToolBarManager()->ToolBarsDestroyed();
+ if ( GetDrawView() )
+ GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*this, *GetDrawView());
+}
+
+void ViewShell::Deactivate(bool bIsMDIActivate)
+{
+ // remove view from a still active drag'n'drop session
+ SdTransferable* pDragTransferable = SD_MOD()->pTransferDrag;
+
+ if (IsMainViewShell())
+ GetDocSh()->Disconnect(this);
+
+ if( pDragTransferable )
+ pDragTransferable->SetView( nullptr );
+
+ OSL_ASSERT (GetViewShell()!=nullptr);
+
+ // remember view attributes of FrameView
+ WriteFrameViewData();
+
+ if (bIsMDIActivate)
+ {
+ rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
+ if(xSlideShow.is() && xSlideShow->isRunning() )
+ xSlideShow->deactivate();
+
+ if(HasCurrentFunction())
+ GetCurrentFunction()->Deactivate();
+ }
+
+ if (mpHorizontalRuler)
+ mpHorizontalRuler->SetActive(false);
+ if (mpVerticalRuler)
+ mpVerticalRuler->SetActive(false);
+
+ SfxShell::Deactivate(bIsMDIActivate);
+}
+
+void ViewShell::Shutdown()
+{
+ Exit ();
+}
+
+bool ViewShell::KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin)
+{
+ bool bReturn(false);
+
+ if(pWin)
+ SetActiveWindow(pWin);
+
+ // give key input first to SfxViewShell to give CTRL+Key
+ // (e.g. CTRL+SHIFT+'+', to front) priority.
+ OSL_ASSERT(GetViewShell() != nullptr);
+ bReturn = GetViewShell()->KeyInput(rKEvt);
+
+ const size_t OriCount = GetView()->GetMarkedObjectList().GetMarkCount();
+ if(!bReturn)
+ {
+ rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
+ if(xSlideShow.is() && xSlideShow->isRunning())
+ {
+ bReturn = xSlideShow->keyInput(rKEvt);
+ }
+ else
+ {
+ bool bConsumed = false;
+ if( GetView() )
+ bConsumed = GetView()->getSmartTags().KeyInput(rKEvt);
+
+ if( !bConsumed )
+ {
+ rtl::Reference< sdr::SelectionController > xSelectionController( GetView()->getSelectionController() );
+ if( !xSelectionController.is() || !xSelectionController->onKeyInput( rKEvt, pWin ) )
+ {
+ if(HasCurrentFunction())
+ bReturn = GetCurrentFunction()->KeyInput(rKEvt);
+ }
+ else
+ {
+ bReturn = true;
+ if (HasCurrentFunction())
+ {
+ FuText* pTextFunction = dynamic_cast<FuText*>(GetCurrentFunction().get());
+ if(pTextFunction != nullptr)
+ pTextFunction->InvalidateBindings();
+ }
+ }
+ }
+ }
+ }
+ const size_t EndCount = GetView()->GetMarkedObjectList().GetMarkCount();
+ // Here, oriCount or endCount must have one value=0, another value > 0, then to switch focus between Document and shape objects
+ if(bReturn && (OriCount + EndCount > 0) && (OriCount * EndCount == 0))
+ SwitchActiveViewFireFocus();
+
+ if(!bReturn && GetActiveWindow())
+ {
+ vcl::KeyCode aKeyCode = rKEvt.GetKeyCode();
+
+ if (aKeyCode.IsMod1() && aKeyCode.IsShift()
+ && aKeyCode.GetCode() == KEY_R)
+ {
+ InvalidateWindows();
+ bReturn = true;
+ }
+ }
+
+ return bReturn;
+}
+
+void ViewShell::MouseButtonDown(const MouseEvent& rMEvt, ::sd::Window* pWin)
+{
+ // We have to lock tool bar updates while the mouse button is pressed in
+ // order to prevent the shape under the mouse to be moved (this happens
+ // when the number of docked tool bars changes as result of a changed
+ // selection; this changes the window size and thus the mouse position
+ // in model coordinates: with respect to model coordinates the mouse
+ // moves.)
+ OSL_ASSERT(mpImpl->mpUpdateLockForMouse.expired());
+ mpImpl->mpUpdateLockForMouse = ViewShell::Implementation::ToolBarManagerLock::Create(
+ GetViewShellBase().GetToolBarManager());
+
+ if ( pWin && !pWin->HasFocus() )
+ {
+ pWin->GrabFocus();
+ SetActiveWindow(pWin);
+ }
+
+ // insert MouseEvent into E3dView
+ if (GetView() != nullptr)
+ GetView()->SetMouseEvent(rMEvt);
+
+ bool bConsumed = false;
+ if( GetView() )
+ bConsumed = GetView()->getSmartTags().MouseButtonDown( rMEvt );
+
+ if( bConsumed )
+ return;
+
+ rtl::Reference< sdr::SelectionController > xSelectionController( GetView()->getSelectionController() );
+ if( !xSelectionController.is() || !xSelectionController->onMouseButtonDown( rMEvt, pWin ) )
+ {
+ if(HasCurrentFunction())
+ GetCurrentFunction()->MouseButtonDown(rMEvt);
+ }
+ else
+ {
+ if (HasCurrentFunction())
+ {
+ FuText* pTextFunction = dynamic_cast<FuText*>(GetCurrentFunction().get());
+ if (pTextFunction != nullptr)
+ pTextFunction->InvalidateBindings();
+ }
+ }
+}
+
+void ViewShell::SetCursorMm100Position(const Point& rPosition, bool bPoint, bool bClearMark)
+{
+ if (SdrView* pSdrView = GetView())
+ {
+ rtl::Reference<sdr::SelectionController> xSelectionController(GetView()->getSelectionController());
+ if (!xSelectionController.is() || !xSelectionController->setCursorLogicPosition(rPosition, bPoint))
+ {
+ if (pSdrView->GetTextEditObject())
+ {
+ EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView();
+ rEditView.SetCursorLogicPosition(rPosition, bPoint, bClearMark);
+ }
+ }
+ }
+}
+
+uno::Reference<datatransfer::XTransferable> ViewShell::GetSelectionTransferrable() const
+{
+ SdrView* pSdrView = GetView();
+ if (!pSdrView)
+ return uno::Reference<datatransfer::XTransferable>();
+
+ if (!pSdrView->GetTextEditObject())
+ return uno::Reference<datatransfer::XTransferable>();
+
+ EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView();
+ return rEditView.GetEditEngine()->CreateTransferable(rEditView.GetSelection());
+}
+
+void ViewShell::SetGraphicMm100Position(bool bStart, const Point& rPosition)
+{
+ if (bStart)
+ {
+ MouseEvent aClickEvent(rPosition, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT);
+ MouseButtonDown(aClickEvent, mpActiveWindow);
+ MouseEvent aMoveEvent(Point(rPosition.getX(), rPosition.getY()), 0, MouseEventModifiers::SIMPLEMOVE, MOUSE_LEFT);
+ MouseMove(aMoveEvent, mpActiveWindow);
+ }
+ else
+ {
+ MouseEvent aMoveEvent(Point(rPosition.getX(), rPosition.getY()), 0, MouseEventModifiers::SIMPLEMOVE, MOUSE_LEFT);
+ MouseMove(aMoveEvent, mpActiveWindow);
+ MouseEvent aClickEvent(rPosition, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT);
+ MouseButtonUp(aClickEvent, mpActiveWindow);
+ }
+}
+
+void ViewShell::MouseMove(const MouseEvent& rMEvt, ::sd::Window* pWin)
+{
+ if (rMEvt.IsLeaveWindow())
+ {
+ if ( ! mpImpl->mpUpdateLockForMouse.expired())
+ {
+ std::shared_ptr<ViewShell::Implementation::ToolBarManagerLock> pLock(
+ mpImpl->mpUpdateLockForMouse);
+ if (pLock != nullptr)
+ pLock->Release();
+ }
+ }
+
+ if ( pWin )
+ {
+ SetActiveWindow(pWin);
+ }
+
+ // insert MouseEvent into E3dView
+ if (GetView() != nullptr)
+ GetView()->SetMouseEvent(rMEvt);
+
+ if(HasCurrentFunction())
+ {
+ rtl::Reference< sdr::SelectionController > xSelectionController( GetView()->getSelectionController() );
+ if( !xSelectionController.is() || !xSelectionController->onMouseMove( rMEvt, pWin ) )
+ {
+ if(HasCurrentFunction())
+ GetCurrentFunction()->MouseMove(rMEvt);
+ }
+ }
+}
+
+void ViewShell::MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin)
+{
+ if ( pWin )
+ SetActiveWindow(pWin);
+
+ // insert MouseEvent into E3dView
+ if (GetView() != nullptr)
+ GetView()->SetMouseEvent(rMEvt);
+
+ if( HasCurrentFunction())
+ {
+ rtl::Reference< sdr::SelectionController > xSelectionController( GetView()->getSelectionController() );
+ if( !xSelectionController.is() || !xSelectionController->onMouseButtonUp( rMEvt, pWin ) )
+ {
+ if(HasCurrentFunction())
+ GetCurrentFunction()->MouseButtonUp(rMEvt);
+ }
+ else
+ {
+ if (HasCurrentFunction())
+ {
+ FuText* pTextFunction = dynamic_cast<FuText*>(GetCurrentFunction().get());
+ if (pTextFunction != nullptr)
+ pTextFunction->InvalidateBindings();
+ }
+ }
+ }
+
+ if ( ! mpImpl->mpUpdateLockForMouse.expired())
+ {
+ std::shared_ptr<ViewShell::Implementation::ToolBarManagerLock> pLock(
+ mpImpl->mpUpdateLockForMouse);
+ if (pLock != nullptr)
+ pLock->Release();
+ }
+}
+
+void ViewShell::Command(const CommandEvent& rCEvt, ::sd::Window* pWin)
+{
+ bool bDone = HandleScrollCommand (rCEvt, pWin);
+
+ if( bDone )
+ return;
+
+ if( rCEvt.GetCommand() == CommandEventId::InputLanguageChange )
+ {
+ //#i42732# update state of fontname if input language changes
+ GetViewFrame()->GetBindings().Invalidate( SID_ATTR_CHAR_FONT );
+ GetViewFrame()->GetBindings().Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
+ }
+ else
+ {
+ bool bConsumed = false;
+ if( GetView() )
+ bConsumed = GetView()->getSmartTags().Command(rCEvt);
+
+ if( !bConsumed && HasCurrentFunction())
+ GetCurrentFunction()->Command(rCEvt);
+ }
+}
+
+bool ViewShell::Notify(NotifyEvent const & rNEvt, ::sd::Window* pWin)
+{
+ // handle scroll commands when they arrived at child windows
+ bool bRet = false;
+ if( rNEvt.GetType() == MouseNotifyEvent::COMMAND )
+ {
+ // note: dynamic_cast is not possible as GetData() returns a void*
+ CommandEvent* pCmdEvent = static_cast< CommandEvent* >(rNEvt.GetData());
+ bRet = HandleScrollCommand(*pCmdEvent, pWin);
+ }
+ return bRet;
+}
+
+bool ViewShell::HandleScrollCommand(const CommandEvent& rCEvt, ::sd::Window* pWin)
+{
+ bool bDone = false;
+
+ switch( rCEvt.GetCommand() )
+ {
+ case CommandEventId::Swipe:
+ {
+ rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
+ if (xSlideShow.is())
+ {
+ const CommandSwipeData* pSwipeData = rCEvt.GetSwipeData();
+ bDone = xSlideShow->swipe(*pSwipeData);
+ }
+ }
+ break;
+ case CommandEventId::LongPress:
+ {
+ rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
+ if (xSlideShow.is())
+ {
+ const CommandLongPressData* pLongPressData = rCEvt.GetLongPressData();
+ bDone = xSlideShow->longpress(*pLongPressData);
+ }
+ }
+ break;
+
+ case CommandEventId::Wheel:
+ {
+ Reference< XSlideShowController > xSlideShowController( SlideShow::GetSlideShowController(GetViewShellBase() ) );
+ if( xSlideShowController.is() )
+ {
+ // We ignore zooming with control+mouse wheel.
+ const CommandWheelData* pData = rCEvt.GetWheelData();
+ if( pData && !pData->GetModifier() && ( pData->GetMode() == CommandWheelMode::SCROLL ) && !pData->IsHorz() )
+ {
+ ::tools::Long nDelta = pData->GetDelta();
+ if( nDelta > 0 )
+ xSlideShowController->gotoPreviousSlide();
+ else if( nDelta < 0 )
+ xSlideShowController->gotoNextEffect();
+ }
+ break;
+ }
+ }
+ [[fallthrough]];
+ case CommandEventId::StartAutoScroll:
+ case CommandEventId::AutoScroll:
+ {
+ const CommandWheelData* pData = rCEvt.GetWheelData();
+
+ if (pData != nullptr)
+ {
+ if (pData->IsMod1())
+ {
+ if( !GetDocSh()->IsUIActive() )
+ {
+ const ::tools::Long nOldZoom = GetActiveWindow()->GetZoom();
+ ::tools::Long nNewZoom;
+ Point aOldMousePos = GetActiveWindow()->PixelToLogic(rCEvt.GetMousePosPixel());
+
+ if( pData->GetDelta() < 0 )
+ nNewZoom = std::max<::tools::Long>( pWin->GetMinZoom(), basegfx::zoomtools::zoomOut( nOldZoom ));
+ else
+ nNewZoom = std::min<::tools::Long>( pWin->GetMaxZoom(), basegfx::zoomtools::zoomIn( nOldZoom ));
+
+ SetZoom( nNewZoom );
+ // Keep mouse at same doc point before zoom
+ Point aNewMousePos = GetActiveWindow()->PixelToLogic(rCEvt.GetMousePosPixel());
+ SetWinViewPos(GetWinViewPos() - (aNewMousePos - aOldMousePos));
+
+ Invalidate( SID_ATTR_ZOOM );
+ Invalidate( SID_ATTR_ZOOMSLIDER );
+
+ bDone = true;
+ }
+ }
+ else
+ {
+ if( mpContentWindow.get() == pWin )
+ {
+ sal_uLong nScrollLines = pData->GetScrollLines();
+ if(IsPageFlipMode())
+ nScrollLines = COMMAND_WHEEL_PAGESCROLL;
+ CommandWheelData aWheelData( pData->GetDelta(),pData->GetNotchDelta(),
+ nScrollLines,pData->GetMode(),pData->GetModifier(),pData->IsHorz() );
+ CommandEvent aReWrite( rCEvt.GetMousePosPixel(),rCEvt.GetCommand(),
+ rCEvt.IsMouseEvent(),static_cast<const void *>(&aWheelData) );
+ bDone = pWin->HandleScrollCommand( aReWrite,
+ mpHorizontalScrollBar.get(),
+ mpVerticalScrollBar.get());
+ }
+ }
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return bDone;
+}
+
+void ViewShell::SetupRulers()
+{
+ if(!mbHasRulers || !mpContentWindow || SlideShow::IsRunning(GetViewShellBase()))
+ return;
+
+ ::tools::Long nHRulerOfs = 0;
+
+ if ( !mpVerticalRuler )
+ {
+ mpVerticalRuler.reset(CreateVRuler(GetActiveWindow()));
+ if ( mpVerticalRuler )
+ {
+ nHRulerOfs = mpVerticalRuler->GetSizePixel().Width();
+ mpVerticalRuler->SetActive();
+ mpVerticalRuler->Show();
+ }
+ }
+ if ( !mpHorizontalRuler )
+ {
+ mpHorizontalRuler.reset(CreateHRuler(GetActiveWindow()));
+ if ( mpHorizontalRuler )
+ {
+ mpHorizontalRuler->SetWinPos(nHRulerOfs);
+ mpHorizontalRuler->SetActive();
+ mpHorizontalRuler->Show();
+ }
+ }
+}
+
+const SvxNumBulletItem* ViewShell::GetNumBulletItem(SfxItemSet& aNewAttr, TypedWhichId<SvxNumBulletItem>& nNumItemId)
+{
+ const SvxNumBulletItem* pTmpItem = aNewAttr.GetItemIfSet(nNumItemId, false);
+ if(pTmpItem)
+ return pTmpItem;
+
+ nNumItemId = aNewAttr.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE);
+ pTmpItem = aNewAttr.GetItemIfSet(nNumItemId, false);
+ if(pTmpItem)
+ return pTmpItem;
+
+ bool bOutliner = false;
+ bool bTitle = false;
+
+ if( mpView )
+ {
+ const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
+ const size_t nCount = rMarkList.GetMarkCount();
+
+ for(size_t nNum = 0; nNum < nCount; ++nNum)
+ {
+ SdrObject* pObj = rMarkList.GetMark(nNum)->GetMarkedSdrObj();
+ if( pObj->GetObjInventor() == SdrInventor::Default )
+ {
+ switch(pObj->GetObjIdentifier())
+ {
+ case SdrObjKind::TitleText:
+ bTitle = true;
+ break;
+ case SdrObjKind::OutlineText:
+ bOutliner = true;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ const SvxNumBulletItem *pItem = nullptr;
+ if(bOutliner)
+ {
+ SfxStyleSheetBasePool* pSSPool = mpView->GetDocSh()->GetStyleSheetPool();
+ SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( STR_LAYOUT_OUTLINE + " 1", SfxStyleFamily::Pseudo);
+ if( pFirstStyleSheet )
+ pItem = pFirstStyleSheet->GetItemSet().GetItemIfSet(EE_PARA_NUMBULLET, false);
+ }
+
+ if( pItem == nullptr )
+ pItem = aNewAttr.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET);
+
+ aNewAttr.Put(pItem->CloneSetWhich(EE_PARA_NUMBULLET));
+
+ if(bTitle && aNewAttr.GetItemState(EE_PARA_NUMBULLET) == SfxItemState::SET )
+ {
+ const SvxNumBulletItem* pBulletItem = aNewAttr.GetItem(EE_PARA_NUMBULLET);
+ const SvxNumRule& rRule = pBulletItem->GetNumRule();
+ SvxNumRule aNewRule( rRule );
+ aNewRule.SetFeatureFlag( SvxNumRuleFlags::NO_NUMBERS );
+
+ SvxNumBulletItem aNewItem( std::move(aNewRule), EE_PARA_NUMBULLET );
+ aNewAttr.Put(aNewItem);
+ }
+
+ pTmpItem = aNewAttr.GetItemIfSet(nNumItemId, false);
+
+ return pTmpItem;
+}
+
+void ViewShell::Resize()
+{
+ SetupRulers ();
+
+ if (mpParentWindow == nullptr)
+ return;
+
+ // Make sure that the new size is not degenerate.
+ const Size aSize (mpParentWindow->GetSizePixel());
+ if (aSize.IsEmpty())
+ return;
+
+ // Remember the new position and size.
+ maViewPos = Point(0,0);
+ maViewSize = aSize;
+
+ // Rearrange the UI elements to take care of the new position and size.
+ ArrangeGUIElements ();
+ // end of included AdjustPosSizePixel.
+
+ ::sd::View* pView = GetView();
+
+ if (pView)
+ pView->VisAreaChanged(GetActiveWindow()->GetOutDev());
+}
+
+SvBorder ViewShell::GetBorder()
+{
+ SvBorder aBorder;
+
+ // Horizontal scrollbar.
+ if (mpHorizontalScrollBar
+ && mpHorizontalScrollBar->IsVisible())
+ {
+ aBorder.Bottom() = maScrBarWH.Height();
+ }
+
+ // Vertical scrollbar.
+ if (mpVerticalScrollBar
+ && mpVerticalScrollBar->IsVisible())
+ {
+ aBorder.Right() = maScrBarWH.Width();
+ }
+
+ // Place horizontal ruler below tab bar.
+ if (mbHasRulers && mpContentWindow)
+ {
+ SetupRulers();
+ if (mpHorizontalRuler)
+ aBorder.Top() = mpHorizontalRuler->GetSizePixel().Height();
+ if (mpVerticalRuler)
+ aBorder.Left() = mpVerticalRuler->GetSizePixel().Width();
+ }
+
+ return aBorder;
+}
+
+void ViewShell::ArrangeGUIElements()
+{
+ if (mpImpl->mbArrangeActive)
+ return;
+ if (maViewSize.IsEmpty())
+ return;
+ mpImpl->mbArrangeActive = true;
+
+ // Calculate border for in-place editing.
+ ::tools::Long nLeft = maViewPos.X();
+ ::tools::Long nTop = maViewPos.Y();
+ ::tools::Long nRight = maViewPos.X() + maViewSize.Width();
+ ::tools::Long nBottom = maViewPos.Y() + maViewSize.Height();
+
+ // Horizontal scrollbar.
+ if (mpHorizontalScrollBar
+ && mpHorizontalScrollBar->IsVisible())
+ {
+ nBottom -= maScrBarWH.Height();
+ if (mpLayerTabBar && mpLayerTabBar->IsVisible())
+ nBottom -= mpLayerTabBar->GetSizePixel().Height();
+ mpHorizontalScrollBar->SetPosSizePixel (
+ Point(nLeft, nBottom),
+ Size(nRight - nLeft - maScrBarWH.Width(), maScrBarWH.Height()));
+ }
+
+ // Vertical scrollbar.
+ if (mpVerticalScrollBar
+ && mpVerticalScrollBar->IsVisible())
+ {
+ nRight -= maScrBarWH.Width();
+ mpVerticalScrollBar->SetPosSizePixel (
+ Point(nRight,nTop),
+ Size (maScrBarWH.Width(), nBottom-nTop));
+ }
+
+ // Filler in the lower right corner.
+ if (mpScrollBarBox)
+ {
+ if (mpHorizontalScrollBar
+ && mpHorizontalScrollBar->IsVisible()
+ && mpVerticalScrollBar
+ && mpVerticalScrollBar->IsVisible())
+ {
+ mpScrollBarBox->Show();
+ mpScrollBarBox->SetPosSizePixel(Point(nRight, nBottom), maScrBarWH);
+ }
+ else
+ mpScrollBarBox->Hide();
+ }
+
+ // Place horizontal ruler below tab bar.
+ if (mbHasRulers && mpContentWindow)
+ {
+ if (mpHorizontalRuler)
+ {
+ Size aRulerSize = mpHorizontalRuler->GetSizePixel();
+ aRulerSize.setWidth( nRight - nLeft );
+ mpHorizontalRuler->SetPosSizePixel (
+ Point(nLeft,nTop), aRulerSize);
+ if (mpVerticalRuler)
+ mpHorizontalRuler->SetBorderPos(
+ mpVerticalRuler->GetSizePixel().Width()-1);
+ nTop += aRulerSize.Height();
+ }
+ if (mpVerticalRuler)
+ {
+ Size aRulerSize = mpVerticalRuler->GetSizePixel();
+ aRulerSize.setHeight( nBottom - nTop );
+ mpVerticalRuler->SetPosSizePixel (
+ Point (nLeft,nTop), aRulerSize);
+ nLeft += aRulerSize.Width();
+ }
+ }
+
+ rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( GetViewShellBase() ) );
+
+ // The size of the window of the center pane is set differently from
+ // that of the windows in the docking windows.
+ bool bSlideShowActive = (xSlideShow.is() && xSlideShow->isRunning()) && !xSlideShow->isFullScreen() && xSlideShow->getAnimationMode() == ANIMATIONMODE_SHOW;
+ if ( !bSlideShowActive)
+ {
+ OSL_ASSERT (GetViewShell()!=nullptr);
+
+ if (mpContentWindow)
+ mpContentWindow->SetPosSizePixel(
+ Point(nLeft,nTop),
+ Size(nRight-nLeft,nBottom-nTop));
+ }
+
+ // Windows in the center and rulers at the left and top side.
+ maAllWindowRectangle = ::tools::Rectangle(
+ maViewPos,
+ Size(maViewSize.Width()-maScrBarWH.Width(),
+ maViewSize.Height()-maScrBarWH.Height()));
+
+ if (mpContentWindow)
+ mpContentWindow->UpdateMapOrigin();
+
+ UpdateScrollBars();
+
+ mpImpl->mbArrangeActive = false;
+}
+
+void ViewShell::SetUIUnit(FieldUnit eUnit)
+{
+ // Set unit at horizontal and vertical rulers.
+ if (mpHorizontalRuler)
+ mpHorizontalRuler->SetUnit(eUnit);
+
+ if (mpVerticalRuler)
+ mpVerticalRuler->SetUnit(eUnit);
+}
+
+/**
+ * set DefTab at horizontal rulers
+ */
+void ViewShell::SetDefTabHRuler( sal_uInt16 nDefTab )
+{
+ if (mpHorizontalRuler)
+ mpHorizontalRuler->SetDefTabDist( nDefTab );
+}
+
+/** Tell the FmFormShell that the view shell is closing. Give it the
+ opportunity to prevent that.
+*/
+bool ViewShell::PrepareClose (bool bUI)
+{
+ bool bResult = true;
+
+ FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell();
+ if (pFormShell != nullptr)
+ bResult = pFormShell->PrepareClose (bUI);
+
+ return bResult;
+}
+
+void ViewShell::UpdatePreview (SdPage*)
+{
+ // Do nothing. After the actual preview has been removed,
+ // OutlineViewShell::UpdatePreview() is the place where something
+ // useful is still done.
+}
+
+SfxUndoManager* ViewShell::ImpGetUndoManager() const
+{
+ const ViewShell* pMainViewShell = GetViewShellBase().GetMainViewShell().get();
+
+ if( pMainViewShell == nullptr )
+ pMainViewShell = this;
+
+ ::sd::View* pView = pMainViewShell->GetView();
+
+ // check for text edit our outline view
+ if( pView )
+ {
+ if( pMainViewShell->GetShellType() == ViewShell::ST_OUTLINE )
+ {
+ OutlineView* pOlView = dynamic_cast< OutlineView* >( pView );
+ if( pOlView )
+ {
+ ::Outliner& rOutl = pOlView->GetOutliner();
+ return &rOutl.GetUndoManager();
+ }
+ }
+ else if( pView->IsTextEdit() )
+ {
+ SdrOutliner* pOL = pView->GetTextEditOutliner();
+ if( pOL )
+ return &pOL->GetUndoManager();
+ }
+ }
+
+ if( GetDocSh() )
+ return GetDocSh()->GetUndoManager();
+
+ return nullptr;
+}
+
+void ViewShell::ImpGetUndoStrings(SfxItemSet &rSet) const
+{
+ SfxUndoManager* pUndoManager = ImpGetUndoManager();
+ if(!pUndoManager)
+ return;
+
+ sal_uInt16 nCount(pUndoManager->GetUndoActionCount());
+ if(nCount)
+ {
+ // prepare list
+ std::vector<OUString> aStringList;
+ aStringList.reserve(nCount);
+ for (sal_uInt16 a = 0; a < nCount; ++a)
+ {
+ // generate one String in list per undo step
+ aStringList.push_back( pUndoManager->GetUndoActionComment(a) );
+ }
+
+ // set item
+ rSet.Put(SfxStringListItem(SID_GETUNDOSTRINGS, &aStringList));
+ }
+ else
+ {
+ rSet.DisableItem(SID_GETUNDOSTRINGS);
+ }
+}
+
+void ViewShell::ImpGetRedoStrings(SfxItemSet &rSet) const
+{
+ SfxUndoManager* pUndoManager = ImpGetUndoManager();
+ if(!pUndoManager)
+ return;
+
+ sal_uInt16 nCount(pUndoManager->GetRedoActionCount());
+ if(nCount)
+ {
+ // prepare list
+ ::std::vector< OUString > aStringList;
+ aStringList.reserve(nCount);
+ for(sal_uInt16 a = 0; a < nCount; a++)
+ // generate one String in list per undo step
+ aStringList.push_back( pUndoManager->GetRedoActionComment(a) );
+
+ // set item
+ rSet.Put(SfxStringListItem(SID_GETREDOSTRINGS, &aStringList));
+ }
+ else
+ {
+ rSet.DisableItem(SID_GETREDOSTRINGS);
+ }
+}
+
+namespace {
+
+class KeepSlideSorterInSyncWithPageChanges
+{
+ sd::slidesorter::view::SlideSorterView::DrawLock m_aDrawLock;
+ sd::slidesorter::controller::SlideSorterController::ModelChangeLock m_aModelLock;
+ sd::slidesorter::controller::PageSelector::UpdateLock m_aUpdateLock;
+ sd::slidesorter::controller::SelectionObserver::Context m_aContext;
+
+public:
+ explicit KeepSlideSorterInSyncWithPageChanges(sd::slidesorter::SlideSorter const & rSlideSorter)
+ : m_aDrawLock(rSlideSorter)
+ , m_aModelLock(rSlideSorter.GetController())
+ , m_aUpdateLock(rSlideSorter)
+ , m_aContext(rSlideSorter)
+ {
+ }
+};
+
+}
+
+void ViewShell::ImpSidUndo(SfxRequest& rReq)
+{
+ //The xWatcher keeps the SlideSorter selection in sync
+ //with the page insertions/deletions that Undo may introduce
+ std::unique_ptr<KeepSlideSorterInSyncWithPageChanges, o3tl::default_delete<KeepSlideSorterInSyncWithPageChanges>> xWatcher;
+ slidesorter::SlideSorterViewShell* pSlideSorterViewShell
+ = slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase());
+ if (pSlideSorterViewShell)
+ xWatcher.reset(new KeepSlideSorterInSyncWithPageChanges(pSlideSorterViewShell->GetSlideSorter()));
+
+ SfxUndoManager* pUndoManager = ImpGetUndoManager();
+ sal_uInt16 nNumber(1);
+ const SfxItemSet* pReqArgs = rReq.GetArgs();
+ bool bRepair = false;
+
+ if(pReqArgs)
+ {
+ const SfxUInt16Item* pUIntItem = static_cast<const SfxUInt16Item*>(&pReqArgs->Get(SID_UNDO));
+ nNumber = pUIntItem->GetValue();
+
+ // Repair mode: allow undo/redo of all undo actions, even if access would
+ // be limited based on the view shell ID.
+ if (const SfxBoolItem* pRepairItem = pReqArgs->GetItemIfSet(SID_REPAIRPACKAGE, false))
+ bRepair = pRepairItem->GetValue();
+ }
+
+ if(nNumber && pUndoManager)
+ {
+ sal_uInt16 nCount(pUndoManager->GetUndoActionCount());
+ if(nCount >= nNumber)
+ {
+ if (comphelper::LibreOfficeKit::isActive() && !bRepair)
+ {
+ // If another view created the first undo action, prevent redoing it from this view.
+ const SfxUndoAction* pAction = pUndoManager->GetUndoAction();
+ if (pAction->GetViewShellId() != GetViewShellBase().GetViewShellId())
+ {
+ rReq.SetReturnValue(SfxUInt32Item(SID_UNDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE)));
+ return;
+ }
+ }
+
+ try
+ {
+ // when UndoStack is cleared by ModifyPageUndoAction
+ // the nCount may have changed, so test GetUndoActionCount()
+ while(nNumber-- && pUndoManager->GetUndoActionCount())
+ pUndoManager->Undo();
+ }
+ catch( const Exception& )
+ {
+ // no need to handle. By definition, the UndoManager handled this by clearing the
+ // Undo/Redo stacks
+ }
+ }
+
+ // refresh rulers, maybe UNDO was move of TAB marker in ruler
+ if (mbHasRulers)
+ Invalidate(SID_ATTR_TABSTOP);
+ }
+
+ // This one is corresponding to the default handling
+ // of SID_UNDO in sfx2
+ GetViewFrame()->GetBindings().InvalidateAll(false);
+
+ rReq.Done();
+}
+
+void ViewShell::ImpSidRedo(SfxRequest& rReq)
+{
+ //The xWatcher keeps the SlideSorter selection in sync
+ //with the page insertions/deletions that Undo may introduce
+ std::unique_ptr<KeepSlideSorterInSyncWithPageChanges, o3tl::default_delete<KeepSlideSorterInSyncWithPageChanges>> xWatcher;
+ slidesorter::SlideSorterViewShell* pSlideSorterViewShell
+ = slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase());
+ if (pSlideSorterViewShell)
+ xWatcher.reset(new KeepSlideSorterInSyncWithPageChanges(pSlideSorterViewShell->GetSlideSorter()));
+
+ SfxUndoManager* pUndoManager = ImpGetUndoManager();
+ sal_uInt16 nNumber(1);
+ const SfxItemSet* pReqArgs = rReq.GetArgs();
+ bool bRepair = false;
+
+ if(pReqArgs)
+ {
+ const SfxUInt16Item* pUIntItem = static_cast<const SfxUInt16Item*>(&pReqArgs->Get(SID_REDO));
+ nNumber = pUIntItem->GetValue();
+ // Repair mode: allow undo/redo of all undo actions, even if access would
+ // be limited based on the view shell ID.
+ if (const SfxBoolItem* pRepairItem = pReqArgs->GetItemIfSet(SID_REPAIRPACKAGE, false))
+ bRepair = pRepairItem->GetValue();
+ }
+
+ if(nNumber && pUndoManager)
+ {
+ sal_uInt16 nCount(pUndoManager->GetRedoActionCount());
+ if(nCount >= nNumber)
+ {
+ if (comphelper::LibreOfficeKit::isActive() && !bRepair)
+ {
+ // If another view created the first undo action, prevent redoing it from this view.
+ const SfxUndoAction* pAction = pUndoManager->GetRedoAction();
+ if (pAction->GetViewShellId() != GetViewShellBase().GetViewShellId())
+ {
+ rReq.SetReturnValue(SfxUInt32Item(SID_REDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE)));
+ return;
+ }
+ }
+
+ try
+ {
+ // when UndoStack is cleared by ModifyPageRedoAction
+ // the nCount may have changed, so test GetRedoActionCount()
+ while(nNumber-- && pUndoManager->GetRedoActionCount())
+ pUndoManager->Redo();
+ }
+ catch( const Exception& )
+ {
+ // no need to handle. By definition, the UndoManager handled this by clearing the
+ // Undo/Redo stacks
+ }
+ }
+
+ // refresh rulers, maybe REDO was move of TAB marker in ruler
+ if (mbHasRulers)
+ {
+ Invalidate(SID_ATTR_TABSTOP);
+ }
+ }
+
+ // This one is corresponding to the default handling
+ // of SID_UNDO in sfx2
+ GetViewFrame()->GetBindings().InvalidateAll(false);
+
+ rReq.Done();
+}
+
+void ViewShell::ExecReq( SfxRequest& rReq )
+{
+ sal_uInt16 nSlot = rReq.GetSlot();
+ switch( nSlot )
+ {
+ case SID_MAIL_SCROLLBODY_PAGEDOWN:
+ {
+ rtl::Reference<FuPoor> xFunc( GetCurrentFunction() );
+ if( xFunc.is() )
+ ScrollLines( 0, -1 );
+
+ rReq.Done();
+ }
+ break;
+
+ case SID_OUTPUT_QUALITY_COLOR:
+ case SID_OUTPUT_QUALITY_GRAYSCALE:
+ case SID_OUTPUT_QUALITY_BLACKWHITE:
+ case SID_OUTPUT_QUALITY_CONTRAST:
+ {
+ DrawModeFlags nMode = OUTPUT_DRAWMODE_COLOR;
+
+ switch( nSlot )
+ {
+ case SID_OUTPUT_QUALITY_COLOR: nMode = OUTPUT_DRAWMODE_COLOR; break;
+ case SID_OUTPUT_QUALITY_GRAYSCALE: nMode = OUTPUT_DRAWMODE_GRAYSCALE; break;
+ case SID_OUTPUT_QUALITY_BLACKWHITE: nMode = OUTPUT_DRAWMODE_BLACKWHITE; break;
+ case SID_OUTPUT_QUALITY_CONTRAST: nMode = OUTPUT_DRAWMODE_CONTRAST; break;
+ }
+
+ GetActiveWindow()->GetOutDev()->SetDrawMode( nMode );
+ mpFrameView->SetDrawMode( nMode );
+
+ GetActiveWindow()->Invalidate();
+
+ Invalidate();
+ rReq.Done();
+ break;
+ }
+ }
+}
+
+/** This default implementation returns only an empty reference. See derived
+ classes for more interesting examples.
+*/
+css::uno::Reference<css::accessibility::XAccessible>
+ViewShell::CreateAccessibleDocumentView (::sd::Window* )
+{
+ OSL_FAIL("ViewShell::CreateAccessibleDocumentView should not be called!, perhaps Meyers, 3rd edition, Item 9:");
+
+ return css::uno::Reference<css::accessibility::XAccessible> ();
+}
+
+::sd::WindowUpdater* ViewShell::GetWindowUpdater() const
+{
+ return mpWindowUpdater.get();
+}
+
+ViewShellBase& ViewShell::GetViewShellBase() const
+{
+ return *static_cast<ViewShellBase*>(GetViewShell());
+}
+
+ViewShell::ShellType ViewShell::GetShellType() const
+{
+ return meShellType;
+}
+
+DrawDocShell* ViewShell::GetDocSh() const
+{
+ return GetViewShellBase().GetDocShell();
+}
+
+SdDrawDocument* ViewShell::GetDoc() const
+{
+ return GetViewShellBase().GetDocument();
+}
+
+ErrCode ViewShell::DoVerb(sal_Int32 /*nVerb*/)
+{
+ return ERRCODE_NONE;
+}
+
+void ViewShell::SetCurrentFunction( const rtl::Reference<FuPoor>& xFunction)
+{
+ if( mxCurrentFunction.is() && (mxOldFunction != mxCurrentFunction) )
+ mxCurrentFunction->Dispose();
+ rtl::Reference<FuPoor> xDisposeAfterNewOne( mxCurrentFunction );
+ mxCurrentFunction = xFunction;
+}
+
+void ViewShell::SetOldFunction(const rtl::Reference<FuPoor>& xFunction)
+{
+ if( mxOldFunction.is() && (xFunction != mxOldFunction) && (mxCurrentFunction != mxOldFunction) )
+ mxOldFunction->Dispose();
+
+ rtl::Reference<FuPoor> xDisposeAfterNewOne( mxOldFunction );
+ mxOldFunction = xFunction;
+}
+
+/** this method deactivates the current function. If an old function is
+ saved, this will become activated and current function.
+*/
+void ViewShell::Cancel()
+{
+ if(mxCurrentFunction.is() && (mxCurrentFunction != mxOldFunction ))
+ {
+ rtl::Reference<FuPoor> xTemp( mxCurrentFunction );
+ mxCurrentFunction.clear();
+ xTemp->Deactivate();
+ xTemp->Dispose();
+ }
+
+ if(mxOldFunction.is())
+ {
+ mxCurrentFunction = mxOldFunction;
+ mxCurrentFunction->Activate();
+ }
+}
+
+void ViewShell::DeactivateCurrentFunction( bool bPermanent /* == false */ )
+{
+ if( mxCurrentFunction.is() )
+ {
+ if(bPermanent && (mxOldFunction == mxCurrentFunction))
+ mxOldFunction.clear();
+
+ mxCurrentFunction->Deactivate();
+ if( mxCurrentFunction != mxOldFunction )
+ mxCurrentFunction->Dispose();
+
+ rtl::Reference<FuPoor> xDisposeAfterNewOne( mxCurrentFunction );
+ mxCurrentFunction.clear();
+ }
+}
+
+void ViewShell::DisposeFunctions()
+{
+ if(mxCurrentFunction.is())
+ {
+ rtl::Reference<FuPoor> xTemp( mxCurrentFunction );
+ mxCurrentFunction.clear();
+ xTemp->Deactivate();
+ xTemp->Dispose();
+ }
+
+ if(mxOldFunction.is())
+ {
+ rtl::Reference<FuPoor> xDisposeAfterNewOne( mxOldFunction );
+ mxOldFunction->Dispose();
+ mxOldFunction.clear();
+ }
+}
+
+bool ViewShell::IsMainViewShell() const
+{
+ return mpImpl->mbIsMainViewShell;
+}
+
+void ViewShell::SetIsMainViewShell (bool bIsMainViewShell)
+{
+ if (bIsMainViewShell != mpImpl->mbIsMainViewShell)
+ {
+ mpImpl->mbIsMainViewShell = bIsMainViewShell;
+ if (bIsMainViewShell)
+ GetDocSh()->Connect (this);
+ else
+ GetDocSh()->Disconnect (this);
+ }
+}
+
+void ViewShell::PrePaint()
+{
+}
+
+void ViewShell::Paint (const ::tools::Rectangle&, ::sd::Window* )
+{
+}
+
+void ViewShell::ShowUIControls (bool bVisible)
+{
+ if (mbHasRulers)
+ {
+ if (mpHorizontalRuler)
+ mpHorizontalRuler->Show( bVisible );
+
+ if (mpVerticalRuler)
+ mpVerticalRuler->Show( bVisible );
+ }
+
+ if (mpVerticalScrollBar)
+ mpVerticalScrollBar->Show( bVisible );
+
+ if (mpHorizontalScrollBar)
+ mpHorizontalScrollBar->Show( bVisible );
+
+ if (mpScrollBarBox)
+ mpScrollBarBox->Show(bVisible);
+
+ if (mpContentWindow)
+ mpContentWindow->Show( bVisible );
+}
+
+bool ViewShell::RelocateToParentWindow (vcl::Window* pParentWindow)
+{
+ mpParentWindow = pParentWindow;
+
+ mpParentWindow->SetBackground (Wallpaper());
+
+ if (mpContentWindow)
+ mpContentWindow->SetParent(pParentWindow);
+
+ if (mpHorizontalScrollBar)
+ mpHorizontalScrollBar->SetParent(mpParentWindow);
+ if (mpVerticalScrollBar)
+ mpVerticalScrollBar->SetParent(mpParentWindow);
+ if (mpScrollBarBox)
+ mpScrollBarBox->SetParent(mpParentWindow);
+
+ return true;
+}
+
+void ViewShell::SwitchViewFireFocus(const css::uno::Reference< css::accessibility::XAccessible >& xAcc )
+{
+ if (xAcc)
+ {
+ ::accessibility::AccessibleDocumentViewBase* pBase = static_cast< ::accessibility::AccessibleDocumentViewBase* >(xAcc.get());
+ if (pBase)
+ pBase->SwitchViewActivated();
+ }
+}
+void ViewShell::SwitchActiveViewFireFocus()
+{
+ if (mpContentWindow)
+ {
+ SwitchViewFireFocus(mpContentWindow->GetAccessible(false));
+ }
+}
+// move these two methods from DrawViewShell.
+void ViewShell::fireSwitchCurrentPage(sal_Int32 pageIndex)
+{
+ GetViewShellBase().GetDrawController().fireSwitchCurrentPage(pageIndex);
+}
+void ViewShell::NotifyAccUpdate( )
+{
+ GetViewShellBase().GetDrawController().NotifyAccUpdate();
+}
+
+weld::Window* ViewShell::GetFrameWeld() const
+{
+ return mpActiveWindow ? mpActiveWindow->GetFrameWeld() : nullptr;
+}
+
+sd::Window* ViewShell::GetContentWindow() const
+{
+ return mpContentWindow.get();
+}
+
+} // end of namespace sd
+
+//===== ViewShellObjectBarFactory =============================================
+
+namespace {
+
+ViewShellObjectBarFactory::ViewShellObjectBarFactory (
+ ::sd::ViewShell& rViewShell)
+ : mrViewShell (rViewShell)
+{
+}
+
+SfxShell* ViewShellObjectBarFactory::CreateShell( ::sd::ShellId nId )
+{
+ SfxShell* pShell = nullptr;
+
+ ::sd::View* pView = mrViewShell.GetView();
+ switch (nId)
+ {
+ case ToolbarId::Bezier_Toolbox_Sd:
+ pShell = new ::sd::BezierObjectBar(&mrViewShell, pView);
+ break;
+
+ case ToolbarId::Draw_Text_Toolbox_Sd:
+ pShell = new ::sd::TextObjectBar(
+ &mrViewShell, mrViewShell.GetDoc()->GetPool(), pView);
+ break;
+
+ case ToolbarId::Draw_Graf_Toolbox:
+ pShell = new ::sd::GraphicObjectBar(&mrViewShell, pView);
+ break;
+
+ case ToolbarId::Draw_Media_Toolbox:
+ pShell = new ::sd::MediaObjectBar(&mrViewShell, pView);
+ break;
+
+ case ToolbarId::Draw_Table_Toolbox:
+ pShell = ::sd::ui::table::CreateTableObjectBar( mrViewShell, pView );
+ break;
+
+ case ToolbarId::Svx_Extrusion_Bar:
+ pShell = new svx::ExtrusionBar(
+ &mrViewShell.GetViewShellBase());
+ break;
+
+ case ToolbarId::Svx_Fontwork_Bar:
+ pShell = new svx::FontworkBar(
+ &mrViewShell.GetViewShellBase());
+ break;
+
+ default:
+ pShell = nullptr;
+ break;
+ }
+
+ return pShell;
+}
+
+void ViewShellObjectBarFactory::ReleaseShell (SfxShell* pShell)
+{
+ delete pShell;
+}
+
+} // end of anonymous namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/view/zoomlist.cxx b/sd/source/ui/view/zoomlist.cxx
new file mode 100644
index 000000000..86a3de63b
--- /dev/null
+++ b/sd/source/ui/view/zoomlist.cxx
@@ -0,0 +1,94 @@
+/* -*- 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 <zoomlist.hxx>
+
+#include <svx/svxids.hrc>
+#include <sfx2/bindings.hxx>
+#include <sfx2/viewfrm.hxx>
+
+#include <ViewShell.hxx>
+
+namespace sd
+{
+#define MAX_ENTRIES 10
+
+ZoomList::ZoomList(ViewShell* pViewShell)
+ : mpViewShell(pViewShell)
+ , mnCurPos(0)
+{
+}
+
+void ZoomList::InsertZoomRect(const ::tools::Rectangle& rRect)
+{
+ size_t nRectCount = maRectangles.size();
+
+ if (nRectCount >= MAX_ENTRIES)
+ maRectangles.erase(maRectangles.begin());
+ else if (nRectCount == 0)
+ mnCurPos = 0;
+ else
+ mnCurPos++;
+
+ maRectangles.insert(maRectangles.begin() + mnCurPos, rRect);
+
+ SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings();
+ rBindings.Invalidate(SID_ZOOM_NEXT);
+ rBindings.Invalidate(SID_ZOOM_PREV);
+}
+
+::tools::Rectangle const& ZoomList::GetNextZoomRect()
+{
+ mnCurPos++;
+ size_t nRectCount = maRectangles.size();
+
+ if (nRectCount > 0 && mnCurPos > nRectCount - 1)
+ mnCurPos = nRectCount - 1;
+
+ SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings();
+ rBindings.Invalidate(SID_ZOOM_NEXT);
+ rBindings.Invalidate(SID_ZOOM_PREV);
+
+ return maRectangles[mnCurPos];
+}
+
+::tools::Rectangle const& ZoomList::GetPreviousZoomRect()
+{
+ if (mnCurPos > 0)
+ mnCurPos--;
+
+ SfxBindings& rBindings = mpViewShell->GetViewFrame()->GetBindings();
+ rBindings.Invalidate(SID_ZOOM_NEXT);
+ rBindings.Invalidate(SID_ZOOM_PREV);
+
+ return maRectangles[mnCurPos];
+}
+
+bool ZoomList::IsNextPossible() const
+{
+ size_t nRectCount = maRectangles.size();
+
+ return nRectCount > 0 && mnCurPos < nRectCount - 1;
+}
+
+bool ZoomList::IsPreviousPossible() const { return mnCurPos > 0; }
+
+} // end of namespace sd
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/uiconfig/sdraw/menubar/menubar.xml b/sd/uiconfig/sdraw/menubar/menubar.xml
new file mode 100644
index 000000000..9c5a997bc
--- /dev/null
+++ b/sd/uiconfig/sdraw/menubar/menubar.xml
@@ -0,0 +1,661 @@
+<?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 .
+-->
+<menu:menubar xmlns:menu="http://openoffice.org/2001/menu" menu:id="menubar">
+ <menu:menu menu:id=".uno:PickList">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:AddDirect"/>
+ <menu:menuitem menu:id=".uno:Open"/>
+ <menu:menuitem menu:id=".uno:OpenRemote" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:RecentFileList"/>
+ <menu:menuitem menu:id=".uno:CloseDoc"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AutoPilotMenu" menu:style="text"/>
+ <menu:menu menu:id=".uno:TemplateMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:OpenTemplate" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:SaveAsTemplate" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NewDoc" menu:style="text"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Reload" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:VersionDialog" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Save"/>
+ <menu:menuitem menu:id=".uno:SaveAs"/>
+ <menu:menuitem menu:id=".uno:SaveAsRemote" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:SaveACopy" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:SaveAll" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CheckOut" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:CancelCheckOut" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:CheckIn" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ExportTo"/>
+ <menu:menu menu:id=".uno:ExportAsMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ExportToPDF" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ExportDirectToPDF" menu:style="text"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:SendToMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SendMail" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:SendMailDocAsPDF" menu:style="text"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:WebHtml" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Print"/>
+ <menu:menuitem menu:id=".uno:PrinterSetup" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SetDocumentProperties"/>
+ <menu:menu menu:id=".uno:SignaturesMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Signature" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:SignPDF" menu:style="text"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Quit"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:EditMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Undo"/>
+ <menu:menuitem menu:id=".uno:Redo"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menu menu:id=".uno:PasteSpecialMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:PasteUnformatted"/>
+ <menu:menuitem menu:id=".uno:PasteSpecial"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CopyObjects"/>
+ <menu:menuitem menu:id=".uno:SelectAll"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id="vnd.sun.star.findbar:FocusToFindbar"/>
+ <menu:menuitem menu:id=".uno:SearchDialog" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuitem menu:id=".uno:GlueEditMode"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EditHyperlink" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ModifyField" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ManageLinks" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ObjectMenue" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EditDoc" menu:style="text"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ViewMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:PageMode" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:MasterPage" menu:style="radio"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToolbarModeUI"/>
+ <menu:menuitem menu:id=".uno:AvailableToolbars" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:StatusBarVisible" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:LeftPaneDraw" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ShowRuler"/>
+ <menu:menu menu:id=".uno:GridMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:GridVisible"/>
+ <menu:menuitem menu:id=".uno:GridFront"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:HelplinesMove"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:SnapLinesMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:HelplinesVisible"/>
+ <menu:menuitem menu:id=".uno:HelplinesFront"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GridUse"/>
+ <menu:menuitem menu:id=".uno:HelplinesUse"/>
+ <menu:menuitem menu:id=".uno:SnapFrame"/>
+ <menu:menuitem menu:id=".uno:SnapPoints"/>
+ <menu:menuitem menu:id=".uno:SnapBorder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ShowAnnotations"/>
+ <menu:menu menu:id=".uno:DisplayQualityMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:OutputQualityColor" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:OutputQualityGrayscale" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:OutputQualityBlackWhite" menu:style="radio"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Sidebar"/>
+ <menu:menuitem menu:id=".uno:ViewSidebarStyles"/>
+ <menu:menuitem menu:id=".uno:Gallery"/>
+ <menu:menuitem menu:id=".uno:Navigator"/>
+ <menu:menuitem menu:id=".uno:ColorControl"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ZoomPanning"/>
+ <menu:menu menu:id=".uno:ZoomMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ZoomPage"/>
+ <menu:menuitem menu:id=".uno:ZoomPageWidth"/>
+ <menu:menuitem menu:id=".uno:ZoomOptimal"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Zoom50Percent"/>
+ <menu:menuitem menu:id=".uno:Zoom75Percent"/>
+ <menu:menuitem menu:id=".uno:Zoom100Percent"/>
+ <menu:menuitem menu:id=".uno:Zoom150Percent"/>
+ <menu:menuitem menu:id=".uno:Zoom200Percent"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ZoomMode"/>
+ <menu:menuitem menu:id=".uno:ZoomPrevious"/>
+ <menu:menuitem menu:id=".uno:ZoomNext"/>
+ <menu:menuitem menu:id=".uno:ZoomObjects"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Zoom"/>
+ </menu:menupopup>
+ </menu:menu>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:InsertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:InsertGraphic"/>
+ <menu:menuitem menu:id=".uno:InsertObjectChart"/>
+ <menu:menuitem menu:id=".uno:InsertTable"/>
+ <menu:menu menu:id=".uno:GraphicMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Gallery"/>
+ <menu:menu menu:id=".uno:Scan">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:TwainSelect"/>
+ <menu:menuitem menu:id=".uno:TwainTransfer"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:InsertAVMedia"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ObjectMenu" menu:style="text">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:InsertMath"/>
+ <menu:menuitem menu:id=".uno:InsertQrCode"/>
+ <menu:menuitem menu:id=".uno:InsertObject"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CapturePoint"/>
+ <menu:menuitem menu:id=".uno:InsertLayer"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Text"/>
+ <menu:menuitem menu:id=".uno:InsertAnnotation"/>
+ <menu:menuitem menu:id=".uno:InsertObjectFloatingFrame" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:FontworkGalleryFloater"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:HyperlinkDialog"/>
+ <menu:menuitem menu:id=".uno:InsertSymbol" menu:style="text"/>
+ <menu:menu menu:id=".uno:FormattingMarkMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:InsertNonBreakingSpace"/>
+ <menu:menuitem menu:id=".uno:InsertHardHyphen"/>
+ <menu:menuitem menu:id=".uno:InsertSoftHyphen"/>
+ <menu:menuitem menu:id=".uno:InsertNarrowNobreakSpace"/>
+ <menu:menuitem menu:id=".uno:InsertZWSP"/>
+ <menu:menuitem menu:id=".uno:InsertWJ"/>
+ <menu:menuitem menu:id=".uno:InsertLRM"/>
+ <menu:menuitem menu:id=".uno:InsertRLM"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertPageField"/>
+ <menu:menu menu:id=".uno:FieldMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:InsertDateFieldFix"/>
+ <menu:menuitem menu:id=".uno:InsertDateFieldVar"/>
+ <menu:menuitem menu:id=".uno:InsertTimeFieldFix"/>
+ <menu:menuitem menu:id=".uno:InsertTimeFieldVar"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertAuthorField"/>
+ <menu:menuitem menu:id=".uno:InsertPageField"/>
+ <menu:menuitem menu:id=".uno:InsertPageTitleField"/>
+ <menu:menuitem menu:id=".uno:InsertPagesField"/>
+ <menu:menuitem menu:id=".uno:InsertFileField"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:InsertFormMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Label"/>
+ <menu:menuitem menu:id=".uno:Edit"/>
+ <menu:menuitem menu:id=".uno:CheckBox"/>
+ <menu:menuitem menu:id=".uno:RadioButton"/>
+ <menu:menuitem menu:id=".uno:ListBox"/>
+ <menu:menuitem menu:id=".uno:ComboBox"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Pushbutton"/>
+ <menu:menuitem menu:id=".uno:Imagebutton"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FormattedField"/>
+ <menu:menuitem menu:id=".uno:DateField"/>
+ <menu:menuitem menu:id=".uno:TimeField"/>
+ <menu:menuitem menu:id=".uno:NumericField"/>
+ <menu:menuitem menu:id=".uno:CurrencyField"/>
+ <menu:menuitem menu:id=".uno:PatternField"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GroupBox"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ImageControl"/>
+ <menu:menuitem menu:id=".uno:FileControl"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Grid"/>
+ <menu:menuitem menu:id=".uno:NavigationBar"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:InsertSignatureLine" menu:style="text"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:FormatMenu">
+ <menu:menupopup>
+ <menu:menu menu:id=".uno:FormatTextMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Bold"/>
+ <menu:menuitem menu:id=".uno:Italic"/>
+ <menu:menuitem menu:id=".uno:UnderlineSingle"/>
+ <menu:menuitem menu:id=".uno:UnderlineDouble"/>
+ <menu:menuitem menu:id=".uno:Strikeout"/>
+ <menu:menuitem menu:id=".uno:Overline"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SuperScript"/>
+ <menu:menuitem menu:id=".uno:SubScript"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Shadowed"/>
+ <menu:menuitem menu:id=".uno:OutlineFont"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Grow"/>
+ <menu:menuitem menu:id=".uno:Shrink"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToUpper"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToLower"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseRotateCase"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToSentenceCase"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToTitleCase"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToToggleCase"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SmallCaps"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToHalfWidth"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToFullWidth"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToHiragana"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToKatakana"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:FormatSpacingMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SpacePara1"/>
+ <menu:menuitem menu:id=".uno:SpacePara15"/>
+ <menu:menuitem menu:id=".uno:SpacePara2"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ParaspaceIncrease"/>
+ <menu:menuitem menu:id=".uno:ParaspaceDecrease"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:IncrementIndent"/>
+ <menu:menuitem menu:id=".uno:DecrementIndent"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:TextAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:LeftPara" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:CenterPara" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:RightPara" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:JustifyPara" menu:style="radio"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CellVertTop" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:CellVertCenter" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:CellVertBottom" menu:style="radio"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:FormatBulletsMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:DefaultBullet"/>
+ <menu:menuitem menu:id=".uno:DefaultNumbering"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OutlineRight"/>
+ <menu:menuitem menu:id=".uno:OutlineLeft"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OutlineDown"/>
+ <menu:menuitem menu:id=".uno:OutlineUp"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SetDefault" menu:style="text"/>
+ <menu:menu menu:id=".uno:FormatStylesMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+ <menu:menuitem menu:id=".uno:StyleUpdateByExample"/>
+ <menu:menuitem menu:id=".uno:StyleNewByExample"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:DesignerDialog"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FontDialog"/>
+ <menu:menuitem menu:id=".uno:ParagraphDialog"/>
+ <menu:menuitem menu:id=".uno:OutlineBullet"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ModifyLayer"/>
+ <menu:menu menu:id=".uno:TableMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SetMinimalRowHeight"/>
+ <menu:menuitem menu:id=".uno:SetOptimalRowHeight"/>
+ <menu:menuitem menu:id=".uno:DistributeRows"/>
+ <menu:menuitem menu:id=".uno:EntireRow"/>
+ <menu:menuitem menu:id=".uno:InsertRowDialog"/>
+ <menu:menuitem menu:id=".uno:DeleteRows"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SetMinimalColumnWidth"/>
+ <menu:menuitem menu:id=".uno:SetOptimalColumnWidth"/>
+ <menu:menuitem menu:id=".uno:DistributeColumns"/>
+ <menu:menuitem menu:id=".uno:EntireColumn"/>
+ <menu:menuitem menu:id=".uno:InsertColumnDialog"/>
+ <menu:menuitem menu:id=".uno:DeleteColumns"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:MergeCells"/>
+ <menu:menuitem menu:id=".uno:SplitCell"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:DeleteTable"/>
+ <menu:menuitem menu:id=".uno:SelectTable"/>
+ <menu:menuitem menu:id=".uno:TableDialog"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:FormatImageMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Crop"/>
+ <menu:menuitem menu:id=".uno:OriginalSize"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ExternalEdit"/>
+ <menu:menuitem menu:id=".uno:ChangePicture"/>
+ <menu:menuitem menu:id=".uno:CompressGraphic"/>
+ <menu:menuitem menu:id=".uno:SaveGraphic"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:FormatImageFilterMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:GraphicFilterSepia"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterSobel"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterInvert"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterMosaic"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterPopart"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterPoster"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterRelief"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterRemoveNoise"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterSharpen"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterSmooth"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterSolarize"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:ColorSettings"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GrafAttrCrop"/>
+ <menu:menuitem menu:id=".uno:GraphicSizeCheck"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:TextAttributes"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:ConnectorAttributes"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuitem menu:id=".uno:Window3D"/>
+ <menu:menuitem menu:id=".uno:FillShadow"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription" menu:style="text"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:PageMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:InsertPage"/>
+ <menu:menuitem menu:id=".uno:DuplicatePage"/>
+ <menu:menuitem menu:id=".uno:ImportFromFile" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:RenamePage" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:DeletePage" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SaveBackground"/>
+ <menu:menuitem menu:id=".uno:SelectBackground"/>
+ <menu:menuitem menu:id=".uno:PageSetup"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:DrawingLayout" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:InsertMasterPage"/>
+ <menu:menuitem menu:id=".uno:DeleteMasterPage"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:SlideMoveMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MovePageFirst"/>
+ <menu:menuitem menu:id=".uno:MovePageUp"/>
+ <menu:menuitem menu:id=".uno:MovePageDown"/>
+ <menu:menuitem menu:id=".uno:MovePageLast"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:NavigateMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:FirstPage"/>
+ <menu:menuitem menu:id=".uno:PreviousPage"/>
+ <menu:menuitem menu:id=".uno:NextPage"/>
+ <menu:menuitem menu:id=".uno:LastPage"/>
+ </menu:menupopup>
+ </menu:menu>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ShapeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Line"/>
+ <menu:menuitem menu:id=".uno:BasicShapes.rectangle"/>
+ <menu:menuitem menu:id=".uno:BasicShapes.ellipse"/>
+ <menu:menu menu:id=".uno:InsertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ArrowsToolbox"/>
+ <menu:menuitem menu:id=".uno:LineToolbox"/>
+ <menu:menuitem menu:id=".uno:ConnectorToolbox"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BasicShapes"/>
+ <menu:menuitem menu:id=".uno:SymbolShapes"/>
+ <menu:menuitem menu:id=".uno:ArrowShapes"/>
+ <menu:menuitem menu:id=".uno:FlowChartShapes"/>
+ <menu:menuitem menu:id=".uno:CalloutShapes"/>
+ <menu:menuitem menu:id=".uno:StarShapes"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Objects3DToolbox"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:DistributeSelection"/>
+ <menu:menuitem menu:id=".uno:ToggleObjectRotateMode"/>
+ <menu:menuitem menu:id=".uno:AdvancedMode"/>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:GroupMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:FormatGroup"/>
+ <menu:menuitem menu:id=".uno:FormatUngroup"/>
+ <menu:menuitem menu:id=".uno:EnterGroup"/>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Combine"/>
+ <menu:menuitem menu:id=".uno:Dismantle"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Merge"/>
+ <menu:menuitem menu:id=".uno:Substract"/>
+ <menu:menuitem menu:id=".uno:Intersect"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TextCombine"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CopyObjects"/>
+ <menu:menuitem menu:id=".uno:Morphing"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EqualizeWidth"/>
+ <menu:menuitem menu:id=".uno:EqualizeHeight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Connect"/>
+ <menu:menuitem menu:id=".uno:Break"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ToolsMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SpellDialog"/>
+ <menu:menuitem menu:id=".uno:SpellOnline"/>
+ <menu:menuitem menu:id=".uno:ThesaurusDialog" menu:style="text"/>
+ <menu:menu menu:id=".uno:LanguageMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SetLanguageAllTextMenu"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Hyphenation" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ChineseConversion"/>
+ <menu:menuitem menu:id=".uno:HangulHanjaConversion"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:MoreDictionaries"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AutoCorrectDlg"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ImageMapDialog" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:BmpMask"/>
+ <menu:menuitem menu:id=".uno:AVMediaPlayer"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ToolsFormsMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SwitchControlDesignMode"/>
+ <menu:menuitem menu:id=".uno:UseWizards"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ControlProperties"/>
+ <menu:menuitem menu:id=".uno:FormProperties"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ShowFmExplorer"/>
+ <menu:menuitem menu:id=".uno:TabDialog"/>
+ <menu:menuitem menu:id=".uno:AddField"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OpenReadOnly"/>
+ <menu:menuitem menu:id=".uno:AutoControlFocus"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MacrosMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MacroRecorder"/>
+ <menu:menuitem menu:id=".uno:RunMacro"/>
+ <menu:menuitem menu:id=".uno:BasicIDEAppear"/>
+ <menu:menuitem menu:id=".uno:ScriptOrganizer"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:MacroSignature"/>
+ <menu:menuitem menu:id=".uno:MacroOrganizer?TabId:short=1"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OpenXMLFilterSettings"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:RedactDoc">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Rect?FillTransparence:short=50&amp;FillColor:string=COL_GRAY7&amp;LineStyle:short=0&amp;IsSticky:bool=true&amp;ShapeName:string=RectangleRedactionShape"/>
+ <menu:menuitem menu:id=".uno:Freeline_Unfilled?Transparence:short=50&amp;Color:string=COL_GRAY7&amp;Width:short=500&amp;IsSticky:bool=true&amp;ShapeName:string=FreeformRedactionShape"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:RedactedExportWhite"/>
+ <menu:menuitem menu:id=".uno:RedactedExportBlack"/>
+ <menu:menuitem menu:id=".uno:RedactionPreviewExport"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:DevelopmentToolsDockingWindow"/>
+ <menu:menuitem menu:id="service:com.sun.star.deployment.ui.PackageManagerDialog" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ConfigureDialog" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:OptionsTreeDialog"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:WindowList">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:NewWindow"/>
+ <menu:menuitem menu:id=".uno:CloseWin"/>
+ <menu:menuseparator/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:HelpMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:HelpIndex"/>
+ <menu:menuitem menu:id=".uno:ExtendedHelp"/>
+ <menu:menuitem menu:id=".uno:Documentation"/>
+ <menu:menuitem menu:id=".uno:TipOfTheDay"/>
+ <menu:menuitem menu:id=".uno:CommandPopup"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:QuestionAnswers"/>
+ <menu:menuitem menu:id=".uno:SendFeedback"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SafeMode"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GetInvolved"/>
+ <menu:menuitem menu:id=".uno:Donation"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ShowLicense"/>
+ <menu:menuitem menu:id=".uno:About"/>
+ </menu:menupopup>
+ </menu:menu>
+</menu:menubar>
diff --git a/sd/uiconfig/sdraw/popupmenu/3dobject.xml b/sd/uiconfig/sdraw/popupmenu/3dobject.xml
new file mode 100644
index 000000000..6274cb111
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/3dobject.xml
@@ -0,0 +1,65 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Window3D"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/3dscene.xml b/sd/uiconfig/sdraw/popupmenu/3dscene.xml
new file mode 100644
index 000000000..7af0eb556
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/3dscene.xml
@@ -0,0 +1,57 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Window3D"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:EnterGroup"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/3dscene2.xml b/sd/uiconfig/sdraw/popupmenu/3dscene2.xml
new file mode 100644
index 000000000..71fbe2502
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/3dscene2.xml
@@ -0,0 +1,58 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EnterGroup"/>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Window3D"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/bezier.xml b/sd/uiconfig/sdraw/popupmenu/bezier.xml
new file mode 100644
index 000000000..413670232
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/bezier.xml
@@ -0,0 +1,26 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BezierMove"/>
+ <menu:menuitem menu:id=".uno:BezierInsert"/>
+ <menu:menuitem menu:id=".uno:BezierDelete"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BezierClose"/>
+ <menu:menuitem menu:id=".uno:BezierCutLine"/>
+ <menu:menuitem menu:id=".uno:BezierConvert"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BezierEdge"/>
+ <menu:menuitem menu:id=".uno:BezierSmooth"/>
+ <menu:menuitem menu:id=".uno:BezierSymmetric"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BezierEliminatePoints"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/connector.xml b/sd/uiconfig/sdraw/popupmenu/connector.xml
new file mode 100644
index 000000000..65109ae4d
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/connector.xml
@@ -0,0 +1,61 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NewRouting"/>
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:ConnectorAttributes"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Dismantle"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/curve.xml b/sd/uiconfig/sdraw/popupmenu/curve.xml
new file mode 100644
index 000000000..4861e8333
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/curve.xml
@@ -0,0 +1,72 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuitem menu:id=".uno:CloseObject"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FontDialog"/>
+ <menu:menuitem menu:id=".uno:ParagraphDialog"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Dismantle"/>
+ <menu:menuitem menu:id=".uno:Break"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/draw.xml b/sd/uiconfig/sdraw/popupmenu/draw.xml
new file mode 100644
index 000000000..d29bb5046
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/draw.xml
@@ -0,0 +1,70 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuitem menu:id=".uno:AdvancedMode"/>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Dismantle"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/drawtext.xml b/sd/uiconfig/sdraw/popupmenu/drawtext.xml
new file mode 100644
index 000000000..3cb30bc3f
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/drawtext.xml
@@ -0,0 +1,29 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuitem menu:id=".uno:PasteUnformatted"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TextAttributes"/>
+ <menu:menuitem menu:id=".uno:FontDialog"/>
+ <menu:menuitem menu:id=".uno:ParagraphDialog"/>
+ <menu:menuitem menu:id=".uno:OutlineBullet"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OpenHyperlinkOnCursor"/>
+ <menu:menuitem menu:id=".uno:EditHyperlink"/>
+ <menu:menuitem menu:id=".uno:CopyHyperlinkLocation"/>
+ <menu:menuitem menu:id=".uno:RemoveHyperlink"/>
+ <menu:menuitem menu:id=".uno:ThesaurusFromContext"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SetDefault"/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/form.xml b/sd/uiconfig/sdraw/popupmenu/form.xml
new file mode 100644
index 000000000..8952b64f7
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/form.xml
@@ -0,0 +1,52 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ControlProperties"/>
+ <menu:menuitem menu:id=".uno:FormProperties"/>
+ <menu:menuitem menu:id=".uno:ChangeControlType"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:FormatGroup"/>
+ <menu:menuitem menu:id=".uno:FormatUngroup"/>
+ <menu:menuitem menu:id=".uno:EnterGroup"/>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/formrichtext.xml b/sd/uiconfig/sdraw/popupmenu/formrichtext.xml
new file mode 100644
index 000000000..f5f8f7a0d
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/formrichtext.xml
@@ -0,0 +1,46 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CharFontName"/>
+ <menu:menuitem menu:id=".uno:FontHeight"/>
+ <menu:menu menu:id=".uno:StyleMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Bold"/>
+ <menu:menuitem menu:id=".uno:Italic"/>
+ <menu:menuitem menu:id=".uno:Overline"/>
+ <menu:menuitem menu:id=".uno:Underline"/>
+ <menu:menuitem menu:id=".uno:Strikeout"/>
+ <menu:menuitem menu:id=".uno:Shadowed"/>
+ <menu:menuitem menu:id=".uno:OutlineFont"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SuperScript"/>
+ <menu:menuitem menu:id=".uno:SubScript"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:TextAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:LeftPara" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:CenterPara" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:RightPara" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:JustifyPara" menu:style="radio"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:FormatSpacingMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SpacePara1"/>
+ <menu:menuitem menu:id=".uno:SpacePara15"/>
+ <menu:menuitem menu:id=".uno:SpacePara2"/>
+ </menu:menupopup>
+ </menu:menu>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/gluepoint.xml b/sd/uiconfig/sdraw/popupmenu/gluepoint.xml
new file mode 100644
index 000000000..c38a99349
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/gluepoint.xml
@@ -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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:GlueInsertPoint"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GlueEscapeDirectionLeft"/>
+ <menu:menuitem menu:id=".uno:GlueEscapeDirectionTop"/>
+ <menu:menuitem menu:id=".uno:GlueEscapeDirectionRight"/>
+ <menu:menuitem menu:id=".uno:GlueEscapeDirectionBottom"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GluePercent"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GlueHorzAlignLeft"/>
+ <menu:menuitem menu:id=".uno:GlueHorzAlignCenter"/>
+ <menu:menuitem menu:id=".uno:GlueHorzAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GlueVertAlignTop"/>
+ <menu:menuitem menu:id=".uno:GlueVertAlignCenter"/>
+ <menu:menuitem menu:id=".uno:GlueVertAlignBottom"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/graphic.xml b/sd/uiconfig/sdraw/popupmenu/graphic.xml
new file mode 100644
index 000000000..2ac8d1c54
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/graphic.xml
@@ -0,0 +1,79 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Crop"/>
+ <menu:menuitem menu:id=".uno:ExternalEdit"/>
+ <menu:menuitem menu:id=".uno:ChangePicture"/>
+ <menu:menuitem menu:id=".uno:CompressGraphic"/>
+ <menu:menuitem menu:id=".uno:SaveGraphic"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OriginalSize"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:RotateFlipMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ToggleObjectRotateMode"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:FormatGroup"/>
+ <menu:menuitem menu:id=".uno:FormatUngroup"/>
+ <menu:menuitem menu:id=".uno:EnterGroup"/>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Break"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EditQrCode"/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/group.xml b/sd/uiconfig/sdraw/popupmenu/group.xml
new file mode 100644
index 000000000..270add79b
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/group.xml
@@ -0,0 +1,66 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FormatUngroup"/>
+ <menu:menuitem menu:id=".uno:EnterGroup"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/layertab.xml b/sd/uiconfig/sdraw/popupmenu/layertab.xml
new file mode 100644
index 000000000..d15a040c0
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/layertab.xml
@@ -0,0 +1,15 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:InsertLayer"/>
+ <menu:menuitem menu:id=".uno:ModifyLayer"/>
+ <menu:menuitem menu:id=".uno:DeleteLayer"/>
+ <menu:menuitem menu:id=".uno:RenameLayer"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/line.xml b/sd/uiconfig/sdraw/popupmenu/line.xml
new file mode 100644
index 000000000..8501167f1
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/line.xml
@@ -0,0 +1,65 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Dismantle"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/measure.xml b/sd/uiconfig/sdraw/popupmenu/measure.xml
new file mode 100644
index 000000000..9764346fd
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/measure.xml
@@ -0,0 +1,72 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:TextAttributes"/>
+ <menu:menuitem menu:id=".uno:MeasureAttributes"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FontDialog"/>
+ <menu:menuitem menu:id=".uno:ParagraphDialog"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Dismantle"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/media.xml b/sd/uiconfig/sdraw/popupmenu/media.xml
new file mode 100644
index 000000000..b1e967e77
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/media.xml
@@ -0,0 +1,44 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/multiselect.xml b/sd/uiconfig/sdraw/popupmenu/multiselect.xml
new file mode 100644
index 000000000..b5a2e1b91
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/multiselect.xml
@@ -0,0 +1,86 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:DistributeSelection"/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:PolyFormen">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Combine"/>
+ <menu:menuitem menu:id=".uno:Dismantle"/>
+ <menu:menuitem menu:id=".uno:Connect"/>
+ <menu:menuitem menu:id=".uno:Break"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Merge"/>
+ <menu:menuitem menu:id=".uno:Substract"/>
+ <menu:menuitem menu:id=".uno:Intersect"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EqualizeWidth"/>
+ <menu:menuitem menu:id=".uno:EqualizeHeight"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:TextCombine"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FormatGroup"/>
+ <menu:menuitem menu:id=".uno:FormatUngroup"/>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ExportTo"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/notebookbar.xml b/sd/uiconfig/sdraw/popupmenu/notebookbar.xml
new file mode 100644
index 000000000..ae78bb4ce
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/notebookbar.xml
@@ -0,0 +1,24 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:AddDirect"/>
+ <menu:menuitem menu:id=".uno:RecentFileList"/>
+ <menu:menuitem menu:id=".uno:CloseDoc"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToolbarModeUI"/>
+ <menu:menuitem menu:id=".uno:AvailableToolbars"/>
+ <menu:menuitem menu:id=".uno:ConfigureDialog"/>
+ <menu:menuitem menu:id=".uno:OptionsTreeDialog"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:HelpIndex"/>
+ <menu:menuitem menu:id=".uno:Donation"/>
+ <menu:menuitem menu:id=".uno:About"/>
+ <menu:menuseparator/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/oleobject.xml b/sd/uiconfig/sdraw/popupmenu/oleobject.xml
new file mode 100644
index 000000000..0c871876b
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/oleobject.xml
@@ -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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OriginalSize"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:RotateFlipMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ToggleObjectRotateMode"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/page.xml b/sd/uiconfig/sdraw/popupmenu/page.xml
new file mode 100644
index 000000000..1da86394f
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/page.xml
@@ -0,0 +1,52 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ShowRuler"/>
+ <menu:menu menu:id=".uno:GridMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:GridVisible"/>
+ <menu:menuitem menu:id=".uno:GridUse"/>
+ <menu:menuitem menu:id=".uno:GridFront"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:HelplinesMove"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:SnapLinesMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:HelplinesVisible"/>
+ <menu:menuitem menu:id=".uno:HelplinesFront"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GridUse"/>
+ <menu:menuitem menu:id=".uno:HelplinesUse"/>
+ <menu:menuitem menu:id=".uno:SnapFrame"/>
+ <menu:menuitem menu:id=".uno:SnapPoints"/>
+ <menu:menuitem menu:id=".uno:SnapBorder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:CapturePoint"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:PageMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:InsertPage"/>
+ <menu:menuitem menu:id=".uno:DeletePage"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SelectBackground"/>
+ <menu:menuitem menu:id=".uno:SaveBackground"/>
+ <menu:menuitem menu:id=".uno:RenamePage"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:SaveBackground"/>
+ <menu:menuitem menu:id=".uno:PresentationLayout"/>
+ <menu:menuitem menu:id=".uno:PageSetup"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/pagepane.xml b/sd/uiconfig/sdraw/popupmenu/pagepane.xml
new file mode 100644
index 000000000..cb40a16b9
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/pagepane.xml
@@ -0,0 +1,18 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertPage"/>
+ <menu:menuitem menu:id=".uno:DeletePage"/>
+ <menu:menuitem menu:id=".uno:RenamePage"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/pagepanemaster.xml b/sd/uiconfig/sdraw/popupmenu/pagepanemaster.xml
new file mode 100644
index 000000000..bf160dfff
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/pagepanemaster.xml
@@ -0,0 +1,20 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertMasterPage"/>
+ <menu:menuitem menu:id=".uno:DeleteMasterPage"/>
+ <menu:menuitem menu:id=".uno:RenameMasterPage"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:PresentationLayout"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/pagepanenosel.xml b/sd/uiconfig/sdraw/popupmenu/pagepanenosel.xml
new file mode 100644
index 000000000..805710ac1
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/pagepanenosel.xml
@@ -0,0 +1,16 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertPage"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/pagepanenoselmaster.xml b/sd/uiconfig/sdraw/popupmenu/pagepanenoselmaster.xml
new file mode 100644
index 000000000..919e3c59c
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/pagepanenoselmaster.xml
@@ -0,0 +1,16 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertMasterPage"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/pagetab.xml b/sd/uiconfig/sdraw/popupmenu/pagetab.xml
new file mode 100644
index 000000000..cb40a16b9
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/pagetab.xml
@@ -0,0 +1,18 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertPage"/>
+ <menu:menuitem menu:id=".uno:DeletePage"/>
+ <menu:menuitem menu:id=".uno:RenamePage"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/table.xml b/sd/uiconfig/sdraw/popupmenu/table.xml
new file mode 100644
index 000000000..0f2381480
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/table.xml
@@ -0,0 +1,78 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:MergeCells"/>
+ <menu:menu menu:id=".uno:TableInsertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:InsertRowsBefore"/>
+ <menu:menuitem menu:id=".uno:InsertRowsAfter"/>
+ <menu:menuitem menu:id=".uno:InsertRowDialog"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertColumnsBefore"/>
+ <menu:menuitem menu:id=".uno:InsertColumnsAfter"/>
+ <menu:menuitem menu:id=".uno:InsertColumnDialog"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:TableDeleteMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:DeleteRows"/>
+ <menu:menuitem menu:id=".uno:DeleteColumns"/>
+ <menu:menuitem menu:id=".uno:DeleteTable"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:TableAutoFitMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SetRowHeight"/>
+ <menu:menuitem menu:id=".uno:SetMinimalRowHeight"/>
+ <menu:menuitem menu:id=".uno:SetOptimalRowHeight"/>
+ <menu:menuitem menu:id=".uno:DistributeRows"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SetColumnWidth"/>
+ <menu:menuitem menu:id=".uno:SetMinimalColumnWidth"/>
+ <menu:menuitem menu:id=".uno:SetOptimalColumnWidth"/>
+ <menu:menuitem menu:id=".uno:DistributeColumns"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FontDialog"/>
+ <menu:menuitem menu:id=".uno:ParagraphDialog"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TableDialog"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/popupmenu/textbox.xml b/sd/uiconfig/sdraw/popupmenu/textbox.xml
new file mode 100644
index 000000000..caaef6800
--- /dev/null
+++ b/sd/uiconfig/sdraw/popupmenu/textbox.xml
@@ -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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TextAutoFitToSize"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuitem menu:id=".uno:TextAttributes"/>
+ <menu:menuitem menu:id=".uno:FontWork"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FontDialog"/>
+ <menu:menuitem menu:id=".uno:ParagraphDialog"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SetDefault"/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/sdraw/statusbar/statusbar.xml b/sd/uiconfig/sdraw/statusbar/statusbar.xml
new file mode 100644
index 000000000..e89d1abc1
--- /dev/null
+++ b/sd/uiconfig/sdraw/statusbar/statusbar.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE statusbar:statusbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "statusbar.dtd">
+<!--
+ * 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 .
+-->
+<statusbar:statusbar xmlns:statusbar="http://openoffice.org/2001/statusbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <statusbar:statusbaritem xlink:href=".uno:PageStatus" statusbar:align="left" statusbar:width="124"/>
+ <statusbar:statusbaritem xlink:href=".uno:Context" statusbar:align="left" statusbar:autosize="true" statusbar:mandatory="false" statusbar:width="184"/>
+ <statusbar:statusbaritem xlink:href=".uno:LayoutStatus" statusbar:align="left" statusbar:autosize="true" statusbar:mandatory="false" statusbar:width="54"/>
+ <statusbar:statusbaritem xlink:href=".uno:Size" statusbar:align="center" statusbar:ownerdraw="true" statusbar:autosize="true" statusbar:width="200"/>
+ <statusbar:statusbaritem xlink:href=".uno:Scale" statusbar:align="left" statusbar:autosize="false" statusbar:width="30"/>
+ <statusbar:statusbaritem xlink:href=".uno:ModifiedStatus" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="9"/>
+ <statusbar:statusbaritem xlink:href=".uno:Signature" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="16"/>
+ <statusbar:statusbaritem xlink:href=".uno:ZoomPage" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="9"/>
+ <statusbar:statusbaritem xlink:href=".uno:ZoomSlider" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="130"/>
+ <statusbar:statusbaritem xlink:href=".uno:Zoom" statusbar:align="center" statusbar:width="36"/>
+</statusbar:statusbar>
diff --git a/sd/uiconfig/sdraw/toolbar/3dobjectsbar.xml b/sd/uiconfig/sdraw/toolbar/3dobjectsbar.xml
new file mode 100644
index 000000000..bc0b6f81e
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/3dobjectsbar.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:Cube"/>
+ <toolbar:toolbaritem xlink:href=".uno:Sphere"/>
+ <toolbar:toolbaritem xlink:href=".uno:Cylinder"/>
+ <toolbar:toolbaritem xlink:href=".uno:Cone"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Cyramid"/>
+ <toolbar:toolbaritem xlink:href=".uno:Torus"/>
+ <toolbar:toolbaritem xlink:href=".uno:Shell3D"/>
+ <toolbar:toolbaritem xlink:href=".uno:HalfSphere"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/alignmentbar.xml b/sd/uiconfig/sdraw/toolbar/alignmentbar.xml
new file mode 100644
index 000000000..38d0340a3
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/alignmentbar.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlignLeft"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlignRight"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignUp"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignMiddle"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignDown"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/arrowsbar.xml b/sd/uiconfig/sdraw/toolbar/arrowsbar.xml
new file mode 100644
index 000000000..4e947f2b3
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/arrowsbar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:LineArrowEnd"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineCircleArrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineSquareArrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineArrows"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:LineArrowStart"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineArrowCircle"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineArrowSquare"/>
+ <toolbar:toolbaritem xlink:href=".uno:Line"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:MeasureLine"/>
+ <toolbar:toolbaritem xlink:href=".uno:Line_Diagonal"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/arrowshapes.xml b/sd/uiconfig/sdraw/toolbar/arrowshapes.xml
new file mode 100644
index 000000000..3f74148c7
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/arrowshapes.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.right-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.down-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-right-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-down-arrow"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.circular-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.s-sharped-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.split-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.split-round-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.quad-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.corner-right-arrow"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.chevron"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.pentagon-right"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.striped-right-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-down-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.notched-right-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-arrow"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.right-arrow-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-arrow-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.down-arrow-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-arrow-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-right-arrow-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-down-arrow-callout"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.quad-arrow-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-arrow-callout"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/basicshapes.xml b/sd/uiconfig/sdraw/toolbar/basicshapes.xml
new file mode 100644
index 000000000..148245f66
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/basicshapes.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.rectangle"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.round-rectangle"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.quadrat"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.round-quadrat"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.parallelogram"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.trapezoid"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ellipse"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.circle"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.circle-pie"/>
+ <toolbar:toolbaritem xlink:href=".uno:CircleCut"/>
+ <toolbar:toolbaritem xlink:href=".uno:Arc"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.block-arc"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.isosceles-triangle"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.right-triangle"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.diamond"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.pentagon"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.hexagon"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.octagon"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.can"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.cube"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.paper"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.cross"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.frame"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ring"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/bezierobjectbar.xml b/sd/uiconfig/sdraw/toolbar/bezierobjectbar.xml
new file mode 100644
index 000000000..914738e7c
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/bezierobjectbar.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ToggleObjectBezierMode" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierMove"/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierInsert"/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierDelete"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierConvert"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierClose"/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierCutLine"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierEdge"/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierSmooth"/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierSymmetric"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierEliminatePoints"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/calloutshapes.xml b/sd/uiconfig/sdraw/toolbar/calloutshapes.xml
new file mode 100644
index 000000000..04176302c
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/calloutshapes.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.rectangular-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.round-rectangular-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.round-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.cloud-callout"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-1"/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-2"/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-3"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/choosemodebar.xml b/sd/uiconfig/sdraw/toolbar/choosemodebar.xml
new file mode 100644
index 000000000..c8bda0762
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/choosemodebar.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ToggleObjectRotateMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:Mirror"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConvertInto3DLathe"/>
+ <toolbar:toolbaritem xlink:href=".uno:CrookRotate"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:CrookSlant"/>
+ <toolbar:toolbaritem xlink:href=".uno:Shear"/>
+ <toolbar:toolbaritem xlink:href=".uno:InteractiveTransparence"/>
+ <toolbar:toolbaritem xlink:href=".uno:InteractiveGradient"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/colorbar.xml b/sd/uiconfig/sdraw/toolbar/colorbar.xml
new file mode 100644
index 000000000..879b6a647
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/colorbar.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:GrafRed"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafGreen"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafBlue"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafLuminance"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafContrast"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafGamma"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/commentsbar.xml b/sd/uiconfig/sdraw/toolbar/commentsbar.xml
new file mode 100644
index 000000000..a2f6a6eac
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/commentsbar.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:InsertAnnotation"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:PreviousAnnotation"/>
+ <toolbar:toolbaritem xlink:href=".uno:NextAnnotation"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteAnnotation"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteAllAnnotation"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/connectorsbar.xml b/sd/uiconfig/sdraw/toolbar/connectorsbar.xml
new file mode 100644
index 000000000..8355775e2
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/connectorsbar.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorArrowEnd"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLineArrowEnd"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveArrowEnd"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesArrowEnd"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Connector"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLine"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurve"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLines"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorArrows"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLineArrows"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveArrows"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesArrows"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorArrowStart" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLineArrowStart" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveArrowStart" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesArrowStart" toolbar:visible="false"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCircleEnd" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLineCircleEnd" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveCircleEnd" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesCircleEnd" toolbar:visible="false"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCircleStart" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLineCircleStart" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveCircleStart" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesCircleStart" toolbar:visible="false"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCircles" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLineCircles" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveCircles" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesCircles" toolbar:visible="false"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/distributebar.xml b/sd/uiconfig/sdraw/toolbar/distributebar.xml
new file mode 100644
index 000000000..308104262
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/distributebar.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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/.
+ *
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:DistributeHorzLeft"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeHorzCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeHorzDistance"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeHorzRight"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeVertTop"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeVertCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeVertDistance"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeVertBottom"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/drawingobjectbar.xml b/sd/uiconfig/sdraw/toolbar/drawingobjectbar.xml
new file mode 100644
index 000000000..5dfd2a438
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/drawingobjectbar.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:TransformDialog"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlignLeft" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignCenter" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlignRight" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignUp" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignMiddle" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignDown" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectPosition" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BringToFront"/>
+ <toolbar:toolbaritem xlink:href=".uno:Forward"/>
+ <toolbar:toolbaritem xlink:href=".uno:Backward"/>
+ <toolbar:toolbaritem xlink:href=".uno:SendToBack"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BeforeObject"/>
+ <toolbar:toolbaritem xlink:href=".uno:BehindObject"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ReverseOrder"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:XLineStyle"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineWidth"/>
+ <toolbar:toolbaritem xlink:href=".uno:XLineColor"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FillStyle"/>
+ <toolbar:toolbaritem xlink:href=".uno:FillColor" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FillShadow"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:LineEndStyle"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:MirrorVert"/>
+ <toolbar:toolbaritem xlink:href=".uno:MirrorHorz"/>
+ <toolbar:toolbaritem xlink:href=".uno:AdvancedMode"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatLine" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatArea" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Window3D" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ImageMapDialog" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:DesignerDialog"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GridVisible"/>
+ <toolbar:toolbaritem xlink:href=".uno:GridUse"/>
+ <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/>
+</toolbar:toolbar>
+
diff --git a/sd/uiconfig/sdraw/toolbar/ellipsesbar.xml b/sd/uiconfig/sdraw/toolbar/ellipsesbar.xml
new file mode 100644
index 000000000..35167b9c7
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/ellipsesbar.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:Ellipse"/>
+ <toolbar:toolbaritem xlink:href=".uno:Circle"/>
+ <toolbar:toolbaritem xlink:href=".uno:Pie"/>
+ <toolbar:toolbaritem xlink:href=".uno:CirclePie"/>
+ <toolbar:toolbaritem xlink:href=".uno:EllipseCut"/>
+ <toolbar:toolbaritem xlink:href=".uno:CircleCut"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Ellipse_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Circle_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Pie_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:CirclePie_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:EllipseCut_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:CircleCut_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Arc"/>
+ <toolbar:toolbaritem xlink:href=".uno:CircleArc"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/extrusionobjectbar.xml b/sd/uiconfig/sdraw/toolbar/extrusionobjectbar.xml
new file mode 100644
index 000000000..5f5ff2916
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/extrusionobjectbar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltDown"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltUp"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltLeft"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltRight"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionDepthFloater"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionDirectionFloater"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionLightingFloater"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionSurfaceFloater"/>
+ <toolbar:toolbaritem xlink:href=".uno:Extrusion3DColor"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/findbar.xml b/sd/uiconfig/sdraw/toolbar/findbar.xml
new file mode 100644
index 000000000..7c71a1ac2
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/findbar.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ExitSearch"/>
+ <toolbar:toolbaritem xlink:href=".uno:FindText"/>
+ <toolbar:toolbaritem xlink:href=".uno:UpSearch"/>
+ <toolbar:toolbaritem xlink:href=".uno:DownSearch"/>
+ <toolbar:toolbaritem xlink:href=".uno:FindAll"/>
+ <toolbar:toolbaritem xlink:href=".uno:MatchCase"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SearchLabel"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/flowchartshapes.xml b/sd/uiconfig/sdraw/toolbar/flowchartshapes.xml
new file mode 100644
index 000000000..c1f676895
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/flowchartshapes.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-process"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-alternate-process"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-decision"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-data"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-predefined-process"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-internal-storage"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-document"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-multidocument"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-terminator"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-preparation"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-manual-input"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-manual-operation"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-connector"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-off-page-connector"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-card"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-punched-tape"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-summing-junction"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-or"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-collate"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-sort"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-extract"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-merge"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-stored-data"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-delay"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-sequential-access"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-magnetic-disk"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-direct-access-storage"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-display"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/fontworkobjectbar.xml b/sd/uiconfig/sdraw/toolbar/fontworkobjectbar.xml
new file mode 100644
index 000000000..948ff1e6f
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/fontworkobjectbar.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkSameLetterHeights"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkAlignmentFloater"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkCharacterSpacingFloater"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/fontworkshapetype.xml b/sd/uiconfig/sdraw/toolbar/fontworkshapetype.xml
new file mode 100644
index 000000000..46a83209b
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/fontworkshapetype.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-plain-text"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-wave"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-inflate"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-stop"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-curve-up"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-curve-down"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-triangle-up"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-triangle-down"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-right"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-left"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-up"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-down"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-slant-up"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-slant-down"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-up-and-right"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-up-and-left"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-chevron-up"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-chevron-down"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-up-curve"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-down-curve"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-left-curve"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-right-curve"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-circle-curve"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-open-circle-curve"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-up-pour"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-down-pour"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-left-pour"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-right-pour"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-circle-pour"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-open-circle-pour"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/formcontrols.xml b/sd/uiconfig/sdraw/toolbar/formcontrols.xml
new file mode 100644
index 000000000..b79e0e001
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/formcontrols.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:SelectObject"/>
+ <toolbar:toolbaritem xlink:href=".uno:SwitchControlDesignMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:UseWizards"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormDesignTools"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ControlProperties" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormProperties" toolbar:visible="false"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Label"/>
+ <toolbar:toolbaritem xlink:href=".uno:Edit"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:CheckBox"/>
+ <toolbar:toolbaritem xlink:href=".uno:RadioButton"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ListBox"/>
+ <toolbar:toolbaritem xlink:href=".uno:ComboBox"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Pushbutton"/>
+ <toolbar:toolbaritem xlink:href=".uno:Imagebutton"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FormattedField"/>
+ <toolbar:toolbaritem xlink:href=".uno:DateField"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:NumericField"/>
+ <toolbar:toolbaritem xlink:href=".uno:GroupBox"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:TimeField"/>
+ <toolbar:toolbaritem xlink:href=".uno:CurrencyField"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:PatternField"/>
+ <toolbar:toolbaritem xlink:href=".uno:Grid"/>
+ <toolbar:toolbaritem xlink:href=".uno:NavigationBar"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ImageControl"/>
+ <toolbar:toolbaritem xlink:href=".uno:FileControl"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:SpinButton"/>
+ <toolbar:toolbaritem xlink:href=".uno:ScrollBar"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/formdesign.xml b/sd/uiconfig/sdraw/toolbar/formdesign.xml
new file mode 100644
index 000000000..b75fab75f
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/formdesign.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:SelectObject"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ControlProperties"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormProperties"/>
+ <toolbar:toolbaritem xlink:href=".uno:TransformDialog"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ShowFmExplorer"/>
+ <toolbar:toolbaritem xlink:href=".uno:TabDialog"/>
+ <toolbar:toolbaritem xlink:href=".uno:AddField"/>
+ <toolbar:toolbaritem xlink:href=".uno:AutoControlFocus"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BringToFront" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:SendToBack" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatGroup" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatUngroup" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:EnterGroup" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:LeaveGroup" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:OpenReadOnly"/>
+ <toolbar:toolbaritem xlink:href=".uno:GridVisible"/>
+ <toolbar:toolbaritem xlink:href=".uno:GridUse"/>
+ <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/formsfilterbar.xml b/sd/uiconfig/sdraw/toolbar/formsfilterbar.xml
new file mode 100644
index 000000000..096d7e73d
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/formsfilterbar.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:FormFilterExecute"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormFilterNavigator"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FormFilterExit"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/formsnavigationbar.xml b/sd/uiconfig/sdraw/toolbar/formsnavigationbar.xml
new file mode 100644
index 000000000..4ffa664e6
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/formsnavigationbar.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:RecSearch"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:RecText"/>
+ <toolbar:toolbaritem xlink:href=".uno:AbsoluteRecord"/>
+ <toolbar:toolbaritem xlink:href=".uno:RecFromText"/>
+ <toolbar:toolbaritem xlink:href=".uno:RecTotal"/>
+ <toolbar:toolbaritem xlink:href=".uno:FirstRecord"/>
+ <toolbar:toolbaritem xlink:href=".uno:PrevRecord"/>
+ <toolbar:toolbaritem xlink:href=".uno:NextRecord"/>
+ <toolbar:toolbaritem xlink:href=".uno:LastRecord"/>
+ <toolbar:toolbaritem xlink:href=".uno:NewRecord"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:RecSave"/>
+ <toolbar:toolbaritem xlink:href=".uno:RecUndo"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteRecord"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Refresh"/>
+ <toolbar:toolbaritem xlink:href=".uno:RefreshFormControl"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:OrderCrit"/>
+ <toolbar:toolbaritem xlink:href=".uno:Sortup"/>
+ <toolbar:toolbaritem xlink:href=".uno:SortDown"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:AutoFilter"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormFiltered"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormFilter"/>
+ <toolbar:toolbaritem xlink:href=".uno:RemoveFilterSort"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ViewFormAsGrid"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/formtextobjectbar.xml b/sd/uiconfig/sdraw/toolbar/formtextobjectbar.xml
new file mode 100644
index 000000000..a055cba03
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/formtextobjectbar.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:CharFontName"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FontHeight"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Bold"/>
+ <toolbar:toolbaritem xlink:href=".uno:Italic"/>
+ <toolbar:toolbaritem xlink:href=".uno:Underline"/>
+ <toolbar:toolbaritem xlink:href=".uno:SuperScript"/>
+ <toolbar:toolbaritem xlink:href=".uno:SubScript"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:LeftPara"/>
+ <toolbar:toolbaritem xlink:href=".uno:CenterPara"/>
+ <toolbar:toolbaritem xlink:href=".uno:RightPara"/>
+ <toolbar:toolbaritem xlink:href=".uno:JustifyPara"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ParaLeftToRight"/>
+ <toolbar:toolbaritem xlink:href=".uno:ParaRightToLeft"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SpacePara1"/>
+ <toolbar:toolbaritem xlink:href=".uno:SpacePara15"/>
+ <toolbar:toolbaritem xlink:href=".uno:SpacePara2"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FontDialog"/>
+ <toolbar:toolbaritem xlink:href=".uno:ParagraphDialog"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/fullscreenbar.xml b/sd/uiconfig/sdraw/toolbar/fullscreenbar.xml
new file mode 100644
index 000000000..9b007728d
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/fullscreenbar.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:FullScreen"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/gluepointsobjectbar.xml b/sd/uiconfig/sdraw/toolbar/gluepointsobjectbar.xml
new file mode 100644
index 000000000..0183493e9
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/gluepointsobjectbar.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:GlueInsertPoint"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionLeft"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionTop"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionRight"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionBottom"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GluePercent"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueHorzAlignLeft"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueHorzAlignCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueHorzAlignRight"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueVertAlignTop"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueVertAlignCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueVertAlignBottom"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/graffilterbar.xml b/sd/uiconfig/sdraw/toolbar/graffilterbar.xml
new file mode 100644
index 000000000..f820a8112
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/graffilterbar.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterInvert"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSmooth"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSharpen"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterRemoveNoise"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSolarize"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSepia"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterPoster"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterPopart"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSobel"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterRelief"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterMosaic"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/graphicobjectbar.xml b/sd/uiconfig/sdraw/toolbar/graphicobjectbar.xml
new file mode 100644
index 000000000..95113efc9
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/graphicobjectbar.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:TransformDialog"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlignLeft" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignCenter" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlignRight" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignUp" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignMiddle" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignDown" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectPosition" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BringToFront"/>
+ <toolbar:toolbaritem xlink:href=".uno:Forward"/>
+ <toolbar:toolbaritem xlink:href=".uno:Backward"/>
+ <toolbar:toolbaritem xlink:href=".uno:SendToBack"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BeforeObject"/>
+ <toolbar:toolbaritem xlink:href=".uno:BehindObject"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ReverseOrder"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:XLineStyle"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineWidth"/>
+ <toolbar:toolbaritem xlink:href=".uno:XLineColor"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FillStyle"/>
+ <toolbar:toolbaritem xlink:href=".uno:FillColor" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FillShadow"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterToolbox"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafMode"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Crop"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:MirrorVert"/>
+ <toolbar:toolbaritem xlink:href=".uno:MirrorHorz"/>
+ <toolbar:toolbaritem xlink:href=".uno:AdvancedMode"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafTransparence"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ColorSettings"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatLine" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatArea" toolbar:visible="false"/>
+</toolbar:toolbar>
+
diff --git a/sd/uiconfig/sdraw/toolbar/insertbar.xml b/sd/uiconfig/sdraw/toolbar/insertbar.xml
new file mode 100644
index 000000000..e3773a3a7
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/insertbar.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:InsertPage"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertObjectFloatingFrame" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ImportFromFile" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertTable"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertGraphic"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertAVMedia"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertMath"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertObjectChart"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertObject" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/linesbar.xml b/sd/uiconfig/sdraw/toolbar/linesbar.xml
new file mode 100644
index 000000000..5e29f23a7
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/linesbar.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:BezierFill"/>
+ <toolbar:toolbaritem xlink:href=".uno:Polygon"/>
+ <toolbar:toolbaritem xlink:href=".uno:Polygon_Diagonal"/>
+ <toolbar:toolbaritem xlink:href=".uno:Freeline"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Bezier_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Polygon_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Polygon_Diagonal_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Freeline_Unfilled"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/masterviewtoolbar.xml b/sd/uiconfig/sdraw/toolbar/masterviewtoolbar.xml
new file mode 100644
index 000000000..79d269c0c
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/masterviewtoolbar.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:InsertMasterPage"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteMasterPage"/>
+ <toolbar:toolbaritem xlink:href=".uno:RenameMasterPage"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:CloseMasterView"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/mediaobjectbar.xml b/sd/uiconfig/sdraw/toolbar/mediaobjectbar.xml
new file mode 100644
index 000000000..676253483
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/mediaobjectbar.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:InsertAVMedia"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:AVMediaToolBox"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/notebookbarshortcuts.xml b/sd/uiconfig/sdraw/toolbar/notebookbarshortcuts.xml
new file mode 100644
index 000000000..a6cac0f1f
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/notebookbarshortcuts.xml
@@ -0,0 +1,16 @@
+<?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/.
+ *
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:Menubar"/>
+ <toolbar:toolbaritem xlink:href=".uno:Open"/>
+ <toolbar:toolbaritem xlink:href=".uno:Save"/>
+ <toolbar:toolbaritem xlink:href=".uno:Undo"/>
+ <toolbar:toolbaritem xlink:href=".uno:Redo"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/optimizetablebar.xml b/sd/uiconfig/sdraw/toolbar/optimizetablebar.xml
new file mode 100644
index 000000000..e1bab26b2
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/optimizetablebar.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:SetMinimalRowHeight"/>
+ <toolbar:toolbaritem xlink:href=".uno:SetMinimalColumnWidth"/>
+ <toolbar:toolbaritem xlink:href=".uno:SetOptimalRowHeight"/>
+ <toolbar:toolbaritem xlink:href=".uno:SetOptimalColumnWidth"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeRows"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeColumns"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/optionsbar.xml b/sd/uiconfig/sdraw/toolbar/optionsbar.xml
new file mode 100644
index 000000000..b8be8a12f
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/optionsbar.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ClickChangeRotation"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GridVisible"/>
+ <toolbar:toolbaritem xlink:href=".uno:HelplinesVisible"/>
+ <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GridUse"/>
+ <toolbar:toolbaritem xlink:href=".uno:HelplinesUse"/>
+ <toolbar:toolbaritem xlink:href=".uno:SnapBorder"/>
+ <toolbar:toolbaritem xlink:href=".uno:SnapFrame"/>
+ <toolbar:toolbaritem xlink:href=".uno:SnapPoints"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:QuickEdit"/>
+ <toolbar:toolbaritem xlink:href=".uno:PickThrough"/>
+ <toolbar:toolbaritem xlink:href=".uno:DoubleClickTextEdit"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SolidCreate"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:LeaveAllGroups"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/positionbar.xml b/sd/uiconfig/sdraw/toolbar/positionbar.xml
new file mode 100644
index 000000000..5f91c67e8
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/positionbar.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:BringToFront"/>
+ <toolbar:toolbaritem xlink:href=".uno:Forward"/>
+ <toolbar:toolbaritem xlink:href=".uno:Backward"/>
+ <toolbar:toolbaritem xlink:href=".uno:SendToBack"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BeforeObject"/>
+ <toolbar:toolbaritem xlink:href=".uno:BehindObject"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ReverseOrder"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/rectanglesbar.xml b/sd/uiconfig/sdraw/toolbar/rectanglesbar.xml
new file mode 100644
index 000000000..2f03f49f1
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/rectanglesbar.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:Rect"/>
+ <toolbar:toolbaritem xlink:href=".uno:Square"/>
+ <toolbar:toolbaritem xlink:href=".uno:Rect_Rounded"/>
+ <toolbar:toolbaritem xlink:href=".uno:Square_Rounded"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Rect_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Square_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Rect_Rounded_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Square_Rounded_Unfilled"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/redactedexportbar.xml b/sd/uiconfig/sdraw/toolbar/redactedexportbar.xml
new file mode 100644
index 000000000..42cc31a59
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/redactedexportbar.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:RedactedExportWhite"/>
+ <toolbar:toolbaritem xlink:href=".uno:RedactedExportBlack"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/redactionbar.xml b/sd/uiconfig/sdraw/toolbar/redactionbar.xml
new file mode 100644
index 000000000..2e4734e20
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/redactionbar.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:Rect?FillTransparence:short=50&amp;FillColor:string=COL_GRAY7&amp;LineStyle:short=0&amp;IsSticky:bool=true&amp;ShapeName:string=RectangleRedactionShape"/>
+ <toolbar:toolbaritem xlink:href=".uno:Freeline_Unfilled?Transparence:short=50&amp;Color:string=COL_GRAY7&amp;Width:short=500&amp;IsSticky:bool=true&amp;ShapeName:string=FreeformRedactionShape"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:RedactedExportWhite"/>
+ <toolbar:toolbaritem xlink:href=".uno:RedactedExportBlack"/>
+ <toolbar:toolbaritem xlink:href=".uno:RedactionPreviewExport"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/standardbar.xml b/sd/uiconfig/sdraw/toolbar/standardbar.xml
new file mode 100644
index 000000000..915e201e9
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/standardbar.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:OpenUrl" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AddDirect"/>
+ <toolbar:toolbaritem xlink:href=".uno:NewDoc" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Open"/>
+ <toolbar:toolbaritem xlink:href=".uno:OpenRemote" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Save"/>
+ <toolbar:toolbaritem xlink:href=".uno:SaveAs" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:SendMail" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:EditDoc" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ExportTo"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExportDirectToPDF"/>
+ <toolbar:toolbaritem xlink:href=".uno:PrintDefault" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Print"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Cut"/>
+ <toolbar:toolbaritem xlink:href=".uno:Copy"/>
+ <toolbar:toolbaritem xlink:href=".uno:Paste"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatPaintbrush"/>
+ <toolbar:toolbaritem xlink:href=".uno:SetDefault" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Undo"/>
+ <toolbar:toolbaritem xlink:href=".uno:Redo"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SpellDialog" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:SpellOnline" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:GridVisible"/>
+ <toolbar:toolbaritem xlink:href=".uno:GridUse"/>
+ <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomObjects" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomToolBox" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertTable" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertGraphic"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertObjectChart" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Text"/>
+ <toolbar:toolbaritem xlink:href=".uno:CharmapControl"/>
+ <toolbar:toolbaritem xlink:href=".uno:VerticalText" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater"/>
+ <toolbar:toolbaritem xlink:href=".uno:HyperlinkDialog" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:AdvancedMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:Mirror" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:TransformDialog" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectPosition"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeSelection"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FillShadow"/>
+ <toolbar:toolbaritem xlink:href=".uno:Crop"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterToolbox" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Window3D" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ToggleObjectBezierMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueEditMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertDraw"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:HelpIndex" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtendedHelp" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FirstPage" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:PreviousPage" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:NextPage" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:LastPage" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:MovePageFirst" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:MovePageUp" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:MovePageDown" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:MovePageLast" toolbar:visible="false"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/starshapes.xml b/sd/uiconfig/sdraw/toolbar/starshapes.xml
new file mode 100644
index 000000000..cbc07fc70
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/starshapes.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.star4"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.star5"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.star6"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.star8"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.star12"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.star24"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.bang"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.vertical-scroll"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.horizontal-scroll"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.signet"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.doorplate"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.concave-star6"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/symbolshapes.xml b/sd/uiconfig/sdraw/toolbar/symbolshapes.xml
new file mode 100644
index 000000000..9ba9f22e0
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/symbolshapes.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.smiley"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.heart"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.sun"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.moon"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.cloud"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.lightning"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.flower"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.forbidden"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.puzzle"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.quad-bevel"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.octagon-bevel"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.diamond-bevel"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.bracket-pair"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.left-bracket"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.right-bracket"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.brace-pair"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.left-brace"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.right-brace"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/tableobjectbar.xml b/sd/uiconfig/sdraw/toolbar/tableobjectbar.xml
new file mode 100644
index 000000000..87655aafe
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/tableobjectbar.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:InsertTable"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:LineStyle"/>
+ <toolbar:toolbaritem xlink:href=".uno:FrameLineColor"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SetBorderStyle"/>
+ <toolbar:toolbaritem xlink:href=".uno:FillStyle"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:MergeCells"/>
+ <toolbar:toolbaritem xlink:href=".uno:SplitCell"/>
+ <toolbar:toolbaritem xlink:href=".uno:OptimizeTable"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:CellVertTop"/>
+ <toolbar:toolbaritem xlink:href=".uno:CellVertCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:CellVertBottom"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertRowsBefore"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertRowsAfter"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertColumnsBefore"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertColumnsAfter"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteRows"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteColumns"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteTable"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SelectTable" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:EntireColumn" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:EntireRow" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:TableDesign"/>
+ <toolbar:toolbaritem xlink:href=".uno:TableDialog"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/textbar.xml b/sd/uiconfig/sdraw/toolbar/textbar.xml
new file mode 100644
index 000000000..8121a4eef
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/textbar.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:Text"/>
+ <toolbar:toolbaritem xlink:href=".uno:TextFitToSizeTool"/>
+ <toolbar:toolbaritem xlink:href=".uno:DrawCaption"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:VerticalText"/>
+ <toolbar:toolbaritem xlink:href=".uno:VerticalTextFitToSizeTool"/>
+ <toolbar:toolbaritem xlink:href=".uno:VerticalCaption"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/toolbar/textobjectbar.xml b/sd/uiconfig/sdraw/toolbar/textobjectbar.xml
new file mode 100644
index 000000000..1131052a2
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/textobjectbar.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:CharFontName"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FontHeight"/>
+ <toolbar:toolbaritem xlink:href=".uno:Grow"/>
+ <toolbar:toolbaritem xlink:href=".uno:Shrink"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Bold"/>
+ <toolbar:toolbaritem xlink:href=".uno:Italic"/>
+ <toolbar:toolbaritem xlink:href=".uno:Underline"/>
+ <toolbar:toolbaritem xlink:href=".uno:UnderlineDouble" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Strikeout"/>
+ <toolbar:toolbaritem xlink:href=".uno:Overline" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SuperScript"/>
+ <toolbar:toolbaritem xlink:href=".uno:SubScript"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Shadowed"/>
+ <toolbar:toolbaritem xlink:href=".uno:OutlineFont"/>
+ <toolbar:toolbaritem xlink:href=".uno:SetDefault"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ChangeCaseToLower" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ChangeCaseToUpper" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:SmallCaps" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Color"/>
+ <toolbar:toolbaritem xlink:href=".uno:CharBackColor"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:DefaultBullet"/>
+ <toolbar:toolbaritem xlink:href=".uno:DefaultNumbering"/>
+ <toolbar:toolbaritem xlink:href=".uno:SetOutline" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:LeftPara"/>
+ <toolbar:toolbaritem xlink:href=".uno:CenterPara"/>
+ <toolbar:toolbaritem xlink:href=".uno:RightPara"/>
+ <toolbar:toolbaritem xlink:href=".uno:JustifyPara"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:CellVertTop"/>
+ <toolbar:toolbaritem xlink:href=".uno:CellVertCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:CellVertBottom"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:LineSpacing"/>
+ <toolbar:toolbaritem xlink:href=".uno:Spacing" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ParaspaceIncrease"/>
+ <toolbar:toolbaritem xlink:href=".uno:ParaspaceDecrease"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:TextdirectionLeftToRight"/>
+ <toolbar:toolbaritem xlink:href=".uno:TextdirectionTopToBottom"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ParaLeftToRight"/>
+ <toolbar:toolbaritem xlink:href=".uno:ParaRightToLeft"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SelectAll" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontDialog" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ParagraphDialog" toolbar:visible="false"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/toolbar.xml b/sd/uiconfig/sdraw/toolbar/toolbar.xml
new file mode 100644
index 000000000..c48f72223
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/toolbar.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:SelectObject"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomMode" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomObjects" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomToolBox" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Text" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:VerticalText" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertGraphic" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertToolbox" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:XLineColor"/>
+ <toolbar:toolbaritem xlink:href=".uno:FillColor"/>
+ <toolbar:toolbaritem xlink:href=".uno:FillStyle" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Line"/>
+ <toolbar:toolbaritem xlink:href=".uno:Freeline_Unfilled" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Bezier_Unfilled" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.rectangle"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ellipse"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowsToolbox"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineToolbox"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorToolbox"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:Objects3DToolbox"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ToggleObjectBezierMode" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueEditMode" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ChangeBezier" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ChangePolygon" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConvertInto3D" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConvertInto3DLatheFast" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Config" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle" toolbar:visible="false"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/viewerbar.xml b/sd/uiconfig/sdraw/toolbar/viewerbar.xml
new file mode 100644
index 000000000..85099a7b5
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/viewerbar.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:SaveAs"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:EditDoc" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ReadOnlyDoc" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:SendMail"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ExportDirectToPDF"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExportDirectToEPUB" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:PrintDefault" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Print"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Copy"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Zoom"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/sdraw/toolbar/zoombar.xml b/sd/uiconfig/sdraw/toolbar/zoombar.xml
new file mode 100644
index 000000000..6507ec819
--- /dev/null
+++ b/sd/uiconfig/sdraw/toolbar/zoombar.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ZoomPlus"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomMinus"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Zoom100Percent"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomPrevious" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomNext" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomPage"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomPageWidth"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomOptimal"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomObjects"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomPanning"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/sdraw/ui/breakdialog.ui b/sd/uiconfig/sdraw/ui/breakdialog.ui
new file mode 100644
index 000000000..e4cf55cc9
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/breakdialog.ui
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.4 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="BreakDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="breakdialog|BreakDialog">Break</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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="cancel">
+ <property name="label" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">12</property>
+ <property name="column_spacing">12</property>
+ <property name="column_homogeneous">True</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="breakdialog|label1">Processing metafile:</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="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="breakdialog|label2">Broken down metaobjects:</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="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="breakdialog|label3">Inserted drawing objects:</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="metafiles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label"> </property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="metaobjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label"> </property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="drawingobjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label"> </property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ </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="-6">cancel</action-widget>
+ </action-widgets>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/bulletsandnumbering.ui b/sd/uiconfig/sdraw/ui/bulletsandnumbering.ui
new file mode 100644
index 000000000..327c45e0b
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/bulletsandnumbering.ui
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="BulletsAndNumberingDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="bulletsandnumbering|BulletsAndNumberingDialog">Bullets and Numbering</property>
+ <property name="modal">True</property>
+ <property name="window_position">mouse</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">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="reset">
+ <property name="label" translatable="yes" context="bulletsandnumbering|reset">Reset</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">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="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">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="cancel">
+ <property name="label" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="tabcontrol">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="scrollable">True</property>
+ <property name="enable_popup">True</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="position">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="bulletsandnumbering|position">Position</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="customize">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="bulletsandnumbering|customize">Customize</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="101">reset</action-widget>
+ <action-widget response="-5">ok</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ <action-widget response="-11">help</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/copydlg.ui b/sd/uiconfig/sdraw/ui/copydlg.ui
new file mode 100644
index 000000000..76b83763e
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/copydlg.ui
@@ -0,0 +1,581 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">1</property>
+ <property name="upper">999</property>
+ <property name="value">1</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="lower">-360</property>
+ <property name="upper">360</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">sd/res/pipette.png</property>
+ </object>
+ <object class="GtkDialog" id="DuplicateDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="copydlg|DuplicateDialog">Duplicate</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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="default">
+ <property name="label" translatable="yes" context="copydlg|default">_Default</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="default-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|default">Resets the values visible in the dialog back to the default installation values.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="ok-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|ok">Saves all changes and closes dialog.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="cancel">
+ <property name="label" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="cancel-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|cancel">Closes dialog and discards all changes.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="copydlg|label4">Number of _copies:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">copies</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="copies">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin-start">12</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="copies-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|copies">Enter the number of copies you want to make.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="viewdata">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes" context="copydlg|viewdata|tooltip_text">Values from Selection</property>
+ <property name="image">image1</property>
+ <property name="always_show_image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="viewdata-atkobject">
+ <property name="AtkObject::accessible-name" translatable="yes" context="copydlg|viewdata-atkobject">Values from Selection</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <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">3</property>
+ <property name="column_spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="copydlg|label5">_X axis:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">x</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="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="copydlg|label6">_Y axis:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">y</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="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="copydlg|label7">_Angle:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">angle</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="GtkSpinButton" id="x">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="digits">2</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="x-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|x">Enter the horizontal distance between the centers of the selected object and the duplicate object. Positive values shift the duplicate object to the right and negative values shift the duplicate object to the left.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="y">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="digits">2</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="y-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|y">Enter the vertical distance between the centers of the selected object and the duplicate object. Positive values shift the duplicate object down and negative values shift the duplicate object up.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="angle">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="adjustment">adjustment2</property>
+ <property name="digits">2</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="angle-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|angle">Enter the angle (0 to 359 degrees) by which you want to rotate the duplicate object. Positive values rotate the duplicate object in a clockwise direction and negative values in a counterclockwise direction.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="copydlg|label1">Placement</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <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">3</property>
+ <property name="column_spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="copydlg|label8">_Width:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">width</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="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="copydlg|label9">_Height:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">height</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="GtkSpinButton" id="width">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="digits">2</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="width-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|width">Enter the amount by which you want to enlarge or reduce the width of the duplicate object.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="height">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="digits">2</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="height-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|height">Enter the amount by which you want to enlarge or reduce the height of the duplicate object.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="copydlg|label2">Enlargement</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <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">3</property>
+ <property name="column_spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="copydlg|label10">_Start:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">start</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="endlabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="copydlg|endlabel">_End:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">end</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="GtkMenuButton" id="start">
+ <property name="label" translatable="no"></property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="start-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|start">Choose a color for the selected object.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="end">
+ <property name="label" translatable="no"></property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="end-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|end">Choose a color for the duplicate object. If you are making more than one copy, this color is applied to the last copy.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="copydlg|label3">Colors</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </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="101">default</action-widget>
+ <action-widget response="-5">ok</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ <action-widget response="-11">help</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="DuplicateDialog-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="copydlg|extended_tip|DuplicateDialog">Makes one or more copies of a selected object.</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroup1">
+ <widgets>
+ <widget name="label4"/>
+ <widget name="label5"/>
+ <widget name="label6"/>
+ <widget name="label7"/>
+ <widget name="label8"/>
+ <widget name="label9"/>
+ <widget name="label10"/>
+ <widget name="endlabel"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/crossfadedialog.ui b/sd/uiconfig/sdraw/ui/crossfadedialog.ui
new file mode 100644
index 000000000..8d017eafc
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/crossfadedialog.ui
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">1</property>
+ <property name="upper">256</property>
+ <property name="value">1</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkDialog" id="CrossFadeDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="crossfadedialog|CrossFadeDialog">Cross-fading</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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="margin_top">5</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">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" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkCheckButton" id="orientation">
+ <property name="label" translatable="yes" context="crossfadedialog|orientation">Same orientation</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="orientation-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="crossfadedialog|extended_tip|orientation">Applies a smooth transition between the selected objects.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="attributes">
+ <property name="label" translatable="yes" context="crossfadedialog|attributes">Cross-fade attributes</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="attributes-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="crossfadedialog|extended_tip|attributes">Applies cross-fading to the line and fill properties of the selected objects.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="crossfadedialog|label2">Increments:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">increments</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="GtkSpinButton" id="increments">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="activates_default">True</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="increments-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="crossfadedialog|extended_tip|increments">Enter the number of shapes you want between the two selected objects.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="crossfadedialog|label1">Settings</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </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-widget response="-11">help</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="CrossFadeDialog-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="crossfadedialog|extended_tip|CrossFadeDialog">Creates shapes and distributes them by uniform increments between two drawing objects.</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/dlgsnap.ui b/sd/uiconfig/sdraw/ui/dlgsnap.ui
new file mode 100644
index 000000000..9753706a0
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/dlgsnap.ui
@@ -0,0 +1,344 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="SnapObjectDialog">
+ <property name="can-focus">False</property>
+ <property name="border-width">6</property>
+ <property name="title" translatable="yes" context="dlgsnap|SnapObjectDialog">New Snap Object</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can-focus">False</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="delete">
+ <property name="label" translatable="yes" context="stock">_Delete</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="use-underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="delete-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|delete">Deletes the selected snap point or snap line.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">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="cancel">
+ <property name="label" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="can-default">True</property>
+ <property name="receives-default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=2 n-rows=2 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkSpinButton" id="x">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="activates-default">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="digits">2</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="x-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|x">Enter the amount of space you want between the snap point or line and the left edge of the page.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="y">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="activates-default">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="digits">2</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="y-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|y">Enter the amount of space you want between the snap point or line and the top edge of the page.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="xlabel">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="dlgsnap|xlabel">_X:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">x</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="ylabel">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="dlgsnap|ylabel">_Y:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">y</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="dlgsnap|label1">Position</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="radiogroup">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=2 n-rows=3 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">sd/res/hlppoint.png</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">sd/res/hlplvert.png</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">sd/res/hlplhorz.png</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="point">
+ <property name="label" translatable="yes" context="dlgsnap|point">_Point</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="active">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="point-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|point">Inserts a snap point.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="vert">
+ <property name="label" translatable="yes" context="dlgsnap|vert">_Vertical</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">point</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="vert-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|vert">Inserts a vertical snap line.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="horz">
+ <property name="label" translatable="yes" context="dlgsnap|horz">Hori_zontal</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">point</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="horz-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|horz">Inserts a horizontal snap line.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="dlgsnap|label2">Type</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </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="101">delete</action-widget>
+ <action-widget response="-5">ok</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ <action-widget response="-11">help</action-widget>
+ </action-widgets>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="SnapObjectDialog-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dlgsnap|extended_tip|SnapObjectDialog">Inserts a snap point or snap line (also known as guide) that you can use to quickly align objects.</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/drawchardialog.ui b/sd/uiconfig/sdraw/ui/drawchardialog.ui
new file mode 100644
index 000000000..27138d54e
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/drawchardialog.ui
@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="DrawCharDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="drawchardialog|DrawCharDialog">Character</property>
+ <property name="modal">True</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">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="reset">
+ <property name="label" translatable="yes" context="stock">_Reset</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">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="cancel">
+ <property name="label" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="tabcontrol">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="scrollable">True</property>
+ <property name="enable_popup">True</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_CHAR_NAME">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawchardialog|RID_SVXPAGE_CHAR_NAME">Fonts</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_CHAR_EFFECTS">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawchardialog|RID_SVXPAGE_CHAR_EFFECTS">Font Effects</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_CHAR_POSITION">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawchardialog|RID_SVXPAGE_CHAR_POSITION">Position</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_BKG">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawchardialog|RID_SVXPAGE_BKG">Highlighting</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </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="101">reset</action-widget>
+ <action-widget response="-5">ok</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ <action-widget response="-11">help</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/drawpagedialog.ui b/sd/uiconfig/sdraw/ui/drawpagedialog.ui
new file mode 100644
index 000000000..d638e0e76
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/drawpagedialog.ui
@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="DrawPageDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="drawpagedialog|DrawPageDialog">Page Properties</property>
+ <property name="modal">True</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">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="reset">
+ <property name="label" translatable="yes" context="stock">_Reset</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">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="cancel">
+ <property name="label" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="tabcontrol">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="scrollable">True</property>
+ <property name="enable_popup">True</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_PAGE">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawpagedialog|RID_SVXPAGE_PAGE">Page</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_AREA">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawpagedialog|RID_SVXPAGE_AREA">Background</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_TRANSPARENCE">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawpagedialog|RID_SVXPAGE_TRANSPARENCE">Transparency</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_THEME">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawpagedialog|RID_SVXPAGE_THEME">Theme</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </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="101">reset</action-widget>
+ <action-widget response="-5">ok</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ <action-widget response="-11">help</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/drawparadialog.ui b/sd/uiconfig/sdraw/ui/drawparadialog.ui
new file mode 100644
index 000000000..311f610a6
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/drawparadialog.ui
@@ -0,0 +1,351 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="DrawParagraphPropertiesDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="drawparadialog|DrawParagraphPropertiesDialog">Paragraph</property>
+ <property name="modal">True</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">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="reset">
+ <property name="label" translatable="yes" context="stock">_Reset</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">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="cancel">
+ <property name="label" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="tabcontrol">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="scrollable">True</property>
+ <property name="enable_popup">True</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="labelTP_PARA_STD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawparadialog|labelTP_PARA_STD">Indents &amp; Spacing</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="labelTP_PARA_ASIAN">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawparadialog|labelTP_PARA_ASIAN">Asian Typography</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="labelTP_TABULATOR">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawparadialog|labelTP_TABULATOR">Tabs</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="labelTP_PARA_ALIGN">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawparadialog|labelTP_PARA_ALIGN">Alignment</property>
+ <property name="xalign">0.5</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="labelNUMBERING">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawparadialog|labelNUMBERING">Numbering</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </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="101">reset</action-widget>
+ <action-widget response="-5">ok</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ <action-widget response="-11">help</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/drawprinteroptions.ui b/sd/uiconfig/sdraw/ui/drawprinteroptions.ui
new file mode 100644
index 000000000..1cbd7f513
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/drawprinteroptions.ui
@@ -0,0 +1,299 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkBox" id="box">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="contents">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCheckButton" id="printname">
+ <property name="label" translatable="yes" context="drawprinteroptions|printname">Page name</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="printname-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|printname">Specifies whether to print the page name of a document.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="printdatetime">
+ <property name="label" translatable="yes" context="drawprinteroptions|printdatetime">Date and time</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="printdatetime-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|printdatetime">Specifies whether to print the current date and time.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="drawprinteroptions|label4">Contents</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="color">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkRadioButton" id="originalcolors">
+ <property name="label" translatable="yes" context="drawprinteroptions|originalcolors">Original colors</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="active">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="originalcolors-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|originalcolors">Specifies to print in original colors.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="grayscale">
+ <property name="label" translatable="yes" context="drawprinteroptions|grayscale">Grayscale</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">originalcolors</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="grayscale-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|grayscale">Specifies to print colors as grayscale.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="blackandwhite">
+ <property name="label" translatable="yes" context="drawprinteroptions|blackandwhite">Black &amp; white</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">originalcolors</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="blackandwhite-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|blackandwhite">Specifies to print colors as black and white.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="drawprinteroptions|label5">Color</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="pagesizes">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkRadioButton" id="originalsize">
+ <property name="label" translatable="yes" context="drawprinteroptions|originalsize">Original size</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="active">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="originalsize-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|originalsize">Specifies that you do not want to further scale pages when printing.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="fittoprintable">
+ <property name="label" translatable="yes" context="drawprinteroptions|fittoprintable">Fit to printable page</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">originalsize</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="fittoprintable-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|fittoprinttable">Specifies whether to scale down objects that are beyond the margins of the current printer so they fit on the paper in the printer.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="distributeonmultiple">
+ <property name="label" translatable="yes" context="drawprinteroptions|distributeonmultiple">Distribute on multiple sheets of paper</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">originalsize</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="distributeonmultiple-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|distributeonmultiple">Prints a large format document, such as a poster or banner, by distributing the document page across multiple sheets of paper. The distribution option calculates how many sheets of paper are needed. You can then piece together the sheets.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="tilesheet">
+ <property name="label" translatable="yes" context="drawprinteroptions|tilesheet">Tile sheet of paper with repeated pages</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">originalsize</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="tilesheet-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="drawprinteroptions|extended_tip|tilesheet">Specifies that pages are to be printed in tiled format. If the pages or slides are smaller than the paper, repeat the pages or slides on one sheet of paper.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="drawprinteroptions|label6">Size</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/drawprtldialog.ui b/sd/uiconfig/sdraw/ui/drawprtldialog.ui
new file mode 100644
index 000000000..cb7679144
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/drawprtldialog.ui
@@ -0,0 +1,880 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="DrawPRTLDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="drawprtldialog|DrawPRTLDialog">Presentation Layout</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">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="reset">
+ <property name="label" translatable="yes" context="stock">_Reset</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">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="cancel">
+ <property name="label" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="tabcontrol">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="scrollable">True</property>
+ <property name="enable_popup">True</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_LINE">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_LINE">Line</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_AREA">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_AREA">Area</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_SHADOW">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_SHADOW">Shadow</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_TRANSPARENCE">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_TRANSPARENCE">Transparency</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_CHAR_NAME">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_CHAR_NAME">Font</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_CHAR_EFFECTS">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_CHAR_EFFECTS">Font Effects</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_STD_PARAGRAPH">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_STD_PARAGRAPH">Indents &amp; Spacing</property>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_TEXTATTR">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_TEXTATTR">Text</property>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_PICK_BULLET">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_PICK_BULLET">Bullets</property>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_PICK_SINGLE_NUM">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_PICK_SINGLE_NUM">Numbering</property>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_PICK_BMP">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_PICK_BMP">Image</property>
+ </object>
+ <packing>
+ <property name="position">10</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_NUM_OPTIONS">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_NUM_OPTIONS">Customize</property>
+ </object>
+ <packing>
+ <property name="position">11</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_ALIGN_PARAGRAPH">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_ALIGN_PARAGRAPH">Alignment</property>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_PARA_ASIAN">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_PARA_ASIAN">Asian Typography</property>
+ </object>
+ <packing>
+ <property name="position">13</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_TABULATOR">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_TABULATOR">Tabs</property>
+ </object>
+ <packing>
+ <property name="position">14</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="RID_SVXPAGE_BKG">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawprtldialog|RID_SVXPAGE_BKG">Highlighting</property>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </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="101">reset</action-widget>
+ <action-widget response="-5">ok</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ <action-widget response="-11">help</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/insertlayer.ui b/sd/uiconfig/sdraw/ui/insertlayer.ui
new file mode 100644
index 000000000..ce4184181
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/insertlayer.ui
@@ -0,0 +1,296 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="InsertLayerDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="insertlayer|InsertLayerDialog">Insert Layer</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox4">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area4">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">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" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkFrame" id="nameframe">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkEntry" id="name">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="activates_default">True</property>
+ <property name="width_chars">54</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="name-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|name">Enter a name for the new layer.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="insertlayer|label4">_Name</property>
+ <property name="use_underline">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="titleframe">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkEntry" id="title">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="activates_default">True</property>
+ <property name="width_chars">54</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="title-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|title">Enter the title of the layer.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="insertlayer|label5">_Title</property>
+ <property name="use_underline">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="description">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkTextView" id="textview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="textview-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|textview">Enter a description of the layer.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="description1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="insertlayer|description">_Description</property>
+ <property name="use_underline">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="visible">
+ <property name="label" translatable="yes" context="insertlayer|visible">_Visible</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="visible-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|visible">Show or hide the layer.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="printable">
+ <property name="label" translatable="yes" context="insertlayer|printable">_Printable</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="printable-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|printable">When printing, print or ignore this particular layer.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="locked">
+ <property name="label" translatable="yes" context="insertlayer|locked">_Locked</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="locked-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|locked">Prevent elements on the layer from being edited.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </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-widget response="-11">help</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="InsertLayerDialog-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="insertlayer|extended_tip|InsertLayerDialog">Inserts a new layer in the document. Layers are only available in Draw, not in Impress.</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/insertslidesdialog.ui b/sd/uiconfig/sdraw/ui/insertslidesdialog.ui
new file mode 100644
index 000000000..ebd432fd4
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/insertslidesdialog.ui
@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkTreeStore" id="liststore1">
+ <columns>
+ <!-- column-name expander -->
+ <column type="GdkPixbuf"/>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkDialog" id="InsertSlidesDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="insertslidesdialog|InsertSlidesDialog">Insert Slides/Objects</property>
+ <property name="modal">True</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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="margin_top">5</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">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" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkCheckButton" id="backgrounds">
+ <property name="label" translatable="yes" context="insertslidesdialog|backgrounds">Delete unused backg_rounds</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="backgrounds-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="insertslidesdialog|extended_tip|backgrounds">Unused master pages are not inserted.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="links">
+ <property name="label" translatable="yes" context="insertslidesdialog|links">_Link</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="links-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="insertslidesdialog|extended_tip|links">Inserts a file or some file elements as a link that is automatically updated when the source file is modified.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="tree">
+ <property name="width_request">-1</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore1</property>
+ <property name="headers_visible">False</property>
+ <property name="search_column">1</property>
+ <property name="enable_tree_lines">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="Macro Library List-selection1"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn2">
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCellRendererPixbuf" id="cellrenderertext4"/>
+ <attributes>
+ <attribute name="pixbuf">0</attribute>
+ </attributes>
+ </child>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </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-widget response="-11">help</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/namedesign.ui b/sd/uiconfig/sdraw/ui/namedesign.ui
new file mode 100644
index 000000000..d49eef7e0
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/namedesign.ui
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.4 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="NameDesignDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="namedesign|NameDesignDialog">Name HTML Design</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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" translatable="yes" context="stock">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="margin-end">6</property>
+ <property name="use-underline">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">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <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">12</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkEntry" id="entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="activates_default">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </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-widget response="-11">help</action-widget>
+ </action-widgets>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/notebookbar.ui b/sd/uiconfig/sdraw/ui/notebookbar.ui
new file mode 100644
index 000000000..3e4b97b41
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/notebookbar.ui
@@ -0,0 +1,18918 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <requires lib="LibreOffice" version="1.0"/>
+ <!-- interface-local-resource-path ../../../icon-themes/colibre/cmd/ -->
+ <object class="GtkMenu" id="Menu 3d">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="Menu3D-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltDown">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltDown</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltUp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltLeft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltRight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="Menu3D-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-Window3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Window3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="Menu3D-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Addons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">AddonCommand</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="AddonSection-Separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Convert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-ChangeBezier">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-ChangePolygon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-convert_to_contour">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-ConvertInto3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-ConvertInto3DLatheFast">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-ConvertIntoBitmap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-ConvertIntoMetaFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-MirrorVert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MirrorVert</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-MirrorHorz">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MirrorHorz</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Combine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Dismantle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Substract">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Intersect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-EqualizeWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-EqualizeHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Connect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Connect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Break">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Break</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-CopyObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CopyObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Morphing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Morphing</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ChangeBezier">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ChangePolygon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-convert_to_contour">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertInto3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertInto3DLatheFast">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertIntoBitmap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertIntoMetaFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Field">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertDateFieldFix">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertDateFieldFix</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertDateFieldVar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertDateFieldVar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertTimeFieldFix">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertTimeFieldFix</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertTimeFieldVar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertTimeFieldVar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuField-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertAuthorField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertAuthorField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertSlideField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlideField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertSlideTitleField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlideTitleField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertSlidesField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlidesField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertFileField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertFileField</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu File">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-AddDirect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddDirect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-RecentFileList">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RecentFileList</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-CloseDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Save">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Save</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveAs">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAs</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveAsRemote">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAsRemote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveACopy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveACopy</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-NewGlobalDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NewGlobalDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-ExportTo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportTo</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-ExportToPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportToPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SendMail">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMail</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SendMailDocAsPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMailDocAsPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SendViaBluetooth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendViaBluetooth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-PrintPreview">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrintPreview</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-PrintDefault">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrintDefault</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-PrinterSetup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrinterSetup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Signature">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Signature</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SignPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SignPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SetDocumentProperties">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetDocumentProperties</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Quit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Quit</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-CheckBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-RadioButton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ListBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ComboBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Pushbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Imagebutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-FormattedField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-DateField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-TimeField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-NumericField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-CurrencyField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-PatternField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ImageControl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-FileControl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-NavigationBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Help">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-HelpIndex">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelpIndex</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-ExtendedHelp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtendedHelp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-Documentation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Documentation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-QuestionAnswers">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:QuestionAnswers</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-SendFeedback">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendFeedback</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-SafeMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SafeMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-GetInvolved">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GetInvolved</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-Donation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Donation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-ShowLicense">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowLicense</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-About">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:About</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Home">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-SelectAll">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectAll</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-FocusToFindbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-SearchDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-RestoreEditingView">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RestoreEditingView</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ImageCrop">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ExternalEdit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExternalEdit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ChangePicture">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePicture</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-CompressGraphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-SaveGraphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuImage-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-OriginalSize">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OriginalSize</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ImageMapDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuImage-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuImage-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-PhotoAlbumDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PhotoAlbumDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-AnimationObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AnimationObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-Gallery">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Gallery</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-TwainSelect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TwainSelect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertAVMedia">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertAVMedia</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertQrCode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertQrCode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertObject">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObject</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-ImportFromFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImportFromFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertMath">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMath</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-DrawText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-VerticalText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertObjectFloatingFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObjectFloatingFrame</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-HyperlinkDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HyperlinkDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-CapturePoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertPageField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertPageField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertPagesField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertPagesField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-HeaderAndFooter">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HeaderAndFooter</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Master">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="InsertMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RenameMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CloseMasterViewD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Media">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuMedia-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Object">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-ChainFrames">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChainFrames</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-UnhainFrames">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UnhainFrames</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuObject-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-FrameDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FrameDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Page">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-InsertSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DuplicateSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DeleteSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ModifyPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ModifyPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-SlideSetup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-SelectBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-PresentationLayout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationLayout</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-HideSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HideSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ShowSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-RenameSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ImportSlideFromFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImportSlideFromFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-SummaryPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SummaryPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ExpandPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExpandPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-MoveSlideUp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-MoveSlideDown">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideDown</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Reference">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-InsertFootnoteDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertFootnoteDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReference-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-AddressBookSource">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddressBookSource</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReference-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateAll">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateAll</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-Repaginate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Repaginate</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateFields">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateFields</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateAllIndexes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateAllIndexes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateCurIndex">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateCurIndex</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateAllLinks">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateAllLinks</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateCharts">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateCharts</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-CalculateSel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CalculateSel</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellOnline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellOnline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ThesaurusDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetLanguageAllTextMenu</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-Hyphenation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Hyphenation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ChineseConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChineseConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HangulHanjaConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-MoreDictionaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoreDictionaries</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-AutoFormat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AutoFormat</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-InsertRowDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-InsertColumnDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertColumnDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetRowHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetRowHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetOptimalRowHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetOptimalRowHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-DistributeRows">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeRows</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetColumnWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetColumnWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetOptimalColumnWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetOptimalColumnWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-DistributeColumns">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeColumns</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-Protect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Protect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-UnsetCellsReadOnly">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UnsetCellsReadOnly</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-HeadingRowsRepeat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HeadingRowsRepeat</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-RowSplit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RowSplit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-ConvertTextToTable">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertTextToTable</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-ConvertTableToText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertTableToText</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-TableSort">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableSort</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-MergeTable">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MergeTable</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-TableNumberRecognition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableNumberRecognition</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-TableBoundaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableBoundaries</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-Shadowed1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-OutlineFont1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutlineFont</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-Overline1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Overline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToUpper1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToUpper</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToLower1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToLower</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseRotateCase1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseRotateCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToSentenceCase1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToSentenceCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToTitleCase1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToTitleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToToggleCase1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToToggleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertNonBreakingSpace1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertNonBreakingSpace</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertHardHyphen1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertHardHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertSoftHyphen1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSoftHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertZWSP1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertZWSP</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertWJ1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertWJ</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertLRM1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertLRM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertRLM1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRLM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-FontDialog1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ParagraphDialog1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ParaLeftToRight1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ParaRightToLeft1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Tools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-RunMacro">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RunMacro</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-MacroRecorder">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroRecorder</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-BasicIDEAppear">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicIDEAppear</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-MacroOrganizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroOrganizer?TabId:short=1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-MacroSignature">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroSignature</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-ScriptOrganizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ScriptOrganizer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-DevTools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DevelopmentToolsDockingWindow</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTools-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-ImageMapDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-BmpMask">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BmpMask</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTools-Separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-ViewDataSourceBrowser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ViewDataSourceBrowser</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-OpenXMLFilterSettings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OpenXMLFilterSettings</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTools-Separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-PackageManagerDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-OptionsTreeDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OptionsTreeDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-PageMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PageMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-MasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Menubar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Menubar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Sidebar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-StatusBarVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:StatusBarVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-LeftPaneImpress">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:LeftPaneImpress</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ToggleTabBarVisibility">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleTabBarVisibility</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ShowRuler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-GridUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-GridFront">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-HelplinesVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom50Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom50Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom75Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom75Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom100Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom100Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom150Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom150Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom200Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom200Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomPrevious">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomPrevious</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomNext">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomNext</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomObjects</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkImage" id="RecentFilesImg1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/sc_recentfilelist.png</property>
+ </object>
+ <object class="GtkImage" id="changebezierImg">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_changebezier.png</property>
+ </object>
+ <object class="GtkImage" id="paragraphstylei">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_insertfieldctrl.png</property>
+ </object>
+ <object class="GtkGrid" id="NotebookBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarTabControl" id="ContextContainer">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="File Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="File">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-New">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkMenuToolButton" id="File-AddDirect">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AddDirect</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-New1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-NewDoc1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NewDoc</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-SaveAsTemplate1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveAsTemplate</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Open">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="File-Open">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Open</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Open1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="File-RecentFileList1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="action_name">.uno:RecentFileList</property>
+ <property name="image">RecentFilesImg1</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-OpenRemote1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenRemote</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Save">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="File-Save">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Save</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Save1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-SaveAs1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveAs</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-SaveAsRemote1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveAsRemote</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Export">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator93">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom66">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="File-ExportTo">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExportTo</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Export1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-ExportDirectToPDF1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExportDirectToPDF</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-SendMail">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendMail</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Print">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="File-Print">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Print</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Print1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-PrintDefault1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PrintDefault</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-PrintPreview1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PrintPreview</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Property">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="File-SetDocumentProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDocumentProperties</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Property1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-Signature1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Signature</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-SignPDF1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SignPDF</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="File-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom80">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="File-CloseDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CloseDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="File-HelpIndex">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelpIndex</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-end">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="File-FileButton:Menu File">
+ <property name="label" translatable="yes" context="drawnotebookbar|FileLabel">_File</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="File-HelpButton:Menu Help">
+ <property name="label" translatable="yes" context="drawnotebookbar|HelpMenuButton">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin-start">5</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="FileLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|FileLabel">~File</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Home Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Home">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Clipboard">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom87">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-Paste">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Cut">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Cut</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Copy">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Copy</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Style">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-FormatPaintbrush">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-SetDefault">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-DrawColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Home-DesignerDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DesignerDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-DrawColor1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatLine4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatArea4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-DrawColor2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle2">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom136">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle3">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom140">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-DrawText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom97">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Text">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-VerticalText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Line">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Polygon_Unfilled">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Polygon_Unfilled</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Bezier_Unfilled">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bezier_Unfilled</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-BasicShapes.rectangle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.rectangle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-BasicShapes.ellipse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.ellipse</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-DrawCaption">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DrawCaption</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-LineToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Draw2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkToolButton" id="Home-ArrowShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-ConnectorToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkToolButton" id="Home-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Objects3DToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Draw1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator95">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkToolButton" id="Home-BasicShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-SymbolShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkToolButton" id="Home-StarShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-CalloutShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Home-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-GridVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-HelplinesVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-HelplinesMove">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesMove</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA27">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-GlueInsertPoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueInsertPoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB24">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA24">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB27">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-InsertPage">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-InsertObjectChart">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="InsertTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Transform">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA34">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB35">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-DistributeSelection">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Home-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="PasteBox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Home-HomeButton:Menu Home">
+ <property name="label" translatable="yes" context="drawnotebookbar|HomeMenuButton">_Home</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Home-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Findbar">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="HomeLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|HomeLabel">~Home</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-default"/>
+ <class name="context-any"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Insert Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Slide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Slide1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB19">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-DuplicatePage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DuplicatePage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA20">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-ImportFromFile">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImportFromFile</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InserTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertObjectChart">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom65">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-Gallery">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Gallery</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-PhotoAlbumDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PhotoAlbumDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Media">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom103">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertAVMedia">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAVMedia</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Hyperlink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-HyperlinkDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HyperlinkDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Hyperlink1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertObjectFloatingFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObjectFloatingFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-CapturePoint">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-FontWork">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-FontWork1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA16">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-DrawCaption">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DrawCaption</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB22">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertLayer">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertLayer</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Field">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Insert-FieldButton:Menu Field">
+ <property name="label" translatable="yes" context="drawnotebookbar|FieldMenuButton">Fiel_d</property>
+ <property name="width_request">70</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:FieldMenu</property>
+ <property name="image">paragraphstylei</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="image_position">top</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Symbol">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom105">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-CharmapControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharmapControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Symbol1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertMath">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMath</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-EmojiControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EmojiControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Insert-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Insert-InsertButton:Menu Insert">
+ <property name="label" translatable="yes" context="drawnotebookbar|InsertMenuButton">_Insert</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertGraphic1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertPage1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Insert-InsertTable1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="InsertLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|InsertLabel">~Insert</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Page Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Page">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Page-Section-Format">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Page-PageSetup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PageSetup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Slide-HeaderAndFooter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HeaderAndFooter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Page-Section-Format1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-SelectBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-SaveBackground">
+ <property name="visible">True</property>
+ <property name="halign">start</property>
+ <property name="action_name">.uno:SaveBackground</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Page-Section-InsertPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Page-InsertPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Page-Section-InsertPage1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-DuplicatePage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DuplicatePage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-DeletePage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeletePage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Page-Section-ShowPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Page-RenamePage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RenamePage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Page-Section-ShowPage1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA23">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-HideSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HideSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB25">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-ShowSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Page-Section-Navigation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA21">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-MovePageUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MovePageUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB23">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-MovePageDown">
+ <property name="visible">True</property>
+ <property name="halign">start</property>
+ <property name="action_name">.uno:MovePageDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Page-Section-MasterSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom45">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Page-PresentationLayout">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Page-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom81">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Page-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Page-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA17">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB16">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Page-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Page-PageButton:Menu Page">
+ <property name="label" translatable="yes" context="drawnotebookbar|PageMenuButton">_Layout</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Page-AssignLayout">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:PageSetup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="PageLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|PageLabel">~Layout</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Review Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Language">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom67">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Review-SpellDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Review-ThesaurusDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ThesaurusDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Language1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA19">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-SpellOnline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellOnline</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB20">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-Hyphenation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Hyphenation</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Annotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom69">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Review-InsertAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Annotation1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-NextAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NextAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-PreviousAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PreviousAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Annotation2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-DeleteAnnotions">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-DeleteAllAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteAllAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Annotation3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom79">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Review-ShowAnnotations">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowAnnotations</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-RedactDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom119">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Review-RedactDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RedactDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-EditDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom75">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Review-EditDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EditDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Reference-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Review-ReviewButton:Menu Review">
+ <property name="label" translatable="yes" context="drawnotebookbar|ReviewMenuButton">_Review</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Review-AcceptTrackedChanges">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ReviewLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|ReviewLabel">~Review</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="View Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-PageMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PageMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-View1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom82">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-MasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Zoom">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator120">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom78">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Zoom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA28">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomPrevious">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPrevious</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB29">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Zoom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomNext">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomNext</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomPageWidth">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPageWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-Sidebar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ShowRuler">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-GridVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Menubar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Menubar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-LeftPaneDraw">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPaneDraw</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Gluepoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom92">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-GlueEditMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueEditMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Gluepoint1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-GlueInsertPoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueInsertPoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="View-GluePercent">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GluePercent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="View-GlueEscapeDirectionTop">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueEscapeDirectionTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-GlueEscapeDirectionLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueEscapeDirectionLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="View-GlueEscapeDirectionRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueEscapeDirectionRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="View-GlueEscapeDirectionBottom">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueEscapeDirectionBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Gluepoint2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-GlueHorzAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueHorzAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="View-GlueHorzAlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueHorzAlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="View-GlueHorzAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueHorzAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-GlueVertAlignTop">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueVertAlignTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="View-GlueVertAlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueVertAlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="View-GlueVertAlignBottom">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueVertAlignBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-DisplayQuality">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom86">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-DisplayQuality1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutputQualityBlackWhite">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutputQualityBlackWhite</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-New">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom88">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-NewWindow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NewWindow</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="View-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="ViewMenu2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="View-ViewButton:Menu View">
+ <property name="label" translatable="yes" context="drawnotebookbar|ViewMenuButton">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="View-Zoom">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator126">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ViewLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|ViewLabel">~View</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Text Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-PasteBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Paste">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA22">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Cut">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Cut</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB21">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Copy">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Copy</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Style">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-FormatPaintbrush">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-SetDefault">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Format">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="font">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkToolButton" id="Home-CharFontName">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="fontheight">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin-start">5</property>
+ <child>
+ <object class="GtkToolButton" id="Home-FontHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Grow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Shrink">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Bold">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Italic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Underline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Strikeout">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Shadowed">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-Spacing">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Spacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-CharBackColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-Color">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Paragraph">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator102">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="GroupB16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-CellVertTop">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-CellVertCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-CellVertBottom">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-LeftPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-CenterPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-RightPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Paragraph3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="GroupB81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom98">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-DefaultBullet1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom145">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-JustifyPara1">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Paragraph2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="GroupB76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom94">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-DefaultNumbering1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-IncrementIndent1">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:IncrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-DecrementIndent1">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:DecrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom141">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-LineSpacing1">
+ <property name="visible">True</property>
+ <property name="halign">end</property>
+ <property name="action_name">.uno:LineSpacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-ParaspaceIncrease1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-ParaspaceDecrease1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Paragraph1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom143">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom144">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Style1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom101">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-StyleApply">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="StyleParagraphSection1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-DesignerDialog">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:DesignerDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom93">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-StandardStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply?Style:string=Text&amp;FamilyName:string=ParagraphStyles</property>
+ <property name="icon_name">cmd/sc_defaultcharstyle.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Title">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply?Style:string=Title&amp;FamilyName:string=ParagraphStyles</property>
+ <property name="icon_name">cmd/sc_titleparastyle.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Heading">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply?Style:string=Heading&amp;FamilyName:string=ParagraphStyles</property>
+ <property name="icon_name">cmd/sc_heading1parastyle.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-EditStyle">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:EditStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-TextArrangement">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Text-TextAttributes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TextAttributes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-TextArrangement1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-TransformDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB17">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-DrawCaption">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DrawCaption</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Text-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Text-TextBotton:Menu Text">
+ <property name="label" translatable="yes" context="drawnotebookbar|TextMenuButton">T_ext</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Text-SearchDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-TransformDialog1">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="TextLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|ReferencesLabel">T~ext</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Text"/>
+ <class name="context-DrawText"/>
+ <class name="context-TextObject"/>
+ <class name="context-Table"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Table Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Layout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Table-NameGroup">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Layout1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsBefore">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsAfter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteColumns">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteColumns</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsBefore">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsAfter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteRows">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteRows</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-SetBorderStyle">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:SetBorderStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-LineStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FrameLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FrameLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom90">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Table-MergeCells">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:MergeCells</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Merge1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Table-SplitCell">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SplitCell</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Table-SelectTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Select1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireColumn">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireColumn</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireRow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireRow</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Optimize">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Table-OptimizeTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OptimizeTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Optimize1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom84">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CellVertTop">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CellVertCenter">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CellVertBottom">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom85">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-LeftPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CenterPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-RightPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-JustifyPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Style">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDesign">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:TableDesign</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Table-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Table-TableButton:Menu Table">
+ <property name="label" translatable="yes" context="drawnotebookbar|TableMenuButton">_Table</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TableDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator118">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="TableLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|TableLabel">~Table</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Table"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Image Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Big">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Image-NameGroup">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Edit1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="SecondGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-CompressGraphic1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Crop1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-ChangePicture">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:ChangePicture</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-SaveGraphic">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatLine1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatArea1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle1">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle4">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom127">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-FormatLineArea3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first27">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-LineEndStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom134">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-ConvertButton:Menu Convert">
+ <property name="label" translatable="yes" context="drawnotebookbar|ConvertMenuButton">Convert</property>
+ <property name="width_request">70</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ <property name="image">changebezierImg</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="image_position">top</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ObjectAlign2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align16">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ObjectAlign1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator123">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Second7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-FormatImageFilter">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="GraphicFilterToolboxGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GraphicFilterToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GraphicFilterToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ColorSettings1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafLuminance">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:GrafLuminance</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafContrast">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:GrafContrast</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ColorSettings2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafTransparence">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:GrafTransparence</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafGamma">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:GrafGamma</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-GrafMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-GrafMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ColorSettings">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ColorSettings</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Image-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-GraphicButton:Menu Image">
+ <property name="label" translatable="yes" context="drawnotebookbar|GraphicMenuButton">Ima_ge</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom83">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Image-FormatArea">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-FormatLine">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ImageLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|ImageLabel">Ima~ge</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Graphic"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Draw Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Big1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-NameGroup">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Shear">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shear</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-CrookSlant">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CrookSlant</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB99">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom124">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatPaintbrush">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom148">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-SetDefault">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-FormatLineArea3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatLine2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatArea2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-FormatLineArea4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle4">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle1">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom102">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-FormatLineArea5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-ConvertButton:Menu Convert">
+ <property name="label" translatable="yes" context="drawnotebookbar|ConvertMenuButton">Convert</property>
+ <property name="width_request">70</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ <property name="image">changebezierImg</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="image_position">top</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignUp1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-ObjectAlign1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignMiddle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignDown1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Second1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Bezier">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Bezier1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="BezierGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom71">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierMove">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierMove</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierInsert">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierInsert</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierDelete">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierDelete</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="BackgroundFront2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierCutLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierCutLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierEdge">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierEdge</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierSmooth">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierSmooth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Bezier2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="BezierGroup1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierConvert">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierConvert</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierClose">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierClose</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="BackgroundFront1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierSymmetric">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierSymmetric</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierEliminatePoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierEliminatePoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-GluePoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom91">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-GlueEditMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueEditMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-MergeCombine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom137">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Combine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Dismantle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-DistributeSelection">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom146">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Merge">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Substract">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Intersect">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Group">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator132">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatGroup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Group1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-EnterGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EnterGroup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LeaveGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeaveGroup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first38">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second39">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionDepthFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDepthFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionDirectionFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDirectionFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-Extrusion3DColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Extrusion3DColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-ExtrusionSurfaceFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionSurfaceFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Fontwork">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Fontwork1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom108">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkShapeType">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkShapeType</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkSameLetterHeights">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkSameLetterHeights</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom100">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkAlignmentFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkAlignmentFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkCharacterSpacingFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkCharacterSpacingFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Draw-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-DrawButton:Menu Draw">
+ <property name="label" translatable="yes" context="drawnotebookbar|DrawMenuButton">_Draw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatArea">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatLine">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="DrawLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|DrawLabel">~Draw</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Draw"/>
+ <class name="context-DrawLine"/>
+ <class name="context-MultiObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Object Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Object">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Big2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Object-NameGroup">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-Shear">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shear</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-CrookSlant">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CrookSlant</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatLine3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatArea3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-XLineStyle5">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ObjectLineWidth2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom128">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-LineEndStyle5">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-XLineColor4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom133">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FillStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-LineEndStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Object-ConvertButton:Menu Convert">
+ <property name="label" translatable="yes" context="drawnotebookbar|ConvertMenuButton">Convert</property>
+ <property name="width_request">70</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ <property name="image">changebezierImg</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="image_position">top</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-ObjectAlign1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first17">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Second2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Object-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Object-ObjectButton:Menu Object">
+ <property name="label" translatable="yes" context="drawnotebookbar|ObjectMenuButton">_Object</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatArea">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatLine">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ObjectLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|ObjectLabel">~Object</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Frame"/>
+ <class name="context-OLE"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">10</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Media Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Media">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Media-NameGroup">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom28">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom138">
+ <property name="width_request">148</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaToolBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaToolBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom139">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaPlayer1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Second3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-ObjectAlign1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align17">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectAlignLeft1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignCenter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectAlignRight1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignUp1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignDown1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignMiddle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Media-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="media:Menu Media">
+ <property name="label" translatable="yes" context="drawnotebookbar|MediaMenuButton">_Media</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatArea">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatLine">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-TransformDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="MediaLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|MediaLabel">~Media</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Media"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">11</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Form Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Form-SwitchControlDesignMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SwitchControlDesignMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-UseWizards">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:UseWizards</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-GroupBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom114">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FormProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowFmExplorer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom64">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-TabDialog1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TabDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom109">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-OpenReadOnly1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom110">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ControlProperties2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ControlProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom111">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-AutoControlFocus2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoControlFocus</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Label1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Edit1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CheckBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RadioButton2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ListBox2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ComboBox2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom116">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-NumericField2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CurrencyField2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-PatternField2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom120">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FormattedField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-DateField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TimeField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom123">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-Pushbutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-Imagebutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-ImageControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom135">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FileControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-NavigationBar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-Grid">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Form-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="Form-Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Form-FormButton:Menu Form">
+ <property name="label" translatable="yes" context="drawnotebookbar|FormMenuButton">Fo_rm</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="FormMenu-FormProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="FormLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="DrawNotebookbar|FormLabel">Fo~rm</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Form"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="3d Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="3dObject">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Big3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-NameGroup">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom70">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom72">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-Shear">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shear</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-CrookSlant">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CrookSlant</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatLine6">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatArea6">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-XLineStyle5">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ObjectLineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom73">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-LineEndStyle5">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-XLineColor4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FillStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first16">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-LineEndStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom142">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Windows3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Big5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Window3D1">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:Window3D</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first19">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first20">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Second4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="3dObject-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="3dObject-Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="3dObject-FormButton:Menu 3d">
+ <property name="label" translatable="yes" context="DrawNotebookbar|FormMenuButton">3_d</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom76">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatArea5">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatLine5">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-TransformDialog1">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="3DObjectLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="DrawNotebookbar|FormLabel">3~d</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-3DObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Master Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Master">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom107">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-PageMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PageMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-View1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom117">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-MasterPage1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MasterPage-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom122">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MasterPage-Section-Insert1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-RenameMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-ShowHide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-HideSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HideSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-ShowSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MasterPage-Section-Property">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom125">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPageMenu-PageSetup1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PageSetup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MasterPage-Section-Background">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-SelectBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-SaveBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MasterPage-Section-CloseMasterView">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom126">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-CloseMasterView">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="MasterPage-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="MasterPage-Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Menu:Menu Master">
+ <property name="label" translatable="yes" context="DrawNotebookbar|FormMenuButton">_Master</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom106">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPageMenu-PageSetup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PageSetup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="MasterLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="DrawNotebookbar|MasterLabel">~Master</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-MasterPage"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Extension Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Extension">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="NotebookBarAddonsToolMergePoint" id="AddonCommand">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Extension-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="Extension-Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Extension-ExtensionButton:Menu Addons">
+ <property name="label" translatable="yes" context="drawnotebookbar|FormMenuButton">E_xtension</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom68">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ExtensionLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|ExtensionLabel">E~xtension</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Tools Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Tools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Macro">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom130">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RunMacro">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RunMacro</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Macro1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA25">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-BasicIDEAppear">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicIDEAppear</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB26">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-MacroDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MacroDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Presentation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom131">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-BmpMask">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BmpMask</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Presentation1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom132">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator141">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom96">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-SwitchControlDesignMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SwitchControlDesignMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-UseWizards1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:UseWizards</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-GroupBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator142">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom99">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Label">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Edit">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CheckBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom77">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RadioButton1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ListBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ComboBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom89">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-NumericField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CurrencyField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-PatternField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom95">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FormattedField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-DateField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TimeField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator144">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom104">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Pushbutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Imagebutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ImageControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom118">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FileControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-NavigationBar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Grid">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom121">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FormProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TabDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TabDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ControlProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ControlProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom129">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowFmExplorer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-OpenReadOnly">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-AutoControlFocus">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoControlFocus</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Tools-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="ViewMenu3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Tools-ToolsButton:Menu Tools">
+ <property name="label" translatable="yes" context="drawnotebookbar|ToolsMenuButton">_Tools</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom147">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-OptionsTreeDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OptionsTreeDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="DevLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="drawnotebookbar|DevLabel">~Tools</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/notebookbar_compact.ui b/sd/uiconfig/sdraw/ui/notebookbar_compact.ui
new file mode 100644
index 000000000..ebdb5b741
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/notebookbar_compact.ui
@@ -0,0 +1,20580 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <requires lib="LibreOffice" version="1.0"/>
+ <!-- interface-local-resource-path ../../../icon-themes/colibre/cmd/ -->
+ <object class="GtkMenu" id="Menu 3d">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="Menu3D-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltDown">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltDown</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltUp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltLeft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltRight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="Menu3D-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-Window3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Window3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="Menu3D-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Addons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">AddonCommand</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="AddonSection-Separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-MirrorVert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MirrorVert</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-MirrorHorz">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MirrorHorz</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Combine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Dismantle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Substract">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Intersect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-EqualizeWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-EqualizeHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Connect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Connect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Break">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Break</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-CopyObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CopyObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Morphing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Morphing</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ChangeBezier">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ChangePolygon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-convert_to_contour">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertInto3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertInto3DLatheFast">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertIntoBitmap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertIntoMetaFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Field">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertDateFieldFix">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertDateFieldFix</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertDateFieldVar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertDateFieldVar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertTimeFieldFix">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertTimeFieldFix</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertTimeFieldVar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertTimeFieldVar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuField-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertAuthorField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertAuthorField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertSlideField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlideField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertSlideTitleField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlideTitleField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertSlidesField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlidesField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertFileField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertFileField</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu File">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-AddDirect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddDirect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Open">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Open</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-OpenRemote">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OpenRemote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-RecentFileList">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RecentFileList</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-CloseDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-AutoPilotMenu">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AutoPilotMenu</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-OpenTemplate">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OpenTemplate</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveAsTemplate">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAsTemplate</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-NewDoc">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NewDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Reload">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Reload</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-VersionDialog">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VersionDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Save">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Save</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveAs">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAs</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveAsRemote">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAsRemote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveACopy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveACopy</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveAll">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAll</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-CheckOut">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CheckOut</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-CancelCheckOut">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CancelCheckOut</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-CheckIn">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CheckIn</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-ExportTo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportTo</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-ExportToPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportToPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-ExportDirectToPDF">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportDirectToPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SendMail">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMail</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SendMailDocAsPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMailDocAsPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-WebHtml">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WebHtml</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Print">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Print</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-PrinterSetup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrinterSetup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Signature">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Signature</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SignPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SignPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SetDocumentProperties">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetDocumentProperties</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Quit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Quit</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-CheckBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-RadioButton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ListBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ComboBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Pushbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Imagebutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-FormattedField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-DateField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-TimeField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-NumericField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-CurrencyField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-PatternField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ImageControl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-FileControl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-NavigationBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Help">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-HelpIndex">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelpIndex</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-ExtendedHelp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtendedHelp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-Documentation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Documentation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-QuestionAnswers">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:QuestionAnswers</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-SendFeedback">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendFeedback</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-SafeMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SafeMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-GetInvolved">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GetInvolved</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-Donation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Donation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-ShowLicense">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowLicense</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-About">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:About</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Home">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-FocusToFindbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-SearchDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-RestoreEditingView">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RestoreEditingView</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ImageCrop">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ExternalEdit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExternalEdit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ChangePicture">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePicture</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-CompressGraphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-SaveGraphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuImage-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-OriginalSize">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OriginalSize</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ImageMapDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuImage-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuImage-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-PhotoAlbumDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PhotoAlbumDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-AnimationObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AnimationObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-Gallery">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Gallery</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-TwainSelect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TwainSelect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertAVMedia">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertAVMedia</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertQrCode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertQrCode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertObject">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObject</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-ImportFromFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImportFromFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertMath">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMath</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-DrawText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-VerticalText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertObjectFloatingFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObjectFloatingFrame</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-HyperlinkDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HyperlinkDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-CapturePoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertPageField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertPageField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertPagesField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertPagesField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-HeaderAndFooter">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HeaderAndFooter</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Layout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-InsertSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DuplicateSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ImportSlideFromFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImportSlideFromFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-RenameSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DeleteSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-PresentationLayout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationLayout</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-HideSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HideSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ShowSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-SummaryPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SummaryPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ExpandPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExpandPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-MoveSlideUp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-MoveSlideDown">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideDown</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ModifyPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ModifyPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-SlideSetup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Master">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="InsertMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RenameMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CloseMasterViewD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Media">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuMedia-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-RenameObject">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameObject</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuMedia-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-EditHyperlink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EditHyperlink</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-RemoveHyperlink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RemoveHyperlink</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-OpenHyperlinkOnCursor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OpenHyperlinkOnCursor</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Object">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-ChainFrames">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChainFrames</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-UnhainFrames">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UnhainFrames</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuObject-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-FrameDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FrameDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Reference">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-InsertFootnoteDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertFootnoteDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReference-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-AddressBookSource">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddressBookSource</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReference-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateAll">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateAll</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-Repaginate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Repaginate</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateFields">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateFields</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateAllIndexes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateAllIndexes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateCurIndex">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateCurIndex</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateAllLinks">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateAllLinks</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateCharts">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateCharts</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-CalculateSel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CalculateSel</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellOnline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellOnline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ThesaurusDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetLanguageAllTextMenu</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-Hyphenation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Hyphenation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ChineseConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChineseConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HangulHanjaConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-MoreDictionaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoreDictionaries</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-AutoFormat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AutoFormat</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-InsertRowDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-InsertColumnDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertColumnDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetRowHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetRowHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetOptimalRowHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetOptimalRowHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-DistributeRows">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeRows</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetColumnWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetColumnWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetOptimalColumnWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetOptimalColumnWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-DistributeColumns">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeColumns</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-Protect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Protect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-UnsetCellsReadOnly">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UnsetCellsReadOnly</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-HeadingRowsRepeat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HeadingRowsRepeat</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-RowSplit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RowSplit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-ConvertTextToTable">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertTextToTable</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-ConvertTableToText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertTableToText</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-TableSort">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableSort</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-MergeTable">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MergeTable</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-TableNumberRecognition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableNumberRecognition</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-TableBoundaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableBoundaries</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-Shadowed">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-OutlineFont">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutlineFont</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-Overline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Overline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuText-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ChangeCaseToUpper">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToUpper</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ChangeCaseToLower">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToLower</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ChangeCaseRotateCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseRotateCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuText-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ChangeCaseToSentenceCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToSentenceCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ChangeCaseToTitleCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToTitleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ChangeCaseToToggleCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToToggleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuText-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertNonBreakingSpace">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertNonBreakingSpace</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertHardHyphen">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertHardHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertSoftHyphen">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSoftHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertZWSP">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertZWSP</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertWJ">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertWJ</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertLRM">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertLRM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertRLM">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRLM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuText-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuText-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-FontDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-OutlineBullet">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutlineBullet</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuText-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-TextAttributes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TextAttributes</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Tools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-RunMacro">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RunMacro</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-MacroRecorder">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroRecorder</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-BasicIDEAppear">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicIDEAppear</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-MacroOrganizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroOrganizer?TabId:short=1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-MacroSignature">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroSignature</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-ScriptOrganizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ScriptOrganizer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTools-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-ImageMapDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-BmpMask">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BmpMask</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTools-Separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-ViewDataSourceBrowser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ViewDataSourceBrowser</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-OpenXMLFilterSettings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OpenXMLFilterSettings</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTools-Separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-PackageManagerDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-OptionsTreeDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OptionsTreeDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-PageMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PageMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-MasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Menubar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Menubar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Sidebar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-StatusBarVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:StatusBarVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-LeftPaneImpress">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:LeftPaneImpress</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ToggleTabBarVisibility">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleTabBarVisibility</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ShowRuler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-GridUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-GridFront">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-HelplinesVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom50Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom50Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom75Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom75Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom100Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom100Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom150Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom150Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom200Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom200Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomPrevious">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomPrevious</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomNext">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomNext</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomObjects</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkImage" id="paragraphstylei">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/sc_insertfieldctrl.png</property>
+ </object>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="NotebookBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarTabControl" id="ContextContainer">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="File Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="File">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="NewSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Files-New">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AddDirect</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="NewDocSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom101">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Files-NewDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NewDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OpenSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Files-Open">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Open</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OpenRemoteSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom102">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Files-OpenRemote">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenRemote</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SaveSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom86">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Files-Save">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Save</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SaveAsSection1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom103">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Files-SaveAs">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveAs</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="ExportToSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom87">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="Files-ExportTo">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExportTo</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="ExportToPDFSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom104">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="Files-ExportDirectToPDF">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExportDirectToPDF</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SendMailSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="Files-SendMail">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendMail</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="PrintSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom105">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="Files-Print">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Print</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="PrintDefaultSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom106">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="Files-PrintDefault">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PrintDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="PrinterSetupSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="PrinterSetup">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:PrinterSetup</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SetDocumentPropertiesSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExportGroup3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Files-SetDocumentProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDocumentProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="File-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="CloseDoc">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:CloseDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="File-FileButton:Menu File">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|FileMenuButton">_File</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="FileLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|FileLabel">~File</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Home Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Home">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Clipboard">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-Paste">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Cut">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Cut</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Copy">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Copy</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom93">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillStyle4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea6">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatLine2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-XLineColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Default-XLineStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-LineWidth2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Line5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-LineEndStyle1">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatLine3">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-TextBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Text">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-VerticalText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Line">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Line">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-BasicShapes.rectangle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.rectangle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Line6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom177">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-BasicShapes.ellipse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.ellipse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-DrawCaption">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DrawCaption</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-LineToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-LineToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ConnectorToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-20"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-BasicShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-BasicShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SymbolShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ArrowShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-19"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-StarShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-CalloutShapes">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-FlowChartShapes1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Objects3DToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-StyleApply2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-CapturePoint1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Insert1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom133">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Default-InsertTable2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Zoom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator108">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-ZoomPrevious">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPrevious</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ZoomPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Zoom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-GridVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-HelplinesVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Snap1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator109">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">24</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Snap2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Home-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-SearchDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Home-HomeButton:Menu Home">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|HomeMenuButton">_Home</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="HomeLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|HomeLabel">~Home</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-default"/>
+ <class name="context-any"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Insert Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Page">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Duplicate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom151">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-DuplicatePage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DuplicatePage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom150">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Insert-InsertTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Chart">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertObjectChart">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-OLE">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom127">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Graphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Gallery">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom152">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-Gallery">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Gallery</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-PhotoAlbumDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-PhotoAlbumDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PhotoAlbumDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-AVMedia">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator105">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom153">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertAVMedia">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAVMedia</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Hyperlink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-HyperlinkDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HyperlinkDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-CapturePoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom156">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="InsertObjectFloatingFrameSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom129">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertObjectFloatingFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObjectFloatingFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Field">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Insert-FieldButton:Menu Field">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|FieldMenuButton">Fiel_d</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:FieldMenu</property>
+ <property name="image">paragraphstylei</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-DrawText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-DrawText1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-VerticalText1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-LineToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator101">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-LineToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-ConnectorToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-BasicShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator119">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-BasicShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-SymbolShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-ArrowShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator120">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-StarShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-CalloutShapes">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-FlowChartShapes1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-Objects3DToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Symbol">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-CharmapControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharmapControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Formula">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom128">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertMath">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMath</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Emoji">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-EmojiControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EmojiControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Insert-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertSlide1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Insert-InsertButton:Menu Insert">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|InsertMenuButton">_Insert</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="InsertLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|InsertLabel">~Insert</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Layout Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Layout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-PageLayout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-PageSetup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PageSetup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-Background">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-SelectBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-Background1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom131">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-SaveBackground1">
+ <property name="visible">True</property>
+ <property name="halign">start</property>
+ <property name="action_name">.uno:SaveBackground</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-DeletePage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-DeletePage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeletePage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-HideSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HideSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-ShowSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-ShowSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-MovePage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="Page-MovePageUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MovePageUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-MovePage1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkToolButton" id="Page-MovePageDown1">
+ <property name="visible">True</property>
+ <property name="halign">start</property>
+ <property name="action_name">.uno:MovePageDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-PresentationLayout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-PresentationLayout">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-SelectGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator135">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom223">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Layout-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-SelectGroup1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom224">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Layout-FormatGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator100">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom80">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom97">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator104">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom130">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Layout-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Layout-PageSetup">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:PageSetup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Layout-PageButton:Menu Layout">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|LayoutMenuButton">Layout</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="LayoutLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|LayoutLabel">~Layout</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Review Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Language">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-SpellDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-SpellOnline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom134">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-SpellOnline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellOnline</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-ThesaurusDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom85">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-ThesaurusDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ThesaurusDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Hyphenation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom155">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-Hyphenation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Hyphenation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-InsertAnnotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom118">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-InsertAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-PreviousAnnotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-PreviousAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PreviousAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-NextAnnotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom119">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-NextAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NextAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-DeleteAnnotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom120">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-DeleteAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-DeleteAllAnnotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-DeleteAllAnnotation">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:DeleteAllAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-ShowAnnotations">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator97">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-ShowAnnotations">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowAnnotations</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Redact">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator136">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom225">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-RedactDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RedactDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Review-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-AcceptTrackedChanges">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Review-ReviewButton:Menu Review">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|ReviewMenuButton">_Review</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator150">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ReviewLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|ReviewLabel">~Review</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="View Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="View-Sections-Views">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom107">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-PageMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PageMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="View-MasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Sections-Zoom">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom110">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomPanning">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPanning</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Sections-Zoom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomPrevious">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPrevious</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Sections-Zoom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomNext">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomNext</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator112">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Navigator">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Navigator</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom109">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Rulers">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom199">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-GridVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Bars">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator141">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Menubar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Menubar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Bars1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom200">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Sidebar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Zoom">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom201">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomOptimal1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomOptimal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Zoom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom202">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Zoom100Percent1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Zoom100Percent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Zoom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom203">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-FullScreen">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FullScreen</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Sections-NewWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom111">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-NewWindow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NewWindow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-EditDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator102">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom198">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-EditDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EditDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="View-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom28">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Zoom">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="View-ViewButton:Menu View">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|ViewMenuButton">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ViewLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|ViewLabel">~View</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Text Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Clipboard">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom182">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-Paste1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom183">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Cut1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Cut</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Copy1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Copy</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Paintbrush">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-FormatPaintbrush">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-ResetAttributes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillShadow2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatLine1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-XLineColor2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Default-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatLine4">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FontName">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-CharFontName">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-24"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FontHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-FontHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-23"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-GrawShrink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Grow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Shrink">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-22"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-BoldItalic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Bold">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Italic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Underline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Strikeout">
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Shadowed">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-SubSuperScript">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-SubScript">
+ <property name="action_name">.uno:SubScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-SuperScript">
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SuperScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-21"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FontColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Spacing">
+ <property name="action_name">.uno:Spacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-CharBackColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Color">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FontDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-FontDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-BulletNumbering">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom108">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-DefaultBullet">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-DefaultNumbering">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-SetOutline">
+ <property name="action_name">.uno:SetOutline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-IncrementDecrement">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom135">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-IncrementIndent">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:IncrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-DecrementIndent">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DecrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Para1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-LeftPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CenterPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-RightPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-JustifyPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Para2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom157">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertTop">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertBottom">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-LTR">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom158">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Spacing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom159">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-ParaspaceIncrease">
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-ParaspaceDecrease">
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-LineSpacing2">
+ <property name="action_name">.uno:LineSpacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">24</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom160">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-StyleApply">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-TextBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom161">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Text1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-VerticalText1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">26</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Text-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-TransformDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Text-TextBotton:Menu Text">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|TextMenuButton">T_ext</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="TextLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|ReferencesLabel">T~ext</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Text"/>
+ <class name="context-DrawText"/>
+ <class name="context-TextObject"/>
+ <class name="context-Table"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Table Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Paintbrush">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatPaintbrush">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetDefaul">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-AutoForma">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tabl-AutoFormat">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoFormat</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-AreaDialog1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea4">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FrameLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FrameLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-LineStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-SetBorderStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetBorderStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-BorderDialog1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TableDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontName">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CharFontName1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FontHeight1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-GrawShrink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-Grow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Shrink1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-23"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-BoldItalic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-Bold1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Italic1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Underline1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Strikeout1">
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Shadowed1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-SubSuperScript">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-SubScript">
+ <property name="action_name">.uno:SubScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SuperScript">
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SuperScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-22"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Color1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Spacing1">
+ <property name="action_name">.uno:Spacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-CharBackColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-21"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FontDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-BulletNumbering">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-DefaultBullet">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DefaultNumbering">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetOutline">
+ <property name="action_name">.uno:SetOutline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-IncrementDecrement">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-IncrementIndent1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:IncrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DecrementIndent1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DecrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Para1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-LeftPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CenterPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-RightPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-JustifyPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-20"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Para2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertTop1">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertCenter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertBottom1">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-19"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-LTR">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Spacing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaspaceIncrease">
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaspaceDecrease">
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-ParagraphDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tabl-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom136">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-StyleApply1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">27</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom140">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-MergeCells1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MergeCells</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SplitCell1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SplitCell</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-OptimizeTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OptimizeTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">28</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-AutoFormat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-AutoFormat">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:AutoFormat</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">29</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Column">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom162">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireColumn1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireColumn</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsBefore1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsAfter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteColumns1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteColumns</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">30</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Row">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireRow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireRow</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsBefore1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsAfter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteRows1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteRows</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">31</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-TableDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDialog2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TableDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">32</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom163">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CharmapControl1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharmapControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">33</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Table-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom76">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TableDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Table-TableButton:Menu Table">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|TableMenuButton">T_able</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator170">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="TableLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|TableLabel">~Table</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Table"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Image Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkBox" id="GraphicPasteBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom186">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom187">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-Forward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-Backward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom164">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-StyleApply3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Crop">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-Crop">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-SaveReplace">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ChangePicture">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ChangePicture</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-CompressGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-SaveGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-GraphicFilterToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom165">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-GraphicFilterToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GraphicFilterToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-ColorSettings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom166">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ColorSettings">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ColorSettings</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">24</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-GrafMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-GrafMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-GrafTransparence">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom167">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-GrafTransparence">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafTransparence</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">26</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Transformations">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator134">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom222">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphi-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">29</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Image-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-GraphicButton:Menu Image">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|ImageMenuButton">Image</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator187">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="GraphicLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|ImageLabel">Ima~ge</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Graphic"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Draw Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkBox" id="MultiObject-Section-PasteBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom188">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom189">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Format">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-CloneTool">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ClearDirectFormatting">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObjec-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="MultiObject-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-LineEndStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="MultiObject-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="MultiObject-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Forward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Backward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom168">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom169">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-StyleApply3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Combine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom170">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Combine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Dismantle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Merge">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Substract">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Intersect">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-DistributeSelection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-DistributeSelection">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">24</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Transformations1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator125">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom211">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Mirror">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Mirror</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-22"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Transformations2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator126">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom212">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ConvertInto3DLathe">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConvertInto3DLathe</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-CrookRotate">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CrookRotate</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-CrookSlant">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CrookSlant</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-21"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">26</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Transformations3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator133">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom221">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Shear">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shear</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-InteractiveTransparence">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InteractiveTransparence</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-InteractiveGradient">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InteractiveGradient</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-20"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">27</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-EditPoints">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator127">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom210">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-19"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">28</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator121">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">30</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-3D1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom117">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionDepthFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDepthFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionDirectionFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDirectionFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">31</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-3D2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom154">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-Extrusion3DColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Extrusion3DColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-ExtrusionSurfaceFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionSurfaceFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">32</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Fontwork">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator124">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom207">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">33</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Fontwork1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom208">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkShapeType">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkShapeType</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkSameLetterHeights">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkSameLetterHeights</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">34</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Fontwork2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom209">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkAlignmentFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkAlignmentFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkCharacterSpacingFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkCharacterSpacingFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">35</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Draw-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-DrawButton:Menu Draw">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|DrawMenuButton">D_raw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="Context-Draw"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ShapeLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|ShapeLabel">~Draw</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Draw"/>
+ <class name="context-DrawLine"/>
+ <class name="context-MultiObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Object Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Object">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Advanced">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom190">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Frame-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom191">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Frame-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Frame-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom94">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom95">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom98">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Objec-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatArea1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-XLineStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-LineWidth">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatLine3">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom99">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom100">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator93">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom175">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ReverseOrder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator94">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom176">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-StyleApply">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Object-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Object-ObjectButton:Menu Object">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|ObjectMenuButton">Object</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator114">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="Context-Frame"/>
+ <class name="Context-OLE"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="FrameLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|FrameLabel">~Object</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Frame"/>
+ <class name="context-OLE"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">10</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Media Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Media">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Advanced">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom192">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom193">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom132">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Media-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Media-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Media-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom138">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-Forward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom139">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-Backward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom171">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom172">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom173">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-StyleApply3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox">
+ <property name="width_request">167</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom174">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaToolBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaToolBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-TransformDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Media-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom64">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="media:Menu Media">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|MediaButton">_Media</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Media"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="MediaLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|MediaLabel">~Media</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Media"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">11</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Form Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom114">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="For-SwitchControlDesignMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SwitchControlDesignMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-UseWizards">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:UseWizards</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Form-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignUp4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignMiddle4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignDown4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignCenter4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ObjectAlignRight4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator99">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Form-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-Forward3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-Backward3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-SendToBack3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator106">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-BeforeObject1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-BehindObject1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ControlProperties">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ControlProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ControlProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Properties">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FormProperties1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowFmExplorer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-TabDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-TabDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TabDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-OpenReadOnly">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom116">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-OpenReadOnly">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-AutoControlFocus">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-AutoControlFocus">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoControlFocus</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-LabelCheckbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom213">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Label1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Edit1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CheckBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-LabelCheckbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom214">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RadioButton1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ListBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ComboBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Buttons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom215">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Pushbutton1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Imagebutton1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Farmatted">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator107">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom216">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FormattedField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-DateField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TimeField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Farmatted1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom217">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-NumericField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CurrencyField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-PatternField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-GroupBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator129">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom218">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-GroupBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Controls">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator130">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom219">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-ImageControl1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-FileControl1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-GridNavigationBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator132">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom220">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Grid1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-NavigationBar1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Form-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom121">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="form:Menu Form">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|FormButton">Fo_rm</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator115">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Form"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="FormLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|FormLabel">Fo~rm</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Form"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Master Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Master">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Master-Sections-Views">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom195">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-PageMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PageMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="View-MasterPage1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Rename">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-RenameMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Dialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-PageSetup">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:PageSetup</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-SelectBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-SelectBackground">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-SaveBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Anchor2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-SaveBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator95">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-ViewMenu">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ViewMenu</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-PageMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-PageMode">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:PageMode</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Close">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator98">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Anchor6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-CloseMasterView">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="MasterPage-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom84">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-PageSetup">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:PageSetup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Menu:Menu Master">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|PrintPreviewButton">_Master</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator103">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="MasterPageLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|FormLabel">~Master</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-MasterPage"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">13</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="3d Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="3d">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Window3d">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom194">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3D-Window3D">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Window3D</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator110">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator111">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObjec-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3DObject-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator113">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator116">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom123">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-Forward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom124">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-Backward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator117">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom125">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom180">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator118">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom181">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-StyleApply3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="3d-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom126">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-3D:Menu 3d">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|FormButton">3_d</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator122">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Form"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="3DLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|FormLabel">3~d</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-3DObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Extension Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Extension">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="NotebookBarAddonsToolMergePoint" id="AddonCommand">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Extension-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="Extension-Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom122">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="ExtensionMenu-ExtensionDialog">
+ <property name="visible">True</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Extension-ExtensionButton:Menu Addons">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|ExtensionMenuButton">E_xtension</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ExtensionLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|ExtensionLabel">E~xtension</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Tools Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Tools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Macro">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom137">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RunMacro">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RunMacro</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-BasicIDEAppear">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicIDEAppear</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Macro1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom204">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-MacroDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MacroDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-BmpMask">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator128">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom141">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-BmpMask">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BmpMask</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-ImageMapDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom196">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-ImageMapDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom197">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-DesignMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator123">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom142">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-SwitchControlDesignMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SwitchControlDesignMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-Wizard">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom143">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-UseWizards">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:UseWizards</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-LabelCheckbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator138">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom144">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Label">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Edit">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CheckBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-LabelCheckbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom145">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RadioButton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ListBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ComboBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-Buttons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator144">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom146">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Pushbutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Imagebutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-Farmatted">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator145">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom147">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FormattedField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-DateField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TimeField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-Farmatted1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom148">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-NumericField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CurrencyField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-PatternField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-GroupBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator146">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom149">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-GroupBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-Controls">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator131">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom178">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-ImageControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-FileControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-GridNavigationBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator152">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom179">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Grid">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-NavigationBar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-TabDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator154">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom205">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-ShowFmExplore">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowFmExplorer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TabDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TabDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-ReadOnly">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator158">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom206">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-OpenReadOnly">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-AutoControlFocus">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoControlFocus</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Tools-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom184">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OptionsTreeDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Tools-ToolsButton:Menu Tools">
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|ToolsMenuButton">_Tools</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator137">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ToolLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_draw_compact|DevLabel">~Tools</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/notebookbar_groupedbar_compact.ui b/sd/uiconfig/sdraw/ui/notebookbar_groupedbar_compact.ui
new file mode 100644
index 000000000..489b787cb
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/notebookbar_groupedbar_compact.ui
@@ -0,0 +1,14160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <requires lib="LibreOffice" version="1.0"/>
+ <object class="GtkMenu" id="Menu 3d">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="Menu3D-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltDown">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltDown</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltUp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltLeft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltRight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="Menu3D-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-Window3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Window3D</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Addons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">AddonCommand</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="AddonSection-Separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="WrapOffD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapOff</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapOnD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapOn</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapIdealD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapIdeal</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapLeftD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapRightD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapThroughD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapThrough</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapThroughTransparentD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapThroughTransparent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapContourD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapContour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapAnchorOnlyD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapAnchorOnly</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="TextWrapD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TextWrap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator132">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SetObjectToForegroundD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetObjectToForeground</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SetObjectToBackgroundD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetObjectToBackground</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Calculate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="TableSortD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableSort</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AutoSumD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AutoSum</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Line">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-BasicShapes.rectangle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicShapes.rectangle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-BasicShapes.ellipse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicShapes.ellipse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-DrawCaption">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DrawCaption</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-VerticalCaption">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VerticalCaption</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-DrawText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-VerticalText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-LineToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConnectorToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-BasicShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-SymbolShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ArrowShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-CalloutShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-StarShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Objects3DToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-AddTextBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddTextBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Text_Marquee">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Text_Marquee</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-Repeat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Repeat</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-Cut">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Cut</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-Copy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Copy</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-Paste">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-PasteUnformatted">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PasteUnformatted</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-PasteSpecial">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PasteSpecial</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-SelectAll">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectAll</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-FocusToFindbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-SearchDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-RestoreEditingView">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RestoreEditingView</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-EditHyperlink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EditHyperlink</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ModifyField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ModifyField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-IndexEntryDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:IndexEntryDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ManageLinks">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ManageLinks</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ImageMapDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ObjectMenue">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectMenue</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-GlueEditMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GlueEditMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-EditDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EditDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-PageSetup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PageSetup</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Edit Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-SelectObject">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-CloneTool">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-ClearDirectFormatting">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FlipVertical">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FormatLine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FormatArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-TextAttributes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TextAttributes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FontWork">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontWork</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu File">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="AddDirectD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddDirect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RecentFileListD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RecentFileList</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CloseDocD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SaveD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Save</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SaveAsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAs</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SaveAsRemoteD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAsRemote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveACopy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveACopy</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="NewGlobalDocD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NewGlobalDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExportToD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportTo</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExportToPDFD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportToPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SendMailD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMail</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SendMailDocAsPDFD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMailDocAsPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SendViaBluetoothD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendViaBluetooth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PrintD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Print</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PrintDefaultD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrintDefault</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PrinterSetupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrinterSetup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SignatureD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Signature</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SignPDFD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SignPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SetDocumentPropertiesD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetDocumentProperties</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="QuitD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Quit</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Fontwork">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuFontwork-FontworkSameLetterHeights">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontworkSameLetterHeights</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-CheckBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-RadioButton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ListBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ComboBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Pushbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Imagebutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-FormattedField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-DateField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-TimeField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-NumericField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-CurrencyField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-PatternField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ImageControl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-FileControl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-NavigationBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Format">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="GrowD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ShrinkD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ShadowedD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="OutlineFontD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutlineFont</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="OverlineD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Overline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SuperScript2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SuperScript</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SubScriptD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SubScript</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToUpperD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToUpper</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToLowerD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToLower</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseRotateCaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseRotateCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToSentenceCaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToSentenceCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToTitleCaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToTitleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToToggleCaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToToggleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertNonBreakingSpaceD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertNonBreakingSpace</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertHardHyphenD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertHardHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertSoftHyphenD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSoftHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertZWSPD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertZWSP</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertWJD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertWJ</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertLRMD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertLRM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertRLMD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRLM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertRLMD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-Ruler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Ruler</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-VRuler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VRuler</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuGrid-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-ViewBounds">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ViewBounds</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-TableBoundaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableBoundaries</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-ShowGraphics">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowGraphics</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuGrid-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-GridVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-GridUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-HelplinesMove">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesMove</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuGrid-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-HideWhitespace">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HideWhitespace</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Group">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="GroupBoxD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="NameGroupD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectTitleDescriptionD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator119">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="FormatGroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormatGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="FormatUngroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormatUngroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EnterGroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EnterGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="LeaveGroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:LeaveGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator145">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeBezierD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangePolygonD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="convert_to_contourD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DLatheFastD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoBitmapD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoMetaFileD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator146">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CombineD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DismantleD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConnectD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Connect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="BreakD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Break</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MergeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SubstractD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="IntersectD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EqualizeWidthD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EqualizeHeightD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator150">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GroupBoxD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="CropD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExternalEditD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExternalEdit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangePictureD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePicture</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CompressGraphicD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SaveGraphicD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectMirrorVerticalD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectMirrorVertical</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectMirrorHorizontalD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectMirrorHorizontal</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeBezier1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangePolygonD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="convert_to_contourD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DLatheFastD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoBitmapD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoMetaFileD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ImageMapDialogD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator142">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="NameGroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectTitleDescription1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-Gallery">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Gallery</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-SelectBackgroundD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertAVMedia">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertAVMedia</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-TwainSelect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TwainSelect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertQrCode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertQrCode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertObject">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObject</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-ImportFromFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImportFromFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertMath">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMath</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-DrawText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-VerticalText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertObjectFloatingFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObjectFloatingFrame</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-HyperlinkDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HyperlinkDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertSymbol">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSymbol</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-CapturePoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertPageField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertPageField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertPagesField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertPagesField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-HeaderAndFooter">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HeaderAndFooter</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertPage</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Master Page">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="InsertMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RenameMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CloseMasterViewD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Media">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuMedia-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Object">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="ObjectMenue">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectMenue</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator154">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertCaptionDialog3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertCaptionDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator147">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeBezierD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangePolygonD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="convert_to_contourD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DLatheFastD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoBitmapD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoMetaFileD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator156">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CombineD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DismantleD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConnectD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Connect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="BreakD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Break</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MergeD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SubstractD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="IntersectD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EqualizeWidthD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EqualizeHeightD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator164">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DistributeSelection1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Paragraph">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="ParaLeftToRightD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ParaRightToLeftD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ParaspaceIncreaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ParaspaceDecreaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SpacePara1D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpacePara1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SpacePara15D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpacePara15</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SpacePara2D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpacePara2</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ParagraphDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellOnline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellOnline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ThesaurusDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-MoreDictionaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoreDictionaries</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetLanguageAllTextMenu</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ChineseConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChineseConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HangulHanjaConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-Hyphenation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Hyphenation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-RedactDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RedactDoc</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Rows Columns">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="InsertRowsBeforeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowsBefore</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertRowsAfterD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowsAfter</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertRowDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertColumnsBeforeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertColumnsBefore</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertColumnsAfterD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertColumnsAfter</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertColumnDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertColumnDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteRowsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteRows</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteColumnsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteColumns</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EntireRowD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EntireRow</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EntireColumnD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EntireColumn</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SelectTableD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectTable</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Settings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-menubar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Menubar</property>
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|MenubarAction">Menubar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-Sidebar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSettings-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-ToolbarModeUI">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToolbarModeUI</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-AvailableToolbars">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AvailableToolbars</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-OptionsTreeDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OptionsTreeDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSettings-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-Extensions">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSettings-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-RunMacro">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RunMacro</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-ScriptOrganizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ScriptOrganizer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSettings-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-HelpIndex">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelpIndex</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-About">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:About</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-PageMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PageMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-MasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-NewWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NewWindow</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Menubar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Menubar</property>
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|MenubarView">Menubar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Sidebar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-StatusBarVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:StatusBarVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-LeftPaneDraw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:LeftPaneDraw</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ShowRuler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-GridVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-GridUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-SnapFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-SnapPoints">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-SnapBorder">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomPageWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomPageWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom100Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom100Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSepiaD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSepia</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSobelD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSobel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterInvertD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterInvert</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterMosaicD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterMosaic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterPopart">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterPopart</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterPosterD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterPoster</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterReliefD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterRelief</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterRemoveNoiseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterRemoveNoise</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSharpenD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSharpen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSmoothD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSmooth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSolarizeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSolarize</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GrafModeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GrafMode</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-Presentation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-PresentationCurrentSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-RehearseTimings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RehearseTimings</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-CustomShowDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CustomShowDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-Remote">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Remote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-PresentationDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-InsertSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DuplicateSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DeleteSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-PresentationLayout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationLayout</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-SummaryPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SummaryPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ExpandPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExpandPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ShowSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-HideSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HideSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-MoveSlideUp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-MoveSlideDown">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideDown</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-PresentationMinimizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationMinimizer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-SlideSetup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuSnap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-CapturePoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-GlueEditMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GlueEditMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSnap-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-GridVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-GridFront">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridFront</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-HelplinesMove">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesMove</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSnap-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-HelplinesVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-HelplinesFront">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesFront</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSnap-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-GridUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-SnapFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-SnapPoints">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-SnapBorder">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSnap-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-ShowRuler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ </child>
+ </object>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="NotebookBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Toolbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <child>
+ <object class="sfxlo-DropdownBox" id="File">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">5</property>
+ <child>
+ <object class="GtkBox" id="Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="File-Open">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Open</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="File-Save">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Save</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="File-ExportToPDF">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExportToPDF</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="File-File:Menu File">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|fileb">_File</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Clipboard">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Edit-Paste">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Edit-Undo">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Undo</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Edit-Redo">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Redo</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Edit-Edit:Menu Edit">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|editb">_Edit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-ContextVBox" id="ContextContainer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Default">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertObjectChart">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-Insert:Menu Insert">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Insert</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-DrawText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-VerticalText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-Line">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-LineToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-Draw:Menu Draw">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|draw">D_raw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Draw1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Default-BasicShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SymbolShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ArrowShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Default-StarShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-CalloutShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-FlowChartShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Draw2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box95">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Default-ConnectorToolbox2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-XLineColor2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Objects3DToolbox2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillColor2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-SpellDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-GridVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-Review:Menu Review">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|reviewb">_Review</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Zoom">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-PageMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PageMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-MasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-View:Menu View">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|viewT">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="baseline_position">bottom</property>
+ <child>
+ <object class="GtkSeparator" id="separator66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">end</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-SwitchControlDesignMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SwitchControlDesignMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-TextboxForm">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-CheckBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-FormButton:Menu Form">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|FormButton">Fo_rm</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Extension">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="baseline_position">bottom</property>
+ <child>
+ <object class="GtkSeparator" id="separator47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-PackageManagerDialog">
+ <property name="visible">True</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="NotebookBarAddonsToolMergePoint" id="AddonCommand">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Extension-ExtensionButton:Menu Addons">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|ExtensionMenuButton">E_xtension</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Default"/>
+ <class name="context-DrawPage"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Text">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Font">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator123">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-CharFontName">
+ <property name="visible">True</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin-start">5</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-FontHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Section-fontcolor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Text-Font:Menu Format">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|formatt">F_ont</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-Bold">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-Italic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-Underline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-Strikeout">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Section-CharBackColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Format">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box116">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-CloneTool">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-ClearDirectFormatting">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Paragraph">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Section-DefaultBullet">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Section-DefaultNumbering">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-LeftPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Text-Paragraph:Menu Paragraph">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|paragrapht">_Paragraph</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Paragraph1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-CenterPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-RightPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-JustifyPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-CellVertTop">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-CellVertCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-CellVertBottom">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box101">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle1">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle4">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom127">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-LineEndStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom134">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-Zoom">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-PageMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PageMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-MasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Text-View:Menu View">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|viewT">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Text"/>
+ <class name="context-DrawText"/>
+ <class name="context-TextObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Table">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Font">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CharFontName">
+ <property name="visible">True</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin-start">5</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FontHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-Color1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Table-Font:Menu Format">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|formatt">F_ont</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-Bold">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Italic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Underline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Strikeout">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-CharBackColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Paragraph">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-DefaultBullet">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-DefaultNumbering">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-LeftPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Table-Paragraph:Menu Paragraph">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|paragrapht">_Paragraph</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Paragraph1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box99">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CenterPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-RightPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-JustifyPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box100">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CellVertTop">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CellVertCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CellVertBottom">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-SplitCell">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SplitCell</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-MergeCells">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MergeCells</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TableDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-OptimizeTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OptimizeTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Table-Table:Menu Rows Columns">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|rowscolumnst">_Table</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator124">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom45">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsBefore">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsAfter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteColumns">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteColumns</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="opacity">0.9215686274509803</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsBefore">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsAfter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteRows">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteRows</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Table2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box97">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireColumn">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireColumn</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetMinimalColumnWidth">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetMinimalColumnWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetOptimalColumnWidth">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetOptimalColumnWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DistributeColumns">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DistributeColumns</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box98">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireRow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireRow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetMinimalRowHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetMinimalRowHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetOptimalRowHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetOptimalRowHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DistributeRows">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DistributeRows</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-SetBorderStyle2">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:SetBorderStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-LineStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FrameLineColor2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FrameLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FillStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Calc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator139">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableSort">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TableSort</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-AutoSum">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoSum</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Table-Calc:Menu Calculate">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|calculatet">_Calc</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertGraphic1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertObjectChart1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertPage1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertTable1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-Insert:MenuInsert1">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Insert</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Table"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Draw">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-NameGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-Edit:Menu Edit Draw">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|editdrawb">D_raw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle2">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle1">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-LineEndStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-Arrange:Menu Arrange">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Shape">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-DrawText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-VerticalText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Line">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-Draw:Menu Draw">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|draw">_Shape</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Shape1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box104">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BasicShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-SymbolShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ArrowShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ConnectorToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box105">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-StarShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-CalloutShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Objects3DToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Group">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-EnterGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EnterGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LeaveGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeaveGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-Group:Menu Group">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|viewDrawb">Grou_p</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-MergeCombine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="GroupB102">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom147">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Combine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Dismantle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-DistributeSelection">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom148">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Merge">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Substract">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Intersect">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-3d">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator144">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-FillColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-Extrusion3DColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Extrusion3DColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-3D:Menu 3d">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|3Db">3_D</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-3d1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box102">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-ExtrusionSurfaceFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionSurfaceFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionLightingFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionLightingFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box103">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionDepthFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDepthFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionDirectionFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDirectionFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Fontwork">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkShapeType">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkShapeType</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkAlignmentFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkAlignmentFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkCharacterSpacingFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkCharacterSpacingFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-Fontwork:Menu Fontwork">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|GridButton">_Fontwork</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-GridVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-GridUse1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-HelplinesMove">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesMove</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-Grid:Menu Grid">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|GridButton">_Grid</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Draw"/>
+ <class name="context-DrawLine"/>
+ <class name="context-3DObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Image">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Graphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-NameGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-Crop">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-CompressGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-Image:Menu Image">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|graphicB">_Image</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Imag-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle3">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle2">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Imag-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-LineEndStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-FillShadow2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-Arrange:Menu Arrange">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box106">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box107">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Snap-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Snap-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Snap-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Snap-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Snap-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Snap-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Color">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-GrafMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-Color:MenuColor">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|GridB">Fi_lter</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ColorSettings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="GroupB87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafLuminance">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafLuminance</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafTransparence">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafTransparence</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ColorSettings2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">5</property>
+ <child>
+ <object class="GtkBox" id="GroupB90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafContrast">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafContrast</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafGamma">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafGamma</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Graphic"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Object">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-Graphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="OLE-NameGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="OLE-Frame:Menu Object">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|graphicB">_Object</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle4">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle3">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-LineEndStyle3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-FillShadow3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="OLE-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="OLE-Arrange:Menu Arrange">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box108">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="OLE-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box109">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="OLE-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="OLE-Snap-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-Snap-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-Snap-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-Snap-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-Snap-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="OLE-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="OLE-Snap-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-OLE"/>
+ <class name="context-Frame"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Media">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Graphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-NameGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Media-Media:Menu Media">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|graphicB">_Media</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom132">
+ <property name="width_request">148</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaToolBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaToolBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaPlayer1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="baseline_position">bottom</property>
+ <child>
+ <object class="GtkSeparator" id="separator77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BringToFront1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-SendToBack1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Media-Arrange:Menu Arrange">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="baseline_position">bottom</property>
+ <child>
+ <object class="GtkBox" id="Section53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box93">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ObjectAlignLeft2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box94">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-Snap-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-Snap-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-Snap-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-Snap-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-Snap-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Media-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-Snap-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Media"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Multiobject">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom28">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-NameGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Multi-Edit:Menu Edit Draw">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|editdrawb">D_raw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box110">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle5">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle5">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box111">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-LineEndStyle4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-FillShadow4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Multi-Arrange:Menu Arrange">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-Snap-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-Snap-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-Snap-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-Snap-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-Snap-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Multi-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-Snap-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-Group">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator93">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-FormatGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-EnterGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EnterGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-LeaveGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeaveGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Multi-Group:Menu Group">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|viewDrawb">Grou_p</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-MultiObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Master Page">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Master">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator166">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-InsertMasterPage2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-RenameMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-CloseMasterView">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Master:Menu Master Page">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|oleB">_Master</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-Line">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-LineToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Draw:Menu Draw">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|draw">D_raw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Draw1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Master-BasicShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-SymbolShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-ArrowShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-StarShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-CalloutShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-FlowChartShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Draw2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box112">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Master-BasicShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-SymbolShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-ArrowShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box113">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-StarShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-CalloutShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-FlowChartShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-InsertObjectChart">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-InsertTable1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Insert:Menu Insert">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Insert</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-Snap-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Snap-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Snap-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Snap-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Snap-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-Snap-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator101">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-SpellDialog2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertAnnotation2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-GridVisible2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box114">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Review:MenuReview">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|reviewb">_Review</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-Section-Zoom">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Section-PageMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PageMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Section-MasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-View:Menu View">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|viewT">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-MasterPage"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Form">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="baseline_position">bottom</property>
+ <child>
+ <object class="GtkSeparator" id="separator55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">end</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-SwitchControlDesignMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SwitchControlDesignMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-UseWizards">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:UseWizards</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-GroupBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-OpenReadOnly2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Form-FormButton:Menu Form">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|FormButton">Fo_rm</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom114">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FormProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowFmExplorer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="GroupB49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom118">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-TabDialog1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TabDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom119">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-OpenReadOnly1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom128">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ControlProperties2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ControlProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom129">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-AutoControlFocus2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoControlFocus</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Label1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Edit1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CheckBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RadioButton2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ListBox2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ComboBox2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-NumericField2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CurrencyField2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-PatternField2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FormattedField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-DateField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TimeField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-Pushbutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-Imagebutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-ImageControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FileControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-NavigationBar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-Grid">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Form"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Tools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin-end">5</property>
+ <child>
+ <object class="GtkBox" id="Ext2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-SearchDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-HelpIndex">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelpIndex</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CloseDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CloseDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Tools-Menu:Menu Settings">
+ <property name="label" translatable="yes" context="draw_notebookbar_groupedbar_compact|menub">_Menu</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator122">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">4</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/notebookbar_online.ui b/sd/uiconfig/sdraw/ui/notebookbar_online.ui
new file mode 100644
index 000000000..223eedce4
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/notebookbar_online.ui
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <requires lib="LibreOffice" version="1.0"/>
+ <!-- interface-local-resource-path ../../../icon-themes/colibre/cmd/ -->
+ <object class="GtkGrid" id="NotebookBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="font">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkToolButton" id="Home-CharFontName">
+ <property name="visible">True</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="fontheight">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin_start">5</property>
+ <child>
+ <object class="GtkToolButton" id="Home-FontHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/notebookbar_single.ui b/sd/uiconfig/sdraw/ui/notebookbar_single.ui
new file mode 100644
index 000000000..ccc2a2a9e
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/notebookbar_single.ui
@@ -0,0 +1,11625 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <requires lib="LibreOffice" version="1.0"/>
+ <object class="GtkMenu" id="Menu Addons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">AddonCommand</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="AddonSection-Separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ </object>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="NotebookBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="DefaultBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-DropdownBox" id="ClipboardSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">5</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Edit-Undo">
+ <property name="visible">True</property>
+ <property name="is_important">True</property>
+ <property name="action_name">.uno:Undo</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Edit-Paste">
+ <property name="visible">True</property>
+ <property name="is_important">True</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-ContextVBox" id="ContextContainer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="DefaultContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom93">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillStyle4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea6">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatLine2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-XLineColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Default-XLineStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-LineWidth2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Line5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-LineEndStyle1">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatLine3">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-TextBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Text">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-VerticalText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Line">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Line">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-BasicShapes.rectangle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.rectangle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-BasicShapes.ellipse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.ellipse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-DrawCaption">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DrawCaption</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-LineToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-LineToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ConnectorToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-19"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-BasicShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-BasicShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SymbolShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ArrowShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-StarShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-CalloutShapes">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Objects3DToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom94">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-StyleApply2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-CapturePoint1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Default-InsertTable2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Zoom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-ZoomPrevious">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPrevious</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ZoomPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Zoom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-GridVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-HelplinesVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Snap1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Snap2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Default"/>
+ <class name="context-DrawPage"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="TableContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Paintbrush">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatPaintbrush">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetDefaul">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-AutoForma">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tabl-AutoFormat">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoFormat</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-AreaDialog1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea4">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FrameLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FrameLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-LineStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-SetBorderStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetBorderStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-BorderDialog1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TableDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontName">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CharFontName1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FontHeight1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-GrawShrink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-end">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-Grow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Shrink1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-23"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-BoldItalic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-Bold1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Italic1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Underline1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Strikeout1">
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Shadowed1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-SubSuperScript">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-SubScript">
+ <property name="action_name">.uno:SubScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SuperScript">
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SuperScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-22"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Color1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Spacing1">
+ <property name="action_name">.uno:Spacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-CharBackColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-21"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FontDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-BulletNumbering">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-DefaultBullet">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DefaultNumbering">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetOutline">
+ <property name="action_name">.uno:SetOutline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-IncrementDecrement">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-IncrementIndent1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:IncrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DecrementIndent1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DecrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Para1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-LeftPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CenterPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-RightPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-JustifyPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-20"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Para2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertTop1">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertCenter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertBottom1">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-19"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-LTR">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Spacing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">1</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaspaceIncrease">
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaspaceDecrease">
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-ParagraphDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tabl-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-StyleApply1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">27</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-MergeCells1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MergeCells</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SplitCell1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SplitCell</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-OptimizeTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OptimizeTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">28</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-AutoFormat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-AutoFormat">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:AutoFormat</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">29</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Column">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireColumn1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireColumn</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsBefore1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsAfter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteColumns1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteColumns</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">30</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Row">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireRow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireRow</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsBefore1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsAfter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteRows1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteRows</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">31</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-TableDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TableDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">32</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CharmapControl1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharmapControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">33</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Table"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="GraphicContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Rotate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Flip">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-TransformDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ObjectForwardOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectForwardOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ObjectBackOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectBackOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-StyleApply3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Crop">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-Crop">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-SaveReplace">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ChangePicture">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ChangePicture</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-CompressGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-SaveGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">24</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-GraphicFilterToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">1</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-GraphicFilterToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GraphicFilterToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">26</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-ColorSettings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ColorSettings">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ColorSettings</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">27</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-GrafMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-GrafMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">28</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-GrafTransparence">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-GrafTransparence">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafTransparence</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">29</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Graphic"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="DrawContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Format">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-CloneTool">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ClearDirectFormatting">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom108">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom109">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObjec-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="MultiObject-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-LineEndStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Rotate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Flip">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-TransformDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="MultiObject-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="MultiObject-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom111">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ObjectForwardOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectForwardOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ObjectBackOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectBackOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-StyleApply3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Combine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Combine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Dismantle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">24</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Merge">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Substract">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Intersect">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-DistributeSelection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-DistributeSelection">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">26</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Draw"/>
+ <class name="context-DrawLine"/>
+ <class name="context-MultiObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="MediaContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Media-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AVMediaPlayer">
+ <property name="width_request">122</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-TransformDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Media-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Media-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-ObjectForwardOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectForwardOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-ObjectBackOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectBackOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-StyleApply3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox">
+ <property name="width_request">167</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaToolBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaToolBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Media"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="ObjectContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Objec-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatArea1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-XLineStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-LineWidth">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatLine3">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Rotate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Flip">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-TransformDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectForwardOne">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectForwardOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectBackOne">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectBackOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom95">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ReverseOrder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom97">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-StyleApply">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-OLE"/>
+ <class name="context-Frame"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="FormContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="For-SwitchControlDesignMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SwitchControlDesignMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-UseWizards">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:UseWizards</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ControlProperties">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ControlProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ControlProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Properties">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FormProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowFmExplorer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-TabDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-TabDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TabDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Labels">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-Label">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-Edit">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-CheckBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-RadioButton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-RadioButton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-ListBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-ComboBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Pushbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-Pushbutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-Imagebutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-OpenReadOnly">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-OpenReadOnly">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-AutoControlFocus">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-AutoControlFocus">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoControlFocus</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Form-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignUp4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignMiddle4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignDown4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignCenter4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ObjectAlignRight4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Form-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectForwardOne3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectForwardOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectBackOne3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectBackOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-SendToBack3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-BeforeObject1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-BehindObject1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-FormattedField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FormattedField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-DateField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-TimeField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-NumericField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-CurrencyField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-PatternField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-GroupBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-GroupBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-FormattedField1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ImageControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-FileControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-FormattedField2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-Grid">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-NavigationBar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Form"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="TextContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Paintbrush">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-FormatPaintbrush">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-ResetAttributes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillShadow2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatLine1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-XLineColor2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Default-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatLine4">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FontName">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-CharFontName">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-23"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FontHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-FontHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-22"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-GrawShrink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Grow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Shrink">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-BoldItalic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Bold">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Italic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Underline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Strikeout">
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Shadowed">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-SubSuperScript">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-SubScript">
+ <property name="action_name">.uno:SubScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-SuperScript">
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SuperScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-21"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FontColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Color">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Spacing">
+ <property name="action_name">.uno:Spacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-CharBackColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-20"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FontDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-FontDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-19"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-BulletNumbering">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-DefaultBullet">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-DefaultNumbering">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-SetOutline">
+ <property name="action_name">.uno:SetOutline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-IncrementDecrement">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-IncrementIndent">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:IncrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-DecrementIndent">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DecrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Para1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-LeftPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CenterPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-RightPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-JustifyPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Para2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertTop">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertBottom">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-LTR">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Spacing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-ParaspaceIncrease">
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-ParaspaceDecrease">
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-LineSpacing2">
+ <property name="action_name">.uno:LineSpacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-StyleApply">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">24</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-TextBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Text1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-VerticalText1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Text"/>
+ <class name="context-DrawText"/>
+ <class name="context-TextObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="3DObjectContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObjec-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Rotate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Window3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-Window3D">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Window3D</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-TransformDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3DObject-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom100">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ObjectForwardOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectForwardOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom101">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ObjectBackOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectBackOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom102">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-StyleApply3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-3DObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="MasterPageContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-DrawingLayout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-DrawingLayout">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:DrawingLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Rename">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-RenameMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Dialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-PageSetup">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:PageSetup</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-SelectBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-SelectBackground">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-SaveBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Anchor2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-SaveBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-ViewMenu">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ViewMenu</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-PageMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-PageMode">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:PageMode</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Close">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Anchor6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-CloseMasterView">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-MasterPage"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/paranumberingtab.ui b/sd/uiconfig/sdraw/ui/paranumberingtab.ui
new file mode 100644
index 000000000..50a07a9d6
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/paranumberingtab.ui
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">9999</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkFrame" id="DrawParaNumbering">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkCheckButton" id="checkbuttonCB_NEW_START">
+ <property name="label" translatable="yes" context="paranumberingtab|checkbuttonCB_NEW_START">R_estart at this paragraph</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="inconsistent">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="spinbuttonNF_NEW_START">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="checkbuttonCB_NUMBER_NEW_START">
+ <property name="label" translatable="yes" context="paranumberingtab|checkbuttonCB_NUMBER_NEW_START">S_tart with:</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="margin-start">12</property>
+ <property name="use_underline">True</property>
+ <property name="inconsistent">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="paranumberingtab|label1">Paragraph Numbering</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/queryunlinkimagedialog.ui b/sd/uiconfig/sdraw/ui/queryunlinkimagedialog.ui
new file mode 100644
index 000000000..99876c00b
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/queryunlinkimagedialog.ui
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMessageDialog" id="QueryUnlinkImageDialog">
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes" context="queryunlinkimagedialog|QueryUnlinkImageDialog">Release image's link?</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="message_type">question</property>
+ <property name="buttons">yes-no</property>
+ <property name="text" translatable="yes" context="queryunlinkimagedialog|QueryUnlinkImageDialog">This image is linked to a document.</property>
+ <property name="secondary_text" translatable="yes" context="queryunlinkimagedialog|QueryUnlinkImageDialog">Do you want to unlink the image in order to edit it?</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="messagedialog-vbox4">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">24</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="messagedialog-action_area4">
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/sdraw/ui/vectorize.ui b/sd/uiconfig/sdraw/ui/vectorize.ui
new file mode 100644
index 000000000..623eaae7e
--- /dev/null
+++ b/sd/uiconfig/sdraw/ui/vectorize.ui
@@ -0,0 +1,376 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">8</property>
+ <property name="upper">32</property>
+ <property name="value">8</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="upper">32</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment3">
+ <property name="lower">8</property>
+ <property name="upper">128</property>
+ <property name="value">8</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkDialog" id="VectorizeDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="vectorize|VectorizeDialog">Convert to Polygon</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="window_position">mouse</property>
+ <property name="default_width">0</property>
+ <property name="default_height">0</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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="preview">
+ <property name="label" translatable="yes" context="vectorize|preview">Preview</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="preview-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="vectorize|extended_tip|preview">Previews the converted image without applying the changes.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">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="cancel">
+ <property name="label" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</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">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="vectorize|label2">Number of colors:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">colors</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="GtkSpinButton" id="colors">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="activates_default">True</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="colors-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="vectorize|extended_tip|colors">Enter the number of colors to be displayed in the converted image. A polygon is generated for each occurrence of a color in the image.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="vectorize|label3">Point reduction:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">points</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="GtkSpinButton" id="points">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="activates_default">True</property>
+ <property name="adjustment">adjustment2</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="points-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="vectorize|extended_tip|points">Removes color polygons that are smaller than the pixel value you enter.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="tilesft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="label" translatable="yes" context="vectorize|tilesft">Tile size:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">tiles</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="GtkSpinButton" id="tiles">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="activates_default">True</property>
+ <property name="adjustment">adjustment3</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="tiles-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="vectorize|extended_tip|tiles">Enter the size of the rectangle for the background fill.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="fillholes">
+ <property name="label" translatable="yes" context="vectorize|fillholes">_Fill holes</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="fillholes-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="vectorize|extended_tip|fillholes">Fills the color gaps caused by applying a point reduction.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="vectorize|label5">Source image:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">source</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="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="vectorize|label6">Vectorized image:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">vectorized</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkDrawingArea" id="source">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkDrawingArea" id="vectorized">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkProgressBar" id="progressbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</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>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="VectorizeDialog-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="vectorize|extended_tip|VectorizeDialog">Converts the selected object to a polygon (a closed object bounded by straight lines).</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/menubar/menubar.xml b/sd/uiconfig/simpress/menubar/menubar.xml
new file mode 100644
index 000000000..855a26991
--- /dev/null
+++ b/sd/uiconfig/simpress/menubar/menubar.xml
@@ -0,0 +1,692 @@
+<?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 .
+-->
+<menu:menubar xmlns:menu="http://openoffice.org/2001/menu" menu:id="menubar">
+ <menu:menu menu:id=".uno:PickList">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:AddDirect"/>
+ <menu:menuitem menu:id=".uno:Open"/>
+ <menu:menuitem menu:id=".uno:OpenRemote" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:RecentFileList"/>
+ <menu:menuitem menu:id=".uno:CloseDoc"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AutoPilotMenu" menu:style="text"/>
+ <menu:menu menu:id=".uno:TemplateMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:OpenTemplate" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:SaveAsTemplate" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NewDoc" menu:style="text"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Reload" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:VersionDialog" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Save"/>
+ <menu:menuitem menu:id=".uno:SaveAs"/>
+ <menu:menuitem menu:id=".uno:SaveAsRemote" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:SaveACopy" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:SaveAll" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CheckOut" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:CancelCheckOut" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:CheckIn" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ExportTo"/>
+ <menu:menu menu:id=".uno:ExportAsMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ExportToPDF" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ExportDirectToPDF" menu:style="text"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:SendToMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SendMail" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:SendMailDocAsPDF" menu:style="text"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:WebHtml" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Print"/>
+ <menu:menuitem menu:id=".uno:PrinterSetup" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SetDocumentProperties"/>
+ <menu:menu menu:id=".uno:SignaturesMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Signature" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:SignPDF" menu:style="text"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Quit"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:EditMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Undo"/>
+ <menu:menuitem menu:id=".uno:Redo"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menu menu:id=".uno:PasteSpecialMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:PasteUnformatted"/>
+ <menu:menuitem menu:id=".uno:PasteSpecial"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CopyObjects"/>
+ <menu:menuitem menu:id=".uno:SelectAll"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id="vnd.sun.star.findbar:FocusToFindbar"/>
+ <menu:menuitem menu:id=".uno:SearchDialog" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuitem menu:id=".uno:GlueEditMode"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EditHyperlink" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ModifyField" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ManageLinks" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ObjectMenue" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EditDoc" menu:style="text"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ViewMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:NormalMultiPaneGUI" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:OutlineMode" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:NotesMode" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:DiaMode" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:SlideMasterPage" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:NotesMasterPage" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:HandoutMode" menu:style="radio"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToolbarModeUI"/>
+ <menu:menuitem menu:id=".uno:AvailableToolbars" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:StatusBarVisible" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:LeftPaneImpress" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ToggleTabBarVisibility" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ShowRuler"/>
+ <menu:menu menu:id=".uno:GridMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:GridVisible"/>
+ <menu:menuitem menu:id=".uno:GridFront"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:HelplinesMove"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:SnapLinesMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:HelplinesVisible"/>
+ <menu:menuitem menu:id=".uno:HelplinesFront"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GridUse"/>
+ <menu:menuitem menu:id=".uno:HelplinesUse"/>
+ <menu:menuitem menu:id=".uno:SnapFrame"/>
+ <menu:menuitem menu:id=".uno:SnapPoints"/>
+ <menu:menuitem menu:id=".uno:SnapBorder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ShowAnnotations"/>
+ <menu:menu menu:id=".uno:DisplayQualityMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:OutputQualityColor" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:OutputQualityGrayscale" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:OutputQualityBlackWhite" menu:style="radio"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Sidebar"/>
+ <menu:menuitem menu:id=".uno:ModifyPage"/>
+ <menu:menuitem menu:id=".uno:SlideChangeWindow"/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:ViewSidebarStyles"/>
+ <menu:menuitem menu:id=".uno:Gallery"/>
+ <menu:menuitem menu:id=".uno:Navigator"/>
+ <menu:menuitem menu:id=".uno:ColorControl"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ZoomPanning"/>
+ <menu:menu menu:id=".uno:ZoomMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ZoomPage"/>
+ <menu:menuitem menu:id=".uno:ZoomPageWidth"/>
+ <menu:menuitem menu:id=".uno:ZoomOptimal"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Zoom50Percent"/>
+ <menu:menuitem menu:id=".uno:Zoom75Percent"/>
+ <menu:menuitem menu:id=".uno:Zoom100Percent"/>
+ <menu:menuitem menu:id=".uno:Zoom150Percent"/>
+ <menu:menuitem menu:id=".uno:Zoom200Percent"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ZoomMode"/>
+ <menu:menuitem menu:id=".uno:ZoomPrevious"/>
+ <menu:menuitem menu:id=".uno:ZoomNext"/>
+ <menu:menuitem menu:id=".uno:ZoomObjects"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Zoom"/>
+ </menu:menupopup>
+ </menu:menu>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:InsertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:InsertGraphic"/>
+ <menu:menuitem menu:id=".uno:InsertAVMedia"/>
+ <menu:menuitem menu:id=".uno:InsertObjectChart"/>
+ <menu:menuitem menu:id=".uno:InsertTable"/>
+ <menu:menu menu:id=".uno:GraphicMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Gallery"/>
+ <menu:menuitem menu:id=".uno:PhotoAlbumDialog"/>
+ <menu:menu menu:id=".uno:Scan">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:TwainSelect"/>
+ <menu:menuitem menu:id=".uno:TwainTransfer"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:AnimationObjects"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ObjectMenu" menu:style="text">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:InsertMath"/>
+ <menu:menuitem menu:id=".uno:InsertQrCode"/>
+ <menu:menuitem menu:id=".uno:InsertObject"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ShapesMenu">
+ <menu:menupopup>
+ <menu:menu menu:id=".uno:ShapesLineMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Line"/>
+ <menu:menuitem menu:id=".uno:Freeline_Unfilled"/>
+ <menu:menuitem menu:id=".uno:Freeline"/>
+ <menu:menuitem menu:id=".uno:Bezier_Unfilled"/>
+ <menu:menuitem menu:id=".uno:BezierFill"/>
+ <menu:menuitem menu:id=".uno:Polygon_Unfilled"/>
+ <menu:menuitem menu:id=".uno:Polygon_Diagonal_Unfilled"/>
+ <menu:menuitem menu:id=".uno:Polygon_Diagonal"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:BasicShapes"/>
+ <menu:menuitem menu:id=".uno:SymbolShapes"/>
+ <menu:menuitem menu:id=".uno:ArrowShapes"/>
+ <menu:menuitem menu:id=".uno:FlowChartShapes"/>
+ <menu:menuitem menu:id=".uno:CalloutShapes"/>
+ <menu:menuitem menu:id=".uno:StarShapes"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CapturePoint" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Text"/>
+ <menu:menuitem menu:id=".uno:InsertAnnotation"/>
+ <menu:menuitem menu:id=".uno:InsertObjectFloatingFrame" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:FontworkGalleryFloater"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:HyperlinkDialog"/>
+ <menu:menuitem menu:id=".uno:InsertSymbol"/>
+ <menu:menu menu:id=".uno:FormattingMarkMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:InsertNonBreakingSpace"/>
+ <menu:menuitem menu:id=".uno:InsertHardHyphen"/>
+ <menu:menuitem menu:id=".uno:InsertSoftHyphen"/>
+ <menu:menuitem menu:id=".uno:InsertNarrowNobreakSpace"/>
+ <menu:menuitem menu:id=".uno:InsertZWSP"/>
+ <menu:menuitem menu:id=".uno:InsertWJ"/>
+ <menu:menuitem menu:id=".uno:InsertLRM"/>
+ <menu:menuitem menu:id=".uno:InsertRLM"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertSlideField"/>
+ <menu:menu menu:id=".uno:FieldMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:InsertDateFieldFix"/>
+ <menu:menuitem menu:id=".uno:InsertDateFieldVar"/>
+ <menu:menuitem menu:id=".uno:InsertTimeFieldFix"/>
+ <menu:menuitem menu:id=".uno:InsertTimeFieldVar"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertAuthorField"/>
+ <menu:menuitem menu:id=".uno:InsertSlideField"/>
+ <menu:menuitem menu:id=".uno:InsertSlideTitleField"/>
+ <menu:menuitem menu:id=".uno:InsertSlidesField"/>
+ <menu:menuitem menu:id=".uno:InsertFileField"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:HeaderAndFooter" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:InsertFormMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Label"/>
+ <menu:menuitem menu:id=".uno:Edit"/>
+ <menu:menuitem menu:id=".uno:CheckBox"/>
+ <menu:menuitem menu:id=".uno:RadioButton"/>
+ <menu:menuitem menu:id=".uno:ListBox"/>
+ <menu:menuitem menu:id=".uno:ComboBox"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Pushbutton"/>
+ <menu:menuitem menu:id=".uno:Imagebutton"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FormattedField"/>
+ <menu:menuitem menu:id=".uno:DateField"/>
+ <menu:menuitem menu:id=".uno:TimeField"/>
+ <menu:menuitem menu:id=".uno:NumericField"/>
+ <menu:menuitem menu:id=".uno:CurrencyField"/>
+ <menu:menuitem menu:id=".uno:PatternField"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GroupBox"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ImageControl"/>
+ <menu:menuitem menu:id=".uno:FileControl"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Grid"/>
+ <menu:menuitem menu:id=".uno:NavigationBar"/>
+ </menu:menupopup>
+ </menu:menu>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:FormatMenu">
+ <menu:menupopup>
+ <menu:menu menu:id=".uno:FormatTextMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Bold"/>
+ <menu:menuitem menu:id=".uno:Italic"/>
+ <menu:menuitem menu:id=".uno:UnderlineSingle"/>
+ <menu:menuitem menu:id=".uno:UnderlineDouble"/>
+ <menu:menuitem menu:id=".uno:Strikeout"/>
+ <menu:menuitem menu:id=".uno:Overline"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SuperScript"/>
+ <menu:menuitem menu:id=".uno:SubScript"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Shadowed"/>
+ <menu:menuitem menu:id=".uno:OutlineFont"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Grow"/>
+ <menu:menuitem menu:id=".uno:Shrink"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToUpper"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToLower"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseRotateCase"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToSentenceCase"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToTitleCase"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToToggleCase"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SmallCaps"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToHalfWidth"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToFullWidth"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToHiragana"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToKatakana"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:FormatSpacingMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SpacePara1"/>
+ <menu:menuitem menu:id=".uno:SpacePara15"/>
+ <menu:menuitem menu:id=".uno:SpacePara2"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ParaspaceIncrease"/>
+ <menu:menuitem menu:id=".uno:ParaspaceDecrease"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:IncrementIndent"/>
+ <menu:menuitem menu:id=".uno:DecrementIndent"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:TextAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:LeftPara" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:CenterPara" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:RightPara" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:JustifyPara" menu:style="radio"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CellVertTop" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:CellVertCenter" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:CellVertBottom" menu:style="radio"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:FormatBulletsMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:DefaultBullet"/>
+ <menu:menuitem menu:id=".uno:DefaultNumbering"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OutlineRight"/>
+ <menu:menuitem menu:id=".uno:OutlineLeft"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OutlineDown"/>
+ <menu:menuitem menu:id=".uno:OutlineUp"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SetDefault" menu:style="text"/>
+ <menu:menu menu:id=".uno:FormatStylesMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+ <menu:menuitem menu:id=".uno:StyleUpdateByExample"/>
+ <menu:menuitem menu:id=".uno:StyleNewByExample"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:DesignerDialog"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FontDialog"/>
+ <menu:menuitem menu:id=".uno:ParagraphDialog"/>
+ <menu:menuitem menu:id=".uno:OutlineBullet"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:TableMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SetMinimalRowHeight"/>
+ <menu:menuitem menu:id=".uno:SetOptimalRowHeight"/>
+ <menu:menuitem menu:id=".uno:DistributeRows"/>
+ <menu:menuitem menu:id=".uno:EntireRow"/>
+ <menu:menuitem menu:id=".uno:InsertRowDialog"/>
+ <menu:menuitem menu:id=".uno:DeleteRows"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SetMinimalColumnWidth"/>
+ <menu:menuitem menu:id=".uno:SetOptimalColumnWidth"/>
+ <menu:menuitem menu:id=".uno:DistributeColumns"/>
+ <menu:menuitem menu:id=".uno:EntireColumn"/>
+ <menu:menuitem menu:id=".uno:InsertColumnDialog"/>
+ <menu:menuitem menu:id=".uno:DeleteColumns"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:MergeCells"/>
+ <menu:menuitem menu:id=".uno:SplitCell"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:DeleteTable"/>
+ <menu:menuitem menu:id=".uno:SelectTable"/>
+ <menu:menuitem menu:id=".uno:TableDialog"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:FormatImageMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Crop"/>
+ <menu:menuitem menu:id=".uno:OriginalSize"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ExternalEdit"/>
+ <menu:menuitem menu:id=".uno:ChangePicture"/>
+ <menu:menuitem menu:id=".uno:CompressGraphic"/>
+ <menu:menuitem menu:id=".uno:SaveGraphic"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:FormatImageFilterMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:GraphicFilterSepia"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterSobel"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterInvert"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterMosaic"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterPopart"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterPoster"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterRelief"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterRemoveNoise"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterSharpen"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterSmooth"/>
+ <menu:menuitem menu:id=".uno:GraphicFilterSolarize"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:ColorSettings"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GrafAttrCrop"/>
+ <menu:menuitem menu:id=".uno:GraphicSizeCheck"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:FormatObjectMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:TextAttributes"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:FillShadow"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:NameGroup" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:DistributeSelection"/>
+ <menu:menuitem menu:id=".uno:ToggleObjectRotateMode"/>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:GroupMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:FormatGroup"/>
+ <menu:menuitem menu:id=".uno:FormatUngroup"/>
+ <menu:menuitem menu:id=".uno:EnterGroup"/>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ </menu:menupopup>
+ </menu:menu>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:SlideMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:InsertSlide"/>
+ <menu:menuitem menu:id=".uno:DuplicateSlide"/>
+ <menu:menuitem menu:id=".uno:ImportSlideFromFile" menu:style="text"/>
+ <menu:menu menu:id=".uno:SlideLayoutMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=20"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=19"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=0"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=1"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=32"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=3"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=12"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=15"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=14"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=16"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=18"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=34"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=28"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=27"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=29"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=30"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:DeleteSlide"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SaveBackground"/>
+ <menu:menuitem menu:id=".uno:SelectBackground"/>
+ <menu:menuitem menu:id=".uno:SlideSetup"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:PresentationLayout"/>
+ <menu:menuitem menu:id=".uno:InsertMasterPage"/>
+ <menu:menuitem menu:id=".uno:DeleteMasterPage"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:DisplayMasterBackground"/>
+ <menu:menuitem menu:id=".uno:DisplayMasterObjects"/>
+ <menu:menuitem menu:id=".uno:MasterLayouts"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ShowSlide"/>
+ <menu:menuitem menu:id=".uno:HideSlide"/>
+ <menu:menuitem menu:id=".uno:RenameSlide"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:RestoreEditingView"/>
+ <menu:menu menu:id=".uno:SlideMoveMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MoveSlideFirst"/>
+ <menu:menuitem menu:id=".uno:MoveSlideUp"/>
+ <menu:menuitem menu:id=".uno:MoveSlideDown"/>
+ <menu:menuitem menu:id=".uno:MoveSlideLast"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:NavigateMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:FirstSlide"/>
+ <menu:menuitem menu:id=".uno:PreviousSlide"/>
+ <menu:menuitem menu:id=".uno:NextSlide"/>
+ <menu:menuitem menu:id=".uno:LastSlide"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SummaryPage" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ExpandPage" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:SlideChangeWindow"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:SlideShowMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Presentation"/>
+ <menu:menuitem menu:id=".uno:PresentationCurrentSlide"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:RehearseTimings"/>
+ <menu:menuitem menu:id=".uno:CustomShowDialog"/>
+ <menu:menuitem menu:id=".uno:Remote"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:PresentationDialog"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ToolsMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SpellDialog"/>
+ <menu:menuitem menu:id=".uno:SpellOnline"/>
+ <menu:menuitem menu:id=".uno:ThesaurusDialog" menu:style="text"/>
+ <menu:menu menu:id=".uno:LanguageMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SetLanguageAllTextMenu"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Hyphenation" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ChineseConversion"/>
+ <menu:menuitem menu:id=".uno:HangulHanjaConversion"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:MoreDictionaries"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AutoCorrectDlg"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:RedactDoc" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:AutoRedactDoc" menu:style="text"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:PresentationMinimizer"/>
+ <menu:menuitem menu:id=".uno:ImageMapDialog"/>
+ <menu:menuitem menu:id=".uno:BmpMask"/>
+ <menu:menuitem menu:id=".uno:AVMediaPlayer"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ToolsFormsMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SwitchControlDesignMode"/>
+ <menu:menuitem menu:id=".uno:UseWizards"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ControlProperties"/>
+ <menu:menuitem menu:id=".uno:FormProperties"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ShowFmExplorer"/>
+ <menu:menuitem menu:id=".uno:TabDialog"/>
+ <menu:menuitem menu:id=".uno:AddField"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OpenReadOnly"/>
+ <menu:menuitem menu:id=".uno:AutoControlFocus"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MacrosMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MacroRecorder"/>
+ <menu:menuitem menu:id=".uno:RunMacro"/>
+ <menu:menuitem menu:id=".uno:BasicIDEAppear"/>
+ <menu:menuitem menu:id=".uno:ScriptOrganizer"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:MacroSignature"/>
+ <menu:menuitem menu:id=".uno:MacroOrganizer?TabId:short=1"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OpenXMLFilterSettings"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:DevelopmentToolsDockingWindow"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id="service:com.sun.star.deployment.ui.PackageManagerDialog" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:ConfigureDialog" menu:style="text"/>
+ <menu:menuitem menu:id=".uno:OptionsTreeDialog"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:WindowList">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:NewWindow"/>
+ <menu:menuitem menu:id=".uno:CloseWin"/>
+ <menu:menuseparator/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:HelpMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:HelpIndex"/>
+ <menu:menuitem menu:id=".uno:ExtendedHelp"/>
+ <menu:menuitem menu:id=".uno:Documentation"/>
+ <menu:menuitem menu:id=".uno:TipOfTheDay"/>
+ <menu:menuitem menu:id=".uno:CommandPopup"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:QuestionAnswers"/>
+ <menu:menuitem menu:id=".uno:SendFeedback"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SafeMode"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GetInvolved"/>
+ <menu:menuitem menu:id=".uno:Donation"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ShowLicense"/>
+ <menu:menuitem menu:id=".uno:About"/>
+ </menu:menupopup>
+ </menu:menu>
+</menu:menubar>
diff --git a/sd/uiconfig/simpress/popupmenu/3dobject.xml b/sd/uiconfig/simpress/popupmenu/3dobject.xml
new file mode 100644
index 000000000..7dd6f161a
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/3dobject.xml
@@ -0,0 +1,68 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Window3D"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/3dscene.xml b/sd/uiconfig/simpress/popupmenu/3dscene.xml
new file mode 100644
index 000000000..161ce571d
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/3dscene.xml
@@ -0,0 +1,61 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Window3D"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:EnterGroup"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/3dscene2.xml b/sd/uiconfig/simpress/popupmenu/3dscene2.xml
new file mode 100644
index 000000000..61c43f59f
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/3dscene2.xml
@@ -0,0 +1,62 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EnterGroup"/>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Window3D"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/bezier.xml b/sd/uiconfig/simpress/popupmenu/bezier.xml
new file mode 100644
index 000000000..413670232
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/bezier.xml
@@ -0,0 +1,26 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BezierMove"/>
+ <menu:menuitem menu:id=".uno:BezierInsert"/>
+ <menu:menuitem menu:id=".uno:BezierDelete"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BezierClose"/>
+ <menu:menuitem menu:id=".uno:BezierCutLine"/>
+ <menu:menuitem menu:id=".uno:BezierConvert"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BezierEdge"/>
+ <menu:menuitem menu:id=".uno:BezierSmooth"/>
+ <menu:menuitem menu:id=".uno:BezierSymmetric"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BezierEliminatePoints"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/connector.xml b/sd/uiconfig/simpress/popupmenu/connector.xml
new file mode 100644
index 000000000..18c01cc90
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/connector.xml
@@ -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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NewRouting"/>
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:ConnectorAttributes"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Dismantle"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/curve.xml b/sd/uiconfig/simpress/popupmenu/curve.xml
new file mode 100644
index 000000000..42c777e3d
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/curve.xml
@@ -0,0 +1,75 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuitem menu:id=".uno:CloseObject"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FontDialog"/>
+ <menu:menuitem menu:id=".uno:ParagraphDialog"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Dismantle"/>
+ <menu:menuitem menu:id=".uno:Break"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/draw.xml b/sd/uiconfig/simpress/popupmenu/draw.xml
new file mode 100644
index 000000000..722250f0d
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/draw.xml
@@ -0,0 +1,73 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuitem menu:id=".uno:AdvancedMode"/>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Dismantle"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/drawtext.xml b/sd/uiconfig/simpress/popupmenu/drawtext.xml
new file mode 100644
index 000000000..d0b1a9528
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/drawtext.xml
@@ -0,0 +1,31 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuitem menu:id=".uno:PasteUnformatted"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TextAttributes"/>
+ <menu:menuitem menu:id=".uno:FontDialog"/>
+ <menu:menuitem menu:id=".uno:ParagraphDialog"/>
+ <menu:menuitem menu:id=".uno:OutlineBullet"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OpenHyperlinkOnCursor"/>
+ <menu:menuitem menu:id=".uno:EditHyperlink"/>
+ <menu:menuitem menu:id=".uno:CopyHyperlinkLocation"/>
+ <menu:menuitem menu:id=".uno:RemoveHyperlink"/>
+ <menu:menuitem menu:id=".uno:ThesaurusFromContext"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SetDefault"/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertAnnotation"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/form.xml b/sd/uiconfig/simpress/popupmenu/form.xml
new file mode 100644
index 000000000..8952b64f7
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/form.xml
@@ -0,0 +1,52 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ControlProperties"/>
+ <menu:menuitem menu:id=".uno:FormProperties"/>
+ <menu:menuitem menu:id=".uno:ChangeControlType"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:FormatGroup"/>
+ <menu:menuitem menu:id=".uno:FormatUngroup"/>
+ <menu:menuitem menu:id=".uno:EnterGroup"/>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/formrichtext.xml b/sd/uiconfig/simpress/popupmenu/formrichtext.xml
new file mode 100644
index 000000000..f5f8f7a0d
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/formrichtext.xml
@@ -0,0 +1,46 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CharFontName"/>
+ <menu:menuitem menu:id=".uno:FontHeight"/>
+ <menu:menu menu:id=".uno:StyleMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Bold"/>
+ <menu:menuitem menu:id=".uno:Italic"/>
+ <menu:menuitem menu:id=".uno:Overline"/>
+ <menu:menuitem menu:id=".uno:Underline"/>
+ <menu:menuitem menu:id=".uno:Strikeout"/>
+ <menu:menuitem menu:id=".uno:Shadowed"/>
+ <menu:menuitem menu:id=".uno:OutlineFont"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SuperScript"/>
+ <menu:menuitem menu:id=".uno:SubScript"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:TextAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:LeftPara" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:CenterPara" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:RightPara" menu:style="radio"/>
+ <menu:menuitem menu:id=".uno:JustifyPara" menu:style="radio"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:FormatSpacingMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SpacePara1"/>
+ <menu:menuitem menu:id=".uno:SpacePara15"/>
+ <menu:menuitem menu:id=".uno:SpacePara2"/>
+ </menu:menupopup>
+ </menu:menu>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/gluepoint.xml b/sd/uiconfig/simpress/popupmenu/gluepoint.xml
new file mode 100644
index 000000000..c38a99349
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/gluepoint.xml
@@ -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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:GlueInsertPoint"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GlueEscapeDirectionLeft"/>
+ <menu:menuitem menu:id=".uno:GlueEscapeDirectionTop"/>
+ <menu:menuitem menu:id=".uno:GlueEscapeDirectionRight"/>
+ <menu:menuitem menu:id=".uno:GlueEscapeDirectionBottom"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GluePercent"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GlueHorzAlignLeft"/>
+ <menu:menuitem menu:id=".uno:GlueHorzAlignCenter"/>
+ <menu:menuitem menu:id=".uno:GlueHorzAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GlueVertAlignTop"/>
+ <menu:menuitem menu:id=".uno:GlueVertAlignCenter"/>
+ <menu:menuitem menu:id=".uno:GlueVertAlignBottom"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/graphic.xml b/sd/uiconfig/simpress/popupmenu/graphic.xml
new file mode 100644
index 000000000..5015d4c6a
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/graphic.xml
@@ -0,0 +1,82 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Crop"/>
+ <menu:menuitem menu:id=".uno:ExternalEdit"/>
+ <menu:menuitem menu:id=".uno:ChangePicture"/>
+ <menu:menuitem menu:id=".uno:CompressGraphic"/>
+ <menu:menuitem menu:id=".uno:SaveGraphic"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OriginalSize"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:RotateFlipMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ToggleObjectRotateMode"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:FormatGroup"/>
+ <menu:menuitem menu:id=".uno:FormatUngroup"/>
+ <menu:menuitem menu:id=".uno:EnterGroup"/>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Break"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EditQrCode"/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/group.xml b/sd/uiconfig/simpress/popupmenu/group.xml
new file mode 100644
index 000000000..e31f6716c
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/group.xml
@@ -0,0 +1,69 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:FormatUngroup"/>
+ <menu:menuitem menu:id=".uno:EnterGroup"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/line.xml b/sd/uiconfig/simpress/popupmenu/line.xml
new file mode 100644
index 000000000..66d754a03
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/line.xml
@@ -0,0 +1,68 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Dismantle"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/measure.xml b/sd/uiconfig/simpress/popupmenu/measure.xml
new file mode 100644
index 000000000..2debd423f
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/measure.xml
@@ -0,0 +1,75 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToggleObjectBezierMode"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:TextAttributes"/>
+ <menu:menuitem menu:id=".uno:MeasureAttributes"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FontDialog"/>
+ <menu:menuitem menu:id=".uno:ParagraphDialog"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuitem menu:id=".uno:Dismantle"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/media.xml b/sd/uiconfig/simpress/popupmenu/media.xml
new file mode 100644
index 000000000..f5516a248
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/media.xml
@@ -0,0 +1,48 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/multiselect.xml b/sd/uiconfig/simpress/popupmenu/multiselect.xml
new file mode 100644
index 000000000..51f76552d
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/multiselect.xml
@@ -0,0 +1,88 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:DistributeSelection"/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:MirrorMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:PolyFormen">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:Combine"/>
+ <menu:menuitem menu:id=".uno:Dismantle"/>
+ <menu:menuitem menu:id=".uno:Connect"/>
+ <menu:menuitem menu:id=".uno:Break"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:Merge"/>
+ <menu:menuitem menu:id=".uno:Substract"/>
+ <menu:menuitem menu:id=".uno:Intersect"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:EqualizeWidth"/>
+ <menu:menuitem menu:id=".uno:EqualizeHeight"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:FormatGroup"/>
+ <menu:menuitem menu:id=".uno:FormatUngroup"/>
+ <menu:menuitem menu:id=".uno:LeaveGroup"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ExportTo"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/notebookbar.xml b/sd/uiconfig/simpress/popupmenu/notebookbar.xml
new file mode 100644
index 000000000..ae78bb4ce
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/notebookbar.xml
@@ -0,0 +1,24 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:AddDirect"/>
+ <menu:menuitem menu:id=".uno:RecentFileList"/>
+ <menu:menuitem menu:id=".uno:CloseDoc"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ToolbarModeUI"/>
+ <menu:menuitem menu:id=".uno:AvailableToolbars"/>
+ <menu:menuitem menu:id=".uno:ConfigureDialog"/>
+ <menu:menuitem menu:id=".uno:OptionsTreeDialog"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:HelpIndex"/>
+ <menu:menuitem menu:id=".uno:Donation"/>
+ <menu:menuitem menu:id=".uno:About"/>
+ <menu:menuseparator/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/oleobject.xml b/sd/uiconfig/simpress/popupmenu/oleobject.xml
new file mode 100644
index 000000000..54ebcdd51
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/oleobject.xml
@@ -0,0 +1,70 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:OriginalSize"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:RotateFlipMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ToggleObjectRotateMode"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:MirrorVert"/>
+ <menu:menuitem menu:id=".uno:MirrorHorz"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:NameGroup"/>
+ <menu:menuitem menu:id=".uno:ObjectTitleDescription"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/outline.xml b/sd/uiconfig/simpress/popupmenu/outline.xml
new file mode 100644
index 000000000..6ddc0b1a9
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/outline.xml
@@ -0,0 +1,33 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SetDefault"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FontDialog"/>
+ <menu:menuitem menu:id=".uno:OutlineBullet"/>
+ <menu:menu menu:id=".uno:TransliterateMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeCaseToSentenceCase"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToLower"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToUpper"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToTitleCase"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToToggleCase"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToHalfWidth"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToFullWidth"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToHiragana"/>
+ <menu:menuitem menu:id=".uno:ChangeCaseToKatakana"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:ModifyPresentationObject"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/page.xml b/sd/uiconfig/simpress/popupmenu/page.xml
new file mode 100644
index 000000000..8a94daf5d
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/page.xml
@@ -0,0 +1,82 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ShowRuler"/>
+ <menu:menu menu:id=".uno:GridMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:GridVisible"/>
+ <menu:menuitem menu:id=".uno:GridUse"/>
+ <menu:menuitem menu:id=".uno:GridFront"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:HelplinesMove"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:SnapLinesMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:HelplinesVisible"/>
+ <menu:menuitem menu:id=".uno:HelplinesFront"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:GridUse"/>
+ <menu:menuitem menu:id=".uno:HelplinesUse"/>
+ <menu:menuitem menu:id=".uno:SnapFrame"/>
+ <menu:menuitem menu:id=".uno:SnapPoints"/>
+ <menu:menuitem menu:id=".uno:SnapBorder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:CapturePoint"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:SlideLayoutMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=20"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=19"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=0"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=1"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=32"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=3"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=12"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=15"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=14"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=16"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=18"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=34"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=28"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=27"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=29"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=30"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:NavigateMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:FirstSlide"/>
+ <menu:menuitem menu:id=".uno:PreviousSlide"/>
+ <menu:menuitem menu:id=".uno:NextSlide"/>
+ <menu:menuitem menu:id=".uno:LastSlide"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:SlideMoveMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MoveSlideFirst"/>
+ <menu:menuitem menu:id=".uno:MoveSlideUp"/>
+ <menu:menuitem menu:id=".uno:MoveSlideDown"/>
+ <menu:menuitem menu:id=".uno:MoveSlideLast"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuitem menu:id=".uno:SaveBackground"/>
+ <menu:menuitem menu:id=".uno:PresentationLayout"/>
+ <menu:menuitem menu:id=".uno:SlideChangeWindow"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SlideSetup"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/pagepane.xml b/sd/uiconfig/simpress/popupmenu/pagepane.xml
new file mode 100644
index 000000000..6f8af1640
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/pagepane.xml
@@ -0,0 +1,62 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertSlide"/>
+ <menu:menuitem menu:id=".uno:DuplicateSlide"/>
+ <menu:menuitem menu:id=".uno:RenameSlide"/>
+ <menu:menuitem menu:id=".uno:HideSlide"/>
+ <menu:menuitem menu:id=".uno:ShowSlide"/>
+ <menu:menuitem menu:id=".uno:DeleteSlide"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:SlideLayoutMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=20"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=19"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=0"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=1"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=32"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=3"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=12"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=15"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=14"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=16"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=18"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=34"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=28"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=27"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=29"/>
+ <menu:menuitem menu:id=".uno:AssignLayout?WhatLayout:long=30"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:NavigateMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:FirstSlide"/>
+ <menu:menuitem menu:id=".uno:PreviousSlide"/>
+ <menu:menuitem menu:id=".uno:NextSlide"/>
+ <menu:menuitem menu:id=".uno:LastSlide"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:SlideMoveMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:MoveSlideFirst"/>
+ <menu:menuitem menu:id=".uno:MoveSlideUp"/>
+ <menu:menuitem menu:id=".uno:MoveSlideDown"/>
+ <menu:menuitem menu:id=".uno:MoveSlideLast"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SlideSetup"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/pagepanemaster.xml b/sd/uiconfig/simpress/popupmenu/pagepanemaster.xml
new file mode 100644
index 000000000..812d0ad44
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/pagepanemaster.xml
@@ -0,0 +1,18 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertMasterPage"/>
+ <menu:menuitem menu:id=".uno:DeleteMasterPage"/>
+ <menu:menuitem menu:id=".uno:RenameMasterPage"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/pagepanenosel.xml b/sd/uiconfig/simpress/popupmenu/pagepanenosel.xml
new file mode 100644
index 000000000..62a2bcc21
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/pagepanenosel.xml
@@ -0,0 +1,16 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertSlide"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/pagepanenoselmaster.xml b/sd/uiconfig/simpress/popupmenu/pagepanenoselmaster.xml
new file mode 100644
index 000000000..919e3c59c
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/pagepanenoselmaster.xml
@@ -0,0 +1,16 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertMasterPage"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/pagetab.xml b/sd/uiconfig/simpress/popupmenu/pagetab.xml
new file mode 100644
index 000000000..b5d34b3ce
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/pagetab.xml
@@ -0,0 +1,19 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertSlide"/>
+ <menu:menuitem menu:id=".uno:DeleteSlide"/>
+ <menu:menuitem menu:id=".uno:ModifyPage"/>
+ <menu:menuitem menu:id=".uno:RenameSlide"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/table.xml b/sd/uiconfig/simpress/popupmenu/table.xml
new file mode 100644
index 000000000..67d7950a0
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/table.xml
@@ -0,0 +1,79 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:MergeCells"/>
+ <menu:menuitem menu:id=".uno:SplitCell"/>
+ <menu:menu menu:id=".uno:TableInsertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:InsertRowsBefore"/>
+ <menu:menuitem menu:id=".uno:InsertRowsAfter"/>
+ <menu:menuitem menu:id=".uno:InsertRowDialog"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:InsertColumnsBefore"/>
+ <menu:menuitem menu:id=".uno:InsertColumnsAfter"/>
+ <menu:menuitem menu:id=".uno:InsertColumnDialog"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:TableDeleteMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:DeleteRows"/>
+ <menu:menuitem menu:id=".uno:DeleteColumns"/>
+ <menu:menuitem menu:id=".uno:DeleteTable"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:TableAutoFitMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:SetRowHeight"/>
+ <menu:menuitem menu:id=".uno:SetMinimalRowHeight"/>
+ <menu:menuitem menu:id=".uno:SetOptimalRowHeight"/>
+ <menu:menuitem menu:id=".uno:DistributeRows"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SetColumnWidth"/>
+ <menu:menuitem menu:id=".uno:SetMinimalColumnWidth"/>
+ <menu:menuitem menu:id=".uno:SetOptimalColumnWidth"/>
+ <menu:menuitem menu:id=".uno:DistributeColumns"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FontDialog"/>
+ <menu:menuitem menu:id=".uno:ParagraphDialog"/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TableDialog"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/popupmenu/textbox.xml b/sd/uiconfig/simpress/popupmenu/textbox.xml
new file mode 100644
index 000000000..ff620d770
--- /dev/null
+++ b/sd/uiconfig/simpress/popupmenu/textbox.xml
@@ -0,0 +1,68 @@
+<?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/.
+ *
+-->
+<menu:menupopup xmlns:menu="http://openoffice.org/2001/menu">
+ <menu:menuitem menu:id=".uno:Cut"/>
+ <menu:menuitem menu:id=".uno:Copy"/>
+ <menu:menuitem menu:id=".uno:Paste"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TextAutoFitToSize"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:TransformDialog"/>
+ <menu:menuitem menu:id=".uno:FormatLine"/>
+ <menu:menuitem menu:id=".uno:FormatArea"/>
+ <menu:menuitem menu:id=".uno:TextAttributes"/>
+ <menu:menuitem menu:id=".uno:FontWork"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:FontDialog"/>
+ <menu:menuitem menu:id=".uno:ParagraphDialog"/>
+ <menu:menuseparator/>
+ <menu:menu menu:id=".uno:ObjectAlign">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ObjectAlignLeft"/>
+ <menu:menuitem menu:id=".uno:AlignCenter"/>
+ <menu:menuitem menu:id=".uno:ObjectAlignRight"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:AlignUp"/>
+ <menu:menuitem menu:id=".uno:AlignMiddle"/>
+ <menu:menuitem menu:id=".uno:AlignDown"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ArrangeMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:BringToFront"/>
+ <menu:menuitem menu:id=".uno:Forward"/>
+ <menu:menuitem menu:id=".uno:Backward"/>
+ <menu:menuitem menu:id=".uno:SendToBack"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:BeforeObject"/>
+ <menu:menuitem menu:id=".uno:BehindObject"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:ReverseOrder"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menu menu:id=".uno:ConvertMenu">
+ <menu:menupopup>
+ <menu:menuitem menu:id=".uno:ChangeBezier"/>
+ <menu:menuitem menu:id=".uno:ChangePolygon"/>
+ <menu:menuitem menu:id=".uno:convert_to_contour"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3D"/>
+ <menu:menuitem menu:id=".uno:ConvertInto3DLatheFast"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoBitmap"/>
+ <menu:menuitem menu:id=".uno:ConvertIntoMetaFile"/>
+ </menu:menupopup>
+ </menu:menu>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:SetDefault"/>
+ <menu:menuitem menu:id=".uno:EditStyle"/>
+ <menu:menuseparator/>
+ <menu:menuitem menu:id=".uno:CustomAnimation"/>
+ <menu:menuitem menu:id=".uno:AnimationEffects"/>
+ <menu:menuitem menu:id=".uno:ExecuteAnimationEffect"/>
+</menu:menupopup>
diff --git a/sd/uiconfig/simpress/statusbar/statusbar.xml b/sd/uiconfig/simpress/statusbar/statusbar.xml
new file mode 100644
index 000000000..c0a923e4a
--- /dev/null
+++ b/sd/uiconfig/simpress/statusbar/statusbar.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE statusbar:statusbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "statusbar.dtd">
+<!--
+ * 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 .
+-->
+<statusbar:statusbar xmlns:statusbar="http://openoffice.org/2001/statusbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <statusbar:statusbaritem xlink:href=".uno:PageStatus" statusbar:align="left" statusbar:width="124"/>
+ <statusbar:statusbaritem xlink:href=".uno:Context" statusbar:align="left" statusbar:autosize="true" statusbar:mandatory="false" statusbar:width="184"/>
+ <statusbar:statusbaritem xlink:href=".uno:LayoutStatus" statusbar:align="left" statusbar:autosize="true" statusbar:mandatory="false" statusbar:width="54"/>
+ <statusbar:statusbaritem xlink:href=".uno:Size" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="200"/>
+ <statusbar:statusbaritem xlink:href=".uno:ModifiedStatus" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="9"/>
+ <statusbar:statusbaritem xlink:href=".uno:Signature" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="16"/>
+ <statusbar:statusbaritem xlink:href=".uno:LanguageStatus" statusbar:align="center" statusbar:autosize="true" statusbar:width="100"/>
+ <statusbar:statusbaritem xlink:href=".uno:ZoomPage" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="9"/>
+ <statusbar:statusbaritem xlink:href=".uno:ZoomSlider" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="130"/>
+ <statusbar:statusbaritem xlink:href=".uno:Zoom" statusbar:align="center" statusbar:width="36"/>
+</statusbar:statusbar>
diff --git a/sd/uiconfig/simpress/toolbar/3dobjectsbar.xml b/sd/uiconfig/simpress/toolbar/3dobjectsbar.xml
new file mode 100644
index 000000000..bc0b6f81e
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/3dobjectsbar.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:Cube"/>
+ <toolbar:toolbaritem xlink:href=".uno:Sphere"/>
+ <toolbar:toolbaritem xlink:href=".uno:Cylinder"/>
+ <toolbar:toolbaritem xlink:href=".uno:Cone"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Cyramid"/>
+ <toolbar:toolbaritem xlink:href=".uno:Torus"/>
+ <toolbar:toolbaritem xlink:href=".uno:Shell3D"/>
+ <toolbar:toolbaritem xlink:href=".uno:HalfSphere"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/alignmentbar.xml b/sd/uiconfig/simpress/toolbar/alignmentbar.xml
new file mode 100644
index 000000000..38d0340a3
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/alignmentbar.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlignLeft"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlignRight"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignUp"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignMiddle"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignDown"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/arrowsbar.xml b/sd/uiconfig/simpress/toolbar/arrowsbar.xml
new file mode 100644
index 000000000..4e947f2b3
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/arrowsbar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:LineArrowEnd"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineCircleArrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineSquareArrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineArrows"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:LineArrowStart"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineArrowCircle"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineArrowSquare"/>
+ <toolbar:toolbaritem xlink:href=".uno:Line"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:MeasureLine"/>
+ <toolbar:toolbaritem xlink:href=".uno:Line_Diagonal"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/arrowshapes.xml b/sd/uiconfig/simpress/toolbar/arrowshapes.xml
new file mode 100644
index 000000000..3f74148c7
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/arrowshapes.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.right-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.down-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-right-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-down-arrow"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.circular-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.s-sharped-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.split-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.split-round-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.quad-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.corner-right-arrow"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.chevron"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.pentagon-right"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.striped-right-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-down-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.notched-right-arrow"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-arrow"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.right-arrow-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-arrow-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.down-arrow-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-arrow-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-right-arrow-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-down-arrow-callout"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.quad-arrow-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-arrow-callout"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/basicshapes.xml b/sd/uiconfig/simpress/toolbar/basicshapes.xml
new file mode 100644
index 000000000..148245f66
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/basicshapes.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.rectangle"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.round-rectangle"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.quadrat"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.round-quadrat"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.parallelogram"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.trapezoid"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ellipse"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.circle"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.circle-pie"/>
+ <toolbar:toolbaritem xlink:href=".uno:CircleCut"/>
+ <toolbar:toolbaritem xlink:href=".uno:Arc"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.block-arc"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.isosceles-triangle"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.right-triangle"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.diamond"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.pentagon"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.hexagon"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.octagon"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.can"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.cube"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.paper"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.cross"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.frame"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ring"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/bezierobjectbar.xml b/sd/uiconfig/simpress/toolbar/bezierobjectbar.xml
new file mode 100644
index 000000000..914738e7c
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/bezierobjectbar.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ToggleObjectBezierMode" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierMove"/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierInsert"/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierDelete"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierConvert"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierClose"/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierCutLine"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierEdge"/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierSmooth"/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierSymmetric"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BezierEliminatePoints"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/calloutshapes.xml b/sd/uiconfig/simpress/toolbar/calloutshapes.xml
new file mode 100644
index 000000000..04176302c
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/calloutshapes.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.rectangular-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.round-rectangular-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.round-callout"/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.cloud-callout"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-1"/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-2"/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-3"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/choosemodebar.xml b/sd/uiconfig/simpress/toolbar/choosemodebar.xml
new file mode 100644
index 000000000..c8bda0762
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/choosemodebar.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ToggleObjectRotateMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:Mirror"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConvertInto3DLathe"/>
+ <toolbar:toolbaritem xlink:href=".uno:CrookRotate"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:CrookSlant"/>
+ <toolbar:toolbaritem xlink:href=".uno:Shear"/>
+ <toolbar:toolbaritem xlink:href=".uno:InteractiveTransparence"/>
+ <toolbar:toolbaritem xlink:href=".uno:InteractiveGradient"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/classificationbar.xml b/sd/uiconfig/simpress/toolbar/classificationbar.xml
new file mode 100644
index 000000000..e81fea06e
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/classificationbar.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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/.
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ClassificationApply"/>
+ <toolbar:toolbaritem xlink:href=".uno:ClassificationDialog"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/colorbar.xml b/sd/uiconfig/simpress/toolbar/colorbar.xml
new file mode 100644
index 000000000..879b6a647
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/colorbar.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:GrafRed"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafGreen"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafBlue"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafLuminance"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafContrast"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafGamma"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/commentsbar.xml b/sd/uiconfig/simpress/toolbar/commentsbar.xml
new file mode 100644
index 000000000..a2f6a6eac
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/commentsbar.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:InsertAnnotation"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:PreviousAnnotation"/>
+ <toolbar:toolbaritem xlink:href=".uno:NextAnnotation"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteAnnotation"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteAllAnnotation"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/commontaskbar.xml b/sd/uiconfig/simpress/toolbar/commontaskbar.xml
new file mode 100644
index 000000000..9df003a0e
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/commontaskbar.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:InsertSlide"/>
+ <toolbar:toolbaritem xlink:href=".uno:DuplicateSlide"/>
+ <toolbar:toolbaritem xlink:href=".uno:RenameSlide" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteSlide"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:AssignLayout"/>
+ <toolbar:toolbaritem xlink:href=".uno:PresentationLayout" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExpandPage" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FirstSlide" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:PreviousSlide" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:NextSlide" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:LastSlide" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:MoveSlideFirst" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:MoveSlideUp" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:MoveSlideDown" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:MoveSlideLast" toolbar:visible="false"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/connectorsbar.xml b/sd/uiconfig/simpress/toolbar/connectorsbar.xml
new file mode 100644
index 000000000..8355775e2
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/connectorsbar.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorArrowEnd"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLineArrowEnd"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveArrowEnd"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesArrowEnd"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Connector"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLine"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurve"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLines"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorArrows"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLineArrows"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveArrows"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesArrows"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorArrowStart" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLineArrowStart" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveArrowStart" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesArrowStart" toolbar:visible="false"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCircleEnd" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLineCircleEnd" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveCircleEnd" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesCircleEnd" toolbar:visible="false"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCircleStart" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLineCircleStart" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveCircleStart" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesCircleStart" toolbar:visible="false"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCircles" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLineCircles" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorCurveCircles" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorLinesCircles" toolbar:visible="false"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/distributebar.xml b/sd/uiconfig/simpress/toolbar/distributebar.xml
new file mode 100644
index 000000000..308104262
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/distributebar.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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/.
+ *
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:DistributeHorzLeft"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeHorzCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeHorzDistance"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeHorzRight"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeVertTop"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeVertCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeVertDistance"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeVertBottom"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/drawingobjectbar.xml b/sd/uiconfig/simpress/toolbar/drawingobjectbar.xml
new file mode 100644
index 000000000..83203c672
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/drawingobjectbar.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:TransformDialog"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlignLeft" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignCenter" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlignRight" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignUp" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignMiddle" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignDown" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectPosition" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BringToFront"/>
+ <toolbar:toolbaritem xlink:href=".uno:Forward"/>
+ <toolbar:toolbaritem xlink:href=".uno:Backward"/>
+ <toolbar:toolbaritem xlink:href=".uno:SendToBack"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BeforeObject"/>
+ <toolbar:toolbaritem xlink:href=".uno:BehindObject"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ReverseOrder"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:XLineStyle"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineWidth"/>
+ <toolbar:toolbaritem xlink:href=".uno:XLineColor"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FillStyle"/>
+ <toolbar:toolbaritem xlink:href=".uno:FillColor" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FillShadow"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:LineEndStyle"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:MirrorVert"/>
+ <toolbar:toolbaritem xlink:href=".uno:MirrorHorz"/>
+ <toolbar:toolbaritem xlink:href=".uno:AdvancedMode"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatLine" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatArea" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Window3D" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ImageMapDialog" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:CustomAnimation" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AnimationEffects"/>
+ <toolbar:toolbaritem xlink:href=".uno:DesignerDialog"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GridVisible"/>
+ <toolbar:toolbaritem xlink:href=".uno:GridUse"/>
+ <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/>
+</toolbar:toolbar>
+
diff --git a/sd/uiconfig/simpress/toolbar/ellipsesbar.xml b/sd/uiconfig/simpress/toolbar/ellipsesbar.xml
new file mode 100644
index 000000000..35167b9c7
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/ellipsesbar.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:Ellipse"/>
+ <toolbar:toolbaritem xlink:href=".uno:Circle"/>
+ <toolbar:toolbaritem xlink:href=".uno:Pie"/>
+ <toolbar:toolbaritem xlink:href=".uno:CirclePie"/>
+ <toolbar:toolbaritem xlink:href=".uno:EllipseCut"/>
+ <toolbar:toolbaritem xlink:href=".uno:CircleCut"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Ellipse_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Circle_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Pie_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:CirclePie_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:EllipseCut_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:CircleCut_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Arc"/>
+ <toolbar:toolbaritem xlink:href=".uno:CircleArc"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/extrusionobjectbar.xml b/sd/uiconfig/simpress/toolbar/extrusionobjectbar.xml
new file mode 100644
index 000000000..5f5ff2916
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/extrusionobjectbar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltDown"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltUp"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltLeft"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionTiltRight"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionDepthFloater"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionDirectionFloater"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionLightingFloater"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionSurfaceFloater"/>
+ <toolbar:toolbaritem xlink:href=".uno:Extrusion3DColor"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/findbar.xml b/sd/uiconfig/simpress/toolbar/findbar.xml
new file mode 100644
index 000000000..7c71a1ac2
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/findbar.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ExitSearch"/>
+ <toolbar:toolbaritem xlink:href=".uno:FindText"/>
+ <toolbar:toolbaritem xlink:href=".uno:UpSearch"/>
+ <toolbar:toolbaritem xlink:href=".uno:DownSearch"/>
+ <toolbar:toolbaritem xlink:href=".uno:FindAll"/>
+ <toolbar:toolbaritem xlink:href=".uno:MatchCase"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SearchLabel"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/flowchartshapes.xml b/sd/uiconfig/simpress/toolbar/flowchartshapes.xml
new file mode 100644
index 000000000..c1f676895
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/flowchartshapes.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-process"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-alternate-process"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-decision"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-data"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-predefined-process"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-internal-storage"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-document"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-multidocument"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-terminator"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-preparation"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-manual-input"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-manual-operation"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-connector"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-off-page-connector"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-card"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-punched-tape"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-summing-junction"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-or"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-collate"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-sort"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-extract"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-merge"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-stored-data"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-delay"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-sequential-access"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-magnetic-disk"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-direct-access-storage"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-display"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/fontworkobjectbar.xml b/sd/uiconfig/simpress/toolbar/fontworkobjectbar.xml
new file mode 100644
index 000000000..948ff1e6f
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/fontworkobjectbar.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkSameLetterHeights"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkAlignmentFloater"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkCharacterSpacingFloater"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/fontworkshapetype.xml b/sd/uiconfig/simpress/toolbar/fontworkshapetype.xml
new file mode 100644
index 000000000..46a83209b
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/fontworkshapetype.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-plain-text"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-wave"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-inflate"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-stop"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-curve-up"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-curve-down"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-triangle-up"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-triangle-down"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-right"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-left"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-up"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-down"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-slant-up"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-slant-down"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-up-and-right"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-fade-up-and-left"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-chevron-up"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-chevron-down"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-up-curve"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-down-curve"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-left-curve"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-right-curve"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-circle-curve"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-open-circle-curve"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-up-pour"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-down-pour"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-left-pour"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-arch-right-pour"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-circle-pour"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkShapeType.fontwork-open-circle-pour"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/formcontrols.xml b/sd/uiconfig/simpress/toolbar/formcontrols.xml
new file mode 100644
index 000000000..b79e0e001
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/formcontrols.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:SelectObject"/>
+ <toolbar:toolbaritem xlink:href=".uno:SwitchControlDesignMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:UseWizards"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormDesignTools"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ControlProperties" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormProperties" toolbar:visible="false"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Label"/>
+ <toolbar:toolbaritem xlink:href=".uno:Edit"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:CheckBox"/>
+ <toolbar:toolbaritem xlink:href=".uno:RadioButton"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ListBox"/>
+ <toolbar:toolbaritem xlink:href=".uno:ComboBox"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Pushbutton"/>
+ <toolbar:toolbaritem xlink:href=".uno:Imagebutton"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:FormattedField"/>
+ <toolbar:toolbaritem xlink:href=".uno:DateField"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:NumericField"/>
+ <toolbar:toolbaritem xlink:href=".uno:GroupBox"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:TimeField"/>
+ <toolbar:toolbaritem xlink:href=".uno:CurrencyField"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:PatternField"/>
+ <toolbar:toolbaritem xlink:href=".uno:Grid"/>
+ <toolbar:toolbaritem xlink:href=".uno:NavigationBar"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:ImageControl"/>
+ <toolbar:toolbaritem xlink:href=".uno:FileControl"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:SpinButton"/>
+ <toolbar:toolbaritem xlink:href=".uno:ScrollBar"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/formdesign.xml b/sd/uiconfig/simpress/toolbar/formdesign.xml
new file mode 100644
index 000000000..b75fab75f
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/formdesign.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:SelectObject"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ControlProperties"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormProperties"/>
+ <toolbar:toolbaritem xlink:href=".uno:TransformDialog"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ShowFmExplorer"/>
+ <toolbar:toolbaritem xlink:href=".uno:TabDialog"/>
+ <toolbar:toolbaritem xlink:href=".uno:AddField"/>
+ <toolbar:toolbaritem xlink:href=".uno:AutoControlFocus"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BringToFront" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:SendToBack" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatGroup" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatUngroup" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:EnterGroup" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:LeaveGroup" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:OpenReadOnly"/>
+ <toolbar:toolbaritem xlink:href=".uno:GridVisible"/>
+ <toolbar:toolbaritem xlink:href=".uno:GridUse"/>
+ <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/formsfilterbar.xml b/sd/uiconfig/simpress/toolbar/formsfilterbar.xml
new file mode 100644
index 000000000..c7c569501
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/formsfilterbar.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:FormFilterExecute"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormFilterNavigator"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FormFilterExit"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/formsnavigationbar.xml b/sd/uiconfig/simpress/toolbar/formsnavigationbar.xml
new file mode 100644
index 000000000..4ffa664e6
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/formsnavigationbar.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:RecSearch"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:RecText"/>
+ <toolbar:toolbaritem xlink:href=".uno:AbsoluteRecord"/>
+ <toolbar:toolbaritem xlink:href=".uno:RecFromText"/>
+ <toolbar:toolbaritem xlink:href=".uno:RecTotal"/>
+ <toolbar:toolbaritem xlink:href=".uno:FirstRecord"/>
+ <toolbar:toolbaritem xlink:href=".uno:PrevRecord"/>
+ <toolbar:toolbaritem xlink:href=".uno:NextRecord"/>
+ <toolbar:toolbaritem xlink:href=".uno:LastRecord"/>
+ <toolbar:toolbaritem xlink:href=".uno:NewRecord"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:RecSave"/>
+ <toolbar:toolbaritem xlink:href=".uno:RecUndo"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteRecord"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Refresh"/>
+ <toolbar:toolbaritem xlink:href=".uno:RefreshFormControl"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:OrderCrit"/>
+ <toolbar:toolbaritem xlink:href=".uno:Sortup"/>
+ <toolbar:toolbaritem xlink:href=".uno:SortDown"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:AutoFilter"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormFiltered"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormFilter"/>
+ <toolbar:toolbaritem xlink:href=".uno:RemoveFilterSort"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ViewFormAsGrid"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/formtextobjectbar.xml b/sd/uiconfig/simpress/toolbar/formtextobjectbar.xml
new file mode 100644
index 000000000..a055cba03
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/formtextobjectbar.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:CharFontName"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FontHeight"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Bold"/>
+ <toolbar:toolbaritem xlink:href=".uno:Italic"/>
+ <toolbar:toolbaritem xlink:href=".uno:Underline"/>
+ <toolbar:toolbaritem xlink:href=".uno:SuperScript"/>
+ <toolbar:toolbaritem xlink:href=".uno:SubScript"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:LeftPara"/>
+ <toolbar:toolbaritem xlink:href=".uno:CenterPara"/>
+ <toolbar:toolbaritem xlink:href=".uno:RightPara"/>
+ <toolbar:toolbaritem xlink:href=".uno:JustifyPara"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ParaLeftToRight"/>
+ <toolbar:toolbaritem xlink:href=".uno:ParaRightToLeft"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SpacePara1"/>
+ <toolbar:toolbaritem xlink:href=".uno:SpacePara15"/>
+ <toolbar:toolbaritem xlink:href=".uno:SpacePara2"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FontDialog"/>
+ <toolbar:toolbaritem xlink:href=".uno:ParagraphDialog"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/fullscreenbar.xml b/sd/uiconfig/simpress/toolbar/fullscreenbar.xml
new file mode 100644
index 000000000..9b007728d
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/fullscreenbar.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:FullScreen"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/gluepointsobjectbar.xml b/sd/uiconfig/simpress/toolbar/gluepointsobjectbar.xml
new file mode 100644
index 000000000..0183493e9
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/gluepointsobjectbar.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:GlueInsertPoint"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionLeft"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionTop"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionRight"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueEscapeDirectionBottom"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GluePercent"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueHorzAlignLeft"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueHorzAlignCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueHorzAlignRight"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueVertAlignTop"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueVertAlignCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueVertAlignBottom"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/graffilterbar.xml b/sd/uiconfig/simpress/toolbar/graffilterbar.xml
new file mode 100644
index 000000000..f820a8112
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/graffilterbar.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterInvert"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSmooth"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSharpen"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterRemoveNoise"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSolarize"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSepia"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterPoster"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterPopart"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterSobel"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterRelief"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterMosaic"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/graphicobjectbar.xml b/sd/uiconfig/simpress/toolbar/graphicobjectbar.xml
new file mode 100644
index 000000000..e11ce4417
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/graphicobjectbar.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:TransformDialog"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlignLeft" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignCenter" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlignRight" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignUp" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignMiddle" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AlignDown" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectPosition" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BringToFront"/>
+ <toolbar:toolbaritem xlink:href=".uno:Forward"/>
+ <toolbar:toolbaritem xlink:href=".uno:Backward"/>
+ <toolbar:toolbaritem xlink:href=".uno:SendToBack"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BeforeObject"/>
+ <toolbar:toolbaritem xlink:href=".uno:BehindObject"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ReverseOrder"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:XLineStyle"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineWidth"/>
+ <toolbar:toolbaritem xlink:href=".uno:XLineColor"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FillStyle"/>
+ <toolbar:toolbaritem xlink:href=".uno:FillColor" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FillShadow"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterToolbox"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafMode"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Crop"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:MirrorVert"/>
+ <toolbar:toolbaritem xlink:href=".uno:MirrorHorz"/>
+ <toolbar:toolbaritem xlink:href=".uno:AdvancedMode"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GrafTransparence"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ColorSettings"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatLine" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatArea" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:CustomAnimation" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:AnimationEffects"/>
+</toolbar:toolbar>
+
diff --git a/sd/uiconfig/simpress/toolbar/insertbar.xml b/sd/uiconfig/simpress/toolbar/insertbar.xml
new file mode 100644
index 000000000..0917cae43
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/insertbar.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:InsertPage"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertObjectFloatingFrame" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ImportFromFile" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertTable"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertGraphic"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertAVMedia"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertMath"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertObjectChart"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertObject" toolbar:visible="false"/>
+</toolbar:toolbar>
+
diff --git a/sd/uiconfig/simpress/toolbar/linesbar.xml b/sd/uiconfig/simpress/toolbar/linesbar.xml
new file mode 100644
index 000000000..542148678
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/linesbar.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:BezierFill"/>
+ <toolbar:toolbaritem xlink:href=".uno:Polygon"/>
+ <toolbar:toolbaritem xlink:href=".uno:Polygon_Diagonal"/>
+ <toolbar:toolbaritem xlink:href=".uno:Freeline"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Bezier_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Polygon_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Polygon_Diagonal_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Freeline_Unfilled"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/masterviewtoolbar.xml b/sd/uiconfig/simpress/toolbar/masterviewtoolbar.xml
new file mode 100644
index 000000000..ac5ee8f79
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/masterviewtoolbar.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:InsertMasterPage"/>
+ <toolbar:toolbaritem xlink:href=".uno:RenameMasterPage" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteMasterPage"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:CloseMasterView"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/mediaobjectbar.xml b/sd/uiconfig/simpress/toolbar/mediaobjectbar.xml
new file mode 100644
index 000000000..676253483
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/mediaobjectbar.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:InsertAVMedia"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:AVMediaToolBox"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/notebookbarshortcuts.xml b/sd/uiconfig/simpress/toolbar/notebookbarshortcuts.xml
new file mode 100644
index 000000000..a45e9d4e6
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/notebookbarshortcuts.xml
@@ -0,0 +1,17 @@
+<?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/.
+ *
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:Menubar"/>
+ <toolbar:toolbaritem xlink:href=".uno:Open"/>
+ <toolbar:toolbaritem xlink:href=".uno:Save"/>
+ <toolbar:toolbaritem xlink:href=".uno:Undo"/>
+ <toolbar:toolbaritem xlink:href=".uno:Redo"/>
+ <toolbar:toolbaritem xlink:href=".uno:Presentation"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/optimizetablebar.xml b/sd/uiconfig/simpress/toolbar/optimizetablebar.xml
new file mode 100644
index 000000000..e4653187b
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/optimizetablebar.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:SetMinimalColumnWidth"/>
+ <toolbar:toolbaritem xlink:href=".uno:SetMinimalRowHeight"/>
+ <toolbar:toolbaritem xlink:href=".uno:SetOptimalColumnWidth"/>
+ <toolbar:toolbaritem xlink:href=".uno:SetOptimalRowHeight"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeColumns"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeRows"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/optionsbar.xml b/sd/uiconfig/simpress/toolbar/optionsbar.xml
new file mode 100644
index 000000000..b8be8a12f
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/optionsbar.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ClickChangeRotation"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GridVisible"/>
+ <toolbar:toolbaritem xlink:href=".uno:HelplinesVisible"/>
+ <toolbar:toolbaritem xlink:href=".uno:HelplinesMove"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GridUse"/>
+ <toolbar:toolbaritem xlink:href=".uno:HelplinesUse"/>
+ <toolbar:toolbaritem xlink:href=".uno:SnapBorder"/>
+ <toolbar:toolbaritem xlink:href=".uno:SnapFrame"/>
+ <toolbar:toolbaritem xlink:href=".uno:SnapPoints"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:QuickEdit"/>
+ <toolbar:toolbaritem xlink:href=".uno:PickThrough"/>
+ <toolbar:toolbaritem xlink:href=".uno:DoubleClickTextEdit"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SolidCreate"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:LeaveAllGroups"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/outlinetoolbar.xml b/sd/uiconfig/simpress/toolbar/outlinetoolbar.xml
new file mode 100644
index 000000000..20b43a2e3
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/outlinetoolbar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:OutlineRight"/>
+ <toolbar:toolbaritem xlink:href=".uno:OutlineLeft"/>
+ <toolbar:toolbaritem xlink:href=".uno:OutlineDown"/>
+ <toolbar:toolbaritem xlink:href=".uno:OutlineUp"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:OutlineFormat"/>
+ <toolbar:toolbaritem xlink:href=".uno:ColorView"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:OutlineCollapseAll"/>
+ <toolbar:toolbaritem xlink:href=".uno:OutlineExpandAll"/>
+ <toolbar:toolbaritem xlink:href=".uno:OutlineCollapse" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:OutlineExpand" toolbar:visible="false"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/positionbar.xml b/sd/uiconfig/simpress/toolbar/positionbar.xml
new file mode 100644
index 000000000..5f91c67e8
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/positionbar.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:BringToFront"/>
+ <toolbar:toolbaritem xlink:href=".uno:Forward"/>
+ <toolbar:toolbaritem xlink:href=".uno:Backward"/>
+ <toolbar:toolbaritem xlink:href=".uno:SendToBack"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BeforeObject"/>
+ <toolbar:toolbaritem xlink:href=".uno:BehindObject"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ReverseOrder"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/rectanglesbar.xml b/sd/uiconfig/simpress/toolbar/rectanglesbar.xml
new file mode 100644
index 000000000..2f03f49f1
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/rectanglesbar.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:Rect"/>
+ <toolbar:toolbaritem xlink:href=".uno:Square"/>
+ <toolbar:toolbaritem xlink:href=".uno:Rect_Rounded"/>
+ <toolbar:toolbaritem xlink:href=".uno:Square_Rounded"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:Rect_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Square_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Rect_Rounded_Unfilled"/>
+ <toolbar:toolbaritem xlink:href=".uno:Square_Rounded_Unfilled"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/singlemode.xml b/sd/uiconfig/simpress/toolbar/singlemode.xml
new file mode 100644
index 000000000..0dd592d4e
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/singlemode.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:AddDirect" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Open"/>
+ <toolbar:toolbaritem xlink:href=".uno:Save"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExportDirectToPDF" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Print"/>
+ <toolbar:toolbaritem xlink:href=".uno:PrintPreview" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Undo"/>
+ <toolbar:toolbaritem xlink:href=".uno:Redo"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatPaintbrush"/>
+ <toolbar:toolbaritem xlink:href=".uno:SpellingDialog" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomPage"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertSlide"/>
+ <toolbar:toolbaritem xlink:href=".uno:DuplicateSlide"/>
+ <toolbar:toolbaritem xlink:href=".uno:RenameSlide" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteSlide"/>
+ <toolbar:toolbaritem xlink:href=".uno:AssignLayout" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:DisplayMode"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Text"/>
+ <toolbar:toolbaritem xlink:href=".uno:VerticalText" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertGraphic"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertAVMedia"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertObjectChart"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertTable"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Line"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.rectangle"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ellipse"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowsToolbox"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineToolbox"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorToolbox"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:Objects3DToolbox" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:TransformDialog" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ToggleObjectRotateMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:Mirror" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectPosition"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeSelection"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatGroup" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatUngroup" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:EnterGroup" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:LeaveGroup" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SelectObject" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomPage" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomMode" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Zoom" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Presentation"/>
+ <toolbar:toolbaritem xlink:href=".uno:PresentationCurrentSlide"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/slideviewobjectbar.xml b/sd/uiconfig/simpress/toolbar/slideviewobjectbar.xml
new file mode 100644
index 000000000..15ef811a3
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/slideviewobjectbar.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:RehearseTimings"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ShowSlide"/>
+ <toolbar:toolbaritem xlink:href=".uno:HideSlide"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:PagesPerRow"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/slideviewtoolbar.xml b/sd/uiconfig/simpress/toolbar/slideviewtoolbar.xml
new file mode 100644
index 000000000..f620b7b04
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/slideviewtoolbar.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:SelectObject"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Presentation"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/standardbar.xml b/sd/uiconfig/simpress/toolbar/standardbar.xml
new file mode 100644
index 000000000..0c081f0ee
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/standardbar.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:OpenUrl" toolbar:visible="false" />
+ <toolbar:toolbaritem xlink:href=".uno:AddDirect"/>
+ <toolbar:toolbaritem xlink:href=".uno:NewDoc" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Open"/>
+ <toolbar:toolbaritem xlink:href=".uno:OpenRemote" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Save"/>
+ <toolbar:toolbaritem xlink:href=".uno:SaveAs" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:SendMail" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:EditDoc" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ExportDirectToPDF"/>
+ <toolbar:toolbaritem xlink:href=".uno:PrintDefault" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Print"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Cut"/>
+ <toolbar:toolbaritem xlink:href=".uno:Copy"/>
+ <toolbar:toolbaritem xlink:href=".uno:Paste"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FormatPaintbrush"/>
+ <toolbar:toolbaritem xlink:href=".uno:SetDefault" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Undo"/>
+ <toolbar:toolbaritem xlink:href=".uno:Redo"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/>
+ <toolbar:toolbaritem xlink:href=".uno:SpellDialog"/>
+ <toolbar:toolbaritem xlink:href=".uno:SpellOnline" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomMode" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomToolBox" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:GridVisible"/>
+ <toolbar:toolbaritem xlink:href=".uno:GridUse"/>
+ <toolbar:toolbaritem xlink:href=".uno:HelplinesMove" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:DisplayMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:ToggleTabBarVisibility" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:SlideSetup" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:SlideMasterPage"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Presentation"/>
+ <toolbar:toolbaritem xlink:href=".uno:PresentationCurrentSlide"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertTable"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertGraphic"/>
+ <toolbar:toolbaritem xlink:href=".uno:EmojiControl" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertAVMedia"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertObjectChart"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Text"/>
+ <toolbar:toolbaritem xlink:href=".uno:CharmapControl"/>
+ <toolbar:toolbaritem xlink:href=".uno:VerticalText" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater"/>
+ <toolbar:toolbaritem xlink:href=".uno:HyperlinkDialog"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertDraw"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:AnimationEffects" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:HelpIndex" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtendedHelp" toolbar:visible="false"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/starshapes.xml b/sd/uiconfig/simpress/toolbar/starshapes.xml
new file mode 100644
index 000000000..cbc07fc70
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/starshapes.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.star4"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.star5"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.star6"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.star8"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.star12"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.star24"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.bang"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.vertical-scroll"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.horizontal-scroll"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.signet"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.doorplate"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes.concave-star6"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/symbolshapes.xml b/sd/uiconfig/simpress/toolbar/symbolshapes.xml
new file mode 100644
index 000000000..9ba9f22e0
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/symbolshapes.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.smiley"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.heart"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.sun"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.moon"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.cloud"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.lightning"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.flower"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.forbidden"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.puzzle"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.quad-bevel"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.octagon-bevel"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.diamond-bevel"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.bracket-pair"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.left-bracket"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.right-bracket"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.brace-pair"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.left-brace"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.right-brace"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/tableobjectbar.xml b/sd/uiconfig/simpress/toolbar/tableobjectbar.xml
new file mode 100644
index 000000000..87655aafe
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/tableobjectbar.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:InsertTable"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:LineStyle"/>
+ <toolbar:toolbaritem xlink:href=".uno:FrameLineColor"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SetBorderStyle"/>
+ <toolbar:toolbaritem xlink:href=".uno:FillStyle"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:MergeCells"/>
+ <toolbar:toolbaritem xlink:href=".uno:SplitCell"/>
+ <toolbar:toolbaritem xlink:href=".uno:OptimizeTable"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:CellVertTop"/>
+ <toolbar:toolbaritem xlink:href=".uno:CellVertCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:CellVertBottom"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertRowsBefore"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertRowsAfter"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertColumnsBefore"/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertColumnsAfter"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteRows"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteColumns"/>
+ <toolbar:toolbaritem xlink:href=".uno:DeleteTable"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SelectTable" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:EntireColumn" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:EntireRow" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:TableDesign"/>
+ <toolbar:toolbaritem xlink:href=".uno:TableDialog"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/textbar.xml b/sd/uiconfig/simpress/toolbar/textbar.xml
new file mode 100644
index 000000000..8121a4eef
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/textbar.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:Text"/>
+ <toolbar:toolbaritem xlink:href=".uno:TextFitToSizeTool"/>
+ <toolbar:toolbaritem xlink:href=".uno:DrawCaption"/>
+ <toolbar:toolbarbreak/>
+ <toolbar:toolbaritem xlink:href=".uno:VerticalText"/>
+ <toolbar:toolbaritem xlink:href=".uno:VerticalTextFitToSizeTool"/>
+ <toolbar:toolbaritem xlink:href=".uno:VerticalCaption"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/toolbar/textobjectbar.xml b/sd/uiconfig/simpress/toolbar/textobjectbar.xml
new file mode 100644
index 000000000..1131052a2
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/textobjectbar.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:CharFontName"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FontHeight"/>
+ <toolbar:toolbaritem xlink:href=".uno:Grow"/>
+ <toolbar:toolbaritem xlink:href=".uno:Shrink"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Bold"/>
+ <toolbar:toolbaritem xlink:href=".uno:Italic"/>
+ <toolbar:toolbaritem xlink:href=".uno:Underline"/>
+ <toolbar:toolbaritem xlink:href=".uno:UnderlineDouble" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Strikeout"/>
+ <toolbar:toolbaritem xlink:href=".uno:Overline" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SuperScript"/>
+ <toolbar:toolbaritem xlink:href=".uno:SubScript"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Shadowed"/>
+ <toolbar:toolbaritem xlink:href=".uno:OutlineFont"/>
+ <toolbar:toolbaritem xlink:href=".uno:SetDefault"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ChangeCaseToLower" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ChangeCaseToUpper" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:SmallCaps" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Color"/>
+ <toolbar:toolbaritem xlink:href=".uno:CharBackColor"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:DefaultBullet"/>
+ <toolbar:toolbaritem xlink:href=".uno:DefaultNumbering"/>
+ <toolbar:toolbaritem xlink:href=".uno:SetOutline" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:LeftPara"/>
+ <toolbar:toolbaritem xlink:href=".uno:CenterPara"/>
+ <toolbar:toolbaritem xlink:href=".uno:RightPara"/>
+ <toolbar:toolbaritem xlink:href=".uno:JustifyPara"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:CellVertTop"/>
+ <toolbar:toolbaritem xlink:href=".uno:CellVertCenter"/>
+ <toolbar:toolbaritem xlink:href=".uno:CellVertBottom"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:LineSpacing"/>
+ <toolbar:toolbaritem xlink:href=".uno:Spacing" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ParaspaceIncrease"/>
+ <toolbar:toolbaritem xlink:href=".uno:ParaspaceDecrease"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:TextdirectionLeftToRight"/>
+ <toolbar:toolbaritem xlink:href=".uno:TextdirectionTopToBottom"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ParaLeftToRight"/>
+ <toolbar:toolbaritem xlink:href=".uno:ParaRightToLeft"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SelectAll" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontDialog" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ParagraphDialog" toolbar:visible="false"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/toolbar.xml b/sd/uiconfig/simpress/toolbar/toolbar.xml
new file mode 100644
index 000000000..bc0958c5b
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/toolbar.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:SelectObject"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomToolBox" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Text" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:VerticalText" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:FontworkGalleryFloater" toolbar:visible="false"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:XLineColor"/>
+ <toolbar:toolbaritem xlink:href=".uno:FillColor"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Line"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.rectangle"/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ellipse"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:LineArrowEnd" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowsToolbox"/>
+ <toolbar:toolbaritem xlink:href=".uno:LineToolbox"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConnectorToolbox"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:BasicShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:SymbolShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:ArrowShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:CalloutShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:StarShapes"/>
+ <toolbar:toolbaritem xlink:href=".uno:Objects3DToolbox"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:TransformDialog" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ToggleObjectRotateMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:Mirror" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectAlign"/>
+ <toolbar:toolbaritem xlink:href=".uno:ObjectPosition"/>
+ <toolbar:toolbaritem xlink:href=".uno:DistributeSelection"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:FillShadow"/>
+ <toolbar:toolbaritem xlink:href=".uno:Crop"/>
+ <toolbar:toolbaritem xlink:href=".uno:GraphicFilterToolbox"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ToggleObjectBezierMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:GlueEditMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:ChangeBezier" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ChangePolygon" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConvertInto3D" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ConvertInto3DLatheFast" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExtrusionToggle"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:InsertToolbox" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Config" toolbar:visible="false"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/viewerbar.xml b/sd/uiconfig/simpress/toolbar/viewerbar.xml
new file mode 100644
index 000000000..4fdfe1d65
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/viewerbar.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:SaveAs"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:EditDoc" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ReadOnlyDoc" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:SendMail"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ExportDirectToPDF"/>
+ <toolbar:toolbaritem xlink:href=".uno:ExportDirectToEPUB" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:PrintDefault" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:Print"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Copy"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:SearchDialog"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Zoom"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Presentation"/>
+</toolbar:toolbar>
diff --git a/sd/uiconfig/simpress/toolbar/zoombar.xml b/sd/uiconfig/simpress/toolbar/zoombar.xml
new file mode 100644
index 000000000..6507ec819
--- /dev/null
+++ b/sd/uiconfig/simpress/toolbar/zoombar.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd">
+<!--
+ * 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 .
+-->
+<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <toolbar:toolbaritem xlink:href=".uno:ZoomPlus"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomMinus"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:Zoom100Percent"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomPrevious" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomNext" toolbar:visible="false"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomPage"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomPageWidth"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomOptimal"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomObjects"/>
+ <toolbar:toolbarseparator/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomMode"/>
+ <toolbar:toolbaritem xlink:href=".uno:ZoomPanning"/>
+</toolbar:toolbar> \ No newline at end of file
diff --git a/sd/uiconfig/simpress/ui/annotation.ui b/sd/uiconfig/simpress/ui/annotation.ui
new file mode 100644
index 000000000..49a8a300e
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/annotation.ui
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id=".uno:ReplyToAnnotation">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="annotationmenu|reply">_Reply</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id=".uno:DeleteAnnotation">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="annotationmenu|delete">_Delete Comment</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id=".uno:DeleteAllAnnotationByAuthor">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="annotationmenu|deleteby">Delete All Comments b_y %1</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id=".uno:DeleteAllAnnotation">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="annotationmenu|deleteall">Delete _All Comments</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkPopover" id="Annotation">
+ <property name="can-focus">False</property>
+ <property name="position">bottom</property>
+ <child>
+ <object class="GtkBox" id="container">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar-policy">never</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkDrawingArea" id="editview">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="events">GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="meta">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label">label</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="menubutton">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="focus-on-click">False</property>
+ <property name="label" translatable="no"></property>
+ <property name="receives-default">True</property>
+ <property name="valign">start</property>
+ <property name="margin-end">10</property>
+ <property name="margin-top">5</property>
+ <property name="relief">none</property>
+ <property name="draw-indicator">True</property>
+ <property name="popup">menu</property>
+ <child>
+ <placeholder/>
+ </child>
+ <style>
+ <class name="small-button"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/annotationtagmenu.ui b/sd/uiconfig/simpress/ui/annotationtagmenu.ui
new file mode 100644
index 000000000..9996b5730
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/annotationtagmenu.ui
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id=".uno:ReplyToAnnotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="annotationtagmenu|reply">_Reply</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id=".uno:DeleteAnnotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="annotationtagmenu|delete">_Delete Comment</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id=".uno:DeleteAllAnnotationByAuthor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="annotationtagmenu|deleteby">Delete All Comments b_y %1</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id=".uno:DeleteAllAnnotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="annotationtagmenu|deleteall">Delete _All Comments</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/clientboxfragment.ui b/sd/uiconfig/simpress/ui/clientboxfragment.ui
new file mode 100644
index 000000000..65af34c04
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/clientboxfragment.ui
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="ClientboxFragment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkButton" id="button">
+ <property name="label" translatable="yes" context="clientboxfragment|STR_DEAUTHORISE_CLIENT">Remove Client Authorization</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="name">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="pinlabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="clientboxfragment|STR_ENTER_PIN">Enter PIN:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">pin</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="pin">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">start</property>
+ <property name="max_length">4</property>
+ <property name="activates_default">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="width_chars">4</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroup1">
+ <property name="mode">vertical</property>
+ <widgets>
+ <widget name="button"/>
+ <widget name="name"/>
+ <widget name="pinlabel"/>
+ <widget name="pin"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/currentmastermenu.ui b/sd/uiconfig/simpress/ui/currentmastermenu.ui
new file mode 100644
index 000000000..896d8f572
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/currentmastermenu.ui
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="applyall">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="currentmastermenu|applyall">_Apply to All Slides</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="applyselect">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="currentmastermenu|applyselect">Apply to _Selected Slides</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="edit">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="currentmastermenu|edit">_Edit Master...</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="delete">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="currentmastermenu|delete">D_elete Master</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="large">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="currentmastermenu|large">Show _Large Preview</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="small">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="currentmastermenu|small">Show S_mall Preview</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/customanimationeffecttab.ui b/sd/uiconfig/simpress/ui/customanimationeffecttab.ui
new file mode 100644
index 000000000..2e505ef2d
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/customanimationeffecttab.ui
@@ -0,0 +1,439 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">10000</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon-name">media-playback-start</property>
+ </object>
+ <object class="GtkBox" id="EffectTab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="settings">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="prop_label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="label" translatable="yes" context="customanimationeffecttab|prop_label1">_Direction:</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="placeholder">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </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">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">18</property>
+ <child>
+ <object class="GtkCheckButton" id="smooth_start">
+ <property name="label" translatable="yes" context="customanimationeffecttab|smooth_start">Accelerated start</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="smooth_start-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|smooth_start">Enable this option to assign a gradually increasing speed to the start of the effect.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="smooth_end">
+ <property name="label" translatable="yes" context="customanimationeffecttab|smooth_end">Decelerated end</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="smooth_end-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|smooth_end">Enable this option to assign a gradually decreasing speed to the end of the effect.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationeffecttab|label3">Settings</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkLabel" id="aeffect_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationeffecttab|aeffect_label">A_fter animation:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">aeffect_list</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="sound_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationeffecttab|sound_label">_Sound:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">sound_list</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="text_animation_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationeffecttab|text_animation_label">_Text animation:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">text_animation_list</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="GtkLabel" id="dim_color_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationeffecttab|dim_color_label">Di_m color:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">dim_color_list</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="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkComboBoxText" id="sound_list">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="sound_list-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|sound_list">Select a sound from the Gallery or select one of the special entries.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="sound_preview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="image">image1</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="sound_preview-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|sound_preview">Plays the selected sound file.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="dim_color_list">
+ <property name="label" translatable="no"></property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="dim_color_list-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|dim_color_list">Select the dim color.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="text_delay_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationeffecttab|text_delay_label">Delay between characters</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">text_delay</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="text_delay">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="digits">1</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="text_delay-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|text_delay">Specifies the percentage of delay between animations of words or letters.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="aeffect_list">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <items>
+ <item translatable="yes" context="customanimationeffecttab|aeffect_list">Don't dim</item>
+ <item translatable="yes" context="customanimationeffecttab|aeffect_list">Dim with color</item>
+ <item translatable="yes" context="customanimationeffecttab|aeffect_list">Hide after animation</item>
+ <item translatable="yes" context="customanimationeffecttab|aeffect_list">Hide on next animation</item>
+ </items>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="aeffect_list-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|aeffect_list">Select a color to be shown after the animation ends, or select another after-effect from the list</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="text_animation_list">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <items>
+ <item translatable="yes" context="customanimationeffecttab|text_animation_list">All at once</item>
+ <item translatable="yes" context="customanimationeffecttab|text_animation_list">Word by word</item>
+ <item translatable="yes" context="customanimationeffecttab|text_animation_list">Letter by letter</item>
+ </items>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="text_animation_list-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationeffecttab|extended_tip|text_animation_list">Select the animation mode for the text of the current shape</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationeffecttab|label4">Enhancement</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroupLabel">
+ <widgets>
+ <widget name="prop_label1"/>
+ <widget name="aeffect_label"/>
+ <widget name="sound_label"/>
+ <widget name="text_animation_label"/>
+ <widget name="dim_color_label"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/customanimationfragment.ui b/sd/uiconfig/simpress/ui/customanimationfragment.ui
new file mode 100644
index 000000000..a976e5bd7
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/customanimationfragment.ui
@@ -0,0 +1,440 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">1000</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="lower">-10000</property>
+ <property name="upper">10000</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment3">
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment4">
+ <property name="upper">1000</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|25">Tiny</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|50">Smaller</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="150">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|150">Larger</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="400">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|400">Extra Large</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="menu1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckMenuItem" id="90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|90">Quarter Spin</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="180">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|180">Half Spin</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="360">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|360">Full Spin</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="720">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|720">Two Spins</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="clockwise">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|clockwise">Clockwise</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="counterclock">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|counterclock">Counter-clockwise</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="menu2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <object class="GtkMenu" id="menu3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckMenuItem" id="25scale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|25">Tiny</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="50scale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|50">Smaller</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="150scale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|150">Larger</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="400scale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|400">Extra Large</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="hori">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|hori">Horizontal</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="vert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|vert">Vertical</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="both">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|both">Both</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="menu4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckMenuItem" id="bold">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|bold">Bold</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="italic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|italic">Italic</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="underline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationfragment|underline">Underlined</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkBox" id="EffectFragment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkComboBoxText" id="combo">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="color">
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ <property name="label" translatable="no"></property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="fontname">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="has_entry">True</property>
+ <child internal-child="entry">
+ <object class="GtkEntry">
+ <property name="truncate-multiline">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="fontsize">
+ <property name="can_focus">True</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="fontsizemenu">
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="no_show_all">True</property>
+ <property name="popup">menu</property>
+ <property name="draw_indicator">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="no"></property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="rotate">
+ <property name="can_focus">True</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment2</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="rotatemenu">
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="no_show_all">True</property>
+ <property name="popup">menu1</property>
+ <property name="draw_indicator">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="no"></property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="transparent">
+ <property name="can_focus">True</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment3</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="transparentmenu">
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="no_show_all">True</property>
+ <property name="popup">menu2</property>
+ <property name="draw_indicator">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="no"></property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="scale">
+ <property name="can_focus">True</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment4</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="scalemenu">
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="no_show_all">True</property>
+ <property name="popup">menu3</property>
+ <property name="draw_indicator">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="no"></property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry">
+ <property name="can_focus">True</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="editable">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="entrymenu">
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="no_show_all">True</property>
+ <property name="popup">menu4</property>
+ <property name="draw_indicator">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="no"></property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/customanimationproperties.ui b/sd/uiconfig/simpress/ui/customanimationproperties.ui
new file mode 100644
index 000000000..d6191125c
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/customanimationproperties.ui
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="CustomAnimationProperties">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="customanimationproperties|CustomAnimationProperties">Effect Options</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">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" translatable="yes" context="stock">_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-underline">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" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="tabcontrol">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="scrollable">True</property>
+ <property name="enable_popup">True</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="effect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationproperties|effect">Effect</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="timing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationproperties|timing">Timing</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="textanim">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationproperties|textanim">Text Animation</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </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-widget response="-11">help</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/customanimationspanel.ui b/sd/uiconfig/simpress/ui/customanimationspanel.ui
new file mode 100644
index 000000000..848b40da9
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/customanimationspanel.ui
@@ -0,0 +1,705 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">100000</property>
+ <property name="step-increment">0.5</property>
+ <property name="page-increment">5</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="upper">100000</property>
+ <property name="step-increment">0.5</property>
+ <property name="page-increment">5</property>
+ </object>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">sfx2/res/symphony/sidebar-property-small.png</property>
+ </object>
+ <object class="GtkImage" id="image_add">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">svtools/res/list_add.png</property>
+ </object>
+ <object class="GtkImage" id="image_down">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">cmd/sc_movedown.png</property>
+ </object>
+ <object class="GtkImage" id="image_play">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">sd/res/playblue_16.png</property>
+ </object>
+ <object class="GtkImage" id="image_remove">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">extensions/res/buttonminus.png</property>
+ </object>
+ <object class="GtkImage" id="image_up">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">cmd/sc_moveup.png</property>
+ </object>
+ <object class="GtkTreeStore" id="liststore1">
+ <columns>
+ <!-- column-name expander -->
+ <column type="GdkPixbuf"/>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkTreeStore" id="liststore2">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ <!-- column-name weight1 -->
+ <column type="gint"/>
+ <!-- column-name sensitive1 -->
+ <column type="gboolean"/>
+ <!-- column-name extraindent1 -->
+ <column type="gint"/>
+ <!-- column-name align1 -->
+ <column type="gdouble"/>
+ </columns>
+ </object>
+ <object class="GtkBox" id="CustomAnimationsPanel">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="vexpand">True</property>
+ <property name="border-width">6</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkPaned">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="wide-handle">True</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hscrollbar-policy">never</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkBox" id="bxApplied">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="can-focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow-type">in</property>
+ <child>
+ <object class="GtkTreeView" id="custom_animation_list">
+ <property name="width-request">260</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="no-show-all">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore1</property>
+ <property name="headers-visible">False</property>
+ <property name="reorderable">True</property>
+ <property name="search-column">1</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn2">
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCellRendererPixbuf" id="cellrenderertext4"/>
+ <attributes>
+ <attribute name="pixbuf">0</attribute>
+ </attributes>
+ </child>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="custom_animation_list-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|custom_animation_list">The animation list displays all animations for the current slide.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="custom_animation_label_parent">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow-type">in</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkLabel" id="custom_animation_label">
+ <property name="width-request">260</property>
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="no-show-all">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label" translatable="yes" context="customanimationspanel|STR_CUSTOMANIMATION_LIST_HELPTEXT">First select the slide element and then click 'Add' to add an animation effect.</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hscrollbar-policy">never</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <!-- n-columns=3 n-rows=13 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="row-spacing">3</property>
+ <property name="column-spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="lbEffect">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="customanimationspanel|lbEffect">Effects</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ <property name="width">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-top">3</property>
+ <property name="margin-bottom">6</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkButton" id="add_effect">
+ <property name="label" translatable="yes" context="customanimationspanel|add">_Add</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="tooltip-text" translatable="yes" context="customanimationspanel|add_effect|tooltip_text">Add Effect</property>
+ <property name="image">image_add</property>
+ <property name="use-underline">True</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="add_effect-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|add_effect">Adds another animation effect for the selected object on the slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="remove_effect">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="tooltip-text" translatable="yes" context="customanimationspanel|remove_effect|tooltip_text">Remove Effect</property>
+ <property name="image">image_remove</property>
+ <property name="use-underline">True</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="remove_effect-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|remove_effect">Removes the selected animation effects from the animation list.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="move_up">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="tooltip-text" translatable="yes" context="customanimationspanel|move_up|tooltip_text">Move Up</property>
+ <property name="image">image_up</property>
+ <property name="use-underline">True</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="move_up-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|move_up">Click one of the buttons to move the selected animation effect up or down in the list.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="move_down">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="tooltip-text" translatable="yes" context="customanimationspanel|move_down|tooltip_text">Move Down</property>
+ <property name="image">image_down</property>
+ <property name="use-underline">True</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="move_down-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|move_down">Click one of the buttons to move the selected animation effect up or down in the list.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </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="categorylabel">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes" context="customanimationspanel|categorylabel">Category:</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="categorylb">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="popup-fixed-width">False</property>
+ <items>
+ <item translatable="yes" context="customanimationspanel|categorylb">Entrance</item>
+ <item translatable="yes" context="customanimationspanel|categorylb">Emphasis</item>
+ <item translatable="yes" context="customanimationspanel|categorylb">Exit</item>
+ <item translatable="yes" context="customanimationspanel|categorylb">Motion Paths</item>
+ <item translatable="yes" context="customanimationspanel|categorylb">Misc Effects</item>
+ </items>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="categorylb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|categorylb">Select an animation effect category.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">2</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="effectlabel">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">start</property>
+ <property name="margin-top">3</property>
+ <property name="label" translatable="yes" context="customanimationspanel|effectlabel">Effect:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">effect_list</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="no-show-all">True</property>
+ <property name="margin-start">3</property>
+ <property name="margin-top">3</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow-type">in</property>
+ <property name="min-content-width">1</property>
+ <child>
+ <object class="GtkTreeView" id="effect_list">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="no-show-all">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore2</property>
+ <property name="headers-visible">False</property>
+ <property name="search-column">0</property>
+ <property name="show-expanders">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn21">
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext22"/>
+ <attributes>
+ <attribute name="xalign">5</attribute>
+ <attribute name="text">0</attribute>
+ <attribute name="weight">2</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="effect_list-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|effect_list">Select an animation effect.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">3</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="effect_label">
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes" context="customanimationspanel|effect_label">Options</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">4</property>
+ <property name="width">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="start_effect">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes" context="customanimationspanel|start_effect">_Start:</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="start_effect_list">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hexpand">True</property>
+ <items>
+ <item translatable="yes" context="customanimationspanel|start_effect_list">On click</item>
+ <item translatable="yes" context="customanimationspanel|start_effect_list">With previous</item>
+ <item translatable="yes" context="customanimationspanel|start_effect_list">After previous</item>
+ </items>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="start_effect_list-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|start_effect_list">Displays when the selected animation effect should be started.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="effect_property">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes" context="customanimationspanel|effect_property">_Direction:</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="more_properties">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="tooltip-text" translatable="yes" context="customanimationspanel|more_properties|tooltip_text">Options</property>
+ <property name="image">image1</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="more_properties-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|more_properties">Specifies additional properties for the selected element in the Custom Animations pane.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">2</property>
+ <property name="top-attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="effect_duration">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes" context="customanimationspanel|effect_duration">D_uration:</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="anim_duration">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment2</property>
+ <property name="digits">2</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="anim_duration-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|anim_duration">Specifies the duration of the selected animation effect.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="delay_label">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes" context="customanimationspanel|delay_label">_Delay:</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="delay_value">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="digits">1</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="delay_value-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|delay_value">The animation starts delayed by this amount of time.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">9</property>
+ <property name="width">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="auto_preview">
+ <property name="label" translatable="yes" context="customanimationspanel|auto_preview">Automatic Preview</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="auto_preview-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|auto_preview">Select to preview new or edited effects on the slide while you assign them.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">10</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="play">
+ <property name="label" translatable="yes" context="customanimationspanel|play">Play</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="tooltip-text" translatable="yes" context="customanimationspanel|play|tooltip_text">Preview Effect</property>
+ <property name="image">image_play</property>
+ <property name="use-underline">True</property>
+ <property name="image-position">right</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="play-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|play">Plays the selected animation effect in the preview.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">2</property>
+ <property name="top-attach">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="box1_label">
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="customanimationspanel|box1_label">Animation Deck</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">11</property>
+ <property name="width">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="custom_animation_list_label">
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="customanimationspanel|custom_animation_list_label">Animation List</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">custom_animation_list</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">12</property>
+ <property name="width">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="placeholder">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="CustomAnimationsPanel-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|CustomAnimationsPanel">Assigns effects to selected objects.</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/customanimationtexttab.ui b/sd/uiconfig/simpress/ui/customanimationtexttab.ui
new file mode 100644
index 000000000..443b5861d
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/customanimationtexttab.ui
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">999.99</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkBox" id="TextAnimationTab">
+ <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="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="group_text_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="customanimationtexttab|group_text_label">_Group text:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">group_text_list</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="auto_after_value">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="digits">1</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="auto_after_value-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationtexttab|extended_tip|auto_after_value">Enter an additional delay in seconds to animate subsequent paragraphs.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="auto_after">
+ <property name="label" translatable="yes" context="customanimationtexttab|auto_after">_Automatically after:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="auto_after-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationtexttab|extended_tip|auto_after">If "Group text - By 1st level paragraphs" is selected, the paragraphs are animated one after the other.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="group_text_list">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <items>
+ <item translatable="yes" context="customanimationtexttab|group_text_list">As one object</item>
+ <item translatable="yes" context="customanimationtexttab|group_text_list">All paragraphs at once</item>
+ <item translatable="yes" context="customanimationtexttab|group_text_list">By 1st level paragraphs</item>
+ <item translatable="yes" context="customanimationtexttab|group_text_list">By 2nd level paragraphs</item>
+ <item translatable="yes" context="customanimationtexttab|group_text_list">By 3rd level paragraphs</item>
+ <item translatable="yes" context="customanimationtexttab|group_text_list">By 4th level paragraphs</item>
+ <item translatable="yes" context="customanimationtexttab|group_text_list">By 5th level paragraphs</item>
+ </items>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="group_text_list-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationtexttab|extended_tip|group_text_list">Specifies how multiple paragraphs are animated</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="animate_shape">
+ <property name="label" translatable="yes" context="customanimationtexttab|animate_shape">Animate attached _shape</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="animate_shape-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationtexttab|extended_tip|animate_shape">Deselect this box to animate only the text, not the shape.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="reverse_order">
+ <property name="label" translatable="yes" context="customanimationtexttab|reverse_order">_In reverse order</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="reverse_order-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customanimationtexttab|extended_tip|reverse_order">Animates the paragraphs in reverse order.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/customanimationtimingtab.ui b/sd/uiconfig/simpress/ui/customanimationtimingtab.ui
new file mode 100644
index 000000000..a17448180
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/customanimationtimingtab.ui
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">100000</property>
+ <property name="step_increment">0.5</property>
+ <property name="page_increment">5</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="upper">100000</property>
+ <property name="step_increment">0.5</property>
+ <property name="page_increment">5</property>
+ </object>
+ <object class="GtkBox" id="TimingTab">
+ <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="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkLabel" id="start_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationtimingtab|start_label">_Start:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">start_list</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="delay_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationtimingtab|delay_label">_Delay:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">delay_value</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="duration_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationtimingtab|duration_label">D_uration:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">anim_duration</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="repeat_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationtimingtab|repeat_label">_Repeat:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">repeat_list</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="GtkComboBoxText" id="start_list">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <items>
+ <item translatable="yes" context="customanimationtimingtab|start_list">On click</item>
+ <item translatable="yes" context="customanimationtimingtab|start_list">With previous</item>
+ <item translatable="yes" context="customanimationtimingtab|start_list">After previous</item>
+ </items>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="delay_value">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="truncate-multiline">True</property>
+ <property name="digits">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="anim_duration">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes" context="customanimationtimingtab|anim_duration|tooltip_text">Select the speed of the Animation.</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="adjustment">adjustment2</property>
+ <property name="truncate-multiline">True</property>
+ <property name="digits">2</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="repeat_list">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="rewind">
+ <property name="label" translatable="yes" context="customanimationtimingtab|rewind">Rewind _when done playing</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationtimingtab|label11">Timing</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkRadioButton" id="rb_click_sequence">
+ <property name="label" translatable="yes" context="customanimationtimingtab|rb_click_sequence">_Animate as part of click sequence</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkRadioButton" id="rb_interactive">
+ <property name="label" translatable="yes" context="customanimationtimingtab|rb_interactive">Start _effect on click of:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">rb_click_sequence</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="trigger_list">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="customanimationtimingtab|label11">Trigger</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/customslideshows.ui b/sd/uiconfig/simpress/ui/customslideshows.ui
new file mode 100644
index 000000000..c4f9792ca
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/customslideshows.ui
@@ -0,0 +1,271 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkTreeStore" id="liststore1">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkDialog" id="CustomSlideShows">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="customslideshows|CustomSlideShows">Custom Slide Shows</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ <property name="secondary">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="startshow">
+ <property name="label" translatable="yes" context="customslideshows|startshow">_Start</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="startshow-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|startshow">Runs the slide show. Ensure that a custom slide show is selected if you want to run a custom presentation.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label" translatable="yes" context="stock">_OK</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="ok-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|ok">Saves all changes and closes dialog.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="customshowlist">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore1</property>
+ <property name="headers_visible">False</property>
+ <property name="headers_clickable">False</property>
+ <property name="search_column">0</property>
+ <property name="show_expanders">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeview-selection1"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn1">
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="customshowlist-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|customshowlist">Lists the custom slide shows that are available.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox" id="buttonboxSlidesEditing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="layout_style">start</property>
+ <child>
+ <object class="GtkButton" id="new">
+ <property name="label" translatable="yes" context="stock">_New</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_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="new-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|new">Add, remove or reorder slides as well as change the name of the selected custom slide show.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="edit">
+ <property name="label" translatable="yes" context="stock">_Edit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="edit-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|edit">Add, remove or reorder slides as well as change the name of the selected custom slide show.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="copy">
+ <property name="label" translatable="yes" context="customslideshows|copy">Cop_y</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="copy-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|copy">Creates a copy of the selected custom slide show. You can modify the name of the show by clicking Edit.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="delete">
+ <property name="label" translatable="yes" context="stock">_Delete</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="delete-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|delete">Deletes the selected element or elements without requiring confirmation.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-11">help</action-widget>
+ <action-widget response="101">startshow</action-widget>
+ <action-widget response="-5">ok</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="CustomSlideShows-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="customslideshows|extended_tip|CustomSlideShows">Defines a custom slide show using slides within the current presentation. You can then pick slides to meet the needs of your audience. You can create as many custom slide shows as you want.</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/definecustomslideshow.ui b/sd/uiconfig/simpress/ui/definecustomslideshow.ui
new file mode 100644
index 000000000..9d8023e4e
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/definecustomslideshow.ui
@@ -0,0 +1,358 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkListStore" id="liststore1">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkListStore" id="liststore2">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkDialog" id="DefineCustomSlideShow">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="definecustomslideshow|DefineCustomSlideShow">Define Custom Slide Show</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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" translatable="yes" context="stock">_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-underline">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" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="definecustomslideshow|label1">_Name:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">customname</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="customname">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="customname-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="definecustomslideshow|extended_tip|customname">Displays the name of the custom slide show. If you want, you can enter a new name.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="definecustomslideshow|label2">_Existing slides:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">pages</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="definecustomslideshow|label3">_Selected slides:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">custompages</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="pages">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore1</property>
+ <property name="headers_visible">False</property>
+ <property name="headers_clickable">False</property>
+ <property name="search_column">0</property>
+ <property name="show_expanders">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeview-selection1"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn1">
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="pages-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="definecustomslideshow|extended_tip|pages">Lists all of the slides in the order in which they appear in the current document.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="custompages">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore2</property>
+ <property name="headers_visible">False</property>
+ <property name="headers_clickable">False</property>
+ <property name="reorderable">True</property>
+ <property name="search_column">0</property>
+ <property name="show_expanders">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeview-selection2"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn2">
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="custompages-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="definecustomslideshow|extended_tip|custompages">Lists all of the slides in the custom slide show. If you want, you can change the order of the list by dragging the slides up or down.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkButton" id="add">
+ <property name="label" translatable="yes" context="definecustomslideshow|add">&gt;&gt;</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="add-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="definecustomslideshow|extended_tip|add">Adds an existing slide to the bottom of the Selected slides list. You need to select a slide in the Existing slides list before you can use this button.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="remove">
+ <property name="label" translatable="yes" context="definecustomslideshow|remove">&lt;&lt;</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="remove-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="definecustomslideshow|extended_tip|remove">Removes a slide from the Selected slides list. You need to choose a slide in the Selected slides list before you can use this button.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </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">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-widget response="-11">help</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="DefineCustomSlideShow-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="definecustomslideshow|extended_tip|DefineCustomSlideShow">Creates a custom slide show.</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroup1">
+ <widgets>
+ <widget name="custompages"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/displaywindow.ui b/sd/uiconfig/simpress/ui/displaywindow.ui
new file mode 100644
index 000000000..92a47baf5
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/displaywindow.ui
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkPopover" id="DisplayWindow">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="border_width">4</property>
+ <property name="constrain-to">none</property>
+ <child>
+ <object class="GtkBox" id="container">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkFrame" id="editframe">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkScrolledWindow" id="valuesetwin1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkDrawingArea" id="valueset1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="displaywindow|STR_DISPLAYMODE_EDITMODES">Edit Modes</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="masterframe">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkScrolledWindow" id="valuesetwin2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkDrawingArea" id="valueset2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="displaywindow|STR_DISPLAYMODE_MASTERMODES">Master Modes</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/dlgfield.ui b/sd/uiconfig/simpress/ui/dlgfield.ui
new file mode 100644
index 000000000..ead70b3c4
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/dlgfield.ui
@@ -0,0 +1,268 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="EditFieldsDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="dlgfield|EditFieldsDialog">Edit Field</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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" translatable="yes" context="stock">_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-underline">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" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkRadioButton" id="fixedRB">
+ <property name="label" translatable="yes" context="dlgfield|fixedRB">_Fixed</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="fixedRB-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dlgfield|extended_tip|fixedRB">Displays the content of the field when the field was inserted.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="varRB">
+ <property name="label" translatable="yes" context="dlgfield|varRB">_Variable</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">fixedRB</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="varRB-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dlgfield|extended_tip|varRB">Displays the current value of the field.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="dlgfield|label1">Field Type</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="dlgfield|label2">_Language:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">languageLB</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="languageLB">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="has_entry">True</property>
+ <child internal-child="entry">
+ <object class="GtkEntry">
+ <property name="can_focus">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="activates_default">True</property>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="languageLB-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dlgfield|extended_tip|languageLB">Select the language for the field.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkComboBoxText" id="formatLB">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="formatLB-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dlgfield|extended_tip|formatLB">Select a display format for the field.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="dlgfield|label3">F_ormat</property>
+ <property name="use_underline">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </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-widget response="-11">help</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="EditFieldsDialog-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dlgfield|extended_tip|EditFieldsDialog">Edits the properties of an inserted field.</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/dockinganimation.ui b/sd/uiconfig/simpress/ui/dockinganimation.ui
new file mode 100644
index 000000000..cd082b933
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/dockinganimation.ui
@@ -0,0 +1,657 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">1</property>
+ <property name="upper">999</property>
+ <property name="value">1</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="upper">600</property>
+ <property name="step_increment">10</property>
+ <property name="page_increment">60</property>
+ </object>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">sd/res/get1obj.png</property>
+ </object>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">sd/res/getallob.png</property>
+ </object>
+ <object class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">sd/res/del1bmp.png</property>
+ </object>
+ <object class="GtkImage" id="image4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">sd/res/delall.png</property>
+ </object>
+ <object class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon-name">go-first</property>
+ </object>
+ <object class="GtkImage" id="image6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon-name">media-skip-backward</property>
+ </object>
+ <object class="GtkImage" id="image7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon-name">media-playback-stop</property>
+ </object>
+ <object class="GtkImage" id="image8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon-name">media-skip-forward</property>
+ </object>
+ <object class="GtkImage" id="image9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon-name">go-last</property>
+ </object>
+ <object class="GtkBox" id="DockingAnimation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">24</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">12</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkComboBoxText" id="loopcount">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes" context="dockinganimation|loopcount|tooltip_text">Loop Count</property>
+ <items>
+ <item>1</item>
+ <item>2</item>
+ <item>3</item>
+ <item>4</item>
+ <item>5</item>
+ <item>6</item>
+ <item>7</item>
+ <item>8</item>
+ <item>9</item>
+ <item>10</item>
+ <item>12</item>
+ <item>15</item>
+ <item>20</item>
+ <item>25</item>
+ <item>50</item>
+ <item>100</item>
+ <item>500</item>
+ <item>1000</item>
+ <item translatable="yes" context="dockinganimation|loopcount">Max.</item>
+ </items>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="loopcount-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|loopcount">Sets the number of times that the animation is played.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="duration">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes" context="dockinganimation|duration|tooltip_text">Duration</property>
+ <property name="adjustment">adjustment2</property>
+ <property name="digits">2</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="duration-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|duration">Enter the number of seconds to display the current image. This option is only available if you select the Bitmap object option in the Animation group field.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="numbitmap">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes" context="dockinganimation|numbitmap|tooltip_text">Image Number</property>
+ <property name="text">1</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="value">1</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="numbitmap-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|numbitmap">Indicates the position of the current image in the animation sequence.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkButton" id="first">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes" context="dockinganimation|first|tooltip_text">First Image</property>
+ <property name="image">image5</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="first-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|first">Jumps to the first image in the animation sequence.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="prev">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes" context="dockinganimation|prev|tooltip_text">Backwards</property>
+ <property name="image">image6</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="prev-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|prev">Plays the animation backwards.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="stop">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes" context="dockinganimation|stop|tooltip_text">Stop</property>
+ <property name="image">image7</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="stop-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|stop">Stops playing the animation.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="next">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes" context="dockinganimation|next|tooltip_text">Play</property>
+ <property name="image">image8</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="next-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|next">Plays the animation.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="last">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes" context="dockinganimation|last|tooltip_text">Last Image</property>
+ <property name="image">image9</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="last-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|last">Jumps to the last image in the animation sequence.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">4</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkDrawingArea" id="preview">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkRadioButton" id="group">
+ <property name="label" translatable="yes" context="dockinganimation|group">Group object</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="group-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|group">Assembles images into a single object so that they can be moved as a group. You can still edit individual objects by double-clicking the group in the slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="bitmap">
+ <property name="label" translatable="yes" context="dockinganimation|bitmap">Bitmap object</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">group</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="bitmap-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|bitmap">Combines images into a single image.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="alignmentft">
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="dockinganimation|alignmentft">Alignment</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">alignment</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="alignment">
+ <property name="can_focus">False</property>
+ <items>
+ <item translatable="yes" context="dockinganimation|alignment">Top Left</item>
+ <item translatable="yes" context="dockinganimation|alignment">Left</item>
+ <item translatable="yes" context="dockinganimation|alignment">Bottom Left</item>
+ <item translatable="yes" context="dockinganimation|alignment">Top</item>
+ <item translatable="yes" context="dockinganimation|alignment">Centered</item>
+ <item translatable="yes" context="dockinganimation|alignment">Bottom</item>
+ <item translatable="yes" context="dockinganimation|alignment">Top Right</item>
+ <item translatable="yes" context="dockinganimation|alignment">Right</item>
+ <item translatable="yes" context="dockinganimation|alignment">Bottom Right</item>
+ </items>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="alignment-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|alignment">Aligns the images in your animation.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="dockinganimation|label1">Animation Group</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="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="column_spacing">24</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkButton" id="getone">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes" context="dockinganimation|getone|tooltip_text">Apply Object</property>
+ <property name="image">image1</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="getone-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|getone">Adds selected object(s) as a single image.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="getall">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes" context="dockinganimation|getall|tooltip_text">Apply Objects Individually</property>
+ <property name="image">image2</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="getall-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|getall">Adds an image for each selected object.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="dockinganimation|label3">Number</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="count">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">67</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkButton" id="delone">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes" context="dockinganimation|delone|tooltip_text">Delete Current Image</property>
+ <property name="image">image3</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="delone-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|delone">Deletes current image from the animation sequence.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="delall">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes" context="dockinganimation|delall|tooltip_text">Delete All Images</property>
+ <property name="image">image4</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="delall-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|delall">Deletes all of the images in the animation.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="dockinganimation|label2">Image</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>
+ <child>
+ <object class="GtkButtonBox" id="buttonbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ <property name="secondary">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="create">
+ <property name="label" translatable="yes" context="dockinganimation|create">Create</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="create-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|create">Inserts the animation into the current slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="DockingAnimation-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="dockinganimation|extended_tip|DockingAnimation">Creates a custom animation on the current slide.</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/effectmenu.ui b/sd/uiconfig/simpress/ui/effectmenu.ui
new file mode 100644
index 000000000..9418b18c6
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/effectmenu.ui
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkRadioMenuItem" id="onclick">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="effectmenu|onclick">Start On _Click</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_as_radio">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkRadioMenuItem" id="withprev">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="effectmenu|withprev">Start _With Previous</property>
+ <property name="use_underline">True</property>
+ <property name="draw_as_radio">True</property>
+ <property name="group">onclick</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkRadioMenuItem" id="afterprev">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="effectmenu|afterprev">Start _After Previous</property>
+ <property name="use_underline">True</property>
+ <property name="draw_as_radio">True</property>
+ <property name="group">onclick</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="options">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="effectmenu|options">_Effect Options...</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="timing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="effectmenu|timing">_Timing...</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="remove">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="effectmenu|remove">_Remove</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/fieldmenu.ui b/sd/uiconfig/simpress/ui/fieldmenu.ui
new file mode 100644
index 000000000..5bb702561
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/fieldmenu.ui
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/fontsizemenu.ui b/sd/uiconfig/simpress/ui/fontsizemenu.ui
new file mode 100644
index 000000000..334e7c3bd
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/fontsizemenu.ui
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="fontsizemenu|25">Tiny</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="fontsizemenu|50">Smaller</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="150">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="fontsizemenu|150">Larger</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="400">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="fontsizemenu|400">Extra Large</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/fontstylemenu.ui b/sd/uiconfig/simpress/ui/fontstylemenu.ui
new file mode 100644
index 000000000..918b3b483
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/fontstylemenu.ui
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckMenuItem" id="bold">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="fontstylemenu|bold">Bold</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="italic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="fontstylemenu|italic">Italic</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="underline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="fontstylemenu|underline">Underlined</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/gluebox.ui b/sd/uiconfig/simpress/ui/gluebox.ui
new file mode 100644
index 000000000..cdbde7902
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/gluebox.ui
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkBox" id="GlueBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkComboBoxText" id="gluetype">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/headerfooterdialog.ui b/sd/uiconfig/simpress/ui/headerfooterdialog.ui
new file mode 100644
index 000000000..528424c98
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/headerfooterdialog.ui
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="HeaderFooterDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="headerfooterdialog|HeaderFooterDialog">Header and Footer</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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="apply_all">
+ <property name="label" translatable="yes" context="headerfooterdialog|apply_all">Appl_y to All</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_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="apply_all-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfooterdialog|extended_tip|apply_all">Applies the settings to all the slides in your presentation, including the corresponding master slides.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="apply">
+ <property name="label" translatable="yes" context="stock">_Apply</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="apply-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfooterdialog|extended_tip|apply">Applies the current settings to the selected slides.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="cancel">
+ <property name="label" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="tabcontrol">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="scrollable">True</property>
+ <property name="enable_popup">True</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="slides">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="headerfooterdialog|slides">Slides</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="notes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="headerfooterdialog|notes">Notes and Handouts</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </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="101">apply_all</action-widget>
+ <action-widget response="102">apply</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ <action-widget response="-11">help</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="HeaderFooterDialog-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfooterdialog|extended_tip|HeaderFooterDialog">Adds or changes text in placeholders at the top and the bottom of slides and master slides.</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/headerfootertab.ui b/sd/uiconfig/simpress/ui/headerfootertab.ui
new file mode 100644
index 000000000..6e378cd69
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/headerfootertab.ui
@@ -0,0 +1,519 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkBox" id="HeaderFooterTab">
+ <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="spacing">12</property>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCheckButton" id="header_cb">
+ <property name="label" translatable="yes" context="headerfootertab|header_cb">Heade_r</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="margin-top">6</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="header_cb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|header_cb">Adds the text that you enter in the Header text box to the top of the slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="header_box">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">24</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="header_label">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="headerfootertab|header_label">Header _text:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">header_text</property>
+ <property name="xalign">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="header_text">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="activates-default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="header_text-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|header_text">Adds the text that you enter to the top of the slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <accessibility>
+ <relation type="labelled-by" target="header_cb"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="datetime_cb">
+ <property name="label" translatable="yes" context="headerfootertab|datetime_cb">_Date and time</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="datetime_cb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|datetime_cb">Adds the date and time to the slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="datetimebox">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">24</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkBox" id="box6">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkRadioButton" id="rb_fixed">
+ <property name="label" translatable="yes" context="headerfootertab|rb_fixed">Fi_xed</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="active">True</property>
+ <property name="draw-indicator">True</property>
+ <accessibility>
+ <relation type="label-for" target="datetime_value"/>
+ </accessibility>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="rb_fixed-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|rb_fixed">Displays the date and time that you enter in the text box.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="datetime_value">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="activates-default">True</property>
+ <accessibility>
+ <relation type="labelled-by" target="rb_fixed"/>
+ </accessibility>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="datetime_value-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|datetime_value">Displays the date and time that you enter in the text box.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=2 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="row-spacing">6</property>
+ <child>
+ <object class="GtkRadioButton" id="rb_auto">
+ <property name="label" translatable="yes" context="headerfootertab|rb_auto">_Variable</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">rb_fixed</property>
+ <accessibility>
+ <relation type="labelled-by" target="variablebox"/>
+ </accessibility>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="rb_auto-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|rb_auto">Displays the date and time that the slide was created. Select a date format from the list.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=2 n-rows=2 -->
+ <object class="GtkGrid" id="variablebox">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkComboBoxText" id="language_list">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="language_list-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|language_list">Select the language for the date and time format.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="language_label">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="headerfootertab|language_label">_Language:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">language_list</property>
+ <property name="xalign">1</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="datetime_format_list">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="datetime_format_list-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|datetime_format_list">Displays the date and time that the slide was created. Select a date format from the list.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="language_label1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="headerfootertab|language_label1">_Format:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">datetime_format_list</property>
+ <property name="xalign">1</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <accessibility>
+ <relation type="labelled-by" target="rb_auto"/>
+ </accessibility>
+ </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">1</property>
+ </packing>
+ </child>
+ <accessibility>
+ <relation type="labelled-by" target="datetime_cb"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box7">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkCheckButton" id="footer_cb">
+ <property name="label" translatable="yes" context="headerfootertab|footer_cb">_Footer</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="footer_cb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|footer_cb">Adds the text that you enter in the Footer text box to the bottom of the slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="footer_box">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">24</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="footer_label">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="headerfootertab|footer_label">F_ooter text:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">footer_text</property>
+ <property name="xalign">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="footer_text">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="activates-default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="footer_text-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|footer_text">Adds the text that you enter to the bottom of the slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <accessibility>
+ <relation type="labelled-by" target="footer_cb"/>
+ </accessibility>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="slide_number">
+ <property name="label" translatable="yes" context="headerfootertab|slide_number">_Slide number</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="slide_number-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|slide_number">Adds the slide number or the page number.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="include_label">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="headerfootertab|include_label">Include on Slide</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="not_on_title">
+ <property name="label" translatable="yes" context="headerfootertab|not_on_title">Do _not show on the first slide</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="margin-start">12</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="not_on_title-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="headerfootertab|extended_tip|not_on_title">Does not display your specified information on the first slide of your presentation.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="replacement_a">
+ <property name="can-focus">False</property>
+ <property name="no-show-all">True</property>
+ <property name="label" translatable="yes" context="headerfootertab|replacement_a">_Page Number</property>
+ <property name="use-underline">True</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="replacement_b">
+ <property name="can-focus">False</property>
+ <property name="no-show-all">True</property>
+ <property name="label" translatable="yes" context="headerfootertab|replacement_b">Include on page</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkDrawingArea" id="preview">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="margin-top">24</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroupLabel">
+ <widgets>
+ <widget name="header_label"/>
+ <widget name="rb_fixed"/>
+ <widget name="rb_auto"/>
+ <widget name="language_label"/>
+ <widget name="language_label1"/>
+ <widget name="footer_label"/>
+ </widgets>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroupWidget1">
+ <widgets>
+ <widget name="header_text"/>
+ <widget name="datetime_value"/>
+ <widget name="language_list"/>
+ <widget name="datetime_format_list"/>
+ <widget name="footer_text"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/impressprinteroptions.ui b/sd/uiconfig/simpress/ui/impressprinteroptions.ui
new file mode 100644
index 000000000..286822874
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/impressprinteroptions.ui
@@ -0,0 +1,441 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkBox" id="box">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="document">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=2 n-rows=3 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">6</property>
+ <property name="margin-top">6</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="impressprinteroptions|label2">Type:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">impressdocument</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="impressprinteroptions|label7">Slides per page:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">slidesperpage</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="impressprinteroptions|label1">Order:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">slidesperpageorder</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="impressdocument">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="impressdocument-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|impressdocument">Select which parts of the document should be printed.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="slidesperpage">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="slidesperpage-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|slidesperpage">Select how many slides to print per page.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="slidesperpageorder">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="slidesperpageorder-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|slideperpageorder">Specify how to arrange slides on the printed page.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="impressprinteroptions|label3">Document</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="contents">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCheckButton" id="printname">
+ <property name="label" translatable="yes" context="impressprinteroptions|printname">Slide name</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="printname-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|printname">Specifies whether to print the page name of a document.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="printdatetime">
+ <property name="label" translatable="yes" context="impressprinteroptions|printdatetime">Date and time</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="printdatetime-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|printdatetime">Specifies whether to print the current date and time.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="printhidden">
+ <property name="label" translatable="yes" context="impressprinteroptions|printhidden">Hidden pages</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="printhidden-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|printhidden">Specifies whether to print the pages that are currently hidden.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="impressprinteroptions|label4">Contents</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="color">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkRadioButton" id="originalcolors">
+ <property name="label" translatable="yes" context="impressprinteroptions|originalcolors">Original colors</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="active">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="originalcolors-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|originalcolors">Specifies to print in original colors.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="grayscale">
+ <property name="label" translatable="yes" context="impressprinteroptions|grayscale">Grayscale</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">originalcolors</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="grayscale-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|grayscale">Specifies to print colors as grayscale.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="blackandwhite">
+ <property name="label" translatable="yes" context="impressprinteroptions|blackandwhite">Black &amp; white</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">originalcolors</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="blackandwhite-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|blackandwhite">Specifies to print colors as black and white.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="impressprinteroptions|label5">Color</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="pagesizes">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkRadioButton" id="originalsize">
+ <property name="label" translatable="yes" context="impressprinteroptions|originalsize">Original size</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="active">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="originalsize-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|originalsize">Specifies that you do not want to further scale pages when printing.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="fittoprintable">
+ <property name="label" translatable="yes" context="impressprinteroptions|fittoprintable">Fit to printable page</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">originalsize</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="fittoprintable-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|fittoprintable">Specifies whether to scale down objects that are beyond the margins of the current printer so they fit on the paper in the printer.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="distributeonmultiple">
+ <property name="label" translatable="yes" context="impressprinteroptions|distributeonmultiple">Distribute on multiple sheets of paper</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">originalsize</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="distributeonmultiple-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|distributeonmultiple">Prints a large format document, such as a poster or banner, by distributing the document page across multiple sheets of paper. The distribution option calculates how many sheets of paper are needed. You can then piece together the sheets.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="tilesheet">
+ <property name="label" translatable="yes" context="impressprinteroptions|tilesheet">Tile sheet of paper with repeated slides</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">originalsize</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="tilesheet-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="impressprinteroptions|extended_tip|tilesheet">Specifies that pages are to be printed in tiled format. If the pages or slides are smaller than the paper, repeat the pages or slides on one sheet of paper.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="impressprinteroptions|label6">Size</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/insertslides.ui b/sd/uiconfig/simpress/ui/insertslides.ui
new file mode 100644
index 000000000..6a7b7844e
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/insertslides.ui
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.4 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="InsertSlidesDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="insertslides|InsertSlidesDialog">Insert Slides</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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" translatable="yes" context="stock">_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-underline">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" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="action">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkRadioButton" id="before">
+ <property name="label" translatable="yes" context="insertslides|before">_Before</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="hexpand">True</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="after">
+ <property name="label" translatable="yes" context="insertslides|after">A_fter</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="hexpand">True</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">before</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="insertslides|label1">Position</property>
+ <property name="justify">center</property>
+ <property name="yalign">0.5</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </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-widget response="-11">help</action-widget>
+ </action-widgets>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/interactiondialog.ui b/sd/uiconfig/simpress/ui/interactiondialog.ui
new file mode 100644
index 000000000..0214891c1
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/interactiondialog.ui
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="InteractionDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="interactiondialog|InteractionDialog">Interaction</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">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" translatable="yes" context="stock">_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-underline">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" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </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>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/interactionpage.ui b/sd/uiconfig/simpress/ui/interactionpage.ui
new file mode 100644
index 000000000..ef6fd0b65
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/interactionpage.ui
@@ -0,0 +1,485 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkTreeStore" id="liststore1">
+ <columns>
+ <!-- column-name expander -->
+ <column type="GdkPixbuf"/>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkTreeStore" id="liststore2">
+ <columns>
+ <!-- column-name expander -->
+ <column type="GdkPixbuf"/>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkTreeStore" id="liststore3">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="InteractionPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="row_spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="interactionpage|label2">Action at mouse click:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">listbox</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="listbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="listbox-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|listbox">Specifies the action that will run when you click the selected object during a slide show.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="fttree">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="interactionpage|fttree">Target:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">box3</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="can_focus">True</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="tree">
+ <property name="width_request">-1</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore1</property>
+ <property name="headers_visible">False</property>
+ <property name="search_column">1</property>
+ <property name="enable_tree_lines">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="Macro Library List-selection1"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn2">
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCellRendererPixbuf" id="cellrenderertext4"/>
+ <attributes>
+ <attribute name="pixbuf">0</attribute>
+ </attributes>
+ </child>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="tree-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|tree">Lists the slides and the objects that you can target.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="can_focus">True</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="treedoc">
+ <property name="width_request">-1</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore2</property>
+ <property name="headers_visible">False</property>
+ <property name="search_column">1</property>
+ <property name="enable_tree_lines">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="Macro Library List-selection11"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn21">
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCellRendererPixbuf" id="cellrenderertext44"/>
+ <attributes>
+ <attribute name="pixbuf">0</attribute>
+ </attributes>
+ </child>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext22"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="treedoc-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|treedoc">Opens and displays a file during a slide show. If you select an ODF file as the target document, you can also specify the page that will open.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="oleaction">
+ <property name="width_request">-1</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore3</property>
+ <property name="headers_visible">False</property>
+ <property name="search_column">1</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="Macro Library List-selection111"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn211">
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext222"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="interactionpage|label1">Interaction</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="frame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <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>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkButton" id="browse">
+ <property name="label" translatable="yes" context="interactionpage|browse">_Browse...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="browse-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|browse">Locate the file you want to open.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="find">
+ <property name="label" translatable="yes" context="interactionpage|find">_Find</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="no_show_all">True</property>
+ <property name="use_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="find-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|find">Searches for the specified slide or object.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkEntry" id="sound">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="sound-atkobject">
+ <property name="AtkObject::accessible-name" translatable="yes" context="interactionpage|sound-atkobject">Path Name</property>
+ <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|sound">Enter a path to the audio file you want to open, or click Browse to locate the file.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="bookmark">
+ <property name="can_focus">True</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="bookmark-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|bookmark">Enter the name of the slide or the object that you want to look for.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="document">
+ <property name="can_focus">True</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="document-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|document">Enter a path to the file you want to open, or click Browse to locate the file.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="program">
+ <property name="can_focus">True</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="program-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|program">Enter a path to the program you want to start, or click Browse to locate the program.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="macro">
+ <property name="can_focus">True</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="macro-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|macro">Enter a path to the macro you want to run, or click Browse to locate the macro.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</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>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="InteractionPage-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="interactionpage|extended_tip|InteractionPage">Defines how the selected object behaves when you click on it during a slide show.</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroup1">
+ <property name="mode">both</property>
+ <widgets>
+ <widget name="tree"/>
+ <widget name="treedoc"/>
+ <widget name="oleaction"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/layoutmenu.ui b/sd/uiconfig/simpress/ui/layoutmenu.ui
new file mode 100644
index 000000000..9993ca568
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/layoutmenu.ui
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="apply">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="layoutmenu|apply">Apply to _Selected Slides</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="layoutmenu|insert">_Insert Slide</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/layoutpanel.ui b/sd/uiconfig/simpress/ui/layoutpanel.ui
new file mode 100644
index 000000000..5eb7122da
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/layoutpanel.ui
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="LayoutPanel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkDrawingArea" id="layoutvalueset">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/layoutwindow.ui b/sd/uiconfig/simpress/ui/layoutwindow.ui
new file mode 100644
index 000000000..706134ec5
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/layoutwindow.ui
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkPopover" id="LayoutWindow">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="border_width">4</property>
+ <property name="constrain-to">none</property>
+ <child>
+ <object class="GtkBox" id="container">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkFrame" id="horiframe">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkScrolledWindow" id="valuesetwin1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkDrawingArea" id="valueset1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="layoutwindow|label5">Horizontal</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="vertframe">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkScrolledWindow" id="valuesetwin2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkDrawingArea" id="valueset2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="layoutwindow|label6">Vertical</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="more">
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="no_show_all">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/masterlayoutdlg.ui b/sd/uiconfig/simpress/ui/masterlayoutdlg.ui
new file mode 100644
index 000000000..12b601013
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/masterlayoutdlg.ui
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="MasterLayoutDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="masterlayoutdlg|MasterLayoutDialog">Master Elements</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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" translatable="yes" context="stock">_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-underline">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" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="PlaceholdersFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkCheckButton" id="header">
+ <property name="label" translatable="yes" context="masterlayoutdlg|header">_Header</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="header-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="masterlayoutdlg|extended_tip|header">Adds a header placeholder to the master slide for notes.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="datetime">
+ <property name="label" translatable="yes" context="masterlayoutdlg|datetime">_Date/time</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="datetime-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="masterlayoutdlg|extended_tip|datetime">Adds a date/time placeholder to the master slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="footer">
+ <property name="label" translatable="yes" context="masterlayoutdlg|footer">_Footer</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="footer-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="masterlayoutdlg|extended_tip|footer">Adds a footer placeholder to the master slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="pagenumber">
+ <property name="label" translatable="yes" context="masterlayoutdlg|pagenumber">_Page number</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="pagenumber-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="masterlayoutdlg|extended_tip|pagenumber">Adds a slide number placeholder to the master slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="slidenumber">
+ <property name="label" translatable="yes" context="masterlayoutdlg|slidenumber">_Slide number</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="no_show_all">True</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="Placeholders">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="masterlayoutdlg|Placeholders">Placeholders</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </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-widget response="-11">help</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="MasterLayoutDialog-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="masterlayoutdlg|extended_tip|MasterLayoutDialog">Adds or removes header, footer, date, and slide number placeholders to the layout of the master slide.</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/mastermenu.ui b/sd/uiconfig/simpress/ui/mastermenu.ui
new file mode 100644
index 000000000..61a0a10ae
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/mastermenu.ui
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="applyall">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="mastermenu|applyall">_Apply to All Slides</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="applyselect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="mastermenu|applyselect">Apply to _Selected Slides</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="large">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="mastermenu|large">Show _Large Preview</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="small">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="mastermenu|small">Show S_mall Preview</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/masterpagemenu.ui b/sd/uiconfig/simpress/ui/masterpagemenu.ui
new file mode 100644
index 000000000..5bb702561
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/masterpagemenu.ui
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/masterpagepanel.ui b/sd/uiconfig/simpress/ui/masterpagepanel.ui
new file mode 100644
index 000000000..429032ed2
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/masterpagepanel.ui
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="MasterPagePanel">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkDrawingArea" id="usedvalueset">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/masterpagepanelall.ui b/sd/uiconfig/simpress/ui/masterpagepanelall.ui
new file mode 100644
index 000000000..979d06990
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/masterpagepanelall.ui
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="MasterPagePanel">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkDrawingArea" id="allvalueset">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/masterpagepanelrecent.ui b/sd/uiconfig/simpress/ui/masterpagepanelrecent.ui
new file mode 100644
index 000000000..4ec8487cf
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/masterpagepanelrecent.ui
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="MasterPagePanel">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkDrawingArea" id="recentvalueset">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/navigatorpanel.ui b/sd/uiconfig/simpress/ui/navigatorpanel.ui
new file mode 100644
index 000000000..98d22dfc8
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/navigatorpanel.ui
@@ -0,0 +1,288 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="dragmodemenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkRadioMenuItem" id="1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="navigatorpanelSTR_DRAGTYPE_URL">Insert as Hyperlink</property>
+ <property name="draw_as_radio">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkRadioMenuItem" id="2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="navigatorpanel|STR_DRAGTYPE_LINK">Insert as Link</property>
+ <property name="draw_as_radio">True</property>
+ <property name="group">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkRadioMenuItem" id="3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="navigatorpanel|STR_DRAGTYPE_EMBEDDED">Insert as Copy</property>
+ <property name="draw_as_radio">True</property>
+ <property name="group">1</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkTreeStore" id="liststore2">
+ <columns>
+ <!-- column-name expander -->
+ <column type="GdkPixbuf"/>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="NavigatorPanel">
+ <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>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">3</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkComboBoxText" id="documents">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes" context="navigatorpanel|documents|tooltip_text">Document</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="documents-atkobject">
+ <property name="AtkObject::accessible-name" translatable="yes" context="navigatorpanel|documents-atkobject">Active Window</property>
+ <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|documents">Lists currently open documents.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="tree">
+ <property name="width_request">-1</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore2</property>
+ <property name="headers_visible">False</property>
+ <property name="reorderable">True</property>
+ <property name="search_column">1</property>
+ <property name="enable_tree_lines">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="Macro Library List-selection11"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn21">
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCellRendererPixbuf" id="cellrenderertext44"/>
+ <attributes>
+ <attribute name="pixbuf">0</attribute>
+ </attributes>
+ </child>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext22"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="tree-atkobject">
+ <property name="AtkObject::accessible-name" translatable="yes" context="navigatorpanel|STR_OBJECTS_TREE">Page Tree</property>
+ <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|tree">Lists available slides. Double-click a slide to make it the active slide.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolbar" id="toolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="icon_size">2</property>
+ <child>
+ <object class="GtkToolButton" id="first">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes" context="navigatorpanel|first|tooltip_text">First Slide</property>
+ <property name="icon_name">sd/res/nv03.png</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="first-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|first">Jumps to the first page.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="previous">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes" context="navigatorpanel|previous|tooltip_text">Previous Slide</property>
+ <property name="icon_name">sd/res/nv04.png</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="previous-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|previous">Moves back one page.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="next">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes" context="navigatorpanel|next|tooltip_text">Next Slide</property>
+ <property name="icon_name">sd/res/nv05.png</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="next-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|next">Move forward one page.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="last">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes" context="navigatorpanel|last|tooltip_text">Last Slide</property>
+ <property name="icon_name">sd/res/nv06.png</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="last-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|last">Jumps to the last page.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparatorToolItem" id="separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="dragmode">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes" context="navigatorpanel|dragmode|tooltip_text">Drag Mode</property>
+ <property name="icon_name">sd/res/nv09.png</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="dragmode-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|dragmode">Drag and drop slides and named objects into the active slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="shapes">
+ <property name="visible">True</property>
+ <property name="tooltip_text" translatable="yes" context="navigatorpanel|shapes|tooltip_text">Show Shapes</property>
+ <property name="icon_name">sd/res/graphic.png</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="shapes-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|shapes">In the submenu you can choose to display a list of all shapes or only the named shapes. Use drag-and-drop in the list to reorder the shapes. When you set the focus to a slide and press the Tab key, the next shape in the defined order is selected.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="NavigatorPanel-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="navigatorpanel|extended_tip|NavigatorPanel">Opens the Navigator, where you can quickly jump to other slides or move between open files.</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="shapemenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkRadioMenuItem" id="named">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="navigatorpanel|STR_NAVIGATOR_SHOW_NAMED_SHAPES">Named shapes</property>
+ <property name="use_underline">True</property>
+ <property name="draw_as_radio">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkRadioMenuItem" id="all">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="navigatorpanel|STR_NAVIGATOR_SHOW_ALL_SHAPES">All shapes</property>
+ <property name="use_underline">True</property>
+ <property name="draw_as_radio">True</property>
+ <property name="group">named</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/notebookbar.ui b/sd/uiconfig/simpress/ui/notebookbar.ui
new file mode 100644
index 000000000..8a57ca0f8
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/notebookbar.ui
@@ -0,0 +1,19881 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <requires lib="LibreOffice" version="1.0"/>
+ <!-- interface-local-resource-path ../../../icon-themes/colibre/cmd/ -->
+ <object class="GtkMenu" id="Menu Addons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">AddonCommand</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="AddonSection-Separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Convert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-ChangeBezier">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-ChangePolygon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-convert_to_contour">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-ConvertInto3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-ConvertInto3DLatheFast">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-ConvertIntoBitmap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuConvert-ConvertIntoMetaFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-MirrorVert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MirrorVert</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-MirrorHorz">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MirrorHorz</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Combine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Dismantle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Substract">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Intersect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-EqualizeWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-EqualizeHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Connect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Connect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Break">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Break</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-CopyObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CopyObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Morphing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Morphing</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ChangeBezier">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ChangePolygon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-convert_to_contour">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertInto3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertInto3DLatheFast">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertIntoBitmap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertIntoMetaFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Field">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertDateFieldFix">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertDateFieldFix</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertDateFieldVar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertDateFieldVar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertTimeFieldFix">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertTimeFieldFix</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertTimeFieldVar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertTimeFieldVar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuField-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertAuthorField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertAuthorField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertSlideField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlideField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertSlideTitleField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlideTitleField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertSlidesField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlidesField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertFileField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertFileField</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu File">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-AddDirect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddDirect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-RecentFileList">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RecentFileList</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-CloseDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Save">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Save</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveAs">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAs</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveAsRemote">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAsRemote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveACopy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveACopy</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-NewGlobalDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NewGlobalDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-ExportTo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportTo</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-ExportToPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportToPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SendMail">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMail</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SendMailDocAsPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMailDocAsPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SendViaBluetooth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendViaBluetooth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-PrintPreview">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrintPreview</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-PrintDefault">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrintDefault</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-PrinterSetup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrinterSetup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Signature">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Signature</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SignPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SignPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SetDocumentProperties">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetDocumentProperties</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Quit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Quit</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-CheckBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-RadioButton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ListBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ComboBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Pushbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Imagebutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-FormattedField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-DateField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-TimeField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-NumericField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-CurrencyField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-PatternField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ImageControl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-FileControl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-NavigationBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Help">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-HelpIndex">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelpIndex</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-ExtendedHelp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtendedHelp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-Documentation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Documentation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-QuestionAnswers">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:QuestionAnswers</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-SendFeedback">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendFeedback</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-SafeMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SafeMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-GetInvolved">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GetInvolved</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-Donation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Donation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-ShowLicense">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowLicense</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-About">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:About</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Home">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-Shadowed">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-OutlineFont">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutlineFont</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-Overline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Overline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToUpper">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToUpper</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToLower">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToLower</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseRotateCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseRotateCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToSentenceCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToSentenceCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToTitleCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToTitleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToToggleCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToToggleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertNonBreakingSpace">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertNonBreakingSpace</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertHardHyphen">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertHardHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertSoftHyphen">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSoftHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertZWSP">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertZWSP</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertWJ">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertWJ</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertLRM">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertLRM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertRLM">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRLM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-FontDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-SelectAll">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectAll</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-FocusToFindbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-SearchDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-RestoreEditingView">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RestoreEditingView</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ImageCrop">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ExternalEdit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExternalEdit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ChangePicture">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePicture</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-CompressGraphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-SaveGraphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-OriginalSize">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OriginalSize</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ImageMapDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator139">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-PhotoAlbumDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PhotoAlbumDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-AnimationObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AnimationObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-Gallery">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Gallery</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-TwainSelect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TwainSelect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertAVMedia">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertAVMedia</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertQrCode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertQrCode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertObject">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObject</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-ImportFromFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImportSlideFromFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertMath">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMath</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-DrawText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-VerticalText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertObjectFloatingFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObjectFloatingFrame</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-HyperlinkDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HyperlinkDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-CapturePoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertPageField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlideField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertPagesField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlidesField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-HeaderAndFooter">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HeaderAndFooter</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Master">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="InsertMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RenameMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CloseMasterViewD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Media">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuMedia-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuMedia-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Object">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-ChainFrames">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChainFrames</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-UnhainFrames">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UnhainFrames</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuObject-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-FrameDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FrameDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Reference">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-InsertFootnoteDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertFootnoteDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReference-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-AddressBookSource">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddressBookSource</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReference-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateAll">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateAll</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-Repaginate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Repaginate</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateFields">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateFields</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateAllIndexes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateAllIndexes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateCurIndex">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateCurIndex</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateAllLinks">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateAllLinks</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateCharts">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateCharts</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-CalculateSel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CalculateSel</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellOnline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellOnline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ThesaurusDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetLanguageAllTextMenu</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-Hyphenation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Hyphenation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ChineseConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChineseConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HangulHanjaConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-MoreDictionaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoreDictionaries</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Slide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-InsertSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DuplicateSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DeleteSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ModifyPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ModifyPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-SlideSetup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-SelectBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-PresentationLayout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationLayout</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DisplayMasterBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DisplayMasterBackground</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DisplayMasterObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DisplayMasterObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-HideSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HideSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ShowSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-RenameSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ImportSlideFromFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImportSlideFromFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-SummaryPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SummaryPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ExpandPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExpandPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-MoveSlideUp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-MoveSlideDown">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideDown</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Slide Show">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-Presentation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-PresentationCurrentSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-RehearseTimings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RehearseTimings</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-CustomShowDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CustomShowDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-Remote">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Remote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-SlideChangeWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideChangeWindow</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-CustomAnimation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CustomAnimation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-PresentationMinimizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationMinimizer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-PresentationDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-AutoFormat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AutoFormat</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-InsertRowDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-InsertColumnDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertColumnDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetRowHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetRowHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetOptimalRowHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetOptimalRowHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-DistributeRows">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeRows</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetColumnWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetColumnWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetOptimalColumnWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetOptimalColumnWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-DistributeColumns">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeColumns</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-Protect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Protect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-UnsetCellsReadOnly">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UnsetCellsReadOnly</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-HeadingRowsRepeat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HeadingRowsRepeat</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-RowSplit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RowSplit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-ConvertTextToTable">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertTextToTable</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-ConvertTableToText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertTableToText</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-TableSort">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableSort</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-MergeTable">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MergeTable</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-TableNumberRecognition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableNumberRecognition</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-TableBoundaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableBoundaries</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Tools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-MacroRecorder">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroRecorder</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-RunMacro">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RunMacro</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-BasicIDEAppear">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicIDEAppear</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-MacroOrganizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroOrganizer?TabId:short=1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-ScriptOrganizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ScriptOrganizer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-MacroSignature">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroSignature</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-DevTools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DevelopmentToolsDockingWindow</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTools-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-PresentationMinimizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationMinimizer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-BmpMask">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BmpMask</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTools-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-ViewDataSourceBrowser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ViewDataSourceBrowser</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTools-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-OpenXMLFilterSettings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OpenXMLFilterSettings</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-NormalMultiPaneGUI">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutlineMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutlineMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-NotesMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NotesMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-DiaMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-SlideMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-NotesMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NotesMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-HandoutMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HandoutMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Menubar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Menubar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Sidebar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-StatusBarVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:StatusBarVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-LeftPaneImpress">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:LeftPaneImpress</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ToggleTabBarVisibility">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleTabBarVisibility</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ShowRuler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-GridUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-GridFront">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-HelplinesVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom100Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom100Percent</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkImage" id="RecentFilesImg1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/sc_recentfilelist.png</property>
+ </object>
+ <object class="GtkImage" id="changebezierImg">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_changebezier.png</property>
+ </object>
+ <object class="GtkImage" id="paragraphstylei">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_insertfieldctrl.png</property>
+ </object>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="NotebookBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarTabControl" id="ContextContainer">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="File Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="File">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-New">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkMenuToolButton" id="File-AddDirect">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AddDirect</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-New1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-NewDoc1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NewDoc</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-SaveAsTemplate1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveAsTemplate</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Open">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="File-Open">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Open</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Open1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="File-RecentFileList1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="action_name">.uno:RecentFileList</property>
+ <property name="image">RecentFilesImg1</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-OpenRemote1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenRemote</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Save">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="File-Save">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Save</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Save1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-SaveAs1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveAs</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-SaveAsRemote1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveAsRemote</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Export">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator93">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom66">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="File-ExportTo">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExportTo</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Export1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-ExportDirectToPDF1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExportDirectToPDF</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-SendMail">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendMail</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Print">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="File-Print">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Print</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Print1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-PrintDefault1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PrintDefault</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-PrintPreview1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PrintPreview</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Property">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="File-SetDocumentProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDocumentProperties</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="File-Section-Property1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-Signature1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Signature</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="File-SignPDF1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SignPDF</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="File-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom80">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="File-CloseDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CloseDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="File-HelpIndex">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelpIndex</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-end">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="File-FileButton:Menu File">
+ <property name="label" translatable="yes" context="impressnotebookbar|FileLabel">_File</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="File-HelpButton:Menu Help">
+ <property name="label" translatable="yes" context="impressnotebookbar|HelpMenuButton">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin-start">5</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="FileLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|FileLabel">~File</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Home Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Home">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Clipboard">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom87">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-Paste">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Cut">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Cut</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Copy">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Copy</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Slide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator107">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-InsertPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-DuplicatePage">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-DeletePage">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:DeleteSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-AssignLayout">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:AssignLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Style">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-FormatPaintbrush">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-SetDefault">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Format">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="font">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkToolButton" id="Home-CharFontName">
+ <property name="visible">True</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="fontheight">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <child>
+ <object class="GtkToolButton" id="Home-FontHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Grow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Shrink">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Bold">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Italic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Underline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Strikeout">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Shadowed">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-Spacing">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Spacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-CharBackColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-Color">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Paragraph">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator102">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="GroupB16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-CellVertTop">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-CellVertCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-CellVertBottom">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-LeftPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-CenterPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-RightPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Paragraph2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="GroupB95">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom98">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-DefaultBullet">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-DefaultNumbering">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-SetOutline">
+ <property name="action_name">.uno:SetOutline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB97">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom143">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-JustifyPara1">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator99">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom144">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-LineSpacing1">
+ <property name="visible">True</property>
+ <property name="halign">end</property>
+ <property name="action_name">.uno:LineSpacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Paragraph3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB98">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom145">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-IncrementIndent">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:IncrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-DecrementIndent">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:DecrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom146">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-ParaspaceIncrease">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-ParaspaceDecrease">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-DrawSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Text">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-VerticalText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-DrawSection1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="GroupB12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Line">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-LineToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-BasicShapes.rectangle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.rectangle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-BasicShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-DrawSection2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="GroupB93">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-ConnectorToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator95">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA28">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB94">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator98">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB29">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-FillColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Slideshow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator94">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Presentation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB21">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-PresentationCurrentSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Home-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="PasteBox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Home-HomeButton:Menu Home">
+ <property name="label" translatable="yes" context="impressnotebookbar|HomeMenuButton">_Home</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Home-SearchDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Findbar">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="HomeLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|HomeLabel">~Home</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-default"/>
+ <class name="context-any"/>
+ <class name="context-Text"/>
+ <class name="context-DrawText"/>
+ <class name="context-TextObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Insert Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Slide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Slide1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB99">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB22">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-DuplicatePage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA20">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-ImportFromFile">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImportSlideFromFile</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InserTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertObjectChart">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom65">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-Gallery">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Gallery</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-PhotoAlbumDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PhotoAlbumDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Media">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom103">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertAVMedia1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAVMedia</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Hyperlink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-HyperlinkDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HyperlinkDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Hyperlink1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-CapturePoint">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Field">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Insert-FieldButton:Menu Field">
+ <property name="label" translatable="yes" context="impressnotebookbar|FieldMenuButton">Fiel_d</property>
+ <property name="width_request">70</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:FieldMenu</property>
+ <property name="image">paragraphstylei</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="image_position">top</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-DrawText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom97">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-Text">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom82">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-VerticalText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-Line1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-Polygon_Unfilled1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Polygon_Unfilled</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-Bezier_Unfilled1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bezier_Unfilled</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-ArrowsToolbox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-BasicShapes.rectangle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.rectangle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-BasicShapes.ellipse1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.ellipse</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-DrawCaption1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DrawCaption</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-LineToolbox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Draw2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-BasicShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Inser-SymbolShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Inser-ArrowShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-ConnectorToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkToolButton" id="Inser-StarShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Inser-CalloutShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Inser-Objects3DToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Symbol">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom105">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-CharmapControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharmapControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Symbol1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertMath">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMath</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-EmojiControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EmojiControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Insert-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Insert-InsertButton:Menu Insert">
+ <property name="label" translatable="yes" context="impressnotebookbar|InsertMenuButton">_Insert</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertGraphic1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-Text1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertPage1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="InsertLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|InsertLabel">~Insert</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Layout Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Layout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Slide-Section-PageFormat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-PageSetup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Slide-HeaderAndFooter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HeaderAndFooter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slide-Section-PageFormat1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-SelectBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-SaveBackground">
+ <property name="visible">True</property>
+ <property name="halign">start</property>
+ <property name="action_name">.uno:SaveBackground</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slide-Section-InsertSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-InsertPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slide-Section-InsertSlide1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-DuplicatePage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-DeletePage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slide-Section-ShowPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-RenamePage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RenameSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slide-Section-ShowPage1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA23">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-HideSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HideSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB25">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-ShowSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slide-Section-Navigation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA21">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-MovePageUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MoveSlideUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB23">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-MovePageDown">
+ <property name="visible">True</property>
+ <property name="halign">start</property>
+ <property name="action_name">.uno:MoveSlideDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slide-Section-MasterSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom45">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-PresentationLayout">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slide-Section-MasterSlide1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA26">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-DisplayMasterBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DisplayMasterBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB28">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-DisplayMasterObjects">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DisplayMasterObjects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slide-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slide-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB16">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Layout-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Slide-SlideButton:Menu Slide">
+ <property name="label" translatable="yes" context="impressnotebookbar|SlideMenuButton">_Layout</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Slide-AssignLayout">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:AssignLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="LayoutLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|LayoutLabel">~Layout</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Slide Show Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Slide Show">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Slideshow-Section-Slideshow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom89">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-Presentation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slideshow-Section-Slideshow1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom81">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-PresentationCurrentSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slideshow-Section-Slideshow2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA16">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-RehearseTimings">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RehearseTimings</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB17">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-CustomShowDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CustomShowDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slideshow-Section-Page">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-PresentationDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:PresentationDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slideshow-Section-Page1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-SlideChangeWindow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideChangeWindow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-CustomAnimation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CustomAnimation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slideshow-Section-Minimize">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-PresentationMinimizer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationMinimizer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Slideshow-Section-Minimize1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Slideshow-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="SlideShow-SlideShowButton:Menu Slide Show">
+ <property name="label" translatable="yes" context="impressnotebookbar|SlideShowMenuButton">_Slide Show</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShowMenu-Presentation">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="SlideShowLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|ReferencesLabel">~Slide Show</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Review Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Language">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom67">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Review-SpellDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Review-ThesaurusDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ThesaurusDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Language1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA19">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-SpellOnline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellOnline</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB20">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-Hyphenation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Hyphenation</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Annotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom69">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Review-InsertAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Annotation1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-NextAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NextAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-PreviousAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PreviousAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Annotation2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-DeleteAnnotions">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-DeleteAllAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteAllAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Annotation3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom94">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Review-ShowAnnotations">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowAnnotations</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-RedactDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom133">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Review-RedactDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RedactDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-EditDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom92">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Review-EditDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EditDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Reference-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Review-ReviewButton:Menu Review">
+ <property name="label" translatable="yes" context="impressnotebookbar|ReviewMenuButton">_Review</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Review-AcceptTrackedChanges">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ReviewLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|ReviewLabel">~Review</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="View Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-NormalMultiPaneGUI">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-View1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom90">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-DiaMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-View2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-NotesMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NotesMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutlineMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutlineMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Master">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-SlideMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Master1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-NotesMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NotesMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-HandoutMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HandoutMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Zoom">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Zoom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA17">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomPrevious">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPrevious</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomPage1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Zoom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA22">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomNext">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomNext</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB19">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomPageWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPageWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-Sidebar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ShowRuler">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-GridVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Menubar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Menubar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ToggleTabBarVisibility">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleTabBarVisibility</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Home-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB100">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA29">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-GridVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-HelplinesVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-HelplinesMove">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesMove</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB30">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB101">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA30">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-GlueInsertPoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueInsertPoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB31">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-DisplayQuality">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom86">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-DisplayQuality1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutputQualityBlackWhite">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutputQualityBlackWhite</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-New">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom88">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-NewWindow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NewWindow</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="View-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="ViewMenu2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="View-ViewButton:Menu View">
+ <property name="label" translatable="yes" context="impressnotebookbar|ViewMenuButton">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="View-Zoom">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator126">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ViewLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|ViewLabel">~View</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Table Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Layout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Table-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Layout1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsBefore">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsAfter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteColumns">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteColumns</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsBefore">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsAfter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteRows">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteRows</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-SetBorderStyle">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:SetBorderStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-LineStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FrameLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FrameLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Table-MergeCells">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:MergeCells</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Merge1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Table-SplitCell">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SplitCell</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Table-SelectTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Select1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireColumn">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireColumn</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireRow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireRow</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Optimize">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom76">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Table-OptimizeTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OptimizeTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Optimize1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom84">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CellVertTop">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CellVertCenter">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CellVertBottom">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom85">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-LeftPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CenterPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-RightPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-JustifyPara">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Style">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom79">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDesign">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:TableDesign</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Table-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Table-TableButton:Menu Table">
+ <property name="label" translatable="yes" context="impressnotebookbar|TableMenuButton">_Table</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TableDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator118">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="TableLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|TableLabel">~Table</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Table"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Image Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Big">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Image-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Edit1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="SecondGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-CompressGraphic1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Crop1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-ChangePicture">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:ChangePicture</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-SaveGraphic">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatLine1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatArea1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle1">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle4">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom135">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-FormatLineArea3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first27">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-LineEndStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom134">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-ConvertButton:Menu Convert">
+ <property name="label" translatable="yes" context="impressnotebookbar|ConvertMenuButton">Convert</property>
+ <property name="width_request">70</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ <property name="image">changebezierImg</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="image_position">top</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ObjectAlign2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ObjectAlign1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator123">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Second7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-FormatImageFilter">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="GraphicFilterToolboxGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GraphicFilterToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GraphicFilterToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ColorSettings1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafLuminance">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:GrafLuminance</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafContrast">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:GrafContrast</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ColorSettings2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafTransparence">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:GrafTransparence</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafGamma">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:GrafGamma</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-GrafMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator97">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB103">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-GrafMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ColorSettings">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ColorSettings</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Image-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-GraphicButton:Menu Image">
+ <property name="label" translatable="yes" context="impressnotebookbar|GraphicMenuButton">Ima_ge</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom83">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Image-FormatArea">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-FormatLine">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ImageLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|ImageLabel">Ima~ge</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Graphic"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Draw Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Big1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Shear">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shear</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-CrookSlant">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CrookSlant</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatLine2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatArea2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-FormatLineArea3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle2">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle1">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-FormatLineArea4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-ConvertButton:Menu Convert">
+ <property name="label" translatable="yes" context="impressnotebookbar|ConvertMenuButton">Convert</property>
+ <property name="width_request">70</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ <property name="image">changebezierImg</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="image_position">top</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-ObjectAlign2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-ObjectAlign1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignUp1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignMiddle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-AlignDown1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Second1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Bezier">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Bezier1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="BezierGroup1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom91">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierConvert">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierConvert</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierClose">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierClose</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="BackgroundFront1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierSymmetric">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierSymmetric</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierEliminatePoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierEliminatePoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Bezier2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="BezierGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom71">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierMove">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierMove</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierInsert">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierInsert</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierDelete">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierDelete</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="BackgroundFront2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierCutLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierCutLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierEdge">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierEdge</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-BezierSmooth">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BezierSmooth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-GluePoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom137">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-GlueEditMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GlueEditMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-MergeCombine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB102">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom147">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Combine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Dismantle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-DistributeSelection">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom148">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Merge">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Substract">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Intersect">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Group">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator132">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatGroup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Group1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-EnterGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EnterGroup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LeaveGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeaveGroup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first38">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second39">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionDepthFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDepthFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionDirectionFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDirectionFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-Extrusion3DColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Extrusion3DColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-ExtrusionSurfaceFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionSurfaceFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Fontwork">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom96">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Fontwork1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom108">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkShapeType">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkShapeType</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkSameLetterHeights">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkSameLetterHeights</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom99">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkAlignmentFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkAlignmentFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkCharacterSpacingFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkCharacterSpacingFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Draw-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-DrawButton:Menu Draw">
+ <property name="label" translatable="yes" context="impressnotebookbar|DrawMenuButton">_Draw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatArea">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatLine">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="DrawLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|DrawLabel">~Draw</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Draw"/>
+ <class name="context-DrawLine"/>
+ <class name="context-3DObject"/>
+ <class name="context-MultiObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Object Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Object">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Big2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-Shear">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shear</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-CrookSlant">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CrookSlant</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatLine3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatArea3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-XLineStyle5">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ObjectLineWidth2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-LineEndStyle5">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-XLineColor4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FillStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-LineEndStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom136">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Object-ConvertButton:Menu Convert">
+ <property name="label" translatable="yes" context="impressnotebookbar|ConvertMenuButton">Convert</property>
+ <property name="width_request">70</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ <property name="image">changebezierImg</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="image_position">top</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-ObjectAlign1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align16">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first17">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Second2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Object-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Object-ObjectButton:Menu Object">
+ <property name="label" translatable="yes" context="impressnotebookbar|ObjectMenuButton">_Object</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatArea">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatLine">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ObjectLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|ObjectLabel">~Object</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Frame"/>
+ <class name="context-OLE"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">10</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Media Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Media">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Media-NameGroup">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom28">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-ObjectAlign1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align17">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectAlignLeft1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignCenter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectAlignRight1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignUp1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignDown1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignMiddle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Second3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom138">
+ <property name="width_request">148</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaToolBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaToolBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom139">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaPlayer1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Media-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="media:Menu Media">
+ <property name="label" translatable="yes" context="impressnotebookbar|MediaMenuButton">_Media</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatArea">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatLine">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-TransformDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="MediaLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|MediaLabel">~Media</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Media"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">11</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Form Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Form-SwitchControlDesignMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SwitchControlDesignMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-UseWizards">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:UseWizards</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-GroupBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom114">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FormProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowFmExplorer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom109">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-TabDialog1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TabDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom110">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-OpenReadOnly1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom111">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ControlProperties2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ControlProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-AutoControlFocus2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoControlFocus</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Label1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Edit1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CheckBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom116">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RadioButton2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ListBox2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ComboBox2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom120">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-NumericField2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CurrencyField2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-PatternField2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom123">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FormattedField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-DateField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TimeField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom140">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-Pushbutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-Imagebutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-ImageControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom141">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FileControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-NavigationBar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-Grid">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Form-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="Form-Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Form-FormButton:Menu Form">
+ <property name="label" translatable="yes" context="impressnotebookbar|FormMenuButton">Fo_rm</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="FormMenu-FormProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="FormLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="ImpressNotebookbar|FormLabel">Fo~rm</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Form"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Master Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="MasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom101">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-NormalMultiPaneGUI1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-View1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom102">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-DiaMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-View2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin16">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-NotesMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NotesMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing16">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutlineMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutlineMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Master">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom104">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-SlideMasterPage1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Master1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin17">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-NotesMasterPage1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NotesMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing17">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-HandoutMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HandoutMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MasterPage-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom106">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MasterPage-Section-Insert1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-RenameMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-MasterLayouts">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom107">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-MasterLayouts1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MasterLayouts</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-ShowHide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-HideSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HideSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-ShowSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MasterPage-Section-Property">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom117">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPageMenu-PageSetup1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MasterPage-Section-Background">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-SelectBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-SaveBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MasterPage-Section-CloseMasterView">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom118">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-CloseMasterView">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="MasterPage-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="MasterPage-Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Menu:Menu Master">
+ <property name="label" translatable="yes" context="impressnotebookbar|FormMenuButton">_Master</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom100">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPageMenu-PageSetup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="MasterLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="ImpressNotebookbar|MasterLabel">~Master</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-MasterPage"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">13</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Outline Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Outline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-View3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom64">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-NormalMultiPaneGUI2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-View4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom68">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-DiaMode2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-View5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-NotesMode2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NotesMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutlineMode2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutlineMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Master2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom70">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-SlideMasterPage2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Master3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin19">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-NotesMasterPage2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NotesMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing19">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-HandoutMode2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HandoutMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-OutlineFormat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom72">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Outline-OutlineFormat">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutlineFormat</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Outline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA24">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutlineRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutlineRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB24">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutlineLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutlineLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Outline1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA27">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutlineUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutlineUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB27">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutlineDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutlineDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-ColorView">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom73">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-ColorView">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ColorView</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin20">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutlineCollapseAll">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutlineCollapseAll</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing20">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutlineExpandAll">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutlineExpandAll</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin21">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutlineCollapse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutlineCollapse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing21">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutlineExpand">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutlineExpand</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-New1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom75">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="View-NewWindow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NewWindow</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Outline-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="View2-Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="View2-OutlineButton:Menu View">
+ <property name="label" translatable="yes" context="ImpressNotebookbar|FormMenuButton">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom74">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="OutlineMenu-NormalMultiPaneGUI">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="OutlineLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="ImpressNotebookbar|View2Label">~Outline</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-OutlineText"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">14</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="3d Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="3d">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Big3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom77">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom78">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-Shear">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shear</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-CrookSlant">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CrookSlant</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatLine4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatArea4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-XLineStyle5">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ObjectLineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom93">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-LineEndStyle5">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-XLineColor4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom95">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FillStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-LineEndStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom142">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Windows3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Big5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Window3D1">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:Window3D</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="box27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="AlignGroup5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first16">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first19">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Second4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="3dObject-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="3dObject-Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="3dObject-FormButton:Menu 3d">
+ <property name="label" translatable="yes" context="impressnotebookbar|FormMenuButton">3_d</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom119">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatArea5">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatLine5">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-TransformDialog1">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="3DObjectLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|FormLabel">3~d</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-3DObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Extension Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Extension">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="NotebookBarAddonsToolMergePoint" id="AddonCommand">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Extension-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="Extension-Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Extension-ExtensionButton:Menu Addons">
+ <property name="label" translatable="yes" context="impressnotebookbar|FormMenuButton">E_xtension</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ExtensionLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|ExtensionLabel">E~xtension</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">16</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Tools Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Tools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Macro">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom121">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RunMacro">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RunMacro</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Macro1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA25">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-BasicIDEAppear">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicIDEAppear</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB26">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-MacroDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MacroDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Presentation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom122">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-PresentationMinimizer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationMinimizer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Presentation1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-BmpMask">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BmpMask</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator141">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom124">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">3</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-SwitchControlDesignMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SwitchControlDesignMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="GroupB85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-UseWizards1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:UseWizards</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-GroupBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator142">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom125">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Label">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Edit">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CheckBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom126">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RadioButton1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ListBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ComboBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom127">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-NumericField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CurrencyField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-PatternField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom128">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FormattedField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-DateField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TimeField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator144">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom129">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Pushbutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Imagebutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ImageControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom130">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FileControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-NavigationBar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Grid">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom131">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FormProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TabDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TabDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ControlProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ControlProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom132">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowFmExplorer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-OpenReadOnly">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-AutoControlFocus">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoControlFocus</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Tools-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="ViewMenu3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Tools-ToolsButton:Menu Tools">
+ <property name="label" translatable="yes" context="impressnotebookbar|ToolsMenuButton">_Tools</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom149">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-OptionsTreeDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OptionsTreeDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="DevLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="impressnotebookbar|DevLabel">~Tools</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">16</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <object class="GtkSizeGroup" id="1stRow">
+ <property name="mode">vertical</property>
+ <property name="ignore_hidden">True</property>
+ <widgets>
+ <widget name="LineA7"/>
+ <widget name="box76"/>
+ <widget name="GroupB16"/>
+ <widget name="GroupB95"/>
+ </widgets>
+ </object>
+ <object class="GtkSizeGroup" id="2ndRow">
+ <property name="mode">vertical</property>
+ <property name="ignore_hidden">True</property>
+ <widgets>
+ <widget name="LineB8"/>
+ <widget name="GroupB11"/>
+ <widget name="GroupB15"/>
+ <widget name="GroupB97"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/notebookbar_compact.ui b/sd/uiconfig/simpress/ui/notebookbar_compact.ui
new file mode 100644
index 000000000..ce64d8ff6
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/notebookbar_compact.ui
@@ -0,0 +1,20285 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <requires lib="LibreOffice" version="1.0"/>
+ <!-- interface-local-resource-path ../../../icon-themes/colibre/cmd/ -->
+ <object class="GtkMenu" id="Menu 3d">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="Menu3D-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltDown">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltDown</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltUp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltLeft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltRight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="Menu3D-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-Window3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Window3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="Menu3D-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Addons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">AddonCommand</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="AddonSection-Separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-MirrorVert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MirrorVert</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-MirrorHorz">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MirrorHorz</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Combine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Dismantle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Substract">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Intersect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-EqualizeWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-EqualizeHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Connect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Connect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Break">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Break</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-CopyObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CopyObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Morphing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Morphing</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ChangeBezier">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ChangePolygon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-convert_to_contour">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertInto3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertInto3DLatheFast">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertIntoBitmap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConvertIntoMetaFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Field">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertDateFieldFix">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertDateFieldFix</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertDateFieldVar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertDateFieldVar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertTimeFieldFix">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertTimeFieldFix</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertTimeFieldVar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertTimeFieldVar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuField-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertAuthorField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertAuthorField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertSlideField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlideField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertSlideTitleField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlideTitleField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertSlidesField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlidesField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuField-InsertFileField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertFileField</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu File">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-AddDirect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddDirect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Open">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Open</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-OpenRemote">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OpenRemote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-RecentFileList">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RecentFileList</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-CloseDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-AutoPilotMenu">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AutoPilotMenu</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-OpenTemplate">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OpenTemplate</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveAsTemplate">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAsTemplate</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-NewDoc">
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NewDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Reload">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Reload</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-VersionDialog">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VersionDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Save">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Save</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveAs">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAs</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveAsRemote">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAsRemote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveACopy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveACopy</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveAll">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAll</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-CheckOut">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CheckOut</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-CancelCheckOut">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CancelCheckOut</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-CheckIn">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CheckIn</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-ExportTo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportTo</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-ExportToPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportToPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-ExportDirectToPDF">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportDirectToPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SendMail">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMail</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SendMailDocAsPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMailDocAsPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-WebHtml">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WebHtml</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Print">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Print</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-PrinterSetup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrinterSetup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Signature">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Signature</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SignPDF">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SignPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SetDocumentProperties">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetDocumentProperties</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuFile-Separator9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-Quit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Quit</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-CheckBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-RadioButton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ListBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ComboBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Pushbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Imagebutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-FormattedField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-DateField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-TimeField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-NumericField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-CurrencyField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-PatternField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ImageControl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-FileControl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-NavigationBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Help">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-HelpIndex">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelpIndex</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-ExtendedHelp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtendedHelp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-Documentation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Documentation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-QuestionAnswers">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:QuestionAnswers</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-SendFeedback">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendFeedback</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-SafeMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SafeMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-GetInvolved">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GetInvolved</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-Donation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Donation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-ShowLicense">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowLicense</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHelp-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHelp-About">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:About</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Home">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-Shadowed">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-OutlineFont">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutlineFont</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-Overline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Overline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToUpper">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToUpper</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToLower">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToLower</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseRotateCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseRotateCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToSentenceCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToSentenceCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToTitleCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToTitleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ChangeCaseToToggleCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToToggleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertNonBreakingSpace">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertNonBreakingSpace</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertHardHyphen">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertHardHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertSoftHyphen">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSoftHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertZWSP">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertZWSP</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertWJ">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertWJ</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertLRM">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertLRM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-InsertRLM">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRLM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-FontDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-SelectAll">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectAll</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuHome-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-FocusToFindbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-SearchDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuHome-RestoreEditingView">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RestoreEditingView</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ImageCrop">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ExternalEdit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExternalEdit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ChangePicture">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePicture</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-CompressGraphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-SaveGraphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuImage-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-OriginalSize">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OriginalSize</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ImageMapDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuImage-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuImage-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuImage-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-PhotoAlbumDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PhotoAlbumDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-AnimationObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AnimationObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-Gallery">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Gallery</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-TwainSelect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TwainSelect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertAVMedia">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertAVMedia</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertQrCode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertQrCode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertObject">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObject</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-ImportFromFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImportSlideFromFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertMath">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMath</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-DrawText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-VerticalText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertObjectFloatingFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObjectFloatingFrame</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-HyperlinkDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HyperlinkDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-CapturePoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertPageField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlideField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertPagesField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlidesField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-HeaderAndFooter">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HeaderAndFooter</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Layout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-InsertSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DuplicateSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ImportSlideFromFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImportSlideFromFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-RenameSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DeleteSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-PresentationLayout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationLayout</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DisplayMasterBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DisplayMasterBackground</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DisplayMasterObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DisplayMasterObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-HideSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HideSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ShowSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-SummaryPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SummaryPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ExpandPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExpandPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-MoveSlideUp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-MoveSlideDown">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideDown</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ModifyPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ModifyPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-SlideSetup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Master">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="InsertMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RenameMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CloseMasterViewD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Media">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuMedia-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-RenameObject">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameObject</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuMedia-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-EditHyperlink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EditHyperlink</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-RemoveHyperlink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RemoveHyperlink</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-OpenHyperlinkOnCursor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OpenHyperlinkOnCursor</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Object">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-ChainFrames">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChainFrames</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-UnhainFrames">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UnhainFrames</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuObject-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuObject-FrameDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FrameDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Reference">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-InsertFootnoteDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertFootnoteDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReference-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-AddressBookSource">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddressBookSource</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReference-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateAll">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateAll</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-Repaginate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Repaginate</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateFields">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateFields</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateAllIndexes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateAllIndexes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateCurIndex">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateCurIndex</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateAllLinks">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateAllLinks</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-UpdateCharts">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UpdateCharts</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReference-CalculateSel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CalculateSel</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellOnline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellOnline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ThesaurusDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetLanguageAllTextMenu</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-Hyphenation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Hyphenation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ChineseConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChineseConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HangulHanjaConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-MoreDictionaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoreDictionaries</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Slide Show">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-Presentation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-PresentationCurrentSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-RehearseTimings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RehearseTimings</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-CustomShowDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CustomShowDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-Remote">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Remote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-SlideChangeWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideChangeWindow</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-CustomAnimation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CustomAnimation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlideShow-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-PresentationMinimizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationMinimizer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlideShow-PresentationDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-AutoFormat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AutoFormat</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-InsertRowDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-InsertColumnDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertColumnDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetRowHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetRowHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetOptimalRowHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetOptimalRowHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-DistributeRows">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeRows</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetColumnWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetColumnWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-SetOptimalColumnWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetOptimalColumnWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-DistributeColumns">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeColumns</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-Protect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Protect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-UnsetCellsReadOnly">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:UnsetCellsReadOnly</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-HeadingRowsRepeat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HeadingRowsRepeat</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-RowSplit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RowSplit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-ConvertTextToTable">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertTextToTable</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-ConvertTableToText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertTableToText</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTable-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-TableSort">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableSort</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-MergeTable">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MergeTable</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-TableNumberRecognition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableNumberRecognition</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTable-TableBoundaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableBoundaries</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-Shadowed">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-OutlineFont">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutlineFont</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-Overline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Overline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuText-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ChangeCaseToUpper">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToUpper</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ChangeCaseToLower">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToLower</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ChangeCaseRotateCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseRotateCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuText-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ChangeCaseToSentenceCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToSentenceCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ChangeCaseToTitleCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToTitleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ChangeCaseToToggleCase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToToggleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuText-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertNonBreakingSpace">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertNonBreakingSpace</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertHardHyphen">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertHardHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertSoftHyphen">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSoftHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertZWSP">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertZWSP</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertWJ">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertWJ</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertLRM">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertLRM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-InsertRLM">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRLM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuText-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuText-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-FontDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-OutlineBullet">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutlineBullet</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuText-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuText-TextAttributes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TextAttributes</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Tools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-RunMacro">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RunMacro</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-MacroRecorder">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroRecorder</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-BasicIDEAppear">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicIDEAppear</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-MacroOrganizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroOrganizer?TabId:short=1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-MacroSignature">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroSignature</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-ScriptOrganizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ScriptOrganizer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTools-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-ImageMapDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-BmpMask">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BmpMask</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTools-Separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-ViewDataSourceBrowser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ViewDataSourceBrowser</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-OpenXMLFilterSettings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OpenXMLFilterSettings</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuTools-Separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-PackageManagerDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuTools-OptionsTreeDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OptionsTreeDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-PageMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PageMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-MasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Menubar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Menubar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Sidebar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-StatusBarVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:StatusBarVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-LeftPaneImpress">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:LeftPaneImpress</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ToggleTabBarVisibility">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleTabBarVisibility</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ShowRuler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-GridUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-GridFront">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-HelplinesVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom50Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom50Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom75Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom75Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom100Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom100Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom150Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom150Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom200Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom200Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomPrevious">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomPrevious</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomNext">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomNext</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomObjects</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkImage" id="paragraphstylei">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/sc_insertfieldctrl.png</property>
+ </object>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="NotebookBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarTabControl" id="ContextContainer">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="File Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="File">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="NewSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Files-New">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AddDirect</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="NewDocSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom101">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Files-NewDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NewDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OpenSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Files-Open">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Open</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OpenRemoteSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom102">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Files-OpenRemote">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenRemote</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SaveSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom86">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Files-Save">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Save</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SaveAsSection1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom103">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Files-SaveAs">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveAs</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="ExportToSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom87">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="Files-ExportTo">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExportTo</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="ExportToPDFSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom104">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="Files-ExportDirectToPDF">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExportDirectToPDF</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SendMailSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="Files-SendMail">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendMail</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="PrintSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom105">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="Files-Print">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Print</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="PrintDefaultSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom106">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="Files-PrintDefault">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PrintDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="PrinterSetupSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="PrinterSetup">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:PrinterSetup</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SetDocumentPropertiesSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExportGroup3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Files-SetDocumentProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDocumentProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="File-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="CloseDoc">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:CloseDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="File-FileButton:Menu File">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|FileMenuButton">_File</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="FileLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|FileLabel">~File</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Home Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Home">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Clipboard">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-Paste">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Cut">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Cut</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Copy">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Copy</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-26"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Page">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-InsertPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-26"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Page1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-DuplicatePage">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-AssignLayout">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:AssignLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-25"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Paintbrush">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-FormatPaintbrush">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-ResetAttributes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-FontName">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-CharFontName">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-24"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-FontHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-FontHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-23"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-GrawShrink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Grow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Shrink">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-22"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-BoldItalic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Bold">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Italic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Underline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Strikeout">
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Shadowed">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-SubSuperScript">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-SubScript">
+ <property name="action_name">.uno:SubScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-SuperScript">
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SuperScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-21"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-FontColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-Spacing">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Spacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-CharBackColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-Color">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-FontDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-FontDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-BulletNumbering">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom108">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-DefaultBullet">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-DefaultNumbering">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-SetOutline">
+ <property name="action_name">.uno:SetOutline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-IncrementDecrement">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom135">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-IncrementIndent">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:IncrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-DecrementIndent">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DecrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Para1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-LeftPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-CenterPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-RightPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-JustifyPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Para2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom157">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-CellVertTop">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-CellVertCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-CellVertBottom">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-LTR">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom158">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Spacing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom159">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-LineSpacing2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineSpacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-ParaspaceIncrease">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-ParaspaceDecrease">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-InsertAVMedia">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertAVMedia</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Insert1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-InsertObjectChart">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-InsertTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Slideshow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom160">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Presentation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Slideshow1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-PresentationCurrentSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Home-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-SearchDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Home-HomeButton:Menu Home">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|HomeMenuButton">_Home</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="HomeLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|HomeLabel">~Home</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-default"/>
+ <class name="context-any"/>
+ <class name="context-Text"/>
+ <class name="context-DrawText"/>
+ <class name="context-TextObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Insert Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Page">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Duplicate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom151">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-DuplicatePage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom150">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Insert-InsertTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Chart">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertObjectChart">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-OLE">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom127">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Graphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Gallery">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom152">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-Gallery">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Gallery</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-PhotoAlbumDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-PhotoAlbumDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PhotoAlbumDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-InsertAVMedia">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom153">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertAVMedia">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAVMedia</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Hyperlink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-HyperlinkDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HyperlinkDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-CapturePoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom156">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-ObjectFloatingFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom129">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertObjectFloatingFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObjectFloatingFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Field">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Insert-FieldButton:Menu Field">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|FieldMenuButton">Fiel_d</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:FieldMenu</property>
+ <property name="image">paragraphstylei</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-DrawText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-DrawText1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-VerticalText1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-LineToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-LineToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-ConnectorToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-BasicShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-BasicShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-SymbolShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-ArrowShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-StarShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-CalloutShapes">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-FlowChartShapes1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Insert-Objects3DToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-SectionSymbol">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-CharmapControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharmapControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Formula">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom128">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertMath">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMath</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Insert-Section-Emoji">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-EmojiControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EmojiControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Insert-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Insert-InsertSlide1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Insert-InsertButton:Menu Insert">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|InsertMenuButton">_Insert</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="InsertLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|InsertLabel">~Insert</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Layout Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Layout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-PageLayout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-PageSetup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Page-HeaderAndFooter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HeaderAndFooter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-Background">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-SelectBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-Background1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom131">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-SaveBackground1">
+ <property name="visible">True</property>
+ <property name="halign">start</property>
+ <property name="action_name">.uno:SaveBackground</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-DeletePage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-DeletePage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-HideSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HideSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-ShowSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-ShowSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-MovePage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="Page-MovePageUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MoveSlideUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-MovePage1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkToolButton" id="Page-MovePageDown1">
+ <property name="visible">True</property>
+ <property name="halign">start</property>
+ <property name="action_name">.uno:MoveSlideDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-PresentationLayout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-PresentationLayout">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-DisplayMasterBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom69">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-DisplayMasterBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DisplayMasterBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-DisplayMasterObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom66">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-DisplayMasterObjects">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DisplayMasterObjects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-SelectGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator129">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom183">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Layout-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-SelectGroup1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom195">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Layout-FormatGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator100">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom80">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom97">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Layout-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator104">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom130">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Page-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Layout-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Layout-AssignLayout">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:AssignLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Layout-PageButton:Menu Layout">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|LayoutMenuButton">Layout</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="LayoutLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|LayoutLabel">~Layout</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Review Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Language">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-SpellDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-SpellOnline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom134">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-SpellOnline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellOnline</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-ThesaurusDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom85">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-ThesaurusDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ThesaurusDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Hyphenation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom155">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-Hyphenation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Hyphenation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-InsertAnnotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom118">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-InsertAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-PreviousAnnotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-PreviousAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PreviousAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-NextAnnotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom119">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-NextAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NextAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-DeleteAnnotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom120">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-DeleteAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-DeleteAllAnnotation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-DeleteAllAnnotation">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:DeleteAllAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-ShowAnnotations">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator97">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-ShowAnnotations">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowAnnotations</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Review-Section-Redact">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator130">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom220">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-RedactDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RedactDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Review-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Review-AcceptTrackedChanges">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Review-ReviewButton:Menu Review">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|ReviewMenuButton">_Review</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator150">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ReviewLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|ReviewLabel">~Review</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Slide Show Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Slide Show">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="SlideShow-Section-Presentation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-Presentation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-PresentationCurrentSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SlideShow-Section-PresentationDialog1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-PresentationDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:PresentationDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SlideShow-Section-RehearseTimings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-RehearseTimings">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RehearseTimings</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SlideShow-Section-CustomShowDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-CustomShowDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CustomShowDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SlideShow-Section-PresentationDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LeftParaMargin2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-PresentationDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:PresentationDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SlideShow-Section-SlideChangeWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-SlideChangeWindow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideChangeWindow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SlideShow-Section-CustomAnimation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-CustomAnimation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CustomAnimation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SlideShow-Section-PresentationMinimizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="belowspacing4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-PresentationMinimizer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationMinimizer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SlideShow-Section-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SlideShow-Section-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShow-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="SlideShow-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideShowMenu-Presentation">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="SlideShow-SlideShowButton:Menu Slide Show">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|LayoutMenuButton">_Slide Show</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="SlideShowLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|LayoutLabel">~Slide Show</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="View Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="View-Sections-Views">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom107">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-NormalMultiPaneGUI">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Sections-Views1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom207">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-DiaMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Sections-Views2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom208">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-NotesMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NotesMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Sections-Views3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom209">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-OutlineMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OutlineMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Sections-Master">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom110">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-SlideMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Sections-Master1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-NotesMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NotesMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Sections-Master2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-HandoutMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HandoutMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator112">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Navigator">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Navigator</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom109">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Rulers">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Visible2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom199">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-GridVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Bars">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator141">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Menubar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Menubar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Bars1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom200">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Sidebar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Bars2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ToggleTabBarVisibility">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleTabBarVisibility</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Zoom">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom201">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomOptimal1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomOptimal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Zoom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom202">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Zoom100Percent1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Zoom100Percent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-Zoom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom203">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-ZoomPanning">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPanning</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Sections-NewWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom111">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-NewWindow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NewWindow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="View-Section-EditDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator102">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom198">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-EditDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EditDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="View-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-Zoom">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="View-ViewButton:Menu View">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|ViewMenuButton">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ViewLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|ViewLabel">~View</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Table Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Paintbrush">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatPaintbrush">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetDefaul">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-AutoForma">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tabl-AutoFormat">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoFormat</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-AreaDialog1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea4">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FrameLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FrameLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-LineStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-SetBorderStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetBorderStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-BorderDialog1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TableDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontName">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CharFontName1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FontHeight1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-GrawShrink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-Grow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Shrink1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-23"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-BoldItalic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-Bold1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Italic1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Underline1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Strikeout1">
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Shadowed1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-SubSuperScript">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-SubScript">
+ <property name="action_name">.uno:SubScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SuperScript">
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SuperScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-22"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Color1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Spacing1">
+ <property name="action_name">.uno:Spacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-CharBackColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-21"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FontDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-BulletNumbering">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-DefaultBullet">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DefaultNumbering">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetOutline">
+ <property name="action_name">.uno:SetOutline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-IncrementDecrement">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-IncrementIndent1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:IncrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DecrementIndent1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DecrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Para1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-LeftPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CenterPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-RightPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-JustifyPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-20"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Para2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertTop1">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertCenter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertBottom1">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-19"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-LTR">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Spacing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaspaceIncrease">
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaspaceDecrease">
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-ParagraphDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tabl-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator54">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom136">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-StyleApply1">
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">27</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom140">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-MergeCells1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MergeCells</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SplitCell1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SplitCell</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-OptimizeTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OptimizeTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">28</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-AutoFormat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-AutoFormat">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:AutoFormat</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">29</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Column">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom162">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireColumn1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireColumn</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsBefore1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsAfter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteColumns1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteColumns</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">30</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Row">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireRow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireRow</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsBefore1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsAfter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteRows1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteRows</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">31</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-TableDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDialog2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TableDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">32</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom163">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CharmapControl1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharmapControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">33</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Table-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom76">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TableDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Table-TableButton:Menu Table">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|TableMenuButton">T_able</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator170">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="TableLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|TableLabel">~Table</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Table"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Image Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkBox" id="GraphicPasteBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom186">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom187">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-Forward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-Backward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator68">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom164">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-StyleApply3">
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Crop">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-Crop">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-SaveReplace">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ChangePicture">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ChangePicture</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-CompressGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-SaveGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-GraphicFilterToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom165">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-GraphicFilterToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GraphicFilterToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-ColorSettings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom166">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ColorSettings">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ColorSettings</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">24</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-GrafMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-GrafMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-GrafTransparence">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom167">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-GrafTransparence">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafTransparence</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">26</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Transformations">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator134">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom222">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphi-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">29</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Image-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-GraphicButton:Menu Image">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|ImageMenuButton">Image</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator187">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="GraphicLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|ImageLabel">Ima~ge</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Graphic"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Draw Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkBox" id="MultiObject-Section-PasteBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom188">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom189">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObjec-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="MultiObject-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-LineEndStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="MultiObject-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="MultiObject-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Forward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Backward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom168">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom169">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-StyleApply3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Combine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom170">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Combine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Dismantle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Merge">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Substract">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Intersect">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-DistributeSelection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-DistributeSelection">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Transformations1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Mirror">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Mirror</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-22"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">24</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Transformations3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator133">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom221">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Shear">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shear</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-InteractiveTransparence">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InteractiveTransparence</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-InteractiveGradient">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InteractiveGradient</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-20"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Transformations2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator126">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ConvertInto3DLathe">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConvertInto3DLathe</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-CrookRotate">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CrookRotate</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-CrookSlant">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CrookSlant</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-21"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">26</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-EditPoints">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator127">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-19"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">27</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">29</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-3D1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom117">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionDepthFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDepthFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionDirectionFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDirectionFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">30</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-3D2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom154">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-Extrusion3DColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Extrusion3DColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-ExtrusionSurfaceFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionSurfaceFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">31</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Fontwork">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">32</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Fontwork1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkShapeType">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkShapeType</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkSameLetterHeights">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkSameLetterHeights</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">33</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Fontwork2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkAlignmentFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkAlignmentFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkCharacterSpacingFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkCharacterSpacingFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">34</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Draw-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom84">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-DrawButton:Menu Draw">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|DrawMenuButton">D_raw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="DrawLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|ShapeLabel">~Draw</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Draw"/>
+ <class name="context-DrawLine"/>
+ <class name="context-MultiObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Object Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Object">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Advanced">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom190">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Frame-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom191">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Frame-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Frame-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom94">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom95">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom98">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Objec-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatArea1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-XLineStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-LineWidth">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatLine3">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom99">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom100">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator93">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom175">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ReverseOrder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator94">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom176">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-StyleApply">
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Object-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom88">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Object-ObjectButton:Menu Object">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|ObjectMenuButton">Object</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator114">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="FrameLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|FrameLabel">~Object</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Frame"/>
+ <class name="context-OLE"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">10</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Media Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Media">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Advanced">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom192">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom193">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom132">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Media-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Media-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Media-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom138">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-Forward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom139">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-Backward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom171">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom172">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator90">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom173">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-StyleApply3">
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox">
+ <property name="width_request">167</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom174">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaToolBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaToolBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-TransformDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Media-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom91">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="media:Menu Media">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|MediaButton">_Media</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="MediaLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|MediaLabel">~Media</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Media"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">11</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Form Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom114">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="For-SwitchControlDesignMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SwitchControlDesignMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-UseWizards">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:UseWizards</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator98">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Form-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignUp4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignMiddle4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignDown4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignCenter4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ObjectAlignRight4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator99">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Form-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom122">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-Forward3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-Backward3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-SendToBack3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator106">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom123">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-BeforeObject1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-BehindObject1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ControlProperties">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ControlProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ControlProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Properties">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FormProperties1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowFmExplorer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-TabDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-TabDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TabDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-OpenReadOnly">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom116">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-OpenReadOnly">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-AutoControlFocus">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom121">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-AutoControlFocus">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoControlFocus</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-LabelCheckbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Label1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Edit1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CheckBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-LabelCheckbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RadioButton1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ListBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ComboBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Buttons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator95">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Pushbutton1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Imagebutton1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Farmatted">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator101">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FormattedField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-DateField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TimeField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Farmatted1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-NumericField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CurrencyField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-PatternField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-GroupBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator103">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-GroupBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Controls">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator107">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-ImageControl1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-FileControl1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-GridNavigationBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator108">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom93">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Grid1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-NavigationBar1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Form-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom124">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="form:Menu Form">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|FormButton">Fo_rm</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator115">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="FormLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|FormLabel">Fo~rm</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-Form"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Master Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Master">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Master-Sections-Views">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom133">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-NormalMultiPaneGUI1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Sections-Master">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator109">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom161">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-SlideMasterPage1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Sections-Master1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom177">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-NotesMasterPage1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NotesMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Sections-Master2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom182">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="View-HandoutMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HandoutMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator110">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom126">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Rename">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-RenameMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Dialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-PageSetup">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-SelectBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator111">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-SelectBackground">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-SaveBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Anchor2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-SaveBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator113">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom137">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-ViewMenu">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ViewMenu</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-DisplayMasterBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Anchor1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-DisplayMasterBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DisplayMasterBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-DisplayMasterObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-DisplayMasterObjects">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:DisplayMasterObjects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-MasterLayouts">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-MasterLayouts">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:MasterLayouts</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-PageMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-PageMode">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:PageMode</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Close">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator116">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Anchor6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-CloseMasterView">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="MasterPage-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom141">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MasterPage-PageSetup">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Menu:Menu Master">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|PrintPreviewButton">_Master</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator117">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="MasterPageLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|FormLabel">~Master</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-MasterPage"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">13</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="3d Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="3d">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Window3d">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom194">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3D-Window3D">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Window3D</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator118">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom142">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator119">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom143">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom144">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom145">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObjec-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3DObject-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator120">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator121">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom146">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-Forward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom147">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-Backward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator122">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom148">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom180">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator123">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom181">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-StyleApply3">
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="3d-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom149">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-TransformDialog">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-3D:Menu 3d">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|FormButton">3_d</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator124">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="3DLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|FormLabel">3~d</property>
+ <property name="use_underline">True</property>
+ <style>
+ <class name="context-3DObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Extension Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Extension">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="NotebookBarAddonsToolMergePoint" id="AddonCommand">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Extension-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkBox" id="Extension-Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom125">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="ExtensionMenu-ExtensionDialog">
+ <property name="visible">True</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Extension-ExtensionButton:Menu Addons">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|ExtensionMenuButton">E_xtension</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator105">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ExtensionLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|ExtensionLabel">E~xtension</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Tools Tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Tools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Macro">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom178">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RunMacro">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RunMacro</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-BasicIDEAppear">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicIDEAppear</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Macro1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom204">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-MacroDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MacroDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-PresentationMinimizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator128">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom179">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-PresentationMinimizer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationMinimizer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-BmpMask">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom196">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-BmpMask">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BmpMask</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom197">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-DesignMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator125">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom205">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-SwitchControlDesignMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SwitchControlDesignMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-Wizard">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom206">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-UseWizards">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:UseWizards</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-LabelCheckbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator138">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom210">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Label">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Edit">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CheckBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-LabelCheckbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom211">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RadioButton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ListBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ComboBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-Buttons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator144">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom212">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Pushbutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Imagebutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-Farmatted">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator145">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom213">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FormattedField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-DateField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TimeField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-Farmatted1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom214">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-NumericField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CurrencyField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-PatternField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-GroupBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator146">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom215">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-GroupBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-Controls">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator131">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom216">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-ImageControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-FileControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-GridNavigationBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator152">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom217">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Grid">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-NavigationBar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-TabDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator154">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom218">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-ShowFmExplore">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowFmExplorer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TabDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TabDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form-ReadOnly">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator158">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom219">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-OpenReadOnly">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-AutoControlFocus">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoControlFocus</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Tools-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom184">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OptionsTreeDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Tools-ToolsButton:Menu Tools">
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|ToolsMenuButton">_Tools</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</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="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator132">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="ToolLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_impress_compact|DevLabel">~Tools</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/notebookbar_groupedbar_compact.ui b/sd/uiconfig/simpress/ui/notebookbar_groupedbar_compact.ui
new file mode 100644
index 000000000..461f13833
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/notebookbar_groupedbar_compact.ui
@@ -0,0 +1,14144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <requires lib="LibreOffice" version="1.0"/>
+ <object class="GtkMenu" id="Menu 3d">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="Menu3D-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltDown">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltDown</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltUp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltLeft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-ExtrusionTiltRight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="Menu3D-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu3D-Window3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Window3D</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Addons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">AddonCommand</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="AddonSection-Separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="WrapOffD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapOff</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapOnD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapOn</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapIdealD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapIdeal</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapLeftD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapRightD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapThroughD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapThrough</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapThroughTransparentD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapThroughTransparent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapContourD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapContour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="WrapAnchorOnlyD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapAnchorOnly</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="TextWrapD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TextWrap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator132">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SetObjectToForegroundD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetObjectToForeground</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SetObjectToBackgroundD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetObjectToBackground</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Calculate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="TableSortD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableSort</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AutoSumD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AutoSum</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Line">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-BasicShapes.rectangle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicShapes.rectangle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-BasicShapes.ellipse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicShapes.ellipse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-DrawCaption">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DrawCaption</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-VerticalCaption">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VerticalCaption</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-DrawText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-VerticalText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-LineToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConnectorToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-BasicShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-SymbolShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ArrowShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-CalloutShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-StarShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Objects3DToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-AddTextBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddTextBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Text_Marquee">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Text_Marquee</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-Repeat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Repeat</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-Cut">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Cut</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-Copy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Copy</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-Paste">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-PasteUnformatted">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PasteUnformatted</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-PasteSpecial">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PasteSpecial</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-CopyObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CopyObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-SelectAll">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectAll</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-FocusToFindbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-SearchDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-RestoreEditingView">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RestoreEditingView</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-EditHyperlink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EditHyperlink</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ModifyField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ModifyField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ManageLinks">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ManageLinks</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ImageMapDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ObjectMenue">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectMenue</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-GlueEditMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GlueEditMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-EditDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EditDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-PageSetup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Edit Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-SelectObject">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FlipVertical">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FormatLine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FormatArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-TextAttributes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TextAttributes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FontWork">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontWork</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu File">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="AddDirectD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddDirect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RecentFileListD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RecentFileList</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CloseDocD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SaveD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Save</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SaveAsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAs</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SaveAsRemoteD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAsRemote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuFile-SaveACopy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveACopy</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="NewGlobalDocD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NewGlobalDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExportToD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportTo</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExportToPDFD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportToPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SendMailD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMail</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SendMailDocAsPDFD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMailDocAsPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SendViaBluetoothD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendViaBluetooth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PrintD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Print</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PrintDefaultD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrintDefault</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PrinterSetupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrinterSetup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SignatureD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Signature</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SignPDFD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SignPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SetDocumentPropertiesD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetDocumentProperties</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="QuitD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Quit</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Fontwork">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuFontwork-FontworkSameLetterHeights">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontworkSameLetterHeights</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-CheckBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-RadioButton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ListBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ComboBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Pushbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Imagebutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-FormattedField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-DateField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-TimeField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-NumericField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-CurrencyField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-PatternField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-ImageControl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-FileControl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuForm-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-Grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuForm-NavigationBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Format">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="GrowD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ShrinkD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ShadowedD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="OutlineFontD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutlineFont</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="OverlineD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Overline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SuperScript2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SuperScript</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SubScriptD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SubScript</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToUpperD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToUpper</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToLowerD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToLower</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseRotateCaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseRotateCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToSentenceCaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToSentenceCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToTitleCaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToTitleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToToggleCaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToToggleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertNonBreakingSpaceD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertNonBreakingSpace</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertHardHyphenD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertHardHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertSoftHyphenD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSoftHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertZWSPD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertZWSP</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertWJD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertWJ</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertLRMD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertLRM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertRLMD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRLM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertRLMD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-Ruler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Ruler</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-VRuler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VRuler</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuGrid-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-ViewBounds">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ViewBounds</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-TableBoundaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableBoundaries</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-ShowGraphics">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowGraphics</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuGrid-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-GridVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-GridUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-HelplinesMove">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesMove</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuGrid-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuGrid-HideWhitespace">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HideWhitespace</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Group">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="GroupBoxD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="NameGroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectTitleDescriptionD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator119">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="FormatGroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormatGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="FormatUngroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormatUngroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EnterGroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EnterGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="LeaveGroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:LeaveGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator145">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeBezierD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangePolygonD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="convert_to_contourD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DLatheFastD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoBitmapD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoMetaFileD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator146">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CombineD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DismantleD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConnectD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Connect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="BreakD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Break</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MergeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SubstractD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="IntersectD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EqualizeWidthD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EqualizeHeightD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator150">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GroupBoxD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="CropD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExternalEditD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExternalEdit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangePictureD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePicture</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CompressGraphicD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SaveGraphicD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectMirrorVerticalD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectMirrorVertical</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectMirrorHorizontalD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectMirrorHorizontal</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeBezier1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangePolygonD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="convert_to_contourD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DLatheFastD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoBitmapD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoMetaFileD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ImageMapDialogD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator142">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AnimationEffectsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectTitleDescription1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-Gallery">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Gallery</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-SelectBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertAVMedia">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertAVMedia</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-TwainSelect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TwainSelect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-PhotoAlbumDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PhotoAlbumDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-AnimationObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AnimationObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertQrCode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertQrCode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertObject">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObject</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-ImportFromFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImportFromFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertMath">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMath</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-DrawText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertObjectFloatingFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObjectFloatingFrame</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-HyperlinkDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HyperlinkDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-CapturePoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertPageField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlideField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertPagesField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlidesField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-HeaderAndFooter">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HeaderAndFooter</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuInsert-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuInsert-InsertSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Master Page">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="InsertMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RenameMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CloseMasterViewD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Media">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuMedia-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-NameGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuMedia-ObjectTitleDescription">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Object">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="ObjectMenue">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectMenue</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator154">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertCaptionDialog3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertCaptionDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator147">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeBezierD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangePolygonD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="convert_to_contourD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DLatheFastD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoBitmapD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoMetaFileD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator156">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CombineD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DismantleD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConnectD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Connect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="BreakD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Break</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MergeD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SubstractD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="IntersectD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EqualizeWidthD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EqualizeHeightD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator164">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DistributeSelection1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Paragraph">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="ParaLeftToRightD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ParaRightToLeftD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ParaspaceIncreaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ParaspaceDecreaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SpacePara1D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpacePara1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SpacePara15D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpacePara15</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SpacePara2D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpacePara2</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ParagraphDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellOnline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellOnline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ThesaurusDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-MoreDictionaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoreDictionaries</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetLanguageAllTextMenu</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ChineseConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChineseConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HangulHanjaConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-Hyphenation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Hyphenation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-RedactDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RedactDoc</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Rows Columns">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="InsertRowsBeforeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowsBefore</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertRowsAfterD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowsAfter</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertRowDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertColumnsBeforeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertColumnsBefore</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertColumnsAfterD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertColumnsAfter</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertColumnDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertColumnDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteRowsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteRows</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteColumnsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteColumns</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EntireRowD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EntireRow</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EntireColumnD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EntireColumn</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SelectTableD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectTable</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu Settings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-Menubar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Menubar</property>
+ <property name="label" translatable="yes" context="impress_notebookbar_groupedbar_compact|MenubarAction">Menubar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-Sidebar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSettings-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-ToolbarModeUI">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToolbarModeUI</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-AvailableToolbars">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AvailableToolbars</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-OptionsTreeDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OptionsTreeDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSettings-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-Extensions">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSettings-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-RunMacro">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RunMacro</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-ScriptOrganizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ScriptOrganizer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSettings-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-HelpIndex">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelpIndex</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSettings-About">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:About</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="Menu View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-NormalMultiPaneGUI">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutlineMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutlineMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-NotesMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NotesMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-DiaMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-SlideMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-NotesMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NotesMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-HandoutMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HandoutMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-NewWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NewWindow</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Menubar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Menubar</property>
+ <property name="label" translatable="yes" context="impress_notebookbar_groupedbar_compact|MenubarView">Menubar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Sidebar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-StatusBarVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:StatusBarVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-LeftPaneImpress">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:LeftPaneImpress</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ToggleTabBarVisibility">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleTabBarVisibility</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ShowRuler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-GridVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-SnapFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-SnapPoints">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-SnapBorder">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomPageWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomPageWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom100Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom100Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSepiaD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSepia</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSobelD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSobel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterInvertD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterInvert</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterMosaicD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterMosaic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterPopart">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterPopart</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterPosterD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterPoster</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterReliefD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterRelief</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterRemoveNoiseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterRemoveNoise</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSharpenD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSharpen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSmoothD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSmooth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSolarizeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSolarize</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GrafModeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GrafMode</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-Presentation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-PresentationCurrentSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-RehearseTimings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RehearseTimings</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-CustomShowDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CustomShowDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-Remote">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Remote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-PresentationDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-InsertSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DuplicateSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DeleteSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-PresentationLayout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationLayout</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DisplayMasterBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DisplayMasterBackground</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-DisplayMasterObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DisplayMasterObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-SummaryPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SummaryPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ExpandPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExpandPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-ShowSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-HideSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HideSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-MoveSlideUp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-MoveSlideDown">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideDown</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSlide-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSlide-PresentationMinimizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationMinimizer</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuSnap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-CapturePoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-GlueInsertPoint">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GlueInsertPoint</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSnap-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-GridVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-GridFront">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridFront</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-HelplinesMove">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesMove</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSnap-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-HelplinesVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-HelplinesFront">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesFront</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSnap-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-GridUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-SnapFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-SnapPoints">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-SnapBorder">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuSnap-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuSnap-ShowRuler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ </child>
+ </object>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="NotebookBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="Toolbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <child>
+ <object class="sfxlo-DropdownBox" id="File">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">5</property>
+ <child>
+ <object class="GtkBox" id="Section">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="File-Open">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Open</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="File-Save">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Save</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="File-ExportToPDF">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExportToPDF</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="File-File:Menu File">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|fileb">_File</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Clipboard">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Edit-Paste">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Edit-Undo">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Undo</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Edit-Redo">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Redo</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Edit-Edit:Menu Edit">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|editb">_Edit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-ContextVBox" id="ContextContainer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Default">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Slide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Presentation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-PresentationCurrentSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-AssignLayout">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AssignLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-Slide:MenuSlide">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|reviewb">S_lide</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-DrawText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-VerticalText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-Draw-Line">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-Draw-LineToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-Draw-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-Draw:Menu Draw">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|draw">D_raw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Draw1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Default-BasicShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SymbolShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ArrowShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Default-StarShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-CalloutShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-FlowChartShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Draw2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Default-ConnectorToolbox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-XLineColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box97">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Objects3DToolbox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB18">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertObjectChart">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-Insert:Menu Insert">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Insert</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-SpellDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertAnnotation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-GridVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-Review:Menu Review">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|reviewb">_Review</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Zoom">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-NormalMultiPaneGUI">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-DiaMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SlideMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-View:Menu View">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|viewT">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Extension">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="baseline_position">bottom</property>
+ <child>
+ <object class="GtkSeparator" id="separator47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-PackageManagerDialog">
+ <property name="visible">True</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="NotebookBarAddonsToolMergePoint" id="AddonCommand">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Extension-ExtensionButton:Menu Addons">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|ExtensionMenuButton">E_xtension</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Default"/>
+ <class name="context-DrawPage"/>
+ <class name="context-TextObject"/>
+ <class name="context-SlidesorterPage"/>
+ <class name="context-OutlineText"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Text">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Text-Slide-Slide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Presentation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-PresentationCurrentSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-InsertPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-AssignLayout">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AssignLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Text-Slide:MenuSlide">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|reviewb">S_lide</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Font">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator123">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-CharFontName">
+ <property name="visible">True</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin-start">5</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-FontHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Section-fontcolor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Text-Font:Menu Format">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|formatt">F_ont</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-Bold">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-Italic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-Underline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-Strikeout">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Section-CharBackColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Paragraph">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Section-DefaultBullet">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Section-DefaultNumbering">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-LeftPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Text-Paragraph:Menu Paragraph">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|paragrapht">_Paragraph</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Paragraph1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-CenterPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-RightPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-JustifyPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-CellVertTop">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-CellVertCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-CellVertBottom">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box101">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom127">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-Zoom">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-NormalMultiPaneGUI">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-DiaMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Section-SlideMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Text-View:Menu View">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|viewT">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Text"/>
+ <class name="context-DrawText"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Table">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Font">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CharFontName">
+ <property name="visible">True</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin-start">5</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FontHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-Color">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Table-Font:Menu Format">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|formatt">F_ont</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-Bold">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Italic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Underline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Strikeout">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-CharBackColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Paragraph">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-DefaultBullet">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-DefaultNumbering">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Table-Paragraph:Menu Paragraph">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|paragrapht">_Paragraph</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Paragraph1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-LeftPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CenterPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-RightPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-JustifyPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CellVertTop">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CellVertCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CellVertBottom">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-Section-MergeCells">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MergeCells</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Section-SplitCell">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SplitCell</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Section-TableDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TableDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Section-OptimizeTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OptimizeTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Table-Table:Menu Rows Columns">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|rowscolumnst">_Table</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator124">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsBefore">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsAfter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteColumns">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteColumns</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="opacity">0.92156862745098034</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsBefore">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsAfter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteRows">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteRows</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Table2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box98">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireColumn">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireColumn</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetMinimalColumnWidth">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetMinimalColumnWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetOptimalColumnWidth">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetOptimalColumnWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DistributeColumns">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DistributeColumns</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box99">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireRow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireRow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetMinimalRowHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetMinimalRowHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetOptimalRowHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetOptimalRowHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DistributeRows">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DistributeRows</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-SetBorderStyle2">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:SetBorderStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-LineStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FrameLineColor2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FrameLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FillStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Calc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator139">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableSort">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TableSort</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-AutoSum">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoSum</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Table-Calc:Menu Calculate">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|calculatet">_Calc</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator94">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertGraphic1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertObjectChart1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertPage1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertTable1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box100">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Default-Insert:MenuInsert1">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Insert</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Table"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Draw">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-Edit:Menu Edit Draw">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|editdrawb">D_raw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle2">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle1">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-LineEndStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-Arrange:Menu Arrange">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box104">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box105">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA7">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Shape">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-DrawText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-VerticalText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Line">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-Draw:Menu Draw">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|draw">_Shape</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Shape1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BasicShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-SymbolShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ArrowShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ConnectorToolbox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-StarShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-CalloutShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FlowChartShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Objects3DToolbox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Group">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FormatGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-EnterGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EnterGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LeaveGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeaveGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-Group:Menu Group">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|viewDrawb">Grou_p</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-MergeCombine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="GroupB102">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom147">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Combine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Dismantle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-DistributeSelection">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom148">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-Merge">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Substract">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-Intersect">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-3d">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator144">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom46">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-FillColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-Extrusion3DColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Extrusion3DColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Draw-3D:Menu 3d">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|3Db">3_D</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-3d1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-ExtrusionSurfaceFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionSurfaceFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionLightingFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionLightingFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box102">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionDepthFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDepthFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ExtrusionDirectionFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDirectionFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Fontwork">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkShapeType">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkShapeType</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkAlignmentFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkAlignmentFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-FontworkCharacterSpacingFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontworkCharacterSpacingFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box94">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Impress-Fontwork:Menu Fontwork">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|GridButton">_Fontwork</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Draw-Section-Grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-GridVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-GridUse1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-HelplinesMove">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesMove</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box95">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Impress-Grid:Menu Grid">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|GridButton">_Grid</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Draw"/>
+ <class name="context-DrawLine"/>
+ <class name="context-3DObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Image">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Graphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-Crop">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-CompressGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-Image:Menu Image">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|graphicB">_Image</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Imag-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle3">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle2">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Imag-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-LineEndStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-FillShadow2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-Arrange:Menu Arrange">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box106">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box107">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Snap-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Snap-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Snap-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Snap-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Image-Snap-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Snap-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-Color">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-Section-GrafMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Image-Color:MenuColor">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|GridB">Fi_lter</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ColorSettings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="GroupB87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafLuminance">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafLuminance</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafTransparence">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafTransparence</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Image-Section-ColorSettings2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">5</property>
+ <child>
+ <object class="GtkBox" id="GroupB90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafContrast">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafContrast</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Image-GrafGamma">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafGamma</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Graphic"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Object">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-Graphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="OLE-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="OLE-Frame:Menu Object">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|graphicB">_Object</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle4">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle3">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-LineEndStyle3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-FillShadow3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="OLE-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="OLE-Arrange:Menu Arrange">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box108">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="OLE-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box109">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="OLE-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="OLE-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="OLE-Snap-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-Snap-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-Snap-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-Snap-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="OLE-Snap-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="OLE-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="OLE-Snap-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-OLE"/>
+ <class name="context-Frame"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Media">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Graphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Media-Media:Menu Media">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|graphicB">_Media</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom132">
+ <property name="width_request">148</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaToolBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaToolBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaPlayer1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="baseline_position">bottom</property>
+ <child>
+ <object class="GtkSeparator" id="separator77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-BringToFront1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-SendToBack1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Media-Arrange:Menu Arrange">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="baseline_position">bottom</property>
+ <child>
+ <object class="GtkBox" id="Section65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box110">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-ObjectAlignLeft2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box111">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-Snap-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-Snap-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-Snap-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-Snap-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-Snap-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box112">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Media-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-Snap-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Media"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Multiobject">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-Edit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom28">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-AnimationEffects">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Multi-Edit:Menu Edit Draw">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|editdrawb">D_raw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-FormatLineArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatArea5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-FormatLineArea1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Draw-XLineStyle5">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineWidth5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-LineEndStyle5">
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Draw-XLineColor5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Draw-FillStyle5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-FormatLineArea2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-LineEndStyle4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Image-FillShadow4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-Arrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-BringToFront">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-Forward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-Backward">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Multi-Arrange:Menu Arrange">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|ArrangeButton">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box113">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box114">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-Snap-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-Snap-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-Snap-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-Snap-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-Snap-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Multi-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-Snap-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Multi-Section-Group">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator93">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Multi-FormatGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-EnterGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EnterGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Multi-LeaveGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeaveGroup</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Multi-Group:Menu Group">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|viewDrawb">Grou_p</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-MultiObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Master Page">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="SectionSlideShow5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator166">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-Presentation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-CloseMasterView">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Master:Menu Master Page">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|oleB">_Master</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Draw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-DrawText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-VerticalText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-Line">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-LineToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Draw:Menu Draw">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|draw">D_raw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Draw1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Master-BasicShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-SymbolShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-ArrowShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-StarShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-CalloutShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-FlowChartShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Draw2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="Section68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box115">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Master-BasicShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-SymbolShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-ArrowShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box116">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-StarShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-CalloutShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Draw-FlowChartShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-Section-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Section-InsertObjectChart">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Section-DrawText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Insert:Menu Insert">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Insert</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Snap">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineB2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-Snap-GridUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Snap-HelplinesUse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesUse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Snap-SnapFrame">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Snap-SnapPoints">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Snap-SnapBorder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Snap:MenuSnap">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|insertText">_Snap</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="LineA2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-Snap-CapturePoint">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Review">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator101">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-SpellDialog2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-InsertAnnotation2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-GridVisible2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box103">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-Review:MenuReview">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|reviewb">_Review</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-Section-Zoom">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Section-NormalMultiPaneGUI">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Section-DiaMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Master-Section-SlideMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Master-View:Menu View">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|viewT">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-MasterPage"/>
+ <class name="context-NotesPage"/>
+ <class name="context-HandoutPage"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="Context Form">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="baseline_position">bottom</property>
+ <child>
+ <object class="GtkSeparator" id="separator56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="Section43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">end</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-SwitchControlDesignMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SwitchControlDesignMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-UseWizards">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:UseWizards</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-GroupBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-OpenReadOnly1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Form-FormButton:Menu Form">
+ <property name="label" translatable="yes" context="impress_notebookbar_groupedbar_compact|FormButton">Fo_rm</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom114">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FormProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowFmExplorer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="GroupB49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom118">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-TabDialog1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TabDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom119">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-OpenReadOnly2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom128">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ControlProperties2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ControlProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom129">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-AutoControlFocus2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoControlFocus</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-Label1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-Edit1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CheckBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-RadioButton2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ListBox2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-ComboBox2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tools-Section-Form6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-NumericField2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CurrencyField2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-PatternField2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-FormattedField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-DateField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-TimeField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Form7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="GroupB56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-Pushbutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-Imagebutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-ImageControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FileControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-NavigationBar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-Grid">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Form"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="Tools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin-end">5</property>
+ <child>
+ <object class="GtkBox" id="Ext2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tools-SearchDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-HelpIndex">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelpIndex</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Tools-CloseDoc">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CloseDoc</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="Tools-Menu:Menu Settings">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_compact|menub">_Menu</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">end</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator122">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">4</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/notebookbar_groupedbar_full.ui b/sd/uiconfig/simpress/ui/notebookbar_groupedbar_full.ui
new file mode 100644
index 000000000..ba8dd6409
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/notebookbar_groupedbar_full.ui
@@ -0,0 +1,12494 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <requires lib="LibreOffice" version="1.0"/>
+ <object class="GtkMenu" id="Menu3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="ExtrusionToggleD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator138">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExtrusionTiltDownD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltDown</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExtrusionTiltUpD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExtrusionTiltLeftD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExtrusionTiltRightD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionTiltRight</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuArrange">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="BringToFrontD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ForwardD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="BackwardD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SendToBackD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SetObjectToForegroundD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetObjectToForeground</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SetObjectToBackgroundD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetObjectToBackground</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator130">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectAlignLeftD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AlignCenterD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectAlignRightD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AlignUpD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AlignMiddleD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AlignDownD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator128">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DistributeSelectionD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuCalculate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="TableSortD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableSort</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AutoSumD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AutoSum</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSepiaD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSepia</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSobelD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSobel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterInvertD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterInvert</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterMosaicD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterMosaic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterPopart">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterPopart</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterPosterD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterPoster</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterReliefD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterRelief</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterRemoveNoiseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterRemoveNoise</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSharpenD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSharpen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSmoothD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSmooth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GraphicFilterSolarizeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GraphicFilterSolarize</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuDraw">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Line">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-BasicShapes.rectangle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicShapes.rectangle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-BasicShapes.ellipse">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicShapes.ellipse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-DrawCaption">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DrawCaption</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-VerticalCaption">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VerticalCaption</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-DrawText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-VerticalText">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-LineToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ConnectorToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-BasicShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-SymbolShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ArrowShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-CalloutShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-StarShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Objects3DToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-AddTextBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddTextBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-FontworkGalleryFloater">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-Text_Marquee">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Text_Marquee</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuDraw-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuDraw-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuDrawEdit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-SelectObject">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FlipVertical">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="DrawEdit-Separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FormatLine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FormatArea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-TextAttributes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TextAttributes</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawEdit-FontWork">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontWork</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuEdit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-Repeat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Repeat</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-Cut">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Cut</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-Copy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Copy</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-Paste">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-PasteUnformatted">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PasteUnformatted</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-PasteSpecial">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PasteSpecial</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-CopyObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CopyObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-SelectAll">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectAll</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-FocusToFindbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">vnd.sun.star.findbar:FocusToFindbar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-SearchDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-RestoreEditingView">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RestoreEditingView</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-EditHyperlink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EditHyperlink</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ModifyField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ModifyField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ManageLinks">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ManageLinks</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ImageMapDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ObjectMenue">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectMenue</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-GlueEditMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GlueEditMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-EditDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EditDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuEdit-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuEdit-PageSetup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="AddDirectD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AddDirect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RecentFileListD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RecentFileList</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CloseDocD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SaveD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Save</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SaveAsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAs</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SaveAsRemoteD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveAsRemote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="NewGlobalDocD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NewGlobalDoc</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExportToD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportTo</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExportToPDFD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExportToPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SendMail">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMail</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SendMailD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMail</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SendMailDocAsPDFD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendMailDocAsPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SendViaBluetoothD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendViaBluetooth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PrintPreviewD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrintPreview</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PrintDefaultD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrintDefault</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PrinterSetupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PrinterSetup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SignatureD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Signature</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SignPDFD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SignPDF</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SetDocumentPropertiesD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetDocumentProperties</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="QuitD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Quit</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuFormat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="GrowD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ShrinkD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ShadowedD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="OutlineFontD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutlineFont</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="OverlineD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Overline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SuperScript1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SuperScript</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SubScriptD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SubScript</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToUpperD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToUpper</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToLowerD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToLower</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseRotateCaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseRotateCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToSentenceCaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToSentenceCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToTitleCaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToTitleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeCaseToToggleCaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeCaseToToggleCase</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator155">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertNonBreakingSpaceD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertNonBreakingSpace</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertHardHyphenD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertHardHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertSoftHyphenD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSoftHyphen</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertZWSPD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertZWSP</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertWJD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertWJ</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertLRMD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertLRM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertRLMD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRLM</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator156">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertRLMD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuGraphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="CropD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExternalEditD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExternalEdit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangePictureD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePicture</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CompressGraphicD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SaveGraphicD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectMirrorVerticalD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectMirrorVertical</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectMirrorHorizontalD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectMirrorHorizontal</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeBezier1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangePolygonD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="convert_to_contourD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DLatheFastD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoBitmapD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoMetaFileD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ImageMapDialogD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImageMapDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator142">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AnimationEffectsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectTitleDescription1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="ShowRuler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GridVisibleD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GridUseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="HelplinesMoveD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelplinesMove</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="GroupBoxD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="NameGroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NameGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ObjectTitleDescriptionD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectTitleDescription</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator119">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="FormatGroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormatGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="FormatUngroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FormatUngroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EnterGroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EnterGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="LeaveGroupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:LeaveGroup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator137">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeBezierD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangePolygonD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="convert_to_contourD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DLatheFastD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoBitmapD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoMetaFileD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator144">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CombineD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DismantleD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConnectD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Connect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="BreakD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Break</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MergeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SubstractD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="IntersectD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EqualizeWidthD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EqualizeHeightD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator150">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DistributeSelection1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuHelp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="HelpIndexD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelpIndex</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExtendedHelpD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExtendedHelp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DocumentationD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Documentation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator94">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="QuestionAnswersD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:QuestionAnswers</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SendFeedbackD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SendFeedback</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DonationD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Donation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SafeModeD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SafeMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator113">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ShowLicenseD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowLicense</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AboutD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:About</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuInsert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="PhotoAlbumDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PhotoAlbumDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AnimationObjectsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AnimationObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="GalleryD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Gallery</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="TwainSelectD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TwainSelect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertAVMediaD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertAVMedia</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertQrCodeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertQrCode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertObjectD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObject</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ImportFromFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImportFromFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertMathD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMath</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DrawTextD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="FontworkGalleryFloaterD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:FontworkGalleryFloater</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertObjectFloatingFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertObjectFloatingFrame</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="HyperlinkDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HyperlinkDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CapturePointD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CapturePoint</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertPageFieldD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlideField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertPagesFieldD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlidesField</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="HeaderAndFooterD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HeaderAndFooter</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="InsertMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RenameMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteMasterPageD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CloseMasterViewD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuOLE">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="ObjectMenue">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ObjectMenue</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator154">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertCaptionDialog3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertCaptionDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator148">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangeBezierD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangeBezier</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ChangePolygonD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChangePolygon</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="convert_to_contourD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:convert_to_contour</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3D</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertInto3DLatheFastD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertInto3DLatheFast</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoBitmapD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoBitmap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertIntoMetaFileD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertIntoMetaFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator149">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CombineD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DismantleD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConnectD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Connect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="BreakD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Break</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MergeD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SubstractD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="IntersectD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EqualizeWidthD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EqualizeHeightD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EqualizeHeight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator151">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DistributeSelection2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuParagraph">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="ParaLeftToRightD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ParaRightToLeftD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ParaspaceIncreaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ParaspaceDecreaseD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SpacePara1D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpacePara1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SpacePara15D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpacePara15</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SpacePara2D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpacePara2</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ParagraphDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuReview">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SpellOnline">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SpellOnline</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ThesaurusDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ThesaurusDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-MoreDictionaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoreDictionaries</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-SetLanguageAllTextMenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SetLanguageAllTextMenu</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-ChineseConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ChineseConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-HangulHanjaConversion">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HangulHanjaConversion</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-Hyphenation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Hyphenation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuReview-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuReview-RedactDoc">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RedactDoc</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuRowsColumns">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="InsertRowsBeforeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowsBefore</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertRowsAfterD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowsAfter</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertRowDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertColumnsBeforeD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertColumnsBefore</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertColumnsAfterD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertColumnsAfter</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertColumnDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertColumnDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteRowsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteRows</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteColumnsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteColumns</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EntireRowD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EntireRow</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="EntireColumnD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:EntireColumn</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SelectTableD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectTable</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuSettings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="menubarD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Menubar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SidebarD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator99">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ToolbarModeUI">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToolbarModeUI</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AvailableToolbarsD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AvailableToolbars</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="OptionsTreeDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OptionsTreeDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExtensionsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="HelpIndexD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HelpIndex</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AboutD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:About</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="InsertSlideD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DuplicateSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator102">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ModifyPageD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ModifyPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SlideSetupD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SelectBackgroundD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="InsertMasterPageD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DeleteMasterPageD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator103">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PresentationLayoutD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationLayout</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DisplayMasterBackgroundD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DisplayMasterBackground</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="DisplayMasterObjectsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DisplayMasterObjects</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator157">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="HideSlideD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HideSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ShowSlideD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RenameSlideD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RenameSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator153">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ImportSlideFromFileD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ImportSlideFromFile</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SummaryPageD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SummaryPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ExpandPageD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ExpandPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator165">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MoveSlideUpD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideUp</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MoveSlideDownD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MoveSlideDown</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuSlideShow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="PresentationD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PresentationCurrentSlideD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RehearseTimingsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RehearseTimings</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CustomShowDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CustomShowDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RemoteD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Remote</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="SlideChangeWindowD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideChangeWindow</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="CustomAnimationD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:CustomAnimation</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator114">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="OutputQualityColorD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="OutputQualityGrayscaleD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PresentationMinimizerD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationMinimizer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PresentationDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuTable">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="AutoFormatD1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertCaptionDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AutoFormatD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AutoFormat</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="HeadingRowsRepeatD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HeadingRowsRepeat</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RowSplitD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RowSplit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertTextToTableD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertTextToTable</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ConvertTableToTextD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ConvertTableToText</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="TableNumberRecognitionD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableNumberRecognition</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="TableBoundaries">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:TableBoundaries</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuTools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MacroOrganizerD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroOrganizer?TabId:short=1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MacroSignatureD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroSignature</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ScriptOrganizerD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ScriptOrganizer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="ViewDataSourceBrowserD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ViewDataSourceBrowser</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="BasicIDEAppearD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BasicIDEAppear</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="RunMacroD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:RunMacro</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MacroRecorderD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:MacroRecorder</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PresentationMinimizerD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:PresentationMinimizer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="BmpMaskD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:BmpMask</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="AVMediaPlayerD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="OpenXMLFilterSettingsD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OpenXMLFilterSettings</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="PackageManagerDialogD">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="OptionsTreeDialogD2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OptionsTreeDialog</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMenu" id="MenuView">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-NormalMultiPaneGUI">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutlineMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutlineMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-NotesMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NotesMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-DiaMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-SlideMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-NotesMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:NotesMasterPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-HandoutMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HandoutMode</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Menubar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Menubar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Sidebar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Sidebar</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-StatusBarVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:StatusBarVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-LeftPaneImpress">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:LeftPaneImpress</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ToggleTabBarVisibility">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ToggleTabBarVisibility</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ShowRuler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ShowRuler</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-GridVisible">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-SnapFrame">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapFrame</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-SnapPoints">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapPoints</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-SnapBorder">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:SnapBorder</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityColor</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-OutputQualityGrayscale">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:OutputQualityGrayscale</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomPage</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-ZoomPageWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ZoomPageWidth</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom100Percent">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom100Percent</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="MenuView-separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="MenuView-Zoom">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ </child>
+ </object>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="NotebookBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="DefaultBox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="baseline_position">bottom</property>
+ <child>
+ <object class="sfxlo-DropdownBox" id="SectionTools">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkBox" id="horizontal2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="vertical2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SearchDialog1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SearchDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="menub:MenuSettings">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|menub">_Menu</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="PresentationCurrentSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="toolsb:MenuTools">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|toolsb">_Tools</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="HelpIndex1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelpIndex</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="helpb:MenuHelp">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|helpb">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="SectionFile">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="vertical">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Open">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Open</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Save">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Save</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="third">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="fileb:MenuFile">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|fileb">_File</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Print">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Print</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-DropdownBox" id="SectionEdit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Undo1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Undo</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Redo">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Redo</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Paste1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Cut">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Cut</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="editb:MenuEdit">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|editb">_Edit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Copy">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Copy</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-ContextVBox" id="ContextContainer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="DefaultBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="SectionSlideShow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Presentation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="PresentationCurrentSlide2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="slideshowb:MenuSlideShow">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|slideshowb">_Slide Show</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SlideChangeWindow3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideChangeWindow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="RehearseTimings">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RehearseTimings</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionSlide">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="third24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="DuplicateSlide2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="AssignLayout3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AssignLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="third3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="paragraphstylet:MenuSlide">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|paragraphstylet">S_lide</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="ModifyPage2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ModifyPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionInsert3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertGraphic3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="DrawText4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="insertText:MenuInsert">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|insertText">_Insert</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionDraw1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator162">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Line1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Polygon_Unfilled1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Polygon_Unfilled</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Bezier_Unfilled1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bezier_Unfilled</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ArrowsToolbox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="rectangle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.rectangle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="BasicShapes.round-rectangle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.round-rectangle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ellipse1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.ellipse</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="LineToolbox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator164">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="BasicShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="SymbolShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ArrowShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="StarShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="CalloutShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="FlowChartShapes2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="third16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="draw:MenuDraw">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|draw">D_raw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third3Ext4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="ToggleObjectBezierMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="CustomAnimation4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CustomAnimation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionReview">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SpellDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertAnnotation1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="reviewb:MenuReview">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|reviewb">_Review</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionView">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Zoom">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="NormalMultiPaneGUI">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="DiaMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="SlideMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="viewb:MenuView">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|viewb">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionArrang1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Forward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Forward3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">end</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Backward4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Forward6">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="WrapGroup3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="ObjectAlignLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="arrangedraw:MenuArrange">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|arrangedrawb">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-default"/>
+ <class name="context-DrawPage"/>
+ <class name="context-TextObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="DrawTextBox">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="SectionSlideShow1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Presentation3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="PresentationCurrentSlide3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="slideshowt:MenuSlideShow">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|slideshowt">_Slide Show</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="RehearseTimings1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RehearseTimings</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionFormat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="CharFontName3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="FontHeight3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Bold2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Italic2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Underline2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Strikeout3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Shadowed1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="fontcolor3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="CharBackColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="format:MenuFormat">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|formatd">F_ormat</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Grow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Shrink1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="FontDialog3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionParagraph">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="ParaspaceIncrease1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ParaspaceDecrease1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="LeftPara2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="CenterPara2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="RightPara2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="JustifyPara2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="DefaultBullet2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="DefaultNumbering2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="CellVertTop1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="CellVertCenter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="CellVertBottom1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="paragraph:MenuParagraph">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|paragraphTextb">_Paragraph</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="ParagraphDialog3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionInsert1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator141">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertGraphic1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertPageField3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlideField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="InsertAuthorField3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAuthorField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertSymbole1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharmapControl</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertPagesField3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlidesField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="InsertFileField3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertFileField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="insertTextt:MenuInsert">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|insertTextt">_Insert</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionView1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator139">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Zoom2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="NormalMultiPaneGUI1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="DiaMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="SlideMasterPage1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="viewt:MenuView">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|viewt">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionReview1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator161">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SpellDialog1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SpellDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertAnnotation2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="reviewp:MenuReview">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|reviewp">_Review</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-DrawText"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="TableBox">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="SectionSlideShow2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Presentation5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="PresentationCurrentSlide5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="slideshowtt:MenuSlideShow">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|slideshowtt">_Slide Show</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="RehearseTimings2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RehearseTimings</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionFormat1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="CharFontName1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="FontHeight1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Bold1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Italic1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Underline1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Strikeout1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Shadowed2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="fontcolor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="CharBackColor2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="formatt:MenuFormat">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|formatd">F_ormat</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="Grow2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Shrink2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="FontDialog1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionParagraph1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="LeftPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="LeftPara5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="LeftPara6">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="CenterPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="RightPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="JustifyPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="DefaultBullet1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="DefaultNumbering1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="CellVertTop2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="CellVertCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="CellVertBottom2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="paragrapht:MenuParagraph">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|paragraphTextb">_Paragraph</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="ParagraphDialog1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionTable">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="SetBorderStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetBorderStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="LineStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="FrameLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FrameLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second24">
+ <property name="width_request">200</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="FillStyle3">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="margin_top">2</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="tabled:MenuTable">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|tabled">T_able</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="TableDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TableDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionRowsColumns">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="CellGroup1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertColumnsBefore">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="InsertColumnsAfter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="DeleteColumns">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteColumns</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MergeCells">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MergeCells</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="CellGroup2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertRowsBefore">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="InsertRowsAfter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="DeleteRows">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteRows</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="SplitCell">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SplitCell</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="rowscolumnst:MenuRowsColumns">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|rowscolumnst">R_ows</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionCalculate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="TableSort">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TableSort</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="AutoSum">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoSum</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="calculatet:MenuCalculate">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|calculatet">_Calc</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Table"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="DrawBox">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="SectionDraw3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator116">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Line3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Polygon_Unfilled3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Polygon_Unfilled</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Bezier_Unfilled3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bezier_Unfilled</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ArrowsToolbox3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="rectangle3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.rectangle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="BasicShapes.round-rectangle3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.round-rectangle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ellipse3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.ellipse</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="LineToolbox3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator123">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="BasicShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="SymbolShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ArrowShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="StarShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="CalloutShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="FlowChartShapes1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="third9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="drawd:MenuDraw">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|drawb">D_raw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third3Ext2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="ToggleObjectBezierMode3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="CustomAnimation1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CustomAnimation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionDrawEdit">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator117">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="FormatLine1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="FormatArea2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="LineEndStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="XLineStyle">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="LineWidth2">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29">
+ <property name="width_request">200</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AddTextBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AddTextBox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="editdrawb:MenuDrawEdit">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|editdrawb">_Edit</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="FlipHorizontal1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator118">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="TransformDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionArrang3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator121">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Forward1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Forward4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">end</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Backward1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Forward5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator124">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="WrapGroup1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="ObjectAlignLeft3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignCenter3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ObjectAlignRight3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignMiddle3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignDown3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="arrangedrad:MenuArrange">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|arrangedrawb">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionDrawGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator126">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="GridVisible1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="GridUse1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="HelplinesMove1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesMove</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="third12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="GridDrawB:MenuGrid">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|GridDrawB">_Grid</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionDrawView">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator122">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="FormatGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatGroup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="EnterGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EnterGroup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="LeaveGroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeaveGroup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="FormatUngroup">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatUngroup</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="viewDrawb:MenuGroup">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|viewDrawb">Grou_p</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Section3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator127">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="ExtrusionToggle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionToggle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="FillColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Extrusion3DColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Extrusion3DColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="ExtrusionLightingFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionLightingFloater</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="3Db:Menu3D">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|3Db">3_D</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="ExtrusionDepthFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDepthFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ExtrusionDirectionFloater">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ExtrusionDirectionFloater</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Draw"/>
+ <class name="context-DrawLine"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="GraphicBox">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="SectionGraphic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="first222">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Crop">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="CompressGraphicGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="CompressGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="second222">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="RotateRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="SaveGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="third222">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="graphicB:MenuGraphic">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|graphicB">_Graphic</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third3Ext1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="AnimationEffects">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="GrafModeGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="GrafMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="GraphicFilterToolboxGroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="GraphicFilterToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GraphicFilterToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="BackgroundColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BackgroundColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="colorb:MenuColor">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|colorb">C_olor</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="GrafLuminance1">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:GrafLuminance</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="GrafContrast1">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:GrafContrast</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="GrafTransparence1">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:GrafTransparence</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="GrafGamma1">
+ <property name="width_request">130</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:GrafGamma</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="ColorSettings1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ColorSettings</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionArrang4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Forward10">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Forward11">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">end</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Backward6">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Forward12">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="WrapGroup5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="ObjectAlignLeft2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="AlignUp3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="arrangedrao:MenuArrange">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|arrangedrawb">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionDrawGrid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="GridVisible3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="GridUse3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="HelplinesMove3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesMove</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="third2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="GridDrawO:MenuGrid">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|GridDrawB">_Grid</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Graphic"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="MediaBox">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="SectionFormat2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator125">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first22">
+ <property name="width_request">400</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="AVMediaToolBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaToolBox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="WrapOff1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:WrapOff</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="WrapOn1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:WrapOn</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="WrapIdeal1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:WrapIdeal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator145">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="WrapLeft1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:WrapLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="WrapThrough1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:WrapThrough</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="WrapRight1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:WrapRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="WrapContour">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:WrapContour</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator146">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="AlignLeft1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignHorizontalCenter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignHorizontalCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignRight1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignTop1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignVerticalCenter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignVerticalCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignBottom2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator147">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="OneStep1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="AlignBottom3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Backward2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="BringToFront1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="SendToBack1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="media:MenuArrange">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|media">_Media</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="TransformDialog1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="AnchorMenu2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AnchorMenu</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Media"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="OLEBox">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="SectionSlideShow3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator106">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Presentation7">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="PresentationCurrentSlide7">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="slideshowOLE:MenuSlideShow">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|slideshowOLE">_Slide Show</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="RehearseTimings3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RehearseTimings</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionDrawEdit1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator110">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="FormatLine2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="FormatArea1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="LineEndStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="XLineStyle1">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="XLineColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="LineWidth1">
+ <property name="width_request">100</property>
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1">
+ <property name="width_request">200</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="FillStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AddTextBox1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AddTextBox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="editdrawOLE:MenuOLE">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|editdrawb">F_rame</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="ToggleObjectRotateMode1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="FlipVertical1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="FlipHorizontal2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator111">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="TransformDialog2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="FormatLine3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="FormatArea3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionArrang5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Forward13">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Forward14">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">end</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Backward3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Forward15">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="WrapGroup2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="ObjectAlignLeft4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignCenter4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ObjectAlignRight4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="AlignUp4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignMiddle4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignDown4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="arrangedraOLE:MenuArrange">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|arrangedrawb">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionDrawGrid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="GridVisible2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="GridUse2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridUse</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="HelplinesMove2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesMove</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="third17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="GridDrawOLE:MenuGrid">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|GridDrawB">_Grid</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionView2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator104">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Zoom1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="NormalMultiPaneGUI3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="DiaMode3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="SlideMasterPage3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="viewtOLE:MenuView">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|viewtOLE">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-OLE"/>
+ <class name="context-Frame"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="MasterPageBox">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="VclOptionalBox" id="SectionGraphic4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="RenameMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="CloseMasterView">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="third19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="masterm:MenuMasterPage">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|oleB">_Master Page</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionInsert2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator159">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertGraphic2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertPageField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlideField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="InsertPagesField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlidesField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="InsertAuthorField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertAuthorField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertSymbole3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharmapControl</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="InsertPageTitleField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlideTitleField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="InsertFileField1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertFileField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="InsertDateFieldFix1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertDateFieldFix</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="insertTextm:MenuInsert">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|insertTextm">_Insert</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionDraw2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator160">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Line2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Polygon_Unfilled2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Polygon_Unfilled</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Bezier_Unfilled2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bezier_Unfilled</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ArrowsToolbox2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapes7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="rectangle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.rectangle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="BasicShapes.round-rectangle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.round-rectangle</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ellipse2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.ellipse</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="LineToolbox2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="third22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="drawm:MenuDraw">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|drawm">D_raw</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="third3Ext6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="AnimationEffects1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AnimationEffects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ToggleObjectBezierMode2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionArrang2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator163">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Forward7">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Forward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Forward8">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BringToFront</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">end</property>
+ <property name="vexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Backward5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Backward</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Forward9">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator166">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="WrapGroup4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="ObjectAlignLeft1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignCenter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ObjectAlignRight1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="AlignUp1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignMiddle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="AlignDown1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="arrangedrawm:MenuArrange">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|arrangedrawb">_Arrange</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="thirdExt6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="SectionView4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="horizontal44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparator" id="separator77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vertical44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="first4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Zoom4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Zoom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="second8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="NormalMultiPaneGUI2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NormalMultiPaneGUI</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="DiaMode2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DiaMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="SlideMasterPage2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SlideMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="svtlo-ManagedMenuButton" id="masterviewm:MenuView">
+ <property name="label" translatable="yes" context="notebookbar_groupedbar_full|masterviewm">_View</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">False</property>
+ <property name="halign">start</property>
+ <property name="relief">none</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-MasterPage"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">4</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/notebookbar_groups.ui b/sd/uiconfig/simpress/ui/notebookbar_groups.ui
new file mode 100644
index 000000000..1c9dd7182
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/notebookbar_groups.ui
@@ -0,0 +1,1900 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <requires lib="LibreOffice" version="1.0"/>
+ <!-- interface-local-resource-path ../../../icon-themes/galaxy/cmd/ -->
+ <object class="GtkImage" id="boldi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/sc_bold.png</property>
+ </object>
+ <object class="GtkImage" id="bulletsi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_defaultbullet.png</property>
+ </object>
+ <object class="GtkImage" id="centeri">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/sc_centerpara.png</property>
+ </object>
+ <object class="GtkImage" id="charti">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/sc_insertobjectchart.png</property>
+ </object>
+ <object class="GtkImage" id="growi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/sc_grow.png</property>
+ </object>
+ <object class="GtkImage" id="italicsi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/sc_italic.png</property>
+ </object>
+ <object class="GtkImage" id="layouti">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_assignlayout.png</property>
+ </object>
+ <object class="GtkMenu" id="layoutmenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="layout01">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|layout01">Blank</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="layout02">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|layout02">Title Slide</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="layout03">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|layout03">Title, Text</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="layout04">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|layout04">Title, Content</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="layout05">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|layout05">Centered Text</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkImage" id="lefti">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/sc_leftpara.png</property>
+ </object>
+ <object class="GtkImage" id="linksi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/sc_inserthyperlink.png</property>
+ </object>
+ <object class="GtkMenu" id="linksmenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="hyperlink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:HyperlinkDialog</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|hyperlink">Hyperlink</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="footnote">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertFootnote</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|footnote">Footnote</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="endnote">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertEndnote</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|endnote">Endnote</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="bookmark">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertBookmark</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|bookmark">Bookmark</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="crossreference">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertReferenceField</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|crossreference">Cross-Reference</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkImage" id="masteri">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_slidemasterpage.png</property>
+ </object>
+ <object class="GtkMenu" id="mastermenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="master01">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowsBefore</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|master01">Master 1</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="master02">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:InsertRowsAfter</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|master02">Master 2</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkImage" id="newi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_adddirect.png</property>
+ <property name="pixel_size">24</property>
+ </object>
+ <object class="GtkImage" id="numberingi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_defaultnumbering.png</property>
+ </object>
+ <object class="GtkImage" id="openi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_open.png</property>
+ <property name="pixel_size">24</property>
+ </object>
+ <object class="GtkImage" id="paragraphstylei">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_designerdialog.png</property>
+ </object>
+ <object class="GtkImage" id="pastei">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/32/paste.png</property>
+ <property name="pixel_size">24</property>
+ </object>
+ <object class="GtkImage" id="pdfi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_exportdirecttopdf.png</property>
+ <property name="pixel_size">24</property>
+ </object>
+ <object class="GtkImage" id="printi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_print.png</property>
+ <property name="pixel_size">24</property>
+ </object>
+ <object class="GtkImage" id="redoi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_redo.png</property>
+ <property name="pixel_size">24</property>
+ </object>
+ <object class="GtkImage" id="righti">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/sc_rightpara.png</property>
+ </object>
+ <object class="GtkImage" id="savei">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/32/save.png</property>
+ <property name="pixel_size">32</property>
+ <property name="icon_size">3</property>
+ </object>
+ <object class="GtkImage" id="shrinki">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/sc_shrink.png</property>
+ </object>
+ <object class="GtkImage" id="startshowi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_presentation.png</property>
+ </object>
+ <object class="GtkMenu" id="stylemenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="shapestyledefault">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|shapestyledefault">Default</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="shapestylenofill">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|shapestylenofill">No Fill</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="shapestyleshadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|shapestyleshadow">With Shadow</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="shapestylesep1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="shapestyletitle1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|shapestyletitle1">Title 1</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="shapestyletitle2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|shapestyletitle2">Title 2</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkImage" id="undoi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">cmd/lc_undo.png</property>
+ <property name="pixel_size">24</property>
+ </object>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="NotebookBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin-start">6</property>
+ <property name="margin-end">6</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkBox" id="filegroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">3</property>
+ <property name="margin_bottom">3</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="filegroupbuttons">
+ <property name="height_request">78</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkButton" id="newb">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:AddDirect</property>
+ <property name="image">newi</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always_show_image">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="openb">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:Open</property>
+ <property name="image">openi</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkButton" id="saveb">
+ <property name="width_request">60</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:Save</property>
+ <property name="image">savei</property>
+ <property name="relief">none</property>
+ <property name="image_position">top</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkButton" id="pdfb">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:ExportDirectToPDF</property>
+ <property name="image">pdfi</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always_show_image">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="printb">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:Print</property>
+ <property name="image">printi</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator4">
+ <property name="height_request">2</property>
+ <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>
+ <child>
+ <object class="GtkLabel" id="filegrouplabel">
+ <property name="height_request">15</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|filegrouplabel">File</property>
+ <attributes>
+ <attribute name="font-desc" value="Noto Sans 9"/>
+ <attribute name="style" value="italic"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="clipboardgroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">3</property>
+ <property name="margin_bottom">3</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="clipboardgroupbuttons">
+ <property name="height_request">78</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkButton" id="pasteb">
+ <property name="width_request">60</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="halign">start</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:Paste</property>
+ <property name="image">pastei</property>
+ <property name="relief">none</property>
+ <property name="image_position">top</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkButton" id="redob">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:Redo</property>
+ <property name="image">redoi</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always_show_image">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="undob">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:Undo</property>
+ <property name="image">undoi</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator3">
+ <property name="height_request">2</property>
+ <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>
+ <child>
+ <object class="GtkLabel" id="clipboardgrouplabel">
+ <property name="height_request">15</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|clipboardgrouplabel">Clipboard</property>
+ <attributes>
+ <attribute name="font-desc" value="Noto Sans 9"/>
+ <attribute name="style" value="italic"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="formatgroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">3</property>
+ <property name="margin_bottom">3</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="formatgroupbuttons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkButton" id="shapestyleb:stylemenu">
+ <property name="label" translatable="yes" context="notebookbar_groups|shapestyleb">Style</property>
+ <property name="width_request">70</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:DesignerDialog</property>
+ <property name="image">paragraphstylei</property>
+ <property name="relief">none</property>
+ <property name="image_position">top</property>
+ <property name="always-show-image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box6">
+ <property name="width_request">160</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkBox" id="box14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="font">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkToolButton" id="fontname">
+ <property name="visible">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="is_important">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="fontheight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkToolButton" id="fontsize">
+ <property name="visible">True</property>
+ <property name="is_important">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="fontadjust">
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="grow">
+ <property name="visible">True</property>
+ <property name="is_important">True</property>
+ <property name="action_name">.uno:Grow</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="shrink">
+ <property name="visible">True</property>
+ <property name="is_important">True</property>
+ <property name="action_name">.uno:Shrink</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="growb">
+ <property name="label" translatable="yes" context="notebookbar_groups|growb"> </property>
+ <property name="width_request">35</property>
+ <property name="height_request">30</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:Grow</property>
+ <property name="image">growi</property>
+ <property name="relief">none</property>
+ <property name="image_position">right</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="shrinkb">
+ <property name="label" translatable="yes" context="notebookbar_groups|shrinkb"> </property>
+ <property name="width_request">35</property>
+ <property name="height_request">30</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:Shrink</property>
+ <property name="image">shrinki</property>
+ <property name="relief">none</property>
+ <property name="always_show_image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkButton" id="leftb">
+ <property name="height_request">24</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ <property name="image">lefti</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always-show-image">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="centerb">
+ <property name="height_request">24</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ <property name="image">centeri</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always-show-image">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="rightb">
+ <property name="height_request">24</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ <property name="image">righti</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always-show-image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkButton" id="boldb">
+ <property name="height_request">24</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:Bold</property>
+ <property name="image">boldi</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always-show-image">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="italicsb">
+ <property name="height_request">24</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:Italic</property>
+ <property name="image">italicsi</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always-show-image">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="underlineb">
+ <property name="height_request">24</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:Underline</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="backgroundbox">
+ <property name="height_request">26</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="backgroundcolor">
+ <property name="visible">True</property>
+ <property name="is_important">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="highlightbox">
+ <property name="height_request">26</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="highlight">
+ <property name="visible">True</property>
+ <property name="is_important">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">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">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="colorbox">
+ <property name="height_request">26</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="fontcolor">
+ <property name="visible">True</property>
+ <property name="is_important">True</property>
+ <property name="action_name">.uno:Color</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">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>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box13">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkButton" id="bulletsb">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ <property name="image">bulletsi</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always-show-image">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="numberingb">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ <property name="image">numberingi</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always-show-image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator5">
+ <property name="height_request">2</property>
+ <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>
+ <child>
+ <object class="GtkLabel" id="formatgrouplabel">
+ <property name="height_request">15</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|formatgrouplabel">Text</property>
+ <attributes>
+ <attribute name="font-desc" value="Noto Sans 9"/>
+ <attribute name="style" value="italic"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-ContextVBox" id="ContextContainer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="slidegroup">
+ <property name="can_focus">False</property>
+ <property name="margin_top">3</property>
+ <property name="margin_bottom">3</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="slidegroupbuttons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkButton" id="startshowb">
+ <property name="label" translatable="yes" context="notebookbar_groups|startshowb">Start</property>
+ <property name="width_request">70</property>
+ <property name="height_request">78</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:Presentation</property>
+ <property name="image">startshowi</property>
+ <property name="relief">none</property>
+ <property name="image_position">top</property>
+ <property name="always-show-image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="slidegrid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkButton" id="masterb:mastermenu">
+ <property name="label" translatable="yes" context="notebookbar_groups|masterb">Master</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="image">masteri</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always-show-image">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="layoutb:layoutmenu">
+ <property name="label" translatable="yes" context="notebookbar_groups|layoutb">Layout</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="image">layouti</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always-show-image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="slidegrid3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkButton" id="animationb:animenu">
+ <property name="label" translatable="yes" context="notebookbar_groups|animationb">Animation</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</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="transitionb:transmenu">
+ <property name="label" translatable="yes" context="notebookbar_groups|transitionb">Transition</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator12">
+ <property name="height_request">2</property>
+ <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>
+ <child>
+ <object class="GtkLabel" id="slidegrouplabel">
+ <property name="height_request">15</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|slidegrouplabel">Slide</property>
+ <attributes>
+ <attribute name="font-desc" value="Noto Sans 9"/>
+ <attribute name="style" value="italic"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="insertgroup">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">3</property>
+ <property name="margin_bottom">3</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="insertgroupbuttons">
+ <property name="height_request">78</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="tablebox">
+ <property name="height_request">26</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="tableb">
+ <property name="visible">True</property>
+ <property name="is_important">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="shapesbox">
+ <property name="height_request">26</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="shapesb">
+ <property name="visible">True</property>
+ <property name="is_important">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|shapesb">Shapes</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="linksb:linksmenu">
+ <property name="label" translatable="yes" context="notebookbar_groups|linksb">Links</property>
+ <property name="height_request">26</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="image">linksi</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always-show-image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkButton" id="imageb">
+ <property name="height_request">24</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</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="chartb">
+ <property name="height_request">24</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ <property name="image">charti</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ <property name="always-show-image">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="commentb">
+ <property name="height_request">24</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:InsertAnnotation</property>
+ <property name="relief">none</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator7">
+ <property name="height_request">2</property>
+ <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>
+ <child>
+ <object class="GtkLabel" id="insertgrouplabel">
+ <property name="height_request">15</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|insertgrouplabel">Insert</property>
+ <attributes>
+ <attribute name="font-desc" value="Noto Sans 9"/>
+ <attribute name="style" value="italic"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Text"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="imagegroup">
+ <property name="can_focus">False</property>
+ <property name="margin_top">3</property>
+ <property name="margin_bottom">3</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="imagegroupbuttons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkButton" id="imagestyleb">
+ <property name="label" translatable="yes" context="notebookbar_groups|imagestyleb">Style</property>
+ <property name="height_request">78</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="image">paragraphstylei</property>
+ <property name="relief">none</property>
+ <property name="image_position">top</property>
+ <property name="always-show-image">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="imagegrid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkButton" id="cropb">
+ <property name="height_request">36</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="action_name">.uno:Crop</property>
+ <property name="relief">none</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="resetb">
+ <property name="label" translatable="yes" context="notebookbar_groups|resetb">Reset</property>
+ <property name="height_request">36</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="relief">none</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="imagegrid3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkButton" id="captionb">
+ <property name="height_request">24</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="action_name">.uno:InsertCaptionDialog</property>
+ <property name="relief">none</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="wrapb:wrapmenu">
+ <property name="label" translatable="yes" context="notebookbar_groups|wrapb">Wrap</property>
+ <property name="height_request">24</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="relief">none</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="lockb">
+ <property name="label" translatable="yes" context="notebookbar_groups|lockb">Lock</property>
+ <property name="height_request">24</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="receives_default">True</property>
+ <property name="relief">none</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator13">
+ <property name="height_request">2</property>
+ <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>
+ <child>
+ <object class="GtkLabel" id="imagegrouplabel">
+ <property name="height_request">15</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|imagegrouplabel">Image</property>
+ <attributes>
+ <attribute name="font-desc" value="Noto Sans 9"/>
+ <attribute name="style" value="italic"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Graphic"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <object class="GtkMenu" id="wrapmenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="wrapoff">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapOff</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|wrapoff">None</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="wrapideal">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapIdeal</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|wrapideal">Optimal</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="wrapon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapOn</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|wrapon">Parallel</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="wrapleft">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapLeft</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|wrapleft">Before</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="wrapright">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapRight</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|wrapright">After</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="wrapthrough">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapThrough</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|wrapthrough">Through</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separator14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="wrapcontour">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:WrapContour</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|wrapcontour">Contour</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="contourdialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">.uno:ContourDialog</property>
+ <property name="label" translatable="yes" context="notebookbar_groups|contourdialog">Edit Contour</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/notebookbar_online.ui b/sd/uiconfig/simpress/ui/notebookbar_online.ui
new file mode 100644
index 000000000..223eedce4
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/notebookbar_online.ui
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <requires lib="LibreOffice" version="1.0"/>
+ <!-- interface-local-resource-path ../../../icon-themes/colibre/cmd/ -->
+ <object class="GtkGrid" id="NotebookBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="font">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkToolButton" id="Home-CharFontName">
+ <property name="visible">True</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="fontheight">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin_start">5</property>
+ <child>
+ <object class="GtkToolButton" id="Home-FontHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/notebookbar_single.ui b/sd/uiconfig/simpress/ui/notebookbar_single.ui
new file mode 100644
index 000000000..a51643838
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/notebookbar_single.ui
@@ -0,0 +1,11343 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <requires lib="LibreOffice" version="1.0"/>
+ <object class="GtkMenu" id="Menu Addons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="NotebookBarAddonsMenuMergePoint" id="AddonCommands-Menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">AddonCommand</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="AddonSection-Separator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="Menu-Extension-PackageManagerDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="action_name">service:com.sun.star.deployment.ui.PackageManagerDialog</property>
+ </object>
+ </child>
+ </object>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="NotebookBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-PriorityHBox" id="DefaultBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="sfxlo-DropdownBox" id="ClipboardSection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">5</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Edit-Undo">
+ <property name="visible">True</property>
+ <property name="is_important">True</property>
+ <property name="action_name">.uno:Undo</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Edit-Paste">
+ <property name="visible">True</property>
+ <property name="is_important">True</property>
+ <property name="action_name">.uno:Paste</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-ContextVBox" id="ContextContainer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="DefaultContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom93">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Page">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-InsertPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-AssignLayout">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:AssignLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Page1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-DuplicatePage">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:DuplicateSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-DeletePage">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:DeleteSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-InsertGraphic">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-InsertAVMedia">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertAVMedia</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Insert1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-InsertObjectChart">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <property name="action_name">.uno:InsertObjectChart</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Home-InsertTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-TextBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Text">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-VerticalText">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Line">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Line">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-BasicShapes.rectangle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.rectangle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-BasicShapes.ellipse">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes.ellipse</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-DrawCaption">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DrawCaption</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-LineToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-ArrowsToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowsToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-LineToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ConnectorToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ConnectorToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-BasicShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-BasicShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BasicShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-SymbolShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SymbolShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ArrowShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ArrowShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-StarShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StarShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-CalloutShapes">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:CalloutShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-FlowChartShapes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlowChartShapes</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Home-Objects3DToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Objects3DToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Zoom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-ZoomPrevious">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPrevious</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-ZoomPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Default-Section-Zoom2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-GridVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GridVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-HelplinesVisible">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:HelplinesVisible</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Slideshow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom160">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-Presentation">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Presentation</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Home-Section-Slideshow1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Home-PresentationCurrentSlide">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PresentationCurrentSlide</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Default"/>
+ <class name="context-DrawPage"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="TableContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Paintbrush">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FormatPaintbrush">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetDefaul">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-AutoForma">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Tabl-AutoFormat">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoFormat</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-AreaDialog1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea4">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-BorderDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Line</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FrameLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FrameLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-LineStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Border4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-SetBorderStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetBorderStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-BorderDialog1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TableDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontName">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CharFontName1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FontHeight1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-GrawShrink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-end">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-Grow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Shrink1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-23"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-BoldItalic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-Bold1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Italic1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Underline1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-Strikeout1">
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Shadowed1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-SubSuperScript">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-SubScript">
+ <property name="action_name">.uno:SubScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SuperScript">
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SuperScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-22"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Color1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Spacing1">
+ <property name="action_name">.uno:Spacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-CharBackColor1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-21"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-FontDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-FontDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-BulletNumbering">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-DefaultBullet">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DefaultNumbering">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SetOutline">
+ <property name="action_name">.uno:SetOutline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-IncrementDecrement">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-IncrementIndent1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:IncrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DecrementIndent1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DecrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Para1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-LeftPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-CenterPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-RightPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-JustifyPara1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-20"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Para2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertTop1">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertCenter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertBottom1">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-19"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-LTR">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Spacing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">1</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaspaceIncrease">
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-ParaspaceDecrease">
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-ParagraphDialog1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Tabl-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom52">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-StyleApply1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">27</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-MergeCells1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:MergeCells</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-SplitCell1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SplitCell</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Table-OptimizeTable">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OptimizeTable</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">28</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-AutoFormat">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-AutoFormat">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:AutoFormat</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">29</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Column">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireColumn1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireColumn</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsBefore1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertColumnsAfter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertColumnsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteColumns1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteColumns</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">30</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Row">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-EntireRow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:EntireRow</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsBefore1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsBefore</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-InsertRowsAfter1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertRowsAfter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Table-DeleteRows1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteRows</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">31</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-TableDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-TableDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TableDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">32</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Table-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Table-CharmapControl1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharmapControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">33</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Table"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="GraphicContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Rotate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Flip">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-TransformDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ObjectForwardOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectForwardOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ObjectBackOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectBackOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-StyleApply3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-Crop">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-Crop">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Crop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-SaveReplace">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ChangePicture">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ChangePicture</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-CompressGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CompressGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Graphic-SaveGraphic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveGraphic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">24</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-GraphicFilterToolbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">1</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-GraphicFilterToolbox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GraphicFilterToolbox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">26</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-ColorSettings">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-ColorSettings">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ColorSettings</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">27</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-GrafMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Graphic-GrafMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">28</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Graphic-Section-GrafTransparence">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Graphic-GrafTransparence">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GrafTransparence</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">29</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Graphic"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="DrawContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom108">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom109">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObjec-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom64">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="MultiObject-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Line5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-LineEndStyle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineEndStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Rotate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Flip">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-TransformDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="MultiObject-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="MultiObject-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom111">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ObjectForwardOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectForwardOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom112">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ObjectBackOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectBackOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom113">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-StyleApply3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Combine">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom115">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Combine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Combine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Dismantle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Dismantle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-Merge">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Merge">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Merge</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Substract">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Substract</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-Intersect">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Intersect</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">24</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="MultiObject-Section-DistributeSelection">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-DistributeSelection">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DistributeSelection</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Draw"/>
+ <class name="context-DrawLine"/>
+ <class name="context-MultiObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="MediaContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FillShadow1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Media-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom46">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AVMediaPlayer">
+ <property name="width_request">122</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaPlayer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaPlayer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-TransformDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator34">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Media-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Media-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom80">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-ObjectForwardOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectForwardOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom81">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-ObjectBackOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectBackOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom91">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-StyleApply3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Media-Section-AVMediaToolBox">
+ <property name="width_request">167</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator45">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom76">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AVMediaToolBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AVMediaToolBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Media"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="ObjectContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom67">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom68">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Objec-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatArea1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom66">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-XLineStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-LineWidth">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FormatLine3">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Rotate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom74">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AdvancedMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AdvancedMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ToggleObjectBezierMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectBezierMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Flip">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom75">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-FlipVertical">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipVertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-FlipHorizontal">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FlipHorizontal</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-TransformDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectAlignRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignUp">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignMiddle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-AlignDown">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator89">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Object-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectForwardOne">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectForwardOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom86">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectBackOne">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectBackOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-SendToBack">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom95">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom96">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ReverseOrder">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Object-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator92">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom97">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-StyleApply">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-OLE"/>
+ <class name="context-Frame"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="FormContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator44">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="For-SwitchControlDesignMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SwitchControlDesignMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-UseWizards">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:UseWizards</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ControlProperties">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ControlProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ControlProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Properties">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FormProperties">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormProperties</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ShowFmExplorer">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ShowFmExplorer</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-TabDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-TabDialog">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TabDialog</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Labels">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom28">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-Label">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-Edit">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Edit</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-CheckBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CheckBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-RadioButton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom29">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-RadioButton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RadioButton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-ListBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ListBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-ComboBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ComboBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Pushbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom32">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-Pushbutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Pushbutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-Imagebutton">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Imagebutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-OpenReadOnly">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-OpenReadOnly">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:OpenReadOnly</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-AutoControlFocus">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-AutoControlFocus">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AutoControlFocus</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Form-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignUp4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignMiddle4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignDown4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Media-AlignCenter4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Media-ObjectAlignRight4">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator48">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Form-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectForwardOne3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectForwardOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-ObjectBackOne3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectBackOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-SendToBack3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Object-BeforeObject1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Object-BehindObject1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom31">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder5">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-FormattedField">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom35">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-FormattedField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormattedField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-DateField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DateField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-TimeField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:TimeField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-NumericField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NumericField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-CurrencyField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CurrencyField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-PatternField">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:PatternField</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-GroupBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-GroupBox">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:GroupBox</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-FormattedField1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom38">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-ImageControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ImageControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-FileControl">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FileControl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Form-Section-FormattedField2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom39">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Form-Grid">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grid</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Form-NavigationBar">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:NavigationBar</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Form"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="TextContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Paintbrush">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom51">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-FormatPaintbrush">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatPaintbrush</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-ResetAttributes">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SetDefault</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator65">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-10"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom85">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom87">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FillShadow2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatLine1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-XLineColor2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom47">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Default-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom49">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-FormatLine4">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FontName">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator73">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom40">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-CharFontName">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharFontName</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-23"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FontHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom41">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-FontHeight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FontHeight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-22"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-GrawShrink">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Grow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Grow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Shrink">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:Shrink</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-BoldItalic">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator77">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-Bold">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Bold</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Italic">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Italic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Underline">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Underline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Strikeout">
+ <property name="action_name">.uno:Strikeout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-Shadowed">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Shadowed</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-SubSuperScript">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-SubScript">
+ <property name="action_name">.uno:SubScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-SuperScript">
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SuperScript</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-21"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FontColor">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator78">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom54">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Color">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Color</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-Spacing">
+ <property name="action_name">.uno:Spacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-CharBackColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CharBackColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-20"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-FontDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtTop19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-FontDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FontDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-19"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-BulletNumbering">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom55">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-DefaultBullet">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultBullet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-DefaultNumbering">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DefaultNumbering</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-SetOutline">
+ <property name="action_name">.uno:SetOutline</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-18"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-IncrementDecrement">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom56">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-IncrementIndent">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:IncrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-DecrementIndent">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DecrementIndent</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-17"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Para1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom42">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-LeftPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LeftPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CenterPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CenterPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-RightPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RightPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-JustifyPara">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:JustifyPara</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-16"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Para2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator79">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertTop">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertTop</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertCenter">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CellVertCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-CellVertBottom">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="hexpand">True</property>
+ <property name="action_name">.uno:CellVertBottom</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-15"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-LTR">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-ParaLeftToRight">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaLeftToRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-ParaRightToLeft">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ParaRightToLeft</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-14"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Spacing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-ParaspaceIncrease">
+ <property name="action_name">.uno:ParaspaceIncrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Text-ParaspaceDecrease">
+ <property name="action_name">.uno:ParaspaceDecrease</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="Text-LineSpacing2">
+ <property name="action_name">.uno:LineSpacing</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-13"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom43">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-ParagraphDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:ParagraphDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">23</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator82">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom53">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Text-StyleApply">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">24</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Text-Section-TextBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator69">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom88">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Default-Text1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Text</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="Default-VerticalText1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:VerticalText</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">25</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-Text"/>
+ <class name="context-DrawText"/>
+ <class name="context-TextObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="3DObjectContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Select">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-SelectObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SelectObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ZoomMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ZoomMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom33">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatArea">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatArea</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom70">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FillStyle">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-12"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-FillShadow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom36">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObjec-FillShadow">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FillShadow</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-11"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-AreaDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatArea2">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatArea</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatLine">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:FormatLine</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom58">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-XLineColor">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineColor</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom59">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-XLineStyle1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:XLineStyle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Line4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom60">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin-start">5</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-LineWidth1">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:LineWidth</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-LineDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-FormatLine1">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:FormatLine</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Rotate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom62">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ToggleObjectRotateMode">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ToggleObjectRotateMode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Window3D">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="ExtBottom63">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-Window3D">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:Window3D</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-TransformDialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-TransformDialog">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:TransformDialog</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3DObject-Section-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator30">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-ObjectAlign">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlign</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Align1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignCenter2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignCenter</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ObjectAlignRight2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectAlignRight</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Align2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignUp2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignUp</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignMiddle2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignMiddle</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-AlignDown2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:AlignDown</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">16</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Align23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkMenuToolButton" id="3dObject-ObjectPosition">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectPosition</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">17</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom100">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ObjectForwardOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectForwardOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">18</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom101">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-ObjectBackOne2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ObjectBackOne</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-SendToBack2">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SendToBack</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">19</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom102">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-BeforeObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BeforeObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="3dObject-BehindObject">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:BehindObject</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">20</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Arrange4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom83">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="MultiObject-ReverseOrder3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ReverseOrder</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">21</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="3dObject-Section-Styles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="3dObject-StyleApply3">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:StyleApply</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">22</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-3DObject"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-PriorityMergedHBox" id="MasterPageContainer">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-DrawingLayout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-DrawingLayout">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:DrawingLayout</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Insert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom84">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-InsertMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:InsertMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-DeleteMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DeleteMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-9"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Rename">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Wrap19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-RenameMasterPage">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:RenameMasterPage</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-8"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Dialog">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-PageSetup">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SlideSetup</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-SelectBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator61">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">8</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-SelectBackground">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:SelectBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-7"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-SaveBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Anchor2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-SaveBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:SaveBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-6"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-View">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator57">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="SectionBottom22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">4</property>
+ <property name="margin_bottom">4</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-ViewMenu">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:ViewMenu</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-5"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-DisplayMasterBackground">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Anchor1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-DisplayMasterBackground">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:DisplayMasterBackground</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-4"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-DisplayMasterObjects">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-DisplayMasterObjects">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:DisplayMasterObjects</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-3"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-MasterLayouts">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-MasterLayouts">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:MasterLayouts</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-2"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-PageMode">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Draw23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-PageMode">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">False</property>
+ <property name="action_name">.uno:PageMode</property>
+ <property name="icon_name">sfx2/res/symphony/open_more.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <style>
+ <class name="priority-1"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="VclOptionalBox" id="Master-Section-Close">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkSeparator" id="separator72">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="sfxlo-NotebookbarToolBox" id="Anchor6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="toolbar_style">both-horiz</property>
+ <property name="show_arrow">False</property>
+ <child>
+ <object class="GtkToolButton" id="Master-CloseMasterView">
+ <property name="visible">True</property>
+ <property name="action_name">.uno:CloseMasterView</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <style>
+ <class name="context-MasterPage"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ </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">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/optimpressgeneralpage.ui b/sd/uiconfig/simpress/ui/optimpressgeneralpage.ui
new file mode 100644
index 000000000..2a944eac2
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/optimpressgeneralpage.ui
@@ -0,0 +1,721 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="lower">5</property>
+ <property name="upper">200</property>
+ <property name="value">5</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">5</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment3">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment4">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment5">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <!-- n-columns=2 n-rows=4 -->
+ <object class="GtkGrid" id="OptSavePage">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="border-width">6</property>
+ <property name="row-spacing">12</property>
+ <property name="column-spacing">24</property>
+ <child>
+ <object class="GtkFrame" id="newdocumentframe">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="hexpand">True</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkCheckButton" id="startwithwizard">
+ <property name="label" translatable="yes" context="optimpressgeneralpage|startwithwizard">Start with _Template Selection</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="startwithwizard-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|startwithwizard">Specifies whether to activate the Select a Template window when opening a presentation with File - New - Presentation.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="newdoclbl">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="optimpressgeneralpage|newdoclbl">New Document</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="presentationframe">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=2 -->
+ <object class="GtkGrid" id="grid5">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="hexpand">True</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkCheckButton" id="enprsntcons">
+ <property name="label" translatable="yes" context="optimpressgeneralpage|enprsntcons">Enable Presenter Console</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="enprsntcons-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|enprsntcons">Specifies that you want to enable the Presenter Console during slideshows.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="enremotcont">
+ <property name="label" translatable="yes" context="optimpressgeneralpage|enremotcont">Enable remote control</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="enremotcont-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|enremotcont">Specifies that you want to enable Bluetooth remote control while Impress is running.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="optimpressgeneralpage|label7">Presentation</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=2 -->
+ <object class="GtkGrid" id="grid6">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkCheckButton" id="printermetrics">
+ <property name="label" translatable="yes" context="optimpressgeneralpage|printermetrics">Us_e printer metrics for document formatting</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="printermetrics-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|printermetrics">Specifies that printer metrics are applied for printing and also for formatting the display on the screen. If this box is not checked, a printer independent layout will be used for screen display and printing.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="cbCompatibility">
+ <property name="label" translatable="yes" context="optimpressgeneralpage|cbCompatibility">Add _spacing between paragraphs and tables</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="cbCompatibility-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|cbCompatibility">Specifies that Impress calculates the paragraph spacing exactly like Microsoft PowerPoint.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="optimpressgeneralpage|label1">Compatibility</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">3</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame4">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=6 -->
+ <object class="GtkGrid" id="grid3">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="hexpand">True</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkCheckButton" id="copywhenmove">
+ <property name="label" translatable="yes" context="optimpressgeneralpage|copywhenmove">Copy when moving</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="copywhenmove-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|copywhenmove">If enabled, a copy is created when you move an object while holding down the Ctrl key.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=2 n-rows=1 -->
+ <object class="GtkGrid" id="grid4">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="optimpressgeneralpage|label6">Unit of _measurement:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">units</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="units">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="units-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|units">Determines the Unit of measurement for presentations.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=2 n-rows=1 -->
+ <object class="GtkGrid" id="grid8">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="tapstoplabel">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="optimpressgeneralpage|tapstoplabel">Ta_b stops:</property>
+ <property name="use-underline">True</property>
+ <property name="justify">fill</property>
+ <property name="mnemonic-widget">metricFields</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="GtkSpinButton" id="metricFields">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="activates-default">True</property>
+ <property name="text">5,00</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="digits">2</property>
+ <property name="value">5</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="metricFields-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|metricFields">Defines the spacing between tab stops.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="objalwymov">
+ <property name="label" translatable="yes" context="optimpressgeneralpage|objalwymov">Objects always moveable</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="objalwymov-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|objalwymov">Specifies that you want to move an object with the Rotate tool enabled. If Objects always moveable is not marked, the Rotate tool can only be used to rotate an object.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="distortcb">
+ <property name="label" translatable="yes" context="optimpressgeneralpage|distortcb">Do not distort objects in curve</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="backgroundback">
+ <property name="label" translatable="yes" context="optimpressgeneralpage|backgroundback">Use background cache</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="backgroundback-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|backgroundback">Specifies whether to use the cache for displaying objects on the master slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-bottom">3</property>
+ <property name="label" translatable="yes" context="optimpressgeneralpage|label4">Settings</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ <property name="height">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=2 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkCheckButton" id="qickedit">
+ <property name="label" translatable="yes" context="optimpressgeneralpage|qickedit">Allow quick editing</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="qickedit-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|qickedit">If on, you can edit text immediately after clicking a text object. If off, you must double-click to edit text.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="textselected">
+ <property name="label" translatable="yes" context="optimpressgeneralpage|textselected">Only text area selectable</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="textselected-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|textselected">Specifies whether to select a text box by clicking the text.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="optimpressgeneralpage|label2">Text Objects</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="scaleframe">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=4 n-rows=3 -->
+ <object class="GtkGrid" id="grid7">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-end">3</property>
+ <property name="label" translatable="yes" context="optimpressgeneralpage|label8">_Drawing scale:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">scaleBox</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="widthlbl">
+ <property name="can-focus">False</property>
+ <property name="no-show-all">True</property>
+ <property name="label" translatable="yes" context="optimpressgeneralpage|widthlbl">Page _width:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">metricWidthFields</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="heightlbl">
+ <property name="can-focus">False</property>
+ <property name="no-show-all">True</property>
+ <property name="label" translatable="yes" context="optimpressgeneralpage|heightlbl">Page _height:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">metricHeightFields</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left-attach">2</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="metricWidthFields">
+ <property name="can-focus">True</property>
+ <property name="no-show-all">True</property>
+ <property name="activates-default">True</property>
+ <property name="text">0,00</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment2</property>
+ <property name="digits">2</property>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="metricHeightFields">
+ <property name="can-focus">True</property>
+ <property name="no-show-all">True</property>
+ <property name="activates-default">True</property>
+ <property name="text">0,00</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment4</property>
+ <property name="digits">2</property>
+ </object>
+ <packing>
+ <property name="left-attach">3</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="info1">
+ <property name="can-focus">False</property>
+ <property name="no-show-all">True</property>
+ <property name="label">info1</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">metricInfo1Fields</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="GtkSpinButton" id="metricInfo1Fields">
+ <property name="can-focus">True</property>
+ <property name="no-show-all">True</property>
+ <property name="activates-default">True</property>
+ <property name="text">0</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment3</property>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="info2">
+ <property name="can-focus">False</property>
+ <property name="no-show-all">True</property>
+ <property name="label">info2</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">metricInfo2Fields</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left-attach">2</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="metricInfo2Fields">
+ <property name="can-focus">True</property>
+ <property name="no-show-all">True</property>
+ <property name="activates-default">True</property>
+ <property name="text">0</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment5</property>
+ </object>
+ <packing>
+ <property name="left-attach">3</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="scaleBox">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="has-entry">True</property>
+ <child internal-child="entry">
+ <object class="GtkEntry">
+ <property name="can-focus">False</property>
+ <property name="truncate-multiline">True</property>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="scaleBox-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|scaleBox">Determines the drawing scale on the status bar.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="optimpressgeneralpage|label5">Scale</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="OptSavePage-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|OptSavePage">Defines the general options for drawing or presentation documents.</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroupLabel">
+ <widgets>
+ <widget name="label6"/>
+ <widget name="tapstoplabel"/>
+ </widgets>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroupWidget">
+ <widgets>
+ <widget name="units"/>
+ <widget name="metricFields"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/pagesfieldbox.ui b/sd/uiconfig/simpress/ui/pagesfieldbox.ui
new file mode 100644
index 000000000..2c96026fc
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/pagesfieldbox.ui
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkBox" id="PagesFieldBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkSpinButton" id="pagesfield">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="truncate-multiline">True</property>
+ <property name="digits">2</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/photoalbum.ui b/sd/uiconfig/simpress/ui/photoalbum.ui
new file mode 100644
index 000000000..9ce85e566
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/photoalbum.ui
@@ -0,0 +1,416 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.4 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkTreeStore" id="liststore1">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkDialog" id="PhotoAlbumCreatorDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="photoalbum|PhotoAlbumCreatorDialog">Create Photo Album</property>
+ <property name="modal">True</property>
+ <property name="window_position">center</property>
+ <property name="default_width">0</property>
+ <property name="default_height">0</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ <property name="secondary">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label" translatable="yes" context="photoalbum|create_btn">Insert Slides</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>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="cancel">
+ <property name="label" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">6</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="images_tree">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore1</property>
+ <property name="headers_visible">False</property>
+ <property name="headers_clickable">False</property>
+ <property name="search_column">0</property>
+ <property name="show_expanders">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeview-selection1"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn1">
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox" id="buttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <property name="layout_style">start</property>
+ <child>
+ <object class="GtkButton" id="add_btn">
+ <property name="label" translatable="yes" context="stock">_Add</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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="rem_btn">
+ <property name="label" translatable="yes" context="stock">_Remove</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes" context="photoalbum|rem_btn|tooltip_text">Remove Image from List</property>
+ <property name="use-underline">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="up_btn">
+ <property name="label" translatable="yes" context="photoalbum|up_btn">_Up</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes" context="photoalbum|up_btn|tooltip_text">Move Image Up</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="down_btn">
+ <property name="label" translatable="yes" context="photoalbum|down_btn">Do_wn</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes" context="photoalbum|down_btn|tooltip_text">Move Image Down</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkDrawingArea" id="preview_img">
+ <property name="width_request">200</property>
+ <property name="height_request">150</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_bottom">6</property>
+ <property name="label" translatable="yes" context="photoalbum|label2">Preview</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkBox" id="box6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="photoalbum|label7">Slide layout:</property>
+ <property name="mnemonic_widget">opt_combo</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="opt_combo">
+ <property name="width_request">160</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="active">0</property>
+ <items>
+ <item translatable="yes" context="photoalbum|liststore2">1 Image</item>
+ <item translatable="yes" context="photoalbum|liststore2">2 Images</item>
+ <item translatable="yes" context="photoalbum|liststore2">4 Images</item>
+ </items>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="cap_check">
+ <property name="label" translatable="yes" context="photoalbum|cap_check">Add caption to each slide</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="asr_check">
+ <property name="label" translatable="yes" context="photoalbum|asr_check">Keep aspect ratio</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="asr_check_crop">
+ <property name="label" translatable="yes" context="photoalbum|asr_check_crop">Fill Screen</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="insert_as_link_check">
+ <property name="label" translatable="yes" context="photoalbum|insert_as_link_check">Link images</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </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="-11">help</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ </action-widgets>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/presentationdialog.ui b/sd/uiconfig/simpress/ui/presentationdialog.ui
new file mode 100644
index 000000000..1cfb4fcb8
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/presentationdialog.ui
@@ -0,0 +1,722 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">86400000</property>
+ <property name="step_increment">1000</property>
+ <property name="page_increment">60000</property>
+ </object>
+ <object class="GtkDialog" id="PresentationDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="presentationdialog|PresentationDialog">Slide Show Settings</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</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="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">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" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use-underline">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">1</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkRadioButton" id="from">
+ <property name="label" translatable="yes" context="presentationdialog|from">_From:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">allslides</property>
+ <accessibility>
+ <relation type="label-for" target="from_cb"/>
+ </accessibility>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="from-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|from">Enter the number of the start slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="from_cb">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <accessibility>
+ <relation type="labelled-by" target="from"/>
+ </accessibility>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="from_cb-atkobject">
+ <property name="AtkObject::accessible-name" translatable="yes" context="presentationdialog|from_cb-atkobject">Starting slide</property>
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|from_cb">Enter the number of the start slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="allslides">
+ <property name="label" translatable="yes" context="presentationdialog|allslides">All _slides</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="allslides-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|allslides">Includes all of the slides in your slide show.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkRadioButton" id="customslideshow">
+ <property name="label" translatable="yes" context="presentationdialog|customslideshow">_Custom slide show:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">allslides</property>
+ <accessibility>
+ <relation type="label-for" target="customslideshow_cb"/>
+ </accessibility>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="customslideshow-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|customslideshow">Runs a custom slide show in the order that you defined in Slide Show - Custom Slide Show.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="customslideshow_cb">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <accessibility>
+ <relation type="labelled-by" target="customslideshow"/>
+ </accessibility>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="customslideshow_cb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|customslideshow_cb">Runs a custom slide show in the order that you defined in Slide Show - Custom Slide Show.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="presentationdialog|label1">Range</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="frame3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkComboBoxText" id="presdisplay_cb">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="presdisplay_cb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|presdisplay_cb">Select a display to use for full screen slide show mode.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="presdisplay_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="presentationdialog|presdisplay_label">P_resentation display:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">presdisplay_cb</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid9">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="externalmonitor_str">
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="presentationdialog|externalmonitor_str">Display %1 (external)</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="monitor_str">
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="presentationdialog|monitor_str">Display %1</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="allmonitors_str">
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="presentationdialog|allmonitors_str">All displays</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="external_str">
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="presentationdialog|external_str">Auto External (Display %1)</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="presentationdialog|label3">Multiple Displays</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>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkRadioButton" id="default">
+ <property name="label" translatable="yes" context="presentationdialog|default">F_ull screen</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="default-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|default">A full screen slide is shown.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="window">
+ <property name="label" translatable="yes" context="presentationdialog|window">In a _window</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">default</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="window-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|window">Slide show runs in the Impress program window.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="auto">
+ <property name="label" translatable="yes" context="presentationdialog|auto">_Loop and repeat after:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">default</property>
+ <accessibility>
+ <relation type="label-for" target="pauseduration"/>
+ </accessibility>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="auto-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|auto">Restarts the slide show after the pause interval you specify. A pause slide is displayed between the final slide and the start slide. Press the Esc key to stop the show.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="showlogo">
+ <property name="label" translatable="yes" context="presentationdialog|showlogo">Show _logo</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="margin-start">12</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="showlogo-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|showlogo">Displays the application logo on the pause slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="pauseduration">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes" context="presentationdialog|pauseduration|tooltip_text">Duration of pause</property>
+ <property name="margin-start">12</property>
+ <property name="activates_default">True</property>
+ <property name="adjustment">adjustment1</property>
+ <accessibility>
+ <relation type="labelled-by" target="auto"/>
+ </accessibility>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="pauseduration-atkobject">
+ <property name="AtkObject::accessible-name" translatable="yes" context="presentationdialog|pauseduration-atkobject">Pause Duration</property>
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|pauseduration">Enter the duration of the pause before the slide show is repeated. If you enter zero, the show restarts immediately without showing a pause slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="presentationdialog|label2">Presentation Mode</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="frame4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkCheckButton" id="manualslides">
+ <property name="label" translatable="yes" context="presentationdialog|manualslides">Change slides _manually</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="manualslides-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|manualslides">Slides never change automatically when this box is selected.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="pointervisible">
+ <property name="label" translatable="yes" context="presentationdialog|pointervisible">Mouse pointer _visible</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="pointervisible-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|pointervisible">Shows the mouse pointer during a slide show.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="pointeraspen">
+ <property name="label" translatable="yes" context="presentationdialog|pointeraspen">Mouse pointer as _pen</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="pointeraspen-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|pointeraspen">Changes the mouse pointer to a pen which you can use to draw on slides during the presentation.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="animationsallowed">
+ <property name="label" translatable="yes" context="presentationdialog|animationsallowed">_Animations allowed</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="animationsallowed-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|animationsallowed">Displays all frames of animated GIF files during the slide show.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="changeslidesbyclick">
+ <property name="label" translatable="yes" context="presentationdialog|changeslidesbyclick">Change slides by clic_king on background</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="changeslidesbyclick-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|changeslidesbyclick">Advances to the next slide when you click on the background of a slide.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="alwaysontop">
+ <property name="label" translatable="yes" context="presentationdialog|alwaysontop">Presentation always _on top</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="alwaysontop-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|alwaysontop">The Impress window remains on top during the presentation. No other program will show its window in front of your presentation.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="presentationdialog|label4">Options</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </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>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="PresentationDialog-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="presentationdialog|extended_tip|PresentationDialog">Defines settings for your slide show, including which slide to start from, the way you advance the slides, the type of presentation, and pointer options.</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroupLabel1">
+ <widgets>
+ <widget name="from"/>
+ <widget name="allslides"/>
+ <widget name="customslideshow"/>
+ <widget name="presdisplay_label"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/prntopts.ui b/sd/uiconfig/simpress/ui/prntopts.ui
new file mode 100644
index 000000000..983b90e9a
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/prntopts.ui
@@ -0,0 +1,556 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkBox" id="prntopts">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="border-width">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkBox" id="prntandpgoptbox">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="spacing">24</property>
+ <child>
+ <object class="GtkFrame" id="frame3">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=6 -->
+ <object class="GtkGrid" id="grid3">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkRadioButton" id="pagedefaultrb">
+ <property name="label" translatable="yes" context="prntopts|pagedefaultrb">Default</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="active">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="pagedefaultrb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|pagedefaultrb">Specifies that you do not want to further scale pages when printing.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="fittopgrb">
+ <property name="label" translatable="yes" context="prntopts|fittopgrb">_Fit to page</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">pagedefaultrb</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="fittopgrb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|fittopgrb">Specifies whether to scale down objects that are beyond the margins of the current printer, so that they fit on the paper in the printer.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="tilepgrb">
+ <property name="label" translatable="yes" context="prntopts|tilepgrb">_Tile pages</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">pagedefaultrb</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="tilepgrb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|tilepgrb">Specifies that pages are to be printed in tiled format. If the pages or slides are smaller than the paper, several pages or slides will be printed on one page of paper.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="papertryfrmprntrcb">
+ <property name="label" translatable="yes" context="prntopts|papertryfrmprntrcb">Paper tray from printer s_ettings</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="papertryfrmprntrcb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|papertryfrmprntrcb">Determines that the paper tray to be used is the one defined in the printer setup.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="brouchrb">
+ <property name="label" translatable="yes" context="prntopts|brouchrb">B_rochure</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">pagedefaultrb</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="brouchrb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|brouchrb">Select the Brochure option to print the document in brochure format.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">18</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCheckButton" id="frontcb">
+ <property name="label" translatable="yes" context="prntopts|frontcb">Fr_ont</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <accessibility>
+ <relation type="labelled-by" target="brouchrb"/>
+ </accessibility>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="frontcb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|frontcb">Select Front to print the front of a brochure.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="backcb">
+ <property name="label" translatable="yes" context="prntopts|backcb">Ba_ck</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <accessibility>
+ <relation type="labelled-by" target="brouchrb"/>
+ </accessibility>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="backcb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|backcb">Select Back to print the back of a brochure.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="prntopts|label3">Page Options</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="printframe">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=4 -->
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkCheckButton" id="pagenmcb">
+ <property name="label" translatable="yes" context="prntopts|pagenmcb">_Page name</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="pagenmcb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|pagenmcb">Specifies whether to print the page name.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="datecb">
+ <property name="label" translatable="yes" context="prntopts|datecb">D_ate</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="datecb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|datecb">Specifies whether to print the current date.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="timecb">
+ <property name="label" translatable="yes" context="prntopts|timecb">Ti_me</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="timecb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|timecb">Specifies whether to print the current time.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="hiddenpgcb">
+ <property name="label" translatable="yes" context="prntopts|hiddenpgcb">H_idden pages</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="hiddenpgcb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|hiddenpgcb">Specifies whether to print the pages that are hidden from the presentation.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="printlbl">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="prntopts|printlbl">Print</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="spacing">24</property>
+ <child>
+ <object class="GtkFrame" id="qualityframe">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=3 -->
+ <object class="GtkGrid" id="grid4">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="row-spacing">6</property>
+ <child>
+ <object class="GtkRadioButton" id="defaultrb">
+ <property name="label" translatable="yes" context="prntopts|defaultrb">Default</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="active">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="defaultrb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|defaultrb">Specifies that you want to print in original colors.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="grayscalerb">
+ <property name="label" translatable="yes" context="prntopts|grayscalerb">Gra_yscale</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">defaultrb</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="grayscalerb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|grayscalerb">Specifies that you want to print colors as grayscale.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="blackwhiterb">
+ <property name="label" translatable="yes" context="prntopts|blackwhiterb">Black &amp; _white</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">defaultrb</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="blackwhiterb-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|blackwhiterb">Specifies that you want to print the document in black and white.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="prntopts|label2">Quality</property>
+ <property name="use-underline">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="contentframe">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=4 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="row-spacing">6</property>
+ <child>
+ <object class="GtkCheckButton" id="drawingcb">
+ <property name="label" translatable="yes" context="prntopts|drawingcb">Drawing</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="notecb">
+ <property name="label" translatable="yes" context="prntopts|notecb">Notes</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="handoutcb">
+ <property name="label" translatable="yes" context="prntopts|handoutcb">Handouts</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="outlinecb">
+ <property name="label" translatable="yes" context="prntopts|outlinecb">Outline</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="halign">start</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="contentlbl">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="prntopts|contentlbl">Content</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="prntopts-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|prntopts">Specifies print settings within a drawing or presentation document.</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroup1">
+ <property name="ignore-hidden">True</property>
+ <widgets>
+ <widget name="printframe"/>
+ <widget name="contentframe"/>
+ </widgets>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroup2">
+ <widgets>
+ <widget name="frame3"/>
+ <widget name="qualityframe"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/publishingdialog.ui b/sd/uiconfig/simpress/ui/publishingdialog.ui
new file mode 100644
index 000000000..7166d6e8a
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/publishingdialog.ui
@@ -0,0 +1,1831 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">86400000</property>
+ <property name="step_increment">1000</property>
+ <property name="page_increment">60000</property>
+ </object>
+ <object class="GtkTreeStore" id="liststore2">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkDialog" id="PublishingDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="publishingdialog|PublishingDialog">HTML Export</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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="lastPageButton">
+ <property name="label" translatable="yes" context="publishingdialog|lastPageButton">&lt; Back</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="finishButton">
+ <property name="label" translatable="yes" context="publishingdialog|finishButton">_Create</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="finishButton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|finishButton">Creates new documents according to your selections and saves the documents.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="nextPageButton">
+ <property name="label" translatable="yes" context="publishingdialog|nextPageButton">Ne_xt &gt;</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_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="page1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkRadioButton" id="newDesignRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|newDesignRadiobutton">New _design</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="newDesignRadiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|newDesignRadiobutton">Creates a new design in the next pages of the Wizard.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="oldDesignRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|oldDesignRadiobutton">Existing design</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">newDesignRadiobutton</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="oldDesignRadiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|oldDesignRadiobutton">Loads an existing design from the design list to use as a starting point for the steps to follow on the next pages of the Wizard.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="designsTreeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore2</property>
+ <property name="headers_visible">False</property>
+ <property name="headers_clickable">False</property>
+ <property name="search_column">0</property>
+ <property name="show_expanders">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeview-selection2"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn2">
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="designsTreeview-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|designsTreeview">Displays all existing designs.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="descLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="publishingdialog|descLabel">Select an existing design or create a new one</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">designsTreeview</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="delDesingButton">
+ <property name="label" translatable="yes" context="publishingdialog|delDesingButton">Delete Selected Design</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">end</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="delDesingButton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|delDesingButton">Deletes the selected design from the design list.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="assignLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="publishingdialog|assignLabel">Assign Design</property>
+ <property name="yalign">0.5</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="page1-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|page1">Determines the settings for publishing Draw or Impress documents in HTML format.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="page2">
+ <property name="height_request">295</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="column_spacing">24</property>
+ <child>
+ <object class="GtkFrame" id="page2.4">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkRadioButton" id="ASPRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|ASPRadiobutton">_Active Server Pages (ASP)</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="ASPRadiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|ASPRadiobutton">When you select the ASP option, the WebCast export creates ASP pages. Note that the HTML presentation can only be offered by a web server supporting ASP.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="perlRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|perlRadiobutton">Perl</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">ASPRadiobutton</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="perlRadiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|perlRadiobutton">Used by WebCast export to create HTML pages and Perl scripts.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-start">24</property>
+ <child>
+ <object class="GtkLabel" id="indexTxtLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="valign">start</property>
+ <property name="label" translatable="yes" context="publishingdialog|indexTxtLabel">_URL for listeners:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">indexEntry</property>
+ <property name="xalign">0.5</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="indexEntry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="activates_default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="indexEntry-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|indexEntry">Specifies the URL (absolute or relative) to be entered by the viewer in order to see the presentation.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="URLTxtLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="publishingdialog|URLTxtLabel">URL for _presentation:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">URLEntry</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="URLEntry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="activates_default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="URLEntry-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|URLEntry">Specifies the URL (absolute or relative), where the created HTML presentation on the web server has been saved.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="CGITxtLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="publishingdialog|CGITxtLabel">URL for _Perl scripts:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">CGIEntry</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="CGIEntry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="activates_default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="CGIEntry-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|CGIEntry">Specifies the URL (absolute or relative) for the generated Perl scripts.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="webCastLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="publishingdialog|webCastLabel">Webcast</property>
+ <property name="xalign">0.5</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="page2.3">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkRadioButton" id="chgDefaultRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|chgDefaultRadiobutton">_As stated in document</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="chgDefaultRadiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|chgDefaultRadiobutton">The slide transition depends on the timing that you set for each slide in the presentation. If you set a manual page transition, the HTML presentation introduces a new page by pressing any key from your keyboard.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="chgAutoRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|chgAutoRadiobutton">_Automatic</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">chgDefaultRadiobutton</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="chgAutoRadiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|chgAutoRadiobutton">The page transition takes place automatically after the specified period of time elapses and does not depend on the presentation's contents</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">24</property>
+ <child>
+ <object class="GtkBox" id="box12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="durationTxtLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="publishingdialog|durationTxtLabel">_Slide view time:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">durationSpinbutton</property>
+ <property name="xalign">0.5</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="durationSpinbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="activates_default">True</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="durationSpinbutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|durationSpinbutton">Defines the amount of time for each slide display.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="endlessCheckbutton">
+ <property name="label" translatable="yes" context="publishingdialog|endlessCheckbutton">_Endless</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="endlessCheckbutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|endlessCheckbutton">Automatically restarts the HTML presentation after the last slide has been displayed.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="kioskLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="publishingdialog|kioskLabel">Advance Slides</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="page2.2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkCheckButton" id="contentCheckbutton">
+ <property name="label" translatable="yes" context="publishingdialog|contentCheckbutton">Create title page</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="contentCheckbutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|contentCheckbutton">Creates a title page for your document.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="notesCheckbutton">
+ <property name="label" translatable="yes" context="publishingdialog|notesCheckbutton">Show notes</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="notesCheckbutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|notesCheckbutton">Specifies that your notes are also displayed.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="htmlOptionsLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="publishingdialog|htmlOptionsLabel">Options</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="page2.1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">6</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkBox" id="box6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkImage" id="standardFBImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">sd/res/pubdes.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="framesFBImage">
+ <property name="can_focus">False</property>
+ <property name="icon_name">sd/res/pubdes2.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="kioskFBImage">
+ <property name="can_focus">False</property>
+ <property name="icon_name">sd/res/pubdes3.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="webCastFBImage">
+ <property name="can_focus">False</property>
+ <property name="icon_name">sd/res/pubdes4.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="webCastRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|webCastRadiobutton">_WebCast</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">standardRadiobutton</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="webCastRadiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|webCastRadiobutton">In a WebCast export, automatic scripts will be generated with Perl or ASP support.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="kioskRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|kioskRadiobutton">_Automatic</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">standardRadiobutton</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="kioskRadiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|kioskRadiobutton">Creates a default HTML presentation as a kiosk export, in which the slides are automatically advanced after a specified amount of time.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="singleDocumentRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|singleDocumentRadiobutton">_Single-document HTML</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">standardRadiobutton</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="framesRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|framesRadiobutton">Standard HTML with _frames</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">standardRadiobutton</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="framesRadiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|framesRadiobutton">Creates standard HTML pages with frames. The exported page will be placed in the main frame, and the frame to the left will display a table of contents in the form of hyperlinks.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="standardRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|standardRadiobutton">Standard H_TML format</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="standardRadiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|standardRadiobutton">Creates standard HTML pages from export pages.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="publicationLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="publishingdialog|publicationLabel">Publication Type</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>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="page3">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkBox" id="box16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">24</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkFrame" id="frame6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="margin-end">6</property>
+ <property name="margin-bottom">6</property>
+ <child>
+ <object class="GtkRadioButton" id="pngRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|pngRadiobutton">_PNG</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="pngRadiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|pngRadiobutton">The files are exported as PNG files. PNG files are compressed without loss of data, and can contain more than 256 colors.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="gifRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|gifRadiobutton">_GIF</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">pngRadiobutton</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="gifRadiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|gifRadiobutton">The files are exported as GIF files. GIF files are compressed without loss of data, and have a maximum of 256 colors.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="jpgRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|jpgRadiobutton">_JPG</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">pngRadiobutton</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="jpgRadiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|jpgRadiobutton">The files are exported as JPEG files. JPEG files are compressed, with adjustable compression and can contain more than 256 colors.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">10</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="qualityTxtLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="publishingdialog|qualityTxtLabel">_Quality:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">qualityCombobox</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="qualityCombobox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="has_entry">True</property>
+ <child internal-child="entry">
+ <object class="GtkEntry" id="combobox-entry">
+ <property name="can_focus">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="activates_default">True</property>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="qualityCombobox-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|qualityCombobox">Specifies the compression factor of the JPEG graphic. A 100% value offers the best quality for a large data range. The 25% factor indicates small files with inferior image quality.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="saveImgAsLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="publishingdialog|saveImgAsLabel">Save Images As</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkRadioButton" id="resolution1Radiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|resolution1Radiobutton">Low (_640 × 480 pixels)</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="resolution1Radiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|resolution1Radiobutton">Select the low resolution to keep the file size small, even for presentations with many slides.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="resolution2Radiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|resolution2Radiobutton">Medium (_800 × 600 pixels)</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">resolution1Radiobutton</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="resolution2Radiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|resolution2Radiobutton">Select the medium resolution for a medium-sized presentation.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="resolution3Radiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|resolution3Radiobutton">High (_1024 × 768 pixels)</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">resolution1Radiobutton</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="resolution3Radiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|resolution3Radiobutton">Select a high resolution for a high quality slide display.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="resolution4Radiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|resolution4Radiobutton">Full HD (1_920 × 1080 pixels)</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">resolution1Radiobutton</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="resolution4Radiobutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|resolution4Radiobutton">Select a full HD resolution for a very high-quality slide display.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="monitorResolutionLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="publishingdialog|monitorResolutionLabel">Monitor Resolution</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkCheckButton" id="sldSoundCheckbutton">
+ <property name="label" translatable="yes" context="publishingdialog|sldSoundCheckbutton">_Export sounds when slide advances</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="sldSoundCheckbutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|sldSoundCheckbutton">Specifies that the sound files that are defined as an effect for slide transitions are exported.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="hiddenSlidesCheckbutton">
+ <property name="label" translatable="yes" context="publishingdialog|hiddenSlidesCheckbutton">Export _hidden slides</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="effectsLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="publishingdialog|effectsLabel">Effects</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="page4">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkLabel" id="authorTxtLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="publishingdialog|authorTxtLabel">_Author:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">authorEntry</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="authorEntry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="authorEntry-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|authorEntry">Specifies the name of the publication's author.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="emailTxtLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="publishingdialog|emailTxtLabel">E-_mail address:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">emailEntry</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="wwwTxtLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" context="publishingdialog|wwwTxtLabel">Your hom_epage:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">wwwEntry</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="addInformLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="valign">start</property>
+ <property name="label" translatable="yes" context="publishingdialog|addInformLabel">Additional _information:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">miscTextview</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="emailEntry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="emailEntry-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|emailEntry">Specifies the email address.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="wwwEntry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="activates_default">True</property>
+ <property name="truncate-multiline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="wwwEntry-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|wwwEntry">Specifies your homepage. A hyperlink will be inserted in the publication.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="downloadCheckbutton">
+ <property name="label" translatable="yes" context="publishingdialog|downloadCheckbutton">Link to a copy of the _original presentation</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="downloadCheckbutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|downloadCheckbutton">Inserts a hyperlink to download a copy of the presentation file.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTextView" id="miscTextview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="miscTextview-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|miscTextview">Specifies additional text to appear on the title page.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="infTitlePageLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="publishingdialog|infTitlePageLabel">Information for the Title Page</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="page5">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkCheckButton" id="textOnlyCheckbutton">
+ <property name="label" translatable="yes" context="publishingdialog|textOnlyCheckbutton">_Text only</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="textOnlyCheckbutton-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="publishingdialog|extended_tip|textOnlyCheckbutton">Inserts only text hyperlinks instead of buttons.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="buttonsDrawingareawin">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkDrawingArea" id="buttonsDrawingarea">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="buttonStyleLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="publishingdialog|buttonStyleLabel">Select Button Style</property>
+ <property name="xalign">0.5</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="page6">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkRadioButton" id="docColorsRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|docColorsRadiobutton">_Apply color scheme from document</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="defaultRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|defaultRadiobutton">Use _browser colors</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">docColorsRadiobutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="userRadiobutton">
+ <property name="label" translatable="yes" context="publishingdialog|userRadiobutton">_Use custom color scheme</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">docColorsRadiobutton</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="spacing">12</property>
+ <property name="margin-start">12</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkButton" id="vLinkButton">
+ <property name="label" translatable="yes" context="publishingdialog|vLinkButton">_Visited Link</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="aLinkButton">
+ <property name="label" translatable="yes" context="publishingdialog|aLinkButton">Active Li_nk</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="linkButton">
+ <property name="label" translatable="yes" context="publishingdialog|linkButton">Hyper_link</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="textButton">
+ <property name="label" translatable="yes" context="publishingdialog|textButton">Text</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkDrawingArea" id="previewDrawingarea">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="backButton">
+ <property name="label" translatable="yes" context="publishingdialog|backButton">Bac_kground</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="valign">start</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="selectColorLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="publishingdialog|selectColorLabel">Select Color Scheme</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-11">help</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ <action-widget response="101">lastPageButton</action-widget>
+ <action-widget response="103">finishButton</action-widget>
+ <action-widget response="102">nextPageButton</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroup1">
+ <property name="mode">both</property>
+ <widgets>
+ <widget name="page1"/>
+ <widget name="page2"/>
+ <widget name="page3"/>
+ <widget name="page4"/>
+ <widget name="page5"/>
+ <widget name="page6"/>
+ </widgets>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroup2">
+ <property name="mode">both</property>
+ <widgets>
+ <widget name="page2.4"/>
+ <widget name="page2.3"/>
+ <widget name="page2.2"/>
+ <widget name="page2.1"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/remotedialog.ui b/sd/uiconfig/simpress/ui/remotedialog.ui
new file mode 100644
index 000000000..aefd7f447
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/remotedialog.ui
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="RemoteDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="remotedialog|RemoteDialog">Impress Remote</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</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="margin_top">5</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label" translatable="yes" context="remotedialog|ok">C_onnect</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_underline">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" translatable="yes" context="stock">_Close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scroll">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <property name="margin-bottom">6</property>
+ <property name="margin-end">12</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="tree">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">3</property>
+ <property name="margin-end">3</property>
+ <property name="margin_top">3</property>
+ <property name="margin_bottom">3</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="remotedialog|label1">Connections</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </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="-7">cancel</action-widget>
+ <action-widget response="-11">help</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="RemoteDialog-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="remotedialog|extended_tip|RemoteDialog">List all Impress Remote available connections.</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/rotatemenu.ui b/sd/uiconfig/simpress/ui/rotatemenu.ui
new file mode 100644
index 000000000..49464175d
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/rotatemenu.ui
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="90">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="rotatemenu|90">Quarter Spin</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="180">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="rotatemenu|180">Half Spin</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="360">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="rotatemenu|360">Full Spin</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="720">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="rotatemenu|720">Two Spins</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="clockwise">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="rotatemenu|clockwise">Clockwise</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="counterclock">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="rotatemenu|counterclock">Counter-clockwise</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/scalemenu.ui b/sd/uiconfig/simpress/ui/scalemenu.ui
new file mode 100644
index 000000000..152e164d2
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/scalemenu.ui
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="scalemenu|25">Tiny</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="50">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="scalemenu|50">Smaller</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="150">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="scalemenu|150">Larger</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="400">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="scalemenu|400">Extra Large</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="hori">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="scalemenu|hori">Horizontal</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="vert">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="scalemenu|vert">Vertical</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="both">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="scalemenu|both">Both</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/sdviewpage.ui b/sd/uiconfig/simpress/ui/sdviewpage.ui
new file mode 100644
index 000000000..d3e54dd8c
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/sdviewpage.ui
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkFrame" id="SdViewPage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="border_width">6</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkCheckButton" id="ruler">
+ <property name="label" translatable="yes" context="sdviewpage|ruler">_Rulers visible</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="ruler-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|ruler">Specifies whether to display the rulers at the top and to the left of the work area.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="dragstripes">
+ <property name="label" translatable="yes" context="sdviewpage|dragstripes">_Helplines while moving</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="dragstripes-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|dragstripes">Specifies whether to display guides when moving an object.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="handlesbezier">
+ <property name="label" translatable="yes" context="sdviewpage|handlesbezier">_All control points in Bézier editor</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="handlesbezier-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|handlesbezier">Displays the control points of all Bézier points if you have previously selected a Bézier curve. If the All control points in Bézier editor option is not marked, only the control points of the selected Bézier points will be visible.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="moveoutline">
+ <property name="label" translatable="yes" context="sdviewpage|moveoutline">_Contour of each individual object</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="moveoutline-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|moveoutline">The contour line of each individual object is displayed when moving this object.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="sdviewpage|label1">Display</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="SdViewPage-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="extended_tip|SdViewPage">Specifies the available display modes.</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/sidebarslidebackground.ui b/sd/uiconfig/simpress/ui/sidebarslidebackground.ui
new file mode 100644
index 000000000..7ed23ec8d
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/sidebarslidebackground.ui
@@ -0,0 +1,367 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkListStore" id="liststore4">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ <!-- column-name image -->
+ <column type="GdkPixbuf"/>
+ <!-- column-name surface -->
+ <column type="CairoSurface"/>
+ </columns>
+ </object>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="SlideBackgroundPanel">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <!-- n-columns=2 n-rows=14 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">center</property>
+ <property name="margin-start">9</property>
+ <property name="margin-end">15</property>
+ <property name="hexpand">True</property>
+ <property name="border-width">6</property>
+ <property name="row-spacing">3</property>
+ <property name="column-spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes" context="sidebarslidebackground|label2">_Format:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">paperformat</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes" context="sidebarslidebackground|label3">Background:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">fillstyle</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="orientation">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <items>
+ <item translatable="yes" context="sidebarslidebackground|orientation">Landscape</item>
+ <item translatable="yes" context="sidebarslidebackground|orientation">Portrait</item>
+ </items>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="fillstyle">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="fillattr">
+ <property name="width-request">150</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="label" translatable="no"></property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="displaymasterobjects">
+ <property name="label" translatable="yes" context="sidebarslidebackground|displaymasterobjects">Master Objects</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="hexpand">True</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="masterslide">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="masterlabel">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="ellipsize">end</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button2">
+ <property name="label" translatable="yes" context="sidebarslidebackground|button2">Insert Image...</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="hexpand">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="fillattr1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="model">liststore4</property>
+ <property name="entry-text-column">0</property>
+ <property name="id-column">1</property>
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext3"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ <child>
+ <object class="GtkCellRendererPixbuf" id="cellrenderertext4"/>
+ <attributes>
+ <attribute name="surface">3</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="fillattr2">
+ <property name="width-request">150</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="label" translatable="no"></property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="fillattr3">
+ <property name="width-request">150</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="label" translatable="no"></property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="displaymasterbackground">
+ <property name="label" translatable="yes" context="sidebarslidebackground|displaymasterbackground">Master Background</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="hexpand">True</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">10</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="paperformat">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes" context="sidebarslidebackground|label4">Orientation:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">orientation</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkButton" id="masterslidebutton">
+ <property name="label" translatable="yes" context="sidebarslidebackground|masterslidebutton">Master View</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">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="closemasterslide">
+ <property name="label" translatable="yes" context="sidebarslidebackground|closemasterslide">Close Master View</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="marginLB">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="labelmargin">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes" context="sidebarslidebackground|labelmargin">Margin:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">marginLB</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="customlabel">
+ <property name="can-focus">False</property>
+ <property name="no-show-all">True</property>
+ <property name="label" translatable="yes" context="sidebarslidebackground|customlabel">Custom</property>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">13</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/slidecontextmenu.ui b/sd/uiconfig/simpress/ui/slidecontextmenu.ui
new file mode 100644
index 000000000..91b5e1b59
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/slidecontextmenu.ui
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="goto">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|goto">_Go to Slide</property>
+ <property name="use-underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="gotomenu">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem3">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="pen">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|pen">Mouse Pointer as _Pen</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="width">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|width">_Pen Width</property>
+ <property name="use-underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="widthmenu">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkRadioMenuItem" id="4">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|4">_Very Thin</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkRadioMenuItem" id="100">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|100">_Thin</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkRadioMenuItem" id="150">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|150">_Normal</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkRadioMenuItem" id="200">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|200">_Thick</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkRadioMenuItem" id="400">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|400">_Very Thick</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="color">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|color">_Change Pen Color...</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="erase">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|erase">_Erase All Ink on Slide</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="screen">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|screen">_Screen</property>
+ <property name="use-underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="screenmenu">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkCheckMenuItem" id="black">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|black">_Black</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="white">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|white">_White</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="edit">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|edit">E_dit Presentation</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="end">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidecontextmenu|end">_End Show</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/slidedesigndialog.ui b/sd/uiconfig/simpress/ui/slidedesigndialog.ui
new file mode 100644
index 000000000..9963735b3
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/slidedesigndialog.ui
@@ -0,0 +1,216 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="SlideDesignDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="slidedesigndialog|SlideDesignDialog">Available Master Slides</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 internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</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="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="load">
+ <property name="label" translatable="yes" context="slidedesigndialog|load">_Load...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="load-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidedesigndialog|extended_tip|load">Displays the Load Master Slide dialog, where you can select additional slide designs.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">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="cancel">
+ <property name="label" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</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">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">6</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">6</property>
+ <child>
+ <object class="GtkCheckButton" id="masterpage">
+ <property name="label" translatable="yes" context="slidedesigndialog|masterpage">_Exchange background page</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="masterpage-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidedesigndialog|extended_tip|masterpage">Applies the background of the selected slide design to all of the slides in your document.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="checkmasters">
+ <property name="label" translatable="yes" context="slidedesigndialog|checkmasters">_Delete unused backgrounds</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="checkmasters-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidedesigndialog|extended_tip|checkmasters">Deletes unreferenced background slides and presentation layouts from your document.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="selectwin">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkViewport" id="selectwi">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkDrawingArea" id="select">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="slidedesigndialog|label1">Select a Slide Design</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </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="101">load</action-widget>
+ <action-widget response="-5">ok</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ <action-widget response="-11">help</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="SlideDesignDialog-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidedesigndialog|extended_tip|SlideDesignDialog">Displays the Available Master Slides dialog, where you can select a layout scheme for the current slide. Any objects in the slide design are inserted behind objects in the current slide.</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/slidetransitionspanel.ui b/sd/uiconfig/simpress/ui/slidetransitionspanel.ui
new file mode 100644
index 000000000..6f0c01465
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/slidetransitionspanel.ui
@@ -0,0 +1,468 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">1000</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment2">
+ <property name="upper">1000</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">sd/res/playblue_16.png</property>
+ </object>
+ <object class="GtkBox" id="SlideTransitionsPanel">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="vexpand">True</property>
+ <property name="border-width">6</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkScrolledWindow" id="transitions_iconswin">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar-policy">never</property>
+ <property name="shadow-type">in</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkDrawingArea" id="transitions_icons">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="transitions_icons-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|transitions_icons">Select the slide transition you want to use for the selected slides.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=2 n-rows=4 -->
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">3</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="duration_label">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes" context="slidetransitionspanel|duration_label">Duration:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">transition_duration</property>
+ <property name="xalign">1</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="transition_duration">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="tooltip-text" translatable="yes" context="slidetransitionspanel|transition_duration|tooltip_text">Select the speed of Slide Transition.</property>
+ <property name="hexpand">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment2</property>
+ <property name="digits">2</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="transition_duration-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|transition_duration">Sets the duration of the slide transition.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="sound_label">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes" context="slidetransitionspanel|sound_label">Sound:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">sound_list</property>
+ <property name="xalign">1</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="sound_list">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <items>
+ <item translatable="yes" context="slidetransitionspanel|sound_list">No sound</item>
+ <item translatable="yes" context="slidetransitionspanel|sound_list">Stop previous sound</item>
+ <item translatable="yes" context="slidetransitionspanel|sound_list">Other sound...</item>
+ </items>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="sound_list-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|sound_list">Lists sounds that can played during the slide transition.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="loop_sound">
+ <property name="label" translatable="yes" context="slidetransitionspanel|loop_sound">Loop until next sound</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="loop_sound-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|loop_sound">Select to play the sound repeatedly until another sound starts.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="variant_label">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes" context="slidetransitionspanel|variant_label">Variant:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">variant_list</property>
+ <property name="xalign">1</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="variant_list">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="variant_list-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|variant_list">Select a variation of the transition.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidetransitionspanel|label1">Modify Transition</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label-xalign">0</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <!-- n-columns=2 n-rows=2 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">3</property>
+ <property name="row-spacing">6</property>
+ <property name="column-spacing">12</property>
+ <child>
+ <object class="GtkRadioButton" id="rb_mouse_click">
+ <property name="label" translatable="yes" context="slidetransitionspanel|rb_mouse_click">On mouse click</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="active">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="rb_mouse_click-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|rb_mouse_click">Select to advance to the next slide on a mouse click.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="rb_auto_after">
+ <property name="label" translatable="yes" context="slidetransitionspanel|rb_auto_after">After:</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">rb_mouse_click</property>
+ <accessibility>
+ <relation type="label-for" target="auto_after_value"/>
+ </accessibility>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="rb_auto_after-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|rb_auto_after">Select to advance to the next slide after a number of seconds. Enter the seconds in the numerical field next to the spin button, or click the spin button.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="auto_after_value">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="truncate-multiline">True</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="digits">2</property>
+ <accessibility>
+ <relation type="labelled-by" target="rb_auto_after"/>
+ </accessibility>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="auto_after_value-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|auto_after_value">Select to advance to the next slide after a number of seconds. Enter the seconds in the numerical field next to the spin button, or click the spin button.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+ <property name="top-attach">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="slidetransitionspanel|label2">Advance Slide</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkButtonBox" id="buttonbox1">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="layout-style">center</property>
+ <child>
+ <object class="GtkButton" id="apply_to_all">
+ <property name="label" translatable="yes" context="slidetransitionspanel|apply_to_all">Apply Transition to All Slides</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="halign">center</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="apply_to_all-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|apply_to_all">Applies the selected slide transition to all slides in the current presentation document.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <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>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="spacing">18</property>
+ <child>
+ <object class="GtkCheckButton" id="auto_preview">
+ <property name="label" translatable="yes" context="slidetransitionspanel|auto_preview">Automatic Preview</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="use-underline">True</property>
+ <property name="draw-indicator">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="auto_preview-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|auto_preview">Select to see the slide transitions automatically in the document.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="play">
+ <property name="label" translatable="yes" context="slidetransitionspanel|play">Play</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">True</property>
+ <property name="tooltip-text" translatable="yes" context="slidetransitionspanel|play|tooltip_text">Preview Effect</property>
+ <property name="image">image1</property>
+ <property name="use-underline">True</property>
+ <property name="image-position">right</property>
+ <property name="always-show-image">True</property>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="play-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|play">Shows the current slide transition as a preview.</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="SlideTransitionsPanel-atkobject">
+ <property name="AtkObject::accessible-description" translatable="yes" context="slidetransitionspanel|extended_tip|SlideTransitionsPanel">Defines the special effect that plays when you display a slide during a slide show.</property>
+ </object>
+ </child>
+ </object>
+ <object class="GtkSizeGroup">
+ <widgets>
+ <widget name="duration_label"/>
+ <widget name="sound_label"/>
+ <widget name="variant_label"/>
+ <widget name="rb_auto_after"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/snapmenu.ui b/sd/uiconfig/simpress/ui/snapmenu.ui
new file mode 100644
index 000000000..5bb702561
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/snapmenu.ui
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/tabledesignpanel.ui b/sd/uiconfig/simpress/ui/tabledesignpanel.ui
new file mode 100644
index 000000000..9eb3fd1fe
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/tabledesignpanel.ui
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkBox" id="TableDesignPanel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkCheckButton" id="UseFirstRowStyle">
+ <property name="label" translatable="yes" context="tabledesignpanel|UseFirstRowStyle">_Header row</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="UseLastRowStyle">
+ <property name="label" translatable="yes" context="tabledesignpanel|UseLastRowStyle">Tot_al row</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="UseBandingRowStyle">
+ <property name="label" translatable="yes" context="tabledesignpanel|UseBandingRowStyle">_Banded rows</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="UseFirstColumnStyle">
+ <property name="label" translatable="yes" context="tabledesignpanel|UseFirstColumnStyle">Fi_rst column</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="UseLastColumnStyle">
+ <property name="label" translatable="yes" context="tabledesignpanel|UseLastColumnStyle">_Last column</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="UseBandingColumnStyle">
+ <property name="label" translatable="yes" context="tabledesignpanel|UseBandingColumnStyle">Ba_nded columns</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="previewswin">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkDrawingArea" id="previews">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/tabviewbar.ui b/sd/uiconfig/simpress/ui/tabviewbar.ui
new file mode 100644
index 000000000..8d4f181a1
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/tabviewbar.ui
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkBox" id="TabViewBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkNotebook" id="tabcontrol">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin-start">5</property>
+ <property name="margin_top">3</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="scrollable">True</property>
+ <property name="enable_popup">True</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">placeholder</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/sd/uiconfig/simpress/ui/templatedialog.ui b/sd/uiconfig/simpress/ui/templatedialog.ui
new file mode 100644
index 000000000..c2f0f738b
--- /dev/null
+++ b/sd/uiconfig/simpress/ui/templatedialog.ui
@@ -0,0 +1,895 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="sd">
+ <requires lib="gtk+" version="3.20"/>
+ <object class="GtkDialog" id="TemplateDialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="title" translatable="yes" context="templatedialog|TemplateDialog">Graphic Styles</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">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="reset">
+ <property name="label" translatable="yes" context="stock">_Reset</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">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="standard">
+ <property name="label" translatable="yes" context="templatedialog|standard">_Standard</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">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="ok">
+ <property name="label" translatable="yes" context="stock">_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-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="cancel">
+ <property name="label" translatable="yes" context="stock">_Cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="help">
+ <property name="label" translatable="yes" context="stock">_Help</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use-underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</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">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="tabcontrol">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="scrollable">True</property>
+ <property name="enable_popup">True</property>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="organizer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|organizer">Organizer</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="line">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes" context="templatedialog|line">Line</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="area">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|area">Area</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="shadowing">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes" context="templatedialog|shadowing">Shadowing</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="transparency">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|transparency">Transparency</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="font">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|font">Font</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="fonteffect">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|fonteffect">Font Effects</property>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="indents">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|indents">Indents &amp; Spacing</property>
+ </object>
+ <packing>
+ <property name="position">7</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|text">Text</property>
+ </object>
+ <packing>
+ <property name="position">8</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="animation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|animation">Text Animation</property>
+ </object>
+ <packing>
+ <property name="position">9</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">10</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="dimensioning">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|dimensioning">Dimensioning</property>
+ </object>
+ <packing>
+ <property name="position">10</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">11</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="connector">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|connector">Connector</property>
+ </object>
+ <packing>
+ <property name="position">11</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="alignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|alignment">Alignment</property>
+ </object>
+ <packing>
+ <property name="position">12</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">13</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="asiantypo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|asiantypo">Asian Typography</property>
+ </object>
+ <packing>
+ <property name="position">13</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">14</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="tabs">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|tabs">Tabs</property>
+ </object>
+ <packing>
+ <property name="position">14</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <!-- n-columns=1 n-rows=1 -->
+ <object class="GtkGrid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">15</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="background">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="templatedialog|background">Highlighting</property>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </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="101">reset</action-widget>
+ <action-widget response="102">standard</action-widget>
+ <action-widget response="-5">ok</action-widget>
+ <action-widget response="-6">cancel</action-widget>
+ <action-widget response="-11">help</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/sd/util/sd.component b/sd/util/sd.component
new file mode 100644
index 000000000..f1937a048
--- /dev/null
+++ b/sd/util/sd.component
@@ -0,0 +1,112 @@
+<?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.Draw.DrawingDocument"
+ constructor="sd_DrawingDocument_get_implementation">
+ <service name="com.sun.star.drawing.DrawingDocument"/>
+ <service name="com.sun.star.drawing.DrawingDocumentFactory"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.DrawingModule"
+ constructor="com_sun_star_comp_Draw_DrawingModule_get_implementation">
+ <service name="com.sun.star.drawing.ModuleDispatcher"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.PresentationDocument"
+ constructor="sd_PresentationDocument_get_implementation">
+ <service name="com.sun.star.drawing.DrawingDocumentFactory"/>
+ <service name="com.sun.star.presentation.PresentationDocument"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.PresenterHelper"
+ constructor="com_sun_star_comp_Draw_PresenterHelper_get_implementation">
+ <service name="com.sun.star.drawing.PresenterHelper"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.PresenterPreviewCache"
+ constructor="com_sun_star_comp_Draw_PresenterPreviewCache_get_implementation">
+ <service name="com.sun.star.drawing.PresenterPreviewCache"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.PresenterTextView"
+ constructor="com_sun_star_comp_Draw_PresenterTextView_get_implementation">
+ <service name="com.sun.star.drawing.PresenterTextView"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.SlideRenderer"
+ constructor="com_sun_star_comp_Draw_SlideRenderer_get_implementation">
+ <service name="com.sun.star.drawing.SlideRenderer"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.SlideSorter"
+ constructor="com_sun_star_comp_Draw_SlideSorter_get_implementation">
+ <service name="com.sun.star.drawing.SlideSorter"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.framework.BasicPaneFactory"
+ constructor="com_sun_star_comp_Draw_framework_BasicPaneFactory_get_implementation">
+ <service name="com.sun.star.drawing.framework.BasicPaneFactory"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.framework.BasicToolBarFactory"
+ constructor="com_sun_star_comp_Draw_framework_BasicToolBarFactory_get_implementation">
+ <service name="com.sun.star.drawing.framework.BasicToolBarFactory"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.framework.BasicViewFactory"
+ constructor="com_sun_star_comp_Draw_framework_BasicViewFactory_get_implementation">
+ <service name="com.sun.star.drawing.framework.BasicViewFactory"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.framework.PresentationFactoryProvider"
+ constructor="com_sun_star_comp_Draw_framework_PresentationFactoryProvider_get_implementation">
+ <service name="com.sun.star.drawing.framework.PresentationFactoryProvider"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.framework.ResourceId"
+ constructor="com_sun_star_comp_Draw_framework_ResourceID_get_implementation">
+ <service name="com.sun.star.drawing.framework.ResourceId"/>
+ </implementation>
+ <implementation name="org.openoffice.comp.Draw.framework.PanelFactory"
+ constructor="org_openoffice_comp_Draw_framework_PanelFactory_get_implementation">
+ <service name="com.sun.star.drawing.framework.PanelFactory"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.framework.configuration.Configuration"
+ constructor="com_sun_star_comp_Draw_framework_configuration_Configuration_get_implementation">
+ <service name="com.sun.star.drawing.framework.Configuration"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.framework.configuration.ConfigurationController"
+ constructor="com_sun_star_comp_Draw_framework_configuration_ConfigurationController_get_implementation">
+ <service name="com.sun.star.drawing.framework.ConfigurationController"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.Draw.framework.module.ModuleController"
+ constructor="com_sun_star_comp_Draw_framework_module_ModuleController_get_implementation">
+ <service name="com.sun.star.drawing.framework.ModuleController"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.draw.SdHtmlOptionsDialog"
+ constructor="com_sun_star_comp_draw_SdHtmlOptionsDialog_get_implementation">
+ <service name="com.sun.star.ui.dialog.FilterOptionsDialog"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.sd.InsertSlideController"
+ constructor="com_sun_star_comp_sd_InsertSlideController_get_implementation">
+ <service name="com.sun.star.frame.ToolbarController"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.sd.SlideLayoutController"
+ constructor="com_sun_star_comp_sd_SlideLayoutController_get_implementation">
+ <service name="com.sun.star.frame.ToolbarController"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.sd.DisplayModeController"
+ constructor="com_sun_star_comp_sd_DisplayModeController_get_implementation">
+ <service name="com.sun.star.frame.ToolbarController"/>
+ </implementation>
+ <implementation name="sd::RandomAnimationNode"
+ constructor="RandomAnimationNode_get_implementation">
+ <service name="com.sun.star.comp.sd.RandomAnimationNode"/>
+ </implementation>
+</component>
diff --git a/sd/util/sdd.component b/sd/util/sdd.component
new file mode 100644
index 000000000..c3e25b2f1
--- /dev/null
+++ b/sd/util/sdd.component
@@ -0,0 +1,26 @@
+<?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.draw.FormatDetector"
+ constructor="com_sun_star_comp_draw_FormatDetector_get_implementation">
+ <service name="com.sun.star.frame.ExtendedTypeDetection"/>
+ </implementation>
+</component>
diff --git a/sd/util/sdfilt.component b/sd/util/sdfilt.component
new file mode 100644
index 000000000..5e4bab20b
--- /dev/null
+++ b/sd/util/sdfilt.component
@@ -0,0 +1,13 @@
+<?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.Impress.oox.PowerPointExport" constructor="css_comp_Impress_oox_PowerPointExport"/>
+</component>
diff --git a/sd/workben/custompanel/ctp_panel.cxx b/sd/workben/custompanel/ctp_panel.cxx
new file mode 100644
index 000000000..170aee369
--- /dev/null
+++ b/sd/workben/custompanel/ctp_panel.cxx
@@ -0,0 +1,215 @@
+/* -*- 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 "ctp_panel.hxx"
+
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/awt/WindowClass.hpp>
+#include <com/sun/star/awt/WindowAttribute.hpp>
+#include <com/sun/star/awt/PosSize.hpp>
+#include <com/sun/star/awt/XDevice.hpp>
+#include <com/sun/star/awt/XGraphics.hpp>
+
+#include <tools/diagnose_ex.h>
+
+namespace sd::colortoolpanel
+{
+
+ using ::com::sun::star::uno::Reference;
+ using ::com::sun::star::uno::UNO_QUERY;
+ using ::com::sun::star::uno::UNO_QUERY_THROW;
+ using ::com::sun::star::uno::UNO_SET_THROW;
+ using ::com::sun::star::uno::Exception;
+ using ::com::sun::star::uno::RuntimeException;
+ using ::com::sun::star::uno::Type;
+ using ::com::sun::star::drawing::framework::XConfigurationController;
+ using ::com::sun::star::drawing::framework::XResourceId;
+ using ::com::sun::star::uno::XComponentContext;
+ using ::com::sun::star::drawing::framework::XPane;
+ using ::com::sun::star::awt::XWindow;
+ using ::com::sun::star::lang::DisposedException;
+ using ::com::sun::star::awt::XWindowPeer;
+ using ::com::sun::star::lang::XMultiComponentFactory;
+ using ::com::sun::star::awt::WindowDescriptor;
+ using ::com::sun::star::awt::WindowClass_SIMPLE;
+ using ::com::sun::star::awt::Rectangle;
+ using ::com::sun::star::awt::PaintEvent;
+ using ::com::sun::star::lang::EventObject;
+ using ::com::sun::star::awt::XDevice;
+ using ::com::sun::star::awt::XGraphics;
+ using ::com::sun::star::accessibility::XAccessible;
+
+ namespace WindowAttribute = ::com::sun::star::awt::WindowAttribute;
+ namespace PosSize = ::com::sun::star::awt::PosSize;
+
+ //= helpers
+
+ namespace
+ {
+ Reference< XWindow > lcl_createPlainWindow_nothrow( const Reference< XComponentContext >& i_rContext,
+ const Reference< XWindowPeer >& i_rParentWindow )
+ {
+ try
+ {
+ ENSURE_OR_THROW( i_rContext.is(), "illegal component context" );
+ Reference< XMultiComponentFactory > xFactory( i_rContext->getServiceManager(), UNO_SET_THROW );
+ Reference< XToolkit2 > xToolkit = Toolkit::create(i_rContext);
+
+ WindowDescriptor aWindow;
+ aWindow.Type = WindowClass_SIMPLE;
+ aWindow.WindowServiceName = "window";
+ aWindow.Parent = i_rParentWindow;
+ aWindow.WindowAttributes = WindowAttribute::BORDER;
+
+ Reference< XWindowPeer > xWindow( xToolkit->createWindow( aWindow ), UNO_SET_THROW );
+ return Reference< XWindow >( xWindow, UNO_QUERY_THROW );
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+ return NULL;
+ }
+ }
+
+ //= class SingleColorPanel
+
+ SingleColorPanel::SingleColorPanel( const Reference< XComponentContext >& i_rContext,
+ const Reference< XConfigurationController >& i_rConfigController, const Reference< XResourceId >& i_rResourceId )
+ :SingleColorPanel_Base( m_aMutex )
+ ,m_xContext( i_rContext )
+ ,m_xResourceId( i_rResourceId )
+ ,m_xWindow()
+ {
+ ENSURE_OR_THROW( i_rConfigController.is(), "invalid configuration controller" );
+ ENSURE_OR_THROW( m_xResourceId.is(), "invalid resource id" );
+
+ // retrieve the parent window for our to-be-created pane window
+ Reference< XWindow > xParentWindow;
+ Reference< XWindowPeer > xParentPeer;
+ try
+ {
+ Reference< XResource > xAnchor( i_rConfigController->getResource( m_xResourceId->getAnchor() ), UNO_SET_THROW );
+ Reference< XPane > xAnchorPane( xAnchor, UNO_QUERY_THROW );
+ xParentWindow.set( xAnchorPane->getWindow(), UNO_SET_THROW );
+ xParentPeer.set( xParentWindow, UNO_QUERY_THROW );
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+ osl_atomic_increment( &m_refCount );
+ if ( xParentWindow.is() )
+ {
+ m_xWindow = lcl_createPlainWindow_nothrow( m_xContext, xParentPeer );
+ m_xWindow->addPaintListener( this );
+ if ( m_xWindow.is() )
+ {
+ const Rectangle aPanelAnchorSize( xParentWindow->getPosSize() );
+ m_xWindow->setPosSize( 0, 0, aPanelAnchorSize.Width, aPanelAnchorSize.Height, PosSize::POSSIZE );
+ m_xWindow->setVisible( sal_True );
+ }
+ }
+ osl_atomic_decrement( &m_refCount );
+ }
+
+ SingleColorPanel::~SingleColorPanel()
+ {
+ }
+
+ Reference< XWindow > SAL_CALL SingleColorPanel::getWindow( ) throw (RuntimeException)
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if ( !m_xWindow.get() )
+ throw DisposedException( OUString(), *this );
+ return m_xWindow;
+ }
+
+ Reference< XAccessible > SAL_CALL SingleColorPanel::createAccessible( const Reference< XAccessible >& i_rParentAccessible ) throw (RuntimeException)
+ {
+ (void)i_rParentAccessible;
+ return Reference< XAccessible >( m_xWindow, UNO_QUERY );
+ // TODO: this is, strictly, not correct, as we ignore i_ParentAccessible here. If you are not doing a sample
+ // extension only, you'll want to do this correctly...
+ }
+
+ Reference< XResourceId > SAL_CALL SingleColorPanel::getResourceId( ) throw (RuntimeException)
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if ( !m_xWindow.is() )
+ throw DisposedException( OUString(), *this );
+ return m_xResourceId;
+ }
+
+ sal_Bool SAL_CALL SingleColorPanel::isAnchorOnly( ) throw (RuntimeException)
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if ( !m_xWindow.is() )
+ throw DisposedException( OUString(), *this );
+ return sal_False;
+ }
+
+ void SAL_CALL SingleColorPanel::windowPaint( const PaintEvent& i_rEvent ) throw (RuntimeException)
+ {
+ try
+ {
+ const Reference< XDevice > xDevice( i_rEvent.Source, UNO_QUERY_THROW );
+ const Reference< XGraphics > xGraphics( xDevice->createGraphics(), UNO_SET_THROW );
+ xGraphics->setFillColor( 0x80 << 8 );
+ xGraphics->setLineColor( 0x80 << 16 );
+
+ const Reference< XWindow > xWindow( i_rEvent.Source, UNO_QUERY_THROW );
+ const Rectangle aWindowRect( xWindow->getPosSize() );
+ xGraphics->drawRect( 0, 0, aWindowRect.Width - 1, aWindowRect.Height - 1 );
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+ }
+
+ void SAL_CALL SingleColorPanel::disposing( const EventObject& i_rSource ) throw (RuntimeException)
+ {
+ (void)i_rSource;
+ }
+
+ void SAL_CALL SingleColorPanel::disposing()
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if ( !m_xWindow.is() )
+ // already disposed
+ return;
+ m_xWindow->removePaintListener( this );
+ try
+ {
+ Reference< XComponent > xWindowComp( m_xWindow, UNO_QUERY_THROW );
+ xWindowComp->dispose();
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION("sd");
+ }
+ m_xWindow.clear();
+ }
+
+} } // namespace sd::colortoolpanel
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/workben/custompanel/ctp_panel.hxx b/sd/workben/custompanel/ctp_panel.hxx
new file mode 100644
index 000000000..a6d970693
--- /dev/null
+++ b/sd/workben/custompanel/ctp_panel.hxx
@@ -0,0 +1,82 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <com/sun/star/ui/XToolPanel.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/XResourceId.hpp>
+#include <com/sun/star/awt/XPaintListener.hpp>
+
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+
+#include <memory>
+
+namespace sd::colortoolpanel
+{
+
+ typedef ::cppu::WeakComponentImplHelper < css::drawing::framework::XView
+ , css::ui::XToolPanel
+ , css::awt::XPaintListener
+ > SingleColorPanel_Base;
+ class SingleColorPanel :public ::cppu::BaseMutex
+ ,public SingleColorPanel_Base
+ {
+ public:
+ SingleColorPanel(
+ const css::uno::Reference< css::uno::XComponentContext >& i_rContext,
+ const css::uno::Reference< css::drawing::framework::XConfigurationController >& i_rConfigController,
+ const css::uno::Reference< css::drawing::framework::XResourceId >& i_rResourceId
+ );
+
+ // XToolPanel
+ virtual css::uno::Reference< css::awt::XWindow > SAL_CALL getWindow( ) throw (css::uno::RuntimeException);
+ virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL createAccessible( const css::uno::Reference< css::accessibility::XAccessible >& ParentAccessible ) throw (css::uno::RuntimeException);
+
+ // XView
+ // (no methods)
+
+ // XResource
+ virtual css::uno::Reference< css::drawing::framework::XResourceId > SAL_CALL getResourceId( ) throw (css::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isAnchorOnly( ) throw (css::uno::RuntimeException);
+
+ // XPaintListener
+ virtual void SAL_CALL windowPaint( const css::awt::PaintEvent& e ) throw (css::uno::RuntimeException);
+
+ // XEventListener
+ virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) throw (css::uno::RuntimeException);
+
+ // XComponent equivalents
+ virtual void SAL_CALL disposing();
+
+ protected:
+ ~SingleColorPanel();
+
+ private:
+ css::uno::Reference< css::uno::XComponentContext > m_xContext;
+ css::uno::Reference< css::drawing::framework::XResourceId > m_xResourceId;
+ css::uno::Reference< css::awt::XWindow > m_xWindow;
+ };
+
+} } // namespace sd::colortoolpanel
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/workben/testdll/makefile b/sd/workben/testdll/makefile
new file mode 100644
index 000000000..594986653
--- /dev/null
+++ b/sd/workben/testdll/makefile
@@ -0,0 +1,91 @@
+#
+# 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 .
+#
+
+PRJ=..
+
+PRJNAME=test
+TARGET=tst
+
+# --- Settings -----------------------------------------------------
+
+!INCLUDE <svpre.mak>
+!INCLUDE <settings.mak>
+!INCLUDE <sv.mak>
+
+# --- Files --------------------------------------------------------
+
+CXXFILES= \
+ test.cxx
+SLOFILES= \
+ $(SLO)\test.obj
+#SRC1FILES=
+#SRS1NAME=
+#SRSFILES= $(SRS)\
+#SRC2FILES=
+#SRS2NAME=
+
+#RESLIB1NAME=tst
+#RESLIB1SRSFILES=\
+# $(SRS)\
+# $(SOLARRESDIR)\
+
+SHL1TARGET= $(TARGET)$(DLLPOSTFIX)
+#SHL1LIBS=$(SLB)\$(TARGET).lib
+
+!IF "$(COM)"!="WTC"
+SHL1STDLIBS=tools.lib $(SVLIB) usr.lib
+!ELSE
+SHL1STDLIBS=tools.lib libr sv.lib libr isv.lib libr usr.lib
+!ENDIF
+
+SHL1DEPN= $(L)tools.lib $(SVLIBDEPEND)
+SHL1DEF= $(MISC)\$(SHL1TARGET).def
+SHL1IMPLIB=$(TARGET)
+#SHL1RES= $(RES)\$(TARGET).res
+SHL1OBJS= $(SLO)\test.obj
+
+# --- Targets ------------------------------------------------------
+!INCLUDE <target.mak>
+
+!IF "$(OS)" == "WNT"
+
+$(MISC)\$(SHL1TARGET).def: makefile
+ @echo ------------------------------
+ @echo Making: $@
+ @echo LIBRARY $(SHL1TARGET) >$@
+ @echo DESCRIPTION 'StarOne Test-DLL' >>$@
+ @echo DATA READ WRITE NONSHARED >>$@
+ @echo EXPORTS >>$@
+ @echo CreateWindow @2 >>$@
+!ENDIF
+
+!IF "$(GUI)" == "WIN"
+
+$(MISC)\$(SHL1TARGET).def: makefile
+ @echo ------------------------------
+ @echo Making: $@
+ @echo LIBRARY $(SHL1TARGET) >$@
+ @echo DESCRIPTION 'StarOne Test-DLL' >>$@
+ @echo EXETYPE WINDOWS >>$@
+ @echo PROTMODE >>$@
+ @echo CODE LOADONCALL MOVEABLE DISCARDABLE >>$@
+ @echo DATA PRELOAD MOVEABLE SINGLE >>$@
+ @echo HEAPSIZE 0 >>$@
+ @echo EXPORTS >>$@
+ @echo _CreateWindow @2 >>$@
+!ENDIF
diff --git a/sd/xml/effects.xml b/sd/xml/effects.xml
new file mode 100644
index 000000000..973cac85b
--- /dev/null
+++ b/sd/xml/effects.xml
@@ -0,0 +1,2699 @@
+<?xml version="1.0"?>
+<!--
+ * 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 .
+-->
+<anim:seq xmlns:office="urn:oasis:names:tc:openoffice:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:openoffice:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:openoffice:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:openoffice:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:openoffice:xmlns:drawing:1.0" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:openoffice:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:openoffice:xmlns:datastyle:1.0" xmlns:pres="urn:oasis:names:tc:openoffice:xmlns:presentation:1.0" xmlns:svg="http://www.w3.org/2000/svg" xmlns:chart="urn:oasis:names:tc:openoffice:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:openoffice:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:openoffice:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:openoffice:xmlns:script: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:smil="http://www.w3.org/2001/SMIL20" xmlns:anim="urn:oasis:names:tc:openoffice:xmlns:animation:1.0" pres:node-type="main-sequence">
+
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-appear">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-venetian-blinds" pres:preset-sub-type="vertical">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="blindsWipe" smil:subtype="horizontal"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-venetian-blinds" pres:preset-sub-type="horizontal">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="blindsWipe" smil:subtype="vertical"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-box" pres:preset-sub-type="in">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="irisWipe" smil:subtype="rectangle" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-box" pres:preset-sub-type="out">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="irisWipe" smil:subtype="rectangle"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-checkerboard" pres:preset-sub-type="across">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="checkerBoardWipe" smil:subtype="across"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-checkerboard" pres:preset-sub-type="downward">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="checkerBoardWipe" smil:subtype="down"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-circle" pres:preset-sub-type="in">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="ellipseWipe" smil:subtype="horizontal" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-circle" pres:preset-sub-type="out">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="ellipseWipe" smil:subtype="horizontal"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-oval" pres:preset-sub-type="in">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="ellipseWipe" smil:subtype="vertical" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-oval" pres:preset-sub-type="out">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="ellipseWipe" smil:subtype="vertical"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in-slow" pres:preset-sub-type="from-bottom">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="y" smil:values="1+height/2;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in-slow" pres:preset-sub-type="from-left">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="x" smil:values="0-width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in-slow" pres:preset-sub-type="from-right">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="x" smil:values="1+width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in-slow" pres:preset-sub-type="from-top">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="y" smil:values="0-height/2;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-diamond" pres:preset-sub-type="in">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="irisWipe" smil:subtype="diamond" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-diamond" pres:preset-sub-type="out">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="irisWipe" smil:subtype="diamond"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-dissolve-in">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="dissolve"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-flash-once">
+ <anim:set smil:begin="0" smil:dur="1" smil:attributeName="visibility" smil:to="visible"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-bottom">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="1+height/2;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-left">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="0-width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-right">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="1+width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-top">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="0-height/2;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-bottom-left">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="0-width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="1+height/2;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-bottom-right">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="1+width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="1+height/2;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-top-left">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="0-width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="0-height/2;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fly-in" pres:preset-sub-type="from-top-right">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="1+width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="0-height/2;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-peek-in" pres:preset-sub-type="from-bottom">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromBottom"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-peek-in" pres:preset-sub-type="from-left">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromLeft"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-peek-in" pres:preset-sub-type="from-right">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromRight"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-peek-in" pres:preset-sub-type="from-top">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromTop"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-plus" pres:preset-sub-type="in">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="fourBoxWipe" smil:subtype="cornersIn"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-plus" pres:preset-sub-type="out">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="fourBoxWipe" smil:subtype="cornersIn" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-random-bars" pres:preset-sub-type="vertical">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="randomBarWipe" smil:subtype="horizontal"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-random-bars" pres:preset-sub-type="horizontal">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="randomBarWipe" smil:subtype="vertical"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-random"/>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-split" pres:preset-sub-type="horizontal-in">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="horizontal" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-split" pres:preset-sub-type="horizontal-out">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="horizontal"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-split" pres:preset-sub-type="vertical-in">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="vertical" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-split" pres:preset-sub-type="vertical-out">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="vertical"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-diagonal-squares" pres:preset-sub-type="left-to-bottom">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalLeft"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-diagonal-squares" pres:preset-sub-type="left-to-top">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalRight" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-diagonal-squares" pres:preset-sub-type="right-to-bottom">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalRight"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-diagonal-squares" pres:preset-sub-type="right-to-top">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalLeft" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wedge">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="fanWipe" smil:subtype="centerTop"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-clock-wipe" pres:preset-sub-type="clockwise">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="clockWipe" smil:subtype="clockwiseTwelve"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-clock-wipe" pres:preset-sub-type="counter-clockwise">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="clockWipe" smil:subtype="clockwiseTwelve" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wheel" pres:preset-sub-type="1">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="oneBlade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wheel" pres:preset-sub-type="2">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="twoBladeVertical"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wheel" pres:preset-sub-type="3">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="threeBlade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wheel" pres:preset-sub-type="4">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="fourBlade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wheel" pres:preset-sub-type="8">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="eightBlade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+
+<!-- ooo-entrance-snake-wipe -->
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-snake-wipe" pres:preset-sub-type="from-top-left-horizontal">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="snakeWipe" smil:subtype="topLeftHorizontal"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-snake-wipe" pres:preset-sub-type="from-top-left-vertical">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="snakeWipe" smil:subtype="topLeftVertical"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-snake-wipe" pres:preset-sub-type="from-bottom-right-vertical">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="snakeWipe" smil:subtype="topLeftVertical" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-snake-wipe" pres:preset-sub-type="from-bottom-right-horizontal">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="snakeWipe" smil:subtype="topLeftHorizontal" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+
+<!-- ooo-entrance-spiral-wipe -->
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-spiral-wipe" pres:preset-sub-type="from-top-left-clockwise">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="spiralWipe" smil:subtype="topLeftClockwise"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-spiral-wipe" pres:preset-sub-type="from-top-right-counter-clockwise">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="spiralWipe" smil:subtype="topRightCounterClockwise"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-spiral-wipe" pres:preset-sub-type="from-center-clockwise">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="spiralWipe" smil:subtype="topLeftClockwise" smil:direction="reverse"/>/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-spiral-wipe" pres:preset-sub-type="from-center-counter-clockwise">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="spiralWipe" smil:subtype="topRightCounterClockwise" smil:direction="reverse"/>/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+
+<!-- ooo-entrance-wipe -->
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wipe" pres:preset-sub-type="from-bottom">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="topToBottom" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wipe" pres:preset-sub-type="from-left">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="leftToRight"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wipe" pres:preset-sub-type="from-right">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="leftToRight" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-wipe" pres:preset-sub-type="from-top">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="topToBottom"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-expand">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="width" smil:values="width*0.70;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fade-in">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="fade" smil:subtype="crossfade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fade-in-and-swivel" anim:iterate-type="by-letter" anim:iterate-interval="0.2s">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="fade" smil:subtype="crossfade"/>
+ <anim:animate smil:dur="2" smil:fill="hold" smil:attributeName="width" smil:values="0;1" smil:keyTimes="0;1" anim:formula="width*sin(2.5*pi*$)"/>
+ <anim:animate smil:dur="2" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fade-in-and-zoom">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-ascend">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:values="y+.1;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-center-revolve">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.1" smil:type="fade" smil:subtype="crossfade"/>
+ <anim:animate smil:dur="0.4" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.4" smil:fill="hold" smil:attributeName="y" smil:values="y+0.31;y+0.31" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.4" smil:dur="0.6" smil:fill="hold" smil:decelerate="0.5" smil:attributeName="x" smil:values="x;x+0.0242;x+0.0479;x+0.0704;x+0.0911;x+0.1096;x+0.1254;x+0.1381;x+0.1474;x+0.1531;x+0.1550;x+0.1531;x+0.1474;x+0.1381;x+0.1254;x+0.1096;x+0.0911;x+0.0704;x+0.0479;x+0.0242;x" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/>
+ <anim:animate smil:begin="0.4" smil:dur="0.6" smil:fill="hold" smil:decelerate="0.5" smil:attributeName="y" smil:values="y+0.31;y+0.308;y+0.3024;y+0.2931;y+0.2804;y+0.2646;y+0.2461;y+0.2253;y+0.2029;y+0.1792;y+0.155;y+0.1307;y+0.1071;y+0.0846;y+0.0639;y+0.0454;y+0.0296;y+0.0169;y+0.0076;y+0.0019;y" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:preset-property="Color1;Color2" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-colored-lettering" anim:iterate-type="by-letter" anim:iterate-interval="0.04s">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.08" smil:attributeName="color" smil:values="#333399;#009999" smil:keyTimes="0;0.5" smil:calcMode="discrete"/>
+ <anim:animate smil:dur="0.08" smil:attributeName="fill-color" smil:values="#333399;#009999" smil:keyTimes="0;0.5" smil:calcMode="discrete"/>
+ <anim:set smil:dur="0.08" smil:attributeName="fill" smil:to="solid"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:decelerate="1" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-compress">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="width" smil:values="width+.3;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-descend">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:values="y-.1;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-ease-in">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="x-.2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="1" smil:type="barWipe" smil:subtype="leftToRight" smil:direction="reverse"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-turn-and-grow" anim:iterate-type="by-letter" anim:iterate-interval="0.05s">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="rotate" smil:values="90;0" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-rise-up">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.9" smil:fill="hold" smil:decelerate="1" smil:attributeName="y" smil:values="y+1;y-.03" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.9" smil:dur="0.1" smil:fill="hold" smil:accelerate="1" smil:attributeName="y" smil:values="y-.03;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:decelerate="1" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-spin-in">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="rotate" smil:values="360;0" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="across">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="downward">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-bottom">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y+height/2;y" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-left">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x-width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-right">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x+width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-top">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y-height/2;y" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-top-right">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x+width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y-height/2;y" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-bottom-right">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x+width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y+height/2;y" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-top-left">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x-width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y-height/2;y" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-stretchy" pres:preset-sub-type="from-bottom-left">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x-width/2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y+height/2;y" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-unfold" anim:iterate-type="by-letter" anim:iterate-interval="0.1s">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="x-.1;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-zoom" pres:preset-sub-type="in">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-zoom" pres:preset-sub-type="in-from-screen-center">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="0.5;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="0.5;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-zoom" pres:preset-sub-type="in-slightly">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="2/3*width;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="2/3*height;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-zoom" pres:preset-sub-type="out">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="4*width;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="4*height;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-zoom" pres:preset-sub-type="out-from-screen-center">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="(6*min(max(width*height,.3),1)-7.4)/-.7*width;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="(6*min(max(width*height,.3),1)-7.4)/-.7*height;height" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="0.5;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="1+(6*min(max(width*height,.3),1)-7.4)/-.7*height/2;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-zoom" pres:preset-sub-type="out-slightly">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="4/3*width;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="4/3*height;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-boomerang">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:begin="0" smil:dur="0.5" smil:fill="hold" smil:decelerate="0.5" smil:attributeName="rotate" smil:values="-90;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0" smil:dur="0.5" smil:fill="hold" smil:decelerate="0.5" smil:attributeName="width" smil:values="width;width*.05" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.5" smil:dur="0.5" smil:fill="hold" smil:accelerate="0.5" smil:attributeName="width" smil:values="width*.05;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0" smil:dur="0.5" smil:fill="hold" smil:decelerate="0.5" smil:attributeName="x" smil:values="x+.4;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0" smil:dur="0.5" smil:fill="hold" smil:decelerate="0.5" smil:attributeName="y" smil:values="y-.2;y+.1" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.5" smil:dur="0.5" smil:fill="hold" smil:accelerate="0.5" smil:attributeName="y" smil:values="y+.1;y" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:begin="0" smil:dur="1" smil:decelerate="0.5" smil:type="fade" smil:subtype="crossfade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-bounce">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:begin="0" smil:dur="0.58" smil:type="barWipe" smil:subtype="topToBottom"/>
+ <anim:animate smil:begin="0" smil:dur="1.822" smil:attributeName="x" smil:values="x-0.25;x" smil:keyTimes="0;1" smil:keySplines="0,0;0.14,0.36;0.43,0.73;0.71,0.91;1,1"/>
+ <anim:animate smil:begin="0" smil:dur="0.664" smil:attributeName="y" smil:values="0.5;1" smil:keyTimes="0;1" anim:formula="y-sin(pi*$)/3" smil:keySplines="0,0;0.25,0.07;0.5,0.2;0.75,0.467;1,1"/>
+ <anim:animate smil:begin="0.664" smil:dur="0.664" smil:attributeName="y" smil:values="0;1" smil:keyTimes="0;1" anim:formula="y-sin(pi*$)/9" smil:keySplines="0,0;0.125,0.2665;0.25,0.4;0.375,0.465;0.5,0.5;0.625,0.535;0.75,0.6;0.875,0.7335;1,1"/>
+ <anim:animate smil:begin="1.324" smil:dur="0.332" smil:attributeName="y" smil:values="0;1" smil:keyTimes="0;1" anim:formula="y-sin(pi*$)/27" smil:keySplines="0,0;0.125,0.2665;0.25,0.4;0.375,0.465;0.5,0.5;0.625,0.535;0.75,0.6;0.875,0.7335;1,1"/>
+ <anim:animate smil:begin="1.656" smil:dur="0.164" smil:attributeName="y" smil:values="0;1" smil:keyTimes="0;1" anim:formula="y-sin(pi*$)/81" smil:keySplines="0,0;0.125,0.2665;0.25,0.4;0.375,0.465;0.5,0.5;0.625,0.535;0.75,0.6;0.875,0.7335;1,1"/>
+ <anim:animateTransform smil:begin="0.65" smil:dur="0.026" smil:to="1,0.6" svg:type="scale"/>
+ <anim:animateTransform smil:begin="0.676" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/>
+ <anim:animateTransform smil:begin="1.312" smil:dur="0.026" smil:to="1,0.8" svg:type="scale"/>
+ <anim:animateTransform smil:begin="1.338" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/>
+ <anim:animateTransform smil:begin="1.642" smil:dur="0.026" smil:to="1,0.9" svg:type="scale"/>
+ <anim:animateTransform smil:begin="1.668" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/>
+ <anim:animateTransform smil:begin="1.808" smil:dur="0.026" smil:to="1,0.95" svg:type="scale"/>
+ <anim:animateTransform smil:begin="1.834" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-movie-credits">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="15" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="15" smil:fill="hold" smil:attributeName="y" smil:values="y+1;y-1" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-curve-up">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animateTransform smil:begin="0" smil:dur="1" smil:fill="hold" smil:decelerate="0.5" smil:from="2.5,2.5" smil:to="1,1" svg:type="scale"/>
+ <anim:animateMotion smil:begin="0" smil:dur="1" smil:fill="hold" smil:decelerate="0.5" svg:path="M -0.46736 0.92887 C -0.37517 0.88508 -0.02552 0.75279 0.0908 0.66613 C 0.20747 0.57948 0.21649 0.50394 0.23177 0.40825 C 0.24705 0.31256 0.22118 0.15964 0.18264 0.09152 C 0.1441 0.02341 0.03802 0.0 0.0 0.0"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-flip" anim:iterate-type="by-letter" anim:iterate-interval="0.1s">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:begin="0" smil:dur="0.5" smil:fill="hold" smil:autoReverse="true" smil:attributeName="width" smil:by="(-width*2)"/>
+ <anim:animate smil:begin="0" smil:dur="0.5" smil:fill="hold" smil:decelerate="0.5" smil:autoReverse="true" smil:attributeName="x" smil:by="(width*0.50)"/>
+ <anim:animate smil:begin="0" smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:from="(-height/2)" smil:to="(y)"/>
+ <anim:animateTransform smil:begin="0" smil:dur="1" smil:fill="hold" smil:by="360" svg:type="rotate"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-float">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.8" smil:decelerate="1" smil:type="fade" smil:subtype="crossfade"/>
+ <anim:animate smil:dur="0.8" smil:fill="hold" smil:decelerate="1" smil:attributeName="rotate" smil:values="-90;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.8" smil:fill="hold" smil:decelerate="1" smil:attributeName="x" smil:values="x+0.4;x-0.05" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.8" smil:fill="hold" smil:decelerate="1" smil:attributeName="y" smil:values="y-0.4;y+0.1" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.8" smil:dur="0.2" smil:fill="hold" smil:accelerate="1" smil:attributeName="x" smil:values="x-0.05;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.8" smil:dur="0.2" smil:fill="hold" smil:accelerate="1" smil:attributeName="y" smil:values="y+0.1;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:text-only="true" smil:begin="0" smil:fill="hold" smil:accelerate="1" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-fold">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width*2.5;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height*0.01;height" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="height+1;y" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="1" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-glide">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width*0.05;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x-.2;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-breaks">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:begin="0" smil:dur="0.6" smil:fill="hold" smil:attributeName="x" smil:from="(-width/2)" smil:to="(x)"/>
+ <anim:animate smil:begin="0.6" smil:dur="0.2" smil:fill="hold" smil:decelerate="0.5" smil:autoReverse="true" smil:attributeName="skewX" smil:from="0" smil:to="-1"/>
+ <anim:animateTransform smil:begin="0.6" smil:dur="0.2" smil:fill="hold" smil:decelerate="1" smil:autoReverse="true" smil:from="1,1" smil:to="0.8,1" svg:type="scale"/>
+ <anim:animate smil:begin="0.6" smil:dur="0.2" smil:fill="hold" smil:decelerate="1" smil:autoReverse="true" smil:attributeName="x" smil:by="(height/3+width*0.1)" smil:additive="sum"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-magnify">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="0.77" smil:decelerate="1" smil:type="fade" smil:subtype="crossfade"/>
+ <anim:animateTransform smil:dur="0.77" smil:decelerate="1" smil:from="0.1,0.1" smil:to="2,4.5" svg:type="scale"/>
+ <anim:animateTransform smil:begin="0.77" smil:dur="1.23" smil:fill="hold" smil:accelerate="1" smil:from="2,4.5" smil:to="1,1" svg:type="scale"/>
+ <anim:set smil:dur="0.77" smil:fill="hold" smil:attributeName="x" smil:to="(0.5)"/>
+ <anim:animate smil:begin="0.77" smil:dur="1.23" smil:fill="hold" smil:accelerate="1" smil:attributeName="x" smil:from="(0.5)" smil:to="(x)"/>
+ <anim:set smil:dur="0.77" smil:fill="hold" smil:attributeName="y" smil:to="(y+0.4)"/>
+ <anim:animate smil:begin="0.77" smil:dur="1.23" smil:fill="hold" smil:accelerate="1" smil:attributeName="y" smil:from="(y+0.4)" smil:to="(y)"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-pinwheel">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:transitionFilter smil:dur="2" smil:type="fade" smil:subtype="crossfade"/>
+ <anim:animate smil:dur="2" smil:fill="hold" smil:attributeName="rotate" smil:values="720;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="2" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="2" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-sling">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="rotate" smil:values="90;90;90;0" smil:keyTimes="0;0.8;0.8;1"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="-1;0.949999988079071;x" smil:keyTimes="0;0.5;1"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-spiral-in">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="width" smil:values="0;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="height" smil:values="0;height" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="x" smil:values="0;1" smil:keyTimes="0;1" anim:formula="x+(cos(-2*pi*(1-$))*-x-sin(-2*pi*(1-$))*(1-y))*(1-$)"/>
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="y" smil:values="0;1" smil:keyTimes="0;1" anim:formula="y+(sin(-2*pi*(1-$))*-x+cos(-2*pi*(1-$))*(1-y))*(1-$)"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" smil:accelerate="0.5" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-falling-in" anim:iterate-type="by-letter" anim:iterate-interval="0.5s">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:set smil:begin="0" smil:dur="0.455" smil:fill="hold" smil:attributeName="rotate" smil:to="-45"/>
+ <anim:animate smil:begin="0.455" smil:dur="0.455" smil:fill="hold" smil:attributeName="rotate" smil:values="-45;45;0" smil:keyTimes="0;0.699;1"/>
+ <anim:animate smil:begin="0" smil:dur="0.455" smil:fill="hold" smil:attributeName="y" smil:values="y-1;y-(0.354*width-0.172*height)" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.455" smil:dur="0.156" smil:fill="hold" smil:decelerate="0.5" smil:autoReverse="true" smil:attributeName="y" smil:values="y-(0.354*width-0.172*height);y-(0.354*width-0.172*height)-height/2" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.864" smil:dur="0.136" smil:fill="hold" smil:attributeName="y" smil:values="y-(0.354*width-0.172*height);y" smil:keyTimes="0;1"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-swivel" pres:preset-sub-type="vertical">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="width" smil:values="0;1" smil:keyTimes="0;1" anim:formula="width*sin(2.5*pi*$)"/>
+ <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-swivel" pres:preset-sub-type="horizontal">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="width" smil:values="width;width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="5" smil:fill="hold" smil:attributeName="height" smil:values="0;1" smil:keyTimes="0;1" anim:formula="height*sin(2.5*pi*$)"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="1" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-thread">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height/20;height/20;height" smil:keyTimes="0;0.5;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width+.3;width+.3;width" smil:keyTimes="0;0.5;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x-.3;x;x" smil:keyTimes="0;0.5;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="entrance" pres:preset-id="ooo-entrance-whip" anim:iterate-type="by-letter" anim:iterate-interval="0.05s">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="visible"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="x" smil:values="x;x+.1;x" smil:keyTimes="0;0.5;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="height" smil:values="height/10;height+.01;height" smil:keyTimes="0;0.5;1"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" smil:attributeName="width" smil:values="width/10;width+.01;width" smil:keyTimes="0;0.5;1"/>
+ <anim:transitionFilter smil:dur="0.5" smil:keySplines="0,0;0.5,1;1,1" smil:type="fade" smil:subtype="crossfade"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="FillColor;ColorStyle;Accelerate;Decelerate;AutoReverse" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-fill-color" pres:preset-sub-type="2">
+ <anim:animateColor smil:dur="2" smil:fill="hold" smil:attributeName="fill-color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:set smil:dur="2" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="FontStyle" pres:text-only="true" smil:begin="0" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-font">
+ <anim:set smil:dur="indefinite" anim:sub-item="text" smil:attributeName="font-family" smil:to="Times New Roman"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="CharColor;ColorStyle;Accelerate;Decelerate;AutoReverse" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-font-color" pres:preset-sub-type="2">
+ <anim:animateColor smil:dur="2" smil:fill="hold" anim:sub-item="text" smil:attributeName="color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="CharHeight" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-font-size" pres:preset-sub-type="2">
+ <anim:animate smil:dur="2" smil:fill="hold" anim:sub-item="text" smil:attributeName="font-size" smil:to="1.5pt"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="CharDecoration" pres:text-only="true" smil:begin="0" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-font-style" pres:preset-sub-type="1">
+ <anim:set smil:dur="indefinite" anim:sub-item="text" smil:attributeName="font-style" smil:to="normal"/>
+ <anim:set smil:dur="indefinite" anim:sub-item="text" smil:attributeName="font-weight" smil:to="bold"/>
+ <anim:set smil:dur="indefinite" anim:sub-item="text" smil:attributeName="text-underline" smil:to="none"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="LineColor;ColorStyle;Accelerate;Decelerate;AutoReverse" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-line-color" pres:preset-sub-type="2">
+ <anim:animateColor smil:dur="2" smil:fill="hold" smil:attributeName="stroke-color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:set smil:dur="2" smil:fill="hold" smil:attributeName="stroke" smil:to="solid"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Scale;Accelerate;Decelerate;AutoReverse" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-grow-and-shrink">
+ <anim:animateTransform smil:dur="2" smil:fill="hold" smil:by="1.5,1.5" svg:type="scale"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Rotate;Accelerate;Decelerate;AutoReverse" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-spin">
+ <anim:animateTransform smil:dur="2" smil:fill="hold" smil:by="360" svg:type="rotate"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Transparency" smil:begin="0" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-transparency">
+ <anim:set smil:dur="indefinite" smil:attributeName="opacity" smil:to="0.5"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-bold-flash">
+ <anim:animate smil:dur="2" smil:fill="hold" anim:sub-item="text" smil:attributeName="font-weight" smil:values="normal;bold;normal;normal" smil:keyTimes="0;0.5;0.6;1" smil:calcMode="discrete"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:preset-property="Color" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-color-over-by-word" anim:iterate-type="by-letter" anim:iterate-interval="0.2s">
+ <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:to="#333399"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:to="#333399"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-reveal-underline" anim:iterate-type="by-letter" anim:iterate-interval="0.2s">
+ <anim:set smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="text-underline" smil:to="solid"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Color" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-color-blend">
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:preset-property="Color" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-color-over-by-letter" anim:iterate-type="by-letter" anim:iterate-interval="0.05s">
+ <anim:set smil:dur="0.5" smil:fill="hold" smil:autoReverse="true" smil:attributeName="color" smil:to="#333399"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" smil:autoReverse="true" smil:attributeName="fill-color" smil:to="#333399"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" smil:autoReverse="true" smil:attributeName="fill" smil:to="solid"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-complementary-color">
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:by="hsl(120,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:by="hsl(120,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="stroke-color" smil:by="hsl(120,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-complementary-color-2">
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:by="hsl(-120,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:by="hsl(-120,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="stroke-color" smil:by="hsl(-120,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-contrasting-color">
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:by="hsl(180,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:by="hsl(180,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="stroke-color" smil:by="hsl(180,0%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-darken">
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:by="hsl(0,-12%,-25%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="counterclockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:by="hsl(0,-12%,-25%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="counterclockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="stroke-color" smil:by="hsl(0,-12%,-25%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="counterclockwise"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-desaturate">
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:by="hsl(0,-70%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:by="hsl(0,-70%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="stroke-color" smil:by="hsl(0,-70%,0%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="clockwise"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-flash-bulb">
+ <anim:transitionFilter smil:dur="0.5" smil:keySplines="0,0;0.2,0.5;0.8,0.5;1,0" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:animateTransform smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:by="1.05,1.05" svg:type="scale"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-lighten">
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="color" smil:by="hsl(0,12%,25%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="counterclockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="fill-color" smil:by="hsl(0,12%,25%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="counterclockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" smil:attributeName="stroke-color" smil:by="hsl(0,12%,25%)" anim:color-interpolation="hsl" anim:color-interpolation-direction="counterclockwise"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Color" smil:begin="0" smil:fill="remove" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-vertical-highlight">
+ <anim:animateColor smil:begin="0" smil:dur="1.5" smil:fill="hold" smil:accelerate="0.5" smil:autoReverse="true" smil:attributeName="color" smil:to="#333399" smil:keySplines="0,0;0.33333,1;1,1" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:begin="0" smil:dur="1.5" smil:fill="hold" smil:accelerate="0.5" smil:autoReverse="true" smil:attributeName="fill-color" smil:to="#333399" smil:keySplines="0,0;0.33333,1;1,1" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:set smil:dur="3" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/>
+ <anim:animateTransform smil:begin="0" smil:dur="1.5" smil:fill="hold" smil:accelerate="0.5" smil:autoReverse="true" smil:from="1,1" smil:to="1,1.4" smil:keySplines="0,0;0.33333,1;1,1" svg:type="scale"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Color" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-flicker">
+ <anim:animateColor smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:attributeName="color" smil:to="#ffffff" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:attributeName="fill-color" smil:to="#ffffff" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:set smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:attributeName="fill" smil:to="solid"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:preset-property="Color" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-grow-with-color" anim:iterate-type="by-letter" anim:iterate-interval="0.05s">
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="fill-color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="fill" smil:to="solid"/>
+ <anim:animate smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="font-size" smil:to="1.5pt"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-shimmer" anim:iterate-type="by-letter" anim:iterate-interval="0.025s">
+ <anim:animateTransform smil:begin="0" smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:to="0.8,1" svg:type="scale"/>
+ <anim:animate smil:begin="0" smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:attributeName="x" smil:by="(width*0.10)"/>
+ <anim:animate smil:begin="0" smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:attributeName="y" smil:by="(-width*0.10)"/>
+ <anim:animateTransform smil:begin="0" smil:dur="0.25" smil:fill="hold" smil:autoReverse="true" smil:by="-8" svg:type="rotate"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Color" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-teeter">
+ <anim:animateColor smil:dur="0.1" smil:fill="hold" smil:attributeName="color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:dur="0.1" smil:fill="hold" smil:attributeName="fill-color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:set smil:dur="0.1" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/>
+ <anim:animateTransform smil:begin="0" smil:dur="0.1" smil:fill="hold" smil:by="2" svg:type="rotate"/>
+ <anim:animateTransform smil:begin="0.2" smil:dur="0.2" smil:fill="hold" smil:by="-4" svg:type="rotate"/>
+ <anim:animateTransform smil:begin="0.4" smil:dur="0.2" smil:fill="hold" smil:by="4" svg:type="rotate"/>
+ <anim:animateTransform smil:begin="0.6" smil:dur="0.2" smil:fill="hold" smil:by="-4" svg:type="rotate"/>
+ <anim:animateTransform smil:begin="0.8" smil:dur="0.2" smil:fill="hold" smil:by="2" svg:type="rotate"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Color" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-blast">
+ <anim:animateColor smil:begin="0.1" smil:dur="1.9" smil:fill="hold" smil:attributeName="color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:animateColor smil:begin="0.1" smil:dur="1.9" smil:fill="hold" smil:attributeName="fill-color" smil:to="#333399" anim:color-interpolation="rgb" anim:color-interpolation-direction="clockwise"/>
+ <anim:set smil:begin="0.1" smil:dur="1.9" smil:fill="hold" smil:attributeName="fill" smil:to="solid"/>
+ <anim:animateTransform smil:begin="0" smil:dur="0.2" smil:fill="hold" smil:from="1,1" smil:to="1,0.05" svg:type="scale"/>
+ <anim:animateTransform smil:begin="0.2" smil:dur="0.2" smil:fill="hold" smil:from="1,0.05" smil:to="1.2,1.5" svg:type="scale"/>
+ <anim:animateTransform smil:begin="1.4" smil:dur="0.6" smil:fill="hold" smil:to="1.2,1.5" svg:type="scale"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-blink">
+ <anim:animate smil:dur="1" smil:fill="hold" smil:attributeName="visibility" smil:values="hidden;visible" smil:keyTimes="0;0.5" smil:calcMode="discrete"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-bold-reveal" anim:iterate-type="by-letter" anim:iterate-interval="0.025s">
+ <anim:set smil:dur="indefinite" anim:sub-item="text" smil:attributeName="font-weight" smil:to="bold"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Color" pres:text-only="true" smil:begin="0" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-style-emphasis">
+ <anim:set smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="color" smil:to="#333399"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="font-style" smil:to="italic"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="font-weight" smil:to="bold"/>
+ <anim:set smil:dur="0.5" smil:fill="hold" anim:sub-item="text" smil:attributeName="text-underline" smil:to="solid"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="ooo-emphasis-wave" anim:iterate-type="by-letter" anim:iterate-interval="0.05s">
+ <anim:animateMotion smil:begin="0" smil:dur="0.25" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" smil:autoReverse="true" svg:path="M 0.0 0.0 L 0.0 -0.07213"/>
+ <anim:animateTransform smil:begin="0" smil:dur="0.125" smil:fill="hold" smil:by="25" svg:type="rotate"/>
+ <anim:animateTransform smil:begin="0.125" smil:dur="0.125" smil:fill="hold" smil:by="-25" svg:type="rotate"/>
+ <anim:animateTransform smil:begin="0.25" smil:dur="0.125" smil:fill="hold" smil:by="-25" svg:type="rotate"/>
+ <anim:animateTransform smil:begin="0.375" smil:dur="0.125" smil:fill="hold" smil:by="25" svg:type="rotate"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-venetian-blinds" pres:preset-sub-type="vertical">
+ <anim:transitionFilter smil:dur="0.5" smil:type="blindsWipe" smil:subtype="horizontal" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-venetian-blinds" pres:preset-sub-type="horizontal">
+ <anim:transitionFilter smil:dur="0.5" smil:type="blindsWipe" smil:subtype="vertical" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-box" pres:preset-sub-type="in">
+ <anim:transitionFilter smil:dur="0.5" smil:type="irisWipe" smil:subtype="rectangle" smil:mode="out" smil:direction="reverse"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-box" pres:preset-sub-type="out">
+ <anim:transitionFilter smil:dur="0.5" smil:type="irisWipe" smil:subtype="rectangle" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-checkerboard" pres:preset-sub-type="across">
+ <anim:transitionFilter smil:dur="0.5" smil:type="checkerBoardWipe" smil:subtype="across" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-checkerboard" pres:preset-sub-type="downward">
+ <anim:transitionFilter smil:dur="0.5" smil:type="checkerBoardWipe" smil:subtype="down" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-circle" pres:preset-sub-type="in">
+ <anim:transitionFilter smil:dur="2" smil:type="ellipseWipe" smil:subtype="horizontal" smil:mode="out" smil:direction="reverse"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-circle" pres:preset-sub-type="out">
+ <anim:transitionFilter smil:dur="2" smil:type="ellipseWipe" smil:subtype="horizontal" smil:mode="out"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-crawl-out" pres:preset-sub-type="to-bottom">
+ <anim:animate smil:dur="5" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="5" smil:attributeName="y" smil:values="y;1+height/2" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="4.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-crawl-out" pres:preset-sub-type="to-left">
+ <anim:animate smil:dur="5" smil:attributeName="x" smil:values="x;0-width/2" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="4.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-crawl-out" pres:preset-sub-type="to-right">
+ <anim:animate smil:dur="5" smil:attributeName="x" smil:values="x;1+width/2" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="4.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-crawl-out" pres:preset-sub-type="to-top">
+ <anim:animate smil:dur="5" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="5" smil:attributeName="y" smil:values="y;0-height/2" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="4.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-diamond" pres:preset-sub-type="in">
+ <anim:transitionFilter smil:dur="2" smil:type="irisWipe" smil:subtype="diamond" smil:mode="out" smil:direction="reverse"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-diamond" pres:preset-sub-type="out">
+ <anim:transitionFilter smil:dur="2" smil:type="irisWipe" smil:subtype="diamond" smil:mode="out"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-disappear">
+ <anim:set smil:begin="0" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-dissolve">
+ <anim:transitionFilter smil:dur="0.5" smil:type="dissolve" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-flash-once">
+ <anim:animate smil:dur="1" smil:attributeName="visibility" smil:values="hidden;visible" smil:keyTimes="0;0.5" smil:calcMode="discrete"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-bottom">
+ <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;1+height/2" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-left">
+ <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;0-width/2" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-right">
+ <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;1+width/2" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-top">
+ <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;0-height/2" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-bottom-left">
+ <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;0-width/2" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;1+height/2" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-bottom-right">
+ <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;1+width/2" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;1+height/2" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-top-left">
+ <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;0-width/2" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;0-height/2" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fly-out" pres:preset-sub-type="to-top-right">
+ <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;1+width/2" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;0-height/2" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-peek-out" pres:preset-sub-type="from-bottom">
+ <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromBottom" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-peek-out" pres:preset-sub-type="from-left">
+ <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromLeft" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-peek-out" pres:preset-sub-type="from-right">
+ <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromRight" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-peek-out" pres:preset-sub-type="from-top">
+ <anim:transitionFilter smil:dur="0.5" smil:type="slideWipe" smil:subtype="fromTop" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-plus" pres:preset-sub-type="in">
+ <anim:transitionFilter smil:dur="2" smil:type="fourBoxWipe" smil:subtype="cornersIn" smil:mode="out"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-plus" pres:preset-sub-type="out">
+ <anim:transitionFilter smil:dur="2" smil:type="fourBoxWipe" smil:subtype="cornersIn" smil:mode="out" smil:direction="reverse"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-random-bars" pres:preset-sub-type="vertical">
+ <anim:transitionFilter smil:dur="0.5" smil:type="randomBarWipe" smil:subtype="horizontal" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-random-bars" pres:preset-sub-type="horizontal">
+ <anim:transitionFilter smil:dur="0.5" smil:type="randomBarWipe" smil:subtype="vertical" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-random"/>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-split" pres:preset-sub-type="horizontal-in">
+ <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="horizontal" smil:mode="out" smil:direction="reverse"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-split" pres:preset-sub-type="horizontal-out">
+ <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="horizontal" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-split" pres:preset-sub-type="vertical-in">
+ <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="vertical" smil:mode="out" smil:direction="reverse"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-split" pres:preset-sub-type="vertical-out">
+ <anim:transitionFilter smil:dur="0.5" smil:type="barnDoorWipe" smil:subtype="vertical" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-diagonal-squares" pres:preset-sub-type="left-to-bottom">
+ <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalLeft" smil:mode="out" smil:direction="reverse"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-diagonal-squares" pres:preset-sub-type="left-to-top">
+ <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalRight" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-diagonal-squares" pres:preset-sub-type="right-to-bottom">
+ <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalRight" smil:mode="out" smil:direction="reverse"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-diagonal-squares" pres:preset-sub-type="right-to-top">
+ <anim:transitionFilter smil:dur="0.5" smil:type="waterfallWipe" smil:subtype="horizontalLeft" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wedge">
+ <anim:transitionFilter smil:dur="2" smil:type="fanWipe" smil:subtype="centerTop" smil:mode="out"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wheel" pres:preset-sub-type="1">
+ <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="oneBlade" smil:mode="out"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wheel" pres:preset-sub-type="2">
+ <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="twoBladeVertical" smil:mode="out"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wheel" pres:preset-sub-type="3">
+ <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="threeBlade" smil:mode="out"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wheel" pres:preset-sub-type="4">
+ <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="fourBlade" smil:mode="out"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Spokes" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wheel" pres:preset-sub-type="8">
+ <anim:transitionFilter smil:dur="2" smil:type="pinWheelWipe" smil:subtype="eightBlade" smil:mode="out"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wipe" pres:preset-sub-type="from-bottom">
+ <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="topToBottom" smil:mode="out" smil:direction="reverse"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wipe" pres:preset-sub-type="from-left">
+ <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="leftToRight" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wipe" pres:preset-sub-type="from-right">
+ <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="leftToRight" smil:mode="out" smil:direction="reverse"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-wipe" pres:preset-sub-type="from-top">
+ <anim:transitionFilter smil:dur="0.5" smil:type="barWipe" smil:subtype="topToBottom" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-contract">
+ <anim:animate smil:dur="1" smil:attributeName="width" smil:values="width;width*0.70" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fade-out">
+ <anim:transitionFilter smil:dur="2" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fade-out-and-swivel" anim:iterate-type="by-letter" anim:iterate-interval="0.2s">
+ <anim:transitionFilter smil:dur="2" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:animate smil:dur="2" smil:attributeName="width" smil:values="width;0.92*width;0.71*width;0.38*width;0;-0.38*width;-0.71*width;-0.92*width;-width;-0.92*width;-0.71*width;-0.38*width;0;0.38*width;0.71*width;0.92*width;width;0.92*width;0.71*width;0.38*width;0" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/>
+ <anim:animate smil:dur="2" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fade-out-and-zoom">
+ <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-ascend">
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="y" smil:values="y;y-.1" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-center-revolve">
+ <anim:animate smil:begin="0" smil:dur="0.6" smil:decelerate="0.5" smil:attributeName="x" smil:values="x;x+0.0242;x+0.0479;x+0.0704;x+0.0911;x+0.1096;x+0.1254;x+0.1381;x+0.1474;x+0.1531;x+0.155;x+0.1531;x+0.1474;x+0.1381;x+0.1254;x+0.1096;x+0.0911;x+0.0704;x+0.0479;x+0.0242;x" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/>
+ <anim:animate smil:begin="0.6" smil:dur="0.4" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0" smil:dur="0.6" smil:decelerate="0.5" smil:attributeName="y" smil:values="y;y+0.0019;y+0.0076;y+0.0169;y+0.0296;y+0.0454;y+0.0639;y+0.0846;y+0.1071;y+0.1307;y+0.155;y+0.1792;y+0.2029;y+0.2253;y+0.2461;y+0.2646;y+0.2804;y+0.2931;y+0.3024;y+0.308;y+0.31" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/>
+ <anim:animate smil:begin="0.6" smil:dur="0.4" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:begin="0.9" smil:dur="0.1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-collapse" pres:preset-sub-type="across">
+ <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:preset-property="Color1;Color2" pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-colored-lettering" anim:iterate-type="by-letter" anim:iterate-interval="0.04s">
+ <anim:animate smil:dur="0.08" smil:attributeName="color" smil:values="#009999;#333399" smil:keyTimes="0;0.5" smil:calcMode="discrete"/>
+ <anim:animate smil:dur="0.08" smil:attributeName="fill-color" smil:values="#009999;#333399" smil:keyTimes="0;0.5" smil:calcMode="discrete"/>
+ <anim:set smil:dur="0.08" smil:attributeName="fill" smil:to="solid"/>
+ <anim:set smil:begin="0.079" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-descend">
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="y" smil:values="y;y+.1" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-ease-out">
+ <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;x-.2" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-turn-and-grow" anim:iterate-type="by-letter" anim:iterate-interval="0.05s">
+ <anim:animate smil:dur="1" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="rotate" smil:values="0;90" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-sink-down">
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.1" smil:decelerate="1" smil:attributeName="y" smil:values="y;y-.03" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.1" smil:dur="0.9" smil:accelerate="1" smil:attributeName="y" smil:values="y;y+1" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="1" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-spin-out">
+ <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="rotate" smil:values="0;360" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="1" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-stretchy">
+ <anim:animate smil:dur="1" smil:attributeName="width" smil:values="width;width+.3" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-unfold" anim:iterate-type="by-letter" anim:iterate-interval="0.1s">
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;x-.1" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-zoom" pres:preset-sub-type="out">
+ <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-zoom" pres:preset-sub-type="544">
+ <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;0.5" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;0.5" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-zoom" pres:preset-sub-type="out-slightly">
+ <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;2/3*width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;2/3*height" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-zoom" pres:preset-sub-type="in">
+ <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;4*width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;4*height" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-zoom" pres:preset-sub-type="20">
+ <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;(6*min(max(width*height,.3),1)-7.4)/-.7*width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;(6*min(max(width*height,.3),1)-7.4)/-.7*height" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;1+(6*min(max(width*height,.3),1)-7.4)/-.7*height/2" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Zoom" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-zoom" pres:preset-sub-type="in-slightly">
+ <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;4/3*width" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;4/3*height" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-boomerang">
+ <anim:transitionFilter smil:begin="0" smil:dur="1" smil:accelerate="0.5" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:animate smil:begin="0" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="y" smil:values="y;y+.1" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.5" smil:dur="0.5" smil:decelerate="0.5" smil:attributeName="y" smil:values="y;y-.1" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.5" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="x" smil:values="x;x+.4" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="width" smil:values="width;width*.05" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.5" smil:dur="0.5" smil:decelerate="0.5" smil:attributeName="width" smil:values="width;width/.05" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.5" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="rotate" smil:values="0;-90" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-boomerang">
+ <anim:transitionFilter smil:begin="0" smil:dur="1" smil:accelerate="0.5" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:animate smil:begin="0" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="y" smil:values="y;y+.1" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.5" smil:dur="0.5" smil:decelerate="0.5" smil:attributeName="y" smil:values="y;y-.1" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.5" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="x" smil:values="x;x+.4" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="width" smil:values="width;width*.05" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.5" smil:dur="0.5" smil:decelerate="0.5" smil:attributeName="width" smil:values="width;width/.05" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.5" smil:dur="0.5" smil:accelerate="0.5" smil:attributeName="rotate" smil:values="0;-90" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-bounce">
+ <anim:transitionFilter smil:begin="1.82" smil:dur="0.18" smil:accelerate="0.5" smil:type="barWipe" smil:subtype="topToBottom" smil:mode="out"/>
+ <anim:animate smil:begin="0" smil:dur="1.822" smil:attributeName="x" smil:values="x;x+0.25" smil:keyTimes="0;1" smil:keySplines="0,0;0.14,0.31;0.43,0.73;0.71,0.91;1,1"/>
+ <anim:animate smil:begin="1.822" smil:dur="0.178" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0" smil:dur="0.664" smil:attributeName="y" smil:values="y;y+0.026;y+0.052;y+0.078;y+0.103;y+0.151;y+0.196;y+0.236;y+0.270;y+0.297;y+0.317;y+0.329;y+0.333" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.3;0.4;0.5;0.6;0.7;0.8;0.9;1" smil:keySplines="0,0;0.25,0.07;0.5,0.2;0.75,0.467;1,1"/>
+ <anim:animate smil:begin="0.664" smil:dur="0.664" smil:attributeName="y" smil:values="y;y-0.034;y-0.065;y-0.090;y-0.106;y-0.111;y-0.106;y-0.090;y-0.065;y-0.034;y" smil:keyTimes="0;0.1;0.2;0.3;0.4;0.5;0.6;0.7;0.8;0.9;1" smil:keySplines="0,0;0.125,0.2665;0.25,0.4;0.375,0.465;0.5,0.5;0.625,0.535;0.75,0.6;0.875,0.7335;1,1"/>
+ <anim:animate smil:begin="1.324" smil:dur="0.332" smil:attributeName="y" smil:values="y;y-0.011;y-0.022;y-0.030;y-0.035;y-0.037;y-0.035;y-0.030;y-0.022;y-0.011;y" smil:keyTimes="0;0.1;0.2;0.3;0.4;0.5;0.6;0.7;0.8;0.9;1" smil:keySplines="0,0;0.125,0.2665;0.25,0.4;0.375,0.465;0.5,0.5;0.625,0.535;0.75,0.6;0.875,0.7335;1,1"/>
+ <anim:animate smil:begin="1.656" smil:dur="0.164" smil:attributeName="y" smil:values="y;y-0.004;y-0.007;y-0.010;y-0.012;y-0.0123;y-0.012;y-0.010;y-0.007;y-0.004;y" smil:keyTimes="0;0.1;0.2;0.3;0.4;0.5;0.6;0.7;0.8;0.9;1" smil:keySplines="0,0;0.125,0.2665;0.25,0.4;0.375,0.465;0.5,0.5;0.625,0.535;0.75,0.6;0.875,0.7335;1,1"/>
+ <anim:animate smil:begin="1.82" smil:dur="0.18" smil:accelerate="0.5" smil:attributeName="y" smil:values="y;y+height" smil:keyTimes="0;1"/>
+ <anim:animateTransform smil:begin="0.62" smil:dur="0.026" smil:to="1,0.6" svg:type="scale"/>
+ <anim:animateTransform smil:begin="0.646" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/>
+ <anim:animateTransform smil:begin="1.312" smil:dur="0.026" smil:to="1,0.8" svg:type="scale"/>
+ <anim:animateTransform smil:begin="1.338" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/>
+ <anim:animateTransform smil:begin="1.642" smil:dur="0.026" smil:to="1,0.9" svg:type="scale"/>
+ <anim:animateTransform smil:begin="1.668" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/>
+ <anim:animateTransform smil:begin="1.808" smil:dur="0.026" smil:to="1,0.95" svg:type="scale"/>
+ <anim:animateTransform smil:begin="1.834" smil:dur="0.166" smil:decelerate="0.5" smil:to="1,1" svg:type="scale"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-movie-credits">
+ <anim:animate smil:dur="15" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="15" smil:attributeName="y" smil:values="y-1;y+1" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="14.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-curve-down">
+ <anim:animateTransform smil:begin="0" smil:dur="1" smil:accelerate="0.5" smil:from="1,1" smil:to="2.5,2.5" svg:type="scale"/>
+ <anim:animateMotion smil:begin="0" smil:dur="1" smil:accelerate="0.5" svg:path="M 0.0000 0.0000 C 0.03802 0.0 0.1441 0.02341 0.1826 0.0915 C 0.22118 0.15964 0.24705 0.31256 0.2318 0.4083 C 0.21649 0.50394 0.20747 0.57948 0.0908 0.6661 C -0.02552 0.75279 -0.37517 0.88508 -0.4674 0.9289"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-flip" anim:iterate-type="by-letter" anim:iterate-interval="0.1s">
+ <anim:animate smil:begin="0" smil:dur="0.5" smil:autoReverse="true" smil:attributeName="width" smil:from="(width)" smil:to="(-width*2)"/>
+ <anim:animate smil:begin="0" smil:dur="0.5" smil:decelerate="0.5" smil:autoReverse="true" smil:attributeName="x" smil:by="(width*0.50)"/>
+ <anim:animate smil:begin="0" smil:dur="1" smil:attributeName="y" smil:from="(y)" smil:to="(1+height/2)"/>
+ <anim:animateTransform smil:begin="0" smil:dur="1" smil:by="360" svg:type="rotate"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-float">
+ <anim:transitionFilter smil:begin="0.2" smil:dur="0.8" smil:accelerate="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:animate smil:begin="0.2" smil:dur="0.8" smil:accelerate="1" smil:attributeName="rotate" smil:values="0;-90" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.2" smil:decelerate="1" smil:attributeName="x" smil:values="x;x-0.05" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.2" smil:decelerate="1" smil:attributeName="y" smil:values="y;y+0.1" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.2" smil:dur="0.8" smil:accelerate="1" smil:attributeName="x" smil:values="x;x+0.4+0.05" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0.2" smil:dur="0.8" smil:accelerate="1" smil:attributeName="y" smil:values="y;y-0.4-0.1" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:text-only="true" smil:begin="0" smil:fill="hold" smil:decelerate="1" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-fold">
+ <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;width*2.5" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;height*0.01" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;x" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;height+1" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:decelerate="1" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-glide">
+ <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;width*0.05" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;x-.2" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="0.5" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-breaks">
+ <anim:animate smil:begin="0" smil:dur="1" smil:attributeName="x" smil:from="(x)" smil:to="(x+1)"/>
+ <anim:animate smil:begin="0" smil:dur="0.2" smil:accelerate="0.5" smil:attributeName="skewX" smil:from="0" smil:to="-1"/>
+ <anim:set smil:begin="0.2" smil:dur="0.8" smil:attributeName="skewX" smil:to="-1"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-magnify">
+ <anim:transitionFilter smil:begin="1.23" smil:dur="0.77" smil:accelerate="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:animateTransform smil:begin="1.23" smil:dur="0.77" smil:accelerate="1" smil:from="2,4.5" smil:to="0.1,0.1" svg:type="scale"/>
+ <anim:animateTransform smil:dur="1.23" smil:decelerate="1" smil:from="1,1" smil:to="2,4.5" svg:type="scale"/>
+ <anim:animate smil:dur="1.23" smil:decelerate="1" smil:attributeName="x" smil:from="(x)" smil:to="(0.5)"/>
+ <anim:animate smil:begin="1.23" smil:dur="0.77" smil:attributeName="x" smil:from="(0.5)" smil:to="(0.5)"/>
+ <anim:animate smil:dur="1.23" smil:decelerate="1" smil:attributeName="y" smil:from="(y)" smil:to="(y+0.4)"/>
+ <anim:animate smil:begin="1.23" smil:dur="0.77" smil:attributeName="y" smil:from="(y)" smil:to="(y)"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-pinwheel">
+ <anim:transitionFilter smil:dur="2" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:animate smil:dur="2" smil:attributeName="rotate" smil:values="0;720" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="2" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="2" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="1.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-sling">
+ <anim:animate smil:dur="1" smil:attributeName="rotate" smil:values="0;90;90;90" smil:keyTimes="0;0.2;0.2;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;0.949999988079071;-1" smil:keyTimes="0;0.5;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:transitionFilter smil:dur="1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-spiral-out">
+ <anim:animate smil:dur="1" smil:attributeName="width" smil:values="width;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="height" smil:values="height;0" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="x" smil:values="x;x+-0.0500*(x*0.9511+(1-y)*0.3090);x+-0.1000*(x*0.8090+(1-y)*0.5878);x+-0.1500*(x*0.5878+(1-y)*0.8090);x+-0.2000*(x*0.3090+(1-y)*0.9511);x+-0.2500*(x*-0.0000+(1-y)*1.0000);x+-0.3000*(x*-0.3090+(1-y)*0.9511);x+-0.3500*(x*-0.5878+(1-y)*0.8090);x+-0.4000*(x*-0.8090+(1-y)*0.5878);x+-0.4500*(x*-0.9511+(1-y)*0.3090);x+-0.5000*(x*-1.0000+(1-y)*-0.0000);x+-0.5500*(x*-0.9511+(1-y)*-0.3090);x+-0.6000*(x*-0.8090+(1-y)*-0.5878);x+-0.6500*(x*-0.5878+(1-y)*-0.8090);x+-0.7000*(x*-0.3090+(1-y)*-0.9511);x+-0.7500*(x*0.0000+(1-y)*-1.0000);x+-0.8000*(x*0.3090+(1-y)*-0.9511);x+-0.8500*(x*0.5878+(1-y)*-0.8090);x+-0.9000*(x*0.8090+(1-y)*-0.5878);x+-0.9500*(x*0.9511+(1-y)*-0.3090);x+-1.0000*(x*1.0000+(1-y)*0.0000)" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/>
+ <anim:animate smil:dur="1" smil:attributeName="y" smil:values="y;y+-0.0500*(x*0.3090-(1-y)*0.9511);y+-0.1000*(x*0.5878-(1-y)*0.8090);y+-0.1500*(x*0.8090-(1-y)*0.5878);y+-0.2000*(x*0.9511-(1-y)*0.3090);y+-0.2500*(x*1.0000-(1-y)*-0.0000);y+-0.3000*(x*0.9511-(1-y)*-0.3090);y+-0.3500*(x*0.8090-(1-y)*-0.5878);y+-0.4000*(x*0.5878-(1-y)*-0.8090);y+-0.4500*(x*0.3090-(1-y)*-0.9511);y+-0.5000*(x*-0.0000-(1-y)*-1.0000);y+-0.5500*(x*-0.3090-(1-y)*-0.9511);y+-0.6000*(x*-0.5878-(1-y)*-0.8090);y+-0.6500*(x*-0.8090-(1-y)*-0.5878);y+-0.7000*(x*-0.9511-(1-y)*-0.3090);y+-0.7500*(x*-1.0000-(1-y)*0.0000);y+-0.8000*(x*-0.9511-(1-y)*0.3090);y+-0.8500*(x*-0.8090-(1-y)*0.5878);y+-0.9000*(x*-0.5878-(1-y)*0.8090);y+-0.9500*(x*-0.3090-(1-y)*0.9511);y+-1.0000*(x*0.0000-(1-y)*1.0000)" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" smil:accelerate="0.5" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-swish" anim:iterate-type="by-letter" anim:iterate-interval="0.5s">
+ <anim:animate smil:begin="0" smil:dur="1" smil:attributeName="rotate" smil:values="0;45" smil:keyTimes="0;1"/>
+ <anim:animate smil:begin="0" smil:dur="1" smil:attributeName="y" smil:values="y;y+1" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par pres:preset-property="Direction" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-swivel" pres:preset-sub-type="vertical">
+ <anim:animate smil:dur="5" smil:attributeName="height" smil:values="height;height" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="5" smil:attributeName="width" smil:values="width;0.92*width;0.71*width;0.38*width;0;-0.38*width;-0.71*width;-0.92*width;-width;-0.92*width;-0.71*width;-0.38*width;0;0.38*width;0.71*width;0.92*width;width;0.92*width;0.71*width;0.38*width;0" smil:keyTimes="0;0.05;0.1;0.15;0.2;0.25;0.3;0.35;0.4;0.45;0.5;0.55;0.6;0.65;0.7;0.75;0.8;0.85;0.9;0.95;1"/>
+ <anim:set smil:begin="4.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:decelerate="1" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-thread">
+ <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;height/20;height/20" smil:keyTimes="0;0.5;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;width+.3;width+.3" smil:keyTimes="0;0.5;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;x;x-.3" smil:keyTimes="0;0.5;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:iterate pres:text-only="true" smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="ooo-exit-whip" anim:iterate-type="by-letter" anim:iterate-interval="0.05s">
+ <anim:animate smil:dur="0.5" smil:attributeName="x" smil:values="x;x+.1;x" smil:keyTimes="0;0.5;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="y" smil:values="y;y" smil:keyTimes="0;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="height" smil:values="height;height+.01;height/10" smil:keyTimes="0;0.5;1"/>
+ <anim:animate smil:dur="0.5" smil:attributeName="width" smil:values="width;width+.01;width/10" smil:keyTimes="0;0.5;1"/>
+ <anim:transitionFilter smil:dur="0.5" smil:keySplines="0,0;0.5,0;1,1" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="0.499" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:iterate>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-4-point-star">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.091 -0.0453 L 0.125 -0.16655 L 0.158 -0.0453 L 0.249 0 L 0.158 0.0453 L 0.125 0.16655 L 0.091 0.0453 L 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-5-point-star">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.029 0.12125 L 0.125 0.12125 L 0.048 0.19586 L 0.077 0.31711 L 0 0.2425 L -0.077 0.31711 L -0.048 0.19586 L -0.125 0.12125 L -0.029 0.12125 L 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-6-point-star">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.036 0.08261 L 0.108 0.08261 L 0.072 0.16655 L 0.108 0.24916 L 0.036 0.24916 L 0 0.3331 L -0.036 0.24916 L -0.108 0.24916 L -0.072 0.16655 L -0.108 0.08261 L -0.036 0.08261 L 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-8-point-star">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.052 0 L 0.089 -0.0493 L 0.125 0 L 0.177 0 L 0.177 0.06929 L 0.213 0.11858 L 0.177 0.16655 L 0.177 0.23584 L 0.125 0.23584 L 0.089 0.2838 L 0.052 0.23584 L 0 0.23584 L 0 0.16655 L -0.037 0.11858 L 0 0.06929 L 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-circle">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.069 0 0.125 0.07461 0.125 0.16655 C 0.125 0.25849 0.069 0.3331 0 0.3331 C -0.069 0.3331 -0.125 0.25849 -0.125 0.16655 C -0.125 0.07461 -0.069 0 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-crescent-moon">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.014 -0.00666 -0.029 -0.01199 -0.044 -0.01199 C -0.114 -0.01199 -0.169 0.06396 -0.169 0.15589 C -0.169 0.2465 -0.114 0.32111 -0.044 0.32111 C -0.029 0.32111 -0.014 0.31711 0 0.31045 C -0.047 0.28647 -0.08 0.22651 -0.08 0.15589 C -0.08 0.08394 -0.047 0.02398 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-diamond">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.125 -0.11192 L 0.25 0 L 0.125 0.11192 L 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-equal-triangle">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.125 0.2878 L -0.125 0.2878 L 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-oval">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.03 -0.05063 0.075 -0.08261 0.125 -0.08261 C 0.175 -0.08261 0.22 -0.05063 0.25 0 C 0.22 0.05063 0.175 0.08261 0.125 0.08261 C 0.075 0.08261 0.03 0.05063 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-heart">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.012 -0.02398 0.033 -0.05863 0.058 -0.05863 C 0.095 -0.05863 0.125 -0.02265 0.125 0.02265 C 0.125 0.03731 0.122 0.05063 0.116 0.06262 C 0.117 0.06262 0 0.2425 0 0.24383 C 0 0.2425 -0.117 0.06262 -0.116 0.06262 C -0.122 0.05063 -0.125 0.03731 -0.125 0.02265 C -0.125 -0.02265 -0.095 -0.05863 -0.057 -0.05863 C -0.033 -0.05863 -0.012 -0.02398 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-hexagon">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.125 0 L 0.188 0.14523 L 0.125 0.28913 L 0 0.28913 L -0.063 0.14523 L 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-octagon">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.073 -0.09727 L 0.177 -0.09727 L 0.25 0 L 0.25 0.13857 L 0.177 0.23584 L 0.073 0.23584 L 0 0.13857 L 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-parallelogram">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.178 0 L 0.25 0.16122 L 0.072 0.16122 L 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-pentagon">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.125 0.12125 L 0.077 0.31711 L -0.077 0.31711 L -0.125 0.12125 L 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-right-triangle">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0 -0.19586 L 0.25 0 L 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-square">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.25 0 L 0.25 0.3331 L 0 0.3331 L 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-teardrop">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.001 0.0453 0.011 0.08661 0.028 0.11325 C 0.028 0.11459 0.055 0.15056 0.055 0.14923 C 0.07 0.16922 0.079 0.1972 0.079 0.22651 C 0.079 0.28514 0.044 0.33177 0 0.3331 C -0.044 0.33177 -0.079 0.28514 -0.079 0.22651 C -0.079 0.1972 -0.07 0.16922 -0.055 0.14923 C -0.055 0.15056 -0.028 0.11459 -0.028 0.11325 C -0.011 0.08661 -0.001 0.0453 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-trapezoid">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.167 0 L 0.21 0.22251 L -0.04 0.22251 L 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-arc-down">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.067 0.0533 C 0.081 0.06529 0.102 0.07195 0.124 0.07195 C 0.149 0.07195 0.169 0.06529 0.183 0.0533 L 0.25 0"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-arc-left">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L -0.04 0.08927 C -0.049 0.10793 -0.054 0.13591 -0.054 0.16522 C -0.054 0.19853 -0.049 0.22518 -0.04 0.24383 L 0 0.3331"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-arc-right">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.04 0.08927 C 0.049 0.10793 0.054 0.13591 0.054 0.16522 C 0.054 0.19853 0.049 0.22518 0.04 0.24383 L 0 0.3331"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-arc-up">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.067 -0.0533 C 0.081 -0.06529 0.102 -0.07195 0.124 -0.07195 C 0.149 -0.07195 0.169 -0.06529 0.183 -0.0533 L 0.25 0"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-bounce-left">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 c -0.004 -0.01066 -0.018 -0.02132 -0.023 -0.02132 c -0.031 0 -0.063 0.16655 -0.063 0.3331 c 0 -0.08394 -0.016 -0.16655 -0.031 -0.16655 c -0.016 0 -0.031 0.08394 -0.031 0.16655 c 0 -0.0413 -0.008 -0.08394 -0.016 -0.08394 c -0.008 0 -0.016 0.0413 -0.016 0.08394 c 0 -0.02132 -0.004 -0.0413 -0.008 -0.0413 c -0.004 0 -0.008 0.02132 -0.008 0.0413 c 0 -0.01066 -0.002 -0.02132 -0.004 -0.02132 c -0.001 0 -0.004 0.01066 -0.004 0.02132 c 0 -0.00533 -0.001 -0.01066 -0.002 -0.01066 c 0 -0.00133 -0.002 0.00533 -0.002 0.01066 c 0 -0.00266 0 -0.00533 -0.001 -0.00533 c 0 0.00133 -0.001 0.00266 -0.001 0.00533 c 0 -0.00133 0 -0.00266 0 -0.004 c -0.001 0 -0.001 0.00133 -0.001 0.00266 c -0.001 0 -0.001 -0.00133 -0.001 -0.00266 c -0.001 0 -0.001 0.00133 -0.001 0.00266"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-bounce-right">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 c 0.004 -0.01066 0.018 -0.02132 0.023 -0.02132 c 0.031 0 0.063 0.16655 0.063 0.3331 c 0 -0.08394 0.016 -0.16655 0.031 -0.16655 c 0.016 0 0.031 0.08394 0.031 0.16655 c 0 -0.0413 0.008 -0.08394 0.016 -0.08394 c 0.008 0 0.016 0.0413 0.016 0.08394 c 0 -0.02132 0.004 -0.0413 0.008 -0.0413 c 0.004 0 0.008 0.02132 0.008 0.0413 c 0 -0.01066 0.002 -0.02132 0.004 -0.02132 c 0.001 0 0.004 0.01066 0.004 0.02132 c 0 -0.00533 0.001 -0.01066 0.002 -0.01066 c 0 0.00133 0.002 0.00533 0.002 0.01066 c 0 -0.00266 0 -0.00533 0.001 -0.00533 c 0 0.00133 0.001 0.00266 0.001 0.00533 c 0 -0.00133 0 -0.00266 0 -0.004 c 0.001 0 0.001 0.00133 0.001 0.00266 c 0.001 0 0.001 -0.00133 0.001 -0.00266 c 0.001 0 0.001 0.00133 0.001 0.00266"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-curvy-left">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.008 0.01066 0.017 0.02132 0.021 0.03464 C 0.025 0.0493 0.027 0.06662 0.029 0.08394 C 0.031 0.10126 0.029 0.11592 0.027 0.13191 C 0.025 0.14656 0.022 0.16255 0.015 0.17588 C 0.009 0.1892 -0.001 0.19986 -0.012 0.20786 C -0.022 0.21585 -0.034 0.22118 -0.046 0.22384 C -0.058 0.22651 -0.07 0.22651 -0.081 0.22384 C -0.093 0.22118 -0.104 0.21452 -0.113 0.20386 C -0.122 0.19453 -0.13 0.18254 -0.134 0.16788 C -0.139 0.15456 -0.141 0.13591 -0.141 0.12125 C -0.142 0.10659 -0.141 0.08927 -0.136 0.07461 C -0.131 0.06129 -0.122 0.05063 -0.11 0.0453 C -0.098 0.0413 -0.086 0.04663 -0.078 0.05596 C -0.071 0.06529 -0.066 0.07994 -0.065 0.09727 C -0.065 0.11459 -0.066 0.13058 -0.071 0.1439 C -0.076 0.15722 -0.075 0.15989 -0.095 0.17721 C -0.113 0.19586 -0.131 0.19053 -0.142 0.19187 C -0.153 0.19187 -0.162 0.18654 -0.173 0.18121 C -0.185 0.17455 -0.195 0.16255 -0.202 0.15189 C -0.209 0.14124 -0.212 0.12791 -0.216 0.10659 C -0.219 0.08527 -0.219 0.07461 -0.219 0.05863 C -0.219 0.04264 -0.219 0.02665 -0.219 0.01066"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-curvy-right">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.008 0.01066 -0.017 0.02132 -0.021 0.03464 C -0.025 0.0493 -0.027 0.06662 -0.029 0.08394 C -0.031 0.10126 -0.029 0.11592 -0.027 0.13191 C -0.025 0.14656 -0.022 0.16255 -0.015 0.17588 C -0.009 0.1892 0.001 0.19986 0.012 0.20786 C 0.022 0.21585 0.034 0.22118 0.046 0.22384 C 0.058 0.22651 0.07 0.22651 0.081 0.22384 C 0.093 0.22118 0.104 0.21452 0.113 0.20386 C 0.122 0.19453 0.13 0.18254 0.134 0.16788 C 0.139 0.15456 0.141 0.13591 0.141 0.12125 C 0.142 0.10659 0.141 0.08927 0.136 0.07461 C 0.131 0.06129 0.122 0.05063 0.11 0.0453 C 0.098 0.0413 0.086 0.04663 0.078 0.05596 C 0.071 0.06529 0.066 0.07994 0.065 0.09727 C 0.065 0.11459 0.066 0.13058 0.071 0.1439 C 0.076 0.15722 0.075 0.15989 0.095 0.17721 C 0.113 0.19586 0.131 0.19053 0.142 0.19187 C 0.153 0.19187 0.162 0.18654 0.173 0.18121 C 0.185 0.17455 0.195 0.16255 0.202 0.15189 C 0.209 0.14124 0.212 0.12791 0.216 0.10659 C 0.219 0.08527 0.219 0.07461 0.219 0.05863 C 0.219 0.04264 0.219 0.02665 0.219 0.01066"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-decaying-wave">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.002 0.07062 0.007 0.16922 0.025 0.16788 C 0.051 0.16788 0.053 -0.16255 0.084 -0.16389 C 0.112 -0.16389 0.097 0.12525 0.124 0.12391 C 0.152 0.12391 0.137 -0.08527 0.167 -0.08527 C 0.194 -0.08527 0.179 0.05596 0.203 0.05596 C 0.226 0.05596 0.214 -0.05196 0.235 -0.05196 C 0.247 -0.05196 0.248 -0.02265 0.249 0"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-diagonal-down-right">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.25 0.3331"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-diagonal-up-right">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.25 -0.3331"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-down">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0 0.3331"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-funnel">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.001 0.03331 0.06 0.06262 0.137 0.06396 C 0.198 0.06662 0.248 0.05063 0.249 0.03065 C 0.249 0.01066 0.2 -0.00799 0.138 -0.00933 C 0.107 -0.00933 0.079 -0.00666 0.059 0 C 0.03 0.00933 0.013 0.02398 0.013 0.0413 C 0.013 0.05063 0.018 0.05996 0.027 0.06795 C 0.048 0.08527 0.089 0.09727 0.136 0.0986 C 0.191 0.10126 0.236 0.08661 0.236 0.06929 C 0.237 0.05063 0.192 0.03464 0.137 0.03198 C 0.109 0.03198 0.084 0.03464 0.065 0.03997 C 0.04 0.0493 0.024 0.06396 0.024 0.07861 C 0.024 0.08661 0.029 0.0946 0.037 0.1026 C 0.056 0.11725 0.092 0.12924 0.135 0.13058 C 0.185 0.13191 0.225 0.11858 0.225 0.1026 C 0.226 0.08661 0.186 0.07195 0.136 0.07062 C 0.111 0.06929 0.088 0.07195 0.071 0.07728 C 0.048 0.08527 0.035 0.09727 0.035 0.11192 C 0.035 0.11858 0.039 0.12658 0.046 0.13324 C 0.063 0.14656 0.096 0.15722 0.134 0.15856 C 0.179 0.15856 0.215 0.1479 0.215 0.13324 C 0.215 0.11858 0.18 0.10526 0.135 0.10393 C 0.113 0.10393 0.092 0.10659 0.077 0.11059 C 0.056 0.11725 0.044 0.12924 0.043 0.14124 C 0.043 0.1479 0.048 0.15456 0.054 0.15989 C 0.069 0.17321 0.099 0.18254 0.133 0.18254 C 0.173 0.18387 0.206 0.17455 0.206 0.16122 C 0.207 0.1479 0.174 0.13591 0.134 0.13457 C 0.114 0.13457 0.095 0.13591 0.082 0.14124 C 0.063 0.14656 0.052 0.15722 0.052 0.16788 C 0.052 0.17455 0.055 0.17988 0.061 0.1852 C 0.075 0.1972 0.101 0.20519 0.132 0.20652 C 0.169 0.20652 0.198 0.19853 0.198 0.18654 C 0.199 0.17455 0.17 0.16389 0.133 0.16255 C 0.115 0.16255 0.099 0.16389 0.087 0.16788 C 0.07 0.17321 0.06 0.18254 0.06 0.1932 C 0.06 0.19853 0.063 0.20253 0.068 0.20786 C 0.08 0.21851 0.104 0.22518 0.132 0.22651 C 0.165 0.22784 0.191 0.21985 0.191 0.20786 C 0.191 0.19853 0.166 0.18787 0.133 0.18787 C 0.116 0.18654 0.101 0.1892 0.09 0.19187 C 0.075 0.1972 0.066 0.20519 0.066 0.21452 C 0.066 0.21985 0.069 0.22384 0.074 0.22784 C 0.085 0.23717 0.107 0.24383 0.131 0.24516 C 0.161 0.2465 0.185 0.2385 0.185 0.22917 C 0.185 0.21851 0.161 0.21052 0.132 0.20919 C 0.118 0.20919 0.104 0.21052 0.094 0.21452 C 0.08 0.21851 0.072 0.22518 0.072 0.2345 C 0.072 0.2385 0.075 0.2425 0.079 0.2465 C 0.089 0.25449 0.108 0.26115 0.131 0.26115 C 0.157 0.26248 0.179 0.25582 0.179 0.2465 C 0.179 0.2385 0.158 0.23051 0.131 0.23051 C 0.119 0.22917 0.106 0.23051 0.097 0.23317 C 0.085 0.2385 0.078 0.24516 0.078 0.25183 C 0.078 0.25582 0.08 0.25982 0.084 0.26248 C 0.093 0.27048 0.11 0.27581 0.131 0.27714 C 0.155 0.27714 0.174 0.27048 0.174 0.26382 C 0.174 0.25582 0.155 0.24783 0.131 0.24783 C 0.119 0.24783 0.108 0.24916 0.101 0.25183 C 0.089 0.25449 0.083 0.26115 0.083 0.26781 C 0.083 0.27048 0.085 0.27448 0.088 0.27714 C 0.096 0.28514 0.112 0.28913 0.13 0.29046 C 0.152 0.29046 0.169 0.28514 0.169 0.27847 C 0.169 0.27048 0.152 0.26515 0.131 0.26382 C 0.12 0.26382 0.11 0.26515 0.103 0.26781 C 0.093 0.27048 0.087 0.27581 0.087 0.28247 C 0.087 0.28514 0.089 0.2878 0.092 0.29046"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-heartbeat">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.017 0 C 0.025 0 0.034 -0.01865 0.042 -0.02132 C 0.048 -0.02132 0.059 -0.004 0.064 -0.004 C 0.071 -0.004 0.078 -0.00933 0.091 -0.00933 L 0.1 -0.21585 L 0.11 0.03331 L 0.122 0 L 0.132 -0.00933 L 0.156 -0.00133 C 0.167 -0.00533 0.176 -0.02265 0.187 -0.02931 C 0.191 -0.03065 0.2 -0.03198 0.206 -0.02931 C 0.212 -0.02665 0.217 -0.00799 0.219 -0.00666 C 0.222 -0.00133 0.229 -0.00666 0.233 -0.004 L 0.239 0 L 0.25 0"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-left">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L -0.25 0"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-right">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.25 0"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-s-curve-1">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0 -0.04663 0.028 -0.08261 0.062 -0.08261 C 0.097 -0.08261 0.125 -0.04663 0.125 0 C 0.125 0.04663 0.153 0.08261 0.188 0.08261 C 0.222 0.08261 0.25 0.04663 0.25 0"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-s-curve-2">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0 0.04663 0.028 0.08261 0.062 0.08261 C 0.097 0.08261 0.125 0.04663 0.125 0 C 0.125 -0.04663 0.153 -0.08261 0.188 -0.08261 C 0.222 -0.08261 0.25 -0.04663 0.25 0"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-sine-wave">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.003 -0.02532 0.007 -0.0493 0.015 -0.0493 C 0.024 -0.0493 0.027 -0.02532 0.03 0 C 0.034 0.02798 0.037 0.05596 0.047 0.05596 C 0.056 0.05596 0.059 0.02798 0.063 0 C 0.065 -0.02532 0.069 -0.0493 0.078 -0.0493 C 0.086 -0.0493 0.09 -0.02532 0.093 0 C 0.096 0.02798 0.1 0.05596 0.109 0.05596 C 0.118 0.05596 0.125 0 0.125 0 C 0.128 -0.02532 0.131 -0.0493 0.14 -0.0493 C 0.149 -0.0493 0.152 -0.02532 0.155 0 C 0.159 0.02798 0.162 0.05596 0.172 0.05596 C 0.181 0.05596 0.184 0.02798 0.187 0 C 0.191 -0.02532 0.194 -0.0493 0.203 -0.0493 C 0.211 -0.0493 0.215 -0.02532 0.218 0 C 0.221 0.02798 0.225 0.05596 0.234 0.05596 C 0.243 0.05596 0.246 0.02798 0.25 0"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-spiral-left">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.004 -0.08927 -0.046 -0.16655 -0.113 -0.17188 C -0.177 -0.17854 -0.237 -0.11858 -0.241 -0.03198 C -0.246 0.04797 -0.204 0.12258 -0.144 0.12791 C -0.089 0.13191 -0.037 0.08261 -0.033 0.00799 C -0.029 -0.05996 -0.064 -0.12391 -0.115 -0.12924 C -0.162 -0.13324 -0.206 -0.09194 -0.209 -0.02931 C -0.212 0.02665 -0.184 0.08128 -0.142 0.08394 C -0.104 0.08794 -0.068 0.05596 -0.065 0.00533 C -0.063 -0.03997 -0.084 -0.08394 -0.117 -0.08661 C -0.146 -0.08927 -0.175 -0.06529 -0.177 -0.02665 C -0.179 0.00666 -0.164 0.03864 -0.14 0.0413 C -0.12 0.04397 -0.099 0.02931 -0.098 0.00266 C -0.096 -0.01865 -0.104 -0.0413 -0.119 -0.04397 C -0.131 -0.04397 -0.143 -0.03864 -0.145 -0.02398 C -0.146 -0.01466 -0.144 -0.00533 -0.138 -0.00133 C -0.135 0 -0.133 0 -0.13 -0.00133"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-spiral-right">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.004 -0.08927 0.046 -0.16655 0.113 -0.17188 C 0.177 -0.17854 0.237 -0.11858 0.241 -0.03198 C 0.246 0.04797 0.204 0.12258 0.144 0.12791 C 0.089 0.13191 0.037 0.08261 0.033 0.00799 C 0.029 -0.05996 0.064 -0.12391 0.115 -0.12924 C 0.162 -0.13324 0.206 -0.09194 0.209 -0.02931 C 0.212 0.02665 0.184 0.08128 0.142 0.08394 C 0.104 0.08794 0.068 0.05596 0.065 0.00533 C 0.063 -0.03997 0.084 -0.08394 0.117 -0.08661 C 0.146 -0.08927 0.175 -0.06529 0.177 -0.02665 C 0.179 0.00666 0.164 0.03864 0.14 0.0413 C 0.12 0.04397 0.099 0.02931 0.098 0.00266 C 0.096 -0.01865 0.104 -0.0413 0.119 -0.04397 C 0.131 -0.04397 0.143 -0.03864 0.145 -0.02398 C 0.146 -0.01466 0.144 -0.00533 0.138 -0.00133 C 0.135 0 0.133 0 0.13 -0.00133"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-spring">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.066 0.00799 -0.115 0.02798 -0.115 0.04397 C -0.115 0.05863 -0.067 0.06929 -0.003 0.06929 C 0.061 0.06929 0.115 0.05863 0.115 0.04397 C 0.115 0.02798 0.059 0.02398 -0.005 0.03464 C -0.068 0.04663 -0.115 0.06662 -0.115 0.08128 C -0.115 0.09593 -0.066 0.10793 -0.003 0.10793 C 0.061 0.10793 0.115 0.09593 0.115 0.08128 C 0.115 0.06662 0.059 0.06262 -0.004 0.07328 C -0.068 0.08394 -0.115 0.10393 -0.115 0.11858 C -0.115 0.13457 -0.066 0.14656 -0.002 0.14656 C 0.061 0.14656 0.115 0.13457 0.115 0.11858 C 0.115 0.10526 0.059 0.10126 -0.004 0.11059 C -0.067 0.12125 -0.115 0.14257 -0.115 0.15722 C -0.115 0.17188 -0.065 0.18387 -0.002 0.18387 C 0.063 0.18387 0.115 0.17188 0.115 0.15722 C 0.115 0.14257 0.06 0.13857 -0.003 0.14923 C -0.066 0.15989 -0.115 0.17988 -0.115 0.19453 C -0.115 0.21052 -0.065 0.22118 -0.001 0.22118 C 0.063 0.22118 0.115 0.20919 0.115 0.19453 C 0.115 0.17988 0.06 0.17588 -0.003 0.18654 C -0.066 0.1972 -0.115 0.21851 -0.115 0.23184 C -0.115 0.2465 -0.064 0.25849 -0.001 0.25849 C 0.063 0.25849 0.115 0.2465 0.115 0.23184 C 0.115 0.21851 0.061 0.21452 -0.003 0.22384 C -0.066 0.2345 -0.115 0.25582 -0.115 0.27048 C -0.115 0.2838 -0.064 0.29713 0 0.29713 C 0.064 0.29713 0.115 0.28514 0.115 0.27048 C 0.115 0.25582 0.061 0.25183 -0.002 0.26248 C -0.065 0.27314 -0.116 0.29313 -0.115 0.30779 C -0.114 0.32244 -0.064 0.3331 0 0.3331 C 0.064 0.3331 0.115 0.32111 0.115 0.30645 C 0.115 0.29313 0.063 0.28913 0 0.30112"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-stairs-down">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 l 0.036 0 l 0 0.04797 l 0.036 0 l 0 0.04797 l 0.036 0 l 0 0.04797 l 0.036 0 l 0 0.04797 l 0.036 0 l 0 0.04797 l 0.036 0 l 0 0.04797 l 0.036 0 l 0 0.04797"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-turn-down">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.125 0 C 0.181 0 0.25 0.09194 0.25 0.16655 L 0.25 0.3331"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-turn-down-right">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0 0.16655 C 0 0.24117 0.069 0.3331 0.125 0.3331 L 0.25 0.3331"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-turn-up">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.125 0 C 0.181 0 0.25 -0.09194 0.25 -0.16655 L 0.25 -0.3331"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-turn-up-right">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0 -0.16655 C 0 -0.24117 0.069 -0.3331 0.125 -0.3331 L 0.25 -0.3331"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-up">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0 -0.3331"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-wave">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.002 0.08394 0.009 0.1439 0.016 0.1439 C 0.023 0.1439 0.029 0.08394 0.031 0 C 0.034 0.08394 0.04 0.1439 0.047 0.1439 C 0.054 0.1439 0.06 0.08394 0.062 0 C 0.065 0.08394 0.071 0.1439 0.078 0.1439 C 0.085 0.1439 0.092 0.08394 0.094 0 C 0.096 0.08394 0.102 0.1439 0.11 0.1439 C 0.116 0.1439 0.123 0.08394 0.125 0 C 0.127 0.08394 0.134 0.1439 0.141 0.1439 C 0.148 0.1439 0.154 0.08394 0.156 0 C 0.159 0.08394 0.165 0.1439 0.172 0.1439 C 0.179 0.1439 0.185 0.08394 0.188 0 C 0.19 0.08394 0.196 0.1439 0.203 0.1439 C 0.21 0.1439 0.217 0.08394 0.219 0 C 0.221 0.08394 0.227 0.1439 0.235 0.1439 C 0.242 0.1439 0.248 0.08394 0.25 0"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-zigzag">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 L 0.016 0.13191 L 0.031 0 L 0.047 0.13191 L 0.063 0 L 0.078 0.13191 L 0.094 0 L 0.109 0.13191 L 0.125 0 L 0.141 0.13191 L 0.156 0 L 0.172 0.13191 L 0.187 0 L 0.203 0.13191 L 0.219 0 L 0.234 0.13191 L 0.25 0"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-bean">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.002 -0.004 0.012 -0.0453 0.037 -0.04264 C 0.075 -0.03864 0.09 -0.00933 0.125 -0.03864 C 0.147 -0.05596 0.173 -0.09993 0.192 -0.0986 C 0.235 -0.09727 0.244 -0.05196 0.244 -0.01066 C 0.245 0.04797 0.189 0.09727 0.121 0.1026 C 0.052 0.10659 -0.005 0.04397 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-buzz-saw">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.022 -0.02265 -0.033 -0.06129 -0.027 -0.09993 C -0.024 -0.11325 -0.02 -0.12658 -0.014 -0.13724 C -0.01 -0.10659 0.004 -0.07861 0.025 -0.06129 C 0.025 -0.0986 0.041 -0.13457 0.068 -0.15056 C 0.077 -0.15722 0.087 -0.15989 0.097 -0.16122 C 0.082 -0.13857 0.074 -0.10659 0.077 -0.07328 C 0.099 -0.09727 0.13 -0.1026 0.157 -0.08527 C 0.166 -0.07994 0.175 -0.07062 0.181 -0.06129 C 0.158 -0.06396 0.134 -0.05196 0.117 -0.02798 C 0.144 -0.01999 0.167 0.00799 0.174 0.04663 C 0.176 0.05996 0.176 0.07328 0.174 0.08661 C 0.161 0.06129 0.139 0.04397 0.115 0.0413 C 0.127 0.07461 0.124 0.11592 0.106 0.14656 C 0.099 0.15722 0.091 0.16655 0.082 0.17188 C 0.089 0.14257 0.085 0.10926 0.072 0.08261 C 0.06 0.11592 0.034 0.13857 0.004 0.13857 C -0.007 0.13857 -0.017 0.13591 -0.026 0.13058 C -0.004 0.11992 0.013 0.0946 0.021 0.06396 C -0.007 0.07195 -0.036 0.05996 -0.055 0.02931 C -0.062 0.01732 -0.066 0.00533 -0.069 -0.00799 C -0.049 0.00933 -0.023 0.01199 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-curved-square">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0 -0.04264 0.026 -0.07728 0.058 -0.07728 L 0.192 -0.07728 C 0.224 -0.07728 0.25 -0.04264 0.25 0 L 0.25 0.17588 C 0.25 0.21851 0.224 0.25449 0.192 0.25449 L 0.058 0.25449 C 0.026 0.25449 0 0.21851 0 0.17588 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-curved-x">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.006 0.00799 0.011 0.01466 0.015 0.02265 C 0.02 0.01466 0.024 0.00799 0.03 0 C 0.065 -0.04663 0.107 -0.06662 0.124 -0.0453 C 0.14 -0.02265 0.125 0.03331 0.09 0.07994 C 0.084 0.08661 0.079 0.09327 0.073 0.09993 C 0.079 0.10526 0.084 0.11192 0.09 0.11992 C 0.125 0.16655 0.14 0.22251 0.124 0.24383 C 0.107 0.26648 0.065 0.2465 0.03 0.19986 C 0.024 0.19187 0.02 0.1852 0.015 0.17721 C 0.011 0.1852 0.006 0.19187 0 0.19986 C -0.035 0.2465 -0.077 0.26648 -0.094 0.24383 C -0.11 0.22251 -0.095 0.16655 -0.06 0.11992 C -0.054 0.11192 -0.049 0.10526 -0.043 0.09993 C -0.049 0.09327 -0.054 0.08661 -0.06 0.07994 C -0.095 0.03331 -0.11 -0.02265 -0.094 -0.0453 C -0.077 -0.06662 -0.035 -0.04663 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-curvy-star">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.072 0.07728 0.1 0.20253 0.077 0.31711 C -0.015 0.31045 -0.093 0.23051 -0.125 0.12125 C -0.047 0.0533 0.051 0.05729 0.125 0.12125 C 0.092 0.23717 0.011 0.31045 -0.077 0.31711 C -0.101 0.1972 -0.068 0.07461 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-figure-8-four">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.017 0 0.031 0.01865 0.031 0.0413 C 0.031 0.06529 0.017 0.08394 0 0.08394 C -0.017 0.08394 -0.031 0.1026 -0.031 0.12525 C -0.031 0.1479 -0.017 0.16655 0 0.16655 C 0.017 0.16655 0.031 0.1852 0.031 0.20786 C 0.031 0.23051 0.017 0.24916 0 0.24916 C -0.017 0.24916 -0.031 0.26781 -0.031 0.2918 C -0.031 0.31445 -0.017 0.3331 0 0.3331 C 0.017 0.3331 0.031 0.31445 0.031 0.2918 C 0.031 0.26781 0.017 0.24916 0 0.24916 C -0.017 0.24916 -0.031 0.23051 -0.031 0.20786 C -0.031 0.1852 -0.017 0.16655 0 0.16655 C 0.017 0.16655 0.031 0.1479 0.031 0.12525 C 0.031 0.1026 0.017 0.08394 0 0.08394 C -0.017 0.08394 -0.031 0.06529 -0.031 0.0413 C -0.031 0.01865 -0.017 0 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-horizontal-figure-8">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0 0.04397 0.027 0.07994 0.06 0.07994 C 0.099 0.07994 0.113 0.03997 0.119 0.01599 L 0.125 -0.01599 C 0.131 -0.03997 0.146 -0.07994 0.19 -0.07994 C 0.218 -0.07994 0.25 -0.04397 0.25 0 C 0.25 0.04397 0.218 0.07994 0.19 0.07994 C 0.146 0.07994 0.131 0.03997 0.125 0.01599 L 0.119 -0.01599 C 0.113 -0.03997 0.099 -0.07994 0.06 -0.07994 C 0.027 -0.07994 0 -0.04397 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-inverted-square">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.004 -0.00533 0.01 -0.00799 0.015 -0.00799 C 0.022 -0.00799 0.029 -0.004 0.033 0.00266 C 0.05 0.02931 0.063 0.08794 0.063 0.15722 C 0.063 0.15722 0.063 0.15856 0.063 0.15856 C 0.063 0.15856 0.063 0.15989 0.063 0.15989 C 0.063 0.22917 0.05 0.28913 0.033 0.31578 C 0.029 0.32111 0.022 0.32511 0.015 0.32511 C 0.01 0.32511 0.004 0.32244 0 0.31711 C -0.004 0.31178 -0.006 0.30512 -0.006 0.29713 C -0.006 0.2878 -0.003 0.27981 0.002 0.27448 C 0.022 0.25049 0.066 0.23317 0.118 0.23317 C 0.118 0.23317 0.119 0.23317 0.119 0.23317 C 0.119 0.23317 0.12 0.23317 0.12 0.23317 C 0.172 0.23317 0.217 0.25049 0.237 0.27448 C 0.241 0.27981 0.244 0.2878 0.244 0.29713 C 0.244 0.30512 0.242 0.31178 0.238 0.31711 C 0.234 0.32244 0.229 0.32511 0.223 0.32511 C 0.216 0.32511 0.21 0.32111 0.206 0.31578 C 0.188 0.28913 0.175 0.22917 0.175 0.15989 C 0.175 0.15989 0.175 0.15856 0.175 0.15856 C 0.175 0.15856 0.175 0.15722 0.175 0.15722 C 0.175 0.08794 0.188 0.02931 0.206 0.00133 C 0.21 -0.004 0.216 -0.00799 0.223 -0.00799 C 0.229 -0.00799 0.234 -0.00533 0.238 0 C 0.242 0.00533 0.244 0.01332 0.244 0.01999 C 0.244 0.02931 0.241 0.03731 0.237 0.04397 C 0.217 0.06662 0.172 0.08394 0.12 0.08394 C 0.12 0.08394 0.12 0.08394 0.119 0.08394 C 0.119 0.08394 0.118 0.08394 0.118 0.08394 C 0.066 0.08394 0.022 0.06662 0.002 0.04397 C -0.003 0.03731 -0.006 0.02931 -0.006 0.01999 C -0.006 0.01332 -0.004 0.00533 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-inverted-triangle">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.015 0.03198 0.037 0.06529 0.055 0.07861 C 0.082 0.09993 0.108 0.10793 0.113 0.09727 C 0.117 0.08661 0.099 0.05996 0.072 0.03864 C 0.054 0.02532 0.021 0.01599 -0.008 0.01466 C -0.036 0.01599 -0.07 0.02532 -0.088 0.03864 C -0.115 0.05996 -0.133 0.08661 -0.128 0.09727 C -0.123 0.10793 -0.097 0.09993 -0.071 0.07861 C -0.053 0.06529 -0.03 0.03198 -0.016 0 C -0.001 -0.03331 0.009 -0.07728 0.009 -0.10526 C 0.009 -0.1479 0.002 -0.18121 -0.008 -0.18121 C -0.017 -0.18121 -0.025 -0.1479 -0.025 -0.10526 C -0.025 -0.07728 -0.014 -0.03331 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-loop-de-loop">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.023 0.00133 0.042 0.01199 0.052 0.02798 L 0.075 0.06529 C 0.08 0.07328 0.088 0.07728 0.098 0.07728 C 0.112 0.07728 0.124 0.06662 0.125 0.05063 C 0.124 0.03731 0.112 0.02532 0.098 0.02532 C 0.088 0.02532 0.08 0.03065 0.075 0.03731 L 0.052 0.07461 C 0.042 0.0906 0.023 0.10126 0 0.1026 C -0.023 0.10126 -0.042 0.0906 -0.052 0.07461 L -0.075 0.03731 C -0.08 0.03065 -0.088 0.02532 -0.098 0.02532 C -0.112 0.02532 -0.124 0.03731 -0.125 0.05063 C -0.124 0.06662 -0.112 0.07728 -0.098 0.07728 C -0.088 0.07728 -0.08 0.07328 -0.075 0.06529 L -0.052 0.02798 C -0.042 0.01199 -0.023 0.00133 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-neutron">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.007 -0.01332 0.014 -0.02798 0.021 -0.04663 C 0.04 -0.09993 0.045 -0.15189 0.031 -0.15989 C 0.017 -0.16922 -0.01 -0.13191 -0.029 -0.07861 C -0.039 -0.05063 -0.045 -0.02398 -0.047 -0.004 C -0.05 0.01199 -0.051 0.02798 -0.051 0.04663 C -0.051 0.10659 -0.038 0.15589 -0.023 0.15589 C -0.008 0.15589 0.005 0.10659 0.005 0.04663 C 0.005 0.01865 0.002 -0.00799 -0.003 -0.02665 C -0.005 -0.04264 -0.01 -0.05996 -0.016 -0.07728 C -0.036 -0.13191 -0.063 -0.16922 -0.077 -0.15989 C -0.091 -0.15056 -0.086 -0.09993 -0.066 -0.0453 C -0.058 -0.01999 -0.047 0.00133 -0.036 0.01599 C -0.028 0.02931 -0.019 0.0413 -0.007 0.0533 C 0.029 0.09194 0.065 0.10926 0.075 0.09327 C 0.084 0.07728 0.064 0.03331 0.028 -0.004 C 0.013 -0.01999 -0.003 -0.03198 -0.016 -0.03997 C -0.028 -0.04797 -0.043 -0.05463 -0.059 -0.05863 C -0.103 -0.07195 -0.141 -0.06795 -0.144 -0.04663 C -0.148 -0.02665 -0.115 0 -0.071 0.01332 C -0.051 0.01865 -0.032 0.02132 -0.017 0.01999 C -0.004 0.01999 0.01 0.01732 0.025 0.01332 C 0.069 0 0.102 -0.02798 0.098 -0.04797 C 0.095 -0.06795 0.057 -0.07328 0.013 -0.05996 C -0.008 -0.0533 -0.027 -0.04397 -0.04 -0.03331 C -0.051 -0.02532 -0.062 -0.01599 -0.074 -0.004 C -0.109 0.03464 -0.13 0.07728 -0.12 0.09327 C -0.111 0.10926 -0.074 0.09194 -0.039 0.05463 C -0.022 0.03598 -0.008 0.01732 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-peanut">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.038 0 0.069 0.0413 0.069 0.09194 C 0.069 0.12525 0.056 0.15456 0.037 0.17188 C 0.037 0.17188 0.036 0.17188 0.036 0.17188 C 0.029 0.17854 0.025 0.1892 0.025 0.20119 C 0.025 0.21185 0.029 0.22118 0.034 0.22784 C 0.042 0.2385 0.047 0.25449 0.047 0.27048 C 0.047 0.30512 0.026 0.3331 0 0.3331 C -0.026 0.3331 -0.047 0.30512 -0.047 0.27048 C -0.047 0.25449 -0.042 0.2385 -0.034 0.22784 C -0.029 0.22118 -0.026 0.21185 -0.026 0.20119 C -0.026 0.1892 -0.03 0.17854 -0.036 0.17188 C -0.036 0.17188 -0.037 0.17188 -0.037 0.17188 C -0.057 0.15456 -0.07 0.12525 -0.07 0.09194 C -0.07 0.0413 -0.039 0 0 0 C 0 0 0 0 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-clover">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C -0.118 -0.15722 0.132 -0.15722 0.011 0 C 0.132 -0.15722 0.132 0.17588 0.011 0.01466 C 0.132 0.17588 -0.118 0.17588 0 0.01466 C -0.118 0.17588 -0.118 -0.15722 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-pointy-star">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.069 0 0.124 -0.07461 0.124 -0.16655 C 0.124 -0.07461 0.179 -0.00133 0.248 -0.00133 C 0.179 -0.00133 0.125 0.07461 0.125 0.16655 C 0.125 0.07461 0.069 0 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-swoosh">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0 0 0.017 -0.08661 0.017 -0.08661 C 0.034 -0.15722 0.061 -0.1852 0.1 -0.1852 C 0.12 -0.1852 0.138 -0.17455 0.152 -0.15722 C 0.162 -0.14523 0.174 -0.13857 0.187 -0.13857 C 0.212 -0.13857 0.233 -0.16255 0.241 -0.1972 C 0.241 -0.1972 0.25 -0.2385 0.25 -0.2385 C 0.25 -0.2385 0.232 -0.15056 0.232 -0.15056 C 0.215 -0.08128 0.188 -0.0533 0.15 -0.0533 C 0.13 -0.0533 0.111 -0.06396 0.096 -0.08261 C 0.087 -0.09327 0.075 -0.09993 0.063 -0.09993 C 0.038 -0.09993 0.017 -0.07595 0.009 -0.0413 C 0.009 -0.0413 0 0 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" smil:accelerate="0.5" smil:decelerate="0.5" pres:node-type="on-click" pres:preset-class="motion-path" pres:preset-id="ooo-motionpath-vertical-figure-8">
+ <anim:animateMotion smil:dur="2" smil:fill="hold" svg:path="M 0 0 C 0.033 0 0.06 0.03598 0.06 0.07994 C 0.06 0.13191 0.03 0.15056 0.012 0.15856 L -0.012 0.16655 C -0.03 0.17455 -0.06 0.19453 -0.06 0.25316 C -0.06 0.29046 -0.033 0.3331 0 0.3331 C 0.033 0.3331 0.06 0.29046 0.06 0.25316 C 0.06 0.19453 0.03 0.17455 0.012 0.16655 L -0.012 0.15856 C -0.03 0.15056 -0.06 0.13191 -0.06 0.07994 C -0.06 0.03598 -0.033 0 0 0 Z"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="exit" pres:preset-id="libo-physics-fall-fade-out">
+ <anim:animatePhysics smil:dur="4" anim:bounciness="0.6" smil:fill="hold"/>
+ <anim:transitionFilter smil:begin="2" smil:dur="2" smil:type="fade" smil:subtype="crossfade" smil:mode="out"/>
+ <anim:set smil:begin="3.999" smil:dur="0.001" smil:fill="hold" smil:attributeName="visibility" smil:to="hidden"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="libo-physics-fall">
+ <anim:animatePhysics smil:dur="4" smil:fill="hold"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="libo-physics-shoot-right-return">
+ <anim:animatePhysics smil:dur="4" anim:bounciness="0.6" anim:velocity-x="10000" smil:fill="hold"/>
+ <anim:animate smil:begin="4s" smil:dur="2s" smil:fill="hold" smil:accelerate="0.2" smil:decelerate="0.5" smil:attributeName="x" smil:to="x"/>
+ <anim:animate smil:begin="4s" smil:dur="2s" smil:fill="hold" smil:accelerate="0.2" smil:decelerate="0.5" smil:attributeName="y" smil:to="y"/>
+ <anim:animate smil:begin="4s" smil:dur="2s" smil:fill="hold" smil:accelerate="0.2" smil:decelerate="0.5" smil:attributeName="rotate" smil:to="0"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="emphasis" pres:preset-id="libo-physics-shoot-left-return">
+ <anim:animatePhysics smil:dur="4" anim:bounciness="0.6" anim:velocity-x="-10000" smil:fill="hold"/>
+ <anim:animate smil:begin="4s" smil:dur="2s" smil:fill="hold" smil:accelerate="0.2" smil:decelerate="0.5" smil:attributeName="x" smil:to="x"/>
+ <anim:animate smil:begin="4s" smil:dur="2s" smil:fill="hold" smil:accelerate="0.2" smil:decelerate="0.5" smil:attributeName="y" smil:to="y"/>
+ <anim:animate smil:begin="4s" smil:dur="2s" smil:fill="hold" smil:accelerate="0.2" smil:decelerate="0.5" smil:attributeName="rotate" smil:to="0"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="media-call" pres:preset-id="ooo-media-start">
+ <anim:command smil:begin="0" smil:dur="0.001" smil:fill="hold" anim:command="play"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="media-call" pres:preset-id="ooo-media-stop">
+ <anim:command smil:begin="0" smil:dur="0.001" smil:fill="hold" anim:command="stop"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+ <anim:par smil:begin="indefinite" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold">
+ <anim:par smil:begin="0" smil:fill="hold" pres:node-type="on-click" pres:preset-class="media-call" pres:preset-id="ooo-media-toggle-pause">
+ <anim:command smil:begin="0" smil:dur="0.001" smil:fill="hold" anim:command="toggle-pause"/>
+ </anim:par>
+ </anim:par>
+ </anim:par>
+</anim:seq>
diff --git a/sd/xml/layoutlist.xml b/sd/xml/layoutlist.xml
new file mode 100644
index 000000000..4d139ace4
--- /dev/null
+++ b/sd/xml/layoutlist.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+<!-- Configurable definitions of Impress slide layouts.
+
+ Currently the layout type name needs to match a set of predefined strings.
+ Per entry, you can declare up to one Title object, and up to four
+ Outline objects. All values are relative to Impress' 'layout
+ rect', which is roughly 90% of the available slide area.
+-->
+<layout-list>
+ <layout type="AUTOLAYOUT_TITLE_CONTENT">
+ <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ </layout>
+ <layout type="AUTOLAYOUT_TITLE_2CONTENT">
+ <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="1" relative-width="0.488" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE2" relative-height="1" relative-width="0.488" relative-posX="1.05" relative-posY="0"/>
+ </layout>
+ <layout type="AUTOLAYOUT_TITLE_CONTENT_OVER_CONTENT">
+ <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="0.477" relative-width="1" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE2" relative-height="0.477" relative-width="1" relative-posX="0" relative-posY="1.095"/>
+ </layout>
+ <layout type="AUTOLAYOUT_TITLE_CONTENT_2CONTENT">
+ <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="1" relative-width="0.488" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE2" relative-height="0.477" relative-width="0.488" relative-posX="1.05" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE3" relative-height="0.477" relative-width="0.488" relative-posX="1.05" relative-posY="1.095"/>
+ </layout>
+ <layout type="AUTOLAYOUT_TITLE_4CONTENT">
+ <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="0.477" relative-width="0.488" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE2" relative-height="0.477" relative-width="0.488" relative-posX="1.05" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE3" relative-height="0.477" relative-width="0.488" relative-posX="0" relative-posY="1.095"/>
+ <presobj kind="PRESOBJ_OUTLINE4" relative-height="0.477" relative-width="0.488" relative-posX="1.05" relative-posY="1.095"/>
+ </layout>
+ <layout type="AUTOLAYOUT_ONLY_TEXT">
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="4.6354" relative-width="1" relative-posX="0" relative-posY="0"/>
+ </layout>
+ <layout type="AUTOLAYOUT_TITLE_ONLY">
+ <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ </layout>
+ <layout type="AUTOLAYOUT_TITLE_6CONTENT">
+ <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="0.477" relative-width="0.322" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE2" relative-height="0.477" relative-width="0.322" relative-posX="1.05" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE3" relative-height="0.477" relative-width="0.322" relative-posX="2.10" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE4" relative-height="0.477" relative-width="0.322" relative-posX="0" relative-posY="1.095"/>
+ <presobj kind="PRESOBJ_OUTLINE5" relative-height="0.477" relative-width="0.322" relative-posX="1.05" relative-posY="1.095"/>
+ <presobj kind="PRESOBJ_OUTLINE6" relative-height="0.477" relative-width="0.322" relative-posX="2.10" relative-posY="1.095"/>
+ </layout>
+ <layout type="AUTOLAYOUT_START">
+ <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ </layout>
+ <layout type="AUTOLAYOUT_TITLE_2CONTENT_CONTENT">
+ <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="0.477" relative-width="0.488" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE2" relative-height="1" relative-width="0.488" relative-posX="1.05" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE3" relative-height="0.477" relative-width="0.488" relative-posX="0" relative-posY="1.095"/>
+ </layout>
+ <layout type="AUTOLAYOUT_TITLE_2CONTENT_OVER_CONTENT">
+ <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="0.477" relative-width="0.488" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE2" relative-height="0.477" relative-width="0.488" relative-posX="1.05" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE3" relative-height="0.477" relative-width="1" relative-posX="0" relative-posY="1.095"/>
+ </layout>
+ <layout type="AUTOLAYOUT_VTITLE_VCONTENT">
+ <presobj kind="PRESOBJ_TITLE" relative-height="4.6354" relative-width="0.139167" relative-posX="6.1856" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="1.3347" relative-width="0.777778" relative-posX="0" relative-posY="-0.25078974"/>
+ </layout>
+ <layout type="AUTOLAYOUT_VTITLE_VCONTENT_OVER_VCONTENT">
+ <presobj kind="PRESOBJ_TITLE" relative-height="4.6354" relative-width="0.139167" relative-posX="6.1856" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="0.6272578" relative-width="0.777778" relative-posX="0" relative-posY="-0.53363874"/>
+ <presobj kind="PRESOBJ_OUTLINE2" relative-height="0.6272578" relative-width="0.777778" relative-posX="0" relative-posY="0.5939791"/>
+ </layout>
+ <layout type="AUTOLAYOUT_TITLE_VCONTENT">
+ <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ </layout>
+ <layout type="AUTOLAYOUT_TITLE_2VTEXT">
+ <presobj kind="PRESOBJ_TITLE" relative-height="1" relative-width="1" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE1" relative-height="1" relative-width="0.488" relative-posX="0" relative-posY="0"/>
+ <presobj kind="PRESOBJ_OUTLINE2" relative-height="1" relative-width="0.488" relative-posX="1.05" relative-posY="0"/>
+ </layout>
+</layout-list>
diff --git a/sd/xml/objectlist.xml b/sd/xml/objectlist.xml
new file mode 100644
index 000000000..90cf1c1cb
--- /dev/null
+++ b/sd/xml/objectlist.xml
@@ -0,0 +1,41 @@
+<?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/.
+ *
+-->
+<object-list>
+ <object type="PRESOBJ_DATETIME">
+ <object-prop pagekind="PageKind::Standard" relative-height="0.069" relative-width="0.233" relative-posX="0.05" relative-posY="0.911"/>
+ <object-prop pagekind="PageKind::Handout" relative-height="0.05" relative-width="0.434" relative-posX="0.434" relative-posY="0"/>
+ <object-prop pagekind="PageKind::Notes" relative-height="0.05" relative-width="0.434" relative-posX="0.434" relative-posY="0"/>
+ </object>
+ <object type="PRESOBJ_FOOTER">
+ <object-prop pagekind="PageKind::Standard" relative-height="0.069" relative-width="0.317" relative-posX="0.342" relative-posY="0.911"/>
+ <object-prop pagekind="PageKind::Handout" relative-height="0.05" relative-width="0.434" relative-posX="0" relative-posY="0.05"/>
+ <object-prop pagekind="PageKind::Notes" relative-height="0.05" relative-width="0.434" relative-posX="0" relative-posY="0.05"/>
+ </object>
+ <object type="PRESOBJ_SLIDENUMBER">
+ <object-prop pagekind="PageKind::Standard" relative-height="0.069" relative-width="0.233" relative-posX="0.717" relative-posY="0.911"/>
+ <object-prop pagekind="PageKind::Handout" relative-height="0.05" relative-width="0.434" relative-posX="0.434" relative-posY="0.05"/>
+ <object-prop pagekind="PageKind::Notes" relative-height="0.05" relative-width="0.434" relative-posX="0.434" relative-posY="0.05"/>
+ </object>
+ <object type="PRESOBJ_HEADER">
+ <object-prop pagekind="PageKind::Standard" relative-height="0.069" relative-width="0.317" relative-posX="0.717" relative-posY="0.911"/>
+ <object-prop pagekind="PageKind::Handout" relative-height="0.05" relative-width="0.434" relative-posX="0" relative-posY="0"/>
+ <object-prop pagekind="PageKind::Notes" relative-height="0.05" relative-width="0.434" relative-posX="0" relative-posY="0"/>
+ </object>
+ <object type="PRESOBJ_TITLE">
+ <object-prop pagekind="PageKind::Standard" relative-height="0.167" relative-width="0.9" relative-posX="0.05" relative-posY="0.0399"/>
+ <object-prop pagekind="PageKind::Notes" relative-height="0.375" relative-width="1" relative-posX="0" relative-posY="0.076"/>
+ </object>
+ <object type="PRESOBJ_OUTLINE">
+ <object-prop pagekind="PageKind::Standard" relative-height="0.58" relative-width="0.9" relative-posX="0.05" relative-posY="0.234"/>
+ </object>
+ <object type="PRESOBJ_NOTES">
+ <object-prop pagekind="PageKind::Notes" relative-height="0.45" relative-width="0.8" relative-posX="0.1" relative-posY="0.475"/>
+ </object>
+</object-list> \ No newline at end of file
diff --git a/sd/xml/transitions-ogl.xml b/sd/xml/transitions-ogl.xml
new file mode 100644
index 000000000..b145f1079
--- /dev/null
+++ b/sd/xml/transitions-ogl.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+<!--
+ * 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 .
+-->
+<anim:seq xmlns:office="urn:oasis:names:tc:openoffice:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:openoffice:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:openoffice:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:openoffice:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:openoffice:xmlns:drawing:1.0" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:openoffice:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:openoffice:xmlns:datastyle:1.0" xmlns:pres="urn:oasis:names:tc:openoffice:xmlns:presentation:1.0" xmlns:svg="http://www.w3.org/2000/svg" xmlns:chart="urn:oasis:names:tc:openoffice:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:openoffice:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:openoffice:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:openoffice:xmlns:script: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:smil="http://www.w3.org/2001/SMIL20" xmlns:anim="urn:oasis:names:tc:openoffice:xmlns:animation:1.0" pres:node-type="main-sequence">
+ <anim:par pres:preset-id="tile-flip">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="across"/>
+ </anim:par>
+ <anim:par pres:preset-id="outside-cube">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="cornersOut"/>
+ </anim:par>
+ <anim:par pres:preset-id="revolving-circles">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="circle"/>
+ </anim:par>
+ <anim:par pres:preset-id="turning-helix">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="fanOutHorizontal"/>
+ </anim:par>
+ <anim:par pres:preset-id="inside-cube">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="cornersIn"/>
+ </anim:par>
+ <anim:par pres:preset-id="fall">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="leftToRight"/>
+ </anim:par>
+ <anim:par pres:preset-id="turn-around">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="topToBottom"/>
+ </anim:par>
+ <anim:par pres:preset-id="iris">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="topLeft"/>
+ </anim:par>
+ <anim:par pres:preset-id="turn-down">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="topRight"/>
+ </anim:par>
+ <anim:par pres:preset-id="rochade">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="bottomRight"/>
+ </anim:par>
+ <anim:par pres:preset-id="venetian3dv">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="bottomLeft"/>
+ </anim:par>
+ <anim:par pres:preset-id="venetian3dh">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="topCenter"/>
+ </anim:par>
+ <anim:par pres:preset-id="static">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="rightCenter"/>
+ </anim:par>
+ <anim:par pres:preset-id="finedissolve">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="bottomCenter"/>
+ </anim:par>
+ <anim:par pres:preset-id="vortex">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="vertical"/>
+ </anim:par>
+ <anim:par pres:preset-id="ripple">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="horizontal"/>
+ </anim:par>
+ <anim:par pres:preset-id="glitter">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="diamond"/>
+ </anim:par>
+ <anim:par pres:preset-id="honeycomb">
+ <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="heart"/>
+ </anim:par>
+ <anim:par pres:preset-id="zoom-rotate-in">
+ <anim:transitionFilter smil:type="zoom" smil:subtype="rotateIn"/>
+ </anim:par>
+ </anim:seq>
diff --git a/sd/xml/transitions.xml b/sd/xml/transitions.xml
new file mode 100644
index 000000000..78a4d213a
--- /dev/null
+++ b/sd/xml/transitions.xml
@@ -0,0 +1,251 @@
+<?xml version="1.0"?>
+<!--
+ * 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 .
+-->
+<anim:seq xmlns:office="urn:oasis:names:tc:openoffice:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:openoffice:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:openoffice:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:openoffice:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:openoffice:xmlns:drawing:1.0" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:openoffice:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:openoffice:xmlns:datastyle:1.0" xmlns:pres="urn:oasis:names:tc:openoffice:xmlns:presentation:1.0" xmlns:svg="http://www.w3.org/2000/svg" xmlns:chart="urn:oasis:names:tc:openoffice:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:openoffice:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:openoffice:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:openoffice:xmlns:script: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:smil="http://www.w3.org/2001/SMIL20" xmlns:anim="urn:oasis:names:tc:openoffice:xmlns:animation:1.0" pres:node-type="main-sequence">
+ <anim:par pres:preset-id="wipe-up">
+ <anim:transitionFilter smil:type="barWipe" smil:subtype="topToBottom" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="wipe-right">
+ <anim:transitionFilter smil:type="barWipe" smil:subtype="leftToRight"/>
+ </anim:par>
+ <anim:par pres:preset-id="wipe-left">
+ <anim:transitionFilter smil:type="barWipe" smil:subtype="leftToRight" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="wipe-down">
+ <anim:transitionFilter smil:type="barWipe" smil:subtype="topToBottom"/>
+ </anim:par>
+ <anim:par pres:preset-id="wheel-clockwise-1-spoke">
+ <anim:transitionFilter smil:type="pinWheelWipe" smil:subtype="oneBlade"/>
+ </anim:par>
+ <anim:par pres:preset-id="wheel-clockwise-2-spokes">
+ <anim:transitionFilter smil:type="pinWheelWipe" smil:subtype="twoBladeVertical"/>
+ </anim:par>
+ <anim:par pres:preset-id="wheel-clockwise-3-spokes">
+ <anim:transitionFilter smil:type="pinWheelWipe" smil:subtype="threeBlade"/>
+ </anim:par>
+ <anim:par pres:preset-id="wheel-clockwise-4-spokes">
+ <anim:transitionFilter smil:type="pinWheelWipe" smil:subtype="fourBlade"/>
+ </anim:par>
+ <anim:par pres:preset-id="wheel-clockwise-8-spokes">
+ <anim:transitionFilter smil:type="pinWheelWipe" smil:subtype="eightBlade"/>
+ </anim:par>
+ <anim:par pres:preset-id="uncover-down">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromTop" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="uncover-left">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromRight" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="uncover-right">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromLeft" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="uncover-up">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromBottom" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="uncover-left-down">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromTopRight" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="uncover-left-up">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromBottomRight" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="uncover-right-down">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromTopLeft" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="uncover-right-up">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromBottomLeft" smil:direction="reverse"/>
+ </anim:par>
+<!-- <anim:par pres:preset-id="barn-inVertical"> -->
+<!-- <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="vertical"/> -->
+<!-- </anim:par> -->
+<!-- <anim:par pres:preset-id="barn-outVertical"> -->
+<!-- <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="vertical" smil:direction="reverse"/> -->
+<!-- </anim:par> -->
+<!-- <anim:par pres:preset-id="barn-inHorizontal"> -->
+<!-- <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="horizontal"/> -->
+<!-- </anim:par> -->
+<!-- <anim:par pres:preset-id="barn-outHorizontal"> -->
+<!-- <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="horizontal" smil:direction="reverse"/> -->
+<!-- </anim:par> -->
+ <anim:par pres:preset-id="random-bars-vertical">
+ <anim:transitionFilter smil:type="randomBarWipe" smil:subtype="vertical"/>},
+ </anim:par>
+ <anim:par pres:preset-id="random-bars-horizontal">
+ <anim:transitionFilter smil:type="randomBarWipe" smil:subtype="horizontal"/>
+ </anim:par>
+ <anim:par pres:preset-id="checkerboard-down">
+ <anim:transitionFilter smil:type="checkerBoardWipe" smil:subtype="down"/>},
+ </anim:par>
+ <anim:par pres:preset-id="checkerboard-across">
+ <anim:transitionFilter smil:type="checkerBoardWipe" smil:subtype="across"/>
+ </anim:par>
+ <anim:par pres:preset-id="shape-plus">
+ <anim:transitionFilter smil:type="fourBoxWipe" smil:subtype="cornersOut"/>
+ </anim:par>
+<!-- <anim:par pres:preset-id="plus-in"> -->
+<!-- <anim:transitionFilter smil:type="fourBoxWipe" smil:subtype="cornersIn"/> -->
+<!-- </anim:par> -->
+ <anim:par pres:preset-id="shape-diamond">
+ <anim:transitionFilter smil:type="irisWipe" smil:subtype="diamond"/>
+ </anim:par>
+<!-- <anim:par pres:preset-id="diamond-in"> -->
+<!-- <anim:transitionFilter smil:type="irisWipe" smil:subtype="diamond" smil:direction="reverse"/> -->
+<!-- </anim:par> -->
+ <anim:par pres:preset-id="shape-circle">
+ <anim:transitionFilter smil:type="ellipseWipe" smil:subtype="circle"/>
+ </anim:par>
+ <anim:par pres:preset-id="shape-oval-horizontal">
+ <anim:transitionFilter smil:type="ellipseWipe" smil:subtype="horizontal"/>
+ </anim:par>
+ <anim:par pres:preset-id="shape-oval-vertical">
+ <anim:transitionFilter smil:type="ellipseWipe" smil:subtype="vertical"/>
+ </anim:par>
+<!-- <anim:par pres:preset-id="circle-in"> -->
+<!-- <anim:transitionFilter smil:type="ellipseWipe" smil:subtype="circle" smil:direction="reverse"/> -->
+<!-- </anim:par> -->
+ <anim:par pres:preset-id="box-out">
+ <anim:transitionFilter smil:type="irisWipe" smil:subtype="rectangle"/>
+ </anim:par>
+ <anim:par pres:preset-id="box-in">
+ <anim:transitionFilter smil:type="irisWipe" smil:subtype="rectangle" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="wedge">
+ <anim:transitionFilter smil:type="fanWipe" smil:subtype="centerTop"/>
+ </anim:par>
+ <anim:par pres:preset-id="venetian-blinds-vertical">
+ <anim:transitionFilter smil:type="blindsWipe" smil:subtype="vertical"/>
+ </anim:par>
+ <anim:par pres:preset-id="venetian-blinds-horizontal">
+ <anim:transitionFilter smil:type="blindsWipe" smil:subtype="horizontal"/>
+ </anim:par>
+ <anim:par pres:preset-id="fade-through-black">
+ <anim:transitionFilter smil:type="fade" smil:subtype="fadeOverColor" smil:fadeColor="#000000"/>
+ </anim:par>
+ <anim:par pres:preset-id="fade-through-white">
+ <anim:transitionFilter smil:type="fade" smil:subtype="fadeOverColor" smil:fadeColor="#FFFFFF"/>
+ </anim:par>
+ <anim:par pres:preset-id="cut-through-black">
+ <anim:transitionFilter smil:type="barWipe" smil:subtype="fadeOverColor" smil:fadeColor="#000000"/>
+ </anim:par>
+ <anim:par pres:preset-id="cover-down">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromTop"/>
+ </anim:par>
+ <anim:par pres:preset-id="cover-left">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromRight"/>
+ </anim:par>
+ <anim:par pres:preset-id="cover-right">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromLeft"/>
+ </anim:par>
+ <anim:par pres:preset-id="cover-up">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromBottom"/>
+ </anim:par>
+ <anim:par pres:preset-id="cover-left-down">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromTopRight"/>
+ </anim:par>
+ <anim:par pres:preset-id="cover-left-up">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromBottomRight"/>
+ </anim:par>
+ <anim:par pres:preset-id="cover-right-down">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromTopLeft"/>
+ </anim:par>
+ <anim:par pres:preset-id="cover-right-up">
+ <anim:transitionFilter smil:type="slideWipe" smil:subtype="fromBottomLeft"/>
+ </anim:par>
+ <anim:par pres:preset-id="dissolve">
+ <anim:transitionFilter smil:type="dissolve" smil:subtype="default"/>
+ </anim:par>
+ <anim:par pres:preset-id="random-transition">
+ <anim:transitionFilter smil:type="random"/>
+ </anim:par>
+ <!--anim:par pres:preset-id="zoom-rotate-in">
+ <anim:transitionFilter smil:type="zoom" smil:subtype="rotateIn"/>
+ </anim:par-->
+ <anim:par pres:preset-id="clock-wipe-twelve">
+ <anim:transitionFilter smil:type="clockWipe" smil:subtype="clockwiseTwelve"/>
+ </anim:par>
+ <anim:par pres:preset-id="reverse-clock-wipe-twelve">
+ <anim:transitionFilter smil:type="clockWipe" smil:subtype="clockwiseTwelve" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="spiral-wipe-top-left-clockwise">
+ <anim:transitionFilter smil:type="spiralWipe" smil:subtype="topLeftClockwise"/>
+ </anim:par>
+ <anim:par pres:preset-id="spiral-wipe-top-right-counter-clockwise">
+ <anim:transitionFilter smil:type="spiralWipe" smil:subtype="topRightCounterClockwise"/>
+ </anim:par>
+ <anim:par pres:preset-id="spiral-wipe-out-to-bottom-right-clockwise">
+ <anim:transitionFilter smil:type="spiralWipe" smil:subtype="bottomRightCounterClockwise" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="spiral-wipe-out-to-bottom-left-counter-clockwise">
+ <anim:transitionFilter smil:type="spiralWipe" smil:subtype="bottomLeftClockwise" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="snake-wipe-top-left-vertical">
+ <anim:transitionFilter smil:type="snakeWipe" smil:subtype="topLeftVertical"/>
+ </anim:par>
+ <anim:par pres:preset-id="snake-wipe-top-left-horizontal">
+ <anim:transitionFilter smil:type="snakeWipe" smil:subtype="topLeftHorizontal"/>
+ </anim:par>
+ <anim:par pres:preset-id="snake-wipe-bottom-right-vertical">
+ <anim:transitionFilter smil:type="snakeWipe" smil:subtype="topLeftVertical" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="snake-wipe-bottom-right-horizontal">
+ <anim:transitionFilter smil:type="snakeWipe" smil:subtype="topLeftHorizontal" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="comb-horizontal">
+ <anim:transitionFilter smil:type="pushWipe" smil:subtype="combHorizontal"/>
+ </anim:par>
+ <anim:par pres:preset-id="comb-vertical">
+ <anim:transitionFilter smil:type="pushWipe" smil:subtype="combVertical"/>
+ </anim:par>
+ <anim:par pres:preset-id="fade-smoothly">
+ <anim:transitionFilter smil:type="fade" smil:subtype="crossfade"/>
+ </anim:par>
+ <anim:par pres:preset-id="push-down">
+ <anim:transitionFilter smil:type="pushWipe" smil:subtype="fromTop"/>
+ </anim:par>
+ <anim:par pres:preset-id="push-left">
+ <anim:transitionFilter smil:type="pushWipe" smil:subtype="fromRight"/>
+ </anim:par>
+ <anim:par pres:preset-id="push-right">
+ <anim:transitionFilter smil:type="pushWipe" smil:subtype="fromLeft"/>
+ </anim:par>
+ <anim:par pres:preset-id="push-up">
+ <anim:transitionFilter smil:type="pushWipe" smil:subtype="fromBottom"/>
+ </anim:par>
+ <anim:par pres:preset-id="split-horizontal-in">
+ <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="horizontal" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="split-horizontal-out">
+ <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="horizontal"/>
+ </anim:par>
+ <anim:par pres:preset-id="split-vertical-in">
+ <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="vertical" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="split-vertical-out">
+ <anim:transitionFilter smil:type="barnDoorWipe" smil:subtype="vertical"/>
+ </anim:par>
+ <anim:par pres:preset-id="diagonal-squares-left-down">
+ <anim:transitionFilter smil:type="waterfallWipe" smil:subtype="horizontalRight"/>
+ </anim:par>
+ <anim:par pres:preset-id="diagonal-squares-left-up">
+ <anim:transitionFilter smil:type="waterfallWipe" smil:subtype="horizontalLeft" smil:direction="reverse"/>
+ </anim:par>
+ <anim:par pres:preset-id="diagonal-squares-right-down">
+ <anim:transitionFilter smil:type="waterfallWipe" smil:subtype="horizontalLeft"/>
+ </anim:par>
+ <anim:par pres:preset-id="diagonal-squares-right-up">
+ <anim:transitionFilter smil:type="waterfallWipe" smil:subtype="horizontalRight" smil:direction="reverse"/>
+ </anim:par>
+ </anim:seq>
diff --git a/sd/xsl/effect.xsl b/sd/xsl/effect.xsl
new file mode 100644
index 000000000..dc934d6d1
--- /dev/null
+++ b/sd/xsl/effect.xsl
@@ -0,0 +1,580 @@
+<?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 .
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:office="urn:oasis:names:tc:openoffice:xmlns:office:1.0"
+ xmlns:style="urn:oasis:names:tc:openoffice:xmlns:style:1.0"
+ xmlns:text="urn:oasis:names:tc:openoffice:xmlns:text:1.0"
+ xmlns:table="urn:oasis:names:tc:openoffice:xmlns:table:1.0"
+ xmlns:draw="urn:oasis:names:tc:openoffice:xmlns:drawing:1.0"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="urn:oasis:names:tc:openoffice:xmlns:meta:1.0"
+ xmlns:number="urn:oasis:names:tc:openoffice:xmlns:datastyle:1.0"
+ xmlns:pres="urn:oasis:names:tc:openoffice:xmlns:presentation:1.0"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:chart="urn:oasis:names:tc:openoffice:xmlns:chart:1.0"
+ xmlns:dr3d="urn:oasis:names:tc:openoffice:xmlns:dr3d:1.0"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="urn:oasis:names:tc:openoffice:xmlns:form:1.0"
+ xmlns:script="urn:oasis:names:tc:openoffice:xmlns:script: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:smil="http://www.w3.org/2001/SMIL20"
+ xmlns:anim="urn:oasis:names:tc:openoffice:xmlns:animation:1.0"
+
+ version="1.0">
+
+ <!-- fly in -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-fly-in']">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- fade in an swivel -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-fade-in-and-swivel']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- falling in -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-falling-in']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- Unfold -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-unfold']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- Unfold -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-unfold']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- turn and grow -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-turn-and-grow']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- fold -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-fold']">
+ <anim:par pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- whip -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-whip']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- flip -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-flip']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- swish -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-swish']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- blinds -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-venetian-blinds']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- box -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-box']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- checkerboard -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-checkerboard']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- circle -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-circle']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- crawl in -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-fly-in-slow']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- diamond -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-diamond']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- peek in -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-peek-in']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- plus -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-plus']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- random bars -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-random-bars']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- split -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-split']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- strips -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-diagonal-squares']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- wheel -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-wheel']">
+ <anim:par pres:preset-property="Spokes">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- wipe -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-wipe']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- color typewriter -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-entrance-colored-lettering']">
+ <anim:iterate pres:preset-property="Color1;Color2" pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- stretch -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-stretchy']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- zoom -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-zoom']">
+ <anim:par pres:preset-property="Zoom">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- swivel -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-entrance-swivel']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+<!-- emphasis -->
+
+ <!-- change fill color -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-fill-color']">
+ <anim:par pres:preset-property="FillColor;ColorStyle;Accelerate;Decelerate;AutoReverse">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- change font -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-font']">
+ <anim:par pres:preset-property="FontStyle" pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- change font color -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-font-color']">
+ <anim:par pres:preset-property="CharColor;ColorStyle;Accelerate;Decelerate;AutoReverse" pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- change font size -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-font-size']">
+ <anim:par pres:preset-property="CharHeight" pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- change font style -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-font-style']">
+ <anim:par pres:preset-property="CharDecoration" pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- change line color -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-line-color']">
+ <anim:par pres:preset-property="LineColor;ColorStyle;Accelerate;Decelerate;AutoReverse">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- grow/shrink -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-grow-and-shrink']">
+ <anim:par pres:preset-property="Scale;Accelerate;Decelerate;AutoReverse">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- spin -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-spin']">
+ <anim:par pres:preset-property="Rotate;Accelerate;Decelerate;AutoReverse">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- Transparency -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-transparency']">
+ <anim:par pres:preset-property="Transparency">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- brush on color -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-color-over-by-word']">
+ <anim:iterate pres:preset-property="Color" pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- color blend -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-color-blend']">
+ <anim:par pres:preset-property="Color">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- color wave -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-color-over-by-letter']">
+ <anim:iterate pres:preset-property="Color" pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- bold flash -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-bold-flash']">
+ <anim:par pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- reveal underline -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-reveal-underline']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- shimmer -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-shimmer']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- verticales highlight -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-vertical-highlight']">
+ <anim:par pres:preset-property="Color">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- flicker -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-flicker']">
+ <anim:par pres:preset-property="Color">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- grow with color -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-grow-with-color']">
+ <anim:iterate pres:preset-property="Color" pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- teeter -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-teeter']">
+ <anim:par pres:preset-property="Color">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- blast -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-blast']">
+ <anim:par pres:preset-property="Color">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- style emphasis -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-emphasis-style-emphasis']">
+ <anim:par pres:preset-property="Color" pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- bold reveal -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-bold-reveal']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- wave -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-emphasis-wave']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+<!-- exit -->
+
+ <!-- blinds -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-venetian-blinds']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- box -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-box']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- checkerboard -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-checkerboard']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- circle -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-circle']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- crawl out -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-crawl-out']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- diamond -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-diamond']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- fly out -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-fly-out']">
+ <anim:par pres:preset-property="Direction;Accelerate;Decelerate">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- peek out -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-peek-out']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- plus -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-plus']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- random bars -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-random-bars']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- split -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-split']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- strips -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-diagonal-squares']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- wheel -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-wheel']">
+ <anim:par pres:preset-property="Spokes">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- wipe -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-wipe']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- collapse -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-collapse']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- color typewriter -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-colored-lettering']">
+ <anim:iterate pres:preset-property="Color1;Color2" pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- zoom -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-zoom']">
+ <anim:par pres:preset-property="Zoom">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- swivel -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-swivel']">
+ <anim:par pres:preset-property="Direction">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- fade in an swivel -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-fade-out-and-swivel']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- fade in an swivel -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-turn-and-grow']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- fold -->
+ <xsl:template match="anim:par[@pres:preset-id = 'ooo-exit-fold']">
+ <anim:par pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:par>
+ </xsl:template>
+
+ <!-- whip -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-whip']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- flip -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-flip']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- swish -->
+ <xsl:template match="anim:iterate[@pres:preset-id = 'ooo-exit-swish']">
+ <anim:iterate pres:text-only="true">
+ <xsl:apply-templates select="*|@*|text()"/>
+ </anim:iterate>
+ </xsl:template>
+
+ <!-- remove pres:group-id -->
+ <xsl:template match="@xlink:href" />
+ <xsl:template match="@smil:targetElement" />
+ <xsl:template match="@pres:group-id" />
+
+ <!-- copy -->
+ <xsl:template match="*|@*|text()">
+ <xsl:copy>
+ <xsl:apply-templates select="*|@*|text()"/>
+ </xsl:copy>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/sdext/CppunitTest_sdext_pdfimport.mk b/sdext/CppunitTest_sdext_pdfimport.mk
new file mode 100644
index 000000000..ee24b9aed
--- /dev/null
+++ b/sdext/CppunitTest_sdext_pdfimport.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/.
+#
+
+$(eval $(call gb_CppunitTest_CppunitTest,sdext_pdfimport))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,sdext_pdfimport))
+
+$(eval $(call gb_CppunitTest_set_include,sdext_pdfimport,\
+ -I$(SRCDIR)/sdext/source/pdfimport/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_externals,sdext_pdfimport,\
+ boost_headers \
+ zlib \
+ libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sdext_pdfimport,\
+ basegfx \
+ vcl \
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ test \
+ unotest \
+ tl \
+ xo \
+ i18nutil \
+))
+
+$(eval $(call gb_CppunitTest_use_library_objects,sdext_pdfimport,pdfimport))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sdext_pdfimport,\
+ sdext/source/pdfimport/test/tests \
+))
+
+$(eval $(call gb_CppunitTest_use_executable,sdext_pdfimport,xpdfimport))
+
+$(eval $(call gb_CppunitTest_use_ure,sdext_pdfimport))
+$(eval $(call gb_CppunitTest_use_vcl,sdext_pdfimport))
+
+$(eval $(call gb_CppunitTest_use_components,sdext_pdfimport,\
+ comphelper/util/comphelp \
+ configmgr/source/configmgr \
+ i18npool/util/i18npool \
+ ucb/source/core/ucb1 \
+ ucb/source/ucp/file/ucpfile1 \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,sdext_pdfimport))
+
+# vim:set noet sw=4 ts=4:
diff --git a/sdext/CustomTarget_pdfimport.mk b/sdext/CustomTarget_pdfimport.mk
new file mode 100644
index 000000000..086daca5b
--- /dev/null
+++ b/sdext/CustomTarget_pdfimport.mk
@@ -0,0 +1,23 @@
+# -*- 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_CustomTarget_CustomTarget,sdext/pdfimport))
+
+$(call gb_CustomTarget_get_target,sdext/pdfimport) : \
+ $(call gb_CustomTarget_get_workdir,sdext/pdfimport)/hash.cxx
+
+$(call gb_CustomTarget_get_workdir,sdext/pdfimport)/hash.cxx : \
+ $(SRCDIR)/sdext/source/pdfimport/wrapper/keyword_list \
+ | $(call gb_CustomTarget_get_workdir,sdext/pdfimport)/.dir
+ $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),GPF,1)
+ $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),GPF)
+ $(GPERF) -C -t -l -L C++ -m 20 --switch=2 --readonly-tables -Z PdfKeywordHash -k'4-5,$$' $< > $@
+ $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),GPF)
+
+# vim:set shiftwidth=4 tabstop=4 noexpandtab:
diff --git a/sdext/Executable_pdf2xml.mk b/sdext/Executable_pdf2xml.mk
new file mode 100644
index 000000000..81e00eca1
--- /dev/null
+++ b/sdext/Executable_pdf2xml.mk
@@ -0,0 +1,44 @@
+# -*- 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_Executable_Executable,pdf2xml))
+
+$(eval $(call gb_Executable_use_sdk_api,pdf2xml))
+
+$(eval $(call gb_Executable_use_externals,pdf2xml,\
+ boost_headers \
+ cppunit \
+ zlib \
+))
+
+$(eval $(call gb_Executable_set_include,pdf2xml,\
+ -I$(SRCDIR)/sdext/source/pdfimport/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_Executable_use_libraries,pdf2xml,\
+ basegfx \
+ vcl \
+ comphelper \
+ cppu \
+ unotest \
+ cppuhelper \
+ sal \
+ tl \
+ xo \
+ i18nutil \
+))
+
+$(eval $(call gb_Executable_use_library_objects,pdf2xml,pdfimport))
+
+$(eval $(call gb_Executable_add_exception_objects,pdf2xml,\
+ sdext/source/pdfimport/test/pdf2xml \
+))
+
+# vim:set noet sw=4 ts=4:
diff --git a/sdext/Executable_pdfunzip.mk b/sdext/Executable_pdfunzip.mk
new file mode 100644
index 000000000..10c179336
--- /dev/null
+++ b/sdext/Executable_pdfunzip.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_Executable_Executable,pdfunzip))
+
+$(eval $(call gb_Executable_use_sdk_api,pdfunzip))
+
+$(eval $(call gb_Executable_use_externals,pdfunzip,\
+ boost_headers \
+ zlib \
+))
+
+$(eval $(call gb_Executable_set_include,pdfunzip,\
+ -I$(SRCDIR)/sdext/source/pdfimport/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_Executable_use_libraries,pdfunzip,\
+ basegfx \
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ vcl \
+ tl \
+ xo \
+ i18nutil \
+))
+
+$(eval $(call gb_Executable_use_library_objects,pdfunzip,pdfimport))
+
+$(eval $(call gb_Executable_add_exception_objects,pdfunzip,\
+ sdext/source/pdfimport/test/pdfunzip \
+))
+
+# vim:set noet sw=4 ts=4:
diff --git a/sdext/Executable_xpdfimport.mk b/sdext/Executable_xpdfimport.mk
new file mode 100644
index 000000000..e8b6f7a90
--- /dev/null
+++ b/sdext/Executable_xpdfimport.mk
@@ -0,0 +1,38 @@
+# -*- 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_Executable_Executable,xpdfimport))
+
+$(eval $(call gb_Executable_use_externals,xpdfimport,\
+ boost_headers \
+ poppler \
+ $(if $(filter-out WNT MACOSX,$(OS)),fontconfig) \
+ zlib \
+))
+
+$(eval $(call gb_Executable_add_exception_objects,xpdfimport,\
+ sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl \
+ sdext/source/pdfimport/xpdfwrapper/pnghelper \
+ sdext/source/pdfimport/xpdfwrapper/wrapper_gpl \
+))
+
+$(eval $(call gb_Executable_use_system_win32_libs,xpdfimport,\
+ shell32 \
+))
+
+$(eval $(call gb_Executable_add_default_nativeres,xpdfimport))
+
+ifneq ($(SYSTEM_POPPLER),)
+# Using system poppler
+$(eval $(call gb_Executable_add_defs,xpdfimport,\
+ -DSYSTEM_POPPLER \
+))
+endif
+
+# vim:set noet sw=4 ts=4:
diff --git a/sdext/IwyuFilter_sdext.yaml b/sdext/IwyuFilter_sdext.yaml
new file mode 100644
index 000000000..9a0aaea80
--- /dev/null
+++ b/sdext/IwyuFilter_sdext.yaml
@@ -0,0 +1,19 @@
+---
+assumeFilename: sdext/source/presenter/PresenterSlideSorter.cxx
+excludelist:
+ sdext/source/pdfimport/odf/odfemitter.cxx:
+ # Actually in use
+ - com/sun/star/io/XOutputStream.hpp
+ sdext/source/pdfimport/pdfparse/pdfparse.cxx:
+ # ignore boost stuff
+ - boost/spirit/include/classic_core.hpp
+ - boost/spirit/include/classic_utility.hpp
+ - boost/spirit/include/classic_error_handling.hpp
+ - boost/spirit/include/classic_file_iterator.hpp
+ - boost/bind.hpp
+ sdext/source/pdfimport/tree/imagecontainer.cxx:
+ # Actually in use
+ - com/sun/star/beans/PropertyValue.hpp
+ sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx:
+ # Actually in use
+ - vector
diff --git a/sdext/Library_PresentationMinimizer.mk b/sdext/Library_PresentationMinimizer.mk
new file mode 100644
index 000000000..5409d53a9
--- /dev/null
+++ b/sdext/Library_PresentationMinimizer.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_Library_Library,PresentationMinimizer))
+
+$(eval $(call gb_Library_set_componentfile,PresentationMinimizer,sdext/source/minimizer/minimizer,services))
+
+$(eval $(call gb_Library_set_precompiled_header,PresentationMinimizer,sdext/inc/pch/precompiled_PresentationMinimizer))
+
+$(eval $(call gb_Library_use_externals,PresentationMinimizer,\
+ boost_headers \
+))
+
+$(eval $(call gb_Library_use_sdk_api,PresentationMinimizer))
+
+$(eval $(call gb_Library_use_api,PresentationMinimizer,\
+ offapi \
+ udkapi \
+))
+
+$(eval $(call gb_Library_set_include,PresentationMinimizer,\
+ $$(INCLUDE) \
+ -I$(SRCDIR)/sdext/inc \
+))
+
+$(eval $(call gb_Library_use_libraries,PresentationMinimizer,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ sfx \
+ svt \
+ vcl \
+ tl \
+))
+
+$(eval $(call gb_Library_add_exception_objects,PresentationMinimizer,\
+ sdext/source/minimizer/configurationaccess \
+ sdext/source/minimizer/fileopendialog \
+ sdext/source/minimizer/graphiccollector \
+ sdext/source/minimizer/impoptimizer \
+ sdext/source/minimizer/informationdialog \
+ sdext/source/minimizer/optimizationstats \
+ sdext/source/minimizer/optimizerdialog \
+ sdext/source/minimizer/optimizerdialogcontrols \
+ sdext/source/minimizer/pagecollector \
+ sdext/source/minimizer/pppoptimizer \
+ sdext/source/minimizer/pppoptimizerdialog \
+ sdext/source/minimizer/pppoptimizertoken \
+ sdext/source/minimizer/unodialog \
+))
+
+# vim:set noet sw=4 ts=4:
diff --git a/sdext/Library_PresenterScreen.mk b/sdext/Library_PresenterScreen.mk
new file mode 100644
index 000000000..61a060c74
--- /dev/null
+++ b/sdext/Library_PresenterScreen.mk
@@ -0,0 +1,66 @@
+# -*- 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,PresenterScreen))
+
+$(eval $(call gb_Library_set_componentfile,PresenterScreen,sdext/source/presenter/presenter,services))
+
+$(eval $(call gb_Library_set_precompiled_header,PresenterScreen,sdext/inc/pch/precompiled_PresenterScreen))
+
+$(eval $(call gb_Library_use_externals,PresenterScreen,\
+ boost_headers \
+))
+
+$(eval $(call gb_Library_use_sdk_api,PresenterScreen))
+
+$(eval $(call gb_Library_use_libraries,PresenterScreen,\
+ cppu \
+ cppuhelper \
+ sal \
+ tl \
+ vcl \
+))
+
+$(eval $(call gb_Library_add_exception_objects,PresenterScreen,\
+ sdext/source/presenter/PresenterAccessibility \
+ sdext/source/presenter/PresenterBitmapContainer \
+ sdext/source/presenter/PresenterButton \
+ sdext/source/presenter/PresenterCanvasHelper \
+ sdext/source/presenter/PresenterConfigurationAccess \
+ sdext/source/presenter/PresenterController \
+ sdext/source/presenter/PresenterCurrentSlideObserver \
+ sdext/source/presenter/PresenterFrameworkObserver \
+ sdext/source/presenter/PresenterGeometryHelper \
+ sdext/source/presenter/PresenterHelpView \
+ sdext/source/presenter/PresenterHelper \
+ sdext/source/presenter/PresenterNotesView \
+ sdext/source/presenter/PresenterPaintManager \
+ sdext/source/presenter/PresenterPane \
+ sdext/source/presenter/PresenterPaneBase \
+ sdext/source/presenter/PresenterPaneBorderPainter \
+ sdext/source/presenter/PresenterPaneContainer \
+ sdext/source/presenter/PresenterPaneFactory \
+ sdext/source/presenter/PresenterProtocolHandler \
+ sdext/source/presenter/PresenterScreen \
+ sdext/source/presenter/PresenterScrollBar \
+ sdext/source/presenter/PresenterSlidePreview \
+ sdext/source/presenter/PresenterSlideShowView \
+ sdext/source/presenter/PresenterSlideSorter \
+ sdext/source/presenter/PresenterSprite \
+ sdext/source/presenter/PresenterSpritePane \
+ sdext/source/presenter/PresenterTextView \
+ sdext/source/presenter/PresenterTheme \
+ sdext/source/presenter/PresenterTimer \
+ sdext/source/presenter/PresenterToolBar \
+ sdext/source/presenter/PresenterUIPainter \
+ sdext/source/presenter/PresenterViewFactory \
+ sdext/source/presenter/PresenterWindowManager \
+))
+
+# vim:set noet sw=4 ts=4:
diff --git a/sdext/Library_pdfimport.mk b/sdext/Library_pdfimport.mk
new file mode 100644
index 000000000..dc1290cd0
--- /dev/null
+++ b/sdext/Library_pdfimport.mk
@@ -0,0 +1,72 @@
+# -*- 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,pdfimport))
+
+$(eval $(call gb_Library_set_componentfile,pdfimport,sdext/source/pdfimport/pdfimport,services))
+
+$(eval $(call gb_Library_use_sdk_api,pdfimport))
+
+$(eval $(call gb_Library_use_custom_headers,pdfimport,sdext/pdfimport))
+
+$(eval $(call gb_Library_set_include,pdfimport,\
+ -I$(SRCDIR)/sdext/source/pdfimport/inc \
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_Library_use_libraries,pdfimport,\
+ basegfx \
+ comphelper \
+ vcl \
+ cppu \
+ cppuhelper \
+ sal \
+ tl \
+ xo \
+ i18nutil \
+))
+
+$(eval $(call gb_Library_use_externals,pdfimport,\
+ boost_headers \
+ icu_headers \
+ zlib \
+ $(if $(filter-out WNT MACOSX,$(OS)),fontconfig) \
+))
+
+ifeq ($(COM),MSC)
+$(eval $(call gb_Library_add_defs,pdfimport, \
+ -D_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING \
+))
+endif
+
+$(eval $(call gb_Library_add_defs,pdfimport, \
+ -DBOOST_ALL_NO_LIB \
+))
+
+$(eval $(call gb_Library_add_exception_objects,pdfimport,\
+ sdext/source/pdfimport/filterdet \
+ sdext/source/pdfimport/misc/pdfihelper \
+ sdext/source/pdfimport/misc/pwdinteract \
+ sdext/source/pdfimport/odf/odfemitter \
+ sdext/source/pdfimport/pdfiadaptor \
+ sdext/source/pdfimport/pdfparse/pdfentries \
+ sdext/source/pdfimport/pdfparse/pdfparse \
+ sdext/source/pdfimport/sax/emitcontext \
+ sdext/source/pdfimport/sax/saxattrlist \
+ sdext/source/pdfimport/tree/drawtreevisiting \
+ sdext/source/pdfimport/tree/genericelements \
+ sdext/source/pdfimport/tree/imagecontainer \
+ sdext/source/pdfimport/tree/pdfiprocessor \
+ sdext/source/pdfimport/tree/style \
+ sdext/source/pdfimport/tree/treevisitorfactory \
+ sdext/source/pdfimport/tree/writertreevisiting \
+ sdext/source/pdfimport/wrapper/wrapper \
+))
+
+# vim:set noet sw=4 ts=4:
diff --git a/sdext/Makefile b/sdext/Makefile
new file mode 100644
index 000000000..0997e6284
--- /dev/null
+++ b/sdext/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/sdext/Module_sdext.mk b/sdext/Module_sdext.mk
new file mode 100644
index 000000000..fd1d191b4
--- /dev/null
+++ b/sdext/Module_sdext.mk
@@ -0,0 +1,40 @@
+# -*- 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_Module_Module,sdext))
+
+$(eval $(call gb_Module_add_targets,sdext,\
+ Library_PresenterScreen \
+))
+
+$(eval $(call gb_Module_add_targets,sdext,\
+ Library_PresentationMinimizer \
+))
+
+ifeq ($(ENABLE_PDFIMPORT),TRUE)
+$(eval $(call gb_Module_add_targets,sdext,\
+ CustomTarget_pdfimport \
+ Library_pdfimport \
+))
+
+ifeq ($(ENABLE_POPPLER),TRUE)
+$(eval $(call gb_Module_add_targets,sdext,\
+ Executable_xpdfimport \
+ Package_pdfimport_xpdfimport \
+))
+endif
+
+$(eval $(call gb_Module_add_check_targets,sdext,\
+ CppunitTest_sdext_pdfimport \
+ Executable_pdf2xml \
+ Executable_pdfunzip \
+))
+endif
+
+# vim:set noet sw=4 ts=4:
diff --git a/sdext/Package_pdfimport_xpdfimport.mk b/sdext/Package_pdfimport_xpdfimport.mk
new file mode 100644
index 000000000..9f08e05f4
--- /dev/null
+++ b/sdext/Package_pdfimport_xpdfimport.mk
@@ -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/.
+#
+
+$(eval $(call gb_Package_Package,sdext_pdfimport_pdf,$(SRCDIR)/sdext))
+
+$(eval $(call gb_Package_add_file,sdext_pdfimport_pdf,$(LIBO_SHARE_FOLDER)/xpdfimport/xpdfimport_err.pdf,source/pdfimport/dialogs/xpdfimport_err.pdf))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sdext/README.md b/sdext/README.md
new file mode 100644
index 000000000..86cb1d2af
--- /dev/null
+++ b/sdext/README.md
@@ -0,0 +1,30 @@
+# Extensions for the Impress and Draw Applications
+
+`source/pdfimport/` - PDF import
+
+Uses an external poppler process to parse and handle PDF
+import as draw shapes.
+
+`source/minimizer/` - Presentation Minimizer
+
+Shrinks presentations by down-scaling images, and removing
+extraneous eg. embedded OLE content.
+
+`source/presenter/` - Impress / Presenter Console.
+
+This couples to `sd/` in rather strange ways. Its design is
+heavily mangled by an attempt to use only UNO interfaces
+which are highly inadequate. This leads to somewhat
+ridiculous situations. Activating in response to
+configuration keys (for example), and the `XPresenterHelper`
+interface inside `sd/` used to create and manage windows.
+
+The main screen uses a hardware-accelerated
+canvas (e.g. cairo canvas), while the entire secondary screen
+uses a VCL-canvas that is created in
+`sd::framework::FullScreenPane::CreateCanvas()`.
+
+The secondary screen contains 3 `Pane`s which each have
+2 `XWindows` for the border area & the actual content,
+and each content Pane is backed by a `sd::presenter::PresenterCanvas`
+that wraps the `FullScreenPane`'s canvas and does clipping.
diff --git a/sdext/inc/bitmaps.hlst b/sdext/inc/bitmaps.hlst
new file mode 100644
index 000000000..57050a95e
--- /dev/null
+++ b/sdext/inc/bitmaps.hlst
@@ -0,0 +1,17 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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_SDEXT_INC_BITMAPS_HRC
+#define INCLUDED_SDEXT_INC_BITMAPS_HRC
+
+#define BMP_PRESENTATION_MINIMIZER "sd/res/minimize_presi_80.png"
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sdext/inc/pch/precompiled_PresentationMinimizer.cxx b/sdext/inc/pch/precompiled_PresentationMinimizer.cxx
new file mode 100644
index 000000000..5697379bf
--- /dev/null
+++ b/sdext/inc/pch/precompiled_PresentationMinimizer.cxx
@@ -0,0 +1,12 @@
+/* -*- 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 "precompiled_PresentationMinimizer.hxx"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/inc/pch/precompiled_PresentationMinimizer.hxx b/sdext/inc/pch/precompiled_PresentationMinimizer.hxx
new file mode 100644
index 000000000..b51da0e6c
--- /dev/null
+++ b/sdext/inc/pch/precompiled_PresentationMinimizer.hxx
@@ -0,0 +1,169 @@
+/* -*- 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 has been autogenerated by update_pch.sh. It is possible to edit it
+ manually (such as when an include file has been moved/renamed/removed). All such
+ manual changes will be rewritten by the next run of update_pch.sh (which presumably
+ also fixes all possible problems, so it's usually better to use it).
+
+ Generated on 2021-04-08 13:56:34 using:
+ ./bin/update_pch sdext PresentationMinimizer --cutoff=2 --exclude:system --include:module --include:local
+
+ If after updating build fails, use the following command to locate conflicting headers:
+ ./bin/update_pch_bisect ./sdext/inc/pch/precompiled_PresentationMinimizer.hxx "make sdext.build" --find-conflicts
+*/
+
+#include <sal/config.h>
+#if PCH_LEVEL >= 1
+#include <algorithm>
+#include <assert.h>
+#include <atomic>
+#include <cassert>
+#include <chrono>
+#include <cmath>
+#include <cstddef>
+#include <cstdlib>
+#include <float.h>
+#include <functional>
+#include <initializer_list>
+#include <iomanip>
+#include <limits.h>
+#include <limits>
+#include <locale>
+#include <math.h>
+#include <memory>
+#include <new>
+#include <ostream>
+#include <stddef.h>
+#include <string.h>
+#include <string>
+#include <string_view>
+#include <type_traits>
+#include <utility>
+#include <vector>
+#endif // PCH_LEVEL >= 1
+#if PCH_LEVEL >= 2
+#include <osl/diagnose.h>
+#include <osl/endian.h>
+#include <osl/file.h>
+#include <osl/file.hxx>
+#include <osl/interlck.h>
+#include <osl/mutex.h>
+#include <osl/mutex.hxx>
+#include <osl/thread.h>
+#include <osl/time.h>
+#include <rtl/alloc.h>
+#include <rtl/math.h>
+#include <rtl/ref.hxx>
+#include <rtl/string.h>
+#include <rtl/string.hxx>
+#include <rtl/stringconcat.hxx>
+#include <rtl/stringutils.hxx>
+#include <rtl/textcvt.h>
+#include <rtl/textenc.h>
+#include <rtl/ustrbuf.hxx>
+#include <rtl/ustring.h>
+#include <rtl/ustring.hxx>
+#include <sal/detail/log.h>
+#include <sal/log.hxx>
+#include <sal/macros.h>
+#include <sal/saldllapi.h>
+#include <sal/types.h>
+#include <sal/typesizes.h>
+#include <vcl/IDialogRenderable.hxx>
+#include <vcl/dllapi.h>
+#include <vcl/errcode.hxx>
+#include <vcl/errinf.hxx>
+#include <vcl/exceptiontypes.hxx>
+#include <vcl/fntstyle.hxx>
+#include <vcl/font.hxx>
+#include <vcl/inputtypes.hxx>
+#include <vcl/uitest/factory.hxx>
+#include <vcl/vclenum.hxx>
+#include <vcl/vclevent.hxx>
+#include <vcl/vclptr.hxx>
+#endif // PCH_LEVEL >= 2
+#if PCH_LEVEL >= 3
+#include <basegfx/basegfxdllapi.h>
+#include <basegfx/color/bcolor.hxx>
+#include <basegfx/numeric/ftools.hxx>
+#include <basegfx/point/b2ipoint.hxx>
+#include <basegfx/range/b2irange.hxx>
+#include <basegfx/range/basicrange.hxx>
+#include <basegfx/tuple/b2i64tuple.hxx>
+#include <basegfx/tuple/b2ituple.hxx>
+#include <basegfx/tuple/b3dtuple.hxx>
+#include <com/sun/star/accessibility/XAccessible.hpp>
+#include <com/sun/star/accessibility/XAccessibleRelationSet.hpp>
+#include <com/sun/star/awt/PushButtonType.hpp>
+#include <com/sun/star/awt/Size.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XIndexContainer.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/drawing/XShapes.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/presentation/XCustomPresentationSupplier.hpp>
+#include <com/sun/star/presentation/XPresentationPage.hpp>
+#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
+#include <com/sun/star/uno/Any.h>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/uno/Reference.h>
+#include <com/sun/star/uno/RuntimeException.hpp>
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/uno/Type.h>
+#include <com/sun/star/uno/Type.hxx>
+#include <com/sun/star/uno/TypeClass.hdl>
+#include <com/sun/star/uno/XInterface.hpp>
+#include <com/sun/star/uno/genfunc.h>
+#include <com/sun/star/uno/genfunc.hxx>
+#include <com/sun/star/util/Date.hpp>
+#include <com/sun/star/util/URL.hpp>
+#include <com/sun/star/util/URLTransformer.hpp>
+#include <com/sun/star/util/XURLTransformer.hpp>
+#include <comphelper/comphelperdllapi.h>
+#include <comphelper/solarmutex.hxx>
+#include <cppu/cppudllapi.h>
+#include <cppu/unotype.hxx>
+#include <cppuhelper/cppuhelperdllapi.h>
+#include <cppuhelper/exc_hlp.hxx>
+#include <i18nlangtag/lang.h>
+#include <o3tl/cow_wrapper.hxx>
+#include <o3tl/strong_int.hxx>
+#include <o3tl/typed_flags_set.hxx>
+#include <o3tl/underlyingenumvalue.hxx>
+#include <svtools/svtdllapi.h>
+#include <svtools/svtresid.hxx>
+#include <tools/color.hxx>
+#include <tools/date.hxx>
+#include <tools/degree.hxx>
+#include <tools/fldunit.hxx>
+#include <tools/fontenum.hxx>
+#include <tools/gen.hxx>
+#include <tools/link.hxx>
+#include <tools/long.hxx>
+#include <tools/toolsdllapi.h>
+#include <typelib/typeclass.h>
+#include <typelib/typedescription.h>
+#include <typelib/uik.h>
+#include <uno/any2.h>
+#include <uno/data.h>
+#include <uno/sequence2.h>
+#endif // PCH_LEVEL >= 3
+#if PCH_LEVEL >= 4
+#endif // PCH_LEVEL >= 4
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/inc/pch/precompiled_PresenterScreen.cxx b/sdext/inc/pch/precompiled_PresenterScreen.cxx
new file mode 100644
index 000000000..a6ffcd28f
--- /dev/null
+++ b/sdext/inc/pch/precompiled_PresenterScreen.cxx
@@ -0,0 +1,12 @@
+/* -*- 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 "precompiled_PresenterScreen.hxx"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/inc/pch/precompiled_PresenterScreen.hxx b/sdext/inc/pch/precompiled_PresenterScreen.hxx
new file mode 100644
index 000000000..755e88598
--- /dev/null
+++ b/sdext/inc/pch/precompiled_PresenterScreen.hxx
@@ -0,0 +1,162 @@
+/* -*- 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 has been autogenerated by update_pch.sh. It is possible to edit it
+ manually (such as when an include file has been moved/renamed/removed). All such
+ manual changes will be rewritten by the next run of update_pch.sh (which presumably
+ also fixes all possible problems, so it's usually better to use it).
+
+ Generated on 2021-04-08 13:56:34 using:
+ ./bin/update_pch sdext PresenterScreen --cutoff=2 --exclude:system --include:module --exclude:local
+
+ If after updating build fails, use the following command to locate conflicting headers:
+ ./bin/update_pch_bisect ./sdext/inc/pch/precompiled_PresenterScreen.hxx "make sdext.build" --find-conflicts
+*/
+
+#include <sal/config.h>
+#if PCH_LEVEL >= 1
+#include <algorithm>
+#include <assert.h>
+#include <atomic>
+#include <cassert>
+#include <chrono>
+#include <cstddef>
+#include <cstdlib>
+#include <functional>
+#include <initializer_list>
+#include <iomanip>
+#include <limits.h>
+#include <limits>
+#include <map>
+#include <math.h>
+#include <memory>
+#include <new>
+#include <numeric>
+#include <ostream>
+#include <stddef.h>
+#include <string.h>
+#include <string>
+#include <string_view>
+#include <type_traits>
+#include <utility>
+#include <vector>
+#endif // PCH_LEVEL >= 1
+#if PCH_LEVEL >= 2
+#include <osl/conditn.h>
+#include <osl/conditn.hxx>
+#include <osl/diagnose.h>
+#include <osl/doublecheckedlocking.h>
+#include <osl/getglobalmutex.hxx>
+#include <osl/interlck.h>
+#include <osl/mutex.h>
+#include <osl/mutex.hxx>
+#include <osl/thread.h>
+#include <osl/thread.hxx>
+#include <osl/time.h>
+#include <rtl/alloc.h>
+#include <rtl/instance.hxx>
+#include <rtl/ref.hxx>
+#include <rtl/string.h>
+#include <rtl/string.hxx>
+#include <rtl/stringconcat.hxx>
+#include <rtl/stringutils.hxx>
+#include <rtl/textcvt.h>
+#include <rtl/textenc.h>
+#include <rtl/ustrbuf.hxx>
+#include <rtl/ustring.h>
+#include <rtl/ustring.hxx>
+#include <sal/log.hxx>
+#include <sal/macros.h>
+#include <sal/saldllapi.h>
+#include <sal/types.h>
+#include <sal/typesizes.h>
+#include <vcl/IDialogRenderable.hxx>
+#include <vcl/dllapi.h>
+#include <vcl/exceptiontypes.hxx>
+#include <vcl/inputtypes.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/vclenum.hxx>
+#include <vcl/vclevent.hxx>
+#include <vcl/vclptr.hxx>
+#endif // PCH_LEVEL >= 2
+#if PCH_LEVEL >= 3
+#include <com/sun/star/accessibility/AccessibleTextType.hpp>
+#include <com/sun/star/awt/InvalidateStyle.hpp>
+#include <com/sun/star/awt/Key.hpp>
+#include <com/sun/star/awt/KeyModifier.hpp>
+#include <com/sun/star/awt/PosSize.hpp>
+#include <com/sun/star/awt/XWindow2.hpp>
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/drawing/XPresenterHelper.hpp>
+#include <com/sun/star/drawing/framework/ResourceActivationMode.hpp>
+#include <com/sun/star/drawing/framework/ResourceId.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/XMultiComponentFactory.hpp>
+#include <com/sun/star/lang/XTypeProvider.hpp>
+#include <com/sun/star/presentation/XPresentation2.hpp>
+#include <com/sun/star/presentation/XPresentationSupplier.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <com/sun/star/rendering/FillRule.hpp>
+#include <com/sun/star/rendering/RenderState.hpp>
+#include <com/sun/star/rendering/TextDirection.hpp>
+#include <com/sun/star/rendering/TexturingMode.hpp>
+#include <com/sun/star/rendering/ViewState.hpp>
+#include <com/sun/star/rendering/XSpriteCanvas.hpp>
+#include <com/sun/star/uno/Any.h>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/uno/Reference.h>
+#include <com/sun/star/uno/RuntimeException.hpp>
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/uno/Type.h>
+#include <com/sun/star/uno/Type.hxx>
+#include <com/sun/star/uno/TypeClass.hdl>
+#include <com/sun/star/uno/XInterface.hpp>
+#include <com/sun/star/uno/XWeak.hpp>
+#include <com/sun/star/uno/genfunc.h>
+#include <com/sun/star/uno/genfunc.hxx>
+#include <com/sun/star/util/Color.hpp>
+#include <comphelper/comphelperdllapi.h>
+#include <comphelper/solarmutex.hxx>
+#include <cppu/cppudllapi.h>
+#include <cppu/unotype.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/cppuhelperdllapi.h>
+#include <cppuhelper/implbase_ex.hxx>
+#include <cppuhelper/implbase_ex_post.hxx>
+#include <cppuhelper/implbase_ex_pre.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <cppuhelper/weak.hxx>
+#include <i18nlangtag/lang.h>
+#include <o3tl/safeint.hxx>
+#include <o3tl/strong_int.hxx>
+#include <o3tl/typed_flags_set.hxx>
+#include <o3tl/underlyingenumvalue.hxx>
+#include <tools/degree.hxx>
+#include <tools/diagnose_ex.h>
+#include <tools/gen.hxx>
+#include <tools/link.hxx>
+#include <tools/long.hxx>
+#include <tools/toolsdllapi.h>
+#include <typelib/typeclass.h>
+#include <typelib/typedescription.h>
+#include <typelib/uik.h>
+#include <uno/any2.h>
+#include <uno/data.h>
+#include <uno/sequence2.h>
+#endif // PCH_LEVEL >= 3
+#if PCH_LEVEL >= 4
+#endif // PCH_LEVEL >= 4
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/configurationaccess.cxx b/sdext/source/minimizer/configurationaccess.cxx
new file mode 100644
index 000000000..3479918c2
--- /dev/null
+++ b/sdext/source/minimizer/configurationaccess.cxx
@@ -0,0 +1,458 @@
+/* -*- 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 "configurationaccess.hxx"
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/configuration/theDefaultProvider.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <comphelper/propertysequence.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <sal/macros.h>
+#include <sal/log.hxx>
+#include <tools/diagnose_ex.h>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+
+static OUString GetPathToConfigurationRoot()
+{
+ return "org.openoffice.Office.PresentationMinimizer";
+}
+
+void OptimizerSettings::LoadSettingsFromConfiguration( const Reference< XNameAccess >& rSettings )
+{
+ if ( !rSettings.is() )
+ return;
+
+ const Sequence< OUString > aElements( rSettings->getElementNames() );
+ for ( const OUString& aPropertyName : aElements )
+ {
+ try
+ {
+ Any aValue( rSettings->getByName( aPropertyName ) );
+ switch( TKGet( aPropertyName ) )
+ {
+ case TK_Name : aValue >>= maName; break;
+ case TK_JPEGCompression : aValue >>= mbJPEGCompression; break;
+ case TK_JPEGQuality : aValue >>= mnJPEGQuality; break;
+ case TK_RemoveCropArea : aValue >>= mbRemoveCropArea; break;
+ case TK_ImageResolution : aValue >>= mnImageResolution; break;
+ case TK_EmbedLinkedGraphics : aValue >>= mbEmbedLinkedGraphics; break;
+ case TK_OLEOptimization : aValue >>= mbOLEOptimization; break;
+ case TK_OLEOptimizationType : aValue >>= mnOLEOptimizationType; break;
+ case TK_DeleteUnusedMasterPages : aValue >>= mbDeleteUnusedMasterPages; break;
+ case TK_DeleteHiddenSlides : aValue >>= mbDeleteHiddenSlides; break;
+ case TK_DeleteNotesPages : aValue >>= mbDeleteNotesPages ;break;
+ case TK_SaveAs : aValue >>= mbSaveAs; break;
+// case TK_SaveAsURL : aValue >>= maSaveAsURL; break; // URL is not saved to configuration
+// case TK_FilterName : aValue >>= maFilterName; break; // URL is not saved to configuration
+ case TK_OpenNewDocument : aValue >>= mbOpenNewDocument; break;
+ default: break;
+ }
+ }
+ catch (const Exception&)
+ {
+ }
+ }
+}
+
+void OptimizerSettings::SaveSettingsToConfiguration( const Reference< XNameReplace >& rSettings )
+{
+ if ( !rSettings.is() )
+ return;
+
+ OUString pNames[] = {
+ OUString("Name"),
+ OUString("JPEGCompression"),
+ OUString("JPEGQuality"),
+ OUString("RemoveCropArea"),
+ OUString("ImageResolution"),
+ OUString("EmbedLinkedGraphics"),
+ OUString("OLEOptimization"),
+ OUString("OLEOptimizationType"),
+ OUString("DeleteUnusedMasterPages"),
+ OUString("DeleteHiddenSlides"),
+ OUString("DeleteNotesPages"),
+ OUString("SaveAs"),
+// OUString("SaveAsURL"),
+// OUString("FilterName"),
+ OUString("OpenNewDocument") };
+
+ Any pValues[] = {
+ Any( maName ),
+ Any( mbJPEGCompression ),
+ Any( mnJPEGQuality ),
+ Any( mbRemoveCropArea ),
+ Any( mnImageResolution ),
+ Any( mbEmbedLinkedGraphics ),
+ Any( mbOLEOptimization ),
+ Any( mnOLEOptimizationType ),
+ Any( mbDeleteUnusedMasterPages ),
+ Any( mbDeleteHiddenSlides ),
+ Any( mbDeleteNotesPages ),
+ Any( mbSaveAs ),
+// Any( maSaveAsURL ),
+// Any( maFilterName ),
+ Any( mbOpenNewDocument ) };
+
+ for ( int i = 0; i < int(SAL_N_ELEMENTS( pNames )); i++ )
+ {
+ try
+ {
+ rSettings->replaceByName( pNames[ i ], pValues[ i ] );
+ }
+ catch (const Exception&)
+ {
+ }
+ }
+}
+
+bool OptimizerSettings::operator==( const OptimizerSettings& rOptimizerSettings ) const
+{
+ return ( rOptimizerSettings.mbJPEGCompression == mbJPEGCompression )
+ && ( rOptimizerSettings.mnJPEGQuality == mnJPEGQuality )
+ && ( rOptimizerSettings.mbRemoveCropArea == mbRemoveCropArea )
+ && ( rOptimizerSettings.mnImageResolution == mnImageResolution )
+ && ( rOptimizerSettings.mbEmbedLinkedGraphics == mbEmbedLinkedGraphics )
+ && ( rOptimizerSettings.mbOLEOptimization == mbOLEOptimization )
+ && ( rOptimizerSettings.mnOLEOptimizationType == mnOLEOptimizationType )
+ && ( rOptimizerSettings.mbDeleteUnusedMasterPages == mbDeleteUnusedMasterPages )
+ && ( rOptimizerSettings.mbDeleteHiddenSlides == mbDeleteHiddenSlides )
+ && ( rOptimizerSettings.mbDeleteNotesPages == mbDeleteNotesPages );
+// && ( rOptimizerSettings.mbOpenNewDocument == mbOpenNewDocument );
+}
+
+
+ConfigurationAccess::ConfigurationAccess( const Reference< uno::XComponentContext >& rxContext ) :
+ mxContext( rxContext )
+{
+ LoadStrings();
+ maSettings.emplace_back( );
+ maSettings.back().maName = "LastUsedSettings";
+ LoadConfiguration();
+};
+
+ConfigurationAccess::~ConfigurationAccess()
+{
+}
+
+OUString ConfigurationAccess::getString( const PPPOptimizerTokenEnum eToken ) const
+{
+ std::map< PPPOptimizerTokenEnum, OUString >::const_iterator aIter( maStrings.find( eToken ) );
+ return aIter != maStrings.end() ? ((*aIter).second) : OUString();
+}
+
+void ConfigurationAccess::LoadStrings()
+{
+ try
+ {
+ do
+ {
+ Reference< XInterface > xRoot( OpenConfiguration( true ) );
+ if ( !xRoot.is() )
+ break;
+ Reference< container::XNameAccess > xSet( GetConfigurationNode( xRoot, "Strings" ), UNO_QUERY );
+ if ( xSet.is() )
+ {
+ const Sequence< OUString > aElements( xSet->getElementNames() );
+ for ( const auto& rElement : aElements )
+ {
+ try
+ {
+ OUString aString, aPropertyName( rElement );
+ if ( xSet->getByName( aPropertyName ) >>= aString )
+ maStrings[ TKGet( aPropertyName ) ] = aString;
+ }
+ catch (const Exception&)
+ {
+ }
+ }
+ }
+ }
+ while( false );
+ }
+ catch (const Exception&)
+ {
+ }
+}
+
+void ConfigurationAccess::LoadConfiguration()
+{
+ try
+ {
+ do
+ {
+ Reference< XInterface > xRoot( OpenConfiguration( true ) );
+ if ( !xRoot.is() )
+ break;
+ Reference< container::XNameAccess > xSet( GetConfigurationNode( xRoot, "LastUsedSettings" ), UNO_QUERY );
+ if ( xSet.is() )
+ {
+ OptimizerSettings& rCurrent( maSettings.front() );
+ rCurrent.LoadSettingsFromConfiguration( xSet );
+ }
+ xSet.set( GetConfigurationNode( xRoot, "Settings/Templates" ), UNO_QUERY );
+ if ( xSet.is() )
+ {
+ const Sequence< OUString > aElements( xSet->getElementNames() );
+ for ( const auto& rElement : aElements )
+ {
+ try
+ {
+ OUString aPath( "Settings/Templates/" + rElement );
+ Reference< container::XNameAccess > xTemplates( GetConfigurationNode( xRoot, aPath ), UNO_QUERY );
+ if ( xTemplates.is() )
+ {
+ maSettings.emplace_back( );
+ maSettings.back().LoadSettingsFromConfiguration( xTemplates );
+ }
+ }
+ catch (const Exception&)
+ {
+ }
+ }
+ }
+ }
+ while( false );
+ }
+ catch (const Exception&)
+ {
+ }
+}
+
+void ConfigurationAccess::SaveConfiguration()
+{
+ try
+ {
+ do
+ {
+ Reference<util::XChangesBatch> xRoot( OpenConfiguration( false ), UNO_QUERY_THROW );
+
+ // storing the last used settings
+ Reference< container::XNameReplace > xSet( GetConfigurationNode( xRoot, "LastUsedSettings" ), UNO_QUERY_THROW );
+ OptimizerSettings& rCurrent( maSettings.front() );
+ rCurrent.SaveSettingsToConfiguration( xSet );
+
+ // updating template elements
+ xSet.set( GetConfigurationNode( xRoot, "Settings/Templates" ), UNO_QUERY_THROW );
+ Reference< container::XNameContainer > xNameContainer( xSet, UNO_QUERY_THROW );
+
+ const Sequence< OUString > aElements( xSet->getElementNames() );
+ for( const auto& rElement : aElements )
+ xNameContainer->removeByName( rElement );
+
+ for( std::vector<OptimizerSettings>::size_type k = 1; k < maSettings.size(); k++ )
+ {
+ OptimizerSettings& rSettings( maSettings[ k ] );
+ OUString aElementName( "Template" + OUString::number( k ) );
+ Reference< lang::XSingleServiceFactory > xChildFactory ( xSet, UNO_QUERY_THROW );
+ Reference< container::XNameReplace > xChild( xChildFactory->createInstance(), UNO_QUERY_THROW );
+ xNameContainer->insertByName( aElementName, Any( xChild ) );
+
+ OUString aPath( "Settings/Templates/" + aElementName );
+ Reference< container::XNameReplace > xTemplates( GetConfigurationNode( xRoot, aPath ), UNO_QUERY );
+ rSettings.SaveSettingsToConfiguration( xTemplates );
+ }
+ xRoot->commitChanges();
+ }
+ while( false );
+ }
+ catch (const Exception&)
+ {
+ }
+}
+
+Reference< XInterface > ConfigurationAccess::OpenConfiguration( bool bReadOnly )
+{
+ Reference< XInterface > xRoot;
+ try
+ {
+ Reference< lang::XMultiServiceFactory > xProvider = configuration::theDefaultProvider::get( mxContext );
+ uno::Sequence<uno::Any> aCreationArguments(comphelper::InitAnyPropertySequence(
+ {
+ {"nodepath", uno::Any(GetPathToConfigurationRoot())}
+ }));
+ OUString sAccessService;
+ if ( bReadOnly )
+ sAccessService = "com.sun.star.configuration.ConfigurationAccess";
+ else
+ sAccessService =
+ "com.sun.star.configuration.ConfigurationUpdateAccess";
+
+ xRoot = xProvider->createInstanceWithArguments(
+ sAccessService, aCreationArguments );
+ }
+ catch (const Exception&)
+ {
+ }
+ return xRoot;
+}
+
+Reference< XInterface > ConfigurationAccess::GetConfigurationNode(
+ const Reference< XInterface >& xRoot,
+ const OUString& sPathToNode )
+{
+ Reference< XInterface > xNode;
+ try
+ {
+ if ( sPathToNode.isEmpty() )
+ xNode = xRoot;
+ else
+ {
+ Reference< XHierarchicalNameAccess > xHierarchy( xRoot, UNO_QUERY );
+ if ( xHierarchy.is() )
+ {
+ xHierarchy->getByHierarchicalName( sPathToNode ) >>= xNode;
+ }
+ }
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION("sdext.minimizer", "caught exception while getting configuration node "
+ << sPathToNode);
+ }
+ return xNode;
+}
+
+css::uno::Any ConfigurationAccess::GetConfigProperty( const PPPOptimizerTokenEnum ePropertyToken ) const
+{
+ Any aRetValue;
+ const OptimizerSettings& rSettings( maSettings.front() );
+ try
+ {
+ switch( ePropertyToken )
+ {
+ case TK_Name : aRetValue <<= rSettings.maName; break;
+ case TK_JPEGCompression : aRetValue <<= rSettings.mbJPEGCompression; break;
+ case TK_JPEGQuality : aRetValue <<= rSettings.mnJPEGQuality; break;
+ case TK_RemoveCropArea : aRetValue <<= rSettings.mbRemoveCropArea; break;
+ case TK_ImageResolution : aRetValue <<= rSettings.mnImageResolution; break;
+ case TK_EmbedLinkedGraphics : aRetValue <<= rSettings.mbEmbedLinkedGraphics; break;
+ case TK_OLEOptimization : aRetValue <<= rSettings.mbOLEOptimization; break;
+ case TK_OLEOptimizationType : aRetValue <<= rSettings.mnOLEOptimizationType; break;
+ case TK_DeleteUnusedMasterPages : aRetValue <<= rSettings.mbDeleteUnusedMasterPages; break;
+ case TK_DeleteHiddenSlides : aRetValue <<= rSettings.mbDeleteHiddenSlides; break;
+ case TK_DeleteNotesPages : aRetValue <<= rSettings.mbDeleteNotesPages; break;
+ case TK_SaveAs : aRetValue <<= rSettings.mbSaveAs; break;
+ case TK_SaveAsURL : aRetValue <<= rSettings.maSaveAsURL; break;
+ case TK_FilterName : aRetValue <<= rSettings.maFilterName; break;
+ case TK_OpenNewDocument : aRetValue <<= rSettings.mbOpenNewDocument; break;
+ case TK_EstimatedFileSize : aRetValue <<= rSettings.mnEstimatedFileSize; break;
+ default:
+ break;
+ }
+ }
+ catch (const Exception&)
+ {
+ }
+ return aRetValue;
+}
+
+void ConfigurationAccess::SetConfigProperty( const PPPOptimizerTokenEnum ePropertyToken, const css::uno::Any& rValue )
+{
+ OptimizerSettings& rSettings( maSettings.front() );
+ try
+ {
+ switch( ePropertyToken )
+ {
+ case TK_Name : rValue >>= rSettings.maName; break;
+ case TK_JPEGCompression : rValue >>= rSettings.mbJPEGCompression; break;
+ case TK_JPEGQuality : rValue >>= rSettings.mnJPEGQuality; break;
+ case TK_RemoveCropArea : rValue >>= rSettings.mbRemoveCropArea; break;
+ case TK_ImageResolution : rValue >>= rSettings.mnImageResolution; break;
+ case TK_EmbedLinkedGraphics : rValue >>= rSettings.mbEmbedLinkedGraphics; break;
+ case TK_OLEOptimization : rValue >>= rSettings.mbOLEOptimization; break;
+ case TK_OLEOptimizationType : rValue >>= rSettings.mnOLEOptimizationType; break;
+ case TK_DeleteUnusedMasterPages : rValue >>= rSettings.mbDeleteUnusedMasterPages; break;
+ case TK_DeleteHiddenSlides : rValue >>= rSettings.mbDeleteHiddenSlides; break;
+ case TK_DeleteNotesPages : rValue >>= rSettings.mbDeleteNotesPages; break;
+ case TK_CustomShowName : rValue >>= rSettings.maCustomShowName; break;
+ case TK_SaveAs : rValue >>= rSettings.mbSaveAs; break;
+ case TK_SaveAsURL : rValue >>= rSettings.maSaveAsURL; break;
+ case TK_FilterName : rValue >>= rSettings.maFilterName; break;
+ case TK_OpenNewDocument : rValue >>= rSettings.mbOpenNewDocument; break;
+ case TK_EstimatedFileSize : rValue >>= rSettings.mnEstimatedFileSize; break;
+ default:
+ break;
+ }
+ }
+ catch (const Exception&)
+ {
+ }
+}
+
+bool ConfigurationAccess::GetConfigProperty( const PPPOptimizerTokenEnum ePropertyToken, const bool bDefault ) const
+{
+ bool bRetValue = bDefault;
+ if ( ! ( GetConfigProperty( ePropertyToken ) >>= bRetValue ) )
+ bRetValue = bDefault;
+ return bRetValue;
+}
+
+sal_Int16 ConfigurationAccess::GetConfigProperty( const PPPOptimizerTokenEnum ePropertyToken, const sal_Int16 nDefault ) const
+{
+ sal_Int16 nRetValue = nDefault;
+ if ( ! ( GetConfigProperty( ePropertyToken ) >>= nRetValue ) )
+ nRetValue = nDefault;
+ return nRetValue;
+}
+
+sal_Int32 ConfigurationAccess::GetConfigProperty( const PPPOptimizerTokenEnum ePropertyToken, const sal_Int32 nDefault ) const
+{
+ sal_Int32 nRetValue = nDefault;
+ if ( ! ( GetConfigProperty( ePropertyToken ) >>= nRetValue ) )
+ nRetValue = nDefault;
+ return nRetValue;
+}
+
+Sequence< PropertyValue > ConfigurationAccess::GetConfigurationSequence()
+{
+ OptimizerSettings& rSettings( maSettings.front() );
+ Sequence< PropertyValue > aRet{
+ comphelper::makePropertyValue("JPEGCompression", rSettings.mbJPEGCompression),
+ comphelper::makePropertyValue("JPEGQuality", rSettings.mnJPEGQuality),
+ comphelper::makePropertyValue("RemoveCropArea", rSettings.mbRemoveCropArea),
+ comphelper::makePropertyValue("ImageResolution", rSettings.mnImageResolution),
+ comphelper::makePropertyValue("EmbedLinkedGraphics", rSettings.mbEmbedLinkedGraphics),
+ comphelper::makePropertyValue("OLEOptimization", rSettings.mbOLEOptimization),
+ comphelper::makePropertyValue("OLEOptimizationType", rSettings.mnOLEOptimizationType),
+ comphelper::makePropertyValue("DeleteUnusedMasterPages", rSettings.mbDeleteUnusedMasterPages),
+ comphelper::makePropertyValue("DeleteHiddenSlides", rSettings.mbDeleteHiddenSlides),
+ comphelper::makePropertyValue("DeleteNotesPages", rSettings.mbDeleteNotesPages),
+ comphelper::makePropertyValue("CustomShowName", rSettings.maCustomShowName),
+ comphelper::makePropertyValue("SaveAsURL", rSettings.maSaveAsURL),
+ comphelper::makePropertyValue("FilterName", rSettings.maFilterName),
+ comphelper::makePropertyValue("OpenNewDocument", rSettings.mbOpenNewDocument),
+ comphelper::makePropertyValue("EstimatedFileSize", rSettings.mnEstimatedFileSize)
+ };
+ return aRet;
+}
+
+std::vector< OptimizerSettings >::iterator ConfigurationAccess::GetOptimizerSettingsByName( const OUString& rName )
+{
+ return std::find_if(maSettings.begin() + 1, maSettings.end(),
+ [&rName](const OptimizerSettings& rSettings) { return rSettings.maName == rName; });
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/configurationaccess.hxx b/sdext/source/minimizer/configurationaccess.hxx
new file mode 100644
index 000000000..d4d4c4d3f
--- /dev/null
+++ b/sdext/source/minimizer/configurationaccess.hxx
@@ -0,0 +1,116 @@
+/* -*- 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_SDEXT_SOURCE_MINIMIZER_CONFIGURATIONACCESS_HXX
+#define INCLUDED_SDEXT_SOURCE_MINIMIZER_CONFIGURATIONACCESS_HXX
+
+#include <vector>
+#include "pppoptimizertoken.hxx"
+#include <com/sun/star/uno/Any.h>
+#include <com/sun/star/uno/Reference.h>
+#include <com/sun/star/uno/XInterface.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XNameReplace.hpp>
+#include <map>
+
+struct OptimizerSettings
+{
+ OUString maName;
+ bool mbJPEGCompression;
+ sal_Int32 mnJPEGQuality;
+ bool mbRemoveCropArea;
+ sal_Int32 mnImageResolution;
+ bool mbEmbedLinkedGraphics;
+ bool mbOLEOptimization;
+ sal_Int16 mnOLEOptimizationType;
+ bool mbDeleteUnusedMasterPages;
+ bool mbDeleteHiddenSlides;
+ bool mbDeleteNotesPages;
+ OUString maCustomShowName;
+ bool mbSaveAs;
+ OUString maSaveAsURL;
+ OUString maFilterName;
+ bool mbOpenNewDocument;
+ sal_Int64 mnEstimatedFileSize;
+
+ OptimizerSettings() :
+ mbJPEGCompression( false ),
+ mnJPEGQuality( 90 ),
+ mbRemoveCropArea( false ),
+ mnImageResolution( 0 ),
+ mbEmbedLinkedGraphics( false ),
+ mbOLEOptimization( false ),
+ mnOLEOptimizationType( 0 ),
+ mbDeleteUnusedMasterPages( false ),
+ mbDeleteHiddenSlides( false ),
+ mbDeleteNotesPages( false ),
+ mbSaveAs( true ),
+ mbOpenNewDocument( true ),
+ mnEstimatedFileSize( 0 ){};
+
+ void LoadSettingsFromConfiguration( const css::uno::Reference< css::container::XNameAccess >& rSettings );
+ void SaveSettingsToConfiguration( const css::uno::Reference< css::container::XNameReplace >& rSettings );
+
+ bool operator==( const OptimizerSettings& rOptimizerSettings ) const;
+
+};
+class ConfigurationAccess
+{
+ public:
+
+ explicit ConfigurationAccess( const css::uno::Reference< css::uno::XComponentContext >& rXFactory );
+ ~ConfigurationAccess();
+ void SaveConfiguration();
+
+ OUString getString( const PPPOptimizerTokenEnum ) const;
+
+ // access to current OptimizerSettings (stored in the first entry of maSettings)
+ css::uno::Any GetConfigProperty( const PPPOptimizerTokenEnum ) const;
+ void SetConfigProperty( const PPPOptimizerTokenEnum, const css::uno::Any& aValue );
+
+ bool GetConfigProperty( const PPPOptimizerTokenEnum, const bool bDefault ) const;
+ sal_Int16 GetConfigProperty( const PPPOptimizerTokenEnum, const sal_Int16 nDefault ) const;
+ sal_Int32 GetConfigProperty( const PPPOptimizerTokenEnum, const sal_Int32 nDefault ) const;
+
+ css::uno::Sequence< css::beans::PropertyValue > GetConfigurationSequence();
+
+ // getting access to the OptimizerSettings list
+ std::vector< OptimizerSettings >& GetOptimizerSettings() { return maSettings; };
+ std::vector< OptimizerSettings >::iterator GetOptimizerSettingsByName( const OUString& rName );
+
+ private:
+
+ std::map < PPPOptimizerTokenEnum, OUString > maStrings;
+
+ std::vector< OptimizerSettings > maSettings;
+
+ css::uno::Reference< css::uno::XComponentContext > mxContext;
+
+ void LoadStrings();
+ void LoadConfiguration();
+ css::uno::Reference< css::uno::XInterface > OpenConfiguration( bool bReadOnly );
+ static css::uno::Reference< css::uno::XInterface > GetConfigurationNode(
+ const css::uno::Reference< css::uno::XInterface >& xRoot, const OUString& sPathToNode );
+};
+
+#endif // INCLUDED_SDEXT_SOURCE_MINIMIZER_CONFIGURATIONACCESS_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/fileopendialog.cxx b/sdext/source/minimizer/fileopendialog.cxx
new file mode 100644
index 000000000..ef0dbf4b4
--- /dev/null
+++ b/sdext/source/minimizer/fileopendialog.cxx
@@ -0,0 +1,169 @@
+/* -*- 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 "fileopendialog.hxx"
+#include <sal/types.h>
+#include "pppoptimizertoken.hxx"
+#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
+#include <com/sun/star/ui/dialogs/FilePicker.hpp>
+#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
+#include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
+#include <com/sun/star/ui/dialogs/XFilterManager.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/container/XEnumeration.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/view/XControlAccess.hpp>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::view;
+using namespace ::com::sun::star::ui::dialogs;
+
+FileOpenDialog::FileOpenDialog( const Reference< XComponentContext >& rxContext )
+{
+ mxFilePicker = FilePicker::createWithMode( rxContext, TemplateDescription::FILESAVE_AUTOEXTENSION);
+ mxFilePicker->setMultiSelectionMode( false );
+
+ Reference< XFilePickerControlAccess > xAccess( mxFilePicker, UNO_QUERY );
+ if ( xAccess.is() )
+ {
+ try
+ {
+ xAccess->setValue( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, 0, Any( true ) );
+ }
+ catch( css::uno::Exception& )
+ {}
+ }
+
+ // collecting a list of impress filters
+ Reference< XNameAccess > xFilters( rxContext->getServiceManager()->createInstanceWithContext(
+ "com.sun.star.document.FilterFactory", rxContext ), UNO_QUERY_THROW );
+ const Sequence< OUString > aFilterList( xFilters->getElementNames() );
+ for ( const auto& rFilter : aFilterList )
+ {
+ try
+ {
+ Sequence< PropertyValue > aFilterProperties;
+ if ( xFilters->getByName( rFilter ) >>= aFilterProperties )
+ {
+ FilterEntry aFilterEntry;
+ bool bImpressFilter = false;
+ for ( const PropertyValue& rProperty : std::as_const(aFilterProperties) )
+ {
+ bool bStop = false;
+ switch( TKGet( rProperty.Name ) )
+ {
+ case TK_DocumentService :
+ {
+ OUString sDocumentService;
+ rProperty.Value >>= sDocumentService;
+ if ( sDocumentService == "com.sun.star.presentation.PresentationDocument" )
+ bImpressFilter = true;
+ else
+ bStop = true;
+ }
+ break;
+ case TK_Name : rProperty.Value >>= aFilterEntry.maFilterEntryName; break;
+ case TK_UIName : rProperty.Value >>= aFilterEntry.maUIName; break;
+ case TK_Type : rProperty.Value >>= aFilterEntry.maType; break;
+ case TK_Flags : rProperty.Value >>= aFilterEntry.maFlags; break;
+ default : break;
+ }
+
+ if (bStop)
+ break;
+ }
+ if ( bImpressFilter && ( ( aFilterEntry.maFlags & 3 ) == 3 ) )
+ {
+ aFilterEntryList.push_back( aFilterEntry );
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ }
+ }
+
+ Reference< XNameAccess > xTypes( rxContext->getServiceManager()->createInstanceWithContext(
+ "com.sun.star.document.TypeDetection", rxContext ), UNO_QUERY_THROW );
+
+ for (auto& rFilterEntry : aFilterEntryList)
+ {
+ Sequence< PropertyValue > aTypeProperties;
+ try
+ {
+ if ( xTypes->getByName( rFilterEntry.maType ) >>= aTypeProperties )
+ {
+ Sequence< OUString > aExtensions;
+ auto pProp = std::find_if(std::cbegin(aTypeProperties), std::cend(aTypeProperties),
+ [](const PropertyValue& rProp) { return rProp.Name == "Extensions"; });
+ if (pProp != std::cend(aTypeProperties))
+ pProp->Value >>= aExtensions;
+ if ( aExtensions.hasElements() )
+ {
+ // The filter title must be formed in the same way it is currently done in the
+ // internal implementation (see sfx2::appendFiltersForSave). And we will look
+ // for the same string returned from the dialog, so save it to maUIName:
+ OUString aTitle(
+ rFilterEntry.maUIName + " (." + aExtensions[0] + ")");
+ rFilterEntry.maUIName = aTitle;
+ OUString aFilter("*." + aExtensions[0]);
+ mxFilePicker->appendFilter(aTitle, aFilter);
+ if ( rFilterEntry.maFlags & 0x100 )
+ mxFilePicker->setCurrentFilter(aTitle);
+ }
+ }
+ }
+ catch ( const Exception& )
+ {
+ }
+ }
+}
+FileOpenDialog::~FileOpenDialog()
+{
+}
+sal_Int16 FileOpenDialog::execute()
+{
+ return mxFilePicker->execute();
+}
+void FileOpenDialog::setDefaultName( const OUString& rDefaultName )
+{
+ mxFilePicker->setDefaultName( rDefaultName );
+}
+OUString FileOpenDialog::getURL() const
+{
+ Sequence< OUString > aFileSeq( mxFilePicker->getSelectedFiles() );
+ return aFileSeq.hasElements() ? aFileSeq[ 0 ] : OUString();
+};
+OUString FileOpenDialog::getFilterName() const
+{
+ OUString aFilterName;
+ Reference< XFilterManager > xFilterManager( mxFilePicker, UNO_QUERY_THROW );
+ OUString aUIName( xFilterManager->getCurrentFilter() );
+ auto aIter = std::find_if(aFilterEntryList.begin(), aFilterEntryList.end(),
+ [&aUIName](const FilterEntry& rFilterEntry) { return rFilterEntry.maUIName == aUIName; });
+ if (aIter != aFilterEntryList.end())
+ aFilterName = aIter->maFilterEntryName;
+ return aFilterName;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/fileopendialog.hxx b/sdext/source/minimizer/fileopendialog.hxx
new file mode 100644
index 000000000..176fe155e
--- /dev/null
+++ b/sdext/source/minimizer/fileopendialog.hxx
@@ -0,0 +1,59 @@
+/* -*- 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_SDEXT_SOURCE_MINIMIZER_FILEOPENDIALOG_HXX
+#define INCLUDED_SDEXT_SOURCE_MINIMIZER_FILEOPENDIALOG_HXX
+
+#include <vector>
+#include <com/sun/star/ui/dialogs/XFilePicker3.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+class FileOpenDialog
+{
+ // a list of filters that are provided within the SaveDialog
+ struct FilterEntry
+ {
+ OUString maFilterEntryName;
+ OUString maType;
+ OUString maUIName;
+ sal_Int32 maFlags;
+
+ FilterEntry() : maFlags( 0 ) {}
+ };
+ css::uno::Reference < css::ui::dialogs::XFilePicker3 > mxFilePicker;
+
+ std::vector< FilterEntry > aFilterEntryList;
+
+public:
+ explicit FileOpenDialog( const css::uno::Reference< css::uno::XComponentContext >& rxContext );
+ ~FileOpenDialog();
+
+ sal_Int16 execute();
+
+ void setDefaultName( const OUString& );
+// void setDefaultDirectory( const OUString& );
+
+ OUString getURL() const;
+ OUString getFilterName() const;
+};
+
+#endif // INCLUDED_SDEXT_SOURCE_MINIMIZER_FILEOPENDIALOG_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/graphiccollector.cxx b/sdext/source/minimizer/graphiccollector.cxx
new file mode 100644
index 000000000..c307b04b0
--- /dev/null
+++ b/sdext/source/minimizer/graphiccollector.cxx
@@ -0,0 +1,423 @@
+/* -*- 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 "graphiccollector.hxx"
+#include <com/sun/star/awt/XDevice.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include <com/sun/star/drawing/BitmapMode.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/presentation/XPresentationPage.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::awt;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::graphic;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::presentation;
+
+const DeviceInfo& GraphicCollector::GetDeviceInfo( const Reference< XComponentContext >& rxFact )
+{
+ static DeviceInfo aDeviceInfo;
+ if( !aDeviceInfo.Width )
+ {
+ try
+ {
+ Reference< XDesktop2 > xDesktop = Desktop::create( rxFact );
+ Reference< XFrame > xFrame( xDesktop->getActiveFrame() );
+ Reference< XWindow > xWindow( xFrame->getContainerWindow() );
+ Reference< XDevice > xDevice( xWindow, UNO_QUERY_THROW );
+ aDeviceInfo = xDevice->getInfo();
+ }
+ catch( Exception& )
+ {
+ }
+ }
+ return aDeviceInfo;
+}
+
+static void ImpAddEntity( std::vector< GraphicCollector::GraphicEntity >& rGraphicEntities, const GraphicSettings& rGraphicSettings, const GraphicCollector::GraphicUser& rUser )
+{
+ if ( !rGraphicSettings.mbEmbedLinkedGraphics )
+ return;
+
+ auto aIter = std::find_if(rGraphicEntities.begin(), rGraphicEntities.end(),
+ [&rUser](const GraphicCollector::GraphicEntity& rGraphicEntity) {
+ return rGraphicEntity.maUser[ 0 ].mxGraphic == rUser.mxGraphic;
+ });
+ if ( aIter == rGraphicEntities.end() )
+ {
+ GraphicCollector::GraphicEntity aEntity( rUser );
+ rGraphicEntities.push_back( aEntity );
+ }
+ else
+ {
+ if ( rUser.maLogicalSize.Width > aIter->maLogicalSize.Width )
+ aIter->maLogicalSize.Width = rUser.maLogicalSize.Width;
+ if ( rUser.maLogicalSize.Height > aIter->maLogicalSize.Height )
+ aIter->maLogicalSize.Height = rUser.maLogicalSize.Height;
+ aIter->maUser.push_back( rUser );
+ }
+}
+
+static void ImpAddGraphicEntity( const Reference< XComponentContext >& rxMSF, Reference< XShape > const & rxShape, const GraphicSettings& rGraphicSettings, std::vector< GraphicCollector::GraphicEntity >& rGraphicEntities )
+{
+ Reference< XGraphic > xGraphic;
+ Reference< XPropertySet > xShapePropertySet( rxShape, UNO_QUERY_THROW );
+ if ( !(xShapePropertySet->getPropertyValue( "Graphic" ) >>= xGraphic) )
+ return;
+
+ text::GraphicCrop aGraphicCropLogic( 0, 0, 0, 0 );
+
+ GraphicCollector::GraphicUser aUser;
+ aUser.mxShape = rxShape;
+ aUser.mbFillBitmap = false;
+ aUser.mxGraphic = xGraphic;
+ xShapePropertySet->getPropertyValue( "GraphicCrop" ) >>= aGraphicCropLogic;
+ awt::Size aLogicalSize( rxShape->getSize() );
+
+ // calculating the logical size, as if there were no cropping
+ if ( aGraphicCropLogic.Left || aGraphicCropLogic.Right || aGraphicCropLogic.Top || aGraphicCropLogic.Bottom )
+ {
+ awt::Size aSize100thMM( GraphicCollector::GetOriginalSize( rxMSF, xGraphic ) );
+ if ( aSize100thMM.Width && aSize100thMM.Height )
+ {
+ awt::Size aCropSize( aSize100thMM.Width - ( aGraphicCropLogic.Left + aGraphicCropLogic.Right ),
+ aSize100thMM.Height - ( aGraphicCropLogic.Top + aGraphicCropLogic.Bottom ));
+ if ( aCropSize.Width && aCropSize.Height )
+ {
+ awt::Size aNewLogSize( static_cast< sal_Int32 >( static_cast< double >( aSize100thMM.Width * aLogicalSize.Width ) / aCropSize.Width ),
+ static_cast< sal_Int32 >( static_cast< double >( aSize100thMM.Height * aLogicalSize.Height ) / aCropSize.Height ) );
+ aLogicalSize = aNewLogSize;
+ }
+ }
+ }
+ aUser.maGraphicCropLogic = aGraphicCropLogic;
+ aUser.maLogicalSize = aLogicalSize;
+ ImpAddEntity( rGraphicEntities, rGraphicSettings, aUser );
+}
+
+static void ImpAddFillBitmapEntity( const Reference< XComponentContext >& rxMSF, const Reference< XPropertySet >& rxPropertySet, const awt::Size& rLogicalSize,
+ std::vector< GraphicCollector::GraphicEntity >& rGraphicEntities, const GraphicSettings& rGraphicSettings, const Reference< XPropertySet >& rxPagePropertySet )
+{
+ try
+ {
+ FillStyle eFillStyle;
+ if ( rxPropertySet->getPropertyValue( "FillStyle" ) >>= eFillStyle )
+ {
+ if ( eFillStyle == FillStyle_BITMAP )
+ {
+ Reference< XBitmap > xFillBitmap;
+ if ( rxPropertySet->getPropertyValue( "FillBitmap" ) >>= xFillBitmap )
+ {
+ Reference< XGraphic > xGraphic( xFillBitmap, UNO_QUERY_THROW );
+ awt::Size aLogicalSize( rLogicalSize );
+ Reference< XPropertySetInfo > axPropSetInfo( rxPropertySet->getPropertySetInfo() );
+ if ( axPropSetInfo.is() )
+ {
+ if ( axPropSetInfo->hasPropertyByName( "FillBitmapMode" ) )
+ {
+ BitmapMode eBitmapMode;
+ if ( rxPropertySet->getPropertyValue( "FillBitmapMode" ) >>= eBitmapMode )
+ {
+ if ( ( eBitmapMode == BitmapMode_REPEAT ) || ( eBitmapMode == BitmapMode_NO_REPEAT ) )
+ {
+ bool bLogicalSize = false;
+ awt::Size aSize( 0, 0 );
+ if ( ( rxPropertySet->getPropertyValue( "FillBitmapLogicalSize" ) >>= bLogicalSize )
+ && ( rxPropertySet->getPropertyValue( "FillBitmapSizeX" ) >>= aSize.Width )
+ && ( rxPropertySet->getPropertyValue( "FillBitmapSizeY" ) >>= aSize.Height ) )
+ {
+ if ( bLogicalSize )
+ {
+ if ( !aSize.Width || !aSize.Height )
+ {
+ awt::Size aSize100thMM( GraphicCollector::GetOriginalSize( rxMSF, xGraphic ) );
+ if ( aSize100thMM.Width && aSize100thMM.Height )
+ aLogicalSize = aSize100thMM;
+ }
+ else
+ aLogicalSize = aSize;
+ }
+ else
+ {
+ aLogicalSize.Width = sal::static_int_cast< sal_Int32 >( ( static_cast< double >( aLogicalSize.Width ) * aSize.Width ) / -100.0 );
+ aLogicalSize.Height = sal::static_int_cast< sal_Int32 >( ( static_cast< double >( aLogicalSize.Height ) * aSize.Height ) / -100.0 );
+ }
+ }
+ }
+ }
+ }
+ }
+ GraphicCollector::GraphicUser aUser;
+ aUser.mxPropertySet = rxPropertySet;
+ aUser.mxGraphic = xGraphic;
+ aUser.mbFillBitmap = true;
+ aUser.maLogicalSize = aLogicalSize;
+ aUser.mxPagePropertySet = rxPagePropertySet;
+ ImpAddEntity( rGraphicEntities, rGraphicSettings, aUser );
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+static void ImpCollectBackgroundGraphic( const Reference< XComponentContext >& rxMSF, const Reference< XDrawPage >& rxDrawPage, const GraphicSettings& rGraphicSettings, std::vector< GraphicCollector::GraphicEntity >& rGraphicEntities )
+{
+ try
+ {
+ awt::Size aLogicalSize( 28000, 21000 );
+ Reference< XPropertySet > xPropertySet( rxDrawPage, UNO_QUERY_THROW );
+ xPropertySet->getPropertyValue( "Width" ) >>= aLogicalSize.Width;
+ xPropertySet->getPropertyValue( "Height" ) >>= aLogicalSize.Height;
+
+ Reference< XPropertySet > xBackgroundPropSet;
+ if ( xPropertySet->getPropertyValue( "Background" ) >>= xBackgroundPropSet )
+ ImpAddFillBitmapEntity( rxMSF, xBackgroundPropSet, aLogicalSize, rGraphicEntities, rGraphicSettings, xPropertySet );
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+static void ImpCollectGraphicObjects( const Reference< XComponentContext >& rxMSF, const Reference< XShapes >& rxShapes, const GraphicSettings& rGraphicSettings, std::vector< GraphicCollector::GraphicEntity >& rGraphicEntities )
+{
+ for ( sal_Int32 i = 0; i < rxShapes->getCount(); i++ )
+ {
+ try
+ {
+ Reference< XShape > xShape( rxShapes->getByIndex( i ), UNO_QUERY_THROW );
+ const OUString sShapeType( xShape->getShapeType() );
+ if ( sShapeType == "com.sun.star.drawing.GroupShape" )
+ {
+ Reference< XShapes > xShapes( xShape, UNO_QUERY_THROW );
+ ImpCollectGraphicObjects( rxMSF, xShapes, rGraphicSettings, rGraphicEntities );
+ continue;
+ }
+
+ if ( sShapeType == "com.sun.star.drawing.GraphicObjectShape" ||
+ sShapeType == "com.sun.star.presentation.GraphicObjectShape" )
+ ImpAddGraphicEntity( rxMSF, xShape, rGraphicSettings, rGraphicEntities );
+
+ // now check for a fillstyle
+ Reference< XPropertySet > xEmptyPagePropSet;
+ Reference< XPropertySet > xShapePropertySet( xShape, UNO_QUERY_THROW );
+ awt::Size aLogicalSize( xShape->getSize() );
+ ImpAddFillBitmapEntity( rxMSF, xShapePropertySet, aLogicalSize, rGraphicEntities, rGraphicSettings, xEmptyPagePropSet );
+ }
+ catch( Exception& )
+ {
+ }
+ }
+}
+
+awt::Size GraphicCollector::GetOriginalSize( const Reference< XComponentContext >& rxMSF, const Reference< XGraphic >& rxGraphic )
+{
+ awt::Size aSize100thMM( 0, 0 );
+ Reference< XPropertySet > xGraphicPropertySet( rxGraphic, UNO_QUERY_THROW );
+ if ( xGraphicPropertySet->getPropertyValue( "Size100thMM" ) >>= aSize100thMM )
+ {
+ if ( !aSize100thMM.Width && !aSize100thMM.Height )
+ { // MAPMODE_PIXEL USED :-(
+ awt::Size aSourceSizePixel( 0, 0 );
+ if ( xGraphicPropertySet->getPropertyValue( "SizePixel" ) >>= aSourceSizePixel )
+ {
+ const DeviceInfo& rDeviceInfo( GraphicCollector::GetDeviceInfo( rxMSF ) );
+ if ( rDeviceInfo.PixelPerMeterX && rDeviceInfo.PixelPerMeterY )
+ {
+ aSize100thMM.Width = static_cast< sal_Int32 >( ( aSourceSizePixel.Width * 100000.0 ) / rDeviceInfo.PixelPerMeterX );
+ aSize100thMM.Height = static_cast< sal_Int32 >( ( aSourceSizePixel.Height * 100000.0 ) / rDeviceInfo.PixelPerMeterY );
+ }
+ }
+ }
+ }
+ return aSize100thMM;
+}
+
+void GraphicCollector::CollectGraphics( const Reference< XComponentContext >& rxMSF, const Reference< XModel >& rxModel,
+ const GraphicSettings& rGraphicSettings, std::vector< GraphicCollector::GraphicEntity >& rGraphicList )
+{
+ try
+ {
+ sal_Int32 i;
+ Reference< XDrawPagesSupplier > xDrawPagesSupplier( rxModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+ for ( i = 0; i < xDrawPages->getCount(); i++ )
+ {
+ Reference< XDrawPage > xDrawPage( xDrawPages->getByIndex( i ), UNO_QUERY_THROW );
+ ImpCollectBackgroundGraphic( rxMSF, xDrawPage, rGraphicSettings, rGraphicList );
+ ImpCollectGraphicObjects( rxMSF, xDrawPage, rGraphicSettings, rGraphicList );
+
+ Reference< XPresentationPage > xPresentationPage( xDrawPage, UNO_QUERY_THROW );
+ Reference< XDrawPage > xNotesPage( xPresentationPage->getNotesPage() );
+ ImpCollectBackgroundGraphic( rxMSF, xNotesPage, rGraphicSettings, rGraphicList );
+ ImpCollectGraphicObjects( rxMSF, xNotesPage, rGraphicSettings, rGraphicList );
+ }
+ Reference< XMasterPagesSupplier > xMasterPagesSupplier( rxModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xMasterPages( xMasterPagesSupplier->getMasterPages(), UNO_SET_THROW );
+ for ( i = 0; i < xMasterPages->getCount(); i++ )
+ {
+ Reference< XDrawPage > xMasterPage( xMasterPages->getByIndex( i ), UNO_QUERY_THROW );
+ ImpCollectBackgroundGraphic( rxMSF, xMasterPage, rGraphicSettings, rGraphicList );
+ ImpCollectGraphicObjects( rxMSF, xMasterPage, rGraphicSettings, rGraphicList );
+ }
+
+ for( auto& rGraphic : rGraphicList )
+ {
+ // check if it is possible to remove the crop area
+ rGraphic.mbRemoveCropArea = rGraphicSettings.mbRemoveCropArea;
+ if ( rGraphic.mbRemoveCropArea )
+ {
+ std::vector< GraphicCollector::GraphicUser >::iterator aGUIter( rGraphic.maUser.begin() );
+ while( rGraphic.mbRemoveCropArea && ( aGUIter != rGraphic.maUser.end() ) )
+ {
+ if ( aGUIter->maGraphicCropLogic.Left || aGUIter->maGraphicCropLogic.Top
+ || aGUIter->maGraphicCropLogic.Right || aGUIter->maGraphicCropLogic.Bottom )
+ {
+ if ( aGUIter == rGraphic.maUser.begin() )
+ rGraphic.maGraphicCropLogic = aGUIter->maGraphicCropLogic;
+ else if ( ( rGraphic.maGraphicCropLogic.Left != aGUIter->maGraphicCropLogic.Left )
+ || ( rGraphic.maGraphicCropLogic.Top != aGUIter->maGraphicCropLogic.Top )
+ || ( rGraphic.maGraphicCropLogic.Right != aGUIter->maGraphicCropLogic.Right )
+ || ( rGraphic.maGraphicCropLogic.Bottom != aGUIter->maGraphicCropLogic.Bottom ) )
+ {
+ rGraphic.mbRemoveCropArea = false;
+ }
+ }
+ else
+ rGraphic.mbRemoveCropArea = false;
+ ++aGUIter;
+ }
+ }
+ if ( !rGraphic.mbRemoveCropArea )
+ rGraphic.maGraphicCropLogic = text::GraphicCrop( 0, 0, 0, 0 );
+ }
+ }
+ catch ( Exception& )
+ {
+ }
+}
+
+static void ImpCountGraphicObjects( const Reference< XComponentContext >& rxMSF, const Reference< XShapes >& rxShapes, const GraphicSettings& rGraphicSettings, sal_Int32& rnGraphics )
+{
+ for ( sal_Int32 i = 0; i < rxShapes->getCount(); i++ )
+ {
+ try
+ {
+ Reference< XShape > xShape( rxShapes->getByIndex( i ), UNO_QUERY_THROW );
+ const OUString sShapeType( xShape->getShapeType() );
+ if ( sShapeType == "com.sun.star.drawing.GroupShape" )
+ {
+ Reference< XShapes > xShapes( xShape, UNO_QUERY_THROW );
+ ImpCountGraphicObjects( rxMSF, xShapes, rGraphicSettings, rnGraphics );
+ continue;
+ }
+
+ if ( sShapeType == "com.sun.star.drawing.GraphicObjectShape" ||
+ sShapeType == "com.sun.star.presentation.GraphicObjectShape" )
+ {
+ rnGraphics++;
+ }
+
+ // now check for a fillstyle
+ Reference< XPropertySet > xShapePropertySet( xShape, UNO_QUERY_THROW );
+ FillStyle eFillStyle;
+ if ( xShapePropertySet->getPropertyValue( "FillStyle" ) >>= eFillStyle )
+ {
+ if ( eFillStyle == FillStyle_BITMAP )
+ {
+ rnGraphics++;
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ }
+ }
+}
+
+static void ImpCountBackgroundGraphic(
+ const Reference< XDrawPage >& rxDrawPage, sal_Int32& rnGraphics )
+{
+ try
+ {
+ awt::Size aLogicalSize( 28000, 21000 );
+ Reference< XPropertySet > xPropertySet( rxDrawPage, UNO_QUERY_THROW );
+ xPropertySet->getPropertyValue( "Width" ) >>= aLogicalSize.Width;
+ xPropertySet->getPropertyValue( "Height" ) >>= aLogicalSize.Height;
+
+ Reference< XPropertySet > xBackgroundPropSet;
+ if ( xPropertySet->getPropertyValue( "Background" ) >>= xBackgroundPropSet )
+ {
+ FillStyle eFillStyle;
+ if ( xBackgroundPropSet->getPropertyValue( "FillStyle" ) >>= eFillStyle )
+ {
+ if ( eFillStyle == FillStyle_BITMAP )
+ {
+ rnGraphics++;
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+void GraphicCollector::CountGraphics( const Reference< XComponentContext >& rxMSF, const Reference< XModel >& rxModel,
+ const GraphicSettings& rGraphicSettings, sal_Int32& rnGraphics )
+{
+ try
+ {
+ sal_Int32 i;
+ Reference< XDrawPagesSupplier > xDrawPagesSupplier( rxModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+ for ( i = 0; i < xDrawPages->getCount(); i++ )
+ {
+ Reference< XDrawPage > xDrawPage( xDrawPages->getByIndex( i ), UNO_QUERY_THROW );
+ ImpCountBackgroundGraphic( xDrawPage, rnGraphics );
+ ImpCountGraphicObjects( rxMSF, xDrawPage, rGraphicSettings, rnGraphics );
+
+ Reference< XPresentationPage > xPresentationPage( xDrawPage, UNO_QUERY_THROW );
+ Reference< XDrawPage > xNotesPage( xPresentationPage->getNotesPage() );
+ ImpCountBackgroundGraphic( xNotesPage, rnGraphics );
+ ImpCountGraphicObjects( rxMSF, xNotesPage, rGraphicSettings, rnGraphics );
+ }
+ Reference< XMasterPagesSupplier > xMasterPagesSupplier( rxModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xMasterPages( xMasterPagesSupplier->getMasterPages(), UNO_SET_THROW );
+ for ( i = 0; i < xMasterPages->getCount(); i++ )
+ {
+ Reference< XDrawPage > xMasterPage( xMasterPages->getByIndex( i ), UNO_QUERY_THROW );
+ ImpCountBackgroundGraphic( xMasterPage, rnGraphics );
+ ImpCountGraphicObjects( rxMSF, xMasterPage, rGraphicSettings, rnGraphics );
+ }
+ }
+ catch ( Exception& )
+ {
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/graphiccollector.hxx b/sdext/source/minimizer/graphiccollector.hxx
new file mode 100644
index 000000000..f989a95ad
--- /dev/null
+++ b/sdext/source/minimizer/graphiccollector.hxx
@@ -0,0 +1,95 @@
+/* -*- 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_SDEXT_SOURCE_MINIMIZER_GRAPHICCOLLECTOR_HXX
+#define INCLUDED_SDEXT_SOURCE_MINIMIZER_GRAPHICCOLLECTOR_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/awt/DeviceInfo.hpp>
+#include <com/sun/star/text/GraphicCrop.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/awt/Size.hpp>
+#include <com/sun/star/graphic/XGraphic.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <vector>
+
+
+struct GraphicSettings
+{
+ bool mbJPEGCompression;
+ sal_Int32 mnJPEGQuality;
+ bool mbRemoveCropArea;
+ sal_Int32 mnImageResolution;
+ bool mbEmbedLinkedGraphics;
+
+ GraphicSettings( bool bJPEGCompression, sal_Int32 nJPEGQuality, bool bRemoveCropArea,
+ sal_Int32 nImageResolution, bool bEmbedLinkedGraphics )
+ : mbJPEGCompression( bJPEGCompression )
+ , mnJPEGQuality( nJPEGQuality )
+ , mbRemoveCropArea( bRemoveCropArea )
+ , mnImageResolution( nImageResolution )
+ , mbEmbedLinkedGraphics( bEmbedLinkedGraphics ) {};
+};
+
+class GraphicCollector
+{
+ public:
+
+ struct GraphicUser
+ {
+ css::uno::Reference< css::drawing::XShape > mxShape; // if mbFillBitmap is false the xShape has
+ css::uno::Reference< css::beans::XPropertySet > mxPropertySet; // to be used otherwise the PropertySet
+ css::uno::Reference< css::beans::XPropertySet > mxPagePropertySet;
+ css::uno::Reference< css::graphic::XGraphic > mxGraphic;
+
+ css::text::GraphicCrop maGraphicCropLogic;
+ css::awt::Size maLogicalSize;
+ bool mbFillBitmap;
+
+ GraphicUser() : mxShape(), maGraphicCropLogic( 0, 0, 0, 0 ), mbFillBitmap( false ) {};
+ };
+
+ struct GraphicEntity
+ {
+ css::awt::Size maLogicalSize; // the biggest logical size the graphic will be displayed
+ bool mbRemoveCropArea;
+ css::text::GraphicCrop maGraphicCropLogic;
+ std::vector< GraphicUser > maUser;
+
+ explicit GraphicEntity( const GraphicUser& rUser )
+ : maLogicalSize( rUser.maLogicalSize ), mbRemoveCropArea( false ), maGraphicCropLogic( 0, 0, 0, 0 ) { maUser.push_back( rUser ); };
+ };
+
+ static const css::awt::DeviceInfo& GetDeviceInfo( const css::uno::Reference< css::uno::XComponentContext >& rxFact );
+ static css::awt::Size GetOriginalSize( const css::uno::Reference< css::uno::XComponentContext >& rxMSF,
+ const css::uno::Reference< css::graphic::XGraphic >& rxGraphic );
+
+ // collecting graphic instances, the downside of this method is that every graphic is swapped in
+ static void CollectGraphics( const css::uno::Reference< css::uno::XComponentContext >& rxMSF, const css::uno::Reference< css::frame::XModel >& rxModel,
+ const GraphicSettings& rGraphicSettings, std::vector< GraphicEntity >& io_rGraphicList );
+ // counting graphics without swapping in graphics
+ static void CountGraphics( const css::uno::Reference< css::uno::XComponentContext >& rxMSF, const css::uno::Reference< css::frame::XModel >& rxModel,
+ const GraphicSettings& rGraphicSettings, sal_Int32& rGraphics );
+};
+
+
+#endif // INCLUDED_SDEXT_SOURCE_MINIMIZER_GRAPHICCOLLECTOR_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/impoptimizer.cxx b/sdext/source/minimizer/impoptimizer.cxx
new file mode 100644
index 000000000..7de159177
--- /dev/null
+++ b/sdext/source/minimizer/impoptimizer.cxx
@@ -0,0 +1,702 @@
+/* -*- 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 "impoptimizer.hxx"
+#include "pppoptimizer.hxx"
+#include "graphiccollector.hxx"
+#include "pagecollector.hxx"
+#include "informationdialog.hxx"
+
+#include <vector>
+#include <com/sun/star/util/URL.hpp>
+#include <com/sun/star/util/XURLTransformer.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/awt/Size.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/frame/FrameSearchFlag.hpp>
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/graphic/GraphicProvider.hpp>
+#include <com/sun/star/graphic/XGraphicProvider.hpp>
+#include <com/sun/star/drawing/XShapes.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/presentation/XPresentationPage.hpp>
+#include <com/sun/star/document/XFilter.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/graphic/GraphicType.hpp>
+#include <com/sun/star/io/XStream.hpp>
+#include <com/sun/star/io/XSeekable.hpp>
+#include <com/sun/star/io/TempFile.hpp>
+#include <com/sun/star/frame/XComponentLoader.hpp>
+#include <com/sun/star/util/URLTransformer.hpp>
+
+#include <comphelper/propertyvalue.hxx>
+
+using namespace ::std;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::io;
+using namespace ::com::sun::star::awt;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::graphic;
+using namespace ::com::sun::star::document;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::presentation;
+
+static void ImpExtractCustomShow( const Reference< XModel >& rxModel, std::u16string_view rCustomShowName )
+{
+ vector< Reference< XDrawPage > > vNonUsedPageList;
+ try
+ {
+ PageCollector::CollectNonCustomShowPages( rxModel, rCustomShowName, vNonUsedPageList );
+ Reference< XDrawPagesSupplier > xDrawPagesSupplier( rxModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+ for( const auto& rxPage : vNonUsedPageList )
+ xDrawPages->remove( rxPage );
+ }
+ catch( Exception& )
+ {
+
+ }
+}
+
+static void ImpDeleteUnusedMasterPages( const Reference< XModel >& rxModel )
+{
+ vector< PageCollector::MasterPageEntity > aMasterPageList;
+ PageCollector::CollectMasterPages( rxModel, aMasterPageList );
+
+ // now master pages that are not marked can be deleted
+ Reference< XMasterPagesSupplier > xMasterPagesSupplier( rxModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xMasterPages( xMasterPagesSupplier->getMasterPages(), UNO_SET_THROW );
+ for( const auto& rMasterPage : aMasterPageList )
+ {
+ if ( !rMasterPage.bUsed )
+ xMasterPages->remove( rMasterPage.xMasterPage );
+ }
+}
+
+static void ImpDeleteHiddenSlides( const Reference< XModel >& rxModel )
+{
+ try
+ {
+ Reference< XDrawPagesSupplier > xDrawPagesSupplier( rxModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+ for( sal_Int32 i = 0; i < xDrawPages->getCount(); i++ )
+ {
+ Reference< XDrawPage > xDrawPage( xDrawPages->getByIndex( i ), UNO_QUERY_THROW );
+ Reference< XPropertySet > xPropSet( xDrawPage, UNO_QUERY_THROW );
+
+ bool bVisible = true;
+ if ( xPropSet->getPropertyValue( "Visible" ) >>= bVisible )
+ {
+ if (!bVisible )
+ {
+ xDrawPages->remove( xDrawPage );
+ i--;
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+static void ImpDeleteNotesPages( const Reference< XModel >& rxModel )
+{
+ try
+ {
+ Reference< XDrawPagesSupplier > xDrawPagesSupplier( rxModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+ sal_Int32 i, nPages = xDrawPages->getCount();
+ for( i = 0; i < nPages; i++ )
+ {
+ Reference< XPresentationPage > xPresentationPage( xDrawPages->getByIndex( i ), UNO_QUERY_THROW );
+ Reference< XPropertySet > xPropSet( xPresentationPage->getNotesPage(), UNO_QUERY_THROW );
+ Reference< XShapes > xShapes( xPropSet, UNO_QUERY_THROW );
+ while( xShapes->getCount() )
+ xShapes->remove( Reference< XShape >( xShapes->getByIndex( xShapes->getCount() - 1 ), UNO_QUERY_THROW ) );
+
+ xPropSet->setPropertyValue( "Layout", Any( sal_Int16(21) ) );
+ }
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+static void ImpConvertOLE( const Reference< XModel >& rxModel, sal_Int32 nOLEOptimizationType )
+{
+ try
+ {
+ Reference< XDrawPagesSupplier > xDrawPagesSupplier( rxModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+ for ( sal_Int32 i = 0; i < xDrawPages->getCount(); i++ )
+ {
+ Reference< XShapes > xShapes( xDrawPages->getByIndex( i ), UNO_QUERY_THROW );
+ for ( sal_Int32 j = 0; j < xShapes->getCount(); j++ )
+ {
+ Reference< XShape > xShape( xShapes->getByIndex( j ), UNO_QUERY_THROW );
+ if ( xShape->getShapeType() == "com.sun.star.drawing.OLE2Shape" )
+ {
+ Reference< XPropertySet > xPropSet( xShape, UNO_QUERY_THROW );
+
+ bool bConvertOLE = nOLEOptimizationType == 0;
+ if ( nOLEOptimizationType == 1 )
+ {
+ bool bIsInternal = true;
+ xPropSet->getPropertyValue( "IsInternal" ) >>= bIsInternal;
+ bConvertOLE = !bIsInternal;
+ }
+ if ( bConvertOLE )
+ {
+ Reference< XGraphic > xGraphic;
+ if ( xPropSet->getPropertyValue( "Graphic" ) >>= xGraphic )
+ {
+ Reference< XMultiServiceFactory > xFact( rxModel, UNO_QUERY_THROW );
+ Reference< XShape > xShape2( xFact->createInstance( "com.sun.star.drawing.GraphicObjectShape" ), UNO_QUERY_THROW );
+ xShapes->add( xShape2 );
+ xShape2->setPosition( xShape->getPosition() );
+ xShape2->setSize( xShape->getSize() );
+ Reference< XPropertySet > xPropSet2( xShape2, UNO_QUERY_THROW );
+ xPropSet2->setPropertyValue( "Graphic", Any( xGraphic ) );
+ xShapes->remove( xShape );
+ xPropSet2->setPropertyValue( "ZOrder", Any( j ) );
+ }
+ }
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+static void ImpCompressGraphic( Reference< XGraphicProvider > const & rxGraphicProvider, const Reference< XGraphic >& rxGraphic, Reference< XOutputStream > const & rxOutputStream,
+ const OUString& rDestMimeType, const awt::Size& rLogicalSize, sal_Int32 nJPEGQuality, sal_Int32 nImageResolution, bool bRemoveCropping, const text::GraphicCrop& rGraphicCropLogic )
+{
+ try
+ {
+ if ( rxGraphicProvider.is() && rxOutputStream.is() )
+ {
+ Sequence< PropertyValue > aFilterData{
+ comphelper::makePropertyValue("ImageResolution", nImageResolution),
+ comphelper::makePropertyValue("ColorMode", sal_Int32(0)), // todo: jpeg color mode (0->true color, 1->greyscale)
+ comphelper::makePropertyValue("Quality", nJPEGQuality), // quality that is used if we export to jpeg
+ comphelper::makePropertyValue("Compression", sal_Int32(6)), // compression that is used if we export to png
+ comphelper::makePropertyValue("Interlaced", sal_Int32(0)), // interlaced is turned off if we export to png
+ comphelper::makePropertyValue("LogicalSize", rLogicalSize),
+ comphelper::makePropertyValue("RemoveCropArea", bRemoveCropping),
+ comphelper::makePropertyValue("GraphicCropLogic", rGraphicCropLogic)
+ };
+
+ Sequence< PropertyValue > aArgs{
+ comphelper::makePropertyValue("MimeType", rDestMimeType), // the GraphicProvider is using "MimeType", the GraphicExporter "MediaType"...
+ comphelper::makePropertyValue("OutputStream", rxOutputStream),
+ comphelper::makePropertyValue("FilterData", aFilterData)
+ };
+
+ rxGraphicProvider->storeGraphic( rxGraphic, aArgs );
+ }
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+static Reference< XGraphic > ImpCompressGraphic( const Reference< XComponentContext >& rxContext,
+ const Reference< XGraphic >& xGraphic, const awt::Size& aLogicalSize, const text::GraphicCrop& aGraphicCropLogic,
+ const GraphicSettings& rGraphicSettings )
+{
+ Reference< XGraphic > xNewGraphic;
+ try
+ {
+ OUString aSourceMimeType;
+ Reference< XPropertySet > xGraphicPropertySet( xGraphic, UNO_QUERY_THROW );
+ if ( xGraphicPropertySet->getPropertyValue( "MimeType" ) >>= aSourceMimeType )
+ {
+ sal_Int8 nGraphicType( xGraphic->getType() );
+ if ( nGraphicType == css::graphic::GraphicType::PIXEL )
+ {
+ bool bTransparent = false;
+ bool bAlpha = false;
+ bool bAnimated = false;
+
+ awt::Size aSourceSizePixel( 0, 0 );
+ text::GraphicCrop aGraphicCropPixel( 0, 0, 0, 0 );
+
+ if ( ( xGraphicPropertySet->getPropertyValue( "SizePixel" ) >>= aSourceSizePixel ) &&
+ ( xGraphicPropertySet->getPropertyValue( "Transparent" ) >>= bTransparent ) &&
+ ( xGraphicPropertySet->getPropertyValue( "Alpha" ) >>= bAlpha ) &&
+ ( xGraphicPropertySet->getPropertyValue( "Animated" ) >>= bAnimated ) )
+ {
+ awt::Size aDestSizePixel( aSourceSizePixel );
+ if ( !bAnimated )
+ {
+ bool bNeedsOptimizing = false;
+ bool bRemoveCropArea( rGraphicSettings.mbRemoveCropArea );
+
+ // cropping has to be removed from SourceSizePixel
+ if ( aGraphicCropLogic.Left || aGraphicCropLogic.Top || aGraphicCropLogic.Right || aGraphicCropLogic.Bottom )
+ {
+ const awt::Size aSize100thMM( GraphicCollector::GetOriginalSize( rxContext, xGraphic ) );
+
+ if ( bRemoveCropArea )
+ bNeedsOptimizing = true;
+
+ if ( aSize100thMM.Width && aSize100thMM.Height )
+ {
+ aGraphicCropPixel.Left = static_cast< sal_Int32 >( ( static_cast<double>(aSourceSizePixel.Width) * aGraphicCropLogic.Left ) / aSize100thMM.Width );
+ aGraphicCropPixel.Top = static_cast< sal_Int32 >( ( static_cast<double>(aSourceSizePixel.Height)* aGraphicCropLogic.Top ) / aSize100thMM.Height );
+ aGraphicCropPixel.Right = static_cast< sal_Int32 >( ( static_cast<double>(aSourceSizePixel.Width) * ( aSize100thMM.Width - aGraphicCropLogic.Right ) ) / aSize100thMM.Width );
+ aGraphicCropPixel.Bottom = static_cast< sal_Int32 >( ( static_cast<double>(aSourceSizePixel.Height)* ( aSize100thMM.Height - aGraphicCropLogic.Bottom ) ) / aSize100thMM.Height );
+
+ // first calculating new SourceSizePixel by removing the cropped area
+ aSourceSizePixel.Width = aGraphicCropPixel.Right - aGraphicCropPixel.Left;
+ aSourceSizePixel.Height= aGraphicCropPixel.Bottom - aGraphicCropPixel.Top;
+ }
+ else
+ {
+ bRemoveCropArea = false;
+ }
+ }
+ if ( ( aSourceSizePixel.Width > 0 ) && ( aSourceSizePixel.Height > 0 ) )
+ {
+ OUString aDestMimeType( "image/png" );
+ if (rGraphicSettings.mbJPEGCompression && !bTransparent && !bAlpha)
+ {
+ aDestMimeType = "image/jpeg";
+// if( aSourceMimeType != aDestMimeType )
+ bNeedsOptimizing = true;
+ }
+ if ( bRemoveCropArea )
+ aDestSizePixel = aSourceSizePixel;
+ if ( rGraphicSettings.mnImageResolution && aLogicalSize.Width && aLogicalSize.Height )
+ {
+ const double fSourceDPIX = static_cast<double>(aSourceSizePixel.Width) / (static_cast<double>(aLogicalSize.Width) / 2540.0 );
+ const double fSourceDPIY = static_cast<double>(aSourceSizePixel.Height)/ (static_cast<double>(aLogicalSize.Height)/ 2540.0 );
+
+ // check, if the bitmap DPI exceeds the maximum DPI
+ if( ( fSourceDPIX > rGraphicSettings.mnImageResolution ) || ( fSourceDPIY > rGraphicSettings.mnImageResolution ) )
+ {
+ const double fNewSizePixelX = (static_cast<double>(aDestSizePixel.Width) * rGraphicSettings.mnImageResolution ) / fSourceDPIX;
+ const double fNewSizePixelY = (static_cast<double>(aDestSizePixel.Height)* rGraphicSettings.mnImageResolution ) / fSourceDPIY;
+
+ aDestSizePixel = awt::Size( static_cast<sal_Int32>(fNewSizePixelX), static_cast<sal_Int32>(fNewSizePixelY) );
+ bNeedsOptimizing = true;
+ }
+ }
+ if ( bNeedsOptimizing && aDestSizePixel.Width && aDestSizePixel.Height )
+ {
+ Reference< XStream > xTempFile( io::TempFile::create(rxContext), UNO_QUERY_THROW );
+ Reference< XOutputStream > xOutputStream( xTempFile->getOutputStream() );
+ Reference< XGraphicProvider > xGraphicProvider( GraphicProvider::create( rxContext ) );
+
+ ImpCompressGraphic( xGraphicProvider, xGraphic, xOutputStream, aDestMimeType, aLogicalSize, rGraphicSettings.mnJPEGQuality, rGraphicSettings.mnImageResolution, bRemoveCropArea, aGraphicCropLogic );
+ Reference< XInputStream > xInputStream( xTempFile->getInputStream() );
+ Reference< XSeekable > xSeekable( xInputStream, UNO_QUERY_THROW );
+ xSeekable->seek( 0 );
+ Sequence< PropertyValue > aArgs{ comphelper::makePropertyValue(
+ "InputStream", xInputStream) };
+ xNewGraphic = xGraphicProvider->queryGraphic( aArgs );
+ }
+ }
+ }
+ }
+ }
+ else // this is a metafile
+ {
+ const OUString& aDestMimeType( aSourceMimeType );
+ Reference< XStream > xTempFile( io::TempFile::create(rxContext), UNO_QUERY_THROW );
+ Reference< XOutputStream > xOutputStream( xTempFile->getOutputStream() );
+ Reference< XGraphicProvider > xGraphicProvider( GraphicProvider::create( rxContext ) );
+ ImpCompressGraphic( xGraphicProvider, xGraphic, xOutputStream, aDestMimeType, aLogicalSize, rGraphicSettings.mnJPEGQuality, rGraphicSettings.mnImageResolution, false, aGraphicCropLogic );
+ Reference< XInputStream > xInputStream( xTempFile->getInputStream() );
+ Reference< XSeekable > xSeekable( xInputStream, UNO_QUERY_THROW );
+ xSeekable->seek( 0 );
+ Sequence< PropertyValue > aArgs{ comphelper::makePropertyValue("InputStream",
+ xInputStream) };
+ xNewGraphic = xGraphicProvider->queryGraphic( aArgs );
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ }
+ return xNewGraphic;
+}
+
+static void CompressGraphics( ImpOptimizer& rOptimizer, const Reference< XComponentContext >& rxContext, const GraphicSettings& rGraphicSettings,
+ std::vector< GraphicCollector::GraphicEntity >& rGraphicList )
+{
+ try
+ {
+ double i = 0;
+ for( auto& rGraphic : rGraphicList )
+ {
+ i++;
+ sal_Int32 nProgress = static_cast< sal_Int32 >( 40.0 * ( i / static_cast< double >( rGraphicList.size() ) ) ) + 50;
+ rOptimizer.SetStatusValue( TK_Progress, Any( nProgress ) );
+ rOptimizer.DispatchStatus();
+
+ if ( !rGraphic.maUser.empty() )
+ {
+ GraphicSettings aGraphicSettings( rGraphicSettings );
+ aGraphicSettings.mbRemoveCropArea = rGraphic.mbRemoveCropArea;
+
+ Reference< XGraphic > xGraphic;
+ if ( rGraphic.maUser[ 0 ].mbFillBitmap && rGraphic.maUser[ 0 ].mxPropertySet.is() )
+ {
+ Reference< XBitmap > xFillBitmap;
+ if ( rGraphic.maUser[ 0 ].mxPropertySet->getPropertyValue( "FillBitmap" ) >>= xFillBitmap )
+ xGraphic.set( xFillBitmap, UNO_QUERY_THROW );
+ }
+ else if ( rGraphic.maUser[ 0 ].mxShape.is() )
+ {
+ Reference< XPropertySet > xShapePropertySet( rGraphic.maUser[ 0 ].mxShape, UNO_QUERY_THROW );
+ xShapePropertySet->getPropertyValue( "Graphic" ) >>= xGraphic;
+ }
+ if ( xGraphic.is() )
+ {
+ Reference< XPropertySet > xNewGraphicPropertySet( xGraphic, UNO_QUERY_THROW );
+ awt::Size aSize100thMM( GraphicCollector::GetOriginalSize( rxContext, xGraphic ) );
+ Reference< XGraphic > xNewGraphic( ImpCompressGraphic( rxContext, xGraphic, rGraphic.maLogicalSize, rGraphic.maGraphicCropLogic, aGraphicSettings ) );
+ if ( xNewGraphic.is() )
+ {
+ // applying graphic to each user
+ for( auto& rGraphicUser : rGraphic.maUser )
+ {
+ if ( rGraphicUser.mxShape.is() )
+ {
+ Reference< XPropertySet > xShapePropertySet( rGraphicUser.mxShape, UNO_QUERY_THROW );
+ xShapePropertySet->setPropertyValue( "Graphic", Any( xNewGraphic ) );
+
+ if ( rGraphicUser.maGraphicCropLogic.Left || rGraphicUser.maGraphicCropLogic.Top
+ || rGraphicUser.maGraphicCropLogic.Right || rGraphicUser.maGraphicCropLogic.Bottom )
+ { // removing crop area was not possible or shouldn't been applied
+ text::GraphicCrop aGraphicCropLogic( 0, 0, 0, 0 );
+ if ( !aGraphicSettings.mbRemoveCropArea )
+ {
+ awt::Size aNewSize( GraphicCollector::GetOriginalSize( rxContext, xNewGraphic ) );
+ aGraphicCropLogic.Left = static_cast<sal_Int32>(static_cast<double>(rGraphicUser.maGraphicCropLogic.Left) * (static_cast<double>(aNewSize.Width) / static_cast<double>(aSize100thMM.Width)));
+ aGraphicCropLogic.Top = static_cast<sal_Int32>(static_cast<double>(rGraphicUser.maGraphicCropLogic.Top) * (static_cast<double>(aNewSize.Height) / static_cast<double>(aSize100thMM.Height)));
+ aGraphicCropLogic.Right = static_cast<sal_Int32>(static_cast<double>(rGraphicUser.maGraphicCropLogic.Right) * (static_cast<double>(aNewSize.Width) / static_cast<double>(aSize100thMM.Width)));
+ aGraphicCropLogic.Bottom = static_cast<sal_Int32>(static_cast<double>(rGraphicUser.maGraphicCropLogic.Bottom) * (static_cast<double>(aNewSize.Height) / static_cast<double>(aSize100thMM.Height)));
+ }
+ xShapePropertySet->setPropertyValue( "GraphicCrop", Any( aGraphicCropLogic ) );
+ }
+ }
+ else if ( rGraphicUser.mxPropertySet.is() )
+ {
+ Reference< XBitmap > xFillBitmap( xNewGraphic, UNO_QUERY );
+ if ( xFillBitmap.is() )
+ {
+ awt::Size aSize;
+ bool bLogicalSize;
+
+ Reference< XPropertySet >& rxPropertySet( rGraphicUser.mxPropertySet );
+ rxPropertySet->setPropertyValue( "FillBitmap", Any( xFillBitmap ) );
+ if ( ( rxPropertySet->getPropertyValue( "FillBitmapLogicalSize" ) >>= bLogicalSize )
+ && ( rxPropertySet->getPropertyValue( "FillBitmapSizeX" ) >>= aSize.Width )
+ && ( rxPropertySet->getPropertyValue( "FillBitmapSizeY" ) >>= aSize.Height ) )
+ {
+ if ( !aSize.Width || !aSize.Height )
+ {
+ rxPropertySet->setPropertyValue( "FillBitmapLogicalSize", Any( true ) );
+ rxPropertySet->setPropertyValue( "FillBitmapSizeX", Any( rGraphicUser.maLogicalSize.Width ) );
+ rxPropertySet->setPropertyValue( "FillBitmapSizeY", Any( rGraphicUser.maLogicalSize.Height ) );
+ }
+ }
+ if ( rGraphicUser.mxPagePropertySet.is() )
+ rGraphicUser.mxPagePropertySet->setPropertyValue( "Background", Any( rxPropertySet ) );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ catch ( Exception& )
+ {
+ }
+}
+
+
+ImpOptimizer::ImpOptimizer( const Reference< XComponentContext >& rxContext, const Reference< XModel >& rxModel ) :
+ mxContext ( rxContext ),
+ mxModel ( rxModel ),
+ mbJPEGCompression ( false ),
+ mnJPEGQuality ( 90 ),
+ mbRemoveCropArea ( false ),
+ mnImageResolution ( 0 ),
+ mbEmbedLinkedGraphics ( true ),
+ mbOLEOptimization ( false ),
+ mnOLEOptimizationType ( 0 ),
+ mbDeleteUnusedMasterPages ( false ),
+ mbDeleteHiddenSlides ( false ),
+ mbDeleteNotesPages ( false ),
+ mbOpenNewDocument ( true )
+{
+}
+
+
+ImpOptimizer::~ImpOptimizer()
+{
+}
+
+
+void ImpOptimizer::DispatchStatus()
+{
+ if ( mxStatusDispatcher.is() )
+ {
+ URL aURL;
+ aURL.Protocol = "vnd.com.sun.star.comp.PresentationMinimizer:";
+ aURL.Path = "statusupdate";
+ mxStatusDispatcher->dispatch( aURL, GetStatusSequence() );
+ }
+}
+
+
+void ImpOptimizer::Optimize()
+{
+
+ if ( !maCustomShowName.isEmpty() )
+ ImpExtractCustomShow( mxModel, maCustomShowName );
+
+ if ( mbDeleteHiddenSlides )
+ {
+ SetStatusValue( TK_Progress, Any( static_cast< sal_Int32 >( 40 ) ) );
+ SetStatusValue( TK_Status, Any( OUString("STR_DELETING_SLIDES") ) );
+ DispatchStatus();
+ ImpDeleteHiddenSlides( mxModel );
+ }
+
+ if ( mbDeleteNotesPages )
+ {
+ SetStatusValue( TK_Status, Any( OUString("STR_DELETING_SLIDES") ) );
+ DispatchStatus();
+ ImpDeleteNotesPages( mxModel );
+ }
+
+ if ( mbDeleteUnusedMasterPages )
+ {
+ SetStatusValue( TK_Progress, Any( static_cast< sal_Int32 >( 40 ) ) );
+ SetStatusValue( TK_Status, Any( OUString("STR_DELETING_SLIDES") ) );
+ DispatchStatus();
+ ImpDeleteUnusedMasterPages( mxModel );
+ }
+
+ if ( mbOLEOptimization )
+ {
+ SetStatusValue( TK_Progress, Any( static_cast< sal_Int32 >( 45 ) ) );
+ SetStatusValue( TK_Status, Any( OUString("STR_CREATING_OLE_REPLACEMENTS") ) );
+ DispatchStatus();
+ ImpConvertOLE( mxModel, mnOLEOptimizationType );
+ }
+
+ if ( mbJPEGCompression || mbRemoveCropArea || mnImageResolution )
+ {
+ SetStatusValue( TK_Progress, Any( static_cast< sal_Int32 >( 50 ) ) );
+ SetStatusValue( TK_Status, Any( OUString("STR_OPTIMIZING_GRAPHICS") ) );
+ DispatchStatus();
+
+ std::vector< GraphicCollector::GraphicEntity > aGraphicList;
+ GraphicSettings aGraphicSettings( mbJPEGCompression, mnJPEGQuality, mbRemoveCropArea, mnImageResolution, mbEmbedLinkedGraphics );
+ GraphicCollector::CollectGraphics( mxContext, mxModel, aGraphicSettings, aGraphicList );
+ CompressGraphics( *this, mxContext, aGraphicSettings, aGraphicList );
+ }
+ SetStatusValue( TK_Progress, Any( static_cast< sal_Int32 >( 100 ) ) );
+ DispatchStatus();
+}
+
+static void DispatchURL( const Reference< XComponentContext >& xContext, const OUString& sURL, const Reference< XFrame >& xFrame )
+{
+ try
+ {
+ Reference< XURLTransformer > xURLTransformer( URLTransformer::create(xContext) );
+ util::URL aUrl;
+ aUrl.Complete = sURL;
+ xURLTransformer->parseStrict( aUrl );
+ Sequence< PropertyValue > aArgs;
+ Reference< XDispatchProvider > xDispatchProvider( xFrame, UNO_QUERY_THROW );
+ Reference< XDispatch > xDispatch = xDispatchProvider->queryDispatch( aUrl, OUString(), 0 ); // "_self"
+ if ( xDispatch.is() )
+ xDispatch->dispatch( aUrl, aArgs );
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+
+void ImpOptimizer::Optimize( const Sequence< PropertyValue >& rArguments )
+{
+ if ( !mxModel.is() )
+ return;
+
+ sal_Int64 nEstimatedFileSize = 0;
+ SetStatusValue( TK_Progress, Any( static_cast< sal_Int32 >( 0 ) ) );
+ DispatchStatus();
+
+ for ( const auto& rArgument : rArguments )
+ {
+ switch( TKGet( rArgument.Name ) )
+ {
+ case TK_StatusDispatcher : rArgument.Value >>= mxStatusDispatcher; break;
+ case TK_InformationDialog: rArgument.Value >>= mxInformationDialog; break;
+ case TK_Settings :
+ {
+ css::uno::Sequence< css::beans::PropertyValue > aSettings;
+ rArgument.Value >>= aSettings;
+ for ( const auto& rSetting : std::as_const(aSettings) )
+ {
+ switch( TKGet( rSetting.Name ) )
+ {
+ case TK_JPEGCompression : rSetting.Value >>= mbJPEGCompression; break;
+ case TK_JPEGQuality : rSetting.Value >>= mnJPEGQuality; break;
+ case TK_RemoveCropArea : rSetting.Value >>= mbRemoveCropArea; break;
+ case TK_ImageResolution : rSetting.Value >>= mnImageResolution; break;
+ case TK_EmbedLinkedGraphics : rSetting.Value >>= mbEmbedLinkedGraphics; break;
+ case TK_OLEOptimization : rSetting.Value >>= mbOLEOptimization; break;
+ case TK_OLEOptimizationType : rSetting.Value >>= mnOLEOptimizationType; break;
+ case TK_CustomShowName : rSetting.Value >>= maCustomShowName; break;
+ case TK_DeleteUnusedMasterPages : rSetting.Value >>= mbDeleteUnusedMasterPages; break;
+ case TK_DeleteHiddenSlides : rSetting.Value >>= mbDeleteHiddenSlides; break;
+ case TK_DeleteNotesPages : rSetting.Value >>= mbDeleteNotesPages; break;
+ case TK_SaveAsURL : rSetting.Value >>= maSaveAsURL; break;
+ case TK_FilterName : rSetting.Value >>= maFilterName; break;
+ case TK_OpenNewDocument : rSetting.Value >>= mbOpenNewDocument; break;
+ case TK_EstimatedFileSize : rSetting.Value >>= nEstimatedFileSize; break;
+ default: break;
+ }
+ }
+ }
+ break;
+ default: break;
+ }
+ }
+
+ sal_Int64 nSourceSize = 0;
+ sal_Int64 nDestSize = 0;
+
+ Reference< XFrame > xSelf;
+ if ( !maSaveAsURL.isEmpty() )
+ {
+
+ SetStatusValue( TK_Progress, Any( static_cast< sal_Int32 >( 10 ) ) );
+ SetStatusValue( TK_Status, Any( OUString("STR_DUPLICATING_PRESENTATION") ) );
+ DispatchStatus();
+
+ Reference< XStorable >xStorable( mxModel, UNO_QUERY );
+ if ( xStorable.is() )
+ {
+ if ( xStorable->hasLocation() )
+ nSourceSize = PPPOptimizer::GetFileSize( xStorable->getLocation() );
+
+ Sequence< PropertyValue > aArguments;
+ if ( !maFilterName.isEmpty() )
+ {
+ int nLength = aArguments.getLength();
+ aArguments.realloc( nLength + 1 );
+ auto pArguments = aArguments.getArray();
+ pArguments[ nLength ].Name = "FilterName";
+ pArguments[ nLength ].Value <<= maFilterName;
+ }
+ xStorable->storeToURL( maSaveAsURL, aArguments );
+ if ( !nSourceSize )
+ nSourceSize = PPPOptimizer::GetFileSize( maSaveAsURL );
+
+ SetStatusValue( TK_Progress, Any( static_cast< sal_Int32 >( 30 ) ) );
+ SetStatusValue( TK_Status, Any( OUString("STR_DUPLICATING_PRESENTATION") ) );
+ DispatchStatus();
+
+ Reference< XDesktop2 > xDesktop = Desktop::create( mxContext );
+ xSelf = xDesktop->findFrame( "_blank", FrameSearchFlag::CREATE );
+ Reference< XComponentLoader > xComponentLoader( xSelf, UNO_QUERY );
+
+ Sequence< PropertyValue > aLoadProps{ comphelper::makePropertyValue("Hidden", true) };
+ mxModel.set( xComponentLoader->loadComponentFromURL(
+ maSaveAsURL, "_self", 0, aLoadProps ), UNO_QUERY );
+ }
+ }
+
+ // check if the document is ReadOnly -> error
+ Reference< XStorable > xStorable( mxModel, UNO_QUERY );
+ if ( xStorable.is() && !xStorable->isReadonly() )
+ {
+ mxModel->lockControllers();
+ Optimize();
+ mxModel->unlockControllers();
+
+ // clearing undo stack:
+ Reference< XFrame > xFrame( xSelf.is() ? xSelf : mxInformationDialog );
+ if ( xFrame.is() )
+ {
+ DispatchURL(mxContext, ".uno:ClearUndoStack", xFrame);
+ }
+ }
+
+ if ( !maSaveAsURL.isEmpty() )
+ {
+ if ( xStorable.is() )
+ {
+ xStorable->store();
+ nDestSize = PPPOptimizer::GetFileSize( maSaveAsURL );
+ }
+ }
+
+ if ( mxInformationDialog.is() )
+ {
+ InformationDialog aInformationDialog( mxContext, mxInformationDialog, maSaveAsURL, mbOpenNewDocument, nSourceSize, nDestSize, nEstimatedFileSize );
+ aInformationDialog.execute();
+ SetStatusValue( TK_OpenNewDocument, Any( mbOpenNewDocument ) );
+ DispatchStatus();
+ }
+
+ if ( !maSaveAsURL.isEmpty() )
+ {
+ if ( mbOpenNewDocument && xSelf.is() )
+ {
+ Reference< awt::XWindow > xContainerWindow( xSelf->getContainerWindow() );
+ xContainerWindow->setVisible( true );
+ }
+ else
+ {
+ mxModel->dispose();
+ }
+ }
+ if ( nSourceSize && nDestSize )
+ {
+ SetStatusValue( TK_FileSizeSource, Any( nSourceSize ) );
+ SetStatusValue( TK_FileSizeDestination, Any( nDestSize ) );
+ DispatchStatus();
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/impoptimizer.hxx b/sdext/source/minimizer/impoptimizer.hxx
new file mode 100644
index 000000000..6a52e9498
--- /dev/null
+++ b/sdext/source/minimizer/impoptimizer.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/.
+ *
+ * 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_SDEXT_SOURCE_MINIMIZER_IMPOPTIMIZER_HXX
+#define INCLUDED_SDEXT_SOURCE_MINIMIZER_IMPOPTIMIZER_HXX
+
+#include "optimizationstats.hxx"
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/frame/XDispatch.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+
+class ImpOptimizer : public OptimizationStats
+{
+private:
+
+ css::uno::Reference< css::uno::XComponentContext > mxContext;
+ css::uno::Reference< css::frame::XModel > mxModel;
+ css::uno::Reference< css::frame::XDispatch > mxStatusDispatcher;
+
+ bool mbJPEGCompression;
+ sal_Int32 mnJPEGQuality;
+ bool mbRemoveCropArea;
+ sal_Int32 mnImageResolution;
+ bool mbEmbedLinkedGraphics;
+ bool mbOLEOptimization;
+ sal_Int32 mnOLEOptimizationType;
+ OUString maCustomShowName;
+ bool mbDeleteUnusedMasterPages;
+ bool mbDeleteHiddenSlides;
+ bool mbDeleteNotesPages;
+ OUString maSaveAsURL;
+ OUString maFilterName;
+ bool mbOpenNewDocument;
+
+ css::uno::Reference< css::frame::XFrame > mxInformationDialog;
+
+ void Optimize();
+
+public:
+
+ ImpOptimizer( const css::uno::Reference< css::uno::XComponentContext >& rXFactory,
+ const css::uno::Reference< css::frame::XModel >& rxModel );
+ ~ImpOptimizer();
+
+ void Optimize( const css::uno::Sequence< css::beans::PropertyValue >& rArguments );
+ void DispatchStatus();
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/informationdialog.cxx b/sdext/source/minimizer/informationdialog.cxx
new file mode 100644
index 000000000..0797e7856
--- /dev/null
+++ b/sdext/source/minimizer/informationdialog.cxx
@@ -0,0 +1,350 @@
+/* -*- 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 "informationdialog.hxx"
+#include <com/sun/star/awt/PushButtonType.hpp>
+#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
+#include <com/sun/star/util/URL.hpp>
+#include <com/sun/star/util/URLTransformer.hpp>
+#include <com/sun/star/util/XURLTransformer.hpp>
+#include <rtl/ustrbuf.hxx>
+#include <sal/macros.h>
+
+#define DIALOG_WIDTH 240
+#define DIALOG_HEIGHT 80
+#define PAGE_POS_X 35
+#define PAGE_WIDTH ( DIALOG_WIDTH - PAGE_POS_X ) - 6
+
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::ui;
+using namespace ::com::sun::star::awt;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+
+
+OUString InsertFixedText( UnoDialog& rInformationDialog, const OUString& rControlName, const OUString& rLabel,
+ sal_Int32 nXPos, sal_Int32 nYPos, sal_Int32 nWidth, sal_Int32 nHeight, bool bMultiLine, sal_Int16 nTabIndex )
+{
+ OUString pNames[] = {
+ OUString("Height"),
+ OUString("Label"),
+ OUString("MultiLine"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("Step"),
+ OUString("TabIndex"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( nHeight ),
+ Any( rLabel ),
+ Any( bMultiLine ),
+ Any( nXPos ),
+ Any( nYPos ),
+ Any( sal_Int16(0) ),
+ Any( nTabIndex ),
+ Any( nWidth ) };
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ rInformationDialog.insertFixedText( rControlName, aNames, aValues );
+ return rControlName;
+}
+
+OUString InsertImage(
+ UnoDialog& rInformationDialog,
+ const OUString& rControlName,
+ const OUString& rURL,
+ sal_Int32 nPosX,
+ sal_Int32 nPosY,
+ sal_Int32 nWidth,
+ sal_Int32 nHeight,
+ bool bScale )
+{
+ OUString pNames[] = {
+ OUString("Border"),
+ OUString("Height"),
+ OUString("ImageURL"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("ScaleImage"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( sal_Int16( 0 ) ),
+ Any( nHeight ),
+ Any( rURL ),
+ Any( nPosX ),
+ Any( nPosY ),
+ Any( bScale ),
+ Any( nWidth ) };
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ rInformationDialog.insertImage( rControlName, aNames, aValues );
+ return rControlName;
+}
+
+OUString InsertCheckBox( UnoDialog& rInformationDialog, const OUString& rControlName,
+ const Reference< XItemListener >& rItemListener, const OUString& rLabel,
+ sal_Int32 nXPos, sal_Int32 nYPos, sal_Int32 nWidth, sal_Int16 nTabIndex )
+{
+ sal_Int32 nHeight = 8;
+ OUString pNames[] = {
+ OUString("Enabled"),
+ OUString("Height"),
+ OUString("Label"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("Step"),
+ OUString("TabIndex"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( true ),
+ Any( nHeight ),
+ Any( rLabel ),
+ Any( nXPos ),
+ Any( nYPos ),
+ Any( sal_Int16(0) ),
+ Any( nTabIndex ),
+ Any( nWidth ) };
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ Reference< XCheckBox > xCheckBox( rInformationDialog.insertCheckBox( rControlName, aNames, aValues ) );
+ if ( rItemListener.is() )
+ xCheckBox->addItemListener( rItemListener );
+ return rControlName;
+}
+
+OUString InsertButton( UnoDialog& rInformationDialog, const OUString& rControlName, Reference< XActionListener > const & xActionListener,
+ sal_Int32 nXPos, sal_Int32 nYPos, sal_Int32 nWidth, sal_Int16 nTabIndex, const OUString& rText )
+{
+ sal_Int32 nHeight = 14;
+ OUString pNames[] = {
+ OUString("Enabled"),
+ OUString("Height"),
+ OUString("Label"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("PushButtonType"),
+ OUString("Step"),
+ OUString("TabIndex"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( true ),
+ Any( nHeight ),
+ Any( rText ),
+ Any( nXPos ),
+ Any( nYPos ),
+ Any( static_cast< sal_Int16 >( PushButtonType_OK ) ),
+ Any( sal_Int16(0) ),
+ Any( nTabIndex ),
+ Any( nWidth ) };
+
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ rInformationDialog.insertButton( rControlName, xActionListener, aNames, aValues );
+ return rControlName;
+}
+
+
+static OUString ImpValueOfInMB( sal_Int64 rVal )
+{
+ double fVal( static_cast<double>( rVal ) );
+ fVal /= ( 1 << 20 );
+ fVal += 0.05;
+ OUStringBuffer aVal( OUString::number( fVal ) );
+ sal_Int32 nX( aVal.indexOf( '.' ) );
+ if ( nX > 0 )
+ aVal.setLength( nX + 2 );
+ return aVal.makeStringAndClear();
+}
+
+void InformationDialog::InitDialog()
+{
+ sal_Int32 nDialogHeight = DIALOG_HEIGHT;
+ if ( maSaveAsURL.isEmpty() )
+ nDialogHeight -= 22;
+
+ // setting the dialog properties
+ OUString pNames[] = {
+ OUString("Closeable"),
+ OUString("Height"),
+ OUString("Moveable"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("Title"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( true ),
+ Any( nDialogHeight ),
+ Any( true ),
+ Any( sal_Int32( 245 ) ),
+ Any( sal_Int32( 115 ) ),
+ Any( getString( STR_SUN_OPTIMIZATION_WIZARD2 ) ),
+ Any( sal_Int32( DIALOG_WIDTH ) ) };
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ setPropertyValues(aNames, aValues);
+
+ sal_Int64 nSource = mnSourceSize;
+ sal_Int64 nDest = mnDestSize;
+
+ PPPOptimizerTokenEnum eInfoString( STR_INFO_1 );
+ if ( mnSourceSize )
+ {
+ if ( mnDestSize )
+ eInfoString = STR_INFO_1;
+ else
+ {
+ eInfoString = STR_INFO_2;
+ nDest = mnApproxSize;
+ }
+ }
+ else if ( mnDestSize )
+ eInfoString = STR_INFO_3;
+ else
+ {
+ eInfoString = STR_INFO_4;
+ nDest = mnApproxSize;
+ }
+
+ OUString aTitle;
+ if ( !maSaveAsURL.isEmpty() )
+ {
+ Reference< XURLTransformer > xURLTransformer( URLTransformer::create(UnoDialog::mxContext) );
+ util::URL aURL, aPresentationURL;
+ aURL.Complete = maSaveAsURL;
+ xURLTransformer->parseSmart( aURL, OUString() );
+
+ static const OUStringLiteral sFileProtocol( u"file:///" );
+ aPresentationURL.Complete = sFileProtocol + aURL.Name;
+ aTitle = xURLTransformer->getPresentation( aPresentationURL, false );
+
+ if ( aTitle.match( sFileProtocol ) )
+ aTitle = aTitle.replaceAt( 0, sFileProtocol.getLength(), u"" );
+ }
+
+ OUString aInfoString( getString( eInfoString ) );
+ static const OUStringLiteral aOldSizePlaceholder( u"%OLDFILESIZE" );
+ static const OUStringLiteral aNewSizePlaceholder( u"%NEWFILESIZE" );
+ const OUString aTitlePlaceholder( !aTitle.isEmpty() ? OUString("%TITLE" )
+ : OUString("'%TITLE'") );
+
+ sal_Int32 i = aInfoString.indexOf( aOldSizePlaceholder );
+ if ( i >= 0 )
+ aInfoString = aInfoString.replaceAt( i, aOldSizePlaceholder.getLength(), ImpValueOfInMB( nSource ) );
+
+ sal_Int32 j = aInfoString.indexOf( aNewSizePlaceholder );
+ if ( j >= 0 )
+ aInfoString = aInfoString.replaceAt( j, aNewSizePlaceholder.getLength(), ImpValueOfInMB( nDest ) );
+
+ sal_Int32 k = aInfoString.indexOf( aTitlePlaceholder );
+ if ( k >= 0 )
+ aInfoString = aInfoString.replaceAt( k, aTitlePlaceholder.getLength(), aTitle );
+
+ css::uno::Reference< css::awt::XItemListener > xItemListener;
+ InsertImage( *this,
+ "aboutimage",
+ "private:standardimage/query",
+ 5, 5, 25, 25, false );
+ InsertFixedText( *this, "fixedtext", aInfoString, PAGE_POS_X, 6, PAGE_WIDTH, 24, true, 0 );
+ if ( !maSaveAsURL.isEmpty() )
+ InsertCheckBox( *this, "OpenNewDocument", xItemListener, getString( STR_AUTOMATICALLY_OPEN ), PAGE_POS_X, 42, PAGE_WIDTH, 1 );
+ InsertButton( *this, "button", mxActionListener, DIALOG_WIDTH / 2 - 25, nDialogHeight - 20, 50, 2, getString( STR_OK ) );
+
+ bool bOpenNewDocument = mrbOpenNewDocument;
+ setControlProperty( "OpenNewDocument", "State", Any( static_cast<sal_Int16>(bOpenNewDocument) ) );
+}
+
+
+InformationDialog::InformationDialog( const Reference< XComponentContext > &rxContext, Reference< XFrame > const & rxFrame, const OUString& rSaveAsURL, bool& rbOpenNewDocument, sal_Int64 rSourceSize, sal_Int64 rDestSize, sal_Int64 rApproxSize ) :
+ UnoDialog( rxContext, rxFrame ),
+ ConfigurationAccess( rxContext ),
+ mxActionListener( new OKActionListener( *this ) ),
+ mnSourceSize( rSourceSize ),
+ mnDestSize( rDestSize ),
+ mnApproxSize( rApproxSize ),
+ mrbOpenNewDocument( rbOpenNewDocument ),
+ maSaveAsURL( rSaveAsURL )
+{
+ InitDialog();
+}
+
+
+InformationDialog::~InformationDialog()
+{
+}
+
+
+void InformationDialog::execute()
+{
+ UnoDialog::execute();
+
+ if ( !maSaveAsURL.isEmpty() )
+ {
+ sal_Int16 nInt16 = 0;
+ Any aAny( getControlProperty( "OpenNewDocument", "State" ) );
+ if ( aAny >>= nInt16 )
+ {
+ bool bOpenNewDocument = static_cast< bool >( nInt16 );
+ mrbOpenNewDocument = bOpenNewDocument;
+ }
+ }
+}
+
+
+void OKActionListener::actionPerformed( const ActionEvent& rEvent )
+{
+ if ( rEvent.ActionCommand == "button" )
+ {
+ mrDialog.endExecute( true );
+ }
+}
+void OKActionListener::disposing( const css::lang::EventObject& /* Source */ )
+{
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/informationdialog.hxx b/sdext/source/minimizer/informationdialog.hxx
new file mode 100644
index 000000000..761a40e01
--- /dev/null
+++ b/sdext/source/minimizer/informationdialog.hxx
@@ -0,0 +1,81 @@
+/* -*- 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_SDEXT_SOURCE_MINIMIZER_INFORMATIONDIALOG_HXX
+#define INCLUDED_SDEXT_SOURCE_MINIMIZER_INFORMATIONDIALOG_HXX
+
+#include "unodialog.hxx"
+#include "configurationaccess.hxx"
+#include <com/sun/star/awt/XItemListener.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <cppuhelper/implbase.hxx>
+
+OUString InsertFixedText( UnoDialog& rInformationDialog, const OUString& rControlName, const OUString& rLabel,
+ sal_Int32 nXPos, sal_Int32 nYPos, sal_Int32 nWidth, sal_Int32 nHeight, bool bMultiLine, sal_Int16 nTabIndex );
+
+OUString InsertImage( UnoDialog& rInformationDialog, const OUString& rControlName, const OUString& rURL,
+ sal_Int32 nPosX, sal_Int32 nPosY, sal_Int32 nWidth, sal_Int32 nHeight, bool bScale );
+
+OUString InsertCheckBox( UnoDialog& rInformationDialog, const OUString& rControlName,
+ const css::uno::Reference< css::awt::XItemListener >& rItemListener, const OUString& rLabel,
+ sal_Int32 nXPos, sal_Int32 nYPos, sal_Int32 nWidth, sal_Int16 nTabIndex );
+
+OUString InsertButton( UnoDialog& rInformationDialog, const OUString& rControlName,
+ css::uno::Reference< css::awt::XActionListener > const & xActionListener, sal_Int32 nXPos, sal_Int32 nYPos,
+ sal_Int32 nWidth, sal_Int16 nTabIndex, const OUString& rText );
+
+class InformationDialog : public UnoDialog, public ConfigurationAccess
+{
+public:
+
+ InformationDialog( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
+ css::uno::Reference< css::frame::XFrame > const & rxFrame, const OUString& rSaveAsURL,
+ bool& bOpenNewDocument, sal_Int64 nSourceSize, sal_Int64 nDestSize, sal_Int64 nApproxDest );
+ ~InformationDialog();
+
+ void execute();
+
+private:
+
+ css::uno::Reference< css::awt::XActionListener > mxActionListener;
+
+ void InitDialog();
+
+ sal_Int64 mnSourceSize;
+ sal_Int64 mnDestSize;
+ sal_Int64 mnApproxSize;
+ bool& mrbOpenNewDocument;
+ const OUString& maSaveAsURL;
+};
+
+class OKActionListener : public ::cppu::WeakImplHelper< css::awt::XActionListener >
+{
+public:
+ explicit OKActionListener( UnoDialog& rDialog ) : mrDialog( rDialog ){}
+
+ virtual void SAL_CALL actionPerformed( const css::awt::ActionEvent& Event ) override;
+ virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
+private:
+
+ UnoDialog& mrDialog;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/minimizer.component b/sdext/source/minimizer/minimizer.component
new file mode 100644
index 000000000..63f92cbbd
--- /dev/null
+++ b/sdext/source/minimizer/minimizer.component
@@ -0,0 +1,16 @@
+<?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.PresentationMinimizerImp"
+ constructor="sdext_PPPOptimizerDialog_get_implementation">
+ <service name="com.sun.star.comp.PresentationMinimizer"/>
+ </implementation>
+</component>
diff --git a/sdext/source/minimizer/optimizationstats.cxx b/sdext/source/minimizer/optimizationstats.cxx
new file mode 100644
index 000000000..1deef26ac
--- /dev/null
+++ b/sdext/source/minimizer/optimizationstats.cxx
@@ -0,0 +1,86 @@
+/* -*- 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 "optimizationstats.hxx"
+#include <com/sun/star/awt/Size.hpp>
+#include <com/sun/star/drawing/XShapes.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+
+#include <comphelper/propertyvalue.hxx>
+
+#include <algorithm>
+
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::beans;
+
+
+OptimizationStats::OptimizationStats()
+{
+}
+
+
+void OptimizationStats::SetStatusValue( const PPPOptimizerTokenEnum eStat, const uno::Any& rStatValue )
+{
+ maStats[ eStat ] = rStatValue;
+}
+
+
+const uno::Any* OptimizationStats::GetStatusValue( const PPPOptimizerTokenEnum eStat ) const
+{
+ std::map< PPPOptimizerTokenEnum, uno::Any >::const_iterator aIter( maStats.find( eStat ) );
+ return aIter != maStats.end() ? &((*aIter).second) : nullptr;
+}
+
+
+css::beans::PropertyValues OptimizationStats::GetStatusSequence()
+{
+ uno::Sequence< PropertyValue > aStatsSequence( maStats.size() );
+ std::transform(maStats.begin(), maStats.end(), aStatsSequence.getArray(),
+ [](const auto& rEntry)
+ { return comphelper::makePropertyValue(TKGet( rEntry.first ), rEntry.second); });
+ return aStatsSequence;
+}
+
+
+void OptimizationStats::InitializeStatusValues( const uno::Sequence< PropertyValue >& rOptimizationStats )
+{
+ for( const auto& rStat : rOptimizationStats )
+ maStats[ TKGet( rStat.Name ) ] = rStat.Value;
+}
+
+
+void OptimizationStats::InitializeStatusValuesFromDocument( const Reference< XModel >& rxModel )
+{
+ try
+ {
+ Reference< XDrawPagesSupplier > xDrawPagesSupplier( rxModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+ SetStatusValue( TK_Pages, Any( awt::Size( 0, xDrawPages->getCount() ) ) );
+ }
+ catch ( Exception& )
+ {
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/optimizationstats.hxx b/sdext/source/minimizer/optimizationstats.hxx
new file mode 100644
index 000000000..a1af8f30e
--- /dev/null
+++ b/sdext/source/minimizer/optimizationstats.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/beans/PropertyValues.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include "pppoptimizertoken.hxx"
+#include <map>
+
+class OptimizationStats
+{
+ std::map < PPPOptimizerTokenEnum, css::uno::Any > maStats;
+
+ public:
+
+ OptimizationStats();
+
+ void SetStatusValue( const PPPOptimizerTokenEnum eStat, const css::uno::Any& rStatValue );
+ const css::uno::Any* GetStatusValue( const PPPOptimizerTokenEnum eStat ) const;
+
+ void InitializeStatusValuesFromDocument( const css::uno::Reference< css::frame::XModel >& rxModel );
+ void InitializeStatusValues( const css::uno::Sequence< css::beans::PropertyValue >& rOptimizationStats );
+
+ css::beans::PropertyValues GetStatusSequence();
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/optimizerdialog.cxx b/sdext/source/minimizer/optimizerdialog.cxx
new file mode 100644
index 000000000..3112c6f22
--- /dev/null
+++ b/sdext/source/minimizer/optimizerdialog.cxx
@@ -0,0 +1,780 @@
+/* -*- 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 "optimizerdialog.hxx"
+#include "impoptimizer.hxx"
+#include "fileopendialog.hxx"
+#include <com/sun/star/awt/XItemEventBroadcaster.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XIndexContainer.hpp>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/frame/XTitle.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
+#include <com/sun/star/ucb/XSimpleFileAccess.hpp>
+#include <com/sun/star/io/IOException.hpp>
+#include <com/sun/star/util/XModifiable.hpp>
+
+#include <comphelper/propertyvalue.hxx>
+#include <sal/macros.h>
+#include <osl/time.h>
+#include <vcl/errinf.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <svtools/sfxecode.hxx>
+#include <svtools/ehdl.hxx>
+#include <tools/urlobj.hxx>
+#include <o3tl/string_view.hxx>
+#include <bitmaps.hlst>
+
+using namespace ::com::sun::star::io;
+using namespace ::com::sun::star::ui;
+using namespace ::com::sun::star::awt;
+using namespace ::com::sun::star::ucb;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+
+
+void OptimizerDialog::InitDialog()
+{
+ // setting the dialog properties
+ OUString pNames[] = {
+ OUString("Closeable"),
+ OUString("Height"),
+ OUString("Moveable"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("Title"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( true ),
+ Any( sal_Int32( DIALOG_HEIGHT ) ),
+ Any( true ),
+ Any( sal_Int32( 200 ) ),
+ Any( sal_Int32( 52 ) ),
+ Any( getString( STR_SUN_OPTIMIZATION_WIZARD2 ) ),
+ Any( sal_Int32( OD_DIALOG_WIDTH ) ) };
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ setPropertyValues(aNames, aValues);
+}
+
+
+void OptimizerDialog::InitRoadmap()
+{
+ try
+ {
+ OUString pNames[] = {
+ OUString("Height"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("Step"),
+ OUString("TabIndex"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( sal_Int32( DIALOG_HEIGHT - 26 ) ),
+ Any( sal_Int32( 0 ) ),
+ Any( sal_Int32( 0 ) ),
+ Any( sal_Int32( 0 ) ),
+ Any( mnTabIndex++ ),
+ Any( sal_Int32( 85 ) ) };
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ mxRoadmapControlModel = insertControlModel( "com.sun.star.awt.UnoControlRoadmapModel",
+ "rdmNavi", aNames, aValues );
+
+ Reference< XPropertySet > xPropertySet( mxRoadmapControlModel, UNO_QUERY_THROW );
+ xPropertySet->setPropertyValue( "Name", Any( OUString("rdmNavi") ) );
+ mxRoadmapControl = getControl( "rdmNavi" );
+ InsertRoadmapItem( 0, getString( STR_INTRODUCTION ), ITEM_ID_INTRODUCTION );
+ InsertRoadmapItem( 1, getString( STR_SLIDES ), ITEM_ID_SLIDES );
+ InsertRoadmapItem( 2, getString( STR_IMAGE_OPTIMIZATION ), ITEM_ID_GRAPHIC_OPTIMIZATION );
+ InsertRoadmapItem( 3, getString( STR_OLE_OBJECTS ), ITEM_ID_OLE_OPTIMIZATION );
+ InsertRoadmapItem( 4, getString( STR_SUMMARY ), ITEM_ID_SUMMARY );
+
+ xPropertySet->setPropertyValue( "ImageURL", Any( OUString("private:graphicrepository/" BMP_PRESENTATION_MINIMIZER) ) );
+ xPropertySet->setPropertyValue( "Activated", Any( true ) );
+ xPropertySet->setPropertyValue( "Complete", Any( true ) );
+ xPropertySet->setPropertyValue( "CurrentItemID", Any( sal_Int16(ITEM_ID_INTRODUCTION) ) );
+ xPropertySet->setPropertyValue( "Text", Any( getString( STR_STEPS ) ) );
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+
+void OptimizerDialog::InsertRoadmapItem( const sal_Int32 nIndex, const OUString& rLabel, const sal_Int32 nItemID )
+{
+ try
+ {
+ Reference< XSingleServiceFactory > xSFRoadmap( mxRoadmapControlModel, UNO_QUERY_THROW );
+ Reference< XIndexContainer > aIndexContainerRoadmap( mxRoadmapControlModel, UNO_QUERY_THROW );
+ Reference< XInterface > xRoadmapItem( xSFRoadmap->createInstance(), UNO_SET_THROW );
+ Reference< XPropertySet > xPropertySet( xRoadmapItem, UNO_QUERY_THROW );
+ xPropertySet->setPropertyValue( "Label", Any( rLabel ) );
+ xPropertySet->setPropertyValue( "Enabled", Any( true ) );
+ xPropertySet->setPropertyValue( "ID", Any( nItemID ) );
+ aIndexContainerRoadmap->insertByIndex( nIndex, Any( xRoadmapItem ) );
+ }
+ catch( Exception& )
+ {
+
+ }
+}
+
+
+void OptimizerDialog::UpdateConfiguration()
+{
+ sal_Int16 nInt16 = 0;
+ Any aAny;
+
+ Sequence< sal_Int16 > aSelectedItems;
+ Sequence< OUString > aStringItemList;
+
+ // page0
+ aAny = getControlProperty( "ListBox0Pg0", "SelectedItems" );
+ if ( aAny >>= aSelectedItems )
+ {
+ if ( aSelectedItems.hasElements() )
+ {
+ sal_Int16 nSelectedItem = aSelectedItems[ 0 ];
+ aAny = getControlProperty( "ListBox0Pg0", "StringItemList" );
+ if ( aAny >>= aStringItemList )
+ {
+ if ( aStringItemList.getLength() > nSelectedItem )
+ SetConfigProperty( TK_Name, Any( aStringItemList[ nSelectedItem ] ) );
+ }
+ }
+ }
+
+ aAny = getControlProperty( "CheckBox3Pg3", "State" );
+ if ( !((aAny >>= nInt16) && nInt16) )
+ return;
+
+ aAny = getControlProperty( "ListBox0Pg3", "SelectedItems" );
+ if ( !(aAny >>= aSelectedItems) )
+ return;
+
+ if ( aSelectedItems.hasElements() )
+ {
+ sal_Int16 nSelectedItem = aSelectedItems[ 0 ];
+ aAny = getControlProperty( "ListBox0Pg3", "StringItemList" );
+ if ( aAny >>= aStringItemList )
+ {
+ if ( aStringItemList.getLength() > nSelectedItem )
+ SetConfigProperty( TK_CustomShowName, Any( aStringItemList[ nSelectedItem ] ) );
+ }
+ }
+}
+
+
+OptimizerDialog::OptimizerDialog( const Reference< XComponentContext > &rxContext, Reference< XFrame > const & rxFrame, Reference< XDispatch > const & rxStatusDispatcher ) :
+ UnoDialog( rxContext, rxFrame ),
+ ConfigurationAccess( rxContext ),
+ mnCurrentStep( 0 ),
+ mnTabIndex( 0 ),
+ mxFrame( rxFrame ),
+ mxItemListener( new ItemListener( *this ) ),
+ mxActionListener( new ActionListener( *this ) ),
+ mxActionListenerListBox0Pg0( new ActionListenerListBox0Pg0( *this ) ),
+ mxTextListenerFormattedField0Pg1( new TextListenerFormattedField0Pg1( *this ) ),
+ mxTextListenerComboBox0Pg1( new TextListenerComboBox0Pg1( *this ) ),
+ mxSpinListenerFormattedField0Pg1( new SpinListenerFormattedField0Pg1( *this ) ),
+ mxStatusDispatcher( rxStatusDispatcher )
+{
+ Reference< XStorable > xStorable( mxController->getModel(), UNO_QUERY_THROW );
+ mbIsReadonly = xStorable->isReadonly();
+
+ InitDialog();
+ InitRoadmap();
+ InitNavigationBar();
+ InitPage0();
+ InitPage1();
+ InitPage2();
+ InitPage3();
+ InitPage4();
+ ActivatePage( 0 );
+
+ OptimizationStats aStats;
+ aStats.InitializeStatusValuesFromDocument( mxController->getModel() );
+ Sequence< PropertyValue > aStatusSequence( aStats.GetStatusSequence() );
+ UpdateStatus( aStatusSequence );
+}
+
+
+OptimizerDialog::~OptimizerDialog()
+{
+ // not saving configuration if the dialog has been finished via cancel or close window
+ if ( endStatus() )
+ SaveConfiguration();
+}
+
+
+void OptimizerDialog::execute()
+{
+ Reference< XItemEventBroadcaster > xRoadmapBroadcaster( mxRoadmapControl, UNO_QUERY_THROW );
+ xRoadmapBroadcaster->addItemListener( mxItemListener );
+ UnoDialog::execute();
+ UpdateConfiguration(); // taking actual control settings for the configuration
+ xRoadmapBroadcaster->removeItemListener( mxItemListener );
+}
+
+
+void OptimizerDialog::SwitchPage( sal_Int16 nNewStep )
+{
+ if ( !(( nNewStep != mnCurrentStep ) && ( nNewStep <= MAX_STEP ) && ( nNewStep >= 0 )) )
+ return;
+
+ sal_Int16 nOldStep = mnCurrentStep;
+ if ( nNewStep == 0 )
+ disableControl( "btnNavBack" );
+ else if ( nOldStep == 0 )
+ enableControl( "btnNavBack" );
+
+ if ( nNewStep == MAX_STEP )
+ disableControl( "btnNavNext" );
+ else if ( nOldStep == MAX_STEP )
+ enableControl( "btnNavNext" );
+
+ setControlProperty( "rdmNavi", "CurrentItemID", Any( nNewStep ) );
+
+ DeactivatePage( nOldStep );
+ UpdateControlStates( nNewStep );
+
+ ActivatePage( nNewStep );
+ mnCurrentStep = nNewStep;
+}
+
+void OptimizerDialog::UpdateControlStates( sal_Int16 nPage )
+{
+ switch( nPage )
+ {
+ case 0 : UpdateControlStatesPage0(); break;
+ case 1 : UpdateControlStatesPage1(); break;
+ case 2 : UpdateControlStatesPage2(); break;
+ case 3 : UpdateControlStatesPage3(); break;
+ case 4 : UpdateControlStatesPage4(); break;
+ default:
+ {
+ UpdateControlStatesPage0();
+ UpdateControlStatesPage1();
+ UpdateControlStatesPage2();
+ UpdateControlStatesPage3();
+ UpdateControlStatesPage4();
+ }
+ }
+}
+
+
+OUString OptimizerDialog::GetSelectedString( OUString const & token )
+{
+ OUString aSelectedItem;
+ Sequence< sal_Int16 > sSelectedItems;
+ Sequence< OUString > sItemList;
+
+ if ( ( getControlProperty( token, "SelectedItems" ) >>= sSelectedItems ) &&
+ ( getControlProperty( token, "StringItemList" ) >>= sItemList ) )
+ {
+ if ( sSelectedItems.getLength() == 1 )
+ {
+ sal_Int16 nSelectedItem = sSelectedItems[ 0 ];
+ if ( nSelectedItem < sItemList.getLength() )
+ aSelectedItem = sItemList[ nSelectedItem ];
+ }
+ }
+ return aSelectedItem;
+}
+
+
+void OptimizerDialog::UpdateStatus( const css::uno::Sequence< css::beans::PropertyValue >& rStatus )
+{
+ maStats.InitializeStatusValues( rStatus );
+ const Any* pVal( maStats.GetStatusValue( TK_Status ) );
+ if ( pVal )
+ {
+ OUString sStatus;
+ if ( *pVal >>= sStatus )
+ {
+ setControlProperty( "FixedText1Pg4", "Enabled", Any( true ) );
+ setControlProperty( "FixedText1Pg4", "Label", Any( getString( TKGet( sStatus ) ) ) );
+ }
+ }
+ pVal = maStats.GetStatusValue( TK_Progress );
+ if ( pVal )
+ {
+ sal_Int32 nProgress = 0;
+ if ( *pVal >>= nProgress )
+ setControlProperty( "Progress", "ProgressValue", Any( nProgress ) );
+ }
+ pVal = maStats.GetStatusValue( TK_OpenNewDocument );
+ if ( pVal )
+ SetConfigProperty( TK_OpenNewDocument, *pVal );
+
+ reschedule();
+}
+
+
+void ItemListener::itemStateChanged( const ItemEvent& Event )
+{
+ try
+ {
+ sal_Int16 nState;
+ Reference< XControl > xControl;
+ Any aSource( Event.Source );
+ if ( aSource >>= xControl )
+ {
+ Reference< XPropertySet > xPropertySet( xControl->getModel(), UNO_QUERY_THROW );
+ OUString aControlName;
+ xPropertySet->getPropertyValue( "Name" ) >>= aControlName;
+ PPPOptimizerTokenEnum eControl( TKGet( aControlName ) );
+ switch( eControl )
+ {
+ case TK_rdmNavi :
+ {
+ mrOptimizerDialog.SwitchPage( static_cast< sal_Int16 >( Event.ItemId ) );
+ }
+ break;
+ case TK_CheckBox1Pg1 :
+ {
+ if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
+ mrOptimizerDialog.SetConfigProperty( TK_RemoveCropArea, Any( nState != 0 ) );
+ }
+ break;
+ case TK_CheckBox2Pg1 :
+ {
+ if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
+ mrOptimizerDialog.SetConfigProperty( TK_EmbedLinkedGraphics, Any( nState != 0 ) );
+ }
+ break;
+ case TK_CheckBox0Pg2 :
+ {
+ if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
+ {
+ mrOptimizerDialog.SetConfigProperty( TK_OLEOptimization, Any( nState != 0 ) );
+ mrOptimizerDialog.setControlProperty( "RadioButton0Pg2", "Enabled", Any( nState != 0 ) );
+ mrOptimizerDialog.setControlProperty( "RadioButton1Pg2", "Enabled", Any( nState != 0 ) );
+ }
+ }
+ break;
+ case TK_RadioButton0Pg1 :
+ {
+ sal_Int16 nInt16 = 0;
+ if ( xPropertySet->getPropertyValue( "State" ) >>= nInt16 )
+ {
+ nInt16 ^= 1;
+ mrOptimizerDialog.SetConfigProperty( TK_JPEGCompression, Any( nInt16 != 0 ) );
+ mrOptimizerDialog.setControlProperty( "FixedText1Pg1", "Enabled", Any( nInt16 != 0 ) );
+ mrOptimizerDialog.setControlProperty( "FormattedField0Pg1", "Enabled", Any( nInt16 != 0 ) );
+ }
+ }
+ break;
+ case TK_RadioButton1Pg1 :
+ {
+ if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
+ {
+ mrOptimizerDialog.SetConfigProperty( TK_JPEGCompression, Any( nState != 0 ) );
+ mrOptimizerDialog.setControlProperty( "FixedText1Pg1", "Enabled", Any( nState != 0 ) );
+ mrOptimizerDialog.setControlProperty( "FormattedField0Pg1", "Enabled", Any( nState != 0 ) );
+ }
+ }
+ break;
+ case TK_RadioButton0Pg2 :
+ {
+ sal_Int16 nInt16;
+ if ( xPropertySet->getPropertyValue( "State" ) >>= nInt16 )
+ {
+ nInt16 ^= 1;
+ mrOptimizerDialog.SetConfigProperty( TK_OLEOptimizationType, Any( nInt16 ) );
+ }
+ }
+ break;
+ case TK_RadioButton1Pg2 :
+ {
+ if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
+ mrOptimizerDialog.SetConfigProperty( TK_OLEOptimizationType, Any( nState ) );
+ }
+ break;
+ case TK_CheckBox0Pg3 :
+ {
+ if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
+ mrOptimizerDialog.SetConfigProperty( TK_DeleteUnusedMasterPages, Any( nState != 0 ) );
+ }
+ break;
+ case TK_CheckBox1Pg3 :
+ {
+ if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
+ mrOptimizerDialog.SetConfigProperty( TK_DeleteNotesPages, Any( nState != 0 ) );
+ }
+ break;
+ case TK_CheckBox2Pg3 :
+ {
+ if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
+ mrOptimizerDialog.SetConfigProperty( TK_DeleteHiddenSlides, Any( nState != 0 ) );
+ }
+ break;
+ case TK_CheckBox3Pg3 :
+ {
+ if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
+ mrOptimizerDialog.setControlProperty( "ListBox0Pg3", "Enabled", Any( nState != 0 ) );
+ }
+ break;
+ case TK_CheckBox1Pg4 :
+ {
+ if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
+ mrOptimizerDialog.setControlProperty( "ComboBox0Pg4", "Enabled", Any( nState != 0 ) );
+ }
+ break;
+ case TK_RadioButton0Pg4 :
+ case TK_RadioButton1Pg4 :
+ {
+ if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
+ mrOptimizerDialog.SetConfigProperty( TK_SaveAs, Any( eControl == TK_RadioButton1Pg4 ? nState != 0 : nState == 0 ) );
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ catch ( Exception& )
+ {
+
+ }
+}
+void ItemListener::disposing( const css::lang::EventObject& /* Source */ )
+{
+}
+
+void ActionListener::actionPerformed( const ActionEvent& rEvent )
+{
+ switch( TKGet( rEvent.ActionCommand ) )
+ {
+ case TK_btnNavBack : mrOptimizerDialog.SwitchPage( mrOptimizerDialog.mnCurrentStep - 1 ); break;
+ case TK_btnNavNext : mrOptimizerDialog.SwitchPage( mrOptimizerDialog.mnCurrentStep + 1 ); break;
+ case TK_btnNavFinish :
+ {
+ mrOptimizerDialog.UpdateConfiguration();
+
+ mrOptimizerDialog.SwitchPage( ITEM_ID_SUMMARY );
+ mrOptimizerDialog.DisablePage( ITEM_ID_SUMMARY );
+ mrOptimizerDialog.setControlProperty( "btnNavBack", "Enabled", Any( false ) );
+ mrOptimizerDialog.setControlProperty( "btnNavNext", "Enabled", Any( false ) );
+ mrOptimizerDialog.setControlProperty( "btnNavFinish", "Enabled", Any( false ) );
+ mrOptimizerDialog.setControlProperty( "btnNavCancel", "Enabled", Any( false ) );
+ mrOptimizerDialog.setControlProperty( "FixedText0Pg4", "Enabled", Any( true ) );
+
+ // check if we have to open the FileDialog
+ bool bSuccessfullyExecuted = true;
+ sal_Int16 nInt16 = 0;
+ mrOptimizerDialog.getControlProperty( "RadioButton1Pg4", "State" ) >>= nInt16;
+ if ( nInt16 )
+ {
+ // Duplicate presentation before applying changes
+ OUString aSaveAsURL;
+ FileOpenDialog aFileOpenDialog( mrOptimizerDialog.GetComponentContext() );
+
+ // generating default file name
+ OUString aName;
+ Reference< XStorable > xStorable( mrOptimizerDialog.controller()->getModel(), UNO_QUERY );
+ if ( xStorable.is() && xStorable->hasLocation() )
+ {
+ INetURLObject aURLObj( xStorable->getLocation() );
+ if ( !aURLObj.hasFinalSlash() )
+ {
+ // tdf#105382 uri-decode file name
+ aURLObj.removeExtension(INetURLObject::LAST_SEGMENT, false);
+ aName = aURLObj.getName(INetURLObject::LAST_SEGMENT, false,
+ INetURLObject::DecodeMechanism::WithCharset);
+ }
+ }
+ else
+ {
+ // If no filename, try to use model title ("Untitled 1" or something like this)
+ Reference<XTitle> xTitle(
+ mrOptimizerDialog.GetFrame()->getController()->getModel(), UNO_QUERY);
+ aName = xTitle->getTitle();
+ }
+
+ if (!aName.isEmpty())
+ {
+ aName += " " + mrOptimizerDialog.getString(STR_FILENAME_SUFFIX);
+ aFileOpenDialog.setDefaultName(aName);
+ }
+
+ if (aFileOpenDialog.execute() == dialogs::ExecutableDialogResults::OK)
+ {
+ aSaveAsURL = aFileOpenDialog.getURL();
+ mrOptimizerDialog.SetConfigProperty( TK_SaveAsURL, Any( aSaveAsURL ) );
+ mrOptimizerDialog.SetConfigProperty( TK_FilterName, Any( aFileOpenDialog.getFilterName() ) );
+ }
+ if ( aSaveAsURL.isEmpty() )
+ {
+ // something goes wrong...
+ bSuccessfullyExecuted = false;
+ }
+
+ // waiting for 500ms
+ mrOptimizerDialog.reschedule();
+ for ( sal_uInt32 i = osl_getGlobalTimer(); ( i + 500 ) > ( osl_getGlobalTimer() ); )
+ mrOptimizerDialog.reschedule();
+ }
+ else
+ {
+ // Apply changes to current presentation
+ Reference<XModifiable> xModifiable(mrOptimizerDialog.controller()->getModel(),
+ UNO_QUERY_THROW );
+ if ( xModifiable->isModified() )
+ {
+ SolarMutexGuard aSolarGuard;
+ std::unique_ptr<weld::MessageDialog> popupDlg(Application::CreateMessageDialog(
+ nullptr, VclMessageType::Question, VclButtonsType::YesNo,
+ mrOptimizerDialog.getString(STR_WARN_UNSAVED_PRESENTATION)));
+ if (popupDlg->run() != RET_YES)
+ {
+ // Selected not "yes" ("no" or dialog was cancelled) so return to previous step
+ mrOptimizerDialog.setControlProperty("btnNavBack", "Enabled",
+ Any(true));
+ mrOptimizerDialog.setControlProperty("btnNavNext", "Enabled", Any(false));
+ mrOptimizerDialog.setControlProperty("btnNavFinish", "Enabled", Any(true));
+ mrOptimizerDialog.setControlProperty("btnNavCancel", "Enabled", Any(true));
+ mrOptimizerDialog.EnablePage(ITEM_ID_SUMMARY);
+ return;
+ }
+ }
+ }
+ if ( bSuccessfullyExecuted )
+ { // now check if we have to store a session template
+ nInt16 = 0;
+ OUString aSettingsName;
+ mrOptimizerDialog.getControlProperty( "CheckBox1Pg4", "State" ) >>= nInt16;
+ mrOptimizerDialog.getControlProperty( "ComboBox0Pg4", "Text" ) >>= aSettingsName;
+ if ( nInt16 && !aSettingsName.isEmpty() )
+ {
+ std::vector< OptimizerSettings >::iterator aIter( mrOptimizerDialog.GetOptimizerSettingsByName( aSettingsName ) );
+ std::vector< OptimizerSettings >& rSettings( mrOptimizerDialog.GetOptimizerSettings() );
+ OptimizerSettings aNewSettings( rSettings[ 0 ] );
+ aNewSettings.maName = aSettingsName;
+ if ( aIter == rSettings.end() )
+ rSettings.push_back( aNewSettings );
+ else
+ *aIter = aNewSettings;
+ }
+ }
+ if ( bSuccessfullyExecuted )
+ {
+ URL aURL;
+ aURL.Protocol = "vnd.com.sun.star.comp.PPPOptimizer:";
+ aURL.Path = "optimize";
+
+ Sequence< PropertyValue > lArguments{
+ comphelper::makePropertyValue("Settings", mrOptimizerDialog.GetConfigurationSequence()),
+ comphelper::makePropertyValue("StatusDispatcher", mrOptimizerDialog.GetStatusDispatcher()),
+ comphelper::makePropertyValue("InformationDialog", mrOptimizerDialog.GetFrame())
+ };
+
+ ErrCode errorCode;
+ try
+ {
+ ImpOptimizer aOptimizer(
+ mrOptimizerDialog.GetComponentContext(),
+ mrOptimizerDialog.GetFrame()->getController()->getModel());
+ aOptimizer.Optimize(lArguments);
+ }
+ catch (css::io::IOException&)
+ {
+ // We always receive just ERRCODE_IO_CANTWRITE in case of problems, so no need to bother
+ // about extracting error code from exception text
+ errorCode = ERRCODE_IO_CANTWRITE;
+ }
+ catch (css::uno::Exception&)
+ {
+ // Other general exception
+ errorCode = ERRCODE_IO_GENERAL;
+ }
+
+ if (errorCode != ERRCODE_NONE)
+ {
+ // Restore wizard controls
+ mrOptimizerDialog.maStats.SetStatusValue(TK_Progress,
+ Any(static_cast<sal_Int32>(0)));
+ mrOptimizerDialog.setControlProperty("btnNavBack", "Enabled", Any(true));
+ mrOptimizerDialog.setControlProperty("btnNavNext", "Enabled", Any(false));
+ mrOptimizerDialog.setControlProperty("btnNavFinish", "Enabled", Any(true));
+ mrOptimizerDialog.setControlProperty("btnNavCancel", "Enabled", Any(true));
+
+ OUString aFileName;
+ mrOptimizerDialog.GetConfigProperty(TK_SaveAsURL) >>= aFileName;
+ SfxErrorContext aEc(ERRCTX_SFX_SAVEASDOC, aFileName);
+ ErrorHandler::HandleError(errorCode);
+ break;
+ }
+
+ mrOptimizerDialog.endExecute( bSuccessfullyExecuted );
+ }
+ else
+ {
+ mrOptimizerDialog.setControlProperty( "btnNavBack", "Enabled", Any( true ) );
+ mrOptimizerDialog.setControlProperty( "btnNavNext", "Enabled", Any( false ) );
+ mrOptimizerDialog.setControlProperty( "btnNavFinish", "Enabled", Any( true ) );
+ mrOptimizerDialog.setControlProperty( "btnNavCancel", "Enabled", Any( true ) );
+ mrOptimizerDialog.EnablePage( ITEM_ID_SUMMARY );
+ }
+ }
+ break;
+ case TK_btnNavCancel : mrOptimizerDialog.endExecute( false ); break;
+ case TK_Button0Pg0 : // delete configuration
+ {
+ OUString aSelectedItem( mrOptimizerDialog.GetSelectedString( "ListBox0Pg0" ) );
+ if ( !aSelectedItem.isEmpty() )
+ {
+ std::vector< OptimizerSettings >::iterator aIter( mrOptimizerDialog.GetOptimizerSettingsByName( aSelectedItem ) );
+ std::vector< OptimizerSettings >& rList( mrOptimizerDialog.GetOptimizerSettings() );
+ if ( aIter != rList.end() )
+ {
+ rList.erase( aIter );
+ mrOptimizerDialog.UpdateControlStates();
+ }
+ }
+ }
+ break;
+ default: break;
+ }
+}
+void ActionListener::disposing( const css::lang::EventObject& /* Source */ )
+{
+}
+
+
+void ActionListenerListBox0Pg0::actionPerformed( const ActionEvent& rEvent )
+{
+ if ( !rEvent.ActionCommand.isEmpty() )
+ {
+ std::vector< OptimizerSettings >::iterator aIter( mrOptimizerDialog.GetOptimizerSettingsByName( rEvent.ActionCommand ) );
+ std::vector< OptimizerSettings >& rList( mrOptimizerDialog.GetOptimizerSettings() );
+ if ( aIter != rList.end() )
+ rList[ 0 ] = *aIter;
+ }
+ mrOptimizerDialog.UpdateControlStates();
+}
+void ActionListenerListBox0Pg0::disposing( const css::lang::EventObject& /* Source */ )
+{
+}
+
+
+void TextListenerFormattedField0Pg1::textChanged( const TextEvent& /* rEvent */ )
+{
+ double fDouble = 0;
+ Any aAny = mrOptimizerDialog.getControlProperty( "FormattedField0Pg1", "EffectiveValue" );
+ if ( aAny >>= fDouble )
+ mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( static_cast<sal_Int32>(fDouble) ) );
+}
+void TextListenerFormattedField0Pg1::disposing( const css::lang::EventObject& /* Source */ )
+{
+}
+
+namespace
+{
+
+bool lcl_mapResolution(OUString& rResolution, std::u16string_view rImageResolution)
+{
+ if (o3tl::getToken(rImageResolution, 1, ';')!=rResolution)
+ return false;
+ rResolution = o3tl::getToken(rImageResolution, 0, ';');
+ return true;
+}
+
+}
+
+void TextListenerComboBox0Pg1::textChanged( const TextEvent& /* rEvent */ )
+{
+ OUString aString;
+ Any aAny = mrOptimizerDialog.getControlProperty( "ComboBox0Pg1", "Text" );
+ if ( !(aAny >>= aString) )
+ return;
+
+ for (int nIR{ STR_IMAGE_RESOLUTION_0 }; nIR <= STR_IMAGE_RESOLUTION_3; ++nIR)
+ {
+ if (lcl_mapResolution(aString, mrOptimizerDialog.getString(static_cast<PPPOptimizerTokenEnum>(nIR))))
+ break;
+ }
+
+ mrOptimizerDialog.SetConfigProperty( TK_ImageResolution, Any( aString.toInt32() ) );
+}
+void TextListenerComboBox0Pg1::disposing( const css::lang::EventObject& /* Source */ )
+{
+}
+
+
+void SpinListenerFormattedField0Pg1::up( const SpinEvent& /* rEvent */ )
+{
+ double fDouble;
+ Any aAny = mrOptimizerDialog.getControlProperty( "FormattedField0Pg1", "EffectiveValue" );
+ if ( aAny >>= fDouble )
+ {
+ fDouble += 9;
+ if ( fDouble > 100 )
+ fDouble = 100;
+ mrOptimizerDialog.setControlProperty( "FormattedField0Pg1", "EffectiveValue", Any( fDouble ) );
+ mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( static_cast<sal_Int32>(fDouble) ) );
+ }
+}
+void SpinListenerFormattedField0Pg1::down( const SpinEvent& /* rEvent */ )
+{
+ double fDouble;
+ Any aAny = mrOptimizerDialog.getControlProperty( "FormattedField0Pg1", "EffectiveValue" );
+ if ( aAny >>= fDouble )
+ {
+ fDouble -= 9;
+ if ( fDouble < 0 )
+ fDouble = 0;
+ mrOptimizerDialog.setControlProperty( "FormattedField0Pg1", "EffectiveValue", Any( fDouble ) );
+ mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( static_cast<sal_Int32>(fDouble) ) );
+ }
+}
+void SpinListenerFormattedField0Pg1::first( const SpinEvent& /* rEvent */ )
+{
+ mrOptimizerDialog.setControlProperty( "FormattedField0Pg1", "EffectiveValue", Any( static_cast< double >( 0 ) ) );
+ mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( sal_Int32(0) ) );
+}
+void SpinListenerFormattedField0Pg1::last( const SpinEvent& /* rEvent */ )
+{
+ mrOptimizerDialog.setControlProperty( "FormattedField0Pg1", "EffectiveValue", Any( static_cast< double >( 100 ) ) );
+ mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( sal_Int32(100) ) );
+}
+void SpinListenerFormattedField0Pg1::disposing( const css::lang::EventObject& /* Source */ )
+{
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/optimizerdialog.hxx b/sdext/source/minimizer/optimizerdialog.hxx
new file mode 100644
index 000000000..4ea28eb75
--- /dev/null
+++ b/sdext/source/minimizer/optimizerdialog.hxx
@@ -0,0 +1,203 @@
+/* -*- 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_SDEXT_SOURCE_MINIMIZER_OPTIMIZERDIALOG_HXX
+#define INCLUDED_SDEXT_SOURCE_MINIMIZER_OPTIMIZERDIALOG_HXX
+#include <vector>
+#include "unodialog.hxx"
+#include "optimizationstats.hxx"
+#include "configurationaccess.hxx"
+#include <com/sun/star/awt/XItemListener.hpp>
+#include <com/sun/star/awt/XSpinListener.hpp>
+#include <com/sun/star/awt/XTextListener.hpp>
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/frame/XDispatch.hpp>
+#include <cppuhelper/implbase.hxx>
+
+#define MAX_STEP 4
+#define OD_DIALOG_WIDTH 330
+#define DIALOG_HEIGHT 210
+#define BUTTON_WIDTH 50
+#define BUTTON_HEIGHT 14
+#define BUTTON_POS_Y DIALOG_HEIGHT - BUTTON_HEIGHT - 6
+
+#define PAGE_POS_X 91
+#define PAGE_POS_Y 8
+#define PAGE_WIDTH OD_DIALOG_WIDTH - PAGE_POS_X
+
+#define ITEM_ID_INTRODUCTION 0
+#define ITEM_ID_SLIDES 1
+#define ITEM_ID_GRAPHIC_OPTIMIZATION 2
+#define ITEM_ID_OLE_OPTIMIZATION 3
+#define ITEM_ID_SUMMARY 4
+
+class OptimizerDialog : public UnoDialog, public ConfigurationAccess
+{
+public:
+
+ OptimizerDialog( const css::uno::Reference< css::uno::XComponentContext >& rxContext, css::uno::Reference< css::frame::XFrame > const & rxFrame,
+ css::uno::Reference< css::frame::XDispatch > const & rxStatusDispatcher );
+ ~OptimizerDialog();
+
+ void execute();
+
+ sal_Int16 mnCurrentStep;
+ sal_Int16 mnTabIndex;
+ bool mbIsReadonly;
+
+private:
+ css::uno::Reference< css::frame::XFrame > mxFrame;
+
+ css::uno::Reference< css::uno::XInterface > mxRoadmapControl;
+ css::uno::Reference< css::uno::XInterface > mxRoadmapControlModel;
+
+ css::uno::Reference< css::awt::XItemListener > mxItemListener;
+ css::uno::Reference< css::awt::XActionListener > mxActionListener;
+ css::uno::Reference< css::awt::XActionListener > mxActionListenerListBox0Pg0;
+ css::uno::Reference< css::awt::XTextListener > mxTextListenerFormattedField0Pg1;
+ css::uno::Reference< css::awt::XTextListener > mxTextListenerComboBox0Pg1;
+ css::uno::Reference< css::awt::XSpinListener > mxSpinListenerFormattedField0Pg1;
+ css::uno::Reference< css::frame::XDispatch > mxStatusDispatcher;
+
+ std::vector< std::vector< OUString > > maControlPages;
+
+ void InitDialog();
+ void InitRoadmap();
+ void InitNavigationBar();
+ void InitPage0();
+ void InitPage1();
+ void InitPage2();
+ void InitPage3();
+ void InitPage4();
+ void UpdateControlStatesPage0();
+ void UpdateControlStatesPage1();
+ void UpdateControlStatesPage2();
+ void UpdateControlStatesPage3();
+ void UpdateControlStatesPage4();
+
+ void ActivatePage( sal_Int16 nStep );
+ void DeactivatePage( sal_Int16 nStep );
+ void InsertRoadmapItem( const sal_Int32 nIndex, const OUString& rLabel, const sal_Int32 nItemID );
+
+public:
+
+ OptimizationStats maStats;
+
+ void UpdateStatus( const css::uno::Sequence< css::beans::PropertyValue >& rStatus );
+
+ // the ConfigurationAccess is updated to actual control settings
+ void UpdateConfiguration();
+
+ void EnablePage( sal_Int16 nStep );
+ void DisablePage( sal_Int16 nStep );
+
+ void SwitchPage( sal_Int16 nNewStep );
+ void UpdateControlStates( sal_Int16 nStep = -1 );
+
+ OUString GetSelectedString( OUString const & token );
+ css::uno::Reference< css::frame::XDispatch >& GetStatusDispatcher() { return mxStatusDispatcher; };
+ css::uno::Reference< css::frame::XFrame>& GetFrame() { return mxFrame; };
+ const css::uno::Reference< css::uno::XComponentContext >& GetComponentContext() const { return UnoDialog::mxContext; };
+};
+
+
+class ItemListener : public ::cppu::WeakImplHelper< css::awt::XItemListener >
+{
+public:
+ explicit ItemListener( OptimizerDialog& rOptimizerDialog ) : mrOptimizerDialog( rOptimizerDialog ){}
+
+ virtual void SAL_CALL itemStateChanged( const css::awt::ItemEvent& Event ) override;
+ virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
+private:
+
+ OptimizerDialog& mrOptimizerDialog;
+};
+
+
+class ActionListener : public ::cppu::WeakImplHelper< css::awt::XActionListener >
+{
+public:
+ explicit ActionListener( OptimizerDialog& rOptimizerDialog ) : mrOptimizerDialog( rOptimizerDialog ){}
+
+ virtual void SAL_CALL actionPerformed( const css::awt::ActionEvent& Event ) override;
+ virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
+private:
+
+ OptimizerDialog& mrOptimizerDialog;
+};
+
+
+class ActionListenerListBox0Pg0 : public ::cppu::WeakImplHelper< css::awt::XActionListener >
+{
+public:
+ explicit ActionListenerListBox0Pg0( OptimizerDialog& rOptimizerDialog ) : mrOptimizerDialog( rOptimizerDialog ){}
+
+ virtual void SAL_CALL actionPerformed( const css::awt::ActionEvent& Event ) override;
+ virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
+private:
+
+ OptimizerDialog& mrOptimizerDialog;
+};
+
+
+class TextListenerFormattedField0Pg1 : public ::cppu::WeakImplHelper< css::awt::XTextListener >
+{
+public:
+ explicit TextListenerFormattedField0Pg1( OptimizerDialog& rOptimizerDialog ) : mrOptimizerDialog( rOptimizerDialog ){}
+
+ virtual void SAL_CALL textChanged( const css::awt::TextEvent& Event ) override;
+ virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
+private:
+
+ OptimizerDialog& mrOptimizerDialog;
+};
+
+
+class TextListenerComboBox0Pg1 : public ::cppu::WeakImplHelper< css::awt::XTextListener >
+{
+public:
+ explicit TextListenerComboBox0Pg1( OptimizerDialog& rOptimizerDialog ) : mrOptimizerDialog( rOptimizerDialog ){}
+
+ virtual void SAL_CALL textChanged( const css::awt::TextEvent& Event ) override;
+ virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
+private:
+
+ OptimizerDialog& mrOptimizerDialog;
+};
+
+
+class SpinListenerFormattedField0Pg1 : public ::cppu::WeakImplHelper< css::awt::XSpinListener >
+{
+public:
+ explicit SpinListenerFormattedField0Pg1( OptimizerDialog& rOptimizerDialog ) : mrOptimizerDialog( rOptimizerDialog ){}
+
+ virtual void SAL_CALL up( const css::awt::SpinEvent& Event ) override;
+ virtual void SAL_CALL down( const css::awt::SpinEvent& Event ) override;
+ virtual void SAL_CALL first( const css::awt::SpinEvent& Event ) override;
+ virtual void SAL_CALL last( const css::awt::SpinEvent& Event ) override;
+ virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
+private:
+
+ OptimizerDialog& mrOptimizerDialog;
+};
+
+#endif // INCLUDED_SDEXT_SOURCE_MINIMIZER_OPTIMIZERDIALOG_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/optimizerdialogcontrols.cxx b/sdext/source/minimizer/optimizerdialogcontrols.cxx
new file mode 100644
index 000000000..4ab29d969
--- /dev/null
+++ b/sdext/source/minimizer/optimizerdialogcontrols.cxx
@@ -0,0 +1,909 @@
+/* -*- 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 "optimizerdialog.hxx"
+
+
+#include "pppoptimizer.hxx"
+#include "graphiccollector.hxx"
+#include "pagecollector.hxx"
+#include <com/sun/star/awt/PushButtonType.hpp>
+#include <com/sun/star/awt/XSpinField.hpp>
+#include <com/sun/star/awt/XTextComponent.hpp>
+#include <com/sun/star/presentation/XCustomPresentationSupplier.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/awt/FontDescriptor.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <rtl/ustrbuf.hxx>
+#include <sal/macros.h>
+#include <o3tl/string_view.hxx>
+
+using namespace ::com::sun::star::awt;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::presentation;
+
+
+static void SetBold( OptimizerDialog& rOptimizerDialog, const OUString& rControl )
+{
+ FontDescriptor aFontDescriptor;
+ if ( rOptimizerDialog.getControlProperty( rControl, "FontDescriptor" ) >>= aFontDescriptor )
+ {
+ aFontDescriptor.Weight = com::sun::star::awt::FontWeight::BOLD;
+ rOptimizerDialog.setControlProperty( rControl, "FontDescriptor", Any( aFontDescriptor ) );
+ }
+}
+
+
+static OUString InsertSeparator( OptimizerDialog& rOptimizerDialog, const OUString& rControlName, sal_Int32 nOrientation,
+ sal_Int32 nPosX, sal_Int32 nPosY, sal_Int32 nWidth, sal_Int32 nHeight )
+{
+ OUString pNames[] = {
+ OUString("Height"),
+ OUString("Orientation"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("Step"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( nHeight ),
+ Any( nOrientation ),
+ Any( nPosX ),
+ Any( nPosY ),
+ Any( sal_Int16( 0 ) ),
+ Any( nWidth ) };
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ rOptimizerDialog.insertControlModel( "com.sun.star.awt.UnoControlFixedLineModel",
+ rControlName, aNames, aValues );
+ return rControlName;
+}
+
+
+static OUString InsertButton( OptimizerDialog& rOptimizerDialog, const OUString& rControlName, Reference< XActionListener > const & xActionListener,
+ sal_Int32 nXPos, sal_Int32 nYPos, sal_Int32 nWidth, sal_Int16 nTabIndex, bool bEnabled, PPPOptimizerTokenEnum nResID, css::awt::PushButtonType nPushButtonType )
+{
+ sal_Int32 nHeight = BUTTON_HEIGHT;
+ OUString pNames[] = {
+ OUString("Enabled"),
+ OUString("Height"),
+ OUString("Label"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("PushButtonType"),
+ OUString("Step"),
+ OUString("TabIndex"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( bEnabled ),
+ Any( nHeight ),
+ Any( rOptimizerDialog.getString( nResID ) ),
+ Any( nXPos ),
+ Any( nYPos ),
+ Any( static_cast< sal_Int16 >(nPushButtonType) ),
+ Any( sal_Int16(0) ),
+ Any( nTabIndex ),
+ Any( nWidth ) };
+
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ rOptimizerDialog.insertButton( rControlName, xActionListener, aNames, aValues );
+ return rControlName;
+}
+
+
+static OUString InsertFixedText( OptimizerDialog& rOptimizerDialog, const OUString& rControlName, const OUString& rLabel,
+ sal_Int32 nXPos, sal_Int32 nYPos, sal_Int32 nWidth, sal_Int32 nHeight, bool bMultiLine, bool bBold, sal_Int16 nTabIndex )
+{
+ OUString pNames[] = {
+ OUString("Height"),
+ OUString("Label"),
+ OUString("MultiLine"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("Step"),
+ OUString("TabIndex"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( nHeight ),
+ Any( rLabel ),
+ Any( bMultiLine ),
+ Any( nXPos ),
+ Any( nYPos ),
+ Any( sal_Int16(0) ),
+ Any( nTabIndex ),
+ Any( nWidth ) };
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ rOptimizerDialog.insertFixedText( rControlName, aNames, aValues );
+ if ( bBold )
+ SetBold( rOptimizerDialog, rControlName );
+ return rControlName;
+}
+
+
+static OUString InsertCheckBox( OptimizerDialog& rOptimizerDialog, const OUString& rControlName,
+ const Reference< XItemListener >& xItemListener, const OUString& rLabel,
+ sal_Int32 nXPos, sal_Int32 nYPos, sal_Int32 nWidth, sal_Int16 nTabIndex )
+{
+ sal_Int32 nHeight = 8;
+ OUString pNames[] = {
+ OUString("Enabled"),
+ OUString("Height"),
+ OUString("Label"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("Step"),
+ OUString("TabIndex"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( true ),
+ Any( nHeight ),
+ Any( rLabel ),
+ Any( nXPos ),
+ Any( nYPos ),
+ Any( sal_Int16(0) ),
+ Any( nTabIndex ),
+ Any( nWidth ) };
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ Reference< XCheckBox > xCheckBox( rOptimizerDialog.insertCheckBox( rControlName, aNames, aValues ) );
+ if ( xItemListener.is() )
+ xCheckBox->addItemListener( xItemListener );
+ return rControlName;
+}
+
+
+static OUString InsertFormattedField( OptimizerDialog& rOptimizerDialog, const OUString& rControlName,
+ const Reference< XTextListener >& xTextListener, const Reference< XSpinListener >& xSpinListener, sal_Int32 nXPos, sal_Int32 nYPos,
+ double fEffectiveMin, double fEffectiveMax, sal_Int16 nTabIndex )
+{
+ sal_Int32 nWidth = 50;
+ OUString pNames[] = {
+ OUString("EffectiveMax"),
+ OUString("EffectiveMin"),
+ OUString("Enabled"),
+ OUString("Height"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("Repeat"),
+ OUString("Spin"),
+ OUString("Step"),
+ OUString("TabIndex"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( fEffectiveMax ),
+ Any( fEffectiveMin ),
+ Any( true ),
+ Any( sal_Int32(12) ),
+ Any( nXPos ),
+ Any( nYPos ),
+ Any( true ),
+ Any( true ),
+ Any( sal_Int16(0) ),
+ Any( nTabIndex ),
+ Any( nWidth ) };
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ Reference< XTextComponent > xTextComponent( rOptimizerDialog.insertFormattedField( rControlName, aNames, aValues ), UNO_QUERY_THROW );
+ if ( xTextListener.is() )
+ xTextComponent->addTextListener( xTextListener );
+ if ( xSpinListener.is() )
+ {
+ Reference< XSpinField > xSpinField( xTextComponent, UNO_QUERY_THROW );
+ xSpinField->addSpinListener( xSpinListener );
+ }
+ return rControlName;
+}
+
+
+static OUString InsertComboBox( OptimizerDialog& rOptimizerDialog, const OUString& rControlName,
+ const Reference< XTextListener >& rTextListener, const bool bEnabled, const Sequence< OUString >& rItemList,
+ sal_Int32 nXPos, sal_Int32 nYPos, sal_Int16 nTabIndex )
+{
+ sal_Int32 nHeight = 12;
+ sal_Int32 nWidth = 100;
+ OUString pNames[] = {
+ OUString("Dropdown"),
+ OUString("Enabled"),
+ OUString("Height"),
+ OUString("LineCount"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("Step"),
+ OUString("StringItemList"),
+ OUString("TabIndex"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( true ),
+ Any( bEnabled ),
+ Any( nHeight ),
+ Any( sal_Int16(8)),
+ Any( nXPos ),
+ Any( nYPos ),
+ Any( sal_Int16(0) ),
+ Any( rItemList ),
+ Any( nTabIndex ),
+ Any( nWidth ) };
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ Reference< XTextComponent > xTextComponent( rOptimizerDialog.insertComboBox( rControlName, aNames, aValues ), UNO_QUERY_THROW );
+ if ( rTextListener.is() )
+ xTextComponent->addTextListener( rTextListener );
+ return rControlName;
+}
+
+
+static OUString InsertRadioButton( OptimizerDialog& rOptimizerDialog, const OUString& rControlName, const Reference< XItemListener >& rItemListener,
+ const OUString& rLabel, sal_Int32 nXPos, sal_Int32 nYPos, sal_Int32 nWidth, sal_Int16 nTabIndex )
+{
+ sal_Int32 nHeight = 8;
+ OUString pNames[] = {
+ OUString("Height"),
+ OUString("Label"),
+ OUString("MultiLine"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("Step"),
+ OUString("TabIndex"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( nHeight ),
+ Any( rLabel ),
+ Any( false ), // bMultiLine
+ Any( nXPos ),
+ Any( nYPos ),
+ Any( sal_Int16(0) ),
+ Any( nTabIndex ),
+ Any( nWidth ) };
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ Reference< XRadioButton > xRadioButton( rOptimizerDialog.insertRadioButton( rControlName, aNames, aValues ) );
+ if ( rItemListener.is() )
+ xRadioButton->addItemListener( rItemListener );
+ return rControlName;
+}
+
+
+static OUString InsertListBox( OptimizerDialog& rOptimizerDialog, const OUString& rControlName,
+ const Reference< XActionListener >& rActionListener, const bool bEnabled, const Sequence< OUString >& rItemList,
+ sal_Int32 nXPos, sal_Int32 nYPos, sal_Int32 nWidth, sal_Int16 nTabIndex )
+{
+ sal_Int32 nHeight = 12;
+ OUString pNames[] = {
+ OUString("Dropdown"),
+ OUString("Enabled"),
+ OUString("Height"),
+ OUString("LineCount"),
+ OUString("MultiSelection"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("Step"),
+ OUString("StringItemList"),
+ OUString("TabIndex"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( true ),
+ Any( bEnabled ),
+ Any( nHeight ),
+ Any( sal_Int16(8)),
+ Any( false ),
+ Any( nXPos ),
+ Any( nYPos ),
+ Any( sal_Int16(0) ),
+ Any( rItemList ),
+ Any( nTabIndex ),
+ Any( nWidth ) };
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ Reference< XListBox > xListBox( rOptimizerDialog.insertListBox( rControlName, aNames, aValues ) );
+ if ( xListBox.is() )
+ xListBox->addActionListener( rActionListener );
+ return rControlName;
+}
+
+
+void OptimizerDialog::InitNavigationBar()
+{
+ sal_Int32 nCancelPosX = OD_DIALOG_WIDTH - BUTTON_WIDTH - 6;
+ sal_Int32 nFinishPosX = nCancelPosX - 6 - BUTTON_WIDTH;
+ sal_Int32 nNextPosX = nFinishPosX - 6 - BUTTON_WIDTH;
+ sal_Int32 nBackPosX = nNextPosX - 3 - BUTTON_WIDTH;
+
+ InsertSeparator( *this, "lnNavSep1", 0, 0, DIALOG_HEIGHT - 26, OD_DIALOG_WIDTH, 1 );
+ InsertSeparator( *this, "lnNavSep2", 1, 85, 0, 1, BUTTON_POS_Y - 6 );
+
+ InsertButton( *this, "btnNavBack", mxActionListener, nBackPosX, BUTTON_POS_Y, BUTTON_WIDTH, mnTabIndex++, false, STR_BACK, PushButtonType_STANDARD );
+ InsertButton( *this, "btnNavNext", mxActionListener, nNextPosX, BUTTON_POS_Y, BUTTON_WIDTH, mnTabIndex++, true, STR_NEXT, PushButtonType_STANDARD );
+ InsertButton( *this, "btnNavFinish", mxActionListener, nFinishPosX, BUTTON_POS_Y, BUTTON_WIDTH, mnTabIndex++, true, STR_FINISH, PushButtonType_STANDARD );
+ InsertButton( *this, "btnNavCancel", mxActionListener, nCancelPosX, BUTTON_POS_Y, BUTTON_WIDTH, mnTabIndex++, true, STR_CANCEL, PushButtonType_STANDARD );
+
+ setControlProperty( "btnNavNext", "DefaultButton", Any( true ) );
+}
+
+
+void OptimizerDialog::UpdateControlStatesPage0()
+{
+ short nSelectedItem = -1;
+ Sequence< OUString > aItemList;
+ const std::vector< OptimizerSettings >& rList( GetOptimizerSettings() );
+ if ( rList.size() > 1 ) // the first session in the list is the actual one -> skipping first one
+ {
+ aItemList.realloc( rList.size() - 1 );
+ auto pItemList = aItemList.getArray();
+ for ( std::vector<OptimizerSettings>::size_type i = 1; i < rList.size(); i++ )
+ {
+ pItemList[ i - 1 ] = rList[ i ].maName;
+ if ( nSelectedItem < 0 )
+ {
+ if ( rList[ i ] == rList[ 0 ] )
+ nSelectedItem = static_cast< short >( i - 1 );
+ }
+ }
+ }
+ bool bRemoveButtonEnabled = false;
+ Sequence< short > aSelectedItems;
+ if ( nSelectedItem >= 0 )
+ {
+ aSelectedItems = { nSelectedItem };
+ if ( nSelectedItem > 2 ) // only allowing to delete custom themes, the first can|t be deleted
+ bRemoveButtonEnabled = true;
+ }
+ setControlProperty( "ListBox0Pg0", "StringItemList", Any( aItemList ) );
+ setControlProperty( "ListBox0Pg0", "SelectedItems", Any( aSelectedItems ) );
+ setControlProperty( "Button0Pg0", "Enabled", Any( bRemoveButtonEnabled ) );
+}
+void OptimizerDialog::InitPage0()
+{
+ Sequence< OUString > aItemList;
+ std::vector< OUString > aControlList
+ {
+ InsertFixedText( *this, "FixedText0Pg0", getString( STR_INTRODUCTION ), PAGE_POS_X, PAGE_POS_Y, PAGE_WIDTH, 8, false, true, mnTabIndex++ ),
+ InsertFixedText( *this, "FixedText1Pg0", getString( STR_INTRODUCTION_T ), PAGE_POS_X + 6, PAGE_POS_Y + 14, PAGE_WIDTH - 12, 100, true, false, mnTabIndex++ ),
+ InsertSeparator( *this, "Separator1Pg0", 0, PAGE_POS_X + 6, DIALOG_HEIGHT - 66, PAGE_WIDTH - 12, 1 ),
+ InsertFixedText( *this, "FixedText2Pg0", getString( STR_CHOSE_SETTINGS ), PAGE_POS_X + 6, DIALOG_HEIGHT - 60, PAGE_WIDTH - 12, 8, true, false, mnTabIndex++ ),
+ InsertListBox( *this, "ListBox0Pg0", mxActionListenerListBox0Pg0, true, aItemList, PAGE_POS_X + 6, DIALOG_HEIGHT - 48, ( OD_DIALOG_WIDTH - 50 ) - ( PAGE_POS_X + 6 ), mnTabIndex++ ),
+ InsertButton( *this, "Button0Pg0", mxActionListener, OD_DIALOG_WIDTH - 46, DIALOG_HEIGHT - 49, 40, mnTabIndex++, true, STR_REMOVE, PushButtonType_STANDARD )
+ };
+ maControlPages.push_back( aControlList );
+ DeactivatePage( 0 );
+ UpdateControlStatesPage0();
+}
+
+
+void OptimizerDialog::UpdateControlStatesPage1()
+{
+ bool bDeleteUnusedMasterPages( GetConfigProperty( TK_DeleteUnusedMasterPages, false ) );
+ bool bDeleteHiddenSlides( GetConfigProperty( TK_DeleteHiddenSlides, false ) );
+ bool bDeleteNotesPages( GetConfigProperty( TK_DeleteNotesPages, false ) );
+
+ setControlProperty( "CheckBox0Pg3", "State", Any( static_cast<sal_Int16>(bDeleteUnusedMasterPages) ) );
+ setControlProperty( "CheckBox1Pg3", "State", Any( static_cast<sal_Int16>(bDeleteNotesPages) ) );
+ setControlProperty( "CheckBox2Pg3", "State", Any( static_cast<sal_Int16>(bDeleteHiddenSlides) ) );
+}
+void OptimizerDialog::InitPage1()
+{
+ Sequence< OUString > aCustomShowList;
+ Reference< XModel > xModel( mxController->getModel() );
+ if ( xModel.is() )
+ {
+ Reference< XCustomPresentationSupplier > aXCPSup( xModel, UNO_QUERY_THROW );
+ Reference< XNameContainer > aXCont( aXCPSup->getCustomPresentations() );
+ if ( aXCont.is() )
+ aCustomShowList = aXCont->getElementNames();
+ }
+ std::vector< OUString > aControlList
+ {
+ InsertFixedText( *this, "FixedText0Pg3", getString( STR_CHOOSE_SLIDES ), PAGE_POS_X, PAGE_POS_Y, PAGE_WIDTH, 8, false, true, mnTabIndex++ ),
+ InsertCheckBox( *this, "CheckBox0Pg3", mxItemListener, getString( STR_DELETE_MASTER_PAGES ), PAGE_POS_X + 6, PAGE_POS_Y + 14, PAGE_WIDTH - 12, mnTabIndex++ ),
+ InsertCheckBox( *this, "CheckBox2Pg3", mxItemListener, getString( STR_DELETE_HIDDEN_SLIDES ), PAGE_POS_X + 6, PAGE_POS_Y + 28, PAGE_WIDTH - 12, mnTabIndex++ ),
+ InsertCheckBox( *this, "CheckBox3Pg3", mxItemListener, getString( STR_CUSTOM_SHOW ), PAGE_POS_X + 6, PAGE_POS_Y + 42, PAGE_WIDTH - 12, mnTabIndex++ ),
+ InsertListBox( *this, "ListBox0Pg3", mxActionListener, true, aCustomShowList, PAGE_POS_X + 14, PAGE_POS_Y + 54, 150, mnTabIndex++ ),
+ InsertCheckBox( *this, "CheckBox1Pg3", mxItemListener, getString( STR_DELETE_NOTES_PAGES ), PAGE_POS_X + 6, PAGE_POS_Y + 70, PAGE_WIDTH - 12, mnTabIndex++ )
+ };
+ maControlPages.push_back( aControlList );
+ DeactivatePage( 1 );
+
+ setControlProperty( "CheckBox3Pg3", "State", Any( false ) );
+ setControlProperty( "CheckBox3Pg3", "Enabled", Any( aCustomShowList.hasElements() ) );
+ setControlProperty( "ListBox0Pg3", "Enabled", Any( false ) );
+
+ UpdateControlStatesPage1();
+}
+
+namespace
+{
+
+bool lcl_getResolutionText(OUString& rResolutionText, std::u16string_view rImageResolution, sal_Int32 nTargetRes)
+{
+ sal_Int32 nIdx{ 0 };
+ if (o3tl::toInt32(o3tl::getToken(rImageResolution, 0, ';', nIdx))!=nTargetRes)
+ return false;
+ rResolutionText = o3tl::getToken(rImageResolution, 0, ';', nIdx);
+ return true;
+}
+
+}
+
+void OptimizerDialog::UpdateControlStatesPage2()
+{
+ bool bJPEGCompression( GetConfigProperty( TK_JPEGCompression, false ) );
+ bool bRemoveCropArea( GetConfigProperty( TK_RemoveCropArea, false ) );
+ bool bEmbedLinkedGraphics( GetConfigProperty( TK_EmbedLinkedGraphics, true ) );
+ sal_Int32 nJPEGQuality( GetConfigProperty( TK_JPEGQuality, sal_Int32(90) ) );
+
+ sal_Int32 nImageResolution( GetConfigProperty( TK_ImageResolution, sal_Int32(0) ) );
+
+ OUString aResolutionText;
+ for (int nIR{ STR_IMAGE_RESOLUTION_0 }; nIR<=STR_IMAGE_RESOLUTION_3; ++nIR)
+ {
+ if (lcl_getResolutionText(aResolutionText, getString(static_cast<PPPOptimizerTokenEnum>(nIR)), nImageResolution))
+ break;
+ }
+ if ( aResolutionText.isEmpty() )
+ aResolutionText = OUString::number( nImageResolution );
+
+ setControlProperty( "RadioButton0Pg1", "State", Any( static_cast<sal_Int16>( !bJPEGCompression ) ) );
+ setControlProperty( "RadioButton1Pg1", "State", Any( static_cast<sal_Int16>(bJPEGCompression) ) );
+ setControlProperty( "FixedText1Pg1", "Enabled", Any( bJPEGCompression ) );
+ setControlProperty( "FormattedField0Pg1", "Enabled", Any( bJPEGCompression ) );
+ setControlProperty( "FormattedField0Pg1", "EffectiveValue", Any( static_cast<double>(nJPEGQuality) ) );
+ setControlProperty( "CheckBox1Pg1", "State", Any( static_cast<sal_Int16>(bRemoveCropArea) ) );
+ setControlProperty( "ComboBox0Pg1", "Text", Any( aResolutionText ) );
+ setControlProperty( "CheckBox2Pg1", "State", Any( static_cast<sal_Int16>(bEmbedLinkedGraphics) ) );
+}
+void OptimizerDialog::InitPage2()
+{
+ Sequence< OUString > aResolutionItemList{
+ getString( STR_IMAGE_RESOLUTION_0 ).getToken( 1, ';' ),
+ getString( STR_IMAGE_RESOLUTION_1 ).getToken( 1, ';' ),
+ getString( STR_IMAGE_RESOLUTION_2 ).getToken( 1, ';' ),
+ getString( STR_IMAGE_RESOLUTION_3 ).getToken( 1, ';' )
+ };
+
+ std::vector< OUString > aControlList
+ {
+ InsertFixedText( *this, "FixedText0Pg1", getString( STR_GRAPHIC_OPTIMIZATION ), PAGE_POS_X, PAGE_POS_Y, PAGE_WIDTH, 8, false, true, mnTabIndex++ ),
+ InsertRadioButton( *this, "RadioButton0Pg1", mxItemListener, getString( STR_LOSSLESS_COMPRESSION ), PAGE_POS_X + 6, PAGE_POS_Y + 14, PAGE_WIDTH - 12, mnTabIndex++ ),
+ InsertRadioButton( *this, "RadioButton1Pg1", mxItemListener, getString( STR_JPEG_COMPRESSION ), PAGE_POS_X + 6, PAGE_POS_Y + 28, PAGE_WIDTH - 12, mnTabIndex++ ),
+ InsertFixedText( *this, "FixedText1Pg1", getString( STR_QUALITY ), PAGE_POS_X + 20, PAGE_POS_Y + 40, 72, 8, false, false, mnTabIndex++ ),
+ InsertFormattedField( *this, "FormattedField0Pg1", mxTextListenerFormattedField0Pg1, mxSpinListenerFormattedField0Pg1, PAGE_POS_X + 106, PAGE_POS_Y + 38, 0, 100, mnTabIndex++ ),
+ InsertFixedText( *this, "FixedText2Pg1", getString( STR_IMAGE_RESOLUTION ), PAGE_POS_X + 6, PAGE_POS_Y + 54, 94, 8, false, false, mnTabIndex++ ),
+ InsertComboBox( *this, "ComboBox0Pg1", mxTextListenerComboBox0Pg1, true, aResolutionItemList, PAGE_POS_X + 106, PAGE_POS_Y + 52, mnTabIndex++ ),
+ InsertCheckBox( *this, "CheckBox1Pg1", mxItemListener, getString( STR_REMOVE_CROP_AREA ), PAGE_POS_X + 6, PAGE_POS_Y + 68, PAGE_WIDTH - 12, mnTabIndex++ ),
+ InsertCheckBox( *this, "CheckBox2Pg1", mxItemListener, getString( STR_EMBED_LINKED_GRAPHICS ), PAGE_POS_X + 6, PAGE_POS_Y + 82, PAGE_WIDTH - 12, mnTabIndex++ )
+ };
+ maControlPages.push_back( aControlList );
+ DeactivatePage( 2 );
+ UpdateControlStatesPage2();
+}
+
+
+void OptimizerDialog::UpdateControlStatesPage3()
+{
+ bool bConvertOLEObjects( GetConfigProperty( TK_OLEOptimization, false ) );
+ sal_Int16 nOLEOptimizationType( GetConfigProperty( TK_OLEOptimizationType, sal_Int16(0) ) );
+
+ setControlProperty( "CheckBox0Pg2", "State", Any( static_cast<sal_Int16>(bConvertOLEObjects) ) );
+ setControlProperty( "RadioButton0Pg2", "Enabled", Any( bConvertOLEObjects ) );
+ setControlProperty( "RadioButton0Pg2", "State", Any( static_cast<sal_Int16>( nOLEOptimizationType == 0 ) ) );
+ setControlProperty( "RadioButton1Pg2", "Enabled", Any( bConvertOLEObjects ) );
+ setControlProperty( "RadioButton1Pg2", "State", Any( static_cast<sal_Int16>( nOLEOptimizationType == 1 ) ) );
+}
+void OptimizerDialog::InitPage3()
+{
+ int nOLECount = 0;
+ Reference< XModel > xModel( mxController->getModel() );
+ Reference< XDrawPagesSupplier > xDrawPagesSupplier( xModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+ for ( sal_Int32 i = 0; i < xDrawPages->getCount(); i++ )
+ {
+ Reference< XShapes > xShapes( xDrawPages->getByIndex( i ), UNO_QUERY_THROW );
+ for ( sal_Int32 j = 0; j < xShapes->getCount(); j++ )
+ {
+ Reference< XShape > xShape( xShapes->getByIndex( j ), UNO_QUERY_THROW );
+ if ( xShape->getShapeType() == "com.sun.star.drawing.OLE2Shape" )
+ nOLECount++;
+ }
+ }
+
+ std::vector< OUString > aControlList
+ {
+ InsertFixedText( *this, "FixedText0Pg2", getString( STR_OLE_OPTIMIZATION ), PAGE_POS_X, PAGE_POS_Y, PAGE_WIDTH, 8, false, true, mnTabIndex++ ),
+ InsertCheckBox( *this, "CheckBox0Pg2", mxItemListener, getString( STR_OLE_REPLACE ), PAGE_POS_X + 6, PAGE_POS_Y + 14, PAGE_WIDTH - 12, mnTabIndex++ ),
+ InsertRadioButton( *this, "RadioButton0Pg2", mxItemListener, getString( STR_ALL_OLE_OBJECTS ), PAGE_POS_X + 14, PAGE_POS_Y + 28, PAGE_WIDTH - 22, mnTabIndex++ ),
+ InsertRadioButton( *this, "RadioButton1Pg2", mxItemListener, getString( STR_ALIEN_OLE_OBJECTS_ONLY ), PAGE_POS_X + 14, PAGE_POS_Y + 40, PAGE_WIDTH - 22, mnTabIndex++ ),
+ InsertFixedText( *this, "FixedText1Pg2", nOLECount ? getString( STR_OLE_OBJECTS_DESC ) : getString( STR_NO_OLE_OBJECTS_DESC ), PAGE_POS_X + 6, PAGE_POS_Y + 64, PAGE_WIDTH - 22, 50, true, false, mnTabIndex++ )
+ };
+ maControlPages.push_back( aControlList );
+ DeactivatePage( 3 );
+ UpdateControlStatesPage3();
+}
+
+
+static OUString ImpValueOfInMB( sal_Int64 rVal, sal_Unicode nSeparator )
+{
+ double fVal( static_cast<double>( rVal ) );
+ fVal /= ( 1 << 20 );
+ fVal += 0.05;
+ OUStringBuffer aVal( OUString::number( fVal ) );
+ sal_Int32 nX( aVal.indexOf( '.' ) );
+ if ( nX >= 0 )
+ {
+ aVal.setLength( nX + 2 );
+ aVal[nX] = nSeparator;
+ }
+ aVal.append( " MB" );
+ return aVal.makeStringAndClear();
+}
+
+void OptimizerDialog::UpdateControlStatesPage4()
+{
+ bool bSaveAs( GetConfigProperty( TK_SaveAs, true ) );
+ if ( mbIsReadonly )
+ {
+ setControlProperty( "RadioButton0Pg4", "State", Any( sal_Int16(false) ) );
+ setControlProperty( "RadioButton1Pg4", "State", Any( sal_Int16(true) ) );
+ }
+ else
+ {
+ setControlProperty( "RadioButton0Pg4", "State", Any( static_cast<sal_Int16>( !bSaveAs ) ) );
+ setControlProperty( "RadioButton1Pg4", "State", Any( static_cast<sal_Int16>(bSaveAs) ) );
+ }
+ setControlProperty( "ComboBox0Pg4", "Enabled", Any( false ) );
+
+ Sequence< OUString > aItemList;
+ const std::vector< OptimizerSettings >& rList( GetOptimizerSettings() );
+ if ( rList.size() > 1 ) // the first session in the list is the actual one -> skipping first one
+ {
+ aItemList.realloc( rList.size() - 1 );
+ auto pItemList = aItemList.getArray();
+ for ( std::vector<OptimizerSettings>::size_type w = 1; w < rList.size(); w++ )
+ pItemList[ w - 1 ] = rList[ w ].maName;
+ }
+ setControlProperty( "ComboBox0Pg4", "StringItemList", Any( aItemList ) );
+
+ // now check if it is sensible to enable the combo box
+ bool bSaveSettingsEnabled = true;
+ if ( rList.size() > 1 ) // the first session in the list is the actual one -> skipping first one
+ {
+ for ( std::vector<OptimizerSettings>::size_type w = 1; w < rList.size(); w++ )
+ {
+ if ( rList[ w ] == rList[ 0 ] )
+ {
+ bSaveSettingsEnabled = false;
+ break;
+ }
+ }
+ }
+ sal_Int16 nInt16 = 0;
+ getControlProperty( "CheckBox1Pg4", "State" ) >>= nInt16;
+ setControlProperty( "CheckBox1Pg4", "Enabled", Any( bSaveSettingsEnabled ) );
+ setControlProperty( "ComboBox0Pg4", "Enabled", Any( bSaveSettingsEnabled && nInt16 ) );
+
+ std::vector< OUString > aSummaryStrings;
+
+ // taking care of deleted slides
+ sal_Int32 nDeletedSlides = 0;
+ if ( getControlProperty( "CheckBox3Pg3", "State" ) >>= nInt16 )
+ {
+ if ( nInt16 )
+ {
+ Sequence< short > aSelectedItems;
+ Sequence< OUString > aStringItemList;
+ Any aAny = getControlProperty( "ListBox0Pg3", "SelectedItems" );
+ if ( aAny >>= aSelectedItems )
+ {
+ if ( aSelectedItems.hasElements() )
+ {
+ sal_Int16 nSelectedItem = aSelectedItems[ 0 ];
+ aAny = getControlProperty( "ListBox0Pg3", "StringItemList" );
+ if ( aAny >>= aStringItemList )
+ {
+ if ( aStringItemList.getLength() > nSelectedItem )
+ SetConfigProperty( TK_CustomShowName, Any( aStringItemList[ nSelectedItem ] ) );
+ }
+ }
+ }
+ }
+ }
+ if ( GetConfigProperty( TK_DeleteHiddenSlides, false ) )
+ {
+ Reference< XDrawPagesSupplier > xDrawPagesSupplier( mxController->getModel(), UNO_QUERY_THROW );
+ Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+ for( sal_Int32 i = 0; i < xDrawPages->getCount(); i++ )
+ {
+ Reference< XDrawPage > xDrawPage( xDrawPages->getByIndex( i ), UNO_QUERY_THROW );
+ Reference< XPropertySet > xPropSet( xDrawPage, UNO_QUERY_THROW );
+
+ bool bVisible = true;
+ if ( xPropSet->getPropertyValue( "Visible" ) >>= bVisible )
+ {
+ if (!bVisible )
+ nDeletedSlides++;
+ }
+ }
+ }
+ if ( GetConfigProperty( TK_DeleteUnusedMasterPages, false ) )
+ {
+ std::vector< PageCollector::MasterPageEntity > aMasterPageList;
+ PageCollector::CollectMasterPages( mxController->getModel(), aMasterPageList );
+ Reference< XMasterPagesSupplier > xMasterPagesSupplier( mxController->getModel(), UNO_QUERY_THROW );
+ Reference< XDrawPages > xMasterPages( xMasterPagesSupplier->getMasterPages(), UNO_SET_THROW );
+ nDeletedSlides += std::count_if(aMasterPageList.begin(), aMasterPageList.end(),
+ [](const PageCollector::MasterPageEntity& rEntity) { return !rEntity.bUsed; });
+ }
+ if ( nDeletedSlides > 1 )
+ {
+ OUString aStr( getString( STR_DELETE_SLIDES ) );
+ OUString aPlaceholder( "%SLIDES" );
+ sal_Int32 i = aStr.indexOf( aPlaceholder );
+ if ( i >= 0 )
+ aStr = aStr.replaceAt( i, aPlaceholder.getLength(), OUString::number( nDeletedSlides ) );
+ aSummaryStrings.push_back( aStr );
+ }
+
+// generating graphic compression info
+ sal_Int32 nGraphics = 0;
+ bool bJPEGCompression( GetConfigProperty( TK_JPEGCompression, false ) );
+ sal_Int32 nJPEGQuality( GetConfigProperty( TK_JPEGQuality, sal_Int32(90) ) );
+ sal_Int32 nImageResolution( GetConfigProperty( TK_ImageResolution, sal_Int32(0) ) );
+ GraphicSettings aGraphicSettings( bJPEGCompression, nJPEGQuality, GetConfigProperty( TK_RemoveCropArea, false ),
+ nImageResolution, GetConfigProperty( TK_EmbedLinkedGraphics, true ) );
+ GraphicCollector::CountGraphics( UnoDialog::mxContext, mxController->getModel(), aGraphicSettings, nGraphics );
+ if ( nGraphics > 1 )
+ {
+ OUString aStr( getString( STR_OPTIMIZE_IMAGES ) );
+ OUString aImagePlaceholder( "%IMAGES" );
+ OUString aQualityPlaceholder( "%QUALITY" );
+ OUString aResolutionPlaceholder( "%RESOLUTION" );
+ sal_Int32 i = aStr.indexOf( aImagePlaceholder );
+ if ( i >= 0 )
+ aStr = aStr.replaceAt( i, aImagePlaceholder.getLength(), OUString::number( nGraphics ) );
+
+ sal_Int32 j = aStr.indexOf( aQualityPlaceholder );
+ if ( j >= 0 )
+ aStr = aStr.replaceAt( j, aQualityPlaceholder.getLength(), OUString::number( nJPEGQuality ) );
+
+ sal_Int32 k = aStr.indexOf( aResolutionPlaceholder );
+ if ( k >= 0 )
+ aStr = aStr.replaceAt( k, aResolutionPlaceholder.getLength(), OUString::number( nImageResolution ) );
+
+ aSummaryStrings.push_back( aStr );
+ }
+
+ if ( GetConfigProperty( TK_OLEOptimization, false ) )
+ {
+ sal_Int32 nOLEReplacements = 0;
+ Reference< XDrawPagesSupplier > xDrawPagesSupplier( mxController->getModel(), UNO_QUERY_THROW );
+ Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+ for ( sal_Int32 i = 0; i < xDrawPages->getCount(); i++ )
+ {
+ Reference< XShapes > xShapes( xDrawPages->getByIndex( i ), UNO_QUERY_THROW );
+ for ( sal_Int32 j = 0; j < xShapes->getCount(); j++ )
+ {
+ Reference< XShape > xShape( xShapes->getByIndex( j ), UNO_QUERY_THROW );
+ if ( xShape->getShapeType() == "com.sun.star.drawing.OLE2Shape" )
+ nOLEReplacements++;
+ }
+ }
+ if ( nOLEReplacements > 1 )
+ {
+ OUString aStr( getString( STR_CREATE_REPLACEMENT ) );
+ OUString aPlaceholder( "%OLE" );
+ sal_Int32 i = aStr.indexOf( aPlaceholder );
+ if ( i >= 0 )
+ aStr = aStr.replaceAt( i, aPlaceholder.getLength(), OUString::number( nOLEReplacements ) );
+ aSummaryStrings.push_back( aStr );
+ }
+ }
+ while( aSummaryStrings.size() < 3 )
+ aSummaryStrings.emplace_back( );
+ setControlProperty( "FixedText4Pg4", "Label", Any( aSummaryStrings[ 0 ] ) );
+ setControlProperty( "FixedText5Pg4", "Label", Any( aSummaryStrings[ 1 ] ) );
+ setControlProperty( "FixedText6Pg4", "Label", Any( aSummaryStrings[ 2 ] ) );
+
+ sal_Int64 nCurrentFileSize = 0;
+ sal_Int64 nEstimatedFileSize = 0;
+ Reference< XStorable > xStorable( mxController->getModel(), UNO_QUERY );
+ if ( xStorable.is() && xStorable->hasLocation() )
+ nCurrentFileSize = PPPOptimizer::GetFileSize( xStorable->getLocation() );
+
+ if ( nCurrentFileSize )
+ {
+ double fE = static_cast< double >( nCurrentFileSize );
+ if ( nImageResolution )
+ {
+ double v = ( static_cast< double >( nImageResolution ) + 75.0 ) / 300.0;
+ if ( v < 1.0 )
+ fE *= v;
+ }
+ if ( bJPEGCompression )
+ {
+ double v = 0.75 - ( ( 100.0 - static_cast< double >( nJPEGQuality ) ) / 400.0 ) ;
+ fE *= v;
+ }
+ nEstimatedFileSize = static_cast< sal_Int64 >( fE );
+ }
+ sal_Unicode nSeparator = '.';
+ OUString aStr( getString( STR_FILESIZESEPARATOR ) );
+ if ( !aStr.isEmpty() )
+ nSeparator = aStr[ 0 ];
+ setControlProperty( "FixedText7Pg4", "Label", Any( ImpValueOfInMB( nCurrentFileSize, nSeparator ) ) );
+ setControlProperty( "FixedText8Pg4", "Label", Any( ImpValueOfInMB( nEstimatedFileSize, nSeparator ) ) );
+ SetConfigProperty( TK_EstimatedFileSize, Any( nEstimatedFileSize ) );
+}
+
+void OptimizerDialog::InitPage4()
+{
+ { // creating progress bar:
+ OUString pNames[] = {
+ OUString("Height"),
+ OUString("Name"),
+ OUString("PositionX"),
+ OUString("PositionY"),
+ OUString("ProgressValue"),
+ OUString("ProgressValueMax"),
+ OUString("ProgressValueMin"),
+ OUString("Width") };
+
+ Any pValues[] = {
+ Any( sal_Int32(12) ),
+ Any( OUString("STR_SAVE_AS") ),
+ Any( sal_Int32( PAGE_POS_X + 6 ) ),
+ Any( sal_Int32( DIALOG_HEIGHT - 75 ) ),
+ Any( sal_Int32(0) ),
+ Any( sal_Int32(100) ),
+ Any( sal_Int32(0) ),
+ Any( sal_Int32( PAGE_WIDTH - 12 ) ) };
+
+ sal_Int32 nCount = SAL_N_ELEMENTS( pNames );
+
+ Sequence< OUString > aNames( pNames, nCount );
+ Sequence< Any > aValues( pValues, nCount );
+
+ insertControlModel( "com.sun.star.awt.UnoControlProgressBarModel",
+ "Progress", aNames, aValues );
+ }
+ Reference< XTextListener > xTextListener;
+ Sequence< OUString > aItemList;
+ std::vector< OUString > aControlList
+ {
+ InsertFixedText( *this, "FixedText0Pg4", getString( STR_SUMMARY_TITLE ), PAGE_POS_X, PAGE_POS_Y, PAGE_WIDTH, 8, false, true, mnTabIndex++ ),
+ // InsertSeparator( *this, "Separator0Pg4", 0, PAGE_POS_X + 6, PAGE_POS_Y + 90, PAGE_WIDTH - 12, 1 ),
+
+ InsertFixedText( *this, "FixedText4Pg4", OUString(), PAGE_POS_X + 6, PAGE_POS_Y + 14, PAGE_WIDTH - 12, 8, false, false, mnTabIndex++ ),
+ InsertFixedText( *this, "FixedText5Pg4", OUString(), PAGE_POS_X + 6, PAGE_POS_Y + 22, PAGE_WIDTH - 12, 8, false, false, mnTabIndex++ ),
+ InsertFixedText( *this, "FixedText6Pg4", OUString(), PAGE_POS_X + 6, PAGE_POS_Y + 30, PAGE_WIDTH - 12, 8, false, false, mnTabIndex++ ),
+
+ InsertFixedText( *this, "FixedText2Pg4", getString( STR_CURRENT_FILESIZE ), PAGE_POS_X + 6, PAGE_POS_Y + 50, 88, 8, false, false, mnTabIndex++ ),
+ InsertFixedText( *this, "FixedText7Pg4", OUString(), PAGE_POS_X + 100, PAGE_POS_Y + 50, 30, 8, false, false, mnTabIndex++ )
+ };
+ setControlProperty( "FixedText7Pg4", "Align", Any( static_cast< short >( 2 ) ) );
+ aControlList.push_back( InsertFixedText( *this, "FixedText3Pg4", getString( STR_ESTIMATED_FILESIZE ), PAGE_POS_X + 6, PAGE_POS_Y + 58, 88, 8, false, false, mnTabIndex++ ) );
+ aControlList.push_back( InsertFixedText( *this, "FixedText8Pg4", OUString(), PAGE_POS_X + 100, PAGE_POS_Y + 58, 30, 8, false, false, mnTabIndex++ ) );
+ setControlProperty( "FixedText8Pg4", "Align", Any( static_cast< short >( 2 ) ) );
+
+ aControlList.push_back( InsertRadioButton( *this, "RadioButton0Pg4", mxItemListener, getString( STR_APPLY_TO_CURRENT ), PAGE_POS_X + 6, PAGE_POS_Y + 78, PAGE_WIDTH - 12, mnTabIndex++ ) );
+ aControlList.push_back( InsertRadioButton( *this, "RadioButton1Pg4", mxItemListener, getString( STR_SAVE_AS ), PAGE_POS_X + 6, PAGE_POS_Y + 90, PAGE_WIDTH - 12, mnTabIndex++ ) );
+ aControlList.push_back( InsertFixedText( *this, "FixedText1Pg4", OUString(), PAGE_POS_X + 6, DIALOG_HEIGHT - 87, PAGE_WIDTH - 12, 8, true, false, mnTabIndex++ ) );
+ aControlList.emplace_back("Progress" );
+ aControlList.push_back( InsertSeparator( *this, "Separator1Pg4", 0, PAGE_POS_X + 6, DIALOG_HEIGHT - 58, PAGE_WIDTH - 12, 1 ) );
+ aControlList.push_back( InsertCheckBox( *this, "CheckBox1Pg4", mxItemListener, getString( STR_SAVE_SETTINGS ), PAGE_POS_X + 6, DIALOG_HEIGHT - 47, 100, mnTabIndex++ ) );
+ aControlList.push_back( InsertComboBox( *this, "ComboBox0Pg4", xTextListener, true, aItemList, PAGE_POS_X + 106, DIALOG_HEIGHT - 48, mnTabIndex++ ) );
+ maControlPages.push_back( aControlList );
+ DeactivatePage( 4 );
+
+ // creating a default session name that hasn't been used yet
+ OUString aSettingsName;
+ OUString aDefault( getString( STR_MY_SETTINGS ) );
+ sal_Int32 nSession = 1;
+ std::vector<OptimizerSettings>::size_type i;
+ const std::vector< OptimizerSettings >& rList( GetOptimizerSettings() );
+ do
+ {
+ OUString aTemp = aDefault + OUString::number( nSession++ );
+ for ( i = 1; i < rList.size(); i++ )
+ {
+ if ( rList[ i ].maName == aTemp )
+ break;
+ }
+ if ( i == rList.size() )
+ aSettingsName = aTemp;
+ }
+ while( aSettingsName.isEmpty() );
+
+ setControlProperty( "ComboBox0Pg4", "Text", Any( aSettingsName ) );
+ setControlProperty( "RadioButton0Pg4", "Enabled", Any( !mbIsReadonly ) );
+ setControlProperty( "RadioButton1Pg4", "Enabled", Any( !mbIsReadonly ) );
+
+ UpdateControlStatesPage4();
+}
+
+
+void OptimizerDialog::EnablePage( sal_Int16 nStep )
+{
+ for( const auto& rItem : maControlPages[ nStep ] )
+ setControlProperty( rItem, "Enabled", Any( true ) );
+}
+void OptimizerDialog::DisablePage( sal_Int16 nStep )
+{
+ for( const auto& rItem : maControlPages[ nStep ] )
+ setControlProperty( rItem, "Enabled", Any( false ) );
+}
+void OptimizerDialog::ActivatePage( sal_Int16 nStep )
+{
+ for( const auto& rItem : maControlPages[ nStep ] )
+ setVisible( rItem, true );
+}
+void OptimizerDialog::DeactivatePage( sal_Int16 nStep )
+{
+ for( const auto& rItem : maControlPages[ nStep ] )
+ setVisible( rItem, false );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/pagecollector.cxx b/sdext/source/minimizer/pagecollector.cxx
new file mode 100644
index 000000000..f42c7d271
--- /dev/null
+++ b/sdext/source/minimizer/pagecollector.cxx
@@ -0,0 +1,136 @@
+/* -*- 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 "pagecollector.hxx"
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
+#include <com/sun/star/drawing/XMasterPageTarget.hpp>
+#include <com/sun/star/presentation/XCustomPresentationSupplier.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/container/XIndexContainer.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::awt;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::presentation;
+
+void PageCollector::CollectCustomShowPages( const css::uno::Reference< css::frame::XModel >& rxModel, std::u16string_view rCustomShowName, std::vector< Reference< XDrawPage > >& rUsedPageList )
+{
+ try
+ {
+ Reference< XCustomPresentationSupplier > aXCPSup( rxModel, UNO_QUERY_THROW );
+ Reference< XNameContainer > aXCont( aXCPSup->getCustomPresentations() );
+ if ( aXCont.is() )
+ {
+ // creating a list of every page that is used within our customshow
+ const Sequence< OUString> aNameSeq( aXCont->getElementNames() );
+ for ( OUString const & i :aNameSeq )
+ {
+ if ( i == rCustomShowName )
+ {
+ Reference< container::XIndexContainer > aXIC( aXCont->getByName( i ), UNO_QUERY_THROW );
+ sal_Int32 j, nSlideCount = aXIC->getCount();
+ for ( j = 0; j < nSlideCount; j++ )
+ {
+ Reference< XDrawPage > xDrawPage( aXIC->getByIndex( j ), UNO_QUERY_THROW );
+ auto aIter = std::find(rUsedPageList.begin(), rUsedPageList.end(), xDrawPage);
+ if ( aIter == rUsedPageList.end() )
+ rUsedPageList.push_back( xDrawPage );
+ }
+ }
+ }
+ }
+ }
+ catch( Exception& )
+ {
+
+ }
+}
+
+void PageCollector::CollectNonCustomShowPages( const css::uno::Reference< css::frame::XModel >& rxModel, std::u16string_view rCustomShowName, std::vector< Reference< XDrawPage > >& rNonUsedPageList )
+{
+ try
+ {
+ std::vector< Reference< XDrawPage > > vUsedPageList;
+ PageCollector::CollectCustomShowPages( rxModel, rCustomShowName, vUsedPageList );
+ if ( !vUsedPageList.empty() )
+ {
+ Reference< XDrawPagesSupplier > xDrawPagesSupplier( rxModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+ for ( sal_Int32 j = 0; j < xDrawPages->getCount(); j++ )
+ {
+ Reference< XDrawPage > xDrawPage( xDrawPages->getByIndex( j ), UNO_QUERY_THROW );
+ auto aIter = std::find(vUsedPageList.begin(), vUsedPageList.end(), xDrawPage);
+ if ( aIter == vUsedPageList.end() )
+ rNonUsedPageList.push_back( xDrawPage );
+ }
+ }
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+
+void PageCollector::CollectMasterPages( const Reference< XModel >& rxModel, std::vector< PageCollector::MasterPageEntity >& rMasterPageList )
+{
+ try
+ {
+ // generating list of all master pages
+ Reference< XMasterPagesSupplier > xMasterPagesSupplier( rxModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xMasterPages( xMasterPagesSupplier->getMasterPages(), UNO_SET_THROW );
+ for ( sal_Int32 i = 0; i < xMasterPages->getCount(); i++ )
+ {
+ Reference< XDrawPage > xMasterPage( xMasterPages->getByIndex( i ), UNO_QUERY_THROW );
+ auto aIter = std::find_if(rMasterPageList.begin(), rMasterPageList.end(),
+ [&xMasterPage](const MasterPageEntity& rEntity) { return rEntity.xMasterPage == xMasterPage; });
+ if ( aIter == rMasterPageList.end() )
+ {
+ MasterPageEntity aMasterPageEntity;
+ aMasterPageEntity.xMasterPage = xMasterPage;
+ aMasterPageEntity.bUsed = false;
+ rMasterPageList.push_back( aMasterPageEntity );
+ }
+ }
+
+ // mark masterpages which are referenced by drawpages
+ Reference< XDrawPagesSupplier > xDrawPagesSupplier( rxModel, UNO_QUERY_THROW );
+ Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_SET_THROW );
+ for ( sal_Int32 j = 0; j < xDrawPages->getCount(); j++ )
+ {
+ Reference< XMasterPageTarget > xMasterPageTarget( xDrawPages->getByIndex( j ), UNO_QUERY_THROW );
+ Reference< XDrawPage > xMasterPage( xMasterPageTarget->getMasterPage(), UNO_SET_THROW );
+ auto aIter = std::find_if(rMasterPageList.begin(), rMasterPageList.end(),
+ [&xMasterPage](const MasterPageEntity& rEntity) { return rEntity.xMasterPage == xMasterPage; });
+ if ( aIter == rMasterPageList.end() )
+ throw uno::RuntimeException();
+ aIter->bUsed = true;
+ }
+ }
+ catch( Exception& )
+ {
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/pagecollector.hxx b/sdext/source/minimizer/pagecollector.hxx
new file mode 100644
index 000000000..d2cc48d9e
--- /dev/null
+++ b/sdext/source/minimizer/pagecollector.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/.
+ *
+ * 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_SDEXT_SOURCE_MINIMIZER_PAGECOLLECTOR_HXX
+#define INCLUDED_SDEXT_SOURCE_MINIMIZER_PAGECOLLECTOR_HXX
+
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <vector>
+
+class PageCollector
+{
+ public:
+
+ struct MasterPageEntity
+ {
+ css::uno::Reference< css::drawing::XDrawPage > xMasterPage;
+ bool bUsed;
+ };
+ static void CollectCustomShowPages( const css::uno::Reference< css::frame::XModel >&, std::u16string_view rCustomShow, std::vector< css::uno::Reference< css::drawing::XDrawPage > >& );
+ static void CollectNonCustomShowPages( const css::uno::Reference< css::frame::XModel >&, std::u16string_view rCustomShow, std::vector< css::uno::Reference< css::drawing::XDrawPage > >& );
+ static void CollectMasterPages( const css::uno::Reference< css::frame::XModel >&, std::vector< MasterPageEntity >& );
+};
+
+#endif // INCLUDED_SDEXT_SOURCE_MINIMIZER_PAGECOLLECTOR_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/pppoptimizer.cxx b/sdext/source/minimizer/pppoptimizer.cxx
new file mode 100644
index 000000000..c869f7218
--- /dev/null
+++ b/sdext/source/minimizer/pppoptimizer.cxx
@@ -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/.
+ *
+ * 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 "pppoptimizer.hxx"
+#include <osl/file.hxx>
+
+// returning filesize, on error zero is returned
+sal_Int64 PPPOptimizer::GetFileSize(const OUString& rURL)
+{
+ sal_Int64 nFileSize = 0;
+ osl::DirectoryItem aItem;
+ if (osl::DirectoryItem::get(rURL, aItem) == osl::FileBase::E_None)
+ {
+ osl::FileStatus aStatus(osl_FileStatus_Mask_FileSize);
+ if (aItem.getFileStatus(aStatus) == osl::FileBase::E_None)
+ {
+ nFileSize = aStatus.getFileSize();
+ }
+ }
+ return nFileSize;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/pppoptimizer.hxx b/sdext/source/minimizer/pppoptimizer.hxx
new file mode 100644
index 000000000..60b191a7b
--- /dev/null
+++ b/sdext/source/minimizer/pppoptimizer.hxx
@@ -0,0 +1,32 @@
+/* -*- 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_SDEXT_SOURCE_MINIMIZER_PPPOPTIMIZER_HXX
+#define INCLUDED_SDEXT_SOURCE_MINIMIZER_PPPOPTIMIZER_HXX
+
+#include <rtl/ustring.hxx>
+
+struct PPPOptimizer
+{
+ static sal_Int64 GetFileSize(const OUString& rURL);
+};
+
+#endif // INCLUDED_SDEXT_SOURCE_MINIMIZER_PPPOPTIMIZER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/pppoptimizerdialog.cxx b/sdext/source/minimizer/pppoptimizerdialog.cxx
new file mode 100644
index 000000000..74a89bfba
--- /dev/null
+++ b/sdext/source/minimizer/pppoptimizerdialog.cxx
@@ -0,0 +1,153 @@
+/* -*- 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 "pppoptimizerdialog.hxx"
+#include "optimizerdialog.hxx"
+#include <sal/log.hxx>
+#include <cppuhelper/supportsservice.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::beans;
+
+PPPOptimizerDialog::PPPOptimizerDialog( const Reference< XComponentContext > &xContext ) :
+ mxContext( xContext ),
+ mpOptimizerDialog( nullptr )
+{
+}
+
+PPPOptimizerDialog::~PPPOptimizerDialog()
+{
+}
+
+void SAL_CALL PPPOptimizerDialog::initialize( const Sequence< Any >& aArguments )
+{
+ if( aArguments.getLength() != 1 )
+ throw IllegalArgumentException();
+
+ aArguments[ 0 ] >>= mxFrame;
+ if ( mxFrame.is() )
+ mxController = mxFrame->getController();
+}
+
+OUString SAL_CALL PPPOptimizerDialog::getImplementationName()
+{
+ return "com.sun.star.comp.PresentationMinimizerImp";
+}
+
+sal_Bool SAL_CALL PPPOptimizerDialog::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+Sequence< OUString > SAL_CALL PPPOptimizerDialog::getSupportedServiceNames()
+{
+ return { "com.sun.star.comp.PresentationMinimizer" };
+}
+
+Reference< css::frame::XDispatch > SAL_CALL PPPOptimizerDialog::queryDispatch(
+ const URL& aURL, const OUString& /* aTargetFrameName */, sal_Int32 /* nSearchFlags */ )
+{
+ Reference < XDispatch > xRet;
+ if ( aURL.Protocol.equalsIgnoreAsciiCase( "vnd.com.sun.star.comp.PresentationMinimizer:" ) )
+ xRet = this;
+
+ return xRet;
+}
+
+Sequence< Reference< css::frame::XDispatch > > SAL_CALL PPPOptimizerDialog::queryDispatches(
+ const Sequence< css::frame::DispatchDescriptor >& aDescripts )
+{
+ Sequence< Reference< css::frame::XDispatch> > aReturn( aDescripts.getLength() );
+ std::transform(aDescripts.begin(), aDescripts.end(), aReturn.getArray(),
+ [this](const css::frame::DispatchDescriptor& rDescr) -> Reference<css::frame::XDispatch> {
+ return queryDispatch(rDescr.FeatureURL, rDescr.FrameName, rDescr.SearchFlags); });
+ return aReturn;
+}
+
+void SAL_CALL PPPOptimizerDialog::dispatch( const URL& rURL,
+ const Sequence< PropertyValue >& rArguments )
+{
+
+ if ( !(mxController.is() && rURL.Protocol.equalsIgnoreAsciiCase( "vnd.com.sun.star.comp.PresentationMinimizer:" )) )
+ return;
+
+ if ( rURL.Path == "execute" )
+ {
+ try
+ {
+ sal_Int64 nFileSizeSource = 0;
+ sal_Int64 nFileSizeDest = 0;
+ mpOptimizerDialog = new OptimizerDialog( mxContext, mxFrame, this );
+ mpOptimizerDialog->execute();
+
+ const Any* pVal( mpOptimizerDialog->maStats.GetStatusValue( TK_FileSizeSource ) );
+ if ( pVal )
+ *pVal >>= nFileSizeSource;
+ pVal = mpOptimizerDialog->maStats.GetStatusValue( TK_FileSizeDestination );
+ if ( pVal )
+ *pVal >>= nFileSizeDest;
+
+ if ( nFileSizeSource && nFileSizeDest )
+ {
+ OUString sResult = "Your Presentation has been minimized from:" +
+ OUString::number( nFileSizeSource >> 10 ) +
+ "KB to " +
+ OUString::number( nFileSizeDest >> 10 ) +
+ "KB.";
+ SAL_INFO("sdext.minimizer", sResult );
+ }
+ }
+ catch( ... )
+ {
+ }
+ delete mpOptimizerDialog;
+ mpOptimizerDialog = nullptr;
+ }
+ else if ( rURL.Path == "statusupdate" )
+ {
+ if ( mpOptimizerDialog )
+ mpOptimizerDialog->UpdateStatus( rArguments );
+ }
+}
+
+void SAL_CALL PPPOptimizerDialog::addStatusListener( const Reference< XStatusListener >&, const URL& )
+{
+ // TODO
+ // OSL_FAIL( "PPPOptimizerDialog::addStatusListener()\nNot implemented yet!" );
+}
+
+void SAL_CALL PPPOptimizerDialog::removeStatusListener( const Reference< XStatusListener >&, const URL& )
+{
+ // TODO
+ // OSL_FAIL( "PPPOptimizerDialog::removeStatusListener()\nNot implemented yet!" );
+}
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+sdext_PPPOptimizerDialog_get_implementation(
+ css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any> const&)
+{
+ return cppu::acquire(new PPPOptimizerDialog(context));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/pppoptimizerdialog.hxx b/sdext/source/minimizer/pppoptimizerdialog.hxx
new file mode 100644
index 000000000..1d1042f64
--- /dev/null
+++ b/sdext/source/minimizer/pppoptimizerdialog.hxx
@@ -0,0 +1,81 @@
+/* -*- 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_SDEXT_SOURCE_MINIMIZER_PPPOPTIMIZERDIALOG_HXX
+#define INCLUDED_SDEXT_SOURCE_MINIMIZER_PPPOPTIMIZERDIALOG_HXX
+
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/frame/XDispatch.hpp>
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <cppuhelper/implbase.hxx>
+
+
+class OptimizerDialog;
+class PPPOptimizerDialog : public ::cppu::WeakImplHelper<
+ css::lang::XInitialization,
+ css::lang::XServiceInfo,
+ css::frame::XDispatchProvider,
+ css::frame::XDispatch >
+{
+ css::uno::Reference< css::uno::XComponentContext > mxContext;
+ css::uno::Reference< css::frame::XFrame > mxFrame;
+ css::uno::Reference< css::frame::XController > mxController;
+
+ OptimizerDialog* mpOptimizerDialog;
+
+public:
+
+ explicit PPPOptimizerDialog( const css::uno::Reference< css::uno::XComponentContext >& xContext );
+ virtual ~PPPOptimizerDialog() override;
+
+ // XInitialization
+ 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& sServiceName ) override;
+
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
+
+ // XDispatchProvider
+ virtual css::uno::Reference< css::frame::XDispatch > SAL_CALL queryDispatch(
+ const css::util::URL& aURL, const OUString& aTargetFrameName, sal_Int32 nSearchFlags ) override;
+
+ virtual css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL queryDispatches(
+ const css::uno::Sequence< css::frame::DispatchDescriptor >& aDescripts ) override;
+
+ // XDispatch
+ virtual void SAL_CALL dispatch( const css::util::URL& aURL,
+ const css::uno::Sequence< css::beans::PropertyValue >& lArguments ) override;
+
+ virtual void SAL_CALL addStatusListener( const css::uno::Reference< css::frame::XStatusListener >& xListener,
+ const css::util::URL& aURL ) override;
+ virtual void SAL_CALL removeStatusListener( const css::uno::Reference< css::frame::XStatusListener >& xListener,
+ const css::util::URL& aURL ) override;
+};
+
+#endif // INCLUDED_SDEXT_SOURCE_MINIMIZER_PPPOPTIMIZERDIALOG_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/pppoptimizertoken.cxx b/sdext/source/minimizer/pppoptimizertoken.cxx
new file mode 100644
index 000000000..1e020bc02
--- /dev/null
+++ b/sdext/source/minimizer/pppoptimizertoken.cxx
@@ -0,0 +1,198 @@
+/* -*- 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 "pppoptimizertoken.hxx"
+
+#include <sal/macros.h>
+#include <unordered_map>
+#include <memory>
+#include <mutex>
+
+typedef std::unordered_map< const char*, PPPOptimizerTokenEnum, rtl::CStringHash, rtl::CStringEqual> TypeNameHashMap;
+static TypeNameHashMap* pHashMap = nullptr;
+static std::mutex& getHashMapMutex()
+{
+ static std::mutex s_aHashMapProtection;
+ return s_aHashMapProtection;
+}
+
+namespace {
+
+struct TokenTable
+{
+ const char* pS;
+ PPPOptimizerTokenEnum pE;
+};
+
+}
+
+const TokenTable pTokenTableArray[] =
+{
+ { "rdmNavi", TK_rdmNavi },
+ { "btnNavBack", TK_btnNavBack },
+ { "btnNavNext", TK_btnNavNext },
+ { "btnNavFinish", TK_btnNavFinish },
+ { "btnNavCancel", TK_btnNavCancel },
+
+ { "Button0Pg0", TK_Button0Pg0 },
+ { "RadioButton0Pg1", TK_RadioButton0Pg1 },
+ { "RadioButton1Pg1", TK_RadioButton1Pg1 },
+ { "CheckBox1Pg1", TK_CheckBox1Pg1 },
+ { "CheckBox2Pg1", TK_CheckBox2Pg1 },
+ { "CheckBox0Pg2", TK_CheckBox0Pg2 },
+ { "RadioButton0Pg2", TK_RadioButton0Pg2 },
+ { "RadioButton1Pg2", TK_RadioButton1Pg2 },
+ { "CheckBox0Pg3", TK_CheckBox0Pg3 },
+ { "CheckBox1Pg3", TK_CheckBox1Pg3 },
+ { "CheckBox2Pg3", TK_CheckBox2Pg3 },
+ { "CheckBox3Pg3", TK_CheckBox3Pg3 },
+ { "RadioButton0Pg4", TK_RadioButton0Pg4 },
+ { "RadioButton1Pg4", TK_RadioButton1Pg4 },
+ { "CheckBox1Pg4", TK_CheckBox1Pg4 },
+
+ { "DocumentService", TK_DocumentService },
+ { "FileSizeDestination",TK_FileSizeDestination },
+ { "FileSizeSource", TK_FileSizeSource },
+ { "FilterName", TK_FilterName },
+ { "Flags", TK_Flags },
+ { "InformationDialog", TK_InformationDialog },
+ { "Name", TK_Name },
+ { "Progress", TK_Progress },
+ { "Settings", TK_Settings },
+ { "StatusDispatcher", TK_StatusDispatcher },
+ { "Type", TK_Type },
+ { "UIName", TK_UIName },
+
+ { "JPEGCompression", TK_JPEGCompression },
+ { "JPEGQuality", TK_JPEGQuality },
+ { "RemoveCropArea", TK_RemoveCropArea },
+ { "ImageResolution", TK_ImageResolution },
+ { "EmbedLinkedGraphics",TK_EmbedLinkedGraphics },
+ { "OLEOptimization", TK_OLEOptimization },
+ { "OLEOptimizationType",TK_OLEOptimizationType },
+ { "DeleteUnusedMasterPages", TK_DeleteUnusedMasterPages },
+ { "DeleteHiddenSlides", TK_DeleteHiddenSlides },
+ { "DeleteNotesPages", TK_DeleteNotesPages },
+ { "CustomShowName", TK_CustomShowName },
+ { "SaveAs", TK_SaveAs },
+ { "SaveAsURL", TK_SaveAsURL },
+ { "OpenNewDocument", TK_OpenNewDocument },
+ { "EstimatedFileSize", TK_EstimatedFileSize },
+
+ { "Status", TK_Status },
+ { "Pages", TK_Pages },
+
+ { "STR_SUN_OPTIMIZATION_WIZARD2",STR_SUN_OPTIMIZATION_WIZARD2 },
+ { "STR_STEPS", STR_STEPS },
+ { "STR_BACK", STR_BACK },
+ { "STR_NEXT", STR_NEXT },
+ { "STR_FINISH", STR_FINISH },
+ { "STR_CANCEL", STR_CANCEL },
+ { "STR_INTRODUCTION", STR_INTRODUCTION },
+ { "STR_INTRODUCTION_T", STR_INTRODUCTION_T },
+ { "STR_CHOSE_SETTINGS", STR_CHOSE_SETTINGS },
+ { "STR_REMOVE", STR_REMOVE },
+ { "STR_GRAPHIC_OPTIMIZATION", STR_GRAPHIC_OPTIMIZATION },
+ { "STR_IMAGE_OPTIMIZATION", STR_IMAGE_OPTIMIZATION },
+ { "STR_LOSSLESS_COMPRESSION", STR_LOSSLESS_COMPRESSION },
+ { "STR_JPEG_COMPRESSION", STR_JPEG_COMPRESSION },
+ { "STR_QUALITY", STR_QUALITY },
+ { "STR_REMOVE_CROP_AREA", STR_REMOVE_CROP_AREA },
+ { "STR_IMAGE_RESOLUTION", STR_IMAGE_RESOLUTION },
+ { "STR_IMAGE_RESOLUTION_0", STR_IMAGE_RESOLUTION_0 },
+ { "STR_IMAGE_RESOLUTION_1", STR_IMAGE_RESOLUTION_1 },
+ { "STR_IMAGE_RESOLUTION_2", STR_IMAGE_RESOLUTION_2 },
+ { "STR_IMAGE_RESOLUTION_3", STR_IMAGE_RESOLUTION_3 },
+ { "STR_EMBED_LINKED_GRAPHICS", STR_EMBED_LINKED_GRAPHICS },
+ { "STR_OLE_OBJECTS", STR_OLE_OBJECTS },
+ { "STR_OLE_OPTIMIZATION", STR_OLE_OPTIMIZATION },
+ { "STR_OLE_REPLACE", STR_OLE_REPLACE },
+ { "STR_ALL_OLE_OBJECTS", STR_ALL_OLE_OBJECTS },
+ { "STR_ALIEN_OLE_OBJECTS_ONLY", STR_ALIEN_OLE_OBJECTS_ONLY },
+ { "STR__OLE_OBJECTS_DESC", STR_OLE_OBJECTS_DESC },
+ { "STR_NO_OLE_OBJECTS_DESC", STR_NO_OLE_OBJECTS_DESC },
+ { "STR_SLIDES", STR_SLIDES },
+ { "STR_CHOOSE_SLIDES", STR_CHOOSE_SLIDES },
+ { "STR_DELETE_MASTER_PAGES", STR_DELETE_MASTER_PAGES },
+ { "STR_DELETE_NOTES_PAGES", STR_DELETE_NOTES_PAGES },
+ { "STR_DELETE_HIDDEN_SLIDES", STR_DELETE_HIDDEN_SLIDES },
+ { "STR_CUSTOM_SHOW", STR_CUSTOM_SHOW },
+ { "STR_SUMMARY", STR_SUMMARY },
+ { "STR_SUMMARY_TITLE", STR_SUMMARY_TITLE },
+ { "STR_APPLY_TO_CURRENT", STR_APPLY_TO_CURRENT },
+ { "STR_AUTOMATICALLY_OPEN", STR_AUTOMATICALLY_OPEN },
+ { "STR_SAVE_SETTINGS", STR_SAVE_SETTINGS },
+ { "STR_SAVE_AS", STR_SAVE_AS },
+ { "STR_DELETE_SLIDES", STR_DELETE_SLIDES },
+ { "STR_OPTIMIZE_IMAGES", STR_OPTIMIZE_IMAGES },
+ { "STR_CREATE_REPLACEMENT", STR_CREATE_REPLACEMENT },
+ { "STR_CURRENT_FILESIZE", STR_CURRENT_FILESIZE },
+ { "STR_ESTIMATED_FILESIZE", STR_ESTIMATED_FILESIZE },
+ { "MY_SETTINGS", STR_MY_SETTINGS },
+ { "STR_OK", STR_OK },
+ { "STR_INFO_1", STR_INFO_1 },
+ { "STR_INFO_2", STR_INFO_2 },
+ { "STR_INFO_3", STR_INFO_3 },
+ { "STR_INFO_4", STR_INFO_4 },
+ { "STR_DUPLICATING_PRESENTATION",STR_DUPLICATING_PRESENTATION },
+ { "STR_DELETING_SLIDES", STR_DELETING_SLIDES },
+ { "STR_OPTIMIZING_GRAPHICS", STR_OPTIMIZING_GRAPHICS },
+ { "STR_CREATING_OLE_REPLACEMENTS",STR_CREATING_OLE_REPLACEMENTS },
+ { "STR_FileSizeSeparator", STR_FILESIZESEPARATOR },
+ { "STR_FILENAME_SUFFIX", STR_FILENAME_SUFFIX },
+ { "STR_WARN_UNSAVED_PRESENTATION", STR_WARN_UNSAVED_PRESENTATION },
+
+
+ { "NotFound", TK_NotFound }
+};
+
+PPPOptimizerTokenEnum TKGet( const OUString& rToken )
+{
+ if ( !pHashMap )
+ { // init hash map
+ std::scoped_lock aGuard( getHashMapMutex() );
+ if ( !pHashMap )
+ {
+ TypeNameHashMap* pH = new TypeNameHashMap;
+ const TokenTable* pPtr = pTokenTableArray;
+ const TokenTable* pEnd = pPtr + SAL_N_ELEMENTS( pTokenTableArray );
+ for ( ; pPtr < pEnd; pPtr++ )
+ (*pH)[ pPtr->pS ] = pPtr->pE;
+ pHashMap = pH;
+ }
+ }
+ PPPOptimizerTokenEnum eRetValue = TK_NotFound;
+ int i, nLen = rToken.getLength();
+ std::unique_ptr<char[]> pBuf(new char[ nLen + 1 ]);
+ for ( i = 0; i < nLen; i++ )
+ pBuf[ i ] = static_cast<char>(rToken[ i ]);
+ pBuf[ i ] = 0;
+ TypeNameHashMap::iterator aHashIter( pHashMap->find( pBuf.get() ) );
+ if ( aHashIter != pHashMap->end() )
+ eRetValue = (*aHashIter).second;
+ return eRetValue;
+}
+
+OUString TKGet( const PPPOptimizerTokenEnum eToken )
+{
+ return OUString::createFromAscii( pTokenTableArray[ eToken ].pS );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/pppoptimizertoken.hxx b/sdext/source/minimizer/pppoptimizertoken.hxx
new file mode 100644
index 000000000..d0ae65ed7
--- /dev/null
+++ b/sdext/source/minimizer/pppoptimizertoken.hxx
@@ -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/.
+ *
+ * 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_SDEXT_SOURCE_MINIMIZER_PPPOPTIMIZERTOKEN_HXX
+#define INCLUDED_SDEXT_SOURCE_MINIMIZER_PPPOPTIMIZERTOKEN_HXX
+
+#include <rtl/ustring.hxx>
+
+enum PPPOptimizerTokenEnum
+{
+ TK_rdmNavi,
+ TK_btnNavBack,
+ TK_btnNavNext,
+ TK_btnNavFinish,
+ TK_btnNavCancel,
+
+ TK_Button0Pg0,
+ TK_RadioButton0Pg1,
+ TK_RadioButton1Pg1,
+ TK_CheckBox1Pg1,
+ TK_CheckBox2Pg1,
+ TK_CheckBox0Pg2,
+ TK_RadioButton0Pg2,
+ TK_RadioButton1Pg2,
+ TK_CheckBox0Pg3,
+ TK_CheckBox1Pg3,
+ TK_CheckBox2Pg3,
+ TK_CheckBox3Pg3,
+ TK_RadioButton0Pg4,
+ TK_RadioButton1Pg4,
+ TK_CheckBox1Pg4,
+
+ TK_DocumentService,
+ TK_FileSizeDestination,
+ TK_FileSizeSource,
+ TK_FilterName,
+ TK_Flags,
+ TK_InformationDialog,
+ TK_Name,
+ TK_Progress,
+ TK_Settings,
+ TK_StatusDispatcher,
+ TK_Type,
+ TK_UIName,
+
+ TK_JPEGCompression,
+ TK_JPEGQuality,
+ TK_RemoveCropArea,
+ TK_ImageResolution,
+ TK_EmbedLinkedGraphics,
+ TK_OLEOptimization,
+ TK_OLEOptimizationType,
+ TK_DeleteUnusedMasterPages,
+ TK_DeleteHiddenSlides,
+ TK_DeleteNotesPages,
+ TK_CustomShowName,
+ TK_SaveAs,
+ TK_SaveAsURL,
+ TK_OpenNewDocument,
+ TK_EstimatedFileSize,
+
+ TK_Status,
+ TK_Pages,
+
+ STR_SUN_OPTIMIZATION_WIZARD2,
+ STR_STEPS,
+ STR_BACK,
+ STR_NEXT,
+ STR_FINISH,
+ STR_CANCEL,
+ STR_INTRODUCTION,
+ STR_INTRODUCTION_T,
+ STR_CHOSE_SETTINGS,
+ STR_REMOVE,
+ STR_GRAPHIC_OPTIMIZATION,
+ STR_IMAGE_OPTIMIZATION,
+ STR_LOSSLESS_COMPRESSION,
+ STR_JPEG_COMPRESSION,
+ STR_QUALITY,
+ STR_REMOVE_CROP_AREA,
+ STR_IMAGE_RESOLUTION,
+ STR_IMAGE_RESOLUTION_0,
+ STR_IMAGE_RESOLUTION_1,
+ STR_IMAGE_RESOLUTION_2,
+ STR_IMAGE_RESOLUTION_3,
+ STR_EMBED_LINKED_GRAPHICS,
+ STR_OLE_OBJECTS,
+ STR_OLE_OPTIMIZATION,
+ STR_OLE_REPLACE,
+ STR_ALL_OLE_OBJECTS,
+ STR_ALIEN_OLE_OBJECTS_ONLY,
+ STR_OLE_OBJECTS_DESC,
+ STR_NO_OLE_OBJECTS_DESC,
+ STR_SLIDES,
+ STR_CHOOSE_SLIDES,
+ STR_DELETE_MASTER_PAGES,
+ STR_DELETE_NOTES_PAGES,
+ STR_DELETE_HIDDEN_SLIDES,
+ STR_CUSTOM_SHOW,
+ STR_SUMMARY,
+ STR_SUMMARY_TITLE,
+ STR_APPLY_TO_CURRENT,
+ STR_AUTOMATICALLY_OPEN,
+ STR_SAVE_SETTINGS,
+ STR_SAVE_AS,
+ STR_DELETE_SLIDES,
+ STR_OPTIMIZE_IMAGES,
+ STR_CREATE_REPLACEMENT,
+ STR_CURRENT_FILESIZE,
+ STR_ESTIMATED_FILESIZE,
+ STR_MY_SETTINGS,
+ STR_OK,
+ STR_INFO_1,
+ STR_INFO_2,
+ STR_INFO_3,
+ STR_INFO_4,
+ STR_DUPLICATING_PRESENTATION,
+ STR_DELETING_SLIDES,
+ STR_OPTIMIZING_GRAPHICS,
+ STR_CREATING_OLE_REPLACEMENTS,
+ STR_FILESIZESEPARATOR,
+ STR_FILENAME_SUFFIX,
+ STR_WARN_UNSAVED_PRESENTATION,
+ TK_NotFound
+};
+
+PPPOptimizerTokenEnum TKGet(const OUString&);
+OUString TKGet(const PPPOptimizerTokenEnum);
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/unodialog.cxx b/sdext/source/minimizer/unodialog.cxx
new file mode 100644
index 000000000..a635d102e
--- /dev/null
+++ b/sdext/source/minimizer/unodialog.cxx
@@ -0,0 +1,309 @@
+/* -*- 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 "unodialog.hxx"
+
+#include <com/sun/star/awt/Toolkit.hpp>
+#include <com/sun/star/awt/UnoControlDialog.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/view/XSelectionSupplier.hpp>
+
+
+using namespace ::com::sun::star::awt;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::view;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::beans;
+
+UnoDialog::UnoDialog( const Reference< XComponentContext > &rxContext, Reference< XFrame > const & rxFrame ) :
+ mxContext( rxContext ),
+ mxController( rxFrame->getController() ),
+ mxDialogModel( mxContext->getServiceManager()->createInstanceWithContext(
+ "com.sun.star.awt.UnoControlDialogModel", mxContext ), UNO_SET_THROW ),
+ mxDialogModelMultiPropertySet( mxDialogModel, UNO_QUERY_THROW ),
+ mxDialogModelMSF( mxDialogModel, UNO_QUERY_THROW ),
+ mxDialogModelNameContainer( mxDialogModel, UNO_QUERY_THROW ),
+ mxDialogModelNameAccess( mxDialogModel, UNO_QUERY_THROW ),
+ mxControlModel( mxDialogModel, UNO_QUERY_THROW ),
+ mxDialog( UnoControlDialog::create(rxContext) ),
+ mxControl( mxDialog, UNO_QUERY_THROW ),
+ mbStatus( false )
+{
+ mxControl->setModel( mxControlModel );
+
+ Reference< XFrame > xFrame( mxController->getFrame() );
+ Reference< XWindow > xContainerWindow( xFrame->getContainerWindow() );
+ Reference< XWindowPeer > xWindowPeer( xContainerWindow, UNO_QUERY_THROW );
+
+ // set the main loop handle to update GUI while busy
+ Reference< XToolkit > xToolkit( Toolkit::create( mxContext ), UNO_QUERY_THROW );
+ mxReschedule.set( xToolkit, UNO_QUERY );
+
+ // allocate the real window resources
+ mxDialog->createPeer(xToolkit,
+ xWindowPeer.is() ? xWindowPeer : xToolkit->getDesktopWindow());
+}
+
+UnoDialog::~UnoDialog()
+{
+ // free the resources
+ Reference<XComponent> xDialogComponent(mxDialog, UNO_QUERY_THROW);
+ xDialogComponent->dispose();
+}
+
+void UnoDialog::execute()
+{
+ mxDialog->setEnable( true );
+ mxDialog->setVisible( true );
+ mxDialog->execute();
+}
+
+void UnoDialog::endExecute( bool bStatus )
+{
+ mbStatus = bStatus;
+ mxDialog->endExecute();
+}
+
+Reference< XInterface > UnoDialog::insertControlModel( const OUString& rServiceName, const OUString& rName,
+ const Sequence< OUString >& rPropertyNames, const Sequence< Any >& rPropertyValues )
+{
+ Reference< XInterface > xControlModel;
+ try
+ {
+ xControlModel = mxDialogModelMSF->createInstance( rServiceName );
+ Reference< XMultiPropertySet > xMultiPropSet( xControlModel, UNO_QUERY_THROW );
+ xMultiPropSet->setPropertyValues( rPropertyNames, rPropertyValues );
+ mxDialogModelNameContainer->insertByName( rName, Any( xControlModel ) );
+ }
+ catch( Exception& )
+ {
+ }
+ return xControlModel;
+}
+
+
+void UnoDialog::setVisible( const OUString& rName, bool bVisible )
+{
+ try
+ {
+ Reference< XInterface > xControl( mxDialog->getControl( rName ), UNO_QUERY_THROW );
+ Reference< XWindow > xWindow( xControl, UNO_QUERY_THROW );
+ xWindow->setVisible( bVisible );
+ }
+ catch ( Exception& )
+ {
+ }
+}
+
+
+Reference< XButton > UnoDialog::insertButton( const OUString& rName, const Reference< XActionListener >& xActionListener,
+ const Sequence< OUString >& rPropertyNames, const Sequence< Any >& rPropertyValues )
+{
+ Reference< XButton > xButton;
+ try
+ {
+ Reference< XInterface > xButtonModel( insertControlModel( "com.sun.star.awt.UnoControlButtonModel",
+ rName, rPropertyNames, rPropertyValues ) );
+ Reference< XPropertySet > xPropertySet( xButtonModel, UNO_QUERY_THROW );
+ xPropertySet->setPropertyValue("Name", Any( rName ) );
+ xButton.set( mxDialog->getControl( rName ), UNO_QUERY_THROW );
+
+ if ( xActionListener.is() )
+ {
+ xButton->addActionListener( xActionListener );
+ xButton->setActionCommand( rName );
+ }
+ return xButton;
+ }
+ catch( Exception& )
+ {
+ }
+ return xButton;
+}
+
+
+Reference< XFixedText > UnoDialog::insertFixedText( const OUString& rName, const Sequence< OUString >& rPropertyNames, const Sequence< Any >& rPropertyValues )
+{
+ Reference< XFixedText > xFixedText;
+ try
+ {
+ Reference< XPropertySet > xPropertySet( insertControlModel( "com.sun.star.awt.UnoControlFixedTextModel",
+ rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
+ xPropertySet->setPropertyValue("Name", Any( rName ) );
+ xFixedText.set( mxDialog->getControl( rName ), UNO_QUERY_THROW );
+ }
+ catch ( Exception& )
+ {
+ }
+ return xFixedText;
+}
+
+
+Reference< XCheckBox > UnoDialog::insertCheckBox( const OUString& rName, const Sequence< OUString >& rPropertyNames, const Sequence< Any >& rPropertyValues )
+{
+ Reference< XCheckBox > xCheckBox;
+ try
+ {
+ Reference< XPropertySet > xPropertySet( insertControlModel( "com.sun.star.awt.UnoControlCheckBoxModel",
+ rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
+ xPropertySet->setPropertyValue("Name", Any( rName ) );
+ xCheckBox.set( mxDialog->getControl( rName ), UNO_QUERY_THROW );
+ }
+ catch ( Exception& )
+ {
+ }
+ return xCheckBox;
+}
+
+
+Reference< XControl > UnoDialog::insertFormattedField( const OUString& rName, const Sequence< OUString >& rPropertyNames, const Sequence< Any >& rPropertyValues )
+{
+ Reference< XControl > xControl;
+ try
+ {
+ Reference< XPropertySet > xPropertySet( insertControlModel( "com.sun.star.awt.UnoControlFormattedFieldModel",
+ rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
+ xPropertySet->setPropertyValue("Name", Any( rName ) );
+ xControl.set( mxDialog->getControl( rName ), UNO_SET_THROW );
+ }
+ catch ( Exception& )
+ {
+ }
+ return xControl;
+}
+
+
+Reference< XComboBox > UnoDialog::insertComboBox( const OUString& rName, const Sequence< OUString >& rPropertyNames, const Sequence< Any >& rPropertyValues )
+{
+ Reference< XComboBox > xControl;
+ try
+ {
+ Reference< XPropertySet > xPropertySet( insertControlModel( "com.sun.star.awt.UnoControlComboBoxModel",
+ rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
+ xPropertySet->setPropertyValue("Name", Any( rName ) );
+ xControl.set( mxDialog->getControl( rName ), UNO_QUERY_THROW );
+ }
+ catch ( Exception& )
+ {
+ }
+ return xControl;
+}
+
+
+Reference< XRadioButton > UnoDialog::insertRadioButton( const OUString& rName, const Sequence< OUString >& rPropertyNames, const Sequence< Any >& rPropertyValues )
+{
+ Reference< XRadioButton > xControl;
+ try
+ {
+ Reference< XPropertySet > xPropertySet( insertControlModel( "com.sun.star.awt.UnoControlRadioButtonModel",
+ rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
+ xPropertySet->setPropertyValue("Name", Any( rName ) );
+ xControl.set( mxDialog->getControl( rName ), UNO_QUERY_THROW );
+ }
+ catch ( Exception& )
+ {
+ }
+ return xControl;
+}
+
+
+Reference< XListBox > UnoDialog::insertListBox( const OUString& rName, const Sequence< OUString >& rPropertyNames, const Sequence< Any >& rPropertyValues )
+{
+ Reference< XListBox > xControl;
+ try
+ {
+ Reference< XPropertySet > xPropertySet( insertControlModel( "com.sun.star.awt.UnoControlListBoxModel",
+ rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
+ xPropertySet->setPropertyValue("Name", Any( rName ) );
+ xControl.set( mxDialog->getControl( rName ), UNO_QUERY_THROW );
+ }
+ catch ( Exception& )
+ {
+ }
+ return xControl;
+}
+
+
+Reference< XControl > UnoDialog::insertImage( const OUString& rName, const Sequence< OUString >& rPropertyNames, const Sequence< Any >& rPropertyValues )
+{
+ Reference< XControl > xControl;
+ try
+ {
+ Reference< XPropertySet > xPropertySet( insertControlModel( "com.sun.star.awt.UnoControlImageControlModel",
+ rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
+ xPropertySet->setPropertyValue("Name", Any( rName ) );
+ xControl.set( mxDialog->getControl( rName ), UNO_SET_THROW );
+ }
+ catch ( Exception& )
+ {
+ }
+ return xControl;
+}
+
+
+void UnoDialog::setControlProperty( const OUString& rControlName, const OUString& rPropertyName, const Any& rPropertyValue )
+{
+ try
+ {
+ if ( mxDialogModelNameAccess->hasByName( rControlName ) )
+ {
+ Reference< XPropertySet > xPropertySet( mxDialogModelNameAccess->getByName( rControlName ), UNO_QUERY_THROW );
+ xPropertySet->setPropertyValue( rPropertyName, rPropertyValue );
+ }
+ }
+ catch ( Exception& )
+ {
+ }
+}
+
+
+Any UnoDialog::getControlProperty( const OUString& rControlName, const OUString& rPropertyName )
+{
+ Any aRet;
+ try
+ {
+ if ( mxDialogModelNameAccess->hasByName( rControlName ) )
+ {
+ Reference< XPropertySet > xPropertySet( mxDialogModelNameAccess->getByName( rControlName ), UNO_QUERY_THROW );
+ aRet = xPropertySet->getPropertyValue( rPropertyName );
+ }
+ }
+ catch ( Exception& )
+ {
+ }
+ return aRet;
+}
+
+
+void UnoDialog::enableControl( const OUString& rControlName )
+{
+ setControlProperty( rControlName, "Enabled", Any( true ) );
+}
+
+
+void UnoDialog::disableControl( const OUString& rControlName )
+{
+ setControlProperty( rControlName, "Enabled", Any( false ) );
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/minimizer/unodialog.hxx b/sdext/source/minimizer/unodialog.hxx
new file mode 100644
index 000000000..3bf908cf1
--- /dev/null
+++ b/sdext/source/minimizer/unodialog.hxx
@@ -0,0 +1,118 @@
+/* -*- 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_SDEXT_SOURCE_MINIMIZER_UNODIALOG_HXX
+#define INCLUDED_SDEXT_SOURCE_MINIMIZER_UNODIALOG_HXX
+
+#include <com/sun/star/uno/Sequence.h>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/frame/XFrame.hpp>
+#include <com/sun/star/beans/XMultiPropertySet.hpp>
+#include <com/sun/star/awt/XControl.hpp>
+#include <com/sun/star/awt/XControlModel.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/awt/XActionListener.hpp>
+#include <com/sun/star/awt/XButton.hpp>
+#include <com/sun/star/awt/XCheckBox.hpp>
+#include <com/sun/star/awt/XComboBox.hpp>
+#include <com/sun/star/awt/XRadioButton.hpp>
+#include <com/sun/star/awt/XListBox.hpp>
+#include <com/sun/star/awt/XFixedText.hpp>
+#include <com/sun/star/awt/XUnoControlDialog.hpp>
+#include <com/sun/star/awt/XReschedule.hpp>
+
+
+class UnoDialog
+{
+public:
+
+ UnoDialog( const css::uno::Reference< css::uno::XComponentContext >& rxMSF, css::uno::Reference< css::frame::XFrame > const & rxFrame );
+ ~UnoDialog();
+
+ void execute();
+ void endExecute( bool bStatus );
+
+ css::uno::Reference< css::uno::XInterface > insertControlModel( const OUString& rServiceName, const OUString& rName,
+ const css::uno::Sequence< OUString >& rPropertyNames, const css::uno::Sequence< css::uno::Any >& rPropertyValues );
+
+ void setVisible( const OUString& rName, bool bVisible );
+
+ css::uno::Reference< css::awt::XButton > insertButton( const OUString& rName,
+ const css::uno::Reference< css::awt::XActionListener >& xActionListener, const css::uno::Sequence< OUString >& rPropertyNames,
+ const css::uno::Sequence< css::uno::Any >& rPropertyValues );
+
+ css::uno::Reference< css::awt::XFixedText > insertFixedText( const OUString& rName,
+ const css::uno::Sequence< OUString >& rPropertyNames, const css::uno::Sequence< css::uno::Any >& rPropertyValues );
+
+ css::uno::Reference< css::awt::XCheckBox > insertCheckBox( const OUString& rName,
+ const css::uno::Sequence< OUString >& rPropertyNames, const css::uno::Sequence< css::uno::Any >& rPropertyValues );
+
+ css::uno::Reference< css::awt::XControl > insertFormattedField( const OUString& rName,
+ const css::uno::Sequence< OUString >& rPropertyNames, const css::uno::Sequence< css::uno::Any >& rPropertyValues );
+
+ css::uno::Reference< css::awt::XComboBox > insertComboBox( const OUString& rName,
+ const css::uno::Sequence< OUString >& rPropertyNames, const css::uno::Sequence< css::uno::Any >& rPropertyValues );
+
+ css::uno::Reference< css::awt::XRadioButton > insertRadioButton( const OUString& rName,
+ const css::uno::Sequence< OUString >& rPropertyNames, const css::uno::Sequence< css::uno::Any >& rPropertyValues );
+
+ css::uno::Reference< css::awt::XListBox > insertListBox( const OUString& rName,
+ const css::uno::Sequence< OUString >& rPropertyNames, const css::uno::Sequence< css::uno::Any >& rPropertyValues );
+
+ css::uno::Reference< css::awt::XControl > insertImage( const OUString& rName,
+ const css::uno::Sequence< OUString >& rPropertyNames, const css::uno::Sequence< css::uno::Any >& rPropertyValues );
+
+ void setControlProperty( const OUString& rControlName, const OUString& rPropertyName, const css::uno::Any& rPropertyValue );
+ css::uno::Any getControlProperty( const OUString& rControlName, const OUString& rPropertyName );
+
+ void enableControl( const OUString& rControlName );
+ void disableControl( const OUString& rControlName );
+
+ void reschedule() const { mxReschedule->reschedule(); }
+ bool endStatus() const { return mbStatus; }
+ css::uno::Reference<css::awt::XControl> getControl(const OUString& rControlName) const { return mxDialog->getControl(rControlName); }
+ const css::uno::Reference<css::frame::XController>& controller() const { return mxController; }
+ void setPropertyValues(const css::uno::Sequence<OUString>& rNameSeq, const css::uno::Sequence<css::uno::Any>& rValueSeq)
+ { mxDialogModelMultiPropertySet->setPropertyValues(rNameSeq, rValueSeq); }
+
+protected:
+ css::uno::Reference< css::uno::XComponentContext > mxContext;
+ css::uno::Reference< css::frame::XController > mxController;
+
+private:
+ css::uno::Reference< css::awt::XReschedule > mxReschedule;
+ css::uno::Reference< css::uno::XInterface > mxDialogModel;
+ css::uno::Reference< css::beans::XMultiPropertySet > mxDialogModelMultiPropertySet;
+ css::uno::Reference< css::lang::XMultiServiceFactory > mxDialogModelMSF;
+ css::uno::Reference< css::container::XNameContainer > mxDialogModelNameContainer;
+ css::uno::Reference< css::container::XNameAccess > mxDialogModelNameAccess;
+
+ css::uno::Reference< css::awt::XControlModel > mxControlModel;
+
+ css::uno::Reference< css::awt::XUnoControlDialog > mxDialog;
+ css::uno::Reference< css::awt::XControl > mxControl;
+ bool mbStatus;
+};
+
+#endif // INCLUDED_SDEXT_SOURCE_MINIMIZER_UNODIALOG_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/config/pdf_import_filter.xcu b/sdext/source/pdfimport/config/pdf_import_filter.xcu
new file mode 100644
index 000000000..3909f9fc1
--- /dev/null
+++ b/sdext/source/pdfimport/config/pdf_import_filter.xcu
@@ -0,0 +1,216 @@
+<?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 .
+ -->
+<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:name="Filter" oor:package="org.openoffice.TypeDetection">
+ <node oor:name="Filters">
+ <node oor:name="draw_pdf_import" oor:type="xs:string" oor:op="replace">
+ <prop oor:name="DocumentService">
+ <value>com.sun.star.drawing.DrawingDocument</value>
+ </prop>
+ <prop oor:name="FileFormatVersion" oor:type="xs:int">
+ <value>0</value>
+ </prop>
+ <prop oor:name="FilterService" oor:type="xs:string">
+ <!-- stacks filters for XML import. see UserData below.
+ the _Writer_ in the impl name is a misnomer -->
+ <value>com.sun.star.comp.Writer.XmlFilterAdaptor</value>
+ </prop>
+ <prop oor:name="Flags" oor:type="oor:string-list">
+ <value>3RDPARTYFILTER ALIEN IMPORT PREFERRED SUPPORTSSIGNING</value>
+ </prop>
+ <prop oor:name="Type" oor:type="xs:string">
+ <value>pdf_Portable_Document_Format</value>
+ </prop>
+ <prop oor:name="UIName">
+ <value xml:lang="x-default">PDF - Portable Document Format (Draw)</value>
+ </prop>
+ <prop oor:name="TemplateName"/>
+ <prop oor:name="UIComponent"/>
+ <prop oor:name="UserData" oor:type="oor:string-list">
+ <!-- converter service, ,import service,export service, , ,bool for pretty printing on or off -->
+ <value oor:separator=",">org.libreoffice.comp.documents.DrawPDFImport,,com.sun.star.comp.Draw.XMLOasisImporter,,,,true</value>
+ </prop>
+ </node>
+
+ <node oor:name="impress_pdf_import" oor:type="xs:string" oor:op="replace">
+ <prop oor:name="DocumentService">
+ <value>com.sun.star.presentation.PresentationDocument</value>
+ </prop>
+ <prop oor:name="FileFormatVersion" oor:type="xs:int">
+ <value>0</value>
+ </prop>
+ <prop oor:name="FilterService" oor:type="xs:string">
+ <!-- stacks filters for XML import. see UserData below.
+ the _Writer_ in the impl name is a misnomer -->
+ <value>com.sun.star.comp.Writer.XmlFilterAdaptor</value>
+ </prop>
+ <prop oor:name="Flags" oor:type="oor:string-list">
+ <value>3RDPARTYFILTER ALIEN IMPORT PREFERRED</value>
+ </prop>
+ <prop oor:name="Type" oor:type="xs:string">
+ <value>pdf_Portable_Document_Format</value>
+ </prop>
+ <prop oor:name="UIName">
+ <value xml:lang="x-default">PDF - Portable Document Format (Impress)</value>
+ </prop>
+ <prop oor:name="TemplateName"/>
+ <prop oor:name="UIComponent"/>
+ <prop oor:name="UserData" oor:type="oor:string-list">
+ <!-- converter service, ,import service,export service, , ,bool for pretty printing on or off -->
+ <value oor:separator=",">org.libreoffice.comp.documents.ImpressPDFImport,,com.sun.star.comp.Impress.XMLOasisImporter,,,,true</value>
+ </prop>
+ </node>
+
+ <node oor:name="writer_pdf_import" oor:type="xs:string" oor:op="replace">
+ <prop oor:name="DocumentService">
+ <value>com.sun.star.text.TextDocument</value>
+ </prop>
+ <prop oor:name="FileFormatVersion" oor:type="xs:int">
+ <value>0</value>
+ </prop>
+ <prop oor:name="FilterService" oor:type="xs:string">
+ <!-- stacks filters for XML import. see UserData below.
+ the _Writer_ in the impl name is a misnomer -->
+ <value>com.sun.star.comp.Writer.XmlFilterAdaptor</value>
+ </prop>
+ <prop oor:name="Flags" oor:type="oor:string-list">
+ <value>3RDPARTYFILTER ALIEN IMPORT PREFERRED</value>
+ </prop>
+ <prop oor:name="Type" oor:type="xs:string">
+ <value>pdf_Portable_Document_Format</value>
+ </prop>
+ <prop oor:name="UIName">
+ <value xml:lang="x-default">PDF - Portable Document Format (Writer)</value>
+ </prop>
+ <prop oor:name="TemplateName"/>
+ <prop oor:name="UIComponent"/>
+ <prop oor:name="UserData" oor:type="oor:string-list">
+ <!-- converter service, ,import service,export service, , ,bool for pretty printing on or off -->
+ <value oor:separator=",">org.libreoffice.comp.documents.WriterPDFImport,,com.sun.star.comp.Writer.XMLOasisImporter,,,,true</value>
+ </prop>
+ </node>
+
+ <node oor:name="writer_pdf_addstream_import" oor:op="replace">
+ <prop oor:name="DocumentService" oor:type="xs:string">
+ <value>com.sun.star.text.TextDocument</value>
+ </prop>
+ <prop oor:name="FileFormatVersion" oor:type="xs:int">
+ <value>0</value>
+ </prop>
+ <prop oor:name="FilterService" oor:type="xs:string">
+ <value>org.libreoffice.comp.documents.HybridPDFImport</value>
+ </prop>
+ <prop oor:name="Flags" oor:type="oor:string-list">
+ <value>3RDPARTYFILTER ALIEN IMPORT NOTINFILEDIALOG</value>
+ </prop>
+ <prop oor:name="TemplateName" oor:type="xs:string">
+ <value/>
+ </prop>
+ <prop oor:name="Type" oor:type="xs:string">
+ <value>pdf_Portable_Document_Format</value>
+ </prop>
+ <prop oor:name="UIComponent" oor:type="xs:string">
+ <value/>
+ </prop>
+ <prop oor:name="UIName">
+ <value xml:lang="x-default">PDF - Portable Document Format</value>
+ </prop>
+ </node>
+
+ <node oor:name="impress_pdf_addstream_import" oor:op="replace">
+ <prop oor:name="DocumentService" oor:type="xs:string">
+ <value>com.sun.star.presentation.PresentationDocument</value>
+ </prop>
+ <prop oor:name="FileFormatVersion" oor:type="xs:int">
+ <value>0</value>
+ </prop>
+ <prop oor:name="FilterService" oor:type="xs:string">
+ <value>org.libreoffice.comp.documents.HybridPDFImport</value>
+ </prop>
+ <prop oor:name="Flags" oor:type="oor:string-list">
+ <value>3RDPARTYFILTER ALIEN IMPORT NOTINFILEDIALOG NOTINCHOOSER</value>
+ </prop>
+ <prop oor:name="TemplateName" oor:type="xs:string">
+ <value/>
+ </prop>
+ <prop oor:name="Type" oor:type="xs:string">
+ <value>pdf_Portable_Document_Format</value>
+ </prop>
+ <prop oor:name="UIComponent" oor:type="xs:string">
+ <value/>
+ </prop>
+ <prop oor:name="UIName">
+ <value xml:lang="x-default">PDF - Portable Document Format</value>
+ </prop>
+ </node>
+
+ <node oor:name="draw_pdf_addstream_import" oor:op="replace">
+ <prop oor:name="DocumentService" oor:type="xs:string">
+ <value>com.sun.star.drawing.DrawingDocument</value>
+ </prop>
+ <prop oor:name="FileFormatVersion" oor:type="xs:int">
+ <value>0</value>
+ </prop>
+ <prop oor:name="FilterService" oor:type="xs:string">
+ <value>org.libreoffice.comp.documents.HybridPDFImport</value>
+ </prop>
+ <prop oor:name="Flags" oor:type="oor:string-list">
+ <value>3RDPARTYFILTER ALIEN IMPORT NOTINFILEDIALOG NOTINCHOOSER</value>
+ </prop>
+ <prop oor:name="TemplateName" oor:type="xs:string">
+ <value/>
+ </prop>
+ <prop oor:name="Type" oor:type="xs:string">
+ <value>pdf_Portable_Document_Format</value>
+ </prop>
+ <prop oor:name="UIComponent" oor:type="xs:string">
+ <value/>
+ </prop>
+ <prop oor:name="UIName">
+ <value xml:lang="x-default">PDF - Portable Document Format</value>
+ </prop>
+ </node>
+
+ <node oor:name="calc_pdf_addstream_import" oor:op="replace">
+ <prop oor:name="DocumentService" oor:type="xs:string">
+ <value>com.sun.star.sheet.SpreadsheetDocument</value>
+ </prop>
+ <prop oor:name="FileFormatVersion" oor:type="xs:int">
+ <value>0</value>
+ </prop>
+ <prop oor:name="FilterService" oor:type="xs:string">
+ <value>org.libreoffice.comp.documents.HybridPDFImport</value>
+ </prop>
+ <prop oor:name="Flags" oor:type="oor:string-list">
+ <value>3RDPARTYFILTER ALIEN IMPORT NOTINFILEDIALOG NOTINCHOOSER</value>
+ </prop>
+ <prop oor:name="TemplateName" oor:type="xs:string">
+ <value/>
+ </prop>
+ <prop oor:name="Type" oor:type="xs:string">
+ <value>pdf_Portable_Document_Format</value>
+ </prop>
+ <prop oor:name="UIComponent" oor:type="xs:string">
+ <value/>
+ </prop>
+ <prop oor:name="UIName">
+ <value xml:lang="x-default">PDF - Portable Document Format</value>
+ </prop>
+ </node>
+ </node>
+</oor:component-data>
diff --git a/sdext/source/pdfimport/config/pdf_types.xcu b/sdext/source/pdfimport/config/pdf_types.xcu
new file mode 100644
index 000000000..d8128741e
--- /dev/null
+++ b/sdext/source/pdfimport/config/pdf_types.xcu
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE oor:component-data SYSTEM "../../../../officecfg/registry/component-update.dtd">
+<!--
+ * 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 .
+ -->
+<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:package="org.openoffice.TypeDetection" oor:name="Types">
+ <node oor:name="Types">
+ <node oor:name="pdf_Portable_Document_Format" oor:op="replace" >
+ <prop oor:name="DetectService"><value>org.libreoffice.comp.documents.PDFDetector</value></prop>
+ <prop oor:name="URLPattern"/>
+ <prop oor:name="Extensions"><value>pdf</value></prop>
+ <prop oor:name="MediaType"><value>application/pdf</value></prop>
+ <prop oor:name="Preferred"><value>true</value></prop>
+ <prop oor:name="PreferredFilter"><value>draw_pdf_import</value></prop>
+ <prop oor:name="UIName">
+ <value>PDF - Portable Document Format (Draw)</value>
+ </prop>
+ <prop oor:name="ClipboardFormat"/>
+ </node>
+ </node>
+</oor:component-data>
diff --git a/sdext/source/pdfimport/dialogs/xpdfimport_err.pdf b/sdext/source/pdfimport/dialogs/xpdfimport_err.pdf
new file mode 100644
index 000000000..dc0f9292c
--- /dev/null
+++ b/sdext/source/pdfimport/dialogs/xpdfimport_err.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/filterdet.cxx b/sdext/source/pdfimport/filterdet.cxx
new file mode 100644
index 000000000..18751a004
--- /dev/null
+++ b/sdext/source/pdfimport/filterdet.cxx
@@ -0,0 +1,610 @@
+/* -*- 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 "filterdet.hxx"
+#include "inc/pdfihelper.hxx"
+#include "inc/pdfparse.hxx"
+
+#include <osl/file.h>
+#include <osl/thread.h>
+#include <rtl/digest.h>
+#include <sal/log.hxx>
+#include <com/sun/star/io/IOException.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
+#include <com/sun/star/io/XStream.hpp>
+#include <com/sun/star/io/XSeekable.hpp>
+#include <com/sun/star/io/TempFile.hpp>
+#include <com/sun/star/task/XInteractionHandler.hpp>
+#include <comphelper/fileurl.hxx>
+#include <comphelper/hash.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <tools/diagnose_ex.h>
+#include <memory>
+#include <string.h>
+
+using namespace com::sun::star;
+
+namespace pdfi
+{
+
+// TODO(T3): locking/thread safety
+
+namespace {
+
+class FileEmitContext : public pdfparse::EmitContext
+{
+private:
+ oslFileHandle m_aReadHandle;
+ unsigned int m_nReadLen;
+ uno::Reference< io::XStream > m_xContextStream;
+ uno::Reference< io::XSeekable > m_xSeek;
+ uno::Reference< io::XOutputStream > m_xOut;
+
+public:
+ FileEmitContext( const OUString& rOrigFile,
+ const uno::Reference< uno::XComponentContext >& xContext,
+ const pdfparse::PDFContainer* pTop );
+ virtual ~FileEmitContext() override;
+
+ virtual bool write( const void* pBuf, unsigned int nLen ) override;
+ virtual unsigned int getCurPos() override;
+ virtual bool copyOrigBytes( unsigned int nOrigOffset, unsigned int nLen ) override;
+ virtual unsigned int readOrigBytes( unsigned int nOrigOffset, unsigned int nLen, void* pBuf ) override;
+
+ const uno::Reference< io::XStream >& getContextStream() const { return m_xContextStream; }
+};
+
+}
+
+FileEmitContext::FileEmitContext( const OUString& rOrigFile,
+ const uno::Reference< uno::XComponentContext >& xContext,
+ const pdfparse::PDFContainer* pTop ) :
+ pdfparse::EmitContext( pTop ),
+ m_aReadHandle(nullptr),
+ m_nReadLen(0)
+{
+ m_xContextStream.set( io::TempFile::create(xContext), uno::UNO_QUERY_THROW );
+ m_xOut = m_xContextStream->getOutputStream();
+ m_xSeek.set(m_xOut, uno::UNO_QUERY_THROW );
+
+ if( osl_openFile( rOrigFile.pData,
+ &m_aReadHandle,
+ osl_File_OpenFlag_Read ) == osl_File_E_None )
+ {
+ oslFileError aErr = osl_setFilePos( m_aReadHandle, osl_Pos_End, 0 );
+ if( aErr == osl_File_E_None )
+ {
+ sal_uInt64 nFileSize = 0;
+ if( (aErr=osl_getFilePos( m_aReadHandle,
+ &nFileSize )) == osl_File_E_None )
+ {
+ m_nReadLen = static_cast<unsigned int>(nFileSize);
+ }
+ }
+ if( aErr != osl_File_E_None )
+ {
+ osl_closeFile( m_aReadHandle );
+ m_aReadHandle = nullptr;
+ }
+ }
+ m_bDeflate = true;
+}
+
+FileEmitContext::~FileEmitContext()
+{
+ if( m_aReadHandle )
+ osl_closeFile( m_aReadHandle );
+}
+
+bool FileEmitContext::write( const void* pBuf, unsigned int nLen )
+{
+ if( ! m_xOut.is() )
+ return false;
+
+ uno::Sequence< sal_Int8 > aSeq( nLen );
+ memcpy( aSeq.getArray(), pBuf, nLen );
+ m_xOut->writeBytes( aSeq );
+ return true;
+}
+
+unsigned int FileEmitContext::getCurPos()
+{
+ unsigned int nPos = 0;
+ if( m_xSeek.is() )
+ {
+ nPos = static_cast<unsigned int>( m_xSeek->getPosition() );
+ }
+ return nPos;
+}
+
+bool FileEmitContext::copyOrigBytes( unsigned int nOrigOffset, unsigned int nLen )
+{
+ if( nOrigOffset + nLen > m_nReadLen )
+ return false;
+
+ if( osl_setFilePos( m_aReadHandle, osl_Pos_Absolut, nOrigOffset ) != osl_File_E_None )
+ return false;
+
+ uno::Sequence< sal_Int8 > aSeq( nLen );
+
+ sal_uInt64 nBytesRead = 0;
+ if( osl_readFile( m_aReadHandle,
+ aSeq.getArray(),
+ nLen,
+ &nBytesRead ) != osl_File_E_None
+ || nBytesRead != static_cast<sal_uInt64>(nLen) )
+ {
+ return false;
+ }
+
+ m_xOut->writeBytes( aSeq );
+ return true;
+}
+
+unsigned int FileEmitContext::readOrigBytes( unsigned int nOrigOffset, unsigned int nLen, void* pBuf )
+{
+ if( nOrigOffset + nLen > m_nReadLen )
+ return 0;
+
+ if( osl_setFilePos( m_aReadHandle,
+ osl_Pos_Absolut,
+ nOrigOffset ) != osl_File_E_None )
+ {
+ return 0;
+ }
+
+ sal_uInt64 nBytesRead = 0;
+ if( osl_readFile( m_aReadHandle,
+ pBuf,
+ nLen,
+ &nBytesRead ) != osl_File_E_None )
+ {
+ return 0;
+ }
+ return static_cast<unsigned int>(nBytesRead);
+}
+
+
+PDFDetector::PDFDetector( const uno::Reference< uno::XComponentContext >& xContext) :
+ PDFDetectorBase( m_aMutex ),
+ m_xContext( xContext )
+{}
+
+// XExtendedFilterDetection
+OUString SAL_CALL PDFDetector::detect( uno::Sequence< beans::PropertyValue >& rFilterData )
+{
+ osl::MutexGuard const guard( m_aMutex );
+ bool bSuccess = false;
+
+ // get the InputStream carrying the PDF content
+ uno::Reference< io::XInputStream > xInput;
+ uno::Reference< io::XStream > xEmbedStream;
+ OUString aOutFilterName, aOutTypeName;
+ OUString aURL;
+ OUString aPwd;
+ const beans::PropertyValue* pAttribs = rFilterData.getConstArray();
+ sal_Int32 nAttribs = rFilterData.getLength();
+ sal_Int32 nFilterNamePos = -1;
+ sal_Int32 nPwdPos = -1;
+ for( sal_Int32 i = 0; i < nAttribs; i++ )
+ {
+ OUString aVal( "<no string>" );
+ pAttribs[i].Value >>= aVal;
+ SAL_INFO( "sdext.pdfimport", "doDetection: Attrib: " + pAttribs[i].Name + " = " + aVal);
+
+ if ( pAttribs[i].Name == "InputStream" )
+ pAttribs[i].Value >>= xInput;
+ else if ( pAttribs[i].Name == "URL" )
+ pAttribs[i].Value >>= aURL;
+ else if ( pAttribs[i].Name == "FilterName" )
+ nFilterNamePos = i;
+ else if ( pAttribs[i].Name == "Password" )
+ {
+ nPwdPos = i;
+ pAttribs[i].Value >>= aPwd;
+ }
+ }
+ if( xInput.is() )
+ {
+ oslFileHandle aFile = nullptr;
+ try {
+ uno::Reference< io::XSeekable > xSeek( xInput, uno::UNO_QUERY );
+ if( xSeek.is() )
+ xSeek->seek( 0 );
+ // read the first 1024 byte (see PDF reference implementation note 12)
+ const sal_Int32 nHeaderSize = 1024;
+ uno::Sequence< sal_Int8 > aBuf( nHeaderSize );
+ sal_uInt64 nBytes = xInput->readBytes( aBuf, nHeaderSize );
+ if( nBytes > 5 )
+ {
+ const sal_Int8* pBytes = aBuf.getConstArray();
+ for( sal_uInt64 i = 0; i < nBytes-5; i++ )
+ {
+ if( pBytes[i] == '%' &&
+ pBytes[i+1] == 'P' &&
+ pBytes[i+2] == 'D' &&
+ pBytes[i+3] == 'F' &&
+ pBytes[i+4] == '-' )
+ {
+ bSuccess = true;
+ break;
+ }
+ }
+ }
+
+ // check for hybrid PDF
+ if( bSuccess &&
+ ( aURL.isEmpty() || !comphelper::isFileUrl(aURL) )
+ )
+ {
+ sal_uInt64 nWritten = 0;
+ if( osl_createTempFile( nullptr, &aFile, &aURL.pData ) != osl_File_E_None )
+ {
+ bSuccess = false;
+ }
+ else
+ {
+ SAL_INFO( "sdext.pdfimport", "created temp file " + aURL );
+
+ osl_writeFile( aFile, aBuf.getConstArray(), nBytes, &nWritten );
+
+ SAL_WARN_IF( nWritten != nBytes, "sdext.pdfimport", "writing of header bytes failed" );
+
+ if( nWritten == nBytes )
+ {
+ const sal_uInt32 nBufSize = 4096;
+ aBuf = uno::Sequence<sal_Int8>(nBufSize);
+ // copy the bytes
+ do
+ {
+ nBytes = xInput->readBytes( aBuf, nBufSize );
+ if( nBytes > 0 )
+ {
+ osl_writeFile( aFile, aBuf.getConstArray(), nBytes, &nWritten );
+ if( nWritten != nBytes )
+ {
+ bSuccess = false;
+ break;
+ }
+ }
+ } while( nBytes == nBufSize );
+ }
+ }
+ osl_closeFile( aFile );
+ }
+ } catch (const css::io::IOException &) {
+ TOOLS_WARN_EXCEPTION("sdext.pdfimport", "caught");
+ return OUString();
+ }
+ OUString aEmbedMimetype;
+ xEmbedStream = getAdditionalStream( aURL, aEmbedMimetype, aPwd, m_xContext, rFilterData, false );
+ if( aFile )
+ osl_removeFile( aURL.pData );
+ if( !aEmbedMimetype.isEmpty() )
+ {
+ if( aEmbedMimetype == "application/vnd.oasis.opendocument.text"
+ || aEmbedMimetype == "application/vnd.oasis.opendocument.text-master" )
+ aOutFilterName = "writer_pdf_addstream_import";
+ else if ( aEmbedMimetype == "application/vnd.oasis.opendocument.presentation" )
+ aOutFilterName = "impress_pdf_addstream_import";
+ else if( aEmbedMimetype == "application/vnd.oasis.opendocument.graphics"
+ || aEmbedMimetype == "application/vnd.oasis.opendocument.drawing" )
+ aOutFilterName = "draw_pdf_addstream_import";
+ else if ( aEmbedMimetype == "application/vnd.oasis.opendocument.spreadsheet" )
+ aOutFilterName = "calc_pdf_addstream_import";
+ }
+ }
+
+ if( bSuccess )
+ {
+ if( !aOutFilterName.isEmpty() )
+ {
+ if( nFilterNamePos == -1 )
+ {
+ nFilterNamePos = nAttribs;
+ rFilterData.realloc( ++nAttribs );
+ rFilterData.getArray()[ nFilterNamePos ].Name = "FilterName";
+ }
+ auto pFilterData = rFilterData.getArray();
+ aOutTypeName = "pdf_Portable_Document_Format";
+
+ pFilterData[nFilterNamePos].Value <<= aOutFilterName;
+ if( xEmbedStream.is() )
+ {
+ rFilterData.realloc( ++nAttribs );
+ pFilterData = rFilterData.getArray();
+ pFilterData[nAttribs-1].Name = "EmbeddedSubstream";
+ pFilterData[nAttribs-1].Value <<= xEmbedStream;
+ }
+ if( !aPwd.isEmpty() )
+ {
+ if( nPwdPos == -1 )
+ {
+ nPwdPos = nAttribs;
+ rFilterData.realloc( ++nAttribs );
+ pFilterData = rFilterData.getArray();
+ pFilterData[ nPwdPos ].Name = "Password";
+ }
+ pFilterData[ nPwdPos ].Value <<= aPwd;
+ }
+ }
+ else
+ {
+ css::beans::PropertyValue* pFilterData;
+ if( nFilterNamePos == -1 )
+ {
+ nFilterNamePos = nAttribs;
+ rFilterData.realloc( ++nAttribs );
+ pFilterData = rFilterData.getArray();
+ pFilterData[ nFilterNamePos ].Name = "FilterName";
+ }
+ else
+ pFilterData = rFilterData.getArray();
+
+ const sal_Int32 nDocumentType = 0; //const sal_Int32 nDocumentType = queryDocumentTypeDialog(m_xContext,aURL);
+ if( nDocumentType < 0 )
+ {
+ return OUString();
+ }
+ else switch( nDocumentType )
+ {
+ case 0:
+ pFilterData[nFilterNamePos].Value <<= OUString( "draw_pdf_import" );
+ break;
+
+ case 1:
+ pFilterData[nFilterNamePos].Value <<= OUString( "impress_pdf_import" );
+ break;
+
+ case 2:
+ pFilterData[nFilterNamePos].Value <<= OUString( "writer_pdf_import" );
+ break;
+
+ default:
+ assert(!"Unexpected case");
+ }
+
+ aOutTypeName = "pdf_Portable_Document_Format";
+ }
+ }
+
+ return aOutTypeName;
+}
+
+OUString PDFDetector::getImplementationName()
+{
+ return "org.libreoffice.comp.documents.PDFDetector";
+}
+
+sal_Bool PDFDetector::supportsService(OUString const & ServiceName)
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+css::uno::Sequence<OUString> PDFDetector::getSupportedServiceNames()
+{
+ return {"com.sun.star.document.ImportFilter"};
+}
+
+bool checkDocChecksum( const OUString& rInPDFFileURL,
+ sal_uInt32 nBytes,
+ const OUString& rChkSum )
+{
+ if( rChkSum.getLength() != 2* RTL_DIGEST_LENGTH_MD5 )
+ {
+ SAL_INFO(
+ "sdext.pdfimport",
+ "checksum of length " << rChkSum.getLength() << ", expected "
+ << 2*RTL_DIGEST_LENGTH_MD5);
+ return false;
+ }
+
+ // prepare checksum to test
+ sal_uInt8 nTestChecksum[ RTL_DIGEST_LENGTH_MD5 ];
+ const sal_Unicode* pChar = rChkSum.getStr();
+ for(sal_uInt8 & rn : nTestChecksum)
+ {
+ sal_uInt8 nByte = sal_uInt8( ( (*pChar >= '0' && *pChar <= '9') ? *pChar - '0' :
+ ( (*pChar >= 'A' && *pChar <= 'F') ? *pChar - 'A' + 10 :
+ ( (*pChar >= 'a' && *pChar <= 'f') ? *pChar - 'a' + 10 :
+ 0 ) ) ) );
+ nByte <<= 4;
+ pChar++;
+ nByte |= ( (*pChar >= '0' && *pChar <= '9') ? *pChar - '0' :
+ ( (*pChar >= 'A' && *pChar <= 'F') ? *pChar - 'A' + 10 :
+ ( (*pChar >= 'a' && *pChar <= 'f') ? *pChar - 'a' + 10 :
+ 0 ) ) );
+ pChar++;
+ rn = nByte;
+ }
+
+ // open file and calculate actual checksum up to index nBytes
+ ::std::vector<unsigned char> nChecksum;
+ ::comphelper::Hash aDigest(::comphelper::HashType::MD5);
+ oslFileHandle aRead = nullptr;
+ if( osl_openFile(rInPDFFileURL.pData,
+ &aRead,
+ osl_File_OpenFlag_Read ) == osl_File_E_None )
+ {
+ sal_uInt8 aBuf[4096];
+ sal_uInt32 nCur = 0;
+ sal_uInt64 nBytesRead = 0;
+ while( nCur < nBytes )
+ {
+ sal_uInt32 nPass = std::min<sal_uInt32>(nBytes - nCur, sizeof( aBuf ));
+ if( osl_readFile( aRead, aBuf, nPass, &nBytesRead) != osl_File_E_None
+ || nBytesRead == 0 )
+ {
+ break;
+ }
+ nPass = static_cast<sal_uInt32>(nBytesRead);
+ nCur += nPass;
+ aDigest.update(aBuf, nPass);
+ }
+
+ nChecksum = aDigest.finalize();
+ osl_closeFile( aRead );
+ }
+
+ // compare the contents
+ return nChecksum.size() == RTL_DIGEST_LENGTH_MD5
+ && (0 == memcmp(nChecksum.data(), nTestChecksum, nChecksum.size()));
+}
+
+uno::Reference< io::XStream > getAdditionalStream( const OUString& rInPDFFileURL,
+ OUString& rOutMimetype,
+ OUString& io_rPwd,
+ const uno::Reference<uno::XComponentContext>& xContext,
+ const uno::Sequence<beans::PropertyValue>& rFilterData,
+ bool bMayUseUI )
+{
+ uno::Reference< io::XStream > xEmbed;
+ OString aPDFFile;
+ OUString aSysUPath;
+ if( osl_getSystemPathFromFileURL( rInPDFFileURL.pData, &aSysUPath.pData ) != osl_File_E_None )
+ return xEmbed;
+ aPDFFile = OUStringToOString( aSysUPath, osl_getThreadTextEncoding() );
+
+ std::unique_ptr<pdfparse::PDFEntry> pEntry( pdfparse::PDFReader::read( aPDFFile.getStr() ));
+ if( pEntry )
+ {
+ pdfparse::PDFFile* pPDFFile = dynamic_cast<pdfparse::PDFFile*>(pEntry.get());
+ if( pPDFFile )
+ {
+ unsigned int nElements = pPDFFile->m_aSubElements.size();
+ while( nElements-- > 0 )
+ {
+ pdfparse::PDFTrailer* pTrailer = dynamic_cast<pdfparse::PDFTrailer*>(pPDFFile->m_aSubElements[nElements].get());
+ if( pTrailer && pTrailer->m_pDict )
+ {
+ // search document checksum entry
+ auto chk = pTrailer->m_pDict->m_aMap.find( "DocChecksum" );
+ if( chk == pTrailer->m_pDict->m_aMap.end() )
+ {
+ SAL_INFO( "sdext.pdfimport", "no DocChecksum entry" );
+ continue;
+ }
+ pdfparse::PDFName* pChkSumName = dynamic_cast<pdfparse::PDFName*>(chk->second);
+ if( pChkSumName == nullptr )
+ {
+ SAL_INFO( "sdext.pdfimport", "no name for DocChecksum entry" );
+ continue;
+ }
+
+ // search for AdditionalStreams entry
+ auto add_stream = pTrailer->m_pDict->m_aMap.find( "AdditionalStreams" );
+ if( add_stream == pTrailer->m_pDict->m_aMap.end() )
+ {
+ SAL_INFO( "sdext.pdfimport", "no AdditionalStreams entry" );
+ continue;
+ }
+ pdfparse::PDFArray* pStreams = dynamic_cast<pdfparse::PDFArray*>(add_stream->second);
+ if( ! pStreams || pStreams->m_aSubElements.size() < 2 )
+ {
+ SAL_INFO( "sdext.pdfimport", "AdditionalStreams array too small" );
+ continue;
+ }
+
+ // check checksum
+ OUString aChkSum = pChkSumName->getFilteredName();
+ if( ! checkDocChecksum( rInPDFFileURL, pTrailer->m_nOffset, aChkSum ) )
+ continue;
+
+ // extract addstream and mimetype
+ pdfparse::PDFName* pMimeType = dynamic_cast<pdfparse::PDFName*>(pStreams->m_aSubElements[0].get());
+ pdfparse::PDFObjectRef* pStreamRef = dynamic_cast<pdfparse::PDFObjectRef*>(pStreams->m_aSubElements[1].get());
+
+ SAL_WARN_IF( !pMimeType, "sdext.pdfimport", "error: no mimetype element" );
+ SAL_WARN_IF( !pStreamRef, "sdext.pdfimport", "error: no stream ref element" );
+
+ if( pMimeType && pStreamRef )
+ {
+ pdfparse::PDFObject* pObject = pPDFFile->findObject( pStreamRef->m_nNumber, pStreamRef->m_nGeneration );
+ SAL_WARN_IF( !pObject, "sdext.pdfimport", "object not found" );
+ if( pObject )
+ {
+ if( pPDFFile->isEncrypted() )
+ {
+ bool bAuthenticated = false;
+ if( !io_rPwd.isEmpty() )
+ {
+ OString aIsoPwd = OUStringToOString( io_rPwd,
+ RTL_TEXTENCODING_ISO_8859_1 );
+ bAuthenticated = pPDFFile->setupDecryptionData( aIsoPwd.getStr() );
+ }
+ if( ! bAuthenticated )
+ {
+ uno::Reference< task::XInteractionHandler > xIntHdl;
+ for( const beans::PropertyValue& rAttrib : rFilterData )
+ {
+ if ( rAttrib.Name == "InteractionHandler" )
+ rAttrib.Value >>= xIntHdl;
+ }
+ if( ! bMayUseUI || ! xIntHdl.is() )
+ {
+ rOutMimetype = pMimeType->getFilteredName();
+ xEmbed.clear();
+ break;
+ }
+
+ OUString aDocName( rInPDFFileURL.copy( rInPDFFileURL.lastIndexOf( '/' )+1 ) );
+
+ bool bEntered = false;
+ do
+ {
+ bEntered = getPassword( xIntHdl, io_rPwd, ! bEntered, aDocName );
+ OString aIsoPwd = OUStringToOString( io_rPwd,
+ RTL_TEXTENCODING_ISO_8859_1 );
+ bAuthenticated = pPDFFile->setupDecryptionData( aIsoPwd.getStr() );
+ } while( bEntered && ! bAuthenticated );
+ }
+
+ if( ! bAuthenticated )
+ continue;
+ }
+ rOutMimetype = pMimeType->getFilteredName();
+ FileEmitContext aContext( rInPDFFileURL,
+ xContext,
+ pPDFFile );
+ aContext.m_bDecrypt = pPDFFile->isEncrypted();
+ pObject->writeStream( aContext, pPDFFile );
+ xEmbed = aContext.getContextStream();
+ break; // success
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return xEmbed;
+}
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+sdext_PDFDetector_get_implementation(
+ css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any> const&)
+{
+ return cppu::acquire(new PDFDetector(context));
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/filterdet.hxx b/sdext/source/pdfimport/filterdet.hxx
new file mode 100644
index 000000000..6c7d58ca0
--- /dev/null
+++ b/sdext/source/pdfimport/filterdet.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <com/sun/star/document/XExtendedFilterDetection.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/io/XStream.hpp>
+
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+
+
+namespace pdfi
+{
+
+typedef ::cppu::WeakComponentImplHelper<
+ css::document::XExtendedFilterDetection, css::lang::XServiceInfo> PDFDetectorBase;
+
+class PDFDetector : private cppu::BaseMutex,
+ public PDFDetectorBase
+{
+private:
+ css::uno::Reference<
+ css::uno::XComponentContext > m_xContext;
+
+public:
+ explicit PDFDetector( const css::uno::Reference<
+ css::uno::XComponentContext >& xContext );
+
+ // XExtendedFilterDetection
+ virtual OUString SAL_CALL detect( css::uno::Sequence<
+ css::beans::PropertyValue >& io_rDescriptor ) override;
+
+ OUString SAL_CALL getImplementationName() override;
+
+ sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override;
+
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+};
+
+
+/** Retrieve embedded substream from PDF file
+
+ Useful e.g. for hybrid PDF
+
+ @param rPDFFile
+ URI of the pdf file
+
+ @param o_rOutMimetype
+ Output parameter. Receives the mime type of the
+ substream. Used to distinguish between
+ draw/impress/writer/calc during import
+
+ @param o_rOutPwd
+ In/Out parameter. If given password is wrong, user is queried
+ for another (if bMayUseUI is true)
+
+ @param xContext
+ Component context
+
+ @param rFilterData
+ Basically used to pass on XFilter::filter properties (function
+ uses it to retrieve interaction handler)
+
+ @param bMayUseUI
+ When false, no dialog is opened to query user for alternate
+ password
+ */
+css::uno::Reference< css::io::XStream >
+ getAdditionalStream( const OUString& rPDFFile,
+ OUString& o_rOutMimetype,
+ OUString& io_rOutPwd,
+ const css::uno::Reference< css::uno::XComponentContext >& xContext,
+ const css::uno::Sequence< css::beans::PropertyValue >& rFilterData,
+ bool bMayUseUI );
+
+
+bool checkDocChecksum( const OUString& rInPDFFileURL,
+ sal_uInt32 nBytes,
+ const OUString& rChkSum );
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/inc/contentsink.hxx b/sdext/source/pdfimport/inc/contentsink.hxx
new file mode 100644
index 000000000..9d016a7e2
--- /dev/null
+++ b/sdext/source/pdfimport/inc/contentsink.hxx
@@ -0,0 +1,181 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_INC_CONTENTSINK_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_CONTENTSINK_HXX
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/rendering/ARGBColor.hpp>
+#include <memory>
+
+namespace com::sun::star {
+ namespace rendering
+ {
+ class XPolyPolygon2D;
+ }
+ namespace geometry
+ {
+ struct Matrix2D;
+ struct AffineMatrix2D;
+ struct RealRectangle2D;
+ struct RealPoint2D;
+ struct RealSize2D;
+ }
+ namespace beans
+ {
+ struct PropertyValue;
+ }
+}
+
+namespace pdfi
+{
+ struct FontAttributes
+ {
+ FontAttributes( const OUString& familyName_,
+ const OUString& sFontWeight,
+ bool isItalic_,
+ bool isUnderline_,
+ double size_,
+ double ascent_) :
+ familyName(familyName_),
+ fontWeight(sFontWeight),
+ isItalic(isItalic_),
+ isUnderline(isUnderline_),
+ isOutline(false),
+ size(size_),
+ ascent(ascent_)
+ {}
+
+ FontAttributes() :
+ familyName(),
+ fontWeight(u"normal"),
+ isItalic(false),
+ isUnderline(false),
+ isOutline(false),
+ size(0.0),
+ ascent(1.0)
+ {}
+
+ OUString familyName;
+ OUString fontWeight;
+ bool isItalic;
+ bool isUnderline;
+ bool isOutline;
+ double size; // device pixel
+ double ascent;
+
+ bool operator==(const FontAttributes& rFont) const
+ {
+ return familyName == rFont.familyName &&
+ fontWeight == rFont.fontWeight &&
+ !isItalic == !rFont.isItalic &&
+ !isUnderline == !rFont.isUnderline &&
+ !isOutline == !rFont.isOutline &&
+ size == rFont.size &&
+ ascent == rFont.ascent;
+ }
+ };
+
+ /** (preliminary) API wrapper around xpdf
+
+ Wraps the functionality currently used from xpdf's OutputDev
+ interface. Subject to change.
+ */
+ struct ContentSink
+ {
+ virtual ~ContentSink() {}
+
+ /// Total number of pages for upcoming document
+ virtual void setPageNum( sal_Int32 nNumPages ) = 0;
+ virtual void startPage( const css::geometry::RealSize2D& rSize ) = 0;
+ virtual void endPage() = 0;
+
+ virtual void hyperLink( const css::geometry::RealRectangle2D& rBounds,
+ const OUString& rURI ) = 0;
+
+ virtual void pushState() = 0;
+ virtual void popState() = 0;
+
+ virtual void setFlatness( double ) = 0;
+ virtual void setTransformation( const css::geometry::AffineMatrix2D& rMatrix ) = 0;
+ virtual void setLineDash( const css::uno::Sequence<double>& dashes,
+ double start ) = 0;
+ virtual void setLineJoin( sal_Int8 lineJoin ) = 0;
+ virtual void setLineCap( sal_Int8 lineCap ) = 0;
+ virtual void setMiterLimit(double) = 0;
+ virtual void setLineWidth(double) = 0;
+ virtual void setFillColor( const css::rendering::ARGBColor& rColor ) = 0;
+ virtual void setStrokeColor( const css::rendering::ARGBColor& rColor ) = 0;
+ virtual void setFont( const FontAttributes& rFont ) = 0;
+ virtual void setTextRenderMode( sal_Int32 ) = 0;
+
+
+ virtual void strokePath( const css::uno::Reference<
+ css::rendering::XPolyPolygon2D >& rPath ) = 0;
+ virtual void fillPath( const css::uno::Reference<
+ css::rendering::XPolyPolygon2D >& rPath ) = 0;
+ virtual void eoFillPath( const css::uno::Reference<
+ css::rendering::XPolyPolygon2D >& rPath ) = 0;
+
+ virtual void intersectClip(const css::uno::Reference<
+ css::rendering::XPolyPolygon2D >& rPath) = 0;
+ virtual void intersectEoClip(const css::uno::Reference<
+ css::rendering::XPolyPolygon2D >& rPath) = 0;
+
+ virtual void drawGlyphs( const OUString& rGlyphs,
+ const css::geometry::RealRectangle2D& rRect,
+ const css::geometry::Matrix2D& rFontMatrix,
+ double fontSize) = 0;
+
+ /// issued when a sequence of associated glyphs is drawn
+ virtual void endText() = 0;
+
+ /// draws given bitmap as a mask (using current fill color)
+ virtual void drawMask(const css::uno::Sequence<
+ css::beans::PropertyValue>& xBitmap,
+ bool bInvert ) = 0;
+ /// Given image must already be color-mapped and normalized to sRGB.
+ virtual void drawImage(const css::uno::Sequence<
+ css::beans::PropertyValue>& xBitmap ) = 0;
+ /** Given image must already be color-mapped and normalized to sRGB.
+
+ maskColors must contain two sequences of color components
+ */
+ virtual void drawColorMaskedImage(const css::uno::Sequence<
+ css::beans::PropertyValue>& xBitmap,
+ const css::uno::Sequence<
+ css::uno::Any>& xMaskColors ) = 0;
+ virtual void drawMaskedImage(const css::uno::Sequence<
+ css::beans::PropertyValue>& xBitmap,
+ const css::uno::Sequence<
+ css::beans::PropertyValue>& xMask,
+ bool bInvertMask) = 0;
+ virtual void drawAlphaMaskedImage(const css::uno::Sequence<
+ css::beans::PropertyValue>& xImage,
+ const css::uno::Sequence<
+ css::beans::PropertyValue>& xMask) = 0;
+ };
+
+ typedef std::shared_ptr<ContentSink> ContentSinkSharedPtr;
+}
+
+#endif // INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_CONTENTSINK_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/inc/genericelements.hxx b/sdext/source/pdfimport/inc/genericelements.hxx
new file mode 100644
index 000000000..63325213f
--- /dev/null
+++ b/sdext/source/pdfimport/inc/genericelements.hxx
@@ -0,0 +1,309 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_INC_GENERICELEMENTS_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_GENERICELEMENTS_HXX
+
+#include "pdfihelper.hxx"
+#include "treevisiting.hxx"
+
+#include <com/sun/star/task/XStatusIndicator.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <rtl/ustring.hxx>
+#include <rtl/ustrbuf.hxx>
+
+#include <list>
+
+namespace pdfi
+{
+ class XmlEmitter;
+ class StyleContainer;
+ class ImageContainer;
+ class PDFIProcessor;
+ class ElementFactory;
+
+
+ struct EmitContext
+ {
+ EmitContext(
+ XmlEmitter& _rEmitter,
+ StyleContainer& _rStyles,
+ ImageContainer& _rImages,
+ PDFIProcessor& _rProcessor,
+ const css::uno::Reference<
+ css::task::XStatusIndicator>& _xStatusIndicator,
+ css::uno::Reference< css::uno::XComponentContext > const & xContext)
+ :
+ rEmitter(_rEmitter),
+ rStyles(_rStyles),
+ rImages(_rImages),
+ rProcessor(_rProcessor),
+ xStatusIndicator(_xStatusIndicator),
+ m_xContext(xContext)
+ {}
+
+ XmlEmitter& rEmitter;
+ StyleContainer& rStyles;
+ ImageContainer& rImages;
+ PDFIProcessor& rProcessor;
+ css::uno::Reference<
+ css::task::XStatusIndicator> xStatusIndicator;
+ css::uno::Reference<
+ css::uno::XComponentContext > m_xContext;
+ };
+
+ struct Element
+ {
+ protected:
+ explicit Element( Element* pParent )
+ : x( 0 ), y( 0 ), w( 0 ), h( 0 ), StyleId( -1 ), Parent( pParent )
+ {
+ if( pParent )
+ pParent->Children.emplace_back( this );
+ }
+
+ public:
+ virtual ~Element();
+
+ /**
+ To be implemented by every tree node that needs to be
+ visitable.
+ */
+ virtual void visitedBy( ElementTreeVisitor&, const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt ) = 0;
+ /// Apply visitor to all children
+ void applyToChildren( ElementTreeVisitor& );
+ /// Union element geometry with given element
+ void updateGeometryWith( const Element* pMergeFrom );
+
+#if OSL_DEBUG_LEVEL > 0
+ // xxx refact TODO: move code to visitor
+ virtual void emitStructure( int nLevel );
+#endif
+ /** el must be a valid dereferenceable iterator of el->Parent->Children
+ pNewParent must not be NULL
+ */
+ static void setParent( std::list<std::unique_ptr<Element>>::iterator const & el, Element* pNewParent );
+
+ double x, y, w, h;
+ sal_Int32 StyleId;
+ Element* Parent;
+ std::list<std::unique_ptr<Element>> Children;
+ };
+
+ struct ListElement final : public Element
+ {
+ ListElement() : Element( nullptr ) {}
+ virtual void visitedBy( ElementTreeVisitor&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ };
+
+ struct HyperlinkElement final : public Element
+ {
+ friend class ElementFactory;
+ HyperlinkElement( Element* pParent, const OUString& rURI )
+ : Element( pParent ), URI( rURI ) {}
+ public:
+ virtual void visitedBy( ElementTreeVisitor&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+
+ OUString URI;
+ };
+
+ struct GraphicalElement : public Element
+ {
+ protected:
+ GraphicalElement(Element* pParent, sal_Int32 nGCId)
+ : Element(pParent)
+ , GCId(nGCId)
+ , MirrorVertical(false)
+ , IsForText(false)
+ , FontSize(0.0)
+ , TextStyleId(0)
+ {
+ }
+
+ public:
+ sal_Int32 GCId;
+ bool MirrorVertical;
+ bool IsForText;
+ double FontSize;
+ sal_Int32 TextStyleId;
+ };
+
+ struct DrawElement : public GraphicalElement
+ {
+ protected:
+ DrawElement( Element* pParent, sal_Int32 nGCId )
+ : GraphicalElement( pParent, nGCId ), isCharacter(false), ZOrder(0) {}
+
+ public:
+ bool isCharacter;
+ sal_Int32 ZOrder;
+ };
+
+ struct FrameElement final : public DrawElement
+ {
+ friend class ElementFactory;
+ FrameElement( Element* pParent, sal_Int32 nGCId )
+ : DrawElement( pParent, nGCId ) {}
+
+ public:
+ virtual void visitedBy( ElementTreeVisitor&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ };
+
+ struct TextElement final : public GraphicalElement
+ {
+ friend class ElementFactory;
+ TextElement( Element* pParent, sal_Int32 nGCId, sal_Int32 nFontId )
+ : GraphicalElement( pParent, nGCId ), FontId( nFontId ) {}
+
+ public:
+ virtual void visitedBy( ElementTreeVisitor&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+
+ OUStringBuffer Text;
+ sal_Int32 FontId;
+ };
+
+ struct ParagraphElement final : public Element
+ {
+ friend class ElementFactory;
+ explicit ParagraphElement( Element* pParent ) : Element( pParent ), Type( Normal ), bRtl( false ) {}
+
+ public:
+ virtual void visitedBy( ElementTreeVisitor&, const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt ) override;
+
+ // returns true only if only a single line is contained
+ bool isSingleLined( PDFIProcessor const & rProc ) const;
+ // returns the highest line height of the contained textelements
+ // line height is font height if the text element is itself multilined
+ double getLineHeight( PDFIProcessor& rProc ) const;
+ // returns the first text element child; does not recurse through subparagraphs
+ TextElement* getFirstTextChild() const;
+
+ enum ParagraphType { Normal, Headline };
+ ParagraphType Type;
+ bool bRtl;
+ };
+
+ struct PolyPolyElement final : public DrawElement
+ {
+ friend class ElementFactory;
+ PolyPolyElement( Element* pParent, sal_Int32 nGCId,
+ const basegfx::B2DPolyPolygon& rPolyPoly,
+ sal_Int8 nAction );
+ public:
+ virtual void visitedBy( ElementTreeVisitor&, const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt ) override;
+
+ void updateGeometry();
+
+#if OSL_DEBUG_LEVEL > 0
+ virtual void emitStructure( int nLevel ) override;
+#endif
+
+ basegfx::B2DPolyPolygon PolyPoly;
+ sal_Int8 Action;
+ };
+
+ struct ImageElement final : public DrawElement
+ {
+ friend class ElementFactory;
+ ImageElement( Element* pParent, sal_Int32 nGCId, ImageId nImage )
+ : DrawElement( pParent, nGCId ), Image( nImage ) {}
+
+ public:
+ virtual void visitedBy( ElementTreeVisitor&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+
+ ImageId Image;
+ };
+
+ struct PageElement final : public Element
+ {
+ friend class ElementFactory;
+ PageElement( Element* pParent, sal_Int32 nPageNr )
+ : Element( pParent ), PageNumber( nPageNr ), Hyperlinks(),
+ TopMargin( 0.0 ), BottomMargin( 0.0 ), LeftMargin( 0.0 ), RightMargin( 0.0 )
+ {}
+ private:
+ // helper method for resolveHyperlinks
+ bool resolveHyperlink( const std::list<std::unique_ptr<Element>>::iterator& link_it, std::list<std::unique_ptr<Element>>& rElements );
+ public:
+ virtual ~PageElement() override;
+
+ virtual void visitedBy( ElementTreeVisitor&, const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt ) override;
+
+ void resolveHyperlinks();
+ void resolveFontStyles( PDFIProcessor const & rProc );
+ void resolveUnderlines( PDFIProcessor const & rProc );
+
+ sal_Int32 PageNumber;
+ ListElement Hyperlinks; // contains not yet realized links on this page
+ double TopMargin;
+ double BottomMargin;
+ double LeftMargin;
+ double RightMargin;
+ std::unique_ptr<Element> HeaderElement;
+ std::unique_ptr<Element> FooterElement;
+ };
+
+ struct DocumentElement final : public Element
+ {
+ friend class ElementFactory;
+ public:
+ DocumentElement() : Element( nullptr ) {}
+ virtual ~DocumentElement() override;
+
+ virtual void visitedBy( ElementTreeVisitor&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ };
+
+ // this class is the differentiator of document types: it will create
+ // Element objects with an optimize() method suitable for the document type
+ class ElementFactory
+ {
+ public:
+ ElementFactory() = delete;
+
+ static HyperlinkElement* createHyperlinkElement( Element* pParent, const OUString& rURI )
+ { return new HyperlinkElement( pParent, rURI ); }
+
+ static TextElement* createTextElement( Element* pParent, sal_Int32 nGCId, sal_Int32 nFontId )
+ { return new TextElement( pParent, nGCId, nFontId ); }
+ static ParagraphElement* createParagraphElement( Element* pParent )
+ { return new ParagraphElement( pParent ); }
+
+ static FrameElement* createFrameElement( Element* pParent, sal_Int32 nGCId )
+ { return new FrameElement( pParent, nGCId ); }
+ static PolyPolyElement*
+ createPolyPolyElement( Element* pParent,
+ sal_Int32 nGCId,
+ const basegfx::B2DPolyPolygon& rPolyPoly,
+ sal_Int8 nAction)
+ { return new PolyPolyElement( pParent, nGCId, rPolyPoly, nAction ); }
+ static ImageElement* createImageElement( Element* pParent, sal_Int32 nGCId, ImageId nImage )
+ { return new ImageElement( pParent, nGCId, nImage ); }
+
+ static PageElement* createPageElement( Element* pParent,
+ sal_Int32 nPageNr )
+ { return new PageElement( pParent, nPageNr ); }
+ static std::shared_ptr<DocumentElement> createDocumentElement()
+ { return std::make_shared<DocumentElement>(); }
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/inc/imagecontainer.hxx b/sdext/source/pdfimport/inc/imagecontainer.hxx
new file mode 100644
index 000000000..d21ed7504
--- /dev/null
+++ b/sdext/source/pdfimport/inc/imagecontainer.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/.
+ *
+ * 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_SDEXT_SOURCE_PDFIMPORT_INC_IMAGECONTAINER_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_IMAGECONTAINER_HXX
+
+#include "pdfihelper.hxx"
+
+#include <com/sun/star/beans/PropertyValue.hpp>
+
+#include <vector>
+
+namespace pdfi
+{
+ struct EmitContext;
+
+ class ImageContainer
+ {
+ private:
+ std::vector< css::uno::Sequence<
+ css::beans::PropertyValue> > m_aImages;
+
+ public:
+ ImageContainer();
+
+ ImageId addImage( const css::uno::Sequence<
+ css::beans::PropertyValue>& xBitmap );
+ void writeBase64EncodedStream( ImageId nImageId, EmitContext& rContext );
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/inc/odfemitter.hxx b/sdext/source/pdfimport/inc/odfemitter.hxx
new file mode 100644
index 000000000..97111c299
--- /dev/null
+++ b/sdext/source/pdfimport/inc/odfemitter.hxx
@@ -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/.
+ *
+ * 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_SDEXT_SOURCE_PDFIMPORT_INC_ODFEMITTER_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_ODFEMITTER_HXX
+
+#include "xmlemitter.hxx"
+#include <com/sun/star/uno/Reference.hxx>
+
+namespace com::sun::star::io { class XOutputStream; }
+
+namespace pdfi
+{
+ XmlEmitterSharedPtr createOdfEmitter( const css::uno::Reference<
+ css::io::XOutputStream>& xOut );
+}
+
+#endif // INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_ODFEMITTER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/inc/pdfihelper.hxx b/sdext/source/pdfimport/inc/pdfihelper.hxx
new file mode 100644
index 000000000..6b663b203
--- /dev/null
+++ b/sdext/source/pdfimport/inc/pdfihelper.hxx
@@ -0,0 +1,231 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_INC_PDFIHELPER_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_PDFIHELPER_HXX
+
+#include "contentsink.hxx"
+
+#include <rtl/ustring.hxx>
+#include <rtl/math.h>
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <com/sun/star/rendering/PathCapType.hpp>
+#include <com/sun/star/rendering/PathJoinType.hpp>
+
+#include <unordered_map>
+#include <vector>
+#include <o3tl/hash_combine.hxx>
+
+// virtual resolution of the PDF OutputDev in dpi
+#define PDFI_OUTDEV_RESOLUTION 7200
+
+namespace com::sun::star::task { class XInteractionHandler; }
+
+namespace pdfi
+{
+ typedef std::unordered_map< OUString, OUString > PropertyMap;
+ typedef sal_Int32 ImageId;
+
+ /// What to do with a polygon. values can be ORed together
+ enum PolygonAction { PATH_STROKE=1, PATH_FILL=2, PATH_EOFILL=4 };
+
+ OUString unitMMString( double fMM );
+ OUString convertPixelToUnitString( double fPix );
+
+ inline double convPx2mm( double fPix )
+ {
+ const double px2mm = 25.4/PDFI_OUTDEV_RESOLUTION;
+ fPix *= px2mm;
+ return fPix;
+ }
+
+ inline double convmm2Px( double fMM )
+ {
+ const double mm2px = PDFI_OUTDEV_RESOLUTION/25.4;
+ fMM *= mm2px;
+ return fMM;
+ }
+
+ inline double convPx2mmPrec2( double fPix )
+ {
+ return rtl_math_round( convPx2mm( fPix ), 2, rtl_math_RoundingMode_Floor );
+ }
+
+ /// Convert color to "#FEFEFE" color notation
+ OUString getColorString( const css::rendering::ARGBColor& );
+ OUString getPercentString(double value);
+
+ double GetAverageTransformationScale(const basegfx::B2DHomMatrix& matrix);
+ void FillDashStyleProps(PropertyMap& props, const std::vector<double>& dashArray, double scale);
+
+ struct FontAttrHash
+ {
+ size_t operator()(const FontAttributes& rFont ) const
+ {
+ std::size_t seed = 0;
+ o3tl::hash_combine(seed, rFont.familyName.hashCode());
+ o3tl::hash_combine(seed, rFont.fontWeight);
+ o3tl::hash_combine(seed, rFont.isItalic);
+ o3tl::hash_combine(seed, rFont.isUnderline);
+ o3tl::hash_combine(seed, rFont.isOutline);
+ o3tl::hash_combine(seed, rFont.size);
+ return seed;
+ }
+ };
+
+ struct GraphicsContext
+ {
+ css::rendering::ARGBColor LineColor;
+ css::rendering::ARGBColor FillColor;
+ sal_Int8 LineJoin;
+ sal_Int8 LineCap;
+ sal_Int8 BlendMode;
+ double Flatness;
+ double LineWidth;
+ double MiterLimit;
+ std::vector<double> DashArray;
+ sal_Int32 FontId;
+ sal_Int32 TextRenderMode;
+ basegfx::B2DHomMatrix Transformation;
+ basegfx::B2DPolyPolygon Clip;
+
+ GraphicsContext() :
+ LineColor(),
+ FillColor(),
+ LineJoin(0),
+ LineCap(0),
+ BlendMode(0),
+ Flatness(0.0),
+ LineWidth(1.0),
+ MiterLimit(10.0),
+ DashArray(),
+ FontId(0),
+ TextRenderMode(0),
+ Transformation(),
+ Clip()
+ {}
+
+ bool operator==(const GraphicsContext& rRight ) const
+ {
+ return LineColor.Red == rRight.LineColor.Red &&
+ LineColor.Green == rRight.LineColor.Green &&
+ LineColor.Blue == rRight.LineColor.Blue &&
+ LineColor.Alpha == rRight.LineColor.Alpha &&
+ FillColor.Red == rRight.FillColor.Red &&
+ FillColor.Green == rRight.FillColor.Green &&
+ FillColor.Blue == rRight.FillColor.Blue &&
+ FillColor.Alpha == rRight.FillColor.Alpha &&
+ LineJoin == rRight.LineJoin &&
+ LineCap == rRight.LineCap &&
+ BlendMode == rRight.BlendMode &&
+ LineWidth == rRight.LineWidth &&
+ Flatness == rRight.Flatness &&
+ MiterLimit == rRight.MiterLimit &&
+ DashArray == rRight.DashArray &&
+ FontId == rRight.FontId &&
+ TextRenderMode == rRight.TextRenderMode &&
+ Transformation == rRight.Transformation &&
+ Clip == rRight.Clip;
+ }
+
+ OUString GetLineJoinString() const
+ {
+ switch (LineJoin)
+ {
+ default:
+ case css::rendering::PathJoinType::MITER:
+ return "miter";
+ case css::rendering::PathJoinType::ROUND:
+ return "round";
+ case css::rendering::PathJoinType::BEVEL:
+ return "bevel";
+ }
+ }
+
+ OUString GetLineCapString() const
+ {
+ switch (LineCap)
+ {
+ default:
+ case css::rendering::PathCapType::BUTT:
+ return "butt";
+ case css::rendering::PathCapType::ROUND:
+ return "round";
+ case css::rendering::PathCapType::SQUARE:
+ return "square";
+ }
+ }
+
+ bool isRotatedOrSkewed() const
+ { return Transformation.get( 0, 1 ) != 0.0 ||
+ Transformation.get( 1, 0 ) != 0.0; }
+ };
+
+ struct GraphicsContextHash
+ {
+ size_t operator()(const GraphicsContext& rGC ) const
+ {
+ std::size_t seed = 0;
+ o3tl::hash_combine(seed, rGC.LineColor.Red);
+ o3tl::hash_combine(seed, rGC.LineColor.Green);
+ o3tl::hash_combine(seed, rGC.LineColor.Blue);
+ o3tl::hash_combine(seed, rGC.LineColor.Alpha);
+ o3tl::hash_combine(seed, rGC.FillColor.Red);
+ o3tl::hash_combine(seed, rGC.FillColor.Green);
+ o3tl::hash_combine(seed, rGC.FillColor.Blue);
+ o3tl::hash_combine(seed, rGC.FillColor.Alpha);
+ o3tl::hash_combine(seed, rGC.LineJoin);
+ o3tl::hash_combine(seed, rGC.LineCap);
+ o3tl::hash_combine(seed, rGC.BlendMode);
+ o3tl::hash_combine(seed, rGC.LineWidth);
+ o3tl::hash_combine(seed, rGC.Flatness);
+ o3tl::hash_combine(seed, rGC.MiterLimit);
+ o3tl::hash_combine(seed, rGC.DashArray.size());
+ o3tl::hash_combine(seed, rGC.FontId);
+ o3tl::hash_combine(seed, rGC.TextRenderMode);
+ o3tl::hash_combine(seed, rGC.Transformation.get( 0, 0 ));
+ o3tl::hash_combine(seed, rGC.Transformation.get( 1, 0 ));
+ o3tl::hash_combine(seed, rGC.Transformation.get( 0, 1 ));
+ o3tl::hash_combine(seed, rGC.Transformation.get( 1, 1 ));
+ o3tl::hash_combine(seed, rGC.Transformation.get( 0, 2 ));
+ o3tl::hash_combine(seed, rGC.Transformation.get( 1, 2 ));
+ o3tl::hash_combine(seed, rGC.Clip.count() ? rGC.Clip.getB2DPolygon(0).count() : 0);
+ return seed;
+ }
+ };
+
+ /** retrieve password from user
+ */
+ bool getPassword( const css::uno::Reference<
+ css::task::XInteractionHandler >& xHandler,
+ OUString& rOutPwd,
+ bool bFirstTry,
+ const OUString& rDocName
+ );
+
+ void reportUnsupportedEncryptionFormat(
+ css::uno::Reference<
+ css::task::XInteractionHandler > const & handler);
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/inc/pdfiprocessor.hxx b/sdext/source/pdfimport/inc/pdfiprocessor.hxx
new file mode 100644
index 000000000..7cbe7d7a5
--- /dev/null
+++ b/sdext/source/pdfimport/inc/pdfiprocessor.hxx
@@ -0,0 +1,211 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_INC_PDFIPROCESSOR_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_PDFIPROCESSOR_HXX
+
+#include <com/sun/star/task/XStatusIndicator.hpp>
+#include <com/sun/star/geometry/RealSize2D.hpp>
+#include <com/sun/star/geometry/RealRectangle2D.hpp>
+#include <com/sun/star/geometry/Matrix2D.hpp>
+
+#include <basegfx/matrix/b2dhommatrix.hxx>
+
+#include <rtl/ustring.hxx>
+
+#include <memory>
+#include <unordered_map>
+
+#include "imagecontainer.hxx"
+#include "contentsink.hxx"
+#include "treevisitorfactory.hxx"
+#include "genericelements.hxx"
+
+namespace pdfi
+{
+
+ class PDFIProcessor;
+ struct Element;
+ struct DocumentElement;
+ struct PageElement;
+ class ElementFactory;
+ class XmlEmitter;
+ class CharGlyph;
+
+ /** Main entry from the parser
+
+ Creates the internal DOM tree from the render calls
+ */
+ class PDFIProcessor final : public ContentSink
+ {
+ public:
+ css::uno::Reference<
+ css::uno::XComponentContext > m_xContext;
+ basegfx::B2DHomMatrix prevTextMatrix;
+ double prevCharWidth;
+
+ explicit PDFIProcessor( const css::uno::Reference< css::task::XStatusIndicator >& xStat,
+ css::uno::Reference< css::uno::XComponentContext > const & xContext) ;
+
+ void emit( XmlEmitter& rEmitter,
+ const TreeVisitorFactory& rVisitorFactory );
+
+ sal_Int32 getGCId( const GraphicsContext& rGC );
+ const GraphicsContext& getGraphicsContext( sal_Int32 nGCId ) const;
+ GraphicsContext& getCurrentContext() { return m_aGCStack.back(); }
+ const GraphicsContext& getCurrentContext() const { return m_aGCStack.back(); }
+
+ const css::uno::Reference< css::task::XStatusIndicator >& getStatusIndicator() const
+ { return m_xStatusIndicator; }
+
+ const FontAttributes& getFont( sal_Int32 nFontId ) const;
+ sal_Int32 getFontId( const FontAttributes& rAttr ) const;
+
+ static void sortElements( Element* pElement );
+
+ static OUString SubstituteBidiMirrored(const OUString& rString);
+
+ private:
+ void processGlyphLine();
+
+ // ContentSink interface implementation
+
+ virtual void setPageNum( sal_Int32 nNumPages ) override;
+ virtual void startPage( const css::geometry::RealSize2D& rSize ) override;
+ virtual void endPage() override;
+
+ virtual void hyperLink( const css::geometry::RealRectangle2D& rBounds,
+ const OUString& rURI ) override;
+ virtual void pushState() override;
+ virtual void popState() override;
+ virtual void setFlatness( double ) override;
+ virtual void setTransformation( const css::geometry::AffineMatrix2D& rMatrix ) override;
+ virtual void setLineDash( const css::uno::Sequence<double>& dashes,
+ double start ) override;
+ virtual void setLineJoin(sal_Int8) override;
+ virtual void setLineCap(sal_Int8) override;
+ virtual void setMiterLimit(double) override;
+ virtual void setLineWidth(double) override;
+ virtual void setFillColor( const css::rendering::ARGBColor& rColor ) override;
+ virtual void setStrokeColor( const css::rendering::ARGBColor& rColor ) override;
+ virtual void setFont( const FontAttributes& rFont ) override;
+ virtual void setTextRenderMode( sal_Int32 ) override;
+
+ virtual void strokePath( const css::uno::Reference<
+ css::rendering::XPolyPolygon2D >& rPath ) override;
+ virtual void fillPath( const css::uno::Reference<
+ css::rendering::XPolyPolygon2D >& rPath ) override;
+ virtual void eoFillPath( const css::uno::Reference<
+ css::rendering::XPolyPolygon2D >& rPath ) override;
+
+ virtual void intersectClip(const css::uno::Reference<
+ css::rendering::XPolyPolygon2D >& rPath) override;
+ virtual void intersectEoClip(const css::uno::Reference<
+ css::rendering::XPolyPolygon2D >& rPath) override;
+
+ virtual void drawGlyphs( const OUString& rGlyphs,
+ const css::geometry::RealRectangle2D& rRect,
+ const css::geometry::Matrix2D& rFontMatrix,
+ double fontSize) override;
+ virtual void endText() override;
+
+ virtual void drawMask(const css::uno::Sequence<
+ css::beans::PropertyValue>& xBitmap,
+ bool bInvert ) override;
+ /// Given image must already be color-mapped and normalized to sRGB.
+ virtual void drawImage(const css::uno::Sequence<
+ css::beans::PropertyValue>& xBitmap ) override;
+ /** Given image must already be color-mapped and normalized to sRGB.
+
+ maskColors must contain two sequences of color components
+ */
+ virtual void drawColorMaskedImage(const css::uno::Sequence<
+ css::beans::PropertyValue>& xBitmap,
+ const css::uno::Sequence<
+ css::uno::Any>& xMaskColors ) override;
+ virtual void drawMaskedImage(const css::uno::Sequence<
+ css::beans::PropertyValue>& xBitmap,
+ const css::uno::Sequence<
+ css::beans::PropertyValue>& xMask,
+ bool bInvertMask) override;
+ virtual void drawAlphaMaskedImage(const css::uno::Sequence<
+ css::beans::PropertyValue>& xImage,
+ const css::uno::Sequence<
+ css::beans::PropertyValue>& xMask) override;
+
+ void startIndicator( const OUString& rText );
+ void endIndicator();
+
+ void setupImage(ImageId nImage);
+
+ typedef std::unordered_map<sal_Int32,FontAttributes> IdToFontMap;
+ typedef std::unordered_map<FontAttributes,sal_Int32,FontAttrHash> FontToIdMap;
+
+ typedef std::unordered_map<sal_Int32,GraphicsContext> IdToGCMap;
+ typedef std::unordered_map<GraphicsContext, sal_Int32, GraphicsContextHash> GCToIdMap;
+
+ typedef std::vector<GraphicsContext> GraphicsContextStack;
+
+ std::vector<CharGlyph> m_GlyphsList;
+
+ std::shared_ptr<DocumentElement> m_pDocument;
+ PageElement* m_pCurPage;
+ Element* m_pCurElement;
+ sal_Int32 m_nNextFontId;
+ IdToFontMap m_aIdToFont;
+ FontToIdMap m_aFontToId;
+
+ GraphicsContextStack m_aGCStack;
+ sal_Int32 m_nNextGCId;
+ IdToGCMap m_aIdToGC;
+ GCToIdMap m_aGCToId;
+
+ ImageContainer m_aImages;
+
+ sal_Int32 m_nPages;
+ sal_Int32 m_nNextZOrder;
+ css::uno::Reference< css::task::XStatusIndicator >
+ m_xStatusIndicator;
+ };
+ class CharGlyph final
+ {
+ public:
+ CharGlyph(Element* pCurElement, const GraphicsContext& rCurrentContext,
+ double width, double prevSpaceWidth, const OUString& rGlyphs )
+ : m_pCurElement(pCurElement), m_rCurrentContext(rCurrentContext),
+ m_Width(width), m_PrevSpaceWidth(prevSpaceWidth), m_rGlyphs(rGlyphs) {};
+
+ OUString& getGlyph(){ return m_rGlyphs; }
+ double getWidth() const { return m_Width; }
+ double getPrevSpaceWidth() const { return m_PrevSpaceWidth; }
+ GraphicsContext& getGC(){ return m_rCurrentContext; }
+ Element* getCurElement(){ return m_pCurElement; }
+
+ private:
+ Element* m_pCurElement ;
+ GraphicsContext m_rCurrentContext ;
+ double m_Width ;
+ double m_PrevSpaceWidth ;
+ OUString m_rGlyphs ;
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/inc/pdfparse.hxx b/sdext/source/pdfimport/inc/pdfparse.hxx
new file mode 100644
index 000000000..9d74085ab
--- /dev/null
+++ b/sdext/source/pdfimport/inc/pdfparse.hxx
@@ -0,0 +1,304 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_INC_PDFPARSE_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_PDFPARSE_HXX
+
+#include <sal/types.h>
+#include <rtl/ustring.hxx>
+#include <rtl/string.hxx>
+
+#include <string_view>
+#include <unordered_map>
+#include <vector>
+#include <memory>
+
+namespace pdfparse
+{
+
+struct EmitImplData;
+struct PDFContainer;
+class EmitContext
+{
+public:
+ virtual bool write( const void* pBuf, unsigned int nLen ) = 0;
+ virtual unsigned int getCurPos() = 0;
+ virtual bool copyOrigBytes( unsigned int nOrigOffset, unsigned int nLen ) = 0;
+ virtual unsigned int readOrigBytes( unsigned int nOrigOffset, unsigned int nLen, void* pBuf ) = 0;
+
+ explicit EmitContext( const PDFContainer* pTop = nullptr );
+ virtual ~EmitContext();
+
+ // set this to deflate contained streams
+ bool m_bDeflate;
+ // set this to decrypt the PDF file
+ bool m_bDecrypt;
+
+private:
+ friend struct PDFEntry;
+ std::unique_ptr<EmitImplData> m_pImplData;
+};
+
+struct PDFEntry
+{
+ PDFEntry() {}
+ virtual ~PDFEntry();
+
+ virtual bool emit( EmitContext& rWriteContext ) const = 0;
+ virtual PDFEntry* clone() const = 0;
+
+protected:
+ static EmitImplData* getEmitData( EmitContext const & rContext );
+ static void setEmitData( EmitContext& rContext, EmitImplData* pNewEmitData );
+};
+
+struct PDFComment final : public PDFEntry
+{
+ OString m_aComment;
+
+ explicit PDFComment( const OString& rComment )
+ : PDFEntry(), m_aComment( rComment ) {}
+ virtual ~PDFComment() override;
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+};
+
+struct PDFValue : public PDFEntry
+{
+ // abstract base class for simple values
+ PDFValue() : PDFEntry() {}
+ virtual ~PDFValue() override;
+};
+
+struct PDFName final : public PDFValue
+{
+ OString m_aName;
+
+ explicit PDFName( const OString& rName )
+ : PDFValue(), m_aName( rName ) {}
+ virtual ~PDFName() override;
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+
+ OUString getFilteredName() const;
+};
+
+struct PDFString final : public PDFValue
+{
+ OString m_aString;
+
+ explicit PDFString( const OString& rString )
+ : PDFValue(), m_aString( rString ) {}
+ virtual ~PDFString() override;
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+
+ OString getFilteredString() const;
+};
+
+struct PDFNumber final : public PDFValue
+{
+ double m_fValue;
+
+ explicit PDFNumber( double fVal )
+ : PDFValue(), m_fValue( fVal ) {}
+ virtual ~PDFNumber() override;
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+};
+
+struct PDFBool final : public PDFValue
+{
+ bool m_bValue;
+
+ explicit PDFBool( bool bVal )
+ : PDFValue(), m_bValue( bVal ) {}
+ virtual ~PDFBool() override;
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+};
+
+struct PDFObjectRef final : public PDFValue
+{
+ unsigned int m_nNumber;
+ unsigned int m_nGeneration;
+
+ PDFObjectRef( unsigned int nNr, unsigned int nGen )
+ : PDFValue(), m_nNumber( nNr ), m_nGeneration( nGen ) {}
+ virtual ~PDFObjectRef() override;
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+};
+
+struct PDFNull final : public PDFValue
+{
+ PDFNull() {}
+ virtual ~PDFNull() override;
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+};
+
+struct PDFObject;
+struct PDFContainer : public PDFEntry
+{
+ sal_Int32 m_nOffset;
+ std::vector<std::unique_ptr<PDFEntry>> m_aSubElements;
+
+ // this is an abstract base class for identifying
+ // entries that can contain sub elements besides comments
+ PDFContainer() : PDFEntry(), m_nOffset( 0 ) {}
+ virtual ~PDFContainer() override;
+ bool emitSubElements( EmitContext& rWriteContext ) const;
+ void cloneSubElements( std::vector<std::unique_ptr<PDFEntry>>& rNewSubElements ) const;
+
+ PDFObject* findObject( unsigned int nNumber, unsigned int nGeneration ) const;
+ PDFObject* findObject( PDFObjectRef const * pRef ) const
+ { return findObject( pRef->m_nNumber, pRef->m_nGeneration ); }
+};
+
+struct PDFArray final : public PDFContainer
+{
+ PDFArray() {}
+ virtual ~PDFArray() override;
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+};
+
+struct PDFDict final : public PDFContainer
+{
+ typedef std::unordered_map<OString,PDFEntry*> Map;
+ Map m_aMap;
+
+ PDFDict() {}
+ virtual ~PDFDict() override;
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+
+ // inserting a value of NULL will remove rName and the previous value
+ // from the dictionary
+ void insertValue( const OString& rName, std::unique_ptr<PDFEntry> pValue );
+ // removes a name/value pair from the dict
+ void eraseValue( std::string_view rName );
+ // builds new map as of sub elements
+ // returns NULL if successful, else the first offending element
+ PDFEntry* buildMap();
+};
+
+struct PDFStream final : public PDFEntry
+{
+ unsigned int m_nBeginOffset;
+ unsigned int m_nEndOffset; // offset of the byte after the stream
+ PDFDict* m_pDict;
+
+ PDFStream( unsigned int nBegin, unsigned int nEnd, PDFDict* pStreamDict )
+ : PDFEntry(), m_nBeginOffset( nBegin ), m_nEndOffset( nEnd ), m_pDict( pStreamDict ) {}
+ virtual ~PDFStream() override;
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+
+ unsigned int getDictLength( const PDFContainer* pObjectContainer ) const; // get contents of the "Length" entry of the dict
+};
+
+struct PDFTrailer final : public PDFContainer
+{
+ PDFDict* m_pDict;
+
+ PDFTrailer() : PDFContainer(), m_pDict( nullptr ) {}
+ virtual ~PDFTrailer() override;
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+};
+
+struct PDFFileImplData;
+struct PDFFile final : public PDFContainer
+{
+private:
+ mutable std::unique_ptr<PDFFileImplData> m_pData;
+ PDFFileImplData* impl_getData() const;
+public:
+ unsigned int m_nMajor; // PDF major
+ unsigned int m_nMinor; // PDF minor
+
+ PDFFile();
+ virtual ~PDFFile() override;
+
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+
+ bool isEncrypted() const;
+
+ bool usesSupportedEncryptionFormat() const;
+
+ // this method checks whether rPwd is compatible with
+ // either user or owner password and sets up decrypt data in that case
+ // returns true if decryption can be done
+ bool setupDecryptionData( const OString& rPwd ) const;
+
+ bool decrypt( const sal_uInt8* pInBuffer, sal_uInt32 nLen,
+ sal_uInt8* pOutBuffer,
+ unsigned int nObject, unsigned int nGeneration ) const;
+};
+
+struct PDFObject final : public PDFContainer
+{
+ PDFEntry* m_pObject;
+ PDFStream* m_pStream;
+ unsigned int m_nNumber;
+ unsigned int m_nGeneration;
+
+ PDFObject( unsigned int nNr, unsigned int nGen )
+ : m_pObject( nullptr ), m_pStream( nullptr ), m_nNumber( nNr ), m_nGeneration( nGen ) {}
+ virtual ~PDFObject() override;
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+
+ // writes only the contained stream, deflated if necessary
+ void writeStream( EmitContext& rContext, const PDFFile* pPDFFile ) const;
+
+private:
+ // returns true if stream is deflated
+ // fills *ppStream and *pBytes with start of stream and count of bytes
+ // memory returned in *ppStream must be freed with std::free afterwards
+ // fills in NULL and 0 in case of error
+ bool getDeflatedStream( std::unique_ptr<char[]>& rpStream, unsigned int* pBytes, const PDFContainer* pObjectContainer, EmitContext& rContext ) const;
+};
+
+struct PDFPart final : public PDFContainer
+{
+ PDFPart() : PDFContainer() {}
+ virtual ~PDFPart() override;
+ virtual bool emit( EmitContext& rWriteContext ) const override;
+ virtual PDFEntry* clone() const override;
+};
+
+struct PDFReader
+{
+ PDFReader() = delete;
+
+ static std::unique_ptr<PDFEntry> read( const char* pFileName );
+#ifdef _WIN32
+ static std::unique_ptr<PDFEntry> read( const char* pBuffer, unsigned int nLen );
+#endif
+};
+
+} // namespace
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/inc/saxemitter.hxx b/sdext/source/pdfimport/inc/saxemitter.hxx
new file mode 100644
index 000000000..a01b03c5d
--- /dev/null
+++ b/sdext/source/pdfimport/inc/saxemitter.hxx
@@ -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/.
+ *
+ * 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_SDEXT_SOURCE_PDFIMPORT_INC_SAXEMITTER_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_SAXEMITTER_HXX
+
+#include "xmlemitter.hxx"
+#include <com/sun/star/uno/Reference.hxx>
+
+namespace com::sun::star::xml::sax { class XDocumentHandler; }
+
+namespace pdfi
+{
+ XmlEmitterSharedPtr createSaxEmitter( const css::uno::Reference<
+ css::xml::sax::XDocumentHandler >& xDocHdl );
+}
+
+#endif // INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_SAXEMITTER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/inc/treevisiting.hxx b/sdext/source/pdfimport/inc/treevisiting.hxx
new file mode 100644
index 000000000..120166594
--- /dev/null
+++ b/sdext/source/pdfimport/inc/treevisiting.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/.
+ *
+ * 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_SDEXT_SOURCE_PDFIMPORT_INC_TREEVISITING_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_TREEVISITING_HXX
+
+#include <sal/config.h>
+#include <list>
+#include <memory>
+
+namespace pdfi
+{
+ struct HyperlinkElement;
+ struct TextElement;
+ struct ParagraphElement;
+ struct FrameElement;
+ struct PolyPolyElement;
+ struct ImageElement;
+ struct PageElement;
+ struct DocumentElement;
+ struct Element;
+
+ /** To be visited by all tree element types
+
+ Visitor interface from the "visitor pattern". Implementor gets
+ called with actual tree node instances.
+ */
+ struct ElementTreeVisitor
+ {
+ virtual void visit( HyperlinkElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) = 0;
+ virtual void visit( TextElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) = 0;
+ virtual void visit( ParagraphElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) = 0;
+ virtual void visit( FrameElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) = 0;
+ virtual void visit( PolyPolyElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) = 0;
+ virtual void visit( ImageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) = 0;
+ virtual void visit( PageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) = 0;
+ virtual void visit( DocumentElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) = 0;
+ virtual ~ElementTreeVisitor() {}
+ };
+ typedef std::shared_ptr<ElementTreeVisitor> ElementTreeVisitorSharedPtr;
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/inc/treevisitorfactory.hxx b/sdext/source/pdfimport/inc/treevisitorfactory.hxx
new file mode 100644
index 000000000..45621b318
--- /dev/null
+++ b/sdext/source/pdfimport/inc/treevisitorfactory.hxx
@@ -0,0 +1,59 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_INC_TREEVISITORFACTORY_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_TREEVISITORFACTORY_HXX
+
+#include <memory>
+
+namespace pdfi
+{
+ struct ElementTreeVisitor;
+ struct EmitContext;
+ class PDFIProcessor;
+ class StyleContainer;
+
+ /** Tree manipulation factory
+
+ Creates visitor objects performing various operations on the
+ pdf parse tree
+ */
+ struct TreeVisitorFactory
+ {
+ virtual ~TreeVisitorFactory() {}
+
+ /// Create visitor that combines tree nodes
+ virtual std::shared_ptr<ElementTreeVisitor> createOptimizingVisitor(PDFIProcessor&) const = 0;
+ /// Create visitor that prepares style info
+ virtual std::shared_ptr<ElementTreeVisitor> createStyleCollectingVisitor(
+ StyleContainer&, PDFIProcessor&) const = 0;
+ /// Create visitor that emits tree to an output target
+ virtual std::shared_ptr<ElementTreeVisitor> createEmittingVisitor(EmitContext&) const = 0;
+ };
+
+ typedef std::shared_ptr<TreeVisitorFactory> TreeVisitorFactorySharedPtr;
+
+ TreeVisitorFactorySharedPtr createWriterTreeVisitorFactory();
+ TreeVisitorFactorySharedPtr createImpressTreeVisitorFactory();
+ TreeVisitorFactorySharedPtr createDrawTreeVisitorFactory();
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/inc/wrapper.hxx b/sdext/source/pdfimport/inc/wrapper.hxx
new file mode 100644
index 000000000..94cc2b243
--- /dev/null
+++ b/sdext/source/pdfimport/inc/wrapper.hxx
@@ -0,0 +1,94 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_INC_WRAPPER_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_WRAPPER_HXX
+
+#include "contentsink.hxx"
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/task/XInteractionHandler.hpp>
+
+namespace com::sun::star {
+ namespace uno {
+ class XComponentContext;
+ }
+ namespace io {
+ class XInputStream;
+ }
+}
+
+namespace pdfi
+{
+ bool xpdf_ImportFromFile( const OUString& rURL,
+ const ContentSinkSharedPtr& rSink,
+ const css::uno::Reference<
+ css::task::XInteractionHandler >& xIHdl,
+ const OUString& rPwd,
+ const css::uno::Reference<
+ css::uno::XComponentContext >& xContext,
+ const OUString& rFilterOptions);
+ bool xpdf_ImportFromStream( const css::uno::Reference<
+ css::io::XInputStream >& xInput,
+ const ContentSinkSharedPtr& rSink,
+ const css::uno::Reference<
+ css::task::XInteractionHandler >& xIHdl,
+ const OUString& rPwd,
+ const css::uno::Reference<
+ css::uno::XComponentContext >& xContext,
+ const OUString& rFilterOptions );
+
+ const OUString fontAttributesSuffixes[] = {
+ // Note: for performance consideration, each one listed here is evaluated once,
+ // and they are checked from the suffix, thus the order matters.
+ // e.g. for "TimesNewRomanPS-BoldItalic", to get "TimesNewRoman", you should
+ // first have "Italic", and then "Bold", then "-", and then "PS".
+ "-VKana",
+ "MT",
+ "PS",
+ "PSMT",
+ "Regular",
+ "Normal",
+ "Book",
+ "Medium",
+ "ExtraBold",
+ "UltraBold",
+ "ExtraLight",
+ "UltraLight",
+ "Bold",
+ "Heavy",
+ "Black",
+ "Italic",
+ "Oblique",
+ "Bold", //BoldItalic, BoldOblique
+ "Light",
+ "Thin",
+ "Semibold",
+ "-Roman",
+ "Reg",
+ "VKana",
+ "-",
+ ",",
+ ";",
+ "PS", // e.g. TimesNewRomanPS-BoldMT
+ };
+}
+
+#endif // INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_WRAPPER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/inc/xmlemitter.hxx b/sdext/source/pdfimport/inc/xmlemitter.hxx
new file mode 100644
index 000000000..9ffacda7f
--- /dev/null
+++ b/sdext/source/pdfimport/inc/xmlemitter.hxx
@@ -0,0 +1,53 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_INC_XMLEMITTER_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_XMLEMITTER_HXX
+
+#include "pdfihelper.hxx"
+#include <memory>
+
+namespace pdfi
+{
+ /** Output interface to ODF
+
+ Should be easy to implement using either SAX events or plain ODF
+ */
+ class XmlEmitter
+ {
+ public:
+ virtual ~XmlEmitter() {}
+
+ /** Open up a tag with the given properties
+ */
+ virtual void beginTag( const char* pTag, const PropertyMap& rProperties ) = 0;
+ /** Write PCTEXT as-is to output
+ */
+ virtual void write( const OUString& rString ) = 0;
+ /** Close previously opened tag
+ */
+ virtual void endTag( const char* pTag ) = 0;
+ };
+
+ typedef std::shared_ptr<XmlEmitter> XmlEmitterSharedPtr;
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/misc/pdfihelper.cxx b/sdext/source/pdfimport/misc/pdfihelper.cxx
new file mode 100644
index 000000000..8268be6b9
--- /dev/null
+++ b/sdext/source/pdfimport/misc/pdfihelper.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/.
+ *
+ * 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 <pdfihelper.hxx>
+
+#include <rtl/ustrbuf.hxx>
+#include <basegfx/numeric/ftools.hxx>
+#include <rtl/math.hxx>
+
+#include <math.h>
+
+using namespace pdfi;
+using namespace com::sun::star;
+
+double pdfi::GetAverageTransformationScale(const basegfx::B2DHomMatrix& matrix)
+{
+ double rotate, shearX;
+ basegfx::B2DTuple scale, translation;
+ matrix.decompose(scale, translation, rotate, shearX);
+ return (fabs(scale.getX()) + fabs(scale.getY())) / 2.0;
+}
+
+void pdfi::FillDashStyleProps(PropertyMap& props, const std::vector<double>& dashArray, double scale)
+{
+ size_t pairCount = dashArray.size() / 2;
+
+ double distance = 0.0;
+ for (size_t i = 0; i < pairCount; i++)
+ distance += dashArray[i * 2 + 1];
+ distance /= pairCount;
+
+ props["draw:style"] = "rect";
+ props["draw:distance"] = convertPixelToUnitString(distance * scale);
+
+ int dotStage = 0;
+ int dotCounts[3] = {0, 0, 0};
+ double dotLengths[3] = {0.0, 0.0, 0.0};
+
+ for (size_t i = 0; i < pairCount; i++)
+ {
+ if (!rtl::math::approxEqual(dotLengths[dotStage], dashArray[i * 2]))
+ {
+ dotStage++;
+ if (dotStage == 3)
+ break;
+
+ dotCounts[dotStage] = 1;
+ dotLengths[dotStage] = dashArray[i * 2];
+ }
+ else
+ {
+ dotCounts[dotStage]++;
+ }
+ }
+
+ for (int i = 1; i < 3; i++)
+ {
+ if (dotCounts[i] == 0)
+ continue;
+ props["draw:dots" + OUString::number(i)] = OUString::number(dotCounts[i]);
+ props["draw:dots" + OUString::number(i) + "-length"] =
+ convertPixelToUnitString(dotLengths[i] * scale);
+ }
+}
+
+OUString pdfi::getColorString( const rendering::ARGBColor& rCol )
+{
+ OUStringBuffer aBuf( 7 );
+ const sal_uInt8 nRed ( sal::static_int_cast<sal_Int8>( basegfx::fround( rCol.Red * 255.0 ) ) );
+ const sal_uInt8 nGreen( sal::static_int_cast<sal_Int8>( basegfx::fround( rCol.Green * 255.0 ) ) );
+ const sal_uInt8 nBlue ( sal::static_int_cast<sal_Int8>( basegfx::fround( rCol.Blue * 255.0 ) ) );
+ aBuf.append( '#' );
+ if( nRed < 16 )
+ aBuf.append( '0' );
+ aBuf.append( sal_Int32(nRed), 16 );
+ if( nGreen < 16 )
+ aBuf.append( '0' );
+ aBuf.append( sal_Int32(nGreen), 16 );
+ if( nBlue < 16 )
+ aBuf.append( '0' );
+ aBuf.append( sal_Int32(nBlue), 16 );
+
+ return aBuf.makeStringAndClear();
+}
+
+OUString pdfi::getPercentString(double value)
+{
+ return OUString::number(value) + "%";
+}
+
+OUString pdfi::unitMMString( double fMM )
+{
+ return OUString::number(rtl_math_round( fMM, 2, rtl_math_RoundingMode_Floor )) + "mm";
+}
+
+OUString pdfi::convertPixelToUnitString( double fPix )
+{
+ return OUString::number( rtl_math_round( convPx2mm( fPix ), 2, rtl_math_RoundingMode_Floor ) ) + "mm";
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/misc/pwdinteract.cxx b/sdext/source/pdfimport/misc/pwdinteract.cxx
new file mode 100644
index 000000000..79ef78181
--- /dev/null
+++ b/sdext/source/pdfimport/misc/pwdinteract.cxx
@@ -0,0 +1,186 @@
+/* -*- 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 <cassert>
+#include <mutex>
+
+#include <pdfihelper.hxx>
+
+#include <com/sun/star/task/ErrorCodeRequest.hpp>
+#include <com/sun/star/task/XInteractionHandler.hpp>
+#include <com/sun/star/task/XInteractionRequest.hpp>
+#include <com/sun/star/task/XInteractionPassword.hpp>
+#include <com/sun/star/task/DocumentPasswordRequest.hpp>
+
+#include <cppuhelper/implbase.hxx>
+#include <rtl/ref.hxx>
+#include <vcl/errcode.hxx>
+
+using namespace com::sun::star;
+
+namespace
+{
+
+class PDFPasswordRequest:
+ public cppu::WeakImplHelper<
+ task::XInteractionRequest, task::XInteractionPassword >
+{
+private:
+ mutable std::mutex m_aMutex;
+ uno::Any m_aRequest;
+ OUString m_aPassword;
+ bool m_bSelected;
+
+public:
+ explicit PDFPasswordRequest(bool bFirstTry, const OUString& rName);
+ PDFPasswordRequest(const PDFPasswordRequest&) = delete;
+ PDFPasswordRequest& operator=(const PDFPasswordRequest&) = delete;
+
+ // XInteractionRequest
+ virtual uno::Any SAL_CALL getRequest( ) override;
+ virtual uno::Sequence< uno::Reference< task::XInteractionContinuation > > SAL_CALL getContinuations( ) override;
+
+ // XInteractionPassword
+ virtual void SAL_CALL setPassword( const OUString& rPwd ) override;
+ virtual OUString SAL_CALL getPassword() override;
+
+ // XInteractionContinuation
+ virtual void SAL_CALL select() override;
+
+ bool isSelected() const { std::scoped_lock const guard( m_aMutex ); return m_bSelected; }
+
+private:
+ virtual ~PDFPasswordRequest() override {}
+};
+
+PDFPasswordRequest::PDFPasswordRequest( bool bFirstTry, const OUString& rName ) :
+ m_aRequest(
+ uno::Any(
+ task::DocumentPasswordRequest(
+ OUString(), uno::Reference< uno::XInterface >(),
+ task::InteractionClassification_QUERY,
+ (bFirstTry
+ ? task::PasswordRequestMode_PASSWORD_ENTER
+ : task::PasswordRequestMode_PASSWORD_REENTER),
+ rName))),
+ m_bSelected(false)
+{}
+
+uno::Any PDFPasswordRequest::getRequest()
+{
+ return m_aRequest;
+}
+
+uno::Sequence< uno::Reference< task::XInteractionContinuation > > PDFPasswordRequest::getContinuations()
+{
+ return { this };
+}
+
+void PDFPasswordRequest::setPassword( const OUString& rPwd )
+{
+ std::scoped_lock const guard( m_aMutex );
+
+ m_aPassword = rPwd;
+}
+
+OUString PDFPasswordRequest::getPassword()
+{
+ std::scoped_lock const guard( m_aMutex );
+
+ return m_aPassword;
+}
+
+void PDFPasswordRequest::select()
+{
+ std::scoped_lock const guard( m_aMutex );
+
+ m_bSelected = true;
+}
+
+class UnsupportedEncryptionFormatRequest:
+ public cppu::WeakImplHelper< task::XInteractionRequest >
+{
+public:
+ UnsupportedEncryptionFormatRequest() {}
+ UnsupportedEncryptionFormatRequest(const UnsupportedEncryptionFormatRequest&) = delete;
+ UnsupportedEncryptionFormatRequest& operator=(const UnsupportedEncryptionFormatRequest&) = delete;
+
+private:
+ virtual ~UnsupportedEncryptionFormatRequest() override {}
+
+ virtual uno::Any SAL_CALL getRequest() override {
+ return uno::Any(
+ task::ErrorCodeRequest(
+ OUString(), uno::Reference< uno::XInterface >(),
+ sal_uInt32(ERRCODE_IO_WRONGVERSION)));
+ //TODO: should be something more informative than crudely reused
+ // ERRCODE_IO_WRONGVERSION
+ }
+
+ virtual uno::Sequence< uno::Reference< task::XInteractionContinuation > >
+ SAL_CALL getContinuations() override {
+ return
+ uno::Sequence< uno::Reference< task::XInteractionContinuation > >();
+ }
+};
+
+} // namespace
+
+namespace pdfi
+{
+
+bool getPassword( const uno::Reference< task::XInteractionHandler >& xHandler,
+ OUString& rOutPwd,
+ bool bFirstTry,
+ const OUString& rDocName
+ )
+{
+ bool bSuccess = false;
+
+ rtl::Reference< PDFPasswordRequest > xReq(
+ new PDFPasswordRequest( bFirstTry, rDocName ) );
+ try
+ {
+ xHandler->handle( xReq );
+ }
+ catch( uno::Exception& )
+ {
+ }
+
+ if( xReq->isSelected() )
+ {
+ bSuccess = true;
+ rOutPwd = xReq->getPassword();
+ }
+
+ return bSuccess;
+}
+
+void reportUnsupportedEncryptionFormat(
+ uno::Reference< task::XInteractionHandler > const & handler)
+{
+ assert(handler.is());
+ handler->handle(new UnsupportedEncryptionFormatRequest);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/odf/odfemitter.cxx b/sdext/source/pdfimport/odf/odfemitter.cxx
new file mode 100644
index 000000000..e38e81fce
--- /dev/null
+++ b/sdext/source/pdfimport/odf/odfemitter.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 <odfemitter.hxx>
+
+#include <rtl/ustrbuf.hxx>
+#include <osl/diagnose.h>
+#include <com/sun/star/io/XOutputStream.hpp>
+
+#include <comphelper/stl_types.hxx>
+
+using namespace com::sun::star;
+
+namespace pdfi
+{
+
+namespace {
+
+class OdfEmitter : public XmlEmitter
+{
+private:
+ uno::Reference<io::XOutputStream> m_xOutput;
+ uno::Sequence<sal_Int8> m_aLineFeed;
+ uno::Sequence<sal_Int8> m_aBuf;
+
+public:
+ explicit OdfEmitter( const uno::Reference<io::XOutputStream>& xOutput );
+
+ virtual void beginTag( const char* pTag, const PropertyMap& rProperties ) override;
+ virtual void write( const OUString& rString ) override;
+ virtual void endTag( const char* pTag ) override;
+};
+
+}
+
+OdfEmitter::OdfEmitter( const uno::Reference<io::XOutputStream>& xOutput ) :
+ m_xOutput( xOutput ),
+ m_aLineFeed{ '\n' }
+{
+ OSL_PRECOND(m_xOutput.is(), "OdfEmitter(): invalid output stream");
+
+ write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+}
+
+void OdfEmitter::beginTag( const char* pTag, const PropertyMap& rProperties )
+{
+ OSL_PRECOND(pTag,"Invalid tag string");
+
+ OUStringBuffer aElement;
+ aElement.append("<");
+ aElement.appendAscii(pTag);
+ aElement.append(" ");
+
+ std::vector<OUString> aAttributes;
+ for( const auto& rCurr : rProperties )
+ {
+ OUString aAttribute =
+ rCurr.first +
+ "=\"" +
+ rCurr.second +
+ "\" ";
+ aAttributes.push_back(aAttribute);
+ }
+
+ // since the hash map's sorting is undefined (and varies across
+ // platforms, and even between different compile-time settings),
+ // sort the attributes.
+ std::sort(aAttributes.begin(), aAttributes.end());
+ std::copy(aAttributes.begin(), aAttributes.end(),
+ comphelper::OUStringBufferAppender(aElement));
+ aElement.append(">");
+
+ write(aElement.makeStringAndClear());
+}
+
+void OdfEmitter::write( const OUString& rText )
+{
+ const OString aStr = OUStringToOString(rText,RTL_TEXTENCODING_UTF8);
+ const sal_Int32 nLen( aStr.getLength() );
+ m_aBuf.realloc( nLen );
+ const char* pStr = aStr.getStr();
+ std::copy(pStr,pStr+nLen,m_aBuf.getArray());
+
+ m_xOutput->writeBytes(m_aBuf);
+ m_xOutput->writeBytes(m_aLineFeed);
+}
+
+void OdfEmitter::endTag( const char* pTag )
+{
+ OUStringBuffer aElement;
+ aElement.append("</");
+ aElement.appendAscii(pTag);
+ aElement.append(">");
+ write(aElement.makeStringAndClear());
+}
+
+XmlEmitterSharedPtr createOdfEmitter( const uno::Reference<io::XOutputStream>& xOut )
+{
+ return std::make_shared<OdfEmitter>(xOut);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/pdfiadaptor.cxx b/sdext/source/pdfimport/pdfiadaptor.cxx
new file mode 100644
index 000000000..dc2def1c5
--- /dev/null
+++ b/sdext/source/pdfimport/pdfiadaptor.cxx
@@ -0,0 +1,366 @@
+/* -*- 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 "pdfiadaptor.hxx"
+#include "filterdet.hxx"
+#include <saxemitter.hxx>
+#include <odfemitter.hxx>
+#include "inc/wrapper.hxx"
+#include <pdfiprocessor.hxx>
+
+#include <osl/file.h>
+#include <sal/log.hxx>
+#include <rtl/ref.hxx>
+
+#include <cppuhelper/supportsservice.hxx>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/lang/XMultiComponentFactory.hpp>
+#include <com/sun/star/io/XSeekable.hpp>
+#include <tools/diagnose_ex.h>
+
+#include <memory>
+
+using namespace com::sun::star;
+
+
+namespace pdfi
+{
+
+PDFIHybridAdaptor::PDFIHybridAdaptor( const uno::Reference< uno::XComponentContext >& xContext ) :
+ PDFIHybridAdaptorBase( m_aMutex ),
+ m_xContext( xContext )
+{
+}
+
+// XFilter
+sal_Bool SAL_CALL PDFIHybridAdaptor::filter( const uno::Sequence< beans::PropertyValue >& rFilterData )
+{
+ bool bRet = false;
+ if( m_xModel.is() )
+ {
+ uno::Reference< io::XStream > xSubStream;
+ OUString aPwd;
+ const beans::PropertyValue* pAttribs = rFilterData.getConstArray();
+ sal_Int32 nAttribs = rFilterData.getLength();
+ sal_Int32 nPwPos = -1;
+ for( sal_Int32 i = 0; i < nAttribs; i++ )
+ {
+ SAL_INFO("sdext.pdfimport", "filter: Attrib: " << pAttribs[i].Name
+ << " = " << (pAttribs[i].Value.has<OUString>()
+ ? pAttribs[i].Value.get<OUString>()
+ : OUString("<no string>"))
+ << "\n");
+ if ( pAttribs[i].Name == "EmbeddedSubstream" )
+ pAttribs[i].Value >>= xSubStream;
+ else if ( pAttribs[i].Name == "Password" )
+ {
+ nPwPos = i;
+ pAttribs[i].Value >>= aPwd;
+ }
+ }
+ bool bAddPwdProp = false;
+ if( ! xSubStream.is() )
+ {
+ uno::Reference< io::XInputStream > xInput;
+ auto pAttr = std::find_if(rFilterData.begin(), rFilterData.end(),
+ [](const beans::PropertyValue& rAttr) { return rAttr.Name == "InputStream"; });
+ if (pAttr != rFilterData.end())
+ pAttr->Value >>= xInput;
+ if( xInput.is() )
+ {
+ // TODO(P2): extracting hybrid substream twice - once during detection, second time here
+ uno::Reference< io::XSeekable > xSeek( xInput, uno::UNO_QUERY );
+ if( xSeek.is() )
+ xSeek->seek( 0 );
+ oslFileHandle aFile = nullptr;
+ sal_uInt64 nWritten = 0;
+ OUString aURL;
+ if( osl_createTempFile( nullptr, &aFile, &aURL.pData ) == osl_File_E_None )
+ {
+ SAL_INFO("sdext.pdfimport", "created temp file " << aURL);
+ const sal_Int32 nBufSize = 4096;
+ uno::Sequence<sal_Int8> aBuf(nBufSize);
+ // copy the bytes
+ sal_Int32 nBytes;
+ do
+ {
+ nBytes = xInput->readBytes( aBuf, nBufSize );
+ if( nBytes > 0 )
+ {
+ osl_writeFile( aFile, aBuf.getConstArray(), nBytes, &nWritten );
+ if( static_cast<sal_Int32>(nWritten) != nBytes )
+ {
+ xInput.clear();
+ break;
+ }
+ }
+ } while( nBytes == nBufSize );
+ osl_closeFile( aFile );
+ if( xInput.is() )
+ {
+ OUString aEmbedMimetype;
+ OUString aOrgPwd( aPwd );
+ xSubStream = getAdditionalStream( aURL, aEmbedMimetype, aPwd, m_xContext, rFilterData, true );
+ if( aOrgPwd != aPwd )
+ bAddPwdProp = true;
+ }
+ osl_removeFile( aURL.pData );
+ }
+ else
+ xSubStream.clear();
+ }
+ }
+ if( xSubStream.is() )
+ {
+ uno::Sequence< uno::Any > aArgs{ uno::Any(m_xModel), uno::Any(xSubStream) };
+
+ SAL_INFO("sdext.pdfimport", "try to instantiate subfilter" );
+ uno::Reference< document::XFilter > xSubFilter;
+ try {
+ xSubFilter.set(
+ m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+ "com.sun.star.document.OwnSubFilter",
+ aArgs,
+ m_xContext ),
+ uno::UNO_QUERY );
+ }
+ catch(const uno::Exception&)
+ {
+ TOOLS_INFO_EXCEPTION("sdext.pdfimport", "subfilter");
+ }
+
+ SAL_INFO("sdext.pdfimport", "subfilter: " << xSubFilter.get() );
+ if( xSubFilter.is() )
+ {
+ if( bAddPwdProp )
+ {
+ uno::Sequence<beans::PropertyValue> aFilterData( rFilterData );
+ if( nPwPos == -1 )
+ {
+ nPwPos = aFilterData.getLength();
+ aFilterData.realloc( nPwPos+1 );
+ aFilterData.getArray()[nPwPos].Name = "Password";
+ }
+ aFilterData.getArray()[nPwPos].Value <<= aPwd;
+ bRet = xSubFilter->filter( aFilterData );
+ }
+ else
+ bRet = xSubFilter->filter( rFilterData );
+ }
+ }
+ else
+ SAL_INFO("sdext.pdfimport", "PDFIAdaptor::filter: no embedded substream set" );
+ }
+ else
+ SAL_INFO("sdext.pdfimport", "PDFIAdaptor::filter: no model set" );
+
+ return bRet;
+}
+
+void SAL_CALL PDFIHybridAdaptor::cancel()
+{
+}
+
+//XImporter
+void SAL_CALL PDFIHybridAdaptor::setTargetDocument( const uno::Reference< lang::XComponent >& xDocument )
+{
+ SAL_INFO("sdext.pdfimport", "PDFIAdaptor::setTargetDocument" );
+ m_xModel.set( xDocument, uno::UNO_QUERY );
+ if( xDocument.is() && ! m_xModel.is() )
+ throw lang::IllegalArgumentException();
+}
+
+OUString PDFIHybridAdaptor::getImplementationName()
+{
+ return "org.libreoffice.comp.documents.HybridPDFImport";
+}
+
+sal_Bool PDFIHybridAdaptor::supportsService(OUString const & ServiceName)
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+css::uno::Sequence<OUString> PDFIHybridAdaptor::getSupportedServiceNames()
+{
+ return {"com.sun.star.document.ImportFilter"};
+}
+
+PDFIRawAdaptor::PDFIRawAdaptor( OUString const & implementationName, const uno::Reference< uno::XComponentContext >& xContext ) :
+ PDFIAdaptorBase( m_aMutex ),
+ m_implementationName(implementationName),
+ m_xContext( xContext )
+{
+}
+
+void PDFIRawAdaptor::setTreeVisitorFactory(const TreeVisitorFactorySharedPtr& rVisitorFactory)
+{
+ m_pVisitorFactory = rVisitorFactory;
+}
+
+bool PDFIRawAdaptor::parse( const uno::Reference<io::XInputStream>& xInput,
+ const uno::Reference<task::XInteractionHandler>& xIHdl,
+ const OUString& rPwd,
+ const uno::Reference<task::XStatusIndicator>& xStatus,
+ const XmlEmitterSharedPtr& rEmitter,
+ const OUString& rURL,
+ const OUString& rFilterOptions )
+{
+ // container for metaformat
+ auto pSink = std::make_shared<PDFIProcessor>(xStatus, m_xContext);
+
+ bool bSuccess=false;
+
+ if( xInput.is() )
+ bSuccess = xpdf_ImportFromStream( xInput, pSink, xIHdl,
+ rPwd, m_xContext, rFilterOptions );
+ else
+ bSuccess = xpdf_ImportFromFile( rURL, pSink, xIHdl,
+ rPwd, m_xContext, rFilterOptions );
+
+ if( bSuccess )
+ pSink->emit(*rEmitter,*m_pVisitorFactory);
+
+ return bSuccess;
+}
+
+bool PDFIRawAdaptor::odfConvert( const OUString& rURL,
+ const uno::Reference<io::XOutputStream>& xOutput,
+ const uno::Reference<task::XStatusIndicator>& xStatus )
+{
+ XmlEmitterSharedPtr pEmitter = createOdfEmitter(xOutput);
+ const bool bSuccess = parse(uno::Reference<io::XInputStream>(),
+ uno::Reference<task::XInteractionHandler>(),
+ OUString(),
+ xStatus,pEmitter,rURL, "");
+
+ // tell input stream that it is no longer needed
+ xOutput->closeOutput();
+
+ return bSuccess;
+}
+
+// XImportFilter
+sal_Bool SAL_CALL PDFIRawAdaptor::importer( const uno::Sequence< beans::PropertyValue >& rSourceData,
+ const uno::Reference< xml::sax::XDocumentHandler >& rHdl,
+ const uno::Sequence< OUString >& /*rUserData*/ )
+{
+ // get the InputStream carrying the PDF content
+ uno::Reference< io::XInputStream > xInput;
+ uno::Reference< task::XStatusIndicator > xStatus;
+ uno::Reference< task::XInteractionHandler > xInteractionHandler;
+ OUString aURL;
+ OUString aPwd;
+ OUString aFilterOptions;
+ for( const beans::PropertyValue& rAttrib : rSourceData )
+ {
+ SAL_INFO("sdext.pdfimport", "importer Attrib: " << rAttrib.Name );
+ if ( rAttrib.Name == "InputStream" )
+ rAttrib.Value >>= xInput;
+ else if ( rAttrib.Name == "URL" )
+ rAttrib.Value >>= aURL;
+ else if ( rAttrib.Name == "StatusIndicator" )
+ rAttrib.Value >>= xStatus;
+ else if ( rAttrib.Name == "InteractionHandler" )
+ rAttrib.Value >>= xInteractionHandler;
+ else if ( rAttrib.Name == "Password" )
+ rAttrib.Value >>= aPwd;
+ else if ( rAttrib.Name == "FilterOptions" )
+ rAttrib.Value >>= aFilterOptions;
+ }
+ if( !xInput.is() )
+ return false;
+
+ XmlEmitterSharedPtr pEmitter = createSaxEmitter(rHdl);
+ const bool bSuccess = parse(xInput, xInteractionHandler,
+ aPwd, xStatus, pEmitter, aURL, aFilterOptions);
+
+ // tell input stream that it is no longer needed
+ xInput->closeInput();
+ xInput.clear();
+
+ return bSuccess;
+}
+
+//XImporter
+void SAL_CALL PDFIRawAdaptor::setTargetDocument( const uno::Reference< lang::XComponent >& xDocument )
+{
+ SAL_INFO("sdext.pdfimport", "PDFIAdaptor::setTargetDocument" );
+ m_xModel.set( xDocument, uno::UNO_QUERY );
+ if( xDocument.is() && ! m_xModel.is() )
+ throw lang::IllegalArgumentException();
+}
+
+OUString PDFIRawAdaptor::getImplementationName()
+{
+ return m_implementationName;
+}
+
+sal_Bool PDFIRawAdaptor::supportsService(OUString const & ServiceName)
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+css::uno::Sequence<OUString> PDFIRawAdaptor::getSupportedServiceNames()
+{
+ return {"com.sun.star.document.ImportFilter"};
+}
+
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+sdext_PDFIRawAdaptor_Writer_get_implementation(
+ css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any> const&)
+{
+ rtl::Reference<pdfi::PDFIRawAdaptor> pAdaptor = new pdfi::PDFIRawAdaptor( "org.libreoffice.comp.documents.WriterPDFImport", context );
+ pAdaptor->setTreeVisitorFactory(pdfi::createWriterTreeVisitorFactory());
+ pAdaptor->acquire();
+ return static_cast<cppu::OWeakObject*>(pAdaptor.get());
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+sdext_PDFIRawAdaptor_Draw_get_implementation(
+ css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any> const&)
+{
+ rtl::Reference<pdfi::PDFIRawAdaptor> pAdaptor = new pdfi::PDFIRawAdaptor( "org.libreoffice.comp.documents.DrawPDFImport", context );
+ pAdaptor->setTreeVisitorFactory(pdfi::createDrawTreeVisitorFactory());
+ pAdaptor->acquire();
+ return static_cast<cppu::OWeakObject*>(pAdaptor.get());
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+sdext_PDFIRawAdaptor_Impress_get_implementation(
+ css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any> const&)
+{
+ rtl::Reference<pdfi::PDFIRawAdaptor> pAdaptor = new pdfi::PDFIRawAdaptor( "org.libreoffice.comp.documents.ImpressPDFImport", context );
+ pAdaptor->setTreeVisitorFactory(pdfi::createImpressTreeVisitorFactory());
+ pAdaptor->acquire();
+ return static_cast<cppu::OWeakObject*>(pAdaptor.get());
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+sdext_PDFIHybridAdaptor_get_implementation(
+ css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any> const&)
+{
+ return cppu::acquire(new pdfi::PDFIHybridAdaptor( context ));
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/pdfiadaptor.hxx b/sdext/source/pdfimport/pdfiadaptor.hxx
new file mode 100644
index 000000000..0a184f3cf
--- /dev/null
+++ b/sdext/source/pdfimport/pdfiadaptor.hxx
@@ -0,0 +1,143 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_PDFIADAPTOR_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_PDFIADAPTOR_HXX
+
+#include <xmlemitter.hxx>
+#include <treevisitorfactory.hxx>
+
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/xml/XImportFilter.hpp>
+#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/task/XStatusIndicator.hpp>
+#include <com/sun/star/document/XFilter.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
+#include <com/sun/star/io/XOutputStream.hpp>
+#include <com/sun/star/document/XImporter.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+
+
+namespace pdfi
+{
+ typedef ::cppu::WeakComponentImplHelper<
+ css::document::XFilter,
+ css::document::XImporter,
+ css::lang::XServiceInfo> PDFIHybridAdaptorBase;
+
+ class PDFIHybridAdaptor : private cppu::BaseMutex,
+ public PDFIHybridAdaptorBase
+ {
+ private:
+ css::uno::Reference<
+ css::uno::XComponentContext > m_xContext;
+ css::uno::Reference<
+ css::frame::XModel > m_xModel;
+
+ public:
+ explicit PDFIHybridAdaptor( const css::uno::Reference<
+ css::uno::XComponentContext >& xContext );
+
+ // XFilter
+ virtual sal_Bool SAL_CALL filter( const css::uno::Sequence<css::beans::PropertyValue>& rFilterData ) override;
+ virtual void SAL_CALL cancel() override;
+
+ // XImporter
+ virtual void SAL_CALL setTargetDocument( const css::uno::Reference< css::lang::XComponent >& xDocument ) override;
+
+ OUString SAL_CALL getImplementationName() override;
+
+ sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override;
+
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+ };
+
+ typedef ::cppu::WeakComponentImplHelper<
+ css::xml::XImportFilter,
+ css::document::XImporter,
+ css::lang::XServiceInfo> PDFIAdaptorBase;
+
+ /** Adapts raw pdf import to XImportFilter interface
+ */
+ class PDFIRawAdaptor : private cppu::BaseMutex,
+ public PDFIAdaptorBase
+ {
+ private:
+ OUString const m_implementationName;
+ css::uno::Reference<
+ css::uno::XComponentContext > m_xContext;
+ css::uno::Reference<
+ css::frame::XModel > m_xModel;
+ TreeVisitorFactorySharedPtr m_pVisitorFactory;
+
+ bool parse( const css::uno::Reference<css::io::XInputStream>& xInput,
+ const css::uno::Reference<css::task::XInteractionHandler>& xIHdl,
+ const OUString& rPwd,
+ const css::uno::Reference<css::task::XStatusIndicator>& xStatus,
+ const XmlEmitterSharedPtr& rEmitter,
+ const OUString& rURL,
+ const OUString& rFilterOptions);
+
+ public:
+ explicit PDFIRawAdaptor( OUString const & implementationName,
+ const css::uno::Reference<
+ css::uno::XComponentContext >& xContext );
+
+ /** Set factory object used to create the tree visitors
+
+ Used for customizing the tree to the specific output
+ format (writer, draw, etc)
+ */
+ void setTreeVisitorFactory(const TreeVisitorFactorySharedPtr& rVisitorFactory);
+
+ /** Export pdf document to ODG
+
+ @param xOutput
+ Stream to write the flat xml file to
+
+ @param xStatus
+ Optional status indicator
+ */
+ bool odfConvert( const OUString& rURL,
+ const css::uno::Reference<css::io::XOutputStream>& xOutput,
+ const css::uno::Reference<css::task::XStatusIndicator>& xStatus );
+
+ // XImportFilter
+ virtual sal_Bool SAL_CALL importer( const css::uno::Sequence< css::beans::PropertyValue >& rSourceData,
+ const css::uno::Reference< css::xml::sax::XDocumentHandler >& rHdl,
+ const css::uno::Sequence< OUString >& rUserData ) override;
+
+ // XImporter
+ virtual void SAL_CALL setTargetDocument( const css::uno::Reference< css::lang::XComponent >& xDocument ) override;
+
+ OUString SAL_CALL getImplementationName() override;
+
+ sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override;
+
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/pdfimport.component b/sdext/source/pdfimport/pdfimport.component
new file mode 100644
index 000000000..125e90589
--- /dev/null
+++ b/sdext/source/pdfimport/pdfimport.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="org.libreoffice.comp.documents.HybridPDFImport"
+ constructor="sdext_PDFIHybridAdaptor_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.documents.WriterPDFImport"
+ constructor="sdext_PDFIRawAdaptor_Writer_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.documents.DrawPDFImport"
+ constructor="sdext_PDFIRawAdaptor_Draw_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.documents.ImpressPDFImport"
+ constructor="sdext_PDFIRawAdaptor_Impress_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ </implementation>
+ <implementation name="org.libreoffice.comp.documents.PDFDetector"
+ constructor="sdext_PDFDetector_get_implementation">
+ <service name="com.sun.star.document.ImportFilter"/>
+ </implementation>
+</component>
diff --git a/sdext/source/pdfimport/pdfparse/pdfentries.cxx b/sdext/source/pdfimport/pdfparse/pdfentries.cxx
new file mode 100644
index 000000000..6fba80f70
--- /dev/null
+++ b/sdext/source/pdfimport/pdfparse/pdfentries.cxx
@@ -0,0 +1,1461 @@
+/* -*- 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 <pdfparse.hxx>
+
+#include <comphelper/hash.hxx>
+
+#include <rtl/strbuf.hxx>
+#include <rtl/ustring.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <rtl/digest.h>
+#include <rtl/cipher.h>
+#include <sal/log.hxx>
+
+#include <zlib.h>
+
+#include <math.h>
+#include <map>
+
+#include <string.h>
+
+
+namespace pdfparse
+{
+
+struct EmitImplData
+{
+ // xref table: maps object number to a pair of (generation, buffer offset)
+ typedef std::map< unsigned int, std::pair< unsigned int, unsigned int > > XRefTable;
+ XRefTable m_aXRefTable;
+ // container of all indirect objects (usually a PDFFile*)
+ const PDFContainer* m_pObjectContainer;
+ unsigned int m_nDecryptObject;
+ unsigned int m_nDecryptGeneration;
+
+ // returns true if the xref table was updated
+ bool insertXref( unsigned int nObject, unsigned int nGeneration, unsigned int nOffset )
+ {
+ XRefTable::iterator it = m_aXRefTable.find( nObject );
+ if( it == m_aXRefTable.end() )
+ {
+ // new entry
+ m_aXRefTable[ nObject ] = std::pair<unsigned int, unsigned int>(nGeneration,nOffset);
+ return true;
+ }
+ // update old entry, if generation number is higher
+ if( it->second.first < nGeneration )
+ {
+ it->second = std::pair<unsigned int, unsigned int>(nGeneration,nOffset);
+ return true;
+ }
+ return false;
+ }
+
+ explicit EmitImplData( const PDFContainer* pTopContainer ) :
+ m_pObjectContainer( pTopContainer ),
+ m_nDecryptObject( 0 ),
+ m_nDecryptGeneration( 0 )
+ {}
+ void decrypt( const sal_uInt8* pInBuffer, sal_uInt32 nLen, sal_uInt8* pOutBuffer,
+ unsigned int nObject, unsigned int nGeneration ) const
+ {
+ const PDFFile* pFile = dynamic_cast<const PDFFile*>(m_pObjectContainer);
+ pFile && pFile->decrypt( pInBuffer, nLen, pOutBuffer, nObject, nGeneration );
+ }
+
+ void setDecryptObject( unsigned int nObject, unsigned int nGeneration )
+ {
+ m_nDecryptObject = nObject;
+ m_nDecryptGeneration = nGeneration;
+ }
+};
+
+}
+
+using namespace pdfparse;
+
+EmitContext::EmitContext( const PDFContainer* pTop ) :
+ m_bDeflate( false ),
+ m_bDecrypt( false )
+{
+ if( pTop )
+ m_pImplData.reset( new EmitImplData( pTop ) );
+}
+
+EmitContext::~EmitContext()
+{
+}
+
+PDFEntry::~PDFEntry()
+{
+}
+
+EmitImplData* PDFEntry::getEmitData( EmitContext const & rContext )
+{
+ return rContext.m_pImplData.get();
+}
+
+void PDFEntry::setEmitData( EmitContext& rContext, EmitImplData* pNewEmitData )
+{
+ if( rContext.m_pImplData && rContext.m_pImplData.get() != pNewEmitData )
+ rContext.m_pImplData.reset();
+ rContext.m_pImplData.reset( pNewEmitData );
+}
+
+PDFValue::~PDFValue()
+{
+}
+
+PDFComment::~PDFComment()
+{
+}
+
+bool PDFComment::emit( EmitContext& rWriteContext ) const
+{
+ return rWriteContext.write( m_aComment.getStr(), m_aComment.getLength() );
+}
+
+PDFEntry* PDFComment::clone() const
+{
+ return new PDFComment( m_aComment );
+}
+
+PDFName::~PDFName()
+{
+}
+
+bool PDFName::emit( EmitContext& rWriteContext ) const
+{
+ if( ! rWriteContext.write( " /", 2 ) )
+ return false;
+ return rWriteContext.write( m_aName.getStr(), m_aName.getLength() );
+}
+
+PDFEntry* PDFName::clone() const
+{
+ return new PDFName( m_aName );
+}
+
+OUString PDFName::getFilteredName() const
+{
+ OStringBuffer aFilter( m_aName.getLength() );
+ const char* pStr = m_aName.getStr();
+ unsigned int nLen = m_aName.getLength();
+ for( unsigned int i = 0; i < nLen; i++ )
+ {
+ if( (i < nLen - 3) && pStr[i] == '#' )
+ {
+ char rResult = 0;
+ i++;
+ if( pStr[i] >= '0' && pStr[i] <= '9' )
+ rResult = char( pStr[i]-'0' ) << 4;
+ else if( pStr[i] >= 'a' && pStr[i] <= 'f' )
+ rResult = char( pStr[i]-'a' + 10 ) << 4;
+ else if( pStr[i] >= 'A' && pStr[i] <= 'F' )
+ rResult = char( pStr[i]-'A' + 10 ) << 4;
+ i++;
+ if( pStr[i] >= '0' && pStr[i] <= '9' )
+ rResult |= char( pStr[i]-'0' );
+ else if( pStr[i] >= 'a' && pStr[i] <= 'f' )
+ rResult |= char( pStr[i]-'a' + 10 );
+ else if( pStr[i] >= 'A' && pStr[i] <= 'F' )
+ rResult |= char( pStr[i]-'A' + 10 );
+ aFilter.append( rResult );
+ }
+ else
+ aFilter.append( pStr[i] );
+ }
+ return OStringToOUString( aFilter.makeStringAndClear(), RTL_TEXTENCODING_UTF8 );
+}
+
+PDFString::~PDFString()
+{
+}
+
+bool PDFString::emit( EmitContext& rWriteContext ) const
+{
+ if( ! rWriteContext.write( " ", 1 ) )
+ return false;
+ EmitImplData* pEData = getEmitData( rWriteContext );
+ if( rWriteContext.m_bDecrypt && pEData && pEData->m_nDecryptObject )
+ {
+ OString aFiltered( getFilteredString() );
+ // decrypt inplace (evil since OString is supposed to be const
+ // however in this case we know that getFilteredString returned a singular string instance
+ pEData->decrypt( reinterpret_cast<sal_uInt8 const *>(aFiltered.getStr()), aFiltered.getLength(),
+ reinterpret_cast<sal_uInt8 *>(const_cast<char *>(aFiltered.getStr())),
+ pEData->m_nDecryptObject, pEData->m_nDecryptGeneration );
+ // check for string or hex string
+ const char* pStr = aFiltered.getStr();
+ if( aFiltered.getLength() > 1 &&
+ ( (static_cast<unsigned char>(pStr[0]) == 0xff && static_cast<unsigned char>(pStr[1]) == 0xfe) ||
+ (static_cast<unsigned char>(pStr[0]) == 0xfe && static_cast<unsigned char>(pStr[1]) == 0xff) ) )
+ {
+ static const char pHexTab[16] = { '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+ if( ! rWriteContext.write( "<", 1 ) )
+ return false;
+ for( sal_Int32 i = 0; i < aFiltered.getLength(); i++ )
+ {
+ if( ! rWriteContext.write( pHexTab + ((sal_uInt32(pStr[i]) >> 4) & 0x0f), 1 ) )
+ return false;
+ if( ! rWriteContext.write( pHexTab + (sal_uInt32(pStr[i]) & 0x0f), 1 ) )
+ return false;
+ }
+ if( ! rWriteContext.write( ">", 1 ) )
+ return false;
+ }
+ else
+ {
+ if( ! rWriteContext.write( "(", 1 ) )
+ return false;
+ if( ! rWriteContext.write( aFiltered.getStr(), aFiltered.getLength() ) )
+ return false;
+ if( ! rWriteContext.write( ")", 1 ) )
+ return false;
+ }
+ return true;
+ }
+ return rWriteContext.write( m_aString.getStr(), m_aString.getLength() );
+}
+
+PDFEntry* PDFString::clone() const
+{
+ return new PDFString( m_aString );
+}
+
+OString PDFString::getFilteredString() const
+{
+ int nLen = m_aString.getLength();
+ OStringBuffer aBuf( nLen );
+
+ const char* pStr = m_aString.getStr();
+ if( *pStr == '(' )
+ {
+ const char* pRun = pStr+1;
+ while( pRun - pStr < nLen-1 )
+ {
+ if( *pRun == '\\' )
+ {
+ pRun++;
+ if( pRun - pStr < nLen )
+ {
+ char aEsc = 0;
+ if( *pRun == 'n' )
+ aEsc = '\n';
+ else if( *pRun == 'r' )
+ aEsc = '\r';
+ else if( *pRun == 't' )
+ aEsc = '\t';
+ else if( *pRun == 'b' )
+ aEsc = '\b';
+ else if( *pRun == 'f' )
+ aEsc = '\f';
+ else if( *pRun == '(' )
+ aEsc = '(';
+ else if( *pRun == ')' )
+ aEsc = ')';
+ else if( *pRun == '\\' )
+ aEsc = '\\';
+ else if( *pRun == '\n' )
+ {
+ pRun++;
+ continue;
+ }
+ else if( *pRun == '\r' )
+ {
+ pRun++;
+ if( *pRun == '\n' )
+ pRun++;
+ continue;
+ }
+ else
+ {
+ int i = 0;
+ while( i++ < 3 && *pRun >= '0' && *pRun <= '7' )
+ aEsc = 8*aEsc + (*pRun++ - '0');
+ // move pointer back to last character of octal sequence
+ pRun--;
+ }
+ aBuf.append( aEsc );
+ }
+ }
+ else
+ aBuf.append( *pRun );
+ // move pointer to next character
+ pRun++;
+ }
+ }
+ else if( *pStr == '<' )
+ {
+ const char* pRun = pStr+1;
+ while( *pRun != '>' && pRun - pStr < nLen )
+ {
+ char rResult = 0;
+ if( *pRun >= '0' && *pRun <= '9' )
+ rResult = char( ( *pRun-'0' ) << 4 );
+ else if( *pRun >= 'a' && *pRun <= 'f' )
+ rResult = char( ( *pRun-'a' + 10 ) << 4 );
+ else if( *pRun >= 'A' && *pRun <= 'F' )
+ rResult = char( ( *pRun-'A' + 10 ) << 4 );
+ pRun++;
+ if( *pRun != '>' && pRun - pStr < nLen )
+ {
+ if( *pRun >= '0' && *pRun <= '9' )
+ rResult |= char( *pRun-'0' );
+ else if( *pRun >= 'a' && *pRun <= 'f' )
+ rResult |= char( *pRun-'a' + 10 );
+ else if( *pRun >= 'A' && *pRun <= 'F' )
+ rResult |= char( *pRun-'A' + 10 );
+ }
+ pRun++;
+ aBuf.append( rResult );
+ }
+ }
+
+ return aBuf.makeStringAndClear();
+}
+
+PDFNumber::~PDFNumber()
+{
+}
+
+bool PDFNumber::emit( EmitContext& rWriteContext ) const
+{
+ OStringBuffer aBuf( 32 );
+ aBuf.append( ' ' );
+
+ double fValue = m_fValue;
+ bool bNeg = false;
+ int nPrecision = 5;
+ if( fValue < 0.0 )
+ {
+ bNeg = true;
+ fValue=-fValue;
+ }
+
+ sal_Int64 nInt = static_cast<sal_Int64>(fValue);
+ fValue -= static_cast<double>(nInt);
+ // optimizing hardware may lead to a value of 1.0 after the subtraction
+ if( fValue == 1.0 || log10( 1.0-fValue ) <= -nPrecision )
+ {
+ nInt++;
+ fValue = 0.0;
+ }
+ sal_Int64 nFrac = 0;
+ if( fValue )
+ {
+ fValue *= pow( 10.0, static_cast<double>(nPrecision) );
+ nFrac = static_cast<sal_Int64>(fValue);
+ }
+ if( bNeg && ( nInt || nFrac ) )
+ aBuf.append( '-' );
+ aBuf.append( nInt );
+ if( nFrac )
+ {
+ int i;
+ aBuf.append( '.' );
+ sal_Int64 nBound = static_cast<sal_Int64>(pow( 10.0, nPrecision - 1.0 )+0.5);
+ for ( i = 0; ( i < nPrecision ) && nFrac; i++ )
+ {
+ sal_Int64 nNumb = nFrac / nBound;
+ nFrac -= nNumb * nBound;
+ aBuf.append( nNumb );
+ nBound /= 10;
+ }
+ }
+
+ return rWriteContext.write( aBuf.getStr(), aBuf.getLength() );
+}
+
+PDFEntry* PDFNumber::clone() const
+{
+ return new PDFNumber( m_fValue );
+}
+
+
+PDFBool::~PDFBool()
+{
+}
+
+bool PDFBool::emit( EmitContext& rWriteContext ) const
+{
+ return m_bValue ? rWriteContext.write( " true", 5 ) : rWriteContext.write( " false", 6 );
+}
+
+PDFEntry* PDFBool::clone() const
+{
+ return new PDFBool( m_bValue );
+}
+
+PDFNull::~PDFNull()
+{
+}
+
+bool PDFNull::emit( EmitContext& rWriteContext ) const
+{
+ return rWriteContext.write( " null", 5 );
+}
+
+PDFEntry* PDFNull::clone() const
+{
+ return new PDFNull();
+}
+
+
+PDFObjectRef::~PDFObjectRef()
+{
+}
+
+bool PDFObjectRef::emit( EmitContext& rWriteContext ) const
+{
+ OString aBuf =
+ " " +
+ OString::number( sal_Int32( m_nNumber ) ) +
+ " " +
+ OString::number( sal_Int32( m_nGeneration ) ) +
+ " R";
+ return rWriteContext.write( aBuf.getStr(), aBuf.getLength() );
+}
+
+PDFEntry* PDFObjectRef::clone() const
+{
+ return new PDFObjectRef( m_nNumber, m_nGeneration );
+}
+
+PDFContainer::~PDFContainer()
+{
+}
+
+bool PDFContainer::emitSubElements( EmitContext& rWriteContext ) const
+{
+ int nEle = m_aSubElements.size();
+ for( int i = 0; i < nEle; i++ )
+ {
+ if( rWriteContext.m_bDecrypt )
+ {
+ const PDFName* pName = dynamic_cast<PDFName*>(m_aSubElements[i].get());
+ if (pName && pName->m_aName == "Encrypt")
+ {
+ i++;
+ continue;
+ }
+ }
+ if( ! m_aSubElements[i]->emit( rWriteContext ) )
+ return false;
+ }
+ return true;
+}
+
+void PDFContainer::cloneSubElements( std::vector<std::unique_ptr<PDFEntry>>& rNewSubElements ) const
+{
+ int nEle = m_aSubElements.size();
+ for( int i = 0; i < nEle; i++ )
+ rNewSubElements.emplace_back( m_aSubElements[i]->clone() );
+}
+
+PDFObject* PDFContainer::findObject( unsigned int nNumber, unsigned int nGeneration ) const
+{
+ unsigned int nEle = m_aSubElements.size();
+ for( unsigned int i = 0; i < nEle; i++ )
+ {
+ PDFObject* pObject = dynamic_cast<PDFObject*>(m_aSubElements[i].get());
+ if( pObject &&
+ pObject->m_nNumber == nNumber &&
+ pObject->m_nGeneration == nGeneration )
+ {
+ return pObject;
+ }
+ }
+ return nullptr;
+}
+
+PDFArray::~PDFArray()
+{
+}
+
+bool PDFArray::emit( EmitContext& rWriteContext ) const
+{
+ if( ! rWriteContext.write( "[", 1 ) )
+ return false;
+ if( ! emitSubElements( rWriteContext ) )
+ return false;
+ return rWriteContext.write( "]", 1 );
+}
+
+PDFEntry* PDFArray::clone() const
+{
+ PDFArray* pNewAr = new PDFArray();
+ cloneSubElements( pNewAr->m_aSubElements );
+ return pNewAr;
+}
+
+PDFDict::~PDFDict()
+{
+}
+
+bool PDFDict::emit( EmitContext& rWriteContext ) const
+{
+ if( ! rWriteContext.write( "<<\n", 3 ) )
+ return false;
+ if( ! emitSubElements( rWriteContext ) )
+ return false;
+ return rWriteContext.write( "\n>>\n", 4 );
+}
+
+void PDFDict::insertValue( const OString& rName, std::unique_ptr<PDFEntry> pValue )
+{
+ if( ! pValue )
+ eraseValue( rName );
+
+ PDFEntry* pValueTmp = nullptr;
+ std::unordered_map<OString,PDFEntry*>::iterator it = m_aMap.find( rName );
+ if( it == m_aMap.end() )
+ {
+ // new name/value, pair, append it
+ m_aSubElements.emplace_back(std::make_unique<PDFName>(rName));
+ m_aSubElements.emplace_back( std::move(pValue) );
+ pValueTmp = m_aSubElements.back().get();
+ }
+ else
+ {
+ unsigned int nSub = m_aSubElements.size();
+ for( unsigned int i = 0; i < nSub; i++ )
+ if( m_aSubElements[i].get() == it->second )
+ {
+ m_aSubElements[i] = std::move(pValue);
+ pValueTmp = m_aSubElements[i].get();
+ break;
+ }
+ }
+ assert(pValueTmp);
+ m_aMap[ rName ] = pValueTmp;
+}
+
+void PDFDict::eraseValue( std::string_view rName )
+{
+ unsigned int nEle = m_aSubElements.size();
+ for( unsigned int i = 0; i < nEle; i++ )
+ {
+ PDFName* pName = dynamic_cast<PDFName*>(m_aSubElements[i].get());
+ if( pName && pName->m_aName == rName )
+ {
+ for( unsigned int j = i+1; j < nEle; j++ )
+ {
+ if( dynamic_cast<PDFComment*>(m_aSubElements[j].get()) == nullptr )
+ {
+ // remove and free subelements from vector
+ m_aSubElements.erase( m_aSubElements.begin()+j );
+ m_aSubElements.erase( m_aSubElements.begin()+i );
+ buildMap();
+ return;
+ }
+ }
+ }
+ }
+}
+
+PDFEntry* PDFDict::buildMap()
+{
+ // clear map
+ m_aMap.clear();
+ // build map
+ unsigned int nEle = m_aSubElements.size();
+ PDFName* pName = nullptr;
+ for( unsigned int i = 0; i < nEle; i++ )
+ {
+ if( dynamic_cast<PDFComment*>(m_aSubElements[i].get()) == nullptr )
+ {
+ if( pName )
+ {
+ m_aMap[ pName->m_aName ] = m_aSubElements[i].get();
+ pName = nullptr;
+ }
+ else if( (pName = dynamic_cast<PDFName*>(m_aSubElements[i].get())) == nullptr )
+ return m_aSubElements[i].get();
+ }
+ }
+ return pName;
+}
+
+PDFEntry* PDFDict::clone() const
+{
+ PDFDict* pNewDict = new PDFDict();
+ cloneSubElements( pNewDict->m_aSubElements );
+ pNewDict->buildMap();
+ return pNewDict;
+}
+
+PDFStream::~PDFStream()
+{
+}
+
+bool PDFStream::emit( EmitContext& rWriteContext ) const
+{
+ return rWriteContext.copyOrigBytes( m_nBeginOffset, m_nEndOffset-m_nBeginOffset );
+}
+
+PDFEntry* PDFStream::clone() const
+{
+ return new PDFStream( m_nBeginOffset, m_nEndOffset, nullptr );
+}
+
+unsigned int PDFStream::getDictLength( const PDFContainer* pContainer ) const
+{
+ if( ! m_pDict )
+ return 0;
+ // find /Length entry, can either be a direct or indirect number object
+ std::unordered_map<OString,PDFEntry*>::const_iterator it =
+ m_pDict->m_aMap.find( "Length" );
+ if( it == m_pDict->m_aMap.end() )
+ return 0;
+ PDFNumber* pNum = dynamic_cast<PDFNumber*>(it->second);
+ if( ! pNum && pContainer )
+ {
+ PDFObjectRef* pRef = dynamic_cast<PDFObjectRef*>(it->second);
+ if( pRef )
+ {
+ int nEle = pContainer->m_aSubElements.size();
+ for (int i = 0; i < nEle; i++)
+ {
+ PDFObject* pObj = dynamic_cast<PDFObject*>(pContainer->m_aSubElements[i].get());
+ if( pObj &&
+ pObj->m_nNumber == pRef->m_nNumber &&
+ pObj->m_nGeneration == pRef->m_nGeneration )
+ {
+ if( pObj->m_pObject )
+ pNum = dynamic_cast<PDFNumber*>(pObj->m_pObject);
+ break;
+ }
+ }
+ }
+ }
+ return pNum ? static_cast<unsigned int>(pNum->m_fValue) : 0;
+}
+
+PDFObject::~PDFObject()
+{
+}
+
+bool PDFObject::getDeflatedStream( std::unique_ptr<char[]>& rpStream, unsigned int* pBytes, const PDFContainer* pObjectContainer, EmitContext& rContext ) const
+{
+ bool bIsDeflated = false;
+ if( m_pStream && m_pStream->m_pDict &&
+ m_pStream->m_nEndOffset > m_pStream->m_nBeginOffset+15
+ )
+ {
+ unsigned int nOuterStreamLen = m_pStream->m_nEndOffset - m_pStream->m_nBeginOffset;
+ rpStream.reset(new char[ nOuterStreamLen ]);
+ unsigned int nRead = rContext.readOrigBytes( m_pStream->m_nBeginOffset, nOuterStreamLen, rpStream.get() );
+ if( nRead != nOuterStreamLen )
+ {
+ rpStream.reset();
+ *pBytes = 0;
+ return false;
+ }
+ // is there a filter entry ?
+ std::unordered_map<OString,PDFEntry*>::const_iterator it =
+ m_pStream->m_pDict->m_aMap.find( "Filter" );
+ if( it != m_pStream->m_pDict->m_aMap.end() )
+ {
+ PDFName* pFilter = dynamic_cast<PDFName*>(it->second);
+ if( ! pFilter )
+ {
+ PDFArray* pArray = dynamic_cast<PDFArray*>(it->second);
+ if( pArray && ! pArray->m_aSubElements.empty() )
+ {
+ pFilter = dynamic_cast<PDFName*>(pArray->m_aSubElements.front().get());
+ }
+ }
+
+ // is the (first) filter FlateDecode ?
+ if (pFilter && pFilter->m_aName == "FlateDecode")
+ {
+ bIsDeflated = true;
+ }
+ }
+ // prepare compressed data section
+ char* pStream = rpStream.get();
+ if( pStream[0] == 's' )
+ pStream += 6; // skip "stream"
+ // skip line end after "stream"
+ while( *pStream == '\r' || *pStream == '\n' )
+ pStream++;
+ // get the compressed length
+ *pBytes = m_pStream->getDictLength( pObjectContainer );
+ if( pStream != rpStream.get() )
+ memmove( rpStream.get(), pStream, *pBytes );
+ if( rContext.m_bDecrypt )
+ {
+ EmitImplData* pEData = getEmitData( rContext );
+ pEData->decrypt( reinterpret_cast<const sal_uInt8*>(rpStream.get()),
+ *pBytes,
+ reinterpret_cast<sal_uInt8*>(rpStream.get()),
+ m_nNumber,
+ m_nGeneration
+ ); // decrypt inplace
+ }
+ }
+ else
+ {
+ *pBytes = 0;
+ }
+ return bIsDeflated;
+}
+
+static void unzipToBuffer( char* pBegin, unsigned int nLen,
+ sal_uInt8** pOutBuf, sal_uInt32* pOutLen )
+{
+ z_stream aZStr;
+ aZStr.next_in = reinterpret_cast<Bytef *>(pBegin);
+ aZStr.avail_in = nLen;
+ aZStr.total_out = aZStr.total_in = 0;
+ aZStr.zalloc = nullptr;
+ aZStr.zfree = nullptr;
+ aZStr.opaque = nullptr;
+
+ int err = inflateInit(&aZStr);
+
+ const unsigned int buf_increment_size = 16384;
+
+ if (auto p = static_cast<sal_uInt8*>(std::realloc(*pOutBuf, buf_increment_size)))
+ {
+ *pOutBuf = p;
+ aZStr.next_out = reinterpret_cast<Bytef*>(*pOutBuf);
+ aZStr.avail_out = buf_increment_size;
+ *pOutLen = buf_increment_size;
+ }
+ else
+ err = Z_MEM_ERROR;
+ while( err != Z_STREAM_END && err >= Z_OK && aZStr.avail_in )
+ {
+ err = inflate( &aZStr, Z_NO_FLUSH );
+ if( aZStr.avail_out == 0 )
+ {
+ if( err != Z_STREAM_END )
+ {
+ const int nNewAlloc = *pOutLen + buf_increment_size;
+ if (auto p = static_cast<sal_uInt8*>(std::realloc(*pOutBuf, nNewAlloc)))
+ {
+ *pOutBuf = p;
+ aZStr.next_out = reinterpret_cast<Bytef*>(*pOutBuf + *pOutLen);
+ aZStr.avail_out = buf_increment_size;
+ *pOutLen = nNewAlloc;
+ }
+ else
+ err = Z_MEM_ERROR;
+ }
+ }
+ }
+ if( err == Z_STREAM_END )
+ {
+ if( aZStr.avail_out > 0 )
+ *pOutLen -= aZStr.avail_out;
+ }
+ inflateEnd(&aZStr);
+ if( err < Z_OK )
+ {
+ std::free( *pOutBuf );
+ *pOutBuf = nullptr;
+ *pOutLen = 0;
+ }
+}
+
+void PDFObject::writeStream( EmitContext& rWriteContext, const PDFFile* pParsedFile ) const
+{
+ if( !m_pStream )
+ return;
+
+ std::unique_ptr<char[]> pStream;
+ unsigned int nBytes = 0;
+ if( getDeflatedStream( pStream, &nBytes, pParsedFile, rWriteContext ) && nBytes && rWriteContext.m_bDeflate )
+ {
+ sal_uInt8* pOutBytes = nullptr;
+ sal_uInt32 nOutBytes = 0;
+ unzipToBuffer( pStream.get(), nBytes, &pOutBytes, &nOutBytes );
+ rWriteContext.write( pOutBytes, nOutBytes );
+ std::free( pOutBytes );
+ }
+ else if( pStream && nBytes )
+ rWriteContext.write( pStream.get(), nBytes );
+}
+
+bool PDFObject::emit( EmitContext& rWriteContext ) const
+{
+ if( ! rWriteContext.write( "\n", 1 ) )
+ return false;
+
+ EmitImplData* pEData = getEmitData( rWriteContext );
+ if( pEData )
+ pEData->insertXref( m_nNumber, m_nGeneration, rWriteContext.getCurPos() );
+
+ OString aBuf =
+ OString::number( sal_Int32( m_nNumber ) ) +
+ " " +
+ OString::number( sal_Int32( m_nGeneration ) ) +
+ " obj\n";
+ if( ! rWriteContext.write( aBuf.getStr(), aBuf.getLength() ) )
+ return false;
+
+ if( pEData )
+ pEData->setDecryptObject( m_nNumber, m_nGeneration );
+ if( (rWriteContext.m_bDeflate || rWriteContext.m_bDecrypt) && pEData )
+ {
+ std::unique_ptr<char[]> pStream;
+ unsigned int nBytes = 0;
+ bool bDeflate = getDeflatedStream( pStream, &nBytes, pEData->m_pObjectContainer, rWriteContext );
+ if( pStream && nBytes )
+ {
+ // unzip the stream
+ sal_uInt8* pOutBytes = nullptr;
+ sal_uInt32 nOutBytes = 0;
+ if( bDeflate && rWriteContext.m_bDeflate )
+ unzipToBuffer( pStream.get(), nBytes, &pOutBytes, &nOutBytes );
+ else
+ {
+ // nothing to deflate, but decryption has happened
+ pOutBytes = reinterpret_cast<sal_uInt8*>(pStream.get());
+ nOutBytes = static_cast<sal_uInt32>(nBytes);
+ }
+
+ if( nOutBytes )
+ {
+ // clone this object
+ std::unique_ptr<PDFObject> pClone(static_cast<PDFObject*>(clone()));
+ // set length in the dictionary to new stream length
+ std::unique_ptr<PDFNumber> pNewLen(new PDFNumber( double(nOutBytes) ));
+ pClone->m_pStream->m_pDict->insertValue( "Length", std::move(pNewLen) );
+
+ if( bDeflate && rWriteContext.m_bDeflate )
+ {
+ // delete flatedecode filter
+ std::unordered_map<OString,PDFEntry*>::const_iterator it =
+ pClone->m_pStream->m_pDict->m_aMap.find( "Filter" );
+ if( it != pClone->m_pStream->m_pDict->m_aMap.end() )
+ {
+ PDFName* pFilter = dynamic_cast<PDFName*>(it->second);
+ if (pFilter && pFilter->m_aName == "FlateDecode")
+ pClone->m_pStream->m_pDict->eraseValue( "Filter" );
+ else
+ {
+ PDFArray* pArray = dynamic_cast<PDFArray*>(it->second);
+ if( pArray && ! pArray->m_aSubElements.empty() )
+ {
+ pFilter = dynamic_cast<PDFName*>(pArray->m_aSubElements.front().get());
+ if (pFilter && pFilter->m_aName == "FlateDecode")
+ {
+ pArray->m_aSubElements.erase( pArray->m_aSubElements.begin() );
+ }
+ }
+ }
+ }
+ }
+
+ // write sub elements except stream
+ bool bRet = true;
+ unsigned int nEle = pClone->m_aSubElements.size();
+ for( unsigned int i = 0; i < nEle && bRet; i++ )
+ {
+ if( pClone->m_aSubElements[i].get() != pClone->m_pStream )
+ bRet = pClone->m_aSubElements[i]->emit( rWriteContext );
+ }
+ pClone.reset();
+ // write stream
+ if( bRet )
+ bRet = rWriteContext.write("stream\n", 7)
+ && rWriteContext.write(pOutBytes, nOutBytes)
+ && rWriteContext.write("\nendstream\nendobj\n", 18);
+ if( pOutBytes != reinterpret_cast<sal_uInt8*>(pStream.get()) )
+ std::free( pOutBytes );
+ pEData->setDecryptObject( 0, 0 );
+ return bRet;
+ }
+ if( pOutBytes != reinterpret_cast<sal_uInt8*>(pStream.get()) )
+ std::free( pOutBytes );
+ }
+ }
+
+ bool bRet = emitSubElements( rWriteContext ) &&
+ rWriteContext.write( "\nendobj\n", 8 );
+ if( pEData )
+ pEData->setDecryptObject( 0, 0 );
+ return bRet;
+}
+
+PDFEntry* PDFObject::clone() const
+{
+ PDFObject* pNewOb = new PDFObject( m_nNumber, m_nGeneration );
+ cloneSubElements( pNewOb->m_aSubElements );
+ unsigned int nEle = m_aSubElements.size();
+ for( unsigned int i = 0; i < nEle; i++ )
+ {
+ if( m_aSubElements[i].get() == m_pObject )
+ pNewOb->m_pObject = pNewOb->m_aSubElements[i].get();
+ else if( m_aSubElements[i].get() == m_pStream && pNewOb->m_pObject )
+ {
+ pNewOb->m_pStream = dynamic_cast<PDFStream*>(pNewOb->m_aSubElements[i].get());
+ PDFDict* pNewDict = dynamic_cast<PDFDict*>(pNewOb->m_pObject);
+ if (pNewDict && pNewOb->m_pStream)
+ pNewOb->m_pStream->m_pDict = pNewDict;
+ }
+ }
+ return pNewOb;
+}
+
+PDFTrailer::~PDFTrailer()
+{
+}
+
+bool PDFTrailer::emit( EmitContext& rWriteContext ) const
+{
+ // get xref offset
+ unsigned int nXRefPos = rWriteContext.getCurPos();
+ // begin xref section, object 0 is always free
+ if( ! rWriteContext.write( "xref\r\n"
+ "0 1\r\n"
+ "0000000000 65535 f\r\n", 31 ) )
+ return false;
+ // check if we are emitting a complete PDF file
+ EmitImplData* pEData = getEmitData( rWriteContext );
+ if( pEData )
+ {
+ // emit object xrefs
+ const EmitImplData::XRefTable& rXRefs = pEData->m_aXRefTable;
+ EmitImplData::XRefTable::const_iterator section_begin, section_end;
+ section_begin = rXRefs.begin();
+ while( section_begin != rXRefs.end() )
+ {
+ // find end of continuous object numbers
+ section_end = section_begin;
+ unsigned int nLast = section_begin->first;
+ while( (++section_end) != rXRefs.end() &&
+ section_end->first == nLast+1 )
+ nLast = section_end->first;
+ // write first object number and number of following entries
+ OStringBuffer aBuf( 21 );
+ aBuf.append( sal_Int32( section_begin->first ) );
+ aBuf.append( ' ' );
+ aBuf.append( sal_Int32(nLast - section_begin->first + 1) );
+ aBuf.append( "\r\n" );
+ if( ! rWriteContext.write( aBuf.getStr(), aBuf.getLength() ) )
+ return false;
+ while( section_begin != section_end )
+ {
+ // write 20 char entry of form
+ // 0000offset 00gen n\r\n
+ aBuf.setLength( 0 );
+ OString aOffset( OString::number( section_begin->second.second ) );
+ int nPad = 10 - aOffset.getLength();
+ for( int i = 0; i < nPad; i++ )
+ aBuf.append( '0' );
+ aBuf.append( aOffset );
+ aBuf.append( ' ' );
+ OString aGeneration( OString::number( section_begin->second.first ) );
+ nPad = 5 - aGeneration.getLength();
+ for( int i = 0; i < nPad; i++ )
+ aBuf.append( '0' );
+ aBuf.append( aGeneration );
+ aBuf.append( " n\r\n" );
+ if( ! rWriteContext.write( aBuf.getStr(), 20 ) )
+ return false;
+ ++section_begin;
+ }
+ }
+ }
+ if( ! rWriteContext.write( "trailer\n", 8 ) )
+ return false;
+ if( ! emitSubElements( rWriteContext ) )
+ return false;
+ if( ! rWriteContext.write( "startxref\n", 10 ) )
+ return false;
+ OString aOffset( OString::number( nXRefPos ) );
+ if( ! rWriteContext.write( aOffset.getStr(), aOffset.getLength() ) )
+ return false;
+ return rWriteContext.write( "\n%%EOF\n", 7 );
+}
+
+PDFEntry* PDFTrailer::clone() const
+{
+ PDFTrailer* pNewTr = new PDFTrailer();
+ cloneSubElements( pNewTr->m_aSubElements );
+ unsigned int nEle = m_aSubElements.size();
+ for( unsigned int i = 0; i < nEle; i++ )
+ {
+ if( m_aSubElements[i].get() == m_pDict )
+ {
+ pNewTr->m_pDict = dynamic_cast<PDFDict*>(pNewTr->m_aSubElements[i].get());
+ break;
+ }
+ }
+ return pNewTr;
+}
+
+#define ENCRYPTION_KEY_LEN 16
+#define ENCRYPTION_BUF_LEN 32
+
+namespace pdfparse {
+struct PDFFileImplData
+{
+ bool m_bIsEncrypted;
+ bool m_bStandardHandler;
+ sal_uInt32 m_nAlgoVersion;
+ sal_uInt32 m_nStandardRevision;
+ sal_uInt32 m_nKeyLength;
+ sal_uInt8 m_aOEntry[32] = {};
+ sal_uInt8 m_aUEntry[32] = {};
+ sal_uInt32 m_nPEntry;
+ OString m_aDocID;
+ rtlCipher m_aCipher;
+
+ sal_uInt8 m_aDecryptionKey[ENCRYPTION_KEY_LEN+5] = {}; // maximum handled key length
+
+ PDFFileImplData() :
+ m_bIsEncrypted( false ),
+ m_bStandardHandler( false ),
+ m_nAlgoVersion( 0 ),
+ m_nStandardRevision( 0 ),
+ m_nKeyLength( 0 ),
+ m_nPEntry( 0 ),
+ m_aCipher( nullptr )
+ {
+ }
+
+ ~PDFFileImplData()
+ {
+ if( m_aCipher )
+ rtl_cipher_destroyARCFOUR( m_aCipher );
+ }
+};
+}
+
+PDFFile::PDFFile()
+ : m_nMajor( 0 ), m_nMinor( 0 )
+{
+}
+
+PDFFile::~PDFFile()
+{
+}
+
+bool PDFFile::isEncrypted() const
+{
+ return impl_getData()->m_bIsEncrypted;
+}
+
+bool PDFFile::decrypt( const sal_uInt8* pInBuffer, sal_uInt32 nLen, sal_uInt8* pOutBuffer,
+ unsigned int nObject, unsigned int nGeneration ) const
+{
+ if( ! isEncrypted() )
+ return false;
+
+ if( ! m_pData->m_aCipher )
+ m_pData->m_aCipher = rtl_cipher_createARCFOUR( rtl_Cipher_ModeStream );
+
+ // modify encryption key
+ sal_uInt32 i = m_pData->m_nKeyLength;
+ m_pData->m_aDecryptionKey[i++] = sal_uInt8(nObject&0xff);
+ m_pData->m_aDecryptionKey[i++] = sal_uInt8((nObject>>8)&0xff);
+ m_pData->m_aDecryptionKey[i++] = sal_uInt8((nObject>>16)&0xff);
+ m_pData->m_aDecryptionKey[i++] = sal_uInt8(nGeneration&0xff);
+ m_pData->m_aDecryptionKey[i++] = sal_uInt8((nGeneration>>8)&0xff);
+
+ ::std::vector<unsigned char> const aSum(::comphelper::Hash::calculateHash(
+ m_pData->m_aDecryptionKey, i, ::comphelper::HashType::MD5));
+
+ if( i > 16 )
+ i = 16;
+
+ rtlCipherError aErr = rtl_cipher_initARCFOUR( m_pData->m_aCipher,
+ rtl_Cipher_DirectionDecode,
+ aSum.data(), i,
+ nullptr, 0 );
+ if( aErr == rtl_Cipher_E_None )
+ aErr = rtl_cipher_decodeARCFOUR( m_pData->m_aCipher,
+ pInBuffer, nLen,
+ pOutBuffer, nLen );
+ return aErr == rtl_Cipher_E_None;
+}
+
+const sal_uInt8 nPadString[32] =
+{
+ 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
+ 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A
+};
+
+static void pad_or_truncate_to_32( const OString& rStr, char* pBuffer )
+{
+ int nLen = rStr.getLength();
+ if( nLen > 32 )
+ nLen = 32;
+ const char* pStr = rStr.getStr();
+ memcpy( pBuffer, pStr, nLen );
+ int i = 0;
+ while( nLen < 32 )
+ pBuffer[nLen++] = nPadString[i++];
+}
+
+// pass at least pData->m_nKeyLength bytes in
+static sal_uInt32 password_to_key( const OString& rPwd, sal_uInt8* pOutKey, PDFFileImplData const * pData, bool bComputeO )
+{
+ // see PDF reference 1.4 Algorithm 3.2
+ // encrypt pad string
+ char aPadPwd[ENCRYPTION_BUF_LEN];
+ pad_or_truncate_to_32( rPwd, aPadPwd );
+ ::comphelper::Hash aDigest(::comphelper::HashType::MD5);
+ aDigest.update(reinterpret_cast<unsigned char const*>(aPadPwd), sizeof(aPadPwd));
+ if( ! bComputeO )
+ {
+ aDigest.update(pData->m_aOEntry, 32);
+ sal_uInt8 aPEntry[4];
+ aPEntry[0] = static_cast<sal_uInt8>(pData->m_nPEntry & 0xff);
+ aPEntry[1] = static_cast<sal_uInt8>((pData->m_nPEntry >> 8 ) & 0xff);
+ aPEntry[2] = static_cast<sal_uInt8>((pData->m_nPEntry >> 16) & 0xff);
+ aPEntry[3] = static_cast<sal_uInt8>((pData->m_nPEntry >> 24) & 0xff);
+ aDigest.update(aPEntry, sizeof(aPEntry));
+ aDigest.update(reinterpret_cast<unsigned char const*>(pData->m_aDocID.getStr()), pData->m_aDocID.getLength());
+ }
+ ::std::vector<unsigned char> nSum(aDigest.finalize());
+ if( pData->m_nStandardRevision == 3 )
+ {
+ for( int i = 0; i < 50; i++ )
+ {
+ nSum = ::comphelper::Hash::calculateHash(nSum.data(), nSum.size(),
+ ::comphelper::HashType::MD5);
+ }
+ }
+ sal_uInt32 nLen = pData->m_nKeyLength;
+ if( nLen > RTL_DIGEST_LENGTH_MD5 )
+ nLen = RTL_DIGEST_LENGTH_MD5;
+ memcpy( pOutKey, nSum.data(), nLen );
+ return nLen;
+}
+
+static bool check_user_password( const OString& rPwd, PDFFileImplData* pData )
+{
+ // see PDF reference 1.4 Algorithm 3.6
+ bool bValid = false;
+ sal_uInt8 aKey[ENCRYPTION_KEY_LEN];
+ sal_uInt32 nKeyLen = password_to_key( rPwd, aKey, pData, false );
+ // save (at this time potential) decryption key for later use
+ memcpy( pData->m_aDecryptionKey, aKey, nKeyLen );
+ if( pData->m_nStandardRevision == 2 )
+ {
+ sal_uInt8 nEncryptedEntry[ENCRYPTION_BUF_LEN] = {};
+ // see PDF reference 1.4 Algorithm 3.4
+ // encrypt pad string
+ if (rtl_cipher_initARCFOUR( pData->m_aCipher, rtl_Cipher_DirectionEncode,
+ aKey, nKeyLen,
+ nullptr, 0 )
+ != rtl_Cipher_E_None)
+ {
+ return false; //TODO: differentiate "failed to decrypt" from "wrong password"
+ }
+ rtl_cipher_encodeARCFOUR( pData->m_aCipher, nPadString, sizeof( nPadString ),
+ nEncryptedEntry, sizeof( nEncryptedEntry ) );
+ bValid = (memcmp( nEncryptedEntry, pData->m_aUEntry, 32 ) == 0);
+ }
+ else if( pData->m_nStandardRevision == 3 )
+ {
+ // see PDF reference 1.4 Algorithm 3.5
+ ::comphelper::Hash aDigest(::comphelper::HashType::MD5);
+ aDigest.update(nPadString, sizeof(nPadString));
+ aDigest.update(reinterpret_cast<unsigned char const*>(pData->m_aDocID.getStr()), pData->m_aDocID.getLength());
+ ::std::vector<unsigned char> nEncryptedEntry(aDigest.finalize());
+ if (rtl_cipher_initARCFOUR( pData->m_aCipher, rtl_Cipher_DirectionEncode,
+ aKey, sizeof(aKey), nullptr, 0 )
+ != rtl_Cipher_E_None)
+ {
+ return false; //TODO: differentiate "failed to decrypt" from "wrong password"
+ }
+ rtl_cipher_encodeARCFOUR( pData->m_aCipher,
+ nEncryptedEntry.data(), 16,
+ nEncryptedEntry.data(), 16 ); // encrypt in place
+ for( int i = 1; i <= 19; i++ ) // do it 19 times, start with 1
+ {
+ sal_uInt8 aTempKey[ENCRYPTION_KEY_LEN];
+ for( size_t j = 0; j < sizeof(aTempKey); j++ )
+ aTempKey[j] = static_cast<sal_uInt8>( aKey[j] ^ i );
+
+ if (rtl_cipher_initARCFOUR( pData->m_aCipher, rtl_Cipher_DirectionEncode,
+ aTempKey, sizeof(aTempKey), nullptr, 0 )
+ != rtl_Cipher_E_None)
+ {
+ return false; //TODO: differentiate "failed to decrypt" from "wrong password"
+ }
+ rtl_cipher_encodeARCFOUR( pData->m_aCipher,
+ nEncryptedEntry.data(), 16,
+ nEncryptedEntry.data(), 16 ); // encrypt in place
+ }
+ bValid = (memcmp( nEncryptedEntry.data(), pData->m_aUEntry, 16 ) == 0);
+ }
+ return bValid;
+}
+
+bool PDFFile::usesSupportedEncryptionFormat() const
+{
+ return m_pData->m_bStandardHandler &&
+ m_pData->m_nAlgoVersion >= 1 &&
+ m_pData->m_nAlgoVersion <= 2 &&
+ m_pData->m_nStandardRevision >= 2 &&
+ m_pData->m_nStandardRevision <= 3;
+}
+
+bool PDFFile::setupDecryptionData( const OString& rPwd ) const
+{
+ if( !impl_getData()->m_bIsEncrypted )
+ return rPwd.isEmpty();
+
+ // check if we can handle this encryption at all
+ if( ! usesSupportedEncryptionFormat() )
+ return false;
+
+ if( ! m_pData->m_aCipher )
+ m_pData->m_aCipher = rtl_cipher_createARCFOUR(rtl_Cipher_ModeStream);
+
+ // first try user password
+ bool bValid = check_user_password( rPwd, m_pData.get() );
+
+ if( ! bValid )
+ {
+ // try owner password
+ // see PDF reference 1.4 Algorithm 3.7
+ sal_uInt8 aKey[ENCRYPTION_KEY_LEN];
+ sal_uInt8 nPwd[ENCRYPTION_BUF_LEN] = {};
+ sal_uInt32 nKeyLen = password_to_key( rPwd, aKey, m_pData.get(), true );
+ if( m_pData->m_nStandardRevision == 2 )
+ {
+ if (rtl_cipher_initARCFOUR( m_pData->m_aCipher, rtl_Cipher_DirectionDecode,
+ aKey, nKeyLen, nullptr, 0 )
+ != rtl_Cipher_E_None)
+ {
+ return false; //TODO: differentiate "failed to decrypt" from "wrong password"
+ }
+ rtl_cipher_decodeARCFOUR( m_pData->m_aCipher,
+ m_pData->m_aOEntry, 32,
+ nPwd, 32 );
+ }
+ else if( m_pData->m_nStandardRevision == 3 )
+ {
+ memcpy( nPwd, m_pData->m_aOEntry, 32 );
+ for( int i = 19; i >= 0; i-- )
+ {
+ sal_uInt8 nTempKey[ENCRYPTION_KEY_LEN];
+ for( size_t j = 0; j < sizeof(nTempKey); j++ )
+ nTempKey[j] = sal_uInt8(aKey[j] ^ i);
+ if (rtl_cipher_initARCFOUR( m_pData->m_aCipher, rtl_Cipher_DirectionDecode,
+ nTempKey, nKeyLen, nullptr, 0 )
+ != rtl_Cipher_E_None)
+ {
+ return false; //TODO: differentiate "failed to decrypt" from "wrong password"
+ }
+ rtl_cipher_decodeARCFOUR( m_pData->m_aCipher,
+ nPwd, 32,
+ nPwd, 32 ); // decrypt inplace
+ }
+ }
+ bValid = check_user_password( OString( reinterpret_cast<char*>(nPwd), 32 ), m_pData.get() );
+ }
+
+ return bValid;
+}
+
+PDFFileImplData* PDFFile::impl_getData() const
+{
+ if( m_pData )
+ return m_pData.get();
+ m_pData.reset( new PDFFileImplData );
+ // check for encryption dict in a trailer
+ unsigned int nElements = m_aSubElements.size();
+ while( nElements-- > 0 )
+ {
+ PDFTrailer* pTrailer = dynamic_cast<PDFTrailer*>(m_aSubElements[nElements].get());
+ if( pTrailer && pTrailer->m_pDict )
+ {
+ // search doc id
+ PDFDict::Map::iterator doc_id = pTrailer->m_pDict->m_aMap.find( "ID" );
+ if( doc_id != pTrailer->m_pDict->m_aMap.end() )
+ {
+ PDFArray* pArr = dynamic_cast<PDFArray*>(doc_id->second);
+ if( pArr && !pArr->m_aSubElements.empty() )
+ {
+ PDFString* pStr = dynamic_cast<PDFString*>(pArr->m_aSubElements[0].get());
+ if( pStr )
+ m_pData->m_aDocID = pStr->getFilteredString();
+#if OSL_DEBUG_LEVEL > 0
+ OUStringBuffer aTmp;
+ for( int i = 0; i < m_pData->m_aDocID.getLength(); i++ )
+ aTmp.append(static_cast<sal_Int32>(sal_uInt8(m_pData->m_aDocID[i])), 16);
+ SAL_INFO("sdext.pdfimport.pdfparse", "DocId is <" << aTmp.makeStringAndClear() << ">");
+#endif
+ }
+ }
+ // search Encrypt entry
+ PDFDict::Map::iterator enc =
+ pTrailer->m_pDict->m_aMap.find( "Encrypt" );
+ if( enc != pTrailer->m_pDict->m_aMap.end() )
+ {
+ PDFDict* pDict = dynamic_cast<PDFDict*>(enc->second);
+ if( ! pDict )
+ {
+ PDFObjectRef* pRef = dynamic_cast<PDFObjectRef*>(enc->second);
+ if( pRef )
+ {
+ PDFObject* pObj = findObject( pRef );
+ if( pObj && pObj->m_pObject )
+ pDict = dynamic_cast<PDFDict*>(pObj->m_pObject);
+ }
+ }
+ if( pDict )
+ {
+ PDFDict::Map::iterator filter = pDict->m_aMap.find( "Filter" );
+ PDFDict::Map::iterator version = pDict->m_aMap.find( "V" );
+ PDFDict::Map::iterator len = pDict->m_aMap.find( "Length" );
+ PDFDict::Map::iterator o_ent = pDict->m_aMap.find( "O" );
+ PDFDict::Map::iterator u_ent = pDict->m_aMap.find( "U" );
+ PDFDict::Map::iterator r_ent = pDict->m_aMap.find( "R" );
+ PDFDict::Map::iterator p_ent = pDict->m_aMap.find( "P" );
+ if( filter != pDict->m_aMap.end() )
+ {
+ m_pData->m_bIsEncrypted = true;
+ m_pData->m_nKeyLength = 5;
+ if( version != pDict->m_aMap.end() )
+ {
+ PDFNumber* pNum = dynamic_cast<PDFNumber*>(version->second);
+ if( pNum )
+ m_pData->m_nAlgoVersion = static_cast<sal_uInt32>(pNum->m_fValue);
+ }
+ if( m_pData->m_nAlgoVersion >= 3 )
+ m_pData->m_nKeyLength = 16;
+ if( len != pDict->m_aMap.end() )
+ {
+ PDFNumber* pNum = dynamic_cast<PDFNumber*>(len->second);
+ if( pNum )
+ m_pData->m_nKeyLength = static_cast<sal_uInt32>(pNum->m_fValue) / 8;
+ }
+ PDFName* pFilter = dynamic_cast<PDFName*>(filter->second);
+ if( pFilter && pFilter->getFilteredName() == "Standard" )
+ m_pData->m_bStandardHandler = true;
+ if( o_ent != pDict->m_aMap.end() )
+ {
+ PDFString* pString = dynamic_cast<PDFString*>(o_ent->second);
+ if( pString )
+ {
+ OString aEnt = pString->getFilteredString();
+ if( aEnt.getLength() == 32 )
+ memcpy( m_pData->m_aOEntry, aEnt.getStr(), 32 );
+#if OSL_DEBUG_LEVEL > 0
+ else
+ {
+ OUStringBuffer aTmp;
+ for( int i = 0; i < aEnt.getLength(); i++ )
+ aTmp.append(" " + OUString::number(sal_uInt8(aEnt[i]), 16));
+ SAL_WARN("sdext.pdfimport.pdfparse",
+ "O entry has length " << static_cast<int>(aEnt.getLength()) << ", should be 32 <" << aTmp.makeStringAndClear() << ">" );
+ }
+#endif
+ }
+ }
+ if( u_ent != pDict->m_aMap.end() )
+ {
+ PDFString* pString = dynamic_cast<PDFString*>(u_ent->second);
+ if( pString )
+ {
+ OString aEnt = pString->getFilteredString();
+ if( aEnt.getLength() == 32 )
+ memcpy( m_pData->m_aUEntry, aEnt.getStr(), 32 );
+#if OSL_DEBUG_LEVEL > 0
+ else
+ {
+ OUStringBuffer aTmp;
+ for( int i = 0; i < aEnt.getLength(); i++ )
+ aTmp.append(" " + OUString::number(sal_uInt8(aEnt[i]), 16));
+ SAL_WARN("sdext.pdfimport.pdfparse",
+ "U entry has length " << static_cast<int>(aEnt.getLength()) << ", should be 32 <" << aTmp.makeStringAndClear() << ">" );
+ }
+#endif
+ }
+ }
+ if( r_ent != pDict->m_aMap.end() )
+ {
+ PDFNumber* pNum = dynamic_cast<PDFNumber*>(r_ent->second);
+ if( pNum )
+ m_pData->m_nStandardRevision = static_cast<sal_uInt32>(pNum->m_fValue);
+ }
+ if( p_ent != pDict->m_aMap.end() )
+ {
+ PDFNumber* pNum = dynamic_cast<PDFNumber*>(p_ent->second);
+ if( pNum )
+ m_pData->m_nPEntry = static_cast<sal_uInt32>(static_cast<sal_Int32>(pNum->m_fValue));
+ SAL_INFO("sdext.pdfimport.pdfparse", "p entry is " << m_pData->m_nPEntry );
+ }
+
+ SAL_INFO("sdext.pdfimport.pdfparse", "Encryption dict: sec handler: " << (pFilter ? pFilter->getFilteredName() : OUString("<unknown>")) << ", version = " << static_cast<int>(m_pData->m_nAlgoVersion) << ", revision = " << static_cast<int>(m_pData->m_nStandardRevision) << ", key length = " << m_pData->m_nKeyLength );
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return m_pData.get();
+}
+
+bool PDFFile::emit( EmitContext& rWriteContext ) const
+{
+ setEmitData( rWriteContext, new EmitImplData( this ) );
+
+ OString aBuf =
+ "%PDF-" +
+ OString::number( sal_Int32( m_nMajor ) ) +
+ "." +
+ OString::number( sal_Int32( m_nMinor ) ) +
+ "\n";
+ if( ! rWriteContext.write( aBuf.getStr(), aBuf.getLength() ) )
+ return false;
+ return emitSubElements( rWriteContext );
+}
+
+PDFEntry* PDFFile::clone() const
+{
+ PDFFile* pNewFl = new PDFFile();
+ pNewFl->m_nMajor = m_nMajor;
+ pNewFl->m_nMinor = m_nMinor;
+ cloneSubElements( pNewFl->m_aSubElements );
+ return pNewFl;
+}
+
+PDFPart::~PDFPart()
+{
+}
+
+bool PDFPart::emit( EmitContext& rWriteContext ) const
+{
+ return emitSubElements( rWriteContext );
+}
+
+PDFEntry* PDFPart::clone() const
+{
+ PDFPart* pNewPt = new PDFPart();
+ cloneSubElements( pNewPt->m_aSubElements );
+ return pNewPt;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/pdfparse/pdfparse.cxx b/sdext/source/pdfimport/pdfparse/pdfparse.cxx
new file mode 100644
index 000000000..bbdb51c5a
--- /dev/null
+++ b/sdext/source/pdfimport/pdfparse/pdfparse.cxx
@@ -0,0 +1,701 @@
+/* -*- 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 <pdfparse.hxx>
+
+// boost using obsolete stuff
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4996)
+#pragma warning(disable:4503)
+#endif
+
+// workaround windows compiler: do not include multi_pass.hpp
+#include <boost/spirit/include/classic_core.hpp>
+#include <boost/spirit/include/classic_utility.hpp>
+#include <boost/spirit/include/classic_error_handling.hpp>
+#include <boost/spirit/include/classic_file_iterator.hpp>
+#include <boost/bind/bind.hpp>
+
+#include <string.h>
+
+#include <o3tl/safeint.hxx>
+#include <rtl/strbuf.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <sal/log.hxx>
+
+// disable warnings again because someone along the line has enabled them
+// (we have included boost headers, what did you expect?)
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4996)
+#pragma warning(disable:4503)
+#endif
+
+
+using namespace boost::spirit::classic;
+using namespace pdfparse;
+
+namespace {
+
+class StringEmitContext : public EmitContext
+{
+ OStringBuffer m_aBuf;
+ public:
+ StringEmitContext() : m_aBuf(256) {}
+
+ virtual bool write( const void* pBuf, unsigned int nLen ) noexcept override
+ {
+ m_aBuf.append( static_cast<const char*>(pBuf), nLen );
+ return true;
+ }
+ virtual unsigned int getCurPos() noexcept override { return m_aBuf.getLength(); }
+ virtual bool copyOrigBytes( unsigned int nOrigOffset, unsigned int nLen ) noexcept override
+ { return (nOrigOffset+nLen < o3tl::make_unsigned(m_aBuf.getLength()) ) &&
+ write( m_aBuf.getStr() + nOrigOffset, nLen ); }
+ virtual unsigned int readOrigBytes( unsigned int nOrigOffset, unsigned int nLen, void* pBuf ) noexcept override
+ {
+ if( nOrigOffset+nLen < o3tl::make_unsigned(m_aBuf.getLength()) )
+ {
+ memcpy( pBuf, m_aBuf.getStr()+nOrigOffset, nLen );
+ return nLen;
+ }
+ return 0;
+ }
+
+ OString getString() { return m_aBuf.makeStringAndClear(); }
+};
+
+template< class iteratorT >
+class PDFGrammar : public grammar< PDFGrammar<iteratorT> >
+{
+public:
+
+ explicit PDFGrammar( const iteratorT& first )
+ : m_fDouble( 0.0 ), m_aGlobalBegin( first ) {}
+ ~PDFGrammar()
+ {
+ if( !m_aObjectStack.empty() )
+ delete m_aObjectStack.front();
+ }
+
+ double m_fDouble;
+ std::vector< unsigned int > m_aUIntStack;
+ std::vector< PDFEntry* > m_aObjectStack;
+ OString m_aErrorString;
+ iteratorT m_aGlobalBegin;
+
+public:
+ struct pdf_string_parser
+ {
+ typedef nil_t result_t;
+ template <typename ScannerT>
+ std::ptrdiff_t
+ operator()(ScannerT const& scan, result_t&) const
+ {
+ std::ptrdiff_t len = 0;
+
+ int nBraceLevel = 0;
+ while( ! scan.at_end() )
+ {
+ char c = *scan;
+ if( c == ')' )
+ {
+ nBraceLevel--;
+ if( nBraceLevel < 0 )
+ break;
+ }
+ else if( c == '(' )
+ nBraceLevel++;
+ else if( c == '\\' ) // ignore escaped braces
+ {
+ ++len;
+ ++scan.first; // tdf#63054: avoid skipping spaces
+ if( scan.first == scan.last ) // tdf#63054: avoid skipping spaces
+ break;
+ }
+ ++len;
+ ++scan;
+ }
+ return scan.at_end() ? -1 : len;
+ }
+ };
+
+ template< typename ScannerT >
+ struct definition
+ {
+ explicit definition( const PDFGrammar<iteratorT>& rSelf )
+ {
+ using namespace boost::placeholders;
+
+ PDFGrammar<iteratorT>* pSelf = const_cast< PDFGrammar<iteratorT>* >( &rSelf );
+
+ // workaround workshop compiler: comment_p doesn't work
+ // comment = comment_p("%")[boost::bind(&PDFGrammar::pushComment, pSelf, _1, _2 )];
+ comment = lexeme_d[ (ch_p('%') >> *(~ch_p('\r') & ~ch_p('\n')) >> eol_p)[boost::bind(&PDFGrammar::pushComment, pSelf, _1, _2 )] ];
+
+ boolean = (str_p("true") | str_p("false"))[boost::bind(&PDFGrammar::pushBool, pSelf, _1, _2)];
+
+ // workaround workshop compiler: confix_p doesn't work
+ //stream = confix_p( "stream", *anychar_p, "endstream" )[boost::bind(&PDFGrammar::emitStream, pSelf, _1, _2 )];
+ stream = (str_p("stream") >> *(anychar_p - str_p("endstream")) >> str_p("endstream"))[boost::bind(&PDFGrammar::emitStream, pSelf, _1, _2 )];
+
+ name = lexeme_d[
+ ch_p('/')
+ >> (*(anychar_p-chset_p("\t\n\f\r ()<>[]{}/%")-ch_p('\0')))
+ [boost::bind(&PDFGrammar::pushName, pSelf, _1, _2)] ];
+
+ // workaround workshop compiler: confix_p doesn't work
+ //stringtype = ( confix_p("(",*anychar_p, ")") |
+ // confix_p("<",*xdigit_p, ">") )
+ // [boost::bind(&PDFGrammar::pushString,pSelf, _1, _2)];
+
+ stringtype = ( ( ch_p('(') >> functor_parser<pdf_string_parser>() >> ch_p(')') ) |
+ ( ch_p('<') >> *xdigit_p >> ch_p('>') ) )
+ [boost::bind(&PDFGrammar::pushString,pSelf, _1, _2)];
+
+ null_object = str_p( "null" )[boost::bind(&PDFGrammar::pushNull, pSelf, _1, _2)];
+
+ #ifdef USE_ASSIGN_ACTOR
+ objectref = ( uint_p[push_back_a(pSelf->m_aUIntStack)]
+ >> uint_p[push_back_a(pSelf->m_aUIntStack)]
+ >> ch_p('R')
+ >> eps_p
+ )[boost::bind(&PDFGrammar::pushObjectRef, pSelf, _1, _2)];
+ #else
+ objectref = ( uint_p[boost::bind(&PDFGrammar::push_back_action_uint, pSelf, _1)]
+ >> uint_p[boost::bind(&PDFGrammar::push_back_action_uint, pSelf, _1)]
+ >> ch_p('R')
+ >> eps_p
+ )[boost::bind(&PDFGrammar::pushObjectRef, pSelf, _1, _2)];
+ #endif
+
+ #ifdef USE_ASSIGN_ACTOR
+ simple_type = objectref | name |
+ ( real_p[assign_a(pSelf->m_fDouble)] >> eps_p )
+ [boost::bind(&PDFGrammar::pushDouble, pSelf, _1, _2)]
+ | stringtype | boolean | null_object;
+ #else
+ simple_type = objectref | name |
+ ( real_p[boost::bind(&PDFGrammar::assign_action_double, pSelf, _1)] >> eps_p )
+ [boost::bind(&PDFGrammar::pushDouble, pSelf, _1, _2)]
+ | stringtype | boolean | null_object;
+ #endif
+
+ dict_begin = str_p( "<<" )[boost::bind(&PDFGrammar::beginDict, pSelf, _1, _2)];
+ dict_end = str_p( ">>" )[boost::bind(&PDFGrammar::endDict, pSelf, _1, _2)];
+
+ array_begin = str_p("[")[boost::bind(&PDFGrammar::beginArray,pSelf, _1, _2)];
+ array_end = str_p("]")[boost::bind(&PDFGrammar::endArray,pSelf, _1, _2)];
+
+ #ifdef USE_ASSIGN_ACTOR
+ object_begin= uint_p[push_back_a(pSelf->m_aUIntStack)]
+ >> uint_p[push_back_a(pSelf->m_aUIntStack)]
+ >> str_p("obj" )[boost::bind(&PDFGrammar::beginObject, pSelf, _1, _2)];
+ #else
+ object_begin= uint_p[boost::bind(&PDFGrammar::push_back_action_uint, pSelf, _1)]
+ >> uint_p[boost::bind(&PDFGrammar::push_back_action_uint, pSelf, _1)]
+ >> str_p("obj" )[boost::bind(&PDFGrammar::beginObject, pSelf, _1, _2)];
+ #endif
+ object_end = str_p( "endobj" )[boost::bind(&PDFGrammar::endObject, pSelf, _1, _2)];
+
+ xref = str_p( "xref" ) >> uint_p >> uint_p
+ >> lexeme_d[
+ +( repeat_p(10)[digit_p]
+ >> blank_p
+ >> repeat_p(5)[digit_p]
+ >> blank_p
+ >> ( ch_p('n') | ch_p('f') )
+ >> repeat_p(2)[space_p]
+ ) ];
+
+ dict_element= dict_begin | comment | simple_type
+ | array_begin | array_end | dict_end;
+
+ object = object_begin
+ >> *dict_element
+ >> !stream
+ >> object_end;
+
+ trailer = str_p( "trailer" )[boost::bind(&PDFGrammar::beginTrailer,pSelf,_1,_2)]
+ >> *dict_element
+ >> str_p("startxref")
+ >> uint_p
+ >> str_p("%%EOF")[boost::bind(&PDFGrammar::endTrailer,pSelf,_1,_2)];
+
+ #ifdef USE_ASSIGN_ACTOR
+ pdfrule = ! (lexeme_d[
+ str_p( "%PDF-" )
+ >> uint_p[push_back_a(pSelf->m_aUIntStack)]
+ >> ch_p('.')
+ >> uint_p[push_back_a(pSelf->m_aUIntStack)]
+ >> *((~ch_p('\r') & ~ch_p('\n')))
+ >> eol_p
+ ])[boost::bind(&PDFGrammar::haveFile,pSelf, _1, _2)]
+ >> *( comment | object | ( xref >> trailer ) );
+ #else
+ pdfrule = ! (lexeme_d[
+ str_p( "%PDF-" )
+ >> uint_p[boost::bind(&PDFGrammar::push_back_action_uint, pSelf, _1)]
+ >> ch_p('.')
+ >> uint_p[boost::bind(&PDFGrammar::push_back_action_uint, pSelf, _1)]
+ >> *(~ch_p('\r') & ~ch_p('\n'))
+ >> eol_p
+ ])[boost::bind(&PDFGrammar::haveFile,pSelf, _1, _2)]
+ >> *( comment | object | ( xref >> trailer ) );
+ #endif
+ }
+ rule< ScannerT > comment, stream, boolean, name, stringtype, null_object, simple_type,
+ objectref, array, value, dict_element, dict_begin, dict_end,
+ array_begin, array_end, object, object_begin, object_end,
+ xref, trailer, pdfrule;
+
+ const rule< ScannerT >& start() const { return pdfrule; }
+ };
+
+ #ifndef USE_ASSIGN_ACTOR
+ void push_back_action_uint( unsigned int i )
+ {
+ m_aUIntStack.push_back( i );
+ }
+ void assign_action_double( double d )
+ {
+ m_fDouble = d;
+ }
+ #endif
+
+ static void parseError( const char* pMessage, iteratorT pLocation )
+ {
+ throw_( pLocation, pMessage );
+ }
+
+ OString iteratorToString( iteratorT first, iteratorT last ) const
+ {
+ OStringBuffer aStr( 32 );
+ while( first != last )
+ {
+ aStr.append( *first );
+ ++first;
+ }
+ return aStr.makeStringAndClear();
+ }
+
+ void haveFile( iteratorT pBegin, SAL_UNUSED_PARAMETER iteratorT /*pEnd*/ )
+ {
+ if( m_aObjectStack.empty() )
+ {
+ PDFFile* pFile = new PDFFile();
+ pFile->m_nMinor = m_aUIntStack.back();
+ m_aUIntStack.pop_back();
+ pFile->m_nMajor = m_aUIntStack.back();
+ m_aUIntStack.pop_back();
+ m_aObjectStack.push_back( pFile );
+ }
+ else
+ parseError( "found file header in unusual place", pBegin );
+ }
+
+ void pushComment( iteratorT first, iteratorT last )
+ {
+ // add a comment to the current stack element
+ PDFComment* pComment =
+ new PDFComment(iteratorToString(first,last));
+ if( m_aObjectStack.empty() )
+ m_aObjectStack.push_back( new PDFPart() );
+ PDFContainer* pContainer = dynamic_cast<PDFContainer*>(m_aObjectStack.back());
+ if( pContainer == nullptr )
+ parseError( "comment without container", first );
+ pContainer->m_aSubElements.emplace_back( pComment );
+ }
+
+ void insertNewValue( std::unique_ptr<PDFEntry> pNewValue, iteratorT pPos )
+ {
+ PDFContainer* pContainer = nullptr;
+ const char* pMsg = nullptr;
+ if( ! m_aObjectStack.empty() )
+ {
+ pContainer = dynamic_cast<PDFContainer*>(m_aObjectStack.back());
+ if (pContainer)
+ {
+ if( dynamic_cast<PDFDict*>(pContainer) == nullptr &&
+ dynamic_cast<PDFArray*>(pContainer) == nullptr )
+ {
+ PDFObject* pObj = dynamic_cast<PDFObject*>(pContainer);
+ if( pObj )
+ {
+ if( pObj->m_pObject == nullptr )
+ pObj->m_pObject = pNewValue.get();
+ else
+ {
+ pMsg = "second value for object";
+ pContainer = nullptr;
+ }
+ }
+ else if( dynamic_cast<PDFDict*>(pNewValue.get()) )
+ {
+ PDFTrailer* pTrailer = dynamic_cast<PDFTrailer*>(pContainer);
+ if( pTrailer )
+ {
+ if( pTrailer->m_pDict == nullptr )
+ pTrailer->m_pDict = dynamic_cast<PDFDict*>(pNewValue.get());
+ else
+ pContainer = nullptr;
+ }
+ else
+ pContainer = nullptr;
+ }
+ else
+ pContainer = nullptr;
+ }
+ }
+ }
+ if( pContainer )
+ pContainer->m_aSubElements.emplace_back( std::move(pNewValue) );
+ else
+ {
+ if( ! pMsg )
+ {
+ if( dynamic_cast<PDFContainer*>(pNewValue.get()) )
+ pMsg = "array without container";
+ else
+ pMsg = "value without container";
+ }
+ parseError( pMsg, pPos );
+ }
+ }
+
+ void pushName( iteratorT first, iteratorT last )
+ {
+ insertNewValue( std::make_unique<PDFName>(iteratorToString(first,last)), first );
+ }
+
+ void pushDouble( iteratorT first, SAL_UNUSED_PARAMETER iteratorT /*last*/ )
+ {
+ insertNewValue( std::make_unique<PDFNumber>(m_fDouble), first );
+ }
+
+ void pushString( iteratorT first, iteratorT last )
+ {
+ insertNewValue( std::make_unique<PDFString>(iteratorToString(first,last)), first );
+ }
+
+ void pushBool( iteratorT first, iteratorT last )
+ {
+ insertNewValue( std::make_unique<PDFBool>( last-first == 4 ), first );
+ }
+
+ void pushNull( iteratorT first, SAL_UNUSED_PARAMETER iteratorT )
+ {
+ insertNewValue( std::make_unique<PDFNull>(), first );
+ }
+
+
+ void beginObject( iteratorT first, SAL_UNUSED_PARAMETER iteratorT /*last*/ )
+ {
+ if( m_aObjectStack.empty() )
+ m_aObjectStack.push_back( new PDFPart() );
+
+ unsigned int nGeneration = m_aUIntStack.back();
+ m_aUIntStack.pop_back();
+ unsigned int nObject = m_aUIntStack.back();
+ m_aUIntStack.pop_back();
+
+ PDFObject* pObj = new PDFObject( nObject, nGeneration );
+ pObj->m_nOffset = first - m_aGlobalBegin;
+
+ PDFContainer* pContainer = dynamic_cast<PDFContainer*>(m_aObjectStack.back());
+ if( pContainer &&
+ ( dynamic_cast<PDFFile*>(pContainer) ||
+ dynamic_cast<PDFPart*>(pContainer) ) )
+ {
+ pContainer->m_aSubElements.emplace_back( pObj );
+ m_aObjectStack.push_back( pObj );
+ }
+ else
+ parseError( "object in wrong place", first );
+ }
+
+ void endObject( iteratorT first, SAL_UNUSED_PARAMETER iteratorT )
+ {
+ if( m_aObjectStack.empty() )
+ parseError( "endobj without obj", first );
+ else if( dynamic_cast<PDFObject*>(m_aObjectStack.back()) == nullptr )
+ parseError( "spurious endobj", first );
+ else
+ m_aObjectStack.pop_back();
+ }
+
+ void pushObjectRef( iteratorT first, SAL_UNUSED_PARAMETER iteratorT )
+ {
+ unsigned int nGeneration = m_aUIntStack.back();
+ m_aUIntStack.pop_back();
+ unsigned int nObject = m_aUIntStack.back();
+ m_aUIntStack.pop_back();
+ insertNewValue( std::make_unique<PDFObjectRef>(nObject,nGeneration), first );
+ }
+
+ void beginDict( iteratorT first, SAL_UNUSED_PARAMETER iteratorT )
+ {
+ PDFDict* pDict = new PDFDict();
+ pDict->m_nOffset = first - m_aGlobalBegin;
+
+ insertNewValue( std::unique_ptr<PDFEntry>(pDict), first );
+ // will not come here if insertion fails (exception)
+ m_aObjectStack.push_back( pDict );
+ }
+ void endDict( iteratorT first, SAL_UNUSED_PARAMETER iteratorT )
+ {
+ PDFDict* pDict = nullptr;
+ if( m_aObjectStack.empty() )
+ parseError( "dictionary end without begin", first );
+ else if( (pDict = dynamic_cast<PDFDict*>(m_aObjectStack.back())) == nullptr )
+ parseError( "spurious dictionary end", first );
+ else
+ m_aObjectStack.pop_back();
+
+ PDFEntry* pOffender = pDict->buildMap();
+ if( pOffender )
+ {
+ StringEmitContext aCtx;
+ aCtx.write( "offending dictionary element: ", 30 );
+ pOffender->emit( aCtx );
+ m_aErrorString = aCtx.getString();
+ parseError( m_aErrorString.getStr(), first );
+ }
+ }
+
+ void beginArray( iteratorT first, SAL_UNUSED_PARAMETER iteratorT )
+ {
+ PDFArray* pArray = new PDFArray();
+ pArray->m_nOffset = first - m_aGlobalBegin;
+
+ insertNewValue( std::unique_ptr<PDFEntry>(pArray), first );
+ // will not come here if insertion fails (exception)
+ m_aObjectStack.push_back( pArray );
+ }
+
+ void endArray( iteratorT first, SAL_UNUSED_PARAMETER iteratorT )
+ {
+ if( m_aObjectStack.empty() )
+ parseError( "array end without begin", first );
+ else if( dynamic_cast<PDFArray*>(m_aObjectStack.back()) == nullptr )
+ parseError( "spurious array end", first );
+ else
+ m_aObjectStack.pop_back();
+ }
+
+ void emitStream( iteratorT first, iteratorT last )
+ {
+ if( m_aObjectStack.empty() )
+ parseError( "stream without object", first );
+ PDFObject* pObj = dynamic_cast<PDFObject*>(m_aObjectStack.back());
+ if( pObj && pObj->m_pObject )
+ {
+ if( pObj->m_pStream )
+ parseError( "multiple streams in object", first );
+
+ PDFDict* pDict = dynamic_cast<PDFDict*>(pObj->m_pObject);
+ if( pDict )
+ {
+ PDFStream* pStream = new PDFStream( first - m_aGlobalBegin, last - m_aGlobalBegin, pDict );
+
+ pObj->m_pStream = pStream;
+ pObj->m_aSubElements.emplace_back( pStream );
+ }
+ }
+ else
+ parseError( "stream without object", first );
+ }
+
+ void beginTrailer( iteratorT first, SAL_UNUSED_PARAMETER iteratorT )
+ {
+ if( m_aObjectStack.empty() )
+ m_aObjectStack.push_back( new PDFPart() );
+
+ PDFTrailer* pTrailer = new PDFTrailer();
+ pTrailer->m_nOffset = first - m_aGlobalBegin;
+
+ PDFContainer* pContainer = dynamic_cast<PDFContainer*>(m_aObjectStack.back());
+ if( pContainer &&
+ ( dynamic_cast<PDFFile*>(pContainer) ||
+ dynamic_cast<PDFPart*>(pContainer) ) )
+ {
+ pContainer->m_aSubElements.emplace_back( pTrailer );
+ m_aObjectStack.push_back( pTrailer );
+ }
+ else
+ parseError( "trailer in wrong place", first );
+ }
+
+ void endTrailer( iteratorT first, SAL_UNUSED_PARAMETER iteratorT )
+ {
+ if( m_aObjectStack.empty() )
+ parseError( "%%EOF without trailer", first );
+ else if( dynamic_cast<PDFTrailer*>(m_aObjectStack.back()) == nullptr )
+ parseError( "spurious %%EOF", first );
+ else
+ m_aObjectStack.pop_back();
+ }
+};
+
+}
+
+#ifdef _WIN32
+std::unique_ptr<PDFEntry> PDFReader::read( const char* pBuffer, unsigned int nLen )
+{
+ PDFGrammar<const char*> aGrammar( pBuffer );
+
+ try
+ {
+#if OSL_DEBUG_LEVEL > 0
+ boost::spirit::classic::parse_info<const char*> aInfo =
+#endif
+ boost::spirit::classic::parse( pBuffer,
+ pBuffer+nLen,
+ aGrammar,
+ boost::spirit::classic::space_p );
+#if OSL_DEBUG_LEVEL > 0
+ SAL_INFO("sdext.pdfimport.pdfparse", "parseinfo: stop = " << aInfo.stop << " (buff=" << pBuffer << ", offset = " << aInfo.stop - pBuffer << "), hit = " << (aInfo.hit ? OUString("true") : OUString("false")) << ", full = " << (aInfo.full ? OUString("true") : OUString("false")) << ", length = " << static_cast<int>(aInfo.length) );
+#endif
+ }
+ catch( const parser_error<const char*, const char*>& rError )
+ {
+#if OSL_DEBUG_LEVEL > 0
+ OString aTmp;
+ unsigned int nElem = aGrammar.m_aObjectStack.size();
+ for( unsigned int i = 0; i < nElem; i++ )
+ aTmp += OString::Concat(" ") + typeid( *(aGrammar.m_aObjectStack[i]) ).name();
+
+ SAL_WARN("sdext.pdfimport.pdfparse", "parse error: " << rError.descriptor << " at buffer pos " << rError.where - pBuffer << ", object stack: " << aTmp);
+#else
+ (void)rError;
+#endif
+ }
+
+ std::unique_ptr<PDFEntry> pRet;
+ unsigned int nEntries = aGrammar.m_aObjectStack.size();
+ if( nEntries == 1 )
+ {
+ pRet.reset(aGrammar.m_aObjectStack.back());
+ aGrammar.m_aObjectStack.pop_back();
+ }
+#if OSL_DEBUG_LEVEL > 0
+ else if( nEntries > 1 )
+ SAL_WARN("sdext.pdfimport.pdfparse", "error got " << nEntries << " stack objects in parse" );
+#endif
+
+ return pRet;
+}
+#endif
+
+std::unique_ptr<PDFEntry> PDFReader::read( const char* pFileName )
+{
+#ifdef _WIN32
+ /* #i106583#
+ since converting to boost 1.39 file_iterator does not work anymore on all Windows systems
+ C++ stdlib istream_iterator does not allow "-" apparently
+ using spirit 2.0 doesn't work in our environment with the MSC
+
+ So for the time being bite the bullet and read the whole file.
+ FIXME: give Spirit 2.x another try when we upgrade boost again.
+ */
+ std::unique_ptr<PDFEntry> pRet;
+ FILE* fp = fopen( pFileName, "rb" );
+ if( fp )
+ {
+ fseek( fp, 0, SEEK_END );
+ unsigned int nLen = static_cast<unsigned int>(ftell( fp ));
+ fseek( fp, 0, SEEK_SET );
+ char* pBuf = static_cast<char*>(std::malloc( nLen ));
+ if( pBuf )
+ {
+ fread( pBuf, 1, nLen, fp );
+ pRet = read( pBuf, nLen );
+ std::free( pBuf );
+ }
+ fclose( fp );
+ }
+ return pRet;
+#else
+ file_iterator<> file_start( pFileName );
+ if( ! file_start )
+ return nullptr;
+ file_iterator<> file_end = file_start.make_end();
+ PDFGrammar< file_iterator<> > aGrammar( file_start );
+
+ try
+ {
+#if OSL_DEBUG_LEVEL > 0
+ boost::spirit::classic::parse_info< file_iterator<> > aInfo =
+#endif
+ boost::spirit::classic::parse( file_start,
+ file_end,
+ aGrammar,
+ boost::spirit::classic::space_p );
+#if OSL_DEBUG_LEVEL > 0
+ SAL_INFO("sdext.pdfimport.pdfparse", "parseinfo: stop at offset = " << aInfo.stop - file_start << ", hit = " << (aInfo.hit ? "true" : "false") << ", full = " << (aInfo.full ? "true" : "false") << ", length = " << aInfo.length);
+#endif
+ }
+ catch( const parser_error< const char*, file_iterator<> >& rError )
+ {
+ SAL_WARN("sdext.pdfimport.pdfparse", "parse error: " << rError.descriptor << " at buffer pos " << rError.where - file_start);
+#if OSL_DEBUG_LEVEL > 0
+ OUStringBuffer aTmp;
+ unsigned int nElem = aGrammar.m_aObjectStack.size();
+ for( unsigned int i = 0; i < nElem; i++ )
+ {
+ aTmp.append(" ");
+ aTmp.appendAscii(typeid( *(aGrammar.m_aObjectStack[i]) ).name());
+ }
+ SAL_WARN("sdext.pdfimport.pdfparse", "parse error object stack: " << aTmp.makeStringAndClear());
+#endif
+ }
+
+ std::unique_ptr<PDFEntry> pRet;
+ unsigned int nEntries = aGrammar.m_aObjectStack.size();
+ if( nEntries == 1 )
+ {
+ pRet.reset(aGrammar.m_aObjectStack.back());
+ aGrammar.m_aObjectStack.pop_back();
+ }
+#if OSL_DEBUG_LEVEL > 0
+ else if( nEntries > 1 )
+ {
+ SAL_WARN("sdext.pdfimport.pdfparse", "error got " << nEntries << " stack objects in parse");
+ for( unsigned int i = 0; i < nEntries; i++ )
+ {
+ SAL_WARN("sdext.pdfimport.pdfparse", typeid(*aGrammar.m_aObjectStack[i]).name());
+ PDFObject* pObj = dynamic_cast<PDFObject*>(aGrammar.m_aObjectStack[i]);
+ if( pObj )
+ SAL_WARN("sdext.pdfimport.pdfparse", " -> object " << pObj->m_nNumber << " generation " << pObj->m_nGeneration);
+ else
+ SAL_WARN("sdext.pdfimport.pdfparse", "(type " << typeid(*aGrammar.m_aObjectStack[i]).name() << ")");
+ }
+ }
+#endif
+ return pRet;
+#endif // WIN32
+}
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/sax/emitcontext.cxx b/sdext/source/pdfimport/sax/emitcontext.cxx
new file mode 100644
index 000000000..a923488d6
--- /dev/null
+++ b/sdext/source/pdfimport/sax/emitcontext.cxx
@@ -0,0 +1,179 @@
+/* -*- 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 <saxemitter.hxx>
+#include "emitcontext.hxx"
+#include "saxattrlist.hxx"
+
+#include <rtl/strbuf.hxx>
+#include <osl/diagnose.h>
+#include <com/sun/star/xml/sax/SAXException.hpp>
+#include <xmloff/xmlimp.hxx>
+
+#if OSL_DEBUG_LEVEL > 0
+#include <osl/file.hxx>
+static osl::File* pStream = nullptr;
+static int nIndent = 0;
+#endif
+
+using namespace com::sun::star;
+
+namespace pdfi
+{
+
+SaxEmitter::SaxEmitter( const uno::Reference< xml::sax::XDocumentHandler >& xDocHdl ) :
+ m_xDocHdl( xDocHdl )
+{
+ OSL_PRECOND(m_xDocHdl.is(), "SaxEmitter(): invalid doc handler");
+ if (SvXMLImport *pFastHandler = dynamic_cast<SvXMLImport*>(m_xDocHdl.get()))
+ m_xDocHdl.set( new SvXMLLegacyToFastDocHandler( pFastHandler ) );
+ try
+ {
+ m_xDocHdl->startDocument();
+ }
+ catch( xml::sax::SAXException& )
+ {
+ }
+#if OSL_DEBUG_LEVEL > 0
+ static const char* pDir = getenv( "DBG_PDFIMPORT_DIR" );
+ if( pDir )
+ {
+ OUString aStr( OStringToOUString( pDir, RTL_TEXTENCODING_UTF8 ) );
+ OUString aFileURL;
+ osl_getFileURLFromSystemPath( aStr.pData, &aFileURL.pData );
+ pStream = new osl::File( aFileURL + "/pdfimport.xml" );
+ if( pStream->open( osl_File_OpenFlag_Write | osl_File_OpenFlag_Create ) )
+ {
+ pStream->open( osl_File_OpenFlag_Write );
+ pStream->setSize( 0 );
+ }
+ }
+ else
+ pStream = nullptr;
+#endif
+}
+
+SaxEmitter::~SaxEmitter()
+{
+ try
+ {
+ m_xDocHdl->endDocument();
+ }
+ catch( xml::sax::SAXException& )
+ {
+ }
+#if OSL_DEBUG_LEVEL > 0
+ if( pStream )
+ {
+ pStream->close();
+ delete pStream;
+ pStream = nullptr;
+ }
+#endif
+}
+
+void SaxEmitter::beginTag( const char* pTag, const PropertyMap& rProperties )
+{
+ OUString aTag = OUString::createFromAscii( pTag );
+ uno::Reference< xml::sax::XAttributeList > xAttr(
+ new SaxAttrList( rProperties ) );
+ try
+ {
+ m_xDocHdl->startElement( aTag, xAttr );
+ }
+ catch( xml::sax::SAXException& )
+ {
+ }
+#if OSL_DEBUG_LEVEL > 0
+ if( !pStream )
+ return;
+
+ sal_uInt64 nWritten = 0;
+ for( int i = 0; i < nIndent; i++ )
+ pStream->write( " ", 4, nWritten );
+
+ OStringBuffer aBuf( 1024 );
+ aBuf.append( '<' );
+ aBuf.append( pTag );
+ for( const auto& rProperty : rProperties )
+ {
+ aBuf.append( ' ' );
+ aBuf.append( OUStringToOString( rProperty.first, RTL_TEXTENCODING_UTF8 ) );
+ aBuf.append( "=\"" );
+ aBuf.append( OUStringToOString( rProperty.second, RTL_TEXTENCODING_UTF8 ) );
+ aBuf.append( "\"" );
+ }
+ aBuf.append( ">\n" );
+ pStream->write( aBuf.getStr(), aBuf.getLength(), nWritten );
+ nIndent++;
+#endif
+}
+
+void SaxEmitter::write( const OUString& rText )
+{
+ try
+ {
+ m_xDocHdl->characters( rText );
+ }
+ catch( xml::sax::SAXException& )
+ {
+ }
+#if OSL_DEBUG_LEVEL > 0
+ if( pStream )
+ {
+ OString aStr( OUStringToOString( rText, RTL_TEXTENCODING_UTF8 ) );
+ sal_uInt64 nWritten = 0;
+ pStream->write( aStr.getStr(), aStr.getLength(), nWritten );
+ }
+#endif
+}
+
+void SaxEmitter::endTag( const char* pTag )
+{
+ OUString aTag = OUString::createFromAscii( pTag );
+ try
+ {
+ m_xDocHdl->endElement( aTag );
+ }
+ catch( xml::sax::SAXException& )
+ {
+ }
+#if OSL_DEBUG_LEVEL > 0
+ if( !pStream )
+ return;
+
+ sal_uInt64 nWritten = 0;
+ for( int i = 0; i < nIndent; i++ )
+ pStream->write( " ", 4, nWritten );
+
+ OString aBuf = OString::Concat("</") + pTag + ">\n";
+ pStream->write( aBuf.getStr(), aBuf.getLength(), nWritten );
+ nIndent--;
+#endif
+}
+
+XmlEmitterSharedPtr createSaxEmitter( const uno::Reference< xml::sax::XDocumentHandler >& xDocHdl )
+{
+ return std::make_shared<SaxEmitter>(xDocHdl);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/sax/emitcontext.hxx b/sdext/source/pdfimport/sax/emitcontext.hxx
new file mode 100644
index 000000000..8f278fc25
--- /dev/null
+++ b/sdext/source/pdfimport/sax/emitcontext.hxx
@@ -0,0 +1,51 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_SAX_EMITCONTEXT_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_SAX_EMITCONTEXT_HXX
+
+#include <xmlemitter.hxx>
+
+#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
+
+#include <rtl/ustring.hxx>
+
+
+namespace pdfi
+{
+ class SaxEmitter : public XmlEmitter
+ {
+ private:
+ css::uno::Reference<
+ css::xml::sax::XDocumentHandler > m_xDocHdl;
+
+ public:
+ explicit SaxEmitter( const css::uno::Reference<
+ css::xml::sax::XDocumentHandler >& xDocHdl );
+ virtual ~SaxEmitter() override;
+
+ virtual void beginTag( const char* pTag, const PropertyMap& rProperties ) override;
+ virtual void write( const OUString& rString ) override;
+ virtual void endTag( const char* pTag ) override;
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/sax/saxattrlist.cxx b/sdext/source/pdfimport/sax/saxattrlist.cxx
new file mode 100644
index 000000000..538f6f447
--- /dev/null
+++ b/sdext/source/pdfimport/sax/saxattrlist.cxx
@@ -0,0 +1,80 @@
+/* -*- 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 "saxattrlist.hxx"
+
+namespace pdfi
+{
+
+SaxAttrList::SaxAttrList( const std::unordered_map< OUString, OUString >& rMap )
+{
+ m_aAttributes.reserve(rMap.size());
+ for( const auto& rEntry : rMap )
+ {
+ m_aIndexMap[ rEntry.first ] = m_aAttributes.size();
+ m_aAttributes.emplace_back( rEntry.first, rEntry.second );
+ }
+}
+
+namespace {
+ OUString getCDATAString()
+ {
+ return "CDATA";
+ }
+}
+
+sal_Int16 SAL_CALL SaxAttrList::getLength()
+{
+ return sal_Int16(m_aAttributes.size());
+}
+OUString SAL_CALL SaxAttrList::getNameByIndex( sal_Int16 i_nIndex )
+{
+ return (i_nIndex < sal_Int16(m_aAttributes.size())) ? m_aAttributes[i_nIndex].m_aName : OUString();
+}
+
+OUString SAL_CALL SaxAttrList::getTypeByIndex( sal_Int16 i_nIndex)
+{
+ return (i_nIndex < sal_Int16(m_aAttributes.size())) ? getCDATAString() : OUString();
+}
+
+OUString SAL_CALL SaxAttrList::getTypeByName( const OUString& i_rName )
+{
+ return (m_aIndexMap.find( i_rName ) != m_aIndexMap.end()) ? getCDATAString() : OUString();
+}
+
+OUString SAL_CALL SaxAttrList::getValueByIndex( sal_Int16 i_nIndex )
+{
+ return (i_nIndex < sal_Int16(m_aAttributes.size())) ? m_aAttributes[i_nIndex].m_aValue : OUString();
+}
+
+OUString SAL_CALL SaxAttrList::getValueByName(const OUString& i_rName)
+{
+ std::unordered_map< OUString, size_t >::const_iterator it = m_aIndexMap.find( i_rName );
+ return (it != m_aIndexMap.end()) ? m_aAttributes[it->second].m_aValue : OUString();
+}
+
+css::uno::Reference< css::util::XCloneable > SAL_CALL SaxAttrList::createClone()
+{
+ return new SaxAttrList( *this );
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/sax/saxattrlist.hxx b/sdext/source/pdfimport/sax/saxattrlist.hxx
new file mode 100644
index 000000000..e26afcbc5
--- /dev/null
+++ b/sdext/source/pdfimport/sax/saxattrlist.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/.
+ *
+ * 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_SDEXT_SOURCE_PDFIMPORT_SAX_SAXATTRLIST_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_SAX_SAXATTRLIST_HXX
+
+#include <rtl/ustring.hxx>
+#include <unordered_map>
+#include <vector>
+#include <cppuhelper/implbase.hxx>
+
+#include <com/sun/star/util/XCloneable.hpp>
+#include <com/sun/star/xml/sax/XAttributeList.hpp>
+
+namespace pdfi
+{
+ class SaxAttrList : public ::cppu::WeakImplHelper<
+ css::xml::sax::XAttributeList,
+ css::util::XCloneable
+ >
+ {
+ struct AttrEntry
+ {
+ OUString m_aName;
+ OUString m_aValue;
+
+ AttrEntry( const OUString& i_rName, const OUString& i_rValue )
+ : m_aName( i_rName ), m_aValue( i_rValue ) {}
+ };
+ std::vector< AttrEntry > m_aAttributes;
+ std::unordered_map< OUString, size_t > m_aIndexMap;
+
+ public:
+ explicit SaxAttrList( const std::unordered_map< OUString, OUString >& );
+
+ // css::xml::sax::XAttributeList
+ virtual sal_Int16 SAL_CALL getLength() override;
+ virtual OUString SAL_CALL getNameByIndex(sal_Int16 i) override;
+ virtual OUString SAL_CALL getTypeByIndex(sal_Int16 i) override;
+ virtual OUString SAL_CALL getTypeByName(const OUString& aName) override;
+ virtual OUString SAL_CALL getValueByIndex(sal_Int16 i) override;
+ virtual OUString SAL_CALL getValueByName(const OUString& aName) override;
+
+ // css::util::XCloneable
+ virtual css::uno::Reference< css::util::XCloneable > SAL_CALL createClone() override;
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/test/outputwrap.hxx b/sdext/source/pdfimport/test/outputwrap.hxx
new file mode 100644
index 000000000..a171b5a3b
--- /dev/null
+++ b/sdext/source/pdfimport/test/outputwrap.hxx
@@ -0,0 +1,93 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_TEST_OUTPUTWRAP_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_TEST_OUTPUTWRAP_HXX
+
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <com/sun/star/io/XOutputStream.hpp>
+#include <osl/file.hxx>
+#include <rtl/strbuf.hxx>
+
+namespace pdfi
+{
+
+typedef ::cppu::WeakComponentImplHelper<
+ css::io::XOutputStream > OutputWrapBase;
+
+ class OutputWrap : private cppu::BaseMutex, public OutputWrapBase
+ {
+ osl::File maFile;
+
+ public:
+
+ explicit OutputWrap( const OUString& rURL ) : OutputWrapBase(m_aMutex), maFile(rURL)
+ {
+ maFile.open(osl_File_OpenFlag_Create|osl_File_OpenFlag_Write);
+ }
+
+ virtual void SAL_CALL writeBytes( const css::uno::Sequence< ::sal_Int8 >& aData ) override
+
+ {
+ sal_uInt64 nBytesWritten(0);
+ maFile.write(aData.getConstArray(),aData.getLength(),nBytesWritten);
+ }
+
+ virtual void SAL_CALL flush() override
+ {
+ }
+
+ virtual void SAL_CALL closeOutput() override
+ {
+ maFile.close();
+ }
+ };
+
+ class OutputWrapString : private cppu::BaseMutex, public OutputWrapBase
+ {
+ OString& mrString;
+ OStringBuffer maBuffer;
+
+ public:
+
+ explicit OutputWrapString(OString& rString) : OutputWrapBase(m_aMutex), mrString(rString), maBuffer(rString)
+ {
+ }
+
+ virtual void SAL_CALL writeBytes(const css::uno::Sequence< ::sal_Int8 >& aData) override
+ {
+ maBuffer.append(reinterpret_cast<const char *>(aData.getConstArray()), aData.getLength());
+ }
+
+ virtual void SAL_CALL flush() override
+ {
+ }
+
+ virtual void SAL_CALL closeOutput() override
+ {
+ mrString = maBuffer.makeStringAndClear();
+ }
+ };
+}
+#endif
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/test/pdf2xml.cxx b/sdext/source/pdfimport/test/pdf2xml.cxx
new file mode 100644
index 000000000..04b5ee8d1
--- /dev/null
+++ b/sdext/source/pdfimport/test/pdf2xml.cxx
@@ -0,0 +1,98 @@
+/* -*- 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 "outputwrap.hxx"
+#include <contentsink.hxx>
+#include <pdfihelper.hxx>
+#include <wrapper.hxx>
+#include <pdfparse.hxx>
+#include "../pdfiadaptor.hxx"
+
+#include <sal/main.h>
+#include <osl/process.h>
+#include <rtl/ref.hxx>
+#include <sal/log.hxx>
+#include <unotest/bootstrapfixturebase.hxx>
+#include <comphelper/processfactory.hxx>
+#include <cppuhelper/bootstrap.hxx>
+#include <tools/diagnose_ex.h>
+
+using namespace ::pdfi;
+using namespace ::com::sun::star;
+
+SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
+{
+ if( argc < 4 )
+ return 1;
+
+ int nRet = 0;
+
+ try
+ {
+ OUString aBaseURL, aTmpURL, aSrcURL, aDstURL;
+
+ TreeVisitorFactorySharedPtr pTreeFactory;
+ if( rtl_str_compare(argv[1], "-writer") == 0 )
+ pTreeFactory = createWriterTreeVisitorFactory();
+ else if( rtl_str_compare(argv[1], "-draw") == 0 )
+ pTreeFactory = createDrawTreeVisitorFactory();
+ else if( rtl_str_compare(argv[1], "-impress") == 0 )
+ pTreeFactory = createImpressTreeVisitorFactory();
+ else
+ return 1;
+
+ osl_getProcessWorkingDir(&aBaseURL.pData);
+ osl_getFileURLFromSystemPath( OUString::createFromAscii(argv[2]).pData,
+ &aTmpURL.pData );
+ osl_getAbsoluteFileURL(aBaseURL.pData,aTmpURL.pData,&aSrcURL.pData);
+
+ osl_getFileURLFromSystemPath( OUString::createFromAscii(argv[3]).pData,
+ &aTmpURL.pData );
+ osl_getAbsoluteFileURL(aBaseURL.pData,aTmpURL.pData,&aDstURL.pData);
+
+ // bootstrap UNO
+ uno::Reference< uno::XComponentContext > xContext(
+ cppu::defaultBootstrap_InitialComponentContext() );
+ uno::Reference<lang::XMultiComponentFactory> xFactory(xContext->getServiceManager());
+ uno::Reference<lang::XMultiServiceFactory> xSM(xFactory, uno::UNO_QUERY_THROW);
+ comphelper::setProcessServiceFactory(xSM);
+
+ test::BootstrapFixtureBase aEnv;
+ aEnv.setUp();
+
+ rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor( new pdfi::PDFIRawAdaptor(OUString(), aEnv.getComponentContext()) );
+ xAdaptor->setTreeVisitorFactory(pTreeFactory);
+ nRet = xAdaptor->odfConvert(aSrcURL, new OutputWrap(aDstURL), nullptr) ? 0 : 1;
+ }
+ catch (const uno::Exception&)
+ {
+ TOOLS_WARN_EXCEPTION("vcl.app", "Fatal");
+ return 1;
+ }
+ catch (const std::exception& e)
+ {
+ SAL_WARN("vcl.app", "Fatal: " << e.what());
+ return 1;
+ }
+
+ return nRet;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/test/pdfunzip.cxx b/sdext/source/pdfimport/test/pdfunzip.cxx
new file mode 100644
index 000000000..86797056e
--- /dev/null
+++ b/sdext/source/pdfimport/test/pdfunzip.cxx
@@ -0,0 +1,532 @@
+/* -*- 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 <stdio.h>
+#include <string_view>
+
+#include <sal/main.h>
+#include <osl/file.h>
+#include <osl/thread.h>
+#include <rtl/alloc.h>
+#include <rtl/ustring.hxx>
+#include <rtl/strbuf.hxx>
+#include <o3tl/string_view.hxx>
+
+#include <pdfparse.hxx>
+
+using namespace pdfparse;
+
+
+static void printHelp( const char* pExe )
+{
+ fprintf( stdout,
+ "USAGE: %s [-h,--help]\n"
+ " %s [-pw, --password <password>] <inputfile> [<outputfile>]\n"
+ " %s <-a, --extract-add-streams> [-pw, --password <password>] <inputfile> [<outputfile>]\n"
+ " %s <-f, --extract-fonts> [-pw, --password <password>] <inputfile> [<outputfile>]\n"
+ " %s <-o, --extract-objects> <o0>[:<g0>][,<o1>[:g1][,...]] [-pw, --password <password>] <inputfile> [<outputfile>]\n"
+ " -h, --help: show help\n"
+ " -a, --extract-add-streams: extracts additional streams to outputfile_object\n"
+ " and prints the mimetype found to stdout\n"
+ " -f, --extract-fonts: extracts fonts (currently only type1 and truetype are supported\n"
+ " -o, --extract-objects: extracts object streams, the syntax of the argument is comma separated\n"
+ " object numbers, where object number and generation number are separated by \':\'\n"
+ " an omitted generation number defaults to 0\n"
+ " -pw, --password: use password for decryption\n"
+ "\n"
+ "note: -f, -a, -o and normal unzip operation are mutually exclusive\n"
+ , pExe, pExe, pExe, pExe, pExe );
+}
+
+namespace {
+
+class FileEmitContext : public EmitContext
+{
+ oslFileHandle m_aHandle;
+ oslFileHandle m_aReadHandle;
+ unsigned int m_nReadLen;
+
+ void openReadFile( const char* pOrigName );
+
+ public:
+ FileEmitContext( const char* pFileName, const char* pOrigName, const PDFContainer* pTop );
+ virtual ~FileEmitContext() override;
+
+ virtual bool write( const void* pBuf, unsigned int nLen ) noexcept override;
+ virtual unsigned int getCurPos() noexcept override;
+ virtual bool copyOrigBytes( unsigned int nOrigOffset, unsigned int nLen ) noexcept override;
+ virtual unsigned int readOrigBytes( unsigned int nOrigOffset, unsigned int nLen, void* pBuf ) noexcept override;
+};
+
+}
+
+FileEmitContext::FileEmitContext( const char* pFileName, const char* pOrigName, const PDFContainer* pTop )
+ : EmitContext( pTop ),
+ m_aHandle( nullptr ),
+ m_aReadHandle( nullptr ),
+ m_nReadLen( 0 )
+{
+ OUString aSysFile(
+ OStringToOUString( std::string_view( pFileName ), osl_getThreadTextEncoding() ) );
+ OUString aURL;
+ if( osl_getFileURLFromSystemPath( aSysFile.pData, &aURL.pData ) != osl_File_E_None )
+ {
+ fprintf( stderr, "filename conversion \"%s\" failed\n", pFileName );
+ return;
+ }
+
+ if( osl_openFile( aURL.pData, &m_aHandle, osl_File_OpenFlag_Write ) == osl_File_E_None )
+ {
+ if( osl_setFileSize( m_aHandle, 0 ) != osl_File_E_None )
+ {
+ fprintf( stderr, "could not truncate %s\n", pFileName );
+ osl_closeFile( m_aHandle );
+ m_aHandle = nullptr;
+ }
+ }
+ else if( osl_openFile( aURL.pData, &m_aHandle,
+ osl_File_OpenFlag_Write |osl_File_OpenFlag_Create ) != osl_File_E_None )
+ {
+ fprintf( stderr, "could not open %s\n", pFileName );
+ return;
+ }
+ m_bDeflate = true;
+
+ openReadFile( pOrigName );
+}
+
+FileEmitContext::~FileEmitContext()
+{
+ if( m_aHandle )
+ osl_closeFile( m_aHandle );
+ if( m_aReadHandle )
+ osl_closeFile( m_aReadHandle );
+}
+
+void FileEmitContext::openReadFile( const char* pInFile )
+{
+ OUString aSysFile(
+ OStringToOUString( std::string_view( pInFile ), osl_getThreadTextEncoding() ) );
+ OUString aURL;
+ if( osl_getFileURLFromSystemPath( aSysFile.pData, &aURL.pData ) != osl_File_E_None )
+ {
+ fprintf( stderr, "filename conversion \"%s\" failed\n", pInFile );
+ return;
+ }
+
+ if( osl_openFile( aURL.pData, &m_aReadHandle, osl_File_OpenFlag_Read ) != osl_File_E_None )
+ {
+ fprintf( stderr, "could not open %s\n", pInFile );
+ return;
+ }
+
+ if( osl_setFilePos( m_aReadHandle, osl_Pos_End, 0 ) != osl_File_E_None )
+ {
+ fprintf( stderr, "could not seek to end of %s\n", pInFile );
+ osl_closeFile( m_aReadHandle );
+ return;
+ }
+
+ sal_uInt64 nFileSize = 0;
+ if( osl_getFilePos( m_aReadHandle, &nFileSize ) != osl_File_E_None )
+ {
+ fprintf( stderr, "could not get end pos of %s\n", pInFile );
+ osl_closeFile( m_aReadHandle );
+ return;
+ }
+
+ m_nReadLen = static_cast<unsigned int>(nFileSize);
+}
+
+bool FileEmitContext::write( const void* pBuf, unsigned int nLen ) noexcept
+{
+ if( ! m_aHandle )
+ return false;
+
+ sal_uInt64 nWrite = static_cast<sal_uInt64>(nLen);
+ sal_uInt64 nWritten = 0;
+ return (osl_writeFile( m_aHandle, pBuf, nWrite, &nWritten ) == osl_File_E_None)
+ && nWrite == nWritten;
+}
+
+unsigned int FileEmitContext::getCurPos() noexcept
+{
+ sal_uInt64 nFileSize = 0;
+ if( m_aHandle )
+ {
+ if( osl_getFilePos( m_aHandle, &nFileSize ) != osl_File_E_None )
+ nFileSize = 0;
+ }
+ return static_cast<unsigned int>(nFileSize);
+}
+
+bool FileEmitContext::copyOrigBytes( unsigned int nOrigOffset, unsigned int nLen ) noexcept
+{
+ if( nOrigOffset + nLen > m_nReadLen )
+ return false;
+
+ if( osl_setFilePos( m_aReadHandle, osl_Pos_Absolut, nOrigOffset ) != osl_File_E_None )
+ {
+ fprintf( stderr, "could not seek to offset %u\n", nOrigOffset );
+ return false;
+ }
+ void* pBuf = std::malloc( nLen );
+ if( ! pBuf )
+ return false;
+ sal_uInt64 nBytesRead = 0;
+ if( osl_readFile( m_aReadHandle, pBuf, nLen, &nBytesRead ) != osl_File_E_None
+ || nBytesRead != static_cast<sal_uInt64>(nLen) )
+ {
+ fprintf( stderr, "could not read %u bytes\n", nLen );
+ std::free( pBuf );
+ return false;
+ }
+ bool bRet = write( pBuf, nLen );
+ std::free( pBuf );
+ return bRet;
+}
+
+unsigned int FileEmitContext::readOrigBytes( unsigned int nOrigOffset, unsigned int nLen, void* pBuf ) noexcept
+{
+ if( nOrigOffset + nLen > m_nReadLen )
+ return 0;
+
+ if( osl_setFilePos( m_aReadHandle, osl_Pos_Absolut, nOrigOffset ) != osl_File_E_None )
+ {
+ fprintf( stderr, "could not seek to offset %u\n", nOrigOffset );
+ return 0;
+ }
+ sal_uInt64 nBytesRead = 0;
+ if( osl_readFile( m_aReadHandle, pBuf, nLen, &nBytesRead ) != osl_File_E_None )
+ return 0;
+ return static_cast<unsigned int>(nBytesRead);
+}
+
+typedef int(*PDFFileHdl)(const char*, const char*, PDFFile*);
+
+static int handleFile( const char* pInFile, const char* pOutFile, const char* pPassword, PDFFileHdl pHdl )
+{
+ int nRet = 0;
+ std::unique_ptr<PDFEntry> pEntry = pdfparse::PDFReader::read( pInFile );
+ if( pEntry )
+ {
+ PDFFile* pPDFFile = dynamic_cast<PDFFile*>(pEntry.get());
+ if( pPDFFile )
+ {
+ fprintf( stdout, "have a %s PDF file\n", pPDFFile->isEncrypted() ? "encrypted" : "unencrypted" );
+ if( pPassword )
+ fprintf( stdout, "password %s\n",
+ pPDFFile->setupDecryptionData( pPassword ) ? "matches" : "does not match" );
+ nRet = pHdl( pInFile, pOutFile, pPDFFile );
+ }
+ else
+ nRet = 20;
+ }
+ return nRet;
+}
+
+static int write_unzipFile( const char* pInFile, const char* pOutFile, PDFFile* pPDFFile )
+{
+ FileEmitContext aContext( pOutFile, pInFile, pPDFFile );
+ aContext.m_bDecrypt = pPDFFile->isEncrypted();
+ pPDFFile->emit(aContext);
+ return 0;
+}
+
+static int write_addStreamArray( const char* pOutFile, PDFArray* pStreams, PDFFile* pPDFFile, const char* pInFile )
+{
+ int nRet = 0;
+ unsigned int nArrayElements = pStreams->m_aSubElements.size();
+ for( unsigned int i = 0; i < nArrayElements-1 && nRet == 0; i++ )
+ {
+ PDFName* pMimeType = dynamic_cast<PDFName*>(pStreams->m_aSubElements[i].get());
+ PDFObjectRef* pStreamRef = dynamic_cast<PDFObjectRef*>(pStreams->m_aSubElements[i+1].get());
+ if( ! pMimeType )
+ fprintf( stderr, "error: no mimetype element\n" );
+ if( ! pStreamRef )
+ fprintf( stderr, "error: no stream ref element\n" );
+ if( pMimeType && pStreamRef )
+ {
+ fprintf( stdout, "found stream %d %d with mimetype %s\n",
+ pStreamRef->m_nNumber, pStreamRef->m_nGeneration,
+ pMimeType->m_aName.getStr() );
+ PDFObject* pObject = pPDFFile->findObject( pStreamRef->m_nNumber, pStreamRef->m_nGeneration );
+ if( pObject )
+ {
+ OString aOutStream = pOutFile +
+ OString::Concat("_stream_") +
+ OString::number( sal_Int32(pStreamRef->m_nNumber) ) +
+ "_" +
+ OString::number( sal_Int32(pStreamRef->m_nGeneration) );
+ FileEmitContext aContext( aOutStream.getStr(), pInFile, pPDFFile );
+ aContext.m_bDecrypt = pPDFFile->isEncrypted();
+ pObject->writeStream( aContext, pPDFFile );
+ }
+ else
+ {
+ fprintf( stderr, "object not found\n" );
+ nRet = 121;
+ }
+ }
+ else
+ nRet = 120;
+ }
+ return nRet;
+}
+
+static int write_addStreams( const char* pInFile, const char* pOutFile, PDFFile* pPDFFile )
+{
+ // find all trailers
+ int nRet = 0;
+ unsigned int nElements = pPDFFile->m_aSubElements.size();
+ for( unsigned i = 0; i < nElements && nRet == 0; i++ )
+ {
+ PDFTrailer* pTrailer = dynamic_cast<PDFTrailer*>(pPDFFile->m_aSubElements[i].get());
+ if( pTrailer && pTrailer->m_pDict )
+ {
+ // search for AdditionalStreams entry
+ auto add_stream = pTrailer->m_pDict->m_aMap.find( "AdditionalStreams" );
+ if( add_stream != pTrailer->m_pDict->m_aMap.end() )
+ {
+ PDFArray* pStreams = dynamic_cast<PDFArray*>(add_stream->second);
+ if( pStreams )
+ nRet = write_addStreamArray( pOutFile, pStreams, pPDFFile, pInFile );
+ }
+ }
+ }
+ return nRet;
+}
+
+static int write_fonts( const char* i_pInFile, const char* i_pOutFile, PDFFile* i_pPDFFile )
+{
+ unsigned int nElements = i_pPDFFile->m_aSubElements.size();
+ for (unsigned i = 0; i < nElements; i++)
+ {
+ // search FontDescriptors
+ PDFObject* pObj = dynamic_cast<PDFObject*>(i_pPDFFile->m_aSubElements[i].get());
+ if( ! pObj )
+ continue;
+ PDFDict* pDict = dynamic_cast<PDFDict*>(pObj->m_pObject);
+ if( ! pDict )
+ continue;
+
+ std::unordered_map<OString,PDFEntry*>::iterator map_it =
+ pDict->m_aMap.find( "Type" );
+ if( map_it == pDict->m_aMap.end() )
+ continue;
+
+ PDFName* pName = dynamic_cast<PDFName*>(map_it->second);
+ if( ! pName )
+ continue;
+ if( pName->m_aName != "FontDescriptor" )
+ continue;
+
+ // the font name will be helpful, also there must be one in
+ // a font descriptor
+ map_it = pDict->m_aMap.find( "FontName" );
+ if( map_it == pDict->m_aMap.end() )
+ continue;
+ pName = dynamic_cast<PDFName*>(map_it->second);
+ if( ! pName )
+ continue;
+ OString aFontName( pName->m_aName );
+
+ PDFObjectRef* pStreamRef = nullptr;
+ const char* pFileType = nullptr;
+ // we have a font descriptor, try for a type 1 font
+ map_it = pDict->m_aMap.find( "FontFile" );
+ if( map_it != pDict->m_aMap.end() )
+ {
+ pStreamRef = dynamic_cast<PDFObjectRef*>(map_it->second);
+ if( pStreamRef )
+ pFileType = "pfa";
+ }
+
+ // perhaps it's a truetype file ?
+ if( ! pStreamRef )
+ {
+ map_it = pDict->m_aMap.find( "FontFile2" );
+ if( map_it != pDict->m_aMap.end() )
+ {
+ pStreamRef = dynamic_cast<PDFObjectRef*>(map_it->second);
+ if( pStreamRef )
+ pFileType = "ttf";
+ }
+ }
+
+ if( ! pStreamRef )
+ continue;
+
+ PDFObject* pStream = i_pPDFFile->findObject( pStreamRef );
+ if( ! pStream )
+ continue;
+
+ OStringBuffer aOutStream( i_pOutFile );
+ aOutStream.append( "_font_" );
+ aOutStream.append( sal_Int32(pStreamRef->m_nNumber) );
+ aOutStream.append( "_" );
+ aOutStream.append( sal_Int32(pStreamRef->m_nGeneration) );
+ aOutStream.append( "_" );
+ aOutStream.append( aFontName );
+ if( pFileType )
+ {
+ aOutStream.append( "." );
+ aOutStream.append( pFileType );
+ }
+ FileEmitContext aContext( aOutStream.getStr(), i_pInFile, i_pPDFFile );
+ aContext.m_bDecrypt = i_pPDFFile->isEncrypted();
+ pStream->writeStream( aContext, i_pPDFFile );
+ }
+ return 0;
+}
+
+static std::vector< std::pair< sal_Int32, sal_Int32 > > s_aEmitObjects;
+
+static int write_objects( const char* i_pInFile, const char* i_pOutFile, PDFFile* i_pPDFFile )
+{
+ unsigned int nElements = s_aEmitObjects.size();
+ for (unsigned i = 0; i < nElements; i++)
+ {
+ sal_Int32 nObject = s_aEmitObjects[i].first;
+ sal_Int32 nGeneration = s_aEmitObjects[i].second;
+ PDFObject* pStream = i_pPDFFile->findObject( nObject, nGeneration );
+ if( ! pStream )
+ {
+ fprintf( stderr, "object %d %d not found !\n", static_cast<int>(nObject), static_cast<int>(nGeneration) );
+ continue;
+ }
+
+ OString aOutStream = i_pOutFile +
+ OString::Concat("_stream_") +
+ OString::number( nObject ) +
+ "_" +
+ OString::number( nGeneration );
+ FileEmitContext aContext( aOutStream.getStr(), i_pInFile, i_pPDFFile );
+ aContext.m_bDecrypt = i_pPDFFile->isEncrypted();
+ pStream->writeStream( aContext, i_pPDFFile );
+ }
+ return 0;
+}
+
+SAL_IMPLEMENT_MAIN_WITH_ARGS( argc, argv )
+{
+ const char* pInFile = nullptr;
+ const char* pOutFile = nullptr;
+ const char* pPassword = nullptr;
+ OStringBuffer aOutFile( 256 );
+ PDFFileHdl aHdl = write_unzipFile;
+
+ for( int nArg = 1; nArg < argc; nArg++ )
+ {
+ if( argv[nArg][0] == '-' )
+ {
+ if( ! rtl_str_compare( "-pw", argv[nArg] ) ||
+ ! rtl_str_compare( "--password" , argv[nArg] ) )
+ {
+ if( nArg == argc-1 )
+ {
+ fprintf( stderr, "no password given\n" );
+ return 1;
+ }
+ nArg++;
+ pPassword = argv[nArg];
+ }
+ else if( ! rtl_str_compare( "-h", argv[nArg] ) ||
+ ! rtl_str_compare( "--help", argv[nArg] ) )
+ {
+ printHelp( argv[0] );
+ return 0;
+ }
+ else if( ! rtl_str_compare( "-a", argv[nArg] ) ||
+ ! rtl_str_compare( "--extract-add-streams", argv[nArg] ) )
+ {
+ aHdl = write_addStreams;
+ }
+ else if( ! rtl_str_compare( "-f", argv[nArg] ) ||
+ ! rtl_str_compare( "--extract-fonts", argv[nArg] ) )
+ {
+ aHdl = write_fonts;
+ }
+ else if( ! rtl_str_compare( "-o", argv[nArg] ) ||
+ ! rtl_str_compare( "--extract-objects", argv[nArg] ) )
+ {
+ aHdl = write_objects;
+ nArg++;
+ if( nArg < argc )
+ {
+ OString aObjs( argv[nArg] );
+ sal_Int32 nIndex = 0;
+ while( nIndex != -1 )
+ {
+ OString aToken( aObjs.getToken( 0, ',', nIndex ) );
+ sal_Int32 nObject = 0;
+ sal_Int32 nGeneration = 0;
+ sal_Int32 nGenIndex = 0;
+ nObject = o3tl::toInt32( o3tl::getToken( aToken, 0, ':', nGenIndex ) );
+ if( nGenIndex != -1 )
+ nGeneration = o3tl::toInt32( o3tl::getToken(aToken, 0, ':', nGenIndex ));
+ s_aEmitObjects.push_back( std::pair<sal_Int32,sal_Int32>(nObject,nGeneration) );
+ }
+ }
+ }
+ else
+ {
+ fprintf( stderr, "unrecognized option \"%s\"\n",
+ argv[nArg] );
+ printHelp( argv[0] );
+ return 1;
+ }
+ }
+ else if( pInFile == nullptr )
+ pInFile = argv[nArg];
+ else if( pOutFile == nullptr )
+ pOutFile = argv[nArg];
+ }
+ if( ! pInFile )
+ {
+ fprintf( stderr, "no input file given\n" );
+ return 10;
+ }
+ if( ! pOutFile )
+ {
+ OString aFile( pInFile );
+ if( aFile.getLength() > 0 )
+ {
+ if( aFile.getLength() > 4 )
+ {
+ if( aFile.matchIgnoreAsciiCase( ".pdf", aFile.getLength()-4 ) )
+ aOutFile.append( pInFile, aFile.getLength() - 4 );
+ else
+ aOutFile.append( aFile );
+ }
+ aOutFile.append( "_unzip.pdf" );
+ pOutFile = aOutFile.getStr();
+ }
+ else
+ {
+ fprintf( stderr, "no output file given\n" );
+ return 11;
+ }
+ }
+
+ return handleFile( pInFile, pOutFile, pPassword, aHdl );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/test/testTdf105536.pdf b/sdext/source/pdfimport/test/testTdf105536.pdf
new file mode 100644
index 000000000..d0bb7d776
--- /dev/null
+++ b/sdext/source/pdfimport/test/testTdf105536.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/testTdf141709.pdf b/sdext/source/pdfimport/test/testTdf141709.pdf
new file mode 100644
index 000000000..3198782fa
--- /dev/null
+++ b/sdext/source/pdfimport/test/testTdf141709.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/testTdf96993.pdf b/sdext/source/pdfimport/test/testTdf96993.pdf
new file mode 100644
index 000000000..73abbd129
--- /dev/null
+++ b/sdext/source/pdfimport/test/testTdf96993.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/testdocs/graphicformats.pdf b/sdext/source/pdfimport/test/testdocs/graphicformats.pdf
new file mode 100644
index 000000000..f41c83f15
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/graphicformats.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/testdocs/graphicformats_pdfi_unittest_draw.xml b/sdext/source/pdfimport/test/testdocs/graphicformats_pdfi_unittest_draw.xml
new file mode 100644
index 000000000..18b79e805
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/graphicformats_pdfi_unittest_draw.xml
@@ -0,0 +1,259 @@
+<?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 .
+ -->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="20mm" fo:margin-right="10mm" fo:margin-top="20mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:auto-grow-height="true" draw:auto-grow-width="true" draw:fill="none" draw:stroke="none" draw:textarea-horizontal-align="left" draw:textarea-vertical-align="top" fo:padding-bottom="0cm" fo:padding-left="0cm" fo:padding-right="0cm" fo:padding-top="0cm" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Thorndale" fo:font-size="12pt" style:font-size-asian="12pt" style:font-size-complex="12pt" >
+
+</style:text-properties>
+
+</style:style>
+<style:style style:family="graphic" style:name="graphic9" >
+<style:graphic-properties draw:fill-color="#ffffff" draw:fill="solid" draw:stroke="solid" svg:stroke-color="#000000" svg:stroke-width="3" >
+
+</style:graphic-properties>
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:drawing >
+<draw:page draw:master-page-name="master-page3" >
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 20.18mm )" draw:z-index="0" svg:height="4.23mm" svg:width="8.95mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+B
+M
+P
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 37.21mm )" draw:z-index="11" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 42.26mm )" draw:z-index="1" svg:height="4.23mm" svg:width="8.7mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+E
+M
+F
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 92.6mm 56.86mm )" draw:z-index="14" svg:height="-9.95mm" svg:width="25.25mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:path draw:style-name="graphic9" draw:transform="translate( 92.6mm 46.95mm )" draw:z-index="12" svg:d="m9260 5640h2476v-945h-2476v945z" svg:height="9.45mm" svg:viewBox="0 0 2476 945" svg:width="24.76mm" >
+</draw:path>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 61.45mm )" draw:z-index="2" svg:height="4.23mm" svg:width="6.83mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+G
+I
+F
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 76.72mm )" draw:z-index="15" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk7vyMlsxebqxserS8xvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vyEhrRUXpxUYpxUXpxUYpS8vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzU2vRUXpRTYqRkcqxZZqRUYpxUYpy0vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vzc5vzc4vzs7vz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vzc4vTc4vxUYpxUXqSBisy0vvxcaqxUXpxcZpS8wuz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vy8xuSKjqxoboxkaoxkaoxcYoRscpycnrzEyuT8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk6vx8hqxkbpzM1vyMlsxUXpxUYpyMltS1wvxkbqRUXpxUYpS8vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzU2vx8gqxcYoR8gqS8vtzk4vTZ3vSwttRkbpxUYpRUYpSMkrz8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vy0vuRUYoxUXpxkbqTEzvyFksxUXpxUYpyFksy1wvRcaqxUXpxUYpS8vtz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzM0uxcZpxUXpScnsz0+vz8/vz8/vz8/vz8/vzE0vxUYpxUYpx0frT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vx8gqSkqtSsuvRUYpxUYpxkbqTE0vyEjsRUYpxUXpyFksy8xvxcZpxUXpxUYpS8wuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk7vxkbpxUXpxmcqTs9vz8/vz8/vz8/vz8/vz8/vz8/vx8gqxUXpSaosz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyUnsRUYpRUYpSkqtystuxUXpxUYpxkcqy9yvyEjsRUXqRUYpyMlsy1wvxebqxUXpxcZozU2vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vykqtRUYpRUXpyUntT8/vz8/vz8/vz8/vz8/vz8/vz8/vyMlrxcYozByvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vyMlry0vuxveqxUXpxUXpycqtystuxUYpxUXpxscqy9yvyMlsxUXpRUXpyFksy1wvRkbpycqtSkqsy0utz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vxsdqxTYqRUXqSkrtz8/vz8/vz8/vz8/vz8/vz8/vz8/vycnrxcZozs8vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vx8gqxUYpRsdqTEzvx0frxUXpxUXpSkquSsuvRcYqRUYpxkcqy8xvyMlsxUYpxUYpx8irzY3vycptxUYpRcYoS8wuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk6vxcZpxUXqRUXqSEjrz8/vz8/vz8/vz8/vz8/vz8/vz8/vyUmrR8fpz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz08vx8irRUYpxUXpyEiry9yvy8xvR0erRUXpxUYpykruSstuxUYpxUXpxscqzM1vx8hrxUXpSaosystuxUYpxUXpxmcqS8vuTMzuz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk5vxUZpxTYqRMXqxZZqTc5vz8/vz8/vz8/vz8/vz8/vz8/vyqrsSsssT8/vz8/vz8/vzk7vy0utyUnsy0utz0+vz8/vz8/vz8/vz8/vz8/vz8/vz08vzY3vzU2vTc4vz8/vz8/vz8/vz8/vz8/vzEyuyUmryUnsTk7vz8/vz8/vz8/vz8/vz8/vzc4vysttyepsy0utz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vyEjrxUXpRUYpyFksy1wvxcZpR0fqy1wvRsdqxUYpxUXpScqtyksuxTYqRUYpSXotTs8vy0vuSkruRUYpxUXpxkcrS8xvx8irRcYoS0ttz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vxkbqRUXqROYqxUXpyEjrT0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8xuRkbpxUYpRUXpxUYpS8vtT8/vz8/vz8/vz8/vz8/vz8/vyUlrRUYpRUYpR0epT09vz8/vz8/vz08vyMlrxUXpRUYpRUXpSkqsz8/vz8/vz8/vz09vybosRcYoRUXpRUYpRUYpSUnsT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vx8gqxUXpxUYpyMlsy1wvRebqxUXpxcYozEzvTc5vxsdqRUYpxUXqR8hsxZZqRUXpyMlsz8/vyksuRUYpxUXqRveqy9yvx8isRUXpxUYpSMlrT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyMlsRUXpxUXqRUXqRUYpycptT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8wuRUYpRUYpRUYpxTYqRUYpSsssz8/vz8/vz8/vz8/vz8/vzY3vxUYpRUXpxUYpSbosT8/vz8/vzs7vx8hqxUYpRTYqRUYpxUXpyRmsT8/vz8/vzk6vx1fqRkaoyaosx8hrxUXpxUXpxmcqT0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vx8hrRUXpxUXpyFksy8xvxcZpxUYpxUYpzByvTs8vzk7vzY3vxscqxTYqRUXpxUYpxUXpy1wvSstuRUYpRUXpxkcqzEzvx8isRUXpxUYpyMlszs8vzk6vz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzByvRUYpRTYqROYqxUXqRUYpywttT8/vz8/vz8/vz8/vz8/vz8/vzV2uxcYoS0vuyotvRUXqRUXqRUYpzM0uz8/vz8/vz8/vz8/vz8/vycqtRUYpxUXpxUYpzU2vz8/vz8/vyDhqRkcpzU2vxkdrRUXqRUXpykqtT8/vzs8vx0dpx8hqzk7vz8/vy1wvRTYqRTYqRmcqT09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vx8irRUYpRUXpyEksS1wvRkaqxUXpxUYpy1wvSkquRebqxcaqSEjsS9yvx8hrRcZpRcapycqtSksuRUXpxUYpxscqy8xvx8isRUYpxUYpSPmtS9yvx0frRcZpxsdqS8vtz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vx8gqxUXpxTYqRMXqxUYpxUZpzM0vT8/vz8/vz8/vz8/vzs8vxsdpSkqsT8/vyQmsxUXqRTYqRsdqz09vz8/vz8/vz8/vz8/vz8/vx0frRUXqRTYqRserT0+vz8/vykqsxcapTc4vzs8vxcaqRUXqRUYpS9yvz09vx8gqSEiqT09vz8/vz8/vyUntRUXpxUXqR0grT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyUnsRUYpxUXpyUnty0vvxcaqRUYpxcYqS1wvSXotxUXpxUYpxUXqRUYpx0grTs9vzc4vzk6vzM1vxUYpRTYqRkdrS8xvx8irxUYpxUXpyPmtS1wvRZZqRUXpxUXqRUXpxUYpTU2vT8/vz8/vz8/vz8/vz8/vz8/vz8/vzY3vxcZpxUXqRTYqRMXqxTYqRkbqTc5vz8/vz8/vz8/vykqsx0fpz0+vzk7vxcaqRUXpxUYpycptT8/vz8/vz8/vz8/vz8/vzU2vRUYpxTYqRUXpycptT8/vzc4vRgZoTM0vT8/vzEyuxUYpxUXqRUZpzk6vyMlrx1fqT09vz8/vz8/vz0+vxsdqxTYqRUXpycnsz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vxcZpRTYqRsdrSotvRebqxUXpxcZpy8xvyXotxUYpxUXpx0frxsfrxUYpxUYpTc4vz8/vz8/vykqtRUXpxTYqSsuvSBisxUYpxUXpSPmtS1wvxZZqRUXpxcaqyBisxUYpxUXpSkrtT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0vuRUXpRTYqRTYqRUXqRUYpx8gqz0+vz8/vzk4uxobozY3vz8/vy0utxUYpxUXqRUYpTU1vz8/vz8/vz8/vz8/vz8/vybosRUXpxUXpxUZpzY3vz8/vycorSkprz8/vz8/vybosRUXpxUXqSEjsSstuRsdpzs7vz8/vz8/vz8/vzEyuRUYpxUXqRUXpTEzvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vxmcqRUXpxcYqRUXpxUYpxZZqS1wvScptxUYpxUYpx0gry9yvx0frxUYpxcZpTs7vz8/vz8/vystuRUYpxUYpxcaqRUXqRUXpyPmtS8xvxcaqRUXpxZZqS0vvyUntxUXpxUYpS8vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyRmsRUXpxMXqxOYqxTYqRUYpykstz8/vzZ3uy8vtT8/vz0+vx8gqxTYqRUYpx0eqT0+vz8/vz8/vz8/vz8/vzs9vxmcqRTYqRUXpx0fqz0+vz8/vzk5vT09vz8/vz09vxsdqRTYqRTYqSMlsxscpzP1uz8/vz8/vz8/vz8/vyMkrxUXpxTYqRkcpzs9vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8vtxUYpRUYpRUXpxcZpy0vvSXotxUXpxUXpx0gry9yvx0frRUYpxUXpykstzE0vykqtS0uuTM1vxsdqRUXpxUXpxUXpSUnsy1wvxcaqRUXpxcaqS1wvSUntRUYpxUXpx1fqT09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs9vxveqxUYpxUXqRTYqRUXqRcapzs7vz8/vz8/vz8/vzU2vxUYpRUXqRUXpysstT8/vz8/vz8/vz8/vz8/vystuRUXpxTYqRUXpykqsz8/vz8/vz8/vz8/vz8/vzM1vxUXpRUXqRTYqRUYpSkqtT8/vz8/vz8/vz8/vzk5vxcapRTYqRUXpyUnsT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzMzuyMlsSUnszEzvyXotRUXpxUYpx0gry8xvxsdrRUXpxUYpScquSksuRUYpRUXpRUYpRserS9yvycptyMlsS0vvS1wvRZZqRUXpxcaqS1wvyPmtRUYpRUXpx8hrTk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzY3vxcaqRUXqRMXqxTYqRUYpy8wuT8/vz8/vz8/vycqtRUYpxUXqRUZpzc4vz8/vz8/vz8/vz8/vzs9vxsdqxTYqRUXqRUYpzU2vT8/vz8/vz8/vz8/vz8/vykrtxUXpxTYqRUXqRsdqTs8vz8/vz8/vz8/vz8/vycptRUYpxUXqRUYpTM0uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vyXotRUYpxUXpx0erTEzvxserRUYpxUYpycptTk6vxUYpxTYqRUYpxUYpxUXpxserTk7vz8/vy9yvxUYpxUXpxcZpy1wvyQmsxUXpxUXpx0fqzs8vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vybosRUXpxOYqxMXqxUYpynrsz8/vz8/vz09vxkcqxUYpxUXqSEjrz8/vz8/vz8/vz8/vz8/vyepsxUXpxUXqRTYqRserT8/vz8/vz8/vz8/vz8/vz0+vxveqxTYqRUXqRUYpy8wuT8/vz8/vz8/vz8/vzs8vxkbqRUXqRUYpx0frT0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzM0uRcYoxUYpR0grzEzvx0erRUXpxUXpyUntT8/vzY3vxUYpxTYqSEktSXotxUXqRUXpx1fqTc4vx0grRUYpRcaqS0vvSUntRUYpxUXpx0fqzs6vz8/vz8/vz8/vz8/vz8/vzV2uy0usz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk5vxcaqRUXqRMXqxUXpybosT8/vz8/vzM0uxUXpxUXqRUYpS8wuz8/vz8/vz8/vz8/vzR1vRUYpRZZqRUXqRTYqSUnsz8/vz8/vz8/vz8/vz8/vzR1vRUYpxTYqRUXqRveqz0+vz8/vz8/vz8/vz8/vy8xuRUXpxTYqRUXpy0uuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utR8hqy8xvxserRUXpxUXpykquSkrtyEjrzk7vxveqxUXpxcaqSsuvykruRUXpRUYpxsdqy8xvR8hrS0vuyUntRUXpxUXpx0fqzk6vz8/vz8/vz8/vz8/vz8/vz8/vyMlrx0epz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyEjsRUXqRUXqRUYpykqsz8/vz8/vybosRUXpxTYqRkbpzk7vz8/vz8/vz8/vzs8vx1fqSQmsxcaqxUXqRUXpTM0vT8/vz0+vykprzc5vz8/vybosRUXpxUXqRUYpTEzvT8/vz8/vz8/vz8/vz8/vyEjrRUXpxTYqRUZpzk6vz8/vzU1uS0usz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk7vx0eqRUXpxUYpycquS8xvRUYpRUYpSMlszEzvxebqxUYpxcZpy0uvSXotRTYqRUYpx0frTc4vycqtRUXpRUYpRveqzk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vx0fqx8grT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vycptRTYqRTYqRUXpy8wuT8/vzs9vxmcqRUYpxUXpyRmsT8/vz8/vz8/vz8/vyUmrSMlrystuxUXqRTYqRsdqTs9vz8/vzM0uRkaoTs7vz0+vxveqxUXpxUYpx0fqz8/vz8/vz8/vz8/vz8/vzc5vxUYpRUXqRUXpyMlrz8/vz0+vx8gpysrrz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vysstRcYoyXotSstuy0vuyEjrxUXpxUYpyMlsy8xvxkbqRUXpxZZqS0uvSXotRUYpRUXpx0gry1wvRsdqR0eqTs7vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vxcapx8grT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyXotRUXpxUXqRcapzk7vz8/vzM1vxUYpRTYqRUYpzR1vT8/vz8/vz8/vysstRsdqTs8vyEirxUYpxUXpyaosz8/vz09vx0epyxtsz8/vzU1vxUYpRTYqRUXpy0vuT8/vz8/vz8/vz8/vz8/vy0uuRUYpxUXqRUYpzEyuz8/vy0utx0dpz0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzR1vSkrtRUYoxkbpy1wvSEjsxUYpxUXpyMlsy8xvxebqxUXpxcYqS0uvScptxUXpxUXpxveqzEyuzk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzU2vRUYpRveqz8+vz8/vz8/vz8/vz8/vz8/vz8/vz0+vx0erRUYpxUYpSsstz8/vz8/vysttxUXpxUXqRsdqz0+vz8/vz8/vyxtsxobozc4vzs9vxcapxUXqRUYpzEyuz8/vyUnsR0fpz8+vz8/vyXotRUXpxTYqRsdqz09vz8/vz8/vz8/vz8/vz8/vyEjrxUXqRTYqRebqz0+vzY3vxkaozEzvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utxcYoxUXpxebqy8xvx8isRUYpxUXpyMlsy9yvxcaqRUYpxUYpy0vvycptxUYox0epzs7vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8wtxUYpxcZpzk6vz8/vz8/vz8/vz8/vz8/vz8/vzEyuRUYpRUXpx8irT8/vz8/vz8/vyMlsRUYpxUXqSEjsT8/vz8/vykrtRkZozP1uz8/vzU2vxUYpRTYqRTYqTY3vy0uuRgZoTc4vz8/vz0+vx0frRUYpxUXpycnsz8/vz8/vz8/vz8/vz8/vzs8vxcaqRUXqRTYqSPmtTk6vxscpyUnrz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vysttxUYpRUXpxscqy1wvx8isRUXpxUYpyPmtS9yvxcaqRUYpxUYpysstysstTk5vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vynrsxUYpRUXpynrsz8/vz8/vz8/vz8/vz8/vzk7vxsdpxUXpR0fqzs6vz8/vz8/vz8/vx0grRUYpxUXqRkcqysstyHjqRkbpTR1vT8/vz8/vzEzvRUYpRTYqRTYqR0fqxcYozEyuT8/vz8/vzZ3vRUYpxUXpxUYpTM0vT8/vz8/vz8/vz8/vz8/vzZ3vRUYpxTYqRUXqRebqxkbpyMkrTc4vy0uszMztz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0ttxUYpRUYpxebqy8xvyEksRUXpxUXpyMlsy8xvxcaqRcYox1fqT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzZ3vRscpxUYpRUXpSaoszk5vzs9vzs7vy8wuxscpxUYoyUmrzs8vz8/vz8/vz8/vz8/vyEjrxUXpxTYqRUXpxUYox8gqTk5vz8/vz8/vz8/vzExuxUYpRUXpxUYpxcZpTExuT8/vz8/vz8/vykqrxUXpRUYpRscpz0+vz8/vz8/vz8/vz8/vz8/vzZ3vRUYpRUXqRTYqRUYpSMjrT09vzV2uy0ssTAwtT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0vuRUYpRUYpxkbqS1wvyEktRUYpxUXpSwuuzEzvx8irTs6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vy8wuyMkrxcapRsbpR0dpRscpRkbpSUmrzU1vz8/vz8/vz8/vz8/vz8/vz8/vzU2vRsdqRkbpyEjry8xuz0+vz8/vz8/vz8/vz8/vzk5vxscpxcZpSMlsTc4vz8/vz8/vz8/vz8/vzP1uysstSsstTMzuT8/vz8/vz8/vz8/vz8/vz8/vz09vyEjrxcapxveqy0ttz0+vz8/vzs8vzV2uzk5uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vysttxUYpRUXpxebqyksvRcaqRUXpyMksT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vzk4vTP1uzZ3uz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vzs6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8+vzs7vz8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utxUYpxUXpxUYpxUXpxUYpSepsz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utxkapRUXpRUYpR1fqTk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzV2uy8vsz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzZ3vTP1uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzY3vyssty0vuT09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8+vzs7vTc4uzU1uT0+vzM0uTk5vT8/vzP1uzZ3vT8/vz8/vzU2uTU1uT8+vzs7vTc4uzs7vz8/vzU0tzZ3uz8/vz8/vzk6vTU0tzs8vzk5uz8/vz8/vzk5vT8/vzk4uzU1uTs8vybosSanrTk5vT8/vzk6vzU1uT0+vz8/vzs6vzc4uzV2uz8+vzU1uTk5vT8/vz8+vzU1uTk5uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vx/hpykqsScorSKjqyxtsx8gqTk7vysssysssz8/vykqrykqrzAwtTs8vx/hpycorTk6vykprywttSUmrS0vtzc4vyUlqzEytzk6vyUmrTc4vTc4vykpry0utyMlrTM0uTk6vyMlryMkrTU2vTM0uSUlrSwttScorTs9vx8gqSnrsyMlrSEjrSsssyMkqzs9vyUmqyxtszk5vT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vyDhqT09vzEyuSUnrz8/vyEjrTc4vzR1vSsstTs7vyEiqT8/vz8/vz09vyDhqTs8vzc4vSMkrT8/vzk7vyMkrTc4vyKjqy0utT09vy8wuSbosSnrszEyuTEyuyDhqTEytz8/vy8wuS0utz8/vyUnryMkrSsttyUmrTs7vyEiqz0+vy0uuSRmsT8/vyUmrzs7vycorybosTc4vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs9vyKjqz0+vzExtykprz8/vyKjqzc4vzMzuyssszs8vx/hpz08vz0+vzs8vyUlqz8+vzk5vSDhqT0+vzM0vSUnrz8/vzs7vyUlrSkrtT09vx0fpyDhqTs8vz8+vzk5vyEiqTR1vS8wuSsstT8/vyanrSkqszs8vz0+vz08vyKjqz8/vy0ttykqsz8/vyUlrTs7vz0+vzExtyDhqT8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vykorz8/vzMzty0usz8/vykorzk6vzU2vS8vtT8/vyqrsSanrSqrsTs7vysqrz09vz8/vykqsScoryUmrTZ3vTs7vysssScorTR1vT0+vycnryanrT8/vzV2uysrrycorzs7vzY3vyHjqTMzuTk4vSUlqyqrsTExtT09vykprz8/vy8wty0utT8/vysrrzs8vzExtSkpsS0utT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz08vz09vz8/vz8/vz8/vz8/vz8/vz08vz8+vz8/vz8/vz08vz09vz8/vz09vyUmrTP1uz8/vz09vz08vz8+vz8/vz8/vz09vz09vz8/vz8+vz08vz09vz8/vz8/vz8/vz8+vz8/vz8/vz8/vz8/vz09vz08vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vycorysssz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vw=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 81.77mm )" draw:z-index="3" svg:height="4.23mm" svg:width="7.04mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+J
+P
+G
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 97.04mm )" draw:z-index="16" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAoAGQDASIAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAAAAUGBwIDBAgB/8QAOBAAAQMCBAQFAgMGBwAAAAAAAQIDBAURAAYSIRMxQWEHFCIyUXGBFSORJDNCcqHhNENSU2KSwf/EABkBAAMBAQEAAAAAAAAAAAAAAAECAwQABf/EACMRAAICAgEEAwEBAAAAAAAAAAABAhEDIRIEIjFBE1GhcYH/2gAMAwEAAhEDEQA/APVOE+Z6/FoEEOyFJVIdJRHYKwkvLtcJBOw+pxqzhmWJlilGVKu48s6GGE+51fQD/wBOKPnVKRWapKXX3W1h3T5zWohmA3f0pRa5Lv0v1G91W1dP0zydz8E5z46Ma/WZFXzAa6JkmEr0NtkKP7A8ALoWm3tJB378jYjFu+H+cU19tcCooEatxk/nNdHB/uI+Qdv1HQjFNoiy1S2n4qPxCCFcN2pJSQy9HHuD4I9Kki25seXOwOMkTfLSY6qMuYmG08fw9BNpEshRtqI5NJ+Pr1Jt6GXBHLFRXolGTTs9KYQ5yzNFyvTEypKFvPOrDTDCPc6s9Ow7448k5uh12O3EcmxXaw03qkNsatN+RKSRuOXK4xEPH+DKMCk1SNq4cN1QWR/AVadKv1Tb7jHm4sN5VCei0pdtok9SlZwiUd6pkUfU02XlQuG4TpAuRxNW6rf8bYeZUqrlcy7BqTsfyy5Levh6tVtz178/vhPkvMsTO+WnQTw5PDLMppJ3QSLXHY72/tiIZyznUqBDp0XK7TCKchfk2HHRrW+WwEkoTy0g2TfqeW2+CsUpv46pg5JbLdwYRZnrSqDlOVVJCUeYZZBCL+kuGwA+mo/piOZfzdVpWVIUqTHjvVioKcMVlAKEJaTsXHDc2SOZPW4A3OJRxSlHkv4NyXgsDBir8g57qdSo0x+pNolzFyeBCYYSEF1Wm5HZKQQSo8h9sb6TmjMCPEtGX6qqA60touLTGQQGToKgNR3PTn89MO+nmm19A5osnBgwYgORfPeUGM1R4hXJfiyYalLZdZtfe1xv9BvfpijZMZ2JJEJUThPRypbMJ4ghkD3SJB5E2FwOXLpYK9NYiGfcprrkRUilOpiVZuxDgAAfAvZDnyNzz2xt6XqXj7JeCc4XtFReflUiLLy/TvLzqZJZEl5YuFzNaRqU0emm1gLX9JuDuMcMpiHHjJegyZLtNdaShyY7bjObf4ZtO+k9D27WCtCw21JTBlIchr8wEKj7h2E+T72upQeo/scW9kLIq4DyqjXm2TOKv3LZCmipJ2etbZZ7fPS9huyZI4Vy+/0jFOWjR4W5OegPiu1RlMWStrhRoaBYMNn/AFdSo99999+U3jPwMy0NSwjjwJSVtlK021AEpP8AUHHfKQtyM6hpQQ4pBCVHobbHEGyYK9lehN0efRXppjlQZfiPNlKwVE2VqUkp3PxjzJSeVubey6XHRXWXafIyh4vt0lhxaozyy0Rf94ytNxfuNvuMPkxmsx+MMeFHbSmk0BsJShI9IKOn/cgfROJdlvKslWaJeZ8wcL8SdGmPHbVqTGRa3u6qttcbbn5xHckZVzVTKhWkPCNCbnvanJ2sLd03UfywNgTq5q5fBxqlmjK5XtKv99k1FrRw+NNYdq9Qp2W6aCpC5AS4sclO7AIH8urfuexxJM8Tqdl7Ik5unlsy47KKUlaR6kkpB03/AJTqwsr2TqyM90iTQY8dFPhRwht59epKFXVqUU31KVdWrueZx1ZwyNOqn4DTYZSulsPF+a865+Y6tShqWR1JGr9bYS8dQjelsNPbDwoo6MuZNVWqr6XVsqfGr/KZ91h3Va5+w6YU+EShOrVWzXVVpbdnSPKRgrqpXqKR9AEj6A4nXiHTZ1RyVOp9FbSZDiUIS2FBN0hQuBfbkDhHkLK9XpEKlKqSIuuLqQiOk3DIWSVuE/xOG9vgDYczhfkUoSm3tv8AA8aaRYeDBgxiKhgwYMccLZVCpcupM1CTAjOzWraHlIBULct+3T4wywYMFtvydQYiy4tf81xUyXdHFKuHdvTp44sOV7cK/wB++DBgxdAez4mNW2WHGW+MkiM5wFIU3pDpLm6789i3a2173xm8xXUy30NPyOElKkodPDUCnhix07Hia7noLfbBgw3P3R1HG0/XZEh6Ih4tKbipdWUaXVNukFIbN7A3A187/wBMfVxK+lTzzHHbdfTHLgDiXAkAELCbkeq9j3F974MGGc6ekBKzbJh5iUpSm5j3tUABw0g2ZTpNrGxLmq+/LthzSBPTKnidqU0XAWVqIGxv6QkdBtv1+MGDCOVqg0NMGDBhAn//2Q==
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 102.09mm )" draw:z-index="4" svg:height="4.23mm" svg:width="8.94mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+P
+B
+M
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 117.36mm )" draw:z-index="17" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDQKMTAwIDQwCgAAHAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAO8AAAH8AAAAAAAAAAb/AAAHHwAAAAAAAAAHe8AADgcAAAAAAAAAG73gABwHAAAAAAAAAD/e4AA8BgAAAAAAAABd79gAPAYAAAAAAAAA73e4ADwGAAAAAAAAAfe7fAA8BBgAAYBgAAPf/PcAPgA+B4fD8AAH+f3vAD8A/gePx/AAD3D73gAfgLwPG8xwAB/vf73gH4G8DzOY8AA9/4d74A/DPA8jsPAAP7+P/+AH4ngeZ+DgAD+7h+7wB/J4HgfB4AA+9ze94APweD4HweAADe/7f8AB8PA8D4PAAAPe/HeAAfjwfA8DwAADuP7vAAD48HwPA8AAAX73fgMA8eD4ngeAAAD3f5wDAPnhuJ4HmAAA17v4AwDxw3kcDzAAAD/f4AMA8cZ7PA8gAAA97uADAePMcjwPYAAAD/eAB4HD+H44D9AAAA9/gAPDg/B4eA+QAAADuQAA/gHAcCAOAAAAA/wAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAA+AAAAQAAAAAAAAAAACAAAAAAAADAAAAAAAAAAAFqJqScyrUAAAAAAAABKUSUpFqVgAAAAAAAAUlEkmJYpEAAAAAAAAEoZKZmSpSAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAIAAAAAA=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 122.41mm )" draw:z-index="5" svg:height="4.23mm" svg:width="8.25mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+P
+X
+C
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 137.68mm )" draw:z-index="18" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 142.73mm )" draw:z-index="6" svg:height="4.23mm" svg:width="9.16mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+P
+G
+M
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 158mm )" draw:z-index="19" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6YmJhubm59fX3Hx8f7+/v9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v739/eJiYlhYWFiYmJiYmJjY2O/v7/8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3c3NxiYmJiYmJ1dXVqampiYmJkZGS/v7/8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v79/f38/Pzz8/Pl5eXj4+Ps7Oz29vb8/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3w8PDh4eHk5ORiYmJiYmKOjo6/v79ubm5iYmJmZmbFxcX8/Pz+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v79/f329vbGxsaOjo5ubm5ra2tqampjY2N1dXWfn5/MzMz39/f+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3q6uqIiIhubm7W1taYmJhhYWFiYmKZmZnFxcVubm5iYmJjY2O+vr78/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f39/f3a2tqDg4NiYmKDg4O/v7/h4eHe3t63t7dubm5jY2NiYmKUlJT6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f309PS/v79gYGBhYWFxcXHR0dGUlJRiYmJhYWGTk5PDw8Nubm5hYWFiYmK/v7/8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f3S0tJnZ2diYmKfn5/4+Pj8/Pz9/f39/f38/PzS0tJmZmZjY2OBgYH6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3w8PCDg4Oqqqq+vr5jY2NiYmJubm7Q0NCQkJBiYmJiYmKUlJTHx8doaGhiYmJiYmLExMT8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f3s7Oxvb29hYWFzc3Py8vL9/f3+/v7+/v79/f39/f36+vqEhIRiYmKkpKT9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f38/Pyenp5hYWFiYmKrq6u3t7djY2NiYmJ0dHTMzMyOjo5iYmJjY2OYmJjGxsZubm5iYmJlZWXb29v8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f2tra1iYmJiYmKgoKD8/Pz+/v7+/v7+/v7+/v79/f38/PyZmZliYmLMzMz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6ampq9vb19fX1iYmJiYmKrq6u3t7diYmJiYmJ0dHTNzc2YmJhiYmJiYmKUlJTCwsJxcXGpqamtra28vLz8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v739/d4eHhiYmJiYmKurq78/Pz+/v7+/v7+/v7+/v7+/v78/Pyfn59mZmbw8PD9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3v7++FhYViYmJ4eHjR0dF+fn5iYmJhYWGrq6u9vb1lZWViYmJycnLKysqVlZViYmJiYmKLi4vc3NypqalhYWFiYmLExMT7+/v+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3q6upmZmZiYmJiYmKPj4/8/Pz+/v7+/v7+/v7+/v7+/v78/PyZmZmAgID8/Pz9/f3+/v79/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v79/f39/f39/f39/f3+/v7+/v79/f39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v79/f39/f39/f38/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3x8fGNjY1iYmJiYmKMjIzLy8vHx8d9fX1iYmJjY2OysrK2trZlZWViYmJzc3PX19eJiYlhYWGioqK1tbVjY2NiYmJycnK/v7/Ozs78/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7o6OhnZ2diYmJiYmJoaGjk5OT9/f3+/v7+/v7+/v7+/v78/Pyurq6ysrL9/f39/f39/f3s7Oy8vLyhoaG6urr39/f9/f3+/v7+/v7+/v7+/v79/f3z8/Pc3Nzb29vj4+P9/f39/f39/f38/Pz8/PzJycmampqgoKDr6+v9/f3+/v7+/v79/f38/Pzh4eG3t7empqa8vLz09PT9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6NjY1iYmJiYmKUlJTDw8NpaWl/f3/Dw8N6enpiYmJiYmKrq6uzs7NmZmZiYmKjo6Pv7++9vb2ysrJjY2NiYmJ1dXXJycmKiopiYmK6urr6+vr+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7z8/Nvb29iYmJhYWFiYmKQkJD5+fn8/Pz9/f3+/v7+/v79/f36+vr9/f39/f38/PzHx8dxcXFiYmJiYmJhYWG/v7/9/f3+/v7+/v7+/v79/f38/PyWlpZkZGRkZGR6enr39/f9/f39/f3y8vKWlpZiYmJiYmJhYWGpqan9/f3+/v79/f3y8vKjo6NiYmJiYmJiYmJiYmKhoaH9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6EhIRiYmJiYmKYmJjGxsZubm5iYmJjY2POzs7n5+d4eHhiYmJiYmKKiopoaGhhYWGYmJj6+vq2trZiYmJiYmJ6enrKysqMjIxiYmJiYmKWlpb9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PyWlpZiYmJiYmJiYmJiYmKrq6v8/Pz9/f3+/v79/f39/f3+/v7+/v78/PzCwsJiYmJjY2NiYmJjY2NiYmKysrL9/f39/f3+/v7+/v79/f3f399jY2NiYmJiYmKkpKT7+/v9/f3u7u6Hh4djY2NlZWViYmJiYmKZmZn8/Pz9/f3q6uqAgIBtbW2jo6OIiIhiYmJiYmJ0dHT39/f+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3z8/OHh4diYmJiYmKUlJTHx8doaGhiYmJlZWXJycnx8fHs7Oze3t53d3diYmJiYmJiYmJiYmLDw8O3t7diYmJhYWF0dHTR0dGMjIxiYmJiYmKXl5fw8PDq6ur09PT9/f3+/v7+/v7+/v7+/v7+/v7+/v79/f3KyspiYmJiYmJjY2NiYmJiYmK4uLj8/Pz+/v7+/v7+/v7+/v79/f3Y2NhiYmK/v7+3t7diYmJiYmJjY2PS0tL9/f3+/v7+/v7+/v78/Pyrq6thYWFiYmJkZGTb29v8/Pz5+fmIiIhycnLc3Nx4eHhiYmJiYmKtra38/Pzw8PB4eHiFhYXt7e36+vrBwcFiYmJiYmJycnL19fX+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3z8/ONjY1iYmJiYmKTk5PDw8Nubm5iYmJmZmbBwcGurq5wcHBqamqPj4/JycmKiopmZmZra2upqamysrJiYmJiYmJ0dHTKysqKiopiYmJiYmKcnJzLy8t/f39oaGh2dna9vb38/Pz+/v7+/v7+/v7+/v7+/v79/f329vaEhIRiYmJiYmJiYmJiYmJoaGjR0dH9/f3+/v7+/v79/f3y8vJ2dnapqan6+vqamppiYmJiYmJ3d3f09PT+/v7+/v7+/v7+/v78/PyAgIBiYmJiYmJ8fHz5+fn8/PysrKxra2vj4+Pw8PBqampiYmJiYmLKysr09PSEhISKior19fX9/f38/PyhoaFhYWFiYmKDg4P6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f2enp5iYmJiYmKamprExMRtbW1iYmJmZmbCwsKkpKRiYmJiYmJiYmJiYmKEhITy8vLi4uLq6urY2NhjY2NiYmJ3d3fKysqKiopiYmJjY2OdnZ3Dw8NqampiYmJiYmJiYmJiYmLa2tr9/f3+/v7+/v7+/v7+/v7+/v79/f3b29tnZ2diYmJiYmJiYmJiYmJwcHDl5eX9/f3+/v79/f2pqal/f3/5+fns7OxqampiYmJiYmKpqan8/Pz+/v7+/v7+/v79/f3b29tlZWViYmJiYmKoqKj8/Pzh4eFoaGjS0tL8/PzKyspiYmJiYmJoaGjq6uqWlpZ/f3/19fX9/f3+/v729vZ4eHhiYmJiYmKgoKD8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PxpaWliYmJ6enq3t7dubm5iYmJpaWnIyMijo6NiYmJiYmJ/f3+AgIBiYmJiYmLi4uL8/Pz8/Pyrq6tiYmJmZma6urqMjIxiYmJiYmKdnZ3CwsJqampiYmJra2uOjo5kZGRiYmKurq79/f3+/v7+/v7+/v7+/v7+/v7+/v78/Py9vb1iYmJiYmJiYmJiYmJjY2OEhIT4+Pj9/f3k5ORvb2/e3t78/Py9vb1iYmJiYmJiYmLX19f9/f3+/v7+/v7+/v78/PyhoaFiYmJiYmJlZWXd3d38/Pyjo6OkpKT8/Pz8/Pyjo6NiYmJhYWGQkJC2trZ2dnbs7Oz9/f3+/v79/f3Ly8tiYmJiYmJiYmLOzs79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v77+/tzc3NiYmJmZmZiYmJiYmJoaGjCwsKpqaliYmJiYmKEhITNzc2AgIBiYmJoaGjv7+/8/Pz8/Py4uLhiYmJjY2NqampiYmJhYWGdnZ3IyMhra2tjY2NnZ2fBwcGfn59iYmJiYmK/v7/9/f39/f3+/v7+/v7+/v79/f3+/v79/f38/PyampphYWFiYmJiYmJhYWFiYmK1tbX8/Pzc3Ny8vLz7+/v4+PiFhYViYmJiYmJ7e3v29vb9/f39/f3+/v79/f3y8vJ0dHRiYmJiYmJ9fX36+vr8/Pzk5OT29vb8/Pz19fV4eHhiYmJjY2OYmJh1dXXU1NT9/f3+/v7+/v78/PyTk5NiYmJjY2Nzc3Pz8/P9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3BwcFiYmJiYmJhYWFoaGjBwcGkpKRhYWFiYmKEhITMzMyAgIBiYmJiYmKysrLS0tKtra28vLzW1tZ5eXlhYWFiYmJiYmKenp7CwsJra2tiYmJra2vExMSfn59iYmJiYmKAgIDz8/P9/f3+/v79/f39/f3+/v7+/v7+/v79/f39/f3z8/N9fX1jY2NiYmJiYmJiYmJra2vt7e39/f39/f38/Pzc3NxjY2NiYmJiYmKzs7P9/f3+/v7+/v7+/v78/Py4uLhiYmJiYmJiYmKoqKj8/Pz9/f3+/v7+/v79/f3X19diYmJhYWFkZGRjY2Opqan8/Pz+/v7+/v78/Pzn5+dpaWliYmJiYmKcnJz8/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PzLy8uZmZmfn5/S0tKjo6NiYmJiYmKDg4PLy8t5eXlhYWFiYmKtra2ysrJjY2NiYmJiYmJ+fn7KysqoqKiXl5e+vr7Dw8NqampiYmJra2vDw8OdnZ1iYmJjY2OFhYXq6ur9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3c3NxqampiYmJhYWFiYmJiYmLFxcX9/f3+/v78/PypqaliYmJiYmJmZmbk5OT9/f3+/v7+/v79/f3y8vJ3d3diYmJiYmJkZGTa2tr9/f3+/v7+/v7+/v78/Pyurq5iYmJiYmJiYmJ3d3fx8fH9/f3+/v7+/v79/f2oqKhiYmJiYmJiYmLS0tL9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f38/Pz39/ekpKRiYmJhYWF+fn7Ozs56enpjY2NiYmKpqanp6elmZmZiYmJlZWViYmJiYmJ7e3vs7Oz6+vrLy8tmZmZiYmJnZ2fExMScnJxiYmJhYWF/f3/u7u79/f3+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v79/f38/PyhoaFiYmJiYmJhYWFiYmKtra39/f39/f309PR1dXViYmJiYmKNjY38/Pz+/v7+/v7+/v78/PyoqKhiYmJiYmJiYmJ9fX35+fn+/v7+/v7+/v7+/v75+fl9fX1iYmJiYmJiYmLDw8P9/f3+/v7+/v79/f3w8PBwcHBiYmJiYmJ/f3/6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3S0tJiYmJiYmKEhITOzs5+fn5hYWFiYmKhoaH6+vre3t5iYmJiYmKTk5Ojo6NiYmJhYWF9fX3j4+ODg4NiYmJqamq/v7+fn59iYmJiYmJ+fn7p6en9/f3+/v7+/v7+/v7+/v7Z2dm6urr+/v7+/v7+/v7+/v7+/v7+/v79/f3m5uZqampiYmJhYWFiYmKjo6P8/Pz9/f3S0tJhYWFiYmJiYmLDw8P9/f3+/v7+/v79/f3W1tZnZ2dmZmZiYmJiYmKioqL8/Pz+/v79/f39/f39/f3U1NRjY2NiYmJiYmJ8fHz19fX+/v7+/v7+/v79/f3FxcViYmJiYmJjY2O6urr8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v76+vq6urqGhobJycl7e3tiYmJiYmKtra2wsLCQkJDq6up4eHhiYmJra2u+vr6tra1iYmJiYmJ6enrFxcWIiIi9vb2goKBiYmJhYWF/f3/p6en9/f3+/v7+/v7+/v7+/v79/f2ZmZl6enr9/f3+/v7+/v7+/v7+/v79/f3+/v78/PyPj49iYmJjY2NiYmKrq6v8/Pz7+/ujo6NjY2NiYmJubm7u7u79/f3+/v79/f3y8vJ9fX2cnJxra2tiYmJiYmLS0tL8/Pz6+vqlpaXm5ub8/PyioqJiYmJiYmJjY2POzs79/f3+/v7+/v79/f38/PyNjY1iYmJiYmJnZ2fp6en8/PzW1ta5ubn9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3q6up7e3tiYmJiYmKqqqrHx8diYmJiYmKZmZnOzs5vb29jY2NmZma9vb2lpaViYmJiYmKAgIDh4eGrq6thYWFiYmJ9fX3q6ur9/f3+/v7+/v7+/v7+/v7+/v78/PyAgICCgoL8/Pz+/v7+/v7+/v7+/v7+/v7+/v78/PyoqKhiYmJiYmJgYGDFxcX8/Pz09PR1dXViYmJiYmKampr8/Pz8/Pz9/f38/PyZmZmZmZm4uLhiYmJjY2N2dnb19fX8/PzS0tJra2vv7+/5+fl7e3tiYmJiYmKAgID7+/v9/f3+/v7+/v79/f3l5eVmZmZhYWFiYmKVlZX7+/v4+PiAgICtra39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PyysrJkZGSioqK6urq/v7+Pj49iYmJiYmKZmZnIyMhvb29iYmJmZma8vLykpKRiYmJiYmKCgoLDw8N4eHh7e3vq6ur9/f3+/v7+/v7+/v7+/v7+/v7+/v709PRqamqEhIT8/Pz9/f39/f3+/v7+/v7+/v7+/v78/Pyjo6NiYmJhYWFra2vs7Oz8/PzY2NhiYmJiYmJkZGTW1tb9/f39/f39/f2zs7N6enrx8fGNjY1iYmJiYmKjo6P6+vr19fV7e3u1tbX8/PzX19djY2NiYmJiYmK+vr79/f3+/v7+/v7+/v79/f28vLxiYmJiYmJiYmLMzMz8/Py6urp4eHj29vb+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PzW1tatra1iYmJubm7ExMSRkZFiYmJhYWGYmJjIyMhvb29iYmJlZWW8vLyoqKhiYmJiYmJ+fn7Kysrq6ur9/f3+/v7+/v7+/v7+/v7+/v79/f3+/v7c3NxiYmJ7e3v6+vr+/v7+/v7+/v7+/v7+/v7+/v74+Ph9fX1iYmJiYmK1tbX9/f38/Py1tbViYmJiYmJ4eHj4+Pj9/f38/Py1tbVubm7i4uLz8/Nra2tiYmJiYmLJycn7+/ufn5+AgID6+vr8/PylpaViYmJiYmJ1dXX09PT+/v7+/v7+/v7+/v78/PyNjY1iYmJiYmJycnL39/ff399qamrR0dH9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Py6urpiYmJiYmJubm7IyMiNjY1iYmJiYmKZmZnMzMxubm5iYmJlZWXCwsKoqKhiYmJ6enrr6+v8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3CwsJiYmJoaGjq6ur+/v7+/v7+/v79/f39/f39/f3JycliYmJiYmKJiYn5+fn9/f38/PyYmJhiYmJiYmKRkZH7+/v7+/uvr69oaGjU1NT8/Pzc3NxjY2NiYmJlZWXf39+9vb1mZmbh4eH9/f35+fl+fn5iYmJiYmKhoaH8/Pz+/v7+/v7+/v7+/v7w8PBra2tiYmJiYmKamprq6upycnKenp77+/v9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Py3t7diYmJiYmJzc3PFxcWNjY1iYmJiYmKcnJzLy8tubm5iYmJlZWW0tLSzs7Pm5ub9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f2tra1jY2NiYmKtra38/Pz9/f39/f39/f38/Pzt7e14eHhiYmKAgIDr6+v9/f3+/v76+vqEhIRiYmJiYmJzc3O0tLSMjIxubm7Y2Nj9/f39/f3Nzc1iYmJjY2NlZWV+fn5lZWXHx8f8/Pz9/f3d3d1lZWViYmJjY2PU1NT9/f3+/v7+/v7+/v7+/v7f399kZGRiYmJiYmJxcXFubm6Tk5Pg4OC6urrOzs7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Pz8/Py3t7djY2NiYmJycnLIyMiSkpJiYmJiYmKWlpbKyspra2thYWGAgID6+vr9/f3+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7c3Nx2dnZiYmJhYWGjo6Pn5+f09PTv7+/FxcVzc3NiYmKZmZnv7+/9/f3+/v7+/v79/f2Pj49iYmJiYmJiYmJiYmKDg4Pk5OT9/f3+/v79/f3IyMhiYmJiYmJiYmJoaGjFxcX9/f39/f39/f2oqKhhYWFiYmJzc3P29vb+/v7+/v7+/v7+/v7+/v7c3NxiYmJiYmJiYmJiYmKPj4/09PTb29uysrLDw8P9/f3+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Pz8/Py/v79iYmJiYmJubm7ExMSUlJRjY2NiYmK6urrT09OKioro6Oj8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u7BwcGTk5Nra2tvb294eHhzc3Nvb2+ZmZnW1tb8/Pz9/f3+/v7+/v7+/v79/f3X19d4eHhtbW2Ojo7FxcX4+Pj9/f3+/v7+/v79/f3m5uZ1dXVoaGiVlZXi4uL8/Pz+/v7+/v79/f3T09Ozs7OwsLDOzs79/f3+/v79/f3+/v7+/v7+/v719fWQkJBqamp6enq5ubn4+Pj9/f3v7+/Z2dnj4+P+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v79/f38/Py3t7diYmJiYmJwcHCzs7NqampiYmKUlJT7+/v6+vr9/f3+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f38/Pzz8/Ph4eHU1NTd3d3y8vL9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f329vby8vL8/Pz9/f39/f3+/v7+/v7+/v7+/v79/f3y8vLq6ur8/Pz9/f3+/v7+/v7+/v7+/v7+/v79/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v76+vrt7e339/f9/f39/f3+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f38/Py4uLhjY2NiYmJiYmJiYmJhYWGmpqb9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v78/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f38/Py8vLxpaWliYmJiYmJ9fX3q6ur9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v79/f39/f3b29u/v7/+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v79/f3e3t7U1NT9/f3+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Pze3t6zs7O+vr7y8vL9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v76+vrr6+vh4eHW1tb39/fU1NTm5ub9/f3W1tbc3Nz9/f3+/v7Z2dnW1tb5+fnr6+vg4ODv7+/9/f3U1NTc3Nz9/f39/f3o6OjS0tLv7+/l5eX9/f39/f3m5ub9/f3j4+PV1dXx8fGkpKScnJzo6Oj9/f3q6urW1tb4+Pj9/f3r6+vg4ODa2tr39/fU1NTo6Oj9/f34+PjU1NTm5ub9/f3+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v739/eHh4erq6ugoKCQkJC2traEhITt7e2xsbGzs7P8/PyoqKirq6vBwcHx8fGIiIifn5/r6+umpqa1tbWZmZm/v7/i4uKYmJjKysrr6+uamprf39/j4+Ojo6O9vb2UlJTS0tLr6+uZmZmTk5Pc3NzS0tKZmZm2tragoKD09PSFhYWurq6WlpaQkJC0tLSRkZHz8/Obm5u4uLjj4+P+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f309PSGhob29vbLy8uenp77+/uRkZHi4uLW1ta0tLTu7u6MjIz8/Pz8/Pz19fWHh4fz8/Pi4uKTk5P6+vrt7e2Tk5Pg4OCNjY28vLz19fXCwsKlpaWurq7KysrKysqIiIjIyMj7+/vDw8O6urr7+/ucnJyTk5O1tbWampru7u6IiIj39/e8vLydnZ36+vqbm5vu7u6goKCkpKTk5OT9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f309PSOjo75+fnExMSpqan7+/uPj4/i4uLR0dGysrLw8PCEhITz8/P4+Pjx8fGVlZX5+fnj4+OIiIj4+PjU1NScnJz8/Pzt7e2YmJiwsLD19fV9fX2Hh4fx8fH7+/vm5uaIiIjX19fDw8OwsLD7+/ufn5+pqanz8/P39/fy8vKRkZH7+/u3t7epqan7+/uYmJjv7+/5+fnExMSIiIj4+Pj9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v719fWjo6P6+vrOzs65ubn8/PykpKTo6OjZ2dm/v7/8/Pyurq6cnJyurq7v7++rq6v39/f9/f2rq6uhoaGZmZng4ODu7u6zs7Ofn5/W1tb6+vqgoKCfn5/8/PzX19eurq6jo6Pu7u7f39+Ojo7Pz8/h4eGWlpavr6/ExMT19fWmpqb8/PzExMS6urr8/Pytra3w8PDFxcWoqKi5ubn9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f37+/v+/v77+/v7+/v+/v76+vr9/f39/f37+/v8/Pz9/f3x8fH09PT9/f37+/v+/v79/f39/f3x8fH4+Pj9/f37+/vv7+/29vb8/Pz09PSYmJjX19f9/f339/fv7+/6+vr9/f39/f319fX19fX+/v76+vrv7+/29vb9/f37+/v9/f36+vr6+vr+/v77+/v+/v7y8vLx8fH9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7t7e2hoaGwsLD9/f3+/v79/f3+/v79/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v4=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 163.05mm )" draw:z-index="7" svg:height="4.23mm" svg:width="8.45mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+P
+N
+G
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 178.32mm )" draw:z-index="20" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 183.37mm )" draw:z-index="8" svg:height="4.23mm" svg:width="8.45mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+P
+P
+M
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 199.84mm )" draw:z-index="21" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 204.89mm )" draw:z-index="9" svg:height="4.23mm" svg:width="8.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+T
+G
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 220.16mm )" draw:z-index="22" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 225.21mm )" draw:z-index="10" svg:height="4.23mm" svg:width="6.33mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+T
+I
+F
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 240.48mm )" draw:z-index="23" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+</draw:page>
+</office:drawing>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/graphicformats_pdfi_unittest_impress.xml b/sdext/source/pdfimport/test/testdocs/graphicformats_pdfi_unittest_impress.xml
new file mode 100644
index 000000000..e01366c08
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/graphicformats_pdfi_unittest_impress.xml
@@ -0,0 +1,259 @@
+<?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 .
+ -->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="20mm" fo:margin-right="10mm" fo:margin-top="20mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:auto-grow-height="true" draw:auto-grow-width="true" draw:fill="none" draw:stroke="none" draw:textarea-horizontal-align="left" draw:textarea-vertical-align="top" fo:padding-bottom="0cm" fo:padding-left="0cm" fo:padding-right="0cm" fo:padding-top="0cm" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Thorndale" fo:font-size="12pt" style:font-size-asian="12pt" style:font-size-complex="12pt" >
+
+</style:text-properties>
+
+</style:style>
+<style:style style:family="graphic" style:name="graphic9" >
+<style:graphic-properties draw:fill-color="#ffffff" draw:fill="solid" draw:stroke="solid" svg:stroke-color="#000000" svg:stroke-width="3" >
+
+</style:graphic-properties>
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:presentation >
+<draw:page draw:master-page-name="master-page3" >
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 20.18mm )" draw:z-index="0" svg:height="4.23mm" svg:width="8.95mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+B
+M
+P
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 37.21mm )" draw:z-index="11" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 42.26mm )" draw:z-index="1" svg:height="4.23mm" svg:width="8.7mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+E
+M
+F
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 92.6mm 56.86mm )" draw:z-index="14" svg:height="-9.95mm" svg:width="25.25mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:path draw:style-name="graphic9" draw:transform="translate( 92.6mm 46.95mm )" draw:z-index="12" svg:d="m9260 5640h2476v-945h-2476v945z" svg:height="9.45mm" svg:viewBox="0 0 2476 945" svg:width="24.76mm" >
+</draw:path>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 61.45mm )" draw:z-index="2" svg:height="4.23mm" svg:width="6.83mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+G
+I
+F
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 76.72mm )" draw:z-index="15" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk7vyMlsxebqxserS8xvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vyEhrRUXpxUYpxUXpxUYpS8vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzU2vRUXpRTYqRkcqxZZqRUYpxUYpy0vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vzc5vzc4vzs7vz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vzc4vTc4vxUYpxUXqSBisy0vvxcaqxUXpxcZpS8wuz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vy8xuSKjqxoboxkaoxkaoxcYoRscpycnrzEyuT8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk6vx8hqxkbpzM1vyMlsxUXpxUYpyMltS1wvxkbqRUXpxUYpS8vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzU2vx8gqxcYoR8gqS8vtzk4vTZ3vSwttRkbpxUYpRUYpSMkrz8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vy0vuRUYoxUXpxkbqTEzvyFksxUXpxUYpyFksy1wvRcaqxUXpxUYpS8vtz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzM0uxcZpxUXpScnsz0+vz8/vz8/vz8/vz8/vzE0vxUYpxUYpx0frT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vx8gqSkqtSsuvRUYpxUYpxkbqTE0vyEjsRUYpxUXpyFksy8xvxcZpxUXpxUYpS8wuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk7vxkbpxUXpxmcqTs9vz8/vz8/vz8/vz8/vz8/vz8/vx8gqxUXpSaosz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyUnsRUYpRUYpSkqtystuxUXpxUYpxkcqy9yvyEjsRUXqRUYpyMlsy1wvxebqxUXpxcZozU2vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vykqtRUYpRUXpyUntT8/vz8/vz8/vz8/vz8/vz8/vz8/vyMlrxcYozByvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vyMlry0vuxveqxUXpxUXpycqtystuxUYpxUXpxscqy9yvyMlsxUXpRUXpyFksy1wvRkbpycqtSkqsy0utz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vxsdqxTYqRUXqSkrtz8/vz8/vz8/vz8/vz8/vz8/vz8/vycnrxcZozs8vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vx8gqxUYpRsdqTEzvx0frxUXpxUXpSkquSsuvRcYqRUYpxkcqy8xvyMlsxUYpxUYpx8irzY3vycptxUYpRcYoS8wuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk6vxcZpxUXqRUXqSEjrz8/vz8/vz8/vz8/vz8/vz8/vz8/vyUmrR8fpz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz08vx8irRUYpxUXpyEiry9yvy8xvR0erRUXpxUYpykruSstuxUYpxUXpxscqzM1vx8hrxUXpSaosystuxUYpxUXpxmcqS8vuTMzuz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk5vxUZpxTYqRMXqxZZqTc5vz8/vz8/vz8/vz8/vz8/vz8/vyqrsSsssT8/vz8/vz8/vzk7vy0utyUnsy0utz0+vz8/vz8/vz8/vz8/vz8/vz8/vz08vzY3vzU2vTc4vz8/vz8/vz8/vz8/vz8/vzEyuyUmryUnsTk7vz8/vz8/vz8/vz8/vz8/vzc4vysttyepsy0utz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vyEjrxUXpRUYpyFksy1wvxcZpR0fqy1wvRsdqxUYpxUXpScqtyksuxTYqRUYpSXotTs8vy0vuSkruRUYpxUXpxkcrS8xvx8irRcYoS0ttz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vxkbqRUXqROYqxUXpyEjrT0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8xuRkbpxUYpRUXpxUYpS8vtT8/vz8/vz8/vz8/vz8/vz8/vyUlrRUYpRUYpR0epT09vz8/vz8/vz08vyMlrxUXpRUYpRUXpSkqsz8/vz8/vz8/vz09vybosRcYoRUXpRUYpRUYpSUnsT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vx8gqxUXpxUYpyMlsy1wvRebqxUXpxcYozEzvTc5vxsdqRUYpxUXqR8hsxZZqRUXpyMlsz8/vyksuRUYpxUXqRveqy9yvx8isRUXpxUYpSMlrT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyMlsRUXpxUXqRUXqRUYpycptT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8wuRUYpRUYpRUYpxTYqRUYpSsssz8/vz8/vz8/vz8/vz8/vzY3vxUYpRUXpxUYpSbosT8/vz8/vzs7vx8hqxUYpRTYqRUYpxUXpyRmsT8/vz8/vzk6vx1fqRkaoyaosx8hrxUXpxUXpxmcqT0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vx8hrRUXpxUXpyFksy8xvxcZpxUYpxUYpzByvTs8vzk7vzY3vxscqxTYqRUXpxUYpxUXpy1wvSstuRUYpRUXpxkcqzEzvx8isRUXpxUYpyMlszs8vzk6vz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzByvRUYpRTYqROYqxUXqRUYpywttT8/vz8/vz8/vz8/vz8/vz8/vzV2uxcYoS0vuyotvRUXqRUXqRUYpzM0uz8/vz8/vz8/vz8/vz8/vycqtRUYpxUXpxUYpzU2vz8/vz8/vyDhqRkcpzU2vxkdrRUXqRUXpykqtT8/vzs8vx0dpx8hqzk7vz8/vy1wvRTYqRTYqRmcqT09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vx8irRUYpRUXpyEksS1wvRkaqxUXpxUYpy1wvSkquRebqxcaqSEjsS9yvx8hrRcZpRcapycqtSksuRUXpxUYpxscqy8xvx8isRUYpxUYpSPmtS9yvx0frRcZpxsdqS8vtz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vx8gqxUXpxTYqRMXqxUYpxUZpzM0vT8/vz8/vz8/vz8/vzs8vxsdpSkqsT8/vyQmsxUXqRTYqRsdqz09vz8/vz8/vz8/vz8/vz8/vx0frRUXqRTYqRserT0+vz8/vykqsxcapTc4vzs8vxcaqRUXqRUYpS9yvz09vx8gqSEiqT09vz8/vz8/vyUntRUXpxUXqR0grT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyUnsRUYpxUXpyUnty0vvxcaqRUYpxcYqS1wvSXotxUXpxUYpxUXqRUYpx0grTs9vzc4vzk6vzM1vxUYpRTYqRkdrS8xvx8irxUYpxUXpyPmtS1wvRZZqRUXpxUXqRUXpxUYpTU2vT8/vz8/vz8/vz8/vz8/vz8/vz8/vzY3vxcZpxUXqRTYqRMXqxTYqRkbqTc5vz8/vz8/vz8/vykqsx0fpz0+vzk7vxcaqRUXpxUYpycptT8/vz8/vz8/vz8/vz8/vzU2vRUYpxTYqRUXpycptT8/vzc4vRgZoTM0vT8/vzEyuxUYpxUXqRUZpzk6vyMlrx1fqT09vz8/vz8/vz0+vxsdqxTYqRUXpycnsz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vxcZpRTYqRsdrSotvRebqxUXpxcZpy8xvyXotxUYpxUXpx0frxsfrxUYpxUYpTc4vz8/vz8/vykqtRUXpxTYqSsuvSBisxUYpxUXpSPmtS1wvxZZqRUXpxcaqyBisxUYpxUXpSkrtT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0vuRUXpRTYqRTYqRUXqRUYpx8gqz0+vz8/vzk4uxobozY3vz8/vy0utxUYpxUXqRUYpTU1vz8/vz8/vz8/vz8/vz8/vybosRUXpxUXpxUZpzY3vz8/vycorSkprz8/vz8/vybosRUXpxUXqSEjsSstuRsdpzs7vz8/vz8/vz8/vzEyuRUYpxUXqRUXpTEzvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vxmcqRUXpxcYqRUXpxUYpxZZqS1wvScptxUYpxUYpx0gry9yvx0frxUYpxcZpTs7vz8/vz8/vystuRUYpxUYpxcaqRUXqRUXpyPmtS8xvxcaqRUXpxZZqS0vvyUntxUXpxUYpS8vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyRmsRUXpxMXqxOYqxTYqRUYpykstz8/vzZ3uy8vtT8/vz0+vx8gqxTYqRUYpx0eqT0+vz8/vz8/vz8/vz8/vzs9vxmcqRTYqRUXpx0fqz0+vz8/vzk5vT09vz8/vz09vxsdqRTYqRTYqSMlsxscpzP1uz8/vz8/vz8/vz8/vyMkrxUXpxTYqRkcpzs9vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8vtxUYpRUYpRUXpxcZpy0vvSXotxUXpxUXpx0gry9yvx0frRUYpxUXpykstzE0vykqtS0uuTM1vxsdqRUXpxUXpxUXpSUnsy1wvxcaqRUXpxcaqS1wvSUntRUYpxUXpx1fqT09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs9vxveqxUYpxUXqRTYqRUXqRcapzs7vz8/vz8/vz8/vzU2vxUYpRUXqRUXpysstT8/vz8/vz8/vz8/vz8/vystuRUXpxTYqRUXpykqsz8/vz8/vz8/vz8/vz8/vzM1vxUXpRUXqRTYqRUYpSkqtT8/vz8/vz8/vz8/vzk5vxcapRTYqRUXpyUnsT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzMzuyMlsSUnszEzvyXotRUXpxUYpx0gry8xvxsdrRUXpxUYpScquSksuRUYpRUXpRUYpRserS9yvycptyMlsS0vvS1wvRZZqRUXpxcaqS1wvyPmtRUYpRUXpx8hrTk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzY3vxcaqRUXqRMXqxTYqRUYpy8wuT8/vz8/vz8/vycqtRUYpxUXqRUZpzc4vz8/vz8/vz8/vz8/vzs9vxsdqxTYqRUXqRUYpzU2vT8/vz8/vz8/vz8/vz8/vykrtxUXpxTYqRUXqRsdqTs8vz8/vz8/vz8/vz8/vycptRUYpxUXqRUYpTM0uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vyXotRUYpxUXpx0erTEzvxserRUYpxUYpycptTk6vxUYpxTYqRUYpxUYpxUXpxserTk7vz8/vy9yvxUYpxUXpxcZpy1wvyQmsxUXpxUXpx0fqzs8vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vybosRUXpxOYqxMXqxUYpynrsz8/vz8/vz09vxkcqxUYpxUXqSEjrz8/vz8/vz8/vz8/vz8/vyepsxUXpxUXqRTYqRserT8/vz8/vz8/vz8/vz8/vz0+vxveqxTYqRUXqRUYpy8wuT8/vz8/vz8/vz8/vzs8vxkbqRUXqRUYpx0frT0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzM0uRcYoxUYpR0grzEzvx0erRUXpxUXpyUntT8/vzY3vxUYpxTYqSEktSXotxUXqRUXpx1fqTc4vx0grRUYpRcaqS0vvSUntRUYpxUXpx0fqzs6vz8/vz8/vz8/vz8/vz8/vzV2uy0usz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk5vxcaqRUXqRMXqxUXpybosT8/vz8/vzM0uxUXpxUXqRUYpS8wuz8/vz8/vz8/vz8/vzR1vRUYpRZZqRUXqRTYqSUnsz8/vz8/vz8/vz8/vz8/vzR1vRUYpxTYqRUXqRveqz0+vz8/vz8/vz8/vz8/vy8xuRUXpxTYqRUXpy0uuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utR8hqy8xvxserRUXpxUXpykquSkrtyEjrzk7vxveqxUXpxcaqSsuvykruRUXpRUYpxsdqy8xvR8hrS0vuyUntRUXpxUXpx0fqzk6vz8/vz8/vz8/vz8/vz8/vz8/vyMlrx0epz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyEjsRUXqRUXqRUYpykqsz8/vz8/vybosRUXpxTYqRkbpzk7vz8/vz8/vz8/vzs8vx1fqSQmsxcaqxUXqRUXpTM0vT8/vz0+vykprzc5vz8/vybosRUXpxUXqRUYpTEzvT8/vz8/vz8/vz8/vz8/vyEjrRUXpxTYqRUZpzk6vz8/vzU1uS0usz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk7vx0eqRUXpxUYpycquS8xvRUYpRUYpSMlszEzvxebqxUYpxcZpy0uvSXotRTYqRUYpx0frTc4vycqtRUXpRUYpRveqzk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vx0fqx8grT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vycptRTYqRTYqRUXpy8wuT8/vzs9vxmcqRUYpxUXpyRmsT8/vz8/vz8/vz8/vyUmrSMlrystuxUXqRTYqRsdqTs9vz8/vzM0uRkaoTs7vz0+vxveqxUXpxUYpx0fqz8/vz8/vz8/vz8/vz8/vzc5vxUYpRUXqRUXpyMlrz8/vz0+vx8gpysrrz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vysstRcYoyXotSstuy0vuyEjrxUXpxUYpyMlsy8xvxkbqRUXpxZZqS0uvSXotRUYpRUXpx0gry1wvRsdqR0eqTs7vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vxcapx8grT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyXotRUXpxUXqRcapzk7vz8/vzM1vxUYpRTYqRUYpzR1vT8/vz8/vz8/vysstRsdqTs8vyEirxUYpxUXpyaosz8/vz09vx0epyxtsz8/vzU1vxUYpRTYqRUXpy0vuT8/vz8/vz8/vz8/vz8/vy0uuRUYpxUXqRUYpzEyuz8/vy0utx0dpz0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzR1vSkrtRUYoxkbpy1wvSEjsxUYpxUXpyMlsy8xvxebqxUXpxcYqS0uvScptxUXpxUXpxveqzEyuzk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzU2vRUYpRveqz8+vz8/vz8/vz8/vz8/vz8/vz8/vz0+vx0erRUYpxUYpSsstz8/vz8/vysttxUXpxUXqRsdqz0+vz8/vz8/vyxtsxobozc4vzs9vxcapxUXqRUYpzEyuz8/vyUnsR0fpz8+vz8/vyXotRUXpxTYqRsdqz09vz8/vz8/vz8/vz8/vz8/vyEjrxUXqRTYqRebqz0+vzY3vxkaozEzvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utxcYoxUXpxebqy8xvx8isRUYpxUXpyMlsy9yvxcaqRUYpxUYpy0vvycptxUYox0epzs7vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8wtxUYpxcZpzk6vz8/vz8/vz8/vz8/vz8/vz8/vzEyuRUYpRUXpx8irT8/vz8/vz8/vyMlsRUYpxUXqSEjsT8/vz8/vykrtRkZozP1uz8/vzU2vxUYpRTYqRTYqTY3vy0uuRgZoTc4vz8/vz0+vx0frRUYpxUXpycnsz8/vz8/vz8/vz8/vz8/vzs8vxcaqRUXqRTYqSPmtTk6vxscpyUnrz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vysttxUYpRUXpxscqy1wvx8isRUXpxUYpyPmtS9yvxcaqRUYpxUYpysstysstTk5vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vynrsxUYpRUXpynrsz8/vz8/vz8/vz8/vz8/vzk7vxsdpxUXpR0fqzs6vz8/vz8/vz8/vx0grRUYpxUXqRkcqysstyHjqRkbpTR1vT8/vz8/vzEzvRUYpRTYqRTYqR0fqxcYozEyuT8/vz8/vzZ3vRUYpxUXpxUYpTM0vT8/vz8/vz8/vz8/vz8/vzZ3vRUYpxTYqRUXqRebqxkbpyMkrTc4vy0uszMztz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0ttxUYpRUYpxebqy8xvyEksRUXpxUXpyMlsy8xvxcaqRcYox1fqT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzZ3vRscpxUYpRUXpSaoszk5vzs9vzs7vy8wuxscpxUYoyUmrzs8vz8/vz8/vz8/vz8/vyEjrxUXpxTYqRUXpxUYox8gqTk5vz8/vz8/vz8/vzExuxUYpRUXpxUYpxcZpTExuT8/vz8/vz8/vykqrxUXpRUYpRscpz0+vz8/vz8/vz8/vz8/vz8/vzZ3vRUYpRUXqRTYqRUYpSMjrT09vzV2uy0ssTAwtT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0vuRUYpRUYpxkbqS1wvyEktRUYpxUXpSwuuzEzvx8irTs6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vy8wuyMkrxcapRsbpR0dpRscpRkbpSUmrzU1vz8/vz8/vz8/vz8/vz8/vz8/vzU2vRsdqRkbpyEjry8xuz0+vz8/vz8/vz8/vz8/vzk5vxscpxcZpSMlsTc4vz8/vz8/vz8/vz8/vzP1uysstSsstTMzuT8/vz8/vz8/vz8/vz8/vz8/vz09vyEjrxcapxveqy0ttz0+vz8/vzs8vzV2uzk5uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vysttxUYpRUXpxebqyksvRcaqRUXpyMksT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vzk4vTP1uzZ3uz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vzs6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8+vzs7vz8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utxUYpxUXpxUYpxUXpxUYpSepsz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utxkapRUXpRUYpR1fqTk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzV2uy8vsz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzZ3vTP1uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzY3vyssty0vuT09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8+vzs7vTc4uzU1uT0+vzM0uTk5vT8/vzP1uzZ3vT8/vz8/vzU2uTU1uT8+vzs7vTc4uzs7vz8/vzU0tzZ3uz8/vz8/vzk6vTU0tzs8vzk5uz8/vz8/vzk5vT8/vzk4uzU1uTs8vybosSanrTk5vT8/vzk6vzU1uT0+vz8/vzs6vzc4uzV2uz8+vzU1uTk5vT8/vz8+vzU1uTk5uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vx/hpykqsScorSKjqyxtsx8gqTk7vysssysssz8/vykqrykqrzAwtTs8vx/hpycorTk6vykprywttSUmrS0vtzc4vyUlqzEytzk6vyUmrTc4vTc4vykpry0utyMlrTM0uTk6vyMlryMkrTU2vTM0uSUlrSwttScorTs9vx8gqSnrsyMlrSEjrSsssyMkqzs9vyUmqyxtszk5vT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vyDhqT09vzEyuSUnrz8/vyEjrTc4vzR1vSsstTs7vyEiqT8/vz8/vz09vyDhqTs8vzc4vSMkrT8/vzk7vyMkrTc4vyKjqy0utT09vy8wuSbosSnrszEyuTEyuyDhqTEytz8/vy8wuS0utz8/vyUnryMkrSsttyUmrTs7vyEiqz0+vy0uuSRmsT8/vyUmrzs7vycorybosTc4vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs9vyKjqz0+vzExtykprz8/vyKjqzc4vzMzuyssszs8vx/hpz08vz0+vzs8vyUlqz8+vzk5vSDhqT0+vzM0vSUnrz8/vzs7vyUlrSkrtT09vx0fpyDhqTs8vz8+vzk5vyEiqTR1vS8wuSsstT8/vyanrSkqszs8vz0+vz08vyKjqz8/vy0ttykqsz8/vyUlrTs7vz0+vzExtyDhqT8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vykorz8/vzMzty0usz8/vykorzk6vzU2vS8vtT8/vyqrsSanrSqrsTs7vysqrz09vz8/vykqsScoryUmrTZ3vTs7vysssScorTR1vT0+vycnryanrT8/vzV2uysrrycorzs7vzY3vyHjqTMzuTk4vSUlqyqrsTExtT09vykprz8/vy8wty0utT8/vysrrzs8vzExtSkpsS0utT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz08vz09vz8/vz8/vz8/vz8/vz8/vz08vz8+vz8/vz8/vz08vz09vz8/vz09vyUmrTP1uz8/vz09vz08vz8+vz8/vz8/vz09vz09vz8/vz8+vz08vz09vz8/vz8/vz8/vz8+vz8/vz8/vz8/vz8/vz09vz08vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vycorysssz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vw=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 81.77mm )" draw:z-index="3" svg:height="4.23mm" svg:width="7.04mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+J
+P
+G
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 97.04mm )" draw:z-index="16" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAoAGQDASIAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAAAAUGBwIDBAgB/8QAOBAAAQMCBAQFAgMGBwAAAAAAAQIDBAURAAYSIRMxQWEHFCIyUXGBFSORJDNCcqHhNENSU2KSwf/EABkBAAMBAQEAAAAAAAAAAAAAAAECAwQABf/EACMRAAICAgEEAwEBAAAAAAAAAAABAhEDIRIEIjFBE1GhcYH/2gAMAwEAAhEDEQA/APVOE+Z6/FoEEOyFJVIdJRHYKwkvLtcJBOw+pxqzhmWJlilGVKu48s6GGE+51fQD/wBOKPnVKRWapKXX3W1h3T5zWohmA3f0pRa5Lv0v1G91W1dP0zydz8E5z46Ma/WZFXzAa6JkmEr0NtkKP7A8ALoWm3tJB378jYjFu+H+cU19tcCooEatxk/nNdHB/uI+Qdv1HQjFNoiy1S2n4qPxCCFcN2pJSQy9HHuD4I9Kki25seXOwOMkTfLSY6qMuYmG08fw9BNpEshRtqI5NJ+Pr1Jt6GXBHLFRXolGTTs9KYQ5yzNFyvTEypKFvPOrDTDCPc6s9Ow7448k5uh12O3EcmxXaw03qkNsatN+RKSRuOXK4xEPH+DKMCk1SNq4cN1QWR/AVadKv1Tb7jHm4sN5VCei0pdtok9SlZwiUd6pkUfU02XlQuG4TpAuRxNW6rf8bYeZUqrlcy7BqTsfyy5Levh6tVtz178/vhPkvMsTO+WnQTw5PDLMppJ3QSLXHY72/tiIZyznUqBDp0XK7TCKchfk2HHRrW+WwEkoTy0g2TfqeW2+CsUpv46pg5JbLdwYRZnrSqDlOVVJCUeYZZBCL+kuGwA+mo/piOZfzdVpWVIUqTHjvVioKcMVlAKEJaTsXHDc2SOZPW4A3OJRxSlHkv4NyXgsDBir8g57qdSo0x+pNolzFyeBCYYSEF1Wm5HZKQQSo8h9sb6TmjMCPEtGX6qqA60touLTGQQGToKgNR3PTn89MO+nmm19A5osnBgwYgORfPeUGM1R4hXJfiyYalLZdZtfe1xv9BvfpijZMZ2JJEJUThPRypbMJ4ghkD3SJB5E2FwOXLpYK9NYiGfcprrkRUilOpiVZuxDgAAfAvZDnyNzz2xt6XqXj7JeCc4XtFReflUiLLy/TvLzqZJZEl5YuFzNaRqU0emm1gLX9JuDuMcMpiHHjJegyZLtNdaShyY7bjObf4ZtO+k9D27WCtCw21JTBlIchr8wEKj7h2E+T72upQeo/scW9kLIq4DyqjXm2TOKv3LZCmipJ2etbZZ7fPS9huyZI4Vy+/0jFOWjR4W5OegPiu1RlMWStrhRoaBYMNn/AFdSo99999+U3jPwMy0NSwjjwJSVtlK021AEpP8AUHHfKQtyM6hpQQ4pBCVHobbHEGyYK9lehN0efRXppjlQZfiPNlKwVE2VqUkp3PxjzJSeVubey6XHRXWXafIyh4vt0lhxaozyy0Rf94ytNxfuNvuMPkxmsx+MMeFHbSmk0BsJShI9IKOn/cgfROJdlvKslWaJeZ8wcL8SdGmPHbVqTGRa3u6qttcbbn5xHckZVzVTKhWkPCNCbnvanJ2sLd03UfywNgTq5q5fBxqlmjK5XtKv99k1FrRw+NNYdq9Qp2W6aCpC5AS4sclO7AIH8urfuexxJM8Tqdl7Ik5unlsy47KKUlaR6kkpB03/AJTqwsr2TqyM90iTQY8dFPhRwht59epKFXVqUU31KVdWrueZx1ZwyNOqn4DTYZSulsPF+a865+Y6tShqWR1JGr9bYS8dQjelsNPbDwoo6MuZNVWqr6XVsqfGr/KZ91h3Va5+w6YU+EShOrVWzXVVpbdnSPKRgrqpXqKR9AEj6A4nXiHTZ1RyVOp9FbSZDiUIS2FBN0hQuBfbkDhHkLK9XpEKlKqSIuuLqQiOk3DIWSVuE/xOG9vgDYczhfkUoSm3tv8AA8aaRYeDBgxiKhgwYMccLZVCpcupM1CTAjOzWraHlIBULct+3T4wywYMFtvydQYiy4tf81xUyXdHFKuHdvTp44sOV7cK/wB++DBgxdAez4mNW2WHGW+MkiM5wFIU3pDpLm6789i3a2173xm8xXUy30NPyOElKkodPDUCnhix07Hia7noLfbBgw3P3R1HG0/XZEh6Ih4tKbipdWUaXVNukFIbN7A3A187/wBMfVxK+lTzzHHbdfTHLgDiXAkAELCbkeq9j3F974MGGc6ekBKzbJh5iUpSm5j3tUABw0g2ZTpNrGxLmq+/LthzSBPTKnidqU0XAWVqIGxv6QkdBtv1+MGDCOVqg0NMGDBhAn//2Q==
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 102.09mm )" draw:z-index="4" svg:height="4.23mm" svg:width="8.94mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+P
+B
+M
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 117.36mm )" draw:z-index="17" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDQKMTAwIDQwCgAAHAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAO8AAAH8AAAAAAAAAAb/AAAHHwAAAAAAAAAHe8AADgcAAAAAAAAAG73gABwHAAAAAAAAAD/e4AA8BgAAAAAAAABd79gAPAYAAAAAAAAA73e4ADwGAAAAAAAAAfe7fAA8BBgAAYBgAAPf/PcAPgA+B4fD8AAH+f3vAD8A/gePx/AAD3D73gAfgLwPG8xwAB/vf73gH4G8DzOY8AA9/4d74A/DPA8jsPAAP7+P/+AH4ngeZ+DgAD+7h+7wB/J4HgfB4AA+9ze94APweD4HweAADe/7f8AB8PA8D4PAAAPe/HeAAfjwfA8DwAADuP7vAAD48HwPA8AAAX73fgMA8eD4ngeAAAD3f5wDAPnhuJ4HmAAA17v4AwDxw3kcDzAAAD/f4AMA8cZ7PA8gAAA97uADAePMcjwPYAAAD/eAB4HD+H44D9AAAA9/gAPDg/B4eA+QAAADuQAA/gHAcCAOAAAAA/wAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAA+AAAAQAAAAAAAAAAACAAAAAAAADAAAAAAAAAAAFqJqScyrUAAAAAAAABKUSUpFqVgAAAAAAAAUlEkmJYpEAAAAAAAAEoZKZmSpSAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAIAAAAAA=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 122.41mm )" draw:z-index="5" svg:height="4.23mm" svg:width="8.25mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+P
+X
+C
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 137.68mm )" draw:z-index="18" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 142.73mm )" draw:z-index="6" svg:height="4.23mm" svg:width="9.16mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+P
+G
+M
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 158mm )" draw:z-index="19" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6YmJhubm59fX3Hx8f7+/v9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v739/eJiYlhYWFiYmJiYmJjY2O/v7/8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3c3NxiYmJiYmJ1dXVqampiYmJkZGS/v7/8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v79/f38/Pzz8/Pl5eXj4+Ps7Oz29vb8/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3w8PDh4eHk5ORiYmJiYmKOjo6/v79ubm5iYmJmZmbFxcX8/Pz+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v79/f329vbGxsaOjo5ubm5ra2tqampjY2N1dXWfn5/MzMz39/f+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3q6uqIiIhubm7W1taYmJhhYWFiYmKZmZnFxcVubm5iYmJjY2O+vr78/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f39/f3a2tqDg4NiYmKDg4O/v7/h4eHe3t63t7dubm5jY2NiYmKUlJT6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f309PS/v79gYGBhYWFxcXHR0dGUlJRiYmJhYWGTk5PDw8Nubm5hYWFiYmK/v7/8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f3S0tJnZ2diYmKfn5/4+Pj8/Pz9/f39/f38/PzS0tJmZmZjY2OBgYH6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3w8PCDg4Oqqqq+vr5jY2NiYmJubm7Q0NCQkJBiYmJiYmKUlJTHx8doaGhiYmJiYmLExMT8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f3s7Oxvb29hYWFzc3Py8vL9/f3+/v7+/v79/f39/f36+vqEhIRiYmKkpKT9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f38/Pyenp5hYWFiYmKrq6u3t7djY2NiYmJ0dHTMzMyOjo5iYmJjY2OYmJjGxsZubm5iYmJlZWXb29v8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f2tra1iYmJiYmKgoKD8/Pz+/v7+/v7+/v7+/v79/f38/PyZmZliYmLMzMz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6ampq9vb19fX1iYmJiYmKrq6u3t7diYmJiYmJ0dHTNzc2YmJhiYmJiYmKUlJTCwsJxcXGpqamtra28vLz8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v739/d4eHhiYmJiYmKurq78/Pz+/v7+/v7+/v7+/v7+/v78/Pyfn59mZmbw8PD9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3v7++FhYViYmJ4eHjR0dF+fn5iYmJhYWGrq6u9vb1lZWViYmJycnLKysqVlZViYmJiYmKLi4vc3NypqalhYWFiYmLExMT7+/v+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3q6upmZmZiYmJiYmKPj4/8/Pz+/v7+/v7+/v7+/v7+/v78/PyZmZmAgID8/Pz9/f3+/v79/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v79/f39/f39/f39/f3+/v7+/v79/f39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v79/f39/f39/f38/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3x8fGNjY1iYmJiYmKMjIzLy8vHx8d9fX1iYmJjY2OysrK2trZlZWViYmJzc3PX19eJiYlhYWGioqK1tbVjY2NiYmJycnK/v7/Ozs78/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7o6OhnZ2diYmJiYmJoaGjk5OT9/f3+/v7+/v7+/v7+/v78/Pyurq6ysrL9/f39/f39/f3s7Oy8vLyhoaG6urr39/f9/f3+/v7+/v7+/v7+/v79/f3z8/Pc3Nzb29vj4+P9/f39/f39/f38/Pz8/PzJycmampqgoKDr6+v9/f3+/v7+/v79/f38/Pzh4eG3t7empqa8vLz09PT9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6NjY1iYmJiYmKUlJTDw8NpaWl/f3/Dw8N6enpiYmJiYmKrq6uzs7NmZmZiYmKjo6Pv7++9vb2ysrJjY2NiYmJ1dXXJycmKiopiYmK6urr6+vr+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7z8/Nvb29iYmJhYWFiYmKQkJD5+fn8/Pz9/f3+/v7+/v79/f36+vr9/f39/f38/PzHx8dxcXFiYmJiYmJhYWG/v7/9/f3+/v7+/v7+/v79/f38/PyWlpZkZGRkZGR6enr39/f9/f39/f3y8vKWlpZiYmJiYmJhYWGpqan9/f3+/v79/f3y8vKjo6NiYmJiYmJiYmJiYmKhoaH9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6EhIRiYmJiYmKYmJjGxsZubm5iYmJjY2POzs7n5+d4eHhiYmJiYmKKiopoaGhhYWGYmJj6+vq2trZiYmJiYmJ6enrKysqMjIxiYmJiYmKWlpb9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PyWlpZiYmJiYmJiYmJiYmKrq6v8/Pz9/f3+/v79/f39/f3+/v7+/v78/PzCwsJiYmJjY2NiYmJjY2NiYmKysrL9/f39/f3+/v7+/v79/f3f399jY2NiYmJiYmKkpKT7+/v9/f3u7u6Hh4djY2NlZWViYmJiYmKZmZn8/Pz9/f3q6uqAgIBtbW2jo6OIiIhiYmJiYmJ0dHT39/f+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3z8/OHh4diYmJiYmKUlJTHx8doaGhiYmJlZWXJycnx8fHs7Oze3t53d3diYmJiYmJiYmJiYmLDw8O3t7diYmJhYWF0dHTR0dGMjIxiYmJiYmKXl5fw8PDq6ur09PT9/f3+/v7+/v7+/v7+/v7+/v7+/v79/f3KyspiYmJiYmJjY2NiYmJiYmK4uLj8/Pz+/v7+/v7+/v7+/v79/f3Y2NhiYmK/v7+3t7diYmJiYmJjY2PS0tL9/f3+/v7+/v7+/v78/Pyrq6thYWFiYmJkZGTb29v8/Pz5+fmIiIhycnLc3Nx4eHhiYmJiYmKtra38/Pzw8PB4eHiFhYXt7e36+vrBwcFiYmJiYmJycnL19fX+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3z8/ONjY1iYmJiYmKTk5PDw8Nubm5iYmJmZmbBwcGurq5wcHBqamqPj4/JycmKiopmZmZra2upqamysrJiYmJiYmJ0dHTKysqKiopiYmJiYmKcnJzLy8t/f39oaGh2dna9vb38/Pz+/v7+/v7+/v7+/v7+/v79/f329vaEhIRiYmJiYmJiYmJiYmJoaGjR0dH9/f3+/v7+/v79/f3y8vJ2dnapqan6+vqamppiYmJiYmJ3d3f09PT+/v7+/v7+/v7+/v78/PyAgIBiYmJiYmJ8fHz5+fn8/PysrKxra2vj4+Pw8PBqampiYmJiYmLKysr09PSEhISKior19fX9/f38/PyhoaFhYWFiYmKDg4P6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f2enp5iYmJiYmKamprExMRtbW1iYmJmZmbCwsKkpKRiYmJiYmJiYmJiYmKEhITy8vLi4uLq6urY2NhjY2NiYmJ3d3fKysqKiopiYmJjY2OdnZ3Dw8NqampiYmJiYmJiYmJiYmLa2tr9/f3+/v7+/v7+/v7+/v7+/v79/f3b29tnZ2diYmJiYmJiYmJiYmJwcHDl5eX9/f3+/v79/f2pqal/f3/5+fns7OxqampiYmJiYmKpqan8/Pz+/v7+/v7+/v79/f3b29tlZWViYmJiYmKoqKj8/Pzh4eFoaGjS0tL8/PzKyspiYmJiYmJoaGjq6uqWlpZ/f3/19fX9/f3+/v729vZ4eHhiYmJiYmKgoKD8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PxpaWliYmJ6enq3t7dubm5iYmJpaWnIyMijo6NiYmJiYmJ/f3+AgIBiYmJiYmLi4uL8/Pz8/Pyrq6tiYmJmZma6urqMjIxiYmJiYmKdnZ3CwsJqampiYmJra2uOjo5kZGRiYmKurq79/f3+/v7+/v7+/v7+/v7+/v7+/v78/Py9vb1iYmJiYmJiYmJiYmJjY2OEhIT4+Pj9/f3k5ORvb2/e3t78/Py9vb1iYmJiYmJiYmLX19f9/f3+/v7+/v7+/v78/PyhoaFiYmJiYmJlZWXd3d38/Pyjo6OkpKT8/Pz8/Pyjo6NiYmJhYWGQkJC2trZ2dnbs7Oz9/f3+/v79/f3Ly8tiYmJiYmJiYmLOzs79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v77+/tzc3NiYmJmZmZiYmJiYmJoaGjCwsKpqaliYmJiYmKEhITNzc2AgIBiYmJoaGjv7+/8/Pz8/Py4uLhiYmJjY2NqampiYmJhYWGdnZ3IyMhra2tjY2NnZ2fBwcGfn59iYmJiYmK/v7/9/f39/f3+/v7+/v7+/v79/f3+/v79/f38/PyampphYWFiYmJiYmJhYWFiYmK1tbX8/Pzc3Ny8vLz7+/v4+PiFhYViYmJiYmJ7e3v29vb9/f39/f3+/v79/f3y8vJ0dHRiYmJiYmJ9fX36+vr8/Pzk5OT29vb8/Pz19fV4eHhiYmJjY2OYmJh1dXXU1NT9/f3+/v7+/v78/PyTk5NiYmJjY2Nzc3Pz8/P9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3BwcFiYmJiYmJhYWFoaGjBwcGkpKRhYWFiYmKEhITMzMyAgIBiYmJiYmKysrLS0tKtra28vLzW1tZ5eXlhYWFiYmJiYmKenp7CwsJra2tiYmJra2vExMSfn59iYmJiYmKAgIDz8/P9/f3+/v79/f39/f3+/v7+/v7+/v79/f39/f3z8/N9fX1jY2NiYmJiYmJiYmJra2vt7e39/f39/f38/Pzc3NxjY2NiYmJiYmKzs7P9/f3+/v7+/v7+/v78/Py4uLhiYmJiYmJiYmKoqKj8/Pz9/f3+/v7+/v79/f3X19diYmJhYWFkZGRjY2Opqan8/Pz+/v7+/v78/Pzn5+dpaWliYmJiYmKcnJz8/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PzLy8uZmZmfn5/S0tKjo6NiYmJiYmKDg4PLy8t5eXlhYWFiYmKtra2ysrJjY2NiYmJiYmJ+fn7KysqoqKiXl5e+vr7Dw8NqampiYmJra2vDw8OdnZ1iYmJjY2OFhYXq6ur9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3c3NxqampiYmJhYWFiYmJiYmLFxcX9/f3+/v78/PypqaliYmJiYmJmZmbk5OT9/f3+/v7+/v79/f3y8vJ3d3diYmJiYmJkZGTa2tr9/f3+/v7+/v7+/v78/Pyurq5iYmJiYmJiYmJ3d3fx8fH9/f3+/v7+/v79/f2oqKhiYmJiYmJiYmLS0tL9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f38/Pz39/ekpKRiYmJhYWF+fn7Ozs56enpjY2NiYmKpqanp6elmZmZiYmJlZWViYmJiYmJ7e3vs7Oz6+vrLy8tmZmZiYmJnZ2fExMScnJxiYmJhYWF/f3/u7u79/f3+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v79/f38/PyhoaFiYmJiYmJhYWFiYmKtra39/f39/f309PR1dXViYmJiYmKNjY38/Pz+/v7+/v7+/v78/PyoqKhiYmJiYmJiYmJ9fX35+fn+/v7+/v7+/v7+/v75+fl9fX1iYmJiYmJiYmLDw8P9/f3+/v7+/v79/f3w8PBwcHBiYmJiYmJ/f3/6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3S0tJiYmJiYmKEhITOzs5+fn5hYWFiYmKhoaH6+vre3t5iYmJiYmKTk5Ojo6NiYmJhYWF9fX3j4+ODg4NiYmJqamq/v7+fn59iYmJiYmJ+fn7p6en9/f3+/v7+/v7+/v7+/v7Z2dm6urr+/v7+/v7+/v7+/v7+/v7+/v79/f3m5uZqampiYmJhYWFiYmKjo6P8/Pz9/f3S0tJhYWFiYmJiYmLDw8P9/f3+/v7+/v79/f3W1tZnZ2dmZmZiYmJiYmKioqL8/Pz+/v79/f39/f39/f3U1NRjY2NiYmJiYmJ8fHz19fX+/v7+/v7+/v79/f3FxcViYmJiYmJjY2O6urr8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v76+vq6urqGhobJycl7e3tiYmJiYmKtra2wsLCQkJDq6up4eHhiYmJra2u+vr6tra1iYmJiYmJ6enrFxcWIiIi9vb2goKBiYmJhYWF/f3/p6en9/f3+/v7+/v7+/v7+/v79/f2ZmZl6enr9/f3+/v7+/v7+/v7+/v79/f3+/v78/PyPj49iYmJjY2NiYmKrq6v8/Pz7+/ujo6NjY2NiYmJubm7u7u79/f3+/v79/f3y8vJ9fX2cnJxra2tiYmJiYmLS0tL8/Pz6+vqlpaXm5ub8/PyioqJiYmJiYmJjY2POzs79/f3+/v7+/v79/f38/PyNjY1iYmJiYmJnZ2fp6en8/PzW1ta5ubn9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3q6up7e3tiYmJiYmKqqqrHx8diYmJiYmKZmZnOzs5vb29jY2NmZma9vb2lpaViYmJiYmKAgIDh4eGrq6thYWFiYmJ9fX3q6ur9/f3+/v7+/v7+/v7+/v7+/v78/PyAgICCgoL8/Pz+/v7+/v7+/v7+/v7+/v7+/v78/PyoqKhiYmJiYmJgYGDFxcX8/Pz09PR1dXViYmJiYmKampr8/Pz8/Pz9/f38/PyZmZmZmZm4uLhiYmJjY2N2dnb19fX8/PzS0tJra2vv7+/5+fl7e3tiYmJiYmKAgID7+/v9/f3+/v7+/v79/f3l5eVmZmZhYWFiYmKVlZX7+/v4+PiAgICtra39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PyysrJkZGSioqK6urq/v7+Pj49iYmJiYmKZmZnIyMhvb29iYmJmZma8vLykpKRiYmJiYmKCgoLDw8N4eHh7e3vq6ur9/f3+/v7+/v7+/v7+/v7+/v7+/v709PRqamqEhIT8/Pz9/f39/f3+/v7+/v7+/v7+/v78/Pyjo6NiYmJhYWFra2vs7Oz8/PzY2NhiYmJiYmJkZGTW1tb9/f39/f39/f2zs7N6enrx8fGNjY1iYmJiYmKjo6P6+vr19fV7e3u1tbX8/PzX19djY2NiYmJiYmK+vr79/f3+/v7+/v7+/v79/f28vLxiYmJiYmJiYmLMzMz8/Py6urp4eHj29vb+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PzW1tatra1iYmJubm7ExMSRkZFiYmJhYWGYmJjIyMhvb29iYmJlZWW8vLyoqKhiYmJiYmJ+fn7Kysrq6ur9/f3+/v7+/v7+/v7+/v7+/v79/f3+/v7c3NxiYmJ7e3v6+vr+/v7+/v7+/v7+/v7+/v7+/v74+Ph9fX1iYmJiYmK1tbX9/f38/Py1tbViYmJiYmJ4eHj4+Pj9/f38/Py1tbVubm7i4uLz8/Nra2tiYmJiYmLJycn7+/ufn5+AgID6+vr8/PylpaViYmJiYmJ1dXX09PT+/v7+/v7+/v7+/v78/PyNjY1iYmJiYmJycnL39/ff399qamrR0dH9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Py6urpiYmJiYmJubm7IyMiNjY1iYmJiYmKZmZnMzMxubm5iYmJlZWXCwsKoqKhiYmJ6enrr6+v8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3CwsJiYmJoaGjq6ur+/v7+/v7+/v79/f39/f39/f3JycliYmJiYmKJiYn5+fn9/f38/PyYmJhiYmJiYmKRkZH7+/v7+/uvr69oaGjU1NT8/Pzc3NxjY2NiYmJlZWXf39+9vb1mZmbh4eH9/f35+fl+fn5iYmJiYmKhoaH8/Pz+/v7+/v7+/v7+/v7w8PBra2tiYmJiYmKamprq6upycnKenp77+/v9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Py3t7diYmJiYmJzc3PFxcWNjY1iYmJiYmKcnJzLy8tubm5iYmJlZWW0tLSzs7Pm5ub9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f2tra1jY2NiYmKtra38/Pz9/f39/f39/f38/Pzt7e14eHhiYmKAgIDr6+v9/f3+/v76+vqEhIRiYmJiYmJzc3O0tLSMjIxubm7Y2Nj9/f39/f3Nzc1iYmJjY2NlZWV+fn5lZWXHx8f8/Pz9/f3d3d1lZWViYmJjY2PU1NT9/f3+/v7+/v7+/v7+/v7f399kZGRiYmJiYmJxcXFubm6Tk5Pg4OC6urrOzs7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Pz8/Py3t7djY2NiYmJycnLIyMiSkpJiYmJiYmKWlpbKyspra2thYWGAgID6+vr9/f3+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7c3Nx2dnZiYmJhYWGjo6Pn5+f09PTv7+/FxcVzc3NiYmKZmZnv7+/9/f3+/v7+/v79/f2Pj49iYmJiYmJiYmJiYmKDg4Pk5OT9/f3+/v79/f3IyMhiYmJiYmJiYmJoaGjFxcX9/f39/f39/f2oqKhhYWFiYmJzc3P29vb+/v7+/v7+/v7+/v7+/v7c3NxiYmJiYmJiYmJiYmKPj4/09PTb29uysrLDw8P9/f3+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Pz8/Py/v79iYmJiYmJubm7ExMSUlJRjY2NiYmK6urrT09OKioro6Oj8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u7BwcGTk5Nra2tvb294eHhzc3Nvb2+ZmZnW1tb8/Pz9/f3+/v7+/v7+/v79/f3X19d4eHhtbW2Ojo7FxcX4+Pj9/f3+/v7+/v79/f3m5uZ1dXVoaGiVlZXi4uL8/Pz+/v7+/v79/f3T09Ozs7OwsLDOzs79/f3+/v79/f3+/v7+/v7+/v719fWQkJBqamp6enq5ubn4+Pj9/f3v7+/Z2dnj4+P+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v79/f38/Py3t7diYmJiYmJwcHCzs7NqampiYmKUlJT7+/v6+vr9/f3+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f38/Pzz8/Ph4eHU1NTd3d3y8vL9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f329vby8vL8/Pz9/f39/f3+/v7+/v7+/v7+/v79/f3y8vLq6ur8/Pz9/f3+/v7+/v7+/v7+/v7+/v79/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v76+vrt7e339/f9/f39/f3+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f38/Py4uLhjY2NiYmJiYmJiYmJhYWGmpqb9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v78/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f38/Py8vLxpaWliYmJiYmJ9fX3q6ur9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v79/f39/f3b29u/v7/+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v79/f3e3t7U1NT9/f3+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Pze3t6zs7O+vr7y8vL9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v76+vrr6+vh4eHW1tb39/fU1NTm5ub9/f3W1tbc3Nz9/f3+/v7Z2dnW1tb5+fnr6+vg4ODv7+/9/f3U1NTc3Nz9/f39/f3o6OjS0tLv7+/l5eX9/f39/f3m5ub9/f3j4+PV1dXx8fGkpKScnJzo6Oj9/f3q6urW1tb4+Pj9/f3r6+vg4ODa2tr39/fU1NTo6Oj9/f34+PjU1NTm5ub9/f3+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v739/eHh4erq6ugoKCQkJC2traEhITt7e2xsbGzs7P8/PyoqKirq6vBwcHx8fGIiIifn5/r6+umpqa1tbWZmZm/v7/i4uKYmJjKysrr6+uamprf39/j4+Ojo6O9vb2UlJTS0tLr6+uZmZmTk5Pc3NzS0tKZmZm2tragoKD09PSFhYWurq6WlpaQkJC0tLSRkZHz8/Obm5u4uLjj4+P+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f309PSGhob29vbLy8uenp77+/uRkZHi4uLW1ta0tLTu7u6MjIz8/Pz8/Pz19fWHh4fz8/Pi4uKTk5P6+vrt7e2Tk5Pg4OCNjY28vLz19fXCwsKlpaWurq7KysrKysqIiIjIyMj7+/vDw8O6urr7+/ucnJyTk5O1tbWampru7u6IiIj39/e8vLydnZ36+vqbm5vu7u6goKCkpKTk5OT9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f309PSOjo75+fnExMSpqan7+/uPj4/i4uLR0dGysrLw8PCEhITz8/P4+Pjx8fGVlZX5+fnj4+OIiIj4+PjU1NScnJz8/Pzt7e2YmJiwsLD19fV9fX2Hh4fx8fH7+/vm5uaIiIjX19fDw8OwsLD7+/ufn5+pqanz8/P39/fy8vKRkZH7+/u3t7epqan7+/uYmJjv7+/5+fnExMSIiIj4+Pj9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v719fWjo6P6+vrOzs65ubn8/PykpKTo6OjZ2dm/v7/8/Pyurq6cnJyurq7v7++rq6v39/f9/f2rq6uhoaGZmZng4ODu7u6zs7Ofn5/W1tb6+vqgoKCfn5/8/PzX19eurq6jo6Pu7u7f39+Ojo7Pz8/h4eGWlpavr6/ExMT19fWmpqb8/PzExMS6urr8/Pytra3w8PDFxcWoqKi5ubn9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f37+/v+/v77+/v7+/v+/v76+vr9/f39/f37+/v8/Pz9/f3x8fH09PT9/f37+/v+/v79/f39/f3x8fH4+Pj9/f37+/vv7+/29vb8/Pz09PSYmJjX19f9/f339/fv7+/6+vr9/f39/f319fX19fX+/v76+vrv7+/29vb9/f37+/v9/f36+vr6+vr+/v77+/v+/v7y8vLx8fH9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7t7e2hoaGwsLD9/f3+/v79/f3+/v79/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v4=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 163.05mm )" draw:z-index="7" svg:height="4.23mm" svg:width="8.45mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+P
+N
+G
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 178.32mm )" draw:z-index="20" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 183.37mm )" draw:z-index="8" svg:height="4.23mm" svg:width="8.45mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+P
+P
+M
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 199.84mm )" draw:z-index="21" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 204.89mm )" draw:z-index="9" svg:height="4.23mm" svg:width="8.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+T
+G
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 220.16mm )" draw:z-index="22" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 225.21mm )" draw:z-index="10" svg:height="4.23mm" svg:width="6.33mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+T
+I
+F
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 240.48mm )" draw:z-index="23" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+</draw:page>
+</office:presentation>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/graphicformats_pdfi_unittest_writer.xml b/sdext/source/pdfimport/test/testdocs/graphicformats_pdfi_unittest_writer.xml
new file mode 100644
index 000000000..7a7b1883e
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/graphicformats_pdfi_unittest_writer.xml
@@ -0,0 +1,385 @@
+<?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 .
+ -->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="10mm" fo:margin-right="10mm" fo:margin-top="10mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:fill="none" draw:stroke="none" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Thorndale" fo:font-size="12pt" style:font-size-asian="12pt" style:font-size-complex="12pt" >
+
+</style:text-properties>
+
+</style:style>
+<style:style style:family="graphic" style:name="graphic9" >
+<style:graphic-properties draw:fill-color="#ffffff" draw:fill="solid" draw:stroke="solid" svg:stroke-color="#000000" svg:stroke-width="3" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="paragraph" style:master-page-name="master-page3" style:name="paragraph10" >
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:text >
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 20.18mm )" draw:z-index="0" svg:height="4.23mm" svg:width="8.95mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+BMP
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 37.21mm )" draw:z-index="11" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 42.26mm )" draw:z-index="1" svg:height="4.23mm" svg:width="8.7mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+EMF
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 92.6mm 56.86mm )" draw:z-index="14" svg:height="-9.95mm" svg:width="25.25mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:path draw:style-name="graphic9" draw:transform="translate( 92.6mm 46.95mm )" draw:z-index="12" svg:d="m9260 5640h2476v-945h-2476v945z" svg:height="9.45mm" svg:viewBox="0 0 2476 945" svg:width="24.76mm" text:anchor-page-number="1" text:anchor-type="page" >
+</draw:path>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 61.45mm )" draw:z-index="2" svg:height="4.23mm" svg:width="6.83mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+GIF
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 76.72mm )" draw:z-index="15" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk7vyMlsxebqxserS8xvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vyEhrRUXpxUYpxUXpxUYpS8vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzU2vRUXpRTYqRkcqxZZqRUYpxUYpy0vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vzc5vzc4vzs7vz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vzc4vTc4vxUYpxUXqSBisy0vvxcaqxUXpxcZpS8wuz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vy8xuSKjqxoboxkaoxkaoxcYoRscpycnrzEyuT8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk6vx8hqxkbpzM1vyMlsxUXpxUYpyMltS1wvxkbqRUXpxUYpS8vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzU2vx8gqxcYoR8gqS8vtzk4vTZ3vSwttRkbpxUYpRUYpSMkrz8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vy0vuRUYoxUXpxkbqTEzvyFksxUXpxUYpyFksy1wvRcaqxUXpxUYpS8vtz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzM0uxcZpxUXpScnsz0+vz8/vz8/vz8/vz8/vzE0vxUYpxUYpx0frT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vx8gqSkqtSsuvRUYpxUYpxkbqTE0vyEjsRUYpxUXpyFksy8xvxcZpxUXpxUYpS8wuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk7vxkbpxUXpxmcqTs9vz8/vz8/vz8/vz8/vz8/vz8/vx8gqxUXpSaosz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyUnsRUYpRUYpSkqtystuxUXpxUYpxkcqy9yvyEjsRUXqRUYpyMlsy1wvxebqxUXpxcZozU2vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vykqtRUYpRUXpyUntT8/vz8/vz8/vz8/vz8/vz8/vz8/vyMlrxcYozByvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vyMlry0vuxveqxUXpxUXpycqtystuxUYpxUXpxscqy9yvyMlsxUXpRUXpyFksy1wvRkbpycqtSkqsy0utz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vxsdqxTYqRUXqSkrtz8/vz8/vz8/vz8/vz8/vz8/vz8/vycnrxcZozs8vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vx8gqxUYpRsdqTEzvx0frxUXpxUXpSkquSsuvRcYqRUYpxkcqy8xvyMlsxUYpxUYpx8irzY3vycptxUYpRcYoS8wuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk6vxcZpxUXqRUXqSEjrz8/vz8/vz8/vz8/vz8/vz8/vz8/vyUmrR8fpz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz08vx8irRUYpxUXpyEiry9yvy8xvR0erRUXpxUYpykruSstuxUYpxUXpxscqzM1vx8hrxUXpSaosystuxUYpxUXpxmcqS8vuTMzuz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk5vxUZpxTYqRMXqxZZqTc5vz8/vz8/vz8/vz8/vz8/vz8/vyqrsSsssT8/vz8/vz8/vzk7vy0utyUnsy0utz0+vz8/vz8/vz8/vz8/vz8/vz8/vz08vzY3vzU2vTc4vz8/vz8/vz8/vz8/vz8/vzEyuyUmryUnsTk7vz8/vz8/vz8/vz8/vz8/vzc4vysttyepsy0utz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vyEjrxUXpRUYpyFksy1wvxcZpR0fqy1wvRsdqxUYpxUXpScqtyksuxTYqRUYpSXotTs8vy0vuSkruRUYpxUXpxkcrS8xvx8irRcYoS0ttz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vxkbqRUXqROYqxUXpyEjrT0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8xuRkbpxUYpRUXpxUYpS8vtT8/vz8/vz8/vz8/vz8/vz8/vyUlrRUYpRUYpR0epT09vz8/vz8/vz08vyMlrxUXpRUYpRUXpSkqsz8/vz8/vz8/vz09vybosRcYoRUXpRUYpRUYpSUnsT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vx8gqxUXpxUYpyMlsy1wvRebqxUXpxcYozEzvTc5vxsdqRUYpxUXqR8hsxZZqRUXpyMlsz8/vyksuRUYpxUXqRveqy9yvx8isRUXpxUYpSMlrT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyMlsRUXpxUXqRUXqRUYpycptT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8wuRUYpRUYpRUYpxTYqRUYpSsssz8/vz8/vz8/vz8/vz8/vzY3vxUYpRUXpxUYpSbosT8/vz8/vzs7vx8hqxUYpRTYqRUYpxUXpyRmsT8/vz8/vzk6vx1fqRkaoyaosx8hrxUXpxUXpxmcqT0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vx8hrRUXpxUXpyFksy8xvxcZpxUYpxUYpzByvTs8vzk7vzY3vxscqxTYqRUXpxUYpxUXpy1wvSstuRUYpRUXpxkcqzEzvx8isRUXpxUYpyMlszs8vzk6vz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzByvRUYpRTYqROYqxUXqRUYpywttT8/vz8/vz8/vz8/vz8/vz8/vzV2uxcYoS0vuyotvRUXqRUXqRUYpzM0uz8/vz8/vz8/vz8/vz8/vycqtRUYpxUXpxUYpzU2vz8/vz8/vyDhqRkcpzU2vxkdrRUXqRUXpykqtT8/vzs8vx0dpx8hqzk7vz8/vy1wvRTYqRTYqRmcqT09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vx8irRUYpRUXpyEksS1wvRkaqxUXpxUYpy1wvSkquRebqxcaqSEjsS9yvx8hrRcZpRcapycqtSksuRUXpxUYpxscqy8xvx8isRUYpxUYpSPmtS9yvx0frRcZpxsdqS8vtz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vx8gqxUXpxTYqRMXqxUYpxUZpzM0vT8/vz8/vz8/vz8/vzs8vxsdpSkqsT8/vyQmsxUXqRTYqRsdqz09vz8/vz8/vz8/vz8/vz8/vx0frRUXqRTYqRserT0+vz8/vykqsxcapTc4vzs8vxcaqRUXqRUYpS9yvz09vx8gqSEiqT09vz8/vz8/vyUntRUXpxUXqR0grT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyUnsRUYpxUXpyUnty0vvxcaqRUYpxcYqS1wvSXotxUXpxUYpxUXqRUYpx0grTs9vzc4vzk6vzM1vxUYpRTYqRkdrS8xvx8irxUYpxUXpyPmtS1wvRZZqRUXpxUXqRUXpxUYpTU2vT8/vz8/vz8/vz8/vz8/vz8/vz8/vzY3vxcZpxUXqRTYqRMXqxTYqRkbqTc5vz8/vz8/vz8/vykqsx0fpz0+vzk7vxcaqRUXpxUYpycptT8/vz8/vz8/vz8/vz8/vzU2vRUYpxTYqRUXpycptT8/vzc4vRgZoTM0vT8/vzEyuxUYpxUXqRUZpzk6vyMlrx1fqT09vz8/vz8/vz0+vxsdqxTYqRUXpycnsz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vxcZpRTYqRsdrSotvRebqxUXpxcZpy8xvyXotxUYpxUXpx0frxsfrxUYpxUYpTc4vz8/vz8/vykqtRUXpxTYqSsuvSBisxUYpxUXpSPmtS1wvxZZqRUXpxcaqyBisxUYpxUXpSkrtT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0vuRUXpRTYqRTYqRUXqRUYpx8gqz0+vz8/vzk4uxobozY3vz8/vy0utxUYpxUXqRUYpTU1vz8/vz8/vz8/vz8/vz8/vybosRUXpxUXpxUZpzY3vz8/vycorSkprz8/vz8/vybosRUXpxUXqSEjsSstuRsdpzs7vz8/vz8/vz8/vzEyuRUYpxUXqRUXpTEzvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vxmcqRUXpxcYqRUXpxUYpxZZqS1wvScptxUYpxUYpx0gry9yvx0frxUYpxcZpTs7vz8/vz8/vystuRUYpxUYpxcaqRUXqRUXpyPmtS8xvxcaqRUXpxZZqS0vvyUntxUXpxUYpS8vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyRmsRUXpxMXqxOYqxTYqRUYpykstz8/vzZ3uy8vtT8/vz0+vx8gqxTYqRUYpx0eqT0+vz8/vz8/vz8/vz8/vzs9vxmcqRTYqRUXpx0fqz0+vz8/vzk5vT09vz8/vz09vxsdqRTYqRTYqSMlsxscpzP1uz8/vz8/vz8/vz8/vyMkrxUXpxTYqRkcpzs9vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8vtxUYpRUYpRUXpxcZpy0vvSXotxUXpxUXpx0gry9yvx0frRUYpxUXpykstzE0vykqtS0uuTM1vxsdqRUXpxUXpxUXpSUnsy1wvxcaqRUXpxcaqS1wvSUntRUYpxUXpx1fqT09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs9vxveqxUYpxUXqRTYqRUXqRcapzs7vz8/vz8/vz8/vzU2vxUYpRUXqRUXpysstT8/vz8/vz8/vz8/vz8/vystuRUXpxTYqRUXpykqsz8/vz8/vz8/vz8/vz8/vzM1vxUXpRUXqRTYqRUYpSkqtT8/vz8/vz8/vz8/vzk5vxcapRTYqRUXpyUnsT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzMzuyMlsSUnszEzvyXotRUXpxUYpx0gry8xvxsdrRUXpxUYpScquSksuRUYpRUXpRUYpRserS9yvycptyMlsS0vvS1wvRZZqRUXpxcaqS1wvyPmtRUYpRUXpx8hrTk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzY3vxcaqRUXqRMXqxTYqRUYpy8wuT8/vz8/vz8/vycqtRUYpxUXqRUZpzc4vz8/vz8/vz8/vz8/vzs9vxsdqxTYqRUXqRUYpzU2vT8/vz8/vz8/vz8/vz8/vykrtxUXpxTYqRUXqRsdqTs8vz8/vz8/vz8/vz8/vycptRUYpxUXqRUYpTM0uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vyXotRUYpxUXpx0erTEzvxserRUYpxUYpycptTk6vxUYpxTYqRUYpxUYpxUXpxserTk7vz8/vy9yvxUYpxUXpxcZpy1wvyQmsxUXpxUXpx0fqzs8vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vybosRUXpxOYqxMXqxUYpynrsz8/vz8/vz09vxkcqxUYpxUXqSEjrz8/vz8/vz8/vz8/vz8/vyepsxUXpxUXqRTYqRserT8/vz8/vz8/vz8/vz8/vz0+vxveqxTYqRUXqRUYpy8wuT8/vz8/vz8/vz8/vzs8vxkbqRUXqRUYpx0frT0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzM0uRcYoxUYpR0grzEzvx0erRUXpxUXpyUntT8/vzY3vxUYpxTYqSEktSXotxUXqRUXpx1fqTc4vx0grRUYpRcaqS0vvSUntRUYpxUXpx0fqzs6vz8/vz8/vz8/vz8/vz8/vzV2uy0usz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk5vxcaqRUXqRMXqxUXpybosT8/vz8/vzM0uxUXpxUXqRUYpS8wuz8/vz8/vz8/vz8/vzR1vRUYpRZZqRUXqRTYqSUnsz8/vz8/vz8/vz8/vz8/vzR1vRUYpxTYqRUXqRveqz0+vz8/vz8/vz8/vz8/vy8xuRUXpxTYqRUXpy0uuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utR8hqy8xvxserRUXpxUXpykquSkrtyEjrzk7vxveqxUXpxcaqSsuvykruRUXpRUYpxsdqy8xvR8hrS0vuyUntRUXpxUXpx0fqzk6vz8/vz8/vz8/vz8/vz8/vz8/vyMlrx0epz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyEjsRUXqRUXqRUYpykqsz8/vz8/vybosRUXpxTYqRkbpzk7vz8/vz8/vz8/vzs8vx1fqSQmsxcaqxUXqRUXpTM0vT8/vz0+vykprzc5vz8/vybosRUXpxUXqRUYpTEzvT8/vz8/vz8/vz8/vz8/vyEjrRUXpxTYqRUZpzk6vz8/vzU1uS0usz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk7vx0eqRUXpxUYpycquS8xvRUYpRUYpSMlszEzvxebqxUYpxcZpy0uvSXotRTYqRUYpx0frTc4vycqtRUXpRUYpRveqzk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vx0fqx8grT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vycptRTYqRTYqRUXpy8wuT8/vzs9vxmcqRUYpxUXpyRmsT8/vz8/vz8/vz8/vyUmrSMlrystuxUXqRTYqRsdqTs9vz8/vzM0uRkaoTs7vz0+vxveqxUXpxUYpx0fqz8/vz8/vz8/vz8/vz8/vzc5vxUYpRUXqRUXpyMlrz8/vz0+vx8gpysrrz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vysstRcYoyXotSstuy0vuyEjrxUXpxUYpyMlsy8xvxkbqRUXpxZZqS0uvSXotRUYpRUXpx0gry1wvRsdqR0eqTs7vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vxcapx8grT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyXotRUXpxUXqRcapzk7vz8/vzM1vxUYpRTYqRUYpzR1vT8/vz8/vz8/vysstRsdqTs8vyEirxUYpxUXpyaosz8/vz09vx0epyxtsz8/vzU1vxUYpRTYqRUXpy0vuT8/vz8/vz8/vz8/vz8/vy0uuRUYpxUXqRUYpzEyuz8/vy0utx0dpz0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzR1vSkrtRUYoxkbpy1wvSEjsxUYpxUXpyMlsy8xvxebqxUXpxcYqS0uvScptxUXpxUXpxveqzEyuzk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzU2vRUYpRveqz8+vz8/vz8/vz8/vz8/vz8/vz8/vz0+vx0erRUYpxUYpSsstz8/vz8/vysttxUXpxUXqRsdqz0+vz8/vz8/vyxtsxobozc4vzs9vxcapxUXqRUYpzEyuz8/vyUnsR0fpz8+vz8/vyXotRUXpxTYqRsdqz09vz8/vz8/vz8/vz8/vz8/vyEjrxUXqRTYqRebqz0+vzY3vxkaozEzvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utxcYoxUXpxebqy8xvx8isRUYpxUXpyMlsy9yvxcaqRUYpxUYpy0vvycptxUYox0epzs7vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8wtxUYpxcZpzk6vz8/vz8/vz8/vz8/vz8/vz8/vzEyuRUYpRUXpx8irT8/vz8/vz8/vyMlsRUYpxUXqSEjsT8/vz8/vykrtRkZozP1uz8/vzU2vxUYpRTYqRTYqTY3vy0uuRgZoTc4vz8/vz0+vx0frRUYpxUXpycnsz8/vz8/vz8/vz8/vz8/vzs8vxcaqRUXqRTYqSPmtTk6vxscpyUnrz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vysttxUYpRUXpxscqy1wvx8isRUXpxUYpyPmtS9yvxcaqRUYpxUYpysstysstTk5vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vynrsxUYpRUXpynrsz8/vz8/vz8/vz8/vz8/vzk7vxsdpxUXpR0fqzs6vz8/vz8/vz8/vx0grRUYpxUXqRkcqysstyHjqRkbpTR1vT8/vz8/vzEzvRUYpRTYqRTYqR0fqxcYozEyuT8/vz8/vzZ3vRUYpxUXpxUYpTM0vT8/vz8/vz8/vz8/vz8/vzZ3vRUYpxTYqRUXqRebqxkbpyMkrTc4vy0uszMztz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0ttxUYpRUYpxebqy8xvyEksRUXpxUXpyMlsy8xvxcaqRcYox1fqT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzZ3vRscpxUYpRUXpSaoszk5vzs9vzs7vy8wuxscpxUYoyUmrzs8vz8/vz8/vz8/vz8/vyEjrxUXpxTYqRUXpxUYox8gqTk5vz8/vz8/vz8/vzExuxUYpRUXpxUYpxcZpTExuT8/vz8/vz8/vykqrxUXpRUYpRscpz0+vz8/vz8/vz8/vz8/vz8/vzZ3vRUYpRUXqRTYqRUYpSMjrT09vzV2uy0ssTAwtT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0vuRUYpRUYpxkbqS1wvyEktRUYpxUXpSwuuzEzvx8irTs6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vy8wuyMkrxcapRsbpR0dpRscpRkbpSUmrzU1vz8/vz8/vz8/vz8/vz8/vz8/vzU2vRsdqRkbpyEjry8xuz0+vz8/vz8/vz8/vz8/vzk5vxscpxcZpSMlsTc4vz8/vz8/vz8/vz8/vzP1uysstSsstTMzuT8/vz8/vz8/vz8/vz8/vz8/vz09vyEjrxcapxveqy0ttz0+vz8/vzs8vzV2uzk5uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vysttxUYpRUXpxebqyksvRcaqRUXpyMksT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vzk4vTP1uzZ3uz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vzs6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8+vzs7vz8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utxUYpxUXpxUYpxUXpxUYpSepsz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utxkapRUXpRUYpR1fqTk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzV2uy8vsz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzZ3vTP1uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzY3vyssty0vuT09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8+vzs7vTc4uzU1uT0+vzM0uTk5vT8/vzP1uzZ3vT8/vz8/vzU2uTU1uT8+vzs7vTc4uzs7vz8/vzU0tzZ3uz8/vz8/vzk6vTU0tzs8vzk5uz8/vz8/vzk5vT8/vzk4uzU1uTs8vybosSanrTk5vT8/vzk6vzU1uT0+vz8/vzs6vzc4uzV2uz8+vzU1uTk5vT8/vz8+vzU1uTk5uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vx/hpykqsScorSKjqyxtsx8gqTk7vysssysssz8/vykqrykqrzAwtTs8vx/hpycorTk6vykprywttSUmrS0vtzc4vyUlqzEytzk6vyUmrTc4vTc4vykpry0utyMlrTM0uTk6vyMlryMkrTU2vTM0uSUlrSwttScorTs9vx8gqSnrsyMlrSEjrSsssyMkqzs9vyUmqyxtszk5vT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vyDhqT09vzEyuSUnrz8/vyEjrTc4vzR1vSsstTs7vyEiqT8/vz8/vz09vyDhqTs8vzc4vSMkrT8/vzk7vyMkrTc4vyKjqy0utT09vy8wuSbosSnrszEyuTEyuyDhqTEytz8/vy8wuS0utz8/vyUnryMkrSsttyUmrTs7vyEiqz0+vy0uuSRmsT8/vyUmrzs7vycorybosTc4vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs9vyKjqz0+vzExtykprz8/vyKjqzc4vzMzuyssszs8vx/hpz08vz0+vzs8vyUlqz8+vzk5vSDhqT0+vzM0vSUnrz8/vzs7vyUlrSkrtT09vx0fpyDhqTs8vz8+vzk5vyEiqTR1vS8wuSsstT8/vyanrSkqszs8vz0+vz08vyKjqz8/vy0ttykqsz8/vyUlrTs7vz0+vzExtyDhqT8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vykorz8/vzMzty0usz8/vykorzk6vzU2vS8vtT8/vyqrsSanrSqrsTs7vysqrz09vz8/vykqsScoryUmrTZ3vTs7vysssScorTR1vT0+vycnryanrT8/vzV2uysrrycorzs7vzY3vyHjqTMzuTk4vSUlqyqrsTExtT09vykprz8/vy8wty0utT8/vysrrzs8vzExtSkpsS0utT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz08vz09vz8/vz8/vz8/vz8/vz8/vz08vz8+vz8/vz8/vz08vz09vz8/vz09vyUmrTP1uz8/vz09vz08vz8+vz8/vz8/vz09vz09vz8/vz8+vz08vz09vz8/vz8/vz8/vz8+vz8/vz8/vz8/vz8/vz09vz08vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vycorysssz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vw=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 81.77mm )" draw:z-index="3" svg:height="4.23mm" svg:width="7.04mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+JPG
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 97.04mm )" draw:z-index="16" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAoAGQDASIAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAAAAUGBwIDBAgB/8QAOBAAAQMCBAQFAgMGBwAAAAAAAQIDBAURAAYSIRMxQWEHFCIyUXGBFSORJDNCcqHhNENSU2KSwf/EABkBAAMBAQEAAAAAAAAAAAAAAAECAwQABf/EACMRAAICAgEEAwEBAAAAAAAAAAABAhEDIRIEIjFBE1GhcYH/2gAMAwEAAhEDEQA/APVOE+Z6/FoEEOyFJVIdJRHYKwkvLtcJBOw+pxqzhmWJlilGVKu48s6GGE+51fQD/wBOKPnVKRWapKXX3W1h3T5zWohmA3f0pRa5Lv0v1G91W1dP0zydz8E5z46Ma/WZFXzAa6JkmEr0NtkKP7A8ALoWm3tJB378jYjFu+H+cU19tcCooEatxk/nNdHB/uI+Qdv1HQjFNoiy1S2n4qPxCCFcN2pJSQy9HHuD4I9Kki25seXOwOMkTfLSY6qMuYmG08fw9BNpEshRtqI5NJ+Pr1Jt6GXBHLFRXolGTTs9KYQ5yzNFyvTEypKFvPOrDTDCPc6s9Ow7448k5uh12O3EcmxXaw03qkNsatN+RKSRuOXK4xEPH+DKMCk1SNq4cN1QWR/AVadKv1Tb7jHm4sN5VCei0pdtok9SlZwiUd6pkUfU02XlQuG4TpAuRxNW6rf8bYeZUqrlcy7BqTsfyy5Levh6tVtz178/vhPkvMsTO+WnQTw5PDLMppJ3QSLXHY72/tiIZyznUqBDp0XK7TCKchfk2HHRrW+WwEkoTy0g2TfqeW2+CsUpv46pg5JbLdwYRZnrSqDlOVVJCUeYZZBCL+kuGwA+mo/piOZfzdVpWVIUqTHjvVioKcMVlAKEJaTsXHDc2SOZPW4A3OJRxSlHkv4NyXgsDBir8g57qdSo0x+pNolzFyeBCYYSEF1Wm5HZKQQSo8h9sb6TmjMCPEtGX6qqA60touLTGQQGToKgNR3PTn89MO+nmm19A5osnBgwYgORfPeUGM1R4hXJfiyYalLZdZtfe1xv9BvfpijZMZ2JJEJUThPRypbMJ4ghkD3SJB5E2FwOXLpYK9NYiGfcprrkRUilOpiVZuxDgAAfAvZDnyNzz2xt6XqXj7JeCc4XtFReflUiLLy/TvLzqZJZEl5YuFzNaRqU0emm1gLX9JuDuMcMpiHHjJegyZLtNdaShyY7bjObf4ZtO+k9D27WCtCw21JTBlIchr8wEKj7h2E+T72upQeo/scW9kLIq4DyqjXm2TOKv3LZCmipJ2etbZZ7fPS9huyZI4Vy+/0jFOWjR4W5OegPiu1RlMWStrhRoaBYMNn/AFdSo99999+U3jPwMy0NSwjjwJSVtlK021AEpP8AUHHfKQtyM6hpQQ4pBCVHobbHEGyYK9lehN0efRXppjlQZfiPNlKwVE2VqUkp3PxjzJSeVubey6XHRXWXafIyh4vt0lhxaozyy0Rf94ytNxfuNvuMPkxmsx+MMeFHbSmk0BsJShI9IKOn/cgfROJdlvKslWaJeZ8wcL8SdGmPHbVqTGRa3u6qttcbbn5xHckZVzVTKhWkPCNCbnvanJ2sLd03UfywNgTq5q5fBxqlmjK5XtKv99k1FrRw+NNYdq9Qp2W6aCpC5AS4sclO7AIH8urfuexxJM8Tqdl7Ik5unlsy47KKUlaR6kkpB03/AJTqwsr2TqyM90iTQY8dFPhRwht59epKFXVqUU31KVdWrueZx1ZwyNOqn4DTYZSulsPF+a865+Y6tShqWR1JGr9bYS8dQjelsNPbDwoo6MuZNVWqr6XVsqfGr/KZ91h3Va5+w6YU+EShOrVWzXVVpbdnSPKRgrqpXqKR9AEj6A4nXiHTZ1RyVOp9FbSZDiUIS2FBN0hQuBfbkDhHkLK9XpEKlKqSIuuLqQiOk3DIWSVuE/xOG9vgDYczhfkUoSm3tv8AA8aaRYeDBgxiKhgwYMccLZVCpcupM1CTAjOzWraHlIBULct+3T4wywYMFtvydQYiy4tf81xUyXdHFKuHdvTp44sOV7cK/wB++DBgxdAez4mNW2WHGW+MkiM5wFIU3pDpLm6789i3a2173xm8xXUy30NPyOElKkodPDUCnhix07Hia7noLfbBgw3P3R1HG0/XZEh6Ih4tKbipdWUaXVNukFIbN7A3A187/wBMfVxK+lTzzHHbdfTHLgDiXAkAELCbkeq9j3F974MGGc6ekBKzbJh5iUpSm5j3tUABw0g2ZTpNrGxLmq+/LthzSBPTKnidqU0XAWVqIGxv6QkdBtv1+MGDCOVqg0NMGDBhAn//2Q==
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 102.09mm )" draw:z-index="4" svg:height="4.23mm" svg:width="8.94mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+PBM
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 117.36mm )" draw:z-index="17" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDQKMTAwIDQwCgAAHAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAO8AAAH8AAAAAAAAAAb/AAAHHwAAAAAAAAAHe8AADgcAAAAAAAAAG73gABwHAAAAAAAAAD/e4AA8BgAAAAAAAABd79gAPAYAAAAAAAAA73e4ADwGAAAAAAAAAfe7fAA8BBgAAYBgAAPf/PcAPgA+B4fD8AAH+f3vAD8A/gePx/AAD3D73gAfgLwPG8xwAB/vf73gH4G8DzOY8AA9/4d74A/DPA8jsPAAP7+P/+AH4ngeZ+DgAD+7h+7wB/J4HgfB4AA+9ze94APweD4HweAADe/7f8AB8PA8D4PAAAPe/HeAAfjwfA8DwAADuP7vAAD48HwPA8AAAX73fgMA8eD4ngeAAAD3f5wDAPnhuJ4HmAAA17v4AwDxw3kcDzAAAD/f4AMA8cZ7PA8gAAA97uADAePMcjwPYAAAD/eAB4HD+H44D9AAAA9/gAPDg/B4eA+QAAADuQAA/gHAcCAOAAAAA/wAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAA+AAAAQAAAAAAAAAAACAAAAAAAADAAAAAAAAAAAFqJqScyrUAAAAAAAABKUSUpFqVgAAAAAAAAUlEkmJYpEAAAAAAAAEoZKZmSpSAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAIAAAAAA=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 122.41mm )" draw:z-index="5" svg:height="4.23mm" svg:width="8.25mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+PXC
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 137.68mm )" draw:z-index="18" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 142.73mm )" draw:z-index="6" svg:height="4.23mm" svg:width="9.16mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+PGM
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 158mm )" draw:z-index="19" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6YmJhubm59fX3Hx8f7+/v9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v739/eJiYlhYWFiYmJiYmJjY2O/v7/8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3c3NxiYmJiYmJ1dXVqampiYmJkZGS/v7/8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v79/f38/Pzz8/Pl5eXj4+Ps7Oz29vb8/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3w8PDh4eHk5ORiYmJiYmKOjo6/v79ubm5iYmJmZmbFxcX8/Pz+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v79/f329vbGxsaOjo5ubm5ra2tqampjY2N1dXWfn5/MzMz39/f+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3q6uqIiIhubm7W1taYmJhhYWFiYmKZmZnFxcVubm5iYmJjY2O+vr78/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f39/f3a2tqDg4NiYmKDg4O/v7/h4eHe3t63t7dubm5jY2NiYmKUlJT6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f309PS/v79gYGBhYWFxcXHR0dGUlJRiYmJhYWGTk5PDw8Nubm5hYWFiYmK/v7/8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f3S0tJnZ2diYmKfn5/4+Pj8/Pz9/f39/f38/PzS0tJmZmZjY2OBgYH6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3w8PCDg4Oqqqq+vr5jY2NiYmJubm7Q0NCQkJBiYmJiYmKUlJTHx8doaGhiYmJiYmLExMT8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f3s7Oxvb29hYWFzc3Py8vL9/f3+/v7+/v79/f39/f36+vqEhIRiYmKkpKT9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f38/Pyenp5hYWFiYmKrq6u3t7djY2NiYmJ0dHTMzMyOjo5iYmJjY2OYmJjGxsZubm5iYmJlZWXb29v8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f2tra1iYmJiYmKgoKD8/Pz+/v7+/v7+/v7+/v79/f38/PyZmZliYmLMzMz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6ampq9vb19fX1iYmJiYmKrq6u3t7diYmJiYmJ0dHTNzc2YmJhiYmJiYmKUlJTCwsJxcXGpqamtra28vLz8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v739/d4eHhiYmJiYmKurq78/Pz+/v7+/v7+/v7+/v7+/v78/Pyfn59mZmbw8PD9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3v7++FhYViYmJ4eHjR0dF+fn5iYmJhYWGrq6u9vb1lZWViYmJycnLKysqVlZViYmJiYmKLi4vc3NypqalhYWFiYmLExMT7+/v+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3q6upmZmZiYmJiYmKPj4/8/Pz+/v7+/v7+/v7+/v7+/v78/PyZmZmAgID8/Pz9/f3+/v79/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v79/f39/f39/f39/f3+/v7+/v79/f39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v79/f39/f39/f38/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3x8fGNjY1iYmJiYmKMjIzLy8vHx8d9fX1iYmJjY2OysrK2trZlZWViYmJzc3PX19eJiYlhYWGioqK1tbVjY2NiYmJycnK/v7/Ozs78/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7o6OhnZ2diYmJiYmJoaGjk5OT9/f3+/v7+/v7+/v7+/v78/Pyurq6ysrL9/f39/f39/f3s7Oy8vLyhoaG6urr39/f9/f3+/v7+/v7+/v7+/v79/f3z8/Pc3Nzb29vj4+P9/f39/f39/f38/Pz8/PzJycmampqgoKDr6+v9/f3+/v7+/v79/f38/Pzh4eG3t7empqa8vLz09PT9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6NjY1iYmJiYmKUlJTDw8NpaWl/f3/Dw8N6enpiYmJiYmKrq6uzs7NmZmZiYmKjo6Pv7++9vb2ysrJjY2NiYmJ1dXXJycmKiopiYmK6urr6+vr+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7z8/Nvb29iYmJhYWFiYmKQkJD5+fn8/Pz9/f3+/v7+/v79/f36+vr9/f39/f38/PzHx8dxcXFiYmJiYmJhYWG/v7/9/f3+/v7+/v7+/v79/f38/PyWlpZkZGRkZGR6enr39/f9/f39/f3y8vKWlpZiYmJiYmJhYWGpqan9/f3+/v79/f3y8vKjo6NiYmJiYmJiYmJiYmKhoaH9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6EhIRiYmJiYmKYmJjGxsZubm5iYmJjY2POzs7n5+d4eHhiYmJiYmKKiopoaGhhYWGYmJj6+vq2trZiYmJiYmJ6enrKysqMjIxiYmJiYmKWlpb9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PyWlpZiYmJiYmJiYmJiYmKrq6v8/Pz9/f3+/v79/f39/f3+/v7+/v78/PzCwsJiYmJjY2NiYmJjY2NiYmKysrL9/f39/f3+/v7+/v79/f3f399jY2NiYmJiYmKkpKT7+/v9/f3u7u6Hh4djY2NlZWViYmJiYmKZmZn8/Pz9/f3q6uqAgIBtbW2jo6OIiIhiYmJiYmJ0dHT39/f+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3z8/OHh4diYmJiYmKUlJTHx8doaGhiYmJlZWXJycnx8fHs7Oze3t53d3diYmJiYmJiYmJiYmLDw8O3t7diYmJhYWF0dHTR0dGMjIxiYmJiYmKXl5fw8PDq6ur09PT9/f3+/v7+/v7+/v7+/v7+/v7+/v79/f3KyspiYmJiYmJjY2NiYmJiYmK4uLj8/Pz+/v7+/v7+/v7+/v79/f3Y2NhiYmK/v7+3t7diYmJiYmJjY2PS0tL9/f3+/v7+/v7+/v78/Pyrq6thYWFiYmJkZGTb29v8/Pz5+fmIiIhycnLc3Nx4eHhiYmJiYmKtra38/Pzw8PB4eHiFhYXt7e36+vrBwcFiYmJiYmJycnL19fX+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3z8/ONjY1iYmJiYmKTk5PDw8Nubm5iYmJmZmbBwcGurq5wcHBqamqPj4/JycmKiopmZmZra2upqamysrJiYmJiYmJ0dHTKysqKiopiYmJiYmKcnJzLy8t/f39oaGh2dna9vb38/Pz+/v7+/v7+/v7+/v7+/v79/f329vaEhIRiYmJiYmJiYmJiYmJoaGjR0dH9/f3+/v7+/v79/f3y8vJ2dnapqan6+vqamppiYmJiYmJ3d3f09PT+/v7+/v7+/v7+/v78/PyAgIBiYmJiYmJ8fHz5+fn8/PysrKxra2vj4+Pw8PBqampiYmJiYmLKysr09PSEhISKior19fX9/f38/PyhoaFhYWFiYmKDg4P6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f2enp5iYmJiYmKamprExMRtbW1iYmJmZmbCwsKkpKRiYmJiYmJiYmJiYmKEhITy8vLi4uLq6urY2NhjY2NiYmJ3d3fKysqKiopiYmJjY2OdnZ3Dw8NqampiYmJiYmJiYmJiYmLa2tr9/f3+/v7+/v7+/v7+/v7+/v79/f3b29tnZ2diYmJiYmJiYmJiYmJwcHDl5eX9/f3+/v79/f2pqal/f3/5+fns7OxqampiYmJiYmKpqan8/Pz+/v7+/v7+/v79/f3b29tlZWViYmJiYmKoqKj8/Pzh4eFoaGjS0tL8/PzKyspiYmJiYmJoaGjq6uqWlpZ/f3/19fX9/f3+/v729vZ4eHhiYmJiYmKgoKD8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PxpaWliYmJ6enq3t7dubm5iYmJpaWnIyMijo6NiYmJiYmJ/f3+AgIBiYmJiYmLi4uL8/Pz8/Pyrq6tiYmJmZma6urqMjIxiYmJiYmKdnZ3CwsJqampiYmJra2uOjo5kZGRiYmKurq79/f3+/v7+/v7+/v7+/v7+/v7+/v78/Py9vb1iYmJiYmJiYmJiYmJjY2OEhIT4+Pj9/f3k5ORvb2/e3t78/Py9vb1iYmJiYmJiYmLX19f9/f3+/v7+/v7+/v78/PyhoaFiYmJiYmJlZWXd3d38/Pyjo6OkpKT8/Pz8/Pyjo6NiYmJhYWGQkJC2trZ2dnbs7Oz9/f3+/v79/f3Ly8tiYmJiYmJiYmLOzs79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v77+/tzc3NiYmJmZmZiYmJiYmJoaGjCwsKpqaliYmJiYmKEhITNzc2AgIBiYmJoaGjv7+/8/Pz8/Py4uLhiYmJjY2NqampiYmJhYWGdnZ3IyMhra2tjY2NnZ2fBwcGfn59iYmJiYmK/v7/9/f39/f3+/v7+/v7+/v79/f3+/v79/f38/PyampphYWFiYmJiYmJhYWFiYmK1tbX8/Pzc3Ny8vLz7+/v4+PiFhYViYmJiYmJ7e3v29vb9/f39/f3+/v79/f3y8vJ0dHRiYmJiYmJ9fX36+vr8/Pzk5OT29vb8/Pz19fV4eHhiYmJjY2OYmJh1dXXU1NT9/f3+/v7+/v78/PyTk5NiYmJjY2Nzc3Pz8/P9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3BwcFiYmJiYmJhYWFoaGjBwcGkpKRhYWFiYmKEhITMzMyAgIBiYmJiYmKysrLS0tKtra28vLzW1tZ5eXlhYWFiYmJiYmKenp7CwsJra2tiYmJra2vExMSfn59iYmJiYmKAgIDz8/P9/f3+/v79/f39/f3+/v7+/v7+/v79/f39/f3z8/N9fX1jY2NiYmJiYmJiYmJra2vt7e39/f39/f38/Pzc3NxjY2NiYmJiYmKzs7P9/f3+/v7+/v7+/v78/Py4uLhiYmJiYmJiYmKoqKj8/Pz9/f3+/v7+/v79/f3X19diYmJhYWFkZGRjY2Opqan8/Pz+/v7+/v78/Pzn5+dpaWliYmJiYmKcnJz8/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PzLy8uZmZmfn5/S0tKjo6NiYmJiYmKDg4PLy8t5eXlhYWFiYmKtra2ysrJjY2NiYmJiYmJ+fn7KysqoqKiXl5e+vr7Dw8NqampiYmJra2vDw8OdnZ1iYmJjY2OFhYXq6ur9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3c3NxqampiYmJhYWFiYmJiYmLFxcX9/f3+/v78/PypqaliYmJiYmJmZmbk5OT9/f3+/v7+/v79/f3y8vJ3d3diYmJiYmJkZGTa2tr9/f3+/v7+/v7+/v78/Pyurq5iYmJiYmJiYmJ3d3fx8fH9/f3+/v7+/v79/f2oqKhiYmJiYmJiYmLS0tL9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f38/Pz39/ekpKRiYmJhYWF+fn7Ozs56enpjY2NiYmKpqanp6elmZmZiYmJlZWViYmJiYmJ7e3vs7Oz6+vrLy8tmZmZiYmJnZ2fExMScnJxiYmJhYWF/f3/u7u79/f3+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v79/f38/PyhoaFiYmJiYmJhYWFiYmKtra39/f39/f309PR1dXViYmJiYmKNjY38/Pz+/v7+/v7+/v78/PyoqKhiYmJiYmJiYmJ9fX35+fn+/v7+/v7+/v7+/v75+fl9fX1iYmJiYmJiYmLDw8P9/f3+/v7+/v79/f3w8PBwcHBiYmJiYmJ/f3/6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3S0tJiYmJiYmKEhITOzs5+fn5hYWFiYmKhoaH6+vre3t5iYmJiYmKTk5Ojo6NiYmJhYWF9fX3j4+ODg4NiYmJqamq/v7+fn59iYmJiYmJ+fn7p6en9/f3+/v7+/v7+/v7+/v7Z2dm6urr+/v7+/v7+/v7+/v7+/v7+/v79/f3m5uZqampiYmJhYWFiYmKjo6P8/Pz9/f3S0tJhYWFiYmJiYmLDw8P9/f3+/v7+/v79/f3W1tZnZ2dmZmZiYmJiYmKioqL8/Pz+/v79/f39/f39/f3U1NRjY2NiYmJiYmJ8fHz19fX+/v7+/v7+/v79/f3FxcViYmJiYmJjY2O6urr8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v76+vq6urqGhobJycl7e3tiYmJiYmKtra2wsLCQkJDq6up4eHhiYmJra2u+vr6tra1iYmJiYmJ6enrFxcWIiIi9vb2goKBiYmJhYWF/f3/p6en9/f3+/v7+/v7+/v7+/v79/f2ZmZl6enr9/f3+/v7+/v7+/v7+/v79/f3+/v78/PyPj49iYmJjY2NiYmKrq6v8/Pz7+/ujo6NjY2NiYmJubm7u7u79/f3+/v79/f3y8vJ9fX2cnJxra2tiYmJiYmLS0tL8/Pz6+vqlpaXm5ub8/PyioqJiYmJiYmJjY2POzs79/f3+/v7+/v79/f38/PyNjY1iYmJiYmJnZ2fp6en8/PzW1ta5ubn9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3q6up7e3tiYmJiYmKqqqrHx8diYmJiYmKZmZnOzs5vb29jY2NmZma9vb2lpaViYmJiYmKAgIDh4eGrq6thYWFiYmJ9fX3q6ur9/f3+/v7+/v7+/v7+/v7+/v78/PyAgICCgoL8/Pz+/v7+/v7+/v7+/v7+/v7+/v78/PyoqKhiYmJiYmJgYGDFxcX8/Pz09PR1dXViYmJiYmKampr8/Pz8/Pz9/f38/PyZmZmZmZm4uLhiYmJjY2N2dnb19fX8/PzS0tJra2vv7+/5+fl7e3tiYmJiYmKAgID7+/v9/f3+/v7+/v79/f3l5eVmZmZhYWFiYmKVlZX7+/v4+PiAgICtra39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PyysrJkZGSioqK6urq/v7+Pj49iYmJiYmKZmZnIyMhvb29iYmJmZma8vLykpKRiYmJiYmKCgoLDw8N4eHh7e3vq6ur9/f3+/v7+/v7+/v7+/v7+/v7+/v709PRqamqEhIT8/Pz9/f39/f3+/v7+/v7+/v7+/v78/Pyjo6NiYmJhYWFra2vs7Oz8/PzY2NhiYmJiYmJkZGTW1tb9/f39/f39/f2zs7N6enrx8fGNjY1iYmJiYmKjo6P6+vr19fV7e3u1tbX8/PzX19djY2NiYmJiYmK+vr79/f3+/v7+/v7+/v79/f28vLxiYmJiYmJiYmLMzMz8/Py6urp4eHj29vb+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PzW1tatra1iYmJubm7ExMSRkZFiYmJhYWGYmJjIyMhvb29iYmJlZWW8vLyoqKhiYmJiYmJ+fn7Kysrq6ur9/f3+/v7+/v7+/v7+/v7+/v79/f3+/v7c3NxiYmJ7e3v6+vr+/v7+/v7+/v7+/v7+/v7+/v74+Ph9fX1iYmJiYmK1tbX9/f38/Py1tbViYmJiYmJ4eHj4+Pj9/f38/Py1tbVubm7i4uLz8/Nra2tiYmJiYmLJycn7+/ufn5+AgID6+vr8/PylpaViYmJiYmJ1dXX09PT+/v7+/v7+/v7+/v78/PyNjY1iYmJiYmJycnL39/ff399qamrR0dH9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Py6urpiYmJiYmJubm7IyMiNjY1iYmJiYmKZmZnMzMxubm5iYmJlZWXCwsKoqKhiYmJ6enrr6+v8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3CwsJiYmJoaGjq6ur+/v7+/v7+/v79/f39/f39/f3JycliYmJiYmKJiYn5+fn9/f38/PyYmJhiYmJiYmKRkZH7+/v7+/uvr69oaGjU1NT8/Pzc3NxjY2NiYmJlZWXf39+9vb1mZmbh4eH9/f35+fl+fn5iYmJiYmKhoaH8/Pz+/v7+/v7+/v7+/v7w8PBra2tiYmJiYmKamprq6upycnKenp77+/v9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Py3t7diYmJiYmJzc3PFxcWNjY1iYmJiYmKcnJzLy8tubm5iYmJlZWW0tLSzs7Pm5ub9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f2tra1jY2NiYmKtra38/Pz9/f39/f39/f38/Pzt7e14eHhiYmKAgIDr6+v9/f3+/v76+vqEhIRiYmJiYmJzc3O0tLSMjIxubm7Y2Nj9/f39/f3Nzc1iYmJjY2NlZWV+fn5lZWXHx8f8/Pz9/f3d3d1lZWViYmJjY2PU1NT9/f3+/v7+/v7+/v7+/v7f399kZGRiYmJiYmJxcXFubm6Tk5Pg4OC6urrOzs7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Pz8/Py3t7djY2NiYmJycnLIyMiSkpJiYmJiYmKWlpbKyspra2thYWGAgID6+vr9/f3+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7c3Nx2dnZiYmJhYWGjo6Pn5+f09PTv7+/FxcVzc3NiYmKZmZnv7+/9/f3+/v7+/v79/f2Pj49iYmJiYmJiYmJiYmKDg4Pk5OT9/f3+/v79/f3IyMhiYmJiYmJiYmJoaGjFxcX9/f39/f39/f2oqKhhYWFiYmJzc3P29vb+/v7+/v7+/v7+/v7+/v7c3NxiYmJiYmJiYmJiYmKPj4/09PTb29uysrLDw8P9/f3+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Pz8/Py/v79iYmJiYmJubm7ExMSUlJRjY2NiYmK6urrT09OKioro6Oj8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u7BwcGTk5Nra2tvb294eHhzc3Nvb2+ZmZnW1tb8/Pz9/f3+/v7+/v7+/v79/f3X19d4eHhtbW2Ojo7FxcX4+Pj9/f3+/v7+/v79/f3m5uZ1dXVoaGiVlZXi4uL8/Pz+/v7+/v79/f3T09Ozs7OwsLDOzs79/f3+/v79/f3+/v7+/v7+/v719fWQkJBqamp6enq5ubn4+Pj9/f3v7+/Z2dnj4+P+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v79/f38/Py3t7diYmJiYmJwcHCzs7NqampiYmKUlJT7+/v6+vr9/f3+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f38/Pzz8/Ph4eHU1NTd3d3y8vL9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f329vby8vL8/Pz9/f39/f3+/v7+/v7+/v7+/v79/f3y8vLq6ur8/Pz9/f3+/v7+/v7+/v7+/v7+/v79/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v76+vrt7e339/f9/f39/f3+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f38/Py4uLhjY2NiYmJiYmJiYmJhYWGmpqb9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v78/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f38/Py8vLxpaWliYmJiYmJ9fX3q6ur9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v79/f39/f3b29u/v7/+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v79/f3e3t7U1NT9/f3+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Pze3t6zs7O+vr7y8vL9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v76+vrr6+vh4eHW1tb39/fU1NTm5ub9/f3W1tbc3Nz9/f3+/v7Z2dnW1tb5+fnr6+vg4ODv7+/9/f3U1NTc3Nz9/f39/f3o6OjS0tLv7+/l5eX9/f39/f3m5ub9/f3j4+PV1dXx8fGkpKScnJzo6Oj9/f3q6urW1tb4+Pj9/f3r6+vg4ODa2tr39/fU1NTo6Oj9/f34+PjU1NTm5ub9/f3+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v739/eHh4erq6ugoKCQkJC2traEhITt7e2xsbGzs7P8/PyoqKirq6vBwcHx8fGIiIifn5/r6+umpqa1tbWZmZm/v7/i4uKYmJjKysrr6+uamprf39/j4+Ojo6O9vb2UlJTS0tLr6+uZmZmTk5Pc3NzS0tKZmZm2tragoKD09PSFhYWurq6WlpaQkJC0tLSRkZHz8/Obm5u4uLjj4+P+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f309PSGhob29vbLy8uenp77+/uRkZHi4uLW1ta0tLTu7u6MjIz8/Pz8/Pz19fWHh4fz8/Pi4uKTk5P6+vrt7e2Tk5Pg4OCNjY28vLz19fXCwsKlpaWurq7KysrKysqIiIjIyMj7+/vDw8O6urr7+/ucnJyTk5O1tbWampru7u6IiIj39/e8vLydnZ36+vqbm5vu7u6goKCkpKTk5OT9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f309PSOjo75+fnExMSpqan7+/uPj4/i4uLR0dGysrLw8PCEhITz8/P4+Pjx8fGVlZX5+fnj4+OIiIj4+PjU1NScnJz8/Pzt7e2YmJiwsLD19fV9fX2Hh4fx8fH7+/vm5uaIiIjX19fDw8OwsLD7+/ufn5+pqanz8/P39/fy8vKRkZH7+/u3t7epqan7+/uYmJjv7+/5+fnExMSIiIj4+Pj9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v719fWjo6P6+vrOzs65ubn8/PykpKTo6OjZ2dm/v7/8/Pyurq6cnJyurq7v7++rq6v39/f9/f2rq6uhoaGZmZng4ODu7u6zs7Ofn5/W1tb6+vqgoKCfn5/8/PzX19eurq6jo6Pu7u7f39+Ojo7Pz8/h4eGWlpavr6/ExMT19fWmpqb8/PzExMS6urr8/Pytra3w8PDFxcWoqKi5ubn9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f37+/v+/v77+/v7+/v+/v76+vr9/f39/f37+/v8/Pz9/f3x8fH09PT9/f37+/v+/v79/f39/f3x8fH4+Pj9/f37+/vv7+/29vb8/Pz09PSYmJjX19f9/f339/fv7+/6+vr9/f39/f319fX19fX+/v76+vrv7+/29vb9/f37+/v9/f36+vr6+vr+/v77+/v+/v7y8vLx8fH9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7t7e2hoaGwsLD9/f3+/v79/f3+/v79/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v4=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 163.05mm )" draw:z-index="7" svg:height="4.23mm" svg:width="8.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+PNG
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 178.32mm )" draw:z-index="20" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 183.37mm )" draw:z-index="8" svg:height="4.23mm" svg:width="8.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+PPM
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 199.84mm )" draw:z-index="21" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 204.89mm )" draw:z-index="9" svg:height="4.23mm" svg:width="8.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+TGA
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 220.16mm )" draw:z-index="22" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 225.21mm )" draw:z-index="10" svg:height="4.23mm" svg:width="6.33mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+TIF
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 240.48mm )" draw:z-index="23" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<text:p text:style-name="paragraph10" >
+</text:p>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 20.18mm )" draw:z-index="0" svg:height="4.23mm" svg:width="8.95mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 37.21mm )" draw:z-index="11" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 42.26mm )" draw:z-index="1" svg:height="4.23mm" svg:width="8.7mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 92.6mm 56.86mm )" draw:z-index="14" svg:height="-9.95mm" svg:width="25.25mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:path draw:style-name="graphic9" draw:transform="translate( 32.66mm 16.56mm )" draw:z-index="12" svg:d="m3266 1989h874v-333h-874v333z" svg:height="3.33mm" svg:viewBox="0 0 873 333" svg:width="8.73mm" text:anchor-page-number="1" text:anchor-type="page" >
+</draw:path>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 61.45mm )" draw:z-index="2" svg:height="4.23mm" svg:width="6.83mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 76.72mm )" draw:z-index="15" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk7vyMlsxebqxserS8xvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vyEhrRUXpxUYpxUXpxUYpS8vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzU2vRUXpRTYqRkcqxZZqRUYpxUYpy0vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vzc5vzc4vzs7vz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vzc4vTc4vxUYpxUXqSBisy0vvxcaqxUXpxcZpS8wuz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vy8xuSKjqxoboxkaoxkaoxcYoRscpycnrzEyuT8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk6vx8hqxkbpzM1vyMlsxUXpxUYpyMltS1wvxkbqRUXpxUYpS8vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzU2vx8gqxcYoR8gqS8vtzk4vTZ3vSwttRkbpxUYpRUYpSMkrz8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vy0vuRUYoxUXpxkbqTEzvyFksxUXpxUYpyFksy1wvRcaqxUXpxUYpS8vtz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzM0uxcZpxUXpScnsz0+vz8/vz8/vz8/vz8/vzE0vxUYpxUYpx0frT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vx8gqSkqtSsuvRUYpxUYpxkbqTE0vyEjsRUYpxUXpyFksy8xvxcZpxUXpxUYpS8wuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk7vxkbpxUXpxmcqTs9vz8/vz8/vz8/vz8/vz8/vz8/vx8gqxUXpSaosz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyUnsRUYpRUYpSkqtystuxUXpxUYpxkcqy9yvyEjsRUXqRUYpyMlsy1wvxebqxUXpxcZozU2vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vykqtRUYpRUXpyUntT8/vz8/vz8/vz8/vz8/vz8/vz8/vyMlrxcYozByvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vyMlry0vuxveqxUXpxUXpycqtystuxUYpxUXpxscqy9yvyMlsxUXpRUXpyFksy1wvRkbpycqtSkqsy0utz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vxsdqxTYqRUXqSkrtz8/vz8/vz8/vz8/vz8/vz8/vz8/vycnrxcZozs8vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vx8gqxUYpRsdqTEzvx0frxUXpxUXpSkquSsuvRcYqRUYpxkcqy8xvyMlsxUYpxUYpx8irzY3vycptxUYpRcYoS8wuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk6vxcZpxUXqRUXqSEjrz8/vz8/vz8/vz8/vz8/vz8/vz8/vyUmrR8fpz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz08vx8irRUYpxUXpyEiry9yvy8xvR0erRUXpxUYpykruSstuxUYpxUXpxscqzM1vx8hrxUXpSaosystuxUYpxUXpxmcqS8vuTMzuz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk5vxUZpxTYqRMXqxZZqTc5vz8/vz8/vz8/vz8/vz8/vz8/vyqrsSsssT8/vz8/vz8/vzk7vy0utyUnsy0utz0+vz8/vz8/vz8/vz8/vz8/vz8/vz08vzY3vzU2vTc4vz8/vz8/vz8/vz8/vz8/vzEyuyUmryUnsTk7vz8/vz8/vz8/vz8/vz8/vzc4vysttyepsy0utz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vyEjrxUXpRUYpyFksy1wvxcZpR0fqy1wvRsdqxUYpxUXpScqtyksuxTYqRUYpSXotTs8vy0vuSkruRUYpxUXpxkcrS8xvx8irRcYoS0ttz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vxkbqRUXqROYqxUXpyEjrT0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8xuRkbpxUYpRUXpxUYpS8vtT8/vz8/vz8/vz8/vz8/vz8/vyUlrRUYpRUYpR0epT09vz8/vz8/vz08vyMlrxUXpRUYpRUXpSkqsz8/vz8/vz8/vz09vybosRcYoRUXpRUYpRUYpSUnsT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vx8gqxUXpxUYpyMlsy1wvRebqxUXpxcYozEzvTc5vxsdqRUYpxUXqR8hsxZZqRUXpyMlsz8/vyksuRUYpxUXqRveqy9yvx8isRUXpxUYpSMlrT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyMlsRUXpxUXqRUXqRUYpycptT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8wuRUYpRUYpRUYpxTYqRUYpSsssz8/vz8/vz8/vz8/vz8/vzY3vxUYpRUXpxUYpSbosT8/vz8/vzs7vx8hqxUYpRTYqRUYpxUXpyRmsT8/vz8/vzk6vx1fqRkaoyaosx8hrxUXpxUXpxmcqT0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vx8hrRUXpxUXpyFksy8xvxcZpxUYpxUYpzByvTs8vzk7vzY3vxscqxTYqRUXpxUYpxUXpy1wvSstuRUYpRUXpxkcqzEzvx8isRUXpxUYpyMlszs8vzk6vz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzByvRUYpRTYqROYqxUXqRUYpywttT8/vz8/vz8/vz8/vz8/vz8/vzV2uxcYoS0vuyotvRUXqRUXqRUYpzM0uz8/vz8/vz8/vz8/vz8/vycqtRUYpxUXpxUYpzU2vz8/vz8/vyDhqRkcpzU2vxkdrRUXqRUXpykqtT8/vzs8vx0dpx8hqzk7vz8/vy1wvRTYqRTYqRmcqT09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vx8irRUYpRUXpyEksS1wvRkaqxUXpxUYpy1wvSkquRebqxcaqSEjsS9yvx8hrRcZpRcapycqtSksuRUXpxUYpxscqy8xvx8isRUYpxUYpSPmtS9yvx0frRcZpxsdqS8vtz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vx8gqxUXpxTYqRMXqxUYpxUZpzM0vT8/vz8/vz8/vz8/vzs8vxsdpSkqsT8/vyQmsxUXqRTYqRsdqz09vz8/vz8/vz8/vz8/vz8/vx0frRUXqRTYqRserT0+vz8/vykqsxcapTc4vzs8vxcaqRUXqRUYpS9yvz09vx8gqSEiqT09vz8/vz8/vyUntRUXpxUXqR0grT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyUnsRUYpxUXpyUnty0vvxcaqRUYpxcYqS1wvSXotxUXpxUYpxUXqRUYpx0grTs9vzc4vzk6vzM1vxUYpRTYqRkdrS8xvx8irxUYpxUXpyPmtS1wvRZZqRUXpxUXqRUXpxUYpTU2vT8/vz8/vz8/vz8/vz8/vz8/vz8/vzY3vxcZpxUXqRTYqRMXqxTYqRkbqTc5vz8/vz8/vz8/vykqsx0fpz0+vzk7vxcaqRUXpxUYpycptT8/vz8/vz8/vz8/vz8/vzU2vRUYpxTYqRUXpycptT8/vzc4vRgZoTM0vT8/vzEyuxUYpxUXqRUZpzk6vyMlrx1fqT09vz8/vz8/vz0+vxsdqxTYqRUXpycnsz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vxcZpRTYqRsdrSotvRebqxUXpxcZpy8xvyXotxUYpxUXpx0frxsfrxUYpxUYpTc4vz8/vz8/vykqtRUXpxTYqSsuvSBisxUYpxUXpSPmtS1wvxZZqRUXpxcaqyBisxUYpxUXpSkrtT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0vuRUXpRTYqRTYqRUXqRUYpx8gqz0+vz8/vzk4uxobozY3vz8/vy0utxUYpxUXqRUYpTU1vz8/vz8/vz8/vz8/vz8/vybosRUXpxUXpxUZpzY3vz8/vycorSkprz8/vz8/vybosRUXpxUXqSEjsSstuRsdpzs7vz8/vz8/vz8/vzEyuRUYpxUXqRUXpTEzvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vxmcqRUXpxcYqRUXpxUYpxZZqS1wvScptxUYpxUYpx0gry9yvx0frxUYpxcZpTs7vz8/vz8/vystuRUYpxUYpxcaqRUXqRUXpyPmtS8xvxcaqRUXpxZZqS0vvyUntxUXpxUYpS8vuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyRmsRUXpxMXqxOYqxTYqRUYpykstz8/vzZ3uy8vtT8/vz0+vx8gqxTYqRUYpx0eqT0+vz8/vz8/vz8/vz8/vzs9vxmcqRTYqRUXpx0fqz0+vz8/vzk5vT09vz8/vz09vxsdqRTYqRTYqSMlsxscpzP1uz8/vz8/vz8/vz8/vyMkrxUXpxTYqRkcpzs9vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8vtxUYpRUYpRUXpxcZpy0vvSXotxUXpxUXpx0gry9yvx0frRUYpxUXpykstzE0vykqtS0uuTM1vxsdqRUXpxUXpxUXpSUnsy1wvxcaqRUXpxcaqS1wvSUntRUYpxUXpx1fqT09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs9vxveqxUYpxUXqRTYqRUXqRcapzs7vz8/vz8/vz8/vzU2vxUYpRUXqRUXpysstT8/vz8/vz8/vz8/vz8/vystuRUXpxTYqRUXpykqsz8/vz8/vz8/vz8/vz8/vzM1vxUXpRUXqRTYqRUYpSkqtT8/vz8/vz8/vz8/vzk5vxcapRTYqRUXpyUnsT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzMzuyMlsSUnszEzvyXotRUXpxUYpx0gry8xvxsdrRUXpxUYpScquSksuRUYpRUXpRUYpRserS9yvycptyMlsS0vvS1wvRZZqRUXpxcaqS1wvyPmtRUYpRUXpx8hrTk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzY3vxcaqRUXqRMXqxTYqRUYpy8wuT8/vz8/vz8/vycqtRUYpxUXqRUZpzc4vz8/vz8/vz8/vz8/vzs9vxsdqxTYqRUXqRUYpzU2vT8/vz8/vz8/vz8/vz8/vykrtxUXpxTYqRUXqRsdqTs8vz8/vz8/vz8/vz8/vycptRUYpxUXqRUYpTM0uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vyXotRUYpxUXpx0erTEzvxserRUYpxUYpycptTk6vxUYpxTYqRUYpxUYpxUXpxserTk7vz8/vy9yvxUYpxUXpxcZpy1wvyQmsxUXpxUXpx0fqzs8vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vybosRUXpxOYqxMXqxUYpynrsz8/vz8/vz09vxkcqxUYpxUXqSEjrz8/vz8/vz8/vz8/vz8/vyepsxUXpxUXqRTYqRserT8/vz8/vz8/vz8/vz8/vz0+vxveqxTYqRUXqRUYpy8wuT8/vz8/vz8/vz8/vzs8vxkbqRUXqRUYpx0frT0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzM0uRcYoxUYpR0grzEzvx0erRUXpxUXpyUntT8/vzY3vxUYpxTYqSEktSXotxUXqRUXpx1fqTc4vx0grRUYpRcaqS0vvSUntRUYpxUXpx0fqzs6vz8/vz8/vz8/vz8/vz8/vzV2uy0usz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk5vxcaqRUXqRMXqxUXpybosT8/vz8/vzM0uxUXpxUXqRUYpS8wuz8/vz8/vz8/vz8/vzR1vRUYpRZZqRUXqRTYqSUnsz8/vz8/vz8/vz8/vz8/vzR1vRUYpxTYqRUXqRveqz0+vz8/vz8/vz8/vz8/vy8xuRUXpxTYqRUXpy0uuT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utR8hqy8xvxserRUXpxUXpykquSkrtyEjrzk7vxveqxUXpxcaqSsuvykruRUXpRUYpxsdqy8xvR8hrS0vuyUntRUXpxUXpx0fqzk6vz8/vz8/vz8/vz8/vz8/vz8/vyMlrx0epz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyEjsRUXqRUXqRUYpykqsz8/vz8/vybosRUXpxTYqRkbpzk7vz8/vz8/vz8/vzs8vx1fqSQmsxcaqxUXqRUXpTM0vT8/vz0+vykprzc5vz8/vybosRUXpxUXqRUYpTEzvT8/vz8/vz8/vz8/vz8/vyEjrRUXpxTYqRUZpzk6vz8/vzU1uS0usz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzk7vx0eqRUXpxUYpycquS8xvRUYpRUYpSMlszEzvxebqxUYpxcZpy0uvSXotRTYqRUYpx0frTc4vycqtRUXpRUYpRveqzk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vx0fqx8grT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vycptRTYqRTYqRUXpy8wuT8/vzs9vxmcqRUYpxUXpyRmsT8/vz8/vz8/vz8/vyUmrSMlrystuxUXqRTYqRsdqTs9vz8/vzM0uRkaoTs7vz0+vxveqxUXpxUYpx0fqz8/vz8/vz8/vz8/vz8/vzc5vxUYpRUXqRUXpyMlrz8/vz0+vx8gpysrrz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vysstRcYoyXotSstuy0vuyEjrxUXpxUYpyMlsy8xvxkbqRUXpxZZqS0uvSXotRUYpRUXpx0gry1wvRsdqR0eqTs7vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vxcapx8grT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vyXotRUXpxUXqRcapzk7vz8/vzM1vxUYpRTYqRUYpzR1vT8/vz8/vz8/vysstRsdqTs8vyEirxUYpxUXpyaosz8/vz09vx0epyxtsz8/vzU1vxUYpRTYqRUXpy0vuT8/vz8/vz8/vz8/vz8/vy0uuRUYpxUXqRUYpzEyuz8/vy0utx0dpz0+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzR1vSkrtRUYoxkbpy1wvSEjsxUYpxUXpyMlsy8xvxebqxUXpxcYqS0uvScptxUXpxUXpxveqzEyuzk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzU2vRUYpRveqz8+vz8/vz8/vz8/vz8/vz8/vz8/vz0+vx0erRUYpxUYpSsstz8/vz8/vysttxUXpxUXqRsdqz0+vz8/vz8/vyxtsxobozc4vzs9vxcapxUXqRUYpzEyuz8/vyUnsR0fpz8+vz8/vyXotRUXpxTYqRsdqz09vz8/vz8/vz8/vz8/vz8/vyEjrxUXqRTYqRebqz0+vzY3vxkaozEzvT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utxcYoxUXpxebqy8xvx8isRUYpxUXpyMlsy9yvxcaqRUYpxUYpy0vvycptxUYox0epzs7vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy8wtxUYpxcZpzk6vz8/vz8/vz8/vz8/vz8/vz8/vzEyuRUYpRUXpx8irT8/vz8/vz8/vyMlsRUYpxUXqSEjsT8/vz8/vykrtRkZozP1uz8/vzU2vxUYpRTYqRTYqTY3vy0uuRgZoTc4vz8/vz0+vx0frRUYpxUXpycnsz8/vz8/vz8/vz8/vz8/vzs8vxcaqRUXqRTYqSPmtTk6vxscpyUnrz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vysttxUYpRUXpxscqy1wvx8isRUXpxUYpyPmtS9yvxcaqRUYpxUYpysstysstTk5vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vynrsxUYpRUXpynrsz8/vz8/vz8/vz8/vz8/vzk7vxsdpxUXpR0fqzs6vz8/vz8/vz8/vx0grRUYpxUXqRkcqysstyHjqRkbpTR1vT8/vz8/vzEzvRUYpRTYqRTYqR0fqxcYozEyuT8/vz8/vzZ3vRUYpxUXpxUYpTM0vT8/vz8/vz8/vz8/vz8/vzZ3vRUYpxTYqRUXqRebqxkbpyMkrTc4vy0uszMztz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0ttxUYpRUYpxebqy8xvyEksRUXpxUXpyMlsy8xvxcaqRcYox1fqT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzZ3vRscpxUYpRUXpSaoszk5vzs9vzs7vy8wuxscpxUYoyUmrzs8vz8/vz8/vz8/vz8/vyEjrxUXpxTYqRUXpxUYox8gqTk5vz8/vz8/vz8/vzExuxUYpRUXpxUYpxcZpTExuT8/vz8/vz8/vykqrxUXpRUYpRscpz0+vz8/vz8/vz8/vz8/vz8/vzZ3vRUYpRUXqRTYqRUYpSMjrT09vzV2uy0ssTAwtT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0vuRUYpRUYpxkbqS1wvyEktRUYpxUXpSwuuzEzvx8irTs6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs8vy8wuyMkrxcapRsbpR0dpRscpRkbpSUmrzU1vz8/vz8/vz8/vz8/vz8/vz8/vzU2vRsdqRkbpyEjry8xuz0+vz8/vz8/vz8/vz8/vzk5vxscpxcZpSMlsTc4vz8/vz8/vz8/vz8/vzP1uysstSsstTMzuT8/vz8/vz8/vz8/vz8/vz8/vz09vyEjrxcapxveqy0ttz0+vz8/vzs8vzV2uzk5uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vysttxUYpRUXpxebqyksvRcaqRUXpyMksT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vzk4vTP1uzZ3uz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vz09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vzs6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8+vzs7vz8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utxUYpxUXpxUYpxUXpxUYpSepsz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vy0utxkapRUXpRUYpR1fqTk6vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzV2uy8vsz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzZ3vTP1uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzY3vyssty0vuT09vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8+vzs7vTc4uzU1uT0+vzM0uTk5vT8/vzP1uzZ3vT8/vz8/vzU2uTU1uT8+vzs7vTc4uzs7vz8/vzU0tzZ3uz8/vz8/vzk6vTU0tzs8vzk5uz8/vz8/vzk5vT8/vzk4uzU1uTs8vybosSanrTk5vT8/vzk6vzU1uT0+vz8/vzs6vzc4uzV2uz8+vzU1uTk5vT8/vz8+vzU1uTk5uz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz0+vx/hpykqsScorSKjqyxtsx8gqTk7vysssysssz8/vykqrykqrzAwtTs8vx/hpycorTk6vykprywttSUmrS0vtzc4vyUlqzEytzk6vyUmrTc4vTc4vykpry0utyMlrTM0uTk6vyMlryMkrTU2vTM0uSUlrSwttScorTs9vx8gqSnrsyMlrSEjrSsssyMkqzs9vyUmqyxtszk5vT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vyDhqT09vzEyuSUnrz8/vyEjrTc4vzR1vSsstTs7vyEiqT8/vz8/vz09vyDhqTs8vzc4vSMkrT8/vzk7vyMkrTc4vyKjqy0utT09vy8wuSbosSnrszEyuTEyuyDhqTEytz8/vy8wuS0utz8/vyUnryMkrSsttyUmrTs7vyEiqz0+vy0uuSRmsT8/vyUmrzs7vycorybosTc4vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs9vyKjqz0+vzExtykprz8/vyKjqzc4vzMzuyssszs8vx/hpz08vz0+vzs8vyUlqz8+vzk5vSDhqT0+vzM0vSUnrz8/vzs7vyUlrSkrtT09vx0fpyDhqTs8vz8+vzk5vyEiqTR1vS8wuSsstT8/vyanrSkqszs8vz0+vz08vyKjqz8/vy0ttykqsz8/vyUlrTs7vz0+vzExtyDhqT8+vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz09vykorz8/vzMzty0usz8/vykorzk6vzU2vS8vtT8/vyqrsSanrSqrsTs7vysqrz09vz8/vykqsScoryUmrTZ3vTs7vysssScorTR1vT0+vycnryanrT8/vzV2uysrrycorzs7vzY3vyHjqTMzuTk4vSUlqyqrsTExtT09vykprz8/vy8wty0utT8/vysrrzs8vzExtSkpsS0utT8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz08vz09vz8/vz8/vz8/vz8/vz8/vz08vz8+vz8/vz8/vz08vz09vz8/vz09vyUmrTP1uz8/vz09vz08vz8+vz8/vz8/vz09vz09vz8/vz8+vz08vz09vz8/vz8/vz8/vz8+vz8/vz8/vz8/vz8/vz09vz08vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vzs7vycorysssz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vz8/vw=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 81.77mm )" draw:z-index="3" svg:height="4.23mm" svg:width="7.04mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 97.04mm )" draw:z-index="16" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAoAGQDASIAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAAAAUGBwIDBAgB/8QAOBAAAQMCBAQFAgMGBwAAAAAAAQIDBAURAAYSIRMxQWEHFCIyUXGBFSORJDNCcqHhNENSU2KSwf/EABkBAAMBAQEAAAAAAAAAAAAAAAECAwQABf/EACMRAAICAgEEAwEBAAAAAAAAAAABAhEDIRIEIjFBE1GhcYH/2gAMAwEAAhEDEQA/APVOE+Z6/FoEEOyFJVIdJRHYKwkvLtcJBOw+pxqzhmWJlilGVKu48s6GGE+51fQD/wBOKPnVKRWapKXX3W1h3T5zWohmA3f0pRa5Lv0v1G91W1dP0zydz8E5z46Ma/WZFXzAa6JkmEr0NtkKP7A8ALoWm3tJB378jYjFu+H+cU19tcCooEatxk/nNdHB/uI+Qdv1HQjFNoiy1S2n4qPxCCFcN2pJSQy9HHuD4I9Kki25seXOwOMkTfLSY6qMuYmG08fw9BNpEshRtqI5NJ+Pr1Jt6GXBHLFRXolGTTs9KYQ5yzNFyvTEypKFvPOrDTDCPc6s9Ow7448k5uh12O3EcmxXaw03qkNsatN+RKSRuOXK4xEPH+DKMCk1SNq4cN1QWR/AVadKv1Tb7jHm4sN5VCei0pdtok9SlZwiUd6pkUfU02XlQuG4TpAuRxNW6rf8bYeZUqrlcy7BqTsfyy5Levh6tVtz178/vhPkvMsTO+WnQTw5PDLMppJ3QSLXHY72/tiIZyznUqBDp0XK7TCKchfk2HHRrW+WwEkoTy0g2TfqeW2+CsUpv46pg5JbLdwYRZnrSqDlOVVJCUeYZZBCL+kuGwA+mo/piOZfzdVpWVIUqTHjvVioKcMVlAKEJaTsXHDc2SOZPW4A3OJRxSlHkv4NyXgsDBir8g57qdSo0x+pNolzFyeBCYYSEF1Wm5HZKQQSo8h9sb6TmjMCPEtGX6qqA60touLTGQQGToKgNR3PTn89MO+nmm19A5osnBgwYgORfPeUGM1R4hXJfiyYalLZdZtfe1xv9BvfpijZMZ2JJEJUThPRypbMJ4ghkD3SJB5E2FwOXLpYK9NYiGfcprrkRUilOpiVZuxDgAAfAvZDnyNzz2xt6XqXj7JeCc4XtFReflUiLLy/TvLzqZJZEl5YuFzNaRqU0emm1gLX9JuDuMcMpiHHjJegyZLtNdaShyY7bjObf4ZtO+k9D27WCtCw21JTBlIchr8wEKj7h2E+T72upQeo/scW9kLIq4DyqjXm2TOKv3LZCmipJ2etbZZ7fPS9huyZI4Vy+/0jFOWjR4W5OegPiu1RlMWStrhRoaBYMNn/AFdSo99999+U3jPwMy0NSwjjwJSVtlK021AEpP8AUHHfKQtyM6hpQQ4pBCVHobbHEGyYK9lehN0efRXppjlQZfiPNlKwVE2VqUkp3PxjzJSeVubey6XHRXWXafIyh4vt0lhxaozyy0Rf94ytNxfuNvuMPkxmsx+MMeFHbSmk0BsJShI9IKOn/cgfROJdlvKslWaJeZ8wcL8SdGmPHbVqTGRa3u6qttcbbn5xHckZVzVTKhWkPCNCbnvanJ2sLd03UfywNgTq5q5fBxqlmjK5XtKv99k1FrRw+NNYdq9Qp2W6aCpC5AS4sclO7AIH8urfuexxJM8Tqdl7Ik5unlsy47KKUlaR6kkpB03/AJTqwsr2TqyM90iTQY8dFPhRwht59epKFXVqUU31KVdWrueZx1ZwyNOqn4DTYZSulsPF+a865+Y6tShqWR1JGr9bYS8dQjelsNPbDwoo6MuZNVWqr6XVsqfGr/KZ91h3Va5+w6YU+EShOrVWzXVVpbdnSPKRgrqpXqKR9AEj6A4nXiHTZ1RyVOp9FbSZDiUIS2FBN0hQuBfbkDhHkLK9XpEKlKqSIuuLqQiOk3DIWSVuE/xOG9vgDYczhfkUoSm3tv8AA8aaRYeDBgxiKhgwYMccLZVCpcupM1CTAjOzWraHlIBULct+3T4wywYMFtvydQYiy4tf81xUyXdHFKuHdvTp44sOV7cK/wB++DBgxdAez4mNW2WHGW+MkiM5wFIU3pDpLm6789i3a2173xm8xXUy30NPyOElKkodPDUCnhix07Hia7noLfbBgw3P3R1HG0/XZEh6Ih4tKbipdWUaXVNukFIbN7A3A187/wBMfVxK+lTzzHHbdfTHLgDiXAkAELCbkeq9j3F974MGGc6ekBKzbJh5iUpSm5j3tUABw0g2ZTpNrGxLmq+/LthzSBPTKnidqU0XAWVqIGxv6QkdBtv1+MGDCOVqg0NMGDBhAn//2Q==
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 102.09mm )" draw:z-index="4" svg:height="4.23mm" svg:width="8.94mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 117.36mm )" draw:z-index="17" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDQKMTAwIDQwCgAAHAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAO8AAAH8AAAAAAAAAAb/AAAHHwAAAAAAAAAHe8AADgcAAAAAAAAAG73gABwHAAAAAAAAAD/e4AA8BgAAAAAAAABd79gAPAYAAAAAAAAA73e4ADwGAAAAAAAAAfe7fAA8BBgAAYBgAAPf/PcAPgA+B4fD8AAH+f3vAD8A/gePx/AAD3D73gAfgLwPG8xwAB/vf73gH4G8DzOY8AA9/4d74A/DPA8jsPAAP7+P/+AH4ngeZ+DgAD+7h+7wB/J4HgfB4AA+9ze94APweD4HweAADe/7f8AB8PA8D4PAAAPe/HeAAfjwfA8DwAADuP7vAAD48HwPA8AAAX73fgMA8eD4ngeAAAD3f5wDAPnhuJ4HmAAA17v4AwDxw3kcDzAAAD/f4AMA8cZ7PA8gAAA97uADAePMcjwPYAAAD/eAB4HD+H44D9AAAA9/gAPDg/B4eA+QAAADuQAA/gHAcCAOAAAAA/wAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAA+AAAAQAAAAAAAAAAACAAAAAAAADAAAAAAAAAAAFqJqScyrUAAAAAAAABKUSUpFqVgAAAAAAAAUlEkmJYpEAAAAAAAAEoZKZmSpSAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAIAAAAAA=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 122.41mm )" draw:z-index="5" svg:height="4.23mm" svg:width="8.25mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 137.68mm )" draw:z-index="18" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 142.73mm )" draw:z-index="6" svg:height="4.23mm" svg:width="9.16mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 158mm )" draw:z-index="19" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6YmJhubm59fX3Hx8f7+/v9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v739/eJiYlhYWFiYmJiYmJjY2O/v7/8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3c3NxiYmJiYmJ1dXVqampiYmJkZGS/v7/8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v79/f38/Pzz8/Pl5eXj4+Ps7Oz29vb8/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3w8PDh4eHk5ORiYmJiYmKOjo6/v79ubm5iYmJmZmbFxcX8/Pz+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v79/f329vbGxsaOjo5ubm5ra2tqampjY2N1dXWfn5/MzMz39/f+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3q6uqIiIhubm7W1taYmJhhYWFiYmKZmZnFxcVubm5iYmJjY2O+vr78/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f39/f3a2tqDg4NiYmKDg4O/v7/h4eHe3t63t7dubm5jY2NiYmKUlJT6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f309PS/v79gYGBhYWFxcXHR0dGUlJRiYmJhYWGTk5PDw8Nubm5hYWFiYmK/v7/8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f3S0tJnZ2diYmKfn5/4+Pj8/Pz9/f39/f38/PzS0tJmZmZjY2OBgYH6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3w8PCDg4Oqqqq+vr5jY2NiYmJubm7Q0NCQkJBiYmJiYmKUlJTHx8doaGhiYmJiYmLExMT8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f3s7Oxvb29hYWFzc3Py8vL9/f3+/v7+/v79/f39/f36+vqEhIRiYmKkpKT9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f38/Pyenp5hYWFiYmKrq6u3t7djY2NiYmJ0dHTMzMyOjo5iYmJjY2OYmJjGxsZubm5iYmJlZWXb29v8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f2tra1iYmJiYmKgoKD8/Pz+/v7+/v7+/v7+/v79/f38/PyZmZliYmLMzMz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6ampq9vb19fX1iYmJiYmKrq6u3t7diYmJiYmJ0dHTNzc2YmJhiYmJiYmKUlJTCwsJxcXGpqamtra28vLz8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v739/d4eHhiYmJiYmKurq78/Pz+/v7+/v7+/v7+/v7+/v78/Pyfn59mZmbw8PD9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3v7++FhYViYmJ4eHjR0dF+fn5iYmJhYWGrq6u9vb1lZWViYmJycnLKysqVlZViYmJiYmKLi4vc3NypqalhYWFiYmLExMT7+/v+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3q6upmZmZiYmJiYmKPj4/8/Pz+/v7+/v7+/v7+/v7+/v78/PyZmZmAgID8/Pz9/f3+/v79/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v79/f39/f39/f39/f3+/v7+/v79/f39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v79/f39/f39/f38/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3x8fGNjY1iYmJiYmKMjIzLy8vHx8d9fX1iYmJjY2OysrK2trZlZWViYmJzc3PX19eJiYlhYWGioqK1tbVjY2NiYmJycnK/v7/Ozs78/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7o6OhnZ2diYmJiYmJoaGjk5OT9/f3+/v7+/v7+/v7+/v78/Pyurq6ysrL9/f39/f39/f3s7Oy8vLyhoaG6urr39/f9/f3+/v7+/v7+/v7+/v79/f3z8/Pc3Nzb29vj4+P9/f39/f39/f38/Pz8/PzJycmampqgoKDr6+v9/f3+/v7+/v79/f38/Pzh4eG3t7empqa8vLz09PT9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6NjY1iYmJiYmKUlJTDw8NpaWl/f3/Dw8N6enpiYmJiYmKrq6uzs7NmZmZiYmKjo6Pv7++9vb2ysrJjY2NiYmJ1dXXJycmKiopiYmK6urr6+vr+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7z8/Nvb29iYmJhYWFiYmKQkJD5+fn8/Pz9/f3+/v7+/v79/f36+vr9/f39/f38/PzHx8dxcXFiYmJiYmJhYWG/v7/9/f3+/v7+/v7+/v79/f38/PyWlpZkZGRkZGR6enr39/f9/f39/f3y8vKWlpZiYmJiYmJhYWGpqan9/f3+/v79/f3y8vKjo6NiYmJiYmJiYmJiYmKhoaH9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u6EhIRiYmJiYmKYmJjGxsZubm5iYmJjY2POzs7n5+d4eHhiYmJiYmKKiopoaGhhYWGYmJj6+vq2trZiYmJiYmJ6enrKysqMjIxiYmJiYmKWlpb9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PyWlpZiYmJiYmJiYmJiYmKrq6v8/Pz9/f3+/v79/f39/f3+/v7+/v78/PzCwsJiYmJjY2NiYmJjY2NiYmKysrL9/f39/f3+/v7+/v79/f3f399jY2NiYmJiYmKkpKT7+/v9/f3u7u6Hh4djY2NlZWViYmJiYmKZmZn8/Pz9/f3q6uqAgIBtbW2jo6OIiIhiYmJiYmJ0dHT39/f+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3z8/OHh4diYmJiYmKUlJTHx8doaGhiYmJlZWXJycnx8fHs7Oze3t53d3diYmJiYmJiYmJiYmLDw8O3t7diYmJhYWF0dHTR0dGMjIxiYmJiYmKXl5fw8PDq6ur09PT9/f3+/v7+/v7+/v7+/v7+/v7+/v79/f3KyspiYmJiYmJjY2NiYmJiYmK4uLj8/Pz+/v7+/v7+/v7+/v79/f3Y2NhiYmK/v7+3t7diYmJiYmJjY2PS0tL9/f3+/v7+/v7+/v78/Pyrq6thYWFiYmJkZGTb29v8/Pz5+fmIiIhycnLc3Nx4eHhiYmJiYmKtra38/Pzw8PB4eHiFhYXt7e36+vrBwcFiYmJiYmJycnL19fX+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3z8/ONjY1iYmJiYmKTk5PDw8Nubm5iYmJmZmbBwcGurq5wcHBqamqPj4/JycmKiopmZmZra2upqamysrJiYmJiYmJ0dHTKysqKiopiYmJiYmKcnJzLy8t/f39oaGh2dna9vb38/Pz+/v7+/v7+/v7+/v7+/v79/f329vaEhIRiYmJiYmJiYmJiYmJoaGjR0dH9/f3+/v7+/v79/f3y8vJ2dnapqan6+vqamppiYmJiYmJ3d3f09PT+/v7+/v7+/v7+/v78/PyAgIBiYmJiYmJ8fHz5+fn8/PysrKxra2vj4+Pw8PBqampiYmJiYmLKysr09PSEhISKior19fX9/f38/PyhoaFhYWFiYmKDg4P6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f2enp5iYmJiYmKamprExMRtbW1iYmJmZmbCwsKkpKRiYmJiYmJiYmJiYmKEhITy8vLi4uLq6urY2NhjY2NiYmJ3d3fKysqKiopiYmJjY2OdnZ3Dw8NqampiYmJiYmJiYmJiYmLa2tr9/f3+/v7+/v7+/v7+/v7+/v79/f3b29tnZ2diYmJiYmJiYmJiYmJwcHDl5eX9/f3+/v79/f2pqal/f3/5+fns7OxqampiYmJiYmKpqan8/Pz+/v7+/v7+/v79/f3b29tlZWViYmJiYmKoqKj8/Pzh4eFoaGjS0tL8/PzKyspiYmJiYmJoaGjq6uqWlpZ/f3/19fX9/f3+/v729vZ4eHhiYmJiYmKgoKD8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PxpaWliYmJ6enq3t7dubm5iYmJpaWnIyMijo6NiYmJiYmJ/f3+AgIBiYmJiYmLi4uL8/Pz8/Pyrq6tiYmJmZma6urqMjIxiYmJiYmKdnZ3CwsJqampiYmJra2uOjo5kZGRiYmKurq79/f3+/v7+/v7+/v7+/v7+/v7+/v78/Py9vb1iYmJiYmJiYmJiYmJjY2OEhIT4+Pj9/f3k5ORvb2/e3t78/Py9vb1iYmJiYmJiYmLX19f9/f3+/v7+/v7+/v78/PyhoaFiYmJiYmJlZWXd3d38/Pyjo6OkpKT8/Pz8/Pyjo6NiYmJhYWGQkJC2trZ2dnbs7Oz9/f3+/v79/f3Ly8tiYmJiYmJiYmLOzs79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v77+/tzc3NiYmJmZmZiYmJiYmJoaGjCwsKpqaliYmJiYmKEhITNzc2AgIBiYmJoaGjv7+/8/Pz8/Py4uLhiYmJjY2NqampiYmJhYWGdnZ3IyMhra2tjY2NnZ2fBwcGfn59iYmJiYmK/v7/9/f39/f3+/v7+/v7+/v79/f3+/v79/f38/PyampphYWFiYmJiYmJhYWFiYmK1tbX8/Pzc3Ny8vLz7+/v4+PiFhYViYmJiYmJ7e3v29vb9/f39/f3+/v79/f3y8vJ0dHRiYmJiYmJ9fX36+vr8/Pzk5OT29vb8/Pz19fV4eHhiYmJjY2OYmJh1dXXU1NT9/f3+/v7+/v78/PyTk5NiYmJjY2Nzc3Pz8/P9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3BwcFiYmJiYmJhYWFoaGjBwcGkpKRhYWFiYmKEhITMzMyAgIBiYmJiYmKysrLS0tKtra28vLzW1tZ5eXlhYWFiYmJiYmKenp7CwsJra2tiYmJra2vExMSfn59iYmJiYmKAgIDz8/P9/f3+/v79/f39/f3+/v7+/v7+/v79/f39/f3z8/N9fX1jY2NiYmJiYmJiYmJra2vt7e39/f39/f38/Pzc3NxjY2NiYmJiYmKzs7P9/f3+/v7+/v7+/v78/Py4uLhiYmJiYmJiYmKoqKj8/Pz9/f3+/v7+/v79/f3X19diYmJhYWFkZGRjY2Opqan8/Pz+/v7+/v78/Pzn5+dpaWliYmJiYmKcnJz8/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PzLy8uZmZmfn5/S0tKjo6NiYmJiYmKDg4PLy8t5eXlhYWFiYmKtra2ysrJjY2NiYmJiYmJ+fn7KysqoqKiXl5e+vr7Dw8NqampiYmJra2vDw8OdnZ1iYmJjY2OFhYXq6ur9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3c3NxqampiYmJhYWFiYmJiYmLFxcX9/f3+/v78/PypqaliYmJiYmJmZmbk5OT9/f3+/v7+/v79/f3y8vJ3d3diYmJiYmJkZGTa2tr9/f3+/v7+/v7+/v78/Pyurq5iYmJiYmJiYmJ3d3fx8fH9/f3+/v7+/v79/f2oqKhiYmJiYmJiYmLS0tL9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f38/Pz39/ekpKRiYmJhYWF+fn7Ozs56enpjY2NiYmKpqanp6elmZmZiYmJlZWViYmJiYmJ7e3vs7Oz6+vrLy8tmZmZiYmJnZ2fExMScnJxiYmJhYWF/f3/u7u79/f3+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v79/f38/PyhoaFiYmJiYmJhYWFiYmKtra39/f39/f309PR1dXViYmJiYmKNjY38/Pz+/v7+/v7+/v78/PyoqKhiYmJiYmJiYmJ9fX35+fn+/v7+/v7+/v7+/v75+fl9fX1iYmJiYmJiYmLDw8P9/f3+/v7+/v79/f3w8PBwcHBiYmJiYmJ/f3/6+vr+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3S0tJiYmJiYmKEhITOzs5+fn5hYWFiYmKhoaH6+vre3t5iYmJiYmKTk5Ojo6NiYmJhYWF9fX3j4+ODg4NiYmJqamq/v7+fn59iYmJiYmJ+fn7p6en9/f3+/v7+/v7+/v7+/v7Z2dm6urr+/v7+/v7+/v7+/v7+/v7+/v79/f3m5uZqampiYmJhYWFiYmKjo6P8/Pz9/f3S0tJhYWFiYmJiYmLDw8P9/f3+/v7+/v79/f3W1tZnZ2dmZmZiYmJiYmKioqL8/Pz+/v79/f39/f39/f3U1NRjY2NiYmJiYmJ8fHz19fX+/v7+/v7+/v79/f3FxcViYmJiYmJjY2O6urr8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v76+vq6urqGhobJycl7e3tiYmJiYmKtra2wsLCQkJDq6up4eHhiYmJra2u+vr6tra1iYmJiYmJ6enrFxcWIiIi9vb2goKBiYmJhYWF/f3/p6en9/f3+/v7+/v7+/v7+/v79/f2ZmZl6enr9/f3+/v7+/v7+/v7+/v79/f3+/v78/PyPj49iYmJjY2NiYmKrq6v8/Pz7+/ujo6NjY2NiYmJubm7u7u79/f3+/v79/f3y8vJ9fX2cnJxra2tiYmJiYmLS0tL8/Pz6+vqlpaXm5ub8/PyioqJiYmJiYmJjY2POzs79/f3+/v7+/v79/f38/PyNjY1iYmJiYmJnZ2fp6en8/PzW1ta5ubn9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3q6up7e3tiYmJiYmKqqqrHx8diYmJiYmKZmZnOzs5vb29jY2NmZma9vb2lpaViYmJiYmKAgIDh4eGrq6thYWFiYmJ9fX3q6ur9/f3+/v7+/v7+/v7+/v7+/v78/PyAgICCgoL8/Pz+/v7+/v7+/v7+/v7+/v7+/v78/PyoqKhiYmJiYmJgYGDFxcX8/Pz09PR1dXViYmJiYmKampr8/Pz8/Pz9/f38/PyZmZmZmZm4uLhiYmJjY2N2dnb19fX8/PzS0tJra2vv7+/5+fl7e3tiYmJiYmKAgID7+/v9/f3+/v7+/v79/f3l5eVmZmZhYWFiYmKVlZX7+/v4+PiAgICtra39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PyysrJkZGSioqK6urq/v7+Pj49iYmJiYmKZmZnIyMhvb29iYmJmZma8vLykpKRiYmJiYmKCgoLDw8N4eHh7e3vq6ur9/f3+/v7+/v7+/v7+/v7+/v7+/v709PRqamqEhIT8/Pz9/f39/f3+/v7+/v7+/v7+/v78/Pyjo6NiYmJhYWFra2vs7Oz8/PzY2NhiYmJiYmJkZGTW1tb9/f39/f39/f2zs7N6enrx8fGNjY1iYmJiYmKjo6P6+vr19fV7e3u1tbX8/PzX19djY2NiYmJiYmK+vr79/f3+/v7+/v7+/v79/f28vLxiYmJiYmJiYmLMzMz8/Py6urp4eHj29vb+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/PzW1tatra1iYmJubm7ExMSRkZFiYmJhYWGYmJjIyMhvb29iYmJlZWW8vLyoqKhiYmJiYmJ+fn7Kysrq6ur9/f3+/v7+/v7+/v7+/v7+/v79/f3+/v7c3NxiYmJ7e3v6+vr+/v7+/v7+/v7+/v7+/v7+/v74+Ph9fX1iYmJiYmK1tbX9/f38/Py1tbViYmJiYmJ4eHj4+Pj9/f38/Py1tbVubm7i4uLz8/Nra2tiYmJiYmLJycn7+/ufn5+AgID6+vr8/PylpaViYmJiYmJ1dXX09PT+/v7+/v7+/v7+/v78/PyNjY1iYmJiYmJycnL39/ff399qamrR0dH9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Py6urpiYmJiYmJubm7IyMiNjY1iYmJiYmKZmZnMzMxubm5iYmJlZWXCwsKoqKhiYmJ6enrr6+v8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3CwsJiYmJoaGjq6ur+/v7+/v7+/v79/f39/f39/f3JycliYmJiYmKJiYn5+fn9/f38/PyYmJhiYmJiYmKRkZH7+/v7+/uvr69oaGjU1NT8/Pzc3NxjY2NiYmJlZWXf39+9vb1mZmbh4eH9/f35+fl+fn5iYmJiYmKhoaH8/Pz+/v7+/v7+/v7+/v7w8PBra2tiYmJiYmKamprq6upycnKenp77+/v9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Py3t7diYmJiYmJzc3PFxcWNjY1iYmJiYmKcnJzLy8tubm5iYmJlZWW0tLSzs7Pm5ub9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f2tra1jY2NiYmKtra38/Pz9/f39/f39/f38/Pzt7e14eHhiYmKAgIDr6+v9/f3+/v76+vqEhIRiYmJiYmJzc3O0tLSMjIxubm7Y2Nj9/f39/f3Nzc1iYmJjY2NlZWV+fn5lZWXHx8f8/Pz9/f3d3d1lZWViYmJjY2PU1NT9/f3+/v7+/v7+/v7+/v7f399kZGRiYmJiYmJxcXFubm6Tk5Pg4OC6urrOzs7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Pz8/Py3t7djY2NiYmJycnLIyMiSkpJiYmJiYmKWlpbKyspra2thYWGAgID6+vr9/f3+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7c3Nx2dnZiYmJhYWGjo6Pn5+f09PTv7+/FxcVzc3NiYmKZmZnv7+/9/f3+/v7+/v79/f2Pj49iYmJiYmJiYmJiYmKDg4Pk5OT9/f3+/v79/f3IyMhiYmJiYmJiYmJoaGjFxcX9/f39/f39/f2oqKhhYWFiYmJzc3P29vb+/v7+/v7+/v7+/v7+/v7c3NxiYmJiYmJiYmJiYmKPj4/09PTb29uysrLDw8P9/f3+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Pz8/Py/v79iYmJiYmJubm7ExMSUlJRjY2NiYmK6urrT09OKioro6Oj8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3u7u7BwcGTk5Nra2tvb294eHhzc3Nvb2+ZmZnW1tb8/Pz9/f3+/v7+/v7+/v79/f3X19d4eHhtbW2Ojo7FxcX4+Pj9/f3+/v7+/v79/f3m5uZ1dXVoaGiVlZXi4uL8/Pz+/v7+/v79/f3T09Ozs7OwsLDOzs79/f3+/v79/f3+/v7+/v7+/v719fWQkJBqamp6enq5ubn4+Pj9/f3v7+/Z2dnj4+P+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v79/f38/Py3t7diYmJiYmJwcHCzs7NqampiYmKUlJT7+/v6+vr9/f3+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f38/Pzz8/Ph4eHU1NTd3d3y8vL9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f329vby8vL8/Pz9/f39/f3+/v7+/v7+/v7+/v79/f3y8vLq6ur8/Pz9/f3+/v7+/v7+/v7+/v7+/v79/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v76+vrt7e339/f9/f39/f3+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f38/Py4uLhjY2NiYmJiYmJiYmJhYWGmpqb9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v78/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f38/Py8vLxpaWliYmJiYmJ9fX3q6ur9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v79/f39/f3b29u/v7/+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v79/f3e3t7U1NT9/f3+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/Pze3t6zs7O+vr7y8vL9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v76+vrr6+vh4eHW1tb39/fU1NTm5ub9/f3W1tbc3Nz9/f3+/v7Z2dnW1tb5+fnr6+vg4ODv7+/9/f3U1NTc3Nz9/f39/f3o6OjS0tLv7+/l5eX9/f39/f3m5ub9/f3j4+PV1dXx8fGkpKScnJzo6Oj9/f3q6urW1tb4+Pj9/f3r6+vg4ODa2tr39/fU1NTo6Oj9/f34+PjU1NTm5ub9/f3+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v739/eHh4erq6ugoKCQkJC2traEhITt7e2xsbGzs7P8/PyoqKirq6vBwcHx8fGIiIifn5/r6+umpqa1tbWZmZm/v7/i4uKYmJjKysrr6+uamprf39/j4+Ojo6O9vb2UlJTS0tLr6+uZmZmTk5Pc3NzS0tKZmZm2tragoKD09PSFhYWurq6WlpaQkJC0tLSRkZHz8/Obm5u4uLjj4+P+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f309PSGhob29vbLy8uenp77+/uRkZHi4uLW1ta0tLTu7u6MjIz8/Pz8/Pz19fWHh4fz8/Pi4uKTk5P6+vrt7e2Tk5Pg4OCNjY28vLz19fXCwsKlpaWurq7KysrKysqIiIjIyMj7+/vDw8O6urr7+/ucnJyTk5O1tbWampru7u6IiIj39/e8vLydnZ36+vqbm5vu7u6goKCkpKTk5OT9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v79/f309PSOjo75+fnExMSpqan7+/uPj4/i4uLR0dGysrLw8PCEhITz8/P4+Pjx8fGVlZX5+fnj4+OIiIj4+PjU1NScnJz8/Pzt7e2YmJiwsLD19fV9fX2Hh4fx8fH7+/vm5uaIiIjX19fDw8OwsLD7+/ufn5+pqanz8/P39/fy8vKRkZH7+/u3t7epqan7+/uYmJjv7+/5+fnExMSIiIj4+Pj9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v719fWjo6P6+vrOzs65ubn8/PykpKTo6OjZ2dm/v7/8/Pyurq6cnJyurq7v7++rq6v39/f9/f2rq6uhoaGZmZng4ODu7u6zs7Ofn5/W1tb6+vqgoKCfn5/8/PzX19eurq6jo6Pu7u7f39+Ojo7Pz8/h4eGWlpavr6/ExMT19fWmpqb8/PzExMS6urr8/Pytra3w8PDFxcWoqKi5ubn9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v79/f37+/v+/v77+/v7+/v+/v76+vr9/f39/f37+/v8/Pz9/f3x8fH09PT9/f37+/v+/v79/f39/f3x8fH4+Pj9/f37+/vv7+/29vb8/Pz09PSYmJjX19f9/f339/fv7+/6+vr9/f39/f319fX19fX+/v76+vrv7+/29vb9/f37+/v9/f36+vr6+vr+/v77+/v+/v7y8vLx8fH9/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7t7e2hoaGwsLD9/f3+/v79/f3+/v79/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+/v7+/v7+/v7+/v7+/v7+/v4=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 163.05mm )" draw:z-index="7" svg:height="4.23mm" svg:width="8.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 178.32mm )" draw:z-index="20" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 183.37mm )" draw:z-index="8" svg:height="4.23mm" svg:width="8.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 199.84mm )" draw:z-index="21" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 204.89mm )" draw:z-index="9" svg:height="4.23mm" svg:width="8.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 220.16mm )" draw:z-index="22" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 225.21mm )" draw:z-index="10" svg:height="4.23mm" svg:width="6.33mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 240.48mm )" draw:z-index="23" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////8/v/p7/+MlstebKtve7e9xvH4/v/+/v/////////////////////////////////////////////////////////////////////////+/v7///////////////////////////////////////////////////3///3////////+/vz///3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1+P+Ah7FVX5pSYJ9UYJxYYpO4vuL7/v/+///////////////////////////////////////////////////////////////////////////////////////////+///+///8///8///8///8///+/v/+//////////////////////3///3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v///////////////////////////////////////////////v/+/v/X2/RVYJZRYKNncrBcaKRSYJ9XYpi4vuL7/v/+///////////////////////////////////////////////////////////+/v7////////////////////+///8/v/5/v/v9f/g5f/c4//n7P/z9//7/v/+/v/+/////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+/////////////////////////////v///v/////////////////////////////////////+///+/v/u8P/e4PXe5P9UYJpRYKOAi8mxvPpebK1UX51aZJe+xOj7/v/+///+/v/////////////////////////////////////////////////+/v7////////////+///8/v/09//Bxd6IjapnbY1kaopjaYtaY4RudJiYnr7Hy+T1+P/+///////////////////+/v7//////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////////+///+//////////////////////////////3///3////////////////////////////////+/v78///m6v9/h6xkbZjL1f+Nls1VX5pSYJ2Jl9S4w/thbKRUX51WYZe3veH7/v/+/////////////////////////////////////////////////////////v/+/v///v/8/v/T2ft6ga1ZYYh8gqS6vtfe4fTb3fKxttNkbJpXYZZWYJOLk7j5+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+//////////////////////////////////////3///3////////////////////////////+///8///w9f+2vuNVX5BUX5djcKfE0P+HkshUYJxRYJuGkcm2wflebKlTX5tXYZK4vuD7/v/+/////////////////////////////////////////////////////v///v/8/v/M0e5cZpdWYJWWncf1+v/7/v/8///+/v/5/v/J0PpZZJpVYZ13f674+/////////////////////////////////////////////////////////////////////////////////////////////////////////3///3////////////////////////+///+///////////////////////////////////////////+///+//////////////////////38///r8f96gqegqdSyvO9VYZtSYZxgbaTD0P+Cj8ZUYJpUX52Gks66xftbZpxUYJxVYZW9w+P7/v/+/////////////////////////////////v///v////////////38///n7P9lbZtVX5pncaTv8//8///+///+/////v/8/v/3/P97gqxWYJWbos78/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////+///+///////////////+///+/v/5/v+VncJWYJFWYJOeqd+ptu1VYZtSYZxkc6y/yv+AjcRUX51VYZ2Llsy5xPpebKlUYJpbZI3V2vf7/v/+/////////////////////////////v///v/////////////7//+kq9VVYJhUX52Vn9D7/v/////////////////+/v/5/v+SmLhZYI7FyvD8/v///////////////////////////////////////////////////////v///v/////////////////////////+///+///////////////////////////////////////////////////////////////////////////////////////////////////////////////8///q7v+Rmb6zvOdxe65UYJxUX52eqd+qtetUYJxSYJ1nca7By/+Lls5VYJhUX52Gks61wfVlcJ6dqNWkrNG2u9j7/v/+///////////////+///+///////////////////////1+P9sdqlSYKFUX5+krNv7/v/////////////////+///7/v+ZnrtfZIrs8f/8/////////////////////////////////////////v///v///////////////////////////v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/8///r8P98g69WYJNudqXG0P9wfLhUX51UX5eeqd+vu/VXY59UYJxmcKu+yP2Ik8lUYJxUYJqAirvS3f+cqNpWYJFZYYi+w+D6/f/+///////////+///+/////////////////////v/l6v5ZZJpRYKVSX6ODjcD7/v/+///////////////+///7/v+Uma96f5z5/v/+/v/+///8///8/v/8/v/8/v/+/////////////////////////v/+///8///8///+/v///v///////////v/+/v/8/v/7///8/v/8///////////////////+///8///8/v/8/v/7/f/+/v///////////////////////////////////////////////////v/+/v/t8v+DjLdVYJhUYJqAir3Byfi7xfhwe7FUX51VYJ6lsOaptOpXY59UYJxmcafN1/9+iLlWYJGWoc+otOhTYZ5UX51ncaK2vuPIzev7/v/+///////////////////////////////+///j6PxaZZ1PYKhRX6haZqDe5P78///+///////////+///7/f+rrr2vssP8/v/+/v/8/v/n7P+zu+CYn8mzudv1+P/9/v/+///+///+///+///+/v/x9P/W2/nU2/jg4vf8/v///v///v/9/f/7/v/AyeqQmcCXoMHm7P/+/v/////////+/v/7/v/b4P6uttudpcy1u93x9v/+/v/////////////////////////////////////////+///+/v/q7/+DjLdVYJhUYJyGks62wfdeaJl1fau5wfBteK5UYJpVYJaeqeGlsO5WZKFVYJiYotPo8f+xveemsONVYZtSYJ9lc7C8x/1+ibdZYYi0udb5/P/////////////////+/v7////////+///v9P9ibqJRX6ZPX6pSYJ+Hj7b2+//9/f/+/v/////////+/v/5/P/8///8/v/7/v/Bx+FncJtVYJZUYJpWYJG6v9X8///+///+///+///8///7/v+QlbVYY5FaYpB0eZb2+P/+/v/8///w8v+PlbdWYJNUYZhWYJGgqcr8/v/+///8/v/w8/+dor9ZYYhWYJNVYJZWYJOYoMX8/v/////////////////////////////////////+///8///q7/96grBUYJpUYJyLl8u5xPpebKlUYJpZYo3FzfHg6P9ud6JUYJpSX6N6h8tYZqVVX5qMlsn0/f+qteJUYJxUX51teK69yf1+isZUYJpWYY+PlbX8/v/+//////////3////////////////////7/v+KlcJSYJ9RX6ZRYKVUYJqiqdP8/f///v/////+/v///v/+///+///7/v+5wuFWYY5VYpdSYJ1SYaRVYJisssz8///9/v/////////8/v/Z3v5YYpNUX51VYJaeo8H6/f/8/v/q7/9+hqtXYZRXYqBUX59UYJqPmMH7/v/8///l6v93f6NmbIyaosd7h7tUYJxSYJ1pc6T1+P/////////////////////////////////+///8///v9f99hbNVYJhUX52Gks66xftbZpxSYJ1XY5+9yPbr8//l7f/V3v9qda1SYJ9SYJ1UYJxVYJi2wvSrtuRVYZNTX5tmca/E0P9/i79UYJxUYJyKlsrp8v/k6v/y9f/8///+///////////////////////8/v/Bye1VYJZRYKNQYalRYKVVYJiyttn8/f/+///////////+///8/v/T2OxZYYWyv+yptfFRYKFRX6ZVYpnM0uz8///+///////////7/v+hqtNTX5tRYKNWYpzV2vf7/v/2+/+Ch6VpcZjS3P9qdbdSX6NUYJyjq9n5/v/t8P9xd5l8hKjo7v/3/f+0wPRSYJ9RYKNlcaXz9v/////////////////////////////////8///v9f+DjLVUYZhUYJyGkce2wfdga6lUX51ZZJq0wPShrORibqhcaKKBjsO+yPl+ibZaZZNfapidqNalseNUYJxSYZxncqi9yP58iMRUYJxVYJiPmtC+yf9yfbNbZpxqdaO2vdr7/v/+///////////////////+/v/z+P96g6pSYJ9PYKhPYKhSYKFbZ5vK0PT7///+///////8///t8/9vdZWjqcH3/f+MmdBRYKFRYKNqdqjx9v/+///////////+///5/v90frFSYKFSYKFve6/2+//7/v+lq81iao/d4/3r8f9caKRSX6NVYJbAyPbv9/9+g6GFiaTz9v/8/v/5/v+Vn9JRX6BSYKF3gbT4+//////////////////////////////////8/v+VncRVYJhSYJ+KmNe3wvhga6FUX51YY6G1wfWXo9dUYJxSYJ9RYKNSYZx4g7Ds9P/c4v/k6v/O1/9WYpZSYKFndba9yP59ib1UYJxVYJ6Qm9O2wfdcaKJUX51SX6NUX51YYI7U2fb8///////////////////+///8/v/V2/VaZppRYKNPYKZPYKZSYKFjb6Hf5f38///+///8/v+iqMh4fqD2+//n7P9caaBRYKFUYJyfqNP7/v/////////+///+/v/V2/VYY5tRYKNUX52eptT5/v/e4fJhZ4fL0fP5/v/EyedUYJxRYKNbZ5vj6/+NlL54fp7z9v/+/v/+///z+P9rd6tSYKFUX52Wnsz7/v/////////////////////////////////7/v9eaJlSYJ9qeLentfRebK1SYJ1eZ568xvuVodtUYJxUYJxxfblvfr9SYZxWYY/c4v/7/v/7/f+iqdVVYJhWZKOquPl8islUYJxVYJiQm9G2wPtcaKRUX51daKiAi8tWYp5VYJalrdL8/v/////////////////////+///7/v+0vOFVYJZRYKNPYKhPYKZTYZ56g670+v/8/v/i5PFpb4nX3vv5/v+2vN5UYJxSYKFVYZXQ1vj8/v////3////+///7/v+aoMRUX51SYKFYZJjV3f/5/v+go7KhpLf5/v/5/v+cosZUX51QX6KDjsastOJvdZfo7f/8///+///8/v/FyudUYJpSX6NVYJbFzfH8/v/////////////////////////////////6/f9pcaBUX51YY6FUX51SYJ9aZaO2wPWdp9xUYJxSYJ12grzAzP9wfr1SYZxcZ5Xq8P/7/f/5/v+vtuJVYJhVYZ1aaKdSYJ9TX5uQm9G7xvxdaaVVYJ5ZZaGzv/uRnNxUYJxWYJO4vuL8/v/+/v7////////////+/v7////+/v/5/v+RmMJTX5tRX6ZPYKhPYKVUYZirtNv7/v/a3Oi3vM/4/v/1+v98g61SYJ9SYJ9xeqXz9//+/v/+/vz////8///u8/9oc6FSYKFSYJ9zfKf2/P/7/v/i5PD09//7/v/y9v9vdqRSYKFSYaaLls5rdJ3O1O77///+///+///7/f+KkrdSYJ1TYaJncqDv9P/8///////////////////////////////////8/v+6wOBWYY9VYJhVX5pcZpu1v/SYot1TX5tUYJp2gry/yv9yfrhSYJ9UYJymsd/I0fqkq9WzuuTN1f9td6pVX5pUYJpVYJaRndG1wPhdaaVUX51daaW3wviSndVSYJ9UYJp3f6Tv9P/+/v///////v///v///////////////v/+/v/w9P9yfK1TYaBRX6ZPYKhRYKNeapzp7v/+/v/+/v/7/v/V2/9XYZZSX6NUX52sstT8/v/+///////+///7/v+ut+BUYJxRYKVSYJ2hp8n7/v/8///+///+///7///Q1vpXYJdRXqJTYqVWYZegqM37/v/+///////9/f/i5/9eaJlSYKFSYJ2Tm7/7/v/8///+///////////////////////////////+///5/v/Ey+iQl8GVnczI0P+XodRUYJxUX513gby+yf9td7JVX5pVYJagrOClseNWYpRVYJZVYJZyfLG+yPucptmMlsezve63wfZcaKJUX51daaW2wfmQm9FVYJZVYZt5hLLk6v/8/v/+///////////////////////////////////8/v/V2/9daZ1RYKNPX6pOYKhSYZq/xOH+/v/+///7/v+fqNNUYJxSX6NZZJzf4/z+/v/////+///8///u9P9qdqhRYKNRX6ZWYpzU2vT8///+///////+///7/v+krdhUX51RYKVSYKFtdaTt8v/8///////////8/v+ep9BUYJpSYKFUYZjM0uz8///+///+///////////////////////////////+///8///8/v/7/v/0+f+Zo9RUYJpVX5pxfLTCzf9ueLNVYKBVYJigqM3i6v9YZJ5RYZ9VZJ9UYJxUX59uebHm7v/1/f/AyvtZZJxUYJxZZaG3wviPmtBUX51VX5p2fanp7//8/v/+///////////+/v/+/v////////3////////////+/v/5/v+YoMVSYJ1QYKtPX6pSYZymrMz7///+/v/x9v9pc6hSYKFSYJ+BjLr7/v/////////+///5/v+fp8xUYJxRX6ZRYKVwfLD2+//+///////////+///2+/9xe65RYKNRX6ZUYJq8wuL8/v/+/////////v/s8f9jb6NRYKFSYKF0fq/4+//+///////////////////////////////////////////+///+/////v/P0uNYYYxUYZZ3grjCzf9yfLdTX5tUX52Wn9b3/f/W3v9SYZxPYaODkdCTod5UX6FVX5pzfKXb4/94grNVYJZcaaCxvvWSndVVYJhUYJpzfa7l6f/8/v/+///////////+///W2ey3us3+//////3////////////+///8///g5v5daKBRX6hPX6pUX52cosT7/v/8/v/M0uxVX5pSX6NUYZi5wun8/v/////+///8/v/Q1fJdZZRWZKVRX6ZSYJ+YoM77/v/+///+/v/8///8/v/O1O5VYplRYKVSYKFxe6zy9//+///////+///8/v+/xOJUYJpRYKVVYZ2wueT7/v/+///+///+///////////////////////////////////////////////5/P+0utR8hay8yPptebNUX51UX52gq+Glr+CGj7rh7P9qd65SYJ1baaawvPigq+NVYJZUYJpsea65xPJ8h7SyvO2TntRUX51TX5l1fqnk6f/8/v/+///////////////8/v+QmLxxeZ38/v/////////////////+/v7+///5/v+DjcBSX6NSYKlUYJykqsr7/v/4/f+cosZVYJ5SYKFibZvo7//8///+///8///u8/92fKCQms9baKxRYKNVYJbJ0fX7/v/5/P+gpbnh5f75/v+ZocVUX51RYKNWYZfFzfH8/v/////////+/v/5/v+EjLNUX59SYKFcZpfj6f/5/v/T1uW2ucj8/v/+///////////////////////////////////////////+///7///l6/9xeqVVYJZUYJyeqOO8xvdWYY9VYZOLmMzBzv9hbadVYZ1YZJ6wu/GYo9lSYJ1SYZxzf7PX4v+fqthWYJFVYJhyfK3l6v/8/v/+///////////////////7/v92fqx4gK77/v/////////////////////////7/v+eptVSYKFRYKVUXpm/xOH7/v/w9f9rdJ9SYJ9SYJ2Qmr75/v/7/v/+/v/7/v+TmbOQmL+stutSX6NTYaJqdaLw9//5/v/P0uVmaoPr8P/1+/9xeadSYJ9SYJ92f6r5/f/+/v/////////8/v/g5f9aZJdRX6BUX5+MlLv4/f/1+v96gJiorr78/v/+///////////////////////////////////////////////+///7/v+rsdFaY46XodKuuOu1veuEjr9UYJpSYZyMl8+7xvxhbadUYJxYZKCwuvWXothUYZhUYJx0gLq3wfRud6Jyep7l6//8/v/+//////////3////////+///w9f9eaJt5g7T7/v/+/v7+/v7////////////////7/v+XotBSYJ9QX6Beapzo7f/7/v/P1/tVYZVSYKFWYpzQ1fL8/v/+/v/8/v+tstBxeZ7r8/+Di7lSYKFSYJ2aosb3/f/x9/91epiytMn5/v/O1v1WYpZRYKNUYJy3vd38/v/+///////////8/v+zuuRUYJpRYKVUYJzFy+v5/v+xuttxd5f09//+///////////////////////////////////////////////////////+///7/v/P1vOkrNNWYY5jbZ63wviDj8tUYJxVX5qLls67xv5hbadUX51XY5+vuvCbptxUX51UYJp0fKrDyevl6v78/v/+//////////3///3////+/v/+///X2/RVYJZueq74+//////////////////+///+///1+v9xe65SYJ1UYZartNv7///7/v+rtN1UYJpSX6Nrdq72+v/8/v/7/v+wtM1obY3b4f/t9f9fapdSYKFSYJ3AyO34/f+WnsJ5f5/4+//7/f+bo9FUYJxSYKFodKjx9v/+///////////////7/v+CjL1SYKFRYKVkcKrz+f/Z3/lhaY3K0PD8/v/////////////////////////////////////////////////////////////+///7/v+zutdWYY5UYJpebKm7xvyAjMBUX51UX52Ml82/yv9gbKZUYJxXY5+0wPqbptxYYI5zeZvm6//7/f/+///////////////////////+///8/v+8wd5UYJpaZ57m6v/+///////////+//38///7///CyeZVYJhUYJqAiK32+//+/v/7/v+Ml8RSYJ1SX6OEj8f4/f/5/f+ortJhZ4nR0+r5/v/T2/9WYpZRYKFVY6TV3/+0vOFfZYXb4fn8/v/2+/9yfLFSYJ9UX52Xn837/v/////////////+///s8f9eaZ9RYKVRYKWKmdTh7P9pcZaXnb35/f/8/v/+//////////////////////////////////////////////////////////////3+///5/v+uttpVYJZUYJxmcae4w/l/i8dUYJxVYJiPmtC+yf9gbKZUYJxYY5uqs96sstLh5vr8/v/+///////////////////////////+///8//+nrcdWYZdVYJimrM75/v/8/v/8///8///5///o7v9vd5xWYJN2fqzm6//8///+///4+/94g7BSYJ1SYKFlcaurs9iFjKllbZHS1/X8/v/8/v/EzPFVYJZTYaJVY6JyfK9cZInBx+H7/v/8/v/Y3fNYZJhUX51XYZTN0/X8/v////////3////+///a3/VWY5pPYKZRYKNjb6libZuMkrba3/y3us3Mztr+/////////////////////////////v///v/////////+///+///////////////////9/f/7/v+wttpXYZRSYZxicK27xvyFkMZUX51UYJyJlMq+yP1eaaFWYJF5f5/4+//8///+///////////+/v7////////////////////+///X3O9tdJ5WYJNWYJGZos3h5//v9v/q8P+8xOhpcptYYYqSmLrr8P/8///+///+///7//+FjrdUYJpSYKFSYZxWYY56g6Lf5Pj8/v/+///8/v/Bx+tVYZVSYJ9UYJxeZ5K/xOH8/v/8///8/v+iqMBWYJFVYZVscZfz+P/+//////3////////+///X3PJVYJZRYKVSYKFVYZWIjrDx9v/W2++vssPBw9D+/v///////////////////////////v///v/////////+///+///////////////////////9/f/7/f+2vuJUYZZSYZxhbKK3wvqEktFTYaBVYJawuOnJ0f+Dia3j6Pz7/v/+///////////////////////////////////////+///8/v/p7/+4wOWJkr1hapNobpBxd5dscpRmbpKQmL3P1fX7/v/+/v/////////+///8///Q1/Rud6JibJ2Cjbu8xOj0+v/8///+///////8///h5f9sdJlcZ5WLlL/c4f/7/v/+///+///8///O0+aqs9Snr9PJzuT8/v/+///+/vz////////+///z9v+HjrhdaZtveaqwuN33+f/8/v/s8PzW2ubh5O3+/////////////////////////////////////////////////////////////v///v/////////+/v/5/v+tt9pVYZNUYJxgbq+jsfJaaKdUYJqKksH5/f/5+//+/v/+///////+/v7////////////////////////////////////+///8///8/v/7/v/x9P/e4fLR1OXa3ezw8//7///8/v/+//////////////3////+///8///09//w8//7/v/8/v/8///+///////////+///+/v/v8//n6vv7/v/8///+///////////+///+///8/v/8/v/+/v/+///////////////////////+///5+//q7f/1+P/8/v/+/v/+///+///+/////v///////////////////////////////////////////////////////////////v///v/////////////8///5/v+vt9tWYZdUX51SYJ1UYJpUYJSdpcr8/v/+/v7//////////////////////////////////////////////////////////////////v/+///9/f/8///+///+///+///+//////////3+/v7////////////////////////////////////////////////////////////+///+///////////////+///+///+/////////////////////////////////////////////v///v///////////////////////////v///v/////////////////////////////////////////////////////////////////////////////+///+/v/7/v+1u91fZ5VVYJZVYZN0fKHl6v/+/v/////////////////////////////////////////////////////////////+///+///+///+/v/+/v/+/////v/+/v/Z2+i9v8v////////+///+///+///+///+///+///+///+///+///+/////v///v/+///+/////v///v/+///+///+///+///+///8///Z3vHR1Of+/v/////+///+///////+/v/+///+///+///+///+///+///////////+///+///////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///7/v/Y3fqqste1veHu8//8/v///v/////////////////////////////////////////////////////////+///7+//p7PXe4u7T1+P2+P/S1ODk5vL8/v/R1urX3O/+/v/+///X2uPU1uL4+v/p7PXe4ert8Pn8/v/S1ODa3Oj8/v/8/v/m6PTS0tzt8Pnl5fH8/v/8///k5/D8/v/h4+/T1t/u8f+eo8CWm7jm6PX+/v/o6vnU1uP2+f/8///p6/jd4e3X2un1+f/S1OHm6PT+/v/4+P/S1ODk5/D//v/////+/v7////////////////////////////////////////////////////////////////////////////////////////////+///8///8/v/8/v/+/v///v/////////////////////////////////////////////////////////////+///1+P+Ch52mq8Gbn7iKkKiwttB+hJ7o7v+rsM2ts835/v+lqLmoq7q+wdLt8v+DiJycn7Dm6/6hpryvtc+TmbO5v9nc4vyTmK7Hytvo6/yVmrDZ3/nd4/udo7u3vNqOlK7P0uPm6/6SmLqMkrTX3PLN0uaTmLavttOaoLbw9v9/hKGnrc2PlbeJj6+us9CLkanv9P+Wm6+zuMzg4/T+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////////////////////////////////////////////////////+/v/x9v+AhaLy+P/Fy+WYnbr4/f+KkLDb4f/P1fWttNHq7/+GjKT5/v/5/v/y9v+ChqHx9P/d4vWNkq/3/f/m7/+MkrLZ4P2Hjae3u9Ty9v+8wd+epMSnrsvDyufDyeuCh6XDyN74/v+8wuazud34/v+WnLaKkrastNiUmrTp7/+Bh6fy+v+zuuSUnMP3/f+Vmrfp7/+aoLieo8Df5Pr+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+/v/w9f+Ijqj2+/+/xNekqb35/f+Jjqzc4f/L0O2ssc7r8f9+hJzv9P/1+v/u8v+SlKv4+v/h4/KCh6T0+v/N0/WVnLj5/v/p7v+Sl7Spr8/y9/93fJmBhqPs8v/5/f/h5f6CiKLQ1/S8wuSpr8/4/v+Zn7eiqMjv9P/1+P/w8/+MkKn4/f+wttiiqMr4/f+TmK7s7//2+/+9xOGCiKL4+P///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v/////////////////+///z9v+go7b4/P/Mztq3ucb7/v+ho7jj6P7U2e26v9L5/v+prsGZnK+rrsHs7/+pq7r39//+/v+oqr+bobuUmLHb4PTr7/uws8KZn7fQ1fP3/P+an7yan7X5/v/U1+arrr+eo7fq7v/a3vmJjqTMz+Le4fSRlqyqr8PCxND19f+kprX7/f+/w9y1utD7/v+qrbzu8PzDxdSjp8C0uc/+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////////+///+///+///9/v/7/P/+///7/P/7/P/+///7+//+/v/+/v/7/P/9/f/+/v/v8vn09Pz+/v/8+////////v/+/v/v8vv4+P/+/v/7/P/v8PX19//7/v/x9v+SmLLU1+b8///39//v7/f7+//+/v/+/v/19f/19vv+///7+//v7/f29/v+/f/7/P/+/v/7+//7+//+///7/P/+///y8/jx8fv+/v///v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v///v/////////+///+///+///+///////////////////+/v7////////////////////////////+///+/////v///v/////////////////////////////////+///r7fmbobuqsMr8/v/+/////v///////v///v///v///v/+/v7////////////////////////////////////////////////////////////////+/v7///////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+</office:text>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/makefile.mk b/sdext/source/pdfimport/test/testdocs/makefile.mk
new file mode 100644
index 000000000..273ebb670
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/makefile.mk
@@ -0,0 +1,72 @@
+#
+# 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 .
+#
+
+PRJ=..$/..$/..$/..
+PRJNAME=sdext
+TARGET=testdocs
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE: settings.mk
+.INCLUDE : target.mk
+
+TESTFILES=\
+ graphicformats.pdf \
+ pictxt.pdf \
+ txtpic.pdf \
+ txtpictxt.pdf \
+ verticaltext.pdf
+
+# --- Fake uno bootstrap ------------------------
+.IF "$(ENABLE_PDFIMPORT)" == "TRUE"
+
+$(BIN)$/pdfi_unittest_test.ini : makefile.mk
+ rm -f $@
+ @echo UNO_SERVICES= > $@
+ @echo UNO_TYPES=$(UNOUCRRDB:s/\/\\/) >> $@
+
+# --- Enable test execution in normal build, diff all test docs ---
+
+ALLTAR : $(BIN)$/pdfi_unittest_test.ini \
+ $(foreach,i,$(TESTFILES:s/.pdf/_pdfi_unittest_writer_succeeded/:f) $(MISC)$/$i) \
+ $(foreach,i,$(TESTFILES:s/.pdf/_pdfi_unittest_impress_succeeded/:f) $(MISC)$/$i) \
+ $(foreach,i,$(TESTFILES:s/.pdf/_pdfi_unittest_draw_succeeded/:f) $(MISC)$/$i)
+
+$(MISC)$/%_pdfi_unittest_writer_succeeded : $$(@:s/_succeeded/.xml/:f)
+ rm -f $(MISC)$/$(@:s/_succeeded/.xml/:f)
+ $(BIN)$/pdf2xml -writer $(@:s/_pdfi_unittest_writer_succeeded/.pdf/:f) $(MISC)$/$(@:s/_succeeded/.xml/:f) $(BIN)$/pdfi_unittest_test.ini
+ diff $(MISC)$/$(@:s/_succeeded/.xml/:f) $(@:s/_succeeded/.xml/:f)
+ $(TOUCH) $@
+$(MISC)$/%_pdfi_unittest_impress_succeeded : $$(@:s/_succeeded/.xml/:f)
+ rm -f $(MISC)$/$(@:s/_succeeded/.xml/:f)
+ $(BIN)$/pdf2xml -impress $(@:s/_pdfi_unittest_impress_succeeded/.pdf/:f) $(MISC)$/$(@:s/_succeeded/.xml/:f) $(BIN)$/pdfi_unittest_test.ini
+ diff $(MISC)$/$(@:s/_succeeded/.xml/:f) $(@:s/_succeeded/.xml/:f)
+ $(TOUCH) $@
+$(MISC)$/%_pdfi_unittest_draw_succeeded : $$(@:s/_succeeded/.xml/:f)
+ rm -f $(MISC)$/$(@:s/_succeeded/.xml/:f)
+ $(BIN)$/pdf2xml -draw $(@:s/_pdfi_unittest_draw_succeeded/.pdf/:f) $(MISC)$/$(@:s/_succeeded/.xml/:f) $(BIN)$/pdfi_unittest_test.ini
+ diff $(MISC)$/$(@:s/_succeeded/.xml/:f) $(@:s/_succeeded/.xml/:f)
+ $(TOUCH) $@
+
+# hackaround for dmake's insufficiency to have more than one
+# prerequisite on template rules
+$(foreach,i,$(TESTFILES:s/.pdf/_pdfi_unittest_writer_succeeded/:f) $(MISC)$/$i) : $(BIN)$/pdfi_unittest_test.ini $(BIN)$/pdf2xml$(EXECPOST)
+$(foreach,i,$(TESTFILES:s/.pdf/_pdfi_unittest_impress_succeeded/:f) $(MISC)$/$i) : $(BIN)$/pdfi_unittest_test.ini $(BIN)$/pdf2xml$(EXECPOST)
+$(foreach,i,$(TESTFILES:s/.pdf/_pdfi_unittest_draw_succeeded/:f) $(MISC)$/$i) : $(BIN)$/pdfi_unittest_test.ini $(BIN)$/pdf2xml$(EXECPOST)
+
+.ENDIF
diff --git a/sdext/source/pdfimport/test/testdocs/pictxt.pdf b/sdext/source/pdfimport/test/testdocs/pictxt.pdf
new file mode 100644
index 000000000..b47b95ec1
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/pictxt.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/testdocs/pictxt_pdfi_unittest_draw.xml b/sdext/source/pdfimport/test/testdocs/pictxt_pdfi_unittest_draw.xml
new file mode 100644
index 000000000..0a35f8439
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/pictxt_pdfi_unittest_draw.xml
@@ -0,0 +1,3396 @@
+<?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 .
+ -->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="20mm" fo:margin-right="10mm" fo:margin-top="31mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:auto-grow-height="true" draw:auto-grow-width="true" draw:fill="none" draw:stroke="none" draw:textarea-horizontal-align="left" draw:textarea-vertical-align="top" fo:padding-bottom="0cm" fo:padding-left="0cm" fo:padding-right="0cm" fo:padding-top="0cm" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Thorndale" fo:font-size="12pt" style:font-size-asian="12pt" style:font-size-complex="12pt" >
+
+</style:text-properties>
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:drawing >
+<draw:page draw:master-page-name="master-page3" >
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 92.56mm 31.82mm )" draw:z-index="32" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////////w8fiMlsdda7Bve7nBxuH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx8h79QX6pQX6pQX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Z3O1QX6pQX6plcrRYZ65QX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////19vrk5/Lg4/Ds7fb5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fjd4O/j5fFQX6pQX6qBjMK4vt1da7BQX6pVY6y/xeD////////////////////////////////////////////////////////////////////////////////////3+PvAxeCBjMJda7BaaK9YZ65RYKplcrSUncvHzOT5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6vR7hr9da7DT1+qOl8hQX6pQX6qOmMi+w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////////////X2ut1gbxQX6p1gby4vt3e4e/b3u6vtthda7BQX6pQX6qIksX8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vq4vt1QX6pQX6pgbrLM0eaIksVQX6pQX6qGkcS9w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////M0eZWZa1QX6qUncv8/P7////////////////O0udVY6xQX6p0gLv8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8vh2gr2gqNG2vNtRYKpQX6pda7DM0eaDjsNQX6pQX6qIksXBxuFWZa1QX6pRYKq+w9/////////////////////////////////////////////////////////////s7fZebLFQX6pjcbP19vr///////////////////////92gr1QX6qbpM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+UnctQX6pQX6qiqtKvtthRYKpQX6pkcbTHzOSBjMJQX6pQX6qMlsfAxeBda7BQX6pTYqzY2+z///////////////////////////////////////////////////////+krNNQX6pQX6qXoM3///////////////////////////+OmMhQX6rHzOT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7/ePmcm2vNxve7lQX6pQX6qiqtKvtthQX6pQX6plcrTJzeWMlsdQX6pQX6qIksW7wd5gbrKgqNGkrNO0u9v////////////////////////////////////////////////5+fxodbZQX6pQX6qmrdT///////////////////////////+VnstVY6zy8/n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fh4g71QX6ppdrbO0udve7lQX6pQX6qiqtK2vNtTYqtQX6pkcbTFyuOJk8ZQX6pQX6p/isHb3u2gqNFQX6pQX6q+w9/////////////////////////////////////////////o6vRVY6xQX6pQX6qDjcP///////////////////////////+Ol8hyfrv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z9PmAi8FQX6pQX6p/isHGy+PBxuFve7lQX6pQX6qpsdWutdhTYqtQX6pjcbPV2et9iMBQX6qYoc2ttNdRYKpQX6pjcbO4vt3JzuX////////////////////////////////////////m6PNVZK1QX6pQX6pWZa3h5PH///////////////////////+mrdSqsdb////////////s7fa0u9uXoM2zudr5+fz////////////////////////09frZ3O3X2+zg4/D////////////////////EyeKOmMiWn8zq7PX////////////////////e4e+vttidpc+0u9v39/v////////////////////////////////////////////////////v8PeBjMJQX6pQX6qIksW9w99YZ65xfbq9w99rd7dQX6pQX6qiqtKrstZVY6xQX6qao87y8/m2vNypsdVRYKpQX6plcrTEyeJ9iMBQX6qzudr8/P7////////////////////////////////09fpebLFQX6pQX6pQX6qDjsP8/P7////////////////////8/P7////////////Cx+FgbrJQX6pQX6pQX6q4vt3///////////////////////+KlMZSYatSYatrd7f5+fz////////z9PmKlMZQX6pQX6pQX6qgqNH////////////z9PmZos1QX6pQX6pQX6pQX6qXoM3////////////////////////////////////////////////v8Pd4g71QX6pQX6qMlsfAxeBda7BQX6pRYKrJzeXo6vRodbZQX6pQX6p9iMBWZa1QX6qMlsf///+utdhQX6pQX6prd7fFyuN/isFQX6pQX6qKlMb///////////////////////////////////////+KlMZQX6pQX6pQX6pQX6qiqtL///////////////////////////////+6wN1QX6pRYKpQX6pQX6pQX6qpsdX////////////////////c3+5SYatQX6pQX6qZos3////////v8Pd5hb5RYKpTYqtQX6pQX6qOl8j////////o6vRyfrtda7CZos56hb5QX6pQX6plcrT5+fz////////////////////////////////////////19vp5hb5QX6pQX6qIksXBxuFWZa1QX6pTYqzEyeL09frt7/bd4O9mc7VQX6pQX6pQX6pQX6q9w9+vtthQX6pQX6pkcbTM0eZ/isFQX6pQX6qMlsfz9Pno6vT19vr////////////////////////////////FyuNQX6pQX6pQX6pQX6pQX6qxt9n////////////////////////U1+pQX6q4vt2vtthQX6pQX6pQX6rO0uf///////////////////+iqtJQX6pQX6pSYavY2+z////8/P57hr9ib7Pb3u5pdrZQX6pQX6qkrNP////w8fhpdrZ4g73s7fb///+6wN1QX6pQX6pib7P39/v////////////////////////////////////19vqAi8FQX6pQX6qGkcS9w99da7BQX6pVY6y6wN2mrdRgbbJYZ66DjcPFyuN9iMBVY6xaaK+gqNGqsdZQX6pQX6pkcbTFyuN9iMBQX6pQX6qRmsnFyuNxfbpWZa1ndLW2vNv////////////////////////////5+fx2gr1QX6pQX6pQX6pQX6pWZa3M0eb////////////////z9Plmc7WgqNH///+PmclQX6pQX6pndLX39/v///////////////////9yfrtQX6pQX6pve7n8/P7///+krNNaaK/g4/Dy8/lYZ65QX6pQX6rFyuP5+fx2gr1+icD39/v///////+XoM1QX6pQX6p1gbz8/P7///////////////////////////////////+TnMtQX6pQX6qPmcm+w99da7BQX6pVY6y7wd6ao85QX6pQX6pQX6pQX6p2gr319vrg4/Dq7PXT1+pRYKpQX6pndLXFyuN9iMBQX6pQX6qSm8q7wd5YZ65QX6pQX6pQX6pRYKrX2uv////////////////////////////Y2+xVY6xQX6pQX6pQX6pQX6pgbbLj5fH///////////+gqNFxfbr8/P7s7fZYZ65QX6pQX6qgqNH////////////////////X2+xTYqtQX6pQX6qep9D////d4O9WZa3O0uf////FyuNQX6pQX6pWZa3s7faKlMZxfbr39/v////////5+fxodbZQX6pQX6qWn8z///////////////////////////////////////9YZ65QX6prd7ext9lda7BQX6pYZ67DyOKZos5QX6pQX6pwfLlyfrtQX6pQX6rg4/D///////+iqtJQX6pVY6yzudp/isFQX6pQX6qSm8q9w99YZ65QX6paaK+BjMJRYKpQX6qmrdT///////////////////////////////+2vNtQX6pQX6pQX6pQX6pQX6p2gr36+/3////h5PFebLHb3u3///+2vNxQX6pQX6pQX6rU1+r///////////////////+XoM1QX6pQX6pTYqvb3u3///+Zos6ao87///////+Zos5QX6pQX6qDjsOttNdmc7Xs7fb////////////FyuNQX6pQX6pQX6rJzeX///////////////////////////////////////9jcbNQX6pVY6xRYKpQX6pWZa26wN2gqNFQX6pQX6p2gr3JzeVyfrtQX6pWZa3x8vj///////+xt9lQX6pRYKpYZ65QX6pQX6qSm8rDyOJaaK9QX6pVZK26wN2VnstQX6pQX6q4vt3///////////////////////////////////+PmclQX6pQX6pQX6pQX6pQX6qttNf////Z3O20u9v////8/P54g71QX6pQX6preLf5+fz////////////////09fpkcbRQX6pQX6pve7n8/P7////h5PH39/v////3+PtodbZQX6pRYKqMlsdlcrTQ1Oj///////////////+GkcRQX6pQX6pjcbP19vr///////////////////////////////////////+6wN1QX6pQX6pQX6pWZa26wN2bpM9QX6pQX6p2gr3HzORyfrtQX6pQX6qpsdXO0uekrNO0u9vU1+prd7dQX6pQX6pQX6qTnMu7wd5aaK9QX6paaK++w9+VnstQX6pQX6pyfrv09fr////////////////////////////////////19vpwfLlQX6pQX6pQX6pQX6paaK/s7fb////////////Z3O1RYKpQX6pQX6qrstb///////////////////+xt9lQX6pQX6pQX6qep9D////////////////////U1+pRYKpQX6pSYatRYKqgqNH////////////////m6PNYZ65QX6pQX6qRmsn////////////////////////////////////////////////Gy+OOmMiTnMvO0ueZos5QX6pQX6p1gbzGy+NreLdQX6pQX6qkrNOpsdVRYKpQX6pQX6pwfLnFyuOgqNGMlse4vt29w99YZ65QX6paaK+9w9+Sm8pQX6pQX6p4g73o6vT////////////////////////////////////////////Z3O1YZ65QX6pQX6pQX6pQX6q/xeD///////////+gqNFQX6pQX6pVY6zh5PH////////////////09fpndLVQX6pQX6pSYavX2uv///////////////////+mrdRQX6pQX6pQX6pndLXz9Pn///////////////+ep9BQX6pQX6pQX6rO0uf////////////////////////////////////////////////////////6+/2bpM9QX6pQX6pwfLnLz+ZsebhQX6pQX6qgqNHq7PVVY6xQX6pSYatQX6pQX6psebju7/f////HzORVY6xQX6pVZK2+w9+Rm8pQX6pQX6pxfbrv8Pf///////////////////////////////////////////////////+XoM1QX6pQX6pQX6pQX6qkrNP////////39/tlcrRQX6pQX6qAi8H///////////////////+ep9BQX6pQX6pQX6pve7n8/P7////////////////6+/1ve7lQX6pQX6pQX6q9w9/////////////////x8vhebLFQX6pQX6pyfrv8/P7////////////////////////////////////////////////////////O0udQX6pQX6p2gr3Lz+ZxfbpQX6pQX6qYoc3////c3+5QX6pQX6qGkcSZos1QX6pQX6pwfLnh5PF2gr1QX6pYZ664vt2VnstQX6pQX6pwfLno6vT////////////////////V2euzudr////////////////////////////k5/JYZ65QX6pQX6pQX6qZos7////////O0udQX6pQX6pQX6q9w9/////////////////S1ulVZK1VY6xQX6pQX6qYoc3////////////////////Q1OhRYKpQX6pQX6pve7n3+Pv////////////////AxeBQX6pQX6pQX6qzudr////////////////////////////////////////////////////////////8/P6zudp4g73EyeJsebhQX6pQX6qkrNOpsdWDjsPs7fZodbZQX6paaK+2vNykrNNQX6pQX6preLe/xeB7hr+4vt2Wn8xQX6pQX6pxfbro6vT///////////////////////+Nl8hrd7f///////////////////////////////+DjcNQX6pQX6pQX6qiqtL///////+Zos1QX6pQX6pda7Dv8Pf////////////z9Plve7mRm8paaK9QX6pQX6rO0uf////8/P6ao87k5/L///+Yoc1QX6pQX6pRYKrJzeX///////////////////+Ai8FQX6pQX6pWZa3o6vT////S1umzudr////////////////////////////////////////////////////////o6vRsebhQX6pQX6qiqtLDyOJQX6pQX6qOmMjLz+ZebLFQX6pVY6y2vNyao85QX6pQX6pyfrvg4/CiqtJQX6pQX6pwfLnq7PX///////////////////////////9yfrt0gLv///////////////////////////////+ep9BQX6pQX6pQX6q/xeD////39/tlcrRQX6pQX6qPmcn///////////////+OmMiOl8ixt9lQX6pQX6pmc7X3+Pv////O0udaaK/x8vj8/P5sebhQX6pQX6pyfrv////////////////////k5/JVY6xQX6pQX6qJk8b////8/P5yfrukrNP///////////////////////////////////////////////////////////+qsdZSYauZos2zudq4vt2DjsNQX6pQX6qNl8jDyOJebLFQX6pVY6y2vNuao85QX6pQX6p0gLu9w99pdrZsebjq7PX////////////////////////////19vpYZ654g73///////////////////////////////+Zos1QX6pQX6paaK/s7fb////T1+pQX6pQX6pRYKrS1un///////////+rstZrd7f09fqAi8FQX6pQX6qZos3////3+PtsebittNf////U1+pRYKpQX6pQX6q4vt3///////////////////+0u9tQX6pQX6pQX6rHzOT///+zudppdrb3+Pv////////////////////////////////////////////////////////////////S1umkrNNQX6pebLG+w9+Fj8RQX6pQX6qMlsfDyOJebLFQX6pVY6y0u9uep9BQX6pQX6pwfLnFyuPo6vT////////////////////////////////Z3O1QX6psebj8/P7////////////////////////6+/1wfLlQX6pQX6qttNf///////+ttNdQX6pQX6ppdrb6+/3///////+ttNdda7Dg4/D39/taaK9QX6pQX6rEyeL///+Vnstyfrv8/P7///+bpM9QX6pQX6plcrT39/v///////////////////+BjMJQX6pQX6pib7P6+/3c3+5YZ67M0eb///////////////////////////////////////////////////////////////////////+zudpQX6pQX6pda7DDyOKAi8FQX6pQX6qNl8jHzORda7BQX6pTYqy7wd6ep9BQX6preLfq7PX///////////////////////////////////+7wd5QX6pWZa3q7PX////////////////////////EyeJQX6pQX6p8h7/8/P7///////+MlsdQX6pQX6qFj8T///////+nr9RWZa3Q1Oj////Z3O1SYatQX6pTYqve4e+2vNxTYqvf4vD////8/P5wfLlQX6pQX6qXoM3////////////////////x8vhaaK9QX6pQX6qPmcns7fZib7OTnMv///////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pjcbO/xeCAi8FQX6pQX6qRm8rGy+Nda7BQX6pTYqyss9erstbk5/L///////////////////////////////////////+mrdRQX6pQX6qkrNP////////////////////s7fZpdrZQX6pyfrvq7PX////////8/P52gr1QX6pQX6pjcbOss9d/isFebLHT1+r////////HzORQX6pQX6pTYqtwfLlTYqzCx+H////////a3e1TYqxQX6pRYKrQ1Oj////////////////////b3u1SYatQX6pQX6pgbrJda7CGkcTd4O+zudrJzeX///////////////////////////////////////////////////////////////////////////+vtthRYKpQX6pib7PDyOKFj8RQX6pQX6qKlMbFyuNaaK9QX6pyfrv8/P7////////////////////////////////////////////Z3O1ndLVQX6pQX6qZos7m6PP39/vx8vi/xeBjcbNQX6qOl8jv8Pf///////////////+DjcNQX6pQX6pQX6pQX6p1gbzh5PH////////////DyOJQX6pQX6pQX6pWZa2/xeD///////////+ep9BQX6pQX6pjcbP5+fz////////////////////Z3O1QX6pQX6pQX6pQX6qDjcP39/vX2+ypsdW9w9////////////////////////////////////////////////////////////////////////////////+4vt1QX6pQX6pda7C+w9+IksVRYKpQX6qzudrP0+h9iMDm6PP////////////////////////////////////////////////////v8Pe6wN2GkcRaaK9ebLFpdrZjcbNebLGOmMjS1un////////////////////////U1+ppdrZda7CBjMK/xeD6+/3////////////////k5/JlcrRWZa2Jk8be4e/////////////////P0+ipsdWnr9TJzeX////////////////////////39/uDjsNYZ65sebixuNn6+/3////u7/fW2evg4/D///////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pgbbKpsdVYZ65QX6qIksX////8/P7////////////////////////////////////////////////////////////////////09frd4O/Q1Oja3e3z9Pn////////////////////////////////////3+Pvz9Pn////////////////////////////////x8vjo6vT////////////////////////////////////////////////////////////////////8/P7s7fb5+fz///////////////////////////////////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pQX6pQX6pQX6qdpc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+0u9tYZ65QX6pQX6pve7no6vT////////////////////////////////////////////////////////////////////////////////////////////////X2+y4vt3////////////////////////////////////////////////////////////////////////////////////////////////b3u7Q1Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b3u6rsta4vt3y8/n////////////////////////////////////////////////////////////////////8/P7q7PXe4e/S1un5+fzQ1Ojk5/L////S1unZ3O3////////V2evS1un6+/3q7PXd4O/v8Pf////Q1OjZ3O3////////m6PPO0ufv8Pfj5fH////////j5fH////g4/DS1unx8viao86Rmsnm6PP////o6vTS1un5+fz////q7PXd4O/X2uv5+fzQ1Ojm6PP////5+fzQ1Ojk5/L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx5hb6iqtKVnsyDjsOutdh4g73t7/apsdWrstb///+ep9CiqtK6wN3y8/l7hr+Vnsvq7PWdpc+ttNeOmMi4vt3f4u+MlsfFyuPq7PWOmMjc3+7g4/CZos62vNyIksXO0ufq7PWPmcmGkcTZ3O3O0ueNl8iutdiUncv39/t4g72mrdSKlMaDjsOttNeFj8T09fqRm8qxt9nf4u/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/t6hb75+fzGy+OTnMv///+Fj8Tf4u/S1umss9fv8Pd/isH////////3+Pt6hb709frf4u+GkcT////u7/eGkcTd4O+Ai8G0u9v5+fy7wd6bpM+mrdTFyuPFyuN7hr/DyOL///+9w9+zudr///+Rm8qGkcSttNePmcnu7/d7hr/8/P60u9uSm8r///+Pmcnv8PeVnsyao87j5fH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vqBjML8/P6+w9+gqNH///+DjcPf4vDM0eaqsdbx8vh1gbz09fr6+/3z9PmJk8b6+/3g4/B7hr/8/P3Q1OiRmsn////t7/aMlsenr9T5+fxve7l5hb7y8/n////k5/J7hr/U1+q9w9+or9X///+VnsugqNH19vr5+fzz9PmFj8T///+vttigqNH///+Nl8jv8Pf8/P6+w997hr/5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/uZos78/P3Lz+axuNn///+ao87m6PPW2eu4vt3///+mrdSRmsmmrdTu7/eiqtL3+Pv///+iqtKXoM2Ol8jd4O/t7/aqsdaVnsvS1un///+VnsyVnsv////T1+qmrdSZos3v8Pfc3+6BjMLLz+bf4u+KlMamrdS+w9/19vqdpc////++w9+zudr///+krNPw8fi/xeCep9CxuNn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P3////8/P78/P7////8/P3////////8/P7////////x8vjz9Pn////8/P7////////////x8vj5+fz////8/P3u7/f3+Pv////39/uNl8jT1+r////3+Pvu7/f8/P7////////19vr19vr////8/P3v8Pf39/v////8/P3////8/P78/P7////8/P7////z9Pnx8vj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7faXoM2nr9T///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 31.99mm )" draw:z-index="0" svg:height="4.23mm" svg:width="163.08mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+H
+e
+
+h
+e
+a
+r
+d
+
+q
+u
+i
+e
+t
+
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+.
+
+T
+h
+a
+t
+
+d
+i
+d
+n
+'
+t
+
+b
+o
+d
+e
+
+w
+e
+l
+l
+.
+
+W
+h
+o
+
+c
+o
+u
+l
+d
+
+b
+e
+
+f
+o
+l
+l
+o
+w
+i
+n
+g
+
+h
+i
+m
+
+t
+h
+i
+s
+
+l
+a
+t
+e
+
+a
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 36.86mm )" draw:z-index="1" svg:height="4.23mm" svg:width="165.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+i
+g
+h
+t
+
+a
+n
+d
+
+i
+n
+
+t
+h
+i
+s
+
+d
+e
+a
+d
+b
+e
+a
+t
+
+p
+a
+r
+t
+
+o
+f
+
+t
+o
+w
+n
+?
+
+A
+n
+d
+
+a
+t
+
+t
+h
+i
+s
+
+p
+a
+r
+t
+i
+c
+u
+l
+a
+r
+
+m
+o
+m
+e
+n
+t
+,
+
+j
+u
+s
+t
+
+a
+f
+t
+e
+r
+
+h
+e
+
+p
+u
+l
+l
+e
+d
+
+o
+f
+f
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 41.73mm )" draw:z-index="2" svg:height="4.23mm" svg:width="162.03mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+i
+g
+
+t
+i
+m
+e
+
+a
+n
+d
+
+w
+a
+s
+
+m
+a
+k
+i
+n
+g
+
+o
+f
+f
+
+w
+i
+t
+h
+
+t
+h
+e
+
+g
+r
+e
+e
+n
+b
+a
+c
+k
+s
+.
+
+W
+a
+s
+
+t
+h
+e
+r
+e
+
+a
+n
+o
+t
+h
+e
+r
+
+c
+r
+o
+o
+k
+
+w
+h
+o
+'
+d
+
+h
+a
+d
+
+t
+h
+e
+
+s
+a
+m
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 46.6mm )" draw:z-index="3" svg:height="4.23mm" svg:width="167.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+i
+d
+e
+a
+,
+
+a
+n
+d
+
+w
+a
+s
+
+n
+o
+w
+
+w
+a
+t
+c
+h
+i
+n
+g
+
+h
+i
+m
+
+a
+n
+d
+
+w
+a
+i
+t
+i
+n
+g
+
+f
+o
+r
+
+a
+
+c
+h
+a
+n
+c
+e
+
+t
+o
+
+g
+r
+a
+b
+
+t
+h
+e
+
+f
+r
+u
+i
+t
+
+o
+f
+
+h
+i
+s
+
+l
+a
+b
+o
+r
+?
+
+O
+r
+
+d
+i
+d
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 51.47mm )" draw:z-index="4" svg:height="4.23mm" svg:width="161.92mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+
+m
+e
+a
+n
+
+t
+h
+a
+t
+
+o
+n
+e
+
+o
+f
+
+m
+a
+n
+y
+
+l
+a
+w
+
+o
+f
+f
+i
+c
+e
+r
+s
+
+i
+n
+
+t
+o
+w
+n
+
+w
+a
+s
+
+o
+n
+
+t
+o
+
+h
+i
+m
+
+a
+n
+d
+
+j
+u
+s
+t
+
+w
+a
+i
+t
+i
+n
+g
+
+t
+o
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 56.34mm )" draw:z-index="5" svg:height="4.23mm" svg:width="164.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+p
+o
+u
+n
+c
+e
+
+a
+n
+d
+
+s
+n
+a
+p
+
+t
+h
+o
+s
+e
+
+c
+u
+f
+f
+s
+
+o
+n
+
+h
+i
+s
+
+w
+r
+i
+s
+t
+s
+?
+
+H
+e
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+l
+o
+o
+k
+e
+d
+
+a
+l
+l
+
+a
+r
+o
+u
+n
+d
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 61.2mm )" draw:z-index="6" svg:height="4.23mm" svg:width="165.52mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+l
+e
+y
+.
+
+L
+i
+k
+e
+
+l
+i
+g
+h
+t
+n
+i
+n
+g
+
+h
+e
+
+d
+a
+r
+t
+e
+d
+
+o
+f
+f
+
+t
+o
+
+t
+h
+e
+
+l
+e
+f
+t
+
+a
+n
+d
+
+d
+i
+s
+a
+p
+p
+e
+a
+r
+e
+d
+
+b
+e
+t
+w
+e
+e
+n
+
+t
+h
+e
+
+t
+w
+o
+
+w
+a
+r
+e
+h
+o
+u
+s
+e
+s
+
+a
+l
+m
+o
+s
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 66.07mm )" draw:z-index="7" svg:height="4.23mm" svg:width="161.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+f
+a
+l
+l
+i
+n
+g
+
+o
+v
+e
+r
+
+t
+h
+e
+
+t
+r
+a
+s
+h
+
+c
+a
+n
+
+l
+y
+i
+n
+g
+
+i
+n
+
+t
+h
+e
+
+m
+i
+d
+d
+l
+e
+
+o
+f
+
+t
+h
+e
+
+s
+i
+d
+e
+w
+a
+l
+k
+.
+
+H
+e
+
+t
+r
+i
+e
+d
+
+t
+o
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+t
+a
+p
+
+h
+i
+s
+
+w
+a
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 70.94mm )" draw:z-index="8" svg:height="4.23mm" svg:width="168.27mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+o
+n
+g
+
+i
+n
+
+t
+h
+e
+
+i
+n
+k
+y
+
+d
+a
+r
+k
+n
+e
+s
+s
+
+a
+n
+d
+
+s
+u
+d
+d
+e
+n
+l
+y
+
+s
+t
+i
+f
+f
+e
+n
+e
+d
+:
+
+i
+t
+
+w
+a
+s
+
+a
+
+d
+e
+a
+d
+-
+e
+n
+d
+,
+
+h
+e
+
+w
+o
+u
+l
+d
+
+h
+a
+v
+e
+
+t
+o
+
+g
+o
+
+b
+a
+c
+k
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 75.81mm )" draw:z-index="9" svg:height="4.23mm" svg:width="161.39mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+w
+a
+y
+
+h
+e
+
+h
+a
+d
+
+c
+o
+m
+e
+.
+
+T
+h
+e
+
+s
+t
+e
+p
+s
+
+g
+o
+t
+
+l
+o
+u
+d
+e
+r
+
+a
+n
+d
+
+l
+o
+u
+d
+e
+r
+,
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+b
+l
+a
+c
+k
+
+o
+u
+t
+l
+i
+n
+e
+
+o
+f
+
+a
+
+f
+i
+g
+u
+r
+e
+
+c
+o
+m
+i
+n
+g
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 80.68mm )" draw:z-index="10" svg:height="4.23mm" svg:width="161.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+r
+o
+u
+n
+d
+
+t
+h
+e
+
+c
+o
+r
+n
+e
+r
+.
+
+I
+s
+
+t
+h
+i
+s
+
+t
+h
+e
+
+e
+n
+d
+
+o
+f
+
+t
+h
+e
+
+l
+i
+n
+e
+?
+
+h
+e
+
+t
+h
+o
+u
+g
+h
+t
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+b
+a
+c
+k
+
+a
+g
+a
+i
+n
+s
+t
+
+t
+h
+e
+
+w
+a
+l
+l
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 85.55mm )" draw:z-index="11" svg:height="4.23mm" svg:width="159.56mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+t
+r
+y
+i
+n
+g
+
+t
+o
+
+m
+a
+k
+e
+
+h
+i
+m
+s
+e
+l
+f
+
+i
+n
+v
+i
+s
+i
+b
+l
+e
+
+i
+n
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+w
+a
+s
+
+a
+l
+l
+
+t
+h
+a
+t
+
+p
+l
+a
+n
+n
+i
+n
+g
+
+a
+n
+d
+
+e
+n
+e
+r
+g
+y
+
+w
+a
+s
+t
+e
+d
+?
+
+H
+e
+
+w
+a
+s
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 90.41mm )" draw:z-index="12" svg:height="4.23mm" svg:width="164mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+d
+r
+i
+p
+p
+i
+n
+g
+
+w
+i
+t
+h
+
+s
+w
+e
+a
+t
+
+n
+o
+w
+,
+
+c
+o
+l
+d
+
+a
+n
+d
+
+w
+e
+t
+,
+
+h
+e
+
+c
+o
+u
+l
+d
+
+s
+m
+e
+l
+l
+
+t
+h
+e
+
+f
+e
+a
+r
+
+c
+o
+m
+i
+n
+g
+
+o
+f
+f
+
+h
+i
+s
+
+c
+l
+o
+t
+h
+e
+s
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 95.28mm )" draw:z-index="13" svg:height="4.23mm" svg:width="167mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+e
+x
+t
+
+t
+o
+
+h
+i
+m
+,
+
+w
+i
+t
+h
+
+a
+
+b
+a
+r
+e
+l
+y
+
+n
+o
+t
+i
+c
+e
+a
+b
+l
+e
+
+s
+q
+u
+e
+a
+k
+,
+
+a
+
+d
+o
+o
+r
+
+s
+w
+u
+n
+g
+
+q
+u
+i
+e
+t
+l
+y
+
+t
+o
+
+a
+n
+d
+
+f
+r
+o
+
+i
+n
+
+t
+h
+e
+
+n
+i
+g
+h
+t
+'
+s
+
+b
+r
+e
+e
+z
+e
+.
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 100.15mm )" draw:z-index="14" svg:height="4.23mm" svg:width="169.29mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+C
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+b
+e
+
+t
+h
+e
+
+h
+a
+v
+e
+n
+
+h
+e
+'
+d
+
+p
+r
+a
+y
+e
+d
+
+f
+o
+r
+?
+
+S
+l
+o
+w
+l
+y
+
+h
+e
+
+s
+l
+i
+d
+
+t
+o
+w
+a
+r
+d
+
+t
+h
+e
+
+d
+o
+o
+r
+,
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+m
+o
+r
+e
+
+a
+n
+d
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 105.02mm )" draw:z-index="15" svg:height="4.23mm" svg:width="146.82mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+m
+o
+r
+e
+
+i
+n
+t
+o
+
+t
+h
+e
+
+w
+a
+l
+l
+,
+
+i
+n
+t
+o
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+a
+w
+a
+y
+
+f
+r
+o
+m
+
+h
+i
+s
+
+e
+n
+e
+m
+y
+.
+
+W
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+d
+o
+o
+r
+
+s
+a
+v
+e
+
+h
+i
+s
+
+h
+i
+d
+e
+?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 109.89mm )" draw:z-index="16" svg:height="4.23mm" svg:width="163.08mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+H
+e
+
+h
+e
+a
+r
+d
+
+q
+u
+i
+e
+t
+
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+.
+
+T
+h
+a
+t
+
+d
+i
+d
+n
+'
+t
+
+b
+o
+d
+e
+
+w
+e
+l
+l
+.
+
+W
+h
+o
+
+c
+o
+u
+l
+d
+
+b
+e
+
+f
+o
+l
+l
+o
+w
+i
+n
+g
+
+h
+i
+m
+
+t
+h
+i
+s
+
+l
+a
+t
+e
+
+a
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 114.76mm )" draw:z-index="17" svg:height="4.23mm" svg:width="165.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+i
+g
+h
+t
+
+a
+n
+d
+
+i
+n
+
+t
+h
+i
+s
+
+d
+e
+a
+d
+b
+e
+a
+t
+
+p
+a
+r
+t
+
+o
+f
+
+t
+o
+w
+n
+?
+
+A
+n
+d
+
+a
+t
+
+t
+h
+i
+s
+
+p
+a
+r
+t
+i
+c
+u
+l
+a
+r
+
+m
+o
+m
+e
+n
+t
+,
+
+j
+u
+s
+t
+
+a
+f
+t
+e
+r
+
+h
+e
+
+p
+u
+l
+l
+e
+d
+
+o
+f
+f
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 119.62mm )" draw:z-index="18" svg:height="4.23mm" svg:width="162.03mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+i
+g
+
+t
+i
+m
+e
+
+a
+n
+d
+
+w
+a
+s
+
+m
+a
+k
+i
+n
+g
+
+o
+f
+f
+
+w
+i
+t
+h
+
+t
+h
+e
+
+g
+r
+e
+e
+n
+b
+a
+c
+k
+s
+.
+
+W
+a
+s
+
+t
+h
+e
+r
+e
+
+a
+n
+o
+t
+h
+e
+r
+
+c
+r
+o
+o
+k
+
+w
+h
+o
+'
+d
+
+h
+a
+d
+
+t
+h
+e
+
+s
+a
+m
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 124.49mm )" draw:z-index="19" svg:height="4.23mm" svg:width="167.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+i
+d
+e
+a
+,
+
+a
+n
+d
+
+w
+a
+s
+
+n
+o
+w
+
+w
+a
+t
+c
+h
+i
+n
+g
+
+h
+i
+m
+
+a
+n
+d
+
+w
+a
+i
+t
+i
+n
+g
+
+f
+o
+r
+
+a
+
+c
+h
+a
+n
+c
+e
+
+t
+o
+
+g
+r
+a
+b
+
+t
+h
+e
+
+f
+r
+u
+i
+t
+
+o
+f
+
+h
+i
+s
+
+l
+a
+b
+o
+r
+?
+
+O
+r
+
+d
+i
+d
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 129.36mm )" draw:z-index="20" svg:height="4.23mm" svg:width="161.92mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+
+m
+e
+a
+n
+
+t
+h
+a
+t
+
+o
+n
+e
+
+o
+f
+
+m
+a
+n
+y
+
+l
+a
+w
+
+o
+f
+f
+i
+c
+e
+r
+s
+
+i
+n
+
+t
+o
+w
+n
+
+w
+a
+s
+
+o
+n
+
+t
+o
+
+h
+i
+m
+
+a
+n
+d
+
+j
+u
+s
+t
+
+w
+a
+i
+t
+i
+n
+g
+
+t
+o
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 134.23mm )" draw:z-index="21" svg:height="4.23mm" svg:width="164.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+p
+o
+u
+n
+c
+e
+
+a
+n
+d
+
+s
+n
+a
+p
+
+t
+h
+o
+s
+e
+
+c
+u
+f
+f
+s
+
+o
+n
+
+h
+i
+s
+
+w
+r
+i
+s
+t
+s
+?
+
+H
+e
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+l
+o
+o
+k
+e
+d
+
+a
+l
+l
+
+a
+r
+o
+u
+n
+d
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 139.1mm )" draw:z-index="22" svg:height="4.23mm" svg:width="165.52mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+l
+e
+y
+.
+
+L
+i
+k
+e
+
+l
+i
+g
+h
+t
+n
+i
+n
+g
+
+h
+e
+
+d
+a
+r
+t
+e
+d
+
+o
+f
+f
+
+t
+o
+
+t
+h
+e
+
+l
+e
+f
+t
+
+a
+n
+d
+
+d
+i
+s
+a
+p
+p
+e
+a
+r
+e
+d
+
+b
+e
+t
+w
+e
+e
+n
+
+t
+h
+e
+
+t
+w
+o
+
+w
+a
+r
+e
+h
+o
+u
+s
+e
+s
+
+a
+l
+m
+o
+s
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 143.97mm )" draw:z-index="23" svg:height="4.23mm" svg:width="161.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+f
+a
+l
+l
+i
+n
+g
+
+o
+v
+e
+r
+
+t
+h
+e
+
+t
+r
+a
+s
+h
+
+c
+a
+n
+
+l
+y
+i
+n
+g
+
+i
+n
+
+t
+h
+e
+
+m
+i
+d
+d
+l
+e
+
+o
+f
+
+t
+h
+e
+
+s
+i
+d
+e
+w
+a
+l
+k
+.
+
+H
+e
+
+t
+r
+i
+e
+d
+
+t
+o
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+t
+a
+p
+
+h
+i
+s
+
+w
+a
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 148.83mm )" draw:z-index="24" svg:height="4.23mm" svg:width="168.27mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+o
+n
+g
+
+i
+n
+
+t
+h
+e
+
+i
+n
+k
+y
+
+d
+a
+r
+k
+n
+e
+s
+s
+
+a
+n
+d
+
+s
+u
+d
+d
+e
+n
+l
+y
+
+s
+t
+i
+f
+f
+e
+n
+e
+d
+:
+
+i
+t
+
+w
+a
+s
+
+a
+
+d
+e
+a
+d
+-
+e
+n
+d
+,
+
+h
+e
+
+w
+o
+u
+l
+d
+
+h
+a
+v
+e
+
+t
+o
+
+g
+o
+
+b
+a
+c
+k
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 153.7mm )" draw:z-index="25" svg:height="4.23mm" svg:width="161.39mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+w
+a
+y
+
+h
+e
+
+h
+a
+d
+
+c
+o
+m
+e
+.
+
+T
+h
+e
+
+s
+t
+e
+p
+s
+
+g
+o
+t
+
+l
+o
+u
+d
+e
+r
+
+a
+n
+d
+
+l
+o
+u
+d
+e
+r
+,
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+b
+l
+a
+c
+k
+
+o
+u
+t
+l
+i
+n
+e
+
+o
+f
+
+a
+
+f
+i
+g
+u
+r
+e
+
+c
+o
+m
+i
+n
+g
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 158.57mm )" draw:z-index="26" svg:height="4.23mm" svg:width="161.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+r
+o
+u
+n
+d
+
+t
+h
+e
+
+c
+o
+r
+n
+e
+r
+.
+
+I
+s
+
+t
+h
+i
+s
+
+t
+h
+e
+
+e
+n
+d
+
+o
+f
+
+t
+h
+e
+
+l
+i
+n
+e
+?
+
+h
+e
+
+t
+h
+o
+u
+g
+h
+t
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+b
+a
+c
+k
+
+a
+g
+a
+i
+n
+s
+t
+
+t
+h
+e
+
+w
+a
+l
+l
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 163.44mm )" draw:z-index="27" svg:height="4.23mm" svg:width="159.56mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+t
+r
+y
+i
+n
+g
+
+t
+o
+
+m
+a
+k
+e
+
+h
+i
+m
+s
+e
+l
+f
+
+i
+n
+v
+i
+s
+i
+b
+l
+e
+
+i
+n
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+w
+a
+s
+
+a
+l
+l
+
+t
+h
+a
+t
+
+p
+l
+a
+n
+n
+i
+n
+g
+
+a
+n
+d
+
+e
+n
+e
+r
+g
+y
+
+w
+a
+s
+t
+e
+d
+?
+
+H
+e
+
+w
+a
+s
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 168.31mm )" draw:z-index="28" svg:height="4.23mm" svg:width="164mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+d
+r
+i
+p
+p
+i
+n
+g
+
+w
+i
+t
+h
+
+s
+w
+e
+a
+t
+
+n
+o
+w
+,
+
+c
+o
+l
+d
+
+a
+n
+d
+
+w
+e
+t
+,
+
+h
+e
+
+c
+o
+u
+l
+d
+
+s
+m
+e
+l
+l
+
+t
+h
+e
+
+f
+e
+a
+r
+
+c
+o
+m
+i
+n
+g
+
+o
+f
+f
+
+h
+i
+s
+
+c
+l
+o
+t
+h
+e
+s
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 173.18mm )" draw:z-index="29" svg:height="4.23mm" svg:width="167mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+e
+x
+t
+
+t
+o
+
+h
+i
+m
+,
+
+w
+i
+t
+h
+
+a
+
+b
+a
+r
+e
+l
+y
+
+n
+o
+t
+i
+c
+e
+a
+b
+l
+e
+
+s
+q
+u
+e
+a
+k
+,
+
+a
+
+d
+o
+o
+r
+
+s
+w
+u
+n
+g
+
+q
+u
+i
+e
+t
+l
+y
+
+t
+o
+
+a
+n
+d
+
+f
+r
+o
+
+i
+n
+
+t
+h
+e
+
+n
+i
+g
+h
+t
+'
+s
+
+b
+r
+e
+e
+z
+e
+.
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 178.04mm )" draw:z-index="30" svg:height="4.23mm" svg:width="169.29mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+C
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+b
+e
+
+t
+h
+e
+
+h
+a
+v
+e
+n
+
+h
+e
+'
+d
+
+p
+r
+a
+y
+e
+d
+
+f
+o
+r
+?
+
+S
+l
+o
+w
+l
+y
+
+h
+e
+
+s
+l
+i
+d
+
+t
+o
+w
+a
+r
+d
+
+t
+h
+e
+
+d
+o
+o
+r
+,
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+m
+o
+r
+e
+
+a
+n
+d
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 182.91mm )" draw:z-index="31" svg:height="4.23mm" svg:width="146.82mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+m
+o
+r
+e
+
+i
+n
+t
+o
+
+t
+h
+e
+
+w
+a
+l
+l
+,
+
+i
+n
+t
+o
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+a
+w
+a
+y
+
+f
+r
+o
+m
+
+h
+i
+s
+
+e
+n
+e
+m
+y
+.
+
+W
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+d
+o
+o
+r
+
+s
+a
+v
+e
+
+h
+i
+s
+
+h
+i
+d
+e
+?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+</draw:page>
+</office:drawing>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/pictxt_pdfi_unittest_impress.xml b/sdext/source/pdfimport/test/testdocs/pictxt_pdfi_unittest_impress.xml
new file mode 100644
index 000000000..7ca5e8433
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/pictxt_pdfi_unittest_impress.xml
@@ -0,0 +1,3396 @@
+<?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 .
+ -->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="20mm" fo:margin-right="10mm" fo:margin-top="31mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:auto-grow-height="true" draw:auto-grow-width="true" draw:fill="none" draw:stroke="none" draw:textarea-horizontal-align="left" draw:textarea-vertical-align="top" fo:padding-bottom="0cm" fo:padding-left="0cm" fo:padding-right="0cm" fo:padding-top="0cm" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Thorndale" fo:font-size="12pt" style:font-size-asian="12pt" style:font-size-complex="12pt" >
+
+</style:text-properties>
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:presentation >
+<draw:page draw:master-page-name="master-page3" >
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 92.56mm 31.82mm )" draw:z-index="32" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////////w8fiMlsdda7Bve7nBxuH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx8h79QX6pQX6pQX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Z3O1QX6pQX6plcrRYZ65QX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////19vrk5/Lg4/Ds7fb5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fjd4O/j5fFQX6pQX6qBjMK4vt1da7BQX6pVY6y/xeD////////////////////////////////////////////////////////////////////////////////////3+PvAxeCBjMJda7BaaK9YZ65RYKplcrSUncvHzOT5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6vR7hr9da7DT1+qOl8hQX6pQX6qOmMi+w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////////////X2ut1gbxQX6p1gby4vt3e4e/b3u6vtthda7BQX6pQX6qIksX8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vq4vt1QX6pQX6pgbrLM0eaIksVQX6pQX6qGkcS9w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////M0eZWZa1QX6qUncv8/P7////////////////O0udVY6xQX6p0gLv8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8vh2gr2gqNG2vNtRYKpQX6pda7DM0eaDjsNQX6pQX6qIksXBxuFWZa1QX6pRYKq+w9/////////////////////////////////////////////////////////////s7fZebLFQX6pjcbP19vr///////////////////////92gr1QX6qbpM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+UnctQX6pQX6qiqtKvtthRYKpQX6pkcbTHzOSBjMJQX6pQX6qMlsfAxeBda7BQX6pTYqzY2+z///////////////////////////////////////////////////////+krNNQX6pQX6qXoM3///////////////////////////+OmMhQX6rHzOT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7/ePmcm2vNxve7lQX6pQX6qiqtKvtthQX6pQX6plcrTJzeWMlsdQX6pQX6qIksW7wd5gbrKgqNGkrNO0u9v////////////////////////////////////////////////5+fxodbZQX6pQX6qmrdT///////////////////////////+VnstVY6zy8/n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fh4g71QX6ppdrbO0udve7lQX6pQX6qiqtK2vNtTYqtQX6pkcbTFyuOJk8ZQX6pQX6p/isHb3u2gqNFQX6pQX6q+w9/////////////////////////////////////////////o6vRVY6xQX6pQX6qDjcP///////////////////////////+Ol8hyfrv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z9PmAi8FQX6pQX6p/isHGy+PBxuFve7lQX6pQX6qpsdWutdhTYqtQX6pjcbPV2et9iMBQX6qYoc2ttNdRYKpQX6pjcbO4vt3JzuX////////////////////////////////////////m6PNVZK1QX6pQX6pWZa3h5PH///////////////////////+mrdSqsdb////////////s7fa0u9uXoM2zudr5+fz////////////////////////09frZ3O3X2+zg4/D////////////////////EyeKOmMiWn8zq7PX////////////////////e4e+vttidpc+0u9v39/v////////////////////////////////////////////////////v8PeBjMJQX6pQX6qIksW9w99YZ65xfbq9w99rd7dQX6pQX6qiqtKrstZVY6xQX6qao87y8/m2vNypsdVRYKpQX6plcrTEyeJ9iMBQX6qzudr8/P7////////////////////////////////09fpebLFQX6pQX6pQX6qDjsP8/P7////////////////////8/P7////////////Cx+FgbrJQX6pQX6pQX6q4vt3///////////////////////+KlMZSYatSYatrd7f5+fz////////z9PmKlMZQX6pQX6pQX6qgqNH////////////z9PmZos1QX6pQX6pQX6pQX6qXoM3////////////////////////////////////////////////v8Pd4g71QX6pQX6qMlsfAxeBda7BQX6pRYKrJzeXo6vRodbZQX6pQX6p9iMBWZa1QX6qMlsf///+utdhQX6pQX6prd7fFyuN/isFQX6pQX6qKlMb///////////////////////////////////////+KlMZQX6pQX6pQX6pQX6qiqtL///////////////////////////////+6wN1QX6pRYKpQX6pQX6pQX6qpsdX////////////////////c3+5SYatQX6pQX6qZos3////////v8Pd5hb5RYKpTYqtQX6pQX6qOl8j////////o6vRyfrtda7CZos56hb5QX6pQX6plcrT5+fz////////////////////////////////////////19vp5hb5QX6pQX6qIksXBxuFWZa1QX6pTYqzEyeL09frt7/bd4O9mc7VQX6pQX6pQX6pQX6q9w9+vtthQX6pQX6pkcbTM0eZ/isFQX6pQX6qMlsfz9Pno6vT19vr////////////////////////////////FyuNQX6pQX6pQX6pQX6pQX6qxt9n////////////////////////U1+pQX6q4vt2vtthQX6pQX6pQX6rO0uf///////////////////+iqtJQX6pQX6pSYavY2+z////8/P57hr9ib7Pb3u5pdrZQX6pQX6qkrNP////w8fhpdrZ4g73s7fb///+6wN1QX6pQX6pib7P39/v////////////////////////////////////19vqAi8FQX6pQX6qGkcS9w99da7BQX6pVY6y6wN2mrdRgbbJYZ66DjcPFyuN9iMBVY6xaaK+gqNGqsdZQX6pQX6pkcbTFyuN9iMBQX6pQX6qRmsnFyuNxfbpWZa1ndLW2vNv////////////////////////////5+fx2gr1QX6pQX6pQX6pQX6pWZa3M0eb////////////////z9Plmc7WgqNH///+PmclQX6pQX6pndLX39/v///////////////////9yfrtQX6pQX6pve7n8/P7///+krNNaaK/g4/Dy8/lYZ65QX6pQX6rFyuP5+fx2gr1+icD39/v///////+XoM1QX6pQX6p1gbz8/P7///////////////////////////////////+TnMtQX6pQX6qPmcm+w99da7BQX6pVY6y7wd6ao85QX6pQX6pQX6pQX6p2gr319vrg4/Dq7PXT1+pRYKpQX6pndLXFyuN9iMBQX6pQX6qSm8q7wd5YZ65QX6pQX6pQX6pRYKrX2uv////////////////////////////Y2+xVY6xQX6pQX6pQX6pQX6pgbbLj5fH///////////+gqNFxfbr8/P7s7fZYZ65QX6pQX6qgqNH////////////////////X2+xTYqtQX6pQX6qep9D////d4O9WZa3O0uf////FyuNQX6pQX6pWZa3s7faKlMZxfbr39/v////////5+fxodbZQX6pQX6qWn8z///////////////////////////////////////9YZ65QX6prd7ext9lda7BQX6pYZ67DyOKZos5QX6pQX6pwfLlyfrtQX6pQX6rg4/D///////+iqtJQX6pVY6yzudp/isFQX6pQX6qSm8q9w99YZ65QX6paaK+BjMJRYKpQX6qmrdT///////////////////////////////+2vNtQX6pQX6pQX6pQX6pQX6p2gr36+/3////h5PFebLHb3u3///+2vNxQX6pQX6pQX6rU1+r///////////////////+XoM1QX6pQX6pTYqvb3u3///+Zos6ao87///////+Zos5QX6pQX6qDjsOttNdmc7Xs7fb////////////FyuNQX6pQX6pQX6rJzeX///////////////////////////////////////9jcbNQX6pVY6xRYKpQX6pWZa26wN2gqNFQX6pQX6p2gr3JzeVyfrtQX6pWZa3x8vj///////+xt9lQX6pRYKpYZ65QX6pQX6qSm8rDyOJaaK9QX6pVZK26wN2VnstQX6pQX6q4vt3///////////////////////////////////+PmclQX6pQX6pQX6pQX6pQX6qttNf////Z3O20u9v////8/P54g71QX6pQX6preLf5+fz////////////////09fpkcbRQX6pQX6pve7n8/P7////h5PH39/v////3+PtodbZQX6pRYKqMlsdlcrTQ1Oj///////////////+GkcRQX6pQX6pjcbP19vr///////////////////////////////////////+6wN1QX6pQX6pQX6pWZa26wN2bpM9QX6pQX6p2gr3HzORyfrtQX6pQX6qpsdXO0uekrNO0u9vU1+prd7dQX6pQX6pQX6qTnMu7wd5aaK9QX6paaK++w9+VnstQX6pQX6pyfrv09fr////////////////////////////////////19vpwfLlQX6pQX6pQX6pQX6paaK/s7fb////////////Z3O1RYKpQX6pQX6qrstb///////////////////+xt9lQX6pQX6pQX6qep9D////////////////////U1+pRYKpQX6pSYatRYKqgqNH////////////////m6PNYZ65QX6pQX6qRmsn////////////////////////////////////////////////Gy+OOmMiTnMvO0ueZos5QX6pQX6p1gbzGy+NreLdQX6pQX6qkrNOpsdVRYKpQX6pQX6pwfLnFyuOgqNGMlse4vt29w99YZ65QX6paaK+9w9+Sm8pQX6pQX6p4g73o6vT////////////////////////////////////////////Z3O1YZ65QX6pQX6pQX6pQX6q/xeD///////////+gqNFQX6pQX6pVY6zh5PH////////////////09fpndLVQX6pQX6pSYavX2uv///////////////////+mrdRQX6pQX6pQX6pndLXz9Pn///////////////+ep9BQX6pQX6pQX6rO0uf////////////////////////////////////////////////////////6+/2bpM9QX6pQX6pwfLnLz+ZsebhQX6pQX6qgqNHq7PVVY6xQX6pSYatQX6pQX6psebju7/f////HzORVY6xQX6pVZK2+w9+Rm8pQX6pQX6pxfbrv8Pf///////////////////////////////////////////////////+XoM1QX6pQX6pQX6pQX6qkrNP////////39/tlcrRQX6pQX6qAi8H///////////////////+ep9BQX6pQX6pQX6pve7n8/P7////////////////6+/1ve7lQX6pQX6pQX6q9w9/////////////////x8vhebLFQX6pQX6pyfrv8/P7////////////////////////////////////////////////////////O0udQX6pQX6p2gr3Lz+ZxfbpQX6pQX6qYoc3////c3+5QX6pQX6qGkcSZos1QX6pQX6pwfLnh5PF2gr1QX6pYZ664vt2VnstQX6pQX6pwfLno6vT////////////////////V2euzudr////////////////////////////k5/JYZ65QX6pQX6pQX6qZos7////////O0udQX6pQX6pQX6q9w9/////////////////S1ulVZK1VY6xQX6pQX6qYoc3////////////////////Q1OhRYKpQX6pQX6pve7n3+Pv////////////////AxeBQX6pQX6pQX6qzudr////////////////////////////////////////////////////////////8/P6zudp4g73EyeJsebhQX6pQX6qkrNOpsdWDjsPs7fZodbZQX6paaK+2vNykrNNQX6pQX6preLe/xeB7hr+4vt2Wn8xQX6pQX6pxfbro6vT///////////////////////+Nl8hrd7f///////////////////////////////+DjcNQX6pQX6pQX6qiqtL///////+Zos1QX6pQX6pda7Dv8Pf////////////z9Plve7mRm8paaK9QX6pQX6rO0uf////8/P6ao87k5/L///+Yoc1QX6pQX6pRYKrJzeX///////////////////+Ai8FQX6pQX6pWZa3o6vT////S1umzudr////////////////////////////////////////////////////////o6vRsebhQX6pQX6qiqtLDyOJQX6pQX6qOmMjLz+ZebLFQX6pVY6y2vNyao85QX6pQX6pyfrvg4/CiqtJQX6pQX6pwfLnq7PX///////////////////////////9yfrt0gLv///////////////////////////////+ep9BQX6pQX6pQX6q/xeD////39/tlcrRQX6pQX6qPmcn///////////////+OmMiOl8ixt9lQX6pQX6pmc7X3+Pv////O0udaaK/x8vj8/P5sebhQX6pQX6pyfrv////////////////////k5/JVY6xQX6pQX6qJk8b////8/P5yfrukrNP///////////////////////////////////////////////////////////+qsdZSYauZos2zudq4vt2DjsNQX6pQX6qNl8jDyOJebLFQX6pVY6y2vNuao85QX6pQX6p0gLu9w99pdrZsebjq7PX////////////////////////////19vpYZ654g73///////////////////////////////+Zos1QX6pQX6paaK/s7fb////T1+pQX6pQX6pRYKrS1un///////////+rstZrd7f09fqAi8FQX6pQX6qZos3////3+PtsebittNf////U1+pRYKpQX6pQX6q4vt3///////////////////+0u9tQX6pQX6pQX6rHzOT///+zudppdrb3+Pv////////////////////////////////////////////////////////////////S1umkrNNQX6pebLG+w9+Fj8RQX6pQX6qMlsfDyOJebLFQX6pVY6y0u9uep9BQX6pQX6pwfLnFyuPo6vT////////////////////////////////Z3O1QX6psebj8/P7////////////////////////6+/1wfLlQX6pQX6qttNf///////+ttNdQX6pQX6ppdrb6+/3///////+ttNdda7Dg4/D39/taaK9QX6pQX6rEyeL///+Vnstyfrv8/P7///+bpM9QX6pQX6plcrT39/v///////////////////+BjMJQX6pQX6pib7P6+/3c3+5YZ67M0eb///////////////////////////////////////////////////////////////////////+zudpQX6pQX6pda7DDyOKAi8FQX6pQX6qNl8jHzORda7BQX6pTYqy7wd6ep9BQX6preLfq7PX///////////////////////////////////+7wd5QX6pWZa3q7PX////////////////////////EyeJQX6pQX6p8h7/8/P7///////+MlsdQX6pQX6qFj8T///////+nr9RWZa3Q1Oj////Z3O1SYatQX6pTYqve4e+2vNxTYqvf4vD////8/P5wfLlQX6pQX6qXoM3////////////////////x8vhaaK9QX6pQX6qPmcns7fZib7OTnMv///////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pjcbO/xeCAi8FQX6pQX6qRm8rGy+Nda7BQX6pTYqyss9erstbk5/L///////////////////////////////////////+mrdRQX6pQX6qkrNP////////////////////s7fZpdrZQX6pyfrvq7PX////////8/P52gr1QX6pQX6pjcbOss9d/isFebLHT1+r////////HzORQX6pQX6pTYqtwfLlTYqzCx+H////////a3e1TYqxQX6pRYKrQ1Oj////////////////////b3u1SYatQX6pQX6pgbrJda7CGkcTd4O+zudrJzeX///////////////////////////////////////////////////////////////////////////+vtthRYKpQX6pib7PDyOKFj8RQX6pQX6qKlMbFyuNaaK9QX6pyfrv8/P7////////////////////////////////////////////Z3O1ndLVQX6pQX6qZos7m6PP39/vx8vi/xeBjcbNQX6qOl8jv8Pf///////////////+DjcNQX6pQX6pQX6pQX6p1gbzh5PH////////////DyOJQX6pQX6pQX6pWZa2/xeD///////////+ep9BQX6pQX6pjcbP5+fz////////////////////Z3O1QX6pQX6pQX6pQX6qDjcP39/vX2+ypsdW9w9////////////////////////////////////////////////////////////////////////////////+4vt1QX6pQX6pda7C+w9+IksVRYKpQX6qzudrP0+h9iMDm6PP////////////////////////////////////////////////////v8Pe6wN2GkcRaaK9ebLFpdrZjcbNebLGOmMjS1un////////////////////////U1+ppdrZda7CBjMK/xeD6+/3////////////////k5/JlcrRWZa2Jk8be4e/////////////////P0+ipsdWnr9TJzeX////////////////////////39/uDjsNYZ65sebixuNn6+/3////u7/fW2evg4/D///////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pgbbKpsdVYZ65QX6qIksX////8/P7////////////////////////////////////////////////////////////////////09frd4O/Q1Oja3e3z9Pn////////////////////////////////////3+Pvz9Pn////////////////////////////////x8vjo6vT////////////////////////////////////////////////////////////////////8/P7s7fb5+fz///////////////////////////////////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pQX6pQX6pQX6qdpc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+0u9tYZ65QX6pQX6pve7no6vT////////////////////////////////////////////////////////////////////////////////////////////////X2+y4vt3////////////////////////////////////////////////////////////////////////////////////////////////b3u7Q1Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b3u6rsta4vt3y8/n////////////////////////////////////////////////////////////////////8/P7q7PXe4e/S1un5+fzQ1Ojk5/L////S1unZ3O3////////V2evS1un6+/3q7PXd4O/v8Pf////Q1OjZ3O3////////m6PPO0ufv8Pfj5fH////////j5fH////g4/DS1unx8viao86Rmsnm6PP////o6vTS1un5+fz////q7PXd4O/X2uv5+fzQ1Ojm6PP////5+fzQ1Ojk5/L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx5hb6iqtKVnsyDjsOutdh4g73t7/apsdWrstb///+ep9CiqtK6wN3y8/l7hr+Vnsvq7PWdpc+ttNeOmMi4vt3f4u+MlsfFyuPq7PWOmMjc3+7g4/CZos62vNyIksXO0ufq7PWPmcmGkcTZ3O3O0ueNl8iutdiUncv39/t4g72mrdSKlMaDjsOttNeFj8T09fqRm8qxt9nf4u/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/t6hb75+fzGy+OTnMv///+Fj8Tf4u/S1umss9fv8Pd/isH////////3+Pt6hb709frf4u+GkcT////u7/eGkcTd4O+Ai8G0u9v5+fy7wd6bpM+mrdTFyuPFyuN7hr/DyOL///+9w9+zudr///+Rm8qGkcSttNePmcnu7/d7hr/8/P60u9uSm8r///+Pmcnv8PeVnsyao87j5fH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vqBjML8/P6+w9+gqNH///+DjcPf4vDM0eaqsdbx8vh1gbz09fr6+/3z9PmJk8b6+/3g4/B7hr/8/P3Q1OiRmsn////t7/aMlsenr9T5+fxve7l5hb7y8/n////k5/J7hr/U1+q9w9+or9X///+VnsugqNH19vr5+fzz9PmFj8T///+vttigqNH///+Nl8jv8Pf8/P6+w997hr/5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/uZos78/P3Lz+axuNn///+ao87m6PPW2eu4vt3///+mrdSRmsmmrdTu7/eiqtL3+Pv///+iqtKXoM2Ol8jd4O/t7/aqsdaVnsvS1un///+VnsyVnsv////T1+qmrdSZos3v8Pfc3+6BjMLLz+bf4u+KlMamrdS+w9/19vqdpc////++w9+zudr///+krNPw8fi/xeCep9CxuNn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P3////8/P78/P7////8/P3////////8/P7////////x8vjz9Pn////8/P7////////////x8vj5+fz////8/P3u7/f3+Pv////39/uNl8jT1+r////3+Pvu7/f8/P7////////19vr19vr////8/P3v8Pf39/v////8/P3////8/P78/P7////8/P7////z9Pnx8vj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7faXoM2nr9T///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 31.99mm )" draw:z-index="0" svg:height="4.23mm" svg:width="163.08mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+H
+e
+
+h
+e
+a
+r
+d
+
+q
+u
+i
+e
+t
+
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+.
+
+T
+h
+a
+t
+
+d
+i
+d
+n
+'
+t
+
+b
+o
+d
+e
+
+w
+e
+l
+l
+.
+
+W
+h
+o
+
+c
+o
+u
+l
+d
+
+b
+e
+
+f
+o
+l
+l
+o
+w
+i
+n
+g
+
+h
+i
+m
+
+t
+h
+i
+s
+
+l
+a
+t
+e
+
+a
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 36.86mm )" draw:z-index="1" svg:height="4.23mm" svg:width="165.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+i
+g
+h
+t
+
+a
+n
+d
+
+i
+n
+
+t
+h
+i
+s
+
+d
+e
+a
+d
+b
+e
+a
+t
+
+p
+a
+r
+t
+
+o
+f
+
+t
+o
+w
+n
+?
+
+A
+n
+d
+
+a
+t
+
+t
+h
+i
+s
+
+p
+a
+r
+t
+i
+c
+u
+l
+a
+r
+
+m
+o
+m
+e
+n
+t
+,
+
+j
+u
+s
+t
+
+a
+f
+t
+e
+r
+
+h
+e
+
+p
+u
+l
+l
+e
+d
+
+o
+f
+f
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 41.73mm )" draw:z-index="2" svg:height="4.23mm" svg:width="162.03mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+i
+g
+
+t
+i
+m
+e
+
+a
+n
+d
+
+w
+a
+s
+
+m
+a
+k
+i
+n
+g
+
+o
+f
+f
+
+w
+i
+t
+h
+
+t
+h
+e
+
+g
+r
+e
+e
+n
+b
+a
+c
+k
+s
+.
+
+W
+a
+s
+
+t
+h
+e
+r
+e
+
+a
+n
+o
+t
+h
+e
+r
+
+c
+r
+o
+o
+k
+
+w
+h
+o
+'
+d
+
+h
+a
+d
+
+t
+h
+e
+
+s
+a
+m
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 46.6mm )" draw:z-index="3" svg:height="4.23mm" svg:width="167.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+i
+d
+e
+a
+,
+
+a
+n
+d
+
+w
+a
+s
+
+n
+o
+w
+
+w
+a
+t
+c
+h
+i
+n
+g
+
+h
+i
+m
+
+a
+n
+d
+
+w
+a
+i
+t
+i
+n
+g
+
+f
+o
+r
+
+a
+
+c
+h
+a
+n
+c
+e
+
+t
+o
+
+g
+r
+a
+b
+
+t
+h
+e
+
+f
+r
+u
+i
+t
+
+o
+f
+
+h
+i
+s
+
+l
+a
+b
+o
+r
+?
+
+O
+r
+
+d
+i
+d
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 51.47mm )" draw:z-index="4" svg:height="4.23mm" svg:width="161.92mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+
+m
+e
+a
+n
+
+t
+h
+a
+t
+
+o
+n
+e
+
+o
+f
+
+m
+a
+n
+y
+
+l
+a
+w
+
+o
+f
+f
+i
+c
+e
+r
+s
+
+i
+n
+
+t
+o
+w
+n
+
+w
+a
+s
+
+o
+n
+
+t
+o
+
+h
+i
+m
+
+a
+n
+d
+
+j
+u
+s
+t
+
+w
+a
+i
+t
+i
+n
+g
+
+t
+o
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 56.34mm )" draw:z-index="5" svg:height="4.23mm" svg:width="164.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+p
+o
+u
+n
+c
+e
+
+a
+n
+d
+
+s
+n
+a
+p
+
+t
+h
+o
+s
+e
+
+c
+u
+f
+f
+s
+
+o
+n
+
+h
+i
+s
+
+w
+r
+i
+s
+t
+s
+?
+
+H
+e
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+l
+o
+o
+k
+e
+d
+
+a
+l
+l
+
+a
+r
+o
+u
+n
+d
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 61.2mm )" draw:z-index="6" svg:height="4.23mm" svg:width="165.52mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+l
+e
+y
+.
+
+L
+i
+k
+e
+
+l
+i
+g
+h
+t
+n
+i
+n
+g
+
+h
+e
+
+d
+a
+r
+t
+e
+d
+
+o
+f
+f
+
+t
+o
+
+t
+h
+e
+
+l
+e
+f
+t
+
+a
+n
+d
+
+d
+i
+s
+a
+p
+p
+e
+a
+r
+e
+d
+
+b
+e
+t
+w
+e
+e
+n
+
+t
+h
+e
+
+t
+w
+o
+
+w
+a
+r
+e
+h
+o
+u
+s
+e
+s
+
+a
+l
+m
+o
+s
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 66.07mm )" draw:z-index="7" svg:height="4.23mm" svg:width="161.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+f
+a
+l
+l
+i
+n
+g
+
+o
+v
+e
+r
+
+t
+h
+e
+
+t
+r
+a
+s
+h
+
+c
+a
+n
+
+l
+y
+i
+n
+g
+
+i
+n
+
+t
+h
+e
+
+m
+i
+d
+d
+l
+e
+
+o
+f
+
+t
+h
+e
+
+s
+i
+d
+e
+w
+a
+l
+k
+.
+
+H
+e
+
+t
+r
+i
+e
+d
+
+t
+o
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+t
+a
+p
+
+h
+i
+s
+
+w
+a
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 70.94mm )" draw:z-index="8" svg:height="4.23mm" svg:width="168.27mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+o
+n
+g
+
+i
+n
+
+t
+h
+e
+
+i
+n
+k
+y
+
+d
+a
+r
+k
+n
+e
+s
+s
+
+a
+n
+d
+
+s
+u
+d
+d
+e
+n
+l
+y
+
+s
+t
+i
+f
+f
+e
+n
+e
+d
+:
+
+i
+t
+
+w
+a
+s
+
+a
+
+d
+e
+a
+d
+-
+e
+n
+d
+,
+
+h
+e
+
+w
+o
+u
+l
+d
+
+h
+a
+v
+e
+
+t
+o
+
+g
+o
+
+b
+a
+c
+k
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 75.81mm )" draw:z-index="9" svg:height="4.23mm" svg:width="161.39mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+w
+a
+y
+
+h
+e
+
+h
+a
+d
+
+c
+o
+m
+e
+.
+
+T
+h
+e
+
+s
+t
+e
+p
+s
+
+g
+o
+t
+
+l
+o
+u
+d
+e
+r
+
+a
+n
+d
+
+l
+o
+u
+d
+e
+r
+,
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+b
+l
+a
+c
+k
+
+o
+u
+t
+l
+i
+n
+e
+
+o
+f
+
+a
+
+f
+i
+g
+u
+r
+e
+
+c
+o
+m
+i
+n
+g
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 80.68mm )" draw:z-index="10" svg:height="4.23mm" svg:width="161.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+r
+o
+u
+n
+d
+
+t
+h
+e
+
+c
+o
+r
+n
+e
+r
+.
+
+I
+s
+
+t
+h
+i
+s
+
+t
+h
+e
+
+e
+n
+d
+
+o
+f
+
+t
+h
+e
+
+l
+i
+n
+e
+?
+
+h
+e
+
+t
+h
+o
+u
+g
+h
+t
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+b
+a
+c
+k
+
+a
+g
+a
+i
+n
+s
+t
+
+t
+h
+e
+
+w
+a
+l
+l
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 85.55mm )" draw:z-index="11" svg:height="4.23mm" svg:width="159.56mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+t
+r
+y
+i
+n
+g
+
+t
+o
+
+m
+a
+k
+e
+
+h
+i
+m
+s
+e
+l
+f
+
+i
+n
+v
+i
+s
+i
+b
+l
+e
+
+i
+n
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+w
+a
+s
+
+a
+l
+l
+
+t
+h
+a
+t
+
+p
+l
+a
+n
+n
+i
+n
+g
+
+a
+n
+d
+
+e
+n
+e
+r
+g
+y
+
+w
+a
+s
+t
+e
+d
+?
+
+H
+e
+
+w
+a
+s
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 90.41mm )" draw:z-index="12" svg:height="4.23mm" svg:width="164mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+d
+r
+i
+p
+p
+i
+n
+g
+
+w
+i
+t
+h
+
+s
+w
+e
+a
+t
+
+n
+o
+w
+,
+
+c
+o
+l
+d
+
+a
+n
+d
+
+w
+e
+t
+,
+
+h
+e
+
+c
+o
+u
+l
+d
+
+s
+m
+e
+l
+l
+
+t
+h
+e
+
+f
+e
+a
+r
+
+c
+o
+m
+i
+n
+g
+
+o
+f
+f
+
+h
+i
+s
+
+c
+l
+o
+t
+h
+e
+s
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 95.28mm )" draw:z-index="13" svg:height="4.23mm" svg:width="167mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+e
+x
+t
+
+t
+o
+
+h
+i
+m
+,
+
+w
+i
+t
+h
+
+a
+
+b
+a
+r
+e
+l
+y
+
+n
+o
+t
+i
+c
+e
+a
+b
+l
+e
+
+s
+q
+u
+e
+a
+k
+,
+
+a
+
+d
+o
+o
+r
+
+s
+w
+u
+n
+g
+
+q
+u
+i
+e
+t
+l
+y
+
+t
+o
+
+a
+n
+d
+
+f
+r
+o
+
+i
+n
+
+t
+h
+e
+
+n
+i
+g
+h
+t
+'
+s
+
+b
+r
+e
+e
+z
+e
+.
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 100.15mm )" draw:z-index="14" svg:height="4.23mm" svg:width="169.29mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+C
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+b
+e
+
+t
+h
+e
+
+h
+a
+v
+e
+n
+
+h
+e
+'
+d
+
+p
+r
+a
+y
+e
+d
+
+f
+o
+r
+?
+
+S
+l
+o
+w
+l
+y
+
+h
+e
+
+s
+l
+i
+d
+
+t
+o
+w
+a
+r
+d
+
+t
+h
+e
+
+d
+o
+o
+r
+,
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+m
+o
+r
+e
+
+a
+n
+d
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 105.02mm )" draw:z-index="15" svg:height="4.23mm" svg:width="146.82mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+m
+o
+r
+e
+
+i
+n
+t
+o
+
+t
+h
+e
+
+w
+a
+l
+l
+,
+
+i
+n
+t
+o
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+a
+w
+a
+y
+
+f
+r
+o
+m
+
+h
+i
+s
+
+e
+n
+e
+m
+y
+.
+
+W
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+d
+o
+o
+r
+
+s
+a
+v
+e
+
+h
+i
+s
+
+h
+i
+d
+e
+?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 109.89mm )" draw:z-index="16" svg:height="4.23mm" svg:width="163.08mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+H
+e
+
+h
+e
+a
+r
+d
+
+q
+u
+i
+e
+t
+
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+.
+
+T
+h
+a
+t
+
+d
+i
+d
+n
+'
+t
+
+b
+o
+d
+e
+
+w
+e
+l
+l
+.
+
+W
+h
+o
+
+c
+o
+u
+l
+d
+
+b
+e
+
+f
+o
+l
+l
+o
+w
+i
+n
+g
+
+h
+i
+m
+
+t
+h
+i
+s
+
+l
+a
+t
+e
+
+a
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 114.76mm )" draw:z-index="17" svg:height="4.23mm" svg:width="165.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+i
+g
+h
+t
+
+a
+n
+d
+
+i
+n
+
+t
+h
+i
+s
+
+d
+e
+a
+d
+b
+e
+a
+t
+
+p
+a
+r
+t
+
+o
+f
+
+t
+o
+w
+n
+?
+
+A
+n
+d
+
+a
+t
+
+t
+h
+i
+s
+
+p
+a
+r
+t
+i
+c
+u
+l
+a
+r
+
+m
+o
+m
+e
+n
+t
+,
+
+j
+u
+s
+t
+
+a
+f
+t
+e
+r
+
+h
+e
+
+p
+u
+l
+l
+e
+d
+
+o
+f
+f
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 119.62mm )" draw:z-index="18" svg:height="4.23mm" svg:width="162.03mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+i
+g
+
+t
+i
+m
+e
+
+a
+n
+d
+
+w
+a
+s
+
+m
+a
+k
+i
+n
+g
+
+o
+f
+f
+
+w
+i
+t
+h
+
+t
+h
+e
+
+g
+r
+e
+e
+n
+b
+a
+c
+k
+s
+.
+
+W
+a
+s
+
+t
+h
+e
+r
+e
+
+a
+n
+o
+t
+h
+e
+r
+
+c
+r
+o
+o
+k
+
+w
+h
+o
+'
+d
+
+h
+a
+d
+
+t
+h
+e
+
+s
+a
+m
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 124.49mm )" draw:z-index="19" svg:height="4.23mm" svg:width="167.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+i
+d
+e
+a
+,
+
+a
+n
+d
+
+w
+a
+s
+
+n
+o
+w
+
+w
+a
+t
+c
+h
+i
+n
+g
+
+h
+i
+m
+
+a
+n
+d
+
+w
+a
+i
+t
+i
+n
+g
+
+f
+o
+r
+
+a
+
+c
+h
+a
+n
+c
+e
+
+t
+o
+
+g
+r
+a
+b
+
+t
+h
+e
+
+f
+r
+u
+i
+t
+
+o
+f
+
+h
+i
+s
+
+l
+a
+b
+o
+r
+?
+
+O
+r
+
+d
+i
+d
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 129.36mm )" draw:z-index="20" svg:height="4.23mm" svg:width="161.92mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+
+m
+e
+a
+n
+
+t
+h
+a
+t
+
+o
+n
+e
+
+o
+f
+
+m
+a
+n
+y
+
+l
+a
+w
+
+o
+f
+f
+i
+c
+e
+r
+s
+
+i
+n
+
+t
+o
+w
+n
+
+w
+a
+s
+
+o
+n
+
+t
+o
+
+h
+i
+m
+
+a
+n
+d
+
+j
+u
+s
+t
+
+w
+a
+i
+t
+i
+n
+g
+
+t
+o
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 134.23mm )" draw:z-index="21" svg:height="4.23mm" svg:width="164.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+p
+o
+u
+n
+c
+e
+
+a
+n
+d
+
+s
+n
+a
+p
+
+t
+h
+o
+s
+e
+
+c
+u
+f
+f
+s
+
+o
+n
+
+h
+i
+s
+
+w
+r
+i
+s
+t
+s
+?
+
+H
+e
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+l
+o
+o
+k
+e
+d
+
+a
+l
+l
+
+a
+r
+o
+u
+n
+d
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 139.1mm )" draw:z-index="22" svg:height="4.23mm" svg:width="165.52mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+l
+e
+y
+.
+
+L
+i
+k
+e
+
+l
+i
+g
+h
+t
+n
+i
+n
+g
+
+h
+e
+
+d
+a
+r
+t
+e
+d
+
+o
+f
+f
+
+t
+o
+
+t
+h
+e
+
+l
+e
+f
+t
+
+a
+n
+d
+
+d
+i
+s
+a
+p
+p
+e
+a
+r
+e
+d
+
+b
+e
+t
+w
+e
+e
+n
+
+t
+h
+e
+
+t
+w
+o
+
+w
+a
+r
+e
+h
+o
+u
+s
+e
+s
+
+a
+l
+m
+o
+s
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 143.97mm )" draw:z-index="23" svg:height="4.23mm" svg:width="161.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+f
+a
+l
+l
+i
+n
+g
+
+o
+v
+e
+r
+
+t
+h
+e
+
+t
+r
+a
+s
+h
+
+c
+a
+n
+
+l
+y
+i
+n
+g
+
+i
+n
+
+t
+h
+e
+
+m
+i
+d
+d
+l
+e
+
+o
+f
+
+t
+h
+e
+
+s
+i
+d
+e
+w
+a
+l
+k
+.
+
+H
+e
+
+t
+r
+i
+e
+d
+
+t
+o
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+t
+a
+p
+
+h
+i
+s
+
+w
+a
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 148.83mm )" draw:z-index="24" svg:height="4.23mm" svg:width="168.27mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+o
+n
+g
+
+i
+n
+
+t
+h
+e
+
+i
+n
+k
+y
+
+d
+a
+r
+k
+n
+e
+s
+s
+
+a
+n
+d
+
+s
+u
+d
+d
+e
+n
+l
+y
+
+s
+t
+i
+f
+f
+e
+n
+e
+d
+:
+
+i
+t
+
+w
+a
+s
+
+a
+
+d
+e
+a
+d
+-
+e
+n
+d
+,
+
+h
+e
+
+w
+o
+u
+l
+d
+
+h
+a
+v
+e
+
+t
+o
+
+g
+o
+
+b
+a
+c
+k
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 153.7mm )" draw:z-index="25" svg:height="4.23mm" svg:width="161.39mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+w
+a
+y
+
+h
+e
+
+h
+a
+d
+
+c
+o
+m
+e
+.
+
+T
+h
+e
+
+s
+t
+e
+p
+s
+
+g
+o
+t
+
+l
+o
+u
+d
+e
+r
+
+a
+n
+d
+
+l
+o
+u
+d
+e
+r
+,
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+b
+l
+a
+c
+k
+
+o
+u
+t
+l
+i
+n
+e
+
+o
+f
+
+a
+
+f
+i
+g
+u
+r
+e
+
+c
+o
+m
+i
+n
+g
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 158.57mm )" draw:z-index="26" svg:height="4.23mm" svg:width="161.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+r
+o
+u
+n
+d
+
+t
+h
+e
+
+c
+o
+r
+n
+e
+r
+.
+
+I
+s
+
+t
+h
+i
+s
+
+t
+h
+e
+
+e
+n
+d
+
+o
+f
+
+t
+h
+e
+
+l
+i
+n
+e
+?
+
+h
+e
+
+t
+h
+o
+u
+g
+h
+t
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+b
+a
+c
+k
+
+a
+g
+a
+i
+n
+s
+t
+
+t
+h
+e
+
+w
+a
+l
+l
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 163.44mm )" draw:z-index="27" svg:height="4.23mm" svg:width="159.56mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+t
+r
+y
+i
+n
+g
+
+t
+o
+
+m
+a
+k
+e
+
+h
+i
+m
+s
+e
+l
+f
+
+i
+n
+v
+i
+s
+i
+b
+l
+e
+
+i
+n
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+w
+a
+s
+
+a
+l
+l
+
+t
+h
+a
+t
+
+p
+l
+a
+n
+n
+i
+n
+g
+
+a
+n
+d
+
+e
+n
+e
+r
+g
+y
+
+w
+a
+s
+t
+e
+d
+?
+
+H
+e
+
+w
+a
+s
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 168.31mm )" draw:z-index="28" svg:height="4.23mm" svg:width="164mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+d
+r
+i
+p
+p
+i
+n
+g
+
+w
+i
+t
+h
+
+s
+w
+e
+a
+t
+
+n
+o
+w
+,
+
+c
+o
+l
+d
+
+a
+n
+d
+
+w
+e
+t
+,
+
+h
+e
+
+c
+o
+u
+l
+d
+
+s
+m
+e
+l
+l
+
+t
+h
+e
+
+f
+e
+a
+r
+
+c
+o
+m
+i
+n
+g
+
+o
+f
+f
+
+h
+i
+s
+
+c
+l
+o
+t
+h
+e
+s
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 173.18mm )" draw:z-index="29" svg:height="4.23mm" svg:width="167mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+e
+x
+t
+
+t
+o
+
+h
+i
+m
+,
+
+w
+i
+t
+h
+
+a
+
+b
+a
+r
+e
+l
+y
+
+n
+o
+t
+i
+c
+e
+a
+b
+l
+e
+
+s
+q
+u
+e
+a
+k
+,
+
+a
+
+d
+o
+o
+r
+
+s
+w
+u
+n
+g
+
+q
+u
+i
+e
+t
+l
+y
+
+t
+o
+
+a
+n
+d
+
+f
+r
+o
+
+i
+n
+
+t
+h
+e
+
+n
+i
+g
+h
+t
+'
+s
+
+b
+r
+e
+e
+z
+e
+.
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 178.04mm )" draw:z-index="30" svg:height="4.23mm" svg:width="169.29mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+C
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+b
+e
+
+t
+h
+e
+
+h
+a
+v
+e
+n
+
+h
+e
+'
+d
+
+p
+r
+a
+y
+e
+d
+
+f
+o
+r
+?
+
+S
+l
+o
+w
+l
+y
+
+h
+e
+
+s
+l
+i
+d
+
+t
+o
+w
+a
+r
+d
+
+t
+h
+e
+
+d
+o
+o
+r
+,
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+m
+o
+r
+e
+
+a
+n
+d
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 182.91mm )" draw:z-index="31" svg:height="4.23mm" svg:width="146.82mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+m
+o
+r
+e
+
+i
+n
+t
+o
+
+t
+h
+e
+
+w
+a
+l
+l
+,
+
+i
+n
+t
+o
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+a
+w
+a
+y
+
+f
+r
+o
+m
+
+h
+i
+s
+
+e
+n
+e
+m
+y
+.
+
+W
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+d
+o
+o
+r
+
+s
+a
+v
+e
+
+h
+i
+s
+
+h
+i
+d
+e
+?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+</draw:page>
+</office:presentation>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/pictxt_pdfi_unittest_writer.xml b/sdext/source/pdfimport/test/testdocs/pictxt_pdfi_unittest_writer.xml
new file mode 100644
index 000000000..b64046a9f
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/pictxt_pdfi_unittest_writer.xml
@@ -0,0 +1,550 @@
+<?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 .
+ -->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="10mm" fo:margin-right="10mm" fo:margin-top="10mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:fill="none" draw:stroke="none" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Thorndale" fo:font-size="12pt" style:font-size-asian="12pt" style:font-size-complex="12pt" >
+
+</style:text-properties>
+
+</style:style>
+<style:style style:family="paragraph" style:master-page-name="master-page3" style:name="paragraph8" >
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:text >
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 92.56mm 31.82mm )" draw:z-index="32" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////////w8fiMlsdda7Bve7nBxuH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx8h79QX6pQX6pQX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Z3O1QX6pQX6plcrRYZ65QX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////19vrk5/Lg4/Ds7fb5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fjd4O/j5fFQX6pQX6qBjMK4vt1da7BQX6pVY6y/xeD////////////////////////////////////////////////////////////////////////////////////3+PvAxeCBjMJda7BaaK9YZ65RYKplcrSUncvHzOT5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6vR7hr9da7DT1+qOl8hQX6pQX6qOmMi+w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////////////X2ut1gbxQX6p1gby4vt3e4e/b3u6vtthda7BQX6pQX6qIksX8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vq4vt1QX6pQX6pgbrLM0eaIksVQX6pQX6qGkcS9w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////M0eZWZa1QX6qUncv8/P7////////////////O0udVY6xQX6p0gLv8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8vh2gr2gqNG2vNtRYKpQX6pda7DM0eaDjsNQX6pQX6qIksXBxuFWZa1QX6pRYKq+w9/////////////////////////////////////////////////////////////s7fZebLFQX6pjcbP19vr///////////////////////92gr1QX6qbpM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+UnctQX6pQX6qiqtKvtthRYKpQX6pkcbTHzOSBjMJQX6pQX6qMlsfAxeBda7BQX6pTYqzY2+z///////////////////////////////////////////////////////+krNNQX6pQX6qXoM3///////////////////////////+OmMhQX6rHzOT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7/ePmcm2vNxve7lQX6pQX6qiqtKvtthQX6pQX6plcrTJzeWMlsdQX6pQX6qIksW7wd5gbrKgqNGkrNO0u9v////////////////////////////////////////////////5+fxodbZQX6pQX6qmrdT///////////////////////////+VnstVY6zy8/n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fh4g71QX6ppdrbO0udve7lQX6pQX6qiqtK2vNtTYqtQX6pkcbTFyuOJk8ZQX6pQX6p/isHb3u2gqNFQX6pQX6q+w9/////////////////////////////////////////////o6vRVY6xQX6pQX6qDjcP///////////////////////////+Ol8hyfrv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z9PmAi8FQX6pQX6p/isHGy+PBxuFve7lQX6pQX6qpsdWutdhTYqtQX6pjcbPV2et9iMBQX6qYoc2ttNdRYKpQX6pjcbO4vt3JzuX////////////////////////////////////////m6PNVZK1QX6pQX6pWZa3h5PH///////////////////////+mrdSqsdb////////////s7fa0u9uXoM2zudr5+fz////////////////////////09frZ3O3X2+zg4/D////////////////////EyeKOmMiWn8zq7PX////////////////////e4e+vttidpc+0u9v39/v////////////////////////////////////////////////////v8PeBjMJQX6pQX6qIksW9w99YZ65xfbq9w99rd7dQX6pQX6qiqtKrstZVY6xQX6qao87y8/m2vNypsdVRYKpQX6plcrTEyeJ9iMBQX6qzudr8/P7////////////////////////////////09fpebLFQX6pQX6pQX6qDjsP8/P7////////////////////8/P7////////////Cx+FgbrJQX6pQX6pQX6q4vt3///////////////////////+KlMZSYatSYatrd7f5+fz////////z9PmKlMZQX6pQX6pQX6qgqNH////////////z9PmZos1QX6pQX6pQX6pQX6qXoM3////////////////////////////////////////////////v8Pd4g71QX6pQX6qMlsfAxeBda7BQX6pRYKrJzeXo6vRodbZQX6pQX6p9iMBWZa1QX6qMlsf///+utdhQX6pQX6prd7fFyuN/isFQX6pQX6qKlMb///////////////////////////////////////+KlMZQX6pQX6pQX6pQX6qiqtL///////////////////////////////+6wN1QX6pRYKpQX6pQX6pQX6qpsdX////////////////////c3+5SYatQX6pQX6qZos3////////v8Pd5hb5RYKpTYqtQX6pQX6qOl8j////////o6vRyfrtda7CZos56hb5QX6pQX6plcrT5+fz////////////////////////////////////////19vp5hb5QX6pQX6qIksXBxuFWZa1QX6pTYqzEyeL09frt7/bd4O9mc7VQX6pQX6pQX6pQX6q9w9+vtthQX6pQX6pkcbTM0eZ/isFQX6pQX6qMlsfz9Pno6vT19vr////////////////////////////////FyuNQX6pQX6pQX6pQX6pQX6qxt9n////////////////////////U1+pQX6q4vt2vtthQX6pQX6pQX6rO0uf///////////////////+iqtJQX6pQX6pSYavY2+z////8/P57hr9ib7Pb3u5pdrZQX6pQX6qkrNP////w8fhpdrZ4g73s7fb///+6wN1QX6pQX6pib7P39/v////////////////////////////////////19vqAi8FQX6pQX6qGkcS9w99da7BQX6pVY6y6wN2mrdRgbbJYZ66DjcPFyuN9iMBVY6xaaK+gqNGqsdZQX6pQX6pkcbTFyuN9iMBQX6pQX6qRmsnFyuNxfbpWZa1ndLW2vNv////////////////////////////5+fx2gr1QX6pQX6pQX6pQX6pWZa3M0eb////////////////z9Plmc7WgqNH///+PmclQX6pQX6pndLX39/v///////////////////9yfrtQX6pQX6pve7n8/P7///+krNNaaK/g4/Dy8/lYZ65QX6pQX6rFyuP5+fx2gr1+icD39/v///////+XoM1QX6pQX6p1gbz8/P7///////////////////////////////////+TnMtQX6pQX6qPmcm+w99da7BQX6pVY6y7wd6ao85QX6pQX6pQX6pQX6p2gr319vrg4/Dq7PXT1+pRYKpQX6pndLXFyuN9iMBQX6pQX6qSm8q7wd5YZ65QX6pQX6pQX6pRYKrX2uv////////////////////////////Y2+xVY6xQX6pQX6pQX6pQX6pgbbLj5fH///////////+gqNFxfbr8/P7s7fZYZ65QX6pQX6qgqNH////////////////////X2+xTYqtQX6pQX6qep9D////d4O9WZa3O0uf////FyuNQX6pQX6pWZa3s7faKlMZxfbr39/v////////5+fxodbZQX6pQX6qWn8z///////////////////////////////////////9YZ65QX6prd7ext9lda7BQX6pYZ67DyOKZos5QX6pQX6pwfLlyfrtQX6pQX6rg4/D///////+iqtJQX6pVY6yzudp/isFQX6pQX6qSm8q9w99YZ65QX6paaK+BjMJRYKpQX6qmrdT///////////////////////////////+2vNtQX6pQX6pQX6pQX6pQX6p2gr36+/3////h5PFebLHb3u3///+2vNxQX6pQX6pQX6rU1+r///////////////////+XoM1QX6pQX6pTYqvb3u3///+Zos6ao87///////+Zos5QX6pQX6qDjsOttNdmc7Xs7fb////////////FyuNQX6pQX6pQX6rJzeX///////////////////////////////////////9jcbNQX6pVY6xRYKpQX6pWZa26wN2gqNFQX6pQX6p2gr3JzeVyfrtQX6pWZa3x8vj///////+xt9lQX6pRYKpYZ65QX6pQX6qSm8rDyOJaaK9QX6pVZK26wN2VnstQX6pQX6q4vt3///////////////////////////////////+PmclQX6pQX6pQX6pQX6pQX6qttNf////Z3O20u9v////8/P54g71QX6pQX6preLf5+fz////////////////09fpkcbRQX6pQX6pve7n8/P7////h5PH39/v////3+PtodbZQX6pRYKqMlsdlcrTQ1Oj///////////////+GkcRQX6pQX6pjcbP19vr///////////////////////////////////////+6wN1QX6pQX6pQX6pWZa26wN2bpM9QX6pQX6p2gr3HzORyfrtQX6pQX6qpsdXO0uekrNO0u9vU1+prd7dQX6pQX6pQX6qTnMu7wd5aaK9QX6paaK++w9+VnstQX6pQX6pyfrv09fr////////////////////////////////////19vpwfLlQX6pQX6pQX6pQX6paaK/s7fb////////////Z3O1RYKpQX6pQX6qrstb///////////////////+xt9lQX6pQX6pQX6qep9D////////////////////U1+pRYKpQX6pSYatRYKqgqNH////////////////m6PNYZ65QX6pQX6qRmsn////////////////////////////////////////////////Gy+OOmMiTnMvO0ueZos5QX6pQX6p1gbzGy+NreLdQX6pQX6qkrNOpsdVRYKpQX6pQX6pwfLnFyuOgqNGMlse4vt29w99YZ65QX6paaK+9w9+Sm8pQX6pQX6p4g73o6vT////////////////////////////////////////////Z3O1YZ65QX6pQX6pQX6pQX6q/xeD///////////+gqNFQX6pQX6pVY6zh5PH////////////////09fpndLVQX6pQX6pSYavX2uv///////////////////+mrdRQX6pQX6pQX6pndLXz9Pn///////////////+ep9BQX6pQX6pQX6rO0uf////////////////////////////////////////////////////////6+/2bpM9QX6pQX6pwfLnLz+ZsebhQX6pQX6qgqNHq7PVVY6xQX6pSYatQX6pQX6psebju7/f////HzORVY6xQX6pVZK2+w9+Rm8pQX6pQX6pxfbrv8Pf///////////////////////////////////////////////////+XoM1QX6pQX6pQX6pQX6qkrNP////////39/tlcrRQX6pQX6qAi8H///////////////////+ep9BQX6pQX6pQX6pve7n8/P7////////////////6+/1ve7lQX6pQX6pQX6q9w9/////////////////x8vhebLFQX6pQX6pyfrv8/P7////////////////////////////////////////////////////////O0udQX6pQX6p2gr3Lz+ZxfbpQX6pQX6qYoc3////c3+5QX6pQX6qGkcSZos1QX6pQX6pwfLnh5PF2gr1QX6pYZ664vt2VnstQX6pQX6pwfLno6vT////////////////////V2euzudr////////////////////////////k5/JYZ65QX6pQX6pQX6qZos7////////O0udQX6pQX6pQX6q9w9/////////////////S1ulVZK1VY6xQX6pQX6qYoc3////////////////////Q1OhRYKpQX6pQX6pve7n3+Pv////////////////AxeBQX6pQX6pQX6qzudr////////////////////////////////////////////////////////////8/P6zudp4g73EyeJsebhQX6pQX6qkrNOpsdWDjsPs7fZodbZQX6paaK+2vNykrNNQX6pQX6preLe/xeB7hr+4vt2Wn8xQX6pQX6pxfbro6vT///////////////////////+Nl8hrd7f///////////////////////////////+DjcNQX6pQX6pQX6qiqtL///////+Zos1QX6pQX6pda7Dv8Pf////////////z9Plve7mRm8paaK9QX6pQX6rO0uf////8/P6ao87k5/L///+Yoc1QX6pQX6pRYKrJzeX///////////////////+Ai8FQX6pQX6pWZa3o6vT////S1umzudr////////////////////////////////////////////////////////o6vRsebhQX6pQX6qiqtLDyOJQX6pQX6qOmMjLz+ZebLFQX6pVY6y2vNyao85QX6pQX6pyfrvg4/CiqtJQX6pQX6pwfLnq7PX///////////////////////////9yfrt0gLv///////////////////////////////+ep9BQX6pQX6pQX6q/xeD////39/tlcrRQX6pQX6qPmcn///////////////+OmMiOl8ixt9lQX6pQX6pmc7X3+Pv////O0udaaK/x8vj8/P5sebhQX6pQX6pyfrv////////////////////k5/JVY6xQX6pQX6qJk8b////8/P5yfrukrNP///////////////////////////////////////////////////////////+qsdZSYauZos2zudq4vt2DjsNQX6pQX6qNl8jDyOJebLFQX6pVY6y2vNuao85QX6pQX6p0gLu9w99pdrZsebjq7PX////////////////////////////19vpYZ654g73///////////////////////////////+Zos1QX6pQX6paaK/s7fb////T1+pQX6pQX6pRYKrS1un///////////+rstZrd7f09fqAi8FQX6pQX6qZos3////3+PtsebittNf////U1+pRYKpQX6pQX6q4vt3///////////////////+0u9tQX6pQX6pQX6rHzOT///+zudppdrb3+Pv////////////////////////////////////////////////////////////////S1umkrNNQX6pebLG+w9+Fj8RQX6pQX6qMlsfDyOJebLFQX6pVY6y0u9uep9BQX6pQX6pwfLnFyuPo6vT////////////////////////////////Z3O1QX6psebj8/P7////////////////////////6+/1wfLlQX6pQX6qttNf///////+ttNdQX6pQX6ppdrb6+/3///////+ttNdda7Dg4/D39/taaK9QX6pQX6rEyeL///+Vnstyfrv8/P7///+bpM9QX6pQX6plcrT39/v///////////////////+BjMJQX6pQX6pib7P6+/3c3+5YZ67M0eb///////////////////////////////////////////////////////////////////////+zudpQX6pQX6pda7DDyOKAi8FQX6pQX6qNl8jHzORda7BQX6pTYqy7wd6ep9BQX6preLfq7PX///////////////////////////////////+7wd5QX6pWZa3q7PX////////////////////////EyeJQX6pQX6p8h7/8/P7///////+MlsdQX6pQX6qFj8T///////+nr9RWZa3Q1Oj////Z3O1SYatQX6pTYqve4e+2vNxTYqvf4vD////8/P5wfLlQX6pQX6qXoM3////////////////////x8vhaaK9QX6pQX6qPmcns7fZib7OTnMv///////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pjcbO/xeCAi8FQX6pQX6qRm8rGy+Nda7BQX6pTYqyss9erstbk5/L///////////////////////////////////////+mrdRQX6pQX6qkrNP////////////////////s7fZpdrZQX6pyfrvq7PX////////8/P52gr1QX6pQX6pjcbOss9d/isFebLHT1+r////////HzORQX6pQX6pTYqtwfLlTYqzCx+H////////a3e1TYqxQX6pRYKrQ1Oj////////////////////b3u1SYatQX6pQX6pgbrJda7CGkcTd4O+zudrJzeX///////////////////////////////////////////////////////////////////////////+vtthRYKpQX6pib7PDyOKFj8RQX6pQX6qKlMbFyuNaaK9QX6pyfrv8/P7////////////////////////////////////////////Z3O1ndLVQX6pQX6qZos7m6PP39/vx8vi/xeBjcbNQX6qOl8jv8Pf///////////////+DjcNQX6pQX6pQX6pQX6p1gbzh5PH////////////DyOJQX6pQX6pQX6pWZa2/xeD///////////+ep9BQX6pQX6pjcbP5+fz////////////////////Z3O1QX6pQX6pQX6pQX6qDjcP39/vX2+ypsdW9w9////////////////////////////////////////////////////////////////////////////////+4vt1QX6pQX6pda7C+w9+IksVRYKpQX6qzudrP0+h9iMDm6PP////////////////////////////////////////////////////v8Pe6wN2GkcRaaK9ebLFpdrZjcbNebLGOmMjS1un////////////////////////U1+ppdrZda7CBjMK/xeD6+/3////////////////k5/JlcrRWZa2Jk8be4e/////////////////P0+ipsdWnr9TJzeX////////////////////////39/uDjsNYZ65sebixuNn6+/3////u7/fW2evg4/D///////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pgbbKpsdVYZ65QX6qIksX////8/P7////////////////////////////////////////////////////////////////////09frd4O/Q1Oja3e3z9Pn////////////////////////////////////3+Pvz9Pn////////////////////////////////x8vjo6vT////////////////////////////////////////////////////////////////////8/P7s7fb5+fz///////////////////////////////////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pQX6pQX6pQX6qdpc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+0u9tYZ65QX6pQX6pve7no6vT////////////////////////////////////////////////////////////////////////////////////////////////X2+y4vt3////////////////////////////////////////////////////////////////////////////////////////////////b3u7Q1Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b3u6rsta4vt3y8/n////////////////////////////////////////////////////////////////////8/P7q7PXe4e/S1un5+fzQ1Ojk5/L////S1unZ3O3////////V2evS1un6+/3q7PXd4O/v8Pf////Q1OjZ3O3////////m6PPO0ufv8Pfj5fH////////j5fH////g4/DS1unx8viao86Rmsnm6PP////o6vTS1un5+fz////q7PXd4O/X2uv5+fzQ1Ojm6PP////5+fzQ1Ojk5/L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx5hb6iqtKVnsyDjsOutdh4g73t7/apsdWrstb///+ep9CiqtK6wN3y8/l7hr+Vnsvq7PWdpc+ttNeOmMi4vt3f4u+MlsfFyuPq7PWOmMjc3+7g4/CZos62vNyIksXO0ufq7PWPmcmGkcTZ3O3O0ueNl8iutdiUncv39/t4g72mrdSKlMaDjsOttNeFj8T09fqRm8qxt9nf4u/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/t6hb75+fzGy+OTnMv///+Fj8Tf4u/S1umss9fv8Pd/isH////////3+Pt6hb709frf4u+GkcT////u7/eGkcTd4O+Ai8G0u9v5+fy7wd6bpM+mrdTFyuPFyuN7hr/DyOL///+9w9+zudr///+Rm8qGkcSttNePmcnu7/d7hr/8/P60u9uSm8r///+Pmcnv8PeVnsyao87j5fH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vqBjML8/P6+w9+gqNH///+DjcPf4vDM0eaqsdbx8vh1gbz09fr6+/3z9PmJk8b6+/3g4/B7hr/8/P3Q1OiRmsn////t7/aMlsenr9T5+fxve7l5hb7y8/n////k5/J7hr/U1+q9w9+or9X///+VnsugqNH19vr5+fzz9PmFj8T///+vttigqNH///+Nl8jv8Pf8/P6+w997hr/5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/uZos78/P3Lz+axuNn///+ao87m6PPW2eu4vt3///+mrdSRmsmmrdTu7/eiqtL3+Pv///+iqtKXoM2Ol8jd4O/t7/aqsdaVnsvS1un///+VnsyVnsv////T1+qmrdSZos3v8Pfc3+6BjMLLz+bf4u+KlMamrdS+w9/19vqdpc////++w9+zudr///+krNPw8fi/xeCep9CxuNn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P3////8/P78/P7////8/P3////////8/P7////////x8vjz9Pn////8/P7////////////x8vj5+fz////8/P3u7/f3+Pv////39/uNl8jT1+r////3+Pvu7/f8/P7////////19vr19vr////8/P3v8Pf39/v////8/P3////8/P78/P7////8/P7////z9Pnx8vj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7faXoM2nr9T///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 31.99mm )" draw:z-index="0" svg:height="4.23mm" svg:width="163.08mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+He heard quiet steps behind him. That didn't bode well. Who could be following him this late at
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 36.86mm )" draw:z-index="1" svg:height="4.23mm" svg:width="165.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+night and in this deadbeat part of town? And at this particular moment, just after he pulled off the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 41.73mm )" draw:z-index="2" svg:height="4.23mm" svg:width="162.03mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+big time and was making off with the greenbacks. Was there another crook who'd had the same
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 46.6mm )" draw:z-index="3" svg:height="4.23mm" svg:width="167.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+idea, and was now watching him and waiting for a chance to grab the fruit of his labor? Or did the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 51.47mm )" draw:z-index="4" svg:height="4.23mm" svg:width="161.92mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+steps behind him mean that one of many law officers in town was on to him and just waiting to
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 56.34mm )" draw:z-index="5" svg:height="4.23mm" svg:width="164.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+pounce and snap those cuffs on his wrists? He nervously looked all around. Suddenly he saw the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 61.2mm )" draw:z-index="6" svg:height="4.23mm" svg:width="165.52mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+alley. Like lightning he darted off to the left and disappeared between the two warehouses almost
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 66.07mm )" draw:z-index="7" svg:height="4.23mm" svg:width="161.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+falling over the trash can lying in the middle of the sidewalk. He tried to nervously tap his way
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 70.94mm )" draw:z-index="8" svg:height="4.23mm" svg:width="168.27mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+along in the inky darkness and suddenly stiffened: it was a dead-end, he would have to go back the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 75.81mm )" draw:z-index="9" svg:height="4.23mm" svg:width="161.39mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+way he had come. The steps got louder and louder, he saw the black outline of a figure coming
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 80.68mm )" draw:z-index="10" svg:height="4.23mm" svg:width="161.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+around the corner. Is this the end of the line? he thought pressing himself back against the wall
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 85.55mm )" draw:z-index="11" svg:height="4.23mm" svg:width="159.56mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+trying to make himself invisible in the dark, was all that planning and energy wasted? He was
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 90.41mm )" draw:z-index="12" svg:height="4.23mm" svg:width="164mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+dripping with sweat now, cold and wet, he could smell the fear coming off his clothes. Suddenly
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 95.28mm )" draw:z-index="13" svg:height="4.23mm" svg:width="167mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+next to him, with a barely noticeable squeak, a door swung quietly to and fro in the night's breeze.
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 100.15mm )" draw:z-index="14" svg:height="4.23mm" svg:width="169.29mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+Could this be the haven he'd prayed for? Slowly he slid toward the door, pressing himself more and
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 105.02mm )" draw:z-index="15" svg:height="4.23mm" svg:width="146.82mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+more into the wall, into the dark, away from his enemy. Would this door save his hide?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 109.89mm )" draw:z-index="16" svg:height="4.23mm" svg:width="163.08mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+He heard quiet steps behind him. That didn't bode well. Who could be following him this late at
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 114.76mm )" draw:z-index="17" svg:height="4.23mm" svg:width="165.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+night and in this deadbeat part of town? And at this particular moment, just after he pulled off the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 119.62mm )" draw:z-index="18" svg:height="4.23mm" svg:width="162.03mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+big time and was making off with the greenbacks. Was there another crook who'd had the same
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 124.49mm )" draw:z-index="19" svg:height="4.23mm" svg:width="167.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+idea, and was now watching him and waiting for a chance to grab the fruit of his labor? Or did the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 129.36mm )" draw:z-index="20" svg:height="4.23mm" svg:width="161.92mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+steps behind him mean that one of many law officers in town was on to him and just waiting to
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 134.23mm )" draw:z-index="21" svg:height="4.23mm" svg:width="164.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+pounce and snap those cuffs on his wrists? He nervously looked all around. Suddenly he saw the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 139.1mm )" draw:z-index="22" svg:height="4.23mm" svg:width="165.52mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+alley. Like lightning he darted off to the left and disappeared between the two warehouses almost
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 143.97mm )" draw:z-index="23" svg:height="4.23mm" svg:width="161.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+falling over the trash can lying in the middle of the sidewalk. He tried to nervously tap his way
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 148.83mm )" draw:z-index="24" svg:height="4.23mm" svg:width="168.27mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+along in the inky darkness and suddenly stiffened: it was a dead-end, he would have to go back the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 153.7mm )" draw:z-index="25" svg:height="4.23mm" svg:width="161.39mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+way he had come. The steps got louder and louder, he saw the black outline of a figure coming
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 158.57mm )" draw:z-index="26" svg:height="4.23mm" svg:width="161.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+around the corner. Is this the end of the line? he thought pressing himself back against the wall
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 163.44mm )" draw:z-index="27" svg:height="4.23mm" svg:width="159.56mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+trying to make himself invisible in the dark, was all that planning and energy wasted? He was
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 168.31mm )" draw:z-index="28" svg:height="4.23mm" svg:width="164mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+dripping with sweat now, cold and wet, he could smell the fear coming off his clothes. Suddenly
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 173.18mm )" draw:z-index="29" svg:height="4.23mm" svg:width="167mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+next to him, with a barely noticeable squeak, a door swung quietly to and fro in the night's breeze.
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 178.04mm )" draw:z-index="30" svg:height="4.23mm" svg:width="169.29mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+Could this be the haven he'd prayed for? Slowly he slid toward the door, pressing himself more and
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 182.91mm )" draw:z-index="31" svg:height="4.23mm" svg:width="146.82mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+more into the wall, into the dark, away from his enemy. Would this door save his hide?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<text:p text:style-name="paragraph8" >
+</text:p>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 92.56mm 31.82mm )" draw:z-index="32" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////////w8fiMlsdda7Bve7nBxuH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx8h79QX6pQX6pQX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Z3O1QX6pQX6plcrRYZ65QX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////19vrk5/Lg4/Ds7fb5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fjd4O/j5fFQX6pQX6qBjMK4vt1da7BQX6pVY6y/xeD////////////////////////////////////////////////////////////////////////////////////3+PvAxeCBjMJda7BaaK9YZ65RYKplcrSUncvHzOT5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6vR7hr9da7DT1+qOl8hQX6pQX6qOmMi+w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////////////X2ut1gbxQX6p1gby4vt3e4e/b3u6vtthda7BQX6pQX6qIksX8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vq4vt1QX6pQX6pgbrLM0eaIksVQX6pQX6qGkcS9w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////M0eZWZa1QX6qUncv8/P7////////////////O0udVY6xQX6p0gLv8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8vh2gr2gqNG2vNtRYKpQX6pda7DM0eaDjsNQX6pQX6qIksXBxuFWZa1QX6pRYKq+w9/////////////////////////////////////////////////////////////s7fZebLFQX6pjcbP19vr///////////////////////92gr1QX6qbpM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+UnctQX6pQX6qiqtKvtthRYKpQX6pkcbTHzOSBjMJQX6pQX6qMlsfAxeBda7BQX6pTYqzY2+z///////////////////////////////////////////////////////+krNNQX6pQX6qXoM3///////////////////////////+OmMhQX6rHzOT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7/ePmcm2vNxve7lQX6pQX6qiqtKvtthQX6pQX6plcrTJzeWMlsdQX6pQX6qIksW7wd5gbrKgqNGkrNO0u9v////////////////////////////////////////////////5+fxodbZQX6pQX6qmrdT///////////////////////////+VnstVY6zy8/n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fh4g71QX6ppdrbO0udve7lQX6pQX6qiqtK2vNtTYqtQX6pkcbTFyuOJk8ZQX6pQX6p/isHb3u2gqNFQX6pQX6q+w9/////////////////////////////////////////////o6vRVY6xQX6pQX6qDjcP///////////////////////////+Ol8hyfrv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z9PmAi8FQX6pQX6p/isHGy+PBxuFve7lQX6pQX6qpsdWutdhTYqtQX6pjcbPV2et9iMBQX6qYoc2ttNdRYKpQX6pjcbO4vt3JzuX////////////////////////////////////////m6PNVZK1QX6pQX6pWZa3h5PH///////////////////////+mrdSqsdb////////////s7fa0u9uXoM2zudr5+fz////////////////////////09frZ3O3X2+zg4/D////////////////////EyeKOmMiWn8zq7PX////////////////////e4e+vttidpc+0u9v39/v////////////////////////////////////////////////////v8PeBjMJQX6pQX6qIksW9w99YZ65xfbq9w99rd7dQX6pQX6qiqtKrstZVY6xQX6qao87y8/m2vNypsdVRYKpQX6plcrTEyeJ9iMBQX6qzudr8/P7////////////////////////////////09fpebLFQX6pQX6pQX6qDjsP8/P7////////////////////8/P7////////////Cx+FgbrJQX6pQX6pQX6q4vt3///////////////////////+KlMZSYatSYatrd7f5+fz////////z9PmKlMZQX6pQX6pQX6qgqNH////////////z9PmZos1QX6pQX6pQX6pQX6qXoM3////////////////////////////////////////////////v8Pd4g71QX6pQX6qMlsfAxeBda7BQX6pRYKrJzeXo6vRodbZQX6pQX6p9iMBWZa1QX6qMlsf///+utdhQX6pQX6prd7fFyuN/isFQX6pQX6qKlMb///////////////////////////////////////+KlMZQX6pQX6pQX6pQX6qiqtL///////////////////////////////+6wN1QX6pRYKpQX6pQX6pQX6qpsdX////////////////////c3+5SYatQX6pQX6qZos3////////v8Pd5hb5RYKpTYqtQX6pQX6qOl8j////////o6vRyfrtda7CZos56hb5QX6pQX6plcrT5+fz////////////////////////////////////////19vp5hb5QX6pQX6qIksXBxuFWZa1QX6pTYqzEyeL09frt7/bd4O9mc7VQX6pQX6pQX6pQX6q9w9+vtthQX6pQX6pkcbTM0eZ/isFQX6pQX6qMlsfz9Pno6vT19vr////////////////////////////////FyuNQX6pQX6pQX6pQX6pQX6qxt9n////////////////////////U1+pQX6q4vt2vtthQX6pQX6pQX6rO0uf///////////////////+iqtJQX6pQX6pSYavY2+z////8/P57hr9ib7Pb3u5pdrZQX6pQX6qkrNP////w8fhpdrZ4g73s7fb///+6wN1QX6pQX6pib7P39/v////////////////////////////////////19vqAi8FQX6pQX6qGkcS9w99da7BQX6pVY6y6wN2mrdRgbbJYZ66DjcPFyuN9iMBVY6xaaK+gqNGqsdZQX6pQX6pkcbTFyuN9iMBQX6pQX6qRmsnFyuNxfbpWZa1ndLW2vNv////////////////////////////5+fx2gr1QX6pQX6pQX6pQX6pWZa3M0eb////////////////z9Plmc7WgqNH///+PmclQX6pQX6pndLX39/v///////////////////9yfrtQX6pQX6pve7n8/P7///+krNNaaK/g4/Dy8/lYZ65QX6pQX6rFyuP5+fx2gr1+icD39/v///////+XoM1QX6pQX6p1gbz8/P7///////////////////////////////////+TnMtQX6pQX6qPmcm+w99da7BQX6pVY6y7wd6ao85QX6pQX6pQX6pQX6p2gr319vrg4/Dq7PXT1+pRYKpQX6pndLXFyuN9iMBQX6pQX6qSm8q7wd5YZ65QX6pQX6pQX6pRYKrX2uv////////////////////////////Y2+xVY6xQX6pQX6pQX6pQX6pgbbLj5fH///////////+gqNFxfbr8/P7s7fZYZ65QX6pQX6qgqNH////////////////////X2+xTYqtQX6pQX6qep9D////d4O9WZa3O0uf////FyuNQX6pQX6pWZa3s7faKlMZxfbr39/v////////5+fxodbZQX6pQX6qWn8z///////////////////////////////////////9YZ65QX6prd7ext9lda7BQX6pYZ67DyOKZos5QX6pQX6pwfLlyfrtQX6pQX6rg4/D///////+iqtJQX6pVY6yzudp/isFQX6pQX6qSm8q9w99YZ65QX6paaK+BjMJRYKpQX6qmrdT///////////////////////////////+2vNtQX6pQX6pQX6pQX6pQX6p2gr36+/3////h5PFebLHb3u3///+2vNxQX6pQX6pQX6rU1+r///////////////////+XoM1QX6pQX6pTYqvb3u3///+Zos6ao87///////+Zos5QX6pQX6qDjsOttNdmc7Xs7fb////////////FyuNQX6pQX6pQX6rJzeX///////////////////////////////////////9jcbNQX6pVY6xRYKpQX6pWZa26wN2gqNFQX6pQX6p2gr3JzeVyfrtQX6pWZa3x8vj///////+xt9lQX6pRYKpYZ65QX6pQX6qSm8rDyOJaaK9QX6pVZK26wN2VnstQX6pQX6q4vt3///////////////////////////////////+PmclQX6pQX6pQX6pQX6pQX6qttNf////Z3O20u9v////8/P54g71QX6pQX6preLf5+fz////////////////09fpkcbRQX6pQX6pve7n8/P7////h5PH39/v////3+PtodbZQX6pRYKqMlsdlcrTQ1Oj///////////////+GkcRQX6pQX6pjcbP19vr///////////////////////////////////////+6wN1QX6pQX6pQX6pWZa26wN2bpM9QX6pQX6p2gr3HzORyfrtQX6pQX6qpsdXO0uekrNO0u9vU1+prd7dQX6pQX6pQX6qTnMu7wd5aaK9QX6paaK++w9+VnstQX6pQX6pyfrv09fr////////////////////////////////////19vpwfLlQX6pQX6pQX6pQX6paaK/s7fb////////////Z3O1RYKpQX6pQX6qrstb///////////////////+xt9lQX6pQX6pQX6qep9D////////////////////U1+pRYKpQX6pSYatRYKqgqNH////////////////m6PNYZ65QX6pQX6qRmsn////////////////////////////////////////////////Gy+OOmMiTnMvO0ueZos5QX6pQX6p1gbzGy+NreLdQX6pQX6qkrNOpsdVRYKpQX6pQX6pwfLnFyuOgqNGMlse4vt29w99YZ65QX6paaK+9w9+Sm8pQX6pQX6p4g73o6vT////////////////////////////////////////////Z3O1YZ65QX6pQX6pQX6pQX6q/xeD///////////+gqNFQX6pQX6pVY6zh5PH////////////////09fpndLVQX6pQX6pSYavX2uv///////////////////+mrdRQX6pQX6pQX6pndLXz9Pn///////////////+ep9BQX6pQX6pQX6rO0uf////////////////////////////////////////////////////////6+/2bpM9QX6pQX6pwfLnLz+ZsebhQX6pQX6qgqNHq7PVVY6xQX6pSYatQX6pQX6psebju7/f////HzORVY6xQX6pVZK2+w9+Rm8pQX6pQX6pxfbrv8Pf///////////////////////////////////////////////////+XoM1QX6pQX6pQX6pQX6qkrNP////////39/tlcrRQX6pQX6qAi8H///////////////////+ep9BQX6pQX6pQX6pve7n8/P7////////////////6+/1ve7lQX6pQX6pQX6q9w9/////////////////x8vhebLFQX6pQX6pyfrv8/P7////////////////////////////////////////////////////////O0udQX6pQX6p2gr3Lz+ZxfbpQX6pQX6qYoc3////c3+5QX6pQX6qGkcSZos1QX6pQX6pwfLnh5PF2gr1QX6pYZ664vt2VnstQX6pQX6pwfLno6vT////////////////////V2euzudr////////////////////////////k5/JYZ65QX6pQX6pQX6qZos7////////O0udQX6pQX6pQX6q9w9/////////////////S1ulVZK1VY6xQX6pQX6qYoc3////////////////////Q1OhRYKpQX6pQX6pve7n3+Pv////////////////AxeBQX6pQX6pQX6qzudr////////////////////////////////////////////////////////////8/P6zudp4g73EyeJsebhQX6pQX6qkrNOpsdWDjsPs7fZodbZQX6paaK+2vNykrNNQX6pQX6preLe/xeB7hr+4vt2Wn8xQX6pQX6pxfbro6vT///////////////////////+Nl8hrd7f///////////////////////////////+DjcNQX6pQX6pQX6qiqtL///////+Zos1QX6pQX6pda7Dv8Pf////////////z9Plve7mRm8paaK9QX6pQX6rO0uf////8/P6ao87k5/L///+Yoc1QX6pQX6pRYKrJzeX///////////////////+Ai8FQX6pQX6pWZa3o6vT////S1umzudr////////////////////////////////////////////////////////o6vRsebhQX6pQX6qiqtLDyOJQX6pQX6qOmMjLz+ZebLFQX6pVY6y2vNyao85QX6pQX6pyfrvg4/CiqtJQX6pQX6pwfLnq7PX///////////////////////////9yfrt0gLv///////////////////////////////+ep9BQX6pQX6pQX6q/xeD////39/tlcrRQX6pQX6qPmcn///////////////+OmMiOl8ixt9lQX6pQX6pmc7X3+Pv////O0udaaK/x8vj8/P5sebhQX6pQX6pyfrv////////////////////k5/JVY6xQX6pQX6qJk8b////8/P5yfrukrNP///////////////////////////////////////////////////////////+qsdZSYauZos2zudq4vt2DjsNQX6pQX6qNl8jDyOJebLFQX6pVY6y2vNuao85QX6pQX6p0gLu9w99pdrZsebjq7PX////////////////////////////19vpYZ654g73///////////////////////////////+Zos1QX6pQX6paaK/s7fb////T1+pQX6pQX6pRYKrS1un///////////+rstZrd7f09fqAi8FQX6pQX6qZos3////3+PtsebittNf////U1+pRYKpQX6pQX6q4vt3///////////////////+0u9tQX6pQX6pQX6rHzOT///+zudppdrb3+Pv////////////////////////////////////////////////////////////////S1umkrNNQX6pebLG+w9+Fj8RQX6pQX6qMlsfDyOJebLFQX6pVY6y0u9uep9BQX6pQX6pwfLnFyuPo6vT////////////////////////////////Z3O1QX6psebj8/P7////////////////////////6+/1wfLlQX6pQX6qttNf///////+ttNdQX6pQX6ppdrb6+/3///////+ttNdda7Dg4/D39/taaK9QX6pQX6rEyeL///+Vnstyfrv8/P7///+bpM9QX6pQX6plcrT39/v///////////////////+BjMJQX6pQX6pib7P6+/3c3+5YZ67M0eb///////////////////////////////////////////////////////////////////////+zudpQX6pQX6pda7DDyOKAi8FQX6pQX6qNl8jHzORda7BQX6pTYqy7wd6ep9BQX6preLfq7PX///////////////////////////////////+7wd5QX6pWZa3q7PX////////////////////////EyeJQX6pQX6p8h7/8/P7///////+MlsdQX6pQX6qFj8T///////+nr9RWZa3Q1Oj////Z3O1SYatQX6pTYqve4e+2vNxTYqvf4vD////8/P5wfLlQX6pQX6qXoM3////////////////////x8vhaaK9QX6pQX6qPmcns7fZib7OTnMv///////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pjcbO/xeCAi8FQX6pQX6qRm8rGy+Nda7BQX6pTYqyss9erstbk5/L///////////////////////////////////////+mrdRQX6pQX6qkrNP////////////////////s7fZpdrZQX6pyfrvq7PX////////8/P52gr1QX6pQX6pjcbOss9d/isFebLHT1+r////////HzORQX6pQX6pTYqtwfLlTYqzCx+H////////a3e1TYqxQX6pRYKrQ1Oj////////////////////b3u1SYatQX6pQX6pgbrJda7CGkcTd4O+zudrJzeX///////////////////////////////////////////////////////////////////////////+vtthRYKpQX6pib7PDyOKFj8RQX6pQX6qKlMbFyuNaaK9QX6pyfrv8/P7////////////////////////////////////////////Z3O1ndLVQX6pQX6qZos7m6PP39/vx8vi/xeBjcbNQX6qOl8jv8Pf///////////////+DjcNQX6pQX6pQX6pQX6p1gbzh5PH////////////DyOJQX6pQX6pQX6pWZa2/xeD///////////+ep9BQX6pQX6pjcbP5+fz////////////////////Z3O1QX6pQX6pQX6pQX6qDjcP39/vX2+ypsdW9w9////////////////////////////////////////////////////////////////////////////////+4vt1QX6pQX6pda7C+w9+IksVRYKpQX6qzudrP0+h9iMDm6PP////////////////////////////////////////////////////v8Pe6wN2GkcRaaK9ebLFpdrZjcbNebLGOmMjS1un////////////////////////U1+ppdrZda7CBjMK/xeD6+/3////////////////k5/JlcrRWZa2Jk8be4e/////////////////P0+ipsdWnr9TJzeX////////////////////////39/uDjsNYZ65sebixuNn6+/3////u7/fW2evg4/D///////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pgbbKpsdVYZ65QX6qIksX////8/P7////////////////////////////////////////////////////////////////////09frd4O/Q1Oja3e3z9Pn////////////////////////////////////3+Pvz9Pn////////////////////////////////x8vjo6vT////////////////////////////////////////////////////////////////////8/P7s7fb5+fz///////////////////////////////////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pQX6pQX6pQX6qdpc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+0u9tYZ65QX6pQX6pve7no6vT////////////////////////////////////////////////////////////////////////////////////////////////X2+y4vt3////////////////////////////////////////////////////////////////////////////////////////////////b3u7Q1Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b3u6rsta4vt3y8/n////////////////////////////////////////////////////////////////////8/P7q7PXe4e/S1un5+fzQ1Ojk5/L////S1unZ3O3////////V2evS1un6+/3q7PXd4O/v8Pf////Q1OjZ3O3////////m6PPO0ufv8Pfj5fH////////j5fH////g4/DS1unx8viao86Rmsnm6PP////o6vTS1un5+fz////q7PXd4O/X2uv5+fzQ1Ojm6PP////5+fzQ1Ojk5/L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx5hb6iqtKVnsyDjsOutdh4g73t7/apsdWrstb///+ep9CiqtK6wN3y8/l7hr+Vnsvq7PWdpc+ttNeOmMi4vt3f4u+MlsfFyuPq7PWOmMjc3+7g4/CZos62vNyIksXO0ufq7PWPmcmGkcTZ3O3O0ueNl8iutdiUncv39/t4g72mrdSKlMaDjsOttNeFj8T09fqRm8qxt9nf4u/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/t6hb75+fzGy+OTnMv///+Fj8Tf4u/S1umss9fv8Pd/isH////////3+Pt6hb709frf4u+GkcT////u7/eGkcTd4O+Ai8G0u9v5+fy7wd6bpM+mrdTFyuPFyuN7hr/DyOL///+9w9+zudr///+Rm8qGkcSttNePmcnu7/d7hr/8/P60u9uSm8r///+Pmcnv8PeVnsyao87j5fH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vqBjML8/P6+w9+gqNH///+DjcPf4vDM0eaqsdbx8vh1gbz09fr6+/3z9PmJk8b6+/3g4/B7hr/8/P3Q1OiRmsn////t7/aMlsenr9T5+fxve7l5hb7y8/n////k5/J7hr/U1+q9w9+or9X///+VnsugqNH19vr5+fzz9PmFj8T///+vttigqNH///+Nl8jv8Pf8/P6+w997hr/5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/uZos78/P3Lz+axuNn///+ao87m6PPW2eu4vt3///+mrdSRmsmmrdTu7/eiqtL3+Pv///+iqtKXoM2Ol8jd4O/t7/aqsdaVnsvS1un///+VnsyVnsv////T1+qmrdSZos3v8Pfc3+6BjMLLz+bf4u+KlMamrdS+w9/19vqdpc////++w9+zudr///+krNPw8fi/xeCep9CxuNn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P3////8/P78/P7////8/P3////////8/P7////////x8vjz9Pn////8/P7////////////x8vj5+fz////8/P3u7/f3+Pv////39/uNl8jT1+r////3+Pvu7/f8/P7////////19vr19vr////8/P3v8Pf39/v////8/P3////8/P78/P7////8/P7////z9Pnx8vj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7faXoM2nr9T///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 31.99mm )" draw:z-index="0" svg:height="4.23mm" svg:width="163.08mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 36.86mm )" draw:z-index="1" svg:height="4.23mm" svg:width="165.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 41.73mm )" draw:z-index="2" svg:height="4.23mm" svg:width="162.03mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 46.6mm )" draw:z-index="3" svg:height="4.23mm" svg:width="167.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 51.47mm )" draw:z-index="4" svg:height="4.23mm" svg:width="161.92mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 56.34mm )" draw:z-index="5" svg:height="4.23mm" svg:width="164.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 61.2mm )" draw:z-index="6" svg:height="4.23mm" svg:width="165.52mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 66.07mm )" draw:z-index="7" svg:height="4.23mm" svg:width="161.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 70.94mm )" draw:z-index="8" svg:height="4.23mm" svg:width="168.27mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 75.81mm )" draw:z-index="9" svg:height="4.23mm" svg:width="161.39mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 80.68mm )" draw:z-index="10" svg:height="4.23mm" svg:width="161.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 85.55mm )" draw:z-index="11" svg:height="4.23mm" svg:width="159.56mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 90.41mm )" draw:z-index="12" svg:height="4.23mm" svg:width="164mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 95.28mm )" draw:z-index="13" svg:height="4.23mm" svg:width="167mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 100.15mm )" draw:z-index="14" svg:height="4.23mm" svg:width="169.29mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 105.02mm )" draw:z-index="15" svg:height="4.23mm" svg:width="146.82mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 109.89mm )" draw:z-index="16" svg:height="4.23mm" svg:width="163.08mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 114.76mm )" draw:z-index="17" svg:height="4.23mm" svg:width="165.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 119.62mm )" draw:z-index="18" svg:height="4.23mm" svg:width="162.03mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 124.49mm )" draw:z-index="19" svg:height="4.23mm" svg:width="167.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 129.36mm )" draw:z-index="20" svg:height="4.23mm" svg:width="161.92mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 134.23mm )" draw:z-index="21" svg:height="4.23mm" svg:width="164.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 139.1mm )" draw:z-index="22" svg:height="4.23mm" svg:width="165.52mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 143.97mm )" draw:z-index="23" svg:height="4.23mm" svg:width="161.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 148.83mm )" draw:z-index="24" svg:height="4.23mm" svg:width="168.27mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 153.7mm )" draw:z-index="25" svg:height="4.23mm" svg:width="161.39mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 158.57mm )" draw:z-index="26" svg:height="4.23mm" svg:width="161.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 163.44mm )" draw:z-index="27" svg:height="4.23mm" svg:width="159.56mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 168.31mm )" draw:z-index="28" svg:height="4.23mm" svg:width="164mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 173.18mm )" draw:z-index="29" svg:height="4.23mm" svg:width="167mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 178.04mm )" draw:z-index="30" svg:height="4.23mm" svg:width="169.29mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 182.91mm )" draw:z-index="31" svg:height="4.23mm" svg:width="146.82mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+</office:text>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/tdf104597_textrun.pdf b/sdext/source/pdfimport/test/testdocs/tdf104597_textrun.pdf
new file mode 100644
index 000000000..dcee96aa3
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/tdf104597_textrun.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/testdocs/tdf78427-MyraidPro-Semibold-Light.pdf b/sdext/source/pdfimport/test/testdocs/tdf78427-MyraidPro-Semibold-Light.pdf
new file mode 100644
index 000000000..685da5db9
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/tdf78427-MyraidPro-Semibold-Light.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/testdocs/tdf78427-testFontFeatures.pdf b/sdext/source/pdfimport/test/testdocs/tdf78427-testFontFeatures.pdf
new file mode 100644
index 000000000..0405d95f8
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/tdf78427-testFontFeatures.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/testdocs/testSpace.pdf b/sdext/source/pdfimport/test/testdocs/testSpace.pdf
new file mode 100644
index 000000000..3c94f31ea
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/testSpace.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/testdocs/testTdf143959.pdf b/sdext/source/pdfimport/test/testdocs/testTdf143959.pdf
new file mode 100644
index 000000000..594e734a5
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/testTdf143959.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/testdocs/txtpic.pdf b/sdext/source/pdfimport/test/testdocs/txtpic.pdf
new file mode 100644
index 000000000..a81c9d25c
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/txtpic.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/testdocs/txtpic_pdfi_unittest_draw.xml b/sdext/source/pdfimport/test/testdocs/txtpic_pdfi_unittest_draw.xml
new file mode 100644
index 000000000..c4456003f
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/txtpic_pdfi_unittest_draw.xml
@@ -0,0 +1,3396 @@
+<?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 .
+ -->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="20mm" fo:margin-right="10mm" fo:margin-top="20mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:auto-grow-height="true" draw:auto-grow-width="true" draw:fill="none" draw:stroke="none" draw:textarea-horizontal-align="left" draw:textarea-vertical-align="top" fo:padding-bottom="0cm" fo:padding-left="0cm" fo:padding-right="0cm" fo:padding-top="0cm" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Thorndale" fo:font-size="12pt" style:font-size-asian="12pt" style:font-size-complex="12pt" >
+
+</style:text-properties>
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:drawing >
+<draw:page draw:master-page-name="master-page3" >
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 20.18mm )" draw:z-index="0" svg:height="4.23mm" svg:width="163.08mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+H
+e
+
+h
+e
+a
+r
+d
+
+q
+u
+i
+e
+t
+
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+.
+
+T
+h
+a
+t
+
+d
+i
+d
+n
+'
+t
+
+b
+o
+d
+e
+
+w
+e
+l
+l
+.
+
+W
+h
+o
+
+c
+o
+u
+l
+d
+
+b
+e
+
+f
+o
+l
+l
+o
+w
+i
+n
+g
+
+h
+i
+m
+
+t
+h
+i
+s
+
+l
+a
+t
+e
+
+a
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 25.05mm )" draw:z-index="1" svg:height="4.23mm" svg:width="165.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+i
+g
+h
+t
+
+a
+n
+d
+
+i
+n
+
+t
+h
+i
+s
+
+d
+e
+a
+d
+b
+e
+a
+t
+
+p
+a
+r
+t
+
+o
+f
+
+t
+o
+w
+n
+?
+
+A
+n
+d
+
+a
+t
+
+t
+h
+i
+s
+
+p
+a
+r
+t
+i
+c
+u
+l
+a
+r
+
+m
+o
+m
+e
+n
+t
+,
+
+j
+u
+s
+t
+
+a
+f
+t
+e
+r
+
+h
+e
+
+p
+u
+l
+l
+e
+d
+
+o
+f
+f
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 29.91mm )" draw:z-index="2" svg:height="4.23mm" svg:width="162.03mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+i
+g
+
+t
+i
+m
+e
+
+a
+n
+d
+
+w
+a
+s
+
+m
+a
+k
+i
+n
+g
+
+o
+f
+f
+
+w
+i
+t
+h
+
+t
+h
+e
+
+g
+r
+e
+e
+n
+b
+a
+c
+k
+s
+.
+
+W
+a
+s
+
+t
+h
+e
+r
+e
+
+a
+n
+o
+t
+h
+e
+r
+
+c
+r
+o
+o
+k
+
+w
+h
+o
+'
+d
+
+h
+a
+d
+
+t
+h
+e
+
+s
+a
+m
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 34.78mm )" draw:z-index="3" svg:height="4.23mm" svg:width="167.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+i
+d
+e
+a
+,
+
+a
+n
+d
+
+w
+a
+s
+
+n
+o
+w
+
+w
+a
+t
+c
+h
+i
+n
+g
+
+h
+i
+m
+
+a
+n
+d
+
+w
+a
+i
+t
+i
+n
+g
+
+f
+o
+r
+
+a
+
+c
+h
+a
+n
+c
+e
+
+t
+o
+
+g
+r
+a
+b
+
+t
+h
+e
+
+f
+r
+u
+i
+t
+
+o
+f
+
+h
+i
+s
+
+l
+a
+b
+o
+r
+?
+
+O
+r
+
+d
+i
+d
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 39.65mm )" draw:z-index="4" svg:height="4.23mm" svg:width="161.92mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+
+m
+e
+a
+n
+
+t
+h
+a
+t
+
+o
+n
+e
+
+o
+f
+
+m
+a
+n
+y
+
+l
+a
+w
+
+o
+f
+f
+i
+c
+e
+r
+s
+
+i
+n
+
+t
+o
+w
+n
+
+w
+a
+s
+
+o
+n
+
+t
+o
+
+h
+i
+m
+
+a
+n
+d
+
+j
+u
+s
+t
+
+w
+a
+i
+t
+i
+n
+g
+
+t
+o
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 44.52mm )" draw:z-index="5" svg:height="4.23mm" svg:width="164.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+p
+o
+u
+n
+c
+e
+
+a
+n
+d
+
+s
+n
+a
+p
+
+t
+h
+o
+s
+e
+
+c
+u
+f
+f
+s
+
+o
+n
+
+h
+i
+s
+
+w
+r
+i
+s
+t
+s
+?
+
+H
+e
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+l
+o
+o
+k
+e
+d
+
+a
+l
+l
+
+a
+r
+o
+u
+n
+d
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 49.39mm )" draw:z-index="6" svg:height="4.23mm" svg:width="165.52mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+l
+e
+y
+.
+
+L
+i
+k
+e
+
+l
+i
+g
+h
+t
+n
+i
+n
+g
+
+h
+e
+
+d
+a
+r
+t
+e
+d
+
+o
+f
+f
+
+t
+o
+
+t
+h
+e
+
+l
+e
+f
+t
+
+a
+n
+d
+
+d
+i
+s
+a
+p
+p
+e
+a
+r
+e
+d
+
+b
+e
+t
+w
+e
+e
+n
+
+t
+h
+e
+
+t
+w
+o
+
+w
+a
+r
+e
+h
+o
+u
+s
+e
+s
+
+a
+l
+m
+o
+s
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 54.26mm )" draw:z-index="7" svg:height="4.23mm" svg:width="161.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+f
+a
+l
+l
+i
+n
+g
+
+o
+v
+e
+r
+
+t
+h
+e
+
+t
+r
+a
+s
+h
+
+c
+a
+n
+
+l
+y
+i
+n
+g
+
+i
+n
+
+t
+h
+e
+
+m
+i
+d
+d
+l
+e
+
+o
+f
+
+t
+h
+e
+
+s
+i
+d
+e
+w
+a
+l
+k
+.
+
+H
+e
+
+t
+r
+i
+e
+d
+
+t
+o
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+t
+a
+p
+
+h
+i
+s
+
+w
+a
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 59.12mm )" draw:z-index="8" svg:height="4.23mm" svg:width="168.27mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+o
+n
+g
+
+i
+n
+
+t
+h
+e
+
+i
+n
+k
+y
+
+d
+a
+r
+k
+n
+e
+s
+s
+
+a
+n
+d
+
+s
+u
+d
+d
+e
+n
+l
+y
+
+s
+t
+i
+f
+f
+e
+n
+e
+d
+:
+
+i
+t
+
+w
+a
+s
+
+a
+
+d
+e
+a
+d
+-
+e
+n
+d
+,
+
+h
+e
+
+w
+o
+u
+l
+d
+
+h
+a
+v
+e
+
+t
+o
+
+g
+o
+
+b
+a
+c
+k
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 63.99mm )" draw:z-index="9" svg:height="4.23mm" svg:width="161.39mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+w
+a
+y
+
+h
+e
+
+h
+a
+d
+
+c
+o
+m
+e
+.
+
+T
+h
+e
+
+s
+t
+e
+p
+s
+
+g
+o
+t
+
+l
+o
+u
+d
+e
+r
+
+a
+n
+d
+
+l
+o
+u
+d
+e
+r
+,
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+b
+l
+a
+c
+k
+
+o
+u
+t
+l
+i
+n
+e
+
+o
+f
+
+a
+
+f
+i
+g
+u
+r
+e
+
+c
+o
+m
+i
+n
+g
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 68.86mm )" draw:z-index="10" svg:height="4.23mm" svg:width="161.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+r
+o
+u
+n
+d
+
+t
+h
+e
+
+c
+o
+r
+n
+e
+r
+.
+
+I
+s
+
+t
+h
+i
+s
+
+t
+h
+e
+
+e
+n
+d
+
+o
+f
+
+t
+h
+e
+
+l
+i
+n
+e
+?
+
+h
+e
+
+t
+h
+o
+u
+g
+h
+t
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+b
+a
+c
+k
+
+a
+g
+a
+i
+n
+s
+t
+
+t
+h
+e
+
+w
+a
+l
+l
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 73.73mm )" draw:z-index="11" svg:height="4.23mm" svg:width="159.56mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+t
+r
+y
+i
+n
+g
+
+t
+o
+
+m
+a
+k
+e
+
+h
+i
+m
+s
+e
+l
+f
+
+i
+n
+v
+i
+s
+i
+b
+l
+e
+
+i
+n
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+w
+a
+s
+
+a
+l
+l
+
+t
+h
+a
+t
+
+p
+l
+a
+n
+n
+i
+n
+g
+
+a
+n
+d
+
+e
+n
+e
+r
+g
+y
+
+w
+a
+s
+t
+e
+d
+?
+
+H
+e
+
+w
+a
+s
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 78.6mm )" draw:z-index="12" svg:height="4.23mm" svg:width="164mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+d
+r
+i
+p
+p
+i
+n
+g
+
+w
+i
+t
+h
+
+s
+w
+e
+a
+t
+
+n
+o
+w
+,
+
+c
+o
+l
+d
+
+a
+n
+d
+
+w
+e
+t
+,
+
+h
+e
+
+c
+o
+u
+l
+d
+
+s
+m
+e
+l
+l
+
+t
+h
+e
+
+f
+e
+a
+r
+
+c
+o
+m
+i
+n
+g
+
+o
+f
+f
+
+h
+i
+s
+
+c
+l
+o
+t
+h
+e
+s
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 83.47mm )" draw:z-index="13" svg:height="4.23mm" svg:width="167mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+e
+x
+t
+
+t
+o
+
+h
+i
+m
+,
+
+w
+i
+t
+h
+
+a
+
+b
+a
+r
+e
+l
+y
+
+n
+o
+t
+i
+c
+e
+a
+b
+l
+e
+
+s
+q
+u
+e
+a
+k
+,
+
+a
+
+d
+o
+o
+r
+
+s
+w
+u
+n
+g
+
+q
+u
+i
+e
+t
+l
+y
+
+t
+o
+
+a
+n
+d
+
+f
+r
+o
+
+i
+n
+
+t
+h
+e
+
+n
+i
+g
+h
+t
+'
+s
+
+b
+r
+e
+e
+z
+e
+.
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 88.33mm )" draw:z-index="14" svg:height="4.23mm" svg:width="169.29mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+C
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+b
+e
+
+t
+h
+e
+
+h
+a
+v
+e
+n
+
+h
+e
+'
+d
+
+p
+r
+a
+y
+e
+d
+
+f
+o
+r
+?
+
+S
+l
+o
+w
+l
+y
+
+h
+e
+
+s
+l
+i
+d
+
+t
+o
+w
+a
+r
+d
+
+t
+h
+e
+
+d
+o
+o
+r
+,
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+m
+o
+r
+e
+
+a
+n
+d
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 93.2mm )" draw:z-index="15" svg:height="4.23mm" svg:width="146.82mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+m
+o
+r
+e
+
+i
+n
+t
+o
+
+t
+h
+e
+
+w
+a
+l
+l
+,
+
+i
+n
+t
+o
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+a
+w
+a
+y
+
+f
+r
+o
+m
+
+h
+i
+s
+
+e
+n
+e
+m
+y
+.
+
+W
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+d
+o
+o
+r
+
+s
+a
+v
+e
+
+h
+i
+s
+
+h
+i
+d
+e
+?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 98.07mm )" draw:z-index="16" svg:height="4.23mm" svg:width="163.08mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+H
+e
+
+h
+e
+a
+r
+d
+
+q
+u
+i
+e
+t
+
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+.
+
+T
+h
+a
+t
+
+d
+i
+d
+n
+'
+t
+
+b
+o
+d
+e
+
+w
+e
+l
+l
+.
+
+W
+h
+o
+
+c
+o
+u
+l
+d
+
+b
+e
+
+f
+o
+l
+l
+o
+w
+i
+n
+g
+
+h
+i
+m
+
+t
+h
+i
+s
+
+l
+a
+t
+e
+
+a
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 102.94mm )" draw:z-index="17" svg:height="4.23mm" svg:width="165.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+i
+g
+h
+t
+
+a
+n
+d
+
+i
+n
+
+t
+h
+i
+s
+
+d
+e
+a
+d
+b
+e
+a
+t
+
+p
+a
+r
+t
+
+o
+f
+
+t
+o
+w
+n
+?
+
+A
+n
+d
+
+a
+t
+
+t
+h
+i
+s
+
+p
+a
+r
+t
+i
+c
+u
+l
+a
+r
+
+m
+o
+m
+e
+n
+t
+,
+
+j
+u
+s
+t
+
+a
+f
+t
+e
+r
+
+h
+e
+
+p
+u
+l
+l
+e
+d
+
+o
+f
+f
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 107.81mm )" draw:z-index="18" svg:height="4.23mm" svg:width="162.03mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+i
+g
+
+t
+i
+m
+e
+
+a
+n
+d
+
+w
+a
+s
+
+m
+a
+k
+i
+n
+g
+
+o
+f
+f
+
+w
+i
+t
+h
+
+t
+h
+e
+
+g
+r
+e
+e
+n
+b
+a
+c
+k
+s
+.
+
+W
+a
+s
+
+t
+h
+e
+r
+e
+
+a
+n
+o
+t
+h
+e
+r
+
+c
+r
+o
+o
+k
+
+w
+h
+o
+'
+d
+
+h
+a
+d
+
+t
+h
+e
+
+s
+a
+m
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 112.68mm )" draw:z-index="19" svg:height="4.23mm" svg:width="167.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+i
+d
+e
+a
+,
+
+a
+n
+d
+
+w
+a
+s
+
+n
+o
+w
+
+w
+a
+t
+c
+h
+i
+n
+g
+
+h
+i
+m
+
+a
+n
+d
+
+w
+a
+i
+t
+i
+n
+g
+
+f
+o
+r
+
+a
+
+c
+h
+a
+n
+c
+e
+
+t
+o
+
+g
+r
+a
+b
+
+t
+h
+e
+
+f
+r
+u
+i
+t
+
+o
+f
+
+h
+i
+s
+
+l
+a
+b
+o
+r
+?
+
+O
+r
+
+d
+i
+d
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 117.54mm )" draw:z-index="20" svg:height="4.23mm" svg:width="161.92mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+
+m
+e
+a
+n
+
+t
+h
+a
+t
+
+o
+n
+e
+
+o
+f
+
+m
+a
+n
+y
+
+l
+a
+w
+
+o
+f
+f
+i
+c
+e
+r
+s
+
+i
+n
+
+t
+o
+w
+n
+
+w
+a
+s
+
+o
+n
+
+t
+o
+
+h
+i
+m
+
+a
+n
+d
+
+j
+u
+s
+t
+
+w
+a
+i
+t
+i
+n
+g
+
+t
+o
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 122.41mm )" draw:z-index="21" svg:height="4.23mm" svg:width="164.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+p
+o
+u
+n
+c
+e
+
+a
+n
+d
+
+s
+n
+a
+p
+
+t
+h
+o
+s
+e
+
+c
+u
+f
+f
+s
+
+o
+n
+
+h
+i
+s
+
+w
+r
+i
+s
+t
+s
+?
+
+H
+e
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+l
+o
+o
+k
+e
+d
+
+a
+l
+l
+
+a
+r
+o
+u
+n
+d
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 127.28mm )" draw:z-index="22" svg:height="4.23mm" svg:width="165.52mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+l
+e
+y
+.
+
+L
+i
+k
+e
+
+l
+i
+g
+h
+t
+n
+i
+n
+g
+
+h
+e
+
+d
+a
+r
+t
+e
+d
+
+o
+f
+f
+
+t
+o
+
+t
+h
+e
+
+l
+e
+f
+t
+
+a
+n
+d
+
+d
+i
+s
+a
+p
+p
+e
+a
+r
+e
+d
+
+b
+e
+t
+w
+e
+e
+n
+
+t
+h
+e
+
+t
+w
+o
+
+w
+a
+r
+e
+h
+o
+u
+s
+e
+s
+
+a
+l
+m
+o
+s
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 132.15mm )" draw:z-index="23" svg:height="4.23mm" svg:width="161.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+f
+a
+l
+l
+i
+n
+g
+
+o
+v
+e
+r
+
+t
+h
+e
+
+t
+r
+a
+s
+h
+
+c
+a
+n
+
+l
+y
+i
+n
+g
+
+i
+n
+
+t
+h
+e
+
+m
+i
+d
+d
+l
+e
+
+o
+f
+
+t
+h
+e
+
+s
+i
+d
+e
+w
+a
+l
+k
+.
+
+H
+e
+
+t
+r
+i
+e
+d
+
+t
+o
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+t
+a
+p
+
+h
+i
+s
+
+w
+a
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 137.02mm )" draw:z-index="24" svg:height="4.23mm" svg:width="168.27mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+o
+n
+g
+
+i
+n
+
+t
+h
+e
+
+i
+n
+k
+y
+
+d
+a
+r
+k
+n
+e
+s
+s
+
+a
+n
+d
+
+s
+u
+d
+d
+e
+n
+l
+y
+
+s
+t
+i
+f
+f
+e
+n
+e
+d
+:
+
+i
+t
+
+w
+a
+s
+
+a
+
+d
+e
+a
+d
+-
+e
+n
+d
+,
+
+h
+e
+
+w
+o
+u
+l
+d
+
+h
+a
+v
+e
+
+t
+o
+
+g
+o
+
+b
+a
+c
+k
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 141.89mm )" draw:z-index="25" svg:height="4.23mm" svg:width="161.39mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+w
+a
+y
+
+h
+e
+
+h
+a
+d
+
+c
+o
+m
+e
+.
+
+T
+h
+e
+
+s
+t
+e
+p
+s
+
+g
+o
+t
+
+l
+o
+u
+d
+e
+r
+
+a
+n
+d
+
+l
+o
+u
+d
+e
+r
+,
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+b
+l
+a
+c
+k
+
+o
+u
+t
+l
+i
+n
+e
+
+o
+f
+
+a
+
+f
+i
+g
+u
+r
+e
+
+c
+o
+m
+i
+n
+g
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 146.75mm )" draw:z-index="26" svg:height="4.23mm" svg:width="161.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+r
+o
+u
+n
+d
+
+t
+h
+e
+
+c
+o
+r
+n
+e
+r
+.
+
+I
+s
+
+t
+h
+i
+s
+
+t
+h
+e
+
+e
+n
+d
+
+o
+f
+
+t
+h
+e
+
+l
+i
+n
+e
+?
+
+h
+e
+
+t
+h
+o
+u
+g
+h
+t
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+b
+a
+c
+k
+
+a
+g
+a
+i
+n
+s
+t
+
+t
+h
+e
+
+w
+a
+l
+l
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 151.62mm )" draw:z-index="27" svg:height="4.23mm" svg:width="159.56mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+t
+r
+y
+i
+n
+g
+
+t
+o
+
+m
+a
+k
+e
+
+h
+i
+m
+s
+e
+l
+f
+
+i
+n
+v
+i
+s
+i
+b
+l
+e
+
+i
+n
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+w
+a
+s
+
+a
+l
+l
+
+t
+h
+a
+t
+
+p
+l
+a
+n
+n
+i
+n
+g
+
+a
+n
+d
+
+e
+n
+e
+r
+g
+y
+
+w
+a
+s
+t
+e
+d
+?
+
+H
+e
+
+w
+a
+s
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 156.49mm )" draw:z-index="28" svg:height="4.23mm" svg:width="164mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+d
+r
+i
+p
+p
+i
+n
+g
+
+w
+i
+t
+h
+
+s
+w
+e
+a
+t
+
+n
+o
+w
+,
+
+c
+o
+l
+d
+
+a
+n
+d
+
+w
+e
+t
+,
+
+h
+e
+
+c
+o
+u
+l
+d
+
+s
+m
+e
+l
+l
+
+t
+h
+e
+
+f
+e
+a
+r
+
+c
+o
+m
+i
+n
+g
+
+o
+f
+f
+
+h
+i
+s
+
+c
+l
+o
+t
+h
+e
+s
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 161.36mm )" draw:z-index="29" svg:height="4.23mm" svg:width="167mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+e
+x
+t
+
+t
+o
+
+h
+i
+m
+,
+
+w
+i
+t
+h
+
+a
+
+b
+a
+r
+e
+l
+y
+
+n
+o
+t
+i
+c
+e
+a
+b
+l
+e
+
+s
+q
+u
+e
+a
+k
+,
+
+a
+
+d
+o
+o
+r
+
+s
+w
+u
+n
+g
+
+q
+u
+i
+e
+t
+l
+y
+
+t
+o
+
+a
+n
+d
+
+f
+r
+o
+
+i
+n
+
+t
+h
+e
+
+n
+i
+g
+h
+t
+'
+s
+
+b
+r
+e
+e
+z
+e
+.
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 166.23mm )" draw:z-index="30" svg:height="4.23mm" svg:width="169.29mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+C
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+b
+e
+
+t
+h
+e
+
+h
+a
+v
+e
+n
+
+h
+e
+'
+d
+
+p
+r
+a
+y
+e
+d
+
+f
+o
+r
+?
+
+S
+l
+o
+w
+l
+y
+
+h
+e
+
+s
+l
+i
+d
+
+t
+o
+w
+a
+r
+d
+
+t
+h
+e
+
+d
+o
+o
+r
+,
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+m
+o
+r
+e
+
+a
+n
+d
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 171.1mm )" draw:z-index="31" svg:height="4.23mm" svg:width="146.82mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+m
+o
+r
+e
+
+i
+n
+t
+o
+
+t
+h
+e
+
+w
+a
+l
+l
+,
+
+i
+n
+t
+o
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+a
+w
+a
+y
+
+f
+r
+o
+m
+
+h
+i
+s
+
+e
+n
+e
+m
+y
+.
+
+W
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+d
+o
+o
+r
+
+s
+a
+v
+e
+
+h
+i
+s
+
+h
+i
+d
+e
+?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 94.4mm 192.51mm )" draw:z-index="32" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////////w8fiMlsdda7Bve7nBxuH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx8h79QX6pQX6pQX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Z3O1QX6pQX6plcrRYZ65QX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////19vrk5/Lg4/Ds7fb5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fjd4O/j5fFQX6pQX6qBjMK4vt1da7BQX6pVY6y/xeD////////////////////////////////////////////////////////////////////////////////////3+PvAxeCBjMJda7BaaK9YZ65RYKplcrSUncvHzOT5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6vR7hr9da7DT1+qOl8hQX6pQX6qOmMi+w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////////////X2ut1gbxQX6p1gby4vt3e4e/b3u6vtthda7BQX6pQX6qIksX8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vq4vt1QX6pQX6pgbrLM0eaIksVQX6pQX6qGkcS9w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////M0eZWZa1QX6qUncv8/P7////////////////O0udVY6xQX6p0gLv8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8vh2gr2gqNG2vNtRYKpQX6pda7DM0eaDjsNQX6pQX6qIksXBxuFWZa1QX6pRYKq+w9/////////////////////////////////////////////////////////////s7fZebLFQX6pjcbP19vr///////////////////////92gr1QX6qbpM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+UnctQX6pQX6qiqtKvtthRYKpQX6pkcbTHzOSBjMJQX6pQX6qMlsfAxeBda7BQX6pTYqzY2+z///////////////////////////////////////////////////////+krNNQX6pQX6qXoM3///////////////////////////+OmMhQX6rHzOT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7/ePmcm2vNxve7lQX6pQX6qiqtKvtthQX6pQX6plcrTJzeWMlsdQX6pQX6qIksW7wd5gbrKgqNGkrNO0u9v////////////////////////////////////////////////5+fxodbZQX6pQX6qmrdT///////////////////////////+VnstVY6zy8/n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fh4g71QX6ppdrbO0udve7lQX6pQX6qiqtK2vNtTYqtQX6pkcbTFyuOJk8ZQX6pQX6p/isHb3u2gqNFQX6pQX6q+w9/////////////////////////////////////////////o6vRVY6xQX6pQX6qDjcP///////////////////////////+Ol8hyfrv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z9PmAi8FQX6pQX6p/isHGy+PBxuFve7lQX6pQX6qpsdWutdhTYqtQX6pjcbPV2et9iMBQX6qYoc2ttNdRYKpQX6pjcbO4vt3JzuX////////////////////////////////////////m6PNVZK1QX6pQX6pWZa3h5PH///////////////////////+mrdSqsdb////////////s7fa0u9uXoM2zudr5+fz////////////////////////09frZ3O3X2+zg4/D////////////////////EyeKOmMiWn8zq7PX////////////////////e4e+vttidpc+0u9v39/v////////////////////////////////////////////////////v8PeBjMJQX6pQX6qIksW9w99YZ65xfbq9w99rd7dQX6pQX6qiqtKrstZVY6xQX6qao87y8/m2vNypsdVRYKpQX6plcrTEyeJ9iMBQX6qzudr8/P7////////////////////////////////09fpebLFQX6pQX6pQX6qDjsP8/P7////////////////////8/P7////////////Cx+FgbrJQX6pQX6pQX6q4vt3///////////////////////+KlMZSYatSYatrd7f5+fz////////z9PmKlMZQX6pQX6pQX6qgqNH////////////z9PmZos1QX6pQX6pQX6pQX6qXoM3////////////////////////////////////////////////v8Pd4g71QX6pQX6qMlsfAxeBda7BQX6pRYKrJzeXo6vRodbZQX6pQX6p9iMBWZa1QX6qMlsf///+utdhQX6pQX6prd7fFyuN/isFQX6pQX6qKlMb///////////////////////////////////////+KlMZQX6pQX6pQX6pQX6qiqtL///////////////////////////////+6wN1QX6pRYKpQX6pQX6pQX6qpsdX////////////////////c3+5SYatQX6pQX6qZos3////////v8Pd5hb5RYKpTYqtQX6pQX6qOl8j////////o6vRyfrtda7CZos56hb5QX6pQX6plcrT5+fz////////////////////////////////////////19vp5hb5QX6pQX6qIksXBxuFWZa1QX6pTYqzEyeL09frt7/bd4O9mc7VQX6pQX6pQX6pQX6q9w9+vtthQX6pQX6pkcbTM0eZ/isFQX6pQX6qMlsfz9Pno6vT19vr////////////////////////////////FyuNQX6pQX6pQX6pQX6pQX6qxt9n////////////////////////U1+pQX6q4vt2vtthQX6pQX6pQX6rO0uf///////////////////+iqtJQX6pQX6pSYavY2+z////8/P57hr9ib7Pb3u5pdrZQX6pQX6qkrNP////w8fhpdrZ4g73s7fb///+6wN1QX6pQX6pib7P39/v////////////////////////////////////19vqAi8FQX6pQX6qGkcS9w99da7BQX6pVY6y6wN2mrdRgbbJYZ66DjcPFyuN9iMBVY6xaaK+gqNGqsdZQX6pQX6pkcbTFyuN9iMBQX6pQX6qRmsnFyuNxfbpWZa1ndLW2vNv////////////////////////////5+fx2gr1QX6pQX6pQX6pQX6pWZa3M0eb////////////////z9Plmc7WgqNH///+PmclQX6pQX6pndLX39/v///////////////////9yfrtQX6pQX6pve7n8/P7///+krNNaaK/g4/Dy8/lYZ65QX6pQX6rFyuP5+fx2gr1+icD39/v///////+XoM1QX6pQX6p1gbz8/P7///////////////////////////////////+TnMtQX6pQX6qPmcm+w99da7BQX6pVY6y7wd6ao85QX6pQX6pQX6pQX6p2gr319vrg4/Dq7PXT1+pRYKpQX6pndLXFyuN9iMBQX6pQX6qSm8q7wd5YZ65QX6pQX6pQX6pRYKrX2uv////////////////////////////Y2+xVY6xQX6pQX6pQX6pQX6pgbbLj5fH///////////+gqNFxfbr8/P7s7fZYZ65QX6pQX6qgqNH////////////////////X2+xTYqtQX6pQX6qep9D////d4O9WZa3O0uf////FyuNQX6pQX6pWZa3s7faKlMZxfbr39/v////////5+fxodbZQX6pQX6qWn8z///////////////////////////////////////9YZ65QX6prd7ext9lda7BQX6pYZ67DyOKZos5QX6pQX6pwfLlyfrtQX6pQX6rg4/D///////+iqtJQX6pVY6yzudp/isFQX6pQX6qSm8q9w99YZ65QX6paaK+BjMJRYKpQX6qmrdT///////////////////////////////+2vNtQX6pQX6pQX6pQX6pQX6p2gr36+/3////h5PFebLHb3u3///+2vNxQX6pQX6pQX6rU1+r///////////////////+XoM1QX6pQX6pTYqvb3u3///+Zos6ao87///////+Zos5QX6pQX6qDjsOttNdmc7Xs7fb////////////FyuNQX6pQX6pQX6rJzeX///////////////////////////////////////9jcbNQX6pVY6xRYKpQX6pWZa26wN2gqNFQX6pQX6p2gr3JzeVyfrtQX6pWZa3x8vj///////+xt9lQX6pRYKpYZ65QX6pQX6qSm8rDyOJaaK9QX6pVZK26wN2VnstQX6pQX6q4vt3///////////////////////////////////+PmclQX6pQX6pQX6pQX6pQX6qttNf////Z3O20u9v////8/P54g71QX6pQX6preLf5+fz////////////////09fpkcbRQX6pQX6pve7n8/P7////h5PH39/v////3+PtodbZQX6pRYKqMlsdlcrTQ1Oj///////////////+GkcRQX6pQX6pjcbP19vr///////////////////////////////////////+6wN1QX6pQX6pQX6pWZa26wN2bpM9QX6pQX6p2gr3HzORyfrtQX6pQX6qpsdXO0uekrNO0u9vU1+prd7dQX6pQX6pQX6qTnMu7wd5aaK9QX6paaK++w9+VnstQX6pQX6pyfrv09fr////////////////////////////////////19vpwfLlQX6pQX6pQX6pQX6paaK/s7fb////////////Z3O1RYKpQX6pQX6qrstb///////////////////+xt9lQX6pQX6pQX6qep9D////////////////////U1+pRYKpQX6pSYatRYKqgqNH////////////////m6PNYZ65QX6pQX6qRmsn////////////////////////////////////////////////Gy+OOmMiTnMvO0ueZos5QX6pQX6p1gbzGy+NreLdQX6pQX6qkrNOpsdVRYKpQX6pQX6pwfLnFyuOgqNGMlse4vt29w99YZ65QX6paaK+9w9+Sm8pQX6pQX6p4g73o6vT////////////////////////////////////////////Z3O1YZ65QX6pQX6pQX6pQX6q/xeD///////////+gqNFQX6pQX6pVY6zh5PH////////////////09fpndLVQX6pQX6pSYavX2uv///////////////////+mrdRQX6pQX6pQX6pndLXz9Pn///////////////+ep9BQX6pQX6pQX6rO0uf////////////////////////////////////////////////////////6+/2bpM9QX6pQX6pwfLnLz+ZsebhQX6pQX6qgqNHq7PVVY6xQX6pSYatQX6pQX6psebju7/f////HzORVY6xQX6pVZK2+w9+Rm8pQX6pQX6pxfbrv8Pf///////////////////////////////////////////////////+XoM1QX6pQX6pQX6pQX6qkrNP////////39/tlcrRQX6pQX6qAi8H///////////////////+ep9BQX6pQX6pQX6pve7n8/P7////////////////6+/1ve7lQX6pQX6pQX6q9w9/////////////////x8vhebLFQX6pQX6pyfrv8/P7////////////////////////////////////////////////////////O0udQX6pQX6p2gr3Lz+ZxfbpQX6pQX6qYoc3////c3+5QX6pQX6qGkcSZos1QX6pQX6pwfLnh5PF2gr1QX6pYZ664vt2VnstQX6pQX6pwfLno6vT////////////////////V2euzudr////////////////////////////k5/JYZ65QX6pQX6pQX6qZos7////////O0udQX6pQX6pQX6q9w9/////////////////S1ulVZK1VY6xQX6pQX6qYoc3////////////////////Q1OhRYKpQX6pQX6pve7n3+Pv////////////////AxeBQX6pQX6pQX6qzudr////////////////////////////////////////////////////////////8/P6zudp4g73EyeJsebhQX6pQX6qkrNOpsdWDjsPs7fZodbZQX6paaK+2vNykrNNQX6pQX6preLe/xeB7hr+4vt2Wn8xQX6pQX6pxfbro6vT///////////////////////+Nl8hrd7f///////////////////////////////+DjcNQX6pQX6pQX6qiqtL///////+Zos1QX6pQX6pda7Dv8Pf////////////z9Plve7mRm8paaK9QX6pQX6rO0uf////8/P6ao87k5/L///+Yoc1QX6pQX6pRYKrJzeX///////////////////+Ai8FQX6pQX6pWZa3o6vT////S1umzudr////////////////////////////////////////////////////////o6vRsebhQX6pQX6qiqtLDyOJQX6pQX6qOmMjLz+ZebLFQX6pVY6y2vNyao85QX6pQX6pyfrvg4/CiqtJQX6pQX6pwfLnq7PX///////////////////////////9yfrt0gLv///////////////////////////////+ep9BQX6pQX6pQX6q/xeD////39/tlcrRQX6pQX6qPmcn///////////////+OmMiOl8ixt9lQX6pQX6pmc7X3+Pv////O0udaaK/x8vj8/P5sebhQX6pQX6pyfrv////////////////////k5/JVY6xQX6pQX6qJk8b////8/P5yfrukrNP///////////////////////////////////////////////////////////+qsdZSYauZos2zudq4vt2DjsNQX6pQX6qNl8jDyOJebLFQX6pVY6y2vNuao85QX6pQX6p0gLu9w99pdrZsebjq7PX////////////////////////////19vpYZ654g73///////////////////////////////+Zos1QX6pQX6paaK/s7fb////T1+pQX6pQX6pRYKrS1un///////////+rstZrd7f09fqAi8FQX6pQX6qZos3////3+PtsebittNf////U1+pRYKpQX6pQX6q4vt3///////////////////+0u9tQX6pQX6pQX6rHzOT///+zudppdrb3+Pv////////////////////////////////////////////////////////////////S1umkrNNQX6pebLG+w9+Fj8RQX6pQX6qMlsfDyOJebLFQX6pVY6y0u9uep9BQX6pQX6pwfLnFyuPo6vT////////////////////////////////Z3O1QX6psebj8/P7////////////////////////6+/1wfLlQX6pQX6qttNf///////+ttNdQX6pQX6ppdrb6+/3///////+ttNdda7Dg4/D39/taaK9QX6pQX6rEyeL///+Vnstyfrv8/P7///+bpM9QX6pQX6plcrT39/v///////////////////+BjMJQX6pQX6pib7P6+/3c3+5YZ67M0eb///////////////////////////////////////////////////////////////////////+zudpQX6pQX6pda7DDyOKAi8FQX6pQX6qNl8jHzORda7BQX6pTYqy7wd6ep9BQX6preLfq7PX///////////////////////////////////+7wd5QX6pWZa3q7PX////////////////////////EyeJQX6pQX6p8h7/8/P7///////+MlsdQX6pQX6qFj8T///////+nr9RWZa3Q1Oj////Z3O1SYatQX6pTYqve4e+2vNxTYqvf4vD////8/P5wfLlQX6pQX6qXoM3////////////////////x8vhaaK9QX6pQX6qPmcns7fZib7OTnMv///////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pjcbO/xeCAi8FQX6pQX6qRm8rGy+Nda7BQX6pTYqyss9erstbk5/L///////////////////////////////////////+mrdRQX6pQX6qkrNP////////////////////s7fZpdrZQX6pyfrvq7PX////////8/P52gr1QX6pQX6pjcbOss9d/isFebLHT1+r////////HzORQX6pQX6pTYqtwfLlTYqzCx+H////////a3e1TYqxQX6pRYKrQ1Oj////////////////////b3u1SYatQX6pQX6pgbrJda7CGkcTd4O+zudrJzeX///////////////////////////////////////////////////////////////////////////+vtthRYKpQX6pib7PDyOKFj8RQX6pQX6qKlMbFyuNaaK9QX6pyfrv8/P7////////////////////////////////////////////Z3O1ndLVQX6pQX6qZos7m6PP39/vx8vi/xeBjcbNQX6qOl8jv8Pf///////////////+DjcNQX6pQX6pQX6pQX6p1gbzh5PH////////////DyOJQX6pQX6pQX6pWZa2/xeD///////////+ep9BQX6pQX6pjcbP5+fz////////////////////Z3O1QX6pQX6pQX6pQX6qDjcP39/vX2+ypsdW9w9////////////////////////////////////////////////////////////////////////////////+4vt1QX6pQX6pda7C+w9+IksVRYKpQX6qzudrP0+h9iMDm6PP////////////////////////////////////////////////////v8Pe6wN2GkcRaaK9ebLFpdrZjcbNebLGOmMjS1un////////////////////////U1+ppdrZda7CBjMK/xeD6+/3////////////////k5/JlcrRWZa2Jk8be4e/////////////////P0+ipsdWnr9TJzeX////////////////////////39/uDjsNYZ65sebixuNn6+/3////u7/fW2evg4/D///////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pgbbKpsdVYZ65QX6qIksX////8/P7////////////////////////////////////////////////////////////////////09frd4O/Q1Oja3e3z9Pn////////////////////////////////////3+Pvz9Pn////////////////////////////////x8vjo6vT////////////////////////////////////////////////////////////////////8/P7s7fb5+fz///////////////////////////////////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pQX6pQX6pQX6qdpc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+0u9tYZ65QX6pQX6pve7no6vT////////////////////////////////////////////////////////////////////////////////////////////////X2+y4vt3////////////////////////////////////////////////////////////////////////////////////////////////b3u7Q1Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b3u6rsta4vt3y8/n////////////////////////////////////////////////////////////////////8/P7q7PXe4e/S1un5+fzQ1Ojk5/L////S1unZ3O3////////V2evS1un6+/3q7PXd4O/v8Pf////Q1OjZ3O3////////m6PPO0ufv8Pfj5fH////////j5fH////g4/DS1unx8viao86Rmsnm6PP////o6vTS1un5+fz////q7PXd4O/X2uv5+fzQ1Ojm6PP////5+fzQ1Ojk5/L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx5hb6iqtKVnsyDjsOutdh4g73t7/apsdWrstb///+ep9CiqtK6wN3y8/l7hr+Vnsvq7PWdpc+ttNeOmMi4vt3f4u+MlsfFyuPq7PWOmMjc3+7g4/CZos62vNyIksXO0ufq7PWPmcmGkcTZ3O3O0ueNl8iutdiUncv39/t4g72mrdSKlMaDjsOttNeFj8T09fqRm8qxt9nf4u/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/t6hb75+fzGy+OTnMv///+Fj8Tf4u/S1umss9fv8Pd/isH////////3+Pt6hb709frf4u+GkcT////u7/eGkcTd4O+Ai8G0u9v5+fy7wd6bpM+mrdTFyuPFyuN7hr/DyOL///+9w9+zudr///+Rm8qGkcSttNePmcnu7/d7hr/8/P60u9uSm8r///+Pmcnv8PeVnsyao87j5fH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vqBjML8/P6+w9+gqNH///+DjcPf4vDM0eaqsdbx8vh1gbz09fr6+/3z9PmJk8b6+/3g4/B7hr/8/P3Q1OiRmsn////t7/aMlsenr9T5+fxve7l5hb7y8/n////k5/J7hr/U1+q9w9+or9X///+VnsugqNH19vr5+fzz9PmFj8T///+vttigqNH///+Nl8jv8Pf8/P6+w997hr/5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/uZos78/P3Lz+axuNn///+ao87m6PPW2eu4vt3///+mrdSRmsmmrdTu7/eiqtL3+Pv///+iqtKXoM2Ol8jd4O/t7/aqsdaVnsvS1un///+VnsyVnsv////T1+qmrdSZos3v8Pfc3+6BjMLLz+bf4u+KlMamrdS+w9/19vqdpc////++w9+zudr///+krNPw8fi/xeCep9CxuNn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P3////8/P78/P7////8/P3////////8/P7////////x8vjz9Pn////8/P7////////////x8vj5+fz////8/P3u7/f3+Pv////39/uNl8jT1+r////3+Pvu7/f8/P7////////19vr19vr////8/P3v8Pf39/v////8/P3////8/P78/P7////8/P7////z9Pnx8vj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7faXoM2nr9T///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+</draw:page>
+</office:drawing>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/txtpic_pdfi_unittest_impress.xml b/sdext/source/pdfimport/test/testdocs/txtpic_pdfi_unittest_impress.xml
new file mode 100644
index 000000000..4ee430dbb
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/txtpic_pdfi_unittest_impress.xml
@@ -0,0 +1,3396 @@
+<?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 .
+-->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="20mm" fo:margin-right="10mm" fo:margin-top="20mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:auto-grow-height="true" draw:auto-grow-width="true" draw:fill="none" draw:stroke="none" draw:textarea-horizontal-align="left" draw:textarea-vertical-align="top" fo:padding-bottom="0cm" fo:padding-left="0cm" fo:padding-right="0cm" fo:padding-top="0cm" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Thorndale" fo:font-size="12pt" style:font-size-asian="12pt" style:font-size-complex="12pt" >
+
+</style:text-properties>
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:presentation >
+<draw:page draw:master-page-name="master-page3" >
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 20.18mm )" draw:z-index="0" svg:height="4.23mm" svg:width="163.08mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+H
+e
+
+h
+e
+a
+r
+d
+
+q
+u
+i
+e
+t
+
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+.
+
+T
+h
+a
+t
+
+d
+i
+d
+n
+'
+t
+
+b
+o
+d
+e
+
+w
+e
+l
+l
+.
+
+W
+h
+o
+
+c
+o
+u
+l
+d
+
+b
+e
+
+f
+o
+l
+l
+o
+w
+i
+n
+g
+
+h
+i
+m
+
+t
+h
+i
+s
+
+l
+a
+t
+e
+
+a
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 25.05mm )" draw:z-index="1" svg:height="4.23mm" svg:width="165.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+i
+g
+h
+t
+
+a
+n
+d
+
+i
+n
+
+t
+h
+i
+s
+
+d
+e
+a
+d
+b
+e
+a
+t
+
+p
+a
+r
+t
+
+o
+f
+
+t
+o
+w
+n
+?
+
+A
+n
+d
+
+a
+t
+
+t
+h
+i
+s
+
+p
+a
+r
+t
+i
+c
+u
+l
+a
+r
+
+m
+o
+m
+e
+n
+t
+,
+
+j
+u
+s
+t
+
+a
+f
+t
+e
+r
+
+h
+e
+
+p
+u
+l
+l
+e
+d
+
+o
+f
+f
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 29.91mm )" draw:z-index="2" svg:height="4.23mm" svg:width="162.03mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+i
+g
+
+t
+i
+m
+e
+
+a
+n
+d
+
+w
+a
+s
+
+m
+a
+k
+i
+n
+g
+
+o
+f
+f
+
+w
+i
+t
+h
+
+t
+h
+e
+
+g
+r
+e
+e
+n
+b
+a
+c
+k
+s
+.
+
+W
+a
+s
+
+t
+h
+e
+r
+e
+
+a
+n
+o
+t
+h
+e
+r
+
+c
+r
+o
+o
+k
+
+w
+h
+o
+'
+d
+
+h
+a
+d
+
+t
+h
+e
+
+s
+a
+m
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 34.78mm )" draw:z-index="3" svg:height="4.23mm" svg:width="167.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+i
+d
+e
+a
+,
+
+a
+n
+d
+
+w
+a
+s
+
+n
+o
+w
+
+w
+a
+t
+c
+h
+i
+n
+g
+
+h
+i
+m
+
+a
+n
+d
+
+w
+a
+i
+t
+i
+n
+g
+
+f
+o
+r
+
+a
+
+c
+h
+a
+n
+c
+e
+
+t
+o
+
+g
+r
+a
+b
+
+t
+h
+e
+
+f
+r
+u
+i
+t
+
+o
+f
+
+h
+i
+s
+
+l
+a
+b
+o
+r
+?
+
+O
+r
+
+d
+i
+d
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 39.65mm )" draw:z-index="4" svg:height="4.23mm" svg:width="161.92mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+
+m
+e
+a
+n
+
+t
+h
+a
+t
+
+o
+n
+e
+
+o
+f
+
+m
+a
+n
+y
+
+l
+a
+w
+
+o
+f
+f
+i
+c
+e
+r
+s
+
+i
+n
+
+t
+o
+w
+n
+
+w
+a
+s
+
+o
+n
+
+t
+o
+
+h
+i
+m
+
+a
+n
+d
+
+j
+u
+s
+t
+
+w
+a
+i
+t
+i
+n
+g
+
+t
+o
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 44.52mm )" draw:z-index="5" svg:height="4.23mm" svg:width="164.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+p
+o
+u
+n
+c
+e
+
+a
+n
+d
+
+s
+n
+a
+p
+
+t
+h
+o
+s
+e
+
+c
+u
+f
+f
+s
+
+o
+n
+
+h
+i
+s
+
+w
+r
+i
+s
+t
+s
+?
+
+H
+e
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+l
+o
+o
+k
+e
+d
+
+a
+l
+l
+
+a
+r
+o
+u
+n
+d
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 49.39mm )" draw:z-index="6" svg:height="4.23mm" svg:width="165.52mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+l
+e
+y
+.
+
+L
+i
+k
+e
+
+l
+i
+g
+h
+t
+n
+i
+n
+g
+
+h
+e
+
+d
+a
+r
+t
+e
+d
+
+o
+f
+f
+
+t
+o
+
+t
+h
+e
+
+l
+e
+f
+t
+
+a
+n
+d
+
+d
+i
+s
+a
+p
+p
+e
+a
+r
+e
+d
+
+b
+e
+t
+w
+e
+e
+n
+
+t
+h
+e
+
+t
+w
+o
+
+w
+a
+r
+e
+h
+o
+u
+s
+e
+s
+
+a
+l
+m
+o
+s
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 54.26mm )" draw:z-index="7" svg:height="4.23mm" svg:width="161.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+f
+a
+l
+l
+i
+n
+g
+
+o
+v
+e
+r
+
+t
+h
+e
+
+t
+r
+a
+s
+h
+
+c
+a
+n
+
+l
+y
+i
+n
+g
+
+i
+n
+
+t
+h
+e
+
+m
+i
+d
+d
+l
+e
+
+o
+f
+
+t
+h
+e
+
+s
+i
+d
+e
+w
+a
+l
+k
+.
+
+H
+e
+
+t
+r
+i
+e
+d
+
+t
+o
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+t
+a
+p
+
+h
+i
+s
+
+w
+a
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 59.12mm )" draw:z-index="8" svg:height="4.23mm" svg:width="168.27mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+o
+n
+g
+
+i
+n
+
+t
+h
+e
+
+i
+n
+k
+y
+
+d
+a
+r
+k
+n
+e
+s
+s
+
+a
+n
+d
+
+s
+u
+d
+d
+e
+n
+l
+y
+
+s
+t
+i
+f
+f
+e
+n
+e
+d
+:
+
+i
+t
+
+w
+a
+s
+
+a
+
+d
+e
+a
+d
+-
+e
+n
+d
+,
+
+h
+e
+
+w
+o
+u
+l
+d
+
+h
+a
+v
+e
+
+t
+o
+
+g
+o
+
+b
+a
+c
+k
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 63.99mm )" draw:z-index="9" svg:height="4.23mm" svg:width="161.39mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+w
+a
+y
+
+h
+e
+
+h
+a
+d
+
+c
+o
+m
+e
+.
+
+T
+h
+e
+
+s
+t
+e
+p
+s
+
+g
+o
+t
+
+l
+o
+u
+d
+e
+r
+
+a
+n
+d
+
+l
+o
+u
+d
+e
+r
+,
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+b
+l
+a
+c
+k
+
+o
+u
+t
+l
+i
+n
+e
+
+o
+f
+
+a
+
+f
+i
+g
+u
+r
+e
+
+c
+o
+m
+i
+n
+g
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 68.86mm )" draw:z-index="10" svg:height="4.23mm" svg:width="161.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+r
+o
+u
+n
+d
+
+t
+h
+e
+
+c
+o
+r
+n
+e
+r
+.
+
+I
+s
+
+t
+h
+i
+s
+
+t
+h
+e
+
+e
+n
+d
+
+o
+f
+
+t
+h
+e
+
+l
+i
+n
+e
+?
+
+h
+e
+
+t
+h
+o
+u
+g
+h
+t
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+b
+a
+c
+k
+
+a
+g
+a
+i
+n
+s
+t
+
+t
+h
+e
+
+w
+a
+l
+l
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 73.73mm )" draw:z-index="11" svg:height="4.23mm" svg:width="159.56mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+t
+r
+y
+i
+n
+g
+
+t
+o
+
+m
+a
+k
+e
+
+h
+i
+m
+s
+e
+l
+f
+
+i
+n
+v
+i
+s
+i
+b
+l
+e
+
+i
+n
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+w
+a
+s
+
+a
+l
+l
+
+t
+h
+a
+t
+
+p
+l
+a
+n
+n
+i
+n
+g
+
+a
+n
+d
+
+e
+n
+e
+r
+g
+y
+
+w
+a
+s
+t
+e
+d
+?
+
+H
+e
+
+w
+a
+s
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 78.6mm )" draw:z-index="12" svg:height="4.23mm" svg:width="164mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+d
+r
+i
+p
+p
+i
+n
+g
+
+w
+i
+t
+h
+
+s
+w
+e
+a
+t
+
+n
+o
+w
+,
+
+c
+o
+l
+d
+
+a
+n
+d
+
+w
+e
+t
+,
+
+h
+e
+
+c
+o
+u
+l
+d
+
+s
+m
+e
+l
+l
+
+t
+h
+e
+
+f
+e
+a
+r
+
+c
+o
+m
+i
+n
+g
+
+o
+f
+f
+
+h
+i
+s
+
+c
+l
+o
+t
+h
+e
+s
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 83.47mm )" draw:z-index="13" svg:height="4.23mm" svg:width="167mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+e
+x
+t
+
+t
+o
+
+h
+i
+m
+,
+
+w
+i
+t
+h
+
+a
+
+b
+a
+r
+e
+l
+y
+
+n
+o
+t
+i
+c
+e
+a
+b
+l
+e
+
+s
+q
+u
+e
+a
+k
+,
+
+a
+
+d
+o
+o
+r
+
+s
+w
+u
+n
+g
+
+q
+u
+i
+e
+t
+l
+y
+
+t
+o
+
+a
+n
+d
+
+f
+r
+o
+
+i
+n
+
+t
+h
+e
+
+n
+i
+g
+h
+t
+'
+s
+
+b
+r
+e
+e
+z
+e
+.
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 88.33mm )" draw:z-index="14" svg:height="4.23mm" svg:width="169.29mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+C
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+b
+e
+
+t
+h
+e
+
+h
+a
+v
+e
+n
+
+h
+e
+'
+d
+
+p
+r
+a
+y
+e
+d
+
+f
+o
+r
+?
+
+S
+l
+o
+w
+l
+y
+
+h
+e
+
+s
+l
+i
+d
+
+t
+o
+w
+a
+r
+d
+
+t
+h
+e
+
+d
+o
+o
+r
+,
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+m
+o
+r
+e
+
+a
+n
+d
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 93.2mm )" draw:z-index="15" svg:height="4.23mm" svg:width="146.82mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+m
+o
+r
+e
+
+i
+n
+t
+o
+
+t
+h
+e
+
+w
+a
+l
+l
+,
+
+i
+n
+t
+o
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+a
+w
+a
+y
+
+f
+r
+o
+m
+
+h
+i
+s
+
+e
+n
+e
+m
+y
+.
+
+W
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+d
+o
+o
+r
+
+s
+a
+v
+e
+
+h
+i
+s
+
+h
+i
+d
+e
+?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 98.07mm )" draw:z-index="16" svg:height="4.23mm" svg:width="163.08mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+H
+e
+
+h
+e
+a
+r
+d
+
+q
+u
+i
+e
+t
+
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+.
+
+T
+h
+a
+t
+
+d
+i
+d
+n
+'
+t
+
+b
+o
+d
+e
+
+w
+e
+l
+l
+.
+
+W
+h
+o
+
+c
+o
+u
+l
+d
+
+b
+e
+
+f
+o
+l
+l
+o
+w
+i
+n
+g
+
+h
+i
+m
+
+t
+h
+i
+s
+
+l
+a
+t
+e
+
+a
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 102.94mm )" draw:z-index="17" svg:height="4.23mm" svg:width="165.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+i
+g
+h
+t
+
+a
+n
+d
+
+i
+n
+
+t
+h
+i
+s
+
+d
+e
+a
+d
+b
+e
+a
+t
+
+p
+a
+r
+t
+
+o
+f
+
+t
+o
+w
+n
+?
+
+A
+n
+d
+
+a
+t
+
+t
+h
+i
+s
+
+p
+a
+r
+t
+i
+c
+u
+l
+a
+r
+
+m
+o
+m
+e
+n
+t
+,
+
+j
+u
+s
+t
+
+a
+f
+t
+e
+r
+
+h
+e
+
+p
+u
+l
+l
+e
+d
+
+o
+f
+f
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 107.81mm )" draw:z-index="18" svg:height="4.23mm" svg:width="162.03mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+i
+g
+
+t
+i
+m
+e
+
+a
+n
+d
+
+w
+a
+s
+
+m
+a
+k
+i
+n
+g
+
+o
+f
+f
+
+w
+i
+t
+h
+
+t
+h
+e
+
+g
+r
+e
+e
+n
+b
+a
+c
+k
+s
+.
+
+W
+a
+s
+
+t
+h
+e
+r
+e
+
+a
+n
+o
+t
+h
+e
+r
+
+c
+r
+o
+o
+k
+
+w
+h
+o
+'
+d
+
+h
+a
+d
+
+t
+h
+e
+
+s
+a
+m
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 112.68mm )" draw:z-index="19" svg:height="4.23mm" svg:width="167.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+i
+d
+e
+a
+,
+
+a
+n
+d
+
+w
+a
+s
+
+n
+o
+w
+
+w
+a
+t
+c
+h
+i
+n
+g
+
+h
+i
+m
+
+a
+n
+d
+
+w
+a
+i
+t
+i
+n
+g
+
+f
+o
+r
+
+a
+
+c
+h
+a
+n
+c
+e
+
+t
+o
+
+g
+r
+a
+b
+
+t
+h
+e
+
+f
+r
+u
+i
+t
+
+o
+f
+
+h
+i
+s
+
+l
+a
+b
+o
+r
+?
+
+O
+r
+
+d
+i
+d
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 117.54mm )" draw:z-index="20" svg:height="4.23mm" svg:width="161.92mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+
+m
+e
+a
+n
+
+t
+h
+a
+t
+
+o
+n
+e
+
+o
+f
+
+m
+a
+n
+y
+
+l
+a
+w
+
+o
+f
+f
+i
+c
+e
+r
+s
+
+i
+n
+
+t
+o
+w
+n
+
+w
+a
+s
+
+o
+n
+
+t
+o
+
+h
+i
+m
+
+a
+n
+d
+
+j
+u
+s
+t
+
+w
+a
+i
+t
+i
+n
+g
+
+t
+o
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 122.41mm )" draw:z-index="21" svg:height="4.23mm" svg:width="164.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+p
+o
+u
+n
+c
+e
+
+a
+n
+d
+
+s
+n
+a
+p
+
+t
+h
+o
+s
+e
+
+c
+u
+f
+f
+s
+
+o
+n
+
+h
+i
+s
+
+w
+r
+i
+s
+t
+s
+?
+
+H
+e
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+l
+o
+o
+k
+e
+d
+
+a
+l
+l
+
+a
+r
+o
+u
+n
+d
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 127.28mm )" draw:z-index="22" svg:height="4.23mm" svg:width="165.52mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+l
+e
+y
+.
+
+L
+i
+k
+e
+
+l
+i
+g
+h
+t
+n
+i
+n
+g
+
+h
+e
+
+d
+a
+r
+t
+e
+d
+
+o
+f
+f
+
+t
+o
+
+t
+h
+e
+
+l
+e
+f
+t
+
+a
+n
+d
+
+d
+i
+s
+a
+p
+p
+e
+a
+r
+e
+d
+
+b
+e
+t
+w
+e
+e
+n
+
+t
+h
+e
+
+t
+w
+o
+
+w
+a
+r
+e
+h
+o
+u
+s
+e
+s
+
+a
+l
+m
+o
+s
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 132.15mm )" draw:z-index="23" svg:height="4.23mm" svg:width="161.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+f
+a
+l
+l
+i
+n
+g
+
+o
+v
+e
+r
+
+t
+h
+e
+
+t
+r
+a
+s
+h
+
+c
+a
+n
+
+l
+y
+i
+n
+g
+
+i
+n
+
+t
+h
+e
+
+m
+i
+d
+d
+l
+e
+
+o
+f
+
+t
+h
+e
+
+s
+i
+d
+e
+w
+a
+l
+k
+.
+
+H
+e
+
+t
+r
+i
+e
+d
+
+t
+o
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+t
+a
+p
+
+h
+i
+s
+
+w
+a
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 137.02mm )" draw:z-index="24" svg:height="4.23mm" svg:width="168.27mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+o
+n
+g
+
+i
+n
+
+t
+h
+e
+
+i
+n
+k
+y
+
+d
+a
+r
+k
+n
+e
+s
+s
+
+a
+n
+d
+
+s
+u
+d
+d
+e
+n
+l
+y
+
+s
+t
+i
+f
+f
+e
+n
+e
+d
+:
+
+i
+t
+
+w
+a
+s
+
+a
+
+d
+e
+a
+d
+-
+e
+n
+d
+,
+
+h
+e
+
+w
+o
+u
+l
+d
+
+h
+a
+v
+e
+
+t
+o
+
+g
+o
+
+b
+a
+c
+k
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 141.89mm )" draw:z-index="25" svg:height="4.23mm" svg:width="161.39mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+w
+a
+y
+
+h
+e
+
+h
+a
+d
+
+c
+o
+m
+e
+.
+
+T
+h
+e
+
+s
+t
+e
+p
+s
+
+g
+o
+t
+
+l
+o
+u
+d
+e
+r
+
+a
+n
+d
+
+l
+o
+u
+d
+e
+r
+,
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+b
+l
+a
+c
+k
+
+o
+u
+t
+l
+i
+n
+e
+
+o
+f
+
+a
+
+f
+i
+g
+u
+r
+e
+
+c
+o
+m
+i
+n
+g
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 146.75mm )" draw:z-index="26" svg:height="4.23mm" svg:width="161.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+r
+o
+u
+n
+d
+
+t
+h
+e
+
+c
+o
+r
+n
+e
+r
+.
+
+I
+s
+
+t
+h
+i
+s
+
+t
+h
+e
+
+e
+n
+d
+
+o
+f
+
+t
+h
+e
+
+l
+i
+n
+e
+?
+
+h
+e
+
+t
+h
+o
+u
+g
+h
+t
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+b
+a
+c
+k
+
+a
+g
+a
+i
+n
+s
+t
+
+t
+h
+e
+
+w
+a
+l
+l
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 151.62mm )" draw:z-index="27" svg:height="4.23mm" svg:width="159.56mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+t
+r
+y
+i
+n
+g
+
+t
+o
+
+m
+a
+k
+e
+
+h
+i
+m
+s
+e
+l
+f
+
+i
+n
+v
+i
+s
+i
+b
+l
+e
+
+i
+n
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+w
+a
+s
+
+a
+l
+l
+
+t
+h
+a
+t
+
+p
+l
+a
+n
+n
+i
+n
+g
+
+a
+n
+d
+
+e
+n
+e
+r
+g
+y
+
+w
+a
+s
+t
+e
+d
+?
+
+H
+e
+
+w
+a
+s
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 156.49mm )" draw:z-index="28" svg:height="4.23mm" svg:width="164mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+d
+r
+i
+p
+p
+i
+n
+g
+
+w
+i
+t
+h
+
+s
+w
+e
+a
+t
+
+n
+o
+w
+,
+
+c
+o
+l
+d
+
+a
+n
+d
+
+w
+e
+t
+,
+
+h
+e
+
+c
+o
+u
+l
+d
+
+s
+m
+e
+l
+l
+
+t
+h
+e
+
+f
+e
+a
+r
+
+c
+o
+m
+i
+n
+g
+
+o
+f
+f
+
+h
+i
+s
+
+c
+l
+o
+t
+h
+e
+s
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 161.36mm )" draw:z-index="29" svg:height="4.23mm" svg:width="167mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+e
+x
+t
+
+t
+o
+
+h
+i
+m
+,
+
+w
+i
+t
+h
+
+a
+
+b
+a
+r
+e
+l
+y
+
+n
+o
+t
+i
+c
+e
+a
+b
+l
+e
+
+s
+q
+u
+e
+a
+k
+,
+
+a
+
+d
+o
+o
+r
+
+s
+w
+u
+n
+g
+
+q
+u
+i
+e
+t
+l
+y
+
+t
+o
+
+a
+n
+d
+
+f
+r
+o
+
+i
+n
+
+t
+h
+e
+
+n
+i
+g
+h
+t
+'
+s
+
+b
+r
+e
+e
+z
+e
+.
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 166.23mm )" draw:z-index="30" svg:height="4.23mm" svg:width="169.29mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+C
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+b
+e
+
+t
+h
+e
+
+h
+a
+v
+e
+n
+
+h
+e
+'
+d
+
+p
+r
+a
+y
+e
+d
+
+f
+o
+r
+?
+
+S
+l
+o
+w
+l
+y
+
+h
+e
+
+s
+l
+i
+d
+
+t
+o
+w
+a
+r
+d
+
+t
+h
+e
+
+d
+o
+o
+r
+,
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+m
+o
+r
+e
+
+a
+n
+d
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 171.1mm )" draw:z-index="31" svg:height="4.23mm" svg:width="146.82mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+m
+o
+r
+e
+
+i
+n
+t
+o
+
+t
+h
+e
+
+w
+a
+l
+l
+,
+
+i
+n
+t
+o
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+a
+w
+a
+y
+
+f
+r
+o
+m
+
+h
+i
+s
+
+e
+n
+e
+m
+y
+.
+
+W
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+d
+o
+o
+r
+
+s
+a
+v
+e
+
+h
+i
+s
+
+h
+i
+d
+e
+?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 94.4mm 192.51mm )" draw:z-index="32" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////////w8fiMlsdda7Bve7nBxuH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx8h79QX6pQX6pQX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Z3O1QX6pQX6plcrRYZ65QX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////19vrk5/Lg4/Ds7fb5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fjd4O/j5fFQX6pQX6qBjMK4vt1da7BQX6pVY6y/xeD////////////////////////////////////////////////////////////////////////////////////3+PvAxeCBjMJda7BaaK9YZ65RYKplcrSUncvHzOT5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6vR7hr9da7DT1+qOl8hQX6pQX6qOmMi+w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////////////X2ut1gbxQX6p1gby4vt3e4e/b3u6vtthda7BQX6pQX6qIksX8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vq4vt1QX6pQX6pgbrLM0eaIksVQX6pQX6qGkcS9w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////M0eZWZa1QX6qUncv8/P7////////////////O0udVY6xQX6p0gLv8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8vh2gr2gqNG2vNtRYKpQX6pda7DM0eaDjsNQX6pQX6qIksXBxuFWZa1QX6pRYKq+w9/////////////////////////////////////////////////////////////s7fZebLFQX6pjcbP19vr///////////////////////92gr1QX6qbpM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+UnctQX6pQX6qiqtKvtthRYKpQX6pkcbTHzOSBjMJQX6pQX6qMlsfAxeBda7BQX6pTYqzY2+z///////////////////////////////////////////////////////+krNNQX6pQX6qXoM3///////////////////////////+OmMhQX6rHzOT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7/ePmcm2vNxve7lQX6pQX6qiqtKvtthQX6pQX6plcrTJzeWMlsdQX6pQX6qIksW7wd5gbrKgqNGkrNO0u9v////////////////////////////////////////////////5+fxodbZQX6pQX6qmrdT///////////////////////////+VnstVY6zy8/n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fh4g71QX6ppdrbO0udve7lQX6pQX6qiqtK2vNtTYqtQX6pkcbTFyuOJk8ZQX6pQX6p/isHb3u2gqNFQX6pQX6q+w9/////////////////////////////////////////////o6vRVY6xQX6pQX6qDjcP///////////////////////////+Ol8hyfrv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z9PmAi8FQX6pQX6p/isHGy+PBxuFve7lQX6pQX6qpsdWutdhTYqtQX6pjcbPV2et9iMBQX6qYoc2ttNdRYKpQX6pjcbO4vt3JzuX////////////////////////////////////////m6PNVZK1QX6pQX6pWZa3h5PH///////////////////////+mrdSqsdb////////////s7fa0u9uXoM2zudr5+fz////////////////////////09frZ3O3X2+zg4/D////////////////////EyeKOmMiWn8zq7PX////////////////////e4e+vttidpc+0u9v39/v////////////////////////////////////////////////////v8PeBjMJQX6pQX6qIksW9w99YZ65xfbq9w99rd7dQX6pQX6qiqtKrstZVY6xQX6qao87y8/m2vNypsdVRYKpQX6plcrTEyeJ9iMBQX6qzudr8/P7////////////////////////////////09fpebLFQX6pQX6pQX6qDjsP8/P7////////////////////8/P7////////////Cx+FgbrJQX6pQX6pQX6q4vt3///////////////////////+KlMZSYatSYatrd7f5+fz////////z9PmKlMZQX6pQX6pQX6qgqNH////////////z9PmZos1QX6pQX6pQX6pQX6qXoM3////////////////////////////////////////////////v8Pd4g71QX6pQX6qMlsfAxeBda7BQX6pRYKrJzeXo6vRodbZQX6pQX6p9iMBWZa1QX6qMlsf///+utdhQX6pQX6prd7fFyuN/isFQX6pQX6qKlMb///////////////////////////////////////+KlMZQX6pQX6pQX6pQX6qiqtL///////////////////////////////+6wN1QX6pRYKpQX6pQX6pQX6qpsdX////////////////////c3+5SYatQX6pQX6qZos3////////v8Pd5hb5RYKpTYqtQX6pQX6qOl8j////////o6vRyfrtda7CZos56hb5QX6pQX6plcrT5+fz////////////////////////////////////////19vp5hb5QX6pQX6qIksXBxuFWZa1QX6pTYqzEyeL09frt7/bd4O9mc7VQX6pQX6pQX6pQX6q9w9+vtthQX6pQX6pkcbTM0eZ/isFQX6pQX6qMlsfz9Pno6vT19vr////////////////////////////////FyuNQX6pQX6pQX6pQX6pQX6qxt9n////////////////////////U1+pQX6q4vt2vtthQX6pQX6pQX6rO0uf///////////////////+iqtJQX6pQX6pSYavY2+z////8/P57hr9ib7Pb3u5pdrZQX6pQX6qkrNP////w8fhpdrZ4g73s7fb///+6wN1QX6pQX6pib7P39/v////////////////////////////////////19vqAi8FQX6pQX6qGkcS9w99da7BQX6pVY6y6wN2mrdRgbbJYZ66DjcPFyuN9iMBVY6xaaK+gqNGqsdZQX6pQX6pkcbTFyuN9iMBQX6pQX6qRmsnFyuNxfbpWZa1ndLW2vNv////////////////////////////5+fx2gr1QX6pQX6pQX6pQX6pWZa3M0eb////////////////z9Plmc7WgqNH///+PmclQX6pQX6pndLX39/v///////////////////9yfrtQX6pQX6pve7n8/P7///+krNNaaK/g4/Dy8/lYZ65QX6pQX6rFyuP5+fx2gr1+icD39/v///////+XoM1QX6pQX6p1gbz8/P7///////////////////////////////////+TnMtQX6pQX6qPmcm+w99da7BQX6pVY6y7wd6ao85QX6pQX6pQX6pQX6p2gr319vrg4/Dq7PXT1+pRYKpQX6pndLXFyuN9iMBQX6pQX6qSm8q7wd5YZ65QX6pQX6pQX6pRYKrX2uv////////////////////////////Y2+xVY6xQX6pQX6pQX6pQX6pgbbLj5fH///////////+gqNFxfbr8/P7s7fZYZ65QX6pQX6qgqNH////////////////////X2+xTYqtQX6pQX6qep9D////d4O9WZa3O0uf////FyuNQX6pQX6pWZa3s7faKlMZxfbr39/v////////5+fxodbZQX6pQX6qWn8z///////////////////////////////////////9YZ65QX6prd7ext9lda7BQX6pYZ67DyOKZos5QX6pQX6pwfLlyfrtQX6pQX6rg4/D///////+iqtJQX6pVY6yzudp/isFQX6pQX6qSm8q9w99YZ65QX6paaK+BjMJRYKpQX6qmrdT///////////////////////////////+2vNtQX6pQX6pQX6pQX6pQX6p2gr36+/3////h5PFebLHb3u3///+2vNxQX6pQX6pQX6rU1+r///////////////////+XoM1QX6pQX6pTYqvb3u3///+Zos6ao87///////+Zos5QX6pQX6qDjsOttNdmc7Xs7fb////////////FyuNQX6pQX6pQX6rJzeX///////////////////////////////////////9jcbNQX6pVY6xRYKpQX6pWZa26wN2gqNFQX6pQX6p2gr3JzeVyfrtQX6pWZa3x8vj///////+xt9lQX6pRYKpYZ65QX6pQX6qSm8rDyOJaaK9QX6pVZK26wN2VnstQX6pQX6q4vt3///////////////////////////////////+PmclQX6pQX6pQX6pQX6pQX6qttNf////Z3O20u9v////8/P54g71QX6pQX6preLf5+fz////////////////09fpkcbRQX6pQX6pve7n8/P7////h5PH39/v////3+PtodbZQX6pRYKqMlsdlcrTQ1Oj///////////////+GkcRQX6pQX6pjcbP19vr///////////////////////////////////////+6wN1QX6pQX6pQX6pWZa26wN2bpM9QX6pQX6p2gr3HzORyfrtQX6pQX6qpsdXO0uekrNO0u9vU1+prd7dQX6pQX6pQX6qTnMu7wd5aaK9QX6paaK++w9+VnstQX6pQX6pyfrv09fr////////////////////////////////////19vpwfLlQX6pQX6pQX6pQX6paaK/s7fb////////////Z3O1RYKpQX6pQX6qrstb///////////////////+xt9lQX6pQX6pQX6qep9D////////////////////U1+pRYKpQX6pSYatRYKqgqNH////////////////m6PNYZ65QX6pQX6qRmsn////////////////////////////////////////////////Gy+OOmMiTnMvO0ueZos5QX6pQX6p1gbzGy+NreLdQX6pQX6qkrNOpsdVRYKpQX6pQX6pwfLnFyuOgqNGMlse4vt29w99YZ65QX6paaK+9w9+Sm8pQX6pQX6p4g73o6vT////////////////////////////////////////////Z3O1YZ65QX6pQX6pQX6pQX6q/xeD///////////+gqNFQX6pQX6pVY6zh5PH////////////////09fpndLVQX6pQX6pSYavX2uv///////////////////+mrdRQX6pQX6pQX6pndLXz9Pn///////////////+ep9BQX6pQX6pQX6rO0uf////////////////////////////////////////////////////////6+/2bpM9QX6pQX6pwfLnLz+ZsebhQX6pQX6qgqNHq7PVVY6xQX6pSYatQX6pQX6psebju7/f////HzORVY6xQX6pVZK2+w9+Rm8pQX6pQX6pxfbrv8Pf///////////////////////////////////////////////////+XoM1QX6pQX6pQX6pQX6qkrNP////////39/tlcrRQX6pQX6qAi8H///////////////////+ep9BQX6pQX6pQX6pve7n8/P7////////////////6+/1ve7lQX6pQX6pQX6q9w9/////////////////x8vhebLFQX6pQX6pyfrv8/P7////////////////////////////////////////////////////////O0udQX6pQX6p2gr3Lz+ZxfbpQX6pQX6qYoc3////c3+5QX6pQX6qGkcSZos1QX6pQX6pwfLnh5PF2gr1QX6pYZ664vt2VnstQX6pQX6pwfLno6vT////////////////////V2euzudr////////////////////////////k5/JYZ65QX6pQX6pQX6qZos7////////O0udQX6pQX6pQX6q9w9/////////////////S1ulVZK1VY6xQX6pQX6qYoc3////////////////////Q1OhRYKpQX6pQX6pve7n3+Pv////////////////AxeBQX6pQX6pQX6qzudr////////////////////////////////////////////////////////////8/P6zudp4g73EyeJsebhQX6pQX6qkrNOpsdWDjsPs7fZodbZQX6paaK+2vNykrNNQX6pQX6preLe/xeB7hr+4vt2Wn8xQX6pQX6pxfbro6vT///////////////////////+Nl8hrd7f///////////////////////////////+DjcNQX6pQX6pQX6qiqtL///////+Zos1QX6pQX6pda7Dv8Pf////////////z9Plve7mRm8paaK9QX6pQX6rO0uf////8/P6ao87k5/L///+Yoc1QX6pQX6pRYKrJzeX///////////////////+Ai8FQX6pQX6pWZa3o6vT////S1umzudr////////////////////////////////////////////////////////o6vRsebhQX6pQX6qiqtLDyOJQX6pQX6qOmMjLz+ZebLFQX6pVY6y2vNyao85QX6pQX6pyfrvg4/CiqtJQX6pQX6pwfLnq7PX///////////////////////////9yfrt0gLv///////////////////////////////+ep9BQX6pQX6pQX6q/xeD////39/tlcrRQX6pQX6qPmcn///////////////+OmMiOl8ixt9lQX6pQX6pmc7X3+Pv////O0udaaK/x8vj8/P5sebhQX6pQX6pyfrv////////////////////k5/JVY6xQX6pQX6qJk8b////8/P5yfrukrNP///////////////////////////////////////////////////////////+qsdZSYauZos2zudq4vt2DjsNQX6pQX6qNl8jDyOJebLFQX6pVY6y2vNuao85QX6pQX6p0gLu9w99pdrZsebjq7PX////////////////////////////19vpYZ654g73///////////////////////////////+Zos1QX6pQX6paaK/s7fb////T1+pQX6pQX6pRYKrS1un///////////+rstZrd7f09fqAi8FQX6pQX6qZos3////3+PtsebittNf////U1+pRYKpQX6pQX6q4vt3///////////////////+0u9tQX6pQX6pQX6rHzOT///+zudppdrb3+Pv////////////////////////////////////////////////////////////////S1umkrNNQX6pebLG+w9+Fj8RQX6pQX6qMlsfDyOJebLFQX6pVY6y0u9uep9BQX6pQX6pwfLnFyuPo6vT////////////////////////////////Z3O1QX6psebj8/P7////////////////////////6+/1wfLlQX6pQX6qttNf///////+ttNdQX6pQX6ppdrb6+/3///////+ttNdda7Dg4/D39/taaK9QX6pQX6rEyeL///+Vnstyfrv8/P7///+bpM9QX6pQX6plcrT39/v///////////////////+BjMJQX6pQX6pib7P6+/3c3+5YZ67M0eb///////////////////////////////////////////////////////////////////////+zudpQX6pQX6pda7DDyOKAi8FQX6pQX6qNl8jHzORda7BQX6pTYqy7wd6ep9BQX6preLfq7PX///////////////////////////////////+7wd5QX6pWZa3q7PX////////////////////////EyeJQX6pQX6p8h7/8/P7///////+MlsdQX6pQX6qFj8T///////+nr9RWZa3Q1Oj////Z3O1SYatQX6pTYqve4e+2vNxTYqvf4vD////8/P5wfLlQX6pQX6qXoM3////////////////////x8vhaaK9QX6pQX6qPmcns7fZib7OTnMv///////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pjcbO/xeCAi8FQX6pQX6qRm8rGy+Nda7BQX6pTYqyss9erstbk5/L///////////////////////////////////////+mrdRQX6pQX6qkrNP////////////////////s7fZpdrZQX6pyfrvq7PX////////8/P52gr1QX6pQX6pjcbOss9d/isFebLHT1+r////////HzORQX6pQX6pTYqtwfLlTYqzCx+H////////a3e1TYqxQX6pRYKrQ1Oj////////////////////b3u1SYatQX6pQX6pgbrJda7CGkcTd4O+zudrJzeX///////////////////////////////////////////////////////////////////////////+vtthRYKpQX6pib7PDyOKFj8RQX6pQX6qKlMbFyuNaaK9QX6pyfrv8/P7////////////////////////////////////////////Z3O1ndLVQX6pQX6qZos7m6PP39/vx8vi/xeBjcbNQX6qOl8jv8Pf///////////////+DjcNQX6pQX6pQX6pQX6p1gbzh5PH////////////DyOJQX6pQX6pQX6pWZa2/xeD///////////+ep9BQX6pQX6pjcbP5+fz////////////////////Z3O1QX6pQX6pQX6pQX6qDjcP39/vX2+ypsdW9w9////////////////////////////////////////////////////////////////////////////////+4vt1QX6pQX6pda7C+w9+IksVRYKpQX6qzudrP0+h9iMDm6PP////////////////////////////////////////////////////v8Pe6wN2GkcRaaK9ebLFpdrZjcbNebLGOmMjS1un////////////////////////U1+ppdrZda7CBjMK/xeD6+/3////////////////k5/JlcrRWZa2Jk8be4e/////////////////P0+ipsdWnr9TJzeX////////////////////////39/uDjsNYZ65sebixuNn6+/3////u7/fW2evg4/D///////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pgbbKpsdVYZ65QX6qIksX////8/P7////////////////////////////////////////////////////////////////////09frd4O/Q1Oja3e3z9Pn////////////////////////////////////3+Pvz9Pn////////////////////////////////x8vjo6vT////////////////////////////////////////////////////////////////////8/P7s7fb5+fz///////////////////////////////////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pQX6pQX6pQX6qdpc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+0u9tYZ65QX6pQX6pve7no6vT////////////////////////////////////////////////////////////////////////////////////////////////X2+y4vt3////////////////////////////////////////////////////////////////////////////////////////////////b3u7Q1Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b3u6rsta4vt3y8/n////////////////////////////////////////////////////////////////////8/P7q7PXe4e/S1un5+fzQ1Ojk5/L////S1unZ3O3////////V2evS1un6+/3q7PXd4O/v8Pf////Q1OjZ3O3////////m6PPO0ufv8Pfj5fH////////j5fH////g4/DS1unx8viao86Rmsnm6PP////o6vTS1un5+fz////q7PXd4O/X2uv5+fzQ1Ojm6PP////5+fzQ1Ojk5/L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx5hb6iqtKVnsyDjsOutdh4g73t7/apsdWrstb///+ep9CiqtK6wN3y8/l7hr+Vnsvq7PWdpc+ttNeOmMi4vt3f4u+MlsfFyuPq7PWOmMjc3+7g4/CZos62vNyIksXO0ufq7PWPmcmGkcTZ3O3O0ueNl8iutdiUncv39/t4g72mrdSKlMaDjsOttNeFj8T09fqRm8qxt9nf4u/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/t6hb75+fzGy+OTnMv///+Fj8Tf4u/S1umss9fv8Pd/isH////////3+Pt6hb709frf4u+GkcT////u7/eGkcTd4O+Ai8G0u9v5+fy7wd6bpM+mrdTFyuPFyuN7hr/DyOL///+9w9+zudr///+Rm8qGkcSttNePmcnu7/d7hr/8/P60u9uSm8r///+Pmcnv8PeVnsyao87j5fH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vqBjML8/P6+w9+gqNH///+DjcPf4vDM0eaqsdbx8vh1gbz09fr6+/3z9PmJk8b6+/3g4/B7hr/8/P3Q1OiRmsn////t7/aMlsenr9T5+fxve7l5hb7y8/n////k5/J7hr/U1+q9w9+or9X///+VnsugqNH19vr5+fzz9PmFj8T///+vttigqNH///+Nl8jv8Pf8/P6+w997hr/5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/uZos78/P3Lz+axuNn///+ao87m6PPW2eu4vt3///+mrdSRmsmmrdTu7/eiqtL3+Pv///+iqtKXoM2Ol8jd4O/t7/aqsdaVnsvS1un///+VnsyVnsv////T1+qmrdSZos3v8Pfc3+6BjMLLz+bf4u+KlMamrdS+w9/19vqdpc////++w9+zudr///+krNPw8fi/xeCep9CxuNn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P3////8/P78/P7////8/P3////////8/P7////////x8vjz9Pn////8/P7////////////x8vj5+fz////8/P3u7/f3+Pv////39/uNl8jT1+r////3+Pvu7/f8/P7////////19vr19vr////8/P3v8Pf39/v////8/P3////8/P78/P7////8/P7////z9Pnx8vj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7faXoM2nr9T///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+</draw:page>
+</office:presentation>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/txtpic_pdfi_unittest_writer.xml b/sdext/source/pdfimport/test/testdocs/txtpic_pdfi_unittest_writer.xml
new file mode 100644
index 000000000..5a903322c
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/txtpic_pdfi_unittest_writer.xml
@@ -0,0 +1,550 @@
+<?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 .
+-->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="10mm" fo:margin-right="10mm" fo:margin-top="10mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:fill="none" draw:stroke="none" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Thorndale" fo:font-size="12pt" style:font-size-asian="12pt" style:font-size-complex="12pt" >
+
+</style:text-properties>
+
+</style:style>
+<style:style style:family="paragraph" style:master-page-name="master-page3" style:name="paragraph8" >
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:text >
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 20.18mm )" draw:z-index="0" svg:height="4.23mm" svg:width="163.08mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+He heard quiet steps behind him. That didn't bode well. Who could be following him this late at
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 25.05mm )" draw:z-index="1" svg:height="4.23mm" svg:width="165.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+night and in this deadbeat part of town? And at this particular moment, just after he pulled off the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 29.91mm )" draw:z-index="2" svg:height="4.23mm" svg:width="162.03mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+big time and was making off with the greenbacks. Was there another crook who'd had the same
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 34.78mm )" draw:z-index="3" svg:height="4.23mm" svg:width="167.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+idea, and was now watching him and waiting for a chance to grab the fruit of his labor? Or did the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 39.65mm )" draw:z-index="4" svg:height="4.23mm" svg:width="161.92mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+steps behind him mean that one of many law officers in town was on to him and just waiting to
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 44.52mm )" draw:z-index="5" svg:height="4.23mm" svg:width="164.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+pounce and snap those cuffs on his wrists? He nervously looked all around. Suddenly he saw the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 49.39mm )" draw:z-index="6" svg:height="4.23mm" svg:width="165.52mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+alley. Like lightning he darted off to the left and disappeared between the two warehouses almost
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 54.26mm )" draw:z-index="7" svg:height="4.23mm" svg:width="161.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+falling over the trash can lying in the middle of the sidewalk. He tried to nervously tap his way
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 59.12mm )" draw:z-index="8" svg:height="4.23mm" svg:width="168.27mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+along in the inky darkness and suddenly stiffened: it was a dead-end, he would have to go back the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 63.99mm )" draw:z-index="9" svg:height="4.23mm" svg:width="161.39mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+way he had come. The steps got louder and louder, he saw the black outline of a figure coming
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 68.86mm )" draw:z-index="10" svg:height="4.23mm" svg:width="161.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+around the corner. Is this the end of the line? he thought pressing himself back against the wall
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 73.73mm )" draw:z-index="11" svg:height="4.23mm" svg:width="159.56mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+trying to make himself invisible in the dark, was all that planning and energy wasted? He was
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 78.6mm )" draw:z-index="12" svg:height="4.23mm" svg:width="164mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+dripping with sweat now, cold and wet, he could smell the fear coming off his clothes. Suddenly
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 83.47mm )" draw:z-index="13" svg:height="4.23mm" svg:width="167mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+next to him, with a barely noticeable squeak, a door swung quietly to and fro in the night's breeze.
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 88.33mm )" draw:z-index="14" svg:height="4.23mm" svg:width="169.29mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+Could this be the haven he'd prayed for? Slowly he slid toward the door, pressing himself more and
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 93.2mm )" draw:z-index="15" svg:height="4.23mm" svg:width="146.82mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+more into the wall, into the dark, away from his enemy. Would this door save his hide?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 98.07mm )" draw:z-index="16" svg:height="4.23mm" svg:width="163.08mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+He heard quiet steps behind him. That didn't bode well. Who could be following him this late at
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 102.94mm )" draw:z-index="17" svg:height="4.23mm" svg:width="165.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+night and in this deadbeat part of town? And at this particular moment, just after he pulled off the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 107.81mm )" draw:z-index="18" svg:height="4.23mm" svg:width="162.03mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+big time and was making off with the greenbacks. Was there another crook who'd had the same
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 112.68mm )" draw:z-index="19" svg:height="4.23mm" svg:width="167.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+idea, and was now watching him and waiting for a chance to grab the fruit of his labor? Or did the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 117.54mm )" draw:z-index="20" svg:height="4.23mm" svg:width="161.92mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+steps behind him mean that one of many law officers in town was on to him and just waiting to
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 122.41mm )" draw:z-index="21" svg:height="4.23mm" svg:width="164.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+pounce and snap those cuffs on his wrists? He nervously looked all around. Suddenly he saw the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 127.28mm )" draw:z-index="22" svg:height="4.23mm" svg:width="165.52mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+alley. Like lightning he darted off to the left and disappeared between the two warehouses almost
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 132.15mm )" draw:z-index="23" svg:height="4.23mm" svg:width="161.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+falling over the trash can lying in the middle of the sidewalk. He tried to nervously tap his way
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 137.02mm )" draw:z-index="24" svg:height="4.23mm" svg:width="168.27mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+along in the inky darkness and suddenly stiffened: it was a dead-end, he would have to go back the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 141.89mm )" draw:z-index="25" svg:height="4.23mm" svg:width="161.39mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+way he had come. The steps got louder and louder, he saw the black outline of a figure coming
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 146.75mm )" draw:z-index="26" svg:height="4.23mm" svg:width="161.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+around the corner. Is this the end of the line? he thought pressing himself back against the wall
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 151.62mm )" draw:z-index="27" svg:height="4.23mm" svg:width="159.56mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+trying to make himself invisible in the dark, was all that planning and energy wasted? He was
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 156.49mm )" draw:z-index="28" svg:height="4.23mm" svg:width="164mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+dripping with sweat now, cold and wet, he could smell the fear coming off his clothes. Suddenly
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 161.36mm )" draw:z-index="29" svg:height="4.23mm" svg:width="167mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+next to him, with a barely noticeable squeak, a door swung quietly to and fro in the night's breeze.
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 166.23mm )" draw:z-index="30" svg:height="4.23mm" svg:width="169.29mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+Could this be the haven he'd prayed for? Slowly he slid toward the door, pressing himself more and
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 171.1mm )" draw:z-index="31" svg:height="4.23mm" svg:width="146.82mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+more into the wall, into the dark, away from his enemy. Would this door save his hide?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 94.4mm 192.51mm )" draw:z-index="32" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////////w8fiMlsdda7Bve7nBxuH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx8h79QX6pQX6pQX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Z3O1QX6pQX6plcrRYZ65QX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////19vrk5/Lg4/Ds7fb5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fjd4O/j5fFQX6pQX6qBjMK4vt1da7BQX6pVY6y/xeD////////////////////////////////////////////////////////////////////////////////////3+PvAxeCBjMJda7BaaK9YZ65RYKplcrSUncvHzOT5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6vR7hr9da7DT1+qOl8hQX6pQX6qOmMi+w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////////////X2ut1gbxQX6p1gby4vt3e4e/b3u6vtthda7BQX6pQX6qIksX8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vq4vt1QX6pQX6pgbrLM0eaIksVQX6pQX6qGkcS9w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////M0eZWZa1QX6qUncv8/P7////////////////O0udVY6xQX6p0gLv8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8vh2gr2gqNG2vNtRYKpQX6pda7DM0eaDjsNQX6pQX6qIksXBxuFWZa1QX6pRYKq+w9/////////////////////////////////////////////////////////////s7fZebLFQX6pjcbP19vr///////////////////////92gr1QX6qbpM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+UnctQX6pQX6qiqtKvtthRYKpQX6pkcbTHzOSBjMJQX6pQX6qMlsfAxeBda7BQX6pTYqzY2+z///////////////////////////////////////////////////////+krNNQX6pQX6qXoM3///////////////////////////+OmMhQX6rHzOT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7/ePmcm2vNxve7lQX6pQX6qiqtKvtthQX6pQX6plcrTJzeWMlsdQX6pQX6qIksW7wd5gbrKgqNGkrNO0u9v////////////////////////////////////////////////5+fxodbZQX6pQX6qmrdT///////////////////////////+VnstVY6zy8/n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fh4g71QX6ppdrbO0udve7lQX6pQX6qiqtK2vNtTYqtQX6pkcbTFyuOJk8ZQX6pQX6p/isHb3u2gqNFQX6pQX6q+w9/////////////////////////////////////////////o6vRVY6xQX6pQX6qDjcP///////////////////////////+Ol8hyfrv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z9PmAi8FQX6pQX6p/isHGy+PBxuFve7lQX6pQX6qpsdWutdhTYqtQX6pjcbPV2et9iMBQX6qYoc2ttNdRYKpQX6pjcbO4vt3JzuX////////////////////////////////////////m6PNVZK1QX6pQX6pWZa3h5PH///////////////////////+mrdSqsdb////////////s7fa0u9uXoM2zudr5+fz////////////////////////09frZ3O3X2+zg4/D////////////////////EyeKOmMiWn8zq7PX////////////////////e4e+vttidpc+0u9v39/v////////////////////////////////////////////////////v8PeBjMJQX6pQX6qIksW9w99YZ65xfbq9w99rd7dQX6pQX6qiqtKrstZVY6xQX6qao87y8/m2vNypsdVRYKpQX6plcrTEyeJ9iMBQX6qzudr8/P7////////////////////////////////09fpebLFQX6pQX6pQX6qDjsP8/P7////////////////////8/P7////////////Cx+FgbrJQX6pQX6pQX6q4vt3///////////////////////+KlMZSYatSYatrd7f5+fz////////z9PmKlMZQX6pQX6pQX6qgqNH////////////z9PmZos1QX6pQX6pQX6pQX6qXoM3////////////////////////////////////////////////v8Pd4g71QX6pQX6qMlsfAxeBda7BQX6pRYKrJzeXo6vRodbZQX6pQX6p9iMBWZa1QX6qMlsf///+utdhQX6pQX6prd7fFyuN/isFQX6pQX6qKlMb///////////////////////////////////////+KlMZQX6pQX6pQX6pQX6qiqtL///////////////////////////////+6wN1QX6pRYKpQX6pQX6pQX6qpsdX////////////////////c3+5SYatQX6pQX6qZos3////////v8Pd5hb5RYKpTYqtQX6pQX6qOl8j////////o6vRyfrtda7CZos56hb5QX6pQX6plcrT5+fz////////////////////////////////////////19vp5hb5QX6pQX6qIksXBxuFWZa1QX6pTYqzEyeL09frt7/bd4O9mc7VQX6pQX6pQX6pQX6q9w9+vtthQX6pQX6pkcbTM0eZ/isFQX6pQX6qMlsfz9Pno6vT19vr////////////////////////////////FyuNQX6pQX6pQX6pQX6pQX6qxt9n////////////////////////U1+pQX6q4vt2vtthQX6pQX6pQX6rO0uf///////////////////+iqtJQX6pQX6pSYavY2+z////8/P57hr9ib7Pb3u5pdrZQX6pQX6qkrNP////w8fhpdrZ4g73s7fb///+6wN1QX6pQX6pib7P39/v////////////////////////////////////19vqAi8FQX6pQX6qGkcS9w99da7BQX6pVY6y6wN2mrdRgbbJYZ66DjcPFyuN9iMBVY6xaaK+gqNGqsdZQX6pQX6pkcbTFyuN9iMBQX6pQX6qRmsnFyuNxfbpWZa1ndLW2vNv////////////////////////////5+fx2gr1QX6pQX6pQX6pQX6pWZa3M0eb////////////////z9Plmc7WgqNH///+PmclQX6pQX6pndLX39/v///////////////////9yfrtQX6pQX6pve7n8/P7///+krNNaaK/g4/Dy8/lYZ65QX6pQX6rFyuP5+fx2gr1+icD39/v///////+XoM1QX6pQX6p1gbz8/P7///////////////////////////////////+TnMtQX6pQX6qPmcm+w99da7BQX6pVY6y7wd6ao85QX6pQX6pQX6pQX6p2gr319vrg4/Dq7PXT1+pRYKpQX6pndLXFyuN9iMBQX6pQX6qSm8q7wd5YZ65QX6pQX6pQX6pRYKrX2uv////////////////////////////Y2+xVY6xQX6pQX6pQX6pQX6pgbbLj5fH///////////+gqNFxfbr8/P7s7fZYZ65QX6pQX6qgqNH////////////////////X2+xTYqtQX6pQX6qep9D////d4O9WZa3O0uf////FyuNQX6pQX6pWZa3s7faKlMZxfbr39/v////////5+fxodbZQX6pQX6qWn8z///////////////////////////////////////9YZ65QX6prd7ext9lda7BQX6pYZ67DyOKZos5QX6pQX6pwfLlyfrtQX6pQX6rg4/D///////+iqtJQX6pVY6yzudp/isFQX6pQX6qSm8q9w99YZ65QX6paaK+BjMJRYKpQX6qmrdT///////////////////////////////+2vNtQX6pQX6pQX6pQX6pQX6p2gr36+/3////h5PFebLHb3u3///+2vNxQX6pQX6pQX6rU1+r///////////////////+XoM1QX6pQX6pTYqvb3u3///+Zos6ao87///////+Zos5QX6pQX6qDjsOttNdmc7Xs7fb////////////FyuNQX6pQX6pQX6rJzeX///////////////////////////////////////9jcbNQX6pVY6xRYKpQX6pWZa26wN2gqNFQX6pQX6p2gr3JzeVyfrtQX6pWZa3x8vj///////+xt9lQX6pRYKpYZ65QX6pQX6qSm8rDyOJaaK9QX6pVZK26wN2VnstQX6pQX6q4vt3///////////////////////////////////+PmclQX6pQX6pQX6pQX6pQX6qttNf////Z3O20u9v////8/P54g71QX6pQX6preLf5+fz////////////////09fpkcbRQX6pQX6pve7n8/P7////h5PH39/v////3+PtodbZQX6pRYKqMlsdlcrTQ1Oj///////////////+GkcRQX6pQX6pjcbP19vr///////////////////////////////////////+6wN1QX6pQX6pQX6pWZa26wN2bpM9QX6pQX6p2gr3HzORyfrtQX6pQX6qpsdXO0uekrNO0u9vU1+prd7dQX6pQX6pQX6qTnMu7wd5aaK9QX6paaK++w9+VnstQX6pQX6pyfrv09fr////////////////////////////////////19vpwfLlQX6pQX6pQX6pQX6paaK/s7fb////////////Z3O1RYKpQX6pQX6qrstb///////////////////+xt9lQX6pQX6pQX6qep9D////////////////////U1+pRYKpQX6pSYatRYKqgqNH////////////////m6PNYZ65QX6pQX6qRmsn////////////////////////////////////////////////Gy+OOmMiTnMvO0ueZos5QX6pQX6p1gbzGy+NreLdQX6pQX6qkrNOpsdVRYKpQX6pQX6pwfLnFyuOgqNGMlse4vt29w99YZ65QX6paaK+9w9+Sm8pQX6pQX6p4g73o6vT////////////////////////////////////////////Z3O1YZ65QX6pQX6pQX6pQX6q/xeD///////////+gqNFQX6pQX6pVY6zh5PH////////////////09fpndLVQX6pQX6pSYavX2uv///////////////////+mrdRQX6pQX6pQX6pndLXz9Pn///////////////+ep9BQX6pQX6pQX6rO0uf////////////////////////////////////////////////////////6+/2bpM9QX6pQX6pwfLnLz+ZsebhQX6pQX6qgqNHq7PVVY6xQX6pSYatQX6pQX6psebju7/f////HzORVY6xQX6pVZK2+w9+Rm8pQX6pQX6pxfbrv8Pf///////////////////////////////////////////////////+XoM1QX6pQX6pQX6pQX6qkrNP////////39/tlcrRQX6pQX6qAi8H///////////////////+ep9BQX6pQX6pQX6pve7n8/P7////////////////6+/1ve7lQX6pQX6pQX6q9w9/////////////////x8vhebLFQX6pQX6pyfrv8/P7////////////////////////////////////////////////////////O0udQX6pQX6p2gr3Lz+ZxfbpQX6pQX6qYoc3////c3+5QX6pQX6qGkcSZos1QX6pQX6pwfLnh5PF2gr1QX6pYZ664vt2VnstQX6pQX6pwfLno6vT////////////////////V2euzudr////////////////////////////k5/JYZ65QX6pQX6pQX6qZos7////////O0udQX6pQX6pQX6q9w9/////////////////S1ulVZK1VY6xQX6pQX6qYoc3////////////////////Q1OhRYKpQX6pQX6pve7n3+Pv////////////////AxeBQX6pQX6pQX6qzudr////////////////////////////////////////////////////////////8/P6zudp4g73EyeJsebhQX6pQX6qkrNOpsdWDjsPs7fZodbZQX6paaK+2vNykrNNQX6pQX6preLe/xeB7hr+4vt2Wn8xQX6pQX6pxfbro6vT///////////////////////+Nl8hrd7f///////////////////////////////+DjcNQX6pQX6pQX6qiqtL///////+Zos1QX6pQX6pda7Dv8Pf////////////z9Plve7mRm8paaK9QX6pQX6rO0uf////8/P6ao87k5/L///+Yoc1QX6pQX6pRYKrJzeX///////////////////+Ai8FQX6pQX6pWZa3o6vT////S1umzudr////////////////////////////////////////////////////////o6vRsebhQX6pQX6qiqtLDyOJQX6pQX6qOmMjLz+ZebLFQX6pVY6y2vNyao85QX6pQX6pyfrvg4/CiqtJQX6pQX6pwfLnq7PX///////////////////////////9yfrt0gLv///////////////////////////////+ep9BQX6pQX6pQX6q/xeD////39/tlcrRQX6pQX6qPmcn///////////////+OmMiOl8ixt9lQX6pQX6pmc7X3+Pv////O0udaaK/x8vj8/P5sebhQX6pQX6pyfrv////////////////////k5/JVY6xQX6pQX6qJk8b////8/P5yfrukrNP///////////////////////////////////////////////////////////+qsdZSYauZos2zudq4vt2DjsNQX6pQX6qNl8jDyOJebLFQX6pVY6y2vNuao85QX6pQX6p0gLu9w99pdrZsebjq7PX////////////////////////////19vpYZ654g73///////////////////////////////+Zos1QX6pQX6paaK/s7fb////T1+pQX6pQX6pRYKrS1un///////////+rstZrd7f09fqAi8FQX6pQX6qZos3////3+PtsebittNf////U1+pRYKpQX6pQX6q4vt3///////////////////+0u9tQX6pQX6pQX6rHzOT///+zudppdrb3+Pv////////////////////////////////////////////////////////////////S1umkrNNQX6pebLG+w9+Fj8RQX6pQX6qMlsfDyOJebLFQX6pVY6y0u9uep9BQX6pQX6pwfLnFyuPo6vT////////////////////////////////Z3O1QX6psebj8/P7////////////////////////6+/1wfLlQX6pQX6qttNf///////+ttNdQX6pQX6ppdrb6+/3///////+ttNdda7Dg4/D39/taaK9QX6pQX6rEyeL///+Vnstyfrv8/P7///+bpM9QX6pQX6plcrT39/v///////////////////+BjMJQX6pQX6pib7P6+/3c3+5YZ67M0eb///////////////////////////////////////////////////////////////////////+zudpQX6pQX6pda7DDyOKAi8FQX6pQX6qNl8jHzORda7BQX6pTYqy7wd6ep9BQX6preLfq7PX///////////////////////////////////+7wd5QX6pWZa3q7PX////////////////////////EyeJQX6pQX6p8h7/8/P7///////+MlsdQX6pQX6qFj8T///////+nr9RWZa3Q1Oj////Z3O1SYatQX6pTYqve4e+2vNxTYqvf4vD////8/P5wfLlQX6pQX6qXoM3////////////////////x8vhaaK9QX6pQX6qPmcns7fZib7OTnMv///////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pjcbO/xeCAi8FQX6pQX6qRm8rGy+Nda7BQX6pTYqyss9erstbk5/L///////////////////////////////////////+mrdRQX6pQX6qkrNP////////////////////s7fZpdrZQX6pyfrvq7PX////////8/P52gr1QX6pQX6pjcbOss9d/isFebLHT1+r////////HzORQX6pQX6pTYqtwfLlTYqzCx+H////////a3e1TYqxQX6pRYKrQ1Oj////////////////////b3u1SYatQX6pQX6pgbrJda7CGkcTd4O+zudrJzeX///////////////////////////////////////////////////////////////////////////+vtthRYKpQX6pib7PDyOKFj8RQX6pQX6qKlMbFyuNaaK9QX6pyfrv8/P7////////////////////////////////////////////Z3O1ndLVQX6pQX6qZos7m6PP39/vx8vi/xeBjcbNQX6qOl8jv8Pf///////////////+DjcNQX6pQX6pQX6pQX6p1gbzh5PH////////////DyOJQX6pQX6pQX6pWZa2/xeD///////////+ep9BQX6pQX6pjcbP5+fz////////////////////Z3O1QX6pQX6pQX6pQX6qDjcP39/vX2+ypsdW9w9////////////////////////////////////////////////////////////////////////////////+4vt1QX6pQX6pda7C+w9+IksVRYKpQX6qzudrP0+h9iMDm6PP////////////////////////////////////////////////////v8Pe6wN2GkcRaaK9ebLFpdrZjcbNebLGOmMjS1un////////////////////////U1+ppdrZda7CBjMK/xeD6+/3////////////////k5/JlcrRWZa2Jk8be4e/////////////////P0+ipsdWnr9TJzeX////////////////////////39/uDjsNYZ65sebixuNn6+/3////u7/fW2evg4/D///////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pgbbKpsdVYZ65QX6qIksX////8/P7////////////////////////////////////////////////////////////////////09frd4O/Q1Oja3e3z9Pn////////////////////////////////////3+Pvz9Pn////////////////////////////////x8vjo6vT////////////////////////////////////////////////////////////////////8/P7s7fb5+fz///////////////////////////////////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pQX6pQX6pQX6qdpc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+0u9tYZ65QX6pQX6pve7no6vT////////////////////////////////////////////////////////////////////////////////////////////////X2+y4vt3////////////////////////////////////////////////////////////////////////////////////////////////b3u7Q1Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b3u6rsta4vt3y8/n////////////////////////////////////////////////////////////////////8/P7q7PXe4e/S1un5+fzQ1Ojk5/L////S1unZ3O3////////V2evS1un6+/3q7PXd4O/v8Pf////Q1OjZ3O3////////m6PPO0ufv8Pfj5fH////////j5fH////g4/DS1unx8viao86Rmsnm6PP////o6vTS1un5+fz////q7PXd4O/X2uv5+fzQ1Ojm6PP////5+fzQ1Ojk5/L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx5hb6iqtKVnsyDjsOutdh4g73t7/apsdWrstb///+ep9CiqtK6wN3y8/l7hr+Vnsvq7PWdpc+ttNeOmMi4vt3f4u+MlsfFyuPq7PWOmMjc3+7g4/CZos62vNyIksXO0ufq7PWPmcmGkcTZ3O3O0ueNl8iutdiUncv39/t4g72mrdSKlMaDjsOttNeFj8T09fqRm8qxt9nf4u/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/t6hb75+fzGy+OTnMv///+Fj8Tf4u/S1umss9fv8Pd/isH////////3+Pt6hb709frf4u+GkcT////u7/eGkcTd4O+Ai8G0u9v5+fy7wd6bpM+mrdTFyuPFyuN7hr/DyOL///+9w9+zudr///+Rm8qGkcSttNePmcnu7/d7hr/8/P60u9uSm8r///+Pmcnv8PeVnsyao87j5fH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vqBjML8/P6+w9+gqNH///+DjcPf4vDM0eaqsdbx8vh1gbz09fr6+/3z9PmJk8b6+/3g4/B7hr/8/P3Q1OiRmsn////t7/aMlsenr9T5+fxve7l5hb7y8/n////k5/J7hr/U1+q9w9+or9X///+VnsugqNH19vr5+fzz9PmFj8T///+vttigqNH///+Nl8jv8Pf8/P6+w997hr/5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/uZos78/P3Lz+axuNn///+ao87m6PPW2eu4vt3///+mrdSRmsmmrdTu7/eiqtL3+Pv///+iqtKXoM2Ol8jd4O/t7/aqsdaVnsvS1un///+VnsyVnsv////T1+qmrdSZos3v8Pfc3+6BjMLLz+bf4u+KlMamrdS+w9/19vqdpc////++w9+zudr///+krNPw8fi/xeCep9CxuNn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P3////8/P78/P7////8/P3////////8/P7////////x8vjz9Pn////8/P7////////////x8vj5+fz////8/P3u7/f3+Pv////39/uNl8jT1+r////3+Pvu7/f8/P7////////19vr19vr////8/P3v8Pf39/v////8/P3////8/P78/P7////8/P7////z9Pnx8vj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7faXoM2nr9T///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<text:p text:style-name="paragraph8" >
+</text:p>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 20.18mm )" draw:z-index="0" svg:height="4.23mm" svg:width="163.08mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 25.05mm )" draw:z-index="1" svg:height="4.23mm" svg:width="165.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 29.91mm )" draw:z-index="2" svg:height="4.23mm" svg:width="162.03mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 34.78mm )" draw:z-index="3" svg:height="4.23mm" svg:width="167.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 39.65mm )" draw:z-index="4" svg:height="4.23mm" svg:width="161.92mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 44.52mm )" draw:z-index="5" svg:height="4.23mm" svg:width="164.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 49.39mm )" draw:z-index="6" svg:height="4.23mm" svg:width="165.52mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 54.26mm )" draw:z-index="7" svg:height="4.23mm" svg:width="161.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 59.12mm )" draw:z-index="8" svg:height="4.23mm" svg:width="168.27mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 63.99mm )" draw:z-index="9" svg:height="4.23mm" svg:width="161.39mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 68.86mm )" draw:z-index="10" svg:height="4.23mm" svg:width="161.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 73.73mm )" draw:z-index="11" svg:height="4.23mm" svg:width="159.56mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 78.6mm )" draw:z-index="12" svg:height="4.23mm" svg:width="164mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 83.47mm )" draw:z-index="13" svg:height="4.23mm" svg:width="167mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 88.33mm )" draw:z-index="14" svg:height="4.23mm" svg:width="169.29mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 93.2mm )" draw:z-index="15" svg:height="4.23mm" svg:width="146.82mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 98.07mm )" draw:z-index="16" svg:height="4.23mm" svg:width="163.08mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 102.94mm )" draw:z-index="17" svg:height="4.23mm" svg:width="165.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 107.81mm )" draw:z-index="18" svg:height="4.23mm" svg:width="162.03mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 112.68mm )" draw:z-index="19" svg:height="4.23mm" svg:width="167.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 117.54mm )" draw:z-index="20" svg:height="4.23mm" svg:width="161.92mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 122.41mm )" draw:z-index="21" svg:height="4.23mm" svg:width="164.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 127.28mm )" draw:z-index="22" svg:height="4.23mm" svg:width="165.52mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 132.15mm )" draw:z-index="23" svg:height="4.23mm" svg:width="161.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 137.02mm )" draw:z-index="24" svg:height="4.23mm" svg:width="168.27mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 141.89mm )" draw:z-index="25" svg:height="4.23mm" svg:width="161.39mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 146.75mm )" draw:z-index="26" svg:height="4.23mm" svg:width="161.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 151.62mm )" draw:z-index="27" svg:height="4.23mm" svg:width="159.56mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 156.49mm )" draw:z-index="28" svg:height="4.23mm" svg:width="164mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 161.36mm )" draw:z-index="29" svg:height="4.23mm" svg:width="167mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 166.23mm )" draw:z-index="30" svg:height="4.23mm" svg:width="169.29mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 171.1mm )" draw:z-index="31" svg:height="4.23mm" svg:width="146.82mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 94.4mm 192.51mm )" draw:z-index="32" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////////w8fiMlsdda7Bve7nBxuH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx8h79QX6pQX6pQX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Z3O1QX6pQX6plcrRYZ65QX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////19vrk5/Lg4/Ds7fb5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fjd4O/j5fFQX6pQX6qBjMK4vt1da7BQX6pVY6y/xeD////////////////////////////////////////////////////////////////////////////////////3+PvAxeCBjMJda7BaaK9YZ65RYKplcrSUncvHzOT5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6vR7hr9da7DT1+qOl8hQX6pQX6qOmMi+w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////////////X2ut1gbxQX6p1gby4vt3e4e/b3u6vtthda7BQX6pQX6qIksX8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vq4vt1QX6pQX6pgbrLM0eaIksVQX6pQX6qGkcS9w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////M0eZWZa1QX6qUncv8/P7////////////////O0udVY6xQX6p0gLv8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8vh2gr2gqNG2vNtRYKpQX6pda7DM0eaDjsNQX6pQX6qIksXBxuFWZa1QX6pRYKq+w9/////////////////////////////////////////////////////////////s7fZebLFQX6pjcbP19vr///////////////////////92gr1QX6qbpM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+UnctQX6pQX6qiqtKvtthRYKpQX6pkcbTHzOSBjMJQX6pQX6qMlsfAxeBda7BQX6pTYqzY2+z///////////////////////////////////////////////////////+krNNQX6pQX6qXoM3///////////////////////////+OmMhQX6rHzOT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7/ePmcm2vNxve7lQX6pQX6qiqtKvtthQX6pQX6plcrTJzeWMlsdQX6pQX6qIksW7wd5gbrKgqNGkrNO0u9v////////////////////////////////////////////////5+fxodbZQX6pQX6qmrdT///////////////////////////+VnstVY6zy8/n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fh4g71QX6ppdrbO0udve7lQX6pQX6qiqtK2vNtTYqtQX6pkcbTFyuOJk8ZQX6pQX6p/isHb3u2gqNFQX6pQX6q+w9/////////////////////////////////////////////o6vRVY6xQX6pQX6qDjcP///////////////////////////+Ol8hyfrv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z9PmAi8FQX6pQX6p/isHGy+PBxuFve7lQX6pQX6qpsdWutdhTYqtQX6pjcbPV2et9iMBQX6qYoc2ttNdRYKpQX6pjcbO4vt3JzuX////////////////////////////////////////m6PNVZK1QX6pQX6pWZa3h5PH///////////////////////+mrdSqsdb////////////s7fa0u9uXoM2zudr5+fz////////////////////////09frZ3O3X2+zg4/D////////////////////EyeKOmMiWn8zq7PX////////////////////e4e+vttidpc+0u9v39/v////////////////////////////////////////////////////v8PeBjMJQX6pQX6qIksW9w99YZ65xfbq9w99rd7dQX6pQX6qiqtKrstZVY6xQX6qao87y8/m2vNypsdVRYKpQX6plcrTEyeJ9iMBQX6qzudr8/P7////////////////////////////////09fpebLFQX6pQX6pQX6qDjsP8/P7////////////////////8/P7////////////Cx+FgbrJQX6pQX6pQX6q4vt3///////////////////////+KlMZSYatSYatrd7f5+fz////////z9PmKlMZQX6pQX6pQX6qgqNH////////////z9PmZos1QX6pQX6pQX6pQX6qXoM3////////////////////////////////////////////////v8Pd4g71QX6pQX6qMlsfAxeBda7BQX6pRYKrJzeXo6vRodbZQX6pQX6p9iMBWZa1QX6qMlsf///+utdhQX6pQX6prd7fFyuN/isFQX6pQX6qKlMb///////////////////////////////////////+KlMZQX6pQX6pQX6pQX6qiqtL///////////////////////////////+6wN1QX6pRYKpQX6pQX6pQX6qpsdX////////////////////c3+5SYatQX6pQX6qZos3////////v8Pd5hb5RYKpTYqtQX6pQX6qOl8j////////o6vRyfrtda7CZos56hb5QX6pQX6plcrT5+fz////////////////////////////////////////19vp5hb5QX6pQX6qIksXBxuFWZa1QX6pTYqzEyeL09frt7/bd4O9mc7VQX6pQX6pQX6pQX6q9w9+vtthQX6pQX6pkcbTM0eZ/isFQX6pQX6qMlsfz9Pno6vT19vr////////////////////////////////FyuNQX6pQX6pQX6pQX6pQX6qxt9n////////////////////////U1+pQX6q4vt2vtthQX6pQX6pQX6rO0uf///////////////////+iqtJQX6pQX6pSYavY2+z////8/P57hr9ib7Pb3u5pdrZQX6pQX6qkrNP////w8fhpdrZ4g73s7fb///+6wN1QX6pQX6pib7P39/v////////////////////////////////////19vqAi8FQX6pQX6qGkcS9w99da7BQX6pVY6y6wN2mrdRgbbJYZ66DjcPFyuN9iMBVY6xaaK+gqNGqsdZQX6pQX6pkcbTFyuN9iMBQX6pQX6qRmsnFyuNxfbpWZa1ndLW2vNv////////////////////////////5+fx2gr1QX6pQX6pQX6pQX6pWZa3M0eb////////////////z9Plmc7WgqNH///+PmclQX6pQX6pndLX39/v///////////////////9yfrtQX6pQX6pve7n8/P7///+krNNaaK/g4/Dy8/lYZ65QX6pQX6rFyuP5+fx2gr1+icD39/v///////+XoM1QX6pQX6p1gbz8/P7///////////////////////////////////+TnMtQX6pQX6qPmcm+w99da7BQX6pVY6y7wd6ao85QX6pQX6pQX6pQX6p2gr319vrg4/Dq7PXT1+pRYKpQX6pndLXFyuN9iMBQX6pQX6qSm8q7wd5YZ65QX6pQX6pQX6pRYKrX2uv////////////////////////////Y2+xVY6xQX6pQX6pQX6pQX6pgbbLj5fH///////////+gqNFxfbr8/P7s7fZYZ65QX6pQX6qgqNH////////////////////X2+xTYqtQX6pQX6qep9D////d4O9WZa3O0uf////FyuNQX6pQX6pWZa3s7faKlMZxfbr39/v////////5+fxodbZQX6pQX6qWn8z///////////////////////////////////////9YZ65QX6prd7ext9lda7BQX6pYZ67DyOKZos5QX6pQX6pwfLlyfrtQX6pQX6rg4/D///////+iqtJQX6pVY6yzudp/isFQX6pQX6qSm8q9w99YZ65QX6paaK+BjMJRYKpQX6qmrdT///////////////////////////////+2vNtQX6pQX6pQX6pQX6pQX6p2gr36+/3////h5PFebLHb3u3///+2vNxQX6pQX6pQX6rU1+r///////////////////+XoM1QX6pQX6pTYqvb3u3///+Zos6ao87///////+Zos5QX6pQX6qDjsOttNdmc7Xs7fb////////////FyuNQX6pQX6pQX6rJzeX///////////////////////////////////////9jcbNQX6pVY6xRYKpQX6pWZa26wN2gqNFQX6pQX6p2gr3JzeVyfrtQX6pWZa3x8vj///////+xt9lQX6pRYKpYZ65QX6pQX6qSm8rDyOJaaK9QX6pVZK26wN2VnstQX6pQX6q4vt3///////////////////////////////////+PmclQX6pQX6pQX6pQX6pQX6qttNf////Z3O20u9v////8/P54g71QX6pQX6preLf5+fz////////////////09fpkcbRQX6pQX6pve7n8/P7////h5PH39/v////3+PtodbZQX6pRYKqMlsdlcrTQ1Oj///////////////+GkcRQX6pQX6pjcbP19vr///////////////////////////////////////+6wN1QX6pQX6pQX6pWZa26wN2bpM9QX6pQX6p2gr3HzORyfrtQX6pQX6qpsdXO0uekrNO0u9vU1+prd7dQX6pQX6pQX6qTnMu7wd5aaK9QX6paaK++w9+VnstQX6pQX6pyfrv09fr////////////////////////////////////19vpwfLlQX6pQX6pQX6pQX6paaK/s7fb////////////Z3O1RYKpQX6pQX6qrstb///////////////////+xt9lQX6pQX6pQX6qep9D////////////////////U1+pRYKpQX6pSYatRYKqgqNH////////////////m6PNYZ65QX6pQX6qRmsn////////////////////////////////////////////////Gy+OOmMiTnMvO0ueZos5QX6pQX6p1gbzGy+NreLdQX6pQX6qkrNOpsdVRYKpQX6pQX6pwfLnFyuOgqNGMlse4vt29w99YZ65QX6paaK+9w9+Sm8pQX6pQX6p4g73o6vT////////////////////////////////////////////Z3O1YZ65QX6pQX6pQX6pQX6q/xeD///////////+gqNFQX6pQX6pVY6zh5PH////////////////09fpndLVQX6pQX6pSYavX2uv///////////////////+mrdRQX6pQX6pQX6pndLXz9Pn///////////////+ep9BQX6pQX6pQX6rO0uf////////////////////////////////////////////////////////6+/2bpM9QX6pQX6pwfLnLz+ZsebhQX6pQX6qgqNHq7PVVY6xQX6pSYatQX6pQX6psebju7/f////HzORVY6xQX6pVZK2+w9+Rm8pQX6pQX6pxfbrv8Pf///////////////////////////////////////////////////+XoM1QX6pQX6pQX6pQX6qkrNP////////39/tlcrRQX6pQX6qAi8H///////////////////+ep9BQX6pQX6pQX6pve7n8/P7////////////////6+/1ve7lQX6pQX6pQX6q9w9/////////////////x8vhebLFQX6pQX6pyfrv8/P7////////////////////////////////////////////////////////O0udQX6pQX6p2gr3Lz+ZxfbpQX6pQX6qYoc3////c3+5QX6pQX6qGkcSZos1QX6pQX6pwfLnh5PF2gr1QX6pYZ664vt2VnstQX6pQX6pwfLno6vT////////////////////V2euzudr////////////////////////////k5/JYZ65QX6pQX6pQX6qZos7////////O0udQX6pQX6pQX6q9w9/////////////////S1ulVZK1VY6xQX6pQX6qYoc3////////////////////Q1OhRYKpQX6pQX6pve7n3+Pv////////////////AxeBQX6pQX6pQX6qzudr////////////////////////////////////////////////////////////8/P6zudp4g73EyeJsebhQX6pQX6qkrNOpsdWDjsPs7fZodbZQX6paaK+2vNykrNNQX6pQX6preLe/xeB7hr+4vt2Wn8xQX6pQX6pxfbro6vT///////////////////////+Nl8hrd7f///////////////////////////////+DjcNQX6pQX6pQX6qiqtL///////+Zos1QX6pQX6pda7Dv8Pf////////////z9Plve7mRm8paaK9QX6pQX6rO0uf////8/P6ao87k5/L///+Yoc1QX6pQX6pRYKrJzeX///////////////////+Ai8FQX6pQX6pWZa3o6vT////S1umzudr////////////////////////////////////////////////////////o6vRsebhQX6pQX6qiqtLDyOJQX6pQX6qOmMjLz+ZebLFQX6pVY6y2vNyao85QX6pQX6pyfrvg4/CiqtJQX6pQX6pwfLnq7PX///////////////////////////9yfrt0gLv///////////////////////////////+ep9BQX6pQX6pQX6q/xeD////39/tlcrRQX6pQX6qPmcn///////////////+OmMiOl8ixt9lQX6pQX6pmc7X3+Pv////O0udaaK/x8vj8/P5sebhQX6pQX6pyfrv////////////////////k5/JVY6xQX6pQX6qJk8b////8/P5yfrukrNP///////////////////////////////////////////////////////////+qsdZSYauZos2zudq4vt2DjsNQX6pQX6qNl8jDyOJebLFQX6pVY6y2vNuao85QX6pQX6p0gLu9w99pdrZsebjq7PX////////////////////////////19vpYZ654g73///////////////////////////////+Zos1QX6pQX6paaK/s7fb////T1+pQX6pQX6pRYKrS1un///////////+rstZrd7f09fqAi8FQX6pQX6qZos3////3+PtsebittNf////U1+pRYKpQX6pQX6q4vt3///////////////////+0u9tQX6pQX6pQX6rHzOT///+zudppdrb3+Pv////////////////////////////////////////////////////////////////S1umkrNNQX6pebLG+w9+Fj8RQX6pQX6qMlsfDyOJebLFQX6pVY6y0u9uep9BQX6pQX6pwfLnFyuPo6vT////////////////////////////////Z3O1QX6psebj8/P7////////////////////////6+/1wfLlQX6pQX6qttNf///////+ttNdQX6pQX6ppdrb6+/3///////+ttNdda7Dg4/D39/taaK9QX6pQX6rEyeL///+Vnstyfrv8/P7///+bpM9QX6pQX6plcrT39/v///////////////////+BjMJQX6pQX6pib7P6+/3c3+5YZ67M0eb///////////////////////////////////////////////////////////////////////+zudpQX6pQX6pda7DDyOKAi8FQX6pQX6qNl8jHzORda7BQX6pTYqy7wd6ep9BQX6preLfq7PX///////////////////////////////////+7wd5QX6pWZa3q7PX////////////////////////EyeJQX6pQX6p8h7/8/P7///////+MlsdQX6pQX6qFj8T///////+nr9RWZa3Q1Oj////Z3O1SYatQX6pTYqve4e+2vNxTYqvf4vD////8/P5wfLlQX6pQX6qXoM3////////////////////x8vhaaK9QX6pQX6qPmcns7fZib7OTnMv///////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pjcbO/xeCAi8FQX6pQX6qRm8rGy+Nda7BQX6pTYqyss9erstbk5/L///////////////////////////////////////+mrdRQX6pQX6qkrNP////////////////////s7fZpdrZQX6pyfrvq7PX////////8/P52gr1QX6pQX6pjcbOss9d/isFebLHT1+r////////HzORQX6pQX6pTYqtwfLlTYqzCx+H////////a3e1TYqxQX6pRYKrQ1Oj////////////////////b3u1SYatQX6pQX6pgbrJda7CGkcTd4O+zudrJzeX///////////////////////////////////////////////////////////////////////////+vtthRYKpQX6pib7PDyOKFj8RQX6pQX6qKlMbFyuNaaK9QX6pyfrv8/P7////////////////////////////////////////////Z3O1ndLVQX6pQX6qZos7m6PP39/vx8vi/xeBjcbNQX6qOl8jv8Pf///////////////+DjcNQX6pQX6pQX6pQX6p1gbzh5PH////////////DyOJQX6pQX6pQX6pWZa2/xeD///////////+ep9BQX6pQX6pjcbP5+fz////////////////////Z3O1QX6pQX6pQX6pQX6qDjcP39/vX2+ypsdW9w9////////////////////////////////////////////////////////////////////////////////+4vt1QX6pQX6pda7C+w9+IksVRYKpQX6qzudrP0+h9iMDm6PP////////////////////////////////////////////////////v8Pe6wN2GkcRaaK9ebLFpdrZjcbNebLGOmMjS1un////////////////////////U1+ppdrZda7CBjMK/xeD6+/3////////////////k5/JlcrRWZa2Jk8be4e/////////////////P0+ipsdWnr9TJzeX////////////////////////39/uDjsNYZ65sebixuNn6+/3////u7/fW2evg4/D///////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pgbbKpsdVYZ65QX6qIksX////8/P7////////////////////////////////////////////////////////////////////09frd4O/Q1Oja3e3z9Pn////////////////////////////////////3+Pvz9Pn////////////////////////////////x8vjo6vT////////////////////////////////////////////////////////////////////8/P7s7fb5+fz///////////////////////////////////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pQX6pQX6pQX6qdpc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+0u9tYZ65QX6pQX6pve7no6vT////////////////////////////////////////////////////////////////////////////////////////////////X2+y4vt3////////////////////////////////////////////////////////////////////////////////////////////////b3u7Q1Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b3u6rsta4vt3y8/n////////////////////////////////////////////////////////////////////8/P7q7PXe4e/S1un5+fzQ1Ojk5/L////S1unZ3O3////////V2evS1un6+/3q7PXd4O/v8Pf////Q1OjZ3O3////////m6PPO0ufv8Pfj5fH////////j5fH////g4/DS1unx8viao86Rmsnm6PP////o6vTS1un5+fz////q7PXd4O/X2uv5+fzQ1Ojm6PP////5+fzQ1Ojk5/L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx5hb6iqtKVnsyDjsOutdh4g73t7/apsdWrstb///+ep9CiqtK6wN3y8/l7hr+Vnsvq7PWdpc+ttNeOmMi4vt3f4u+MlsfFyuPq7PWOmMjc3+7g4/CZos62vNyIksXO0ufq7PWPmcmGkcTZ3O3O0ueNl8iutdiUncv39/t4g72mrdSKlMaDjsOttNeFj8T09fqRm8qxt9nf4u/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/t6hb75+fzGy+OTnMv///+Fj8Tf4u/S1umss9fv8Pd/isH////////3+Pt6hb709frf4u+GkcT////u7/eGkcTd4O+Ai8G0u9v5+fy7wd6bpM+mrdTFyuPFyuN7hr/DyOL///+9w9+zudr///+Rm8qGkcSttNePmcnu7/d7hr/8/P60u9uSm8r///+Pmcnv8PeVnsyao87j5fH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vqBjML8/P6+w9+gqNH///+DjcPf4vDM0eaqsdbx8vh1gbz09fr6+/3z9PmJk8b6+/3g4/B7hr/8/P3Q1OiRmsn////t7/aMlsenr9T5+fxve7l5hb7y8/n////k5/J7hr/U1+q9w9+or9X///+VnsugqNH19vr5+fzz9PmFj8T///+vttigqNH///+Nl8jv8Pf8/P6+w997hr/5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/uZos78/P3Lz+axuNn///+ao87m6PPW2eu4vt3///+mrdSRmsmmrdTu7/eiqtL3+Pv///+iqtKXoM2Ol8jd4O/t7/aqsdaVnsvS1un///+VnsyVnsv////T1+qmrdSZos3v8Pfc3+6BjMLLz+bf4u+KlMamrdS+w9/19vqdpc////++w9+zudr///+krNPw8fi/xeCep9CxuNn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P3////8/P78/P7////8/P3////////8/P7////////x8vjz9Pn////8/P7////////////x8vj5+fz////8/P3u7/f3+Pv////39/uNl8jT1+r////3+Pvu7/f8/P7////////19vr19vr////8/P3v8Pf39/v////8/P3////8/P78/P7////8/P7////z9Pnx8vj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7faXoM2nr9T///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+</office:text>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/txtpictxt.pdf b/sdext/source/pdfimport/test/testdocs/txtpictxt.pdf
new file mode 100644
index 000000000..bd79f7406
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/txtpictxt.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/testdocs/txtpictxt_pdfi_unittest_draw.xml b/sdext/source/pdfimport/test/testdocs/txtpictxt_pdfi_unittest_draw.xml
new file mode 100644
index 000000000..42e8a1eae
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/txtpictxt_pdfi_unittest_draw.xml
@@ -0,0 +1,3396 @@
+<?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 .
+-->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="20mm" fo:margin-right="10mm" fo:margin-top="20mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:auto-grow-height="true" draw:auto-grow-width="true" draw:fill="none" draw:stroke="none" draw:textarea-horizontal-align="left" draw:textarea-vertical-align="top" fo:padding-bottom="0cm" fo:padding-left="0cm" fo:padding-right="0cm" fo:padding-top="0cm" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Thorndale" fo:font-size="12pt" style:font-size-asian="12pt" style:font-size-complex="12pt" >
+
+</style:text-properties>
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:drawing >
+<draw:page draw:master-page-name="master-page3" >
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 20.18mm )" draw:z-index="0" svg:height="4.23mm" svg:width="163.08mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+H
+e
+
+h
+e
+a
+r
+d
+
+q
+u
+i
+e
+t
+
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+.
+
+T
+h
+a
+t
+
+d
+i
+d
+n
+'
+t
+
+b
+o
+d
+e
+
+w
+e
+l
+l
+.
+
+W
+h
+o
+
+c
+o
+u
+l
+d
+
+b
+e
+
+f
+o
+l
+l
+o
+w
+i
+n
+g
+
+h
+i
+m
+
+t
+h
+i
+s
+
+l
+a
+t
+e
+
+a
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 25.05mm )" draw:z-index="1" svg:height="4.23mm" svg:width="165.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+i
+g
+h
+t
+
+a
+n
+d
+
+i
+n
+
+t
+h
+i
+s
+
+d
+e
+a
+d
+b
+e
+a
+t
+
+p
+a
+r
+t
+
+o
+f
+
+t
+o
+w
+n
+?
+
+A
+n
+d
+
+a
+t
+
+t
+h
+i
+s
+
+p
+a
+r
+t
+i
+c
+u
+l
+a
+r
+
+m
+o
+m
+e
+n
+t
+,
+
+j
+u
+s
+t
+
+a
+f
+t
+e
+r
+
+h
+e
+
+p
+u
+l
+l
+e
+d
+
+o
+f
+f
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 29.91mm )" draw:z-index="2" svg:height="4.23mm" svg:width="162.03mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+i
+g
+
+t
+i
+m
+e
+
+a
+n
+d
+
+w
+a
+s
+
+m
+a
+k
+i
+n
+g
+
+o
+f
+f
+
+w
+i
+t
+h
+
+t
+h
+e
+
+g
+r
+e
+e
+n
+b
+a
+c
+k
+s
+.
+
+W
+a
+s
+
+t
+h
+e
+r
+e
+
+a
+n
+o
+t
+h
+e
+r
+
+c
+r
+o
+o
+k
+
+w
+h
+o
+'
+d
+
+h
+a
+d
+
+t
+h
+e
+
+s
+a
+m
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 34.78mm )" draw:z-index="3" svg:height="4.23mm" svg:width="167.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+i
+d
+e
+a
+,
+
+a
+n
+d
+
+w
+a
+s
+
+n
+o
+w
+
+w
+a
+t
+c
+h
+i
+n
+g
+
+h
+i
+m
+
+a
+n
+d
+
+w
+a
+i
+t
+i
+n
+g
+
+f
+o
+r
+
+a
+
+c
+h
+a
+n
+c
+e
+
+t
+o
+
+g
+r
+a
+b
+
+t
+h
+e
+
+f
+r
+u
+i
+t
+
+o
+f
+
+h
+i
+s
+
+l
+a
+b
+o
+r
+?
+
+O
+r
+
+d
+i
+d
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 39.65mm )" draw:z-index="4" svg:height="4.23mm" svg:width="161.92mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+
+m
+e
+a
+n
+
+t
+h
+a
+t
+
+o
+n
+e
+
+o
+f
+
+m
+a
+n
+y
+
+l
+a
+w
+
+o
+f
+f
+i
+c
+e
+r
+s
+
+i
+n
+
+t
+o
+w
+n
+
+w
+a
+s
+
+o
+n
+
+t
+o
+
+h
+i
+m
+
+a
+n
+d
+
+j
+u
+s
+t
+
+w
+a
+i
+t
+i
+n
+g
+
+t
+o
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 44.52mm )" draw:z-index="5" svg:height="4.23mm" svg:width="164.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+p
+o
+u
+n
+c
+e
+
+a
+n
+d
+
+s
+n
+a
+p
+
+t
+h
+o
+s
+e
+
+c
+u
+f
+f
+s
+
+o
+n
+
+h
+i
+s
+
+w
+r
+i
+s
+t
+s
+?
+
+H
+e
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+l
+o
+o
+k
+e
+d
+
+a
+l
+l
+
+a
+r
+o
+u
+n
+d
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 49.39mm )" draw:z-index="6" svg:height="4.23mm" svg:width="165.52mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+l
+e
+y
+.
+
+L
+i
+k
+e
+
+l
+i
+g
+h
+t
+n
+i
+n
+g
+
+h
+e
+
+d
+a
+r
+t
+e
+d
+
+o
+f
+f
+
+t
+o
+
+t
+h
+e
+
+l
+e
+f
+t
+
+a
+n
+d
+
+d
+i
+s
+a
+p
+p
+e
+a
+r
+e
+d
+
+b
+e
+t
+w
+e
+e
+n
+
+t
+h
+e
+
+t
+w
+o
+
+w
+a
+r
+e
+h
+o
+u
+s
+e
+s
+
+a
+l
+m
+o
+s
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 54.26mm )" draw:z-index="7" svg:height="4.23mm" svg:width="161.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+f
+a
+l
+l
+i
+n
+g
+
+o
+v
+e
+r
+
+t
+h
+e
+
+t
+r
+a
+s
+h
+
+c
+a
+n
+
+l
+y
+i
+n
+g
+
+i
+n
+
+t
+h
+e
+
+m
+i
+d
+d
+l
+e
+
+o
+f
+
+t
+h
+e
+
+s
+i
+d
+e
+w
+a
+l
+k
+.
+
+H
+e
+
+t
+r
+i
+e
+d
+
+t
+o
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+t
+a
+p
+
+h
+i
+s
+
+w
+a
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 59.12mm )" draw:z-index="8" svg:height="4.23mm" svg:width="168.27mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+o
+n
+g
+
+i
+n
+
+t
+h
+e
+
+i
+n
+k
+y
+
+d
+a
+r
+k
+n
+e
+s
+s
+
+a
+n
+d
+
+s
+u
+d
+d
+e
+n
+l
+y
+
+s
+t
+i
+f
+f
+e
+n
+e
+d
+:
+
+i
+t
+
+w
+a
+s
+
+a
+
+d
+e
+a
+d
+-
+e
+n
+d
+,
+
+h
+e
+
+w
+o
+u
+l
+d
+
+h
+a
+v
+e
+
+t
+o
+
+g
+o
+
+b
+a
+c
+k
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 63.99mm )" draw:z-index="9" svg:height="4.23mm" svg:width="161.39mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+w
+a
+y
+
+h
+e
+
+h
+a
+d
+
+c
+o
+m
+e
+.
+
+T
+h
+e
+
+s
+t
+e
+p
+s
+
+g
+o
+t
+
+l
+o
+u
+d
+e
+r
+
+a
+n
+d
+
+l
+o
+u
+d
+e
+r
+,
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+b
+l
+a
+c
+k
+
+o
+u
+t
+l
+i
+n
+e
+
+o
+f
+
+a
+
+f
+i
+g
+u
+r
+e
+
+c
+o
+m
+i
+n
+g
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 68.86mm )" draw:z-index="10" svg:height="4.23mm" svg:width="161.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+r
+o
+u
+n
+d
+
+t
+h
+e
+
+c
+o
+r
+n
+e
+r
+.
+
+I
+s
+
+t
+h
+i
+s
+
+t
+h
+e
+
+e
+n
+d
+
+o
+f
+
+t
+h
+e
+
+l
+i
+n
+e
+?
+
+h
+e
+
+t
+h
+o
+u
+g
+h
+t
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+b
+a
+c
+k
+
+a
+g
+a
+i
+n
+s
+t
+
+t
+h
+e
+
+w
+a
+l
+l
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 73.73mm )" draw:z-index="11" svg:height="4.23mm" svg:width="159.56mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+t
+r
+y
+i
+n
+g
+
+t
+o
+
+m
+a
+k
+e
+
+h
+i
+m
+s
+e
+l
+f
+
+i
+n
+v
+i
+s
+i
+b
+l
+e
+
+i
+n
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+w
+a
+s
+
+a
+l
+l
+
+t
+h
+a
+t
+
+p
+l
+a
+n
+n
+i
+n
+g
+
+a
+n
+d
+
+e
+n
+e
+r
+g
+y
+
+w
+a
+s
+t
+e
+d
+?
+
+H
+e
+
+w
+a
+s
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 78.6mm )" draw:z-index="12" svg:height="4.23mm" svg:width="164mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+d
+r
+i
+p
+p
+i
+n
+g
+
+w
+i
+t
+h
+
+s
+w
+e
+a
+t
+
+n
+o
+w
+,
+
+c
+o
+l
+d
+
+a
+n
+d
+
+w
+e
+t
+,
+
+h
+e
+
+c
+o
+u
+l
+d
+
+s
+m
+e
+l
+l
+
+t
+h
+e
+
+f
+e
+a
+r
+
+c
+o
+m
+i
+n
+g
+
+o
+f
+f
+
+h
+i
+s
+
+c
+l
+o
+t
+h
+e
+s
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 83.47mm )" draw:z-index="13" svg:height="4.23mm" svg:width="167mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+e
+x
+t
+
+t
+o
+
+h
+i
+m
+,
+
+w
+i
+t
+h
+
+a
+
+b
+a
+r
+e
+l
+y
+
+n
+o
+t
+i
+c
+e
+a
+b
+l
+e
+
+s
+q
+u
+e
+a
+k
+,
+
+a
+
+d
+o
+o
+r
+
+s
+w
+u
+n
+g
+
+q
+u
+i
+e
+t
+l
+y
+
+t
+o
+
+a
+n
+d
+
+f
+r
+o
+
+i
+n
+
+t
+h
+e
+
+n
+i
+g
+h
+t
+'
+s
+
+b
+r
+e
+e
+z
+e
+.
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 88.33mm )" draw:z-index="14" svg:height="4.23mm" svg:width="169.29mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+C
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+b
+e
+
+t
+h
+e
+
+h
+a
+v
+e
+n
+
+h
+e
+'
+d
+
+p
+r
+a
+y
+e
+d
+
+f
+o
+r
+?
+
+S
+l
+o
+w
+l
+y
+
+h
+e
+
+s
+l
+i
+d
+
+t
+o
+w
+a
+r
+d
+
+t
+h
+e
+
+d
+o
+o
+r
+,
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+m
+o
+r
+e
+
+a
+n
+d
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 93.2mm )" draw:z-index="15" svg:height="4.23mm" svg:width="146.82mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+m
+o
+r
+e
+
+i
+n
+t
+o
+
+t
+h
+e
+
+w
+a
+l
+l
+,
+
+i
+n
+t
+o
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+a
+w
+a
+y
+
+f
+r
+o
+m
+
+h
+i
+s
+
+e
+n
+e
+m
+y
+.
+
+W
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+d
+o
+o
+r
+
+s
+a
+v
+e
+
+h
+i
+s
+
+h
+i
+d
+e
+?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 98.07mm )" draw:z-index="16" svg:height="4.23mm" svg:width="163.08mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+H
+e
+
+h
+e
+a
+r
+d
+
+q
+u
+i
+e
+t
+
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+.
+
+T
+h
+a
+t
+
+d
+i
+d
+n
+'
+t
+
+b
+o
+d
+e
+
+w
+e
+l
+l
+.
+
+W
+h
+o
+
+c
+o
+u
+l
+d
+
+b
+e
+
+f
+o
+l
+l
+o
+w
+i
+n
+g
+
+h
+i
+m
+
+t
+h
+i
+s
+
+l
+a
+t
+e
+
+a
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 102.94mm )" draw:z-index="17" svg:height="4.23mm" svg:width="165.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+i
+g
+h
+t
+
+a
+n
+d
+
+i
+n
+
+t
+h
+i
+s
+
+d
+e
+a
+d
+b
+e
+a
+t
+
+p
+a
+r
+t
+
+o
+f
+
+t
+o
+w
+n
+?
+
+A
+n
+d
+
+a
+t
+
+t
+h
+i
+s
+
+p
+a
+r
+t
+i
+c
+u
+l
+a
+r
+
+m
+o
+m
+e
+n
+t
+,
+
+j
+u
+s
+t
+
+a
+f
+t
+e
+r
+
+h
+e
+
+p
+u
+l
+l
+e
+d
+
+o
+f
+f
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 107.81mm )" draw:z-index="18" svg:height="4.23mm" svg:width="162.03mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+i
+g
+
+t
+i
+m
+e
+
+a
+n
+d
+
+w
+a
+s
+
+m
+a
+k
+i
+n
+g
+
+o
+f
+f
+
+w
+i
+t
+h
+
+t
+h
+e
+
+g
+r
+e
+e
+n
+b
+a
+c
+k
+s
+.
+
+W
+a
+s
+
+t
+h
+e
+r
+e
+
+a
+n
+o
+t
+h
+e
+r
+
+c
+r
+o
+o
+k
+
+w
+h
+o
+'
+d
+
+h
+a
+d
+
+t
+h
+e
+
+s
+a
+m
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 112.68mm )" draw:z-index="19" svg:height="4.23mm" svg:width="167.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+i
+d
+e
+a
+,
+
+a
+n
+d
+
+w
+a
+s
+
+n
+o
+w
+
+w
+a
+t
+c
+h
+i
+n
+g
+
+h
+i
+m
+
+a
+n
+d
+
+w
+a
+i
+t
+i
+n
+g
+
+f
+o
+r
+
+a
+
+c
+h
+a
+n
+c
+e
+
+t
+o
+
+g
+r
+a
+b
+
+t
+h
+e
+
+f
+r
+u
+i
+t
+
+o
+f
+
+h
+i
+s
+
+l
+a
+b
+o
+r
+?
+
+O
+r
+
+d
+i
+d
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 117.54mm )" draw:z-index="20" svg:height="4.23mm" svg:width="161.92mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+
+m
+e
+a
+n
+
+t
+h
+a
+t
+
+o
+n
+e
+
+o
+f
+
+m
+a
+n
+y
+
+l
+a
+w
+
+o
+f
+f
+i
+c
+e
+r
+s
+
+i
+n
+
+t
+o
+w
+n
+
+w
+a
+s
+
+o
+n
+
+t
+o
+
+h
+i
+m
+
+a
+n
+d
+
+j
+u
+s
+t
+
+w
+a
+i
+t
+i
+n
+g
+
+t
+o
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 122.41mm )" draw:z-index="21" svg:height="4.23mm" svg:width="164.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+p
+o
+u
+n
+c
+e
+
+a
+n
+d
+
+s
+n
+a
+p
+
+t
+h
+o
+s
+e
+
+c
+u
+f
+f
+s
+
+o
+n
+
+h
+i
+s
+
+w
+r
+i
+s
+t
+s
+?
+
+H
+e
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+l
+o
+o
+k
+e
+d
+
+a
+l
+l
+
+a
+r
+o
+u
+n
+d
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 127.28mm )" draw:z-index="22" svg:height="4.23mm" svg:width="165.52mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+l
+e
+y
+.
+
+L
+i
+k
+e
+
+l
+i
+g
+h
+t
+n
+i
+n
+g
+
+h
+e
+
+d
+a
+r
+t
+e
+d
+
+o
+f
+f
+
+t
+o
+
+t
+h
+e
+
+l
+e
+f
+t
+
+a
+n
+d
+
+d
+i
+s
+a
+p
+p
+e
+a
+r
+e
+d
+
+b
+e
+t
+w
+e
+e
+n
+
+t
+h
+e
+
+t
+w
+o
+
+w
+a
+r
+e
+h
+o
+u
+s
+e
+s
+
+a
+l
+m
+o
+s
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 132.15mm )" draw:z-index="23" svg:height="4.23mm" svg:width="161.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+f
+a
+l
+l
+i
+n
+g
+
+o
+v
+e
+r
+
+t
+h
+e
+
+t
+r
+a
+s
+h
+
+c
+a
+n
+
+l
+y
+i
+n
+g
+
+i
+n
+
+t
+h
+e
+
+m
+i
+d
+d
+l
+e
+
+o
+f
+
+t
+h
+e
+
+s
+i
+d
+e
+w
+a
+l
+k
+.
+
+H
+e
+
+t
+r
+i
+e
+d
+
+t
+o
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+t
+a
+p
+
+h
+i
+s
+
+w
+a
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 147.42mm )" draw:z-index="32" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////////w8fiMlsdda7Bve7nBxuH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx8h79QX6pQX6pQX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Z3O1QX6pQX6plcrRYZ65QX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////19vrk5/Lg4/Ds7fb5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fjd4O/j5fFQX6pQX6qBjMK4vt1da7BQX6pVY6y/xeD////////////////////////////////////////////////////////////////////////////////////3+PvAxeCBjMJda7BaaK9YZ65RYKplcrSUncvHzOT5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6vR7hr9da7DT1+qOl8hQX6pQX6qOmMi+w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////////////X2ut1gbxQX6p1gby4vt3e4e/b3u6vtthda7BQX6pQX6qIksX8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vq4vt1QX6pQX6pgbrLM0eaIksVQX6pQX6qGkcS9w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////M0eZWZa1QX6qUncv8/P7////////////////O0udVY6xQX6p0gLv8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8vh2gr2gqNG2vNtRYKpQX6pda7DM0eaDjsNQX6pQX6qIksXBxuFWZa1QX6pRYKq+w9/////////////////////////////////////////////////////////////s7fZebLFQX6pjcbP19vr///////////////////////92gr1QX6qbpM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+UnctQX6pQX6qiqtKvtthRYKpQX6pkcbTHzOSBjMJQX6pQX6qMlsfAxeBda7BQX6pTYqzY2+z///////////////////////////////////////////////////////+krNNQX6pQX6qXoM3///////////////////////////+OmMhQX6rHzOT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7/ePmcm2vNxve7lQX6pQX6qiqtKvtthQX6pQX6plcrTJzeWMlsdQX6pQX6qIksW7wd5gbrKgqNGkrNO0u9v////////////////////////////////////////////////5+fxodbZQX6pQX6qmrdT///////////////////////////+VnstVY6zy8/n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fh4g71QX6ppdrbO0udve7lQX6pQX6qiqtK2vNtTYqtQX6pkcbTFyuOJk8ZQX6pQX6p/isHb3u2gqNFQX6pQX6q+w9/////////////////////////////////////////////o6vRVY6xQX6pQX6qDjcP///////////////////////////+Ol8hyfrv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z9PmAi8FQX6pQX6p/isHGy+PBxuFve7lQX6pQX6qpsdWutdhTYqtQX6pjcbPV2et9iMBQX6qYoc2ttNdRYKpQX6pjcbO4vt3JzuX////////////////////////////////////////m6PNVZK1QX6pQX6pWZa3h5PH///////////////////////+mrdSqsdb////////////s7fa0u9uXoM2zudr5+fz////////////////////////09frZ3O3X2+zg4/D////////////////////EyeKOmMiWn8zq7PX////////////////////e4e+vttidpc+0u9v39/v////////////////////////////////////////////////////v8PeBjMJQX6pQX6qIksW9w99YZ65xfbq9w99rd7dQX6pQX6qiqtKrstZVY6xQX6qao87y8/m2vNypsdVRYKpQX6plcrTEyeJ9iMBQX6qzudr8/P7////////////////////////////////09fpebLFQX6pQX6pQX6qDjsP8/P7////////////////////8/P7////////////Cx+FgbrJQX6pQX6pQX6q4vt3///////////////////////+KlMZSYatSYatrd7f5+fz////////z9PmKlMZQX6pQX6pQX6qgqNH////////////z9PmZos1QX6pQX6pQX6pQX6qXoM3////////////////////////////////////////////////v8Pd4g71QX6pQX6qMlsfAxeBda7BQX6pRYKrJzeXo6vRodbZQX6pQX6p9iMBWZa1QX6qMlsf///+utdhQX6pQX6prd7fFyuN/isFQX6pQX6qKlMb///////////////////////////////////////+KlMZQX6pQX6pQX6pQX6qiqtL///////////////////////////////+6wN1QX6pRYKpQX6pQX6pQX6qpsdX////////////////////c3+5SYatQX6pQX6qZos3////////v8Pd5hb5RYKpTYqtQX6pQX6qOl8j////////o6vRyfrtda7CZos56hb5QX6pQX6plcrT5+fz////////////////////////////////////////19vp5hb5QX6pQX6qIksXBxuFWZa1QX6pTYqzEyeL09frt7/bd4O9mc7VQX6pQX6pQX6pQX6q9w9+vtthQX6pQX6pkcbTM0eZ/isFQX6pQX6qMlsfz9Pno6vT19vr////////////////////////////////FyuNQX6pQX6pQX6pQX6pQX6qxt9n////////////////////////U1+pQX6q4vt2vtthQX6pQX6pQX6rO0uf///////////////////+iqtJQX6pQX6pSYavY2+z////8/P57hr9ib7Pb3u5pdrZQX6pQX6qkrNP////w8fhpdrZ4g73s7fb///+6wN1QX6pQX6pib7P39/v////////////////////////////////////19vqAi8FQX6pQX6qGkcS9w99da7BQX6pVY6y6wN2mrdRgbbJYZ66DjcPFyuN9iMBVY6xaaK+gqNGqsdZQX6pQX6pkcbTFyuN9iMBQX6pQX6qRmsnFyuNxfbpWZa1ndLW2vNv////////////////////////////5+fx2gr1QX6pQX6pQX6pQX6pWZa3M0eb////////////////z9Plmc7WgqNH///+PmclQX6pQX6pndLX39/v///////////////////9yfrtQX6pQX6pve7n8/P7///+krNNaaK/g4/Dy8/lYZ65QX6pQX6rFyuP5+fx2gr1+icD39/v///////+XoM1QX6pQX6p1gbz8/P7///////////////////////////////////+TnMtQX6pQX6qPmcm+w99da7BQX6pVY6y7wd6ao85QX6pQX6pQX6pQX6p2gr319vrg4/Dq7PXT1+pRYKpQX6pndLXFyuN9iMBQX6pQX6qSm8q7wd5YZ65QX6pQX6pQX6pRYKrX2uv////////////////////////////Y2+xVY6xQX6pQX6pQX6pQX6pgbbLj5fH///////////+gqNFxfbr8/P7s7fZYZ65QX6pQX6qgqNH////////////////////X2+xTYqtQX6pQX6qep9D////d4O9WZa3O0uf////FyuNQX6pQX6pWZa3s7faKlMZxfbr39/v////////5+fxodbZQX6pQX6qWn8z///////////////////////////////////////9YZ65QX6prd7ext9lda7BQX6pYZ67DyOKZos5QX6pQX6pwfLlyfrtQX6pQX6rg4/D///////+iqtJQX6pVY6yzudp/isFQX6pQX6qSm8q9w99YZ65QX6paaK+BjMJRYKpQX6qmrdT///////////////////////////////+2vNtQX6pQX6pQX6pQX6pQX6p2gr36+/3////h5PFebLHb3u3///+2vNxQX6pQX6pQX6rU1+r///////////////////+XoM1QX6pQX6pTYqvb3u3///+Zos6ao87///////+Zos5QX6pQX6qDjsOttNdmc7Xs7fb////////////FyuNQX6pQX6pQX6rJzeX///////////////////////////////////////9jcbNQX6pVY6xRYKpQX6pWZa26wN2gqNFQX6pQX6p2gr3JzeVyfrtQX6pWZa3x8vj///////+xt9lQX6pRYKpYZ65QX6pQX6qSm8rDyOJaaK9QX6pVZK26wN2VnstQX6pQX6q4vt3///////////////////////////////////+PmclQX6pQX6pQX6pQX6pQX6qttNf////Z3O20u9v////8/P54g71QX6pQX6preLf5+fz////////////////09fpkcbRQX6pQX6pve7n8/P7////h5PH39/v////3+PtodbZQX6pRYKqMlsdlcrTQ1Oj///////////////+GkcRQX6pQX6pjcbP19vr///////////////////////////////////////+6wN1QX6pQX6pQX6pWZa26wN2bpM9QX6pQX6p2gr3HzORyfrtQX6pQX6qpsdXO0uekrNO0u9vU1+prd7dQX6pQX6pQX6qTnMu7wd5aaK9QX6paaK++w9+VnstQX6pQX6pyfrv09fr////////////////////////////////////19vpwfLlQX6pQX6pQX6pQX6paaK/s7fb////////////Z3O1RYKpQX6pQX6qrstb///////////////////+xt9lQX6pQX6pQX6qep9D////////////////////U1+pRYKpQX6pSYatRYKqgqNH////////////////m6PNYZ65QX6pQX6qRmsn////////////////////////////////////////////////Gy+OOmMiTnMvO0ueZos5QX6pQX6p1gbzGy+NreLdQX6pQX6qkrNOpsdVRYKpQX6pQX6pwfLnFyuOgqNGMlse4vt29w99YZ65QX6paaK+9w9+Sm8pQX6pQX6p4g73o6vT////////////////////////////////////////////Z3O1YZ65QX6pQX6pQX6pQX6q/xeD///////////+gqNFQX6pQX6pVY6zh5PH////////////////09fpndLVQX6pQX6pSYavX2uv///////////////////+mrdRQX6pQX6pQX6pndLXz9Pn///////////////+ep9BQX6pQX6pQX6rO0uf////////////////////////////////////////////////////////6+/2bpM9QX6pQX6pwfLnLz+ZsebhQX6pQX6qgqNHq7PVVY6xQX6pSYatQX6pQX6psebju7/f////HzORVY6xQX6pVZK2+w9+Rm8pQX6pQX6pxfbrv8Pf///////////////////////////////////////////////////+XoM1QX6pQX6pQX6pQX6qkrNP////////39/tlcrRQX6pQX6qAi8H///////////////////+ep9BQX6pQX6pQX6pve7n8/P7////////////////6+/1ve7lQX6pQX6pQX6q9w9/////////////////x8vhebLFQX6pQX6pyfrv8/P7////////////////////////////////////////////////////////O0udQX6pQX6p2gr3Lz+ZxfbpQX6pQX6qYoc3////c3+5QX6pQX6qGkcSZos1QX6pQX6pwfLnh5PF2gr1QX6pYZ664vt2VnstQX6pQX6pwfLno6vT////////////////////V2euzudr////////////////////////////k5/JYZ65QX6pQX6pQX6qZos7////////O0udQX6pQX6pQX6q9w9/////////////////S1ulVZK1VY6xQX6pQX6qYoc3////////////////////Q1OhRYKpQX6pQX6pve7n3+Pv////////////////AxeBQX6pQX6pQX6qzudr////////////////////////////////////////////////////////////8/P6zudp4g73EyeJsebhQX6pQX6qkrNOpsdWDjsPs7fZodbZQX6paaK+2vNykrNNQX6pQX6preLe/xeB7hr+4vt2Wn8xQX6pQX6pxfbro6vT///////////////////////+Nl8hrd7f///////////////////////////////+DjcNQX6pQX6pQX6qiqtL///////+Zos1QX6pQX6pda7Dv8Pf////////////z9Plve7mRm8paaK9QX6pQX6rO0uf////8/P6ao87k5/L///+Yoc1QX6pQX6pRYKrJzeX///////////////////+Ai8FQX6pQX6pWZa3o6vT////S1umzudr////////////////////////////////////////////////////////o6vRsebhQX6pQX6qiqtLDyOJQX6pQX6qOmMjLz+ZebLFQX6pVY6y2vNyao85QX6pQX6pyfrvg4/CiqtJQX6pQX6pwfLnq7PX///////////////////////////9yfrt0gLv///////////////////////////////+ep9BQX6pQX6pQX6q/xeD////39/tlcrRQX6pQX6qPmcn///////////////+OmMiOl8ixt9lQX6pQX6pmc7X3+Pv////O0udaaK/x8vj8/P5sebhQX6pQX6pyfrv////////////////////k5/JVY6xQX6pQX6qJk8b////8/P5yfrukrNP///////////////////////////////////////////////////////////+qsdZSYauZos2zudq4vt2DjsNQX6pQX6qNl8jDyOJebLFQX6pVY6y2vNuao85QX6pQX6p0gLu9w99pdrZsebjq7PX////////////////////////////19vpYZ654g73///////////////////////////////+Zos1QX6pQX6paaK/s7fb////T1+pQX6pQX6pRYKrS1un///////////+rstZrd7f09fqAi8FQX6pQX6qZos3////3+PtsebittNf////U1+pRYKpQX6pQX6q4vt3///////////////////+0u9tQX6pQX6pQX6rHzOT///+zudppdrb3+Pv////////////////////////////////////////////////////////////////S1umkrNNQX6pebLG+w9+Fj8RQX6pQX6qMlsfDyOJebLFQX6pVY6y0u9uep9BQX6pQX6pwfLnFyuPo6vT////////////////////////////////Z3O1QX6psebj8/P7////////////////////////6+/1wfLlQX6pQX6qttNf///////+ttNdQX6pQX6ppdrb6+/3///////+ttNdda7Dg4/D39/taaK9QX6pQX6rEyeL///+Vnstyfrv8/P7///+bpM9QX6pQX6plcrT39/v///////////////////+BjMJQX6pQX6pib7P6+/3c3+5YZ67M0eb///////////////////////////////////////////////////////////////////////+zudpQX6pQX6pda7DDyOKAi8FQX6pQX6qNl8jHzORda7BQX6pTYqy7wd6ep9BQX6preLfq7PX///////////////////////////////////+7wd5QX6pWZa3q7PX////////////////////////EyeJQX6pQX6p8h7/8/P7///////+MlsdQX6pQX6qFj8T///////+nr9RWZa3Q1Oj////Z3O1SYatQX6pTYqve4e+2vNxTYqvf4vD////8/P5wfLlQX6pQX6qXoM3////////////////////x8vhaaK9QX6pQX6qPmcns7fZib7OTnMv///////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pjcbO/xeCAi8FQX6pQX6qRm8rGy+Nda7BQX6pTYqyss9erstbk5/L///////////////////////////////////////+mrdRQX6pQX6qkrNP////////////////////s7fZpdrZQX6pyfrvq7PX////////8/P52gr1QX6pQX6pjcbOss9d/isFebLHT1+r////////HzORQX6pQX6pTYqtwfLlTYqzCx+H////////a3e1TYqxQX6pRYKrQ1Oj////////////////////b3u1SYatQX6pQX6pgbrJda7CGkcTd4O+zudrJzeX///////////////////////////////////////////////////////////////////////////+vtthRYKpQX6pib7PDyOKFj8RQX6pQX6qKlMbFyuNaaK9QX6pyfrv8/P7////////////////////////////////////////////Z3O1ndLVQX6pQX6qZos7m6PP39/vx8vi/xeBjcbNQX6qOl8jv8Pf///////////////+DjcNQX6pQX6pQX6pQX6p1gbzh5PH////////////DyOJQX6pQX6pQX6pWZa2/xeD///////////+ep9BQX6pQX6pjcbP5+fz////////////////////Z3O1QX6pQX6pQX6pQX6qDjcP39/vX2+ypsdW9w9////////////////////////////////////////////////////////////////////////////////+4vt1QX6pQX6pda7C+w9+IksVRYKpQX6qzudrP0+h9iMDm6PP////////////////////////////////////////////////////v8Pe6wN2GkcRaaK9ebLFpdrZjcbNebLGOmMjS1un////////////////////////U1+ppdrZda7CBjMK/xeD6+/3////////////////k5/JlcrRWZa2Jk8be4e/////////////////P0+ipsdWnr9TJzeX////////////////////////39/uDjsNYZ65sebixuNn6+/3////u7/fW2evg4/D///////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pgbbKpsdVYZ65QX6qIksX////8/P7////////////////////////////////////////////////////////////////////09frd4O/Q1Oja3e3z9Pn////////////////////////////////////3+Pvz9Pn////////////////////////////////x8vjo6vT////////////////////////////////////////////////////////////////////8/P7s7fb5+fz///////////////////////////////////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pQX6pQX6pQX6qdpc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+0u9tYZ65QX6pQX6pve7no6vT////////////////////////////////////////////////////////////////////////////////////////////////X2+y4vt3////////////////////////////////////////////////////////////////////////////////////////////////b3u7Q1Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b3u6rsta4vt3y8/n////////////////////////////////////////////////////////////////////8/P7q7PXe4e/S1un5+fzQ1Ojk5/L////S1unZ3O3////////V2evS1un6+/3q7PXd4O/v8Pf////Q1OjZ3O3////////m6PPO0ufv8Pfj5fH////////j5fH////g4/DS1unx8viao86Rmsnm6PP////o6vTS1un5+fz////q7PXd4O/X2uv5+fzQ1Ojm6PP////5+fzQ1Ojk5/L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx5hb6iqtKVnsyDjsOutdh4g73t7/apsdWrstb///+ep9CiqtK6wN3y8/l7hr+Vnsvq7PWdpc+ttNeOmMi4vt3f4u+MlsfFyuPq7PWOmMjc3+7g4/CZos62vNyIksXO0ufq7PWPmcmGkcTZ3O3O0ueNl8iutdiUncv39/t4g72mrdSKlMaDjsOttNeFj8T09fqRm8qxt9nf4u/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/t6hb75+fzGy+OTnMv///+Fj8Tf4u/S1umss9fv8Pd/isH////////3+Pt6hb709frf4u+GkcT////u7/eGkcTd4O+Ai8G0u9v5+fy7wd6bpM+mrdTFyuPFyuN7hr/DyOL///+9w9+zudr///+Rm8qGkcSttNePmcnu7/d7hr/8/P60u9uSm8r///+Pmcnv8PeVnsyao87j5fH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vqBjML8/P6+w9+gqNH///+DjcPf4vDM0eaqsdbx8vh1gbz09fr6+/3z9PmJk8b6+/3g4/B7hr/8/P3Q1OiRmsn////t7/aMlsenr9T5+fxve7l5hb7y8/n////k5/J7hr/U1+q9w9+or9X///+VnsugqNH19vr5+fzz9PmFj8T///+vttigqNH///+Nl8jv8Pf8/P6+w997hr/5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/uZos78/P3Lz+axuNn///+ao87m6PPW2eu4vt3///+mrdSRmsmmrdTu7/eiqtL3+Pv///+iqtKXoM2Ol8jd4O/t7/aqsdaVnsvS1un///+VnsyVnsv////T1+qmrdSZos3v8Pfc3+6BjMLLz+bf4u+KlMamrdS+w9/19vqdpc////++w9+zudr///+krNPw8fi/xeCep9CxuNn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P3////8/P78/P7////8/P3////////8/P7////////x8vjz9Pn////8/P7////////////x8vj5+fz////8/P3u7/f3+Pv////39/uNl8jT1+r////3+Pvu7/f8/P7////////19vr19vr////8/P3v8Pf39/v////8/P3////8/P78/P7////8/P7////z9Pnx8vj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7faXoM2nr9T///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 147.6mm )" draw:z-index="24" svg:height="4.23mm" svg:width="168.27mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+o
+n
+g
+
+i
+n
+
+t
+h
+e
+
+i
+n
+k
+y
+
+d
+a
+r
+k
+n
+e
+s
+s
+
+a
+n
+d
+
+s
+u
+d
+d
+e
+n
+l
+y
+
+s
+t
+i
+f
+f
+e
+n
+e
+d
+:
+
+i
+t
+
+w
+a
+s
+
+a
+
+d
+e
+a
+d
+-
+e
+n
+d
+,
+
+h
+e
+
+w
+o
+u
+l
+d
+
+h
+a
+v
+e
+
+t
+o
+
+g
+o
+
+b
+a
+c
+k
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 152.47mm )" draw:z-index="25" svg:height="4.23mm" svg:width="161.39mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+w
+a
+y
+
+h
+e
+
+h
+a
+d
+
+c
+o
+m
+e
+.
+
+T
+h
+e
+
+s
+t
+e
+p
+s
+
+g
+o
+t
+
+l
+o
+u
+d
+e
+r
+
+a
+n
+d
+
+l
+o
+u
+d
+e
+r
+,
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+b
+l
+a
+c
+k
+
+o
+u
+t
+l
+i
+n
+e
+
+o
+f
+
+a
+
+f
+i
+g
+u
+r
+e
+
+c
+o
+m
+i
+n
+g
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 157.34mm )" draw:z-index="26" svg:height="4.23mm" svg:width="161.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+r
+o
+u
+n
+d
+
+t
+h
+e
+
+c
+o
+r
+n
+e
+r
+.
+
+I
+s
+
+t
+h
+i
+s
+
+t
+h
+e
+
+e
+n
+d
+
+o
+f
+
+t
+h
+e
+
+l
+i
+n
+e
+?
+
+h
+e
+
+t
+h
+o
+u
+g
+h
+t
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+b
+a
+c
+k
+
+a
+g
+a
+i
+n
+s
+t
+
+t
+h
+e
+
+w
+a
+l
+l
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 162.21mm )" draw:z-index="27" svg:height="4.23mm" svg:width="159.56mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+t
+r
+y
+i
+n
+g
+
+t
+o
+
+m
+a
+k
+e
+
+h
+i
+m
+s
+e
+l
+f
+
+i
+n
+v
+i
+s
+i
+b
+l
+e
+
+i
+n
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+w
+a
+s
+
+a
+l
+l
+
+t
+h
+a
+t
+
+p
+l
+a
+n
+n
+i
+n
+g
+
+a
+n
+d
+
+e
+n
+e
+r
+g
+y
+
+w
+a
+s
+t
+e
+d
+?
+
+H
+e
+
+w
+a
+s
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 167.07mm )" draw:z-index="28" svg:height="4.23mm" svg:width="164mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+d
+r
+i
+p
+p
+i
+n
+g
+
+w
+i
+t
+h
+
+s
+w
+e
+a
+t
+
+n
+o
+w
+,
+
+c
+o
+l
+d
+
+a
+n
+d
+
+w
+e
+t
+,
+
+h
+e
+
+c
+o
+u
+l
+d
+
+s
+m
+e
+l
+l
+
+t
+h
+e
+
+f
+e
+a
+r
+
+c
+o
+m
+i
+n
+g
+
+o
+f
+f
+
+h
+i
+s
+
+c
+l
+o
+t
+h
+e
+s
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 171.94mm )" draw:z-index="29" svg:height="4.23mm" svg:width="167mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+e
+x
+t
+
+t
+o
+
+h
+i
+m
+,
+
+w
+i
+t
+h
+
+a
+
+b
+a
+r
+e
+l
+y
+
+n
+o
+t
+i
+c
+e
+a
+b
+l
+e
+
+s
+q
+u
+e
+a
+k
+,
+
+a
+
+d
+o
+o
+r
+
+s
+w
+u
+n
+g
+
+q
+u
+i
+e
+t
+l
+y
+
+t
+o
+
+a
+n
+d
+
+f
+r
+o
+
+i
+n
+
+t
+h
+e
+
+n
+i
+g
+h
+t
+'
+s
+
+b
+r
+e
+e
+z
+e
+.
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 176.81mm )" draw:z-index="30" svg:height="4.23mm" svg:width="169.29mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+C
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+b
+e
+
+t
+h
+e
+
+h
+a
+v
+e
+n
+
+h
+e
+'
+d
+
+p
+r
+a
+y
+e
+d
+
+f
+o
+r
+?
+
+S
+l
+o
+w
+l
+y
+
+h
+e
+
+s
+l
+i
+d
+
+t
+o
+w
+a
+r
+d
+
+t
+h
+e
+
+d
+o
+o
+r
+,
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+m
+o
+r
+e
+
+a
+n
+d
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 181.68mm )" draw:z-index="31" svg:height="4.23mm" svg:width="146.82mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+m
+o
+r
+e
+
+i
+n
+t
+o
+
+t
+h
+e
+
+w
+a
+l
+l
+,
+
+i
+n
+t
+o
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+a
+w
+a
+y
+
+f
+r
+o
+m
+
+h
+i
+s
+
+e
+n
+e
+m
+y
+.
+
+W
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+d
+o
+o
+r
+
+s
+a
+v
+e
+
+h
+i
+s
+
+h
+i
+d
+e
+?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+</draw:page>
+</office:drawing>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/txtpictxt_pdfi_unittest_impress.xml b/sdext/source/pdfimport/test/testdocs/txtpictxt_pdfi_unittest_impress.xml
new file mode 100644
index 000000000..f7dd540db
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/txtpictxt_pdfi_unittest_impress.xml
@@ -0,0 +1,3396 @@
+<?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 .
+-->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="20mm" fo:margin-right="10mm" fo:margin-top="20mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:auto-grow-height="true" draw:auto-grow-width="true" draw:fill="none" draw:stroke="none" draw:textarea-horizontal-align="left" draw:textarea-vertical-align="top" fo:padding-bottom="0cm" fo:padding-left="0cm" fo:padding-right="0cm" fo:padding-top="0cm" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Thorndale" fo:font-size="12pt" style:font-size-asian="12pt" style:font-size-complex="12pt" >
+
+</style:text-properties>
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:presentation >
+<draw:page draw:master-page-name="master-page3" >
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 20.18mm )" draw:z-index="0" svg:height="4.23mm" svg:width="163.08mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+H
+e
+
+h
+e
+a
+r
+d
+
+q
+u
+i
+e
+t
+
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+.
+
+T
+h
+a
+t
+
+d
+i
+d
+n
+'
+t
+
+b
+o
+d
+e
+
+w
+e
+l
+l
+.
+
+W
+h
+o
+
+c
+o
+u
+l
+d
+
+b
+e
+
+f
+o
+l
+l
+o
+w
+i
+n
+g
+
+h
+i
+m
+
+t
+h
+i
+s
+
+l
+a
+t
+e
+
+a
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 25.05mm )" draw:z-index="1" svg:height="4.23mm" svg:width="165.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+i
+g
+h
+t
+
+a
+n
+d
+
+i
+n
+
+t
+h
+i
+s
+
+d
+e
+a
+d
+b
+e
+a
+t
+
+p
+a
+r
+t
+
+o
+f
+
+t
+o
+w
+n
+?
+
+A
+n
+d
+
+a
+t
+
+t
+h
+i
+s
+
+p
+a
+r
+t
+i
+c
+u
+l
+a
+r
+
+m
+o
+m
+e
+n
+t
+,
+
+j
+u
+s
+t
+
+a
+f
+t
+e
+r
+
+h
+e
+
+p
+u
+l
+l
+e
+d
+
+o
+f
+f
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 29.91mm )" draw:z-index="2" svg:height="4.23mm" svg:width="162.03mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+i
+g
+
+t
+i
+m
+e
+
+a
+n
+d
+
+w
+a
+s
+
+m
+a
+k
+i
+n
+g
+
+o
+f
+f
+
+w
+i
+t
+h
+
+t
+h
+e
+
+g
+r
+e
+e
+n
+b
+a
+c
+k
+s
+.
+
+W
+a
+s
+
+t
+h
+e
+r
+e
+
+a
+n
+o
+t
+h
+e
+r
+
+c
+r
+o
+o
+k
+
+w
+h
+o
+'
+d
+
+h
+a
+d
+
+t
+h
+e
+
+s
+a
+m
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 34.78mm )" draw:z-index="3" svg:height="4.23mm" svg:width="167.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+i
+d
+e
+a
+,
+
+a
+n
+d
+
+w
+a
+s
+
+n
+o
+w
+
+w
+a
+t
+c
+h
+i
+n
+g
+
+h
+i
+m
+
+a
+n
+d
+
+w
+a
+i
+t
+i
+n
+g
+
+f
+o
+r
+
+a
+
+c
+h
+a
+n
+c
+e
+
+t
+o
+
+g
+r
+a
+b
+
+t
+h
+e
+
+f
+r
+u
+i
+t
+
+o
+f
+
+h
+i
+s
+
+l
+a
+b
+o
+r
+?
+
+O
+r
+
+d
+i
+d
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 39.65mm )" draw:z-index="4" svg:height="4.23mm" svg:width="161.92mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+
+m
+e
+a
+n
+
+t
+h
+a
+t
+
+o
+n
+e
+
+o
+f
+
+m
+a
+n
+y
+
+l
+a
+w
+
+o
+f
+f
+i
+c
+e
+r
+s
+
+i
+n
+
+t
+o
+w
+n
+
+w
+a
+s
+
+o
+n
+
+t
+o
+
+h
+i
+m
+
+a
+n
+d
+
+j
+u
+s
+t
+
+w
+a
+i
+t
+i
+n
+g
+
+t
+o
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 44.52mm )" draw:z-index="5" svg:height="4.23mm" svg:width="164.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+p
+o
+u
+n
+c
+e
+
+a
+n
+d
+
+s
+n
+a
+p
+
+t
+h
+o
+s
+e
+
+c
+u
+f
+f
+s
+
+o
+n
+
+h
+i
+s
+
+w
+r
+i
+s
+t
+s
+?
+
+H
+e
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+l
+o
+o
+k
+e
+d
+
+a
+l
+l
+
+a
+r
+o
+u
+n
+d
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 49.39mm )" draw:z-index="6" svg:height="4.23mm" svg:width="165.52mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+l
+e
+y
+.
+
+L
+i
+k
+e
+
+l
+i
+g
+h
+t
+n
+i
+n
+g
+
+h
+e
+
+d
+a
+r
+t
+e
+d
+
+o
+f
+f
+
+t
+o
+
+t
+h
+e
+
+l
+e
+f
+t
+
+a
+n
+d
+
+d
+i
+s
+a
+p
+p
+e
+a
+r
+e
+d
+
+b
+e
+t
+w
+e
+e
+n
+
+t
+h
+e
+
+t
+w
+o
+
+w
+a
+r
+e
+h
+o
+u
+s
+e
+s
+
+a
+l
+m
+o
+s
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 54.26mm )" draw:z-index="7" svg:height="4.23mm" svg:width="161.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+f
+a
+l
+l
+i
+n
+g
+
+o
+v
+e
+r
+
+t
+h
+e
+
+t
+r
+a
+s
+h
+
+c
+a
+n
+
+l
+y
+i
+n
+g
+
+i
+n
+
+t
+h
+e
+
+m
+i
+d
+d
+l
+e
+
+o
+f
+
+t
+h
+e
+
+s
+i
+d
+e
+w
+a
+l
+k
+.
+
+H
+e
+
+t
+r
+i
+e
+d
+
+t
+o
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+t
+a
+p
+
+h
+i
+s
+
+w
+a
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 59.12mm )" draw:z-index="8" svg:height="4.23mm" svg:width="168.27mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+o
+n
+g
+
+i
+n
+
+t
+h
+e
+
+i
+n
+k
+y
+
+d
+a
+r
+k
+n
+e
+s
+s
+
+a
+n
+d
+
+s
+u
+d
+d
+e
+n
+l
+y
+
+s
+t
+i
+f
+f
+e
+n
+e
+d
+:
+
+i
+t
+
+w
+a
+s
+
+a
+
+d
+e
+a
+d
+-
+e
+n
+d
+,
+
+h
+e
+
+w
+o
+u
+l
+d
+
+h
+a
+v
+e
+
+t
+o
+
+g
+o
+
+b
+a
+c
+k
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 63.99mm )" draw:z-index="9" svg:height="4.23mm" svg:width="161.39mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+w
+a
+y
+
+h
+e
+
+h
+a
+d
+
+c
+o
+m
+e
+.
+
+T
+h
+e
+
+s
+t
+e
+p
+s
+
+g
+o
+t
+
+l
+o
+u
+d
+e
+r
+
+a
+n
+d
+
+l
+o
+u
+d
+e
+r
+,
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+b
+l
+a
+c
+k
+
+o
+u
+t
+l
+i
+n
+e
+
+o
+f
+
+a
+
+f
+i
+g
+u
+r
+e
+
+c
+o
+m
+i
+n
+g
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 68.86mm )" draw:z-index="10" svg:height="4.23mm" svg:width="161.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+r
+o
+u
+n
+d
+
+t
+h
+e
+
+c
+o
+r
+n
+e
+r
+.
+
+I
+s
+
+t
+h
+i
+s
+
+t
+h
+e
+
+e
+n
+d
+
+o
+f
+
+t
+h
+e
+
+l
+i
+n
+e
+?
+
+h
+e
+
+t
+h
+o
+u
+g
+h
+t
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+b
+a
+c
+k
+
+a
+g
+a
+i
+n
+s
+t
+
+t
+h
+e
+
+w
+a
+l
+l
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 73.73mm )" draw:z-index="11" svg:height="4.23mm" svg:width="159.56mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+t
+r
+y
+i
+n
+g
+
+t
+o
+
+m
+a
+k
+e
+
+h
+i
+m
+s
+e
+l
+f
+
+i
+n
+v
+i
+s
+i
+b
+l
+e
+
+i
+n
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+w
+a
+s
+
+a
+l
+l
+
+t
+h
+a
+t
+
+p
+l
+a
+n
+n
+i
+n
+g
+
+a
+n
+d
+
+e
+n
+e
+r
+g
+y
+
+w
+a
+s
+t
+e
+d
+?
+
+H
+e
+
+w
+a
+s
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 78.6mm )" draw:z-index="12" svg:height="4.23mm" svg:width="164mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+d
+r
+i
+p
+p
+i
+n
+g
+
+w
+i
+t
+h
+
+s
+w
+e
+a
+t
+
+n
+o
+w
+,
+
+c
+o
+l
+d
+
+a
+n
+d
+
+w
+e
+t
+,
+
+h
+e
+
+c
+o
+u
+l
+d
+
+s
+m
+e
+l
+l
+
+t
+h
+e
+
+f
+e
+a
+r
+
+c
+o
+m
+i
+n
+g
+
+o
+f
+f
+
+h
+i
+s
+
+c
+l
+o
+t
+h
+e
+s
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 83.47mm )" draw:z-index="13" svg:height="4.23mm" svg:width="167mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+e
+x
+t
+
+t
+o
+
+h
+i
+m
+,
+
+w
+i
+t
+h
+
+a
+
+b
+a
+r
+e
+l
+y
+
+n
+o
+t
+i
+c
+e
+a
+b
+l
+e
+
+s
+q
+u
+e
+a
+k
+,
+
+a
+
+d
+o
+o
+r
+
+s
+w
+u
+n
+g
+
+q
+u
+i
+e
+t
+l
+y
+
+t
+o
+
+a
+n
+d
+
+f
+r
+o
+
+i
+n
+
+t
+h
+e
+
+n
+i
+g
+h
+t
+'
+s
+
+b
+r
+e
+e
+z
+e
+.
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 88.33mm )" draw:z-index="14" svg:height="4.23mm" svg:width="169.29mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+C
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+b
+e
+
+t
+h
+e
+
+h
+a
+v
+e
+n
+
+h
+e
+'
+d
+
+p
+r
+a
+y
+e
+d
+
+f
+o
+r
+?
+
+S
+l
+o
+w
+l
+y
+
+h
+e
+
+s
+l
+i
+d
+
+t
+o
+w
+a
+r
+d
+
+t
+h
+e
+
+d
+o
+o
+r
+,
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+m
+o
+r
+e
+
+a
+n
+d
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 93.2mm )" draw:z-index="15" svg:height="4.23mm" svg:width="146.82mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+m
+o
+r
+e
+
+i
+n
+t
+o
+
+t
+h
+e
+
+w
+a
+l
+l
+,
+
+i
+n
+t
+o
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+a
+w
+a
+y
+
+f
+r
+o
+m
+
+h
+i
+s
+
+e
+n
+e
+m
+y
+.
+
+W
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+d
+o
+o
+r
+
+s
+a
+v
+e
+
+h
+i
+s
+
+h
+i
+d
+e
+?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 98.07mm )" draw:z-index="16" svg:height="4.23mm" svg:width="163.08mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+H
+e
+
+h
+e
+a
+r
+d
+
+q
+u
+i
+e
+t
+
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+.
+
+T
+h
+a
+t
+
+d
+i
+d
+n
+'
+t
+
+b
+o
+d
+e
+
+w
+e
+l
+l
+.
+
+W
+h
+o
+
+c
+o
+u
+l
+d
+
+b
+e
+
+f
+o
+l
+l
+o
+w
+i
+n
+g
+
+h
+i
+m
+
+t
+h
+i
+s
+
+l
+a
+t
+e
+
+a
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 102.94mm )" draw:z-index="17" svg:height="4.23mm" svg:width="165.69mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+i
+g
+h
+t
+
+a
+n
+d
+
+i
+n
+
+t
+h
+i
+s
+
+d
+e
+a
+d
+b
+e
+a
+t
+
+p
+a
+r
+t
+
+o
+f
+
+t
+o
+w
+n
+?
+
+A
+n
+d
+
+a
+t
+
+t
+h
+i
+s
+
+p
+a
+r
+t
+i
+c
+u
+l
+a
+r
+
+m
+o
+m
+e
+n
+t
+,
+
+j
+u
+s
+t
+
+a
+f
+t
+e
+r
+
+h
+e
+
+p
+u
+l
+l
+e
+d
+
+o
+f
+f
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 107.81mm )" draw:z-index="18" svg:height="4.23mm" svg:width="162.03mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+i
+g
+
+t
+i
+m
+e
+
+a
+n
+d
+
+w
+a
+s
+
+m
+a
+k
+i
+n
+g
+
+o
+f
+f
+
+w
+i
+t
+h
+
+t
+h
+e
+
+g
+r
+e
+e
+n
+b
+a
+c
+k
+s
+.
+
+W
+a
+s
+
+t
+h
+e
+r
+e
+
+a
+n
+o
+t
+h
+e
+r
+
+c
+r
+o
+o
+k
+
+w
+h
+o
+'
+d
+
+h
+a
+d
+
+t
+h
+e
+
+s
+a
+m
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 112.68mm )" draw:z-index="19" svg:height="4.23mm" svg:width="167.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+i
+d
+e
+a
+,
+
+a
+n
+d
+
+w
+a
+s
+
+n
+o
+w
+
+w
+a
+t
+c
+h
+i
+n
+g
+
+h
+i
+m
+
+a
+n
+d
+
+w
+a
+i
+t
+i
+n
+g
+
+f
+o
+r
+
+a
+
+c
+h
+a
+n
+c
+e
+
+t
+o
+
+g
+r
+a
+b
+
+t
+h
+e
+
+f
+r
+u
+i
+t
+
+o
+f
+
+h
+i
+s
+
+l
+a
+b
+o
+r
+?
+
+O
+r
+
+d
+i
+d
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 117.54mm )" draw:z-index="20" svg:height="4.23mm" svg:width="161.92mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+t
+e
+p
+s
+
+b
+e
+h
+i
+n
+d
+
+h
+i
+m
+
+m
+e
+a
+n
+
+t
+h
+a
+t
+
+o
+n
+e
+
+o
+f
+
+m
+a
+n
+y
+
+l
+a
+w
+
+o
+f
+f
+i
+c
+e
+r
+s
+
+i
+n
+
+t
+o
+w
+n
+
+w
+a
+s
+
+o
+n
+
+t
+o
+
+h
+i
+m
+
+a
+n
+d
+
+j
+u
+s
+t
+
+w
+a
+i
+t
+i
+n
+g
+
+t
+o
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 122.41mm )" draw:z-index="21" svg:height="4.23mm" svg:width="164.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+p
+o
+u
+n
+c
+e
+
+a
+n
+d
+
+s
+n
+a
+p
+
+t
+h
+o
+s
+e
+
+c
+u
+f
+f
+s
+
+o
+n
+
+h
+i
+s
+
+w
+r
+i
+s
+t
+s
+?
+
+H
+e
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+l
+o
+o
+k
+e
+d
+
+a
+l
+l
+
+a
+r
+o
+u
+n
+d
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 127.28mm )" draw:z-index="22" svg:height="4.23mm" svg:width="165.52mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+l
+e
+y
+.
+
+L
+i
+k
+e
+
+l
+i
+g
+h
+t
+n
+i
+n
+g
+
+h
+e
+
+d
+a
+r
+t
+e
+d
+
+o
+f
+f
+
+t
+o
+
+t
+h
+e
+
+l
+e
+f
+t
+
+a
+n
+d
+
+d
+i
+s
+a
+p
+p
+e
+a
+r
+e
+d
+
+b
+e
+t
+w
+e
+e
+n
+
+t
+h
+e
+
+t
+w
+o
+
+w
+a
+r
+e
+h
+o
+u
+s
+e
+s
+
+a
+l
+m
+o
+s
+t
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 132.15mm )" draw:z-index="23" svg:height="4.23mm" svg:width="161.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+f
+a
+l
+l
+i
+n
+g
+
+o
+v
+e
+r
+
+t
+h
+e
+
+t
+r
+a
+s
+h
+
+c
+a
+n
+
+l
+y
+i
+n
+g
+
+i
+n
+
+t
+h
+e
+
+m
+i
+d
+d
+l
+e
+
+o
+f
+
+t
+h
+e
+
+s
+i
+d
+e
+w
+a
+l
+k
+.
+
+H
+e
+
+t
+r
+i
+e
+d
+
+t
+o
+
+n
+e
+r
+v
+o
+u
+s
+l
+y
+
+t
+a
+p
+
+h
+i
+s
+
+w
+a
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 147.42mm )" draw:z-index="32" svg:height="-10.59mm" svg:width="26.45mm" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////////w8fiMlsdda7Bve7nBxuH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx8h79QX6pQX6pQX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Z3O1QX6pQX6plcrRYZ65QX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////19vrk5/Lg4/Ds7fb5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fjd4O/j5fFQX6pQX6qBjMK4vt1da7BQX6pVY6y/xeD////////////////////////////////////////////////////////////////////////////////////3+PvAxeCBjMJda7BaaK9YZ65RYKplcrSUncvHzOT5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6vR7hr9da7DT1+qOl8hQX6pQX6qOmMi+w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////////////X2ut1gbxQX6p1gby4vt3e4e/b3u6vtthda7BQX6pQX6qIksX8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vq4vt1QX6pQX6pgbrLM0eaIksVQX6pQX6qGkcS9w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////M0eZWZa1QX6qUncv8/P7////////////////O0udVY6xQX6p0gLv8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8vh2gr2gqNG2vNtRYKpQX6pda7DM0eaDjsNQX6pQX6qIksXBxuFWZa1QX6pRYKq+w9/////////////////////////////////////////////////////////////s7fZebLFQX6pjcbP19vr///////////////////////92gr1QX6qbpM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+UnctQX6pQX6qiqtKvtthRYKpQX6pkcbTHzOSBjMJQX6pQX6qMlsfAxeBda7BQX6pTYqzY2+z///////////////////////////////////////////////////////+krNNQX6pQX6qXoM3///////////////////////////+OmMhQX6rHzOT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7/ePmcm2vNxve7lQX6pQX6qiqtKvtthQX6pQX6plcrTJzeWMlsdQX6pQX6qIksW7wd5gbrKgqNGkrNO0u9v////////////////////////////////////////////////5+fxodbZQX6pQX6qmrdT///////////////////////////+VnstVY6zy8/n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fh4g71QX6ppdrbO0udve7lQX6pQX6qiqtK2vNtTYqtQX6pkcbTFyuOJk8ZQX6pQX6p/isHb3u2gqNFQX6pQX6q+w9/////////////////////////////////////////////o6vRVY6xQX6pQX6qDjcP///////////////////////////+Ol8hyfrv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z9PmAi8FQX6pQX6p/isHGy+PBxuFve7lQX6pQX6qpsdWutdhTYqtQX6pjcbPV2et9iMBQX6qYoc2ttNdRYKpQX6pjcbO4vt3JzuX////////////////////////////////////////m6PNVZK1QX6pQX6pWZa3h5PH///////////////////////+mrdSqsdb////////////s7fa0u9uXoM2zudr5+fz////////////////////////09frZ3O3X2+zg4/D////////////////////EyeKOmMiWn8zq7PX////////////////////e4e+vttidpc+0u9v39/v////////////////////////////////////////////////////v8PeBjMJQX6pQX6qIksW9w99YZ65xfbq9w99rd7dQX6pQX6qiqtKrstZVY6xQX6qao87y8/m2vNypsdVRYKpQX6plcrTEyeJ9iMBQX6qzudr8/P7////////////////////////////////09fpebLFQX6pQX6pQX6qDjsP8/P7////////////////////8/P7////////////Cx+FgbrJQX6pQX6pQX6q4vt3///////////////////////+KlMZSYatSYatrd7f5+fz////////z9PmKlMZQX6pQX6pQX6qgqNH////////////z9PmZos1QX6pQX6pQX6pQX6qXoM3////////////////////////////////////////////////v8Pd4g71QX6pQX6qMlsfAxeBda7BQX6pRYKrJzeXo6vRodbZQX6pQX6p9iMBWZa1QX6qMlsf///+utdhQX6pQX6prd7fFyuN/isFQX6pQX6qKlMb///////////////////////////////////////+KlMZQX6pQX6pQX6pQX6qiqtL///////////////////////////////+6wN1QX6pRYKpQX6pQX6pQX6qpsdX////////////////////c3+5SYatQX6pQX6qZos3////////v8Pd5hb5RYKpTYqtQX6pQX6qOl8j////////o6vRyfrtda7CZos56hb5QX6pQX6plcrT5+fz////////////////////////////////////////19vp5hb5QX6pQX6qIksXBxuFWZa1QX6pTYqzEyeL09frt7/bd4O9mc7VQX6pQX6pQX6pQX6q9w9+vtthQX6pQX6pkcbTM0eZ/isFQX6pQX6qMlsfz9Pno6vT19vr////////////////////////////////FyuNQX6pQX6pQX6pQX6pQX6qxt9n////////////////////////U1+pQX6q4vt2vtthQX6pQX6pQX6rO0uf///////////////////+iqtJQX6pQX6pSYavY2+z////8/P57hr9ib7Pb3u5pdrZQX6pQX6qkrNP////w8fhpdrZ4g73s7fb///+6wN1QX6pQX6pib7P39/v////////////////////////////////////19vqAi8FQX6pQX6qGkcS9w99da7BQX6pVY6y6wN2mrdRgbbJYZ66DjcPFyuN9iMBVY6xaaK+gqNGqsdZQX6pQX6pkcbTFyuN9iMBQX6pQX6qRmsnFyuNxfbpWZa1ndLW2vNv////////////////////////////5+fx2gr1QX6pQX6pQX6pQX6pWZa3M0eb////////////////z9Plmc7WgqNH///+PmclQX6pQX6pndLX39/v///////////////////9yfrtQX6pQX6pve7n8/P7///+krNNaaK/g4/Dy8/lYZ65QX6pQX6rFyuP5+fx2gr1+icD39/v///////+XoM1QX6pQX6p1gbz8/P7///////////////////////////////////+TnMtQX6pQX6qPmcm+w99da7BQX6pVY6y7wd6ao85QX6pQX6pQX6pQX6p2gr319vrg4/Dq7PXT1+pRYKpQX6pndLXFyuN9iMBQX6pQX6qSm8q7wd5YZ65QX6pQX6pQX6pRYKrX2uv////////////////////////////Y2+xVY6xQX6pQX6pQX6pQX6pgbbLj5fH///////////+gqNFxfbr8/P7s7fZYZ65QX6pQX6qgqNH////////////////////X2+xTYqtQX6pQX6qep9D////d4O9WZa3O0uf////FyuNQX6pQX6pWZa3s7faKlMZxfbr39/v////////5+fxodbZQX6pQX6qWn8z///////////////////////////////////////9YZ65QX6prd7ext9lda7BQX6pYZ67DyOKZos5QX6pQX6pwfLlyfrtQX6pQX6rg4/D///////+iqtJQX6pVY6yzudp/isFQX6pQX6qSm8q9w99YZ65QX6paaK+BjMJRYKpQX6qmrdT///////////////////////////////+2vNtQX6pQX6pQX6pQX6pQX6p2gr36+/3////h5PFebLHb3u3///+2vNxQX6pQX6pQX6rU1+r///////////////////+XoM1QX6pQX6pTYqvb3u3///+Zos6ao87///////+Zos5QX6pQX6qDjsOttNdmc7Xs7fb////////////FyuNQX6pQX6pQX6rJzeX///////////////////////////////////////9jcbNQX6pVY6xRYKpQX6pWZa26wN2gqNFQX6pQX6p2gr3JzeVyfrtQX6pWZa3x8vj///////+xt9lQX6pRYKpYZ65QX6pQX6qSm8rDyOJaaK9QX6pVZK26wN2VnstQX6pQX6q4vt3///////////////////////////////////+PmclQX6pQX6pQX6pQX6pQX6qttNf////Z3O20u9v////8/P54g71QX6pQX6preLf5+fz////////////////09fpkcbRQX6pQX6pve7n8/P7////h5PH39/v////3+PtodbZQX6pRYKqMlsdlcrTQ1Oj///////////////+GkcRQX6pQX6pjcbP19vr///////////////////////////////////////+6wN1QX6pQX6pQX6pWZa26wN2bpM9QX6pQX6p2gr3HzORyfrtQX6pQX6qpsdXO0uekrNO0u9vU1+prd7dQX6pQX6pQX6qTnMu7wd5aaK9QX6paaK++w9+VnstQX6pQX6pyfrv09fr////////////////////////////////////19vpwfLlQX6pQX6pQX6pQX6paaK/s7fb////////////Z3O1RYKpQX6pQX6qrstb///////////////////+xt9lQX6pQX6pQX6qep9D////////////////////U1+pRYKpQX6pSYatRYKqgqNH////////////////m6PNYZ65QX6pQX6qRmsn////////////////////////////////////////////////Gy+OOmMiTnMvO0ueZos5QX6pQX6p1gbzGy+NreLdQX6pQX6qkrNOpsdVRYKpQX6pQX6pwfLnFyuOgqNGMlse4vt29w99YZ65QX6paaK+9w9+Sm8pQX6pQX6p4g73o6vT////////////////////////////////////////////Z3O1YZ65QX6pQX6pQX6pQX6q/xeD///////////+gqNFQX6pQX6pVY6zh5PH////////////////09fpndLVQX6pQX6pSYavX2uv///////////////////+mrdRQX6pQX6pQX6pndLXz9Pn///////////////+ep9BQX6pQX6pQX6rO0uf////////////////////////////////////////////////////////6+/2bpM9QX6pQX6pwfLnLz+ZsebhQX6pQX6qgqNHq7PVVY6xQX6pSYatQX6pQX6psebju7/f////HzORVY6xQX6pVZK2+w9+Rm8pQX6pQX6pxfbrv8Pf///////////////////////////////////////////////////+XoM1QX6pQX6pQX6pQX6qkrNP////////39/tlcrRQX6pQX6qAi8H///////////////////+ep9BQX6pQX6pQX6pve7n8/P7////////////////6+/1ve7lQX6pQX6pQX6q9w9/////////////////x8vhebLFQX6pQX6pyfrv8/P7////////////////////////////////////////////////////////O0udQX6pQX6p2gr3Lz+ZxfbpQX6pQX6qYoc3////c3+5QX6pQX6qGkcSZos1QX6pQX6pwfLnh5PF2gr1QX6pYZ664vt2VnstQX6pQX6pwfLno6vT////////////////////V2euzudr////////////////////////////k5/JYZ65QX6pQX6pQX6qZos7////////O0udQX6pQX6pQX6q9w9/////////////////S1ulVZK1VY6xQX6pQX6qYoc3////////////////////Q1OhRYKpQX6pQX6pve7n3+Pv////////////////AxeBQX6pQX6pQX6qzudr////////////////////////////////////////////////////////////8/P6zudp4g73EyeJsebhQX6pQX6qkrNOpsdWDjsPs7fZodbZQX6paaK+2vNykrNNQX6pQX6preLe/xeB7hr+4vt2Wn8xQX6pQX6pxfbro6vT///////////////////////+Nl8hrd7f///////////////////////////////+DjcNQX6pQX6pQX6qiqtL///////+Zos1QX6pQX6pda7Dv8Pf////////////z9Plve7mRm8paaK9QX6pQX6rO0uf////8/P6ao87k5/L///+Yoc1QX6pQX6pRYKrJzeX///////////////////+Ai8FQX6pQX6pWZa3o6vT////S1umzudr////////////////////////////////////////////////////////o6vRsebhQX6pQX6qiqtLDyOJQX6pQX6qOmMjLz+ZebLFQX6pVY6y2vNyao85QX6pQX6pyfrvg4/CiqtJQX6pQX6pwfLnq7PX///////////////////////////9yfrt0gLv///////////////////////////////+ep9BQX6pQX6pQX6q/xeD////39/tlcrRQX6pQX6qPmcn///////////////+OmMiOl8ixt9lQX6pQX6pmc7X3+Pv////O0udaaK/x8vj8/P5sebhQX6pQX6pyfrv////////////////////k5/JVY6xQX6pQX6qJk8b////8/P5yfrukrNP///////////////////////////////////////////////////////////+qsdZSYauZos2zudq4vt2DjsNQX6pQX6qNl8jDyOJebLFQX6pVY6y2vNuao85QX6pQX6p0gLu9w99pdrZsebjq7PX////////////////////////////19vpYZ654g73///////////////////////////////+Zos1QX6pQX6paaK/s7fb////T1+pQX6pQX6pRYKrS1un///////////+rstZrd7f09fqAi8FQX6pQX6qZos3////3+PtsebittNf////U1+pRYKpQX6pQX6q4vt3///////////////////+0u9tQX6pQX6pQX6rHzOT///+zudppdrb3+Pv////////////////////////////////////////////////////////////////S1umkrNNQX6pebLG+w9+Fj8RQX6pQX6qMlsfDyOJebLFQX6pVY6y0u9uep9BQX6pQX6pwfLnFyuPo6vT////////////////////////////////Z3O1QX6psebj8/P7////////////////////////6+/1wfLlQX6pQX6qttNf///////+ttNdQX6pQX6ppdrb6+/3///////+ttNdda7Dg4/D39/taaK9QX6pQX6rEyeL///+Vnstyfrv8/P7///+bpM9QX6pQX6plcrT39/v///////////////////+BjMJQX6pQX6pib7P6+/3c3+5YZ67M0eb///////////////////////////////////////////////////////////////////////+zudpQX6pQX6pda7DDyOKAi8FQX6pQX6qNl8jHzORda7BQX6pTYqy7wd6ep9BQX6preLfq7PX///////////////////////////////////+7wd5QX6pWZa3q7PX////////////////////////EyeJQX6pQX6p8h7/8/P7///////+MlsdQX6pQX6qFj8T///////+nr9RWZa3Q1Oj////Z3O1SYatQX6pTYqve4e+2vNxTYqvf4vD////8/P5wfLlQX6pQX6qXoM3////////////////////x8vhaaK9QX6pQX6qPmcns7fZib7OTnMv///////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pjcbO/xeCAi8FQX6pQX6qRm8rGy+Nda7BQX6pTYqyss9erstbk5/L///////////////////////////////////////+mrdRQX6pQX6qkrNP////////////////////s7fZpdrZQX6pyfrvq7PX////////8/P52gr1QX6pQX6pjcbOss9d/isFebLHT1+r////////HzORQX6pQX6pTYqtwfLlTYqzCx+H////////a3e1TYqxQX6pRYKrQ1Oj////////////////////b3u1SYatQX6pQX6pgbrJda7CGkcTd4O+zudrJzeX///////////////////////////////////////////////////////////////////////////+vtthRYKpQX6pib7PDyOKFj8RQX6pQX6qKlMbFyuNaaK9QX6pyfrv8/P7////////////////////////////////////////////Z3O1ndLVQX6pQX6qZos7m6PP39/vx8vi/xeBjcbNQX6qOl8jv8Pf///////////////+DjcNQX6pQX6pQX6pQX6p1gbzh5PH////////////DyOJQX6pQX6pQX6pWZa2/xeD///////////+ep9BQX6pQX6pjcbP5+fz////////////////////Z3O1QX6pQX6pQX6pQX6qDjcP39/vX2+ypsdW9w9////////////////////////////////////////////////////////////////////////////////+4vt1QX6pQX6pda7C+w9+IksVRYKpQX6qzudrP0+h9iMDm6PP////////////////////////////////////////////////////v8Pe6wN2GkcRaaK9ebLFpdrZjcbNebLGOmMjS1un////////////////////////U1+ppdrZda7CBjMK/xeD6+/3////////////////k5/JlcrRWZa2Jk8be4e/////////////////P0+ipsdWnr9TJzeX////////////////////////39/uDjsNYZ65sebixuNn6+/3////u7/fW2evg4/D///////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pgbbKpsdVYZ65QX6qIksX////8/P7////////////////////////////////////////////////////////////////////09frd4O/Q1Oja3e3z9Pn////////////////////////////////////3+Pvz9Pn////////////////////////////////x8vjo6vT////////////////////////////////////////////////////////////////////8/P7s7fb5+fz///////////////////////////////////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pQX6pQX6pQX6qdpc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+0u9tYZ65QX6pQX6pve7no6vT////////////////////////////////////////////////////////////////////////////////////////////////X2+y4vt3////////////////////////////////////////////////////////////////////////////////////////////////b3u7Q1Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b3u6rsta4vt3y8/n////////////////////////////////////////////////////////////////////8/P7q7PXe4e/S1un5+fzQ1Ojk5/L////S1unZ3O3////////V2evS1un6+/3q7PXd4O/v8Pf////Q1OjZ3O3////////m6PPO0ufv8Pfj5fH////////j5fH////g4/DS1unx8viao86Rmsnm6PP////o6vTS1un5+fz////q7PXd4O/X2uv5+fzQ1Ojm6PP////5+fzQ1Ojk5/L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx5hb6iqtKVnsyDjsOutdh4g73t7/apsdWrstb///+ep9CiqtK6wN3y8/l7hr+Vnsvq7PWdpc+ttNeOmMi4vt3f4u+MlsfFyuPq7PWOmMjc3+7g4/CZos62vNyIksXO0ufq7PWPmcmGkcTZ3O3O0ueNl8iutdiUncv39/t4g72mrdSKlMaDjsOttNeFj8T09fqRm8qxt9nf4u/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/t6hb75+fzGy+OTnMv///+Fj8Tf4u/S1umss9fv8Pd/isH////////3+Pt6hb709frf4u+GkcT////u7/eGkcTd4O+Ai8G0u9v5+fy7wd6bpM+mrdTFyuPFyuN7hr/DyOL///+9w9+zudr///+Rm8qGkcSttNePmcnu7/d7hr/8/P60u9uSm8r///+Pmcnv8PeVnsyao87j5fH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vqBjML8/P6+w9+gqNH///+DjcPf4vDM0eaqsdbx8vh1gbz09fr6+/3z9PmJk8b6+/3g4/B7hr/8/P3Q1OiRmsn////t7/aMlsenr9T5+fxve7l5hb7y8/n////k5/J7hr/U1+q9w9+or9X///+VnsugqNH19vr5+fzz9PmFj8T///+vttigqNH///+Nl8jv8Pf8/P6+w997hr/5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/uZos78/P3Lz+axuNn///+ao87m6PPW2eu4vt3///+mrdSRmsmmrdTu7/eiqtL3+Pv///+iqtKXoM2Ol8jd4O/t7/aqsdaVnsvS1un///+VnsyVnsv////T1+qmrdSZos3v8Pfc3+6BjMLLz+bf4u+KlMamrdS+w9/19vqdpc////++w9+zudr///+krNPw8fi/xeCep9CxuNn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P3////8/P78/P7////8/P3////////8/P7////////x8vjz9Pn////8/P7////////////x8vj5+fz////8/P3u7/f3+Pv////39/uNl8jT1+r////3+Pvu7/f8/P7////////19vr19vr////8/P3v8Pf39/v////8/P3////8/P78/P7////8/P7////z9Pnx8vj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7faXoM2nr9T///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 147.6mm )" draw:z-index="24" svg:height="4.23mm" svg:width="168.27mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+l
+o
+n
+g
+
+i
+n
+
+t
+h
+e
+
+i
+n
+k
+y
+
+d
+a
+r
+k
+n
+e
+s
+s
+
+a
+n
+d
+
+s
+u
+d
+d
+e
+n
+l
+y
+
+s
+t
+i
+f
+f
+e
+n
+e
+d
+:
+
+i
+t
+
+w
+a
+s
+
+a
+
+d
+e
+a
+d
+-
+e
+n
+d
+,
+
+h
+e
+
+w
+o
+u
+l
+d
+
+h
+a
+v
+e
+
+t
+o
+
+g
+o
+
+b
+a
+c
+k
+
+t
+h
+e
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 152.47mm )" draw:z-index="25" svg:height="4.23mm" svg:width="161.39mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+w
+a
+y
+
+h
+e
+
+h
+a
+d
+
+c
+o
+m
+e
+.
+
+T
+h
+e
+
+s
+t
+e
+p
+s
+
+g
+o
+t
+
+l
+o
+u
+d
+e
+r
+
+a
+n
+d
+
+l
+o
+u
+d
+e
+r
+,
+
+h
+e
+
+s
+a
+w
+
+t
+h
+e
+
+b
+l
+a
+c
+k
+
+o
+u
+t
+l
+i
+n
+e
+
+o
+f
+
+a
+
+f
+i
+g
+u
+r
+e
+
+c
+o
+m
+i
+n
+g
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 157.34mm )" draw:z-index="26" svg:height="4.23mm" svg:width="161.18mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+a
+r
+o
+u
+n
+d
+
+t
+h
+e
+
+c
+o
+r
+n
+e
+r
+.
+
+I
+s
+
+t
+h
+i
+s
+
+t
+h
+e
+
+e
+n
+d
+
+o
+f
+
+t
+h
+e
+
+l
+i
+n
+e
+?
+
+h
+e
+
+t
+h
+o
+u
+g
+h
+t
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+b
+a
+c
+k
+
+a
+g
+a
+i
+n
+s
+t
+
+t
+h
+e
+
+w
+a
+l
+l
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 162.21mm )" draw:z-index="27" svg:height="4.23mm" svg:width="159.56mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+t
+r
+y
+i
+n
+g
+
+t
+o
+
+m
+a
+k
+e
+
+h
+i
+m
+s
+e
+l
+f
+
+i
+n
+v
+i
+s
+i
+b
+l
+e
+
+i
+n
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+w
+a
+s
+
+a
+l
+l
+
+t
+h
+a
+t
+
+p
+l
+a
+n
+n
+i
+n
+g
+
+a
+n
+d
+
+e
+n
+e
+r
+g
+y
+
+w
+a
+s
+t
+e
+d
+?
+
+H
+e
+
+w
+a
+s
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 167.07mm )" draw:z-index="28" svg:height="4.23mm" svg:width="164mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+d
+r
+i
+p
+p
+i
+n
+g
+
+w
+i
+t
+h
+
+s
+w
+e
+a
+t
+
+n
+o
+w
+,
+
+c
+o
+l
+d
+
+a
+n
+d
+
+w
+e
+t
+,
+
+h
+e
+
+c
+o
+u
+l
+d
+
+s
+m
+e
+l
+l
+
+t
+h
+e
+
+f
+e
+a
+r
+
+c
+o
+m
+i
+n
+g
+
+o
+f
+f
+
+h
+i
+s
+
+c
+l
+o
+t
+h
+e
+s
+.
+
+S
+u
+d
+d
+e
+n
+l
+y
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 171.94mm )" draw:z-index="29" svg:height="4.23mm" svg:width="167mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+n
+e
+x
+t
+
+t
+o
+
+h
+i
+m
+,
+
+w
+i
+t
+h
+
+a
+
+b
+a
+r
+e
+l
+y
+
+n
+o
+t
+i
+c
+e
+a
+b
+l
+e
+
+s
+q
+u
+e
+a
+k
+,
+
+a
+
+d
+o
+o
+r
+
+s
+w
+u
+n
+g
+
+q
+u
+i
+e
+t
+l
+y
+
+t
+o
+
+a
+n
+d
+
+f
+r
+o
+
+i
+n
+
+t
+h
+e
+
+n
+i
+g
+h
+t
+'
+s
+
+b
+r
+e
+e
+z
+e
+.
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 176.81mm )" draw:z-index="30" svg:height="4.23mm" svg:width="169.29mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+C
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+b
+e
+
+t
+h
+e
+
+h
+a
+v
+e
+n
+
+h
+e
+'
+d
+
+p
+r
+a
+y
+e
+d
+
+f
+o
+r
+?
+
+S
+l
+o
+w
+l
+y
+
+h
+e
+
+s
+l
+i
+d
+
+t
+o
+w
+a
+r
+d
+
+t
+h
+e
+
+d
+o
+o
+r
+,
+
+p
+r
+e
+s
+s
+i
+n
+g
+
+h
+i
+m
+s
+e
+l
+f
+
+m
+o
+r
+e
+
+a
+n
+d
+
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 181.68mm )" draw:z-index="31" svg:height="4.23mm" svg:width="146.82mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+m
+o
+r
+e
+
+i
+n
+t
+o
+
+t
+h
+e
+
+w
+a
+l
+l
+,
+
+i
+n
+t
+o
+
+t
+h
+e
+
+d
+a
+r
+k
+,
+
+a
+w
+a
+y
+
+f
+r
+o
+m
+
+h
+i
+s
+
+e
+n
+e
+m
+y
+.
+
+W
+o
+u
+l
+d
+
+t
+h
+i
+s
+
+d
+o
+o
+r
+
+s
+a
+v
+e
+
+h
+i
+s
+
+h
+i
+d
+e
+?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+</draw:page>
+</office:presentation>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/txtpictxt_pdfi_unittest_writer.xml b/sdext/source/pdfimport/test/testdocs/txtpictxt_pdfi_unittest_writer.xml
new file mode 100644
index 000000000..ef5248f1d
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/txtpictxt_pdfi_unittest_writer.xml
@@ -0,0 +1,550 @@
+<?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 .
+-->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="10mm" fo:margin-right="10mm" fo:margin-top="10mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:fill="none" draw:stroke="none" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Thorndale" fo:font-size="12pt" style:font-size-asian="12pt" style:font-size-complex="12pt" >
+
+</style:text-properties>
+
+</style:style>
+<style:style style:family="paragraph" style:master-page-name="master-page3" style:name="paragraph8" >
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:text >
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 20.18mm )" draw:z-index="0" svg:height="4.23mm" svg:width="163.08mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+He heard quiet steps behind him. That didn't bode well. Who could be following him this late at
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 25.05mm )" draw:z-index="1" svg:height="4.23mm" svg:width="165.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+night and in this deadbeat part of town? And at this particular moment, just after he pulled off the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 29.91mm )" draw:z-index="2" svg:height="4.23mm" svg:width="162.03mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+big time and was making off with the greenbacks. Was there another crook who'd had the same
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 34.78mm )" draw:z-index="3" svg:height="4.23mm" svg:width="167.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+idea, and was now watching him and waiting for a chance to grab the fruit of his labor? Or did the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 39.65mm )" draw:z-index="4" svg:height="4.23mm" svg:width="161.92mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+steps behind him mean that one of many law officers in town was on to him and just waiting to
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 44.52mm )" draw:z-index="5" svg:height="4.23mm" svg:width="164.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+pounce and snap those cuffs on his wrists? He nervously looked all around. Suddenly he saw the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 49.39mm )" draw:z-index="6" svg:height="4.23mm" svg:width="165.52mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+alley. Like lightning he darted off to the left and disappeared between the two warehouses almost
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 54.26mm )" draw:z-index="7" svg:height="4.23mm" svg:width="161.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+falling over the trash can lying in the middle of the sidewalk. He tried to nervously tap his way
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 59.12mm )" draw:z-index="8" svg:height="4.23mm" svg:width="168.27mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+along in the inky darkness and suddenly stiffened: it was a dead-end, he would have to go back the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 63.99mm )" draw:z-index="9" svg:height="4.23mm" svg:width="161.39mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+way he had come. The steps got louder and louder, he saw the black outline of a figure coming
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 68.86mm )" draw:z-index="10" svg:height="4.23mm" svg:width="161.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+around the corner. Is this the end of the line? he thought pressing himself back against the wall
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 73.73mm )" draw:z-index="11" svg:height="4.23mm" svg:width="159.56mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+trying to make himself invisible in the dark, was all that planning and energy wasted? He was
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 78.6mm )" draw:z-index="12" svg:height="4.23mm" svg:width="164mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+dripping with sweat now, cold and wet, he could smell the fear coming off his clothes. Suddenly
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 83.47mm )" draw:z-index="13" svg:height="4.23mm" svg:width="167mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+next to him, with a barely noticeable squeak, a door swung quietly to and fro in the night's breeze.
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 88.33mm )" draw:z-index="14" svg:height="4.23mm" svg:width="169.29mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+Could this be the haven he'd prayed for? Slowly he slid toward the door, pressing himself more and
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 93.2mm )" draw:z-index="15" svg:height="4.23mm" svg:width="146.82mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+more into the wall, into the dark, away from his enemy. Would this door save his hide?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 98.07mm )" draw:z-index="16" svg:height="4.23mm" svg:width="163.08mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+He heard quiet steps behind him. That didn't bode well. Who could be following him this late at
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 102.94mm )" draw:z-index="17" svg:height="4.23mm" svg:width="165.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+night and in this deadbeat part of town? And at this particular moment, just after he pulled off the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 107.81mm )" draw:z-index="18" svg:height="4.23mm" svg:width="162.03mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+big time and was making off with the greenbacks. Was there another crook who'd had the same
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 112.68mm )" draw:z-index="19" svg:height="4.23mm" svg:width="167.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+idea, and was now watching him and waiting for a chance to grab the fruit of his labor? Or did the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 117.54mm )" draw:z-index="20" svg:height="4.23mm" svg:width="161.92mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+steps behind him mean that one of many law officers in town was on to him and just waiting to
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 122.41mm )" draw:z-index="21" svg:height="4.23mm" svg:width="164.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+pounce and snap those cuffs on his wrists? He nervously looked all around. Suddenly he saw the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 127.28mm )" draw:z-index="22" svg:height="4.23mm" svg:width="165.52mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+alley. Like lightning he darted off to the left and disappeared between the two warehouses almost
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 132.15mm )" draw:z-index="23" svg:height="4.23mm" svg:width="161.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+falling over the trash can lying in the middle of the sidewalk. He tried to nervously tap his way
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 147.42mm )" draw:z-index="32" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////////w8fiMlsdda7Bve7nBxuH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx8h79QX6pQX6pQX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Z3O1QX6pQX6plcrRYZ65QX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////19vrk5/Lg4/Ds7fb5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fjd4O/j5fFQX6pQX6qBjMK4vt1da7BQX6pVY6y/xeD////////////////////////////////////////////////////////////////////////////////////3+PvAxeCBjMJda7BaaK9YZ65RYKplcrSUncvHzOT5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6vR7hr9da7DT1+qOl8hQX6pQX6qOmMi+w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////////////X2ut1gbxQX6p1gby4vt3e4e/b3u6vtthda7BQX6pQX6qIksX8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vq4vt1QX6pQX6pgbrLM0eaIksVQX6pQX6qGkcS9w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////M0eZWZa1QX6qUncv8/P7////////////////O0udVY6xQX6p0gLv8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8vh2gr2gqNG2vNtRYKpQX6pda7DM0eaDjsNQX6pQX6qIksXBxuFWZa1QX6pRYKq+w9/////////////////////////////////////////////////////////////s7fZebLFQX6pjcbP19vr///////////////////////92gr1QX6qbpM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+UnctQX6pQX6qiqtKvtthRYKpQX6pkcbTHzOSBjMJQX6pQX6qMlsfAxeBda7BQX6pTYqzY2+z///////////////////////////////////////////////////////+krNNQX6pQX6qXoM3///////////////////////////+OmMhQX6rHzOT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7/ePmcm2vNxve7lQX6pQX6qiqtKvtthQX6pQX6plcrTJzeWMlsdQX6pQX6qIksW7wd5gbrKgqNGkrNO0u9v////////////////////////////////////////////////5+fxodbZQX6pQX6qmrdT///////////////////////////+VnstVY6zy8/n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fh4g71QX6ppdrbO0udve7lQX6pQX6qiqtK2vNtTYqtQX6pkcbTFyuOJk8ZQX6pQX6p/isHb3u2gqNFQX6pQX6q+w9/////////////////////////////////////////////o6vRVY6xQX6pQX6qDjcP///////////////////////////+Ol8hyfrv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z9PmAi8FQX6pQX6p/isHGy+PBxuFve7lQX6pQX6qpsdWutdhTYqtQX6pjcbPV2et9iMBQX6qYoc2ttNdRYKpQX6pjcbO4vt3JzuX////////////////////////////////////////m6PNVZK1QX6pQX6pWZa3h5PH///////////////////////+mrdSqsdb////////////s7fa0u9uXoM2zudr5+fz////////////////////////09frZ3O3X2+zg4/D////////////////////EyeKOmMiWn8zq7PX////////////////////e4e+vttidpc+0u9v39/v////////////////////////////////////////////////////v8PeBjMJQX6pQX6qIksW9w99YZ65xfbq9w99rd7dQX6pQX6qiqtKrstZVY6xQX6qao87y8/m2vNypsdVRYKpQX6plcrTEyeJ9iMBQX6qzudr8/P7////////////////////////////////09fpebLFQX6pQX6pQX6qDjsP8/P7////////////////////8/P7////////////Cx+FgbrJQX6pQX6pQX6q4vt3///////////////////////+KlMZSYatSYatrd7f5+fz////////z9PmKlMZQX6pQX6pQX6qgqNH////////////z9PmZos1QX6pQX6pQX6pQX6qXoM3////////////////////////////////////////////////v8Pd4g71QX6pQX6qMlsfAxeBda7BQX6pRYKrJzeXo6vRodbZQX6pQX6p9iMBWZa1QX6qMlsf///+utdhQX6pQX6prd7fFyuN/isFQX6pQX6qKlMb///////////////////////////////////////+KlMZQX6pQX6pQX6pQX6qiqtL///////////////////////////////+6wN1QX6pRYKpQX6pQX6pQX6qpsdX////////////////////c3+5SYatQX6pQX6qZos3////////v8Pd5hb5RYKpTYqtQX6pQX6qOl8j////////o6vRyfrtda7CZos56hb5QX6pQX6plcrT5+fz////////////////////////////////////////19vp5hb5QX6pQX6qIksXBxuFWZa1QX6pTYqzEyeL09frt7/bd4O9mc7VQX6pQX6pQX6pQX6q9w9+vtthQX6pQX6pkcbTM0eZ/isFQX6pQX6qMlsfz9Pno6vT19vr////////////////////////////////FyuNQX6pQX6pQX6pQX6pQX6qxt9n////////////////////////U1+pQX6q4vt2vtthQX6pQX6pQX6rO0uf///////////////////+iqtJQX6pQX6pSYavY2+z////8/P57hr9ib7Pb3u5pdrZQX6pQX6qkrNP////w8fhpdrZ4g73s7fb///+6wN1QX6pQX6pib7P39/v////////////////////////////////////19vqAi8FQX6pQX6qGkcS9w99da7BQX6pVY6y6wN2mrdRgbbJYZ66DjcPFyuN9iMBVY6xaaK+gqNGqsdZQX6pQX6pkcbTFyuN9iMBQX6pQX6qRmsnFyuNxfbpWZa1ndLW2vNv////////////////////////////5+fx2gr1QX6pQX6pQX6pQX6pWZa3M0eb////////////////z9Plmc7WgqNH///+PmclQX6pQX6pndLX39/v///////////////////9yfrtQX6pQX6pve7n8/P7///+krNNaaK/g4/Dy8/lYZ65QX6pQX6rFyuP5+fx2gr1+icD39/v///////+XoM1QX6pQX6p1gbz8/P7///////////////////////////////////+TnMtQX6pQX6qPmcm+w99da7BQX6pVY6y7wd6ao85QX6pQX6pQX6pQX6p2gr319vrg4/Dq7PXT1+pRYKpQX6pndLXFyuN9iMBQX6pQX6qSm8q7wd5YZ65QX6pQX6pQX6pRYKrX2uv////////////////////////////Y2+xVY6xQX6pQX6pQX6pQX6pgbbLj5fH///////////+gqNFxfbr8/P7s7fZYZ65QX6pQX6qgqNH////////////////////X2+xTYqtQX6pQX6qep9D////d4O9WZa3O0uf////FyuNQX6pQX6pWZa3s7faKlMZxfbr39/v////////5+fxodbZQX6pQX6qWn8z///////////////////////////////////////9YZ65QX6prd7ext9lda7BQX6pYZ67DyOKZos5QX6pQX6pwfLlyfrtQX6pQX6rg4/D///////+iqtJQX6pVY6yzudp/isFQX6pQX6qSm8q9w99YZ65QX6paaK+BjMJRYKpQX6qmrdT///////////////////////////////+2vNtQX6pQX6pQX6pQX6pQX6p2gr36+/3////h5PFebLHb3u3///+2vNxQX6pQX6pQX6rU1+r///////////////////+XoM1QX6pQX6pTYqvb3u3///+Zos6ao87///////+Zos5QX6pQX6qDjsOttNdmc7Xs7fb////////////FyuNQX6pQX6pQX6rJzeX///////////////////////////////////////9jcbNQX6pVY6xRYKpQX6pWZa26wN2gqNFQX6pQX6p2gr3JzeVyfrtQX6pWZa3x8vj///////+xt9lQX6pRYKpYZ65QX6pQX6qSm8rDyOJaaK9QX6pVZK26wN2VnstQX6pQX6q4vt3///////////////////////////////////+PmclQX6pQX6pQX6pQX6pQX6qttNf////Z3O20u9v////8/P54g71QX6pQX6preLf5+fz////////////////09fpkcbRQX6pQX6pve7n8/P7////h5PH39/v////3+PtodbZQX6pRYKqMlsdlcrTQ1Oj///////////////+GkcRQX6pQX6pjcbP19vr///////////////////////////////////////+6wN1QX6pQX6pQX6pWZa26wN2bpM9QX6pQX6p2gr3HzORyfrtQX6pQX6qpsdXO0uekrNO0u9vU1+prd7dQX6pQX6pQX6qTnMu7wd5aaK9QX6paaK++w9+VnstQX6pQX6pyfrv09fr////////////////////////////////////19vpwfLlQX6pQX6pQX6pQX6paaK/s7fb////////////Z3O1RYKpQX6pQX6qrstb///////////////////+xt9lQX6pQX6pQX6qep9D////////////////////U1+pRYKpQX6pSYatRYKqgqNH////////////////m6PNYZ65QX6pQX6qRmsn////////////////////////////////////////////////Gy+OOmMiTnMvO0ueZos5QX6pQX6p1gbzGy+NreLdQX6pQX6qkrNOpsdVRYKpQX6pQX6pwfLnFyuOgqNGMlse4vt29w99YZ65QX6paaK+9w9+Sm8pQX6pQX6p4g73o6vT////////////////////////////////////////////Z3O1YZ65QX6pQX6pQX6pQX6q/xeD///////////+gqNFQX6pQX6pVY6zh5PH////////////////09fpndLVQX6pQX6pSYavX2uv///////////////////+mrdRQX6pQX6pQX6pndLXz9Pn///////////////+ep9BQX6pQX6pQX6rO0uf////////////////////////////////////////////////////////6+/2bpM9QX6pQX6pwfLnLz+ZsebhQX6pQX6qgqNHq7PVVY6xQX6pSYatQX6pQX6psebju7/f////HzORVY6xQX6pVZK2+w9+Rm8pQX6pQX6pxfbrv8Pf///////////////////////////////////////////////////+XoM1QX6pQX6pQX6pQX6qkrNP////////39/tlcrRQX6pQX6qAi8H///////////////////+ep9BQX6pQX6pQX6pve7n8/P7////////////////6+/1ve7lQX6pQX6pQX6q9w9/////////////////x8vhebLFQX6pQX6pyfrv8/P7////////////////////////////////////////////////////////O0udQX6pQX6p2gr3Lz+ZxfbpQX6pQX6qYoc3////c3+5QX6pQX6qGkcSZos1QX6pQX6pwfLnh5PF2gr1QX6pYZ664vt2VnstQX6pQX6pwfLno6vT////////////////////V2euzudr////////////////////////////k5/JYZ65QX6pQX6pQX6qZos7////////O0udQX6pQX6pQX6q9w9/////////////////S1ulVZK1VY6xQX6pQX6qYoc3////////////////////Q1OhRYKpQX6pQX6pve7n3+Pv////////////////AxeBQX6pQX6pQX6qzudr////////////////////////////////////////////////////////////8/P6zudp4g73EyeJsebhQX6pQX6qkrNOpsdWDjsPs7fZodbZQX6paaK+2vNykrNNQX6pQX6preLe/xeB7hr+4vt2Wn8xQX6pQX6pxfbro6vT///////////////////////+Nl8hrd7f///////////////////////////////+DjcNQX6pQX6pQX6qiqtL///////+Zos1QX6pQX6pda7Dv8Pf////////////z9Plve7mRm8paaK9QX6pQX6rO0uf////8/P6ao87k5/L///+Yoc1QX6pQX6pRYKrJzeX///////////////////+Ai8FQX6pQX6pWZa3o6vT////S1umzudr////////////////////////////////////////////////////////o6vRsebhQX6pQX6qiqtLDyOJQX6pQX6qOmMjLz+ZebLFQX6pVY6y2vNyao85QX6pQX6pyfrvg4/CiqtJQX6pQX6pwfLnq7PX///////////////////////////9yfrt0gLv///////////////////////////////+ep9BQX6pQX6pQX6q/xeD////39/tlcrRQX6pQX6qPmcn///////////////+OmMiOl8ixt9lQX6pQX6pmc7X3+Pv////O0udaaK/x8vj8/P5sebhQX6pQX6pyfrv////////////////////k5/JVY6xQX6pQX6qJk8b////8/P5yfrukrNP///////////////////////////////////////////////////////////+qsdZSYauZos2zudq4vt2DjsNQX6pQX6qNl8jDyOJebLFQX6pVY6y2vNuao85QX6pQX6p0gLu9w99pdrZsebjq7PX////////////////////////////19vpYZ654g73///////////////////////////////+Zos1QX6pQX6paaK/s7fb////T1+pQX6pQX6pRYKrS1un///////////+rstZrd7f09fqAi8FQX6pQX6qZos3////3+PtsebittNf////U1+pRYKpQX6pQX6q4vt3///////////////////+0u9tQX6pQX6pQX6rHzOT///+zudppdrb3+Pv////////////////////////////////////////////////////////////////S1umkrNNQX6pebLG+w9+Fj8RQX6pQX6qMlsfDyOJebLFQX6pVY6y0u9uep9BQX6pQX6pwfLnFyuPo6vT////////////////////////////////Z3O1QX6psebj8/P7////////////////////////6+/1wfLlQX6pQX6qttNf///////+ttNdQX6pQX6ppdrb6+/3///////+ttNdda7Dg4/D39/taaK9QX6pQX6rEyeL///+Vnstyfrv8/P7///+bpM9QX6pQX6plcrT39/v///////////////////+BjMJQX6pQX6pib7P6+/3c3+5YZ67M0eb///////////////////////////////////////////////////////////////////////+zudpQX6pQX6pda7DDyOKAi8FQX6pQX6qNl8jHzORda7BQX6pTYqy7wd6ep9BQX6preLfq7PX///////////////////////////////////+7wd5QX6pWZa3q7PX////////////////////////EyeJQX6pQX6p8h7/8/P7///////+MlsdQX6pQX6qFj8T///////+nr9RWZa3Q1Oj////Z3O1SYatQX6pTYqve4e+2vNxTYqvf4vD////8/P5wfLlQX6pQX6qXoM3////////////////////x8vhaaK9QX6pQX6qPmcns7fZib7OTnMv///////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pjcbO/xeCAi8FQX6pQX6qRm8rGy+Nda7BQX6pTYqyss9erstbk5/L///////////////////////////////////////+mrdRQX6pQX6qkrNP////////////////////s7fZpdrZQX6pyfrvq7PX////////8/P52gr1QX6pQX6pjcbOss9d/isFebLHT1+r////////HzORQX6pQX6pTYqtwfLlTYqzCx+H////////a3e1TYqxQX6pRYKrQ1Oj////////////////////b3u1SYatQX6pQX6pgbrJda7CGkcTd4O+zudrJzeX///////////////////////////////////////////////////////////////////////////+vtthRYKpQX6pib7PDyOKFj8RQX6pQX6qKlMbFyuNaaK9QX6pyfrv8/P7////////////////////////////////////////////Z3O1ndLVQX6pQX6qZos7m6PP39/vx8vi/xeBjcbNQX6qOl8jv8Pf///////////////+DjcNQX6pQX6pQX6pQX6p1gbzh5PH////////////DyOJQX6pQX6pQX6pWZa2/xeD///////////+ep9BQX6pQX6pjcbP5+fz////////////////////Z3O1QX6pQX6pQX6pQX6qDjcP39/vX2+ypsdW9w9////////////////////////////////////////////////////////////////////////////////+4vt1QX6pQX6pda7C+w9+IksVRYKpQX6qzudrP0+h9iMDm6PP////////////////////////////////////////////////////v8Pe6wN2GkcRaaK9ebLFpdrZjcbNebLGOmMjS1un////////////////////////U1+ppdrZda7CBjMK/xeD6+/3////////////////k5/JlcrRWZa2Jk8be4e/////////////////P0+ipsdWnr9TJzeX////////////////////////39/uDjsNYZ65sebixuNn6+/3////u7/fW2evg4/D///////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pgbbKpsdVYZ65QX6qIksX////8/P7////////////////////////////////////////////////////////////////////09frd4O/Q1Oja3e3z9Pn////////////////////////////////////3+Pvz9Pn////////////////////////////////x8vjo6vT////////////////////////////////////////////////////////////////////8/P7s7fb5+fz///////////////////////////////////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pQX6pQX6pQX6qdpc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+0u9tYZ65QX6pQX6pve7no6vT////////////////////////////////////////////////////////////////////////////////////////////////X2+y4vt3////////////////////////////////////////////////////////////////////////////////////////////////b3u7Q1Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b3u6rsta4vt3y8/n////////////////////////////////////////////////////////////////////8/P7q7PXe4e/S1un5+fzQ1Ojk5/L////S1unZ3O3////////V2evS1un6+/3q7PXd4O/v8Pf////Q1OjZ3O3////////m6PPO0ufv8Pfj5fH////////j5fH////g4/DS1unx8viao86Rmsnm6PP////o6vTS1un5+fz////q7PXd4O/X2uv5+fzQ1Ojm6PP////5+fzQ1Ojk5/L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx5hb6iqtKVnsyDjsOutdh4g73t7/apsdWrstb///+ep9CiqtK6wN3y8/l7hr+Vnsvq7PWdpc+ttNeOmMi4vt3f4u+MlsfFyuPq7PWOmMjc3+7g4/CZos62vNyIksXO0ufq7PWPmcmGkcTZ3O3O0ueNl8iutdiUncv39/t4g72mrdSKlMaDjsOttNeFj8T09fqRm8qxt9nf4u/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/t6hb75+fzGy+OTnMv///+Fj8Tf4u/S1umss9fv8Pd/isH////////3+Pt6hb709frf4u+GkcT////u7/eGkcTd4O+Ai8G0u9v5+fy7wd6bpM+mrdTFyuPFyuN7hr/DyOL///+9w9+zudr///+Rm8qGkcSttNePmcnu7/d7hr/8/P60u9uSm8r///+Pmcnv8PeVnsyao87j5fH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vqBjML8/P6+w9+gqNH///+DjcPf4vDM0eaqsdbx8vh1gbz09fr6+/3z9PmJk8b6+/3g4/B7hr/8/P3Q1OiRmsn////t7/aMlsenr9T5+fxve7l5hb7y8/n////k5/J7hr/U1+q9w9+or9X///+VnsugqNH19vr5+fzz9PmFj8T///+vttigqNH///+Nl8jv8Pf8/P6+w997hr/5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/uZos78/P3Lz+axuNn///+ao87m6PPW2eu4vt3///+mrdSRmsmmrdTu7/eiqtL3+Pv///+iqtKXoM2Ol8jd4O/t7/aqsdaVnsvS1un///+VnsyVnsv////T1+qmrdSZos3v8Pfc3+6BjMLLz+bf4u+KlMamrdS+w9/19vqdpc////++w9+zudr///+krNPw8fi/xeCep9CxuNn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P3////8/P78/P7////8/P3////////8/P7////////x8vjz9Pn////8/P7////////////x8vj5+fz////8/P3u7/f3+Pv////39/uNl8jT1+r////3+Pvu7/f8/P7////////19vr19vr////8/P3v8Pf39/v////8/P3////8/P78/P7////8/P7////z9Pnx8vj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7faXoM2nr9T///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 147.6mm )" draw:z-index="24" svg:height="4.23mm" svg:width="168.27mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+along in the inky darkness and suddenly stiffened: it was a dead-end, he would have to go back the
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 152.47mm )" draw:z-index="25" svg:height="4.23mm" svg:width="161.39mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+way he had come. The steps got louder and louder, he saw the black outline of a figure coming
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 157.34mm )" draw:z-index="26" svg:height="4.23mm" svg:width="161.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+around the corner. Is this the end of the line? he thought pressing himself back against the wall
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 162.21mm )" draw:z-index="27" svg:height="4.23mm" svg:width="159.56mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+trying to make himself invisible in the dark, was all that planning and energy wasted? He was
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 167.07mm )" draw:z-index="28" svg:height="4.23mm" svg:width="164mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+dripping with sweat now, cold and wet, he could smell the fear coming off his clothes. Suddenly
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 171.94mm )" draw:z-index="29" svg:height="4.23mm" svg:width="167mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+next to him, with a barely noticeable squeak, a door swung quietly to and fro in the night's breeze.
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 176.81mm )" draw:z-index="30" svg:height="4.23mm" svg:width="169.29mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+Could this be the haven he'd prayed for? Slowly he slid toward the door, pressing himself more and
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 181.68mm )" draw:z-index="31" svg:height="4.23mm" svg:width="146.82mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+more into the wall, into the dark, away from his enemy. Would this door save his hide?
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<text:p text:style-name="paragraph8" >
+</text:p>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 20.18mm )" draw:z-index="0" svg:height="4.23mm" svg:width="163.08mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 25.05mm )" draw:z-index="1" svg:height="4.23mm" svg:width="165.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 29.91mm )" draw:z-index="2" svg:height="4.23mm" svg:width="162.03mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 34.78mm )" draw:z-index="3" svg:height="4.23mm" svg:width="167.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 39.65mm )" draw:z-index="4" svg:height="4.23mm" svg:width="161.92mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 44.52mm )" draw:z-index="5" svg:height="4.23mm" svg:width="164.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 49.39mm )" draw:z-index="6" svg:height="4.23mm" svg:width="165.52mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 54.26mm )" draw:z-index="7" svg:height="4.23mm" svg:width="161.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 59.12mm )" draw:z-index="8" svg:height="4.23mm" svg:width="168.27mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 63.99mm )" draw:z-index="9" svg:height="4.23mm" svg:width="161.39mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 68.86mm )" draw:z-index="10" svg:height="4.23mm" svg:width="161.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 73.73mm )" draw:z-index="11" svg:height="4.23mm" svg:width="159.56mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 78.6mm )" draw:z-index="12" svg:height="4.23mm" svg:width="164mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 83.47mm )" draw:z-index="13" svg:height="4.23mm" svg:width="167mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 88.33mm )" draw:z-index="14" svg:height="4.23mm" svg:width="169.29mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 93.2mm )" draw:z-index="15" svg:height="4.23mm" svg:width="146.82mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 98.07mm )" draw:z-index="16" svg:height="4.23mm" svg:width="163.08mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 102.94mm )" draw:z-index="17" svg:height="4.23mm" svg:width="165.69mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 107.81mm )" draw:z-index="18" svg:height="4.23mm" svg:width="162.03mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 112.68mm )" draw:z-index="19" svg:height="4.23mm" svg:width="167.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 117.54mm )" draw:z-index="20" svg:height="4.23mm" svg:width="161.92mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 122.41mm )" draw:z-index="21" svg:height="4.23mm" svg:width="164.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 127.28mm )" draw:z-index="22" svg:height="4.23mm" svg:width="165.52mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 132.15mm )" draw:z-index="23" svg:height="4.23mm" svg:width="161.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 91.75mm 147.42mm )" draw:z-index="32" svg:height="-10.59mm" svg:width="26.45mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:image >
+<office:binary-data >
+UDYKMTAwIDQwCjI1NQr////////////////////////////////////////////////////////////////////////w8fiMlsdda7Bve7nBxuH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx8h79QX6pQX6pQX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Z3O1QX6pQX6plcrRYZ65QX6pSYau4vt3////////////////////////////////////////////////////////////////////////////////////////////////////19vrk5/Lg4/Ds7fb5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fjd4O/j5fFQX6pQX6qBjMK4vt1da7BQX6pVY6y/xeD////////////////////////////////////////////////////////////////////////////////////3+PvAxeCBjMJda7BaaK9YZ65RYKplcrSUncvHzOT5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////o6vR7hr9da7DT1+qOl8hQX6pQX6qOmMi+w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////////////X2ut1gbxQX6p1gby4vt3e4e/b3u6vtthda7BQX6pQX6qIksX8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vq4vt1QX6pQX6pgbrLM0eaIksVQX6pQX6qGkcS9w99da7BQX6pRYKq4vt3////////////////////////////////////////////////////////////////////M0eZWZa1QX6qUncv8/P7////////////////O0udVY6xQX6p0gLv8/P7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////x8vh2gr2gqNG2vNtRYKpQX6pda7DM0eaDjsNQX6pQX6qIksXBxuFWZa1QX6pRYKq+w9/////////////////////////////////////////////////////////////s7fZebLFQX6pjcbP19vr///////////////////////92gr1QX6qbpM////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+UnctQX6pQX6qiqtKvtthRYKpQX6pkcbTHzOSBjMJQX6pQX6qMlsfAxeBda7BQX6pTYqzY2+z///////////////////////////////////////////////////////+krNNQX6pQX6qXoM3///////////////////////////+OmMhQX6rHzOT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u7/ePmcm2vNxve7lQX6pQX6qiqtKvtthQX6pQX6plcrTJzeWMlsdQX6pQX6qIksW7wd5gbrKgqNGkrNO0u9v////////////////////////////////////////////////5+fxodbZQX6pQX6qmrdT///////////////////////////+VnstVY6zy8/n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w8fh4g71QX6ppdrbO0udve7lQX6pQX6qiqtK2vNtTYqtQX6pkcbTFyuOJk8ZQX6pQX6p/isHb3u2gqNFQX6pQX6q+w9/////////////////////////////////////////////o6vRVY6xQX6pQX6qDjcP///////////////////////////+Ol8hyfrv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z9PmAi8FQX6pQX6p/isHGy+PBxuFve7lQX6pQX6qpsdWutdhTYqtQX6pjcbPV2et9iMBQX6qYoc2ttNdRYKpQX6pjcbO4vt3JzuX////////////////////////////////////////m6PNVZK1QX6pQX6pWZa3h5PH///////////////////////+mrdSqsdb////////////s7fa0u9uXoM2zudr5+fz////////////////////////09frZ3O3X2+zg4/D////////////////////EyeKOmMiWn8zq7PX////////////////////e4e+vttidpc+0u9v39/v////////////////////////////////////////////////////v8PeBjMJQX6pQX6qIksW9w99YZ65xfbq9w99rd7dQX6pQX6qiqtKrstZVY6xQX6qao87y8/m2vNypsdVRYKpQX6plcrTEyeJ9iMBQX6qzudr8/P7////////////////////////////////09fpebLFQX6pQX6pQX6qDjsP8/P7////////////////////8/P7////////////Cx+FgbrJQX6pQX6pQX6q4vt3///////////////////////+KlMZSYatSYatrd7f5+fz////////z9PmKlMZQX6pQX6pQX6qgqNH////////////z9PmZos1QX6pQX6pQX6pQX6qXoM3////////////////////////////////////////////////v8Pd4g71QX6pQX6qMlsfAxeBda7BQX6pRYKrJzeXo6vRodbZQX6pQX6p9iMBWZa1QX6qMlsf///+utdhQX6pQX6prd7fFyuN/isFQX6pQX6qKlMb///////////////////////////////////////+KlMZQX6pQX6pQX6pQX6qiqtL///////////////////////////////+6wN1QX6pRYKpQX6pQX6pQX6qpsdX////////////////////c3+5SYatQX6pQX6qZos3////////v8Pd5hb5RYKpTYqtQX6pQX6qOl8j////////o6vRyfrtda7CZos56hb5QX6pQX6plcrT5+fz////////////////////////////////////////19vp5hb5QX6pQX6qIksXBxuFWZa1QX6pTYqzEyeL09frt7/bd4O9mc7VQX6pQX6pQX6pQX6q9w9+vtthQX6pQX6pkcbTM0eZ/isFQX6pQX6qMlsfz9Pno6vT19vr////////////////////////////////FyuNQX6pQX6pQX6pQX6pQX6qxt9n////////////////////////U1+pQX6q4vt2vtthQX6pQX6pQX6rO0uf///////////////////+iqtJQX6pQX6pSYavY2+z////8/P57hr9ib7Pb3u5pdrZQX6pQX6qkrNP////w8fhpdrZ4g73s7fb///+6wN1QX6pQX6pib7P39/v////////////////////////////////////19vqAi8FQX6pQX6qGkcS9w99da7BQX6pVY6y6wN2mrdRgbbJYZ66DjcPFyuN9iMBVY6xaaK+gqNGqsdZQX6pQX6pkcbTFyuN9iMBQX6pQX6qRmsnFyuNxfbpWZa1ndLW2vNv////////////////////////////5+fx2gr1QX6pQX6pQX6pQX6pWZa3M0eb////////////////z9Plmc7WgqNH///+PmclQX6pQX6pndLX39/v///////////////////9yfrtQX6pQX6pve7n8/P7///+krNNaaK/g4/Dy8/lYZ65QX6pQX6rFyuP5+fx2gr1+icD39/v///////+XoM1QX6pQX6p1gbz8/P7///////////////////////////////////+TnMtQX6pQX6qPmcm+w99da7BQX6pVY6y7wd6ao85QX6pQX6pQX6pQX6p2gr319vrg4/Dq7PXT1+pRYKpQX6pndLXFyuN9iMBQX6pQX6qSm8q7wd5YZ65QX6pQX6pQX6pRYKrX2uv////////////////////////////Y2+xVY6xQX6pQX6pQX6pQX6pgbbLj5fH///////////+gqNFxfbr8/P7s7fZYZ65QX6pQX6qgqNH////////////////////X2+xTYqtQX6pQX6qep9D////d4O9WZa3O0uf////FyuNQX6pQX6pWZa3s7faKlMZxfbr39/v////////5+fxodbZQX6pQX6qWn8z///////////////////////////////////////9YZ65QX6prd7ext9lda7BQX6pYZ67DyOKZos5QX6pQX6pwfLlyfrtQX6pQX6rg4/D///////+iqtJQX6pVY6yzudp/isFQX6pQX6qSm8q9w99YZ65QX6paaK+BjMJRYKpQX6qmrdT///////////////////////////////+2vNtQX6pQX6pQX6pQX6pQX6p2gr36+/3////h5PFebLHb3u3///+2vNxQX6pQX6pQX6rU1+r///////////////////+XoM1QX6pQX6pTYqvb3u3///+Zos6ao87///////+Zos5QX6pQX6qDjsOttNdmc7Xs7fb////////////FyuNQX6pQX6pQX6rJzeX///////////////////////////////////////9jcbNQX6pVY6xRYKpQX6pWZa26wN2gqNFQX6pQX6p2gr3JzeVyfrtQX6pWZa3x8vj///////+xt9lQX6pRYKpYZ65QX6pQX6qSm8rDyOJaaK9QX6pVZK26wN2VnstQX6pQX6q4vt3///////////////////////////////////+PmclQX6pQX6pQX6pQX6pQX6qttNf////Z3O20u9v////8/P54g71QX6pQX6preLf5+fz////////////////09fpkcbRQX6pQX6pve7n8/P7////h5PH39/v////3+PtodbZQX6pRYKqMlsdlcrTQ1Oj///////////////+GkcRQX6pQX6pjcbP19vr///////////////////////////////////////+6wN1QX6pQX6pQX6pWZa26wN2bpM9QX6pQX6p2gr3HzORyfrtQX6pQX6qpsdXO0uekrNO0u9vU1+prd7dQX6pQX6pQX6qTnMu7wd5aaK9QX6paaK++w9+VnstQX6pQX6pyfrv09fr////////////////////////////////////19vpwfLlQX6pQX6pQX6pQX6paaK/s7fb////////////Z3O1RYKpQX6pQX6qrstb///////////////////+xt9lQX6pQX6pQX6qep9D////////////////////U1+pRYKpQX6pSYatRYKqgqNH////////////////m6PNYZ65QX6pQX6qRmsn////////////////////////////////////////////////Gy+OOmMiTnMvO0ueZos5QX6pQX6p1gbzGy+NreLdQX6pQX6qkrNOpsdVRYKpQX6pQX6pwfLnFyuOgqNGMlse4vt29w99YZ65QX6paaK+9w9+Sm8pQX6pQX6p4g73o6vT////////////////////////////////////////////Z3O1YZ65QX6pQX6pQX6pQX6q/xeD///////////+gqNFQX6pQX6pVY6zh5PH////////////////09fpndLVQX6pQX6pSYavX2uv///////////////////+mrdRQX6pQX6pQX6pndLXz9Pn///////////////+ep9BQX6pQX6pQX6rO0uf////////////////////////////////////////////////////////6+/2bpM9QX6pQX6pwfLnLz+ZsebhQX6pQX6qgqNHq7PVVY6xQX6pSYatQX6pQX6psebju7/f////HzORVY6xQX6pVZK2+w9+Rm8pQX6pQX6pxfbrv8Pf///////////////////////////////////////////////////+XoM1QX6pQX6pQX6pQX6qkrNP////////39/tlcrRQX6pQX6qAi8H///////////////////+ep9BQX6pQX6pQX6pve7n8/P7////////////////6+/1ve7lQX6pQX6pQX6q9w9/////////////////x8vhebLFQX6pQX6pyfrv8/P7////////////////////////////////////////////////////////O0udQX6pQX6p2gr3Lz+ZxfbpQX6pQX6qYoc3////c3+5QX6pQX6qGkcSZos1QX6pQX6pwfLnh5PF2gr1QX6pYZ664vt2VnstQX6pQX6pwfLno6vT////////////////////V2euzudr////////////////////////////k5/JYZ65QX6pQX6pQX6qZos7////////O0udQX6pQX6pQX6q9w9/////////////////S1ulVZK1VY6xQX6pQX6qYoc3////////////////////Q1OhRYKpQX6pQX6pve7n3+Pv////////////////AxeBQX6pQX6pQX6qzudr////////////////////////////////////////////////////////////8/P6zudp4g73EyeJsebhQX6pQX6qkrNOpsdWDjsPs7fZodbZQX6paaK+2vNykrNNQX6pQX6preLe/xeB7hr+4vt2Wn8xQX6pQX6pxfbro6vT///////////////////////+Nl8hrd7f///////////////////////////////+DjcNQX6pQX6pQX6qiqtL///////+Zos1QX6pQX6pda7Dv8Pf////////////z9Plve7mRm8paaK9QX6pQX6rO0uf////8/P6ao87k5/L///+Yoc1QX6pQX6pRYKrJzeX///////////////////+Ai8FQX6pQX6pWZa3o6vT////S1umzudr////////////////////////////////////////////////////////o6vRsebhQX6pQX6qiqtLDyOJQX6pQX6qOmMjLz+ZebLFQX6pVY6y2vNyao85QX6pQX6pyfrvg4/CiqtJQX6pQX6pwfLnq7PX///////////////////////////9yfrt0gLv///////////////////////////////+ep9BQX6pQX6pQX6q/xeD////39/tlcrRQX6pQX6qPmcn///////////////+OmMiOl8ixt9lQX6pQX6pmc7X3+Pv////O0udaaK/x8vj8/P5sebhQX6pQX6pyfrv////////////////////k5/JVY6xQX6pQX6qJk8b////8/P5yfrukrNP///////////////////////////////////////////////////////////+qsdZSYauZos2zudq4vt2DjsNQX6pQX6qNl8jDyOJebLFQX6pVY6y2vNuao85QX6pQX6p0gLu9w99pdrZsebjq7PX////////////////////////////19vpYZ654g73///////////////////////////////+Zos1QX6pQX6paaK/s7fb////T1+pQX6pQX6pRYKrS1un///////////+rstZrd7f09fqAi8FQX6pQX6qZos3////3+PtsebittNf////U1+pRYKpQX6pQX6q4vt3///////////////////+0u9tQX6pQX6pQX6rHzOT///+zudppdrb3+Pv////////////////////////////////////////////////////////////////S1umkrNNQX6pebLG+w9+Fj8RQX6pQX6qMlsfDyOJebLFQX6pVY6y0u9uep9BQX6pQX6pwfLnFyuPo6vT////////////////////////////////Z3O1QX6psebj8/P7////////////////////////6+/1wfLlQX6pQX6qttNf///////+ttNdQX6pQX6ppdrb6+/3///////+ttNdda7Dg4/D39/taaK9QX6pQX6rEyeL///+Vnstyfrv8/P7///+bpM9QX6pQX6plcrT39/v///////////////////+BjMJQX6pQX6pib7P6+/3c3+5YZ67M0eb///////////////////////////////////////////////////////////////////////+zudpQX6pQX6pda7DDyOKAi8FQX6pQX6qNl8jHzORda7BQX6pTYqy7wd6ep9BQX6preLfq7PX///////////////////////////////////+7wd5QX6pWZa3q7PX////////////////////////EyeJQX6pQX6p8h7/8/P7///////+MlsdQX6pQX6qFj8T///////+nr9RWZa3Q1Oj////Z3O1SYatQX6pTYqve4e+2vNxTYqvf4vD////8/P5wfLlQX6pQX6qXoM3////////////////////x8vhaaK9QX6pQX6qPmcns7fZib7OTnMv///////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pjcbO/xeCAi8FQX6pQX6qRm8rGy+Nda7BQX6pTYqyss9erstbk5/L///////////////////////////////////////+mrdRQX6pQX6qkrNP////////////////////s7fZpdrZQX6pyfrvq7PX////////8/P52gr1QX6pQX6pjcbOss9d/isFebLHT1+r////////HzORQX6pQX6pTYqtwfLlTYqzCx+H////////a3e1TYqxQX6pRYKrQ1Oj////////////////////b3u1SYatQX6pQX6pgbrJda7CGkcTd4O+zudrJzeX///////////////////////////////////////////////////////////////////////////+vtthRYKpQX6pib7PDyOKFj8RQX6pQX6qKlMbFyuNaaK9QX6pyfrv8/P7////////////////////////////////////////////Z3O1ndLVQX6pQX6qZos7m6PP39/vx8vi/xeBjcbNQX6qOl8jv8Pf///////////////+DjcNQX6pQX6pQX6pQX6p1gbzh5PH////////////DyOJQX6pQX6pQX6pWZa2/xeD///////////+ep9BQX6pQX6pjcbP5+fz////////////////////Z3O1QX6pQX6pQX6pQX6qDjcP39/vX2+ypsdW9w9////////////////////////////////////////////////////////////////////////////////+4vt1QX6pQX6pda7C+w9+IksVRYKpQX6qzudrP0+h9iMDm6PP////////////////////////////////////////////////////v8Pe6wN2GkcRaaK9ebLFpdrZjcbNebLGOmMjS1un////////////////////////U1+ppdrZda7CBjMK/xeD6+/3////////////////k5/JlcrRWZa2Jk8be4e/////////////////P0+ipsdWnr9TJzeX////////////////////////39/uDjsNYZ65sebixuNn6+/3////u7/fW2evg4/D///////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pgbbKpsdVYZ65QX6qIksX////8/P7////////////////////////////////////////////////////////////////////09frd4O/Q1Oja3e3z9Pn////////////////////////////////////3+Pvz9Pn////////////////////////////////x8vjo6vT////////////////////////////////////////////////////////////////////8/P7s7fb5+fz///////////////////////////////////////////////////////////////////////////////////////////////////////////////+vtthQX6pQX6pQX6pQX6pQX6qdpc////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+0u9tYZ65QX6pQX6pve7no6vT////////////////////////////////////////////////////////////////////////////////////////////////X2+y4vt3////////////////////////////////////////////////////////////////////////////////////////////////b3u7Q1Oj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b3u6rsta4vt3y8/n////////////////////////////////////////////////////////////////////8/P7q7PXe4e/S1un5+fzQ1Ojk5/L////S1unZ3O3////////V2evS1un6+/3q7PXd4O/v8Pf////Q1OjZ3O3////////m6PPO0ufv8Pfj5fH////////j5fH////g4/DS1unx8viao86Rmsnm6PP////o6vTS1un5+fz////q7PXd4O/X2uv5+fzQ1Ojm6PP////5+fzQ1Ojk5/L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fx5hb6iqtKVnsyDjsOutdh4g73t7/apsdWrstb///+ep9CiqtK6wN3y8/l7hr+Vnsvq7PWdpc+ttNeOmMi4vt3f4u+MlsfFyuPq7PWOmMjc3+7g4/CZos62vNyIksXO0ufq7PWPmcmGkcTZ3O3O0ueNl8iutdiUncv39/t4g72mrdSKlMaDjsOttNeFj8T09fqRm8qxt9nf4u/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/t6hb75+fzGy+OTnMv///+Fj8Tf4u/S1umss9fv8Pd/isH////////3+Pt6hb709frf4u+GkcT////u7/eGkcTd4O+Ai8G0u9v5+fy7wd6bpM+mrdTFyuPFyuN7hr/DyOL///+9w9+zudr///+Rm8qGkcSttNePmcnu7/d7hr/8/P60u9uSm8r///+Pmcnv8PeVnsyao87j5fH////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19vqBjML8/P6+w9+gqNH///+DjcPf4vDM0eaqsdbx8vh1gbz09fr6+/3z9PmJk8b6+/3g4/B7hr/8/P3Q1OiRmsn////t7/aMlsenr9T5+fxve7l5hb7y8/n////k5/J7hr/U1+q9w9+or9X///+VnsugqNH19vr5+fzz9PmFj8T///+vttigqNH///+Nl8jv8Pf8/P6+w997hr/5+fz////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/uZos78/P3Lz+axuNn///+ao87m6PPW2eu4vt3///+mrdSRmsmmrdTu7/eiqtL3+Pv///+iqtKXoM2Ol8jd4O/t7/aqsdaVnsvS1un///+VnsyVnsv////T1+qmrdSZos3v8Pfc3+6BjMLLz+bf4u+KlMamrdS+w9/19vqdpc////++w9+zudr///+krNPw8fi/xeCep9CxuNn////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/P3////8/P78/P7////8/P3////////8/P7////////x8vjz9Pn////8/P7////////////x8vj5+fz////8/P3u7/f3+Pv////39/uNl8jT1+r////3+Pvu7/f8/P7////////19vr19vr////8/P3v8Pf39/v////8/P3////8/P78/P7////8/P7////z9Pnx8vj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////s7faXoM2nr9T///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=
+</office:binary-data>
+</draw:image>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 147.6mm )" draw:z-index="24" svg:height="4.23mm" svg:width="168.27mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 152.47mm )" draw:z-index="25" svg:height="4.23mm" svg:width="161.39mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 157.34mm )" draw:z-index="26" svg:height="4.23mm" svg:width="161.18mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 162.21mm )" draw:z-index="27" svg:height="4.23mm" svg:width="159.56mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 167.07mm )" draw:z-index="28" svg:height="4.23mm" svg:width="164mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 171.94mm )" draw:z-index="29" svg:height="4.23mm" svg:width="167mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 176.81mm )" draw:z-index="30" svg:height="4.23mm" svg:width="169.29mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="translate( 20.03mm 181.68mm )" draw:z-index="31" svg:height="4.23mm" svg:width="146.82mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+</office:text>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/verticaltext.pdf b/sdext/source/pdfimport/test/testdocs/verticaltext.pdf
new file mode 100644
index 000000000..a83af3bfb
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/verticaltext.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/testdocs/verticaltext_pdfi_unittest_draw.xml b/sdext/source/pdfimport/test/testdocs/verticaltext_pdfi_unittest_draw.xml
new file mode 100644
index 000000000..ee3263752
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/verticaltext_pdfi_unittest_draw.xml
@@ -0,0 +1,233 @@
+<?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 .
+-->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="36mm" fo:margin-right="10mm" fo:margin-top="60mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:auto-grow-height="true" draw:auto-grow-width="true" draw:fill="none" draw:stroke="none" draw:textarea-horizontal-align="left" draw:textarea-vertical-align="top" fo:padding-bottom="0cm" fo:padding-left="0cm" fo:padding-right="0cm" fo:padding-top="0cm" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Albany" fo:font-size="18pt" style:font-size-asian="18pt" style:font-size-complex="18pt" >
+
+</style:text-properties>
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:drawing >
+<draw:page draw:master-page-name="master-page3" >
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 64.24mm )" draw:z-index="13" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+B
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 60mm )" draw:z-index="12" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 68.47mm )" draw:z-index="14" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+S
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 72.71mm )" draw:z-index="15" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+4
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 78.45mm )" draw:z-index="7" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+2
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 82.69mm )" draw:z-index="6" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+S
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 86.96mm )" draw:z-index="5" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+B
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 91.15mm )" draw:z-index="4" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 102.51mm )" draw:z-index="0" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 110.98mm )" draw:z-index="2" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+S
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 106.75mm )" draw:z-index="1" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+B
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 115.22mm )" draw:z-index="3" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+1
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 159.76mm )" draw:z-index="19" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+5
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 162.94mm )" draw:z-index="18" svg:height="6.35mm" svg:width="3.17mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 170.7mm )" draw:z-index="16" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 166.47mm )" draw:z-index="17" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 230.18mm )" draw:z-index="11" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+3
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 233.35mm )" draw:z-index="10" svg:height="6.35mm" svg:width="3.17mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 241.12mm )" draw:z-index="8" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 236.88mm )" draw:z-index="9" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+</draw:page>
+</office:drawing>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/verticaltext_pdfi_unittest_impress.xml b/sdext/source/pdfimport/test/testdocs/verticaltext_pdfi_unittest_impress.xml
new file mode 100644
index 000000000..7e11d1ea1
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/verticaltext_pdfi_unittest_impress.xml
@@ -0,0 +1,233 @@
+<?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 .
+-->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="36mm" fo:margin-right="10mm" fo:margin-top="60mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:auto-grow-height="true" draw:auto-grow-width="true" draw:fill="none" draw:stroke="none" draw:textarea-horizontal-align="left" draw:textarea-vertical-align="top" fo:padding-bottom="0cm" fo:padding-left="0cm" fo:padding-right="0cm" fo:padding-top="0cm" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Albany" fo:font-size="18pt" style:font-size-asian="18pt" style:font-size-complex="18pt" >
+
+</style:text-properties>
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:presentation >
+<draw:page draw:master-page-name="master-page3" >
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 64.24mm )" draw:z-index="13" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+B
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 60mm )" draw:z-index="12" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 68.47mm )" draw:z-index="14" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+S
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 72.71mm )" draw:z-index="15" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+4
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 78.45mm )" draw:z-index="7" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+2
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 82.69mm )" draw:z-index="6" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+S
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 86.96mm )" draw:z-index="5" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+B
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 91.15mm )" draw:z-index="4" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 102.51mm )" draw:z-index="0" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 110.98mm )" draw:z-index="2" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+S
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 106.75mm )" draw:z-index="1" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+B
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 115.22mm )" draw:z-index="3" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+1
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 159.76mm )" draw:z-index="19" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+5
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 162.94mm )" draw:z-index="18" svg:height="6.35mm" svg:width="3.17mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 170.7mm )" draw:z-index="16" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 166.47mm )" draw:z-index="17" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 230.18mm )" draw:z-index="11" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+3
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 233.35mm )" draw:z-index="10" svg:height="6.35mm" svg:width="3.17mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 241.12mm )" draw:z-index="8" svg:height="6.35mm" svg:width="4.22mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 236.88mm )" draw:z-index="9" svg:height="6.35mm" svg:width="3.53mm" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+</draw:page>
+</office:presentation>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testdocs/verticaltext_pdfi_unittest_writer.xml b/sdext/source/pdfimport/test/testdocs/verticaltext_pdfi_unittest_writer.xml
new file mode 100644
index 000000000..0b1ccb0c9
--- /dev/null
+++ b/sdext/source/pdfimport/test/testdocs/verticaltext_pdfi_unittest_writer.xml
@@ -0,0 +1,356 @@
+<?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 .
+-->
+<office:document office:version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" 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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+<office:automatic-styles >
+<style:page-layout style:name="page-layout2" >
+<style:page-layout-properties fo:margin-bottom="10mm" fo:margin-left="10mm" fo:margin-right="10mm" fo:margin-top="10mm" fo:page-height="297.03mm" fo:page-width="209.9mm" style:print-orientation="portrait" style:writing-mode="lr-tb" >
+
+</style:page-layout-properties>
+
+</style:page-layout>
+<style:style style:family="graphic" style:name="graphic5" >
+<style:graphic-properties draw:fill="none" draw:stroke="none" >
+
+</style:graphic-properties>
+
+</style:style>
+<style:style style:family="text" style:name="text7" >
+<style:text-properties fo:color="#000000" fo:font-family="Albany" fo:font-size="18pt" style:font-size-asian="18pt" style:font-size-complex="18pt" >
+
+</style:text-properties>
+
+</style:style>
+<style:style style:family="paragraph" style:master-page-name="master-page3" style:name="paragraph8" >
+
+</style:style>
+</office:automatic-styles>
+<office:styles >
+</office:styles>
+<office:master-styles >
+<style:master-page style:name="master-page3" style:page-layout-name="page-layout2" >
+
+</style:master-page>
+</office:master-styles>
+<office:body >
+<office:text >
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 64.24mm )" draw:z-index="13" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+B
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 60mm )" draw:z-index="12" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 68.47mm )" draw:z-index="14" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+S
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 72.71mm )" draw:z-index="15" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+4
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 78.45mm )" draw:z-index="7" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+2
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 82.69mm )" draw:z-index="6" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+S
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 86.96mm )" draw:z-index="5" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+B
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 91.15mm )" draw:z-index="4" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 102.51mm )" draw:z-index="0" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 110.98mm )" draw:z-index="2" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+S
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 106.75mm )" draw:z-index="1" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+B
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 115.22mm )" draw:z-index="3" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+1
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 159.76mm )" draw:z-index="19" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+5
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 162.94mm )" draw:z-index="18" svg:height="6.35mm" svg:width="3.17mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 170.7mm )" draw:z-index="16" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 166.47mm )" draw:z-index="17" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 230.18mm )" draw:z-index="11" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+3
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 233.35mm )" draw:z-index="10" svg:height="6.35mm" svg:width="3.17mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+s
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 241.12mm )" draw:z-index="8" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+A
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 236.88mm )" draw:z-index="9" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+<text:span text:style-name="text7" >
+b
+</text:span>
+</text:p>
+</draw:text-box>
+</draw:frame>
+<text:p text:style-name="paragraph8" >
+</text:p>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 64.24mm )" draw:z-index="13" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 60mm )" draw:z-index="12" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 68.47mm )" draw:z-index="14" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 121.28mm 72.71mm )" draw:z-index="15" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 78.45mm )" draw:z-index="7" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 82.69mm )" draw:z-index="6" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 86.96mm )" draw:z-index="5" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 151.23mm 91.15mm )" draw:z-index="4" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 102.51mm )" draw:z-index="0" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 110.98mm )" draw:z-index="2" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 106.75mm )" draw:z-index="1" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( -1.5707963267949 ) translate( 48.78mm 115.22mm )" draw:z-index="3" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 159.76mm )" draw:z-index="19" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 162.94mm )" draw:z-index="18" svg:height="6.35mm" svg:width="3.17mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 170.7mm )" draw:z-index="16" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 161.71mm 166.47mm )" draw:z-index="17" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 230.18mm )" draw:z-index="11" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 233.35mm )" draw:z-index="10" svg:height="6.35mm" svg:width="3.17mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 241.12mm )" draw:z-index="8" svg:height="6.35mm" svg:width="4.22mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+<draw:frame draw:style-name="graphic5" draw:transform="rotate( 1.5707963267949 ) translate( 36.69mm 236.88mm )" draw:z-index="9" svg:height="6.35mm" svg:width="3.53mm" text:anchor-page-number="1" text:anchor-type="page" >
+<draw:text-box >
+<text:p >
+</text:p>
+</draw:text-box>
+</draw:frame>
+</office:text>
+</office:body>
+</office:document>
diff --git a/sdext/source/pdfimport/test/testinput.odp b/sdext/source/pdfimport/test/testinput.odp
new file mode 100644
index 000000000..fe1ac44e8
--- /dev/null
+++ b/sdext/source/pdfimport/test/testinput.odp
Binary files differ
diff --git a/sdext/source/pdfimport/test/testinput.pdf b/sdext/source/pdfimport/test/testinput.pdf
new file mode 100644
index 000000000..4c44ac469
--- /dev/null
+++ b/sdext/source/pdfimport/test/testinput.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/test/tests.cxx b/sdext/source/pdfimport/test/tests.cxx
new file mode 100644
index 000000000..b569a1443
--- /dev/null
+++ b/sdext/source/pdfimport/test/tests.cxx
@@ -0,0 +1,904 @@
+/* -*- 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 <config_features.h>
+
+#include "outputwrap.hxx"
+#include <contentsink.hxx>
+#include <pdfihelper.hxx>
+#include <wrapper.hxx>
+#include <pdfparse.hxx>
+#include "../pdfiadaptor.hxx"
+
+#include <rtl/math.hxx>
+#include <osl/file.hxx>
+#include <comphelper/sequence.hxx>
+#include <comphelper/string.hxx>
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+#include <test/bootstrapfixture.hxx>
+#include <test/xmltesttools.hxx>
+
+#include <com/sun/star/geometry/RealRectangle2D.hpp>
+#include <com/sun/star/geometry/RealSize2D.hpp>
+#include <com/sun/star/rendering/PathJoinType.hpp>
+#include <com/sun/star/rendering/PathCapType.hpp>
+#include <com/sun/star/rendering/BlendMode.hpp>
+
+#include <basegfx/utils/canvastools.hxx>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
+#include <basegfx/polygon/b2dpolygonclipper.hxx>
+
+#include <unordered_map>
+#include <vector>
+
+#include <rtl/ustring.hxx>
+#include <rtl/ref.hxx>
+
+using namespace ::pdfparse;
+using namespace ::pdfi;
+using namespace ::com::sun::star;
+
+namespace
+{
+
+ class TestSink : public ContentSink
+ {
+ public:
+ TestSink() :
+ m_nNextFontId( 1 ),
+ m_aIdToFont(),
+ m_aFontToId(),
+ m_aGCStack(1),
+ m_aPageSize(),
+ m_aHyperlinkBounds(),
+ m_aURI(),
+ m_aTextOut(),
+ m_nNumPages(0),
+ m_bPageEnded(false),
+ m_bRedCircleSeen(false),
+ m_bGreenStrokeSeen(false),
+ m_bDashedLineSeen(false),
+ m_bImageSeen(false)
+ {}
+
+ void check()
+ {
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "A4 page size (in 100th of points): Width", 79400, m_aPageSize.Width, 0.00000001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "A4 page size (in 100th of points): Height", 59500, m_aPageSize.Height, 0.0000001 );
+ CPPUNIT_ASSERT_MESSAGE( "endPage() called", m_bPageEnded );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Num pages equal one", sal_Int32(1), m_nNumPages );
+ CPPUNIT_ASSERT_MESSAGE( "Correct hyperlink bounding box",
+ rtl::math::approxEqual(m_aHyperlinkBounds.X1,34.7 ) );
+ CPPUNIT_ASSERT_MESSAGE( "Correct hyperlink bounding box",
+ rtl::math::approxEqual(m_aHyperlinkBounds.Y1,386.0) );
+ CPPUNIT_ASSERT_MESSAGE( "Correct hyperlink bounding box",
+ rtl::math::approxEqual(m_aHyperlinkBounds.X2,166.7) );
+ CPPUNIT_ASSERT_MESSAGE( "Correct hyperlink bounding box",
+ rtl::math::approxEqual(m_aHyperlinkBounds.Y2,406.2) );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Correct hyperlink URI", OUString("http://download.openoffice.org/"), m_aURI );
+
+ const char* const sText = " \n \nThis is a testtext\nNew paragraph,\nnew line\n"
+ "Hyperlink, this is\n?\nThis is more text\noutline mode\n?\nNew paragraph\n";
+ OString aTmp;
+ m_aTextOut.makeStringAndClear().convertToString( &aTmp,
+ RTL_TEXTENCODING_ASCII_US,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Imported text is \"This is a testtext New paragraph, new line"
+ " Hyperlink, this is * This is more text outline mode * New paragraph\"",
+ aTmp, OString(sText) );
+
+ CPPUNIT_ASSERT_MESSAGE( "red circle seen in input", m_bRedCircleSeen );
+ CPPUNIT_ASSERT_MESSAGE( "green stroke seen in input", m_bGreenStrokeSeen );
+ CPPUNIT_ASSERT_MESSAGE( "dashed line seen in input", m_bDashedLineSeen );
+ CPPUNIT_ASSERT_MESSAGE( "image seen in input", m_bImageSeen );
+ }
+
+ private:
+ GraphicsContext& getCurrentContext() { return m_aGCStack.back(); }
+
+ // ContentSink interface implementation
+ virtual void setPageNum( sal_Int32 nNumPages ) override
+ {
+ m_nNumPages = nNumPages;
+ }
+
+ virtual void startPage( const geometry::RealSize2D& rSize ) override
+ {
+ m_aPageSize = rSize;
+ }
+
+ virtual void endPage() override
+ {
+ m_bPageEnded = true;
+ }
+
+ virtual void hyperLink( const geometry::RealRectangle2D& rBounds,
+ const OUString& rURI ) override
+ {
+ m_aHyperlinkBounds = rBounds;
+ m_aURI = rURI;
+ }
+
+ virtual void pushState() override
+ {
+ GraphicsContextStack::value_type const a(m_aGCStack.back());
+ m_aGCStack.push_back(a);
+ }
+
+ virtual void popState() override
+ {
+ m_aGCStack.pop_back();
+ }
+
+ virtual void setTransformation( const geometry::AffineMatrix2D& rMatrix ) override
+ {
+ basegfx::unotools::homMatrixFromAffineMatrix(
+ getCurrentContext().Transformation,
+ rMatrix );
+ }
+
+ virtual void setLineDash( const uno::Sequence<double>& dashes,
+ double start ) override
+ {
+ GraphicsContext& rContext( getCurrentContext() );
+ if( dashes.hasElements() )
+ comphelper::sequenceToContainer(rContext.DashArray,dashes);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "line dashing start offset", 0.0, start, 0.000000001 );
+ }
+
+ virtual void setFlatness( double nFlatness ) override
+ {
+ getCurrentContext().Flatness = nFlatness;
+ }
+
+ virtual void setLineJoin(sal_Int8 nJoin) override
+ {
+ getCurrentContext().LineJoin = nJoin;
+ }
+
+ virtual void setLineCap(sal_Int8 nCap) override
+ {
+ getCurrentContext().LineCap = nCap;
+ }
+
+ virtual void setMiterLimit(double nVal) override
+ {
+ getCurrentContext().MiterLimit = nVal;
+ }
+
+ virtual void setLineWidth(double nVal) override
+ {
+ getCurrentContext().LineWidth = nVal;
+ }
+
+ virtual void setFillColor( const rendering::ARGBColor& rColor ) override
+ {
+ getCurrentContext().FillColor = rColor;
+ }
+
+ virtual void setStrokeColor( const rendering::ARGBColor& rColor ) override
+ {
+ getCurrentContext().LineColor = rColor;
+ }
+
+ virtual void setFont( const FontAttributes& rFont ) override
+ {
+ FontToIdMap::const_iterator it = m_aFontToId.find( rFont );
+ if( it != m_aFontToId.end() )
+ getCurrentContext().FontId = it->second;
+ else
+ {
+ m_aFontToId[ rFont ] = m_nNextFontId;
+ m_aIdToFont[ m_nNextFontId ] = rFont;
+ getCurrentContext().FontId = m_nNextFontId;
+ m_nNextFontId++;
+ }
+ }
+
+ virtual void strokePath( const uno::Reference<rendering::XPolyPolygon2D>& rPath ) override
+ {
+ GraphicsContext& rContext( getCurrentContext() );
+ basegfx::B2DPolyPolygon aPath = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
+ aPath.transform( rContext.Transformation );
+
+ if( rContext.DashArray.empty() )
+ {
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is green", 1.0, rContext.LineColor.Alpha, 0.00000001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is green", 0.0, rContext.LineColor.Blue, 0.00000001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is green", 1.0, rContext.LineColor.Green, 0.00000001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is green", 0.0, rContext.LineColor.Red, 0.00000001);
+
+ CPPUNIT_ASSERT_MESSAGE( "Line width is 0",
+ rtl::math::approxEqual(rContext.LineWidth, 28.3) );
+
+ static constexpr OUStringLiteral sExportString = u"m53570 7650-35430 24100";
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Stroke is m535.7 518.5-354.3-241",
+ OUString(sExportString), basegfx::utils::exportToSvgD( aPath, true, true, false ) );
+
+ m_bGreenStrokeSeen = true;
+ }
+ else
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Dash array consists of four entries", std::vector<double>::size_type(4), rContext.DashArray.size());
+ CPPUNIT_ASSERT_DOUBLES_EQUAL( 14.3764, rContext.DashArray[0], 1E-12 );
+ CPPUNIT_ASSERT_DOUBLES_EQUAL( rContext.DashArray[0], rContext.DashArray[1], 1E-12 );
+ CPPUNIT_ASSERT_DOUBLES_EQUAL( rContext.DashArray[1], rContext.DashArray[2], 1E-12 );
+ CPPUNIT_ASSERT_DOUBLES_EQUAL( rContext.DashArray[2], rContext.DashArray[3], 1E-12 );
+
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", 1.0, rContext.LineColor.Alpha, 0.00000001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", 0.0, rContext.LineColor.Blue, 0.00000001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", 0.0, rContext.LineColor.Green, 0.00000001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", 0.0, rContext.LineColor.Red, 0.00000001);
+
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line width is 0",
+ 0, rContext.LineWidth, 0.0000001 );
+
+ static constexpr OUStringLiteral sExportString = u"m49890 5670.00000000001-35430 24090";
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Stroke is m49890 5670.00000000001-35430 24090",
+ OUString(sExportString), basegfx::utils::exportToSvgD( aPath, true, true, false ) );
+
+ m_bDashedLineSeen = true;
+ }
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Blend mode is normal",
+ rendering::BlendMode::NORMAL, rContext.BlendMode );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Join type is round",
+ rendering::PathJoinType::ROUND, rContext.LineJoin );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Cap type is butt",
+ rendering::PathCapType::BUTT, rContext.LineCap );
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line miter limit is 10",
+ 10, rContext.MiterLimit, 0.0000001 );
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Flatness is 0",
+ 1, rContext.Flatness, 0.00000001 );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font id is 0",
+ sal_Int32(0), rContext.FontId );
+ }
+
+ virtual void fillPath( const uno::Reference<rendering::XPolyPolygon2D>& rPath ) override
+ {
+ GraphicsContext& rContext( getCurrentContext() );
+ basegfx::B2DPolyPolygon aPath = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
+ aPath.transform( rContext.Transformation );
+
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", 1.0, rContext.LineColor.Alpha, 0.00000001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", 0.0, rContext.LineColor.Blue, 0.00000001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", 0.0, rContext.LineColor.Green, 0.00000001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", 0.0, rContext.LineColor.Red, 0.00000001);
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Blend mode is normal",
+ rendering::BlendMode::NORMAL, rContext.BlendMode );
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Flatness is 10",
+ 10, rContext.Flatness, 0.00000001 );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font id is 0",
+ sal_Int32(0), rContext.FontId );
+ }
+
+ virtual void eoFillPath( const uno::Reference<rendering::XPolyPolygon2D>& rPath ) override
+ {
+ GraphicsContext& rContext( getCurrentContext() );
+ basegfx::B2DPolyPolygon aPath = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
+ aPath.transform( rContext.Transformation );
+
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", 1.0, rContext.LineColor.Alpha, 0.00000001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", 0.0, rContext.LineColor.Blue, 0.00000001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", 0.0, rContext.LineColor.Green, 0.00000001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", 0.0, rContext.LineColor.Red, 0.00000001);
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Blend mode is normal",
+ rendering::BlendMode::NORMAL, rContext.BlendMode );
+ CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Flatness is 0",
+ 1, rContext.Flatness, 0.00000001 );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font id is 0",
+ sal_Int32(0), rContext.FontId );
+
+ static constexpr OUStringLiteral sExportString
+ = u"m12050 49610c-4310 0-7800-3490-7800-7800 0-4300 "
+ "3490-7790 7800-7790 4300 0 7790 3490 7790 7790 0 4310-3490 7800-7790 7800z";
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "Stroke is a 4-bezier circle",
+ OUString(sExportString), basegfx::utils::exportToSvgD( aPath, true, true, false ) );
+
+ m_bRedCircleSeen = true;
+ }
+
+ virtual void intersectClip(const uno::Reference<rendering::XPolyPolygon2D>& rPath) override
+ {
+ basegfx::B2DPolyPolygon aNewClip = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
+ basegfx::B2DPolyPolygon aCurClip = getCurrentContext().Clip;
+
+ if( aCurClip.count() ) // #i92985# adapted API from (..., false, false) to (..., true, false)
+ aNewClip = basegfx::utils::clipPolyPolygonOnPolyPolygon( aCurClip, aNewClip, true, false );
+
+ getCurrentContext().Clip = aNewClip;
+ }
+
+ virtual void intersectEoClip(const uno::Reference<rendering::XPolyPolygon2D>& rPath) override
+ {
+ basegfx::B2DPolyPolygon aNewClip = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
+ basegfx::B2DPolyPolygon aCurClip = getCurrentContext().Clip;
+
+ if( aCurClip.count() ) // #i92985# adapted API from (..., false, false) to (..., true, false)
+ aNewClip = basegfx::utils::clipPolyPolygonOnPolyPolygon( aCurClip, aNewClip, true, false );
+
+ getCurrentContext().Clip = aNewClip;
+ }
+
+ virtual void drawGlyphs( const OUString& rGlyphs,
+ const geometry::RealRectangle2D& /*rRect*/,
+ const geometry::Matrix2D& /*rFontMatrix*/,
+ double /*fontSize*/) override
+ {
+ m_aTextOut.append(rGlyphs);
+ }
+
+ virtual void endText() override
+ {
+ m_aTextOut.append( "\n" );
+ }
+
+ virtual void drawMask(const uno::Sequence<beans::PropertyValue>& xBitmap,
+ bool /*bInvert*/ ) override
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawMask received two properties",
+ sal_Int32(3), xBitmap.getLength() );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawMask got URL param",
+ OUString("URL"), xBitmap[0].Name );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawMask got InputStream param",
+ OUString("InputStream"), xBitmap[1].Name );
+ }
+
+ virtual void drawImage(const uno::Sequence<beans::PropertyValue>& xBitmap ) override
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawImage received two properties",
+ sal_Int32(3), xBitmap.getLength() );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawImage got URL param",
+ OUString("URL"), xBitmap[0].Name );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawImage got InputStream param",
+ OUString("InputStream"), xBitmap[1].Name );
+ m_bImageSeen = true;
+ }
+
+ virtual void drawColorMaskedImage(const uno::Sequence<beans::PropertyValue>& xBitmap,
+ const uno::Sequence<uno::Any>& /*xMaskColors*/ ) override
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawColorMaskedImage received two properties",
+ sal_Int32(3), xBitmap.getLength() );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawColorMaskedImage got URL param",
+ OUString("URL"), xBitmap[0].Name );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawColorMaskedImage got InputStream param",
+ OUString("InputStream"), xBitmap[1].Name );
+ }
+
+ virtual void drawMaskedImage(const uno::Sequence<beans::PropertyValue>& xBitmap,
+ const uno::Sequence<beans::PropertyValue>& xMask,
+ bool /*bInvertMask*/) override
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawMaskedImage received two properties #1",
+ sal_Int32(3), xBitmap.getLength() );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawMaskedImage got URL param #1",
+ OUString("URL"), xBitmap[0].Name );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawMaskedImage got InputStream param #1",
+ OUString("InputStream"), xBitmap[1].Name );
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawMaskedImage received two properties #2",
+ sal_Int32(3), xMask.getLength() );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawMaskedImage got URL param #2",
+ OUString("URL"), xMask[0].Name );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawMaskedImage got InputStream param #2",
+ OUString("InputStream"), xMask[1].Name );
+ }
+
+ virtual void drawAlphaMaskedImage(const uno::Sequence<beans::PropertyValue>& xBitmap,
+ const uno::Sequence<beans::PropertyValue>& xMask) override
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawAlphaMaskedImage received two properties #1",
+ sal_Int32(3), xBitmap.getLength() );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawAlphaMaskedImage got URL param #1",
+ OUString("URL"), xBitmap[0].Name );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawAlphaMaskedImage got InputStream param #1",
+ OUString("InputStream"), xBitmap[1].Name );
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawAlphaMaskedImage received two properties #2",
+ sal_Int32(3), xMask.getLength() );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawAlphaMaskedImage got URL param #2",
+ OUString("URL"), xMask[0].Name );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawAlphaMaskedImage got InputStream param #2",
+ OUString("InputStream"), xMask[1].Name );
+ }
+
+ virtual void setTextRenderMode( sal_Int32 ) override
+ {
+ }
+
+ typedef std::unordered_map<sal_Int32,FontAttributes> IdToFontMap;
+ typedef std::unordered_map<FontAttributes,sal_Int32,FontAttrHash> FontToIdMap;
+
+ typedef std::vector<GraphicsContext> GraphicsContextStack;
+
+ sal_Int32 m_nNextFontId;
+ IdToFontMap m_aIdToFont;
+ FontToIdMap m_aFontToId;
+
+ GraphicsContextStack m_aGCStack;
+ geometry::RealSize2D m_aPageSize;
+ geometry::RealRectangle2D m_aHyperlinkBounds;
+ OUString m_aURI;
+ OUStringBuffer m_aTextOut;
+ sal_Int32 m_nNumPages;
+ bool m_bPageEnded;
+ bool m_bRedCircleSeen;
+ bool m_bGreenStrokeSeen;
+ bool m_bDashedLineSeen;
+ bool m_bImageSeen;
+ };
+
+ class PDFITest : public test::BootstrapFixture, public XmlTestTools
+ {
+ protected:
+ virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override
+ {
+ XmlTestTools::registerODFNamespaces(pXmlXPathCtx);
+ };
+ public:
+ void testXPDFParser()
+ {
+#if HAVE_FEATURE_POPPLER
+ auto pSink = std::make_shared<TestSink>();
+ CPPUNIT_ASSERT(
+ pdfi::xpdf_ImportFromFile(
+ m_directories.getURLFromSrc(u"/sdext/source/pdfimport/test/testinput.pdf"),
+ pSink,
+ uno::Reference< task::XInteractionHandler >(),
+ OUString(),
+ getComponentContext(), "" ) );
+ pSink->check();
+#endif
+ }
+
+ void testOdfDrawExport()
+ {
+#if HAVE_FEATURE_POPPLER
+ rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor( new pdfi::PDFIRawAdaptor(OUString(), getComponentContext()) );
+ xAdaptor->setTreeVisitorFactory( createDrawTreeVisitorFactory() );
+
+ OUString tempFileURL;
+ CPPUNIT_ASSERT_EQUAL( osl::File::E_None, osl::File::createTempFile( nullptr, nullptr, &tempFileURL ) );
+ osl::File::remove( tempFileURL ); // FIXME the below apparently fails silently if the file already exists
+ CPPUNIT_ASSERT_MESSAGE("Exporting to ODF",
+ xAdaptor->odfConvert( m_directories.getURLFromSrc(u"/sdext/source/pdfimport/test/testinput.pdf"),
+ new OutputWrap(tempFileURL),
+ nullptr ));
+ osl::File::remove( tempFileURL );
+#endif
+ }
+
+ void testOdfWriterExport()
+ {
+#if HAVE_FEATURE_POPPLER
+ rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor( new pdfi::PDFIRawAdaptor(OUString(), getComponentContext()) );
+ xAdaptor->setTreeVisitorFactory( createWriterTreeVisitorFactory() );
+
+ OUString tempFileURL;
+ CPPUNIT_ASSERT_EQUAL( osl::File::E_None, osl::File::createTempFile( nullptr, nullptr, &tempFileURL ) );
+ osl::File::remove( tempFileURL ); // FIXME the below apparently fails silently if the file already exists
+ CPPUNIT_ASSERT_MESSAGE("Exporting to ODF",
+ xAdaptor->odfConvert( m_directories.getURLFromSrc(u"/sdext/source/pdfimport/test/testinput.pdf"),
+ new OutputWrap(tempFileURL),
+ nullptr ));
+ osl::File::remove( tempFileURL );
+#endif
+ }
+
+ void testTdf96993()
+ {
+#if HAVE_FEATURE_POPPLER
+ rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor(new pdfi::PDFIRawAdaptor(OUString(), getComponentContext()));
+ xAdaptor->setTreeVisitorFactory(createDrawTreeVisitorFactory());
+
+ OString aOutput;
+ CPPUNIT_ASSERT_MESSAGE("Exporting to ODF",
+ xAdaptor->odfConvert(m_directories.getURLFromSrc(u"/sdext/source/pdfimport/test/testTdf96993.pdf"),
+ new OutputWrapString(aOutput),
+ nullptr));
+ // This ensures that the imported image arrives properly flipped
+ CPPUNIT_ASSERT(aOutput.indexOf("draw:transform=\"matrix(18520.8333333333 0 0 26281.9444444444 0 0)\"") != -1);
+#endif
+ }
+
+ void testTdf98421()
+ {
+#if HAVE_FEATURE_POPPLER
+ rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor(new pdfi::PDFIRawAdaptor(OUString(), getComponentContext()));
+ xAdaptor->setTreeVisitorFactory(createWriterTreeVisitorFactory());
+
+ OString aOutput;
+ CPPUNIT_ASSERT_MESSAGE("Exporting to ODF",
+ xAdaptor->odfConvert(m_directories.getURLFromSrc(u"/sdext/source/pdfimport/test/testTdf96993.pdf"),
+ new OutputWrapString(aOutput),
+ nullptr));
+ // This ensures that the imported image arrives properly flipped
+ CPPUNIT_ASSERT(aOutput.indexOf("draw:transform=\"scale( 1.0 -1.0 ) translate( 0mm 0mm )\"") != -1);
+ CPPUNIT_ASSERT(aOutput.indexOf("svg:height=\"-262.82mm\"") != -1);
+#endif
+ }
+
+ void testTdf105536()
+ {
+#if HAVE_FEATURE_POPPLER
+ rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor(new pdfi::PDFIRawAdaptor(OUString(), getComponentContext()));
+ xAdaptor->setTreeVisitorFactory(createDrawTreeVisitorFactory());
+
+ OString aOutput;
+ CPPUNIT_ASSERT_MESSAGE("Exporting to ODF",
+ xAdaptor->odfConvert(m_directories.getURLFromSrc(u"/sdext/source/pdfimport/test/testTdf105536.pdf"),
+ new OutputWrapString(aOutput),
+ nullptr));
+ // This ensures that the imported image arrives properly flipped
+ CPPUNIT_ASSERT(aOutput.indexOf("draw:transform=\"matrix(-21488.4 0 0 -27978.1 21488.4 27978.1)\"") != -1);
+#endif
+ }
+
+ void testTdf141709()
+ {
+// this test crashes on the windows jenkins boxes, but no-one can catch it locally
+#if HAVE_FEATURE_POPPLER && !defined(_WIN32)
+ rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor(new pdfi::PDFIRawAdaptor(OUString(), getComponentContext()));
+ xAdaptor->setTreeVisitorFactory(createDrawTreeVisitorFactory());
+
+ OString aOutput;
+ CPPUNIT_ASSERT_MESSAGE("Exporting to ODF",
+ xAdaptor->odfConvert(m_directories.getURLFromSrc(u"/sdext/source/pdfimport/test/testTdf141709.pdf"),
+ new OutputWrapString(aOutput),
+ nullptr));
+ std::cout << aOutput << std::endl;
+ // This ensures that the imported text contains all of the characters
+ CPPUNIT_ASSERT(aOutput.indexOf("æ•") != -1);
+ CPPUNIT_ASSERT(aOutput.indexOf("æ·") != -1);
+ CPPUNIT_ASSERT(aOutput.indexOf("çš„") != -1);
+ CPPUNIT_ASSERT(aOutput.indexOf("ç‹") != -1);
+ CPPUNIT_ASSERT(aOutput.indexOf("狸") != -1);
+ CPPUNIT_ASSERT(aOutput.indexOf("è·¨") != -1);
+ CPPUNIT_ASSERT(aOutput.indexOf("过") != -1);
+ CPPUNIT_ASSERT(aOutput.indexOf("æ…µ") != -1);
+ CPPUNIT_ASSERT(aOutput.indexOf("懒") != -1);
+ CPPUNIT_ASSERT(aOutput.indexOf("çš„") != -1);
+ CPPUNIT_ASSERT(aOutput.indexOf("ç‹—") != -1);
+ CPPUNIT_ASSERT(aOutput.indexOf("。") != -1);
+#endif
+ }
+
+ void testTdf78427_FontFeatures()
+ {
+ rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor(new pdfi::PDFIRawAdaptor(OUString(), getComponentContext()));
+ xAdaptor->setTreeVisitorFactory(createDrawTreeVisitorFactory());
+
+ OString aOutput;
+ CPPUNIT_ASSERT_MESSAGE("Converting PDF to ODF XML",
+ xAdaptor->odfConvert( m_directories.getURLFromSrc(
+ u"/sdext/source/pdfimport/test/testdocs/tdf78427-testFontFeatures.pdf"),
+ new OutputWrapString(aOutput),
+ nullptr ));
+ // Un-comment the following debug line to see the content of generated XML content in
+ // workdir/CppunitTest/sdext_pdfimport.test.log after running "make CppunitTest_sdext_pdfimport".
+ //std::cout << aOutput << std::endl;
+ xmlDocUniquePtr pXmlDoc(xmlParseDoc(reinterpret_cast<xmlChar const *>(aOutput.getStr())));
+ //CPPUNIT_ASSERT(pXmlDoc);
+
+ /* Test for the 1st paragraph */
+ OUString styleName = getXPath(pXmlDoc, "//draw:frame[1]//text:span[1]", "style-name");
+ OString xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ // the font-weight and font-style should be normal
+ assertXPath(pXmlDoc, xpath, "font-weight", "normal");
+ assertXPathNoAttribute(pXmlDoc, xpath, "font-style");
+
+ /* Test for the 2nd paragraph */
+ styleName = getXPath(pXmlDoc, "//draw:frame[2]//text:span[1]", "style-name");
+ xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ // there should be a font-weight="bold", but no font-style italic
+ assertXPath(pXmlDoc, xpath, "font-weight", "bold");
+ assertXPathNoAttribute(pXmlDoc, xpath, "font-style");
+
+ /* Test for the 3rd paragraph */
+ styleName = getXPath(pXmlDoc, "//draw:frame[3]//text:span[1]", "style-name");
+ xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ // there should be a font-style="italic", but no font-weight bold
+ assertXPath(pXmlDoc, xpath, "font-weight", "normal");
+ assertXPath(pXmlDoc, xpath, "font-style", "italic");
+
+ /* Test for the 4th paragraph */
+ styleName = getXPath(pXmlDoc, "//draw:frame[4]//text:span[1]", "style-name");
+ xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ // there should be both font-style="italic" and font-weight="bold"
+ assertXPath(pXmlDoc, xpath, "font-weight", "bold");
+ assertXPath(pXmlDoc, xpath, "font-style", "italic");
+
+ /* Test for the 5th paragraph */
+ styleName = getXPath(pXmlDoc, "//draw:frame[5]//text:span[1]", "style-name");
+ xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ // the font should be Arial and font-weight="bold", no font-style
+ assertXPath(pXmlDoc, xpath, "font-family", "Arial");
+ assertXPath(pXmlDoc, xpath, "font-weight", "bold");
+ assertXPathNoAttribute(pXmlDoc, xpath, "font-style");
+
+ /* Test for the 6th paragraph */
+ styleName = getXPath(pXmlDoc, "//draw:frame[6]//text:span[1]", "style-name");
+ xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ // the font should be Arial without font-weight and font-style
+ assertXPath(pXmlDoc, xpath, "font-family", "Arial");
+ assertXPath(pXmlDoc, xpath, "font-weight", "normal");
+ assertXPathNoAttribute(pXmlDoc, xpath, "font-style");
+
+ /* Test for the 7th paragraph */
+ styleName = getXPath(pXmlDoc, "//draw:frame[7]//text:span[1]", "style-name");
+ xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ // the font should be SimSun without font-weight and font-style
+ assertXPath(pXmlDoc, xpath, "font-family", "SimSun"); // TODO: tdf#143095 use localized font name rather than PS name
+ assertXPath(pXmlDoc, xpath, "font-weight", "normal");
+ assertXPathNoAttribute(pXmlDoc, xpath, "font-style");
+
+ /* Test for the 8th paragraph */
+ styleName = getXPath(pXmlDoc, "//draw:frame[8]//text:span[1]", "style-name");
+ xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ // the font should be SimSun and font-weight="bold", no font-style italic
+ assertXPath(pXmlDoc, xpath, "font-family", "SimSun");
+ assertXPath(pXmlDoc, xpath, "font-weight", "bold");
+ assertXPathNoAttribute(pXmlDoc, xpath, "font-style");
+
+ /* Test for the 9th paragraph */
+ styleName = getXPath(pXmlDoc, "//draw:frame[9]//text:span[1]", "style-name");
+ xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ // the font should be SimSun, font-weight should be "normal", font-style="italic"
+ assertXPath(pXmlDoc, xpath, "font-family", "SimSun");
+ assertXPath(pXmlDoc, xpath, "font-weight", "normal");
+ // FIXME and remove the below comment:
+ // the chinese chars are shown in pdf as faux italic (fake italic). It is currencly imported wrongly as normal font style.
+ // See tdf#78427 for how the faux bold problem was handled. Faux italic may be handled using the transformation pattern.
+ // assertXPath(pXmlDoc, xpath, "font-style", "italic");
+
+ /* Test for the 10th paragraph */
+ styleName = getXPath(pXmlDoc, "//draw:frame[10]//text:span[1]", "style-name");
+ xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ // the font should be SimSun font-weight="bold" and font-style="italic"
+ assertXPath(pXmlDoc, xpath, "font-family", "SimSun");
+ assertXPath(pXmlDoc, xpath, "font-weight", "bold");
+ // FIXME: faux italic, see above
+ // assertXPath(pXmlDoc, xpath, "font-style", "italic");
+
+ /* Test for the 11th paragraph */
+ styleName = getXPath(pXmlDoc, "//draw:frame[11]//text:span[1]", "style-name");
+ xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ // the font should be SimSun and there should be style:text-outline="true"
+ // (i.e., the real "outline" font rather than faux bold / fake bold)
+ assertXPath(pXmlDoc, xpath, "font-family", "SimSun");
+ assertXPath(pXmlDoc, xpath, "font-weight", "normal");
+ assertXPathNoAttribute(pXmlDoc, xpath, "font-style");
+ assertXPath(pXmlDoc, xpath, "text-outline", "true");
+ }
+
+ void testTdf78427_FontWeight_MyraidProSemibold() // Related to attachment 155937.
+ {
+ rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor(new pdfi::PDFIRawAdaptor(OUString(), getComponentContext()));
+ xAdaptor->setTreeVisitorFactory(createDrawTreeVisitorFactory());
+
+ OString aOutput;
+ CPPUNIT_ASSERT_MESSAGE("Converting PDF to ODF XML",
+ xAdaptor->odfConvert( m_directories.getURLFromSrc(
+ u"/sdext/source/pdfimport/test/testdocs/tdf78427-MyraidPro-Semibold-Light.pdf"),
+ new OutputWrapString(aOutput),
+ nullptr ));
+ //std::cout << aOutput << std::endl;
+
+ xmlDocUniquePtr pXmlDoc(xmlParseDoc(reinterpret_cast<xmlChar const *>(aOutput.getStr())));
+ //CPPUNIT_ASSERT(pXmlDoc);
+
+ // The for the 1st frame */
+ OUString styleName = getXPath(pXmlDoc, "//draw:frame[1]//text:span[1]", "style-name");
+ OString xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ // the font-weight and font-style should be 600 (Semibold)
+ assertXPath(pXmlDoc, xpath, "font-weight", "600");
+
+ // The for the 2nd frame */
+ styleName = getXPath(pXmlDoc, "//draw:frame[2]//text:span[1]", "style-name");
+ xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ // the font-weight and font-style should be 300 (Light)
+ assertXPath(pXmlDoc, xpath, "font-weight", "300");
+ }
+
+ void testTdf143959_nameFromFontFile()
+ {
+ rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor(new pdfi::PDFIRawAdaptor(OUString(), getComponentContext()));
+ xAdaptor->setTreeVisitorFactory(createDrawTreeVisitorFactory());
+
+ OString aOutput;
+ CPPUNIT_ASSERT_MESSAGE("Converting PDF to ODF XML",
+ xAdaptor->odfConvert( m_directories.getURLFromSrc(u"/sdext/source/pdfimport/test/testdocs/testTdf143959.pdf"),
+ new OutputWrapString(aOutput),
+ nullptr ));
+
+ //std::cout << aOutput << std::endl;
+ xmlDocUniquePtr pXmlDoc(xmlParseDoc(reinterpret_cast<xmlChar const *>(aOutput.getStr())));
+
+ /* Test for the 1st text paragraph */
+ OUString styleName = getXPath(pXmlDoc, "//draw:frame[2]//text:span[1]", "style-name");
+ OString xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ CPPUNIT_ASSERT_EQUAL(OUString("TimesNewRoman"),
+ getXPath(pXmlDoc, xpath, "font-family").replaceAll(u" ", u""));
+
+ /* Test for the "TOTAL ESTA HOJA USD" paragraph" */
+ styleName = getXPath(pXmlDoc, "//draw:frame[last()-1]//text:span[1]", "style-name");
+ xpath = "//office:automatic-styles/style:style[@style:name=\"" +
+ OUStringToOString(styleName, RTL_TEXTENCODING_UTF8) +
+ "\"]/style:text-properties";
+ CPPUNIT_ASSERT_EQUAL(OUString("TimesNewRoman"),
+ getXPath(pXmlDoc, xpath, "font-family").replaceAll(u" ", u""));
+ CPPUNIT_ASSERT_EQUAL(OUString("bold"),
+ getXPath(pXmlDoc, xpath, "font-weight"));
+ }
+
+ void testTdf104597_textrun()
+ {
+#if HAVE_FEATURE_POPPLER
+ rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor(new pdfi::PDFIRawAdaptor(OUString(), getComponentContext()));
+ xAdaptor->setTreeVisitorFactory(createDrawTreeVisitorFactory());
+
+ OString aOutput;
+ CPPUNIT_ASSERT_MESSAGE("Converting PDF to ODF XML",
+ xAdaptor->odfConvert(m_directories.getURLFromSrc(u"/sdext/source/pdfimport/test/testdocs/tdf104597_textrun.pdf"),
+ new OutputWrapString(aOutput),
+ nullptr));
+
+ xmlDocUniquePtr pXmlDoc(xmlParseDoc(reinterpret_cast<xmlChar const *>(aOutput.getStr())));
+
+ // Test for ام٠عَلَيْكَ
+ OString xpath = "string(//draw:frame[@draw:transform='matrix(917.222222222222 0 0 917.222222222222 14821.9583333333 2159.23861112778)']/draw:text-box/text:p/text:span)";
+ OUString sContent = getXPathContent(pXmlDoc, xpath);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(aOutput.getStr(), OUString(u"ام٠عَلَيَْك"), sContent.replaceAll("\n\n", " ").replaceAll("\n", ""));
+
+ // Test for ٱلسََّل . It appears in the 3rd frame, i.e. after the ام٠عَلَيَْك which is in the 2nd frame (from left to right)
+ // thus these two frames together appear as ٱلسََّل ام٠عَلَيْكَ in Draw‬.
+ // FIXME: Should be ٱلسَّلَام٠عَلَيْكَ (i.e. the two text frames should be merged into one so that the ل and the ا will show as لَا rather than ل ا)
+ xpath = "string(//draw:frame[@draw:transform='matrix(917.222222222222 0 0 917.222222222222 17420.1666666667 2159.23861112778)']/draw:text-box/text:p/text:span)";
+ sContent = getXPathContent(pXmlDoc, xpath);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(aOutput.getStr(), OUString(u"ٱلسََّل"), sContent.replaceAll("\n\n", " ").replaceAll("\n", ""));
+
+ // Test for "LibreOffice RTL"
+ xpath = "string(//draw:frame[@draw:transform='matrix(917.222222222222 0 0 917.222222222222 12779.375 5121.79583335)']/draw:text-box/text:p/text:span)";
+ sContent = getXPathContent(pXmlDoc, xpath);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(aOutput.getStr(), OUString(u"LibreOffice RTL"), sContent.replaceAll("\n\n", " ").replaceAll("\n", ""));
+
+ // Test for "LibreOffice LTR (test)"
+ xpath = "string(//draw:frame[last()-1]/draw:text-box/text:p/text:span[last()])";
+ sContent = getXPathContent(pXmlDoc, xpath);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(aOutput.getStr(), OUString(u"LibreOffice LTR (test)"), sContent.replaceAll("\n\n", " ").replaceAll("\n", ""));
+
+ /* Test for Chinese characters */
+ // Use last() instead of matrix below, because the matrix may be different on different OS due to fallback of Chinese fonts.
+ xpath = "string(//draw:frame[last()]/draw:text-box/text:p/text:span)";
+ sContent = getXPathContent(pXmlDoc, xpath);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(aOutput.getStr(), OUString(u"中文测试,中文"), sContent.replaceAll("\n\n", " ").replaceAll("\n", ""));
+
+ // Test pdf text run in the Writer PDF import filter
+ xAdaptor->setTreeVisitorFactory(createWriterTreeVisitorFactory());
+ OString aOutput2;
+ xAdaptor->odfConvert(m_directories.getURLFromSrc(u"/sdext/source/pdfimport/test/testdocs/tdf104597_textrun.pdf"),
+ new OutputWrapString(aOutput2),
+ nullptr);
+ xmlDocUniquePtr pXmlDoc2(xmlParseDoc(reinterpret_cast<xmlChar const *>(aOutput2.getStr())));
+ xpath = "string(//draw:frame[@draw:z-index='3'][1]/draw:text-box/text:p/text:span)";
+ sContent = getXPathContent(pXmlDoc2, xpath).replaceAll("\n\n", " ").replaceAll("\n", "");
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(aOutput2.getStr(), OUString(u"ٱلَّسَل"), sContent);
+ xpath = "string(//draw:frame[@draw:z-index='2'][1]/draw:text-box/text:p/text:span)";
+ sContent = getXPathContent(pXmlDoc2, xpath).replaceAll("\n\n", " ").replaceAll("\n", "");
+ CPPUNIT_ASSERT_EQUAL(true, sContent.match(u"اÙÙ… َعَلْيَك"));
+ xpath = "string(//draw:frame[last()]/draw:text-box/text:p/text:span)";
+ sContent = getXPathContent(pXmlDoc2, xpath).replaceAll("\n\n", " ").replaceAll("\n", "");
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(aOutput2.getStr(), OUString(u"中文测试,中文"), sContent);
+#endif
+ }
+
+ void testSpaces()
+ {
+#if HAVE_FEATURE_POPPLER
+ rtl::Reference<pdfi::PDFIRawAdaptor> xAdaptor(new pdfi::PDFIRawAdaptor(OUString(), getComponentContext()));
+ xAdaptor->setTreeVisitorFactory(createWriterTreeVisitorFactory());
+
+ OString aOutput;
+ xAdaptor->odfConvert(m_directories.getURLFromSrc(u"/sdext/source/pdfimport/test/testdocs/testSpace.pdf"),
+ new OutputWrapString(aOutput),
+ nullptr);
+ xmlDocUniquePtr pXmlDoc(xmlParseDoc(reinterpret_cast<xmlChar const *>(aOutput.getStr())));
+
+ // Space test: there are 10 spaces, each space is expressed as a <text:s text:c="1" ...>,
+ // thus the 10th text:s should exist and the attribute "text:c" should be "1".
+ OString xpath = "//draw:frame[@draw:z-index='1'][1]/draw:text-box/text:p/text:span/text:s[10]";
+ OUString sContent = getXPath(pXmlDoc, xpath, "c");
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(aOutput.getStr(), OUString("1"), sContent);
+
+ // Tab test: there are 10 tabs. Text before and after the tabs are shown in different draw frames.
+ // With the Liberation Serif font, the horizontal position of the first frame is 20.03mm and the
+ // second frame is 94.12mm.
+ xpath = "//draw:frame[@draw:z-index='2'][1]";
+ sContent = getXPath(pXmlDoc, xpath, "transform");
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(aOutput.getStr(), OUString("translate( 20.03mm 25.05mm )"), sContent);
+ xpath = "//draw:frame[@draw:z-index='3'][1]";
+ sContent = getXPath(pXmlDoc, xpath, "transform");
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(aOutput.getStr(), OUString("translate( 94.12mm 25.05mm )"), sContent);
+
+ // Non-breaking space test: there are 10 NBSpaces, which are treated as the same as normal space in PDF,
+ // thus each is expressed as a <text:s text:c="1" ...>.
+ // The 10th text:s should exist and the attribute "text:c" should be "1".
+ xpath = "//draw:frame[@draw:z-index='4'][1]/draw:text-box/text:p/text:span/text:s[10]";
+ sContent = getXPath(pXmlDoc, xpath, "c");
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(aOutput.getStr(), OUString("1"), sContent);
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE(PDFITest);
+ CPPUNIT_TEST(testXPDFParser);
+ CPPUNIT_TEST(testOdfWriterExport);
+ CPPUNIT_TEST(testOdfDrawExport);
+ CPPUNIT_TEST(testTdf96993);
+ CPPUNIT_TEST(testTdf98421);
+ CPPUNIT_TEST(testTdf105536);
+ CPPUNIT_TEST(testTdf141709);
+ CPPUNIT_TEST(testTdf78427_FontFeatures);
+ CPPUNIT_TEST(testTdf78427_FontWeight_MyraidProSemibold);
+ CPPUNIT_TEST(testTdf143959_nameFromFontFile);
+ CPPUNIT_TEST(testTdf104597_textrun);
+ CPPUNIT_TEST(testSpaces);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(PDFITest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/tree/drawtreevisiting.cxx b/sdext/source/pdfimport/tree/drawtreevisiting.cxx
new file mode 100644
index 000000000..95e2ce985
--- /dev/null
+++ b/sdext/source/pdfimport/tree/drawtreevisiting.cxx
@@ -0,0 +1,1104 @@
+/* -*- 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/log.hxx>
+#include <pdfiprocessor.hxx>
+#include <xmlemitter.hxx>
+#include <pdfihelper.hxx>
+#include <imagecontainer.hxx>
+#include "style.hxx"
+#include "drawtreevisiting.hxx"
+#include <genericelements.hxx>
+
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
+#include <osl/diagnose.h>
+#include <rtl/math.hxx>
+#include <com/sun/star/i18n/BreakIterator.hpp>
+#include <com/sun/star/i18n/CharacterClassification.hpp>
+#include <com/sun/star/i18n/ScriptType.hpp>
+#include <com/sun/star/i18n/DirectionProperty.hpp>
+#include <comphelper/string.hxx>
+
+#include <string.h>
+#include <string_view>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::i18n;
+using namespace ::com::sun::star::uno;
+
+namespace pdfi
+{
+
+const Reference< XBreakIterator >& DrawXmlOptimizer::GetBreakIterator()
+{
+ if ( !mxBreakIter.is() )
+ {
+ Reference< XComponentContext > xContext( m_rProcessor.m_xContext, uno::UNO_SET_THROW );
+ mxBreakIter = BreakIterator::create(xContext);
+ }
+ return mxBreakIter;
+}
+
+const Reference< XCharacterClassification >& DrawXmlEmitter::GetCharacterClassification()
+{
+ if ( !mxCharClass.is() )
+ {
+ Reference< XComponentContext > xContext( m_rEmitContext.m_xContext, uno::UNO_SET_THROW );
+ mxCharClass = CharacterClassification::create(xContext);
+ }
+ return mxCharClass;
+}
+
+void DrawXmlEmitter::visit( HyperlinkElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ if( elem.Children.empty() )
+ return;
+
+ const char* pType = dynamic_cast<DrawElement*>(elem.Children.front().get()) ? "draw:a" : "text:a";
+
+ PropertyMap aProps;
+ aProps[ "xlink:type" ] = "simple";
+ aProps[ "xlink:href" ] = elem.URI;
+ aProps[ "office:target-frame-name" ] = "_blank";
+ aProps[ "xlink:show" ] = "new";
+
+ m_rEmitContext.rEmitter.beginTag( pType, aProps );
+ auto this_it = elem.Children.begin();
+ while( this_it != elem.Children.end() && this_it->get() != &elem )
+ {
+ (*this_it)->visitedBy( *this, this_it );
+ ++this_it;
+ }
+ m_rEmitContext.rEmitter.endTag( pType );
+}
+
+void DrawXmlEmitter::visit( TextElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ if( elem.Text.isEmpty() )
+ return;
+
+ OUString strSpace(u' ');
+ OUString strNbSpace(u'\x00A0');
+ OUString tabSpace(u'\x0009');
+ PropertyMap aProps;
+ if( elem.StyleId != -1 )
+ {
+ aProps[ OUString( "text:style-name" ) ] =
+ m_rEmitContext.rStyles.getStyleName( elem.StyleId );
+ }
+
+ OUString str(elem.Text.toString());
+
+ // Check for RTL
+ bool isRTL = false;
+ Reference< i18n::XCharacterClassification > xCC( GetCharacterClassification() );
+ if( xCC.is() )
+ {
+ for(int i=1; i< elem.Text.getLength(); i++)
+ {
+ css::i18n::DirectionProperty nType = static_cast<css::i18n::DirectionProperty>(xCC->getCharacterDirection( str, i ));
+ if ( nType == css::i18n::DirectionProperty_RIGHT_TO_LEFT ||
+ nType == css::i18n::DirectionProperty_RIGHT_TO_LEFT_ARABIC ||
+ nType == css::i18n::DirectionProperty_RIGHT_TO_LEFT_EMBEDDING ||
+ nType == css::i18n::DirectionProperty_RIGHT_TO_LEFT_OVERRIDE
+ )
+ isRTL = true;
+ }
+ }
+
+ if (isRTL) // If so, reverse string
+ {
+ // First, produce mirrored-image for each code point which has the Bidi_Mirrored property.
+ str = PDFIProcessor::SubstituteBidiMirrored(str);
+ // Then, reverse the code points in the string, in backward order.
+ str = ::comphelper::string::reverseCodePoints(str);
+ }
+
+ m_rEmitContext.rEmitter.beginTag( "text:span", aProps );
+
+ aProps = {};
+ for(int i=0; i< elem.Text.getLength(); i++)
+ {
+ OUString strToken= str.copy(i,1) ;
+ if( strSpace == strToken || strNbSpace == strToken )
+ {
+ aProps[ "text:c" ] = "1";
+ m_rEmitContext.rEmitter.beginTag( "text:s", aProps );
+ m_rEmitContext.rEmitter.endTag( "text:s");
+ }
+ else
+ {
+ if( tabSpace == strToken )
+ {
+ m_rEmitContext.rEmitter.beginTag( "text:tab", aProps );
+ m_rEmitContext.rEmitter.endTag( "text:tab");
+ }
+ else
+ {
+ m_rEmitContext.rEmitter.write( strToken );
+ }
+ }
+ }
+
+ auto this_it = elem.Children.begin();
+ while( this_it != elem.Children.end() && this_it->get() != &elem )
+ {
+ (*this_it)->visitedBy( *this, this_it );
+ ++this_it;
+ }
+
+ m_rEmitContext.rEmitter.endTag( "text:span" );
+}
+
+void DrawXmlEmitter::visit( ParagraphElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ PropertyMap aProps;
+ if( elem.StyleId != -1 )
+ {
+ aProps[ "text:style-name" ] = m_rEmitContext.rStyles.getStyleName( elem.StyleId );
+ }
+ const char* pTagType = "text:p";
+ if( elem.Type == ParagraphElement::Headline )
+ pTagType = "text:h";
+ m_rEmitContext.rEmitter.beginTag( pTagType, aProps );
+
+ auto this_it = elem.Children.begin();
+ while( this_it != elem.Children.end() && this_it->get() != &elem )
+ {
+ (*this_it)->visitedBy( *this, this_it );
+ ++this_it;
+ }
+
+ m_rEmitContext.rEmitter.endTag( pTagType );
+}
+
+void DrawXmlEmitter::fillFrameProps( DrawElement& rElem,
+ PropertyMap& rProps,
+ const EmitContext& rEmitContext,
+ bool bWasTransformed
+ )
+{
+ rProps[ "draw:z-index" ] = OUString::number( rElem.ZOrder );
+ rProps[ "draw:style-name"] = rEmitContext.rStyles.getStyleName( rElem.StyleId );
+
+ if (rElem.IsForText)
+ rProps["draw:text-style-name"] = rEmitContext.rStyles.getStyleName(rElem.TextStyleId);
+
+ const GraphicsContext& rGC =
+ rEmitContext.rProcessor.getGraphicsContext( rElem.GCId );
+
+ if (bWasTransformed)
+ {
+ rProps[ "svg:x" ] = convertPixelToUnitString(rElem.x);
+ rProps[ "svg:y" ] = convertPixelToUnitString(rElem.y);
+ rProps[ "svg:width" ] = convertPixelToUnitString(rElem.w);
+ rProps[ "svg:height" ] = convertPixelToUnitString(rElem.h);
+ }
+ else
+ {
+ OUStringBuffer aBuf(256);
+
+ basegfx::B2DHomMatrix mat(rGC.Transformation);
+
+ if (rElem.MirrorVertical)
+ {
+ basegfx::B2DHomMatrix mat2;
+ mat2.translate(0, -0.5);
+ mat2.scale(1, -1);
+ mat2.translate(0, 0.5);
+ mat = mat * mat2;
+ }
+
+ double scale = convPx2mm(100);
+ mat.scale(scale, scale);
+
+ aBuf.append("matrix(");
+ aBuf.append(mat.get(0, 0));
+ aBuf.append(' ');
+ aBuf.append(mat.get(1, 0));
+ aBuf.append(' ');
+ aBuf.append(mat.get(0, 1));
+ aBuf.append(' ');
+ aBuf.append(mat.get(1, 1));
+ aBuf.append(' ');
+ aBuf.append(mat.get(0, 2));
+ aBuf.append(' ');
+ aBuf.append(mat.get(1, 2));
+ aBuf.append(")");
+
+ rProps["draw:transform"] = aBuf.makeStringAndClear();
+ }
+}
+
+void DrawXmlEmitter::visit( FrameElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ if( elem.Children.empty() )
+ return;
+
+ bool bTextBox = (dynamic_cast<ParagraphElement*>(elem.Children.front().get()) != nullptr);
+ PropertyMap aFrameProps;
+ fillFrameProps( elem, aFrameProps, m_rEmitContext, false );
+ m_rEmitContext.rEmitter.beginTag( "draw:frame", aFrameProps );
+ if( bTextBox )
+ m_rEmitContext.rEmitter.beginTag( "draw:text-box", PropertyMap() );
+
+ auto this_it = elem.Children.begin();
+ while( this_it != elem.Children.end() && this_it->get() != &elem )
+ {
+ (*this_it)->visitedBy( *this, this_it );
+ ++this_it;
+ }
+
+ if( bTextBox )
+ m_rEmitContext.rEmitter.endTag( "draw:text-box" );
+ m_rEmitContext.rEmitter.endTag( "draw:frame" );
+}
+
+void DrawXmlEmitter::visit( PolyPolyElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ elem.updateGeometry();
+ /* note:
+ * aw recommends using 100dth of mm in all respects since the xml import
+ * (a) is buggy (see issue 37213)
+ * (b) is optimized for 100dth of mm and does not scale itself then,
+ * this does not gain us speed but makes for smaller rounding errors since
+ * the xml importer coordinates are integer based
+ */
+ for (sal_uInt32 i = 0; i< elem.PolyPoly.count(); i++)
+ {
+ basegfx::B2DPolygon b2dPolygon = elem.PolyPoly.getB2DPolygon( i );
+
+ for ( sal_uInt32 j = 0; j< b2dPolygon.count(); j++ )
+ {
+ basegfx::B2DPoint point;
+ basegfx::B2DPoint nextPoint;
+ point = b2dPolygon.getB2DPoint( j );
+
+ basegfx::B2DPoint prevPoint = b2dPolygon.getPrevControlPoint( j ) ;
+
+ point.setX( convPx2mmPrec2( point.getX() )*100.0 );
+ point.setY( convPx2mmPrec2( point.getY() )*100.0 );
+
+ if ( b2dPolygon.isPrevControlPointUsed( j ) )
+ {
+ prevPoint.setX( convPx2mmPrec2( prevPoint.getX() )*100.0 );
+ prevPoint.setY( convPx2mmPrec2( prevPoint.getY() )*100.0 );
+ }
+
+ if ( b2dPolygon.isNextControlPointUsed( j ) )
+ {
+ nextPoint = b2dPolygon.getNextControlPoint( j ) ;
+ nextPoint.setX( convPx2mmPrec2( nextPoint.getX() )*100.0 );
+ nextPoint.setY( convPx2mmPrec2( nextPoint.getY() )*100.0 );
+ }
+
+ b2dPolygon.setB2DPoint( j, point );
+
+ if ( b2dPolygon.isPrevControlPointUsed( j ) )
+ b2dPolygon.setPrevControlPoint( j , prevPoint ) ;
+
+ if ( b2dPolygon.isNextControlPointUsed( j ) )
+ b2dPolygon.setNextControlPoint( j , nextPoint ) ;
+ }
+
+ elem.PolyPoly.setB2DPolygon( i, b2dPolygon );
+ }
+
+ PropertyMap aProps;
+ // PDFIProcessor transforms geometrical objects, not images and text
+ // so we need to tell fillFrameProps here that the transformation for
+ // a PolyPolyElement was already applied (aside from translation)
+ fillFrameProps( elem, aProps, m_rEmitContext, true );
+ OUStringBuffer aBuf( 64 );
+ aBuf.append( "0 0 " );
+ aBuf.append( convPx2mmPrec2(elem.w)*100.0 );
+ aBuf.append( ' ' );
+ aBuf.append( convPx2mmPrec2(elem.h)*100.0 );
+ aProps[ "svg:viewBox" ] = aBuf.makeStringAndClear();
+ aProps[ "svg:d" ] = basegfx::utils::exportToSvgD( elem.PolyPoly, false, true, false );
+
+ m_rEmitContext.rEmitter.beginTag( "draw:path", aProps );
+ m_rEmitContext.rEmitter.endTag( "draw:path" );
+}
+
+void DrawXmlEmitter::visit( ImageElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ PropertyMap aImageProps;
+ m_rEmitContext.rEmitter.beginTag( "draw:image", aImageProps );
+ m_rEmitContext.rEmitter.beginTag( "office:binary-data", PropertyMap() );
+ m_rEmitContext.rImages.writeBase64EncodedStream( elem.Image, m_rEmitContext);
+ m_rEmitContext.rEmitter.endTag( "office:binary-data" );
+ m_rEmitContext.rEmitter.endTag( "draw:image" );
+}
+
+void DrawXmlEmitter::visit( PageElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ PropertyMap aPageProps;
+ aPageProps[ "draw:master-page-name" ] = m_rEmitContext.rStyles.getStyleName( elem.StyleId );
+
+ m_rEmitContext.rEmitter.beginTag("draw:page", aPageProps);
+
+ if( m_rEmitContext.xStatusIndicator.is() )
+ m_rEmitContext.xStatusIndicator->setValue( elem.PageNumber );
+
+ auto this_it = elem.Children.begin();
+ while( this_it != elem.Children.end() && this_it->get() != &elem )
+ {
+ (*this_it)->visitedBy( *this, this_it );
+ ++this_it;
+ }
+
+ m_rEmitContext.rEmitter.endTag("draw:page");
+}
+
+void DrawXmlEmitter::visit( DocumentElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator&)
+{
+ m_rEmitContext.rEmitter.beginTag( "office:body", PropertyMap() );
+ m_rEmitContext.rEmitter.beginTag( m_bWriteDrawDocument ? "office:drawing" : "office:presentation",
+ PropertyMap() );
+
+ auto this_it = elem.Children.begin();
+ while( this_it != elem.Children.end() && this_it->get() != &elem )
+ {
+ (*this_it)->visitedBy( *this, this_it );
+ ++this_it;
+ }
+
+ m_rEmitContext.rEmitter.endTag( m_bWriteDrawDocument ? "office:drawing" : "office:presentation" );
+ m_rEmitContext.rEmitter.endTag( "office:body" );
+}
+
+
+void DrawXmlOptimizer::visit( HyperlinkElement&, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+}
+
+void DrawXmlOptimizer::visit( TextElement&, const std::list< std::unique_ptr<Element> >::const_iterator&)
+{
+}
+
+void DrawXmlOptimizer::visit( FrameElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ elem.applyToChildren(*this);
+}
+
+void DrawXmlOptimizer::visit( ImageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+}
+
+void DrawXmlOptimizer::visit( PolyPolyElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& elemIt )
+{
+ /* note: optimize two consecutive PolyPolyElements that
+ * have the same path but one of which is a stroke while
+ * the other is a fill
+ */
+ if( !elem.Parent )
+ return;
+
+ // find following PolyPolyElement in parent's children list
+ if( elemIt == elem.Parent->Children.end() )
+ return;
+ auto next_it = elemIt;
+ ++next_it;
+ if( next_it == elem.Parent->Children.end() )
+ return;
+
+ PolyPolyElement* pNext = dynamic_cast<PolyPolyElement*>(next_it->get());
+ // TODO(F2): this comparison fails for OOo-generated polygons with beziers.
+ if( !pNext || pNext->PolyPoly != elem.PolyPoly )
+ return;
+
+ const GraphicsContext& rNextGC =
+ m_rProcessor.getGraphicsContext( pNext->GCId );
+ const GraphicsContext& rThisGC =
+ m_rProcessor.getGraphicsContext( elem.GCId );
+
+ if( !(rThisGC.BlendMode == rNextGC.BlendMode &&
+ rThisGC.Flatness == rNextGC.Flatness &&
+ rThisGC.Transformation == rNextGC.Transformation &&
+ rThisGC.Clip == rNextGC.Clip &&
+ rThisGC.FillColor.Red == rNextGC.FillColor.Red &&
+ rThisGC.FillColor.Green== rNextGC.FillColor.Green &&
+ rThisGC.FillColor.Blue == rNextGC.FillColor.Blue &&
+ rThisGC.FillColor.Alpha== rNextGC.FillColor.Alpha &&
+ pNext->Action == PATH_STROKE &&
+ (elem.Action == PATH_FILL || elem.Action == PATH_EOFILL)) )
+ return;
+
+ GraphicsContext aGC = rThisGC;
+ aGC.LineJoin = rNextGC.LineJoin;
+ aGC.LineCap = rNextGC.LineCap;
+ aGC.LineWidth = rNextGC.LineWidth;
+ aGC.MiterLimit= rNextGC.MiterLimit;
+ aGC.DashArray = rNextGC.DashArray;
+ aGC.LineColor = rNextGC.LineColor;
+ elem.GCId = m_rProcessor.getGCId( aGC );
+
+ elem.Action |= pNext->Action;
+
+ elem.Children.splice( elem.Children.end(), pNext->Children );
+ elem.Parent->Children.erase(next_it);
+}
+
+void DrawXmlOptimizer::visit( ParagraphElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ optimizeTextElements( elem );
+
+ elem.applyToChildren(*this);
+}
+
+void DrawXmlOptimizer::visit( PageElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ if( m_rProcessor.getStatusIndicator().is() )
+ m_rProcessor.getStatusIndicator()->setValue( elem.PageNumber );
+
+ // resolve hyperlinks
+ elem.resolveHyperlinks();
+
+ elem.resolveFontStyles( m_rProcessor ); // underlines and such
+
+ // FIXME: until hyperlinks and font effects are adjusted for
+ // geometrical search handle them before sorting
+ PDFIProcessor::sortElements( &elem );
+
+ // find paragraphs in text
+ ParagraphElement* pCurPara = nullptr;
+ std::list< std::unique_ptr<Element> >::iterator page_element, next_page_element;
+ next_page_element = elem.Children.begin();
+ double fCurLineHeight = 0.0; // average height of text items in current para
+ int nCurLineElements = 0; // number of line contributing elements in current para
+ double line_left = elem.w, line_right = 0.0;
+ double column_width = elem.w*0.75; // estimate text width
+ // TODO: guess columns
+ while( next_page_element != elem.Children.end() )
+ {
+ page_element = next_page_element++;
+ ParagraphElement* pPagePara = dynamic_cast<ParagraphElement*>(page_element->get());
+ if( pPagePara )
+ {
+ pCurPara = pPagePara;
+ // adjust line height and text items
+ fCurLineHeight = 0.0;
+ nCurLineElements = 0;
+ for( const auto& rxChild : pCurPara->Children )
+ {
+ TextElement* pTestText = dynamic_cast<TextElement*>(rxChild.get());
+ if( pTestText )
+ {
+ fCurLineHeight = (fCurLineHeight*double(nCurLineElements) + pTestText->h)/double(nCurLineElements+1);
+ nCurLineElements++;
+ }
+ }
+ continue;
+ }
+
+ HyperlinkElement* pLink = dynamic_cast<HyperlinkElement*>(page_element->get());
+ DrawElement* pDraw = dynamic_cast<DrawElement*>(page_element->get());
+ if( ! pDraw && pLink && ! pLink->Children.empty() )
+ pDraw = dynamic_cast<DrawElement*>(pLink->Children.front().get() );
+ if( pDraw )
+ {
+ // insert small drawing objects as character, else leave them page bound
+
+ bool bInsertToParagraph = false;
+ // first check if this is either inside the paragraph
+ if( pCurPara && pDraw->y < pCurPara->y + pCurPara->h )
+ {
+ if( pDraw->h < fCurLineHeight * 1.5 )
+ {
+ bInsertToParagraph = true;
+ fCurLineHeight = (fCurLineHeight*double(nCurLineElements) + pDraw->h)/double(nCurLineElements+1);
+ nCurLineElements++;
+ // mark draw element as character
+ pDraw->isCharacter = true;
+ }
+ }
+ // or perhaps the draw element begins a new paragraph
+ else if( next_page_element != elem.Children.end() )
+ {
+ TextElement* pText = dynamic_cast<TextElement*>(next_page_element->get());
+ if( ! pText )
+ {
+ ParagraphElement* pPara = dynamic_cast<ParagraphElement*>(next_page_element->get());
+ if( pPara && ! pPara->Children.empty() )
+ pText = dynamic_cast<TextElement*>(pPara->Children.front().get());
+ }
+ if( pText && // check there is a text
+ pDraw->h < pText->h*1.5 && // and it is approx the same height
+ // and either upper or lower edge of pDraw is inside text's vertical range
+ ( ( pDraw->y >= pText->y && pDraw->y <= pText->y+pText->h ) ||
+ ( pDraw->y+pDraw->h >= pText->y && pDraw->y+pDraw->h <= pText->y+pText->h )
+ )
+ )
+ {
+ bInsertToParagraph = true;
+ fCurLineHeight = pDraw->h;
+ nCurLineElements = 1;
+ line_left = pDraw->x;
+ line_right = pDraw->x + pDraw->w;
+ // begin a new paragraph
+ pCurPara = nullptr;
+ // mark draw element as character
+ pDraw->isCharacter = true;
+ }
+ }
+
+ if( ! bInsertToParagraph )
+ {
+ pCurPara = nullptr;
+ continue;
+ }
+ }
+
+ TextElement* pText = dynamic_cast<TextElement*>(page_element->get());
+ if( ! pText && pLink && ! pLink->Children.empty() )
+ pText = dynamic_cast<TextElement*>(pLink->Children.front().get());
+ if( pText )
+ {
+ Element* pGeo = pLink ? static_cast<Element*>(pLink) :
+ static_cast<Element*>(pText);
+ if( pCurPara )
+ {
+ // there was already a text element, check for a new paragraph
+ if( nCurLineElements > 0 )
+ {
+ // if the new text is significantly distant from the paragraph
+ // begin a new paragraph
+ if( pGeo->y > pCurPara->y + pCurPara->h + fCurLineHeight*0.5 )
+ pCurPara = nullptr; // insert new paragraph
+ else if( pGeo->y > (pCurPara->y+pCurPara->h - fCurLineHeight*0.05) )
+ {
+ // new paragraph if either the last line of the paragraph
+ // was significantly shorter than the paragraph as a whole
+ if( (line_right - line_left) < pCurPara->w*0.75 )
+ pCurPara = nullptr;
+ // or the last line was significantly smaller than the column width
+ else if( (line_right - line_left) < column_width*0.75 )
+ pCurPara = nullptr;
+ }
+ }
+
+
+ }
+
+
+ // update line height/width
+ if( pCurPara )
+ {
+ fCurLineHeight = (fCurLineHeight*double(nCurLineElements) + pGeo->h)/double(nCurLineElements+1);
+ nCurLineElements++;
+ if( pGeo->x < line_left )
+ line_left = pGeo->x;
+ if( pGeo->x+pGeo->w > line_right )
+ line_right = pGeo->x+pGeo->w;
+ }
+ else
+ {
+ fCurLineHeight = pGeo->h;
+ nCurLineElements = 1;
+ line_left = pGeo->x;
+ line_right = pGeo->x + pGeo->w;
+ }
+ }
+
+
+ // move element to current paragraph
+ if (! pCurPara ) // new paragraph, insert one
+ {
+ pCurPara = ElementFactory::createParagraphElement( nullptr );
+ // set parent
+ pCurPara->Parent = &elem;
+ //insert new paragraph before current element
+ page_element = elem.Children.insert( page_element, std::unique_ptr<Element>(pCurPara) );
+ // forward iterator to current element again
+ ++ page_element;
+ // update next_element which is now invalid
+ next_page_element = page_element;
+ ++ next_page_element;
+ }
+ Element* pCurEle = page_element->get();
+ Element::setParent( page_element, pCurPara );
+ OSL_ENSURE( !pText || pCurEle == pText || pCurEle == pLink, "paragraph child list in disorder" );
+ if( pText || pDraw )
+ pCurPara->updateGeometryWith( pCurEle );
+ }
+
+ // process children
+ elem.applyToChildren(*this);
+}
+
+static bool isSpaces(TextElement* pTextElem)
+{
+ for (sal_Int32 i = 0; i != pTextElem->Text.getLength(); ++i) {
+ if (pTextElem->Text[i] != ' ') {
+ return false;
+ }
+ }
+ return true;
+}
+
+void DrawXmlOptimizer::optimizeTextElements(Element& rParent)
+{
+ if( rParent.Children.empty() ) // this should not happen
+ {
+ OSL_FAIL( "empty paragraph optimized" );
+ return;
+ }
+
+ // concatenate child elements with same font id
+ auto next = rParent.Children.begin();
+ auto it = next++;
+
+ while( next != rParent.Children.end() )
+ {
+ bool bConcat = false;
+ TextElement* pCur = dynamic_cast<TextElement*>(it->get());
+
+ if( pCur )
+ {
+ TextElement* pNext = dynamic_cast<TextElement*>(next->get());
+ bool isComplex = false;
+ OUString str(pCur->Text.toString());
+ for(int i=0; i< str.getLength(); i++)
+ {
+ sal_Int16 nType = GetBreakIterator()->getScriptType( str, i );
+ if (nType == css::i18n::ScriptType::COMPLEX)
+ isComplex = true;
+ }
+ bool bPara = strspn("ParagraphElement", typeid(rParent).name());
+ ParagraphElement* pPara = dynamic_cast<ParagraphElement*>(&rParent);
+ if (bPara && pPara && isComplex)
+ pPara->bRtl = true;
+ if( pNext )
+ {
+ const GraphicsContext& rCurGC = m_rProcessor.getGraphicsContext( pCur->GCId );
+ const GraphicsContext& rNextGC = m_rProcessor.getGraphicsContext( pNext->GCId );
+
+ // line and space optimization; works only in strictly horizontal mode
+
+ // concatenate consecutive text elements unless there is a
+ // font or text color change, leave a new span in that case
+ if( (pCur->FontId == pNext->FontId || isSpaces(pNext)) &&
+ rCurGC.FillColor.Red == rNextGC.FillColor.Red &&
+ rCurGC.FillColor.Green == rNextGC.FillColor.Green &&
+ rCurGC.FillColor.Blue == rNextGC.FillColor.Blue &&
+ rCurGC.FillColor.Alpha == rNextGC.FillColor.Alpha
+ )
+ {
+ pCur->updateGeometryWith( pNext );
+ if (pPara->bRtl)
+ {
+ // Tdf#152083: If RTL, reverse the text in pNext so that its correct order is
+ // restored when the combined text is reversed in DrawXmlEmitter::visit.
+ OUString tempStr;
+ bool bNeedReverse=false;
+ str = pNext->Text.toString();
+ for (sal_Int32 i=0; i < str.getLength(); i++)
+ {
+ if (str[i] == u' ')
+ { // Space char (e.g. the space as in " Ù…") needs special treatment.
+ // First, append the space char to pCur.
+ pCur->Text.append(OUStringChar(str[i]));
+ // Then, check whether the tmpStr needs reverse, if so then reverse and append.
+ if (bNeedReverse)
+ {
+ tempStr = ::comphelper::string::reverseCodePoints(tempStr);
+ pCur->Text.append(tempStr);
+ tempStr = u"";
+ }
+ bNeedReverse = false;
+ }
+ else
+ {
+ tempStr += OUStringChar(str[i]);
+ bNeedReverse = true;
+ }
+ }
+ // Do the last append
+ if (bNeedReverse)
+ {
+ tempStr = ::comphelper::string::reverseCodePoints(tempStr);
+ pCur->Text.append(tempStr);
+ }
+ else
+ {
+ pCur->Text.append(tempStr);
+ }
+ }
+ else
+ {
+ // append text to current element directly without reverse
+ pCur->Text.append( pNext->Text );
+ }
+
+ str = pCur->Text.toString();
+ for(int i=0; i< str.getLength(); i++)
+ {
+ sal_Int16 nType = GetBreakIterator()->getScriptType( str, i );
+ if (nType == css::i18n::ScriptType::COMPLEX)
+ isComplex = true;
+ }
+ if (bPara && pPara && isComplex)
+ pPara->bRtl = true;
+ // append eventual children to current element
+ // and clear children (else the children just
+ // appended to pCur would be destroyed)
+ pCur->Children.splice( pCur->Children.end(), pNext->Children );
+ // get rid of the now useless element
+ rParent.Children.erase( next );
+ bConcat = true;
+ }
+ }
+ }
+ else if( dynamic_cast<HyperlinkElement*>(it->get()) )
+ optimizeTextElements( **it );
+ if ( bConcat )
+ next = it;
+ else
+ ++it;
+ ++next;
+ }
+}
+
+void DrawXmlOptimizer::visit( DocumentElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator&)
+{
+ elem.applyToChildren(*this);
+}
+
+
+void DrawXmlFinalizer::visit( PolyPolyElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ // xxx TODO copied from DrawElement
+ const GraphicsContext& rGC = m_rProcessor.getGraphicsContext(elem.GCId );
+
+ PropertyMap aProps;
+ aProps[ "style:family" ] = "graphic";
+ aProps[ "style:parent-style-name" ] = "standard";
+ // generate standard graphic style if necessary
+ m_rStyleContainer.getStandardStyleId( "graphic" );
+
+ PropertyMap aGCProps;
+ if (elem.Action & PATH_STROKE)
+ {
+ double scale = GetAverageTransformationScale(rGC.Transformation);
+ if (rGC.DashArray.size() < 2)
+ {
+ aGCProps[ "draw:stroke" ] = "solid";
+ }
+ else
+ {
+ PropertyMap props;
+ FillDashStyleProps(props, rGC.DashArray, scale);
+ StyleContainer::Style style("draw:stroke-dash", std::move(props));
+
+ aGCProps[ "draw:stroke" ] = "dash";
+ aGCProps[ "draw:stroke-dash" ] =
+ m_rStyleContainer.getStyleName(
+ m_rStyleContainer.getStyleId(style));
+ }
+
+ aGCProps[ "svg:stroke-color" ] = getColorString(rGC.LineColor);
+ if (rGC.LineColor.Alpha != 1.0)
+ aGCProps["svg:stroke-opacity"] = getPercentString(rGC.LineColor.Alpha * 100.0);
+ aGCProps[ "svg:stroke-width" ] = convertPixelToUnitString(rGC.LineWidth * scale);
+ aGCProps[ "draw:stroke-linejoin" ] = rGC.GetLineJoinString();
+ aGCProps[ "svg:stroke-linecap" ] = rGC.GetLineCapString();
+ }
+ else
+ {
+ aGCProps[ "draw:stroke" ] = "none";
+ }
+
+ // TODO(F1): check whether stuff could be emulated by gradient/bitmap/hatch
+ if( elem.Action & (PATH_FILL | PATH_EOFILL) )
+ {
+ aGCProps[ "draw:fill" ] = "solid";
+ aGCProps[ "draw:fill-color" ] = getColorString(rGC.FillColor);
+ if (rGC.FillColor.Alpha != 1.0)
+ aGCProps["draw:opacity"] = getPercentString(rGC.FillColor.Alpha * 100.0);
+ }
+ else
+ {
+ aGCProps[ "draw:fill" ] = "none";
+ }
+
+ StyleContainer::Style aStyle( "style:style", std::move(aProps) );
+ StyleContainer::Style aSubStyle( "style:graphic-properties", std::move(aGCProps) );
+ aStyle.SubStyles.push_back( &aSubStyle );
+
+ elem.StyleId = m_rStyleContainer.getStyleId( aStyle );
+}
+
+void DrawXmlFinalizer::visit( HyperlinkElement&, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+}
+
+static void SetFontsizeProperties(PropertyMap& props, double fontSize)
+{
+ OUString aFSize = OUString::number(fontSize * 72 / PDFI_OUTDEV_RESOLUTION) + "pt";
+ props["fo:font-size"] = aFSize;
+ props["style:font-size-asian"] = aFSize;
+ props["style:font-size-complex"] = aFSize;
+}
+
+void DrawXmlFinalizer::visit( TextElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ const FontAttributes& rFont = m_rProcessor.getFont( elem.FontId );
+ PropertyMap aProps;
+ aProps[ "style:family" ] = "text";
+
+ PropertyMap aFontProps;
+
+ // family name
+ // TODO: tdf#143095: use system font name rather than PSName
+ SAL_INFO("sdext.pdfimport", "The font used in xml is: " << rFont.familyName);
+ aFontProps[ "fo:font-family" ] = rFont.familyName;
+ aFontProps[ "style:font-family-asian" ] = rFont.familyName;
+ aFontProps[ "style:font-family-complex" ] = rFont.familyName;
+
+ // bold
+ aFontProps[ "fo:font-weight" ] = rFont.fontWeight;
+ aFontProps[ "style:font-weight-asian" ] = rFont.fontWeight;
+ aFontProps[ "style:font-weight-complex" ] = rFont.fontWeight;
+
+ // italic
+ if( rFont.isItalic )
+ {
+ aFontProps[ "fo:font-style" ] = "italic";
+ aFontProps[ "style:font-style-asian" ] = "italic";
+ aFontProps[ "style:font-style-complex" ] = "italic";
+ }
+
+ // underline
+ if( rFont.isUnderline )
+ {
+ aFontProps[ "style:text-underline-style" ] = "solid";
+ aFontProps[ "style:text-underline-width" ] = "auto";
+ aFontProps[ "style:text-underline-color" ] = "font-color";
+ }
+
+ // outline
+ if( rFont.isOutline )
+ aFontProps[ "style:text-outline" ] = "true";
+
+ // size
+ SetFontsizeProperties(aFontProps, rFont.size);
+
+ // color
+ const GraphicsContext& rGC = m_rProcessor.getGraphicsContext( elem.GCId );
+ aFontProps[ "fo:color" ] = getColorString( rFont.isOutline ? rGC.LineColor : rGC.FillColor );
+
+ // scale
+ double fRotate, fShearX;
+ basegfx::B2DTuple aScale, aTranslation;
+ rGC.Transformation.decompose(aScale, aTranslation, fRotate, fShearX);
+ double textScale = 100 * aScale.getX() / aScale.getY();
+ if (((textScale >= 1) && (textScale <= 99)) ||
+ ((textScale >= 101) && (textScale <= 999)))
+ {
+ aFontProps[ "style:text-scale" ] = getPercentString(textScale);
+ }
+
+ StyleContainer::Style aStyle( "style:style", std::move(aProps) );
+ StyleContainer::Style aSubStyle( "style:text-properties", std::move(aFontProps) );
+ aStyle.SubStyles.push_back( &aSubStyle );
+ elem.StyleId = m_rStyleContainer.getStyleId( aStyle );
+}
+
+void DrawXmlFinalizer::visit( ParagraphElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+
+ PropertyMap aProps;
+ aProps[ "style:family" ] = "paragraph";
+ // generate standard paragraph style if necessary
+ m_rStyleContainer.getStandardStyleId( "paragraph" );
+
+ PropertyMap aParProps;
+
+ aParProps[ "fo:text-align"] = "start";
+ if (elem.bRtl)
+ aParProps[ "style:writing-mode"] = "rl-tb";
+ else
+ aParProps[ "style:writing-mode"] = "lr-tb";
+
+ StyleContainer::Style aStyle( "style:style", std::move(aProps) );
+ StyleContainer::Style aSubStyle( "style:paragraph-properties", std::move(aParProps) );
+ aStyle.SubStyles.push_back( &aSubStyle );
+
+ elem.StyleId = m_rStyleContainer.getStyleId( aStyle );
+
+ elem.applyToChildren(*this);
+}
+
+void DrawXmlFinalizer::visit( FrameElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator&)
+{
+ PropertyMap props1;
+ props1[ "style:family" ] = "graphic";
+ props1[ "style:parent-style-name" ] = "standard";
+ // generate standard graphic style if necessary
+ m_rStyleContainer.getStandardStyleId( "graphic" );
+
+ PropertyMap aGCProps;
+
+ aGCProps[ "draw:stroke" ] = "none";
+ aGCProps[ "draw:fill" ] = "none";
+ aGCProps[ "draw:auto-grow-height" ] = "true";
+ aGCProps[ "draw:auto-grow-width" ] = "true";
+ aGCProps[ "draw:textarea-horizontal-align" ] = "left";
+ aGCProps[ "draw:textarea-vertical-align" ] = "top";
+ aGCProps[ "fo:min-height"] = "0cm";
+ aGCProps[ "fo:min-width"] = "0cm";
+ aGCProps[ "fo:padding-top" ] = "0cm";
+ aGCProps[ "fo:padding-left" ] = "0cm";
+ aGCProps[ "fo:padding-right" ] = "0cm";
+ aGCProps[ "fo:padding-bottom" ] = "0cm";
+
+ StyleContainer::Style style1( "style:style", std::move(props1) );
+ StyleContainer::Style subStyle1( "style:graphic-properties", std::move(aGCProps) );
+ style1.SubStyles.push_back(&subStyle1);
+
+ elem.StyleId = m_rStyleContainer.getStyleId(style1);
+
+ if (elem.IsForText)
+ {
+ PropertyMap props2;
+ props2["style:family"] = "paragraph";
+
+ PropertyMap textProps;
+ SetFontsizeProperties(textProps, elem.FontSize);
+
+ StyleContainer::Style style2("style:style", std::move(props2));
+ StyleContainer::Style subStyle2("style:text-properties", std::move(textProps));
+ style2.SubStyles.push_back(&subStyle2);
+ elem.TextStyleId = m_rStyleContainer.getStyleId(style2);
+ }
+
+ elem.applyToChildren(*this);
+}
+
+void DrawXmlFinalizer::visit( ImageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+}
+
+void DrawXmlFinalizer::visit( PageElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ if( m_rProcessor.getStatusIndicator().is() )
+ m_rProcessor.getStatusIndicator()->setValue( elem.PageNumber );
+
+ // transform from pixel to mm
+ double page_width = convPx2mm( elem.w ), page_height = convPx2mm( elem.h );
+
+ // calculate page margins out of the relevant children (paragraphs)
+ elem.TopMargin = elem.h;
+ elem.BottomMargin = 0;
+ elem.LeftMargin = elem.w;
+ elem.RightMargin = 0;
+
+ for( const auto& rxChild : elem.Children )
+ {
+ if( rxChild->x < elem.LeftMargin )
+ elem.LeftMargin = rxChild->x;
+ if( rxChild->y < elem.TopMargin )
+ elem.TopMargin = rxChild->y;
+ if( rxChild->x + rxChild->w > elem.RightMargin )
+ elem.RightMargin = (rxChild->x + rxChild->w);
+ if( rxChild->y + rxChild->h > elem.BottomMargin )
+ elem.BottomMargin = (rxChild->y + rxChild->h);
+ }
+
+ // transform margins to mm
+ double left_margin = convPx2mm( elem.LeftMargin );
+ double right_margin = convPx2mm( elem.RightMargin );
+ double top_margin = convPx2mm( elem.TopMargin );
+ double bottom_margin = convPx2mm( elem.BottomMargin );
+
+ // round left/top margin to nearest mm
+ left_margin = rtl_math_round( left_margin, 0, rtl_math_RoundingMode_Floor );
+ top_margin = rtl_math_round( top_margin, 0, rtl_math_RoundingMode_Floor );
+ // round (fuzzy) right/bottom margin to nearest cm
+ right_margin = rtl_math_round( right_margin, right_margin >= 10 ? -1 : 0, rtl_math_RoundingMode_Floor );
+ bottom_margin = rtl_math_round( bottom_margin, bottom_margin >= 10 ? -1 : 0, rtl_math_RoundingMode_Floor );
+
+ // set reasonable default in case of way too large margins
+ // e.g. no paragraph case
+ if( left_margin > page_width/2.0 - 10 )
+ left_margin = 10;
+ if( right_margin > page_width/2.0 - 10 )
+ right_margin = 10;
+ if( top_margin > page_height/2.0 - 10 )
+ top_margin = 10;
+ if( bottom_margin > page_height/2.0 - 10 )
+ bottom_margin = 10;
+
+ // catch the weird cases
+ if( left_margin < 0 )
+ left_margin = 0;
+ if( right_margin < 0 )
+ right_margin = 0;
+ if( top_margin < 0 )
+ top_margin = 0;
+ if( bottom_margin < 0 )
+ bottom_margin = 0;
+
+ // widely differing margins are unlikely to be correct
+ if( right_margin > left_margin*1.5 )
+ right_margin = left_margin;
+
+ elem.LeftMargin = convmm2Px( left_margin );
+ elem.RightMargin = convmm2Px( right_margin );
+ elem.TopMargin = convmm2Px( top_margin );
+ elem.BottomMargin = convmm2Px( bottom_margin );
+
+ // get styles for paragraphs
+ PropertyMap aPageProps;
+ PropertyMap aPageLayoutProps;
+ aPageLayoutProps[ "fo:margin-top" ] = unitMMString( top_margin );
+ aPageLayoutProps[ "fo:margin-bottom" ] = unitMMString( bottom_margin );
+ aPageLayoutProps[ "fo:margin-left" ] = unitMMString( left_margin );
+ aPageLayoutProps[ "fo:margin-right" ] = unitMMString( right_margin );
+ aPageLayoutProps[ "fo:page-width" ] = unitMMString( page_width );
+ aPageLayoutProps[ "fo:page-height" ] = unitMMString( page_height );
+ aPageLayoutProps[ "style:print-orientation" ]= elem.w < elem.h ? std::u16string_view(u"portrait") : std::u16string_view(u"landscape");
+ aPageLayoutProps[ "style:writing-mode" ]= "lr-tb";
+
+ StyleContainer::Style aStyle( "style:page-layout", std::move(aPageProps));
+ StyleContainer::Style aSubStyle( "style:page-layout-properties", std::move(aPageLayoutProps));
+ aStyle.SubStyles.push_back(&aSubStyle);
+ sal_Int32 nPageStyle = m_rStyleContainer.impl_getStyleId( aStyle, false );
+
+ // create master page
+ OUString aMasterPageLayoutName = m_rStyleContainer.getStyleName( nPageStyle );
+ aPageProps[ "style:page-layout-name" ] = aMasterPageLayoutName;
+
+ StyleContainer::Style aMPStyle( "style:master-page", std::move(aPageProps));
+
+ elem.StyleId = m_rStyleContainer.impl_getStyleId( aMPStyle,false );
+
+ // create styles for children
+ elem.applyToChildren(*this);
+}
+
+void DrawXmlFinalizer::visit( DocumentElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ elem.applyToChildren(*this);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/tree/drawtreevisiting.hxx b/sdext/source/pdfimport/tree/drawtreevisiting.hxx
new file mode 100644
index 000000000..81bfd9273
--- /dev/null
+++ b/sdext/source/pdfimport/tree/drawtreevisiting.hxx
@@ -0,0 +1,117 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_TREE_DRAWTREEVISITING_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_TREE_DRAWTREEVISITING_HXX
+
+#include <treevisiting.hxx>
+
+#include <com/sun/star/i18n/XBreakIterator.hpp>
+#include <com/sun/star/i18n/XCharacterClassification.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+namespace pdfi
+{
+ struct DrawElement;
+
+ class DrawXmlOptimizer : public ElementTreeVisitor
+ {
+ private:
+ PDFIProcessor& m_rProcessor;
+ css::uno::Reference< css::i18n::XBreakIterator > mxBreakIter;
+
+ void optimizeTextElements(Element& rParent);
+
+ public:
+ const css::uno::Reference< css::i18n::XBreakIterator >& GetBreakIterator();
+ explicit DrawXmlOptimizer(PDFIProcessor& rProcessor) :
+ m_rProcessor(rProcessor)
+ {}
+
+ virtual void visit( HyperlinkElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( TextElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( ParagraphElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( FrameElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( PolyPolyElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( ImageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( PageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( DocumentElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ };
+
+ class DrawXmlFinalizer : public ElementTreeVisitor
+ {
+ private:
+ StyleContainer& m_rStyleContainer;
+ PDFIProcessor& m_rProcessor;
+
+ public:
+ explicit DrawXmlFinalizer(StyleContainer& rStyleContainer,
+ PDFIProcessor& rProcessor) :
+ m_rStyleContainer(rStyleContainer),
+ m_rProcessor(rProcessor)
+ {}
+
+ virtual void visit( HyperlinkElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( TextElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( ParagraphElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( FrameElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( PolyPolyElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( ImageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( PageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( DocumentElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ };
+
+ class DrawXmlEmitter : public ElementTreeVisitor
+ {
+ private:
+ css::uno::Reference< css::i18n::XCharacterClassification > mxCharClass;
+
+ EmitContext& m_rEmitContext ;
+ /// writes Impress doc when false
+ const bool m_bWriteDrawDocument;
+
+ static void fillFrameProps( DrawElement& rElem,
+ PropertyMap& rProps,
+ const EmitContext& rEmitContext,
+ bool bWasTransformed
+ );
+
+ public:
+ const css::uno::Reference< css::i18n::XCharacterClassification >& GetCharacterClassification();
+ enum DocType{ DRAW_DOC, IMPRESS_DOC };
+ explicit DrawXmlEmitter(EmitContext& rEmitContext, DocType eDocType) :
+ m_rEmitContext(rEmitContext),
+ m_bWriteDrawDocument(eDocType==DRAW_DOC)
+ {}
+
+ virtual void visit( HyperlinkElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( TextElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( ParagraphElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( FrameElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( PolyPolyElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( ImageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( PageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( DocumentElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/tree/genericelements.cxx b/sdext/source/pdfimport/tree/genericelements.cxx
new file mode 100644
index 000000000..2c394c973
--- /dev/null
+++ b/sdext/source/pdfimport/tree/genericelements.cxx
@@ -0,0 +1,434 @@
+/* -*- 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 <genericelements.hxx>
+#include <pdfiprocessor.hxx>
+#include <pdfihelper.hxx>
+
+
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
+#include <basegfx/range/b2drange.hxx>
+#include <sal/log.hxx>
+
+namespace pdfi
+{
+
+Element::~Element()
+{
+}
+
+void Element::applyToChildren( ElementTreeVisitor& rVisitor )
+{
+ for( auto it = Children.begin(); it != Children.end(); ++it )
+ (*it)->visitedBy( rVisitor, it );
+}
+
+void Element::setParent( std::list<std::unique_ptr<Element>>::iterator const & el, Element* pNewParent )
+{
+ if( pNewParent )
+ {
+ pNewParent->Children.splice( pNewParent->Children.end(), (*el)->Parent->Children, el );
+ (*el)->Parent = pNewParent;
+ }
+}
+
+void Element::updateGeometryWith( const Element* pMergeFrom )
+{
+ if( w == 0 && h == 0 )
+ {
+ x = pMergeFrom->x;
+ y = pMergeFrom->y;
+ w = pMergeFrom->w;
+ h = pMergeFrom->h;
+ }
+ else
+ {
+ if( pMergeFrom->x < x )
+ {
+ w += x - pMergeFrom->x;
+ x = pMergeFrom->x;
+ }
+ if( pMergeFrom->x+pMergeFrom->w > x+w )
+ w = pMergeFrom->w+pMergeFrom->x - x;
+ if( pMergeFrom->y < y )
+ {
+ h += y - pMergeFrom->y;
+ y = pMergeFrom->y;
+ }
+ if( pMergeFrom->y+pMergeFrom->h > y+h )
+ h = pMergeFrom->h+pMergeFrom->y - y;
+ }
+}
+
+
+#if OSL_DEBUG_LEVEL > 0
+#include <typeinfo>
+void Element::emitStructure( int nLevel)
+{
+ SAL_INFO( "sdext", std::string(nLevel, ' ') << "<" << typeid( *this ).name() << " " << this << "> ("
+ << std::setprecision(1) << x << "," << y << ")+(" << w << "x" << h << ")" );
+ for (auto const& child : Children)
+ child->emitStructure(nLevel+1);
+ SAL_INFO( "sdext", std::string(nLevel, ' ') << "</" << typeid( *this ).name() << ">" );
+}
+#endif
+
+void ListElement::visitedBy( ElementTreeVisitor& visitor, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ // this is only an inner node
+ applyToChildren(visitor);
+}
+
+void HyperlinkElement::visitedBy( ElementTreeVisitor& rVisitor,
+ const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt )
+{
+ rVisitor.visit(*this,rParentIt);
+}
+
+void TextElement::visitedBy( ElementTreeVisitor& rVisitor,
+ const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt )
+{
+ rVisitor.visit(*this,rParentIt);
+}
+
+void FrameElement::visitedBy( ElementTreeVisitor& rVisitor,
+ const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt )
+{
+ rVisitor.visit(*this,rParentIt);
+}
+
+void ImageElement::visitedBy( ElementTreeVisitor& rVisitor,
+ const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt)
+{
+ rVisitor.visit( *this, rParentIt);
+}
+
+PolyPolyElement::PolyPolyElement( Element* pParent,
+ sal_Int32 nGCId,
+ const basegfx::B2DPolyPolygon& rPolyPoly,
+ sal_Int8 nAction )
+ : DrawElement( pParent, nGCId ),
+ PolyPoly( rPolyPoly ),
+ Action( nAction )
+{
+}
+
+void PolyPolyElement::updateGeometry()
+{
+ basegfx::B2DRange aRange;
+ if( PolyPoly.areControlPointsUsed() )
+ aRange = basegfx::utils::getRange( basegfx::utils::adaptiveSubdivideByAngle( PolyPoly ) );
+ else
+ aRange = basegfx::utils::getRange( PolyPoly );
+ x = aRange.getMinX();
+ y = aRange.getMinY();
+ w = aRange.getWidth();
+ h = aRange.getHeight();
+
+ // fdo#32330 - non-closed paths will not show up filled in LibO
+ if( Action & (PATH_FILL | PATH_EOFILL) )
+ PolyPoly.setClosed(true);
+}
+
+void PolyPolyElement::visitedBy( ElementTreeVisitor& rVisitor,
+ const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt)
+{
+ rVisitor.visit( *this, rParentIt);
+}
+
+#if OSL_DEBUG_LEVEL > 0
+void PolyPolyElement::emitStructure( int nLevel)
+{
+ SAL_INFO( "sdext", std::string(nLevel, ' ') << "<" << typeid( *this ).name() << " " << this << ">" );
+ SAL_INFO( "sdext", "path=" );
+ int nPoly = PolyPoly.count();
+ for( int i = 0; i < nPoly; i++ )
+ {
+ OUStringBuffer buff;
+ basegfx::B2DPolygon aPoly = PolyPoly.getB2DPolygon( i );
+ int nPoints = aPoly.count();
+ for( int n = 0; n < nPoints; n++ )
+ {
+ basegfx::B2DPoint aPoint = aPoly.getB2DPoint( n );
+ buff.append( " (" + OUString::number(aPoint.getX()) + "," + OUString::number(aPoint.getY()) + ")");
+ }
+ SAL_INFO( "sdext", " " << buff.makeStringAndClear() );
+ }
+ for (auto const& child : Children)
+ child->emitStructure( nLevel+1 );
+ SAL_INFO( "sdext", std::string(nLevel, ' ') << "</" << typeid( *this ).name() << ">");
+}
+#endif
+
+void ParagraphElement::visitedBy( ElementTreeVisitor& rVisitor,
+ const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt )
+{
+ rVisitor.visit(*this,rParentIt);
+}
+
+bool ParagraphElement::isSingleLined( PDFIProcessor const & rProc ) const
+{
+ TextElement* pText = nullptr, *pLastText = nullptr;
+ for( auto& rxChild : Children )
+ {
+ // a paragraph containing subparagraphs cannot be single lined
+ if( dynamic_cast< ParagraphElement* >(rxChild.get()) != nullptr )
+ return false;
+
+ pText = dynamic_cast< TextElement* >(rxChild.get());
+ if( pText )
+ {
+ const FontAttributes& rFont = rProc.getFont( pText->FontId );
+ if( pText->h > rFont.size*1.5 )
+ return false;
+ if( pLastText )
+ {
+ if( pText->y > pLastText->y+pLastText->h ||
+ pLastText->y > pText->y+pText->h )
+ return false;
+ }
+ else
+ pLastText = pText;
+ }
+ }
+
+ // a paragraph without a single text is not considered single lined
+ return pLastText != nullptr;
+}
+
+double ParagraphElement::getLineHeight( PDFIProcessor& rProc ) const
+{
+ double line_h = 0;
+ for( auto& rxChild : Children )
+ {
+ ParagraphElement* pPara = dynamic_cast< ParagraphElement* >(rxChild.get());
+ TextElement* pText = nullptr;
+ if( pPara )
+ {
+ double lh = pPara->getLineHeight( rProc );
+ if( lh > line_h )
+ line_h = lh;
+ }
+ else if( (pText = dynamic_cast< TextElement* >( rxChild.get() )) != nullptr )
+ {
+ const FontAttributes& rFont = rProc.getFont( pText->FontId );
+ double lh = pText->h;
+ if( pText->h > rFont.size*1.5 )
+ lh = rFont.size;
+ if( lh > line_h )
+ line_h = lh;
+ }
+ }
+ return line_h;
+}
+
+TextElement* ParagraphElement::getFirstTextChild() const
+{
+ TextElement* pText = nullptr;
+ auto it = std::find_if(Children.begin(), Children.end(),
+ [](const std::unique_ptr<Element>& rxElem) { return dynamic_cast<TextElement*>(rxElem.get()) != nullptr; });
+ if (it != Children.end())
+ pText = dynamic_cast<TextElement*>(it->get());
+ return pText;
+}
+
+PageElement::~PageElement()
+{
+}
+
+void PageElement::visitedBy( ElementTreeVisitor& rVisitor,
+ const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt )
+{
+ rVisitor.visit(*this, rParentIt);
+}
+
+bool PageElement::resolveHyperlink( const std::list<std::unique_ptr<Element>>::iterator& link_it, std::list<std::unique_ptr<Element>>& rElements )
+{
+ HyperlinkElement* pLink = dynamic_cast<HyperlinkElement*>(link_it->get());
+ if( ! pLink ) // sanity check
+ return false;
+
+ for( auto it = rElements.begin(); it != rElements.end(); ++it )
+ {
+ if( (*it)->x >= pLink->x && (*it)->x + (*it)->w <= pLink->x + pLink->w &&
+ (*it)->y >= pLink->y && (*it)->y + (*it)->h <= pLink->y + pLink->h )
+ {
+ TextElement* pText = dynamic_cast<TextElement*>(it->get());
+ if( pText )
+ {
+ if( pLink->Children.empty() )
+ {
+ // insert the hyperlink before the frame
+ rElements.splice( it, Hyperlinks.Children, link_it );
+ pLink->Parent = (*it)->Parent;
+ }
+ // move text element into hyperlink
+ auto next = it;
+ ++next;
+ Element::setParent( it, pLink );
+ it = next;
+ --it;
+ continue;
+ }
+ // a link can contain multiple text elements or a single frame
+ if( ! pLink->Children.empty() )
+ continue;
+ if( dynamic_cast<ParagraphElement*>(it->get()) )
+ {
+ if( resolveHyperlink( link_it, (*it)->Children ) )
+ break;
+ continue;
+ }
+ FrameElement* pFrame = dynamic_cast<FrameElement*>(it->get());
+ if( pFrame )
+ {
+ // insert the hyperlink before the frame
+ rElements.splice( it, Hyperlinks.Children, link_it );
+ pLink->Parent = (*it)->Parent;
+ // move frame into hyperlink
+ Element::setParent( it, pLink );
+ break;
+ }
+ }
+ }
+ return ! pLink->Children.empty();
+}
+
+void PageElement::resolveHyperlinks()
+{
+ while( ! Hyperlinks.Children.empty() )
+ {
+ if( ! resolveHyperlink( Hyperlinks.Children.begin(), Children ) )
+ {
+ Hyperlinks.Children.pop_front();
+ }
+ }
+}
+
+void PageElement::resolveFontStyles( PDFIProcessor const & rProc )
+{
+ resolveUnderlines(rProc);
+}
+
+void PageElement::resolveUnderlines( PDFIProcessor const & rProc )
+{
+ // FIXME: currently the algorithm used is quadratic
+ // this could be solved by some sorting beforehand
+
+ auto poly_it = Children.begin();
+ while( poly_it != Children.end() )
+ {
+ PolyPolyElement* pPoly = dynamic_cast< PolyPolyElement* >(poly_it->get());
+ if( ! pPoly || ! pPoly->Children.empty() )
+ {
+ ++poly_it;
+ continue;
+ }
+ /* check for: no filling
+ * only two points (FIXME: handle small rectangles, too)
+ * y coordinates of points are equal
+ */
+ if( pPoly->Action != PATH_STROKE )
+ {
+ ++poly_it;
+ continue;
+ }
+ if( pPoly->PolyPoly.count() != 1 )
+ {
+ ++poly_it;
+ continue;
+ }
+
+ bool bRemovePoly = false;
+ basegfx::B2DPolygon aPoly = pPoly->PolyPoly.getB2DPolygon(0);
+ if( aPoly.count() != 2 ||
+ aPoly.getB2DPoint(0).getY() != aPoly.getB2DPoint(1).getY() )
+ {
+ ++poly_it;
+ continue;
+ }
+ double l_x = aPoly.getB2DPoint(0).getX();
+ double r_x = aPoly.getB2DPoint(1).getX();
+ double u_y;
+ if( r_x < l_x )
+ {
+ u_y = r_x; r_x = l_x; l_x = u_y;
+ }
+ u_y = aPoly.getB2DPoint(0).getY();
+ for( const auto& rxChild : Children )
+ {
+ Element* pEle = rxChild.get();
+ if( pEle->y <= u_y && pEle->y + pEle->h*1.1 >= u_y )
+ {
+ // first: is the element underlined completely ?
+ if( pEle->x + pEle->w*0.1 >= l_x &&
+ pEle->x + pEle->w*0.9 <= r_x )
+ {
+ TextElement* pText = dynamic_cast< TextElement* >(pEle);
+ if( pText )
+ {
+ const GraphicsContext& rTextGC = rProc.getGraphicsContext( pText->GCId );
+ if( ! rTextGC.isRotatedOrSkewed() )
+ {
+ bRemovePoly = true;
+ // retrieve ID for modified font
+ FontAttributes aAttr = rProc.getFont( pText->FontId );
+ aAttr.isUnderline = true;
+ pText->FontId = rProc.getFontId( aAttr );
+ }
+ }
+ else if( dynamic_cast< HyperlinkElement* >(pEle) )
+ bRemovePoly = true;
+ }
+ // second: hyperlinks may be larger than their underline
+ // since they are just arbitrary rectangles in the action definition
+ else if( dynamic_cast< HyperlinkElement* >(pEle) != nullptr &&
+ l_x >= pEle->x && r_x <= pEle->x+pEle->w )
+ {
+ bRemovePoly = true;
+ }
+ }
+ }
+ if( bRemovePoly )
+ {
+ auto next_it = poly_it;
+ ++next_it;
+ Children.erase( poly_it );
+ poly_it = next_it;
+ }
+ else
+ ++poly_it;
+ }
+}
+
+DocumentElement::~DocumentElement()
+{
+}
+
+void DocumentElement::visitedBy( ElementTreeVisitor& rVisitor,
+ const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt)
+{
+ rVisitor.visit(*this, rParentIt);
+}
+
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/tree/imagecontainer.cxx b/sdext/source/pdfimport/tree/imagecontainer.cxx
new file mode 100644
index 000000000..a7154164d
--- /dev/null
+++ b/sdext/source/pdfimport/tree/imagecontainer.cxx
@@ -0,0 +1,146 @@
+/* -*- 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 <imagecontainer.hxx>
+#include <genericelements.hxx>
+#include <xmlemitter.hxx>
+
+#include <rtl/ustrbuf.hxx>
+#include <sal/log.hxx>
+#include <o3tl/safeint.hxx>
+#include <osl/diagnose.h>
+
+#include <com/sun/star/beans/PropertyValue.hpp>
+
+using namespace com::sun::star;
+
+namespace pdfi
+{
+
+namespace
+{
+
+const char aBase64EncodeTable[] =
+ { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };
+
+OUString encodeBase64( const sal_Int8* i_pBuffer, const sal_Int32 i_nBufferLength )
+{
+ OUStringBuffer aBuf( (i_nBufferLength+1) * 4 / 3 );
+ const sal_Int32 nRemain(i_nBufferLength%3);
+ const sal_Int32 nFullTripleLength( i_nBufferLength - (i_nBufferLength%3));
+ sal_Int32 nBufPos( 0 );
+ for( sal_Int32 i = 0; i < nFullTripleLength; i += 3, nBufPos += 4 )
+ {
+ const sal_Int32 nBinary = (static_cast<sal_uInt8>(i_pBuffer[i + 0]) << 16) +
+ (static_cast<sal_uInt8>(i_pBuffer[i + 1]) << 8) +
+ static_cast<sal_uInt8>(i_pBuffer[i + 2]);
+
+ aBuf.append("====");
+
+ sal_uInt8 nIndex (static_cast<sal_uInt8>((nBinary & 0xFC0000) >> 18));
+ aBuf[nBufPos] = aBase64EncodeTable [nIndex];
+
+ nIndex = static_cast<sal_uInt8>((nBinary & 0x3F000) >> 12);
+ aBuf[nBufPos+1] = aBase64EncodeTable [nIndex];
+
+ nIndex = static_cast<sal_uInt8>((nBinary & 0xFC0) >> 6);
+ aBuf[nBufPos+2] = aBase64EncodeTable [nIndex];
+
+ nIndex = static_cast<sal_uInt8>((nBinary & 0x3F));
+ aBuf[nBufPos+3] = aBase64EncodeTable [nIndex];
+ }
+ if( nRemain > 0 )
+ {
+ aBuf.append("====");
+ sal_Int32 nBinary( 0 );
+ const sal_Int32 nStart(i_nBufferLength-nRemain);
+ switch(nRemain)
+ {
+ case 1: nBinary = static_cast<sal_uInt8>(i_pBuffer[nStart + 0]) << 16;
+ break;
+ case 2: nBinary = (static_cast<sal_uInt8>(i_pBuffer[nStart + 0]) << 16) +
+ (static_cast<sal_uInt8>(i_pBuffer[nStart + 1]) << 8);
+ break;
+ }
+ sal_uInt8 nIndex (static_cast<sal_uInt8>((nBinary & 0xFC0000) >> 18));
+ aBuf[nBufPos] = aBase64EncodeTable [nIndex];
+
+ nIndex = static_cast<sal_uInt8>((nBinary & 0x3F000) >> 12);
+ aBuf[nBufPos+1] = aBase64EncodeTable [nIndex];
+
+ if( nRemain == 2 )
+ {
+ nIndex = static_cast<sal_uInt8>((nBinary & 0xFC0) >> 6);
+ aBuf[nBufPos+2] = aBase64EncodeTable [nIndex];
+ }
+ }
+
+ return aBuf.makeStringAndClear();
+}
+
+} // namespace
+
+ImageContainer::ImageContainer()
+{}
+
+ImageId ImageContainer::addImage( const uno::Sequence<beans::PropertyValue>& xBitmap )
+{
+ m_aImages.push_back( xBitmap );
+ return m_aImages.size()-1;
+}
+
+void ImageContainer::writeBase64EncodedStream( ImageId nId, EmitContext& rContext )
+{
+ OSL_ASSERT( nId >= 0 && o3tl::make_unsigned(nId) < m_aImages.size() );
+
+ const uno::Sequence<beans::PropertyValue>& rEntry( m_aImages[nId] );
+
+ // find "InputSequence" property
+ const beans::PropertyValue* pAry(rEntry.getConstArray());
+ const sal_Int32 nLen(rEntry.getLength());
+ const beans::PropertyValue* pValue(
+ std::find_if(pAry, pAry+nLen,
+ [] (beans::PropertyValue const& v) -> bool {
+ return v.Name == "InputSequence";
+ }));
+
+ if (pValue == pAry + nLen )
+ {
+ SAL_WARN("sdext.pdfimport", "InputSequence not found");
+ return;
+ }
+
+ uno::Sequence<sal_Int8> aData;
+ if( !(pValue->Value >>= aData) )
+ {
+ SAL_WARN("sdext.pdfimport", "Wrong data type");
+ return;
+ }
+
+ rContext.rEmitter.write( encodeBase64( aData.getConstArray(), aData.getLength() ));
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/tree/pdfiprocessor.cxx b/sdext/source/pdfimport/tree/pdfiprocessor.cxx
new file mode 100644
index 000000000..23a2cd5a0
--- /dev/null
+++ b/sdext/source/pdfimport/tree/pdfiprocessor.cxx
@@ -0,0 +1,715 @@
+/* -*- 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 <pdfiprocessor.hxx>
+#include <xmlemitter.hxx>
+#include <pdfihelper.hxx>
+#include <imagecontainer.hxx>
+#include <genericelements.hxx>
+#include "style.hxx"
+#include <treevisiting.hxx>
+
+#include <sal/log.hxx>
+
+#include <comphelper/sequence.hxx>
+#include <basegfx/polygon/b2dpolygonclipper.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/utils/canvastools.hxx>
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <i18nutil/unicode.hxx>
+
+using namespace com::sun::star;
+
+
+namespace pdfi
+{
+
+ PDFIProcessor::PDFIProcessor( const uno::Reference< task::XStatusIndicator >& xStat ,
+ css::uno::Reference< css::uno::XComponentContext > const & xContext) :
+
+ m_xContext(xContext),
+ prevCharWidth(0),
+ m_pDocument( ElementFactory::createDocumentElement() ),
+ m_pCurPage(nullptr),
+ m_pCurElement(nullptr),
+ m_nNextFontId( 1 ),
+ m_nNextGCId( 1 ),
+ m_nPages(0),
+ m_nNextZOrder( 1 ),
+ m_xStatusIndicator( xStat )
+{
+ FontAttributes aDefFont;
+ aDefFont.familyName = "Helvetica";
+ aDefFont.fontWeight = u"normal";
+ aDefFont.isItalic = false;
+ aDefFont.size = 10*PDFI_OUTDEV_RESOLUTION/72;
+ m_aIdToFont.insert({0, aDefFont});
+ m_aFontToId.insert({aDefFont, 0});
+
+ GraphicsContext aDefGC;
+ m_aGCStack.push_back( aDefGC );
+ m_aGCToId.insert({aDefGC, 0});
+ m_aIdToGC.insert({0, aDefGC});
+}
+
+void PDFIProcessor::setPageNum( sal_Int32 nPages )
+{
+ m_nPages = nPages;
+}
+
+
+void PDFIProcessor::pushState()
+{
+ GraphicsContextStack::value_type const a(m_aGCStack.back());
+ m_aGCStack.push_back(a);
+}
+
+void PDFIProcessor::popState()
+{
+ m_aGCStack.pop_back();
+}
+
+void PDFIProcessor::setFlatness( double value )
+{
+ getCurrentContext().Flatness = value;
+}
+
+void PDFIProcessor::setTransformation( const geometry::AffineMatrix2D& rMatrix )
+{
+ basegfx::unotools::homMatrixFromAffineMatrix(
+ getCurrentContext().Transformation,
+ rMatrix );
+}
+
+void PDFIProcessor::setLineDash( const uno::Sequence<double>& dashes,
+ double /*start*/ )
+{
+ // TODO(F2): factor in start offset
+ GraphicsContext& rContext( getCurrentContext() );
+ comphelper::sequenceToContainer(rContext.DashArray,dashes);
+}
+
+void PDFIProcessor::setLineJoin(sal_Int8 nJoin)
+{
+ getCurrentContext().LineJoin = nJoin;
+}
+
+void PDFIProcessor::setLineCap(sal_Int8 nCap)
+{
+ getCurrentContext().LineCap = nCap;
+}
+
+void PDFIProcessor::setMiterLimit(double)
+{
+ SAL_WARN("sdext.pdfimport", "PDFIProcessor::setMiterLimit(): not supported by ODF");
+}
+
+void PDFIProcessor::setLineWidth(double nWidth)
+{
+ getCurrentContext().LineWidth = nWidth;
+}
+
+void PDFIProcessor::setFillColor( const rendering::ARGBColor& rColor )
+{
+ getCurrentContext().FillColor = rColor;
+}
+
+void PDFIProcessor::setStrokeColor( const rendering::ARGBColor& rColor )
+{
+ getCurrentContext().LineColor = rColor;
+}
+
+void PDFIProcessor::setFont( const FontAttributes& i_rFont )
+{
+ FontAttributes aChangedFont( i_rFont );
+ GraphicsContext& rGC=getCurrentContext();
+ // for text render modes, please see PDF reference manual
+ if (rGC.TextRenderMode == 1)
+ {
+ aChangedFont.isOutline = true;
+ }
+ else if (rGC.TextRenderMode == 2)
+ {
+ // tdf#81484: faux bold is represented as "stroke+fill" (while using the same color for both stroke and fill) in pdf.
+ // Convert to bold instead if the stroke color is the same as the fill color,
+ // otherwise it should be outline.
+ if (getCurrentContext().LineColor == getCurrentContext().FillColor)
+ aChangedFont.fontWeight = u"bold";
+ else
+ aChangedFont.isOutline = true;
+ }
+ FontToIdMap::const_iterator it = m_aFontToId.find( aChangedFont );
+ if( it != m_aFontToId.end() )
+ rGC.FontId = it->second;
+ else
+ {
+ m_aFontToId[ aChangedFont ] = m_nNextFontId;
+ m_aIdToFont[ m_nNextFontId ] = aChangedFont;
+ rGC.FontId = m_nNextFontId;
+ m_nNextFontId++;
+ }
+}
+
+void PDFIProcessor::setTextRenderMode( sal_Int32 i_nMode )
+{
+ GraphicsContext& rGC=getCurrentContext();
+ rGC.TextRenderMode = i_nMode;
+ IdToFontMap::iterator it = m_aIdToFont.find( rGC.FontId );
+ if( it != m_aIdToFont.end() )
+ setFont( it->second );
+}
+
+sal_Int32 PDFIProcessor::getFontId( const FontAttributes& rAttr ) const
+{
+ const sal_Int32 nCurFont = getCurrentContext().FontId;
+ const_cast<PDFIProcessor*>(this)->setFont( rAttr );
+ const sal_Int32 nFont = getCurrentContext().FontId;
+ const_cast<PDFIProcessor*>(this)->getCurrentContext().FontId = nCurFont;
+
+ return nFont;
+}
+
+// line diagnose block - start
+void PDFIProcessor::processGlyphLine()
+{
+ if (m_GlyphsList.empty())
+ return;
+
+ double spaceDetectBoundary = 0.0;
+
+ // Try to find space glyph and its width
+ for (CharGlyph & i : m_GlyphsList)
+ {
+ OUString& glyph = i.getGlyph();
+
+ sal_Unicode ch = '\0';
+ if (!glyph.isEmpty())
+ ch = glyph[0];
+
+ if ((ch == 0x20) || (ch == 0xa0))
+ {
+ double spaceWidth = i.getWidth();
+ spaceDetectBoundary = spaceWidth * 0.5;
+ break;
+ }
+ }
+
+ // If space glyph is not found, use average glyph width instead
+ if (spaceDetectBoundary == 0.0)
+ {
+ double avgGlyphWidth = 0.0;
+ for (const CharGlyph & i : m_GlyphsList)
+ avgGlyphWidth += i.getWidth();
+ avgGlyphWidth /= m_GlyphsList.size();
+ spaceDetectBoundary = avgGlyphWidth * 0.2;
+ }
+
+ FrameElement* frame = ElementFactory::createFrameElement(
+ m_GlyphsList[0].getCurElement(),
+ getGCId(m_GlyphsList[0].getGC()));
+ frame->ZOrder = m_nNextZOrder++;
+ frame->IsForText = true;
+ frame->FontSize = getFont(m_GlyphsList[0].getGC().FontId).size;
+ ParagraphElement* para = ElementFactory::createParagraphElement(frame);
+
+ for (size_t i = 0; i < m_GlyphsList.size(); i++)
+ {
+ bool prependSpace = false;
+ TextElement* text = ElementFactory::createTextElement(
+ para,
+ getGCId(m_GlyphsList[i].getGC()),
+ m_GlyphsList[i].getGC().FontId);
+ if (i == 0)
+ {
+ text->x = m_GlyphsList[0].getGC().Transformation.get(0, 2);
+ text->y = m_GlyphsList[0].getGC().Transformation.get(1, 2);
+ text->w = 0;
+ text->h = 0;
+ para->updateGeometryWith(text);
+ frame->updateGeometryWith(para);
+ }
+ else
+ {
+ double spaceSize = m_GlyphsList[i].getPrevSpaceWidth();
+ prependSpace = spaceSize > spaceDetectBoundary;
+ }
+ if (prependSpace)
+ text->Text.append(" ");
+ text->Text.append(m_GlyphsList[i].getGlyph());
+ }
+
+ m_GlyphsList.clear();
+}
+
+void PDFIProcessor::drawGlyphs( const OUString& rGlyphs,
+ const geometry::RealRectangle2D& rRect,
+ const geometry::Matrix2D& rFontMatrix,
+ double fontSize)
+{
+ double ascent = getFont(getCurrentContext().FontId).ascent;
+
+ basegfx::B2DHomMatrix fontMatrix(
+ rFontMatrix.m00, rFontMatrix.m01, 0.0,
+ rFontMatrix.m10, rFontMatrix.m11, 0.0);
+ fontMatrix.scale(fontSize, fontSize);
+
+ basegfx::B2DHomMatrix totalTextMatrix1(fontMatrix);
+ basegfx::B2DHomMatrix totalTextMatrix2(fontMatrix);
+ totalTextMatrix1.translate(rRect.X1, rRect.Y1);
+ totalTextMatrix2.translate(rRect.X2, rRect.Y2);
+
+ basegfx::B2DHomMatrix corrMatrix;
+ corrMatrix.scale(1.0, -1.0);
+ corrMatrix.translate(0.0, ascent);
+ totalTextMatrix1 = totalTextMatrix1 * corrMatrix;
+ totalTextMatrix2 = totalTextMatrix2 * corrMatrix;
+
+ totalTextMatrix1 *= getCurrentContext().Transformation;
+ totalTextMatrix2 *= getCurrentContext().Transformation;
+
+ basegfx::B2DHomMatrix invMatrix(totalTextMatrix1);
+ basegfx::B2DHomMatrix invPrevMatrix(prevTextMatrix);
+ invMatrix.invert();
+ invPrevMatrix.invert();
+ basegfx::B2DHomMatrix offsetMatrix1(totalTextMatrix1);
+ basegfx::B2DHomMatrix offsetMatrix2(totalTextMatrix2);
+ offsetMatrix1 *= invPrevMatrix;
+ offsetMatrix2 *= invMatrix;
+
+ double charWidth = offsetMatrix2.get(0, 2);
+ double prevSpaceWidth = offsetMatrix1.get(0, 2) - prevCharWidth;
+
+ if ((totalTextMatrix1.get(0, 0) != prevTextMatrix.get(0, 0)) ||
+ (totalTextMatrix1.get(0, 1) != prevTextMatrix.get(0, 1)) ||
+ (totalTextMatrix1.get(1, 0) != prevTextMatrix.get(1, 0)) ||
+ (totalTextMatrix1.get(1, 1) != prevTextMatrix.get(1, 1)) ||
+ (offsetMatrix1.get(0, 2) < 0.0) ||
+ (prevSpaceWidth > prevCharWidth * 1.3) ||
+ (!basegfx::fTools::equalZero(offsetMatrix1.get(1, 2), 0.0001)))
+ {
+ processGlyphLine();
+ }
+
+ CharGlyph aGlyph(m_pCurElement, getCurrentContext(), charWidth, prevSpaceWidth, rGlyphs);
+ aGlyph.getGC().Transformation = totalTextMatrix1;
+ m_GlyphsList.push_back(aGlyph);
+
+ prevCharWidth = charWidth;
+ prevTextMatrix = totalTextMatrix1;
+}
+
+void PDFIProcessor::endText()
+{
+ TextElement* pText = dynamic_cast<TextElement*>(m_pCurElement);
+ if( pText )
+ m_pCurElement = pText->Parent;
+}
+
+void PDFIProcessor::setupImage(ImageId nImage)
+{
+ const GraphicsContext& rGC(getCurrentContext());
+
+ basegfx::B2DTuple aScale, aTranslation;
+ double fRotate, fShearX;
+ rGC.Transformation.decompose(aScale, aTranslation, fRotate, fShearX);
+
+ const sal_Int32 nGCId = getGCId(rGC);
+ FrameElement* pFrame = ElementFactory::createFrameElement( m_pCurElement, nGCId );
+ ImageElement* pImageElement = ElementFactory::createImageElement( pFrame, nGCId, nImage );
+ pFrame->x = pImageElement->x = aTranslation.getX();
+ pFrame->y = pImageElement->y = aTranslation.getY();
+ pFrame->w = pImageElement->w = aScale.getX();
+ pFrame->h = pImageElement->h = aScale.getY();
+ pFrame->ZOrder = m_nNextZOrder++;
+
+ // Poppler wrapper takes into account that vertical axes of PDF and ODF are opposite,
+ // and it flips matrix vertically (see poppler's GfxState::GfxState()).
+ // But image internal vertical axis is independent of PDF vertical axis direction,
+ // so arriving matrix is extra-flipped relative to image.
+ // We force vertical flip here to compensate that.
+ pFrame->MirrorVertical = true;
+}
+
+void PDFIProcessor::drawMask(const uno::Sequence<beans::PropertyValue>& xBitmap,
+ bool /*bInvert*/ )
+{
+ // TODO(F3): Handle mask and inversion
+ setupImage( m_aImages.addImage(xBitmap) );
+}
+
+void PDFIProcessor::drawImage(const uno::Sequence<beans::PropertyValue>& xBitmap )
+{
+ setupImage( m_aImages.addImage(xBitmap) );
+}
+
+void PDFIProcessor::drawColorMaskedImage(const uno::Sequence<beans::PropertyValue>& xBitmap,
+ const uno::Sequence<uno::Any>& /*xMaskColors*/ )
+{
+ // TODO(F3): Handle mask colors
+ setupImage( m_aImages.addImage(xBitmap) );
+}
+
+void PDFIProcessor::drawMaskedImage(const uno::Sequence<beans::PropertyValue>& xBitmap,
+ const uno::Sequence<beans::PropertyValue>& /*xMask*/,
+ bool /*bInvertMask*/)
+{
+ // TODO(F3): Handle mask and inversion
+ setupImage( m_aImages.addImage(xBitmap) );
+}
+
+void PDFIProcessor::drawAlphaMaskedImage(const uno::Sequence<beans::PropertyValue>& xBitmap,
+ const uno::Sequence<beans::PropertyValue>& /*xMask*/)
+{
+ // TODO(F3): Handle mask
+
+ setupImage( m_aImages.addImage(xBitmap) );
+
+}
+
+void PDFIProcessor::strokePath( const uno::Reference< rendering::XPolyPolygon2D >& rPath )
+{
+ basegfx::B2DPolyPolygon aPoly=basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
+ aPoly.transform(getCurrentContext().Transformation);
+
+ PolyPolyElement* pPoly = ElementFactory::createPolyPolyElement(
+ m_pCurElement,
+ getGCId(getCurrentContext()),
+ aPoly,
+ PATH_STROKE );
+ pPoly->updateGeometry();
+ pPoly->ZOrder = m_nNextZOrder++;
+}
+
+void PDFIProcessor::fillPath( const uno::Reference< rendering::XPolyPolygon2D >& rPath )
+{
+ basegfx::B2DPolyPolygon aPoly=basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
+ aPoly.transform(getCurrentContext().Transformation);
+
+ PolyPolyElement* pPoly = ElementFactory::createPolyPolyElement(
+ m_pCurElement,
+ getGCId(getCurrentContext()),
+ aPoly,
+ PATH_FILL );
+ pPoly->updateGeometry();
+ pPoly->ZOrder = m_nNextZOrder++;
+}
+
+void PDFIProcessor::eoFillPath( const uno::Reference< rendering::XPolyPolygon2D >& rPath )
+{
+ basegfx::B2DPolyPolygon aPoly=basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
+ aPoly.transform(getCurrentContext().Transformation);
+
+ PolyPolyElement* pPoly = ElementFactory::createPolyPolyElement(
+ m_pCurElement,
+ getGCId(getCurrentContext()),
+ aPoly,
+ PATH_EOFILL );
+ pPoly->updateGeometry();
+ pPoly->ZOrder = m_nNextZOrder++;
+}
+
+void PDFIProcessor::intersectClip(const uno::Reference< rendering::XPolyPolygon2D >& rPath)
+{
+ // TODO(F3): interpret fill mode
+ basegfx::B2DPolyPolygon aNewClip = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
+ aNewClip.transform(getCurrentContext().Transformation);
+ basegfx::B2DPolyPolygon aCurClip = getCurrentContext().Clip;
+
+ if( aCurClip.count() ) // #i92985# adapted API from (..., false, false) to (..., true, false)
+ aNewClip = basegfx::utils::clipPolyPolygonOnPolyPolygon( aCurClip, aNewClip, true, false );
+
+ getCurrentContext().Clip = aNewClip;
+}
+
+void PDFIProcessor::intersectEoClip(const uno::Reference< rendering::XPolyPolygon2D >& rPath)
+{
+ // TODO(F3): interpret fill mode
+ basegfx::B2DPolyPolygon aNewClip = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
+ aNewClip.transform(getCurrentContext().Transformation);
+ basegfx::B2DPolyPolygon aCurClip = getCurrentContext().Clip;
+
+ if( aCurClip.count() ) // #i92985# adapted API from (..., false, false) to (..., true, false)
+ aNewClip = basegfx::utils::clipPolyPolygonOnPolyPolygon( aCurClip, aNewClip, true, false );
+
+ getCurrentContext().Clip = aNewClip;
+}
+
+void PDFIProcessor::hyperLink( const geometry::RealRectangle2D& rBounds,
+ const OUString& rURI )
+{
+ if( !rURI.isEmpty() )
+ {
+ HyperlinkElement* pLink = ElementFactory::createHyperlinkElement(
+ &m_pCurPage->Hyperlinks,
+ rURI );
+ pLink->x = rBounds.X1;
+ pLink->y = rBounds.Y1;
+ pLink->w = rBounds.X2-rBounds.X1;
+ pLink->h = rBounds.Y2-rBounds.Y1;
+ }
+}
+
+const FontAttributes& PDFIProcessor::getFont( sal_Int32 nFontId ) const
+{
+ IdToFontMap::const_iterator it = m_aIdToFont.find( nFontId );
+ if( it == m_aIdToFont.end() )
+ it = m_aIdToFont.find( 0 );
+ return it->second;
+}
+
+sal_Int32 PDFIProcessor::getGCId( const GraphicsContext& rGC )
+{
+ sal_Int32 nGCId = 0;
+ auto it = m_aGCToId.find( rGC );
+ if( it != m_aGCToId.end() )
+ nGCId = it->second;
+ else
+ {
+ m_aGCToId.insert({rGC, m_nNextGCId});
+ m_aIdToGC.insert({m_nNextGCId, rGC});
+ nGCId = m_nNextGCId;
+ m_nNextGCId++;
+ }
+
+ return nGCId;
+}
+
+const GraphicsContext& PDFIProcessor::getGraphicsContext( sal_Int32 nGCId ) const
+{
+ auto it = m_aIdToGC.find( nGCId );
+ if( it == m_aIdToGC.end() )
+ it = m_aIdToGC.find( 0 );
+ return it->second;
+}
+
+void PDFIProcessor::endPage()
+{
+ processGlyphLine(); // draw last line
+ if( m_xStatusIndicator.is()
+ && m_pCurPage
+ && m_pCurPage->PageNumber == m_nPages
+ )
+ m_xStatusIndicator->end();
+}
+
+void PDFIProcessor::startPage( const geometry::RealSize2D& rSize )
+{
+ // initial clip is to page bounds
+ getCurrentContext().Clip = basegfx::B2DPolyPolygon(
+ basegfx::utils::createPolygonFromRect(
+ basegfx::B2DRange( 0, 0, rSize.Width, rSize.Height )));
+
+ sal_Int32 nNextPageNr = m_pCurPage ? m_pCurPage->PageNumber+1 : 1;
+ if( m_xStatusIndicator.is() )
+ {
+ if( nNextPageNr == 1 )
+ startIndicator( " " );
+ m_xStatusIndicator->setValue( nNextPageNr );
+ }
+ m_pCurPage = ElementFactory::createPageElement(m_pDocument.get(), nNextPageNr);
+ m_pCurElement = m_pCurPage;
+ m_pCurPage->w = rSize.Width;
+ m_pCurPage->h = rSize.Height;
+ m_nNextZOrder = 1;
+
+
+}
+
+void PDFIProcessor::emit( XmlEmitter& rEmitter,
+ const TreeVisitorFactory& rVisitorFactory )
+{
+#if OSL_DEBUG_LEVEL > 0
+ m_pDocument->emitStructure( 0 );
+#endif
+
+ ElementTreeVisitorSharedPtr optimizingVisitor(
+ rVisitorFactory.createOptimizingVisitor(*this));
+ // FIXME: localization
+ startIndicator( " " );
+ m_pDocument->visitedBy( *optimizingVisitor, std::list<std::unique_ptr<Element>>::const_iterator());
+
+#if OSL_DEBUG_LEVEL > 0
+ m_pDocument->emitStructure( 0 );
+#endif
+
+ // get styles
+ StyleContainer aStyles;
+ ElementTreeVisitorSharedPtr finalizingVisitor(
+ rVisitorFactory.createStyleCollectingVisitor(aStyles,*this));
+ // FIXME: localization
+
+ m_pDocument->visitedBy( *finalizingVisitor, std::list<std::unique_ptr<Element>>::const_iterator() );
+
+ EmitContext aContext( rEmitter, aStyles, m_aImages, *this, m_xStatusIndicator, m_xContext );
+ ElementTreeVisitorSharedPtr aEmittingVisitor(
+ rVisitorFactory.createEmittingVisitor(aContext));
+
+ PropertyMap aProps;
+ // document prolog
+ #define OASIS_STR "urn:oasis:names:tc:opendocument:xmlns:"
+ aProps[ "xmlns:office" ] = OASIS_STR "office:1.0" ;
+ aProps[ "xmlns:style" ] = OASIS_STR "style:1.0" ;
+ aProps[ "xmlns:text" ] = OASIS_STR "text:1.0" ;
+ aProps[ "xmlns:svg" ] = OASIS_STR "svg-compatible:1.0" ;
+ aProps[ "xmlns:table" ] = OASIS_STR "table:1.0" ;
+ aProps[ "xmlns:draw" ] = OASIS_STR "drawing:1.0" ;
+ aProps[ "xmlns:fo" ] = OASIS_STR "xsl-fo-compatible:1.0" ;
+ aProps[ "xmlns:xlink"] = "http://www.w3.org/1999/xlink";
+ aProps[ "xmlns:dc"] = "http://purl.org/dc/elements/1.1/";
+ aProps[ "xmlns:number"] = OASIS_STR "datastyle:1.0" ;
+ aProps[ "xmlns:presentation"] = OASIS_STR "presentation:1.0" ;
+ aProps[ "xmlns:math"] = "http://www.w3.org/1998/Math/MathML";
+ aProps[ "xmlns:form"] = OASIS_STR "form:1.0" ;
+ aProps[ "xmlns:script"] = OASIS_STR "script:1.0" ;
+ aProps[ "xmlns:dom"] = "http://www.w3.org/2001/xml-events";
+ aProps[ "xmlns:xforms"] = "http://www.w3.org/2002/xforms";
+ aProps[ "xmlns:xsd"] = "http://www.w3.org/2001/XMLSchema";
+ aProps[ "xmlns:xsi"] = "http://www.w3.org/2001/XMLSchema-instance";
+ aProps[ "office:version" ] = "1.0";
+
+ aContext.rEmitter.beginTag( "office:document", aProps );
+
+ // emit style list
+ aStyles.emit( aContext, *aEmittingVisitor );
+
+ m_pDocument->visitedBy( *aEmittingVisitor, std::list<std::unique_ptr<Element>>::const_iterator() );
+ aContext.rEmitter.endTag( "office:document" );
+ endIndicator();
+}
+
+void PDFIProcessor::startIndicator( const OUString& rText )
+{
+ sal_Int32 nElements = m_nPages;
+ if( !m_xStatusIndicator.is() )
+ return;
+
+ sal_Int32 nLength = rText.getLength();
+ OUStringBuffer aStr( nLength*2 );
+ const sal_Unicode* pText = rText.getStr();
+ for( int i = 0; i < nLength; i++ )
+ {
+ if( nLength-i > 1&&
+ pText[i] == '%' &&
+ pText[i+1] == 'd'
+ )
+ {
+ aStr.append( nElements );
+ i++;
+ }
+ else
+ aStr.append( pText[i] );
+ }
+ m_xStatusIndicator->start( aStr.makeStringAndClear(), nElements );
+}
+
+void PDFIProcessor::endIndicator()
+{
+ if( m_xStatusIndicator.is() )
+ m_xStatusIndicator->end();
+}
+
+static bool lr_tb_sort( std::unique_ptr<Element> const & pLeft, std::unique_ptr<Element> const & pRight )
+{
+ // Ensure irreflexivity (which could be compromised if h or w is negative):
+ if (pLeft == pRight)
+ return false;
+
+ // first: top-bottom sorting
+
+ // Note: allow for 10% overlap on text lines since text lines are usually
+ // of the same order as font height whereas the real paint area
+ // of text is usually smaller
+ double fudge_factor_left = 0.0, fudge_factor_right = 0.0;
+ if( dynamic_cast< TextElement* >(pLeft.get()) )
+ fudge_factor_left = 0.1;
+ if (dynamic_cast< TextElement* >(pRight.get()))
+ fudge_factor_right = 0.1;
+
+ // Allow negative height
+ double lower_boundary_left = pLeft->y + std::max(pLeft->h, 0.0) - fabs(pLeft->h) * fudge_factor_left;
+ double lower_boundary_right = pRight->y + std::max(pRight->h, 0.0) - fabs(pRight->h) * fudge_factor_right;
+ double upper_boundary_left = pLeft->y + std::min(pLeft->h, 0.0);
+ double upper_boundary_right = pRight->y + std::min(pRight->h, 0.0);
+ // if left's lower boundary is above right's upper boundary
+ // then left is smaller
+ if( lower_boundary_left < upper_boundary_right )
+ return true;
+ // if right's lower boundary is above left's upper boundary
+ // then left is definitely not smaller
+ if( lower_boundary_right < upper_boundary_left )
+ return false;
+
+ // Allow negative width
+ double left_boundary_left = pLeft->y + std::min(pLeft->w, 0.0);
+ double left_boundary_right = pRight->y + std::min(pRight->w, 0.0);
+ double right_boundary_left = pLeft->y + std::max(pLeft->w, 0.0);
+ double right_boundary_right = pRight->y + std::max(pRight->w, 0.0);
+ // by now we have established that left and right are inside
+ // a "line", that is they have vertical overlap
+ // second: left-right sorting
+ // if left's right boundary is left to right's left boundary
+ // then left is smaller
+ if( right_boundary_left < left_boundary_right )
+ return true;
+ // if right's right boundary is left to left's left boundary
+ // then left is definitely not smaller
+ if( right_boundary_right < left_boundary_left )
+ return false;
+
+ // here we have established vertical and horizontal overlap
+ // so sort left first, top second
+ if( pLeft->x < pRight->x )
+ return true;
+ if( pRight->x < pLeft->x )
+ return false;
+ if( pLeft->y < pRight->y )
+ return true;
+
+ return false;
+}
+
+void PDFIProcessor::sortElements(Element* pEle)
+{
+ if( pEle->Children.empty() )
+ return;
+
+ // sort method from std::list is equivalent to stable_sort
+ // See S Meyers, Effective STL
+ pEle->Children.sort(lr_tb_sort);
+}
+
+/* Produce mirrored-image for each code point which has the Bidi_Mirrored property, within a string.
+ This need to be done in forward order.
+*/
+OUString PDFIProcessor::SubstituteBidiMirrored(const OUString& rString)
+{
+ const sal_Int32 nLen = rString.getLength();
+ OUStringBuffer aMirror(nLen);
+
+ for (sal_Int32 i = 0; i < nLen;) {
+ const sal_uInt32 nCodePoint = rString.iterateCodePoints(&i);
+ aMirror.appendUtf32(unicode::GetMirroredChar(nCodePoint));
+ }
+ return aMirror.makeStringAndClear();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/tree/style.cxx b/sdext/source/pdfimport/tree/style.cxx
new file mode 100644
index 000000000..b1cb02a48
--- /dev/null
+++ b/sdext/source/pdfimport/tree/style.cxx
@@ -0,0 +1,248 @@
+/* -*- 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 "style.hxx"
+#include <genericelements.hxx>
+#include <xmlemitter.hxx>
+#include <rtl/ustrbuf.hxx>
+
+#include <algorithm>
+#include <string_view>
+
+using namespace pdfi;
+
+
+StyleContainer::StyleContainer() :
+ m_nNextId( 1 )
+{
+}
+
+sal_Int32 StyleContainer::impl_getStyleId( const Style& rStyle, bool bSubStyle )
+{
+ sal_Int32 nRet = -1;
+
+ // construct HashedStyle to find or insert
+ HashedStyle aSearchStyle;
+ aSearchStyle.Name = rStyle.Name;
+ aSearchStyle.Properties = rStyle.Properties;
+ aSearchStyle.Contents = rStyle.Contents;
+ aSearchStyle.ContainedElement = rStyle.ContainedElement;
+ for(Style* pSubStyle : rStyle.SubStyles)
+ aSearchStyle.SubStyles.push_back( impl_getStyleId( *pSubStyle, true ) );
+
+ std::unordered_map< HashedStyle, sal_Int32, StyleHash >::iterator it =
+ m_aStyleToId.find( aSearchStyle );
+
+ if( it != m_aStyleToId.end() )
+ {
+ nRet = it->second;
+ RefCountedHashedStyle& rFound = m_aIdToStyle[ nRet ];
+ // increase refcount on this style
+ rFound.RefCount++;
+ if( ! bSubStyle )
+ rFound.style.IsSubStyle = false;
+ }
+ else
+ {
+ nRet = m_nNextId++;
+ // create new style
+ RefCountedHashedStyle& rNew = m_aIdToStyle[ nRet ];
+ rNew.style = aSearchStyle;
+ rNew.RefCount = 1;
+ rNew.style.IsSubStyle = bSubStyle;
+ // fill the style hash to find the id
+ m_aStyleToId[ rNew.style ] = nRet;
+ }
+ return nRet;
+}
+
+sal_Int32 StyleContainer::getStandardStyleId( std::string_view rName )
+{
+ PropertyMap aProps;
+ aProps[ "style:family" ] = OStringToOUString( rName, RTL_TEXTENCODING_UTF8 );
+ aProps[ "style:name" ] = "standard";
+
+ Style aStyle( "style:style", std::move(aProps) );
+ return getStyleId( aStyle );
+}
+
+const PropertyMap* StyleContainer::getProperties( sal_Int32 nStyleId ) const
+{
+ std::unordered_map< sal_Int32, RefCountedHashedStyle >::const_iterator it =
+ m_aIdToStyle.find( nStyleId );
+ return it != m_aIdToStyle.end() ? &(it->second.style.Properties) : nullptr;
+}
+
+sal_Int32 StyleContainer::setProperties( sal_Int32 nStyleId, PropertyMap&& rNewProps )
+{
+ sal_Int32 nRet = -1;
+ std::unordered_map< sal_Int32, RefCountedHashedStyle >::iterator it =
+ m_aIdToStyle.find( nStyleId );
+ if( it != m_aIdToStyle.end() )
+ {
+ if( it->second.RefCount == 1 )
+ {
+ nRet = it->first;
+ // erase old hash to id mapping
+ m_aStyleToId.erase( it->second.style );
+ // change properties
+ it->second.style.Properties = std::move(rNewProps);
+ // fill in new hash to id mapping
+ m_aStyleToId[ it->second.style ] = nRet;
+ }
+ else
+ {
+ // decrease refcount on old instance
+ it->second.RefCount--;
+ // acquire new HashedStyle
+ HashedStyle aSearchStyle;
+ aSearchStyle.Name = it->second.style.Name;
+ aSearchStyle.Properties = std::move(rNewProps);
+ aSearchStyle.Contents = it->second.style.Contents;
+ aSearchStyle.ContainedElement = it->second.style.ContainedElement;
+ aSearchStyle.SubStyles = it->second.style.SubStyles;
+ aSearchStyle.IsSubStyle = it->second.style.IsSubStyle;
+
+ // find out whether this new style already exists
+ std::unordered_map< HashedStyle, sal_Int32, StyleHash >::iterator new_it =
+ m_aStyleToId.find( aSearchStyle );
+ if( new_it != m_aStyleToId.end() )
+ {
+ nRet = new_it->second;
+ m_aIdToStyle[ nRet ].RefCount++;
+ }
+ else
+ {
+ nRet = m_nNextId++;
+ // create new style with new id
+ RefCountedHashedStyle& rNew = m_aIdToStyle[ nRet ];
+ rNew.style = aSearchStyle;
+ rNew.RefCount = 1;
+ // fill style to id hash
+ m_aStyleToId[ aSearchStyle ] = nRet;
+ }
+ }
+ }
+ return nRet;
+}
+
+OUString StyleContainer::getStyleName( sal_Int32 nStyle ) const
+{
+ OUStringBuffer aRet( 64 );
+
+ std::unordered_map< sal_Int32, RefCountedHashedStyle >::const_iterator style_it =
+ m_aIdToStyle.find( nStyle );
+ if( style_it != m_aIdToStyle.end() )
+ {
+ const HashedStyle& rStyle = style_it->second.style;
+
+ PropertyMap::const_iterator name_it = rStyle.Properties.find( "style:name" );
+ if( name_it != rStyle.Properties.end() )
+ aRet.append( name_it->second );
+ else
+ {
+ PropertyMap::const_iterator fam_it = rStyle.Properties.find( "style:family" );
+ OUString aStyleName;
+ if( fam_it != rStyle.Properties.end() )
+ {
+ aStyleName = fam_it->second;
+ }
+ else
+ aStyleName = OStringToOUString( rStyle.Name, RTL_TEXTENCODING_ASCII_US );
+ sal_Int32 nIndex = aStyleName.lastIndexOf( ':' );
+ aRet.append( aStyleName.subView(nIndex+1) );
+ aRet.append( nStyle );
+ }
+ }
+ else
+ {
+ aRet.append( "invalid style id " );
+ aRet.append( nStyle );
+ }
+
+ return aRet.makeStringAndClear();
+}
+
+void StyleContainer::impl_emitStyle( sal_Int32 nStyleId,
+ EmitContext& rContext,
+ ElementTreeVisitor& rContainedElemVisitor )
+{
+ std::unordered_map< sal_Int32, RefCountedHashedStyle >::const_iterator it = m_aIdToStyle.find( nStyleId );
+ if( it == m_aIdToStyle.end() )
+ return;
+
+ const HashedStyle& rStyle = it->second.style;
+ PropertyMap aProps( rStyle.Properties );
+ if( !rStyle.IsSubStyle )
+ aProps[ "style:name" ] = getStyleName( nStyleId );
+ if (rStyle.Name == "draw:stroke-dash")
+ aProps[ "draw:name" ] = aProps[ "style:name" ];
+ rContext.rEmitter.beginTag( rStyle.Name.getStr(), aProps );
+
+ for(sal_Int32 nSubStyle : rStyle.SubStyles)
+ impl_emitStyle( nSubStyle, rContext, rContainedElemVisitor );
+ if( !rStyle.Contents.isEmpty() )
+ rContext.rEmitter.write( rStyle.Contents );
+ if( rStyle.ContainedElement )
+ rStyle.ContainedElement->visitedBy( rContainedElemVisitor,
+ std::list<std::unique_ptr<Element>>::iterator() );
+ rContext.rEmitter.endTag( rStyle.Name.getStr() );
+}
+
+void StyleContainer::emit( EmitContext& rContext,
+ ElementTreeVisitor& rContainedElemVisitor )
+{
+ std::vector< sal_Int32 > aMasterPageSection, aAutomaticStyleSection, aOfficeStyleSection;
+ for( const auto& rEntry : m_aIdToStyle )
+ {
+ if( ! rEntry.second.style.IsSubStyle )
+ {
+ if( rEntry.second.style.Name == "style:master-page" )
+ aMasterPageSection.push_back( rEntry.first );
+ else if( getStyleName( rEntry.first ) == "standard" )
+ aOfficeStyleSection.push_back( rEntry.first );
+ else
+ aAutomaticStyleSection.push_back( rEntry.first );
+ }
+ }
+
+ if( ! aMasterPageSection.empty() )
+ std::stable_sort( aMasterPageSection.begin(), aMasterPageSection.end(), StyleIdNameSort(&m_aIdToStyle) );
+ if( ! aAutomaticStyleSection.empty() )
+ std::stable_sort( aAutomaticStyleSection.begin(), aAutomaticStyleSection.end(), StyleIdNameSort(&m_aIdToStyle) );
+ if( ! aOfficeStyleSection.empty() )
+ std::stable_sort( aOfficeStyleSection.begin(), aOfficeStyleSection.end(), StyleIdNameSort(&m_aIdToStyle) );
+
+ int n = 0, nElements = 0;
+ rContext.rEmitter.beginTag( "office:styles", PropertyMap() );
+ for( n = 0, nElements = aOfficeStyleSection.size(); n < nElements; n++ )
+ impl_emitStyle( aOfficeStyleSection[n], rContext, rContainedElemVisitor );
+ rContext.rEmitter.endTag( "office:styles" );
+ rContext.rEmitter.beginTag( "office:automatic-styles", PropertyMap() );
+ for( n = 0, nElements = aAutomaticStyleSection.size(); n < nElements; n++ )
+ impl_emitStyle( aAutomaticStyleSection[n], rContext, rContainedElemVisitor );
+ rContext.rEmitter.endTag( "office:automatic-styles" );
+ rContext.rEmitter.beginTag( "office:master-styles", PropertyMap() );
+ for( n = 0, nElements = aMasterPageSection.size(); n < nElements; n++ )
+ impl_emitStyle( aMasterPageSection[n], rContext, rContainedElemVisitor );
+ rContext.rEmitter.endTag( "office:master-styles" );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/tree/style.hxx b/sdext/source/pdfimport/tree/style.hxx
new file mode 100644
index 000000000..572be241e
--- /dev/null
+++ b/sdext/source/pdfimport/tree/style.hxx
@@ -0,0 +1,166 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_TREE_STYLE_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_TREE_STYLE_HXX
+
+#include <pdfihelper.hxx>
+#include <numeric>
+#include <string_view>
+#include <unordered_map>
+#include <vector>
+#include <rtl/ustring.hxx>
+#include <rtl/string.hxx>
+#include <treevisiting.hxx>
+
+namespace pdfi
+{
+ struct Element;
+ struct EmitContext;
+
+ class StyleContainer
+ {
+ public:
+ struct Style
+ {
+ OString Name;
+ PropertyMap Properties;
+ OUString Contents;
+ Element* ContainedElement;
+ std::vector< Style* > SubStyles;
+
+ Style( const OString& rName, PropertyMap&& rProps ) :
+ Name( rName ),
+ Properties( std::move(rProps) ),
+ ContainedElement( nullptr )
+ {}
+ };
+
+ private:
+ struct HashedStyle
+ {
+ OString Name;
+ PropertyMap Properties;
+ OUString Contents;
+ Element* ContainedElement;
+ std::vector<sal_Int32> SubStyles;
+
+ bool IsSubStyle;
+
+ HashedStyle() : ContainedElement( nullptr ), IsSubStyle( true ) {}
+
+ size_t hashCode() const
+ {
+ size_t nRet = std::accumulate(Properties.begin(), Properties.end(), size_t(Name.hashCode()),
+ [](const size_t& sum, const PropertyMap::value_type& rEntry) {
+ return sum ^ size_t(rEntry.first.hashCode()) ^ size_t(rEntry.second.hashCode());
+ });
+ nRet ^= size_t(Contents.hashCode());
+ nRet ^= reinterpret_cast<size_t>(ContainedElement);
+ for( size_t n = 0; n < SubStyles.size(); ++n )
+ nRet ^= size_t(SubStyles[n]);
+ return nRet;
+ }
+
+ bool operator==(const HashedStyle& rRight) const
+ {
+ if( Name != rRight.Name ||
+ Properties != rRight.Properties ||
+ Contents != rRight.Contents ||
+ ContainedElement != rRight.ContainedElement ||
+ SubStyles.size() != rRight.SubStyles.size()
+ )
+ return false;
+ for( size_t n = 0; n < SubStyles.size(); ++n )
+ {
+ if( SubStyles[n] != rRight.SubStyles[n] )
+ return false;
+ }
+ return true;
+ }
+ };
+
+ struct RefCountedHashedStyle {
+ HashedStyle style;
+ sal_Int32 RefCount = 0;
+ };
+
+ struct StyleHash;
+ friend struct StyleHash;
+ struct StyleHash
+ {
+ size_t operator()( const StyleContainer::HashedStyle& rStyle ) const
+ {
+ return rStyle.hashCode();
+ }
+ };
+
+ struct StyleIdNameSort;
+ friend struct StyleIdNameSort;
+ struct StyleIdNameSort
+ {
+ const std::unordered_map< sal_Int32, RefCountedHashedStyle >* m_pMap;
+
+ explicit StyleIdNameSort( const std::unordered_map< sal_Int32, RefCountedHashedStyle >* pMap ) :
+ m_pMap(pMap)
+ {}
+ bool operator()( sal_Int32 nLeft, sal_Int32 nRight )
+ {
+ const std::unordered_map< sal_Int32, RefCountedHashedStyle >::const_iterator left_it =
+ m_pMap->find( nLeft );
+ const std::unordered_map< sal_Int32, RefCountedHashedStyle >::const_iterator right_it =
+ m_pMap->find( nRight );
+ if( left_it == m_pMap->end() )
+ return false;
+ else if( right_it == m_pMap->end() )
+ return true;
+ else
+ return left_it->second.style.Name < right_it->second.style.Name;
+ }
+ };
+
+ sal_Int32 m_nNextId;
+ std::unordered_map< sal_Int32, RefCountedHashedStyle > m_aIdToStyle;
+ std::unordered_map< HashedStyle, sal_Int32, StyleHash > m_aStyleToId;
+
+ void impl_emitStyle( sal_Int32 nStyleId,
+ EmitContext& rContext,
+ ElementTreeVisitor& rContainedElemVisitor );
+
+ public:
+ StyleContainer();
+
+ void emit( EmitContext& rContext,
+ ElementTreeVisitor& rContainedElemVisitor );
+
+ sal_Int32 impl_getStyleId( const Style& rStyle, bool bSubStyle );
+ sal_Int32 getStyleId( const Style& rStyle )
+ { return impl_getStyleId( rStyle, false ); }
+ sal_Int32 getStandardStyleId( std::string_view rFamily );
+
+ // returns NULL for an invalid style id
+ const PropertyMap* getProperties( sal_Int32 nStyleId ) const;
+ sal_Int32 setProperties( sal_Int32 nStyleId, PropertyMap&& rNewProps );
+ OUString getStyleName( sal_Int32 nStyle ) const;
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/tree/treevisitorfactory.cxx b/sdext/source/pdfimport/tree/treevisitorfactory.cxx
new file mode 100644
index 000000000..495bf0bcb
--- /dev/null
+++ b/sdext/source/pdfimport/tree/treevisitorfactory.cxx
@@ -0,0 +1,111 @@
+/* -*- 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 <treevisitorfactory.hxx>
+#include "writertreevisiting.hxx"
+#include "drawtreevisiting.hxx"
+
+namespace pdfi
+{
+ namespace {
+
+ struct WriterTreeVisitorFactory : public TreeVisitorFactory
+ {
+ WriterTreeVisitorFactory() {}
+
+ virtual std::shared_ptr<ElementTreeVisitor> createOptimizingVisitor(PDFIProcessor& rProc) const override
+ {
+ return std::make_shared<WriterXmlOptimizer>(rProc);
+ }
+
+ virtual std::shared_ptr<ElementTreeVisitor> createStyleCollectingVisitor(
+ StyleContainer& rStyles,
+ PDFIProcessor& rProc ) const override
+ {
+ return std::make_shared<WriterXmlFinalizer>(rStyles,rProc);
+ }
+
+ virtual std::shared_ptr<ElementTreeVisitor> createEmittingVisitor(EmitContext& rEmitContext) const override
+ {
+ return std::make_shared<WriterXmlEmitter>(rEmitContext);
+ }
+ };
+
+ struct ImpressTreeVisitorFactory : public TreeVisitorFactory
+ {
+ ImpressTreeVisitorFactory() {}
+
+ virtual std::shared_ptr<ElementTreeVisitor> createOptimizingVisitor(PDFIProcessor& rProc) const override
+ {
+ return std::make_shared<DrawXmlOptimizer>(rProc);
+ }
+
+ virtual std::shared_ptr<ElementTreeVisitor> createStyleCollectingVisitor(
+ StyleContainer& rStyles,
+ PDFIProcessor& rProc ) const override
+ {
+ return std::make_shared<DrawXmlFinalizer>(rStyles,rProc);
+ }
+
+ virtual std::shared_ptr<ElementTreeVisitor> createEmittingVisitor(EmitContext& rEmitContext) const override
+ {
+ return std::make_shared<DrawXmlEmitter>(rEmitContext, DrawXmlEmitter::IMPRESS_DOC);
+ }
+ };
+
+ struct DrawTreeVisitorFactory : public TreeVisitorFactory
+ {
+ DrawTreeVisitorFactory() {}
+
+ virtual std::shared_ptr<ElementTreeVisitor> createOptimizingVisitor(PDFIProcessor& rProc) const override
+ {
+ return std::make_shared<DrawXmlOptimizer>(rProc);
+ }
+
+ virtual std::shared_ptr<ElementTreeVisitor> createStyleCollectingVisitor(
+ StyleContainer& rStyles,
+ PDFIProcessor& rProc ) const override
+ {
+ return std::make_shared<DrawXmlFinalizer>(rStyles,rProc);
+ }
+
+ virtual std::shared_ptr<ElementTreeVisitor> createEmittingVisitor(EmitContext& rEmitContext) const override
+ {
+ return std::make_shared<DrawXmlEmitter>(rEmitContext, DrawXmlEmitter::DRAW_DOC);
+ }
+ };
+
+ }
+
+ TreeVisitorFactorySharedPtr createWriterTreeVisitorFactory()
+ {
+ return std::make_shared<WriterTreeVisitorFactory>();
+ }
+ TreeVisitorFactorySharedPtr createImpressTreeVisitorFactory()
+ {
+ return std::make_shared<ImpressTreeVisitorFactory>();
+ }
+ TreeVisitorFactorySharedPtr createDrawTreeVisitorFactory()
+ {
+ return std::make_shared<DrawTreeVisitorFactory>();
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/tree/writertreevisiting.cxx b/sdext/source/pdfimport/tree/writertreevisiting.cxx
new file mode 100644
index 000000000..52f45ed57
--- /dev/null
+++ b/sdext/source/pdfimport/tree/writertreevisiting.cxx
@@ -0,0 +1,1299 @@
+/* -*- 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 <sal/log.hxx>
+#include <string_view>
+
+#include <pdfiprocessor.hxx>
+#include <xmlemitter.hxx>
+#include <pdfihelper.hxx>
+#include <imagecontainer.hxx>
+#include "style.hxx"
+#include "writertreevisiting.hxx"
+#include <genericelements.hxx>
+
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
+#include <osl/diagnose.h>
+#include <com/sun/star/i18n/CharacterClassification.hpp>
+#include <com/sun/star/i18n/DirectionProperty.hpp>
+#include <comphelper/string.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::i18n;
+using namespace ::com::sun::star::uno;
+
+namespace pdfi
+{
+
+const Reference< XCharacterClassification >& WriterXmlEmitter::GetCharacterClassification()
+{
+ if ( !mxCharClass.is() )
+ {
+ Reference< XComponentContext > xContext( m_rEmitContext.m_xContext, uno::UNO_SET_THROW );
+ mxCharClass = CharacterClassification::create(xContext);
+ }
+ return mxCharClass;
+}
+
+void WriterXmlEmitter::visit( HyperlinkElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ if( elem.Children.empty() )
+ return;
+
+ const char* pType = dynamic_cast<DrawElement*>(elem.Children.front().get()) ? "draw:a" : "text:a";
+
+ PropertyMap aProps;
+ aProps[ "xlink:type" ] = "simple";
+ aProps[ "xlink:href" ] = elem.URI;
+ aProps[ "office:target-frame-name" ] = "_blank";
+ aProps[ "xlink:show" ] = "new";
+
+ m_rEmitContext.rEmitter.beginTag( pType, aProps );
+ auto this_it = elem.Children.begin();
+ while( this_it != elem.Children.end() && this_it->get() != &elem )
+ {
+ (*this_it)->visitedBy( *this, this_it );
+ ++this_it;
+ }
+ m_rEmitContext.rEmitter.endTag( pType );
+}
+
+void WriterXmlEmitter::visit( TextElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ if( elem.Text.isEmpty() )
+ return;
+
+ PropertyMap aProps = {};
+ const sal_Unicode strSpace = 0x0020;
+ const sal_Unicode strNbSpace = 0x00A0;
+ const sal_Unicode tabSpace = 0x0009;
+
+ if( elem.StyleId != -1 )
+ {
+ aProps[ OUString( "text:style-name" ) ] =
+ m_rEmitContext.rStyles.getStyleName( elem.StyleId );
+ }
+
+ OUString str(elem.Text.toString());
+
+ // Check for RTL
+ bool isRTL = false;
+ Reference< i18n::XCharacterClassification > xCC( GetCharacterClassification() );
+ if( xCC.is() )
+ {
+ for(int i=1; i< elem.Text.getLength(); i++)
+ {
+ i18n::DirectionProperty nType = static_cast<i18n::DirectionProperty>(xCC->getCharacterDirection( str, i ));
+ if ( nType == i18n::DirectionProperty_RIGHT_TO_LEFT ||
+ nType == i18n::DirectionProperty_RIGHT_TO_LEFT_ARABIC ||
+ nType == i18n::DirectionProperty_RIGHT_TO_LEFT_EMBEDDING ||
+ nType == i18n::DirectionProperty_RIGHT_TO_LEFT_OVERRIDE
+ )
+ isRTL = true;
+ }
+ }
+
+ if (isRTL) // If so, reverse string
+ {
+ // First, produce mirrored-image for each code point which has the Bidi_Mirrored property.
+ str = PDFIProcessor::SubstituteBidiMirrored(str);
+ // Then, reverse the code points in the string, in backward order.
+ str = ::comphelper::string::reverseCodePoints(str);
+ }
+
+ m_rEmitContext.rEmitter.beginTag( "text:span", aProps );
+
+ sal_Unicode strToken;
+ for (int i = 0; i < elem.Text.getLength(); i++)
+ {
+ strToken = str[i];
+ if (strToken == strSpace || strToken == strNbSpace)
+ {
+ aProps["text:c"] = "1";
+ m_rEmitContext.rEmitter.beginTag("text:s", aProps);
+ m_rEmitContext.rEmitter.endTag("text:s");
+ }
+ else if (strToken == tabSpace)
+ {
+ m_rEmitContext.rEmitter.beginTag("text:tab", aProps);
+ m_rEmitContext.rEmitter.endTag("text:tab");
+ }
+ else
+ m_rEmitContext.rEmitter.write(OUString(strToken));
+ }
+
+ auto this_it = elem.Children.begin();
+ while( this_it != elem.Children.end() && this_it->get() != &elem )
+ {
+ (*this_it)->visitedBy( *this, this_it );
+ ++this_it;
+ }
+
+ m_rEmitContext.rEmitter.endTag( "text:span" );
+}
+
+void WriterXmlEmitter::visit( ParagraphElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ PropertyMap aProps;
+ if( elem.StyleId != -1 )
+ {
+ aProps[ "text:style-name" ] = m_rEmitContext.rStyles.getStyleName( elem.StyleId );
+ }
+ const char* pTagType = "text:p";
+ if( elem.Type == ParagraphElement::Headline )
+ pTagType = "text:h";
+ m_rEmitContext.rEmitter.beginTag( pTagType, aProps );
+
+ auto this_it = elem.Children.begin();
+ while( this_it != elem.Children.end() && this_it->get() != &elem )
+ {
+ (*this_it)->visitedBy( *this, this_it );
+ ++this_it;
+ }
+
+ m_rEmitContext.rEmitter.endTag( pTagType );
+}
+
+void WriterXmlEmitter::fillFrameProps( DrawElement& rElem,
+ PropertyMap& rProps,
+ const EmitContext& rEmitContext )
+{
+ double rel_x = rElem.x, rel_y = rElem.y;
+
+ // find anchor type by recursing though parents
+ Element* pAnchor = &rElem;
+ ParagraphElement* pParaElt = nullptr;
+ PageElement* pPage = nullptr;
+ while ((pAnchor = pAnchor->Parent))
+ {
+ if ((pParaElt = dynamic_cast<ParagraphElement*>(pAnchor)))
+ break;
+ if ((pPage = dynamic_cast<PageElement*>(pAnchor)))
+ break;
+ }
+ if( pAnchor )
+ {
+ if (pParaElt)
+ {
+ rProps[ "text:anchor-type" ] = rElem.isCharacter
+ ? std::u16string_view(u"character") : std::u16string_view(u"paragraph");
+ }
+ else
+ {
+ assert(pPage); // guaranteed by the while loop above
+ rProps[ "text:anchor-type" ] = "page";
+ rProps[ "text:anchor-page-number" ] = OUString::number(pPage->PageNumber);
+ }
+ rel_x -= pAnchor->x;
+ rel_y -= pAnchor->y;
+ }
+
+ rProps[ "draw:z-index" ] = OUString::number( rElem.ZOrder );
+ rProps[ "draw:style-name"] = rEmitContext.rStyles.getStyleName( rElem.StyleId );
+ rProps[ "svg:width" ] = convertPixelToUnitString( rElem.w );
+ rProps[ "svg:height" ] = convertPixelToUnitString( rElem.h );
+
+ const GraphicsContext& rGC =
+ rEmitContext.rProcessor.getGraphicsContext( rElem.GCId );
+ if( rGC.Transformation.isIdentity() )
+ {
+ if( !rElem.isCharacter )
+ {
+ rProps[ "svg:x" ] = convertPixelToUnitString( rel_x );
+ rProps[ "svg:y" ] = convertPixelToUnitString( rel_y );
+ }
+ }
+ else
+ {
+ basegfx::B2DTuple aScale, aTranslation;
+ double fRotate, fShearX;
+
+ rGC.Transformation.decompose( aScale, aTranslation, fRotate, fShearX );
+
+ OUStringBuffer aBuf( 256 );
+
+ // TODO(F2): general transformation case missing; if implemented, note
+ // that ODF rotation is oriented the other way
+
+ // build transformation string
+ if (rElem.MirrorVertical)
+ {
+ // At some point, rElem.h may start arriving positive,
+ // so use robust adjusting math
+ rel_y -= std::abs(rElem.h);
+ if (!aBuf.isEmpty())
+ aBuf.append(' ');
+ aBuf.append("scale( 1.0 -1.0 )");
+ }
+ if( fShearX != 0.0 )
+ {
+ aBuf.append( "skewX( " );
+ aBuf.append( fShearX );
+ aBuf.append( " )" );
+ }
+ if( fRotate != 0.0 )
+ {
+ if( !aBuf.isEmpty() )
+ aBuf.append( ' ' );
+ aBuf.append( "rotate( " );
+ aBuf.append( -fRotate );
+ aBuf.append( " )" );
+
+ }
+ if( ! rElem.isCharacter )
+ {
+ if( !aBuf.isEmpty() )
+ aBuf.append( ' ' );
+ aBuf.append( "translate( " );
+ aBuf.append( convertPixelToUnitString( rel_x ) );
+ aBuf.append( ' ' );
+ aBuf.append( convertPixelToUnitString( rel_y ) );
+ aBuf.append( " )" );
+ }
+
+ rProps[ "draw:transform" ] = aBuf.makeStringAndClear();
+ }
+}
+
+void WriterXmlEmitter::visit( FrameElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ if( elem.Children.empty() )
+ return;
+
+ bool bTextBox = (dynamic_cast<ParagraphElement*>(elem.Children.front().get()) != nullptr);
+ PropertyMap aFrameProps;
+ fillFrameProps( elem, aFrameProps, m_rEmitContext );
+ m_rEmitContext.rEmitter.beginTag( "draw:frame", aFrameProps );
+ if( bTextBox )
+ m_rEmitContext.rEmitter.beginTag( "draw:text-box", PropertyMap() );
+
+ auto this_it = elem.Children.begin();
+ while( this_it != elem.Children.end() && this_it->get() != &elem )
+ {
+ (*this_it)->visitedBy( *this, this_it );
+ ++this_it;
+ }
+
+ if( bTextBox )
+ m_rEmitContext.rEmitter.endTag( "draw:text-box" );
+ m_rEmitContext.rEmitter.endTag( "draw:frame" );
+}
+
+void WriterXmlEmitter::visit( PolyPolyElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ elem.updateGeometry();
+ /* note:
+ * aw recommends using 100dth of mm in all respects since the xml import
+ * (a) is buggy (see issue 37213)
+ * (b) is optimized for 100dth of mm and does not scale itself then,
+ * this does not gain us speed but makes for smaller rounding errors since
+ * the xml importer coordinates are integer based
+ */
+ for (sal_uInt32 i = 0; i< elem.PolyPoly.count(); i++)
+ {
+ basegfx::B2DPolygon b2dPolygon = elem.PolyPoly.getB2DPolygon( i );
+
+ for ( sal_uInt32 j = 0; j< b2dPolygon.count(); j++ )
+ {
+ basegfx::B2DPoint point;
+ basegfx::B2DPoint nextPoint;
+ point = b2dPolygon.getB2DPoint( j );
+
+ basegfx::B2DPoint prevPoint = b2dPolygon.getPrevControlPoint( j ) ;
+
+ point.setX( convPx2mmPrec2( point.getX() )*100.0 );
+ point.setY( convPx2mmPrec2( point.getY() )*100.0 );
+
+ if ( b2dPolygon.isPrevControlPointUsed( j ) )
+ {
+ prevPoint.setX( convPx2mmPrec2( prevPoint.getX() )*100.0 );
+ prevPoint.setY( convPx2mmPrec2( prevPoint.getY() )*100.0 );
+ }
+
+ if ( b2dPolygon.isNextControlPointUsed( j ) )
+ {
+ nextPoint = b2dPolygon.getNextControlPoint( j ) ;
+ nextPoint.setX( convPx2mmPrec2( nextPoint.getX() )*100.0 );
+ nextPoint.setY( convPx2mmPrec2( nextPoint.getY() )*100.0 );
+ }
+
+ b2dPolygon.setB2DPoint( j, point );
+
+ if ( b2dPolygon.isPrevControlPointUsed( j ) )
+ b2dPolygon.setPrevControlPoint( j , prevPoint ) ;
+
+ if ( b2dPolygon.isNextControlPointUsed( j ) )
+ b2dPolygon.setNextControlPoint( j , nextPoint ) ;
+ }
+
+ elem.PolyPoly.setB2DPolygon( i, b2dPolygon );
+ }
+
+ PropertyMap aProps;
+ fillFrameProps( elem, aProps, m_rEmitContext );
+ OUStringBuffer aBuf( 64 );
+ aBuf.append( "0 0 " );
+ aBuf.append( convPx2mmPrec2(elem.w)*100.0 );
+ aBuf.append( ' ' );
+ aBuf.append( convPx2mmPrec2(elem.h)*100.0 );
+ aProps[ "svg:viewBox" ] = aBuf.makeStringAndClear();
+ aProps[ "svg:d" ] = basegfx::utils::exportToSvgD( elem.PolyPoly, true, true, false );
+
+ m_rEmitContext.rEmitter.beginTag( "draw:path", aProps );
+ m_rEmitContext.rEmitter.endTag( "draw:path" );
+}
+
+void WriterXmlEmitter::visit( ImageElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ PropertyMap aImageProps;
+ m_rEmitContext.rEmitter.beginTag( "draw:image", aImageProps );
+ m_rEmitContext.rEmitter.beginTag( "office:binary-data", PropertyMap() );
+ m_rEmitContext.rImages.writeBase64EncodedStream( elem.Image, m_rEmitContext);
+ m_rEmitContext.rEmitter.endTag( "office:binary-data" );
+ m_rEmitContext.rEmitter.endTag( "draw:image" );
+}
+
+void WriterXmlEmitter::visit( PageElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ if( m_rEmitContext.xStatusIndicator.is() )
+ m_rEmitContext.xStatusIndicator->setValue( elem.PageNumber );
+
+ auto this_it = elem.Children.begin();
+ while( this_it != elem.Children.end() && this_it->get() != &elem )
+ {
+ (*this_it)->visitedBy( *this, this_it );
+ ++this_it;
+ }
+}
+
+void WriterXmlEmitter::visit( DocumentElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator&)
+{
+ m_rEmitContext.rEmitter.beginTag( "office:body", PropertyMap() );
+ m_rEmitContext.rEmitter.beginTag( "office:text", PropertyMap() );
+
+ for( const auto& rxChild : elem.Children )
+ {
+ PageElement* pPage = dynamic_cast<PageElement*>(rxChild.get());
+ if( pPage )
+ {
+ // emit only page anchored objects
+ // currently these are only DrawElement types
+ for( auto child_it = pPage->Children.begin(); child_it != pPage->Children.end(); ++child_it )
+ {
+ if( dynamic_cast<DrawElement*>(child_it->get()) != nullptr )
+ (*child_it)->visitedBy( *this, child_it );
+ }
+ }
+ }
+
+ // do not emit page anchored objects, they are emitted before
+ // (must precede all pages in writer document) currently these are
+ // only DrawElement types
+ for( auto it = elem.Children.begin(); it != elem.Children.end(); ++it )
+ {
+ if( dynamic_cast<DrawElement*>(it->get()) != nullptr )
+ (*it)->visitedBy( *this, it );
+ }
+
+ m_rEmitContext.rEmitter.endTag( "office:text" );
+ m_rEmitContext.rEmitter.endTag( "office:body" );
+}
+
+
+void WriterXmlOptimizer::visit( HyperlinkElement&, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+}
+
+void WriterXmlOptimizer::visit( TextElement&, const std::list< std::unique_ptr<Element> >::const_iterator&)
+{
+}
+
+void WriterXmlOptimizer::visit( FrameElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ elem.applyToChildren(*this);
+}
+
+void WriterXmlOptimizer::visit( ImageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+}
+
+void WriterXmlOptimizer::visit( PolyPolyElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& elemIt )
+{
+ /* note: optimize two consecutive PolyPolyElements that
+ * have the same path but one of which is a stroke while
+ * the other is a fill
+ */
+ if( !elem.Parent )
+ return;
+ // find following PolyPolyElement in parent's children list
+ if( elemIt == elem.Parent->Children.end() )
+ return;
+ auto next_it = elemIt;
+ ++next_it;
+ if( next_it == elem.Parent->Children.end() )
+ return;
+
+ PolyPolyElement* pNext = dynamic_cast<PolyPolyElement*>(next_it->get());
+ if( !pNext || pNext->PolyPoly != elem.PolyPoly )
+ return;
+
+ const GraphicsContext& rNextGC =
+ m_rProcessor.getGraphicsContext( pNext->GCId );
+ const GraphicsContext& rThisGC =
+ m_rProcessor.getGraphicsContext( elem.GCId );
+
+ if( !(rThisGC.BlendMode == rNextGC.BlendMode &&
+ rThisGC.Flatness == rNextGC.Flatness &&
+ rThisGC.Transformation == rNextGC.Transformation &&
+ rThisGC.Clip == rNextGC.Clip &&
+ pNext->Action == PATH_STROKE &&
+ (elem.Action == PATH_FILL || elem.Action == PATH_EOFILL)) )
+ return;
+
+ GraphicsContext aGC = rThisGC;
+ aGC.LineJoin = rNextGC.LineJoin;
+ aGC.LineCap = rNextGC.LineCap;
+ aGC.LineWidth = rNextGC.LineWidth;
+ aGC.MiterLimit= rNextGC.MiterLimit;
+ aGC.DashArray = rNextGC.DashArray;
+ aGC.LineColor = rNextGC.LineColor;
+ elem.GCId = m_rProcessor.getGCId( aGC );
+
+ elem.Action |= pNext->Action;
+
+ elem.Children.splice( elem.Children.end(), pNext->Children );
+ elem.Parent->Children.erase(next_it);
+}
+
+void WriterXmlOptimizer::visit( ParagraphElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt)
+{
+ optimizeTextElements( elem );
+
+ elem.applyToChildren(*this);
+
+ if( !(elem.Parent && rParentIt != elem.Parent->Children.end()) )
+ return;
+
+ // find if there is a previous paragraph that might be a heading for this one
+ auto prev = rParentIt;
+ ParagraphElement* pPrevPara = nullptr;
+ while( prev != elem.Parent->Children.begin() )
+ {
+ --prev;
+ pPrevPara = dynamic_cast< ParagraphElement* >(prev->get());
+ if( pPrevPara )
+ {
+ /* What constitutes a heading ? current hints are:
+ * - one line only
+ * - not too far away from this paragraph (two heading height max ?)
+ * - font larger or bold
+ * this is of course incomplete
+ * FIXME: improve hints for heading
+ */
+ // check for single line
+ if( pPrevPara->isSingleLined( m_rProcessor ) )
+ {
+ double head_line_height = pPrevPara->getLineHeight( m_rProcessor );
+ if( pPrevPara->y + pPrevPara->h + 2*head_line_height > elem.y )
+ {
+ // check for larger font
+ if( head_line_height > elem.getLineHeight( m_rProcessor ) )
+ {
+ pPrevPara->Type = ParagraphElement::Headline;
+ }
+ else
+ {
+ // check whether text of pPrevPara is bold (at least first text element)
+ // and this para is not bold (ditto)
+ TextElement* pPrevText = pPrevPara->getFirstTextChild();
+ TextElement* pThisText = elem.getFirstTextChild();
+ if( pPrevText && pThisText )
+ {
+ const FontAttributes& rPrevFont = m_rProcessor.getFont( pPrevText->FontId );
+ const FontAttributes& rThisFont = m_rProcessor.getFont( pThisText->FontId );
+ if ( (rPrevFont.fontWeight == u"600" ||
+ rPrevFont.fontWeight == u"bold" ||
+ rPrevFont.fontWeight == u"800" ||
+ rPrevFont.fontWeight == u"900" ) &&
+ (rThisFont.fontWeight == u"600" ||
+ rThisFont.fontWeight == u"bold" ||
+ rThisFont.fontWeight == u"800" ||
+ rThisFont.fontWeight == u"900" ) )
+ {
+ pPrevPara->Type = ParagraphElement::Headline;
+ }
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+}
+
+void WriterXmlOptimizer::visit( PageElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ if( m_rProcessor.getStatusIndicator().is() )
+ m_rProcessor.getStatusIndicator()->setValue( elem.PageNumber );
+
+ // resolve hyperlinks
+ elem.resolveHyperlinks();
+
+ elem.resolveFontStyles( m_rProcessor ); // underlines and such
+
+ // FIXME: until hyperlinks and font effects are adjusted for
+ // geometrical search handle them before sorting
+ PDFIProcessor::sortElements( &elem );
+
+ // find paragraphs in text
+ ParagraphElement* pCurPara = nullptr;
+ std::list< std::unique_ptr<Element> >::iterator page_element, next_page_element;
+ next_page_element = elem.Children.begin();
+ double fCurLineHeight = 0.0; // average height of text items in current para
+ int nCurLineElements = 0; // number of line contributing elements in current para
+ double line_left = elem.w, line_right = 0.0;
+ double column_width = elem.w*0.75; // estimate text width
+ // TODO: guess columns
+ while( next_page_element != elem.Children.end() )
+ {
+ page_element = next_page_element++;
+ ParagraphElement* pPagePara = dynamic_cast<ParagraphElement*>(page_element->get());
+ if( pPagePara )
+ {
+ pCurPara = pPagePara;
+ // adjust line height and text items
+ fCurLineHeight = 0.0;
+ nCurLineElements = 0;
+ for( const auto& rxChild : pCurPara->Children )
+ {
+ TextElement* pTestText = dynamic_cast<TextElement*>(rxChild.get());
+ if( pTestText )
+ {
+ fCurLineHeight = (fCurLineHeight*double(nCurLineElements) + pTestText->h)/double(nCurLineElements+1);
+ nCurLineElements++;
+ }
+ }
+ continue;
+ }
+
+ HyperlinkElement* pLink = dynamic_cast<HyperlinkElement*>(page_element->get());
+ DrawElement* pDraw = dynamic_cast<DrawElement*>(page_element->get());
+ if( ! pDraw && pLink && ! pLink->Children.empty() )
+ pDraw = dynamic_cast<DrawElement*>(pLink->Children.front().get() );
+ if( pDraw )
+ {
+ // insert small drawing objects as character, else leave them page bound
+
+ bool bInsertToParagraph = false;
+ // first check if this is either inside the paragraph
+ if( pCurPara && pDraw->y < pCurPara->y + pCurPara->h )
+ {
+ if( pDraw->h < fCurLineHeight * 1.5 )
+ {
+ bInsertToParagraph = true;
+ fCurLineHeight = (fCurLineHeight*double(nCurLineElements) + pDraw->h)/double(nCurLineElements+1);
+ nCurLineElements++;
+ // mark draw element as character
+ pDraw->isCharacter = true;
+ }
+ }
+ // or perhaps the draw element begins a new paragraph
+ else if( next_page_element != elem.Children.end() )
+ {
+ TextElement* pText = dynamic_cast<TextElement*>(next_page_element->get());
+ if( ! pText )
+ {
+ ParagraphElement* pPara = dynamic_cast<ParagraphElement*>(next_page_element->get());
+ if( pPara && ! pPara->Children.empty() )
+ pText = dynamic_cast<TextElement*>(pPara->Children.front().get());
+ }
+ if( pText && // check there is a text
+ pDraw->h < pText->h*1.5 && // and it is approx the same height
+ // and either upper or lower edge of pDraw is inside text's vertical range
+ ( ( pDraw->y >= pText->y && pDraw->y <= pText->y+pText->h ) ||
+ ( pDraw->y+pDraw->h >= pText->y && pDraw->y+pDraw->h <= pText->y+pText->h )
+ )
+ )
+ {
+ bInsertToParagraph = true;
+ fCurLineHeight = pDraw->h;
+ nCurLineElements = 1;
+ line_left = pDraw->x;
+ line_right = pDraw->x + pDraw->w;
+ // begin a new paragraph
+ pCurPara = nullptr;
+ // mark draw element as character
+ pDraw->isCharacter = true;
+ }
+ }
+
+ if( ! bInsertToParagraph )
+ {
+ pCurPara = nullptr;
+ continue;
+ }
+ }
+
+ TextElement* pText = dynamic_cast<TextElement*>(page_element->get());
+ if( ! pText && pLink && ! pLink->Children.empty() )
+ pText = dynamic_cast<TextElement*>(pLink->Children.front().get());
+ if( pText )
+ {
+ Element* pGeo = pLink ? static_cast<Element*>(pLink) :
+ static_cast<Element*>(pText);
+ if( pCurPara )
+ {
+ // there was already a text element, check for a new paragraph
+ if( nCurLineElements > 0 )
+ {
+ // if the new text is significantly distant from the paragraph
+ // begin a new paragraph
+ if( pGeo->y > pCurPara->y+pCurPara->h + fCurLineHeight*0.5 )
+ pCurPara = nullptr; // insert new paragraph
+ else if( pGeo->y > (pCurPara->y+pCurPara->h - fCurLineHeight*0.05) )
+ {
+ // new paragraph if either the last line of the paragraph
+ // was significantly shorter than the paragraph as a whole
+ if( (line_right - line_left) < pCurPara->w*0.75 )
+ pCurPara = nullptr;
+ // or the last line was significantly smaller than the column width
+ else if( (line_right - line_left) < column_width*0.75 )
+ pCurPara = nullptr;
+ }
+ }
+ }
+ // update line height/width
+ if( pCurPara )
+ {
+ fCurLineHeight = (fCurLineHeight*double(nCurLineElements) + pGeo->h)/double(nCurLineElements+1);
+ nCurLineElements++;
+ if( pGeo->x < line_left )
+ line_left = pGeo->x;
+ if( pGeo->x+pGeo->w > line_right )
+ line_right = pGeo->x+pGeo->w;
+ }
+ else
+ {
+ fCurLineHeight = pGeo->h;
+ nCurLineElements = 1;
+ line_left = pGeo->x;
+ line_right = pGeo->x + pGeo->w;
+ }
+ }
+
+ // move element to current paragraph
+ if( ! pCurPara ) // new paragraph, insert one
+ {
+ pCurPara = ElementFactory::createParagraphElement( nullptr );
+ // set parent
+ pCurPara->Parent = &elem;
+ //insert new paragraph before current element
+ page_element = elem.Children.insert( page_element, std::unique_ptr<Element>(pCurPara) );
+ // forward iterator to current element again
+ ++ page_element;
+ // update next_element which is now invalid
+ next_page_element = page_element;
+ ++ next_page_element;
+ }
+ Element* pCurEle = page_element->get();
+ Element::setParent( page_element, pCurPara );
+ OSL_ENSURE( !pText || pCurEle == pText || pCurEle == pLink, "paragraph child list in disorder" );
+ if( pText || pDraw )
+ pCurPara->updateGeometryWith( pCurEle );
+ }
+
+ // process children
+ elem.applyToChildren(*this);
+
+ // find possible header and footer
+ checkHeaderAndFooter( elem );
+}
+
+void WriterXmlOptimizer::checkHeaderAndFooter( PageElement& rElem )
+{
+ /* indicators for a header:
+ * - single line paragraph at top of page (inside 15% page height)
+ * - at least lineheight above the next paragraph
+ *
+ * indicators for a footer likewise:
+ * - single line paragraph at bottom of page (inside 15% page height)
+ * - at least lineheight below the previous paragraph
+ */
+
+ auto isParagraphElement = [](std::unique_ptr<Element>& rxChild) -> bool {
+ return dynamic_cast<ParagraphElement*>(rxChild.get()) != nullptr;
+ };
+
+ // detect header
+ // Note: the following assumes that the pages' children have been
+ // sorted geometrically
+ auto it = std::find_if(rElem.Children.begin(), rElem.Children.end(), isParagraphElement);
+ if (it != rElem.Children.end())
+ {
+ ParagraphElement& rPara = dynamic_cast<ParagraphElement&>(**it);
+ if( rPara.y+rPara.h < rElem.h*0.15 && rPara.isSingleLined( m_rProcessor ) )
+ {
+ auto next_it = it;
+ ParagraphElement* pNextPara = nullptr;
+ while( ++next_it != rElem.Children.end() && pNextPara == nullptr )
+ {
+ pNextPara = dynamic_cast<ParagraphElement*>(next_it->get());
+ }
+ if( pNextPara && pNextPara->y > rPara.y+rPara.h*2 )
+ {
+ rElem.HeaderElement = std::move(*it);
+ rPara.Parent = nullptr;
+ rElem.Children.erase( it );
+ }
+ }
+ }
+
+ // detect footer
+ auto rit = std::find_if(rElem.Children.rbegin(), rElem.Children.rend(), isParagraphElement);
+ if (rit == rElem.Children.rend())
+ return;
+
+ ParagraphElement& rPara = dynamic_cast<ParagraphElement&>(**rit);
+ if( !(rPara.y > rElem.h*0.85 && rPara.isSingleLined( m_rProcessor )) )
+ return;
+
+ std::list< std::unique_ptr<Element> >::reverse_iterator next_it = rit;
+ ParagraphElement* pNextPara = nullptr;
+ while( ++next_it != rElem.Children.rend() && pNextPara == nullptr )
+ {
+ pNextPara = dynamic_cast<ParagraphElement*>(next_it->get());
+ }
+ if( pNextPara && pNextPara->y < rPara.y-rPara.h*2 )
+ {
+ rElem.FooterElement = std::move(*rit);
+ rPara.Parent = nullptr;
+ rElem.Children.erase( std::next(rit).base() );
+ }
+}
+
+void WriterXmlOptimizer::optimizeTextElements(Element& rParent)
+{
+ if( rParent.Children.empty() ) // this should not happen
+ {
+ OSL_FAIL( "empty paragraph optimized" );
+ return;
+ }
+
+ // concatenate child elements with same font id
+ auto next = rParent.Children.begin();
+ auto it = next++;
+ FrameElement* pFrame = dynamic_cast<FrameElement*>(rParent.Parent);
+ bool bRotatedFrame = false;
+ if( pFrame )
+ {
+ const GraphicsContext& rFrameGC = m_rProcessor.getGraphicsContext( pFrame->GCId );
+ if( rFrameGC.isRotatedOrSkewed() )
+ bRotatedFrame = true;
+ }
+ while( next != rParent.Children.end() )
+ {
+ bool bConcat = false;
+ TextElement* pCur = dynamic_cast<TextElement*>(it->get());
+ if( pCur )
+ {
+ TextElement* pNext = dynamic_cast<TextElement*>(next->get());
+ if( pNext )
+ {
+ const GraphicsContext& rCurGC = m_rProcessor.getGraphicsContext( pCur->GCId );
+ const GraphicsContext& rNextGC = m_rProcessor.getGraphicsContext( pNext->GCId );
+
+ // line and space optimization; works only in strictly horizontal mode
+
+ if( !bRotatedFrame
+ && ! rCurGC.isRotatedOrSkewed()
+ && ! rNextGC.isRotatedOrSkewed()
+ && ! pNext->Text.isEmpty()
+ && pNext->Text[0] != ' '
+ && ! pCur->Text.isEmpty()
+ && pCur->Text[pCur->Text.getLength() - 1] != ' '
+ )
+ {
+ // check for new line in paragraph
+ if( pNext->y > pCur->y+pCur->h )
+ {
+ // new line begins
+ // check whether a space would should be inserted or a hyphen removed
+ sal_Unicode aLastCode = pCur->Text[pCur->Text.getLength() - 1];
+ if( aLastCode == '-'
+ || aLastCode == 0x2010
+ || (aLastCode >= 0x2012 && aLastCode <= 0x2015)
+ || aLastCode == 0xff0d
+ )
+ {
+ // cut a hyphen
+ pCur->Text.setLength( pCur->Text.getLength()-1 );
+ }
+ // append a space unless there is a non breaking hyphen
+ else if( aLastCode != 0x2011 )
+ {
+ pCur->Text.append( ' ' );
+ }
+ }
+ else // we're continuing the same line
+ {
+ // check whether a space would should be inserted
+ // check for a small horizontal offset
+ if( pCur->x + pCur->w + pNext->h*0.15 < pNext->x )
+ {
+ pCur->Text.append( ' ' );
+ }
+ }
+ }
+ // concatenate consecutive text elements unless there is a
+ // font or text color change, leave a new span in that case
+ if( pCur->FontId == pNext->FontId &&
+ rCurGC.FillColor.Red == rNextGC.FillColor.Red &&
+ rCurGC.FillColor.Green == rNextGC.FillColor.Green &&
+ rCurGC.FillColor.Blue == rNextGC.FillColor.Blue &&
+ rCurGC.FillColor.Alpha == rNextGC.FillColor.Alpha
+ )
+ {
+ pCur->updateGeometryWith( pNext );
+ // append text to current element
+ pCur->Text.append( pNext->Text );
+ // append eventual children to current element
+ // and clear children (else the children just
+ // appended to pCur would be destroyed)
+ pCur->Children.splice( pCur->Children.end(), pNext->Children );
+ // get rid of the now useless element
+ rParent.Children.erase( next );
+ bConcat = true;
+ }
+ }
+ }
+ else if( dynamic_cast<HyperlinkElement*>(it->get()) )
+ optimizeTextElements( **it );
+ if( bConcat )
+ {
+ next = it;
+ ++next;
+ }
+ else
+ {
+ ++it;
+ ++next;
+ }
+ }
+}
+
+void WriterXmlOptimizer::visit( DocumentElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator&)
+{
+ elem.applyToChildren(*this);
+}
+
+
+void WriterXmlFinalizer::visit( PolyPolyElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ // xxx TODO copied from DrawElement
+ const GraphicsContext& rGC = m_rProcessor.getGraphicsContext(elem.GCId );
+ PropertyMap aProps;
+ aProps[ "style:family" ] = "graphic";
+
+ PropertyMap aGCProps;
+ if (elem.Action & PATH_STROKE)
+ {
+ double scale = GetAverageTransformationScale(rGC.Transformation);
+ if (rGC.DashArray.size() < 2)
+ {
+ aGCProps[ "draw:stroke" ] = "solid";
+ }
+ else
+ {
+ PropertyMap props;
+ FillDashStyleProps(props, rGC.DashArray, scale);
+ StyleContainer::Style style("draw:stroke-dash", std::move(props));
+
+ aGCProps[ "draw:stroke" ] = "dash";
+ aGCProps[ "draw:stroke-dash" ] =
+ m_rStyleContainer.getStyleName(
+ m_rStyleContainer.getStyleId(style));
+ }
+
+ aGCProps[ "svg:stroke-color" ] = getColorString(rGC.LineColor);
+ aGCProps[ "svg:stroke-width" ] = convertPixelToUnitString(rGC.LineWidth * scale);
+ aGCProps[ "draw:stroke-linejoin" ] = rGC.GetLineJoinString();
+ aGCProps[ "svg:stroke-linecap" ] = rGC.GetLineCapString();
+ }
+ else
+ {
+ aGCProps[ "draw:stroke" ] = "none";
+ }
+
+ // TODO(F1): check whether stuff could be emulated by gradient/bitmap/hatch
+ if( elem.Action & (PATH_FILL | PATH_EOFILL) )
+ {
+ aGCProps[ "draw:fill" ] = "solid";
+ aGCProps[ "draw:fill-color" ] = getColorString( rGC.FillColor );
+ }
+ else
+ {
+ aGCProps[ "draw:fill" ] = "none";
+ }
+
+ StyleContainer::Style aStyle( "style:style", std::move(aProps) );
+ StyleContainer::Style aSubStyle( "style:graphic-properties", std::move(aGCProps) );
+ aStyle.SubStyles.push_back( &aSubStyle );
+
+ elem.StyleId = m_rStyleContainer.getStyleId( aStyle );
+}
+
+void WriterXmlFinalizer::visit( HyperlinkElement&, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+}
+
+void WriterXmlFinalizer::visit( TextElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ const FontAttributes& rFont = m_rProcessor.getFont( elem.FontId );
+ PropertyMap aProps;
+ aProps[ "style:family" ] = "text";
+
+ PropertyMap aFontProps;
+
+ // family name
+ // TODO: tdf#143095: use system font name rather than PSName
+ SAL_INFO("sdext.pdfimport", "The font used in xml is: " << rFont.familyName);
+ aFontProps[ "fo:font-family" ] = rFont.familyName;
+ aFontProps[ "style:font-family-asian" ] = rFont.familyName;
+ aFontProps[ "style:font-family-complex" ] = rFont.familyName;
+
+ // bold
+ aFontProps[ "fo:font-weight" ] = rFont.fontWeight;
+ aFontProps[ "style:font-weight-asian" ] = rFont.fontWeight;
+ aFontProps[ "style:font-weight-complex" ] = rFont.fontWeight;
+
+ // italic
+ if( rFont.isItalic )
+ {
+ aFontProps[ "fo:font-style" ] = "italic";
+ aFontProps[ "style:font-style-asian" ] = "italic";
+ aFontProps[ "style:font-style-complex" ] = "italic";
+ }
+
+ // underline
+ if( rFont.isUnderline )
+ {
+ aFontProps[ "style:text-underline-style" ] = "solid";
+ aFontProps[ "style:text-underline-width" ] = "auto";
+ aFontProps[ "style:text-underline-color" ] = "font-color";
+ }
+
+ // outline
+ if( rFont.isOutline )
+ aFontProps[ "style:text-outline" ] = "true";
+
+ // size
+ OUString aFSize = OUString::number( rFont.size*72/PDFI_OUTDEV_RESOLUTION ) + "pt";
+ aFontProps[ "fo:font-size" ] = aFSize;
+ aFontProps[ "style:font-size-asian" ] = aFSize;
+ aFontProps[ "style:font-size-complex" ] = aFSize;
+
+ // color
+ const GraphicsContext& rGC = m_rProcessor.getGraphicsContext( elem.GCId );
+ aFontProps[ "fo:color" ] = getColorString( rFont.isOutline ? rGC.LineColor : rGC.FillColor );
+
+ StyleContainer::Style aStyle( "style:style", std::move(aProps) );
+ StyleContainer::Style aSubStyle( "style:text-properties", std::move(aFontProps) );
+ aStyle.SubStyles.push_back( &aSubStyle );
+ elem.StyleId = m_rStyleContainer.getStyleId( aStyle );
+}
+
+void WriterXmlFinalizer::visit( ParagraphElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& rParentIt )
+{
+ PropertyMap aParaProps;
+
+ if( elem.Parent )
+ {
+ // check for center alignment
+ // criterion: paragraph is small relative to parent and distributed around its center
+ double p_x = elem.Parent->x;
+ double p_w = elem.Parent->w;
+
+ PageElement* pPage = dynamic_cast<PageElement*>(elem.Parent);
+ if( pPage )
+ {
+ p_x += pPage->LeftMargin;
+ p_w -= pPage->LeftMargin+pPage->RightMargin;
+ }
+ bool bIsCenter = false;
+ if( elem.w < ( p_w/2) )
+ {
+ double delta = elem.w/4;
+ // allow very small paragraphs to deviate a little more
+ // relative to parent's center
+ if( elem.w < p_w/8 )
+ delta = elem.w;
+ if( fabs( elem.x+elem.w/2 - ( p_x+ p_w/2) ) < delta ||
+ (pPage && fabs( elem.x+elem.w/2 - (pPage->x + pPage->w/2) ) < delta) )
+ {
+ bIsCenter = true;
+ aParaProps[ "fo:text-align" ] = "center";
+ }
+ }
+ if( ! bIsCenter && elem.x > p_x + p_w/10 )
+ {
+ // indent
+ OUStringBuffer aBuf( 32 );
+ aBuf.append( convPx2mm( elem.x - p_x ) );
+ aBuf.append( "mm" );
+ aParaProps[ "fo:margin-left" ] = aBuf.makeStringAndClear();
+ }
+
+ // check whether to leave some space to next paragraph
+ // find whether there is a next paragraph
+ auto it = rParentIt;
+ const ParagraphElement* pNextPara = nullptr;
+ while( ++it != elem.Parent->Children.end() && ! pNextPara )
+ pNextPara = dynamic_cast< const ParagraphElement* >(it->get());
+ if( pNextPara )
+ {
+ if( pNextPara->y - (elem.y+elem.h) > convmm2Px( 10 ) )
+ {
+ OUStringBuffer aBuf( 32 );
+ aBuf.append( convPx2mm( pNextPara->y - (elem.y+elem.h) ) );
+ aBuf.append( "mm" );
+ aParaProps[ "fo:margin-bottom" ] = aBuf.makeStringAndClear();
+ }
+ }
+ }
+
+ if( ! aParaProps.empty() )
+ {
+ PropertyMap aProps;
+ aProps[ "style:family" ] = "paragraph";
+ StyleContainer::Style aStyle( "style:style", std::move(aProps) );
+ StyleContainer::Style aSubStyle( "style:paragraph-properties", std::move(aParaProps) );
+ aStyle.SubStyles.push_back( &aSubStyle );
+ elem.StyleId = m_rStyleContainer.getStyleId( aStyle );
+ }
+
+ elem.applyToChildren(*this);
+}
+
+void WriterXmlFinalizer::visit( FrameElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator&)
+{
+ PropertyMap aProps;
+ aProps[ "style:family" ] = "graphic";
+
+ PropertyMap aGCProps;
+
+ aGCProps[ "draw:stroke" ] = "none";
+ aGCProps[ "draw:fill" ] = "none";
+ aGCProps[ "draw:auto-grow-height" ] = "true";
+ aGCProps[ "draw:auto-grow-width" ] = "true";
+ aGCProps[ "draw:textarea-horizontal-align" ] = "left";
+ aGCProps[ "draw:textarea-vertical-align" ] = "top";
+ aGCProps[ "fo:min-height"] = "0cm";
+ aGCProps[ "fo:min-width"] = "0cm";
+ aGCProps[ "fo:padding-top" ] = "0cm";
+ aGCProps[ "fo:padding-left" ] = "0cm";
+ aGCProps[ "fo:padding-right" ] = "0cm";
+ aGCProps[ "fo:padding-bottom" ] = "0cm";
+
+ StyleContainer::Style aStyle( "style:style", std::move(aProps) );
+ StyleContainer::Style aSubStyle( "style:graphic-properties", std::move(aGCProps) );
+ aStyle.SubStyles.push_back( &aSubStyle );
+
+ elem.StyleId = m_rStyleContainer.getStyleId( aStyle );
+ elem.applyToChildren(*this);
+}
+
+void WriterXmlFinalizer::visit( ImageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+}
+
+void WriterXmlFinalizer::setFirstOnPage( ParagraphElement& rElem,
+ StyleContainer& rStyles,
+ const OUString& rMasterPageName )
+{
+ PropertyMap aProps;
+ if( rElem.StyleId != -1 )
+ {
+ const PropertyMap* pProps = rStyles.getProperties( rElem.StyleId );
+ if( pProps )
+ aProps = *pProps;
+ }
+
+ aProps[ "style:family" ] = "paragraph";
+ aProps[ "style:master-page-name" ] = rMasterPageName;
+
+ if( rElem.StyleId != -1 )
+ rElem.StyleId = rStyles.setProperties( rElem.StyleId, std::move(aProps) );
+ else
+ {
+ StyleContainer::Style aStyle( "style:style", std::move(aProps) );
+ rElem.StyleId = rStyles.getStyleId( aStyle );
+ }
+}
+
+void WriterXmlFinalizer::visit( PageElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ if( m_rProcessor.getStatusIndicator().is() )
+ m_rProcessor.getStatusIndicator()->setValue( elem.PageNumber );
+
+ // transform from pixel to mm
+ double page_width = convPx2mm( elem.w ), page_height = convPx2mm( elem.h );
+
+ // calculate page margins out of the relevant children (paragraphs)
+ elem.TopMargin = elem.h;
+ elem.BottomMargin = 0;
+ elem.LeftMargin = elem.w;
+ elem.RightMargin = 0;
+ // first element should be a paragraph
+ ParagraphElement* pFirstPara = nullptr;
+ for( const auto& rxChild : elem.Children )
+ {
+ if( dynamic_cast<ParagraphElement*>( rxChild.get() ) )
+ {
+ if( rxChild->x < elem.LeftMargin )
+ elem.LeftMargin = rxChild->x;
+ if( rxChild->y < elem.TopMargin )
+ elem.TopMargin = rxChild->y;
+ if( rxChild->x + rxChild->w > elem.w - elem.RightMargin )
+ elem.RightMargin = elem.w - (rxChild->x + rxChild->w);
+ if( rxChild->y + rxChild->h > elem.h - elem.BottomMargin )
+ elem.BottomMargin = elem.h - (rxChild->y + rxChild->h);
+ if( ! pFirstPara )
+ pFirstPara = dynamic_cast<ParagraphElement*>( rxChild.get() );
+ }
+ }
+ if( elem.HeaderElement && elem.HeaderElement->y < elem.TopMargin )
+ elem.TopMargin = elem.HeaderElement->y;
+ if( elem.FooterElement && elem.FooterElement->y+elem.FooterElement->h > elem.h - elem.BottomMargin )
+ elem.BottomMargin = elem.h - (elem.FooterElement->y + elem.FooterElement->h);
+
+ // transform margins to mm
+ double left_margin = convPx2mm( elem.LeftMargin );
+ double right_margin = convPx2mm( elem.RightMargin );
+ double top_margin = convPx2mm( elem.TopMargin );
+ double bottom_margin = convPx2mm( elem.BottomMargin );
+ if( ! pFirstPara )
+ {
+ // use default page margins
+ left_margin = 10;
+ right_margin = 10;
+ top_margin = 10;
+ bottom_margin = 10;
+ }
+
+ // round left/top margin to nearest mm
+ left_margin = rtl_math_round( left_margin, 0, rtl_math_RoundingMode_Floor );
+ top_margin = rtl_math_round( top_margin, 0, rtl_math_RoundingMode_Floor );
+ // round (fuzzy) right/bottom margin to nearest cm
+ right_margin = rtl_math_round( right_margin, right_margin >= 10 ? -1 : 0, rtl_math_RoundingMode_Floor );
+ bottom_margin = rtl_math_round( bottom_margin, bottom_margin >= 10 ? -1 : 0, rtl_math_RoundingMode_Floor );
+
+ // set reasonable default in case of way too large margins
+ // e.g. no paragraph case
+ if( left_margin > page_width/2.0 - 10 )
+ left_margin = 10;
+ if( right_margin > page_width/2.0 - 10 )
+ right_margin = 10;
+ if( top_margin > page_height/2.0 - 10 )
+ top_margin = 10;
+ if( bottom_margin > page_height/2.0 - 10 )
+ bottom_margin = 10;
+
+ // catch the weird cases
+ if( left_margin < 0 )
+ left_margin = 0;
+ if( right_margin < 0 )
+ right_margin = 0;
+ if( top_margin < 0 )
+ top_margin = 0;
+ if( bottom_margin < 0 )
+ bottom_margin = 0;
+
+ // widely differing margins are unlikely to be correct
+ if( right_margin > left_margin*1.5 )
+ right_margin = left_margin;
+
+ elem.LeftMargin = convmm2Px( left_margin );
+ elem.RightMargin = convmm2Px( right_margin );
+ elem.TopMargin = convmm2Px( top_margin );
+ elem.BottomMargin = convmm2Px( bottom_margin );
+
+ // get styles for paragraphs
+ PropertyMap aPageProps;
+ PropertyMap aPageLayoutProps;
+ aPageLayoutProps[ "fo:page-width" ] = unitMMString( page_width );
+ aPageLayoutProps[ "fo:page-height" ] = unitMMString( page_height );
+ aPageLayoutProps[ "style:print-orientation" ]
+ = elem.w < elem.h ? std::u16string_view(u"portrait") : std::u16string_view(u"landscape");
+ aPageLayoutProps[ "fo:margin-top" ] = unitMMString( top_margin );
+ aPageLayoutProps[ "fo:margin-bottom" ] = unitMMString( bottom_margin );
+ aPageLayoutProps[ "fo:margin-left" ] = unitMMString( left_margin );
+ aPageLayoutProps[ "fo:margin-right" ] = unitMMString( right_margin );
+ aPageLayoutProps[ "style:writing-mode" ]= "lr-tb";
+
+ StyleContainer::Style aStyle( "style:page-layout", std::move(aPageProps));
+ StyleContainer::Style aSubStyle( "style:page-layout-properties", std::move(aPageLayoutProps));
+ aStyle.SubStyles.push_back(&aSubStyle);
+ sal_Int32 nPageStyle = m_rStyleContainer.impl_getStyleId( aStyle, false );
+
+ // create master page
+ OUString aMasterPageLayoutName = m_rStyleContainer.getStyleName( nPageStyle );
+ aPageProps[ "style:page-layout-name" ] = aMasterPageLayoutName;
+ StyleContainer::Style aMPStyle( "style:master-page", std::move(aPageProps) );
+ StyleContainer::Style aHeaderStyle( "style:header", PropertyMap() );
+ StyleContainer::Style aFooterStyle( "style:footer", PropertyMap() );
+ if( elem.HeaderElement )
+ {
+ elem.HeaderElement->visitedBy( *this, std::list<std::unique_ptr<Element>>::iterator() );
+ aHeaderStyle.ContainedElement = elem.HeaderElement.get();
+ aMPStyle.SubStyles.push_back( &aHeaderStyle );
+ }
+ if( elem.FooterElement )
+ {
+ elem.FooterElement->visitedBy( *this, std::list<std::unique_ptr<Element>>::iterator() );
+ aFooterStyle.ContainedElement = elem.FooterElement.get();
+ aMPStyle.SubStyles.push_back( &aFooterStyle );
+ }
+ elem.StyleId = m_rStyleContainer.impl_getStyleId( aMPStyle,false );
+
+
+ OUString aMasterPageName = m_rStyleContainer.getStyleName( elem.StyleId );
+
+ // create styles for children
+ elem.applyToChildren(*this);
+
+ // no paragraph or other elements before the first paragraph
+ if( ! pFirstPara )
+ {
+ pFirstPara = ElementFactory::createParagraphElement( nullptr );
+ pFirstPara->Parent = &elem;
+ elem.Children.push_front( std::unique_ptr<Element>(pFirstPara) );
+ }
+ setFirstOnPage(*pFirstPara, m_rStyleContainer, aMasterPageName);
+}
+
+void WriterXmlFinalizer::visit( DocumentElement& elem, const std::list< std::unique_ptr<Element> >::const_iterator& )
+{
+ elem.applyToChildren(*this);
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/tree/writertreevisiting.hxx b/sdext/source/pdfimport/tree/writertreevisiting.hxx
new file mode 100644
index 000000000..e473c2737
--- /dev/null
+++ b/sdext/source/pdfimport/tree/writertreevisiting.hxx
@@ -0,0 +1,110 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_TREE_WRITERTREEVISITING_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_TREE_WRITERTREEVISITING_HXX
+
+#include <treevisiting.hxx>
+
+#include <pdfihelper.hxx>
+
+#include <com/sun/star/i18n/XCharacterClassification.hpp>
+
+namespace pdfi
+{
+ struct DrawElement;
+
+ class WriterXmlOptimizer : public ElementTreeVisitor
+ {
+ private:
+ PDFIProcessor& m_rProcessor;
+ void optimizeTextElements(Element& rParent);
+ void checkHeaderAndFooter( PageElement& rElem );
+
+ public:
+ explicit WriterXmlOptimizer(PDFIProcessor& rProcessor) :
+ m_rProcessor(rProcessor)
+ {}
+
+ virtual void visit( HyperlinkElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( TextElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( ParagraphElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( FrameElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( PolyPolyElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( ImageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( PageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( DocumentElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ };
+
+ class WriterXmlFinalizer : public ElementTreeVisitor
+ {
+ private:
+ StyleContainer& m_rStyleContainer;
+ PDFIProcessor& m_rProcessor;
+
+ static void setFirstOnPage( ParagraphElement& rElem,
+ StyleContainer& rStyles,
+ const OUString& rMasterPageName );
+
+ public:
+ explicit WriterXmlFinalizer(StyleContainer& rStyleContainer,
+ PDFIProcessor& rProcessor) :
+ m_rStyleContainer(rStyleContainer),
+ m_rProcessor(rProcessor)
+ {}
+
+ virtual void visit( HyperlinkElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( TextElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( ParagraphElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( FrameElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( PolyPolyElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( ImageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( PageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( DocumentElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ };
+
+ class WriterXmlEmitter : public ElementTreeVisitor
+ {
+ private:
+ css::uno::Reference< css::i18n::XCharacterClassification > mxCharClass;
+ EmitContext& m_rEmitContext ;
+ static void fillFrameProps( DrawElement& rElem,
+ PropertyMap& rProps,
+ const EmitContext& rEmitContext );
+
+ public:
+ const css::uno::Reference<css::i18n::XCharacterClassification >& GetCharacterClassification();
+ explicit WriterXmlEmitter(EmitContext& rEmitContext) :
+ m_rEmitContext(rEmitContext)
+ {}
+
+ virtual void visit( HyperlinkElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( TextElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( ParagraphElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( FrameElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( PolyPolyElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( ImageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( PageElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ virtual void visit( DocumentElement&, const std::list< std::unique_ptr<Element> >::const_iterator& ) override;
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/wrapper/keyword_list b/sdext/source/pdfimport/wrapper/keyword_list
new file mode 100644
index 000000000..bf15ddb24
--- /dev/null
+++ b/sdext/source/pdfimport/wrapper/keyword_list
@@ -0,0 +1,53 @@
+struct hash_entry { const char* name; enum parseKey eKey; };
+
+#if defined __GNUC__
+#pragma GCC system_header
+#endif
+
+%%
+clipPath,CLIPPATH
+drawChar,DRAWCHAR
+drawImage,DRAWIMAGE
+drawLink,DRAWLINK
+drawMask,DRAWMASK
+drawMaskedImage,DRAWMASKEDIMAGE
+drawSoftMaskedImage,DRAWSOFTMASKEDIMAGE
+endPage,ENDPAGE
+endTextObject,ENDTEXTOBJECT
+eoClipPath,EOCLIPPATH
+eoFillPath,EOFILLPATH
+fillPath,FILLPATH
+hyperLink,HYPERLINK
+intersectClip,INTERSECTCLIP
+intersectEoClip,INTERSECTEOCLIP
+popState,POPSTATE
+pushState,PUSHSTATE
+restoreState,RESTORESTATE
+saveState,SAVESTATE
+setBlendMode,SETBLENDMODE
+setFillColor,SETFILLCOLOR
+setFont,SETFONT
+setLineCap,SETLINECAP
+setLineDash,SETLINEDASH
+setLineJoin,SETLINEJOIN
+setLineWidth,SETLINEWIDTH
+setMiterLimit,SETMITERLIMIT
+setPageNum,SETPAGENUM
+setStrokeColor,SETSTROKECOLOR
+setTextRenderMode,SETTEXTRENDERMODE
+setTransformation,SETTRANSFORMATION
+startPage,STARTPAGE
+strokePath,STROKEPATH
+updateBlendMode,UPDATEBLENDMODE
+updateCtm,UPDATECTM
+updateFillColor,UPDATEFILLCOLOR
+updateFillOpacity,UPDATEFILLOPACITY
+updateFlatness,UPDATEFLATNESS
+updateFont,UPDATEFONT
+updateLineCap,UPDATELINECAP
+updateLineDash,UPDATELINEDASH
+updateLineJoin,UPDATELINEJOIN
+updateLineWidth,UPDATELINEWIDTH
+updateMiterLimit,UPDATEMITERLIMIT
+updateStrokeColor,UPDATESTROKECOLOR
+updateStrokeOpacity,UPDATESTROKEOPACITY
diff --git a/sdext/source/pdfimport/wrapper/wrapper.cxx b/sdext/source/pdfimport/wrapper/wrapper.cxx
new file mode 100644
index 000000000..5d2a2c0b6
--- /dev/null
+++ b/sdext/source/pdfimport/wrapper/wrapper.cxx
@@ -0,0 +1,1253 @@
+/* -*- 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 <config_folders.h>
+
+#include <contentsink.hxx>
+#include <pdfparse.hxx>
+#include <pdfihelper.hxx>
+#include <wrapper.hxx>
+
+#include <o3tl/string_view.hxx>
+#include <osl/file.h>
+#include <osl/file.hxx>
+#include <osl/thread.h>
+#include <osl/process.h>
+#include <osl/diagnose.h>
+#include <rtl/bootstrap.hxx>
+#include <rtl/ustring.hxx>
+#include <rtl/strbuf.hxx>
+#include <sal/log.hxx>
+
+#include <comphelper/propertysequence.hxx>
+#include <comphelper/string.hxx>
+#include <com/sun/star/io/XInputStream.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/rendering/PathCapType.hpp>
+#include <com/sun/star/rendering/PathJoinType.hpp>
+#include <com/sun/star/rendering/XPolyPolygon2D.hpp>
+#include <com/sun/star/geometry/Matrix2D.hpp>
+#include <com/sun/star/geometry/AffineMatrix2D.hpp>
+#include <com/sun/star/geometry/RealRectangle2D.hpp>
+#include <com/sun/star/geometry/RealSize2D.hpp>
+#include <com/sun/star/task/XInteractionHandler.hpp>
+
+#include <basegfx/point/b2dpoint.hxx>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <basegfx/utils/unopolypolygon.hxx>
+
+#include <vcl/metric.hxx>
+#include <vcl/font.hxx>
+#include <vcl/virdev.hxx>
+
+#include <cstddef>
+#include <memory>
+#include <string_view>
+#include <unordered_map>
+#include <string.h>
+
+using namespace com::sun::star;
+
+namespace pdfi
+{
+
+namespace
+{
+
+// identifier of the strings coming from the out-of-process xpdf
+// converter
+enum parseKey {
+ CLIPPATH,
+ DRAWCHAR,
+ DRAWIMAGE,
+ DRAWLINK,
+ DRAWMASK,
+ DRAWMASKEDIMAGE,
+ DRAWSOFTMASKEDIMAGE,
+ ENDPAGE,
+ ENDTEXTOBJECT,
+ EOCLIPPATH,
+ EOFILLPATH,
+ FILLPATH,
+ HYPERLINK,
+ INTERSECTCLIP,
+ INTERSECTEOCLIP,
+ POPSTATE,
+ PUSHSTATE,
+ RESTORESTATE,
+ SAVESTATE,
+ SETBLENDMODE,
+ SETFILLCOLOR,
+ SETFONT,
+ SETLINECAP,
+ SETLINEDASH,
+ SETLINEJOIN,
+ SETLINEWIDTH,
+ SETMITERLIMIT,
+ SETPAGENUM,
+ SETSTROKECOLOR,
+ SETTEXTRENDERMODE,
+ SETTRANSFORMATION,
+ STARTPAGE,
+ STROKEPATH,
+ UPDATEBLENDMODE,
+ UPDATECTM,
+ UPDATEFILLCOLOR,
+ UPDATEFILLOPACITY,
+ UPDATEFLATNESS,
+ UPDATEFONT,
+ UPDATELINECAP,
+ UPDATELINEDASH,
+ UPDATELINEJOIN,
+ UPDATELINEWIDTH,
+ UPDATEMITERLIMIT,
+ UPDATESTROKECOLOR,
+ UPDATESTROKEOPACITY,
+ NONE
+};
+
+#if defined _MSC_VER && defined __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-register"
+#pragma clang diagnostic ignored "-Wextra-tokens"
+#endif
+#include <hash.cxx>
+#if defined _MSC_VER && defined __clang__
+#pragma clang diagnostic pop
+#endif
+
+class Parser
+{
+ friend class LineParser;
+
+ typedef std::unordered_map< sal_Int64,
+ FontAttributes > FontMapType;
+
+ ScopedVclPtr<VirtualDevice> m_xDev;
+ const uno::Reference<uno::XComponentContext> m_xContext;
+ const ContentSinkSharedPtr m_pSink;
+ const oslFileHandle m_pErr;
+ FontMapType m_aFontMap;
+
+public:
+ Parser( const ContentSinkSharedPtr& rSink,
+ oslFileHandle pErr,
+ const uno::Reference<uno::XComponentContext>& xContext ) :
+ m_xContext(xContext),
+ m_pSink(rSink),
+ m_pErr(pErr),
+ m_aFontMap(101)
+ {}
+
+ void parseLine( const OString& rLine );
+};
+
+class LineParser {
+ Parser & m_parser;
+ OString m_aLine;
+
+ static void parseFontFamilyName( FontAttributes& aResult );
+ void readInt32( sal_Int32& o_Value );
+ void readInt64( sal_Int64& o_Value );
+ void readDouble( double& o_Value );
+ void readBinaryData( uno::Sequence<sal_Int8>& rBuf );
+
+ uno::Sequence<beans::PropertyValue> readImageImpl();
+
+public:
+ std::size_t m_nCharIndex = 0;
+
+ LineParser(Parser & parser, OString const & line): m_parser(parser), m_aLine(line) {}
+
+ std::string_view readNextToken();
+ sal_Int32 readInt32();
+ double readDouble();
+
+ uno::Reference<rendering::XPolyPolygon2D> readPath();
+
+ void readChar();
+ void readLineCap();
+ void readLineDash();
+ void readLineJoin();
+ void readTransformation();
+ rendering::ARGBColor readColor();
+ void readFont();
+
+ void readImage();
+ void readMask();
+ void readLink();
+ void readMaskedImage();
+ void readSoftMaskedImage();
+};
+
+/** Unescapes line-ending characters in input string. These
+ characters are encoded as pairs of characters: '\\' 'n', resp.
+ '\\' 'r'. This function converts them back to '\n', resp. '\r'.
+ */
+OString lcl_unescapeLineFeeds(std::string_view i_rStr)
+{
+ const size_t nOrigLen(i_rStr.size());
+ const char* const pOrig(i_rStr.data());
+ std::unique_ptr<char[]> pBuffer(new char[nOrigLen + 1]);
+
+ const char* pRead(pOrig);
+ char* pWrite(pBuffer.get());
+ const char* pCur(pOrig);
+ while ((pCur = strchr(pCur, '\\')) != nullptr)
+ {
+ const char cNext(pCur[1]);
+ if (cNext == 'n' || cNext == 'r' || cNext == '\\')
+ {
+ const size_t nLen(pCur - pRead);
+ strncpy(pWrite, pRead, nLen);
+ pWrite += nLen;
+ *pWrite = cNext == 'n' ? '\n' : (cNext == 'r' ? '\r' : '\\');
+ ++pWrite;
+ pCur = pRead = pCur + 2;
+ }
+ else
+ {
+ // Just continue on the next character. The current
+ // block will be copied the next time it goes through the
+ // 'if' branch.
+ ++pCur;
+ }
+ }
+ // maybe there are some data to copy yet
+ if (sal::static_int_cast<size_t>(pRead - pOrig) < nOrigLen)
+ {
+ const size_t nLen(nOrigLen - (pRead - pOrig));
+ strncpy(pWrite, pRead, nLen);
+ pWrite += nLen;
+ }
+ *pWrite = '\0';
+
+ OString aResult(pBuffer.get());
+ return aResult;
+}
+
+std::string_view LineParser::readNextToken()
+{
+ if (m_nCharIndex == std::string_view::npos) {
+ SAL_WARN("sdext.pdfimport", "insufficient input");
+ return {};
+ }
+ return o3tl::getToken(m_aLine,' ',m_nCharIndex);
+}
+
+void LineParser::readInt32( sal_Int32& o_Value )
+{
+ std::string_view tok = readNextToken();
+ o_Value = o3tl::toInt32(tok);
+}
+
+sal_Int32 LineParser::readInt32()
+{
+ std::string_view tok = readNextToken();
+ return o3tl::toInt32(tok);
+}
+
+void LineParser::readInt64( sal_Int64& o_Value )
+{
+ std::string_view tok = readNextToken();
+ o_Value = o3tl::toInt64(tok);
+}
+
+void LineParser::readDouble( double& o_Value )
+{
+ std::string_view tok = readNextToken();
+ o_Value = rtl_math_stringToDouble(tok.data(), tok.data() + tok.size(), '.', 0,
+ nullptr, nullptr);
+}
+
+double LineParser::readDouble()
+{
+ std::string_view tok = readNextToken();
+ return rtl_math_stringToDouble(tok.data(), tok.data() + tok.size(), '.', 0,
+ nullptr, nullptr);
+}
+
+void LineParser::readBinaryData( uno::Sequence<sal_Int8>& rBuf )
+{
+ sal_Int32 nFileLen( rBuf.getLength() );
+ sal_Int8* pBuf( rBuf.getArray() );
+ sal_uInt64 nBytesRead(0);
+ oslFileError nRes=osl_File_E_None;
+ while( nFileLen )
+ {
+ nRes = osl_readFile( m_parser.m_pErr, pBuf, nFileLen, &nBytesRead );
+ if (osl_File_E_None != nRes )
+ break;
+ pBuf += nBytesRead;
+ nFileLen -= sal::static_int_cast<sal_Int32>(nBytesRead);
+ }
+
+ OSL_PRECOND(nRes==osl_File_E_None, "inconsistent data");
+}
+
+uno::Reference<rendering::XPolyPolygon2D> LineParser::readPath()
+{
+ static const std::string_view aSubPathMarker( "subpath" );
+
+ if( readNextToken() != aSubPathMarker )
+ OSL_PRECOND(false, "broken path");
+
+ basegfx::B2DPolyPolygon aResult;
+ while( m_nCharIndex != std::string_view::npos )
+ {
+ basegfx::B2DPolygon aSubPath;
+
+ sal_Int32 nClosedFlag;
+ readInt32( nClosedFlag );
+ aSubPath.setClosed( nClosedFlag != 0 );
+
+ sal_Int32 nContiguousControlPoints(0);
+
+ while( m_nCharIndex != std::string_view::npos )
+ {
+ std::size_t nDummy=m_nCharIndex;
+ if (o3tl::getToken(m_aLine,' ',nDummy) == aSubPathMarker) {
+ break;
+ }
+
+ sal_Int32 nCurveFlag;
+ double nX, nY;
+ readDouble( nX );
+ readDouble( nY );
+ readInt32( nCurveFlag );
+
+ aSubPath.append(basegfx::B2DPoint(nX,nY));
+ if( nCurveFlag )
+ {
+ ++nContiguousControlPoints;
+ }
+ else if( nContiguousControlPoints )
+ {
+ OSL_PRECOND(nContiguousControlPoints==2,"broken bezier path");
+
+ // have two control points before us. the current one
+ // is a normal point - thus, convert previous points
+ // into bezier segment
+ const sal_uInt32 nPoints( aSubPath.count() );
+ const basegfx::B2DPoint aCtrlA( aSubPath.getB2DPoint(nPoints-3) );
+ const basegfx::B2DPoint aCtrlB( aSubPath.getB2DPoint(nPoints-2) );
+ const basegfx::B2DPoint aEnd( aSubPath.getB2DPoint(nPoints-1) );
+ aSubPath.remove(nPoints-3, 3);
+ aSubPath.appendBezierSegment(aCtrlA, aCtrlB, aEnd);
+
+ nContiguousControlPoints=0;
+ }
+ }
+
+ aResult.append( aSubPath );
+ if( m_nCharIndex != std::string_view::npos )
+ readNextToken();
+ }
+
+ return static_cast<rendering::XLinePolyPolygon2D*>(
+ new basegfx::unotools::UnoPolyPolygon(std::move(aResult)));
+}
+
+void LineParser::readChar()
+{
+ double fontSize;
+ geometry::Matrix2D aUnoMatrix;
+ geometry::RealRectangle2D aRect;
+
+ readDouble(aRect.X1);
+ readDouble(aRect.Y1);
+ readDouble(aRect.X2);
+ readDouble(aRect.Y2);
+ readDouble(aUnoMatrix.m00);
+ readDouble(aUnoMatrix.m01);
+ readDouble(aUnoMatrix.m10);
+ readDouble(aUnoMatrix.m11);
+ readDouble(fontSize);
+
+ OString aChars;
+
+ if (m_nCharIndex != std::string_view::npos)
+ aChars = lcl_unescapeLineFeeds( m_aLine.subView( m_nCharIndex ) );
+
+ // chars gobble up rest of line
+ m_nCharIndex = std::string_view::npos;
+
+ m_parser.m_pSink->drawGlyphs(OStringToOUString(aChars, RTL_TEXTENCODING_UTF8),
+ aRect, aUnoMatrix, fontSize);
+}
+
+void LineParser::readLineCap()
+{
+ sal_Int8 nCap(rendering::PathCapType::BUTT);
+ switch( readInt32() )
+ {
+ default:
+ case 0: nCap = rendering::PathCapType::BUTT; break;
+ case 1: nCap = rendering::PathCapType::ROUND; break;
+ case 2: nCap = rendering::PathCapType::SQUARE; break;
+ }
+ m_parser.m_pSink->setLineCap(nCap);
+}
+
+void LineParser::readLineDash()
+{
+ if( m_nCharIndex == std::string_view::npos )
+ {
+ m_parser.m_pSink->setLineDash( uno::Sequence<double>(), 0.0 );
+ return;
+ }
+
+ const double nOffset(readDouble());
+ const sal_Int32 nLen(readInt32());
+
+ uno::Sequence<double> aDashArray(nLen);
+ double* pArray=aDashArray.getArray();
+ for( sal_Int32 i=0; i<nLen; ++i )
+ *pArray++ = readDouble();
+
+ m_parser.m_pSink->setLineDash( aDashArray, nOffset );
+}
+
+void LineParser::readLineJoin()
+{
+ sal_Int8 nJoin(rendering::PathJoinType::MITER);
+ switch( readInt32() )
+ {
+ default:
+ case 0: nJoin = rendering::PathJoinType::MITER; break;
+ case 1: nJoin = rendering::PathJoinType::ROUND; break;
+ case 2: nJoin = rendering::PathJoinType::BEVEL; break;
+ }
+ m_parser.m_pSink->setLineJoin(nJoin);
+}
+
+void LineParser::readTransformation()
+{
+ geometry::AffineMatrix2D aMat;
+ readDouble(aMat.m00);
+ readDouble(aMat.m10);
+ readDouble(aMat.m01);
+ readDouble(aMat.m11);
+ readDouble(aMat.m02);
+ readDouble(aMat.m12);
+ m_parser.m_pSink->setTransformation( aMat );
+}
+
+rendering::ARGBColor LineParser::readColor()
+{
+ rendering::ARGBColor aRes;
+ readDouble(aRes.Red);
+ readDouble(aRes.Green);
+ readDouble(aRes.Blue);
+ readDouble(aRes.Alpha);
+ return aRes;
+}
+
+/* Parse and convert the font family name (passed from xpdfimport) to correct font names
+e.g. TimesNewRomanPSMT -> TimesNewRoman
+ TimesNewRomanPS-BoldMT -> TimesNewRoman
+ TimesNewRomanPS-BoldItalicMT -> TimesNewRoman
+During the conversion, also apply the font features (bold italic etc) to the result.
+
+TODO: Further convert the font names to real font names in the system rather than the PS names.
+e.g., TimesNewRoman -> Times New Roman
+*/
+void LineParser::parseFontFamilyName( FontAttributes& rResult )
+{
+ SAL_INFO("sdext.pdfimport", "Processing " << rResult.familyName << " ---");
+ rResult.familyName = rResult.familyName.trim();
+ for (const OUString& fontAttributesSuffix: fontAttributesSuffixes)
+ {
+ if ( rResult.familyName.endsWith(fontAttributesSuffix) )
+ {
+ rResult.familyName = rResult.familyName.replaceAll(fontAttributesSuffix, "");
+ SAL_INFO("sdext.pdfimport", rResult.familyName);
+ if (fontAttributesSuffix == u"Heavy" || fontAttributesSuffix == u"Black")
+ {
+ rResult.fontWeight = u"900";
+ }
+ else if (fontAttributesSuffix == u"ExtraBold" || fontAttributesSuffix == u"UltraBold")
+ {
+ rResult.fontWeight = u"800";
+ }
+ else if (fontAttributesSuffix == u"Bold")
+ {
+ rResult.fontWeight = u"bold";
+ }
+ else if (fontAttributesSuffix == u"Semibold")
+ {
+ rResult.fontWeight = u"600";
+ }
+ else if (fontAttributesSuffix == u"Medium")
+ {
+ rResult.fontWeight = u"500";
+ }
+ else if (fontAttributesSuffix == u"Normal" || fontAttributesSuffix == u"Regular" || fontAttributesSuffix == u"Book")
+ {
+ rResult.fontWeight = u"400";
+ }
+ else if (fontAttributesSuffix == u"Light")
+ {
+ rResult.fontWeight = u"300";
+ }
+ else if (fontAttributesSuffix == u"ExtraLight" || fontAttributesSuffix == u"UltraLight")
+ {
+ rResult.fontWeight = u"200";
+ }
+ else if (fontAttributesSuffix == u"Thin")
+ {
+ rResult.fontWeight = u"100";
+ }
+
+ if ( (fontAttributesSuffix == "Italic") or (fontAttributesSuffix == "Oblique") )
+ {
+ rResult.isItalic = true;
+ }
+ }
+ }
+}
+
+void LineParser::readFont()
+{
+ /*
+ xpdf line is like (separated by space):
+ updateFont <FontID> <isEmbedded> <maFontWeight> <isItalic> <isUnderline> <TransformedFontSize> <nEmbedSize> <FontName>
+ updateFont 14 1 4 0 0 1200.000000 23068 TimesNewRomanPSMT
+
+ If nEmbedSize > 0, then a fontFile is followed as a stream.
+ */
+ sal_Int64 nFontID;
+ sal_Int32 nIsEmbedded;
+ sal_Int32 nFontWeight;
+ sal_Int32 nIsItalic;
+ sal_Int32 nIsUnderline;
+ double nSize;
+ sal_Int32 nFileLen;
+ OString aFontName;
+
+ readInt64(nFontID); // read FontID
+ readInt32(nIsEmbedded); // read isEmbedded
+ readInt32(nFontWeight); // read maFontWeight, see GfxFont enum Weight
+ readInt32(nIsItalic); // read isItalic
+ readInt32(nIsUnderline);// read isUnderline
+ readDouble(nSize); // read TransformedFontSize
+ readInt32(nFileLen); // read nEmbedSize
+
+ nSize = nSize < 0.0 ? -nSize : nSize;
+ // Read FontName. From the current position to the end (any white spaces will be included).
+ aFontName = lcl_unescapeLineFeeds(m_aLine.subView(m_nCharIndex));
+
+ // name gobbles up rest of line
+ m_nCharIndex = std::string_view::npos;
+
+ // Check if this font is already in our font map list.
+ // If yes, update the font size and skip.
+ Parser::FontMapType::const_iterator pFont( m_parser.m_aFontMap.find(nFontID) );
+ if( pFont != m_parser.m_aFontMap.end() )
+ {
+ OSL_PRECOND(nFileLen==0,"font data for known font");
+ FontAttributes aRes(pFont->second);
+ aRes.size = nSize;
+ m_parser.m_pSink->setFont( aRes );
+
+ return;
+ }
+
+ // The font is not yet in the map list - get info and add to map
+ OUString sFontWeight; // font weight name per ODF specifications
+ if (nFontWeight == 0 or nFontWeight == 4) // WeightNotDefined or W400, map to normal font
+ sFontWeight = u"normal";
+ else if (nFontWeight == 1) // W100, Thin
+ sFontWeight = u"100";
+ else if (nFontWeight == 2) // W200, Extra-Light
+ sFontWeight = u"200";
+ else if (nFontWeight == 3) // W300, Light
+ sFontWeight = u"300";
+ else if (nFontWeight == 5) // W500, Medium. Is this supported by ODF?
+ sFontWeight = u"500";
+ else if (nFontWeight == 6) // W600, Semi-Bold
+ sFontWeight = u"600";
+ else if (nFontWeight == 7) // W700, Bold
+ sFontWeight = u"bold";
+ else if (nFontWeight == 8) // W800, Extra-Bold
+ sFontWeight = u"800";
+ else if (nFontWeight == 9) // W900, Black
+ sFontWeight = u"900";
+ SAL_INFO("sdext.pdfimport", "Font weight passed from xpdfimport is: " << sFontWeight);
+
+ FontAttributes aResult( OStringToOUString( aFontName, RTL_TEXTENCODING_UTF8 ),
+ sFontWeight,
+ nIsItalic != 0,
+ nIsUnderline != 0,
+ nSize,
+ 1.0);
+
+ /* The above font attributes (fontName, fontWeight, italic) are based on
+ xpdf line output and may not be reliable. To get correct attributes,
+ we do the following:
+ 1. Read the embedded font file and determine the attributes based on the
+ font file.
+ 2. If we failed to read the font file, or empty result is returned, then
+ determine the font attributes from the font name.
+ 3. If all these attempts have failed, then use a fallback font.
+ */
+ if (nFileLen > 0)
+ {
+ uno::Sequence<sal_Int8> aFontFile(nFileLen);
+ readBinaryData(aFontFile); // Read fontFile.
+
+ vcl::Font aFontReadResult = vcl::Font::identifyFont(aFontFile.getArray(), nFileLen);
+ SAL_INFO("sdext.pdfimport", "familyName: " << aFontReadResult.GetFamilyName());
+
+ if (!aFontReadResult.GetFamilyName().isEmpty()) // font detection successful
+ {
+ // Family name
+ aResult.familyName = aFontReadResult.GetFamilyName();
+ SAL_INFO("sdext.pdfimport", aResult.familyName);
+ // tdf#143959: there are cases when the family name returned by font descriptor
+ // is like "AAAAAA+TimesNewRoman,Bold". In this case, use the font name
+ // determined by parseFontFamilyName instead, but still determine the font
+ // attributes (bold italic etc) from the font descriptor.
+ if (aResult.familyName.getLength() > 7 and aResult.familyName.indexOf(u"+", 6) == 6)
+ {
+ aResult.familyName = aResult.familyName.copy(7, aResult.familyName.getLength() - 7);
+ parseFontFamilyName(aResult);
+ }
+ if (aResult.familyName.endsWithIgnoreAsciiCase("-VKana"))
+ {
+ parseFontFamilyName(aResult);
+ }
+
+ // Font weight
+ if (aFontReadResult.GetWeight() == WEIGHT_THIN)
+ aResult.fontWeight = u"100";
+ else if (aFontReadResult.GetWeight() == WEIGHT_ULTRALIGHT)
+ aResult.fontWeight = u"200";
+ else if (aFontReadResult.GetWeight() == WEIGHT_LIGHT)
+ aResult.fontWeight = u"300";
+ else if (aFontReadResult.GetWeight() == WEIGHT_SEMILIGHT)
+ aResult.fontWeight = u"350";
+ // no need to check "normal" here as this is default in nFontWeight above
+ else if (aFontReadResult.GetWeight() == WEIGHT_SEMIBOLD)
+ aResult.fontWeight = u"600";
+ else if (aFontReadResult.GetWeight() == WEIGHT_BOLD)
+ aResult.fontWeight = u"bold";
+ else if (aFontReadResult.GetWeight() == WEIGHT_ULTRABOLD)
+ aResult.fontWeight = u"800";
+ else if (aFontReadResult.GetWeight() == WEIGHT_BLACK)
+ aResult.fontWeight = u"900";
+ SAL_INFO("sdext.pdfimport", aResult.fontWeight);
+
+ // Italic
+ aResult.isItalic = (aFontReadResult.GetItalic() == ITALIC_OBLIQUE ||
+ aFontReadResult.GetItalic() == ITALIC_NORMAL);
+ } else // font detection failed
+ {
+ SAL_WARN("sdext.pdfimport",
+ "Font detection from fontFile returned empty result. Guessing font info from font name.");
+ parseFontFamilyName(aResult);
+ }
+
+ } else // no embedded font file - guess font attributes from font name
+ {
+ parseFontFamilyName(aResult);
+ }
+
+ // last fallback
+ if (aResult.familyName.isEmpty())
+ {
+ SAL_WARN("sdext.pdfimport", "Failed to determine the font, using a fallback font Arial.");
+ aResult.familyName = "Arial";
+ }
+
+ if (!m_parser.m_xDev)
+ m_parser.m_xDev.disposeAndReset(VclPtr<VirtualDevice>::Create());
+
+ vcl::Font font(aResult.familyName, Size(0, 1000));
+ m_parser.m_xDev->SetFont(font);
+ FontMetric metric(m_parser.m_xDev->GetFontMetric());
+ aResult.ascent = metric.GetAscent() / 1000.0;
+
+ m_parser.m_aFontMap[nFontID] = aResult;
+
+ aResult.size = nSize;
+ m_parser.m_pSink->setFont(aResult);
+}
+
+uno::Sequence<beans::PropertyValue> LineParser::readImageImpl()
+{
+ std::string_view aToken = readNextToken();
+ const sal_Int32 nImageSize( readInt32() );
+
+ OUString aFileName;
+ if( aToken == "PNG" )
+ aFileName = "DUMMY.PNG";
+ else if( aToken == "JPEG" )
+ aFileName = "DUMMY.JPEG";
+ else if( aToken == "PBM" )
+ aFileName = "DUMMY.PBM";
+ else
+ {
+ SAL_WARN_IF(aToken != "PPM","sdext.pdfimport","Invalid bitmap format");
+ aFileName = "DUMMY.PPM";
+ }
+
+ uno::Sequence<sal_Int8> aDataSequence(nImageSize);
+ readBinaryData( aDataSequence );
+
+ uno::Sequence< uno::Any > aStreamCreationArgs{ uno::Any(aDataSequence) };
+
+ uno::Reference< uno::XComponentContext > xContext( m_parser.m_xContext, uno::UNO_SET_THROW );
+ uno::Reference< lang::XMultiComponentFactory > xFactory( xContext->getServiceManager(), uno::UNO_SET_THROW );
+ uno::Reference< io::XInputStream > xDataStream(
+ xFactory->createInstanceWithArgumentsAndContext( "com.sun.star.io.SequenceInputStream", aStreamCreationArgs, m_parser.m_xContext ),
+ uno::UNO_QUERY_THROW );
+
+ uno::Sequence<beans::PropertyValue> aSequence( comphelper::InitPropertySequence({
+ { "URL", uno::Any(aFileName) },
+ { "InputStream", uno::Any( xDataStream ) },
+ { "InputSequence", uno::Any(aDataSequence) }
+ }));
+
+ return aSequence;
+}
+
+void LineParser::readImage()
+{
+ sal_Int32 nWidth, nHeight,nMaskColors;
+ readInt32(nWidth);
+ readInt32(nHeight);
+ readInt32(nMaskColors);
+
+ uno::Sequence<beans::PropertyValue> aImg( readImageImpl() );
+
+ if( nMaskColors )
+ {
+ uno::Sequence<sal_Int8> aDataSequence(nMaskColors);
+ readBinaryData( aDataSequence );
+
+ uno::Sequence<double> aMinRange(nMaskColors/2);
+ auto pMinRange = aMinRange.getArray();
+ uno::Sequence<double> aMaxRange(nMaskColors/2);
+ auto pMaxRange = aMaxRange.getArray();
+ for( sal_Int32 i=0; i<nMaskColors/2; ++i )
+ {
+ pMinRange[i] = aDataSequence[i] / 255.0;
+ pMaxRange[i] = aDataSequence[i+nMaskColors/2] / 255.0;
+ }
+
+ uno::Sequence<uno::Any> aMaskRanges{ uno::Any(aMinRange), uno::Any(aMaxRange) };
+ m_parser.m_pSink->drawColorMaskedImage( aImg, aMaskRanges );
+ }
+ else
+ m_parser.m_pSink->drawImage( aImg );
+}
+
+void LineParser::readMask()
+{
+ sal_Int32 nWidth, nHeight, nInvert;
+ readInt32(nWidth);
+ readInt32(nHeight);
+ readInt32(nInvert);
+
+ m_parser.m_pSink->drawMask( readImageImpl(), nInvert != 0);
+}
+
+void LineParser::readLink()
+{
+ geometry::RealRectangle2D aBounds;
+ readDouble(aBounds.X1);
+ readDouble(aBounds.Y1);
+ readDouble(aBounds.X2);
+ readDouble(aBounds.Y2);
+
+ m_parser.m_pSink->hyperLink( aBounds,
+ OStringToOUString( lcl_unescapeLineFeeds(
+ m_aLine.subView(m_nCharIndex) ),
+ RTL_TEXTENCODING_UTF8 ) );
+ // name gobbles up rest of line
+ m_nCharIndex = std::string_view::npos;
+}
+
+void LineParser::readMaskedImage()
+{
+ sal_Int32 nWidth, nHeight, nMaskWidth, nMaskHeight, nMaskInvert;
+ readInt32(nWidth);
+ readInt32(nHeight);
+ readInt32(nMaskWidth);
+ readInt32(nMaskHeight);
+ readInt32(nMaskInvert);
+
+ const uno::Sequence<beans::PropertyValue> aImage( readImageImpl() );
+ const uno::Sequence<beans::PropertyValue> aMask ( readImageImpl() );
+ m_parser.m_pSink->drawMaskedImage( aImage, aMask, nMaskInvert != 0 );
+}
+
+void LineParser::readSoftMaskedImage()
+{
+ sal_Int32 nWidth, nHeight, nMaskWidth, nMaskHeight;
+ readInt32(nWidth);
+ readInt32(nHeight);
+ readInt32(nMaskWidth);
+ readInt32(nMaskHeight);
+
+ const uno::Sequence<beans::PropertyValue> aImage( readImageImpl() );
+ const uno::Sequence<beans::PropertyValue> aMask ( readImageImpl() );
+ m_parser.m_pSink->drawAlphaMaskedImage( aImage, aMask );
+}
+
+void Parser::parseLine( const OString& rLine )
+{
+ OSL_PRECOND( m_pSink, "Invalid sink" );
+ OSL_PRECOND( m_pErr, "Invalid filehandle" );
+ OSL_PRECOND( m_xContext.is(), "Invalid service factory" );
+
+ LineParser lp(*this, rLine);
+ const std::string_view rCmd = lp.readNextToken();
+ const hash_entry* pEntry = PdfKeywordHash::in_word_set( rCmd.data(),
+ rCmd.size() );
+ OSL_ASSERT(pEntry);
+ switch( pEntry->eKey )
+ {
+ case CLIPPATH:
+ m_pSink->intersectClip(lp.readPath()); break;
+ case DRAWCHAR:
+ lp.readChar(); break;
+ case DRAWIMAGE:
+ lp.readImage(); break;
+ case DRAWLINK:
+ lp.readLink(); break;
+ case DRAWMASK:
+ lp.readMask(); break;
+ case DRAWMASKEDIMAGE:
+ lp.readMaskedImage(); break;
+ case DRAWSOFTMASKEDIMAGE:
+ lp.readSoftMaskedImage(); break;
+ case ENDPAGE:
+ m_pSink->endPage(); break;
+ case ENDTEXTOBJECT:
+ m_pSink->endText(); break;
+ case EOCLIPPATH:
+ m_pSink->intersectEoClip(lp.readPath()); break;
+ case EOFILLPATH:
+ m_pSink->eoFillPath(lp.readPath()); break;
+ case FILLPATH:
+ m_pSink->fillPath(lp.readPath()); break;
+ case RESTORESTATE:
+ m_pSink->popState(); break;
+ case SAVESTATE:
+ m_pSink->pushState(); break;
+ case SETPAGENUM:
+ m_pSink->setPageNum( lp.readInt32() ); break;
+ case STARTPAGE:
+ {
+ const double nWidth ( lp.readDouble() );
+ const double nHeight( lp.readDouble() );
+ m_pSink->startPage( geometry::RealSize2D( nWidth, nHeight ) );
+ break;
+ }
+ case STROKEPATH:
+ m_pSink->strokePath(lp.readPath()); break;
+ case UPDATECTM:
+ lp.readTransformation(); break;
+ case UPDATEFILLCOLOR:
+ m_pSink->setFillColor( lp.readColor() ); break;
+ case UPDATEFLATNESS:
+ m_pSink->setFlatness( lp.readDouble( ) ); break;
+ case UPDATEFONT:
+ lp.readFont(); break;
+ case UPDATELINECAP:
+ lp.readLineCap(); break;
+ case UPDATELINEDASH:
+ lp.readLineDash(); break;
+ case UPDATELINEJOIN:
+ lp.readLineJoin(); break;
+ case UPDATELINEWIDTH:
+ m_pSink->setLineWidth( lp.readDouble() );break;
+ case UPDATEMITERLIMIT:
+ m_pSink->setMiterLimit( lp.readDouble() ); break;
+ case UPDATESTROKECOLOR:
+ m_pSink->setStrokeColor( lp.readColor() ); break;
+ case UPDATESTROKEOPACITY:
+ break;
+ case SETTEXTRENDERMODE:
+ m_pSink->setTextRenderMode( lp.readInt32() ); break;
+
+ case NONE:
+ default:
+ OSL_PRECOND(false,"Unknown input");
+ break;
+ }
+
+ // all consumed?
+ SAL_WARN_IF(
+ lp.m_nCharIndex!=std::string_view::npos, "sdext.pdfimport", "leftover scanner input");
+}
+
+} // namespace
+
+static bool checkEncryption( std::u16string_view i_rPath,
+ const uno::Reference< task::XInteractionHandler >& i_xIHdl,
+ OUString& io_rPwd,
+ bool& o_rIsEncrypted,
+ const OUString& i_rDocName
+ )
+{
+ bool bSuccess = false;
+ OString aPDFFile = OUStringToOString( i_rPath, osl_getThreadTextEncoding() );
+
+ std::unique_ptr<pdfparse::PDFEntry> pEntry( pdfparse::PDFReader::read( aPDFFile.getStr() ));
+ if( pEntry )
+ {
+ pdfparse::PDFFile* pPDFFile = dynamic_cast<pdfparse::PDFFile*>(pEntry.get());
+ if( pPDFFile )
+ {
+ o_rIsEncrypted = pPDFFile->isEncrypted();
+ if( o_rIsEncrypted )
+ {
+ if( pPDFFile->usesSupportedEncryptionFormat() )
+ {
+ bool bAuthenticated = false;
+ if( !io_rPwd.isEmpty() )
+ {
+ OString aIsoPwd = OUStringToOString( io_rPwd,
+ RTL_TEXTENCODING_ISO_8859_1 );
+ bAuthenticated = pPDFFile->setupDecryptionData( aIsoPwd.getStr() );
+ }
+ if( bAuthenticated )
+ bSuccess = true;
+ else
+ {
+ if( i_xIHdl.is() )
+ {
+ bool bEntered = false;
+ do
+ {
+ bEntered = getPassword( i_xIHdl, io_rPwd, ! bEntered, i_rDocName );
+ OString aIsoPwd = OUStringToOString( io_rPwd,
+ RTL_TEXTENCODING_ISO_8859_1 );
+ bAuthenticated = pPDFFile->setupDecryptionData( aIsoPwd.getStr() );
+ } while( bEntered && ! bAuthenticated );
+ }
+
+ bSuccess = bAuthenticated;
+ }
+ }
+ else if( i_xIHdl.is() )
+ {
+ reportUnsupportedEncryptionFormat( i_xIHdl );
+ //TODO: this should either be handled further down the
+ // call stack, or else information that this has already
+ // been handled should be passed down the call stack, so
+ // that SfxBaseModel::load does not show an additional
+ // "General Error" message box
+ }
+ }
+ else
+ bSuccess = true;
+ }
+ }
+ return bSuccess;
+}
+
+namespace {
+
+class Buffering
+{
+ static const int SIZE = 64*1024;
+ std::unique_ptr<char[]> aBuffer;
+ oslFileHandle& pOut;
+ size_t pos;
+ sal_uInt64 left;
+
+public:
+ explicit Buffering(oslFileHandle& out) : aBuffer(new char[SIZE]), pOut(out), pos(0), left(0) {}
+
+ oslFileError read(char *pChar, short count, sal_uInt64* pBytesRead)
+ {
+ oslFileError nRes = osl_File_E_None;
+ sal_uInt64 nBytesRead = 0;
+ while (count > 0)
+ {
+ if (left == 0)
+ {
+ nRes = osl_readFile(pOut, aBuffer.get(), SIZE, &left);
+ if (nRes != osl_File_E_None || left == 0)
+ {
+ *pBytesRead = nBytesRead;
+ return nRes;
+ }
+ pos = 0;
+ }
+ *pChar = aBuffer.get()[pos];
+ --count;
+ ++pos;
+ --left;
+ ++pChar;
+ ++nBytesRead;
+ }
+ *pBytesRead = nBytesRead;
+ return osl_File_E_None;
+ }
+};
+
+}
+
+bool xpdf_ImportFromFile(const OUString& rURL,
+ const ContentSinkSharedPtr& rSink,
+ const uno::Reference<task::XInteractionHandler>& xIHdl,
+ const OUString& rPwd,
+ const uno::Reference<uno::XComponentContext>& xContext,
+ const OUString& rFilterOptions)
+{
+ OSL_ASSERT(rSink);
+
+ OUString aSysUPath;
+ if( osl_getSystemPathFromFileURL( rURL.pData, &aSysUPath.pData ) != osl_File_E_None )
+ {
+ SAL_WARN(
+ "sdext.pdfimport",
+ "getSystemPathFromFileURL(" << rURL << ") failed");
+ return false;
+ }
+ OUString aDocName( rURL.copy( rURL.lastIndexOf( '/' )+1 ) );
+
+ // check for encryption, if necessary get password
+ OUString aPwd( rPwd );
+ bool bIsEncrypted = false;
+ if( !checkEncryption( aSysUPath, xIHdl, aPwd, bIsEncrypted, aDocName ) )
+ {
+ SAL_INFO(
+ "sdext.pdfimport",
+ "checkEncryption(" << aSysUPath << ") failed");
+ return false;
+ }
+
+ // Determine xpdfimport executable URL:
+ OUString converterURL("$BRAND_BASE_DIR/" LIBO_BIN_FOLDER "/xpdfimport");
+ rtl::Bootstrap::expandMacros(converterURL); //TODO: detect failure
+
+ // Determine pathname of xpdfimport_err.pdf:
+ OUString errPathname("$BRAND_BASE_DIR/" LIBO_SHARE_FOLDER "/xpdfimport/xpdfimport_err.pdf");
+ rtl::Bootstrap::expandMacros(errPathname); //TODO: detect failure
+ if (osl::FileBase::getSystemPathFromFileURL(errPathname, errPathname)
+ != osl::FileBase::E_None)
+ {
+ SAL_WARN(
+ "sdext.pdfimport",
+ "getSystemPathFromFileURL(" << errPathname << ") failed");
+ return false;
+ }
+
+ // spawn separate process to keep LGPL/GPL code apart.
+
+ OUString aOptFlag("-o");
+ rtl_uString* args[] = { aSysUPath.pData, errPathname.pData,
+ aOptFlag.pData, rFilterOptions.pData };
+ sal_Int32 nArgs = rFilterOptions.isEmpty() ? 2 : 4;
+
+ oslProcess aProcess;
+ oslFileHandle pIn = nullptr;
+ oslFileHandle pOut = nullptr;
+ oslFileHandle pErr = nullptr;
+ oslSecurity pSecurity = osl_getCurrentSecurity ();
+ oslProcessError eErr =
+ osl_executeProcess_WithRedirectedIO(converterURL.pData,
+ args,
+ nArgs,
+ osl_Process_SEARCHPATH|osl_Process_HIDDEN,
+ pSecurity,
+ nullptr, nullptr, 0,
+ &aProcess, &pIn, &pOut, &pErr);
+ osl_freeSecurityHandle(pSecurity);
+
+ bool bRet=true;
+ try
+ {
+ if( eErr!=osl_Process_E_None )
+ {
+ SAL_WARN(
+ "sdext.pdfimport",
+ "executeProcess of " << converterURL << " failed with "
+ << +eErr);
+ return false;
+ }
+
+ if( pIn )
+ {
+ OStringBuffer aBuf(256);
+ if( bIsEncrypted )
+ aBuf.append( OUStringToOString( aPwd, RTL_TEXTENCODING_ISO_8859_1 ) );
+ aBuf.append( '\n' );
+
+ sal_uInt64 nWritten = 0;
+ osl_writeFile( pIn, aBuf.getStr(), sal_uInt64(aBuf.getLength()), &nWritten );
+ }
+
+ if( pOut && pErr )
+ {
+ // read results of PDF parser. One line - one call to
+ // OutputDev. stderr is used for alternate streams, like
+ // embedded fonts and bitmaps
+ Parser aParser(rSink,pErr,xContext);
+ Buffering aBuffering(pOut);
+ OStringBuffer line;
+ for( ;; )
+ {
+ char aChar('\n');
+ sal_uInt64 nBytesRead;
+ oslFileError nRes;
+
+ // skip garbage \r \n at start of line
+ for (;;)
+ {
+ nRes = aBuffering.read(&aChar, 1, &nBytesRead);
+ if (osl_File_E_None != nRes || nBytesRead != 1 || (aChar != '\n' && aChar != '\r') )
+ break;
+ }
+ if ( osl_File_E_None != nRes )
+ break;
+
+ if( aChar != '\n' && aChar != '\r' )
+ line.append( aChar );
+
+ for (;;)
+ {
+ nRes = aBuffering.read(&aChar, 1, &nBytesRead);
+ if ( osl_File_E_None != nRes || nBytesRead != 1 || aChar == '\n' || aChar == '\r' )
+ break;
+ line.append( aChar );
+ }
+ if ( osl_File_E_None != nRes )
+ break;
+ if ( line.isEmpty() )
+ break;
+
+ aParser.parseLine(line.makeStringAndClear());
+ }
+ }
+ }
+ catch( uno::Exception& )
+ {
+ // crappy C file interface. need manual resource dealloc
+ bRet = false;
+ }
+
+ if( pIn )
+ osl_closeFile(pIn);
+ if( pOut )
+ osl_closeFile(pOut);
+ if( pErr )
+ osl_closeFile(pErr);
+ eErr = osl_joinProcess(aProcess);
+ if (eErr == osl_Process_E_None)
+ {
+ oslProcessInfo info;
+ info.Size = sizeof info;
+ eErr = osl_getProcessInfo(aProcess, osl_Process_EXITCODE, &info);
+ if (eErr == osl_Process_E_None)
+ {
+ if (info.Code != 0)
+ {
+ SAL_WARN(
+ "sdext.pdfimport",
+ "getProcessInfo of " << converterURL
+ << " failed with exit code " << info.Code);
+ bRet = false;
+ }
+ }
+ else
+ {
+ SAL_WARN(
+ "sdext.pdfimport",
+ "getProcessInfo of " << converterURL << " failed with "
+ << +eErr);
+ bRet = false;
+ }
+ }
+ else
+ {
+ SAL_WARN(
+ "sdext.pdfimport",
+ "joinProcess of " << converterURL << " failed with " << +eErr);
+ bRet = false;
+ }
+ osl_freeProcessHandle(aProcess);
+ return bRet;
+}
+
+
+bool xpdf_ImportFromStream( const uno::Reference< io::XInputStream >& xInput,
+ const ContentSinkSharedPtr& rSink,
+ const uno::Reference<task::XInteractionHandler >& xIHdl,
+ const OUString& rPwd,
+ const uno::Reference< uno::XComponentContext >& xContext,
+ const OUString& rFilterOptions )
+{
+ OSL_ASSERT(xInput.is());
+ OSL_ASSERT(rSink);
+
+ // convert XInputStream to local temp file
+ oslFileHandle aFile = nullptr;
+ OUString aURL;
+ if( osl_createTempFile( nullptr, &aFile, &aURL.pData ) != osl_File_E_None )
+ return false;
+
+ // copy content, buffered...
+ const sal_uInt32 nBufSize = 4096;
+ uno::Sequence<sal_Int8> aBuf( nBufSize );
+ sal_uInt64 nBytes = 0;
+ sal_uInt64 nWritten = 0;
+ bool bSuccess = true;
+ do
+ {
+ try
+ {
+ nBytes = xInput->readBytes( aBuf, nBufSize );
+ }
+ catch( css::uno::Exception& )
+ {
+ osl_closeFile( aFile );
+ throw;
+ }
+ if( nBytes > 0 )
+ {
+ osl_writeFile( aFile, aBuf.getConstArray(), nBytes, &nWritten );
+ if( nWritten != nBytes )
+ {
+ bSuccess = false;
+ break;
+ }
+ }
+ }
+ while( nBytes == nBufSize );
+
+ osl_closeFile( aFile );
+
+ if ( bSuccess )
+ bSuccess = xpdf_ImportFromFile( aURL, rSink, xIHdl, rPwd, xContext, rFilterOptions );
+ osl_removeFile( aURL.pData );
+
+ return bSuccess;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/xpdftest/binary_0_out.def b/sdext/source/pdfimport/xpdftest/binary_0_out.def
new file mode 100644
index 000000000..3729d923a
--- /dev/null
+++ b/sdext/source/pdfimport/xpdftest/binary_0_out.def
Binary files differ
diff --git a/sdext/source/pdfimport/xpdftest/binary_1_out.def b/sdext/source/pdfimport/xpdftest/binary_1_out.def
new file mode 100644
index 000000000..17f920d5d
--- /dev/null
+++ b/sdext/source/pdfimport/xpdftest/binary_1_out.def
Binary files differ
diff --git a/sdext/source/pdfimport/xpdftest/book.pdf b/sdext/source/pdfimport/xpdftest/book.pdf
new file mode 100644
index 000000000..744a99aeb
--- /dev/null
+++ b/sdext/source/pdfimport/xpdftest/book.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/xpdftest/makefile.mk b/sdext/source/pdfimport/xpdftest/makefile.mk
new file mode 100644
index 000000000..84d26dda4
--- /dev/null
+++ b/sdext/source/pdfimport/xpdftest/makefile.mk
@@ -0,0 +1,48 @@
+#
+# 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 .
+#
+
+PRJ=..$/..$/..
+PRJNAME=sdext
+TARGET=xpdftest
+TARGETTYPE=CUI
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE: settings.mk
+
+.IF "$(ENABLE_PDFIMPORT)" != "TRUE"
+@all:
+ @echo "PDF Import extension disabled."
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+$(MISC)$/test_0_succeeded: $(BIN)$/xpdfimport$(EXECPOST) binary_0_out.def text_0_out.def testinput.pdf
+ $(BIN)$/xpdfimport -f $(MISC)$/binary_0_out testinput.pdf > $(MISC)$/text_0_out
+ diff --strip-trailing-cr $(MISC)$/binary_0_out binary_0_out.def
+ diff --strip-trailing-cr $(MISC)$/text_0_out text_0_out.def
+ $(TOUCH) $@
+
+$(MISC)$/test_1_succeeded: $(BIN)$/xpdfimport$(EXECPOST) binary_1_out.def text_1_out.def book.pdf
+ $(BIN)$/xpdfimport -f $(MISC)$/binary_1_out book.pdf > $(MISC)$/text_1_out
+ diff --strip-trailing-cr $(MISC)$/binary_1_out binary_1_out.def
+ diff --strip-trailing-cr $(MISC)$/text_1_out text_1_out.def
+ $(TOUCH) $@
diff --git a/sdext/source/pdfimport/xpdftest/testinput.odp b/sdext/source/pdfimport/xpdftest/testinput.odp
new file mode 100644
index 000000000..fdfa53a8c
--- /dev/null
+++ b/sdext/source/pdfimport/xpdftest/testinput.odp
Binary files differ
diff --git a/sdext/source/pdfimport/xpdftest/testinput.pdf b/sdext/source/pdfimport/xpdftest/testinput.pdf
new file mode 100644
index 000000000..c1a1b84ce
--- /dev/null
+++ b/sdext/source/pdfimport/xpdftest/testinput.pdf
Binary files differ
diff --git a/sdext/source/pdfimport/xpdftest/text_0_out.def b/sdext/source/pdfimport/xpdftest/text_0_out.def
new file mode 100644
index 000000000..2c9e52fa2
--- /dev/null
+++ b/sdext/source/pdfimport/xpdftest/text_0_out.def
@@ -0,0 +1,202 @@
+setPageNum 1
+startPage 79400.000000 59500.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 59500.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 794.000000 0.000000 0 794.000000 595.000000 0 0.000000 595.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.300000 0 793.800000 -0.300000 0 793.800000 595.000000 0 0.000000 595.000000 0 0.000000 -0.300000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 21 1 0 0 0 1400.000000 11128 BAAAAA+DejaVuSerif
+drawChar 39.700000 52.692000 44.138000 38.692000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 21 1 0 0 0 1400.000000 0 BAAAAA+DejaVuSerif
+drawChar 395.000000 52.692000 399.438000 38.692000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+updateLineDash 0.000000 4 14.376390 14.376390 14.376390 14.376390
+strokePath subpath 0 498.900000 538.300000 0 144.600000 297.400000 0
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 16 1 0 0 0 1800.000000 23060 CAAAAA+DejaVuSans
+drawChar 35.400000 466.704000 46.380000 448.704000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 46.398000 466.704000 57.792000 448.704000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 57.792000 466.704000 62.778000 448.704000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 62.796000 466.704000 72.156000 448.704000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 72.192000 466.704000 77.898000 448.704000 1.000000 0.000000 0.000000 1.000000
+drawChar 77.898000 466.704000 82.884000 448.704000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.902000 466.704000 92.262000 448.704000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 92.298000 466.704000 98.004000 448.704000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.004000 466.704000 109.020000 448.704000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.002000 466.704000 114.708000 448.704000 1.000000 0.000000 0.000000 1.000000
+drawChar 114.708000 466.704000 121.764000 448.704000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 121.800000 466.704000 132.870000 448.704000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.906000 466.704000 142.266000 448.704000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 142.302000 466.704000 149.358000 448.704000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 149.394000 466.704000 156.450000 448.704000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 156.486000 466.704000 167.556000 448.704000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 167.286000 466.704000 177.924000 448.704000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 177.978000 466.704000 185.034000 448.704000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 16 1 0 0 0 1800.000000 0 CAAAAA+DejaVuSans
+drawChar 35.400000 445.804000 48.864000 427.804000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 48.900000 445.804000 59.970000 427.804000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 60.006000 445.804000 74.712000 427.804000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 74.712000 445.804000 80.418000 427.804000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.418000 445.804000 91.830000 427.804000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 91.812000 445.804000 102.828000 427.804000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 102.810000 445.804000 110.208000 427.804000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 110.208000 445.804000 121.224000 427.804000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 121.206000 445.804000 132.618000 427.804000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 132.600000 445.804000 139.998000 427.804000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 139.998000 445.804000 151.014000 427.804000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.996000 445.804000 162.408000 427.804000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 162.390000 445.804000 173.784000 427.804000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 173.784000 445.804000 179.490000 427.804000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 16 1 0 0 0 1800.000000 0 CAAAAA+DejaVuSans
+drawChar 35.400000 425.004000 46.794000 407.004000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 46.794000 425.004000 57.864000 407.004000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 57.900000 425.004000 72.606000 407.004000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 72.606000 425.004000 78.312000 407.004000 1.000000 0.000000 0.000000 1.000000
+drawChar 78.312000 425.004000 83.298000 407.004000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 83.316000 425.004000 88.302000 407.004000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.320000 425.004000 99.714000 407.004000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.714000 425.004000 110.784000 407.004000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.501953 1.000000
+updateFont 16 1 0 0 0 1800.000000 0 CAAAAA+DejaVuSans
+drawChar 35.400000 404.104000 48.918000 386.104000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 48.900000 404.104000 59.538000 386.104000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 59.592000 404.104000 71.004000 386.104000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 70.986000 404.104000 82.056000 386.104000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 82.092000 404.104000 89.490000 386.104000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.490000 404.104000 94.476000 386.104000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.494000 404.104000 99.480000 386.104000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 99.498000 404.104000 110.892000 386.104000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.892000 404.104000 121.314000 386.104000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 121.296000 404.104000 127.002000 386.104000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 127.002000 404.104000 132.708000 386.104000 1.000000 0.000000 0.000000 1.000000
+drawChar 132.708000 404.104000 139.764000 386.104000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 139.800000 404.104000 151.194000 386.104000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.194000 404.104000 156.180000 386.104000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 156.198000 404.104000 165.558000 386.104000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 165.594000 404.104000 171.300000 386.104000 1.000000 0.000000 0.000000 1.000000
+drawChar 171.300000 404.104000 176.286000 386.104000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 176.304000 404.104000 185.664000 386.104000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 11 1 0 0 0 1440.000000 1780 DAAAAA+OpenSymbol
+drawChar 405.400000 244.990400 416.833600 230.590400 1.000000 0.000000 0.000000 1.000000 â—
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 16 1 0 0 0 3200.000000 0 CAAAAA+DejaVuSans
+drawChar 430.900000 254.796000 450.420000 222.796000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 450.388000 254.796000 470.644000 222.796000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 470.676000 254.796000 479.540000 222.796000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.572000 254.796000 496.212000 222.796000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 496.276000 254.796000 506.420000 222.796000 1.000000 0.000000 0.000000 1.000000
+drawChar 506.484000 254.796000 515.348000 222.796000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 515.380000 254.796000 532.020000 222.796000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 532.084000 254.796000 542.228000 222.796000 1.000000 0.000000 0.000000 1.000000
+drawChar 542.292000 254.796000 573.460000 222.796000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 573.492000 254.796000 593.044000 222.796000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 593.108000 254.796000 606.260000 222.796000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 605.620000 254.796000 625.300000 222.796000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 625.332000 254.796000 635.476000 222.796000 1.000000 0.000000 0.000000 1.000000
+drawChar 635.540000 254.796000 648.084000 222.796000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 648.052000 254.796000 667.732000 222.796000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 667.156000 254.796000 686.068000 222.796000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 686.068000 254.796000 698.612000 222.796000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 16 1 0 0 0 3200.000000 0 CAAAAA+DejaVuSans
+drawChar 430.900000 217.396000 450.452000 185.396000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 450.516000 217.396000 470.772000 185.396000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 470.804000 217.396000 483.348000 185.396000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 483.316000 217.396000 492.180000 185.396000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 492.212000 217.396000 501.076000 185.396000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 501.108000 217.396000 521.364000 185.396000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 521.396000 217.396000 541.076000 185.396000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 541.108000 217.396000 551.252000 185.396000 1.000000 0.000000 0.000000 1.000000
+drawChar 551.316000 217.396000 582.484000 185.396000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 582.516000 217.396000 602.068000 185.396000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 602.132000 217.396000 622.420000 185.396000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 622.420000 217.396000 642.100000 185.396000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 11 1 0 0 0 1440.000000 0 DAAAAA+OpenSymbol
+drawChar 405.400000 156.190400 416.833600 141.790400 1.000000 0.000000 0.000000 1.000000 â—
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 16 1 0 0 0 3200.000000 0 CAAAAA+DejaVuSans
+drawChar 430.900000 165.896000 454.836000 133.896000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 454.804000 165.896000 474.484000 133.896000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 474.516000 165.896000 500.660000 133.896000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 500.724000 165.896000 510.868000 133.896000 1.000000 0.000000 0.000000 1.000000
+drawChar 510.932000 165.896000 531.220000 133.896000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 531.220000 165.896000 550.804000 133.896000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 550.836000 165.896000 563.988000 133.896000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 564.052000 165.896000 583.636000 133.896000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 583.668000 165.896000 603.956000 133.896000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 603.956000 165.896000 617.108000 133.896000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 617.172000 165.896000 636.756000 133.896000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 636.788000 165.896000 657.076000 133.896000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 657.076000 165.896000 677.332000 133.896000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 120.500000 98.900000 0 77.400000 98.900000 1 42.500000 133.800000 1 42.500000 176.900000 0 42.500000 219.900000 1 77.400000 254.800000 1 120.500000 254.800000 0 163.500000 254.800000 1 198.400000 219.900000 1 198.400000 176.900000 0 198.400000 133.800000 1 163.500000 98.900000 1 120.500000 98.900000 0
+saveState
+updateCtm 22680.000000 0.000000 0.000000 -14740.000000 49610.000000 27490.000000
+drawImage 800 600 0 JPEG 44129
+restoreState
+updateStrokeColor 0.000000 1.000000 0.000000 1.000000
+saveState
+updateLineWidth 28.299990
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 0 535.700000 518.500000 0 181.400000 277.500000 0
+restoreState
+restoreState
+restoreState
+endPage
+drawLink 36.500000 383.600000 185.600000 401.000000 http://download.openoffice.org/
diff --git a/sdext/source/pdfimport/xpdftest/text_1_out.def b/sdext/source/pdfimport/xpdftest/text_1_out.def
new file mode 100644
index 000000000..c5d455f73
--- /dev/null
+++ b/sdext/source/pdfimport/xpdftest/text_1_out.def
@@ -0,0 +1,70338 @@
+setPageNum 20
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 103 1 0 0 0 3600.000000 27592 BAAAAA+DejaVuSans-Bold
+drawChar 263.700000 720.008000 299.520000 684.008000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 299.484000 720.008000 322.920000 684.008000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 322.992000 720.008000 335.520000 684.008000 1.000000 0.000000 0.000000 1.000000
+drawChar 335.484000 720.008000 365.580000 684.008000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 365.580000 720.008000 390.312000 684.008000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 390.276000 720.008000 415.872000 684.008000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 415.872000 720.008000 437.292000 684.008000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 437.256000 720.008000 461.664000 684.008000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 296.800000 0 477.900000 296.800000 0 477.900000 606.600000 0 134.300000 606.600000 0 134.300000 296.800000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 49520.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -2692.300000 0 168.100000 -2692.300000 0 168.100000 -2687.300000 0 76.900000 -2687.300000 0 76.900000 -2692.300000 0
+eoFillPath subpath 1 163.100000 -2687.400000 0 168.100000 -2687.400000 0 168.100000 -2556.800000 0 163.100000 -2556.800000 0 163.100000 -2687.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -2687.300000 0 163.100000 -2687.300000 0 163.100000 -2551.900000 0 72.000000 -2551.900000 0 72.000000 -2687.300000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 26324 CAAAAA+DejaVuSans
+drawChar 78.700000 -2556.220000 87.320000 -2566.220000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 -2556.220000 93.420000 -2566.220000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 -2556.220000 97.510000 -2566.220000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 -2556.220000 101.420000 -2566.220000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 -2556.220000 104.170000 -2566.220000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 -2556.220000 110.530000 -2566.220000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 -2556.220000 113.270000 -2566.220000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 -2556.220000 116.470000 -2566.220000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 -2556.220000 123.480000 -2566.220000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 -2556.220000 129.610000 -2566.220000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 -2556.220000 135.090000 -2566.220000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 -2556.220000 140.890000 -2566.220000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 -2556.220000 144.820000 -2566.220000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 -2556.220000 150.920000 -2566.220000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 -2556.220000 153.670000 -2566.220000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 -2556.220000 156.470000 -2566.220000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -2683.100000 0 168.200000 -2683.100000 0 168.200000 -2567.900000 0 72.000000 -2567.900000 0 72.000000 -2683.100000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 28124 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2614.948000 79.253000 -2623.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 -2614.948000 86.669000 -2623.948000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 -2614.948000 90.215000 -2623.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 -2614.948000 93.077000 -2623.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 -2614.948000 97.406000 -2623.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 -2614.948000 100.853000 -2623.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 -2614.948000 107.324000 -2623.948000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 -2614.948000 112.337000 -2623.948000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 -2614.948000 115.271000 -2623.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 -2614.948000 118.655000 -2623.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 -2614.948000 126.512000 -2623.948000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 -2614.948000 130.805000 -2623.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 -2614.948000 135.881000 -2623.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 -2614.948000 139.355000 -2623.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 -2614.948000 147.284000 -2623.948000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 -2614.948000 150.074000 -2623.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 -2614.948000 155.897000 -2623.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 -2614.948000 158.750000 -2623.948000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -2614.948000 161.853000 -2623.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2625.448000 82.124000 -2634.448000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 -2625.448000 87.137000 -2634.448000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 -2625.448000 90.071000 -2634.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 -2625.448000 93.356000 -2634.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 -2625.448000 100.403000 -2634.448000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 -2625.448000 104.921000 -2634.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 -2625.448000 109.205000 -2634.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 -2625.448000 117.737000 -2634.448000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 -2625.448000 123.119000 -2634.448000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 -2625.448000 128.996000 -2634.448000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 -2625.448000 132.605000 -2634.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 -2625.448000 138.392000 -2634.448000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 -2625.448000 141.749000 -2634.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 -2625.448000 149.507000 -2634.448000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 -2625.448000 153.800000 -2634.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 -2625.448000 158.876000 -2634.448000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -2625.448000 161.853000 -2634.448000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2635.948000 81.764000 -2644.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -2635.948000 87.596000 -2644.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 -2635.948000 93.356000 -2644.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 -2635.948000 102.050000 -2644.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 -2635.948000 113.822000 -2644.948000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 -2635.948000 122.651000 -2644.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 -2635.948000 134.117000 -2644.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 -2635.948000 138.401000 -2644.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 -2635.948000 147.149000 -2644.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 -2635.948000 158.921000 -2644.948000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -2635.948000 161.853000 -2644.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2646.448000 79.271000 -2655.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -2646.448000 84.338000 -2655.448000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 -2646.448000 89.621000 -2655.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 -2646.448000 94.643000 -2655.448000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 -2646.448000 100.502000 -2655.448000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 -2646.448000 106.262000 -2655.448000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 -2646.448000 111.518000 -2655.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 -2646.448000 116.216000 -2655.448000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 -2646.448000 119.249000 -2655.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 -2646.448000 122.363000 -2655.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 -2646.448000 128.186000 -2655.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 -2646.448000 131.345000 -2655.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 -2646.448000 137.060000 -2655.448000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 -2646.448000 140.147000 -2655.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 -2646.448000 145.007000 -2655.448000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 -2646.448000 148.598000 -2655.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 -2646.448000 151.460000 -2655.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 -2646.448000 155.789000 -2655.448000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 -2646.448000 158.933000 -2655.448000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2656.948000 80.702000 -2665.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 -2656.948000 83.573000 -2665.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 -2656.948000 89.396000 -2665.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 -2656.948000 95.156000 -2665.948000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 -2656.948000 100.547000 -2665.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 -2656.948000 109.052000 -2665.948000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 -2656.948000 111.959000 -2665.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 -2656.948000 117.251000 -2665.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 -2656.948000 121.904000 -2665.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 -2656.948000 126.503000 -2665.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 -2656.948000 129.338000 -2665.948000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 -2656.948000 134.936000 -2665.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 -2656.948000 143.441000 -2665.948000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 -2656.948000 148.796000 -2665.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 -2656.948000 154.574000 -2665.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 -2656.948000 158.876000 -2665.948000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -2656.948000 161.853000 -2665.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2667.448000 79.271000 -2676.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -2667.448000 85.094000 -2676.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -2667.448000 88.703000 -2676.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 -2667.448000 94.112000 -2676.448000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 -2667.448000 97.244000 -2676.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 -2667.448000 103.058000 -2676.448000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 -2667.448000 108.890000 -2676.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 -2667.448000 111.950000 -2676.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 -2667.448000 115.271000 -2676.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 -2667.448000 120.338000 -2676.448000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 -2667.448000 125.621000 -2676.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 -2667.448000 131.363000 -2676.448000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 -2667.448000 134.558000 -2676.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 -2667.448000 140.048000 -2676.448000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 -2667.448000 145.430000 -2676.448000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 -2667.448000 150.551000 -2676.448000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 -2667.448000 155.960000 -2676.448000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 -2667.448000 158.933000 -2676.448000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2677.948000 80.009000 -2686.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -2677.948000 85.364000 -2686.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 -2677.948000 88.271000 -2686.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 -2677.948000 91.169000 -2686.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 -2677.948000 97.955000 -2686.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 -2677.948000 107.765000 -2686.948000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 -2677.948000 110.672000 -2686.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 -2677.948000 115.964000 -2686.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 -2677.948000 120.617000 -2686.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 -2677.948000 125.216000 -2686.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 -2677.948000 128.051000 -2686.948000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 -2677.948000 134.954000 -2686.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 -2677.948000 146.285000 -2686.948000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 -2677.948000 151.667000 -2686.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 -2677.948000 155.906000 -2686.948000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 -2677.948000 159.033000 -2686.948000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -2687.400000 0 72.100000 -2687.400000 0 72.100000 -2551.900000 0 72.000000 -2551.900000 0 72.000000 -2687.400000 0
+eoFillPath subpath 1 163.100000 -2687.400000 0 163.200000 -2687.400000 0 163.200000 -2551.900000 0 163.100000 -2551.900000 0 163.100000 -2687.400000 0
+eoFillPath subpath 1 72.000000 -2552.000000 0 163.200000 -2552.000000 0 163.200000 -2551.900000 0 72.000000 -2551.900000 0 72.000000 -2552.000000 0
+eoFillPath subpath 1 72.000000 -2687.400000 0 163.200000 -2687.400000 0 163.200000 -2687.300000 0 72.000000 -2687.300000 0 72.000000 -2687.400000 0
+saveState
+eoClipPath subpath 1 96.900000 -2612.100000 0 138.300000 -2612.100000 0 138.300000 -2567.900000 0 96.900000 -2567.900000 0 96.900000 -2612.100000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 340400.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -2966.900000 0 165.500000 -2966.900000 0 165.500000 -2961.900000 0 76.900000 -2961.900000 0 76.900000 -2966.900000 0
+eoFillPath subpath 1 160.500000 -2962.000000 0 165.500000 -2962.000000 0 165.500000 -2805.700000 0 160.500000 -2805.700000 0 160.500000 -2962.000000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -2961.900000 0 121.400000 -2961.900000 0 121.400000 -2800.800000 0 72.000000 -2800.800000 0 72.000000 -2961.900000 0
+saveState
+eoClipPath subpath 1 72.000000 -2961.900000 0 160.500000 -2961.900000 0 160.500000 -2800.800000 0 72.000000 -2800.800000 0 72.000000 -2961.900000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 377100.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 -2805.120000 89.280000 -2815.120000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 -2805.120000 95.630000 -2815.120000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 -2805.120000 99.520000 -2815.120000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 -2805.120000 102.270000 -2815.120000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 -2805.120000 108.450000 -2815.120000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 -2805.120000 112.610000 -2815.120000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 -2805.120000 118.510000 -2815.120000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 -2805.120000 121.670000 -2815.120000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 -2805.120000 124.470000 -2815.120000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 -2805.120000 130.830000 -2815.120000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 -2805.120000 133.970000 -2815.120000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 -2805.120000 137.920000 -2815.120000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 -2805.120000 144.230000 -2815.120000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 -2805.120000 150.350000 -2815.120000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 -2805.120000 153.570000 -2815.120000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 -2816.820000 95.000000 -2826.820000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 -2816.820000 97.770000 -2826.820000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 -2816.820000 103.000000 -2826.820000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 -2816.820000 109.330000 -2826.820000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 -2816.820000 117.470000 -2826.820000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 -2816.820000 123.620000 -2826.820000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 -2816.820000 128.800000 -2826.820000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 -2816.820000 135.130000 -2826.820000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 -2816.820000 141.250000 -2826.820000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 -2816.820000 145.410000 -2826.820000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2831.648000 82.961000 -2840.648000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 -2831.648000 87.614000 -2840.648000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 -2831.648000 93.356000 -2840.648000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 -2831.648000 98.612000 -2840.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 -2831.648000 103.733000 -2840.648000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 -2831.648000 106.568000 -2840.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 -2831.648000 111.959000 -2840.648000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 -2831.648000 114.866000 -2840.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 -2831.648000 117.665000 -2840.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 -2831.648000 122.768000 -2840.648000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 -2831.648000 125.747000 -2840.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 -2831.648000 131.651000 -2840.648000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 -2831.648000 136.907000 -2840.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 -2831.648000 142.307000 -2840.648000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 -2831.648000 148.049000 -2840.648000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 -2831.648000 150.956000 -2840.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 -2831.648000 156.302000 -2840.648000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2831.648000 159.253000 -2840.648000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2842.148000 84.095000 -2851.148000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -2842.148000 89.900000 -2851.148000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 -2842.148000 95.318000 -2851.148000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 -2842.148000 100.349000 -2851.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 -2842.148000 110.789000 -2851.148000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 -2842.148000 111.464000 -2851.148000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 -2842.148000 114.362000 -2851.148000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 -2842.148000 119.348000 -2851.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 -2842.148000 126.962000 -2851.148000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 -2842.148000 132.047000 -2851.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 -2842.148000 139.958000 -2851.148000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 -2842.148000 142.865000 -2851.148000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 -2842.148000 147.410000 -2851.148000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 -2842.148000 153.287000 -2851.148000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -2842.148000 156.333000 -2851.148000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2852.648000 84.095000 -2861.648000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -2852.648000 89.468000 -2861.648000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 -2852.648000 94.121000 -2861.648000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 -2852.648000 99.899000 -2861.648000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 -2852.648000 105.218000 -2861.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 -2852.648000 109.502000 -2861.648000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 -2852.648000 115.649000 -2861.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 -2852.648000 122.327000 -2861.648000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 -2852.648000 127.718000 -2861.648000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 -2852.648000 132.002000 -2861.648000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 -2852.648000 138.149000 -2861.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 -2852.648000 145.205000 -2861.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 -2852.648000 150.992000 -2861.648000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 -2852.648000 156.311000 -2861.648000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2852.648000 159.253000 -2861.648000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2863.148000 82.394000 -2872.148000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 -2863.148000 86.705000 -2872.148000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 -2863.148000 91.322000 -2872.148000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 -2863.148000 94.913000 -2872.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 -2863.148000 98.054000 -2872.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 -2863.148000 102.014000 -2872.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 -2863.148000 104.876000 -2872.148000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 -2863.148000 113.435000 -2872.148000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 -2863.148000 118.718000 -2872.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 -2863.148000 121.949000 -2872.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 -2863.148000 125.063000 -2872.148000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 -2863.148000 130.886000 -2872.148000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 -2863.148000 134.045000 -2872.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 -2863.148000 138.005000 -2872.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 -2863.148000 143.792000 -2872.148000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 -2863.148000 149.111000 -2872.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 -2863.148000 151.964000 -2872.148000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 -2863.148000 156.293000 -2872.148000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -2863.148000 159.153000 -2872.148000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2873.648000 79.271000 -2882.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 -2873.648000 82.169000 -2882.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 -2873.648000 85.526000 -2882.648000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 -2873.648000 90.818000 -2882.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 -2873.648000 94.454000 -2882.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 -2873.648000 99.008000 -2882.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 -2873.648000 104.318000 -2882.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 -2873.648000 110.096000 -2882.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 -2873.648000 115.856000 -2882.648000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 -2873.648000 119.546000 -2882.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 -2873.648000 124.001000 -2882.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 -2873.648000 129.509000 -2882.648000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 -2873.648000 133.145000 -2882.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 -2873.648000 139.751000 -2882.648000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 -2873.648000 145.205000 -2882.648000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 -2873.648000 148.841000 -2882.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 -2873.648000 152.657000 -2882.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 -2873.648000 156.293000 -2882.648000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2873.648000 159.253000 -2882.648000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2884.148000 84.095000 -2893.148000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -2884.148000 88.406000 -2893.148000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 -2884.148000 93.824000 -2893.148000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 -2884.148000 99.602000 -2893.148000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 -2884.148000 105.362000 -2893.148000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 -2884.148000 108.422000 -2893.148000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 -2884.148000 116.747000 -2893.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 -2884.148000 129.275000 -2893.148000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 -2884.148000 135.089000 -2893.148000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 -2884.148000 138.698000 -2893.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 -2884.148000 141.560000 -2893.148000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 -2884.148000 146.906000 -2893.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -2884.148000 151.190000 -2893.148000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 -2884.148000 156.266000 -2893.148000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2884.148000 159.253000 -2893.148000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2894.648000 82.196000 -2903.648000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 -2894.648000 87.560000 -2903.648000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 -2894.648000 92.213000 -2903.648000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 -2894.648000 96.551000 -2903.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 -2894.648000 101.708000 -2903.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 -2894.648000 107.216000 -2903.648000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 -2894.648000 111.653000 -2903.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 -2894.648000 118.961000 -2903.648000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 -2894.648000 124.316000 -2903.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 -2894.648000 128.654000 -2903.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 -2894.648000 133.172000 -2903.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 -2894.648000 138.995000 -2903.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 -2894.648000 143.612000 -2903.648000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 -2894.648000 148.913000 -2903.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 -2894.648000 153.197000 -2903.648000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -2894.648000 156.333000 -2903.648000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2905.148000 80.009000 -2914.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -2905.148000 85.319000 -2914.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 -2905.148000 91.061000 -2914.148000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 -2905.148000 100.052000 -2914.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 -2905.148000 113.993000 -2914.148000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 -2905.148000 116.873000 -2914.148000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 -2905.148000 120.410000 -2914.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 -2905.148000 126.296000 -2914.148000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 -2905.148000 135.350000 -2914.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 -2905.148000 145.106000 -2914.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 -2905.148000 150.893000 -2914.148000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 -2905.148000 156.212000 -2914.148000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2905.148000 159.253000 -2914.148000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2915.648000 82.196000 -2924.648000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 -2915.648000 87.560000 -2924.648000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 -2915.648000 93.392000 -2924.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 -2915.648000 99.152000 -2924.648000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 -2915.648000 101.960000 -2924.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 -2915.648000 107.306000 -2924.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 -2915.648000 111.905000 -2924.648000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 -2915.648000 115.640000 -2924.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 -2915.648000 122.444000 -2924.648000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 -2915.648000 127.898000 -2924.648000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 -2915.648000 135.575000 -2924.648000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 -2915.648000 141.380000 -2924.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 -2915.648000 145.241000 -2924.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 -2915.648000 150.803000 -2924.648000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 -2915.648000 156.302000 -2924.648000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2915.648000 159.253000 -2924.648000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2926.148000 80.009000 -2935.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -2926.148000 85.796000 -2935.148000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 -2926.148000 91.115000 -2935.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 -2926.148000 95.399000 -2935.148000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 -2926.148000 100.718000 -2935.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 -2926.148000 107.054000 -2935.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 -2926.148000 118.097000 -2935.148000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 -2926.148000 123.524000 -2935.148000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 -2926.148000 129.401000 -2935.148000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 -2926.148000 131.768000 -2935.148000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 -2926.148000 135.413000 -2935.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 -2926.148000 141.659000 -2935.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 -2926.148000 150.965000 -2935.148000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 -2926.148000 156.320000 -2935.148000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2926.148000 159.253000 -2935.148000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2936.648000 81.017000 -2945.648000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 -2936.648000 84.608000 -2945.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 -2936.648000 89.963000 -2945.648000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 -2936.648000 92.870000 -2945.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 -2936.648000 98.693000 -2945.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 -2936.648000 103.310000 -2945.648000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 -2936.648000 107.243000 -2945.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 -2936.648000 116.081000 -2945.648000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 -2936.648000 121.886000 -2945.648000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 -2936.648000 127.205000 -2945.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 -2936.648000 132.983000 -2945.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 -2936.648000 136.943000 -2945.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 -2936.648000 143.846000 -2945.648000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 -2936.648000 148.184000 -2945.648000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 -2936.648000 153.260000 -2945.648000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -2936.648000 156.433000 -2945.648000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2947.148000 79.271000 -2956.148000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -2947.148000 85.094000 -2956.148000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -2947.148000 90.854000 -2956.148000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 -2947.148000 93.653000 -2956.148000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -2962.000000 0 72.100000 -2962.000000 0 72.100000 -2800.800000 0 72.000000 -2800.800000 0 72.000000 -2962.000000 0
+eoFillPath subpath 1 160.500000 -2962.000000 0 160.600000 -2962.000000 0 160.600000 -2800.800000 0 160.500000 -2800.800000 0 160.500000 -2962.000000 0
+eoFillPath subpath 1 72.000000 -2800.900000 0 160.600000 -2800.900000 0 160.600000 -2800.800000 0 72.000000 -2800.800000 0 72.000000 -2800.900000 0
+eoFillPath subpath 1 72.000000 -2962.000000 0 160.600000 -2962.000000 0 160.600000 -2961.900000 0 72.000000 -2961.900000 0 72.000000 -2962.000000 0
+saveState
+eoClipPath subpath 1 108.000000 -3449.400000 0 178.900000 -3449.400000 0 178.900000 -3392.700000 0 108.000000 -3392.700000 0 108.000000 -3449.400000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 424130.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -7507.700000 0 165.500000 -7507.700000 0 165.500000 -7502.700000 0 76.900000 -7502.700000 0 76.900000 -7507.700000 0
+eoFillPath subpath 1 160.500000 -7502.800000 0 165.500000 -7502.800000 0 165.500000 -7394.000000 0 160.500000 -7394.000000 0 160.500000 -7502.800000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -7502.700000 0 160.500000 -7502.700000 0 160.500000 -7389.100000 0 72.000000 -7389.100000 0 72.000000 -7502.700000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -7393.448000 83.771000 -7402.448000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 -7393.448000 89.594000 -7402.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 -7393.448000 92.465000 -7402.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 -7393.448000 97.568000 -7402.448000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 -7393.448000 100.943000 -7402.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 -7393.448000 106.955000 -7402.448000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 -7393.448000 110.447000 -7402.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 -7393.448000 114.425000 -7402.448000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 -7393.448000 119.717000 -7402.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 -7393.448000 127.493000 -7402.448000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 -7393.448000 130.949000 -7402.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 -7393.448000 136.574000 -7402.448000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 -7393.448000 141.920000 -7402.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 -7393.448000 147.365000 -7402.448000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 -7393.448000 151.703000 -7402.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 -7393.448000 156.320000 -7402.448000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -7393.448000 159.153000 -7402.448000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -7403.948000 81.764000 -7412.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -7403.948000 85.130000 -7412.948000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 -7403.948000 88.712000 -7412.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 -7403.948000 94.022000 -7412.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 -7403.948000 98.306000 -7412.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -7403.948000 102.455000 -7412.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 -7403.948000 106.676000 -7412.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 -7403.948000 110.312000 -7412.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 -7403.948000 114.920000 -7412.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 -7403.948000 119.060000 -7412.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 -7403.948000 125.450000 -7412.948000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 -7403.948000 130.832000 -7412.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 -7403.948000 139.445000 -7412.948000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 -7403.948000 145.169000 -7412.948000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 -7403.948000 148.076000 -7412.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 -7403.948000 153.323000 -7412.948000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -7403.948000 156.433000 -7412.948000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -7414.448000 80.009000 -7423.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -7414.448000 82.871000 -7423.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 -7414.448000 88.316000 -7423.448000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 -7414.448000 94.094000 -7423.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 -7414.448000 96.947000 -7423.448000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 -7414.448000 104.948000 -7423.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 -7414.448000 113.705000 -7423.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 -7414.448000 119.492000 -7423.448000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 -7414.448000 124.811000 -7423.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 -7414.448000 132.848000 -7423.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 -7414.448000 141.605000 -7423.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 -7414.448000 144.467000 -7423.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 -7414.448000 148.103000 -7423.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 -7414.448000 150.965000 -7423.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 -7414.448000 156.311000 -7423.448000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -7414.448000 159.253000 -7423.448000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -7424.948000 80.999000 -7433.948000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 -7424.948000 90.539000 -7433.948000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 -7424.948000 95.318000 -7433.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 -7424.948000 99.602000 -7433.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -7424.948000 102.473000 -7433.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 -7424.948000 108.260000 -7433.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 -7424.948000 110.762000 -7433.948000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 -7424.948000 115.316000 -7433.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 -7424.948000 122.156000 -7433.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 -7424.948000 132.299000 -7433.948000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 -7424.948000 136.970000 -7433.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 -7424.948000 139.877000 -7433.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 -7424.948000 142.775000 -7433.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 -7424.948000 148.022000 -7433.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 -7424.948000 152.720000 -7433.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 -7424.948000 156.311000 -7433.948000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -7424.948000 159.253000 -7433.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -7435.448000 83.006000 -7444.448000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 -7435.448000 88.793000 -7444.448000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 -7435.448000 91.664000 -7444.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 -7435.448000 94.562000 -7444.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 -7435.448000 100.349000 -7444.448000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 -7435.448000 103.157000 -7444.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 -7435.448000 108.980000 -7444.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 -7435.448000 114.740000 -7444.448000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 -7435.448000 119.375000 -7444.448000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 -7435.448000 128.033000 -7444.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 -7435.448000 141.479000 -7444.448000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 -7435.448000 146.807000 -7444.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -7435.448000 152.684000 -7444.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 -7435.448000 156.293000 -7444.448000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -7435.448000 159.253000 -7444.448000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -7445.948000 79.730000 -7454.948000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 -7445.948000 84.005000 -7454.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 -7445.948000 89.423000 -7454.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 -7445.948000 98.036000 -7454.948000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 -7445.948000 121.157000 -7454.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 -7445.948000 145.115000 -7454.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 -7445.948000 151.001000 -7454.948000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 -7445.948000 156.320000 -7454.948000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -7445.948000 159.253000 -7454.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -7456.448000 83.285000 -7465.448000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 -7456.448000 89.099000 -7465.448000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 -7456.448000 93.401000 -7465.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 -7456.448000 98.477000 -7465.448000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 -7456.448000 103.121000 -7465.448000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 -7456.448000 105.974000 -7465.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 -7456.448000 111.320000 -7465.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 -7456.448000 115.604000 -7465.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 -7456.448000 123.857000 -7465.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 -7456.448000 136.007000 -7465.448000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 -7456.448000 141.794000 -7465.448000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 -7456.448000 144.665000 -7465.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 -7456.448000 147.464000 -7465.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 -7456.448000 153.251000 -7465.448000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -7456.448000 156.433000 -7465.448000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -7466.948000 79.271000 -7475.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -7466.948000 85.094000 -7475.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -7466.948000 90.854000 -7475.948000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 -7466.948000 96.146000 -7475.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 -7466.948000 102.302000 -7475.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 -7466.948000 107.711000 -7475.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 -7466.948000 113.048000 -7475.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 -7466.948000 119.204000 -7475.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 -7466.948000 124.991000 -7475.948000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 -7466.948000 130.310000 -7475.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 -7466.948000 135.647000 -7475.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 -7466.948000 144.755000 -7475.948000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 -7466.948000 153.323000 -7475.948000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -7466.948000 156.333000 -7475.948000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -7477.448000 82.160000 -7486.448000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 -7477.448000 85.067000 -7486.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 -7477.448000 89.297000 -7486.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 -7477.448000 94.616000 -7486.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 -7477.448000 98.747000 -7486.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 -7477.448000 106.055000 -7486.448000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 -7477.448000 109.700000 -7486.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 -7477.448000 115.055000 -7486.448000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 -7477.448000 118.601000 -7486.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 -7477.448000 124.010000 -7486.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 -7477.448000 128.042000 -7486.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 -7477.448000 135.998000 -7486.448000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 -7477.448000 141.785000 -7486.448000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 -7477.448000 144.656000 -7486.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 -7477.448000 147.554000 -7486.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 -7477.448000 153.341000 -7486.448000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -7477.448000 156.433000 -7486.448000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -7487.948000 79.271000 -7496.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -7487.948000 85.094000 -7496.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -7487.948000 90.854000 -7496.948000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 -7487.948000 93.743000 -7496.948000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -7502.800000 0 72.100000 -7502.800000 0 72.100000 -7389.100000 0 72.000000 -7389.100000 0 72.000000 -7502.800000 0
+eoFillPath subpath 1 160.500000 -7502.800000 0 160.600000 -7502.800000 0 160.600000 -7389.100000 0 160.500000 -7389.100000 0 160.500000 -7502.800000 0
+eoFillPath subpath 1 72.000000 -7389.200000 0 160.600000 -7389.200000 0 160.600000 -7389.100000 0 72.000000 -7389.100000 0 72.000000 -7389.200000 0
+eoFillPath subpath 1 72.000000 -7502.800000 0 160.600000 -7502.800000 0 160.600000 -7502.700000 0 72.000000 -7502.700000 0 72.000000 -7502.800000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -1313.300000 0 169.600000 -1313.300000 0 169.600000 -1308.300000 0 76.900000 -1308.300000 0 76.900000 -1313.300000 0
+eoFillPath subpath 1 164.600000 -1308.400000 0 169.600000 -1308.400000 0 169.600000 -1192.800000 0 164.600000 -1192.800000 0 164.600000 -1308.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -1308.300000 0 121.400000 -1308.300000 0 121.400000 -1187.900000 0 72.000000 -1187.900000 0 72.000000 -1308.300000 0
+saveState
+eoClipPath subpath 1 72.000000 -1308.300000 0 164.600000 -1308.300000 0 164.600000 -1187.900000 0 72.000000 -1187.900000 0 72.000000 -1308.300000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 215860.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -1238.400000 0 93.700000 -1238.400000 0 93.700000 -1219.200000 0 72.000000 -1219.200000 0 72.000000 -1238.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 -1238.400000 0 169.600000 -1238.400000 0 169.600000 -1219.200000 0 93.700000 -1219.200000 0 93.700000 -1238.400000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -1255.100000 0 93.700000 -1255.100000 0 93.700000 -1238.400000 0 72.000000 -1238.400000 0 72.000000 -1255.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 -1255.100000 0 169.600000 -1255.100000 0 169.600000 -1238.400000 0 93.700000 -1238.400000 0 93.700000 -1255.100000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -1274.300000 0 93.700000 -1274.300000 0 93.700000 -1255.100000 0 72.000000 -1255.100000 0 72.000000 -1274.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 -1274.300000 0 169.600000 -1274.300000 0 169.600000 -1255.100000 0 93.700000 -1255.100000 0 93.700000 -1274.300000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -1293.500000 0 93.700000 -1293.500000 0 93.700000 -1274.300000 0 72.000000 -1274.300000 0 72.000000 -1293.500000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 -1293.500000 0 169.600000 -1293.500000 0 169.600000 -1274.300000 0 93.700000 -1274.300000 0 93.700000 -1293.500000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1192.248000 82.898000 -1201.248000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 -1192.248000 87.200000 -1201.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 -1192.248000 90.809000 -1201.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 -1192.248000 93.671000 -1201.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 -1192.248000 98.315000 -1201.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 -1192.248000 101.906000 -1201.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 -1192.248000 106.514000 -1201.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 -1192.248000 109.754000 -1201.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 -1192.248000 112.868000 -1201.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 -1192.248000 118.691000 -1201.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 -1192.248000 121.850000 -1201.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 -1192.248000 125.702000 -1201.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 -1192.248000 131.588000 -1201.248000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 -1192.248000 136.907000 -1201.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 -1192.248000 140.039000 -1201.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 -1192.248000 146.078000 -1201.248000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 -1192.248000 151.442000 -1201.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 -1192.248000 154.349000 -1201.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 -1192.248000 157.148000 -1201.248000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 -1192.248000 160.433000 -1201.248000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1202.748000 84.095000 -1211.748000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -1202.748000 89.468000 -1211.748000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 -1202.748000 94.580000 -1211.748000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 -1202.748000 97.631000 -1211.748000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 -1223.148000 104.443000 -1232.148000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 -1223.148000 109.060000 -1232.148000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 -1223.148000 113.398000 -1232.148000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 -1223.148000 119.194000 -1232.148000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 -1223.148000 124.612000 -1232.148000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 -1223.148000 127.465000 -1232.148000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 -1239.848000 101.176000 -1248.848000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 -1239.848000 104.074000 -1248.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 -1239.848000 109.420000 -1248.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 -1239.848000 114.442000 -1248.848000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 -1239.848000 120.202000 -1248.848000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 -1239.848000 123.811000 -1248.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 -1239.848000 129.121000 -1248.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 -1239.848000 134.899000 -1248.848000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 -1239.848000 139.516000 -1248.848000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 -1239.848000 143.107000 -1248.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 -1239.848000 148.417000 -1248.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 -1239.848000 151.270000 -1248.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 -1239.848000 157.093000 -1248.848000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 -1256.548000 103.048000 -1265.548000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 -1256.548000 108.421000 -1265.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 -1256.548000 113.443000 -1265.548000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 -1256.548000 118.852000 -1265.548000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 -1256.548000 124.702000 -1265.548000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 -1256.548000 130.021000 -1265.548000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 -1256.548000 135.079000 -1265.548000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 -1275.748000 104.407000 -1284.748000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 -1275.748000 109.816000 -1284.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 -1275.748000 115.594000 -1284.748000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 -1275.748000 121.354000 -1284.748000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 -1275.748000 125.692000 -1284.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 -1275.748000 128.563000 -1284.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 -1275.748000 133.954000 -1284.748000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 -1275.748000 139.786000 -1284.748000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -1308.400000 0 72.100000 -1308.400000 0 72.100000 -1187.900000 0 72.000000 -1187.900000 0 72.000000 -1308.400000 0
+eoFillPath subpath 1 164.600000 -1308.400000 0 164.700000 -1308.400000 0 164.700000 -1187.900000 0 164.600000 -1187.900000 0 164.600000 -1308.400000 0
+eoFillPath subpath 1 72.000000 -1188.000000 0 164.700000 -1188.000000 0 164.700000 -1187.900000 0 72.000000 -1187.900000 0 72.000000 -1188.000000 0
+eoFillPath subpath 1 72.000000 -1308.400000 0 164.700000 -1308.400000 0 164.700000 -1308.300000 0 72.000000 -1308.300000 0 72.000000 -1308.400000 0
+eoFillPath subpath 1 91.300000 -1293.500000 0 93.700000 -1293.500000 0 93.700000 -1219.200000 0 91.300000 -1219.200000 0 91.300000 -1293.500000 0
+eoFillPath subpath 1 72.000000 -1274.300000 0 169.600000 -1274.300000 0 169.600000 -1271.900000 0 72.000000 -1271.900000 0 72.000000 -1274.300000 0
+eoFillPath subpath 1 72.000000 -1221.600000 0 169.600000 -1221.600000 0 169.600000 -1219.200000 0 72.000000 -1219.200000 0 72.000000 -1221.600000 0
+eoFillPath subpath 1 72.000000 -1293.500000 0 169.600000 -1293.500000 0 169.600000 -1291.100000 0 72.000000 -1291.100000 0 72.000000 -1293.500000 0
+saveState
+eoClipPath subpath 1 108.000000 -9159.400000 0 150.800000 -9159.400000 0 150.800000 -9115.200000 0 108.000000 -9115.200000 0 108.000000 -9159.400000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 995140.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 -10009.400000 0 499.600000 -10009.400000 0 499.600000 -10004.300000 0 186.800000 -10004.300000 0 186.800000 -10009.400000 0
+eoFillPath subpath 1 494.500000 -10004.400000 0 499.600000 -10004.400000 0 499.600000 -9816.000000 0 494.500000 -9816.000000 0 494.500000 -10004.400000 0
+saveState
+eoClipPath subpath 1 181.800000 -10004.400000 0 494.500000 -10004.400000 0 494.500000 -9811.000000 0 181.800000 -9811.000000 0 181.800000 -10004.400000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 -9810.900000 0 494.500000 -9810.900000 0 494.500000 -9810.900000 0 181.700000 -9810.900000 0
+eoFillPath subpath 1 181.700000 -9810.900000 0 494.500000 -9810.900000 0 494.500000 -9811.700000 0 181.700000 -9811.700000 0 181.700000 -9810.900000 0
+eoFillPath subpath 1 181.700000 -9811.700000 0 494.500000 -9811.700000 0 494.500000 -9812.400000 0 181.700000 -9812.400000 0 181.700000 -9811.700000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 -9812.400000 0 494.500000 -9812.400000 0 494.500000 -9813.200000 0 181.700000 -9813.200000 0 181.700000 -9812.400000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 -9813.200000 0 494.500000 -9813.200000 0 494.500000 -9814.000000 0 181.700000 -9814.000000 0 181.700000 -9813.200000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 -9814.000000 0 494.500000 -9814.000000 0 494.500000 -9814.700000 0 181.700000 -9814.700000 0 181.700000 -9814.000000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 -9814.700000 0 494.500000 -9814.700000 0 494.500000 -9815.500000 0 181.700000 -9815.500000 0 181.700000 -9814.700000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 -9815.500000 0 494.500000 -9815.500000 0 494.500000 -9816.200000 0 181.700000 -9816.200000 0 181.700000 -9815.500000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 -9816.200000 0 494.500000 -9816.200000 0 494.500000 -9817.000000 0 181.700000 -9817.000000 0 181.700000 -9816.200000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 -9817.000000 0 494.500000 -9817.000000 0 494.500000 -9817.700000 0 181.700000 -9817.700000 0 181.700000 -9817.000000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 -9817.700000 0 494.500000 -9817.700000 0 494.500000 -9818.500000 0 181.700000 -9818.500000 0 181.700000 -9817.700000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 -9818.500000 0 494.500000 -9818.500000 0 494.500000 -9819.300000 0 181.700000 -9819.300000 0 181.700000 -9818.500000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 -9819.300000 0 494.500000 -9819.300000 0 494.500000 -9820.000000 0 181.700000 -9820.000000 0 181.700000 -9819.300000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 -9820.000000 0 494.500000 -9820.000000 0 494.500000 -9820.800000 0 181.700000 -9820.800000 0 181.700000 -9820.000000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 -9820.800000 0 494.500000 -9820.800000 0 494.500000 -9821.500000 0 181.700000 -9821.500000 0 181.700000 -9820.800000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 -9821.500000 0 494.500000 -9821.500000 0 494.500000 -9822.300000 0 181.700000 -9822.300000 0 181.700000 -9821.500000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 -9822.300000 0 494.500000 -9822.300000 0 494.500000 -9823.100000 0 181.700000 -9823.100000 0 181.700000 -9822.300000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 -9823.100000 0 494.500000 -9823.100000 0 494.500000 -9823.800000 0 181.700000 -9823.800000 0 181.700000 -9823.100000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 -9823.800000 0 494.500000 -9823.800000 0 494.500000 -9824.600000 0 181.700000 -9824.600000 0 181.700000 -9823.800000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 -9824.600000 0 494.500000 -9824.600000 0 494.500000 -9825.300000 0 181.700000 -9825.300000 0 181.700000 -9824.600000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 -9825.300000 0 494.500000 -9825.300000 0 494.500000 -9826.100000 0 181.700000 -9826.100000 0 181.700000 -9825.300000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 -9826.100000 0 494.500000 -9826.100000 0 494.500000 -9826.900000 0 181.700000 -9826.900000 0 181.700000 -9826.100000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 -9826.900000 0 494.500000 -9826.900000 0 494.500000 -9827.600000 0 181.700000 -9827.600000 0 181.700000 -9826.900000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 -9827.600000 0 494.500000 -9827.600000 0 494.500000 -9828.400000 0 181.700000 -9828.400000 0 181.700000 -9827.600000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 -9828.400000 0 494.500000 -9828.400000 0 494.500000 -9829.100000 0 181.700000 -9829.100000 0 181.700000 -9828.400000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 -9829.100000 0 494.500000 -9829.100000 0 494.500000 -9829.900000 0 181.700000 -9829.900000 0 181.700000 -9829.100000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 -9829.900000 0 494.500000 -9829.900000 0 494.500000 -9830.600000 0 181.700000 -9830.600000 0 181.700000 -9829.900000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 -9830.600000 0 494.500000 -9830.600000 0 494.500000 -9831.400000 0 181.700000 -9831.400000 0 181.700000 -9830.600000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 -9831.400000 0 494.500000 -9831.400000 0 494.500000 -9832.200000 0 181.700000 -9832.200000 0 181.700000 -9831.400000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 -9832.200000 0 494.500000 -9832.200000 0 494.500000 -9832.900000 0 181.700000 -9832.900000 0 181.700000 -9832.200000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 -9832.900000 0 494.500000 -9832.900000 0 494.500000 -9833.700000 0 181.700000 -9833.700000 0 181.700000 -9832.900000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 -9833.700000 0 494.500000 -9833.700000 0 494.500000 -9834.400000 0 181.700000 -9834.400000 0 181.700000 -9833.700000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 -9834.400000 0 494.500000 -9834.400000 0 494.500000 -9835.200000 0 181.700000 -9835.200000 0 181.700000 -9834.400000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 -9835.200000 0 494.500000 -9835.200000 0 494.500000 -9836.000000 0 181.700000 -9836.000000 0 181.700000 -9835.200000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 -9836.000000 0 494.500000 -9836.000000 0 494.500000 -9836.700000 0 181.700000 -9836.700000 0 181.700000 -9836.000000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 -9836.700000 0 494.500000 -9836.700000 0 494.500000 -9837.500000 0 181.700000 -9837.500000 0 181.700000 -9836.700000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 -9837.500000 0 494.500000 -9837.500000 0 494.500000 -9838.200000 0 181.700000 -9838.200000 0 181.700000 -9837.500000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 -9838.200000 0 494.500000 -9838.200000 0 494.500000 -9839.000000 0 181.700000 -9839.000000 0 181.700000 -9838.200000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 -9839.000000 0 494.500000 -9839.000000 0 494.500000 -9839.800000 0 181.700000 -9839.800000 0 181.700000 -9839.000000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 -9839.800000 0 494.500000 -9839.800000 0 494.500000 -9840.500000 0 181.700000 -9840.500000 0 181.700000 -9839.800000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 -9840.500000 0 494.500000 -9840.500000 0 494.500000 -9841.300000 0 181.700000 -9841.300000 0 181.700000 -9840.500000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 -9841.300000 0 494.500000 -9841.300000 0 494.500000 -9842.000000 0 181.700000 -9842.000000 0 181.700000 -9841.300000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 -9842.000000 0 494.500000 -9842.000000 0 494.500000 -9842.800000 0 181.700000 -9842.800000 0 181.700000 -9842.000000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 -9842.800000 0 494.500000 -9842.800000 0 494.500000 -9843.500000 0 181.700000 -9843.500000 0 181.700000 -9842.800000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 -9843.500000 0 494.500000 -9843.500000 0 494.500000 -9844.300000 0 181.700000 -9844.300000 0 181.700000 -9843.500000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 -9844.300000 0 494.500000 -9844.300000 0 494.500000 -9845.100000 0 181.700000 -9845.100000 0 181.700000 -9844.300000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 -9845.100000 0 494.500000 -9845.100000 0 494.500000 -9845.800000 0 181.700000 -9845.800000 0 181.700000 -9845.100000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 -9845.800000 0 494.500000 -9845.800000 0 494.500000 -9846.600000 0 181.700000 -9846.600000 0 181.700000 -9845.800000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 -9846.600000 0 494.500000 -9846.600000 0 494.500000 -9847.300000 0 181.700000 -9847.300000 0 181.700000 -9846.600000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 -9847.300000 0 494.500000 -9847.300000 0 494.500000 -9848.100000 0 181.700000 -9848.100000 0 181.700000 -9847.300000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 -9848.100000 0 494.500000 -9848.100000 0 494.500000 -9848.900000 0 181.700000 -9848.900000 0 181.700000 -9848.100000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 -9848.900000 0 494.500000 -9848.900000 0 494.500000 -9849.600000 0 181.700000 -9849.600000 0 181.700000 -9848.900000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 -9849.600000 0 494.500000 -9849.600000 0 494.500000 -9850.400000 0 181.700000 -9850.400000 0 181.700000 -9849.600000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 -9850.400000 0 494.500000 -9850.400000 0 494.500000 -9851.100000 0 181.700000 -9851.100000 0 181.700000 -9850.400000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 -9851.100000 0 494.500000 -9851.100000 0 494.500000 -9851.900000 0 181.700000 -9851.900000 0 181.700000 -9851.100000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 -9851.900000 0 494.500000 -9851.900000 0 494.500000 -9852.700000 0 181.700000 -9852.700000 0 181.700000 -9851.900000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 -9852.700000 0 494.500000 -9852.700000 0 494.500000 -9853.400000 0 181.700000 -9853.400000 0 181.700000 -9852.700000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 -9853.400000 0 494.500000 -9853.400000 0 494.500000 -9854.200000 0 181.700000 -9854.200000 0 181.700000 -9853.400000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 -9854.200000 0 494.500000 -9854.200000 0 494.500000 -9854.900000 0 181.700000 -9854.900000 0 181.700000 -9854.200000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 -9854.900000 0 494.500000 -9854.900000 0 494.500000 -9855.700000 0 181.700000 -9855.700000 0 181.700000 -9854.900000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 -9855.700000 0 494.500000 -9855.700000 0 494.500000 -9856.400000 0 181.700000 -9856.400000 0 181.700000 -9855.700000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 -9856.400000 0 494.500000 -9856.400000 0 494.500000 -9857.200000 0 181.700000 -9857.200000 0 181.700000 -9856.400000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 -9857.200000 0 494.500000 -9857.200000 0 494.500000 -9858.000000 0 181.700000 -9858.000000 0 181.700000 -9857.200000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 -9858.000000 0 494.500000 -9858.000000 0 494.500000 -9858.700000 0 181.700000 -9858.700000 0 181.700000 -9858.000000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 -9858.700000 0 494.500000 -9858.700000 0 494.500000 -9859.500000 0 181.700000 -9859.500000 0 181.700000 -9858.700000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 -9859.500000 0 494.500000 -9859.500000 0 494.500000 -9860.200000 0 181.700000 -9860.200000 0 181.700000 -9859.500000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 -9860.200000 0 494.500000 -9860.200000 0 494.500000 -9861.000000 0 181.700000 -9861.000000 0 181.700000 -9860.200000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 -9861.000000 0 494.500000 -9861.000000 0 494.500000 -9861.800000 0 181.700000 -9861.800000 0 181.700000 -9861.000000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 -9861.800000 0 494.500000 -9861.800000 0 494.500000 -9862.500000 0 181.700000 -9862.500000 0 181.700000 -9861.800000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 -9862.500000 0 494.500000 -9862.500000 0 494.500000 -9863.300000 0 181.700000 -9863.300000 0 181.700000 -9862.500000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 -9863.300000 0 494.500000 -9863.300000 0 494.500000 -9864.000000 0 181.700000 -9864.000000 0 181.700000 -9863.300000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 -9864.000000 0 494.500000 -9864.000000 0 494.500000 -9864.800000 0 181.700000 -9864.800000 0 181.700000 -9864.000000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 -9864.800000 0 494.500000 -9864.800000 0 494.500000 -9865.600000 0 181.700000 -9865.600000 0 181.700000 -9864.800000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 -9865.600000 0 494.500000 -9865.600000 0 494.500000 -9866.300000 0 181.700000 -9866.300000 0 181.700000 -9865.600000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 -9866.300000 0 494.500000 -9866.300000 0 494.500000 -9867.100000 0 181.700000 -9867.100000 0 181.700000 -9866.300000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 -9867.100000 0 494.500000 -9867.100000 0 494.500000 -9867.800000 0 181.700000 -9867.800000 0 181.700000 -9867.100000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 -9867.800000 0 494.500000 -9867.800000 0 494.500000 -9868.600000 0 181.700000 -9868.600000 0 181.700000 -9867.800000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 -9868.600000 0 494.500000 -9868.600000 0 494.500000 -9869.300000 0 181.700000 -9869.300000 0 181.700000 -9868.600000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 -9869.300000 0 494.500000 -9869.300000 0 494.500000 -9870.100000 0 181.700000 -9870.100000 0 181.700000 -9869.300000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 -9870.100000 0 494.500000 -9870.100000 0 494.500000 -9870.900000 0 181.700000 -9870.900000 0 181.700000 -9870.100000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 -9870.900000 0 494.500000 -9870.900000 0 494.500000 -9871.600000 0 181.700000 -9871.600000 0 181.700000 -9870.900000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 -9871.600000 0 494.500000 -9871.600000 0 494.500000 -9872.400000 0 181.700000 -9872.400000 0 181.700000 -9871.600000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 -9872.400000 0 494.500000 -9872.400000 0 494.500000 -9873.100000 0 181.700000 -9873.100000 0 181.700000 -9872.400000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 -9873.100000 0 494.500000 -9873.100000 0 494.500000 -9873.900000 0 181.700000 -9873.900000 0 181.700000 -9873.100000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 -9873.900000 0 494.500000 -9873.900000 0 494.500000 -9874.700000 0 181.700000 -9874.700000 0 181.700000 -9873.900000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 -9874.700000 0 494.500000 -9874.700000 0 494.500000 -9875.400000 0 181.700000 -9875.400000 0 181.700000 -9874.700000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 -9875.400000 0 494.500000 -9875.400000 0 494.500000 -9876.200000 0 181.700000 -9876.200000 0 181.700000 -9875.400000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 -9876.200000 0 494.500000 -9876.200000 0 494.500000 -9876.900000 0 181.700000 -9876.900000 0 181.700000 -9876.200000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 -9876.900000 0 494.500000 -9876.900000 0 494.500000 -9877.700000 0 181.700000 -9877.700000 0 181.700000 -9876.900000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 -9877.700000 0 494.500000 -9877.700000 0 494.500000 -9878.500000 0 181.700000 -9878.500000 0 181.700000 -9877.700000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 -9878.500000 0 494.500000 -9878.500000 0 494.500000 -9879.200000 0 181.700000 -9879.200000 0 181.700000 -9878.500000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 -9879.200000 0 494.500000 -9879.200000 0 494.500000 -9880.000000 0 181.700000 -9880.000000 0 181.700000 -9879.200000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 -9880.000000 0 494.500000 -9880.000000 0 494.500000 -9880.700000 0 181.700000 -9880.700000 0 181.700000 -9880.000000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 -9880.700000 0 494.500000 -9880.700000 0 494.500000 -9881.500000 0 181.700000 -9881.500000 0 181.700000 -9880.700000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 -9881.500000 0 494.500000 -9881.500000 0 494.500000 -9882.200000 0 181.700000 -9882.200000 0 181.700000 -9881.500000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 -9882.200000 0 494.500000 -9882.200000 0 494.500000 -9883.000000 0 181.700000 -9883.000000 0 181.700000 -9882.200000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 -9883.000000 0 494.500000 -9883.000000 0 494.500000 -9883.800000 0 181.700000 -9883.800000 0 181.700000 -9883.000000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 -9883.800000 0 494.500000 -9883.800000 0 494.500000 -9884.500000 0 181.700000 -9884.500000 0 181.700000 -9883.800000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 -9884.500000 0 494.500000 -9884.500000 0 494.500000 -9885.300000 0 181.700000 -9885.300000 0 181.700000 -9884.500000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 -9885.300000 0 494.500000 -9885.300000 0 494.500000 -9886.000000 0 181.700000 -9886.000000 0 181.700000 -9885.300000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 -9886.000000 0 494.500000 -9886.000000 0 494.500000 -9886.800000 0 181.700000 -9886.800000 0 181.700000 -9886.000000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 -9886.800000 0 494.500000 -9886.800000 0 494.500000 -9887.600000 0 181.700000 -9887.600000 0 181.700000 -9886.800000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 -9887.600000 0 494.500000 -9887.600000 0 494.500000 -9888.300000 0 181.700000 -9888.300000 0 181.700000 -9887.600000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 -9888.300000 0 494.500000 -9888.300000 0 494.500000 -9889.100000 0 181.700000 -9889.100000 0 181.700000 -9888.300000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 -9889.100000 0 494.500000 -9889.100000 0 494.500000 -9889.800000 0 181.700000 -9889.800000 0 181.700000 -9889.100000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 -9889.800000 0 494.500000 -9889.800000 0 494.500000 -9890.600000 0 181.700000 -9890.600000 0 181.700000 -9889.800000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 -9890.600000 0 494.500000 -9890.600000 0 494.500000 -9891.400000 0 181.700000 -9891.400000 0 181.700000 -9890.600000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 -9891.400000 0 494.500000 -9891.400000 0 494.500000 -9892.100000 0 181.700000 -9892.100000 0 181.700000 -9891.400000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 -9892.100000 0 494.500000 -9892.100000 0 494.500000 -9892.900000 0 181.700000 -9892.900000 0 181.700000 -9892.100000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 -9892.900000 0 494.500000 -9892.900000 0 494.500000 -9893.600000 0 181.700000 -9893.600000 0 181.700000 -9892.900000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 -9893.600000 0 494.500000 -9893.600000 0 494.500000 -9894.400000 0 181.700000 -9894.400000 0 181.700000 -9893.600000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 -9894.400000 0 494.500000 -9894.400000 0 494.500000 -9895.100000 0 181.700000 -9895.100000 0 181.700000 -9894.400000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 -9895.100000 0 494.500000 -9895.100000 0 494.500000 -9895.900000 0 181.700000 -9895.900000 0 181.700000 -9895.100000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 -9895.900000 0 494.500000 -9895.900000 0 494.500000 -9896.700000 0 181.700000 -9896.700000 0 181.700000 -9895.900000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 -9896.700000 0 494.500000 -9896.700000 0 494.500000 -9897.400000 0 181.700000 -9897.400000 0 181.700000 -9896.700000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 -9897.400000 0 494.500000 -9897.400000 0 494.500000 -9898.200000 0 181.700000 -9898.200000 0 181.700000 -9897.400000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 -9898.200000 0 494.500000 -9898.200000 0 494.500000 -9898.900000 0 181.700000 -9898.900000 0 181.700000 -9898.200000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 -9898.900000 0 494.500000 -9898.900000 0 494.500000 -9899.700000 0 181.700000 -9899.700000 0 181.700000 -9898.900000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 -9899.700000 0 494.500000 -9899.700000 0 494.500000 -9900.500000 0 181.700000 -9900.500000 0 181.700000 -9899.700000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 -9900.500000 0 494.500000 -9900.500000 0 494.500000 -9901.200000 0 181.700000 -9901.200000 0 181.700000 -9900.500000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 -9901.200000 0 494.500000 -9901.200000 0 494.500000 -9902.000000 0 181.700000 -9902.000000 0 181.700000 -9901.200000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 -9902.000000 0 494.500000 -9902.000000 0 494.500000 -9902.700000 0 181.700000 -9902.700000 0 181.700000 -9902.000000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 -9902.700000 0 494.500000 -9902.700000 0 494.500000 -9903.500000 0 181.700000 -9903.500000 0 181.700000 -9902.700000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 -9903.500000 0 494.500000 -9903.500000 0 494.500000 -9904.300000 0 181.700000 -9904.300000 0 181.700000 -9903.500000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 -9904.300000 0 494.500000 -9904.300000 0 494.500000 -9905.000000 0 181.700000 -9905.000000 0 181.700000 -9904.300000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 -9905.000000 0 494.500000 -9905.000000 0 494.500000 -9905.800000 0 181.700000 -9905.800000 0 181.700000 -9905.000000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 -9905.800000 0 494.500000 -9905.800000 0 494.500000 -9906.500000 0 181.700000 -9906.500000 0 181.700000 -9905.800000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 -9906.500000 0 494.500000 -9906.500000 0 494.500000 -9907.300000 0 181.700000 -9907.300000 0 181.700000 -9906.500000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 -9907.300000 0 494.500000 -9907.300000 0 494.500000 -9908.000000 0 181.700000 -9908.000000 0 181.700000 -9907.300000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 -9908.000000 0 494.500000 -9908.000000 0 494.500000 -9908.800000 0 181.700000 -9908.800000 0 181.700000 -9908.000000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 -9908.800000 0 494.500000 -9908.800000 0 494.500000 -9909.600000 0 181.700000 -9909.600000 0 181.700000 -9908.800000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 -9909.600000 0 494.500000 -9909.600000 0 494.500000 -9910.300000 0 181.700000 -9910.300000 0 181.700000 -9909.600000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 -9910.300000 0 494.500000 -9910.300000 0 494.500000 -9911.100000 0 181.700000 -9911.100000 0 181.700000 -9910.300000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 -9911.100000 0 494.500000 -9911.100000 0 494.500000 -9911.800000 0 181.700000 -9911.800000 0 181.700000 -9911.100000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 -9911.800000 0 494.500000 -9911.800000 0 494.500000 -9912.600000 0 181.700000 -9912.600000 0 181.700000 -9911.800000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 -9912.600000 0 494.500000 -9912.600000 0 494.500000 -9913.400000 0 181.700000 -9913.400000 0 181.700000 -9912.600000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 -9913.400000 0 494.500000 -9913.400000 0 494.500000 -9914.100000 0 181.700000 -9914.100000 0 181.700000 -9913.400000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 -9914.100000 0 494.500000 -9914.100000 0 494.500000 -9914.900000 0 181.700000 -9914.900000 0 181.700000 -9914.100000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 -9914.900000 0 494.500000 -9914.900000 0 494.500000 -9915.600000 0 181.700000 -9915.600000 0 181.700000 -9914.900000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 -9915.600000 0 494.500000 -9915.600000 0 494.500000 -9916.400000 0 181.700000 -9916.400000 0 181.700000 -9915.600000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 -9916.400000 0 494.500000 -9916.400000 0 494.500000 -9917.100000 0 181.700000 -9917.100000 0 181.700000 -9916.400000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 -9917.100000 0 494.500000 -9917.100000 0 494.500000 -9917.900000 0 181.700000 -9917.900000 0 181.700000 -9917.100000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 -9917.900000 0 494.500000 -9917.900000 0 494.500000 -9918.700000 0 181.700000 -9918.700000 0 181.700000 -9917.900000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 -9918.700000 0 494.500000 -9918.700000 0 494.500000 -9919.400000 0 181.700000 -9919.400000 0 181.700000 -9918.700000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 -9919.400000 0 494.500000 -9919.400000 0 494.500000 -9920.200000 0 181.700000 -9920.200000 0 181.700000 -9919.400000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 -9920.200000 0 494.500000 -9920.200000 0 494.500000 -9920.900000 0 181.700000 -9920.900000 0 181.700000 -9920.200000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 -9920.900000 0 494.500000 -9920.900000 0 494.500000 -9921.700000 0 181.700000 -9921.700000 0 181.700000 -9920.900000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 -9921.700000 0 494.500000 -9921.700000 0 494.500000 -9922.500000 0 181.700000 -9922.500000 0 181.700000 -9921.700000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 -9922.500000 0 494.500000 -9922.500000 0 494.500000 -9923.200000 0 181.700000 -9923.200000 0 181.700000 -9922.500000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 -9923.200000 0 494.500000 -9923.200000 0 494.500000 -9924.000000 0 181.700000 -9924.000000 0 181.700000 -9923.200000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 -9924.000000 0 494.500000 -9924.000000 0 494.500000 -9924.700000 0 181.700000 -9924.700000 0 181.700000 -9924.000000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 -9924.700000 0 494.500000 -9924.700000 0 494.500000 -9925.500000 0 181.700000 -9925.500000 0 181.700000 -9924.700000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 -9925.500000 0 494.500000 -9925.500000 0 494.500000 -9926.200000 0 181.700000 -9926.200000 0 181.700000 -9925.500000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 -9926.200000 0 494.500000 -9926.200000 0 494.500000 -9927.000000 0 181.700000 -9927.000000 0 181.700000 -9926.200000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 -9927.000000 0 494.500000 -9927.000000 0 494.500000 -9927.800000 0 181.700000 -9927.800000 0 181.700000 -9927.000000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 -9927.800000 0 494.500000 -9927.800000 0 494.500000 -9928.500000 0 181.700000 -9928.500000 0 181.700000 -9927.800000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 -9928.500000 0 494.500000 -9928.500000 0 494.500000 -9929.300000 0 181.700000 -9929.300000 0 181.700000 -9928.500000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 -9929.300000 0 494.500000 -9929.300000 0 494.500000 -9930.000000 0 181.700000 -9930.000000 0 181.700000 -9929.300000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 -9930.000000 0 494.500000 -9930.000000 0 494.500000 -9930.800000 0 181.700000 -9930.800000 0 181.700000 -9930.000000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 -9930.800000 0 494.500000 -9930.800000 0 494.500000 -9931.500000 0 181.700000 -9931.500000 0 181.700000 -9930.800000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 -9931.500000 0 494.500000 -9931.500000 0 494.500000 -9932.300000 0 181.700000 -9932.300000 0 181.700000 -9931.500000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 -9932.300000 0 494.500000 -9932.300000 0 494.500000 -9933.100000 0 181.700000 -9933.100000 0 181.700000 -9932.300000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 -9933.100000 0 494.500000 -9933.100000 0 494.500000 -9933.800000 0 181.700000 -9933.800000 0 181.700000 -9933.100000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 -9933.800000 0 494.500000 -9933.800000 0 494.500000 -9934.600000 0 181.700000 -9934.600000 0 181.700000 -9933.800000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 -9934.600000 0 494.500000 -9934.600000 0 494.500000 -9935.300000 0 181.700000 -9935.300000 0 181.700000 -9934.600000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 -9935.300000 0 494.500000 -9935.300000 0 494.500000 -9936.100000 0 181.700000 -9936.100000 0 181.700000 -9935.300000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 -9936.100000 0 494.500000 -9936.100000 0 494.500000 -9936.900000 0 181.700000 -9936.900000 0 181.700000 -9936.100000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 -9936.900000 0 494.500000 -9936.900000 0 494.500000 -9937.600000 0 181.700000 -9937.600000 0 181.700000 -9936.900000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 -9937.600000 0 494.500000 -9937.600000 0 494.500000 -9938.400000 0 181.700000 -9938.400000 0 181.700000 -9937.600000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 -9938.400000 0 494.500000 -9938.400000 0 494.500000 -9939.100000 0 181.700000 -9939.100000 0 181.700000 -9938.400000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 -9939.100000 0 494.500000 -9939.100000 0 494.500000 -9939.900000 0 181.700000 -9939.900000 0 181.700000 -9939.100000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 -9939.900000 0 494.500000 -9939.900000 0 494.500000 -9940.600000 0 181.700000 -9940.600000 0 181.700000 -9939.900000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 -9940.600000 0 494.500000 -9940.600000 0 494.500000 -9941.400000 0 181.700000 -9941.400000 0 181.700000 -9940.600000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 -9941.400000 0 494.500000 -9941.400000 0 494.500000 -9942.200000 0 181.700000 -9942.200000 0 181.700000 -9941.400000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 -9942.200000 0 494.500000 -9942.200000 0 494.500000 -9942.900000 0 181.700000 -9942.900000 0 181.700000 -9942.200000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 -9942.900000 0 494.500000 -9942.900000 0 494.500000 -9943.700000 0 181.700000 -9943.700000 0 181.700000 -9942.900000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 -9943.700000 0 494.500000 -9943.700000 0 494.500000 -9944.400000 0 181.700000 -9944.400000 0 181.700000 -9943.700000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 -9944.400000 0 494.500000 -9944.400000 0 494.500000 -9945.200000 0 181.700000 -9945.200000 0 181.700000 -9944.400000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 -9945.200000 0 494.500000 -9945.200000 0 494.500000 -9946.000000 0 181.700000 -9946.000000 0 181.700000 -9945.200000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 -9946.000000 0 494.500000 -9946.000000 0 494.500000 -9946.700000 0 181.700000 -9946.700000 0 181.700000 -9946.000000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 -9946.700000 0 494.500000 -9946.700000 0 494.500000 -9947.500000 0 181.700000 -9947.500000 0 181.700000 -9946.700000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 -9947.500000 0 494.500000 -9947.500000 0 494.500000 -9948.200000 0 181.700000 -9948.200000 0 181.700000 -9947.500000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 -9948.200000 0 494.500000 -9948.200000 0 494.500000 -9949.000000 0 181.700000 -9949.000000 0 181.700000 -9948.200000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 -9949.000000 0 494.500000 -9949.000000 0 494.500000 -9949.700000 0 181.700000 -9949.700000 0 181.700000 -9949.000000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 -9949.700000 0 494.500000 -9949.700000 0 494.500000 -9950.500000 0 181.700000 -9950.500000 0 181.700000 -9949.700000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 -9950.500000 0 494.500000 -9950.500000 0 494.500000 -9951.300000 0 181.700000 -9951.300000 0 181.700000 -9950.500000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 -9951.300000 0 494.500000 -9951.300000 0 494.500000 -9952.000000 0 181.700000 -9952.000000 0 181.700000 -9951.300000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 -9952.000000 0 494.500000 -9952.000000 0 494.500000 -9952.800000 0 181.700000 -9952.800000 0 181.700000 -9952.000000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 -9952.800000 0 494.500000 -9952.800000 0 494.500000 -9953.500000 0 181.700000 -9953.500000 0 181.700000 -9952.800000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 -9953.500000 0 494.500000 -9953.500000 0 494.500000 -9954.300000 0 181.700000 -9954.300000 0 181.700000 -9953.500000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 -9954.300000 0 494.500000 -9954.300000 0 494.500000 -9955.100000 0 181.700000 -9955.100000 0 181.700000 -9954.300000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 -9955.100000 0 494.500000 -9955.100000 0 494.500000 -9955.800000 0 181.700000 -9955.800000 0 181.700000 -9955.100000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 -9955.800000 0 494.500000 -9955.800000 0 494.500000 -9956.600000 0 181.700000 -9956.600000 0 181.700000 -9955.800000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 -9956.600000 0 494.500000 -9956.600000 0 494.500000 -9957.300000 0 181.700000 -9957.300000 0 181.700000 -9956.600000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 -9957.300000 0 494.500000 -9957.300000 0 494.500000 -9958.100000 0 181.700000 -9958.100000 0 181.700000 -9957.300000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 -9958.100000 0 494.500000 -9958.100000 0 494.500000 -9958.900000 0 181.700000 -9958.900000 0 181.700000 -9958.100000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 -9958.900000 0 494.500000 -9958.900000 0 494.500000 -9959.600000 0 181.700000 -9959.600000 0 181.700000 -9958.900000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 -9959.600000 0 494.500000 -9959.600000 0 494.500000 -9960.400000 0 181.700000 -9960.400000 0 181.700000 -9959.600000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 -9960.400000 0 494.500000 -9960.400000 0 494.500000 -9961.100000 0 181.700000 -9961.100000 0 181.700000 -9960.400000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 -9961.100000 0 494.500000 -9961.100000 0 494.500000 -9961.900000 0 181.700000 -9961.900000 0 181.700000 -9961.100000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 -9961.900000 0 494.500000 -9961.900000 0 494.500000 -9962.600000 0 181.700000 -9962.600000 0 181.700000 -9961.900000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 -9962.600000 0 494.500000 -9962.600000 0 494.500000 -9963.400000 0 181.700000 -9963.400000 0 181.700000 -9962.600000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 -9963.400000 0 494.500000 -9963.400000 0 494.500000 -9964.200000 0 181.700000 -9964.200000 0 181.700000 -9963.400000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 -9964.200000 0 494.500000 -9964.200000 0 494.500000 -9964.900000 0 181.700000 -9964.900000 0 181.700000 -9964.200000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 -9964.900000 0 494.500000 -9964.900000 0 494.500000 -9965.700000 0 181.700000 -9965.700000 0 181.700000 -9964.900000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 -9965.700000 0 494.500000 -9965.700000 0 494.500000 -9966.400000 0 181.700000 -9966.400000 0 181.700000 -9965.700000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 -9966.400000 0 494.500000 -9966.400000 0 494.500000 -9967.200000 0 181.700000 -9967.200000 0 181.700000 -9966.400000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 -9967.200000 0 494.500000 -9967.200000 0 494.500000 -9968.000000 0 181.700000 -9968.000000 0 181.700000 -9967.200000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 -9968.000000 0 494.500000 -9968.000000 0 494.500000 -9968.700000 0 181.700000 -9968.700000 0 181.700000 -9968.000000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 -9968.700000 0 494.500000 -9968.700000 0 494.500000 -9969.500000 0 181.700000 -9969.500000 0 181.700000 -9968.700000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 -9969.500000 0 494.500000 -9969.500000 0 494.500000 -9970.200000 0 181.700000 -9970.200000 0 181.700000 -9969.500000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 -9970.200000 0 494.500000 -9970.200000 0 494.500000 -9971.000000 0 181.700000 -9971.000000 0 181.700000 -9970.200000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 -9971.000000 0 494.500000 -9971.000000 0 494.500000 -9971.800000 0 181.700000 -9971.800000 0 181.700000 -9971.000000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 -9971.800000 0 494.500000 -9971.800000 0 494.500000 -9972.500000 0 181.700000 -9972.500000 0 181.700000 -9971.800000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 -9972.500000 0 494.500000 -9972.500000 0 494.500000 -9973.300000 0 181.700000 -9973.300000 0 181.700000 -9972.500000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 -9973.300000 0 494.500000 -9973.300000 0 494.500000 -9974.000000 0 181.700000 -9974.000000 0 181.700000 -9973.300000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 -9974.000000 0 494.500000 -9974.000000 0 494.500000 -9974.800000 0 181.700000 -9974.800000 0 181.700000 -9974.000000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 -9974.800000 0 494.500000 -9974.800000 0 494.500000 -9975.500000 0 181.700000 -9975.500000 0 181.700000 -9974.800000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 -9975.500000 0 494.500000 -9975.500000 0 494.500000 -9976.300000 0 181.700000 -9976.300000 0 181.700000 -9975.500000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 -9976.300000 0 494.500000 -9976.300000 0 494.500000 -9977.100000 0 181.700000 -9977.100000 0 181.700000 -9976.300000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 -9977.100000 0 494.500000 -9977.100000 0 494.500000 -9977.800000 0 181.700000 -9977.800000 0 181.700000 -9977.100000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 -9977.800000 0 494.500000 -9977.800000 0 494.500000 -9978.600000 0 181.700000 -9978.600000 0 181.700000 -9977.800000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 -9978.600000 0 494.500000 -9978.600000 0 494.500000 -9979.300000 0 181.700000 -9979.300000 0 181.700000 -9978.600000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 -9979.300000 0 494.500000 -9979.300000 0 494.500000 -9980.100000 0 181.700000 -9980.100000 0 181.700000 -9979.300000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 -9980.100000 0 494.500000 -9980.100000 0 494.500000 -9980.900000 0 181.700000 -9980.900000 0 181.700000 -9980.100000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 -9980.900000 0 494.500000 -9980.900000 0 494.500000 -9981.600000 0 181.700000 -9981.600000 0 181.700000 -9980.900000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 -9981.600000 0 494.500000 -9981.600000 0 494.500000 -9982.400000 0 181.700000 -9982.400000 0 181.700000 -9981.600000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 -9982.400000 0 494.500000 -9982.400000 0 494.500000 -9983.100000 0 181.700000 -9983.100000 0 181.700000 -9982.400000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 -9983.100000 0 494.500000 -9983.100000 0 494.500000 -9983.900000 0 181.700000 -9983.900000 0 181.700000 -9983.100000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 -9983.900000 0 494.500000 -9983.900000 0 494.500000 -9984.700000 0 181.700000 -9984.700000 0 181.700000 -9983.900000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 -9984.700000 0 494.500000 -9984.700000 0 494.500000 -9985.400000 0 181.700000 -9985.400000 0 181.700000 -9984.700000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 -9985.400000 0 494.500000 -9985.400000 0 494.500000 -9986.200000 0 181.700000 -9986.200000 0 181.700000 -9985.400000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 -9986.200000 0 494.500000 -9986.200000 0 494.500000 -9986.900000 0 181.700000 -9986.900000 0 181.700000 -9986.200000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 -9986.900000 0 494.500000 -9986.900000 0 494.500000 -9987.700000 0 181.700000 -9987.700000 0 181.700000 -9986.900000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 -9987.700000 0 494.500000 -9987.700000 0 494.500000 -9988.400000 0 181.700000 -9988.400000 0 181.700000 -9987.700000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 -9988.400000 0 494.500000 -9988.400000 0 494.500000 -9989.200000 0 181.700000 -9989.200000 0 181.700000 -9988.400000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 -9989.200000 0 494.500000 -9989.200000 0 494.500000 -9990.000000 0 181.700000 -9990.000000 0 181.700000 -9989.200000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 -9990.000000 0 494.500000 -9990.000000 0 494.500000 -9990.700000 0 181.700000 -9990.700000 0 181.700000 -9990.000000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 -9990.700000 0 494.500000 -9990.700000 0 494.500000 -9991.500000 0 181.700000 -9991.500000 0 181.700000 -9990.700000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 -9991.500000 0 494.500000 -9991.500000 0 494.500000 -9992.200000 0 181.700000 -9992.200000 0 181.700000 -9991.500000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 -9992.200000 0 494.500000 -9992.200000 0 494.500000 -9993.000000 0 181.700000 -9993.000000 0 181.700000 -9992.200000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 -9993.000000 0 494.500000 -9993.000000 0 494.500000 -9993.800000 0 181.700000 -9993.800000 0 181.700000 -9993.000000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 -9993.800000 0 494.500000 -9993.800000 0 494.500000 -9994.500000 0 181.700000 -9994.500000 0 181.700000 -9993.800000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 -9994.500000 0 494.500000 -9994.500000 0 494.500000 -9995.300000 0 181.700000 -9995.300000 0 181.700000 -9994.500000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 -9995.300000 0 494.500000 -9995.300000 0 494.500000 -9996.000000 0 181.700000 -9996.000000 0 181.700000 -9995.300000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 -9996.000000 0 494.500000 -9996.000000 0 494.500000 -9996.800000 0 181.700000 -9996.800000 0 181.700000 -9996.000000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 -9996.800000 0 494.500000 -9996.800000 0 494.500000 -9997.600000 0 181.700000 -9997.600000 0 181.700000 -9996.800000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 -9997.600000 0 494.500000 -9997.600000 0 494.500000 -9998.300000 0 181.700000 -9998.300000 0 181.700000 -9997.600000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 -9998.300000 0 494.500000 -9998.300000 0 494.500000 -9999.100000 0 181.700000 -9999.100000 0 181.700000 -9998.300000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 -9999.100000 0 494.500000 -9999.100000 0 494.500000 -9999.800000 0 181.700000 -9999.800000 0 181.700000 -9999.100000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 -9999.800000 0 494.500000 -9999.800000 0 494.500000 -10000.600000 0 181.700000 -10000.600000 0 181.700000 -9999.800000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 -10000.600000 0 494.500000 -10000.600000 0 494.500000 -10001.300000 0 181.700000 -10001.300000 0 181.700000 -10000.600000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 -10001.300000 0 494.500000 -10001.300000 0 494.500000 -10002.100000 0 181.700000 -10002.100000 0 181.700000 -10001.300000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 -10002.100000 0 494.500000 -10002.100000 0 494.500000 -10002.900000 0 181.700000 -10002.900000 0 181.700000 -10002.100000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 -10002.900000 0 494.500000 -10002.900000 0 494.500000 -10003.600000 0 181.700000 -10003.600000 0 181.700000 -10002.900000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 -10003.600000 0 494.500000 -10003.600000 0 494.500000 -10004.400000 0 181.700000 -10004.400000 0 181.700000 -10003.600000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 -10004.300000 0 181.800000 -10004.300000 0 181.800000 -9811.000000 0 494.400000 -9811.000000 0 494.400000 -10004.300000 0 338.100000 -10004.300000 0
+strokePath subpath 1 338.100000 -10004.300000 0 181.800000 -10004.300000 0 181.800000 -9811.000000 0 494.400000 -9811.000000 0 494.400000 -10004.300000 0 338.100000 -10004.300000 0
+saveState
+updateCtm 11420.000000 0.000000 0.000000 -8760.000000 20530.000000 1072030.000000
+drawSoftMaskedImage 1143 877 1143 877 JPEG 71324 PPM 3007249
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 -9965.276000 215.488000 -9973.276000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 -9965.276000 220.592000 -9973.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 -9965.276000 225.696000 -9973.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 -9965.276000 230.800000 -9973.276000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 -9972.876000 241.388000 -9980.876000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 -9972.876000 246.492000 -9980.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 -9972.876000 251.596000 -9980.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 -9972.876000 256.700000 -9980.876000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 -9980.576000 267.188000 -9988.576000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 -9980.576000 272.292000 -9988.576000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 -9980.576000 277.396000 -9988.576000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 -9980.576000 282.500000 -9988.576000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 -9988.176000 293.088000 -9996.176000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 -9988.176000 298.192000 -9996.176000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 -9988.176000 303.296000 -9996.176000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 -9988.176000 308.400000 -9996.176000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 -9950.276000 202.588000 -9958.276000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 -9930.976000 201.688000 -9938.976000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 -9911.676000 195.788000 -9919.676000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 -9911.676000 200.892000 -9919.676000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 -9892.276000 194.888000 -9900.276000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 -9892.276000 199.992000 -9900.276000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 -9872.976000 193.988000 -9880.976000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 -9872.976000 199.092000 -9880.976000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 -9853.676000 193.088000 -9861.676000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 -9853.676000 198.192000 -9861.676000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 -9981.576000 330.188000 -9989.576000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 -9981.576000 332.716000 -9989.576000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 -9981.576000 337.596000 -9989.576000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 -9981.576000 341.396000 -9989.576000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 -9981.576000 346.036000 -9989.576000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 -9981.576000 350.900000 -9989.576000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 -9981.576000 355.972000 -9989.576000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 -9981.576000 359.196000 -9989.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 -9981.576000 362.196000 -9989.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 -9981.576000 367.404000 -9989.576000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 -9981.576000 371.876000 -9989.576000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 -9981.576000 375.052000 -9989.576000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 -9962.076000 361.172000 -9970.076000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 -9962.076000 364.340000 -9970.076000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 -9962.076000 367.396000 -9970.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 -9962.076000 372.604000 -9970.076000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 -9962.076000 379.348000 -9970.076000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 -9962.076000 384.484000 -9970.076000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 -9962.076000 389.436000 -9970.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 -9962.076000 392.108000 -9970.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 -9962.076000 395.708000 -9970.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 -9962.076000 397.540000 -9970.076000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 -9962.076000 402.444000 -9970.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 -9962.076000 406.788000 -9970.076000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 -9942.476000 392.972000 -9950.476000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 -9942.476000 398.076000 -9950.476000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 -9942.476000 403.180000 -9950.476000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 -9942.476000 405.428000 -9950.476000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 -9942.476000 410.332000 -9950.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 -9942.476000 414.476000 -9950.476000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 -9814.908000 305.808000 -9828.908000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 -9814.908000 314.138000 -9828.908000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 -9814.908000 320.788000 -9828.908000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 -9814.908000 328.698000 -9828.908000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 -9814.908000 336.972000 -9828.908000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 -9814.908000 344.182000 -9828.908000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 -9814.908000 349.810000 -9828.908000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 -9814.908000 354.234000 -9828.908000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 -9814.908000 362.718000 -9828.908000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 -9814.908000 367.870000 -9828.908000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 -9814.908000 372.322000 -9828.908000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 -9814.908000 382.080000 -9828.908000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 -9814.908000 388.772000 -9828.908000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 -9814.908000 397.802000 -9828.908000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 -9814.908000 402.254000 -9828.908000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 -9814.908000 407.896000 -9828.908000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 -9937.800000 0 424.300000 -9937.800000 0 424.300000 -9877.100000 0 493.600000 -9877.100000 0 493.600000 -9937.800000 0 458.900000 -9937.800000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 -9886.700000 0 428.900000 -9886.700000 0 428.900000 -9880.800000 0 434.800000 -9880.800000 0 434.800000 -9886.700000 0 431.900000 -9886.700000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 -9897.800000 0 428.900000 -9897.800000 0 428.900000 -9891.800000 0 434.800000 -9891.800000 0 434.800000 -9897.800000 0 431.900000 -9897.800000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 -9908.900000 0 428.900000 -9908.900000 0 428.900000 -9902.900000 0 434.800000 -9902.900000 0 434.800000 -9908.900000 0 431.900000 -9908.900000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 -9920.000000 0 428.900000 -9920.000000 0 428.900000 -9914.000000 0 434.800000 -9914.000000 0 434.800000 -9920.000000 0 431.900000 -9920.000000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 -9931.100000 0 428.900000 -9931.100000 0 428.900000 -9925.100000 0 434.800000 -9925.100000 0 434.800000 -9931.100000 0 431.900000 -9931.100000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -9879.576000 443.288000 -9887.576000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 -9879.576000 445.816000 -9887.576000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 -9879.576000 450.600000 -9887.576000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 -9879.576000 454.496000 -9887.576000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 -9879.576000 459.136000 -9887.576000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 -9879.576000 464.000000 -9887.576000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 -9879.576000 468.976000 -9887.576000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 -9879.576000 472.304000 -9887.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 -9879.576000 475.208000 -9887.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 -9879.576000 480.520000 -9887.576000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 -9879.576000 484.992000 -9887.576000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 -9879.576000 488.168000 -9887.576000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -9890.676000 443.352000 -9898.676000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 -9890.676000 447.920000 -9898.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 -9890.676000 452.976000 -9898.676000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 -9890.676000 457.400000 -9898.676000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 -9890.676000 462.472000 -9898.676000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 -9890.676000 465.800000 -9898.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 -9890.676000 468.904000 -9898.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 -9890.676000 473.816000 -9898.676000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 -9890.676000 478.888000 -9898.676000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 -9890.676000 482.064000 -9898.676000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -9901.776000 442.872000 -9909.776000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 -9901.776000 446.040000 -9909.776000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 -9901.776000 448.992000 -9909.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 -9901.776000 454.304000 -9909.776000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 -9901.776000 461.048000 -9909.776000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 -9901.776000 466.184000 -9909.776000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 -9901.776000 471.136000 -9909.776000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 -9901.776000 473.808000 -9909.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 -9901.776000 477.408000 -9909.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 -9901.776000 479.240000 -9909.776000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 -9901.776000 484.144000 -9909.776000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 -9901.776000 488.488000 -9909.776000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -9912.876000 443.384000 -9920.876000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 -9912.876000 448.464000 -9920.876000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 -9912.876000 453.424000 -9920.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 -9912.876000 456.696000 -9920.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 -9912.876000 459.800000 -9920.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 -9912.876000 462.032000 -9920.876000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 -9912.876000 466.936000 -9920.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 -9912.876000 471.080000 -9920.876000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -9923.976000 443.272000 -9931.976000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 -9923.976000 448.376000 -9931.976000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 -9923.976000 453.480000 -9931.976000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 -9923.976000 455.728000 -9931.976000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 -9923.976000 460.632000 -9931.976000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 -9923.976000 464.776000 -9931.976000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -12569.000000 0 114.800000 -12569.000000 0 114.800000 -12526.200000 0 72.000000 -12526.200000 0 72.000000 -12569.000000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 1336090.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 108.000000 72.000000 0 540.000000 72.000000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 72.000000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 108.000000 701.300000 0 540.000000 701.300000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 701.300000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 108.100000 719.948000 117.860000 703.948000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 115.204000 719.948000 124.996000 703.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 125.012000 719.948000 135.156000 703.948000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 135.220000 719.948000 139.652000 703.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.620000 719.948000 149.460000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.428000 719.948000 154.500000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 154.532000 719.948000 164.308000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 164.340000 719.948000 169.972000 703.948000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 169.940000 719.948000 175.012000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 175.044000 719.948000 186.212000 703.948000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 186.244000 719.948000 196.020000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 196.052000 719.948000 206.180000 703.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 206.148000 719.948000 212.420000 703.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 212.452000 719.948000 222.292000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 222.260000 719.948000 232.388000 703.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 232.356000 719.948000 238.628000 703.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 238.660000 719.948000 246.980000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+updateFont 103 1 0 0 0 200.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 314.300000 672.856000 315.664000 670.856000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 315.400000 672.856000 316.748000 670.856000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 316.700000 672.856000 318.130000 670.856000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 318.100000 672.856000 318.784000 670.856000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 318.800000 672.856000 320.156000 670.856000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 320.200000 672.856000 320.896000 670.856000 1.000000 0.000000 0.000000 1.000000
+drawChar 320.900000 672.856000 322.274000 670.856000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 322.300000 672.856000 323.170000 670.856000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 323.200000 672.856000 323.896000 670.856000 1.000000 0.000000 0.000000 1.000000
+drawChar 323.900000 672.856000 325.366000 670.856000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 325.400000 672.856000 326.774000 670.856000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 326.800000 672.856000 328.222000 670.856000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 328.200000 672.856000 329.156000 670.856000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 329.200000 672.856000 330.556000 670.856000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 330.600000 672.856000 332.022000 670.856000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 332.000000 672.856000 332.956000 670.856000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 333.000000 672.856000 334.190000 670.856000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 21948 EAAAAA+DejaVuSerif-Bold
+drawChar 108.100000 658.556000 121.372000 646.556000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 121.396000 658.556000 128.368000 646.556000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 128.392000 658.556000 132.568000 646.556000 1.000000 0.000000 0.000000 1.000000
+drawChar 132.592000 658.556000 143.920000 646.556000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 143.896000 658.556000 151.888000 646.556000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 151.900000 658.556000 160.624000 646.556000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 160.600000 658.556000 167.344000 646.556000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 167.404000 658.556000 175.036000 646.556000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 174.900000 658.556000 179.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.100000 658.556000 183.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.300000 658.556000 187.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.500000 658.556000 191.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.700000 658.556000 195.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.900000 658.556000 200.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.100000 658.556000 204.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.300000 658.556000 208.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 208.500000 658.556000 212.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 212.700000 658.556000 216.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 216.900000 658.556000 221.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.100000 658.556000 225.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.300000 658.556000 229.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.500000 658.556000 233.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.700000 658.556000 237.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.900000 658.556000 242.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.100000 658.556000 246.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.300000 658.556000 250.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.500000 658.556000 254.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.700000 658.556000 258.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.900000 658.556000 263.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.100000 658.556000 267.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.300000 658.556000 271.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.500000 658.556000 275.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.700000 658.556000 279.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.900000 658.556000 284.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 284.100000 658.556000 288.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 288.300000 658.556000 292.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 292.500000 658.556000 296.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 296.700000 658.556000 300.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 300.900000 658.556000 305.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 305.100000 658.556000 309.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 309.300000 658.556000 313.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 313.500000 658.556000 317.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 317.700000 658.556000 321.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 321.900000 658.556000 326.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 326.100000 658.556000 330.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 330.300000 658.556000 334.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 334.500000 658.556000 338.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 338.700000 658.556000 342.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 342.900000 658.556000 347.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 347.100000 658.556000 351.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 351.300000 658.556000 355.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 355.500000 658.556000 359.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 359.700000 658.556000 363.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 363.900000 658.556000 368.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 368.100000 658.556000 372.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 372.300000 658.556000 376.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 376.500000 658.556000 380.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.700000 658.556000 384.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.900000 658.556000 389.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.100000 658.556000 393.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.300000 658.556000 397.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.500000 658.556000 401.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.700000 658.556000 405.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.900000 658.556000 410.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.100000 658.556000 414.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.300000 658.556000 418.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.500000 658.556000 422.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.700000 658.556000 426.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.900000 658.556000 431.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.100000 658.556000 435.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.300000 658.556000 439.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.500000 658.556000 443.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.700000 658.556000 447.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.900000 658.556000 452.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 452.100000 658.556000 456.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 456.300000 658.556000 460.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.500000 658.556000 464.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.700000 658.556000 468.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.900000 658.556000 473.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.100000 658.556000 477.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.300000 658.556000 481.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.500000 658.556000 485.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.700000 658.556000 489.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.900000 658.556000 494.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.100000 658.556000 498.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.300000 658.556000 502.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 502.500000 658.556000 506.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.700000 658.556000 510.876000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 510.900000 658.556000 515.076000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.100000 658.556000 519.276000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.300000 658.556000 523.476000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.500000 658.556000 527.676000 646.556000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 531.800000 658.556000 540.140000 646.556000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 221.500000 641.356000 230.008000 629.356000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 229.996000 641.356000 234.544000 629.356000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 234.592000 641.356000 240.904000 629.356000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 240.892000 641.356000 247.636000 629.356000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 247.696000 641.356000 253.228000 629.356000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 253.192000 641.356000 257.368000 629.356000 1.000000 0.000000 0.000000 1.000000
+drawChar 257.392000 641.356000 265.900000 629.356000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 265.888000 641.356000 270.436000 629.356000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 270.484000 641.356000 278.476000 629.356000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 278.488000 641.356000 286.480000 629.356000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 286.492000 641.356000 292.804000 629.356000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 292.700000 641.356000 296.876000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 296.996000 641.356000 301.172000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 301.292000 641.356000 305.468000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 305.588000 641.356000 309.764000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 309.884000 641.356000 314.060000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 314.180000 641.356000 318.356000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 318.476000 641.356000 322.652000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 322.772000 641.356000 326.948000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 327.068000 641.356000 331.244000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 331.364000 641.356000 335.540000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 335.660000 641.356000 339.836000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 339.956000 641.356000 344.132000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 344.252000 641.356000 348.428000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.548000 641.356000 352.724000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 352.844000 641.356000 357.020000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 357.140000 641.356000 361.316000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 361.436000 641.356000 365.612000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.732000 641.356000 369.908000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.028000 641.356000 374.204000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.324000 641.356000 378.500000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.620000 641.356000 382.796000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.916000 641.356000 387.092000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.212000 641.356000 391.388000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.508000 641.356000 395.684000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.804000 641.356000 399.980000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.100000 641.356000 404.276000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.396000 641.356000 408.572000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.692000 641.356000 412.868000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.988000 641.356000 417.164000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.284000 641.356000 421.460000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.580000 641.356000 425.756000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.876000 641.356000 430.052000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.172000 641.356000 434.348000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.468000 641.356000 438.644000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.764000 641.356000 442.940000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.060000 641.356000 447.236000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.356000 641.356000 451.532000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.652000 641.356000 455.828000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.948000 641.356000 460.124000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.244000 641.356000 464.420000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.540000 641.356000 468.716000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.836000 641.356000 473.012000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.132000 641.356000 477.308000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.428000 641.356000 481.604000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.724000 641.356000 485.900000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.020000 641.356000 490.196000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.316000 641.356000 494.492000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.612000 641.356000 498.788000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.908000 641.356000 503.084000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.204000 641.356000 507.380000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.500000 641.356000 511.676000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.796000 641.356000 515.972000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.092000 641.356000 520.268000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.388000 641.356000 524.564000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.684000 641.356000 528.860000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 528.980000 641.356000 533.156000 629.356000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 531.800000 641.356000 540.140000 629.356000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 627.336000 229.468000 615.336000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 229.504000 627.336000 233.332000 615.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 233.308000 627.336000 240.076000 615.336000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 240.112000 627.336000 243.940000 615.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 243.916000 627.336000 251.644000 615.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 251.620000 627.336000 259.300000 615.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 259.324000 627.336000 263.128000 615.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 263.128000 627.336000 272.152000 615.336000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 272.128000 627.336000 279.352000 615.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 279.328000 627.336000 286.552000 615.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 286.528000 627.336000 297.904000 615.336000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 297.900000 627.336000 301.704000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 301.704000 627.336000 305.508000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 305.508000 627.336000 309.312000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 309.312000 627.336000 313.116000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 313.116000 627.336000 316.920000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 316.920000 627.336000 320.724000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 320.724000 627.336000 324.528000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 324.528000 627.336000 328.332000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 328.332000 627.336000 332.136000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.136000 627.336000 335.940000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 335.940000 627.336000 339.744000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 339.744000 627.336000 343.548000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 343.548000 627.336000 347.352000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 347.352000 627.336000 351.156000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 351.156000 627.336000 354.960000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 354.960000 627.336000 358.764000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.764000 627.336000 362.568000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.568000 627.336000 366.372000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.372000 627.336000 370.176000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.176000 627.336000 373.980000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 373.980000 627.336000 377.784000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.784000 627.336000 381.588000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.588000 627.336000 385.392000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.392000 627.336000 389.196000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.196000 627.336000 393.000000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.000000 627.336000 396.804000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.804000 627.336000 400.608000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.608000 627.336000 404.412000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.412000 627.336000 408.216000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.216000 627.336000 412.020000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.020000 627.336000 415.824000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.824000 627.336000 419.628000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.628000 627.336000 423.432000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.432000 627.336000 427.236000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.236000 627.336000 431.040000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.040000 627.336000 434.844000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.844000 627.336000 438.648000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.648000 627.336000 442.452000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.452000 627.336000 446.256000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.256000 627.336000 450.060000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.060000 627.336000 453.864000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.864000 627.336000 457.668000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.668000 627.336000 461.472000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.472000 627.336000 465.276000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.276000 627.336000 469.080000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.080000 627.336000 472.884000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.884000 627.336000 476.688000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.688000 627.336000 480.492000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.492000 627.336000 484.296000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.296000 627.336000 488.100000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.100000 627.336000 491.904000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 491.904000 627.336000 495.708000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.708000 627.336000 499.512000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.512000 627.336000 503.316000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.316000 627.336000 507.120000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.120000 627.336000 510.924000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 510.924000 627.336000 514.728000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.728000 627.336000 518.532000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 518.532000 627.336000 522.336000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 522.336000 627.336000 526.140000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 526.140000 627.336000 529.944000 615.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 532.500000 627.336000 540.132000 615.336000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 613.408000 229.123000 602.408000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 229.101000 613.408000 232.610000 602.408000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 232.599000 613.408000 237.857000 602.408000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 237.901000 613.408000 244.402000 602.408000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 244.402000 613.408000 251.442000 602.408000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 251.398000 613.408000 254.907000 602.408000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 254.896000 613.408000 261.452000 602.408000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 261.496000 613.408000 267.656000 602.408000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 267.700000 613.408000 274.201000 602.408000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 274.100000 613.408000 277.587000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.598000 613.408000 281.085000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.096000 613.408000 284.583000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 284.594000 613.408000 288.081000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 288.092000 613.408000 291.579000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 291.590000 613.408000 295.077000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 295.088000 613.408000 298.575000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 298.586000 613.408000 302.073000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 302.084000 613.408000 305.571000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 305.582000 613.408000 309.069000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 309.080000 613.408000 312.567000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 312.578000 613.408000 316.065000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 316.076000 613.408000 319.563000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 319.574000 613.408000 323.061000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 323.072000 613.408000 326.559000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 326.570000 613.408000 330.057000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 330.068000 613.408000 333.555000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 333.566000 613.408000 337.053000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 337.064000 613.408000 340.551000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 340.562000 613.408000 344.049000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 344.060000 613.408000 347.547000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 347.558000 613.408000 351.045000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 351.056000 613.408000 354.543000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 354.554000 613.408000 358.041000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.052000 613.408000 361.539000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 361.550000 613.408000 365.037000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.048000 613.408000 368.535000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 368.546000 613.408000 372.033000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 372.044000 613.408000 375.531000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.542000 613.408000 379.029000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.040000 613.408000 382.527000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.538000 613.408000 386.025000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.036000 613.408000 389.523000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.534000 613.408000 393.021000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.032000 613.408000 396.519000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.530000 613.408000 400.017000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.028000 613.408000 403.515000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 403.526000 613.408000 407.013000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.024000 613.408000 410.511000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.522000 613.408000 414.009000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.020000 613.408000 417.507000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.518000 613.408000 421.005000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.016000 613.408000 424.503000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.514000 613.408000 428.001000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.012000 613.408000 431.499000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.510000 613.408000 434.997000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.008000 613.408000 438.495000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.506000 613.408000 441.993000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.004000 613.408000 445.491000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.502000 613.408000 448.989000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.000000 613.408000 452.487000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 452.498000 613.408000 455.985000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.996000 613.408000 459.483000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.494000 613.408000 462.981000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.992000 613.408000 466.479000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.490000 613.408000 469.977000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.988000 613.408000 473.475000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.486000 613.408000 476.973000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.984000 613.408000 480.471000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.482000 613.408000 483.969000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 483.980000 613.408000 487.467000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 487.478000 613.408000 490.965000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.976000 613.408000 494.463000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.474000 613.408000 497.961000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.972000 613.408000 501.459000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.470000 613.408000 504.957000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.968000 613.408000 508.455000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.466000 613.408000 511.953000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.964000 613.408000 515.451000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.462000 613.408000 518.949000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 518.960000 613.408000 522.447000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 522.458000 613.408000 525.945000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 525.956000 613.408000 529.443000 602.408000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 533.100000 613.408000 540.096000 602.408000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 600.608000 229.574000 589.608000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 229.596000 600.608000 236.218000 589.608000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 236.196000 600.608000 242.818000 589.608000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 242.796000 600.608000 249.451000 589.608000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 249.495000 600.608000 255.655000 589.608000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 255.699000 600.608000 262.255000 589.608000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 262.299000 600.608000 267.942000 589.608000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 267.898000 600.608000 274.399000 589.608000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 274.300000 600.608000 277.787000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.798000 600.608000 281.285000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.296000 600.608000 284.783000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 284.794000 600.608000 288.281000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 288.292000 600.608000 291.779000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 291.790000 600.608000 295.277000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 295.288000 600.608000 298.775000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 298.786000 600.608000 302.273000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 302.284000 600.608000 305.771000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 305.782000 600.608000 309.269000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 309.280000 600.608000 312.767000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 312.778000 600.608000 316.265000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 316.276000 600.608000 319.763000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 319.774000 600.608000 323.261000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 323.272000 600.608000 326.759000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 326.770000 600.608000 330.257000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 330.268000 600.608000 333.755000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 333.766000 600.608000 337.253000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 337.264000 600.608000 340.751000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 340.762000 600.608000 344.249000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 344.260000 600.608000 347.747000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 347.758000 600.608000 351.245000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 351.256000 600.608000 354.743000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 354.754000 600.608000 358.241000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.252000 600.608000 361.739000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 361.750000 600.608000 365.237000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.248000 600.608000 368.735000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 368.746000 600.608000 372.233000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 372.244000 600.608000 375.731000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.742000 600.608000 379.229000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.240000 600.608000 382.727000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.738000 600.608000 386.225000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.236000 600.608000 389.723000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.734000 600.608000 393.221000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.232000 600.608000 396.719000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.730000 600.608000 400.217000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.228000 600.608000 403.715000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 403.726000 600.608000 407.213000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.224000 600.608000 410.711000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.722000 600.608000 414.209000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.220000 600.608000 417.707000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.718000 600.608000 421.205000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.216000 600.608000 424.703000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.714000 600.608000 428.201000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.212000 600.608000 431.699000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.710000 600.608000 435.197000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.208000 600.608000 438.695000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.706000 600.608000 442.193000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.204000 600.608000 445.691000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.702000 600.608000 449.189000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.200000 600.608000 452.687000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 452.698000 600.608000 456.185000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 456.196000 600.608000 459.683000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.694000 600.608000 463.181000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.192000 600.608000 466.679000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.690000 600.608000 470.177000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.188000 600.608000 473.675000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.686000 600.608000 477.173000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.184000 600.608000 480.671000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.682000 600.608000 484.169000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.180000 600.608000 487.667000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 487.678000 600.608000 491.165000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 491.176000 600.608000 494.663000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.674000 600.608000 498.161000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.172000 600.608000 501.659000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.670000 600.608000 505.157000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.168000 600.608000 508.655000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.666000 600.608000 512.153000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.164000 600.608000 515.651000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.662000 600.608000 519.149000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.160000 600.608000 522.647000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 522.658000 600.608000 526.145000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 526.156000 600.608000 529.643000 589.608000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 533.100000 600.608000 540.096000 589.608000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 587.808000 232.753000 576.808000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 232.797000 587.808000 236.306000 576.808000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 236.295000 587.808000 243.379000 576.808000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 243.390000 587.808000 246.899000 576.808000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 246.888000 587.808000 253.928000 576.808000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 253.884000 587.808000 260.440000 576.808000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 260.484000 587.808000 265.742000 576.808000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 265.600000 587.808000 269.087000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.098000 587.808000 272.585000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.596000 587.808000 276.083000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.094000 587.808000 279.581000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.592000 587.808000 283.079000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 283.090000 587.808000 286.577000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 286.588000 587.808000 290.075000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 290.086000 587.808000 293.573000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 293.584000 587.808000 297.071000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 297.082000 587.808000 300.569000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 300.580000 587.808000 304.067000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 304.078000 587.808000 307.565000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 307.576000 587.808000 311.063000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 311.074000 587.808000 314.561000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 314.572000 587.808000 318.059000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 318.070000 587.808000 321.557000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 321.568000 587.808000 325.055000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 325.066000 587.808000 328.553000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 328.564000 587.808000 332.051000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.062000 587.808000 335.549000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 335.560000 587.808000 339.047000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 339.058000 587.808000 342.545000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 342.556000 587.808000 346.043000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 346.054000 587.808000 349.541000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 349.552000 587.808000 353.039000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.050000 587.808000 356.537000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 356.548000 587.808000 360.035000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 360.046000 587.808000 363.533000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 363.544000 587.808000 367.031000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.042000 587.808000 370.529000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.540000 587.808000 374.027000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.038000 587.808000 377.525000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.536000 587.808000 381.023000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.034000 587.808000 384.521000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.532000 587.808000 388.019000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.030000 587.808000 391.517000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.528000 587.808000 395.015000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.026000 587.808000 398.513000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.524000 587.808000 402.011000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.022000 587.808000 405.509000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.520000 587.808000 409.007000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.018000 587.808000 412.505000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.516000 587.808000 416.003000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.014000 587.808000 419.501000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.512000 587.808000 422.999000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.010000 587.808000 426.497000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.508000 587.808000 429.995000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.006000 587.808000 433.493000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.504000 587.808000 436.991000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.002000 587.808000 440.489000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.500000 587.808000 443.987000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.998000 587.808000 447.485000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.496000 587.808000 450.983000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.994000 587.808000 454.481000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.492000 587.808000 457.979000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.990000 587.808000 461.477000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.488000 587.808000 464.975000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.986000 587.808000 468.473000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.484000 587.808000 471.971000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.982000 587.808000 475.469000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 475.480000 587.808000 478.967000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.978000 587.808000 482.465000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.476000 587.808000 485.963000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.974000 587.808000 489.461000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.472000 587.808000 492.959000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.970000 587.808000 496.457000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.468000 587.808000 499.955000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.966000 587.808000 503.453000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.464000 587.808000 506.951000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.962000 587.808000 510.449000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 510.460000 587.808000 513.947000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.958000 587.808000 517.445000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.456000 587.808000 520.943000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.954000 587.808000 524.441000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.452000 587.808000 527.939000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 527.950000 587.808000 531.437000 576.808000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 533.100000 587.808000 540.096000 576.808000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 575.036000 230.464000 563.036000 1.000000 0.000000 0.000000 1.000000 K
+drawChar 230.500000 575.036000 234.328000 563.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 234.304000 575.036000 239.116000 563.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 239.104000 575.036000 245.824000 563.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 245.800000 575.036000 253.528000 563.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 253.504000 575.036000 260.596000 563.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 260.608000 575.036000 268.336000 563.036000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 268.300000 575.036000 272.104000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.104000 575.036000 275.908000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.908000 575.036000 279.712000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.712000 575.036000 283.516000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 283.516000 575.036000 287.320000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 287.320000 575.036000 291.124000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 291.124000 575.036000 294.928000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 294.928000 575.036000 298.732000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 298.732000 575.036000 302.536000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 302.536000 575.036000 306.340000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 306.340000 575.036000 310.144000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 310.144000 575.036000 313.948000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 313.948000 575.036000 317.752000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 317.752000 575.036000 321.556000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 321.556000 575.036000 325.360000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 325.360000 575.036000 329.164000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 329.164000 575.036000 332.968000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.968000 575.036000 336.772000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 336.772000 575.036000 340.576000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 340.576000 575.036000 344.380000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 344.380000 575.036000 348.184000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.184000 575.036000 351.988000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 351.988000 575.036000 355.792000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 355.792000 575.036000 359.596000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 359.596000 575.036000 363.400000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 363.400000 575.036000 367.204000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.204000 575.036000 371.008000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.008000 575.036000 374.812000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.812000 575.036000 378.616000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.616000 575.036000 382.420000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.420000 575.036000 386.224000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.224000 575.036000 390.028000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.028000 575.036000 393.832000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.832000 575.036000 397.636000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.636000 575.036000 401.440000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.440000 575.036000 405.244000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.244000 575.036000 409.048000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.048000 575.036000 412.852000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.852000 575.036000 416.656000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.656000 575.036000 420.460000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.460000 575.036000 424.264000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.264000 575.036000 428.068000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.068000 575.036000 431.872000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.872000 575.036000 435.676000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.676000 575.036000 439.480000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.480000 575.036000 443.284000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.284000 575.036000 447.088000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.088000 575.036000 450.892000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.892000 575.036000 454.696000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.696000 575.036000 458.500000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.500000 575.036000 462.304000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.304000 575.036000 466.108000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.108000 575.036000 469.912000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.912000 575.036000 473.716000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.716000 575.036000 477.520000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.520000 575.036000 481.324000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.324000 575.036000 485.128000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.128000 575.036000 488.932000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.932000 575.036000 492.736000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.736000 575.036000 496.540000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.540000 575.036000 500.344000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.344000 575.036000 504.148000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.148000 575.036000 507.952000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.952000 575.036000 511.756000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.756000 575.036000 515.560000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.560000 575.036000 519.364000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.364000 575.036000 523.168000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.168000 575.036000 526.972000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 526.972000 575.036000 530.776000 563.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 532.500000 575.036000 540.132000 563.036000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 561.108000 228.892000 550.108000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 228.397000 561.108000 234.953000 550.108000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 234.997000 561.108000 242.081000 550.108000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 242.092000 561.108000 246.503000 550.108000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 246.492000 561.108000 251.750000 550.108000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 251.794000 561.108000 257.998000 550.108000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 257.800000 561.108000 261.287000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.298000 561.108000 264.785000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.796000 561.108000 268.283000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.294000 561.108000 271.781000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.792000 561.108000 275.279000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.290000 561.108000 278.777000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 278.788000 561.108000 282.275000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 282.286000 561.108000 285.773000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 285.784000 561.108000 289.271000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 289.282000 561.108000 292.769000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 292.780000 561.108000 296.267000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 296.278000 561.108000 299.765000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 299.776000 561.108000 303.263000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 303.274000 561.108000 306.761000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 306.772000 561.108000 310.259000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 310.270000 561.108000 313.757000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 313.768000 561.108000 317.255000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 317.266000 561.108000 320.753000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 320.764000 561.108000 324.251000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 324.262000 561.108000 327.749000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 327.760000 561.108000 331.247000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 331.258000 561.108000 334.745000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 334.756000 561.108000 338.243000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 338.254000 561.108000 341.741000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 341.752000 561.108000 345.239000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 345.250000 561.108000 348.737000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.748000 561.108000 352.235000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 352.246000 561.108000 355.733000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 355.744000 561.108000 359.231000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 359.242000 561.108000 362.729000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.740000 561.108000 366.227000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.238000 561.108000 369.725000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 369.736000 561.108000 373.223000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 373.234000 561.108000 376.721000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 376.732000 561.108000 380.219000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.230000 561.108000 383.717000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.728000 561.108000 387.215000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.226000 561.108000 390.713000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.724000 561.108000 394.211000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.222000 561.108000 397.709000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.720000 561.108000 401.207000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.218000 561.108000 404.705000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.716000 561.108000 408.203000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.214000 561.108000 411.701000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.712000 561.108000 415.199000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.210000 561.108000 418.697000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.708000 561.108000 422.195000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.206000 561.108000 425.693000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.704000 561.108000 429.191000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.202000 561.108000 432.689000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.700000 561.108000 436.187000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.198000 561.108000 439.685000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.696000 561.108000 443.183000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.194000 561.108000 446.681000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.692000 561.108000 450.179000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.190000 561.108000 453.677000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.688000 561.108000 457.175000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.186000 561.108000 460.673000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.684000 561.108000 464.171000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.182000 561.108000 467.669000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.680000 561.108000 471.167000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.178000 561.108000 474.665000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.676000 561.108000 478.163000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.174000 561.108000 481.661000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.672000 561.108000 485.159000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.170000 561.108000 488.657000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.668000 561.108000 492.155000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.166000 561.108000 495.653000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.664000 561.108000 499.151000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.162000 561.108000 502.649000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 502.660000 561.108000 506.147000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.158000 561.108000 509.645000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.656000 561.108000 513.143000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.154000 561.108000 516.641000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.652000 561.108000 520.139000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.150000 561.108000 523.637000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.648000 561.108000 527.135000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 527.146000 561.108000 530.633000 550.108000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 533.100000 561.108000 540.096000 550.108000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 548.308000 228.804000 537.308000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 228.804000 548.308000 235.360000 537.308000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 235.404000 548.308000 242.488000 537.308000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 242.499000 548.308000 249.583000 537.308000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 249.594000 548.308000 256.634000 537.308000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 256.590000 548.308000 261.848000 537.308000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 261.892000 548.308000 268.096000 537.308000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 268.096000 548.308000 271.583000 537.308000 1.000000 0.000000 0.000000 1.000000
+drawChar 271.594000 548.308000 279.866000 537.308000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 279.899000 548.308000 286.521000 537.308000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 286.499000 548.308000 293.121000 537.308000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 293.099000 548.308000 303.527000 537.308000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 303.400000 548.308000 306.887000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 306.898000 548.308000 310.385000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 310.396000 548.308000 313.883000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 313.894000 548.308000 317.381000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 317.392000 548.308000 320.879000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 320.890000 548.308000 324.377000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 324.388000 548.308000 327.875000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 327.886000 548.308000 331.373000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 331.384000 548.308000 334.871000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 334.882000 548.308000 338.369000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 338.380000 548.308000 341.867000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 341.878000 548.308000 345.365000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 345.376000 548.308000 348.863000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.874000 548.308000 352.361000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 352.372000 548.308000 355.859000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 355.870000 548.308000 359.357000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 359.368000 548.308000 362.855000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.866000 548.308000 366.353000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.364000 548.308000 369.851000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 369.862000 548.308000 373.349000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 373.360000 548.308000 376.847000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 376.858000 548.308000 380.345000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.356000 548.308000 383.843000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.854000 548.308000 387.341000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.352000 548.308000 390.839000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.850000 548.308000 394.337000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.348000 548.308000 397.835000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.846000 548.308000 401.333000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.344000 548.308000 404.831000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.842000 548.308000 408.329000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.340000 548.308000 411.827000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.838000 548.308000 415.325000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.336000 548.308000 418.823000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.834000 548.308000 422.321000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.332000 548.308000 425.819000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.830000 548.308000 429.317000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.328000 548.308000 432.815000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.826000 548.308000 436.313000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.324000 548.308000 439.811000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.822000 548.308000 443.309000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.320000 548.308000 446.807000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.818000 548.308000 450.305000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.316000 548.308000 453.803000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.814000 548.308000 457.301000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.312000 548.308000 460.799000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.810000 548.308000 464.297000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.308000 548.308000 467.795000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.806000 548.308000 471.293000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.304000 548.308000 474.791000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.802000 548.308000 478.289000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.300000 548.308000 481.787000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.798000 548.308000 485.285000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.296000 548.308000 488.783000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.794000 548.308000 492.281000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.292000 548.308000 495.779000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.790000 548.308000 499.277000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.288000 548.308000 502.775000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 502.786000 548.308000 506.273000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.284000 548.308000 509.771000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.782000 548.308000 513.269000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.280000 548.308000 516.767000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.778000 548.308000 520.265000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.276000 548.308000 523.763000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.774000 548.308000 527.261000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 527.272000 548.308000 530.759000 537.308000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 533.100000 548.308000 540.096000 537.308000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 535.536000 231.076000 523.536000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 231.100000 535.536000 238.828000 523.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 238.804000 535.536000 245.896000 523.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 245.908000 535.536000 252.064000 523.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 252.112000 535.536000 256.924000 523.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 256.912000 535.536000 260.716000 523.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 260.716000 535.536000 269.524000 523.536000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 269.512000 535.536000 276.664000 523.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 276.712000 535.536000 281.524000 523.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 281.512000 535.536000 289.240000 523.536000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 289.100000 535.536000 292.904000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 292.904000 535.536000 296.708000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 296.708000 535.536000 300.512000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 300.512000 535.536000 304.316000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 304.316000 535.536000 308.120000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 308.120000 535.536000 311.924000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 311.924000 535.536000 315.728000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 315.728000 535.536000 319.532000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 319.532000 535.536000 323.336000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 323.336000 535.536000 327.140000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 327.140000 535.536000 330.944000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 330.944000 535.536000 334.748000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 334.748000 535.536000 338.552000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 338.552000 535.536000 342.356000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 342.356000 535.536000 346.160000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 346.160000 535.536000 349.964000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 349.964000 535.536000 353.768000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.768000 535.536000 357.572000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 357.572000 535.536000 361.376000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 361.376000 535.536000 365.180000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.180000 535.536000 368.984000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 368.984000 535.536000 372.788000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 372.788000 535.536000 376.592000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 376.592000 535.536000 380.396000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.396000 535.536000 384.200000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.200000 535.536000 388.004000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.004000 535.536000 391.808000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.808000 535.536000 395.612000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.612000 535.536000 399.416000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.416000 535.536000 403.220000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 403.220000 535.536000 407.024000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.024000 535.536000 410.828000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.828000 535.536000 414.632000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.632000 535.536000 418.436000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.436000 535.536000 422.240000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.240000 535.536000 426.044000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.044000 535.536000 429.848000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.848000 535.536000 433.652000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.652000 535.536000 437.456000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.456000 535.536000 441.260000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.260000 535.536000 445.064000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.064000 535.536000 448.868000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 448.868000 535.536000 452.672000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 452.672000 535.536000 456.476000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 456.476000 535.536000 460.280000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.280000 535.536000 464.084000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.084000 535.536000 467.888000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.888000 535.536000 471.692000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.692000 535.536000 475.496000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 475.496000 535.536000 479.300000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 479.300000 535.536000 483.104000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 483.104000 535.536000 486.908000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.908000 535.536000 490.712000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.712000 535.536000 494.516000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.516000 535.536000 498.320000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.320000 535.536000 502.124000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 502.124000 535.536000 505.928000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.928000 535.536000 509.732000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.732000 535.536000 513.536000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.536000 535.536000 517.340000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.340000 535.536000 521.144000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.144000 535.536000 524.948000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.948000 535.536000 528.752000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 528.752000 535.536000 532.556000 523.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 532.500000 535.536000 540.132000 523.536000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 521.636000 231.112000 509.636000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 231.100000 521.636000 234.928000 509.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 234.904000 521.636000 242.632000 509.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 242.608000 521.636000 246.436000 509.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 246.412000 521.636000 254.140000 509.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 254.116000 521.636000 261.796000 509.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 261.820000 521.636000 265.624000 509.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 265.624000 521.636000 274.648000 509.636000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 274.624000 521.636000 281.848000 509.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 281.824000 521.636000 289.048000 509.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 289.024000 521.636000 300.400000 509.636000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 300.500000 521.636000 304.304000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 304.304000 521.636000 308.108000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 308.108000 521.636000 311.912000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 311.912000 521.636000 315.716000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 315.716000 521.636000 319.520000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 319.520000 521.636000 323.324000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 323.324000 521.636000 327.128000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 327.128000 521.636000 330.932000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 330.932000 521.636000 334.736000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 334.736000 521.636000 338.540000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 338.540000 521.636000 342.344000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 342.344000 521.636000 346.148000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 346.148000 521.636000 349.952000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 349.952000 521.636000 353.756000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.756000 521.636000 357.560000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 357.560000 521.636000 361.364000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 361.364000 521.636000 365.168000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.168000 521.636000 368.972000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 368.972000 521.636000 372.776000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 372.776000 521.636000 376.580000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 376.580000 521.636000 380.384000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.384000 521.636000 384.188000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.188000 521.636000 387.992000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.992000 521.636000 391.796000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.796000 521.636000 395.600000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.600000 521.636000 399.404000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.404000 521.636000 403.208000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 403.208000 521.636000 407.012000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.012000 521.636000 410.816000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.816000 521.636000 414.620000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.620000 521.636000 418.424000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.424000 521.636000 422.228000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.228000 521.636000 426.032000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.032000 521.636000 429.836000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.836000 521.636000 433.640000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.640000 521.636000 437.444000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.444000 521.636000 441.248000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.248000 521.636000 445.052000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.052000 521.636000 448.856000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 448.856000 521.636000 452.660000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 452.660000 521.636000 456.464000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 456.464000 521.636000 460.268000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.268000 521.636000 464.072000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.072000 521.636000 467.876000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.876000 521.636000 471.680000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.680000 521.636000 475.484000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 475.484000 521.636000 479.288000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 479.288000 521.636000 483.092000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 483.092000 521.636000 486.896000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.896000 521.636000 490.700000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.700000 521.636000 494.504000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.504000 521.636000 498.308000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.308000 521.636000 502.112000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 502.112000 521.636000 505.916000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.916000 521.636000 509.720000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.720000 521.636000 513.524000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.524000 521.636000 517.328000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.328000 521.636000 521.132000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.132000 521.636000 524.936000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.936000 521.636000 528.740000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 528.740000 521.636000 532.544000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 532.500000 521.636000 540.132000 509.636000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 221.500000 504.556000 230.164000 492.556000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 230.200000 504.556000 237.832000 492.556000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 237.796000 504.556000 245.092000 492.556000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 245.092000 504.556000 253.084000 492.556000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 253.096000 504.556000 261.820000 492.556000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 261.796000 504.556000 270.184000 492.556000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 270.196000 504.556000 274.372000 492.556000 1.000000 0.000000 0.000000 1.000000
+drawChar 274.396000 504.556000 282.904000 492.556000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 282.892000 504.556000 287.440000 492.556000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 287.488000 504.556000 295.480000 492.556000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 295.492000 504.556000 303.484000 492.556000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 303.496000 504.556000 309.808000 492.556000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 309.700000 504.556000 313.876000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 313.996000 504.556000 318.172000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 318.292000 504.556000 322.468000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 322.588000 504.556000 326.764000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 326.884000 504.556000 331.060000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 331.180000 504.556000 335.356000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 335.476000 504.556000 339.652000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 339.772000 504.556000 343.948000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 344.068000 504.556000 348.244000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.364000 504.556000 352.540000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 352.660000 504.556000 356.836000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 356.956000 504.556000 361.132000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 361.252000 504.556000 365.428000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.548000 504.556000 369.724000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 369.844000 504.556000 374.020000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.140000 504.556000 378.316000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.436000 504.556000 382.612000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.732000 504.556000 386.908000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.028000 504.556000 391.204000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.324000 504.556000 395.500000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.620000 504.556000 399.796000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.916000 504.556000 404.092000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.212000 504.556000 408.388000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.508000 504.556000 412.684000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.804000 504.556000 416.980000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.100000 504.556000 421.276000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.396000 504.556000 425.572000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.692000 504.556000 429.868000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.988000 504.556000 434.164000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.284000 504.556000 438.460000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.580000 504.556000 442.756000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.876000 504.556000 447.052000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.172000 504.556000 451.348000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.468000 504.556000 455.644000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.764000 504.556000 459.940000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.060000 504.556000 464.236000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.356000 504.556000 468.532000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.652000 504.556000 472.828000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.948000 504.556000 477.124000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.244000 504.556000 481.420000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.540000 504.556000 485.716000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.836000 504.556000 490.012000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.132000 504.556000 494.308000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.428000 504.556000 498.604000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.724000 504.556000 502.900000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.020000 504.556000 507.196000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.316000 504.556000 511.492000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.612000 504.556000 515.788000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.908000 504.556000 520.084000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.204000 504.556000 524.380000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.500000 504.556000 528.676000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 528.796000 504.556000 532.972000 492.556000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 531.800000 504.556000 540.140000 492.556000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 490.536000 229.720000 478.536000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 229.696000 490.536000 234.508000 478.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 234.496000 490.536000 242.224000 478.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 242.200000 490.536000 249.880000 478.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 249.904000 490.536000 256.672000 478.536000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 256.600000 490.536000 260.404000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.404000 490.536000 264.208000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.208000 490.536000 268.012000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.012000 490.536000 271.816000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.816000 490.536000 275.620000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.620000 490.536000 279.424000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.424000 490.536000 283.228000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 283.228000 490.536000 287.032000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 287.032000 490.536000 290.836000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 290.836000 490.536000 294.640000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 294.640000 490.536000 298.444000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 298.444000 490.536000 302.248000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 302.248000 490.536000 306.052000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 306.052000 490.536000 309.856000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 309.856000 490.536000 313.660000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 313.660000 490.536000 317.464000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 317.464000 490.536000 321.268000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 321.268000 490.536000 325.072000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 325.072000 490.536000 328.876000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 328.876000 490.536000 332.680000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.680000 490.536000 336.484000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 336.484000 490.536000 340.288000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 340.288000 490.536000 344.092000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 344.092000 490.536000 347.896000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 347.896000 490.536000 351.700000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 351.700000 490.536000 355.504000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 355.504000 490.536000 359.308000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 359.308000 490.536000 363.112000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 363.112000 490.536000 366.916000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.916000 490.536000 370.720000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.720000 490.536000 374.524000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.524000 490.536000 378.328000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.328000 490.536000 382.132000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.132000 490.536000 385.936000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.936000 490.536000 389.740000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.740000 490.536000 393.544000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.544000 490.536000 397.348000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.348000 490.536000 401.152000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.152000 490.536000 404.956000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.956000 490.536000 408.760000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.760000 490.536000 412.564000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.564000 490.536000 416.368000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.368000 490.536000 420.172000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.172000 490.536000 423.976000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.976000 490.536000 427.780000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.780000 490.536000 431.584000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.584000 490.536000 435.388000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.388000 490.536000 439.192000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.192000 490.536000 442.996000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.996000 490.536000 446.800000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.800000 490.536000 450.604000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.604000 490.536000 454.408000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.408000 490.536000 458.212000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.212000 490.536000 462.016000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.016000 490.536000 465.820000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.820000 490.536000 469.624000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.624000 490.536000 473.428000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.428000 490.536000 477.232000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.232000 490.536000 481.036000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.036000 490.536000 484.840000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.840000 490.536000 488.644000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.644000 490.536000 492.448000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.448000 490.536000 496.252000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.252000 490.536000 500.056000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.056000 490.536000 503.860000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.860000 490.536000 507.664000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.664000 490.536000 511.468000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.468000 490.536000 515.272000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.272000 490.536000 519.076000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.076000 490.536000 522.880000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 522.880000 490.536000 526.684000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 526.684000 490.536000 530.488000 478.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 532.500000 490.536000 540.132000 478.536000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 476.608000 232.797000 465.608000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 232.302000 476.608000 237.560000 465.608000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 237.604000 476.608000 241.113000 465.608000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 241.102000 476.608000 245.513000 465.608000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 245.502000 476.608000 249.011000 465.608000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 249.000000 476.608000 256.084000 465.608000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 256.095000 476.608000 263.135000 465.608000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 263.091000 476.608000 266.578000 465.608000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.589000 476.608000 275.400000 465.608000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 275.389000 476.608000 281.890000 465.608000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 281.890000 476.608000 287.533000 465.608000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 287.489000 476.608000 294.144000 465.608000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 294.200000 476.608000 297.687000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 297.698000 476.608000 301.185000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 301.196000 476.608000 304.683000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 304.694000 476.608000 308.181000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 308.192000 476.608000 311.679000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 311.690000 476.608000 315.177000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 315.188000 476.608000 318.675000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 318.686000 476.608000 322.173000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 322.184000 476.608000 325.671000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 325.682000 476.608000 329.169000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 329.180000 476.608000 332.667000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.678000 476.608000 336.165000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 336.176000 476.608000 339.663000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 339.674000 476.608000 343.161000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 343.172000 476.608000 346.659000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 346.670000 476.608000 350.157000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 350.168000 476.608000 353.655000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.666000 476.608000 357.153000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 357.164000 476.608000 360.651000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 360.662000 476.608000 364.149000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 364.160000 476.608000 367.647000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.658000 476.608000 371.145000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.156000 476.608000 374.643000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.654000 476.608000 378.141000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.152000 476.608000 381.639000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.650000 476.608000 385.137000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.148000 476.608000 388.635000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.646000 476.608000 392.133000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.144000 476.608000 395.631000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.642000 476.608000 399.129000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.140000 476.608000 402.627000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.638000 476.608000 406.125000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.136000 476.608000 409.623000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.634000 476.608000 413.121000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.132000 476.608000 416.619000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.630000 476.608000 420.117000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.128000 476.608000 423.615000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.626000 476.608000 427.113000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.124000 476.608000 430.611000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.622000 476.608000 434.109000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.120000 476.608000 437.607000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.618000 476.608000 441.105000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.116000 476.608000 444.603000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.614000 476.608000 448.101000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 448.112000 476.608000 451.599000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.610000 476.608000 455.097000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.108000 476.608000 458.595000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.606000 476.608000 462.093000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.104000 476.608000 465.591000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.602000 476.608000 469.089000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.100000 476.608000 472.587000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.598000 476.608000 476.085000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.096000 476.608000 479.583000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 479.594000 476.608000 483.081000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 483.092000 476.608000 486.579000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.590000 476.608000 490.077000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.088000 476.608000 493.575000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.586000 476.608000 497.073000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.084000 476.608000 500.571000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.582000 476.608000 504.069000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.080000 476.608000 507.567000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.578000 476.608000 511.065000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.076000 476.608000 514.563000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.574000 476.608000 518.061000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 518.072000 476.608000 521.559000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.570000 476.608000 525.057000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 525.068000 476.608000 528.555000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 528.566000 476.608000 532.053000 465.608000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 533.100000 476.608000 540.096000 465.608000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 463.836000 230.308000 451.836000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 230.296000 463.836000 237.388000 451.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 237.400000 463.836000 245.080000 451.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 245.104000 463.836000 250.840000 451.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 250.804000 463.836000 258.028000 451.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 258.004000 463.836000 265.228000 451.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 265.204000 463.836000 276.580000 451.836000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.600000 463.836000 280.404000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.404000 463.836000 284.208000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 284.208000 463.836000 288.012000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 288.012000 463.836000 291.816000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 291.816000 463.836000 295.620000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 295.620000 463.836000 299.424000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 299.424000 463.836000 303.228000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 303.228000 463.836000 307.032000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 307.032000 463.836000 310.836000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 310.836000 463.836000 314.640000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 314.640000 463.836000 318.444000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 318.444000 463.836000 322.248000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 322.248000 463.836000 326.052000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 326.052000 463.836000 329.856000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 329.856000 463.836000 333.660000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 333.660000 463.836000 337.464000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 337.464000 463.836000 341.268000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 341.268000 463.836000 345.072000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 345.072000 463.836000 348.876000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.876000 463.836000 352.680000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 352.680000 463.836000 356.484000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 356.484000 463.836000 360.288000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 360.288000 463.836000 364.092000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 364.092000 463.836000 367.896000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.896000 463.836000 371.700000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.700000 463.836000 375.504000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.504000 463.836000 379.308000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.308000 463.836000 383.112000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.112000 463.836000 386.916000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.916000 463.836000 390.720000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.720000 463.836000 394.524000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.524000 463.836000 398.328000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.328000 463.836000 402.132000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.132000 463.836000 405.936000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.936000 463.836000 409.740000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.740000 463.836000 413.544000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.544000 463.836000 417.348000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.348000 463.836000 421.152000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.152000 463.836000 424.956000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.956000 463.836000 428.760000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.760000 463.836000 432.564000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.564000 463.836000 436.368000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.368000 463.836000 440.172000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.172000 463.836000 443.976000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.976000 463.836000 447.780000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.780000 463.836000 451.584000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.584000 463.836000 455.388000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.388000 463.836000 459.192000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.192000 463.836000 462.996000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.996000 463.836000 466.800000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.800000 463.836000 470.604000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.604000 463.836000 474.408000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.408000 463.836000 478.212000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.212000 463.836000 482.016000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.016000 463.836000 485.820000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.820000 463.836000 489.624000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.624000 463.836000 493.428000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.428000 463.836000 497.232000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.232000 463.836000 501.036000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.036000 463.836000 504.840000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.840000 463.836000 508.644000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.644000 463.836000 512.448000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.448000 463.836000 516.252000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.252000 463.836000 520.056000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.056000 463.836000 523.860000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.860000 463.836000 527.664000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 527.664000 463.836000 531.468000 451.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 532.500000 463.836000 540.132000 451.836000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 449.908000 229.574000 438.908000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 229.596000 449.908000 236.097000 438.908000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.097000 449.908000 243.137000 438.908000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 243.000000 449.908000 246.487000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.498000 449.908000 249.985000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.996000 449.908000 253.483000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.494000 449.908000 256.981000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.992000 449.908000 260.479000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.490000 449.908000 263.977000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.988000 449.908000 267.475000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.486000 449.908000 270.973000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.984000 449.908000 274.471000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 274.482000 449.908000 277.969000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.980000 449.908000 281.467000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.478000 449.908000 284.965000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 284.976000 449.908000 288.463000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 288.474000 449.908000 291.961000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 291.972000 449.908000 295.459000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 295.470000 449.908000 298.957000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 298.968000 449.908000 302.455000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 302.466000 449.908000 305.953000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 305.964000 449.908000 309.451000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 309.462000 449.908000 312.949000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 312.960000 449.908000 316.447000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 316.458000 449.908000 319.945000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 319.956000 449.908000 323.443000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 323.454000 449.908000 326.941000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 326.952000 449.908000 330.439000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 330.450000 449.908000 333.937000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 333.948000 449.908000 337.435000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 337.446000 449.908000 340.933000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 340.944000 449.908000 344.431000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 344.442000 449.908000 347.929000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 347.940000 449.908000 351.427000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 351.438000 449.908000 354.925000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 354.936000 449.908000 358.423000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.434000 449.908000 361.921000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 361.932000 449.908000 365.419000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.430000 449.908000 368.917000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 368.928000 449.908000 372.415000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 372.426000 449.908000 375.913000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.924000 449.908000 379.411000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.422000 449.908000 382.909000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.920000 449.908000 386.407000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.418000 449.908000 389.905000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.916000 449.908000 393.403000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.414000 449.908000 396.901000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.912000 449.908000 400.399000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.410000 449.908000 403.897000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 403.908000 449.908000 407.395000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.406000 449.908000 410.893000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.904000 449.908000 414.391000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.402000 449.908000 417.889000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.900000 449.908000 421.387000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.398000 449.908000 424.885000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.896000 449.908000 428.383000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.394000 449.908000 431.881000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.892000 449.908000 435.379000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.390000 449.908000 438.877000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.888000 449.908000 442.375000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.386000 449.908000 445.873000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.884000 449.908000 449.371000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.382000 449.908000 452.869000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 452.880000 449.908000 456.367000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 456.378000 449.908000 459.865000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.876000 449.908000 463.363000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.374000 449.908000 466.861000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.872000 449.908000 470.359000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.370000 449.908000 473.857000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.868000 449.908000 477.355000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.366000 449.908000 480.853000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.864000 449.908000 484.351000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.362000 449.908000 487.849000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 487.860000 449.908000 491.347000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 491.358000 449.908000 494.845000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.856000 449.908000 498.343000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.354000 449.908000 501.841000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.852000 449.908000 505.339000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.350000 449.908000 508.837000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.848000 449.908000 512.335000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.346000 449.908000 515.833000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.844000 449.908000 519.331000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.342000 449.908000 522.829000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 522.840000 449.908000 526.327000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 526.338000 449.908000 529.825000 438.908000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 533.100000 449.908000 540.096000 438.908000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 437.108000 231.125000 426.108000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 231.103000 437.108000 234.612000 426.108000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 234.601000 437.108000 241.641000 426.108000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 241.597000 437.108000 248.681000 426.108000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 248.692000 437.108000 253.103000 426.108000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 253.092000 437.108000 256.579000 426.108000 1.000000 0.000000 0.000000 1.000000
+drawChar 256.590000 437.108000 264.125000 426.108000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 264.092000 437.108000 268.503000 426.108000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 268.492000 437.108000 275.048000 426.108000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 275.092000 437.108000 282.176000 426.108000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 282.187000 437.108000 289.227000 426.108000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 289.200000 437.108000 292.687000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 292.698000 437.108000 296.185000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 296.196000 437.108000 299.683000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 299.694000 437.108000 303.181000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 303.192000 437.108000 306.679000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 306.690000 437.108000 310.177000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 310.188000 437.108000 313.675000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 313.686000 437.108000 317.173000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 317.184000 437.108000 320.671000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 320.682000 437.108000 324.169000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 324.180000 437.108000 327.667000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 327.678000 437.108000 331.165000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 331.176000 437.108000 334.663000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 334.674000 437.108000 338.161000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 338.172000 437.108000 341.659000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 341.670000 437.108000 345.157000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 345.168000 437.108000 348.655000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.666000 437.108000 352.153000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 352.164000 437.108000 355.651000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 355.662000 437.108000 359.149000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 359.160000 437.108000 362.647000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.658000 437.108000 366.145000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.156000 437.108000 369.643000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 369.654000 437.108000 373.141000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 373.152000 437.108000 376.639000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 376.650000 437.108000 380.137000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.148000 437.108000 383.635000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.646000 437.108000 387.133000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.144000 437.108000 390.631000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.642000 437.108000 394.129000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.140000 437.108000 397.627000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.638000 437.108000 401.125000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.136000 437.108000 404.623000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.634000 437.108000 408.121000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.132000 437.108000 411.619000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.630000 437.108000 415.117000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.128000 437.108000 418.615000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.626000 437.108000 422.113000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.124000 437.108000 425.611000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.622000 437.108000 429.109000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.120000 437.108000 432.607000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.618000 437.108000 436.105000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.116000 437.108000 439.603000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.614000 437.108000 443.101000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.112000 437.108000 446.599000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.610000 437.108000 450.097000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.108000 437.108000 453.595000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.606000 437.108000 457.093000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.104000 437.108000 460.591000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.602000 437.108000 464.089000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.100000 437.108000 467.587000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.598000 437.108000 471.085000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.096000 437.108000 474.583000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.594000 437.108000 478.081000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.092000 437.108000 481.579000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.590000 437.108000 485.077000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.088000 437.108000 488.575000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.586000 437.108000 492.073000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.084000 437.108000 495.571000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.582000 437.108000 499.069000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.080000 437.108000 502.567000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 502.578000 437.108000 506.065000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.076000 437.108000 509.563000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.574000 437.108000 513.061000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.072000 437.108000 516.559000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.570000 437.108000 520.057000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.068000 437.108000 523.555000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.566000 437.108000 527.053000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 527.064000 437.108000 530.551000 426.108000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 533.100000 437.108000 540.096000 426.108000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 424.308000 232.797000 413.308000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 231.895000 424.308000 238.451000 413.308000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 238.495000 424.308000 242.004000 413.308000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 241.993000 424.308000 248.648000 413.308000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 248.494000 424.308000 252.201000 413.308000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 252.190000 424.308000 255.699000 413.308000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 255.688000 424.308000 262.772000 413.308000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 262.783000 424.308000 266.270000 413.308000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.281000 424.308000 274.696000 413.308000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 274.685000 424.308000 278.194000 413.308000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 278.183000 424.308000 284.805000 413.308000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 284.783000 424.308000 290.426000 413.308000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 290.382000 424.308000 296.883000 413.308000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 296.883000 424.308000 301.294000 413.308000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 301.200000 424.308000 304.687000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 304.698000 424.308000 308.185000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 308.196000 424.308000 311.683000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 311.694000 424.308000 315.181000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 315.192000 424.308000 318.679000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 318.690000 424.308000 322.177000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 322.188000 424.308000 325.675000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 325.686000 424.308000 329.173000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 329.184000 424.308000 332.671000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.682000 424.308000 336.169000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 336.180000 424.308000 339.667000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 339.678000 424.308000 343.165000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 343.176000 424.308000 346.663000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 346.674000 424.308000 350.161000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 350.172000 424.308000 353.659000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.670000 424.308000 357.157000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 357.168000 424.308000 360.655000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 360.666000 424.308000 364.153000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 364.164000 424.308000 367.651000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.662000 424.308000 371.149000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.160000 424.308000 374.647000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.658000 424.308000 378.145000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.156000 424.308000 381.643000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.654000 424.308000 385.141000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.152000 424.308000 388.639000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.650000 424.308000 392.137000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.148000 424.308000 395.635000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.646000 424.308000 399.133000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.144000 424.308000 402.631000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.642000 424.308000 406.129000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.140000 424.308000 409.627000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.638000 424.308000 413.125000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.136000 424.308000 416.623000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.634000 424.308000 420.121000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.132000 424.308000 423.619000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.630000 424.308000 427.117000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.128000 424.308000 430.615000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.626000 424.308000 434.113000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.124000 424.308000 437.611000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.622000 424.308000 441.109000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.120000 424.308000 444.607000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.618000 424.308000 448.105000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 448.116000 424.308000 451.603000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.614000 424.308000 455.101000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.112000 424.308000 458.599000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.610000 424.308000 462.097000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.108000 424.308000 465.595000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.606000 424.308000 469.093000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.104000 424.308000 472.591000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.602000 424.308000 476.089000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.100000 424.308000 479.587000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 479.598000 424.308000 483.085000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 483.096000 424.308000 486.583000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.594000 424.308000 490.081000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.092000 424.308000 493.579000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.590000 424.308000 497.077000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.088000 424.308000 500.575000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.586000 424.308000 504.073000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.084000 424.308000 507.571000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.582000 424.308000 511.069000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.080000 424.308000 514.567000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.578000 424.308000 518.065000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 518.076000 424.308000 521.563000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.574000 424.308000 525.061000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 525.072000 424.308000 528.559000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 528.570000 424.308000 532.057000 413.308000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 533.100000 424.308000 540.096000 413.308000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 411.536000 233.776000 399.536000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 233.800000 411.536000 240.952000 399.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 241.000000 411.536000 247.156000 399.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 247.204000 411.536000 252.016000 399.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 252.004000 411.536000 259.096000 399.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 259.108000 411.536000 264.844000 399.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 264.808000 411.536000 268.612000 399.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 268.612000 411.536000 277.420000 399.536000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 277.408000 411.536000 284.560000 399.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 284.608000 411.536000 289.420000 399.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 289.408000 411.536000 297.136000 399.536000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 297.000000 411.536000 300.804000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 300.900000 411.536000 304.704000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 304.800000 411.536000 308.604000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 308.700000 411.536000 312.504000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 312.600000 411.536000 316.404000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 316.500000 411.536000 320.304000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 320.400000 411.536000 324.204000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 324.300000 411.536000 328.104000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 328.200000 411.536000 332.004000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.100000 411.536000 335.904000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 336.000000 411.536000 339.804000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 339.900000 411.536000 343.704000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 343.800000 411.536000 347.604000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 347.700000 411.536000 351.504000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 351.600000 411.536000 355.404000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 355.500000 411.536000 359.304000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 359.400000 411.536000 363.204000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 363.300000 411.536000 367.104000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.200000 411.536000 371.004000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.100000 411.536000 374.904000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.000000 411.536000 378.804000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.900000 411.536000 382.704000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.800000 411.536000 386.604000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.700000 411.536000 390.504000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.600000 411.536000 394.404000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.500000 411.536000 398.304000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.400000 411.536000 402.204000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.300000 411.536000 406.104000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.200000 411.536000 410.004000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.100000 411.536000 413.904000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.000000 411.536000 417.804000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.900000 411.536000 421.704000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.800000 411.536000 425.604000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.700000 411.536000 429.504000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.600000 411.536000 433.404000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.500000 411.536000 437.304000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.400000 411.536000 441.204000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.300000 411.536000 445.104000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.200000 411.536000 449.004000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.100000 411.536000 452.904000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.000000 411.536000 456.804000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 456.900000 411.536000 460.704000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.800000 411.536000 464.604000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.700000 411.536000 468.504000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.600000 411.536000 472.404000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.500000 411.536000 476.304000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.400000 411.536000 480.204000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.300000 411.536000 484.104000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.200000 411.536000 488.004000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.100000 411.536000 491.904000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.000000 411.536000 495.804000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.900000 411.536000 499.704000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.800000 411.536000 503.604000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.700000 411.536000 507.504000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.600000 411.536000 511.404000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.500000 411.536000 515.304000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.400000 411.536000 519.204000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.300000 411.536000 523.104000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.200000 411.536000 527.004000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 527.100000 411.536000 530.904000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 531.000000 411.536000 534.804000 399.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 532.500000 411.536000 540.132000 399.536000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 397.608000 229.574000 386.608000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 229.596000 397.608000 236.152000 386.608000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 236.196000 397.608000 240.607000 386.608000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 240.596000 397.608000 247.680000 386.608000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 247.691000 397.608000 252.102000 386.608000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 252.091000 397.608000 259.175000 386.608000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 259.186000 397.608000 266.226000 386.608000 1.000000 0.000000 0.000000 1.000000 b
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 266.100000 397.608000 269.587000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.598000 397.608000 273.085000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.096000 397.608000 276.583000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.594000 397.608000 280.081000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.092000 397.608000 283.579000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 283.590000 397.608000 287.077000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 287.088000 397.608000 290.575000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 290.586000 397.608000 294.073000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 294.084000 397.608000 297.571000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 297.582000 397.608000 301.069000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 301.080000 397.608000 304.567000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 304.578000 397.608000 308.065000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 308.076000 397.608000 311.563000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 311.574000 397.608000 315.061000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 315.072000 397.608000 318.559000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 318.570000 397.608000 322.057000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 322.068000 397.608000 325.555000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 325.566000 397.608000 329.053000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 329.064000 397.608000 332.551000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.562000 397.608000 336.049000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 336.060000 397.608000 339.547000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 339.558000 397.608000 343.045000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 343.056000 397.608000 346.543000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 346.554000 397.608000 350.041000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 350.052000 397.608000 353.539000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.550000 397.608000 357.037000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 357.048000 397.608000 360.535000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 360.546000 397.608000 364.033000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 364.044000 397.608000 367.531000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.542000 397.608000 371.029000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.040000 397.608000 374.527000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.538000 397.608000 378.025000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.036000 397.608000 381.523000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.534000 397.608000 385.021000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.032000 397.608000 388.519000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.530000 397.608000 392.017000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.028000 397.608000 395.515000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.526000 397.608000 399.013000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.024000 397.608000 402.511000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.522000 397.608000 406.009000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.020000 397.608000 409.507000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.518000 397.608000 413.005000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.016000 397.608000 416.503000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.514000 397.608000 420.001000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.012000 397.608000 423.499000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.510000 397.608000 426.997000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.008000 397.608000 430.495000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.506000 397.608000 433.993000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.004000 397.608000 437.491000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.502000 397.608000 440.989000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.000000 397.608000 444.487000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.498000 397.608000 447.985000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.996000 397.608000 451.483000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.494000 397.608000 454.981000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.992000 397.608000 458.479000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.490000 397.608000 461.977000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.988000 397.608000 465.475000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.486000 397.608000 468.973000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.984000 397.608000 472.471000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.482000 397.608000 475.969000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 475.980000 397.608000 479.467000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 479.478000 397.608000 482.965000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.976000 397.608000 486.463000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.474000 397.608000 489.961000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.972000 397.608000 493.459000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.470000 397.608000 496.957000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.968000 397.608000 500.455000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.466000 397.608000 503.953000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.964000 397.608000 507.451000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.462000 397.608000 510.949000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 510.960000 397.608000 514.447000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.458000 397.608000 517.945000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.956000 397.608000 521.443000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.454000 397.608000 524.941000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.952000 397.608000 528.439000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 528.450000 397.608000 531.937000 386.608000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 533.100000 397.608000 540.096000 386.608000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 384.808000 232.753000 373.808000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 232.797000 384.808000 236.306000 373.808000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 236.295000 384.808000 241.553000 373.808000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 241.597000 384.808000 246.855000 373.808000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 246.899000 384.808000 253.521000 373.808000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 253.499000 384.808000 258.757000 373.808000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 258.600000 384.808000 262.087000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.098000 384.808000 265.585000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.596000 384.808000 269.083000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.094000 384.808000 272.581000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.592000 384.808000 276.079000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.090000 384.808000 279.577000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.588000 384.808000 283.075000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 283.086000 384.808000 286.573000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 286.584000 384.808000 290.071000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 290.082000 384.808000 293.569000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 293.580000 384.808000 297.067000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 297.078000 384.808000 300.565000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 300.576000 384.808000 304.063000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 304.074000 384.808000 307.561000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 307.572000 384.808000 311.059000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 311.070000 384.808000 314.557000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 314.568000 384.808000 318.055000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 318.066000 384.808000 321.553000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 321.564000 384.808000 325.051000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 325.062000 384.808000 328.549000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 328.560000 384.808000 332.047000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.058000 384.808000 335.545000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 335.556000 384.808000 339.043000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 339.054000 384.808000 342.541000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 342.552000 384.808000 346.039000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 346.050000 384.808000 349.537000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 349.548000 384.808000 353.035000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.046000 384.808000 356.533000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 356.544000 384.808000 360.031000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 360.042000 384.808000 363.529000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 363.540000 384.808000 367.027000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.038000 384.808000 370.525000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.536000 384.808000 374.023000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.034000 384.808000 377.521000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.532000 384.808000 381.019000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.030000 384.808000 384.517000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.528000 384.808000 388.015000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.026000 384.808000 391.513000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.524000 384.808000 395.011000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.022000 384.808000 398.509000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.520000 384.808000 402.007000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.018000 384.808000 405.505000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.516000 384.808000 409.003000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.014000 384.808000 412.501000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.512000 384.808000 415.999000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.010000 384.808000 419.497000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.508000 384.808000 422.995000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.006000 384.808000 426.493000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.504000 384.808000 429.991000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.002000 384.808000 433.489000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.500000 384.808000 436.987000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.998000 384.808000 440.485000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.496000 384.808000 443.983000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.994000 384.808000 447.481000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.492000 384.808000 450.979000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.990000 384.808000 454.477000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.488000 384.808000 457.975000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.986000 384.808000 461.473000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.484000 384.808000 464.971000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.982000 384.808000 468.469000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.480000 384.808000 471.967000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.978000 384.808000 475.465000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 475.476000 384.808000 478.963000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.974000 384.808000 482.461000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.472000 384.808000 485.959000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.970000 384.808000 489.457000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.468000 384.808000 492.955000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.966000 384.808000 496.453000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.464000 384.808000 499.951000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.962000 384.808000 503.449000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.460000 384.808000 506.947000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.958000 384.808000 510.445000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 510.456000 384.808000 513.943000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.954000 384.808000 517.441000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.452000 384.808000 520.939000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.950000 384.808000 524.437000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.448000 384.808000 527.935000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 527.946000 384.808000 531.433000 373.808000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1100.000000 0 DAAAAA+DejaVuSerif
+drawChar 533.100000 384.808000 540.096000 373.808000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 372.036000 231.076000 360.036000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 231.100000 372.036000 238.252000 360.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 238.300000 372.036000 242.128000 360.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 242.104000 372.036000 245.932000 360.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 245.908000 372.036000 253.000000 360.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 253.012000 372.036000 258.748000 360.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 258.712000 372.036000 265.480000 360.036000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 265.400000 372.036000 269.204000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.204000 372.036000 273.008000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.008000 372.036000 276.812000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.812000 372.036000 280.616000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.616000 372.036000 284.420000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 284.420000 372.036000 288.224000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 288.224000 372.036000 292.028000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 292.028000 372.036000 295.832000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 295.832000 372.036000 299.636000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 299.636000 372.036000 303.440000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 303.440000 372.036000 307.244000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 307.244000 372.036000 311.048000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 311.048000 372.036000 314.852000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 314.852000 372.036000 318.656000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 318.656000 372.036000 322.460000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 322.460000 372.036000 326.264000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 326.264000 372.036000 330.068000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 330.068000 372.036000 333.872000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 333.872000 372.036000 337.676000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 337.676000 372.036000 341.480000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 341.480000 372.036000 345.284000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 345.284000 372.036000 349.088000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 349.088000 372.036000 352.892000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 352.892000 372.036000 356.696000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 356.696000 372.036000 360.500000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 360.500000 372.036000 364.304000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 364.304000 372.036000 368.108000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 368.108000 372.036000 371.912000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.912000 372.036000 375.716000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.716000 372.036000 379.520000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.520000 372.036000 383.324000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.324000 372.036000 387.128000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.128000 372.036000 390.932000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.932000 372.036000 394.736000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.736000 372.036000 398.540000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.540000 372.036000 402.344000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.344000 372.036000 406.148000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.148000 372.036000 409.952000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.952000 372.036000 413.756000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.756000 372.036000 417.560000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.560000 372.036000 421.364000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.364000 372.036000 425.168000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.168000 372.036000 428.972000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.972000 372.036000 432.776000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.776000 372.036000 436.580000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.580000 372.036000 440.384000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.384000 372.036000 444.188000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.188000 372.036000 447.992000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.992000 372.036000 451.796000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.796000 372.036000 455.600000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.600000 372.036000 459.404000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.404000 372.036000 463.208000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.208000 372.036000 467.012000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.012000 372.036000 470.816000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.816000 372.036000 474.620000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.620000 372.036000 478.424000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.424000 372.036000 482.228000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.228000 372.036000 486.032000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.032000 372.036000 489.836000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.836000 372.036000 493.640000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.640000 372.036000 497.444000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.444000 372.036000 501.248000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.248000 372.036000 505.052000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.052000 372.036000 508.856000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.856000 372.036000 512.660000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.660000 372.036000 516.464000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.464000 372.036000 520.268000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.268000 372.036000 524.072000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.072000 372.036000 527.876000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 527.876000 372.036000 531.680000 360.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 532.500000 372.036000 540.132000 360.036000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 221.500000 354.956000 230.800000 342.956000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 230.596000 354.956000 236.128000 342.956000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 236.092000 354.956000 241.624000 342.956000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 241.588000 354.956000 246.136000 342.956000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 246.184000 354.956000 253.480000 342.956000 1.000000 0.000000 0.000000 1.000000 c
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 253.500000 354.956000 257.676000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.700000 354.956000 261.876000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.900000 354.956000 266.076000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.100000 354.956000 270.276000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.300000 354.956000 274.476000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 274.500000 354.956000 278.676000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 278.700000 354.956000 282.876000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 282.900000 354.956000 287.076000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 287.100000 354.956000 291.276000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 291.300000 354.956000 295.476000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 295.500000 354.956000 299.676000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 299.700000 354.956000 303.876000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 303.900000 354.956000 308.076000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 308.100000 354.956000 312.276000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 312.300000 354.956000 316.476000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 316.500000 354.956000 320.676000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 320.700000 354.956000 324.876000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 324.900000 354.956000 329.076000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 329.100000 354.956000 333.276000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 333.300000 354.956000 337.476000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 337.500000 354.956000 341.676000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 341.700000 354.956000 345.876000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 345.900000 354.956000 350.076000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 350.100000 354.956000 354.276000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 354.300000 354.956000 358.476000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.500000 354.956000 362.676000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.700000 354.956000 366.876000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.900000 354.956000 371.076000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.100000 354.956000 375.276000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.300000 354.956000 379.476000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.500000 354.956000 383.676000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.700000 354.956000 387.876000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.900000 354.956000 392.076000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.100000 354.956000 396.276000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.300000 354.956000 400.476000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.500000 354.956000 404.676000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.700000 354.956000 408.876000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.900000 354.956000 413.076000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.100000 354.956000 417.276000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.300000 354.956000 421.476000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.500000 354.956000 425.676000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.700000 354.956000 429.876000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.900000 354.956000 434.076000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.100000 354.956000 438.276000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.300000 354.956000 442.476000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.500000 354.956000 446.676000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.700000 354.956000 450.876000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.900000 354.956000 455.076000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.100000 354.956000 459.276000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.300000 354.956000 463.476000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.500000 354.956000 467.676000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.700000 354.956000 471.876000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.900000 354.956000 476.076000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.100000 354.956000 480.276000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.300000 354.956000 484.476000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.500000 354.956000 488.676000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.700000 354.956000 492.876000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.900000 354.956000 497.076000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.100000 354.956000 501.276000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.300000 354.956000 505.476000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.500000 354.956000 509.676000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.700000 354.956000 513.876000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.900000 354.956000 518.076000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 518.100000 354.956000 522.276000 342.956000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 523.400000 354.956000 531.740000 342.956000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 531.704000 354.956000 540.044000 342.956000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 108.100000 330.356000 121.372000 318.356000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 121.396000 330.356000 128.368000 318.356000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 128.392000 330.356000 132.568000 318.356000 1.000000 0.000000 0.000000 1.000000
+drawChar 132.592000 330.356000 142.840000 318.356000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 142.792000 330.356000 150.556000 318.356000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.592000 330.356000 156.904000 318.356000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 156.892000 330.356000 165.280000 318.356000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 165.292000 330.356000 172.924000 318.356000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 172.888000 330.356000 181.612000 318.356000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 181.500000 330.356000 185.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.700000 330.356000 189.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 189.900000 330.356000 194.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 194.100000 330.356000 198.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.300000 330.356000 202.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.500000 330.356000 206.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.700000 330.356000 210.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.900000 330.356000 215.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.100000 330.356000 219.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.300000 330.356000 223.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.500000 330.356000 227.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.700000 330.356000 231.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.900000 330.356000 236.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 236.100000 330.356000 240.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.300000 330.356000 244.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.500000 330.356000 248.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.700000 330.356000 252.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.900000 330.356000 257.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.100000 330.356000 261.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.300000 330.356000 265.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.500000 330.356000 269.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.700000 330.356000 273.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.900000 330.356000 278.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 278.100000 330.356000 282.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 282.300000 330.356000 286.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 286.500000 330.356000 290.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 290.700000 330.356000 294.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 294.900000 330.356000 299.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 299.100000 330.356000 303.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 303.300000 330.356000 307.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 307.500000 330.356000 311.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 311.700000 330.356000 315.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 315.900000 330.356000 320.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 320.100000 330.356000 324.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 324.300000 330.356000 328.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 328.500000 330.356000 332.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.700000 330.356000 336.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 336.900000 330.356000 341.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 341.100000 330.356000 345.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 345.300000 330.356000 349.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 349.500000 330.356000 353.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.700000 330.356000 357.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 357.900000 330.356000 362.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.100000 330.356000 366.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.300000 330.356000 370.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.500000 330.356000 374.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.700000 330.356000 378.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.900000 330.356000 383.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.100000 330.356000 387.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.300000 330.356000 391.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.500000 330.356000 395.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.700000 330.356000 399.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.900000 330.356000 404.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.100000 330.356000 408.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.300000 330.356000 412.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.500000 330.356000 416.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.700000 330.356000 420.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.900000 330.356000 425.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.100000 330.356000 429.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.300000 330.356000 433.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.500000 330.356000 437.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.700000 330.356000 441.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.900000 330.356000 446.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.100000 330.356000 450.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.300000 330.356000 454.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.500000 330.356000 458.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.700000 330.356000 462.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.900000 330.356000 467.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.100000 330.356000 471.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.300000 330.356000 475.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 475.500000 330.356000 479.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 479.700000 330.356000 483.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 483.900000 330.356000 488.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.100000 330.356000 492.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.300000 330.356000 496.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.500000 330.356000 500.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.700000 330.356000 504.876000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.900000 330.356000 509.076000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.100000 330.356000 513.276000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.300000 330.356000 517.476000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.500000 330.356000 521.676000 318.356000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 523.400000 330.356000 531.740000 318.356000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 531.704000 330.356000 540.044000 318.356000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 221.500000 313.156000 232.828000 301.156000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 232.804000 313.156000 240.436000 301.156000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 240.400000 313.156000 246.712000 301.156000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 246.700000 313.156000 255.088000 301.156000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 255.100000 313.156000 259.276000 301.156000 1.000000 0.000000 0.000000 1.000000
+drawChar 259.300000 313.156000 267.688000 301.156000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 267.700000 313.156000 275.464000 301.156000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 275.500000 313.156000 281.812000 301.156000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 281.800000 313.156000 290.188000 301.156000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 290.200000 313.156000 297.832000 301.156000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 297.796000 313.156000 306.520000 301.156000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 306.500000 313.156000 310.676000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 310.796000 313.156000 314.972000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 315.092000 313.156000 319.268000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 319.388000 313.156000 323.564000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 323.684000 313.156000 327.860000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 327.980000 313.156000 332.156000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.276000 313.156000 336.452000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 336.572000 313.156000 340.748000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 340.868000 313.156000 345.044000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 345.164000 313.156000 349.340000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 349.460000 313.156000 353.636000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.756000 313.156000 357.932000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.052000 313.156000 362.228000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.348000 313.156000 366.524000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.644000 313.156000 370.820000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.940000 313.156000 375.116000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.236000 313.156000 379.412000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.532000 313.156000 383.708000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.828000 313.156000 388.004000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.124000 313.156000 392.300000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.420000 313.156000 396.596000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.716000 313.156000 400.892000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.012000 313.156000 405.188000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.308000 313.156000 409.484000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.604000 313.156000 413.780000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.900000 313.156000 418.076000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.196000 313.156000 422.372000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.492000 313.156000 426.668000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.788000 313.156000 430.964000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.084000 313.156000 435.260000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.380000 313.156000 439.556000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.676000 313.156000 443.852000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.972000 313.156000 448.148000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 448.268000 313.156000 452.444000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 452.564000 313.156000 456.740000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 456.860000 313.156000 461.036000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.156000 313.156000 465.332000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.452000 313.156000 469.628000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.748000 313.156000 473.924000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.044000 313.156000 478.220000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.340000 313.156000 482.516000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.636000 313.156000 486.812000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.932000 313.156000 491.108000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 491.228000 313.156000 495.404000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.524000 313.156000 499.700000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.820000 313.156000 503.996000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.116000 313.156000 508.292000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.412000 313.156000 512.588000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.708000 313.156000 516.884000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.004000 313.156000 521.180000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.300000 313.156000 525.476000 301.156000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 523.400000 313.156000 531.740000 301.156000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 531.704000 313.156000 540.044000 301.156000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 221.500000 295.956000 230.800000 283.956000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 229.696000 295.956000 237.328000 283.956000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 237.292000 295.956000 245.680000 283.956000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 245.692000 295.956000 253.324000 283.956000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 253.288000 295.956000 258.820000 283.956000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 258.784000 295.956000 266.548000 283.956000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 266.584000 295.956000 274.972000 283.956000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 274.984000 295.956000 279.532000 283.956000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 279.580000 295.956000 287.212000 283.956000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 287.176000 295.956000 291.352000 283.956000 1.000000 0.000000 0.000000 1.000000
+drawChar 291.376000 295.956000 301.624000 283.956000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 301.576000 295.956000 309.340000 283.956000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 309.376000 295.956000 315.688000 283.956000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 315.676000 295.956000 324.064000 283.956000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 324.076000 295.956000 331.708000 283.956000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 331.672000 295.956000 340.396000 283.956000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 340.400000 295.956000 344.576000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 344.696000 295.956000 348.872000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.992000 295.956000 353.168000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.288000 295.956000 357.464000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 357.584000 295.956000 361.760000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 361.880000 295.956000 366.056000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.176000 295.956000 370.352000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.472000 295.956000 374.648000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.768000 295.956000 378.944000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.064000 295.956000 383.240000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.360000 295.956000 387.536000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.656000 295.956000 391.832000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.952000 295.956000 396.128000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.248000 295.956000 400.424000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.544000 295.956000 404.720000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.840000 295.956000 409.016000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.136000 295.956000 413.312000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.432000 295.956000 417.608000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.728000 295.956000 421.904000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.024000 295.956000 426.200000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.320000 295.956000 430.496000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.616000 295.956000 434.792000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.912000 295.956000 439.088000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.208000 295.956000 443.384000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.504000 295.956000 447.680000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.800000 295.956000 451.976000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 452.096000 295.956000 456.272000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 456.392000 295.956000 460.568000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.688000 295.956000 464.864000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.984000 295.956000 469.160000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.280000 295.956000 473.456000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.576000 295.956000 477.752000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.872000 295.956000 482.048000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.168000 295.956000 486.344000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.464000 295.956000 490.640000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.760000 295.956000 494.936000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.056000 295.956000 499.232000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.352000 295.956000 503.528000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.648000 295.956000 507.824000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.944000 295.956000 512.120000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.240000 295.956000 516.416000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.536000 295.956000 520.712000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.832000 295.956000 525.008000 283.956000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 523.400000 295.956000 531.740000 283.956000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 531.704000 295.956000 540.044000 283.956000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 221.500000 278.756000 230.008000 266.756000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 229.804000 278.756000 236.116000 266.756000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 236.104000 278.756000 244.828000 266.756000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 244.804000 278.756000 249.352000 266.756000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 249.400000 278.756000 254.932000 266.756000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 254.900000 278.756000 259.076000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 259.196000 278.756000 263.372000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.492000 278.756000 267.668000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.788000 278.756000 271.964000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.084000 278.756000 276.260000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.380000 278.756000 280.556000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.676000 278.756000 284.852000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 284.972000 278.756000 289.148000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 289.268000 278.756000 293.444000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 293.564000 278.756000 297.740000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 297.860000 278.756000 302.036000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 302.156000 278.756000 306.332000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 306.452000 278.756000 310.628000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 310.748000 278.756000 314.924000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 315.044000 278.756000 319.220000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 319.340000 278.756000 323.516000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 323.636000 278.756000 327.812000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 327.932000 278.756000 332.108000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.228000 278.756000 336.404000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 336.524000 278.756000 340.700000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 340.820000 278.756000 344.996000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 345.116000 278.756000 349.292000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 349.412000 278.756000 353.588000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.708000 278.756000 357.884000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.004000 278.756000 362.180000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.300000 278.756000 366.476000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.596000 278.756000 370.772000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.892000 278.756000 375.068000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.188000 278.756000 379.364000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.484000 278.756000 383.660000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.780000 278.756000 387.956000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.076000 278.756000 392.252000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.372000 278.756000 396.548000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.668000 278.756000 400.844000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.964000 278.756000 405.140000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.260000 278.756000 409.436000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.556000 278.756000 413.732000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.852000 278.756000 418.028000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.148000 278.756000 422.324000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.444000 278.756000 426.620000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.740000 278.756000 430.916000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.036000 278.756000 435.212000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.332000 278.756000 439.508000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.628000 278.756000 443.804000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.924000 278.756000 448.100000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 448.220000 278.756000 452.396000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 452.516000 278.756000 456.692000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 456.812000 278.756000 460.988000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.108000 278.756000 465.284000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.404000 278.756000 469.580000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.700000 278.756000 473.876000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.996000 278.756000 478.172000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.292000 278.756000 482.468000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.588000 278.756000 486.764000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.884000 278.756000 491.060000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 491.180000 278.756000 495.356000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.476000 278.756000 499.652000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.772000 278.756000 503.948000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.068000 278.756000 508.244000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.364000 278.756000 512.540000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.660000 278.756000 516.836000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.956000 278.756000 521.132000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.252000 278.756000 525.428000 266.756000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 523.400000 278.756000 531.740000 266.756000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 531.704000 278.756000 540.044000 266.756000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 221.500000 261.556000 225.676000 249.556000 1.000000 0.000000 0.000000 1.000000
+drawChar 225.700000 261.556000 234.628000 249.556000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 233.800000 261.556000 240.112000 249.556000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 240.100000 261.556000 247.732000 249.556000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 247.696000 261.556000 255.328000 249.556000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 255.292000 261.556000 262.036000 249.556000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 262.000000 261.556000 266.176000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.200000 261.556000 270.376000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.400000 261.556000 274.576000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 274.600000 261.556000 278.776000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 278.800000 261.556000 282.976000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 283.000000 261.556000 287.176000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 287.200000 261.556000 291.376000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 291.400000 261.556000 295.576000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 295.600000 261.556000 299.776000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 299.800000 261.556000 303.976000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 304.000000 261.556000 308.176000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 308.200000 261.556000 312.376000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 312.400000 261.556000 316.576000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 316.600000 261.556000 320.776000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 320.800000 261.556000 324.976000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 325.000000 261.556000 329.176000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 329.200000 261.556000 333.376000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 333.400000 261.556000 337.576000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 337.600000 261.556000 341.776000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 341.800000 261.556000 345.976000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 346.000000 261.556000 350.176000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 350.200000 261.556000 354.376000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 354.400000 261.556000 358.576000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.600000 261.556000 362.776000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.800000 261.556000 366.976000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.000000 261.556000 371.176000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.200000 261.556000 375.376000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.400000 261.556000 379.576000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.600000 261.556000 383.776000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.800000 261.556000 387.976000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.000000 261.556000 392.176000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.200000 261.556000 396.376000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.400000 261.556000 400.576000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.600000 261.556000 404.776000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.800000 261.556000 408.976000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.000000 261.556000 413.176000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.200000 261.556000 417.376000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.400000 261.556000 421.576000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.600000 261.556000 425.776000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.800000 261.556000 429.976000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.000000 261.556000 434.176000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.200000 261.556000 438.376000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.400000 261.556000 442.576000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.600000 261.556000 446.776000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.800000 261.556000 450.976000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.000000 261.556000 455.176000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.200000 261.556000 459.376000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.400000 261.556000 463.576000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.600000 261.556000 467.776000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.800000 261.556000 471.976000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.000000 261.556000 476.176000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.200000 261.556000 480.376000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.400000 261.556000 484.576000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.600000 261.556000 488.776000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.800000 261.556000 492.976000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.000000 261.556000 497.176000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.200000 261.556000 501.376000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.400000 261.556000 505.576000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.600000 261.556000 509.776000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.800000 261.556000 513.976000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.000000 261.556000 518.176000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 518.200000 261.556000 522.376000 249.556000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 523.400000 261.556000 531.740000 249.556000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 531.704000 261.556000 540.044000 249.556000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 221.500000 244.356000 231.748000 232.356000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 231.700000 244.356000 239.464000 232.356000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 239.500000 244.356000 245.812000 232.356000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 245.800000 244.356000 254.188000 232.356000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 254.200000 244.356000 261.832000 232.356000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 261.796000 244.356000 270.520000 232.356000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 270.496000 244.356000 274.672000 232.356000 1.000000 0.000000 0.000000 1.000000
+drawChar 274.696000 244.356000 283.360000 232.356000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 283.396000 244.356000 292.120000 232.356000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 292.096000 244.356000 299.728000 232.356000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 299.692000 244.356000 308.080000 232.356000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 308.100000 244.356000 312.276000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 312.300000 244.356000 316.476000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 316.500000 244.356000 320.676000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 320.700000 244.356000 324.876000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 324.900000 244.356000 329.076000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 329.100000 244.356000 333.276000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 333.300000 244.356000 337.476000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 337.500000 244.356000 341.676000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 341.700000 244.356000 345.876000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 345.900000 244.356000 350.076000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 350.100000 244.356000 354.276000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 354.300000 244.356000 358.476000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.500000 244.356000 362.676000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.700000 244.356000 366.876000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.900000 244.356000 371.076000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.100000 244.356000 375.276000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.300000 244.356000 379.476000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.500000 244.356000 383.676000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.700000 244.356000 387.876000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.900000 244.356000 392.076000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.100000 244.356000 396.276000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.300000 244.356000 400.476000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.500000 244.356000 404.676000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.700000 244.356000 408.876000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.900000 244.356000 413.076000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.100000 244.356000 417.276000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.300000 244.356000 421.476000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.500000 244.356000 425.676000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.700000 244.356000 429.876000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.900000 244.356000 434.076000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.100000 244.356000 438.276000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.300000 244.356000 442.476000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.500000 244.356000 446.676000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.700000 244.356000 450.876000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.900000 244.356000 455.076000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.100000 244.356000 459.276000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.300000 244.356000 463.476000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.500000 244.356000 467.676000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.700000 244.356000 471.876000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.900000 244.356000 476.076000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.100000 244.356000 480.276000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.300000 244.356000 484.476000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.500000 244.356000 488.676000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.700000 244.356000 492.876000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.900000 244.356000 497.076000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.100000 244.356000 501.276000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.300000 244.356000 505.476000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.500000 244.356000 509.676000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.700000 244.356000 513.876000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.900000 244.356000 518.076000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 518.100000 244.356000 522.276000 232.356000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 523.400000 244.356000 531.740000 232.356000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 531.704000 244.356000 540.044000 232.356000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 230.336000 229.492000 218.336000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 228.604000 230.336000 235.828000 218.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 235.804000 230.336000 243.028000 218.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 243.004000 230.336000 246.832000 218.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 246.808000 230.336000 252.964000 218.336000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 252.900000 230.336000 256.704000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.704000 230.336000 260.508000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.508000 230.336000 264.312000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.312000 230.336000 268.116000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.116000 230.336000 271.920000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.920000 230.336000 275.724000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.724000 230.336000 279.528000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.528000 230.336000 283.332000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 283.332000 230.336000 287.136000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 287.136000 230.336000 290.940000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 290.940000 230.336000 294.744000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 294.744000 230.336000 298.548000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 298.548000 230.336000 302.352000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 302.352000 230.336000 306.156000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 306.156000 230.336000 309.960000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 309.960000 230.336000 313.764000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 313.764000 230.336000 317.568000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 317.568000 230.336000 321.372000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 321.372000 230.336000 325.176000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 325.176000 230.336000 328.980000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 328.980000 230.336000 332.784000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.784000 230.336000 336.588000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 336.588000 230.336000 340.392000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 340.392000 230.336000 344.196000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 344.196000 230.336000 348.000000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.000000 230.336000 351.804000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 351.804000 230.336000 355.608000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 355.608000 230.336000 359.412000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 359.412000 230.336000 363.216000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 363.216000 230.336000 367.020000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.020000 230.336000 370.824000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.824000 230.336000 374.628000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.628000 230.336000 378.432000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.432000 230.336000 382.236000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.236000 230.336000 386.040000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.040000 230.336000 389.844000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.844000 230.336000 393.648000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.648000 230.336000 397.452000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.452000 230.336000 401.256000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.256000 230.336000 405.060000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.060000 230.336000 408.864000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.864000 230.336000 412.668000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.668000 230.336000 416.472000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.472000 230.336000 420.276000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.276000 230.336000 424.080000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.080000 230.336000 427.884000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.884000 230.336000 431.688000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.688000 230.336000 435.492000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.492000 230.336000 439.296000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.296000 230.336000 443.100000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.100000 230.336000 446.904000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.904000 230.336000 450.708000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.708000 230.336000 454.512000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.512000 230.336000 458.316000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.316000 230.336000 462.120000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.120000 230.336000 465.924000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.924000 230.336000 469.728000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.728000 230.336000 473.532000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.532000 230.336000 477.336000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.336000 230.336000 481.140000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.140000 230.336000 484.944000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.944000 230.336000 488.748000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.748000 230.336000 492.552000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.552000 230.336000 496.356000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.356000 230.336000 500.160000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.160000 230.336000 503.964000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.964000 230.336000 507.768000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.768000 230.336000 511.572000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.572000 230.336000 515.376000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.376000 230.336000 519.180000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.180000 230.336000 522.984000 218.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 524.800000 230.336000 532.432000 218.336000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 532.396000 230.336000 540.028000 218.336000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 216.436000 231.076000 204.436000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 231.100000 216.436000 238.252000 204.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 238.300000 216.436000 244.036000 204.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 244.000000 216.436000 251.680000 204.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 251.704000 216.436000 258.796000 204.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 258.808000 216.436000 266.536000 204.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 266.512000 216.436000 270.316000 204.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 270.316000 216.436000 278.308000 204.436000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 277.420000 216.436000 284.644000 204.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 284.620000 216.436000 291.844000 204.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 291.820000 216.436000 295.648000 204.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 295.624000 216.436000 301.780000 204.436000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 301.700000 216.436000 305.504000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 305.504000 216.436000 309.308000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 309.308000 216.436000 313.112000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 313.112000 216.436000 316.916000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 316.916000 216.436000 320.720000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 320.720000 216.436000 324.524000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 324.524000 216.436000 328.328000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 328.328000 216.436000 332.132000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.132000 216.436000 335.936000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 335.936000 216.436000 339.740000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 339.740000 216.436000 343.544000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 343.544000 216.436000 347.348000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 347.348000 216.436000 351.152000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 351.152000 216.436000 354.956000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 354.956000 216.436000 358.760000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.760000 216.436000 362.564000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.564000 216.436000 366.368000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.368000 216.436000 370.172000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.172000 216.436000 373.976000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 373.976000 216.436000 377.780000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.780000 216.436000 381.584000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.584000 216.436000 385.388000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.388000 216.436000 389.192000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.192000 216.436000 392.996000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.996000 216.436000 396.800000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.800000 216.436000 400.604000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.604000 216.436000 404.408000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.408000 216.436000 408.212000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.212000 216.436000 412.016000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.016000 216.436000 415.820000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.820000 216.436000 419.624000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.624000 216.436000 423.428000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.428000 216.436000 427.232000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.232000 216.436000 431.036000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.036000 216.436000 434.840000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.840000 216.436000 438.644000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.644000 216.436000 442.448000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.448000 216.436000 446.252000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.252000 216.436000 450.056000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.056000 216.436000 453.860000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.860000 216.436000 457.664000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.664000 216.436000 461.468000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.468000 216.436000 465.272000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.272000 216.436000 469.076000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.076000 216.436000 472.880000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.880000 216.436000 476.684000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.684000 216.436000 480.488000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.488000 216.436000 484.292000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.292000 216.436000 488.096000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.096000 216.436000 491.900000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 491.900000 216.436000 495.704000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.704000 216.436000 499.508000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.508000 216.436000 503.312000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.312000 216.436000 507.116000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.116000 216.436000 510.920000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 510.920000 216.436000 514.724000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.724000 216.436000 518.528000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 518.528000 216.436000 522.332000 204.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 524.800000 216.436000 532.432000 204.436000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 532.396000 216.436000 540.028000 204.436000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 221.500000 199.356000 231.748000 187.356000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 231.700000 199.356000 238.012000 187.356000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 238.000000 199.356000 245.632000 187.356000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 245.596000 199.356000 253.228000 187.356000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 253.192000 199.356000 261.916000 187.356000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 261.892000 199.356000 270.616000 187.356000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 270.592000 199.356000 278.584000 187.356000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 278.596000 199.356000 287.320000 187.356000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 287.296000 199.356000 294.040000 187.356000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 294.100000 199.356000 301.732000 187.356000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 301.800000 199.356000 305.976000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 306.096000 199.356000 310.272000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 310.392000 199.356000 314.568000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 314.688000 199.356000 318.864000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 318.984000 199.356000 323.160000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 323.280000 199.356000 327.456000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 327.576000 199.356000 331.752000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 331.872000 199.356000 336.048000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 336.168000 199.356000 340.344000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 340.464000 199.356000 344.640000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 344.760000 199.356000 348.936000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 349.056000 199.356000 353.232000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.352000 199.356000 357.528000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 357.648000 199.356000 361.824000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 361.944000 199.356000 366.120000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.240000 199.356000 370.416000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.536000 199.356000 374.712000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.832000 199.356000 379.008000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.128000 199.356000 383.304000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.424000 199.356000 387.600000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.720000 199.356000 391.896000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.016000 199.356000 396.192000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.312000 199.356000 400.488000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.608000 199.356000 404.784000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.904000 199.356000 409.080000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.200000 199.356000 413.376000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.496000 199.356000 417.672000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.792000 199.356000 421.968000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.088000 199.356000 426.264000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.384000 199.356000 430.560000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.680000 199.356000 434.856000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.976000 199.356000 439.152000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.272000 199.356000 443.448000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.568000 199.356000 447.744000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.864000 199.356000 452.040000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 452.160000 199.356000 456.336000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 456.456000 199.356000 460.632000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.752000 199.356000 464.928000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.048000 199.356000 469.224000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.344000 199.356000 473.520000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.640000 199.356000 477.816000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.936000 199.356000 482.112000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.232000 199.356000 486.408000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.528000 199.356000 490.704000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.824000 199.356000 495.000000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.120000 199.356000 499.296000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.416000 199.356000 503.592000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.712000 199.356000 507.888000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.008000 199.356000 512.184000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.304000 199.356000 516.480000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.600000 199.356000 520.776000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.896000 199.356000 525.072000 187.356000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 523.400000 199.356000 531.740000 187.356000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 531.704000 199.356000 540.044000 187.356000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 221.500000 182.156000 230.008000 170.156000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 229.996000 182.156000 234.544000 170.156000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 234.592000 182.156000 242.584000 170.156000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 242.596000 182.156000 252.916000 170.156000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 252.892000 182.156000 260.524000 170.156000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 260.488000 182.156000 266.800000 170.156000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 266.788000 182.156000 273.532000 170.156000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 273.500000 182.156000 277.676000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.700000 182.156000 281.876000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.900000 182.156000 286.076000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 286.100000 182.156000 290.276000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 290.300000 182.156000 294.476000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 294.500000 182.156000 298.676000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 298.700000 182.156000 302.876000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 302.900000 182.156000 307.076000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 307.100000 182.156000 311.276000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 311.300000 182.156000 315.476000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 315.500000 182.156000 319.676000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 319.700000 182.156000 323.876000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 323.900000 182.156000 328.076000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 328.100000 182.156000 332.276000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.300000 182.156000 336.476000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 336.500000 182.156000 340.676000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 340.700000 182.156000 344.876000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 344.900000 182.156000 349.076000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 349.100000 182.156000 353.276000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.300000 182.156000 357.476000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 357.500000 182.156000 361.676000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 361.700000 182.156000 365.876000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.900000 182.156000 370.076000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.100000 182.156000 374.276000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.300000 182.156000 378.476000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.500000 182.156000 382.676000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.700000 182.156000 386.876000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.900000 182.156000 391.076000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.100000 182.156000 395.276000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.300000 182.156000 399.476000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.500000 182.156000 403.676000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 403.700000 182.156000 407.876000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.900000 182.156000 412.076000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.100000 182.156000 416.276000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.300000 182.156000 420.476000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.500000 182.156000 424.676000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.700000 182.156000 428.876000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.900000 182.156000 433.076000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.100000 182.156000 437.276000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.300000 182.156000 441.476000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.500000 182.156000 445.676000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.700000 182.156000 449.876000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.900000 182.156000 454.076000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.100000 182.156000 458.276000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.300000 182.156000 462.476000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.500000 182.156000 466.676000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.700000 182.156000 470.876000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.900000 182.156000 475.076000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 475.100000 182.156000 479.276000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 479.300000 182.156000 483.476000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 483.500000 182.156000 487.676000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 487.700000 182.156000 491.876000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 491.900000 182.156000 496.076000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.100000 182.156000 500.276000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.300000 182.156000 504.476000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.500000 182.156000 508.676000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.700000 182.156000 512.876000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.900000 182.156000 517.076000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.100000 182.156000 521.276000 170.156000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 523.400000 182.156000 531.740000 170.156000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 531.704000 182.156000 540.044000 170.156000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 221.500000 164.956000 230.056000 152.956000 1.000000 0.000000 0.000000 1.000000 Y
+drawChar 229.096000 164.956000 236.860000 152.956000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 236.896000 164.956000 243.208000 152.956000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 243.196000 164.956000 251.584000 152.956000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 251.500000 164.956000 255.676000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 255.700000 164.956000 259.876000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 259.900000 164.956000 264.076000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.100000 164.956000 268.276000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.300000 164.956000 272.476000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.500000 164.956000 276.676000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.700000 164.956000 280.876000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.900000 164.956000 285.076000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 285.100000 164.956000 289.276000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 289.300000 164.956000 293.476000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 293.500000 164.956000 297.676000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 297.700000 164.956000 301.876000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 301.900000 164.956000 306.076000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 306.100000 164.956000 310.276000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 310.300000 164.956000 314.476000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 314.500000 164.956000 318.676000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 318.700000 164.956000 322.876000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 322.900000 164.956000 327.076000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 327.100000 164.956000 331.276000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 331.300000 164.956000 335.476000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 335.500000 164.956000 339.676000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 339.700000 164.956000 343.876000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 343.900000 164.956000 348.076000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.100000 164.956000 352.276000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 352.300000 164.956000 356.476000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 356.500000 164.956000 360.676000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 360.700000 164.956000 364.876000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 364.900000 164.956000 369.076000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 369.100000 164.956000 373.276000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 373.300000 164.956000 377.476000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.500000 164.956000 381.676000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.700000 164.956000 385.876000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.900000 164.956000 390.076000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.100000 164.956000 394.276000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.300000 164.956000 398.476000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.500000 164.956000 402.676000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.700000 164.956000 406.876000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.900000 164.956000 411.076000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.100000 164.956000 415.276000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.300000 164.956000 419.476000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.500000 164.956000 423.676000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.700000 164.956000 427.876000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.900000 164.956000 432.076000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.100000 164.956000 436.276000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.300000 164.956000 440.476000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.500000 164.956000 444.676000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.700000 164.956000 448.876000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 448.900000 164.956000 453.076000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.100000 164.956000 457.276000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.300000 164.956000 461.476000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.500000 164.956000 465.676000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.700000 164.956000 469.876000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.900000 164.956000 474.076000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.100000 164.956000 478.276000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.300000 164.956000 482.476000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.500000 164.956000 486.676000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.700000 164.956000 490.876000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.900000 164.956000 495.076000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.100000 164.956000 499.276000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.300000 164.956000 503.476000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.500000 164.956000 507.676000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.700000 164.956000 511.876000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.900000 164.956000 516.076000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.100000 164.956000 520.276000 152.956000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 523.400000 164.956000 531.740000 152.956000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 531.704000 164.956000 540.044000 152.956000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 108.100000 140.356000 116.608000 128.356000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 116.596000 140.356000 121.144000 128.356000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 121.192000 140.356000 126.724000 128.356000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 126.688000 140.356000 135.412000 128.356000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 135.388000 140.356000 143.020000 128.356000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.984000 140.356000 149.728000 128.356000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 149.788000 140.356000 156.532000 128.356000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 156.500000 140.356000 160.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.700000 140.356000 164.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.900000 140.356000 169.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.100000 140.356000 173.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.300000 140.356000 177.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.500000 140.356000 181.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.700000 140.356000 185.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.900000 140.356000 190.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 190.100000 140.356000 194.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 194.300000 140.356000 198.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.500000 140.356000 202.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.700000 140.356000 206.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.900000 140.356000 211.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.100000 140.356000 215.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.300000 140.356000 219.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.500000 140.356000 223.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.700000 140.356000 227.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.900000 140.356000 232.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 232.100000 140.356000 236.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 236.300000 140.356000 240.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.500000 140.356000 244.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.700000 140.356000 248.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.900000 140.356000 253.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.100000 140.356000 257.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.300000 140.356000 261.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.500000 140.356000 265.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.700000 140.356000 269.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.900000 140.356000 274.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 274.100000 140.356000 278.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 278.300000 140.356000 282.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 282.500000 140.356000 286.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 286.700000 140.356000 290.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 290.900000 140.356000 295.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 295.100000 140.356000 299.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 299.300000 140.356000 303.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 303.500000 140.356000 307.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 307.700000 140.356000 311.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 311.900000 140.356000 316.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 316.100000 140.356000 320.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 320.300000 140.356000 324.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 324.500000 140.356000 328.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 328.700000 140.356000 332.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.900000 140.356000 337.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 337.100000 140.356000 341.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 341.300000 140.356000 345.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 345.500000 140.356000 349.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 349.700000 140.356000 353.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.900000 140.356000 358.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.100000 140.356000 362.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.300000 140.356000 366.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.500000 140.356000 370.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.700000 140.356000 374.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.900000 140.356000 379.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.100000 140.356000 383.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.300000 140.356000 387.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.500000 140.356000 391.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.700000 140.356000 395.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.900000 140.356000 400.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.100000 140.356000 404.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.300000 140.356000 408.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.500000 140.356000 412.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.700000 140.356000 416.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.900000 140.356000 421.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.100000 140.356000 425.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.300000 140.356000 429.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.500000 140.356000 433.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.700000 140.356000 437.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.900000 140.356000 442.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.100000 140.356000 446.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.300000 140.356000 450.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.500000 140.356000 454.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.700000 140.356000 458.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.900000 140.356000 463.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.100000 140.356000 467.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.300000 140.356000 471.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.500000 140.356000 475.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 475.700000 140.356000 479.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 479.900000 140.356000 484.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.100000 140.356000 488.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.300000 140.356000 492.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.500000 140.356000 496.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.700000 140.356000 500.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.900000 140.356000 505.076000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.100000 140.356000 509.276000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.300000 140.356000 513.476000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.500000 140.356000 517.676000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.700000 140.356000 521.876000 128.356000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 523.400000 140.356000 531.740000 128.356000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 531.704000 140.356000 540.044000 128.356000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 221.500000 123.156000 230.164000 111.156000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 230.200000 123.156000 240.520000 111.156000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 240.496000 123.156000 245.044000 111.156000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 245.092000 123.156000 257.788000 111.156000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 257.788000 123.156000 270.484000 111.156000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 270.484000 123.156000 275.032000 111.156000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 275.080000 123.156000 283.804000 111.156000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 283.780000 123.156000 292.168000 111.156000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 292.180000 123.156000 296.356000 111.156000 1.000000 0.000000 0.000000 1.000000
+drawChar 296.380000 123.156000 305.392000 111.156000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 305.080000 123.156000 313.072000 111.156000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 313.084000 123.156000 321.076000 111.156000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 321.088000 123.156000 325.636000 111.156000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 325.500000 123.156000 329.676000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 329.700000 123.156000 333.876000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 333.900000 123.156000 338.076000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 338.100000 123.156000 342.276000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 342.300000 123.156000 346.476000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 346.500000 123.156000 350.676000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 350.700000 123.156000 354.876000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 354.900000 123.156000 359.076000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 359.100000 123.156000 363.276000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 363.300000 123.156000 367.476000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.500000 123.156000 371.676000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.700000 123.156000 375.876000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.900000 123.156000 380.076000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.100000 123.156000 384.276000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.300000 123.156000 388.476000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.500000 123.156000 392.676000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.700000 123.156000 396.876000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.900000 123.156000 401.076000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.100000 123.156000 405.276000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.300000 123.156000 409.476000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.500000 123.156000 413.676000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.700000 123.156000 417.876000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.900000 123.156000 422.076000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.100000 123.156000 426.276000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.300000 123.156000 430.476000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.500000 123.156000 434.676000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.700000 123.156000 438.876000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.900000 123.156000 443.076000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.100000 123.156000 447.276000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.300000 123.156000 451.476000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.500000 123.156000 455.676000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.700000 123.156000 459.876000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.900000 123.156000 464.076000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.100000 123.156000 468.276000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.300000 123.156000 472.476000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.500000 123.156000 476.676000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.700000 123.156000 480.876000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.900000 123.156000 485.076000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.100000 123.156000 489.276000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.300000 123.156000 493.476000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.500000 123.156000 497.676000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.700000 123.156000 501.876000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.900000 123.156000 506.076000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.100000 123.156000 510.276000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 510.300000 123.156000 514.476000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.500000 123.156000 518.676000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 518.700000 123.156000 522.876000 111.156000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 523.400000 123.156000 531.740000 111.156000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 531.704000 123.156000 540.044000 111.156000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 221.500000 105.956000 230.428000 93.956000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 229.096000 105.956000 236.728000 93.956000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.692000 105.956000 245.416000 93.956000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 245.392000 105.956000 254.116000 93.956000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 254.092000 105.956000 258.640000 93.956000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 258.688000 105.956000 265.432000 93.956000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 265.400000 105.956000 269.576000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.600000 105.956000 273.776000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.800000 105.956000 277.976000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 278.000000 105.956000 282.176000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 282.200000 105.956000 286.376000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 286.400000 105.956000 290.576000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 290.600000 105.956000 294.776000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 294.800000 105.956000 298.976000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 299.000000 105.956000 303.176000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 303.200000 105.956000 307.376000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 307.400000 105.956000 311.576000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 311.600000 105.956000 315.776000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 315.800000 105.956000 319.976000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 320.000000 105.956000 324.176000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 324.200000 105.956000 328.376000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 328.400000 105.956000 332.576000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 332.600000 105.956000 336.776000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 336.800000 105.956000 340.976000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 341.000000 105.956000 345.176000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 345.200000 105.956000 349.376000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 349.400000 105.956000 353.576000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 353.600000 105.956000 357.776000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 357.800000 105.956000 361.976000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.000000 105.956000 366.176000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.200000 105.956000 370.376000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.400000 105.956000 374.576000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.600000 105.956000 378.776000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.800000 105.956000 382.976000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.000000 105.956000 387.176000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.200000 105.956000 391.376000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.400000 105.956000 395.576000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.600000 105.956000 399.776000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.800000 105.956000 403.976000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.000000 105.956000 408.176000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.200000 105.956000 412.376000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.400000 105.956000 416.576000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.600000 105.956000 420.776000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.800000 105.956000 424.976000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.000000 105.956000 429.176000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.200000 105.956000 433.376000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.400000 105.956000 437.576000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.600000 105.956000 441.776000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.800000 105.956000 445.976000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.000000 105.956000 450.176000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.200000 105.956000 454.376000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.400000 105.956000 458.576000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.600000 105.956000 462.776000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.800000 105.956000 466.976000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.000000 105.956000 471.176000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.200000 105.956000 475.376000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 475.400000 105.956000 479.576000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 479.600000 105.956000 483.776000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 483.800000 105.956000 487.976000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.000000 105.956000 492.176000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.200000 105.956000 496.376000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.400000 105.956000 500.576000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.600000 105.956000 504.776000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.800000 105.956000 508.976000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.000000 105.956000 513.176000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.200000 105.956000 517.376000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.400000 105.956000 521.576000 93.956000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 523.400000 105.956000 531.740000 93.956000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 531.704000 105.956000 540.044000 93.956000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 108.000000 659.900000 0 540.000000 659.900000 0 540.000000 660.000000 0 108.000000 660.000000 0 108.000000 659.900000 0
+eoFillPath subpath 1 108.000000 331.700000 0 540.000000 331.700000 0 540.000000 331.800000 0 108.000000 331.800000 0 108.000000 331.700000 0
+eoFillPath subpath 1 108.000000 141.700000 0 540.000000 141.700000 0 540.000000 141.800000 0 108.000000 141.800000 0 108.000000 141.700000 0
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 1103.000000 0 477.900000 1103.000000 0 477.900000 1412.800000 0 134.300000 1412.800000 0 134.300000 1103.000000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -31110.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -1886.100000 0 168.100000 -1886.100000 0 168.100000 -1881.100000 0 76.900000 -1881.100000 0 76.900000 -1886.100000 0
+eoFillPath subpath 1 163.100000 -1881.200000 0 168.100000 -1881.200000 0 168.100000 -1750.600000 0 163.100000 -1750.600000 0 163.100000 -1881.200000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -1881.100000 0 163.100000 -1881.100000 0 163.100000 -1745.700000 0 72.000000 -1745.700000 0 72.000000 -1881.100000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 -1750.020000 87.320000 -1760.020000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 -1750.020000 93.420000 -1760.020000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 -1750.020000 97.510000 -1760.020000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 -1750.020000 101.420000 -1760.020000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 -1750.020000 104.170000 -1760.020000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 -1750.020000 110.530000 -1760.020000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 -1750.020000 113.270000 -1760.020000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 -1750.020000 116.470000 -1760.020000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 -1750.020000 123.480000 -1760.020000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 -1750.020000 129.610000 -1760.020000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 -1750.020000 135.090000 -1760.020000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 -1750.020000 140.890000 -1760.020000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 -1750.020000 144.820000 -1760.020000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 -1750.020000 150.920000 -1760.020000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 -1750.020000 153.670000 -1760.020000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 -1750.020000 156.470000 -1760.020000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -1876.900000 0 168.200000 -1876.900000 0 168.200000 -1761.700000 0 72.000000 -1761.700000 0 72.000000 -1876.900000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1808.748000 79.253000 -1817.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 -1808.748000 86.669000 -1817.748000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 -1808.748000 90.215000 -1817.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 -1808.748000 93.077000 -1817.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 -1808.748000 97.406000 -1817.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 -1808.748000 100.853000 -1817.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 -1808.748000 107.324000 -1817.748000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 -1808.748000 112.337000 -1817.748000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 -1808.748000 115.271000 -1817.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 -1808.748000 118.655000 -1817.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 -1808.748000 126.512000 -1817.748000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 -1808.748000 130.805000 -1817.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 -1808.748000 135.881000 -1817.748000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 -1808.748000 139.355000 -1817.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 -1808.748000 147.284000 -1817.748000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 -1808.748000 150.074000 -1817.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 -1808.748000 155.897000 -1817.748000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 -1808.748000 158.750000 -1817.748000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -1808.748000 161.853000 -1817.748000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1819.248000 82.124000 -1828.248000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 -1819.248000 87.137000 -1828.248000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 -1819.248000 90.071000 -1828.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 -1819.248000 93.356000 -1828.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 -1819.248000 100.403000 -1828.248000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 -1819.248000 104.921000 -1828.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 -1819.248000 109.205000 -1828.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 -1819.248000 117.737000 -1828.248000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 -1819.248000 123.119000 -1828.248000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 -1819.248000 128.996000 -1828.248000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 -1819.248000 132.605000 -1828.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 -1819.248000 138.392000 -1828.248000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 -1819.248000 141.749000 -1828.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 -1819.248000 149.507000 -1828.248000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 -1819.248000 153.800000 -1828.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 -1819.248000 158.876000 -1828.248000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -1819.248000 161.853000 -1828.248000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1829.748000 81.764000 -1838.748000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -1829.748000 87.596000 -1838.748000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 -1829.748000 93.356000 -1838.748000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 -1829.748000 102.050000 -1838.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 -1829.748000 113.822000 -1838.748000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 -1829.748000 122.651000 -1838.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 -1829.748000 134.117000 -1838.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 -1829.748000 138.401000 -1838.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 -1829.748000 147.149000 -1838.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 -1829.748000 158.921000 -1838.748000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -1829.748000 161.853000 -1838.748000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1840.248000 79.271000 -1849.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -1840.248000 84.338000 -1849.248000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 -1840.248000 89.621000 -1849.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 -1840.248000 94.643000 -1849.248000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 -1840.248000 100.502000 -1849.248000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 -1840.248000 106.262000 -1849.248000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 -1840.248000 111.518000 -1849.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 -1840.248000 116.216000 -1849.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 -1840.248000 119.249000 -1849.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 -1840.248000 122.363000 -1849.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 -1840.248000 128.186000 -1849.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 -1840.248000 131.345000 -1849.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 -1840.248000 137.060000 -1849.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 -1840.248000 140.147000 -1849.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 -1840.248000 145.007000 -1849.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 -1840.248000 148.598000 -1849.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 -1840.248000 151.460000 -1849.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 -1840.248000 155.789000 -1849.248000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 -1840.248000 158.933000 -1849.248000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1850.748000 80.702000 -1859.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 -1850.748000 83.573000 -1859.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 -1850.748000 89.396000 -1859.748000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 -1850.748000 95.156000 -1859.748000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 -1850.748000 100.547000 -1859.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 -1850.748000 109.052000 -1859.748000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 -1850.748000 111.959000 -1859.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 -1850.748000 117.251000 -1859.748000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 -1850.748000 121.904000 -1859.748000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 -1850.748000 126.503000 -1859.748000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 -1850.748000 129.338000 -1859.748000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 -1850.748000 134.936000 -1859.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 -1850.748000 143.441000 -1859.748000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 -1850.748000 148.796000 -1859.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 -1850.748000 154.574000 -1859.748000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 -1850.748000 158.876000 -1859.748000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -1850.748000 161.853000 -1859.748000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1861.248000 79.271000 -1870.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -1861.248000 85.094000 -1870.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -1861.248000 88.703000 -1870.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 -1861.248000 94.112000 -1870.248000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 -1861.248000 97.244000 -1870.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 -1861.248000 103.058000 -1870.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 -1861.248000 108.890000 -1870.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 -1861.248000 111.950000 -1870.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 -1861.248000 115.271000 -1870.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 -1861.248000 120.338000 -1870.248000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 -1861.248000 125.621000 -1870.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 -1861.248000 131.363000 -1870.248000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 -1861.248000 134.558000 -1870.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 -1861.248000 140.048000 -1870.248000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 -1861.248000 145.430000 -1870.248000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 -1861.248000 150.551000 -1870.248000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 -1861.248000 155.960000 -1870.248000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 -1861.248000 158.933000 -1870.248000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1871.748000 80.009000 -1880.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -1871.748000 85.364000 -1880.748000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 -1871.748000 88.271000 -1880.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 -1871.748000 91.169000 -1880.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 -1871.748000 97.955000 -1880.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 -1871.748000 107.765000 -1880.748000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 -1871.748000 110.672000 -1880.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 -1871.748000 115.964000 -1880.748000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 -1871.748000 120.617000 -1880.748000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 -1871.748000 125.216000 -1880.748000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 -1871.748000 128.051000 -1880.748000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 -1871.748000 134.954000 -1880.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 -1871.748000 146.285000 -1880.748000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 -1871.748000 151.667000 -1880.748000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 -1871.748000 155.906000 -1880.748000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 -1871.748000 159.033000 -1880.748000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -1881.200000 0 72.100000 -1881.200000 0 72.100000 -1745.700000 0 72.000000 -1745.700000 0 72.000000 -1881.200000 0
+eoFillPath subpath 1 163.100000 -1881.200000 0 163.200000 -1881.200000 0 163.200000 -1745.700000 0 163.100000 -1745.700000 0 163.100000 -1881.200000 0
+eoFillPath subpath 1 72.000000 -1745.800000 0 163.200000 -1745.800000 0 163.200000 -1745.700000 0 72.000000 -1745.700000 0 72.000000 -1745.800000 0
+eoFillPath subpath 1 72.000000 -1881.200000 0 163.200000 -1881.200000 0 163.200000 -1881.100000 0 72.000000 -1881.100000 0 72.000000 -1881.200000 0
+saveState
+eoClipPath subpath 1 96.900000 -1805.900000 0 138.300000 -1805.900000 0 138.300000 -1761.700000 0 96.900000 -1761.700000 0 96.900000 -1805.900000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 259780.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -2160.700000 0 165.500000 -2160.700000 0 165.500000 -2155.700000 0 76.900000 -2155.700000 0 76.900000 -2160.700000 0
+eoFillPath subpath 1 160.500000 -2155.800000 0 165.500000 -2155.800000 0 165.500000 -1999.500000 0 160.500000 -1999.500000 0 160.500000 -2155.800000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -2155.700000 0 121.400000 -2155.700000 0 121.400000 -1994.600000 0 72.000000 -1994.600000 0 72.000000 -2155.700000 0
+saveState
+eoClipPath subpath 1 72.000000 -2155.700000 0 160.500000 -2155.700000 0 160.500000 -1994.600000 0 72.000000 -1994.600000 0 72.000000 -2155.700000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 296480.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 -1998.920000 89.280000 -2008.920000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 -1998.920000 95.630000 -2008.920000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 -1998.920000 99.520000 -2008.920000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 -1998.920000 102.270000 -2008.920000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 -1998.920000 108.450000 -2008.920000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 -1998.920000 112.610000 -2008.920000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 -1998.920000 118.510000 -2008.920000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 -1998.920000 121.670000 -2008.920000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 -1998.920000 124.470000 -2008.920000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 -1998.920000 130.830000 -2008.920000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 -1998.920000 133.970000 -2008.920000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 -1998.920000 137.920000 -2008.920000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 -1998.920000 144.230000 -2008.920000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 -1998.920000 150.350000 -2008.920000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 -1998.920000 153.570000 -2008.920000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 -2010.620000 95.000000 -2020.620000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 -2010.620000 97.770000 -2020.620000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 -2010.620000 103.000000 -2020.620000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 -2010.620000 109.330000 -2020.620000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 -2010.620000 117.470000 -2020.620000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 -2010.620000 123.620000 -2020.620000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 -2010.620000 128.800000 -2020.620000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 -2010.620000 135.130000 -2020.620000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 -2010.620000 141.250000 -2020.620000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 -2010.620000 145.410000 -2020.620000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2025.448000 82.961000 -2034.448000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 -2025.448000 87.614000 -2034.448000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 -2025.448000 93.356000 -2034.448000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 -2025.448000 98.612000 -2034.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 -2025.448000 103.733000 -2034.448000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 -2025.448000 106.568000 -2034.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 -2025.448000 111.959000 -2034.448000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 -2025.448000 114.866000 -2034.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 -2025.448000 117.665000 -2034.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 -2025.448000 122.768000 -2034.448000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 -2025.448000 125.747000 -2034.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 -2025.448000 131.651000 -2034.448000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 -2025.448000 136.907000 -2034.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 -2025.448000 142.307000 -2034.448000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 -2025.448000 148.049000 -2034.448000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 -2025.448000 150.956000 -2034.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 -2025.448000 156.302000 -2034.448000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2025.448000 159.253000 -2034.448000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2035.948000 84.095000 -2044.948000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -2035.948000 89.900000 -2044.948000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 -2035.948000 95.318000 -2044.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 -2035.948000 100.349000 -2044.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 -2035.948000 110.789000 -2044.948000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 -2035.948000 111.464000 -2044.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 -2035.948000 114.362000 -2044.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 -2035.948000 119.348000 -2044.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 -2035.948000 126.962000 -2044.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 -2035.948000 132.047000 -2044.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 -2035.948000 139.958000 -2044.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 -2035.948000 142.865000 -2044.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 -2035.948000 147.410000 -2044.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 -2035.948000 153.287000 -2044.948000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -2035.948000 156.333000 -2044.948000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2046.448000 84.095000 -2055.448000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -2046.448000 89.468000 -2055.448000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 -2046.448000 94.121000 -2055.448000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 -2046.448000 99.899000 -2055.448000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 -2046.448000 105.218000 -2055.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 -2046.448000 109.502000 -2055.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 -2046.448000 115.649000 -2055.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 -2046.448000 122.327000 -2055.448000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 -2046.448000 127.718000 -2055.448000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 -2046.448000 132.002000 -2055.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 -2046.448000 138.149000 -2055.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 -2046.448000 145.205000 -2055.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 -2046.448000 150.992000 -2055.448000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 -2046.448000 156.311000 -2055.448000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2046.448000 159.253000 -2055.448000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2056.948000 82.394000 -2065.948000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 -2056.948000 86.705000 -2065.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 -2056.948000 91.322000 -2065.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 -2056.948000 94.913000 -2065.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 -2056.948000 98.054000 -2065.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 -2056.948000 102.014000 -2065.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 -2056.948000 104.876000 -2065.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 -2056.948000 113.435000 -2065.948000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 -2056.948000 118.718000 -2065.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 -2056.948000 121.949000 -2065.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 -2056.948000 125.063000 -2065.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 -2056.948000 130.886000 -2065.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 -2056.948000 134.045000 -2065.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 -2056.948000 138.005000 -2065.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 -2056.948000 143.792000 -2065.948000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 -2056.948000 149.111000 -2065.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 -2056.948000 151.964000 -2065.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 -2056.948000 156.293000 -2065.948000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -2056.948000 159.153000 -2065.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2067.448000 79.271000 -2076.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 -2067.448000 82.169000 -2076.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 -2067.448000 85.526000 -2076.448000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 -2067.448000 90.818000 -2076.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 -2067.448000 94.454000 -2076.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 -2067.448000 99.008000 -2076.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 -2067.448000 104.318000 -2076.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 -2067.448000 110.096000 -2076.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 -2067.448000 115.856000 -2076.448000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 -2067.448000 119.546000 -2076.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 -2067.448000 124.001000 -2076.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 -2067.448000 129.509000 -2076.448000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 -2067.448000 133.145000 -2076.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 -2067.448000 139.751000 -2076.448000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 -2067.448000 145.205000 -2076.448000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 -2067.448000 148.841000 -2076.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 -2067.448000 152.657000 -2076.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 -2067.448000 156.293000 -2076.448000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2067.448000 159.253000 -2076.448000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2077.948000 84.095000 -2086.948000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -2077.948000 88.406000 -2086.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 -2077.948000 93.824000 -2086.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 -2077.948000 99.602000 -2086.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 -2077.948000 105.362000 -2086.948000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 -2077.948000 108.422000 -2086.948000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 -2077.948000 116.747000 -2086.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 -2077.948000 129.275000 -2086.948000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 -2077.948000 135.089000 -2086.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 -2077.948000 138.698000 -2086.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 -2077.948000 141.560000 -2086.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 -2077.948000 146.906000 -2086.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -2077.948000 151.190000 -2086.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 -2077.948000 156.266000 -2086.948000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2077.948000 159.253000 -2086.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2088.448000 82.196000 -2097.448000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 -2088.448000 87.560000 -2097.448000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 -2088.448000 92.213000 -2097.448000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 -2088.448000 96.551000 -2097.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 -2088.448000 101.708000 -2097.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 -2088.448000 107.216000 -2097.448000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 -2088.448000 111.653000 -2097.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 -2088.448000 118.961000 -2097.448000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 -2088.448000 124.316000 -2097.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 -2088.448000 128.654000 -2097.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 -2088.448000 133.172000 -2097.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 -2088.448000 138.995000 -2097.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 -2088.448000 143.612000 -2097.448000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 -2088.448000 148.913000 -2097.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 -2088.448000 153.197000 -2097.448000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -2088.448000 156.333000 -2097.448000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2098.948000 80.009000 -2107.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -2098.948000 85.319000 -2107.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 -2098.948000 91.061000 -2107.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 -2098.948000 100.052000 -2107.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 -2098.948000 113.993000 -2107.948000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 -2098.948000 116.873000 -2107.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 -2098.948000 120.410000 -2107.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 -2098.948000 126.296000 -2107.948000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 -2098.948000 135.350000 -2107.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 -2098.948000 145.106000 -2107.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 -2098.948000 150.893000 -2107.948000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 -2098.948000 156.212000 -2107.948000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2098.948000 159.253000 -2107.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2109.448000 82.196000 -2118.448000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 -2109.448000 87.560000 -2118.448000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 -2109.448000 93.392000 -2118.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 -2109.448000 99.152000 -2118.448000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 -2109.448000 101.960000 -2118.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 -2109.448000 107.306000 -2118.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 -2109.448000 111.905000 -2118.448000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 -2109.448000 115.640000 -2118.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 -2109.448000 122.444000 -2118.448000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 -2109.448000 127.898000 -2118.448000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 -2109.448000 135.575000 -2118.448000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 -2109.448000 141.380000 -2118.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 -2109.448000 145.241000 -2118.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 -2109.448000 150.803000 -2118.448000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 -2109.448000 156.302000 -2118.448000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2109.448000 159.253000 -2118.448000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2119.948000 80.009000 -2128.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -2119.948000 85.796000 -2128.948000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 -2119.948000 91.115000 -2128.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 -2119.948000 95.399000 -2128.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 -2119.948000 100.718000 -2128.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 -2119.948000 107.054000 -2128.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 -2119.948000 118.097000 -2128.948000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 -2119.948000 123.524000 -2128.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 -2119.948000 129.401000 -2128.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 -2119.948000 131.768000 -2128.948000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 -2119.948000 135.413000 -2128.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 -2119.948000 141.659000 -2128.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 -2119.948000 150.965000 -2128.948000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 -2119.948000 156.320000 -2128.948000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2119.948000 159.253000 -2128.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2130.448000 81.017000 -2139.448000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 -2130.448000 84.608000 -2139.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 -2130.448000 89.963000 -2139.448000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 -2130.448000 92.870000 -2139.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 -2130.448000 98.693000 -2139.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 -2130.448000 103.310000 -2139.448000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 -2130.448000 107.243000 -2139.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 -2130.448000 116.081000 -2139.448000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 -2130.448000 121.886000 -2139.448000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 -2130.448000 127.205000 -2139.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 -2130.448000 132.983000 -2139.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 -2130.448000 136.943000 -2139.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 -2130.448000 143.846000 -2139.448000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 -2130.448000 148.184000 -2139.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 -2130.448000 153.260000 -2139.448000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -2130.448000 156.433000 -2139.448000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2140.948000 79.271000 -2149.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -2140.948000 85.094000 -2149.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -2140.948000 90.854000 -2149.948000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 -2140.948000 93.653000 -2149.948000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -2155.800000 0 72.100000 -2155.800000 0 72.100000 -1994.600000 0 72.000000 -1994.600000 0 72.000000 -2155.800000 0
+eoFillPath subpath 1 160.500000 -2155.800000 0 160.600000 -2155.800000 0 160.600000 -1994.600000 0 160.500000 -1994.600000 0 160.500000 -2155.800000 0
+eoFillPath subpath 1 72.000000 -1994.700000 0 160.600000 -1994.700000 0 160.600000 -1994.600000 0 72.000000 -1994.600000 0 72.000000 -1994.700000 0
+eoFillPath subpath 1 72.000000 -2155.800000 0 160.600000 -2155.800000 0 160.600000 -2155.700000 0 72.000000 -2155.700000 0 72.000000 -2155.800000 0
+saveState
+eoClipPath subpath 1 108.000000 -2643.200000 0 178.900000 -2643.200000 0 178.900000 -2586.500000 0 108.000000 -2586.500000 0 108.000000 -2643.200000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 343510.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -6701.500000 0 165.500000 -6701.500000 0 165.500000 -6696.500000 0 76.900000 -6696.500000 0 76.900000 -6701.500000 0
+eoFillPath subpath 1 160.500000 -6696.600000 0 165.500000 -6696.600000 0 165.500000 -6587.800000 0 160.500000 -6587.800000 0 160.500000 -6696.600000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -6696.500000 0 160.500000 -6696.500000 0 160.500000 -6582.900000 0 72.000000 -6582.900000 0 72.000000 -6696.500000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -6587.248000 83.771000 -6596.248000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 -6587.248000 89.594000 -6596.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 -6587.248000 92.465000 -6596.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 -6587.248000 97.568000 -6596.248000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 -6587.248000 100.943000 -6596.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 -6587.248000 106.955000 -6596.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 -6587.248000 110.447000 -6596.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 -6587.248000 114.425000 -6596.248000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 -6587.248000 119.717000 -6596.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 -6587.248000 127.493000 -6596.248000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 -6587.248000 130.949000 -6596.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 -6587.248000 136.574000 -6596.248000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 -6587.248000 141.920000 -6596.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 -6587.248000 147.365000 -6596.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 -6587.248000 151.703000 -6596.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 -6587.248000 156.320000 -6596.248000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -6587.248000 159.153000 -6596.248000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -6597.748000 81.764000 -6606.748000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -6597.748000 85.130000 -6606.748000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 -6597.748000 88.712000 -6606.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 -6597.748000 94.022000 -6606.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 -6597.748000 98.306000 -6606.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -6597.748000 102.455000 -6606.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 -6597.748000 106.676000 -6606.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 -6597.748000 110.312000 -6606.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 -6597.748000 114.920000 -6606.748000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 -6597.748000 119.060000 -6606.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 -6597.748000 125.450000 -6606.748000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 -6597.748000 130.832000 -6606.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 -6597.748000 139.445000 -6606.748000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 -6597.748000 145.169000 -6606.748000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 -6597.748000 148.076000 -6606.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 -6597.748000 153.323000 -6606.748000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -6597.748000 156.433000 -6606.748000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -6608.248000 80.009000 -6617.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -6608.248000 82.871000 -6617.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 -6608.248000 88.316000 -6617.248000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 -6608.248000 94.094000 -6617.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 -6608.248000 96.947000 -6617.248000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 -6608.248000 104.948000 -6617.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 -6608.248000 113.705000 -6617.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 -6608.248000 119.492000 -6617.248000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 -6608.248000 124.811000 -6617.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 -6608.248000 132.848000 -6617.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 -6608.248000 141.605000 -6617.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 -6608.248000 144.467000 -6617.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 -6608.248000 148.103000 -6617.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 -6608.248000 150.965000 -6617.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 -6608.248000 156.311000 -6617.248000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -6608.248000 159.253000 -6617.248000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -6618.748000 80.999000 -6627.748000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 -6618.748000 90.539000 -6627.748000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 -6618.748000 95.318000 -6627.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 -6618.748000 99.602000 -6627.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -6618.748000 102.473000 -6627.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 -6618.748000 108.260000 -6627.748000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 -6618.748000 110.762000 -6627.748000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 -6618.748000 115.316000 -6627.748000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 -6618.748000 122.156000 -6627.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 -6618.748000 132.299000 -6627.748000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 -6618.748000 136.970000 -6627.748000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 -6618.748000 139.877000 -6627.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 -6618.748000 142.775000 -6627.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 -6618.748000 148.022000 -6627.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 -6618.748000 152.720000 -6627.748000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 -6618.748000 156.311000 -6627.748000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -6618.748000 159.253000 -6627.748000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -6629.248000 83.006000 -6638.248000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 -6629.248000 88.793000 -6638.248000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 -6629.248000 91.664000 -6638.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 -6629.248000 94.562000 -6638.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 -6629.248000 100.349000 -6638.248000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 -6629.248000 103.157000 -6638.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 -6629.248000 108.980000 -6638.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 -6629.248000 114.740000 -6638.248000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 -6629.248000 119.375000 -6638.248000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 -6629.248000 128.033000 -6638.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 -6629.248000 141.479000 -6638.248000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 -6629.248000 146.807000 -6638.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -6629.248000 152.684000 -6638.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 -6629.248000 156.293000 -6638.248000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -6629.248000 159.253000 -6638.248000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -6639.748000 79.730000 -6648.748000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 -6639.748000 84.005000 -6648.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 -6639.748000 89.423000 -6648.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 -6639.748000 98.036000 -6648.748000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 -6639.748000 121.157000 -6648.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 -6639.748000 145.115000 -6648.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 -6639.748000 151.001000 -6648.748000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 -6639.748000 156.320000 -6648.748000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -6639.748000 159.253000 -6648.748000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -6650.248000 83.285000 -6659.248000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 -6650.248000 89.099000 -6659.248000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 -6650.248000 93.401000 -6659.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 -6650.248000 98.477000 -6659.248000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 -6650.248000 103.121000 -6659.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 -6650.248000 105.974000 -6659.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 -6650.248000 111.320000 -6659.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 -6650.248000 115.604000 -6659.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 -6650.248000 123.857000 -6659.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 -6650.248000 136.007000 -6659.248000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 -6650.248000 141.794000 -6659.248000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 -6650.248000 144.665000 -6659.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 -6650.248000 147.464000 -6659.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 -6650.248000 153.251000 -6659.248000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -6650.248000 156.433000 -6659.248000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -6660.748000 79.271000 -6669.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -6660.748000 85.094000 -6669.748000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -6660.748000 90.854000 -6669.748000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 -6660.748000 96.146000 -6669.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 -6660.748000 102.302000 -6669.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 -6660.748000 107.711000 -6669.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 -6660.748000 113.048000 -6669.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 -6660.748000 119.204000 -6669.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 -6660.748000 124.991000 -6669.748000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 -6660.748000 130.310000 -6669.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 -6660.748000 135.647000 -6669.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 -6660.748000 144.755000 -6669.748000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 -6660.748000 153.323000 -6669.748000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -6660.748000 156.333000 -6669.748000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -6671.248000 82.160000 -6680.248000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 -6671.248000 85.067000 -6680.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 -6671.248000 89.297000 -6680.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 -6671.248000 94.616000 -6680.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 -6671.248000 98.747000 -6680.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 -6671.248000 106.055000 -6680.248000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 -6671.248000 109.700000 -6680.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 -6671.248000 115.055000 -6680.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 -6671.248000 118.601000 -6680.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 -6671.248000 124.010000 -6680.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 -6671.248000 128.042000 -6680.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 -6671.248000 135.998000 -6680.248000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 -6671.248000 141.785000 -6680.248000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 -6671.248000 144.656000 -6680.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 -6671.248000 147.554000 -6680.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 -6671.248000 153.341000 -6680.248000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -6671.248000 156.433000 -6680.248000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -6681.748000 79.271000 -6690.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -6681.748000 85.094000 -6690.748000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -6681.748000 90.854000 -6690.748000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 -6681.748000 93.743000 -6690.748000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -6696.600000 0 72.100000 -6696.600000 0 72.100000 -6582.900000 0 72.000000 -6582.900000 0 72.000000 -6696.600000 0
+eoFillPath subpath 1 160.500000 -6696.600000 0 160.600000 -6696.600000 0 160.600000 -6582.900000 0 160.500000 -6582.900000 0 160.500000 -6696.600000 0
+eoFillPath subpath 1 72.000000 -6583.000000 0 160.600000 -6583.000000 0 160.600000 -6582.900000 0 72.000000 -6582.900000 0 72.000000 -6583.000000 0
+eoFillPath subpath 1 72.000000 -6696.600000 0 160.600000 -6696.600000 0 160.600000 -6696.500000 0 72.000000 -6696.500000 0 72.000000 -6696.600000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -507.100000 0 169.600000 -507.100000 0 169.600000 -502.100000 0 76.900000 -502.100000 0 76.900000 -507.100000 0
+eoFillPath subpath 1 164.600000 -502.200000 0 169.600000 -502.200000 0 169.600000 -386.600000 0 164.600000 -386.600000 0 164.600000 -502.200000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -502.100000 0 121.400000 -502.100000 0 121.400000 -381.700000 0 72.000000 -381.700000 0 72.000000 -502.100000 0
+saveState
+eoClipPath subpath 1 72.000000 -502.100000 0 164.600000 -502.100000 0 164.600000 -381.700000 0 72.000000 -381.700000 0 72.000000 -502.100000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 135240.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -432.200000 0 93.700000 -432.200000 0 93.700000 -413.000000 0 72.000000 -413.000000 0 72.000000 -432.200000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 -432.200000 0 169.600000 -432.200000 0 169.600000 -413.000000 0 93.700000 -413.000000 0 93.700000 -432.200000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -448.900000 0 93.700000 -448.900000 0 93.700000 -432.200000 0 72.000000 -432.200000 0 72.000000 -448.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 -448.900000 0 169.600000 -448.900000 0 169.600000 -432.200000 0 93.700000 -432.200000 0 93.700000 -448.900000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -468.100000 0 93.700000 -468.100000 0 93.700000 -448.900000 0 72.000000 -448.900000 0 72.000000 -468.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 -468.100000 0 169.600000 -468.100000 0 169.600000 -448.900000 0 93.700000 -448.900000 0 93.700000 -468.100000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -487.300000 0 93.700000 -487.300000 0 93.700000 -468.100000 0 72.000000 -468.100000 0 72.000000 -487.300000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 -487.300000 0 169.600000 -487.300000 0 169.600000 -468.100000 0 93.700000 -468.100000 0 93.700000 -487.300000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -386.048000 82.898000 -395.048000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 -386.048000 87.200000 -395.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 -386.048000 90.809000 -395.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 -386.048000 93.671000 -395.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 -386.048000 98.315000 -395.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 -386.048000 101.906000 -395.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 -386.048000 106.514000 -395.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 -386.048000 109.754000 -395.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 -386.048000 112.868000 -395.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 -386.048000 118.691000 -395.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 -386.048000 121.850000 -395.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 -386.048000 125.702000 -395.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 -386.048000 131.588000 -395.048000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 -386.048000 136.907000 -395.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 -386.048000 140.039000 -395.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 -386.048000 146.078000 -395.048000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 -386.048000 151.442000 -395.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 -386.048000 154.349000 -395.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 -386.048000 157.148000 -395.048000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 -386.048000 160.433000 -395.048000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -396.548000 84.095000 -405.548000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -396.548000 89.468000 -405.548000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 -396.548000 94.580000 -405.548000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 -396.548000 97.631000 -405.548000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 -416.948000 104.443000 -425.948000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 -416.948000 109.060000 -425.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 -416.948000 113.398000 -425.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 -416.948000 119.194000 -425.948000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 -416.948000 124.612000 -425.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 -416.948000 127.465000 -425.948000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 -433.648000 101.176000 -442.648000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 -433.648000 104.074000 -442.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 -433.648000 109.420000 -442.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 -433.648000 114.442000 -442.648000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 -433.648000 120.202000 -442.648000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 -433.648000 123.811000 -442.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 -433.648000 129.121000 -442.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 -433.648000 134.899000 -442.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 -433.648000 139.516000 -442.648000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 -433.648000 143.107000 -442.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 -433.648000 148.417000 -442.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 -433.648000 151.270000 -442.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 -433.648000 157.093000 -442.648000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 -450.348000 103.048000 -459.348000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 -450.348000 108.421000 -459.348000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 -450.348000 113.443000 -459.348000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 -450.348000 118.852000 -459.348000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 -450.348000 124.702000 -459.348000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 -450.348000 130.021000 -459.348000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 -450.348000 135.079000 -459.348000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 -469.548000 104.407000 -478.548000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 -469.548000 109.816000 -478.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 -469.548000 115.594000 -478.548000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 -469.548000 121.354000 -478.548000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 -469.548000 125.692000 -478.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 -469.548000 128.563000 -478.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 -469.548000 133.954000 -478.548000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 -469.548000 139.786000 -478.548000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -502.200000 0 72.100000 -502.200000 0 72.100000 -381.700000 0 72.000000 -381.700000 0 72.000000 -502.200000 0
+eoFillPath subpath 1 164.600000 -502.200000 0 164.700000 -502.200000 0 164.700000 -381.700000 0 164.600000 -381.700000 0 164.600000 -502.200000 0
+eoFillPath subpath 1 72.000000 -381.800000 0 164.700000 -381.800000 0 164.700000 -381.700000 0 72.000000 -381.700000 0 72.000000 -381.800000 0
+eoFillPath subpath 1 72.000000 -502.200000 0 164.700000 -502.200000 0 164.700000 -502.100000 0 72.000000 -502.100000 0 72.000000 -502.200000 0
+eoFillPath subpath 1 91.300000 -487.300000 0 93.700000 -487.300000 0 93.700000 -413.000000 0 91.300000 -413.000000 0 91.300000 -487.300000 0
+eoFillPath subpath 1 72.000000 -468.100000 0 169.600000 -468.100000 0 169.600000 -465.700000 0 72.000000 -465.700000 0 72.000000 -468.100000 0
+eoFillPath subpath 1 72.000000 -415.400000 0 169.600000 -415.400000 0 169.600000 -413.000000 0 72.000000 -413.000000 0 72.000000 -415.400000 0
+eoFillPath subpath 1 72.000000 -487.300000 0 169.600000 -487.300000 0 169.600000 -484.900000 0 72.000000 -484.900000 0 72.000000 -487.300000 0
+saveState
+eoClipPath subpath 1 108.000000 -8353.200000 0 150.800000 -8353.200000 0 150.800000 -8309.000000 0 108.000000 -8309.000000 0 108.000000 -8353.200000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 914520.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 -9203.200000 0 499.600000 -9203.200000 0 499.600000 -9198.100000 0 186.800000 -9198.100000 0 186.800000 -9203.200000 0
+eoFillPath subpath 1 494.500000 -9198.200000 0 499.600000 -9198.200000 0 499.600000 -9009.800000 0 494.500000 -9009.800000 0 494.500000 -9198.200000 0
+saveState
+eoClipPath subpath 1 181.800000 -9198.200000 0 494.500000 -9198.200000 0 494.500000 -9004.800000 0 181.800000 -9004.800000 0 181.800000 -9198.200000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 -9004.700000 0 494.500000 -9004.700000 0 494.500000 -9004.700000 0 181.700000 -9004.700000 0
+eoFillPath subpath 1 181.700000 -9004.700000 0 494.500000 -9004.700000 0 494.500000 -9005.500000 0 181.700000 -9005.500000 0 181.700000 -9004.700000 0
+eoFillPath subpath 1 181.700000 -9005.500000 0 494.500000 -9005.500000 0 494.500000 -9006.200000 0 181.700000 -9006.200000 0 181.700000 -9005.500000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 -9006.200000 0 494.500000 -9006.200000 0 494.500000 -9007.000000 0 181.700000 -9007.000000 0 181.700000 -9006.200000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 -9007.000000 0 494.500000 -9007.000000 0 494.500000 -9007.800000 0 181.700000 -9007.800000 0 181.700000 -9007.000000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 -9007.800000 0 494.500000 -9007.800000 0 494.500000 -9008.500000 0 181.700000 -9008.500000 0 181.700000 -9007.800000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 -9008.500000 0 494.500000 -9008.500000 0 494.500000 -9009.300000 0 181.700000 -9009.300000 0 181.700000 -9008.500000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 -9009.300000 0 494.500000 -9009.300000 0 494.500000 -9010.000000 0 181.700000 -9010.000000 0 181.700000 -9009.300000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 -9010.000000 0 494.500000 -9010.000000 0 494.500000 -9010.800000 0 181.700000 -9010.800000 0 181.700000 -9010.000000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 -9010.800000 0 494.500000 -9010.800000 0 494.500000 -9011.500000 0 181.700000 -9011.500000 0 181.700000 -9010.800000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 -9011.500000 0 494.500000 -9011.500000 0 494.500000 -9012.300000 0 181.700000 -9012.300000 0 181.700000 -9011.500000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 -9012.300000 0 494.500000 -9012.300000 0 494.500000 -9013.100000 0 181.700000 -9013.100000 0 181.700000 -9012.300000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 -9013.100000 0 494.500000 -9013.100000 0 494.500000 -9013.800000 0 181.700000 -9013.800000 0 181.700000 -9013.100000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 -9013.800000 0 494.500000 -9013.800000 0 494.500000 -9014.600000 0 181.700000 -9014.600000 0 181.700000 -9013.800000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 -9014.600000 0 494.500000 -9014.600000 0 494.500000 -9015.300000 0 181.700000 -9015.300000 0 181.700000 -9014.600000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 -9015.300000 0 494.500000 -9015.300000 0 494.500000 -9016.100000 0 181.700000 -9016.100000 0 181.700000 -9015.300000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 -9016.100000 0 494.500000 -9016.100000 0 494.500000 -9016.900000 0 181.700000 -9016.900000 0 181.700000 -9016.100000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 -9016.900000 0 494.500000 -9016.900000 0 494.500000 -9017.600000 0 181.700000 -9017.600000 0 181.700000 -9016.900000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 -9017.600000 0 494.500000 -9017.600000 0 494.500000 -9018.400000 0 181.700000 -9018.400000 0 181.700000 -9017.600000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 -9018.400000 0 494.500000 -9018.400000 0 494.500000 -9019.100000 0 181.700000 -9019.100000 0 181.700000 -9018.400000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 -9019.100000 0 494.500000 -9019.100000 0 494.500000 -9019.900000 0 181.700000 -9019.900000 0 181.700000 -9019.100000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 -9019.900000 0 494.500000 -9019.900000 0 494.500000 -9020.700000 0 181.700000 -9020.700000 0 181.700000 -9019.900000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 -9020.700000 0 494.500000 -9020.700000 0 494.500000 -9021.400000 0 181.700000 -9021.400000 0 181.700000 -9020.700000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 -9021.400000 0 494.500000 -9021.400000 0 494.500000 -9022.200000 0 181.700000 -9022.200000 0 181.700000 -9021.400000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 -9022.200000 0 494.500000 -9022.200000 0 494.500000 -9022.900000 0 181.700000 -9022.900000 0 181.700000 -9022.200000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 -9022.900000 0 494.500000 -9022.900000 0 494.500000 -9023.700000 0 181.700000 -9023.700000 0 181.700000 -9022.900000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 -9023.700000 0 494.500000 -9023.700000 0 494.500000 -9024.400000 0 181.700000 -9024.400000 0 181.700000 -9023.700000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 -9024.400000 0 494.500000 -9024.400000 0 494.500000 -9025.200000 0 181.700000 -9025.200000 0 181.700000 -9024.400000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 -9025.200000 0 494.500000 -9025.200000 0 494.500000 -9026.000000 0 181.700000 -9026.000000 0 181.700000 -9025.200000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 -9026.000000 0 494.500000 -9026.000000 0 494.500000 -9026.700000 0 181.700000 -9026.700000 0 181.700000 -9026.000000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 -9026.700000 0 494.500000 -9026.700000 0 494.500000 -9027.500000 0 181.700000 -9027.500000 0 181.700000 -9026.700000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 -9027.500000 0 494.500000 -9027.500000 0 494.500000 -9028.200000 0 181.700000 -9028.200000 0 181.700000 -9027.500000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 -9028.200000 0 494.500000 -9028.200000 0 494.500000 -9029.000000 0 181.700000 -9029.000000 0 181.700000 -9028.200000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 -9029.000000 0 494.500000 -9029.000000 0 494.500000 -9029.800000 0 181.700000 -9029.800000 0 181.700000 -9029.000000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 -9029.800000 0 494.500000 -9029.800000 0 494.500000 -9030.500000 0 181.700000 -9030.500000 0 181.700000 -9029.800000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 -9030.500000 0 494.500000 -9030.500000 0 494.500000 -9031.300000 0 181.700000 -9031.300000 0 181.700000 -9030.500000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 -9031.300000 0 494.500000 -9031.300000 0 494.500000 -9032.000000 0 181.700000 -9032.000000 0 181.700000 -9031.300000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 -9032.000000 0 494.500000 -9032.000000 0 494.500000 -9032.800000 0 181.700000 -9032.800000 0 181.700000 -9032.000000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 -9032.800000 0 494.500000 -9032.800000 0 494.500000 -9033.600000 0 181.700000 -9033.600000 0 181.700000 -9032.800000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 -9033.600000 0 494.500000 -9033.600000 0 494.500000 -9034.300000 0 181.700000 -9034.300000 0 181.700000 -9033.600000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 -9034.300000 0 494.500000 -9034.300000 0 494.500000 -9035.100000 0 181.700000 -9035.100000 0 181.700000 -9034.300000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 -9035.100000 0 494.500000 -9035.100000 0 494.500000 -9035.800000 0 181.700000 -9035.800000 0 181.700000 -9035.100000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 -9035.800000 0 494.500000 -9035.800000 0 494.500000 -9036.600000 0 181.700000 -9036.600000 0 181.700000 -9035.800000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 -9036.600000 0 494.500000 -9036.600000 0 494.500000 -9037.300000 0 181.700000 -9037.300000 0 181.700000 -9036.600000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 -9037.300000 0 494.500000 -9037.300000 0 494.500000 -9038.100000 0 181.700000 -9038.100000 0 181.700000 -9037.300000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 -9038.100000 0 494.500000 -9038.100000 0 494.500000 -9038.900000 0 181.700000 -9038.900000 0 181.700000 -9038.100000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 -9038.900000 0 494.500000 -9038.900000 0 494.500000 -9039.600000 0 181.700000 -9039.600000 0 181.700000 -9038.900000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 -9039.600000 0 494.500000 -9039.600000 0 494.500000 -9040.400000 0 181.700000 -9040.400000 0 181.700000 -9039.600000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 -9040.400000 0 494.500000 -9040.400000 0 494.500000 -9041.100000 0 181.700000 -9041.100000 0 181.700000 -9040.400000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 -9041.100000 0 494.500000 -9041.100000 0 494.500000 -9041.900000 0 181.700000 -9041.900000 0 181.700000 -9041.100000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 -9041.900000 0 494.500000 -9041.900000 0 494.500000 -9042.700000 0 181.700000 -9042.700000 0 181.700000 -9041.900000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 -9042.700000 0 494.500000 -9042.700000 0 494.500000 -9043.400000 0 181.700000 -9043.400000 0 181.700000 -9042.700000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 -9043.400000 0 494.500000 -9043.400000 0 494.500000 -9044.200000 0 181.700000 -9044.200000 0 181.700000 -9043.400000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 -9044.200000 0 494.500000 -9044.200000 0 494.500000 -9044.900000 0 181.700000 -9044.900000 0 181.700000 -9044.200000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 -9044.900000 0 494.500000 -9044.900000 0 494.500000 -9045.700000 0 181.700000 -9045.700000 0 181.700000 -9044.900000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 -9045.700000 0 494.500000 -9045.700000 0 494.500000 -9046.500000 0 181.700000 -9046.500000 0 181.700000 -9045.700000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 -9046.500000 0 494.500000 -9046.500000 0 494.500000 -9047.200000 0 181.700000 -9047.200000 0 181.700000 -9046.500000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 -9047.200000 0 494.500000 -9047.200000 0 494.500000 -9048.000000 0 181.700000 -9048.000000 0 181.700000 -9047.200000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 -9048.000000 0 494.500000 -9048.000000 0 494.500000 -9048.700000 0 181.700000 -9048.700000 0 181.700000 -9048.000000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 -9048.700000 0 494.500000 -9048.700000 0 494.500000 -9049.500000 0 181.700000 -9049.500000 0 181.700000 -9048.700000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 -9049.500000 0 494.500000 -9049.500000 0 494.500000 -9050.200000 0 181.700000 -9050.200000 0 181.700000 -9049.500000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 -9050.200000 0 494.500000 -9050.200000 0 494.500000 -9051.000000 0 181.700000 -9051.000000 0 181.700000 -9050.200000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 -9051.000000 0 494.500000 -9051.000000 0 494.500000 -9051.800000 0 181.700000 -9051.800000 0 181.700000 -9051.000000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 -9051.800000 0 494.500000 -9051.800000 0 494.500000 -9052.500000 0 181.700000 -9052.500000 0 181.700000 -9051.800000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 -9052.500000 0 494.500000 -9052.500000 0 494.500000 -9053.300000 0 181.700000 -9053.300000 0 181.700000 -9052.500000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 -9053.300000 0 494.500000 -9053.300000 0 494.500000 -9054.000000 0 181.700000 -9054.000000 0 181.700000 -9053.300000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 -9054.000000 0 494.500000 -9054.000000 0 494.500000 -9054.800000 0 181.700000 -9054.800000 0 181.700000 -9054.000000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 -9054.800000 0 494.500000 -9054.800000 0 494.500000 -9055.600000 0 181.700000 -9055.600000 0 181.700000 -9054.800000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 -9055.600000 0 494.500000 -9055.600000 0 494.500000 -9056.300000 0 181.700000 -9056.300000 0 181.700000 -9055.600000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 -9056.300000 0 494.500000 -9056.300000 0 494.500000 -9057.100000 0 181.700000 -9057.100000 0 181.700000 -9056.300000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 -9057.100000 0 494.500000 -9057.100000 0 494.500000 -9057.800000 0 181.700000 -9057.800000 0 181.700000 -9057.100000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 -9057.800000 0 494.500000 -9057.800000 0 494.500000 -9058.600000 0 181.700000 -9058.600000 0 181.700000 -9057.800000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 -9058.600000 0 494.500000 -9058.600000 0 494.500000 -9059.400000 0 181.700000 -9059.400000 0 181.700000 -9058.600000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 -9059.400000 0 494.500000 -9059.400000 0 494.500000 -9060.100000 0 181.700000 -9060.100000 0 181.700000 -9059.400000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 -9060.100000 0 494.500000 -9060.100000 0 494.500000 -9060.900000 0 181.700000 -9060.900000 0 181.700000 -9060.100000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 -9060.900000 0 494.500000 -9060.900000 0 494.500000 -9061.600000 0 181.700000 -9061.600000 0 181.700000 -9060.900000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 -9061.600000 0 494.500000 -9061.600000 0 494.500000 -9062.400000 0 181.700000 -9062.400000 0 181.700000 -9061.600000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 -9062.400000 0 494.500000 -9062.400000 0 494.500000 -9063.100000 0 181.700000 -9063.100000 0 181.700000 -9062.400000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 -9063.100000 0 494.500000 -9063.100000 0 494.500000 -9063.900000 0 181.700000 -9063.900000 0 181.700000 -9063.100000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 -9063.900000 0 494.500000 -9063.900000 0 494.500000 -9064.700000 0 181.700000 -9064.700000 0 181.700000 -9063.900000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 -9064.700000 0 494.500000 -9064.700000 0 494.500000 -9065.400000 0 181.700000 -9065.400000 0 181.700000 -9064.700000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 -9065.400000 0 494.500000 -9065.400000 0 494.500000 -9066.200000 0 181.700000 -9066.200000 0 181.700000 -9065.400000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 -9066.200000 0 494.500000 -9066.200000 0 494.500000 -9066.900000 0 181.700000 -9066.900000 0 181.700000 -9066.200000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 -9066.900000 0 494.500000 -9066.900000 0 494.500000 -9067.700000 0 181.700000 -9067.700000 0 181.700000 -9066.900000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 -9067.700000 0 494.500000 -9067.700000 0 494.500000 -9068.500000 0 181.700000 -9068.500000 0 181.700000 -9067.700000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 -9068.500000 0 494.500000 -9068.500000 0 494.500000 -9069.200000 0 181.700000 -9069.200000 0 181.700000 -9068.500000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 -9069.200000 0 494.500000 -9069.200000 0 494.500000 -9070.000000 0 181.700000 -9070.000000 0 181.700000 -9069.200000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 -9070.000000 0 494.500000 -9070.000000 0 494.500000 -9070.700000 0 181.700000 -9070.700000 0 181.700000 -9070.000000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 -9070.700000 0 494.500000 -9070.700000 0 494.500000 -9071.500000 0 181.700000 -9071.500000 0 181.700000 -9070.700000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 -9071.500000 0 494.500000 -9071.500000 0 494.500000 -9072.300000 0 181.700000 -9072.300000 0 181.700000 -9071.500000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 -9072.300000 0 494.500000 -9072.300000 0 494.500000 -9073.000000 0 181.700000 -9073.000000 0 181.700000 -9072.300000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 -9073.000000 0 494.500000 -9073.000000 0 494.500000 -9073.800000 0 181.700000 -9073.800000 0 181.700000 -9073.000000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 -9073.800000 0 494.500000 -9073.800000 0 494.500000 -9074.500000 0 181.700000 -9074.500000 0 181.700000 -9073.800000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 -9074.500000 0 494.500000 -9074.500000 0 494.500000 -9075.300000 0 181.700000 -9075.300000 0 181.700000 -9074.500000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 -9075.300000 0 494.500000 -9075.300000 0 494.500000 -9076.000000 0 181.700000 -9076.000000 0 181.700000 -9075.300000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 -9076.000000 0 494.500000 -9076.000000 0 494.500000 -9076.800000 0 181.700000 -9076.800000 0 181.700000 -9076.000000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 -9076.800000 0 494.500000 -9076.800000 0 494.500000 -9077.600000 0 181.700000 -9077.600000 0 181.700000 -9076.800000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 -9077.600000 0 494.500000 -9077.600000 0 494.500000 -9078.300000 0 181.700000 -9078.300000 0 181.700000 -9077.600000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 -9078.300000 0 494.500000 -9078.300000 0 494.500000 -9079.100000 0 181.700000 -9079.100000 0 181.700000 -9078.300000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 -9079.100000 0 494.500000 -9079.100000 0 494.500000 -9079.800000 0 181.700000 -9079.800000 0 181.700000 -9079.100000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 -9079.800000 0 494.500000 -9079.800000 0 494.500000 -9080.600000 0 181.700000 -9080.600000 0 181.700000 -9079.800000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 -9080.600000 0 494.500000 -9080.600000 0 494.500000 -9081.400000 0 181.700000 -9081.400000 0 181.700000 -9080.600000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 -9081.400000 0 494.500000 -9081.400000 0 494.500000 -9082.100000 0 181.700000 -9082.100000 0 181.700000 -9081.400000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 -9082.100000 0 494.500000 -9082.100000 0 494.500000 -9082.900000 0 181.700000 -9082.900000 0 181.700000 -9082.100000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 -9082.900000 0 494.500000 -9082.900000 0 494.500000 -9083.600000 0 181.700000 -9083.600000 0 181.700000 -9082.900000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 -9083.600000 0 494.500000 -9083.600000 0 494.500000 -9084.400000 0 181.700000 -9084.400000 0 181.700000 -9083.600000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 -9084.400000 0 494.500000 -9084.400000 0 494.500000 -9085.200000 0 181.700000 -9085.200000 0 181.700000 -9084.400000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 -9085.200000 0 494.500000 -9085.200000 0 494.500000 -9085.900000 0 181.700000 -9085.900000 0 181.700000 -9085.200000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 -9085.900000 0 494.500000 -9085.900000 0 494.500000 -9086.700000 0 181.700000 -9086.700000 0 181.700000 -9085.900000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 -9086.700000 0 494.500000 -9086.700000 0 494.500000 -9087.400000 0 181.700000 -9087.400000 0 181.700000 -9086.700000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 -9087.400000 0 494.500000 -9087.400000 0 494.500000 -9088.200000 0 181.700000 -9088.200000 0 181.700000 -9087.400000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 -9088.200000 0 494.500000 -9088.200000 0 494.500000 -9088.900000 0 181.700000 -9088.900000 0 181.700000 -9088.200000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 -9088.900000 0 494.500000 -9088.900000 0 494.500000 -9089.700000 0 181.700000 -9089.700000 0 181.700000 -9088.900000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 -9089.700000 0 494.500000 -9089.700000 0 494.500000 -9090.500000 0 181.700000 -9090.500000 0 181.700000 -9089.700000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 -9090.500000 0 494.500000 -9090.500000 0 494.500000 -9091.200000 0 181.700000 -9091.200000 0 181.700000 -9090.500000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 -9091.200000 0 494.500000 -9091.200000 0 494.500000 -9092.000000 0 181.700000 -9092.000000 0 181.700000 -9091.200000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 -9092.000000 0 494.500000 -9092.000000 0 494.500000 -9092.700000 0 181.700000 -9092.700000 0 181.700000 -9092.000000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 -9092.700000 0 494.500000 -9092.700000 0 494.500000 -9093.500000 0 181.700000 -9093.500000 0 181.700000 -9092.700000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 -9093.500000 0 494.500000 -9093.500000 0 494.500000 -9094.300000 0 181.700000 -9094.300000 0 181.700000 -9093.500000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 -9094.300000 0 494.500000 -9094.300000 0 494.500000 -9095.000000 0 181.700000 -9095.000000 0 181.700000 -9094.300000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 -9095.000000 0 494.500000 -9095.000000 0 494.500000 -9095.800000 0 181.700000 -9095.800000 0 181.700000 -9095.000000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 -9095.800000 0 494.500000 -9095.800000 0 494.500000 -9096.500000 0 181.700000 -9096.500000 0 181.700000 -9095.800000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 -9096.500000 0 494.500000 -9096.500000 0 494.500000 -9097.300000 0 181.700000 -9097.300000 0 181.700000 -9096.500000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 -9097.300000 0 494.500000 -9097.300000 0 494.500000 -9098.100000 0 181.700000 -9098.100000 0 181.700000 -9097.300000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 -9098.100000 0 494.500000 -9098.100000 0 494.500000 -9098.800000 0 181.700000 -9098.800000 0 181.700000 -9098.100000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 -9098.800000 0 494.500000 -9098.800000 0 494.500000 -9099.600000 0 181.700000 -9099.600000 0 181.700000 -9098.800000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 -9099.600000 0 494.500000 -9099.600000 0 494.500000 -9100.300000 0 181.700000 -9100.300000 0 181.700000 -9099.600000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 -9100.300000 0 494.500000 -9100.300000 0 494.500000 -9101.100000 0 181.700000 -9101.100000 0 181.700000 -9100.300000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 -9101.100000 0 494.500000 -9101.100000 0 494.500000 -9101.800000 0 181.700000 -9101.800000 0 181.700000 -9101.100000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 -9101.800000 0 494.500000 -9101.800000 0 494.500000 -9102.600000 0 181.700000 -9102.600000 0 181.700000 -9101.800000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 -9102.600000 0 494.500000 -9102.600000 0 494.500000 -9103.400000 0 181.700000 -9103.400000 0 181.700000 -9102.600000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 -9103.400000 0 494.500000 -9103.400000 0 494.500000 -9104.100000 0 181.700000 -9104.100000 0 181.700000 -9103.400000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 -9104.100000 0 494.500000 -9104.100000 0 494.500000 -9104.900000 0 181.700000 -9104.900000 0 181.700000 -9104.100000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 -9104.900000 0 494.500000 -9104.900000 0 494.500000 -9105.600000 0 181.700000 -9105.600000 0 181.700000 -9104.900000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 -9105.600000 0 494.500000 -9105.600000 0 494.500000 -9106.400000 0 181.700000 -9106.400000 0 181.700000 -9105.600000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 -9106.400000 0 494.500000 -9106.400000 0 494.500000 -9107.100000 0 181.700000 -9107.100000 0 181.700000 -9106.400000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 -9107.100000 0 494.500000 -9107.100000 0 494.500000 -9107.900000 0 181.700000 -9107.900000 0 181.700000 -9107.100000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 -9107.900000 0 494.500000 -9107.900000 0 494.500000 -9108.700000 0 181.700000 -9108.700000 0 181.700000 -9107.900000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 -9108.700000 0 494.500000 -9108.700000 0 494.500000 -9109.400000 0 181.700000 -9109.400000 0 181.700000 -9108.700000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 -9109.400000 0 494.500000 -9109.400000 0 494.500000 -9110.200000 0 181.700000 -9110.200000 0 181.700000 -9109.400000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 -9110.200000 0 494.500000 -9110.200000 0 494.500000 -9110.900000 0 181.700000 -9110.900000 0 181.700000 -9110.200000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 -9110.900000 0 494.500000 -9110.900000 0 494.500000 -9111.700000 0 181.700000 -9111.700000 0 181.700000 -9110.900000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 -9111.700000 0 494.500000 -9111.700000 0 494.500000 -9112.500000 0 181.700000 -9112.500000 0 181.700000 -9111.700000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 -9112.500000 0 494.500000 -9112.500000 0 494.500000 -9113.200000 0 181.700000 -9113.200000 0 181.700000 -9112.500000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 -9113.200000 0 494.500000 -9113.200000 0 494.500000 -9114.000000 0 181.700000 -9114.000000 0 181.700000 -9113.200000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 -9114.000000 0 494.500000 -9114.000000 0 494.500000 -9114.700000 0 181.700000 -9114.700000 0 181.700000 -9114.000000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 -9114.700000 0 494.500000 -9114.700000 0 494.500000 -9115.500000 0 181.700000 -9115.500000 0 181.700000 -9114.700000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 -9115.500000 0 494.500000 -9115.500000 0 494.500000 -9116.200000 0 181.700000 -9116.200000 0 181.700000 -9115.500000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 -9116.200000 0 494.500000 -9116.200000 0 494.500000 -9117.000000 0 181.700000 -9117.000000 0 181.700000 -9116.200000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 -9117.000000 0 494.500000 -9117.000000 0 494.500000 -9117.800000 0 181.700000 -9117.800000 0 181.700000 -9117.000000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 -9117.800000 0 494.500000 -9117.800000 0 494.500000 -9118.500000 0 181.700000 -9118.500000 0 181.700000 -9117.800000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 -9118.500000 0 494.500000 -9118.500000 0 494.500000 -9119.300000 0 181.700000 -9119.300000 0 181.700000 -9118.500000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 -9119.300000 0 494.500000 -9119.300000 0 494.500000 -9120.000000 0 181.700000 -9120.000000 0 181.700000 -9119.300000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 -9120.000000 0 494.500000 -9120.000000 0 494.500000 -9120.800000 0 181.700000 -9120.800000 0 181.700000 -9120.000000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 -9120.800000 0 494.500000 -9120.800000 0 494.500000 -9121.500000 0 181.700000 -9121.500000 0 181.700000 -9120.800000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 -9121.500000 0 494.500000 -9121.500000 0 494.500000 -9122.300000 0 181.700000 -9122.300000 0 181.700000 -9121.500000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 -9122.300000 0 494.500000 -9122.300000 0 494.500000 -9123.100000 0 181.700000 -9123.100000 0 181.700000 -9122.300000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 -9123.100000 0 494.500000 -9123.100000 0 494.500000 -9123.800000 0 181.700000 -9123.800000 0 181.700000 -9123.100000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 -9123.800000 0 494.500000 -9123.800000 0 494.500000 -9124.600000 0 181.700000 -9124.600000 0 181.700000 -9123.800000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 -9124.600000 0 494.500000 -9124.600000 0 494.500000 -9125.300000 0 181.700000 -9125.300000 0 181.700000 -9124.600000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 -9125.300000 0 494.500000 -9125.300000 0 494.500000 -9126.100000 0 181.700000 -9126.100000 0 181.700000 -9125.300000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 -9126.100000 0 494.500000 -9126.100000 0 494.500000 -9126.900000 0 181.700000 -9126.900000 0 181.700000 -9126.100000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 -9126.900000 0 494.500000 -9126.900000 0 494.500000 -9127.600000 0 181.700000 -9127.600000 0 181.700000 -9126.900000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 -9127.600000 0 494.500000 -9127.600000 0 494.500000 -9128.400000 0 181.700000 -9128.400000 0 181.700000 -9127.600000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 -9128.400000 0 494.500000 -9128.400000 0 494.500000 -9129.100000 0 181.700000 -9129.100000 0 181.700000 -9128.400000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 -9129.100000 0 494.500000 -9129.100000 0 494.500000 -9129.900000 0 181.700000 -9129.900000 0 181.700000 -9129.100000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 -9129.900000 0 494.500000 -9129.900000 0 494.500000 -9130.600000 0 181.700000 -9130.600000 0 181.700000 -9129.900000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 -9130.600000 0 494.500000 -9130.600000 0 494.500000 -9131.400000 0 181.700000 -9131.400000 0 181.700000 -9130.600000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 -9131.400000 0 494.500000 -9131.400000 0 494.500000 -9132.200000 0 181.700000 -9132.200000 0 181.700000 -9131.400000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 -9132.200000 0 494.500000 -9132.200000 0 494.500000 -9132.900000 0 181.700000 -9132.900000 0 181.700000 -9132.200000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 -9132.900000 0 494.500000 -9132.900000 0 494.500000 -9133.700000 0 181.700000 -9133.700000 0 181.700000 -9132.900000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 -9133.700000 0 494.500000 -9133.700000 0 494.500000 -9134.400000 0 181.700000 -9134.400000 0 181.700000 -9133.700000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 -9134.400000 0 494.500000 -9134.400000 0 494.500000 -9135.200000 0 181.700000 -9135.200000 0 181.700000 -9134.400000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 -9135.200000 0 494.500000 -9135.200000 0 494.500000 -9136.000000 0 181.700000 -9136.000000 0 181.700000 -9135.200000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 -9136.000000 0 494.500000 -9136.000000 0 494.500000 -9136.700000 0 181.700000 -9136.700000 0 181.700000 -9136.000000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 -9136.700000 0 494.500000 -9136.700000 0 494.500000 -9137.500000 0 181.700000 -9137.500000 0 181.700000 -9136.700000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 -9137.500000 0 494.500000 -9137.500000 0 494.500000 -9138.200000 0 181.700000 -9138.200000 0 181.700000 -9137.500000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 -9138.200000 0 494.500000 -9138.200000 0 494.500000 -9139.000000 0 181.700000 -9139.000000 0 181.700000 -9138.200000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 -9139.000000 0 494.500000 -9139.000000 0 494.500000 -9139.800000 0 181.700000 -9139.800000 0 181.700000 -9139.000000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 -9139.800000 0 494.500000 -9139.800000 0 494.500000 -9140.500000 0 181.700000 -9140.500000 0 181.700000 -9139.800000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 -9140.500000 0 494.500000 -9140.500000 0 494.500000 -9141.300000 0 181.700000 -9141.300000 0 181.700000 -9140.500000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 -9141.300000 0 494.500000 -9141.300000 0 494.500000 -9142.000000 0 181.700000 -9142.000000 0 181.700000 -9141.300000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 -9142.000000 0 494.500000 -9142.000000 0 494.500000 -9142.800000 0 181.700000 -9142.800000 0 181.700000 -9142.000000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 -9142.800000 0 494.500000 -9142.800000 0 494.500000 -9143.500000 0 181.700000 -9143.500000 0 181.700000 -9142.800000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 -9143.500000 0 494.500000 -9143.500000 0 494.500000 -9144.300000 0 181.700000 -9144.300000 0 181.700000 -9143.500000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 -9144.300000 0 494.500000 -9144.300000 0 494.500000 -9145.100000 0 181.700000 -9145.100000 0 181.700000 -9144.300000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 -9145.100000 0 494.500000 -9145.100000 0 494.500000 -9145.800000 0 181.700000 -9145.800000 0 181.700000 -9145.100000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 -9145.800000 0 494.500000 -9145.800000 0 494.500000 -9146.600000 0 181.700000 -9146.600000 0 181.700000 -9145.800000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 -9146.600000 0 494.500000 -9146.600000 0 494.500000 -9147.300000 0 181.700000 -9147.300000 0 181.700000 -9146.600000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 -9147.300000 0 494.500000 -9147.300000 0 494.500000 -9148.100000 0 181.700000 -9148.100000 0 181.700000 -9147.300000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 -9148.100000 0 494.500000 -9148.100000 0 494.500000 -9148.900000 0 181.700000 -9148.900000 0 181.700000 -9148.100000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 -9148.900000 0 494.500000 -9148.900000 0 494.500000 -9149.600000 0 181.700000 -9149.600000 0 181.700000 -9148.900000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 -9149.600000 0 494.500000 -9149.600000 0 494.500000 -9150.400000 0 181.700000 -9150.400000 0 181.700000 -9149.600000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 -9150.400000 0 494.500000 -9150.400000 0 494.500000 -9151.100000 0 181.700000 -9151.100000 0 181.700000 -9150.400000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 -9151.100000 0 494.500000 -9151.100000 0 494.500000 -9151.900000 0 181.700000 -9151.900000 0 181.700000 -9151.100000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 -9151.900000 0 494.500000 -9151.900000 0 494.500000 -9152.700000 0 181.700000 -9152.700000 0 181.700000 -9151.900000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 -9152.700000 0 494.500000 -9152.700000 0 494.500000 -9153.400000 0 181.700000 -9153.400000 0 181.700000 -9152.700000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 -9153.400000 0 494.500000 -9153.400000 0 494.500000 -9154.200000 0 181.700000 -9154.200000 0 181.700000 -9153.400000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 -9154.200000 0 494.500000 -9154.200000 0 494.500000 -9154.900000 0 181.700000 -9154.900000 0 181.700000 -9154.200000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 -9154.900000 0 494.500000 -9154.900000 0 494.500000 -9155.700000 0 181.700000 -9155.700000 0 181.700000 -9154.900000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 -9155.700000 0 494.500000 -9155.700000 0 494.500000 -9156.400000 0 181.700000 -9156.400000 0 181.700000 -9155.700000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 -9156.400000 0 494.500000 -9156.400000 0 494.500000 -9157.200000 0 181.700000 -9157.200000 0 181.700000 -9156.400000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 -9157.200000 0 494.500000 -9157.200000 0 494.500000 -9158.000000 0 181.700000 -9158.000000 0 181.700000 -9157.200000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 -9158.000000 0 494.500000 -9158.000000 0 494.500000 -9158.700000 0 181.700000 -9158.700000 0 181.700000 -9158.000000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 -9158.700000 0 494.500000 -9158.700000 0 494.500000 -9159.500000 0 181.700000 -9159.500000 0 181.700000 -9158.700000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 -9159.500000 0 494.500000 -9159.500000 0 494.500000 -9160.200000 0 181.700000 -9160.200000 0 181.700000 -9159.500000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 -9160.200000 0 494.500000 -9160.200000 0 494.500000 -9161.000000 0 181.700000 -9161.000000 0 181.700000 -9160.200000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 -9161.000000 0 494.500000 -9161.000000 0 494.500000 -9161.800000 0 181.700000 -9161.800000 0 181.700000 -9161.000000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 -9161.800000 0 494.500000 -9161.800000 0 494.500000 -9162.500000 0 181.700000 -9162.500000 0 181.700000 -9161.800000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 -9162.500000 0 494.500000 -9162.500000 0 494.500000 -9163.300000 0 181.700000 -9163.300000 0 181.700000 -9162.500000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 -9163.300000 0 494.500000 -9163.300000 0 494.500000 -9164.000000 0 181.700000 -9164.000000 0 181.700000 -9163.300000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 -9164.000000 0 494.500000 -9164.000000 0 494.500000 -9164.800000 0 181.700000 -9164.800000 0 181.700000 -9164.000000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 -9164.800000 0 494.500000 -9164.800000 0 494.500000 -9165.600000 0 181.700000 -9165.600000 0 181.700000 -9164.800000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 -9165.600000 0 494.500000 -9165.600000 0 494.500000 -9166.300000 0 181.700000 -9166.300000 0 181.700000 -9165.600000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 -9166.300000 0 494.500000 -9166.300000 0 494.500000 -9167.100000 0 181.700000 -9167.100000 0 181.700000 -9166.300000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 -9167.100000 0 494.500000 -9167.100000 0 494.500000 -9167.800000 0 181.700000 -9167.800000 0 181.700000 -9167.100000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 -9167.800000 0 494.500000 -9167.800000 0 494.500000 -9168.600000 0 181.700000 -9168.600000 0 181.700000 -9167.800000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 -9168.600000 0 494.500000 -9168.600000 0 494.500000 -9169.300000 0 181.700000 -9169.300000 0 181.700000 -9168.600000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 -9169.300000 0 494.500000 -9169.300000 0 494.500000 -9170.100000 0 181.700000 -9170.100000 0 181.700000 -9169.300000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 -9170.100000 0 494.500000 -9170.100000 0 494.500000 -9170.900000 0 181.700000 -9170.900000 0 181.700000 -9170.100000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 -9170.900000 0 494.500000 -9170.900000 0 494.500000 -9171.600000 0 181.700000 -9171.600000 0 181.700000 -9170.900000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 -9171.600000 0 494.500000 -9171.600000 0 494.500000 -9172.400000 0 181.700000 -9172.400000 0 181.700000 -9171.600000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 -9172.400000 0 494.500000 -9172.400000 0 494.500000 -9173.100000 0 181.700000 -9173.100000 0 181.700000 -9172.400000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 -9173.100000 0 494.500000 -9173.100000 0 494.500000 -9173.900000 0 181.700000 -9173.900000 0 181.700000 -9173.100000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 -9173.900000 0 494.500000 -9173.900000 0 494.500000 -9174.700000 0 181.700000 -9174.700000 0 181.700000 -9173.900000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 -9174.700000 0 494.500000 -9174.700000 0 494.500000 -9175.400000 0 181.700000 -9175.400000 0 181.700000 -9174.700000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 -9175.400000 0 494.500000 -9175.400000 0 494.500000 -9176.200000 0 181.700000 -9176.200000 0 181.700000 -9175.400000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 -9176.200000 0 494.500000 -9176.200000 0 494.500000 -9176.900000 0 181.700000 -9176.900000 0 181.700000 -9176.200000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 -9176.900000 0 494.500000 -9176.900000 0 494.500000 -9177.700000 0 181.700000 -9177.700000 0 181.700000 -9176.900000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 -9177.700000 0 494.500000 -9177.700000 0 494.500000 -9178.500000 0 181.700000 -9178.500000 0 181.700000 -9177.700000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 -9178.500000 0 494.500000 -9178.500000 0 494.500000 -9179.200000 0 181.700000 -9179.200000 0 181.700000 -9178.500000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 -9179.200000 0 494.500000 -9179.200000 0 494.500000 -9180.000000 0 181.700000 -9180.000000 0 181.700000 -9179.200000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 -9180.000000 0 494.500000 -9180.000000 0 494.500000 -9180.700000 0 181.700000 -9180.700000 0 181.700000 -9180.000000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 -9180.700000 0 494.500000 -9180.700000 0 494.500000 -9181.500000 0 181.700000 -9181.500000 0 181.700000 -9180.700000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 -9181.500000 0 494.500000 -9181.500000 0 494.500000 -9182.200000 0 181.700000 -9182.200000 0 181.700000 -9181.500000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 -9182.200000 0 494.500000 -9182.200000 0 494.500000 -9183.000000 0 181.700000 -9183.000000 0 181.700000 -9182.200000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 -9183.000000 0 494.500000 -9183.000000 0 494.500000 -9183.800000 0 181.700000 -9183.800000 0 181.700000 -9183.000000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 -9183.800000 0 494.500000 -9183.800000 0 494.500000 -9184.500000 0 181.700000 -9184.500000 0 181.700000 -9183.800000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 -9184.500000 0 494.500000 -9184.500000 0 494.500000 -9185.300000 0 181.700000 -9185.300000 0 181.700000 -9184.500000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 -9185.300000 0 494.500000 -9185.300000 0 494.500000 -9186.000000 0 181.700000 -9186.000000 0 181.700000 -9185.300000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 -9186.000000 0 494.500000 -9186.000000 0 494.500000 -9186.800000 0 181.700000 -9186.800000 0 181.700000 -9186.000000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 -9186.800000 0 494.500000 -9186.800000 0 494.500000 -9187.600000 0 181.700000 -9187.600000 0 181.700000 -9186.800000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 -9187.600000 0 494.500000 -9187.600000 0 494.500000 -9188.300000 0 181.700000 -9188.300000 0 181.700000 -9187.600000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 -9188.300000 0 494.500000 -9188.300000 0 494.500000 -9189.100000 0 181.700000 -9189.100000 0 181.700000 -9188.300000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 -9189.100000 0 494.500000 -9189.100000 0 494.500000 -9189.800000 0 181.700000 -9189.800000 0 181.700000 -9189.100000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 -9189.800000 0 494.500000 -9189.800000 0 494.500000 -9190.600000 0 181.700000 -9190.600000 0 181.700000 -9189.800000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 -9190.600000 0 494.500000 -9190.600000 0 494.500000 -9191.400000 0 181.700000 -9191.400000 0 181.700000 -9190.600000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 -9191.400000 0 494.500000 -9191.400000 0 494.500000 -9192.100000 0 181.700000 -9192.100000 0 181.700000 -9191.400000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 -9192.100000 0 494.500000 -9192.100000 0 494.500000 -9192.900000 0 181.700000 -9192.900000 0 181.700000 -9192.100000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 -9192.900000 0 494.500000 -9192.900000 0 494.500000 -9193.600000 0 181.700000 -9193.600000 0 181.700000 -9192.900000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 -9193.600000 0 494.500000 -9193.600000 0 494.500000 -9194.400000 0 181.700000 -9194.400000 0 181.700000 -9193.600000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 -9194.400000 0 494.500000 -9194.400000 0 494.500000 -9195.100000 0 181.700000 -9195.100000 0 181.700000 -9194.400000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 -9195.100000 0 494.500000 -9195.100000 0 494.500000 -9195.900000 0 181.700000 -9195.900000 0 181.700000 -9195.100000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 -9195.900000 0 494.500000 -9195.900000 0 494.500000 -9196.700000 0 181.700000 -9196.700000 0 181.700000 -9195.900000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 -9196.700000 0 494.500000 -9196.700000 0 494.500000 -9197.400000 0 181.700000 -9197.400000 0 181.700000 -9196.700000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 -9197.400000 0 494.500000 -9197.400000 0 494.500000 -9198.200000 0 181.700000 -9198.200000 0 181.700000 -9197.400000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 -9198.100000 0 181.800000 -9198.100000 0 181.800000 -9004.800000 0 494.400000 -9004.800000 0 494.400000 -9198.100000 0 338.100000 -9198.100000 0
+strokePath subpath 1 338.100000 -9198.100000 0 181.800000 -9198.100000 0 181.800000 -9004.800000 0 494.400000 -9004.800000 0 494.400000 -9198.100000 0 338.100000 -9198.100000 0
+saveState
+updateCtm 11420.000000 0.000000 0.000000 -8760.000000 20530.000000 991410.000000
+drawSoftMaskedImage 1143 877 1143 877 JPEG 71324 PPM 3007249
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 -9159.076000 215.488000 -9167.076000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 -9159.076000 220.592000 -9167.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 -9159.076000 225.696000 -9167.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 -9159.076000 230.800000 -9167.076000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 -9166.676000 241.388000 -9174.676000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 -9166.676000 246.492000 -9174.676000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 -9166.676000 251.596000 -9174.676000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 -9166.676000 256.700000 -9174.676000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 -9174.376000 267.188000 -9182.376000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 -9174.376000 272.292000 -9182.376000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 -9174.376000 277.396000 -9182.376000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 -9174.376000 282.500000 -9182.376000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 -9181.976000 293.088000 -9189.976000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 -9181.976000 298.192000 -9189.976000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 -9181.976000 303.296000 -9189.976000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 -9181.976000 308.400000 -9189.976000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 -9144.076000 202.588000 -9152.076000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 -9124.776000 201.688000 -9132.776000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 -9105.476000 195.788000 -9113.476000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 -9105.476000 200.892000 -9113.476000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 -9086.076000 194.888000 -9094.076000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 -9086.076000 199.992000 -9094.076000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 -9066.776000 193.988000 -9074.776000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 -9066.776000 199.092000 -9074.776000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 -9047.476000 193.088000 -9055.476000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 -9047.476000 198.192000 -9055.476000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 -9175.376000 330.188000 -9183.376000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 -9175.376000 332.716000 -9183.376000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 -9175.376000 337.596000 -9183.376000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 -9175.376000 341.396000 -9183.376000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 -9175.376000 346.036000 -9183.376000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 -9175.376000 350.900000 -9183.376000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 -9175.376000 355.972000 -9183.376000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 -9175.376000 359.196000 -9183.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 -9175.376000 362.196000 -9183.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 -9175.376000 367.404000 -9183.376000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 -9175.376000 371.876000 -9183.376000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 -9175.376000 375.052000 -9183.376000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 -9155.876000 361.172000 -9163.876000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 -9155.876000 364.340000 -9163.876000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 -9155.876000 367.396000 -9163.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 -9155.876000 372.604000 -9163.876000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 -9155.876000 379.348000 -9163.876000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 -9155.876000 384.484000 -9163.876000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 -9155.876000 389.436000 -9163.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 -9155.876000 392.108000 -9163.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 -9155.876000 395.708000 -9163.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 -9155.876000 397.540000 -9163.876000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 -9155.876000 402.444000 -9163.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 -9155.876000 406.788000 -9163.876000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 -9136.276000 392.972000 -9144.276000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 -9136.276000 398.076000 -9144.276000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 -9136.276000 403.180000 -9144.276000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 -9136.276000 405.428000 -9144.276000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 -9136.276000 410.332000 -9144.276000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 -9136.276000 414.476000 -9144.276000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 -9008.708000 305.808000 -9022.708000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 -9008.708000 314.138000 -9022.708000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 -9008.708000 320.788000 -9022.708000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 -9008.708000 328.698000 -9022.708000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 -9008.708000 336.972000 -9022.708000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 -9008.708000 344.182000 -9022.708000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 -9008.708000 349.810000 -9022.708000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 -9008.708000 354.234000 -9022.708000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 -9008.708000 362.718000 -9022.708000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 -9008.708000 367.870000 -9022.708000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 -9008.708000 372.322000 -9022.708000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 -9008.708000 382.080000 -9022.708000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 -9008.708000 388.772000 -9022.708000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 -9008.708000 397.802000 -9022.708000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 -9008.708000 402.254000 -9022.708000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 -9008.708000 407.896000 -9022.708000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 -9131.600000 0 424.300000 -9131.600000 0 424.300000 -9070.900000 0 493.600000 -9070.900000 0 493.600000 -9131.600000 0 458.900000 -9131.600000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 -9080.500000 0 428.900000 -9080.500000 0 428.900000 -9074.600000 0 434.800000 -9074.600000 0 434.800000 -9080.500000 0 431.900000 -9080.500000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 -9091.600000 0 428.900000 -9091.600000 0 428.900000 -9085.600000 0 434.800000 -9085.600000 0 434.800000 -9091.600000 0 431.900000 -9091.600000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 -9102.700000 0 428.900000 -9102.700000 0 428.900000 -9096.700000 0 434.800000 -9096.700000 0 434.800000 -9102.700000 0 431.900000 -9102.700000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 -9113.800000 0 428.900000 -9113.800000 0 428.900000 -9107.800000 0 434.800000 -9107.800000 0 434.800000 -9113.800000 0 431.900000 -9113.800000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 -9124.900000 0 428.900000 -9124.900000 0 428.900000 -9118.900000 0 434.800000 -9118.900000 0 434.800000 -9124.900000 0 431.900000 -9124.900000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -9073.376000 443.288000 -9081.376000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 -9073.376000 445.816000 -9081.376000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 -9073.376000 450.600000 -9081.376000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 -9073.376000 454.496000 -9081.376000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 -9073.376000 459.136000 -9081.376000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 -9073.376000 464.000000 -9081.376000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 -9073.376000 468.976000 -9081.376000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 -9073.376000 472.304000 -9081.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 -9073.376000 475.208000 -9081.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 -9073.376000 480.520000 -9081.376000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 -9073.376000 484.992000 -9081.376000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 -9073.376000 488.168000 -9081.376000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -9084.476000 443.352000 -9092.476000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 -9084.476000 447.920000 -9092.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 -9084.476000 452.976000 -9092.476000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 -9084.476000 457.400000 -9092.476000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 -9084.476000 462.472000 -9092.476000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 -9084.476000 465.800000 -9092.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 -9084.476000 468.904000 -9092.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 -9084.476000 473.816000 -9092.476000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 -9084.476000 478.888000 -9092.476000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 -9084.476000 482.064000 -9092.476000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -9095.576000 442.872000 -9103.576000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 -9095.576000 446.040000 -9103.576000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 -9095.576000 448.992000 -9103.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 -9095.576000 454.304000 -9103.576000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 -9095.576000 461.048000 -9103.576000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 -9095.576000 466.184000 -9103.576000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 -9095.576000 471.136000 -9103.576000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 -9095.576000 473.808000 -9103.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 -9095.576000 477.408000 -9103.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 -9095.576000 479.240000 -9103.576000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 -9095.576000 484.144000 -9103.576000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 -9095.576000 488.488000 -9103.576000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -9106.676000 443.384000 -9114.676000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 -9106.676000 448.464000 -9114.676000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 -9106.676000 453.424000 -9114.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 -9106.676000 456.696000 -9114.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 -9106.676000 459.800000 -9114.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 -9106.676000 462.032000 -9114.676000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 -9106.676000 466.936000 -9114.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 -9106.676000 471.080000 -9114.676000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -9117.776000 443.272000 -9125.776000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 -9117.776000 448.376000 -9125.776000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 -9117.776000 453.480000 -9125.776000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 -9117.776000 455.728000 -9125.776000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 -9117.776000 460.632000 -9125.776000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 -9117.776000 464.776000 -9125.776000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -11762.800000 0 114.800000 -11762.800000 0 114.800000 -11720.000000 0 72.000000 -11720.000000 0 72.000000 -11762.800000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 1255470.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 546.200000 0 504.000000 546.200000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 546.200000 0
+eoFillPath subpath 1 72.000000 420.200000 0 121.400000 420.200000 0 121.400000 546.200000 0 72.000000 546.200000 0 72.000000 420.200000 0
+eoFillPath subpath 1 454.500000 420.200000 0 504.000000 420.200000 0 504.000000 546.200000 0 454.500000 546.200000 0 454.500000 420.200000 0
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 420.200000 0 504.000000 420.200000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 420.200000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 72.000000 0 504.000000 72.000000 0 504.000000 245.800000 0 72.000000 245.800000 0 72.000000 72.000000 0
+eoFillPath subpath 1 72.000000 245.800000 0 121.400000 245.800000 0 121.400000 308.400000 0 72.000000 308.400000 0 72.000000 245.800000 0
+eoFillPath subpath 1 454.500000 245.800000 0 504.000000 245.800000 0 504.000000 308.400000 0 454.500000 308.400000 0 454.500000 245.800000 0
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 72.000000 0 504.000000 72.000000 0 504.000000 308.400000 0 72.000000 308.400000 0 72.000000 72.000000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 308.400000 0 76.300000 308.400000 0 76.300000 420.200000 0 72.000000 420.200000 0 72.000000 308.400000 0
+eoFillPath subpath 1 454.500000 308.400000 0 504.000000 308.400000 0 504.000000 420.200000 0 454.500000 420.200000 0 454.500000 308.400000 0
+restoreState
+saveState
+eoClipPath subpath 1 160.300000 308.400000 0 504.000000 308.400000 0 504.000000 420.200000 0 160.300000 420.200000 0 160.300000 308.400000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 72.000000 701.300000 0 504.000000 701.300000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 701.300000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 72.000000 654.200000 0 291.400000 654.200000 0 291.400000 672.900000 0 72.000000 672.900000 0 72.000000 654.200000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 72.000000 72.200000 0 504.000000 72.200000 0 504.000000 86.100000 0 72.000000 86.100000 0 72.000000 72.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 331.300000 719.948000 345.092000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 345.108000 719.948000 354.564000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 354.612000 719.948000 359.684000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 359.716000 719.948000 371.732000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 371.716000 719.948000 381.492000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 381.524000 719.948000 391.652000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 391.620000 719.948000 399.940000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 399.924000 719.948000 409.764000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 409.732000 719.948000 414.804000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 414.836000 719.948000 420.596000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 420.644000 719.948000 425.716000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 425.700000 719.948000 439.492000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 439.508000 719.948000 448.964000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 449.012000 719.948000 454.084000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.116000 719.948000 466.132000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 466.116000 719.948000 475.892000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 475.924000 719.948000 486.052000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 486.020000 719.948000 494.340000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 494.324000 719.948000 504.164000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 672.848000 88.020000 656.848000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 88.004000 672.848000 98.420000 656.848000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.404000 672.848000 103.972000 656.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.004000 672.848000 117.380000 656.848000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 117.412000 672.848000 128.404000 656.848000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 128.420000 672.848000 139.796000 656.848000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 139.828000 672.848000 149.348000 656.848000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 149.332000 672.848000 160.180000 656.848000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 648.336000 197.776000 636.336000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 197.800000 648.336000 204.568000 636.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 204.796000 648.336000 208.600000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 208.900000 648.336000 216.628000 636.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 216.604000 648.336000 223.828000 636.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 223.900000 648.336000 231.628000 636.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 231.604000 648.336000 237.760000 636.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 237.700000 648.336000 244.792000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 244.996000 648.336000 248.800000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 249.100000 648.336000 252.928000 636.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 252.904000 648.336000 259.060000 636.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 259.300000 648.336000 263.104000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 263.404000 648.336000 270.556000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 270.808000 648.336000 274.612000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 274.912000 648.336000 281.632000 636.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 281.608000 648.336000 288.832000 636.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 288.808000 648.336000 292.636000 636.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 292.708000 648.336000 299.932000 636.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 299.908000 648.336000 307.636000 636.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 307.612000 648.336000 311.440000 636.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 311.512000 648.336000 318.664000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 318.616000 648.336000 322.444000 636.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 322.516000 648.336000 326.560000 636.336000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 326.512000 648.336000 332.668000 636.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 332.716000 648.336000 337.528000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 337.516000 648.336000 344.284000 636.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 344.320000 648.336000 348.148000 636.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 348.124000 648.336000 355.216000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 355.720000 648.336000 359.524000 636.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 359.700000 648.336000 366.468000 636.336000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 366.504000 648.336000 370.332000 636.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 370.308000 648.336000 374.136000 636.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 374.208000 648.336000 378.036000 636.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 378.012000 648.336000 385.164000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 385.416000 648.336000 389.220000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 389.520000 648.336000 393.348000 636.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 393.324000 648.336000 401.052000 636.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 401.328000 648.336000 405.132000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 405.324000 648.336000 412.476000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 412.824000 648.336000 416.628000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 416.820000 648.336000 424.548000 636.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 424.524000 648.336000 431.748000 636.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 431.820000 648.336000 439.500000 636.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 439.416000 648.336000 443.244000 636.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 443.316000 648.336000 450.408000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 450.720000 648.336000 454.524000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.716000 648.336000 460.452000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 460.416000 648.336000 467.508000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 467.520000 648.336000 473.676000 636.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 473.724000 648.336000 477.552000 636.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 477.528000 648.336000 485.208000 636.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 485.232000 648.336000 492.324000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 492.336000 648.336000 500.064000 636.336000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 648.336000 504.044000 636.336000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 634.436000 190.312000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 634.436000 194.128000 622.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 194.200000 634.436000 201.352000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 201.304000 634.436000 205.132000 622.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 205.708000 634.436000 209.512000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 210.112000 634.436000 217.264000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 217.312000 634.436000 223.048000 622.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 223.012000 634.436000 230.104000 622.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 230.116000 634.436000 237.268000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 237.712000 634.436000 241.516000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 242.116000 634.436000 249.340000 622.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 249.412000 634.436000 253.852000 622.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 254.308000 634.436000 258.112000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 258.712000 634.436000 266.932000 622.436000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 266.908000 634.436000 274.060000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 274.108000 634.436000 281.836000 622.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 282.304000 634.436000 286.108000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 286.708000 634.436000 295.024000 622.436000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 295.012000 634.436000 300.748000 622.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 300.808000 634.436000 307.960000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 307.912000 634.436000 315.640000 622.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 315.616000 634.436000 322.336000 622.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 322.420000 634.436000 326.248000 622.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 326.224000 634.436000 332.380000 622.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 332.428000 634.436000 339.148000 622.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 339.124000 634.436000 346.348000 622.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 346.324000 634.436000 350.128000 622.436000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 350.620000 634.436000 354.424000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 355.120000 634.436000 365.380000 622.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 365.416000 634.436000 369.244000 622.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 369.220000 634.436000 374.032000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 374.020000 634.436000 381.748000 622.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 382.216000 634.436000 386.020000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 386.620000 634.436000 393.772000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 394.324000 634.436000 398.128000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.728000 634.436000 410.104000 622.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 410.128000 634.436000 417.280000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 417.232000 634.436000 424.912000 622.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 424.936000 634.436000 432.664000 622.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 432.640000 634.436000 436.468000 622.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 436.540000 634.436000 444.532000 622.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 444.544000 634.436000 451.264000 622.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 451.240000 634.436000 458.332000 622.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 458.344000 634.436000 466.072000 622.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 466.048000 634.436000 470.860000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 471.448000 634.436000 475.252000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 475.852000 634.436000 482.620000 622.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 482.656000 634.436000 486.484000 622.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 486.460000 634.436000 493.552000 622.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 493.564000 634.436000 503.824000 622.436000 1.000000 0.000000 0.000000 1.000000 w
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 634.436000 507.904000 622.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 620.536000 192.724000 608.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 192.700000 620.536000 197.140000 608.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 198.004000 620.536000 201.808000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 202.600000 620.536000 207.412000 608.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 207.400000 620.536000 215.128000 608.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 215.200000 620.536000 222.292000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 223.000000 620.536000 226.804000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 227.596000 620.536000 236.404000 608.536000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 236.500000 620.536000 243.652000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 243.700000 620.536000 250.468000 608.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 248.800000 620.536000 252.604000 608.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.396000 620.536000 257.200000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 257.992000 620.536000 267.820000 608.536000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 267.796000 620.536000 273.532000 608.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 273.592000 620.536000 277.420000 608.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 277.396000 620.536000 285.076000 608.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 285.100000 620.536000 288.928000 608.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 288.904000 620.536000 296.632000 608.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 296.704000 620.536000 303.856000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 303.808000 620.536000 307.636000 608.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 307.708000 620.536000 311.536000 608.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 311.512000 620.536000 318.280000 608.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 316.708000 620.536000 320.512000 608.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 321.304000 620.536000 325.108000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 325.900000 620.536000 330.712000 608.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 330.796000 620.536000 338.524000 608.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 338.500000 620.536000 345.592000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 346.396000 620.536000 350.200000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 350.992000 620.536000 355.432000 608.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 355.396000 620.536000 362.548000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 362.596000 620.536000 369.316000 608.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 369.292000 620.536000 376.444000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 376.492000 620.536000 384.172000 608.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 384.196000 620.536000 391.288000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 392.092000 620.536000 395.896000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 396.688000 620.536000 403.912000 608.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 403.888000 620.536000 408.328000 608.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 409.084000 620.536000 412.888000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 413.788000 620.536000 418.600000 608.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 418.588000 620.536000 426.316000 608.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 426.388000 620.536000 433.480000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 434.188000 620.536000 437.992000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.784000 620.536000 446.512000 608.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 446.488000 620.536000 453.712000 608.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 453.784000 620.536000 461.512000 608.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 461.488000 620.536000 467.644000 608.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 467.584000 620.536000 474.676000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 475.588000 620.536000 479.392000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 480.184000 620.536000 490.444000 608.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 490.480000 620.536000 497.632000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 497.584000 620.536000 503.740000 608.536000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 620.536000 507.904000 608.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 606.636000 193.180000 594.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 193.204000 606.636000 200.356000 594.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 200.308000 606.636000 204.136000 594.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 204.208000 606.636000 211.936000 594.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 211.912000 606.636000 216.724000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 216.712000 606.636000 223.804000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 223.816000 606.636000 231.496000 594.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 232.912000 606.636000 236.716000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 238.216000 606.636000 242.044000 594.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 242.020000 606.636000 249.748000 594.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 251.320000 606.636000 255.124000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 256.624000 606.636000 263.776000 594.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 265.228000 606.636000 269.032000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 270.532000 606.636000 274.360000 594.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 274.336000 606.636000 278.164000 594.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 278.140000 606.636000 285.820000 594.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 285.844000 606.636000 293.572000 594.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 293.644000 606.636000 298.456000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 299.944000 606.636000 303.748000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 305.248000 606.636000 311.404000 594.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 311.452000 606.636000 319.180000 594.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 319.156000 606.636000 326.308000 594.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 326.260000 606.636000 333.940000 594.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 333.964000 606.636000 341.056000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 342.460000 606.636000 346.264000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 347.764000 606.636000 354.988000 594.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 355.060000 606.636000 359.500000 594.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 360.964000 606.636000 364.768000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 366.268000 606.636000 373.036000 594.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 373.072000 606.636000 380.164000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 380.176000 606.636000 384.004000 594.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 383.980000 606.636000 387.808000 594.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 387.880000 606.636000 395.104000 594.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 395.080000 606.636000 405.340000 594.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 403.876000 606.636000 407.680000 594.636000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 409.180000 606.636000 412.984000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 414.484000 606.636000 422.164000 594.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 422.188000 606.636000 429.916000 594.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 429.892000 606.636000 434.704000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 436.192000 606.636000 439.996000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 441.496000 606.636000 446.308000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 446.296000 606.636000 453.520000 594.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 453.496000 606.636000 461.176000 594.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 461.200000 606.636000 468.352000 594.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 468.400000 606.636000 475.168000 594.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 473.596000 606.636000 477.400000 594.636000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 478.792000 606.636000 482.596000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.096000 606.636000 488.908000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 488.896000 606.636000 496.624000 594.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.696000 606.636000 503.788000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 606.636000 507.904000 594.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 592.736000 191.656000 580.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 592.736000 195.532000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 195.508000 592.736000 203.188000 580.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 203.212000 592.736000 210.304000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 211.312000 592.736000 215.116000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 216.208000 592.736000 220.648000 580.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 220.612000 592.736000 227.764000 580.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 227.812000 592.736000 234.532000 580.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 234.508000 592.736000 238.336000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 238.408000 592.736000 246.136000 580.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 246.112000 592.736000 253.792000 580.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 254.908000 592.736000 258.712000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 259.804000 592.736000 264.616000 580.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 264.604000 592.736000 272.332000 580.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 272.404000 592.736000 279.496000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 280.408000 592.736000 284.212000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 285.304000 592.736000 291.460000 580.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 291.508000 592.736000 296.320000 580.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 296.308000 592.736000 302.044000 580.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 302.104000 592.736000 309.196000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 309.208000 592.736000 316.300000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 316.312000 592.736000 321.124000 580.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 322.216000 592.736000 326.020000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 327.112000 592.736000 330.940000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 330.916000 592.736000 337.072000 580.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 338.116000 592.736000 341.920000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 343.012000 592.736000 350.740000 580.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 350.716000 592.736000 357.940000 580.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 358.012000 592.736000 368.272000 580.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 369.316000 592.736000 373.120000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 374.212000 592.736000 381.436000 580.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 381.508000 592.736000 388.276000 580.736000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 388.204000 592.736000 395.296000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 395.404000 592.736000 401.140000 580.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 401.104000 592.736000 408.784000 580.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 408.808000 592.736000 414.544000 580.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 414.604000 592.736000 421.828000 580.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 421.708000 592.736000 431.968000 580.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 432.004000 592.736000 439.732000 580.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 440.704000 592.736000 444.508000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 445.600000 592.736000 455.860000 580.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 455.896000 592.736000 459.724000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 459.796000 592.736000 464.608000 580.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 464.596000 592.736000 472.324000 580.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 473.392000 592.736000 477.196000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 478.288000 592.736000 488.548000 580.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 488.584000 592.736000 492.412000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 492.388000 592.736000 496.216000 580.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 496.192000 592.736000 503.872000 580.736000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 592.736000 507.904000 580.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 578.836000 191.236000 566.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 191.200000 578.836000 198.424000 566.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 198.496000 578.836000 204.652000 566.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 204.592000 578.836000 211.684000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 211.696000 578.836000 217.852000 566.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 218.992000 578.836000 222.796000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 223.996000 578.836000 231.724000 566.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 231.700000 578.836000 239.380000 566.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 240.604000 578.836000 244.408000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.608000 578.836000 250.420000 566.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 250.408000 578.836000 257.632000 566.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 258.808000 578.836000 262.612000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 263.812000 578.836000 268.624000 566.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 268.612000 578.836000 276.340000 566.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 276.412000 578.836000 283.504000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 284.608000 578.836000 288.412000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 289.612000 578.836000 295.768000 566.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 295.816000 578.836000 302.908000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 302.920000 578.836000 309.640000 566.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 309.616000 578.836000 316.840000 566.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 316.912000 578.836000 324.640000 566.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 324.616000 578.836000 332.296000 566.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 333.412000 578.836000 337.216000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 339.616000 578.836000 347.608000 566.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 346.420000 578.836000 353.644000 566.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 353.620000 578.836000 360.844000 566.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 360.916000 578.836000 366.652000 566.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.816000 578.836000 371.620000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.820000 578.836000 383.080000 566.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 383.116000 578.836000 386.944000 566.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 386.920000 578.836000 394.648000 566.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 394.624000 578.836000 402.304000 566.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 402.328000 578.836000 409.552000 566.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 409.528000 578.836000 419.788000 566.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 419.824000 578.836000 425.980000 566.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 426.028000 578.836000 429.832000 566.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.924000 578.836000 434.728000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 435.928000 578.836000 444.592000 566.836000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 444.628000 578.836000 450.784000 566.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 451.924000 578.836000 455.728000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 456.928000 578.836000 463.696000 566.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 463.732000 578.836000 470.956000 566.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 470.932000 578.836000 478.660000 566.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 479.836000 578.836000 483.640000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.840000 578.836000 491.992000 566.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 492.040000 578.836000 499.720000 566.836000 1.000000 0.000000 0.000000 1.000000 p
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 578.836000 504.044000 566.836000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 564.936000 193.180000 552.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 193.204000 564.936000 198.940000 552.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 198.904000 564.936000 206.128000 552.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 206.104000 564.936000 213.256000 552.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 213.304000 564.936000 220.024000 552.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 220.000000 564.936000 227.728000 552.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 230.596000 564.936000 234.400000 552.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 237.496000 564.936000 242.308000 552.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 242.296000 564.936000 250.024000 552.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 250.096000 564.936000 257.188000 552.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 259.996000 564.936000 263.800000 552.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.800000 564.936000 274.528000 552.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 274.504000 564.936000 281.728000 552.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 281.800000 564.936000 289.528000 552.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 289.504000 564.936000 295.660000 552.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 295.600000 564.936000 302.692000 552.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 305.704000 564.936000 309.508000 552.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 312.508000 564.936000 316.948000 552.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 316.912000 564.936000 322.648000 552.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 322.708000 564.936000 329.932000 552.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 329.908000 564.936000 341.284000 552.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 344.212000 564.936000 348.016000 552.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 351.016000 564.936000 355.828000 552.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 355.816000 564.936000 363.544000 552.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 363.616000 564.936000 370.708000 552.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 373.516000 564.936000 377.320000 552.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 380.320000 564.936000 386.476000 552.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 386.524000 564.936000 391.336000 552.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 391.324000 564.936000 397.060000 552.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 397.120000 564.936000 404.212000 552.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 404.224000 564.936000 411.316000 552.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 411.328000 564.936000 416.140000 552.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 416.128000 564.936000 419.932000 552.936000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 422.824000 564.936000 426.628000 552.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.628000 564.936000 434.440000 552.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 434.428000 564.936000 442.156000 552.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 442.228000 564.936000 449.320000 552.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 452.224000 564.936000 456.028000 552.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 459.028000 564.936000 465.748000 552.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 465.724000 564.936000 472.876000 552.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 472.924000 564.936000 478.660000 552.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 478.624000 564.936000 486.304000 552.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 486.328000 564.936000 493.552000 552.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 493.528000 564.936000 499.264000 552.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 499.324000 564.936000 504.136000 552.936000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 564.936000 507.904000 552.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 551.036000 192.220000 539.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 192.196000 551.036000 199.420000 539.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 199.396000 551.036000 210.772000 539.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 210.796000 551.036000 217.888000 539.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 217.900000 551.036000 224.056000 539.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 225.904000 551.036000 229.708000 539.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 231.604000 551.036000 235.432000 539.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 235.408000 551.036000 243.136000 539.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 243.208000 551.036000 248.020000 539.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 248.008000 551.036000 255.232000 539.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 257.104000 551.036000 260.908000 539.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.804000 551.036000 269.572000 539.036000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 269.608000 551.036000 273.436000 539.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 273.412000 551.036000 280.504000 539.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 280.516000 551.036000 290.776000 539.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 289.420000 551.036000 293.224000 539.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 295.024000 551.036000 298.828000 539.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 300.724000 551.036000 305.464000 539.036000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 305.428000 551.036000 313.156000 539.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 315.124000 551.036000 318.928000 539.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 320.824000 551.036000 325.636000 539.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 325.624000 551.036000 333.352000 539.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 333.424000 551.036000 340.516000 539.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 342.328000 551.036000 346.132000 539.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 348.028000 551.036000 354.748000 539.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 354.724000 551.036000 361.876000 539.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 361.924000 551.036000 367.660000 539.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.624000 551.036000 375.304000 539.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 375.328000 551.036000 382.552000 539.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 382.528000 551.036000 388.264000 539.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.324000 551.036000 393.136000 539.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 394.924000 551.036000 398.728000 539.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 400.720000 551.036000 404.548000 539.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 404.524000 551.036000 410.680000 539.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 412.528000 551.036000 416.332000 539.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 418.228000 551.036000 425.380000 539.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 427.228000 551.036000 431.032000 539.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 432.928000 551.036000 439.648000 539.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 439.732000 551.036000 443.560000 539.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 443.536000 551.036000 450.688000 539.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.736000 551.036000 456.892000 539.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 456.940000 551.036000 463.096000 539.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 463.036000 551.036000 466.864000 539.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 466.840000 551.036000 473.560000 539.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 477.244000 551.036000 481.048000 539.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 481.300000 551.036000 488.524000 539.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 488.500000 551.036000 492.328000 539.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 492.304000 551.036000 499.984000 539.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 500.008000 551.036000 504.052000 539.036000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 537.136000 190.312000 525.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 537.136000 194.128000 525.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 194.200000 537.136000 205.576000 525.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 205.504000 537.136000 212.596000 525.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 212.608000 537.136000 218.344000 525.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 217.108000 537.136000 220.912000 525.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 221.008000 537.136000 224.812000 525.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 225.004000 537.136000 231.160000 525.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 231.208000 537.136000 236.020000 525.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 236.008000 537.136000 239.836000 525.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 239.812000 537.136000 243.640000 525.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 243.712000 537.136000 247.540000 525.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 247.708000 537.136000 251.512000 525.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 251.704000 537.136000 255.532000 525.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 255.508000 537.136000 263.236000 525.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 263.404000 537.136000 267.208000 525.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 267.400000 537.136000 274.168000 525.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 274.204000 537.136000 281.296000 525.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 281.308000 537.136000 287.044000 525.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 287.008000 537.136000 293.776000 525.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 294.004000 537.136000 297.808000 525.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 298.000000 537.136000 305.680000 525.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 305.704000 537.136000 312.928000 525.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 312.904000 537.136000 320.128000 525.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 320.104000 537.136000 327.784000 525.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 327.904000 537.136000 331.708000 525.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 331.900000 537.136000 338.620000 525.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 338.596000 537.136000 345.820000 525.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 345.796000 537.136000 353.524000 525.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 353.596000 537.136000 361.276000 525.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 361.300000 537.136000 365.128000 525.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 365.104000 537.136000 369.916000 525.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 369.904000 537.136000 373.732000 525.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 373.804000 537.136000 381.028000 525.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 381.004000 537.136000 388.732000 525.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 388.708000 537.136000 392.512000 525.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 392.704000 537.136000 396.508000 525.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 396.904000 537.136000 404.056000 525.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 403.900000 537.136000 411.628000 525.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 411.604000 537.136000 419.284000 525.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 419.404000 537.136000 423.208000 525.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 423.400000 537.136000 427.228000 525.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 427.204000 537.136000 434.884000 525.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 434.908000 537.136000 442.000000 525.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 442.108000 537.136000 449.260000 525.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 449.308000 537.136000 453.136000 525.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 453.208000 537.136000 457.012000 525.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 457.408000 537.136000 461.848000 525.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 461.704000 537.136000 468.928000 525.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 468.904000 537.136000 474.640000 525.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.808000 537.136000 478.612000 525.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 478.804000 537.136000 482.632000 525.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 482.608000 537.136000 489.700000 525.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 489.712000 537.136000 493.540000 525.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 493.612000 537.136000 499.768000 525.136000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 537.136000 504.044000 525.136000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 523.236000 193.228000 511.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 193.204000 523.236000 198.940000 511.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 198.904000 523.236000 205.996000 511.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 206.008000 523.236000 209.836000 511.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 209.812000 523.236000 216.580000 511.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 216.616000 523.236000 220.420000 511.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 220.420000 523.236000 228.100000 511.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 228.124000 523.236000 233.860000 511.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 233.824000 523.236000 237.652000 511.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 237.628000 523.236000 244.396000 511.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 244.432000 523.236000 251.524000 511.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 251.536000 523.236000 257.692000 511.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 257.740000 523.236000 261.544000 511.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 261.544000 523.236000 268.696000 511.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 268.744000 523.236000 272.572000 511.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 272.548000 523.236000 279.772000 511.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 279.748000 523.236000 287.476000 511.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 287.452000 523.236000 295.132000 511.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 295.156000 523.236000 298.960000 511.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 298.960000 523.236000 303.772000 511.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 303.760000 523.236000 311.488000 511.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 311.464000 523.236000 318.556000 511.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 318.568000 523.236000 322.372000 511.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 322.372000 523.236000 329.092000 511.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 329.068000 523.236000 336.292000 511.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 336.268000 523.236000 343.420000 511.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 343.468000 523.236000 349.624000 511.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 349.672000 523.236000 354.484000 511.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 354.472000 523.236000 358.276000 511.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 485.448000 83.028000 469.448000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 82.996000 485.448000 88.468000 469.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.500000 485.448000 96.388000 469.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 96.404000 485.448000 105.924000 469.448000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 105.908000 485.448000 113.556000 469.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.508000 485.448000 119.076000 469.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.108000 485.448000 130.036000 469.448000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 130.004000 485.448000 135.476000 469.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 135.508000 485.448000 146.500000 469.448000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 146.516000 485.448000 157.508000 469.448000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 157.524000 485.448000 165.412000 469.448000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 460.836000 193.492000 448.836000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 193.504000 460.836000 201.232000 448.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 201.208000 460.836000 208.300000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 208.804000 460.836000 212.608000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 213.208000 460.836000 217.648000 448.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 217.612000 460.836000 223.348000 448.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 223.408000 460.836000 230.632000 448.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 230.704000 460.836000 238.432000 448.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 238.408000 460.836000 243.220000 448.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 243.808000 460.836000 247.612000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 248.212000 460.836000 255.892000 448.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 255.916000 460.836000 263.140000 448.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 263.116000 460.836000 270.340000 448.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 270.316000 460.836000 276.052000 448.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 276.616000 460.836000 280.420000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 281.020000 460.836000 288.244000 448.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 288.220000 460.836000 295.900000 448.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 295.924000 460.836000 303.016000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 303.028000 460.836000 310.756000 448.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 310.732000 460.836000 316.888000 448.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 317.536000 460.836000 321.340000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 321.940000 460.836000 326.752000 448.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 326.740000 460.836000 333.964000 448.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 334.540000 460.836000 338.344000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 338.944000 460.836000 346.096000 448.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 346.648000 460.836000 350.452000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 351.052000 460.836000 355.864000 448.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 355.948000 460.836000 359.776000 448.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 359.752000 460.836000 363.580000 448.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 363.556000 460.836000 370.648000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 370.660000 460.836000 378.340000 448.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 378.856000 460.836000 382.660000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 383.260000 460.836000 390.352000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 390.364000 460.836000 398.092000 448.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 398.068000 460.836000 402.880000 448.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 402.964000 460.836000 408.700000 448.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 408.664000 460.836000 415.816000 448.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 415.768000 460.836000 423.496000 448.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 423.568000 460.836000 430.288000 448.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 430.264000 460.836000 437.356000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 437.368000 460.836000 447.628000 448.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 447.664000 460.836000 454.816000 448.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.864000 460.836000 461.632000 448.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 459.964000 460.836000 463.768000 448.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.464000 460.836000 468.268000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 468.868000 460.836000 478.696000 448.836000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 478.672000 460.836000 483.484000 448.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 483.568000 460.836000 491.296000 448.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 491.272000 460.836000 498.364000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 498.376000 460.836000 504.112000 448.836000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 460.836000 507.904000 448.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 446.936000 190.312000 434.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 446.936000 198.028000 434.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.100000 446.936000 205.252000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 205.204000 446.936000 212.932000 434.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 214.000000 446.936000 217.804000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 219.004000 446.936000 226.156000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.604000 446.936000 232.408000 434.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 232.500000 446.936000 239.220000 434.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 239.196000 446.936000 246.420000 434.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 246.396000 446.936000 253.548000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 253.596000 446.936000 258.408000 434.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 259.596000 446.936000 263.400000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 264.600000 446.936000 270.336000 434.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 270.300000 446.936000 277.452000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 277.500000 446.936000 284.220000 434.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 284.196000 446.936000 291.456000 434.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 292.596000 446.936000 296.400000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 297.600000 446.936000 304.752000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 304.800000 446.936000 312.528000 434.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 312.504000 446.936000 320.184000 434.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 321.408000 446.936000 325.212000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 326.412000 446.936000 333.564000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 334.716000 446.936000 338.520000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 339.720000 446.936000 344.160000 434.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 344.124000 446.936000 351.216000 434.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 351.228000 446.936000 361.488000 434.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 362.724000 446.936000 366.528000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 367.728000 446.936000 375.408000 434.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 375.432000 446.936000 379.260000 434.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 379.236000 446.936000 386.388000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 386.436000 446.936000 394.164000 434.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 394.140000 446.936000 398.952000 434.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 398.940000 446.936000 405.096000 434.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 406.236000 446.936000 410.040000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 411.240000 446.936000 415.680000 434.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 415.644000 446.936000 422.868000 434.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 422.940000 446.936000 428.676000 434.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 429.840000 446.936000 433.644000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 434.844000 446.936000 442.524000 434.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 442.548000 446.936000 449.640000 434.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 449.652000 446.936000 456.372000 434.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 456.348000 446.936000 463.572000 434.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 463.548000 446.936000 469.284000 434.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 469.344000 446.936000 476.496000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 476.448000 446.936000 481.260000 434.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 481.248000 446.936000 485.076000 434.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 485.148000 446.936000 492.372000 434.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 492.348000 446.936000 500.076000 434.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 500.052000 446.936000 503.856000 434.936000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 446.936000 507.904000 434.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 433.036000 190.312000 421.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 433.036000 198.028000 421.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.004000 433.036000 205.096000 421.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 205.108000 433.036000 210.844000 421.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 210.808000 433.036000 217.900000 421.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 217.912000 433.036000 221.716000 421.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 221.716000 433.036000 225.544000 421.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 225.520000 433.036000 231.676000 421.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 231.724000 433.036000 239.452000 421.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 239.428000 433.036000 242.716000 421.036000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 242.728000 433.036000 247.540000 421.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 247.528000 433.036000 251.332000 421.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 251.332000 433.036000 262.708000 421.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 262.732000 433.036000 270.460000 421.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 270.436000 433.036000 277.156000 421.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 277.132000 433.036000 284.860000 421.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 284.836000 433.036000 288.640000 421.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.640000 433.036000 295.732000 421.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 295.744000 433.036000 299.572000 421.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 299.548000 433.036000 305.704000 421.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 305.752000 433.036000 312.844000 421.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 312.856000 433.036000 316.660000 421.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 316.660000 433.036000 321.472000 421.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 321.460000 433.036000 328.684000 421.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 328.660000 433.036000 332.464000 421.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 332.464000 433.036000 338.620000 421.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 338.668000 433.036000 345.760000 421.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 345.772000 433.036000 352.864000 421.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 352.876000 433.036000 356.680000 421.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 356.680000 433.036000 364.408000 421.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 364.384000 433.036000 371.476000 421.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 371.488000 433.036000 377.224000 421.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 377.188000 433.036000 384.280000 421.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 384.292000 433.036000 388.096000 421.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 413.136000 190.240000 401.136000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 190.204000 413.136000 197.932000 401.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 198.604000 413.136000 202.408000 401.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 203.008000 413.136000 207.820000 401.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 207.808000 413.136000 215.536000 401.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 215.608000 413.136000 222.700000 401.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 223.204000 413.136000 227.008000 401.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 227.800000 413.136000 235.528000 401.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 235.504000 413.136000 242.656000 401.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 242.608000 413.136000 246.436000 401.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 246.412000 413.136000 250.240000 401.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 250.312000 413.136000 260.572000 401.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 260.512000 413.136000 267.664000 401.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 267.712000 413.136000 274.480000 401.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 272.908000 413.136000 276.712000 401.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 277.312000 413.136000 281.116000 401.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 281.716000 413.136000 285.544000 401.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 285.520000 413.136000 290.332000 401.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 291.016000 413.136000 294.820000 401.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 295.516000 413.136000 303.196000 401.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 303.220000 413.136000 310.312000 401.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 310.324000 413.136000 318.004000 401.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 318.028000 413.136000 321.856000 401.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 321.832000 413.136000 329.560000 401.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 329.536000 413.136000 335.692000 401.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 336.340000 413.136000 340.144000 401.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 340.744000 413.136000 345.556000 401.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 345.544000 413.136000 352.768000 401.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 353.440000 413.136000 357.244000 401.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 357.940000 413.136000 365.620000 401.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 365.644000 413.136000 372.736000 401.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 372.748000 413.136000 377.560000 401.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 378.148000 413.136000 381.952000 401.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 382.552000 413.136000 389.704000 401.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 390.352000 413.136000 394.156000 401.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 394.852000 413.136000 402.532000 401.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 402.556000 413.136000 406.384000 401.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 406.360000 413.136000 411.172000 401.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 411.760000 413.136000 415.564000 401.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 416.164000 413.136000 427.540000 401.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 427.564000 413.136000 434.788000 401.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 434.764000 413.136000 440.500000 401.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 440.464000 413.136000 447.556000 401.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 448.264000 413.136000 452.068000 401.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 452.764000 413.136000 456.592000 401.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 456.568000 413.136000 464.296000 401.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 464.368000 413.136000 469.180000 401.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 469.168000 413.136000 476.260000 401.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 476.272000 413.136000 482.008000 401.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 481.972000 413.136000 489.064000 401.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 489.076000 413.136000 495.232000 401.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 495.280000 413.136000 500.092000 401.136000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.100000 413.136000 504.144000 401.136000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 399.236000 189.328000 387.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 189.304000 399.236000 197.032000 387.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 197.104000 399.236000 204.784000 387.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 204.700000 399.236000 208.504000 387.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 209.500000 399.236000 213.304000 387.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 214.204000 399.236000 223.012000 387.236000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 223.000000 399.236000 230.224000 387.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 230.200000 399.236000 235.012000 387.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 235.096000 399.236000 242.824000 387.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 243.700000 399.236000 247.504000 387.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 248.404000 399.236000 258.664000 387.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 258.700000 399.236000 265.852000 387.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 265.804000 399.236000 269.632000 387.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 269.704000 399.236000 273.532000 387.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 273.508000 399.236000 279.664000 387.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 280.504000 399.236000 284.308000 387.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 285.304000 399.236000 292.456000 387.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 292.504000 399.236000 298.240000 387.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 298.204000 399.236000 305.296000 387.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 306.208000 399.236000 310.012000 387.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 310.912000 399.236000 314.740000 387.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 314.716000 399.236000 318.544000 387.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 318.520000 399.236000 326.248000 387.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 326.224000 399.236000 333.316000 387.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 333.328000 399.236000 341.008000 387.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 342.028000 399.236000 345.832000 387.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 346.732000 399.236000 356.992000 387.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 357.028000 399.236000 360.856000 387.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 360.832000 399.236000 365.644000 387.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 365.632000 399.236000 373.360000 387.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 374.236000 399.236000 378.040000 387.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 378.940000 399.236000 386.092000 387.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 387.040000 399.236000 390.844000 387.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 391.744000 399.236000 398.464000 387.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 398.440000 399.236000 405.664000 387.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 405.640000 399.236000 409.468000 387.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 409.540000 399.236000 413.368000 387.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 413.344000 399.236000 420.436000 387.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 420.448000 399.236000 427.168000 387.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 427.144000 399.236000 431.956000 387.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 432.040000 399.236000 435.868000 387.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 435.844000 399.236000 443.068000 387.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 443.044000 399.236000 450.772000 387.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 451.744000 399.236000 455.548000 387.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 456.448000 399.236000 463.672000 387.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 463.648000 399.236000 468.088000 387.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 468.952000 399.236000 472.756000 387.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 473.752000 399.236000 485.128000 387.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 485.056000 399.236000 492.280000 387.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 492.352000 399.236000 500.032000 387.236000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 399.236000 504.044000 387.236000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 385.336000 192.592000 373.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 192.604000 385.336000 198.340000 373.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 198.304000 385.336000 206.032000 373.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 207.208000 385.336000 211.012000 373.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 212.212000 385.336000 219.364000 373.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 219.412000 385.336000 225.148000 373.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 225.112000 385.336000 229.924000 373.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 231.016000 385.336000 234.820000 373.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 236.020000 385.336000 240.460000 373.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 240.424000 385.336000 246.160000 373.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 246.220000 385.336000 253.444000 373.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 253.420000 385.336000 264.796000 373.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 265.924000 385.336000 269.728000 373.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 270.928000 385.336000 278.080000 373.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 278.128000 385.336000 283.864000 373.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 283.828000 385.336000 288.640000 373.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 288.628000 385.336000 292.456000 373.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 292.528000 385.336000 298.684000 373.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 298.624000 385.336000 303.436000 373.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 303.424000 385.336000 309.580000 373.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 310.720000 385.336000 314.524000 373.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 315.724000 385.336000 321.880000 373.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 321.928000 385.336000 329.656000 373.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 329.632000 385.336000 336.352000 373.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 336.328000 385.336000 344.056000 373.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 345.124000 385.336000 348.928000 373.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 350.224000 385.336000 357.376000 373.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 357.424000 385.336000 363.580000 373.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 364.624000 385.336000 368.428000 373.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 369.628000 385.336000 378.292000 373.336000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 378.328000 385.336000 386.056000 373.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 386.032000 385.336000 393.712000 373.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 393.736000 385.336000 400.504000 373.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 401.536000 385.336000 405.340000 373.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 406.636000 385.336000 418.960000 373.336000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 417.832000 385.336000 424.984000 373.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 425.032000 385.336000 430.768000 373.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 430.732000 385.336000 438.460000 373.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 438.532000 385.336000 445.756000 373.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 445.732000 385.336000 449.560000 373.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 450.628000 385.336000 454.432000 373.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 455.632000 385.336000 462.784000 373.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 462.832000 385.336000 470.560000 373.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 470.536000 385.336000 478.216000 373.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 479.332000 385.336000 483.136000 373.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.336000 385.336000 489.148000 373.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.136000 385.336000 496.864000 373.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.936000 385.336000 504.028000 373.336000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 385.336000 507.904000 373.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 371.436000 189.328000 359.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 189.304000 371.436000 193.132000 359.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 193.204000 371.436000 200.464000 359.436000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 200.404000 371.436000 207.496000 359.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 207.508000 371.436000 211.312000 359.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 213.112000 371.436000 216.916000 359.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 218.716000 371.436000 227.380000 359.436000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 227.416000 371.436000 235.144000 359.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 236.920000 371.436000 240.724000 359.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 242.524000 371.436000 249.616000 359.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 249.628000 371.436000 256.384000 359.436000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 256.432000 371.436000 261.244000 359.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 261.232000 371.436000 266.968000 359.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 266.932000 371.436000 274.084000 359.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 274.132000 371.436000 280.900000 359.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 280.936000 371.436000 288.088000 359.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 288.040000 371.436000 295.720000 359.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 295.744000 371.436000 302.896000 359.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 302.944000 371.436000 310.672000 359.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 310.648000 371.436000 315.460000 359.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 317.152000 371.436000 320.956000 359.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 322.756000 371.436000 326.584000 359.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 326.560000 371.436000 330.388000 359.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 330.460000 371.436000 338.140000 359.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 338.164000 371.436000 345.892000 359.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 345.868000 371.436000 350.680000 359.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 350.668000 371.436000 354.496000 359.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 354.472000 371.436000 362.200000 359.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 362.272000 371.436000 369.952000 359.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 371.776000 371.436000 375.580000 359.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.380000 371.436000 383.536000 359.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 383.584000 371.436000 390.352000 359.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 390.280000 371.436000 396.436000 359.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 396.484000 371.436000 401.296000 359.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 401.284000 371.436000 408.376000 359.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 408.388000 371.436000 419.764000 359.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 421.492000 371.436000 425.296000 359.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 427.096000 371.436000 434.776000 359.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 434.800000 371.436000 440.536000 359.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 440.500000 371.436000 447.724000 359.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 447.700000 371.436000 454.468000 359.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 454.504000 371.436000 458.332000 359.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 458.404000 371.436000 466.084000 359.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 466.000000 371.436000 473.092000 359.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 473.104000 371.436000 479.260000 359.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 481.108000 371.436000 484.912000 359.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 486.712000 371.436000 491.152000 359.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 491.116000 371.436000 498.340000 359.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 498.412000 371.436000 504.148000 359.436000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 371.436000 508.004000 359.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 357.536000 190.312000 345.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 357.536000 198.028000 345.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.100000 357.536000 205.192000 345.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 206.200000 357.536000 210.004000 345.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 211.096000 357.536000 218.248000 345.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 218.296000 357.536000 225.976000 345.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 225.892000 357.536000 233.572000 345.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 233.596000 357.536000 239.332000 345.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 239.392000 357.536000 246.616000 345.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 246.496000 357.536000 254.176000 345.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 254.200000 357.536000 259.936000 345.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 259.996000 357.536000 263.824000 345.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 263.800000 357.536000 270.952000 345.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 271.000000 357.536000 275.812000 345.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 275.800000 357.536000 282.892000 345.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 283.900000 357.536000 287.704000 345.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.796000 357.536000 295.948000 345.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 295.996000 357.536000 300.808000 345.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 300.796000 357.536000 312.172000 345.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 312.196000 357.536000 319.420000 345.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 319.396000 357.536000 325.552000 345.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 325.492000 357.536000 333.172000 345.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 333.196000 357.536000 340.924000 345.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 340.900000 357.536000 347.992000 345.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 348.100000 357.536000 353.836000 345.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 353.800000 357.536000 360.892000 345.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 360.904000 357.536000 364.708000 345.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.704000 357.536000 369.508000 345.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.600000 357.536000 381.064000 345.536000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 381.100000 357.536000 388.252000 345.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 388.204000 357.536000 392.032000 345.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 392.104000 357.536000 396.544000 345.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 396.508000 357.536000 406.768000 345.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 406.804000 357.536000 413.956000 345.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 413.908000 357.536000 420.676000 345.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 421.708000 357.536000 425.512000 345.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 426.604000 357.536000 431.416000 345.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 431.500000 357.536000 438.724000 345.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 439.696000 357.536000 443.500000 345.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 444.592000 357.536000 449.404000 345.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 449.392000 357.536000 457.120000 345.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 457.192000 357.536000 464.284000 345.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 465.196000 357.536000 469.000000 345.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 470.200000 357.536000 474.028000 345.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 474.004000 357.536000 477.832000 345.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 477.808000 357.536000 484.576000 345.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 484.612000 357.536000 488.440000 345.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 488.416000 357.536000 496.144000 345.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 496.120000 357.536000 503.800000 345.536000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 357.536000 507.904000 345.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 343.636000 191.236000 331.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 191.200000 343.636000 198.424000 331.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 198.496000 343.636000 205.720000 331.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 205.696000 343.636000 217.072000 331.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 217.096000 343.636000 220.900000 331.636000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 221.092000 343.636000 224.896000 331.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 225.088000 343.636000 232.240000 331.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 232.384000 343.636000 236.188000 331.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 236.488000 343.636000 244.120000 331.636000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 244.084000 343.636000 251.716000 331.636000 1.000000 0.000000 0.000000 1.000000 0
+drawChar 251.788000 343.636000 259.420000 331.636000 1.000000 0.000000 0.000000 1.000000 0
+drawChar 259.588000 343.636000 263.392000 331.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 263.584000 343.636000 270.352000 331.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 270.388000 343.636000 277.480000 331.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 277.492000 343.636000 284.644000 331.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 284.596000 343.636000 290.332000 331.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 290.596000 343.636000 294.400000 331.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 294.592000 343.636000 301.816000 331.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 301.792000 343.636000 305.620000 331.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 305.692000 343.636000 313.372000 331.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 313.492000 343.636000 317.296000 331.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 317.488000 343.636000 324.208000 331.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 324.184000 343.636000 329.920000 331.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 329.980000 343.636000 336.748000 331.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 336.676000 343.636000 342.832000 331.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 342.880000 343.636000 347.692000 331.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 347.680000 343.636000 354.832000 331.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 354.880000 343.636000 358.708000 331.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 358.876000 343.636000 362.680000 331.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 362.872000 343.636000 374.248000 331.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 374.272000 343.636000 378.100000 331.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 378.172000 343.636000 383.908000 331.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 383.872000 343.636000 389.608000 331.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 389.668000 343.636000 396.892000 331.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 396.868000 343.636000 402.604000 331.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 402.772000 343.636000 406.576000 331.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 406.768000 343.636000 413.920000 331.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 413.968000 343.636000 420.688000 331.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 420.664000 343.636000 427.384000 331.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 427.360000 343.636000 434.452000 331.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 434.464000 343.636000 442.192000 331.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 442.168000 343.636000 446.980000 331.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 446.968000 343.636000 454.696000 331.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 454.768000 343.636000 461.920000 331.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 461.872000 343.636000 466.684000 331.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 466.768000 343.636000 473.860000 331.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 473.872000 343.636000 480.028000 331.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 480.172000 343.636000 483.976000 331.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.168000 343.636000 488.980000 331.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.064000 343.636000 496.792000 331.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.768000 343.636000 503.860000 331.636000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 343.636000 507.904000 331.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 329.736000 191.656000 317.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 329.736000 196.516000 317.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 196.504000 329.736000 203.656000 317.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 203.704000 329.736000 209.440000 317.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 209.404000 329.736000 216.664000 317.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 216.700000 329.736000 220.504000 317.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 220.504000 329.736000 227.224000 317.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 227.200000 329.736000 234.424000 317.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 234.400000 329.736000 242.128000 317.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 242.104000 329.736000 246.916000 317.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 246.904000 329.736000 252.640000 317.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 252.604000 329.736000 259.756000 317.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 259.804000 329.736000 265.960000 317.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 266.008000 329.736000 270.820000 317.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 270.808000 329.736000 274.612000 317.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 274.612000 329.736000 279.424000 317.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 279.412000 329.736000 286.636000 317.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 286.612000 329.736000 290.416000 317.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 290.416000 329.736000 295.228000 317.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 295.216000 329.736000 302.944000 317.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 302.920000 329.736000 310.012000 317.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 310.024000 329.736000 313.828000 317.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 313.828000 329.736000 321.892000 317.736000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 321.424000 329.736000 328.648000 317.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 328.624000 329.736000 336.304000 317.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 336.328000 329.736000 340.372000 317.736000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 340.432000 329.736000 347.584000 317.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 347.632000 329.736000 353.368000 317.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 353.332000 329.736000 358.144000 317.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 358.132000 329.736000 361.936000 317.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 361.936000 329.736000 365.740000 317.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 309.836000 193.816000 297.836000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 193.204000 309.836000 200.428000 297.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 200.404000 309.836000 208.132000 297.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 208.108000 309.836000 213.844000 297.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 214.108000 309.836000 217.912000 297.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 218.104000 309.836000 222.916000 297.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 222.904000 309.836000 230.056000 297.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 230.104000 309.836000 233.932000 297.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 233.908000 309.836000 237.736000 297.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 237.904000 309.836000 241.708000 297.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 242.008000 309.836000 249.160000 297.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 249.208000 309.836000 254.944000 297.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 254.908000 309.836000 261.628000 297.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 261.712000 309.836000 269.440000 297.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 269.416000 309.836000 279.676000 297.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 279.712000 309.836000 286.864000 297.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 286.912000 309.836000 293.680000 297.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 293.608000 309.836000 299.764000 297.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 299.908000 309.836000 303.712000 297.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 304.012000 309.836000 311.236000 297.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 311.212000 309.836000 318.892000 297.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 318.916000 309.836000 326.008000 297.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 326.020000 309.836000 333.748000 297.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 333.916000 309.836000 337.720000 297.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 338.020000 309.836000 345.748000 297.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 345.724000 309.836000 353.404000 297.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 353.620000 309.836000 357.424000 297.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 357.616000 309.836000 362.428000 297.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 362.512000 309.836000 369.736000 297.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 369.916000 309.836000 373.720000 297.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 374.020000 309.836000 378.832000 297.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 378.820000 309.836000 386.548000 297.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 386.620000 309.836000 393.712000 297.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 393.820000 309.836000 397.624000 297.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 397.924000 309.836000 404.692000 297.836000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 404.620000 309.836000 411.772000 297.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 411.820000 309.836000 417.556000 297.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 417.520000 309.836000 421.348000 297.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 421.324000 309.836000 428.548000 297.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 428.620000 309.836000 436.348000 297.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 436.324000 309.836000 442.480000 297.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 442.720000 309.836000 446.524000 297.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 446.824000 309.836000 452.560000 297.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 452.524000 309.836000 459.748000 297.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 459.820000 309.836000 467.044000 297.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 467.020000 309.836000 478.396000 297.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 478.420000 309.836000 484.576000 297.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 484.720000 309.836000 488.524000 297.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 488.716000 309.836000 495.940000 297.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 496.012000 309.836000 503.740000 297.836000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 309.836000 507.904000 297.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 295.936000 190.312000 283.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 295.936000 198.028000 283.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.100000 295.936000 205.192000 283.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 205.804000 295.936000 209.608000 283.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 210.304000 295.936000 217.984000 283.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 217.900000 295.936000 223.636000 283.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 223.600000 295.936000 230.824000 283.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 230.896000 295.936000 238.624000 283.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 238.600000 295.936000 246.328000 283.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 246.400000 295.936000 254.080000 283.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 254.704000 295.936000 258.508000 283.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 259.900000 295.936000 267.892000 283.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 267.304000 295.936000 274.528000 283.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 274.504000 295.936000 281.728000 283.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 281.800000 295.936000 287.536000 283.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 286.204000 295.936000 290.008000 283.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 290.500000 295.936000 294.304000 283.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 295.096000 295.936000 303.088000 283.936000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 303.100000 295.936000 310.828000 283.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 310.804000 295.936000 317.896000 283.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 318.604000 295.936000 322.408000 283.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 323.104000 295.936000 330.832000 283.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 330.808000 295.936000 337.960000 283.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 338.008000 295.936000 341.836000 283.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 341.812000 295.936000 345.640000 283.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 345.712000 295.936000 355.972000 283.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 355.912000 295.936000 363.064000 283.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 363.112000 295.936000 369.880000 283.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 370.516000 295.936000 374.320000 283.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 375.016000 295.936000 382.108000 283.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 382.120000 295.936000 389.848000 283.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 389.824000 295.936000 397.504000 283.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 397.528000 295.936000 403.684000 283.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 404.428000 295.936000 408.232000 283.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 408.928000 295.936000 416.080000 283.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 416.128000 295.936000 420.940000 283.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 421.528000 295.936000 425.332000 283.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 426.028000 295.936000 430.840000 283.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 430.828000 295.936000 438.556000 283.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 438.628000 295.936000 445.720000 283.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 446.332000 295.936000 450.136000 283.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 450.832000 295.936000 455.272000 283.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 455.236000 295.936000 462.460000 283.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 462.532000 295.936000 469.756000 283.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 469.732000 295.936000 474.544000 283.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 475.132000 295.936000 478.936000 283.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 479.728000 295.936000 486.952000 283.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 486.928000 295.936000 491.368000 283.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 492.028000 295.936000 495.832000 283.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 496.528000 295.936000 503.680000 283.936000 1.000000 0.000000 0.000000 1.000000 a
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 295.936000 508.004000 283.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 282.036000 195.760000 270.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 195.796000 282.036000 203.020000 270.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 202.996000 282.036000 210.220000 270.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 210.196000 282.036000 217.876000 270.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 217.900000 282.036000 224.992000 270.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 225.004000 282.036000 232.732000 270.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 235.204000 282.036000 239.008000 270.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 241.600000 282.036000 247.756000 270.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 247.804000 282.036000 255.484000 270.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 255.400000 282.036000 259.228000 270.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 259.300000 282.036000 265.036000 270.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 265.096000 282.036000 272.248000 270.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 272.296000 282.036000 276.124000 270.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 278.692000 282.036000 282.496000 270.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 285.088000 282.036000 291.244000 270.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 291.292000 282.036000 296.104000 270.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 295.996000 282.036000 303.148000 270.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 303.196000 282.036000 307.024000 270.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 307.000000 282.036000 312.736000 270.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 312.700000 282.036000 319.420000 270.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 319.396000 282.036000 326.548000 270.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 326.692000 282.036000 332.848000 270.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 332.896000 282.036000 339.988000 270.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 340.000000 282.036000 343.804000 270.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 346.204000 282.036000 350.008000 270.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 352.600000 282.036000 362.860000 270.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 362.896000 282.036000 370.624000 270.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 370.600000 282.036000 374.428000 270.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 374.404000 282.036000 381.124000 270.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 381.208000 282.036000 388.936000 270.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 391.504000 282.036000 395.308000 270.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 397.900000 282.036000 401.728000 270.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 401.704000 282.036000 408.796000 270.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 408.808000 282.036000 415.960000 270.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 416.008000 282.036000 423.688000 270.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 423.712000 282.036000 429.868000 270.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 432.412000 282.036000 436.216000 270.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.808000 282.036000 446.536000 270.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 446.512000 282.036000 454.192000 270.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 456.808000 282.036000 460.612000 270.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 463.204000 282.036000 468.016000 270.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 468.004000 282.036000 475.228000 270.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 477.808000 282.036000 481.612000 270.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.204000 282.036000 489.016000 270.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.004000 282.036000 496.732000 270.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.804000 282.036000 503.896000 270.036000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 282.036000 507.904000 270.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 268.136000 191.656000 256.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 268.136000 198.796000 256.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 198.808000 268.136000 205.528000 256.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 205.504000 268.136000 212.728000 256.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 212.704000 268.136000 220.432000 256.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 220.408000 268.136000 228.088000 256.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 228.112000 268.136000 231.916000 256.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 231.916000 268.136000 239.908000 256.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 239.920000 268.136000 247.144000 256.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 247.120000 268.136000 254.344000 256.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 254.320000 268.136000 260.056000 256.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 258.724000 268.136000 262.528000 256.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.528000 268.136000 266.332000 256.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1400.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 236.392000 81.018000 222.392000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 81.004000 236.392000 85.792000 222.392000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 85.806000 236.392000 94.920000 222.392000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 94.906000 236.392000 99.694000 222.392000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 99.708000 236.392000 109.662000 222.392000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.704000 236.392000 119.714000 222.392000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 119.700000 236.392000 124.572000 222.392000 1.000000 0.000000 0.000000 1.000000
+drawChar 124.600000 236.392000 135.380000 222.392000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 135.394000 236.392000 145.012000 222.392000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 144.998000 236.392000 154.616000 222.392000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 154.602000 236.392000 169.176000 222.392000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 214.136000 195.604000 202.136000 1.000000 0.000000 0.000000 1.000000 U
+drawChar 195.604000 214.136000 203.284000 202.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 203.308000 214.136000 210.532000 202.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 210.508000 214.136000 218.236000 202.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 219.808000 214.136000 223.612000 202.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 225.412000 214.136000 232.504000 202.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 232.516000 214.136000 240.244000 202.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 240.220000 214.136000 245.032000 202.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 245.116000 214.136000 252.208000 202.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 252.220000 214.136000 257.956000 202.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 257.920000 214.136000 261.748000 202.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 261.724000 214.136000 269.452000 202.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 269.524000 214.136000 277.204000 202.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 278.728000 214.136000 282.532000 202.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 284.224000 214.136000 289.036000 202.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 289.024000 214.136000 296.752000 202.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 296.824000 214.136000 303.916000 202.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 305.524000 214.136000 309.328000 202.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 311.020000 214.136000 314.848000 202.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 314.824000 214.136000 318.652000 202.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 318.724000 214.136000 325.492000 202.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 325.528000 214.136000 329.356000 202.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 329.332000 214.136000 337.060000 202.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 337.036000 214.136000 344.716000 202.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 346.336000 214.136000 350.140000 202.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 351.832000 214.136000 357.568000 202.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 357.532000 214.136000 364.756000 202.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 364.828000 214.136000 372.052000 202.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 372.028000 214.136000 383.404000 202.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 383.428000 214.136000 387.232000 202.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 388.828000 214.136000 392.632000 202.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 394.324000 214.136000 399.136000 202.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 399.124000 214.136000 406.852000 202.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 406.924000 214.136000 414.016000 202.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 415.528000 214.136000 419.332000 202.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 422.632000 214.136000 430.624000 202.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 429.136000 214.136000 434.872000 202.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 434.836000 214.136000 440.992000 202.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 441.040000 214.136000 445.852000 202.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 447.436000 214.136000 451.240000 202.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 452.932000 214.136000 457.744000 202.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 457.732000 214.136000 465.460000 202.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 465.532000 214.136000 469.360000 202.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 469.336000 214.136000 477.064000 202.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 477.040000 214.136000 484.720000 202.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 486.340000 214.136000 490.144000 202.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 491.836000 214.136000 496.648000 202.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 496.636000 214.136000 503.860000 202.136000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 214.136000 507.904000 202.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 200.236000 192.220000 188.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 192.196000 200.236000 199.348000 188.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 199.396000 200.236000 204.208000 188.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 204.196000 200.236000 210.916000 188.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 210.892000 200.236000 218.620000 188.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 219.088000 200.236000 222.892000 188.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 223.492000 200.236000 228.304000 188.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 228.292000 200.236000 236.020000 188.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 236.092000 200.236000 243.184000 188.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 243.592000 200.236000 247.396000 188.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 247.888000 200.236000 254.980000 188.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 254.992000 200.236000 261.760000 188.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 261.796000 200.236000 268.888000 188.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 269.392000 200.236000 273.196000 188.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 273.688000 200.236000 277.516000 188.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 277.492000 200.236000 283.648000 188.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 284.188000 200.236000 287.992000 188.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.484000 200.236000 295.636000 188.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 296.188000 200.236000 299.992000 188.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 300.484000 200.236000 304.924000 188.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 304.888000 200.236000 312.616000 188.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 312.688000 200.236000 316.516000 188.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 316.492000 200.236000 320.320000 188.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 320.296000 200.236000 324.340000 188.236000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 324.400000 200.236000 330.556000 188.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 330.604000 200.236000 334.432000 188.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 334.408000 200.236000 340.720000 188.236000 1.000000 0.000000 0.000000 1.000000 z
+drawChar 340.708000 200.236000 347.800000 188.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 348.808000 200.236000 352.612000 188.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 352.600000 200.236000 360.280000 188.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 360.304000 200.236000 367.456000 188.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 367.408000 200.236000 375.136000 188.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 375.208000 200.236000 382.432000 188.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 382.408000 200.236000 388.144000 188.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.108000 200.236000 395.260000 188.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 395.308000 200.236000 406.684000 188.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 406.708000 200.236000 413.860000 188.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 414.304000 200.236000 418.108000 188.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 418.600000 200.236000 428.860000 188.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 428.896000 200.236000 432.724000 188.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 432.700000 200.236000 440.428000 188.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 440.404000 200.236000 448.084000 188.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 448.108000 200.236000 455.332000 188.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 455.308000 200.236000 465.568000 188.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 464.212000 200.236000 468.016000 188.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.508000 200.236000 472.312000 188.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 472.804000 200.236000 481.468000 188.236000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 481.300000 200.236000 485.128000 188.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 485.104000 200.236000 491.260000 188.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 491.308000 200.236000 495.136000 188.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 495.112000 200.236000 499.924000 188.236000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 200.236000 504.044000 188.236000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 186.336000 192.724000 174.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 192.700000 186.336000 198.436000 174.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 198.496000 186.336000 204.652000 174.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 205.192000 186.336000 208.996000 174.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 209.692000 186.336000 216.844000 174.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 216.892000 186.336000 222.628000 174.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 222.592000 186.336000 229.684000 174.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 230.296000 186.336000 234.100000 174.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 234.796000 186.336000 241.948000 174.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 241.996000 186.336000 245.824000 174.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 245.800000 186.336000 256.060000 174.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 256.096000 186.336000 263.248000 174.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 263.296000 186.336000 270.064000 174.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 269.992000 186.336000 276.148000 174.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 276.796000 186.336000 280.600000 174.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 281.296000 186.336000 285.124000 174.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 285.100000 186.336000 296.476000 174.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 296.500000 186.336000 304.180000 174.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 304.204000 186.336000 309.940000 174.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 309.904000 186.336000 316.996000 174.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 317.008000 186.336000 323.164000 174.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 323.212000 186.336000 329.368000 174.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 329.416000 186.336000 336.508000 174.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 336.520000 186.336000 344.200000 174.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 344.716000 186.336000 348.520000 174.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 349.312000 186.336000 356.992000 174.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 356.908000 186.336000 363.676000 174.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 364.312000 186.336000 368.116000 174.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 368.812000 186.336000 373.624000 174.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 373.708000 186.336000 381.436000 174.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 381.412000 186.336000 388.504000 174.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 389.116000 186.336000 392.920000 174.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 393.616000 186.336000 401.296000 174.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 401.320000 186.336000 407.056000 174.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 407.020000 186.336000 414.172000 174.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 414.220000 186.336000 421.948000 174.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 421.924000 186.336000 429.604000 174.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 429.628000 186.336000 433.456000 174.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 433.432000 186.336000 440.656000 174.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 440.632000 186.336000 446.788000 174.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 446.836000 186.336000 453.928000 174.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 454.540000 186.336000 458.344000 174.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 459.040000 186.336000 465.808000 174.336000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 465.844000 186.336000 469.672000 174.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 469.648000 186.336000 476.740000 174.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 476.752000 186.336000 487.012000 174.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 487.648000 186.336000 491.452000 174.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 492.148000 186.336000 499.372000 174.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 499.444000 186.336000 503.884000 174.336000 1.000000 0.000000 0.000000 1.000000 f
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 186.336000 507.904000 174.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 172.436000 190.312000 160.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 172.436000 198.028000 160.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.004000 172.436000 205.096000 160.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 205.108000 172.436000 208.912000 160.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 208.912000 172.436000 217.720000 160.436000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 217.708000 172.436000 224.860000 160.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 224.908000 172.436000 231.676000 160.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 231.712000 172.436000 235.516000 160.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 235.516000 172.436000 240.328000 160.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 240.316000 172.436000 248.044000 160.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 248.020000 172.436000 255.112000 160.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 255.124000 172.436000 258.928000 160.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 258.928000 172.436000 269.188000 160.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 269.224000 172.436000 273.052000 160.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 273.028000 172.436000 280.756000 160.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 280.732000 172.436000 288.412000 160.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 288.436000 172.436000 295.660000 160.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 295.636000 172.436000 305.896000 160.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 305.932000 172.436000 309.736000 160.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 309.736000 172.436000 316.960000 160.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 316.936000 172.436000 325.456000 160.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 325.432000 172.436000 332.524000 160.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 332.536000 172.436000 338.272000 160.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 338.236000 172.436000 344.392000 160.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.440000 172.436000 348.244000 160.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.244000 172.436000 352.048000 160.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 463.300000 86.136000 471.364000 74.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 470.800000 86.136000 477.952000 74.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 478.000000 86.136000 485.680000 74.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 485.704000 86.136000 492.796000 74.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 492.808000 86.136000 496.612000 74.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 496.600000 86.136000 504.232000 74.136000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 1909.200000 0 477.900000 1909.200000 0 477.900000 2219.000000 0 134.300000 2219.000000 0 134.300000 1909.200000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -111730.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -1079.900000 0 168.100000 -1079.900000 0 168.100000 -1074.900000 0 76.900000 -1074.900000 0 76.900000 -1079.900000 0
+eoFillPath subpath 1 163.100000 -1075.000000 0 168.100000 -1075.000000 0 168.100000 -944.400000 0 163.100000 -944.400000 0 163.100000 -1075.000000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -1074.900000 0 163.100000 -1074.900000 0 163.100000 -939.500000 0 72.000000 -939.500000 0 72.000000 -1074.900000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 -943.820000 87.320000 -953.820000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 -943.820000 93.420000 -953.820000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 -943.820000 97.510000 -953.820000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 -943.820000 101.420000 -953.820000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 -943.820000 104.170000 -953.820000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 -943.820000 110.530000 -953.820000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 -943.820000 113.270000 -953.820000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 -943.820000 116.470000 -953.820000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 -943.820000 123.480000 -953.820000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 -943.820000 129.610000 -953.820000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 -943.820000 135.090000 -953.820000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 -943.820000 140.890000 -953.820000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 -943.820000 144.820000 -953.820000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 -943.820000 150.920000 -953.820000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 -943.820000 153.670000 -953.820000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 -943.820000 156.470000 -953.820000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -1070.700000 0 168.200000 -1070.700000 0 168.200000 -955.500000 0 72.000000 -955.500000 0 72.000000 -1070.700000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1002.548000 79.253000 -1011.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 -1002.548000 86.669000 -1011.548000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 -1002.548000 90.215000 -1011.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 -1002.548000 93.077000 -1011.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 -1002.548000 97.406000 -1011.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 -1002.548000 100.853000 -1011.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 -1002.548000 107.324000 -1011.548000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 -1002.548000 112.337000 -1011.548000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 -1002.548000 115.271000 -1011.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 -1002.548000 118.655000 -1011.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 -1002.548000 126.512000 -1011.548000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 -1002.548000 130.805000 -1011.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 -1002.548000 135.881000 -1011.548000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 -1002.548000 139.355000 -1011.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 -1002.548000 147.284000 -1011.548000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 -1002.548000 150.074000 -1011.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 -1002.548000 155.897000 -1011.548000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 -1002.548000 158.750000 -1011.548000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -1002.548000 161.853000 -1011.548000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1013.048000 82.124000 -1022.048000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 -1013.048000 87.137000 -1022.048000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 -1013.048000 90.071000 -1022.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 -1013.048000 93.356000 -1022.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 -1013.048000 100.403000 -1022.048000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 -1013.048000 104.921000 -1022.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 -1013.048000 109.205000 -1022.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 -1013.048000 117.737000 -1022.048000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 -1013.048000 123.119000 -1022.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 -1013.048000 128.996000 -1022.048000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 -1013.048000 132.605000 -1022.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 -1013.048000 138.392000 -1022.048000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 -1013.048000 141.749000 -1022.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 -1013.048000 149.507000 -1022.048000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 -1013.048000 153.800000 -1022.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 -1013.048000 158.876000 -1022.048000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -1013.048000 161.853000 -1022.048000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1023.548000 81.764000 -1032.548000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -1023.548000 87.596000 -1032.548000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 -1023.548000 93.356000 -1032.548000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 -1023.548000 102.050000 -1032.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 -1023.548000 113.822000 -1032.548000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 -1023.548000 122.651000 -1032.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 -1023.548000 134.117000 -1032.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 -1023.548000 138.401000 -1032.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 -1023.548000 147.149000 -1032.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 -1023.548000 158.921000 -1032.548000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -1023.548000 161.853000 -1032.548000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1034.048000 79.271000 -1043.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -1034.048000 84.338000 -1043.048000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 -1034.048000 89.621000 -1043.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 -1034.048000 94.643000 -1043.048000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 -1034.048000 100.502000 -1043.048000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 -1034.048000 106.262000 -1043.048000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 -1034.048000 111.518000 -1043.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 -1034.048000 116.216000 -1043.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 -1034.048000 119.249000 -1043.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 -1034.048000 122.363000 -1043.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 -1034.048000 128.186000 -1043.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 -1034.048000 131.345000 -1043.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 -1034.048000 137.060000 -1043.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 -1034.048000 140.147000 -1043.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 -1034.048000 145.007000 -1043.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 -1034.048000 148.598000 -1043.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 -1034.048000 151.460000 -1043.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 -1034.048000 155.789000 -1043.048000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 -1034.048000 158.933000 -1043.048000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1044.548000 80.702000 -1053.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 -1044.548000 83.573000 -1053.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 -1044.548000 89.396000 -1053.548000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 -1044.548000 95.156000 -1053.548000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 -1044.548000 100.547000 -1053.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 -1044.548000 109.052000 -1053.548000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 -1044.548000 111.959000 -1053.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 -1044.548000 117.251000 -1053.548000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 -1044.548000 121.904000 -1053.548000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 -1044.548000 126.503000 -1053.548000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 -1044.548000 129.338000 -1053.548000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 -1044.548000 134.936000 -1053.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 -1044.548000 143.441000 -1053.548000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 -1044.548000 148.796000 -1053.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 -1044.548000 154.574000 -1053.548000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 -1044.548000 158.876000 -1053.548000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -1044.548000 161.853000 -1053.548000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1055.048000 79.271000 -1064.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -1055.048000 85.094000 -1064.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -1055.048000 88.703000 -1064.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 -1055.048000 94.112000 -1064.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 -1055.048000 97.244000 -1064.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 -1055.048000 103.058000 -1064.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 -1055.048000 108.890000 -1064.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 -1055.048000 111.950000 -1064.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 -1055.048000 115.271000 -1064.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 -1055.048000 120.338000 -1064.048000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 -1055.048000 125.621000 -1064.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 -1055.048000 131.363000 -1064.048000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 -1055.048000 134.558000 -1064.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 -1055.048000 140.048000 -1064.048000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 -1055.048000 145.430000 -1064.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 -1055.048000 150.551000 -1064.048000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 -1055.048000 155.960000 -1064.048000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 -1055.048000 158.933000 -1064.048000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1065.548000 80.009000 -1074.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -1065.548000 85.364000 -1074.548000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 -1065.548000 88.271000 -1074.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 -1065.548000 91.169000 -1074.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 -1065.548000 97.955000 -1074.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 -1065.548000 107.765000 -1074.548000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 -1065.548000 110.672000 -1074.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 -1065.548000 115.964000 -1074.548000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 -1065.548000 120.617000 -1074.548000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 -1065.548000 125.216000 -1074.548000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 -1065.548000 128.051000 -1074.548000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 -1065.548000 134.954000 -1074.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 -1065.548000 146.285000 -1074.548000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 -1065.548000 151.667000 -1074.548000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 -1065.548000 155.906000 -1074.548000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 -1065.548000 159.033000 -1074.548000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -1075.000000 0 72.100000 -1075.000000 0 72.100000 -939.500000 0 72.000000 -939.500000 0 72.000000 -1075.000000 0
+eoFillPath subpath 1 163.100000 -1075.000000 0 163.200000 -1075.000000 0 163.200000 -939.500000 0 163.100000 -939.500000 0 163.100000 -1075.000000 0
+eoFillPath subpath 1 72.000000 -939.600000 0 163.200000 -939.600000 0 163.200000 -939.500000 0 72.000000 -939.500000 0 72.000000 -939.600000 0
+eoFillPath subpath 1 72.000000 -1075.000000 0 163.200000 -1075.000000 0 163.200000 -1074.900000 0 72.000000 -1074.900000 0 72.000000 -1075.000000 0
+saveState
+eoClipPath subpath 1 96.900000 -999.700000 0 138.300000 -999.700000 0 138.300000 -955.500000 0 96.900000 -955.500000 0 96.900000 -999.700000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 179160.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -1354.500000 0 165.500000 -1354.500000 0 165.500000 -1349.500000 0 76.900000 -1349.500000 0 76.900000 -1354.500000 0
+eoFillPath subpath 1 160.500000 -1349.600000 0 165.500000 -1349.600000 0 165.500000 -1193.300000 0 160.500000 -1193.300000 0 160.500000 -1349.600000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -1349.500000 0 121.400000 -1349.500000 0 121.400000 -1188.400000 0 72.000000 -1188.400000 0 72.000000 -1349.500000 0
+saveState
+eoClipPath subpath 1 72.000000 -1349.500000 0 160.500000 -1349.500000 0 160.500000 -1188.400000 0 72.000000 -1188.400000 0 72.000000 -1349.500000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 215860.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 -1192.720000 89.280000 -1202.720000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 -1192.720000 95.630000 -1202.720000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 -1192.720000 99.520000 -1202.720000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 -1192.720000 102.270000 -1202.720000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 -1192.720000 108.450000 -1202.720000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 -1192.720000 112.610000 -1202.720000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 -1192.720000 118.510000 -1202.720000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 -1192.720000 121.670000 -1202.720000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 -1192.720000 124.470000 -1202.720000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 -1192.720000 130.830000 -1202.720000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 -1192.720000 133.970000 -1202.720000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 -1192.720000 137.920000 -1202.720000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 -1192.720000 144.230000 -1202.720000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 -1192.720000 150.350000 -1202.720000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 -1192.720000 153.570000 -1202.720000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 -1204.420000 95.000000 -1214.420000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 -1204.420000 97.770000 -1214.420000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 -1204.420000 103.000000 -1214.420000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 -1204.420000 109.330000 -1214.420000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 -1204.420000 117.470000 -1214.420000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 -1204.420000 123.620000 -1214.420000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 -1204.420000 128.800000 -1214.420000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 -1204.420000 135.130000 -1214.420000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 -1204.420000 141.250000 -1214.420000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 -1204.420000 145.410000 -1214.420000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1219.248000 82.961000 -1228.248000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 -1219.248000 87.614000 -1228.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 -1219.248000 93.356000 -1228.248000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 -1219.248000 98.612000 -1228.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 -1219.248000 103.733000 -1228.248000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 -1219.248000 106.568000 -1228.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 -1219.248000 111.959000 -1228.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 -1219.248000 114.866000 -1228.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 -1219.248000 117.665000 -1228.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 -1219.248000 122.768000 -1228.248000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 -1219.248000 125.747000 -1228.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 -1219.248000 131.651000 -1228.248000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 -1219.248000 136.907000 -1228.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 -1219.248000 142.307000 -1228.248000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 -1219.248000 148.049000 -1228.248000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 -1219.248000 150.956000 -1228.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 -1219.248000 156.302000 -1228.248000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -1219.248000 159.253000 -1228.248000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1229.748000 84.095000 -1238.748000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -1229.748000 89.900000 -1238.748000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 -1229.748000 95.318000 -1238.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 -1229.748000 100.349000 -1238.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 -1229.748000 110.789000 -1238.748000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 -1229.748000 111.464000 -1238.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 -1229.748000 114.362000 -1238.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 -1229.748000 119.348000 -1238.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 -1229.748000 126.962000 -1238.748000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 -1229.748000 132.047000 -1238.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 -1229.748000 139.958000 -1238.748000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 -1229.748000 142.865000 -1238.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 -1229.748000 147.410000 -1238.748000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 -1229.748000 153.287000 -1238.748000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -1229.748000 156.333000 -1238.748000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1240.248000 84.095000 -1249.248000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -1240.248000 89.468000 -1249.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 -1240.248000 94.121000 -1249.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 -1240.248000 99.899000 -1249.248000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 -1240.248000 105.218000 -1249.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 -1240.248000 109.502000 -1249.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 -1240.248000 115.649000 -1249.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 -1240.248000 122.327000 -1249.248000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 -1240.248000 127.718000 -1249.248000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 -1240.248000 132.002000 -1249.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 -1240.248000 138.149000 -1249.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 -1240.248000 145.205000 -1249.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 -1240.248000 150.992000 -1249.248000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 -1240.248000 156.311000 -1249.248000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -1240.248000 159.253000 -1249.248000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1250.748000 82.394000 -1259.748000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 -1250.748000 86.705000 -1259.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 -1250.748000 91.322000 -1259.748000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 -1250.748000 94.913000 -1259.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 -1250.748000 98.054000 -1259.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 -1250.748000 102.014000 -1259.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 -1250.748000 104.876000 -1259.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 -1250.748000 113.435000 -1259.748000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 -1250.748000 118.718000 -1259.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 -1250.748000 121.949000 -1259.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 -1250.748000 125.063000 -1259.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 -1250.748000 130.886000 -1259.748000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 -1250.748000 134.045000 -1259.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 -1250.748000 138.005000 -1259.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 -1250.748000 143.792000 -1259.748000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 -1250.748000 149.111000 -1259.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 -1250.748000 151.964000 -1259.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 -1250.748000 156.293000 -1259.748000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -1250.748000 159.153000 -1259.748000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1261.248000 79.271000 -1270.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 -1261.248000 82.169000 -1270.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 -1261.248000 85.526000 -1270.248000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 -1261.248000 90.818000 -1270.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 -1261.248000 94.454000 -1270.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 -1261.248000 99.008000 -1270.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 -1261.248000 104.318000 -1270.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 -1261.248000 110.096000 -1270.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 -1261.248000 115.856000 -1270.248000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 -1261.248000 119.546000 -1270.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 -1261.248000 124.001000 -1270.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 -1261.248000 129.509000 -1270.248000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 -1261.248000 133.145000 -1270.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 -1261.248000 139.751000 -1270.248000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 -1261.248000 145.205000 -1270.248000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 -1261.248000 148.841000 -1270.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 -1261.248000 152.657000 -1270.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 -1261.248000 156.293000 -1270.248000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -1261.248000 159.253000 -1270.248000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1271.748000 84.095000 -1280.748000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -1271.748000 88.406000 -1280.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 -1271.748000 93.824000 -1280.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 -1271.748000 99.602000 -1280.748000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 -1271.748000 105.362000 -1280.748000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 -1271.748000 108.422000 -1280.748000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 -1271.748000 116.747000 -1280.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 -1271.748000 129.275000 -1280.748000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 -1271.748000 135.089000 -1280.748000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 -1271.748000 138.698000 -1280.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 -1271.748000 141.560000 -1280.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 -1271.748000 146.906000 -1280.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -1271.748000 151.190000 -1280.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 -1271.748000 156.266000 -1280.748000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -1271.748000 159.253000 -1280.748000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1282.248000 82.196000 -1291.248000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 -1282.248000 87.560000 -1291.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 -1282.248000 92.213000 -1291.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 -1282.248000 96.551000 -1291.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 -1282.248000 101.708000 -1291.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 -1282.248000 107.216000 -1291.248000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 -1282.248000 111.653000 -1291.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 -1282.248000 118.961000 -1291.248000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 -1282.248000 124.316000 -1291.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 -1282.248000 128.654000 -1291.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 -1282.248000 133.172000 -1291.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 -1282.248000 138.995000 -1291.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 -1282.248000 143.612000 -1291.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 -1282.248000 148.913000 -1291.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 -1282.248000 153.197000 -1291.248000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -1282.248000 156.333000 -1291.248000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1292.748000 80.009000 -1301.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -1292.748000 85.319000 -1301.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 -1292.748000 91.061000 -1301.748000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 -1292.748000 100.052000 -1301.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 -1292.748000 113.993000 -1301.748000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 -1292.748000 116.873000 -1301.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 -1292.748000 120.410000 -1301.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 -1292.748000 126.296000 -1301.748000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 -1292.748000 135.350000 -1301.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 -1292.748000 145.106000 -1301.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 -1292.748000 150.893000 -1301.748000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 -1292.748000 156.212000 -1301.748000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -1292.748000 159.253000 -1301.748000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1303.248000 82.196000 -1312.248000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 -1303.248000 87.560000 -1312.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 -1303.248000 93.392000 -1312.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 -1303.248000 99.152000 -1312.248000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 -1303.248000 101.960000 -1312.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 -1303.248000 107.306000 -1312.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 -1303.248000 111.905000 -1312.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 -1303.248000 115.640000 -1312.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 -1303.248000 122.444000 -1312.248000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 -1303.248000 127.898000 -1312.248000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 -1303.248000 135.575000 -1312.248000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 -1303.248000 141.380000 -1312.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 -1303.248000 145.241000 -1312.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 -1303.248000 150.803000 -1312.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 -1303.248000 156.302000 -1312.248000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -1303.248000 159.253000 -1312.248000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1313.748000 80.009000 -1322.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -1313.748000 85.796000 -1322.748000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 -1313.748000 91.115000 -1322.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 -1313.748000 95.399000 -1322.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 -1313.748000 100.718000 -1322.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 -1313.748000 107.054000 -1322.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 -1313.748000 118.097000 -1322.748000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 -1313.748000 123.524000 -1322.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 -1313.748000 129.401000 -1322.748000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 -1313.748000 131.768000 -1322.748000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 -1313.748000 135.413000 -1322.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 -1313.748000 141.659000 -1322.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 -1313.748000 150.965000 -1322.748000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 -1313.748000 156.320000 -1322.748000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -1313.748000 159.253000 -1322.748000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1324.248000 81.017000 -1333.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 -1324.248000 84.608000 -1333.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 -1324.248000 89.963000 -1333.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 -1324.248000 92.870000 -1333.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 -1324.248000 98.693000 -1333.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 -1324.248000 103.310000 -1333.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 -1324.248000 107.243000 -1333.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 -1324.248000 116.081000 -1333.248000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 -1324.248000 121.886000 -1333.248000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 -1324.248000 127.205000 -1333.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 -1324.248000 132.983000 -1333.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 -1324.248000 136.943000 -1333.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 -1324.248000 143.846000 -1333.248000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 -1324.248000 148.184000 -1333.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 -1324.248000 153.260000 -1333.248000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -1324.248000 156.433000 -1333.248000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1334.748000 79.271000 -1343.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -1334.748000 85.094000 -1343.748000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -1334.748000 90.854000 -1343.748000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 -1334.748000 93.653000 -1343.748000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -1349.600000 0 72.100000 -1349.600000 0 72.100000 -1188.400000 0 72.000000 -1188.400000 0 72.000000 -1349.600000 0
+eoFillPath subpath 1 160.500000 -1349.600000 0 160.600000 -1349.600000 0 160.600000 -1188.400000 0 160.500000 -1188.400000 0 160.500000 -1349.600000 0
+eoFillPath subpath 1 72.000000 -1188.500000 0 160.600000 -1188.500000 0 160.600000 -1188.400000 0 72.000000 -1188.400000 0 72.000000 -1188.500000 0
+eoFillPath subpath 1 72.000000 -1349.600000 0 160.600000 -1349.600000 0 160.600000 -1349.500000 0 72.000000 -1349.500000 0 72.000000 -1349.600000 0
+saveState
+eoClipPath subpath 1 108.000000 -1837.000000 0 178.900000 -1837.000000 0 178.900000 -1780.300000 0 108.000000 -1780.300000 0 108.000000 -1837.000000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 262890.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -5895.300000 0 165.500000 -5895.300000 0 165.500000 -5890.300000 0 76.900000 -5890.300000 0 76.900000 -5895.300000 0
+eoFillPath subpath 1 160.500000 -5890.400000 0 165.500000 -5890.400000 0 165.500000 -5781.600000 0 160.500000 -5781.600000 0 160.500000 -5890.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -5890.300000 0 160.500000 -5890.300000 0 160.500000 -5776.700000 0 72.000000 -5776.700000 0 72.000000 -5890.300000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5781.048000 83.771000 -5790.048000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 -5781.048000 89.594000 -5790.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 -5781.048000 92.465000 -5790.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 -5781.048000 97.568000 -5790.048000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 -5781.048000 100.943000 -5790.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 -5781.048000 106.955000 -5790.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 -5781.048000 110.447000 -5790.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 -5781.048000 114.425000 -5790.048000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 -5781.048000 119.717000 -5790.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 -5781.048000 127.493000 -5790.048000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 -5781.048000 130.949000 -5790.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 -5781.048000 136.574000 -5790.048000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 -5781.048000 141.920000 -5790.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 -5781.048000 147.365000 -5790.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 -5781.048000 151.703000 -5790.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 -5781.048000 156.320000 -5790.048000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -5781.048000 159.153000 -5790.048000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5791.548000 81.764000 -5800.548000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -5791.548000 85.130000 -5800.548000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 -5791.548000 88.712000 -5800.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 -5791.548000 94.022000 -5800.548000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 -5791.548000 98.306000 -5800.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -5791.548000 102.455000 -5800.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 -5791.548000 106.676000 -5800.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 -5791.548000 110.312000 -5800.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 -5791.548000 114.920000 -5800.548000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 -5791.548000 119.060000 -5800.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 -5791.548000 125.450000 -5800.548000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 -5791.548000 130.832000 -5800.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 -5791.548000 139.445000 -5800.548000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 -5791.548000 145.169000 -5800.548000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 -5791.548000 148.076000 -5800.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 -5791.548000 153.323000 -5800.548000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -5791.548000 156.433000 -5800.548000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5802.048000 80.009000 -5811.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -5802.048000 82.871000 -5811.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 -5802.048000 88.316000 -5811.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 -5802.048000 94.094000 -5811.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 -5802.048000 96.947000 -5811.048000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 -5802.048000 104.948000 -5811.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 -5802.048000 113.705000 -5811.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 -5802.048000 119.492000 -5811.048000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 -5802.048000 124.811000 -5811.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 -5802.048000 132.848000 -5811.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 -5802.048000 141.605000 -5811.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 -5802.048000 144.467000 -5811.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 -5802.048000 148.103000 -5811.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 -5802.048000 150.965000 -5811.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 -5802.048000 156.311000 -5811.048000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -5802.048000 159.253000 -5811.048000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5812.548000 80.999000 -5821.548000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 -5812.548000 90.539000 -5821.548000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 -5812.548000 95.318000 -5821.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 -5812.548000 99.602000 -5821.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -5812.548000 102.473000 -5821.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 -5812.548000 108.260000 -5821.548000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 -5812.548000 110.762000 -5821.548000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 -5812.548000 115.316000 -5821.548000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 -5812.548000 122.156000 -5821.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 -5812.548000 132.299000 -5821.548000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 -5812.548000 136.970000 -5821.548000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 -5812.548000 139.877000 -5821.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 -5812.548000 142.775000 -5821.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 -5812.548000 148.022000 -5821.548000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 -5812.548000 152.720000 -5821.548000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 -5812.548000 156.311000 -5821.548000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -5812.548000 159.253000 -5821.548000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5823.048000 83.006000 -5832.048000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 -5823.048000 88.793000 -5832.048000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 -5823.048000 91.664000 -5832.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 -5823.048000 94.562000 -5832.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 -5823.048000 100.349000 -5832.048000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 -5823.048000 103.157000 -5832.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 -5823.048000 108.980000 -5832.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 -5823.048000 114.740000 -5832.048000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 -5823.048000 119.375000 -5832.048000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 -5823.048000 128.033000 -5832.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 -5823.048000 141.479000 -5832.048000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 -5823.048000 146.807000 -5832.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -5823.048000 152.684000 -5832.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 -5823.048000 156.293000 -5832.048000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -5823.048000 159.253000 -5832.048000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5833.548000 79.730000 -5842.548000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 -5833.548000 84.005000 -5842.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 -5833.548000 89.423000 -5842.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 -5833.548000 98.036000 -5842.548000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 -5833.548000 121.157000 -5842.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 -5833.548000 145.115000 -5842.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 -5833.548000 151.001000 -5842.548000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 -5833.548000 156.320000 -5842.548000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -5833.548000 159.253000 -5842.548000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5844.048000 83.285000 -5853.048000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 -5844.048000 89.099000 -5853.048000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 -5844.048000 93.401000 -5853.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 -5844.048000 98.477000 -5853.048000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 -5844.048000 103.121000 -5853.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 -5844.048000 105.974000 -5853.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 -5844.048000 111.320000 -5853.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 -5844.048000 115.604000 -5853.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 -5844.048000 123.857000 -5853.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 -5844.048000 136.007000 -5853.048000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 -5844.048000 141.794000 -5853.048000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 -5844.048000 144.665000 -5853.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 -5844.048000 147.464000 -5853.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 -5844.048000 153.251000 -5853.048000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -5844.048000 156.433000 -5853.048000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5854.548000 79.271000 -5863.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -5854.548000 85.094000 -5863.548000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -5854.548000 90.854000 -5863.548000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 -5854.548000 96.146000 -5863.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 -5854.548000 102.302000 -5863.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 -5854.548000 107.711000 -5863.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 -5854.548000 113.048000 -5863.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 -5854.548000 119.204000 -5863.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 -5854.548000 124.991000 -5863.548000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 -5854.548000 130.310000 -5863.548000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 -5854.548000 135.647000 -5863.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 -5854.548000 144.755000 -5863.548000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 -5854.548000 153.323000 -5863.548000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -5854.548000 156.333000 -5863.548000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5865.048000 82.160000 -5874.048000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 -5865.048000 85.067000 -5874.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 -5865.048000 89.297000 -5874.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 -5865.048000 94.616000 -5874.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 -5865.048000 98.747000 -5874.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 -5865.048000 106.055000 -5874.048000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 -5865.048000 109.700000 -5874.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 -5865.048000 115.055000 -5874.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 -5865.048000 118.601000 -5874.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 -5865.048000 124.010000 -5874.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 -5865.048000 128.042000 -5874.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 -5865.048000 135.998000 -5874.048000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 -5865.048000 141.785000 -5874.048000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 -5865.048000 144.656000 -5874.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 -5865.048000 147.554000 -5874.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 -5865.048000 153.341000 -5874.048000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -5865.048000 156.433000 -5874.048000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5875.548000 79.271000 -5884.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -5875.548000 85.094000 -5884.548000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -5875.548000 90.854000 -5884.548000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 -5875.548000 93.743000 -5884.548000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -5890.400000 0 72.100000 -5890.400000 0 72.100000 -5776.700000 0 72.000000 -5776.700000 0 72.000000 -5890.400000 0
+eoFillPath subpath 1 160.500000 -5890.400000 0 160.600000 -5890.400000 0 160.600000 -5776.700000 0 160.500000 -5776.700000 0 160.500000 -5890.400000 0
+eoFillPath subpath 1 72.000000 -5776.800000 0 160.600000 -5776.800000 0 160.600000 -5776.700000 0 72.000000 -5776.700000 0 72.000000 -5776.800000 0
+eoFillPath subpath 1 72.000000 -5890.400000 0 160.600000 -5890.400000 0 160.600000 -5890.300000 0 72.000000 -5890.300000 0 72.000000 -5890.400000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 299.100000 0 169.600000 299.100000 0 169.600000 304.100000 0 76.900000 304.100000 0 76.900000 299.100000 0
+eoFillPath subpath 1 164.600000 304.000000 0 169.600000 304.000000 0 169.600000 419.600000 0 164.600000 419.600000 0 164.600000 304.000000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 304.100000 0 121.400000 304.100000 0 121.400000 424.500000 0 72.000000 424.500000 0 72.000000 304.100000 0
+saveState
+eoClipPath subpath 1 72.000000 304.100000 0 164.600000 304.100000 0 164.600000 424.500000 0 72.000000 424.500000 0 72.000000 304.100000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 374.000000 0 93.700000 374.000000 0 93.700000 393.200000 0 72.000000 393.200000 0 72.000000 374.000000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 374.000000 0 169.600000 374.000000 0 169.600000 393.200000 0 93.700000 393.200000 0 93.700000 374.000000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 357.300000 0 93.700000 357.300000 0 93.700000 374.000000 0 72.000000 374.000000 0 72.000000 357.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 357.300000 0 169.600000 357.300000 0 169.600000 374.000000 0 93.700000 374.000000 0 93.700000 357.300000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 338.100000 0 93.700000 338.100000 0 93.700000 357.300000 0 72.000000 357.300000 0 72.000000 338.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 338.100000 0 169.600000 338.100000 0 169.600000 357.300000 0 93.700000 357.300000 0 93.700000 338.100000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 318.900000 0 93.700000 318.900000 0 93.700000 338.100000 0 72.000000 338.100000 0 72.000000 318.900000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 318.900000 0 169.600000 318.900000 0 169.600000 338.100000 0 93.700000 338.100000 0 93.700000 318.900000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 420.152000 82.898000 411.152000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 420.152000 87.200000 411.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 420.152000 90.809000 411.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 420.152000 93.671000 411.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 420.152000 98.315000 411.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 420.152000 101.906000 411.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 420.152000 106.514000 411.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 420.152000 109.754000 411.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 420.152000 112.868000 411.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 420.152000 118.691000 411.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 420.152000 121.850000 411.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 420.152000 125.702000 411.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 420.152000 131.588000 411.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 420.152000 136.907000 411.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 420.152000 140.039000 411.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 420.152000 146.078000 411.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 420.152000 151.442000 411.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 420.152000 154.349000 411.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 420.152000 157.148000 411.152000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 420.152000 160.433000 411.152000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 409.652000 84.095000 400.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 409.652000 89.468000 400.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 409.652000 94.580000 400.652000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 409.652000 97.631000 400.652000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 389.252000 104.443000 380.252000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 389.252000 109.060000 380.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 389.252000 113.398000 380.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 389.252000 119.194000 380.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 389.252000 124.612000 380.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 389.252000 127.465000 380.252000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 372.552000 101.176000 363.552000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 372.552000 104.074000 363.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 372.552000 109.420000 363.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 372.552000 114.442000 363.552000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 372.552000 120.202000 363.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 372.552000 123.811000 363.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 372.552000 129.121000 363.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 372.552000 134.899000 363.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 372.552000 139.516000 363.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 372.552000 143.107000 363.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 372.552000 148.417000 363.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 372.552000 151.270000 363.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 372.552000 157.093000 363.552000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 355.852000 103.048000 346.852000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 355.852000 108.421000 346.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 355.852000 113.443000 346.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 355.852000 118.852000 346.852000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 355.852000 124.702000 346.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 355.852000 130.021000 346.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 355.852000 135.079000 346.852000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 336.652000 104.407000 327.652000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 336.652000 109.816000 327.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 336.652000 115.594000 327.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 336.652000 121.354000 327.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 336.652000 125.692000 327.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 336.652000 128.563000 327.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 336.652000 133.954000 327.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 336.652000 139.786000 327.652000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 304.000000 0 72.100000 304.000000 0 72.100000 424.500000 0 72.000000 424.500000 0 72.000000 304.000000 0
+eoFillPath subpath 1 164.600000 304.000000 0 164.700000 304.000000 0 164.700000 424.500000 0 164.600000 424.500000 0 164.600000 304.000000 0
+eoFillPath subpath 1 72.000000 424.400000 0 164.700000 424.400000 0 164.700000 424.500000 0 72.000000 424.500000 0 72.000000 424.400000 0
+eoFillPath subpath 1 72.000000 304.000000 0 164.700000 304.000000 0 164.700000 304.100000 0 72.000000 304.100000 0 72.000000 304.000000 0
+eoFillPath subpath 1 91.300000 318.900000 0 93.700000 318.900000 0 93.700000 393.200000 0 91.300000 393.200000 0 91.300000 318.900000 0
+eoFillPath subpath 1 72.000000 338.100000 0 169.600000 338.100000 0 169.600000 340.500000 0 72.000000 340.500000 0 72.000000 338.100000 0
+eoFillPath subpath 1 72.000000 390.800000 0 169.600000 390.800000 0 169.600000 393.200000 0 72.000000 393.200000 0 72.000000 390.800000 0
+eoFillPath subpath 1 72.000000 318.900000 0 169.600000 318.900000 0 169.600000 321.300000 0 72.000000 321.300000 0 72.000000 318.900000 0
+saveState
+eoClipPath subpath 1 108.000000 -7547.000000 0 150.800000 -7547.000000 0 150.800000 -7502.800000 0 108.000000 -7502.800000 0 108.000000 -7547.000000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 833900.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 -8397.000000 0 499.600000 -8397.000000 0 499.600000 -8391.900000 0 186.800000 -8391.900000 0 186.800000 -8397.000000 0
+eoFillPath subpath 1 494.500000 -8392.000000 0 499.600000 -8392.000000 0 499.600000 -8203.600000 0 494.500000 -8203.600000 0 494.500000 -8392.000000 0
+saveState
+eoClipPath subpath 1 181.800000 -8392.000000 0 494.500000 -8392.000000 0 494.500000 -8198.600000 0 181.800000 -8198.600000 0 181.800000 -8392.000000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 -8198.500000 0 494.500000 -8198.500000 0 494.500000 -8198.500000 0 181.700000 -8198.500000 0
+eoFillPath subpath 1 181.700000 -8198.500000 0 494.500000 -8198.500000 0 494.500000 -8199.300000 0 181.700000 -8199.300000 0 181.700000 -8198.500000 0
+eoFillPath subpath 1 181.700000 -8199.300000 0 494.500000 -8199.300000 0 494.500000 -8200.000000 0 181.700000 -8200.000000 0 181.700000 -8199.300000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 -8200.000000 0 494.500000 -8200.000000 0 494.500000 -8200.800000 0 181.700000 -8200.800000 0 181.700000 -8200.000000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 -8200.800000 0 494.500000 -8200.800000 0 494.500000 -8201.600000 0 181.700000 -8201.600000 0 181.700000 -8200.800000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 -8201.600000 0 494.500000 -8201.600000 0 494.500000 -8202.300000 0 181.700000 -8202.300000 0 181.700000 -8201.600000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 -8202.300000 0 494.500000 -8202.300000 0 494.500000 -8203.100000 0 181.700000 -8203.100000 0 181.700000 -8202.300000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 -8203.100000 0 494.500000 -8203.100000 0 494.500000 -8203.800000 0 181.700000 -8203.800000 0 181.700000 -8203.100000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 -8203.800000 0 494.500000 -8203.800000 0 494.500000 -8204.600000 0 181.700000 -8204.600000 0 181.700000 -8203.800000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 -8204.600000 0 494.500000 -8204.600000 0 494.500000 -8205.300000 0 181.700000 -8205.300000 0 181.700000 -8204.600000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 -8205.300000 0 494.500000 -8205.300000 0 494.500000 -8206.100000 0 181.700000 -8206.100000 0 181.700000 -8205.300000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 -8206.100000 0 494.500000 -8206.100000 0 494.500000 -8206.900000 0 181.700000 -8206.900000 0 181.700000 -8206.100000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 -8206.900000 0 494.500000 -8206.900000 0 494.500000 -8207.600000 0 181.700000 -8207.600000 0 181.700000 -8206.900000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 -8207.600000 0 494.500000 -8207.600000 0 494.500000 -8208.400000 0 181.700000 -8208.400000 0 181.700000 -8207.600000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 -8208.400000 0 494.500000 -8208.400000 0 494.500000 -8209.100000 0 181.700000 -8209.100000 0 181.700000 -8208.400000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 -8209.100000 0 494.500000 -8209.100000 0 494.500000 -8209.900000 0 181.700000 -8209.900000 0 181.700000 -8209.100000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 -8209.900000 0 494.500000 -8209.900000 0 494.500000 -8210.700000 0 181.700000 -8210.700000 0 181.700000 -8209.900000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 -8210.700000 0 494.500000 -8210.700000 0 494.500000 -8211.400000 0 181.700000 -8211.400000 0 181.700000 -8210.700000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 -8211.400000 0 494.500000 -8211.400000 0 494.500000 -8212.200000 0 181.700000 -8212.200000 0 181.700000 -8211.400000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 -8212.200000 0 494.500000 -8212.200000 0 494.500000 -8212.900000 0 181.700000 -8212.900000 0 181.700000 -8212.200000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 -8212.900000 0 494.500000 -8212.900000 0 494.500000 -8213.700000 0 181.700000 -8213.700000 0 181.700000 -8212.900000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 -8213.700000 0 494.500000 -8213.700000 0 494.500000 -8214.500000 0 181.700000 -8214.500000 0 181.700000 -8213.700000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 -8214.500000 0 494.500000 -8214.500000 0 494.500000 -8215.200000 0 181.700000 -8215.200000 0 181.700000 -8214.500000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 -8215.200000 0 494.500000 -8215.200000 0 494.500000 -8216.000000 0 181.700000 -8216.000000 0 181.700000 -8215.200000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 -8216.000000 0 494.500000 -8216.000000 0 494.500000 -8216.700000 0 181.700000 -8216.700000 0 181.700000 -8216.000000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 -8216.700000 0 494.500000 -8216.700000 0 494.500000 -8217.500000 0 181.700000 -8217.500000 0 181.700000 -8216.700000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 -8217.500000 0 494.500000 -8217.500000 0 494.500000 -8218.200000 0 181.700000 -8218.200000 0 181.700000 -8217.500000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 -8218.200000 0 494.500000 -8218.200000 0 494.500000 -8219.000000 0 181.700000 -8219.000000 0 181.700000 -8218.200000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 -8219.000000 0 494.500000 -8219.000000 0 494.500000 -8219.800000 0 181.700000 -8219.800000 0 181.700000 -8219.000000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 -8219.800000 0 494.500000 -8219.800000 0 494.500000 -8220.500000 0 181.700000 -8220.500000 0 181.700000 -8219.800000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 -8220.500000 0 494.500000 -8220.500000 0 494.500000 -8221.300000 0 181.700000 -8221.300000 0 181.700000 -8220.500000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 -8221.300000 0 494.500000 -8221.300000 0 494.500000 -8222.000000 0 181.700000 -8222.000000 0 181.700000 -8221.300000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 -8222.000000 0 494.500000 -8222.000000 0 494.500000 -8222.800000 0 181.700000 -8222.800000 0 181.700000 -8222.000000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 -8222.800000 0 494.500000 -8222.800000 0 494.500000 -8223.600000 0 181.700000 -8223.600000 0 181.700000 -8222.800000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 -8223.600000 0 494.500000 -8223.600000 0 494.500000 -8224.300000 0 181.700000 -8224.300000 0 181.700000 -8223.600000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 -8224.300000 0 494.500000 -8224.300000 0 494.500000 -8225.100000 0 181.700000 -8225.100000 0 181.700000 -8224.300000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 -8225.100000 0 494.500000 -8225.100000 0 494.500000 -8225.800000 0 181.700000 -8225.800000 0 181.700000 -8225.100000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 -8225.800000 0 494.500000 -8225.800000 0 494.500000 -8226.600000 0 181.700000 -8226.600000 0 181.700000 -8225.800000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 -8226.600000 0 494.500000 -8226.600000 0 494.500000 -8227.400000 0 181.700000 -8227.400000 0 181.700000 -8226.600000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 -8227.400000 0 494.500000 -8227.400000 0 494.500000 -8228.100000 0 181.700000 -8228.100000 0 181.700000 -8227.400000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 -8228.100000 0 494.500000 -8228.100000 0 494.500000 -8228.900000 0 181.700000 -8228.900000 0 181.700000 -8228.100000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 -8228.900000 0 494.500000 -8228.900000 0 494.500000 -8229.600000 0 181.700000 -8229.600000 0 181.700000 -8228.900000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 -8229.600000 0 494.500000 -8229.600000 0 494.500000 -8230.400000 0 181.700000 -8230.400000 0 181.700000 -8229.600000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 -8230.400000 0 494.500000 -8230.400000 0 494.500000 -8231.100000 0 181.700000 -8231.100000 0 181.700000 -8230.400000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 -8231.100000 0 494.500000 -8231.100000 0 494.500000 -8231.900000 0 181.700000 -8231.900000 0 181.700000 -8231.100000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 -8231.900000 0 494.500000 -8231.900000 0 494.500000 -8232.700000 0 181.700000 -8232.700000 0 181.700000 -8231.900000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 -8232.700000 0 494.500000 -8232.700000 0 494.500000 -8233.400000 0 181.700000 -8233.400000 0 181.700000 -8232.700000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 -8233.400000 0 494.500000 -8233.400000 0 494.500000 -8234.200000 0 181.700000 -8234.200000 0 181.700000 -8233.400000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 -8234.200000 0 494.500000 -8234.200000 0 494.500000 -8234.900000 0 181.700000 -8234.900000 0 181.700000 -8234.200000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 -8234.900000 0 494.500000 -8234.900000 0 494.500000 -8235.700000 0 181.700000 -8235.700000 0 181.700000 -8234.900000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 -8235.700000 0 494.500000 -8235.700000 0 494.500000 -8236.500000 0 181.700000 -8236.500000 0 181.700000 -8235.700000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 -8236.500000 0 494.500000 -8236.500000 0 494.500000 -8237.200000 0 181.700000 -8237.200000 0 181.700000 -8236.500000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 -8237.200000 0 494.500000 -8237.200000 0 494.500000 -8238.000000 0 181.700000 -8238.000000 0 181.700000 -8237.200000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 -8238.000000 0 494.500000 -8238.000000 0 494.500000 -8238.700000 0 181.700000 -8238.700000 0 181.700000 -8238.000000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 -8238.700000 0 494.500000 -8238.700000 0 494.500000 -8239.500000 0 181.700000 -8239.500000 0 181.700000 -8238.700000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 -8239.500000 0 494.500000 -8239.500000 0 494.500000 -8240.300000 0 181.700000 -8240.300000 0 181.700000 -8239.500000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 -8240.300000 0 494.500000 -8240.300000 0 494.500000 -8241.000000 0 181.700000 -8241.000000 0 181.700000 -8240.300000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 -8241.000000 0 494.500000 -8241.000000 0 494.500000 -8241.800000 0 181.700000 -8241.800000 0 181.700000 -8241.000000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 -8241.800000 0 494.500000 -8241.800000 0 494.500000 -8242.500000 0 181.700000 -8242.500000 0 181.700000 -8241.800000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 -8242.500000 0 494.500000 -8242.500000 0 494.500000 -8243.300000 0 181.700000 -8243.300000 0 181.700000 -8242.500000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 -8243.300000 0 494.500000 -8243.300000 0 494.500000 -8244.000000 0 181.700000 -8244.000000 0 181.700000 -8243.300000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 -8244.000000 0 494.500000 -8244.000000 0 494.500000 -8244.800000 0 181.700000 -8244.800000 0 181.700000 -8244.000000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 -8244.800000 0 494.500000 -8244.800000 0 494.500000 -8245.600000 0 181.700000 -8245.600000 0 181.700000 -8244.800000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 -8245.600000 0 494.500000 -8245.600000 0 494.500000 -8246.300000 0 181.700000 -8246.300000 0 181.700000 -8245.600000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 -8246.300000 0 494.500000 -8246.300000 0 494.500000 -8247.100000 0 181.700000 -8247.100000 0 181.700000 -8246.300000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 -8247.100000 0 494.500000 -8247.100000 0 494.500000 -8247.800000 0 181.700000 -8247.800000 0 181.700000 -8247.100000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 -8247.800000 0 494.500000 -8247.800000 0 494.500000 -8248.600000 0 181.700000 -8248.600000 0 181.700000 -8247.800000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 -8248.600000 0 494.500000 -8248.600000 0 494.500000 -8249.400000 0 181.700000 -8249.400000 0 181.700000 -8248.600000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 -8249.400000 0 494.500000 -8249.400000 0 494.500000 -8250.100000 0 181.700000 -8250.100000 0 181.700000 -8249.400000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 -8250.100000 0 494.500000 -8250.100000 0 494.500000 -8250.900000 0 181.700000 -8250.900000 0 181.700000 -8250.100000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 -8250.900000 0 494.500000 -8250.900000 0 494.500000 -8251.600000 0 181.700000 -8251.600000 0 181.700000 -8250.900000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 -8251.600000 0 494.500000 -8251.600000 0 494.500000 -8252.400000 0 181.700000 -8252.400000 0 181.700000 -8251.600000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 -8252.400000 0 494.500000 -8252.400000 0 494.500000 -8253.200000 0 181.700000 -8253.200000 0 181.700000 -8252.400000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 -8253.200000 0 494.500000 -8253.200000 0 494.500000 -8253.900000 0 181.700000 -8253.900000 0 181.700000 -8253.200000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 -8253.900000 0 494.500000 -8253.900000 0 494.500000 -8254.700000 0 181.700000 -8254.700000 0 181.700000 -8253.900000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 -8254.700000 0 494.500000 -8254.700000 0 494.500000 -8255.400000 0 181.700000 -8255.400000 0 181.700000 -8254.700000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 -8255.400000 0 494.500000 -8255.400000 0 494.500000 -8256.200000 0 181.700000 -8256.200000 0 181.700000 -8255.400000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 -8256.200000 0 494.500000 -8256.200000 0 494.500000 -8256.900000 0 181.700000 -8256.900000 0 181.700000 -8256.200000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 -8256.900000 0 494.500000 -8256.900000 0 494.500000 -8257.700000 0 181.700000 -8257.700000 0 181.700000 -8256.900000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 -8257.700000 0 494.500000 -8257.700000 0 494.500000 -8258.500000 0 181.700000 -8258.500000 0 181.700000 -8257.700000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 -8258.500000 0 494.500000 -8258.500000 0 494.500000 -8259.200000 0 181.700000 -8259.200000 0 181.700000 -8258.500000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 -8259.200000 0 494.500000 -8259.200000 0 494.500000 -8260.000000 0 181.700000 -8260.000000 0 181.700000 -8259.200000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 -8260.000000 0 494.500000 -8260.000000 0 494.500000 -8260.700000 0 181.700000 -8260.700000 0 181.700000 -8260.000000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 -8260.700000 0 494.500000 -8260.700000 0 494.500000 -8261.500000 0 181.700000 -8261.500000 0 181.700000 -8260.700000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 -8261.500000 0 494.500000 -8261.500000 0 494.500000 -8262.300000 0 181.700000 -8262.300000 0 181.700000 -8261.500000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 -8262.300000 0 494.500000 -8262.300000 0 494.500000 -8263.000000 0 181.700000 -8263.000000 0 181.700000 -8262.300000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 -8263.000000 0 494.500000 -8263.000000 0 494.500000 -8263.800000 0 181.700000 -8263.800000 0 181.700000 -8263.000000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 -8263.800000 0 494.500000 -8263.800000 0 494.500000 -8264.500000 0 181.700000 -8264.500000 0 181.700000 -8263.800000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 -8264.500000 0 494.500000 -8264.500000 0 494.500000 -8265.300000 0 181.700000 -8265.300000 0 181.700000 -8264.500000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 -8265.300000 0 494.500000 -8265.300000 0 494.500000 -8266.100000 0 181.700000 -8266.100000 0 181.700000 -8265.300000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 -8266.100000 0 494.500000 -8266.100000 0 494.500000 -8266.800000 0 181.700000 -8266.800000 0 181.700000 -8266.100000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 -8266.800000 0 494.500000 -8266.800000 0 494.500000 -8267.600000 0 181.700000 -8267.600000 0 181.700000 -8266.800000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 -8267.600000 0 494.500000 -8267.600000 0 494.500000 -8268.300000 0 181.700000 -8268.300000 0 181.700000 -8267.600000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 -8268.300000 0 494.500000 -8268.300000 0 494.500000 -8269.100000 0 181.700000 -8269.100000 0 181.700000 -8268.300000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 -8269.100000 0 494.500000 -8269.100000 0 494.500000 -8269.800000 0 181.700000 -8269.800000 0 181.700000 -8269.100000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 -8269.800000 0 494.500000 -8269.800000 0 494.500000 -8270.600000 0 181.700000 -8270.600000 0 181.700000 -8269.800000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 -8270.600000 0 494.500000 -8270.600000 0 494.500000 -8271.400000 0 181.700000 -8271.400000 0 181.700000 -8270.600000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 -8271.400000 0 494.500000 -8271.400000 0 494.500000 -8272.100000 0 181.700000 -8272.100000 0 181.700000 -8271.400000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 -8272.100000 0 494.500000 -8272.100000 0 494.500000 -8272.900000 0 181.700000 -8272.900000 0 181.700000 -8272.100000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 -8272.900000 0 494.500000 -8272.900000 0 494.500000 -8273.600000 0 181.700000 -8273.600000 0 181.700000 -8272.900000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 -8273.600000 0 494.500000 -8273.600000 0 494.500000 -8274.400000 0 181.700000 -8274.400000 0 181.700000 -8273.600000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 -8274.400000 0 494.500000 -8274.400000 0 494.500000 -8275.200000 0 181.700000 -8275.200000 0 181.700000 -8274.400000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 -8275.200000 0 494.500000 -8275.200000 0 494.500000 -8275.900000 0 181.700000 -8275.900000 0 181.700000 -8275.200000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 -8275.900000 0 494.500000 -8275.900000 0 494.500000 -8276.700000 0 181.700000 -8276.700000 0 181.700000 -8275.900000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 -8276.700000 0 494.500000 -8276.700000 0 494.500000 -8277.400000 0 181.700000 -8277.400000 0 181.700000 -8276.700000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 -8277.400000 0 494.500000 -8277.400000 0 494.500000 -8278.200000 0 181.700000 -8278.200000 0 181.700000 -8277.400000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 -8278.200000 0 494.500000 -8278.200000 0 494.500000 -8279.000000 0 181.700000 -8279.000000 0 181.700000 -8278.200000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 -8279.000000 0 494.500000 -8279.000000 0 494.500000 -8279.700000 0 181.700000 -8279.700000 0 181.700000 -8279.000000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 -8279.700000 0 494.500000 -8279.700000 0 494.500000 -8280.500000 0 181.700000 -8280.500000 0 181.700000 -8279.700000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 -8280.500000 0 494.500000 -8280.500000 0 494.500000 -8281.200000 0 181.700000 -8281.200000 0 181.700000 -8280.500000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 -8281.200000 0 494.500000 -8281.200000 0 494.500000 -8282.000000 0 181.700000 -8282.000000 0 181.700000 -8281.200000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 -8282.000000 0 494.500000 -8282.000000 0 494.500000 -8282.700000 0 181.700000 -8282.700000 0 181.700000 -8282.000000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 -8282.700000 0 494.500000 -8282.700000 0 494.500000 -8283.500000 0 181.700000 -8283.500000 0 181.700000 -8282.700000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 -8283.500000 0 494.500000 -8283.500000 0 494.500000 -8284.300000 0 181.700000 -8284.300000 0 181.700000 -8283.500000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 -8284.300000 0 494.500000 -8284.300000 0 494.500000 -8285.000000 0 181.700000 -8285.000000 0 181.700000 -8284.300000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 -8285.000000 0 494.500000 -8285.000000 0 494.500000 -8285.800000 0 181.700000 -8285.800000 0 181.700000 -8285.000000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 -8285.800000 0 494.500000 -8285.800000 0 494.500000 -8286.500000 0 181.700000 -8286.500000 0 181.700000 -8285.800000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 -8286.500000 0 494.500000 -8286.500000 0 494.500000 -8287.300000 0 181.700000 -8287.300000 0 181.700000 -8286.500000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 -8287.300000 0 494.500000 -8287.300000 0 494.500000 -8288.100000 0 181.700000 -8288.100000 0 181.700000 -8287.300000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 -8288.100000 0 494.500000 -8288.100000 0 494.500000 -8288.800000 0 181.700000 -8288.800000 0 181.700000 -8288.100000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 -8288.800000 0 494.500000 -8288.800000 0 494.500000 -8289.600000 0 181.700000 -8289.600000 0 181.700000 -8288.800000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 -8289.600000 0 494.500000 -8289.600000 0 494.500000 -8290.300000 0 181.700000 -8290.300000 0 181.700000 -8289.600000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 -8290.300000 0 494.500000 -8290.300000 0 494.500000 -8291.100000 0 181.700000 -8291.100000 0 181.700000 -8290.300000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 -8291.100000 0 494.500000 -8291.100000 0 494.500000 -8291.800000 0 181.700000 -8291.800000 0 181.700000 -8291.100000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 -8291.800000 0 494.500000 -8291.800000 0 494.500000 -8292.600000 0 181.700000 -8292.600000 0 181.700000 -8291.800000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 -8292.600000 0 494.500000 -8292.600000 0 494.500000 -8293.400000 0 181.700000 -8293.400000 0 181.700000 -8292.600000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 -8293.400000 0 494.500000 -8293.400000 0 494.500000 -8294.100000 0 181.700000 -8294.100000 0 181.700000 -8293.400000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 -8294.100000 0 494.500000 -8294.100000 0 494.500000 -8294.900000 0 181.700000 -8294.900000 0 181.700000 -8294.100000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 -8294.900000 0 494.500000 -8294.900000 0 494.500000 -8295.600000 0 181.700000 -8295.600000 0 181.700000 -8294.900000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 -8295.600000 0 494.500000 -8295.600000 0 494.500000 -8296.400000 0 181.700000 -8296.400000 0 181.700000 -8295.600000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 -8296.400000 0 494.500000 -8296.400000 0 494.500000 -8297.100000 0 181.700000 -8297.100000 0 181.700000 -8296.400000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 -8297.100000 0 494.500000 -8297.100000 0 494.500000 -8297.900000 0 181.700000 -8297.900000 0 181.700000 -8297.100000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 -8297.900000 0 494.500000 -8297.900000 0 494.500000 -8298.700000 0 181.700000 -8298.700000 0 181.700000 -8297.900000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 -8298.700000 0 494.500000 -8298.700000 0 494.500000 -8299.400000 0 181.700000 -8299.400000 0 181.700000 -8298.700000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 -8299.400000 0 494.500000 -8299.400000 0 494.500000 -8300.200000 0 181.700000 -8300.200000 0 181.700000 -8299.400000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 -8300.200000 0 494.500000 -8300.200000 0 494.500000 -8300.900000 0 181.700000 -8300.900000 0 181.700000 -8300.200000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 -8300.900000 0 494.500000 -8300.900000 0 494.500000 -8301.700000 0 181.700000 -8301.700000 0 181.700000 -8300.900000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 -8301.700000 0 494.500000 -8301.700000 0 494.500000 -8302.500000 0 181.700000 -8302.500000 0 181.700000 -8301.700000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 -8302.500000 0 494.500000 -8302.500000 0 494.500000 -8303.200000 0 181.700000 -8303.200000 0 181.700000 -8302.500000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 -8303.200000 0 494.500000 -8303.200000 0 494.500000 -8304.000000 0 181.700000 -8304.000000 0 181.700000 -8303.200000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 -8304.000000 0 494.500000 -8304.000000 0 494.500000 -8304.700000 0 181.700000 -8304.700000 0 181.700000 -8304.000000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 -8304.700000 0 494.500000 -8304.700000 0 494.500000 -8305.500000 0 181.700000 -8305.500000 0 181.700000 -8304.700000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 -8305.500000 0 494.500000 -8305.500000 0 494.500000 -8306.200000 0 181.700000 -8306.200000 0 181.700000 -8305.500000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 -8306.200000 0 494.500000 -8306.200000 0 494.500000 -8307.000000 0 181.700000 -8307.000000 0 181.700000 -8306.200000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 -8307.000000 0 494.500000 -8307.000000 0 494.500000 -8307.800000 0 181.700000 -8307.800000 0 181.700000 -8307.000000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 -8307.800000 0 494.500000 -8307.800000 0 494.500000 -8308.500000 0 181.700000 -8308.500000 0 181.700000 -8307.800000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 -8308.500000 0 494.500000 -8308.500000 0 494.500000 -8309.300000 0 181.700000 -8309.300000 0 181.700000 -8308.500000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 -8309.300000 0 494.500000 -8309.300000 0 494.500000 -8310.000000 0 181.700000 -8310.000000 0 181.700000 -8309.300000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 -8310.000000 0 494.500000 -8310.000000 0 494.500000 -8310.800000 0 181.700000 -8310.800000 0 181.700000 -8310.000000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 -8310.800000 0 494.500000 -8310.800000 0 494.500000 -8311.500000 0 181.700000 -8311.500000 0 181.700000 -8310.800000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 -8311.500000 0 494.500000 -8311.500000 0 494.500000 -8312.300000 0 181.700000 -8312.300000 0 181.700000 -8311.500000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 -8312.300000 0 494.500000 -8312.300000 0 494.500000 -8313.100000 0 181.700000 -8313.100000 0 181.700000 -8312.300000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 -8313.100000 0 494.500000 -8313.100000 0 494.500000 -8313.800000 0 181.700000 -8313.800000 0 181.700000 -8313.100000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 -8313.800000 0 494.500000 -8313.800000 0 494.500000 -8314.600000 0 181.700000 -8314.600000 0 181.700000 -8313.800000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 -8314.600000 0 494.500000 -8314.600000 0 494.500000 -8315.300000 0 181.700000 -8315.300000 0 181.700000 -8314.600000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 -8315.300000 0 494.500000 -8315.300000 0 494.500000 -8316.100000 0 181.700000 -8316.100000 0 181.700000 -8315.300000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 -8316.100000 0 494.500000 -8316.100000 0 494.500000 -8316.900000 0 181.700000 -8316.900000 0 181.700000 -8316.100000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 -8316.900000 0 494.500000 -8316.900000 0 494.500000 -8317.600000 0 181.700000 -8317.600000 0 181.700000 -8316.900000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 -8317.600000 0 494.500000 -8317.600000 0 494.500000 -8318.400000 0 181.700000 -8318.400000 0 181.700000 -8317.600000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 -8318.400000 0 494.500000 -8318.400000 0 494.500000 -8319.100000 0 181.700000 -8319.100000 0 181.700000 -8318.400000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 -8319.100000 0 494.500000 -8319.100000 0 494.500000 -8319.900000 0 181.700000 -8319.900000 0 181.700000 -8319.100000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 -8319.900000 0 494.500000 -8319.900000 0 494.500000 -8320.700000 0 181.700000 -8320.700000 0 181.700000 -8319.900000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 -8320.700000 0 494.500000 -8320.700000 0 494.500000 -8321.400000 0 181.700000 -8321.400000 0 181.700000 -8320.700000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 -8321.400000 0 494.500000 -8321.400000 0 494.500000 -8322.200000 0 181.700000 -8322.200000 0 181.700000 -8321.400000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 -8322.200000 0 494.500000 -8322.200000 0 494.500000 -8322.900000 0 181.700000 -8322.900000 0 181.700000 -8322.200000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 -8322.900000 0 494.500000 -8322.900000 0 494.500000 -8323.700000 0 181.700000 -8323.700000 0 181.700000 -8322.900000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 -8323.700000 0 494.500000 -8323.700000 0 494.500000 -8324.400000 0 181.700000 -8324.400000 0 181.700000 -8323.700000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 -8324.400000 0 494.500000 -8324.400000 0 494.500000 -8325.200000 0 181.700000 -8325.200000 0 181.700000 -8324.400000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 -8325.200000 0 494.500000 -8325.200000 0 494.500000 -8326.000000 0 181.700000 -8326.000000 0 181.700000 -8325.200000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 -8326.000000 0 494.500000 -8326.000000 0 494.500000 -8326.700000 0 181.700000 -8326.700000 0 181.700000 -8326.000000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 -8326.700000 0 494.500000 -8326.700000 0 494.500000 -8327.500000 0 181.700000 -8327.500000 0 181.700000 -8326.700000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 -8327.500000 0 494.500000 -8327.500000 0 494.500000 -8328.200000 0 181.700000 -8328.200000 0 181.700000 -8327.500000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 -8328.200000 0 494.500000 -8328.200000 0 494.500000 -8329.000000 0 181.700000 -8329.000000 0 181.700000 -8328.200000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 -8329.000000 0 494.500000 -8329.000000 0 494.500000 -8329.800000 0 181.700000 -8329.800000 0 181.700000 -8329.000000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 -8329.800000 0 494.500000 -8329.800000 0 494.500000 -8330.500000 0 181.700000 -8330.500000 0 181.700000 -8329.800000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 -8330.500000 0 494.500000 -8330.500000 0 494.500000 -8331.300000 0 181.700000 -8331.300000 0 181.700000 -8330.500000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 -8331.300000 0 494.500000 -8331.300000 0 494.500000 -8332.000000 0 181.700000 -8332.000000 0 181.700000 -8331.300000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 -8332.000000 0 494.500000 -8332.000000 0 494.500000 -8332.800000 0 181.700000 -8332.800000 0 181.700000 -8332.000000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 -8332.800000 0 494.500000 -8332.800000 0 494.500000 -8333.600000 0 181.700000 -8333.600000 0 181.700000 -8332.800000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 -8333.600000 0 494.500000 -8333.600000 0 494.500000 -8334.300000 0 181.700000 -8334.300000 0 181.700000 -8333.600000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 -8334.300000 0 494.500000 -8334.300000 0 494.500000 -8335.100000 0 181.700000 -8335.100000 0 181.700000 -8334.300000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 -8335.100000 0 494.500000 -8335.100000 0 494.500000 -8335.800000 0 181.700000 -8335.800000 0 181.700000 -8335.100000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 -8335.800000 0 494.500000 -8335.800000 0 494.500000 -8336.600000 0 181.700000 -8336.600000 0 181.700000 -8335.800000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 -8336.600000 0 494.500000 -8336.600000 0 494.500000 -8337.300000 0 181.700000 -8337.300000 0 181.700000 -8336.600000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 -8337.300000 0 494.500000 -8337.300000 0 494.500000 -8338.100000 0 181.700000 -8338.100000 0 181.700000 -8337.300000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 -8338.100000 0 494.500000 -8338.100000 0 494.500000 -8338.900000 0 181.700000 -8338.900000 0 181.700000 -8338.100000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 -8338.900000 0 494.500000 -8338.900000 0 494.500000 -8339.600000 0 181.700000 -8339.600000 0 181.700000 -8338.900000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 -8339.600000 0 494.500000 -8339.600000 0 494.500000 -8340.400000 0 181.700000 -8340.400000 0 181.700000 -8339.600000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 -8340.400000 0 494.500000 -8340.400000 0 494.500000 -8341.100000 0 181.700000 -8341.100000 0 181.700000 -8340.400000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 -8341.100000 0 494.500000 -8341.100000 0 494.500000 -8341.900000 0 181.700000 -8341.900000 0 181.700000 -8341.100000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 -8341.900000 0 494.500000 -8341.900000 0 494.500000 -8342.700000 0 181.700000 -8342.700000 0 181.700000 -8341.900000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 -8342.700000 0 494.500000 -8342.700000 0 494.500000 -8343.400000 0 181.700000 -8343.400000 0 181.700000 -8342.700000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 -8343.400000 0 494.500000 -8343.400000 0 494.500000 -8344.200000 0 181.700000 -8344.200000 0 181.700000 -8343.400000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 -8344.200000 0 494.500000 -8344.200000 0 494.500000 -8344.900000 0 181.700000 -8344.900000 0 181.700000 -8344.200000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 -8344.900000 0 494.500000 -8344.900000 0 494.500000 -8345.700000 0 181.700000 -8345.700000 0 181.700000 -8344.900000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 -8345.700000 0 494.500000 -8345.700000 0 494.500000 -8346.500000 0 181.700000 -8346.500000 0 181.700000 -8345.700000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 -8346.500000 0 494.500000 -8346.500000 0 494.500000 -8347.200000 0 181.700000 -8347.200000 0 181.700000 -8346.500000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 -8347.200000 0 494.500000 -8347.200000 0 494.500000 -8348.000000 0 181.700000 -8348.000000 0 181.700000 -8347.200000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 -8348.000000 0 494.500000 -8348.000000 0 494.500000 -8348.700000 0 181.700000 -8348.700000 0 181.700000 -8348.000000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 -8348.700000 0 494.500000 -8348.700000 0 494.500000 -8349.500000 0 181.700000 -8349.500000 0 181.700000 -8348.700000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 -8349.500000 0 494.500000 -8349.500000 0 494.500000 -8350.200000 0 181.700000 -8350.200000 0 181.700000 -8349.500000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 -8350.200000 0 494.500000 -8350.200000 0 494.500000 -8351.000000 0 181.700000 -8351.000000 0 181.700000 -8350.200000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 -8351.000000 0 494.500000 -8351.000000 0 494.500000 -8351.800000 0 181.700000 -8351.800000 0 181.700000 -8351.000000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 -8351.800000 0 494.500000 -8351.800000 0 494.500000 -8352.500000 0 181.700000 -8352.500000 0 181.700000 -8351.800000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 -8352.500000 0 494.500000 -8352.500000 0 494.500000 -8353.300000 0 181.700000 -8353.300000 0 181.700000 -8352.500000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 -8353.300000 0 494.500000 -8353.300000 0 494.500000 -8354.000000 0 181.700000 -8354.000000 0 181.700000 -8353.300000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 -8354.000000 0 494.500000 -8354.000000 0 494.500000 -8354.800000 0 181.700000 -8354.800000 0 181.700000 -8354.000000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 -8354.800000 0 494.500000 -8354.800000 0 494.500000 -8355.600000 0 181.700000 -8355.600000 0 181.700000 -8354.800000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 -8355.600000 0 494.500000 -8355.600000 0 494.500000 -8356.300000 0 181.700000 -8356.300000 0 181.700000 -8355.600000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 -8356.300000 0 494.500000 -8356.300000 0 494.500000 -8357.100000 0 181.700000 -8357.100000 0 181.700000 -8356.300000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 -8357.100000 0 494.500000 -8357.100000 0 494.500000 -8357.800000 0 181.700000 -8357.800000 0 181.700000 -8357.100000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 -8357.800000 0 494.500000 -8357.800000 0 494.500000 -8358.600000 0 181.700000 -8358.600000 0 181.700000 -8357.800000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 -8358.600000 0 494.500000 -8358.600000 0 494.500000 -8359.400000 0 181.700000 -8359.400000 0 181.700000 -8358.600000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 -8359.400000 0 494.500000 -8359.400000 0 494.500000 -8360.100000 0 181.700000 -8360.100000 0 181.700000 -8359.400000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 -8360.100000 0 494.500000 -8360.100000 0 494.500000 -8360.900000 0 181.700000 -8360.900000 0 181.700000 -8360.100000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 -8360.900000 0 494.500000 -8360.900000 0 494.500000 -8361.600000 0 181.700000 -8361.600000 0 181.700000 -8360.900000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 -8361.600000 0 494.500000 -8361.600000 0 494.500000 -8362.400000 0 181.700000 -8362.400000 0 181.700000 -8361.600000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 -8362.400000 0 494.500000 -8362.400000 0 494.500000 -8363.100000 0 181.700000 -8363.100000 0 181.700000 -8362.400000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 -8363.100000 0 494.500000 -8363.100000 0 494.500000 -8363.900000 0 181.700000 -8363.900000 0 181.700000 -8363.100000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 -8363.900000 0 494.500000 -8363.900000 0 494.500000 -8364.700000 0 181.700000 -8364.700000 0 181.700000 -8363.900000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 -8364.700000 0 494.500000 -8364.700000 0 494.500000 -8365.400000 0 181.700000 -8365.400000 0 181.700000 -8364.700000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 -8365.400000 0 494.500000 -8365.400000 0 494.500000 -8366.200000 0 181.700000 -8366.200000 0 181.700000 -8365.400000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 -8366.200000 0 494.500000 -8366.200000 0 494.500000 -8366.900000 0 181.700000 -8366.900000 0 181.700000 -8366.200000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 -8366.900000 0 494.500000 -8366.900000 0 494.500000 -8367.700000 0 181.700000 -8367.700000 0 181.700000 -8366.900000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 -8367.700000 0 494.500000 -8367.700000 0 494.500000 -8368.500000 0 181.700000 -8368.500000 0 181.700000 -8367.700000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 -8368.500000 0 494.500000 -8368.500000 0 494.500000 -8369.200000 0 181.700000 -8369.200000 0 181.700000 -8368.500000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 -8369.200000 0 494.500000 -8369.200000 0 494.500000 -8370.000000 0 181.700000 -8370.000000 0 181.700000 -8369.200000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 -8370.000000 0 494.500000 -8370.000000 0 494.500000 -8370.700000 0 181.700000 -8370.700000 0 181.700000 -8370.000000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 -8370.700000 0 494.500000 -8370.700000 0 494.500000 -8371.500000 0 181.700000 -8371.500000 0 181.700000 -8370.700000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 -8371.500000 0 494.500000 -8371.500000 0 494.500000 -8372.300000 0 181.700000 -8372.300000 0 181.700000 -8371.500000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 -8372.300000 0 494.500000 -8372.300000 0 494.500000 -8373.000000 0 181.700000 -8373.000000 0 181.700000 -8372.300000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 -8373.000000 0 494.500000 -8373.000000 0 494.500000 -8373.800000 0 181.700000 -8373.800000 0 181.700000 -8373.000000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 -8373.800000 0 494.500000 -8373.800000 0 494.500000 -8374.500000 0 181.700000 -8374.500000 0 181.700000 -8373.800000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 -8374.500000 0 494.500000 -8374.500000 0 494.500000 -8375.300000 0 181.700000 -8375.300000 0 181.700000 -8374.500000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 -8375.300000 0 494.500000 -8375.300000 0 494.500000 -8376.000000 0 181.700000 -8376.000000 0 181.700000 -8375.300000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 -8376.000000 0 494.500000 -8376.000000 0 494.500000 -8376.800000 0 181.700000 -8376.800000 0 181.700000 -8376.000000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 -8376.800000 0 494.500000 -8376.800000 0 494.500000 -8377.600000 0 181.700000 -8377.600000 0 181.700000 -8376.800000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 -8377.600000 0 494.500000 -8377.600000 0 494.500000 -8378.300000 0 181.700000 -8378.300000 0 181.700000 -8377.600000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 -8378.300000 0 494.500000 -8378.300000 0 494.500000 -8379.100000 0 181.700000 -8379.100000 0 181.700000 -8378.300000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 -8379.100000 0 494.500000 -8379.100000 0 494.500000 -8379.800000 0 181.700000 -8379.800000 0 181.700000 -8379.100000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 -8379.800000 0 494.500000 -8379.800000 0 494.500000 -8380.600000 0 181.700000 -8380.600000 0 181.700000 -8379.800000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 -8380.600000 0 494.500000 -8380.600000 0 494.500000 -8381.400000 0 181.700000 -8381.400000 0 181.700000 -8380.600000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 -8381.400000 0 494.500000 -8381.400000 0 494.500000 -8382.100000 0 181.700000 -8382.100000 0 181.700000 -8381.400000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 -8382.100000 0 494.500000 -8382.100000 0 494.500000 -8382.900000 0 181.700000 -8382.900000 0 181.700000 -8382.100000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 -8382.900000 0 494.500000 -8382.900000 0 494.500000 -8383.600000 0 181.700000 -8383.600000 0 181.700000 -8382.900000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 -8383.600000 0 494.500000 -8383.600000 0 494.500000 -8384.400000 0 181.700000 -8384.400000 0 181.700000 -8383.600000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 -8384.400000 0 494.500000 -8384.400000 0 494.500000 -8385.200000 0 181.700000 -8385.200000 0 181.700000 -8384.400000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 -8385.200000 0 494.500000 -8385.200000 0 494.500000 -8385.900000 0 181.700000 -8385.900000 0 181.700000 -8385.200000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 -8385.900000 0 494.500000 -8385.900000 0 494.500000 -8386.700000 0 181.700000 -8386.700000 0 181.700000 -8385.900000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 -8386.700000 0 494.500000 -8386.700000 0 494.500000 -8387.400000 0 181.700000 -8387.400000 0 181.700000 -8386.700000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 -8387.400000 0 494.500000 -8387.400000 0 494.500000 -8388.200000 0 181.700000 -8388.200000 0 181.700000 -8387.400000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 -8388.200000 0 494.500000 -8388.200000 0 494.500000 -8388.900000 0 181.700000 -8388.900000 0 181.700000 -8388.200000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 -8388.900000 0 494.500000 -8388.900000 0 494.500000 -8389.700000 0 181.700000 -8389.700000 0 181.700000 -8388.900000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 -8389.700000 0 494.500000 -8389.700000 0 494.500000 -8390.500000 0 181.700000 -8390.500000 0 181.700000 -8389.700000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 -8390.500000 0 494.500000 -8390.500000 0 494.500000 -8391.200000 0 181.700000 -8391.200000 0 181.700000 -8390.500000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 -8391.200000 0 494.500000 -8391.200000 0 494.500000 -8392.000000 0 181.700000 -8392.000000 0 181.700000 -8391.200000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 -8391.900000 0 181.800000 -8391.900000 0 181.800000 -8198.600000 0 494.400000 -8198.600000 0 494.400000 -8391.900000 0 338.100000 -8391.900000 0
+strokePath subpath 1 338.100000 -8391.900000 0 181.800000 -8391.900000 0 181.800000 -8198.600000 0 494.400000 -8198.600000 0 494.400000 -8391.900000 0 338.100000 -8391.900000 0
+saveState
+updateCtm 11420.000000 0.000000 0.000000 -8760.000000 20530.000000 910790.000000
+drawSoftMaskedImage 1143 877 1143 877 JPEG 71324 PPM 3007249
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 -8352.876000 215.488000 -8360.876000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 -8352.876000 220.592000 -8360.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 -8352.876000 225.696000 -8360.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 -8352.876000 230.800000 -8360.876000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 -8360.476000 241.388000 -8368.476000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 -8360.476000 246.492000 -8368.476000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 -8360.476000 251.596000 -8368.476000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 -8360.476000 256.700000 -8368.476000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 -8368.176000 267.188000 -8376.176000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 -8368.176000 272.292000 -8376.176000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 -8368.176000 277.396000 -8376.176000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 -8368.176000 282.500000 -8376.176000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 -8375.776000 293.088000 -8383.776000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 -8375.776000 298.192000 -8383.776000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 -8375.776000 303.296000 -8383.776000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 -8375.776000 308.400000 -8383.776000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 -8337.876000 202.588000 -8345.876000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 -8318.576000 201.688000 -8326.576000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 -8299.276000 195.788000 -8307.276000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 -8299.276000 200.892000 -8307.276000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 -8279.876000 194.888000 -8287.876000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 -8279.876000 199.992000 -8287.876000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 -8260.576000 193.988000 -8268.576000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 -8260.576000 199.092000 -8268.576000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 -8241.276000 193.088000 -8249.276000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 -8241.276000 198.192000 -8249.276000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 -8369.176000 330.188000 -8377.176000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 -8369.176000 332.716000 -8377.176000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 -8369.176000 337.596000 -8377.176000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 -8369.176000 341.396000 -8377.176000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 -8369.176000 346.036000 -8377.176000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 -8369.176000 350.900000 -8377.176000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 -8369.176000 355.972000 -8377.176000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 -8369.176000 359.196000 -8377.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 -8369.176000 362.196000 -8377.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 -8369.176000 367.404000 -8377.176000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 -8369.176000 371.876000 -8377.176000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 -8369.176000 375.052000 -8377.176000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 -8349.676000 361.172000 -8357.676000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 -8349.676000 364.340000 -8357.676000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 -8349.676000 367.396000 -8357.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 -8349.676000 372.604000 -8357.676000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 -8349.676000 379.348000 -8357.676000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 -8349.676000 384.484000 -8357.676000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 -8349.676000 389.436000 -8357.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 -8349.676000 392.108000 -8357.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 -8349.676000 395.708000 -8357.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 -8349.676000 397.540000 -8357.676000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 -8349.676000 402.444000 -8357.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 -8349.676000 406.788000 -8357.676000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 -8330.076000 392.972000 -8338.076000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 -8330.076000 398.076000 -8338.076000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 -8330.076000 403.180000 -8338.076000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 -8330.076000 405.428000 -8338.076000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 -8330.076000 410.332000 -8338.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 -8330.076000 414.476000 -8338.076000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 -8202.508000 305.808000 -8216.508000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 -8202.508000 314.138000 -8216.508000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 -8202.508000 320.788000 -8216.508000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 -8202.508000 328.698000 -8216.508000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 -8202.508000 336.972000 -8216.508000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 -8202.508000 344.182000 -8216.508000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 -8202.508000 349.810000 -8216.508000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 -8202.508000 354.234000 -8216.508000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 -8202.508000 362.718000 -8216.508000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 -8202.508000 367.870000 -8216.508000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 -8202.508000 372.322000 -8216.508000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 -8202.508000 382.080000 -8216.508000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 -8202.508000 388.772000 -8216.508000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 -8202.508000 397.802000 -8216.508000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 -8202.508000 402.254000 -8216.508000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 -8202.508000 407.896000 -8216.508000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 -8325.400000 0 424.300000 -8325.400000 0 424.300000 -8264.700000 0 493.600000 -8264.700000 0 493.600000 -8325.400000 0 458.900000 -8325.400000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 -8274.300000 0 428.900000 -8274.300000 0 428.900000 -8268.300000 0 434.800000 -8268.300000 0 434.800000 -8274.300000 0 431.900000 -8274.300000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 -8285.400000 0 428.900000 -8285.400000 0 428.900000 -8279.400000 0 434.800000 -8279.400000 0 434.800000 -8285.400000 0 431.900000 -8285.400000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 -8296.500000 0 428.900000 -8296.500000 0 428.900000 -8290.500000 0 434.800000 -8290.500000 0 434.800000 -8296.500000 0 431.900000 -8296.500000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 -8307.600000 0 428.900000 -8307.600000 0 428.900000 -8301.600000 0 434.800000 -8301.600000 0 434.800000 -8307.600000 0 431.900000 -8307.600000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 -8318.700000 0 428.900000 -8318.700000 0 428.900000 -8312.700000 0 434.800000 -8312.700000 0 434.800000 -8318.700000 0 431.900000 -8318.700000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -8267.176000 443.288000 -8275.176000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 -8267.176000 445.816000 -8275.176000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 -8267.176000 450.600000 -8275.176000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 -8267.176000 454.496000 -8275.176000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 -8267.176000 459.136000 -8275.176000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 -8267.176000 464.000000 -8275.176000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 -8267.176000 468.976000 -8275.176000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 -8267.176000 472.304000 -8275.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 -8267.176000 475.208000 -8275.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 -8267.176000 480.520000 -8275.176000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 -8267.176000 484.992000 -8275.176000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 -8267.176000 488.168000 -8275.176000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -8278.276000 443.352000 -8286.276000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 -8278.276000 447.920000 -8286.276000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 -8278.276000 452.976000 -8286.276000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 -8278.276000 457.400000 -8286.276000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 -8278.276000 462.472000 -8286.276000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 -8278.276000 465.800000 -8286.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 -8278.276000 468.904000 -8286.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 -8278.276000 473.816000 -8286.276000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 -8278.276000 478.888000 -8286.276000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 -8278.276000 482.064000 -8286.276000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -8289.376000 442.872000 -8297.376000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 -8289.376000 446.040000 -8297.376000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 -8289.376000 448.992000 -8297.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 -8289.376000 454.304000 -8297.376000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 -8289.376000 461.048000 -8297.376000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 -8289.376000 466.184000 -8297.376000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 -8289.376000 471.136000 -8297.376000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 -8289.376000 473.808000 -8297.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 -8289.376000 477.408000 -8297.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 -8289.376000 479.240000 -8297.376000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 -8289.376000 484.144000 -8297.376000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 -8289.376000 488.488000 -8297.376000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -8300.476000 443.384000 -8308.476000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 -8300.476000 448.464000 -8308.476000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 -8300.476000 453.424000 -8308.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 -8300.476000 456.696000 -8308.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 -8300.476000 459.800000 -8308.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 -8300.476000 462.032000 -8308.476000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 -8300.476000 466.936000 -8308.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 -8300.476000 471.080000 -8308.476000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -8311.576000 443.272000 -8319.576000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 -8311.576000 448.376000 -8319.576000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 -8311.576000 453.480000 -8319.576000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 -8311.576000 455.728000 -8319.576000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 -8311.576000 460.632000 -8319.576000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 -8311.576000 464.776000 -8319.576000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -10956.600000 0 114.800000 -10956.600000 0 114.800000 -10913.800000 0 72.000000 -10913.800000 0 72.000000 -10956.600000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 1174850.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 108.000000 546.200000 0 540.000000 546.200000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 546.200000 0
+eoFillPath subpath 1 108.000000 72.000000 0 540.000000 72.000000 0 540.000000 245.800000 0 108.000000 245.800000 0 108.000000 72.000000 0
+eoFillPath subpath 1 108.000000 245.800000 0 157.400000 245.800000 0 157.400000 546.200000 0 108.000000 546.200000 0 108.000000 245.800000 0
+eoFillPath subpath 1 490.500000 245.800000 0 540.000000 245.800000 0 540.000000 546.200000 0 490.500000 546.200000 0 490.500000 245.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 15740.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 108.000000 701.300000 0 540.000000 701.300000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 701.300000 0
+eoFillPath subpath 1 108.000000 76.200000 0 540.000000 76.200000 0 540.000000 90.100000 0 108.000000 90.100000 0 108.000000 76.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 108.100000 719.948000 121.892000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 121.908000 719.948000 131.364000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 131.412000 719.948000 136.484000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 136.516000 719.948000 148.532000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 148.516000 719.948000 158.292000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 158.324000 719.948000 168.452000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 168.420000 719.948000 176.740000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 176.724000 719.948000 186.564000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 186.532000 719.948000 191.604000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 191.636000 719.948000 197.396000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 197.444000 719.948000 202.516000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 202.500000 719.948000 211.700000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 210.500000 719.948000 214.932000 703.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 214.900000 719.948000 221.476000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 221.508000 719.948000 229.828000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 229.812000 719.948000 236.084000 703.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 236.116000 719.948000 241.188000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 241.220000 719.948000 250.420000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 250.420000 719.948000 254.852000 703.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 254.820000 719.948000 264.596000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 264.628000 719.948000 274.404000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 274.436000 719.948000 281.012000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 672.936000 229.492000 660.936000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 229.504000 672.936000 237.232000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 237.208000 672.936000 244.300000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 246.712000 672.936000 250.516000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 252.916000 672.936000 256.744000 660.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 256.720000 672.936000 263.872000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 263.920000 672.936000 269.656000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 269.620000 672.936000 277.300000 660.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 277.420000 672.936000 284.512000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 286.924000 672.936000 290.728000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 293.224000 672.936000 298.960000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 298.924000 672.936000 306.148000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 306.220000 672.936000 313.444000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 313.420000 672.936000 324.796000 660.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 327.124000 672.936000 330.928000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 333.424000 672.936000 337.252000 660.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 337.228000 672.936000 343.384000 660.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 345.724000 672.936000 349.528000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 352.120000 672.936000 358.888000 660.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 358.816000 672.936000 365.908000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 365.920000 672.936000 371.656000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 371.620000 672.936000 378.388000 660.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 380.920000 672.936000 384.724000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 387.124000 672.936000 393.280000 660.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 393.328000 672.936000 401.008000 660.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 400.924000 672.936000 408.076000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 408.124000 672.936000 413.860000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 413.824000 672.936000 419.980000 660.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 420.028000 672.936000 427.120000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 427.132000 672.936000 430.960000 660.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 430.936000 672.936000 437.704000 660.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 440.140000 672.936000 443.944000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 446.440000 672.936000 450.880000 660.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 450.844000 672.936000 458.572000 660.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 458.644000 672.936000 464.380000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 464.344000 672.936000 472.072000 660.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 472.048000 672.936000 475.876000 660.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 475.948000 672.936000 482.104000 660.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 482.044000 672.936000 489.772000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 489.844000 672.936000 496.936000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 496.948000 672.936000 504.628000 660.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 504.544000 672.936000 508.348000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 510.844000 672.936000 514.648000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 517.048000 672.936000 525.040000 660.936000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 525.052000 672.936000 532.780000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 532.756000 672.936000 539.848000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 672.936000 543.904000 660.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 659.036000 227.656000 647.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 659.036000 232.516000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 232.600000 659.036000 239.752000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 239.596000 659.036000 243.424000 647.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 243.496000 659.036000 251.224000 647.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 251.200000 659.036000 258.292000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 258.304000 659.036000 265.984000 647.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 266.200000 659.036000 270.004000 647.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 270.100000 659.036000 277.828000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 277.804000 659.036000 284.956000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 285.004000 659.036000 290.740000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 290.704000 659.036000 298.384000 647.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 298.408000 659.036000 308.668000 647.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 308.704000 659.036000 315.928000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 315.904000 659.036000 323.128000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 323.104000 659.036000 330.784000 647.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 330.904000 659.036000 334.708000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 335.008000 659.036000 343.000000 647.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 343.012000 659.036000 350.236000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 350.116000 659.036000 357.340000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 357.412000 659.036000 363.148000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 363.112000 659.036000 366.916000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 367.108000 659.036000 370.936000 647.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 370.912000 659.036000 377.068000 647.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 377.212000 659.036000 381.016000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 381.316000 659.036000 388.996000 647.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 389.020000 659.036000 396.112000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 396.124000 659.036000 402.844000 647.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 402.820000 659.036000 410.044000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 410.020000 659.036000 415.756000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 415.720000 659.036000 422.872000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 422.920000 659.036000 427.732000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 427.720000 659.036000 434.812000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 434.824000 659.036000 442.504000 647.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 442.624000 659.036000 446.428000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 446.524000 659.036000 453.748000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 453.724000 659.036000 461.452000 647.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 461.524000 659.036000 465.352000 647.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 465.328000 659.036000 472.096000 647.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 472.132000 659.036000 475.936000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 476.128000 659.036000 486.388000 647.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 486.424000 659.036000 490.252000 647.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 490.228000 659.036000 495.040000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 495.124000 659.036000 502.852000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 502.924000 659.036000 506.728000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 506.824000 659.036000 513.976000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 514.120000 659.036000 517.924000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 518.224000 659.036000 522.664000 647.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 522.520000 659.036000 529.612000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 529.624000 659.036000 539.884000 647.036000 1.000000 0.000000 0.000000 1.000000 w
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 659.036000 543.904000 647.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 645.136000 227.656000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 645.136000 239.080000 633.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 239.008000 645.136000 246.160000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 246.208000 645.136000 250.036000 633.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 250.012000 645.136000 253.840000 633.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 254.812000 645.136000 258.616000 633.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 258.700000 645.136000 265.924000 633.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 265.900000 645.136000 271.636000 633.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 271.696000 645.136000 275.524000 633.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 275.500000 645.136000 282.592000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 282.604000 645.136000 290.332000 633.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 290.308000 645.136000 295.120000 633.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 295.204000 645.136000 302.356000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 302.308000 645.136000 306.136000 633.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 306.604000 645.136000 310.408000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 311.008000 645.136000 317.728000 633.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 317.704000 645.136000 324.856000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 324.904000 645.136000 330.640000 633.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 330.604000 645.136000 338.284000 633.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 338.308000 645.136000 345.400000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 345.412000 645.136000 350.224000 633.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 350.212000 645.136000 356.368000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 356.416000 645.136000 360.220000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 360.520000 645.136000 364.324000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 365.416000 645.136000 369.220000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 369.712000 645.136000 377.704000 633.136000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 377.716000 645.136000 385.444000 633.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 385.420000 645.136000 392.512000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 392.920000 645.136000 396.724000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 397.216000 645.136000 401.044000 633.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 401.020000 645.136000 408.112000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 408.124000 645.136000 415.276000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 415.324000 645.136000 419.764000 633.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 419.728000 645.136000 426.496000 633.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 427.024000 645.136000 430.828000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 431.428000 645.136000 439.108000 633.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 439.024000 645.136000 446.176000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 446.224000 645.136000 450.052000 633.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 450.028000 645.136000 461.404000 633.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 461.428000 645.136000 467.584000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 468.028000 645.136000 471.832000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 472.324000 645.136000 480.052000 633.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 480.028000 645.136000 487.120000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 487.132000 645.136000 493.888000 633.136000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 493.936000 645.136000 498.748000 633.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 499.240000 645.136000 503.044000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 503.536000 645.136000 508.348000 633.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 508.336000 645.136000 515.560000 633.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 516.040000 645.136000 519.844000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 520.336000 645.136000 525.148000 633.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 525.136000 645.136000 532.864000 633.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 532.936000 645.136000 540.028000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 645.136000 543.904000 633.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 631.236000 231.760000 619.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 231.796000 631.236000 235.624000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 235.600000 631.236000 243.328000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 243.304000 631.236000 250.984000 619.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 251.008000 631.236000 258.232000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 258.208000 631.236000 268.468000 619.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 271.408000 631.236000 275.212000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 278.212000 631.236000 282.040000 619.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 282.016000 631.236000 289.108000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 289.120000 631.236000 296.848000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 296.920000 631.236000 304.600000 619.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 307.516000 631.236000 311.320000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 314.320000 631.236000 321.472000 619.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 324.316000 631.236000 328.120000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 331.216000 631.236000 337.936000 619.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 337.912000 631.236000 345.004000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 345.016000 631.236000 350.752000 619.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 350.812000 631.236000 355.624000 619.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 355.516000 631.236000 362.668000 619.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 362.716000 631.236000 366.544000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 366.520000 631.236000 374.248000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 377.224000 631.236000 381.028000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 384.028000 631.236000 391.120000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 391.132000 631.236000 397.888000 619.236000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 397.936000 631.236000 405.160000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 405.136000 631.236000 409.948000 619.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 409.936000 631.236000 413.764000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 413.836000 631.236000 420.556000 619.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 423.436000 631.236000 427.240000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 430.240000 631.236000 437.392000 619.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 437.440000 631.236000 448.816000 619.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 448.744000 631.236000 456.424000 619.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 456.448000 631.236000 460.276000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 460.348000 631.236000 467.500000 619.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 467.452000 631.236000 475.180000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 475.156000 631.236000 481.876000 619.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 481.960000 631.236000 489.052000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 491.860000 631.236000 495.664000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 498.664000 631.236000 503.476000 619.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 503.560000 631.236000 510.784000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 513.664000 631.236000 517.468000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 520.468000 631.236000 525.280000 619.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 525.268000 631.236000 532.996000 619.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 533.068000 631.236000 540.160000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 631.236000 543.904000 619.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 617.336000 227.236000 605.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 227.200000 617.336000 234.424000 605.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 234.400000 617.336000 241.624000 605.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 241.600000 617.336000 252.976000 605.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 253.000000 617.336000 256.804000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.804000 617.336000 260.608000 605.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 597.436000 229.564000 585.436000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 229.600000 597.436000 235.336000 585.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 235.300000 597.436000 242.524000 585.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 242.500000 597.436000 249.268000 585.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 249.304000 597.436000 253.132000 585.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 253.204000 597.436000 260.884000 585.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 260.800000 597.436000 264.628000 585.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 264.700000 597.436000 272.428000 585.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 272.404000 597.436000 280.084000 585.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 282.400000 597.436000 286.204000 585.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.604000 597.436000 293.416000 585.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 293.404000 597.436000 301.132000 585.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 301.204000 597.436000 308.296000 585.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 310.600000 597.436000 314.404000 585.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 316.900000 597.436000 324.580000 585.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 324.496000 597.436000 331.588000 585.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 331.600000 597.436000 337.756000 585.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 337.804000 597.436000 341.632000 585.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 341.608000 597.436000 347.344000 585.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 347.308000 597.436000 354.400000 585.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 354.412000 597.436000 362.092000 585.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 364.516000 597.436000 368.320000 585.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.720000 597.436000 377.440000 585.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 377.416000 597.436000 384.640000 585.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 384.616000 597.436000 392.344000 585.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 392.416000 597.436000 397.228000 585.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 397.216000 597.436000 402.952000 585.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 402.916000 597.436000 410.068000 585.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 410.116000 597.436000 416.272000 585.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 416.212000 597.436000 421.024000 585.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 423.412000 597.436000 427.216000 585.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.712000 597.436000 437.392000 585.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 437.308000 597.436000 444.400000 585.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 444.412000 597.436000 449.224000 585.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 449.308000 597.436000 459.568000 585.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 459.604000 597.436000 466.696000 585.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.708000 597.436000 473.800000 585.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 473.812000 597.436000 481.540000 585.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 483.808000 597.436000 487.612000 585.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 490.012000 597.436000 497.236000 585.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 497.212000 597.436000 501.040000 585.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 501.112000 597.436000 508.792000 585.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 511.108000 597.436000 514.912000 585.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 517.312000 597.436000 524.464000 585.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 524.512000 597.436000 532.240000 585.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 532.216000 597.436000 539.896000 585.436000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 597.436000 543.904000 585.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 583.536000 229.228000 571.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 229.204000 583.536000 236.296000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.308000 583.536000 246.568000 571.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 245.212000 583.536000 249.016000 571.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 250.612000 583.536000 254.416000 571.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 256.012000 583.536000 263.164000 571.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 263.212000 583.536000 268.948000 571.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 268.912000 583.536000 276.004000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 277.612000 583.536000 281.416000 571.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 283.012000 583.536000 289.168000 571.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 289.216000 583.536000 296.308000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 296.320000 583.536000 303.088000 571.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 303.016000 583.536000 310.108000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 310.120000 583.536000 315.856000 571.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 315.916000 583.536000 323.068000 571.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 323.020000 583.536000 326.848000 571.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 328.516000 583.536000 332.320000 571.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 333.916000 583.536000 341.068000 571.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 341.116000 583.536000 348.844000 571.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 348.820000 583.536000 353.632000 571.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 353.620000 583.536000 357.448000 571.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 357.424000 583.536000 365.104000 571.536000 1.000000 0.000000 0.000000 1.000000 q
+drawChar 365.128000 583.536000 372.856000 571.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 372.928000 583.536000 380.020000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 380.032000 583.536000 386.188000 571.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 387.736000 583.536000 391.540000 571.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 393.136000 583.536000 399.292000 571.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 399.340000 583.536000 407.068000 571.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 407.044000 583.536000 413.764000 571.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 413.740000 583.536000 421.468000 571.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 423.136000 583.536000 426.940000 571.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 428.536000 583.536000 435.688000 571.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 435.736000 583.536000 441.892000 571.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 443.440000 583.536000 447.244000 571.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 448.840000 583.536000 453.652000 571.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 453.640000 583.536000 461.368000 571.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 461.440000 583.536000 468.532000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.140000 583.536000 473.944000 571.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 475.540000 583.536000 482.260000 571.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 482.236000 583.536000 489.964000 571.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 489.940000 583.536000 497.092000 571.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 497.140000 583.536000 504.868000 571.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 504.844000 583.536000 512.524000 571.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 512.548000 583.536000 519.640000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 519.652000 583.536000 523.480000 571.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 523.552000 583.536000 527.380000 571.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 527.356000 583.536000 534.448000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 534.460000 583.536000 540.196000 571.536000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 583.536000 543.904000 571.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 569.636000 229.228000 557.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 229.204000 569.636000 236.356000 557.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 236.404000 569.636000 244.132000 557.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 244.108000 569.636000 251.788000 557.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 251.812000 569.636000 255.640000 557.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 255.616000 569.636000 263.344000 557.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 263.416000 569.636000 271.096000 557.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 273.316000 569.636000 277.120000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.616000 569.636000 284.056000 557.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 284.020000 569.636000 289.756000 557.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 289.720000 569.636000 296.944000 557.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 297.016000 569.636000 308.392000 557.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 310.720000 569.636000 314.524000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 317.020000 569.636000 321.832000 557.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 321.820000 569.636000 329.548000 557.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 329.620000 569.636000 336.712000 557.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 338.920000 569.636000 342.724000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 345.124000 569.636000 352.852000 557.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 352.828000 569.636000 356.656000 557.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 356.728000 569.636000 364.408000 557.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 364.324000 569.636000 372.052000 557.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 374.524000 569.636000 378.328000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 380.728000 569.636000 387.448000 557.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 387.424000 569.636000 394.516000 557.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 394.528000 569.636000 398.356000 557.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 398.428000 569.636000 402.256000 557.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 402.232000 569.636000 406.060000 557.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 406.036000 569.636000 413.764000 557.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 413.836000 569.636000 421.516000 557.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 421.432000 569.636000 425.236000 557.636000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 427.636000 569.636000 431.440000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 433.840000 569.636000 440.992000 557.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 441.040000 569.636000 448.768000 557.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 448.744000 569.636000 456.424000 557.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 458.740000 569.636000 462.544000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 465.040000 569.636000 469.852000 557.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 469.840000 569.636000 477.568000 557.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 477.640000 569.636000 484.732000 557.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 486.940000 569.636000 490.744000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 493.144000 569.636000 499.864000 557.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 499.948000 569.636000 507.172000 557.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 507.148000 569.636000 510.976000 557.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 511.048000 569.636000 518.272000 557.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 518.152000 569.636000 523.888000 557.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 523.852000 569.636000 528.292000 557.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 528.352000 569.636000 536.080000 557.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 536.056000 569.636000 539.884000 557.636000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 569.636000 543.904000 557.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 555.736000 229.492000 543.736000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 229.504000 555.736000 233.332000 543.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 233.308000 555.736000 241.828000 543.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 241.804000 555.736000 248.956000 543.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 249.004000 555.736000 256.732000 543.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 256.708000 555.736000 263.476000 543.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 263.512000 555.736000 267.316000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 267.316000 555.736000 271.144000 543.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 271.120000 555.736000 278.272000 543.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 278.320000 555.736000 289.696000 543.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 289.720000 555.736000 297.400000 543.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 297.424000 555.736000 303.580000 543.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 303.628000 555.736000 307.432000 543.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 307.432000 555.736000 311.236000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 311.236000 555.736000 321.736000 543.736000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 321.736000 555.736000 328.828000 543.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 328.840000 555.736000 335.596000 543.736000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 335.644000 555.736000 340.456000 543.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 340.444000 555.736000 344.248000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 344.248000 555.736000 349.060000 543.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.048000 555.736000 356.272000 543.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 356.248000 555.736000 360.052000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 360.052000 555.736000 364.864000 543.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.852000 555.736000 372.580000 543.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 372.556000 555.736000 379.648000 543.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 379.660000 555.736000 383.464000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 383.464000 555.736000 394.840000 543.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 394.864000 555.736000 402.088000 543.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 402.064000 555.736000 409.744000 543.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 409.768000 555.736000 416.860000 543.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 416.872000 555.736000 422.608000 543.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 422.572000 555.736000 430.300000 543.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 430.276000 555.736000 434.080000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 434.080000 555.736000 441.760000 543.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 441.784000 555.736000 445.612000 543.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.588000 555.736000 452.740000 543.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 452.788000 555.736000 459.508000 543.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 459.484000 555.736000 466.744000 543.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 466.780000 555.736000 470.584000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 470.584000 555.736000 474.412000 543.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 474.388000 555.736000 481.480000 543.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 481.492000 555.736000 488.644000 543.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 488.692000 555.736000 493.504000 543.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 493.492000 555.736000 501.220000 543.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 501.196000 555.736000 508.288000 543.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 508.300000 555.736000 514.036000 543.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 514.000000 555.736000 517.804000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 517.804000 555.736000 522.244000 543.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 522.208000 555.736000 529.936000 543.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 529.912000 555.736000 535.648000 543.736000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 555.736000 540.044000 543.736000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 541.836000 229.228000 529.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 229.204000 541.836000 233.032000 529.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 233.104000 541.836000 237.916000 529.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 237.904000 541.836000 245.632000 529.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 245.608000 541.836000 251.344000 529.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 251.404000 541.836000 258.496000 529.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 258.604000 541.836000 262.408000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.600000 541.836000 269.752000 529.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 269.800000 541.836000 277.528000 529.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 277.504000 541.836000 285.184000 529.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 285.304000 541.836000 289.108000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 289.300000 541.836000 296.020000 529.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 296.104000 541.836000 299.932000 529.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 299.908000 541.836000 307.000000 529.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 307.012000 541.836000 314.164000 529.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.212000 541.836000 319.948000 529.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 319.912000 541.836000 323.716000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 324.016000 541.836000 331.696000 529.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 331.720000 541.836000 335.548000 529.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 335.524000 541.836000 342.676000 529.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 342.724000 541.836000 348.880000 529.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 348.820000 541.836000 354.976000 529.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 355.216000 541.836000 359.020000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 359.212000 541.836000 365.932000 529.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 365.908000 541.836000 373.132000 529.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 373.108000 541.836000 381.628000 529.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 381.712000 541.836000 388.804000 529.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.816000 541.836000 395.908000 529.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 396.016000 541.836000 399.820000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 400.012000 541.836000 404.824000 529.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 404.812000 541.836000 411.964000 529.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 412.012000 541.836000 419.692000 529.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 419.716000 541.836000 423.544000 529.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 423.520000 541.836000 430.612000 529.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 430.624000 541.836000 434.428000 529.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 434.620000 541.836000 438.424000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.616000 541.836000 443.428000 529.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 443.512000 541.836000 451.240000 529.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 451.216000 541.836000 458.308000 529.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 458.320000 541.836000 462.124000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 462.424000 541.836000 469.648000 529.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 469.624000 541.836000 477.304000 529.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 477.328000 541.836000 485.008000 529.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 485.032000 541.836000 492.256000 529.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 492.232000 541.836000 498.388000 529.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 498.436000 541.836000 502.264000 529.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 502.240000 541.836000 507.052000 529.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 507.040000 541.836000 510.868000 529.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 510.940000 541.836000 518.164000 529.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 518.140000 541.836000 525.868000 529.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 526.036000 541.836000 529.840000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 530.032000 541.836000 533.860000 529.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 533.836000 541.836000 539.992000 529.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 541.836000 543.904000 529.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 527.936000 227.656000 515.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 527.936000 232.516000 515.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 232.504000 527.936000 238.240000 515.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 238.204000 527.936000 242.032000 515.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 242.008000 527.936000 249.268000 515.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 249.304000 527.936000 253.132000 515.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 253.108000 527.936000 260.836000 515.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 260.812000 527.936000 268.492000 515.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 268.516000 527.936000 272.344000 515.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 272.320000 527.936000 279.088000 515.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 279.124000 527.936000 282.928000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 282.928000 527.936000 290.080000 515.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 290.128000 527.936000 297.808000 515.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 297.832000 527.936000 305.512000 515.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 305.536000 527.936000 312.628000 515.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 312.640000 527.936000 319.792000 515.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 319.840000 527.936000 323.668000 515.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 323.644000 527.936000 327.472000 515.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 327.448000 527.936000 335.176000 515.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 335.152000 527.936000 342.832000 515.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 342.856000 527.936000 346.660000 515.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 103 1 0 0 0 1200.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 502.136000 116.296000 490.136000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 116.296000 502.136000 120.400000 490.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 120.400000 502.136000 126.316000 490.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 126.304000 502.136000 134.440000 490.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 134.404000 502.136000 142.984000 490.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.008000 502.136000 147.112000 490.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.112000 502.136000 155.200000 490.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 155.212000 502.136000 162.316000 490.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 162.316000 502.136000 170.452000 490.136000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 485.136000 230.164000 473.136000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 230.896000 485.136000 234.700000 473.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 235.492000 485.136000 242.212000 473.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 242.188000 485.136000 247.924000 473.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 247.984000 485.136000 255.136000 473.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 255.088000 485.136000 261.808000 473.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 261.784000 485.136000 269.044000 473.136000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 269.080000 485.136000 272.908000 473.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 272.884000 485.136000 276.712000 473.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 276.784000 485.136000 284.512000 473.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 284.488000 485.136000 292.168000 473.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 292.192000 485.136000 295.996000 473.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 296.692000 485.136000 300.496000 473.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 301.288000 485.136000 308.968000 473.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 308.992000 485.136000 316.720000 473.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 316.696000 485.136000 322.432000 473.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 322.396000 485.136000 330.124000 473.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 330.196000 485.136000 334.024000 473.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 334.000000 485.136000 341.728000 473.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 341.704000 485.136000 349.384000 473.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 350.104000 485.136000 353.908000 473.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 355.408000 485.136000 363.400000 473.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 362.704000 485.136000 368.440000 473.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 368.404000 485.136000 375.496000 473.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 376.300000 485.136000 380.104000 473.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 380.896000 485.136000 388.576000 473.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 388.600000 485.136000 394.336000 473.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 394.300000 485.136000 398.128000 473.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 398.200000 485.136000 405.928000 473.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 405.904000 485.136000 413.584000 473.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 413.608000 485.136000 419.764000 473.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 420.412000 485.136000 424.216000 473.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 425.008000 485.136000 432.160000 473.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 432.904000 485.136000 436.708000 473.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 437.500000 485.136000 447.760000 473.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 447.796000 485.136000 454.948000 473.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.900000 485.136000 460.636000 473.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 460.696000 485.136000 472.072000 473.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 472.000000 485.136000 475.804000 473.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 476.596000 485.136000 480.400000 473.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 481.192000 485.136000 487.912000 473.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 487.888000 485.136000 495.112000 473.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 495.088000 485.136000 501.400000 473.136000 1.000000 0.000000 0.000000 1.000000 z
+drawChar 501.484000 485.136000 508.252000 473.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 508.888000 485.136000 512.692000 473.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 513.484000 485.136000 517.924000 473.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 517.888000 485.136000 524.980000 473.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 524.992000 485.136000 532.084000 473.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 532.096000 485.136000 535.924000 473.136000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 485.136000 540.044000 473.136000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 471.236000 225.328000 459.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 225.304000 471.236000 233.032000 459.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 233.104000 471.236000 240.784000 459.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 240.904000 471.236000 244.708000 459.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.104000 471.236000 248.932000 459.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 248.908000 471.236000 256.636000 459.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 256.708000 471.236000 261.520000 459.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 261.508000 471.236000 268.732000 459.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 268.912000 471.236000 272.716000 459.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 273.016000 471.236000 280.168000 459.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 280.216000 471.236000 287.944000 459.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 287.920000 471.236000 294.688000 459.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 294.916000 471.236000 298.720000 459.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 299.020000 471.236000 304.756000 459.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 304.720000 471.236000 311.944000 459.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 312.016000 471.236000 319.240000 459.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 319.216000 471.236000 330.592000 459.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 330.616000 471.236000 334.420000 459.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 334.516000 471.236000 338.320000 459.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 338.716000 471.236000 346.708000 459.236000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 346.720000 471.236000 354.448000 459.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 354.424000 471.236000 361.516000 459.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 361.720000 471.236000 365.524000 459.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 366.016000 471.236000 374.008000 459.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 373.816000 471.236000 379.552000 459.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 379.516000 471.236000 386.608000 459.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 386.620000 471.236000 394.300000 459.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 394.324000 471.236000 398.152000 459.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 398.224000 471.236000 405.376000 459.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 405.328000 471.236000 412.048000 459.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 412.024000 471.236000 419.116000 459.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 419.320000 471.236000 423.124000 459.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 423.520000 471.236000 427.348000 459.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 427.324000 471.236000 433.480000 459.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 433.720000 471.236000 437.524000 459.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 437.824000 471.236000 444.976000 459.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 445.120000 471.236000 448.924000 459.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 449.224000 471.236000 456.904000 459.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 456.928000 471.236000 464.080000 459.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 464.032000 471.236000 469.768000 459.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 469.828000 471.236000 474.640000 459.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 474.832000 471.236000 478.636000 459.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 478.936000 471.236000 486.160000 459.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 486.232000 471.236000 490.672000 459.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 490.828000 471.236000 494.632000 459.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 494.932000 471.236000 499.744000 459.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 499.828000 471.236000 507.556000 459.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 507.532000 471.236000 514.624000 459.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 514.828000 471.236000 518.632000 459.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 518.932000 471.236000 526.156000 459.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 526.132000 471.236000 531.868000 459.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 531.928000 471.236000 535.756000 459.236000 1.000000 0.000000 0.000000 1.000000 i
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 471.236000 540.044000 459.236000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 457.336000 229.180000 445.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 229.204000 457.336000 233.032000 445.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 233.008000 457.336000 240.736000 445.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 240.712000 457.336000 247.864000 445.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 247.912000 457.336000 251.740000 445.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 251.716000 457.336000 255.520000 445.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 255.820000 457.336000 261.976000 445.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 262.024000 457.336000 266.836000 445.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 266.728000 457.336000 272.464000 445.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 272.428000 457.336000 280.156000 445.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 280.228000 457.336000 286.948000 445.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 286.924000 457.336000 291.736000 445.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 291.724000 457.336000 299.452000 445.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 299.428000 457.336000 305.164000 445.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 305.224000 457.336000 312.316000 445.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 312.424000 457.336000 316.228000 445.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 316.528000 457.336000 323.752000 445.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 323.632000 457.336000 328.072000 445.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 328.228000 457.336000 332.032000 445.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 332.128000 457.336000 336.940000 445.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 336.928000 457.336000 344.656000 445.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 344.728000 457.336000 351.820000 445.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 351.928000 457.336000 355.732000 445.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 356.032000 457.336000 363.760000 445.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 363.628000 457.336000 370.852000 445.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 370.828000 457.336000 378.556000 445.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 378.628000 457.336000 384.784000 445.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 384.724000 457.336000 391.816000 445.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 391.828000 457.336000 395.632000 445.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 395.632000 457.336000 399.436000 445.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 399.628000 457.336000 406.780000 445.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 406.828000 457.336000 414.556000 445.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 414.532000 457.336000 422.212000 445.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 422.332000 457.336000 426.136000 445.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 426.436000 457.336000 430.264000 445.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 430.240000 457.336000 435.052000 445.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 435.040000 457.336000 441.196000 445.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 441.244000 457.336000 445.048000 445.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 445.240000 457.336000 453.988000 445.336000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 453.940000 457.336000 461.092000 445.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 461.140000 457.336000 466.876000 445.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 466.840000 457.336000 470.668000 445.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 470.644000 457.336000 477.412000 445.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 477.448000 457.336000 481.492000 445.336000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 481.552000 457.336000 490.216000 445.336000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 490.156000 457.336000 501.532000 445.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 501.556000 457.336000 508.648000 445.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 508.660000 457.336000 514.396000 445.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 514.360000 457.336000 518.188000 445.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 518.260000 457.336000 524.980000 445.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 524.956000 457.336000 532.108000 445.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 532.156000 457.336000 539.884000 445.336000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 457.336000 543.904000 445.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 443.436000 229.180000 431.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 229.204000 443.436000 236.296000 431.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.308000 443.436000 242.464000 431.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 242.512000 443.436000 246.340000 431.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 246.316000 443.436000 253.996000 431.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 254.020000 443.436000 261.748000 431.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 261.724000 443.436000 265.528000 431.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 265.624000 443.436000 272.776000 431.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 272.824000 443.436000 276.652000 431.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 276.628000 443.436000 282.784000 431.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 282.832000 443.436000 290.056000 431.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 290.032000 443.436000 293.836000 431.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 293.932000 443.436000 300.652000 431.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 300.628000 443.436000 307.852000 431.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 307.828000 443.436000 315.556000 431.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 315.532000 443.436000 320.344000 431.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 320.332000 443.436000 326.068000 431.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 326.032000 443.436000 333.184000 431.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 333.232000 443.436000 339.388000 431.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 339.436000 443.436000 344.248000 431.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 344.236000 443.436000 350.392000 431.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 350.440000 443.436000 354.244000 431.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.340000 443.436000 361.492000 431.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 361.540000 443.436000 366.352000 431.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 366.340000 443.436000 371.152000 431.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 371.140000 443.436000 376.876000 431.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 376.840000 443.436000 383.992000 431.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 384.040000 443.436000 390.760000 431.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 390.736000 443.436000 395.548000 431.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 395.536000 443.436000 399.364000 431.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 399.340000 443.436000 406.108000 431.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 406.144000 443.436000 413.236000 431.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 413.248000 443.436000 417.076000 431.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 417.052000 443.436000 423.820000 431.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 423.856000 443.436000 427.660000 431.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 427.756000 443.436000 432.568000 431.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 432.556000 443.436000 439.780000 431.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 439.756000 443.436000 443.560000 431.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 443.656000 443.436000 448.468000 431.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 448.456000 443.436000 456.184000 431.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 456.160000 443.436000 463.252000 431.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 463.264000 443.436000 467.068000 431.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 467.164000 443.436000 478.540000 431.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 478.564000 443.436000 485.788000 431.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 485.764000 443.436000 493.444000 431.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 493.468000 443.436000 500.560000 431.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 500.572000 443.436000 506.308000 431.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 506.272000 443.436000 514.000000 431.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 513.976000 443.436000 517.780000 431.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 517.876000 443.436000 522.316000 431.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 522.280000 443.436000 530.008000 431.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 529.984000 443.436000 535.720000 431.436000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 443.436000 540.044000 431.436000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 429.536000 229.228000 417.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 229.204000 429.536000 233.032000 417.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 233.008000 429.536000 237.820000 417.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 237.808000 429.536000 245.536000 417.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 245.512000 429.536000 251.248000 417.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 251.212000 429.536000 258.304000 417.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 258.316000 429.536000 262.120000 417.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.120000 429.536000 265.948000 417.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 265.924000 429.536000 273.652000 417.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 273.628000 429.536000 277.432000 417.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.432000 429.536000 282.244000 417.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 282.232000 429.536000 289.960000 417.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 289.936000 429.536000 297.028000 417.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 297.040000 429.536000 300.844000 417.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 300.844000 429.536000 306.580000 417.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 306.544000 429.536000 313.768000 417.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 313.744000 429.536000 320.968000 417.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 320.944000 429.536000 332.320000 417.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 332.344000 429.536000 336.148000 417.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 103 1 0 0 0 1200.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 403.736000 117.244000 391.736000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 117.196000 403.736000 125.440000 391.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 125.392000 403.736000 133.636000 391.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 133.588000 403.736000 141.568000 391.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 141.592000 403.736000 148.696000 391.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 148.696000 403.736000 156.784000 391.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 156.796000 403.736000 163.936000 391.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 163.900000 403.736000 172.036000 391.736000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 386.736000 233.776000 374.736000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 233.800000 386.736000 240.568000 374.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 241.204000 386.736000 245.008000 374.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.704000 386.736000 253.384000 374.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 253.408000 386.736000 260.632000 374.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 260.608000 386.736000 267.832000 374.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 267.808000 386.736000 275.068000 374.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 275.104000 386.736000 281.824000 374.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 281.800000 386.736000 288.952000 374.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 289.000000 386.736000 295.156000 374.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 295.096000 386.736000 302.188000 374.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 302.896000 386.736000 306.700000 374.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 307.396000 386.736000 311.224000 374.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 311.200000 386.736000 317.356000 374.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 318.004000 386.736000 321.808000 374.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 323.200000 386.736000 331.192000 374.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 330.496000 386.736000 334.324000 374.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 334.300000 386.736000 338.128000 374.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 338.200000 386.736000 345.292000 374.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 345.304000 386.736000 352.984000 374.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 353.704000 386.736000 357.508000 374.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 358.204000 386.736000 368.464000 374.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 368.500000 386.736000 372.328000 374.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 372.304000 386.736000 377.116000 374.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 377.104000 386.736000 384.832000 374.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 385.504000 386.736000 389.308000 374.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 390.004000 386.736000 396.772000 374.736000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 396.808000 386.736000 403.960000 374.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 403.912000 386.736000 409.648000 374.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 409.708000 386.736000 413.536000 374.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 413.512000 386.736000 420.736000 374.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 420.712000 386.736000 428.440000 374.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 428.512000 386.736000 434.668000 374.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 435.316000 386.736000 439.120000 374.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 439.816000 386.736000 450.076000 374.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 450.112000 386.736000 457.336000 374.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 457.312000 386.736000 463.048000 374.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 463.012000 386.736000 470.272000 374.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 470.308000 386.736000 476.464000 374.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 477.112000 386.736000 480.916000 374.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 481.612000 386.736000 488.836000 374.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 488.812000 386.736000 493.252000 374.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 494.008000 386.736000 497.812000 374.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 498.508000 386.736000 502.336000 374.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 502.312000 386.736000 506.140000 374.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 506.212000 386.736000 511.024000 374.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 511.012000 386.736000 518.104000 374.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 518.116000 386.736000 523.852000 374.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 523.816000 386.736000 530.968000 374.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 531.016000 386.736000 535.828000 374.736000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 386.736000 540.044000 374.736000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 372.836000 229.228000 360.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 229.204000 372.836000 234.940000 360.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 235.000000 372.836000 242.092000 360.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 242.104000 372.836000 245.908000 360.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.400000 372.836000 250.204000 360.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 250.696000 372.836000 255.436000 360.836000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 255.892000 372.836000 259.696000 360.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 260.392000 372.836000 266.548000 360.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 266.596000 372.836000 271.408000 360.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 271.300000 372.836000 275.128000 360.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 275.104000 372.836000 278.932000 360.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 279.004000 372.836000 282.832000 360.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 283.300000 372.836000 287.104000 360.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 287.704000 372.836000 295.432000 360.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 295.408000 372.836000 302.560000 360.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 302.512000 372.836000 309.280000 360.836000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 309.316000 372.836000 316.408000 360.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 316.912000 372.836000 320.716000 360.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 321.316000 372.836000 326.128000 360.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 326.212000 372.836000 333.940000 360.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 333.916000 372.836000 341.008000 360.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 342.016000 372.836000 345.820000 360.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 346.000000 372.836000 355.612000 360.836000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 355.600000 372.836000 361.336000 360.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 360.004000 372.836000 363.808000 360.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 364.408000 372.836000 368.212000 360.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 368.704000 372.836000 376.924000 360.836000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 376.900000 372.836000 384.628000 360.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 384.604000 372.836000 391.696000 360.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 391.804000 372.836000 397.960000 360.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 397.900000 372.836000 404.056000 360.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 404.100000 372.836000 407.904000 360.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 408.996000 372.836000 416.676000 360.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 416.700000 372.836000 423.924000 360.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 423.900000 372.836000 431.124000 360.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 431.100000 372.836000 438.360000 360.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 438.396000 372.836000 444.552000 360.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 445.092000 372.836000 448.896000 360.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 449.388000 372.836000 453.828000 360.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 453.792000 372.836000 459.528000 360.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.588000 372.836000 466.812000 360.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 466.788000 372.836000 478.164000 360.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 478.692000 372.836000 482.496000 360.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 483.096000 372.836000 494.472000 360.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 494.496000 372.836000 501.264000 360.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 501.696000 372.836000 505.500000 360.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 506.100000 372.836000 512.820000 360.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 512.796000 372.836000 520.524000 360.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 520.500000 372.836000 524.328000 360.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 524.304000 372.836000 528.132000 360.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 528.108000 372.836000 535.788000 360.836000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 372.836000 540.044000 360.836000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 358.936000 229.228000 346.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 229.204000 358.936000 236.428000 346.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 236.500000 358.936000 243.724000 346.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 243.700000 358.936000 251.380000 346.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 251.404000 358.936000 255.208000 346.936000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 256.108000 358.936000 259.912000 346.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 260.812000 358.936000 267.964000 346.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 268.012000 358.936000 275.740000 346.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 275.716000 358.936000 283.396000 346.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 284.320000 358.936000 288.124000 346.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 289.120000 358.936000 296.272000 346.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 297.124000 358.936000 300.928000 346.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 301.828000 358.936000 312.088000 346.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 312.124000 358.936000 319.852000 346.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 319.828000 358.936000 327.052000 346.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 327.124000 358.936000 330.952000 346.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 330.928000 358.936000 338.020000 346.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 338.932000 358.936000 342.736000 346.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 343.732000 358.936000 349.888000 346.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 349.936000 358.936000 357.028000 346.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 357.040000 358.936000 362.776000 346.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.740000 358.936000 366.568000 346.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 366.544000 358.936000 373.636000 346.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 373.648000 358.936000 379.804000 346.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 380.752000 358.936000 384.556000 346.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 385.456000 358.936000 392.680000 346.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 392.656000 358.936000 397.096000 346.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 393.352000 358.936000 397.156000 346.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 404.656000 358.936000 408.460000 346.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 408.700000 358.936000 417.364000 346.936000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 417.400000 358.936000 425.080000 346.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 424.996000 358.936000 432.148000 346.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 432.196000 358.936000 437.008000 346.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 436.996000 358.936000 444.724000 346.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 444.796000 358.936000 451.948000 346.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 452.800000 358.936000 456.604000 346.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 457.600000 358.936000 466.780000 346.936000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 466.804000 358.936000 474.532000 346.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 474.508000 358.936000 480.244000 346.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 480.208000 358.936000 484.036000 346.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 484.108000 358.936000 490.264000 346.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 490.204000 358.936000 495.016000 346.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 495.100000 358.936000 498.928000 346.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 498.904000 358.936000 505.996000 346.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 506.908000 358.936000 510.712000 346.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 511.612000 358.936000 522.988000 346.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 523.012000 358.936000 529.780000 346.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 529.816000 358.936000 535.972000 346.936000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 358.936000 540.044000 346.936000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 345.036000 226.312000 333.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.300000 345.036000 233.392000 333.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 233.404000 345.036000 239.140000 333.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 239.104000 345.036000 242.932000 333.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 242.908000 345.036000 250.000000 333.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 250.012000 345.036000 256.168000 333.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 256.216000 345.036000 260.020000 333.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.020000 345.036000 263.824000 333.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 263.824000 345.036000 273.652000 333.036000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 273.628000 345.036000 281.356000 333.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 281.332000 345.036000 285.136000 333.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 285.136000 345.036000 289.948000 333.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 289.936000 345.036000 297.664000 333.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 297.640000 345.036000 304.732000 333.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 304.744000 345.036000 308.548000 333.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 308.548000 345.036000 315.772000 333.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 315.748000 345.036000 320.560000 333.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 320.548000 345.036000 328.276000 333.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 328.252000 345.036000 335.344000 333.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 335.356000 345.036000 341.092000 333.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 341.056000 345.036000 344.860000 333.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 344.860000 345.036000 352.588000 333.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 352.564000 345.036000 359.716000 333.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 359.764000 345.036000 367.492000 333.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 367.468000 345.036000 375.148000 333.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 375.172000 345.036000 378.976000 333.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 378.976000 345.036000 382.780000 333.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 382.780000 345.036000 388.288000 333.036000 1.000000 0.000000 0.000000 1.000000 "
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 388.800000 345.036000 397.980000 333.036000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 398.004000 345.036000 405.156000 333.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 405.204000 345.036000 412.932000 333.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 412.908000 345.036000 420.636000 333.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 420.612000 345.036000 427.704000 333.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 427.716000 345.036000 433.452000 333.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 433.416000 345.036000 440.184000 333.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 440.220000 345.036000 444.024000 333.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 444.024000 345.036000 453.048000 333.036000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 453.024000 345.036000 460.248000 333.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 460.224000 345.036000 470.484000 333.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 470.520000 345.036000 476.028000 333.036000 1.000000 0.000000 0.000000 1.000000 "
+drawChar 476.016000 345.036000 479.820000 333.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 479.820000 345.036000 484.260000 333.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 484.224000 345.036000 489.960000 333.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 489.924000 345.036000 497.148000 333.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 497.124000 345.036000 508.500000 333.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 508.524000 345.036000 512.328000 333.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 512.600000 345.036000 517.400000 333.036000 1.000000 0.000000 0.000000 1.000000 J
+drawChar 517.400000 345.036000 524.624000 333.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 524.600000 345.036000 532.328000 333.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 532.304000 345.036000 540.032000 333.036000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 345.036000 543.904000 333.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 331.136000 229.720000 319.136000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 229.696000 331.136000 234.508000 319.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 234.496000 331.136000 241.588000 319.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 241.600000 331.136000 245.428000 319.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 245.500000 331.136000 253.228000 319.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 253.204000 331.136000 260.884000 319.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 260.908000 331.136000 268.000000 319.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 268.012000 331.136000 274.732000 319.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 274.708000 331.136000 281.968000 319.136000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 282.412000 331.136000 286.216000 319.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 286.612000 331.136000 290.440000 319.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 290.416000 331.136000 296.572000 319.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 297.016000 331.136000 300.820000 319.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 301.216000 331.136000 304.936000 319.136000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 304.912000 331.136000 312.640000 319.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 312.616000 331.136000 318.772000 319.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 318.820000 331.136000 323.632000 319.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 324.016000 331.136000 327.820000 319.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 328.312000 331.136000 333.124000 319.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 333.112000 331.136000 343.372000 319.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 343.312000 331.136000 350.536000 319.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 351.016000 331.136000 354.820000 319.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 355.216000 331.136000 361.984000 319.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 362.020000 331.136000 369.112000 319.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 369.124000 331.136000 376.276000 319.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 376.228000 331.136000 381.964000 319.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 382.024000 331.136000 388.180000 319.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 388.528000 331.136000 392.332000 319.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 392.728000 331.136000 399.952000 319.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 400.024000 331.136000 403.852000 319.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 403.828000 331.136000 411.508000 319.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 411.532000 331.136000 415.336000 319.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 415.732000 331.136000 419.536000 319.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 419.932000 331.136000 427.084000 319.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 427.528000 331.136000 431.332000 319.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 431.728000 331.136000 437.884000 319.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 437.932000 331.136000 445.156000 319.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 445.132000 331.136000 452.860000 319.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 452.836000 331.136000 459.604000 319.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 459.640000 331.136000 466.732000 319.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.744000 331.136000 474.472000 319.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 474.448000 331.136000 478.276000 319.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 478.348000 331.136000 484.084000 319.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 484.444000 331.136000 488.248000 319.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 488.644000 331.136000 493.084000 319.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 493.048000 331.136000 498.784000 319.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 498.844000 331.136000 506.068000 319.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 506.044000 331.136000 517.420000 319.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 517.840000 331.136000 521.644000 319.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 522.040000 331.136000 533.416000 319.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 533.440000 331.136000 540.208000 319.136000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 331.136000 543.904000 319.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 317.236000 225.328000 305.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 225.304000 317.236000 232.456000 305.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 232.504000 317.236000 238.660000 305.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 238.708000 317.236000 243.520000 305.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 244.108000 317.236000 247.912000 305.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 248.512000 317.236000 253.324000 305.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 253.312000 317.236000 259.048000 305.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 259.108000 317.236000 262.936000 305.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 262.912000 317.236000 270.592000 305.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 271.216000 317.236000 275.020000 305.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 275.620000 317.236000 283.300000 305.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 283.324000 317.236000 290.548000 305.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 290.524000 317.236000 300.784000 305.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 300.820000 317.236000 308.548000 305.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 309.124000 317.236000 312.928000 305.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 313.528000 317.236000 318.340000 305.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 318.328000 317.236000 325.552000 305.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 326.728000 317.236000 330.532000 305.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 330.700000 317.236000 342.976000 305.236000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 343.000000 317.236000 350.224000 305.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 350.200000 317.236000 357.928000 305.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 357.904000 317.236000 362.716000 305.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 362.704000 317.236000 369.796000 305.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 369.808000 317.236000 375.544000 305.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 375.508000 317.236000 382.600000 305.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 382.612000 317.236000 389.380000 305.236000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 389.500000 317.236000 393.304000 305.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.904000 317.236000 397.708000 305.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.308000 317.236000 410.584000 305.236000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 410.608000 317.236000 417.760000 305.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 417.712000 317.236000 425.440000 305.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 425.512000 317.236000 432.280000 305.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 432.916000 317.236000 436.720000 305.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 437.320000 317.236000 444.040000 305.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 444.016000 317.236000 447.844000 305.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 447.916000 317.236000 455.068000 305.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 455.020000 317.236000 461.176000 305.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 461.224000 317.236000 467.380000 305.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 467.320000 317.236000 471.148000 305.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 471.220000 317.236000 477.940000 305.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 477.916000 317.236000 484.072000 305.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 484.612000 317.236000 488.416000 305.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 489.112000 317.236000 495.832000 305.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 495.808000 317.236000 502.960000 305.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 503.008000 317.236000 510.736000 305.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 511.312000 317.236000 515.116000 305.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 515.716000 317.236000 522.868000 305.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 522.916000 317.236000 526.744000 305.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 526.720000 317.236000 532.876000 305.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 532.924000 317.236000 540.148000 305.236000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 317.236000 543.904000 305.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 303.336000 229.180000 291.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 229.204000 303.336000 236.296000 291.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 238.708000 303.336000 242.512000 291.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 244.912000 303.336000 249.352000 291.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 249.316000 303.336000 256.540000 291.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 256.612000 303.336000 264.340000 291.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 264.316000 303.336000 272.044000 291.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 272.020000 303.336000 279.700000 291.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 282.124000 303.336000 285.928000 291.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.328000 303.336000 296.056000 291.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 296.032000 303.336000 303.124000 291.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 303.136000 303.336000 308.872000 291.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 308.932000 303.336000 316.024000 291.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 316.036000 303.336000 320.068000 291.336000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 322.432000 303.336000 326.236000 291.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 331.036000 303.336000 334.840000 291.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 337.336000 303.336000 342.844000 291.336000 1.000000 0.000000 0.000000 1.000000 "
+drawChar 342.832000 303.336000 351.856000 291.336000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 351.928000 303.336000 359.152000 291.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 359.032000 303.336000 370.408000 291.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 370.432000 303.336000 377.524000 291.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 377.536000 303.336000 384.760000 291.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 387.136000 303.336000 390.940000 291.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 393.436000 303.336000 400.588000 291.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 400.636000 303.336000 408.364000 291.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 408.232000 303.336000 415.912000 291.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 418.336000 303.336000 422.140000 291.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 424.540000 303.336000 429.340000 291.336000 1.000000 0.000000 0.000000 1.000000 J
+drawChar 429.340000 303.336000 437.068000 291.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 437.044000 303.336000 440.872000 291.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 440.944000 303.336000 444.772000 291.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 444.748000 303.336000 451.840000 291.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 451.948000 303.336000 456.760000 291.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 456.748000 303.336000 462.256000 291.336000 1.000000 0.000000 0.000000 1.000000 "
+drawChar 464.644000 303.336000 468.448000 291.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 470.848000 303.336000 478.528000 291.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 478.552000 303.336000 485.320000 291.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 490.156000 303.336000 493.960000 291.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 494.100000 303.336000 506.424000 291.336000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 506.196000 303.336000 510.024000 291.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 510.000000 303.336000 513.828000 291.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 513.804000 303.336000 517.632000 291.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 517.608000 303.336000 521.436000 291.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 521.412000 303.336000 528.564000 291.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 528.612000 303.336000 539.988000 291.336000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 303.336000 543.904000 291.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 289.436000 229.720000 277.436000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 229.696000 289.436000 237.424000 277.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 237.400000 289.436000 244.552000 277.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 244.600000 289.436000 251.860000 277.436000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 251.896000 289.436000 258.988000 277.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 259.000000 289.436000 265.156000 277.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 265.096000 289.436000 272.776000 277.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 272.800000 289.436000 279.892000 277.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 279.904000 289.436000 287.056000 277.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 287.104000 289.436000 292.840000 277.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 292.804000 289.436000 299.896000 277.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 301.108000 289.436000 304.912000 277.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 306.208000 289.436000 313.360000 277.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 313.408000 289.436000 319.564000 277.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 320.812000 289.436000 324.616000 277.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 326.008000 289.436000 336.268000 277.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 336.304000 289.436000 343.396000 277.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 343.408000 289.436000 347.236000 277.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 347.212000 289.436000 351.040000 277.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 352.216000 289.436000 356.020000 277.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 357.316000 289.436000 364.468000 277.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 364.516000 289.436000 370.672000 277.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 371.920000 289.436000 375.724000 277.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.020000 289.436000 387.280000 277.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 387.316000 289.436000 394.540000 277.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 394.516000 289.436000 400.252000 277.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 400.216000 289.436000 407.476000 277.436000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 407.512000 289.436000 413.668000 277.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 414.916000 289.436000 418.720000 277.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 420.016000 289.436000 427.696000 277.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 427.720000 289.436000 434.488000 277.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 437.116000 289.436000 440.920000 277.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 441.200000 289.436000 449.948000 277.436000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 449.996000 289.436000 455.732000 277.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 455.696000 289.436000 463.424000 277.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 463.400000 289.436000 470.492000 277.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.504000 289.436000 476.660000 277.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 476.708000 289.436000 481.520000 277.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 482.804000 289.436000 486.608000 277.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 487.904000 289.436000 498.368000 277.436000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 498.404000 289.436000 505.496000 277.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 505.508000 289.436000 516.884000 277.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 516.812000 289.436000 520.640000 277.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 520.712000 289.436000 528.440000 277.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 528.416000 289.436000 536.096000 277.436000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 289.436000 540.044000 277.436000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 275.536000 231.760000 263.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 231.796000 275.536000 238.948000 263.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 238.900000 275.536000 245.668000 263.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 245.896000 275.536000 249.700000 263.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 249.892000 275.536000 257.044000 263.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 257.092000 275.536000 264.820000 263.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 264.796000 275.536000 272.476000 263.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 272.992000 275.536000 276.796000 263.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.800000 275.536000 285.548000 263.536000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 285.596000 275.536000 293.276000 263.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 293.192000 275.536000 300.872000 263.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 300.896000 275.536000 308.048000 263.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 308.096000 275.536000 313.832000 263.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 314.000000 275.536000 317.804000 263.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 317.996000 275.536000 326.660000 263.536000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 326.696000 275.536000 330.524000 263.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 330.500000 275.536000 334.328000 263.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 334.304000 275.536000 341.396000 263.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 341.408000 275.536000 349.136000 263.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 349.412000 275.536000 353.216000 263.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 353.516000 275.536000 361.580000 263.536000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 361.112000 275.536000 368.336000 263.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 368.312000 275.536000 375.404000 263.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 375.608000 275.536000 379.412000 263.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 379.604000 275.536000 384.416000 263.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 384.500000 275.536000 391.724000 263.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 391.904000 275.536000 395.708000 263.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 396.008000 275.536000 403.736000 263.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 403.712000 275.536000 410.864000 263.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 410.912000 275.536000 422.288000 263.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 422.312000 275.536000 429.404000 263.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 429.608000 275.536000 433.412000 263.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 433.604000 275.536000 440.756000 263.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 440.900000 275.536000 444.704000 263.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 445.196000 275.536000 449.636000 263.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 449.492000 275.536000 456.584000 263.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 456.596000 275.536000 466.856000 263.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 465.392000 275.536000 469.196000 263.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.496000 275.536000 473.300000 263.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 473.492000 275.536000 482.156000 263.536000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 482.192000 275.536000 493.568000 263.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 493.496000 275.536000 500.720000 263.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 500.792000 275.536000 508.520000 263.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 508.496000 275.536000 516.176000 263.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 516.392000 275.536000 520.196000 263.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 520.496000 275.536000 525.308000 263.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 525.296000 275.536000 533.024000 263.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 533.096000 275.536000 540.188000 263.536000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 275.536000 543.904000 263.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 261.636000 229.180000 249.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 229.204000 261.636000 236.428000 249.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 236.404000 261.636000 243.628000 249.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 243.604000 261.636000 250.864000 249.636000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 250.900000 261.636000 257.056000 249.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 257.704000 261.636000 261.508000 249.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.204000 261.636000 269.356000 249.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 269.404000 261.636000 275.140000 249.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 275.104000 261.636000 282.196000 249.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 282.904000 261.636000 286.708000 249.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 287.404000 261.636000 294.556000 249.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 294.604000 261.636000 298.432000 249.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 298.408000 261.636000 304.564000 249.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 304.612000 261.636000 311.836000 249.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 312.412000 261.636000 316.216000 249.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 316.912000 261.636000 324.064000 249.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 324.712000 261.636000 328.516000 249.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 329.212000 261.636000 333.652000 249.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 333.616000 261.636000 340.708000 249.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 340.720000 261.636000 350.980000 249.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 351.724000 261.636000 355.528000 249.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 356.224000 261.636000 363.904000 249.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 363.928000 261.636000 371.152000 249.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 371.128000 261.636000 378.280000 249.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 378.328000 261.636000 384.064000 249.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 384.028000 261.636000 391.708000 249.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 392.332000 261.636000 396.136000 249.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 396.928000 261.636000 404.608000 249.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 404.524000 261.636000 411.676000 249.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 411.724000 261.636000 423.100000 249.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 423.028000 261.636000 430.120000 249.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 430.132000 261.636000 436.288000 249.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 436.336000 261.636000 440.140000 249.636000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 440.836000 261.636000 444.640000 249.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 445.336000 261.636000 452.488000 249.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 452.536000 261.636000 458.692000 249.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 459.340000 261.636000 463.144000 249.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 463.840000 261.636000 474.100000 249.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 474.136000 261.636000 481.228000 249.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 481.240000 261.636000 485.068000 249.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 485.044000 261.636000 488.872000 249.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 489.448000 261.636000 493.252000 249.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 494.044000 261.636000 501.196000 249.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 501.244000 261.636000 507.400000 249.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 508.048000 261.636000 511.852000 249.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 512.548000 261.636000 519.316000 249.636000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 519.352000 261.636000 526.504000 249.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 526.456000 261.636000 532.192000 249.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 532.252000 261.636000 536.080000 249.636000 1.000000 0.000000 0.000000 1.000000 i
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.100000 261.636000 540.144000 249.636000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 247.736000 228.724000 235.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 228.700000 247.736000 236.428000 235.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 236.500000 247.736000 242.656000 235.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 242.596000 247.736000 246.400000 235.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 246.496000 247.736000 253.756000 235.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 253.792000 247.736000 261.520000 235.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 261.496000 247.736000 265.324000 235.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 265.300000 247.736000 272.020000 235.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 272.104000 247.736000 279.364000 235.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 279.100000 247.736000 283.144000 235.736000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 283.204000 247.736000 290.464000 235.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 290.404000 247.736000 298.132000 235.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 298.204000 247.736000 305.356000 235.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 305.308000 247.736000 312.028000 235.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 312.004000 247.736000 319.264000 235.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 319.300000 247.736000 325.456000 235.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 325.504000 247.736000 329.308000 235.736000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 329.404000 247.736000 333.208000 235.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 333.304000 247.736000 339.460000 235.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 339.508000 247.736000 347.236000 235.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 347.212000 247.736000 353.932000 235.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 353.908000 247.736000 361.636000 235.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 361.612000 247.736000 365.416000 235.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 365.608000 247.736000 372.760000 235.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.712000 247.736000 378.868000 235.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 379.012000 247.736000 382.816000 235.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 382.912000 247.736000 390.064000 235.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 390.112000 247.736000 393.916000 235.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 394.012000 247.736000 404.272000 235.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 404.308000 247.736000 411.532000 235.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 411.508000 247.736000 418.732000 235.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 418.804000 247.736000 426.484000 235.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 426.400000 247.736000 433.492000 235.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 433.600000 247.736000 441.328000 235.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 441.400000 247.736000 445.204000 235.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 445.300000 247.736000 452.056000 235.736000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 452.104000 247.736000 458.872000 235.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 458.800000 247.736000 462.628000 235.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 462.700000 247.736000 469.924000 235.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 469.900000 247.736000 477.580000 235.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 477.604000 247.736000 485.332000 235.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 485.308000 247.736000 492.532000 235.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 492.508000 247.736000 500.236000 235.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 500.308000 247.736000 507.400000 235.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 507.508000 247.736000 511.312000 235.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 511.408000 247.736000 515.848000 235.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 515.812000 247.736000 521.548000 235.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 521.608000 247.736000 528.832000 235.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 528.808000 247.736000 540.184000 235.736000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 247.736000 543.904000 235.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 233.836000 230.164000 221.836000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 229.996000 233.836000 234.436000 221.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 234.400000 233.836000 240.136000 221.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 240.100000 233.836000 243.928000 221.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 243.904000 233.836000 250.624000 221.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 250.600000 233.836000 257.752000 221.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 257.800000 233.836000 261.604000 221.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 103 1 0 0 0 1200.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 208.036000 120.040000 196.036000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 120.004000 208.036000 124.108000 196.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.108000 208.036000 132.640000 196.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 132.604000 208.036000 136.708000 196.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 136.708000 208.036000 145.288000 196.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 145.312000 208.036000 153.400000 196.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 153.412000 208.036000 159.328000 196.036000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 191.036000 226.240000 179.036000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 227.104000 191.036000 230.908000 179.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 232.000000 191.036000 235.828000 179.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 235.804000 191.036000 243.028000 179.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 243.100000 191.036000 249.868000 179.036000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 249.796000 191.036000 256.888000 179.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 258.796000 191.036000 262.600000 179.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 262.600000 191.036000 266.428000 179.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 266.404000 191.036000 273.628000 179.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 273.604000 191.036000 281.332000 179.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 281.308000 191.036000 288.988000 179.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 289.012000 191.036000 296.692000 179.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 296.716000 191.036000 302.452000 179.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 302.416000 191.036000 306.244000 179.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 306.220000 191.036000 313.948000 179.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 313.924000 191.036000 321.184000 179.036000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 321.220000 191.036000 327.376000 179.036000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 327.500000 191.036000 331.304000 179.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 333.200000 191.036000 340.352000 179.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 340.400000 191.036000 348.128000 179.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 348.104000 191.036000 355.784000 179.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 357.704000 191.036000 361.508000 179.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 361.500000 191.036000 368.220000 179.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 368.196000 191.036000 375.420000 179.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 375.396000 191.036000 382.116000 179.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 382.200000 191.036000 389.460000 179.036000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 389.400000 191.036000 394.212000 179.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 394.296000 191.036000 401.448000 179.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 401.400000 191.036000 405.228000 179.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 405.300000 191.036000 409.128000 179.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 409.104000 191.036000 415.260000 179.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 415.200000 191.036000 419.004000 179.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 420.000000 191.036000 423.804000 179.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 424.800000 191.036000 431.952000 179.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 432.000000 191.036000 439.728000 179.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 439.704000 191.036000 447.384000 179.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 448.200000 191.036000 452.004000 179.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 453.096000 191.036000 464.472000 179.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 464.400000 191.036000 471.168000 179.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 472.104000 191.036000 475.908000 179.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 476.904000 191.036000 488.280000 179.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 488.304000 191.036000 492.132000 179.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 492.108000 191.036000 499.836000 179.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 499.812000 191.036000 503.640000 179.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 503.712000 191.036000 511.392000 179.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 511.416000 191.036000 518.568000 179.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 518.520000 191.036000 524.256000 179.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 525.216000 191.036000 529.020000 179.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 530.016000 191.036000 533.844000 179.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 533.820000 191.036000 539.976000 179.036000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 191.036000 543.904000 179.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 177.136000 228.652000 165.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.700000 177.136000 235.420000 165.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 235.396000 177.136000 242.116000 165.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 242.092000 177.136000 249.316000 165.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 249.292000 177.136000 255.028000 165.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 255.088000 177.136000 262.768000 165.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 262.684000 177.136000 266.512000 165.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 266.584000 177.136000 274.312000 165.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 274.288000 177.136000 281.968000 165.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 281.992000 177.136000 285.820000 165.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 285.796000 177.136000 292.564000 165.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 293.092000 177.136000 296.896000 165.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 297.388000 177.136000 303.544000 165.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 303.592000 177.136000 308.404000 165.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 308.392000 177.136000 315.616000 165.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 315.592000 177.136000 322.312000 165.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 322.288000 177.136000 329.548000 165.136000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 329.584000 177.136000 336.676000 165.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 336.688000 177.136000 344.368000 165.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 344.392000 177.136000 348.196000 165.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.688000 177.136000 352.492000 165.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 353.092000 177.136000 362.668000 165.136000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 362.692000 177.136000 366.520000 165.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 366.592000 177.136000 374.320000 165.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 374.788000 177.136000 378.592000 165.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 379.084000 177.136000 383.524000 165.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 383.488000 177.136000 390.712000 165.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 390.784000 177.136000 396.520000 165.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 396.988000 177.136000 400.792000 165.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 401.392000 177.136000 408.544000 165.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 409.588000 177.136000 413.392000 165.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 413.600000 177.136000 423.176000 165.136000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 423.200000 177.136000 427.028000 165.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 427.004000 177.136000 434.732000 165.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 435.308000 177.136000 439.112000 165.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 439.604000 177.136000 446.756000 165.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 446.804000 177.136000 454.532000 165.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 454.400000 177.136000 462.080000 165.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 462.596000 177.136000 466.400000 165.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 467.000000 177.136000 474.992000 165.136000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 474.104000 177.136000 481.328000 165.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 481.304000 177.136000 489.032000 165.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 489.008000 177.136000 492.836000 165.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 492.908000 177.136000 499.628000 165.136000 1.000000 0.000000 0.000000 1.000000 c
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 499.700000 177.136000 503.504000 165.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 504.596000 177.136000 508.400000 165.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 508.300000 177.136000 517.480000 165.136000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 517.504000 177.136000 524.656000 165.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 524.704000 177.136000 536.080000 165.136000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 177.136000 540.044000 165.136000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 108.100000 90.136000 116.164000 78.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 115.600000 90.136000 122.752000 78.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 122.800000 90.136000 130.480000 78.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 130.504000 90.136000 137.596000 78.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.608000 90.136000 141.412000 78.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 141.400000 90.136000 149.032000 78.136000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 2715.400000 0 477.900000 2715.400000 0 477.900000 3025.200000 0 134.300000 3025.200000 0 134.300000 2715.400000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -192350.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -273.700000 0 168.100000 -273.700000 0 168.100000 -268.700000 0 76.900000 -268.700000 0 76.900000 -273.700000 0
+eoFillPath subpath 1 163.100000 -268.800000 0 168.100000 -268.800000 0 168.100000 -138.200000 0 163.100000 -138.200000 0 163.100000 -268.800000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -268.700000 0 163.100000 -268.700000 0 163.100000 -133.300000 0 72.000000 -133.300000 0 72.000000 -268.700000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 -137.620000 87.320000 -147.620000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 -137.620000 93.420000 -147.620000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 -137.620000 97.510000 -147.620000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 -137.620000 101.420000 -147.620000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 -137.620000 104.170000 -147.620000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 -137.620000 110.530000 -147.620000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 -137.620000 113.270000 -147.620000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 -137.620000 116.470000 -147.620000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 -137.620000 123.480000 -147.620000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 -137.620000 129.610000 -147.620000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 -137.620000 135.090000 -147.620000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 -137.620000 140.890000 -147.620000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 -137.620000 144.820000 -147.620000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 -137.620000 150.920000 -147.620000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 -137.620000 153.670000 -147.620000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 -137.620000 156.470000 -147.620000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -264.500000 0 168.200000 -264.500000 0 168.200000 -149.300000 0 72.000000 -149.300000 0 72.000000 -264.500000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -196.348000 79.253000 -205.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 -196.348000 86.669000 -205.348000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 -196.348000 90.215000 -205.348000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 -196.348000 93.077000 -205.348000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 -196.348000 97.406000 -205.348000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 -196.348000 100.853000 -205.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 -196.348000 107.324000 -205.348000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 -196.348000 112.337000 -205.348000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 -196.348000 115.271000 -205.348000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 -196.348000 118.655000 -205.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 -196.348000 126.512000 -205.348000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 -196.348000 130.805000 -205.348000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 -196.348000 135.881000 -205.348000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 -196.348000 139.355000 -205.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 -196.348000 147.284000 -205.348000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 -196.348000 150.074000 -205.348000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 -196.348000 155.897000 -205.348000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 -196.348000 158.750000 -205.348000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -196.348000 161.853000 -205.348000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -206.848000 82.124000 -215.848000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 -206.848000 87.137000 -215.848000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 -206.848000 90.071000 -215.848000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 -206.848000 93.356000 -215.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 -206.848000 100.403000 -215.848000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 -206.848000 104.921000 -215.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 -206.848000 109.205000 -215.848000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 -206.848000 117.737000 -215.848000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 -206.848000 123.119000 -215.848000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 -206.848000 128.996000 -215.848000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 -206.848000 132.605000 -215.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 -206.848000 138.392000 -215.848000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 -206.848000 141.749000 -215.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 -206.848000 149.507000 -215.848000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 -206.848000 153.800000 -215.848000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 -206.848000 158.876000 -215.848000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -206.848000 161.853000 -215.848000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -217.348000 81.764000 -226.348000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -217.348000 87.596000 -226.348000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 -217.348000 93.356000 -226.348000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 -217.348000 102.050000 -226.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 -217.348000 113.822000 -226.348000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 -217.348000 122.651000 -226.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 -217.348000 134.117000 -226.348000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 -217.348000 138.401000 -226.348000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 -217.348000 147.149000 -226.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 -217.348000 158.921000 -226.348000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -217.348000 161.853000 -226.348000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -227.848000 79.271000 -236.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -227.848000 84.338000 -236.848000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 -227.848000 89.621000 -236.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 -227.848000 94.643000 -236.848000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 -227.848000 100.502000 -236.848000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 -227.848000 106.262000 -236.848000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 -227.848000 111.518000 -236.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 -227.848000 116.216000 -236.848000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 -227.848000 119.249000 -236.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 -227.848000 122.363000 -236.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 -227.848000 128.186000 -236.848000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 -227.848000 131.345000 -236.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 -227.848000 137.060000 -236.848000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 -227.848000 140.147000 -236.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 -227.848000 145.007000 -236.848000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 -227.848000 148.598000 -236.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 -227.848000 151.460000 -236.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 -227.848000 155.789000 -236.848000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 -227.848000 158.933000 -236.848000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -238.348000 80.702000 -247.348000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 -238.348000 83.573000 -247.348000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 -238.348000 89.396000 -247.348000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 -238.348000 95.156000 -247.348000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 -238.348000 100.547000 -247.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 -238.348000 109.052000 -247.348000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 -238.348000 111.959000 -247.348000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 -238.348000 117.251000 -247.348000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 -238.348000 121.904000 -247.348000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 -238.348000 126.503000 -247.348000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 -238.348000 129.338000 -247.348000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 -238.348000 134.936000 -247.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 -238.348000 143.441000 -247.348000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 -238.348000 148.796000 -247.348000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 -238.348000 154.574000 -247.348000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 -238.348000 158.876000 -247.348000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 -238.348000 161.853000 -247.348000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -248.848000 79.271000 -257.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -248.848000 85.094000 -257.848000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -248.848000 88.703000 -257.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 -248.848000 94.112000 -257.848000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 -248.848000 97.244000 -257.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 -248.848000 103.058000 -257.848000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 -248.848000 108.890000 -257.848000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 -248.848000 111.950000 -257.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 -248.848000 115.271000 -257.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 -248.848000 120.338000 -257.848000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 -248.848000 125.621000 -257.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 -248.848000 131.363000 -257.848000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 -248.848000 134.558000 -257.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 -248.848000 140.048000 -257.848000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 -248.848000 145.430000 -257.848000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 -248.848000 150.551000 -257.848000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 -248.848000 155.960000 -257.848000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 -248.848000 158.933000 -257.848000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -259.348000 80.009000 -268.348000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -259.348000 85.364000 -268.348000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 -259.348000 88.271000 -268.348000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 -259.348000 91.169000 -268.348000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 -259.348000 97.955000 -268.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 -259.348000 107.765000 -268.348000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 -259.348000 110.672000 -268.348000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 -259.348000 115.964000 -268.348000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 -259.348000 120.617000 -268.348000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 -259.348000 125.216000 -268.348000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 -259.348000 128.051000 -268.348000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 -259.348000 134.954000 -268.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 -259.348000 146.285000 -268.348000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 -259.348000 151.667000 -268.348000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 -259.348000 155.906000 -268.348000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 -259.348000 159.033000 -268.348000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -268.800000 0 72.100000 -268.800000 0 72.100000 -133.300000 0 72.000000 -133.300000 0 72.000000 -268.800000 0
+eoFillPath subpath 1 163.100000 -268.800000 0 163.200000 -268.800000 0 163.200000 -133.300000 0 163.100000 -133.300000 0 163.100000 -268.800000 0
+eoFillPath subpath 1 72.000000 -133.400000 0 163.200000 -133.400000 0 163.200000 -133.300000 0 72.000000 -133.300000 0 72.000000 -133.400000 0
+eoFillPath subpath 1 72.000000 -268.800000 0 163.200000 -268.800000 0 163.200000 -268.700000 0 72.000000 -268.700000 0 72.000000 -268.800000 0
+saveState
+eoClipPath subpath 1 96.900000 -193.500000 0 138.300000 -193.500000 0 138.300000 -149.300000 0 96.900000 -149.300000 0 96.900000 -193.500000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 98540.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -548.300000 0 165.500000 -548.300000 0 165.500000 -543.300000 0 76.900000 -543.300000 0 76.900000 -548.300000 0
+eoFillPath subpath 1 160.500000 -543.400000 0 165.500000 -543.400000 0 165.500000 -387.100000 0 160.500000 -387.100000 0 160.500000 -543.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -543.300000 0 121.400000 -543.300000 0 121.400000 -382.200000 0 72.000000 -382.200000 0 72.000000 -543.300000 0
+saveState
+eoClipPath subpath 1 72.000000 -543.300000 0 160.500000 -543.300000 0 160.500000 -382.200000 0 72.000000 -382.200000 0 72.000000 -543.300000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 135240.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 -386.520000 89.280000 -396.520000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 -386.520000 95.630000 -396.520000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 -386.520000 99.520000 -396.520000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 -386.520000 102.270000 -396.520000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 -386.520000 108.450000 -396.520000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 -386.520000 112.610000 -396.520000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 -386.520000 118.510000 -396.520000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 -386.520000 121.670000 -396.520000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 -386.520000 124.470000 -396.520000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 -386.520000 130.830000 -396.520000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 -386.520000 133.970000 -396.520000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 -386.520000 137.920000 -396.520000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 -386.520000 144.230000 -396.520000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 -386.520000 150.350000 -396.520000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 -386.520000 153.570000 -396.520000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 -398.220000 95.000000 -408.220000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 -398.220000 97.770000 -408.220000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 -398.220000 103.000000 -408.220000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 -398.220000 109.330000 -408.220000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 -398.220000 117.470000 -408.220000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 -398.220000 123.620000 -408.220000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 -398.220000 128.800000 -408.220000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 -398.220000 135.130000 -408.220000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 -398.220000 141.250000 -408.220000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 -398.220000 145.410000 -408.220000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -413.048000 82.961000 -422.048000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 -413.048000 87.614000 -422.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 -413.048000 93.356000 -422.048000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 -413.048000 98.612000 -422.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 -413.048000 103.733000 -422.048000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 -413.048000 106.568000 -422.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 -413.048000 111.959000 -422.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 -413.048000 114.866000 -422.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 -413.048000 117.665000 -422.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 -413.048000 122.768000 -422.048000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 -413.048000 125.747000 -422.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 -413.048000 131.651000 -422.048000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 -413.048000 136.907000 -422.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 -413.048000 142.307000 -422.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 -413.048000 148.049000 -422.048000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 -413.048000 150.956000 -422.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 -413.048000 156.302000 -422.048000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -413.048000 159.253000 -422.048000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -423.548000 84.095000 -432.548000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -423.548000 89.900000 -432.548000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 -423.548000 95.318000 -432.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 -423.548000 100.349000 -432.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 -423.548000 110.789000 -432.548000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 -423.548000 111.464000 -432.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 -423.548000 114.362000 -432.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 -423.548000 119.348000 -432.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 -423.548000 126.962000 -432.548000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 -423.548000 132.047000 -432.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 -423.548000 139.958000 -432.548000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 -423.548000 142.865000 -432.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 -423.548000 147.410000 -432.548000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 -423.548000 153.287000 -432.548000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -423.548000 156.333000 -432.548000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -434.048000 84.095000 -443.048000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -434.048000 89.468000 -443.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 -434.048000 94.121000 -443.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 -434.048000 99.899000 -443.048000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 -434.048000 105.218000 -443.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 -434.048000 109.502000 -443.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 -434.048000 115.649000 -443.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 -434.048000 122.327000 -443.048000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 -434.048000 127.718000 -443.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 -434.048000 132.002000 -443.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 -434.048000 138.149000 -443.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 -434.048000 145.205000 -443.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 -434.048000 150.992000 -443.048000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 -434.048000 156.311000 -443.048000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -434.048000 159.253000 -443.048000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -444.548000 82.394000 -453.548000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 -444.548000 86.705000 -453.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 -444.548000 91.322000 -453.548000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 -444.548000 94.913000 -453.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 -444.548000 98.054000 -453.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 -444.548000 102.014000 -453.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 -444.548000 104.876000 -453.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 -444.548000 113.435000 -453.548000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 -444.548000 118.718000 -453.548000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 -444.548000 121.949000 -453.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 -444.548000 125.063000 -453.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 -444.548000 130.886000 -453.548000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 -444.548000 134.045000 -453.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 -444.548000 138.005000 -453.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 -444.548000 143.792000 -453.548000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 -444.548000 149.111000 -453.548000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 -444.548000 151.964000 -453.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 -444.548000 156.293000 -453.548000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -444.548000 159.153000 -453.548000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -455.048000 79.271000 -464.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 -455.048000 82.169000 -464.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 -455.048000 85.526000 -464.048000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 -455.048000 90.818000 -464.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 -455.048000 94.454000 -464.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 -455.048000 99.008000 -464.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 -455.048000 104.318000 -464.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 -455.048000 110.096000 -464.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 -455.048000 115.856000 -464.048000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 -455.048000 119.546000 -464.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 -455.048000 124.001000 -464.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 -455.048000 129.509000 -464.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 -455.048000 133.145000 -464.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 -455.048000 139.751000 -464.048000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 -455.048000 145.205000 -464.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 -455.048000 148.841000 -464.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 -455.048000 152.657000 -464.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 -455.048000 156.293000 -464.048000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -455.048000 159.253000 -464.048000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -465.548000 84.095000 -474.548000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 -465.548000 88.406000 -474.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 -465.548000 93.824000 -474.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 -465.548000 99.602000 -474.548000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 -465.548000 105.362000 -474.548000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 -465.548000 108.422000 -474.548000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 -465.548000 116.747000 -474.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 -465.548000 129.275000 -474.548000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 -465.548000 135.089000 -474.548000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 -465.548000 138.698000 -474.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 -465.548000 141.560000 -474.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 -465.548000 146.906000 -474.548000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -465.548000 151.190000 -474.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 -465.548000 156.266000 -474.548000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -465.548000 159.253000 -474.548000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -476.048000 82.196000 -485.048000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 -476.048000 87.560000 -485.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 -476.048000 92.213000 -485.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 -476.048000 96.551000 -485.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 -476.048000 101.708000 -485.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 -476.048000 107.216000 -485.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 -476.048000 111.653000 -485.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 -476.048000 118.961000 -485.048000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 -476.048000 124.316000 -485.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 -476.048000 128.654000 -485.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 -476.048000 133.172000 -485.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 -476.048000 138.995000 -485.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 -476.048000 143.612000 -485.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 -476.048000 148.913000 -485.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 -476.048000 153.197000 -485.048000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -476.048000 156.333000 -485.048000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -486.548000 80.009000 -495.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -486.548000 85.319000 -495.548000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 -486.548000 91.061000 -495.548000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 -486.548000 100.052000 -495.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 -486.548000 113.993000 -495.548000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 -486.548000 116.873000 -495.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 -486.548000 120.410000 -495.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 -486.548000 126.296000 -495.548000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 -486.548000 135.350000 -495.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 -486.548000 145.106000 -495.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 -486.548000 150.893000 -495.548000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 -486.548000 156.212000 -495.548000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -486.548000 159.253000 -495.548000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -497.048000 82.196000 -506.048000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 -497.048000 87.560000 -506.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 -497.048000 93.392000 -506.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 -497.048000 99.152000 -506.048000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 -497.048000 101.960000 -506.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 -497.048000 107.306000 -506.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 -497.048000 111.905000 -506.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 -497.048000 115.640000 -506.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 -497.048000 122.444000 -506.048000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 -497.048000 127.898000 -506.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 -497.048000 135.575000 -506.048000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 -497.048000 141.380000 -506.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 -497.048000 145.241000 -506.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 -497.048000 150.803000 -506.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 -497.048000 156.302000 -506.048000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -497.048000 159.253000 -506.048000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -507.548000 80.009000 -516.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -507.548000 85.796000 -516.548000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 -507.548000 91.115000 -516.548000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 -507.548000 95.399000 -516.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 -507.548000 100.718000 -516.548000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 -507.548000 107.054000 -516.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 -507.548000 118.097000 -516.548000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 -507.548000 123.524000 -516.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 -507.548000 129.401000 -516.548000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 -507.548000 131.768000 -516.548000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 -507.548000 135.413000 -516.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 -507.548000 141.659000 -516.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 -507.548000 150.965000 -516.548000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 -507.548000 156.320000 -516.548000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -507.548000 159.253000 -516.548000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -518.048000 81.017000 -527.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 -518.048000 84.608000 -527.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 -518.048000 89.963000 -527.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 -518.048000 92.870000 -527.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 -518.048000 98.693000 -527.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 -518.048000 103.310000 -527.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 -518.048000 107.243000 -527.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 -518.048000 116.081000 -527.048000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 -518.048000 121.886000 -527.048000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 -518.048000 127.205000 -527.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 -518.048000 132.983000 -527.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 -518.048000 136.943000 -527.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 -518.048000 143.846000 -527.048000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 -518.048000 148.184000 -527.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 -518.048000 153.260000 -527.048000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -518.048000 156.433000 -527.048000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -528.548000 79.271000 -537.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -528.548000 85.094000 -537.548000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -528.548000 90.854000 -537.548000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 -528.548000 93.653000 -537.548000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -543.400000 0 72.100000 -543.400000 0 72.100000 -382.200000 0 72.000000 -382.200000 0 72.000000 -543.400000 0
+eoFillPath subpath 1 160.500000 -543.400000 0 160.600000 -543.400000 0 160.600000 -382.200000 0 160.500000 -382.200000 0 160.500000 -543.400000 0
+eoFillPath subpath 1 72.000000 -382.300000 0 160.600000 -382.300000 0 160.600000 -382.200000 0 72.000000 -382.200000 0 72.000000 -382.300000 0
+eoFillPath subpath 1 72.000000 -543.400000 0 160.600000 -543.400000 0 160.600000 -543.300000 0 72.000000 -543.300000 0 72.000000 -543.400000 0
+saveState
+eoClipPath subpath 1 108.000000 -1030.800000 0 178.900000 -1030.800000 0 178.900000 -974.100000 0 108.000000 -974.100000 0 108.000000 -1030.800000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 182270.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -5089.100000 0 165.500000 -5089.100000 0 165.500000 -5084.100000 0 76.900000 -5084.100000 0 76.900000 -5089.100000 0
+eoFillPath subpath 1 160.500000 -5084.200000 0 165.500000 -5084.200000 0 165.500000 -4975.400000 0 160.500000 -4975.400000 0 160.500000 -5084.200000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -5084.100000 0 160.500000 -5084.100000 0 160.500000 -4970.500000 0 72.000000 -4970.500000 0 72.000000 -5084.100000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -4974.848000 83.771000 -4983.848000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 -4974.848000 89.594000 -4983.848000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 -4974.848000 92.465000 -4983.848000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 -4974.848000 97.568000 -4983.848000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 -4974.848000 100.943000 -4983.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 -4974.848000 106.955000 -4983.848000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 -4974.848000 110.447000 -4983.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 -4974.848000 114.425000 -4983.848000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 -4974.848000 119.717000 -4983.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 -4974.848000 127.493000 -4983.848000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 -4974.848000 130.949000 -4983.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 -4974.848000 136.574000 -4983.848000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 -4974.848000 141.920000 -4983.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 -4974.848000 147.365000 -4983.848000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 -4974.848000 151.703000 -4983.848000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 -4974.848000 156.320000 -4983.848000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -4974.848000 159.153000 -4983.848000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -4985.348000 81.764000 -4994.348000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -4985.348000 85.130000 -4994.348000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 -4985.348000 88.712000 -4994.348000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 -4985.348000 94.022000 -4994.348000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 -4985.348000 98.306000 -4994.348000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -4985.348000 102.455000 -4994.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 -4985.348000 106.676000 -4994.348000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 -4985.348000 110.312000 -4994.348000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 -4985.348000 114.920000 -4994.348000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 -4985.348000 119.060000 -4994.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 -4985.348000 125.450000 -4994.348000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 -4985.348000 130.832000 -4994.348000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 -4985.348000 139.445000 -4994.348000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 -4985.348000 145.169000 -4994.348000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 -4985.348000 148.076000 -4994.348000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 -4985.348000 153.323000 -4994.348000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -4985.348000 156.433000 -4994.348000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -4995.848000 80.009000 -5004.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -4995.848000 82.871000 -5004.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 -4995.848000 88.316000 -5004.848000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 -4995.848000 94.094000 -5004.848000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 -4995.848000 96.947000 -5004.848000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 -4995.848000 104.948000 -5004.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 -4995.848000 113.705000 -5004.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 -4995.848000 119.492000 -5004.848000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 -4995.848000 124.811000 -5004.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 -4995.848000 132.848000 -5004.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 -4995.848000 141.605000 -5004.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 -4995.848000 144.467000 -5004.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 -4995.848000 148.103000 -5004.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 -4995.848000 150.965000 -5004.848000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 -4995.848000 156.311000 -5004.848000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -4995.848000 159.253000 -5004.848000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5006.348000 80.999000 -5015.348000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 -5006.348000 90.539000 -5015.348000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 -5006.348000 95.318000 -5015.348000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 -5006.348000 99.602000 -5015.348000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -5006.348000 102.473000 -5015.348000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 -5006.348000 108.260000 -5015.348000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 -5006.348000 110.762000 -5015.348000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 -5006.348000 115.316000 -5015.348000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 -5006.348000 122.156000 -5015.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 -5006.348000 132.299000 -5015.348000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 -5006.348000 136.970000 -5015.348000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 -5006.348000 139.877000 -5015.348000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 -5006.348000 142.775000 -5015.348000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 -5006.348000 148.022000 -5015.348000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 -5006.348000 152.720000 -5015.348000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 -5006.348000 156.311000 -5015.348000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -5006.348000 159.253000 -5015.348000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5016.848000 83.006000 -5025.848000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 -5016.848000 88.793000 -5025.848000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 -5016.848000 91.664000 -5025.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 -5016.848000 94.562000 -5025.848000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 -5016.848000 100.349000 -5025.848000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 -5016.848000 103.157000 -5025.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 -5016.848000 108.980000 -5025.848000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 -5016.848000 114.740000 -5025.848000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 -5016.848000 119.375000 -5025.848000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 -5016.848000 128.033000 -5025.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 -5016.848000 141.479000 -5025.848000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 -5016.848000 146.807000 -5025.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -5016.848000 152.684000 -5025.848000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 -5016.848000 156.293000 -5025.848000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -5016.848000 159.253000 -5025.848000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5027.348000 79.730000 -5036.348000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 -5027.348000 84.005000 -5036.348000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 -5027.348000 89.423000 -5036.348000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 -5027.348000 98.036000 -5036.348000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 -5027.348000 121.157000 -5036.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 -5027.348000 145.115000 -5036.348000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 -5027.348000 151.001000 -5036.348000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 -5027.348000 156.320000 -5036.348000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -5027.348000 159.253000 -5036.348000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5037.848000 83.285000 -5046.848000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 -5037.848000 89.099000 -5046.848000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 -5037.848000 93.401000 -5046.848000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 -5037.848000 98.477000 -5046.848000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 -5037.848000 103.121000 -5046.848000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 -5037.848000 105.974000 -5046.848000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 -5037.848000 111.320000 -5046.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 -5037.848000 115.604000 -5046.848000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 -5037.848000 123.857000 -5046.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 -5037.848000 136.007000 -5046.848000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 -5037.848000 141.794000 -5046.848000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 -5037.848000 144.665000 -5046.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 -5037.848000 147.464000 -5046.848000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 -5037.848000 153.251000 -5046.848000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -5037.848000 156.433000 -5046.848000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5048.348000 79.271000 -5057.348000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -5048.348000 85.094000 -5057.348000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -5048.348000 90.854000 -5057.348000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 -5048.348000 96.146000 -5057.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 -5048.348000 102.302000 -5057.348000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 -5048.348000 107.711000 -5057.348000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 -5048.348000 113.048000 -5057.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 -5048.348000 119.204000 -5057.348000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 -5048.348000 124.991000 -5057.348000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 -5048.348000 130.310000 -5057.348000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 -5048.348000 135.647000 -5057.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 -5048.348000 144.755000 -5057.348000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 -5048.348000 153.323000 -5057.348000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -5048.348000 156.333000 -5057.348000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5058.848000 82.160000 -5067.848000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 -5058.848000 85.067000 -5067.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 -5058.848000 89.297000 -5067.848000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 -5058.848000 94.616000 -5067.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 -5058.848000 98.747000 -5067.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 -5058.848000 106.055000 -5067.848000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 -5058.848000 109.700000 -5067.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 -5058.848000 115.055000 -5067.848000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 -5058.848000 118.601000 -5067.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 -5058.848000 124.010000 -5067.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 -5058.848000 128.042000 -5067.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 -5058.848000 135.998000 -5067.848000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 -5058.848000 141.785000 -5067.848000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 -5058.848000 144.656000 -5067.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 -5058.848000 147.554000 -5067.848000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 -5058.848000 153.341000 -5067.848000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -5058.848000 156.433000 -5067.848000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -5069.348000 79.271000 -5078.348000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -5069.348000 85.094000 -5078.348000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -5069.348000 90.854000 -5078.348000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 -5069.348000 93.743000 -5078.348000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -5084.200000 0 72.100000 -5084.200000 0 72.100000 -4970.500000 0 72.000000 -4970.500000 0 72.000000 -5084.200000 0
+eoFillPath subpath 1 160.500000 -5084.200000 0 160.600000 -5084.200000 0 160.600000 -4970.500000 0 160.500000 -4970.500000 0 160.500000 -5084.200000 0
+eoFillPath subpath 1 72.000000 -4970.600000 0 160.600000 -4970.600000 0 160.600000 -4970.500000 0 72.000000 -4970.500000 0 72.000000 -4970.600000 0
+eoFillPath subpath 1 72.000000 -5084.200000 0 160.600000 -5084.200000 0 160.600000 -5084.100000 0 72.000000 -5084.100000 0 72.000000 -5084.200000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 1105.400000 0 169.600000 1105.400000 0 169.600000 1110.400000 0 76.900000 1110.400000 0 76.900000 1105.400000 0
+eoFillPath subpath 1 164.600000 1110.300000 0 169.600000 1110.300000 0 169.600000 1225.900000 0 164.600000 1225.900000 0 164.600000 1110.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 1110.400000 0 121.400000 1110.400000 0 121.400000 1230.800000 0 72.000000 1230.800000 0 72.000000 1110.400000 0
+saveState
+eoClipPath subpath 1 72.000000 1110.300000 0 164.600000 1110.300000 0 164.600000 1230.700000 0 72.000000 1230.700000 0 72.000000 1110.300000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -26010.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 1180.300000 0 93.700000 1180.300000 0 93.700000 1199.500000 0 72.000000 1199.500000 0 72.000000 1180.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 1180.300000 0 169.600000 1180.300000 0 169.600000 1199.500000 0 93.700000 1199.500000 0 93.700000 1180.300000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 1163.600000 0 93.700000 1163.600000 0 93.700000 1180.300000 0 72.000000 1180.300000 0 72.000000 1163.600000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 1163.600000 0 169.600000 1163.600000 0 169.600000 1180.300000 0 93.700000 1180.300000 0 93.700000 1163.600000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 1144.400000 0 93.700000 1144.400000 0 93.700000 1163.600000 0 72.000000 1163.600000 0 72.000000 1144.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 1144.400000 0 169.600000 1144.400000 0 169.600000 1163.600000 0 93.700000 1163.600000 0 93.700000 1144.400000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 1125.200000 0 93.700000 1125.200000 0 93.700000 1144.400000 0 72.000000 1144.400000 0 72.000000 1125.200000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 1125.200000 0 169.600000 1125.200000 0 169.600000 1144.400000 0 93.700000 1144.400000 0 93.700000 1125.200000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1226.452000 82.898000 1217.452000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 1226.452000 87.200000 1217.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 1226.452000 90.809000 1217.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 1226.452000 93.671000 1217.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 1226.452000 98.315000 1217.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 1226.452000 101.906000 1217.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 1226.452000 106.514000 1217.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 1226.452000 109.754000 1217.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 1226.452000 112.868000 1217.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 1226.452000 118.691000 1217.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 1226.452000 121.850000 1217.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 1226.452000 125.702000 1217.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 1226.452000 131.588000 1217.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 1226.452000 136.907000 1217.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 1226.452000 140.039000 1217.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 1226.452000 146.078000 1217.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 1226.452000 151.442000 1217.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 1226.452000 154.349000 1217.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 1226.452000 157.148000 1217.452000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 1226.452000 160.433000 1217.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1215.952000 84.095000 1206.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 1215.952000 89.468000 1206.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 1215.952000 94.580000 1206.952000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 1215.952000 97.631000 1206.952000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 1195.552000 104.443000 1186.552000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 1195.552000 109.060000 1186.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 1195.552000 113.398000 1186.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 1195.552000 119.194000 1186.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 1195.552000 124.612000 1186.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 1195.552000 127.465000 1186.552000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 1178.852000 101.176000 1169.852000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 1178.852000 104.074000 1169.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 1178.852000 109.420000 1169.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 1178.852000 114.442000 1169.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 1178.852000 120.202000 1169.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 1178.852000 123.811000 1169.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 1178.852000 129.121000 1169.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 1178.852000 134.899000 1169.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 1178.852000 139.516000 1169.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 1178.852000 143.107000 1169.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 1178.852000 148.417000 1169.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 1178.852000 151.270000 1169.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 1178.852000 157.093000 1169.852000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 1162.152000 103.048000 1153.152000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 1162.152000 108.421000 1153.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 1162.152000 113.443000 1153.152000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 1162.152000 118.852000 1153.152000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 1162.152000 124.702000 1153.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 1162.152000 130.021000 1153.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 1162.152000 135.079000 1153.152000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 1142.952000 104.407000 1133.952000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 1142.952000 109.816000 1133.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 1142.952000 115.594000 1133.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 1142.952000 121.354000 1133.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 1142.952000 125.692000 1133.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 1142.952000 128.563000 1133.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 1142.952000 133.954000 1133.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 1142.952000 139.786000 1133.952000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 1110.300000 0 72.100000 1110.300000 0 72.100000 1230.800000 0 72.000000 1230.800000 0 72.000000 1110.300000 0
+eoFillPath subpath 1 164.600000 1110.300000 0 164.700000 1110.300000 0 164.700000 1230.800000 0 164.600000 1230.800000 0 164.600000 1110.300000 0
+eoFillPath subpath 1 72.000000 1230.700000 0 164.700000 1230.700000 0 164.700000 1230.800000 0 72.000000 1230.800000 0 72.000000 1230.700000 0
+eoFillPath subpath 1 72.000000 1110.300000 0 164.700000 1110.300000 0 164.700000 1110.400000 0 72.000000 1110.400000 0 72.000000 1110.300000 0
+eoFillPath subpath 1 91.300000 1125.200000 0 93.700000 1125.200000 0 93.700000 1199.500000 0 91.300000 1199.500000 0 91.300000 1125.200000 0
+eoFillPath subpath 1 72.000000 1144.400000 0 169.600000 1144.400000 0 169.600000 1146.800000 0 72.000000 1146.800000 0 72.000000 1144.400000 0
+eoFillPath subpath 1 72.000000 1197.100000 0 169.600000 1197.100000 0 169.600000 1199.500000 0 72.000000 1199.500000 0 72.000000 1197.100000 0
+eoFillPath subpath 1 72.000000 1125.200000 0 169.600000 1125.200000 0 169.600000 1127.600000 0 72.000000 1127.600000 0 72.000000 1125.200000 0
+saveState
+eoClipPath subpath 1 108.000000 -6740.800000 0 150.800000 -6740.800000 0 150.800000 -6696.600000 0 108.000000 -6696.600000 0 108.000000 -6740.800000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 753280.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 -7590.800000 0 499.600000 -7590.800000 0 499.600000 -7585.700000 0 186.800000 -7585.700000 0 186.800000 -7590.800000 0
+eoFillPath subpath 1 494.500000 -7585.800000 0 499.600000 -7585.800000 0 499.600000 -7397.400000 0 494.500000 -7397.400000 0 494.500000 -7585.800000 0
+saveState
+eoClipPath subpath 1 181.800000 -7585.800000 0 494.500000 -7585.800000 0 494.500000 -7392.400000 0 181.800000 -7392.400000 0 181.800000 -7585.800000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 -7392.300000 0 494.500000 -7392.300000 0 494.500000 -7392.300000 0 181.700000 -7392.300000 0
+eoFillPath subpath 1 181.700000 -7392.300000 0 494.500000 -7392.300000 0 494.500000 -7393.100000 0 181.700000 -7393.100000 0 181.700000 -7392.300000 0
+eoFillPath subpath 1 181.700000 -7393.100000 0 494.500000 -7393.100000 0 494.500000 -7393.800000 0 181.700000 -7393.800000 0 181.700000 -7393.100000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 -7393.800000 0 494.500000 -7393.800000 0 494.500000 -7394.600000 0 181.700000 -7394.600000 0 181.700000 -7393.800000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 -7394.600000 0 494.500000 -7394.600000 0 494.500000 -7395.400000 0 181.700000 -7395.400000 0 181.700000 -7394.600000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 -7395.400000 0 494.500000 -7395.400000 0 494.500000 -7396.100000 0 181.700000 -7396.100000 0 181.700000 -7395.400000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 -7396.100000 0 494.500000 -7396.100000 0 494.500000 -7396.900000 0 181.700000 -7396.900000 0 181.700000 -7396.100000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 -7396.900000 0 494.500000 -7396.900000 0 494.500000 -7397.600000 0 181.700000 -7397.600000 0 181.700000 -7396.900000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 -7397.600000 0 494.500000 -7397.600000 0 494.500000 -7398.400000 0 181.700000 -7398.400000 0 181.700000 -7397.600000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 -7398.400000 0 494.500000 -7398.400000 0 494.500000 -7399.100000 0 181.700000 -7399.100000 0 181.700000 -7398.400000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 -7399.100000 0 494.500000 -7399.100000 0 494.500000 -7399.900000 0 181.700000 -7399.900000 0 181.700000 -7399.100000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 -7399.900000 0 494.500000 -7399.900000 0 494.500000 -7400.700000 0 181.700000 -7400.700000 0 181.700000 -7399.900000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 -7400.700000 0 494.500000 -7400.700000 0 494.500000 -7401.400000 0 181.700000 -7401.400000 0 181.700000 -7400.700000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 -7401.400000 0 494.500000 -7401.400000 0 494.500000 -7402.200000 0 181.700000 -7402.200000 0 181.700000 -7401.400000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 -7402.200000 0 494.500000 -7402.200000 0 494.500000 -7402.900000 0 181.700000 -7402.900000 0 181.700000 -7402.200000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 -7402.900000 0 494.500000 -7402.900000 0 494.500000 -7403.700000 0 181.700000 -7403.700000 0 181.700000 -7402.900000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 -7403.700000 0 494.500000 -7403.700000 0 494.500000 -7404.500000 0 181.700000 -7404.500000 0 181.700000 -7403.700000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 -7404.500000 0 494.500000 -7404.500000 0 494.500000 -7405.200000 0 181.700000 -7405.200000 0 181.700000 -7404.500000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 -7405.200000 0 494.500000 -7405.200000 0 494.500000 -7406.000000 0 181.700000 -7406.000000 0 181.700000 -7405.200000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 -7406.000000 0 494.500000 -7406.000000 0 494.500000 -7406.700000 0 181.700000 -7406.700000 0 181.700000 -7406.000000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 -7406.700000 0 494.500000 -7406.700000 0 494.500000 -7407.500000 0 181.700000 -7407.500000 0 181.700000 -7406.700000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 -7407.500000 0 494.500000 -7407.500000 0 494.500000 -7408.300000 0 181.700000 -7408.300000 0 181.700000 -7407.500000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 -7408.300000 0 494.500000 -7408.300000 0 494.500000 -7409.000000 0 181.700000 -7409.000000 0 181.700000 -7408.300000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 -7409.000000 0 494.500000 -7409.000000 0 494.500000 -7409.800000 0 181.700000 -7409.800000 0 181.700000 -7409.000000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 -7409.800000 0 494.500000 -7409.800000 0 494.500000 -7410.500000 0 181.700000 -7410.500000 0 181.700000 -7409.800000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 -7410.500000 0 494.500000 -7410.500000 0 494.500000 -7411.300000 0 181.700000 -7411.300000 0 181.700000 -7410.500000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 -7411.300000 0 494.500000 -7411.300000 0 494.500000 -7412.000000 0 181.700000 -7412.000000 0 181.700000 -7411.300000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 -7412.000000 0 494.500000 -7412.000000 0 494.500000 -7412.800000 0 181.700000 -7412.800000 0 181.700000 -7412.000000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 -7412.800000 0 494.500000 -7412.800000 0 494.500000 -7413.600000 0 181.700000 -7413.600000 0 181.700000 -7412.800000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 -7413.600000 0 494.500000 -7413.600000 0 494.500000 -7414.300000 0 181.700000 -7414.300000 0 181.700000 -7413.600000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 -7414.300000 0 494.500000 -7414.300000 0 494.500000 -7415.100000 0 181.700000 -7415.100000 0 181.700000 -7414.300000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 -7415.100000 0 494.500000 -7415.100000 0 494.500000 -7415.800000 0 181.700000 -7415.800000 0 181.700000 -7415.100000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 -7415.800000 0 494.500000 -7415.800000 0 494.500000 -7416.600000 0 181.700000 -7416.600000 0 181.700000 -7415.800000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 -7416.600000 0 494.500000 -7416.600000 0 494.500000 -7417.400000 0 181.700000 -7417.400000 0 181.700000 -7416.600000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 -7417.400000 0 494.500000 -7417.400000 0 494.500000 -7418.100000 0 181.700000 -7418.100000 0 181.700000 -7417.400000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 -7418.100000 0 494.500000 -7418.100000 0 494.500000 -7418.900000 0 181.700000 -7418.900000 0 181.700000 -7418.100000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 -7418.900000 0 494.500000 -7418.900000 0 494.500000 -7419.600000 0 181.700000 -7419.600000 0 181.700000 -7418.900000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 -7419.600000 0 494.500000 -7419.600000 0 494.500000 -7420.400000 0 181.700000 -7420.400000 0 181.700000 -7419.600000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 -7420.400000 0 494.500000 -7420.400000 0 494.500000 -7421.200000 0 181.700000 -7421.200000 0 181.700000 -7420.400000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 -7421.200000 0 494.500000 -7421.200000 0 494.500000 -7421.900000 0 181.700000 -7421.900000 0 181.700000 -7421.200000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 -7421.900000 0 494.500000 -7421.900000 0 494.500000 -7422.700000 0 181.700000 -7422.700000 0 181.700000 -7421.900000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 -7422.700000 0 494.500000 -7422.700000 0 494.500000 -7423.400000 0 181.700000 -7423.400000 0 181.700000 -7422.700000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 -7423.400000 0 494.500000 -7423.400000 0 494.500000 -7424.200000 0 181.700000 -7424.200000 0 181.700000 -7423.400000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 -7424.200000 0 494.500000 -7424.200000 0 494.500000 -7424.900000 0 181.700000 -7424.900000 0 181.700000 -7424.200000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 -7424.900000 0 494.500000 -7424.900000 0 494.500000 -7425.700000 0 181.700000 -7425.700000 0 181.700000 -7424.900000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 -7425.700000 0 494.500000 -7425.700000 0 494.500000 -7426.500000 0 181.700000 -7426.500000 0 181.700000 -7425.700000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 -7426.500000 0 494.500000 -7426.500000 0 494.500000 -7427.200000 0 181.700000 -7427.200000 0 181.700000 -7426.500000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 -7427.200000 0 494.500000 -7427.200000 0 494.500000 -7428.000000 0 181.700000 -7428.000000 0 181.700000 -7427.200000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 -7428.000000 0 494.500000 -7428.000000 0 494.500000 -7428.700000 0 181.700000 -7428.700000 0 181.700000 -7428.000000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 -7428.700000 0 494.500000 -7428.700000 0 494.500000 -7429.500000 0 181.700000 -7429.500000 0 181.700000 -7428.700000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 -7429.500000 0 494.500000 -7429.500000 0 494.500000 -7430.300000 0 181.700000 -7430.300000 0 181.700000 -7429.500000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 -7430.300000 0 494.500000 -7430.300000 0 494.500000 -7431.000000 0 181.700000 -7431.000000 0 181.700000 -7430.300000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 -7431.000000 0 494.500000 -7431.000000 0 494.500000 -7431.800000 0 181.700000 -7431.800000 0 181.700000 -7431.000000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 -7431.800000 0 494.500000 -7431.800000 0 494.500000 -7432.500000 0 181.700000 -7432.500000 0 181.700000 -7431.800000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 -7432.500000 0 494.500000 -7432.500000 0 494.500000 -7433.300000 0 181.700000 -7433.300000 0 181.700000 -7432.500000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 -7433.300000 0 494.500000 -7433.300000 0 494.500000 -7434.100000 0 181.700000 -7434.100000 0 181.700000 -7433.300000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 -7434.100000 0 494.500000 -7434.100000 0 494.500000 -7434.800000 0 181.700000 -7434.800000 0 181.700000 -7434.100000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 -7434.800000 0 494.500000 -7434.800000 0 494.500000 -7435.600000 0 181.700000 -7435.600000 0 181.700000 -7434.800000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 -7435.600000 0 494.500000 -7435.600000 0 494.500000 -7436.300000 0 181.700000 -7436.300000 0 181.700000 -7435.600000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 -7436.300000 0 494.500000 -7436.300000 0 494.500000 -7437.100000 0 181.700000 -7437.100000 0 181.700000 -7436.300000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 -7437.100000 0 494.500000 -7437.100000 0 494.500000 -7437.800000 0 181.700000 -7437.800000 0 181.700000 -7437.100000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 -7437.800000 0 494.500000 -7437.800000 0 494.500000 -7438.600000 0 181.700000 -7438.600000 0 181.700000 -7437.800000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 -7438.600000 0 494.500000 -7438.600000 0 494.500000 -7439.400000 0 181.700000 -7439.400000 0 181.700000 -7438.600000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 -7439.400000 0 494.500000 -7439.400000 0 494.500000 -7440.100000 0 181.700000 -7440.100000 0 181.700000 -7439.400000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 -7440.100000 0 494.500000 -7440.100000 0 494.500000 -7440.900000 0 181.700000 -7440.900000 0 181.700000 -7440.100000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 -7440.900000 0 494.500000 -7440.900000 0 494.500000 -7441.600000 0 181.700000 -7441.600000 0 181.700000 -7440.900000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 -7441.600000 0 494.500000 -7441.600000 0 494.500000 -7442.400000 0 181.700000 -7442.400000 0 181.700000 -7441.600000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 -7442.400000 0 494.500000 -7442.400000 0 494.500000 -7443.200000 0 181.700000 -7443.200000 0 181.700000 -7442.400000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 -7443.200000 0 494.500000 -7443.200000 0 494.500000 -7443.900000 0 181.700000 -7443.900000 0 181.700000 -7443.200000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 -7443.900000 0 494.500000 -7443.900000 0 494.500000 -7444.700000 0 181.700000 -7444.700000 0 181.700000 -7443.900000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 -7444.700000 0 494.500000 -7444.700000 0 494.500000 -7445.400000 0 181.700000 -7445.400000 0 181.700000 -7444.700000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 -7445.400000 0 494.500000 -7445.400000 0 494.500000 -7446.200000 0 181.700000 -7446.200000 0 181.700000 -7445.400000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 -7446.200000 0 494.500000 -7446.200000 0 494.500000 -7447.000000 0 181.700000 -7447.000000 0 181.700000 -7446.200000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 -7447.000000 0 494.500000 -7447.000000 0 494.500000 -7447.700000 0 181.700000 -7447.700000 0 181.700000 -7447.000000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 -7447.700000 0 494.500000 -7447.700000 0 494.500000 -7448.500000 0 181.700000 -7448.500000 0 181.700000 -7447.700000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 -7448.500000 0 494.500000 -7448.500000 0 494.500000 -7449.200000 0 181.700000 -7449.200000 0 181.700000 -7448.500000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 -7449.200000 0 494.500000 -7449.200000 0 494.500000 -7450.000000 0 181.700000 -7450.000000 0 181.700000 -7449.200000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 -7450.000000 0 494.500000 -7450.000000 0 494.500000 -7450.700000 0 181.700000 -7450.700000 0 181.700000 -7450.000000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 -7450.700000 0 494.500000 -7450.700000 0 494.500000 -7451.500000 0 181.700000 -7451.500000 0 181.700000 -7450.700000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 -7451.500000 0 494.500000 -7451.500000 0 494.500000 -7452.300000 0 181.700000 -7452.300000 0 181.700000 -7451.500000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 -7452.300000 0 494.500000 -7452.300000 0 494.500000 -7453.000000 0 181.700000 -7453.000000 0 181.700000 -7452.300000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 -7453.000000 0 494.500000 -7453.000000 0 494.500000 -7453.800000 0 181.700000 -7453.800000 0 181.700000 -7453.000000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 -7453.800000 0 494.500000 -7453.800000 0 494.500000 -7454.500000 0 181.700000 -7454.500000 0 181.700000 -7453.800000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 -7454.500000 0 494.500000 -7454.500000 0 494.500000 -7455.300000 0 181.700000 -7455.300000 0 181.700000 -7454.500000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 -7455.300000 0 494.500000 -7455.300000 0 494.500000 -7456.100000 0 181.700000 -7456.100000 0 181.700000 -7455.300000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 -7456.100000 0 494.500000 -7456.100000 0 494.500000 -7456.800000 0 181.700000 -7456.800000 0 181.700000 -7456.100000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 -7456.800000 0 494.500000 -7456.800000 0 494.500000 -7457.600000 0 181.700000 -7457.600000 0 181.700000 -7456.800000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 -7457.600000 0 494.500000 -7457.600000 0 494.500000 -7458.300000 0 181.700000 -7458.300000 0 181.700000 -7457.600000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 -7458.300000 0 494.500000 -7458.300000 0 494.500000 -7459.100000 0 181.700000 -7459.100000 0 181.700000 -7458.300000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 -7459.100000 0 494.500000 -7459.100000 0 494.500000 -7459.900000 0 181.700000 -7459.900000 0 181.700000 -7459.100000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 -7459.900000 0 494.500000 -7459.900000 0 494.500000 -7460.600000 0 181.700000 -7460.600000 0 181.700000 -7459.900000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 -7460.600000 0 494.500000 -7460.600000 0 494.500000 -7461.400000 0 181.700000 -7461.400000 0 181.700000 -7460.600000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 -7461.400000 0 494.500000 -7461.400000 0 494.500000 -7462.100000 0 181.700000 -7462.100000 0 181.700000 -7461.400000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 -7462.100000 0 494.500000 -7462.100000 0 494.500000 -7462.900000 0 181.700000 -7462.900000 0 181.700000 -7462.100000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 -7462.900000 0 494.500000 -7462.900000 0 494.500000 -7463.600000 0 181.700000 -7463.600000 0 181.700000 -7462.900000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 -7463.600000 0 494.500000 -7463.600000 0 494.500000 -7464.400000 0 181.700000 -7464.400000 0 181.700000 -7463.600000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 -7464.400000 0 494.500000 -7464.400000 0 494.500000 -7465.200000 0 181.700000 -7465.200000 0 181.700000 -7464.400000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 -7465.200000 0 494.500000 -7465.200000 0 494.500000 -7465.900000 0 181.700000 -7465.900000 0 181.700000 -7465.200000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 -7465.900000 0 494.500000 -7465.900000 0 494.500000 -7466.700000 0 181.700000 -7466.700000 0 181.700000 -7465.900000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 -7466.700000 0 494.500000 -7466.700000 0 494.500000 -7467.400000 0 181.700000 -7467.400000 0 181.700000 -7466.700000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 -7467.400000 0 494.500000 -7467.400000 0 494.500000 -7468.200000 0 181.700000 -7468.200000 0 181.700000 -7467.400000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 -7468.200000 0 494.500000 -7468.200000 0 494.500000 -7469.000000 0 181.700000 -7469.000000 0 181.700000 -7468.200000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 -7469.000000 0 494.500000 -7469.000000 0 494.500000 -7469.700000 0 181.700000 -7469.700000 0 181.700000 -7469.000000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 -7469.700000 0 494.500000 -7469.700000 0 494.500000 -7470.500000 0 181.700000 -7470.500000 0 181.700000 -7469.700000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 -7470.500000 0 494.500000 -7470.500000 0 494.500000 -7471.200000 0 181.700000 -7471.200000 0 181.700000 -7470.500000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 -7471.200000 0 494.500000 -7471.200000 0 494.500000 -7472.000000 0 181.700000 -7472.000000 0 181.700000 -7471.200000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 -7472.000000 0 494.500000 -7472.000000 0 494.500000 -7472.700000 0 181.700000 -7472.700000 0 181.700000 -7472.000000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 -7472.700000 0 494.500000 -7472.700000 0 494.500000 -7473.500000 0 181.700000 -7473.500000 0 181.700000 -7472.700000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 -7473.500000 0 494.500000 -7473.500000 0 494.500000 -7474.300000 0 181.700000 -7474.300000 0 181.700000 -7473.500000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 -7474.300000 0 494.500000 -7474.300000 0 494.500000 -7475.000000 0 181.700000 -7475.000000 0 181.700000 -7474.300000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 -7475.000000 0 494.500000 -7475.000000 0 494.500000 -7475.800000 0 181.700000 -7475.800000 0 181.700000 -7475.000000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 -7475.800000 0 494.500000 -7475.800000 0 494.500000 -7476.500000 0 181.700000 -7476.500000 0 181.700000 -7475.800000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 -7476.500000 0 494.500000 -7476.500000 0 494.500000 -7477.300000 0 181.700000 -7477.300000 0 181.700000 -7476.500000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 -7477.300000 0 494.500000 -7477.300000 0 494.500000 -7478.100000 0 181.700000 -7478.100000 0 181.700000 -7477.300000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 -7478.100000 0 494.500000 -7478.100000 0 494.500000 -7478.800000 0 181.700000 -7478.800000 0 181.700000 -7478.100000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 -7478.800000 0 494.500000 -7478.800000 0 494.500000 -7479.600000 0 181.700000 -7479.600000 0 181.700000 -7478.800000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 -7479.600000 0 494.500000 -7479.600000 0 494.500000 -7480.300000 0 181.700000 -7480.300000 0 181.700000 -7479.600000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 -7480.300000 0 494.500000 -7480.300000 0 494.500000 -7481.100000 0 181.700000 -7481.100000 0 181.700000 -7480.300000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 -7481.100000 0 494.500000 -7481.100000 0 494.500000 -7481.800000 0 181.700000 -7481.800000 0 181.700000 -7481.100000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 -7481.800000 0 494.500000 -7481.800000 0 494.500000 -7482.600000 0 181.700000 -7482.600000 0 181.700000 -7481.800000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 -7482.600000 0 494.500000 -7482.600000 0 494.500000 -7483.400000 0 181.700000 -7483.400000 0 181.700000 -7482.600000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 -7483.400000 0 494.500000 -7483.400000 0 494.500000 -7484.100000 0 181.700000 -7484.100000 0 181.700000 -7483.400000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 -7484.100000 0 494.500000 -7484.100000 0 494.500000 -7484.900000 0 181.700000 -7484.900000 0 181.700000 -7484.100000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 -7484.900000 0 494.500000 -7484.900000 0 494.500000 -7485.600000 0 181.700000 -7485.600000 0 181.700000 -7484.900000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 -7485.600000 0 494.500000 -7485.600000 0 494.500000 -7486.400000 0 181.700000 -7486.400000 0 181.700000 -7485.600000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 -7486.400000 0 494.500000 -7486.400000 0 494.500000 -7487.100000 0 181.700000 -7487.100000 0 181.700000 -7486.400000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 -7487.100000 0 494.500000 -7487.100000 0 494.500000 -7487.900000 0 181.700000 -7487.900000 0 181.700000 -7487.100000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 -7487.900000 0 494.500000 -7487.900000 0 494.500000 -7488.700000 0 181.700000 -7488.700000 0 181.700000 -7487.900000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 -7488.700000 0 494.500000 -7488.700000 0 494.500000 -7489.400000 0 181.700000 -7489.400000 0 181.700000 -7488.700000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 -7489.400000 0 494.500000 -7489.400000 0 494.500000 -7490.200000 0 181.700000 -7490.200000 0 181.700000 -7489.400000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 -7490.200000 0 494.500000 -7490.200000 0 494.500000 -7490.900000 0 181.700000 -7490.900000 0 181.700000 -7490.200000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 -7490.900000 0 494.500000 -7490.900000 0 494.500000 -7491.700000 0 181.700000 -7491.700000 0 181.700000 -7490.900000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 -7491.700000 0 494.500000 -7491.700000 0 494.500000 -7492.500000 0 181.700000 -7492.500000 0 181.700000 -7491.700000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 -7492.500000 0 494.500000 -7492.500000 0 494.500000 -7493.200000 0 181.700000 -7493.200000 0 181.700000 -7492.500000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 -7493.200000 0 494.500000 -7493.200000 0 494.500000 -7494.000000 0 181.700000 -7494.000000 0 181.700000 -7493.200000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 -7494.000000 0 494.500000 -7494.000000 0 494.500000 -7494.700000 0 181.700000 -7494.700000 0 181.700000 -7494.000000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 -7494.700000 0 494.500000 -7494.700000 0 494.500000 -7495.500000 0 181.700000 -7495.500000 0 181.700000 -7494.700000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 -7495.500000 0 494.500000 -7495.500000 0 494.500000 -7496.200000 0 181.700000 -7496.200000 0 181.700000 -7495.500000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 -7496.200000 0 494.500000 -7496.200000 0 494.500000 -7497.000000 0 181.700000 -7497.000000 0 181.700000 -7496.200000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 -7497.000000 0 494.500000 -7497.000000 0 494.500000 -7497.800000 0 181.700000 -7497.800000 0 181.700000 -7497.000000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 -7497.800000 0 494.500000 -7497.800000 0 494.500000 -7498.500000 0 181.700000 -7498.500000 0 181.700000 -7497.800000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 -7498.500000 0 494.500000 -7498.500000 0 494.500000 -7499.300000 0 181.700000 -7499.300000 0 181.700000 -7498.500000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 -7499.300000 0 494.500000 -7499.300000 0 494.500000 -7500.000000 0 181.700000 -7500.000000 0 181.700000 -7499.300000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 -7500.000000 0 494.500000 -7500.000000 0 494.500000 -7500.800000 0 181.700000 -7500.800000 0 181.700000 -7500.000000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 -7500.800000 0 494.500000 -7500.800000 0 494.500000 -7501.600000 0 181.700000 -7501.600000 0 181.700000 -7500.800000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 -7501.600000 0 494.500000 -7501.600000 0 494.500000 -7502.300000 0 181.700000 -7502.300000 0 181.700000 -7501.600000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 -7502.300000 0 494.500000 -7502.300000 0 494.500000 -7503.100000 0 181.700000 -7503.100000 0 181.700000 -7502.300000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 -7503.100000 0 494.500000 -7503.100000 0 494.500000 -7503.800000 0 181.700000 -7503.800000 0 181.700000 -7503.100000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 -7503.800000 0 494.500000 -7503.800000 0 494.500000 -7504.600000 0 181.700000 -7504.600000 0 181.700000 -7503.800000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 -7504.600000 0 494.500000 -7504.600000 0 494.500000 -7505.300000 0 181.700000 -7505.300000 0 181.700000 -7504.600000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 -7505.300000 0 494.500000 -7505.300000 0 494.500000 -7506.100000 0 181.700000 -7506.100000 0 181.700000 -7505.300000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 -7506.100000 0 494.500000 -7506.100000 0 494.500000 -7506.900000 0 181.700000 -7506.900000 0 181.700000 -7506.100000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 -7506.900000 0 494.500000 -7506.900000 0 494.500000 -7507.600000 0 181.700000 -7507.600000 0 181.700000 -7506.900000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 -7507.600000 0 494.500000 -7507.600000 0 494.500000 -7508.400000 0 181.700000 -7508.400000 0 181.700000 -7507.600000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 -7508.400000 0 494.500000 -7508.400000 0 494.500000 -7509.100000 0 181.700000 -7509.100000 0 181.700000 -7508.400000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 -7509.100000 0 494.500000 -7509.100000 0 494.500000 -7509.900000 0 181.700000 -7509.900000 0 181.700000 -7509.100000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 -7509.900000 0 494.500000 -7509.900000 0 494.500000 -7510.700000 0 181.700000 -7510.700000 0 181.700000 -7509.900000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 -7510.700000 0 494.500000 -7510.700000 0 494.500000 -7511.400000 0 181.700000 -7511.400000 0 181.700000 -7510.700000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 -7511.400000 0 494.500000 -7511.400000 0 494.500000 -7512.200000 0 181.700000 -7512.200000 0 181.700000 -7511.400000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 -7512.200000 0 494.500000 -7512.200000 0 494.500000 -7512.900000 0 181.700000 -7512.900000 0 181.700000 -7512.200000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 -7512.900000 0 494.500000 -7512.900000 0 494.500000 -7513.700000 0 181.700000 -7513.700000 0 181.700000 -7512.900000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 -7513.700000 0 494.500000 -7513.700000 0 494.500000 -7514.500000 0 181.700000 -7514.500000 0 181.700000 -7513.700000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 -7514.500000 0 494.500000 -7514.500000 0 494.500000 -7515.200000 0 181.700000 -7515.200000 0 181.700000 -7514.500000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 -7515.200000 0 494.500000 -7515.200000 0 494.500000 -7516.000000 0 181.700000 -7516.000000 0 181.700000 -7515.200000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 -7516.000000 0 494.500000 -7516.000000 0 494.500000 -7516.700000 0 181.700000 -7516.700000 0 181.700000 -7516.000000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 -7516.700000 0 494.500000 -7516.700000 0 494.500000 -7517.500000 0 181.700000 -7517.500000 0 181.700000 -7516.700000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 -7517.500000 0 494.500000 -7517.500000 0 494.500000 -7518.200000 0 181.700000 -7518.200000 0 181.700000 -7517.500000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 -7518.200000 0 494.500000 -7518.200000 0 494.500000 -7519.000000 0 181.700000 -7519.000000 0 181.700000 -7518.200000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 -7519.000000 0 494.500000 -7519.000000 0 494.500000 -7519.800000 0 181.700000 -7519.800000 0 181.700000 -7519.000000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 -7519.800000 0 494.500000 -7519.800000 0 494.500000 -7520.500000 0 181.700000 -7520.500000 0 181.700000 -7519.800000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 -7520.500000 0 494.500000 -7520.500000 0 494.500000 -7521.300000 0 181.700000 -7521.300000 0 181.700000 -7520.500000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 -7521.300000 0 494.500000 -7521.300000 0 494.500000 -7522.000000 0 181.700000 -7522.000000 0 181.700000 -7521.300000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 -7522.000000 0 494.500000 -7522.000000 0 494.500000 -7522.800000 0 181.700000 -7522.800000 0 181.700000 -7522.000000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 -7522.800000 0 494.500000 -7522.800000 0 494.500000 -7523.600000 0 181.700000 -7523.600000 0 181.700000 -7522.800000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 -7523.600000 0 494.500000 -7523.600000 0 494.500000 -7524.300000 0 181.700000 -7524.300000 0 181.700000 -7523.600000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 -7524.300000 0 494.500000 -7524.300000 0 494.500000 -7525.100000 0 181.700000 -7525.100000 0 181.700000 -7524.300000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 -7525.100000 0 494.500000 -7525.100000 0 494.500000 -7525.800000 0 181.700000 -7525.800000 0 181.700000 -7525.100000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 -7525.800000 0 494.500000 -7525.800000 0 494.500000 -7526.600000 0 181.700000 -7526.600000 0 181.700000 -7525.800000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 -7526.600000 0 494.500000 -7526.600000 0 494.500000 -7527.400000 0 181.700000 -7527.400000 0 181.700000 -7526.600000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 -7527.400000 0 494.500000 -7527.400000 0 494.500000 -7528.100000 0 181.700000 -7528.100000 0 181.700000 -7527.400000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 -7528.100000 0 494.500000 -7528.100000 0 494.500000 -7528.900000 0 181.700000 -7528.900000 0 181.700000 -7528.100000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 -7528.900000 0 494.500000 -7528.900000 0 494.500000 -7529.600000 0 181.700000 -7529.600000 0 181.700000 -7528.900000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 -7529.600000 0 494.500000 -7529.600000 0 494.500000 -7530.400000 0 181.700000 -7530.400000 0 181.700000 -7529.600000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 -7530.400000 0 494.500000 -7530.400000 0 494.500000 -7531.100000 0 181.700000 -7531.100000 0 181.700000 -7530.400000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 -7531.100000 0 494.500000 -7531.100000 0 494.500000 -7531.900000 0 181.700000 -7531.900000 0 181.700000 -7531.100000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 -7531.900000 0 494.500000 -7531.900000 0 494.500000 -7532.700000 0 181.700000 -7532.700000 0 181.700000 -7531.900000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 -7532.700000 0 494.500000 -7532.700000 0 494.500000 -7533.400000 0 181.700000 -7533.400000 0 181.700000 -7532.700000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 -7533.400000 0 494.500000 -7533.400000 0 494.500000 -7534.200000 0 181.700000 -7534.200000 0 181.700000 -7533.400000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 -7534.200000 0 494.500000 -7534.200000 0 494.500000 -7534.900000 0 181.700000 -7534.900000 0 181.700000 -7534.200000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 -7534.900000 0 494.500000 -7534.900000 0 494.500000 -7535.700000 0 181.700000 -7535.700000 0 181.700000 -7534.900000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 -7535.700000 0 494.500000 -7535.700000 0 494.500000 -7536.500000 0 181.700000 -7536.500000 0 181.700000 -7535.700000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 -7536.500000 0 494.500000 -7536.500000 0 494.500000 -7537.200000 0 181.700000 -7537.200000 0 181.700000 -7536.500000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 -7537.200000 0 494.500000 -7537.200000 0 494.500000 -7538.000000 0 181.700000 -7538.000000 0 181.700000 -7537.200000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 -7538.000000 0 494.500000 -7538.000000 0 494.500000 -7538.700000 0 181.700000 -7538.700000 0 181.700000 -7538.000000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 -7538.700000 0 494.500000 -7538.700000 0 494.500000 -7539.500000 0 181.700000 -7539.500000 0 181.700000 -7538.700000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 -7539.500000 0 494.500000 -7539.500000 0 494.500000 -7540.300000 0 181.700000 -7540.300000 0 181.700000 -7539.500000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 -7540.300000 0 494.500000 -7540.300000 0 494.500000 -7541.000000 0 181.700000 -7541.000000 0 181.700000 -7540.300000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 -7541.000000 0 494.500000 -7541.000000 0 494.500000 -7541.800000 0 181.700000 -7541.800000 0 181.700000 -7541.000000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 -7541.800000 0 494.500000 -7541.800000 0 494.500000 -7542.500000 0 181.700000 -7542.500000 0 181.700000 -7541.800000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 -7542.500000 0 494.500000 -7542.500000 0 494.500000 -7543.300000 0 181.700000 -7543.300000 0 181.700000 -7542.500000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 -7543.300000 0 494.500000 -7543.300000 0 494.500000 -7544.000000 0 181.700000 -7544.000000 0 181.700000 -7543.300000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 -7544.000000 0 494.500000 -7544.000000 0 494.500000 -7544.800000 0 181.700000 -7544.800000 0 181.700000 -7544.000000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 -7544.800000 0 494.500000 -7544.800000 0 494.500000 -7545.600000 0 181.700000 -7545.600000 0 181.700000 -7544.800000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 -7545.600000 0 494.500000 -7545.600000 0 494.500000 -7546.300000 0 181.700000 -7546.300000 0 181.700000 -7545.600000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 -7546.300000 0 494.500000 -7546.300000 0 494.500000 -7547.100000 0 181.700000 -7547.100000 0 181.700000 -7546.300000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 -7547.100000 0 494.500000 -7547.100000 0 494.500000 -7547.800000 0 181.700000 -7547.800000 0 181.700000 -7547.100000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 -7547.800000 0 494.500000 -7547.800000 0 494.500000 -7548.600000 0 181.700000 -7548.600000 0 181.700000 -7547.800000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 -7548.600000 0 494.500000 -7548.600000 0 494.500000 -7549.400000 0 181.700000 -7549.400000 0 181.700000 -7548.600000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 -7549.400000 0 494.500000 -7549.400000 0 494.500000 -7550.100000 0 181.700000 -7550.100000 0 181.700000 -7549.400000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 -7550.100000 0 494.500000 -7550.100000 0 494.500000 -7550.900000 0 181.700000 -7550.900000 0 181.700000 -7550.100000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 -7550.900000 0 494.500000 -7550.900000 0 494.500000 -7551.600000 0 181.700000 -7551.600000 0 181.700000 -7550.900000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 -7551.600000 0 494.500000 -7551.600000 0 494.500000 -7552.400000 0 181.700000 -7552.400000 0 181.700000 -7551.600000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 -7552.400000 0 494.500000 -7552.400000 0 494.500000 -7553.200000 0 181.700000 -7553.200000 0 181.700000 -7552.400000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 -7553.200000 0 494.500000 -7553.200000 0 494.500000 -7553.900000 0 181.700000 -7553.900000 0 181.700000 -7553.200000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 -7553.900000 0 494.500000 -7553.900000 0 494.500000 -7554.700000 0 181.700000 -7554.700000 0 181.700000 -7553.900000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 -7554.700000 0 494.500000 -7554.700000 0 494.500000 -7555.400000 0 181.700000 -7555.400000 0 181.700000 -7554.700000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 -7555.400000 0 494.500000 -7555.400000 0 494.500000 -7556.200000 0 181.700000 -7556.200000 0 181.700000 -7555.400000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 -7556.200000 0 494.500000 -7556.200000 0 494.500000 -7556.900000 0 181.700000 -7556.900000 0 181.700000 -7556.200000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 -7556.900000 0 494.500000 -7556.900000 0 494.500000 -7557.700000 0 181.700000 -7557.700000 0 181.700000 -7556.900000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 -7557.700000 0 494.500000 -7557.700000 0 494.500000 -7558.500000 0 181.700000 -7558.500000 0 181.700000 -7557.700000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 -7558.500000 0 494.500000 -7558.500000 0 494.500000 -7559.200000 0 181.700000 -7559.200000 0 181.700000 -7558.500000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 -7559.200000 0 494.500000 -7559.200000 0 494.500000 -7560.000000 0 181.700000 -7560.000000 0 181.700000 -7559.200000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 -7560.000000 0 494.500000 -7560.000000 0 494.500000 -7560.700000 0 181.700000 -7560.700000 0 181.700000 -7560.000000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 -7560.700000 0 494.500000 -7560.700000 0 494.500000 -7561.500000 0 181.700000 -7561.500000 0 181.700000 -7560.700000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 -7561.500000 0 494.500000 -7561.500000 0 494.500000 -7562.300000 0 181.700000 -7562.300000 0 181.700000 -7561.500000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 -7562.300000 0 494.500000 -7562.300000 0 494.500000 -7563.000000 0 181.700000 -7563.000000 0 181.700000 -7562.300000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 -7563.000000 0 494.500000 -7563.000000 0 494.500000 -7563.800000 0 181.700000 -7563.800000 0 181.700000 -7563.000000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 -7563.800000 0 494.500000 -7563.800000 0 494.500000 -7564.500000 0 181.700000 -7564.500000 0 181.700000 -7563.800000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 -7564.500000 0 494.500000 -7564.500000 0 494.500000 -7565.300000 0 181.700000 -7565.300000 0 181.700000 -7564.500000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 -7565.300000 0 494.500000 -7565.300000 0 494.500000 -7566.100000 0 181.700000 -7566.100000 0 181.700000 -7565.300000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 -7566.100000 0 494.500000 -7566.100000 0 494.500000 -7566.800000 0 181.700000 -7566.800000 0 181.700000 -7566.100000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 -7566.800000 0 494.500000 -7566.800000 0 494.500000 -7567.600000 0 181.700000 -7567.600000 0 181.700000 -7566.800000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 -7567.600000 0 494.500000 -7567.600000 0 494.500000 -7568.300000 0 181.700000 -7568.300000 0 181.700000 -7567.600000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 -7568.300000 0 494.500000 -7568.300000 0 494.500000 -7569.100000 0 181.700000 -7569.100000 0 181.700000 -7568.300000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 -7569.100000 0 494.500000 -7569.100000 0 494.500000 -7569.800000 0 181.700000 -7569.800000 0 181.700000 -7569.100000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 -7569.800000 0 494.500000 -7569.800000 0 494.500000 -7570.600000 0 181.700000 -7570.600000 0 181.700000 -7569.800000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 -7570.600000 0 494.500000 -7570.600000 0 494.500000 -7571.400000 0 181.700000 -7571.400000 0 181.700000 -7570.600000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 -7571.400000 0 494.500000 -7571.400000 0 494.500000 -7572.100000 0 181.700000 -7572.100000 0 181.700000 -7571.400000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 -7572.100000 0 494.500000 -7572.100000 0 494.500000 -7572.900000 0 181.700000 -7572.900000 0 181.700000 -7572.100000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 -7572.900000 0 494.500000 -7572.900000 0 494.500000 -7573.600000 0 181.700000 -7573.600000 0 181.700000 -7572.900000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 -7573.600000 0 494.500000 -7573.600000 0 494.500000 -7574.400000 0 181.700000 -7574.400000 0 181.700000 -7573.600000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 -7574.400000 0 494.500000 -7574.400000 0 494.500000 -7575.200000 0 181.700000 -7575.200000 0 181.700000 -7574.400000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 -7575.200000 0 494.500000 -7575.200000 0 494.500000 -7575.900000 0 181.700000 -7575.900000 0 181.700000 -7575.200000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 -7575.900000 0 494.500000 -7575.900000 0 494.500000 -7576.700000 0 181.700000 -7576.700000 0 181.700000 -7575.900000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 -7576.700000 0 494.500000 -7576.700000 0 494.500000 -7577.400000 0 181.700000 -7577.400000 0 181.700000 -7576.700000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 -7577.400000 0 494.500000 -7577.400000 0 494.500000 -7578.200000 0 181.700000 -7578.200000 0 181.700000 -7577.400000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 -7578.200000 0 494.500000 -7578.200000 0 494.500000 -7579.000000 0 181.700000 -7579.000000 0 181.700000 -7578.200000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 -7579.000000 0 494.500000 -7579.000000 0 494.500000 -7579.700000 0 181.700000 -7579.700000 0 181.700000 -7579.000000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 -7579.700000 0 494.500000 -7579.700000 0 494.500000 -7580.500000 0 181.700000 -7580.500000 0 181.700000 -7579.700000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 -7580.500000 0 494.500000 -7580.500000 0 494.500000 -7581.200000 0 181.700000 -7581.200000 0 181.700000 -7580.500000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 -7581.200000 0 494.500000 -7581.200000 0 494.500000 -7582.000000 0 181.700000 -7582.000000 0 181.700000 -7581.200000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 -7582.000000 0 494.500000 -7582.000000 0 494.500000 -7582.700000 0 181.700000 -7582.700000 0 181.700000 -7582.000000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 -7582.700000 0 494.500000 -7582.700000 0 494.500000 -7583.500000 0 181.700000 -7583.500000 0 181.700000 -7582.700000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 -7583.500000 0 494.500000 -7583.500000 0 494.500000 -7584.300000 0 181.700000 -7584.300000 0 181.700000 -7583.500000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 -7584.300000 0 494.500000 -7584.300000 0 494.500000 -7585.000000 0 181.700000 -7585.000000 0 181.700000 -7584.300000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 -7585.000000 0 494.500000 -7585.000000 0 494.500000 -7585.800000 0 181.700000 -7585.800000 0 181.700000 -7585.000000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 -7585.700000 0 181.800000 -7585.700000 0 181.800000 -7392.400000 0 494.400000 -7392.400000 0 494.400000 -7585.700000 0 338.100000 -7585.700000 0
+strokePath subpath 1 338.100000 -7585.700000 0 181.800000 -7585.700000 0 181.800000 -7392.400000 0 494.400000 -7392.400000 0 494.400000 -7585.700000 0 338.100000 -7585.700000 0
+saveState
+updateCtm 11420.000000 0.000000 0.000000 -8760.000000 20530.000000 830170.000000
+drawSoftMaskedImage 1143 877 1143 877 JPEG 71324 PPM 3007249
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 -7546.676000 215.488000 -7554.676000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 -7546.676000 220.592000 -7554.676000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 -7546.676000 225.696000 -7554.676000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 -7546.676000 230.800000 -7554.676000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 -7554.276000 241.388000 -7562.276000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 -7554.276000 246.492000 -7562.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 -7554.276000 251.596000 -7562.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 -7554.276000 256.700000 -7562.276000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 -7561.976000 267.188000 -7569.976000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 -7561.976000 272.292000 -7569.976000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 -7561.976000 277.396000 -7569.976000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 -7561.976000 282.500000 -7569.976000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 -7569.576000 293.088000 -7577.576000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 -7569.576000 298.192000 -7577.576000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 -7569.576000 303.296000 -7577.576000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 -7569.576000 308.400000 -7577.576000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 -7531.676000 202.588000 -7539.676000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 -7512.376000 201.688000 -7520.376000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 -7493.076000 195.788000 -7501.076000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 -7493.076000 200.892000 -7501.076000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 -7473.676000 194.888000 -7481.676000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 -7473.676000 199.992000 -7481.676000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 -7454.376000 193.988000 -7462.376000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 -7454.376000 199.092000 -7462.376000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 -7435.076000 193.088000 -7443.076000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 -7435.076000 198.192000 -7443.076000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 -7562.976000 330.188000 -7570.976000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 -7562.976000 332.716000 -7570.976000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 -7562.976000 337.596000 -7570.976000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 -7562.976000 341.396000 -7570.976000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 -7562.976000 346.036000 -7570.976000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 -7562.976000 350.900000 -7570.976000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 -7562.976000 355.972000 -7570.976000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 -7562.976000 359.196000 -7570.976000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 -7562.976000 362.196000 -7570.976000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 -7562.976000 367.404000 -7570.976000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 -7562.976000 371.876000 -7570.976000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 -7562.976000 375.052000 -7570.976000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 -7543.476000 361.172000 -7551.476000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 -7543.476000 364.340000 -7551.476000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 -7543.476000 367.396000 -7551.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 -7543.476000 372.604000 -7551.476000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 -7543.476000 379.348000 -7551.476000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 -7543.476000 384.484000 -7551.476000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 -7543.476000 389.436000 -7551.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 -7543.476000 392.108000 -7551.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 -7543.476000 395.708000 -7551.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 -7543.476000 397.540000 -7551.476000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 -7543.476000 402.444000 -7551.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 -7543.476000 406.788000 -7551.476000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 -7523.876000 392.972000 -7531.876000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 -7523.876000 398.076000 -7531.876000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 -7523.876000 403.180000 -7531.876000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 -7523.876000 405.428000 -7531.876000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 -7523.876000 410.332000 -7531.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 -7523.876000 414.476000 -7531.876000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 -7396.308000 305.808000 -7410.308000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 -7396.308000 314.138000 -7410.308000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 -7396.308000 320.788000 -7410.308000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 -7396.308000 328.698000 -7410.308000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 -7396.308000 336.972000 -7410.308000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 -7396.308000 344.182000 -7410.308000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 -7396.308000 349.810000 -7410.308000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 -7396.308000 354.234000 -7410.308000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 -7396.308000 362.718000 -7410.308000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 -7396.308000 367.870000 -7410.308000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 -7396.308000 372.322000 -7410.308000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 -7396.308000 382.080000 -7410.308000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 -7396.308000 388.772000 -7410.308000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 -7396.308000 397.802000 -7410.308000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 -7396.308000 402.254000 -7410.308000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 -7396.308000 407.896000 -7410.308000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 -7519.200000 0 424.300000 -7519.200000 0 424.300000 -7458.500000 0 493.600000 -7458.500000 0 493.600000 -7519.200000 0 458.900000 -7519.200000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 -7468.100000 0 428.900000 -7468.100000 0 428.900000 -7462.100000 0 434.800000 -7462.100000 0 434.800000 -7468.100000 0 431.900000 -7468.100000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 -7479.200000 0 428.900000 -7479.200000 0 428.900000 -7473.200000 0 434.800000 -7473.200000 0 434.800000 -7479.200000 0 431.900000 -7479.200000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 -7490.300000 0 428.900000 -7490.300000 0 428.900000 -7484.300000 0 434.800000 -7484.300000 0 434.800000 -7490.300000 0 431.900000 -7490.300000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 -7501.400000 0 428.900000 -7501.400000 0 428.900000 -7495.400000 0 434.800000 -7495.400000 0 434.800000 -7501.400000 0 431.900000 -7501.400000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 -7512.500000 0 428.900000 -7512.500000 0 428.900000 -7506.500000 0 434.800000 -7506.500000 0 434.800000 -7512.500000 0 431.900000 -7512.500000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -7460.976000 443.288000 -7468.976000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 -7460.976000 445.816000 -7468.976000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 -7460.976000 450.600000 -7468.976000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 -7460.976000 454.496000 -7468.976000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 -7460.976000 459.136000 -7468.976000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 -7460.976000 464.000000 -7468.976000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 -7460.976000 468.976000 -7468.976000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 -7460.976000 472.304000 -7468.976000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 -7460.976000 475.208000 -7468.976000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 -7460.976000 480.520000 -7468.976000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 -7460.976000 484.992000 -7468.976000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 -7460.976000 488.168000 -7468.976000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -7472.076000 443.352000 -7480.076000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 -7472.076000 447.920000 -7480.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 -7472.076000 452.976000 -7480.076000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 -7472.076000 457.400000 -7480.076000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 -7472.076000 462.472000 -7480.076000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 -7472.076000 465.800000 -7480.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 -7472.076000 468.904000 -7480.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 -7472.076000 473.816000 -7480.076000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 -7472.076000 478.888000 -7480.076000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 -7472.076000 482.064000 -7480.076000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -7483.176000 442.872000 -7491.176000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 -7483.176000 446.040000 -7491.176000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 -7483.176000 448.992000 -7491.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 -7483.176000 454.304000 -7491.176000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 -7483.176000 461.048000 -7491.176000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 -7483.176000 466.184000 -7491.176000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 -7483.176000 471.136000 -7491.176000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 -7483.176000 473.808000 -7491.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 -7483.176000 477.408000 -7491.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 -7483.176000 479.240000 -7491.176000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 -7483.176000 484.144000 -7491.176000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 -7483.176000 488.488000 -7491.176000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -7494.276000 443.384000 -7502.276000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 -7494.276000 448.464000 -7502.276000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 -7494.276000 453.424000 -7502.276000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 -7494.276000 456.696000 -7502.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 -7494.276000 459.800000 -7502.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 -7494.276000 462.032000 -7502.276000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 -7494.276000 466.936000 -7502.276000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 -7494.276000 471.080000 -7502.276000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -7505.376000 443.272000 -7513.376000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 -7505.376000 448.376000 -7513.376000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 -7505.376000 453.480000 -7513.376000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 -7505.376000 455.728000 -7513.376000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 -7505.376000 460.632000 -7513.376000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 -7505.376000 464.776000 -7513.376000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -10150.400000 0 114.800000 -10150.400000 0 114.800000 -10107.600000 0 72.000000 -10107.600000 0 72.000000 -10150.400000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 1094230.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 668.600000 0 504.000000 668.600000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 668.600000 0
+eoFillPath subpath 1 72.000000 419.700000 0 121.400000 419.700000 0 121.400000 541.800000 0 72.000000 541.800000 0 72.000000 419.700000 0
+eoFillPath subpath 1 454.500000 419.700000 0 504.000000 419.700000 0 504.000000 541.800000 0 454.500000 541.800000 0 454.500000 419.700000 0
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 419.700000 0 504.000000 419.700000 0 504.000000 541.800000 0 72.000000 541.800000 0 72.000000 419.700000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 541.800000 0 76.300000 541.800000 0 76.300000 668.600000 0 72.000000 668.600000 0 72.000000 541.800000 0
+eoFillPath subpath 1 158.800000 546.200000 0 504.000000 546.200000 0 504.000000 668.600000 0 158.800000 668.600000 0 158.800000 546.200000 0
+eoFillPath subpath 1 454.500000 541.800000 0 504.000000 541.800000 0 504.000000 546.200000 0 454.500000 546.200000 0 454.500000 541.800000 0
+restoreState
+saveState
+eoClipPath subpath 1 158.800000 541.800000 0 504.000000 541.800000 0 504.000000 668.600000 0 158.800000 668.600000 0 158.800000 541.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 72.000000 0 504.000000 72.000000 0 504.000000 245.800000 0 72.000000 245.800000 0 72.000000 72.000000 0
+eoFillPath subpath 1 72.000000 245.800000 0 121.400000 245.800000 0 121.400000 267.200000 0 72.000000 267.200000 0 72.000000 245.800000 0
+eoFillPath subpath 1 454.500000 245.800000 0 504.000000 245.800000 0 504.000000 267.200000 0 454.500000 267.200000 0 454.500000 245.800000 0
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 72.000000 0 504.000000 72.000000 0 504.000000 267.200000 0 72.000000 267.200000 0 72.000000 72.000000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 267.200000 0 76.300000 267.200000 0 76.300000 419.700000 0 72.000000 419.700000 0 72.000000 267.200000 0
+eoFillPath subpath 1 454.500000 267.200000 0 504.000000 267.200000 0 504.000000 419.700000 0 454.500000 419.700000 0 454.500000 267.200000 0
+restoreState
+saveState
+eoClipPath subpath 1 156.200000 267.200000 0 504.000000 267.200000 0 504.000000 419.700000 0 156.200000 419.700000 0 156.200000 267.200000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 72.000000 701.300000 0 504.000000 701.300000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 701.300000 0
+eoFillPath subpath 1 72.000000 72.200000 0 504.000000 72.200000 0 504.000000 86.100000 0 72.000000 86.100000 0 72.000000 72.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 331.200000 719.948000 344.992000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 345.008000 719.948000 354.464000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 354.512000 719.948000 359.584000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 359.616000 719.948000 371.632000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 371.616000 719.948000 381.392000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 381.424000 719.948000 391.552000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 391.520000 719.948000 399.840000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 399.824000 719.948000 409.664000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 409.632000 719.948000 414.704000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 414.736000 719.948000 420.496000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 420.544000 719.948000 425.616000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 425.600000 719.948000 434.800000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 433.600000 719.948000 438.032000 703.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 438.000000 719.948000 444.576000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 444.608000 719.948000 452.928000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 452.912000 719.948000 459.184000 703.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 459.216000 719.948000 464.288000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 464.320000 719.948000 473.520000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 473.520000 719.948000 477.952000 703.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 477.920000 719.948000 487.696000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 487.728000 719.948000 497.504000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 497.536000 719.948000 504.112000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 672.936000 193.180000 660.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 193.204000 672.936000 200.356000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 200.404000 672.936000 206.140000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 206.104000 672.936000 209.932000 660.936000 1.000000 0.000000 0.000000 1.000000 i
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 209.900000 672.936000 213.704000 660.936000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 213.896000 672.936000 217.700000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 217.892000 672.936000 224.660000 660.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 224.696000 672.936000 231.848000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 231.800000 672.936000 237.536000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 237.596000 672.936000 241.424000 660.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 241.400000 672.936000 248.624000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 248.600000 672.936000 256.328000 660.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 256.400000 672.936000 262.556000 660.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 262.700000 672.936000 266.504000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.804000 672.936000 270.632000 660.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 270.608000 672.936000 274.436000 660.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 274.412000 672.936000 282.092000 660.936000 1.000000 0.000000 0.000000 1.000000 q
+drawChar 282.116000 672.936000 289.844000 660.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 289.820000 672.936000 296.912000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 297.020000 672.936000 304.748000 660.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 304.724000 672.936000 310.460000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 310.520000 672.936000 316.676000 660.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 316.820000 672.936000 320.624000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 320.816000 672.936000 327.968000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 328.016000 672.936000 335.744000 660.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 335.720000 672.936000 343.400000 660.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 343.616000 672.936000 347.420000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 347.612000 672.936000 354.764000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 354.908000 672.936000 358.712000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 358.904000 672.936000 363.344000 660.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 363.308000 672.936000 370.400000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 370.412000 672.936000 380.672000 660.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 380.912000 672.936000 384.716000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 385.016000 672.936000 390.524000 660.936000 1.000000 0.000000 0.000000 1.000000 "
+drawChar 390.512000 672.936000 398.240000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 398.216000 672.936000 405.368000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 405.416000 672.936000 411.152000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 411.116000 672.936000 418.796000 660.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 418.820000 672.936000 424.328000 660.936000 1.000000 0.000000 0.000000 1.000000 "
+drawChar 424.520000 672.936000 428.324000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 428.516000 672.936000 436.196000 660.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 436.220000 672.936000 441.956000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 441.920000 672.936000 445.748000 660.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 445.820000 672.936000 453.548000 660.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 453.524000 672.936000 460.784000 660.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 460.820000 672.936000 466.976000 660.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 467.120000 672.936000 470.924000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 471.116000 672.936000 482.492000 660.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 482.516000 672.936000 489.668000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 489.620000 672.936000 496.880000 660.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 497.024000 672.936000 504.116000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 672.936000 507.904000 660.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 659.036000 193.228000 647.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 193.204000 659.036000 200.884000 647.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 201.400000 659.036000 205.204000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 205.804000 659.036000 210.616000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 210.604000 659.036000 218.332000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 218.404000 659.036000 225.496000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 226.108000 659.036000 229.912000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 230.512000 659.036000 237.664000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 237.712000 659.036000 241.540000 647.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 241.516000 659.036000 248.236000 647.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 248.212000 659.036000 255.436000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 255.412000 659.036000 263.140000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 263.212000 659.036000 270.436000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 270.412000 659.036000 274.240000 647.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 274.216000 659.036000 278.044000 647.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 278.116000 659.036000 284.836000 647.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 285.316000 659.036000 289.120000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 289.720000 659.036000 297.400000 647.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 297.424000 659.036000 304.648000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 304.624000 659.036000 310.360000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 310.324000 659.036000 315.136000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 315.220000 659.036000 319.048000 647.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 319.024000 659.036000 326.248000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 326.224000 659.036000 333.952000 647.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 334.024000 659.036000 337.828000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 339.028000 659.036000 342.832000 647.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 342.800000 659.036000 352.376000 647.036000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 352.400000 659.036000 358.136000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.100000 659.036000 365.192000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 365.204000 659.036000 372.932000 647.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 372.908000 659.036000 380.060000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 380.108000 659.036000 387.788000 647.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 387.812000 659.036000 391.640000 647.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 391.616000 659.036000 399.344000 647.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 399.320000 659.036000 406.412000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 406.500000 659.036000 410.304000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 411.396000 659.036000 418.548000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 418.596000 659.036000 426.324000 647.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 426.300000 659.036000 433.980000 647.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 434.604000 659.036000 438.408000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 439.008000 659.036000 442.836000 647.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 442.812000 659.036000 446.640000 647.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 446.712000 659.036000 458.088000 647.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 458.112000 659.036000 465.204000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 465.612000 659.036000 469.416000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 470.112000 659.036000 476.268000 647.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 476.316000 659.036000 483.084000 647.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 483.012000 659.036000 488.748000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 488.808000 659.036000 496.536000 647.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 496.512000 659.036000 504.192000 647.036000 1.000000 0.000000 0.000000 1.000000 p
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 659.036000 508.004000 647.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 645.136000 192.652000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 192.700000 645.136000 198.436000 633.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 198.400000 645.136000 205.492000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 206.104000 645.136000 209.908000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 210.508000 645.136000 217.660000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 217.708000 645.136000 221.536000 633.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 221.512000 645.136000 227.668000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.716000 645.136000 234.940000 633.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 235.516000 645.136000 239.320000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 239.920000 645.136000 247.072000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 247.120000 645.136000 253.888000 633.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 253.816000 645.136000 260.968000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 261.016000 645.136000 264.844000 633.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 264.820000 645.136000 268.648000 633.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 268.720000 645.136000 275.872000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 275.824000 645.136000 283.504000 633.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 283.528000 645.136000 287.356000 633.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 287.332000 645.136000 294.424000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 295.036000 645.136000 298.840000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 299.440000 645.136000 303.880000 633.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 303.844000 645.136000 311.068000 633.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 311.140000 645.136000 316.876000 633.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 317.536000 645.136000 321.340000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 321.940000 645.136000 329.668000 633.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 329.644000 645.136000 336.868000 633.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 336.940000 645.136000 344.668000 633.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 344.536000 645.136000 348.580000 633.136000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 348.640000 645.136000 355.792000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 355.840000 645.136000 359.668000 633.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 359.644000 645.136000 366.364000 633.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 366.448000 645.136000 373.672000 633.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 373.552000 645.136000 381.280000 633.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 381.256000 645.136000 388.480000 633.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 388.552000 645.136000 392.380000 633.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 392.356000 645.136000 396.184000 633.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 396.160000 645.136000 402.880000 633.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 403.564000 645.136000 407.368000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 407.968000 645.136000 414.124000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 414.172000 645.136000 421.852000 633.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 421.768000 645.136000 428.860000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 428.872000 645.136000 435.592000 633.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 435.676000 645.136000 439.504000 633.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 439.480000 645.136000 446.632000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 446.680000 645.136000 450.508000 633.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 450.484000 645.136000 455.296000 633.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 455.284000 645.136000 459.112000 633.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 459.184000 645.136000 466.276000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.288000 645.136000 472.444000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 472.384000 645.136000 476.188000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.788000 645.136000 480.592000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 481.192000 645.136000 489.184000 633.136000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 489.196000 645.136000 496.924000 633.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.900000 645.136000 503.992000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 645.136000 508.004000 633.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 631.236000 193.228000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 193.204000 631.236000 200.296000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 200.308000 631.236000 207.028000 619.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 207.112000 631.236000 214.204000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 214.216000 631.236000 220.372000 619.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 220.312000 631.236000 226.468000 619.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 226.516000 631.236000 233.668000 619.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 233.620000 631.236000 239.356000 619.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 239.416000 631.236000 246.184000 619.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 246.820000 631.236000 250.624000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 251.416000 631.236000 262.792000 619.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 262.720000 631.236000 266.548000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 266.524000 631.236000 273.280000 619.236000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 273.328000 631.236000 277.156000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 277.132000 631.236000 284.860000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 284.932000 631.236000 292.612000 619.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 293.332000 631.236000 297.136000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 297.832000 631.236000 305.560000 619.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 305.536000 631.236000 310.348000 619.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 310.432000 631.236000 317.524000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 317.536000 631.236000 325.264000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 325.240000 631.236000 331.396000 619.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 331.336000 631.236000 335.164000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 335.236000 631.236000 339.064000 619.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 339.040000 631.236000 345.196000 619.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 345.940000 631.236000 349.744000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 350.440000 631.236000 356.596000 619.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 356.644000 631.236000 364.372000 619.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 364.348000 631.236000 371.068000 619.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 371.044000 631.236000 378.772000 619.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 379.444000 631.236000 383.248000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 383.944000 631.236000 391.096000 619.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 391.144000 631.236000 397.300000 619.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 398.044000 631.236000 401.848000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 402.544000 631.236000 409.696000 619.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 411.040000 631.236000 414.844000 619.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 415.100000 631.236000 421.256000 619.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 421.304000 631.236000 429.032000 619.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 429.008000 631.236000 436.160000 619.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 436.112000 631.236000 443.372000 619.236000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 443.408000 631.236000 450.500000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 450.512000 631.236000 456.248000 619.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 457.016000 631.236000 460.820000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 461.516000 631.236000 468.668000 619.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 468.716000 631.236000 476.444000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 476.312000 631.236000 483.992000 619.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 484.712000 631.236000 488.516000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 489.212000 631.236000 496.364000 619.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 496.412000 631.236000 504.140000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 631.236000 507.904000 619.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 617.336000 192.592000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 192.604000 617.336000 196.432000 605.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 196.408000 617.336000 203.500000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 203.512000 617.336000 210.232000 605.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 210.316000 617.336000 215.128000 605.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 215.116000 617.336000 220.852000 605.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 220.816000 617.336000 224.644000 605.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 224.716000 617.336000 231.436000 605.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 232.312000 617.336000 236.116000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 237.016000 617.336000 248.392000 605.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 248.416000 617.336000 252.244000 605.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 252.220000 617.336000 258.976000 605.336000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 259.024000 617.336000 266.116000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 266.128000 617.336000 271.864000 605.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 272.728000 617.336000 276.532000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.528000 617.336000 281.968000 605.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 281.932000 617.336000 289.156000 605.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 289.228000 617.336000 294.964000 605.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 296.728000 617.336000 300.532000 605.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 300.600000 617.336000 305.040000 605.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 305.004000 617.336000 310.740000 605.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 310.800000 617.336000 318.024000 605.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 318.000000 617.336000 324.312000 605.336000 1.000000 0.000000 0.000000 1.000000 z
+drawChar 324.300000 617.336000 331.392000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 331.404000 617.336000 339.132000 605.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 340.104000 617.336000 343.908000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 344.808000 617.336000 356.184000 605.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 356.112000 617.336000 363.264000 605.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 363.312000 617.336000 369.048000 605.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 369.012000 617.336000 376.692000 605.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 376.716000 617.336000 383.868000 605.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 383.820000 617.336000 389.556000 605.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 389.616000 617.336000 393.444000 605.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 393.420000 617.336000 398.232000 605.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 398.316000 617.336000 405.468000 605.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 405.516000 617.336000 411.672000 605.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 412.512000 617.336000 416.316000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 417.312000 617.336000 424.464000 605.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 424.512000 617.336000 430.248000 605.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 430.212000 617.336000 437.304000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 438.216000 617.336000 442.020000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 442.920000 617.336000 450.072000 605.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.120000 617.336000 453.948000 605.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 453.924000 617.336000 460.080000 605.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 460.128000 617.336000 467.352000 605.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 468.228000 617.336000 472.032000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 473.028000 617.336000 479.748000 605.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 479.724000 617.336000 483.552000 605.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 483.624000 617.336000 490.848000 605.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 490.824000 617.336000 496.980000 605.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 496.920000 617.336000 504.012000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 617.336000 507.904000 605.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 603.436000 192.652000 591.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 192.700000 603.436000 197.512000 591.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 199.000000 603.436000 202.804000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 204.400000 603.436000 212.128000 591.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 212.104000 603.436000 219.256000 591.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 219.304000 603.436000 227.032000 591.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 227.008000 603.436000 234.688000 591.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 234.712000 603.436000 238.516000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.112000 603.436000 243.916000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.512000 603.436000 257.788000 591.436000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 257.812000 603.436000 264.580000 591.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 266.116000 603.436000 269.920000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 271.516000 603.436000 275.956000 591.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 275.920000 603.436000 283.072000 591.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 283.120000 603.436000 289.888000 591.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 289.924000 603.436000 297.148000 591.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 297.124000 603.436000 302.860000 591.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 302.824000 603.436000 306.652000 591.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 306.724000 603.436000 311.536000 591.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 311.524000 603.436000 318.616000 591.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 320.224000 603.436000 324.028000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 325.624000 603.436000 333.304000 591.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 333.328000 603.436000 339.064000 591.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 339.028000 603.436000 342.856000 591.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 342.928000 603.436000 350.656000 591.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 350.632000 603.436000 357.892000 591.436000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 359.428000 603.436000 363.232000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 364.828000 603.436000 368.656000 591.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 368.632000 603.436000 374.788000 591.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 376.432000 603.436000 380.236000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 381.832000 603.436000 386.644000 591.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 386.632000 603.436000 394.360000 591.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 394.432000 603.436000 401.524000 591.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.928000 603.436000 406.732000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 408.424000 603.436000 414.580000 591.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 414.628000 603.436000 421.780000 591.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 421.732000 603.436000 433.108000 591.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 433.036000 603.436000 440.128000 591.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 441.736000 603.436000 445.540000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 447.232000 603.436000 454.384000 591.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.432000 603.436000 460.588000 591.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 462.028000 603.436000 465.832000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 467.428000 603.436000 472.228000 591.436000 1.000000 0.000000 0.000000 1.000000 J
+drawChar 472.228000 603.436000 479.380000 591.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.428000 603.436000 490.804000 591.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 490.732000 603.436000 497.824000 591.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 497.836000 603.436000 503.992000 591.436000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 603.436000 507.904000 591.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 589.536000 194.308000 577.536000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 194.296000 589.536000 201.520000 577.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 201.496000 589.536000 209.224000 577.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 209.296000 589.536000 216.976000 577.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 217.000000 589.536000 220.288000 577.536000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 220.300000 589.536000 226.456000 577.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 226.396000 589.536000 230.428000 577.536000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 230.800000 589.536000 234.604000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 235.000000 589.536000 242.152000 577.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 242.896000 589.536000 246.700000 577.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 246.800000 589.536000 258.176000 577.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 258.200000 589.536000 265.352000 577.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 265.304000 589.536000 271.040000 577.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 271.100000 589.536000 275.912000 577.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 275.900000 589.536000 279.728000 577.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 279.704000 589.536000 287.432000 577.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 287.504000 589.536000 291.332000 577.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 291.308000 589.536000 295.112000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 295.508000 589.536000 299.312000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 299.708000 589.536000 310.172000 577.536000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 310.208000 589.536000 317.432000 577.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 317.408000 589.536000 327.668000 577.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 327.704000 589.536000 334.796000 577.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 334.808000 589.536000 341.576000 577.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 341.504000 589.536000 348.596000 577.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 348.608000 589.536000 354.344000 577.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 353.108000 589.536000 356.912000 577.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 357.212000 589.536000 361.016000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 361.412000 589.536000 365.240000 577.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 365.216000 589.536000 370.028000 577.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 370.520000 589.536000 374.324000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 374.720000 589.536000 382.400000 577.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 382.424000 589.536000 389.648000 577.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 389.624000 589.536000 396.716000 577.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 396.728000 589.536000 402.884000 577.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 402.932000 589.536000 410.660000 577.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 410.636000 589.536000 413.924000 577.536000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 413.936000 589.536000 418.748000 577.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 419.036000 589.536000 422.840000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 423.236000 589.536000 434.612000 577.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 434.636000 589.536000 441.788000 577.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 441.740000 589.536000 446.552000 577.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 446.636000 589.536000 451.448000 577.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 451.436000 589.536000 458.528000 577.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 458.540000 589.536000 464.276000 577.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 464.636000 589.536000 468.440000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 468.932000 589.536000 473.744000 577.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 473.732000 589.536000 480.956000 577.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 481.232000 589.536000 485.036000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 485.432000 589.536000 496.808000 577.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 496.832000 589.536000 503.924000 577.536000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 589.536000 507.904000 577.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 575.636000 195.760000 563.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 195.796000 575.636000 203.524000 563.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 203.500000 575.636000 210.592000 563.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 210.604000 575.636000 215.416000 563.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 215.404000 575.636000 223.132000 563.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 223.108000 575.636000 230.200000 563.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 230.212000 575.636000 235.948000 563.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 235.912000 575.636000 239.716000 563.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 239.716000 575.636000 243.544000 563.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 243.520000 575.636000 248.332000 563.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 248.320000 575.636000 251.608000 563.636000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 251.620000 575.636000 257.776000 563.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 257.824000 575.636000 261.628000 563.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 261.628000 575.636000 267.784000 563.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 267.832000 575.636000 275.560000 563.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 275.536000 575.636000 282.688000 563.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 282.736000 575.636000 289.996000 563.636000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 290.032000 575.636000 297.124000 563.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 297.136000 575.636000 304.864000 563.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 304.840000 575.636000 308.644000 563.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 308.644000 575.636000 315.868000 563.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 315.844000 575.636000 321.580000 563.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 321.544000 575.636000 325.348000 563.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 325.348000 575.636000 331.504000 563.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 331.552000 575.636000 336.364000 563.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 336.352000 575.636000 340.180000 563.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 340.156000 575.636000 345.892000 563.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 345.856000 575.636000 351.592000 563.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 351.556000 575.636000 358.648000 563.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 358.660000 575.636000 366.340000 563.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 366.364000 575.636000 370.168000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.168000 575.636000 373.972000 563.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 555.736000 193.492000 543.736000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 193.504000 555.736000 201.232000 543.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 201.208000 555.736000 208.300000 543.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 208.312000 555.736000 212.116000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 212.212000 555.736000 218.368000 543.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 218.416000 555.736000 226.144000 543.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 226.120000 555.736000 233.344000 543.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 233.416000 555.736000 243.676000 543.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 243.712000 555.736000 251.392000 543.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 251.416000 555.736000 255.244000 543.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 255.220000 555.736000 262.312000 543.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 262.324000 555.736000 269.044000 543.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 269.020000 555.736000 276.112000 543.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 276.220000 555.736000 280.024000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 280.120000 555.736000 283.948000 543.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 283.924000 555.736000 291.652000 543.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 291.724000 555.736000 295.528000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 295.720000 555.736000 307.096000 543.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 306.916000 555.736000 313.684000 543.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 313.816000 555.736000 317.620000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 317.716000 555.736000 329.092000 543.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 329.116000 555.736000 332.944000 543.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 333.016000 555.736000 340.744000 543.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 340.720000 555.736000 344.548000 543.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 344.620000 555.736000 352.300000 543.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 352.216000 555.736000 359.368000 543.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 359.416000 555.736000 365.152000 543.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 365.116000 555.736000 368.920000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 369.016000 555.736000 372.844000 543.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 372.820000 555.736000 378.976000 543.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 379.120000 555.736000 382.924000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 383.020000 555.736000 390.172000 543.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 390.316000 555.736000 394.120000 543.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 394.300000 555.736000 400.456000 543.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 400.504000 555.736000 407.728000 543.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 407.704000 555.736000 415.384000 543.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 415.408000 555.736000 422.560000 543.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 422.512000 555.736000 426.316000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 426.508000 555.736000 432.664000 543.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 432.604000 555.736000 436.432000 543.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 436.504000 555.736000 444.184000 543.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 444.100000 555.736000 451.828000 543.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 451.804000 555.736000 459.028000 543.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 459.100000 555.736000 466.828000 543.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 466.804000 555.736000 470.608000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 470.800000 555.736000 482.176000 543.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 482.200000 555.736000 489.352000 543.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 489.304000 555.736000 496.984000 543.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 497.008000 555.736000 504.100000 543.736000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 555.736000 507.904000 543.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 541.836000 192.724000 529.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 192.700000 541.836000 197.140000 529.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 199.600000 541.836000 203.404000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 205.804000 541.836000 210.616000 529.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 210.604000 541.836000 218.332000 529.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 218.404000 541.836000 224.140000 529.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 224.104000 541.836000 231.784000 529.836000 1.000000 0.000000 0.000000 1.000000 q
+drawChar 231.808000 541.836000 239.536000 529.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 239.512000 541.836000 246.736000 529.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 246.712000 541.836000 250.540000 529.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 250.612000 541.836000 256.768000 529.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 256.708000 541.836000 263.800000 529.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 263.812000 541.836000 267.856000 529.836000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 267.916000 541.836000 274.636000 529.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 274.612000 541.836000 281.836000 529.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 281.812000 541.836000 285.640000 529.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 285.712000 541.836000 292.936000 529.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 292.912000 541.836000 298.648000 529.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 298.612000 541.836000 305.704000 529.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 305.716000 541.836000 313.396000 529.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 315.820000 541.836000 319.624000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 322.120000 541.836000 329.800000 529.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 329.824000 541.836000 333.652000 529.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 333.628000 541.836000 340.780000 529.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 340.828000 541.836000 346.984000 529.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 346.924000 541.836000 353.080000 529.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 353.128000 541.836000 356.932000 529.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 359.332000 541.836000 363.136000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 365.536000 541.836000 375.796000 529.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 375.832000 541.836000 383.560000 529.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 383.536000 541.836000 387.364000 529.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 387.340000 541.836000 394.060000 529.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 394.144000 541.836000 401.872000 529.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 404.248000 541.836000 408.052000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 410.548000 541.836000 415.288000 529.836000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 417.748000 541.836000 421.552000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 423.952000 541.836000 430.672000 529.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 430.648000 541.836000 437.800000 529.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 437.848000 541.836000 449.224000 529.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 449.248000 541.836000 456.340000 529.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 458.644000 541.836000 462.448000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 464.944000 541.836000 472.096000 529.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 472.144000 541.836000 478.864000 529.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 478.840000 541.836000 484.576000 529.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 484.636000 541.836000 491.860000 529.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 491.836000 541.836000 497.992000 529.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 497.932000 541.836000 504.088000 529.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 541.836000 507.904000 529.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 527.936000 192.268000 515.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 192.304000 527.936000 199.396000 515.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 199.408000 527.936000 206.560000 515.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 206.512000 527.936000 212.248000 515.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 212.308000 527.936000 218.464000 515.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 218.812000 527.936000 222.616000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 223.108000 527.936000 230.260000 515.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 230.308000 527.936000 237.988000 515.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 237.904000 527.936000 245.128000 515.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 245.704000 527.936000 249.508000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 250.000000 527.936000 257.152000 515.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 257.200000 527.936000 262.012000 515.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 262.396000 527.936000 266.200000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.692000 527.936000 273.844000 515.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 274.396000 527.936000 278.200000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.196000 527.936000 287.188000 515.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 286.696000 527.936000 293.788000 515.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 293.800000 527.936000 300.952000 515.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 301.300000 527.936000 305.104000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 305.704000 527.936000 317.080000 515.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 317.008000 527.936000 324.160000 515.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 324.208000 527.936000 329.944000 515.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 329.908000 527.936000 337.168000 515.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 337.204000 527.936000 344.296000 515.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 344.308000 527.936000 349.120000 515.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.612000 527.936000 353.416000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 353.908000 527.936000 357.736000 515.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 357.712000 527.936000 365.440000 515.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 365.908000 527.936000 369.712000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.204000 527.936000 380.704000 515.936000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 380.704000 527.936000 387.796000 515.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 387.808000 527.936000 398.068000 515.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 398.608000 527.936000 402.412000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 402.904000 527.936000 410.824000 515.936000 1.000000 0.000000 0.000000 1.000000 Y
+drawChar 409.804000 527.936000 417.028000 515.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 417.004000 527.936000 422.740000 515.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 422.704000 527.936000 429.964000 515.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 430.000000 527.936000 433.804000 515.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.200000 527.936000 438.004000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.496000 527.936000 443.236000 515.936000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 443.200000 527.936000 448.012000 515.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 448.096000 527.936000 451.384000 515.936000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 451.396000 527.936000 457.552000 515.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 458.092000 527.936000 461.896000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 462.388000 527.936000 469.540000 515.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 469.888000 527.936000 473.692000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.184000 527.936000 484.444000 515.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 484.480000 527.936000 491.704000 515.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 491.680000 527.936000 499.408000 515.936000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 527.936000 504.044000 515.936000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 514.036000 193.180000 502.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 193.204000 514.036000 200.296000 502.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 200.308000 514.036000 206.044000 502.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 206.008000 514.036000 210.448000 502.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 210.412000 514.036000 218.140000 502.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 218.116000 514.036000 221.944000 502.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 221.920000 514.036000 225.724000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 225.820000 514.036000 233.500000 502.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 233.524000 514.036000 237.352000 502.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 237.328000 514.036000 244.480000 502.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 244.528000 514.036000 251.248000 502.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 251.224000 514.036000 258.316000 502.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 258.328000 514.036000 262.132000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.228000 514.036000 267.040000 502.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 267.028000 514.036000 274.252000 502.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 274.228000 514.036000 278.032000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 278.128000 514.036000 286.120000 502.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 286.132000 514.036000 293.860000 502.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 293.836000 514.036000 301.516000 502.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 301.540000 514.036000 305.344000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 305.440000 514.036000 310.252000 502.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 310.240000 514.036000 315.976000 502.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 315.940000 514.036000 323.032000 502.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 323.044000 514.036000 330.196000 502.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 330.244000 514.036000 336.400000 502.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 336.448000 514.036000 344.176000 502.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 344.152000 514.036000 349.888000 502.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 349.852000 514.036000 356.944000 502.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 356.956000 514.036000 363.112000 502.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 363.160000 514.036000 366.964000 502.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 366.964000 514.036000 370.768000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.864000 514.036000 378.016000 502.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 378.064000 514.036000 385.792000 502.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 385.768000 514.036000 393.448000 502.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 393.472000 514.036000 397.276000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 397.372000 514.036000 402.184000 502.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 402.172000 514.036000 409.324000 502.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 409.372000 514.036000 416.632000 502.036000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 416.668000 514.036000 423.760000 502.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 423.772000 514.036000 429.928000 502.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 429.976000 514.036000 433.780000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 433.876000 514.036000 441.556000 502.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 441.580000 514.036000 445.408000 502.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.384000 514.036000 452.536000 502.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 452.584000 514.036000 459.304000 502.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 459.280000 514.036000 466.372000 502.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.384000 514.036000 470.188000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 470.284000 514.036000 477.376000 502.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 477.388000 514.036000 484.156000 502.036000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 484.192000 514.036000 491.284000 502.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 491.296000 514.036000 497.032000 502.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 496.996000 514.036000 503.764000 502.036000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 514.036000 507.904000 502.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 500.136000 193.720000 488.136000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 193.696000 500.136000 201.424000 488.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 201.400000 500.136000 209.128000 488.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 209.200000 500.136000 216.880000 488.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 216.904000 500.136000 224.056000 488.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 224.008000 500.136000 230.776000 488.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 233.008000 500.136000 236.812000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 239.008000 500.136000 246.160000 488.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 246.208000 500.136000 251.020000 488.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 253.204000 500.136000 257.008000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 259.300000 500.136000 264.112000 488.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 264.100000 500.136000 271.828000 488.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 271.900000 500.136000 278.992000 488.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 281.200000 500.136000 285.004000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 287.200000 500.136000 293.920000 488.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 293.896000 500.136000 301.120000 488.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 301.096000 500.136000 306.832000 488.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 306.796000 500.136000 314.524000 488.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 314.500000 500.136000 321.592000 488.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 321.604000 500.136000 327.340000 488.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 329.608000 500.136000 333.412000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 335.704000 500.136000 342.928000 488.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 343.000000 500.136000 347.440000 488.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 349.600000 500.136000 353.404000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 357.796000 500.136000 361.600000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 363.892000 500.136000 371.524000 488.136000 1.000000 0.000000 0.000000 1.000000 6
+drawChar 371.488000 500.136000 376.300000 488.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 376.384000 500.136000 384.112000 488.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 386.284000 500.136000 390.088000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 392.284000 500.136000 400.948000 488.136000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 400.480000 500.136000 407.248000 488.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 407.284000 500.136000 414.376000 488.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 414.388000 500.136000 422.116000 488.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 422.092000 500.136000 429.820000 488.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 429.796000 500.136000 436.888000 488.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 439.096000 500.136000 442.900000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 445.300000 500.136000 452.452000 488.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 452.500000 500.136000 460.228000 488.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 460.096000 500.136000 467.776000 488.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 469.996000 500.136000 473.800000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 475.996000 500.136000 483.628000 488.136000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 483.592000 500.136000 491.224000 488.136000 1.000000 0.000000 0.000000 1.000000 6
+drawChar 491.296000 500.136000 496.108000 488.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 496.096000 500.136000 503.824000 488.136000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 500.136000 507.904000 488.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 486.236000 193.720000 474.236000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 193.696000 486.236000 198.508000 474.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 198.496000 486.236000 204.232000 474.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 204.196000 486.236000 211.288000 474.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 211.300000 486.236000 218.392000 474.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 218.404000 486.236000 223.216000 474.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 223.204000 486.236000 227.008000 474.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1400.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 454.492000 82.936000 440.492000 1.000000 0.000000 0.000000 1.000000 K
+drawChar 82.894000 454.492000 87.682000 440.492000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 87.696000 454.492000 94.388000 440.492000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 94.402000 454.492000 102.690000 440.492000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 102.704000 454.492000 112.658000 440.492000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 112.700000 454.492000 122.192000 440.492000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 122.206000 454.492000 132.160000 440.492000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 432.236000 197.776000 420.236000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 197.800000 432.236000 204.568000 420.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 205.600000 432.236000 209.404000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 210.400000 432.236000 217.660000 420.236000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 217.696000 432.236000 221.524000 420.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 221.500000 432.236000 226.312000 420.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.300000 432.236000 233.020000 420.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 233.104000 432.236000 240.832000 420.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 240.808000 432.236000 247.900000 420.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 247.912000 432.236000 255.640000 420.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 256.612000 432.236000 260.416000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 261.412000 432.236000 269.140000 420.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 269.116000 432.236000 276.268000 420.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 276.316000 432.236000 282.472000 420.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 283.420000 432.236000 287.224000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.316000 432.236000 295.468000 420.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 295.516000 432.236000 299.344000 420.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 299.320000 432.236000 303.148000 420.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 304.120000 432.236000 307.924000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 308.920000 432.236000 316.144000 420.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 316.120000 432.236000 320.560000 420.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 321.616000 432.236000 325.420000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 326.416000 432.236000 331.228000 420.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 331.216000 432.236000 338.944000 420.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 339.016000 432.236000 346.108000 420.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 347.020000 432.236000 350.824000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 351.916000 432.236000 358.636000 420.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 358.612000 432.236000 365.836000 420.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 365.812000 432.236000 373.540000 420.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 373.612000 432.236000 380.380000 420.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 380.416000 432.236000 387.508000 420.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 387.520000 432.236000 395.248000 420.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 395.116000 432.236000 398.944000 420.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 398.920000 432.236000 406.012000 420.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 406.024000 432.236000 413.752000 420.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 413.824000 432.236000 420.544000 420.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 420.520000 432.236000 427.612000 420.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 427.624000 432.236000 433.780000 420.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 434.824000 432.236000 438.628000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 439.624000 432.236000 446.848000 420.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 446.824000 432.236000 451.264000 420.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 452.320000 432.236000 456.124000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 457.120000 432.236000 468.496000 420.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 468.520000 432.236000 475.744000 420.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 475.720000 432.236000 483.400000 420.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 483.424000 432.236000 490.516000 420.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 490.528000 432.236000 496.264000 420.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 496.228000 432.236000 503.956000 420.236000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 432.236000 507.904000 420.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 418.336000 190.312000 406.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 418.336000 197.392000 406.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 197.404000 418.336000 204.124000 406.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 204.100000 418.336000 211.828000 406.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 211.900000 418.336000 219.628000 406.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 219.604000 418.336000 226.828000 406.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 226.804000 418.336000 230.632000 406.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 230.704000 418.336000 237.928000 406.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 237.904000 418.336000 245.584000 406.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 245.608000 418.336000 252.376000 406.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 250.804000 418.336000 254.608000 406.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.500000 418.336000 261.304000 406.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 264.196000 418.336000 276.472000 406.336000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 276.496000 418.336000 283.264000 406.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 286.192000 418.336000 289.996000 406.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 292.996000 418.336000 304.372000 406.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 304.300000 418.336000 311.524000 406.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 311.596000 418.336000 317.752000 406.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 317.800000 418.336000 322.612000 406.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 322.504000 418.336000 326.548000 406.336000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 326.608000 418.336000 333.328000 406.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 333.304000 418.336000 341.032000 406.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 341.104000 418.336000 348.196000 406.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 348.208000 418.336000 353.944000 406.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 353.908000 418.336000 357.736000 406.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 357.712000 418.336000 363.868000 406.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 363.916000 418.336000 371.644000 406.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 371.620000 418.336000 378.712000 406.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 378.724000 418.336000 386.404000 406.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 389.320000 418.336000 393.124000 406.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 396.016000 418.336000 403.168000 406.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 403.216000 418.336000 410.896000 406.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 410.812000 418.336000 418.492000 406.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 418.516000 418.336000 422.344000 406.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 422.416000 418.336000 426.244000 406.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 426.220000 418.336000 433.372000 406.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 433.324000 418.336000 441.052000 406.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 441.124000 418.336000 447.844000 406.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 447.820000 418.336000 454.912000 406.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 457.816000 418.336000 461.620000 406.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 464.620000 418.336000 468.448000 406.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 468.424000 418.336000 474.580000 406.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 477.520000 418.336000 481.324000 406.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.216000 418.336000 489.028000 406.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.112000 418.336000 496.840000 406.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.816000 418.336000 503.908000 406.336000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 418.336000 508.004000 406.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 404.436000 193.180000 392.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 193.204000 404.436000 197.032000 392.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 197.008000 404.436000 203.164000 392.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 203.212000 404.436000 210.940000 392.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 210.916000 404.436000 221.176000 392.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 221.212000 404.436000 228.364000 392.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.316000 404.436000 234.472000 392.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 234.520000 404.436000 242.248000 392.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 242.224000 404.436000 249.316000 392.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 249.328000 404.436000 255.064000 392.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 253.732000 404.436000 257.536000 392.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.728000 404.436000 261.532000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 261.628000 404.436000 266.368000 392.436000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 266.332000 404.436000 270.136000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 270.436000 404.436000 276.592000 392.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 276.640000 404.436000 281.452000 392.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 281.440000 404.436000 285.268000 392.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 285.244000 404.436000 289.072000 392.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 289.144000 404.436000 292.972000 392.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 293.044000 404.436000 296.848000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 296.944000 404.436000 302.680000 392.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 302.644000 404.436000 309.736000 392.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 309.748000 404.436000 321.124000 392.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 321.148000 404.436000 328.240000 392.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 328.252000 404.436000 339.628000 392.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 339.652000 404.436000 347.332000 392.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 347.356000 404.436000 354.448000 392.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 354.460000 404.436000 360.196000 392.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 360.256000 404.436000 364.060000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 364.360000 404.436000 374.620000 392.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 374.560000 404.436000 378.388000 392.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 378.460000 404.436000 383.272000 392.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 383.260000 404.436000 390.988000 392.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 391.060000 404.436000 394.864000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 394.960000 404.436000 402.688000 392.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 402.664000 404.436000 409.888000 392.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 409.960000 404.436000 415.696000 392.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 415.660000 404.436000 421.396000 392.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 421.360000 404.436000 428.584000 392.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 428.656000 404.436000 434.392000 392.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 434.452000 404.436000 438.256000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.556000 404.436000 449.932000 392.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 449.860000 404.436000 456.628000 392.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 456.760000 404.436000 460.564000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 460.660000 404.436000 467.380000 392.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 467.356000 404.436000 474.580000 392.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 474.556000 404.436000 478.384000 392.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 478.456000 404.436000 482.284000 392.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 482.260000 404.436000 489.352000 392.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 489.364000 404.436000 497.044000 392.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 497.068000 404.436000 504.160000 392.436000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 404.436000 508.004000 392.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 390.536000 193.180000 378.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 193.204000 390.536000 200.356000 378.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 200.308000 390.536000 207.076000 378.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 207.112000 390.536000 213.268000 378.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 213.508000 390.536000 217.312000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 217.612000 390.536000 224.764000 378.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 224.812000 390.536000 232.540000 378.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 232.516000 390.536000 240.196000 378.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 240.520000 390.536000 244.324000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 244.624000 390.536000 249.436000 378.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 249.424000 390.536000 257.152000 378.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 257.224000 390.536000 264.316000 378.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 264.424000 390.536000 268.228000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 268.528000 390.536000 279.904000 378.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 279.928000 390.536000 287.152000 378.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 287.128000 390.536000 294.856000 378.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 294.832000 390.536000 302.560000 378.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 302.632000 390.536000 307.444000 378.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 307.432000 390.536000 314.584000 378.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.536000 390.536000 318.364000 378.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 318.436000 390.536000 326.164000 378.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 326.440000 390.536000 330.244000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 330.640000 390.536000 337.864000 378.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 337.840000 390.536000 342.280000 378.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 342.436000 390.536000 346.240000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 346.540000 390.536000 354.220000 378.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 354.244000 390.536000 358.072000 378.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 358.144000 390.536000 363.880000 378.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 363.844000 390.536000 368.656000 378.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 368.740000 390.536000 375.508000 378.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 375.736000 390.536000 379.540000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 379.840000 390.536000 387.520000 378.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 387.544000 390.536000 391.372000 378.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 391.348000 390.536000 397.504000 378.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 397.552000 390.536000 405.280000 378.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 405.256000 390.536000 412.348000 378.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 412.360000 390.536000 418.516000 378.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 418.756000 390.536000 422.560000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 422.860000 390.536000 427.672000 378.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 427.660000 390.536000 434.884000 378.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 435.160000 390.536000 438.964000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 439.264000 390.536000 449.524000 378.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 449.560000 390.536000 456.712000 378.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 456.664000 390.536000 462.820000 378.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 462.868000 390.536000 470.596000 378.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 470.872000 390.536000 474.676000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.976000 390.536000 482.128000 378.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 482.176000 390.536000 486.616000 378.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 486.580000 390.536000 491.392000 378.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 491.380000 390.536000 498.472000 378.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 498.484000 390.536000 504.220000 378.536000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 390.536000 508.004000 378.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 376.636000 193.180000 364.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 193.204000 376.636000 200.356000 364.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 200.308000 376.636000 206.044000 364.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 206.104000 376.636000 210.916000 364.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 210.904000 376.636000 214.732000 364.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 214.708000 376.636000 221.800000 364.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 221.812000 376.636000 227.968000 364.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 228.016000 376.636000 231.820000 364.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.916000 376.636000 235.720000 364.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 235.816000 376.636000 246.316000 364.636000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 246.316000 376.636000 253.540000 364.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 253.516000 376.636000 263.776000 364.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 263.812000 376.636000 270.964000 364.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 271.012000 376.636000 278.692000 364.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 278.608000 376.636000 285.760000 364.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 285.808000 376.636000 292.576000 364.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 292.612000 376.636000 298.768000 364.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 298.816000 376.636000 302.620000 364.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 302.920000 376.636000 307.732000 364.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 307.720000 376.636000 315.448000 364.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 315.424000 376.636000 322.516000 364.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 322.624000 376.636000 326.428000 364.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 326.524000 376.636000 337.900000 364.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 337.924000 376.636000 345.076000 364.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 345.028000 376.636000 348.856000 364.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 348.928000 376.636000 356.656000 364.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 356.728000 376.636000 360.532000 364.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 360.832000 376.636000 368.560000 364.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 368.536000 376.636000 374.692000 364.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 374.740000 376.636000 381.832000 364.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 381.844000 376.636000 385.648000 364.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 385.744000 376.636000 390.184000 364.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 390.148000 376.636000 397.372000 364.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 397.444000 376.636000 403.180000 364.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 403.240000 376.636000 407.044000 364.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 407.344000 376.636000 418.720000 364.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 418.648000 376.636000 425.416000 364.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 425.452000 376.636000 429.256000 364.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.448000 376.636000 436.708000 364.636000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 436.744000 376.636000 440.572000 364.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 440.548000 376.636000 445.360000 364.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.348000 376.636000 452.068000 364.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 452.152000 376.636000 459.880000 364.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 459.856000 376.636000 466.948000 364.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.960000 376.636000 474.688000 364.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 474.760000 376.636000 478.564000 364.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 478.864000 376.636000 485.020000 364.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 484.960000 376.636000 488.788000 364.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 488.860000 376.636000 496.588000 364.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 496.564000 376.636000 503.824000 364.636000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 376.636000 507.904000 364.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 362.736000 189.328000 350.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 189.304000 362.736000 195.460000 350.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 195.508000 362.736000 199.312000 350.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 199.312000 362.736000 204.124000 350.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 204.112000 362.736000 211.840000 350.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 211.816000 362.736000 218.908000 350.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 218.920000 362.736000 222.724000 350.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 222.724000 362.736000 230.404000 350.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 230.428000 362.736000 238.156000 350.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 238.132000 362.736000 241.960000 350.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 241.936000 362.736000 245.764000 350.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 245.740000 362.736000 250.552000 350.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 250.540000 362.736000 254.584000 350.736000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 254.644000 362.736000 258.472000 350.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 258.448000 362.736000 266.176000 350.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 266.152000 362.736000 269.956000 350.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 270.100000 362.736000 277.780000 350.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 277.804000 362.736000 284.956000 350.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 285.004000 362.736000 290.740000 350.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 290.704000 362.736000 298.384000 350.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 298.408000 362.736000 305.560000 350.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 305.608000 362.736000 313.288000 350.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 313.312000 362.736000 320.404000 350.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 320.416000 362.736000 324.220000 350.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 324.220000 362.736000 331.900000 350.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 331.924000 362.736000 335.752000 350.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 335.728000 362.736000 341.884000 350.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 341.932000 362.736000 349.612000 350.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 349.636000 362.736000 356.860000 350.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 356.836000 362.736000 362.992000 350.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 363.040000 362.736000 370.192000 350.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 370.240000 362.736000 374.068000 350.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 374.044000 362.736000 377.848000 350.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.848000 362.736000 381.652000 350.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 342.836000 190.240000 330.836000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 190.204000 342.836000 197.932000 330.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 199.108000 342.836000 202.912000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 204.112000 342.836000 208.924000 330.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 208.912000 342.836000 216.640000 330.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 216.712000 342.836000 223.804000 330.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 224.908000 342.836000 228.712000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 230.008000 342.836000 241.384000 330.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 241.312000 342.836000 245.140000 330.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 245.116000 342.836000 252.796000 330.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 252.820000 342.836000 260.500000 330.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 260.524000 342.836000 264.352000 330.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 264.328000 342.836000 271.420000 330.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 272.632000 342.836000 276.436000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.636000 342.836000 284.860000 330.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 284.836000 342.836000 289.276000 330.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 290.536000 342.836000 294.340000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 295.540000 342.836000 300.352000 330.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 300.340000 342.836000 308.068000 330.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 308.140000 342.836000 315.232000 330.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 316.240000 342.836000 320.044000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 321.244000 342.836000 328.504000 330.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 328.540000 342.836000 332.368000 330.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 332.344000 342.836000 337.156000 330.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 337.144000 342.836000 343.864000 330.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 343.948000 342.836000 351.676000 330.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 351.652000 342.836000 358.744000 330.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 358.756000 342.836000 366.484000 330.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 367.660000 342.836000 371.464000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.760000 342.836000 376.588000 330.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 376.564000 342.836000 382.720000 330.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 383.860000 342.836000 387.664000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 388.864000 342.836000 396.016000 330.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 397.168000 342.836000 400.972000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 402.172000 342.836000 413.548000 330.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 413.572000 342.836000 420.724000 330.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 420.676000 342.836000 426.832000 330.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 426.880000 342.836000 433.036000 330.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 432.976000 342.836000 436.804000 330.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 436.876000 342.836000 443.644000 330.836000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 443.680000 342.836000 450.772000 330.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 451.876000 342.836000 455.680000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 456.880000 342.836000 467.140000 330.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 467.176000 342.836000 474.400000 330.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 474.376000 342.836000 481.600000 330.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 481.576000 342.836000 489.256000 330.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 489.280000 342.836000 496.372000 330.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 496.384000 342.836000 504.112000 330.836000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 342.836000 508.004000 330.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 328.936000 190.312000 316.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 328.936000 197.452000 316.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 197.500000 328.936000 205.180000 316.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 205.204000 328.936000 209.032000 316.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 209.008000 328.936000 216.100000 316.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 216.904000 328.936000 220.708000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 221.500000 328.936000 231.760000 316.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 231.796000 328.936000 239.524000 316.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 239.500000 328.936000 243.328000 316.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 243.304000 328.936000 250.024000 316.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 250.108000 328.936000 257.836000 316.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 258.604000 328.936000 262.408000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 263.200000 328.936000 269.356000 316.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 269.404000 328.936000 276.496000 316.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 276.508000 328.936000 282.244000 316.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 282.208000 328.936000 288.976000 316.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 289.012000 328.936000 296.104000 316.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 296.116000 328.936000 302.272000 316.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 303.016000 328.936000 306.820000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 307.720000 328.936000 314.872000 316.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.920000 328.936000 321.076000 316.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 321.820000 328.936000 325.624000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 326.416000 328.936000 333.568000 316.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 334.312000 328.936000 338.116000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 339.016000 328.936000 345.736000 316.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 345.712000 328.936000 353.440000 316.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 353.416000 328.936000 358.228000 316.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 358.312000 328.936000 363.124000 316.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 363.112000 328.936000 366.940000 316.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 366.916000 328.936000 374.644000 316.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 374.716000 328.936000 382.396000 316.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 383.116000 328.936000 386.920000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 387.712000 328.936000 395.392000 316.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 395.416000 328.936000 399.244000 316.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 399.220000 328.936000 406.444000 316.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 406.420000 328.936000 413.140000 316.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 413.224000 328.936000 420.484000 316.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 420.424000 328.936000 424.228000 316.936000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 425.128000 328.936000 428.932000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.724000 328.936000 439.984000 316.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 440.020000 328.936000 443.848000 316.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 443.824000 328.936000 448.636000 316.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 448.624000 328.936000 456.352000 316.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 457.120000 328.936000 460.924000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 461.824000 328.936000 468.544000 316.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 468.520000 328.936000 475.744000 316.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 475.720000 328.936000 483.400000 316.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 483.424000 328.936000 491.104000 316.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 491.128000 328.936000 498.220000 316.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 498.232000 328.936000 503.968000 316.936000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 328.936000 507.904000 316.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 315.036000 193.180000 303.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 193.204000 315.036000 200.428000 303.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 200.404000 315.036000 205.216000 303.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 205.204000 315.036000 211.360000 303.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 211.504000 315.036000 215.308000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 215.500000 315.036000 222.652000 303.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 222.700000 315.036000 230.428000 303.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 230.404000 315.036000 238.084000 303.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 238.204000 315.036000 242.008000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 242.200000 315.036000 249.880000 303.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 249.904000 315.036000 257.056000 303.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 257.008000 315.036000 264.736000 303.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 264.808000 315.036000 270.964000 303.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 271.012000 315.036000 274.816000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 275.008000 315.036000 282.736000 303.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 282.712000 315.036000 289.864000 303.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 289.912000 315.036000 297.640000 303.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 297.616000 315.036000 305.296000 303.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 305.320000 315.036000 309.148000 303.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 309.124000 315.036000 316.852000 303.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 316.924000 315.036000 324.604000 303.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 324.724000 315.036000 328.528000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 328.720000 315.036000 335.872000 303.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 335.920000 315.036000 343.600000 303.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 343.516000 315.036000 350.740000 303.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 350.812000 315.036000 357.580000 303.036000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 357.508000 315.036000 364.600000 303.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 364.612000 315.036000 368.416000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 368.812000 315.036000 379.072000 303.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.012000 315.036000 382.840000 303.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 382.912000 315.036000 387.724000 303.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 387.712000 315.036000 395.440000 303.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 395.416000 315.036000 399.244000 303.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 399.316000 315.036000 407.044000 303.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 407.116000 315.036000 410.920000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 411.112000 315.036000 418.204000 303.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 418.216000 315.036000 425.368000 303.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 425.416000 315.036000 431.572000 303.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 431.512000 315.036000 438.280000 303.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 438.412000 315.036000 442.216000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 442.408000 315.036000 448.144000 303.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 448.108000 315.036000 455.200000 303.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 455.212000 315.036000 462.364000 303.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 462.412000 315.036000 469.132000 303.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 469.108000 315.036000 476.836000 303.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 476.812000 315.036000 480.616000 303.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.712000 315.036000 484.516000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.816000 315.036000 489.556000 303.036000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 489.520000 315.036000 494.332000 303.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 494.320000 315.036000 497.608000 303.036000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 497.620000 315.036000 503.776000 303.036000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 315.036000 507.904000 303.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 301.136000 192.268000 289.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 192.304000 301.136000 199.396000 289.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 199.408000 301.136000 205.144000 289.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 205.108000 301.136000 211.876000 289.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 212.008000 301.136000 215.812000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 215.908000 301.136000 222.628000 289.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 222.604000 301.136000 229.828000 289.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 229.804000 301.136000 237.532000 289.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 237.604000 301.136000 244.372000 289.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 244.408000 301.136000 251.500000 289.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 251.512000 301.136000 259.240000 289.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 259.216000 301.136000 263.044000 289.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 263.020000 301.136000 270.112000 289.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 270.124000 301.136000 277.852000 289.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 277.924000 301.136000 282.736000 289.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 282.820000 301.136000 286.624000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 286.924000 301.136000 294.076000 289.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 294.028000 301.136000 301.756000 289.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 301.732000 301.136000 309.412000 289.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 309.436000 301.136000 313.240000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 313.432000 301.136000 319.588000 289.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 319.636000 301.136000 327.316000 289.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 327.232000 301.136000 334.384000 289.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 334.432000 301.136000 341.152000 289.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.128000 301.136000 344.956000 289.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 345.028000 301.136000 352.252000 289.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 352.228000 301.136000 359.956000 289.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 359.932000 301.136000 366.088000 289.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 366.136000 301.136000 369.940000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.132000 301.136000 377.224000 289.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 377.236000 301.136000 384.964000 289.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 385.036000 301.136000 392.260000 289.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 392.236000 301.136000 399.964000 289.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 399.940000 301.136000 407.620000 289.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 407.644000 301.136000 415.372000 289.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 415.444000 301.136000 419.248000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 419.548000 301.136000 423.988000 289.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 423.844000 301.136000 431.068000 289.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 431.044000 301.136000 436.780000 289.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 436.948000 301.136000 440.752000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 441.052000 301.136000 452.428000 289.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 452.356000 301.136000 459.580000 289.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 459.652000 301.136000 465.388000 289.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.256000 301.136000 472.348000 289.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 472.456000 301.136000 476.260000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 476.356000 301.136000 481.168000 289.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 481.252000 301.136000 488.980000 289.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 488.956000 301.136000 496.108000 289.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 496.060000 301.136000 503.788000 289.136000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 301.136000 507.904000 289.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 287.236000 192.724000 275.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 192.700000 287.236000 200.428000 275.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 200.500000 287.236000 207.592000 275.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 207.796000 287.236000 211.600000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 211.900000 287.236000 218.620000 275.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 218.596000 287.236000 226.324000 275.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 226.300000 287.236000 233.392000 275.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 233.500000 287.236000 237.940000 275.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 238.204000 287.236000 242.008000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 242.308000 287.236000 247.120000 275.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 247.108000 287.236000 254.332000 275.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 254.512000 287.236000 258.316000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 258.616000 287.236000 268.876000 275.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 268.912000 287.236000 276.136000 275.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 276.112000 287.236000 281.848000 275.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 281.812000 287.236000 289.072000 275.236000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 289.408000 287.236000 293.212000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 293.608000 287.236000 300.760000 275.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 300.808000 287.236000 305.620000 275.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 305.704000 287.236000 309.508000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 309.808000 287.236000 314.620000 275.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 314.704000 287.236000 322.432000 275.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 322.408000 287.236000 329.500000 275.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 329.812000 287.236000 333.616000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 333.916000 287.236000 340.072000 275.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 340.120000 287.236000 347.272000 275.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 347.224000 287.236000 358.600000 275.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 358.624000 287.236000 365.716000 275.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 365.920000 287.236000 369.724000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.024000 287.236000 374.836000 275.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 374.824000 287.236000 378.652000 275.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 378.724000 287.236000 390.100000 275.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 390.028000 287.236000 397.120000 275.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 397.132000 287.236000 400.936000 275.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.332000 287.236000 405.136000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 405.436000 287.236000 413.428000 275.236000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 413.440000 287.236000 421.168000 275.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 421.144000 287.236000 428.236000 275.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 428.248000 287.236000 433.984000 275.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 434.044000 287.236000 441.136000 275.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 441.340000 287.236000 445.144000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 445.444000 287.236000 449.272000 275.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 449.248000 287.236000 455.404000 275.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 455.752000 287.236000 459.556000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 459.856000 287.236000 467.008000 275.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 467.152000 287.236000 470.956000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 471.352000 287.236000 477.508000 275.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 477.556000 287.236000 488.932000 275.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 488.860000 287.236000 496.012000 275.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 495.964000 287.236000 499.792000 275.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 499.768000 287.236000 503.596000 275.236000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 287.236000 507.904000 275.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 273.336000 190.312000 261.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 273.336000 197.452000 261.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 197.500000 273.336000 205.180000 261.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 205.204000 273.336000 209.032000 261.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 209.008000 273.336000 216.100000 261.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 217.012000 273.336000 220.816000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 221.716000 273.336000 225.544000 261.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 225.520000 273.336000 233.248000 261.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 234.220000 273.336000 238.024000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 239.020000 273.336000 243.832000 261.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 243.820000 273.336000 251.548000 261.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 251.620000 273.336000 258.712000 261.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 259.516000 273.336000 263.320000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 264.316000 273.336000 271.576000 261.336000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 271.612000 273.336000 275.440000 261.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 275.416000 273.336000 280.228000 261.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 280.216000 273.336000 286.936000 261.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 287.020000 273.336000 294.748000 261.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 294.616000 273.336000 301.708000 261.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 301.720000 273.336000 309.448000 261.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 310.420000 273.336000 314.224000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 315.220000 273.336000 322.372000 261.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 322.420000 273.336000 328.576000 261.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 329.416000 273.336000 333.220000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 334.120000 273.336000 344.380000 261.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 344.416000 273.336000 351.508000 261.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 351.520000 273.336000 355.348000 261.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 355.324000 273.336000 359.152000 261.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 359.128000 273.336000 362.932000 261.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 363.928000 273.336000 367.732000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 368.728000 273.336000 372.556000 261.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 372.532000 273.336000 380.260000 261.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 381.232000 273.336000 385.036000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 385.936000 273.336000 393.088000 261.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 393.940000 273.336000 397.744000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.740000 273.336000 404.896000 261.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 404.944000 273.336000 412.672000 261.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 412.648000 273.336000 420.376000 261.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 420.448000 273.336000 428.176000 261.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 428.152000 273.336000 434.920000 261.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 435.856000 273.336000 439.660000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 440.560000 273.336000 448.288000 261.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 448.264000 273.336000 455.488000 261.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 455.560000 273.336000 462.784000 261.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 462.760000 273.336000 470.020000 261.336000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 469.960000 273.336000 473.764000 261.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 474.664000 273.336000 478.468000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 479.560000 273.336000 487.240000 261.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 487.156000 273.336000 494.248000 261.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 494.260000 273.336000 499.996000 261.336000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.100000 273.336000 504.144000 261.336000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 259.436000 189.940000 247.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 189.904000 259.436000 196.996000 247.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 197.008000 259.436000 203.728000 247.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 203.704000 259.436000 208.516000 247.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 208.504000 259.436000 212.308000 247.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 212.308000 259.436000 216.748000 247.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 216.712000 259.436000 223.936000 247.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 223.912000 259.436000 229.648000 247.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 229.612000 259.436000 233.416000 247.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 233.416000 259.436000 241.096000 247.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 241.120000 259.436000 246.856000 247.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 246.820000 259.436000 253.912000 247.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 253.924000 259.436000 261.076000 247.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 261.124000 259.436000 268.384000 247.436000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 268.420000 259.436000 272.860000 247.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 272.824000 259.436000 279.976000 247.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 280.024000 259.436000 286.180000 247.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 286.228000 259.436000 291.040000 247.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 291.028000 259.436000 294.832000 247.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 294.832000 259.436000 299.272000 247.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 299.236000 259.436000 306.460000 247.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 306.436000 259.436000 312.172000 247.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 312.136000 259.436000 315.940000 247.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 315.940000 259.436000 320.752000 247.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 320.740000 259.436000 331.000000 247.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 331.036000 259.436000 338.260000 247.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 338.032000 259.436000 341.836000 247.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 341.836000 259.436000 345.640000 247.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 239.536000 196.000000 227.536000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 196.000000 239.536000 203.092000 227.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 203.104000 239.536000 209.860000 227.536000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 209.908000 239.536000 214.720000 227.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 216.412000 239.536000 220.216000 227.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 221.908000 239.536000 226.720000 227.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.708000 239.536000 233.932000 227.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 235.708000 239.536000 239.512000 227.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 241.312000 239.536000 246.124000 227.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 246.112000 239.536000 253.840000 227.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 253.912000 239.536000 261.004000 227.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 262.612000 239.536000 266.416000 227.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 268.108000 239.536000 275.788000 227.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 275.812000 239.536000 281.548000 227.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 281.608000 239.536000 288.700000 227.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 288.712000 239.536000 295.864000 227.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 295.912000 239.536000 303.172000 227.536000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 303.112000 239.536000 307.552000 227.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 307.612000 239.536000 314.764000 227.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.716000 239.536000 320.872000 227.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 320.812000 239.536000 325.624000 227.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 327.412000 239.536000 331.216000 227.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 333.016000 239.536000 340.744000 227.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 340.720000 239.536000 347.944000 227.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 348.016000 239.536000 355.240000 227.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 355.120000 239.536000 362.380000 227.536000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 364.120000 239.536000 367.924000 227.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 369.616000 239.536000 376.768000 227.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 376.816000 239.536000 382.552000 227.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 382.516000 239.536000 389.608000 227.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 391.312000 239.536000 395.116000 227.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 396.916000 239.536000 401.728000 227.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 401.812000 239.536000 409.540000 227.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 409.516000 239.536000 416.608000 227.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 418.312000 239.536000 422.116000 227.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 423.808000 239.536000 431.488000 227.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 431.512000 239.536000 438.736000 227.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 438.712000 239.536000 445.936000 227.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 445.912000 239.536000 451.648000 227.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 451.708000 239.536000 457.864000 227.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 459.508000 239.536000 463.312000 227.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 465.112000 239.536000 469.924000 227.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 470.008000 239.536000 477.232000 227.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 478.912000 239.536000 482.716000 227.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.408000 239.536000 489.220000 227.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.208000 239.536000 496.936000 227.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 497.008000 239.536000 504.100000 227.536000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 239.536000 508.004000 227.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 225.636000 193.180000 213.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 193.204000 225.636000 200.356000 213.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 200.308000 225.636000 208.036000 213.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 208.108000 225.636000 212.920000 213.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 212.908000 225.636000 218.644000 213.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 218.608000 225.636000 225.376000 213.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 226.108000 225.636000 229.912000 213.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 230.704000 225.636000 237.856000 213.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 237.904000 225.636000 245.632000 213.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 245.608000 225.636000 253.288000 213.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 254.104000 225.636000 257.908000 213.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 258.700000 225.636000 263.512000 213.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 263.500000 225.636000 271.228000 213.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 271.300000 225.636000 278.392000 213.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 279.004000 225.636000 282.808000 213.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 283.708000 225.636000 287.536000 213.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 287.512000 225.636000 294.664000 213.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 294.712000 225.636000 302.440000 213.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 302.416000 225.636000 310.144000 213.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 310.120000 225.636000 317.800000 213.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 317.824000 225.636000 323.560000 213.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 323.620000 225.636000 330.388000 213.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 331.120000 225.636000 334.924000 213.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 335.716000 225.636000 341.452000 213.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 341.416000 225.636000 348.640000 213.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 348.712000 225.636000 355.936000 213.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 355.912000 225.636000 367.288000 213.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 367.312000 225.636000 371.116000 213.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.812000 225.636000 375.616000 213.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 376.408000 225.636000 385.072000 213.636000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 385.912000 225.636000 389.716000 213.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 390.508000 225.636000 394.336000 213.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 394.312000 225.636000 401.464000 213.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 401.512000 225.636000 407.248000 213.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 407.212000 225.636000 414.892000 213.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 414.916000 225.636000 422.008000 213.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 422.020000 225.636000 426.064000 213.636000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 426.124000 225.636000 430.564000 213.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 430.528000 225.636000 437.680000 213.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 437.728000 225.636000 444.448000 213.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 444.424000 225.636000 451.516000 213.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 451.528000 225.636000 459.208000 213.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 460.732000 225.636000 464.536000 213.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 464.700000 225.636000 472.380000 213.636000 1.000000 0.000000 0.000000 1.000000 q
+drawChar 472.404000 225.636000 480.132000 213.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 480.108000 225.636000 487.260000 213.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 487.308000 225.636000 493.044000 213.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 493.008000 225.636000 497.820000 213.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 497.808000 225.636000 504.120000 213.636000 1.000000 0.000000 0.000000 1.000000 z
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 225.636000 507.904000 213.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 211.736000 192.220000 199.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 192.196000 211.736000 196.024000 199.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 196.096000 211.736000 203.320000 199.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 203.296000 211.736000 210.016000 199.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 209.992000 211.736000 217.252000 199.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 217.696000 211.736000 221.500000 199.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 221.992000 211.736000 229.720000 199.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 229.696000 211.736000 236.848000 199.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 236.896000 211.736000 244.624000 199.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 244.600000 211.736000 252.280000 199.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 252.304000 211.736000 258.460000 199.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 258.904000 211.736000 262.708000 199.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 263.308000 211.736000 270.460000 199.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 270.508000 211.736000 278.188000 199.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 278.104000 211.736000 285.328000 199.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 285.400000 211.736000 292.168000 199.736000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 292.096000 211.736000 299.188000 199.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 299.596000 211.736000 303.400000 199.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 303.892000 211.736000 308.704000 199.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 308.692000 211.736000 316.420000 199.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 316.492000 211.736000 323.584000 199.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 324.088000 211.736000 327.892000 199.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 328.384000 211.736000 336.064000 199.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 336.088000 211.736000 343.312000 199.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 343.288000 211.736000 350.512000 199.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 350.488000 211.736000 356.224000 199.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 356.284000 211.736000 362.440000 199.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 362.380000 211.736000 366.184000 199.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.580000 211.736000 370.384000 199.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.876000 211.736000 380.704000 199.736000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 380.680000 211.736000 388.408000 199.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 388.984000 211.736000 392.788000 199.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 393.280000 211.736000 398.092000 199.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 398.080000 211.736000 405.808000 199.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 405.880000 211.736000 412.972000 199.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 413.380000 211.736000 417.184000 199.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 417.676000 211.736000 423.412000 199.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 423.376000 211.736000 427.204000 199.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 427.276000 211.736000 434.956000 199.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 434.980000 211.736000 442.708000 199.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 442.684000 211.736000 447.496000 199.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 447.988000 211.736000 451.792000 199.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 452.284000 211.736000 458.440000 199.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 458.488000 211.736000 462.316000 199.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.292000 211.736000 469.972000 199.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 469.996000 211.736000 477.088000 199.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 477.496000 211.736000 481.300000 199.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 481.792000 211.736000 485.620000 199.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 485.596000 211.736000 491.752000 199.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 492.292000 211.736000 496.096000 199.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 496.588000 211.736000 503.740000 199.736000 1.000000 0.000000 0.000000 1.000000 a
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 211.736000 508.004000 199.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 197.836000 195.760000 185.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 195.796000 197.836000 199.624000 185.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 199.600000 197.836000 207.328000 185.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 207.304000 197.836000 214.984000 185.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 215.008000 197.836000 222.232000 185.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 222.208000 197.836000 232.468000 185.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 232.504000 197.836000 236.308000 185.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 236.308000 197.836000 243.460000 185.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 243.508000 197.836000 251.236000 185.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 251.212000 197.836000 258.892000 185.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 258.916000 197.836000 262.720000 185.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.720000 197.836000 269.872000 185.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 269.920000 197.836000 273.724000 185.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 273.724000 197.836000 279.880000 185.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 279.928000 197.836000 283.756000 185.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 283.732000 197.836000 287.560000 185.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 287.536000 197.836000 295.216000 185.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 295.240000 197.836000 299.068000 185.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 299.044000 197.836000 306.772000 185.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 306.748000 197.836000 314.428000 185.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 314.452000 197.836000 318.256000 185.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 318.256000 197.836000 325.936000 185.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 325.960000 197.836000 333.184000 185.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 333.160000 197.836000 340.384000 185.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 340.360000 197.836000 346.096000 185.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 346.060000 197.836000 349.864000 185.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 349.864000 197.836000 353.692000 185.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 353.668000 197.836000 360.760000 185.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 360.772000 197.836000 367.924000 185.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 367.972000 197.836000 375.652000 185.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 375.676000 197.836000 379.504000 185.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 379.480000 197.836000 387.208000 185.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 387.184000 197.836000 394.864000 185.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 394.888000 197.836000 398.692000 185.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.692000 197.836000 405.916000 185.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 405.892000 197.836000 413.620000 185.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 413.596000 197.836000 418.408000 185.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 418.396000 197.836000 425.620000 185.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 425.596000 197.836000 429.400000 185.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.400000 197.836000 434.212000 185.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 434.200000 197.836000 441.928000 185.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 441.904000 197.836000 448.996000 185.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 449.008000 197.836000 452.812000 185.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 453.100000 197.836000 457.912000 185.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 457.900000 197.836000 464.992000 185.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 465.004000 197.836000 470.740000 185.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 470.704000 197.836000 476.440000 185.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 476.404000 197.836000 483.556000 185.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 483.604000 197.836000 490.324000 185.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 490.300000 197.836000 497.392000 185.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 497.404000 197.836000 501.208000 185.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 463.300000 86.136000 471.364000 74.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 470.800000 86.136000 477.952000 74.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 478.000000 86.136000 485.680000 74.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 485.704000 86.136000 492.796000 74.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 492.808000 86.136000 496.612000 74.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 496.600000 86.136000 504.232000 74.136000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 3521.600000 0 477.900000 3521.600000 0 477.900000 3831.400000 0 134.300000 3831.400000 0 134.300000 3521.600000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -272970.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 532.500000 0 168.100000 532.500000 0 168.100000 537.500000 0 76.900000 537.500000 0 76.900000 532.500000 0
+eoFillPath subpath 1 163.100000 537.400000 0 168.100000 537.400000 0 168.100000 668.000000 0 163.100000 668.000000 0 163.100000 537.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 537.500000 0 163.100000 537.500000 0 163.100000 672.900000 0 72.000000 672.900000 0 72.000000 537.500000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 668.580000 87.320000 658.580000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 668.580000 93.420000 658.580000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 668.580000 97.510000 658.580000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 668.580000 101.420000 658.580000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 668.580000 104.170000 658.580000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 668.580000 110.530000 658.580000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 668.580000 113.270000 658.580000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 668.580000 116.470000 658.580000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 668.580000 123.480000 658.580000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 668.580000 129.610000 658.580000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 668.580000 135.090000 658.580000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 668.580000 140.890000 658.580000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 668.580000 144.820000 658.580000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 668.580000 150.920000 658.580000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 668.580000 153.670000 658.580000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 668.580000 156.470000 658.580000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 541.700000 0 168.200000 541.700000 0 168.200000 656.900000 0 72.000000 656.900000 0 72.000000 541.700000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 609.852000 79.253000 600.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 609.852000 86.669000 600.852000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 609.852000 90.215000 600.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 609.852000 93.077000 600.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 609.852000 97.406000 600.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 609.852000 100.853000 600.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 609.852000 107.324000 600.852000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 609.852000 112.337000 600.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 609.852000 115.271000 600.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 609.852000 118.655000 600.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 609.852000 126.512000 600.852000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 609.852000 130.805000 600.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 609.852000 135.881000 600.852000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 609.852000 139.355000 600.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 609.852000 147.284000 600.852000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 609.852000 150.074000 600.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 609.852000 155.897000 600.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 609.852000 158.750000 600.852000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 609.852000 161.853000 600.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 599.352000 82.124000 590.352000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 599.352000 87.137000 590.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 599.352000 90.071000 590.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 599.352000 93.356000 590.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 599.352000 100.403000 590.352000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 599.352000 104.921000 590.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 599.352000 109.205000 590.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 599.352000 117.737000 590.352000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 599.352000 123.119000 590.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 599.352000 128.996000 590.352000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 599.352000 132.605000 590.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 599.352000 138.392000 590.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 599.352000 141.749000 590.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 599.352000 149.507000 590.352000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 599.352000 153.800000 590.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 599.352000 158.876000 590.352000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 599.352000 161.853000 590.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 588.852000 81.764000 579.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 588.852000 87.596000 579.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 588.852000 93.356000 579.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 588.852000 102.050000 579.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 588.852000 113.822000 579.852000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 588.852000 122.651000 579.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 588.852000 134.117000 579.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 588.852000 138.401000 579.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 588.852000 147.149000 579.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 588.852000 158.921000 579.852000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 588.852000 161.853000 579.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 578.352000 79.271000 569.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 578.352000 84.338000 569.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 578.352000 89.621000 569.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 578.352000 94.643000 569.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 578.352000 100.502000 569.352000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 578.352000 106.262000 569.352000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 578.352000 111.518000 569.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 578.352000 116.216000 569.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 578.352000 119.249000 569.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 578.352000 122.363000 569.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 578.352000 128.186000 569.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 578.352000 131.345000 569.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 578.352000 137.060000 569.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 578.352000 140.147000 569.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 578.352000 145.007000 569.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 578.352000 148.598000 569.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 578.352000 151.460000 569.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 578.352000 155.789000 569.352000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 578.352000 158.933000 569.352000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 567.852000 80.702000 558.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 567.852000 83.573000 558.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 567.852000 89.396000 558.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 567.852000 95.156000 558.852000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 567.852000 100.547000 558.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 567.852000 109.052000 558.852000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 567.852000 111.959000 558.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 567.852000 117.251000 558.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 567.852000 121.904000 558.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 567.852000 126.503000 558.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 567.852000 129.338000 558.852000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 567.852000 134.936000 558.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 567.852000 143.441000 558.852000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 567.852000 148.796000 558.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 567.852000 154.574000 558.852000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 567.852000 158.876000 558.852000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 567.852000 161.853000 558.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 557.352000 79.271000 548.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 557.352000 85.094000 548.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 557.352000 88.703000 548.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 557.352000 94.112000 548.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 557.352000 97.244000 548.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 557.352000 103.058000 548.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 557.352000 108.890000 548.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 557.352000 111.950000 548.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 557.352000 115.271000 548.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 557.352000 120.338000 548.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 557.352000 125.621000 548.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 557.352000 131.363000 548.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 557.352000 134.558000 548.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 557.352000 140.048000 548.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 557.352000 145.430000 548.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 557.352000 150.551000 548.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 557.352000 155.960000 548.352000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 557.352000 158.933000 548.352000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 546.852000 80.009000 537.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 546.852000 85.364000 537.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 546.852000 88.271000 537.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 546.852000 91.169000 537.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 546.852000 97.955000 537.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 546.852000 107.765000 537.852000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 546.852000 110.672000 537.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 546.852000 115.964000 537.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 546.852000 120.617000 537.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 546.852000 125.216000 537.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 546.852000 128.051000 537.852000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 546.852000 134.954000 537.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 546.852000 146.285000 537.852000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 546.852000 151.667000 537.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 546.852000 155.906000 537.852000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 546.852000 159.033000 537.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 537.400000 0 72.100000 537.400000 0 72.100000 672.900000 0 72.000000 672.900000 0 72.000000 537.400000 0
+eoFillPath subpath 1 163.100000 537.400000 0 163.200000 537.400000 0 163.200000 672.900000 0 163.100000 672.900000 0 163.100000 537.400000 0
+eoFillPath subpath 1 72.000000 672.800000 0 163.200000 672.800000 0 163.200000 672.900000 0 72.000000 672.900000 0 72.000000 672.800000 0
+eoFillPath subpath 1 72.000000 537.400000 0 163.200000 537.400000 0 163.200000 537.500000 0 72.000000 537.500000 0 72.000000 537.400000 0
+saveState
+eoClipPath subpath 1 96.900000 612.700000 0 138.300000 612.700000 0 138.300000 656.900000 0 96.900000 656.900000 0 96.900000 612.700000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 17920.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 257.900000 0 165.500000 257.900000 0 165.500000 262.900000 0 76.900000 262.900000 0 76.900000 257.900000 0
+eoFillPath subpath 1 160.500000 262.800000 0 165.500000 262.800000 0 165.500000 419.100000 0 160.500000 419.100000 0 160.500000 262.800000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 262.900000 0 121.400000 262.900000 0 121.400000 424.000000 0 72.000000 424.000000 0 72.000000 262.900000 0
+saveState
+eoClipPath subpath 1 72.000000 262.900000 0 160.500000 262.900000 0 160.500000 424.000000 0 72.000000 424.000000 0 72.000000 262.900000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 419.680000 89.280000 409.680000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 419.680000 95.630000 409.680000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 419.680000 99.520000 409.680000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 419.680000 102.270000 409.680000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 419.680000 108.450000 409.680000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 419.680000 112.610000 409.680000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 419.680000 118.510000 409.680000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 419.680000 121.670000 409.680000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 419.680000 124.470000 409.680000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 419.680000 130.830000 409.680000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 419.680000 133.970000 409.680000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 419.680000 137.920000 409.680000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 419.680000 144.230000 409.680000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 419.680000 150.350000 409.680000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 419.680000 153.570000 409.680000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 407.980000 95.000000 397.980000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 407.980000 97.770000 397.980000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 407.980000 103.000000 397.980000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 407.980000 109.330000 397.980000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 407.980000 117.470000 397.980000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 407.980000 123.620000 397.980000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 407.980000 128.800000 397.980000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 407.980000 135.130000 397.980000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 407.980000 141.250000 397.980000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 407.980000 145.410000 397.980000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 393.152000 82.961000 384.152000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 393.152000 87.614000 384.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 393.152000 93.356000 384.152000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 393.152000 98.612000 384.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 393.152000 103.733000 384.152000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 393.152000 106.568000 384.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 393.152000 111.959000 384.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 393.152000 114.866000 384.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 393.152000 117.665000 384.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 393.152000 122.768000 384.152000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 393.152000 125.747000 384.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 393.152000 131.651000 384.152000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 393.152000 136.907000 384.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 393.152000 142.307000 384.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 393.152000 148.049000 384.152000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 393.152000 150.956000 384.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 393.152000 156.302000 384.152000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 393.152000 159.253000 384.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 382.652000 84.095000 373.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 382.652000 89.900000 373.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 382.652000 95.318000 373.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 382.652000 100.349000 373.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 382.652000 110.789000 373.652000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 382.652000 111.464000 373.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 382.652000 114.362000 373.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 382.652000 119.348000 373.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 382.652000 126.962000 373.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 382.652000 132.047000 373.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 382.652000 139.958000 373.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 382.652000 142.865000 373.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 382.652000 147.410000 373.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 382.652000 153.287000 373.652000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 382.652000 156.333000 373.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 372.152000 84.095000 363.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 372.152000 89.468000 363.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 372.152000 94.121000 363.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 372.152000 99.899000 363.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 372.152000 105.218000 363.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 372.152000 109.502000 363.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 372.152000 115.649000 363.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 372.152000 122.327000 363.152000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 372.152000 127.718000 363.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 372.152000 132.002000 363.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 372.152000 138.149000 363.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 372.152000 145.205000 363.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 372.152000 150.992000 363.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 372.152000 156.311000 363.152000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 372.152000 159.253000 363.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 361.652000 82.394000 352.652000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 361.652000 86.705000 352.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 361.652000 91.322000 352.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 361.652000 94.913000 352.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 361.652000 98.054000 352.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 361.652000 102.014000 352.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 361.652000 104.876000 352.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 361.652000 113.435000 352.652000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 361.652000 118.718000 352.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 361.652000 121.949000 352.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 361.652000 125.063000 352.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 361.652000 130.886000 352.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 361.652000 134.045000 352.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 361.652000 138.005000 352.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 361.652000 143.792000 352.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 361.652000 149.111000 352.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 361.652000 151.964000 352.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 361.652000 156.293000 352.652000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 361.652000 159.153000 352.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 351.152000 79.271000 342.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 351.152000 82.169000 342.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 351.152000 85.526000 342.152000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 351.152000 90.818000 342.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 351.152000 94.454000 342.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 351.152000 99.008000 342.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 351.152000 104.318000 342.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 351.152000 110.096000 342.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 351.152000 115.856000 342.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 351.152000 119.546000 342.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 351.152000 124.001000 342.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 351.152000 129.509000 342.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 351.152000 133.145000 342.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 351.152000 139.751000 342.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 351.152000 145.205000 342.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 351.152000 148.841000 342.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 351.152000 152.657000 342.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 351.152000 156.293000 342.152000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 351.152000 159.253000 342.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 340.652000 84.095000 331.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 340.652000 88.406000 331.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 340.652000 93.824000 331.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 340.652000 99.602000 331.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 340.652000 105.362000 331.652000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 340.652000 108.422000 331.652000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 340.652000 116.747000 331.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 340.652000 129.275000 331.652000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 340.652000 135.089000 331.652000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 340.652000 138.698000 331.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 340.652000 141.560000 331.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 340.652000 146.906000 331.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 340.652000 151.190000 331.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 340.652000 156.266000 331.652000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 340.652000 159.253000 331.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 330.152000 82.196000 321.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 330.152000 87.560000 321.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 330.152000 92.213000 321.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 330.152000 96.551000 321.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 330.152000 101.708000 321.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 330.152000 107.216000 321.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 330.152000 111.653000 321.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 330.152000 118.961000 321.152000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 330.152000 124.316000 321.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 330.152000 128.654000 321.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 330.152000 133.172000 321.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 330.152000 138.995000 321.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 330.152000 143.612000 321.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 330.152000 148.913000 321.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 330.152000 153.197000 321.152000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 330.152000 156.333000 321.152000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 319.652000 80.009000 310.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 319.652000 85.319000 310.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 319.652000 91.061000 310.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 319.652000 100.052000 310.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 319.652000 113.993000 310.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 319.652000 116.873000 310.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 319.652000 120.410000 310.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 319.652000 126.296000 310.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 319.652000 135.350000 310.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 319.652000 145.106000 310.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 319.652000 150.893000 310.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 319.652000 156.212000 310.652000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 319.652000 159.253000 310.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 309.152000 82.196000 300.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 309.152000 87.560000 300.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 309.152000 93.392000 300.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 309.152000 99.152000 300.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 309.152000 101.960000 300.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 309.152000 107.306000 300.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 309.152000 111.905000 300.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 309.152000 115.640000 300.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 309.152000 122.444000 300.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 309.152000 127.898000 300.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 309.152000 135.575000 300.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 309.152000 141.380000 300.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 309.152000 145.241000 300.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 309.152000 150.803000 300.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 309.152000 156.302000 300.152000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 309.152000 159.253000 300.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 298.652000 80.009000 289.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 298.652000 85.796000 289.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 298.652000 91.115000 289.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 298.652000 95.399000 289.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 298.652000 100.718000 289.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 298.652000 107.054000 289.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 298.652000 118.097000 289.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 298.652000 123.524000 289.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 298.652000 129.401000 289.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 298.652000 131.768000 289.652000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 298.652000 135.413000 289.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 298.652000 141.659000 289.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 298.652000 150.965000 289.652000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 298.652000 156.320000 289.652000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 298.652000 159.253000 289.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 288.152000 81.017000 279.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 288.152000 84.608000 279.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 288.152000 89.963000 279.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 288.152000 92.870000 279.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 288.152000 98.693000 279.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 288.152000 103.310000 279.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 288.152000 107.243000 279.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 288.152000 116.081000 279.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 288.152000 121.886000 279.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 288.152000 127.205000 279.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 288.152000 132.983000 279.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 288.152000 136.943000 279.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 288.152000 143.846000 279.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 288.152000 148.184000 279.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 288.152000 153.260000 279.152000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 288.152000 156.433000 279.152000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 277.652000 79.271000 268.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 277.652000 85.094000 268.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 277.652000 90.854000 268.652000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 277.652000 93.653000 268.652000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 262.800000 0 72.100000 262.800000 0 72.100000 424.000000 0 72.000000 424.000000 0 72.000000 262.800000 0
+eoFillPath subpath 1 160.500000 262.800000 0 160.600000 262.800000 0 160.600000 424.000000 0 160.500000 424.000000 0 160.500000 262.800000 0
+eoFillPath subpath 1 72.000000 423.900000 0 160.600000 423.900000 0 160.600000 424.000000 0 72.000000 424.000000 0 72.000000 423.900000 0
+eoFillPath subpath 1 72.000000 262.800000 0 160.600000 262.800000 0 160.600000 262.900000 0 72.000000 262.900000 0 72.000000 262.800000 0
+saveState
+eoClipPath subpath 1 108.000000 -224.600000 0 178.900000 -224.600000 0 178.900000 -167.900000 0 108.000000 -167.900000 0 108.000000 -224.600000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 101650.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -4282.900000 0 165.500000 -4282.900000 0 165.500000 -4277.900000 0 76.900000 -4277.900000 0 76.900000 -4282.900000 0
+eoFillPath subpath 1 160.500000 -4278.000000 0 165.500000 -4278.000000 0 165.500000 -4169.200000 0 160.500000 -4169.200000 0 160.500000 -4278.000000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -4277.900000 0 160.500000 -4277.900000 0 160.500000 -4164.300000 0 72.000000 -4164.300000 0 72.000000 -4277.900000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -4168.648000 83.771000 -4177.648000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 -4168.648000 89.594000 -4177.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 -4168.648000 92.465000 -4177.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 -4168.648000 97.568000 -4177.648000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 -4168.648000 100.943000 -4177.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 -4168.648000 106.955000 -4177.648000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 -4168.648000 110.447000 -4177.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 -4168.648000 114.425000 -4177.648000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 -4168.648000 119.717000 -4177.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 -4168.648000 127.493000 -4177.648000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 -4168.648000 130.949000 -4177.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 -4168.648000 136.574000 -4177.648000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 -4168.648000 141.920000 -4177.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 -4168.648000 147.365000 -4177.648000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 -4168.648000 151.703000 -4177.648000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 -4168.648000 156.320000 -4177.648000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -4168.648000 159.153000 -4177.648000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -4179.148000 81.764000 -4188.148000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -4179.148000 85.130000 -4188.148000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 -4179.148000 88.712000 -4188.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 -4179.148000 94.022000 -4188.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 -4179.148000 98.306000 -4188.148000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -4179.148000 102.455000 -4188.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 -4179.148000 106.676000 -4188.148000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 -4179.148000 110.312000 -4188.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 -4179.148000 114.920000 -4188.148000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 -4179.148000 119.060000 -4188.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 -4179.148000 125.450000 -4188.148000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 -4179.148000 130.832000 -4188.148000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 -4179.148000 139.445000 -4188.148000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 -4179.148000 145.169000 -4188.148000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 -4179.148000 148.076000 -4188.148000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 -4179.148000 153.323000 -4188.148000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -4179.148000 156.433000 -4188.148000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -4189.648000 80.009000 -4198.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -4189.648000 82.871000 -4198.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 -4189.648000 88.316000 -4198.648000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 -4189.648000 94.094000 -4198.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 -4189.648000 96.947000 -4198.648000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 -4189.648000 104.948000 -4198.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 -4189.648000 113.705000 -4198.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 -4189.648000 119.492000 -4198.648000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 -4189.648000 124.811000 -4198.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 -4189.648000 132.848000 -4198.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 -4189.648000 141.605000 -4198.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 -4189.648000 144.467000 -4198.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 -4189.648000 148.103000 -4198.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 -4189.648000 150.965000 -4198.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 -4189.648000 156.311000 -4198.648000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -4189.648000 159.253000 -4198.648000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -4200.148000 80.999000 -4209.148000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 -4200.148000 90.539000 -4209.148000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 -4200.148000 95.318000 -4209.148000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 -4200.148000 99.602000 -4209.148000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -4200.148000 102.473000 -4209.148000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 -4200.148000 108.260000 -4209.148000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 -4200.148000 110.762000 -4209.148000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 -4200.148000 115.316000 -4209.148000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 -4200.148000 122.156000 -4209.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 -4200.148000 132.299000 -4209.148000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 -4200.148000 136.970000 -4209.148000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 -4200.148000 139.877000 -4209.148000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 -4200.148000 142.775000 -4209.148000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 -4200.148000 148.022000 -4209.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 -4200.148000 152.720000 -4209.148000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 -4200.148000 156.311000 -4209.148000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -4200.148000 159.253000 -4209.148000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -4210.648000 83.006000 -4219.648000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 -4210.648000 88.793000 -4219.648000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 -4210.648000 91.664000 -4219.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 -4210.648000 94.562000 -4219.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 -4210.648000 100.349000 -4219.648000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 -4210.648000 103.157000 -4219.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 -4210.648000 108.980000 -4219.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 -4210.648000 114.740000 -4219.648000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 -4210.648000 119.375000 -4219.648000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 -4210.648000 128.033000 -4219.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 -4210.648000 141.479000 -4219.648000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 -4210.648000 146.807000 -4219.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -4210.648000 152.684000 -4219.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 -4210.648000 156.293000 -4219.648000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -4210.648000 159.253000 -4219.648000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -4221.148000 79.730000 -4230.148000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 -4221.148000 84.005000 -4230.148000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 -4221.148000 89.423000 -4230.148000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 -4221.148000 98.036000 -4230.148000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 -4221.148000 121.157000 -4230.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 -4221.148000 145.115000 -4230.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 -4221.148000 151.001000 -4230.148000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 -4221.148000 156.320000 -4230.148000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -4221.148000 159.253000 -4230.148000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -4231.648000 83.285000 -4240.648000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 -4231.648000 89.099000 -4240.648000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 -4231.648000 93.401000 -4240.648000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 -4231.648000 98.477000 -4240.648000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 -4231.648000 103.121000 -4240.648000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 -4231.648000 105.974000 -4240.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 -4231.648000 111.320000 -4240.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 -4231.648000 115.604000 -4240.648000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 -4231.648000 123.857000 -4240.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 -4231.648000 136.007000 -4240.648000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 -4231.648000 141.794000 -4240.648000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 -4231.648000 144.665000 -4240.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 -4231.648000 147.464000 -4240.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 -4231.648000 153.251000 -4240.648000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -4231.648000 156.433000 -4240.648000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -4242.148000 79.271000 -4251.148000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -4242.148000 85.094000 -4251.148000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -4242.148000 90.854000 -4251.148000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 -4242.148000 96.146000 -4251.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 -4242.148000 102.302000 -4251.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 -4242.148000 107.711000 -4251.148000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 -4242.148000 113.048000 -4251.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 -4242.148000 119.204000 -4251.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 -4242.148000 124.991000 -4251.148000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 -4242.148000 130.310000 -4251.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 -4242.148000 135.647000 -4251.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 -4242.148000 144.755000 -4251.148000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 -4242.148000 153.323000 -4251.148000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -4242.148000 156.333000 -4251.148000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -4252.648000 82.160000 -4261.648000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 -4252.648000 85.067000 -4261.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 -4252.648000 89.297000 -4261.648000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 -4252.648000 94.616000 -4261.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 -4252.648000 98.747000 -4261.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 -4252.648000 106.055000 -4261.648000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 -4252.648000 109.700000 -4261.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 -4252.648000 115.055000 -4261.648000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 -4252.648000 118.601000 -4261.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 -4252.648000 124.010000 -4261.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 -4252.648000 128.042000 -4261.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 -4252.648000 135.998000 -4261.648000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 -4252.648000 141.785000 -4261.648000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 -4252.648000 144.656000 -4261.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 -4252.648000 147.554000 -4261.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 -4252.648000 153.341000 -4261.648000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -4252.648000 156.433000 -4261.648000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -4263.148000 79.271000 -4272.148000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -4263.148000 85.094000 -4272.148000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -4263.148000 90.854000 -4272.148000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 -4263.148000 93.743000 -4272.148000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -4278.000000 0 72.100000 -4278.000000 0 72.100000 -4164.300000 0 72.000000 -4164.300000 0 72.000000 -4278.000000 0
+eoFillPath subpath 1 160.500000 -4278.000000 0 160.600000 -4278.000000 0 160.600000 -4164.300000 0 160.500000 -4164.300000 0 160.500000 -4278.000000 0
+eoFillPath subpath 1 72.000000 -4164.400000 0 160.600000 -4164.400000 0 160.600000 -4164.300000 0 72.000000 -4164.300000 0 72.000000 -4164.400000 0
+eoFillPath subpath 1 72.000000 -4278.000000 0 160.600000 -4278.000000 0 160.600000 -4277.900000 0 72.000000 -4277.900000 0 72.000000 -4278.000000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 1911.600000 0 169.600000 1911.600000 0 169.600000 1916.600000 0 76.900000 1916.600000 0 76.900000 1911.600000 0
+eoFillPath subpath 1 164.600000 1916.500000 0 169.600000 1916.500000 0 169.600000 2032.100000 0 164.600000 2032.100000 0 164.600000 1916.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 1916.600000 0 121.400000 1916.600000 0 121.400000 2037.000000 0 72.000000 2037.000000 0 72.000000 1916.600000 0
+saveState
+eoClipPath subpath 1 72.000000 1916.500000 0 164.600000 1916.500000 0 164.600000 2036.900000 0 72.000000 2036.900000 0 72.000000 1916.500000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -106630.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 1986.500000 0 93.700000 1986.500000 0 93.700000 2005.700000 0 72.000000 2005.700000 0 72.000000 1986.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 1986.500000 0 169.600000 1986.500000 0 169.600000 2005.700000 0 93.700000 2005.700000 0 93.700000 1986.500000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 1969.800000 0 93.700000 1969.800000 0 93.700000 1986.500000 0 72.000000 1986.500000 0 72.000000 1969.800000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 1969.800000 0 169.600000 1969.800000 0 169.600000 1986.500000 0 93.700000 1986.500000 0 93.700000 1969.800000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 1950.600000 0 93.700000 1950.600000 0 93.700000 1969.800000 0 72.000000 1969.800000 0 72.000000 1950.600000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 1950.600000 0 169.600000 1950.600000 0 169.600000 1969.800000 0 93.700000 1969.800000 0 93.700000 1950.600000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 1931.400000 0 93.700000 1931.400000 0 93.700000 1950.600000 0 72.000000 1950.600000 0 72.000000 1931.400000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 1931.400000 0 169.600000 1931.400000 0 169.600000 1950.600000 0 93.700000 1950.600000 0 93.700000 1931.400000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2032.652000 82.898000 2023.652000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 2032.652000 87.200000 2023.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 2032.652000 90.809000 2023.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 2032.652000 93.671000 2023.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 2032.652000 98.315000 2023.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 2032.652000 101.906000 2023.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 2032.652000 106.514000 2023.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 2032.652000 109.754000 2023.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 2032.652000 112.868000 2023.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 2032.652000 118.691000 2023.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 2032.652000 121.850000 2023.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 2032.652000 125.702000 2023.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 2032.652000 131.588000 2023.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 2032.652000 136.907000 2023.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 2032.652000 140.039000 2023.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 2032.652000 146.078000 2023.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 2032.652000 151.442000 2023.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 2032.652000 154.349000 2023.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 2032.652000 157.148000 2023.652000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 2032.652000 160.433000 2023.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2022.152000 84.095000 2013.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 2022.152000 89.468000 2013.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 2022.152000 94.580000 2013.152000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 2022.152000 97.631000 2013.152000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 2001.752000 104.443000 1992.752000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 2001.752000 109.060000 1992.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 2001.752000 113.398000 1992.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 2001.752000 119.194000 1992.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 2001.752000 124.612000 1992.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 2001.752000 127.465000 1992.752000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 1985.052000 101.176000 1976.052000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 1985.052000 104.074000 1976.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 1985.052000 109.420000 1976.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 1985.052000 114.442000 1976.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 1985.052000 120.202000 1976.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 1985.052000 123.811000 1976.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 1985.052000 129.121000 1976.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 1985.052000 134.899000 1976.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 1985.052000 139.516000 1976.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 1985.052000 143.107000 1976.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 1985.052000 148.417000 1976.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 1985.052000 151.270000 1976.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 1985.052000 157.093000 1976.052000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 1968.352000 103.048000 1959.352000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 1968.352000 108.421000 1959.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 1968.352000 113.443000 1959.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 1968.352000 118.852000 1959.352000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 1968.352000 124.702000 1959.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 1968.352000 130.021000 1959.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 1968.352000 135.079000 1959.352000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 1949.152000 104.407000 1940.152000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 1949.152000 109.816000 1940.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 1949.152000 115.594000 1940.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 1949.152000 121.354000 1940.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 1949.152000 125.692000 1940.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 1949.152000 128.563000 1940.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 1949.152000 133.954000 1940.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 1949.152000 139.786000 1940.152000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 1916.500000 0 72.100000 1916.500000 0 72.100000 2037.000000 0 72.000000 2037.000000 0 72.000000 1916.500000 0
+eoFillPath subpath 1 164.600000 1916.500000 0 164.700000 1916.500000 0 164.700000 2037.000000 0 164.600000 2037.000000 0 164.600000 1916.500000 0
+eoFillPath subpath 1 72.000000 2036.900000 0 164.700000 2036.900000 0 164.700000 2037.000000 0 72.000000 2037.000000 0 72.000000 2036.900000 0
+eoFillPath subpath 1 72.000000 1916.500000 0 164.700000 1916.500000 0 164.700000 1916.600000 0 72.000000 1916.600000 0 72.000000 1916.500000 0
+eoFillPath subpath 1 91.300000 1931.400000 0 93.700000 1931.400000 0 93.700000 2005.700000 0 91.300000 2005.700000 0 91.300000 1931.400000 0
+eoFillPath subpath 1 72.000000 1950.600000 0 169.600000 1950.600000 0 169.600000 1953.000000 0 72.000000 1953.000000 0 72.000000 1950.600000 0
+eoFillPath subpath 1 72.000000 2003.300000 0 169.600000 2003.300000 0 169.600000 2005.700000 0 72.000000 2005.700000 0 72.000000 2003.300000 0
+eoFillPath subpath 1 72.000000 1931.400000 0 169.600000 1931.400000 0 169.600000 1933.800000 0 72.000000 1933.800000 0 72.000000 1931.400000 0
+saveState
+eoClipPath subpath 1 108.000000 -5934.600000 0 150.800000 -5934.600000 0 150.800000 -5890.400000 0 108.000000 -5890.400000 0 108.000000 -5934.600000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 672660.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 -6784.600000 0 499.600000 -6784.600000 0 499.600000 -6779.500000 0 186.800000 -6779.500000 0 186.800000 -6784.600000 0
+eoFillPath subpath 1 494.500000 -6779.600000 0 499.600000 -6779.600000 0 499.600000 -6591.200000 0 494.500000 -6591.200000 0 494.500000 -6779.600000 0
+saveState
+eoClipPath subpath 1 181.800000 -6779.600000 0 494.500000 -6779.600000 0 494.500000 -6586.200000 0 181.800000 -6586.200000 0 181.800000 -6779.600000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 -6586.100000 0 494.500000 -6586.100000 0 494.500000 -6586.100000 0 181.700000 -6586.100000 0
+eoFillPath subpath 1 181.700000 -6586.100000 0 494.500000 -6586.100000 0 494.500000 -6586.900000 0 181.700000 -6586.900000 0 181.700000 -6586.100000 0
+eoFillPath subpath 1 181.700000 -6586.900000 0 494.500000 -6586.900000 0 494.500000 -6587.600000 0 181.700000 -6587.600000 0 181.700000 -6586.900000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 -6587.600000 0 494.500000 -6587.600000 0 494.500000 -6588.400000 0 181.700000 -6588.400000 0 181.700000 -6587.600000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 -6588.400000 0 494.500000 -6588.400000 0 494.500000 -6589.200000 0 181.700000 -6589.200000 0 181.700000 -6588.400000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 -6589.200000 0 494.500000 -6589.200000 0 494.500000 -6589.900000 0 181.700000 -6589.900000 0 181.700000 -6589.200000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 -6589.900000 0 494.500000 -6589.900000 0 494.500000 -6590.700000 0 181.700000 -6590.700000 0 181.700000 -6589.900000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 -6590.700000 0 494.500000 -6590.700000 0 494.500000 -6591.400000 0 181.700000 -6591.400000 0 181.700000 -6590.700000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 -6591.400000 0 494.500000 -6591.400000 0 494.500000 -6592.200000 0 181.700000 -6592.200000 0 181.700000 -6591.400000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 -6592.200000 0 494.500000 -6592.200000 0 494.500000 -6592.900000 0 181.700000 -6592.900000 0 181.700000 -6592.200000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 -6592.900000 0 494.500000 -6592.900000 0 494.500000 -6593.700000 0 181.700000 -6593.700000 0 181.700000 -6592.900000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 -6593.700000 0 494.500000 -6593.700000 0 494.500000 -6594.500000 0 181.700000 -6594.500000 0 181.700000 -6593.700000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 -6594.500000 0 494.500000 -6594.500000 0 494.500000 -6595.200000 0 181.700000 -6595.200000 0 181.700000 -6594.500000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 -6595.200000 0 494.500000 -6595.200000 0 494.500000 -6596.000000 0 181.700000 -6596.000000 0 181.700000 -6595.200000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 -6596.000000 0 494.500000 -6596.000000 0 494.500000 -6596.700000 0 181.700000 -6596.700000 0 181.700000 -6596.000000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 -6596.700000 0 494.500000 -6596.700000 0 494.500000 -6597.500000 0 181.700000 -6597.500000 0 181.700000 -6596.700000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 -6597.500000 0 494.500000 -6597.500000 0 494.500000 -6598.300000 0 181.700000 -6598.300000 0 181.700000 -6597.500000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 -6598.300000 0 494.500000 -6598.300000 0 494.500000 -6599.000000 0 181.700000 -6599.000000 0 181.700000 -6598.300000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 -6599.000000 0 494.500000 -6599.000000 0 494.500000 -6599.800000 0 181.700000 -6599.800000 0 181.700000 -6599.000000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 -6599.800000 0 494.500000 -6599.800000 0 494.500000 -6600.500000 0 181.700000 -6600.500000 0 181.700000 -6599.800000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 -6600.500000 0 494.500000 -6600.500000 0 494.500000 -6601.300000 0 181.700000 -6601.300000 0 181.700000 -6600.500000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 -6601.300000 0 494.500000 -6601.300000 0 494.500000 -6602.100000 0 181.700000 -6602.100000 0 181.700000 -6601.300000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 -6602.100000 0 494.500000 -6602.100000 0 494.500000 -6602.800000 0 181.700000 -6602.800000 0 181.700000 -6602.100000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 -6602.800000 0 494.500000 -6602.800000 0 494.500000 -6603.600000 0 181.700000 -6603.600000 0 181.700000 -6602.800000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 -6603.600000 0 494.500000 -6603.600000 0 494.500000 -6604.300000 0 181.700000 -6604.300000 0 181.700000 -6603.600000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 -6604.300000 0 494.500000 -6604.300000 0 494.500000 -6605.100000 0 181.700000 -6605.100000 0 181.700000 -6604.300000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 -6605.100000 0 494.500000 -6605.100000 0 494.500000 -6605.800000 0 181.700000 -6605.800000 0 181.700000 -6605.100000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 -6605.800000 0 494.500000 -6605.800000 0 494.500000 -6606.600000 0 181.700000 -6606.600000 0 181.700000 -6605.800000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 -6606.600000 0 494.500000 -6606.600000 0 494.500000 -6607.400000 0 181.700000 -6607.400000 0 181.700000 -6606.600000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 -6607.400000 0 494.500000 -6607.400000 0 494.500000 -6608.100000 0 181.700000 -6608.100000 0 181.700000 -6607.400000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 -6608.100000 0 494.500000 -6608.100000 0 494.500000 -6608.900000 0 181.700000 -6608.900000 0 181.700000 -6608.100000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 -6608.900000 0 494.500000 -6608.900000 0 494.500000 -6609.600000 0 181.700000 -6609.600000 0 181.700000 -6608.900000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 -6609.600000 0 494.500000 -6609.600000 0 494.500000 -6610.400000 0 181.700000 -6610.400000 0 181.700000 -6609.600000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 -6610.400000 0 494.500000 -6610.400000 0 494.500000 -6611.200000 0 181.700000 -6611.200000 0 181.700000 -6610.400000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 -6611.200000 0 494.500000 -6611.200000 0 494.500000 -6611.900000 0 181.700000 -6611.900000 0 181.700000 -6611.200000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 -6611.900000 0 494.500000 -6611.900000 0 494.500000 -6612.700000 0 181.700000 -6612.700000 0 181.700000 -6611.900000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 -6612.700000 0 494.500000 -6612.700000 0 494.500000 -6613.400000 0 181.700000 -6613.400000 0 181.700000 -6612.700000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 -6613.400000 0 494.500000 -6613.400000 0 494.500000 -6614.200000 0 181.700000 -6614.200000 0 181.700000 -6613.400000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 -6614.200000 0 494.500000 -6614.200000 0 494.500000 -6615.000000 0 181.700000 -6615.000000 0 181.700000 -6614.200000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 -6615.000000 0 494.500000 -6615.000000 0 494.500000 -6615.700000 0 181.700000 -6615.700000 0 181.700000 -6615.000000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 -6615.700000 0 494.500000 -6615.700000 0 494.500000 -6616.500000 0 181.700000 -6616.500000 0 181.700000 -6615.700000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 -6616.500000 0 494.500000 -6616.500000 0 494.500000 -6617.200000 0 181.700000 -6617.200000 0 181.700000 -6616.500000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 -6617.200000 0 494.500000 -6617.200000 0 494.500000 -6618.000000 0 181.700000 -6618.000000 0 181.700000 -6617.200000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 -6618.000000 0 494.500000 -6618.000000 0 494.500000 -6618.700000 0 181.700000 -6618.700000 0 181.700000 -6618.000000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 -6618.700000 0 494.500000 -6618.700000 0 494.500000 -6619.500000 0 181.700000 -6619.500000 0 181.700000 -6618.700000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 -6619.500000 0 494.500000 -6619.500000 0 494.500000 -6620.300000 0 181.700000 -6620.300000 0 181.700000 -6619.500000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 -6620.300000 0 494.500000 -6620.300000 0 494.500000 -6621.000000 0 181.700000 -6621.000000 0 181.700000 -6620.300000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 -6621.000000 0 494.500000 -6621.000000 0 494.500000 -6621.800000 0 181.700000 -6621.800000 0 181.700000 -6621.000000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 -6621.800000 0 494.500000 -6621.800000 0 494.500000 -6622.500000 0 181.700000 -6622.500000 0 181.700000 -6621.800000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 -6622.500000 0 494.500000 -6622.500000 0 494.500000 -6623.300000 0 181.700000 -6623.300000 0 181.700000 -6622.500000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 -6623.300000 0 494.500000 -6623.300000 0 494.500000 -6624.100000 0 181.700000 -6624.100000 0 181.700000 -6623.300000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 -6624.100000 0 494.500000 -6624.100000 0 494.500000 -6624.800000 0 181.700000 -6624.800000 0 181.700000 -6624.100000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 -6624.800000 0 494.500000 -6624.800000 0 494.500000 -6625.600000 0 181.700000 -6625.600000 0 181.700000 -6624.800000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 -6625.600000 0 494.500000 -6625.600000 0 494.500000 -6626.300000 0 181.700000 -6626.300000 0 181.700000 -6625.600000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 -6626.300000 0 494.500000 -6626.300000 0 494.500000 -6627.100000 0 181.700000 -6627.100000 0 181.700000 -6626.300000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 -6627.100000 0 494.500000 -6627.100000 0 494.500000 -6627.900000 0 181.700000 -6627.900000 0 181.700000 -6627.100000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 -6627.900000 0 494.500000 -6627.900000 0 494.500000 -6628.600000 0 181.700000 -6628.600000 0 181.700000 -6627.900000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 -6628.600000 0 494.500000 -6628.600000 0 494.500000 -6629.400000 0 181.700000 -6629.400000 0 181.700000 -6628.600000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 -6629.400000 0 494.500000 -6629.400000 0 494.500000 -6630.100000 0 181.700000 -6630.100000 0 181.700000 -6629.400000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 -6630.100000 0 494.500000 -6630.100000 0 494.500000 -6630.900000 0 181.700000 -6630.900000 0 181.700000 -6630.100000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 -6630.900000 0 494.500000 -6630.900000 0 494.500000 -6631.600000 0 181.700000 -6631.600000 0 181.700000 -6630.900000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 -6631.600000 0 494.500000 -6631.600000 0 494.500000 -6632.400000 0 181.700000 -6632.400000 0 181.700000 -6631.600000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 -6632.400000 0 494.500000 -6632.400000 0 494.500000 -6633.200000 0 181.700000 -6633.200000 0 181.700000 -6632.400000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 -6633.200000 0 494.500000 -6633.200000 0 494.500000 -6633.900000 0 181.700000 -6633.900000 0 181.700000 -6633.200000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 -6633.900000 0 494.500000 -6633.900000 0 494.500000 -6634.700000 0 181.700000 -6634.700000 0 181.700000 -6633.900000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 -6634.700000 0 494.500000 -6634.700000 0 494.500000 -6635.400000 0 181.700000 -6635.400000 0 181.700000 -6634.700000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 -6635.400000 0 494.500000 -6635.400000 0 494.500000 -6636.200000 0 181.700000 -6636.200000 0 181.700000 -6635.400000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 -6636.200000 0 494.500000 -6636.200000 0 494.500000 -6637.000000 0 181.700000 -6637.000000 0 181.700000 -6636.200000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 -6637.000000 0 494.500000 -6637.000000 0 494.500000 -6637.700000 0 181.700000 -6637.700000 0 181.700000 -6637.000000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 -6637.700000 0 494.500000 -6637.700000 0 494.500000 -6638.500000 0 181.700000 -6638.500000 0 181.700000 -6637.700000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 -6638.500000 0 494.500000 -6638.500000 0 494.500000 -6639.200000 0 181.700000 -6639.200000 0 181.700000 -6638.500000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 -6639.200000 0 494.500000 -6639.200000 0 494.500000 -6640.000000 0 181.700000 -6640.000000 0 181.700000 -6639.200000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 -6640.000000 0 494.500000 -6640.000000 0 494.500000 -6640.800000 0 181.700000 -6640.800000 0 181.700000 -6640.000000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 -6640.800000 0 494.500000 -6640.800000 0 494.500000 -6641.500000 0 181.700000 -6641.500000 0 181.700000 -6640.800000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 -6641.500000 0 494.500000 -6641.500000 0 494.500000 -6642.300000 0 181.700000 -6642.300000 0 181.700000 -6641.500000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 -6642.300000 0 494.500000 -6642.300000 0 494.500000 -6643.000000 0 181.700000 -6643.000000 0 181.700000 -6642.300000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 -6643.000000 0 494.500000 -6643.000000 0 494.500000 -6643.800000 0 181.700000 -6643.800000 0 181.700000 -6643.000000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 -6643.800000 0 494.500000 -6643.800000 0 494.500000 -6644.500000 0 181.700000 -6644.500000 0 181.700000 -6643.800000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 -6644.500000 0 494.500000 -6644.500000 0 494.500000 -6645.300000 0 181.700000 -6645.300000 0 181.700000 -6644.500000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 -6645.300000 0 494.500000 -6645.300000 0 494.500000 -6646.100000 0 181.700000 -6646.100000 0 181.700000 -6645.300000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 -6646.100000 0 494.500000 -6646.100000 0 494.500000 -6646.800000 0 181.700000 -6646.800000 0 181.700000 -6646.100000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 -6646.800000 0 494.500000 -6646.800000 0 494.500000 -6647.600000 0 181.700000 -6647.600000 0 181.700000 -6646.800000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 -6647.600000 0 494.500000 -6647.600000 0 494.500000 -6648.300000 0 181.700000 -6648.300000 0 181.700000 -6647.600000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 -6648.300000 0 494.500000 -6648.300000 0 494.500000 -6649.100000 0 181.700000 -6649.100000 0 181.700000 -6648.300000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 -6649.100000 0 494.500000 -6649.100000 0 494.500000 -6649.900000 0 181.700000 -6649.900000 0 181.700000 -6649.100000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 -6649.900000 0 494.500000 -6649.900000 0 494.500000 -6650.600000 0 181.700000 -6650.600000 0 181.700000 -6649.900000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 -6650.600000 0 494.500000 -6650.600000 0 494.500000 -6651.400000 0 181.700000 -6651.400000 0 181.700000 -6650.600000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 -6651.400000 0 494.500000 -6651.400000 0 494.500000 -6652.100000 0 181.700000 -6652.100000 0 181.700000 -6651.400000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 -6652.100000 0 494.500000 -6652.100000 0 494.500000 -6652.900000 0 181.700000 -6652.900000 0 181.700000 -6652.100000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 -6652.900000 0 494.500000 -6652.900000 0 494.500000 -6653.700000 0 181.700000 -6653.700000 0 181.700000 -6652.900000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 -6653.700000 0 494.500000 -6653.700000 0 494.500000 -6654.400000 0 181.700000 -6654.400000 0 181.700000 -6653.700000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 -6654.400000 0 494.500000 -6654.400000 0 494.500000 -6655.200000 0 181.700000 -6655.200000 0 181.700000 -6654.400000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 -6655.200000 0 494.500000 -6655.200000 0 494.500000 -6655.900000 0 181.700000 -6655.900000 0 181.700000 -6655.200000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 -6655.900000 0 494.500000 -6655.900000 0 494.500000 -6656.700000 0 181.700000 -6656.700000 0 181.700000 -6655.900000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 -6656.700000 0 494.500000 -6656.700000 0 494.500000 -6657.400000 0 181.700000 -6657.400000 0 181.700000 -6656.700000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 -6657.400000 0 494.500000 -6657.400000 0 494.500000 -6658.200000 0 181.700000 -6658.200000 0 181.700000 -6657.400000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 -6658.200000 0 494.500000 -6658.200000 0 494.500000 -6659.000000 0 181.700000 -6659.000000 0 181.700000 -6658.200000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 -6659.000000 0 494.500000 -6659.000000 0 494.500000 -6659.700000 0 181.700000 -6659.700000 0 181.700000 -6659.000000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 -6659.700000 0 494.500000 -6659.700000 0 494.500000 -6660.500000 0 181.700000 -6660.500000 0 181.700000 -6659.700000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 -6660.500000 0 494.500000 -6660.500000 0 494.500000 -6661.200000 0 181.700000 -6661.200000 0 181.700000 -6660.500000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 -6661.200000 0 494.500000 -6661.200000 0 494.500000 -6662.000000 0 181.700000 -6662.000000 0 181.700000 -6661.200000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 -6662.000000 0 494.500000 -6662.000000 0 494.500000 -6662.700000 0 181.700000 -6662.700000 0 181.700000 -6662.000000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 -6662.700000 0 494.500000 -6662.700000 0 494.500000 -6663.500000 0 181.700000 -6663.500000 0 181.700000 -6662.700000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 -6663.500000 0 494.500000 -6663.500000 0 494.500000 -6664.300000 0 181.700000 -6664.300000 0 181.700000 -6663.500000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 -6664.300000 0 494.500000 -6664.300000 0 494.500000 -6665.000000 0 181.700000 -6665.000000 0 181.700000 -6664.300000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 -6665.000000 0 494.500000 -6665.000000 0 494.500000 -6665.800000 0 181.700000 -6665.800000 0 181.700000 -6665.000000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 -6665.800000 0 494.500000 -6665.800000 0 494.500000 -6666.500000 0 181.700000 -6666.500000 0 181.700000 -6665.800000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 -6666.500000 0 494.500000 -6666.500000 0 494.500000 -6667.300000 0 181.700000 -6667.300000 0 181.700000 -6666.500000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 -6667.300000 0 494.500000 -6667.300000 0 494.500000 -6668.100000 0 181.700000 -6668.100000 0 181.700000 -6667.300000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 -6668.100000 0 494.500000 -6668.100000 0 494.500000 -6668.800000 0 181.700000 -6668.800000 0 181.700000 -6668.100000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 -6668.800000 0 494.500000 -6668.800000 0 494.500000 -6669.600000 0 181.700000 -6669.600000 0 181.700000 -6668.800000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 -6669.600000 0 494.500000 -6669.600000 0 494.500000 -6670.300000 0 181.700000 -6670.300000 0 181.700000 -6669.600000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 -6670.300000 0 494.500000 -6670.300000 0 494.500000 -6671.100000 0 181.700000 -6671.100000 0 181.700000 -6670.300000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 -6671.100000 0 494.500000 -6671.100000 0 494.500000 -6671.800000 0 181.700000 -6671.800000 0 181.700000 -6671.100000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 -6671.800000 0 494.500000 -6671.800000 0 494.500000 -6672.600000 0 181.700000 -6672.600000 0 181.700000 -6671.800000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 -6672.600000 0 494.500000 -6672.600000 0 494.500000 -6673.400000 0 181.700000 -6673.400000 0 181.700000 -6672.600000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 -6673.400000 0 494.500000 -6673.400000 0 494.500000 -6674.100000 0 181.700000 -6674.100000 0 181.700000 -6673.400000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 -6674.100000 0 494.500000 -6674.100000 0 494.500000 -6674.900000 0 181.700000 -6674.900000 0 181.700000 -6674.100000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 -6674.900000 0 494.500000 -6674.900000 0 494.500000 -6675.600000 0 181.700000 -6675.600000 0 181.700000 -6674.900000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 -6675.600000 0 494.500000 -6675.600000 0 494.500000 -6676.400000 0 181.700000 -6676.400000 0 181.700000 -6675.600000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 -6676.400000 0 494.500000 -6676.400000 0 494.500000 -6677.100000 0 181.700000 -6677.100000 0 181.700000 -6676.400000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 -6677.100000 0 494.500000 -6677.100000 0 494.500000 -6677.900000 0 181.700000 -6677.900000 0 181.700000 -6677.100000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 -6677.900000 0 494.500000 -6677.900000 0 494.500000 -6678.700000 0 181.700000 -6678.700000 0 181.700000 -6677.900000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 -6678.700000 0 494.500000 -6678.700000 0 494.500000 -6679.400000 0 181.700000 -6679.400000 0 181.700000 -6678.700000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 -6679.400000 0 494.500000 -6679.400000 0 494.500000 -6680.200000 0 181.700000 -6680.200000 0 181.700000 -6679.400000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 -6680.200000 0 494.500000 -6680.200000 0 494.500000 -6680.900000 0 181.700000 -6680.900000 0 181.700000 -6680.200000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 -6680.900000 0 494.500000 -6680.900000 0 494.500000 -6681.700000 0 181.700000 -6681.700000 0 181.700000 -6680.900000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 -6681.700000 0 494.500000 -6681.700000 0 494.500000 -6682.500000 0 181.700000 -6682.500000 0 181.700000 -6681.700000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 -6682.500000 0 494.500000 -6682.500000 0 494.500000 -6683.200000 0 181.700000 -6683.200000 0 181.700000 -6682.500000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 -6683.200000 0 494.500000 -6683.200000 0 494.500000 -6684.000000 0 181.700000 -6684.000000 0 181.700000 -6683.200000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 -6684.000000 0 494.500000 -6684.000000 0 494.500000 -6684.700000 0 181.700000 -6684.700000 0 181.700000 -6684.000000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 -6684.700000 0 494.500000 -6684.700000 0 494.500000 -6685.500000 0 181.700000 -6685.500000 0 181.700000 -6684.700000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 -6685.500000 0 494.500000 -6685.500000 0 494.500000 -6686.200000 0 181.700000 -6686.200000 0 181.700000 -6685.500000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 -6686.200000 0 494.500000 -6686.200000 0 494.500000 -6687.000000 0 181.700000 -6687.000000 0 181.700000 -6686.200000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 -6687.000000 0 494.500000 -6687.000000 0 494.500000 -6687.800000 0 181.700000 -6687.800000 0 181.700000 -6687.000000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 -6687.800000 0 494.500000 -6687.800000 0 494.500000 -6688.500000 0 181.700000 -6688.500000 0 181.700000 -6687.800000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 -6688.500000 0 494.500000 -6688.500000 0 494.500000 -6689.300000 0 181.700000 -6689.300000 0 181.700000 -6688.500000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 -6689.300000 0 494.500000 -6689.300000 0 494.500000 -6690.000000 0 181.700000 -6690.000000 0 181.700000 -6689.300000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 -6690.000000 0 494.500000 -6690.000000 0 494.500000 -6690.800000 0 181.700000 -6690.800000 0 181.700000 -6690.000000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 -6690.800000 0 494.500000 -6690.800000 0 494.500000 -6691.600000 0 181.700000 -6691.600000 0 181.700000 -6690.800000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 -6691.600000 0 494.500000 -6691.600000 0 494.500000 -6692.300000 0 181.700000 -6692.300000 0 181.700000 -6691.600000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 -6692.300000 0 494.500000 -6692.300000 0 494.500000 -6693.100000 0 181.700000 -6693.100000 0 181.700000 -6692.300000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 -6693.100000 0 494.500000 -6693.100000 0 494.500000 -6693.800000 0 181.700000 -6693.800000 0 181.700000 -6693.100000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 -6693.800000 0 494.500000 -6693.800000 0 494.500000 -6694.600000 0 181.700000 -6694.600000 0 181.700000 -6693.800000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 -6694.600000 0 494.500000 -6694.600000 0 494.500000 -6695.400000 0 181.700000 -6695.400000 0 181.700000 -6694.600000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 -6695.400000 0 494.500000 -6695.400000 0 494.500000 -6696.100000 0 181.700000 -6696.100000 0 181.700000 -6695.400000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 -6696.100000 0 494.500000 -6696.100000 0 494.500000 -6696.900000 0 181.700000 -6696.900000 0 181.700000 -6696.100000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 -6696.900000 0 494.500000 -6696.900000 0 494.500000 -6697.600000 0 181.700000 -6697.600000 0 181.700000 -6696.900000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 -6697.600000 0 494.500000 -6697.600000 0 494.500000 -6698.400000 0 181.700000 -6698.400000 0 181.700000 -6697.600000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 -6698.400000 0 494.500000 -6698.400000 0 494.500000 -6699.100000 0 181.700000 -6699.100000 0 181.700000 -6698.400000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 -6699.100000 0 494.500000 -6699.100000 0 494.500000 -6699.900000 0 181.700000 -6699.900000 0 181.700000 -6699.100000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 -6699.900000 0 494.500000 -6699.900000 0 494.500000 -6700.700000 0 181.700000 -6700.700000 0 181.700000 -6699.900000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 -6700.700000 0 494.500000 -6700.700000 0 494.500000 -6701.400000 0 181.700000 -6701.400000 0 181.700000 -6700.700000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 -6701.400000 0 494.500000 -6701.400000 0 494.500000 -6702.200000 0 181.700000 -6702.200000 0 181.700000 -6701.400000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 -6702.200000 0 494.500000 -6702.200000 0 494.500000 -6702.900000 0 181.700000 -6702.900000 0 181.700000 -6702.200000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 -6702.900000 0 494.500000 -6702.900000 0 494.500000 -6703.700000 0 181.700000 -6703.700000 0 181.700000 -6702.900000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 -6703.700000 0 494.500000 -6703.700000 0 494.500000 -6704.500000 0 181.700000 -6704.500000 0 181.700000 -6703.700000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 -6704.500000 0 494.500000 -6704.500000 0 494.500000 -6705.200000 0 181.700000 -6705.200000 0 181.700000 -6704.500000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 -6705.200000 0 494.500000 -6705.200000 0 494.500000 -6706.000000 0 181.700000 -6706.000000 0 181.700000 -6705.200000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 -6706.000000 0 494.500000 -6706.000000 0 494.500000 -6706.700000 0 181.700000 -6706.700000 0 181.700000 -6706.000000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 -6706.700000 0 494.500000 -6706.700000 0 494.500000 -6707.500000 0 181.700000 -6707.500000 0 181.700000 -6706.700000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 -6707.500000 0 494.500000 -6707.500000 0 494.500000 -6708.300000 0 181.700000 -6708.300000 0 181.700000 -6707.500000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 -6708.300000 0 494.500000 -6708.300000 0 494.500000 -6709.000000 0 181.700000 -6709.000000 0 181.700000 -6708.300000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 -6709.000000 0 494.500000 -6709.000000 0 494.500000 -6709.800000 0 181.700000 -6709.800000 0 181.700000 -6709.000000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 -6709.800000 0 494.500000 -6709.800000 0 494.500000 -6710.500000 0 181.700000 -6710.500000 0 181.700000 -6709.800000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 -6710.500000 0 494.500000 -6710.500000 0 494.500000 -6711.300000 0 181.700000 -6711.300000 0 181.700000 -6710.500000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 -6711.300000 0 494.500000 -6711.300000 0 494.500000 -6712.000000 0 181.700000 -6712.000000 0 181.700000 -6711.300000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 -6712.000000 0 494.500000 -6712.000000 0 494.500000 -6712.800000 0 181.700000 -6712.800000 0 181.700000 -6712.000000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 -6712.800000 0 494.500000 -6712.800000 0 494.500000 -6713.600000 0 181.700000 -6713.600000 0 181.700000 -6712.800000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 -6713.600000 0 494.500000 -6713.600000 0 494.500000 -6714.300000 0 181.700000 -6714.300000 0 181.700000 -6713.600000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 -6714.300000 0 494.500000 -6714.300000 0 494.500000 -6715.100000 0 181.700000 -6715.100000 0 181.700000 -6714.300000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 -6715.100000 0 494.500000 -6715.100000 0 494.500000 -6715.800000 0 181.700000 -6715.800000 0 181.700000 -6715.100000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 -6715.800000 0 494.500000 -6715.800000 0 494.500000 -6716.600000 0 181.700000 -6716.600000 0 181.700000 -6715.800000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 -6716.600000 0 494.500000 -6716.600000 0 494.500000 -6717.400000 0 181.700000 -6717.400000 0 181.700000 -6716.600000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 -6717.400000 0 494.500000 -6717.400000 0 494.500000 -6718.100000 0 181.700000 -6718.100000 0 181.700000 -6717.400000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 -6718.100000 0 494.500000 -6718.100000 0 494.500000 -6718.900000 0 181.700000 -6718.900000 0 181.700000 -6718.100000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 -6718.900000 0 494.500000 -6718.900000 0 494.500000 -6719.600000 0 181.700000 -6719.600000 0 181.700000 -6718.900000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 -6719.600000 0 494.500000 -6719.600000 0 494.500000 -6720.400000 0 181.700000 -6720.400000 0 181.700000 -6719.600000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 -6720.400000 0 494.500000 -6720.400000 0 494.500000 -6721.200000 0 181.700000 -6721.200000 0 181.700000 -6720.400000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 -6721.200000 0 494.500000 -6721.200000 0 494.500000 -6721.900000 0 181.700000 -6721.900000 0 181.700000 -6721.200000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 -6721.900000 0 494.500000 -6721.900000 0 494.500000 -6722.700000 0 181.700000 -6722.700000 0 181.700000 -6721.900000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 -6722.700000 0 494.500000 -6722.700000 0 494.500000 -6723.400000 0 181.700000 -6723.400000 0 181.700000 -6722.700000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 -6723.400000 0 494.500000 -6723.400000 0 494.500000 -6724.200000 0 181.700000 -6724.200000 0 181.700000 -6723.400000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 -6724.200000 0 494.500000 -6724.200000 0 494.500000 -6724.900000 0 181.700000 -6724.900000 0 181.700000 -6724.200000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 -6724.900000 0 494.500000 -6724.900000 0 494.500000 -6725.700000 0 181.700000 -6725.700000 0 181.700000 -6724.900000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 -6725.700000 0 494.500000 -6725.700000 0 494.500000 -6726.500000 0 181.700000 -6726.500000 0 181.700000 -6725.700000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 -6726.500000 0 494.500000 -6726.500000 0 494.500000 -6727.200000 0 181.700000 -6727.200000 0 181.700000 -6726.500000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 -6727.200000 0 494.500000 -6727.200000 0 494.500000 -6728.000000 0 181.700000 -6728.000000 0 181.700000 -6727.200000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 -6728.000000 0 494.500000 -6728.000000 0 494.500000 -6728.700000 0 181.700000 -6728.700000 0 181.700000 -6728.000000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 -6728.700000 0 494.500000 -6728.700000 0 494.500000 -6729.500000 0 181.700000 -6729.500000 0 181.700000 -6728.700000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 -6729.500000 0 494.500000 -6729.500000 0 494.500000 -6730.300000 0 181.700000 -6730.300000 0 181.700000 -6729.500000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 -6730.300000 0 494.500000 -6730.300000 0 494.500000 -6731.000000 0 181.700000 -6731.000000 0 181.700000 -6730.300000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 -6731.000000 0 494.500000 -6731.000000 0 494.500000 -6731.800000 0 181.700000 -6731.800000 0 181.700000 -6731.000000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 -6731.800000 0 494.500000 -6731.800000 0 494.500000 -6732.500000 0 181.700000 -6732.500000 0 181.700000 -6731.800000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 -6732.500000 0 494.500000 -6732.500000 0 494.500000 -6733.300000 0 181.700000 -6733.300000 0 181.700000 -6732.500000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 -6733.300000 0 494.500000 -6733.300000 0 494.500000 -6734.100000 0 181.700000 -6734.100000 0 181.700000 -6733.300000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 -6734.100000 0 494.500000 -6734.100000 0 494.500000 -6734.800000 0 181.700000 -6734.800000 0 181.700000 -6734.100000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 -6734.800000 0 494.500000 -6734.800000 0 494.500000 -6735.600000 0 181.700000 -6735.600000 0 181.700000 -6734.800000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 -6735.600000 0 494.500000 -6735.600000 0 494.500000 -6736.300000 0 181.700000 -6736.300000 0 181.700000 -6735.600000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 -6736.300000 0 494.500000 -6736.300000 0 494.500000 -6737.100000 0 181.700000 -6737.100000 0 181.700000 -6736.300000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 -6737.100000 0 494.500000 -6737.100000 0 494.500000 -6737.800000 0 181.700000 -6737.800000 0 181.700000 -6737.100000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 -6737.800000 0 494.500000 -6737.800000 0 494.500000 -6738.600000 0 181.700000 -6738.600000 0 181.700000 -6737.800000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 -6738.600000 0 494.500000 -6738.600000 0 494.500000 -6739.400000 0 181.700000 -6739.400000 0 181.700000 -6738.600000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 -6739.400000 0 494.500000 -6739.400000 0 494.500000 -6740.100000 0 181.700000 -6740.100000 0 181.700000 -6739.400000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 -6740.100000 0 494.500000 -6740.100000 0 494.500000 -6740.900000 0 181.700000 -6740.900000 0 181.700000 -6740.100000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 -6740.900000 0 494.500000 -6740.900000 0 494.500000 -6741.600000 0 181.700000 -6741.600000 0 181.700000 -6740.900000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 -6741.600000 0 494.500000 -6741.600000 0 494.500000 -6742.400000 0 181.700000 -6742.400000 0 181.700000 -6741.600000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 -6742.400000 0 494.500000 -6742.400000 0 494.500000 -6743.200000 0 181.700000 -6743.200000 0 181.700000 -6742.400000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 -6743.200000 0 494.500000 -6743.200000 0 494.500000 -6743.900000 0 181.700000 -6743.900000 0 181.700000 -6743.200000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 -6743.900000 0 494.500000 -6743.900000 0 494.500000 -6744.700000 0 181.700000 -6744.700000 0 181.700000 -6743.900000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 -6744.700000 0 494.500000 -6744.700000 0 494.500000 -6745.400000 0 181.700000 -6745.400000 0 181.700000 -6744.700000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 -6745.400000 0 494.500000 -6745.400000 0 494.500000 -6746.200000 0 181.700000 -6746.200000 0 181.700000 -6745.400000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 -6746.200000 0 494.500000 -6746.200000 0 494.500000 -6747.000000 0 181.700000 -6747.000000 0 181.700000 -6746.200000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 -6747.000000 0 494.500000 -6747.000000 0 494.500000 -6747.700000 0 181.700000 -6747.700000 0 181.700000 -6747.000000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 -6747.700000 0 494.500000 -6747.700000 0 494.500000 -6748.500000 0 181.700000 -6748.500000 0 181.700000 -6747.700000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 -6748.500000 0 494.500000 -6748.500000 0 494.500000 -6749.200000 0 181.700000 -6749.200000 0 181.700000 -6748.500000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 -6749.200000 0 494.500000 -6749.200000 0 494.500000 -6750.000000 0 181.700000 -6750.000000 0 181.700000 -6749.200000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 -6750.000000 0 494.500000 -6750.000000 0 494.500000 -6750.700000 0 181.700000 -6750.700000 0 181.700000 -6750.000000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 -6750.700000 0 494.500000 -6750.700000 0 494.500000 -6751.500000 0 181.700000 -6751.500000 0 181.700000 -6750.700000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 -6751.500000 0 494.500000 -6751.500000 0 494.500000 -6752.300000 0 181.700000 -6752.300000 0 181.700000 -6751.500000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 -6752.300000 0 494.500000 -6752.300000 0 494.500000 -6753.000000 0 181.700000 -6753.000000 0 181.700000 -6752.300000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 -6753.000000 0 494.500000 -6753.000000 0 494.500000 -6753.800000 0 181.700000 -6753.800000 0 181.700000 -6753.000000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 -6753.800000 0 494.500000 -6753.800000 0 494.500000 -6754.500000 0 181.700000 -6754.500000 0 181.700000 -6753.800000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 -6754.500000 0 494.500000 -6754.500000 0 494.500000 -6755.300000 0 181.700000 -6755.300000 0 181.700000 -6754.500000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 -6755.300000 0 494.500000 -6755.300000 0 494.500000 -6756.100000 0 181.700000 -6756.100000 0 181.700000 -6755.300000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 -6756.100000 0 494.500000 -6756.100000 0 494.500000 -6756.800000 0 181.700000 -6756.800000 0 181.700000 -6756.100000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 -6756.800000 0 494.500000 -6756.800000 0 494.500000 -6757.600000 0 181.700000 -6757.600000 0 181.700000 -6756.800000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 -6757.600000 0 494.500000 -6757.600000 0 494.500000 -6758.300000 0 181.700000 -6758.300000 0 181.700000 -6757.600000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 -6758.300000 0 494.500000 -6758.300000 0 494.500000 -6759.100000 0 181.700000 -6759.100000 0 181.700000 -6758.300000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 -6759.100000 0 494.500000 -6759.100000 0 494.500000 -6759.900000 0 181.700000 -6759.900000 0 181.700000 -6759.100000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 -6759.900000 0 494.500000 -6759.900000 0 494.500000 -6760.600000 0 181.700000 -6760.600000 0 181.700000 -6759.900000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 -6760.600000 0 494.500000 -6760.600000 0 494.500000 -6761.400000 0 181.700000 -6761.400000 0 181.700000 -6760.600000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 -6761.400000 0 494.500000 -6761.400000 0 494.500000 -6762.100000 0 181.700000 -6762.100000 0 181.700000 -6761.400000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 -6762.100000 0 494.500000 -6762.100000 0 494.500000 -6762.900000 0 181.700000 -6762.900000 0 181.700000 -6762.100000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 -6762.900000 0 494.500000 -6762.900000 0 494.500000 -6763.600000 0 181.700000 -6763.600000 0 181.700000 -6762.900000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 -6763.600000 0 494.500000 -6763.600000 0 494.500000 -6764.400000 0 181.700000 -6764.400000 0 181.700000 -6763.600000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 -6764.400000 0 494.500000 -6764.400000 0 494.500000 -6765.200000 0 181.700000 -6765.200000 0 181.700000 -6764.400000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 -6765.200000 0 494.500000 -6765.200000 0 494.500000 -6765.900000 0 181.700000 -6765.900000 0 181.700000 -6765.200000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 -6765.900000 0 494.500000 -6765.900000 0 494.500000 -6766.700000 0 181.700000 -6766.700000 0 181.700000 -6765.900000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 -6766.700000 0 494.500000 -6766.700000 0 494.500000 -6767.400000 0 181.700000 -6767.400000 0 181.700000 -6766.700000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 -6767.400000 0 494.500000 -6767.400000 0 494.500000 -6768.200000 0 181.700000 -6768.200000 0 181.700000 -6767.400000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 -6768.200000 0 494.500000 -6768.200000 0 494.500000 -6769.000000 0 181.700000 -6769.000000 0 181.700000 -6768.200000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 -6769.000000 0 494.500000 -6769.000000 0 494.500000 -6769.700000 0 181.700000 -6769.700000 0 181.700000 -6769.000000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 -6769.700000 0 494.500000 -6769.700000 0 494.500000 -6770.500000 0 181.700000 -6770.500000 0 181.700000 -6769.700000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 -6770.500000 0 494.500000 -6770.500000 0 494.500000 -6771.200000 0 181.700000 -6771.200000 0 181.700000 -6770.500000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 -6771.200000 0 494.500000 -6771.200000 0 494.500000 -6772.000000 0 181.700000 -6772.000000 0 181.700000 -6771.200000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 -6772.000000 0 494.500000 -6772.000000 0 494.500000 -6772.800000 0 181.700000 -6772.800000 0 181.700000 -6772.000000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 -6772.800000 0 494.500000 -6772.800000 0 494.500000 -6773.500000 0 181.700000 -6773.500000 0 181.700000 -6772.800000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 -6773.500000 0 494.500000 -6773.500000 0 494.500000 -6774.300000 0 181.700000 -6774.300000 0 181.700000 -6773.500000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 -6774.300000 0 494.500000 -6774.300000 0 494.500000 -6775.000000 0 181.700000 -6775.000000 0 181.700000 -6774.300000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 -6775.000000 0 494.500000 -6775.000000 0 494.500000 -6775.800000 0 181.700000 -6775.800000 0 181.700000 -6775.000000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 -6775.800000 0 494.500000 -6775.800000 0 494.500000 -6776.500000 0 181.700000 -6776.500000 0 181.700000 -6775.800000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 -6776.500000 0 494.500000 -6776.500000 0 494.500000 -6777.300000 0 181.700000 -6777.300000 0 181.700000 -6776.500000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 -6777.300000 0 494.500000 -6777.300000 0 494.500000 -6778.100000 0 181.700000 -6778.100000 0 181.700000 -6777.300000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 -6778.100000 0 494.500000 -6778.100000 0 494.500000 -6778.800000 0 181.700000 -6778.800000 0 181.700000 -6778.100000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 -6778.800000 0 494.500000 -6778.800000 0 494.500000 -6779.600000 0 181.700000 -6779.600000 0 181.700000 -6778.800000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 -6779.500000 0 181.800000 -6779.500000 0 181.800000 -6586.200000 0 494.400000 -6586.200000 0 494.400000 -6779.500000 0 338.100000 -6779.500000 0
+strokePath subpath 1 338.100000 -6779.500000 0 181.800000 -6779.500000 0 181.800000 -6586.200000 0 494.400000 -6586.200000 0 494.400000 -6779.500000 0 338.100000 -6779.500000 0
+saveState
+updateCtm 11420.000000 0.000000 0.000000 -8760.000000 20530.000000 749550.000000
+drawSoftMaskedImage 1143 877 1143 877 JPEG 71324 PPM 3007249
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 -6740.476000 215.488000 -6748.476000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 -6740.476000 220.592000 -6748.476000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 -6740.476000 225.696000 -6748.476000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 -6740.476000 230.800000 -6748.476000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 -6748.076000 241.388000 -6756.076000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 -6748.076000 246.492000 -6756.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 -6748.076000 251.596000 -6756.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 -6748.076000 256.700000 -6756.076000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 -6755.776000 267.188000 -6763.776000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 -6755.776000 272.292000 -6763.776000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 -6755.776000 277.396000 -6763.776000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 -6755.776000 282.500000 -6763.776000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 -6763.276000 293.088000 -6771.276000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 -6763.276000 298.192000 -6771.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 -6763.276000 303.296000 -6771.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 -6763.276000 308.400000 -6771.276000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 -6725.476000 202.588000 -6733.476000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 -6706.176000 201.688000 -6714.176000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 -6686.876000 195.788000 -6694.876000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 -6686.876000 200.892000 -6694.876000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 -6667.476000 194.888000 -6675.476000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 -6667.476000 199.992000 -6675.476000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 -6648.176000 193.988000 -6656.176000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 -6648.176000 199.092000 -6656.176000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 -6628.876000 193.088000 -6636.876000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 -6628.876000 198.192000 -6636.876000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 -6756.776000 330.188000 -6764.776000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 -6756.776000 332.716000 -6764.776000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 -6756.776000 337.596000 -6764.776000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 -6756.776000 341.396000 -6764.776000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 -6756.776000 346.036000 -6764.776000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 -6756.776000 350.900000 -6764.776000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 -6756.776000 355.972000 -6764.776000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 -6756.776000 359.196000 -6764.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 -6756.776000 362.196000 -6764.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 -6756.776000 367.404000 -6764.776000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 -6756.776000 371.876000 -6764.776000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 -6756.776000 375.052000 -6764.776000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 -6737.276000 361.172000 -6745.276000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 -6737.276000 364.340000 -6745.276000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 -6737.276000 367.396000 -6745.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 -6737.276000 372.604000 -6745.276000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 -6737.276000 379.348000 -6745.276000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 -6737.276000 384.484000 -6745.276000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 -6737.276000 389.436000 -6745.276000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 -6737.276000 392.108000 -6745.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 -6737.276000 395.708000 -6745.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 -6737.276000 397.540000 -6745.276000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 -6737.276000 402.444000 -6745.276000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 -6737.276000 406.788000 -6745.276000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 -6717.676000 392.972000 -6725.676000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 -6717.676000 398.076000 -6725.676000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 -6717.676000 403.180000 -6725.676000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 -6717.676000 405.428000 -6725.676000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 -6717.676000 410.332000 -6725.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 -6717.676000 414.476000 -6725.676000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 -6590.108000 305.808000 -6604.108000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 -6590.108000 314.138000 -6604.108000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 -6590.108000 320.788000 -6604.108000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 -6590.108000 328.698000 -6604.108000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 -6590.108000 336.972000 -6604.108000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 -6590.108000 344.182000 -6604.108000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 -6590.108000 349.810000 -6604.108000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 -6590.108000 354.234000 -6604.108000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 -6590.108000 362.718000 -6604.108000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 -6590.108000 367.870000 -6604.108000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 -6590.108000 372.322000 -6604.108000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 -6590.108000 382.080000 -6604.108000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 -6590.108000 388.772000 -6604.108000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 -6590.108000 397.802000 -6604.108000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 -6590.108000 402.254000 -6604.108000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 -6590.108000 407.896000 -6604.108000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 -6713.000000 0 424.300000 -6713.000000 0 424.300000 -6652.300000 0 493.600000 -6652.300000 0 493.600000 -6713.000000 0 458.900000 -6713.000000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 -6661.900000 0 428.900000 -6661.900000 0 428.900000 -6655.900000 0 434.800000 -6655.900000 0 434.800000 -6661.900000 0 431.900000 -6661.900000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 -6673.000000 0 428.900000 -6673.000000 0 428.900000 -6667.000000 0 434.800000 -6667.000000 0 434.800000 -6673.000000 0 431.900000 -6673.000000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 -6684.100000 0 428.900000 -6684.100000 0 428.900000 -6678.100000 0 434.800000 -6678.100000 0 434.800000 -6684.100000 0 431.900000 -6684.100000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 -6695.200000 0 428.900000 -6695.200000 0 428.900000 -6689.200000 0 434.800000 -6689.200000 0 434.800000 -6695.200000 0 431.900000 -6695.200000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 -6706.300000 0 428.900000 -6706.300000 0 428.900000 -6700.300000 0 434.800000 -6700.300000 0 434.800000 -6706.300000 0 431.900000 -6706.300000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -6654.776000 443.288000 -6662.776000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 -6654.776000 445.816000 -6662.776000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 -6654.776000 450.600000 -6662.776000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 -6654.776000 454.496000 -6662.776000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 -6654.776000 459.136000 -6662.776000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 -6654.776000 464.000000 -6662.776000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 -6654.776000 468.976000 -6662.776000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 -6654.776000 472.304000 -6662.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 -6654.776000 475.208000 -6662.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 -6654.776000 480.520000 -6662.776000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 -6654.776000 484.992000 -6662.776000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 -6654.776000 488.168000 -6662.776000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -6665.876000 443.352000 -6673.876000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 -6665.876000 447.920000 -6673.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 -6665.876000 452.976000 -6673.876000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 -6665.876000 457.400000 -6673.876000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 -6665.876000 462.472000 -6673.876000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 -6665.876000 465.800000 -6673.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 -6665.876000 468.904000 -6673.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 -6665.876000 473.816000 -6673.876000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 -6665.876000 478.888000 -6673.876000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 -6665.876000 482.064000 -6673.876000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -6676.976000 442.872000 -6684.976000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 -6676.976000 446.040000 -6684.976000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 -6676.976000 448.992000 -6684.976000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 -6676.976000 454.304000 -6684.976000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 -6676.976000 461.048000 -6684.976000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 -6676.976000 466.184000 -6684.976000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 -6676.976000 471.136000 -6684.976000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 -6676.976000 473.808000 -6684.976000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 -6676.976000 477.408000 -6684.976000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 -6676.976000 479.240000 -6684.976000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 -6676.976000 484.144000 -6684.976000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 -6676.976000 488.488000 -6684.976000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -6688.076000 443.384000 -6696.076000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 -6688.076000 448.464000 -6696.076000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 -6688.076000 453.424000 -6696.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 -6688.076000 456.696000 -6696.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 -6688.076000 459.800000 -6696.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 -6688.076000 462.032000 -6696.076000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 -6688.076000 466.936000 -6696.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 -6688.076000 471.080000 -6696.076000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -6699.176000 443.272000 -6707.176000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 -6699.176000 448.376000 -6707.176000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 -6699.176000 453.480000 -6707.176000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 -6699.176000 455.728000 -6707.176000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 -6699.176000 460.632000 -6707.176000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 -6699.176000 464.776000 -6707.176000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -9344.200000 0 114.800000 -9344.200000 0 114.800000 -9301.400000 0 72.000000 -9301.400000 0 72.000000 -9344.200000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 1013610.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 108.000000 546.200000 0 540.000000 546.200000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 546.200000 0
+eoFillPath subpath 1 108.000000 72.000000 0 540.000000 72.000000 0 540.000000 245.800000 0 108.000000 245.800000 0 108.000000 72.000000 0
+eoFillPath subpath 1 108.000000 245.800000 0 157.400000 245.800000 0 157.400000 546.200000 0 108.000000 546.200000 0 108.000000 245.800000 0
+eoFillPath subpath 1 490.500000 245.800000 0 540.000000 245.800000 0 540.000000 546.200000 0 490.500000 546.200000 0 490.500000 245.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 15740.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 108.000000 701.300000 0 540.000000 701.300000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 701.300000 0
+eoFillPath subpath 1 108.000000 76.200000 0 540.000000 76.200000 0 540.000000 90.100000 0 108.000000 90.100000 0 108.000000 76.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 108.100000 719.948000 121.892000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 121.908000 719.948000 131.364000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 131.412000 719.948000 136.484000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 136.516000 719.948000 148.532000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 148.516000 719.948000 158.292000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 158.324000 719.948000 168.452000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 168.420000 719.948000 176.740000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 176.724000 719.948000 186.564000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 186.532000 719.948000 191.604000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 191.636000 719.948000 197.396000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 197.444000 719.948000 202.516000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 202.500000 719.948000 211.700000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 210.500000 719.948000 214.932000 703.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 214.900000 719.948000 221.476000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 221.508000 719.948000 229.828000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 229.812000 719.948000 236.084000 703.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 236.116000 719.948000 241.188000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 241.220000 719.948000 250.420000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 250.420000 719.948000 254.852000 703.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 254.820000 719.948000 264.596000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 264.628000 719.948000 274.404000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 274.436000 719.948000 281.012000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 103 1 0 0 0 1200.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 672.936000 116.884000 660.936000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 116.596000 672.936000 124.684000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 124.696000 672.936000 133.228000 660.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 133.192000 672.936000 138.928000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.892000 672.936000 144.808000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.796000 672.936000 152.608000 660.936000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 655.936000 225.304000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 226.096000 655.936000 234.088000 643.936000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 234.100000 655.936000 241.828000 643.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 241.804000 655.936000 248.896000 643.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 249.304000 655.936000 253.108000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 253.600000 655.936000 261.280000 643.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 261.196000 655.936000 268.348000 643.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 268.396000 655.936000 276.124000 643.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 276.100000 655.936000 280.912000 643.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 280.900000 655.936000 286.636000 643.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 286.600000 655.936000 293.368000 643.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 293.896000 655.936000 297.700000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 298.096000 655.936000 301.924000 643.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 301.900000 655.936000 308.056000 643.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 308.500000 655.936000 312.304000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 312.700000 655.936000 319.852000 643.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 320.200000 655.936000 324.004000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 324.496000 655.936000 330.652000 643.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 330.700000 655.936000 342.076000 643.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 342.004000 655.936000 349.156000 643.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 349.204000 655.936000 353.032000 643.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 353.008000 655.936000 356.836000 643.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 357.208000 655.936000 361.012000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 361.408000 655.936000 368.128000 643.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 368.212000 655.936000 375.436000 643.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 375.412000 655.936000 386.788000 643.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 386.812000 655.936000 394.492000 643.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 394.408000 655.936000 401.560000 643.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 401.608000 655.936000 407.344000 643.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 407.308000 655.936000 412.120000 643.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 412.204000 655.936000 423.580000 643.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 423.508000 655.936000 430.600000 643.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 430.612000 655.936000 438.340000 643.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 438.316000 655.936000 443.128000 643.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 443.620000 655.936000 447.424000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 447.820000 655.936000 455.548000 643.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 455.524000 655.936000 462.616000 643.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 462.628000 655.936000 469.384000 643.936000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 469.432000 655.936000 474.244000 643.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 474.628000 655.936000 478.432000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 478.828000 655.936000 483.640000 643.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 483.724000 655.936000 490.948000 643.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 491.320000 655.936000 495.124000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 495.520000 655.936000 500.332000 643.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 500.320000 655.936000 508.048000 643.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 508.120000 655.936000 515.212000 643.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 515.620000 655.936000 519.424000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 519.820000 655.936000 527.080000 643.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 527.116000 655.936000 530.944000 643.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 530.920000 655.936000 535.732000 643.936000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.100000 655.936000 540.144000 643.936000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 642.036000 228.220000 630.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 228.196000 642.036000 235.924000 630.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 235.900000 642.036000 242.992000 630.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 243.100000 642.036000 250.828000 630.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 250.804000 642.036000 254.608000 630.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 256.504000 642.036000 260.308000 630.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.300000 642.036000 272.560000 630.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 272.596000 642.036000 280.324000 630.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 280.300000 642.036000 287.392000 630.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 287.404000 642.036000 293.140000 630.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 293.104000 642.036000 300.196000 630.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 302.200000 642.036000 306.004000 630.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 308.104000 642.036000 315.256000 630.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 315.304000 642.036000 319.132000 630.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 319.108000 642.036000 322.936000 630.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 324.808000 642.036000 328.612000 630.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 330.604000 642.036000 338.332000 630.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 338.308000 642.036000 345.532000 630.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 345.604000 642.036000 353.332000 630.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 353.308000 642.036000 357.352000 630.036000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 357.304000 642.036000 364.984000 630.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 365.008000 642.036000 372.100000 630.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 372.112000 642.036000 377.848000 630.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 377.908000 642.036000 381.736000 630.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 381.712000 642.036000 387.868000 630.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 387.916000 642.036000 395.644000 630.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 395.620000 642.036000 402.772000 630.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 402.724000 642.036000 410.404000 630.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 410.428000 642.036000 414.256000 630.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 414.328000 642.036000 421.420000 630.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 423.424000 642.036000 427.228000 630.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.220000 642.036000 433.660000 630.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 433.624000 642.036000 440.848000 630.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 440.920000 642.036000 448.144000 630.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 448.120000 642.036000 455.800000 630.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 455.824000 642.036000 461.980000 630.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 463.828000 642.036000 467.632000 630.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 469.624000 642.036000 476.776000 630.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 476.824000 642.036000 482.560000 630.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 482.524000 642.036000 489.616000 630.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 491.620000 642.036000 495.424000 630.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 497.416000 642.036000 503.572000 630.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 503.620000 642.036000 508.432000 630.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 508.420000 642.036000 515.644000 630.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 515.620000 642.036000 521.356000 630.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 521.320000 642.036000 528.412000 630.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 528.424000 642.036000 536.104000 630.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 536.224000 642.036000 540.028000 630.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.200000 642.036000 544.004000 630.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 628.136000 229.492000 616.136000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 229.504000 628.136000 237.232000 616.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 237.208000 628.136000 241.036000 616.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 241.108000 628.136000 247.264000 616.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 247.504000 628.136000 251.308000 616.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 251.704000 628.136000 255.532000 616.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 255.508000 628.136000 263.236000 616.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 263.308000 628.136000 270.028000 616.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 270.004000 628.136000 273.832000 616.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 273.808000 628.136000 281.536000 616.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 281.608000 628.136000 289.288000 616.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 289.204000 628.136000 296.296000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 296.308000 628.136000 302.464000 616.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 302.908000 628.136000 306.712000 616.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 307.204000 628.136000 314.296000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 314.308000 628.136000 321.076000 616.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 321.004000 628.136000 328.096000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 328.108000 628.136000 333.844000 616.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 333.808000 628.136000 340.576000 616.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 340.708000 628.136000 345.520000 616.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 345.508000 628.136000 353.236000 616.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 353.308000 628.136000 357.136000 616.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 357.004000 628.136000 364.732000 616.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 364.708000 628.136000 372.388000 616.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 372.712000 628.136000 376.516000 616.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.008000 628.136000 381.448000 616.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 381.412000 628.136000 387.148000 616.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 387.112000 628.136000 394.336000 616.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 394.408000 628.136000 405.784000 616.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 406.504000 628.136000 410.308000 616.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 410.500000 628.136000 417.220000 616.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 417.196000 628.136000 424.348000 616.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 424.396000 628.136000 432.124000 616.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 432.100000 628.136000 439.828000 616.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 439.804000 628.136000 446.896000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 446.908000 628.136000 454.588000 616.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 454.912000 628.136000 458.716000 616.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 459.112000 628.136000 466.792000 616.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 466.816000 628.136000 474.040000 616.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 474.016000 628.136000 481.240000 616.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 481.216000 628.136000 488.896000 616.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 488.920000 628.136000 495.076000 616.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 495.520000 628.136000 499.324000 616.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 499.720000 628.136000 504.532000 616.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 504.520000 628.136000 511.744000 616.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 512.524000 628.136000 516.328000 616.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 516.400000 628.136000 523.120000 616.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 523.096000 628.136000 530.188000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 530.200000 628.136000 535.936000 616.136000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 628.136000 540.044000 616.136000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 614.236000 228.592000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 228.604000 614.236000 235.756000 602.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 235.804000 614.236000 239.632000 602.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 239.608000 614.236000 245.764000 602.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 246.112000 614.236000 249.916000 602.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 251.008000 614.236000 254.812000 602.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 254.900000 614.236000 262.580000 602.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 262.604000 614.236000 269.756000 602.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 269.708000 614.236000 275.864000 602.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 275.912000 614.236000 280.724000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 280.712000 614.236000 287.864000 602.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 288.212000 614.236000 292.016000 602.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 293.216000 614.236000 297.020000 602.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 296.900000 614.236000 304.580000 602.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 304.604000 614.236000 311.828000 602.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 311.804000 614.236000 316.616000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 316.604000 614.236000 323.756000 602.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 323.804000 614.236000 328.616000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 328.604000 614.236000 335.828000 602.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 335.804000 614.236000 342.896000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 342.908000 614.236000 349.064000 602.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 349.112000 614.236000 352.916000 602.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 353.612000 614.236000 357.416000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 358.112000 614.236000 365.204000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 365.216000 614.236000 370.028000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 370.016000 614.236000 376.736000 602.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 376.712000 614.236000 380.516000 602.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.308000 614.236000 385.112000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 385.904000 614.236000 390.644000 602.236000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 391.304000 614.236000 395.108000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 395.804000 614.236000 399.632000 602.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 399.608000 614.236000 403.436000 602.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 403.508000 614.236000 410.768000 602.236000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 410.708000 614.236000 417.800000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 418.604000 614.236000 422.408000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 423.200000 614.236000 428.012000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 428.000000 614.236000 435.224000 602.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 436.004000 614.236000 439.808000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 440.504000 614.236000 447.764000 602.236000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 447.800000 614.236000 454.892000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 454.904000 614.236000 461.996000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 462.008000 614.236000 469.688000 602.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 470.312000 614.236000 474.116000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.908000 614.236000 482.060000 602.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 482.804000 614.236000 486.608000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 487.304000 614.236000 493.460000 602.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 493.508000 614.236000 498.320000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 498.308000 614.236000 505.532000 602.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 505.508000 614.236000 512.228000 602.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 512.204000 614.236000 519.464000 602.236000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 520.208000 614.236000 524.012000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 524.804000 614.236000 532.028000 602.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 532.004000 614.236000 539.732000 602.236000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 614.236000 543.904000 602.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 600.336000 229.228000 588.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 229.204000 600.336000 236.356000 588.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 236.404000 600.336000 244.132000 588.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 244.108000 600.336000 251.788000 588.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 252.412000 600.336000 256.216000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 256.816000 600.336000 262.972000 588.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 263.020000 600.336000 270.244000 588.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 270.820000 600.336000 274.624000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 275.320000 600.336000 280.060000 588.336000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 280.624000 600.336000 284.428000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 285.124000 600.336000 292.804000 588.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 292.720000 600.336000 299.944000 588.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 300.016000 600.336000 307.744000 588.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 307.720000 600.336000 311.008000 588.336000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 311.020000 600.336000 315.832000 588.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 316.420000 600.336000 320.224000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 320.920000 600.336000 328.648000 588.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 328.624000 600.336000 335.776000 588.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 335.824000 600.336000 342.592000 588.336000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 342.628000 600.336000 349.720000 588.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 350.332000 600.336000 354.136000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.736000 600.336000 359.548000 588.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 359.536000 600.336000 366.760000 588.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 367.432000 600.336000 371.236000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 371.932000 600.336000 377.668000 588.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 377.632000 600.336000 385.360000 588.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 385.432000 600.336000 393.160000 588.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 393.736000 600.336000 397.540000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.140000 600.336000 402.952000 588.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 402.940000 600.336000 410.164000 588.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 410.740000 600.336000 414.544000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 415.240000 600.336000 420.052000 588.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 420.136000 600.336000 427.864000 588.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 427.840000 600.336000 434.932000 588.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 435.544000 600.336000 439.348000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 439.948000 600.336000 446.104000 588.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 446.152000 600.336000 450.964000 588.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 450.952000 600.336000 458.176000 588.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 458.152000 600.336000 463.888000 588.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 463.852000 600.336000 470.944000 588.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 471.556000 600.336000 475.360000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 476.152000 600.336000 483.304000 588.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 483.352000 600.336000 488.164000 588.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 488.656000 600.336000 492.460000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 493.156000 600.336000 497.968000 588.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 497.956000 600.336000 505.684000 588.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 505.756000 600.336000 512.848000 588.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 513.352000 600.336000 517.156000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 517.852000 600.336000 521.680000 588.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 521.656000 600.336000 528.808000 588.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 528.856000 600.336000 535.012000 588.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 535.060000 600.336000 539.872000 588.336000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 600.336000 543.904000 588.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 586.436000 232.876000 574.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 232.900000 586.436000 236.728000 574.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 236.704000 586.436000 244.432000 574.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 244.408000 586.436000 252.136000 574.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 252.208000 586.436000 257.020000 574.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 257.008000 586.436000 264.100000 574.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 266.512000 586.436000 270.316000 574.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 272.716000 586.436000 277.156000 574.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 277.120000 586.436000 284.344000 574.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 284.416000 586.436000 290.152000 574.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 292.516000 586.436000 296.320000 574.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 298.720000 586.436000 304.876000 574.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 304.924000 586.436000 312.148000 574.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 312.124000 586.436000 323.500000 574.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 323.524000 586.436000 330.616000 574.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 330.628000 586.436000 335.440000 574.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 335.428000 586.436000 343.156000 574.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 343.132000 586.436000 346.960000 574.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 347.032000 586.436000 354.760000 574.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 354.736000 586.436000 362.416000 574.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 362.440000 586.436000 366.244000 574.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 368.644000 586.436000 372.448000 574.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 374.848000 586.436000 382.840000 574.436000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 382.852000 586.436000 390.580000 574.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 390.556000 586.436000 397.648000 574.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 397.660000 586.436000 403.396000 574.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 403.456000 586.436000 410.548000 574.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 412.960000 586.436000 416.764000 574.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 419.164000 586.436000 426.316000 574.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 426.364000 586.436000 432.100000 574.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 432.064000 586.436000 439.156000 574.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 441.568000 586.436000 445.372000 574.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 447.772000 586.436000 454.492000 574.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.468000 586.436000 461.692000 574.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 461.668000 586.436000 469.396000 574.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 469.468000 586.436000 475.624000 574.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 475.564000 586.436000 482.656000 574.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 482.668000 586.436000 488.404000 574.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 488.464000 586.436000 495.232000 574.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 495.160000 586.436000 502.252000 574.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 502.360000 586.436000 508.516000 574.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 510.856000 586.436000 514.660000 574.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 517.060000 586.436000 521.872000 574.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 521.956000 586.436000 529.180000 574.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 529.156000 586.436000 536.380000 574.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 536.356000 586.436000 540.160000 574.436000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 586.436000 543.904000 574.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 572.536000 227.656000 560.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 572.536000 235.432000 560.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 235.408000 572.536000 242.128000 560.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 242.104000 572.536000 249.832000 560.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 250.408000 572.536000 254.212000 560.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 255.004000 572.536000 262.156000 560.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 262.204000 572.536000 268.360000 560.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 269.704000 572.536000 273.508000 560.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 273.500000 572.536000 277.220000 560.536000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 277.196000 572.536000 284.348000 560.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 284.396000 572.536000 295.772000 560.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 295.796000 572.536000 301.952000 560.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 302.492000 572.536000 306.296000 560.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 306.992000 572.536000 314.144000 560.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.192000 572.536000 321.920000 560.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 321.896000 572.536000 329.576000 560.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 330.992000 572.536000 334.796000 560.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 334.800000 572.536000 338.520000 560.536000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 338.496000 572.536000 345.588000 560.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 345.600000 572.536000 349.428000 560.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 349.500000 572.536000 353.328000 560.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 353.304000 572.536000 357.132000 560.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 357.108000 572.536000 364.200000 560.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 364.212000 572.536000 370.368000 560.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 370.416000 572.536000 374.220000 560.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 374.820000 572.536000 378.624000 560.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 379.320000 572.536000 386.472000 560.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 386.520000 572.536000 394.248000 560.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 394.224000 572.536000 401.904000 560.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 402.624000 572.536000 406.428000 560.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 407.124000 572.536000 413.844000 560.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 413.820000 572.536000 420.972000 560.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 421.020000 572.536000 428.748000 560.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 428.724000 572.536000 436.452000 560.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 436.428000 572.536000 443.520000 560.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 443.532000 572.536000 451.212000 560.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 451.836000 572.536000 455.640000 560.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 456.336000 572.536000 460.776000 560.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 460.740000 572.536000 466.476000 560.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 466.536000 572.536000 474.264000 560.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 474.240000 572.536000 478.068000 560.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 478.044000 572.536000 482.856000 560.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 482.940000 572.536000 489.096000 560.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 489.840000 572.536000 493.644000 560.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 494.340000 572.536000 501.492000 560.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 501.540000 572.536000 509.268000 560.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 509.244000 572.536000 516.924000 560.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 517.440000 572.536000 521.244000 560.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 522.036000 572.536000 528.804000 560.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 528.732000 572.536000 535.824000 560.536000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 572.536000 540.044000 560.536000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 558.636000 229.180000 546.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 229.204000 558.636000 236.296000 546.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.308000 558.636000 241.120000 546.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 241.108000 558.636000 248.260000 546.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 248.308000 558.636000 255.988000 546.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 255.904000 558.636000 259.732000 546.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 259.804000 558.636000 266.896000 546.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 266.908000 558.636000 273.064000 546.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 273.808000 558.636000 277.612000 546.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 278.512000 558.636000 282.952000 546.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 282.916000 558.636000 288.652000 546.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 288.616000 558.636000 295.840000 546.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 295.912000 558.636000 307.288000 546.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 308.008000 558.636000 311.812000 546.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 312.604000 558.636000 323.980000 546.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 324.004000 558.636000 330.772000 546.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 331.600000 558.636000 335.404000 546.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 336.196000 558.636000 343.420000 546.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 343.396000 558.636000 353.656000 546.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 353.692000 558.636000 361.420000 546.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 362.188000 558.636000 365.992000 546.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 366.892000 558.636000 374.572000 546.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 374.488000 558.636000 381.640000 546.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 381.688000 558.636000 387.424000 546.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 387.388000 558.636000 395.068000 546.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 395.092000 558.636000 402.184000 546.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.196000 558.636000 409.924000 546.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 409.900000 558.636000 413.704000 546.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.604000 558.636000 418.408000 546.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 419.200000 558.636000 423.940000 546.636000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 424.696000 558.636000 428.500000 546.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.292000 558.636000 436.444000 546.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 436.492000 558.636000 440.320000 546.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 440.296000 558.636000 446.452000 546.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 446.500000 558.636000 453.724000 546.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 454.504000 558.636000 458.308000 546.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 459.100000 558.636000 466.360000 546.636000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 466.396000 558.636000 473.488000 546.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 473.500000 558.636000 480.592000 546.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 480.604000 558.636000 488.284000 546.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 489.904000 558.636000 493.708000 546.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 493.700000 558.636000 500.420000 546.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 500.396000 558.636000 507.548000 546.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 507.596000 558.636000 515.324000 546.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 515.300000 558.636000 522.980000 546.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 523.004000 558.636000 526.832000 546.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 526.808000 558.636000 533.900000 546.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 533.912000 558.636000 540.068000 546.636000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 558.636000 543.904000 546.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 544.736000 228.652000 532.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.700000 544.736000 236.428000 532.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 236.404000 544.736000 244.084000 532.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 244.108000 544.736000 247.912000 532.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 247.912000 544.736000 255.064000 532.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 255.112000 544.736000 258.916000 532.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 258.800000 544.736000 266.792000 532.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 266.804000 544.736000 272.540000 532.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 272.504000 544.736000 278.660000 532.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 278.708000 544.736000 283.520000 532.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 283.508000 544.736000 287.312000 532.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 287.312000 544.736000 294.464000 532.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 294.512000 544.736000 298.340000 532.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 298.316000 544.736000 305.996000 532.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 306.020000 544.736000 309.824000 532.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 309.824000 544.736000 317.084000 532.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 317.120000 544.736000 320.948000 532.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 320.924000 544.736000 325.736000 532.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 325.724000 544.736000 329.528000 532.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 329.528000 544.736000 337.256000 532.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 337.232000 544.736000 344.324000 532.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 344.336000 544.736000 350.072000 532.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 350.036000 544.736000 357.128000 532.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 357.140000 544.736000 360.944000 532.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 360.944000 544.736000 364.664000 532.736000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 364.640000 544.736000 372.368000 532.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 372.344000 544.736000 378.500000 532.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 378.548000 544.736000 383.360000 532.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 383.348000 544.736000 387.152000 532.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 387.152000 544.736000 390.980000 532.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 390.956000 544.736000 398.684000 532.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 398.660000 544.736000 402.464000 532.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 402.464000 544.736000 409.184000 532.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 409.160000 544.736000 416.312000 532.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 416.360000 544.736000 422.516000 532.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 422.564000 544.736000 429.656000 532.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 429.668000 544.736000 433.472000 532.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 433.472000 544.736000 440.696000 532.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 440.672000 544.736000 445.112000 532.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 445.076000 544.736000 448.880000 532.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 448.880000 544.736000 455.972000 532.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 455.984000 544.736000 467.360000 532.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 467.384000 544.736000 474.476000 532.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 474.488000 544.736000 480.224000 532.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 480.188000 544.736000 487.868000 532.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 487.892000 544.736000 494.984000 532.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 494.996000 544.736000 502.724000 532.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 502.700000 544.736000 509.420000 532.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 509.396000 544.736000 513.224000 532.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 513.200000 544.736000 520.292000 532.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 520.304000 544.736000 526.460000 532.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 526.508000 544.736000 530.312000 532.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 103 1 0 0 0 1200.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 518.936000 115.744000 506.936000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 115.696000 518.936000 123.784000 506.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.796000 518.936000 132.328000 506.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 132.292000 518.936000 140.824000 506.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 140.788000 518.936000 149.368000 506.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 149.392000 518.936000 155.308000 506.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 155.296000 518.936000 163.108000 506.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 163.096000 518.936000 167.272000 506.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 167.296000 518.936000 176.536000 506.936000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 176.500000 518.936000 184.744000 506.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 184.696000 518.936000 192.940000 506.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 192.892000 518.936000 205.384000 506.936000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 501.936000 229.468000 489.936000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 229.504000 501.936000 236.596000 489.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.608000 501.936000 243.760000 489.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 243.712000 501.936000 251.392000 489.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 251.416000 501.936000 255.244000 489.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 255.220000 501.936000 262.948000 489.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 263.020000 501.936000 270.700000 489.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 271.120000 501.936000 274.924000 489.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 275.416000 501.936000 282.640000 489.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 282.616000 501.936000 291.136000 489.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 291.616000 501.936000 295.420000 489.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 295.912000 501.936000 300.352000 489.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 300.316000 501.936000 306.052000 489.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 306.112000 501.936000 313.336000 489.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 313.312000 501.936000 324.688000 489.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 325.108000 501.936000 328.912000 489.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 329.404000 501.936000 334.216000 489.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 334.300000 501.936000 342.028000 489.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 342.004000 501.936000 349.096000 489.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 349.600000 501.936000 353.404000 489.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 353.896000 501.936000 361.156000 489.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 361.192000 501.936000 365.020000 489.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 364.996000 501.936000 369.808000 489.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 369.796000 501.936000 376.516000 489.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 376.600000 501.936000 384.328000 489.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 384.304000 501.936000 391.396000 489.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 391.408000 501.936000 399.136000 489.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 399.508000 501.936000 403.312000 489.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 403.804000 501.936000 407.632000 489.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 407.608000 501.936000 413.764000 489.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 414.304000 501.936000 418.108000 489.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 418.600000 501.936000 425.752000 489.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 425.800000 501.936000 433.528000 489.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 433.504000 501.936000 440.728000 489.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 440.704000 501.936000 445.516000 489.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.504000 501.936000 453.232000 489.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 453.304000 501.936000 460.396000 489.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.408000 501.936000 466.144000 489.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 466.504000 501.936000 470.308000 489.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 470.800000 501.936000 478.480000 489.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 478.504000 501.936000 485.728000 489.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 485.704000 501.936000 492.928000 489.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 492.904000 501.936000 498.640000 489.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 499.204000 501.936000 503.008000 489.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 503.500000 501.936000 508.312000 489.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 508.300000 501.936000 515.524000 489.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 516.004000 501.936000 519.808000 489.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 520.300000 501.936000 525.112000 489.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 525.100000 501.936000 532.828000 489.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 532.900000 501.936000 539.992000 489.936000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 501.936000 543.904000 489.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 488.036000 225.328000 476.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 225.304000 488.036000 232.456000 476.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 232.504000 488.036000 240.232000 476.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 240.208000 488.036000 247.936000 476.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 247.912000 488.036000 255.592000 476.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 255.616000 488.036000 261.352000 476.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 261.316000 488.036000 268.084000 476.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 268.120000 488.036000 271.924000 476.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 271.924000 488.036000 277.660000 476.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 277.624000 488.036000 284.848000 476.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 284.824000 488.036000 292.048000 476.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 292.024000 488.036000 303.400000 476.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 303.424000 488.036000 307.228000 476.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 307.228000 488.036000 311.032000 476.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 311.032000 488.036000 315.772000 476.036000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 315.736000 488.036000 323.464000 476.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 323.440000 488.036000 327.244000 476.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 327.244000 488.036000 332.056000 476.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 332.044000 488.036000 339.772000 476.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 339.748000 488.036000 343.576000 476.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 343.552000 488.036000 349.708000 476.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 349.756000 488.036000 353.560000 476.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 353.560000 488.036000 359.296000 476.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 359.260000 488.036000 366.484000 476.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 366.460000 488.036000 373.684000 476.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 373.660000 488.036000 385.036000 476.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 385.060000 488.036000 388.864000 476.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 388.864000 488.036000 392.692000 476.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 392.668000 488.036000 398.824000 476.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 398.872000 488.036000 402.676000 476.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 402.676000 488.036000 409.828000 476.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 409.876000 488.036000 413.680000 476.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 413.680000 488.036000 420.400000 476.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 420.376000 488.036000 427.600000 476.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 427.576000 488.036000 435.304000 476.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 435.280000 488.036000 442.048000 476.036000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 442.084000 488.036000 449.176000 476.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 449.188000 488.036000 456.916000 476.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 456.892000 488.036000 461.704000 476.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 461.692000 488.036000 465.520000 476.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 465.496000 488.036000 472.720000 476.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 472.696000 488.036000 480.424000 476.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 480.400000 488.036000 487.552000 476.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 487.600000 488.036000 491.428000 476.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 491.404000 488.036000 495.208000 476.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 495.900000 488.036000 506.160000 476.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 506.196000 488.036000 513.348000 476.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 513.396000 488.036000 519.552000 476.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 519.600000 488.036000 527.328000 476.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 527.304000 488.036000 534.396000 476.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 534.408000 488.036000 540.144000 476.036000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 488.036000 543.904000 476.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 474.136000 228.652000 462.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.700000 474.136000 236.428000 462.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 236.404000 474.136000 244.084000 462.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 244.804000 474.136000 248.608000 462.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 248.700000 474.136000 256.380000 462.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 256.404000 474.136000 262.140000 462.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 262.104000 474.136000 268.872000 462.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 268.908000 474.136000 276.000000 462.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 276.012000 474.136000 281.748000 462.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 280.416000 474.136000 284.220000 462.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 284.616000 474.136000 288.420000 462.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.816000 474.136000 295.968000 462.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 296.016000 474.136000 299.844000 462.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 299.820000 474.136000 307.044000 462.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 307.116000 474.136000 314.844000 462.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 314.820000 474.136000 322.500000 462.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 322.824000 474.136000 326.628000 462.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 327.024000 474.136000 337.284000 462.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 337.320000 474.136000 341.148000 462.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 341.124000 474.136000 345.936000 462.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 345.924000 474.136000 353.652000 462.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 354.024000 474.136000 357.828000 462.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 358.320000 474.136000 365.472000 462.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 365.724000 474.136000 369.528000 462.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 369.924000 474.136000 380.184000 462.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 380.220000 474.136000 387.372000 462.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 387.324000 474.136000 393.480000 462.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 393.528000 474.136000 401.256000 462.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 401.232000 474.136000 408.912000 462.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 408.936000 474.136000 416.088000 462.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 416.040000 474.136000 422.196000 462.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 422.244000 474.136000 426.072000 462.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 426.048000 474.136000 433.776000 462.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 434.244000 474.136000 438.048000 462.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.444000 474.136000 445.596000 462.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 445.644000 474.136000 453.372000 462.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 453.348000 474.136000 461.028000 462.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 461.352000 474.136000 465.156000 462.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 465.552000 474.136000 472.272000 462.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 472.248000 474.136000 476.076000 462.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 476.148000 474.136000 483.372000 462.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 483.348000 474.136000 488.160000 462.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 488.148000 474.136000 495.876000 462.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 495.852000 474.136000 502.944000 462.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 502.956000 474.136000 509.112000 462.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 509.160000 474.136000 513.204000 462.136000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 513.156000 474.136000 518.892000 462.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 518.952000 474.136000 526.104000 462.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 526.056000 474.136000 532.776000 462.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 532.860000 474.136000 540.120000 462.136000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 474.136000 543.904000 462.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 460.236000 225.940000 448.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 225.904000 460.236000 233.128000 448.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 233.200000 460.236000 238.936000 448.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 240.304000 460.236000 244.108000 448.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.608000 460.236000 253.336000 448.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 253.312000 460.236000 260.464000 448.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 260.512000 460.236000 268.240000 448.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 268.216000 460.236000 275.896000 448.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 275.920000 460.236000 279.964000 448.236000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 279.916000 460.236000 290.176000 448.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 290.212000 460.236000 297.364000 448.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 297.412000 460.236000 303.568000 448.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 303.508000 460.236000 311.236000 448.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 311.308000 460.236000 318.460000 448.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 318.412000 460.236000 326.092000 448.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 326.116000 460.236000 329.944000 448.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 329.920000 460.236000 337.012000 448.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.024000 460.236000 343.180000 448.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 343.228000 460.236000 347.032000 448.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.532000 460.236000 352.336000 448.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 353.836000 460.236000 362.644000 448.236000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 362.740000 460.236000 369.892000 448.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 369.940000 460.236000 374.752000 448.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 374.644000 460.236000 382.372000 448.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 383.848000 460.236000 387.652000 448.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 389.152000 460.236000 393.964000 448.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 393.952000 460.236000 401.176000 448.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 401.152000 460.236000 411.412000 448.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 411.448000 460.236000 418.540000 448.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 418.552000 460.236000 422.380000 448.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 422.452000 460.236000 428.608000 448.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 428.548000 460.236000 432.352000 448.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 435.352000 460.236000 439.156000 448.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 439.200000 460.236000 446.880000 448.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 446.904000 460.236000 450.732000 448.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 450.708000 460.236000 456.864000 448.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 456.912000 460.236000 464.640000 448.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 466.008000 460.236000 469.812000 448.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 471.312000 460.236000 476.124000 448.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 476.112000 460.236000 483.336000 448.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 483.312000 460.236000 493.572000 448.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 493.608000 460.236000 500.700000 448.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 500.712000 460.236000 504.540000 448.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 504.612000 460.236000 510.768000 448.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 512.208000 460.236000 516.012000 448.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 517.608000 460.236000 524.760000 448.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 524.808000 460.236000 532.536000 448.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 532.404000 460.236000 540.084000 448.236000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.200000 460.236000 544.004000 448.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 446.336000 227.656000 434.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 446.336000 235.432000 434.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 235.408000 446.336000 242.500000 434.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 242.512000 446.336000 249.604000 434.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 249.616000 446.336000 254.428000 434.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 254.416000 446.336000 260.572000 434.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 262.720000 446.336000 266.524000 434.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 268.624000 446.336000 275.776000 434.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 275.824000 446.336000 281.560000 434.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 281.524000 446.336000 288.616000 434.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 290.728000 446.336000 294.532000 434.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 296.632000 446.336000 303.784000 434.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 303.832000 446.336000 307.660000 434.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 307.636000 446.336000 311.464000 434.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 313.540000 446.336000 317.344000 434.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 319.444000 446.336000 325.600000 434.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 325.648000 446.336000 330.460000 434.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 330.448000 446.336000 337.672000 434.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 337.648000 446.336000 343.384000 434.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 343.348000 446.336000 350.440000 434.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 350.452000 446.336000 358.132000 434.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 360.352000 446.336000 364.156000 434.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 366.256000 446.336000 373.984000 434.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 373.960000 446.336000 381.052000 434.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 381.064000 446.336000 386.800000 434.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 386.860000 446.336000 393.952000 434.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 393.964000 446.336000 397.768000 434.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.868000 446.336000 403.672000 434.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 405.772000 446.336000 413.764000 434.336000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 413.776000 446.336000 421.504000 434.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 421.480000 446.336000 428.572000 434.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 432.784000 446.336000 436.588000 434.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 436.700000 446.336000 443.468000 434.336000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 443.504000 446.336000 450.656000 434.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.608000 446.336000 457.328000 434.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.412000 446.336000 465.140000 434.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 465.116000 446.336000 472.844000 434.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 472.820000 446.336000 484.196000 434.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 486.320000 446.336000 490.124000 434.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 492.224000 446.336000 498.944000 434.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 498.920000 446.336000 502.748000 434.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 502.820000 446.336000 509.912000 434.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 509.924000 446.336000 517.076000 434.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 517.028000 446.336000 524.756000 434.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 524.732000 446.336000 531.824000 434.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 531.836000 446.336000 537.572000 434.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 536.336000 446.336000 540.140000 434.336000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 446.336000 543.904000 434.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 432.436000 229.180000 420.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 229.204000 432.436000 234.940000 420.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 234.904000 432.436000 242.128000 420.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 242.104000 432.436000 249.328000 420.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 249.400000 432.436000 260.776000 420.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 264.196000 432.436000 268.000000 420.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 271.696000 432.436000 278.848000 420.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 278.800000 432.436000 286.528000 420.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 286.504000 432.436000 294.184000 420.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 301.408000 432.436000 305.212000 420.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 305.200000 432.436000 312.880000 420.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 312.904000 432.436000 320.632000 420.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 320.608000 432.436000 326.764000 420.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 326.812000 432.436000 331.624000 420.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 331.612000 432.436000 339.292000 420.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 339.316000 432.436000 346.468000 420.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 346.420000 432.436000 354.148000 420.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 355.120000 432.436000 358.924000 420.436000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 365.116000 432.436000 368.920000 420.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 369.000000 432.436000 372.828000 420.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 372.804000 432.436000 378.540000 420.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 378.600000 432.436000 385.824000 420.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 385.800000 432.436000 393.528000 420.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 393.504000 432.436000 397.332000 420.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.404000 432.436000 405.132000 420.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 405.108000 432.436000 412.788000 420.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 416.412000 432.436000 420.216000 420.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 423.816000 432.436000 431.496000 420.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 431.520000 432.436000 438.744000 420.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 438.720000 432.436000 445.872000 420.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 445.920000 432.436000 451.656000 420.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 451.620000 432.436000 459.300000 420.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 459.324000 432.436000 463.128000 420.436000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 466.620000 432.436000 470.424000 420.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.024000 432.436000 481.176000 420.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 481.224000 432.436000 488.952000 420.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 488.928000 432.436000 496.608000 420.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 500.232000 432.436000 504.036000 420.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 507.636000 432.436000 514.860000 420.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 514.836000 432.436000 519.648000 420.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 519.636000 432.436000 527.364000 420.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 527.436000 432.436000 534.528000 420.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 534.540000 432.436000 540.276000 420.436000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 432.436000 543.904000 420.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 418.536000 229.228000 406.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 229.204000 418.536000 236.428000 406.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 236.500000 418.536000 244.228000 406.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 244.204000 418.536000 250.360000 406.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 250.300000 418.536000 257.392000 406.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 257.404000 418.536000 265.132000 406.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 265.204000 418.536000 272.428000 406.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 272.404000 418.536000 276.232000 406.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 276.208000 418.536000 283.888000 406.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 284.008000 418.536000 287.812000 406.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.004000 418.536000 295.156000 406.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 295.204000 418.536000 302.884000 406.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 302.800000 418.536000 310.480000 406.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 310.504000 418.536000 314.332000 406.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 314.404000 418.536000 318.232000 406.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 318.208000 418.536000 325.360000 406.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 325.312000 418.536000 333.040000 406.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 333.112000 418.536000 339.832000 406.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 339.808000 418.536000 346.900000 406.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 346.912000 418.536000 353.068000 406.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 353.308000 418.536000 357.112000 406.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 357.304000 418.536000 364.456000 406.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 364.504000 418.536000 372.232000 406.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 372.208000 418.536000 379.888000 406.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 380.008000 418.536000 383.812000 406.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 384.004000 418.536000 390.724000 406.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 390.700000 418.536000 394.528000 406.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 394.600000 418.536000 401.692000 406.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 401.704000 418.536000 408.856000 406.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 408.808000 418.536000 416.536000 406.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 416.512000 418.536000 423.604000 406.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 423.616000 418.536000 429.352000 406.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 429.412000 418.536000 435.568000 406.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 435.712000 418.536000 439.516000 406.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 439.708000 418.536000 446.860000 406.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 446.908000 418.536000 452.644000 406.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 452.608000 418.536000 459.700000 406.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 459.808000 418.536000 463.612000 406.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 463.804000 418.536000 471.064000 406.536000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 471.100000 418.536000 478.192000 406.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 478.204000 418.536000 485.884000 406.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 485.908000 418.536000 490.720000 406.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 490.912000 418.536000 494.716000 406.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 494.908000 418.536000 502.636000 406.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 502.612000 418.536000 509.704000 406.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 509.716000 418.536000 515.452000 406.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 515.512000 418.536000 522.604000 406.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 522.712000 418.536000 526.516000 406.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 526.708000 418.536000 533.860000 406.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 533.908000 418.536000 540.064000 406.536000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 418.536000 543.904000 406.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 404.636000 231.760000 392.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 231.796000 404.636000 238.888000 392.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 238.900000 404.636000 242.728000 392.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 242.704000 404.636000 246.532000 392.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 246.508000 404.636000 250.312000 392.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1400.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 372.892000 119.580000 358.892000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 119.594000 372.892000 129.548000 358.892000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 129.590000 372.892000 139.082000 358.892000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 139.096000 372.892000 147.426000 358.892000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.398000 372.892000 154.090000 358.892000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 154.104000 372.892000 158.976000 358.892000 1.000000 0.000000 0.000000 1.000000
+drawChar 159.004000 372.892000 169.672000 358.892000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 169.700000 372.892000 179.136000 358.892000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 179.094000 372.892000 185.786000 358.892000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 185.800000 372.892000 195.754000 358.892000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 350.636000 231.112000 338.636000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 231.100000 350.636000 234.928000 338.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 235.000000 350.636000 240.736000 338.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 240.700000 350.636000 247.792000 338.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 247.804000 350.636000 254.524000 338.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 254.500000 350.636000 259.312000 338.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 259.300000 350.636000 263.128000 338.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 263.200000 350.636000 269.968000 338.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 271.696000 350.636000 275.500000 338.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.300000 350.636000 285.028000 338.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 285.004000 350.636000 292.096000 338.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 292.108000 350.636000 298.864000 338.636000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 298.912000 350.636000 303.724000 338.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 305.416000 350.636000 309.220000 338.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 311.020000 350.636000 315.832000 338.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 315.820000 350.636000 323.044000 338.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 324.820000 350.636000 328.624000 338.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 330.424000 350.636000 335.236000 338.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 335.224000 350.636000 342.952000 338.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 343.024000 350.636000 350.116000 338.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 351.724000 350.636000 355.528000 338.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 357.328000 350.636000 365.008000 338.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 365.032000 350.636000 372.184000 338.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.136000 350.636000 379.864000 338.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 379.936000 350.636000 384.748000 338.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 384.736000 350.636000 390.472000 338.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 390.532000 350.636000 397.300000 338.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 398.932000 350.636000 402.736000 338.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 404.632000 350.636000 408.460000 338.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 408.436000 350.636000 414.592000 338.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 416.236000 350.636000 420.040000 338.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 421.936000 350.636000 429.088000 338.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 430.732000 350.636000 434.536000 338.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 436.336000 350.636000 444.016000 338.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 444.040000 350.636000 451.768000 338.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 451.744000 350.636000 458.836000 338.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 458.848000 350.636000 465.004000 338.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 465.052000 350.636000 469.864000 338.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 471.556000 350.636000 475.360000 338.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 477.160000 350.636000 484.840000 338.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 484.864000 350.636000 492.016000 338.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 491.968000 350.636000 496.780000 338.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 496.864000 350.636000 504.592000 338.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 504.568000 350.636000 510.304000 338.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 510.364000 350.636000 517.588000 338.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 517.564000 350.636000 524.788000 338.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 524.764000 350.636000 536.140000 338.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 536.164000 350.636000 539.968000 338.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 350.636000 543.904000 338.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 336.736000 229.720000 324.736000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 229.696000 336.736000 237.424000 324.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 237.400000 336.736000 244.120000 324.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 244.204000 336.736000 251.932000 324.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 253.000000 336.736000 256.804000 324.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 258.004000 336.736000 264.724000 324.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 264.700000 336.736000 271.924000 324.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 271.900000 336.736000 283.276000 324.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 283.300000 336.736000 287.740000 324.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 287.800000 336.736000 295.024000 324.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 295.000000 336.736000 300.736000 324.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 300.700000 336.736000 305.512000 324.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 305.500000 336.736000 311.656000 324.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 312.796000 336.736000 316.600000 324.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 317.800000 336.736000 328.060000 324.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 328.096000 336.736000 335.188000 324.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 335.200000 336.736000 340.936000 324.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 340.900000 336.736000 347.992000 324.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 349.096000 336.736000 352.900000 324.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.196000 336.736000 361.924000 324.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 361.900000 336.736000 369.124000 324.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 369.196000 336.736000 374.008000 324.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 374.992000 336.736000 378.796000 324.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 379.996000 336.736000 386.152000 324.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 386.200000 336.736000 391.012000 324.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 391.000000 336.736000 398.152000 324.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 398.104000 336.736000 405.832000 324.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 405.904000 336.736000 413.584000 324.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 413.500000 336.736000 420.652000 324.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 420.700000 336.736000 426.436000 324.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 426.400000 336.736000 434.080000 324.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 435.304000 336.736000 439.108000 324.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 440.308000 336.736000 447.460000 324.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 447.508000 336.736000 452.320000 324.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 453.412000 336.736000 457.216000 324.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 458.416000 336.736000 463.228000 324.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 463.216000 336.736000 470.944000 324.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 471.016000 336.736000 478.108000 324.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 479.116000 336.736000 482.920000 324.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.120000 336.736000 488.932000 324.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.016000 336.736000 492.844000 324.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 492.820000 336.736000 504.196000 324.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 504.220000 336.736000 511.312000 324.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 512.416000 336.736000 516.220000 324.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 517.420000 336.736000 522.232000 324.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 522.220000 336.736000 529.948000 324.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 530.020000 336.736000 533.848000 324.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 533.824000 336.736000 539.980000 324.736000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 336.736000 543.904000 324.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 322.836000 229.228000 310.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 229.204000 322.836000 236.428000 310.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 236.500000 322.836000 244.228000 310.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 244.204000 322.836000 250.360000 310.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 250.300000 322.836000 257.392000 310.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 258.304000 322.836000 262.108000 310.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 263.104000 322.836000 273.364000 310.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 273.400000 322.836000 280.552000 310.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 280.504000 322.836000 286.660000 310.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 287.500000 322.836000 291.304000 310.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 292.396000 322.836000 300.076000 310.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 299.992000 322.836000 307.720000 310.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 307.696000 322.836000 311.524000 310.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 311.596000 322.836000 315.424000 310.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 315.400000 322.836000 320.212000 310.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 320.200000 322.836000 324.004000 310.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 325.000000 322.836000 328.804000 310.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 329.704000 322.836000 335.860000 310.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 335.908000 322.836000 343.132000 310.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 344.008000 322.836000 347.812000 310.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 348.808000 322.836000 355.960000 310.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 356.812000 322.836000 360.616000 310.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 361.612000 322.836000 369.292000 310.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 369.208000 322.836000 376.432000 310.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 376.504000 322.836000 382.240000 310.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 382.204000 322.836000 387.016000 310.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 387.100000 322.836000 390.928000 310.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 390.904000 322.836000 398.128000 310.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 398.104000 322.836000 405.832000 310.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 406.708000 322.836000 410.512000 310.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 411.508000 322.836000 418.732000 310.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 418.804000 322.836000 423.244000 310.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 424.108000 322.836000 427.912000 310.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 428.812000 322.836000 433.624000 310.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 433.612000 322.836000 441.340000 310.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 441.412000 322.836000 448.504000 310.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 449.416000 322.836000 453.220000 310.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.216000 322.836000 461.896000 310.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 461.920000 322.836000 469.072000 310.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 469.024000 322.836000 476.752000 310.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 476.824000 322.836000 481.636000 310.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 481.624000 322.836000 487.360000 310.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 487.324000 322.836000 494.092000 310.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 495.028000 322.836000 498.832000 310.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 499.732000 322.836000 507.460000 310.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 507.436000 322.836000 514.588000 310.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 514.636000 322.836000 522.316000 310.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 523.240000 322.836000 527.044000 310.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 528.040000 322.836000 532.852000 310.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 532.840000 322.836000 540.064000 310.836000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.200000 322.836000 544.004000 310.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 308.936000 229.180000 296.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 229.204000 308.936000 236.296000 296.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.800000 308.936000 240.604000 296.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 241.096000 308.936000 246.832000 296.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 246.796000 308.936000 253.888000 296.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 253.900000 308.936000 265.276000 296.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 265.300000 308.936000 272.524000 296.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 272.500000 308.936000 279.268000 296.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 279.304000 308.936000 286.396000 296.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 286.408000 308.936000 294.088000 296.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 294.604000 308.936000 298.408000 296.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 299.008000 308.936000 303.820000 296.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 303.808000 308.936000 311.032000 296.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 311.608000 308.936000 315.412000 296.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 315.904000 308.936000 327.280000 296.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 327.304000 308.936000 334.456000 296.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 334.408000 308.936000 341.668000 296.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 341.704000 308.936000 348.796000 296.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 349.300000 308.936000 353.104000 296.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 353.704000 308.936000 359.440000 296.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 359.404000 308.936000 366.628000 296.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 366.700000 308.936000 373.924000 296.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 373.900000 308.936000 385.276000 296.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 385.804000 308.936000 389.608000 296.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 390.100000 308.936000 394.540000 296.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 394.504000 308.936000 401.728000 296.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 401.800000 308.936000 407.536000 296.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 408.004000 308.936000 411.808000 296.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 412.408000 308.936000 416.236000 296.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 416.212000 308.936000 421.024000 296.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 421.108000 308.936000 424.912000 296.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.404000 308.936000 429.208000 296.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.700000 308.936000 437.692000 296.936000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 437.704000 308.936000 445.432000 296.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 445.408000 308.936000 452.500000 296.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.004000 308.936000 456.808000 296.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 457.408000 308.936000 463.144000 296.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 463.108000 308.936000 470.332000 296.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 470.404000 308.936000 477.628000 296.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 477.604000 308.936000 488.980000 296.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 489.508000 308.936000 493.312000 296.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 493.804000 308.936000 497.632000 296.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 497.608000 308.936000 503.764000 296.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 504.304000 308.936000 508.108000 296.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 508.708000 308.936000 516.388000 296.936000 1.000000 0.000000 0.000000 1.000000 q
+drawChar 516.412000 308.936000 524.140000 296.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 524.116000 308.936000 527.944000 296.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 527.920000 308.936000 532.732000 296.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 532.816000 308.936000 539.908000 296.936000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.200000 308.936000 544.004000 296.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 295.036000 227.656000 283.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 295.036000 239.080000 283.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 239.008000 295.036000 246.160000 283.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 246.208000 295.036000 250.036000 283.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 250.012000 295.036000 253.840000 283.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 253.912000 295.036000 257.716000 283.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 258.112000 295.036000 261.916000 283.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.312000 295.036000 269.464000 283.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 269.512000 295.036000 277.240000 283.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 277.216000 295.036000 284.896000 283.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 285.316000 295.036000 289.120000 283.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 289.612000 295.036000 295.768000 283.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 295.816000 295.036000 303.496000 283.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 303.412000 295.036000 310.564000 283.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 310.612000 295.036000 316.348000 283.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 316.312000 295.036000 322.468000 283.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 322.516000 295.036000 329.608000 283.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 329.620000 295.036000 333.448000 283.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 333.424000 295.036000 340.192000 283.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 340.624000 295.036000 344.428000 283.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 344.824000 295.036000 349.264000 283.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 349.228000 295.036000 356.956000 283.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 357.028000 295.036000 362.764000 283.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.728000 295.036000 370.456000 283.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 370.432000 295.036000 374.260000 283.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 374.332000 295.036000 380.488000 283.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 380.428000 295.036000 388.156000 283.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 388.228000 295.036000 395.320000 283.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 395.332000 295.036000 403.012000 283.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 403.336000 295.036000 407.140000 283.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 407.740000 295.036000 418.000000 283.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 418.036000 295.036000 421.864000 283.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 421.840000 295.036000 426.652000 283.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 426.640000 295.036000 434.368000 283.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 434.740000 295.036000 438.544000 283.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.940000 295.036000 446.164000 283.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 446.236000 295.036000 453.964000 283.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 453.940000 295.036000 457.768000 283.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 457.840000 295.036000 464.608000 283.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 464.944000 295.036000 468.748000 283.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 469.240000 295.036000 476.392000 283.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 476.836000 295.036000 480.640000 283.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 481.036000 295.036000 485.848000 283.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 485.836000 295.036000 493.060000 283.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 493.036000 295.036000 496.864000 283.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 496.936000 295.036000 500.764000 283.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 500.740000 295.036000 507.832000 283.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 507.844000 295.036000 512.656000 283.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 513.040000 295.036000 516.844000 283.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 517.336000 295.036000 524.488000 283.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 524.536000 295.036000 532.264000 283.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 532.240000 295.036000 539.920000 283.036000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 295.036000 543.904000 283.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 281.136000 228.652000 269.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.700000 281.136000 232.504000 269.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 232.504000 281.136000 242.764000 269.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 242.800000 281.136000 249.952000 269.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 250.000000 281.136000 256.156000 269.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 256.204000 281.136000 263.932000 269.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 263.908000 281.136000 271.588000 269.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 271.612000 281.136000 278.764000 269.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 278.812000 281.136000 284.968000 269.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 285.016000 281.136000 288.844000 269.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 288.820000 281.136000 296.548000 269.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 296.524000 281.136000 300.328000 269.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1400.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 249.392000 119.720000 235.392000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 119.706000 249.392000 124.494000 235.392000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.508000 249.392000 134.462000 235.392000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.504000 249.392000 139.292000 235.392000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 139.306000 249.392000 149.260000 235.392000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 149.302000 249.392000 159.312000 235.392000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 159.298000 249.392000 164.170000 235.392000 1.000000 0.000000 0.000000 1.000000
+drawChar 164.198000 249.392000 174.978000 235.392000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 174.992000 249.392000 184.610000 235.392000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 184.596000 249.392000 194.214000 235.392000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 194.200000 249.392000 208.774000 235.392000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 227.136000 229.492000 215.136000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 229.504000 227.136000 237.232000 215.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 237.208000 227.136000 244.300000 215.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 245.212000 227.136000 249.016000 215.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 249.916000 227.136000 261.292000 215.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 261.316000 227.136000 268.540000 215.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 268.612000 227.136000 274.768000 215.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 274.816000 227.136000 279.628000 215.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 280.420000 227.136000 284.224000 215.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 285.220000 227.136000 292.948000 215.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 292.924000 227.136000 300.148000 215.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 300.220000 227.136000 305.032000 215.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 305.020000 227.136000 312.172000 215.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 312.124000 227.136000 319.804000 215.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 319.924000 227.136000 323.752000 215.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 323.728000 227.136000 330.820000 215.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 331.732000 227.136000 335.536000 215.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 336.436000 227.136000 344.116000 215.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 344.140000 227.136000 347.968000 215.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 347.944000 227.136000 355.036000 215.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 355.048000 227.136000 361.768000 215.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 361.744000 227.136000 368.836000 215.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 369.844000 227.136000 373.648000 215.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 374.644000 227.136000 381.868000 215.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 381.844000 227.136000 386.284000 215.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 387.148000 227.136000 390.952000 215.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 391.948000 227.136000 396.388000 215.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 396.352000 227.136000 404.080000 215.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 404.152000 227.136000 409.888000 215.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 409.852000 227.136000 417.580000 215.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 417.556000 227.136000 421.384000 215.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 421.456000 227.136000 426.268000 215.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 426.160000 227.136000 433.888000 215.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 433.864000 227.136000 439.600000 215.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 439.660000 227.136000 446.752000 215.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.664000 227.136000 451.468000 215.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 452.464000 227.136000 460.192000 215.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 460.168000 227.136000 467.848000 215.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 467.872000 227.136000 475.096000 215.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 475.072000 227.136000 482.800000 215.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 483.772000 227.136000 487.576000 215.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 488.476000 227.136000 495.568000 215.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 495.580000 227.136000 503.308000 215.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 503.284000 227.136000 508.096000 215.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 508.180000 227.136000 515.272000 215.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 515.284000 227.136000 521.020000 215.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 520.984000 227.136000 524.812000 215.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 524.788000 227.136000 532.516000 215.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 532.588000 227.136000 540.268000 215.136000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.200000 227.136000 544.004000 215.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 213.236000 226.312000 201.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.300000 213.236000 234.028000 201.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 234.100000 213.236000 241.192000 201.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 242.404000 213.236000 246.208000 201.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 247.408000 213.236000 255.088000 201.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 255.004000 213.236000 258.832000 201.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 258.808000 213.236000 266.536000 201.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 266.608000 213.236000 270.436000 201.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 270.508000 213.236000 278.236000 201.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 278.212000 213.236000 285.892000 201.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 287.116000 213.236000 290.920000 201.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 292.216000 213.236000 297.952000 201.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 297.916000 213.236000 305.140000 201.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 305.212000 213.236000 312.436000 201.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 312.412000 213.236000 323.788000 201.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 324.916000 213.236000 328.720000 201.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 330.016000 213.236000 333.844000 201.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 333.820000 213.236000 339.976000 201.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 341.224000 213.236000 345.028000 201.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 346.324000 213.236000 353.476000 201.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 355.828000 213.236000 359.632000 201.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 359.800000 213.236000 368.464000 201.236000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 368.296000 213.236000 372.124000 201.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 372.100000 213.236000 378.820000 201.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 378.796000 213.236000 383.608000 201.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 383.596000 213.236000 390.820000 201.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 390.892000 213.236000 396.628000 201.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 396.592000 213.236000 400.420000 201.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 400.396000 213.236000 407.548000 201.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 407.596000 213.236000 415.324000 201.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 416.500000 213.236000 420.304000 201.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 421.504000 213.236000 427.660000 201.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 427.708000 213.236000 432.520000 201.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 432.508000 213.236000 439.276000 201.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 439.312000 213.236000 443.140000 201.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 443.116000 213.236000 450.208000 201.236000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 450.300000 213.236000 454.104000 201.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 456.600000 213.236000 461.412000 201.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 461.400000 213.236000 468.552000 201.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 468.504000 213.236000 476.184000 201.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 476.304000 213.236000 480.132000 201.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 480.108000 213.236000 487.200000 201.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 487.212000 213.236000 491.016000 201.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 492.216000 213.236000 496.020000 201.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 497.220000 213.236000 504.900000 201.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 504.924000 213.236000 512.148000 201.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 512.124000 213.236000 519.852000 201.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 519.828000 213.236000 527.508000 201.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 527.628000 213.236000 535.356000 201.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 535.332000 213.236000 540.144000 201.236000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 213.236000 543.904000 201.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 199.336000 225.940000 187.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 225.904000 199.336000 231.640000 187.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 231.700000 199.336000 238.924000 187.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 238.900000 199.336000 250.276000 187.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 251.896000 199.336000 255.700000 187.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 257.392000 199.336000 264.544000 187.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 264.592000 199.336000 272.320000 187.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 273.988000 199.336000 277.792000 187.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.484000 199.336000 286.636000 187.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 286.684000 199.336000 294.412000 187.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 294.388000 199.336000 299.200000 187.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 299.188000 199.336000 303.016000 187.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 302.992000 199.336000 310.672000 187.336000 1.000000 0.000000 0.000000 1.000000 q
+drawChar 310.696000 199.336000 318.424000 187.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 318.496000 199.336000 325.588000 187.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 327.100000 199.336000 330.904000 187.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 332.704000 199.336000 340.384000 187.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 340.300000 199.336000 347.392000 187.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 347.404000 199.336000 354.556000 187.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 354.604000 199.336000 358.432000 187.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 358.408000 199.336000 365.500000 187.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 365.512000 199.336000 371.248000 187.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 373.012000 199.336000 376.816000 187.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 378.508000 199.336000 382.336000 187.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 382.312000 199.336000 390.040000 187.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 393.412000 199.336000 397.216000 187.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 397.400000 199.336000 406.148000 187.336000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 406.196000 199.336000 413.924000 187.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 413.900000 199.336000 421.580000 187.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 421.604000 199.336000 425.432000 187.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 425.408000 199.336000 432.560000 187.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 432.608000 199.336000 440.336000 187.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 440.312000 199.336000 447.992000 187.336000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 448.000000 199.336000 451.804000 187.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.496000 199.336000 457.300000 187.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 458.992000 199.336000 467.740000 187.336000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 467.788000 199.336000 471.616000 187.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 471.592000 199.336000 479.272000 187.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 479.296000 199.336000 487.024000 187.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 487.000000 199.336000 491.812000 187.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 493.504000 199.336000 497.308000 187.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 499.000000 199.336000 505.720000 187.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 505.696000 199.336000 513.424000 187.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 513.400000 199.336000 520.552000 187.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 520.600000 199.336000 524.428000 187.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 524.404000 199.336000 530.140000 187.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 530.200000 199.336000 536.356000 187.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 536.296000 199.336000 540.100000 187.336000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 199.336000 543.904000 187.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 185.436000 226.312000 173.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.300000 185.436000 236.560000 173.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 236.596000 185.436000 243.820000 173.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 245.092000 185.436000 248.896000 173.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 250.288000 185.436000 257.512000 173.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 257.584000 185.436000 262.024000 173.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 263.380000 185.436000 267.184000 173.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 268.576000 185.436000 275.668000 173.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 275.680000 185.436000 282.832000 173.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 282.880000 185.436000 289.600000 173.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 289.576000 185.436000 297.304000 173.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 298.576000 185.436000 302.380000 173.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 303.772000 185.436000 310.996000 173.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 311.068000 185.436000 315.508000 173.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 316.864000 185.436000 320.668000 173.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 322.060000 185.436000 326.872000 173.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 326.860000 185.436000 334.588000 173.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 334.660000 185.436000 341.752000 173.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 343.060000 185.436000 346.864000 173.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 348.256000 185.436000 352.696000 173.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 352.660000 185.436000 359.884000 173.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 359.956000 185.436000 367.684000 173.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 367.660000 185.436000 373.396000 173.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 374.764000 185.436000 378.568000 173.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 379.960000 185.436000 387.640000 173.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 387.664000 185.436000 391.492000 173.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 391.468000 185.436000 399.988000 173.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 399.964000 185.436000 407.056000 173.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 407.068000 185.436000 412.804000 173.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 412.864000 185.436000 419.956000 173.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 419.968000 185.436000 427.696000 173.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 427.672000 185.436000 432.484000 173.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 433.876000 185.436000 437.680000 173.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 439.072000 185.436000 445.228000 173.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 445.276000 185.436000 450.088000 173.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 450.076000 185.436000 456.844000 173.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 456.880000 185.436000 460.708000 173.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 460.684000 185.436000 467.776000 173.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 467.788000 185.436000 473.944000 173.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 473.992000 185.436000 477.796000 173.436000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 479.092000 185.436000 482.896000 173.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.396000 185.436000 490.552000 173.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 490.600000 185.436000 498.328000 173.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 498.196000 185.436000 503.932000 173.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 503.896000 185.436000 509.632000 173.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 509.692000 185.436000 516.916000 173.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 516.892000 185.436000 524.620000 173.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 524.596000 185.436000 532.324000 173.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 532.396000 185.436000 540.076000 173.436000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 185.436000 543.904000 173.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 108.100000 90.136000 116.164000 78.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 115.600000 90.136000 122.752000 78.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 122.800000 90.136000 130.480000 78.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 130.504000 90.136000 137.596000 78.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.608000 90.136000 141.412000 78.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 141.400000 90.136000 149.032000 78.136000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 4327.800000 0 477.900000 4327.800000 0 477.900000 4637.600000 0 134.300000 4637.600000 0 134.300000 4327.800000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -353590.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 1338.800000 0 168.100000 1338.800000 0 168.100000 1343.800000 0 76.900000 1343.800000 0 76.900000 1338.800000 0
+eoFillPath subpath 1 163.100000 1343.700000 0 168.100000 1343.700000 0 168.100000 1474.300000 0 163.100000 1474.300000 0 163.100000 1343.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 1343.800000 0 163.100000 1343.800000 0 163.100000 1479.200000 0 72.000000 1479.200000 0 72.000000 1343.800000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 1474.880000 87.320000 1464.880000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 1474.880000 93.420000 1464.880000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 1474.880000 97.510000 1464.880000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 1474.880000 101.420000 1464.880000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 1474.880000 104.170000 1464.880000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 1474.880000 110.530000 1464.880000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 1474.880000 113.270000 1464.880000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 1474.880000 116.470000 1464.880000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 1474.880000 123.480000 1464.880000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 1474.880000 129.610000 1464.880000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 1474.880000 135.090000 1464.880000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 1474.880000 140.890000 1464.880000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 1474.880000 144.820000 1464.880000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 1474.880000 150.920000 1464.880000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 1474.880000 153.670000 1464.880000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 1474.880000 156.470000 1464.880000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 1348.000000 0 168.200000 1348.000000 0 168.200000 1463.200000 0 72.000000 1463.200000 0 72.000000 1348.000000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1416.152000 79.253000 1407.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 1416.152000 86.669000 1407.152000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 1416.152000 90.215000 1407.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 1416.152000 93.077000 1407.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 1416.152000 97.406000 1407.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 1416.152000 100.853000 1407.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 1416.152000 107.324000 1407.152000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 1416.152000 112.337000 1407.152000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 1416.152000 115.271000 1407.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 1416.152000 118.655000 1407.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 1416.152000 126.512000 1407.152000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 1416.152000 130.805000 1407.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 1416.152000 135.881000 1407.152000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 1416.152000 139.355000 1407.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 1416.152000 147.284000 1407.152000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 1416.152000 150.074000 1407.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 1416.152000 155.897000 1407.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 1416.152000 158.750000 1407.152000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 1416.152000 161.853000 1407.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1405.652000 82.124000 1396.652000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 1405.652000 87.137000 1396.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 1405.652000 90.071000 1396.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 1405.652000 93.356000 1396.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 1405.652000 100.403000 1396.652000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 1405.652000 104.921000 1396.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 1405.652000 109.205000 1396.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 1405.652000 117.737000 1396.652000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 1405.652000 123.119000 1396.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 1405.652000 128.996000 1396.652000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 1405.652000 132.605000 1396.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 1405.652000 138.392000 1396.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 1405.652000 141.749000 1396.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 1405.652000 149.507000 1396.652000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 1405.652000 153.800000 1396.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 1405.652000 158.876000 1396.652000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 1405.652000 161.853000 1396.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1395.152000 81.764000 1386.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 1395.152000 87.596000 1386.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 1395.152000 93.356000 1386.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 1395.152000 102.050000 1386.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 1395.152000 113.822000 1386.152000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 1395.152000 122.651000 1386.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 1395.152000 134.117000 1386.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 1395.152000 138.401000 1386.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 1395.152000 147.149000 1386.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 1395.152000 158.921000 1386.152000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 1395.152000 161.853000 1386.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1384.652000 79.271000 1375.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 1384.652000 84.338000 1375.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 1384.652000 89.621000 1375.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 1384.652000 94.643000 1375.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 1384.652000 100.502000 1375.652000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 1384.652000 106.262000 1375.652000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 1384.652000 111.518000 1375.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 1384.652000 116.216000 1375.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 1384.652000 119.249000 1375.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 1384.652000 122.363000 1375.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 1384.652000 128.186000 1375.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 1384.652000 131.345000 1375.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 1384.652000 137.060000 1375.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 1384.652000 140.147000 1375.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 1384.652000 145.007000 1375.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 1384.652000 148.598000 1375.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 1384.652000 151.460000 1375.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 1384.652000 155.789000 1375.652000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 1384.652000 158.933000 1375.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1374.152000 80.702000 1365.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 1374.152000 83.573000 1365.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 1374.152000 89.396000 1365.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 1374.152000 95.156000 1365.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 1374.152000 100.547000 1365.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 1374.152000 109.052000 1365.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 1374.152000 111.959000 1365.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 1374.152000 117.251000 1365.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 1374.152000 121.904000 1365.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 1374.152000 126.503000 1365.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 1374.152000 129.338000 1365.152000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 1374.152000 134.936000 1365.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 1374.152000 143.441000 1365.152000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 1374.152000 148.796000 1365.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 1374.152000 154.574000 1365.152000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 1374.152000 158.876000 1365.152000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 1374.152000 161.853000 1365.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1363.652000 79.271000 1354.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 1363.652000 85.094000 1354.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 1363.652000 88.703000 1354.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 1363.652000 94.112000 1354.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 1363.652000 97.244000 1354.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 1363.652000 103.058000 1354.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 1363.652000 108.890000 1354.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 1363.652000 111.950000 1354.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 1363.652000 115.271000 1354.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 1363.652000 120.338000 1354.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 1363.652000 125.621000 1354.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 1363.652000 131.363000 1354.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 1363.652000 134.558000 1354.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 1363.652000 140.048000 1354.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 1363.652000 145.430000 1354.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 1363.652000 150.551000 1354.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 1363.652000 155.960000 1354.652000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 1363.652000 158.933000 1354.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1353.152000 80.009000 1344.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 1353.152000 85.364000 1344.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 1353.152000 88.271000 1344.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 1353.152000 91.169000 1344.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 1353.152000 97.955000 1344.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 1353.152000 107.765000 1344.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 1353.152000 110.672000 1344.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 1353.152000 115.964000 1344.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 1353.152000 120.617000 1344.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 1353.152000 125.216000 1344.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 1353.152000 128.051000 1344.152000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 1353.152000 134.954000 1344.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 1353.152000 146.285000 1344.152000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 1353.152000 151.667000 1344.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 1353.152000 155.906000 1344.152000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 1353.152000 159.033000 1344.152000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 1343.700000 0 72.100000 1343.700000 0 72.100000 1479.200000 0 72.000000 1479.200000 0 72.000000 1343.700000 0
+eoFillPath subpath 1 163.100000 1343.700000 0 163.200000 1343.700000 0 163.200000 1479.200000 0 163.100000 1479.200000 0 163.100000 1343.700000 0
+eoFillPath subpath 1 72.000000 1479.100000 0 163.200000 1479.100000 0 163.200000 1479.200000 0 72.000000 1479.200000 0 72.000000 1479.100000 0
+eoFillPath subpath 1 72.000000 1343.700000 0 163.200000 1343.700000 0 163.200000 1343.800000 0 72.000000 1343.800000 0 72.000000 1343.700000 0
+saveState
+eoClipPath subpath 1 96.900000 1419.000000 0 138.300000 1419.000000 0 138.300000 1463.200000 0 96.900000 1463.200000 0 96.900000 1419.000000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -62710.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 1064.200000 0 165.500000 1064.200000 0 165.500000 1069.200000 0 76.900000 1069.200000 0 76.900000 1064.200000 0
+eoFillPath subpath 1 160.500000 1069.100000 0 165.500000 1069.100000 0 165.500000 1225.400000 0 160.500000 1225.400000 0 160.500000 1069.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 1069.200000 0 121.400000 1069.200000 0 121.400000 1230.300000 0 72.000000 1230.300000 0 72.000000 1069.200000 0
+saveState
+eoClipPath subpath 1 72.000000 1069.100000 0 160.500000 1069.100000 0 160.500000 1230.200000 0 72.000000 1230.200000 0 72.000000 1069.100000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -26010.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 1225.980000 89.280000 1215.980000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 1225.980000 95.630000 1215.980000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 1225.980000 99.520000 1215.980000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 1225.980000 102.270000 1215.980000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 1225.980000 108.450000 1215.980000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 1225.980000 112.610000 1215.980000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 1225.980000 118.510000 1215.980000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 1225.980000 121.670000 1215.980000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 1225.980000 124.470000 1215.980000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 1225.980000 130.830000 1215.980000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 1225.980000 133.970000 1215.980000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 1225.980000 137.920000 1215.980000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 1225.980000 144.230000 1215.980000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 1225.980000 150.350000 1215.980000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 1225.980000 153.570000 1215.980000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 1214.280000 95.000000 1204.280000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 1214.280000 97.770000 1204.280000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 1214.280000 103.000000 1204.280000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 1214.280000 109.330000 1204.280000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 1214.280000 117.470000 1204.280000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 1214.280000 123.620000 1204.280000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 1214.280000 128.800000 1204.280000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 1214.280000 135.130000 1204.280000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 1214.280000 141.250000 1204.280000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 1214.280000 145.410000 1204.280000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1199.452000 82.961000 1190.452000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 1199.452000 87.614000 1190.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 1199.452000 93.356000 1190.452000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 1199.452000 98.612000 1190.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 1199.452000 103.733000 1190.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 1199.452000 106.568000 1190.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 1199.452000 111.959000 1190.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 1199.452000 114.866000 1190.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 1199.452000 117.665000 1190.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 1199.452000 122.768000 1190.452000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 1199.452000 125.747000 1190.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 1199.452000 131.651000 1190.452000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 1199.452000 136.907000 1190.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 1199.452000 142.307000 1190.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 1199.452000 148.049000 1190.452000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 1199.452000 150.956000 1190.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 1199.452000 156.302000 1190.452000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1199.452000 159.253000 1190.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1188.952000 84.095000 1179.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 1188.952000 89.900000 1179.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 1188.952000 95.318000 1179.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 1188.952000 100.349000 1179.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 1188.952000 110.789000 1179.952000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 1188.952000 111.464000 1179.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 1188.952000 114.362000 1179.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 1188.952000 119.348000 1179.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 1188.952000 126.962000 1179.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 1188.952000 132.047000 1179.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 1188.952000 139.958000 1179.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 1188.952000 142.865000 1179.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 1188.952000 147.410000 1179.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 1188.952000 153.287000 1179.952000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 1188.952000 156.333000 1179.952000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1178.452000 84.095000 1169.452000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 1178.452000 89.468000 1169.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 1178.452000 94.121000 1169.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 1178.452000 99.899000 1169.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 1178.452000 105.218000 1169.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 1178.452000 109.502000 1169.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 1178.452000 115.649000 1169.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 1178.452000 122.327000 1169.452000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 1178.452000 127.718000 1169.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 1178.452000 132.002000 1169.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 1178.452000 138.149000 1169.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 1178.452000 145.205000 1169.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 1178.452000 150.992000 1169.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 1178.452000 156.311000 1169.452000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1178.452000 159.253000 1169.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1167.952000 82.394000 1158.952000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 1167.952000 86.705000 1158.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 1167.952000 91.322000 1158.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 1167.952000 94.913000 1158.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 1167.952000 98.054000 1158.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 1167.952000 102.014000 1158.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 1167.952000 104.876000 1158.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 1167.952000 113.435000 1158.952000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 1167.952000 118.718000 1158.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 1167.952000 121.949000 1158.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 1167.952000 125.063000 1158.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 1167.952000 130.886000 1158.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 1167.952000 134.045000 1158.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 1167.952000 138.005000 1158.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 1167.952000 143.792000 1158.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 1167.952000 149.111000 1158.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 1167.952000 151.964000 1158.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 1167.952000 156.293000 1158.952000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 1167.952000 159.153000 1158.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1157.452000 79.271000 1148.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 1157.452000 82.169000 1148.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 1157.452000 85.526000 1148.452000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 1157.452000 90.818000 1148.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 1157.452000 94.454000 1148.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 1157.452000 99.008000 1148.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 1157.452000 104.318000 1148.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 1157.452000 110.096000 1148.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 1157.452000 115.856000 1148.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 1157.452000 119.546000 1148.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 1157.452000 124.001000 1148.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 1157.452000 129.509000 1148.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 1157.452000 133.145000 1148.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 1157.452000 139.751000 1148.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 1157.452000 145.205000 1148.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 1157.452000 148.841000 1148.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 1157.452000 152.657000 1148.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 1157.452000 156.293000 1148.452000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1157.452000 159.253000 1148.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1146.952000 84.095000 1137.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 1146.952000 88.406000 1137.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 1146.952000 93.824000 1137.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 1146.952000 99.602000 1137.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 1146.952000 105.362000 1137.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 1146.952000 108.422000 1137.952000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 1146.952000 116.747000 1137.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 1146.952000 129.275000 1137.952000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 1146.952000 135.089000 1137.952000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 1146.952000 138.698000 1137.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 1146.952000 141.560000 1137.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 1146.952000 146.906000 1137.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 1146.952000 151.190000 1137.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 1146.952000 156.266000 1137.952000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1146.952000 159.253000 1137.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1136.452000 82.196000 1127.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 1136.452000 87.560000 1127.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 1136.452000 92.213000 1127.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 1136.452000 96.551000 1127.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 1136.452000 101.708000 1127.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 1136.452000 107.216000 1127.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 1136.452000 111.653000 1127.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 1136.452000 118.961000 1127.452000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 1136.452000 124.316000 1127.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 1136.452000 128.654000 1127.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 1136.452000 133.172000 1127.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 1136.452000 138.995000 1127.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 1136.452000 143.612000 1127.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 1136.452000 148.913000 1127.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 1136.452000 153.197000 1127.452000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 1136.452000 156.333000 1127.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1125.952000 80.009000 1116.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 1125.952000 85.319000 1116.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 1125.952000 91.061000 1116.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 1125.952000 100.052000 1116.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 1125.952000 113.993000 1116.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 1125.952000 116.873000 1116.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 1125.952000 120.410000 1116.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 1125.952000 126.296000 1116.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 1125.952000 135.350000 1116.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 1125.952000 145.106000 1116.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 1125.952000 150.893000 1116.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 1125.952000 156.212000 1116.952000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1125.952000 159.253000 1116.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1115.452000 82.196000 1106.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 1115.452000 87.560000 1106.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 1115.452000 93.392000 1106.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 1115.452000 99.152000 1106.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 1115.452000 101.960000 1106.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 1115.452000 107.306000 1106.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 1115.452000 111.905000 1106.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 1115.452000 115.640000 1106.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 1115.452000 122.444000 1106.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 1115.452000 127.898000 1106.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 1115.452000 135.575000 1106.452000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 1115.452000 141.380000 1106.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 1115.452000 145.241000 1106.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 1115.452000 150.803000 1106.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 1115.452000 156.302000 1106.452000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1115.452000 159.253000 1106.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1104.952000 80.009000 1095.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 1104.952000 85.796000 1095.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 1104.952000 91.115000 1095.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 1104.952000 95.399000 1095.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 1104.952000 100.718000 1095.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 1104.952000 107.054000 1095.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 1104.952000 118.097000 1095.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 1104.952000 123.524000 1095.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 1104.952000 129.401000 1095.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 1104.952000 131.768000 1095.952000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 1104.952000 135.413000 1095.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 1104.952000 141.659000 1095.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 1104.952000 150.965000 1095.952000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 1104.952000 156.320000 1095.952000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1104.952000 159.253000 1095.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1094.452000 81.017000 1085.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 1094.452000 84.608000 1085.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 1094.452000 89.963000 1085.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 1094.452000 92.870000 1085.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 1094.452000 98.693000 1085.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 1094.452000 103.310000 1085.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 1094.452000 107.243000 1085.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 1094.452000 116.081000 1085.452000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 1094.452000 121.886000 1085.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 1094.452000 127.205000 1085.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 1094.452000 132.983000 1085.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 1094.452000 136.943000 1085.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 1094.452000 143.846000 1085.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 1094.452000 148.184000 1085.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 1094.452000 153.260000 1085.452000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 1094.452000 156.433000 1085.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1083.952000 79.271000 1074.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 1083.952000 85.094000 1074.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 1083.952000 90.854000 1074.952000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 1083.952000 93.653000 1074.952000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 1069.100000 0 72.100000 1069.100000 0 72.100000 1230.300000 0 72.000000 1230.300000 0 72.000000 1069.100000 0
+eoFillPath subpath 1 160.500000 1069.100000 0 160.600000 1069.100000 0 160.600000 1230.300000 0 160.500000 1230.300000 0 160.500000 1069.100000 0
+eoFillPath subpath 1 72.000000 1230.200000 0 160.600000 1230.200000 0 160.600000 1230.300000 0 72.000000 1230.300000 0 72.000000 1230.200000 0
+eoFillPath subpath 1 72.000000 1069.100000 0 160.600000 1069.100000 0 160.600000 1069.200000 0 72.000000 1069.200000 0 72.000000 1069.100000 0
+saveState
+eoClipPath subpath 1 108.000000 581.600000 0 178.900000 581.600000 0 178.900000 638.300000 0 108.000000 638.300000 0 108.000000 581.600000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 21030.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -3476.700000 0 165.500000 -3476.700000 0 165.500000 -3471.700000 0 76.900000 -3471.700000 0 76.900000 -3476.700000 0
+eoFillPath subpath 1 160.500000 -3471.800000 0 165.500000 -3471.800000 0 165.500000 -3363.000000 0 160.500000 -3363.000000 0 160.500000 -3471.800000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -3471.700000 0 160.500000 -3471.700000 0 160.500000 -3358.100000 0 72.000000 -3358.100000 0 72.000000 -3471.700000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -3362.448000 83.771000 -3371.448000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 -3362.448000 89.594000 -3371.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 -3362.448000 92.465000 -3371.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 -3362.448000 97.568000 -3371.448000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 -3362.448000 100.943000 -3371.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 -3362.448000 106.955000 -3371.448000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 -3362.448000 110.447000 -3371.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 -3362.448000 114.425000 -3371.448000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 -3362.448000 119.717000 -3371.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 -3362.448000 127.493000 -3371.448000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 -3362.448000 130.949000 -3371.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 -3362.448000 136.574000 -3371.448000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 -3362.448000 141.920000 -3371.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 -3362.448000 147.365000 -3371.448000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 -3362.448000 151.703000 -3371.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 -3362.448000 156.320000 -3371.448000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -3362.448000 159.153000 -3371.448000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -3372.948000 81.764000 -3381.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -3372.948000 85.130000 -3381.948000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 -3372.948000 88.712000 -3381.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 -3372.948000 94.022000 -3381.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 -3372.948000 98.306000 -3381.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -3372.948000 102.455000 -3381.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 -3372.948000 106.676000 -3381.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 -3372.948000 110.312000 -3381.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 -3372.948000 114.920000 -3381.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 -3372.948000 119.060000 -3381.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 -3372.948000 125.450000 -3381.948000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 -3372.948000 130.832000 -3381.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 -3372.948000 139.445000 -3381.948000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 -3372.948000 145.169000 -3381.948000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 -3372.948000 148.076000 -3381.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 -3372.948000 153.323000 -3381.948000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -3372.948000 156.433000 -3381.948000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -3383.448000 80.009000 -3392.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -3383.448000 82.871000 -3392.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 -3383.448000 88.316000 -3392.448000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 -3383.448000 94.094000 -3392.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 -3383.448000 96.947000 -3392.448000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 -3383.448000 104.948000 -3392.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 -3383.448000 113.705000 -3392.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 -3383.448000 119.492000 -3392.448000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 -3383.448000 124.811000 -3392.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 -3383.448000 132.848000 -3392.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 -3383.448000 141.605000 -3392.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 -3383.448000 144.467000 -3392.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 -3383.448000 148.103000 -3392.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 -3383.448000 150.965000 -3392.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 -3383.448000 156.311000 -3392.448000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -3383.448000 159.253000 -3392.448000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -3393.948000 80.999000 -3402.948000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 -3393.948000 90.539000 -3402.948000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 -3393.948000 95.318000 -3402.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 -3393.948000 99.602000 -3402.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -3393.948000 102.473000 -3402.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 -3393.948000 108.260000 -3402.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 -3393.948000 110.762000 -3402.948000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 -3393.948000 115.316000 -3402.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 -3393.948000 122.156000 -3402.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 -3393.948000 132.299000 -3402.948000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 -3393.948000 136.970000 -3402.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 -3393.948000 139.877000 -3402.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 -3393.948000 142.775000 -3402.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 -3393.948000 148.022000 -3402.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 -3393.948000 152.720000 -3402.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 -3393.948000 156.311000 -3402.948000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -3393.948000 159.253000 -3402.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -3404.448000 83.006000 -3413.448000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 -3404.448000 88.793000 -3413.448000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 -3404.448000 91.664000 -3413.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 -3404.448000 94.562000 -3413.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 -3404.448000 100.349000 -3413.448000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 -3404.448000 103.157000 -3413.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 -3404.448000 108.980000 -3413.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 -3404.448000 114.740000 -3413.448000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 -3404.448000 119.375000 -3413.448000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 -3404.448000 128.033000 -3413.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 -3404.448000 141.479000 -3413.448000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 -3404.448000 146.807000 -3413.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -3404.448000 152.684000 -3413.448000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 -3404.448000 156.293000 -3413.448000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -3404.448000 159.253000 -3413.448000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -3414.948000 79.730000 -3423.948000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 -3414.948000 84.005000 -3423.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 -3414.948000 89.423000 -3423.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 -3414.948000 98.036000 -3423.948000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 -3414.948000 121.157000 -3423.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 -3414.948000 145.115000 -3423.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 -3414.948000 151.001000 -3423.948000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 -3414.948000 156.320000 -3423.948000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -3414.948000 159.253000 -3423.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -3425.448000 83.285000 -3434.448000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 -3425.448000 89.099000 -3434.448000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 -3425.448000 93.401000 -3434.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 -3425.448000 98.477000 -3434.448000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 -3425.448000 103.121000 -3434.448000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 -3425.448000 105.974000 -3434.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 -3425.448000 111.320000 -3434.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 -3425.448000 115.604000 -3434.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 -3425.448000 123.857000 -3434.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 -3425.448000 136.007000 -3434.448000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 -3425.448000 141.794000 -3434.448000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 -3425.448000 144.665000 -3434.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 -3425.448000 147.464000 -3434.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 -3425.448000 153.251000 -3434.448000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -3425.448000 156.433000 -3434.448000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -3435.948000 79.271000 -3444.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -3435.948000 85.094000 -3444.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -3435.948000 90.854000 -3444.948000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 -3435.948000 96.146000 -3444.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 -3435.948000 102.302000 -3444.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 -3435.948000 107.711000 -3444.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 -3435.948000 113.048000 -3444.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 -3435.948000 119.204000 -3444.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 -3435.948000 124.991000 -3444.948000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 -3435.948000 130.310000 -3444.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 -3435.948000 135.647000 -3444.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 -3435.948000 144.755000 -3444.948000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 -3435.948000 153.323000 -3444.948000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -3435.948000 156.333000 -3444.948000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -3446.448000 82.160000 -3455.448000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 -3446.448000 85.067000 -3455.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 -3446.448000 89.297000 -3455.448000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 -3446.448000 94.616000 -3455.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 -3446.448000 98.747000 -3455.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 -3446.448000 106.055000 -3455.448000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 -3446.448000 109.700000 -3455.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 -3446.448000 115.055000 -3455.448000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 -3446.448000 118.601000 -3455.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 -3446.448000 124.010000 -3455.448000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 -3446.448000 128.042000 -3455.448000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 -3446.448000 135.998000 -3455.448000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 -3446.448000 141.785000 -3455.448000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 -3446.448000 144.656000 -3455.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 -3446.448000 147.554000 -3455.448000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 -3446.448000 153.341000 -3455.448000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -3446.448000 156.433000 -3455.448000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -3456.948000 79.271000 -3465.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -3456.948000 85.094000 -3465.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -3456.948000 90.854000 -3465.948000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 -3456.948000 93.743000 -3465.948000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -3471.800000 0 72.100000 -3471.800000 0 72.100000 -3358.100000 0 72.000000 -3358.100000 0 72.000000 -3471.800000 0
+eoFillPath subpath 1 160.500000 -3471.800000 0 160.600000 -3471.800000 0 160.600000 -3358.100000 0 160.500000 -3358.100000 0 160.500000 -3471.800000 0
+eoFillPath subpath 1 72.000000 -3358.200000 0 160.600000 -3358.200000 0 160.600000 -3358.100000 0 72.000000 -3358.100000 0 72.000000 -3358.200000 0
+eoFillPath subpath 1 72.000000 -3471.800000 0 160.600000 -3471.800000 0 160.600000 -3471.700000 0 72.000000 -3471.700000 0 72.000000 -3471.800000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 2717.800000 0 169.600000 2717.800000 0 169.600000 2722.800000 0 76.900000 2722.800000 0 76.900000 2717.800000 0
+eoFillPath subpath 1 164.600000 2722.700000 0 169.600000 2722.700000 0 169.600000 2838.300000 0 164.600000 2838.300000 0 164.600000 2722.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 2722.800000 0 121.400000 2722.800000 0 121.400000 2843.200000 0 72.000000 2843.200000 0 72.000000 2722.800000 0
+saveState
+eoClipPath subpath 1 72.000000 2722.700000 0 164.600000 2722.700000 0 164.600000 2843.100000 0 72.000000 2843.100000 0 72.000000 2722.700000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -187250.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 2792.700000 0 93.700000 2792.700000 0 93.700000 2811.900000 0 72.000000 2811.900000 0 72.000000 2792.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 2792.700000 0 169.600000 2792.700000 0 169.600000 2811.900000 0 93.700000 2811.900000 0 93.700000 2792.700000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 2776.000000 0 93.700000 2776.000000 0 93.700000 2792.700000 0 72.000000 2792.700000 0 72.000000 2776.000000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 2776.000000 0 169.600000 2776.000000 0 169.600000 2792.700000 0 93.700000 2792.700000 0 93.700000 2776.000000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 2756.800000 0 93.700000 2756.800000 0 93.700000 2776.000000 0 72.000000 2776.000000 0 72.000000 2756.800000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 2756.800000 0 169.600000 2756.800000 0 169.600000 2776.000000 0 93.700000 2776.000000 0 93.700000 2756.800000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 2737.600000 0 93.700000 2737.600000 0 93.700000 2756.800000 0 72.000000 2756.800000 0 72.000000 2737.600000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 2737.600000 0 169.600000 2737.600000 0 169.600000 2756.800000 0 93.700000 2756.800000 0 93.700000 2737.600000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2838.852000 82.898000 2829.852000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 2838.852000 87.200000 2829.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 2838.852000 90.809000 2829.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 2838.852000 93.671000 2829.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 2838.852000 98.315000 2829.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 2838.852000 101.906000 2829.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 2838.852000 106.514000 2829.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 2838.852000 109.754000 2829.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 2838.852000 112.868000 2829.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 2838.852000 118.691000 2829.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 2838.852000 121.850000 2829.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 2838.852000 125.702000 2829.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 2838.852000 131.588000 2829.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 2838.852000 136.907000 2829.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 2838.852000 140.039000 2829.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 2838.852000 146.078000 2829.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 2838.852000 151.442000 2829.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 2838.852000 154.349000 2829.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 2838.852000 157.148000 2829.852000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 2838.852000 160.433000 2829.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2828.352000 84.095000 2819.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 2828.352000 89.468000 2819.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 2828.352000 94.580000 2819.352000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 2828.352000 97.631000 2819.352000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 2807.952000 104.443000 2798.952000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 2807.952000 109.060000 2798.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 2807.952000 113.398000 2798.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 2807.952000 119.194000 2798.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 2807.952000 124.612000 2798.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 2807.952000 127.465000 2798.952000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 2791.252000 101.176000 2782.252000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 2791.252000 104.074000 2782.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 2791.252000 109.420000 2782.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 2791.252000 114.442000 2782.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 2791.252000 120.202000 2782.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 2791.252000 123.811000 2782.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 2791.252000 129.121000 2782.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 2791.252000 134.899000 2782.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 2791.252000 139.516000 2782.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 2791.252000 143.107000 2782.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 2791.252000 148.417000 2782.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 2791.252000 151.270000 2782.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 2791.252000 157.093000 2782.252000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 2774.552000 103.048000 2765.552000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 2774.552000 108.421000 2765.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 2774.552000 113.443000 2765.552000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 2774.552000 118.852000 2765.552000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 2774.552000 124.702000 2765.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 2774.552000 130.021000 2765.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 2774.552000 135.079000 2765.552000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 2755.352000 104.407000 2746.352000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 2755.352000 109.816000 2746.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 2755.352000 115.594000 2746.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 2755.352000 121.354000 2746.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 2755.352000 125.692000 2746.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 2755.352000 128.563000 2746.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 2755.352000 133.954000 2746.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 2755.352000 139.786000 2746.352000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 2722.700000 0 72.100000 2722.700000 0 72.100000 2843.200000 0 72.000000 2843.200000 0 72.000000 2722.700000 0
+eoFillPath subpath 1 164.600000 2722.700000 0 164.700000 2722.700000 0 164.700000 2843.200000 0 164.600000 2843.200000 0 164.600000 2722.700000 0
+eoFillPath subpath 1 72.000000 2843.100000 0 164.700000 2843.100000 0 164.700000 2843.200000 0 72.000000 2843.200000 0 72.000000 2843.100000 0
+eoFillPath subpath 1 72.000000 2722.700000 0 164.700000 2722.700000 0 164.700000 2722.800000 0 72.000000 2722.800000 0 72.000000 2722.700000 0
+eoFillPath subpath 1 91.300000 2737.600000 0 93.700000 2737.600000 0 93.700000 2811.900000 0 91.300000 2811.900000 0 91.300000 2737.600000 0
+eoFillPath subpath 1 72.000000 2756.800000 0 169.600000 2756.800000 0 169.600000 2759.200000 0 72.000000 2759.200000 0 72.000000 2756.800000 0
+eoFillPath subpath 1 72.000000 2809.500000 0 169.600000 2809.500000 0 169.600000 2811.900000 0 72.000000 2811.900000 0 72.000000 2809.500000 0
+eoFillPath subpath 1 72.000000 2737.600000 0 169.600000 2737.600000 0 169.600000 2740.000000 0 72.000000 2740.000000 0 72.000000 2737.600000 0
+saveState
+eoClipPath subpath 1 108.000000 -5128.400000 0 150.800000 -5128.400000 0 150.800000 -5084.200000 0 108.000000 -5084.200000 0 108.000000 -5128.400000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 592040.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 -5978.400000 0 499.600000 -5978.400000 0 499.600000 -5973.300000 0 186.800000 -5973.300000 0 186.800000 -5978.400000 0
+eoFillPath subpath 1 494.500000 -5973.400000 0 499.600000 -5973.400000 0 499.600000 -5785.000000 0 494.500000 -5785.000000 0 494.500000 -5973.400000 0
+saveState
+eoClipPath subpath 1 181.800000 -5973.400000 0 494.500000 -5973.400000 0 494.500000 -5780.000000 0 181.800000 -5780.000000 0 181.800000 -5973.400000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 -5779.900000 0 494.500000 -5779.900000 0 494.500000 -5779.900000 0 181.700000 -5779.900000 0
+eoFillPath subpath 1 181.700000 -5779.900000 0 494.500000 -5779.900000 0 494.500000 -5780.700000 0 181.700000 -5780.700000 0 181.700000 -5779.900000 0
+eoFillPath subpath 1 181.700000 -5780.700000 0 494.500000 -5780.700000 0 494.500000 -5781.400000 0 181.700000 -5781.400000 0 181.700000 -5780.700000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 -5781.400000 0 494.500000 -5781.400000 0 494.500000 -5782.200000 0 181.700000 -5782.200000 0 181.700000 -5781.400000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 -5782.200000 0 494.500000 -5782.200000 0 494.500000 -5783.000000 0 181.700000 -5783.000000 0 181.700000 -5782.200000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 -5783.000000 0 494.500000 -5783.000000 0 494.500000 -5783.700000 0 181.700000 -5783.700000 0 181.700000 -5783.000000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 -5783.700000 0 494.500000 -5783.700000 0 494.500000 -5784.500000 0 181.700000 -5784.500000 0 181.700000 -5783.700000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 -5784.500000 0 494.500000 -5784.500000 0 494.500000 -5785.200000 0 181.700000 -5785.200000 0 181.700000 -5784.500000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 -5785.200000 0 494.500000 -5785.200000 0 494.500000 -5786.000000 0 181.700000 -5786.000000 0 181.700000 -5785.200000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 -5786.000000 0 494.500000 -5786.000000 0 494.500000 -5786.700000 0 181.700000 -5786.700000 0 181.700000 -5786.000000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 -5786.700000 0 494.500000 -5786.700000 0 494.500000 -5787.500000 0 181.700000 -5787.500000 0 181.700000 -5786.700000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 -5787.500000 0 494.500000 -5787.500000 0 494.500000 -5788.300000 0 181.700000 -5788.300000 0 181.700000 -5787.500000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 -5788.300000 0 494.500000 -5788.300000 0 494.500000 -5789.000000 0 181.700000 -5789.000000 0 181.700000 -5788.300000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 -5789.000000 0 494.500000 -5789.000000 0 494.500000 -5789.800000 0 181.700000 -5789.800000 0 181.700000 -5789.000000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 -5789.800000 0 494.500000 -5789.800000 0 494.500000 -5790.500000 0 181.700000 -5790.500000 0 181.700000 -5789.800000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 -5790.500000 0 494.500000 -5790.500000 0 494.500000 -5791.300000 0 181.700000 -5791.300000 0 181.700000 -5790.500000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 -5791.300000 0 494.500000 -5791.300000 0 494.500000 -5792.100000 0 181.700000 -5792.100000 0 181.700000 -5791.300000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 -5792.100000 0 494.500000 -5792.100000 0 494.500000 -5792.800000 0 181.700000 -5792.800000 0 181.700000 -5792.100000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 -5792.800000 0 494.500000 -5792.800000 0 494.500000 -5793.600000 0 181.700000 -5793.600000 0 181.700000 -5792.800000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 -5793.600000 0 494.500000 -5793.600000 0 494.500000 -5794.300000 0 181.700000 -5794.300000 0 181.700000 -5793.600000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 -5794.300000 0 494.500000 -5794.300000 0 494.500000 -5795.100000 0 181.700000 -5795.100000 0 181.700000 -5794.300000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 -5795.100000 0 494.500000 -5795.100000 0 494.500000 -5795.900000 0 181.700000 -5795.900000 0 181.700000 -5795.100000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 -5795.900000 0 494.500000 -5795.900000 0 494.500000 -5796.600000 0 181.700000 -5796.600000 0 181.700000 -5795.900000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 -5796.600000 0 494.500000 -5796.600000 0 494.500000 -5797.400000 0 181.700000 -5797.400000 0 181.700000 -5796.600000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 -5797.400000 0 494.500000 -5797.400000 0 494.500000 -5798.100000 0 181.700000 -5798.100000 0 181.700000 -5797.400000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 -5798.100000 0 494.500000 -5798.100000 0 494.500000 -5798.900000 0 181.700000 -5798.900000 0 181.700000 -5798.100000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 -5798.900000 0 494.500000 -5798.900000 0 494.500000 -5799.600000 0 181.700000 -5799.600000 0 181.700000 -5798.900000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 -5799.600000 0 494.500000 -5799.600000 0 494.500000 -5800.400000 0 181.700000 -5800.400000 0 181.700000 -5799.600000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 -5800.400000 0 494.500000 -5800.400000 0 494.500000 -5801.200000 0 181.700000 -5801.200000 0 181.700000 -5800.400000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 -5801.200000 0 494.500000 -5801.200000 0 494.500000 -5801.900000 0 181.700000 -5801.900000 0 181.700000 -5801.200000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 -5801.900000 0 494.500000 -5801.900000 0 494.500000 -5802.700000 0 181.700000 -5802.700000 0 181.700000 -5801.900000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 -5802.700000 0 494.500000 -5802.700000 0 494.500000 -5803.400000 0 181.700000 -5803.400000 0 181.700000 -5802.700000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 -5803.400000 0 494.500000 -5803.400000 0 494.500000 -5804.200000 0 181.700000 -5804.200000 0 181.700000 -5803.400000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 -5804.200000 0 494.500000 -5804.200000 0 494.500000 -5805.000000 0 181.700000 -5805.000000 0 181.700000 -5804.200000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 -5805.000000 0 494.500000 -5805.000000 0 494.500000 -5805.700000 0 181.700000 -5805.700000 0 181.700000 -5805.000000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 -5805.700000 0 494.500000 -5805.700000 0 494.500000 -5806.500000 0 181.700000 -5806.500000 0 181.700000 -5805.700000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 -5806.500000 0 494.500000 -5806.500000 0 494.500000 -5807.200000 0 181.700000 -5807.200000 0 181.700000 -5806.500000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 -5807.200000 0 494.500000 -5807.200000 0 494.500000 -5808.000000 0 181.700000 -5808.000000 0 181.700000 -5807.200000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 -5808.000000 0 494.500000 -5808.000000 0 494.500000 -5808.800000 0 181.700000 -5808.800000 0 181.700000 -5808.000000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 -5808.800000 0 494.500000 -5808.800000 0 494.500000 -5809.500000 0 181.700000 -5809.500000 0 181.700000 -5808.800000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 -5809.500000 0 494.500000 -5809.500000 0 494.500000 -5810.300000 0 181.700000 -5810.300000 0 181.700000 -5809.500000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 -5810.300000 0 494.500000 -5810.300000 0 494.500000 -5811.000000 0 181.700000 -5811.000000 0 181.700000 -5810.300000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 -5811.000000 0 494.500000 -5811.000000 0 494.500000 -5811.800000 0 181.700000 -5811.800000 0 181.700000 -5811.000000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 -5811.800000 0 494.500000 -5811.800000 0 494.500000 -5812.500000 0 181.700000 -5812.500000 0 181.700000 -5811.800000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 -5812.500000 0 494.500000 -5812.500000 0 494.500000 -5813.300000 0 181.700000 -5813.300000 0 181.700000 -5812.500000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 -5813.300000 0 494.500000 -5813.300000 0 494.500000 -5814.100000 0 181.700000 -5814.100000 0 181.700000 -5813.300000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 -5814.100000 0 494.500000 -5814.100000 0 494.500000 -5814.800000 0 181.700000 -5814.800000 0 181.700000 -5814.100000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 -5814.800000 0 494.500000 -5814.800000 0 494.500000 -5815.600000 0 181.700000 -5815.600000 0 181.700000 -5814.800000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 -5815.600000 0 494.500000 -5815.600000 0 494.500000 -5816.300000 0 181.700000 -5816.300000 0 181.700000 -5815.600000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 -5816.300000 0 494.500000 -5816.300000 0 494.500000 -5817.100000 0 181.700000 -5817.100000 0 181.700000 -5816.300000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 -5817.100000 0 494.500000 -5817.100000 0 494.500000 -5817.900000 0 181.700000 -5817.900000 0 181.700000 -5817.100000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 -5817.900000 0 494.500000 -5817.900000 0 494.500000 -5818.600000 0 181.700000 -5818.600000 0 181.700000 -5817.900000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 -5818.600000 0 494.500000 -5818.600000 0 494.500000 -5819.400000 0 181.700000 -5819.400000 0 181.700000 -5818.600000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 -5819.400000 0 494.500000 -5819.400000 0 494.500000 -5820.100000 0 181.700000 -5820.100000 0 181.700000 -5819.400000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 -5820.100000 0 494.500000 -5820.100000 0 494.500000 -5820.900000 0 181.700000 -5820.900000 0 181.700000 -5820.100000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 -5820.900000 0 494.500000 -5820.900000 0 494.500000 -5821.700000 0 181.700000 -5821.700000 0 181.700000 -5820.900000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 -5821.700000 0 494.500000 -5821.700000 0 494.500000 -5822.400000 0 181.700000 -5822.400000 0 181.700000 -5821.700000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 -5822.400000 0 494.500000 -5822.400000 0 494.500000 -5823.200000 0 181.700000 -5823.200000 0 181.700000 -5822.400000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 -5823.200000 0 494.500000 -5823.200000 0 494.500000 -5823.900000 0 181.700000 -5823.900000 0 181.700000 -5823.200000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 -5823.900000 0 494.500000 -5823.900000 0 494.500000 -5824.700000 0 181.700000 -5824.700000 0 181.700000 -5823.900000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 -5824.700000 0 494.500000 -5824.700000 0 494.500000 -5825.400000 0 181.700000 -5825.400000 0 181.700000 -5824.700000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 -5825.400000 0 494.500000 -5825.400000 0 494.500000 -5826.200000 0 181.700000 -5826.200000 0 181.700000 -5825.400000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 -5826.200000 0 494.500000 -5826.200000 0 494.500000 -5827.000000 0 181.700000 -5827.000000 0 181.700000 -5826.200000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 -5827.000000 0 494.500000 -5827.000000 0 494.500000 -5827.700000 0 181.700000 -5827.700000 0 181.700000 -5827.000000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 -5827.700000 0 494.500000 -5827.700000 0 494.500000 -5828.500000 0 181.700000 -5828.500000 0 181.700000 -5827.700000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 -5828.500000 0 494.500000 -5828.500000 0 494.500000 -5829.200000 0 181.700000 -5829.200000 0 181.700000 -5828.500000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 -5829.200000 0 494.500000 -5829.200000 0 494.500000 -5830.000000 0 181.700000 -5830.000000 0 181.700000 -5829.200000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 -5830.000000 0 494.500000 -5830.000000 0 494.500000 -5830.800000 0 181.700000 -5830.800000 0 181.700000 -5830.000000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 -5830.800000 0 494.500000 -5830.800000 0 494.500000 -5831.500000 0 181.700000 -5831.500000 0 181.700000 -5830.800000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 -5831.500000 0 494.500000 -5831.500000 0 494.500000 -5832.300000 0 181.700000 -5832.300000 0 181.700000 -5831.500000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 -5832.300000 0 494.500000 -5832.300000 0 494.500000 -5833.000000 0 181.700000 -5833.000000 0 181.700000 -5832.300000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 -5833.000000 0 494.500000 -5833.000000 0 494.500000 -5833.800000 0 181.700000 -5833.800000 0 181.700000 -5833.000000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 -5833.800000 0 494.500000 -5833.800000 0 494.500000 -5834.600000 0 181.700000 -5834.600000 0 181.700000 -5833.800000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 -5834.600000 0 494.500000 -5834.600000 0 494.500000 -5835.300000 0 181.700000 -5835.300000 0 181.700000 -5834.600000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 -5835.300000 0 494.500000 -5835.300000 0 494.500000 -5836.100000 0 181.700000 -5836.100000 0 181.700000 -5835.300000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 -5836.100000 0 494.500000 -5836.100000 0 494.500000 -5836.800000 0 181.700000 -5836.800000 0 181.700000 -5836.100000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 -5836.800000 0 494.500000 -5836.800000 0 494.500000 -5837.600000 0 181.700000 -5837.600000 0 181.700000 -5836.800000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 -5837.600000 0 494.500000 -5837.600000 0 494.500000 -5838.300000 0 181.700000 -5838.300000 0 181.700000 -5837.600000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 -5838.300000 0 494.500000 -5838.300000 0 494.500000 -5839.100000 0 181.700000 -5839.100000 0 181.700000 -5838.300000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 -5839.100000 0 494.500000 -5839.100000 0 494.500000 -5839.900000 0 181.700000 -5839.900000 0 181.700000 -5839.100000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 -5839.900000 0 494.500000 -5839.900000 0 494.500000 -5840.600000 0 181.700000 -5840.600000 0 181.700000 -5839.900000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 -5840.600000 0 494.500000 -5840.600000 0 494.500000 -5841.400000 0 181.700000 -5841.400000 0 181.700000 -5840.600000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 -5841.400000 0 494.500000 -5841.400000 0 494.500000 -5842.100000 0 181.700000 -5842.100000 0 181.700000 -5841.400000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 -5842.100000 0 494.500000 -5842.100000 0 494.500000 -5842.900000 0 181.700000 -5842.900000 0 181.700000 -5842.100000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 -5842.900000 0 494.500000 -5842.900000 0 494.500000 -5843.700000 0 181.700000 -5843.700000 0 181.700000 -5842.900000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 -5843.700000 0 494.500000 -5843.700000 0 494.500000 -5844.400000 0 181.700000 -5844.400000 0 181.700000 -5843.700000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 -5844.400000 0 494.500000 -5844.400000 0 494.500000 -5845.200000 0 181.700000 -5845.200000 0 181.700000 -5844.400000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 -5845.200000 0 494.500000 -5845.200000 0 494.500000 -5845.900000 0 181.700000 -5845.900000 0 181.700000 -5845.200000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 -5845.900000 0 494.500000 -5845.900000 0 494.500000 -5846.700000 0 181.700000 -5846.700000 0 181.700000 -5845.900000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 -5846.700000 0 494.500000 -5846.700000 0 494.500000 -5847.400000 0 181.700000 -5847.400000 0 181.700000 -5846.700000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 -5847.400000 0 494.500000 -5847.400000 0 494.500000 -5848.200000 0 181.700000 -5848.200000 0 181.700000 -5847.400000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 -5848.200000 0 494.500000 -5848.200000 0 494.500000 -5849.000000 0 181.700000 -5849.000000 0 181.700000 -5848.200000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 -5849.000000 0 494.500000 -5849.000000 0 494.500000 -5849.700000 0 181.700000 -5849.700000 0 181.700000 -5849.000000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 -5849.700000 0 494.500000 -5849.700000 0 494.500000 -5850.500000 0 181.700000 -5850.500000 0 181.700000 -5849.700000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 -5850.500000 0 494.500000 -5850.500000 0 494.500000 -5851.200000 0 181.700000 -5851.200000 0 181.700000 -5850.500000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 -5851.200000 0 494.500000 -5851.200000 0 494.500000 -5852.000000 0 181.700000 -5852.000000 0 181.700000 -5851.200000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 -5852.000000 0 494.500000 -5852.000000 0 494.500000 -5852.700000 0 181.700000 -5852.700000 0 181.700000 -5852.000000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 -5852.700000 0 494.500000 -5852.700000 0 494.500000 -5853.500000 0 181.700000 -5853.500000 0 181.700000 -5852.700000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 -5853.500000 0 494.500000 -5853.500000 0 494.500000 -5854.300000 0 181.700000 -5854.300000 0 181.700000 -5853.500000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 -5854.300000 0 494.500000 -5854.300000 0 494.500000 -5855.000000 0 181.700000 -5855.000000 0 181.700000 -5854.300000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 -5855.000000 0 494.500000 -5855.000000 0 494.500000 -5855.800000 0 181.700000 -5855.800000 0 181.700000 -5855.000000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 -5855.800000 0 494.500000 -5855.800000 0 494.500000 -5856.500000 0 181.700000 -5856.500000 0 181.700000 -5855.800000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 -5856.500000 0 494.500000 -5856.500000 0 494.500000 -5857.300000 0 181.700000 -5857.300000 0 181.700000 -5856.500000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 -5857.300000 0 494.500000 -5857.300000 0 494.500000 -5858.100000 0 181.700000 -5858.100000 0 181.700000 -5857.300000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 -5858.100000 0 494.500000 -5858.100000 0 494.500000 -5858.800000 0 181.700000 -5858.800000 0 181.700000 -5858.100000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 -5858.800000 0 494.500000 -5858.800000 0 494.500000 -5859.600000 0 181.700000 -5859.600000 0 181.700000 -5858.800000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 -5859.600000 0 494.500000 -5859.600000 0 494.500000 -5860.300000 0 181.700000 -5860.300000 0 181.700000 -5859.600000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 -5860.300000 0 494.500000 -5860.300000 0 494.500000 -5861.100000 0 181.700000 -5861.100000 0 181.700000 -5860.300000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 -5861.100000 0 494.500000 -5861.100000 0 494.500000 -5861.800000 0 181.700000 -5861.800000 0 181.700000 -5861.100000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 -5861.800000 0 494.500000 -5861.800000 0 494.500000 -5862.600000 0 181.700000 -5862.600000 0 181.700000 -5861.800000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 -5862.600000 0 494.500000 -5862.600000 0 494.500000 -5863.400000 0 181.700000 -5863.400000 0 181.700000 -5862.600000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 -5863.400000 0 494.500000 -5863.400000 0 494.500000 -5864.100000 0 181.700000 -5864.100000 0 181.700000 -5863.400000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 -5864.100000 0 494.500000 -5864.100000 0 494.500000 -5864.900000 0 181.700000 -5864.900000 0 181.700000 -5864.100000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 -5864.900000 0 494.500000 -5864.900000 0 494.500000 -5865.600000 0 181.700000 -5865.600000 0 181.700000 -5864.900000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 -5865.600000 0 494.500000 -5865.600000 0 494.500000 -5866.400000 0 181.700000 -5866.400000 0 181.700000 -5865.600000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 -5866.400000 0 494.500000 -5866.400000 0 494.500000 -5867.100000 0 181.700000 -5867.100000 0 181.700000 -5866.400000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 -5867.100000 0 494.500000 -5867.100000 0 494.500000 -5867.900000 0 181.700000 -5867.900000 0 181.700000 -5867.100000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 -5867.900000 0 494.500000 -5867.900000 0 494.500000 -5868.700000 0 181.700000 -5868.700000 0 181.700000 -5867.900000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 -5868.700000 0 494.500000 -5868.700000 0 494.500000 -5869.400000 0 181.700000 -5869.400000 0 181.700000 -5868.700000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 -5869.400000 0 494.500000 -5869.400000 0 494.500000 -5870.200000 0 181.700000 -5870.200000 0 181.700000 -5869.400000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 -5870.200000 0 494.500000 -5870.200000 0 494.500000 -5870.900000 0 181.700000 -5870.900000 0 181.700000 -5870.200000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 -5870.900000 0 494.500000 -5870.900000 0 494.500000 -5871.700000 0 181.700000 -5871.700000 0 181.700000 -5870.900000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 -5871.700000 0 494.500000 -5871.700000 0 494.500000 -5872.500000 0 181.700000 -5872.500000 0 181.700000 -5871.700000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 -5872.500000 0 494.500000 -5872.500000 0 494.500000 -5873.200000 0 181.700000 -5873.200000 0 181.700000 -5872.500000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 -5873.200000 0 494.500000 -5873.200000 0 494.500000 -5874.000000 0 181.700000 -5874.000000 0 181.700000 -5873.200000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 -5874.000000 0 494.500000 -5874.000000 0 494.500000 -5874.700000 0 181.700000 -5874.700000 0 181.700000 -5874.000000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 -5874.700000 0 494.500000 -5874.700000 0 494.500000 -5875.500000 0 181.700000 -5875.500000 0 181.700000 -5874.700000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 -5875.500000 0 494.500000 -5875.500000 0 494.500000 -5876.300000 0 181.700000 -5876.300000 0 181.700000 -5875.500000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 -5876.300000 0 494.500000 -5876.300000 0 494.500000 -5877.000000 0 181.700000 -5877.000000 0 181.700000 -5876.300000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 -5877.000000 0 494.500000 -5877.000000 0 494.500000 -5877.800000 0 181.700000 -5877.800000 0 181.700000 -5877.000000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 -5877.800000 0 494.500000 -5877.800000 0 494.500000 -5878.500000 0 181.700000 -5878.500000 0 181.700000 -5877.800000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 -5878.500000 0 494.500000 -5878.500000 0 494.500000 -5879.300000 0 181.700000 -5879.300000 0 181.700000 -5878.500000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 -5879.300000 0 494.500000 -5879.300000 0 494.500000 -5880.000000 0 181.700000 -5880.000000 0 181.700000 -5879.300000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 -5880.000000 0 494.500000 -5880.000000 0 494.500000 -5880.800000 0 181.700000 -5880.800000 0 181.700000 -5880.000000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 -5880.800000 0 494.500000 -5880.800000 0 494.500000 -5881.600000 0 181.700000 -5881.600000 0 181.700000 -5880.800000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 -5881.600000 0 494.500000 -5881.600000 0 494.500000 -5882.300000 0 181.700000 -5882.300000 0 181.700000 -5881.600000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 -5882.300000 0 494.500000 -5882.300000 0 494.500000 -5883.100000 0 181.700000 -5883.100000 0 181.700000 -5882.300000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 -5883.100000 0 494.500000 -5883.100000 0 494.500000 -5883.800000 0 181.700000 -5883.800000 0 181.700000 -5883.100000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 -5883.800000 0 494.500000 -5883.800000 0 494.500000 -5884.600000 0 181.700000 -5884.600000 0 181.700000 -5883.800000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 -5884.600000 0 494.500000 -5884.600000 0 494.500000 -5885.400000 0 181.700000 -5885.400000 0 181.700000 -5884.600000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 -5885.400000 0 494.500000 -5885.400000 0 494.500000 -5886.100000 0 181.700000 -5886.100000 0 181.700000 -5885.400000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 -5886.100000 0 494.500000 -5886.100000 0 494.500000 -5886.900000 0 181.700000 -5886.900000 0 181.700000 -5886.100000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 -5886.900000 0 494.500000 -5886.900000 0 494.500000 -5887.600000 0 181.700000 -5887.600000 0 181.700000 -5886.900000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 -5887.600000 0 494.500000 -5887.600000 0 494.500000 -5888.400000 0 181.700000 -5888.400000 0 181.700000 -5887.600000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 -5888.400000 0 494.500000 -5888.400000 0 494.500000 -5889.200000 0 181.700000 -5889.200000 0 181.700000 -5888.400000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 -5889.200000 0 494.500000 -5889.200000 0 494.500000 -5889.900000 0 181.700000 -5889.900000 0 181.700000 -5889.200000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 -5889.900000 0 494.500000 -5889.900000 0 494.500000 -5890.700000 0 181.700000 -5890.700000 0 181.700000 -5889.900000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 -5890.700000 0 494.500000 -5890.700000 0 494.500000 -5891.400000 0 181.700000 -5891.400000 0 181.700000 -5890.700000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 -5891.400000 0 494.500000 -5891.400000 0 494.500000 -5892.200000 0 181.700000 -5892.200000 0 181.700000 -5891.400000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 -5892.200000 0 494.500000 -5892.200000 0 494.500000 -5892.900000 0 181.700000 -5892.900000 0 181.700000 -5892.200000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 -5892.900000 0 494.500000 -5892.900000 0 494.500000 -5893.700000 0 181.700000 -5893.700000 0 181.700000 -5892.900000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 -5893.700000 0 494.500000 -5893.700000 0 494.500000 -5894.500000 0 181.700000 -5894.500000 0 181.700000 -5893.700000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 -5894.500000 0 494.500000 -5894.500000 0 494.500000 -5895.200000 0 181.700000 -5895.200000 0 181.700000 -5894.500000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 -5895.200000 0 494.500000 -5895.200000 0 494.500000 -5896.000000 0 181.700000 -5896.000000 0 181.700000 -5895.200000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 -5896.000000 0 494.500000 -5896.000000 0 494.500000 -5896.700000 0 181.700000 -5896.700000 0 181.700000 -5896.000000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 -5896.700000 0 494.500000 -5896.700000 0 494.500000 -5897.500000 0 181.700000 -5897.500000 0 181.700000 -5896.700000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 -5897.500000 0 494.500000 -5897.500000 0 494.500000 -5898.300000 0 181.700000 -5898.300000 0 181.700000 -5897.500000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 -5898.300000 0 494.500000 -5898.300000 0 494.500000 -5899.000000 0 181.700000 -5899.000000 0 181.700000 -5898.300000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 -5899.000000 0 494.500000 -5899.000000 0 494.500000 -5899.800000 0 181.700000 -5899.800000 0 181.700000 -5899.000000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 -5899.800000 0 494.500000 -5899.800000 0 494.500000 -5900.500000 0 181.700000 -5900.500000 0 181.700000 -5899.800000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 -5900.500000 0 494.500000 -5900.500000 0 494.500000 -5901.300000 0 181.700000 -5901.300000 0 181.700000 -5900.500000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 -5901.300000 0 494.500000 -5901.300000 0 494.500000 -5902.100000 0 181.700000 -5902.100000 0 181.700000 -5901.300000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 -5902.100000 0 494.500000 -5902.100000 0 494.500000 -5902.800000 0 181.700000 -5902.800000 0 181.700000 -5902.100000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 -5902.800000 0 494.500000 -5902.800000 0 494.500000 -5903.600000 0 181.700000 -5903.600000 0 181.700000 -5902.800000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 -5903.600000 0 494.500000 -5903.600000 0 494.500000 -5904.300000 0 181.700000 -5904.300000 0 181.700000 -5903.600000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 -5904.300000 0 494.500000 -5904.300000 0 494.500000 -5905.100000 0 181.700000 -5905.100000 0 181.700000 -5904.300000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 -5905.100000 0 494.500000 -5905.100000 0 494.500000 -5905.800000 0 181.700000 -5905.800000 0 181.700000 -5905.100000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 -5905.800000 0 494.500000 -5905.800000 0 494.500000 -5906.600000 0 181.700000 -5906.600000 0 181.700000 -5905.800000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 -5906.600000 0 494.500000 -5906.600000 0 494.500000 -5907.400000 0 181.700000 -5907.400000 0 181.700000 -5906.600000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 -5907.400000 0 494.500000 -5907.400000 0 494.500000 -5908.100000 0 181.700000 -5908.100000 0 181.700000 -5907.400000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 -5908.100000 0 494.500000 -5908.100000 0 494.500000 -5908.900000 0 181.700000 -5908.900000 0 181.700000 -5908.100000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 -5908.900000 0 494.500000 -5908.900000 0 494.500000 -5909.600000 0 181.700000 -5909.600000 0 181.700000 -5908.900000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 -5909.600000 0 494.500000 -5909.600000 0 494.500000 -5910.400000 0 181.700000 -5910.400000 0 181.700000 -5909.600000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 -5910.400000 0 494.500000 -5910.400000 0 494.500000 -5911.200000 0 181.700000 -5911.200000 0 181.700000 -5910.400000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 -5911.200000 0 494.500000 -5911.200000 0 494.500000 -5911.900000 0 181.700000 -5911.900000 0 181.700000 -5911.200000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 -5911.900000 0 494.500000 -5911.900000 0 494.500000 -5912.700000 0 181.700000 -5912.700000 0 181.700000 -5911.900000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 -5912.700000 0 494.500000 -5912.700000 0 494.500000 -5913.400000 0 181.700000 -5913.400000 0 181.700000 -5912.700000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 -5913.400000 0 494.500000 -5913.400000 0 494.500000 -5914.200000 0 181.700000 -5914.200000 0 181.700000 -5913.400000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 -5914.200000 0 494.500000 -5914.200000 0 494.500000 -5915.000000 0 181.700000 -5915.000000 0 181.700000 -5914.200000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 -5915.000000 0 494.500000 -5915.000000 0 494.500000 -5915.700000 0 181.700000 -5915.700000 0 181.700000 -5915.000000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 -5915.700000 0 494.500000 -5915.700000 0 494.500000 -5916.500000 0 181.700000 -5916.500000 0 181.700000 -5915.700000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 -5916.500000 0 494.500000 -5916.500000 0 494.500000 -5917.200000 0 181.700000 -5917.200000 0 181.700000 -5916.500000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 -5917.200000 0 494.500000 -5917.200000 0 494.500000 -5918.000000 0 181.700000 -5918.000000 0 181.700000 -5917.200000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 -5918.000000 0 494.500000 -5918.000000 0 494.500000 -5918.700000 0 181.700000 -5918.700000 0 181.700000 -5918.000000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 -5918.700000 0 494.500000 -5918.700000 0 494.500000 -5919.500000 0 181.700000 -5919.500000 0 181.700000 -5918.700000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 -5919.500000 0 494.500000 -5919.500000 0 494.500000 -5920.300000 0 181.700000 -5920.300000 0 181.700000 -5919.500000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 -5920.300000 0 494.500000 -5920.300000 0 494.500000 -5921.000000 0 181.700000 -5921.000000 0 181.700000 -5920.300000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 -5921.000000 0 494.500000 -5921.000000 0 494.500000 -5921.800000 0 181.700000 -5921.800000 0 181.700000 -5921.000000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 -5921.800000 0 494.500000 -5921.800000 0 494.500000 -5922.500000 0 181.700000 -5922.500000 0 181.700000 -5921.800000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 -5922.500000 0 494.500000 -5922.500000 0 494.500000 -5923.300000 0 181.700000 -5923.300000 0 181.700000 -5922.500000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 -5923.300000 0 494.500000 -5923.300000 0 494.500000 -5924.100000 0 181.700000 -5924.100000 0 181.700000 -5923.300000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 -5924.100000 0 494.500000 -5924.100000 0 494.500000 -5924.800000 0 181.700000 -5924.800000 0 181.700000 -5924.100000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 -5924.800000 0 494.500000 -5924.800000 0 494.500000 -5925.600000 0 181.700000 -5925.600000 0 181.700000 -5924.800000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 -5925.600000 0 494.500000 -5925.600000 0 494.500000 -5926.300000 0 181.700000 -5926.300000 0 181.700000 -5925.600000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 -5926.300000 0 494.500000 -5926.300000 0 494.500000 -5927.100000 0 181.700000 -5927.100000 0 181.700000 -5926.300000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 -5927.100000 0 494.500000 -5927.100000 0 494.500000 -5927.900000 0 181.700000 -5927.900000 0 181.700000 -5927.100000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 -5927.900000 0 494.500000 -5927.900000 0 494.500000 -5928.600000 0 181.700000 -5928.600000 0 181.700000 -5927.900000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 -5928.600000 0 494.500000 -5928.600000 0 494.500000 -5929.400000 0 181.700000 -5929.400000 0 181.700000 -5928.600000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 -5929.400000 0 494.500000 -5929.400000 0 494.500000 -5930.100000 0 181.700000 -5930.100000 0 181.700000 -5929.400000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 -5930.100000 0 494.500000 -5930.100000 0 494.500000 -5930.900000 0 181.700000 -5930.900000 0 181.700000 -5930.100000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 -5930.900000 0 494.500000 -5930.900000 0 494.500000 -5931.600000 0 181.700000 -5931.600000 0 181.700000 -5930.900000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 -5931.600000 0 494.500000 -5931.600000 0 494.500000 -5932.400000 0 181.700000 -5932.400000 0 181.700000 -5931.600000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 -5932.400000 0 494.500000 -5932.400000 0 494.500000 -5933.200000 0 181.700000 -5933.200000 0 181.700000 -5932.400000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 -5933.200000 0 494.500000 -5933.200000 0 494.500000 -5933.900000 0 181.700000 -5933.900000 0 181.700000 -5933.200000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 -5933.900000 0 494.500000 -5933.900000 0 494.500000 -5934.700000 0 181.700000 -5934.700000 0 181.700000 -5933.900000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 -5934.700000 0 494.500000 -5934.700000 0 494.500000 -5935.400000 0 181.700000 -5935.400000 0 181.700000 -5934.700000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 -5935.400000 0 494.500000 -5935.400000 0 494.500000 -5936.200000 0 181.700000 -5936.200000 0 181.700000 -5935.400000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 -5936.200000 0 494.500000 -5936.200000 0 494.500000 -5937.000000 0 181.700000 -5937.000000 0 181.700000 -5936.200000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 -5937.000000 0 494.500000 -5937.000000 0 494.500000 -5937.700000 0 181.700000 -5937.700000 0 181.700000 -5937.000000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 -5937.700000 0 494.500000 -5937.700000 0 494.500000 -5938.500000 0 181.700000 -5938.500000 0 181.700000 -5937.700000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 -5938.500000 0 494.500000 -5938.500000 0 494.500000 -5939.200000 0 181.700000 -5939.200000 0 181.700000 -5938.500000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 -5939.200000 0 494.500000 -5939.200000 0 494.500000 -5940.000000 0 181.700000 -5940.000000 0 181.700000 -5939.200000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 -5940.000000 0 494.500000 -5940.000000 0 494.500000 -5940.800000 0 181.700000 -5940.800000 0 181.700000 -5940.000000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 -5940.800000 0 494.500000 -5940.800000 0 494.500000 -5941.500000 0 181.700000 -5941.500000 0 181.700000 -5940.800000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 -5941.500000 0 494.500000 -5941.500000 0 494.500000 -5942.300000 0 181.700000 -5942.300000 0 181.700000 -5941.500000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 -5942.300000 0 494.500000 -5942.300000 0 494.500000 -5943.000000 0 181.700000 -5943.000000 0 181.700000 -5942.300000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 -5943.000000 0 494.500000 -5943.000000 0 494.500000 -5943.800000 0 181.700000 -5943.800000 0 181.700000 -5943.000000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 -5943.800000 0 494.500000 -5943.800000 0 494.500000 -5944.500000 0 181.700000 -5944.500000 0 181.700000 -5943.800000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 -5944.500000 0 494.500000 -5944.500000 0 494.500000 -5945.300000 0 181.700000 -5945.300000 0 181.700000 -5944.500000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 -5945.300000 0 494.500000 -5945.300000 0 494.500000 -5946.100000 0 181.700000 -5946.100000 0 181.700000 -5945.300000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 -5946.100000 0 494.500000 -5946.100000 0 494.500000 -5946.800000 0 181.700000 -5946.800000 0 181.700000 -5946.100000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 -5946.800000 0 494.500000 -5946.800000 0 494.500000 -5947.600000 0 181.700000 -5947.600000 0 181.700000 -5946.800000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 -5947.600000 0 494.500000 -5947.600000 0 494.500000 -5948.300000 0 181.700000 -5948.300000 0 181.700000 -5947.600000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 -5948.300000 0 494.500000 -5948.300000 0 494.500000 -5949.100000 0 181.700000 -5949.100000 0 181.700000 -5948.300000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 -5949.100000 0 494.500000 -5949.100000 0 494.500000 -5949.900000 0 181.700000 -5949.900000 0 181.700000 -5949.100000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 -5949.900000 0 494.500000 -5949.900000 0 494.500000 -5950.600000 0 181.700000 -5950.600000 0 181.700000 -5949.900000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 -5950.600000 0 494.500000 -5950.600000 0 494.500000 -5951.400000 0 181.700000 -5951.400000 0 181.700000 -5950.600000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 -5951.400000 0 494.500000 -5951.400000 0 494.500000 -5952.100000 0 181.700000 -5952.100000 0 181.700000 -5951.400000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 -5952.100000 0 494.500000 -5952.100000 0 494.500000 -5952.900000 0 181.700000 -5952.900000 0 181.700000 -5952.100000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 -5952.900000 0 494.500000 -5952.900000 0 494.500000 -5953.700000 0 181.700000 -5953.700000 0 181.700000 -5952.900000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 -5953.700000 0 494.500000 -5953.700000 0 494.500000 -5954.400000 0 181.700000 -5954.400000 0 181.700000 -5953.700000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 -5954.400000 0 494.500000 -5954.400000 0 494.500000 -5955.200000 0 181.700000 -5955.200000 0 181.700000 -5954.400000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 -5955.200000 0 494.500000 -5955.200000 0 494.500000 -5955.900000 0 181.700000 -5955.900000 0 181.700000 -5955.200000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 -5955.900000 0 494.500000 -5955.900000 0 494.500000 -5956.700000 0 181.700000 -5956.700000 0 181.700000 -5955.900000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 -5956.700000 0 494.500000 -5956.700000 0 494.500000 -5957.400000 0 181.700000 -5957.400000 0 181.700000 -5956.700000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 -5957.400000 0 494.500000 -5957.400000 0 494.500000 -5958.200000 0 181.700000 -5958.200000 0 181.700000 -5957.400000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 -5958.200000 0 494.500000 -5958.200000 0 494.500000 -5959.000000 0 181.700000 -5959.000000 0 181.700000 -5958.200000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 -5959.000000 0 494.500000 -5959.000000 0 494.500000 -5959.700000 0 181.700000 -5959.700000 0 181.700000 -5959.000000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 -5959.700000 0 494.500000 -5959.700000 0 494.500000 -5960.500000 0 181.700000 -5960.500000 0 181.700000 -5959.700000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 -5960.500000 0 494.500000 -5960.500000 0 494.500000 -5961.200000 0 181.700000 -5961.200000 0 181.700000 -5960.500000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 -5961.200000 0 494.500000 -5961.200000 0 494.500000 -5962.000000 0 181.700000 -5962.000000 0 181.700000 -5961.200000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 -5962.000000 0 494.500000 -5962.000000 0 494.500000 -5962.800000 0 181.700000 -5962.800000 0 181.700000 -5962.000000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 -5962.800000 0 494.500000 -5962.800000 0 494.500000 -5963.500000 0 181.700000 -5963.500000 0 181.700000 -5962.800000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 -5963.500000 0 494.500000 -5963.500000 0 494.500000 -5964.300000 0 181.700000 -5964.300000 0 181.700000 -5963.500000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 -5964.300000 0 494.500000 -5964.300000 0 494.500000 -5965.000000 0 181.700000 -5965.000000 0 181.700000 -5964.300000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 -5965.000000 0 494.500000 -5965.000000 0 494.500000 -5965.800000 0 181.700000 -5965.800000 0 181.700000 -5965.000000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 -5965.800000 0 494.500000 -5965.800000 0 494.500000 -5966.600000 0 181.700000 -5966.600000 0 181.700000 -5965.800000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 -5966.600000 0 494.500000 -5966.600000 0 494.500000 -5967.300000 0 181.700000 -5967.300000 0 181.700000 -5966.600000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 -5967.300000 0 494.500000 -5967.300000 0 494.500000 -5968.100000 0 181.700000 -5968.100000 0 181.700000 -5967.300000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 -5968.100000 0 494.500000 -5968.100000 0 494.500000 -5968.800000 0 181.700000 -5968.800000 0 181.700000 -5968.100000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 -5968.800000 0 494.500000 -5968.800000 0 494.500000 -5969.600000 0 181.700000 -5969.600000 0 181.700000 -5968.800000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 -5969.600000 0 494.500000 -5969.600000 0 494.500000 -5970.300000 0 181.700000 -5970.300000 0 181.700000 -5969.600000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 -5970.300000 0 494.500000 -5970.300000 0 494.500000 -5971.100000 0 181.700000 -5971.100000 0 181.700000 -5970.300000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 -5971.100000 0 494.500000 -5971.100000 0 494.500000 -5971.900000 0 181.700000 -5971.900000 0 181.700000 -5971.100000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 -5971.900000 0 494.500000 -5971.900000 0 494.500000 -5972.600000 0 181.700000 -5972.600000 0 181.700000 -5971.900000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 -5972.600000 0 494.500000 -5972.600000 0 494.500000 -5973.400000 0 181.700000 -5973.400000 0 181.700000 -5972.600000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 -5973.300000 0 181.800000 -5973.300000 0 181.800000 -5780.000000 0 494.400000 -5780.000000 0 494.400000 -5973.300000 0 338.100000 -5973.300000 0
+strokePath subpath 1 338.100000 -5973.300000 0 181.800000 -5973.300000 0 181.800000 -5780.000000 0 494.400000 -5780.000000 0 494.400000 -5973.300000 0 338.100000 -5973.300000 0
+saveState
+updateCtm 11420.000000 0.000000 0.000000 -8760.000000 20530.000000 668930.000000
+drawSoftMaskedImage 1143 877 1143 877 JPEG 71324 PPM 3007249
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 -5934.276000 215.488000 -5942.276000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 -5934.276000 220.592000 -5942.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 -5934.276000 225.696000 -5942.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 -5934.276000 230.800000 -5942.276000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 -5941.876000 241.388000 -5949.876000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 -5941.876000 246.492000 -5949.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 -5941.876000 251.596000 -5949.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 -5941.876000 256.700000 -5949.876000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 -5949.576000 267.188000 -5957.576000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 -5949.576000 272.292000 -5957.576000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 -5949.576000 277.396000 -5957.576000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 -5949.576000 282.500000 -5957.576000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 -5957.076000 293.088000 -5965.076000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 -5957.076000 298.192000 -5965.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 -5957.076000 303.296000 -5965.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 -5957.076000 308.400000 -5965.076000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 -5919.276000 202.588000 -5927.276000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 -5899.976000 201.688000 -5907.976000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 -5880.676000 195.788000 -5888.676000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 -5880.676000 200.892000 -5888.676000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 -5861.276000 194.888000 -5869.276000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 -5861.276000 199.992000 -5869.276000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 -5841.976000 193.988000 -5849.976000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 -5841.976000 199.092000 -5849.976000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 -5822.676000 193.088000 -5830.676000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 -5822.676000 198.192000 -5830.676000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 -5950.576000 330.188000 -5958.576000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 -5950.576000 332.716000 -5958.576000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 -5950.576000 337.596000 -5958.576000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 -5950.576000 341.396000 -5958.576000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 -5950.576000 346.036000 -5958.576000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 -5950.576000 350.900000 -5958.576000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 -5950.576000 355.972000 -5958.576000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 -5950.576000 359.196000 -5958.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 -5950.576000 362.196000 -5958.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 -5950.576000 367.404000 -5958.576000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 -5950.576000 371.876000 -5958.576000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 -5950.576000 375.052000 -5958.576000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 -5931.076000 361.172000 -5939.076000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 -5931.076000 364.340000 -5939.076000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 -5931.076000 367.396000 -5939.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 -5931.076000 372.604000 -5939.076000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 -5931.076000 379.348000 -5939.076000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 -5931.076000 384.484000 -5939.076000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 -5931.076000 389.436000 -5939.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 -5931.076000 392.108000 -5939.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 -5931.076000 395.708000 -5939.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 -5931.076000 397.540000 -5939.076000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 -5931.076000 402.444000 -5939.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 -5931.076000 406.788000 -5939.076000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 -5911.476000 392.972000 -5919.476000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 -5911.476000 398.076000 -5919.476000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 -5911.476000 403.180000 -5919.476000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 -5911.476000 405.428000 -5919.476000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 -5911.476000 410.332000 -5919.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 -5911.476000 414.476000 -5919.476000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 -5783.908000 305.808000 -5797.908000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 -5783.908000 314.138000 -5797.908000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 -5783.908000 320.788000 -5797.908000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 -5783.908000 328.698000 -5797.908000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 -5783.908000 336.972000 -5797.908000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 -5783.908000 344.182000 -5797.908000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 -5783.908000 349.810000 -5797.908000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 -5783.908000 354.234000 -5797.908000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 -5783.908000 362.718000 -5797.908000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 -5783.908000 367.870000 -5797.908000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 -5783.908000 372.322000 -5797.908000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 -5783.908000 382.080000 -5797.908000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 -5783.908000 388.772000 -5797.908000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 -5783.908000 397.802000 -5797.908000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 -5783.908000 402.254000 -5797.908000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 -5783.908000 407.896000 -5797.908000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 -5906.800000 0 424.300000 -5906.800000 0 424.300000 -5846.100000 0 493.600000 -5846.100000 0 493.600000 -5906.800000 0 458.900000 -5906.800000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 -5855.700000 0 428.900000 -5855.700000 0 428.900000 -5849.700000 0 434.800000 -5849.700000 0 434.800000 -5855.700000 0 431.900000 -5855.700000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 -5866.800000 0 428.900000 -5866.800000 0 428.900000 -5860.800000 0 434.800000 -5860.800000 0 434.800000 -5866.800000 0 431.900000 -5866.800000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 -5877.900000 0 428.900000 -5877.900000 0 428.900000 -5871.900000 0 434.800000 -5871.900000 0 434.800000 -5877.900000 0 431.900000 -5877.900000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 -5889.000000 0 428.900000 -5889.000000 0 428.900000 -5883.000000 0 434.800000 -5883.000000 0 434.800000 -5889.000000 0 431.900000 -5889.000000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 -5900.100000 0 428.900000 -5900.100000 0 428.900000 -5894.100000 0 434.800000 -5894.100000 0 434.800000 -5900.100000 0 431.900000 -5900.100000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -5848.576000 443.288000 -5856.576000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 -5848.576000 445.816000 -5856.576000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 -5848.576000 450.600000 -5856.576000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 -5848.576000 454.496000 -5856.576000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 -5848.576000 459.136000 -5856.576000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 -5848.576000 464.000000 -5856.576000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 -5848.576000 468.976000 -5856.576000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 -5848.576000 472.304000 -5856.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 -5848.576000 475.208000 -5856.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 -5848.576000 480.520000 -5856.576000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 -5848.576000 484.992000 -5856.576000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 -5848.576000 488.168000 -5856.576000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -5859.676000 443.352000 -5867.676000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 -5859.676000 447.920000 -5867.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 -5859.676000 452.976000 -5867.676000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 -5859.676000 457.400000 -5867.676000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 -5859.676000 462.472000 -5867.676000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 -5859.676000 465.800000 -5867.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 -5859.676000 468.904000 -5867.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 -5859.676000 473.816000 -5867.676000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 -5859.676000 478.888000 -5867.676000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 -5859.676000 482.064000 -5867.676000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -5870.776000 442.872000 -5878.776000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 -5870.776000 446.040000 -5878.776000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 -5870.776000 448.992000 -5878.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 -5870.776000 454.304000 -5878.776000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 -5870.776000 461.048000 -5878.776000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 -5870.776000 466.184000 -5878.776000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 -5870.776000 471.136000 -5878.776000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 -5870.776000 473.808000 -5878.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 -5870.776000 477.408000 -5878.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 -5870.776000 479.240000 -5878.776000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 -5870.776000 484.144000 -5878.776000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 -5870.776000 488.488000 -5878.776000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -5881.876000 443.384000 -5889.876000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 -5881.876000 448.464000 -5889.876000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 -5881.876000 453.424000 -5889.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 -5881.876000 456.696000 -5889.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 -5881.876000 459.800000 -5889.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 -5881.876000 462.032000 -5889.876000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 -5881.876000 466.936000 -5889.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 -5881.876000 471.080000 -5889.876000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -5892.976000 443.272000 -5900.976000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 -5892.976000 448.376000 -5900.976000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 -5892.976000 453.480000 -5900.976000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 -5892.976000 455.728000 -5900.976000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 -5892.976000 460.632000 -5900.976000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 -5892.976000 464.776000 -5900.976000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -8538.000000 0 114.800000 -8538.000000 0 114.800000 -8495.200000 0 72.000000 -8495.200000 0 72.000000 -8538.000000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 932990.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 546.200000 0 504.000000 546.200000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 546.200000 0
+eoFillPath subpath 1 72.000000 72.000000 0 504.000000 72.000000 0 504.000000 245.800000 0 72.000000 245.800000 0 72.000000 72.000000 0
+eoFillPath subpath 1 72.000000 245.800000 0 121.400000 245.800000 0 121.400000 546.200000 0 72.000000 546.200000 0 72.000000 245.800000 0
+eoFillPath subpath 1 454.500000 245.800000 0 504.000000 245.800000 0 504.000000 546.200000 0 454.500000 546.200000 0 454.500000 245.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 72.000000 701.300000 0 504.000000 701.300000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 701.300000 0
+eoFillPath subpath 1 72.000000 72.200000 0 504.000000 72.200000 0 504.000000 86.100000 0 72.000000 86.100000 0 72.000000 72.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 331.200000 719.948000 344.992000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 345.008000 719.948000 354.464000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 354.512000 719.948000 359.584000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 359.616000 719.948000 371.632000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 371.616000 719.948000 381.392000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 381.424000 719.948000 391.552000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 391.520000 719.948000 399.840000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 399.824000 719.948000 409.664000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 409.632000 719.948000 414.704000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 414.736000 719.948000 420.496000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 420.544000 719.948000 425.616000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 425.600000 719.948000 434.800000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 433.600000 719.948000 438.032000 703.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 438.000000 719.948000 444.576000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 444.608000 719.948000 452.928000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 452.912000 719.948000 459.184000 703.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 459.216000 719.948000 464.288000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 464.320000 719.948000 473.520000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 473.520000 719.948000 477.952000 703.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 477.920000 719.948000 487.696000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 487.728000 719.948000 497.504000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 497.536000 719.948000 504.112000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 672.936000 190.312000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 672.936000 198.028000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.100000 672.936000 205.192000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 206.800000 672.936000 210.604000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 212.296000 672.936000 216.124000 660.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 216.100000 672.936000 223.252000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 223.300000 672.936000 229.036000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 229.000000 672.936000 236.680000 660.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 236.704000 672.936000 243.796000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 245.500000 672.936000 249.304000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 250.996000 672.936000 258.220000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 258.196000 672.936000 264.964000 660.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 265.000000 672.936000 272.152000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 272.200000 672.936000 276.028000 660.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 277.600000 672.936000 281.404000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 283.096000 672.936000 287.908000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 287.896000 672.936000 295.048000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 295.096000 672.936000 302.776000 660.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 302.800000 672.936000 306.628000 660.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 306.604000 672.936000 313.696000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 313.708000 672.936000 317.512000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 319.204000 672.936000 323.008000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 324.700000 672.936000 332.920000 660.936000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 333.004000 672.936000 336.832000 660.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 336.808000 672.936000 344.536000 660.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 344.608000 672.936000 351.328000 660.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 351.208000 672.936000 358.300000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 359.908000 672.936000 363.712000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 365.512000 672.936000 370.324000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 370.312000 672.936000 378.040000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 378.112000 672.936000 385.204000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 385.216000 672.936000 391.984000 660.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 393.616000 672.936000 397.420000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 399.112000 672.936000 406.264000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 406.312000 672.936000 412.048000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 412.012000 672.936000 419.104000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 420.712000 672.936000 424.516000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 426.208000 672.936000 433.360000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 433.408000 672.936000 437.236000 660.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 437.212000 672.936000 441.040000 660.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 442.708000 672.936000 446.512000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 448.312000 672.936000 452.752000 660.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 452.716000 672.936000 458.452000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 458.416000 672.936000 465.640000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 465.712000 672.936000 477.088000 660.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 478.612000 672.936000 482.416000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.108000 672.936000 488.920000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.004000 672.936000 496.732000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.708000 672.936000 503.800000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 672.936000 507.904000 660.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 659.036000 191.656000 647.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 659.036000 198.856000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 198.904000 659.036000 210.280000 647.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 210.304000 659.036000 217.396000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 217.408000 659.036000 221.212000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 221.212000 659.036000 232.588000 647.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 232.612000 659.036000 239.764000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 239.812000 659.036000 247.540000 647.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 247.516000 659.036000 255.244000 647.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 255.220000 659.036000 259.660000 647.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 259.624000 659.036000 266.776000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 266.824000 659.036000 273.544000 647.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 273.520000 659.036000 278.332000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 278.320000 659.036000 286.048000 647.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 286.024000 659.036000 291.760000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 291.724000 659.036000 298.816000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 298.828000 659.036000 304.564000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 303.232000 659.036000 307.036000 647.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 307.036000 659.036000 310.840000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 310.840000 659.036000 315.652000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 315.640000 659.036000 323.368000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 323.344000 659.036000 330.568000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 330.544000 659.036000 338.272000 647.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 338.248000 659.036000 345.928000 647.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 345.952000 659.036000 353.680000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 353.656000 659.036000 357.460000 647.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 357.460000 659.036000 361.264000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 361.264000 659.036000 366.076000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 366.064000 659.036000 373.792000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 373.768000 659.036000 380.860000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 380.872000 659.036000 387.640000 647.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 387.676000 659.036000 391.480000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 391.480000 659.036000 402.856000 647.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 402.880000 659.036000 410.032000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 410.080000 659.036000 414.892000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 414.880000 659.036000 421.600000 647.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 421.576000 659.036000 429.304000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 429.280000 659.036000 433.084000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 433.084000 659.036000 443.344000 647.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 443.380000 659.036000 450.472000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 450.484000 659.036000 454.312000 647.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 454.288000 659.036000 458.116000 647.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 458.092000 659.036000 461.896000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 639.136000 193.420000 627.136000 1.000000 0.000000 0.000000 1.000000 Y
+drawChar 192.400000 639.136000 199.624000 627.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 199.600000 639.136000 207.328000 627.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 207.604000 639.136000 211.408000 627.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 211.804000 639.136000 222.064000 627.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 222.100000 639.136000 229.324000 627.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 229.300000 639.136000 237.028000 627.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 237.100000 639.136000 240.928000 627.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 240.904000 639.136000 248.584000 627.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 248.908000 639.136000 252.712000 627.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 253.108000 639.136000 260.200000 627.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 260.212000 639.136000 266.968000 627.136000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 267.016000 639.136000 274.696000 627.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 274.720000 639.136000 281.812000 627.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 281.824000 639.136000 288.544000 627.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 288.520000 639.136000 293.332000 627.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 293.620000 639.136000 297.424000 627.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 297.820000 639.136000 302.632000 627.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 302.620000 639.136000 309.844000 627.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 310.216000 639.136000 314.020000 627.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 314.812000 639.136000 322.804000 627.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 322.408000 639.136000 330.136000 627.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 330.112000 639.136000 337.792000 627.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 338.116000 639.136000 341.920000 627.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 342.316000 639.136000 349.408000 627.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 349.420000 639.136000 356.176000 627.136000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 356.224000 639.136000 363.904000 627.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 363.928000 639.136000 371.020000 627.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 371.032000 639.136000 378.760000 627.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 378.736000 639.136000 384.892000 627.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 384.832000 639.136000 388.660000 627.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 388.732000 639.136000 395.500000 627.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 395.536000 639.136000 402.628000 627.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.640000 639.136000 406.444000 627.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 406.744000 639.136000 410.548000 627.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 410.944000 639.136000 418.096000 627.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 418.144000 639.136000 425.872000 627.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 425.848000 639.136000 430.660000 627.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 430.648000 639.136000 434.476000 627.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 434.452000 639.136000 442.132000 627.136000 1.000000 0.000000 0.000000 1.000000 q
+drawChar 442.156000 639.136000 449.884000 627.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 449.956000 639.136000 457.048000 627.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 457.660000 639.136000 461.464000 627.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 461.700000 639.136000 469.380000 627.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 469.404000 639.136000 476.628000 627.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 476.604000 639.136000 482.340000 627.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 482.304000 639.136000 489.024000 627.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 489.000000 639.136000 496.092000 627.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 496.104000 639.136000 499.932000 627.136000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 639.136000 504.044000 627.136000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 625.236000 192.652000 613.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 192.700000 625.236000 196.528000 613.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 196.504000 625.236000 204.232000 613.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 206.008000 625.236000 209.812000 613.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 211.612000 625.236000 216.424000 613.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 216.508000 625.236000 223.732000 613.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 225.508000 625.236000 229.312000 613.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 231.208000 625.236000 242.584000 613.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 242.608000 625.236000 249.760000 613.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 249.712000 625.236000 254.524000 613.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 254.608000 625.236000 261.328000 613.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 261.304000 625.236000 269.032000 613.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 270.808000 625.236000 274.612000 613.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 276.412000 625.236000 281.224000 613.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 281.212000 625.236000 288.940000 613.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 289.012000 625.236000 296.104000 613.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 297.916000 625.236000 301.720000 613.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 303.616000 625.236000 310.708000 613.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 310.720000 625.236000 317.476000 613.236000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 317.524000 625.236000 325.204000 613.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 325.228000 625.236000 332.320000 613.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 332.332000 625.236000 340.060000 613.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 340.036000 625.236000 346.192000 613.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 346.132000 625.236000 349.960000 613.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 350.032000 625.236000 356.800000 613.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 356.836000 625.236000 363.928000 613.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 363.940000 625.236000 367.744000 613.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 369.544000 625.236000 373.348000 613.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 375.148000 625.236000 382.300000 613.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 382.348000 625.236000 390.076000 613.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 390.052000 625.236000 394.864000 613.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 394.852000 625.236000 398.680000 613.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 398.656000 625.236000 406.336000 613.236000 1.000000 0.000000 0.000000 1.000000 q
+drawChar 406.360000 625.236000 414.088000 613.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 414.160000 625.236000 421.252000 613.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 422.956000 625.236000 426.760000 613.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 428.656000 625.236000 433.468000 613.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 433.552000 625.236000 440.704000 613.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 440.752000 625.236000 448.432000 613.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 448.348000 625.236000 452.176000 613.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 452.248000 625.236000 459.340000 613.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 459.244000 625.236000 463.048000 613.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.944000 625.236000 468.748000 613.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 470.548000 625.236000 479.356000 613.236000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 479.344000 625.236000 487.072000 613.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 487.048000 625.236000 491.860000 613.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 493.648000 625.236000 497.452000 613.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 499.348000 625.236000 504.088000 613.236000 1.000000 0.000000 0.000000 1.000000 I
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 625.236000 507.904000 613.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 611.336000 193.180000 599.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 193.204000 611.336000 200.296000 599.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 200.308000 611.336000 208.036000 599.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 208.012000 611.336000 215.104000 599.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 215.116000 611.336000 220.852000 599.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 220.816000 611.336000 227.968000 599.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.016000 611.336000 231.844000 599.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 231.820000 611.336000 235.648000 599.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 235.720000 611.336000 242.488000 599.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 243.220000 611.336000 247.024000 599.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 247.816000 611.336000 255.496000 599.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 255.520000 611.336000 261.256000 599.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 261.220000 611.336000 268.312000 599.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 268.324000 611.336000 272.764000 599.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 272.824000 611.336000 279.916000 599.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 279.928000 611.336000 285.664000 599.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 286.432000 611.336000 290.236000 599.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 291.028000 611.336000 295.840000 599.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 295.828000 611.336000 303.556000 599.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 303.628000 611.336000 310.720000 599.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 311.332000 611.336000 315.136000 599.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 316.036000 611.336000 327.412000 599.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 327.340000 611.336000 334.564000 599.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 334.636000 611.336000 342.316000 599.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 342.232000 611.336000 349.324000 599.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 349.336000 611.336000 355.072000 599.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 355.036000 611.336000 362.764000 599.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 363.640000 611.336000 367.444000 599.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 368.236000 611.336000 374.392000 599.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 374.440000 611.336000 379.252000 599.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 379.240000 611.336000 386.008000 599.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 386.044000 611.336000 389.872000 599.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 389.848000 611.336000 396.940000 599.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 397.648000 611.336000 401.452000 599.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 402.244000 611.336000 409.468000 599.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 409.540000 611.336000 413.980000 599.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 414.736000 611.336000 418.540000 599.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 419.332000 611.336000 424.144000 599.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 424.132000 611.336000 431.860000 599.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 431.932000 611.336000 439.024000 599.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 439.732000 611.336000 443.536000 599.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 444.328000 611.336000 452.056000 599.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 452.032000 611.336000 459.760000 599.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 459.832000 611.336000 467.512000 599.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 467.428000 611.336000 473.164000 599.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 473.224000 611.336000 480.316000 599.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 480.328000 611.336000 485.140000 599.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 485.128000 611.336000 492.220000 599.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 492.232000 611.336000 499.960000 599.336000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 611.336000 504.044000 599.336000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 597.436000 190.312000 585.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 597.436000 194.128000 585.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 194.200000 597.436000 201.424000 585.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 201.400000 597.436000 209.128000 585.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 209.104000 597.436000 215.260000 585.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 215.308000 597.436000 219.112000 585.436000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 219.712000 597.436000 223.516000 585.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 224.116000 597.436000 234.376000 585.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 234.412000 597.436000 242.140000 585.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 242.116000 597.436000 245.944000 585.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 245.920000 597.436000 250.732000 585.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 250.816000 597.436000 257.908000 585.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 259.120000 597.436000 262.924000 585.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 262.900000 597.436000 270.580000 585.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 270.604000 597.436000 277.828000 585.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 277.804000 597.436000 285.532000 585.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 285.508000 597.436000 292.600000 585.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 293.212000 597.436000 297.016000 585.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 297.712000 597.436000 304.432000 585.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 304.408000 597.436000 312.136000 585.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 312.112000 597.436000 315.940000 585.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 315.916000 597.436000 323.644000 585.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 323.620000 597.436000 330.772000 585.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 330.820000 597.436000 334.624000 585.436000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 335.224000 597.436000 339.028000 585.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 339.628000 597.436000 344.068000 585.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 344.032000 597.436000 349.768000 585.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 349.828000 597.436000 357.052000 585.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 357.124000 597.436000 368.500000 585.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 369.028000 597.436000 372.832000 585.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 373.432000 597.436000 382.180000 585.436000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 382.228000 597.436000 389.956000 585.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 389.932000 597.436000 397.612000 585.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 397.636000 597.436000 401.464000 585.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 401.536000 597.436000 408.688000 585.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 408.736000 597.436000 416.464000 585.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 416.332000 597.436000 424.012000 585.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 424.636000 597.436000 428.440000 585.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.040000 597.436000 436.192000 585.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 436.240000 597.436000 442.396000 585.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 442.936000 597.436000 446.740000 585.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 447.436000 597.436000 457.696000 585.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 457.732000 597.436000 464.824000 585.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 464.836000 597.436000 468.664000 585.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 468.640000 597.436000 472.468000 585.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 472.444000 597.436000 476.248000 585.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.848000 597.436000 480.652000 585.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 481.252000 597.436000 489.244000 585.436000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 489.256000 597.436000 496.984000 585.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.960000 597.436000 504.052000 585.436000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 597.436000 507.904000 585.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 583.536000 191.656000 571.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 583.536000 195.532000 571.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 195.508000 583.536000 199.336000 571.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 199.312000 583.536000 206.080000 571.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 206.116000 583.536000 213.208000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 213.220000 583.536000 218.956000 571.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 219.016000 583.536000 229.276000 571.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 229.216000 583.536000 236.368000 571.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 236.416000 583.536000 242.152000 571.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 242.116000 583.536000 249.208000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 250.816000 583.536000 254.620000 571.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 256.216000 583.536000 260.044000 571.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 260.020000 583.536000 266.176000 571.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 266.224000 583.536000 273.952000 571.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 274.024000 583.536000 277.312000 571.536000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 277.324000 583.536000 282.136000 571.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 283.720000 583.536000 287.524000 571.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 289.216000 583.536000 294.952000 571.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 294.916000 583.536000 302.008000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 302.020000 583.536000 309.172000 571.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 309.220000 583.536000 313.048000 571.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 314.620000 583.536000 318.424000 571.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 320.020000 583.536000 326.176000 571.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 326.224000 583.536000 330.052000 571.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 330.028000 583.536000 333.856000 571.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 333.832000 583.536000 340.600000 571.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 340.636000 583.536000 347.728000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 347.740000 583.536000 353.476000 571.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 352.144000 583.536000 355.948000 571.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 357.640000 583.536000 361.444000 571.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 363.136000 583.536000 370.816000 571.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 370.840000 583.536000 378.568000 571.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 378.544000 583.536000 383.356000 571.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 384.940000 583.536000 388.744000 571.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 390.340000 583.536000 395.152000 571.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 395.236000 583.536000 399.064000 571.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 399.040000 583.536000 410.416000 571.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 410.440000 583.536000 417.532000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 417.544000 583.536000 421.372000 571.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 421.444000 583.536000 428.536000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 428.548000 583.536000 434.704000 571.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 434.644000 583.536000 440.800000 571.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 440.848000 583.536000 444.676000 571.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 444.652000 583.536000 451.420000 571.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 453.052000 583.536000 456.856000 571.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 458.548000 583.536000 465.640000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 465.652000 583.536000 469.480000 571.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 469.456000 583.536000 476.548000 571.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 476.560000 583.536000 484.240000 571.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 484.264000 583.536000 491.416000 571.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 491.368000 583.536000 499.096000 571.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 499.072000 583.536000 503.884000 571.536000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 583.536000 507.904000 571.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 569.636000 191.656000 557.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 569.636000 196.516000 557.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 196.504000 569.636000 203.656000 557.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 203.608000 569.636000 207.436000 557.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 207.508000 569.636000 215.236000 557.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 215.212000 569.636000 219.040000 557.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 219.016000 569.636000 226.108000 557.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 226.120000 569.636000 232.276000 557.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 232.324000 569.636000 238.480000 557.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 238.720000 569.636000 242.524000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 242.824000 569.636000 248.980000 557.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 249.028000 569.636000 253.840000 557.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 253.828000 569.636000 260.920000 557.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 260.932000 569.636000 268.024000 557.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 268.036000 569.636000 271.864000 557.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 272.140000 569.636000 275.944000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 276.244000 569.636000 282.964000 557.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 282.940000 569.636000 290.668000 557.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 290.644000 569.636000 295.456000 557.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 295.540000 569.636000 299.368000 557.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 299.344000 569.636000 306.436000 557.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 306.448000 569.636000 312.184000 557.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 312.148000 569.636000 318.916000 557.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 317.344000 569.636000 321.148000 557.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 321.448000 569.636000 325.252000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 325.552000 569.636000 334.576000 557.636000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 334.552000 569.636000 341.644000 557.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 341.656000 569.636000 348.808000 557.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 348.856000 569.636000 352.684000 557.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 352.960000 569.636000 356.764000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 357.064000 569.636000 363.220000 557.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 363.268000 569.636000 367.096000 557.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 367.072000 569.636000 370.900000 557.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 370.876000 569.636000 377.644000 557.636000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 377.680000 569.636000 384.772000 557.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 384.784000 569.636000 390.520000 557.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 390.784000 569.636000 394.588000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 394.888000 569.636000 406.264000 557.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 406.288000 569.636000 414.016000 557.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 413.992000 569.636000 420.148000 557.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 420.196000 569.636000 425.008000 557.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 425.296000 569.636000 429.100000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.400000 569.636000 437.080000 557.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 437.104000 569.636000 444.196000 557.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 444.400000 569.636000 448.204000 557.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 448.504000 569.636000 454.240000 557.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 454.204000 569.636000 461.296000 557.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 461.308000 569.636000 468.988000 557.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 469.012000 569.636000 476.740000 557.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 476.716000 569.636000 480.544000 557.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 480.616000 569.636000 487.768000 557.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 487.720000 569.636000 493.456000 557.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 493.516000 569.636000 497.344000 557.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 497.320000 569.636000 504.088000 557.636000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 569.636000 507.904000 557.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 555.736000 193.180000 543.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 193.204000 555.736000 200.428000 543.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 200.404000 555.736000 204.232000 543.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 204.208000 555.736000 208.036000 543.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 208.108000 555.736000 214.264000 543.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 214.204000 555.736000 221.932000 543.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 222.004000 555.736000 229.096000 543.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 229.108000 555.736000 236.788000 543.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 236.812000 555.736000 240.616000 543.736000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 240.916000 555.736000 244.720000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.116000 555.736000 252.268000 543.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 252.316000 555.736000 260.044000 543.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 260.020000 555.736000 267.700000 543.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 267.916000 555.736000 271.720000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 272.212000 555.736000 276.040000 543.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 276.016000 555.736000 282.172000 543.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 282.520000 555.736000 286.324000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 286.720000 555.736000 294.448000 543.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 294.424000 555.736000 301.648000 543.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 301.720000 555.736000 306.532000 543.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 306.724000 555.736000 310.528000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 311.020000 555.736000 318.700000 543.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 318.616000 555.736000 325.768000 543.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 325.816000 555.736000 331.552000 543.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 331.516000 555.736000 336.328000 543.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 336.412000 555.736000 340.240000 543.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 340.216000 555.736000 346.936000 543.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 347.020000 555.736000 354.748000 543.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 354.616000 555.736000 358.444000 543.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 358.420000 555.736000 365.572000 543.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 365.620000 555.736000 371.356000 543.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 371.320000 555.736000 375.148000 543.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 375.220000 555.736000 381.988000 543.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 382.324000 555.736000 386.128000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 386.524000 555.736000 392.680000 543.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 392.728000 555.736000 400.456000 543.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 400.432000 555.736000 404.260000 543.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 404.236000 555.736000 409.048000 543.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 409.036000 555.736000 416.128000 543.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 416.140000 555.736000 423.820000 543.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 424.144000 555.736000 427.948000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 428.344000 555.736000 432.784000 543.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 432.748000 555.736000 439.972000 543.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 440.044000 555.736000 445.780000 543.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 446.044000 555.736000 449.848000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 450.340000 555.736000 455.152000 543.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 455.140000 555.736000 462.868000 543.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 462.940000 555.736000 470.032000 543.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.236000 555.736000 474.040000 543.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.436000 555.736000 482.116000 543.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 482.140000 555.736000 485.968000 543.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 485.944000 555.736000 492.100000 543.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 492.148000 555.736000 499.876000 543.736000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 555.736000 504.044000 543.736000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 541.836000 195.760000 529.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 195.796000 541.836000 202.948000 529.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 202.996000 541.836000 209.152000 529.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 209.200000 541.836000 216.928000 529.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 216.904000 541.836000 223.996000 529.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 224.008000 541.836000 229.744000 529.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 229.708000 541.836000 233.512000 529.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 233.512000 541.836000 240.604000 529.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 240.616000 541.836000 244.444000 529.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 244.420000 541.836000 249.232000 529.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 249.220000 541.836000 256.948000 529.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 256.924000 541.836000 264.016000 529.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 264.028000 541.836000 269.764000 529.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 268.432000 541.836000 272.236000 529.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 504.048000 83.620000 488.048000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 83.604000 504.048000 94.452000 488.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.500000 504.048000 103.972000 488.048000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 104.004000 504.048000 114.996000 488.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 115.012000 504.048000 126.388000 488.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 126.420000 504.048000 137.860000 488.048000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 137.924000 504.048000 143.492000 488.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 143.524000 504.048000 154.452000 488.048000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 154.420000 504.048000 159.892000 488.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 159.924000 504.048000 170.916000 488.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 170.932000 504.048000 181.924000 488.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 181.940000 504.048000 189.828000 488.048000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 479.536000 193.816000 467.536000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 193.804000 479.536000 199.540000 467.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 199.600000 479.536000 206.824000 467.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 206.800000 479.536000 218.176000 467.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 218.200000 479.536000 222.004000 467.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 222.100000 479.536000 226.912000 467.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.900000 479.536000 234.628000 467.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 234.604000 479.536000 241.696000 467.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 241.804000 479.536000 245.608000 467.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.800000 479.536000 253.528000 467.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 253.504000 479.536000 260.656000 467.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 260.608000 479.536000 264.436000 467.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 264.508000 479.536000 268.336000 467.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 268.312000 479.536000 278.572000 467.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 278.608000 479.536000 285.760000 467.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 285.712000 479.536000 292.480000 467.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 292.516000 479.536000 296.320000 467.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 296.416000 479.536000 303.640000 467.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 303.712000 479.536000 311.440000 467.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 311.416000 479.536000 315.220000 467.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 315.412000 479.536000 320.224000 467.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 320.212000 479.536000 327.940000 467.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 327.916000 479.536000 335.008000 467.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 335.020000 479.536000 338.824000 467.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 339.016000 479.536000 345.172000 467.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 345.220000 479.536000 352.312000 467.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 352.324000 479.536000 359.044000 467.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 358.924000 479.536000 366.148000 467.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 366.220000 479.536000 373.948000 467.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 373.924000 479.536000 381.604000 467.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 381.724000 479.536000 385.528000 467.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 385.720000 479.536000 393.712000 467.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 393.724000 479.536000 400.948000 467.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 400.828000 479.536000 408.052000 467.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 408.028000 479.536000 413.764000 467.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 413.824000 479.536000 417.628000 467.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 417.724000 479.536000 422.536000 467.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 422.524000 479.536000 430.252000 467.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 430.324000 479.536000 437.416000 467.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 437.428000 479.536000 443.164000 467.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 443.128000 479.536000 450.220000 467.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 450.328000 479.536000 454.132000 467.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.324000 479.536000 461.476000 467.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 461.428000 479.536000 467.164000 467.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 467.224000 479.536000 474.316000 467.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 474.328000 479.536000 478.132000 467.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 478.132000 479.536000 485.356000 467.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 485.332000 479.536000 493.060000 467.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 493.132000 479.536000 496.960000 467.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 496.936000 479.536000 503.704000 467.536000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 479.536000 507.904000 467.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 465.636000 190.312000 453.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 465.636000 200.560000 453.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 200.596000 465.636000 207.820000 453.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 208.492000 465.636000 212.296000 453.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 212.992000 465.636000 220.672000 453.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 220.696000 465.636000 227.920000 453.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 227.896000 465.636000 235.120000 453.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 235.096000 465.636000 240.832000 453.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 240.892000 465.636000 247.048000 453.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 246.988000 465.636000 250.792000 453.636000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 251.584000 465.636000 255.388000 453.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 256.084000 465.636000 263.308000 453.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 263.284000 465.636000 271.012000 453.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 271.084000 465.636000 278.176000 453.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 278.788000 465.636000 282.592000 453.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 283.384000 465.636000 287.212000 453.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 287.188000 465.636000 294.280000 453.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 294.292000 465.636000 301.444000 453.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 301.492000 465.636000 309.172000 453.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 309.088000 465.636000 312.916000 453.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 312.892000 465.636000 320.620000 453.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 320.692000 465.636000 328.372000 453.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 329.092000 465.636000 332.896000 453.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 333.592000 465.636000 338.404000 453.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 338.392000 465.636000 345.616000 453.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 346.288000 465.636000 350.092000 453.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 350.884000 465.636000 355.696000 453.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 355.684000 465.636000 363.412000 453.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 363.484000 465.636000 370.576000 453.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 371.188000 465.636000 374.992000 453.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 375.688000 465.636000 379.516000 453.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 379.492000 465.636000 386.584000 453.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 386.596000 465.636000 391.036000 453.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 391.096000 465.636000 395.908000 453.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 396.592000 465.636000 400.396000 453.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 401.092000 465.636000 408.244000 453.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 408.292000 465.636000 416.020000 453.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 415.996000 465.636000 423.676000 453.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 424.396000 465.636000 428.200000 453.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 428.896000 465.636000 433.708000 453.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 433.696000 465.636000 441.424000 453.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 441.496000 465.636000 448.588000 453.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 449.296000 465.636000 453.100000 453.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 453.796000 465.636000 461.020000 453.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 460.996000 465.636000 465.808000 453.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 465.796000 465.636000 473.524000 453.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 473.596000 465.636000 480.688000 453.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 480.700000 465.636000 486.436000 453.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 487.096000 465.636000 490.900000 453.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 491.596000 465.636000 496.408000 453.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 496.396000 465.636000 503.620000 453.636000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 465.636000 508.004000 453.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 451.736000 190.312000 439.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 451.736000 198.028000 439.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.100000 451.736000 205.192000 439.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 205.504000 451.736000 209.308000 439.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 209.704000 451.736000 215.440000 439.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 215.404000 451.736000 219.232000 439.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 219.304000 451.736000 226.984000 439.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 227.008000 451.736000 234.736000 439.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 234.712000 451.736000 239.524000 439.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 239.512000 451.736000 243.316000 439.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 243.712000 451.736000 247.516000 439.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 247.912000 451.736000 256.576000 439.736000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 256.912000 451.736000 260.716000 439.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 261.112000 451.736000 271.372000 439.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 271.408000 451.736000 278.632000 439.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 278.608000 451.736000 285.832000 439.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 285.808000 451.736000 293.488000 439.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 293.512000 451.736000 300.604000 439.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 300.616000 451.736000 308.344000 439.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 308.716000 451.736000 312.520000 439.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 312.916000 451.736000 319.072000 439.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 319.120000 451.736000 326.800000 439.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 326.716000 451.736000 330.544000 439.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 330.616000 451.736000 336.352000 439.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 336.316000 451.736000 343.468000 439.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 343.516000 451.736000 347.344000 439.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 347.620000 451.736000 351.424000 439.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 351.916000 451.736000 358.072000 439.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 358.120000 451.736000 362.932000 439.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 362.824000 451.736000 369.976000 439.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 370.024000 451.736000 373.852000 439.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 373.828000 451.736000 379.564000 439.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 379.528000 451.736000 386.248000 439.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 386.224000 451.736000 393.376000 439.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 393.424000 451.736000 399.580000 439.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 399.628000 451.736000 406.720000 439.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 407.128000 451.736000 410.932000 439.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 411.328000 451.736000 415.156000 439.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 415.132000 451.736000 422.224000 439.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 422.236000 451.736000 429.388000 439.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 429.436000 451.736000 437.116000 439.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 437.140000 451.736000 443.296000 439.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 443.536000 451.736000 447.340000 439.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 447.832000 451.736000 455.560000 439.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 455.536000 451.736000 463.216000 439.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 463.636000 451.736000 467.440000 439.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 467.836000 451.736000 472.648000 439.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 472.636000 451.736000 479.860000 439.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 480.136000 451.736000 483.940000 439.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.336000 451.736000 489.148000 439.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.232000 451.736000 496.960000 439.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.936000 451.736000 504.028000 439.736000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 451.736000 507.904000 439.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 437.836000 192.652000 425.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 192.700000 437.836000 197.512000 425.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 197.500000 437.836000 202.312000 425.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 202.300000 437.836000 206.128000 425.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 206.104000 437.836000 212.824000 425.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 212.800000 437.836000 216.604000 425.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1400.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 405.992000 82.180000 391.992000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 82.194000 405.992000 88.886000 391.992000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.900000 405.992000 98.854000 391.992000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 98.896000 405.992000 108.906000 391.992000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.892000 405.992000 118.006000 391.992000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 383.836000 193.492000 371.836000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 192.604000 383.836000 199.828000 371.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 200.200000 383.836000 204.004000 371.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 204.496000 383.836000 209.308000 371.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 209.296000 383.836000 217.024000 371.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 217.096000 383.836000 224.188000 371.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 224.596000 383.836000 228.400000 371.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 228.892000 383.836000 234.628000 371.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 234.592000 383.836000 238.420000 371.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 238.492000 383.836000 246.172000 371.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 246.196000 383.836000 253.924000 371.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 253.900000 383.836000 258.712000 371.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 258.700000 383.836000 262.504000 371.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 262.900000 383.836000 266.704000 371.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 267.196000 383.836000 274.348000 371.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 274.792000 383.836000 278.596000 371.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.088000 383.836000 286.816000 371.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 286.792000 383.836000 293.944000 371.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 293.992000 383.836000 297.820000 371.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 297.796000 383.836000 301.624000 371.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 301.696000 383.836000 311.956000 371.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 311.896000 383.836000 319.048000 371.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 319.096000 383.836000 325.864000 371.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 326.200000 383.836000 330.004000 371.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 330.604000 383.836000 334.432000 371.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 334.408000 383.836000 341.500000 371.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 341.512000 383.836000 348.664000 371.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 348.712000 383.836000 356.392000 371.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 356.308000 383.836000 362.464000 371.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 362.908000 383.836000 366.712000 371.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 367.204000 383.836000 372.016000 371.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 372.004000 383.836000 379.228000 371.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 379.708000 383.836000 383.512000 371.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 384.004000 383.836000 395.380000 371.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 395.308000 383.836000 402.076000 371.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 402.508000 383.836000 406.312000 371.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 406.804000 383.836000 412.960000 371.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 413.008000 383.836000 417.820000 371.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 417.808000 383.836000 425.536000 371.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 425.608000 383.836000 433.288000 371.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 433.204000 383.836000 439.972000 371.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 438.400000 383.836000 442.204000 371.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.600000 383.836000 446.404000 371.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 446.896000 383.836000 454.888000 371.836000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 454.996000 383.836000 462.724000 371.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 462.700000 383.836000 469.792000 371.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.200000 383.836000 474.004000 371.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.496000 383.836000 485.872000 371.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 485.896000 383.836000 493.120000 371.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 493.096000 383.836000 499.252000 371.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 499.300000 383.836000 504.112000 371.836000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 383.836000 508.004000 371.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 369.936000 189.328000 357.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 189.304000 369.936000 200.680000 357.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 200.704000 369.936000 208.384000 357.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 208.408000 369.936000 215.632000 357.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 215.608000 369.936000 221.344000 357.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 221.404000 369.936000 226.216000 357.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.204000 369.936000 233.356000 357.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 233.308000 369.936000 241.036000 357.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 241.108000 369.936000 245.920000 357.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 246.112000 369.936000 249.916000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 250.108000 369.936000 257.788000 357.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 257.812000 369.936000 261.640000 357.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 261.616000 369.936000 268.708000 357.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 268.720000 369.936000 275.440000 357.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 275.416000 369.936000 282.508000 357.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 282.712000 369.936000 286.516000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 286.816000 369.936000 294.040000 357.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 294.016000 369.936000 298.456000 357.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 298.612000 369.936000 302.416000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 302.608000 369.936000 307.048000 357.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 307.012000 369.936000 314.740000 357.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 314.812000 369.936000 320.548000 357.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.512000 369.936000 328.240000 357.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 328.216000 369.936000 332.044000 357.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 332.116000 369.936000 336.928000 357.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 336.916000 369.936000 344.644000 357.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 344.716000 369.936000 350.452000 357.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 350.416000 369.936000 357.508000 357.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 357.712000 369.936000 361.516000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 361.708000 369.936000 365.536000 357.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 365.512000 369.936000 373.240000 357.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 373.516000 369.936000 377.320000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.512000 369.936000 382.324000 357.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 382.312000 369.936000 390.040000 357.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 390.112000 369.936000 393.940000 357.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 393.916000 369.936000 400.072000 357.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 400.216000 369.936000 404.020000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 404.320000 369.936000 410.056000 357.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 410.020000 369.936000 417.244000 357.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 417.316000 369.936000 424.540000 357.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 424.420000 369.936000 435.796000 357.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 436.024000 369.936000 439.828000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 440.020000 369.936000 443.848000 357.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 443.824000 369.936000 449.980000 357.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 450.220000 369.936000 454.024000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.216000 369.936000 459.028000 357.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 459.112000 369.936000 466.840000 357.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 466.816000 369.936000 473.908000 357.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 474.112000 369.936000 477.916000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 478.108000 369.936000 484.828000 357.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 484.804000 369.936000 492.028000 357.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 492.004000 369.936000 499.732000 357.936000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 369.936000 504.044000 357.936000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 356.036000 191.656000 344.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 356.036000 195.532000 344.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 195.508000 356.036000 203.188000 344.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 203.212000 356.036000 210.304000 344.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 210.316000 356.036000 216.052000 344.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 216.016000 356.036000 223.168000 344.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 223.216000 356.036000 230.896000 344.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 230.920000 356.036000 234.748000 344.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 234.724000 356.036000 241.492000 344.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 243.628000 356.036000 247.432000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 249.532000 356.036000 253.360000 344.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 253.336000 356.036000 260.488000 344.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 260.536000 356.036000 266.272000 344.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 266.236000 356.036000 273.916000 344.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 273.940000 356.036000 281.032000 344.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 283.144000 356.036000 286.948000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 289.144000 356.036000 296.824000 344.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 296.848000 356.036000 303.940000 344.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 303.952000 356.036000 310.108000 344.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 310.048000 356.036000 317.308000 344.036000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 317.344000 356.036000 321.148000 344.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 323.248000 356.036000 327.052000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 329.248000 356.036000 338.056000 344.036000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 338.044000 356.036000 341.872000 344.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 341.944000 356.036000 349.096000 344.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 349.048000 356.036000 355.768000 344.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 355.744000 356.036000 363.004000 344.036000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 365.140000 356.036000 368.944000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 371.140000 356.036000 378.292000 344.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 378.340000 356.036000 386.068000 344.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 386.044000 356.036000 393.724000 344.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 395.740000 356.036000 399.544000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 401.644000 356.036000 411.904000 344.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 411.940000 356.036000 419.668000 344.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 419.644000 356.036000 423.472000 344.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 423.448000 356.036000 428.260000 344.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 428.344000 356.036000 435.436000 344.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 437.548000 356.036000 441.352000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 443.548000 356.036000 451.228000 344.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 451.252000 356.036000 458.980000 344.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 458.956000 356.036000 466.180000 344.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 466.156000 356.036000 470.968000 344.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 471.052000 356.036000 478.276000 344.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 478.252000 356.036000 484.408000 344.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 486.556000 356.036000 490.360000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 492.460000 356.036000 499.684000 344.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 499.660000 356.036000 504.100000 344.036000 1.000000 0.000000 0.000000 1.000000 f
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 356.036000 507.904000 344.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 342.136000 196.000000 330.136000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 196.000000 342.136000 203.092000 330.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 203.104000 342.136000 213.364000 330.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 214.504000 342.136000 218.308000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 219.400000 342.136000 227.320000 330.136000 1.000000 0.000000 0.000000 1.000000 Y
+drawChar 226.300000 342.136000 233.524000 330.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 233.500000 342.136000 239.236000 330.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 239.200000 342.136000 246.460000 330.136000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 246.500000 342.136000 250.304000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 252.500000 342.136000 256.328000 330.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 256.304000 342.136000 264.032000 330.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 265.208000 342.136000 269.012000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 270.104000 342.136000 274.916000 330.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 274.904000 342.136000 282.632000 330.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 282.704000 342.136000 289.796000 330.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 290.804000 342.136000 294.608000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 295.808000 342.136000 303.440000 330.136000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 303.404000 342.136000 311.036000 330.136000 1.000000 0.000000 0.000000 1.000000 0
+drawChar 311.108000 342.136000 314.396000 330.136000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 314.408000 342.136000 320.564000 330.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 321.608000 342.136000 325.412000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 326.504000 342.136000 333.656000 330.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 333.704000 342.136000 341.432000 330.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 341.408000 342.136000 349.088000 330.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 350.204000 342.136000 354.008000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 355.100000 342.136000 362.732000 330.136000 1.000000 0.000000 0.000000 1.000000 3
+drawChar 362.696000 342.136000 370.328000 330.136000 1.000000 0.000000 0.000000 1.000000 0
+drawChar 370.400000 342.136000 373.688000 330.136000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 373.700000 342.136000 379.856000 330.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 380.900000 342.136000 384.704000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 385.796000 342.136000 393.524000 330.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 393.500000 342.136000 400.652000 330.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 400.700000 342.136000 408.428000 330.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 408.404000 342.136000 416.084000 330.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 417.200000 342.136000 421.004000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 422.096000 342.136000 429.320000 330.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 429.392000 342.136000 437.120000 330.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 438.188000 342.136000 441.992000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 443.084000 342.136000 447.896000 330.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 447.884000 342.136000 455.612000 330.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 455.684000 342.136000 462.776000 330.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 463.880000 342.136000 467.684000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 468.776000 342.136000 479.036000 330.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 479.072000 342.136000 486.224000 330.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 486.176000 342.136000 490.004000 330.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 490.076000 342.136000 493.904000 330.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 493.880000 342.136000 500.036000 330.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 500.084000 342.136000 503.888000 330.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 342.136000 507.904000 330.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 328.236000 193.492000 316.236000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 193.504000 328.236000 201.232000 316.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 201.208000 328.236000 208.300000 316.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 209.008000 328.236000 212.812000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 213.508000 328.236000 222.316000 316.236000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 222.412000 328.236000 229.564000 316.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 229.612000 328.236000 236.380000 316.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 237.016000 328.236000 240.820000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 241.612000 328.236000 248.332000 316.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 248.308000 328.236000 255.460000 316.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 255.508000 328.236000 263.236000 316.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 263.908000 328.236000 267.712000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 268.408000 328.236000 275.560000 316.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 275.608000 328.236000 279.436000 316.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 279.412000 328.236000 285.568000 316.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 285.616000 328.236000 292.840000 316.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 293.512000 328.236000 297.316000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 298.108000 328.236000 305.788000 316.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 305.812000 328.236000 312.904000 316.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 313.612000 328.236000 317.416000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 318.112000 328.236000 325.264000 316.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 325.312000 328.236000 332.992000 316.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 332.908000 328.236000 344.284000 316.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 344.308000 328.236000 348.136000 316.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 348.208000 328.236000 353.944000 316.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 353.908000 328.236000 361.000000 316.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 361.012000 328.236000 368.692000 316.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 369.412000 328.236000 373.216000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 374.008000 328.236000 378.448000 316.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 378.412000 328.236000 384.148000 316.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 384.208000 328.236000 391.432000 316.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 391.408000 328.236000 402.784000 316.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 403.504000 328.236000 407.308000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 408.004000 328.236000 412.816000 316.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 412.804000 328.236000 420.532000 316.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 420.604000 328.236000 427.696000 316.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 428.404000 328.236000 432.208000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 433.000000 328.236000 443.260000 316.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 443.296000 328.236000 447.124000 316.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 447.100000 328.236000 454.828000 316.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 454.804000 328.236000 462.484000 316.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 462.508000 328.236000 469.732000 316.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 469.708000 328.236000 479.968000 316.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 480.712000 328.236000 484.516000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 485.212000 328.236000 492.892000 316.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 492.916000 328.236000 500.008000 316.236000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.100000 328.236000 504.144000 316.236000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 314.336000 193.228000 302.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 193.204000 314.336000 197.032000 302.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 197.104000 314.336000 204.832000 302.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 204.808000 314.336000 212.488000 302.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 212.608000 314.336000 216.412000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 216.604000 314.336000 221.416000 302.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 221.404000 314.336000 229.132000 302.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 229.204000 314.336000 236.296000 302.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.308000 314.336000 240.112000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 240.412000 314.336000 248.092000 302.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 248.116000 314.336000 255.208000 302.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 255.220000 314.336000 261.376000 302.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 261.316000 314.336000 268.576000 302.336000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 268.612000 314.336000 272.416000 302.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.512000 314.336000 276.316000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 276.508000 314.336000 286.336000 302.336000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 286.312000 314.336000 294.040000 302.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 294.208000 314.336000 298.012000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 298.204000 314.336000 303.016000 302.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 303.004000 314.336000 310.732000 302.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 310.804000 314.336000 317.896000 302.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 317.908000 314.336000 321.712000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 322.012000 314.336000 329.236000 302.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 329.212000 314.336000 336.940000 302.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 336.916000 314.336000 344.008000 302.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 344.116000 314.336000 347.920000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 348.112000 314.336000 355.840000 302.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 355.816000 314.336000 362.968000 302.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 363.016000 314.336000 370.744000 302.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 370.720000 314.336000 378.400000 302.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 378.424000 314.336000 382.228000 302.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 382.324000 314.336000 386.128000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 386.320000 314.336000 391.132000 302.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 391.216000 314.336000 398.944000 302.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 398.920000 314.336000 402.748000 302.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.820000 314.336000 408.976000 302.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 409.024000 314.336000 412.828000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 413.020000 314.336000 419.740000 302.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 419.716000 314.336000 426.868000 302.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 426.916000 314.336000 434.644000 302.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 434.716000 314.336000 438.520000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.712000 314.336000 444.868000 302.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 444.916000 314.336000 452.140000 302.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 452.116000 314.336000 463.492000 302.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 463.516000 314.336000 470.608000 302.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.620000 314.336000 475.432000 302.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 475.420000 314.336000 479.248000 302.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 314.336000 490.600000 302.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 490.624000 314.336000 497.716000 302.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 497.728000 314.336000 503.884000 302.336000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 314.336000 507.904000 302.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 300.436000 193.180000 288.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 193.204000 300.436000 200.296000 288.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 200.908000 300.436000 204.712000 288.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 205.408000 300.436000 213.088000 288.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 213.112000 300.436000 216.940000 288.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 216.916000 300.436000 223.072000 288.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 223.120000 300.436000 227.932000 288.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 227.920000 300.436000 233.656000 288.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 233.620000 300.436000 240.772000 288.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 240.820000 300.436000 247.540000 288.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 247.516000 300.436000 252.328000 288.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 252.316000 300.436000 256.144000 288.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 256.216000 300.436000 263.944000 288.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 263.920000 300.436000 271.600000 288.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 272.320000 300.436000 276.124000 288.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 276.820000 300.436000 287.080000 288.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 287.116000 300.436000 294.844000 288.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 294.820000 300.436000 301.912000 288.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 301.924000 300.436000 309.652000 288.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 310.228000 300.436000 314.032000 288.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 314.728000 300.436000 319.468000 288.436000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 319.432000 300.436000 322.720000 288.436000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 322.732000 300.436000 334.108000 288.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 334.936000 300.436000 338.740000 288.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 339.436000 300.436000 344.248000 288.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 344.236000 300.436000 349.972000 288.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 350.032000 300.436000 356.800000 288.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 356.728000 300.436000 360.556000 288.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 360.532000 300.436000 368.260000 288.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 368.236000 300.436000 375.916000 288.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 376.636000 300.436000 380.440000 288.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 381.136000 300.436000 385.948000 288.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 385.936000 300.436000 393.160000 288.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 393.832000 300.436000 397.636000 288.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.332000 300.436000 408.592000 288.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 408.628000 300.436000 415.852000 288.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 415.828000 300.436000 421.564000 288.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 421.528000 300.436000 428.788000 288.436000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 428.824000 300.436000 432.628000 288.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.324000 300.436000 437.128000 288.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 437.824000 300.436000 446.632000 288.436000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 446.620000 300.436000 454.348000 288.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 454.324000 300.436000 459.136000 288.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 459.820000 300.436000 463.624000 288.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 464.320000 300.436000 471.544000 288.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 471.616000 300.436000 479.344000 288.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 479.920000 300.436000 483.724000 288.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.420000 300.436000 489.232000 288.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.220000 300.436000 496.948000 288.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 497.020000 300.436000 504.112000 288.436000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 300.436000 508.004000 288.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 286.536000 192.724000 274.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 192.700000 286.536000 197.512000 274.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 197.500000 286.536000 205.228000 274.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 205.300000 286.536000 212.392000 274.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 212.404000 286.536000 218.140000 274.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 219.808000 286.536000 223.612000 274.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 225.304000 286.536000 233.032000 274.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 233.008000 286.536000 240.160000 274.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 240.208000 286.536000 247.936000 274.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 247.912000 286.536000 255.592000 274.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 255.616000 286.536000 259.420000 274.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 261.112000 286.536000 264.916000 274.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.608000 286.536000 270.436000 274.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 270.412000 286.536000 275.224000 274.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 277.012000 286.536000 280.816000 274.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 282.508000 286.536000 289.228000 274.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 289.204000 286.536000 296.356000 274.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 296.404000 286.536000 304.132000 274.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 305.800000 286.536000 309.604000 274.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 311.296000 286.536000 318.976000 274.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 319.000000 286.536000 326.092000 274.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 327.796000 286.536000 331.600000 274.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 333.292000 286.536000 340.384000 274.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 340.396000 286.536000 347.152000 274.536000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 347.200000 286.536000 353.920000 274.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 353.896000 286.536000 360.988000 274.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 361.000000 286.536000 368.680000 274.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 368.704000 286.536000 373.516000 274.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 373.504000 286.536000 377.332000 274.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 377.308000 286.536000 384.532000 274.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 384.604000 286.536000 392.332000 274.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 392.308000 286.536000 399.460000 274.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 399.412000 286.536000 403.240000 274.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 403.312000 286.536000 407.140000 274.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 407.212000 286.536000 413.980000 274.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 415.612000 286.536000 419.416000 274.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 421.216000 286.536000 427.936000 274.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 427.912000 286.536000 435.064000 274.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 435.112000 286.536000 438.940000 274.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 438.916000 286.536000 450.292000 274.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 450.220000 286.536000 454.048000 274.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 454.024000 286.536000 461.752000 274.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 461.824000 286.536000 469.504000 274.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 471.220000 286.536000 475.024000 274.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 476.716000 286.536000 481.396000 274.536000 1.000000 0.000000 0.000000 1.000000 (
+drawChar 481.420000 286.536000 488.572000 274.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 488.524000 286.536000 496.252000 274.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 496.324000 286.536000 504.004000 274.536000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 286.536000 507.904000 274.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 272.636000 192.652000 260.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 192.700000 272.636000 196.528000 260.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 196.504000 272.636000 202.660000 260.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 202.708000 272.636000 209.932000 260.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 210.712000 272.636000 214.516000 260.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 215.416000 272.636000 223.096000 260.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 223.120000 272.636000 228.856000 260.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 228.820000 272.636000 236.044000 260.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 236.020000 272.636000 247.396000 260.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 247.420000 272.636000 254.644000 260.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 254.620000 272.636000 259.432000 260.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 259.516000 272.636000 266.608000 260.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 266.620000 272.636000 272.776000 260.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 273.616000 272.636000 277.420000 260.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 278.320000 272.636000 286.000000 260.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 286.024000 272.636000 293.116000 260.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 293.128000 272.636000 297.940000 260.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 297.928000 272.636000 302.740000 260.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 302.728000 272.636000 309.820000 260.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 309.832000 272.636000 315.568000 260.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 316.432000 272.636000 320.236000 260.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 321.136000 272.636000 327.856000 260.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 327.832000 272.636000 335.056000 260.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 335.032000 272.636000 342.760000 260.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 342.832000 272.636000 349.552000 260.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 349.528000 272.636000 356.620000 260.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 356.632000 272.636000 364.360000 260.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 364.336000 272.636000 369.148000 260.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 369.136000 272.636000 374.872000 260.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 374.932000 272.636000 382.084000 260.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 382.036000 272.636000 386.848000 260.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 386.932000 272.636000 390.760000 260.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 390.736000 272.636000 397.960000 260.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 397.936000 272.636000 405.664000 260.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 405.736000 272.636000 410.416000 260.636000 1.000000 0.000000 0.000000 1.000000 )
+drawChar 411.232000 272.636000 415.036000 260.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 416.032000 272.636000 420.844000 260.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 420.832000 272.636000 428.056000 260.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 428.836000 272.636000 432.640000 260.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 433.540000 272.636000 438.352000 260.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 438.340000 272.636000 445.492000 260.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 445.540000 272.636000 452.800000 260.636000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 452.740000 272.636000 459.832000 260.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.840000 272.636000 464.644000 260.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 465.544000 272.636000 472.696000 260.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 472.744000 272.636000 480.472000 260.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 481.240000 272.636000 485.044000 260.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 485.944000 272.636000 493.168000 260.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 493.144000 272.636000 499.864000 260.636000 1.000000 0.000000 0.000000 1.000000 c
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 272.636000 504.044000 260.636000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 258.736000 192.220000 246.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 192.196000 258.736000 199.348000 246.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 199.396000 258.736000 205.552000 246.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 205.492000 258.736000 209.320000 246.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 209.392000 258.736000 216.616000 246.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 216.592000 258.736000 224.320000 246.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 224.296000 258.736000 231.448000 246.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 231.496000 258.736000 235.324000 246.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 236.500000 258.736000 240.304000 246.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 241.600000 258.736000 249.280000 246.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 249.304000 258.736000 255.040000 246.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 255.004000 258.736000 262.096000 246.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 262.204000 258.736000 269.356000 246.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 269.404000 258.736000 276.664000 246.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 277.804000 258.736000 281.608000 246.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 282.904000 258.736000 290.632000 246.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 290.608000 258.736000 297.832000 246.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 297.904000 258.736000 308.164000 246.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 309.304000 258.736000 313.108000 246.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 314.404000 258.736000 321.556000 246.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 321.604000 258.736000 329.332000 246.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 329.308000 258.736000 336.988000 246.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 338.212000 258.736000 342.016000 246.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 343.312000 258.736000 348.124000 246.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 348.112000 258.736000 355.840000 246.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 355.912000 258.736000 363.004000 246.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 363.016000 258.736000 370.744000 246.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.920000 258.736000 375.724000 246.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.020000 258.736000 381.832000 246.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 381.820000 258.736000 389.044000 246.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 390.316000 258.736000 394.120000 246.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 395.416000 258.736000 401.572000 246.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 401.620000 258.736000 405.448000 246.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 405.424000 258.736000 416.800000 246.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 416.824000 258.736000 424.504000 246.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 424.528000 258.736000 428.356000 246.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 428.332000 258.736000 435.100000 246.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 436.228000 258.736000 440.032000 246.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 441.424000 258.736000 451.684000 246.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 451.720000 258.736000 458.872000 246.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 458.824000 258.736000 463.636000 246.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 463.624000 258.736000 470.344000 246.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 470.428000 258.736000 478.156000 246.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 479.332000 258.736000 483.136000 246.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.432000 258.736000 489.244000 246.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.232000 258.736000 496.960000 246.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 497.032000 258.736000 504.124000 246.736000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 258.736000 507.904000 246.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 244.836000 191.656000 232.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 244.836000 199.432000 232.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 199.408000 244.836000 203.236000 232.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 203.212000 244.836000 210.892000 232.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 210.916000 244.836000 217.072000 232.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 219.820000 244.836000 223.624000 232.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 226.324000 244.836000 233.476000 232.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 233.524000 244.836000 241.252000 232.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 241.228000 244.836000 248.908000 232.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 251.524000 244.836000 255.328000 232.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 258.124000 244.836000 265.852000 232.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 265.828000 244.836000 273.556000 232.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 273.628000 244.836000 285.004000 232.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 284.932000 244.836000 292.024000 232.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 292.036000 244.836000 297.772000 232.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 297.832000 244.836000 305.056000 232.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 305.032000 244.836000 312.760000 232.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 312.736000 244.836000 318.892000 232.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 321.532000 244.836000 325.336000 232.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 328.132000 244.836000 334.288000 232.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 334.336000 244.836000 341.488000 232.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 341.440000 244.836000 345.268000 232.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 345.340000 244.836000 349.168000 232.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 349.036000 244.836000 356.716000 232.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 356.740000 244.836000 363.964000 232.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 364.036000 244.836000 371.188000 232.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 371.236000 244.836000 376.048000 232.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 375.940000 244.836000 382.096000 232.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 384.844000 244.836000 388.648000 232.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 391.348000 244.836000 398.068000 232.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 398.044000 244.836000 403.780000 232.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 403.840000 244.836000 407.668000 232.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 407.644000 244.836000 413.800000 232.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 413.848000 244.836000 420.004000 232.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 419.944000 244.836000 423.988000 232.836000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 424.048000 244.836000 430.768000 232.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 430.744000 244.836000 436.480000 232.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 436.444000 244.836000 443.668000 232.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 443.644000 244.836000 449.800000 232.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 449.848000 244.836000 456.004000 232.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 456.052000 244.836000 459.880000 232.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 459.856000 244.836000 467.584000 232.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 467.560000 244.836000 475.240000 232.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 477.964000 244.836000 481.768000 232.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.468000 244.836000 489.280000 232.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.364000 244.836000 497.092000 232.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 497.068000 244.836000 504.160000 232.836000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 244.836000 508.004000 232.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 230.936000 193.180000 218.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 193.204000 230.936000 200.356000 218.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 200.404000 230.936000 207.172000 218.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 205.600000 230.936000 209.404000 218.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 103 1 0 0 0 1200.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 205.136000 85.336000 193.136000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 85.096000 205.136000 91.012000 193.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 91.000000 205.136000 95.104000 193.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 95.104000 205.136000 100.840000 193.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 100.804000 205.136000 104.908000 193.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.908000 205.136000 113.440000 193.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 113.404000 205.136000 121.984000 193.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 122.008000 205.136000 126.184000 193.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.208000 205.136000 136.168000 193.136000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 136.204000 205.136000 144.340000 193.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 144.304000 205.136000 151.444000 193.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 151.408000 205.136000 159.388000 193.136000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 188.136000 190.240000 176.136000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 190.996000 188.136000 194.800000 176.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 195.796000 188.136000 203.476000 176.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 203.392000 188.136000 210.484000 176.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 210.496000 188.136000 214.324000 176.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 214.300000 188.136000 218.128000 176.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 218.200000 188.136000 225.880000 176.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 225.904000 188.136000 232.996000 176.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 233.008000 188.136000 238.744000 176.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 238.708000 188.136000 245.860000 176.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 245.908000 188.136000 250.720000 176.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 250.708000 188.136000 257.800000 176.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 257.812000 188.136000 261.640000 176.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 261.616000 188.136000 268.384000 176.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 269.212000 188.136000 273.016000 176.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 273.916000 188.136000 281.596000 176.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 281.620000 188.136000 289.348000 176.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 289.420000 188.136000 295.156000 176.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 295.120000 188.136000 301.840000 176.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 301.924000 188.136000 309.652000 176.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 309.520000 188.136000 316.672000 176.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 316.720000 188.136000 322.876000 176.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 322.924000 188.136000 330.016000 176.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 330.028000 188.136000 337.708000 176.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 338.428000 188.136000 342.232000 176.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 343.132000 188.136000 350.284000 176.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 351.136000 188.136000 354.940000 176.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 355.840000 188.136000 362.608000 176.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 362.644000 188.136000 369.736000 176.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 369.748000 188.136000 375.484000 176.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 375.448000 188.136000 382.216000 176.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 383.044000 188.136000 386.848000 176.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 387.748000 188.136000 391.576000 176.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 391.552000 188.136000 398.704000 176.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 398.752000 188.136000 404.488000 176.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 404.452000 188.136000 412.132000 176.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 412.156000 188.136000 419.248000 176.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 420.052000 188.136000 423.856000 176.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 424.852000 188.136000 432.532000 176.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 432.448000 188.136000 439.540000 176.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 439.552000 188.136000 445.708000 176.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 445.756000 188.136000 453.016000 176.136000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 452.956000 188.136000 456.760000 176.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 457.660000 188.136000 461.464000 176.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 462.364000 188.136000 468.520000 176.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 468.568000 188.136000 472.396000 176.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 472.372000 188.136000 480.100000 176.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 480.076000 188.136000 486.796000 176.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 486.772000 188.136000 493.864000 176.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 494.668000 188.136000 498.472000 176.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 499.468000 188.136000 504.208000 176.136000 1.000000 0.000000 0.000000 1.000000 I
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 188.136000 507.904000 176.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 174.236000 192.652000 162.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 192.700000 174.236000 204.076000 162.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 204.004000 174.236000 207.808000 162.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 208.108000 174.236000 215.260000 162.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 215.308000 174.236000 222.988000 162.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 222.904000 174.236000 234.280000 162.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 234.400000 174.236000 238.228000 162.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 238.204000 174.236000 243.016000 162.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 243.100000 174.236000 247.912000 162.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 247.804000 174.236000 254.896000 162.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 254.908000 174.236000 262.588000 162.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 262.612000 174.236000 266.440000 162.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 266.512000 174.236000 273.280000 162.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 273.412000 174.236000 277.216000 162.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.612000 174.236000 284.764000 162.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 284.608000 174.236000 292.336000 162.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 292.312000 174.236000 296.116000 162.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 296.512000 174.236000 303.604000 162.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 303.616000 174.236000 310.768000 162.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 310.720000 174.236000 316.876000 162.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 316.924000 174.236000 323.692000 162.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 323.728000 174.236000 331.408000 162.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 331.432000 174.236000 338.656000 162.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 338.632000 174.236000 342.460000 162.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 342.436000 174.236000 350.164000 162.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 350.236000 174.236000 357.916000 162.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 358.036000 174.236000 361.840000 162.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 362.032000 174.236000 369.712000 162.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 369.736000 174.236000 376.828000 162.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 376.840000 174.236000 382.576000 162.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 382.540000 174.236000 388.696000 162.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 388.744000 174.236000 395.968000 162.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 395.944000 174.236000 403.672000 162.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 403.648000 174.236000 407.452000 162.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 407.644000 174.236000 411.448000 162.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 411.640000 174.236000 419.320000 162.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 419.344000 174.236000 427.072000 162.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 427.048000 174.236000 431.860000 162.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 432.052000 174.236000 435.856000 162.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 436.048000 174.236000 443.776000 162.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 443.752000 174.236000 450.976000 162.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 451.048000 174.236000 455.860000 162.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 455.944000 174.236000 459.748000 162.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 459.940000 174.236000 467.092000 162.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 467.344000 174.236000 471.148000 162.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 471.340000 174.236000 478.060000 162.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 478.036000 174.236000 481.864000 162.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 481.936000 174.236000 489.028000 162.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 489.040000 174.236000 496.192000 162.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 496.144000 174.236000 503.872000 162.236000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 174.236000 507.904000 162.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 463.300000 86.136000 471.364000 74.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 470.800000 86.136000 477.952000 74.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 478.000000 86.136000 485.680000 74.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 485.704000 86.136000 492.796000 74.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 492.808000 86.136000 496.612000 74.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 496.600000 86.136000 504.232000 74.136000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 5134.000000 0 477.900000 5134.000000 0 477.900000 5443.800000 0 134.300000 5443.800000 0 134.300000 5134.000000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -434210.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 2145.000000 0 168.100000 2145.000000 0 168.100000 2150.000000 0 76.900000 2150.000000 0 76.900000 2145.000000 0
+eoFillPath subpath 1 163.100000 2149.900000 0 168.100000 2149.900000 0 168.100000 2280.500000 0 163.100000 2280.500000 0 163.100000 2149.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 2150.000000 0 163.100000 2150.000000 0 163.100000 2285.400000 0 72.000000 2285.400000 0 72.000000 2150.000000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 2281.080000 87.320000 2271.080000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 2281.080000 93.420000 2271.080000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 2281.080000 97.510000 2271.080000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 2281.080000 101.420000 2271.080000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 2281.080000 104.170000 2271.080000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 2281.080000 110.530000 2271.080000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 2281.080000 113.270000 2271.080000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 2281.080000 116.470000 2271.080000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 2281.080000 123.480000 2271.080000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 2281.080000 129.610000 2271.080000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 2281.080000 135.090000 2271.080000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 2281.080000 140.890000 2271.080000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 2281.080000 144.820000 2271.080000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 2281.080000 150.920000 2271.080000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 2281.080000 153.670000 2271.080000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 2281.080000 156.470000 2271.080000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 2154.200000 0 168.200000 2154.200000 0 168.200000 2269.400000 0 72.000000 2269.400000 0 72.000000 2154.200000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2222.352000 79.253000 2213.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 2222.352000 86.669000 2213.352000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 2222.352000 90.215000 2213.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 2222.352000 93.077000 2213.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 2222.352000 97.406000 2213.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 2222.352000 100.853000 2213.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 2222.352000 107.324000 2213.352000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 2222.352000 112.337000 2213.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 2222.352000 115.271000 2213.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 2222.352000 118.655000 2213.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 2222.352000 126.512000 2213.352000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 2222.352000 130.805000 2213.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 2222.352000 135.881000 2213.352000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 2222.352000 139.355000 2213.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 2222.352000 147.284000 2213.352000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 2222.352000 150.074000 2213.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 2222.352000 155.897000 2213.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 2222.352000 158.750000 2213.352000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 2222.352000 161.853000 2213.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2211.852000 82.124000 2202.852000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 2211.852000 87.137000 2202.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 2211.852000 90.071000 2202.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 2211.852000 93.356000 2202.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 2211.852000 100.403000 2202.852000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 2211.852000 104.921000 2202.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 2211.852000 109.205000 2202.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 2211.852000 117.737000 2202.852000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 2211.852000 123.119000 2202.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 2211.852000 128.996000 2202.852000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 2211.852000 132.605000 2202.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 2211.852000 138.392000 2202.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 2211.852000 141.749000 2202.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 2211.852000 149.507000 2202.852000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 2211.852000 153.800000 2202.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 2211.852000 158.876000 2202.852000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 2211.852000 161.853000 2202.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2201.352000 81.764000 2192.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 2201.352000 87.596000 2192.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 2201.352000 93.356000 2192.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 2201.352000 102.050000 2192.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 2201.352000 113.822000 2192.352000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 2201.352000 122.651000 2192.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 2201.352000 134.117000 2192.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 2201.352000 138.401000 2192.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 2201.352000 147.149000 2192.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 2201.352000 158.921000 2192.352000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 2201.352000 161.853000 2192.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2190.852000 79.271000 2181.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 2190.852000 84.338000 2181.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 2190.852000 89.621000 2181.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 2190.852000 94.643000 2181.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 2190.852000 100.502000 2181.852000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 2190.852000 106.262000 2181.852000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 2190.852000 111.518000 2181.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 2190.852000 116.216000 2181.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 2190.852000 119.249000 2181.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 2190.852000 122.363000 2181.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 2190.852000 128.186000 2181.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 2190.852000 131.345000 2181.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 2190.852000 137.060000 2181.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 2190.852000 140.147000 2181.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 2190.852000 145.007000 2181.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 2190.852000 148.598000 2181.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 2190.852000 151.460000 2181.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 2190.852000 155.789000 2181.852000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 2190.852000 158.933000 2181.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2180.352000 80.702000 2171.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 2180.352000 83.573000 2171.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 2180.352000 89.396000 2171.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 2180.352000 95.156000 2171.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 2180.352000 100.547000 2171.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 2180.352000 109.052000 2171.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 2180.352000 111.959000 2171.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 2180.352000 117.251000 2171.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 2180.352000 121.904000 2171.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 2180.352000 126.503000 2171.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 2180.352000 129.338000 2171.352000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 2180.352000 134.936000 2171.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 2180.352000 143.441000 2171.352000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 2180.352000 148.796000 2171.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 2180.352000 154.574000 2171.352000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 2180.352000 158.876000 2171.352000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 2180.352000 161.853000 2171.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2169.852000 79.271000 2160.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 2169.852000 85.094000 2160.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 2169.852000 88.703000 2160.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 2169.852000 94.112000 2160.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 2169.852000 97.244000 2160.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 2169.852000 103.058000 2160.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 2169.852000 108.890000 2160.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 2169.852000 111.950000 2160.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 2169.852000 115.271000 2160.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 2169.852000 120.338000 2160.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 2169.852000 125.621000 2160.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 2169.852000 131.363000 2160.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 2169.852000 134.558000 2160.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 2169.852000 140.048000 2160.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 2169.852000 145.430000 2160.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 2169.852000 150.551000 2160.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 2169.852000 155.960000 2160.852000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 2169.852000 158.933000 2160.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2159.352000 80.009000 2150.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 2159.352000 85.364000 2150.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 2159.352000 88.271000 2150.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 2159.352000 91.169000 2150.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 2159.352000 97.955000 2150.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 2159.352000 107.765000 2150.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 2159.352000 110.672000 2150.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 2159.352000 115.964000 2150.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 2159.352000 120.617000 2150.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 2159.352000 125.216000 2150.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 2159.352000 128.051000 2150.352000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 2159.352000 134.954000 2150.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 2159.352000 146.285000 2150.352000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 2159.352000 151.667000 2150.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 2159.352000 155.906000 2150.352000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 2159.352000 159.033000 2150.352000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 2149.900000 0 72.100000 2149.900000 0 72.100000 2285.400000 0 72.000000 2285.400000 0 72.000000 2149.900000 0
+eoFillPath subpath 1 163.100000 2149.900000 0 163.200000 2149.900000 0 163.200000 2285.400000 0 163.100000 2285.400000 0 163.100000 2149.900000 0
+eoFillPath subpath 1 72.000000 2285.300000 0 163.200000 2285.300000 0 163.200000 2285.400000 0 72.000000 2285.400000 0 72.000000 2285.300000 0
+eoFillPath subpath 1 72.000000 2149.900000 0 163.200000 2149.900000 0 163.200000 2150.000000 0 72.000000 2150.000000 0 72.000000 2149.900000 0
+saveState
+eoClipPath subpath 1 96.900000 2225.200000 0 138.300000 2225.200000 0 138.300000 2269.400000 0 96.900000 2269.400000 0 96.900000 2225.200000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -143330.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 1870.400000 0 165.500000 1870.400000 0 165.500000 1875.400000 0 76.900000 1875.400000 0 76.900000 1870.400000 0
+eoFillPath subpath 1 160.500000 1875.300000 0 165.500000 1875.300000 0 165.500000 2031.600000 0 160.500000 2031.600000 0 160.500000 1875.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 1875.400000 0 121.400000 1875.400000 0 121.400000 2036.500000 0 72.000000 2036.500000 0 72.000000 1875.400000 0
+saveState
+eoClipPath subpath 1 72.000000 1875.300000 0 160.500000 1875.300000 0 160.500000 2036.400000 0 72.000000 2036.400000 0 72.000000 1875.300000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -106630.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 2032.180000 89.280000 2022.180000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 2032.180000 95.630000 2022.180000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 2032.180000 99.520000 2022.180000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 2032.180000 102.270000 2022.180000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 2032.180000 108.450000 2022.180000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 2032.180000 112.610000 2022.180000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 2032.180000 118.510000 2022.180000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 2032.180000 121.670000 2022.180000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 2032.180000 124.470000 2022.180000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 2032.180000 130.830000 2022.180000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 2032.180000 133.970000 2022.180000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 2032.180000 137.920000 2022.180000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 2032.180000 144.230000 2022.180000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 2032.180000 150.350000 2022.180000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 2032.180000 153.570000 2022.180000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 2020.480000 95.000000 2010.480000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 2020.480000 97.770000 2010.480000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 2020.480000 103.000000 2010.480000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 2020.480000 109.330000 2010.480000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 2020.480000 117.470000 2010.480000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 2020.480000 123.620000 2010.480000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 2020.480000 128.800000 2010.480000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 2020.480000 135.130000 2010.480000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 2020.480000 141.250000 2010.480000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 2020.480000 145.410000 2010.480000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2005.652000 82.961000 1996.652000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 2005.652000 87.614000 1996.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 2005.652000 93.356000 1996.652000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 2005.652000 98.612000 1996.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 2005.652000 103.733000 1996.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 2005.652000 106.568000 1996.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 2005.652000 111.959000 1996.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 2005.652000 114.866000 1996.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 2005.652000 117.665000 1996.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 2005.652000 122.768000 1996.652000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 2005.652000 125.747000 1996.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 2005.652000 131.651000 1996.652000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 2005.652000 136.907000 1996.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 2005.652000 142.307000 1996.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 2005.652000 148.049000 1996.652000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 2005.652000 150.956000 1996.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 2005.652000 156.302000 1996.652000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 2005.652000 159.253000 1996.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1995.152000 84.095000 1986.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 1995.152000 89.900000 1986.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 1995.152000 95.318000 1986.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 1995.152000 100.349000 1986.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 1995.152000 110.789000 1986.152000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 1995.152000 111.464000 1986.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 1995.152000 114.362000 1986.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 1995.152000 119.348000 1986.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 1995.152000 126.962000 1986.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 1995.152000 132.047000 1986.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 1995.152000 139.958000 1986.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 1995.152000 142.865000 1986.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 1995.152000 147.410000 1986.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 1995.152000 153.287000 1986.152000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 1995.152000 156.333000 1986.152000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1984.652000 84.095000 1975.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 1984.652000 89.468000 1975.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 1984.652000 94.121000 1975.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 1984.652000 99.899000 1975.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 1984.652000 105.218000 1975.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 1984.652000 109.502000 1975.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 1984.652000 115.649000 1975.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 1984.652000 122.327000 1975.652000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 1984.652000 127.718000 1975.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 1984.652000 132.002000 1975.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 1984.652000 138.149000 1975.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 1984.652000 145.205000 1975.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 1984.652000 150.992000 1975.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 1984.652000 156.311000 1975.652000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1984.652000 159.253000 1975.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1974.152000 82.394000 1965.152000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 1974.152000 86.705000 1965.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 1974.152000 91.322000 1965.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 1974.152000 94.913000 1965.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 1974.152000 98.054000 1965.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 1974.152000 102.014000 1965.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 1974.152000 104.876000 1965.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 1974.152000 113.435000 1965.152000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 1974.152000 118.718000 1965.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 1974.152000 121.949000 1965.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 1974.152000 125.063000 1965.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 1974.152000 130.886000 1965.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 1974.152000 134.045000 1965.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 1974.152000 138.005000 1965.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 1974.152000 143.792000 1965.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 1974.152000 149.111000 1965.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 1974.152000 151.964000 1965.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 1974.152000 156.293000 1965.152000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 1974.152000 159.153000 1965.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1963.652000 79.271000 1954.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 1963.652000 82.169000 1954.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 1963.652000 85.526000 1954.652000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 1963.652000 90.818000 1954.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 1963.652000 94.454000 1954.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 1963.652000 99.008000 1954.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 1963.652000 104.318000 1954.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 1963.652000 110.096000 1954.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 1963.652000 115.856000 1954.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 1963.652000 119.546000 1954.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 1963.652000 124.001000 1954.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 1963.652000 129.509000 1954.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 1963.652000 133.145000 1954.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 1963.652000 139.751000 1954.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 1963.652000 145.205000 1954.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 1963.652000 148.841000 1954.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 1963.652000 152.657000 1954.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 1963.652000 156.293000 1954.652000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1963.652000 159.253000 1954.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1953.152000 84.095000 1944.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 1953.152000 88.406000 1944.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 1953.152000 93.824000 1944.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 1953.152000 99.602000 1944.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 1953.152000 105.362000 1944.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 1953.152000 108.422000 1944.152000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 1953.152000 116.747000 1944.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 1953.152000 129.275000 1944.152000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 1953.152000 135.089000 1944.152000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 1953.152000 138.698000 1944.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 1953.152000 141.560000 1944.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 1953.152000 146.906000 1944.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 1953.152000 151.190000 1944.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 1953.152000 156.266000 1944.152000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1953.152000 159.253000 1944.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1942.652000 82.196000 1933.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 1942.652000 87.560000 1933.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 1942.652000 92.213000 1933.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 1942.652000 96.551000 1933.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 1942.652000 101.708000 1933.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 1942.652000 107.216000 1933.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 1942.652000 111.653000 1933.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 1942.652000 118.961000 1933.652000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 1942.652000 124.316000 1933.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 1942.652000 128.654000 1933.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 1942.652000 133.172000 1933.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 1942.652000 138.995000 1933.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 1942.652000 143.612000 1933.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 1942.652000 148.913000 1933.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 1942.652000 153.197000 1933.652000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 1942.652000 156.333000 1933.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1932.152000 80.009000 1923.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 1932.152000 85.319000 1923.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 1932.152000 91.061000 1923.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 1932.152000 100.052000 1923.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 1932.152000 113.993000 1923.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 1932.152000 116.873000 1923.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 1932.152000 120.410000 1923.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 1932.152000 126.296000 1923.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 1932.152000 135.350000 1923.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 1932.152000 145.106000 1923.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 1932.152000 150.893000 1923.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 1932.152000 156.212000 1923.152000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1932.152000 159.253000 1923.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1921.652000 82.196000 1912.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 1921.652000 87.560000 1912.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 1921.652000 93.392000 1912.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 1921.652000 99.152000 1912.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 1921.652000 101.960000 1912.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 1921.652000 107.306000 1912.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 1921.652000 111.905000 1912.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 1921.652000 115.640000 1912.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 1921.652000 122.444000 1912.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 1921.652000 127.898000 1912.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 1921.652000 135.575000 1912.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 1921.652000 141.380000 1912.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 1921.652000 145.241000 1912.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 1921.652000 150.803000 1912.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 1921.652000 156.302000 1912.652000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1921.652000 159.253000 1912.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1911.152000 80.009000 1902.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 1911.152000 85.796000 1902.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 1911.152000 91.115000 1902.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 1911.152000 95.399000 1902.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 1911.152000 100.718000 1902.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 1911.152000 107.054000 1902.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 1911.152000 118.097000 1902.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 1911.152000 123.524000 1902.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 1911.152000 129.401000 1902.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 1911.152000 131.768000 1902.152000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 1911.152000 135.413000 1902.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 1911.152000 141.659000 1902.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 1911.152000 150.965000 1902.152000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 1911.152000 156.320000 1902.152000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1911.152000 159.253000 1902.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1900.652000 81.017000 1891.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 1900.652000 84.608000 1891.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 1900.652000 89.963000 1891.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 1900.652000 92.870000 1891.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 1900.652000 98.693000 1891.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 1900.652000 103.310000 1891.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 1900.652000 107.243000 1891.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 1900.652000 116.081000 1891.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 1900.652000 121.886000 1891.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 1900.652000 127.205000 1891.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 1900.652000 132.983000 1891.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 1900.652000 136.943000 1891.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 1900.652000 143.846000 1891.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 1900.652000 148.184000 1891.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 1900.652000 153.260000 1891.652000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 1900.652000 156.433000 1891.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1890.152000 79.271000 1881.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 1890.152000 85.094000 1881.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 1890.152000 90.854000 1881.152000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 1890.152000 93.653000 1881.152000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 1875.300000 0 72.100000 1875.300000 0 72.100000 2036.500000 0 72.000000 2036.500000 0 72.000000 1875.300000 0
+eoFillPath subpath 1 160.500000 1875.300000 0 160.600000 1875.300000 0 160.600000 2036.500000 0 160.500000 2036.500000 0 160.500000 1875.300000 0
+eoFillPath subpath 1 72.000000 2036.400000 0 160.600000 2036.400000 0 160.600000 2036.500000 0 72.000000 2036.500000 0 72.000000 2036.400000 0
+eoFillPath subpath 1 72.000000 1875.300000 0 160.600000 1875.300000 0 160.600000 1875.400000 0 72.000000 1875.400000 0 72.000000 1875.300000 0
+saveState
+eoClipPath subpath 1 108.000000 1387.900000 0 178.900000 1387.900000 0 178.900000 1444.600000 0 108.000000 1444.600000 0 108.000000 1387.900000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -59600.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -2670.500000 0 165.500000 -2670.500000 0 165.500000 -2665.500000 0 76.900000 -2665.500000 0 76.900000 -2670.500000 0
+eoFillPath subpath 1 160.500000 -2665.600000 0 165.500000 -2665.600000 0 165.500000 -2556.800000 0 160.500000 -2556.800000 0 160.500000 -2665.600000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -2665.500000 0 160.500000 -2665.500000 0 160.500000 -2551.900000 0 72.000000 -2551.900000 0 72.000000 -2665.500000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2556.248000 83.771000 -2565.248000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 -2556.248000 89.594000 -2565.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 -2556.248000 92.465000 -2565.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 -2556.248000 97.568000 -2565.248000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 -2556.248000 100.943000 -2565.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 -2556.248000 106.955000 -2565.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 -2556.248000 110.447000 -2565.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 -2556.248000 114.425000 -2565.248000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 -2556.248000 119.717000 -2565.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 -2556.248000 127.493000 -2565.248000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 -2556.248000 130.949000 -2565.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 -2556.248000 136.574000 -2565.248000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 -2556.248000 141.920000 -2565.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 -2556.248000 147.365000 -2565.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 -2556.248000 151.703000 -2565.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 -2556.248000 156.320000 -2565.248000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -2556.248000 159.153000 -2565.248000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2566.748000 81.764000 -2575.748000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -2566.748000 85.130000 -2575.748000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 -2566.748000 88.712000 -2575.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 -2566.748000 94.022000 -2575.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 -2566.748000 98.306000 -2575.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -2566.748000 102.455000 -2575.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 -2566.748000 106.676000 -2575.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 -2566.748000 110.312000 -2575.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 -2566.748000 114.920000 -2575.748000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 -2566.748000 119.060000 -2575.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 -2566.748000 125.450000 -2575.748000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 -2566.748000 130.832000 -2575.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 -2566.748000 139.445000 -2575.748000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 -2566.748000 145.169000 -2575.748000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 -2566.748000 148.076000 -2575.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 -2566.748000 153.323000 -2575.748000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -2566.748000 156.433000 -2575.748000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2577.248000 80.009000 -2586.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -2577.248000 82.871000 -2586.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 -2577.248000 88.316000 -2586.248000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 -2577.248000 94.094000 -2586.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 -2577.248000 96.947000 -2586.248000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 -2577.248000 104.948000 -2586.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 -2577.248000 113.705000 -2586.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 -2577.248000 119.492000 -2586.248000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 -2577.248000 124.811000 -2586.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 -2577.248000 132.848000 -2586.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 -2577.248000 141.605000 -2586.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 -2577.248000 144.467000 -2586.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 -2577.248000 148.103000 -2586.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 -2577.248000 150.965000 -2586.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 -2577.248000 156.311000 -2586.248000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2577.248000 159.253000 -2586.248000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2587.748000 80.999000 -2596.748000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 -2587.748000 90.539000 -2596.748000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 -2587.748000 95.318000 -2596.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 -2587.748000 99.602000 -2596.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -2587.748000 102.473000 -2596.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 -2587.748000 108.260000 -2596.748000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 -2587.748000 110.762000 -2596.748000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 -2587.748000 115.316000 -2596.748000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 -2587.748000 122.156000 -2596.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 -2587.748000 132.299000 -2596.748000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 -2587.748000 136.970000 -2596.748000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 -2587.748000 139.877000 -2596.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 -2587.748000 142.775000 -2596.748000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 -2587.748000 148.022000 -2596.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 -2587.748000 152.720000 -2596.748000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 -2587.748000 156.311000 -2596.748000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2587.748000 159.253000 -2596.748000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2598.248000 83.006000 -2607.248000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 -2598.248000 88.793000 -2607.248000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 -2598.248000 91.664000 -2607.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 -2598.248000 94.562000 -2607.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 -2598.248000 100.349000 -2607.248000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 -2598.248000 103.157000 -2607.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 -2598.248000 108.980000 -2607.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 -2598.248000 114.740000 -2607.248000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 -2598.248000 119.375000 -2607.248000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 -2598.248000 128.033000 -2607.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 -2598.248000 141.479000 -2607.248000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 -2598.248000 146.807000 -2607.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -2598.248000 152.684000 -2607.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 -2598.248000 156.293000 -2607.248000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2598.248000 159.253000 -2607.248000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2608.748000 79.730000 -2617.748000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 -2608.748000 84.005000 -2617.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 -2608.748000 89.423000 -2617.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 -2608.748000 98.036000 -2617.748000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 -2608.748000 121.157000 -2617.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 -2608.748000 145.115000 -2617.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 -2608.748000 151.001000 -2617.748000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 -2608.748000 156.320000 -2617.748000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -2608.748000 159.253000 -2617.748000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2619.248000 83.285000 -2628.248000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 -2619.248000 89.099000 -2628.248000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 -2619.248000 93.401000 -2628.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 -2619.248000 98.477000 -2628.248000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 -2619.248000 103.121000 -2628.248000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 -2619.248000 105.974000 -2628.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 -2619.248000 111.320000 -2628.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 -2619.248000 115.604000 -2628.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 -2619.248000 123.857000 -2628.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 -2619.248000 136.007000 -2628.248000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 -2619.248000 141.794000 -2628.248000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 -2619.248000 144.665000 -2628.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 -2619.248000 147.464000 -2628.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 -2619.248000 153.251000 -2628.248000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -2619.248000 156.433000 -2628.248000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2629.748000 79.271000 -2638.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -2629.748000 85.094000 -2638.748000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -2629.748000 90.854000 -2638.748000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 -2629.748000 96.146000 -2638.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 -2629.748000 102.302000 -2638.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 -2629.748000 107.711000 -2638.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 -2629.748000 113.048000 -2638.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 -2629.748000 119.204000 -2638.748000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 -2629.748000 124.991000 -2638.748000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 -2629.748000 130.310000 -2638.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 -2629.748000 135.647000 -2638.748000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 -2629.748000 144.755000 -2638.748000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 -2629.748000 153.323000 -2638.748000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -2629.748000 156.333000 -2638.748000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2640.248000 82.160000 -2649.248000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 -2640.248000 85.067000 -2649.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 -2640.248000 89.297000 -2649.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 -2640.248000 94.616000 -2649.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 -2640.248000 98.747000 -2649.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 -2640.248000 106.055000 -2649.248000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 -2640.248000 109.700000 -2649.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 -2640.248000 115.055000 -2649.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 -2640.248000 118.601000 -2649.248000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 -2640.248000 124.010000 -2649.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 -2640.248000 128.042000 -2649.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 -2640.248000 135.998000 -2649.248000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 -2640.248000 141.785000 -2649.248000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 -2640.248000 144.656000 -2649.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 -2640.248000 147.554000 -2649.248000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 -2640.248000 153.341000 -2649.248000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -2640.248000 156.433000 -2649.248000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -2650.748000 79.271000 -2659.748000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -2650.748000 85.094000 -2659.748000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -2650.748000 90.854000 -2659.748000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 -2650.748000 93.743000 -2659.748000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -2665.600000 0 72.100000 -2665.600000 0 72.100000 -2551.900000 0 72.000000 -2551.900000 0 72.000000 -2665.600000 0
+eoFillPath subpath 1 160.500000 -2665.600000 0 160.600000 -2665.600000 0 160.600000 -2551.900000 0 160.500000 -2551.900000 0 160.500000 -2665.600000 0
+eoFillPath subpath 1 72.000000 -2552.000000 0 160.600000 -2552.000000 0 160.600000 -2551.900000 0 72.000000 -2551.900000 0 72.000000 -2552.000000 0
+eoFillPath subpath 1 72.000000 -2665.600000 0 160.600000 -2665.600000 0 160.600000 -2665.500000 0 72.000000 -2665.500000 0 72.000000 -2665.600000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 3524.000000 0 169.600000 3524.000000 0 169.600000 3529.000000 0 76.900000 3529.000000 0 76.900000 3524.000000 0
+eoFillPath subpath 1 164.600000 3528.900000 0 169.600000 3528.900000 0 169.600000 3644.500000 0 164.600000 3644.500000 0 164.600000 3528.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 3529.000000 0 121.400000 3529.000000 0 121.400000 3649.400000 0 72.000000 3649.400000 0 72.000000 3529.000000 0
+saveState
+eoClipPath subpath 1 72.000000 3528.900000 0 164.600000 3528.900000 0 164.600000 3649.300000 0 72.000000 3649.300000 0 72.000000 3528.900000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -267870.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 3598.900000 0 93.700000 3598.900000 0 93.700000 3618.100000 0 72.000000 3618.100000 0 72.000000 3598.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 3598.900000 0 169.600000 3598.900000 0 169.600000 3618.100000 0 93.700000 3618.100000 0 93.700000 3598.900000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 3582.200000 0 93.700000 3582.200000 0 93.700000 3598.900000 0 72.000000 3598.900000 0 72.000000 3582.200000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 3582.200000 0 169.600000 3582.200000 0 169.600000 3598.900000 0 93.700000 3598.900000 0 93.700000 3582.200000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 3563.000000 0 93.700000 3563.000000 0 93.700000 3582.200000 0 72.000000 3582.200000 0 72.000000 3563.000000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 3563.000000 0 169.600000 3563.000000 0 169.600000 3582.200000 0 93.700000 3582.200000 0 93.700000 3563.000000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 3543.800000 0 93.700000 3543.800000 0 93.700000 3563.000000 0 72.000000 3563.000000 0 72.000000 3543.800000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 3543.800000 0 169.600000 3543.800000 0 169.600000 3563.000000 0 93.700000 3563.000000 0 93.700000 3543.800000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3645.052000 82.898000 3636.052000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 3645.052000 87.200000 3636.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 3645.052000 90.809000 3636.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 3645.052000 93.671000 3636.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 3645.052000 98.315000 3636.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 3645.052000 101.906000 3636.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 3645.052000 106.514000 3636.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 3645.052000 109.754000 3636.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 3645.052000 112.868000 3636.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 3645.052000 118.691000 3636.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 3645.052000 121.850000 3636.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 3645.052000 125.702000 3636.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 3645.052000 131.588000 3636.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 3645.052000 136.907000 3636.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 3645.052000 140.039000 3636.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 3645.052000 146.078000 3636.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 3645.052000 151.442000 3636.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 3645.052000 154.349000 3636.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 3645.052000 157.148000 3636.052000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 3645.052000 160.433000 3636.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3634.552000 84.095000 3625.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 3634.552000 89.468000 3625.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 3634.552000 94.580000 3625.552000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 3634.552000 97.631000 3625.552000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 3614.152000 104.443000 3605.152000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 3614.152000 109.060000 3605.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 3614.152000 113.398000 3605.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 3614.152000 119.194000 3605.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 3614.152000 124.612000 3605.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 3614.152000 127.465000 3605.152000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 3597.452000 101.176000 3588.452000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 3597.452000 104.074000 3588.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 3597.452000 109.420000 3588.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 3597.452000 114.442000 3588.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 3597.452000 120.202000 3588.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 3597.452000 123.811000 3588.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 3597.452000 129.121000 3588.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 3597.452000 134.899000 3588.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 3597.452000 139.516000 3588.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 3597.452000 143.107000 3588.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 3597.452000 148.417000 3588.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 3597.452000 151.270000 3588.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 3597.452000 157.093000 3588.452000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 3580.752000 103.048000 3571.752000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 3580.752000 108.421000 3571.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 3580.752000 113.443000 3571.752000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 3580.752000 118.852000 3571.752000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 3580.752000 124.702000 3571.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 3580.752000 130.021000 3571.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 3580.752000 135.079000 3571.752000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 3561.552000 104.407000 3552.552000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 3561.552000 109.816000 3552.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 3561.552000 115.594000 3552.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 3561.552000 121.354000 3552.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 3561.552000 125.692000 3552.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 3561.552000 128.563000 3552.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 3561.552000 133.954000 3552.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 3561.552000 139.786000 3552.552000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 3528.900000 0 72.100000 3528.900000 0 72.100000 3649.400000 0 72.000000 3649.400000 0 72.000000 3528.900000 0
+eoFillPath subpath 1 164.600000 3528.900000 0 164.700000 3528.900000 0 164.700000 3649.400000 0 164.600000 3649.400000 0 164.600000 3528.900000 0
+eoFillPath subpath 1 72.000000 3649.300000 0 164.700000 3649.300000 0 164.700000 3649.400000 0 72.000000 3649.400000 0 72.000000 3649.300000 0
+eoFillPath subpath 1 72.000000 3528.900000 0 164.700000 3528.900000 0 164.700000 3529.000000 0 72.000000 3529.000000 0 72.000000 3528.900000 0
+eoFillPath subpath 1 91.300000 3543.800000 0 93.700000 3543.800000 0 93.700000 3618.100000 0 91.300000 3618.100000 0 91.300000 3543.800000 0
+eoFillPath subpath 1 72.000000 3563.000000 0 169.600000 3563.000000 0 169.600000 3565.400000 0 72.000000 3565.400000 0 72.000000 3563.000000 0
+eoFillPath subpath 1 72.000000 3615.700000 0 169.600000 3615.700000 0 169.600000 3618.100000 0 72.000000 3618.100000 0 72.000000 3615.700000 0
+eoFillPath subpath 1 72.000000 3543.800000 0 169.600000 3543.800000 0 169.600000 3546.200000 0 72.000000 3546.200000 0 72.000000 3543.800000 0
+saveState
+eoClipPath subpath 1 108.000000 -4322.200000 0 150.800000 -4322.200000 0 150.800000 -4278.000000 0 108.000000 -4278.000000 0 108.000000 -4322.200000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 511420.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 -5172.200000 0 499.600000 -5172.200000 0 499.600000 -5167.100000 0 186.800000 -5167.100000 0 186.800000 -5172.200000 0
+eoFillPath subpath 1 494.500000 -5167.200000 0 499.600000 -5167.200000 0 499.600000 -4978.800000 0 494.500000 -4978.800000 0 494.500000 -5167.200000 0
+saveState
+eoClipPath subpath 1 181.800000 -5167.100000 0 494.500000 -5167.100000 0 494.500000 -4973.800000 0 181.800000 -4973.800000 0 181.800000 -5167.100000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 -4973.700000 0 494.500000 -4973.700000 0 494.500000 -4973.700000 0 181.700000 -4973.700000 0
+eoFillPath subpath 1 181.700000 -4973.700000 0 494.500000 -4973.700000 0 494.500000 -4974.500000 0 181.700000 -4974.500000 0 181.700000 -4973.700000 0
+eoFillPath subpath 1 181.700000 -4974.500000 0 494.500000 -4974.500000 0 494.500000 -4975.200000 0 181.700000 -4975.200000 0 181.700000 -4974.500000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 -4975.200000 0 494.500000 -4975.200000 0 494.500000 -4976.000000 0 181.700000 -4976.000000 0 181.700000 -4975.200000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 -4976.000000 0 494.500000 -4976.000000 0 494.500000 -4976.800000 0 181.700000 -4976.800000 0 181.700000 -4976.000000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 -4976.800000 0 494.500000 -4976.800000 0 494.500000 -4977.500000 0 181.700000 -4977.500000 0 181.700000 -4976.800000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 -4977.500000 0 494.500000 -4977.500000 0 494.500000 -4978.300000 0 181.700000 -4978.300000 0 181.700000 -4977.500000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 -4978.300000 0 494.500000 -4978.300000 0 494.500000 -4979.000000 0 181.700000 -4979.000000 0 181.700000 -4978.300000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 -4979.000000 0 494.500000 -4979.000000 0 494.500000 -4979.800000 0 181.700000 -4979.800000 0 181.700000 -4979.000000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 -4979.800000 0 494.500000 -4979.800000 0 494.500000 -4980.500000 0 181.700000 -4980.500000 0 181.700000 -4979.800000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 -4980.500000 0 494.500000 -4980.500000 0 494.500000 -4981.300000 0 181.700000 -4981.300000 0 181.700000 -4980.500000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 -4981.300000 0 494.500000 -4981.300000 0 494.500000 -4982.100000 0 181.700000 -4982.100000 0 181.700000 -4981.300000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 -4982.100000 0 494.500000 -4982.100000 0 494.500000 -4982.800000 0 181.700000 -4982.800000 0 181.700000 -4982.100000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 -4982.800000 0 494.500000 -4982.800000 0 494.500000 -4983.600000 0 181.700000 -4983.600000 0 181.700000 -4982.800000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 -4983.600000 0 494.500000 -4983.600000 0 494.500000 -4984.300000 0 181.700000 -4984.300000 0 181.700000 -4983.600000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 -4984.300000 0 494.500000 -4984.300000 0 494.500000 -4985.100000 0 181.700000 -4985.100000 0 181.700000 -4984.300000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 -4985.100000 0 494.500000 -4985.100000 0 494.500000 -4985.900000 0 181.700000 -4985.900000 0 181.700000 -4985.100000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 -4985.900000 0 494.500000 -4985.900000 0 494.500000 -4986.600000 0 181.700000 -4986.600000 0 181.700000 -4985.900000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 -4986.600000 0 494.500000 -4986.600000 0 494.500000 -4987.400000 0 181.700000 -4987.400000 0 181.700000 -4986.600000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 -4987.400000 0 494.500000 -4987.400000 0 494.500000 -4988.100000 0 181.700000 -4988.100000 0 181.700000 -4987.400000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 -4988.100000 0 494.500000 -4988.100000 0 494.500000 -4988.900000 0 181.700000 -4988.900000 0 181.700000 -4988.100000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 -4988.900000 0 494.500000 -4988.900000 0 494.500000 -4989.700000 0 181.700000 -4989.700000 0 181.700000 -4988.900000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 -4989.700000 0 494.500000 -4989.700000 0 494.500000 -4990.400000 0 181.700000 -4990.400000 0 181.700000 -4989.700000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 -4990.400000 0 494.500000 -4990.400000 0 494.500000 -4991.200000 0 181.700000 -4991.200000 0 181.700000 -4990.400000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 -4991.200000 0 494.500000 -4991.200000 0 494.500000 -4991.900000 0 181.700000 -4991.900000 0 181.700000 -4991.200000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 -4991.900000 0 494.500000 -4991.900000 0 494.500000 -4992.700000 0 181.700000 -4992.700000 0 181.700000 -4991.900000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 -4992.700000 0 494.500000 -4992.700000 0 494.500000 -4993.400000 0 181.700000 -4993.400000 0 181.700000 -4992.700000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 -4993.400000 0 494.500000 -4993.400000 0 494.500000 -4994.200000 0 181.700000 -4994.200000 0 181.700000 -4993.400000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 -4994.200000 0 494.500000 -4994.200000 0 494.500000 -4995.000000 0 181.700000 -4995.000000 0 181.700000 -4994.200000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 -4995.000000 0 494.500000 -4995.000000 0 494.500000 -4995.700000 0 181.700000 -4995.700000 0 181.700000 -4995.000000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 -4995.700000 0 494.500000 -4995.700000 0 494.500000 -4996.500000 0 181.700000 -4996.500000 0 181.700000 -4995.700000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 -4996.500000 0 494.500000 -4996.500000 0 494.500000 -4997.200000 0 181.700000 -4997.200000 0 181.700000 -4996.500000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 -4997.200000 0 494.500000 -4997.200000 0 494.500000 -4998.000000 0 181.700000 -4998.000000 0 181.700000 -4997.200000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 -4998.000000 0 494.500000 -4998.000000 0 494.500000 -4998.800000 0 181.700000 -4998.800000 0 181.700000 -4998.000000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 -4998.800000 0 494.500000 -4998.800000 0 494.500000 -4999.500000 0 181.700000 -4999.500000 0 181.700000 -4998.800000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 -4999.500000 0 494.500000 -4999.500000 0 494.500000 -5000.300000 0 181.700000 -5000.300000 0 181.700000 -4999.500000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 -5000.300000 0 494.500000 -5000.300000 0 494.500000 -5001.000000 0 181.700000 -5001.000000 0 181.700000 -5000.300000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 -5001.000000 0 494.500000 -5001.000000 0 494.500000 -5001.800000 0 181.700000 -5001.800000 0 181.700000 -5001.000000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 -5001.800000 0 494.500000 -5001.800000 0 494.500000 -5002.600000 0 181.700000 -5002.600000 0 181.700000 -5001.800000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 -5002.600000 0 494.500000 -5002.600000 0 494.500000 -5003.300000 0 181.700000 -5003.300000 0 181.700000 -5002.600000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 -5003.300000 0 494.500000 -5003.300000 0 494.500000 -5004.100000 0 181.700000 -5004.100000 0 181.700000 -5003.300000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 -5004.100000 0 494.500000 -5004.100000 0 494.500000 -5004.800000 0 181.700000 -5004.800000 0 181.700000 -5004.100000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 -5004.800000 0 494.500000 -5004.800000 0 494.500000 -5005.600000 0 181.700000 -5005.600000 0 181.700000 -5004.800000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 -5005.600000 0 494.500000 -5005.600000 0 494.500000 -5006.300000 0 181.700000 -5006.300000 0 181.700000 -5005.600000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 -5006.300000 0 494.500000 -5006.300000 0 494.500000 -5007.100000 0 181.700000 -5007.100000 0 181.700000 -5006.300000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 -5007.100000 0 494.500000 -5007.100000 0 494.500000 -5007.900000 0 181.700000 -5007.900000 0 181.700000 -5007.100000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 -5007.900000 0 494.500000 -5007.900000 0 494.500000 -5008.600000 0 181.700000 -5008.600000 0 181.700000 -5007.900000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 -5008.600000 0 494.500000 -5008.600000 0 494.500000 -5009.400000 0 181.700000 -5009.400000 0 181.700000 -5008.600000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 -5009.400000 0 494.500000 -5009.400000 0 494.500000 -5010.100000 0 181.700000 -5010.100000 0 181.700000 -5009.400000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 -5010.100000 0 494.500000 -5010.100000 0 494.500000 -5010.900000 0 181.700000 -5010.900000 0 181.700000 -5010.100000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 -5010.900000 0 494.500000 -5010.900000 0 494.500000 -5011.700000 0 181.700000 -5011.700000 0 181.700000 -5010.900000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 -5011.700000 0 494.500000 -5011.700000 0 494.500000 -5012.400000 0 181.700000 -5012.400000 0 181.700000 -5011.700000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 -5012.400000 0 494.500000 -5012.400000 0 494.500000 -5013.200000 0 181.700000 -5013.200000 0 181.700000 -5012.400000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 -5013.200000 0 494.500000 -5013.200000 0 494.500000 -5013.900000 0 181.700000 -5013.900000 0 181.700000 -5013.200000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 -5013.900000 0 494.500000 -5013.900000 0 494.500000 -5014.700000 0 181.700000 -5014.700000 0 181.700000 -5013.900000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 -5014.700000 0 494.500000 -5014.700000 0 494.500000 -5015.500000 0 181.700000 -5015.500000 0 181.700000 -5014.700000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 -5015.500000 0 494.500000 -5015.500000 0 494.500000 -5016.200000 0 181.700000 -5016.200000 0 181.700000 -5015.500000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 -5016.200000 0 494.500000 -5016.200000 0 494.500000 -5017.000000 0 181.700000 -5017.000000 0 181.700000 -5016.200000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 -5017.000000 0 494.500000 -5017.000000 0 494.500000 -5017.700000 0 181.700000 -5017.700000 0 181.700000 -5017.000000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 -5017.700000 0 494.500000 -5017.700000 0 494.500000 -5018.500000 0 181.700000 -5018.500000 0 181.700000 -5017.700000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 -5018.500000 0 494.500000 -5018.500000 0 494.500000 -5019.200000 0 181.700000 -5019.200000 0 181.700000 -5018.500000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 -5019.200000 0 494.500000 -5019.200000 0 494.500000 -5020.000000 0 181.700000 -5020.000000 0 181.700000 -5019.200000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 -5020.000000 0 494.500000 -5020.000000 0 494.500000 -5020.800000 0 181.700000 -5020.800000 0 181.700000 -5020.000000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 -5020.800000 0 494.500000 -5020.800000 0 494.500000 -5021.500000 0 181.700000 -5021.500000 0 181.700000 -5020.800000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 -5021.500000 0 494.500000 -5021.500000 0 494.500000 -5022.300000 0 181.700000 -5022.300000 0 181.700000 -5021.500000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 -5022.300000 0 494.500000 -5022.300000 0 494.500000 -5023.000000 0 181.700000 -5023.000000 0 181.700000 -5022.300000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 -5023.000000 0 494.500000 -5023.000000 0 494.500000 -5023.800000 0 181.700000 -5023.800000 0 181.700000 -5023.000000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 -5023.800000 0 494.500000 -5023.800000 0 494.500000 -5024.600000 0 181.700000 -5024.600000 0 181.700000 -5023.800000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 -5024.600000 0 494.500000 -5024.600000 0 494.500000 -5025.300000 0 181.700000 -5025.300000 0 181.700000 -5024.600000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 -5025.300000 0 494.500000 -5025.300000 0 494.500000 -5026.100000 0 181.700000 -5026.100000 0 181.700000 -5025.300000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 -5026.100000 0 494.500000 -5026.100000 0 494.500000 -5026.800000 0 181.700000 -5026.800000 0 181.700000 -5026.100000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 -5026.800000 0 494.500000 -5026.800000 0 494.500000 -5027.600000 0 181.700000 -5027.600000 0 181.700000 -5026.800000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 -5027.600000 0 494.500000 -5027.600000 0 494.500000 -5028.300000 0 181.700000 -5028.300000 0 181.700000 -5027.600000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 -5028.300000 0 494.500000 -5028.300000 0 494.500000 -5029.100000 0 181.700000 -5029.100000 0 181.700000 -5028.300000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 -5029.100000 0 494.500000 -5029.100000 0 494.500000 -5029.900000 0 181.700000 -5029.900000 0 181.700000 -5029.100000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 -5029.900000 0 494.500000 -5029.900000 0 494.500000 -5030.600000 0 181.700000 -5030.600000 0 181.700000 -5029.900000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 -5030.600000 0 494.500000 -5030.600000 0 494.500000 -5031.400000 0 181.700000 -5031.400000 0 181.700000 -5030.600000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 -5031.400000 0 494.500000 -5031.400000 0 494.500000 -5032.100000 0 181.700000 -5032.100000 0 181.700000 -5031.400000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 -5032.100000 0 494.500000 -5032.100000 0 494.500000 -5032.900000 0 181.700000 -5032.900000 0 181.700000 -5032.100000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 -5032.900000 0 494.500000 -5032.900000 0 494.500000 -5033.700000 0 181.700000 -5033.700000 0 181.700000 -5032.900000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 -5033.700000 0 494.500000 -5033.700000 0 494.500000 -5034.400000 0 181.700000 -5034.400000 0 181.700000 -5033.700000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 -5034.400000 0 494.500000 -5034.400000 0 494.500000 -5035.200000 0 181.700000 -5035.200000 0 181.700000 -5034.400000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 -5035.200000 0 494.500000 -5035.200000 0 494.500000 -5035.900000 0 181.700000 -5035.900000 0 181.700000 -5035.200000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 -5035.900000 0 494.500000 -5035.900000 0 494.500000 -5036.700000 0 181.700000 -5036.700000 0 181.700000 -5035.900000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 -5036.700000 0 494.500000 -5036.700000 0 494.500000 -5037.400000 0 181.700000 -5037.400000 0 181.700000 -5036.700000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 -5037.400000 0 494.500000 -5037.400000 0 494.500000 -5038.200000 0 181.700000 -5038.200000 0 181.700000 -5037.400000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 -5038.200000 0 494.500000 -5038.200000 0 494.500000 -5039.000000 0 181.700000 -5039.000000 0 181.700000 -5038.200000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 -5039.000000 0 494.500000 -5039.000000 0 494.500000 -5039.700000 0 181.700000 -5039.700000 0 181.700000 -5039.000000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 -5039.700000 0 494.500000 -5039.700000 0 494.500000 -5040.500000 0 181.700000 -5040.500000 0 181.700000 -5039.700000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 -5040.500000 0 494.500000 -5040.500000 0 494.500000 -5041.200000 0 181.700000 -5041.200000 0 181.700000 -5040.500000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 -5041.200000 0 494.500000 -5041.200000 0 494.500000 -5042.000000 0 181.700000 -5042.000000 0 181.700000 -5041.200000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 -5042.000000 0 494.500000 -5042.000000 0 494.500000 -5042.700000 0 181.700000 -5042.700000 0 181.700000 -5042.000000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 -5042.700000 0 494.500000 -5042.700000 0 494.500000 -5043.500000 0 181.700000 -5043.500000 0 181.700000 -5042.700000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 -5043.500000 0 494.500000 -5043.500000 0 494.500000 -5044.300000 0 181.700000 -5044.300000 0 181.700000 -5043.500000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 -5044.300000 0 494.500000 -5044.300000 0 494.500000 -5045.000000 0 181.700000 -5045.000000 0 181.700000 -5044.300000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 -5045.000000 0 494.500000 -5045.000000 0 494.500000 -5045.800000 0 181.700000 -5045.800000 0 181.700000 -5045.000000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 -5045.800000 0 494.500000 -5045.800000 0 494.500000 -5046.500000 0 181.700000 -5046.500000 0 181.700000 -5045.800000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 -5046.500000 0 494.500000 -5046.500000 0 494.500000 -5047.300000 0 181.700000 -5047.300000 0 181.700000 -5046.500000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 -5047.300000 0 494.500000 -5047.300000 0 494.500000 -5048.100000 0 181.700000 -5048.100000 0 181.700000 -5047.300000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 -5048.100000 0 494.500000 -5048.100000 0 494.500000 -5048.800000 0 181.700000 -5048.800000 0 181.700000 -5048.100000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 -5048.800000 0 494.500000 -5048.800000 0 494.500000 -5049.600000 0 181.700000 -5049.600000 0 181.700000 -5048.800000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 -5049.600000 0 494.500000 -5049.600000 0 494.500000 -5050.300000 0 181.700000 -5050.300000 0 181.700000 -5049.600000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 -5050.300000 0 494.500000 -5050.300000 0 494.500000 -5051.100000 0 181.700000 -5051.100000 0 181.700000 -5050.300000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 -5051.100000 0 494.500000 -5051.100000 0 494.500000 -5051.800000 0 181.700000 -5051.800000 0 181.700000 -5051.100000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 -5051.800000 0 494.500000 -5051.800000 0 494.500000 -5052.600000 0 181.700000 -5052.600000 0 181.700000 -5051.800000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 -5052.600000 0 494.500000 -5052.600000 0 494.500000 -5053.400000 0 181.700000 -5053.400000 0 181.700000 -5052.600000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 -5053.400000 0 494.500000 -5053.400000 0 494.500000 -5054.100000 0 181.700000 -5054.100000 0 181.700000 -5053.400000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 -5054.100000 0 494.500000 -5054.100000 0 494.500000 -5054.900000 0 181.700000 -5054.900000 0 181.700000 -5054.100000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 -5054.900000 0 494.500000 -5054.900000 0 494.500000 -5055.600000 0 181.700000 -5055.600000 0 181.700000 -5054.900000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 -5055.600000 0 494.500000 -5055.600000 0 494.500000 -5056.400000 0 181.700000 -5056.400000 0 181.700000 -5055.600000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 -5056.400000 0 494.500000 -5056.400000 0 494.500000 -5057.200000 0 181.700000 -5057.200000 0 181.700000 -5056.400000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 -5057.200000 0 494.500000 -5057.200000 0 494.500000 -5057.900000 0 181.700000 -5057.900000 0 181.700000 -5057.200000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 -5057.900000 0 494.500000 -5057.900000 0 494.500000 -5058.700000 0 181.700000 -5058.700000 0 181.700000 -5057.900000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 -5058.700000 0 494.500000 -5058.700000 0 494.500000 -5059.400000 0 181.700000 -5059.400000 0 181.700000 -5058.700000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 -5059.400000 0 494.500000 -5059.400000 0 494.500000 -5060.200000 0 181.700000 -5060.200000 0 181.700000 -5059.400000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 -5060.200000 0 494.500000 -5060.200000 0 494.500000 -5060.900000 0 181.700000 -5060.900000 0 181.700000 -5060.200000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 -5060.900000 0 494.500000 -5060.900000 0 494.500000 -5061.700000 0 181.700000 -5061.700000 0 181.700000 -5060.900000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 -5061.700000 0 494.500000 -5061.700000 0 494.500000 -5062.500000 0 181.700000 -5062.500000 0 181.700000 -5061.700000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 -5062.500000 0 494.500000 -5062.500000 0 494.500000 -5063.200000 0 181.700000 -5063.200000 0 181.700000 -5062.500000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 -5063.200000 0 494.500000 -5063.200000 0 494.500000 -5064.000000 0 181.700000 -5064.000000 0 181.700000 -5063.200000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 -5064.000000 0 494.500000 -5064.000000 0 494.500000 -5064.700000 0 181.700000 -5064.700000 0 181.700000 -5064.000000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 -5064.700000 0 494.500000 -5064.700000 0 494.500000 -5065.500000 0 181.700000 -5065.500000 0 181.700000 -5064.700000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 -5065.500000 0 494.500000 -5065.500000 0 494.500000 -5066.300000 0 181.700000 -5066.300000 0 181.700000 -5065.500000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 -5066.300000 0 494.500000 -5066.300000 0 494.500000 -5067.000000 0 181.700000 -5067.000000 0 181.700000 -5066.300000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 -5067.000000 0 494.500000 -5067.000000 0 494.500000 -5067.800000 0 181.700000 -5067.800000 0 181.700000 -5067.000000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 -5067.800000 0 494.500000 -5067.800000 0 494.500000 -5068.500000 0 181.700000 -5068.500000 0 181.700000 -5067.800000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 -5068.500000 0 494.500000 -5068.500000 0 494.500000 -5069.300000 0 181.700000 -5069.300000 0 181.700000 -5068.500000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 -5069.300000 0 494.500000 -5069.300000 0 494.500000 -5070.100000 0 181.700000 -5070.100000 0 181.700000 -5069.300000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 -5070.100000 0 494.500000 -5070.100000 0 494.500000 -5070.800000 0 181.700000 -5070.800000 0 181.700000 -5070.100000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 -5070.800000 0 494.500000 -5070.800000 0 494.500000 -5071.600000 0 181.700000 -5071.600000 0 181.700000 -5070.800000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 -5071.600000 0 494.500000 -5071.600000 0 494.500000 -5072.300000 0 181.700000 -5072.300000 0 181.700000 -5071.600000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 -5072.300000 0 494.500000 -5072.300000 0 494.500000 -5073.100000 0 181.700000 -5073.100000 0 181.700000 -5072.300000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 -5073.100000 0 494.500000 -5073.100000 0 494.500000 -5073.800000 0 181.700000 -5073.800000 0 181.700000 -5073.100000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 -5073.800000 0 494.500000 -5073.800000 0 494.500000 -5074.600000 0 181.700000 -5074.600000 0 181.700000 -5073.800000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 -5074.600000 0 494.500000 -5074.600000 0 494.500000 -5075.400000 0 181.700000 -5075.400000 0 181.700000 -5074.600000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 -5075.400000 0 494.500000 -5075.400000 0 494.500000 -5076.100000 0 181.700000 -5076.100000 0 181.700000 -5075.400000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 -5076.100000 0 494.500000 -5076.100000 0 494.500000 -5076.900000 0 181.700000 -5076.900000 0 181.700000 -5076.100000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 -5076.900000 0 494.500000 -5076.900000 0 494.500000 -5077.600000 0 181.700000 -5077.600000 0 181.700000 -5076.900000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 -5077.600000 0 494.500000 -5077.600000 0 494.500000 -5078.400000 0 181.700000 -5078.400000 0 181.700000 -5077.600000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 -5078.400000 0 494.500000 -5078.400000 0 494.500000 -5079.200000 0 181.700000 -5079.200000 0 181.700000 -5078.400000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 -5079.200000 0 494.500000 -5079.200000 0 494.500000 -5079.900000 0 181.700000 -5079.900000 0 181.700000 -5079.200000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 -5079.900000 0 494.500000 -5079.900000 0 494.500000 -5080.700000 0 181.700000 -5080.700000 0 181.700000 -5079.900000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 -5080.700000 0 494.500000 -5080.700000 0 494.500000 -5081.400000 0 181.700000 -5081.400000 0 181.700000 -5080.700000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 -5081.400000 0 494.500000 -5081.400000 0 494.500000 -5082.200000 0 181.700000 -5082.200000 0 181.700000 -5081.400000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 -5082.200000 0 494.500000 -5082.200000 0 494.500000 -5083.000000 0 181.700000 -5083.000000 0 181.700000 -5082.200000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 -5083.000000 0 494.500000 -5083.000000 0 494.500000 -5083.700000 0 181.700000 -5083.700000 0 181.700000 -5083.000000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 -5083.700000 0 494.500000 -5083.700000 0 494.500000 -5084.500000 0 181.700000 -5084.500000 0 181.700000 -5083.700000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 -5084.500000 0 494.500000 -5084.500000 0 494.500000 -5085.200000 0 181.700000 -5085.200000 0 181.700000 -5084.500000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 -5085.200000 0 494.500000 -5085.200000 0 494.500000 -5086.000000 0 181.700000 -5086.000000 0 181.700000 -5085.200000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 -5086.000000 0 494.500000 -5086.000000 0 494.500000 -5086.700000 0 181.700000 -5086.700000 0 181.700000 -5086.000000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 -5086.700000 0 494.500000 -5086.700000 0 494.500000 -5087.500000 0 181.700000 -5087.500000 0 181.700000 -5086.700000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 -5087.500000 0 494.500000 -5087.500000 0 494.500000 -5088.300000 0 181.700000 -5088.300000 0 181.700000 -5087.500000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 -5088.300000 0 494.500000 -5088.300000 0 494.500000 -5089.000000 0 181.700000 -5089.000000 0 181.700000 -5088.300000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 -5089.000000 0 494.500000 -5089.000000 0 494.500000 -5089.800000 0 181.700000 -5089.800000 0 181.700000 -5089.000000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 -5089.800000 0 494.500000 -5089.800000 0 494.500000 -5090.500000 0 181.700000 -5090.500000 0 181.700000 -5089.800000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 -5090.500000 0 494.500000 -5090.500000 0 494.500000 -5091.300000 0 181.700000 -5091.300000 0 181.700000 -5090.500000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 -5091.300000 0 494.500000 -5091.300000 0 494.500000 -5092.100000 0 181.700000 -5092.100000 0 181.700000 -5091.300000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 -5092.100000 0 494.500000 -5092.100000 0 494.500000 -5092.800000 0 181.700000 -5092.800000 0 181.700000 -5092.100000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 -5092.800000 0 494.500000 -5092.800000 0 494.500000 -5093.600000 0 181.700000 -5093.600000 0 181.700000 -5092.800000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 -5093.600000 0 494.500000 -5093.600000 0 494.500000 -5094.300000 0 181.700000 -5094.300000 0 181.700000 -5093.600000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 -5094.300000 0 494.500000 -5094.300000 0 494.500000 -5095.100000 0 181.700000 -5095.100000 0 181.700000 -5094.300000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 -5095.100000 0 494.500000 -5095.100000 0 494.500000 -5095.900000 0 181.700000 -5095.900000 0 181.700000 -5095.100000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 -5095.900000 0 494.500000 -5095.900000 0 494.500000 -5096.600000 0 181.700000 -5096.600000 0 181.700000 -5095.900000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 -5096.600000 0 494.500000 -5096.600000 0 494.500000 -5097.400000 0 181.700000 -5097.400000 0 181.700000 -5096.600000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 -5097.400000 0 494.500000 -5097.400000 0 494.500000 -5098.100000 0 181.700000 -5098.100000 0 181.700000 -5097.400000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 -5098.100000 0 494.500000 -5098.100000 0 494.500000 -5098.900000 0 181.700000 -5098.900000 0 181.700000 -5098.100000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 -5098.900000 0 494.500000 -5098.900000 0 494.500000 -5099.600000 0 181.700000 -5099.600000 0 181.700000 -5098.900000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 -5099.600000 0 494.500000 -5099.600000 0 494.500000 -5100.400000 0 181.700000 -5100.400000 0 181.700000 -5099.600000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 -5100.400000 0 494.500000 -5100.400000 0 494.500000 -5101.200000 0 181.700000 -5101.200000 0 181.700000 -5100.400000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 -5101.200000 0 494.500000 -5101.200000 0 494.500000 -5101.900000 0 181.700000 -5101.900000 0 181.700000 -5101.200000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 -5101.900000 0 494.500000 -5101.900000 0 494.500000 -5102.700000 0 181.700000 -5102.700000 0 181.700000 -5101.900000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 -5102.700000 0 494.500000 -5102.700000 0 494.500000 -5103.400000 0 181.700000 -5103.400000 0 181.700000 -5102.700000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 -5103.400000 0 494.500000 -5103.400000 0 494.500000 -5104.200000 0 181.700000 -5104.200000 0 181.700000 -5103.400000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 -5104.200000 0 494.500000 -5104.200000 0 494.500000 -5105.000000 0 181.700000 -5105.000000 0 181.700000 -5104.200000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 -5105.000000 0 494.500000 -5105.000000 0 494.500000 -5105.700000 0 181.700000 -5105.700000 0 181.700000 -5105.000000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 -5105.700000 0 494.500000 -5105.700000 0 494.500000 -5106.500000 0 181.700000 -5106.500000 0 181.700000 -5105.700000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 -5106.500000 0 494.500000 -5106.500000 0 494.500000 -5107.200000 0 181.700000 -5107.200000 0 181.700000 -5106.500000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 -5107.200000 0 494.500000 -5107.200000 0 494.500000 -5108.000000 0 181.700000 -5108.000000 0 181.700000 -5107.200000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 -5108.000000 0 494.500000 -5108.000000 0 494.500000 -5108.800000 0 181.700000 -5108.800000 0 181.700000 -5108.000000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 -5108.800000 0 494.500000 -5108.800000 0 494.500000 -5109.500000 0 181.700000 -5109.500000 0 181.700000 -5108.800000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 -5109.500000 0 494.500000 -5109.500000 0 494.500000 -5110.300000 0 181.700000 -5110.300000 0 181.700000 -5109.500000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 -5110.300000 0 494.500000 -5110.300000 0 494.500000 -5111.000000 0 181.700000 -5111.000000 0 181.700000 -5110.300000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 -5111.000000 0 494.500000 -5111.000000 0 494.500000 -5111.800000 0 181.700000 -5111.800000 0 181.700000 -5111.000000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 -5111.800000 0 494.500000 -5111.800000 0 494.500000 -5112.500000 0 181.700000 -5112.500000 0 181.700000 -5111.800000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 -5112.500000 0 494.500000 -5112.500000 0 494.500000 -5113.300000 0 181.700000 -5113.300000 0 181.700000 -5112.500000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 -5113.300000 0 494.500000 -5113.300000 0 494.500000 -5114.100000 0 181.700000 -5114.100000 0 181.700000 -5113.300000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 -5114.100000 0 494.500000 -5114.100000 0 494.500000 -5114.800000 0 181.700000 -5114.800000 0 181.700000 -5114.100000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 -5114.800000 0 494.500000 -5114.800000 0 494.500000 -5115.600000 0 181.700000 -5115.600000 0 181.700000 -5114.800000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 -5115.600000 0 494.500000 -5115.600000 0 494.500000 -5116.300000 0 181.700000 -5116.300000 0 181.700000 -5115.600000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 -5116.300000 0 494.500000 -5116.300000 0 494.500000 -5117.100000 0 181.700000 -5117.100000 0 181.700000 -5116.300000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 -5117.100000 0 494.500000 -5117.100000 0 494.500000 -5117.900000 0 181.700000 -5117.900000 0 181.700000 -5117.100000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 -5117.900000 0 494.500000 -5117.900000 0 494.500000 -5118.600000 0 181.700000 -5118.600000 0 181.700000 -5117.900000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 -5118.600000 0 494.500000 -5118.600000 0 494.500000 -5119.400000 0 181.700000 -5119.400000 0 181.700000 -5118.600000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 -5119.400000 0 494.500000 -5119.400000 0 494.500000 -5120.100000 0 181.700000 -5120.100000 0 181.700000 -5119.400000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 -5120.100000 0 494.500000 -5120.100000 0 494.500000 -5120.900000 0 181.700000 -5120.900000 0 181.700000 -5120.100000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 -5120.900000 0 494.500000 -5120.900000 0 494.500000 -5121.700000 0 181.700000 -5121.700000 0 181.700000 -5120.900000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 -5121.700000 0 494.500000 -5121.700000 0 494.500000 -5122.400000 0 181.700000 -5122.400000 0 181.700000 -5121.700000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 -5122.400000 0 494.500000 -5122.400000 0 494.500000 -5123.200000 0 181.700000 -5123.200000 0 181.700000 -5122.400000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 -5123.200000 0 494.500000 -5123.200000 0 494.500000 -5123.900000 0 181.700000 -5123.900000 0 181.700000 -5123.200000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 -5123.900000 0 494.500000 -5123.900000 0 494.500000 -5124.700000 0 181.700000 -5124.700000 0 181.700000 -5123.900000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 -5124.700000 0 494.500000 -5124.700000 0 494.500000 -5125.400000 0 181.700000 -5125.400000 0 181.700000 -5124.700000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 -5125.400000 0 494.500000 -5125.400000 0 494.500000 -5126.200000 0 181.700000 -5126.200000 0 181.700000 -5125.400000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 -5126.200000 0 494.500000 -5126.200000 0 494.500000 -5127.000000 0 181.700000 -5127.000000 0 181.700000 -5126.200000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 -5127.000000 0 494.500000 -5127.000000 0 494.500000 -5127.700000 0 181.700000 -5127.700000 0 181.700000 -5127.000000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 -5127.700000 0 494.500000 -5127.700000 0 494.500000 -5128.500000 0 181.700000 -5128.500000 0 181.700000 -5127.700000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 -5128.500000 0 494.500000 -5128.500000 0 494.500000 -5129.200000 0 181.700000 -5129.200000 0 181.700000 -5128.500000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 -5129.200000 0 494.500000 -5129.200000 0 494.500000 -5130.000000 0 181.700000 -5130.000000 0 181.700000 -5129.200000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 -5130.000000 0 494.500000 -5130.000000 0 494.500000 -5130.800000 0 181.700000 -5130.800000 0 181.700000 -5130.000000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 -5130.800000 0 494.500000 -5130.800000 0 494.500000 -5131.500000 0 181.700000 -5131.500000 0 181.700000 -5130.800000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 -5131.500000 0 494.500000 -5131.500000 0 494.500000 -5132.300000 0 181.700000 -5132.300000 0 181.700000 -5131.500000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 -5132.300000 0 494.500000 -5132.300000 0 494.500000 -5133.000000 0 181.700000 -5133.000000 0 181.700000 -5132.300000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 -5133.000000 0 494.500000 -5133.000000 0 494.500000 -5133.800000 0 181.700000 -5133.800000 0 181.700000 -5133.000000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 -5133.800000 0 494.500000 -5133.800000 0 494.500000 -5134.600000 0 181.700000 -5134.600000 0 181.700000 -5133.800000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 -5134.600000 0 494.500000 -5134.600000 0 494.500000 -5135.300000 0 181.700000 -5135.300000 0 181.700000 -5134.600000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 -5135.300000 0 494.500000 -5135.300000 0 494.500000 -5136.100000 0 181.700000 -5136.100000 0 181.700000 -5135.300000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 -5136.100000 0 494.500000 -5136.100000 0 494.500000 -5136.800000 0 181.700000 -5136.800000 0 181.700000 -5136.100000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 -5136.800000 0 494.500000 -5136.800000 0 494.500000 -5137.600000 0 181.700000 -5137.600000 0 181.700000 -5136.800000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 -5137.600000 0 494.500000 -5137.600000 0 494.500000 -5138.300000 0 181.700000 -5138.300000 0 181.700000 -5137.600000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 -5138.300000 0 494.500000 -5138.300000 0 494.500000 -5139.100000 0 181.700000 -5139.100000 0 181.700000 -5138.300000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 -5139.100000 0 494.500000 -5139.100000 0 494.500000 -5139.900000 0 181.700000 -5139.900000 0 181.700000 -5139.100000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 -5139.900000 0 494.500000 -5139.900000 0 494.500000 -5140.600000 0 181.700000 -5140.600000 0 181.700000 -5139.900000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 -5140.600000 0 494.500000 -5140.600000 0 494.500000 -5141.400000 0 181.700000 -5141.400000 0 181.700000 -5140.600000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 -5141.400000 0 494.500000 -5141.400000 0 494.500000 -5142.100000 0 181.700000 -5142.100000 0 181.700000 -5141.400000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 -5142.100000 0 494.500000 -5142.100000 0 494.500000 -5142.900000 0 181.700000 -5142.900000 0 181.700000 -5142.100000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 -5142.900000 0 494.500000 -5142.900000 0 494.500000 -5143.700000 0 181.700000 -5143.700000 0 181.700000 -5142.900000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 -5143.700000 0 494.500000 -5143.700000 0 494.500000 -5144.400000 0 181.700000 -5144.400000 0 181.700000 -5143.700000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 -5144.400000 0 494.500000 -5144.400000 0 494.500000 -5145.200000 0 181.700000 -5145.200000 0 181.700000 -5144.400000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 -5145.200000 0 494.500000 -5145.200000 0 494.500000 -5145.900000 0 181.700000 -5145.900000 0 181.700000 -5145.200000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 -5145.900000 0 494.500000 -5145.900000 0 494.500000 -5146.700000 0 181.700000 -5146.700000 0 181.700000 -5145.900000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 -5146.700000 0 494.500000 -5146.700000 0 494.500000 -5147.500000 0 181.700000 -5147.500000 0 181.700000 -5146.700000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 -5147.500000 0 494.500000 -5147.500000 0 494.500000 -5148.200000 0 181.700000 -5148.200000 0 181.700000 -5147.500000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 -5148.200000 0 494.500000 -5148.200000 0 494.500000 -5149.000000 0 181.700000 -5149.000000 0 181.700000 -5148.200000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 -5149.000000 0 494.500000 -5149.000000 0 494.500000 -5149.700000 0 181.700000 -5149.700000 0 181.700000 -5149.000000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 -5149.700000 0 494.500000 -5149.700000 0 494.500000 -5150.500000 0 181.700000 -5150.500000 0 181.700000 -5149.700000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 -5150.500000 0 494.500000 -5150.500000 0 494.500000 -5151.200000 0 181.700000 -5151.200000 0 181.700000 -5150.500000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 -5151.200000 0 494.500000 -5151.200000 0 494.500000 -5152.000000 0 181.700000 -5152.000000 0 181.700000 -5151.200000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 -5152.000000 0 494.500000 -5152.000000 0 494.500000 -5152.800000 0 181.700000 -5152.800000 0 181.700000 -5152.000000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 -5152.800000 0 494.500000 -5152.800000 0 494.500000 -5153.500000 0 181.700000 -5153.500000 0 181.700000 -5152.800000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 -5153.500000 0 494.500000 -5153.500000 0 494.500000 -5154.300000 0 181.700000 -5154.300000 0 181.700000 -5153.500000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 -5154.300000 0 494.500000 -5154.300000 0 494.500000 -5155.000000 0 181.700000 -5155.000000 0 181.700000 -5154.300000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 -5155.000000 0 494.500000 -5155.000000 0 494.500000 -5155.800000 0 181.700000 -5155.800000 0 181.700000 -5155.000000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 -5155.800000 0 494.500000 -5155.800000 0 494.500000 -5156.600000 0 181.700000 -5156.600000 0 181.700000 -5155.800000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 -5156.600000 0 494.500000 -5156.600000 0 494.500000 -5157.300000 0 181.700000 -5157.300000 0 181.700000 -5156.600000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 -5157.300000 0 494.500000 -5157.300000 0 494.500000 -5158.100000 0 181.700000 -5158.100000 0 181.700000 -5157.300000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 -5158.100000 0 494.500000 -5158.100000 0 494.500000 -5158.800000 0 181.700000 -5158.800000 0 181.700000 -5158.100000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 -5158.800000 0 494.500000 -5158.800000 0 494.500000 -5159.600000 0 181.700000 -5159.600000 0 181.700000 -5158.800000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 -5159.600000 0 494.500000 -5159.600000 0 494.500000 -5160.400000 0 181.700000 -5160.400000 0 181.700000 -5159.600000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 -5160.400000 0 494.500000 -5160.400000 0 494.500000 -5161.100000 0 181.700000 -5161.100000 0 181.700000 -5160.400000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 -5161.100000 0 494.500000 -5161.100000 0 494.500000 -5161.900000 0 181.700000 -5161.900000 0 181.700000 -5161.100000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 -5161.900000 0 494.500000 -5161.900000 0 494.500000 -5162.600000 0 181.700000 -5162.600000 0 181.700000 -5161.900000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 -5162.600000 0 494.500000 -5162.600000 0 494.500000 -5163.400000 0 181.700000 -5163.400000 0 181.700000 -5162.600000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 -5163.400000 0 494.500000 -5163.400000 0 494.500000 -5164.100000 0 181.700000 -5164.100000 0 181.700000 -5163.400000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 -5164.100000 0 494.500000 -5164.100000 0 494.500000 -5164.900000 0 181.700000 -5164.900000 0 181.700000 -5164.100000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 -5164.900000 0 494.500000 -5164.900000 0 494.500000 -5165.700000 0 181.700000 -5165.700000 0 181.700000 -5164.900000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 -5165.700000 0 494.500000 -5165.700000 0 494.500000 -5166.400000 0 181.700000 -5166.400000 0 181.700000 -5165.700000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 -5166.400000 0 494.500000 -5166.400000 0 494.500000 -5167.200000 0 181.700000 -5167.200000 0 181.700000 -5166.400000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 -5167.100000 0 181.800000 -5167.100000 0 181.800000 -4973.800000 0 494.400000 -4973.800000 0 494.400000 -5167.100000 0 338.100000 -5167.100000 0
+strokePath subpath 1 338.100000 -5167.100000 0 181.800000 -5167.100000 0 181.800000 -4973.800000 0 494.400000 -4973.800000 0 494.400000 -5167.100000 0 338.100000 -5167.100000 0
+saveState
+updateCtm 11420.000000 0.000000 0.000000 -8760.000000 20530.000000 588310.000000
+drawSoftMaskedImage 1143 877 1143 877 JPEG 71324 PPM 3007249
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 -5128.076000 215.488000 -5136.076000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 -5128.076000 220.592000 -5136.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 -5128.076000 225.696000 -5136.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 -5128.076000 230.800000 -5136.076000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 -5135.676000 241.388000 -5143.676000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 -5135.676000 246.492000 -5143.676000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 -5135.676000 251.596000 -5143.676000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 -5135.676000 256.700000 -5143.676000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 -5143.276000 267.188000 -5151.276000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 -5143.276000 272.292000 -5151.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 -5143.276000 277.396000 -5151.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 -5143.276000 282.500000 -5151.276000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 -5150.876000 293.088000 -5158.876000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 -5150.876000 298.192000 -5158.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 -5150.876000 303.296000 -5158.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 -5150.876000 308.400000 -5158.876000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 -5113.076000 202.588000 -5121.076000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 -5093.776000 201.688000 -5101.776000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 -5074.476000 195.788000 -5082.476000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 -5074.476000 200.892000 -5082.476000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 -5055.076000 194.888000 -5063.076000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 -5055.076000 199.992000 -5063.076000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 -5035.776000 193.988000 -5043.776000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 -5035.776000 199.092000 -5043.776000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 -5016.476000 193.088000 -5024.476000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 -5016.476000 198.192000 -5024.476000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 -5144.376000 330.188000 -5152.376000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 -5144.376000 332.716000 -5152.376000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 -5144.376000 337.596000 -5152.376000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 -5144.376000 341.396000 -5152.376000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 -5144.376000 346.036000 -5152.376000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 -5144.376000 350.900000 -5152.376000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 -5144.376000 355.972000 -5152.376000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 -5144.376000 359.196000 -5152.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 -5144.376000 362.196000 -5152.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 -5144.376000 367.404000 -5152.376000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 -5144.376000 371.876000 -5152.376000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 -5144.376000 375.052000 -5152.376000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 -5124.876000 361.172000 -5132.876000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 -5124.876000 364.340000 -5132.876000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 -5124.876000 367.396000 -5132.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 -5124.876000 372.604000 -5132.876000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 -5124.876000 379.348000 -5132.876000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 -5124.876000 384.484000 -5132.876000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 -5124.876000 389.436000 -5132.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 -5124.876000 392.108000 -5132.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 -5124.876000 395.708000 -5132.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 -5124.876000 397.540000 -5132.876000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 -5124.876000 402.444000 -5132.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 -5124.876000 406.788000 -5132.876000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 -5105.276000 392.972000 -5113.276000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 -5105.276000 398.076000 -5113.276000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 -5105.276000 403.180000 -5113.276000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 -5105.276000 405.428000 -5113.276000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 -5105.276000 410.332000 -5113.276000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 -5105.276000 414.476000 -5113.276000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 -4977.708000 305.808000 -4991.708000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 -4977.708000 314.138000 -4991.708000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 -4977.708000 320.788000 -4991.708000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 -4977.708000 328.698000 -4991.708000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 -4977.708000 336.972000 -4991.708000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 -4977.708000 344.182000 -4991.708000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 -4977.708000 349.810000 -4991.708000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 -4977.708000 354.234000 -4991.708000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 -4977.708000 362.718000 -4991.708000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 -4977.708000 367.870000 -4991.708000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 -4977.708000 372.322000 -4991.708000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 -4977.708000 382.080000 -4991.708000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 -4977.708000 388.772000 -4991.708000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 -4977.708000 397.802000 -4991.708000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 -4977.708000 402.254000 -4991.708000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 -4977.708000 407.896000 -4991.708000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 -5100.600000 0 424.300000 -5100.600000 0 424.300000 -5039.900000 0 493.600000 -5039.900000 0 493.600000 -5100.600000 0 458.900000 -5100.600000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 -5049.500000 0 428.900000 -5049.500000 0 428.900000 -5043.500000 0 434.800000 -5043.500000 0 434.800000 -5049.500000 0 431.900000 -5049.500000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 -5060.600000 0 428.900000 -5060.600000 0 428.900000 -5054.600000 0 434.800000 -5054.600000 0 434.800000 -5060.600000 0 431.900000 -5060.600000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 -5071.700000 0 428.900000 -5071.700000 0 428.900000 -5065.700000 0 434.800000 -5065.700000 0 434.800000 -5071.700000 0 431.900000 -5071.700000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 -5082.800000 0 428.900000 -5082.800000 0 428.900000 -5076.800000 0 434.800000 -5076.800000 0 434.800000 -5082.800000 0 431.900000 -5082.800000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 -5093.900000 0 428.900000 -5093.900000 0 428.900000 -5087.900000 0 434.800000 -5087.900000 0 434.800000 -5093.900000 0 431.900000 -5093.900000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -5042.376000 443.288000 -5050.376000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 -5042.376000 445.816000 -5050.376000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 -5042.376000 450.600000 -5050.376000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 -5042.376000 454.496000 -5050.376000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 -5042.376000 459.136000 -5050.376000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 -5042.376000 464.000000 -5050.376000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 -5042.376000 468.976000 -5050.376000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 -5042.376000 472.304000 -5050.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 -5042.376000 475.208000 -5050.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 -5042.376000 480.520000 -5050.376000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 -5042.376000 484.992000 -5050.376000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 -5042.376000 488.168000 -5050.376000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -5053.476000 443.352000 -5061.476000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 -5053.476000 447.920000 -5061.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 -5053.476000 452.976000 -5061.476000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 -5053.476000 457.400000 -5061.476000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 -5053.476000 462.472000 -5061.476000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 -5053.476000 465.800000 -5061.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 -5053.476000 468.904000 -5061.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 -5053.476000 473.816000 -5061.476000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 -5053.476000 478.888000 -5061.476000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 -5053.476000 482.064000 -5061.476000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -5064.576000 442.872000 -5072.576000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 -5064.576000 446.040000 -5072.576000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 -5064.576000 448.992000 -5072.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 -5064.576000 454.304000 -5072.576000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 -5064.576000 461.048000 -5072.576000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 -5064.576000 466.184000 -5072.576000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 -5064.576000 471.136000 -5072.576000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 -5064.576000 473.808000 -5072.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 -5064.576000 477.408000 -5072.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 -5064.576000 479.240000 -5072.576000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 -5064.576000 484.144000 -5072.576000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 -5064.576000 488.488000 -5072.576000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -5075.676000 443.384000 -5083.676000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 -5075.676000 448.464000 -5083.676000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 -5075.676000 453.424000 -5083.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 -5075.676000 456.696000 -5083.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 -5075.676000 459.800000 -5083.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 -5075.676000 462.032000 -5083.676000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 -5075.676000 466.936000 -5083.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 -5075.676000 471.080000 -5083.676000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -5086.776000 443.272000 -5094.776000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 -5086.776000 448.376000 -5094.776000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 -5086.776000 453.480000 -5094.776000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 -5086.776000 455.728000 -5094.776000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 -5086.776000 460.632000 -5094.776000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 -5086.776000 464.776000 -5094.776000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -7731.800000 0 114.800000 -7731.800000 0 114.800000 -7689.000000 0 72.000000 -7689.000000 0 72.000000 -7731.800000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 852370.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 108.000000 546.200000 0 540.000000 546.200000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 546.200000 0
+eoFillPath subpath 1 108.000000 72.000000 0 540.000000 72.000000 0 540.000000 245.800000 0 108.000000 245.800000 0 108.000000 72.000000 0
+eoFillPath subpath 1 108.000000 245.800000 0 157.400000 245.800000 0 157.400000 546.200000 0 108.000000 546.200000 0 108.000000 245.800000 0
+eoFillPath subpath 1 490.500000 245.800000 0 540.000000 245.800000 0 540.000000 546.200000 0 490.500000 546.200000 0 490.500000 245.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 15740.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 108.000000 701.300000 0 540.000000 701.300000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 701.300000 0
+eoFillPath subpath 1 108.000000 76.200000 0 540.000000 76.200000 0 540.000000 90.100000 0 108.000000 90.100000 0 108.000000 76.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 108.100000 719.948000 121.892000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 121.908000 719.948000 131.364000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 131.412000 719.948000 136.484000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 136.516000 719.948000 148.532000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 148.516000 719.948000 158.292000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 158.324000 719.948000 168.452000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 168.420000 719.948000 176.740000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 176.724000 719.948000 186.564000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 186.532000 719.948000 191.604000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 191.636000 719.948000 197.396000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 197.444000 719.948000 202.516000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 202.500000 719.948000 212.644000 703.948000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 212.708000 719.948000 222.548000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 222.516000 719.948000 231.300000 703.948000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 231.316000 719.948000 241.092000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 241.124000 719.948000 251.252000 703.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 251.220000 719.948000 261.364000 703.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 261.428000 719.948000 266.500000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.532000 719.948000 275.732000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 275.732000 719.948000 280.164000 703.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 280.132000 719.948000 289.908000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 289.940000 719.948000 299.716000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 299.748000 719.948000 306.324000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 672.936000 225.940000 660.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 225.904000 672.936000 231.640000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 231.700000 672.936000 238.792000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 238.804000 672.936000 245.956000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 245.908000 672.936000 253.168000 660.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 253.204000 672.936000 257.008000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.308000 672.936000 261.112000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 261.412000 672.936000 266.152000 660.936000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 266.512000 672.936000 270.316000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 270.712000 672.936000 278.440000 660.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 278.416000 672.936000 285.508000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 285.520000 672.936000 292.612000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 292.624000 672.936000 300.304000 660.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 300.628000 672.936000 304.432000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 304.732000 672.936000 311.884000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 312.232000 672.936000 316.036000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 316.432000 672.936000 320.260000 660.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 320.236000 672.936000 327.460000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 327.532000 672.936000 332.344000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 332.632000 672.936000 336.436000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 336.736000 672.936000 343.960000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 343.936000 672.936000 348.376000 660.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 348.736000 672.936000 352.540000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 352.936000 672.936000 359.092000 660.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 359.140000 672.936000 366.820000 660.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 366.736000 672.936000 373.888000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 373.936000 672.936000 380.656000 660.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 380.632000 672.936000 387.724000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.036000 672.936000 391.840000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 392.140000 672.936000 396.952000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 396.940000 672.936000 404.164000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 404.440000 672.936000 408.244000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 408.736000 672.936000 414.892000 660.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 414.940000 672.936000 422.620000 660.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 422.536000 672.936000 428.272000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 428.236000 672.936000 435.328000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 435.340000 672.936000 442.492000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 442.540000 672.936000 450.220000 660.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 450.544000 672.936000 454.348000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.648000 672.936000 461.872000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 461.848000 672.936000 469.576000 660.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.648000 672.936000 474.460000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 474.748000 672.936000 478.552000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 478.948000 672.936000 486.100000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 486.148000 672.936000 489.976000 660.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 489.952000 672.936000 493.780000 660.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 494.056000 672.936000 497.860000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 498.160000 672.936000 509.536000 660.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 509.560000 672.936000 516.328000 660.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 516.664000 672.936000 520.468000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 520.864000 672.936000 528.544000 660.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 528.568000 672.936000 535.720000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.100000 672.936000 540.144000 660.936000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 659.036000 229.180000 647.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 229.204000 659.036000 236.296000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.308000 659.036000 242.044000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 242.008000 659.036000 248.164000 647.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 248.212000 659.036000 252.016000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.808000 659.036000 256.612000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 257.404000 659.036000 265.396000 647.036000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 265.408000 659.036000 273.136000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 273.112000 659.036000 280.204000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 280.216000 659.036000 285.952000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 286.012000 659.036000 293.104000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 293.116000 659.036000 297.556000 647.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 297.520000 659.036000 304.744000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 304.720000 659.036000 310.456000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 310.516000 659.036000 317.608000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 317.620000 659.036000 321.424000 647.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 322.216000 659.036000 326.020000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 326.920000 659.036000 331.660000 647.036000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 332.524000 659.036000 336.328000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 337.120000 659.036000 344.800000 647.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 344.716000 659.036000 351.940000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 352.012000 659.036000 359.740000 647.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 359.716000 659.036000 363.004000 647.036000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 363.016000 659.036000 367.828000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 368.620000 659.036000 372.424000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 373.324000 659.036000 381.052000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 381.028000 659.036000 388.180000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 388.228000 659.036000 394.996000 647.036000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 395.032000 659.036000 402.124000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.928000 659.036000 406.732000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 407.524000 659.036000 411.244000 647.036000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 411.220000 659.036000 418.948000 647.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 418.924000 659.036000 425.080000 647.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 425.128000 659.036000 429.940000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 430.732000 659.036000 434.536000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 435.532000 659.036000 442.684000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 443.428000 659.036000 447.232000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 448.024000 659.036000 455.752000 647.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 455.728000 659.036000 462.952000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 463.024000 659.036000 468.760000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.724000 659.036000 480.100000 647.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 480.124000 659.036000 487.276000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 487.324000 659.036000 491.152000 647.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 491.920000 659.036000 495.724000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 496.624000 659.036000 502.780000 647.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 502.828000 659.036000 510.556000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 510.532000 659.036000 517.684000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 517.636000 659.036000 525.316000 647.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 525.340000 659.036000 532.432000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 532.444000 659.036000 540.124000 647.036000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 659.036000 543.904000 647.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 645.136000 229.180000 633.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 229.204000 645.136000 236.296000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.308000 645.136000 242.464000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 242.404000 645.136000 249.664000 633.136000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 249.700000 645.136000 253.732000 633.136000 1.000000 0.000000 0.000000 1.000000 ;
+drawChar 255.304000 645.136000 259.108000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 260.704000 645.136000 272.080000 633.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 272.008000 645.136000 278.776000 633.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 280.408000 645.136000 284.212000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 285.808000 645.136000 293.488000 633.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 293.512000 645.136000 300.604000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 300.616000 645.136000 306.772000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 306.712000 645.136000 313.972000 633.136000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 315.616000 645.136000 319.420000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 321.016000 645.136000 325.456000 633.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 325.420000 645.136000 332.644000 633.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 332.716000 645.136000 338.452000 633.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 338.416000 645.136000 349.792000 633.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 349.816000 645.136000 355.972000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 357.520000 645.136000 361.324000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 362.920000 645.136000 370.072000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 371.620000 645.136000 375.424000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.020000 645.136000 382.528000 633.136000 1.000000 0.000000 0.000000 1.000000 "
+drawChar 382.516000 645.136000 392.620000 633.136000 1.000000 0.000000 0.000000 1.000000 U
+drawChar 392.620000 645.136000 398.128000 633.136000 1.000000 0.000000 0.000000 1.000000 "
+drawChar 399.724000 645.136000 403.528000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 405.220000 645.136000 411.376000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 411.424000 645.136000 419.152000 633.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 419.020000 645.136000 426.172000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 426.220000 645.136000 433.900000 633.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 433.816000 645.136000 440.908000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 442.516000 645.136000 446.320000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 447.916000 645.136000 455.068000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 455.116000 645.136000 460.852000 633.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 460.816000 645.136000 468.040000 633.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 468.016000 645.136000 475.744000 633.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 475.720000 645.136000 483.448000 633.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 483.520000 645.136000 491.200000 633.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 492.820000 645.136000 496.624000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 498.220000 645.136000 509.596000 633.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 509.524000 645.136000 516.616000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 516.628000 645.136000 520.432000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 522.028000 645.136000 525.832000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 527.428000 645.136000 532.168000 633.136000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 532.132000 645.136000 539.860000 633.136000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 645.136000 543.904000 633.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 631.236000 225.940000 619.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 225.904000 631.236000 231.640000 619.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 231.700000 631.236000 238.924000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 238.900000 631.236000 246.628000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 246.604000 631.236000 251.416000 619.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 252.808000 631.236000 256.612000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 258.004000 631.236000 265.228000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 265.204000 631.236000 269.644000 619.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 270.904000 631.236000 274.708000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 276.100000 631.236000 287.476000 619.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 287.500000 631.236000 294.592000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 295.900000 631.236000 299.704000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 301.096000 631.236000 304.924000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 304.900000 631.236000 311.056000 619.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 312.400000 631.236000 316.204000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 317.704000 631.236000 325.384000 619.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 325.300000 631.236000 329.128000 619.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 329.104000 631.236000 336.196000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 336.208000 631.236000 343.936000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 344.008000 631.236000 348.820000 619.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 348.808000 631.236000 355.576000 619.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 356.908000 631.236000 360.712000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 362.104000 631.236000 369.328000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 369.304000 631.236000 373.744000 619.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 375.100000 631.236000 378.904000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 380.296000 631.236000 386.032000 619.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 385.996000 631.236000 393.220000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 393.292000 631.236000 400.516000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 400.492000 631.236000 411.868000 619.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 413.188000 631.236000 416.992000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 418.384000 631.236000 423.196000 619.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 423.184000 631.236000 430.408000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 431.680000 631.236000 435.484000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 436.876000 631.236000 447.136000 619.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 447.172000 631.236000 452.908000 619.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 452.872000 631.236000 456.700000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 456.676000 631.236000 461.488000 619.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 461.572000 631.236000 468.664000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 469.972000 631.236000 473.776000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 475.168000 631.236000 482.320000 619.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 482.368000 631.236000 490.096000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 490.072000 631.236000 497.752000 619.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 499.072000 631.236000 502.876000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 504.268000 631.236000 509.008000 619.236000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 510.268000 631.236000 514.072000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 515.572000 631.236000 522.724000 619.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 522.772000 631.236000 526.600000 619.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 526.468000 631.236000 532.624000 619.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 532.672000 631.236000 539.896000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 631.236000 543.904000 619.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 617.336000 229.228000 605.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 229.204000 617.336000 236.356000 605.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 236.404000 617.336000 243.172000 605.336000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 243.208000 617.336000 250.300000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 250.312000 617.336000 254.116000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 254.116000 617.336000 258.556000 605.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 258.616000 617.336000 264.352000 605.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 264.316000 617.336000 271.408000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 271.420000 617.336000 278.512000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 278.524000 617.336000 282.328000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 282.424000 617.336000 289.576000 605.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 289.528000 617.336000 296.248000 605.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 296.332000 617.336000 303.052000 605.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 303.028000 617.336000 310.120000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 310.132000 617.336000 316.288000 605.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 316.228000 617.336000 322.384000 605.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 322.432000 617.336000 326.236000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 326.332000 617.336000 331.144000 605.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 331.036000 617.336000 338.260000 605.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 338.236000 617.336000 342.040000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 342.232000 617.336000 353.608000 605.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 353.536000 617.336000 360.304000 605.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 360.340000 617.336000 364.144000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 364.144000 617.336000 374.404000 605.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 374.440000 617.336000 380.176000 605.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 380.236000 617.336000 384.064000 605.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 384.040000 617.336000 388.852000 605.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 388.840000 617.336000 392.668000 605.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 392.740000 617.336000 400.468000 605.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 400.444000 617.336000 408.124000 605.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 408.148000 617.336000 411.952000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 411.952000 617.336000 419.680000 605.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 419.752000 617.336000 424.564000 605.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 424.552000 617.336000 431.644000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 431.656000 617.336000 439.384000 605.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 439.360000 617.336000 445.516000 605.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 445.564000 617.336000 449.392000 605.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 449.368000 617.336000 453.196000 605.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 453.172000 617.336000 459.328000 605.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 459.376000 617.336000 463.180000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 463.276000 617.336000 470.428000 605.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 470.380000 617.336000 478.108000 605.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.180000 617.336000 485.860000 605.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 485.776000 617.336000 489.580000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 489.676000 617.336000 494.488000 605.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 494.572000 617.336000 502.300000 605.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 502.276000 617.336000 509.368000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 509.380000 617.336000 513.184000 605.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 513.200000 617.336000 518.012000 605.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 518.000000 617.336000 525.092000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 525.104000 617.336000 528.932000 605.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 528.908000 617.336000 536.000000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.100000 617.336000 540.144000 605.336000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 603.436000 229.180000 591.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 229.204000 603.436000 236.932000 591.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 236.908000 603.436000 244.132000 591.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 244.108000 603.436000 251.836000 591.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 251.908000 603.436000 259.000000 591.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 259.012000 603.436000 262.816000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.808000 603.436000 268.612000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 270.712000 603.436000 278.704000 591.436000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 277.816000 603.436000 285.040000 591.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 287.020000 603.436000 290.824000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 292.924000 603.436000 297.736000 591.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 297.724000 603.436000 305.452000 591.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 305.524000 603.436000 312.616000 591.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 314.620000 603.436000 318.424000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 320.524000 603.436000 326.260000 591.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 326.224000 603.436000 330.052000 591.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 330.124000 603.436000 337.804000 591.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 337.828000 603.436000 345.556000 591.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 345.532000 603.436000 350.344000 591.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 350.332000 603.436000 354.136000 591.436000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 356.128000 603.436000 359.932000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 362.032000 603.436000 366.772000 591.436000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 368.728000 603.436000 372.532000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 374.728000 603.436000 382.456000 591.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 382.432000 603.436000 389.584000 591.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 389.536000 603.436000 396.304000 591.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 396.340000 603.436000 403.432000 591.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 405.436000 603.436000 409.240000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 411.340000 603.436000 418.492000 591.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 422.644000 603.436000 426.448000 591.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 426.600000 603.436000 434.664000 591.436000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 434.700000 603.436000 443.880000 591.436000 1.000000 0.000000 0.000000 1.000000 C
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 443.900000 603.436000 447.704000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 451.796000 603.436000 458.948000 591.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 458.996000 603.436000 466.724000 591.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 466.700000 603.436000 474.380000 591.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 476.504000 603.436000 480.308000 591.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 482.300000 603.436000 489.452000 591.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 489.404000 603.436000 497.132000 591.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 501.308000 603.436000 505.112000 591.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 505.100000 603.436000 513.764000 591.436000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 513.800000 603.436000 521.480000 591.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 521.504000 603.436000 529.184000 591.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 529.208000 603.436000 533.036000 591.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 533.012000 603.436000 540.104000 591.436000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 603.436000 543.904000 591.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 589.536000 233.776000 577.536000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 233.800000 589.536000 240.952000 577.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 241.000000 589.536000 247.720000 577.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 247.696000 589.536000 251.524000 577.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 251.500000 589.536000 259.228000 577.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 259.204000 589.536000 264.016000 577.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 264.004000 589.536000 271.228000 577.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 271.204000 589.536000 277.360000 577.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 277.408000 589.536000 285.136000 577.536000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 285.200000 589.536000 289.004000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 289.904000 589.536000 293.708000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 294.704000 589.536000 302.924000 577.536000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 302.900000 589.536000 306.728000 577.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 306.800000 589.536000 314.528000 577.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 314.504000 589.536000 321.224000 577.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 321.200000 589.536000 328.292000 577.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 329.300000 589.536000 333.104000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 334.196000 589.536000 338.936000 577.536000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 339.800000 589.536000 343.604000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 344.600000 589.536000 352.328000 577.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 352.304000 589.536000 359.456000 577.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 359.504000 589.536000 366.272000 577.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 366.308000 589.536000 373.400000 577.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 374.408000 589.536000 378.212000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 379.208000 589.536000 384.020000 577.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 384.008000 589.536000 391.736000 577.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 391.808000 589.536000 398.900000 577.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 399.704000 589.536000 403.508000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 404.600000 589.536000 411.320000 577.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 411.296000 589.536000 418.520000 577.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 418.496000 589.536000 429.872000 577.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 429.896000 589.536000 437.576000 577.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 437.600000 589.536000 445.328000 577.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 445.304000 589.536000 450.116000 577.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 450.200000 589.536000 457.292000 577.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 457.304000 589.536000 463.040000 577.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 462.908000 589.536000 469.064000 577.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 470.108000 589.536000 473.912000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.908000 589.536000 482.636000 577.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 482.612000 589.536000 489.704000 577.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 489.716000 589.536000 494.528000 577.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 494.612000 589.536000 504.872000 577.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 504.812000 589.536000 512.036000 577.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 512.012000 589.536000 517.748000 577.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 517.808000 589.536000 525.068000 577.536000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 525.104000 589.536000 532.196000 577.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 532.208000 589.536000 539.888000 577.536000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 589.536000 543.904000 577.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 575.636000 226.312000 563.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.300000 575.636000 233.524000 563.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 233.500000 575.636000 241.180000 563.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 241.204000 575.636000 248.296000 563.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 248.308000 575.636000 253.120000 563.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 253.204000 575.636000 260.932000 563.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 260.908000 575.636000 268.000000 563.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 268.012000 575.636000 273.748000 563.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 272.416000 575.636000 276.220000 563.636000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 277.216000 575.636000 281.020000 563.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 282.112000 575.636000 289.264000 563.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 289.312000 575.636000 297.040000 563.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 297.016000 575.636000 304.696000 563.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 305.716000 575.636000 309.520000 563.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 310.612000 575.636000 317.836000 563.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 317.812000 575.636000 322.252000 563.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 322.312000 575.636000 327.124000 563.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 327.112000 575.636000 334.204000 563.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 334.216000 575.636000 341.944000 563.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 342.916000 575.636000 346.720000 563.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 347.812000 575.636000 359.188000 563.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 359.212000 575.636000 366.940000 563.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 366.916000 575.636000 373.072000 563.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 373.120000 575.636000 377.932000 563.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 378.916000 575.636000 382.720000 563.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 383.812000 575.636000 388.624000 563.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 388.708000 575.636000 394.444000 563.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 394.408000 575.636000 401.560000 563.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 401.608000 575.636000 409.336000 563.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 409.312000 575.636000 415.468000 563.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 415.408000 575.636000 419.848000 563.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 419.812000 575.636000 426.904000 563.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 426.916000 575.636000 432.652000 563.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 433.720000 575.636000 437.524000 563.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.616000 575.636000 446.296000 563.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 446.320000 575.636000 453.544000 563.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 453.520000 575.636000 460.240000 563.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 460.216000 575.636000 467.944000 563.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 468.016000 575.636000 479.392000 563.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 479.320000 575.636000 486.412000 563.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 486.424000 575.636000 494.152000 563.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 494.224000 575.636000 499.036000 563.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 499.024000 575.636000 505.180000 563.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 506.224000 575.636000 510.028000 563.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 511.120000 575.636000 515.560000 563.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 515.524000 575.636000 521.260000 563.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 521.320000 575.636000 528.544000 563.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 528.520000 575.636000 539.896000 563.636000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 575.636000 543.904000 563.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 561.736000 228.724000 549.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 228.700000 561.736000 236.428000 549.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 236.500000 561.736000 243.592000 549.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 244.396000 561.736000 248.200000 549.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 248.992000 561.736000 253.804000 549.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 253.792000 561.736000 261.016000 549.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 261.796000 561.736000 265.600000 549.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.392000 561.736000 271.204000 549.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 271.288000 561.736000 279.016000 549.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 278.992000 561.736000 286.084000 549.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 286.888000 561.736000 290.692000 549.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 291.484000 561.736000 298.708000 549.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 298.684000 561.736000 303.496000 549.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 303.484000 561.736000 311.212000 549.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 311.284000 561.736000 318.376000 549.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 318.388000 561.736000 324.124000 549.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 322.792000 561.736000 326.596000 549.736000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 327.388000 561.736000 331.192000 549.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 331.984000 561.736000 336.796000 549.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 336.784000 561.736000 344.512000 549.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 344.584000 561.736000 351.676000 549.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 352.480000 561.736000 356.284000 549.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 357.880000 561.736000 365.872000 549.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 365.080000 561.736000 370.816000 549.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 370.780000 561.736000 376.936000 549.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 376.984000 561.736000 381.796000 549.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 382.588000 561.736000 386.392000 549.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 387.184000 561.736000 394.408000 549.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 394.384000 561.736000 406.708000 549.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 406.780000 561.736000 413.500000 549.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 413.476000 561.736000 420.568000 549.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 421.372000 561.736000 425.176000 549.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 425.968000 561.736000 432.124000 549.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 432.172000 561.736000 439.900000 549.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 439.876000 561.736000 443.704000 549.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 443.680000 561.736000 448.492000 549.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 448.480000 561.736000 455.572000 549.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 456.484000 561.736000 460.288000 549.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 461.080000 561.736000 465.892000 549.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 465.880000 561.736000 473.104000 549.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 473.884000 561.736000 477.688000 549.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 478.480000 561.736000 485.200000 549.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 485.284000 561.736000 492.508000 549.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 492.484000 561.736000 503.860000 549.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 503.884000 561.736000 510.976000 549.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 511.780000 561.736000 515.584000 549.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 516.376000 561.736000 520.204000 549.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 520.180000 561.736000 527.908000 549.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 527.980000 561.736000 532.792000 549.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 532.780000 561.736000 540.004000 549.736000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.200000 561.736000 544.004000 549.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 547.836000 228.220000 535.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 228.196000 547.836000 235.420000 535.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 235.396000 547.836000 243.124000 535.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 243.100000 547.836000 249.256000 535.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 249.304000 547.836000 253.132000 535.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 253.108000 547.836000 260.788000 535.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 260.812000 547.836000 267.904000 535.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 267.916000 547.836000 273.652000 535.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 273.616000 547.836000 280.768000 535.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 280.816000 547.836000 285.628000 535.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 285.616000 547.836000 289.444000 535.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 289.420000 547.836000 296.644000 535.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 296.620000 547.836000 304.348000 535.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 304.324000 547.836000 308.128000 535.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 308.128000 547.836000 312.568000 535.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 312.532000 547.836000 319.756000 535.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 319.732000 547.836000 325.468000 535.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 325.432000 547.836000 329.236000 535.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 329.236000 547.836000 340.612000 535.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 340.636000 547.836000 347.728000 535.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 347.740000 547.836000 351.544000 535.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 351.544000 547.836000 361.804000 535.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 361.840000 547.836000 368.992000 535.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 369.040000 547.836000 375.196000 535.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 375.244000 547.836000 379.048000 535.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 379.048000 547.836000 383.860000 535.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 383.848000 547.836000 391.576000 535.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 391.552000 547.836000 395.380000 535.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 395.356000 547.836000 401.512000 535.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 401.560000 547.836000 405.364000 535.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 405.364000 547.836000 413.044000 535.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 413.068000 547.836000 418.804000 535.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 418.768000 547.836000 425.992000 535.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 425.968000 547.836000 433.648000 535.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 433.672000 547.836000 441.400000 535.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 441.376000 547.836000 448.096000 535.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 448.072000 547.836000 452.884000 535.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 452.872000 547.836000 456.676000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 527.936000 229.492000 515.936000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 229.504000 527.936000 237.232000 515.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 237.208000 527.936000 244.300000 515.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 244.612000 527.936000 248.416000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 248.812000 527.936000 252.640000 515.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 252.616000 527.936000 259.708000 515.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 259.720000 527.936000 264.160000 515.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 264.220000 527.936000 269.032000 515.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 269.524000 527.936000 273.328000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 273.724000 527.936000 280.876000 515.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 280.924000 527.936000 286.660000 515.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 286.624000 527.936000 298.000000 515.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 298.228000 527.936000 302.032000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 302.524000 527.936000 309.748000 515.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 309.724000 527.936000 314.164000 515.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 314.524000 527.936000 318.328000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 318.724000 527.936000 330.100000 515.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 330.124000 527.936000 336.892000 515.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 337.228000 527.936000 341.032000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 341.428000 527.936000 349.108000 515.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 349.132000 527.936000 356.224000 515.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 356.236000 527.936000 362.392000 515.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 362.332000 527.936000 369.592000 515.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 370.036000 527.936000 373.840000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 374.236000 527.936000 380.956000 515.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 381.040000 527.936000 388.192000 515.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 388.240000 527.936000 395.968000 515.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 396.136000 527.936000 399.940000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 400.336000 527.936000 408.016000 515.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 408.040000 527.936000 415.132000 515.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 415.540000 527.936000 419.344000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 419.740000 527.936000 427.468000 515.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 427.444000 527.936000 433.600000 515.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 433.648000 527.936000 440.740000 515.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 440.752000 527.936000 448.432000 515.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 448.756000 527.936000 452.560000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 452.956000 527.936000 457.768000 515.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 457.852000 527.936000 465.076000 515.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 465.448000 527.936000 469.252000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 469.648000 527.936000 477.376000 515.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 477.352000 527.936000 484.444000 515.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.456000 527.936000 491.608000 515.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 491.656000 527.936000 499.336000 515.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 499.360000 527.936000 503.164000 515.936000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 503.464000 527.936000 507.268000 515.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 507.664000 527.936000 513.820000 515.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 513.868000 527.936000 518.680000 515.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 518.668000 527.936000 525.820000 515.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 525.772000 527.936000 532.492000 515.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 532.576000 527.936000 539.836000 515.936000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 527.936000 543.904000 515.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 514.036000 228.652000 502.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.700000 514.036000 236.428000 502.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 236.404000 514.036000 244.084000 502.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 244.900000 514.036000 248.704000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 249.604000 514.036000 257.284000 502.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 257.308000 514.036000 261.136000 502.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 261.112000 514.036000 264.940000 502.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 265.012000 514.036000 272.104000 502.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 272.812000 514.036000 276.616000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.612000 514.036000 285.292000 502.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 285.208000 514.036000 292.360000 502.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 292.408000 514.036000 300.088000 502.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 300.004000 514.036000 307.096000 502.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 307.108000 514.036000 312.844000 502.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 312.904000 514.036000 319.060000 502.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 319.900000 514.036000 323.704000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 324.604000 514.036000 329.416000 502.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 329.404000 514.036000 336.628000 502.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 337.408000 514.036000 341.212000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 342.112000 514.036000 353.488000 502.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 353.512000 514.036000 360.280000 502.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 361.108000 514.036000 364.912000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 365.812000 514.036000 373.540000 502.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 373.516000 514.036000 380.608000 502.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 380.620000 514.036000 387.772000 502.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 387.820000 514.036000 393.556000 502.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 393.520000 514.036000 398.332000 502.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 398.320000 514.036000 401.608000 502.036000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 401.620000 514.036000 407.776000 502.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 408.616000 514.036000 412.420000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 413.320000 514.036000 420.040000 502.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 420.016000 514.036000 427.240000 502.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 427.216000 514.036000 434.944000 502.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 435.016000 514.036000 439.828000 502.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 439.816000 514.036000 446.908000 502.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 446.920000 514.036000 454.648000 502.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 454.624000 514.036000 459.436000 502.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 459.424000 514.036000 463.228000 502.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.128000 514.036000 467.932000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 469.624000 514.036000 473.428000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.328000 514.036000 482.320000 502.036000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 482.332000 514.036000 490.060000 502.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 490.036000 514.036000 497.128000 502.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 498.040000 514.036000 501.844000 502.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 502.744000 514.036000 509.896000 502.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 509.944000 514.036000 516.664000 502.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 516.640000 514.036000 521.452000 502.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 521.440000 514.036000 529.168000 502.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 529.144000 514.036000 536.296000 502.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 536.248000 514.036000 540.076000 502.036000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 514.036000 543.904000 502.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 500.136000 228.220000 488.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 228.196000 500.136000 235.420000 488.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 235.396000 500.136000 239.224000 488.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 239.296000 500.136000 246.520000 488.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 246.496000 500.136000 252.232000 488.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 252.400000 500.136000 256.204000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 256.600000 500.136000 263.824000 488.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 263.800000 500.136000 268.240000 488.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 268.396000 500.136000 272.200000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 272.500000 500.136000 277.312000 488.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 277.396000 500.136000 285.124000 488.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 285.100000 500.136000 292.192000 488.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 292.396000 500.136000 296.200000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 296.500000 500.136000 304.180000 488.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 304.204000 500.136000 311.296000 488.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 311.308000 500.136000 317.464000 488.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 317.404000 500.136000 324.664000 488.136000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 324.700000 500.136000 329.512000 488.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 329.500000 500.136000 336.724000 488.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 336.796000 500.136000 344.476000 488.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 344.596000 500.136000 348.400000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 348.796000 500.136000 355.516000 488.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 355.492000 500.136000 362.644000 488.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 362.692000 500.136000 370.420000 488.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 370.588000 500.136000 374.392000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 374.692000 500.136000 381.916000 488.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 381.892000 500.136000 389.620000 488.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 389.692000 500.136000 393.520000 488.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 393.496000 500.136000 400.264000 488.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 400.492000 500.136000 404.296000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 404.596000 500.136000 412.276000 488.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 412.192000 500.136000 419.284000 488.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 419.488000 500.136000 423.292000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 423.688000 500.136000 430.840000 488.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 430.888000 500.136000 437.044000 488.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 436.984000 500.136000 443.704000 488.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 443.680000 500.136000 450.772000 488.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 450.784000 500.136000 456.520000 488.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.580000 500.136000 461.392000 488.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 461.380000 500.136000 468.532000 488.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 468.484000 500.136000 472.312000 488.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 472.288000 500.136000 480.016000 488.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 479.992000 500.136000 487.084000 488.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 487.096000 500.136000 494.776000 488.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 495.100000 500.136000 498.904000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 499.204000 500.136000 506.356000 488.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 506.404000 500.136000 510.844000 488.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 510.808000 500.136000 515.620000 488.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 515.608000 500.136000 522.700000 488.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 522.712000 500.136000 528.448000 488.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 528.616000 500.136000 532.420000 488.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 532.720000 500.136000 539.872000 488.136000 1.000000 0.000000 0.000000 1.000000 a
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 500.136000 543.904000 488.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 486.236000 226.312000 474.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.300000 486.236000 234.028000 474.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 234.004000 486.236000 241.228000 474.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 241.204000 486.236000 246.940000 474.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 246.904000 486.236000 254.128000 474.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 254.104000 486.236000 261.832000 474.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 261.808000 486.236000 269.488000 474.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 269.512000 486.236000 277.240000 474.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 277.216000 486.236000 281.020000 474.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 281.020000 486.236000 288.112000 474.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 288.124000 486.236000 294.880000 474.236000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 294.928000 486.236000 301.648000 474.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 301.624000 486.236000 308.776000 474.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 308.824000 486.236000 315.592000 474.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 315.628000 486.236000 322.780000 474.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 322.828000 486.236000 327.640000 474.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 327.628000 486.236000 331.456000 474.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 331.432000 486.236000 338.656000 474.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 338.632000 486.236000 346.360000 474.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 346.336000 486.236000 350.140000 474.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 350.140000 486.236000 353.944000 474.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1400.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 454.492000 118.768000 440.492000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 118.796000 454.492000 128.288000 440.492000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 128.302000 454.492000 138.312000 440.492000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 138.298000 454.492000 145.200000 440.492000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 145.200000 454.492000 154.818000 440.492000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 154.804000 454.492000 164.422000 440.492000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 164.408000 454.492000 178.982000 440.492000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 432.236000 229.816000 420.236000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 229.804000 432.236000 237.532000 420.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 237.604000 432.236000 243.340000 420.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 243.304000 432.236000 248.116000 420.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 248.104000 432.236000 255.832000 420.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 255.808000 432.236000 262.900000 420.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 262.912000 432.236000 268.648000 420.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 269.812000 432.236000 273.616000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 274.708000 432.236000 282.388000 420.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 282.412000 432.236000 289.636000 420.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 289.612000 432.236000 299.872000 420.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 299.908000 432.236000 307.636000 420.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 308.704000 432.236000 312.508000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 313.708000 432.236000 318.520000 420.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 318.508000 432.236000 326.236000 420.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 326.308000 432.236000 333.400000 420.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 334.504000 432.236000 338.308000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 339.400000 432.236000 347.128000 420.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 347.104000 432.236000 354.256000 420.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 354.304000 432.236000 358.132000 420.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 358.108000 432.236000 361.936000 420.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 363.004000 432.236000 366.808000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 368.104000 432.236000 371.932000 420.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 371.908000 432.236000 378.064000 420.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 379.204000 432.236000 383.008000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 384.100000 432.236000 395.476000 420.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 395.404000 432.236000 402.172000 420.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 403.300000 432.236000 407.104000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 408.304000 432.236000 415.984000 420.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 416.008000 432.236000 423.100000 420.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 423.112000 432.236000 430.792000 420.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 430.816000 432.236000 436.552000 420.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 436.516000 432.236000 443.740000 420.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 443.716000 432.236000 450.940000 420.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 451.012000 432.236000 462.388000 420.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 462.316000 432.236000 466.120000 420.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.320000 432.236000 471.124000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 472.216000 432.236000 480.208000 420.236000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 480.220000 432.236000 487.948000 420.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 487.924000 432.236000 491.752000 420.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 491.824000 432.236000 497.980000 420.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 499.024000 432.236000 502.828000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 504.028000 432.236000 507.856000 420.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 507.832000 432.236000 513.988000 420.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 515.128000 432.236000 518.932000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 520.024000 432.236000 524.836000 420.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 524.920000 432.236000 532.648000 420.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 532.624000 432.236000 539.716000 420.236000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 432.236000 543.904000 420.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 418.336000 228.724000 406.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 228.700000 418.336000 236.428000 406.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 236.500000 418.336000 240.328000 406.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 240.304000 418.336000 247.072000 406.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 247.600000 418.336000 251.404000 406.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 251.896000 418.336000 257.632000 406.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 257.596000 418.336000 264.820000 406.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 264.892000 418.336000 272.116000 406.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 272.092000 418.336000 283.468000 406.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 283.888000 418.336000 287.692000 406.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.292000 418.336000 292.120000 406.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 292.096000 418.336000 299.824000 406.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 300.292000 418.336000 304.096000 406.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 304.588000 418.336000 309.400000 406.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 309.484000 418.336000 317.212000 406.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 317.188000 418.336000 324.280000 406.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 324.784000 418.336000 328.588000 406.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 329.080000 418.336000 336.808000 406.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 336.784000 418.336000 344.008000 406.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 344.080000 418.336000 351.808000 406.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 351.784000 418.336000 357.940000 406.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 357.880000 418.336000 364.972000 406.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 365.584000 418.336000 369.388000 406.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 369.880000 418.336000 374.692000 406.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 374.680000 418.336000 382.408000 406.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 382.480000 418.336000 389.632000 406.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 389.584000 418.336000 394.396000 406.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 394.888000 418.336000 398.692000 406.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 399.184000 418.336000 403.012000 406.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.988000 418.336000 409.144000 406.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 409.684000 418.336000 413.488000 406.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 413.980000 418.336000 420.700000 406.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 420.676000 418.336000 427.828000 406.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 427.876000 418.336000 433.612000 406.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 433.576000 418.336000 441.256000 406.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 441.280000 418.336000 448.372000 406.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 448.384000 418.336000 453.196000 406.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 453.184000 418.336000 460.276000 406.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.288000 418.336000 467.968000 406.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 467.992000 418.336000 471.796000 406.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.288000 418.336000 476.092000 406.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 476.584000 418.336000 487.048000 406.336000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 487.084000 418.336000 494.236000 406.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 494.284000 418.336000 500.020000 406.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 499.984000 418.336000 507.664000 406.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 507.688000 418.336000 517.948000 406.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 517.984000 418.336000 525.208000 406.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 525.184000 418.336000 532.408000 406.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 532.384000 418.336000 540.064000 406.336000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 418.336000 543.904000 406.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 404.436000 229.492000 392.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 229.504000 404.436000 236.728000 392.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 236.704000 404.436000 243.928000 392.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 244.000000 404.436000 249.736000 392.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 249.700000 404.436000 255.856000 392.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 255.796000 404.436000 259.600000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 259.792000 404.436000 266.944000 392.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 266.992000 404.436000 272.728000 392.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 272.692000 404.436000 279.784000 392.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 279.892000 404.436000 283.696000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 283.888000 404.436000 290.980000 392.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 290.992000 404.436000 298.144000 392.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 297.988000 404.436000 304.144000 392.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 304.192000 404.436000 310.960000 392.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 310.888000 404.436000 314.692000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 314.884000 404.436000 319.696000 392.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 319.684000 404.436000 326.908000 392.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 326.884000 404.436000 330.688000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 330.880000 404.436000 337.600000 392.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 337.576000 404.436000 344.728000 392.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 344.776000 404.436000 350.512000 392.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 350.476000 404.436000 357.568000 392.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 357.676000 404.436000 361.480000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 361.672000 404.436000 366.112000 392.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 365.968000 404.436000 373.192000 392.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 373.168000 404.436000 378.904000 392.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 379.072000 404.436000 382.876000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 383.068000 404.436000 390.220000 392.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 390.064000 404.436000 397.792000 392.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 397.768000 404.436000 405.448000 392.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 405.472000 404.436000 409.276000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 409.468000 404.436000 413.296000 392.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 413.272000 404.436000 420.496000 392.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 420.472000 404.436000 427.696000 392.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 427.768000 404.436000 435.028000 392.436000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 434.968000 404.436000 438.772000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.964000 404.436000 446.692000 392.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 446.764000 404.436000 450.592000 392.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 450.568000 404.436000 457.288000 392.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.372000 404.436000 464.464000 392.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 464.476000 404.436000 468.280000 392.436000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 468.280000 404.436000 472.084000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 472.180000 404.436000 479.860000 392.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 479.776000 404.436000 487.504000 392.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 487.480000 404.436000 492.292000 392.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 492.484000 404.436000 496.288000 392.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 496.480000 404.436000 503.200000 392.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 503.080000 404.436000 510.232000 392.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 510.280000 404.436000 516.016000 392.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 515.980000 404.436000 523.660000 392.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 523.684000 404.436000 530.776000 392.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 530.788000 404.436000 535.600000 392.436000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.100000 404.436000 540.144000 392.436000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 390.536000 225.328000 378.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 225.304000 390.536000 233.032000 378.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 233.008000 390.536000 240.688000 378.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 240.712000 390.536000 244.516000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 244.516000 390.536000 248.344000 378.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 248.320000 390.536000 254.476000 378.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 254.524000 390.536000 258.328000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 258.328000 390.536000 269.704000 378.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 269.728000 390.536000 277.456000 378.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 277.432000 390.536000 284.152000 378.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 284.128000 390.536000 291.856000 378.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 291.832000 390.536000 295.636000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 295.636000 390.536000 307.012000 378.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 307.036000 390.536000 314.260000 378.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 314.236000 390.536000 319.972000 378.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 319.936000 390.536000 327.028000 378.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 327.040000 390.536000 330.844000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 330.844000 390.536000 338.524000 378.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 338.548000 390.536000 342.376000 378.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 342.352000 390.536000 349.444000 378.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 349.456000 390.536000 356.608000 378.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 356.656000 390.536000 362.812000 378.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 362.860000 390.536000 370.012000 378.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 370.060000 390.536000 377.788000 378.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 377.764000 390.536000 382.576000 378.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 382.564000 390.536000 386.368000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 386.368000 390.536000 390.808000 378.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 390.772000 390.536000 397.996000 378.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 397.972000 390.536000 403.708000 378.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 403.672000 390.536000 407.476000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 407.476000 390.536000 415.156000 378.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 415.180000 390.536000 422.332000 378.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 422.380000 390.536000 428.116000 378.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 428.080000 390.536000 435.172000 378.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 435.184000 390.536000 438.988000 378.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.988000 390.536000 443.428000 378.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 443.392000 390.536000 450.484000 378.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 450.496000 390.536000 457.588000 378.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 457.600000 390.536000 462.412000 378.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 462.400000 390.536000 466.204000 378.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 370.636000 226.240000 358.636000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 226.204000 370.636000 233.932000 358.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 235.000000 370.636000 238.804000 358.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 239.800000 370.636000 251.176000 358.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 251.200000 370.636000 257.968000 358.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 258.904000 370.636000 262.708000 358.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 263.908000 370.636000 271.588000 358.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 271.504000 370.636000 278.596000 358.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 278.608000 370.636000 286.288000 358.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 286.312000 370.636000 292.048000 358.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 292.108000 370.636000 299.332000 358.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 299.308000 370.636000 306.532000 358.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 306.508000 370.636000 317.884000 358.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 318.904000 370.636000 322.708000 358.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 323.704000 370.636000 327.532000 358.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 327.508000 370.636000 333.664000 358.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 334.708000 370.636000 338.512000 358.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 339.604000 370.636000 346.756000 358.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 348.808000 370.636000 352.612000 358.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 352.700000 370.636000 360.380000 358.636000 1.000000 0.000000 0.000000 1.000000 q
+drawChar 360.404000 370.636000 368.132000 358.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 368.108000 370.636000 375.200000 358.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 375.212000 370.636000 382.304000 358.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 382.316000 370.636000 390.044000 358.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 390.020000 370.636000 394.064000 358.636000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 394.124000 370.636000 400.280000 358.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 400.328000 370.636000 404.156000 358.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 404.132000 370.636000 410.444000 358.636000 1.000000 0.000000 0.000000 1.000000 z
+drawChar 410.432000 370.636000 417.524000 358.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 418.532000 370.636000 422.336000 358.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 423.332000 370.636000 431.012000 358.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 431.036000 370.636000 438.128000 358.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 438.140000 370.636000 445.820000 358.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 446.840000 370.636000 450.644000 358.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 451.736000 370.636000 458.888000 358.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 458.936000 370.636000 466.664000 358.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 466.640000 370.636000 474.320000 358.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 475.340000 370.636000 479.144000 358.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 480.140000 370.636000 484.952000 358.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 484.940000 370.636000 495.200000 358.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 495.236000 370.636000 502.460000 358.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 503.432000 370.636000 507.236000 358.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 508.328000 370.636000 516.056000 358.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 516.032000 370.636000 519.860000 358.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 519.932000 370.636000 527.612000 358.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 527.528000 370.636000 535.256000 358.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 535.328000 370.636000 540.140000 358.636000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 370.636000 543.904000 358.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 356.736000 227.656000 344.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 356.736000 232.516000 344.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 232.504000 356.736000 239.656000 344.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 239.608000 356.736000 247.336000 344.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 247.408000 356.736000 255.088000 344.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 255.004000 356.736000 261.160000 344.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 261.208000 356.736000 265.012000 344.736000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 265.708000 356.736000 269.512000 344.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 270.304000 356.736000 280.564000 344.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 280.600000 356.736000 288.328000 344.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 288.304000 356.736000 292.132000 344.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 292.108000 356.736000 298.828000 344.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 298.912000 356.736000 306.640000 344.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 307.408000 356.736000 311.212000 344.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 312.004000 356.736000 316.816000 344.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 316.900000 356.736000 324.052000 344.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 324.100000 356.736000 331.360000 344.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 331.300000 356.736000 338.392000 344.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 338.404000 356.736000 344.560000 344.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 345.208000 356.736000 349.012000 344.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 349.912000 356.736000 357.640000 344.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 357.616000 356.736000 365.296000 344.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 366.112000 356.736000 369.916000 344.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.708000 356.736000 382.084000 344.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 382.108000 356.736000 389.332000 344.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 389.308000 356.736000 395.464000 344.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 395.512000 356.736000 400.324000 344.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 401.008000 356.736000 404.812000 344.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 405.604000 356.736000 412.828000 344.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 412.804000 356.736000 417.244000 344.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 418.000000 356.736000 421.804000 344.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 422.704000 356.736000 427.516000 344.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 427.504000 356.736000 435.232000 344.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 435.304000 356.736000 442.396000 344.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 443.008000 356.736000 446.812000 344.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 447.604000 356.736000 453.340000 344.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 453.304000 356.736000 460.528000 344.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 460.600000 356.736000 467.824000 344.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 467.800000 356.736000 479.176000 344.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 479.200000 356.736000 483.004000 344.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 483.796000 356.736000 487.600000 344.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 488.392000 356.736000 498.220000 344.736000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 498.196000 356.736000 505.924000 344.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 506.692000 356.736000 510.496000 344.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 511.288000 356.736000 518.380000 344.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 518.392000 356.736000 525.544000 344.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 525.592000 356.736000 532.312000 344.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 532.288000 356.736000 540.016000 344.736000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 356.736000 543.904000 344.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 342.836000 227.656000 330.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 342.836000 231.532000 330.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 231.508000 342.836000 239.188000 330.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 239.212000 342.836000 246.304000 330.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 247.816000 342.836000 251.620000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 253.120000 342.836000 260.344000 330.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 260.320000 342.836000 264.760000 330.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 266.320000 342.836000 270.124000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 271.624000 342.836000 276.436000 330.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 276.424000 342.836000 284.152000 330.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 284.224000 342.836000 291.316000 330.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 292.720000 342.836000 296.524000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 298.024000 342.836000 305.704000 330.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 305.728000 342.836000 312.820000 330.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 312.832000 342.836000 320.512000 330.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 322.036000 342.836000 325.840000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 327.340000 342.836000 331.168000 330.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 331.144000 342.836000 337.300000 330.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 338.848000 342.836000 342.652000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 344.152000 342.836000 351.304000 330.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 352.852000 342.836000 356.656000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 358.156000 342.836000 365.836000 330.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 365.860000 342.836000 373.084000 330.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 373.060000 342.836000 380.284000 330.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 380.260000 342.836000 385.996000 330.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 384.664000 342.836000 388.468000 330.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 390.064000 342.836000 393.868000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 395.368000 342.836000 402.592000 330.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 402.568000 342.836000 410.296000 330.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 410.368000 342.836000 417.460000 330.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 418.864000 342.836000 422.668000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 424.168000 342.836000 427.996000 330.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 427.972000 342.836000 435.064000 330.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 435.076000 342.836000 442.228000 330.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 442.276000 342.836000 449.956000 330.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 449.980000 342.836000 456.136000 330.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 457.684000 342.836000 461.488000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 462.988000 342.836000 467.800000 330.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 467.788000 342.836000 475.012000 330.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 476.488000 342.836000 480.292000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 481.888000 342.836000 489.040000 330.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 490.492000 342.836000 494.296000 330.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 495.796000 342.836000 506.056000 330.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 506.092000 342.836000 513.244000 330.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 513.196000 342.836000 517.024000 330.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 517.096000 342.836000 524.356000 330.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 524.092000 342.836000 528.136000 330.836000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 528.196000 342.836000 532.024000 330.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 532.000000 342.836000 539.728000 330.836000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 342.836000 543.904000 330.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 328.936000 228.220000 316.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 228.196000 328.936000 232.024000 316.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 232.096000 328.936000 239.320000 316.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 239.296000 328.936000 245.452000 316.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 245.392000 328.936000 252.484000 316.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 252.496000 328.936000 257.308000 316.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 257.392000 328.936000 261.196000 316.936000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 261.496000 328.936000 265.300000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 265.600000 328.936000 272.752000 316.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 272.800000 328.936000 280.528000 316.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 280.504000 328.936000 288.184000 316.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 288.508000 328.936000 292.312000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 292.612000 328.936000 297.424000 316.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 297.412000 328.936000 305.140000 316.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 305.212000 328.936000 312.304000 316.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 312.508000 328.936000 316.312000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 316.612000 328.936000 323.836000 316.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 323.908000 328.936000 328.720000 316.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 328.708000 328.936000 336.436000 316.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 336.508000 328.936000 343.600000 316.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 343.612000 328.936000 349.348000 316.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 349.612000 328.936000 353.416000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 353.716000 328.936000 358.528000 316.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 358.516000 328.936000 365.740000 316.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 366.016000 328.936000 369.820000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.120000 328.936000 374.932000 316.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 375.016000 328.936000 382.744000 316.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 382.720000 328.936000 389.812000 316.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 390.124000 328.936000 393.928000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 394.228000 328.936000 401.908000 316.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 401.932000 328.936000 409.084000 316.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 409.036000 328.936000 413.848000 316.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 413.932000 328.936000 421.660000 316.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 421.636000 328.936000 427.372000 316.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 427.336000 328.936000 434.560000 316.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 434.536000 328.936000 441.760000 316.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 441.832000 328.936000 453.208000 316.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 453.232000 328.936000 457.036000 316.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.336000 328.936000 461.140000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 461.440000 328.936000 466.180000 316.936000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 466.444000 328.936000 470.248000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 470.548000 328.936000 477.700000 316.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 477.748000 328.936000 481.576000 316.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 481.552000 328.936000 487.708000 316.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 487.756000 328.936000 494.980000 316.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 495.256000 328.936000 499.060000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 499.360000 328.936000 507.088000 316.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 507.064000 328.936000 514.216000 316.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 514.264000 328.936000 521.032000 316.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 521.068000 328.936000 528.160000 316.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 528.472000 328.936000 532.276000 316.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 532.576000 328.936000 539.728000 316.936000 1.000000 0.000000 0.000000 1.000000 a
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.200000 328.936000 544.004000 316.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 315.036000 226.312000 303.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.300000 315.036000 233.392000 303.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 233.404000 315.036000 237.232000 303.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 237.304000 315.036000 244.396000 303.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 244.408000 315.036000 251.176000 303.036000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 251.104000 315.036000 254.932000 303.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 255.004000 315.036000 261.160000 303.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 261.100000 315.036000 264.928000 303.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 265.000000 315.036000 272.224000 303.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 272.200000 315.036000 279.928000 303.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 281.200000 315.036000 285.004000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 286.396000 315.036000 290.224000 303.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 290.200000 315.036000 297.928000 303.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 299.296000 315.036000 303.100000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 304.492000 315.036000 315.868000 303.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 315.892000 315.036000 322.660000 303.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 323.992000 315.036000 327.796000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 329.188000 315.036000 336.868000 303.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 336.892000 315.036000 343.984000 303.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 343.996000 315.036000 351.676000 303.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 351.700000 315.036000 357.436000 303.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 357.400000 315.036000 364.624000 303.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 364.600000 315.036000 371.824000 303.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 371.896000 315.036000 383.272000 303.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 383.200000 315.036000 387.004000 303.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 388.300000 315.036000 392.104000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 393.604000 315.036000 400.696000 303.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 400.708000 315.036000 406.864000 303.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 406.912000 315.036000 414.592000 303.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 414.508000 315.036000 421.600000 303.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 421.612000 315.036000 428.332000 303.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 428.416000 315.036000 432.244000 303.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 432.220000 315.036000 439.372000 303.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 439.420000 315.036000 443.248000 303.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 443.116000 315.036000 446.944000 303.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 446.920000 315.036000 453.688000 303.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 455.116000 315.036000 458.920000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 460.312000 315.036000 464.752000 303.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 464.716000 315.036000 471.940000 303.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 472.012000 315.036000 477.748000 303.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 479.008000 315.036000 482.812000 303.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.204000 315.036000 494.464000 303.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 494.500000 315.036000 501.652000 303.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 501.604000 315.036000 506.416000 303.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 506.404000 315.036000 513.124000 303.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 513.208000 315.036000 520.936000 303.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 520.912000 315.036000 524.740000 303.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 524.716000 315.036000 532.444000 303.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 532.516000 315.036000 540.196000 303.036000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 315.036000 543.904000 303.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 301.136000 226.312000 289.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.300000 301.136000 234.028000 289.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 234.100000 301.136000 241.192000 289.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 241.900000 301.136000 245.704000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 246.496000 301.136000 250.324000 289.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 250.300000 301.136000 257.452000 289.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 257.500000 301.136000 262.312000 289.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 262.300000 301.136000 269.392000 289.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 269.404000 301.136000 273.448000 289.136000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 273.508000 301.136000 281.236000 289.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 281.212000 301.136000 285.040000 289.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 285.016000 301.136000 292.696000 289.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 292.720000 301.136000 300.448000 289.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 300.424000 301.136000 305.236000 289.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 306.028000 301.136000 309.832000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 310.732000 301.136000 322.108000 289.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 322.036000 301.136000 329.260000 289.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 329.332000 301.136000 336.100000 289.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 336.028000 301.136000 339.856000 289.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 339.832000 301.136000 346.924000 289.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 346.936000 301.136000 353.092000 289.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 353.140000 301.136000 356.944000 289.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 357.640000 301.136000 361.444000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 362.344000 301.136000 367.084000 289.136000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 367.048000 301.136000 371.860000 289.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 371.944000 301.136000 375.232000 289.136000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 375.244000 301.136000 381.400000 289.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 382.144000 301.136000 385.948000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 386.740000 301.136000 393.892000 289.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 393.940000 301.136000 397.768000 289.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 397.744000 301.136000 403.900000 289.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 403.948000 301.136000 411.172000 289.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 411.844000 301.136000 415.648000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 416.440000 301.136000 424.120000 289.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 424.144000 301.136000 431.368000 289.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 431.344000 301.136000 437.500000 289.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 437.548000 301.136000 443.704000 289.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 443.644000 301.136000 447.472000 289.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 447.544000 301.136000 455.224000 289.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 455.140000 301.136000 458.968000 289.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 459.040000 301.136000 466.132000 289.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.936000 301.136000 470.740000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 471.532000 301.136000 476.344000 289.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 476.332000 301.136000 483.556000 289.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 484.228000 301.136000 488.032000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 488.824000 301.136000 492.652000 289.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 492.628000 301.136000 496.456000 289.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 496.528000 301.136000 502.684000 289.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 502.624000 301.136000 507.436000 289.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 507.520000 301.136000 514.612000 289.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 514.624000 301.136000 522.352000 289.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 523.120000 301.136000 526.924000 289.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 527.716000 301.136000 532.528000 289.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 532.612000 301.136000 539.836000 289.136000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 301.136000 543.904000 289.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 287.236000 232.876000 275.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 232.900000 287.236000 240.628000 275.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 240.604000 287.236000 246.760000 275.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 246.808000 287.236000 250.636000 275.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 250.612000 287.236000 257.332000 275.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 257.416000 287.236000 261.220000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 261.412000 287.236000 265.240000 275.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 265.216000 287.236000 272.944000 275.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 273.220000 287.236000 277.024000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.216000 287.236000 288.592000 275.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 288.616000 287.236000 295.384000 275.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 295.516000 287.236000 299.320000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 299.512000 287.236000 307.192000 275.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 307.216000 287.236000 314.308000 275.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 314.320000 287.236000 322.000000 275.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 322.024000 287.236000 327.760000 275.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 327.724000 287.236000 334.948000 275.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 334.924000 287.236000 342.148000 275.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 342.220000 287.236000 353.596000 275.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 353.524000 287.236000 357.328000 275.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 357.520000 287.236000 361.324000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 361.624000 287.236000 368.776000 275.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 368.824000 287.236000 374.980000 275.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 375.028000 287.236000 378.832000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 379.024000 287.236000 390.400000 275.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 390.424000 287.236000 397.192000 275.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 397.528000 287.236000 401.332000 275.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 401.700000 287.236000 407.856000 275.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 407.904000 287.236000 412.716000 275.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 412.704000 287.236000 419.796000 275.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 419.808000 287.236000 425.544000 275.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 425.508000 287.236000 432.600000 275.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 432.612000 287.236000 439.836000 275.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 440.016000 287.236000 443.820000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 444.120000 287.236000 450.276000 275.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 450.324000 287.236000 457.092000 275.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 457.020000 287.236000 463.176000 275.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 463.224000 287.236000 468.036000 275.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 468.024000 287.236000 475.116000 275.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 475.128000 287.236000 486.504000 275.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 486.624000 287.236000 490.428000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 490.620000 287.236000 494.448000 275.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 494.424000 287.236000 500.580000 275.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 500.820000 287.236000 504.624000 275.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 504.816000 287.236000 508.644000 275.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 508.620000 287.236000 516.348000 275.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 516.420000 287.236000 521.232000 275.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 521.220000 287.236000 528.312000 275.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 528.324000 287.236000 536.004000 275.236000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 287.236000 540.044000 275.236000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 273.336000 227.236000 261.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 227.200000 273.336000 234.352000 261.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 234.400000 273.336000 239.212000 261.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 239.200000 273.336000 246.292000 261.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 246.304000 273.336000 253.984000 261.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 254.308000 273.336000 258.112000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 258.508000 273.336000 268.768000 261.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 268.804000 273.336000 272.632000 261.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 272.608000 273.336000 277.420000 261.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 277.408000 273.336000 285.136000 261.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 285.604000 273.336000 289.408000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 289.804000 273.336000 294.616000 261.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 294.604000 273.336000 302.332000 261.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 302.404000 273.336000 309.496000 261.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 309.700000 273.336000 313.504000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 313.996000 273.336000 318.808000 261.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 318.796000 273.336000 325.888000 261.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 325.900000 273.336000 329.728000 261.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 329.800000 273.336000 336.892000 261.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 336.904000 273.336000 343.672000 261.336000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 343.600000 273.336000 347.428000 261.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 347.404000 273.336000 353.560000 261.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 353.608000 273.336000 357.436000 261.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 357.412000 273.336000 364.636000 261.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 364.708000 273.336000 372.436000 261.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 372.412000 273.336000 376.216000 261.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 376.612000 273.336000 380.416000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 380.812000 273.336000 390.916000 261.336000 1.000000 0.000000 0.000000 1.000000 U
+drawChar 390.916000 273.336000 397.072000 261.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 397.120000 273.336000 400.948000 261.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 400.924000 273.336000 408.652000 261.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 408.628000 273.336000 416.308000 261.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 416.632000 273.336000 420.436000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 420.832000 273.336000 425.644000 261.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 425.728000 273.336000 433.456000 261.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 433.432000 273.336000 440.524000 261.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 440.932000 273.336000 444.736000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 445.132000 273.336000 450.868000 261.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 450.832000 273.336000 457.924000 261.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 457.936000 273.336000 469.312000 261.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 469.336000 273.336000 476.560000 261.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 476.536000 273.336000 481.348000 261.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 481.432000 273.336000 488.524000 261.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 488.836000 273.336000 492.640000 261.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 493.036000 273.336000 499.756000 261.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 499.732000 273.336000 506.956000 261.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 506.932000 273.336000 514.660000 261.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 514.732000 273.336000 519.544000 261.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 519.532000 273.336000 525.268000 261.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 525.232000 273.336000 532.456000 261.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 532.528000 273.336000 536.356000 261.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 536.332000 273.336000 540.136000 261.336000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.200000 273.336000 544.004000 261.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 259.436000 226.240000 247.436000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 226.696000 259.436000 230.500000 247.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 231.196000 259.436000 237.916000 247.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 237.892000 259.436000 245.044000 247.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 245.092000 259.436000 252.820000 247.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 253.396000 259.436000 257.200000 247.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 257.800000 259.436000 265.024000 247.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 265.000000 259.436000 272.680000 247.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 272.704000 259.436000 279.796000 247.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 279.808000 259.436000 285.544000 247.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 285.508000 259.436000 292.660000 247.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 292.708000 259.436000 297.520000 247.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 297.508000 259.436000 304.600000 247.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 305.104000 259.436000 308.908000 247.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 309.508000 259.436000 314.320000 247.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 314.308000 259.436000 322.036000 247.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 322.108000 259.436000 329.200000 247.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 329.812000 259.436000 333.616000 247.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 334.216000 259.436000 340.372000 247.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 340.420000 259.436000 345.232000 247.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 345.220000 259.436000 352.312000 247.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 352.324000 259.436000 358.060000 247.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.024000 259.436000 365.116000 247.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 365.128000 259.436000 372.352000 247.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 372.832000 259.436000 376.636000 247.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.236000 259.436000 383.392000 247.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 383.440000 259.436000 390.208000 247.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 390.136000 259.436000 396.292000 247.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 396.340000 259.436000 401.152000 247.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 401.236000 259.436000 408.328000 247.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 408.340000 259.436000 419.716000 247.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 420.244000 259.436000 424.048000 247.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 424.648000 259.436000 428.476000 247.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 428.452000 259.436000 436.180000 247.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 436.756000 259.436000 440.560000 247.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 441.160000 259.436000 445.972000 247.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 446.056000 259.436000 453.784000 247.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 453.760000 259.436000 460.852000 247.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 461.464000 259.436000 465.268000 247.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 465.868000 259.436000 469.696000 247.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 469.672000 259.436000 473.500000 247.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 473.572000 259.436000 480.340000 247.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 480.376000 259.436000 484.204000 247.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 484.180000 259.436000 491.908000 247.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 491.884000 259.436000 499.564000 247.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 500.080000 259.436000 503.884000 247.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 504.484000 259.436000 510.220000 247.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 510.184000 259.436000 517.408000 247.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 517.480000 259.436000 524.704000 247.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 524.680000 259.436000 536.056000 247.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 536.080000 259.436000 539.884000 247.436000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 259.436000 543.904000 247.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 245.536000 228.652000 233.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.700000 245.536000 236.428000 233.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 236.404000 245.536000 244.084000 233.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 246.100000 245.536000 249.904000 233.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 251.896000 245.536000 256.708000 233.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 256.696000 245.536000 264.424000 233.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 264.496000 245.536000 271.588000 233.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 273.496000 245.536000 277.300000 233.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.400000 245.536000 284.212000 233.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 284.296000 245.536000 291.520000 233.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 291.496000 245.536000 299.224000 233.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 299.296000 245.536000 306.388000 233.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 308.296000 245.536000 312.100000 233.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 314.092000 245.536000 317.920000 233.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 317.896000 245.536000 324.052000 233.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 326.092000 245.536000 329.896000 233.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 331.996000 245.536000 339.676000 233.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 339.700000 245.536000 345.436000 233.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 345.496000 245.536000 352.720000 233.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 352.696000 245.536000 356.416000 233.536000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 356.392000 245.536000 363.484000 233.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 363.496000 245.536000 370.216000 233.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 370.300000 245.536000 375.112000 233.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 375.100000 245.536000 382.192000 233.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 382.204000 245.536000 389.884000 233.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 391.804000 245.536000 395.608000 233.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 397.708000 245.536000 402.520000 233.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 402.508000 245.536000 410.236000 233.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 410.308000 245.536000 416.044000 233.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 415.912000 245.536000 423.136000 233.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 423.208000 245.536000 430.936000 233.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 430.912000 245.536000 438.592000 233.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 438.616000 245.536000 446.344000 233.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.312000 245.536000 452.116000 233.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.216000 245.536000 459.028000 233.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 459.016000 245.536000 466.744000 233.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 466.816000 245.536000 473.908000 233.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 475.912000 245.536000 479.716000 233.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 481.708000 245.536000 486.520000 233.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 486.508000 245.536000 493.600000 233.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 493.612000 245.536000 497.440000 233.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 497.512000 245.536000 504.604000 233.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 504.616000 245.536000 511.384000 233.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 511.312000 245.536000 515.140000 233.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 515.212000 245.536000 521.368000 233.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 521.308000 245.536000 525.136000 233.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 525.208000 245.536000 532.432000 233.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 532.408000 245.536000 540.136000 233.536000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.200000 245.536000 544.004000 233.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 231.636000 227.656000 219.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 231.636000 235.384000 219.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 235.300000 231.636000 242.392000 219.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 242.404000 231.636000 249.556000 219.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 249.604000 231.636000 256.864000 219.636000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 256.900000 231.636000 263.992000 219.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 264.004000 231.636000 269.740000 219.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 269.704000 231.636000 275.860000 219.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 275.908000 231.636000 279.712000 219.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.108000 231.636000 283.912000 219.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 284.704000 231.636000 288.508000 219.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.904000 231.636000 297.568000 219.636000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 298.000000 231.636000 301.804000 219.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 302.200000 231.636000 313.576000 219.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 313.600000 231.636000 320.752000 219.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 320.704000 231.636000 324.424000 219.636000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 324.508000 231.636000 331.732000 219.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 331.708000 231.636000 337.444000 219.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 337.804000 231.636000 341.608000 219.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 342.004000 231.636000 349.156000 219.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 349.204000 231.636000 356.884000 219.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 356.800000 231.636000 363.568000 219.636000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 363.604000 231.636000 370.756000 219.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 370.804000 231.636000 378.532000 219.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 378.508000 231.636000 383.320000 219.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 383.308000 231.636000 390.460000 219.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 390.508000 231.636000 398.188000 219.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 398.212000 231.636000 405.304000 219.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 405.712000 231.636000 409.516000 219.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 409.912000 231.636000 414.724000 219.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 414.712000 231.636000 421.936000 219.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 422.308000 231.636000 426.112000 219.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 426.604000 231.636000 431.416000 219.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 431.404000 231.636000 439.132000 219.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 439.204000 231.636000 443.032000 219.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 442.900000 231.636000 449.056000 219.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 449.500000 231.636000 453.304000 219.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 453.700000 231.636000 459.856000 219.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 459.904000 231.636000 466.672000 219.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 466.600000 231.636000 472.756000 219.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 472.804000 231.636000 477.616000 219.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 477.604000 231.636000 484.696000 219.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.708000 231.636000 496.084000 219.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 496.504000 231.636000 500.308000 219.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 500.704000 231.636000 504.532000 219.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 504.508000 231.636000 510.664000 219.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 511.108000 231.636000 514.912000 219.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 515.308000 231.636000 520.120000 219.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 520.204000 231.636000 527.932000 219.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 527.908000 231.636000 535.060000 219.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 535.012000 231.636000 539.824000 219.636000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 231.636000 543.904000 219.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 217.736000 228.652000 205.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.700000 217.736000 232.528000 205.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 232.504000 217.736000 236.332000 205.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 237.400000 217.736000 241.204000 205.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 242.296000 217.736000 253.672000 205.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 253.696000 217.736000 260.464000 205.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 261.592000 217.736000 265.396000 205.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.488000 217.736000 275.668000 205.736000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 275.692000 217.736000 285.304000 205.736000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 285.292000 217.736000 288.580000 205.736000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 288.592000 217.736000 294.748000 205.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 295.888000 217.736000 299.692000 205.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 300.784000 217.736000 306.520000 205.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 306.484000 217.736000 313.576000 205.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 313.588000 217.736000 324.964000 205.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 324.988000 217.736000 332.140000 205.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 332.188000 217.736000 336.016000 205.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 335.992000 217.736000 343.720000 205.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 344.788000 217.736000 348.592000 205.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 349.684000 217.736000 353.512000 205.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 353.488000 217.736000 361.216000 205.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 362.392000 217.736000 366.196000 205.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 367.288000 217.736000 374.512000 205.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 374.488000 217.736000 382.216000 205.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 382.288000 217.736000 389.380000 205.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 390.484000 217.736000 394.288000 205.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 395.380000 217.736000 403.060000 205.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.084000 217.736000 406.912000 205.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 406.888000 217.736000 414.040000 205.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 414.088000 217.736000 420.808000 205.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 420.784000 217.736000 427.876000 205.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 427.888000 217.736000 431.692000 205.736000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 432.784000 217.736000 436.588000 205.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 437.680000 217.736000 441.508000 205.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 441.484000 217.736000 449.212000 205.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 449.284000 217.736000 455.440000 205.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 455.380000 217.736000 460.192000 205.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 460.180000 217.736000 467.272000 205.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 467.284000 217.736000 474.436000 205.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 474.484000 217.736000 482.164000 205.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 483.280000 217.736000 487.084000 205.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 488.176000 217.736000 495.400000 205.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 495.376000 217.736000 499.816000 205.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 500.980000 217.736000 504.784000 205.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 505.876000 217.736000 513.556000 205.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 513.580000 217.736000 520.672000 205.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 520.684000 217.736000 524.512000 205.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 524.488000 217.736000 532.216000 205.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 532.192000 217.736000 539.872000 205.736000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 217.736000 543.904000 205.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 203.836000 227.656000 191.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 203.836000 234.424000 191.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 234.400000 203.836000 241.552000 191.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 241.600000 203.836000 246.412000 191.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 246.400000 203.836000 251.212000 191.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 251.200000 203.836000 258.292000 191.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 258.304000 203.836000 264.040000 191.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 264.004000 203.836000 271.096000 191.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 271.108000 203.836000 278.788000 191.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 278.812000 203.836000 282.616000 191.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 282.616000 203.836000 289.768000 191.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 289.816000 203.836000 293.644000 191.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 293.620000 203.836000 297.448000 191.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 297.424000 203.836000 301.228000 191.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 301.228000 203.836000 308.452000 191.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 308.428000 203.836000 315.196000 191.836000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 315.232000 203.836000 322.324000 191.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 322.336000 203.836000 328.072000 191.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 328.036000 203.836000 331.840000 191.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 331.840000 203.836000 336.652000 191.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 336.640000 203.836000 344.368000 191.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 344.344000 203.836000 351.436000 191.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 351.448000 203.836000 355.252000 191.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 355.252000 203.836000 362.980000 191.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 362.956000 203.836000 370.180000 191.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 370.156000 203.836000 377.884000 191.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 377.860000 203.836000 384.016000 191.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 384.064000 203.836000 391.156000 191.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 391.168000 203.836000 394.972000 191.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 108.100000 90.136000 116.164000 78.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 115.600000 90.136000 122.752000 78.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 122.800000 90.136000 130.480000 78.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 130.504000 90.136000 137.596000 78.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.608000 90.136000 141.412000 78.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 141.400000 90.136000 149.032000 78.136000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 5940.200000 0 477.900000 5940.200000 0 477.900000 6250.000000 0 134.300000 6250.000000 0 134.300000 5940.200000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -514830.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 2951.200000 0 168.100000 2951.200000 0 168.100000 2956.200000 0 76.900000 2956.200000 0 76.900000 2951.200000 0
+eoFillPath subpath 1 163.100000 2956.100000 0 168.100000 2956.100000 0 168.100000 3086.700000 0 163.100000 3086.700000 0 163.100000 2956.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 2956.200000 0 163.100000 2956.200000 0 163.100000 3091.600000 0 72.000000 3091.600000 0 72.000000 2956.200000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 3087.280000 87.320000 3077.280000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 3087.280000 93.420000 3077.280000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 3087.280000 97.510000 3077.280000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 3087.280000 101.420000 3077.280000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 3087.280000 104.170000 3077.280000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 3087.280000 110.530000 3077.280000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 3087.280000 113.270000 3077.280000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 3087.280000 116.470000 3077.280000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 3087.280000 123.480000 3077.280000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 3087.280000 129.610000 3077.280000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 3087.280000 135.090000 3077.280000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 3087.280000 140.890000 3077.280000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 3087.280000 144.820000 3077.280000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 3087.280000 150.920000 3077.280000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 3087.280000 153.670000 3077.280000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 3087.280000 156.470000 3077.280000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 2960.400000 0 168.200000 2960.400000 0 168.200000 3075.600000 0 72.000000 3075.600000 0 72.000000 2960.400000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3028.552000 79.253000 3019.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 3028.552000 86.669000 3019.552000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 3028.552000 90.215000 3019.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 3028.552000 93.077000 3019.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 3028.552000 97.406000 3019.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 3028.552000 100.853000 3019.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 3028.552000 107.324000 3019.552000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 3028.552000 112.337000 3019.552000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 3028.552000 115.271000 3019.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 3028.552000 118.655000 3019.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 3028.552000 126.512000 3019.552000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 3028.552000 130.805000 3019.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 3028.552000 135.881000 3019.552000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 3028.552000 139.355000 3019.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 3028.552000 147.284000 3019.552000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 3028.552000 150.074000 3019.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 3028.552000 155.897000 3019.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 3028.552000 158.750000 3019.552000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 3028.552000 161.853000 3019.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3018.052000 82.124000 3009.052000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 3018.052000 87.137000 3009.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 3018.052000 90.071000 3009.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 3018.052000 93.356000 3009.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 3018.052000 100.403000 3009.052000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 3018.052000 104.921000 3009.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 3018.052000 109.205000 3009.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 3018.052000 117.737000 3009.052000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 3018.052000 123.119000 3009.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 3018.052000 128.996000 3009.052000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 3018.052000 132.605000 3009.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 3018.052000 138.392000 3009.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 3018.052000 141.749000 3009.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 3018.052000 149.507000 3009.052000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 3018.052000 153.800000 3009.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 3018.052000 158.876000 3009.052000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 3018.052000 161.853000 3009.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3007.552000 81.764000 2998.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 3007.552000 87.596000 2998.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 3007.552000 93.356000 2998.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 3007.552000 102.050000 2998.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 3007.552000 113.822000 2998.552000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 3007.552000 122.651000 2998.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 3007.552000 134.117000 2998.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 3007.552000 138.401000 2998.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 3007.552000 147.149000 2998.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 3007.552000 158.921000 2998.552000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 3007.552000 161.853000 2998.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2997.052000 79.271000 2988.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 2997.052000 84.338000 2988.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 2997.052000 89.621000 2988.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 2997.052000 94.643000 2988.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 2997.052000 100.502000 2988.052000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 2997.052000 106.262000 2988.052000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 2997.052000 111.518000 2988.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 2997.052000 116.216000 2988.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 2997.052000 119.249000 2988.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 2997.052000 122.363000 2988.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 2997.052000 128.186000 2988.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 2997.052000 131.345000 2988.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 2997.052000 137.060000 2988.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 2997.052000 140.147000 2988.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 2997.052000 145.007000 2988.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 2997.052000 148.598000 2988.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 2997.052000 151.460000 2988.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 2997.052000 155.789000 2988.052000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 2997.052000 158.933000 2988.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2986.552000 80.702000 2977.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 2986.552000 83.573000 2977.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 2986.552000 89.396000 2977.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 2986.552000 95.156000 2977.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 2986.552000 100.547000 2977.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 2986.552000 109.052000 2977.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 2986.552000 111.959000 2977.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 2986.552000 117.251000 2977.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 2986.552000 121.904000 2977.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 2986.552000 126.503000 2977.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 2986.552000 129.338000 2977.552000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 2986.552000 134.936000 2977.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 2986.552000 143.441000 2977.552000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 2986.552000 148.796000 2977.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 2986.552000 154.574000 2977.552000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 2986.552000 158.876000 2977.552000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 2986.552000 161.853000 2977.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2976.052000 79.271000 2967.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 2976.052000 85.094000 2967.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 2976.052000 88.703000 2967.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 2976.052000 94.112000 2967.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 2976.052000 97.244000 2967.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 2976.052000 103.058000 2967.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 2976.052000 108.890000 2967.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 2976.052000 111.950000 2967.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 2976.052000 115.271000 2967.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 2976.052000 120.338000 2967.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 2976.052000 125.621000 2967.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 2976.052000 131.363000 2967.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 2976.052000 134.558000 2967.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 2976.052000 140.048000 2967.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 2976.052000 145.430000 2967.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 2976.052000 150.551000 2967.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 2976.052000 155.960000 2967.052000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 2976.052000 158.933000 2967.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2965.552000 80.009000 2956.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 2965.552000 85.364000 2956.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 2965.552000 88.271000 2956.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 2965.552000 91.169000 2956.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 2965.552000 97.955000 2956.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 2965.552000 107.765000 2956.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 2965.552000 110.672000 2956.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 2965.552000 115.964000 2956.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 2965.552000 120.617000 2956.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 2965.552000 125.216000 2956.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 2965.552000 128.051000 2956.552000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 2965.552000 134.954000 2956.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 2965.552000 146.285000 2956.552000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 2965.552000 151.667000 2956.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 2965.552000 155.906000 2956.552000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 2965.552000 159.033000 2956.552000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 2956.100000 0 72.100000 2956.100000 0 72.100000 3091.600000 0 72.000000 3091.600000 0 72.000000 2956.100000 0
+eoFillPath subpath 1 163.100000 2956.100000 0 163.200000 2956.100000 0 163.200000 3091.600000 0 163.100000 3091.600000 0 163.100000 2956.100000 0
+eoFillPath subpath 1 72.000000 3091.500000 0 163.200000 3091.500000 0 163.200000 3091.600000 0 72.000000 3091.600000 0 72.000000 3091.500000 0
+eoFillPath subpath 1 72.000000 2956.100000 0 163.200000 2956.100000 0 163.200000 2956.200000 0 72.000000 2956.200000 0 72.000000 2956.100000 0
+saveState
+eoClipPath subpath 1 96.900000 3031.400000 0 138.300000 3031.400000 0 138.300000 3075.600000 0 96.900000 3075.600000 0 96.900000 3031.400000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -223950.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 2676.600000 0 165.500000 2676.600000 0 165.500000 2681.600000 0 76.900000 2681.600000 0 76.900000 2676.600000 0
+eoFillPath subpath 1 160.500000 2681.500000 0 165.500000 2681.500000 0 165.500000 2837.800000 0 160.500000 2837.800000 0 160.500000 2681.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 2681.600000 0 121.400000 2681.600000 0 121.400000 2842.700000 0 72.000000 2842.700000 0 72.000000 2681.600000 0
+saveState
+eoClipPath subpath 1 72.000000 2681.500000 0 160.500000 2681.500000 0 160.500000 2842.600000 0 72.000000 2842.600000 0 72.000000 2681.500000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -187250.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 2838.380000 89.280000 2828.380000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 2838.380000 95.630000 2828.380000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 2838.380000 99.520000 2828.380000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 2838.380000 102.270000 2828.380000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 2838.380000 108.450000 2828.380000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 2838.380000 112.610000 2828.380000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 2838.380000 118.510000 2828.380000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 2838.380000 121.670000 2828.380000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 2838.380000 124.470000 2828.380000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 2838.380000 130.830000 2828.380000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 2838.380000 133.970000 2828.380000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 2838.380000 137.920000 2828.380000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 2838.380000 144.230000 2828.380000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 2838.380000 150.350000 2828.380000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 2838.380000 153.570000 2828.380000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 2826.680000 95.000000 2816.680000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 2826.680000 97.770000 2816.680000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 2826.680000 103.000000 2816.680000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 2826.680000 109.330000 2816.680000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 2826.680000 117.470000 2816.680000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 2826.680000 123.620000 2816.680000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 2826.680000 128.800000 2816.680000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 2826.680000 135.130000 2816.680000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 2826.680000 141.250000 2816.680000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 2826.680000 145.410000 2816.680000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2811.852000 82.961000 2802.852000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 2811.852000 87.614000 2802.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 2811.852000 93.356000 2802.852000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 2811.852000 98.612000 2802.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 2811.852000 103.733000 2802.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 2811.852000 106.568000 2802.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 2811.852000 111.959000 2802.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 2811.852000 114.866000 2802.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 2811.852000 117.665000 2802.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 2811.852000 122.768000 2802.852000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 2811.852000 125.747000 2802.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 2811.852000 131.651000 2802.852000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 2811.852000 136.907000 2802.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 2811.852000 142.307000 2802.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 2811.852000 148.049000 2802.852000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 2811.852000 150.956000 2802.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 2811.852000 156.302000 2802.852000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 2811.852000 159.253000 2802.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2801.352000 84.095000 2792.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 2801.352000 89.900000 2792.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 2801.352000 95.318000 2792.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 2801.352000 100.349000 2792.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 2801.352000 110.789000 2792.352000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 2801.352000 111.464000 2792.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 2801.352000 114.362000 2792.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 2801.352000 119.348000 2792.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 2801.352000 126.962000 2792.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 2801.352000 132.047000 2792.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 2801.352000 139.958000 2792.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 2801.352000 142.865000 2792.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 2801.352000 147.410000 2792.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 2801.352000 153.287000 2792.352000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 2801.352000 156.333000 2792.352000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2790.852000 84.095000 2781.852000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 2790.852000 89.468000 2781.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 2790.852000 94.121000 2781.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 2790.852000 99.899000 2781.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 2790.852000 105.218000 2781.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 2790.852000 109.502000 2781.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 2790.852000 115.649000 2781.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 2790.852000 122.327000 2781.852000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 2790.852000 127.718000 2781.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 2790.852000 132.002000 2781.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 2790.852000 138.149000 2781.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 2790.852000 145.205000 2781.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 2790.852000 150.992000 2781.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 2790.852000 156.311000 2781.852000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 2790.852000 159.253000 2781.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2780.352000 82.394000 2771.352000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 2780.352000 86.705000 2771.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 2780.352000 91.322000 2771.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 2780.352000 94.913000 2771.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 2780.352000 98.054000 2771.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 2780.352000 102.014000 2771.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 2780.352000 104.876000 2771.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 2780.352000 113.435000 2771.352000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 2780.352000 118.718000 2771.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 2780.352000 121.949000 2771.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 2780.352000 125.063000 2771.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 2780.352000 130.886000 2771.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 2780.352000 134.045000 2771.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 2780.352000 138.005000 2771.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 2780.352000 143.792000 2771.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 2780.352000 149.111000 2771.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 2780.352000 151.964000 2771.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 2780.352000 156.293000 2771.352000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 2780.352000 159.153000 2771.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2769.852000 79.271000 2760.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 2769.852000 82.169000 2760.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 2769.852000 85.526000 2760.852000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 2769.852000 90.818000 2760.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 2769.852000 94.454000 2760.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 2769.852000 99.008000 2760.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 2769.852000 104.318000 2760.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 2769.852000 110.096000 2760.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 2769.852000 115.856000 2760.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 2769.852000 119.546000 2760.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 2769.852000 124.001000 2760.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 2769.852000 129.509000 2760.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 2769.852000 133.145000 2760.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 2769.852000 139.751000 2760.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 2769.852000 145.205000 2760.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 2769.852000 148.841000 2760.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 2769.852000 152.657000 2760.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 2769.852000 156.293000 2760.852000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 2769.852000 159.253000 2760.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2759.352000 84.095000 2750.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 2759.352000 88.406000 2750.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 2759.352000 93.824000 2750.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 2759.352000 99.602000 2750.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 2759.352000 105.362000 2750.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 2759.352000 108.422000 2750.352000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 2759.352000 116.747000 2750.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 2759.352000 129.275000 2750.352000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 2759.352000 135.089000 2750.352000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 2759.352000 138.698000 2750.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 2759.352000 141.560000 2750.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 2759.352000 146.906000 2750.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 2759.352000 151.190000 2750.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 2759.352000 156.266000 2750.352000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 2759.352000 159.253000 2750.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2748.852000 82.196000 2739.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 2748.852000 87.560000 2739.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 2748.852000 92.213000 2739.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 2748.852000 96.551000 2739.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 2748.852000 101.708000 2739.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 2748.852000 107.216000 2739.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 2748.852000 111.653000 2739.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 2748.852000 118.961000 2739.852000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 2748.852000 124.316000 2739.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 2748.852000 128.654000 2739.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 2748.852000 133.172000 2739.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 2748.852000 138.995000 2739.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 2748.852000 143.612000 2739.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 2748.852000 148.913000 2739.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 2748.852000 153.197000 2739.852000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 2748.852000 156.333000 2739.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2738.352000 80.009000 2729.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 2738.352000 85.319000 2729.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 2738.352000 91.061000 2729.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 2738.352000 100.052000 2729.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 2738.352000 113.993000 2729.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 2738.352000 116.873000 2729.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 2738.352000 120.410000 2729.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 2738.352000 126.296000 2729.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 2738.352000 135.350000 2729.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 2738.352000 145.106000 2729.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 2738.352000 150.893000 2729.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 2738.352000 156.212000 2729.352000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 2738.352000 159.253000 2729.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2727.852000 82.196000 2718.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 2727.852000 87.560000 2718.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 2727.852000 93.392000 2718.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 2727.852000 99.152000 2718.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 2727.852000 101.960000 2718.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 2727.852000 107.306000 2718.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 2727.852000 111.905000 2718.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 2727.852000 115.640000 2718.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 2727.852000 122.444000 2718.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 2727.852000 127.898000 2718.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 2727.852000 135.575000 2718.852000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 2727.852000 141.380000 2718.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 2727.852000 145.241000 2718.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 2727.852000 150.803000 2718.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 2727.852000 156.302000 2718.852000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 2727.852000 159.253000 2718.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2717.352000 80.009000 2708.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 2717.352000 85.796000 2708.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 2717.352000 91.115000 2708.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 2717.352000 95.399000 2708.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 2717.352000 100.718000 2708.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 2717.352000 107.054000 2708.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 2717.352000 118.097000 2708.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 2717.352000 123.524000 2708.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 2717.352000 129.401000 2708.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 2717.352000 131.768000 2708.352000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 2717.352000 135.413000 2708.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 2717.352000 141.659000 2708.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 2717.352000 150.965000 2708.352000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 2717.352000 156.320000 2708.352000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 2717.352000 159.253000 2708.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2706.852000 81.017000 2697.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 2706.852000 84.608000 2697.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 2706.852000 89.963000 2697.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 2706.852000 92.870000 2697.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 2706.852000 98.693000 2697.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 2706.852000 103.310000 2697.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 2706.852000 107.243000 2697.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 2706.852000 116.081000 2697.852000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 2706.852000 121.886000 2697.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 2706.852000 127.205000 2697.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 2706.852000 132.983000 2697.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 2706.852000 136.943000 2697.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 2706.852000 143.846000 2697.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 2706.852000 148.184000 2697.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 2706.852000 153.260000 2697.852000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 2706.852000 156.433000 2697.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2696.352000 79.271000 2687.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 2696.352000 85.094000 2687.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 2696.352000 90.854000 2687.352000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 2696.352000 93.653000 2687.352000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 2681.500000 0 72.100000 2681.500000 0 72.100000 2842.700000 0 72.000000 2842.700000 0 72.000000 2681.500000 0
+eoFillPath subpath 1 160.500000 2681.500000 0 160.600000 2681.500000 0 160.600000 2842.700000 0 160.500000 2842.700000 0 160.500000 2681.500000 0
+eoFillPath subpath 1 72.000000 2842.600000 0 160.600000 2842.600000 0 160.600000 2842.700000 0 72.000000 2842.700000 0 72.000000 2842.600000 0
+eoFillPath subpath 1 72.000000 2681.500000 0 160.600000 2681.500000 0 160.600000 2681.600000 0 72.000000 2681.600000 0 72.000000 2681.500000 0
+saveState
+eoClipPath subpath 1 108.000000 2194.100000 0 178.900000 2194.100000 0 178.900000 2250.800000 0 108.000000 2250.800000 0 108.000000 2194.100000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -140220.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -1864.300000 0 165.500000 -1864.300000 0 165.500000 -1859.300000 0 76.900000 -1859.300000 0 76.900000 -1864.300000 0
+eoFillPath subpath 1 160.500000 -1859.400000 0 165.500000 -1859.400000 0 165.500000 -1750.600000 0 160.500000 -1750.600000 0 160.500000 -1859.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -1859.300000 0 160.500000 -1859.300000 0 160.500000 -1745.700000 0 72.000000 -1745.700000 0 72.000000 -1859.300000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1750.048000 83.771000 -1759.048000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 -1750.048000 89.594000 -1759.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 -1750.048000 92.465000 -1759.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 -1750.048000 97.568000 -1759.048000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 -1750.048000 100.943000 -1759.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 -1750.048000 106.955000 -1759.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 -1750.048000 110.447000 -1759.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 -1750.048000 114.425000 -1759.048000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 -1750.048000 119.717000 -1759.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 -1750.048000 127.493000 -1759.048000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 -1750.048000 130.949000 -1759.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 -1750.048000 136.574000 -1759.048000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 -1750.048000 141.920000 -1759.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 -1750.048000 147.365000 -1759.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 -1750.048000 151.703000 -1759.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 -1750.048000 156.320000 -1759.048000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -1750.048000 159.153000 -1759.048000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1760.548000 81.764000 -1769.548000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -1760.548000 85.130000 -1769.548000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 -1760.548000 88.712000 -1769.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 -1760.548000 94.022000 -1769.548000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 -1760.548000 98.306000 -1769.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -1760.548000 102.455000 -1769.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 -1760.548000 106.676000 -1769.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 -1760.548000 110.312000 -1769.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 -1760.548000 114.920000 -1769.548000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 -1760.548000 119.060000 -1769.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 -1760.548000 125.450000 -1769.548000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 -1760.548000 130.832000 -1769.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 -1760.548000 139.445000 -1769.548000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 -1760.548000 145.169000 -1769.548000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 -1760.548000 148.076000 -1769.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 -1760.548000 153.323000 -1769.548000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -1760.548000 156.433000 -1769.548000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1771.048000 80.009000 -1780.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -1771.048000 82.871000 -1780.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 -1771.048000 88.316000 -1780.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 -1771.048000 94.094000 -1780.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 -1771.048000 96.947000 -1780.048000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 -1771.048000 104.948000 -1780.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 -1771.048000 113.705000 -1780.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 -1771.048000 119.492000 -1780.048000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 -1771.048000 124.811000 -1780.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 -1771.048000 132.848000 -1780.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 -1771.048000 141.605000 -1780.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 -1771.048000 144.467000 -1780.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 -1771.048000 148.103000 -1780.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 -1771.048000 150.965000 -1780.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 -1771.048000 156.311000 -1780.048000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -1771.048000 159.253000 -1780.048000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1781.548000 80.999000 -1790.548000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 -1781.548000 90.539000 -1790.548000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 -1781.548000 95.318000 -1790.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 -1781.548000 99.602000 -1790.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -1781.548000 102.473000 -1790.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 -1781.548000 108.260000 -1790.548000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 -1781.548000 110.762000 -1790.548000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 -1781.548000 115.316000 -1790.548000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 -1781.548000 122.156000 -1790.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 -1781.548000 132.299000 -1790.548000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 -1781.548000 136.970000 -1790.548000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 -1781.548000 139.877000 -1790.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 -1781.548000 142.775000 -1790.548000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 -1781.548000 148.022000 -1790.548000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 -1781.548000 152.720000 -1790.548000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 -1781.548000 156.311000 -1790.548000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -1781.548000 159.253000 -1790.548000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1792.048000 83.006000 -1801.048000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 -1792.048000 88.793000 -1801.048000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 -1792.048000 91.664000 -1801.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 -1792.048000 94.562000 -1801.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 -1792.048000 100.349000 -1801.048000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 -1792.048000 103.157000 -1801.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 -1792.048000 108.980000 -1801.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 -1792.048000 114.740000 -1801.048000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 -1792.048000 119.375000 -1801.048000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 -1792.048000 128.033000 -1801.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 -1792.048000 141.479000 -1801.048000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 -1792.048000 146.807000 -1801.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -1792.048000 152.684000 -1801.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 -1792.048000 156.293000 -1801.048000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -1792.048000 159.253000 -1801.048000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1802.548000 79.730000 -1811.548000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 -1802.548000 84.005000 -1811.548000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 -1802.548000 89.423000 -1811.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 -1802.548000 98.036000 -1811.548000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 -1802.548000 121.157000 -1811.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 -1802.548000 145.115000 -1811.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 -1802.548000 151.001000 -1811.548000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 -1802.548000 156.320000 -1811.548000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -1802.548000 159.253000 -1811.548000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1813.048000 83.285000 -1822.048000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 -1813.048000 89.099000 -1822.048000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 -1813.048000 93.401000 -1822.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 -1813.048000 98.477000 -1822.048000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 -1813.048000 103.121000 -1822.048000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 -1813.048000 105.974000 -1822.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 -1813.048000 111.320000 -1822.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 -1813.048000 115.604000 -1822.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 -1813.048000 123.857000 -1822.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 -1813.048000 136.007000 -1822.048000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 -1813.048000 141.794000 -1822.048000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 -1813.048000 144.665000 -1822.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 -1813.048000 147.464000 -1822.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 -1813.048000 153.251000 -1822.048000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -1813.048000 156.433000 -1822.048000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1823.548000 79.271000 -1832.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -1823.548000 85.094000 -1832.548000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -1823.548000 90.854000 -1832.548000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 -1823.548000 96.146000 -1832.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 -1823.548000 102.302000 -1832.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 -1823.548000 107.711000 -1832.548000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 -1823.548000 113.048000 -1832.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 -1823.548000 119.204000 -1832.548000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 -1823.548000 124.991000 -1832.548000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 -1823.548000 130.310000 -1832.548000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 -1823.548000 135.647000 -1832.548000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 -1823.548000 144.755000 -1832.548000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 -1823.548000 153.323000 -1832.548000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -1823.548000 156.333000 -1832.548000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1834.048000 82.160000 -1843.048000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 -1834.048000 85.067000 -1843.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 -1834.048000 89.297000 -1843.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 -1834.048000 94.616000 -1843.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 -1834.048000 98.747000 -1843.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 -1834.048000 106.055000 -1843.048000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 -1834.048000 109.700000 -1843.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 -1834.048000 115.055000 -1843.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 -1834.048000 118.601000 -1843.048000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 -1834.048000 124.010000 -1843.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 -1834.048000 128.042000 -1843.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 -1834.048000 135.998000 -1843.048000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 -1834.048000 141.785000 -1843.048000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 -1834.048000 144.656000 -1843.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 -1834.048000 147.554000 -1843.048000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 -1834.048000 153.341000 -1843.048000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -1834.048000 156.433000 -1843.048000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1844.548000 79.271000 -1853.548000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -1844.548000 85.094000 -1853.548000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -1844.548000 90.854000 -1853.548000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 -1844.548000 93.743000 -1853.548000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -1859.400000 0 72.100000 -1859.400000 0 72.100000 -1745.700000 0 72.000000 -1745.700000 0 72.000000 -1859.400000 0
+eoFillPath subpath 1 160.500000 -1859.400000 0 160.600000 -1859.400000 0 160.600000 -1745.700000 0 160.500000 -1745.700000 0 160.500000 -1859.400000 0
+eoFillPath subpath 1 72.000000 -1745.800000 0 160.600000 -1745.800000 0 160.600000 -1745.700000 0 72.000000 -1745.700000 0 72.000000 -1745.800000 0
+eoFillPath subpath 1 72.000000 -1859.400000 0 160.600000 -1859.400000 0 160.600000 -1859.300000 0 72.000000 -1859.300000 0 72.000000 -1859.400000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 4330.200000 0 169.600000 4330.200000 0 169.600000 4335.200000 0 76.900000 4335.200000 0 76.900000 4330.200000 0
+eoFillPath subpath 1 164.600000 4335.100000 0 169.600000 4335.100000 0 169.600000 4450.700000 0 164.600000 4450.700000 0 164.600000 4335.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 4335.200000 0 121.400000 4335.200000 0 121.400000 4455.600000 0 72.000000 4455.600000 0 72.000000 4335.200000 0
+saveState
+eoClipPath subpath 1 72.000000 4335.100000 0 164.600000 4335.100000 0 164.600000 4455.500000 0 72.000000 4455.500000 0 72.000000 4335.100000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -348490.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 4405.100000 0 93.700000 4405.100000 0 93.700000 4424.300000 0 72.000000 4424.300000 0 72.000000 4405.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 4405.100000 0 169.600000 4405.100000 0 169.600000 4424.300000 0 93.700000 4424.300000 0 93.700000 4405.100000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 4388.400000 0 93.700000 4388.400000 0 93.700000 4405.100000 0 72.000000 4405.100000 0 72.000000 4388.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 4388.400000 0 169.600000 4388.400000 0 169.600000 4405.100000 0 93.700000 4405.100000 0 93.700000 4388.400000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 4369.200000 0 93.700000 4369.200000 0 93.700000 4388.400000 0 72.000000 4388.400000 0 72.000000 4369.200000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 4369.200000 0 169.600000 4369.200000 0 169.600000 4388.400000 0 93.700000 4388.400000 0 93.700000 4369.200000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 4350.000000 0 93.700000 4350.000000 0 93.700000 4369.200000 0 72.000000 4369.200000 0 72.000000 4350.000000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 4350.000000 0 169.600000 4350.000000 0 169.600000 4369.200000 0 93.700000 4369.200000 0 93.700000 4350.000000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4451.252000 82.898000 4442.252000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 4451.252000 87.200000 4442.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 4451.252000 90.809000 4442.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 4451.252000 93.671000 4442.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 4451.252000 98.315000 4442.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 4451.252000 101.906000 4442.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 4451.252000 106.514000 4442.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 4451.252000 109.754000 4442.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 4451.252000 112.868000 4442.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 4451.252000 118.691000 4442.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 4451.252000 121.850000 4442.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 4451.252000 125.702000 4442.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 4451.252000 131.588000 4442.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 4451.252000 136.907000 4442.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 4451.252000 140.039000 4442.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 4451.252000 146.078000 4442.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 4451.252000 151.442000 4442.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 4451.252000 154.349000 4442.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 4451.252000 157.148000 4442.252000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 4451.252000 160.433000 4442.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4440.752000 84.095000 4431.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 4440.752000 89.468000 4431.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 4440.752000 94.580000 4431.752000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 4440.752000 97.631000 4431.752000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 4420.352000 104.443000 4411.352000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 4420.352000 109.060000 4411.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 4420.352000 113.398000 4411.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 4420.352000 119.194000 4411.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 4420.352000 124.612000 4411.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 4420.352000 127.465000 4411.352000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 4403.652000 101.176000 4394.652000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 4403.652000 104.074000 4394.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 4403.652000 109.420000 4394.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 4403.652000 114.442000 4394.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 4403.652000 120.202000 4394.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 4403.652000 123.811000 4394.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 4403.652000 129.121000 4394.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 4403.652000 134.899000 4394.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 4403.652000 139.516000 4394.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 4403.652000 143.107000 4394.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 4403.652000 148.417000 4394.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 4403.652000 151.270000 4394.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 4403.652000 157.093000 4394.652000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 4386.952000 103.048000 4377.952000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 4386.952000 108.421000 4377.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 4386.952000 113.443000 4377.952000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 4386.952000 118.852000 4377.952000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 4386.952000 124.702000 4377.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 4386.952000 130.021000 4377.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 4386.952000 135.079000 4377.952000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 4367.752000 104.407000 4358.752000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 4367.752000 109.816000 4358.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 4367.752000 115.594000 4358.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 4367.752000 121.354000 4358.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 4367.752000 125.692000 4358.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 4367.752000 128.563000 4358.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 4367.752000 133.954000 4358.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 4367.752000 139.786000 4358.752000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 4335.100000 0 72.100000 4335.100000 0 72.100000 4455.600000 0 72.000000 4455.600000 0 72.000000 4335.100000 0
+eoFillPath subpath 1 164.600000 4335.100000 0 164.700000 4335.100000 0 164.700000 4455.600000 0 164.600000 4455.600000 0 164.600000 4335.100000 0
+eoFillPath subpath 1 72.000000 4455.500000 0 164.700000 4455.500000 0 164.700000 4455.600000 0 72.000000 4455.600000 0 72.000000 4455.500000 0
+eoFillPath subpath 1 72.000000 4335.100000 0 164.700000 4335.100000 0 164.700000 4335.200000 0 72.000000 4335.200000 0 72.000000 4335.100000 0
+eoFillPath subpath 1 91.300000 4350.000000 0 93.700000 4350.000000 0 93.700000 4424.300000 0 91.300000 4424.300000 0 91.300000 4350.000000 0
+eoFillPath subpath 1 72.000000 4369.200000 0 169.600000 4369.200000 0 169.600000 4371.600000 0 72.000000 4371.600000 0 72.000000 4369.200000 0
+eoFillPath subpath 1 72.000000 4421.900000 0 169.600000 4421.900000 0 169.600000 4424.300000 0 72.000000 4424.300000 0 72.000000 4421.900000 0
+eoFillPath subpath 1 72.000000 4350.000000 0 169.600000 4350.000000 0 169.600000 4352.400000 0 72.000000 4352.400000 0 72.000000 4350.000000 0
+saveState
+eoClipPath subpath 1 108.000000 -3516.000000 0 150.800000 -3516.000000 0 150.800000 -3471.800000 0 108.000000 -3471.800000 0 108.000000 -3516.000000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 430800.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 -4366.000000 0 499.600000 -4366.000000 0 499.600000 -4360.900000 0 186.800000 -4360.900000 0 186.800000 -4366.000000 0
+eoFillPath subpath 1 494.500000 -4361.000000 0 499.600000 -4361.000000 0 499.600000 -4172.600000 0 494.500000 -4172.600000 0 494.500000 -4361.000000 0
+saveState
+eoClipPath subpath 1 181.800000 -4360.900000 0 494.500000 -4360.900000 0 494.500000 -4167.600000 0 181.800000 -4167.600000 0 181.800000 -4360.900000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 -4167.500000 0 494.500000 -4167.500000 0 494.500000 -4167.500000 0 181.700000 -4167.500000 0
+eoFillPath subpath 1 181.700000 -4167.500000 0 494.500000 -4167.500000 0 494.500000 -4168.300000 0 181.700000 -4168.300000 0 181.700000 -4167.500000 0
+eoFillPath subpath 1 181.700000 -4168.300000 0 494.500000 -4168.300000 0 494.500000 -4169.000000 0 181.700000 -4169.000000 0 181.700000 -4168.300000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 -4169.000000 0 494.500000 -4169.000000 0 494.500000 -4169.800000 0 181.700000 -4169.800000 0 181.700000 -4169.000000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 -4169.800000 0 494.500000 -4169.800000 0 494.500000 -4170.600000 0 181.700000 -4170.600000 0 181.700000 -4169.800000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 -4170.600000 0 494.500000 -4170.600000 0 494.500000 -4171.300000 0 181.700000 -4171.300000 0 181.700000 -4170.600000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 -4171.300000 0 494.500000 -4171.300000 0 494.500000 -4172.100000 0 181.700000 -4172.100000 0 181.700000 -4171.300000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 -4172.100000 0 494.500000 -4172.100000 0 494.500000 -4172.800000 0 181.700000 -4172.800000 0 181.700000 -4172.100000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 -4172.800000 0 494.500000 -4172.800000 0 494.500000 -4173.600000 0 181.700000 -4173.600000 0 181.700000 -4172.800000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 -4173.600000 0 494.500000 -4173.600000 0 494.500000 -4174.300000 0 181.700000 -4174.300000 0 181.700000 -4173.600000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 -4174.300000 0 494.500000 -4174.300000 0 494.500000 -4175.100000 0 181.700000 -4175.100000 0 181.700000 -4174.300000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 -4175.100000 0 494.500000 -4175.100000 0 494.500000 -4175.900000 0 181.700000 -4175.900000 0 181.700000 -4175.100000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 -4175.900000 0 494.500000 -4175.900000 0 494.500000 -4176.600000 0 181.700000 -4176.600000 0 181.700000 -4175.900000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 -4176.600000 0 494.500000 -4176.600000 0 494.500000 -4177.400000 0 181.700000 -4177.400000 0 181.700000 -4176.600000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 -4177.400000 0 494.500000 -4177.400000 0 494.500000 -4178.100000 0 181.700000 -4178.100000 0 181.700000 -4177.400000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 -4178.100000 0 494.500000 -4178.100000 0 494.500000 -4178.900000 0 181.700000 -4178.900000 0 181.700000 -4178.100000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 -4178.900000 0 494.500000 -4178.900000 0 494.500000 -4179.700000 0 181.700000 -4179.700000 0 181.700000 -4178.900000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 -4179.700000 0 494.500000 -4179.700000 0 494.500000 -4180.400000 0 181.700000 -4180.400000 0 181.700000 -4179.700000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 -4180.400000 0 494.500000 -4180.400000 0 494.500000 -4181.200000 0 181.700000 -4181.200000 0 181.700000 -4180.400000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 -4181.200000 0 494.500000 -4181.200000 0 494.500000 -4181.900000 0 181.700000 -4181.900000 0 181.700000 -4181.200000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 -4181.900000 0 494.500000 -4181.900000 0 494.500000 -4182.700000 0 181.700000 -4182.700000 0 181.700000 -4181.900000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 -4182.700000 0 494.500000 -4182.700000 0 494.500000 -4183.500000 0 181.700000 -4183.500000 0 181.700000 -4182.700000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 -4183.500000 0 494.500000 -4183.500000 0 494.500000 -4184.200000 0 181.700000 -4184.200000 0 181.700000 -4183.500000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 -4184.200000 0 494.500000 -4184.200000 0 494.500000 -4185.000000 0 181.700000 -4185.000000 0 181.700000 -4184.200000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 -4185.000000 0 494.500000 -4185.000000 0 494.500000 -4185.700000 0 181.700000 -4185.700000 0 181.700000 -4185.000000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 -4185.700000 0 494.500000 -4185.700000 0 494.500000 -4186.500000 0 181.700000 -4186.500000 0 181.700000 -4185.700000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 -4186.500000 0 494.500000 -4186.500000 0 494.500000 -4187.200000 0 181.700000 -4187.200000 0 181.700000 -4186.500000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 -4187.200000 0 494.500000 -4187.200000 0 494.500000 -4188.000000 0 181.700000 -4188.000000 0 181.700000 -4187.200000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 -4188.000000 0 494.500000 -4188.000000 0 494.500000 -4188.800000 0 181.700000 -4188.800000 0 181.700000 -4188.000000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 -4188.800000 0 494.500000 -4188.800000 0 494.500000 -4189.500000 0 181.700000 -4189.500000 0 181.700000 -4188.800000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 -4189.500000 0 494.500000 -4189.500000 0 494.500000 -4190.300000 0 181.700000 -4190.300000 0 181.700000 -4189.500000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 -4190.300000 0 494.500000 -4190.300000 0 494.500000 -4191.000000 0 181.700000 -4191.000000 0 181.700000 -4190.300000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 -4191.000000 0 494.500000 -4191.000000 0 494.500000 -4191.800000 0 181.700000 -4191.800000 0 181.700000 -4191.000000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 -4191.800000 0 494.500000 -4191.800000 0 494.500000 -4192.600000 0 181.700000 -4192.600000 0 181.700000 -4191.800000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 -4192.600000 0 494.500000 -4192.600000 0 494.500000 -4193.300000 0 181.700000 -4193.300000 0 181.700000 -4192.600000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 -4193.300000 0 494.500000 -4193.300000 0 494.500000 -4194.100000 0 181.700000 -4194.100000 0 181.700000 -4193.300000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 -4194.100000 0 494.500000 -4194.100000 0 494.500000 -4194.800000 0 181.700000 -4194.800000 0 181.700000 -4194.100000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 -4194.800000 0 494.500000 -4194.800000 0 494.500000 -4195.600000 0 181.700000 -4195.600000 0 181.700000 -4194.800000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 -4195.600000 0 494.500000 -4195.600000 0 494.500000 -4196.400000 0 181.700000 -4196.400000 0 181.700000 -4195.600000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 -4196.400000 0 494.500000 -4196.400000 0 494.500000 -4197.100000 0 181.700000 -4197.100000 0 181.700000 -4196.400000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 -4197.100000 0 494.500000 -4197.100000 0 494.500000 -4197.900000 0 181.700000 -4197.900000 0 181.700000 -4197.100000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 -4197.900000 0 494.500000 -4197.900000 0 494.500000 -4198.600000 0 181.700000 -4198.600000 0 181.700000 -4197.900000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 -4198.600000 0 494.500000 -4198.600000 0 494.500000 -4199.400000 0 181.700000 -4199.400000 0 181.700000 -4198.600000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 -4199.400000 0 494.500000 -4199.400000 0 494.500000 -4200.100000 0 181.700000 -4200.100000 0 181.700000 -4199.400000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 -4200.100000 0 494.500000 -4200.100000 0 494.500000 -4200.900000 0 181.700000 -4200.900000 0 181.700000 -4200.100000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 -4200.900000 0 494.500000 -4200.900000 0 494.500000 -4201.700000 0 181.700000 -4201.700000 0 181.700000 -4200.900000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 -4201.700000 0 494.500000 -4201.700000 0 494.500000 -4202.400000 0 181.700000 -4202.400000 0 181.700000 -4201.700000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 -4202.400000 0 494.500000 -4202.400000 0 494.500000 -4203.200000 0 181.700000 -4203.200000 0 181.700000 -4202.400000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 -4203.200000 0 494.500000 -4203.200000 0 494.500000 -4203.900000 0 181.700000 -4203.900000 0 181.700000 -4203.200000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 -4203.900000 0 494.500000 -4203.900000 0 494.500000 -4204.700000 0 181.700000 -4204.700000 0 181.700000 -4203.900000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 -4204.700000 0 494.500000 -4204.700000 0 494.500000 -4205.500000 0 181.700000 -4205.500000 0 181.700000 -4204.700000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 -4205.500000 0 494.500000 -4205.500000 0 494.500000 -4206.200000 0 181.700000 -4206.200000 0 181.700000 -4205.500000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 -4206.200000 0 494.500000 -4206.200000 0 494.500000 -4207.000000 0 181.700000 -4207.000000 0 181.700000 -4206.200000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 -4207.000000 0 494.500000 -4207.000000 0 494.500000 -4207.700000 0 181.700000 -4207.700000 0 181.700000 -4207.000000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 -4207.700000 0 494.500000 -4207.700000 0 494.500000 -4208.500000 0 181.700000 -4208.500000 0 181.700000 -4207.700000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 -4208.500000 0 494.500000 -4208.500000 0 494.500000 -4209.300000 0 181.700000 -4209.300000 0 181.700000 -4208.500000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 -4209.300000 0 494.500000 -4209.300000 0 494.500000 -4210.000000 0 181.700000 -4210.000000 0 181.700000 -4209.300000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 -4210.000000 0 494.500000 -4210.000000 0 494.500000 -4210.800000 0 181.700000 -4210.800000 0 181.700000 -4210.000000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 -4210.800000 0 494.500000 -4210.800000 0 494.500000 -4211.500000 0 181.700000 -4211.500000 0 181.700000 -4210.800000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 -4211.500000 0 494.500000 -4211.500000 0 494.500000 -4212.300000 0 181.700000 -4212.300000 0 181.700000 -4211.500000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 -4212.300000 0 494.500000 -4212.300000 0 494.500000 -4213.000000 0 181.700000 -4213.000000 0 181.700000 -4212.300000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 -4213.000000 0 494.500000 -4213.000000 0 494.500000 -4213.800000 0 181.700000 -4213.800000 0 181.700000 -4213.000000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 -4213.800000 0 494.500000 -4213.800000 0 494.500000 -4214.600000 0 181.700000 -4214.600000 0 181.700000 -4213.800000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 -4214.600000 0 494.500000 -4214.600000 0 494.500000 -4215.300000 0 181.700000 -4215.300000 0 181.700000 -4214.600000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 -4215.300000 0 494.500000 -4215.300000 0 494.500000 -4216.100000 0 181.700000 -4216.100000 0 181.700000 -4215.300000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 -4216.100000 0 494.500000 -4216.100000 0 494.500000 -4216.800000 0 181.700000 -4216.800000 0 181.700000 -4216.100000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 -4216.800000 0 494.500000 -4216.800000 0 494.500000 -4217.600000 0 181.700000 -4217.600000 0 181.700000 -4216.800000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 -4217.600000 0 494.500000 -4217.600000 0 494.500000 -4218.300000 0 181.700000 -4218.300000 0 181.700000 -4217.600000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 -4218.300000 0 494.500000 -4218.300000 0 494.500000 -4219.100000 0 181.700000 -4219.100000 0 181.700000 -4218.300000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 -4219.100000 0 494.500000 -4219.100000 0 494.500000 -4219.900000 0 181.700000 -4219.900000 0 181.700000 -4219.100000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 -4219.900000 0 494.500000 -4219.900000 0 494.500000 -4220.600000 0 181.700000 -4220.600000 0 181.700000 -4219.900000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 -4220.600000 0 494.500000 -4220.600000 0 494.500000 -4221.400000 0 181.700000 -4221.400000 0 181.700000 -4220.600000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 -4221.400000 0 494.500000 -4221.400000 0 494.500000 -4222.100000 0 181.700000 -4222.100000 0 181.700000 -4221.400000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 -4222.100000 0 494.500000 -4222.100000 0 494.500000 -4222.900000 0 181.700000 -4222.900000 0 181.700000 -4222.100000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 -4222.900000 0 494.500000 -4222.900000 0 494.500000 -4223.700000 0 181.700000 -4223.700000 0 181.700000 -4222.900000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 -4223.700000 0 494.500000 -4223.700000 0 494.500000 -4224.400000 0 181.700000 -4224.400000 0 181.700000 -4223.700000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 -4224.400000 0 494.500000 -4224.400000 0 494.500000 -4225.200000 0 181.700000 -4225.200000 0 181.700000 -4224.400000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 -4225.200000 0 494.500000 -4225.200000 0 494.500000 -4225.900000 0 181.700000 -4225.900000 0 181.700000 -4225.200000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 -4225.900000 0 494.500000 -4225.900000 0 494.500000 -4226.700000 0 181.700000 -4226.700000 0 181.700000 -4225.900000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 -4226.700000 0 494.500000 -4226.700000 0 494.500000 -4227.400000 0 181.700000 -4227.400000 0 181.700000 -4226.700000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 -4227.400000 0 494.500000 -4227.400000 0 494.500000 -4228.200000 0 181.700000 -4228.200000 0 181.700000 -4227.400000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 -4228.200000 0 494.500000 -4228.200000 0 494.500000 -4229.000000 0 181.700000 -4229.000000 0 181.700000 -4228.200000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 -4229.000000 0 494.500000 -4229.000000 0 494.500000 -4229.700000 0 181.700000 -4229.700000 0 181.700000 -4229.000000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 -4229.700000 0 494.500000 -4229.700000 0 494.500000 -4230.500000 0 181.700000 -4230.500000 0 181.700000 -4229.700000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 -4230.500000 0 494.500000 -4230.500000 0 494.500000 -4231.200000 0 181.700000 -4231.200000 0 181.700000 -4230.500000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 -4231.200000 0 494.500000 -4231.200000 0 494.500000 -4232.000000 0 181.700000 -4232.000000 0 181.700000 -4231.200000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 -4232.000000 0 494.500000 -4232.000000 0 494.500000 -4232.700000 0 181.700000 -4232.700000 0 181.700000 -4232.000000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 -4232.700000 0 494.500000 -4232.700000 0 494.500000 -4233.500000 0 181.700000 -4233.500000 0 181.700000 -4232.700000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 -4233.500000 0 494.500000 -4233.500000 0 494.500000 -4234.300000 0 181.700000 -4234.300000 0 181.700000 -4233.500000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 -4234.300000 0 494.500000 -4234.300000 0 494.500000 -4235.000000 0 181.700000 -4235.000000 0 181.700000 -4234.300000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 -4235.000000 0 494.500000 -4235.000000 0 494.500000 -4235.800000 0 181.700000 -4235.800000 0 181.700000 -4235.000000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 -4235.800000 0 494.500000 -4235.800000 0 494.500000 -4236.500000 0 181.700000 -4236.500000 0 181.700000 -4235.800000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 -4236.500000 0 494.500000 -4236.500000 0 494.500000 -4237.300000 0 181.700000 -4237.300000 0 181.700000 -4236.500000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 -4237.300000 0 494.500000 -4237.300000 0 494.500000 -4238.100000 0 181.700000 -4238.100000 0 181.700000 -4237.300000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 -4238.100000 0 494.500000 -4238.100000 0 494.500000 -4238.800000 0 181.700000 -4238.800000 0 181.700000 -4238.100000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 -4238.800000 0 494.500000 -4238.800000 0 494.500000 -4239.600000 0 181.700000 -4239.600000 0 181.700000 -4238.800000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 -4239.600000 0 494.500000 -4239.600000 0 494.500000 -4240.300000 0 181.700000 -4240.300000 0 181.700000 -4239.600000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 -4240.300000 0 494.500000 -4240.300000 0 494.500000 -4241.100000 0 181.700000 -4241.100000 0 181.700000 -4240.300000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 -4241.100000 0 494.500000 -4241.100000 0 494.500000 -4241.800000 0 181.700000 -4241.800000 0 181.700000 -4241.100000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 -4241.800000 0 494.500000 -4241.800000 0 494.500000 -4242.600000 0 181.700000 -4242.600000 0 181.700000 -4241.800000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 -4242.600000 0 494.500000 -4242.600000 0 494.500000 -4243.400000 0 181.700000 -4243.400000 0 181.700000 -4242.600000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 -4243.400000 0 494.500000 -4243.400000 0 494.500000 -4244.100000 0 181.700000 -4244.100000 0 181.700000 -4243.400000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 -4244.100000 0 494.500000 -4244.100000 0 494.500000 -4244.900000 0 181.700000 -4244.900000 0 181.700000 -4244.100000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 -4244.900000 0 494.500000 -4244.900000 0 494.500000 -4245.600000 0 181.700000 -4245.600000 0 181.700000 -4244.900000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 -4245.600000 0 494.500000 -4245.600000 0 494.500000 -4246.400000 0 181.700000 -4246.400000 0 181.700000 -4245.600000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 -4246.400000 0 494.500000 -4246.400000 0 494.500000 -4247.200000 0 181.700000 -4247.200000 0 181.700000 -4246.400000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 -4247.200000 0 494.500000 -4247.200000 0 494.500000 -4247.900000 0 181.700000 -4247.900000 0 181.700000 -4247.200000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 -4247.900000 0 494.500000 -4247.900000 0 494.500000 -4248.700000 0 181.700000 -4248.700000 0 181.700000 -4247.900000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 -4248.700000 0 494.500000 -4248.700000 0 494.500000 -4249.400000 0 181.700000 -4249.400000 0 181.700000 -4248.700000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 -4249.400000 0 494.500000 -4249.400000 0 494.500000 -4250.200000 0 181.700000 -4250.200000 0 181.700000 -4249.400000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 -4250.200000 0 494.500000 -4250.200000 0 494.500000 -4251.000000 0 181.700000 -4251.000000 0 181.700000 -4250.200000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 -4251.000000 0 494.500000 -4251.000000 0 494.500000 -4251.700000 0 181.700000 -4251.700000 0 181.700000 -4251.000000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 -4251.700000 0 494.500000 -4251.700000 0 494.500000 -4252.500000 0 181.700000 -4252.500000 0 181.700000 -4251.700000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 -4252.500000 0 494.500000 -4252.500000 0 494.500000 -4253.200000 0 181.700000 -4253.200000 0 181.700000 -4252.500000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 -4253.200000 0 494.500000 -4253.200000 0 494.500000 -4254.000000 0 181.700000 -4254.000000 0 181.700000 -4253.200000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 -4254.000000 0 494.500000 -4254.000000 0 494.500000 -4254.700000 0 181.700000 -4254.700000 0 181.700000 -4254.000000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 -4254.700000 0 494.500000 -4254.700000 0 494.500000 -4255.500000 0 181.700000 -4255.500000 0 181.700000 -4254.700000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 -4255.500000 0 494.500000 -4255.500000 0 494.500000 -4256.300000 0 181.700000 -4256.300000 0 181.700000 -4255.500000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 -4256.300000 0 494.500000 -4256.300000 0 494.500000 -4257.000000 0 181.700000 -4257.000000 0 181.700000 -4256.300000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 -4257.000000 0 494.500000 -4257.000000 0 494.500000 -4257.800000 0 181.700000 -4257.800000 0 181.700000 -4257.000000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 -4257.800000 0 494.500000 -4257.800000 0 494.500000 -4258.500000 0 181.700000 -4258.500000 0 181.700000 -4257.800000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 -4258.500000 0 494.500000 -4258.500000 0 494.500000 -4259.300000 0 181.700000 -4259.300000 0 181.700000 -4258.500000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 -4259.300000 0 494.500000 -4259.300000 0 494.500000 -4260.100000 0 181.700000 -4260.100000 0 181.700000 -4259.300000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 -4260.100000 0 494.500000 -4260.100000 0 494.500000 -4260.800000 0 181.700000 -4260.800000 0 181.700000 -4260.100000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 -4260.800000 0 494.500000 -4260.800000 0 494.500000 -4261.600000 0 181.700000 -4261.600000 0 181.700000 -4260.800000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 -4261.600000 0 494.500000 -4261.600000 0 494.500000 -4262.300000 0 181.700000 -4262.300000 0 181.700000 -4261.600000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 -4262.300000 0 494.500000 -4262.300000 0 494.500000 -4263.100000 0 181.700000 -4263.100000 0 181.700000 -4262.300000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 -4263.100000 0 494.500000 -4263.100000 0 494.500000 -4263.900000 0 181.700000 -4263.900000 0 181.700000 -4263.100000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 -4263.900000 0 494.500000 -4263.900000 0 494.500000 -4264.600000 0 181.700000 -4264.600000 0 181.700000 -4263.900000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 -4264.600000 0 494.500000 -4264.600000 0 494.500000 -4265.400000 0 181.700000 -4265.400000 0 181.700000 -4264.600000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 -4265.400000 0 494.500000 -4265.400000 0 494.500000 -4266.100000 0 181.700000 -4266.100000 0 181.700000 -4265.400000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 -4266.100000 0 494.500000 -4266.100000 0 494.500000 -4266.900000 0 181.700000 -4266.900000 0 181.700000 -4266.100000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 -4266.900000 0 494.500000 -4266.900000 0 494.500000 -4267.600000 0 181.700000 -4267.600000 0 181.700000 -4266.900000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 -4267.600000 0 494.500000 -4267.600000 0 494.500000 -4268.400000 0 181.700000 -4268.400000 0 181.700000 -4267.600000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 -4268.400000 0 494.500000 -4268.400000 0 494.500000 -4269.200000 0 181.700000 -4269.200000 0 181.700000 -4268.400000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 -4269.200000 0 494.500000 -4269.200000 0 494.500000 -4269.900000 0 181.700000 -4269.900000 0 181.700000 -4269.200000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 -4269.900000 0 494.500000 -4269.900000 0 494.500000 -4270.700000 0 181.700000 -4270.700000 0 181.700000 -4269.900000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 -4270.700000 0 494.500000 -4270.700000 0 494.500000 -4271.400000 0 181.700000 -4271.400000 0 181.700000 -4270.700000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 -4271.400000 0 494.500000 -4271.400000 0 494.500000 -4272.200000 0 181.700000 -4272.200000 0 181.700000 -4271.400000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 -4272.200000 0 494.500000 -4272.200000 0 494.500000 -4273.000000 0 181.700000 -4273.000000 0 181.700000 -4272.200000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 -4273.000000 0 494.500000 -4273.000000 0 494.500000 -4273.700000 0 181.700000 -4273.700000 0 181.700000 -4273.000000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 -4273.700000 0 494.500000 -4273.700000 0 494.500000 -4274.500000 0 181.700000 -4274.500000 0 181.700000 -4273.700000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 -4274.500000 0 494.500000 -4274.500000 0 494.500000 -4275.200000 0 181.700000 -4275.200000 0 181.700000 -4274.500000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 -4275.200000 0 494.500000 -4275.200000 0 494.500000 -4276.000000 0 181.700000 -4276.000000 0 181.700000 -4275.200000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 -4276.000000 0 494.500000 -4276.000000 0 494.500000 -4276.800000 0 181.700000 -4276.800000 0 181.700000 -4276.000000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 -4276.800000 0 494.500000 -4276.800000 0 494.500000 -4277.500000 0 181.700000 -4277.500000 0 181.700000 -4276.800000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 -4277.500000 0 494.500000 -4277.500000 0 494.500000 -4278.300000 0 181.700000 -4278.300000 0 181.700000 -4277.500000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 -4278.300000 0 494.500000 -4278.300000 0 494.500000 -4279.000000 0 181.700000 -4279.000000 0 181.700000 -4278.300000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 -4279.000000 0 494.500000 -4279.000000 0 494.500000 -4279.800000 0 181.700000 -4279.800000 0 181.700000 -4279.000000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 -4279.800000 0 494.500000 -4279.800000 0 494.500000 -4280.500000 0 181.700000 -4280.500000 0 181.700000 -4279.800000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 -4280.500000 0 494.500000 -4280.500000 0 494.500000 -4281.300000 0 181.700000 -4281.300000 0 181.700000 -4280.500000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 -4281.300000 0 494.500000 -4281.300000 0 494.500000 -4282.100000 0 181.700000 -4282.100000 0 181.700000 -4281.300000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 -4282.100000 0 494.500000 -4282.100000 0 494.500000 -4282.800000 0 181.700000 -4282.800000 0 181.700000 -4282.100000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 -4282.800000 0 494.500000 -4282.800000 0 494.500000 -4283.600000 0 181.700000 -4283.600000 0 181.700000 -4282.800000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 -4283.600000 0 494.500000 -4283.600000 0 494.500000 -4284.300000 0 181.700000 -4284.300000 0 181.700000 -4283.600000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 -4284.300000 0 494.500000 -4284.300000 0 494.500000 -4285.100000 0 181.700000 -4285.100000 0 181.700000 -4284.300000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 -4285.100000 0 494.500000 -4285.100000 0 494.500000 -4285.900000 0 181.700000 -4285.900000 0 181.700000 -4285.100000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 -4285.900000 0 494.500000 -4285.900000 0 494.500000 -4286.600000 0 181.700000 -4286.600000 0 181.700000 -4285.900000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 -4286.600000 0 494.500000 -4286.600000 0 494.500000 -4287.400000 0 181.700000 -4287.400000 0 181.700000 -4286.600000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 -4287.400000 0 494.500000 -4287.400000 0 494.500000 -4288.100000 0 181.700000 -4288.100000 0 181.700000 -4287.400000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 -4288.100000 0 494.500000 -4288.100000 0 494.500000 -4288.900000 0 181.700000 -4288.900000 0 181.700000 -4288.100000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 -4288.900000 0 494.500000 -4288.900000 0 494.500000 -4289.700000 0 181.700000 -4289.700000 0 181.700000 -4288.900000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 -4289.700000 0 494.500000 -4289.700000 0 494.500000 -4290.400000 0 181.700000 -4290.400000 0 181.700000 -4289.700000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 -4290.400000 0 494.500000 -4290.400000 0 494.500000 -4291.200000 0 181.700000 -4291.200000 0 181.700000 -4290.400000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 -4291.200000 0 494.500000 -4291.200000 0 494.500000 -4291.900000 0 181.700000 -4291.900000 0 181.700000 -4291.200000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 -4291.900000 0 494.500000 -4291.900000 0 494.500000 -4292.700000 0 181.700000 -4292.700000 0 181.700000 -4291.900000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 -4292.700000 0 494.500000 -4292.700000 0 494.500000 -4293.400000 0 181.700000 -4293.400000 0 181.700000 -4292.700000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 -4293.400000 0 494.500000 -4293.400000 0 494.500000 -4294.200000 0 181.700000 -4294.200000 0 181.700000 -4293.400000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 -4294.200000 0 494.500000 -4294.200000 0 494.500000 -4295.000000 0 181.700000 -4295.000000 0 181.700000 -4294.200000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 -4295.000000 0 494.500000 -4295.000000 0 494.500000 -4295.700000 0 181.700000 -4295.700000 0 181.700000 -4295.000000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 -4295.700000 0 494.500000 -4295.700000 0 494.500000 -4296.500000 0 181.700000 -4296.500000 0 181.700000 -4295.700000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 -4296.500000 0 494.500000 -4296.500000 0 494.500000 -4297.200000 0 181.700000 -4297.200000 0 181.700000 -4296.500000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 -4297.200000 0 494.500000 -4297.200000 0 494.500000 -4298.000000 0 181.700000 -4298.000000 0 181.700000 -4297.200000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 -4298.000000 0 494.500000 -4298.000000 0 494.500000 -4298.800000 0 181.700000 -4298.800000 0 181.700000 -4298.000000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 -4298.800000 0 494.500000 -4298.800000 0 494.500000 -4299.500000 0 181.700000 -4299.500000 0 181.700000 -4298.800000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 -4299.500000 0 494.500000 -4299.500000 0 494.500000 -4300.300000 0 181.700000 -4300.300000 0 181.700000 -4299.500000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 -4300.300000 0 494.500000 -4300.300000 0 494.500000 -4301.000000 0 181.700000 -4301.000000 0 181.700000 -4300.300000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 -4301.000000 0 494.500000 -4301.000000 0 494.500000 -4301.800000 0 181.700000 -4301.800000 0 181.700000 -4301.000000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 -4301.800000 0 494.500000 -4301.800000 0 494.500000 -4302.600000 0 181.700000 -4302.600000 0 181.700000 -4301.800000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 -4302.600000 0 494.500000 -4302.600000 0 494.500000 -4303.300000 0 181.700000 -4303.300000 0 181.700000 -4302.600000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 -4303.300000 0 494.500000 -4303.300000 0 494.500000 -4304.100000 0 181.700000 -4304.100000 0 181.700000 -4303.300000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 -4304.100000 0 494.500000 -4304.100000 0 494.500000 -4304.800000 0 181.700000 -4304.800000 0 181.700000 -4304.100000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 -4304.800000 0 494.500000 -4304.800000 0 494.500000 -4305.600000 0 181.700000 -4305.600000 0 181.700000 -4304.800000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 -4305.600000 0 494.500000 -4305.600000 0 494.500000 -4306.300000 0 181.700000 -4306.300000 0 181.700000 -4305.600000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 -4306.300000 0 494.500000 -4306.300000 0 494.500000 -4307.100000 0 181.700000 -4307.100000 0 181.700000 -4306.300000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 -4307.100000 0 494.500000 -4307.100000 0 494.500000 -4307.900000 0 181.700000 -4307.900000 0 181.700000 -4307.100000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 -4307.900000 0 494.500000 -4307.900000 0 494.500000 -4308.600000 0 181.700000 -4308.600000 0 181.700000 -4307.900000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 -4308.600000 0 494.500000 -4308.600000 0 494.500000 -4309.400000 0 181.700000 -4309.400000 0 181.700000 -4308.600000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 -4309.400000 0 494.500000 -4309.400000 0 494.500000 -4310.100000 0 181.700000 -4310.100000 0 181.700000 -4309.400000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 -4310.100000 0 494.500000 -4310.100000 0 494.500000 -4310.900000 0 181.700000 -4310.900000 0 181.700000 -4310.100000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 -4310.900000 0 494.500000 -4310.900000 0 494.500000 -4311.700000 0 181.700000 -4311.700000 0 181.700000 -4310.900000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 -4311.700000 0 494.500000 -4311.700000 0 494.500000 -4312.400000 0 181.700000 -4312.400000 0 181.700000 -4311.700000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 -4312.400000 0 494.500000 -4312.400000 0 494.500000 -4313.200000 0 181.700000 -4313.200000 0 181.700000 -4312.400000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 -4313.200000 0 494.500000 -4313.200000 0 494.500000 -4313.900000 0 181.700000 -4313.900000 0 181.700000 -4313.200000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 -4313.900000 0 494.500000 -4313.900000 0 494.500000 -4314.700000 0 181.700000 -4314.700000 0 181.700000 -4313.900000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 -4314.700000 0 494.500000 -4314.700000 0 494.500000 -4315.500000 0 181.700000 -4315.500000 0 181.700000 -4314.700000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 -4315.500000 0 494.500000 -4315.500000 0 494.500000 -4316.200000 0 181.700000 -4316.200000 0 181.700000 -4315.500000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 -4316.200000 0 494.500000 -4316.200000 0 494.500000 -4317.000000 0 181.700000 -4317.000000 0 181.700000 -4316.200000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 -4317.000000 0 494.500000 -4317.000000 0 494.500000 -4317.700000 0 181.700000 -4317.700000 0 181.700000 -4317.000000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 -4317.700000 0 494.500000 -4317.700000 0 494.500000 -4318.500000 0 181.700000 -4318.500000 0 181.700000 -4317.700000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 -4318.500000 0 494.500000 -4318.500000 0 494.500000 -4319.200000 0 181.700000 -4319.200000 0 181.700000 -4318.500000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 -4319.200000 0 494.500000 -4319.200000 0 494.500000 -4320.000000 0 181.700000 -4320.000000 0 181.700000 -4319.200000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 -4320.000000 0 494.500000 -4320.000000 0 494.500000 -4320.800000 0 181.700000 -4320.800000 0 181.700000 -4320.000000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 -4320.800000 0 494.500000 -4320.800000 0 494.500000 -4321.500000 0 181.700000 -4321.500000 0 181.700000 -4320.800000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 -4321.500000 0 494.500000 -4321.500000 0 494.500000 -4322.300000 0 181.700000 -4322.300000 0 181.700000 -4321.500000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 -4322.300000 0 494.500000 -4322.300000 0 494.500000 -4323.000000 0 181.700000 -4323.000000 0 181.700000 -4322.300000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 -4323.000000 0 494.500000 -4323.000000 0 494.500000 -4323.800000 0 181.700000 -4323.800000 0 181.700000 -4323.000000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 -4323.800000 0 494.500000 -4323.800000 0 494.500000 -4324.600000 0 181.700000 -4324.600000 0 181.700000 -4323.800000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 -4324.600000 0 494.500000 -4324.600000 0 494.500000 -4325.300000 0 181.700000 -4325.300000 0 181.700000 -4324.600000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 -4325.300000 0 494.500000 -4325.300000 0 494.500000 -4326.100000 0 181.700000 -4326.100000 0 181.700000 -4325.300000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 -4326.100000 0 494.500000 -4326.100000 0 494.500000 -4326.800000 0 181.700000 -4326.800000 0 181.700000 -4326.100000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 -4326.800000 0 494.500000 -4326.800000 0 494.500000 -4327.600000 0 181.700000 -4327.600000 0 181.700000 -4326.800000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 -4327.600000 0 494.500000 -4327.600000 0 494.500000 -4328.400000 0 181.700000 -4328.400000 0 181.700000 -4327.600000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 -4328.400000 0 494.500000 -4328.400000 0 494.500000 -4329.100000 0 181.700000 -4329.100000 0 181.700000 -4328.400000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 -4329.100000 0 494.500000 -4329.100000 0 494.500000 -4329.900000 0 181.700000 -4329.900000 0 181.700000 -4329.100000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 -4329.900000 0 494.500000 -4329.900000 0 494.500000 -4330.600000 0 181.700000 -4330.600000 0 181.700000 -4329.900000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 -4330.600000 0 494.500000 -4330.600000 0 494.500000 -4331.400000 0 181.700000 -4331.400000 0 181.700000 -4330.600000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 -4331.400000 0 494.500000 -4331.400000 0 494.500000 -4332.100000 0 181.700000 -4332.100000 0 181.700000 -4331.400000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 -4332.100000 0 494.500000 -4332.100000 0 494.500000 -4332.900000 0 181.700000 -4332.900000 0 181.700000 -4332.100000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 -4332.900000 0 494.500000 -4332.900000 0 494.500000 -4333.700000 0 181.700000 -4333.700000 0 181.700000 -4332.900000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 -4333.700000 0 494.500000 -4333.700000 0 494.500000 -4334.400000 0 181.700000 -4334.400000 0 181.700000 -4333.700000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 -4334.400000 0 494.500000 -4334.400000 0 494.500000 -4335.200000 0 181.700000 -4335.200000 0 181.700000 -4334.400000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 -4335.200000 0 494.500000 -4335.200000 0 494.500000 -4335.900000 0 181.700000 -4335.900000 0 181.700000 -4335.200000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 -4335.900000 0 494.500000 -4335.900000 0 494.500000 -4336.700000 0 181.700000 -4336.700000 0 181.700000 -4335.900000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 -4336.700000 0 494.500000 -4336.700000 0 494.500000 -4337.500000 0 181.700000 -4337.500000 0 181.700000 -4336.700000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 -4337.500000 0 494.500000 -4337.500000 0 494.500000 -4338.200000 0 181.700000 -4338.200000 0 181.700000 -4337.500000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 -4338.200000 0 494.500000 -4338.200000 0 494.500000 -4339.000000 0 181.700000 -4339.000000 0 181.700000 -4338.200000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 -4339.000000 0 494.500000 -4339.000000 0 494.500000 -4339.700000 0 181.700000 -4339.700000 0 181.700000 -4339.000000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 -4339.700000 0 494.500000 -4339.700000 0 494.500000 -4340.500000 0 181.700000 -4340.500000 0 181.700000 -4339.700000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 -4340.500000 0 494.500000 -4340.500000 0 494.500000 -4341.300000 0 181.700000 -4341.300000 0 181.700000 -4340.500000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 -4341.300000 0 494.500000 -4341.300000 0 494.500000 -4342.000000 0 181.700000 -4342.000000 0 181.700000 -4341.300000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 -4342.000000 0 494.500000 -4342.000000 0 494.500000 -4342.800000 0 181.700000 -4342.800000 0 181.700000 -4342.000000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 -4342.800000 0 494.500000 -4342.800000 0 494.500000 -4343.500000 0 181.700000 -4343.500000 0 181.700000 -4342.800000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 -4343.500000 0 494.500000 -4343.500000 0 494.500000 -4344.300000 0 181.700000 -4344.300000 0 181.700000 -4343.500000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 -4344.300000 0 494.500000 -4344.300000 0 494.500000 -4345.000000 0 181.700000 -4345.000000 0 181.700000 -4344.300000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 -4345.000000 0 494.500000 -4345.000000 0 494.500000 -4345.800000 0 181.700000 -4345.800000 0 181.700000 -4345.000000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 -4345.800000 0 494.500000 -4345.800000 0 494.500000 -4346.600000 0 181.700000 -4346.600000 0 181.700000 -4345.800000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 -4346.600000 0 494.500000 -4346.600000 0 494.500000 -4347.300000 0 181.700000 -4347.300000 0 181.700000 -4346.600000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 -4347.300000 0 494.500000 -4347.300000 0 494.500000 -4348.100000 0 181.700000 -4348.100000 0 181.700000 -4347.300000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 -4348.100000 0 494.500000 -4348.100000 0 494.500000 -4348.800000 0 181.700000 -4348.800000 0 181.700000 -4348.100000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 -4348.800000 0 494.500000 -4348.800000 0 494.500000 -4349.600000 0 181.700000 -4349.600000 0 181.700000 -4348.800000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 -4349.600000 0 494.500000 -4349.600000 0 494.500000 -4350.400000 0 181.700000 -4350.400000 0 181.700000 -4349.600000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 -4350.400000 0 494.500000 -4350.400000 0 494.500000 -4351.100000 0 181.700000 -4351.100000 0 181.700000 -4350.400000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 -4351.100000 0 494.500000 -4351.100000 0 494.500000 -4351.900000 0 181.700000 -4351.900000 0 181.700000 -4351.100000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 -4351.900000 0 494.500000 -4351.900000 0 494.500000 -4352.600000 0 181.700000 -4352.600000 0 181.700000 -4351.900000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 -4352.600000 0 494.500000 -4352.600000 0 494.500000 -4353.400000 0 181.700000 -4353.400000 0 181.700000 -4352.600000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 -4353.400000 0 494.500000 -4353.400000 0 494.500000 -4354.200000 0 181.700000 -4354.200000 0 181.700000 -4353.400000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 -4354.200000 0 494.500000 -4354.200000 0 494.500000 -4354.900000 0 181.700000 -4354.900000 0 181.700000 -4354.200000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 -4354.900000 0 494.500000 -4354.900000 0 494.500000 -4355.700000 0 181.700000 -4355.700000 0 181.700000 -4354.900000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 -4355.700000 0 494.500000 -4355.700000 0 494.500000 -4356.400000 0 181.700000 -4356.400000 0 181.700000 -4355.700000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 -4356.400000 0 494.500000 -4356.400000 0 494.500000 -4357.200000 0 181.700000 -4357.200000 0 181.700000 -4356.400000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 -4357.200000 0 494.500000 -4357.200000 0 494.500000 -4357.900000 0 181.700000 -4357.900000 0 181.700000 -4357.200000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 -4357.900000 0 494.500000 -4357.900000 0 494.500000 -4358.700000 0 181.700000 -4358.700000 0 181.700000 -4357.900000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 -4358.700000 0 494.500000 -4358.700000 0 494.500000 -4359.500000 0 181.700000 -4359.500000 0 181.700000 -4358.700000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 -4359.500000 0 494.500000 -4359.500000 0 494.500000 -4360.200000 0 181.700000 -4360.200000 0 181.700000 -4359.500000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 -4360.200000 0 494.500000 -4360.200000 0 494.500000 -4361.000000 0 181.700000 -4361.000000 0 181.700000 -4360.200000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 -4360.900000 0 181.800000 -4360.900000 0 181.800000 -4167.600000 0 494.400000 -4167.600000 0 494.400000 -4360.900000 0 338.100000 -4360.900000 0
+strokePath subpath 1 338.100000 -4360.900000 0 181.800000 -4360.900000 0 181.800000 -4167.600000 0 494.400000 -4167.600000 0 494.400000 -4360.900000 0 338.100000 -4360.900000 0
+saveState
+updateCtm 11420.000000 0.000000 0.000000 -8760.000000 20530.000000 507690.000000
+drawSoftMaskedImage 1143 877 1143 877 JPEG 71324 PPM 3007249
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 -4321.876000 215.488000 -4329.876000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 -4321.876000 220.592000 -4329.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 -4321.876000 225.696000 -4329.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 -4321.876000 230.800000 -4329.876000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 -4329.476000 241.388000 -4337.476000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 -4329.476000 246.492000 -4337.476000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 -4329.476000 251.596000 -4337.476000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 -4329.476000 256.700000 -4337.476000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 -4337.076000 267.188000 -4345.076000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 -4337.076000 272.292000 -4345.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 -4337.076000 277.396000 -4345.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 -4337.076000 282.500000 -4345.076000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 -4344.676000 293.088000 -4352.676000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 -4344.676000 298.192000 -4352.676000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 -4344.676000 303.296000 -4352.676000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 -4344.676000 308.400000 -4352.676000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 -4306.876000 202.588000 -4314.876000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 -4287.576000 201.688000 -4295.576000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 -4268.276000 195.788000 -4276.276000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 -4268.276000 200.892000 -4276.276000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 -4248.876000 194.888000 -4256.876000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 -4248.876000 199.992000 -4256.876000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 -4229.576000 193.988000 -4237.576000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 -4229.576000 199.092000 -4237.576000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 -4210.276000 193.088000 -4218.276000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 -4210.276000 198.192000 -4218.276000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 -4338.176000 330.188000 -4346.176000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 -4338.176000 332.716000 -4346.176000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 -4338.176000 337.596000 -4346.176000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 -4338.176000 341.396000 -4346.176000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 -4338.176000 346.036000 -4346.176000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 -4338.176000 350.900000 -4346.176000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 -4338.176000 355.972000 -4346.176000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 -4338.176000 359.196000 -4346.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 -4338.176000 362.196000 -4346.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 -4338.176000 367.404000 -4346.176000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 -4338.176000 371.876000 -4346.176000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 -4338.176000 375.052000 -4346.176000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 -4318.676000 361.172000 -4326.676000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 -4318.676000 364.340000 -4326.676000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 -4318.676000 367.396000 -4326.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 -4318.676000 372.604000 -4326.676000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 -4318.676000 379.348000 -4326.676000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 -4318.676000 384.484000 -4326.676000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 -4318.676000 389.436000 -4326.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 -4318.676000 392.108000 -4326.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 -4318.676000 395.708000 -4326.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 -4318.676000 397.540000 -4326.676000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 -4318.676000 402.444000 -4326.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 -4318.676000 406.788000 -4326.676000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 -4299.076000 392.972000 -4307.076000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 -4299.076000 398.076000 -4307.076000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 -4299.076000 403.180000 -4307.076000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 -4299.076000 405.428000 -4307.076000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 -4299.076000 410.332000 -4307.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 -4299.076000 414.476000 -4307.076000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 -4171.508000 305.808000 -4185.508000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 -4171.508000 314.138000 -4185.508000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 -4171.508000 320.788000 -4185.508000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 -4171.508000 328.698000 -4185.508000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 -4171.508000 336.972000 -4185.508000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 -4171.508000 344.182000 -4185.508000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 -4171.508000 349.810000 -4185.508000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 -4171.508000 354.234000 -4185.508000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 -4171.508000 362.718000 -4185.508000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 -4171.508000 367.870000 -4185.508000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 -4171.508000 372.322000 -4185.508000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 -4171.508000 382.080000 -4185.508000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 -4171.508000 388.772000 -4185.508000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 -4171.508000 397.802000 -4185.508000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 -4171.508000 402.254000 -4185.508000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 -4171.508000 407.896000 -4185.508000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 -4294.400000 0 424.300000 -4294.400000 0 424.300000 -4233.700000 0 493.600000 -4233.700000 0 493.600000 -4294.400000 0 458.900000 -4294.400000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 -4243.300000 0 428.900000 -4243.300000 0 428.900000 -4237.300000 0 434.800000 -4237.300000 0 434.800000 -4243.300000 0 431.900000 -4243.300000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 -4254.400000 0 428.900000 -4254.400000 0 428.900000 -4248.400000 0 434.800000 -4248.400000 0 434.800000 -4254.400000 0 431.900000 -4254.400000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 -4265.500000 0 428.900000 -4265.500000 0 428.900000 -4259.500000 0 434.800000 -4259.500000 0 434.800000 -4265.500000 0 431.900000 -4265.500000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 -4276.600000 0 428.900000 -4276.600000 0 428.900000 -4270.600000 0 434.800000 -4270.600000 0 434.800000 -4276.600000 0 431.900000 -4276.600000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 -4287.700000 0 428.900000 -4287.700000 0 428.900000 -4281.700000 0 434.800000 -4281.700000 0 434.800000 -4287.700000 0 431.900000 -4287.700000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -4236.176000 443.288000 -4244.176000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 -4236.176000 445.816000 -4244.176000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 -4236.176000 450.600000 -4244.176000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 -4236.176000 454.496000 -4244.176000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 -4236.176000 459.136000 -4244.176000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 -4236.176000 464.000000 -4244.176000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 -4236.176000 468.976000 -4244.176000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 -4236.176000 472.304000 -4244.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 -4236.176000 475.208000 -4244.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 -4236.176000 480.520000 -4244.176000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 -4236.176000 484.992000 -4244.176000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 -4236.176000 488.168000 -4244.176000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -4247.276000 443.352000 -4255.276000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 -4247.276000 447.920000 -4255.276000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 -4247.276000 452.976000 -4255.276000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 -4247.276000 457.400000 -4255.276000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 -4247.276000 462.472000 -4255.276000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 -4247.276000 465.800000 -4255.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 -4247.276000 468.904000 -4255.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 -4247.276000 473.816000 -4255.276000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 -4247.276000 478.888000 -4255.276000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 -4247.276000 482.064000 -4255.276000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -4258.376000 442.872000 -4266.376000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 -4258.376000 446.040000 -4266.376000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 -4258.376000 448.992000 -4266.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 -4258.376000 454.304000 -4266.376000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 -4258.376000 461.048000 -4266.376000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 -4258.376000 466.184000 -4266.376000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 -4258.376000 471.136000 -4266.376000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 -4258.376000 473.808000 -4266.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 -4258.376000 477.408000 -4266.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 -4258.376000 479.240000 -4266.376000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 -4258.376000 484.144000 -4266.376000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 -4258.376000 488.488000 -4266.376000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -4269.476000 443.384000 -4277.476000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 -4269.476000 448.464000 -4277.476000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 -4269.476000 453.424000 -4277.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 -4269.476000 456.696000 -4277.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 -4269.476000 459.800000 -4277.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 -4269.476000 462.032000 -4277.476000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 -4269.476000 466.936000 -4277.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 -4269.476000 471.080000 -4277.476000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -4280.576000 443.272000 -4288.576000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 -4280.576000 448.376000 -4288.576000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 -4280.576000 453.480000 -4288.576000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 -4280.576000 455.728000 -4288.576000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 -4280.576000 460.632000 -4288.576000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 -4280.576000 464.776000 -4288.576000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -6925.600000 0 114.800000 -6925.600000 0 114.800000 -6882.800000 0 72.000000 -6882.800000 0 72.000000 -6925.600000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 771750.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 546.200000 0 504.000000 546.200000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 546.200000 0
+eoFillPath subpath 1 72.000000 72.000000 0 504.000000 72.000000 0 504.000000 245.800000 0 72.000000 245.800000 0 72.000000 72.000000 0
+eoFillPath subpath 1 72.000000 245.800000 0 121.400000 245.800000 0 121.400000 546.200000 0 72.000000 546.200000 0 72.000000 245.800000 0
+eoFillPath subpath 1 454.500000 245.800000 0 504.000000 245.800000 0 504.000000 546.200000 0 454.500000 546.200000 0 454.500000 245.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 72.000000 701.300000 0 504.000000 701.300000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 701.300000 0
+eoFillPath subpath 1 72.000000 72.200000 0 504.000000 72.200000 0 504.000000 86.100000 0 72.000000 86.100000 0 72.000000 72.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 306.000000 719.948000 319.792000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 319.808000 719.948000 329.264000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 329.312000 719.948000 334.384000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 334.416000 719.948000 346.432000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 346.416000 719.948000 356.192000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 356.224000 719.948000 366.352000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 366.320000 719.948000 374.640000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 374.624000 719.948000 384.464000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 384.432000 719.948000 389.504000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 389.536000 719.948000 395.296000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 395.344000 719.948000 400.416000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 400.400000 719.948000 410.544000 703.948000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 410.608000 719.948000 420.448000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 420.416000 719.948000 429.200000 703.948000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 429.216000 719.948000 438.992000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 439.024000 719.948000 449.152000 703.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 449.120000 719.948000 459.264000 703.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 459.328000 719.948000 464.400000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 464.432000 719.948000 473.632000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 473.632000 719.948000 478.064000 703.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 478.032000 719.948000 487.808000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 487.840000 719.948000 497.616000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 497.648000 719.948000 504.224000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 103 1 0 0 0 1200.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 672.936000 81.244000 660.936000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 81.196000 672.936000 89.332000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.296000 672.936000 97.876000 660.936000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 655.936000 195.964000 643.936000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 196.000000 655.936000 203.152000 643.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 203.104000 655.936000 209.872000 643.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 209.908000 655.936000 213.736000 643.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 213.712000 655.936000 221.440000 643.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 221.512000 655.936000 229.192000 643.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 230.512000 655.936000 234.316000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 235.816000 655.936000 242.968000 643.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 245.812000 655.936000 249.616000 643.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 249.700000 655.936000 259.960000 643.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 259.996000 655.936000 267.148000 643.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 267.100000 655.936000 271.912000 643.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 271.900000 655.936000 278.992000 643.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 279.004000 655.936000 284.740000 643.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 284.800000 655.936000 292.480000 643.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 292.504000 655.936000 299.596000 643.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 299.608000 655.936000 307.288000 643.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 308.704000 655.936000 312.508000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 314.008000 655.936000 324.268000 643.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 324.304000 655.936000 331.456000 643.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 331.408000 655.936000 337.564000 643.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 338.908000 655.936000 342.712000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 344.212000 655.936000 351.364000 643.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 351.412000 655.936000 355.240000 643.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 355.216000 655.936000 365.476000 643.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 365.512000 655.936000 372.664000 643.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.616000 655.936000 379.384000 643.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 379.420000 655.936000 385.576000 643.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 386.920000 655.936000 390.724000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 392.224000 655.936000 399.376000 643.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 400.828000 655.936000 404.632000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 406.024000 655.936000 413.704000 643.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 413.728000 655.936000 419.464000 643.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 419.428000 655.936000 426.520000 643.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 426.532000 655.936000 433.684000 643.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 433.732000 655.936000 445.108000 643.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 446.536000 655.936000 450.340000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 451.840000 655.936000 459.064000 643.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 459.040000 655.936000 463.480000 643.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 464.836000 655.936000 468.640000 643.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 470.140000 655.936000 481.516000 643.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 481.444000 655.936000 485.272000 643.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 485.248000 655.936000 492.976000 643.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 493.048000 655.936000 500.140000 643.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 500.152000 655.936000 503.956000 643.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 655.936000 507.904000 643.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 642.036000 195.964000 630.036000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 196.000000 642.036000 203.224000 630.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 203.200000 642.036000 213.460000 630.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 213.496000 642.036000 220.588000 630.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 220.600000 642.036000 227.368000 630.036000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 227.296000 642.036000 234.388000 630.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 234.400000 642.036000 240.136000 630.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 238.900000 642.036000 242.704000 630.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 243.196000 642.036000 247.000000 630.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 247.492000 642.036000 255.172000 630.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 255.196000 642.036000 262.288000 630.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 262.300000 642.036000 269.020000 630.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 268.996000 642.036000 276.148000 630.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 276.196000 642.036000 283.924000 630.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 283.900000 642.036000 290.056000 630.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 289.996000 642.036000 297.088000 630.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 297.592000 642.036000 301.396000 630.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 302.092000 642.036000 309.316000 630.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 309.292000 642.036000 313.732000 630.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 314.188000 642.036000 317.992000 630.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 318.484000 642.036000 325.252000 630.036000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 325.288000 642.036000 332.440000 630.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 332.392000 642.036000 338.128000 630.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 338.188000 642.036000 342.016000 630.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 341.992000 642.036000 349.216000 630.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 349.192000 642.036000 356.920000 630.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 356.992000 642.036000 363.148000 630.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 363.688000 642.036000 367.492000 630.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 368.092000 642.036000 373.828000 630.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 373.792000 642.036000 380.884000 630.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 380.896000 642.036000 388.048000 630.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 388.096000 642.036000 394.252000 630.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 394.300000 642.036000 401.524000 630.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 401.500000 642.036000 409.228000 630.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 409.204000 642.036000 415.360000 630.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 415.804000 642.036000 419.608000 630.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 420.100000 642.036000 427.252000 630.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 427.300000 642.036000 435.028000 630.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 435.004000 642.036000 442.684000 630.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 443.200000 642.036000 447.004000 630.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 447.604000 642.036000 454.324000 630.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.300000 642.036000 461.524000 630.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 461.500000 642.036000 469.228000 630.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 469.300000 642.036000 475.456000 630.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 475.396000 642.036000 479.224000 630.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.296000 642.036000 486.976000 630.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 487.000000 642.036000 494.092000 630.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 494.104000 642.036000 499.840000 630.036000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 642.036000 504.044000 630.036000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 628.136000 189.328000 616.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 189.304000 628.136000 197.032000 616.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 197.104000 628.136000 204.784000 616.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 204.700000 628.136000 208.504000 616.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 208.696000 628.136000 215.788000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 215.800000 628.136000 221.956000 616.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 221.896000 628.136000 229.576000 616.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 229.600000 628.136000 236.692000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.704000 628.136000 243.424000 616.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 243.400000 628.136000 247.228000 616.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 247.300000 628.136000 254.452000 616.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 254.404000 628.136000 258.232000 616.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 258.304000 628.136000 262.132000 616.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 262.108000 628.136000 268.876000 616.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 268.912000 628.136000 272.716000 616.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 272.812000 628.136000 277.624000 616.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 277.612000 628.136000 285.340000 616.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 285.316000 628.136000 292.408000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 292.516000 628.136000 296.320000 616.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 296.416000 628.136000 303.508000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 303.520000 628.136000 311.248000 616.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 311.224000 628.136000 318.316000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 318.328000 628.136000 324.064000 616.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 324.028000 628.136000 331.708000 616.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 331.732000 628.136000 338.500000 616.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 338.536000 628.136000 342.340000 616.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 342.436000 628.136000 350.164000 616.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 350.140000 628.136000 356.296000 616.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 356.344000 628.136000 363.436000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 363.448000 628.136000 367.252000 616.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 367.348000 628.136000 372.160000 616.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 372.244000 628.136000 379.972000 616.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 379.948000 628.136000 387.100000 616.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 387.052000 628.136000 391.864000 616.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 391.948000 628.136000 395.752000 616.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 395.752000 628.136000 403.432000 616.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 403.456000 628.136000 410.680000 616.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 410.656000 628.136000 417.748000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 417.856000 628.136000 424.012000 616.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 424.060000 628.136000 427.864000 616.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 427.864000 628.136000 431.692000 616.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 431.668000 628.136000 439.396000 616.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 439.468000 628.136000 444.280000 616.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 444.268000 628.136000 451.492000 616.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 451.468000 628.136000 455.272000 616.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 455.368000 628.136000 462.628000 616.136000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 462.664000 628.136000 469.756000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 469.768000 628.136000 476.860000 616.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 476.872000 628.136000 484.552000 616.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 484.576000 628.136000 488.404000 616.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 488.380000 628.136000 496.108000 616.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 496.180000 628.136000 503.860000 616.136000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 628.136000 507.904000 616.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 614.236000 190.312000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 614.236000 198.028000 602.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.100000 614.236000 205.192000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 206.200000 614.236000 210.004000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 211.000000 614.236000 221.260000 602.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 221.296000 614.236000 228.448000 602.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.400000 614.236000 233.212000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 233.200000 614.236000 240.292000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 240.304000 614.236000 246.040000 602.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 247.108000 614.236000 250.912000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 252.004000 614.236000 259.732000 602.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 259.708000 614.236000 266.800000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 266.812000 614.236000 273.964000 602.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 274.012000 614.236000 278.824000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 278.812000 614.236000 285.904000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 285.916000 614.236000 293.596000 602.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 294.616000 614.236000 298.420000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 299.416000 614.236000 306.568000 602.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 306.616000 614.236000 311.428000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 312.316000 614.236000 316.120000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 317.320000 614.236000 324.472000 602.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 325.420000 614.236000 329.224000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 330.220000 614.236000 336.940000 602.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 337.024000 614.236000 344.248000 602.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 344.224000 614.236000 351.952000 602.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 352.024000 614.236000 358.180000 602.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 358.120000 614.236000 362.932000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 362.920000 614.236000 370.072000 602.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 370.024000 614.236000 377.752000 602.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 377.728000 614.236000 382.540000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 383.632000 614.236000 387.436000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 388.528000 614.236000 393.340000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 393.328000 614.236000 400.420000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 400.432000 614.236000 411.808000 602.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 411.832000 614.236000 419.512000 602.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 419.536000 614.236000 426.628000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 426.640000 614.236000 432.376000 602.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 432.340000 614.236000 439.492000 602.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 439.540000 614.236000 444.352000 602.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 444.340000 614.236000 452.068000 602.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 452.044000 614.236000 457.780000 602.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 457.840000 614.236000 464.932000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 464.944000 614.236000 468.748000 602.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 469.744000 614.236000 473.548000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.544000 614.236000 479.284000 602.236000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 480.244000 614.236000 484.048000 602.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 485.248000 614.236000 492.928000 602.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 492.844000 614.236000 499.936000 602.236000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 614.236000 504.044000 602.236000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 600.336000 192.220000 588.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 192.196000 600.336000 196.024000 588.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 196.000000 600.336000 203.680000 588.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 203.704000 600.336000 210.796000 588.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 210.808000 600.336000 218.488000 588.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 218.512000 600.336000 222.316000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 222.316000 600.336000 229.540000 588.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 229.516000 600.336000 237.244000 588.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 237.220000 600.336000 241.024000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 241.024000 600.336000 248.176000 588.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 248.224000 600.336000 252.028000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 252.028000 600.336000 259.756000 588.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 259.732000 600.336000 266.956000 588.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 266.932000 600.336000 272.668000 588.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 272.632000 600.336000 284.008000 588.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 284.032000 600.336000 291.184000 588.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 291.232000 600.336000 295.060000 588.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 295.036000 600.336000 298.840000 588.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 298.840000 600.336000 306.520000 588.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 306.544000 600.336000 313.636000 588.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 313.648000 600.336000 321.328000 588.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 321.352000 600.336000 325.156000 588.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 325.156000 600.336000 328.960000 588.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 580.436000 190.240000 568.436000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 190.204000 580.436000 197.932000 568.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 200.500000 580.436000 204.304000 568.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 206.896000 580.436000 213.052000 568.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 212.992000 580.436000 220.720000 568.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 220.792000 580.436000 232.168000 568.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 232.096000 580.436000 243.472000 568.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 243.496000 580.436000 250.588000 568.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 250.600000 580.436000 256.336000 568.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 256.396000 580.436000 261.208000 568.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 261.196000 580.436000 265.024000 568.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 265.000000 580.436000 276.376000 568.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 276.400000 580.436000 283.492000 568.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 288.604000 580.436000 292.408000 568.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 292.400000 580.436000 298.556000 568.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 298.604000 580.436000 305.756000 568.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 305.708000 580.436000 310.520000 568.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 310.508000 580.436000 314.336000 568.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 314.408000 580.436000 322.136000 568.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 324.608000 580.436000 328.412000 568.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 331.004000 580.436000 337.160000 568.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 337.208000 580.436000 344.936000 568.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 344.912000 580.436000 352.004000 568.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 352.016000 580.436000 359.108000 568.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 359.120000 580.436000 363.932000 568.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 363.920000 580.436000 370.076000 568.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 372.620000 580.436000 376.424000 568.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 379.016000 580.436000 386.168000 568.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 386.216000 580.436000 391.952000 568.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 391.916000 580.436000 399.008000 568.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 401.516000 580.436000 405.320000 568.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 407.912000 580.436000 415.592000 568.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 415.616000 580.436000 419.444000 568.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 419.420000 580.436000 426.512000 568.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 426.524000 580.436000 433.676000 568.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 433.724000 580.436000 439.880000 568.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 439.820000 580.436000 446.972000 568.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 447.020000 580.436000 454.748000 568.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 454.724000 580.436000 459.536000 568.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 459.524000 580.436000 463.352000 568.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 463.424000 580.436000 470.192000 568.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 472.724000 580.436000 476.528000 568.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 479.120000 580.436000 485.840000 568.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 485.816000 580.436000 493.040000 568.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 493.016000 580.436000 500.240000 568.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 500.312000 580.436000 504.140000 568.436000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 580.436000 507.904000 568.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 566.536000 192.652000 554.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 192.700000 566.536000 200.380000 554.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 200.296000 566.536000 207.448000 554.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 207.496000 566.536000 211.324000 554.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 211.300000 566.536000 219.028000 554.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 219.100000 566.536000 225.256000 554.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 225.196000 566.536000 230.008000 554.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 229.996000 566.536000 233.800000 554.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 233.992000 566.536000 238.804000 554.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 238.792000 566.536000 246.520000 554.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 246.592000 566.536000 253.684000 554.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 253.696000 566.536000 257.500000 554.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 257.596000 566.536000 263.752000 554.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 263.800000 566.536000 271.060000 554.536000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 271.000000 566.536000 274.828000 554.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 274.900000 566.536000 282.628000 554.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 282.604000 566.536000 286.408000 554.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 286.408000 566.536000 290.212000 554.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 290.308000 566.536000 302.584000 554.536000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 302.608000 566.536000 309.376000 554.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 309.508000 566.536000 313.312000 554.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 313.504000 566.536000 319.660000 554.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 319.600000 566.536000 327.328000 554.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 327.304000 566.536000 334.396000 554.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 334.504000 566.536000 341.596000 554.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 341.608000 566.536000 346.420000 554.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 346.312000 566.536000 352.468000 554.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 352.516000 566.536000 356.320000 554.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 356.416000 566.536000 363.568000 554.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 363.616000 566.536000 369.352000 554.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 369.316000 566.536000 376.408000 554.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 376.516000 566.536000 380.320000 554.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 380.512000 566.536000 388.192000 554.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 388.108000 566.536000 395.260000 554.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 395.308000 566.536000 401.044000 554.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 401.008000 566.536000 408.268000 554.536000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 408.304000 566.536000 412.108000 554.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 412.300000 566.536000 419.980000 554.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 420.004000 566.536000 423.832000 554.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 423.700000 566.536000 431.428000 554.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 431.404000 566.536000 438.496000 554.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 438.508000 566.536000 442.312000 554.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 442.312000 566.536000 446.116000 554.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 446.416000 566.536000 457.792000 554.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 457.720000 566.536000 464.488000 554.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 464.524000 566.536000 468.328000 554.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 468.424000 566.536000 472.864000 554.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 472.924000 566.536000 480.076000 554.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 480.028000 566.536000 486.796000 554.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 486.832000 566.536000 494.056000 554.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 494.032000 566.536000 499.768000 554.536000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 566.536000 504.044000 554.536000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 552.636000 189.328000 540.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 189.304000 552.636000 194.116000 540.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 194.200000 552.636000 201.292000 540.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 202.000000 552.636000 205.804000 540.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 206.596000 552.636000 213.316000 540.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 213.292000 552.636000 220.516000 540.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 220.492000 552.636000 224.320000 540.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 224.392000 552.636000 231.616000 540.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 231.592000 552.636000 237.328000 540.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 235.996000 552.636000 239.800000 540.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.592000 552.636000 244.396000 540.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.188000 552.636000 249.928000 540.636000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 249.892000 552.636000 257.620000 540.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 258.388000 552.636000 262.192000 540.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.984000 552.636000 273.244000 540.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 273.280000 552.636000 277.108000 540.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 277.084000 552.636000 284.812000 540.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 284.788000 552.636000 289.600000 540.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 289.684000 552.636000 296.776000 540.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 296.788000 552.636000 302.524000 540.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 303.292000 552.636000 307.096000 540.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 307.888000 552.636000 312.628000 540.636000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 313.384000 552.636000 317.188000 540.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 317.980000 552.636000 325.708000 540.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 325.684000 552.636000 332.836000 540.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 332.884000 552.636000 339.652000 540.636000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 339.688000 552.636000 346.780000 540.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 347.488000 552.636000 351.292000 540.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 352.192000 552.636000 359.920000 540.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 359.896000 552.636000 367.120000 540.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 367.192000 552.636000 372.928000 540.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 372.796000 552.636000 384.172000 540.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 384.196000 552.636000 391.348000 540.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 391.300000 552.636000 395.128000 540.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 395.896000 552.636000 399.700000 540.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 400.492000 552.636000 407.212000 540.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 407.296000 552.636000 414.520000 540.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 414.496000 552.636000 419.308000 540.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 419.296000 552.636000 424.108000 540.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 424.192000 552.636000 431.416000 540.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 431.296000 552.636000 439.024000 540.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 439.900000 552.636000 443.704000 540.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 444.496000 552.636000 450.652000 540.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 450.700000 552.636000 458.428000 540.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 458.404000 552.636000 465.496000 540.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 465.508000 552.636000 472.600000 540.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 472.612000 552.636000 477.424000 540.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 477.412000 552.636000 483.568000 540.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 484.312000 552.636000 488.116000 540.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 488.908000 552.636000 496.132000 540.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 496.108000 552.636000 503.836000 540.636000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 552.636000 507.904000 540.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 538.736000 196.876000 526.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 196.900000 538.736000 203.668000 526.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 206.200000 538.736000 210.004000 526.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 212.500000 538.736000 220.180000 526.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 220.204000 538.736000 227.296000 526.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 227.308000 538.736000 234.988000 526.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 235.012000 538.736000 238.816000 526.736000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 241.312000 538.736000 245.116000 526.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 247.708000 538.736000 255.388000 526.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 255.304000 538.736000 263.032000 526.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 263.008000 538.736000 267.820000 526.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 270.412000 538.736000 274.216000 526.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 276.712000 538.736000 281.452000 526.736000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 284.008000 538.736000 287.812000 526.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 290.404000 538.736000 297.496000 526.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 297.508000 538.736000 303.664000 526.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 303.712000 538.736000 311.392000 526.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 311.308000 538.736000 318.400000 526.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 318.412000 538.736000 325.132000 526.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 325.216000 538.736000 329.044000 526.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 329.020000 538.736000 336.172000 526.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 336.220000 538.736000 340.048000 526.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 340.024000 538.736000 343.852000 526.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 343.828000 538.736000 350.596000 526.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 353.128000 538.736000 356.932000 526.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 359.428000 538.736000 363.256000 526.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 363.232000 538.736000 367.060000 526.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 367.132000 538.736000 374.392000 526.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 374.332000 538.736000 381.424000 526.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 383.932000 538.736000 387.736000 526.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 390.436000 538.736000 395.248000 526.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 395.236000 538.736000 402.964000 526.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 403.036000 538.736000 410.128000 526.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 412.540000 538.736000 416.344000 526.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 418.840000 538.736000 429.100000 526.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 429.136000 538.736000 436.288000 526.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 436.240000 538.736000 441.976000 526.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 442.036000 538.736000 453.412000 526.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 458.536000 538.736000 462.340000 526.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 462.500000 538.736000 470.492000 526.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 470.504000 538.736000 477.656000 526.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 477.704000 538.736000 485.432000 526.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.408000 538.736000 493.136000 526.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 493.112000 538.736000 500.204000 526.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 500.216000 538.736000 504.044000 526.736000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 538.736000 507.904000 526.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 524.836000 191.656000 512.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 524.836000 199.432000 512.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 199.408000 524.836000 206.500000 512.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 206.512000 524.836000 213.604000 512.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 213.616000 524.836000 218.428000 512.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 218.416000 524.836000 224.572000 512.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 224.620000 524.836000 228.424000 512.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 228.424000 524.836000 235.648000 512.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 235.624000 524.836000 243.352000 512.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 243.328000 524.836000 247.132000 512.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 247.132000 524.836000 253.900000 512.836000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 253.936000 524.836000 261.028000 512.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 261.040000 524.836000 266.776000 512.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 266.740000 524.836000 273.508000 512.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 273.544000 524.836000 277.348000 512.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.348000 524.836000 284.068000 512.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 284.044000 524.836000 291.268000 512.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 291.244000 524.836000 295.072000 512.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 295.048000 524.836000 302.728000 512.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 302.752000 524.836000 306.556000 512.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 306.556000 524.836000 314.284000 512.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 314.260000 524.836000 318.088000 512.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 318.064000 524.836000 325.744000 512.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 325.768000 524.836000 333.496000 512.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 333.472000 524.836000 338.284000 512.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 338.272000 524.836000 344.428000 512.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.476000 524.836000 348.280000 512.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.280000 524.836000 352.084000 512.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 103 1 0 0 0 1200.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 499.036000 82.132000 487.036000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 82.096000 499.036000 86.200000 487.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 86.200000 499.036000 94.780000 487.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 94.804000 499.036000 103.336000 487.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 103.300000 499.036000 109.036000 487.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.000000 499.036000 113.176000 487.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.200000 499.036000 121.840000 487.036000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 121.804000 499.036000 127.540000 487.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 127.504000 499.036000 135.592000 487.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 135.604000 499.036000 144.136000 487.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 144.100000 499.036000 152.680000 487.036000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 482.036000 195.328000 470.036000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 195.304000 482.036000 203.032000 470.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 203.008000 482.036000 206.812000 470.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 206.812000 482.036000 218.188000 470.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 218.212000 482.036000 224.980000 470.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 225.016000 482.036000 228.820000 470.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 228.820000 482.036000 236.548000 470.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 236.524000 482.036000 240.352000 470.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 240.328000 482.036000 248.008000 470.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 248.032000 482.036000 255.760000 470.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 255.736000 482.036000 260.548000 470.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 260.536000 482.036000 264.580000 470.036000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 264.640000 482.036000 270.796000 470.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 270.844000 482.036000 275.656000 470.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 275.644000 482.036000 282.796000 470.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 282.844000 482.036000 290.572000 470.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 290.548000 482.036000 298.228000 470.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 298.252000 482.036000 302.056000 470.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 302.056000 482.036000 305.884000 470.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 305.860000 482.036000 312.016000 470.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 312.064000 482.036000 315.868000 470.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 315.868000 482.036000 319.588000 470.036000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 319.564000 482.036000 327.292000 470.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 327.268000 482.036000 333.424000 470.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 333.472000 482.036000 338.284000 470.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 338.272000 482.036000 342.076000 470.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 342.076000 482.036000 349.228000 470.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 349.276000 482.036000 353.080000 470.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 353.080000 482.036000 359.236000 470.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 359.284000 482.036000 363.112000 470.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 363.088000 482.036000 370.816000 470.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 370.792000 482.036000 378.472000 470.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 378.496000 482.036000 382.324000 470.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 382.300000 482.036000 389.392000 470.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 389.404000 482.036000 393.208000 470.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 393.208000 482.036000 397.036000 470.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 397.012000 482.036000 404.164000 470.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 404.212000 482.036000 415.588000 470.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 415.612000 482.036000 423.292000 470.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 423.316000 482.036000 427.120000 470.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 427.120000 482.036000 430.924000 470.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 430.924000 482.036000 438.076000 470.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 438.124000 482.036000 445.852000 470.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 445.828000 482.036000 453.508000 470.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.532000 482.036000 457.336000 470.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 457.336000 482.036000 465.064000 470.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 465.040000 482.036000 472.264000 470.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 472.240000 482.036000 477.052000 470.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 477.040000 482.036000 484.768000 470.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 484.744000 482.036000 488.572000 470.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 488.548000 482.036000 496.276000 470.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 496.252000 482.036000 503.932000 470.036000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 482.036000 507.904000 470.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 468.136000 192.592000 456.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 192.604000 468.136000 196.432000 456.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 196.408000 468.136000 202.564000 456.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 202.612000 468.136000 209.704000 456.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 209.716000 468.136000 213.520000 456.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 216.016000 468.136000 219.820000 456.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 222.412000 468.136000 231.076000 456.136000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 231.112000 468.136000 234.940000 456.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 234.916000 468.136000 238.744000 456.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 241.420000 468.136000 245.224000 456.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 247.816000 468.136000 252.628000 456.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 252.616000 468.136000 260.344000 456.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 260.416000 468.136000 267.508000 456.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 269.920000 468.136000 273.724000 456.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 276.424000 468.136000 280.252000 456.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 280.228000 468.136000 287.956000 456.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 288.028000 468.136000 292.840000 456.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 292.732000 468.136000 299.824000 456.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 299.836000 468.136000 305.572000 456.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 305.536000 468.136000 312.628000 456.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 312.640000 468.136000 318.796000 456.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 318.844000 468.136000 323.656000 456.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 323.740000 468.136000 327.568000 456.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 327.544000 468.136000 335.272000 456.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 335.344000 468.136000 343.024000 456.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 345.544000 468.136000 349.348000 456.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 351.940000 468.136000 356.752000 456.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 356.740000 468.136000 364.468000 456.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 364.540000 468.136000 368.368000 456.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 368.344000 468.136000 376.072000 456.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 376.048000 468.136000 383.728000 456.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 383.752000 468.136000 389.908000 456.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 392.452000 468.136000 396.256000 456.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.848000 468.136000 406.000000 456.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 406.048000 468.136000 411.784000 456.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 411.748000 468.136000 418.840000 456.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 421.444000 468.136000 425.248000 456.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 427.840000 468.136000 435.100000 456.136000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 435.136000 468.136000 442.228000 456.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 442.240000 468.136000 449.920000 456.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 449.944000 468.136000 454.756000 456.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 457.240000 468.136000 461.044000 456.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 463.636000 468.136000 467.464000 456.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 467.440000 468.136000 475.168000 456.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 477.844000 468.136000 481.648000 456.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.240000 468.136000 489.052000 456.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.040000 468.136000 496.768000 456.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.840000 468.136000 503.932000 456.136000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 468.136000 507.904000 456.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 454.236000 193.180000 442.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 193.204000 454.236000 198.940000 442.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 198.904000 454.236000 206.056000 442.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 206.104000 454.236000 216.364000 442.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 216.304000 454.236000 223.396000 442.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 223.408000 454.236000 229.144000 442.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 229.204000 454.236000 235.360000 442.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 235.300000 454.236000 239.104000 442.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.604000 454.236000 244.408000 442.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.908000 454.236000 250.648000 442.236000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 250.612000 454.236000 258.340000 442.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 259.816000 454.236000 263.620000 442.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 265.216000 454.236000 270.028000 442.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 270.016000 454.236000 277.744000 442.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 277.816000 454.236000 284.908000 442.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 286.216000 454.236000 290.020000 442.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 291.520000 454.236000 296.332000 442.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 296.320000 454.236000 303.544000 442.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 303.520000 454.236000 311.200000 442.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 312.724000 454.236000 316.528000 442.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 318.124000 454.236000 325.804000 442.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 325.720000 454.236000 331.456000 442.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 331.420000 454.236000 338.572000 442.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 338.620000 454.236000 348.880000 442.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 348.916000 454.236000 356.008000 442.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 356.020000 454.236000 361.756000 442.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 363.124000 454.236000 366.928000 442.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 368.524000 454.236000 375.676000 442.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 375.724000 454.236000 381.460000 442.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 381.328000 454.236000 388.420000 442.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 390.028000 454.236000 393.832000 442.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 395.332000 454.236000 403.060000 442.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 403.036000 454.236000 410.260000 442.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 410.332000 454.236000 416.068000 442.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 416.032000 454.236000 427.408000 442.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 427.432000 454.236000 434.584000 442.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 434.536000 454.236000 438.364000 442.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 438.436000 454.236000 442.240000 442.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 443.536000 454.236000 447.340000 442.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 448.936000 454.236000 456.028000 442.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 456.040000 454.236000 462.808000 442.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 462.736000 454.236000 469.828000 442.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 469.840000 454.236000 475.576000 442.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.540000 454.236000 482.308000 442.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 482.440000 454.236000 490.120000 442.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 490.036000 454.236000 497.188000 442.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 497.236000 454.236000 504.004000 442.236000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 454.236000 507.904000 442.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 440.336000 190.312000 428.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 440.336000 198.028000 428.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.100000 440.336000 201.928000 428.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 201.904000 440.336000 209.632000 428.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 209.608000 440.336000 217.288000 428.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 217.312000 440.336000 223.468000 428.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 225.112000 440.336000 228.916000 428.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 230.512000 440.336000 236.668000 428.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 236.716000 440.336000 244.444000 428.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 244.420000 440.336000 251.140000 428.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 251.116000 440.336000 258.844000 428.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 260.416000 440.336000 264.220000 428.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 265.816000 440.336000 272.968000 428.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 273.016000 440.336000 279.172000 428.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 282.316000 440.336000 286.120000 428.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 286.200000 440.336000 293.352000 428.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 293.400000 440.336000 299.556000 428.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 299.496000 440.336000 307.176000 428.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 307.200000 440.336000 311.028000 428.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 311.004000 440.336000 316.740000 428.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 316.800000 440.336000 320.628000 428.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 320.604000 440.336000 328.332000 428.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 329.904000 440.336000 333.708000 428.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 335.304000 440.336000 342.528000 428.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 342.600000 440.336000 348.336000 428.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 351.504000 440.336000 355.308000 428.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 355.300000 440.336000 364.264000 428.336000 1.000000 0.000000 0.000000 1.000000 K
+drawChar 364.300000 440.336000 368.128000 428.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 368.104000 440.336000 375.196000 428.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 375.208000 440.336000 382.300000 428.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 382.312000 440.336000 390.040000 428.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 390.016000 440.336000 397.108000 428.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 397.120000 440.336000 403.876000 428.336000 1.000000 0.000000 0.000000 1.000000 x
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 403.900000 440.336000 407.704000 428.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.300000 440.336000 413.104000 428.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 414.700000 440.336000 419.440000 428.336000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 419.404000 440.336000 427.132000 428.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 428.800000 440.336000 432.604000 428.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 434.200000 440.336000 439.012000 428.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 439.000000 440.336000 446.728000 428.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 446.800000 440.336000 453.892000 428.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 455.500000 440.336000 459.304000 428.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 460.900000 440.336000 468.580000 428.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 468.604000 440.336000 475.828000 428.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 475.804000 440.336000 480.616000 428.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 480.604000 440.336000 485.416000 428.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 485.500000 440.336000 492.724000 428.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 492.700000 440.336000 504.076000 428.336000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 440.336000 507.904000 428.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 426.436000 193.180000 414.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 193.204000 426.436000 198.940000 414.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 198.904000 426.436000 206.056000 414.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 206.104000 426.436000 216.364000 414.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 216.304000 426.436000 223.396000 414.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 223.408000 426.436000 229.144000 414.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 230.908000 426.436000 234.712000 414.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 236.404000 426.436000 241.144000 414.436000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 242.800000 426.436000 246.604000 414.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 248.404000 426.436000 255.664000 414.436000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 255.700000 426.436000 262.792000 414.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 262.804000 426.436000 269.896000 414.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 269.908000 426.436000 277.588000 414.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 279.208000 426.436000 283.012000 414.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 284.704000 426.436000 291.472000 414.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 291.508000 426.436000 298.660000 414.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 298.612000 426.436000 304.348000 414.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 304.408000 426.436000 308.236000 414.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 308.212000 426.436000 315.436000 414.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 315.412000 426.436000 323.140000 414.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 323.212000 426.436000 329.368000 414.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 331.012000 426.436000 334.816000 414.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 336.616000 426.436000 342.352000 414.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 342.316000 426.436000 349.408000 414.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 349.420000 426.436000 356.572000 414.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 356.524000 426.436000 364.204000 414.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 364.228000 426.436000 368.056000 414.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 368.128000 426.436000 375.856000 414.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 375.832000 426.436000 383.512000 414.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 385.228000 426.436000 389.032000 414.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 390.724000 426.436000 402.100000 414.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 402.124000 426.436000 409.276000 414.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 409.228000 426.436000 414.040000 414.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 414.124000 426.436000 421.216000 414.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 421.228000 426.436000 426.964000 414.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 426.928000 426.436000 430.756000 414.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 430.732000 426.436000 437.884000 414.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 437.932000 426.436000 441.760000 414.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 441.736000 426.436000 447.892000 414.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 449.632000 426.436000 453.436000 414.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 455.128000 426.436000 461.284000 414.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 461.332000 426.436000 469.060000 414.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.036000 426.436000 475.756000 414.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 475.732000 426.436000 483.460000 414.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 485.128000 426.436000 488.932000 414.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 490.624000 426.436000 497.776000 414.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 497.824000 426.436000 503.980000 414.436000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 426.436000 507.904000 414.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 412.536000 193.180000 400.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 193.204000 412.536000 200.428000 400.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 200.404000 412.536000 206.140000 400.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 206.104000 412.536000 209.932000 400.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 209.908000 412.536000 217.636000 400.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 217.612000 412.536000 225.292000 400.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 225.316000 412.536000 229.120000 400.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 229.200000 412.536000 234.012000 400.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 234.000000 412.536000 239.736000 400.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 239.700000 412.536000 246.852000 400.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 246.900000 412.536000 254.580000 400.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 254.604000 412.536000 261.696000 400.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 261.708000 412.536000 265.512000 400.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 265.512000 412.536000 269.232000 400.536000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 269.208000 412.536000 276.432000 400.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 276.408000 412.536000 284.136000 400.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 284.112000 412.536000 289.848000 400.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 289.812000 412.536000 297.540000 400.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 297.516000 412.536000 304.668000 400.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 304.716000 412.536000 308.544000 400.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 308.520000 412.536000 314.676000 400.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 314.724000 412.536000 318.528000 400.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 318.528000 412.536000 322.332000 400.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 322.332000 412.536000 327.144000 400.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 327.132000 412.536000 334.356000 400.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 334.332000 412.536000 338.136000 400.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 338.136000 412.536000 345.816000 400.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 345.840000 412.536000 353.568000 400.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 353.544000 412.536000 358.356000 400.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 358.344000 412.536000 362.148000 400.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 362.148000 412.536000 373.524000 400.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 373.548000 412.536000 380.640000 400.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 380.652000 412.536000 384.456000 400.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 384.456000 412.536000 389.268000 400.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 389.256000 412.536000 396.480000 400.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 396.456000 412.536000 400.260000 400.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 400.260000 412.536000 406.416000 400.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 406.464000 412.536000 410.292000 400.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 410.268000 412.536000 417.360000 400.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 417.372000 412.536000 424.464000 400.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 424.476000 412.536000 432.156000 400.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 432.180000 412.536000 435.984000 400.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 435.984000 412.536000 443.136000 400.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 443.184000 412.536000 447.996000 400.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 447.984000 412.536000 451.788000 400.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 451.788000 412.536000 459.516000 400.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 459.492000 412.536000 463.320000 400.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 463.296000 412.536000 470.976000 400.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 471.000000 412.536000 478.728000 400.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 478.704000 412.536000 483.516000 400.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 483.504000 412.536000 487.308000 400.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 103 1 0 0 0 1200.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 386.736000 85.336000 374.736000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 84.904000 386.736000 92.992000 374.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.004000 386.736000 97.108000 374.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 97.108000 386.736000 105.088000 374.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 105.112000 386.736000 110.092000 374.736000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 110.116000 386.736000 114.220000 374.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 114.220000 386.736000 122.752000 374.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 122.716000 386.736000 126.892000 374.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.916000 386.736000 135.712000 374.736000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 135.712000 386.736000 139.816000 374.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.816000 386.736000 148.060000 374.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.012000 386.736000 155.152000 374.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 155.116000 386.736000 163.252000 374.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 163.216000 386.736000 168.952000 374.736000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 369.736000 193.492000 357.736000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 193.504000 369.736000 201.232000 357.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 201.208000 369.736000 208.300000 357.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 209.812000 369.736000 213.616000 357.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 215.116000 369.736000 225.376000 357.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 225.412000 369.736000 232.564000 357.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 232.516000 369.736000 236.344000 357.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 236.416000 369.736000 243.676000 357.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 243.520000 369.736000 247.564000 357.736000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 247.624000 369.736000 251.452000 357.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 251.428000 369.736000 259.156000 357.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 260.632000 369.736000 264.436000 357.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.032000 369.736000 272.752000 357.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 272.728000 369.736000 276.556000 357.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 276.628000 369.736000 283.852000 357.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 283.828000 369.736000 289.984000 357.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 289.924000 369.736000 297.016000 357.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 297.028000 369.736000 301.840000 357.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 303.424000 369.736000 307.228000 357.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 308.728000 369.736000 312.556000 357.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 312.532000 369.736000 318.688000 357.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 320.236000 369.736000 324.040000 357.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 325.636000 369.736000 331.792000 357.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 331.840000 369.736000 339.520000 357.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 339.436000 369.736000 346.588000 357.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 346.636000 369.736000 353.356000 357.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 353.332000 369.736000 357.160000 357.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 357.232000 369.736000 364.456000 357.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 364.432000 369.736000 372.160000 357.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 372.136000 369.736000 378.292000 357.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 379.840000 369.736000 383.644000 357.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 385.144000 369.736000 392.236000 357.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 392.248000 369.736000 399.976000 357.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 399.952000 369.736000 407.176000 357.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 407.248000 369.736000 414.976000 357.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 414.952000 369.736000 422.632000 357.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 422.656000 369.736000 430.384000 357.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 431.860000 369.736000 435.664000 357.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 437.260000 369.736000 442.072000 357.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 442.060000 369.736000 449.284000 357.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 450.760000 369.736000 454.564000 357.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 456.064000 369.736000 463.216000 357.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 463.264000 369.736000 469.984000 357.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 469.960000 369.736000 474.772000 357.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 474.760000 369.736000 482.488000 357.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 482.464000 369.736000 489.616000 357.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 489.664000 369.736000 493.492000 357.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 493.564000 369.736000 497.392000 357.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 497.368000 369.736000 504.136000 357.736000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 369.736000 508.004000 357.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 355.836000 195.760000 343.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 195.796000 355.836000 202.948000 343.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 202.900000 355.836000 206.728000 343.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 206.800000 355.836000 214.060000 343.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 215.404000 355.836000 219.208000 343.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 220.600000 355.836000 227.752000 343.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 227.800000 355.836000 233.536000 343.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 233.500000 355.836000 240.724000 343.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 240.796000 355.836000 248.524000 343.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 248.500000 355.836000 256.228000 343.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 256.300000 355.836000 263.980000 343.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 265.300000 355.836000 269.104000 343.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 270.604000 355.836000 274.432000 343.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 274.408000 355.836000 282.136000 343.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 282.208000 355.836000 286.012000 343.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 287.404000 355.836000 291.208000 343.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 292.600000 355.836000 299.752000 343.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 299.800000 355.836000 307.528000 343.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 307.504000 355.836000 315.184000 343.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 316.600000 355.836000 320.404000 343.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 321.904000 355.836000 328.996000 343.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 329.008000 355.836000 335.776000 343.836000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 335.812000 355.836000 342.904000 343.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 342.916000 355.836000 350.644000 343.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 352.012000 355.836000 355.816000 343.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 357.208000 355.836000 364.936000 343.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 364.912000 355.836000 372.064000 343.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.112000 355.836000 378.268000 343.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 379.708000 355.836000 383.512000 343.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 385.012000 355.836000 392.164000 343.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 393.508000 355.836000 397.312000 343.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.704000 355.836000 408.964000 343.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 409.000000 355.836000 412.828000 343.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 412.900000 355.836000 420.628000 343.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 420.604000 355.836000 428.284000 343.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 428.308000 355.836000 435.532000 343.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 435.508000 355.836000 445.768000 343.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 444.304000 355.836000 448.108000 343.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 449.500000 355.836000 453.304000 343.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.900000 355.836000 462.052000 343.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 462.100000 355.836000 468.256000 343.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 469.600000 355.836000 473.404000 343.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.796000 355.836000 485.056000 343.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 485.092000 355.836000 492.184000 343.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 492.196000 355.836000 496.024000 343.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 496.000000 355.836000 499.828000 343.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 499.804000 355.836000 503.608000 343.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 355.836000 507.904000 343.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 341.936000 193.492000 329.936000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 193.504000 341.936000 201.232000 329.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 201.208000 341.936000 208.300000 329.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 208.312000 341.936000 212.116000 329.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 212.116000 341.936000 218.836000 329.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 218.812000 341.936000 222.640000 329.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 222.616000 341.936000 229.840000 329.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 229.816000 341.936000 235.972000 329.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 236.020000 341.936000 243.112000 329.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 243.124000 341.936000 247.936000 329.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 247.924000 341.936000 251.728000 329.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 251.728000 341.936000 255.556000 329.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 255.532000 341.936000 261.688000 329.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 261.736000 341.936000 265.540000 329.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 265.540000 341.936000 272.692000 329.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 272.740000 341.936000 280.420000 329.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 280.444000 341.936000 287.668000 329.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 287.644000 341.936000 295.372000 329.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 295.348000 341.936000 300.160000 329.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 300.148000 341.936000 303.952000 329.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 303.952000 341.936000 311.584000 329.936000 1.000000 0.000000 0.000000 1.000000 6
+drawChar 311.548000 341.936000 315.352000 329.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 315.352000 341.936000 319.792000 329.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 319.756000 341.936000 324.568000 329.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 324.556000 341.936000 328.360000 329.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 328.360000 341.936000 332.164000 329.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 332.164000 341.936000 342.424000 329.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 342.460000 341.936000 346.288000 329.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 346.264000 341.936000 353.944000 329.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 353.968000 341.936000 361.060000 329.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 361.072000 341.936000 364.876000 329.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 364.876000 341.936000 372.028000 329.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.076000 341.936000 379.804000 329.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 379.780000 341.936000 387.460000 329.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 387.484000 341.936000 391.288000 329.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 391.288000 341.936000 398.920000 329.936000 1.000000 0.000000 0.000000 1.000000 8
+drawChar 398.884000 341.936000 402.688000 329.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 402.688000 341.936000 407.128000 329.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 407.092000 341.936000 411.904000 329.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 411.892000 341.936000 415.696000 329.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.696000 341.936000 419.500000 329.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 419.500000 341.936000 423.328000 329.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 423.304000 341.936000 430.528000 329.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 430.504000 341.936000 438.232000 329.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 438.208000 341.936000 445.888000 329.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 445.912000 341.936000 449.716000 329.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 322.036000 195.328000 310.036000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 195.304000 322.036000 203.032000 310.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 204.004000 322.036000 207.808000 310.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 208.804000 322.036000 213.616000 310.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 213.604000 322.036000 221.332000 310.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 221.404000 322.036000 228.496000 310.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 229.408000 322.036000 233.212000 310.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 234.208000 322.036000 239.944000 310.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 239.908000 322.036000 243.736000 310.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 243.808000 322.036000 251.488000 310.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 251.512000 322.036000 259.240000 310.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 259.216000 322.036000 264.028000 310.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 265.012000 322.036000 268.816000 310.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 269.812000 322.036000 280.072000 310.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 280.108000 322.036000 287.260000 310.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 287.212000 322.036000 291.040000 310.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 291.112000 322.036000 294.940000 310.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 295.912000 322.036000 299.716000 310.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 300.712000 322.036000 307.864000 310.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 307.912000 322.036000 313.648000 310.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 313.612000 322.036000 320.704000 310.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 321.616000 322.036000 325.420000 310.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 326.416000 322.036000 331.228000 310.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 331.216000 322.036000 341.476000 310.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 341.512000 322.036000 348.736000 310.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 349.708000 322.036000 353.512000 310.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.508000 322.036000 361.228000 310.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 361.204000 322.036000 365.032000 310.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 365.104000 322.036000 372.328000 310.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 372.304000 322.036000 377.116000 310.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 377.104000 322.036000 384.832000 310.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 384.808000 322.036000 391.900000 310.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 391.912000 322.036000 398.068000 310.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 399.016000 322.036000 402.820000 310.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 403.816000 322.036000 409.552000 310.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 409.516000 322.036000 416.740000 310.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 416.812000 322.036000 424.492000 310.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 424.408000 322.036000 430.564000 310.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 430.612000 322.036000 434.416000 310.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 435.412000 322.036000 439.216000 310.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 440.308000 322.036000 447.532000 310.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 447.508000 322.036000 455.236000 310.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 455.308000 322.036000 462.400000 310.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 463.204000 322.036000 467.008000 310.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 468.004000 322.036000 475.156000 310.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 475.204000 322.036000 482.884000 310.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 482.800000 322.036000 490.024000 310.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 490.096000 322.036000 496.864000 310.036000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 496.792000 322.036000 503.884000 310.036000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 322.036000 507.904000 310.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 308.136000 190.312000 296.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 308.136000 198.028000 296.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.100000 308.136000 205.192000 296.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 205.996000 308.136000 209.800000 296.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 210.592000 308.136000 217.816000 296.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 217.792000 308.136000 222.604000 296.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 222.592000 308.136000 230.320000 296.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 230.296000 308.136000 237.388000 296.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 237.400000 308.136000 243.136000 296.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 241.900000 308.136000 245.704000 296.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.496000 308.136000 250.300000 296.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 251.092000 308.136000 260.920000 296.136000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 260.896000 308.136000 268.624000 296.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 269.500000 308.136000 273.304000 296.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 274.096000 308.136000 278.908000 296.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 278.896000 308.136000 286.624000 296.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 286.696000 308.136000 293.788000 296.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 294.496000 308.136000 298.300000 296.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 299.092000 308.136000 302.920000 296.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 302.896000 308.136000 309.988000 296.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 310.000000 308.136000 314.440000 296.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 314.500000 308.136000 319.312000 296.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 320.104000 308.136000 323.908000 296.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 324.808000 308.136000 330.964000 296.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 331.012000 308.136000 334.840000 296.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 334.816000 308.136000 342.496000 296.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 342.412000 308.136000 349.504000 296.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 349.516000 308.136000 353.320000 296.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 354.112000 308.136000 357.916000 296.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 358.816000 308.136000 366.040000 296.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 366.016000 308.136000 373.744000 296.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 373.816000 308.136000 380.908000 296.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 381.616000 308.136000 385.420000 296.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 386.212000 308.136000 391.948000 296.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 391.912000 308.136000 399.136000 296.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 399.208000 308.136000 406.888000 296.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 407.704000 308.136000 411.508000 296.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 412.300000 308.136000 418.036000 296.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 418.000000 308.136000 425.728000 296.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 425.800000 308.136000 433.528000 296.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 433.504000 308.136000 439.660000 296.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 440.404000 308.136000 444.208000 296.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 445.108000 308.136000 452.260000 296.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 452.308000 308.136000 456.136000 296.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 456.004000 308.136000 463.228000 296.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 463.300000 308.136000 471.028000 296.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 471.004000 308.136000 478.684000 296.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 479.500000 308.136000 483.304000 296.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.096000 308.136000 488.908000 296.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 488.896000 308.136000 496.624000 296.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.696000 308.136000 503.788000 296.136000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 308.136000 508.004000 296.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 294.236000 192.592000 282.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 192.604000 294.236000 200.332000 282.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 200.308000 294.236000 205.120000 282.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 205.204000 294.236000 209.032000 282.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 209.008000 294.236000 214.744000 282.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 214.708000 294.236000 221.800000 282.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 221.812000 294.236000 225.616000 282.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 225.808000 294.236000 229.636000 282.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 229.708000 294.236000 236.800000 282.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.812000 294.236000 244.540000 282.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 244.516000 294.236000 252.196000 282.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 252.220000 294.236000 257.032000 282.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 257.020000 294.236000 264.748000 282.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 264.724000 294.236000 268.528000 282.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 268.828000 294.236000 276.052000 282.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 276.028000 294.236000 280.468000 282.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 280.432000 294.236000 284.236000 282.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 284.536000 294.236000 289.348000 282.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 289.336000 294.236000 297.064000 282.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 297.040000 294.236000 304.132000 282.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 304.240000 294.236000 308.044000 282.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 308.140000 294.236000 318.400000 282.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 318.436000 294.236000 325.588000 282.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 325.540000 294.236000 329.368000 282.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 329.440000 294.236000 333.268000 282.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 333.244000 294.236000 337.048000 282.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 337.144000 294.236000 340.948000 282.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 341.044000 294.236000 351.148000 282.236000 1.000000 0.000000 0.000000 1.000000 U
+drawChar 351.148000 294.236000 358.876000 282.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 358.852000 294.236000 366.532000 282.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 366.652000 294.236000 373.744000 282.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 373.756000 294.236000 379.492000 282.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 379.456000 294.236000 387.184000 282.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 387.256000 294.236000 394.348000 282.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 394.360000 294.236000 401.512000 282.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 401.464000 294.236000 406.276000 282.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 406.264000 294.236000 413.992000 282.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 414.064000 294.236000 417.868000 282.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 417.964000 294.236000 421.792000 282.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 421.768000 294.236000 427.924000 282.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 428.068000 294.236000 431.872000 282.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 432.064000 294.236000 439.216000 282.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 439.264000 294.236000 443.068000 282.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 443.164000 294.236000 449.884000 282.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 449.860000 294.236000 457.012000 282.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 457.060000 294.236000 464.740000 282.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 464.764000 294.236000 468.592000 282.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 468.568000 294.236000 476.296000 282.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 476.272000 294.236000 483.364000 282.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 483.472000 294.236000 488.284000 282.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 488.368000 294.236000 492.172000 282.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 492.268000 294.236000 499.492000 282.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 499.468000 294.236000 503.908000 282.236000 1.000000 0.000000 0.000000 1.000000 f
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 294.236000 507.904000 282.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 280.336000 189.328000 268.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 189.304000 280.336000 196.456000 268.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 196.504000 280.336000 202.240000 268.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 202.204000 280.336000 209.884000 268.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 209.908000 280.336000 217.000000 268.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 217.012000 280.336000 220.816000 268.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 220.816000 280.336000 228.496000 268.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 228.520000 280.336000 234.256000 268.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 234.220000 280.336000 241.372000 268.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 241.420000 280.336000 251.680000 268.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 251.716000 280.336000 258.808000 268.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 258.820000 280.336000 264.556000 268.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 264.520000 280.336000 270.676000 268.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 270.724000 280.336000 274.528000 268.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 274.528000 280.336000 278.968000 268.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 278.932000 280.336000 286.156000 268.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 286.132000 280.336000 291.868000 268.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 291.832000 280.336000 295.636000 268.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 295.636000 280.336000 301.792000 268.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 301.840000 280.336000 306.652000 268.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 306.640000 280.336000 313.864000 268.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 313.840000 280.336000 319.576000 268.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 319.540000 280.336000 323.368000 268.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 323.344000 280.336000 331.072000 268.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 331.048000 280.336000 338.728000 268.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 338.752000 280.336000 342.556000 268.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 342.900000 280.336000 349.056000 268.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 349.104000 280.336000 359.364000 268.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 359.400000 280.336000 366.492000 268.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 366.504000 280.336000 373.656000 268.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 373.704000 280.336000 378.516000 268.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 378.504000 280.336000 385.596000 268.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 385.608000 280.336000 391.344000 268.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 391.308000 280.336000 397.464000 268.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 397.512000 280.336000 401.316000 268.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 401.316000 280.336000 405.120000 268.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 405.000000 280.336000 411.156000 268.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 411.204000 280.336000 418.932000 268.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 418.908000 280.336000 426.132000 268.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 426.108000 280.336000 433.200000 268.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 433.212000 280.336000 439.368000 268.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 439.416000 280.336000 443.220000 268.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 443.220000 280.336000 447.024000 268.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 447.000000 280.336000 454.152000 268.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.200000 280.336000 460.920000 268.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 460.896000 280.336000 467.616000 268.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 467.592000 280.336000 474.684000 268.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 474.696000 280.336000 480.852000 268.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 480.900000 280.336000 487.056000 268.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 487.104000 280.336000 494.328000 268.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 494.304000 280.336000 500.040000 268.336000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 280.336000 504.044000 268.336000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 266.436000 189.328000 254.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 189.304000 266.436000 196.396000 254.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 196.408000 266.436000 202.564000 254.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 203.008000 266.436000 206.812000 254.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 207.208000 266.436000 214.432000 254.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 214.408000 266.436000 220.144000 254.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 220.612000 266.436000 224.416000 254.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 224.812000 266.436000 235.072000 254.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 235.108000 266.436000 242.836000 254.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 242.812000 266.436000 249.964000 254.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 250.012000 266.436000 254.824000 254.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 254.812000 266.436000 261.904000 254.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 261.916000 266.436000 268.684000 254.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 268.720000 266.436000 275.812000 254.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 275.824000 266.436000 281.560000 254.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 280.228000 266.436000 284.032000 254.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 284.428000 266.436000 288.232000 254.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.628000 266.436000 299.128000 254.436000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 299.128000 266.436000 306.220000 254.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 306.232000 266.436000 312.988000 254.436000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 313.036000 266.436000 317.848000 254.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 318.232000 266.436000 322.036000 254.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 322.432000 266.436000 327.244000 254.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 327.232000 266.436000 334.456000 254.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 334.828000 266.436000 338.632000 254.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 339.124000 266.436000 343.936000 254.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 343.924000 266.436000 351.652000 254.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 351.724000 266.436000 358.816000 254.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 359.128000 266.436000 362.932000 254.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 363.328000 266.436000 373.588000 254.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 373.624000 266.436000 377.452000 254.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 377.428000 266.436000 385.156000 254.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 385.132000 266.436000 392.812000 254.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 392.836000 266.436000 400.060000 254.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 400.036000 266.436000 410.296000 254.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 410.740000 266.436000 414.544000 254.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 415.036000 266.436000 418.864000 254.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 418.840000 266.436000 424.996000 254.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 425.440000 266.436000 429.244000 254.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.640000 266.436000 436.792000 254.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 437.140000 266.436000 440.944000 254.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 441.340000 266.436000 445.780000 254.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 445.744000 266.436000 453.472000 254.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 453.544000 266.436000 457.372000 254.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 457.348000 266.436000 461.176000 254.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 461.152000 266.436000 465.196000 254.436000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 465.256000 266.436000 469.084000 254.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 469.060000 266.436000 476.152000 254.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 476.164000 266.436000 483.892000 254.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 483.964000 266.436000 491.644000 254.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 491.668000 266.436000 496.480000 254.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 496.468000 266.436000 504.196000 254.436000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 266.436000 507.904000 254.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 252.536000 191.656000 240.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 252.536000 201.964000 240.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 201.904000 252.536000 205.732000 240.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 205.804000 252.536000 212.572000 240.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 212.500000 252.536000 219.592000 240.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 219.604000 252.536000 223.432000 240.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 225.100000 252.536000 228.904000 240.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 230.596000 252.536000 241.972000 240.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 241.996000 252.536000 245.824000 240.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 245.800000 252.536000 251.536000 240.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 251.596000 252.536000 257.332000 240.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 257.296000 252.536000 264.520000 240.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 264.496000 252.536000 270.232000 240.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 271.996000 252.536000 275.800000 240.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.492000 252.536000 284.644000 240.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 284.692000 252.536000 292.420000 240.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 292.288000 252.536000 299.968000 240.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 301.588000 252.536000 305.392000 240.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 307.084000 252.536000 310.912000 240.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 310.888000 252.536000 318.616000 240.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 320.392000 252.536000 324.196000 240.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 325.888000 252.536000 330.700000 240.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 330.688000 252.536000 338.416000 240.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 338.488000 252.536000 345.580000 240.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 347.188000 252.536000 350.992000 240.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 352.684000 252.536000 359.404000 240.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 359.380000 252.536000 366.604000 240.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 366.580000 252.536000 372.316000 240.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 372.376000 252.536000 380.104000 240.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 380.080000 252.536000 387.172000 240.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 387.184000 252.536000 392.920000 240.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 394.588000 252.536000 398.392000 240.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 400.192000 252.536000 404.020000 240.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 403.996000 252.536000 410.152000 240.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 411.796000 252.536000 415.600000 240.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 417.292000 252.536000 424.444000 240.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 426.088000 252.536000 429.892000 240.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 431.584000 252.536000 439.312000 240.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 439.288000 252.536000 446.440000 240.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 446.488000 252.536000 451.300000 240.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 452.884000 252.536000 456.688000 240.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 458.488000 252.536000 465.640000 240.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 465.688000 252.536000 473.416000 240.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 473.284000 252.536000 480.964000 240.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 482.680000 252.536000 486.484000 240.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 488.176000 252.536000 492.988000 240.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 493.072000 252.536000 496.900000 240.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 496.876000 252.536000 503.968000 240.536000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 252.536000 508.004000 240.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 238.636000 191.236000 226.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 191.200000 238.636000 198.352000 226.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 198.400000 238.636000 205.120000 226.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 205.096000 238.636000 212.356000 226.636000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 212.392000 238.636000 216.196000 226.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 216.196000 238.636000 220.000000 226.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 463.300000 86.136000 471.364000 74.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 470.800000 86.136000 477.952000 74.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 478.000000 86.136000 485.680000 74.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 485.704000 86.136000 492.796000 74.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 492.808000 86.136000 496.612000 74.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 496.600000 86.136000 504.232000 74.136000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 6746.400000 0 477.900000 6746.400000 0 477.900000 7056.200000 0 134.300000 7056.200000 0 134.300000 6746.400000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -595450.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 3757.400000 0 168.100000 3757.400000 0 168.100000 3762.400000 0 76.900000 3762.400000 0 76.900000 3757.400000 0
+eoFillPath subpath 1 163.100000 3762.300000 0 168.100000 3762.300000 0 168.100000 3892.900000 0 163.100000 3892.900000 0 163.100000 3762.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 3762.400000 0 163.100000 3762.400000 0 163.100000 3897.800000 0 72.000000 3897.800000 0 72.000000 3762.400000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 3893.480000 87.320000 3883.480000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 3893.480000 93.420000 3883.480000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 3893.480000 97.510000 3883.480000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 3893.480000 101.420000 3883.480000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 3893.480000 104.170000 3883.480000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 3893.480000 110.530000 3883.480000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 3893.480000 113.270000 3883.480000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 3893.480000 116.470000 3883.480000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 3893.480000 123.480000 3883.480000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 3893.480000 129.610000 3883.480000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 3893.480000 135.090000 3883.480000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 3893.480000 140.890000 3883.480000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 3893.480000 144.820000 3883.480000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 3893.480000 150.920000 3883.480000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 3893.480000 153.670000 3883.480000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 3893.480000 156.470000 3883.480000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 3766.600000 0 168.200000 3766.600000 0 168.200000 3881.800000 0 72.000000 3881.800000 0 72.000000 3766.600000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3834.752000 79.253000 3825.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 3834.752000 86.669000 3825.752000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 3834.752000 90.215000 3825.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 3834.752000 93.077000 3825.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 3834.752000 97.406000 3825.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 3834.752000 100.853000 3825.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 3834.752000 107.324000 3825.752000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 3834.752000 112.337000 3825.752000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 3834.752000 115.271000 3825.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 3834.752000 118.655000 3825.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 3834.752000 126.512000 3825.752000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 3834.752000 130.805000 3825.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 3834.752000 135.881000 3825.752000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 3834.752000 139.355000 3825.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 3834.752000 147.284000 3825.752000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 3834.752000 150.074000 3825.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 3834.752000 155.897000 3825.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 3834.752000 158.750000 3825.752000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 3834.752000 161.853000 3825.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3824.252000 82.124000 3815.252000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 3824.252000 87.137000 3815.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 3824.252000 90.071000 3815.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 3824.252000 93.356000 3815.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 3824.252000 100.403000 3815.252000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 3824.252000 104.921000 3815.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 3824.252000 109.205000 3815.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 3824.252000 117.737000 3815.252000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 3824.252000 123.119000 3815.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 3824.252000 128.996000 3815.252000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 3824.252000 132.605000 3815.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 3824.252000 138.392000 3815.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 3824.252000 141.749000 3815.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 3824.252000 149.507000 3815.252000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 3824.252000 153.800000 3815.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 3824.252000 158.876000 3815.252000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 3824.252000 161.853000 3815.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3813.752000 81.764000 3804.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 3813.752000 87.596000 3804.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 3813.752000 93.356000 3804.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 3813.752000 102.050000 3804.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 3813.752000 113.822000 3804.752000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 3813.752000 122.651000 3804.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 3813.752000 134.117000 3804.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 3813.752000 138.401000 3804.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 3813.752000 147.149000 3804.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 3813.752000 158.921000 3804.752000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 3813.752000 161.853000 3804.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3803.252000 79.271000 3794.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 3803.252000 84.338000 3794.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 3803.252000 89.621000 3794.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 3803.252000 94.643000 3794.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 3803.252000 100.502000 3794.252000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 3803.252000 106.262000 3794.252000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 3803.252000 111.518000 3794.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 3803.252000 116.216000 3794.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 3803.252000 119.249000 3794.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 3803.252000 122.363000 3794.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 3803.252000 128.186000 3794.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 3803.252000 131.345000 3794.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 3803.252000 137.060000 3794.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 3803.252000 140.147000 3794.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 3803.252000 145.007000 3794.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 3803.252000 148.598000 3794.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 3803.252000 151.460000 3794.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 3803.252000 155.789000 3794.252000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 3803.252000 158.933000 3794.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3792.752000 80.702000 3783.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 3792.752000 83.573000 3783.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 3792.752000 89.396000 3783.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 3792.752000 95.156000 3783.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 3792.752000 100.547000 3783.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 3792.752000 109.052000 3783.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 3792.752000 111.959000 3783.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 3792.752000 117.251000 3783.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 3792.752000 121.904000 3783.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 3792.752000 126.503000 3783.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 3792.752000 129.338000 3783.752000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 3792.752000 134.936000 3783.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 3792.752000 143.441000 3783.752000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 3792.752000 148.796000 3783.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 3792.752000 154.574000 3783.752000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 3792.752000 158.876000 3783.752000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 3792.752000 161.853000 3783.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3782.252000 79.271000 3773.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 3782.252000 85.094000 3773.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 3782.252000 88.703000 3773.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 3782.252000 94.112000 3773.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 3782.252000 97.244000 3773.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 3782.252000 103.058000 3773.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 3782.252000 108.890000 3773.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 3782.252000 111.950000 3773.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 3782.252000 115.271000 3773.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 3782.252000 120.338000 3773.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 3782.252000 125.621000 3773.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 3782.252000 131.363000 3773.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 3782.252000 134.558000 3773.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 3782.252000 140.048000 3773.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 3782.252000 145.430000 3773.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 3782.252000 150.551000 3773.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 3782.252000 155.960000 3773.252000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 3782.252000 158.933000 3773.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3771.752000 80.009000 3762.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 3771.752000 85.364000 3762.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 3771.752000 88.271000 3762.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 3771.752000 91.169000 3762.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 3771.752000 97.955000 3762.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 3771.752000 107.765000 3762.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 3771.752000 110.672000 3762.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 3771.752000 115.964000 3762.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 3771.752000 120.617000 3762.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 3771.752000 125.216000 3762.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 3771.752000 128.051000 3762.752000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 3771.752000 134.954000 3762.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 3771.752000 146.285000 3762.752000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 3771.752000 151.667000 3762.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 3771.752000 155.906000 3762.752000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 3771.752000 159.033000 3762.752000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 3762.300000 0 72.100000 3762.300000 0 72.100000 3897.800000 0 72.000000 3897.800000 0 72.000000 3762.300000 0
+eoFillPath subpath 1 163.100000 3762.300000 0 163.200000 3762.300000 0 163.200000 3897.800000 0 163.100000 3897.800000 0 163.100000 3762.300000 0
+eoFillPath subpath 1 72.000000 3897.700000 0 163.200000 3897.700000 0 163.200000 3897.800000 0 72.000000 3897.800000 0 72.000000 3897.700000 0
+eoFillPath subpath 1 72.000000 3762.300000 0 163.200000 3762.300000 0 163.200000 3762.400000 0 72.000000 3762.400000 0 72.000000 3762.300000 0
+saveState
+eoClipPath subpath 1 96.900000 3837.600000 0 138.300000 3837.600000 0 138.300000 3881.800000 0 96.900000 3881.800000 0 96.900000 3837.600000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -304570.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 3482.800000 0 165.500000 3482.800000 0 165.500000 3487.800000 0 76.900000 3487.800000 0 76.900000 3482.800000 0
+eoFillPath subpath 1 160.500000 3487.700000 0 165.500000 3487.700000 0 165.500000 3644.000000 0 160.500000 3644.000000 0 160.500000 3487.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 3487.800000 0 121.400000 3487.800000 0 121.400000 3648.900000 0 72.000000 3648.900000 0 72.000000 3487.800000 0
+saveState
+eoClipPath subpath 1 72.000000 3487.700000 0 160.500000 3487.700000 0 160.500000 3648.800000 0 72.000000 3648.800000 0 72.000000 3487.700000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -267870.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 3644.580000 89.280000 3634.580000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 3644.580000 95.630000 3634.580000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 3644.580000 99.520000 3634.580000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 3644.580000 102.270000 3634.580000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 3644.580000 108.450000 3634.580000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 3644.580000 112.610000 3634.580000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 3644.580000 118.510000 3634.580000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 3644.580000 121.670000 3634.580000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 3644.580000 124.470000 3634.580000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 3644.580000 130.830000 3634.580000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 3644.580000 133.970000 3634.580000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 3644.580000 137.920000 3634.580000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 3644.580000 144.230000 3634.580000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 3644.580000 150.350000 3634.580000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 3644.580000 153.570000 3634.580000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 3632.880000 95.000000 3622.880000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 3632.880000 97.770000 3622.880000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 3632.880000 103.000000 3622.880000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 3632.880000 109.330000 3622.880000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 3632.880000 117.470000 3622.880000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 3632.880000 123.620000 3622.880000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 3632.880000 128.800000 3622.880000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 3632.880000 135.130000 3622.880000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 3632.880000 141.250000 3622.880000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 3632.880000 145.410000 3622.880000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3618.052000 82.961000 3609.052000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 3618.052000 87.614000 3609.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 3618.052000 93.356000 3609.052000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 3618.052000 98.612000 3609.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 3618.052000 103.733000 3609.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 3618.052000 106.568000 3609.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 3618.052000 111.959000 3609.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 3618.052000 114.866000 3609.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 3618.052000 117.665000 3609.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 3618.052000 122.768000 3609.052000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 3618.052000 125.747000 3609.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 3618.052000 131.651000 3609.052000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 3618.052000 136.907000 3609.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 3618.052000 142.307000 3609.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 3618.052000 148.049000 3609.052000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 3618.052000 150.956000 3609.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 3618.052000 156.302000 3609.052000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3618.052000 159.253000 3609.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3607.552000 84.095000 3598.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 3607.552000 89.900000 3598.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 3607.552000 95.318000 3598.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 3607.552000 100.349000 3598.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 3607.552000 110.789000 3598.552000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 3607.552000 111.464000 3598.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 3607.552000 114.362000 3598.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 3607.552000 119.348000 3598.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 3607.552000 126.962000 3598.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 3607.552000 132.047000 3598.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 3607.552000 139.958000 3598.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 3607.552000 142.865000 3598.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 3607.552000 147.410000 3598.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 3607.552000 153.287000 3598.552000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 3607.552000 156.333000 3598.552000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3597.052000 84.095000 3588.052000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 3597.052000 89.468000 3588.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 3597.052000 94.121000 3588.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 3597.052000 99.899000 3588.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 3597.052000 105.218000 3588.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 3597.052000 109.502000 3588.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 3597.052000 115.649000 3588.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 3597.052000 122.327000 3588.052000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 3597.052000 127.718000 3588.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 3597.052000 132.002000 3588.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 3597.052000 138.149000 3588.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 3597.052000 145.205000 3588.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 3597.052000 150.992000 3588.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 3597.052000 156.311000 3588.052000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3597.052000 159.253000 3588.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3586.552000 82.394000 3577.552000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 3586.552000 86.705000 3577.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 3586.552000 91.322000 3577.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 3586.552000 94.913000 3577.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 3586.552000 98.054000 3577.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 3586.552000 102.014000 3577.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 3586.552000 104.876000 3577.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 3586.552000 113.435000 3577.552000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 3586.552000 118.718000 3577.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 3586.552000 121.949000 3577.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 3586.552000 125.063000 3577.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 3586.552000 130.886000 3577.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 3586.552000 134.045000 3577.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 3586.552000 138.005000 3577.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 3586.552000 143.792000 3577.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 3586.552000 149.111000 3577.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 3586.552000 151.964000 3577.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 3586.552000 156.293000 3577.552000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 3586.552000 159.153000 3577.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3576.052000 79.271000 3567.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 3576.052000 82.169000 3567.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 3576.052000 85.526000 3567.052000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 3576.052000 90.818000 3567.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 3576.052000 94.454000 3567.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 3576.052000 99.008000 3567.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 3576.052000 104.318000 3567.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 3576.052000 110.096000 3567.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 3576.052000 115.856000 3567.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 3576.052000 119.546000 3567.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 3576.052000 124.001000 3567.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 3576.052000 129.509000 3567.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 3576.052000 133.145000 3567.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 3576.052000 139.751000 3567.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 3576.052000 145.205000 3567.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 3576.052000 148.841000 3567.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 3576.052000 152.657000 3567.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 3576.052000 156.293000 3567.052000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3576.052000 159.253000 3567.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3565.552000 84.095000 3556.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 3565.552000 88.406000 3556.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 3565.552000 93.824000 3556.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 3565.552000 99.602000 3556.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 3565.552000 105.362000 3556.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 3565.552000 108.422000 3556.552000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 3565.552000 116.747000 3556.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 3565.552000 129.275000 3556.552000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 3565.552000 135.089000 3556.552000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 3565.552000 138.698000 3556.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 3565.552000 141.560000 3556.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 3565.552000 146.906000 3556.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 3565.552000 151.190000 3556.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 3565.552000 156.266000 3556.552000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3565.552000 159.253000 3556.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3555.052000 82.196000 3546.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 3555.052000 87.560000 3546.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 3555.052000 92.213000 3546.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 3555.052000 96.551000 3546.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 3555.052000 101.708000 3546.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 3555.052000 107.216000 3546.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 3555.052000 111.653000 3546.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 3555.052000 118.961000 3546.052000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 3555.052000 124.316000 3546.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 3555.052000 128.654000 3546.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 3555.052000 133.172000 3546.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 3555.052000 138.995000 3546.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 3555.052000 143.612000 3546.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 3555.052000 148.913000 3546.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 3555.052000 153.197000 3546.052000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 3555.052000 156.333000 3546.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3544.552000 80.009000 3535.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 3544.552000 85.319000 3535.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 3544.552000 91.061000 3535.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 3544.552000 100.052000 3535.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 3544.552000 113.993000 3535.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 3544.552000 116.873000 3535.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 3544.552000 120.410000 3535.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 3544.552000 126.296000 3535.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 3544.552000 135.350000 3535.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 3544.552000 145.106000 3535.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 3544.552000 150.893000 3535.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 3544.552000 156.212000 3535.552000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3544.552000 159.253000 3535.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3534.052000 82.196000 3525.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 3534.052000 87.560000 3525.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 3534.052000 93.392000 3525.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 3534.052000 99.152000 3525.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 3534.052000 101.960000 3525.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 3534.052000 107.306000 3525.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 3534.052000 111.905000 3525.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 3534.052000 115.640000 3525.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 3534.052000 122.444000 3525.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 3534.052000 127.898000 3525.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 3534.052000 135.575000 3525.052000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 3534.052000 141.380000 3525.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 3534.052000 145.241000 3525.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 3534.052000 150.803000 3525.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 3534.052000 156.302000 3525.052000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3534.052000 159.253000 3525.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3523.552000 80.009000 3514.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 3523.552000 85.796000 3514.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 3523.552000 91.115000 3514.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 3523.552000 95.399000 3514.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 3523.552000 100.718000 3514.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 3523.552000 107.054000 3514.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 3523.552000 118.097000 3514.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 3523.552000 123.524000 3514.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 3523.552000 129.401000 3514.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 3523.552000 131.768000 3514.552000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 3523.552000 135.413000 3514.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 3523.552000 141.659000 3514.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 3523.552000 150.965000 3514.552000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 3523.552000 156.320000 3514.552000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3523.552000 159.253000 3514.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3513.052000 81.017000 3504.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 3513.052000 84.608000 3504.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 3513.052000 89.963000 3504.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 3513.052000 92.870000 3504.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 3513.052000 98.693000 3504.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 3513.052000 103.310000 3504.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 3513.052000 107.243000 3504.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 3513.052000 116.081000 3504.052000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 3513.052000 121.886000 3504.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 3513.052000 127.205000 3504.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 3513.052000 132.983000 3504.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 3513.052000 136.943000 3504.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 3513.052000 143.846000 3504.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 3513.052000 148.184000 3504.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 3513.052000 153.260000 3504.052000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 3513.052000 156.433000 3504.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3502.552000 79.271000 3493.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 3502.552000 85.094000 3493.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 3502.552000 90.854000 3493.552000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 3502.552000 93.653000 3493.552000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 3487.700000 0 72.100000 3487.700000 0 72.100000 3648.900000 0 72.000000 3648.900000 0 72.000000 3487.700000 0
+eoFillPath subpath 1 160.500000 3487.700000 0 160.600000 3487.700000 0 160.600000 3648.900000 0 160.500000 3648.900000 0 160.500000 3487.700000 0
+eoFillPath subpath 1 72.000000 3648.800000 0 160.600000 3648.800000 0 160.600000 3648.900000 0 72.000000 3648.900000 0 72.000000 3648.800000 0
+eoFillPath subpath 1 72.000000 3487.700000 0 160.600000 3487.700000 0 160.600000 3487.800000 0 72.000000 3487.800000 0 72.000000 3487.700000 0
+saveState
+eoClipPath subpath 1 108.000000 3000.300000 0 178.900000 3000.300000 0 178.900000 3057.000000 0 108.000000 3057.000000 0 108.000000 3000.300000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -220840.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -1058.100000 0 165.500000 -1058.100000 0 165.500000 -1053.100000 0 76.900000 -1053.100000 0 76.900000 -1058.100000 0
+eoFillPath subpath 1 160.500000 -1053.200000 0 165.500000 -1053.200000 0 165.500000 -944.400000 0 160.500000 -944.400000 0 160.500000 -1053.200000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -1053.100000 0 160.500000 -1053.100000 0 160.500000 -939.500000 0 72.000000 -939.500000 0 72.000000 -1053.100000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -943.848000 83.771000 -952.848000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 -943.848000 89.594000 -952.848000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 -943.848000 92.465000 -952.848000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 -943.848000 97.568000 -952.848000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 -943.848000 100.943000 -952.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 -943.848000 106.955000 -952.848000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 -943.848000 110.447000 -952.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 -943.848000 114.425000 -952.848000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 -943.848000 119.717000 -952.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 -943.848000 127.493000 -952.848000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 -943.848000 130.949000 -952.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 -943.848000 136.574000 -952.848000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 -943.848000 141.920000 -952.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 -943.848000 147.365000 -952.848000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 -943.848000 151.703000 -952.848000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 -943.848000 156.320000 -952.848000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -943.848000 159.153000 -952.848000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -954.348000 81.764000 -963.348000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -954.348000 85.130000 -963.348000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 -954.348000 88.712000 -963.348000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 -954.348000 94.022000 -963.348000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 -954.348000 98.306000 -963.348000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -954.348000 102.455000 -963.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 -954.348000 106.676000 -963.348000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 -954.348000 110.312000 -963.348000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 -954.348000 114.920000 -963.348000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 -954.348000 119.060000 -963.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 -954.348000 125.450000 -963.348000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 -954.348000 130.832000 -963.348000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 -954.348000 139.445000 -963.348000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 -954.348000 145.169000 -963.348000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 -954.348000 148.076000 -963.348000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 -954.348000 153.323000 -963.348000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -954.348000 156.433000 -963.348000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -964.848000 80.009000 -973.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -964.848000 82.871000 -973.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 -964.848000 88.316000 -973.848000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 -964.848000 94.094000 -973.848000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 -964.848000 96.947000 -973.848000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 -964.848000 104.948000 -973.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 -964.848000 113.705000 -973.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 -964.848000 119.492000 -973.848000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 -964.848000 124.811000 -973.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 -964.848000 132.848000 -973.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 -964.848000 141.605000 -973.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 -964.848000 144.467000 -973.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 -964.848000 148.103000 -973.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 -964.848000 150.965000 -973.848000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 -964.848000 156.311000 -973.848000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -964.848000 159.253000 -973.848000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -975.348000 80.999000 -984.348000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 -975.348000 90.539000 -984.348000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 -975.348000 95.318000 -984.348000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 -975.348000 99.602000 -984.348000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -975.348000 102.473000 -984.348000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 -975.348000 108.260000 -984.348000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 -975.348000 110.762000 -984.348000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 -975.348000 115.316000 -984.348000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 -975.348000 122.156000 -984.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 -975.348000 132.299000 -984.348000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 -975.348000 136.970000 -984.348000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 -975.348000 139.877000 -984.348000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 -975.348000 142.775000 -984.348000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 -975.348000 148.022000 -984.348000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 -975.348000 152.720000 -984.348000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 -975.348000 156.311000 -984.348000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -975.348000 159.253000 -984.348000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -985.848000 83.006000 -994.848000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 -985.848000 88.793000 -994.848000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 -985.848000 91.664000 -994.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 -985.848000 94.562000 -994.848000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 -985.848000 100.349000 -994.848000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 -985.848000 103.157000 -994.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 -985.848000 108.980000 -994.848000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 -985.848000 114.740000 -994.848000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 -985.848000 119.375000 -994.848000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 -985.848000 128.033000 -994.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 -985.848000 141.479000 -994.848000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 -985.848000 146.807000 -994.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -985.848000 152.684000 -994.848000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 -985.848000 156.293000 -994.848000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -985.848000 159.253000 -994.848000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -996.348000 79.730000 -1005.348000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 -996.348000 84.005000 -1005.348000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 -996.348000 89.423000 -1005.348000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 -996.348000 98.036000 -1005.348000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 -996.348000 121.157000 -1005.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 -996.348000 145.115000 -1005.348000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 -996.348000 151.001000 -1005.348000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 -996.348000 156.320000 -1005.348000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -996.348000 159.253000 -1005.348000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1006.848000 83.285000 -1015.848000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 -1006.848000 89.099000 -1015.848000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 -1006.848000 93.401000 -1015.848000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 -1006.848000 98.477000 -1015.848000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 -1006.848000 103.121000 -1015.848000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 -1006.848000 105.974000 -1015.848000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 -1006.848000 111.320000 -1015.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 -1006.848000 115.604000 -1015.848000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 -1006.848000 123.857000 -1015.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 -1006.848000 136.007000 -1015.848000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 -1006.848000 141.794000 -1015.848000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 -1006.848000 144.665000 -1015.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 -1006.848000 147.464000 -1015.848000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 -1006.848000 153.251000 -1015.848000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -1006.848000 156.433000 -1015.848000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1017.348000 79.271000 -1026.348000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -1017.348000 85.094000 -1026.348000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -1017.348000 90.854000 -1026.348000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 -1017.348000 96.146000 -1026.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 -1017.348000 102.302000 -1026.348000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 -1017.348000 107.711000 -1026.348000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 -1017.348000 113.048000 -1026.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 -1017.348000 119.204000 -1026.348000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 -1017.348000 124.991000 -1026.348000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 -1017.348000 130.310000 -1026.348000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 -1017.348000 135.647000 -1026.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 -1017.348000 144.755000 -1026.348000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 -1017.348000 153.323000 -1026.348000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -1017.348000 156.333000 -1026.348000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1027.848000 82.160000 -1036.848000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 -1027.848000 85.067000 -1036.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 -1027.848000 89.297000 -1036.848000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 -1027.848000 94.616000 -1036.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 -1027.848000 98.747000 -1036.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 -1027.848000 106.055000 -1036.848000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 -1027.848000 109.700000 -1036.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 -1027.848000 115.055000 -1036.848000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 -1027.848000 118.601000 -1036.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 -1027.848000 124.010000 -1036.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 -1027.848000 128.042000 -1036.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 -1027.848000 135.998000 -1036.848000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 -1027.848000 141.785000 -1036.848000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 -1027.848000 144.656000 -1036.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 -1027.848000 147.554000 -1036.848000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 -1027.848000 153.341000 -1036.848000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -1027.848000 156.433000 -1036.848000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -1038.348000 79.271000 -1047.348000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -1038.348000 85.094000 -1047.348000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -1038.348000 90.854000 -1047.348000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 -1038.348000 93.743000 -1047.348000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -1053.200000 0 72.100000 -1053.200000 0 72.100000 -939.500000 0 72.000000 -939.500000 0 72.000000 -1053.200000 0
+eoFillPath subpath 1 160.500000 -1053.200000 0 160.600000 -1053.200000 0 160.600000 -939.500000 0 160.500000 -939.500000 0 160.500000 -1053.200000 0
+eoFillPath subpath 1 72.000000 -939.600000 0 160.600000 -939.600000 0 160.600000 -939.500000 0 72.000000 -939.500000 0 72.000000 -939.600000 0
+eoFillPath subpath 1 72.000000 -1053.200000 0 160.600000 -1053.200000 0 160.600000 -1053.100000 0 72.000000 -1053.100000 0 72.000000 -1053.200000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 5136.400000 0 169.600000 5136.400000 0 169.600000 5141.400000 0 76.900000 5141.400000 0 76.900000 5136.400000 0
+eoFillPath subpath 1 164.600000 5141.300000 0 169.600000 5141.300000 0 169.600000 5256.900000 0 164.600000 5256.900000 0 164.600000 5141.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 5141.400000 0 121.400000 5141.400000 0 121.400000 5261.800000 0 72.000000 5261.800000 0 72.000000 5141.400000 0
+saveState
+eoClipPath subpath 1 72.000000 5141.300000 0 164.600000 5141.300000 0 164.600000 5261.700000 0 72.000000 5261.700000 0 72.000000 5141.300000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -429110.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 5211.300000 0 93.700000 5211.300000 0 93.700000 5230.500000 0 72.000000 5230.500000 0 72.000000 5211.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 5211.300000 0 169.600000 5211.300000 0 169.600000 5230.500000 0 93.700000 5230.500000 0 93.700000 5211.300000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 5194.600000 0 93.700000 5194.600000 0 93.700000 5211.300000 0 72.000000 5211.300000 0 72.000000 5194.600000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 5194.600000 0 169.600000 5194.600000 0 169.600000 5211.300000 0 93.700000 5211.300000 0 93.700000 5194.600000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 5175.400000 0 93.700000 5175.400000 0 93.700000 5194.600000 0 72.000000 5194.600000 0 72.000000 5175.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 5175.400000 0 169.600000 5175.400000 0 169.600000 5194.600000 0 93.700000 5194.600000 0 93.700000 5175.400000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 5156.200000 0 93.700000 5156.200000 0 93.700000 5175.400000 0 72.000000 5175.400000 0 72.000000 5156.200000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 5156.200000 0 169.600000 5156.200000 0 169.600000 5175.400000 0 93.700000 5175.400000 0 93.700000 5156.200000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5257.452000 82.898000 5248.452000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 5257.452000 87.200000 5248.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 5257.452000 90.809000 5248.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 5257.452000 93.671000 5248.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 5257.452000 98.315000 5248.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 5257.452000 101.906000 5248.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 5257.452000 106.514000 5248.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 5257.452000 109.754000 5248.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 5257.452000 112.868000 5248.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 5257.452000 118.691000 5248.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 5257.452000 121.850000 5248.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 5257.452000 125.702000 5248.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 5257.452000 131.588000 5248.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 5257.452000 136.907000 5248.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 5257.452000 140.039000 5248.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 5257.452000 146.078000 5248.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 5257.452000 151.442000 5248.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 5257.452000 154.349000 5248.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 5257.452000 157.148000 5248.452000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 5257.452000 160.433000 5248.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5246.952000 84.095000 5237.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 5246.952000 89.468000 5237.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 5246.952000 94.580000 5237.952000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 5246.952000 97.631000 5237.952000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 5226.552000 104.443000 5217.552000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 5226.552000 109.060000 5217.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 5226.552000 113.398000 5217.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 5226.552000 119.194000 5217.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 5226.552000 124.612000 5217.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 5226.552000 127.465000 5217.552000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 5209.852000 101.176000 5200.852000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 5209.852000 104.074000 5200.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 5209.852000 109.420000 5200.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 5209.852000 114.442000 5200.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 5209.852000 120.202000 5200.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 5209.852000 123.811000 5200.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 5209.852000 129.121000 5200.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 5209.852000 134.899000 5200.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 5209.852000 139.516000 5200.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 5209.852000 143.107000 5200.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 5209.852000 148.417000 5200.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 5209.852000 151.270000 5200.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 5209.852000 157.093000 5200.852000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 5193.152000 103.048000 5184.152000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 5193.152000 108.421000 5184.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 5193.152000 113.443000 5184.152000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 5193.152000 118.852000 5184.152000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 5193.152000 124.702000 5184.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 5193.152000 130.021000 5184.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 5193.152000 135.079000 5184.152000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 5173.952000 104.407000 5164.952000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 5173.952000 109.816000 5164.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 5173.952000 115.594000 5164.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 5173.952000 121.354000 5164.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 5173.952000 125.692000 5164.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 5173.952000 128.563000 5164.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 5173.952000 133.954000 5164.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 5173.952000 139.786000 5164.952000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 5141.300000 0 72.100000 5141.300000 0 72.100000 5261.800000 0 72.000000 5261.800000 0 72.000000 5141.300000 0
+eoFillPath subpath 1 164.600000 5141.300000 0 164.700000 5141.300000 0 164.700000 5261.800000 0 164.600000 5261.800000 0 164.600000 5141.300000 0
+eoFillPath subpath 1 72.000000 5261.700000 0 164.700000 5261.700000 0 164.700000 5261.800000 0 72.000000 5261.800000 0 72.000000 5261.700000 0
+eoFillPath subpath 1 72.000000 5141.300000 0 164.700000 5141.300000 0 164.700000 5141.400000 0 72.000000 5141.400000 0 72.000000 5141.300000 0
+eoFillPath subpath 1 91.300000 5156.200000 0 93.700000 5156.200000 0 93.700000 5230.500000 0 91.300000 5230.500000 0 91.300000 5156.200000 0
+eoFillPath subpath 1 72.000000 5175.400000 0 169.600000 5175.400000 0 169.600000 5177.800000 0 72.000000 5177.800000 0 72.000000 5175.400000 0
+eoFillPath subpath 1 72.000000 5228.100000 0 169.600000 5228.100000 0 169.600000 5230.500000 0 72.000000 5230.500000 0 72.000000 5228.100000 0
+eoFillPath subpath 1 72.000000 5156.200000 0 169.600000 5156.200000 0 169.600000 5158.600000 0 72.000000 5158.600000 0 72.000000 5156.200000 0
+saveState
+eoClipPath subpath 1 108.000000 -2709.800000 0 150.800000 -2709.800000 0 150.800000 -2665.600000 0 108.000000 -2665.600000 0 108.000000 -2709.800000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 350180.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 -3559.800000 0 499.600000 -3559.800000 0 499.600000 -3554.700000 0 186.800000 -3554.700000 0 186.800000 -3559.800000 0
+eoFillPath subpath 1 494.500000 -3554.800000 0 499.600000 -3554.800000 0 499.600000 -3366.400000 0 494.500000 -3366.400000 0 494.500000 -3554.800000 0
+saveState
+eoClipPath subpath 1 181.800000 -3554.700000 0 494.500000 -3554.700000 0 494.500000 -3361.400000 0 181.800000 -3361.400000 0 181.800000 -3554.700000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 -3361.400000 0 494.500000 -3361.400000 0 494.500000 -3361.400000 0 181.700000 -3361.400000 0
+eoFillPath subpath 1 181.700000 -3361.400000 0 494.500000 -3361.400000 0 494.500000 -3362.100000 0 181.700000 -3362.100000 0 181.700000 -3361.400000 0
+eoFillPath subpath 1 181.700000 -3362.100000 0 494.500000 -3362.100000 0 494.500000 -3362.900000 0 181.700000 -3362.900000 0 181.700000 -3362.100000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 -3362.900000 0 494.500000 -3362.900000 0 494.500000 -3363.600000 0 181.700000 -3363.600000 0 181.700000 -3362.900000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 -3363.600000 0 494.500000 -3363.600000 0 494.500000 -3364.400000 0 181.700000 -3364.400000 0 181.700000 -3363.600000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 -3364.400000 0 494.500000 -3364.400000 0 494.500000 -3365.100000 0 181.700000 -3365.100000 0 181.700000 -3364.400000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 -3365.100000 0 494.500000 -3365.100000 0 494.500000 -3365.900000 0 181.700000 -3365.900000 0 181.700000 -3365.100000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 -3365.900000 0 494.500000 -3365.900000 0 494.500000 -3366.700000 0 181.700000 -3366.700000 0 181.700000 -3365.900000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 -3366.700000 0 494.500000 -3366.700000 0 494.500000 -3367.400000 0 181.700000 -3367.400000 0 181.700000 -3366.700000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 -3367.400000 0 494.500000 -3367.400000 0 494.500000 -3368.200000 0 181.700000 -3368.200000 0 181.700000 -3367.400000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 -3368.200000 0 494.500000 -3368.200000 0 494.500000 -3368.900000 0 181.700000 -3368.900000 0 181.700000 -3368.200000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 -3368.900000 0 494.500000 -3368.900000 0 494.500000 -3369.700000 0 181.700000 -3369.700000 0 181.700000 -3368.900000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 -3369.700000 0 494.500000 -3369.700000 0 494.500000 -3370.500000 0 181.700000 -3370.500000 0 181.700000 -3369.700000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 -3370.500000 0 494.500000 -3370.500000 0 494.500000 -3371.200000 0 181.700000 -3371.200000 0 181.700000 -3370.500000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 -3371.200000 0 494.500000 -3371.200000 0 494.500000 -3372.000000 0 181.700000 -3372.000000 0 181.700000 -3371.200000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 -3372.000000 0 494.500000 -3372.000000 0 494.500000 -3372.700000 0 181.700000 -3372.700000 0 181.700000 -3372.000000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 -3372.700000 0 494.500000 -3372.700000 0 494.500000 -3373.500000 0 181.700000 -3373.500000 0 181.700000 -3372.700000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 -3373.500000 0 494.500000 -3373.500000 0 494.500000 -3374.200000 0 181.700000 -3374.200000 0 181.700000 -3373.500000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 -3374.200000 0 494.500000 -3374.200000 0 494.500000 -3375.000000 0 181.700000 -3375.000000 0 181.700000 -3374.200000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 -3375.000000 0 494.500000 -3375.000000 0 494.500000 -3375.800000 0 181.700000 -3375.800000 0 181.700000 -3375.000000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 -3375.800000 0 494.500000 -3375.800000 0 494.500000 -3376.500000 0 181.700000 -3376.500000 0 181.700000 -3375.800000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 -3376.500000 0 494.500000 -3376.500000 0 494.500000 -3377.300000 0 181.700000 -3377.300000 0 181.700000 -3376.500000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 -3377.300000 0 494.500000 -3377.300000 0 494.500000 -3378.000000 0 181.700000 -3378.000000 0 181.700000 -3377.300000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 -3378.000000 0 494.500000 -3378.000000 0 494.500000 -3378.800000 0 181.700000 -3378.800000 0 181.700000 -3378.000000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 -3378.800000 0 494.500000 -3378.800000 0 494.500000 -3379.500000 0 181.700000 -3379.500000 0 181.700000 -3378.800000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 -3379.500000 0 494.500000 -3379.500000 0 494.500000 -3380.300000 0 181.700000 -3380.300000 0 181.700000 -3379.500000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 -3380.300000 0 494.500000 -3380.300000 0 494.500000 -3381.100000 0 181.700000 -3381.100000 0 181.700000 -3380.300000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 -3381.100000 0 494.500000 -3381.100000 0 494.500000 -3381.800000 0 181.700000 -3381.800000 0 181.700000 -3381.100000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 -3381.800000 0 494.500000 -3381.800000 0 494.500000 -3382.600000 0 181.700000 -3382.600000 0 181.700000 -3381.800000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 -3382.600000 0 494.500000 -3382.600000 0 494.500000 -3383.300000 0 181.700000 -3383.300000 0 181.700000 -3382.600000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 -3383.300000 0 494.500000 -3383.300000 0 494.500000 -3384.100000 0 181.700000 -3384.100000 0 181.700000 -3383.300000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 -3384.100000 0 494.500000 -3384.100000 0 494.500000 -3384.900000 0 181.700000 -3384.900000 0 181.700000 -3384.100000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 -3384.900000 0 494.500000 -3384.900000 0 494.500000 -3385.600000 0 181.700000 -3385.600000 0 181.700000 -3384.900000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 -3385.600000 0 494.500000 -3385.600000 0 494.500000 -3386.400000 0 181.700000 -3386.400000 0 181.700000 -3385.600000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 -3386.400000 0 494.500000 -3386.400000 0 494.500000 -3387.100000 0 181.700000 -3387.100000 0 181.700000 -3386.400000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 -3387.100000 0 494.500000 -3387.100000 0 494.500000 -3387.900000 0 181.700000 -3387.900000 0 181.700000 -3387.100000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 -3387.900000 0 494.500000 -3387.900000 0 494.500000 -3388.600000 0 181.700000 -3388.600000 0 181.700000 -3387.900000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 -3388.600000 0 494.500000 -3388.600000 0 494.500000 -3389.400000 0 181.700000 -3389.400000 0 181.700000 -3388.600000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 -3389.400000 0 494.500000 -3389.400000 0 494.500000 -3390.200000 0 181.700000 -3390.200000 0 181.700000 -3389.400000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 -3390.200000 0 494.500000 -3390.200000 0 494.500000 -3390.900000 0 181.700000 -3390.900000 0 181.700000 -3390.200000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 -3390.900000 0 494.500000 -3390.900000 0 494.500000 -3391.700000 0 181.700000 -3391.700000 0 181.700000 -3390.900000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 -3391.700000 0 494.500000 -3391.700000 0 494.500000 -3392.400000 0 181.700000 -3392.400000 0 181.700000 -3391.700000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 -3392.400000 0 494.500000 -3392.400000 0 494.500000 -3393.200000 0 181.700000 -3393.200000 0 181.700000 -3392.400000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 -3393.200000 0 494.500000 -3393.200000 0 494.500000 -3393.900000 0 181.700000 -3393.900000 0 181.700000 -3393.200000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 -3393.900000 0 494.500000 -3393.900000 0 494.500000 -3394.700000 0 181.700000 -3394.700000 0 181.700000 -3393.900000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 -3394.700000 0 494.500000 -3394.700000 0 494.500000 -3395.500000 0 181.700000 -3395.500000 0 181.700000 -3394.700000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 -3395.500000 0 494.500000 -3395.500000 0 494.500000 -3396.200000 0 181.700000 -3396.200000 0 181.700000 -3395.500000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 -3396.200000 0 494.500000 -3396.200000 0 494.500000 -3397.000000 0 181.700000 -3397.000000 0 181.700000 -3396.200000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 -3397.000000 0 494.500000 -3397.000000 0 494.500000 -3397.700000 0 181.700000 -3397.700000 0 181.700000 -3397.000000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 -3397.700000 0 494.500000 -3397.700000 0 494.500000 -3398.500000 0 181.700000 -3398.500000 0 181.700000 -3397.700000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 -3398.500000 0 494.500000 -3398.500000 0 494.500000 -3399.300000 0 181.700000 -3399.300000 0 181.700000 -3398.500000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 -3399.300000 0 494.500000 -3399.300000 0 494.500000 -3400.000000 0 181.700000 -3400.000000 0 181.700000 -3399.300000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 -3400.000000 0 494.500000 -3400.000000 0 494.500000 -3400.800000 0 181.700000 -3400.800000 0 181.700000 -3400.000000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 -3400.800000 0 494.500000 -3400.800000 0 494.500000 -3401.500000 0 181.700000 -3401.500000 0 181.700000 -3400.800000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 -3401.500000 0 494.500000 -3401.500000 0 494.500000 -3402.300000 0 181.700000 -3402.300000 0 181.700000 -3401.500000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 -3402.300000 0 494.500000 -3402.300000 0 494.500000 -3403.100000 0 181.700000 -3403.100000 0 181.700000 -3402.300000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 -3403.100000 0 494.500000 -3403.100000 0 494.500000 -3403.800000 0 181.700000 -3403.800000 0 181.700000 -3403.100000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 -3403.800000 0 494.500000 -3403.800000 0 494.500000 -3404.600000 0 181.700000 -3404.600000 0 181.700000 -3403.800000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 -3404.600000 0 494.500000 -3404.600000 0 494.500000 -3405.300000 0 181.700000 -3405.300000 0 181.700000 -3404.600000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 -3405.300000 0 494.500000 -3405.300000 0 494.500000 -3406.100000 0 181.700000 -3406.100000 0 181.700000 -3405.300000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 -3406.100000 0 494.500000 -3406.100000 0 494.500000 -3406.800000 0 181.700000 -3406.800000 0 181.700000 -3406.100000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 -3406.800000 0 494.500000 -3406.800000 0 494.500000 -3407.600000 0 181.700000 -3407.600000 0 181.700000 -3406.800000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 -3407.600000 0 494.500000 -3407.600000 0 494.500000 -3408.400000 0 181.700000 -3408.400000 0 181.700000 -3407.600000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 -3408.400000 0 494.500000 -3408.400000 0 494.500000 -3409.100000 0 181.700000 -3409.100000 0 181.700000 -3408.400000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 -3409.100000 0 494.500000 -3409.100000 0 494.500000 -3409.900000 0 181.700000 -3409.900000 0 181.700000 -3409.100000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 -3409.900000 0 494.500000 -3409.900000 0 494.500000 -3410.600000 0 181.700000 -3410.600000 0 181.700000 -3409.900000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 -3410.600000 0 494.500000 -3410.600000 0 494.500000 -3411.400000 0 181.700000 -3411.400000 0 181.700000 -3410.600000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 -3411.400000 0 494.500000 -3411.400000 0 494.500000 -3412.200000 0 181.700000 -3412.200000 0 181.700000 -3411.400000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 -3412.200000 0 494.500000 -3412.200000 0 494.500000 -3412.900000 0 181.700000 -3412.900000 0 181.700000 -3412.200000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 -3412.900000 0 494.500000 -3412.900000 0 494.500000 -3413.700000 0 181.700000 -3413.700000 0 181.700000 -3412.900000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 -3413.700000 0 494.500000 -3413.700000 0 494.500000 -3414.400000 0 181.700000 -3414.400000 0 181.700000 -3413.700000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 -3414.400000 0 494.500000 -3414.400000 0 494.500000 -3415.200000 0 181.700000 -3415.200000 0 181.700000 -3414.400000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 -3415.200000 0 494.500000 -3415.200000 0 494.500000 -3416.000000 0 181.700000 -3416.000000 0 181.700000 -3415.200000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 -3416.000000 0 494.500000 -3416.000000 0 494.500000 -3416.700000 0 181.700000 -3416.700000 0 181.700000 -3416.000000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 -3416.700000 0 494.500000 -3416.700000 0 494.500000 -3417.500000 0 181.700000 -3417.500000 0 181.700000 -3416.700000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 -3417.500000 0 494.500000 -3417.500000 0 494.500000 -3418.200000 0 181.700000 -3418.200000 0 181.700000 -3417.500000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 -3418.200000 0 494.500000 -3418.200000 0 494.500000 -3419.000000 0 181.700000 -3419.000000 0 181.700000 -3418.200000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 -3419.000000 0 494.500000 -3419.000000 0 494.500000 -3419.700000 0 181.700000 -3419.700000 0 181.700000 -3419.000000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 -3419.700000 0 494.500000 -3419.700000 0 494.500000 -3420.500000 0 181.700000 -3420.500000 0 181.700000 -3419.700000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 -3420.500000 0 494.500000 -3420.500000 0 494.500000 -3421.300000 0 181.700000 -3421.300000 0 181.700000 -3420.500000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 -3421.300000 0 494.500000 -3421.300000 0 494.500000 -3422.000000 0 181.700000 -3422.000000 0 181.700000 -3421.300000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 -3422.000000 0 494.500000 -3422.000000 0 494.500000 -3422.800000 0 181.700000 -3422.800000 0 181.700000 -3422.000000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 -3422.800000 0 494.500000 -3422.800000 0 494.500000 -3423.500000 0 181.700000 -3423.500000 0 181.700000 -3422.800000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 -3423.500000 0 494.500000 -3423.500000 0 494.500000 -3424.300000 0 181.700000 -3424.300000 0 181.700000 -3423.500000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 -3424.300000 0 494.500000 -3424.300000 0 494.500000 -3425.100000 0 181.700000 -3425.100000 0 181.700000 -3424.300000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 -3425.100000 0 494.500000 -3425.100000 0 494.500000 -3425.800000 0 181.700000 -3425.800000 0 181.700000 -3425.100000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 -3425.800000 0 494.500000 -3425.800000 0 494.500000 -3426.600000 0 181.700000 -3426.600000 0 181.700000 -3425.800000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 -3426.600000 0 494.500000 -3426.600000 0 494.500000 -3427.300000 0 181.700000 -3427.300000 0 181.700000 -3426.600000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 -3427.300000 0 494.500000 -3427.300000 0 494.500000 -3428.100000 0 181.700000 -3428.100000 0 181.700000 -3427.300000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 -3428.100000 0 494.500000 -3428.100000 0 494.500000 -3428.900000 0 181.700000 -3428.900000 0 181.700000 -3428.100000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 -3428.900000 0 494.500000 -3428.900000 0 494.500000 -3429.600000 0 181.700000 -3429.600000 0 181.700000 -3428.900000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 -3429.600000 0 494.500000 -3429.600000 0 494.500000 -3430.400000 0 181.700000 -3430.400000 0 181.700000 -3429.600000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 -3430.400000 0 494.500000 -3430.400000 0 494.500000 -3431.100000 0 181.700000 -3431.100000 0 181.700000 -3430.400000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 -3431.100000 0 494.500000 -3431.100000 0 494.500000 -3431.900000 0 181.700000 -3431.900000 0 181.700000 -3431.100000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 -3431.900000 0 494.500000 -3431.900000 0 494.500000 -3432.600000 0 181.700000 -3432.600000 0 181.700000 -3431.900000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 -3432.600000 0 494.500000 -3432.600000 0 494.500000 -3433.400000 0 181.700000 -3433.400000 0 181.700000 -3432.600000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 -3433.400000 0 494.500000 -3433.400000 0 494.500000 -3434.200000 0 181.700000 -3434.200000 0 181.700000 -3433.400000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 -3434.200000 0 494.500000 -3434.200000 0 494.500000 -3434.900000 0 181.700000 -3434.900000 0 181.700000 -3434.200000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 -3434.900000 0 494.500000 -3434.900000 0 494.500000 -3435.700000 0 181.700000 -3435.700000 0 181.700000 -3434.900000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 -3435.700000 0 494.500000 -3435.700000 0 494.500000 -3436.400000 0 181.700000 -3436.400000 0 181.700000 -3435.700000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 -3436.400000 0 494.500000 -3436.400000 0 494.500000 -3437.200000 0 181.700000 -3437.200000 0 181.700000 -3436.400000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 -3437.200000 0 494.500000 -3437.200000 0 494.500000 -3438.000000 0 181.700000 -3438.000000 0 181.700000 -3437.200000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 -3438.000000 0 494.500000 -3438.000000 0 494.500000 -3438.700000 0 181.700000 -3438.700000 0 181.700000 -3438.000000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 -3438.700000 0 494.500000 -3438.700000 0 494.500000 -3439.500000 0 181.700000 -3439.500000 0 181.700000 -3438.700000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 -3439.500000 0 494.500000 -3439.500000 0 494.500000 -3440.200000 0 181.700000 -3440.200000 0 181.700000 -3439.500000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 -3440.200000 0 494.500000 -3440.200000 0 494.500000 -3441.000000 0 181.700000 -3441.000000 0 181.700000 -3440.200000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 -3441.000000 0 494.500000 -3441.000000 0 494.500000 -3441.800000 0 181.700000 -3441.800000 0 181.700000 -3441.000000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 -3441.800000 0 494.500000 -3441.800000 0 494.500000 -3442.500000 0 181.700000 -3442.500000 0 181.700000 -3441.800000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 -3442.500000 0 494.500000 -3442.500000 0 494.500000 -3443.300000 0 181.700000 -3443.300000 0 181.700000 -3442.500000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 -3443.300000 0 494.500000 -3443.300000 0 494.500000 -3444.000000 0 181.700000 -3444.000000 0 181.700000 -3443.300000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 -3444.000000 0 494.500000 -3444.000000 0 494.500000 -3444.800000 0 181.700000 -3444.800000 0 181.700000 -3444.000000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 -3444.800000 0 494.500000 -3444.800000 0 494.500000 -3445.500000 0 181.700000 -3445.500000 0 181.700000 -3444.800000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 -3445.500000 0 494.500000 -3445.500000 0 494.500000 -3446.300000 0 181.700000 -3446.300000 0 181.700000 -3445.500000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 -3446.300000 0 494.500000 -3446.300000 0 494.500000 -3447.100000 0 181.700000 -3447.100000 0 181.700000 -3446.300000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 -3447.100000 0 494.500000 -3447.100000 0 494.500000 -3447.800000 0 181.700000 -3447.800000 0 181.700000 -3447.100000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 -3447.800000 0 494.500000 -3447.800000 0 494.500000 -3448.600000 0 181.700000 -3448.600000 0 181.700000 -3447.800000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 -3448.600000 0 494.500000 -3448.600000 0 494.500000 -3449.300000 0 181.700000 -3449.300000 0 181.700000 -3448.600000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 -3449.300000 0 494.500000 -3449.300000 0 494.500000 -3450.100000 0 181.700000 -3450.100000 0 181.700000 -3449.300000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 -3450.100000 0 494.500000 -3450.100000 0 494.500000 -3450.900000 0 181.700000 -3450.900000 0 181.700000 -3450.100000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 -3450.900000 0 494.500000 -3450.900000 0 494.500000 -3451.600000 0 181.700000 -3451.600000 0 181.700000 -3450.900000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 -3451.600000 0 494.500000 -3451.600000 0 494.500000 -3452.400000 0 181.700000 -3452.400000 0 181.700000 -3451.600000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 -3452.400000 0 494.500000 -3452.400000 0 494.500000 -3453.100000 0 181.700000 -3453.100000 0 181.700000 -3452.400000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 -3453.100000 0 494.500000 -3453.100000 0 494.500000 -3453.900000 0 181.700000 -3453.900000 0 181.700000 -3453.100000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 -3453.900000 0 494.500000 -3453.900000 0 494.500000 -3454.700000 0 181.700000 -3454.700000 0 181.700000 -3453.900000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 -3454.700000 0 494.500000 -3454.700000 0 494.500000 -3455.400000 0 181.700000 -3455.400000 0 181.700000 -3454.700000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 -3455.400000 0 494.500000 -3455.400000 0 494.500000 -3456.200000 0 181.700000 -3456.200000 0 181.700000 -3455.400000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 -3456.200000 0 494.500000 -3456.200000 0 494.500000 -3456.900000 0 181.700000 -3456.900000 0 181.700000 -3456.200000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 -3456.900000 0 494.500000 -3456.900000 0 494.500000 -3457.700000 0 181.700000 -3457.700000 0 181.700000 -3456.900000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 -3457.700000 0 494.500000 -3457.700000 0 494.500000 -3458.400000 0 181.700000 -3458.400000 0 181.700000 -3457.700000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 -3458.400000 0 494.500000 -3458.400000 0 494.500000 -3459.200000 0 181.700000 -3459.200000 0 181.700000 -3458.400000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 -3459.200000 0 494.500000 -3459.200000 0 494.500000 -3460.000000 0 181.700000 -3460.000000 0 181.700000 -3459.200000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 -3460.000000 0 494.500000 -3460.000000 0 494.500000 -3460.700000 0 181.700000 -3460.700000 0 181.700000 -3460.000000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 -3460.700000 0 494.500000 -3460.700000 0 494.500000 -3461.500000 0 181.700000 -3461.500000 0 181.700000 -3460.700000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 -3461.500000 0 494.500000 -3461.500000 0 494.500000 -3462.200000 0 181.700000 -3462.200000 0 181.700000 -3461.500000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 -3462.200000 0 494.500000 -3462.200000 0 494.500000 -3463.000000 0 181.700000 -3463.000000 0 181.700000 -3462.200000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 -3463.000000 0 494.500000 -3463.000000 0 494.500000 -3463.800000 0 181.700000 -3463.800000 0 181.700000 -3463.000000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 -3463.800000 0 494.500000 -3463.800000 0 494.500000 -3464.500000 0 181.700000 -3464.500000 0 181.700000 -3463.800000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 -3464.500000 0 494.500000 -3464.500000 0 494.500000 -3465.300000 0 181.700000 -3465.300000 0 181.700000 -3464.500000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 -3465.300000 0 494.500000 -3465.300000 0 494.500000 -3466.000000 0 181.700000 -3466.000000 0 181.700000 -3465.300000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 -3466.000000 0 494.500000 -3466.000000 0 494.500000 -3466.800000 0 181.700000 -3466.800000 0 181.700000 -3466.000000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 -3466.800000 0 494.500000 -3466.800000 0 494.500000 -3467.600000 0 181.700000 -3467.600000 0 181.700000 -3466.800000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 -3467.600000 0 494.500000 -3467.600000 0 494.500000 -3468.300000 0 181.700000 -3468.300000 0 181.700000 -3467.600000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 -3468.300000 0 494.500000 -3468.300000 0 494.500000 -3469.100000 0 181.700000 -3469.100000 0 181.700000 -3468.300000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 -3469.100000 0 494.500000 -3469.100000 0 494.500000 -3469.800000 0 181.700000 -3469.800000 0 181.700000 -3469.100000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 -3469.800000 0 494.500000 -3469.800000 0 494.500000 -3470.600000 0 181.700000 -3470.600000 0 181.700000 -3469.800000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 -3470.600000 0 494.500000 -3470.600000 0 494.500000 -3471.300000 0 181.700000 -3471.300000 0 181.700000 -3470.600000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 -3471.300000 0 494.500000 -3471.300000 0 494.500000 -3472.100000 0 181.700000 -3472.100000 0 181.700000 -3471.300000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 -3472.100000 0 494.500000 -3472.100000 0 494.500000 -3472.900000 0 181.700000 -3472.900000 0 181.700000 -3472.100000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 -3472.900000 0 494.500000 -3472.900000 0 494.500000 -3473.600000 0 181.700000 -3473.600000 0 181.700000 -3472.900000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 -3473.600000 0 494.500000 -3473.600000 0 494.500000 -3474.400000 0 181.700000 -3474.400000 0 181.700000 -3473.600000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 -3474.400000 0 494.500000 -3474.400000 0 494.500000 -3475.100000 0 181.700000 -3475.100000 0 181.700000 -3474.400000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 -3475.100000 0 494.500000 -3475.100000 0 494.500000 -3475.900000 0 181.700000 -3475.900000 0 181.700000 -3475.100000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 -3475.900000 0 494.500000 -3475.900000 0 494.500000 -3476.700000 0 181.700000 -3476.700000 0 181.700000 -3475.900000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 -3476.700000 0 494.500000 -3476.700000 0 494.500000 -3477.400000 0 181.700000 -3477.400000 0 181.700000 -3476.700000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 -3477.400000 0 494.500000 -3477.400000 0 494.500000 -3478.200000 0 181.700000 -3478.200000 0 181.700000 -3477.400000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 -3478.200000 0 494.500000 -3478.200000 0 494.500000 -3478.900000 0 181.700000 -3478.900000 0 181.700000 -3478.200000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 -3478.900000 0 494.500000 -3478.900000 0 494.500000 -3479.700000 0 181.700000 -3479.700000 0 181.700000 -3478.900000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 -3479.700000 0 494.500000 -3479.700000 0 494.500000 -3480.500000 0 181.700000 -3480.500000 0 181.700000 -3479.700000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 -3480.500000 0 494.500000 -3480.500000 0 494.500000 -3481.200000 0 181.700000 -3481.200000 0 181.700000 -3480.500000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 -3481.200000 0 494.500000 -3481.200000 0 494.500000 -3482.000000 0 181.700000 -3482.000000 0 181.700000 -3481.200000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 -3482.000000 0 494.500000 -3482.000000 0 494.500000 -3482.700000 0 181.700000 -3482.700000 0 181.700000 -3482.000000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 -3482.700000 0 494.500000 -3482.700000 0 494.500000 -3483.500000 0 181.700000 -3483.500000 0 181.700000 -3482.700000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 -3483.500000 0 494.500000 -3483.500000 0 494.500000 -3484.200000 0 181.700000 -3484.200000 0 181.700000 -3483.500000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 -3484.200000 0 494.500000 -3484.200000 0 494.500000 -3485.000000 0 181.700000 -3485.000000 0 181.700000 -3484.200000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 -3485.000000 0 494.500000 -3485.000000 0 494.500000 -3485.800000 0 181.700000 -3485.800000 0 181.700000 -3485.000000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 -3485.800000 0 494.500000 -3485.800000 0 494.500000 -3486.500000 0 181.700000 -3486.500000 0 181.700000 -3485.800000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 -3486.500000 0 494.500000 -3486.500000 0 494.500000 -3487.300000 0 181.700000 -3487.300000 0 181.700000 -3486.500000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 -3487.300000 0 494.500000 -3487.300000 0 494.500000 -3488.000000 0 181.700000 -3488.000000 0 181.700000 -3487.300000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 -3488.000000 0 494.500000 -3488.000000 0 494.500000 -3488.800000 0 181.700000 -3488.800000 0 181.700000 -3488.000000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 -3488.800000 0 494.500000 -3488.800000 0 494.500000 -3489.600000 0 181.700000 -3489.600000 0 181.700000 -3488.800000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 -3489.600000 0 494.500000 -3489.600000 0 494.500000 -3490.300000 0 181.700000 -3490.300000 0 181.700000 -3489.600000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 -3490.300000 0 494.500000 -3490.300000 0 494.500000 -3491.100000 0 181.700000 -3491.100000 0 181.700000 -3490.300000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 -3491.100000 0 494.500000 -3491.100000 0 494.500000 -3491.800000 0 181.700000 -3491.800000 0 181.700000 -3491.100000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 -3491.800000 0 494.500000 -3491.800000 0 494.500000 -3492.600000 0 181.700000 -3492.600000 0 181.700000 -3491.800000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 -3492.600000 0 494.500000 -3492.600000 0 494.500000 -3493.400000 0 181.700000 -3493.400000 0 181.700000 -3492.600000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 -3493.400000 0 494.500000 -3493.400000 0 494.500000 -3494.100000 0 181.700000 -3494.100000 0 181.700000 -3493.400000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 -3494.100000 0 494.500000 -3494.100000 0 494.500000 -3494.900000 0 181.700000 -3494.900000 0 181.700000 -3494.100000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 -3494.900000 0 494.500000 -3494.900000 0 494.500000 -3495.600000 0 181.700000 -3495.600000 0 181.700000 -3494.900000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 -3495.600000 0 494.500000 -3495.600000 0 494.500000 -3496.400000 0 181.700000 -3496.400000 0 181.700000 -3495.600000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 -3496.400000 0 494.500000 -3496.400000 0 494.500000 -3497.100000 0 181.700000 -3497.100000 0 181.700000 -3496.400000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 -3497.100000 0 494.500000 -3497.100000 0 494.500000 -3497.900000 0 181.700000 -3497.900000 0 181.700000 -3497.100000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 -3497.900000 0 494.500000 -3497.900000 0 494.500000 -3498.700000 0 181.700000 -3498.700000 0 181.700000 -3497.900000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 -3498.700000 0 494.500000 -3498.700000 0 494.500000 -3499.400000 0 181.700000 -3499.400000 0 181.700000 -3498.700000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 -3499.400000 0 494.500000 -3499.400000 0 494.500000 -3500.200000 0 181.700000 -3500.200000 0 181.700000 -3499.400000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 -3500.200000 0 494.500000 -3500.200000 0 494.500000 -3500.900000 0 181.700000 -3500.900000 0 181.700000 -3500.200000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 -3500.900000 0 494.500000 -3500.900000 0 494.500000 -3501.700000 0 181.700000 -3501.700000 0 181.700000 -3500.900000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 -3501.700000 0 494.500000 -3501.700000 0 494.500000 -3502.500000 0 181.700000 -3502.500000 0 181.700000 -3501.700000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 -3502.500000 0 494.500000 -3502.500000 0 494.500000 -3503.200000 0 181.700000 -3503.200000 0 181.700000 -3502.500000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 -3503.200000 0 494.500000 -3503.200000 0 494.500000 -3504.000000 0 181.700000 -3504.000000 0 181.700000 -3503.200000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 -3504.000000 0 494.500000 -3504.000000 0 494.500000 -3504.700000 0 181.700000 -3504.700000 0 181.700000 -3504.000000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 -3504.700000 0 494.500000 -3504.700000 0 494.500000 -3505.500000 0 181.700000 -3505.500000 0 181.700000 -3504.700000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 -3505.500000 0 494.500000 -3505.500000 0 494.500000 -3506.300000 0 181.700000 -3506.300000 0 181.700000 -3505.500000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 -3506.300000 0 494.500000 -3506.300000 0 494.500000 -3507.000000 0 181.700000 -3507.000000 0 181.700000 -3506.300000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 -3507.000000 0 494.500000 -3507.000000 0 494.500000 -3507.800000 0 181.700000 -3507.800000 0 181.700000 -3507.000000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 -3507.800000 0 494.500000 -3507.800000 0 494.500000 -3508.500000 0 181.700000 -3508.500000 0 181.700000 -3507.800000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 -3508.500000 0 494.500000 -3508.500000 0 494.500000 -3509.300000 0 181.700000 -3509.300000 0 181.700000 -3508.500000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 -3509.300000 0 494.500000 -3509.300000 0 494.500000 -3510.000000 0 181.700000 -3510.000000 0 181.700000 -3509.300000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 -3510.000000 0 494.500000 -3510.000000 0 494.500000 -3510.800000 0 181.700000 -3510.800000 0 181.700000 -3510.000000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 -3510.800000 0 494.500000 -3510.800000 0 494.500000 -3511.600000 0 181.700000 -3511.600000 0 181.700000 -3510.800000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 -3511.600000 0 494.500000 -3511.600000 0 494.500000 -3512.300000 0 181.700000 -3512.300000 0 181.700000 -3511.600000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 -3512.300000 0 494.500000 -3512.300000 0 494.500000 -3513.100000 0 181.700000 -3513.100000 0 181.700000 -3512.300000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 -3513.100000 0 494.500000 -3513.100000 0 494.500000 -3513.800000 0 181.700000 -3513.800000 0 181.700000 -3513.100000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 -3513.800000 0 494.500000 -3513.800000 0 494.500000 -3514.600000 0 181.700000 -3514.600000 0 181.700000 -3513.800000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 -3514.600000 0 494.500000 -3514.600000 0 494.500000 -3515.400000 0 181.700000 -3515.400000 0 181.700000 -3514.600000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 -3515.400000 0 494.500000 -3515.400000 0 494.500000 -3516.100000 0 181.700000 -3516.100000 0 181.700000 -3515.400000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 -3516.100000 0 494.500000 -3516.100000 0 494.500000 -3516.900000 0 181.700000 -3516.900000 0 181.700000 -3516.100000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 -3516.900000 0 494.500000 -3516.900000 0 494.500000 -3517.600000 0 181.700000 -3517.600000 0 181.700000 -3516.900000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 -3517.600000 0 494.500000 -3517.600000 0 494.500000 -3518.400000 0 181.700000 -3518.400000 0 181.700000 -3517.600000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 -3518.400000 0 494.500000 -3518.400000 0 494.500000 -3519.200000 0 181.700000 -3519.200000 0 181.700000 -3518.400000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 -3519.200000 0 494.500000 -3519.200000 0 494.500000 -3519.900000 0 181.700000 -3519.900000 0 181.700000 -3519.200000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 -3519.900000 0 494.500000 -3519.900000 0 494.500000 -3520.700000 0 181.700000 -3520.700000 0 181.700000 -3519.900000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 -3520.700000 0 494.500000 -3520.700000 0 494.500000 -3521.400000 0 181.700000 -3521.400000 0 181.700000 -3520.700000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 -3521.400000 0 494.500000 -3521.400000 0 494.500000 -3522.200000 0 181.700000 -3522.200000 0 181.700000 -3521.400000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 -3522.200000 0 494.500000 -3522.200000 0 494.500000 -3522.900000 0 181.700000 -3522.900000 0 181.700000 -3522.200000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 -3522.900000 0 494.500000 -3522.900000 0 494.500000 -3523.700000 0 181.700000 -3523.700000 0 181.700000 -3522.900000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 -3523.700000 0 494.500000 -3523.700000 0 494.500000 -3524.500000 0 181.700000 -3524.500000 0 181.700000 -3523.700000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 -3524.500000 0 494.500000 -3524.500000 0 494.500000 -3525.200000 0 181.700000 -3525.200000 0 181.700000 -3524.500000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 -3525.200000 0 494.500000 -3525.200000 0 494.500000 -3526.000000 0 181.700000 -3526.000000 0 181.700000 -3525.200000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 -3526.000000 0 494.500000 -3526.000000 0 494.500000 -3526.700000 0 181.700000 -3526.700000 0 181.700000 -3526.000000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 -3526.700000 0 494.500000 -3526.700000 0 494.500000 -3527.500000 0 181.700000 -3527.500000 0 181.700000 -3526.700000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 -3527.500000 0 494.500000 -3527.500000 0 494.500000 -3528.300000 0 181.700000 -3528.300000 0 181.700000 -3527.500000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 -3528.300000 0 494.500000 -3528.300000 0 494.500000 -3529.000000 0 181.700000 -3529.000000 0 181.700000 -3528.300000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 -3529.000000 0 494.500000 -3529.000000 0 494.500000 -3529.800000 0 181.700000 -3529.800000 0 181.700000 -3529.000000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 -3529.800000 0 494.500000 -3529.800000 0 494.500000 -3530.500000 0 181.700000 -3530.500000 0 181.700000 -3529.800000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 -3530.500000 0 494.500000 -3530.500000 0 494.500000 -3531.300000 0 181.700000 -3531.300000 0 181.700000 -3530.500000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 -3531.300000 0 494.500000 -3531.300000 0 494.500000 -3532.100000 0 181.700000 -3532.100000 0 181.700000 -3531.300000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 -3532.100000 0 494.500000 -3532.100000 0 494.500000 -3532.800000 0 181.700000 -3532.800000 0 181.700000 -3532.100000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 -3532.800000 0 494.500000 -3532.800000 0 494.500000 -3533.600000 0 181.700000 -3533.600000 0 181.700000 -3532.800000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 -3533.600000 0 494.500000 -3533.600000 0 494.500000 -3534.300000 0 181.700000 -3534.300000 0 181.700000 -3533.600000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 -3534.300000 0 494.500000 -3534.300000 0 494.500000 -3535.100000 0 181.700000 -3535.100000 0 181.700000 -3534.300000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 -3535.100000 0 494.500000 -3535.100000 0 494.500000 -3535.800000 0 181.700000 -3535.800000 0 181.700000 -3535.100000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 -3535.800000 0 494.500000 -3535.800000 0 494.500000 -3536.600000 0 181.700000 -3536.600000 0 181.700000 -3535.800000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 -3536.600000 0 494.500000 -3536.600000 0 494.500000 -3537.400000 0 181.700000 -3537.400000 0 181.700000 -3536.600000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 -3537.400000 0 494.500000 -3537.400000 0 494.500000 -3538.100000 0 181.700000 -3538.100000 0 181.700000 -3537.400000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 -3538.100000 0 494.500000 -3538.100000 0 494.500000 -3538.900000 0 181.700000 -3538.900000 0 181.700000 -3538.100000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 -3538.900000 0 494.500000 -3538.900000 0 494.500000 -3539.600000 0 181.700000 -3539.600000 0 181.700000 -3538.900000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 -3539.600000 0 494.500000 -3539.600000 0 494.500000 -3540.400000 0 181.700000 -3540.400000 0 181.700000 -3539.600000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 -3540.400000 0 494.500000 -3540.400000 0 494.500000 -3541.200000 0 181.700000 -3541.200000 0 181.700000 -3540.400000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 -3541.200000 0 494.500000 -3541.200000 0 494.500000 -3541.900000 0 181.700000 -3541.900000 0 181.700000 -3541.200000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 -3541.900000 0 494.500000 -3541.900000 0 494.500000 -3542.700000 0 181.700000 -3542.700000 0 181.700000 -3541.900000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 -3542.700000 0 494.500000 -3542.700000 0 494.500000 -3543.400000 0 181.700000 -3543.400000 0 181.700000 -3542.700000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 -3543.400000 0 494.500000 -3543.400000 0 494.500000 -3544.200000 0 181.700000 -3544.200000 0 181.700000 -3543.400000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 -3544.200000 0 494.500000 -3544.200000 0 494.500000 -3545.000000 0 181.700000 -3545.000000 0 181.700000 -3544.200000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 -3545.000000 0 494.500000 -3545.000000 0 494.500000 -3545.700000 0 181.700000 -3545.700000 0 181.700000 -3545.000000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 -3545.700000 0 494.500000 -3545.700000 0 494.500000 -3546.500000 0 181.700000 -3546.500000 0 181.700000 -3545.700000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 -3546.500000 0 494.500000 -3546.500000 0 494.500000 -3547.200000 0 181.700000 -3547.200000 0 181.700000 -3546.500000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 -3547.200000 0 494.500000 -3547.200000 0 494.500000 -3548.000000 0 181.700000 -3548.000000 0 181.700000 -3547.200000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 -3548.000000 0 494.500000 -3548.000000 0 494.500000 -3548.700000 0 181.700000 -3548.700000 0 181.700000 -3548.000000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 -3548.700000 0 494.500000 -3548.700000 0 494.500000 -3549.500000 0 181.700000 -3549.500000 0 181.700000 -3548.700000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 -3549.500000 0 494.500000 -3549.500000 0 494.500000 -3550.300000 0 181.700000 -3550.300000 0 181.700000 -3549.500000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 -3550.300000 0 494.500000 -3550.300000 0 494.500000 -3551.000000 0 181.700000 -3551.000000 0 181.700000 -3550.300000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 -3551.000000 0 494.500000 -3551.000000 0 494.500000 -3551.800000 0 181.700000 -3551.800000 0 181.700000 -3551.000000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 -3551.800000 0 494.500000 -3551.800000 0 494.500000 -3552.500000 0 181.700000 -3552.500000 0 181.700000 -3551.800000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 -3552.500000 0 494.500000 -3552.500000 0 494.500000 -3553.300000 0 181.700000 -3553.300000 0 181.700000 -3552.500000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 -3553.300000 0 494.500000 -3553.300000 0 494.500000 -3554.100000 0 181.700000 -3554.100000 0 181.700000 -3553.300000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 -3554.100000 0 494.500000 -3554.100000 0 494.500000 -3554.800000 0 181.700000 -3554.800000 0 181.700000 -3554.100000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 -3554.700000 0 181.800000 -3554.700000 0 181.800000 -3361.400000 0 494.400000 -3361.400000 0 494.400000 -3554.700000 0 338.100000 -3554.700000 0
+strokePath subpath 1 338.100000 -3554.700000 0 181.800000 -3554.700000 0 181.800000 -3361.400000 0 494.400000 -3361.400000 0 494.400000 -3554.700000 0 338.100000 -3554.700000 0
+saveState
+updateCtm 11420.000000 0.000000 0.000000 -8760.000000 20530.000000 427080.000000
+drawSoftMaskedImage 1143 877 1143 877 JPEG 71324 PPM 3007249
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 -3515.776000 215.488000 -3523.776000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 -3515.776000 220.592000 -3523.776000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 -3515.776000 225.696000 -3523.776000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 -3515.776000 230.800000 -3523.776000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 -3523.276000 241.388000 -3531.276000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 -3523.276000 246.492000 -3531.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 -3523.276000 251.596000 -3531.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 -3523.276000 256.700000 -3531.276000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 -3530.976000 267.188000 -3538.976000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 -3530.976000 272.292000 -3538.976000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 -3530.976000 277.396000 -3538.976000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 -3530.976000 282.500000 -3538.976000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 -3538.576000 293.088000 -3546.576000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 -3538.576000 298.192000 -3546.576000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 -3538.576000 303.296000 -3546.576000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 -3538.576000 308.400000 -3546.576000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 -3500.776000 202.588000 -3508.776000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 -3481.376000 201.688000 -3489.376000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 -3462.076000 195.788000 -3470.076000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 -3462.076000 200.892000 -3470.076000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 -3442.776000 194.888000 -3450.776000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 -3442.776000 199.992000 -3450.776000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 -3423.476000 193.988000 -3431.476000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 -3423.476000 199.092000 -3431.476000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 -3404.076000 193.088000 -3412.076000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 -3404.076000 198.192000 -3412.076000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 -3531.976000 330.188000 -3539.976000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 -3531.976000 332.716000 -3539.976000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 -3531.976000 337.596000 -3539.976000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 -3531.976000 341.396000 -3539.976000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 -3531.976000 346.036000 -3539.976000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 -3531.976000 350.900000 -3539.976000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 -3531.976000 355.972000 -3539.976000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 -3531.976000 359.196000 -3539.976000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 -3531.976000 362.196000 -3539.976000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 -3531.976000 367.404000 -3539.976000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 -3531.976000 371.876000 -3539.976000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 -3531.976000 375.052000 -3539.976000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 -3512.476000 361.172000 -3520.476000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 -3512.476000 364.340000 -3520.476000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 -3512.476000 367.396000 -3520.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 -3512.476000 372.604000 -3520.476000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 -3512.476000 379.348000 -3520.476000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 -3512.476000 384.484000 -3520.476000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 -3512.476000 389.436000 -3520.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 -3512.476000 392.108000 -3520.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 -3512.476000 395.708000 -3520.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 -3512.476000 397.540000 -3520.476000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 -3512.476000 402.444000 -3520.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 -3512.476000 406.788000 -3520.476000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 -3492.976000 392.972000 -3500.976000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 -3492.976000 398.076000 -3500.976000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 -3492.976000 403.180000 -3500.976000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 -3492.976000 405.428000 -3500.976000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 -3492.976000 410.332000 -3500.976000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 -3492.976000 414.476000 -3500.976000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 -3365.408000 305.808000 -3379.408000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 -3365.408000 314.138000 -3379.408000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 -3365.408000 320.788000 -3379.408000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 -3365.408000 328.698000 -3379.408000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 -3365.408000 336.972000 -3379.408000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 -3365.408000 344.182000 -3379.408000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 -3365.408000 349.810000 -3379.408000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 -3365.408000 354.234000 -3379.408000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 -3365.408000 362.718000 -3379.408000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 -3365.408000 367.870000 -3379.408000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 -3365.408000 372.322000 -3379.408000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 -3365.408000 382.080000 -3379.408000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 -3365.408000 388.772000 -3379.408000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 -3365.408000 397.802000 -3379.408000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 -3365.408000 402.254000 -3379.408000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 -3365.408000 407.896000 -3379.408000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 -3488.300000 0 424.300000 -3488.300000 0 424.300000 -3427.500000 0 493.600000 -3427.500000 0 493.600000 -3488.300000 0 458.900000 -3488.300000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 -3437.100000 0 428.900000 -3437.100000 0 428.900000 -3431.200000 0 434.800000 -3431.200000 0 434.800000 -3437.100000 0 431.900000 -3437.100000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 -3448.200000 0 428.900000 -3448.200000 0 428.900000 -3442.300000 0 434.800000 -3442.300000 0 434.800000 -3448.200000 0 431.900000 -3448.200000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 -3459.300000 0 428.900000 -3459.300000 0 428.900000 -3453.300000 0 434.800000 -3453.300000 0 434.800000 -3459.300000 0 431.900000 -3459.300000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 -3470.400000 0 428.900000 -3470.400000 0 428.900000 -3464.400000 0 434.800000 -3464.400000 0 434.800000 -3470.400000 0 431.900000 -3470.400000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 -3481.500000 0 428.900000 -3481.500000 0 428.900000 -3475.500000 0 434.800000 -3475.500000 0 434.800000 -3481.500000 0 431.900000 -3481.500000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -3430.076000 443.288000 -3438.076000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 -3430.076000 445.816000 -3438.076000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 -3430.076000 450.600000 -3438.076000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 -3430.076000 454.496000 -3438.076000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 -3430.076000 459.136000 -3438.076000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 -3430.076000 464.000000 -3438.076000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 -3430.076000 468.976000 -3438.076000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 -3430.076000 472.304000 -3438.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 -3430.076000 475.208000 -3438.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 -3430.076000 480.520000 -3438.076000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 -3430.076000 484.992000 -3438.076000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 -3430.076000 488.168000 -3438.076000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -3441.076000 443.352000 -3449.076000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 -3441.076000 447.920000 -3449.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 -3441.076000 452.976000 -3449.076000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 -3441.076000 457.400000 -3449.076000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 -3441.076000 462.472000 -3449.076000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 -3441.076000 465.800000 -3449.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 -3441.076000 468.904000 -3449.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 -3441.076000 473.816000 -3449.076000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 -3441.076000 478.888000 -3449.076000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 -3441.076000 482.064000 -3449.076000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -3452.176000 442.872000 -3460.176000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 -3452.176000 446.040000 -3460.176000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 -3452.176000 448.992000 -3460.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 -3452.176000 454.304000 -3460.176000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 -3452.176000 461.048000 -3460.176000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 -3452.176000 466.184000 -3460.176000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 -3452.176000 471.136000 -3460.176000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 -3452.176000 473.808000 -3460.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 -3452.176000 477.408000 -3460.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 -3452.176000 479.240000 -3460.176000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 -3452.176000 484.144000 -3460.176000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 -3452.176000 488.488000 -3460.176000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -3463.276000 443.384000 -3471.276000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 -3463.276000 448.464000 -3471.276000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 -3463.276000 453.424000 -3471.276000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 -3463.276000 456.696000 -3471.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 -3463.276000 459.800000 -3471.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 -3463.276000 462.032000 -3471.276000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 -3463.276000 466.936000 -3471.276000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 -3463.276000 471.080000 -3471.276000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -3474.376000 443.272000 -3482.376000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 -3474.376000 448.376000 -3482.376000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 -3474.376000 453.480000 -3482.376000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 -3474.376000 455.728000 -3482.376000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 -3474.376000 460.632000 -3482.376000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 -3474.376000 464.776000 -3482.376000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -6119.400000 0 114.800000 -6119.400000 0 114.800000 -6076.600000 0 72.000000 -6076.600000 0 72.000000 -6119.400000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 691130.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 108.000000 546.200000 0 540.000000 546.200000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 546.200000 0
+eoFillPath subpath 1 108.000000 72.000000 0 540.000000 72.000000 0 540.000000 245.800000 0 108.000000 245.800000 0 108.000000 72.000000 0
+eoFillPath subpath 1 108.000000 245.800000 0 157.400000 245.800000 0 157.400000 546.200000 0 108.000000 546.200000 0 108.000000 245.800000 0
+eoFillPath subpath 1 490.500000 245.800000 0 540.000000 245.800000 0 540.000000 546.200000 0 490.500000 546.200000 0 490.500000 245.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 15740.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 108.000000 701.300000 0 540.000000 701.300000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 701.300000 0
+eoFillPath subpath 1 108.000000 76.200000 0 540.000000 76.200000 0 540.000000 90.100000 0 108.000000 90.100000 0 108.000000 76.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 108.100000 719.948000 121.892000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 121.908000 719.948000 131.364000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 131.412000 719.948000 136.484000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 136.516000 719.948000 148.532000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 148.516000 719.948000 158.292000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 158.324000 719.948000 168.452000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 168.420000 719.948000 176.740000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 176.724000 719.948000 186.564000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 186.532000 719.948000 191.604000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 191.636000 719.948000 197.396000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 197.444000 719.948000 202.516000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 202.500000 719.948000 212.644000 703.948000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 212.708000 719.948000 222.548000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 222.516000 719.948000 231.300000 703.948000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 231.316000 719.948000 241.092000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 241.124000 719.948000 251.252000 703.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 251.220000 719.948000 261.364000 703.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 261.428000 719.948000 266.500000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.532000 719.948000 275.732000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 275.732000 719.948000 280.164000 703.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 280.132000 719.948000 289.908000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 289.940000 719.948000 299.716000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 299.748000 719.948000 306.324000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1400.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 672.892000 122.030000 658.892000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 122.002000 672.892000 131.438000 658.892000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 131.396000 672.892000 139.726000 658.892000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.698000 672.892000 146.390000 658.892000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 146.404000 672.892000 155.896000 658.892000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 155.910000 672.892000 162.812000 658.892000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 162.812000 672.892000 167.684000 658.892000 1.000000 0.000000 0.000000 1.000000
+drawChar 167.712000 672.892000 178.380000 658.892000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 178.408000 672.892000 187.844000 658.892000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 187.802000 672.892000 194.494000 658.892000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 194.508000 672.892000 204.462000 658.892000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 650.736000 229.492000 638.736000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 229.504000 650.736000 237.232000 638.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 237.208000 650.736000 244.300000 638.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 246.304000 650.736000 250.108000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 252.208000 650.736000 259.432000 638.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 259.504000 650.736000 267.232000 638.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 267.208000 650.736000 271.036000 638.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 271.108000 650.736000 277.876000 638.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 279.808000 650.736000 283.612000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 285.712000 650.736000 295.972000 638.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 296.008000 650.736000 303.160000 638.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 303.112000 650.736000 309.880000 638.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 311.908000 650.736000 315.712000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 317.908000 650.736000 322.720000 638.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 322.708000 650.736000 329.932000 638.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 331.912000 650.736000 335.716000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 337.816000 650.736000 345.496000 638.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 345.520000 650.736000 352.612000 638.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 352.624000 650.736000 357.436000 638.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 359.428000 650.736000 363.232000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 365.332000 650.736000 370.144000 638.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 370.228000 650.736000 377.452000 638.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 379.432000 650.736000 383.236000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 385.336000 650.736000 390.148000 638.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 390.136000 650.736000 397.864000 638.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 397.936000 650.736000 405.028000 638.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 406.936000 650.736000 410.740000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 412.936000 650.736000 424.312000 638.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 424.240000 650.736000 431.392000 638.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 431.440000 650.736000 437.596000 638.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 437.644000 650.736000 442.456000 638.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 442.444000 650.736000 449.536000 638.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 449.548000 650.736000 455.284000 638.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 457.252000 650.736000 461.056000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 463.156000 650.736000 470.836000 638.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 470.860000 650.736000 478.012000 638.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 477.964000 650.736000 482.776000 638.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 482.860000 650.736000 490.588000 638.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 490.564000 650.736000 496.300000 638.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 496.360000 650.736000 503.584000 638.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 503.560000 650.736000 510.784000 638.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 510.760000 650.736000 522.136000 638.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 524.164000 650.736000 527.968000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 530.068000 650.736000 533.896000 638.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 533.872000 650.736000 540.028000 638.736000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 650.736000 543.904000 638.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 636.836000 226.312000 624.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.300000 636.836000 234.028000 624.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 234.100000 636.836000 239.836000 624.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 239.800000 636.836000 247.024000 624.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 247.000000 636.836000 254.728000 624.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 254.704000 636.836000 262.384000 624.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 262.408000 636.836000 270.136000 624.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 270.808000 636.836000 274.612000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 275.308000 636.836000 280.120000 624.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 280.108000 636.836000 287.836000 624.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 287.908000 636.836000 295.000000 624.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 295.612000 636.836000 299.416000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 300.112000 636.836000 307.792000 624.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 307.816000 636.836000 314.908000 624.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 314.920000 636.836000 322.600000 624.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 322.624000 636.836000 328.360000 624.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 328.324000 636.836000 335.548000 624.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 335.524000 636.836000 342.748000 624.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 342.820000 636.836000 354.196000 624.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 354.124000 636.836000 357.928000 624.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.624000 636.836000 362.428000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 363.124000 636.836000 371.116000 624.836000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 371.128000 636.836000 378.856000 624.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 378.832000 636.836000 385.924000 624.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 385.936000 636.836000 391.672000 624.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 391.732000 636.836000 398.824000 624.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 398.836000 636.836000 403.276000 624.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 403.240000 636.836000 410.464000 624.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 410.440000 636.836000 416.176000 624.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 416.236000 636.836000 423.328000 624.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 423.340000 636.836000 427.144000 624.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 427.840000 636.836000 431.644000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 432.340000 636.836000 436.168000 624.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 436.144000 636.836000 440.956000 624.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 441.640000 636.836000 445.444000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 446.140000 636.836000 449.968000 624.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 449.944000 636.836000 456.100000 624.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 456.844000 636.836000 460.648000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 461.344000 636.836000 468.496000 624.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 469.048000 636.836000 472.852000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 473.548000 636.836000 480.268000 624.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 480.352000 636.836000 487.576000 624.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 487.552000 636.836000 498.928000 624.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 498.952000 636.836000 506.632000 624.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 506.656000 636.836000 510.484000 624.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 510.460000 636.836000 517.552000 624.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 517.564000 636.836000 522.376000 624.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 522.364000 636.836000 529.456000 624.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 529.468000 636.836000 533.296000 624.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 533.368000 636.836000 540.136000 624.836000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 636.836000 543.904000 624.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 622.936000 229.180000 610.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 229.204000 622.936000 234.940000 610.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 234.904000 622.936000 238.732000 610.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 238.708000 622.936000 245.476000 610.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 245.512000 622.936000 252.664000 610.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 252.712000 622.936000 257.524000 610.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 257.512000 622.936000 264.604000 610.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 264.616000 622.936000 268.420000 610.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 268.420000 622.936000 274.156000 610.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 274.120000 622.936000 281.344000 610.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 281.320000 622.936000 288.544000 610.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 288.520000 622.936000 299.896000 610.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 299.920000 622.936000 303.724000 610.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 303.724000 622.936000 313.984000 610.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 314.020000 622.936000 321.748000 610.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 321.724000 622.936000 325.552000 610.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 325.528000 622.936000 332.248000 610.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 332.224000 622.936000 339.952000 610.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 339.928000 622.936000 343.732000 610.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 343.732000 622.936000 347.560000 610.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 347.536000 622.936000 353.692000 610.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 353.740000 622.936000 357.544000 610.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 357.544000 622.936000 365.224000 610.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 365.248000 622.936000 372.340000 610.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 372.352000 622.936000 380.080000 610.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 380.056000 622.936000 387.148000 610.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 387.160000 622.936000 392.896000 610.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.860000 622.936000 400.012000 610.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 400.060000 622.936000 403.888000 610.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 403.864000 622.936000 407.692000 610.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 407.668000 622.936000 414.436000 610.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 414.472000 622.936000 418.276000 610.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 418.276000 622.936000 426.004000 610.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 425.980000 622.936000 433.204000 610.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 433.180000 622.936000 437.992000 610.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 437.980000 622.936000 441.784000 610.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 441.784000 622.936000 449.512000 610.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 449.488000 622.936000 455.644000 610.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 455.692000 622.936000 462.784000 610.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 462.796000 622.936000 470.476000 610.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 470.500000 622.936000 474.304000 610.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.304000 622.936000 481.984000 610.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 482.008000 622.936000 488.776000 610.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 488.812000 622.936000 492.616000 610.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 492.616000 622.936000 500.296000 610.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 500.320000 622.936000 508.048000 610.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 508.024000 622.936000 515.116000 610.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 515.128000 622.936000 521.284000 610.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 521.332000 622.936000 526.144000 610.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 526.132000 622.936000 532.288000 610.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 532.336000 622.936000 536.140000 610.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 603.036000 233.776000 591.036000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 233.800000 603.036000 240.952000 591.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 240.904000 603.036000 246.640000 591.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 246.700000 603.036000 254.380000 591.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 254.404000 603.036000 258.232000 591.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 258.208000 603.036000 265.300000 591.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 265.504000 603.036000 269.308000 591.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 269.608000 603.036000 274.420000 591.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 274.408000 603.036000 278.236000 591.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 278.308000 603.036000 282.136000 591.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 282.112000 603.036000 289.204000 591.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 289.216000 603.036000 295.372000 591.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 295.612000 603.036000 299.416000 591.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 299.716000 603.036000 303.544000 591.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 303.520000 603.036000 311.248000 591.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 311.524000 603.036000 315.328000 591.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 315.628000 603.036000 320.440000 591.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 320.428000 603.036000 328.156000 591.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 328.228000 603.036000 335.320000 591.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 335.428000 603.036000 339.232000 591.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 339.532000 603.036000 347.212000 591.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 347.236000 603.036000 354.388000 591.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 354.340000 603.036000 359.152000 591.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 359.236000 603.036000 366.964000 591.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 366.940000 603.036000 372.676000 591.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 372.736000 603.036000 379.960000 591.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 379.936000 603.036000 387.160000 591.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 387.136000 603.036000 398.512000 591.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 398.740000 603.036000 402.544000 591.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 402.844000 603.036000 409.564000 591.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 409.540000 603.036000 416.632000 591.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 416.644000 603.036000 422.380000 591.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 422.440000 603.036000 427.252000 591.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 427.240000 603.036000 434.392000 591.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 434.344000 603.036000 438.172000 591.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 438.244000 603.036000 445.972000 591.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 445.948000 603.036000 449.776000 591.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 449.752000 603.036000 456.520000 591.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 456.748000 603.036000 460.552000 591.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 460.852000 603.036000 464.680000 591.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 464.656000 603.036000 471.880000 591.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 471.952000 603.036000 479.176000 591.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 479.152000 603.036000 486.412000 591.036000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 486.652000 603.036000 490.456000 591.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 490.756000 603.036000 497.848000 591.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 497.860000 603.036000 501.688000 591.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 501.664000 603.036000 508.756000 591.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 508.768000 603.036000 516.448000 591.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 516.472000 603.036000 523.624000 591.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 523.672000 603.036000 531.400000 591.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 531.376000 603.036000 536.188000 591.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 536.176000 603.036000 539.980000 591.036000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 603.036000 543.904000 591.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 589.136000 229.180000 577.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 229.204000 589.136000 236.932000 577.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 236.908000 589.136000 241.720000 577.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 243.712000 589.136000 247.516000 577.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 249.508000 589.136000 256.660000 577.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 256.708000 589.136000 262.444000 577.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 262.408000 589.136000 269.500000 577.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 271.504000 589.136000 275.308000 577.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.408000 589.136000 283.144000 577.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 283.108000 589.136000 290.260000 577.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 290.212000 589.136000 295.024000 577.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 295.108000 589.136000 302.836000 577.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 302.812000 589.136000 309.904000 577.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 309.916000 589.136000 315.652000 577.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 317.620000 589.136000 321.424000 577.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 323.416000 589.136000 331.096000 577.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 331.120000 589.136000 334.948000 577.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 334.924000 589.136000 347.248000 577.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 347.320000 589.136000 354.040000 577.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 354.124000 589.136000 361.852000 577.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 361.828000 589.136000 365.656000 577.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 365.632000 589.136000 370.444000 577.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 372.436000 589.136000 376.240000 577.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 378.232000 589.136000 383.044000 577.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 383.032000 589.136000 390.256000 577.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 392.332000 589.136000 396.136000 577.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.128000 589.136000 409.504000 577.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 409.528000 589.136000 416.680000 577.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 416.632000 589.136000 420.460000 577.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 420.532000 589.136000 428.260000 577.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 428.236000 589.136000 433.048000 577.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 433.036000 589.136000 440.188000 577.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 440.236000 589.136000 444.064000 577.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 444.040000 589.136000 451.768000 577.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 451.744000 589.136000 455.548000 577.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.540000 589.136000 461.344000 577.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 463.444000 589.136000 471.436000 577.136000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 471.448000 589.136000 479.176000 577.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 479.152000 589.136000 486.244000 577.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 486.256000 589.136000 491.992000 577.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 492.052000 589.136000 499.144000 577.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 499.156000 589.136000 503.596000 577.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 503.560000 589.136000 510.784000 577.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 510.760000 589.136000 516.496000 577.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 516.556000 589.136000 523.648000 577.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 523.552000 589.136000 527.356000 577.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 529.348000 589.136000 533.152000 577.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 535.252000 589.136000 539.992000 577.136000 1.000000 0.000000 0.000000 1.000000 I
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 589.136000 543.904000 577.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 575.236000 228.220000 563.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 228.196000 575.236000 235.924000 563.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 235.900000 575.236000 243.124000 563.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 243.196000 575.236000 249.352000 563.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 249.292000 575.236000 256.384000 563.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 257.296000 575.236000 261.100000 563.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.096000 575.236000 266.908000 563.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 266.992000 575.236000 274.216000 563.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 275.092000 575.236000 278.896000 563.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.892000 575.236000 284.704000 563.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 284.692000 575.236000 288.520000 563.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 288.592000 575.236000 292.420000 563.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 292.396000 575.236000 299.488000 563.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 300.400000 575.236000 304.204000 563.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 305.200000 575.236000 310.012000 563.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 310.000000 575.236000 317.728000 563.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 317.800000 575.236000 324.892000 563.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 325.804000 575.236000 329.608000 563.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 331.504000 575.236000 339.496000 563.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 338.608000 575.236000 345.832000 563.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 345.808000 575.236000 353.032000 563.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 353.104000 575.236000 358.840000 563.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 359.704000 575.236000 363.508000 563.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 364.504000 575.236000 371.656000 563.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 371.704000 575.236000 379.432000 563.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 379.408000 575.236000 387.088000 563.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 388.012000 575.236000 391.816000 563.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 392.812000 575.236000 403.072000 563.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 403.108000 575.236000 410.260000 563.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 410.212000 575.236000 414.040000 563.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 414.112000 575.236000 417.940000 563.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 417.916000 575.236000 424.072000 563.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 424.912000 575.236000 428.716000 563.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.712000 575.236000 439.972000 563.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 440.008000 575.236000 443.836000 563.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 443.908000 575.236000 448.720000 563.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 448.708000 575.236000 456.436000 563.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 457.312000 575.236000 461.116000 563.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 462.112000 575.236000 468.832000 563.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 468.808000 575.236000 476.032000 563.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 476.008000 575.236000 483.736000 563.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 483.808000 575.236000 490.576000 563.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 490.612000 575.236000 497.704000 563.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 497.716000 575.236000 505.444000 563.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 505.420000 575.236000 510.232000 563.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 510.220000 575.236000 514.048000 563.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 514.024000 575.236000 521.248000 563.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 521.320000 575.236000 529.048000 563.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 529.024000 575.236000 536.176000 563.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 536.224000 575.236000 540.052000 563.236000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 575.236000 543.904000 563.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 561.336000 228.220000 549.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 228.196000 561.336000 235.288000 549.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 235.300000 561.336000 241.036000 549.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 241.000000 561.336000 248.152000 549.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 248.200000 561.336000 259.576000 549.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 259.600000 561.336000 263.428000 549.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 263.404000 561.336000 270.124000 549.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 270.100000 561.336000 273.904000 549.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 273.904000 561.336000 278.716000 549.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 278.704000 561.336000 282.532000 549.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 282.508000 561.336000 286.336000 549.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 286.312000 561.336000 293.404000 549.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 293.416000 561.336000 299.572000 549.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 299.620000 561.336000 303.424000 549.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 541.436000 229.492000 529.436000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 229.504000 541.436000 237.232000 529.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 237.208000 541.436000 244.300000 529.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 246.604000 541.436000 250.408000 529.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 256.600000 541.436000 264.592000 529.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 260.896000 541.436000 268.120000 529.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 268.096000 541.436000 275.320000 529.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 275.296000 541.436000 281.032000 529.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 283.396000 541.436000 287.200000 529.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 289.696000 541.436000 293.524000 529.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 293.500000 541.436000 299.656000 529.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 304.300000 541.436000 308.104000 529.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 308.300000 541.436000 313.112000 529.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 313.100000 541.436000 320.192000 529.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 320.204000 541.436000 325.940000 529.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 325.904000 541.436000 331.640000 529.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 331.604000 541.436000 338.756000 529.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 338.804000 541.436000 342.848000 529.436000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 342.908000 541.436000 349.628000 529.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 349.604000 541.436000 356.828000 529.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 356.804000 541.436000 361.616000 529.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 361.604000 541.436000 366.416000 529.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 366.404000 541.436000 373.556000 529.436000 1.000000 0.000000 0.000000 1.000000 a
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 373.600000 541.436000 377.404000 529.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 382.204000 541.436000 389.356000 529.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 389.308000 541.436000 397.036000 529.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 397.108000 541.436000 404.788000 529.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 407.104000 541.436000 410.908000 529.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 413.308000 541.436000 418.120000 529.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 418.108000 541.436000 425.836000 529.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 425.908000 541.436000 433.000000 529.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 435.304000 541.436000 439.108000 529.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 441.604000 541.436000 451.864000 529.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 451.900000 541.436000 459.052000 529.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 459.004000 541.436000 462.832000 529.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 462.904000 541.436000 466.732000 529.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 466.708000 541.436000 472.864000 529.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 475.108000 541.436000 478.912000 529.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 481.312000 541.436000 488.464000 529.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 488.512000 541.436000 494.248000 529.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 494.212000 541.436000 501.304000 529.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 503.716000 541.436000 507.520000 529.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 509.920000 541.436000 517.600000 529.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 517.624000 541.436000 521.452000 529.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 521.524000 541.436000 528.676000 529.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 528.724000 541.436000 532.552000 529.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 532.528000 541.436000 540.256000 529.436000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 541.436000 543.904000 529.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 527.536000 231.760000 515.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 231.796000 527.536000 239.524000 515.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 239.500000 527.536000 243.328000 515.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 243.304000 527.536000 248.116000 515.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 248.200000 527.536000 255.292000 515.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 255.304000 527.536000 259.108000 515.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.308000 527.536000 264.112000 515.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 265.408000 527.536000 274.072000 515.536000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 273.904000 527.536000 278.716000 515.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 280.000000 527.536000 283.804000 515.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 285.100000 527.536000 292.252000 515.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 292.300000 527.536000 299.980000 515.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 299.896000 527.536000 307.120000 515.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 307.192000 527.536000 314.920000 515.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 314.896000 527.536000 319.708000 515.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 320.896000 527.536000 324.700000 515.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 325.996000 527.536000 333.148000 515.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 334.492000 527.536000 338.296000 515.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 339.592000 527.536000 347.320000 515.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 347.296000 527.536000 354.388000 515.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 354.400000 527.536000 358.228000 515.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 358.300000 527.536000 365.980000 515.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 365.896000 527.536000 373.624000 515.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 373.696000 527.536000 378.508000 515.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 379.696000 527.536000 383.500000 515.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 384.796000 527.536000 392.020000 515.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 391.996000 527.536000 396.436000 515.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 397.792000 527.536000 401.596000 515.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 402.892000 527.536000 410.524000 515.536000 1.000000 0.000000 0.000000 1.000000 4
+drawChar 411.688000 527.536000 415.492000 515.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 416.788000 527.536000 421.228000 515.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 421.192000 527.536000 426.004000 515.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 426.088000 527.536000 429.892000 515.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.188000 527.536000 434.992000 515.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 436.288000 527.536000 441.100000 515.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 441.088000 527.536000 448.816000 515.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.888000 527.536000 455.980000 515.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 455.992000 527.536000 461.728000 515.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 461.692000 527.536000 468.784000 515.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 469.996000 527.536000 473.800000 515.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 475.096000 527.536000 478.924000 515.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 478.900000 527.536000 485.056000 515.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 486.400000 527.536000 490.204000 515.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 491.500000 527.536000 498.652000 515.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 499.900000 527.536000 503.704000 515.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 505.000000 527.536000 509.812000 515.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 509.800000 527.536000 516.892000 515.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 516.904000 527.536000 522.640000 515.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 522.700000 527.536000 528.436000 515.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 528.400000 527.536000 535.552000 515.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 535.600000 527.536000 539.644000 515.536000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 513.636000 228.220000 501.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 228.196000 513.636000 235.420000 501.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 235.396000 513.636000 240.208000 501.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 240.292000 513.636000 245.104000 501.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 245.092000 513.636000 252.244000 501.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 252.196000 513.636000 256.240000 501.636000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 256.300000 513.636000 263.020000 501.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 262.996000 513.636000 270.220000 501.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 270.196000 513.636000 274.024000 501.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 274.096000 513.636000 281.320000 501.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 281.296000 513.636000 287.032000 501.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 286.996000 513.636000 294.088000 501.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 294.100000 513.636000 301.780000 501.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 302.896000 513.636000 306.700000 501.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 307.900000 513.636000 315.580000 501.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 315.604000 513.636000 322.828000 501.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 322.804000 513.636000 328.540000 501.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 328.504000 513.636000 336.184000 501.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 336.304000 513.636000 343.396000 501.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 343.408000 513.636000 349.144000 501.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 350.308000 513.636000 354.112000 501.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 355.312000 513.636000 362.464000 501.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 362.512000 513.636000 366.340000 501.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 366.316000 513.636000 373.540000 501.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 373.516000 513.636000 381.244000 501.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 381.220000 513.636000 388.900000 501.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 390.016000 513.636000 393.820000 501.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 395.116000 513.636000 399.928000 501.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 399.916000 513.636000 407.644000 501.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 407.716000 513.636000 414.808000 501.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 415.912000 513.636000 419.716000 501.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 420.916000 513.636000 431.176000 501.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 431.212000 513.636000 438.364000 501.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 438.316000 513.636000 442.144000 501.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 442.216000 513.636000 446.044000 501.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 446.020000 513.636000 452.176000 501.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 453.316000 513.636000 457.120000 501.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 458.320000 513.636000 463.132000 501.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 463.120000 513.636000 470.344000 501.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 471.520000 513.636000 475.324000 501.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 476.620000 513.636000 487.996000 501.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 487.924000 513.636000 495.076000 501.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 495.124000 513.636000 499.936000 501.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 499.924000 513.636000 506.644000 501.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 506.620000 513.636000 514.348000 501.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 515.524000 513.636000 519.328000 501.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 520.528000 513.636000 525.340000 501.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 525.328000 513.636000 533.056000 501.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 533.128000 513.636000 540.220000 501.636000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.200000 513.636000 544.004000 501.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 499.736000 229.492000 487.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 229.504000 499.736000 236.728000 487.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 236.704000 499.736000 243.928000 487.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 243.904000 499.736000 249.640000 487.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 248.308000 499.736000 252.112000 487.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.112000 499.736000 255.916000 487.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 255.916000 499.736000 265.744000 487.736000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 265.720000 499.736000 270.160000 487.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 270.124000 499.736000 273.928000 487.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 273.928000 499.736000 280.648000 487.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 280.624000 499.736000 287.848000 487.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 287.824000 499.736000 295.552000 487.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 295.528000 499.736000 301.264000 487.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 301.228000 499.736000 307.384000 487.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 307.432000 499.736000 314.524000 487.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 314.536000 499.736000 318.340000 487.736000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 318.340000 499.736000 322.144000 487.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 322.144000 499.736000 326.956000 487.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 326.944000 499.736000 334.672000 487.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 334.648000 499.736000 341.740000 487.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 341.752000 499.736000 347.488000 487.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 347.452000 499.736000 354.544000 487.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 354.556000 499.736000 358.360000 487.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 358.360000 499.736000 365.512000 487.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 365.560000 499.736000 371.296000 487.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 371.260000 499.736000 378.352000 487.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 378.364000 499.736000 382.168000 487.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 382.168000 499.736000 389.320000 487.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 389.368000 499.736000 393.196000 487.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 393.172000 499.736000 399.328000 487.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 399.376000 499.736000 406.600000 487.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 406.576000 499.736000 410.380000 487.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 410.380000 499.736000 415.192000 487.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 415.180000 499.736000 425.440000 487.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 425.476000 499.736000 432.700000 487.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 432.676000 499.736000 436.480000 487.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 436.480000 499.736000 444.160000 487.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 444.184000 499.736000 451.336000 487.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 451.384000 499.736000 456.196000 487.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 456.184000 499.736000 463.912000 487.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 463.888000 499.736000 467.692000 487.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 467.692000 499.736000 479.068000 487.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 479.092000 499.736000 486.244000 487.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 486.292000 499.736000 491.104000 487.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 491.092000 499.736000 497.248000 487.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 497.296000 499.736000 501.100000 487.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 501.100000 499.736000 508.324000 487.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 508.300000 499.736000 516.028000 487.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 516.004000 499.736000 519.808000 487.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 519.808000 499.736000 524.620000 487.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 524.608000 499.736000 532.336000 487.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 532.312000 499.736000 539.404000 487.736000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.200000 499.736000 544.004000 487.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 485.836000 229.492000 473.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 229.504000 485.836000 236.728000 473.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 236.704000 485.836000 243.928000 473.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 244.000000 485.836000 249.736000 473.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 250.996000 485.836000 254.800000 473.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 256.192000 485.836000 261.004000 473.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 260.992000 485.836000 268.216000 473.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 269.596000 485.836000 273.400000 473.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 274.792000 485.836000 282.052000 473.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 282.088000 485.836000 289.180000 473.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 289.192000 485.836000 296.284000 473.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 296.296000 485.836000 303.976000 473.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 305.200000 485.836000 309.004000 473.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 310.396000 485.836000 315.208000 473.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 315.292000 485.836000 323.020000 473.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 322.996000 485.836000 330.220000 473.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 330.292000 485.836000 336.448000 473.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 336.388000 485.836000 343.480000 473.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 344.788000 485.836000 348.592000 473.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 349.984000 485.836000 357.664000 473.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 357.688000 485.836000 364.840000 473.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 364.792000 485.836000 370.528000 473.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 370.588000 485.836000 377.680000 473.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 378.988000 485.836000 382.792000 473.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 384.184000 485.836000 388.624000 473.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 388.588000 485.836000 395.680000 473.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 395.692000 485.836000 402.784000 473.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.796000 485.836000 407.608000 473.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 408.892000 485.836000 412.696000 473.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 414.196000 485.836000 424.456000 473.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 424.492000 485.836000 431.644000 473.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 431.596000 485.836000 437.332000 473.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 437.392000 485.836000 448.768000 473.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 448.696000 485.836000 452.500000 473.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.796000 485.836000 457.600000 473.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 458.992000 485.836000 466.984000 473.836000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 466.996000 485.836000 474.724000 473.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 474.700000 485.836000 481.792000 473.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 483.196000 485.836000 487.000000 473.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 488.392000 485.836000 496.072000 473.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 496.096000 485.836000 503.248000 473.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 503.200000 485.836000 508.012000 473.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 508.096000 485.836000 515.824000 473.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 515.800000 485.836000 520.612000 473.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 520.600000 485.836000 528.328000 473.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 528.304000 485.836000 535.984000 473.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 536.008000 485.836000 539.812000 473.836000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 485.836000 543.904000 473.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 471.936000 227.656000 459.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 471.936000 235.432000 459.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 235.408000 471.936000 242.632000 459.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 242.608000 471.936000 252.868000 459.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 252.904000 471.936000 259.996000 459.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 260.008000 471.936000 265.744000 459.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 264.604000 471.936000 268.408000 459.936000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 269.608000 471.936000 273.412000 459.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 273.400000 471.936000 278.212000 459.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 278.200000 471.936000 285.424000 459.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 285.400000 471.936000 289.228000 459.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 289.300000 471.936000 293.128000 459.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 293.104000 471.936000 300.196000 459.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 300.208000 471.936000 305.020000 459.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 305.704000 471.936000 309.508000 459.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 310.300000 471.936000 317.452000 459.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 317.500000 471.936000 325.228000 459.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 325.096000 471.936000 332.776000 459.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 334.192000 471.936000 337.996000 459.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 338.000000 471.936000 348.260000 459.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 348.296000 471.936000 355.448000 459.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 355.400000 471.936000 361.556000 459.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 361.604000 471.936000 369.332000 459.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 369.308000 471.936000 376.988000 459.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 377.012000 471.936000 384.164000 459.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 384.116000 471.936000 390.272000 459.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 390.320000 471.936000 394.148000 459.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 394.124000 471.936000 401.852000 459.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 402.620000 471.936000 406.424000 459.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 407.120000 471.936000 414.272000 459.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 414.320000 471.936000 420.056000 459.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 420.020000 471.936000 427.112000 459.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 427.820000 471.936000 431.624000 459.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 432.320000 471.936000 439.472000 459.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 439.520000 471.936000 443.348000 459.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 443.324000 471.936000 447.152000 459.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 447.824000 471.936000 451.628000 459.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 452.324000 471.936000 462.584000 459.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 462.620000 471.936000 470.348000 459.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 470.324000 471.936000 474.152000 459.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 474.128000 471.936000 478.940000 459.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 479.024000 471.936000 486.116000 459.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 486.128000 471.936000 489.932000 459.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.628000 471.936000 494.432000 459.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 495.128000 471.936000 503.120000 459.936000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 503.132000 471.936000 510.860000 459.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 510.836000 471.936000 517.928000 459.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 518.732000 471.936000 522.536000 459.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 523.928000 471.936000 531.920000 459.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 531.224000 471.936000 536.036000 459.936000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 471.936000 540.044000 459.936000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 458.036000 226.312000 446.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.300000 458.036000 230.128000 446.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 230.104000 458.036000 237.832000 446.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 237.808000 458.036000 245.488000 446.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 245.512000 458.036000 251.668000 446.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 251.716000 458.036000 255.520000 446.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 255.520000 458.036000 262.672000 446.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 262.720000 458.036000 268.456000 446.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 268.420000 458.036000 275.512000 446.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 275.524000 458.036000 279.328000 446.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.328000 458.036000 287.008000 446.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 287.032000 458.036000 290.860000 446.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 290.836000 458.036000 297.988000 446.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 298.036000 458.036000 304.756000 446.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 304.732000 458.036000 311.992000 446.036000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 312.028000 458.036000 315.832000 446.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 315.832000 458.036000 319.636000 446.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 319.636000 458.036000 326.788000 446.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 326.836000 458.036000 334.516000 446.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 334.540000 458.036000 341.764000 446.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 341.740000 458.036000 347.476000 446.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 347.440000 458.036000 355.168000 446.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 355.144000 458.036000 362.236000 446.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 362.248000 458.036000 369.928000 446.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 369.952000 458.036000 373.756000 446.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 373.756000 458.036000 384.016000 446.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 384.052000 458.036000 387.880000 446.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 387.856000 458.036000 392.668000 446.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 392.656000 458.036000 400.384000 446.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 400.360000 458.036000 404.164000 446.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 404.164000 458.036000 411.316000 446.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 411.364000 458.036000 415.168000 446.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 415.168000 458.036000 419.980000 446.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 419.968000 458.036000 427.120000 446.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 427.168000 458.036000 433.324000 446.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 433.372000 458.036000 438.184000 446.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 438.172000 458.036000 445.264000 446.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 445.276000 458.036000 449.716000 446.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 449.680000 458.036000 457.408000 446.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 457.384000 458.036000 461.212000 446.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 461.188000 458.036000 464.992000 446.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 464.992000 458.036000 472.672000 446.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 472.696000 458.036000 479.920000 446.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 479.896000 458.036000 483.724000 446.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 483.700000 458.036000 491.380000 446.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 491.404000 458.036000 495.208000 446.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 495.208000 458.036000 501.364000 446.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 501.412000 458.036000 506.224000 446.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 506.212000 458.036000 511.948000 446.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 511.912000 458.036000 519.004000 446.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 519.016000 458.036000 526.168000 446.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 526.216000 458.036000 533.476000 446.036000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 533.512000 458.036000 537.316000 446.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 103 1 0 0 0 1200.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 432.236000 117.244000 420.236000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 117.196000 432.236000 125.284000 420.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 125.296000 432.236000 131.032000 420.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 130.996000 432.236000 139.528000 420.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 139.492000 432.236000 145.228000 420.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.192000 432.236000 153.724000 420.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 153.688000 432.236000 162.268000 420.236000 1.000000 0.000000 0.000000 1.000000 b
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 415.236000 229.492000 403.236000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 229.504000 415.236000 237.232000 403.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 237.208000 415.236000 241.036000 403.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 241.108000 415.236000 247.264000 403.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 248.512000 415.236000 252.316000 403.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 253.708000 415.236000 257.536000 403.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 257.512000 415.236000 263.668000 403.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 265.108000 415.236000 268.912000 403.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 270.412000 415.236000 278.140000 403.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 278.116000 415.236000 285.340000 403.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 286.612000 415.236000 290.416000 403.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 291.808000 415.236000 299.032000 403.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 299.008000 415.236000 304.744000 403.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 304.804000 415.236000 312.484000 403.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 312.400000 415.236000 316.228000 403.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 316.300000 415.236000 324.028000 403.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 324.004000 415.236000 331.156000 403.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 331.204000 415.236000 336.940000 403.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 336.904000 415.236000 343.672000 403.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 342.100000 415.236000 345.904000 403.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 347.296000 415.236000 351.100000 403.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 352.492000 415.236000 358.228000 403.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.192000 415.236000 365.920000 403.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 365.992000 415.236000 373.720000 403.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 374.992000 415.236000 378.796000 403.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 380.188000 415.236000 387.412000 403.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 387.484000 415.236000 391.924000 403.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 393.280000 415.236000 397.084000 403.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.476000 415.236000 403.288000 403.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 403.276000 415.236000 411.004000 403.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 411.076000 415.236000 418.168000 403.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 419.476000 415.236000 423.280000 403.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 424.672000 415.236000 436.048000 403.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 436.072000 415.236000 439.900000 403.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 439.876000 415.236000 443.704000 403.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 443.776000 415.236000 447.604000 403.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 448.972000 415.236000 452.776000 403.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.168000 415.236000 461.848000 403.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 461.872000 415.236000 469.024000 403.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 468.976000 415.236000 473.788000 403.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 473.872000 415.236000 481.600000 403.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 481.576000 415.236000 486.388000 403.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 486.376000 415.236000 494.104000 403.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 494.080000 415.236000 501.760000 403.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 503.080000 415.236000 506.884000 403.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 508.276000 415.236000 516.004000 403.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 515.980000 415.236000 523.072000 403.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 523.084000 415.236000 528.820000 403.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 528.880000 415.236000 535.972000 403.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 535.984000 415.236000 539.788000 403.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 415.236000 543.904000 403.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 401.336000 229.492000 389.336000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 229.504000 401.336000 237.232000 389.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 237.208000 401.336000 244.300000 389.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 245.212000 401.336000 249.016000 389.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 250.012000 401.336000 257.740000 389.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 257.716000 401.336000 265.444000 389.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 265.516000 401.336000 273.196000 389.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 273.112000 401.336000 280.204000 389.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 281.308000 401.336000 285.112000 389.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 286.108000 401.336000 292.828000 389.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 292.804000 401.336000 300.028000 389.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 300.004000 401.336000 305.740000 389.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 305.800000 401.336000 313.528000 389.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 313.504000 401.336000 320.596000 389.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 320.608000 401.336000 326.344000 389.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 327.304000 401.336000 331.108000 389.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 332.104000 401.336000 336.916000 389.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 336.904000 401.336000 344.632000 389.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 344.704000 401.336000 352.384000 389.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 353.308000 401.336000 357.112000 389.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 358.108000 401.336000 361.936000 389.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 361.912000 401.336000 368.068000 389.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 369.016000 401.336000 372.820000 389.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 373.816000 401.336000 380.968000 389.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 381.016000 401.336000 384.844000 389.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 384.820000 401.336000 390.976000 389.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 391.024000 401.336000 398.248000 389.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 399.220000 401.336000 403.024000 389.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 404.020000 401.336000 411.172000 389.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 413.116000 401.336000 416.920000 389.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 417.300000 401.336000 427.560000 389.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 427.596000 401.336000 435.324000 389.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 435.300000 401.336000 439.128000 389.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 439.104000 401.336000 444.840000 389.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 444.900000 401.336000 448.728000 389.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 448.704000 401.336000 456.384000 389.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 456.408000 401.336000 463.632000 389.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 463.608000 401.336000 470.832000 389.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 470.808000 401.336000 474.636000 389.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 474.708000 401.336000 478.512000 389.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 479.508000 401.336000 483.312000 389.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.308000 401.336000 491.028000 389.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 491.004000 401.336000 498.228000 389.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 498.204000 401.336000 509.580000 389.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 509.604000 401.336000 517.284000 389.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 517.308000 401.336000 521.136000 389.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 521.112000 401.336000 528.204000 389.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 528.216000 401.336000 533.028000 389.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 533.112000 401.336000 540.204000 389.336000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 401.336000 543.904000 389.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 387.436000 231.760000 375.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 231.796000 387.436000 235.624000 375.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 235.600000 387.436000 240.412000 375.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 240.400000 387.436000 248.128000 375.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 251.200000 387.436000 255.004000 375.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 255.000000 387.436000 265.260000 375.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 265.296000 387.436000 272.448000 375.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 272.400000 387.436000 277.212000 375.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 277.200000 387.436000 284.292000 375.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 284.304000 387.436000 290.040000 375.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 291.600000 387.436000 295.404000 375.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 296.904000 387.436000 300.624000 375.436000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 300.600000 387.436000 307.692000 375.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 307.704000 387.436000 312.516000 375.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 312.504000 387.436000 318.660000 375.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 318.708000 387.436000 322.512000 375.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 324.012000 387.436000 327.816000 375.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 329.316000 387.436000 337.308000 375.436000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 337.320000 387.436000 345.048000 375.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 345.024000 387.436000 352.116000 375.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 353.724000 387.436000 357.528000 375.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 359.028000 387.436000 366.708000 375.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 366.732000 387.436000 373.824000 375.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 373.836000 387.436000 379.572000 375.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 379.536000 387.436000 383.976000 375.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 384.036000 387.436000 391.128000 375.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 391.140000 387.436000 397.860000 375.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 397.836000 387.436000 402.648000 375.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 404.136000 387.436000 407.940000 375.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 409.440000 387.436000 419.700000 375.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 419.736000 387.436000 426.888000 375.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 426.840000 387.436000 433.608000 375.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 435.144000 387.436000 438.948000 375.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 440.448000 387.436000 445.260000 375.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.248000 387.436000 452.472000 375.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 454.044000 387.436000 457.848000 375.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 459.348000 387.436000 465.084000 375.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.048000 387.436000 472.140000 375.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 472.152000 387.436000 475.980000 375.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 476.052000 387.436000 483.204000 375.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 483.156000 387.436000 489.912000 375.436000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 491.460000 387.436000 495.264000 375.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 496.764000 387.436000 503.916000 375.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 503.964000 387.436000 508.404000 375.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 508.368000 387.436000 513.180000 375.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 513.168000 387.436000 520.260000 375.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 520.272000 387.436000 526.008000 375.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 527.472000 387.436000 531.276000 375.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 532.872000 387.436000 540.024000 375.436000 1.000000 0.000000 0.000000 1.000000 a
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 387.436000 543.904000 375.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 373.536000 225.328000 361.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 225.304000 373.536000 232.528000 361.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 232.504000 373.536000 240.232000 361.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 240.208000 373.536000 247.888000 361.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 247.912000 373.536000 251.716000 361.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 251.716000 373.536000 259.396000 361.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 259.420000 373.536000 266.572000 361.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 266.620000 373.536000 273.388000 361.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 273.424000 373.536000 277.228000 361.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.228000 373.536000 284.380000 361.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 284.428000 373.536000 289.240000 361.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 289.228000 373.536000 293.032000 361.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 293.032000 373.536000 303.292000 361.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 303.328000 373.536000 310.552000 361.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 310.528000 373.536000 316.264000 361.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 316.228000 373.536000 323.488000 361.536000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 323.524000 373.536000 327.328000 361.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 327.328000 373.536000 331.156000 361.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 331.132000 373.536000 338.860000 361.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 338.836000 373.536000 342.640000 361.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 342.640000 373.536000 347.080000 361.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 347.044000 373.536000 352.780000 361.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 352.744000 373.536000 359.968000 361.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 359.944000 373.536000 367.672000 361.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 367.648000 373.536000 372.460000 361.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 372.448000 373.536000 376.252000 361.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 376.252000 373.536000 383.476000 361.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 383.452000 373.536000 387.892000 361.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 387.856000 373.536000 391.660000 361.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 391.660000 373.536000 396.472000 361.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 396.460000 373.536000 404.188000 361.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 404.164000 373.536000 411.256000 361.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 411.268000 373.536000 415.072000 361.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 415.072000 373.536000 421.792000 361.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 421.768000 373.536000 428.992000 361.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 428.968000 373.536000 440.344000 361.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 440.368000 373.536000 448.048000 361.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.072000 373.536000 455.800000 361.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 455.776000 373.536000 460.588000 361.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 460.576000 373.536000 467.668000 361.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 467.680000 373.536000 473.416000 361.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 472.084000 373.536000 475.888000 361.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 353.636000 231.328000 341.636000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 231.304000 353.636000 239.032000 341.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 239.308000 353.636000 243.112000 341.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 243.412000 353.636000 248.224000 341.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 248.212000 353.636000 255.940000 341.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 256.012000 353.636000 263.104000 341.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 263.308000 353.636000 267.112000 341.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 267.412000 353.636000 274.504000 341.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 274.516000 353.636000 282.196000 341.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 282.220000 353.636000 289.900000 341.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 289.924000 353.636000 297.016000 341.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 297.220000 353.636000 301.024000 341.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 301.324000 353.636000 308.548000 341.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 308.620000 353.636000 313.060000 341.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 313.324000 353.636000 317.128000 341.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 317.428000 353.636000 322.240000 341.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 322.228000 353.636000 329.956000 341.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 330.028000 353.636000 337.120000 341.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.324000 353.636000 341.128000 341.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 341.428000 353.636000 346.240000 341.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 346.228000 353.636000 353.956000 341.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 354.028000 353.636000 361.708000 341.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 361.924000 353.636000 365.728000 341.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 366.028000 353.636000 373.180000 341.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 373.228000 353.636000 378.964000 341.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 378.928000 353.636000 386.020000 341.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 386.224000 353.636000 390.028000 341.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 390.328000 353.636000 395.140000 341.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 395.224000 353.636000 402.952000 341.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 402.928000 353.636000 410.020000 341.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.332000 353.636000 414.136000 341.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 414.436000 353.636000 422.164000 341.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 422.140000 353.636000 428.296000 341.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 428.344000 353.636000 436.072000 341.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 436.048000 353.636000 443.200000 341.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 443.248000 353.636000 447.076000 341.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 447.244000 353.636000 451.048000 341.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 451.348000 353.636000 456.160000 341.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 456.148000 353.636000 463.876000 341.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 463.948000 353.636000 467.776000 341.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 467.752000 353.636000 475.480000 341.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 475.456000 353.636000 483.136000 341.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 483.160000 353.636000 489.316000 341.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 489.664000 353.636000 493.468000 341.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 493.768000 353.636000 499.924000 341.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 499.972000 353.636000 507.700000 341.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 507.676000 353.636000 514.396000 341.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 514.372000 353.636000 522.100000 341.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 522.268000 353.636000 526.072000 341.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 526.372000 353.636000 533.524000 341.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 533.572000 353.636000 539.728000 341.636000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 353.636000 543.904000 341.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 339.736000 227.656000 327.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 339.736000 234.928000 327.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 234.904000 339.736000 242.056000 327.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 242.008000 339.736000 249.688000 327.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 249.904000 339.736000 253.708000 327.736000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 254.500000 339.736000 258.304000 327.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 258.400000 339.736000 264.556000 327.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 264.604000 339.736000 272.332000 327.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 272.308000 339.736000 279.460000 327.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 279.412000 339.736000 290.788000 327.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 290.812000 339.736000 298.492000 327.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 298.516000 339.736000 305.740000 327.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 305.716000 339.736000 312.940000 327.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 313.120000 339.736000 316.924000 327.736000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 317.920000 339.736000 321.724000 327.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 321.600000 339.736000 327.756000 327.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 327.804000 339.736000 335.532000 327.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 335.508000 339.736000 342.732000 327.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 342.708000 339.736000 352.968000 327.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 353.004000 339.736000 360.096000 327.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 360.108000 339.736000 365.844000 327.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 366.312000 339.736000 370.116000 327.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.608000 339.736000 378.288000 327.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 378.312000 339.736000 385.404000 327.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 385.416000 339.736000 389.244000 327.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 389.820000 339.736000 393.624000 327.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 394.224000 339.736000 401.376000 327.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 401.424000 339.736000 409.152000 327.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 409.128000 339.736000 416.808000 327.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 417.732000 339.736000 421.536000 327.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 421.700000 339.736000 429.380000 327.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 429.404000 339.736000 436.556000 327.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 436.508000 339.736000 441.320000 327.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 441.404000 339.736000 449.132000 327.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 449.600000 339.736000 453.404000 327.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.004000 339.736000 460.160000 327.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 460.208000 339.736000 467.360000 327.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 467.312000 339.736000 471.140000 327.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 471.212000 339.736000 476.024000 327.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 476.012000 339.736000 482.168000 327.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 482.108000 339.736000 485.912000 327.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.404000 339.736000 490.208000 327.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 490.808000 339.736000 503.084000 327.736000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 503.012000 339.736000 509.780000 327.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 510.308000 339.736000 514.112000 327.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 514.712000 339.736000 520.448000 327.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 520.412000 339.736000 528.140000 327.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 528.212000 339.736000 535.892000 327.736000 1.000000 0.000000 0.000000 1.000000 b
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 535.900000 339.736000 539.944000 327.736000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 325.836000 229.180000 313.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 229.204000 325.836000 236.296000 313.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.308000 325.836000 242.044000 313.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 242.212000 325.836000 246.016000 313.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 246.208000 325.836000 253.888000 313.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 253.912000 325.836000 261.640000 313.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 261.616000 325.836000 268.336000 313.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 268.312000 325.836000 275.572000 313.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 275.608000 325.836000 282.376000 313.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 282.604000 325.836000 286.408000 313.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 286.708000 325.836000 293.968000 313.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 294.004000 325.836000 301.096000 313.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 301.108000 325.836000 308.200000 313.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 308.212000 325.836000 315.892000 313.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 315.916000 325.836000 322.072000 313.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 322.216000 325.836000 326.020000 313.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 326.320000 325.836000 333.472000 313.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 333.520000 325.836000 341.248000 313.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 341.320000 325.836000 345.124000 313.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 345.616000 325.836000 352.708000 313.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 352.720000 325.836000 359.488000 313.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 359.320000 325.836000 366.412000 313.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 366.616000 325.836000 370.420000 313.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.720000 325.836000 377.944000 313.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 377.920000 325.836000 385.648000 313.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 385.816000 325.836000 389.620000 313.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 389.920000 325.836000 397.012000 313.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 397.024000 325.836000 403.792000 313.836000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 403.828000 325.836000 410.920000 313.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.932000 325.836000 416.668000 313.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 416.632000 325.836000 423.400000 313.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 423.436000 325.836000 428.248000 313.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 428.236000 325.836000 435.964000 313.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 435.940000 325.836000 439.768000 313.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 439.840000 325.836000 447.568000 313.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 447.544000 325.836000 455.224000 313.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 455.440000 325.836000 459.244000 313.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 459.436000 325.836000 469.696000 313.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 469.732000 325.836000 477.460000 313.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 477.436000 325.836000 484.528000 313.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.540000 325.836000 492.268000 313.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 492.544000 325.836000 496.348000 313.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 496.648000 325.836000 501.388000 313.836000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 501.352000 325.836000 504.640000 313.836000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 504.652000 325.836000 516.028000 313.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 516.256000 325.836000 520.060000 313.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 520.252000 325.836000 527.980000 313.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 527.956000 325.836000 535.180000 313.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 535.252000 325.836000 540.064000 313.836000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 325.836000 543.904000 313.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 311.936000 226.312000 299.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 226.300000 311.936000 234.028000 299.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 234.004000 311.936000 241.096000 299.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 241.108000 311.936000 246.844000 299.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 246.808000 311.936000 253.900000 299.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 253.912000 311.936000 257.716000 299.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 103 1 0 0 0 1200.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 286.136000 120.040000 274.136000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 120.004000 286.136000 124.108000 274.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.108000 286.136000 130.024000 274.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.012000 286.136000 135.928000 274.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.916000 286.136000 144.160000 274.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 144.112000 286.136000 150.028000 274.136000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 269.136000 230.164000 257.136000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 230.200000 269.136000 237.880000 257.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 237.796000 269.136000 245.020000 257.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 245.092000 269.136000 251.860000 257.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 251.896000 269.136000 258.988000 257.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 260.800000 269.136000 264.604000 257.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.404000 269.136000 271.216000 257.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 271.204000 269.136000 278.932000 257.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 279.004000 269.136000 286.096000 257.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 287.800000 269.136000 291.604000 257.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 293.500000 269.136000 303.760000 257.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 303.796000 269.136000 310.948000 257.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 310.900000 269.136000 317.056000 257.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 317.104000 269.136000 324.832000 257.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 324.808000 269.136000 332.488000 257.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 332.512000 269.136000 339.664000 257.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 339.616000 269.136000 345.772000 257.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 345.820000 269.136000 349.648000 257.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 349.624000 269.136000 357.352000 257.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 359.224000 269.136000 363.028000 257.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 364.828000 269.136000 369.568000 257.136000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 371.428000 269.136000 375.232000 257.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.128000 269.136000 384.856000 257.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 384.832000 269.136000 391.984000 257.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 392.032000 269.136000 398.800000 257.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 398.836000 269.136000 405.928000 257.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 407.632000 269.136000 411.436000 257.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 413.332000 269.136000 420.484000 257.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 422.236000 269.136000 426.040000 257.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 427.936000 269.136000 435.664000 257.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 435.640000 269.136000 443.368000 257.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 443.440000 269.136000 451.120000 257.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 451.036000 269.136000 458.128000 257.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.036000 269.136000 463.840000 257.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 465.640000 269.136000 477.016000 257.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 477.040000 269.136000 480.868000 257.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 480.844000 269.136000 486.580000 257.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 486.640000 269.136000 492.376000 257.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 492.340000 269.136000 499.564000 257.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 499.540000 269.136000 505.276000 257.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 503.944000 269.136000 507.748000 257.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 509.548000 269.136000 513.352000 257.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 515.248000 269.136000 522.880000 257.136000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 523.200000 269.136000 527.004000 257.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 527.000000 269.136000 531.440000 257.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 531.404000 269.136000 536.216000 257.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 536.204000 269.136000 540.008000 257.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 269.136000 543.904000 257.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 255.236000 231.760000 243.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 231.796000 255.236000 235.624000 243.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 235.600000 255.236000 243.280000 243.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 243.304000 255.236000 250.396000 243.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 252.100000 255.236000 255.904000 243.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 257.704000 255.236000 264.856000 243.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 264.904000 255.236000 272.632000 243.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 272.608000 255.236000 280.288000 243.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 282.112000 255.236000 285.916000 243.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 287.716000 255.236000 295.348000 243.236000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 295.400000 255.236000 299.204000 243.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 299.200000 255.236000 303.640000 243.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 303.604000 255.236000 308.416000 243.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 308.500000 255.236000 312.304000 243.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 314.104000 255.236000 317.908000 243.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 319.708000 255.236000 324.520000 243.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 324.508000 255.236000 331.660000 243.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 331.708000 255.236000 335.536000 243.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 335.512000 255.236000 339.340000 243.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 339.412000 255.236000 343.216000 243.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 344.908000 255.236000 348.712000 243.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 350.512000 255.236000 360.340000 243.236000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 360.316000 255.236000 368.044000 243.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 369.820000 255.236000 373.624000 243.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 375.520000 255.236000 379.348000 243.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 379.324000 255.236000 384.136000 243.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 384.220000 255.236000 387.508000 243.236000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 387.520000 255.236000 393.676000 243.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 395.320000 255.236000 399.124000 243.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 400.924000 255.236000 404.752000 243.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 404.728000 255.236000 411.820000 243.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 411.832000 255.236000 416.272000 243.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 416.332000 255.236000 421.144000 243.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 422.932000 255.236000 426.736000 243.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 428.536000 255.236000 434.692000 243.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 434.740000 255.236000 438.568000 243.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 438.544000 255.236000 446.224000 243.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 446.248000 255.236000 453.340000 243.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 455.044000 255.236000 458.848000 243.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 460.648000 255.236000 465.460000 243.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 465.448000 255.236000 473.176000 243.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 473.248000 255.236000 480.340000 243.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 483.952000 255.236000 487.756000 243.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 487.800000 255.236000 496.980000 243.236000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 497.004000 255.236000 504.732000 243.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 504.708000 255.236000 510.444000 243.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 510.408000 255.236000 517.176000 243.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 517.212000 255.236000 523.368000 243.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 523.416000 255.236000 527.244000 243.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 527.220000 255.236000 534.312000 243.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 534.324000 255.236000 540.060000 243.236000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 255.236000 543.904000 243.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 241.336000 230.308000 229.336000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 230.296000 241.336000 238.024000 229.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 238.000000 241.336000 241.828000 229.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 241.900000 241.336000 245.728000 229.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 245.704000 241.336000 253.384000 229.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 253.408000 241.336000 257.236000 229.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 257.212000 241.336000 264.940000 229.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 265.012000 241.336000 272.692000 229.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 273.208000 241.336000 277.012000 229.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.612000 241.336000 282.052000 229.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 282.016000 241.336000 287.752000 229.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 287.716000 241.336000 294.940000 229.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 295.012000 241.336000 306.388000 229.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 307.408000 241.336000 311.212000 229.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 311.400000 241.336000 321.900000 229.336000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 321.900000 241.336000 328.992000 229.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 329.004000 241.336000 339.264000 229.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 339.900000 241.336000 343.704000 229.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 344.196000 241.336000 352.116000 229.336000 1.000000 0.000000 0.000000 1.000000 Y
+drawChar 351.096000 241.336000 358.320000 229.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 358.296000 241.336000 364.032000 229.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 363.996000 241.336000 371.256000 229.336000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 371.300000 241.336000 375.104000 229.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 376.196000 241.336000 380.024000 229.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 380.096000 241.336000 386.252000 229.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 386.792000 241.336000 390.596000 229.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 391.088000 241.336000 398.240000 229.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 398.288000 241.336000 405.968000 229.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 405.884000 241.336000 413.564000 229.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 413.588000 241.336000 417.416000 229.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 417.488000 241.336000 421.316000 229.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 421.292000 241.336000 428.384000 229.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 428.396000 241.336000 436.076000 229.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 436.700000 241.336000 440.504000 229.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 440.996000 241.336000 448.148000 229.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 448.196000 241.336000 454.352000 229.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 454.892000 241.336000 458.696000 229.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 459.188000 241.336000 466.340000 229.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 466.388000 241.336000 474.116000 229.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 474.692000 241.336000 478.496000 229.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 478.988000 241.336000 486.140000 229.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 486.188000 241.336000 493.868000 229.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 493.784000 241.336000 501.464000 229.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 501.584000 241.336000 505.412000 229.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 505.388000 241.336000 510.200000 229.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 510.284000 241.336000 514.112000 229.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 514.088000 241.336000 521.312000 229.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 521.288000 241.336000 529.016000 229.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 529.088000 241.336000 536.240000 229.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 536.192000 241.336000 540.020000 229.336000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 241.336000 543.904000 229.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 227.436000 232.876000 215.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 232.900000 227.436000 236.728000 215.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 236.704000 227.436000 242.440000 215.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 242.500000 227.436000 248.236000 215.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 248.200000 227.436000 255.424000 215.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 255.400000 227.436000 261.136000 215.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 262.204000 227.436000 266.008000 215.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 267.100000 227.436000 278.476000 215.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 278.404000 227.436000 285.556000 215.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 285.604000 227.436000 293.284000 215.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 293.200000 227.436000 300.292000 215.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 301.504000 227.436000 305.308000 215.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 306.400000 227.436000 310.840000 215.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 310.804000 227.436000 316.540000 215.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 316.600000 227.436000 323.824000 215.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 323.800000 227.436000 335.176000 215.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 336.196000 227.436000 340.000000 215.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 341.092000 227.436000 345.904000 215.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 345.892000 227.436000 349.720000 215.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 349.792000 227.436000 357.520000 215.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 357.496000 227.436000 362.308000 215.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 362.296000 227.436000 369.388000 215.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 369.400000 227.436000 377.080000 215.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 378.196000 227.436000 382.000000 215.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 383.092000 227.436000 390.772000 215.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 390.796000 227.436000 394.624000 215.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 394.600000 227.436000 401.752000 215.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 401.800000 227.436000 407.956000 215.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 407.896000 227.436000 414.052000 215.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 415.096000 227.436000 418.900000 215.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 419.992000 227.436000 426.712000 215.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 426.688000 227.436000 434.416000 215.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 434.392000 227.436000 439.204000 215.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 440.392000 227.436000 444.196000 215.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 445.288000 227.436000 449.116000 215.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 449.092000 227.436000 456.820000 215.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 456.892000 227.436000 461.704000 215.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 461.692000 227.436000 468.916000 215.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 469.888000 227.436000 473.692000 215.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.784000 227.436000 479.596000 215.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 479.584000 227.436000 487.312000 215.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 487.384000 227.436000 494.476000 215.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 495.580000 227.436000 499.384000 215.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 500.476000 227.436000 507.628000 215.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 507.676000 227.436000 515.356000 215.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 515.272000 227.436000 522.952000 215.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 522.976000 227.436000 528.712000 215.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 528.772000 227.436000 535.996000 215.436000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 227.436000 540.044000 215.436000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 213.536000 229.180000 201.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 229.204000 213.536000 234.940000 201.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 234.904000 213.536000 238.732000 201.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 238.708000 213.536000 245.860000 201.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 245.908000 213.536000 250.720000 201.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 250.708000 213.536000 257.800000 201.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 257.812000 213.536000 261.616000 201.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 261.616000 213.536000 267.772000 201.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 267.820000 213.536000 275.548000 201.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 275.524000 213.536000 282.676000 201.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 282.724000 213.536000 290.404000 201.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 290.428000 213.536000 297.520000 201.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 297.532000 213.536000 301.336000 201.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 301.336000 213.536000 308.488000 201.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 308.536000 213.536000 316.264000 201.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 316.240000 213.536000 323.920000 201.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 323.944000 213.536000 327.748000 201.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 327.748000 213.536000 335.428000 201.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 335.452000 213.536000 339.280000 201.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 339.256000 213.536000 346.984000 201.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 346.960000 213.536000 354.052000 201.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 354.064000 213.536000 361.744000 201.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 361.768000 213.536000 365.572000 201.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 365.572000 213.536000 372.796000 201.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 372.772000 213.536000 380.500000 201.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 380.476000 213.536000 385.288000 201.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 385.276000 213.536000 392.500000 201.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 392.476000 213.536000 396.280000 201.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 396.280000 213.536000 401.092000 201.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 401.080000 213.536000 408.808000 201.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 408.784000 213.536000 415.876000 201.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 415.888000 213.536000 419.692000 201.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 419.692000 213.536000 431.068000 201.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 431.092000 213.536000 438.244000 201.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 438.292000 213.536000 442.120000 201.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 442.096000 213.536000 449.824000 201.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 449.800000 213.536000 453.604000 201.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 453.604000 213.536000 464.980000 201.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 465.004000 213.536000 468.832000 201.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 468.808000 213.536000 474.544000 201.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.508000 213.536000 480.244000 201.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 480.208000 213.536000 487.432000 201.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 487.408000 213.536000 493.144000 201.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 491.812000 213.536000 495.616000 201.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 108.100000 90.136000 116.164000 78.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 115.600000 90.136000 122.752000 78.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 122.800000 90.136000 130.480000 78.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 130.504000 90.136000 137.596000 78.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.608000 90.136000 141.412000 78.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 141.400000 90.136000 149.032000 78.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 148.996000 90.136000 156.628000 78.136000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 7552.600000 0 477.900000 7552.600000 0 477.900000 7862.400000 0 134.300000 7862.400000 0 134.300000 7552.600000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -676070.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 4563.600000 0 168.100000 4563.600000 0 168.100000 4568.600000 0 76.900000 4568.600000 0 76.900000 4563.600000 0
+eoFillPath subpath 1 163.100000 4568.500000 0 168.100000 4568.500000 0 168.100000 4699.100000 0 163.100000 4699.100000 0 163.100000 4568.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 4568.600000 0 163.100000 4568.600000 0 163.100000 4704.000000 0 72.000000 4704.000000 0 72.000000 4568.600000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 4699.680000 87.320000 4689.680000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 4699.680000 93.420000 4689.680000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 4699.680000 97.510000 4689.680000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 4699.680000 101.420000 4689.680000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 4699.680000 104.170000 4689.680000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 4699.680000 110.530000 4689.680000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 4699.680000 113.270000 4689.680000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 4699.680000 116.470000 4689.680000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 4699.680000 123.480000 4689.680000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 4699.680000 129.610000 4689.680000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 4699.680000 135.090000 4689.680000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 4699.680000 140.890000 4689.680000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 4699.680000 144.820000 4689.680000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 4699.680000 150.920000 4689.680000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 4699.680000 153.670000 4689.680000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 4699.680000 156.470000 4689.680000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 4572.800000 0 168.200000 4572.800000 0 168.200000 4688.000000 0 72.000000 4688.000000 0 72.000000 4572.800000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4640.952000 79.253000 4631.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 4640.952000 86.669000 4631.952000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 4640.952000 90.215000 4631.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 4640.952000 93.077000 4631.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 4640.952000 97.406000 4631.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 4640.952000 100.853000 4631.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 4640.952000 107.324000 4631.952000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 4640.952000 112.337000 4631.952000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 4640.952000 115.271000 4631.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 4640.952000 118.655000 4631.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 4640.952000 126.512000 4631.952000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 4640.952000 130.805000 4631.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 4640.952000 135.881000 4631.952000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 4640.952000 139.355000 4631.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 4640.952000 147.284000 4631.952000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 4640.952000 150.074000 4631.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 4640.952000 155.897000 4631.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 4640.952000 158.750000 4631.952000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 4640.952000 161.853000 4631.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4630.452000 82.124000 4621.452000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 4630.452000 87.137000 4621.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 4630.452000 90.071000 4621.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 4630.452000 93.356000 4621.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 4630.452000 100.403000 4621.452000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 4630.452000 104.921000 4621.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 4630.452000 109.205000 4621.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 4630.452000 117.737000 4621.452000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 4630.452000 123.119000 4621.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 4630.452000 128.996000 4621.452000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 4630.452000 132.605000 4621.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 4630.452000 138.392000 4621.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 4630.452000 141.749000 4621.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 4630.452000 149.507000 4621.452000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 4630.452000 153.800000 4621.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 4630.452000 158.876000 4621.452000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 4630.452000 161.853000 4621.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4619.952000 81.764000 4610.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 4619.952000 87.596000 4610.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 4619.952000 93.356000 4610.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 4619.952000 102.050000 4610.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 4619.952000 113.822000 4610.952000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 4619.952000 122.651000 4610.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 4619.952000 134.117000 4610.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 4619.952000 138.401000 4610.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 4619.952000 147.149000 4610.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 4619.952000 158.921000 4610.952000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 4619.952000 161.853000 4610.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4609.452000 79.271000 4600.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 4609.452000 84.338000 4600.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 4609.452000 89.621000 4600.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 4609.452000 94.643000 4600.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 4609.452000 100.502000 4600.452000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 4609.452000 106.262000 4600.452000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 4609.452000 111.518000 4600.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 4609.452000 116.216000 4600.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 4609.452000 119.249000 4600.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 4609.452000 122.363000 4600.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 4609.452000 128.186000 4600.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 4609.452000 131.345000 4600.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 4609.452000 137.060000 4600.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 4609.452000 140.147000 4600.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 4609.452000 145.007000 4600.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 4609.452000 148.598000 4600.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 4609.452000 151.460000 4600.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 4609.452000 155.789000 4600.452000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 4609.452000 158.933000 4600.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4598.952000 80.702000 4589.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 4598.952000 83.573000 4589.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 4598.952000 89.396000 4589.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 4598.952000 95.156000 4589.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 4598.952000 100.547000 4589.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 4598.952000 109.052000 4589.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 4598.952000 111.959000 4589.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 4598.952000 117.251000 4589.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 4598.952000 121.904000 4589.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 4598.952000 126.503000 4589.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 4598.952000 129.338000 4589.952000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 4598.952000 134.936000 4589.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 4598.952000 143.441000 4589.952000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 4598.952000 148.796000 4589.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 4598.952000 154.574000 4589.952000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 4598.952000 158.876000 4589.952000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 4598.952000 161.853000 4589.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4588.452000 79.271000 4579.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 4588.452000 85.094000 4579.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 4588.452000 88.703000 4579.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 4588.452000 94.112000 4579.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 4588.452000 97.244000 4579.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 4588.452000 103.058000 4579.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 4588.452000 108.890000 4579.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 4588.452000 111.950000 4579.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 4588.452000 115.271000 4579.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 4588.452000 120.338000 4579.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 4588.452000 125.621000 4579.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 4588.452000 131.363000 4579.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 4588.452000 134.558000 4579.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 4588.452000 140.048000 4579.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 4588.452000 145.430000 4579.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 4588.452000 150.551000 4579.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 4588.452000 155.960000 4579.452000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 4588.452000 158.933000 4579.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4577.952000 80.009000 4568.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 4577.952000 85.364000 4568.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 4577.952000 88.271000 4568.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 4577.952000 91.169000 4568.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 4577.952000 97.955000 4568.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 4577.952000 107.765000 4568.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 4577.952000 110.672000 4568.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 4577.952000 115.964000 4568.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 4577.952000 120.617000 4568.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 4577.952000 125.216000 4568.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 4577.952000 128.051000 4568.952000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 4577.952000 134.954000 4568.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 4577.952000 146.285000 4568.952000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 4577.952000 151.667000 4568.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 4577.952000 155.906000 4568.952000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 4577.952000 159.033000 4568.952000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 4568.500000 0 72.100000 4568.500000 0 72.100000 4704.000000 0 72.000000 4704.000000 0 72.000000 4568.500000 0
+eoFillPath subpath 1 163.100000 4568.500000 0 163.200000 4568.500000 0 163.200000 4704.000000 0 163.100000 4704.000000 0 163.100000 4568.500000 0
+eoFillPath subpath 1 72.000000 4703.900000 0 163.200000 4703.900000 0 163.200000 4704.000000 0 72.000000 4704.000000 0 72.000000 4703.900000 0
+eoFillPath subpath 1 72.000000 4568.500000 0 163.200000 4568.500000 0 163.200000 4568.600000 0 72.000000 4568.600000 0 72.000000 4568.500000 0
+saveState
+eoClipPath subpath 1 96.900000 4643.800000 0 138.300000 4643.800000 0 138.300000 4688.000000 0 96.900000 4688.000000 0 96.900000 4643.800000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -385190.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 4289.000000 0 165.500000 4289.000000 0 165.500000 4294.000000 0 76.900000 4294.000000 0 76.900000 4289.000000 0
+eoFillPath subpath 1 160.500000 4293.900000 0 165.500000 4293.900000 0 165.500000 4450.200000 0 160.500000 4450.200000 0 160.500000 4293.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 4294.000000 0 121.400000 4294.000000 0 121.400000 4455.100000 0 72.000000 4455.100000 0 72.000000 4294.000000 0
+saveState
+eoClipPath subpath 1 72.000000 4293.900000 0 160.500000 4293.900000 0 160.500000 4455.000000 0 72.000000 4455.000000 0 72.000000 4293.900000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -348490.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 4450.780000 89.280000 4440.780000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 4450.780000 95.630000 4440.780000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 4450.780000 99.520000 4440.780000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 4450.780000 102.270000 4440.780000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 4450.780000 108.450000 4440.780000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 4450.780000 112.610000 4440.780000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 4450.780000 118.510000 4440.780000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 4450.780000 121.670000 4440.780000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 4450.780000 124.470000 4440.780000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 4450.780000 130.830000 4440.780000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 4450.780000 133.970000 4440.780000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 4450.780000 137.920000 4440.780000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 4450.780000 144.230000 4440.780000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 4450.780000 150.350000 4440.780000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 4450.780000 153.570000 4440.780000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 4439.080000 95.000000 4429.080000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 4439.080000 97.770000 4429.080000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 4439.080000 103.000000 4429.080000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 4439.080000 109.330000 4429.080000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 4439.080000 117.470000 4429.080000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 4439.080000 123.620000 4429.080000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 4439.080000 128.800000 4429.080000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 4439.080000 135.130000 4429.080000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 4439.080000 141.250000 4429.080000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 4439.080000 145.410000 4429.080000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4424.252000 82.961000 4415.252000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 4424.252000 87.614000 4415.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 4424.252000 93.356000 4415.252000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 4424.252000 98.612000 4415.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 4424.252000 103.733000 4415.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 4424.252000 106.568000 4415.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 4424.252000 111.959000 4415.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 4424.252000 114.866000 4415.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 4424.252000 117.665000 4415.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 4424.252000 122.768000 4415.252000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 4424.252000 125.747000 4415.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 4424.252000 131.651000 4415.252000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 4424.252000 136.907000 4415.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 4424.252000 142.307000 4415.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 4424.252000 148.049000 4415.252000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 4424.252000 150.956000 4415.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 4424.252000 156.302000 4415.252000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 4424.252000 159.253000 4415.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4413.752000 84.095000 4404.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 4413.752000 89.900000 4404.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 4413.752000 95.318000 4404.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 4413.752000 100.349000 4404.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 4413.752000 110.789000 4404.752000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 4413.752000 111.464000 4404.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 4413.752000 114.362000 4404.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 4413.752000 119.348000 4404.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 4413.752000 126.962000 4404.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 4413.752000 132.047000 4404.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 4413.752000 139.958000 4404.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 4413.752000 142.865000 4404.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 4413.752000 147.410000 4404.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 4413.752000 153.287000 4404.752000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 4413.752000 156.333000 4404.752000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4403.252000 84.095000 4394.252000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 4403.252000 89.468000 4394.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 4403.252000 94.121000 4394.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 4403.252000 99.899000 4394.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 4403.252000 105.218000 4394.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 4403.252000 109.502000 4394.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 4403.252000 115.649000 4394.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 4403.252000 122.327000 4394.252000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 4403.252000 127.718000 4394.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 4403.252000 132.002000 4394.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 4403.252000 138.149000 4394.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 4403.252000 145.205000 4394.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 4403.252000 150.992000 4394.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 4403.252000 156.311000 4394.252000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 4403.252000 159.253000 4394.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4392.752000 82.394000 4383.752000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 4392.752000 86.705000 4383.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 4392.752000 91.322000 4383.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 4392.752000 94.913000 4383.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 4392.752000 98.054000 4383.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 4392.752000 102.014000 4383.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 4392.752000 104.876000 4383.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 4392.752000 113.435000 4383.752000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 4392.752000 118.718000 4383.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 4392.752000 121.949000 4383.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 4392.752000 125.063000 4383.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 4392.752000 130.886000 4383.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 4392.752000 134.045000 4383.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 4392.752000 138.005000 4383.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 4392.752000 143.792000 4383.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 4392.752000 149.111000 4383.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 4392.752000 151.964000 4383.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 4392.752000 156.293000 4383.752000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 4392.752000 159.153000 4383.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4382.252000 79.271000 4373.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 4382.252000 82.169000 4373.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 4382.252000 85.526000 4373.252000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 4382.252000 90.818000 4373.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 4382.252000 94.454000 4373.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 4382.252000 99.008000 4373.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 4382.252000 104.318000 4373.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 4382.252000 110.096000 4373.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 4382.252000 115.856000 4373.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 4382.252000 119.546000 4373.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 4382.252000 124.001000 4373.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 4382.252000 129.509000 4373.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 4382.252000 133.145000 4373.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 4382.252000 139.751000 4373.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 4382.252000 145.205000 4373.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 4382.252000 148.841000 4373.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 4382.252000 152.657000 4373.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 4382.252000 156.293000 4373.252000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 4382.252000 159.253000 4373.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4371.752000 84.095000 4362.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 4371.752000 88.406000 4362.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 4371.752000 93.824000 4362.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 4371.752000 99.602000 4362.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 4371.752000 105.362000 4362.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 4371.752000 108.422000 4362.752000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 4371.752000 116.747000 4362.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 4371.752000 129.275000 4362.752000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 4371.752000 135.089000 4362.752000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 4371.752000 138.698000 4362.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 4371.752000 141.560000 4362.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 4371.752000 146.906000 4362.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 4371.752000 151.190000 4362.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 4371.752000 156.266000 4362.752000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 4371.752000 159.253000 4362.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4361.252000 82.196000 4352.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 4361.252000 87.560000 4352.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 4361.252000 92.213000 4352.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 4361.252000 96.551000 4352.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 4361.252000 101.708000 4352.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 4361.252000 107.216000 4352.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 4361.252000 111.653000 4352.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 4361.252000 118.961000 4352.252000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 4361.252000 124.316000 4352.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 4361.252000 128.654000 4352.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 4361.252000 133.172000 4352.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 4361.252000 138.995000 4352.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 4361.252000 143.612000 4352.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 4361.252000 148.913000 4352.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 4361.252000 153.197000 4352.252000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 4361.252000 156.333000 4352.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4350.752000 80.009000 4341.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 4350.752000 85.319000 4341.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 4350.752000 91.061000 4341.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 4350.752000 100.052000 4341.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 4350.752000 113.993000 4341.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 4350.752000 116.873000 4341.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 4350.752000 120.410000 4341.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 4350.752000 126.296000 4341.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 4350.752000 135.350000 4341.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 4350.752000 145.106000 4341.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 4350.752000 150.893000 4341.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 4350.752000 156.212000 4341.752000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 4350.752000 159.253000 4341.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4340.252000 82.196000 4331.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 4340.252000 87.560000 4331.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 4340.252000 93.392000 4331.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 4340.252000 99.152000 4331.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 4340.252000 101.960000 4331.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 4340.252000 107.306000 4331.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 4340.252000 111.905000 4331.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 4340.252000 115.640000 4331.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 4340.252000 122.444000 4331.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 4340.252000 127.898000 4331.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 4340.252000 135.575000 4331.252000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 4340.252000 141.380000 4331.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 4340.252000 145.241000 4331.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 4340.252000 150.803000 4331.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 4340.252000 156.302000 4331.252000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 4340.252000 159.253000 4331.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4329.752000 80.009000 4320.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 4329.752000 85.796000 4320.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 4329.752000 91.115000 4320.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 4329.752000 95.399000 4320.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 4329.752000 100.718000 4320.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 4329.752000 107.054000 4320.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 4329.752000 118.097000 4320.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 4329.752000 123.524000 4320.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 4329.752000 129.401000 4320.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 4329.752000 131.768000 4320.752000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 4329.752000 135.413000 4320.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 4329.752000 141.659000 4320.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 4329.752000 150.965000 4320.752000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 4329.752000 156.320000 4320.752000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 4329.752000 159.253000 4320.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4319.252000 81.017000 4310.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 4319.252000 84.608000 4310.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 4319.252000 89.963000 4310.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 4319.252000 92.870000 4310.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 4319.252000 98.693000 4310.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 4319.252000 103.310000 4310.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 4319.252000 107.243000 4310.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 4319.252000 116.081000 4310.252000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 4319.252000 121.886000 4310.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 4319.252000 127.205000 4310.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 4319.252000 132.983000 4310.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 4319.252000 136.943000 4310.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 4319.252000 143.846000 4310.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 4319.252000 148.184000 4310.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 4319.252000 153.260000 4310.252000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 4319.252000 156.433000 4310.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4308.752000 79.271000 4299.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 4308.752000 85.094000 4299.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 4308.752000 90.854000 4299.752000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 4308.752000 93.653000 4299.752000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 4293.900000 0 72.100000 4293.900000 0 72.100000 4455.100000 0 72.000000 4455.100000 0 72.000000 4293.900000 0
+eoFillPath subpath 1 160.500000 4293.900000 0 160.600000 4293.900000 0 160.600000 4455.100000 0 160.500000 4455.100000 0 160.500000 4293.900000 0
+eoFillPath subpath 1 72.000000 4455.000000 0 160.600000 4455.000000 0 160.600000 4455.100000 0 72.000000 4455.100000 0 72.000000 4455.000000 0
+eoFillPath subpath 1 72.000000 4293.900000 0 160.600000 4293.900000 0 160.600000 4294.000000 0 72.000000 4294.000000 0 72.000000 4293.900000 0
+saveState
+eoClipPath subpath 1 108.000000 3806.500000 0 178.900000 3806.500000 0 178.900000 3863.200000 0 108.000000 3863.200000 0 108.000000 3806.500000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -301460.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 -251.900000 0 165.500000 -251.900000 0 165.500000 -246.900000 0 76.900000 -246.900000 0 76.900000 -251.900000 0
+eoFillPath subpath 1 160.500000 -247.000000 0 165.500000 -247.000000 0 165.500000 -138.200000 0 160.500000 -138.200000 0 160.500000 -247.000000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 -246.900000 0 160.500000 -246.900000 0 160.500000 -133.300000 0 72.000000 -133.300000 0 72.000000 -246.900000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -137.648000 83.771000 -146.648000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 -137.648000 89.594000 -146.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 -137.648000 92.465000 -146.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 -137.648000 97.568000 -146.648000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 -137.648000 100.943000 -146.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 -137.648000 106.955000 -146.648000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 -137.648000 110.447000 -146.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 -137.648000 114.425000 -146.648000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 -137.648000 119.717000 -146.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 -137.648000 127.493000 -146.648000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 -137.648000 130.949000 -146.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 -137.648000 136.574000 -146.648000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 -137.648000 141.920000 -146.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 -137.648000 147.365000 -146.648000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 -137.648000 151.703000 -146.648000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 -137.648000 156.320000 -146.648000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 -137.648000 159.153000 -146.648000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -148.148000 81.764000 -157.148000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 -148.148000 85.130000 -157.148000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 -148.148000 88.712000 -157.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 -148.148000 94.022000 -157.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 -148.148000 98.306000 -157.148000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -148.148000 102.455000 -157.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 -148.148000 106.676000 -157.148000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 -148.148000 110.312000 -157.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 -148.148000 114.920000 -157.148000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 -148.148000 119.060000 -157.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 -148.148000 125.450000 -157.148000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 -148.148000 130.832000 -157.148000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 -148.148000 139.445000 -157.148000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 -148.148000 145.169000 -157.148000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 -148.148000 148.076000 -157.148000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 -148.148000 153.323000 -157.148000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -148.148000 156.433000 -157.148000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -158.648000 80.009000 -167.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 -158.648000 82.871000 -167.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 -158.648000 88.316000 -167.648000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 -158.648000 94.094000 -167.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 -158.648000 96.947000 -167.648000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 -158.648000 104.948000 -167.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 -158.648000 113.705000 -167.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 -158.648000 119.492000 -167.648000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 -158.648000 124.811000 -167.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 -158.648000 132.848000 -167.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 -158.648000 141.605000 -167.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 -158.648000 144.467000 -167.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 -158.648000 148.103000 -167.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 -158.648000 150.965000 -167.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 -158.648000 156.311000 -167.648000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -158.648000 159.253000 -167.648000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -169.148000 80.999000 -178.148000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 -169.148000 90.539000 -178.148000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 -169.148000 95.318000 -178.148000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 -169.148000 99.602000 -178.148000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 -169.148000 102.473000 -178.148000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 -169.148000 108.260000 -178.148000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 -169.148000 110.762000 -178.148000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 -169.148000 115.316000 -178.148000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 -169.148000 122.156000 -178.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 -169.148000 132.299000 -178.148000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 -169.148000 136.970000 -178.148000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 -169.148000 139.877000 -178.148000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 -169.148000 142.775000 -178.148000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 -169.148000 148.022000 -178.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 -169.148000 152.720000 -178.148000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 -169.148000 156.311000 -178.148000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -169.148000 159.253000 -178.148000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -179.648000 83.006000 -188.648000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 -179.648000 88.793000 -188.648000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 -179.648000 91.664000 -188.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 -179.648000 94.562000 -188.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 -179.648000 100.349000 -188.648000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 -179.648000 103.157000 -188.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 -179.648000 108.980000 -188.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 -179.648000 114.740000 -188.648000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 -179.648000 119.375000 -188.648000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 -179.648000 128.033000 -188.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 -179.648000 141.479000 -188.648000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 -179.648000 146.807000 -188.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 -179.648000 152.684000 -188.648000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 -179.648000 156.293000 -188.648000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -179.648000 159.253000 -188.648000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -190.148000 79.730000 -199.148000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 -190.148000 84.005000 -199.148000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 -190.148000 89.423000 -199.148000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 -190.148000 98.036000 -199.148000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 -190.148000 121.157000 -199.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 -190.148000 145.115000 -199.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 -190.148000 151.001000 -199.148000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 -190.148000 156.320000 -199.148000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 -190.148000 159.253000 -199.148000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -200.648000 83.285000 -209.648000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 -200.648000 89.099000 -209.648000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 -200.648000 93.401000 -209.648000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 -200.648000 98.477000 -209.648000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 -200.648000 103.121000 -209.648000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 -200.648000 105.974000 -209.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 -200.648000 111.320000 -209.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 -200.648000 115.604000 -209.648000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 -200.648000 123.857000 -209.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 -200.648000 136.007000 -209.648000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 -200.648000 141.794000 -209.648000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 -200.648000 144.665000 -209.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 -200.648000 147.464000 -209.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 -200.648000 153.251000 -209.648000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -200.648000 156.433000 -209.648000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -211.148000 79.271000 -220.148000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -211.148000 85.094000 -220.148000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -211.148000 90.854000 -220.148000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 -211.148000 96.146000 -220.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 -211.148000 102.302000 -220.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 -211.148000 107.711000 -220.148000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 -211.148000 113.048000 -220.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 -211.148000 119.204000 -220.148000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 -211.148000 124.991000 -220.148000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 -211.148000 130.310000 -220.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 -211.148000 135.647000 -220.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 -211.148000 144.755000 -220.148000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 -211.148000 153.323000 -220.148000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 -211.148000 156.333000 -220.148000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -221.648000 82.160000 -230.648000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 -221.648000 85.067000 -230.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 -221.648000 89.297000 -230.648000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 -221.648000 94.616000 -230.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 -221.648000 98.747000 -230.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 -221.648000 106.055000 -230.648000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 -221.648000 109.700000 -230.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 -221.648000 115.055000 -230.648000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 -221.648000 118.601000 -230.648000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 -221.648000 124.010000 -230.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 -221.648000 128.042000 -230.648000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 -221.648000 135.998000 -230.648000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 -221.648000 141.785000 -230.648000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 -221.648000 144.656000 -230.648000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 -221.648000 147.554000 -230.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 -221.648000 153.341000 -230.648000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 -221.648000 156.433000 -230.648000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 -232.148000 79.271000 -241.148000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 -232.148000 85.094000 -241.148000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 -232.148000 90.854000 -241.148000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 -232.148000 93.743000 -241.148000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 -247.000000 0 72.100000 -247.000000 0 72.100000 -133.300000 0 72.000000 -133.300000 0 72.000000 -247.000000 0
+eoFillPath subpath 1 160.500000 -247.000000 0 160.600000 -247.000000 0 160.600000 -133.300000 0 160.500000 -133.300000 0 160.500000 -247.000000 0
+eoFillPath subpath 1 72.000000 -133.400000 0 160.600000 -133.400000 0 160.600000 -133.300000 0 72.000000 -133.300000 0 72.000000 -133.400000 0
+eoFillPath subpath 1 72.000000 -247.000000 0 160.600000 -247.000000 0 160.600000 -246.900000 0 72.000000 -246.900000 0 72.000000 -247.000000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 5942.600000 0 169.600000 5942.600000 0 169.600000 5947.600000 0 76.900000 5947.600000 0 76.900000 5942.600000 0
+eoFillPath subpath 1 164.600000 5947.500000 0 169.600000 5947.500000 0 169.600000 6063.100000 0 164.600000 6063.100000 0 164.600000 5947.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 5947.600000 0 121.400000 5947.600000 0 121.400000 6068.000000 0 72.000000 6068.000000 0 72.000000 5947.600000 0
+saveState
+eoClipPath subpath 1 72.000000 5947.500000 0 164.600000 5947.500000 0 164.600000 6067.900000 0 72.000000 6067.900000 0 72.000000 5947.500000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -509730.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 6017.500000 0 93.700000 6017.500000 0 93.700000 6036.700000 0 72.000000 6036.700000 0 72.000000 6017.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 6017.500000 0 169.600000 6017.500000 0 169.600000 6036.700000 0 93.700000 6036.700000 0 93.700000 6017.500000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 6000.800000 0 93.700000 6000.800000 0 93.700000 6017.500000 0 72.000000 6017.500000 0 72.000000 6000.800000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 6000.800000 0 169.600000 6000.800000 0 169.600000 6017.500000 0 93.700000 6017.500000 0 93.700000 6000.800000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 5981.600000 0 93.700000 5981.600000 0 93.700000 6000.800000 0 72.000000 6000.800000 0 72.000000 5981.600000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 5981.600000 0 169.600000 5981.600000 0 169.600000 6000.800000 0 93.700000 6000.800000 0 93.700000 5981.600000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 5962.400000 0 93.700000 5962.400000 0 93.700000 5981.600000 0 72.000000 5981.600000 0 72.000000 5962.400000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 5962.400000 0 169.600000 5962.400000 0 169.600000 5981.600000 0 93.700000 5981.600000 0 93.700000 5962.400000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6063.652000 82.898000 6054.652000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 6063.652000 87.200000 6054.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 6063.652000 90.809000 6054.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 6063.652000 93.671000 6054.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 6063.652000 98.315000 6054.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 6063.652000 101.906000 6054.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 6063.652000 106.514000 6054.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 6063.652000 109.754000 6054.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 6063.652000 112.868000 6054.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 6063.652000 118.691000 6054.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 6063.652000 121.850000 6054.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 6063.652000 125.702000 6054.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 6063.652000 131.588000 6054.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 6063.652000 136.907000 6054.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 6063.652000 140.039000 6054.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 6063.652000 146.078000 6054.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 6063.652000 151.442000 6054.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 6063.652000 154.349000 6054.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 6063.652000 157.148000 6054.652000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 6063.652000 160.433000 6054.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6053.152000 84.095000 6044.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 6053.152000 89.468000 6044.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 6053.152000 94.580000 6044.152000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 6053.152000 97.631000 6044.152000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 6032.752000 104.443000 6023.752000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 6032.752000 109.060000 6023.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 6032.752000 113.398000 6023.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 6032.752000 119.194000 6023.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 6032.752000 124.612000 6023.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 6032.752000 127.465000 6023.752000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 6016.052000 101.176000 6007.052000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 6016.052000 104.074000 6007.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 6016.052000 109.420000 6007.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 6016.052000 114.442000 6007.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 6016.052000 120.202000 6007.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 6016.052000 123.811000 6007.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 6016.052000 129.121000 6007.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 6016.052000 134.899000 6007.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 6016.052000 139.516000 6007.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 6016.052000 143.107000 6007.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 6016.052000 148.417000 6007.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 6016.052000 151.270000 6007.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 6016.052000 157.093000 6007.052000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 5999.352000 103.048000 5990.352000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 5999.352000 108.421000 5990.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 5999.352000 113.443000 5990.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 5999.352000 118.852000 5990.352000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 5999.352000 124.702000 5990.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 5999.352000 130.021000 5990.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 5999.352000 135.079000 5990.352000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 5980.152000 104.407000 5971.152000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 5980.152000 109.816000 5971.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 5980.152000 115.594000 5971.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 5980.152000 121.354000 5971.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 5980.152000 125.692000 5971.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 5980.152000 128.563000 5971.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 5980.152000 133.954000 5971.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 5980.152000 139.786000 5971.152000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 5947.500000 0 72.100000 5947.500000 0 72.100000 6068.000000 0 72.000000 6068.000000 0 72.000000 5947.500000 0
+eoFillPath subpath 1 164.600000 5947.500000 0 164.700000 5947.500000 0 164.700000 6068.000000 0 164.600000 6068.000000 0 164.600000 5947.500000 0
+eoFillPath subpath 1 72.000000 6067.900000 0 164.700000 6067.900000 0 164.700000 6068.000000 0 72.000000 6068.000000 0 72.000000 6067.900000 0
+eoFillPath subpath 1 72.000000 5947.500000 0 164.700000 5947.500000 0 164.700000 5947.600000 0 72.000000 5947.600000 0 72.000000 5947.500000 0
+eoFillPath subpath 1 91.300000 5962.400000 0 93.700000 5962.400000 0 93.700000 6036.700000 0 91.300000 6036.700000 0 91.300000 5962.400000 0
+eoFillPath subpath 1 72.000000 5981.600000 0 169.600000 5981.600000 0 169.600000 5984.000000 0 72.000000 5984.000000 0 72.000000 5981.600000 0
+eoFillPath subpath 1 72.000000 6034.300000 0 169.600000 6034.300000 0 169.600000 6036.700000 0 72.000000 6036.700000 0 72.000000 6034.300000 0
+eoFillPath subpath 1 72.000000 5962.400000 0 169.600000 5962.400000 0 169.600000 5964.800000 0 72.000000 5964.800000 0 72.000000 5962.400000 0
+saveState
+eoClipPath subpath 1 108.000000 -1903.600000 0 150.800000 -1903.600000 0 150.800000 -1859.400000 0 108.000000 -1859.400000 0 108.000000 -1903.600000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 269560.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 -2753.600000 0 499.600000 -2753.600000 0 499.600000 -2748.500000 0 186.800000 -2748.500000 0 186.800000 -2753.600000 0
+eoFillPath subpath 1 494.500000 -2748.600000 0 499.600000 -2748.600000 0 499.600000 -2560.200000 0 494.500000 -2560.200000 0 494.500000 -2748.600000 0
+saveState
+eoClipPath subpath 1 181.800000 -2748.500000 0 494.500000 -2748.500000 0 494.500000 -2555.200000 0 181.800000 -2555.200000 0 181.800000 -2748.500000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 -2555.100000 0 494.500000 -2555.100000 0 494.500000 -2555.100000 0 181.700000 -2555.100000 0
+eoFillPath subpath 1 181.700000 -2555.100000 0 494.500000 -2555.100000 0 494.500000 -2555.900000 0 181.700000 -2555.900000 0 181.700000 -2555.100000 0
+eoFillPath subpath 1 181.700000 -2555.900000 0 494.500000 -2555.900000 0 494.500000 -2556.700000 0 181.700000 -2556.700000 0 181.700000 -2555.900000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 -2556.700000 0 494.500000 -2556.700000 0 494.500000 -2557.400000 0 181.700000 -2557.400000 0 181.700000 -2556.700000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 -2557.400000 0 494.500000 -2557.400000 0 494.500000 -2558.200000 0 181.700000 -2558.200000 0 181.700000 -2557.400000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 -2558.200000 0 494.500000 -2558.200000 0 494.500000 -2558.900000 0 181.700000 -2558.900000 0 181.700000 -2558.200000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 -2558.900000 0 494.500000 -2558.900000 0 494.500000 -2559.700000 0 181.700000 -2559.700000 0 181.700000 -2558.900000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 -2559.700000 0 494.500000 -2559.700000 0 494.500000 -2560.500000 0 181.700000 -2560.500000 0 181.700000 -2559.700000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 -2560.500000 0 494.500000 -2560.500000 0 494.500000 -2561.200000 0 181.700000 -2561.200000 0 181.700000 -2560.500000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 -2561.200000 0 494.500000 -2561.200000 0 494.500000 -2562.000000 0 181.700000 -2562.000000 0 181.700000 -2561.200000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 -2562.000000 0 494.500000 -2562.000000 0 494.500000 -2562.700000 0 181.700000 -2562.700000 0 181.700000 -2562.000000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 -2562.700000 0 494.500000 -2562.700000 0 494.500000 -2563.500000 0 181.700000 -2563.500000 0 181.700000 -2562.700000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 -2563.500000 0 494.500000 -2563.500000 0 494.500000 -2564.200000 0 181.700000 -2564.200000 0 181.700000 -2563.500000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 -2564.200000 0 494.500000 -2564.200000 0 494.500000 -2565.000000 0 181.700000 -2565.000000 0 181.700000 -2564.200000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 -2565.000000 0 494.500000 -2565.000000 0 494.500000 -2565.800000 0 181.700000 -2565.800000 0 181.700000 -2565.000000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 -2565.800000 0 494.500000 -2565.800000 0 494.500000 -2566.500000 0 181.700000 -2566.500000 0 181.700000 -2565.800000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 -2566.500000 0 494.500000 -2566.500000 0 494.500000 -2567.300000 0 181.700000 -2567.300000 0 181.700000 -2566.500000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 -2567.300000 0 494.500000 -2567.300000 0 494.500000 -2568.000000 0 181.700000 -2568.000000 0 181.700000 -2567.300000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 -2568.000000 0 494.500000 -2568.000000 0 494.500000 -2568.800000 0 181.700000 -2568.800000 0 181.700000 -2568.000000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 -2568.800000 0 494.500000 -2568.800000 0 494.500000 -2569.500000 0 181.700000 -2569.500000 0 181.700000 -2568.800000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 -2569.500000 0 494.500000 -2569.500000 0 494.500000 -2570.300000 0 181.700000 -2570.300000 0 181.700000 -2569.500000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 -2570.300000 0 494.500000 -2570.300000 0 494.500000 -2571.100000 0 181.700000 -2571.100000 0 181.700000 -2570.300000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 -2571.100000 0 494.500000 -2571.100000 0 494.500000 -2571.800000 0 181.700000 -2571.800000 0 181.700000 -2571.100000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 -2571.800000 0 494.500000 -2571.800000 0 494.500000 -2572.600000 0 181.700000 -2572.600000 0 181.700000 -2571.800000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 -2572.600000 0 494.500000 -2572.600000 0 494.500000 -2573.300000 0 181.700000 -2573.300000 0 181.700000 -2572.600000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 -2573.300000 0 494.500000 -2573.300000 0 494.500000 -2574.100000 0 181.700000 -2574.100000 0 181.700000 -2573.300000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 -2574.100000 0 494.500000 -2574.100000 0 494.500000 -2574.900000 0 181.700000 -2574.900000 0 181.700000 -2574.100000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 -2574.900000 0 494.500000 -2574.900000 0 494.500000 -2575.600000 0 181.700000 -2575.600000 0 181.700000 -2574.900000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 -2575.600000 0 494.500000 -2575.600000 0 494.500000 -2576.400000 0 181.700000 -2576.400000 0 181.700000 -2575.600000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 -2576.400000 0 494.500000 -2576.400000 0 494.500000 -2577.100000 0 181.700000 -2577.100000 0 181.700000 -2576.400000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 -2577.100000 0 494.500000 -2577.100000 0 494.500000 -2577.900000 0 181.700000 -2577.900000 0 181.700000 -2577.100000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 -2577.900000 0 494.500000 -2577.900000 0 494.500000 -2578.600000 0 181.700000 -2578.600000 0 181.700000 -2577.900000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 -2578.600000 0 494.500000 -2578.600000 0 494.500000 -2579.400000 0 181.700000 -2579.400000 0 181.700000 -2578.600000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 -2579.400000 0 494.500000 -2579.400000 0 494.500000 -2580.200000 0 181.700000 -2580.200000 0 181.700000 -2579.400000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 -2580.200000 0 494.500000 -2580.200000 0 494.500000 -2580.900000 0 181.700000 -2580.900000 0 181.700000 -2580.200000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 -2580.900000 0 494.500000 -2580.900000 0 494.500000 -2581.700000 0 181.700000 -2581.700000 0 181.700000 -2580.900000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 -2581.700000 0 494.500000 -2581.700000 0 494.500000 -2582.400000 0 181.700000 -2582.400000 0 181.700000 -2581.700000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 -2582.400000 0 494.500000 -2582.400000 0 494.500000 -2583.200000 0 181.700000 -2583.200000 0 181.700000 -2582.400000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 -2583.200000 0 494.500000 -2583.200000 0 494.500000 -2584.000000 0 181.700000 -2584.000000 0 181.700000 -2583.200000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 -2584.000000 0 494.500000 -2584.000000 0 494.500000 -2584.700000 0 181.700000 -2584.700000 0 181.700000 -2584.000000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 -2584.700000 0 494.500000 -2584.700000 0 494.500000 -2585.500000 0 181.700000 -2585.500000 0 181.700000 -2584.700000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 -2585.500000 0 494.500000 -2585.500000 0 494.500000 -2586.200000 0 181.700000 -2586.200000 0 181.700000 -2585.500000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 -2586.200000 0 494.500000 -2586.200000 0 494.500000 -2587.000000 0 181.700000 -2587.000000 0 181.700000 -2586.200000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 -2587.000000 0 494.500000 -2587.000000 0 494.500000 -2587.700000 0 181.700000 -2587.700000 0 181.700000 -2587.000000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 -2587.700000 0 494.500000 -2587.700000 0 494.500000 -2588.500000 0 181.700000 -2588.500000 0 181.700000 -2587.700000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 -2588.500000 0 494.500000 -2588.500000 0 494.500000 -2589.300000 0 181.700000 -2589.300000 0 181.700000 -2588.500000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 -2589.300000 0 494.500000 -2589.300000 0 494.500000 -2590.000000 0 181.700000 -2590.000000 0 181.700000 -2589.300000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 -2590.000000 0 494.500000 -2590.000000 0 494.500000 -2590.800000 0 181.700000 -2590.800000 0 181.700000 -2590.000000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 -2590.800000 0 494.500000 -2590.800000 0 494.500000 -2591.500000 0 181.700000 -2591.500000 0 181.700000 -2590.800000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 -2591.500000 0 494.500000 -2591.500000 0 494.500000 -2592.300000 0 181.700000 -2592.300000 0 181.700000 -2591.500000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 -2592.300000 0 494.500000 -2592.300000 0 494.500000 -2593.100000 0 181.700000 -2593.100000 0 181.700000 -2592.300000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 -2593.100000 0 494.500000 -2593.100000 0 494.500000 -2593.800000 0 181.700000 -2593.800000 0 181.700000 -2593.100000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 -2593.800000 0 494.500000 -2593.800000 0 494.500000 -2594.600000 0 181.700000 -2594.600000 0 181.700000 -2593.800000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 -2594.600000 0 494.500000 -2594.600000 0 494.500000 -2595.300000 0 181.700000 -2595.300000 0 181.700000 -2594.600000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 -2595.300000 0 494.500000 -2595.300000 0 494.500000 -2596.100000 0 181.700000 -2596.100000 0 181.700000 -2595.300000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 -2596.100000 0 494.500000 -2596.100000 0 494.500000 -2596.900000 0 181.700000 -2596.900000 0 181.700000 -2596.100000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 -2596.900000 0 494.500000 -2596.900000 0 494.500000 -2597.600000 0 181.700000 -2597.600000 0 181.700000 -2596.900000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 -2597.600000 0 494.500000 -2597.600000 0 494.500000 -2598.400000 0 181.700000 -2598.400000 0 181.700000 -2597.600000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 -2598.400000 0 494.500000 -2598.400000 0 494.500000 -2599.100000 0 181.700000 -2599.100000 0 181.700000 -2598.400000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 -2599.100000 0 494.500000 -2599.100000 0 494.500000 -2599.900000 0 181.700000 -2599.900000 0 181.700000 -2599.100000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 -2599.900000 0 494.500000 -2599.900000 0 494.500000 -2600.600000 0 181.700000 -2600.600000 0 181.700000 -2599.900000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 -2600.600000 0 494.500000 -2600.600000 0 494.500000 -2601.400000 0 181.700000 -2601.400000 0 181.700000 -2600.600000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 -2601.400000 0 494.500000 -2601.400000 0 494.500000 -2602.200000 0 181.700000 -2602.200000 0 181.700000 -2601.400000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 -2602.200000 0 494.500000 -2602.200000 0 494.500000 -2602.900000 0 181.700000 -2602.900000 0 181.700000 -2602.200000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 -2602.900000 0 494.500000 -2602.900000 0 494.500000 -2603.700000 0 181.700000 -2603.700000 0 181.700000 -2602.900000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 -2603.700000 0 494.500000 -2603.700000 0 494.500000 -2604.400000 0 181.700000 -2604.400000 0 181.700000 -2603.700000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 -2604.400000 0 494.500000 -2604.400000 0 494.500000 -2605.200000 0 181.700000 -2605.200000 0 181.700000 -2604.400000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 -2605.200000 0 494.500000 -2605.200000 0 494.500000 -2606.000000 0 181.700000 -2606.000000 0 181.700000 -2605.200000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 -2606.000000 0 494.500000 -2606.000000 0 494.500000 -2606.700000 0 181.700000 -2606.700000 0 181.700000 -2606.000000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 -2606.700000 0 494.500000 -2606.700000 0 494.500000 -2607.500000 0 181.700000 -2607.500000 0 181.700000 -2606.700000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 -2607.500000 0 494.500000 -2607.500000 0 494.500000 -2608.200000 0 181.700000 -2608.200000 0 181.700000 -2607.500000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 -2608.200000 0 494.500000 -2608.200000 0 494.500000 -2609.000000 0 181.700000 -2609.000000 0 181.700000 -2608.200000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 -2609.000000 0 494.500000 -2609.000000 0 494.500000 -2609.800000 0 181.700000 -2609.800000 0 181.700000 -2609.000000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 -2609.800000 0 494.500000 -2609.800000 0 494.500000 -2610.500000 0 181.700000 -2610.500000 0 181.700000 -2609.800000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 -2610.500000 0 494.500000 -2610.500000 0 494.500000 -2611.300000 0 181.700000 -2611.300000 0 181.700000 -2610.500000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 -2611.300000 0 494.500000 -2611.300000 0 494.500000 -2612.000000 0 181.700000 -2612.000000 0 181.700000 -2611.300000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 -2612.000000 0 494.500000 -2612.000000 0 494.500000 -2612.800000 0 181.700000 -2612.800000 0 181.700000 -2612.000000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 -2612.800000 0 494.500000 -2612.800000 0 494.500000 -2613.500000 0 181.700000 -2613.500000 0 181.700000 -2612.800000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 -2613.500000 0 494.500000 -2613.500000 0 494.500000 -2614.300000 0 181.700000 -2614.300000 0 181.700000 -2613.500000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 -2614.300000 0 494.500000 -2614.300000 0 494.500000 -2615.100000 0 181.700000 -2615.100000 0 181.700000 -2614.300000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 -2615.100000 0 494.500000 -2615.100000 0 494.500000 -2615.800000 0 181.700000 -2615.800000 0 181.700000 -2615.100000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 -2615.800000 0 494.500000 -2615.800000 0 494.500000 -2616.600000 0 181.700000 -2616.600000 0 181.700000 -2615.800000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 -2616.600000 0 494.500000 -2616.600000 0 494.500000 -2617.300000 0 181.700000 -2617.300000 0 181.700000 -2616.600000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 -2617.300000 0 494.500000 -2617.300000 0 494.500000 -2618.100000 0 181.700000 -2618.100000 0 181.700000 -2617.300000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 -2618.100000 0 494.500000 -2618.100000 0 494.500000 -2618.900000 0 181.700000 -2618.900000 0 181.700000 -2618.100000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 -2618.900000 0 494.500000 -2618.900000 0 494.500000 -2619.600000 0 181.700000 -2619.600000 0 181.700000 -2618.900000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 -2619.600000 0 494.500000 -2619.600000 0 494.500000 -2620.400000 0 181.700000 -2620.400000 0 181.700000 -2619.600000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 -2620.400000 0 494.500000 -2620.400000 0 494.500000 -2621.100000 0 181.700000 -2621.100000 0 181.700000 -2620.400000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 -2621.100000 0 494.500000 -2621.100000 0 494.500000 -2621.900000 0 181.700000 -2621.900000 0 181.700000 -2621.100000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 -2621.900000 0 494.500000 -2621.900000 0 494.500000 -2622.700000 0 181.700000 -2622.700000 0 181.700000 -2621.900000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 -2622.700000 0 494.500000 -2622.700000 0 494.500000 -2623.400000 0 181.700000 -2623.400000 0 181.700000 -2622.700000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 -2623.400000 0 494.500000 -2623.400000 0 494.500000 -2624.200000 0 181.700000 -2624.200000 0 181.700000 -2623.400000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 -2624.200000 0 494.500000 -2624.200000 0 494.500000 -2624.900000 0 181.700000 -2624.900000 0 181.700000 -2624.200000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 -2624.900000 0 494.500000 -2624.900000 0 494.500000 -2625.700000 0 181.700000 -2625.700000 0 181.700000 -2624.900000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 -2625.700000 0 494.500000 -2625.700000 0 494.500000 -2626.400000 0 181.700000 -2626.400000 0 181.700000 -2625.700000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 -2626.400000 0 494.500000 -2626.400000 0 494.500000 -2627.200000 0 181.700000 -2627.200000 0 181.700000 -2626.400000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 -2627.200000 0 494.500000 -2627.200000 0 494.500000 -2628.000000 0 181.700000 -2628.000000 0 181.700000 -2627.200000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 -2628.000000 0 494.500000 -2628.000000 0 494.500000 -2628.700000 0 181.700000 -2628.700000 0 181.700000 -2628.000000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 -2628.700000 0 494.500000 -2628.700000 0 494.500000 -2629.500000 0 181.700000 -2629.500000 0 181.700000 -2628.700000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 -2629.500000 0 494.500000 -2629.500000 0 494.500000 -2630.200000 0 181.700000 -2630.200000 0 181.700000 -2629.500000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 -2630.200000 0 494.500000 -2630.200000 0 494.500000 -2631.000000 0 181.700000 -2631.000000 0 181.700000 -2630.200000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 -2631.000000 0 494.500000 -2631.000000 0 494.500000 -2631.800000 0 181.700000 -2631.800000 0 181.700000 -2631.000000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 -2631.800000 0 494.500000 -2631.800000 0 494.500000 -2632.500000 0 181.700000 -2632.500000 0 181.700000 -2631.800000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 -2632.500000 0 494.500000 -2632.500000 0 494.500000 -2633.300000 0 181.700000 -2633.300000 0 181.700000 -2632.500000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 -2633.300000 0 494.500000 -2633.300000 0 494.500000 -2634.000000 0 181.700000 -2634.000000 0 181.700000 -2633.300000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 -2634.000000 0 494.500000 -2634.000000 0 494.500000 -2634.800000 0 181.700000 -2634.800000 0 181.700000 -2634.000000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 -2634.800000 0 494.500000 -2634.800000 0 494.500000 -2635.600000 0 181.700000 -2635.600000 0 181.700000 -2634.800000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 -2635.600000 0 494.500000 -2635.600000 0 494.500000 -2636.300000 0 181.700000 -2636.300000 0 181.700000 -2635.600000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 -2636.300000 0 494.500000 -2636.300000 0 494.500000 -2637.100000 0 181.700000 -2637.100000 0 181.700000 -2636.300000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 -2637.100000 0 494.500000 -2637.100000 0 494.500000 -2637.800000 0 181.700000 -2637.800000 0 181.700000 -2637.100000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 -2637.800000 0 494.500000 -2637.800000 0 494.500000 -2638.600000 0 181.700000 -2638.600000 0 181.700000 -2637.800000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 -2638.600000 0 494.500000 -2638.600000 0 494.500000 -2639.300000 0 181.700000 -2639.300000 0 181.700000 -2638.600000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 -2639.300000 0 494.500000 -2639.300000 0 494.500000 -2640.100000 0 181.700000 -2640.100000 0 181.700000 -2639.300000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 -2640.100000 0 494.500000 -2640.100000 0 494.500000 -2640.900000 0 181.700000 -2640.900000 0 181.700000 -2640.100000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 -2640.900000 0 494.500000 -2640.900000 0 494.500000 -2641.600000 0 181.700000 -2641.600000 0 181.700000 -2640.900000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 -2641.600000 0 494.500000 -2641.600000 0 494.500000 -2642.400000 0 181.700000 -2642.400000 0 181.700000 -2641.600000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 -2642.400000 0 494.500000 -2642.400000 0 494.500000 -2643.100000 0 181.700000 -2643.100000 0 181.700000 -2642.400000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 -2643.100000 0 494.500000 -2643.100000 0 494.500000 -2643.900000 0 181.700000 -2643.900000 0 181.700000 -2643.100000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 -2643.900000 0 494.500000 -2643.900000 0 494.500000 -2644.700000 0 181.700000 -2644.700000 0 181.700000 -2643.900000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 -2644.700000 0 494.500000 -2644.700000 0 494.500000 -2645.400000 0 181.700000 -2645.400000 0 181.700000 -2644.700000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 -2645.400000 0 494.500000 -2645.400000 0 494.500000 -2646.200000 0 181.700000 -2646.200000 0 181.700000 -2645.400000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 -2646.200000 0 494.500000 -2646.200000 0 494.500000 -2646.900000 0 181.700000 -2646.900000 0 181.700000 -2646.200000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 -2646.900000 0 494.500000 -2646.900000 0 494.500000 -2647.700000 0 181.700000 -2647.700000 0 181.700000 -2646.900000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 -2647.700000 0 494.500000 -2647.700000 0 494.500000 -2648.500000 0 181.700000 -2648.500000 0 181.700000 -2647.700000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 -2648.500000 0 494.500000 -2648.500000 0 494.500000 -2649.200000 0 181.700000 -2649.200000 0 181.700000 -2648.500000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 -2649.200000 0 494.500000 -2649.200000 0 494.500000 -2650.000000 0 181.700000 -2650.000000 0 181.700000 -2649.200000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 -2650.000000 0 494.500000 -2650.000000 0 494.500000 -2650.700000 0 181.700000 -2650.700000 0 181.700000 -2650.000000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 -2650.700000 0 494.500000 -2650.700000 0 494.500000 -2651.500000 0 181.700000 -2651.500000 0 181.700000 -2650.700000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 -2651.500000 0 494.500000 -2651.500000 0 494.500000 -2652.200000 0 181.700000 -2652.200000 0 181.700000 -2651.500000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 -2652.200000 0 494.500000 -2652.200000 0 494.500000 -2653.000000 0 181.700000 -2653.000000 0 181.700000 -2652.200000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 -2653.000000 0 494.500000 -2653.000000 0 494.500000 -2653.800000 0 181.700000 -2653.800000 0 181.700000 -2653.000000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 -2653.800000 0 494.500000 -2653.800000 0 494.500000 -2654.500000 0 181.700000 -2654.500000 0 181.700000 -2653.800000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 -2654.500000 0 494.500000 -2654.500000 0 494.500000 -2655.300000 0 181.700000 -2655.300000 0 181.700000 -2654.500000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 -2655.300000 0 494.500000 -2655.300000 0 494.500000 -2656.000000 0 181.700000 -2656.000000 0 181.700000 -2655.300000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 -2656.000000 0 494.500000 -2656.000000 0 494.500000 -2656.800000 0 181.700000 -2656.800000 0 181.700000 -2656.000000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 -2656.800000 0 494.500000 -2656.800000 0 494.500000 -2657.600000 0 181.700000 -2657.600000 0 181.700000 -2656.800000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 -2657.600000 0 494.500000 -2657.600000 0 494.500000 -2658.300000 0 181.700000 -2658.300000 0 181.700000 -2657.600000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 -2658.300000 0 494.500000 -2658.300000 0 494.500000 -2659.100000 0 181.700000 -2659.100000 0 181.700000 -2658.300000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 -2659.100000 0 494.500000 -2659.100000 0 494.500000 -2659.800000 0 181.700000 -2659.800000 0 181.700000 -2659.100000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 -2659.800000 0 494.500000 -2659.800000 0 494.500000 -2660.600000 0 181.700000 -2660.600000 0 181.700000 -2659.800000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 -2660.600000 0 494.500000 -2660.600000 0 494.500000 -2661.400000 0 181.700000 -2661.400000 0 181.700000 -2660.600000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 -2661.400000 0 494.500000 -2661.400000 0 494.500000 -2662.100000 0 181.700000 -2662.100000 0 181.700000 -2661.400000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 -2662.100000 0 494.500000 -2662.100000 0 494.500000 -2662.900000 0 181.700000 -2662.900000 0 181.700000 -2662.100000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 -2662.900000 0 494.500000 -2662.900000 0 494.500000 -2663.600000 0 181.700000 -2663.600000 0 181.700000 -2662.900000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 -2663.600000 0 494.500000 -2663.600000 0 494.500000 -2664.400000 0 181.700000 -2664.400000 0 181.700000 -2663.600000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 -2664.400000 0 494.500000 -2664.400000 0 494.500000 -2665.100000 0 181.700000 -2665.100000 0 181.700000 -2664.400000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 -2665.100000 0 494.500000 -2665.100000 0 494.500000 -2665.900000 0 181.700000 -2665.900000 0 181.700000 -2665.100000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 -2665.900000 0 494.500000 -2665.900000 0 494.500000 -2666.700000 0 181.700000 -2666.700000 0 181.700000 -2665.900000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 -2666.700000 0 494.500000 -2666.700000 0 494.500000 -2667.400000 0 181.700000 -2667.400000 0 181.700000 -2666.700000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 -2667.400000 0 494.500000 -2667.400000 0 494.500000 -2668.200000 0 181.700000 -2668.200000 0 181.700000 -2667.400000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 -2668.200000 0 494.500000 -2668.200000 0 494.500000 -2668.900000 0 181.700000 -2668.900000 0 181.700000 -2668.200000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 -2668.900000 0 494.500000 -2668.900000 0 494.500000 -2669.700000 0 181.700000 -2669.700000 0 181.700000 -2668.900000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 -2669.700000 0 494.500000 -2669.700000 0 494.500000 -2670.500000 0 181.700000 -2670.500000 0 181.700000 -2669.700000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 -2670.500000 0 494.500000 -2670.500000 0 494.500000 -2671.200000 0 181.700000 -2671.200000 0 181.700000 -2670.500000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 -2671.200000 0 494.500000 -2671.200000 0 494.500000 -2672.000000 0 181.700000 -2672.000000 0 181.700000 -2671.200000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 -2672.000000 0 494.500000 -2672.000000 0 494.500000 -2672.700000 0 181.700000 -2672.700000 0 181.700000 -2672.000000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 -2672.700000 0 494.500000 -2672.700000 0 494.500000 -2673.500000 0 181.700000 -2673.500000 0 181.700000 -2672.700000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 -2673.500000 0 494.500000 -2673.500000 0 494.500000 -2674.300000 0 181.700000 -2674.300000 0 181.700000 -2673.500000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 -2674.300000 0 494.500000 -2674.300000 0 494.500000 -2675.000000 0 181.700000 -2675.000000 0 181.700000 -2674.300000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 -2675.000000 0 494.500000 -2675.000000 0 494.500000 -2675.800000 0 181.700000 -2675.800000 0 181.700000 -2675.000000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 -2675.800000 0 494.500000 -2675.800000 0 494.500000 -2676.500000 0 181.700000 -2676.500000 0 181.700000 -2675.800000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 -2676.500000 0 494.500000 -2676.500000 0 494.500000 -2677.300000 0 181.700000 -2677.300000 0 181.700000 -2676.500000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 -2677.300000 0 494.500000 -2677.300000 0 494.500000 -2678.000000 0 181.700000 -2678.000000 0 181.700000 -2677.300000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 -2678.000000 0 494.500000 -2678.000000 0 494.500000 -2678.800000 0 181.700000 -2678.800000 0 181.700000 -2678.000000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 -2678.800000 0 494.500000 -2678.800000 0 494.500000 -2679.600000 0 181.700000 -2679.600000 0 181.700000 -2678.800000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 -2679.600000 0 494.500000 -2679.600000 0 494.500000 -2680.300000 0 181.700000 -2680.300000 0 181.700000 -2679.600000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 -2680.300000 0 494.500000 -2680.300000 0 494.500000 -2681.100000 0 181.700000 -2681.100000 0 181.700000 -2680.300000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 -2681.100000 0 494.500000 -2681.100000 0 494.500000 -2681.800000 0 181.700000 -2681.800000 0 181.700000 -2681.100000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 -2681.800000 0 494.500000 -2681.800000 0 494.500000 -2682.600000 0 181.700000 -2682.600000 0 181.700000 -2681.800000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 -2682.600000 0 494.500000 -2682.600000 0 494.500000 -2683.400000 0 181.700000 -2683.400000 0 181.700000 -2682.600000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 -2683.400000 0 494.500000 -2683.400000 0 494.500000 -2684.100000 0 181.700000 -2684.100000 0 181.700000 -2683.400000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 -2684.100000 0 494.500000 -2684.100000 0 494.500000 -2684.900000 0 181.700000 -2684.900000 0 181.700000 -2684.100000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 -2684.900000 0 494.500000 -2684.900000 0 494.500000 -2685.600000 0 181.700000 -2685.600000 0 181.700000 -2684.900000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 -2685.600000 0 494.500000 -2685.600000 0 494.500000 -2686.400000 0 181.700000 -2686.400000 0 181.700000 -2685.600000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 -2686.400000 0 494.500000 -2686.400000 0 494.500000 -2687.200000 0 181.700000 -2687.200000 0 181.700000 -2686.400000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 -2687.200000 0 494.500000 -2687.200000 0 494.500000 -2687.900000 0 181.700000 -2687.900000 0 181.700000 -2687.200000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 -2687.900000 0 494.500000 -2687.900000 0 494.500000 -2688.700000 0 181.700000 -2688.700000 0 181.700000 -2687.900000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 -2688.700000 0 494.500000 -2688.700000 0 494.500000 -2689.400000 0 181.700000 -2689.400000 0 181.700000 -2688.700000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 -2689.400000 0 494.500000 -2689.400000 0 494.500000 -2690.200000 0 181.700000 -2690.200000 0 181.700000 -2689.400000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 -2690.200000 0 494.500000 -2690.200000 0 494.500000 -2690.900000 0 181.700000 -2690.900000 0 181.700000 -2690.200000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 -2690.900000 0 494.500000 -2690.900000 0 494.500000 -2691.700000 0 181.700000 -2691.700000 0 181.700000 -2690.900000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 -2691.700000 0 494.500000 -2691.700000 0 494.500000 -2692.500000 0 181.700000 -2692.500000 0 181.700000 -2691.700000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 -2692.500000 0 494.500000 -2692.500000 0 494.500000 -2693.200000 0 181.700000 -2693.200000 0 181.700000 -2692.500000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 -2693.200000 0 494.500000 -2693.200000 0 494.500000 -2694.000000 0 181.700000 -2694.000000 0 181.700000 -2693.200000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 -2694.000000 0 494.500000 -2694.000000 0 494.500000 -2694.700000 0 181.700000 -2694.700000 0 181.700000 -2694.000000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 -2694.700000 0 494.500000 -2694.700000 0 494.500000 -2695.500000 0 181.700000 -2695.500000 0 181.700000 -2694.700000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 -2695.500000 0 494.500000 -2695.500000 0 494.500000 -2696.300000 0 181.700000 -2696.300000 0 181.700000 -2695.500000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 -2696.300000 0 494.500000 -2696.300000 0 494.500000 -2697.000000 0 181.700000 -2697.000000 0 181.700000 -2696.300000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 -2697.000000 0 494.500000 -2697.000000 0 494.500000 -2697.800000 0 181.700000 -2697.800000 0 181.700000 -2697.000000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 -2697.800000 0 494.500000 -2697.800000 0 494.500000 -2698.500000 0 181.700000 -2698.500000 0 181.700000 -2697.800000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 -2698.500000 0 494.500000 -2698.500000 0 494.500000 -2699.300000 0 181.700000 -2699.300000 0 181.700000 -2698.500000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 -2699.300000 0 494.500000 -2699.300000 0 494.500000 -2700.100000 0 181.700000 -2700.100000 0 181.700000 -2699.300000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 -2700.100000 0 494.500000 -2700.100000 0 494.500000 -2700.800000 0 181.700000 -2700.800000 0 181.700000 -2700.100000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 -2700.800000 0 494.500000 -2700.800000 0 494.500000 -2701.600000 0 181.700000 -2701.600000 0 181.700000 -2700.800000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 -2701.600000 0 494.500000 -2701.600000 0 494.500000 -2702.300000 0 181.700000 -2702.300000 0 181.700000 -2701.600000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 -2702.300000 0 494.500000 -2702.300000 0 494.500000 -2703.100000 0 181.700000 -2703.100000 0 181.700000 -2702.300000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 -2703.100000 0 494.500000 -2703.100000 0 494.500000 -2703.800000 0 181.700000 -2703.800000 0 181.700000 -2703.100000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 -2703.800000 0 494.500000 -2703.800000 0 494.500000 -2704.600000 0 181.700000 -2704.600000 0 181.700000 -2703.800000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 -2704.600000 0 494.500000 -2704.600000 0 494.500000 -2705.400000 0 181.700000 -2705.400000 0 181.700000 -2704.600000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 -2705.400000 0 494.500000 -2705.400000 0 494.500000 -2706.100000 0 181.700000 -2706.100000 0 181.700000 -2705.400000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 -2706.100000 0 494.500000 -2706.100000 0 494.500000 -2706.900000 0 181.700000 -2706.900000 0 181.700000 -2706.100000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 -2706.900000 0 494.500000 -2706.900000 0 494.500000 -2707.600000 0 181.700000 -2707.600000 0 181.700000 -2706.900000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 -2707.600000 0 494.500000 -2707.600000 0 494.500000 -2708.400000 0 181.700000 -2708.400000 0 181.700000 -2707.600000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 -2708.400000 0 494.500000 -2708.400000 0 494.500000 -2709.200000 0 181.700000 -2709.200000 0 181.700000 -2708.400000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 -2709.200000 0 494.500000 -2709.200000 0 494.500000 -2709.900000 0 181.700000 -2709.900000 0 181.700000 -2709.200000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 -2709.900000 0 494.500000 -2709.900000 0 494.500000 -2710.700000 0 181.700000 -2710.700000 0 181.700000 -2709.900000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 -2710.700000 0 494.500000 -2710.700000 0 494.500000 -2711.400000 0 181.700000 -2711.400000 0 181.700000 -2710.700000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 -2711.400000 0 494.500000 -2711.400000 0 494.500000 -2712.200000 0 181.700000 -2712.200000 0 181.700000 -2711.400000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 -2712.200000 0 494.500000 -2712.200000 0 494.500000 -2713.000000 0 181.700000 -2713.000000 0 181.700000 -2712.200000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 -2713.000000 0 494.500000 -2713.000000 0 494.500000 -2713.700000 0 181.700000 -2713.700000 0 181.700000 -2713.000000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 -2713.700000 0 494.500000 -2713.700000 0 494.500000 -2714.500000 0 181.700000 -2714.500000 0 181.700000 -2713.700000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 -2714.500000 0 494.500000 -2714.500000 0 494.500000 -2715.200000 0 181.700000 -2715.200000 0 181.700000 -2714.500000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 -2715.200000 0 494.500000 -2715.200000 0 494.500000 -2716.000000 0 181.700000 -2716.000000 0 181.700000 -2715.200000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 -2716.000000 0 494.500000 -2716.000000 0 494.500000 -2716.700000 0 181.700000 -2716.700000 0 181.700000 -2716.000000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 -2716.700000 0 494.500000 -2716.700000 0 494.500000 -2717.500000 0 181.700000 -2717.500000 0 181.700000 -2716.700000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 -2717.500000 0 494.500000 -2717.500000 0 494.500000 -2718.300000 0 181.700000 -2718.300000 0 181.700000 -2717.500000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 -2718.300000 0 494.500000 -2718.300000 0 494.500000 -2719.000000 0 181.700000 -2719.000000 0 181.700000 -2718.300000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 -2719.000000 0 494.500000 -2719.000000 0 494.500000 -2719.800000 0 181.700000 -2719.800000 0 181.700000 -2719.000000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 -2719.800000 0 494.500000 -2719.800000 0 494.500000 -2720.500000 0 181.700000 -2720.500000 0 181.700000 -2719.800000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 -2720.500000 0 494.500000 -2720.500000 0 494.500000 -2721.300000 0 181.700000 -2721.300000 0 181.700000 -2720.500000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 -2721.300000 0 494.500000 -2721.300000 0 494.500000 -2722.100000 0 181.700000 -2722.100000 0 181.700000 -2721.300000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 -2722.100000 0 494.500000 -2722.100000 0 494.500000 -2722.800000 0 181.700000 -2722.800000 0 181.700000 -2722.100000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 -2722.800000 0 494.500000 -2722.800000 0 494.500000 -2723.600000 0 181.700000 -2723.600000 0 181.700000 -2722.800000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 -2723.600000 0 494.500000 -2723.600000 0 494.500000 -2724.300000 0 181.700000 -2724.300000 0 181.700000 -2723.600000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 -2724.300000 0 494.500000 -2724.300000 0 494.500000 -2725.100000 0 181.700000 -2725.100000 0 181.700000 -2724.300000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 -2725.100000 0 494.500000 -2725.100000 0 494.500000 -2725.900000 0 181.700000 -2725.900000 0 181.700000 -2725.100000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 -2725.900000 0 494.500000 -2725.900000 0 494.500000 -2726.600000 0 181.700000 -2726.600000 0 181.700000 -2725.900000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 -2726.600000 0 494.500000 -2726.600000 0 494.500000 -2727.400000 0 181.700000 -2727.400000 0 181.700000 -2726.600000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 -2727.400000 0 494.500000 -2727.400000 0 494.500000 -2728.100000 0 181.700000 -2728.100000 0 181.700000 -2727.400000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 -2728.100000 0 494.500000 -2728.100000 0 494.500000 -2728.900000 0 181.700000 -2728.900000 0 181.700000 -2728.100000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 -2728.900000 0 494.500000 -2728.900000 0 494.500000 -2729.600000 0 181.700000 -2729.600000 0 181.700000 -2728.900000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 -2729.600000 0 494.500000 -2729.600000 0 494.500000 -2730.400000 0 181.700000 -2730.400000 0 181.700000 -2729.600000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 -2730.400000 0 494.500000 -2730.400000 0 494.500000 -2731.200000 0 181.700000 -2731.200000 0 181.700000 -2730.400000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 -2731.200000 0 494.500000 -2731.200000 0 494.500000 -2731.900000 0 181.700000 -2731.900000 0 181.700000 -2731.200000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 -2731.900000 0 494.500000 -2731.900000 0 494.500000 -2732.700000 0 181.700000 -2732.700000 0 181.700000 -2731.900000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 -2732.700000 0 494.500000 -2732.700000 0 494.500000 -2733.400000 0 181.700000 -2733.400000 0 181.700000 -2732.700000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 -2733.400000 0 494.500000 -2733.400000 0 494.500000 -2734.200000 0 181.700000 -2734.200000 0 181.700000 -2733.400000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 -2734.200000 0 494.500000 -2734.200000 0 494.500000 -2735.000000 0 181.700000 -2735.000000 0 181.700000 -2734.200000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 -2735.000000 0 494.500000 -2735.000000 0 494.500000 -2735.700000 0 181.700000 -2735.700000 0 181.700000 -2735.000000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 -2735.700000 0 494.500000 -2735.700000 0 494.500000 -2736.500000 0 181.700000 -2736.500000 0 181.700000 -2735.700000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 -2736.500000 0 494.500000 -2736.500000 0 494.500000 -2737.200000 0 181.700000 -2737.200000 0 181.700000 -2736.500000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 -2737.200000 0 494.500000 -2737.200000 0 494.500000 -2738.000000 0 181.700000 -2738.000000 0 181.700000 -2737.200000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 -2738.000000 0 494.500000 -2738.000000 0 494.500000 -2738.700000 0 181.700000 -2738.700000 0 181.700000 -2738.000000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 -2738.700000 0 494.500000 -2738.700000 0 494.500000 -2739.500000 0 181.700000 -2739.500000 0 181.700000 -2738.700000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 -2739.500000 0 494.500000 -2739.500000 0 494.500000 -2740.300000 0 181.700000 -2740.300000 0 181.700000 -2739.500000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 -2740.300000 0 494.500000 -2740.300000 0 494.500000 -2741.000000 0 181.700000 -2741.000000 0 181.700000 -2740.300000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 -2741.000000 0 494.500000 -2741.000000 0 494.500000 -2741.800000 0 181.700000 -2741.800000 0 181.700000 -2741.000000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 -2741.800000 0 494.500000 -2741.800000 0 494.500000 -2742.500000 0 181.700000 -2742.500000 0 181.700000 -2741.800000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 -2742.500000 0 494.500000 -2742.500000 0 494.500000 -2743.300000 0 181.700000 -2743.300000 0 181.700000 -2742.500000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 -2743.300000 0 494.500000 -2743.300000 0 494.500000 -2744.100000 0 181.700000 -2744.100000 0 181.700000 -2743.300000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 -2744.100000 0 494.500000 -2744.100000 0 494.500000 -2744.800000 0 181.700000 -2744.800000 0 181.700000 -2744.100000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 -2744.800000 0 494.500000 -2744.800000 0 494.500000 -2745.600000 0 181.700000 -2745.600000 0 181.700000 -2744.800000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 -2745.600000 0 494.500000 -2745.600000 0 494.500000 -2746.300000 0 181.700000 -2746.300000 0 181.700000 -2745.600000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 -2746.300000 0 494.500000 -2746.300000 0 494.500000 -2747.100000 0 181.700000 -2747.100000 0 181.700000 -2746.300000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 -2747.100000 0 494.500000 -2747.100000 0 494.500000 -2747.800000 0 181.700000 -2747.800000 0 181.700000 -2747.100000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 -2747.800000 0 494.500000 -2747.800000 0 494.500000 -2748.600000 0 181.700000 -2748.600000 0 181.700000 -2747.800000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 -2748.500000 0 181.800000 -2748.500000 0 181.800000 -2555.200000 0 494.400000 -2555.200000 0 494.400000 -2748.500000 0 338.100000 -2748.500000 0
+strokePath subpath 1 338.100000 -2748.500000 0 181.800000 -2748.500000 0 181.800000 -2555.200000 0 494.400000 -2555.200000 0 494.400000 -2748.500000 0 338.100000 -2748.500000 0
+saveState
+updateCtm 11410.000000 0.000000 0.000000 -8760.000000 20530.000000 346450.000000
+drawSoftMaskedImage 1142 877 1142 877 JPEG 70955 PPM 3004618
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 -2709.576000 215.488000 -2717.576000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 -2709.576000 220.592000 -2717.576000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 -2709.576000 225.696000 -2717.576000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 -2709.576000 230.800000 -2717.576000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 -2717.076000 241.388000 -2725.076000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 -2717.076000 246.492000 -2725.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 -2717.076000 251.596000 -2725.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 -2717.076000 256.700000 -2725.076000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 -2724.776000 267.188000 -2732.776000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 -2724.776000 272.292000 -2732.776000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 -2724.776000 277.396000 -2732.776000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 -2724.776000 282.500000 -2732.776000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 -2732.376000 293.088000 -2740.376000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 -2732.376000 298.192000 -2740.376000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 -2732.376000 303.296000 -2740.376000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 -2732.376000 308.400000 -2740.376000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 -2694.576000 202.588000 -2702.576000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 -2675.176000 201.688000 -2683.176000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 -2655.876000 195.788000 -2663.876000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 -2655.876000 200.892000 -2663.876000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 -2636.576000 194.888000 -2644.576000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 -2636.576000 199.992000 -2644.576000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 -2617.276000 193.988000 -2625.276000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 -2617.276000 199.092000 -2625.276000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 -2597.876000 193.088000 -2605.876000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 -2597.876000 198.192000 -2605.876000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 -2725.776000 330.188000 -2733.776000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 -2725.776000 332.716000 -2733.776000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 -2725.776000 337.596000 -2733.776000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 -2725.776000 341.396000 -2733.776000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 -2725.776000 346.036000 -2733.776000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 -2725.776000 350.900000 -2733.776000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 -2725.776000 355.972000 -2733.776000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 -2725.776000 359.196000 -2733.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 -2725.776000 362.196000 -2733.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 -2725.776000 367.404000 -2733.776000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 -2725.776000 371.876000 -2733.776000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 -2725.776000 375.052000 -2733.776000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 -2706.276000 361.172000 -2714.276000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 -2706.276000 364.340000 -2714.276000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 -2706.276000 367.396000 -2714.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 -2706.276000 372.604000 -2714.276000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 -2706.276000 379.348000 -2714.276000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 -2706.276000 384.484000 -2714.276000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 -2706.276000 389.436000 -2714.276000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 -2706.276000 392.108000 -2714.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 -2706.276000 395.708000 -2714.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 -2706.276000 397.540000 -2714.276000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 -2706.276000 402.444000 -2714.276000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 -2706.276000 406.788000 -2714.276000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 -2686.776000 392.972000 -2694.776000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 -2686.776000 398.076000 -2694.776000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 -2686.776000 403.180000 -2694.776000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 -2686.776000 405.428000 -2694.776000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 -2686.776000 410.332000 -2694.776000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 -2686.776000 414.476000 -2694.776000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 -2559.208000 305.808000 -2573.208000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 -2559.208000 314.138000 -2573.208000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 -2559.208000 320.788000 -2573.208000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 -2559.208000 328.698000 -2573.208000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 -2559.208000 336.972000 -2573.208000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 -2559.208000 344.182000 -2573.208000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 -2559.208000 349.810000 -2573.208000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 -2559.208000 354.234000 -2573.208000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 -2559.208000 362.718000 -2573.208000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 -2559.208000 367.870000 -2573.208000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 -2559.208000 372.322000 -2573.208000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 -2559.208000 382.080000 -2573.208000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 -2559.208000 388.772000 -2573.208000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 -2559.208000 397.802000 -2573.208000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 -2559.208000 402.254000 -2573.208000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 -2559.208000 407.896000 -2573.208000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 -2682.100000 0 424.300000 -2682.100000 0 424.300000 -2621.300000 0 493.600000 -2621.300000 0 493.600000 -2682.100000 0 458.900000 -2682.100000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 -2630.900000 0 428.900000 -2630.900000 0 428.900000 -2625.000000 0 434.800000 -2625.000000 0 434.800000 -2630.900000 0 431.900000 -2630.900000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 -2642.000000 0 428.900000 -2642.000000 0 428.900000 -2636.100000 0 434.800000 -2636.100000 0 434.800000 -2642.000000 0 431.900000 -2642.000000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 -2653.100000 0 428.900000 -2653.100000 0 428.900000 -2647.100000 0 434.800000 -2647.100000 0 434.800000 -2653.100000 0 431.900000 -2653.100000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 -2664.200000 0 428.900000 -2664.200000 0 428.900000 -2658.200000 0 434.800000 -2658.200000 0 434.800000 -2664.200000 0 431.900000 -2664.200000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 -2675.300000 0 428.900000 -2675.300000 0 428.900000 -2669.300000 0 434.800000 -2669.300000 0 434.800000 -2675.300000 0 431.900000 -2675.300000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -2623.876000 443.288000 -2631.876000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 -2623.876000 445.816000 -2631.876000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 -2623.876000 450.600000 -2631.876000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 -2623.876000 454.496000 -2631.876000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 -2623.876000 459.136000 -2631.876000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 -2623.876000 464.000000 -2631.876000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 -2623.876000 468.976000 -2631.876000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 -2623.876000 472.304000 -2631.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 -2623.876000 475.208000 -2631.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 -2623.876000 480.520000 -2631.876000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 -2623.876000 484.992000 -2631.876000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 -2623.876000 488.168000 -2631.876000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -2634.876000 443.352000 -2642.876000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 -2634.876000 447.920000 -2642.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 -2634.876000 452.976000 -2642.876000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 -2634.876000 457.400000 -2642.876000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 -2634.876000 462.472000 -2642.876000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 -2634.876000 465.800000 -2642.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 -2634.876000 468.904000 -2642.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 -2634.876000 473.816000 -2642.876000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 -2634.876000 478.888000 -2642.876000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 -2634.876000 482.064000 -2642.876000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -2645.976000 442.872000 -2653.976000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 -2645.976000 446.040000 -2653.976000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 -2645.976000 448.992000 -2653.976000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 -2645.976000 454.304000 -2653.976000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 -2645.976000 461.048000 -2653.976000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 -2645.976000 466.184000 -2653.976000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 -2645.976000 471.136000 -2653.976000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 -2645.976000 473.808000 -2653.976000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 -2645.976000 477.408000 -2653.976000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 -2645.976000 479.240000 -2653.976000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 -2645.976000 484.144000 -2653.976000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 -2645.976000 488.488000 -2653.976000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -2657.076000 443.384000 -2665.076000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 -2657.076000 448.464000 -2665.076000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 -2657.076000 453.424000 -2665.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 -2657.076000 456.696000 -2665.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 -2657.076000 459.800000 -2665.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 -2657.076000 462.032000 -2665.076000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 -2657.076000 466.936000 -2665.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 -2657.076000 471.080000 -2665.076000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -2668.176000 443.272000 -2676.176000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 -2668.176000 448.376000 -2676.176000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 -2668.176000 453.480000 -2676.176000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 -2668.176000 455.728000 -2676.176000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 -2668.176000 460.632000 -2676.176000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 -2668.176000 464.776000 -2676.176000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -5313.200000 0 114.800000 -5313.200000 0 114.800000 -5270.400000 0 72.000000 -5270.400000 0 72.000000 -5313.200000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 610510.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 668.600000 0 504.000000 668.600000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 668.600000 0
+eoFillPath subpath 1 72.000000 546.200000 0 504.000000 546.200000 0 504.000000 563.600000 0 72.000000 563.600000 0 72.000000 546.200000 0
+eoFillPath subpath 1 72.000000 72.000000 0 504.000000 72.000000 0 504.000000 245.800000 0 72.000000 245.800000 0 72.000000 72.000000 0
+eoFillPath subpath 1 72.000000 245.800000 0 121.400000 245.800000 0 121.400000 546.200000 0 72.000000 546.200000 0 72.000000 245.800000 0
+eoFillPath subpath 1 454.500000 245.800000 0 504.000000 245.800000 0 504.000000 546.200000 0 454.500000 546.200000 0 454.500000 245.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 563.600000 0 76.300000 563.600000 0 76.300000 668.600000 0 72.000000 668.600000 0 72.000000 563.600000 0
+eoFillPath subpath 1 156.200000 563.600000 0 504.000000 563.600000 0 504.000000 668.600000 0 156.200000 668.600000 0 156.200000 563.600000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 72.000000 701.300000 0 504.000000 701.300000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 701.300000 0
+eoFillPath subpath 1 72.000000 72.200000 0 504.000000 72.200000 0 504.000000 86.100000 0 72.000000 86.100000 0 72.000000 72.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 306.000000 719.948000 319.792000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 319.808000 719.948000 329.264000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 329.312000 719.948000 334.384000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 334.416000 719.948000 346.432000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 346.416000 719.948000 356.192000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 356.224000 719.948000 366.352000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 366.320000 719.948000 374.640000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 374.624000 719.948000 384.464000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 384.432000 719.948000 389.504000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 389.536000 719.948000 395.296000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 395.344000 719.948000 400.416000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 400.400000 719.948000 410.544000 703.948000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 410.608000 719.948000 420.448000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 420.416000 719.948000 429.200000 703.948000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 429.216000 719.948000 438.992000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 439.024000 719.948000 449.152000 703.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 449.120000 719.948000 459.264000 703.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 459.328000 719.948000 464.400000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 464.432000 719.948000 473.632000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 473.632000 719.948000 478.064000 703.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 478.032000 719.948000 487.808000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 487.840000 719.948000 497.616000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 497.648000 719.948000 504.224000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 672.936000 190.240000 660.936000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 190.996000 672.936000 194.800000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 195.700000 672.936000 200.512000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 200.500000 672.936000 208.228000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 208.300000 672.936000 215.524000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 215.404000 672.936000 223.132000 660.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 223.108000 672.936000 230.788000 660.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 230.812000 672.936000 238.540000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 238.516000 672.936000 243.328000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 244.216000 672.936000 248.020000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 248.920000 672.936000 256.072000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 256.120000 672.936000 263.800000 660.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 263.716000 672.936000 270.940000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 271.012000 672.936000 278.740000 660.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 278.716000 672.936000 283.528000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 284.320000 672.936000 288.124000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.916000 672.936000 296.644000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 296.620000 672.936000 303.772000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 303.820000 672.936000 310.588000 660.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 310.624000 672.936000 314.452000 660.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 314.428000 672.936000 322.156000 660.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 322.132000 672.936000 329.812000 660.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 330.628000 672.936000 334.432000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 335.428000 672.936000 340.240000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 340.228000 672.936000 347.956000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 348.028000 672.936000 355.120000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 355.828000 672.936000 359.632000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 360.424000 672.936000 366.580000 660.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 366.628000 672.936000 374.356000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 374.332000 672.936000 381.424000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 381.436000 672.936000 385.264000 660.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 385.240000 672.936000 389.680000 660.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 390.544000 672.936000 394.348000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 395.248000 672.936000 402.400000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 402.448000 672.936000 407.260000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 408.052000 672.936000 411.856000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 412.648000 672.936000 417.460000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 417.448000 672.936000 425.176000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 425.248000 672.936000 432.340000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 433.048000 672.936000 436.852000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 437.848000 672.936000 442.288000 660.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 442.252000 672.936000 449.476000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 449.548000 672.936000 456.772000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 456.748000 672.936000 461.560000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 462.352000 672.936000 466.156000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 466.948000 672.936000 474.172000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 474.148000 672.936000 478.588000 660.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 479.452000 672.936000 483.256000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.156000 672.936000 488.968000 660.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 488.956000 672.936000 496.684000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.756000 672.936000 503.848000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 672.936000 508.004000 660.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 659.036000 196.876000 647.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 196.900000 659.036000 200.728000 647.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 200.704000 659.036000 206.440000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 206.500000 659.036000 212.236000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 212.200000 659.036000 219.424000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 219.400000 659.036000 225.136000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 226.000000 659.036000 229.804000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 230.596000 659.036000 236.752000 647.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 236.800000 659.036000 244.528000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 244.504000 659.036000 251.656000 647.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 251.608000 659.036000 259.288000 647.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 259.312000 659.036000 266.404000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 266.416000 659.036000 274.096000 647.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 274.912000 659.036000 278.716000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.508000 659.036000 283.336000 647.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 283.312000 659.036000 287.140000 647.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 287.212000 659.036000 294.472000 647.036000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 294.412000 659.036000 301.504000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 303.112000 659.036000 306.916000 647.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 307.000000 659.036000 315.808000 647.036000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 315.796000 659.036000 321.532000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 321.592000 659.036000 328.816000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 328.792000 659.036000 336.016000 647.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 335.992000 659.036000 343.252000 647.036000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 343.288000 659.036000 347.116000 647.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 347.092000 659.036000 353.860000 647.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 353.896000 659.036000 361.624000 647.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 362.392000 659.036000 366.196000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 366.988000 659.036000 375.796000 647.036000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 375.892000 659.036000 381.628000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 381.592000 659.036000 385.420000 647.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 385.492000 659.036000 393.172000 647.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 393.196000 659.036000 400.876000 647.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 400.792000 659.036000 407.884000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 407.900000 659.036000 411.704000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 413.300000 659.036000 420.980000 647.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 421.004000 659.036000 428.732000 647.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 428.708000 659.036000 433.520000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 434.312000 659.036000 438.116000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 439.016000 659.036000 449.276000 647.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 449.312000 659.036000 453.140000 647.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 453.116000 659.036000 457.928000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 457.916000 659.036000 465.644000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 466.412000 659.036000 470.216000 647.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 471.008000 659.036000 481.268000 647.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 481.304000 659.036000 485.132000 647.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 485.108000 659.036000 490.844000 647.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 490.808000 659.036000 497.900000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 497.912000 659.036000 504.068000 647.036000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 659.036000 507.904000 647.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 645.136000 189.328000 633.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 189.304000 645.136000 194.116000 633.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 194.200000 645.136000 197.488000 633.136000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 197.500000 645.136000 203.656000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 203.596000 645.136000 207.400000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 207.496000 645.136000 215.176000 633.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 215.200000 645.136000 219.028000 633.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 219.004000 645.136000 231.328000 633.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 231.400000 645.136000 238.120000 633.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 238.096000 645.136000 245.824000 633.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 245.800000 645.136000 249.628000 633.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 249.700000 645.136000 254.512000 633.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 254.500000 645.136000 258.304000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 258.400000 645.136000 263.212000 633.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 263.200000 645.136000 270.424000 633.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 270.400000 645.136000 274.204000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 274.396000 645.136000 281.548000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 281.500000 645.136000 288.220000 633.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 288.196000 645.136000 294.916000 633.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 295.000000 645.136000 302.092000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 302.104000 645.136000 308.260000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 308.200000 645.136000 314.356000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 314.404000 645.136000 318.208000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 318.304000 645.136000 322.132000 633.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 322.108000 645.136000 326.920000 633.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 326.908000 645.136000 334.000000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 334.012000 645.136000 345.388000 633.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 345.412000 645.136000 351.568000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 351.616000 645.136000 355.420000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 355.516000 645.136000 362.740000 633.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.716000 645.136000 370.444000 633.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 370.420000 645.136000 374.224000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 374.416000 645.136000 379.228000 633.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 379.216000 645.136000 386.944000 633.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 386.920000 645.136000 394.012000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 394.024000 645.136000 397.828000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 397.924000 645.136000 404.080000 633.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 404.128000 645.136000 411.856000 633.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 411.832000 645.136000 418.924000 633.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 418.936000 645.136000 422.764000 633.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 422.740000 645.136000 427.180000 633.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 427.240000 645.136000 431.044000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 431.140000 645.136000 438.292000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 438.244000 645.136000 445.972000 633.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 446.044000 645.136000 453.724000 633.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.748000 645.136000 457.552000 633.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 457.648000 645.136000 467.908000 633.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 467.848000 645.136000 471.676000 633.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 471.748000 645.136000 476.560000 633.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 476.548000 645.136000 484.276000 633.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 484.348000 645.136000 491.572000 633.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 491.548000 645.136000 499.276000 633.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 499.348000 645.136000 504.160000 633.136000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 645.136000 507.904000 633.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 631.236000 195.760000 619.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 195.796000 631.236000 199.624000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 199.600000 631.236000 205.336000 619.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 205.300000 631.236000 212.392000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 212.404000 631.236000 218.560000 619.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 218.704000 631.236000 222.508000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 222.700000 631.236000 227.512000 619.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 227.500000 631.236000 235.228000 619.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 235.300000 631.236000 242.392000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 242.500000 631.236000 246.304000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 246.496000 631.236000 254.176000 619.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 254.200000 631.236000 259.936000 619.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 259.900000 631.236000 263.728000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 263.800000 631.236000 271.480000 619.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 271.396000 631.236000 279.076000 619.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 279.100000 631.236000 286.192000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 286.300000 631.236000 290.104000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 290.296000 631.236000 294.124000 619.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 294.100000 631.236000 301.324000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 301.396000 631.236000 308.620000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 308.596000 631.236000 315.856000 619.236000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 315.892000 631.236000 322.048000 619.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 322.096000 631.236000 325.900000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 326.200000 631.236000 333.460000 619.236000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 333.400000 631.236000 337.228000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 337.204000 631.236000 344.932000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 345.004000 631.236000 352.684000 619.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 352.804000 631.236000 356.608000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 356.800000 631.236000 364.024000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 364.000000 631.236000 368.440000 619.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 368.596000 631.236000 372.400000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.592000 631.236000 380.320000 619.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 380.296000 631.236000 387.448000 619.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 387.496000 631.236000 394.756000 619.236000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 394.792000 631.236000 401.884000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 401.896000 631.236000 409.576000 619.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 409.492000 631.236000 413.296000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.392000 631.236000 417.196000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 417.496000 631.236000 425.716000 619.236000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 425.692000 631.236000 432.916000 619.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 432.988000 631.236000 436.792000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 436.984000 631.236000 441.796000 619.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 441.784000 631.236000 449.512000 619.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 449.584000 631.236000 456.676000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 456.688000 631.236000 460.492000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 460.792000 631.236000 466.948000 619.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 466.888000 631.236000 474.616000 619.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 474.592000 631.236000 481.684000 619.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 481.792000 631.236000 485.620000 619.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 485.596000 631.236000 490.036000 619.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 490.000000 631.236000 493.804000 619.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 494.104000 631.236000 497.932000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 498.004000 631.236000 504.160000 619.236000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 631.236000 508.004000 619.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 617.336000 196.876000 605.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 196.900000 617.336000 204.052000 605.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 204.100000 617.336000 211.780000 605.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 211.804000 617.336000 218.896000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 218.908000 617.336000 222.712000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 222.712000 617.336000 229.936000 605.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 229.912000 617.336000 234.352000 605.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 234.316000 617.336000 238.120000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 238.120000 617.336000 245.800000 605.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 245.824000 617.336000 249.652000 605.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 249.628000 617.336000 256.780000 605.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 256.828000 617.336000 260.656000 605.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 260.632000 617.336000 268.360000 605.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 268.336000 617.336000 272.140000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 272.140000 617.336000 279.820000 605.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 279.844000 617.336000 285.580000 605.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 285.544000 617.336000 292.696000 605.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 292.744000 617.336000 299.512000 605.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 299.548000 617.336000 303.352000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 303.352000 617.336000 311.032000 605.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 311.056000 617.336000 314.884000 605.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 314.860000 617.336000 322.012000 605.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 322.060000 617.336000 328.216000 605.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 328.264000 617.336000 334.420000 605.336000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1400.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 585.592000 83.580000 571.592000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 83.594000 585.592000 93.030000 571.592000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 92.988000 585.592000 97.776000 571.592000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 97.790000 585.592000 102.578000 571.592000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.592000 585.592000 112.084000 571.592000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 112.098000 585.592000 119.000000 571.592000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 119.000000 585.592000 128.114000 571.592000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 563.336000 194.164000 551.336000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 194.596000 563.336000 198.400000 551.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 198.892000 563.336000 209.152000 551.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 209.188000 563.336000 216.412000 551.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 216.388000 563.336000 223.612000 551.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 223.588000 563.336000 231.268000 551.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 231.292000 563.336000 238.384000 551.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 238.396000 563.336000 246.124000 551.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 246.496000 563.336000 250.300000 551.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 250.792000 563.336000 256.948000 551.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 256.996000 563.336000 264.676000 551.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 264.592000 563.336000 268.420000 551.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 268.492000 563.336000 274.228000 551.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 274.192000 563.336000 281.344000 551.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 281.392000 563.336000 285.220000 551.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 285.592000 563.336000 289.396000 551.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 289.888000 563.336000 296.044000 551.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 296.092000 563.336000 300.904000 551.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 300.892000 563.336000 308.044000 551.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 307.996000 563.336000 311.824000 551.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 311.896000 563.336000 317.632000 551.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 317.692000 563.336000 324.412000 551.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 324.388000 563.336000 331.540000 551.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 331.588000 563.336000 337.744000 551.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 337.684000 563.336000 344.776000 551.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 345.184000 563.336000 348.988000 551.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 349.480000 563.336000 353.308000 551.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 353.284000 563.336000 360.376000 551.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 360.388000 563.336000 367.540000 551.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 367.588000 563.336000 375.268000 551.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 375.292000 563.336000 381.448000 551.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 381.796000 563.336000 385.600000 551.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 386.200000 563.336000 393.928000 551.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 393.904000 563.336000 401.584000 551.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 401.608000 563.336000 407.764000 551.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 407.812000 563.336000 412.624000 551.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 412.516000 563.336000 419.668000 551.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 419.716000 563.336000 423.544000 551.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 423.520000 563.336000 429.256000 551.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 429.220000 563.336000 435.376000 551.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 435.820000 563.336000 439.624000 551.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 440.116000 563.336000 444.928000 551.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.012000 563.336000 452.236000 551.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 452.608000 563.336000 456.412000 551.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 456.904000 563.336000 461.716000 551.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 461.704000 563.336000 469.432000 551.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 469.504000 563.336000 476.596000 551.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 477.004000 563.336000 480.808000 551.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 481.300000 563.336000 488.980000 551.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 489.004000 563.336000 496.156000 551.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 496.108000 563.336000 499.936000 551.336000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 563.336000 504.044000 551.336000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 549.436000 189.328000 537.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 189.304000 549.436000 196.396000 537.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 196.408000 549.436000 202.144000 537.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 202.204000 549.436000 208.972000 537.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 207.400000 549.436000 211.204000 537.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 212.200000 549.436000 216.004000 537.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 217.000000 549.436000 226.828000 537.436000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 226.804000 549.436000 234.532000 537.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 235.600000 549.436000 239.404000 537.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 240.496000 549.436000 245.308000 537.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 245.296000 549.436000 253.024000 537.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 253.096000 549.436000 260.188000 537.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 261.100000 549.436000 264.904000 537.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 265.900000 549.436000 272.056000 537.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 272.104000 549.436000 279.196000 537.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 279.208000 549.436000 285.928000 537.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 285.904000 549.436000 293.128000 537.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 293.104000 549.436000 300.832000 537.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 300.808000 549.436000 308.488000 537.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 309.604000 549.436000 313.408000 537.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 315.508000 549.436000 323.500000 537.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 322.504000 549.436000 329.728000 537.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 329.704000 549.436000 336.928000 537.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 337.000000 549.436000 342.736000 537.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 341.404000 549.436000 345.208000 537.436000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 346.204000 549.436000 350.008000 537.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 351.004000 549.436000 355.816000 537.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 355.804000 549.436000 363.532000 537.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 363.604000 549.436000 370.696000 537.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 371.608000 549.436000 375.412000 537.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 376.504000 549.436000 384.232000 537.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 384.208000 549.436000 391.360000 537.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 391.408000 549.436000 395.236000 537.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 395.308000 549.436000 399.136000 537.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 399.112000 549.436000 409.372000 537.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 409.408000 549.436000 416.560000 537.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 416.608000 549.436000 423.376000 537.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 424.312000 549.436000 428.116000 537.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.112000 549.436000 436.792000 537.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 436.816000 549.436000 444.040000 537.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 444.016000 549.436000 451.108000 537.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 451.120000 549.436000 457.276000 537.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 458.320000 549.436000 462.124000 537.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 463.216000 549.436000 470.944000 537.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 470.920000 549.436000 478.144000 537.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 478.216000 549.436000 483.028000 537.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 484.012000 549.436000 487.816000 537.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 488.812000 549.436000 496.492000 537.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 496.516000 549.436000 503.740000 537.436000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 549.436000 507.904000 537.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 535.536000 190.312000 523.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 535.536000 198.028000 523.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.100000 535.536000 205.192000 523.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 205.600000 535.536000 209.404000 523.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 209.896000 535.536000 220.156000 523.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 220.192000 535.536000 227.920000 523.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 227.896000 535.536000 235.120000 523.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 235.096000 535.536000 238.924000 523.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 238.996000 535.536000 246.088000 523.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 246.496000 535.536000 250.300000 523.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 250.792000 535.536000 254.620000 523.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 254.596000 535.536000 261.688000 523.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 261.700000 535.536000 269.428000 523.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 269.500000 535.536000 277.180000 523.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 277.096000 535.536000 281.908000 523.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 281.992000 535.536000 289.720000 523.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 290.092000 535.536000 293.896000 523.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 294.496000 535.536000 301.720000 523.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 301.696000 535.536000 306.136000 523.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 306.592000 535.536000 310.396000 523.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 310.888000 535.536000 315.700000 523.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 315.784000 535.536000 323.512000 523.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 323.488000 535.536000 330.580000 523.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 330.988000 535.536000 334.792000 523.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 335.284000 535.536000 343.012000 523.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 342.988000 535.536000 350.212000 523.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 350.284000 535.536000 358.012000 523.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 357.988000 535.536000 364.144000 523.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 364.084000 535.536000 371.176000 523.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 371.680000 535.536000 375.484000 523.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 376.084000 535.536000 383.236000 523.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 383.284000 535.536000 389.440000 523.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 389.788000 535.536000 393.592000 523.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 394.084000 535.536000 397.912000 523.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.888000 535.536000 402.700000 523.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 403.288000 535.536000 407.092000 523.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 407.584000 535.536000 415.264000 523.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 415.180000 535.536000 422.404000 523.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 422.476000 535.536000 429.568000 523.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 429.580000 535.536000 435.736000 523.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 436.084000 535.536000 439.888000 523.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 440.380000 535.536000 448.060000 523.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 448.084000 535.536000 455.176000 523.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 455.188000 535.536000 459.016000 523.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 459.088000 535.536000 466.312000 523.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 466.288000 535.536000 476.548000 523.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 475.192000 535.536000 478.996000 523.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 479.488000 535.536000 483.292000 523.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 483.784000 535.536000 491.464000 523.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 491.380000 535.536000 499.108000 523.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 499.084000 535.536000 503.896000 523.536000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 535.536000 508.004000 523.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 521.636000 189.328000 509.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 189.304000 521.636000 197.032000 509.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 197.104000 521.636000 203.260000 509.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 203.200000 521.636000 208.012000 509.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 208.000000 521.636000 215.092000 509.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 215.104000 521.636000 222.256000 509.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 222.304000 521.636000 229.984000 509.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 231.808000 521.636000 235.612000 509.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 237.412000 521.636000 244.132000 509.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 244.108000 521.636000 251.332000 509.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 251.308000 521.636000 258.076000 509.636000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 258.112000 521.636000 265.204000 509.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 265.216000 521.636000 270.952000 509.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 271.012000 521.636000 277.168000 509.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 278.908000 521.636000 282.712000 509.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 284.512000 521.636000 291.736000 509.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 291.808000 521.636000 299.536000 509.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 299.512000 521.636000 303.340000 509.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 303.412000 521.636000 310.180000 509.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 311.908000 521.636000 315.712000 509.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 317.512000 521.636000 322.324000 509.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 322.312000 521.636000 330.040000 509.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 330.112000 521.636000 337.204000 509.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 339.016000 521.636000 342.820000 509.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 344.620000 521.636000 352.300000 509.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 352.324000 521.636000 359.476000 509.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 359.428000 521.636000 366.148000 509.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 366.232000 521.636000 373.492000 509.636000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 375.232000 521.636000 379.036000 509.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 380.836000 521.636000 385.648000 509.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 385.732000 521.636000 393.460000 509.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 393.436000 521.636000 397.264000 509.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.336000 521.636000 403.072000 509.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 403.036000 521.636000 410.716000 509.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 412.432000 521.636000 416.236000 509.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 418.036000 521.636000 425.260000 509.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 425.332000 521.636000 429.772000 509.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 431.536000 521.636000 435.340000 509.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 437.140000 521.636000 441.952000 509.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 442.036000 521.636000 449.764000 509.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 449.740000 521.636000 456.832000 509.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 458.644000 521.636000 462.448000 509.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 464.248000 521.636000 471.976000 509.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 471.952000 521.636000 479.176000 509.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 479.248000 521.636000 486.976000 509.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 486.952000 521.636000 493.108000 509.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 493.048000 521.636000 500.140000 509.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 500.152000 521.636000 503.956000 509.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 521.636000 507.904000 509.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 507.736000 193.492000 495.736000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 193.504000 507.736000 201.232000 495.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 201.208000 507.736000 205.036000 495.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 205.108000 507.736000 211.264000 495.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 212.404000 507.736000 216.208000 495.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 217.408000 507.736000 224.560000 495.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 224.608000 507.736000 228.436000 495.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 228.412000 507.736000 232.240000 495.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 232.216000 507.736000 239.440000 495.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 239.512000 507.736000 249.772000 495.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 249.712000 507.736000 255.868000 495.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 257.116000 507.736000 260.920000 495.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.216000 507.736000 268.984000 495.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 269.020000 507.736000 276.244000 495.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 276.220000 507.736000 283.948000 495.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 285.220000 507.736000 289.024000 495.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 290.224000 507.736000 295.036000 495.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 295.024000 507.736000 302.248000 495.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 303.424000 507.736000 307.228000 495.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 308.620000 507.736000 316.300000 495.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 316.216000 507.736000 323.308000 495.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 324.520000 507.736000 328.324000 495.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 329.524000 507.736000 336.676000 495.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 336.724000 507.736000 344.404000 495.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 344.320000 507.736000 348.148000 495.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 348.220000 507.736000 355.312000 495.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 356.524000 507.736000 360.328000 495.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 361.624000 507.736000 366.436000 495.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 366.520000 507.736000 373.744000 495.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 374.920000 507.736000 378.724000 495.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 379.924000 507.736000 383.752000 495.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 383.728000 507.736000 390.952000 495.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 391.024000 507.736000 398.248000 495.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 398.224000 507.736000 405.484000 495.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 406.720000 507.736000 410.524000 495.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 411.820000 507.736000 419.500000 495.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 419.524000 507.736000 426.748000 495.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 426.724000 507.736000 436.984000 495.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 436.924000 507.736000 444.652000 495.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 445.924000 507.736000 449.728000 495.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 450.928000 507.736000 458.152000 495.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 458.128000 507.736000 465.856000 495.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 465.928000 507.736000 470.740000 495.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 470.728000 507.736000 477.952000 495.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 479.128000 507.736000 482.932000 495.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.228000 507.736000 489.040000 495.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.028000 507.736000 496.756000 495.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.828000 507.736000 503.920000 495.736000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 507.736000 508.004000 495.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 493.836000 193.180000 481.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 193.204000 493.836000 198.940000 481.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 198.904000 493.836000 206.128000 481.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 206.104000 493.836000 213.832000 481.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 213.808000 493.836000 221.536000 481.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 221.512000 493.836000 229.192000 481.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 229.216000 493.836000 233.020000 481.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 233.020000 493.836000 241.012000 481.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 241.024000 493.836000 248.248000 481.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 248.224000 493.836000 255.448000 481.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 255.424000 493.836000 261.160000 481.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 259.828000 493.836000 263.632000 481.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 473.936000 194.164000 461.936000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 194.200000 473.936000 201.928000 461.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 201.904000 473.936000 205.708000 461.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 205.708000 473.936000 212.860000 461.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 212.908000 473.936000 218.644000 461.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 218.608000 473.936000 223.420000 461.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 223.408000 473.936000 227.236000 461.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 227.212000 473.936000 233.368000 461.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 233.416000 473.936000 238.228000 461.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 238.216000 473.936000 242.044000 461.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 242.020000 473.936000 248.740000 461.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 248.716000 473.936000 252.520000 461.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 252.700000 473.936000 258.856000 461.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 258.904000 473.936000 266.584000 461.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 266.500000 473.936000 270.328000 461.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 270.400000 473.936000 276.136000 461.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 276.100000 473.936000 283.252000 461.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 283.300000 473.936000 287.128000 461.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 287.104000 473.936000 290.908000 461.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 291.004000 473.936000 298.684000 461.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 298.600000 473.936000 305.752000 461.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 305.800000 473.936000 313.528000 461.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 313.504000 473.936000 317.332000 461.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 317.404000 473.936000 323.560000 461.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 323.500000 473.936000 328.312000 461.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 328.300000 473.936000 335.392000 461.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 335.404000 473.936000 341.140000 461.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 341.104000 473.936000 344.908000 461.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 345.100000 473.936000 349.540000 461.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 349.504000 473.936000 356.728000 461.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 356.800000 473.936000 362.536000 461.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.500000 473.936000 373.876000 461.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 373.804000 473.936000 379.960000 461.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 380.008000 473.936000 383.812000 461.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 383.812000 473.936000 388.624000 461.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 388.612000 473.936000 396.340000 461.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 396.412000 473.936000 403.504000 461.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 403.516000 473.936000 407.320000 461.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 407.416000 473.936000 414.508000 461.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 414.520000 473.936000 422.200000 461.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 422.224000 473.936000 429.904000 461.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 429.928000 473.936000 437.020000 461.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 437.032000 473.936000 440.836000 461.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 440.836000 473.936000 448.060000 461.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 448.036000 473.936000 452.476000 461.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 452.440000 473.936000 456.244000 461.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 456.340000 473.936000 461.152000 461.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 461.236000 473.936000 468.964000 461.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 468.940000 473.936000 476.032000 461.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 476.044000 473.936000 479.848000 461.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 479.848000 473.936000 483.676000 461.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 483.652000 473.936000 490.876000 461.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 490.948000 473.936000 495.388000 461.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 495.352000 473.936000 500.164000 461.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 500.152000 473.936000 503.956000 461.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 473.936000 507.904000 461.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 460.036000 193.492000 448.036000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 193.504000 460.036000 201.232000 448.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 201.208000 460.036000 208.300000 448.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 208.312000 460.036000 214.048000 448.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 214.108000 460.036000 221.200000 448.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 222.904000 460.036000 226.708000 448.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 228.400000 460.036000 232.228000 448.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 232.204000 460.036000 238.360000 448.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 240.100000 460.036000 243.904000 448.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.704000 460.036000 252.856000 448.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 256.300000 460.036000 260.104000 448.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 260.300000 460.036000 267.980000 448.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 268.004000 460.036000 275.228000 448.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 275.204000 460.036000 282.428000 448.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 282.404000 460.036000 286.232000 448.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 288.008000 460.036000 291.812000 448.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 293.612000 460.036000 298.424000 448.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 298.412000 460.036000 305.564000 448.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 305.612000 460.036000 313.292000 448.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 313.316000 460.036000 317.144000 448.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 317.120000 460.036000 324.212000 448.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 325.916000 460.036000 329.720000 448.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 331.412000 460.036000 339.140000 448.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 339.116000 460.036000 346.208000 448.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 346.220000 460.036000 351.956000 448.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 352.016000 460.036000 359.108000 448.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 360.812000 460.036000 364.616000 448.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 366.416000 460.036000 373.568000 448.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 373.616000 460.036000 381.344000 448.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 381.320000 460.036000 389.000000 448.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 390.620000 460.036000 394.424000 448.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 396.224000 460.036000 403.376000 448.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 405.020000 460.036000 408.824000 448.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 410.624000 460.036000 415.064000 448.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 415.028000 460.036000 422.756000 448.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 422.828000 460.036000 426.656000 448.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 426.632000 460.036000 430.460000 448.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 430.436000 460.036000 434.480000 448.036000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 434.540000 460.036000 438.980000 448.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 438.944000 460.036000 446.672000 448.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 446.744000 460.036000 454.472000 448.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 454.448000 460.036000 461.168000 448.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 461.144000 460.036000 465.956000 448.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 465.944000 460.036000 469.772000 448.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 469.844000 460.036000 477.068000 448.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 477.044000 460.036000 484.772000 448.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 484.748000 460.036000 488.576000 448.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 488.648000 460.036000 496.376000 448.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 496.352000 460.036000 504.032000 448.036000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 460.036000 507.904000 448.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 446.136000 189.220000 434.136000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 189.196000 446.136000 196.924000 434.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 196.900000 446.136000 204.160000 434.136000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 204.196000 446.136000 211.288000 434.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 211.300000 446.136000 218.980000 434.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 219.004000 446.136000 226.228000 434.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 226.204000 446.136000 232.960000 434.136000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 233.704000 446.136000 237.508000 434.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 238.300000 446.136000 248.560000 434.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 248.596000 446.136000 256.324000 434.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 256.300000 446.136000 260.128000 434.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 260.104000 446.136000 266.824000 434.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 266.908000 446.136000 274.636000 434.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 275.404000 446.136000 279.208000 434.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 280.000000 446.136000 291.376000 434.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 291.400000 446.136000 298.552000 434.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 298.504000 446.136000 305.764000 434.136000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 305.800000 446.136000 312.892000 434.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 312.904000 446.136000 319.060000 434.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 319.804000 446.136000 323.608000 434.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 324.400000 446.136000 328.840000 434.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 328.804000 446.136000 336.028000 434.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 336.100000 446.136000 341.836000 434.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 342.604000 446.136000 346.408000 434.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 347.200000 446.136000 354.352000 434.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 355.096000 446.136000 358.900000 434.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 359.692000 446.136000 363.520000 434.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 363.496000 446.136000 370.720000 434.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 370.792000 446.136000 375.604000 434.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 376.396000 446.136000 380.200000 434.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 380.992000 446.136000 388.216000 434.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 388.192000 446.136000 392.632000 434.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 393.292000 446.136000 397.096000 434.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 397.996000 446.136000 402.436000 434.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 402.400000 446.136000 410.128000 434.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 410.200000 446.136000 417.928000 434.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 418.696000 446.136000 422.500000 434.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 423.292000 446.136000 433.552000 434.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 433.588000 446.136000 441.316000 434.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 441.292000 446.136000 448.384000 434.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 448.396000 446.136000 456.124000 434.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 456.796000 446.136000 460.600000 434.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 461.392000 446.136000 465.832000 434.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 465.796000 446.136000 471.532000 434.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.592000 446.136000 475.420000 434.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 475.396000 446.136000 482.488000 434.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 482.500000 446.136000 490.228000 434.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 490.204000 446.136000 497.884000 434.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 497.908000 446.136000 504.064000 434.136000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 446.136000 508.004000 434.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 432.236000 192.220000 420.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 192.196000 432.236000 199.420000 420.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 199.396000 432.236000 210.772000 420.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 210.796000 432.236000 217.888000 420.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 217.900000 432.236000 221.704000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 221.704000 432.236000 228.928000 420.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 228.904000 432.236000 235.672000 420.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 235.708000 432.236000 242.800000 420.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 242.812000 432.236000 248.548000 420.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 248.512000 432.236000 252.316000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 252.316000 432.236000 257.128000 420.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 257.116000 432.236000 264.340000 420.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 264.316000 432.236000 268.120000 420.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 268.120000 432.236000 274.888000 420.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 274.924000 432.236000 278.752000 420.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 278.728000 432.236000 284.884000 420.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 284.932000 432.236000 288.760000 420.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 288.736000 432.236000 293.548000 420.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 293.536000 432.236000 297.340000 420.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 394.448000 84.468000 378.448000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 84.500000 394.448000 92.148000 378.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 92.100000 394.448000 99.748000 378.448000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.700000 394.448000 105.172000 378.448000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 105.204000 394.448000 114.676000 378.448000 1.000000 0.000000 0.000000 1.000000 c
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 369.936000 193.492000 357.936000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 193.504000 369.936000 201.232000 357.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 201.208000 369.936000 208.300000 357.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 209.812000 369.936000 213.616000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 215.212000 369.936000 222.364000 357.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 222.412000 369.936000 227.224000 357.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 227.212000 369.936000 232.024000 357.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 232.012000 369.936000 235.840000 357.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 235.816000 369.936000 242.536000 357.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 244.120000 369.936000 247.924000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 249.520000 369.936000 257.248000 357.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 257.224000 369.936000 264.376000 357.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 264.424000 369.936000 270.580000 357.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 272.128000 369.936000 275.932000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.528000 369.936000 285.256000 357.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 285.232000 369.936000 292.456000 357.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 292.528000 369.936000 297.340000 357.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 298.828000 369.936000 302.632000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 304.228000 369.936000 310.996000 357.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 310.924000 369.936000 318.016000 357.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 318.028000 369.936000 322.840000 357.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 324.424000 369.936000 328.228000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 329.824000 369.936000 337.504000 357.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 337.528000 369.936000 344.620000 357.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 344.632000 369.936000 351.724000 357.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 351.736000 369.936000 359.464000 357.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 360.940000 369.936000 364.744000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 366.340000 369.936000 372.076000 357.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 372.040000 369.936000 379.132000 357.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 379.144000 369.936000 386.872000 357.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 386.944000 369.936000 394.168000 357.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 394.144000 369.936000 400.912000 357.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 400.948000 369.936000 408.100000 357.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 408.052000 369.936000 412.864000 357.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 412.852000 369.936000 419.944000 357.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 419.956000 369.936000 427.636000 357.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 427.660000 369.936000 431.464000 357.936000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 433.060000 369.936000 436.864000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.460000 369.936000 445.612000 357.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 445.660000 369.936000 449.488000 357.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 449.464000 369.936000 454.276000 357.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 454.264000 369.936000 461.992000 357.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 461.968000 369.936000 469.192000 357.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 469.264000 369.936000 476.992000 357.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 476.968000 369.936000 484.648000 357.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 484.564000 369.936000 492.292000 357.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 493.864000 369.936000 497.668000 357.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 499.264000 369.936000 504.004000 357.936000 1.000000 0.000000 0.000000 1.000000 I
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 369.936000 507.904000 357.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 356.036000 195.760000 344.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 195.796000 356.036000 203.020000 344.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 202.996000 356.036000 210.724000 344.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 210.700000 356.036000 214.528000 344.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 214.600000 356.036000 222.280000 344.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 222.700000 356.036000 226.504000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 227.104000 356.036000 230.932000 344.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 230.908000 356.036000 234.736000 344.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 234.712000 356.036000 241.972000 344.036000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 242.008000 356.036000 249.100000 344.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 249.604000 356.036000 253.408000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 254.008000 356.036000 258.820000 344.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 258.808000 356.036000 266.032000 344.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 266.608000 356.036000 270.412000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 270.904000 356.036000 277.996000 344.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 278.008000 356.036000 284.764000 344.036000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 284.812000 356.036000 292.492000 344.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 292.516000 356.036000 299.668000 344.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 299.620000 356.036000 307.348000 344.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 307.324000 356.036000 315.004000 344.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 315.520000 356.036000 319.324000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 319.924000 356.036000 323.752000 344.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 323.728000 356.036000 328.540000 344.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 329.128000 356.036000 332.932000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 333.424000 356.036000 339.580000 344.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 339.628000 356.036000 346.852000 344.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 346.828000 356.036000 358.204000 344.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 358.228000 356.036000 365.320000 344.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 365.332000 356.036000 373.012000 344.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 372.928000 356.036000 380.080000 344.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 380.128000 356.036000 386.896000 344.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 387.424000 356.036000 391.228000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 391.828000 356.036000 396.640000 344.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 396.628000 356.036000 403.852000 344.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 404.332000 356.036000 408.136000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 408.628000 356.036000 412.456000 344.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 412.432000 356.036000 420.160000 344.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 420.232000 356.036000 426.952000 344.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 426.928000 356.036000 430.756000 344.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 430.732000 356.036000 438.460000 344.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 438.532000 356.036000 446.212000 344.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 446.128000 356.036000 453.220000 344.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.832000 356.036000 457.636000 344.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 458.236000 356.036000 465.388000 344.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 466.336000 356.036000 470.140000 344.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 470.600000 356.036000 478.280000 344.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 478.304000 356.036000 486.032000 344.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 486.008000 356.036000 493.100000 344.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 493.112000 356.036000 499.268000 344.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 499.316000 356.036000 504.128000 344.036000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 356.036000 507.904000 344.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 342.136000 191.236000 330.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 191.200000 342.136000 198.424000 330.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 198.496000 342.136000 205.720000 330.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 205.696000 342.136000 217.072000 330.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 217.096000 342.136000 220.900000 330.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.992000 342.136000 225.796000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 226.996000 342.136000 231.736000 330.136000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 231.700000 342.136000 236.512000 330.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 237.700000 342.136000 241.504000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 242.704000 342.136000 252.964000 330.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 253.000000 342.136000 260.224000 330.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 260.200000 342.136000 267.928000 330.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 267.904000 342.136000 271.732000 330.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 271.804000 342.136000 279.484000 330.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 280.504000 342.136000 284.308000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 285.508000 342.136000 292.660000 330.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 292.708000 342.136000 296.536000 330.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 296.512000 342.136000 302.668000 330.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 302.716000 342.136000 309.940000 330.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 311.020000 342.136000 314.824000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 316.024000 342.136000 323.704000 330.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 323.728000 342.136000 330.820000 330.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 331.924000 342.136000 335.728000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 336.928000 342.136000 344.656000 330.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 344.632000 342.136000 348.460000 330.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 348.532000 342.136000 355.252000 330.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 355.228000 342.136000 362.320000 330.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 363.424000 342.136000 367.228000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 368.428000 342.136000 373.240000 330.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 373.228000 342.136000 380.452000 330.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 381.628000 342.136000 385.432000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 386.632000 342.136000 393.784000 330.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 393.832000 342.136000 401.512000 330.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 401.428000 342.136000 409.108000 330.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 410.224000 342.136000 414.028000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 415.228000 342.136000 422.452000 330.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 422.428000 342.136000 430.156000 330.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 431.332000 342.136000 435.136000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 436.336000 342.136000 443.488000 330.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 444.532000 342.136000 448.336000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 449.536000 342.136000 455.272000 330.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 455.236000 342.136000 462.460000 330.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 462.532000 342.136000 469.756000 330.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 469.732000 342.136000 474.172000 330.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 475.336000 342.136000 479.140000 330.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 480.340000 342.136000 487.108000 330.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 487.144000 342.136000 494.236000 330.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 494.248000 342.136000 499.984000 330.136000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 342.136000 504.044000 330.136000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 328.236000 192.652000 316.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 192.700000 328.236000 200.428000 316.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 200.404000 328.236000 208.084000 316.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 208.108000 328.236000 215.260000 316.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 215.212000 328.236000 222.940000 316.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 224.008000 328.236000 227.812000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 229.108000 328.236000 236.332000 316.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 236.308000 328.236000 243.076000 316.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 243.112000 328.236000 250.204000 316.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 250.216000 328.236000 255.952000 316.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 255.916000 328.236000 259.744000 316.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 259.720000 328.236000 266.944000 316.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 267.016000 328.236000 274.240000 316.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 274.216000 328.236000 281.476000 316.236000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 281.512000 328.236000 285.340000 316.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 285.316000 328.236000 293.044000 316.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 293.116000 328.236000 300.796000 316.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 301.912000 328.236000 305.716000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 306.916000 328.236000 311.728000 316.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 311.716000 328.236000 319.444000 316.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 319.516000 328.236000 326.608000 316.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 327.712000 328.236000 331.516000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 332.716000 328.236000 340.936000 316.236000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 340.912000 328.236000 348.064000 316.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 348.112000 328.236000 355.840000 316.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 357.016000 328.236000 360.820000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 362.020000 328.236000 370.336000 316.236000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 370.324000 328.236000 376.060000 316.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 376.120000 328.236000 383.272000 316.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 383.224000 328.236000 390.952000 316.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 390.928000 328.236000 397.648000 316.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 397.732000 328.236000 401.560000 316.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 401.536000 328.236000 407.692000 316.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 407.740000 328.236000 414.460000 316.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 414.436000 328.236000 421.660000 316.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 422.740000 328.236000 426.544000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 427.744000 328.236000 436.552000 316.236000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 436.540000 328.236000 443.692000 316.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 443.740000 328.236000 450.508000 316.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 448.936000 328.236000 452.740000 316.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.940000 328.236000 457.744000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 458.944000 328.236000 467.752000 316.236000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 467.740000 328.236000 475.468000 316.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 475.444000 328.236000 480.256000 316.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 481.444000 328.236000 485.248000 316.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 486.448000 328.236000 490.888000 316.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 490.852000 328.236000 498.076000 316.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 498.148000 328.236000 503.884000 316.236000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 328.236000 507.904000 316.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 314.336000 190.312000 302.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 314.336000 198.028000 302.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.100000 314.336000 205.192000 302.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 206.200000 314.336000 210.004000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 211.096000 314.336000 215.908000 302.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 215.896000 314.336000 219.724000 302.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 219.796000 314.336000 231.172000 302.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 231.100000 314.336000 238.192000 302.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 239.296000 314.336000 243.100000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 244.192000 314.336000 251.872000 302.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 251.896000 314.336000 258.988000 302.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 259.000000 314.336000 262.828000 302.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 262.804000 314.336000 270.532000 302.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 270.508000 314.336000 278.188000 302.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 278.212000 314.336000 282.016000 302.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 283.108000 314.336000 286.912000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.004000 314.336000 291.832000 302.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 291.808000 314.336000 296.620000 302.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 297.712000 314.336000 301.516000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 302.716000 314.336000 306.544000 302.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 306.520000 314.336000 312.676000 302.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 313.720000 314.336000 317.524000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 318.616000 314.336000 329.992000 302.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 329.920000 314.336000 337.072000 302.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.120000 314.336000 340.948000 302.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 340.924000 314.336000 348.652000 302.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 348.724000 314.336000 352.552000 302.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 352.528000 314.336000 359.296000 302.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 360.424000 314.336000 364.228000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 365.320000 314.336000 373.048000 302.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 373.024000 314.336000 379.180000 302.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 379.228000 314.336000 386.320000 302.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 386.332000 314.336000 394.012000 302.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 395.032000 314.336000 398.836000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 399.928000 314.336000 404.740000 302.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 404.728000 314.336000 411.952000 302.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 413.032000 314.336000 416.836000 302.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 417.928000 314.336000 424.084000 302.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 424.132000 314.336000 428.944000 302.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 428.932000 314.336000 436.156000 302.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 436.132000 314.336000 441.868000 302.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 441.832000 314.336000 448.924000 302.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 451.132000 314.336000 454.936000 302.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 455.200000 314.336000 459.028000 302.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 459.004000 314.336000 466.732000 302.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 466.708000 314.336000 474.388000 302.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 474.412000 314.336000 482.092000 302.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 482.116000 314.336000 489.268000 302.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 489.316000 314.336000 496.996000 302.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 497.020000 314.336000 504.112000 302.336000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 314.336000 507.904000 302.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 300.436000 192.652000 288.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 192.700000 300.436000 200.428000 288.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 200.404000 300.436000 208.084000 288.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 208.108000 300.436000 211.912000 288.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 211.900000 300.436000 221.080000 288.436000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 221.104000 300.436000 228.832000 288.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 228.808000 300.436000 234.544000 288.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 234.508000 300.436000 238.336000 288.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 238.312000 300.436000 244.468000 288.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 244.516000 300.436000 249.328000 288.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 249.316000 300.436000 260.692000 288.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 260.716000 300.436000 267.868000 288.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 267.916000 300.436000 274.072000 288.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 274.120000 300.436000 277.924000 288.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.924000 300.436000 285.604000 288.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 285.628000 300.436000 292.720000 288.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 292.732000 300.436000 299.452000 288.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 299.428000 300.436000 306.652000 288.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 306.628000 300.436000 312.364000 288.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 312.328000 300.436000 319.480000 288.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 319.528000 300.436000 324.340000 288.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 324.328000 300.436000 328.156000 288.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 328.132000 300.436000 335.356000 288.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 335.332000 300.436000 343.060000 288.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 343.036000 300.436000 349.192000 288.436000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 349.300000 300.436000 353.104000 288.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 455.600000 86.136000 463.664000 74.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 463.100000 86.136000 470.252000 74.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 470.300000 86.136000 477.980000 74.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 478.004000 86.136000 485.096000 74.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 485.108000 86.136000 488.912000 74.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 488.900000 86.136000 496.532000 74.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 496.496000 86.136000 504.128000 74.136000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 8358.800000 0 477.900000 8358.800000 0 477.900000 8668.600000 0 134.300000 8668.600000 0 134.300000 8358.800000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -756690.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 5369.800000 0 168.100000 5369.800000 0 168.100000 5374.800000 0 76.900000 5374.800000 0 76.900000 5369.800000 0
+eoFillPath subpath 1 163.100000 5374.700000 0 168.100000 5374.700000 0 168.100000 5505.300000 0 163.100000 5505.300000 0 163.100000 5374.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 5374.800000 0 163.100000 5374.800000 0 163.100000 5510.200000 0 72.000000 5510.200000 0 72.000000 5374.800000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 5505.880000 87.320000 5495.880000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 5505.880000 93.420000 5495.880000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 5505.880000 97.510000 5495.880000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 5505.880000 101.420000 5495.880000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 5505.880000 104.170000 5495.880000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 5505.880000 110.530000 5495.880000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 5505.880000 113.270000 5495.880000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 5505.880000 116.470000 5495.880000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 5505.880000 123.480000 5495.880000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 5505.880000 129.610000 5495.880000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 5505.880000 135.090000 5495.880000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 5505.880000 140.890000 5495.880000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 5505.880000 144.820000 5495.880000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 5505.880000 150.920000 5495.880000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 5505.880000 153.670000 5495.880000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 5505.880000 156.470000 5495.880000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 5379.000000 0 168.200000 5379.000000 0 168.200000 5494.200000 0 72.000000 5494.200000 0 72.000000 5379.000000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5447.152000 79.253000 5438.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 5447.152000 86.669000 5438.152000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 5447.152000 90.215000 5438.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 5447.152000 93.077000 5438.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 5447.152000 97.406000 5438.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 5447.152000 100.853000 5438.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 5447.152000 107.324000 5438.152000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 5447.152000 112.337000 5438.152000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 5447.152000 115.271000 5438.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 5447.152000 118.655000 5438.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 5447.152000 126.512000 5438.152000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 5447.152000 130.805000 5438.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 5447.152000 135.881000 5438.152000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 5447.152000 139.355000 5438.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 5447.152000 147.284000 5438.152000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 5447.152000 150.074000 5438.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 5447.152000 155.897000 5438.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 5447.152000 158.750000 5438.152000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 5447.152000 161.853000 5438.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5436.652000 82.124000 5427.652000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 5436.652000 87.137000 5427.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 5436.652000 90.071000 5427.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 5436.652000 93.356000 5427.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 5436.652000 100.403000 5427.652000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 5436.652000 104.921000 5427.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 5436.652000 109.205000 5427.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 5436.652000 117.737000 5427.652000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 5436.652000 123.119000 5427.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 5436.652000 128.996000 5427.652000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 5436.652000 132.605000 5427.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 5436.652000 138.392000 5427.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 5436.652000 141.749000 5427.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 5436.652000 149.507000 5427.652000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 5436.652000 153.800000 5427.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 5436.652000 158.876000 5427.652000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 5436.652000 161.853000 5427.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5426.152000 81.764000 5417.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 5426.152000 87.596000 5417.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 5426.152000 93.356000 5417.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 5426.152000 102.050000 5417.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 5426.152000 113.822000 5417.152000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 5426.152000 122.651000 5417.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 5426.152000 134.117000 5417.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 5426.152000 138.401000 5417.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 5426.152000 147.149000 5417.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 5426.152000 158.921000 5417.152000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 5426.152000 161.853000 5417.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5415.652000 79.271000 5406.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 5415.652000 84.338000 5406.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 5415.652000 89.621000 5406.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 5415.652000 94.643000 5406.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 5415.652000 100.502000 5406.652000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 5415.652000 106.262000 5406.652000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 5415.652000 111.518000 5406.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 5415.652000 116.216000 5406.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 5415.652000 119.249000 5406.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 5415.652000 122.363000 5406.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 5415.652000 128.186000 5406.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 5415.652000 131.345000 5406.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 5415.652000 137.060000 5406.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 5415.652000 140.147000 5406.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 5415.652000 145.007000 5406.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 5415.652000 148.598000 5406.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 5415.652000 151.460000 5406.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 5415.652000 155.789000 5406.652000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 5415.652000 158.933000 5406.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5405.152000 80.702000 5396.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 5405.152000 83.573000 5396.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 5405.152000 89.396000 5396.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 5405.152000 95.156000 5396.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 5405.152000 100.547000 5396.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 5405.152000 109.052000 5396.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 5405.152000 111.959000 5396.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 5405.152000 117.251000 5396.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 5405.152000 121.904000 5396.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 5405.152000 126.503000 5396.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 5405.152000 129.338000 5396.152000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 5405.152000 134.936000 5396.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 5405.152000 143.441000 5396.152000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 5405.152000 148.796000 5396.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 5405.152000 154.574000 5396.152000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 5405.152000 158.876000 5396.152000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 5405.152000 161.853000 5396.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5394.652000 79.271000 5385.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 5394.652000 85.094000 5385.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 5394.652000 88.703000 5385.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 5394.652000 94.112000 5385.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 5394.652000 97.244000 5385.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 5394.652000 103.058000 5385.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 5394.652000 108.890000 5385.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 5394.652000 111.950000 5385.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 5394.652000 115.271000 5385.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 5394.652000 120.338000 5385.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 5394.652000 125.621000 5385.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 5394.652000 131.363000 5385.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 5394.652000 134.558000 5385.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 5394.652000 140.048000 5385.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 5394.652000 145.430000 5385.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 5394.652000 150.551000 5385.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 5394.652000 155.960000 5385.652000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 5394.652000 158.933000 5385.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5384.152000 80.009000 5375.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 5384.152000 85.364000 5375.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 5384.152000 88.271000 5375.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 5384.152000 91.169000 5375.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 5384.152000 97.955000 5375.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 5384.152000 107.765000 5375.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 5384.152000 110.672000 5375.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 5384.152000 115.964000 5375.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 5384.152000 120.617000 5375.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 5384.152000 125.216000 5375.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 5384.152000 128.051000 5375.152000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 5384.152000 134.954000 5375.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 5384.152000 146.285000 5375.152000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 5384.152000 151.667000 5375.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 5384.152000 155.906000 5375.152000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 5384.152000 159.033000 5375.152000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 5374.700000 0 72.100000 5374.700000 0 72.100000 5510.200000 0 72.000000 5510.200000 0 72.000000 5374.700000 0
+eoFillPath subpath 1 163.100000 5374.700000 0 163.200000 5374.700000 0 163.200000 5510.200000 0 163.100000 5510.200000 0 163.100000 5374.700000 0
+eoFillPath subpath 1 72.000000 5510.100000 0 163.200000 5510.100000 0 163.200000 5510.200000 0 72.000000 5510.200000 0 72.000000 5510.100000 0
+eoFillPath subpath 1 72.000000 5374.700000 0 163.200000 5374.700000 0 163.200000 5374.800000 0 72.000000 5374.800000 0 72.000000 5374.700000 0
+saveState
+eoClipPath subpath 1 96.900000 5450.000000 0 138.300000 5450.000000 0 138.300000 5494.200000 0 96.900000 5494.200000 0 96.900000 5450.000000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -465810.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 5095.200000 0 165.500000 5095.200000 0 165.500000 5100.200000 0 76.900000 5100.200000 0 76.900000 5095.200000 0
+eoFillPath subpath 1 160.500000 5100.100000 0 165.500000 5100.100000 0 165.500000 5256.400000 0 160.500000 5256.400000 0 160.500000 5100.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 5100.200000 0 121.400000 5100.200000 0 121.400000 5261.300000 0 72.000000 5261.300000 0 72.000000 5100.200000 0
+saveState
+eoClipPath subpath 1 72.000000 5100.100000 0 160.500000 5100.100000 0 160.500000 5261.200000 0 72.000000 5261.200000 0 72.000000 5100.100000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -429110.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 5256.980000 89.280000 5246.980000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 5256.980000 95.630000 5246.980000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 5256.980000 99.520000 5246.980000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 5256.980000 102.270000 5246.980000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 5256.980000 108.450000 5246.980000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 5256.980000 112.610000 5246.980000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 5256.980000 118.510000 5246.980000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 5256.980000 121.670000 5246.980000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 5256.980000 124.470000 5246.980000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 5256.980000 130.830000 5246.980000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 5256.980000 133.970000 5246.980000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 5256.980000 137.920000 5246.980000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 5256.980000 144.230000 5246.980000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 5256.980000 150.350000 5246.980000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 5256.980000 153.570000 5246.980000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 5245.280000 95.000000 5235.280000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 5245.280000 97.770000 5235.280000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 5245.280000 103.000000 5235.280000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 5245.280000 109.330000 5235.280000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 5245.280000 117.470000 5235.280000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 5245.280000 123.620000 5235.280000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 5245.280000 128.800000 5235.280000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 5245.280000 135.130000 5235.280000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 5245.280000 141.250000 5235.280000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 5245.280000 145.410000 5235.280000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5230.452000 82.961000 5221.452000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 5230.452000 87.614000 5221.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 5230.452000 93.356000 5221.452000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 5230.452000 98.612000 5221.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 5230.452000 103.733000 5221.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 5230.452000 106.568000 5221.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 5230.452000 111.959000 5221.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 5230.452000 114.866000 5221.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 5230.452000 117.665000 5221.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 5230.452000 122.768000 5221.452000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 5230.452000 125.747000 5221.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 5230.452000 131.651000 5221.452000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 5230.452000 136.907000 5221.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 5230.452000 142.307000 5221.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 5230.452000 148.049000 5221.452000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 5230.452000 150.956000 5221.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 5230.452000 156.302000 5221.452000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5230.452000 159.253000 5221.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5219.952000 84.095000 5210.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 5219.952000 89.900000 5210.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 5219.952000 95.318000 5210.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 5219.952000 100.349000 5210.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 5219.952000 110.789000 5210.952000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 5219.952000 111.464000 5210.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 5219.952000 114.362000 5210.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 5219.952000 119.348000 5210.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 5219.952000 126.962000 5210.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 5219.952000 132.047000 5210.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 5219.952000 139.958000 5210.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 5219.952000 142.865000 5210.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 5219.952000 147.410000 5210.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 5219.952000 153.287000 5210.952000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 5219.952000 156.333000 5210.952000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5209.452000 84.095000 5200.452000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 5209.452000 89.468000 5200.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 5209.452000 94.121000 5200.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 5209.452000 99.899000 5200.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 5209.452000 105.218000 5200.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 5209.452000 109.502000 5200.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 5209.452000 115.649000 5200.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 5209.452000 122.327000 5200.452000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 5209.452000 127.718000 5200.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 5209.452000 132.002000 5200.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 5209.452000 138.149000 5200.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 5209.452000 145.205000 5200.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 5209.452000 150.992000 5200.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 5209.452000 156.311000 5200.452000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5209.452000 159.253000 5200.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5198.952000 82.394000 5189.952000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 5198.952000 86.705000 5189.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 5198.952000 91.322000 5189.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 5198.952000 94.913000 5189.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 5198.952000 98.054000 5189.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 5198.952000 102.014000 5189.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 5198.952000 104.876000 5189.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 5198.952000 113.435000 5189.952000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 5198.952000 118.718000 5189.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 5198.952000 121.949000 5189.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 5198.952000 125.063000 5189.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 5198.952000 130.886000 5189.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 5198.952000 134.045000 5189.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 5198.952000 138.005000 5189.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 5198.952000 143.792000 5189.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 5198.952000 149.111000 5189.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 5198.952000 151.964000 5189.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 5198.952000 156.293000 5189.952000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 5198.952000 159.153000 5189.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5188.452000 79.271000 5179.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 5188.452000 82.169000 5179.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 5188.452000 85.526000 5179.452000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 5188.452000 90.818000 5179.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 5188.452000 94.454000 5179.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 5188.452000 99.008000 5179.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 5188.452000 104.318000 5179.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 5188.452000 110.096000 5179.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 5188.452000 115.856000 5179.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 5188.452000 119.546000 5179.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 5188.452000 124.001000 5179.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 5188.452000 129.509000 5179.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 5188.452000 133.145000 5179.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 5188.452000 139.751000 5179.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 5188.452000 145.205000 5179.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 5188.452000 148.841000 5179.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 5188.452000 152.657000 5179.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 5188.452000 156.293000 5179.452000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5188.452000 159.253000 5179.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5177.952000 84.095000 5168.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 5177.952000 88.406000 5168.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 5177.952000 93.824000 5168.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 5177.952000 99.602000 5168.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 5177.952000 105.362000 5168.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 5177.952000 108.422000 5168.952000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 5177.952000 116.747000 5168.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 5177.952000 129.275000 5168.952000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 5177.952000 135.089000 5168.952000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 5177.952000 138.698000 5168.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 5177.952000 141.560000 5168.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 5177.952000 146.906000 5168.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 5177.952000 151.190000 5168.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 5177.952000 156.266000 5168.952000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5177.952000 159.253000 5168.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5167.452000 82.196000 5158.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 5167.452000 87.560000 5158.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 5167.452000 92.213000 5158.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 5167.452000 96.551000 5158.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 5167.452000 101.708000 5158.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 5167.452000 107.216000 5158.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 5167.452000 111.653000 5158.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 5167.452000 118.961000 5158.452000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 5167.452000 124.316000 5158.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 5167.452000 128.654000 5158.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 5167.452000 133.172000 5158.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 5167.452000 138.995000 5158.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 5167.452000 143.612000 5158.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 5167.452000 148.913000 5158.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 5167.452000 153.197000 5158.452000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 5167.452000 156.333000 5158.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5156.952000 80.009000 5147.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 5156.952000 85.319000 5147.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 5156.952000 91.061000 5147.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 5156.952000 100.052000 5147.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 5156.952000 113.993000 5147.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 5156.952000 116.873000 5147.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 5156.952000 120.410000 5147.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 5156.952000 126.296000 5147.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 5156.952000 135.350000 5147.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 5156.952000 145.106000 5147.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 5156.952000 150.893000 5147.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 5156.952000 156.212000 5147.952000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5156.952000 159.253000 5147.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5146.452000 82.196000 5137.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 5146.452000 87.560000 5137.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 5146.452000 93.392000 5137.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 5146.452000 99.152000 5137.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 5146.452000 101.960000 5137.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 5146.452000 107.306000 5137.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 5146.452000 111.905000 5137.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 5146.452000 115.640000 5137.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 5146.452000 122.444000 5137.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 5146.452000 127.898000 5137.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 5146.452000 135.575000 5137.452000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 5146.452000 141.380000 5137.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 5146.452000 145.241000 5137.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 5146.452000 150.803000 5137.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 5146.452000 156.302000 5137.452000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5146.452000 159.253000 5137.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5135.952000 80.009000 5126.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 5135.952000 85.796000 5126.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 5135.952000 91.115000 5126.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 5135.952000 95.399000 5126.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 5135.952000 100.718000 5126.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 5135.952000 107.054000 5126.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 5135.952000 118.097000 5126.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 5135.952000 123.524000 5126.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 5135.952000 129.401000 5126.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 5135.952000 131.768000 5126.952000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 5135.952000 135.413000 5126.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 5135.952000 141.659000 5126.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 5135.952000 150.965000 5126.952000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 5135.952000 156.320000 5126.952000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5135.952000 159.253000 5126.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5125.452000 81.017000 5116.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 5125.452000 84.608000 5116.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 5125.452000 89.963000 5116.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 5125.452000 92.870000 5116.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 5125.452000 98.693000 5116.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 5125.452000 103.310000 5116.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 5125.452000 107.243000 5116.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 5125.452000 116.081000 5116.452000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 5125.452000 121.886000 5116.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 5125.452000 127.205000 5116.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 5125.452000 132.983000 5116.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 5125.452000 136.943000 5116.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 5125.452000 143.846000 5116.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 5125.452000 148.184000 5116.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 5125.452000 153.260000 5116.452000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 5125.452000 156.433000 5116.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5114.952000 79.271000 5105.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 5114.952000 85.094000 5105.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 5114.952000 90.854000 5105.952000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 5114.952000 93.653000 5105.952000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 5100.100000 0 72.100000 5100.100000 0 72.100000 5261.300000 0 72.000000 5261.300000 0 72.000000 5100.100000 0
+eoFillPath subpath 1 160.500000 5100.100000 0 160.600000 5100.100000 0 160.600000 5261.300000 0 160.500000 5261.300000 0 160.500000 5100.100000 0
+eoFillPath subpath 1 72.000000 5261.200000 0 160.600000 5261.200000 0 160.600000 5261.300000 0 72.000000 5261.300000 0 72.000000 5261.200000 0
+eoFillPath subpath 1 72.000000 5100.100000 0 160.600000 5100.100000 0 160.600000 5100.200000 0 72.000000 5100.200000 0 72.000000 5100.100000 0
+saveState
+eoClipPath subpath 1 108.000000 4612.700000 0 178.900000 4612.700000 0 178.900000 4669.400000 0 108.000000 4669.400000 0 108.000000 4612.700000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -382080.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 554.300000 0 165.500000 554.300000 0 165.500000 559.300000 0 76.900000 559.300000 0 76.900000 554.300000 0
+eoFillPath subpath 1 160.500000 559.200000 0 165.500000 559.200000 0 165.500000 668.000000 0 160.500000 668.000000 0 160.500000 559.200000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 559.300000 0 160.500000 559.300000 0 160.500000 672.900000 0 72.000000 672.900000 0 72.000000 559.300000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 668.552000 83.771000 659.552000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 668.552000 89.594000 659.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 668.552000 92.465000 659.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 668.552000 97.568000 659.552000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 668.552000 100.943000 659.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 668.552000 106.955000 659.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 668.552000 110.447000 659.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 668.552000 114.425000 659.552000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 668.552000 119.717000 659.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 668.552000 127.493000 659.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 668.552000 130.949000 659.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 668.552000 136.574000 659.552000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 668.552000 141.920000 659.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 668.552000 147.365000 659.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 668.552000 151.703000 659.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 668.552000 156.320000 659.552000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 668.552000 159.153000 659.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 658.052000 81.764000 649.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 658.052000 85.130000 649.052000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 658.052000 88.712000 649.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 658.052000 94.022000 649.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 658.052000 98.306000 649.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 658.052000 102.455000 649.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 658.052000 106.676000 649.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 658.052000 110.312000 649.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 658.052000 114.920000 649.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 658.052000 119.060000 649.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 658.052000 125.450000 649.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 658.052000 130.832000 649.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 658.052000 139.445000 649.052000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 658.052000 145.169000 649.052000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 658.052000 148.076000 649.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 658.052000 153.323000 649.052000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 658.052000 156.433000 649.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 647.552000 80.009000 638.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 647.552000 82.871000 638.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 647.552000 88.316000 638.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 647.552000 94.094000 638.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 647.552000 96.947000 638.552000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 647.552000 104.948000 638.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 647.552000 113.705000 638.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 647.552000 119.492000 638.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 647.552000 124.811000 638.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 647.552000 132.848000 638.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 647.552000 141.605000 638.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 647.552000 144.467000 638.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 647.552000 148.103000 638.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 647.552000 150.965000 638.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 647.552000 156.311000 638.552000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 647.552000 159.253000 638.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 637.052000 80.999000 628.052000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 637.052000 90.539000 628.052000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 637.052000 95.318000 628.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 637.052000 99.602000 628.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 637.052000 102.473000 628.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 637.052000 108.260000 628.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 637.052000 110.762000 628.052000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 637.052000 115.316000 628.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 637.052000 122.156000 628.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 637.052000 132.299000 628.052000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 637.052000 136.970000 628.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 637.052000 139.877000 628.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 637.052000 142.775000 628.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 637.052000 148.022000 628.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 637.052000 152.720000 628.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 637.052000 156.311000 628.052000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 637.052000 159.253000 628.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 626.552000 83.006000 617.552000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 626.552000 88.793000 617.552000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 626.552000 91.664000 617.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 626.552000 94.562000 617.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 626.552000 100.349000 617.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 626.552000 103.157000 617.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 626.552000 108.980000 617.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 626.552000 114.740000 617.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 626.552000 119.375000 617.552000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 626.552000 128.033000 617.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 626.552000 141.479000 617.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 626.552000 146.807000 617.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 626.552000 152.684000 617.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 626.552000 156.293000 617.552000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 626.552000 159.253000 617.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 616.052000 79.730000 607.052000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 616.052000 84.005000 607.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 616.052000 89.423000 607.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 616.052000 98.036000 607.052000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 616.052000 121.157000 607.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 616.052000 145.115000 607.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 616.052000 151.001000 607.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 616.052000 156.320000 607.052000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 616.052000 159.253000 607.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 605.552000 83.285000 596.552000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 605.552000 89.099000 596.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 605.552000 93.401000 596.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 605.552000 98.477000 596.552000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 605.552000 103.121000 596.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 605.552000 105.974000 596.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 605.552000 111.320000 596.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 605.552000 115.604000 596.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 605.552000 123.857000 596.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 605.552000 136.007000 596.552000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 605.552000 141.794000 596.552000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 605.552000 144.665000 596.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 605.552000 147.464000 596.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 605.552000 153.251000 596.552000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 605.552000 156.433000 596.552000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 595.052000 79.271000 586.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 595.052000 85.094000 586.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 595.052000 90.854000 586.052000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 595.052000 96.146000 586.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 595.052000 102.302000 586.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 595.052000 107.711000 586.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 595.052000 113.048000 586.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 595.052000 119.204000 586.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 595.052000 124.991000 586.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 595.052000 130.310000 586.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 595.052000 135.647000 586.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 595.052000 144.755000 586.052000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 595.052000 153.323000 586.052000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 595.052000 156.333000 586.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 584.552000 82.160000 575.552000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 584.552000 85.067000 575.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 584.552000 89.297000 575.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 584.552000 94.616000 575.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 584.552000 98.747000 575.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 584.552000 106.055000 575.552000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 584.552000 109.700000 575.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 584.552000 115.055000 575.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 584.552000 118.601000 575.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 584.552000 124.010000 575.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 584.552000 128.042000 575.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 584.552000 135.998000 575.552000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 584.552000 141.785000 575.552000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 584.552000 144.656000 575.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 584.552000 147.554000 575.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 584.552000 153.341000 575.552000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 584.552000 156.433000 575.552000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 574.052000 79.271000 565.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 574.052000 85.094000 565.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 574.052000 90.854000 565.052000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 574.052000 93.743000 565.052000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 559.200000 0 72.100000 559.200000 0 72.100000 672.900000 0 72.000000 672.900000 0 72.000000 559.200000 0
+eoFillPath subpath 1 160.500000 559.200000 0 160.600000 559.200000 0 160.600000 672.900000 0 160.500000 672.900000 0 160.500000 559.200000 0
+eoFillPath subpath 1 72.000000 672.800000 0 160.600000 672.800000 0 160.600000 672.900000 0 72.000000 672.900000 0 72.000000 672.800000 0
+eoFillPath subpath 1 72.000000 559.200000 0 160.600000 559.200000 0 160.600000 559.300000 0 72.000000 559.300000 0 72.000000 559.200000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 6748.800000 0 169.600000 6748.800000 0 169.600000 6753.800000 0 76.900000 6753.800000 0 76.900000 6748.800000 0
+eoFillPath subpath 1 164.600000 6753.700000 0 169.600000 6753.700000 0 169.600000 6869.300000 0 164.600000 6869.300000 0 164.600000 6753.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 6753.800000 0 121.400000 6753.800000 0 121.400000 6874.200000 0 72.000000 6874.200000 0 72.000000 6753.800000 0
+saveState
+eoClipPath subpath 1 72.000000 6753.700000 0 164.600000 6753.700000 0 164.600000 6874.100000 0 72.000000 6874.100000 0 72.000000 6753.700000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -590350.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 6823.700000 0 93.700000 6823.700000 0 93.700000 6842.900000 0 72.000000 6842.900000 0 72.000000 6823.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 6823.700000 0 169.600000 6823.700000 0 169.600000 6842.900000 0 93.700000 6842.900000 0 93.700000 6823.700000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 6807.000000 0 93.700000 6807.000000 0 93.700000 6823.700000 0 72.000000 6823.700000 0 72.000000 6807.000000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 6807.000000 0 169.600000 6807.000000 0 169.600000 6823.700000 0 93.700000 6823.700000 0 93.700000 6807.000000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 6787.800000 0 93.700000 6787.800000 0 93.700000 6807.000000 0 72.000000 6807.000000 0 72.000000 6787.800000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 6787.800000 0 169.600000 6787.800000 0 169.600000 6807.000000 0 93.700000 6807.000000 0 93.700000 6787.800000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 6768.600000 0 93.700000 6768.600000 0 93.700000 6787.800000 0 72.000000 6787.800000 0 72.000000 6768.600000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 6768.600000 0 169.600000 6768.600000 0 169.600000 6787.800000 0 93.700000 6787.800000 0 93.700000 6768.600000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6869.852000 82.898000 6860.852000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 6869.852000 87.200000 6860.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 6869.852000 90.809000 6860.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 6869.852000 93.671000 6860.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 6869.852000 98.315000 6860.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 6869.852000 101.906000 6860.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 6869.852000 106.514000 6860.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 6869.852000 109.754000 6860.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 6869.852000 112.868000 6860.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 6869.852000 118.691000 6860.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 6869.852000 121.850000 6860.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 6869.852000 125.702000 6860.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 6869.852000 131.588000 6860.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 6869.852000 136.907000 6860.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 6869.852000 140.039000 6860.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 6869.852000 146.078000 6860.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 6869.852000 151.442000 6860.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 6869.852000 154.349000 6860.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 6869.852000 157.148000 6860.852000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 6869.852000 160.433000 6860.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6859.352000 84.095000 6850.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 6859.352000 89.468000 6850.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 6859.352000 94.580000 6850.352000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 6859.352000 97.631000 6850.352000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 6838.952000 104.443000 6829.952000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 6838.952000 109.060000 6829.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 6838.952000 113.398000 6829.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 6838.952000 119.194000 6829.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 6838.952000 124.612000 6829.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 6838.952000 127.465000 6829.952000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 6822.252000 101.176000 6813.252000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 6822.252000 104.074000 6813.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 6822.252000 109.420000 6813.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 6822.252000 114.442000 6813.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 6822.252000 120.202000 6813.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 6822.252000 123.811000 6813.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 6822.252000 129.121000 6813.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 6822.252000 134.899000 6813.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 6822.252000 139.516000 6813.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 6822.252000 143.107000 6813.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 6822.252000 148.417000 6813.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 6822.252000 151.270000 6813.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 6822.252000 157.093000 6813.252000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 6805.552000 103.048000 6796.552000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 6805.552000 108.421000 6796.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 6805.552000 113.443000 6796.552000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 6805.552000 118.852000 6796.552000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 6805.552000 124.702000 6796.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 6805.552000 130.021000 6796.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 6805.552000 135.079000 6796.552000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 6786.352000 104.407000 6777.352000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 6786.352000 109.816000 6777.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 6786.352000 115.594000 6777.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 6786.352000 121.354000 6777.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 6786.352000 125.692000 6777.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 6786.352000 128.563000 6777.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 6786.352000 133.954000 6777.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 6786.352000 139.786000 6777.352000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 6753.700000 0 72.100000 6753.700000 0 72.100000 6874.200000 0 72.000000 6874.200000 0 72.000000 6753.700000 0
+eoFillPath subpath 1 164.600000 6753.700000 0 164.700000 6753.700000 0 164.700000 6874.200000 0 164.600000 6874.200000 0 164.600000 6753.700000 0
+eoFillPath subpath 1 72.000000 6874.100000 0 164.700000 6874.100000 0 164.700000 6874.200000 0 72.000000 6874.200000 0 72.000000 6874.100000 0
+eoFillPath subpath 1 72.000000 6753.700000 0 164.700000 6753.700000 0 164.700000 6753.800000 0 72.000000 6753.800000 0 72.000000 6753.700000 0
+eoFillPath subpath 1 91.300000 6768.600000 0 93.700000 6768.600000 0 93.700000 6842.900000 0 91.300000 6842.900000 0 91.300000 6768.600000 0
+eoFillPath subpath 1 72.000000 6787.800000 0 169.600000 6787.800000 0 169.600000 6790.200000 0 72.000000 6790.200000 0 72.000000 6787.800000 0
+eoFillPath subpath 1 72.000000 6840.500000 0 169.600000 6840.500000 0 169.600000 6842.900000 0 72.000000 6842.900000 0 72.000000 6840.500000 0
+eoFillPath subpath 1 72.000000 6768.600000 0 169.600000 6768.600000 0 169.600000 6771.000000 0 72.000000 6771.000000 0 72.000000 6768.600000 0
+saveState
+eoClipPath subpath 1 108.000000 -1097.400000 0 150.800000 -1097.400000 0 150.800000 -1053.200000 0 108.000000 -1053.200000 0 108.000000 -1097.400000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 188940.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 -1947.400000 0 499.600000 -1947.400000 0 499.600000 -1942.300000 0 186.800000 -1942.300000 0 186.800000 -1947.400000 0
+eoFillPath subpath 1 494.500000 -1942.400000 0 499.600000 -1942.400000 0 499.600000 -1754.000000 0 494.500000 -1754.000000 0 494.500000 -1942.400000 0
+saveState
+eoClipPath subpath 1 181.800000 -1942.300000 0 494.500000 -1942.300000 0 494.500000 -1749.000000 0 181.800000 -1749.000000 0 181.800000 -1942.300000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 -1748.900000 0 494.500000 -1748.900000 0 494.500000 -1748.900000 0 181.700000 -1748.900000 0
+eoFillPath subpath 1 181.700000 -1748.900000 0 494.500000 -1748.900000 0 494.500000 -1749.700000 0 181.700000 -1749.700000 0 181.700000 -1748.900000 0
+eoFillPath subpath 1 181.700000 -1749.700000 0 494.500000 -1749.700000 0 494.500000 -1750.500000 0 181.700000 -1750.500000 0 181.700000 -1749.700000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 -1750.500000 0 494.500000 -1750.500000 0 494.500000 -1751.200000 0 181.700000 -1751.200000 0 181.700000 -1750.500000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 -1751.200000 0 494.500000 -1751.200000 0 494.500000 -1752.000000 0 181.700000 -1752.000000 0 181.700000 -1751.200000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 -1752.000000 0 494.500000 -1752.000000 0 494.500000 -1752.700000 0 181.700000 -1752.700000 0 181.700000 -1752.000000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 -1752.700000 0 494.500000 -1752.700000 0 494.500000 -1753.500000 0 181.700000 -1753.500000 0 181.700000 -1752.700000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 -1753.500000 0 494.500000 -1753.500000 0 494.500000 -1754.200000 0 181.700000 -1754.200000 0 181.700000 -1753.500000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 -1754.200000 0 494.500000 -1754.200000 0 494.500000 -1755.000000 0 181.700000 -1755.000000 0 181.700000 -1754.200000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 -1755.000000 0 494.500000 -1755.000000 0 494.500000 -1755.800000 0 181.700000 -1755.800000 0 181.700000 -1755.000000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 -1755.800000 0 494.500000 -1755.800000 0 494.500000 -1756.500000 0 181.700000 -1756.500000 0 181.700000 -1755.800000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 -1756.500000 0 494.500000 -1756.500000 0 494.500000 -1757.300000 0 181.700000 -1757.300000 0 181.700000 -1756.500000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 -1757.300000 0 494.500000 -1757.300000 0 494.500000 -1758.000000 0 181.700000 -1758.000000 0 181.700000 -1757.300000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 -1758.000000 0 494.500000 -1758.000000 0 494.500000 -1758.800000 0 181.700000 -1758.800000 0 181.700000 -1758.000000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 -1758.800000 0 494.500000 -1758.800000 0 494.500000 -1759.500000 0 181.700000 -1759.500000 0 181.700000 -1758.800000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 -1759.500000 0 494.500000 -1759.500000 0 494.500000 -1760.300000 0 181.700000 -1760.300000 0 181.700000 -1759.500000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 -1760.300000 0 494.500000 -1760.300000 0 494.500000 -1761.100000 0 181.700000 -1761.100000 0 181.700000 -1760.300000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 -1761.100000 0 494.500000 -1761.100000 0 494.500000 -1761.800000 0 181.700000 -1761.800000 0 181.700000 -1761.100000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 -1761.800000 0 494.500000 -1761.800000 0 494.500000 -1762.600000 0 181.700000 -1762.600000 0 181.700000 -1761.800000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 -1762.600000 0 494.500000 -1762.600000 0 494.500000 -1763.300000 0 181.700000 -1763.300000 0 181.700000 -1762.600000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 -1763.300000 0 494.500000 -1763.300000 0 494.500000 -1764.100000 0 181.700000 -1764.100000 0 181.700000 -1763.300000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 -1764.100000 0 494.500000 -1764.100000 0 494.500000 -1764.900000 0 181.700000 -1764.900000 0 181.700000 -1764.100000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 -1764.900000 0 494.500000 -1764.900000 0 494.500000 -1765.600000 0 181.700000 -1765.600000 0 181.700000 -1764.900000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 -1765.600000 0 494.500000 -1765.600000 0 494.500000 -1766.400000 0 181.700000 -1766.400000 0 181.700000 -1765.600000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 -1766.400000 0 494.500000 -1766.400000 0 494.500000 -1767.100000 0 181.700000 -1767.100000 0 181.700000 -1766.400000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 -1767.100000 0 494.500000 -1767.100000 0 494.500000 -1767.900000 0 181.700000 -1767.900000 0 181.700000 -1767.100000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 -1767.900000 0 494.500000 -1767.900000 0 494.500000 -1768.600000 0 181.700000 -1768.600000 0 181.700000 -1767.900000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 -1768.600000 0 494.500000 -1768.600000 0 494.500000 -1769.400000 0 181.700000 -1769.400000 0 181.700000 -1768.600000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 -1769.400000 0 494.500000 -1769.400000 0 494.500000 -1770.200000 0 181.700000 -1770.200000 0 181.700000 -1769.400000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 -1770.200000 0 494.500000 -1770.200000 0 494.500000 -1770.900000 0 181.700000 -1770.900000 0 181.700000 -1770.200000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 -1770.900000 0 494.500000 -1770.900000 0 494.500000 -1771.700000 0 181.700000 -1771.700000 0 181.700000 -1770.900000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 -1771.700000 0 494.500000 -1771.700000 0 494.500000 -1772.400000 0 181.700000 -1772.400000 0 181.700000 -1771.700000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 -1772.400000 0 494.500000 -1772.400000 0 494.500000 -1773.200000 0 181.700000 -1773.200000 0 181.700000 -1772.400000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 -1773.200000 0 494.500000 -1773.200000 0 494.500000 -1774.000000 0 181.700000 -1774.000000 0 181.700000 -1773.200000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 -1774.000000 0 494.500000 -1774.000000 0 494.500000 -1774.700000 0 181.700000 -1774.700000 0 181.700000 -1774.000000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 -1774.700000 0 494.500000 -1774.700000 0 494.500000 -1775.500000 0 181.700000 -1775.500000 0 181.700000 -1774.700000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 -1775.500000 0 494.500000 -1775.500000 0 494.500000 -1776.200000 0 181.700000 -1776.200000 0 181.700000 -1775.500000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 -1776.200000 0 494.500000 -1776.200000 0 494.500000 -1777.000000 0 181.700000 -1777.000000 0 181.700000 -1776.200000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 -1777.000000 0 494.500000 -1777.000000 0 494.500000 -1777.800000 0 181.700000 -1777.800000 0 181.700000 -1777.000000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 -1777.800000 0 494.500000 -1777.800000 0 494.500000 -1778.500000 0 181.700000 -1778.500000 0 181.700000 -1777.800000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 -1778.500000 0 494.500000 -1778.500000 0 494.500000 -1779.300000 0 181.700000 -1779.300000 0 181.700000 -1778.500000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 -1779.300000 0 494.500000 -1779.300000 0 494.500000 -1780.000000 0 181.700000 -1780.000000 0 181.700000 -1779.300000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 -1780.000000 0 494.500000 -1780.000000 0 494.500000 -1780.800000 0 181.700000 -1780.800000 0 181.700000 -1780.000000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 -1780.800000 0 494.500000 -1780.800000 0 494.500000 -1781.500000 0 181.700000 -1781.500000 0 181.700000 -1780.800000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 -1781.500000 0 494.500000 -1781.500000 0 494.500000 -1782.300000 0 181.700000 -1782.300000 0 181.700000 -1781.500000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 -1782.300000 0 494.500000 -1782.300000 0 494.500000 -1783.100000 0 181.700000 -1783.100000 0 181.700000 -1782.300000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 -1783.100000 0 494.500000 -1783.100000 0 494.500000 -1783.800000 0 181.700000 -1783.800000 0 181.700000 -1783.100000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 -1783.800000 0 494.500000 -1783.800000 0 494.500000 -1784.600000 0 181.700000 -1784.600000 0 181.700000 -1783.800000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 -1784.600000 0 494.500000 -1784.600000 0 494.500000 -1785.300000 0 181.700000 -1785.300000 0 181.700000 -1784.600000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 -1785.300000 0 494.500000 -1785.300000 0 494.500000 -1786.100000 0 181.700000 -1786.100000 0 181.700000 -1785.300000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 -1786.100000 0 494.500000 -1786.100000 0 494.500000 -1786.900000 0 181.700000 -1786.900000 0 181.700000 -1786.100000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 -1786.900000 0 494.500000 -1786.900000 0 494.500000 -1787.600000 0 181.700000 -1787.600000 0 181.700000 -1786.900000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 -1787.600000 0 494.500000 -1787.600000 0 494.500000 -1788.400000 0 181.700000 -1788.400000 0 181.700000 -1787.600000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 -1788.400000 0 494.500000 -1788.400000 0 494.500000 -1789.100000 0 181.700000 -1789.100000 0 181.700000 -1788.400000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 -1789.100000 0 494.500000 -1789.100000 0 494.500000 -1789.900000 0 181.700000 -1789.900000 0 181.700000 -1789.100000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 -1789.900000 0 494.500000 -1789.900000 0 494.500000 -1790.700000 0 181.700000 -1790.700000 0 181.700000 -1789.900000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 -1790.700000 0 494.500000 -1790.700000 0 494.500000 -1791.400000 0 181.700000 -1791.400000 0 181.700000 -1790.700000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 -1791.400000 0 494.500000 -1791.400000 0 494.500000 -1792.200000 0 181.700000 -1792.200000 0 181.700000 -1791.400000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 -1792.200000 0 494.500000 -1792.200000 0 494.500000 -1792.900000 0 181.700000 -1792.900000 0 181.700000 -1792.200000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 -1792.900000 0 494.500000 -1792.900000 0 494.500000 -1793.700000 0 181.700000 -1793.700000 0 181.700000 -1792.900000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 -1793.700000 0 494.500000 -1793.700000 0 494.500000 -1794.400000 0 181.700000 -1794.400000 0 181.700000 -1793.700000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 -1794.400000 0 494.500000 -1794.400000 0 494.500000 -1795.200000 0 181.700000 -1795.200000 0 181.700000 -1794.400000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 -1795.200000 0 494.500000 -1795.200000 0 494.500000 -1796.000000 0 181.700000 -1796.000000 0 181.700000 -1795.200000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 -1796.000000 0 494.500000 -1796.000000 0 494.500000 -1796.700000 0 181.700000 -1796.700000 0 181.700000 -1796.000000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 -1796.700000 0 494.500000 -1796.700000 0 494.500000 -1797.500000 0 181.700000 -1797.500000 0 181.700000 -1796.700000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 -1797.500000 0 494.500000 -1797.500000 0 494.500000 -1798.200000 0 181.700000 -1798.200000 0 181.700000 -1797.500000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 -1798.200000 0 494.500000 -1798.200000 0 494.500000 -1799.000000 0 181.700000 -1799.000000 0 181.700000 -1798.200000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 -1799.000000 0 494.500000 -1799.000000 0 494.500000 -1799.800000 0 181.700000 -1799.800000 0 181.700000 -1799.000000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 -1799.800000 0 494.500000 -1799.800000 0 494.500000 -1800.500000 0 181.700000 -1800.500000 0 181.700000 -1799.800000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 -1800.500000 0 494.500000 -1800.500000 0 494.500000 -1801.300000 0 181.700000 -1801.300000 0 181.700000 -1800.500000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 -1801.300000 0 494.500000 -1801.300000 0 494.500000 -1802.000000 0 181.700000 -1802.000000 0 181.700000 -1801.300000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 -1802.000000 0 494.500000 -1802.000000 0 494.500000 -1802.800000 0 181.700000 -1802.800000 0 181.700000 -1802.000000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 -1802.800000 0 494.500000 -1802.800000 0 494.500000 -1803.600000 0 181.700000 -1803.600000 0 181.700000 -1802.800000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 -1803.600000 0 494.500000 -1803.600000 0 494.500000 -1804.300000 0 181.700000 -1804.300000 0 181.700000 -1803.600000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 -1804.300000 0 494.500000 -1804.300000 0 494.500000 -1805.100000 0 181.700000 -1805.100000 0 181.700000 -1804.300000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 -1805.100000 0 494.500000 -1805.100000 0 494.500000 -1805.800000 0 181.700000 -1805.800000 0 181.700000 -1805.100000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 -1805.800000 0 494.500000 -1805.800000 0 494.500000 -1806.600000 0 181.700000 -1806.600000 0 181.700000 -1805.800000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 -1806.600000 0 494.500000 -1806.600000 0 494.500000 -1807.300000 0 181.700000 -1807.300000 0 181.700000 -1806.600000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 -1807.300000 0 494.500000 -1807.300000 0 494.500000 -1808.100000 0 181.700000 -1808.100000 0 181.700000 -1807.300000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 -1808.100000 0 494.500000 -1808.100000 0 494.500000 -1808.900000 0 181.700000 -1808.900000 0 181.700000 -1808.100000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 -1808.900000 0 494.500000 -1808.900000 0 494.500000 -1809.600000 0 181.700000 -1809.600000 0 181.700000 -1808.900000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 -1809.600000 0 494.500000 -1809.600000 0 494.500000 -1810.400000 0 181.700000 -1810.400000 0 181.700000 -1809.600000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 -1810.400000 0 494.500000 -1810.400000 0 494.500000 -1811.100000 0 181.700000 -1811.100000 0 181.700000 -1810.400000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 -1811.100000 0 494.500000 -1811.100000 0 494.500000 -1811.900000 0 181.700000 -1811.900000 0 181.700000 -1811.100000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 -1811.900000 0 494.500000 -1811.900000 0 494.500000 -1812.700000 0 181.700000 -1812.700000 0 181.700000 -1811.900000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 -1812.700000 0 494.500000 -1812.700000 0 494.500000 -1813.400000 0 181.700000 -1813.400000 0 181.700000 -1812.700000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 -1813.400000 0 494.500000 -1813.400000 0 494.500000 -1814.200000 0 181.700000 -1814.200000 0 181.700000 -1813.400000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 -1814.200000 0 494.500000 -1814.200000 0 494.500000 -1814.900000 0 181.700000 -1814.900000 0 181.700000 -1814.200000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 -1814.900000 0 494.500000 -1814.900000 0 494.500000 -1815.700000 0 181.700000 -1815.700000 0 181.700000 -1814.900000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 -1815.700000 0 494.500000 -1815.700000 0 494.500000 -1816.500000 0 181.700000 -1816.500000 0 181.700000 -1815.700000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 -1816.500000 0 494.500000 -1816.500000 0 494.500000 -1817.200000 0 181.700000 -1817.200000 0 181.700000 -1816.500000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 -1817.200000 0 494.500000 -1817.200000 0 494.500000 -1818.000000 0 181.700000 -1818.000000 0 181.700000 -1817.200000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 -1818.000000 0 494.500000 -1818.000000 0 494.500000 -1818.700000 0 181.700000 -1818.700000 0 181.700000 -1818.000000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 -1818.700000 0 494.500000 -1818.700000 0 494.500000 -1819.500000 0 181.700000 -1819.500000 0 181.700000 -1818.700000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 -1819.500000 0 494.500000 -1819.500000 0 494.500000 -1820.200000 0 181.700000 -1820.200000 0 181.700000 -1819.500000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 -1820.200000 0 494.500000 -1820.200000 0 494.500000 -1821.000000 0 181.700000 -1821.000000 0 181.700000 -1820.200000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 -1821.000000 0 494.500000 -1821.000000 0 494.500000 -1821.800000 0 181.700000 -1821.800000 0 181.700000 -1821.000000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 -1821.800000 0 494.500000 -1821.800000 0 494.500000 -1822.500000 0 181.700000 -1822.500000 0 181.700000 -1821.800000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 -1822.500000 0 494.500000 -1822.500000 0 494.500000 -1823.300000 0 181.700000 -1823.300000 0 181.700000 -1822.500000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 -1823.300000 0 494.500000 -1823.300000 0 494.500000 -1824.000000 0 181.700000 -1824.000000 0 181.700000 -1823.300000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 -1824.000000 0 494.500000 -1824.000000 0 494.500000 -1824.800000 0 181.700000 -1824.800000 0 181.700000 -1824.000000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 -1824.800000 0 494.500000 -1824.800000 0 494.500000 -1825.600000 0 181.700000 -1825.600000 0 181.700000 -1824.800000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 -1825.600000 0 494.500000 -1825.600000 0 494.500000 -1826.300000 0 181.700000 -1826.300000 0 181.700000 -1825.600000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 -1826.300000 0 494.500000 -1826.300000 0 494.500000 -1827.100000 0 181.700000 -1827.100000 0 181.700000 -1826.300000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 -1827.100000 0 494.500000 -1827.100000 0 494.500000 -1827.800000 0 181.700000 -1827.800000 0 181.700000 -1827.100000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 -1827.800000 0 494.500000 -1827.800000 0 494.500000 -1828.600000 0 181.700000 -1828.600000 0 181.700000 -1827.800000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 -1828.600000 0 494.500000 -1828.600000 0 494.500000 -1829.400000 0 181.700000 -1829.400000 0 181.700000 -1828.600000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 -1829.400000 0 494.500000 -1829.400000 0 494.500000 -1830.100000 0 181.700000 -1830.100000 0 181.700000 -1829.400000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 -1830.100000 0 494.500000 -1830.100000 0 494.500000 -1830.900000 0 181.700000 -1830.900000 0 181.700000 -1830.100000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 -1830.900000 0 494.500000 -1830.900000 0 494.500000 -1831.600000 0 181.700000 -1831.600000 0 181.700000 -1830.900000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 -1831.600000 0 494.500000 -1831.600000 0 494.500000 -1832.400000 0 181.700000 -1832.400000 0 181.700000 -1831.600000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 -1832.400000 0 494.500000 -1832.400000 0 494.500000 -1833.100000 0 181.700000 -1833.100000 0 181.700000 -1832.400000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 -1833.100000 0 494.500000 -1833.100000 0 494.500000 -1833.900000 0 181.700000 -1833.900000 0 181.700000 -1833.100000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 -1833.900000 0 494.500000 -1833.900000 0 494.500000 -1834.700000 0 181.700000 -1834.700000 0 181.700000 -1833.900000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 -1834.700000 0 494.500000 -1834.700000 0 494.500000 -1835.400000 0 181.700000 -1835.400000 0 181.700000 -1834.700000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 -1835.400000 0 494.500000 -1835.400000 0 494.500000 -1836.200000 0 181.700000 -1836.200000 0 181.700000 -1835.400000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 -1836.200000 0 494.500000 -1836.200000 0 494.500000 -1836.900000 0 181.700000 -1836.900000 0 181.700000 -1836.200000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 -1836.900000 0 494.500000 -1836.900000 0 494.500000 -1837.700000 0 181.700000 -1837.700000 0 181.700000 -1836.900000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 -1837.700000 0 494.500000 -1837.700000 0 494.500000 -1838.500000 0 181.700000 -1838.500000 0 181.700000 -1837.700000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 -1838.500000 0 494.500000 -1838.500000 0 494.500000 -1839.200000 0 181.700000 -1839.200000 0 181.700000 -1838.500000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 -1839.200000 0 494.500000 -1839.200000 0 494.500000 -1840.000000 0 181.700000 -1840.000000 0 181.700000 -1839.200000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 -1840.000000 0 494.500000 -1840.000000 0 494.500000 -1840.700000 0 181.700000 -1840.700000 0 181.700000 -1840.000000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 -1840.700000 0 494.500000 -1840.700000 0 494.500000 -1841.500000 0 181.700000 -1841.500000 0 181.700000 -1840.700000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 -1841.500000 0 494.500000 -1841.500000 0 494.500000 -1842.300000 0 181.700000 -1842.300000 0 181.700000 -1841.500000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 -1842.300000 0 494.500000 -1842.300000 0 494.500000 -1843.000000 0 181.700000 -1843.000000 0 181.700000 -1842.300000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 -1843.000000 0 494.500000 -1843.000000 0 494.500000 -1843.800000 0 181.700000 -1843.800000 0 181.700000 -1843.000000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 -1843.800000 0 494.500000 -1843.800000 0 494.500000 -1844.500000 0 181.700000 -1844.500000 0 181.700000 -1843.800000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 -1844.500000 0 494.500000 -1844.500000 0 494.500000 -1845.300000 0 181.700000 -1845.300000 0 181.700000 -1844.500000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 -1845.300000 0 494.500000 -1845.300000 0 494.500000 -1846.000000 0 181.700000 -1846.000000 0 181.700000 -1845.300000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 -1846.000000 0 494.500000 -1846.000000 0 494.500000 -1846.800000 0 181.700000 -1846.800000 0 181.700000 -1846.000000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 -1846.800000 0 494.500000 -1846.800000 0 494.500000 -1847.600000 0 181.700000 -1847.600000 0 181.700000 -1846.800000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 -1847.600000 0 494.500000 -1847.600000 0 494.500000 -1848.300000 0 181.700000 -1848.300000 0 181.700000 -1847.600000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 -1848.300000 0 494.500000 -1848.300000 0 494.500000 -1849.100000 0 181.700000 -1849.100000 0 181.700000 -1848.300000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 -1849.100000 0 494.500000 -1849.100000 0 494.500000 -1849.800000 0 181.700000 -1849.800000 0 181.700000 -1849.100000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 -1849.800000 0 494.500000 -1849.800000 0 494.500000 -1850.600000 0 181.700000 -1850.600000 0 181.700000 -1849.800000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 -1850.600000 0 494.500000 -1850.600000 0 494.500000 -1851.400000 0 181.700000 -1851.400000 0 181.700000 -1850.600000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 -1851.400000 0 494.500000 -1851.400000 0 494.500000 -1852.100000 0 181.700000 -1852.100000 0 181.700000 -1851.400000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 -1852.100000 0 494.500000 -1852.100000 0 494.500000 -1852.900000 0 181.700000 -1852.900000 0 181.700000 -1852.100000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 -1852.900000 0 494.500000 -1852.900000 0 494.500000 -1853.600000 0 181.700000 -1853.600000 0 181.700000 -1852.900000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 -1853.600000 0 494.500000 -1853.600000 0 494.500000 -1854.400000 0 181.700000 -1854.400000 0 181.700000 -1853.600000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 -1854.400000 0 494.500000 -1854.400000 0 494.500000 -1855.200000 0 181.700000 -1855.200000 0 181.700000 -1854.400000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 -1855.200000 0 494.500000 -1855.200000 0 494.500000 -1855.900000 0 181.700000 -1855.900000 0 181.700000 -1855.200000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 -1855.900000 0 494.500000 -1855.900000 0 494.500000 -1856.700000 0 181.700000 -1856.700000 0 181.700000 -1855.900000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 -1856.700000 0 494.500000 -1856.700000 0 494.500000 -1857.400000 0 181.700000 -1857.400000 0 181.700000 -1856.700000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 -1857.400000 0 494.500000 -1857.400000 0 494.500000 -1858.200000 0 181.700000 -1858.200000 0 181.700000 -1857.400000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 -1858.200000 0 494.500000 -1858.200000 0 494.500000 -1858.900000 0 181.700000 -1858.900000 0 181.700000 -1858.200000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 -1858.900000 0 494.500000 -1858.900000 0 494.500000 -1859.700000 0 181.700000 -1859.700000 0 181.700000 -1858.900000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 -1859.700000 0 494.500000 -1859.700000 0 494.500000 -1860.500000 0 181.700000 -1860.500000 0 181.700000 -1859.700000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 -1860.500000 0 494.500000 -1860.500000 0 494.500000 -1861.200000 0 181.700000 -1861.200000 0 181.700000 -1860.500000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 -1861.200000 0 494.500000 -1861.200000 0 494.500000 -1862.000000 0 181.700000 -1862.000000 0 181.700000 -1861.200000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 -1862.000000 0 494.500000 -1862.000000 0 494.500000 -1862.700000 0 181.700000 -1862.700000 0 181.700000 -1862.000000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 -1862.700000 0 494.500000 -1862.700000 0 494.500000 -1863.500000 0 181.700000 -1863.500000 0 181.700000 -1862.700000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 -1863.500000 0 494.500000 -1863.500000 0 494.500000 -1864.300000 0 181.700000 -1864.300000 0 181.700000 -1863.500000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 -1864.300000 0 494.500000 -1864.300000 0 494.500000 -1865.000000 0 181.700000 -1865.000000 0 181.700000 -1864.300000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 -1865.000000 0 494.500000 -1865.000000 0 494.500000 -1865.800000 0 181.700000 -1865.800000 0 181.700000 -1865.000000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 -1865.800000 0 494.500000 -1865.800000 0 494.500000 -1866.500000 0 181.700000 -1866.500000 0 181.700000 -1865.800000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 -1866.500000 0 494.500000 -1866.500000 0 494.500000 -1867.300000 0 181.700000 -1867.300000 0 181.700000 -1866.500000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 -1867.300000 0 494.500000 -1867.300000 0 494.500000 -1868.100000 0 181.700000 -1868.100000 0 181.700000 -1867.300000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 -1868.100000 0 494.500000 -1868.100000 0 494.500000 -1868.800000 0 181.700000 -1868.800000 0 181.700000 -1868.100000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 -1868.800000 0 494.500000 -1868.800000 0 494.500000 -1869.600000 0 181.700000 -1869.600000 0 181.700000 -1868.800000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 -1869.600000 0 494.500000 -1869.600000 0 494.500000 -1870.300000 0 181.700000 -1870.300000 0 181.700000 -1869.600000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 -1870.300000 0 494.500000 -1870.300000 0 494.500000 -1871.100000 0 181.700000 -1871.100000 0 181.700000 -1870.300000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 -1871.100000 0 494.500000 -1871.100000 0 494.500000 -1871.800000 0 181.700000 -1871.800000 0 181.700000 -1871.100000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 -1871.800000 0 494.500000 -1871.800000 0 494.500000 -1872.600000 0 181.700000 -1872.600000 0 181.700000 -1871.800000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 -1872.600000 0 494.500000 -1872.600000 0 494.500000 -1873.400000 0 181.700000 -1873.400000 0 181.700000 -1872.600000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 -1873.400000 0 494.500000 -1873.400000 0 494.500000 -1874.100000 0 181.700000 -1874.100000 0 181.700000 -1873.400000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 -1874.100000 0 494.500000 -1874.100000 0 494.500000 -1874.900000 0 181.700000 -1874.900000 0 181.700000 -1874.100000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 -1874.900000 0 494.500000 -1874.900000 0 494.500000 -1875.600000 0 181.700000 -1875.600000 0 181.700000 -1874.900000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 -1875.600000 0 494.500000 -1875.600000 0 494.500000 -1876.400000 0 181.700000 -1876.400000 0 181.700000 -1875.600000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 -1876.400000 0 494.500000 -1876.400000 0 494.500000 -1877.200000 0 181.700000 -1877.200000 0 181.700000 -1876.400000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 -1877.200000 0 494.500000 -1877.200000 0 494.500000 -1877.900000 0 181.700000 -1877.900000 0 181.700000 -1877.200000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 -1877.900000 0 494.500000 -1877.900000 0 494.500000 -1878.700000 0 181.700000 -1878.700000 0 181.700000 -1877.900000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 -1878.700000 0 494.500000 -1878.700000 0 494.500000 -1879.400000 0 181.700000 -1879.400000 0 181.700000 -1878.700000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 -1879.400000 0 494.500000 -1879.400000 0 494.500000 -1880.200000 0 181.700000 -1880.200000 0 181.700000 -1879.400000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 -1880.200000 0 494.500000 -1880.200000 0 494.500000 -1881.000000 0 181.700000 -1881.000000 0 181.700000 -1880.200000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 -1881.000000 0 494.500000 -1881.000000 0 494.500000 -1881.700000 0 181.700000 -1881.700000 0 181.700000 -1881.000000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 -1881.700000 0 494.500000 -1881.700000 0 494.500000 -1882.500000 0 181.700000 -1882.500000 0 181.700000 -1881.700000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 -1882.500000 0 494.500000 -1882.500000 0 494.500000 -1883.200000 0 181.700000 -1883.200000 0 181.700000 -1882.500000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 -1883.200000 0 494.500000 -1883.200000 0 494.500000 -1884.000000 0 181.700000 -1884.000000 0 181.700000 -1883.200000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 -1884.000000 0 494.500000 -1884.000000 0 494.500000 -1884.700000 0 181.700000 -1884.700000 0 181.700000 -1884.000000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 -1884.700000 0 494.500000 -1884.700000 0 494.500000 -1885.500000 0 181.700000 -1885.500000 0 181.700000 -1884.700000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 -1885.500000 0 494.500000 -1885.500000 0 494.500000 -1886.300000 0 181.700000 -1886.300000 0 181.700000 -1885.500000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 -1886.300000 0 494.500000 -1886.300000 0 494.500000 -1887.000000 0 181.700000 -1887.000000 0 181.700000 -1886.300000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 -1887.000000 0 494.500000 -1887.000000 0 494.500000 -1887.800000 0 181.700000 -1887.800000 0 181.700000 -1887.000000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 -1887.800000 0 494.500000 -1887.800000 0 494.500000 -1888.500000 0 181.700000 -1888.500000 0 181.700000 -1887.800000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 -1888.500000 0 494.500000 -1888.500000 0 494.500000 -1889.300000 0 181.700000 -1889.300000 0 181.700000 -1888.500000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 -1889.300000 0 494.500000 -1889.300000 0 494.500000 -1890.100000 0 181.700000 -1890.100000 0 181.700000 -1889.300000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 -1890.100000 0 494.500000 -1890.100000 0 494.500000 -1890.800000 0 181.700000 -1890.800000 0 181.700000 -1890.100000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 -1890.800000 0 494.500000 -1890.800000 0 494.500000 -1891.600000 0 181.700000 -1891.600000 0 181.700000 -1890.800000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 -1891.600000 0 494.500000 -1891.600000 0 494.500000 -1892.300000 0 181.700000 -1892.300000 0 181.700000 -1891.600000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 -1892.300000 0 494.500000 -1892.300000 0 494.500000 -1893.100000 0 181.700000 -1893.100000 0 181.700000 -1892.300000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 -1893.100000 0 494.500000 -1893.100000 0 494.500000 -1893.900000 0 181.700000 -1893.900000 0 181.700000 -1893.100000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 -1893.900000 0 494.500000 -1893.900000 0 494.500000 -1894.600000 0 181.700000 -1894.600000 0 181.700000 -1893.900000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 -1894.600000 0 494.500000 -1894.600000 0 494.500000 -1895.400000 0 181.700000 -1895.400000 0 181.700000 -1894.600000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 -1895.400000 0 494.500000 -1895.400000 0 494.500000 -1896.100000 0 181.700000 -1896.100000 0 181.700000 -1895.400000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 -1896.100000 0 494.500000 -1896.100000 0 494.500000 -1896.900000 0 181.700000 -1896.900000 0 181.700000 -1896.100000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 -1896.900000 0 494.500000 -1896.900000 0 494.500000 -1897.600000 0 181.700000 -1897.600000 0 181.700000 -1896.900000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 -1897.600000 0 494.500000 -1897.600000 0 494.500000 -1898.400000 0 181.700000 -1898.400000 0 181.700000 -1897.600000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 -1898.400000 0 494.500000 -1898.400000 0 494.500000 -1899.200000 0 181.700000 -1899.200000 0 181.700000 -1898.400000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 -1899.200000 0 494.500000 -1899.200000 0 494.500000 -1899.900000 0 181.700000 -1899.900000 0 181.700000 -1899.200000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 -1899.900000 0 494.500000 -1899.900000 0 494.500000 -1900.700000 0 181.700000 -1900.700000 0 181.700000 -1899.900000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 -1900.700000 0 494.500000 -1900.700000 0 494.500000 -1901.400000 0 181.700000 -1901.400000 0 181.700000 -1900.700000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 -1901.400000 0 494.500000 -1901.400000 0 494.500000 -1902.200000 0 181.700000 -1902.200000 0 181.700000 -1901.400000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 -1902.200000 0 494.500000 -1902.200000 0 494.500000 -1903.000000 0 181.700000 -1903.000000 0 181.700000 -1902.200000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 -1903.000000 0 494.500000 -1903.000000 0 494.500000 -1903.700000 0 181.700000 -1903.700000 0 181.700000 -1903.000000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 -1903.700000 0 494.500000 -1903.700000 0 494.500000 -1904.500000 0 181.700000 -1904.500000 0 181.700000 -1903.700000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 -1904.500000 0 494.500000 -1904.500000 0 494.500000 -1905.200000 0 181.700000 -1905.200000 0 181.700000 -1904.500000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 -1905.200000 0 494.500000 -1905.200000 0 494.500000 -1906.000000 0 181.700000 -1906.000000 0 181.700000 -1905.200000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 -1906.000000 0 494.500000 -1906.000000 0 494.500000 -1906.800000 0 181.700000 -1906.800000 0 181.700000 -1906.000000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 -1906.800000 0 494.500000 -1906.800000 0 494.500000 -1907.500000 0 181.700000 -1907.500000 0 181.700000 -1906.800000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 -1907.500000 0 494.500000 -1907.500000 0 494.500000 -1908.300000 0 181.700000 -1908.300000 0 181.700000 -1907.500000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 -1908.300000 0 494.500000 -1908.300000 0 494.500000 -1909.000000 0 181.700000 -1909.000000 0 181.700000 -1908.300000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 -1909.000000 0 494.500000 -1909.000000 0 494.500000 -1909.800000 0 181.700000 -1909.800000 0 181.700000 -1909.000000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 -1909.800000 0 494.500000 -1909.800000 0 494.500000 -1910.500000 0 181.700000 -1910.500000 0 181.700000 -1909.800000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 -1910.500000 0 494.500000 -1910.500000 0 494.500000 -1911.300000 0 181.700000 -1911.300000 0 181.700000 -1910.500000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 -1911.300000 0 494.500000 -1911.300000 0 494.500000 -1912.100000 0 181.700000 -1912.100000 0 181.700000 -1911.300000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 -1912.100000 0 494.500000 -1912.100000 0 494.500000 -1912.800000 0 181.700000 -1912.800000 0 181.700000 -1912.100000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 -1912.800000 0 494.500000 -1912.800000 0 494.500000 -1913.600000 0 181.700000 -1913.600000 0 181.700000 -1912.800000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 -1913.600000 0 494.500000 -1913.600000 0 494.500000 -1914.300000 0 181.700000 -1914.300000 0 181.700000 -1913.600000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 -1914.300000 0 494.500000 -1914.300000 0 494.500000 -1915.100000 0 181.700000 -1915.100000 0 181.700000 -1914.300000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 -1915.100000 0 494.500000 -1915.100000 0 494.500000 -1915.900000 0 181.700000 -1915.900000 0 181.700000 -1915.100000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 -1915.900000 0 494.500000 -1915.900000 0 494.500000 -1916.600000 0 181.700000 -1916.600000 0 181.700000 -1915.900000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 -1916.600000 0 494.500000 -1916.600000 0 494.500000 -1917.400000 0 181.700000 -1917.400000 0 181.700000 -1916.600000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 -1917.400000 0 494.500000 -1917.400000 0 494.500000 -1918.100000 0 181.700000 -1918.100000 0 181.700000 -1917.400000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 -1918.100000 0 494.500000 -1918.100000 0 494.500000 -1918.900000 0 181.700000 -1918.900000 0 181.700000 -1918.100000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 -1918.900000 0 494.500000 -1918.900000 0 494.500000 -1919.700000 0 181.700000 -1919.700000 0 181.700000 -1918.900000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 -1919.700000 0 494.500000 -1919.700000 0 494.500000 -1920.400000 0 181.700000 -1920.400000 0 181.700000 -1919.700000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 -1920.400000 0 494.500000 -1920.400000 0 494.500000 -1921.200000 0 181.700000 -1921.200000 0 181.700000 -1920.400000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 -1921.200000 0 494.500000 -1921.200000 0 494.500000 -1921.900000 0 181.700000 -1921.900000 0 181.700000 -1921.200000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 -1921.900000 0 494.500000 -1921.900000 0 494.500000 -1922.700000 0 181.700000 -1922.700000 0 181.700000 -1921.900000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 -1922.700000 0 494.500000 -1922.700000 0 494.500000 -1923.400000 0 181.700000 -1923.400000 0 181.700000 -1922.700000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 -1923.400000 0 494.500000 -1923.400000 0 494.500000 -1924.200000 0 181.700000 -1924.200000 0 181.700000 -1923.400000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 -1924.200000 0 494.500000 -1924.200000 0 494.500000 -1925.000000 0 181.700000 -1925.000000 0 181.700000 -1924.200000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 -1925.000000 0 494.500000 -1925.000000 0 494.500000 -1925.700000 0 181.700000 -1925.700000 0 181.700000 -1925.000000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 -1925.700000 0 494.500000 -1925.700000 0 494.500000 -1926.500000 0 181.700000 -1926.500000 0 181.700000 -1925.700000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 -1926.500000 0 494.500000 -1926.500000 0 494.500000 -1927.200000 0 181.700000 -1927.200000 0 181.700000 -1926.500000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 -1927.200000 0 494.500000 -1927.200000 0 494.500000 -1928.000000 0 181.700000 -1928.000000 0 181.700000 -1927.200000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 -1928.000000 0 494.500000 -1928.000000 0 494.500000 -1928.700000 0 181.700000 -1928.700000 0 181.700000 -1928.000000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 -1928.700000 0 494.500000 -1928.700000 0 494.500000 -1929.500000 0 181.700000 -1929.500000 0 181.700000 -1928.700000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 -1929.500000 0 494.500000 -1929.500000 0 494.500000 -1930.300000 0 181.700000 -1930.300000 0 181.700000 -1929.500000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 -1930.300000 0 494.500000 -1930.300000 0 494.500000 -1931.000000 0 181.700000 -1931.000000 0 181.700000 -1930.300000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 -1931.000000 0 494.500000 -1931.000000 0 494.500000 -1931.800000 0 181.700000 -1931.800000 0 181.700000 -1931.000000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 -1931.800000 0 494.500000 -1931.800000 0 494.500000 -1932.500000 0 181.700000 -1932.500000 0 181.700000 -1931.800000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 -1932.500000 0 494.500000 -1932.500000 0 494.500000 -1933.300000 0 181.700000 -1933.300000 0 181.700000 -1932.500000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 -1933.300000 0 494.500000 -1933.300000 0 494.500000 -1934.100000 0 181.700000 -1934.100000 0 181.700000 -1933.300000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 -1934.100000 0 494.500000 -1934.100000 0 494.500000 -1934.800000 0 181.700000 -1934.800000 0 181.700000 -1934.100000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 -1934.800000 0 494.500000 -1934.800000 0 494.500000 -1935.600000 0 181.700000 -1935.600000 0 181.700000 -1934.800000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 -1935.600000 0 494.500000 -1935.600000 0 494.500000 -1936.300000 0 181.700000 -1936.300000 0 181.700000 -1935.600000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 -1936.300000 0 494.500000 -1936.300000 0 494.500000 -1937.100000 0 181.700000 -1937.100000 0 181.700000 -1936.300000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 -1937.100000 0 494.500000 -1937.100000 0 494.500000 -1937.800000 0 181.700000 -1937.800000 0 181.700000 -1937.100000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 -1937.800000 0 494.500000 -1937.800000 0 494.500000 -1938.600000 0 181.700000 -1938.600000 0 181.700000 -1937.800000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 -1938.600000 0 494.500000 -1938.600000 0 494.500000 -1939.400000 0 181.700000 -1939.400000 0 181.700000 -1938.600000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 -1939.400000 0 494.500000 -1939.400000 0 494.500000 -1940.100000 0 181.700000 -1940.100000 0 181.700000 -1939.400000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 -1940.100000 0 494.500000 -1940.100000 0 494.500000 -1940.900000 0 181.700000 -1940.900000 0 181.700000 -1940.100000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 -1940.900000 0 494.500000 -1940.900000 0 494.500000 -1941.600000 0 181.700000 -1941.600000 0 181.700000 -1940.900000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 -1941.600000 0 494.500000 -1941.600000 0 494.500000 -1942.400000 0 181.700000 -1942.400000 0 181.700000 -1941.600000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 -1942.300000 0 181.800000 -1942.300000 0 181.800000 -1749.000000 0 494.400000 -1749.000000 0 494.400000 -1942.300000 0 338.100000 -1942.300000 0
+strokePath subpath 1 338.100000 -1942.300000 0 181.800000 -1942.300000 0 181.800000 -1749.000000 0 494.400000 -1749.000000 0 494.400000 -1942.300000 0 338.100000 -1942.300000 0
+saveState
+updateCtm 11410.000000 0.000000 0.000000 -8760.000000 20530.000000 265830.000000
+drawSoftMaskedImage 1142 877 1142 877 JPEG 70955 PPM 3004618
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 -1903.276000 215.488000 -1911.276000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 -1903.276000 220.592000 -1911.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 -1903.276000 225.696000 -1911.276000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 -1903.276000 230.800000 -1911.276000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 -1910.876000 241.388000 -1918.876000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 -1910.876000 246.492000 -1918.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 -1910.876000 251.596000 -1918.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 -1910.876000 256.700000 -1918.876000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 -1918.576000 267.188000 -1926.576000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 -1918.576000 272.292000 -1926.576000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 -1918.576000 277.396000 -1926.576000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 -1918.576000 282.500000 -1926.576000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 -1926.176000 293.088000 -1934.176000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 -1926.176000 298.192000 -1934.176000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 -1926.176000 303.296000 -1934.176000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 -1926.176000 308.400000 -1934.176000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 -1888.376000 202.588000 -1896.376000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 -1868.976000 201.688000 -1876.976000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 -1849.676000 195.788000 -1857.676000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 -1849.676000 200.892000 -1857.676000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 -1830.376000 194.888000 -1838.376000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 -1830.376000 199.992000 -1838.376000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 -1811.076000 193.988000 -1819.076000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 -1811.076000 199.092000 -1819.076000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 -1791.676000 193.088000 -1799.676000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 -1791.676000 198.192000 -1799.676000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 -1919.576000 330.188000 -1927.576000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 -1919.576000 332.716000 -1927.576000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 -1919.576000 337.596000 -1927.576000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 -1919.576000 341.396000 -1927.576000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 -1919.576000 346.036000 -1927.576000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 -1919.576000 350.900000 -1927.576000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 -1919.576000 355.972000 -1927.576000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 -1919.576000 359.196000 -1927.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 -1919.576000 362.196000 -1927.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 -1919.576000 367.404000 -1927.576000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 -1919.576000 371.876000 -1927.576000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 -1919.576000 375.052000 -1927.576000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 -1900.076000 361.172000 -1908.076000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 -1900.076000 364.340000 -1908.076000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 -1900.076000 367.396000 -1908.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 -1900.076000 372.604000 -1908.076000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 -1900.076000 379.348000 -1908.076000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 -1900.076000 384.484000 -1908.076000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 -1900.076000 389.436000 -1908.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 -1900.076000 392.108000 -1908.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 -1900.076000 395.708000 -1908.076000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 -1900.076000 397.540000 -1908.076000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 -1900.076000 402.444000 -1908.076000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 -1900.076000 406.788000 -1908.076000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 -1880.576000 392.972000 -1888.576000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 -1880.576000 398.076000 -1888.576000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 -1880.576000 403.180000 -1888.576000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 -1880.576000 405.428000 -1888.576000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 -1880.576000 410.332000 -1888.576000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 -1880.576000 414.476000 -1888.576000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 -1753.008000 305.808000 -1767.008000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 -1753.008000 314.138000 -1767.008000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 -1753.008000 320.788000 -1767.008000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 -1753.008000 328.698000 -1767.008000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 -1753.008000 336.972000 -1767.008000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 -1753.008000 344.182000 -1767.008000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 -1753.008000 349.810000 -1767.008000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 -1753.008000 354.234000 -1767.008000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 -1753.008000 362.718000 -1767.008000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 -1753.008000 367.870000 -1767.008000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 -1753.008000 372.322000 -1767.008000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 -1753.008000 382.080000 -1767.008000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 -1753.008000 388.772000 -1767.008000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 -1753.008000 397.802000 -1767.008000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 -1753.008000 402.254000 -1767.008000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 -1753.008000 407.896000 -1767.008000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 -1875.900000 0 424.300000 -1875.900000 0 424.300000 -1815.100000 0 493.600000 -1815.100000 0 493.600000 -1875.900000 0 458.900000 -1875.900000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 -1824.700000 0 428.900000 -1824.700000 0 428.900000 -1818.800000 0 434.800000 -1818.800000 0 434.800000 -1824.700000 0 431.900000 -1824.700000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 -1835.800000 0 428.900000 -1835.800000 0 428.900000 -1829.800000 0 434.800000 -1829.800000 0 434.800000 -1835.800000 0 431.900000 -1835.800000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 -1846.900000 0 428.900000 -1846.900000 0 428.900000 -1840.900000 0 434.800000 -1840.900000 0 434.800000 -1846.900000 0 431.900000 -1846.900000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 -1858.000000 0 428.900000 -1858.000000 0 428.900000 -1852.000000 0 434.800000 -1852.000000 0 434.800000 -1858.000000 0 431.900000 -1858.000000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 -1869.100000 0 428.900000 -1869.100000 0 428.900000 -1863.100000 0 434.800000 -1863.100000 0 434.800000 -1869.100000 0 431.900000 -1869.100000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -1817.676000 443.288000 -1825.676000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 -1817.676000 445.816000 -1825.676000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 -1817.676000 450.600000 -1825.676000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 -1817.676000 454.496000 -1825.676000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 -1817.676000 459.136000 -1825.676000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 -1817.676000 464.000000 -1825.676000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 -1817.676000 468.976000 -1825.676000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 -1817.676000 472.304000 -1825.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 -1817.676000 475.208000 -1825.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 -1817.676000 480.520000 -1825.676000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 -1817.676000 484.992000 -1825.676000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 -1817.676000 488.168000 -1825.676000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -1828.676000 443.352000 -1836.676000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 -1828.676000 447.920000 -1836.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 -1828.676000 452.976000 -1836.676000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 -1828.676000 457.400000 -1836.676000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 -1828.676000 462.472000 -1836.676000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 -1828.676000 465.800000 -1836.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 -1828.676000 468.904000 -1836.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 -1828.676000 473.816000 -1836.676000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 -1828.676000 478.888000 -1836.676000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 -1828.676000 482.064000 -1836.676000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -1839.776000 442.872000 -1847.776000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 -1839.776000 446.040000 -1847.776000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 -1839.776000 448.992000 -1847.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 -1839.776000 454.304000 -1847.776000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 -1839.776000 461.048000 -1847.776000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 -1839.776000 466.184000 -1847.776000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 -1839.776000 471.136000 -1847.776000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 -1839.776000 473.808000 -1847.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 -1839.776000 477.408000 -1847.776000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 -1839.776000 479.240000 -1847.776000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 -1839.776000 484.144000 -1847.776000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 -1839.776000 488.488000 -1847.776000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -1850.876000 443.384000 -1858.876000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 -1850.876000 448.464000 -1858.876000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 -1850.876000 453.424000 -1858.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 -1850.876000 456.696000 -1858.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 -1850.876000 459.800000 -1858.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 -1850.876000 462.032000 -1858.876000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 -1850.876000 466.936000 -1858.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 -1850.876000 471.080000 -1858.876000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -1861.976000 443.272000 -1869.976000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 -1861.976000 448.376000 -1869.976000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 -1861.976000 453.480000 -1869.976000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 -1861.976000 455.728000 -1869.976000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 -1861.976000 460.632000 -1869.976000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 -1861.976000 464.776000 -1869.976000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -4507.000000 0 114.800000 -4507.000000 0 114.800000 -4464.200000 0 72.000000 -4464.200000 0 72.000000 -4507.000000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 529890.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 546.200000 0 504.000000 546.200000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 546.200000 0
+eoFillPath subpath 1 72.000000 72.000000 0 504.000000 72.000000 0 504.000000 245.800000 0 72.000000 245.800000 0 72.000000 72.000000 0
+eoFillPath subpath 1 72.000000 245.800000 0 121.400000 245.800000 0 121.400000 546.200000 0 72.000000 546.200000 0 72.000000 245.800000 0
+eoFillPath subpath 1 454.500000 245.800000 0 504.000000 245.800000 0 504.000000 546.200000 0 454.500000 546.200000 0 454.500000 245.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 72.000000 701.300000 0 504.000000 701.300000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 701.300000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 72.000000 654.200000 0 291.400000 654.200000 0 291.400000 672.900000 0 72.000000 672.900000 0 72.000000 654.200000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 72.000000 72.200000 0 504.000000 72.200000 0 504.000000 86.100000 0 72.000000 86.100000 0 72.000000 72.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 322.800000 719.948000 336.592000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 336.608000 719.948000 346.064000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 346.112000 719.948000 351.184000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 351.216000 719.948000 363.232000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 363.216000 719.948000 372.992000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 373.024000 719.948000 383.152000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 383.120000 719.948000 391.440000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 391.424000 719.948000 401.264000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 401.232000 719.948000 406.304000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 406.336000 719.948000 412.096000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 412.144000 719.948000 417.216000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 417.200000 719.948000 430.992000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 431.008000 719.948000 440.464000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 440.512000 719.948000 445.584000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 445.616000 719.948000 458.000000 703.948000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 458.016000 719.948000 467.808000 703.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 467.824000 719.948000 474.400000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.128000 719.948000 484.272000 703.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 484.336000 719.948000 494.176000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 494.144000 719.948000 504.272000 703.948000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 672.848000 88.020000 656.848000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 88.004000 672.848000 98.420000 656.848000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.404000 672.848000 103.972000 656.848000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.004000 672.848000 117.124000 656.848000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 117.108000 672.848000 127.892000 656.848000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 127.908000 672.848000 135.796000 656.848000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.812000 672.848000 147.252000 656.848000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 147.316000 672.848000 158.164000 656.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 158.212000 672.848000 169.588000 656.848000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 648.336000 193.492000 636.336000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 193.504000 648.336000 201.232000 636.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 201.208000 648.336000 208.300000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 208.312000 648.336000 212.116000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 212.416000 648.336000 220.096000 636.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 220.120000 648.336000 227.272000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 227.224000 648.336000 232.960000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 233.020000 648.336000 240.700000 636.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 240.724000 648.336000 247.816000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 247.828000 648.336000 255.556000 636.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 255.724000 648.336000 259.528000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 259.720000 648.336000 267.400000 636.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 267.424000 648.336000 274.648000 636.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 274.720000 648.336000 281.812000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 281.824000 648.336000 287.980000 636.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 288.028000 648.336000 291.832000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 292.024000 648.336000 299.752000 636.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 299.728000 648.336000 306.952000 636.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 307.024000 648.336000 311.836000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 312.028000 648.336000 315.832000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 316.024000 648.336000 323.176000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 323.224000 648.336000 330.904000 636.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 330.820000 648.336000 338.500000 636.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 338.524000 648.336000 345.616000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 345.628000 648.336000 352.780000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 352.828000 648.336000 358.564000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.624000 648.336000 362.428000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 362.620000 648.336000 369.772000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 369.820000 648.336000 374.632000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 374.824000 648.336000 378.628000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 379.024000 648.336000 387.016000 636.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 386.824000 648.336000 392.560000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.524000 648.336000 398.680000 636.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 398.728000 648.336000 403.540000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 403.732000 648.336000 407.536000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 407.728000 648.336000 413.884000 636.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 413.932000 648.336000 417.760000 636.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 417.736000 648.336000 425.416000 636.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 425.332000 648.336000 433.060000 636.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 433.036000 648.336000 437.848000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 438.136000 648.336000 441.940000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 442.132000 648.336000 446.944000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 446.932000 648.336000 454.156000 636.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 454.336000 648.336000 458.140000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 458.332000 648.336000 466.012000 636.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.036000 648.336000 473.128000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 473.332000 648.336000 477.136000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 477.328000 648.336000 484.096000 636.336000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 484.024000 648.336000 491.116000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 491.224000 648.336000 496.960000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 496.924000 648.336000 503.692000 636.336000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 648.336000 508.004000 636.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 634.436000 193.180000 622.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 193.204000 634.436000 197.032000 622.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 197.008000 634.436000 204.688000 622.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 204.712000 634.436000 208.516000 622.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.208000 634.436000 214.012000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 215.704000 634.436000 224.512000 622.436000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 224.500000 634.436000 232.228000 622.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 232.204000 634.436000 237.016000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 238.804000 634.436000 242.608000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 244.408000 634.436000 251.560000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 251.608000 634.436000 255.436000 622.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 255.412000 634.436000 260.224000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 260.212000 634.436000 267.940000 622.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 267.916000 634.436000 275.140000 622.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 275.212000 634.436000 282.940000 622.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 282.916000 634.436000 290.596000 622.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 290.620000 634.436000 298.348000 622.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 300.016000 634.436000 303.820000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 305.512000 634.436000 310.324000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 310.408000 634.436000 318.136000 622.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 318.112000 634.436000 325.204000 622.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 326.908000 634.436000 330.712000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 332.512000 634.436000 339.664000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 339.712000 634.436000 346.432000 622.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 346.408000 634.436000 351.220000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 351.208000 634.436000 358.936000 622.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 358.912000 634.436000 366.064000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.112000 634.436000 369.940000 622.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 371.608000 634.436000 375.412000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.104000 634.436000 383.872000 622.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 383.908000 634.436000 391.000000 622.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 391.012000 634.436000 398.692000 622.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 398.716000 634.436000 405.808000 622.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 405.820000 634.436000 410.632000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 410.620000 634.436000 417.772000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 417.724000 634.436000 425.404000 622.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 425.524000 634.436000 429.352000 622.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 429.328000 634.436000 436.420000 622.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 438.124000 634.436000 441.928000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 443.728000 634.436000 451.408000 622.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 451.432000 634.436000 458.584000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 458.536000 634.436000 464.272000 622.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 464.332000 634.436000 472.012000 622.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 472.036000 634.436000 479.128000 622.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 479.140000 634.436000 486.868000 622.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 488.536000 634.436000 492.340000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 494.032000 634.436000 497.860000 622.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 497.836000 634.436000 503.992000 622.436000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 634.436000 507.904000 622.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 620.536000 193.180000 608.536000 1.000000 0.000000 0.000000 1.000000 q
+drawChar 193.204000 620.536000 200.932000 608.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 200.908000 620.536000 204.736000 608.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 204.712000 620.536000 209.524000 608.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 209.608000 620.536000 216.700000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 217.012000 620.536000 220.816000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 221.212000 620.536000 227.368000 608.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.416000 620.536000 238.792000 608.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 238.720000 620.536000 245.872000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 245.920000 620.536000 249.748000 608.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 249.724000 620.536000 253.552000 608.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 253.624000 620.536000 257.428000 608.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 257.824000 620.536000 261.628000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.024000 620.536000 265.852000 608.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 265.828000 620.536000 270.640000 608.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 270.724000 620.536000 274.012000 608.536000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 274.024000 620.536000 280.180000 608.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 280.420000 620.536000 284.224000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 284.620000 620.536000 291.772000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 291.820000 620.536000 303.196000 608.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 303.124000 620.536000 310.276000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 310.324000 620.536000 316.636000 608.536000 1.000000 0.000000 0.000000 1.000000 z
+drawChar 316.624000 620.536000 320.452000 608.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 320.428000 620.536000 328.156000 608.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 328.228000 620.536000 335.908000 608.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 336.328000 620.536000 340.132000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 340.528000 620.536000 348.256000 608.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 348.232000 620.536000 355.456000 608.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 355.528000 620.536000 365.788000 608.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 366.028000 620.536000 369.832000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.228000 620.536000 381.604000 608.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 381.628000 620.536000 389.356000 608.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 389.332000 620.536000 396.052000 608.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 396.028000 620.536000 403.756000 608.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 404.224000 620.536000 408.028000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 408.424000 620.536000 413.164000 608.536000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 413.128000 620.536000 416.416000 608.536000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 416.428000 620.536000 427.804000 608.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 428.128000 620.536000 431.932000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 432.328000 620.536000 439.480000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 439.528000 620.536000 447.208000 608.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 447.124000 620.536000 450.952000 608.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 451.024000 620.536000 458.116000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 458.524000 620.536000 462.328000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 462.724000 620.536000 467.536000 608.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 467.524000 620.536000 474.748000 608.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 475.120000 620.536000 478.924000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 479.320000 620.536000 487.000000 608.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 487.024000 620.536000 492.760000 608.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 492.724000 620.536000 499.948000 608.536000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 620.536000 504.044000 608.536000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 606.636000 193.180000 594.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 193.204000 606.636000 200.932000 594.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 200.908000 606.636000 207.628000 594.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 207.604000 606.636000 214.696000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 215.008000 606.636000 218.812000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 219.208000 606.636000 223.648000 594.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 223.612000 606.636000 229.348000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 229.408000 606.636000 236.632000 594.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 236.608000 606.636000 247.984000 594.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 248.308000 606.636000 252.112000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 252.508000 606.636000 256.336000 594.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 256.312000 606.636000 261.124000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 261.208000 606.636000 265.012000 594.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.312000 606.636000 269.116000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 269.512000 606.636000 277.828000 594.636000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 277.816000 606.636000 285.544000 594.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 285.616000 606.636000 291.352000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 291.316000 606.636000 296.128000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 296.116000 606.636000 303.844000 594.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 303.820000 606.636000 310.912000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 310.924000 606.636000 316.660000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 316.720000 606.636000 328.096000 594.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 328.120000 606.636000 335.344000 594.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 335.320000 606.636000 341.056000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 341.116000 606.636000 348.208000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 348.220000 606.636000 352.024000 594.636000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 352.324000 606.636000 356.128000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 356.524000 606.636000 361.336000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 361.324000 606.636000 369.052000 594.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 369.124000 606.636000 376.216000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 376.228000 606.636000 381.964000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 381.928000 606.636000 389.020000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 389.332000 606.636000 393.136000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 393.532000 606.636000 400.684000 594.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 400.732000 606.636000 406.468000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 406.432000 606.636000 413.524000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 413.836000 606.636000 417.640000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 418.036000 606.636000 422.476000 594.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 422.440000 606.636000 428.176000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 428.236000 606.636000 435.964000 594.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 435.940000 606.636000 439.768000 594.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 439.744000 606.636000 444.556000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 444.940000 606.636000 448.744000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 449.140000 606.636000 453.952000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 453.940000 606.636000 459.676000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.736000 606.636000 466.828000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.840000 606.636000 473.932000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 473.944000 606.636000 480.100000 594.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 480.340000 606.636000 484.144000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.540000 606.636000 488.368000 594.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 488.344000 606.636000 492.172000 594.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 492.244000 606.636000 499.972000 594.636000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 606.636000 504.044000 594.636000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 592.736000 189.328000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 189.304000 592.736000 197.032000 580.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 197.104000 592.736000 204.784000 580.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 204.700000 592.736000 208.504000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 208.600000 592.736000 213.412000 580.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 213.400000 592.736000 221.128000 580.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 221.200000 592.736000 228.292000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 228.304000 592.736000 232.108000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 232.108000 592.736000 239.200000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 239.212000 592.736000 246.892000 580.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 246.916000 592.736000 254.596000 580.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 254.620000 592.736000 261.712000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 261.724000 592.736000 265.528000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 265.624000 592.736000 272.848000 580.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 272.728000 592.736000 277.168000 580.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 277.132000 592.736000 280.936000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 281.128000 592.736000 285.940000 580.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 285.928000 592.736000 293.656000 580.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 293.728000 592.736000 300.820000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 300.832000 592.736000 304.636000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 304.636000 592.736000 312.316000 580.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 312.232000 592.736000 319.384000 580.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 319.432000 592.736000 326.152000 580.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 326.128000 592.736000 333.388000 580.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 333.328000 592.736000 340.096000 580.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 340.132000 592.736000 347.284000 580.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 347.332000 592.736000 353.068000 580.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 353.128000 592.736000 360.808000 580.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 360.724000 592.736000 364.528000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 364.720000 592.736000 374.980000 580.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 375.016000 592.736000 382.744000 580.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 382.720000 592.736000 386.548000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 386.524000 592.736000 393.244000 580.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 393.328000 592.736000 401.056000 580.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 400.924000 592.736000 404.728000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 404.824000 592.736000 412.504000 580.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 412.420000 592.736000 418.156000 580.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 418.216000 592.736000 425.440000 580.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 425.416000 592.736000 432.184000 580.736000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 432.220000 592.736000 436.048000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 436.024000 592.736000 443.704000 580.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 443.728000 592.736000 450.820000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 450.832000 592.736000 454.636000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.732000 592.736000 466.108000 580.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 466.036000 592.736000 473.128000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 473.140000 592.736000 476.944000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 477.040000 592.736000 487.300000 580.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 487.336000 592.736000 491.164000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 491.140000 592.736000 495.952000 580.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 495.940000 592.736000 503.668000 580.736000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 592.736000 507.904000 580.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 578.836000 189.940000 566.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 189.904000 578.836000 195.640000 566.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 195.604000 578.836000 202.696000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 202.708000 578.836000 208.864000 566.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 208.912000 578.836000 216.640000 566.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 216.616000 578.836000 220.420000 566.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 220.500000 578.836000 227.652000 566.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 227.700000 578.836000 235.380000 566.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 235.404000 578.836000 243.084000 566.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 243.108000 578.836000 246.936000 566.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 246.912000 578.836000 254.004000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 254.016000 578.836000 260.172000 566.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 260.100000 578.836000 263.904000 566.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 263.904000 578.836000 267.708000 566.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 267.700000 578.836000 275.380000 566.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 275.404000 578.836000 282.496000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 282.508000 578.836000 289.660000 566.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 289.708000 578.836000 295.444000 566.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 295.408000 578.836000 301.564000 566.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 301.500000 578.836000 305.304000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 305.304000 578.836000 312.456000 566.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 312.504000 578.836000 320.232000 566.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 320.208000 578.836000 327.888000 566.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 327.912000 578.836000 331.716000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 331.716000 578.836000 338.808000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 338.820000 578.836000 345.588000 566.836000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 345.624000 578.836000 352.716000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 352.728000 578.836000 360.456000 566.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 360.432000 578.836000 364.236000 566.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 364.200000 578.836000 370.920000 566.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 370.896000 578.836000 378.624000 566.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 378.600000 578.836000 385.692000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 385.704000 578.836000 391.440000 566.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 391.404000 578.836000 397.140000 566.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 397.104000 578.836000 400.932000 566.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 400.908000 578.836000 408.000000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 408.012000 578.836000 414.168000 566.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 414.300000 578.836000 418.104000 566.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 541.048000 85.476000 525.048000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 85.508000 541.048000 96.356000 525.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 96.404000 541.048000 104.292000 525.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 104.308000 541.048000 115.748000 525.048000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 115.812000 541.048000 121.380000 525.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.412000 541.048000 132.852000 525.048000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 132.916000 541.048000 143.700000 525.048000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 143.716000 541.048000 151.604000 525.048000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.620000 541.048000 163.060000 525.048000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 163.124000 541.048000 173.972000 525.048000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 174.020000 541.048000 185.396000 525.048000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 516.436000 193.492000 504.436000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 192.604000 516.436000 199.696000 504.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 199.708000 516.436000 207.436000 504.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 207.412000 516.436000 215.092000 504.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 215.116000 516.436000 218.944000 504.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 218.920000 516.436000 226.648000 504.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 226.720000 516.436000 234.400000 504.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 235.624000 516.436000 239.428000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 240.724000 516.436000 245.536000 504.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 245.620000 516.436000 252.844000 504.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 254.116000 516.436000 257.920000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 259.216000 516.436000 264.028000 504.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 264.016000 516.436000 271.744000 504.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 271.816000 516.436000 278.908000 504.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 280.216000 516.436000 284.020000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 285.316000 516.436000 293.044000 504.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 293.020000 516.436000 300.112000 504.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 300.124000 516.436000 305.860000 504.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 305.920000 516.436000 313.600000 504.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 314.824000 516.436000 318.628000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 319.924000 516.436000 327.604000 504.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 327.628000 516.436000 334.780000 504.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 334.732000 516.436000 340.468000 504.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 340.528000 516.436000 348.208000 504.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 348.232000 516.436000 355.324000 504.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 355.336000 516.436000 363.064000 504.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 364.336000 516.436000 368.140000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 369.436000 516.436000 373.264000 504.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 373.240000 516.436000 379.396000 504.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 380.740000 516.436000 384.544000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 385.840000 516.436000 393.064000 504.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 393.136000 516.436000 400.864000 504.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 400.840000 516.436000 407.932000 504.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 409.240000 516.436000 413.044000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 414.340000 516.436000 421.564000 504.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 421.540000 516.436000 425.980000 504.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 427.336000 516.436000 431.140000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 432.436000 516.436000 443.812000 504.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 443.836000 516.436000 450.604000 504.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 451.936000 516.436000 455.740000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 457.036000 516.436000 461.476000 504.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 461.440000 516.436000 468.592000 504.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 468.640000 516.436000 475.408000 504.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 475.444000 516.436000 482.668000 504.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 482.644000 516.436000 488.380000 504.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 488.344000 516.436000 492.172000 504.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 492.244000 516.436000 497.056000 504.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 497.044000 516.436000 504.136000 504.436000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 516.436000 507.904000 504.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 502.536000 193.228000 490.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 193.204000 502.536000 200.428000 490.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 200.500000 502.536000 208.180000 490.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 208.096000 502.536000 215.776000 490.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 215.800000 502.536000 219.628000 490.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 219.700000 502.536000 226.792000 490.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 226.804000 502.536000 232.960000 490.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 232.900000 502.536000 236.704000 490.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 236.704000 502.536000 240.508000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 240.808000 502.536000 245.548000 490.536000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 245.608000 502.536000 250.420000 490.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 250.504000 502.536000 254.308000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 254.500000 502.536000 258.328000 490.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 258.304000 502.536000 264.460000 490.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 264.604000 502.536000 268.408000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 268.600000 502.536000 274.756000 490.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 274.804000 502.536000 278.632000 490.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 278.608000 502.536000 283.420000 490.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 283.408000 502.536000 291.136000 490.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 291.112000 502.536000 298.264000 490.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 298.312000 502.536000 303.124000 490.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 303.208000 502.536000 310.300000 490.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 310.312000 502.536000 317.992000 490.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 318.016000 502.536000 321.820000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 322.120000 502.536000 329.848000 490.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 329.824000 502.536000 336.916000 490.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 336.928000 502.536000 344.080000 490.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 344.032000 502.536000 349.768000 490.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 349.936000 502.536000 353.740000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 353.932000 502.536000 358.744000 490.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 358.732000 502.536000 366.460000 490.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 366.532000 502.536000 373.624000 490.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 373.636000 502.536000 377.440000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.740000 502.536000 382.552000 490.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 382.540000 502.536000 389.632000 490.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 389.644000 502.536000 395.380000 490.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.344000 502.536000 401.080000 490.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 401.140000 502.536000 408.292000 490.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 408.244000 502.536000 414.964000 490.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 414.940000 502.536000 422.032000 490.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 422.044000 502.536000 425.848000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 426.244000 502.536000 430.072000 490.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 430.048000 502.536000 437.140000 490.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 437.152000 502.536000 444.304000 490.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 444.352000 502.536000 452.032000 490.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 451.948000 502.536000 455.776000 490.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 455.848000 502.536000 463.576000 490.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 463.552000 502.536000 471.232000 490.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 471.352000 502.536000 475.156000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 475.348000 502.536000 479.788000 490.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 479.752000 502.536000 485.488000 490.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 485.548000 502.536000 492.772000 490.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 492.748000 502.536000 504.124000 490.536000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 502.536000 507.904000 490.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 488.636000 190.312000 476.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 488.636000 198.028000 476.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.100000 488.636000 205.192000 476.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 207.496000 488.636000 211.300000 476.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 213.700000 488.636000 220.960000 476.636000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 220.900000 488.636000 224.728000 476.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 224.800000 488.636000 229.612000 476.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 229.600000 488.636000 236.320000 476.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 236.296000 488.636000 244.024000 476.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 244.000000 488.636000 251.092000 476.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 251.200000 488.636000 258.928000 476.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 259.000000 488.636000 262.804000 476.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.096000 488.636000 268.900000 476.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 271.300000 488.636000 276.040000 476.636000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 278.296000 488.636000 282.100000 476.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 284.596000 488.636000 292.324000 476.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 292.300000 488.636000 299.452000 476.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 299.404000 488.636000 306.172000 476.636000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 306.304000 488.636000 313.396000 476.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 318.100000 488.636000 321.904000 476.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 321.900000 488.636000 329.580000 476.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 329.604000 488.636000 336.756000 476.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 336.708000 488.636000 342.864000 476.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 342.912000 488.636000 346.740000 476.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 346.716000 488.636000 350.544000 476.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 351.516000 488.636000 355.320000 476.636000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 359.112000 488.636000 362.916000 476.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 363.000000 488.636000 368.736000 476.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 368.700000 488.636000 375.924000 476.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 375.996000 488.636000 382.152000 476.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 382.092000 488.636000 389.184000 476.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 389.196000 488.636000 400.572000 476.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 400.596000 488.636000 407.748000 476.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 407.796000 488.636000 413.532000 476.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 413.496000 488.636000 420.264000 476.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 419.292000 488.636000 423.096000 476.636000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 427.296000 488.636000 431.100000 476.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 431.000000 488.636000 435.812000 476.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 435.800000 488.636000 443.528000 476.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 443.600000 488.636000 450.368000 476.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 450.296000 488.636000 461.672000 476.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 461.696000 488.636000 468.788000 476.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 469.700000 488.636000 473.504000 476.636000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 477.296000 488.636000 481.100000 476.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 481.200000 488.636000 488.880000 476.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 488.904000 488.636000 492.732000 476.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 492.708000 488.636000 496.536000 476.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 496.512000 488.636000 500.340000 476.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 500.316000 488.636000 504.120000 476.636000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 488.636000 508.004000 476.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 474.736000 192.724000 462.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 192.700000 474.736000 198.436000 462.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 198.496000 474.736000 205.588000 462.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 205.600000 474.736000 213.280000 462.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 213.196000 474.736000 220.348000 462.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 220.396000 474.736000 228.124000 462.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 228.100000 474.736000 235.324000 462.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 236.500000 474.736000 240.304000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 241.396000 474.736000 248.548000 462.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 248.596000 474.736000 256.324000 462.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 256.192000 474.736000 263.872000 462.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 264.988000 474.736000 268.792000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 269.884000 474.736000 281.260000 462.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 281.284000 474.736000 288.436000 462.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 288.388000 474.736000 296.116000 462.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 296.188000 474.736000 302.956000 462.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 304.084000 474.736000 307.888000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 308.980000 474.736000 320.356000 462.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 320.380000 474.736000 327.604000 462.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 327.580000 474.736000 333.316000 462.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 333.280000 474.736000 340.372000 462.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 341.476000 474.736000 345.280000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 346.480000 474.736000 356.740000 462.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 356.776000 474.736000 364.000000 462.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 363.976000 474.736000 371.704000 462.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.680000 474.736000 379.360000 462.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 379.384000 474.736000 386.476000 462.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 386.488000 474.736000 392.224000 462.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.188000 474.736000 396.628000 462.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 396.592000 474.736000 404.320000 462.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 404.296000 474.736000 408.124000 462.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 410.392000 474.736000 414.196000 462.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 414.200000 474.736000 420.356000 462.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 420.404000 474.736000 428.084000 462.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 428.000000 474.736000 431.828000 462.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 431.900000 474.736000 438.620000 462.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 438.596000 474.736000 445.688000 462.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 445.700000 474.736000 451.856000 462.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 452.996000 474.736000 456.800000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 457.892000 474.736000 465.620000 462.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 465.596000 474.736000 471.752000 462.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 471.800000 474.736000 478.892000 462.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 478.904000 474.736000 486.584000 462.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 487.604000 474.736000 491.408000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 492.608000 474.736000 496.436000 462.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 496.412000 474.736000 504.140000 462.736000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 474.736000 507.904000 462.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 460.836000 192.220000 448.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 192.196000 460.836000 199.420000 448.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 199.396000 460.836000 206.620000 448.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 206.692000 460.836000 213.952000 448.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 213.892000 460.836000 217.720000 448.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 217.792000 460.836000 225.520000 448.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 225.496000 460.836000 233.176000 448.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 234.496000 460.836000 238.300000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 239.692000 460.836000 246.844000 448.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 246.892000 460.836000 254.620000 448.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 254.596000 460.836000 262.276000 448.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 263.692000 460.836000 267.496000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 268.888000 460.836000 276.568000 448.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 276.592000 460.836000 283.744000 448.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 283.696000 460.836000 290.956000 448.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 290.992000 460.836000 294.820000 448.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 294.796000 460.836000 302.524000 448.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 302.596000 460.836000 310.276000 448.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 310.300000 460.836000 314.104000 448.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 315.400000 460.836000 319.204000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 320.596000 460.836000 325.336000 448.836000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 326.692000 460.836000 330.496000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 331.888000 460.836000 339.040000 448.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 339.088000 460.836000 342.916000 448.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 342.892000 460.836000 346.720000 448.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 346.696000 460.836000 353.920000 448.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 353.992000 460.836000 364.252000 448.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 365.488000 460.836000 369.292000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.792000 460.836000 375.604000 448.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 375.592000 460.836000 383.320000 448.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 383.392000 460.836000 390.484000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 390.496000 460.836000 396.652000 448.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 396.592000 460.836000 403.684000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 405.088000 460.836000 408.892000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 410.284000 460.836000 417.964000 448.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 417.988000 460.836000 421.816000 448.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 421.792000 460.836000 428.944000 448.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 428.992000 460.836000 436.720000 448.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 436.696000 460.836000 441.508000 448.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 441.496000 460.836000 447.652000 448.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 448.996000 460.836000 452.800000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.192000 460.836000 459.004000 448.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 458.992000 460.836000 466.216000 448.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 467.596000 460.836000 471.400000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 472.792000 460.836000 480.472000 448.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 480.496000 460.836000 486.232000 448.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 486.292000 460.836000 493.516000 448.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 493.492000 460.836000 503.752000 448.836000 1.000000 0.000000 0.000000 1.000000 w
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 460.836000 507.904000 448.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 446.936000 195.760000 434.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 195.796000 446.936000 199.624000 434.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 199.600000 446.936000 203.428000 434.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 203.404000 446.936000 211.084000 434.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 213.208000 446.936000 217.012000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 219.112000 446.936000 226.264000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 226.312000 446.936000 234.040000 434.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 234.016000 446.936000 241.696000 434.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 243.820000 446.936000 247.624000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 249.724000 446.936000 254.464000 434.936000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 256.624000 446.936000 260.428000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.528000 446.936000 269.620000 434.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 269.632000 446.936000 275.788000 434.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 275.836000 446.936000 283.516000 434.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 283.432000 446.936000 290.524000 434.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 290.536000 446.936000 297.256000 434.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 297.340000 446.936000 301.168000 434.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 301.144000 446.936000 308.296000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 308.344000 446.936000 312.172000 434.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 312.148000 446.936000 315.976000 434.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 315.952000 446.936000 322.720000 434.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 324.856000 446.936000 328.660000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 330.760000 446.936000 334.588000 434.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 334.564000 446.936000 338.392000 434.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 338.464000 446.936000 345.724000 434.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 345.664000 446.936000 352.756000 434.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 354.964000 446.936000 358.768000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 360.868000 446.936000 365.680000 434.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 365.668000 446.936000 373.396000 434.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 373.468000 446.936000 380.560000 434.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 382.564000 446.936000 386.368000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 388.468000 446.936000 392.296000 434.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 392.272000 446.936000 399.496000 434.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 399.568000 446.936000 406.792000 434.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 406.768000 446.936000 414.028000 434.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 416.164000 446.936000 419.968000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 422.068000 446.936000 429.292000 434.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 429.268000 446.936000 433.708000 434.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 435.868000 446.936000 439.672000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 441.772000 446.936000 446.584000 434.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 446.572000 446.936000 454.300000 434.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 454.372000 446.936000 461.464000 434.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 463.468000 446.936000 467.272000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 469.468000 446.936000 477.196000 434.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 477.172000 446.936000 484.264000 434.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.276000 446.936000 490.012000 434.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 490.072000 446.936000 497.752000 434.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 497.668000 446.936000 503.824000 434.936000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 446.936000 507.904000 434.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 433.036000 191.656000 421.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 433.036000 199.384000 421.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 199.300000 433.036000 205.036000 421.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 205.096000 433.036000 212.320000 421.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 212.296000 433.036000 220.024000 421.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 220.000000 433.036000 224.812000 421.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 224.896000 433.036000 228.724000 421.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 228.700000 433.036000 236.428000 421.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 236.404000 433.036000 244.084000 421.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 247.108000 433.036000 250.912000 421.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 253.912000 433.036000 261.640000 421.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 261.616000 433.036000 269.296000 421.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 272.320000 433.036000 276.124000 421.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.124000 433.036000 286.804000 421.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 286.828000 433.036000 293.920000 421.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 293.932000 433.036000 298.744000 421.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 298.732000 433.036000 308.992000 421.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 309.028000 433.036000 316.120000 421.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 316.132000 433.036000 323.224000 421.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 323.236000 433.036000 330.964000 421.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 333.940000 433.036000 337.744000 421.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 340.840000 433.036000 346.576000 421.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 346.540000 433.036000 353.764000 421.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 353.740000 433.036000 360.460000 421.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 360.436000 433.036000 367.696000 421.036000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 367.732000 433.036000 373.888000 421.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 376.936000 433.036000 380.740000 421.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 383.740000 433.036000 390.892000 421.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 390.844000 433.036000 398.572000 421.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 398.644000 433.036000 406.324000 421.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 409.348000 433.036000 413.152000 421.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 416.152000 433.036000 423.880000 421.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 423.856000 433.036000 430.948000 421.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 430.960000 433.036000 437.716000 421.036000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 437.764000 433.036000 442.576000 421.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.564000 433.036000 449.368000 421.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 452.368000 433.036000 457.180000 421.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 457.168000 433.036000 464.392000 421.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 470.368000 433.036000 474.172000 421.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 474.400000 433.036000 484.660000 421.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 484.696000 433.036000 488.524000 421.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 488.500000 433.036000 492.328000 421.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 492.304000 433.036000 499.984000 421.036000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 433.036000 504.044000 421.036000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 419.136000 193.492000 407.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 193.504000 419.136000 200.728000 407.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 200.704000 419.136000 210.964000 407.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 211.000000 419.136000 218.092000 407.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 218.104000 419.136000 223.840000 407.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 223.804000 419.136000 229.960000 407.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 230.008000 419.136000 233.812000 407.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 381.348000 84.468000 365.348000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 83.604000 381.348000 94.452000 365.348000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.500000 381.348000 105.940000 365.348000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 106.004000 381.348000 116.852000 365.348000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 116.900000 381.348000 124.548000 365.348000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.500000 381.348000 135.284000 365.348000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 135.300000 381.348000 146.740000 365.348000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 146.804000 381.348000 152.276000 365.348000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 152.308000 381.348000 163.156000 365.348000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 163.204000 381.348000 168.772000 365.348000 1.000000 0.000000 0.000000 1.000000
+drawChar 168.804000 381.348000 181.924000 365.348000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 181.908000 381.348000 192.692000 365.348000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 192.708000 381.348000 200.596000 365.348000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 200.612000 381.348000 212.052000 365.348000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 212.116000 381.348000 222.964000 365.348000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 223.012000 381.348000 234.388000 365.348000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 356.836000 193.492000 344.836000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 193.504000 356.836000 201.232000 344.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 201.208000 356.836000 208.300000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 208.312000 356.836000 212.116000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 212.116000 356.836000 218.884000 344.836000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 218.920000 356.836000 226.012000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 226.024000 356.836000 233.704000 344.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 233.728000 356.836000 240.820000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 240.832000 356.836000 245.644000 344.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 245.632000 356.836000 252.784000 344.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 252.736000 356.836000 260.416000 344.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 260.536000 356.836000 264.364000 344.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 264.340000 356.836000 271.432000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 271.444000 356.836000 275.248000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 275.344000 356.836000 283.024000 344.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 283.048000 356.836000 290.200000 344.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 290.152000 356.836000 295.888000 344.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 295.948000 356.836000 303.628000 344.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 303.652000 356.836000 310.744000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 310.756000 356.836000 318.484000 344.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 318.460000 356.836000 322.264000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 322.360000 356.836000 326.188000 344.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 326.164000 356.836000 332.320000 344.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 332.368000 356.836000 336.172000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 336.172000 356.836000 343.900000 344.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 343.876000 356.836000 351.100000 344.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 351.172000 356.836000 355.984000 344.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 355.972000 356.836000 359.776000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 359.872000 356.836000 367.024000 344.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.976000 356.836000 371.788000 344.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 371.776000 356.836000 375.580000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 375.676000 356.836000 383.356000 344.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 383.380000 356.836000 389.116000 344.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 389.080000 356.836000 396.304000 344.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 396.280000 356.836000 404.008000 344.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 404.080000 356.836000 411.808000 344.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 411.784000 356.836000 419.464000 344.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 419.488000 356.836000 423.292000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 423.388000 356.836000 427.216000 344.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 427.084000 356.836000 434.176000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 434.188000 356.836000 440.956000 344.836000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 440.992000 356.836000 448.084000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 448.096000 356.836000 451.924000 344.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 451.996000 356.836000 455.800000 344.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 455.800000 356.836000 459.604000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 459.700000 356.836000 463.528000 344.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 463.504000 356.836000 471.232000 344.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 471.208000 356.836000 477.364000 344.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 477.412000 356.836000 482.224000 344.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 482.212000 356.836000 489.304000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 489.316000 356.836000 496.468000 344.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 496.516000 356.836000 504.196000 344.836000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 356.836000 507.904000 344.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 342.936000 190.240000 330.936000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 190.504000 342.936000 194.308000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 194.704000 342.936000 202.432000 330.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 202.408000 342.936000 209.560000 330.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 209.512000 342.936000 216.280000 330.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 216.316000 342.936000 223.408000 330.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 223.720000 342.936000 227.524000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 227.824000 342.936000 233.560000 330.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 233.524000 342.936000 240.676000 330.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 240.724000 342.936000 244.552000 330.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 244.528000 342.936000 250.684000 330.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 250.732000 342.936000 257.824000 330.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 257.836000 342.936000 265.516000 330.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 265.840000 342.936000 269.644000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 269.944000 342.936000 274.756000 330.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 274.744000 342.936000 282.472000 330.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 282.544000 342.936000 289.636000 330.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 289.948000 342.936000 293.752000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 294.052000 342.936000 301.732000 330.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 301.756000 342.936000 308.908000 330.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 308.860000 342.936000 314.596000 330.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 314.656000 342.936000 322.336000 330.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 322.360000 342.936000 329.452000 330.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 329.464000 342.936000 337.192000 330.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 337.468000 342.936000 341.272000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 341.572000 342.936000 349.252000 330.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 349.276000 342.936000 356.368000 330.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 356.380000 342.936000 364.060000 330.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 364.084000 342.936000 370.240000 330.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 370.480000 342.936000 374.284000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 374.584000 342.936000 379.396000 330.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 379.384000 342.936000 386.608000 330.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 386.980000 342.936000 390.784000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 391.084000 342.936000 402.460000 330.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 402.484000 342.936000 409.636000 330.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 409.588000 342.936000 416.848000 330.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 416.884000 342.936000 423.976000 330.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 424.288000 342.936000 428.092000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 428.392000 342.936000 433.204000 330.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 433.192000 342.936000 440.920000 330.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 440.992000 342.936000 448.084000 330.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 448.396000 342.936000 452.200000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 452.500000 342.936000 462.760000 330.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 462.796000 342.936000 469.888000 330.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 469.900000 342.936000 476.992000 330.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 477.004000 342.936000 484.684000 330.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 484.708000 342.936000 488.536000 330.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 488.512000 342.936000 496.240000 330.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 496.216000 342.936000 503.896000 330.936000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 342.936000 507.904000 330.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 329.036000 192.652000 317.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 192.700000 329.036000 200.428000 317.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 200.404000 329.036000 208.084000 317.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 209.608000 329.036000 213.412000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 214.912000 329.036000 222.640000 317.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 222.616000 329.036000 229.768000 317.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 229.816000 329.036000 235.552000 317.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 235.516000 329.036000 242.284000 317.036000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 242.320000 329.036000 249.412000 317.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 249.424000 329.036000 255.580000 317.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 255.628000 329.036000 260.440000 317.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 260.428000 329.036000 264.256000 317.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 264.232000 329.036000 271.960000 317.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 271.936000 329.036000 279.616000 317.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 281.140000 329.036000 284.944000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 286.540000 329.036000 293.632000 317.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 293.644000 329.036000 300.796000 317.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 300.844000 329.036000 307.000000 317.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 306.940000 329.036000 310.768000 317.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 310.840000 329.036000 317.932000 317.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 317.944000 329.036000 323.680000 317.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 322.348000 329.036000 326.152000 317.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 327.652000 329.036000 331.456000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 332.956000 329.036000 337.696000 317.036000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 337.660000 329.036000 345.388000 317.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 346.960000 329.036000 350.764000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 352.360000 329.036000 363.736000 317.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 363.760000 329.036000 370.528000 317.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 372.064000 329.036000 375.868000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.368000 329.036000 385.048000 317.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 385.072000 329.036000 392.224000 317.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 392.176000 329.036000 397.912000 317.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 397.972000 329.036000 405.652000 317.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 405.676000 329.036000 412.768000 317.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 412.780000 329.036000 420.508000 317.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 420.484000 329.036000 424.288000 317.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 425.788000 329.036000 429.592000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 431.188000 329.036000 435.928000 317.036000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 437.392000 329.036000 441.196000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 442.696000 329.036000 450.424000 317.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 450.400000 329.036000 457.552000 317.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 457.600000 329.036000 464.368000 317.036000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 464.404000 329.036000 471.496000 317.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 473.008000 329.036000 476.812000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 478.408000 329.036000 485.632000 317.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 485.608000 329.036000 493.336000 317.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 493.408000 329.036000 497.236000 317.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 497.212000 329.036000 503.980000 317.036000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 329.036000 507.904000 317.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 315.136000 193.180000 303.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 193.204000 315.136000 197.032000 303.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 197.008000 315.136000 204.160000 303.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 204.208000 315.136000 211.936000 303.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 211.912000 315.136000 216.724000 303.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 216.712000 315.136000 223.804000 303.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 223.816000 315.136000 231.496000 303.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 233.812000 315.136000 237.616000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 239.908000 315.136000 246.676000 303.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 246.712000 315.136000 253.804000 303.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 253.816000 315.136000 261.496000 303.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 261.520000 315.136000 268.612000 303.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 268.624000 315.136000 273.436000 303.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 273.424000 315.136000 280.576000 303.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 280.528000 315.136000 288.208000 303.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 288.232000 315.136000 292.060000 303.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 292.132000 315.136000 299.224000 303.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 299.236000 315.136000 305.392000 303.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 307.636000 315.136000 311.440000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 313.936000 315.136000 324.196000 303.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 324.232000 315.136000 331.960000 303.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 331.936000 315.136000 335.764000 303.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 335.740000 315.136000 342.460000 303.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 342.544000 315.136000 350.272000 303.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 352.444000 315.136000 356.248000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 358.648000 315.136000 365.800000 303.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 365.848000 315.136000 371.584000 303.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 371.452000 315.136000 378.544000 303.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 380.956000 315.136000 384.760000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 387.160000 315.136000 394.888000 303.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 394.864000 315.136000 402.088000 303.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 402.160000 315.136000 406.972000 303.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 409.156000 315.136000 412.960000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 415.360000 315.136000 423.088000 303.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 423.064000 315.136000 429.220000 303.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 429.160000 315.136000 436.252000 303.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 436.264000 315.136000 443.944000 303.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 446.260000 315.136000 450.064000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 452.464000 315.136000 456.292000 303.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 456.268000 315.136000 463.996000 303.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 466.372000 315.136000 470.176000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 472.468000 315.136000 476.296000 303.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 476.272000 315.136000 483.424000 303.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 483.472000 315.136000 489.208000 303.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 489.172000 315.136000 496.852000 303.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 496.876000 315.136000 503.968000 303.136000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 315.136000 507.904000 303.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 301.236000 193.180000 289.236000 1.000000 0.000000 0.000000 1.000000 q
+drawChar 193.204000 301.236000 200.932000 289.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 200.908000 301.236000 208.060000 289.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 208.108000 301.236000 215.836000 289.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 215.812000 301.236000 220.624000 289.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 220.612000 301.236000 224.440000 289.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 224.512000 301.236000 229.324000 289.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 229.312000 301.236000 233.140000 289.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 233.116000 301.236000 240.208000 289.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 240.220000 301.236000 246.376000 289.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 246.424000 301.236000 250.228000 289.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 251.224000 301.236000 255.028000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 256.024000 301.236000 260.836000 289.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 260.824000 301.236000 268.552000 289.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 268.624000 301.236000 275.716000 289.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 275.728000 301.236000 281.464000 289.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 281.428000 301.236000 288.520000 289.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 288.532000 301.236000 296.212000 289.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 296.236000 301.236000 303.004000 289.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 304.036000 301.236000 307.840000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 308.932000 301.236000 313.672000 289.236000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 313.636000 301.236000 316.924000 289.236000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 316.936000 301.236000 328.312000 289.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 329.332000 301.236000 333.136000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 334.132000 301.236000 341.284000 289.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 341.332000 301.236000 349.012000 289.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 348.928000 301.236000 352.756000 289.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 352.828000 301.236000 359.920000 289.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 360.928000 301.236000 364.732000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 365.824000 301.236000 370.636000 289.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 370.624000 301.236000 377.848000 289.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 378.820000 301.236000 382.624000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 383.716000 301.236000 391.396000 289.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 391.312000 301.236000 397.048000 289.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 397.012000 301.236000 404.236000 289.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 404.308000 301.236000 411.988000 289.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 411.904000 301.236000 419.632000 289.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 419.704000 301.236000 426.424000 289.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 426.400000 301.236000 433.492000 289.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 434.500000 301.236000 438.304000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 439.396000 301.236000 450.772000 289.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 450.796000 301.236000 458.020000 289.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 457.996000 301.236000 463.732000 289.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 463.696000 301.236000 470.788000 289.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 471.892000 301.236000 475.696000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 476.692000 301.236000 481.504000 289.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 481.492000 301.236000 489.220000 289.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 489.292000 301.236000 496.444000 289.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 496.396000 301.236000 504.124000 289.236000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 301.236000 508.004000 289.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 287.336000 192.592000 275.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 192.604000 287.336000 200.332000 275.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 200.308000 287.336000 207.532000 275.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 207.508000 287.336000 215.236000 275.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 215.212000 287.336000 222.892000 275.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 222.916000 287.336000 230.644000 275.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 230.620000 287.336000 234.424000 275.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 234.424000 287.336000 238.864000 275.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 238.828000 287.336000 246.052000 275.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 246.028000 287.336000 251.764000 275.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 251.728000 287.336000 255.532000 275.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 255.532000 287.336000 266.908000 275.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 266.932000 287.336000 273.700000 275.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 273.736000 287.336000 277.540000 275.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.540000 287.336000 285.268000 275.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 285.244000 287.336000 292.336000 275.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 292.348000 287.336000 299.440000 275.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 299.452000 287.336000 307.132000 275.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 307.156000 287.336000 313.312000 275.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 313.360000 287.336000 317.164000 275.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 317.164000 287.336000 320.968000 275.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 320.968000 287.336000 329.284000 275.336000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 328.672000 287.336000 335.896000 275.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 335.872000 287.336000 341.608000 275.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 341.572000 287.336000 345.376000 275.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 345.376000 287.336000 352.468000 275.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 352.480000 287.336000 359.236000 275.336000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 359.284000 287.336000 366.436000 275.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.484000 287.336000 377.860000 275.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 377.884000 287.336000 385.564000 275.336000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 385.588000 287.336000 389.416000 275.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 389.392000 287.336000 396.484000 275.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 396.496000 287.336000 400.528000 275.336000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 93 1 0 0 0 900.000000 1928 FAAAAA+OpenSymbol
+drawChar 186.100000 264.544000 194.119000 255.544000 1.000000 0.000000 0.000000 1.000000 ☑
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 200.300000 267.436000 209.324000 255.436000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 209.600000 267.436000 216.752000 255.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 216.800000 267.436000 224.480000 255.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 224.504000 267.436000 228.332000 255.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 228.308000 267.436000 234.464000 255.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 234.512000 267.436000 242.240000 255.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 242.216000 267.436000 249.308000 255.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 249.320000 267.436000 255.476000 255.436000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 93 1 0 0 0 900.000000 0 FAAAAA+OpenSymbol
+drawChar 186.100000 244.644000 194.119000 235.644000 1.000000 0.000000 0.000000 1.000000 ☑
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 200.300000 247.536000 208.628000 235.536000 1.000000 0.000000 0.000000 1.000000 Z
+drawChar 208.604000 247.536000 216.332000 235.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 216.308000 247.536000 223.028000 235.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 223.004000 247.536000 229.724000 235.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 229.700000 247.536000 237.428000 235.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 237.404000 247.536000 241.232000 235.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 241.208000 247.536000 248.936000 235.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 248.912000 247.536000 252.740000 235.536000 1.000000 0.000000 0.000000 1.000000 i
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 93 1 0 0 0 900.000000 0 FAAAAA+OpenSymbol
+drawChar 186.100000 224.744000 194.119000 215.744000 1.000000 0.000000 0.000000 1.000000 ☑
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 200.300000 227.636000 210.128000 215.636000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 210.104000 227.636000 217.832000 215.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 217.808000 227.636000 221.636000 215.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 221.612000 227.636000 228.836000 215.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 228.812000 227.636000 236.540000 215.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 236.516000 227.636000 242.672000 215.636000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 93 1 0 0 0 900.000000 0 FAAAAA+OpenSymbol
+drawChar 186.100000 204.844000 194.119000 195.844000 1.000000 0.000000 0.000000 1.000000 ☑
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 200.300000 207.736000 209.324000 195.736000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 209.300000 207.736000 217.028000 195.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 217.004000 207.736000 224.732000 195.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 224.708000 207.736000 232.388000 195.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 232.412000 207.736000 239.564000 195.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 239.612000 207.736000 245.348000 195.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 245.312000 207.736000 252.992000 195.736000 1.000000 0.000000 0.000000 1.000000 b
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 455.600000 86.136000 463.664000 74.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 463.100000 86.136000 470.252000 74.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 470.300000 86.136000 477.980000 74.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 478.004000 86.136000 485.096000 74.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 485.108000 86.136000 488.912000 74.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 488.900000 86.136000 496.532000 74.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 496.496000 86.136000 504.128000 74.136000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 9165.000000 0 477.900000 9165.000000 0 477.900000 9474.800000 0 134.300000 9474.800000 0 134.300000 9165.000000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -837310.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 6176.000000 0 168.100000 6176.000000 0 168.100000 6181.000000 0 76.900000 6181.000000 0 76.900000 6176.000000 0
+eoFillPath subpath 1 163.100000 6180.900000 0 168.100000 6180.900000 0 168.100000 6311.500000 0 163.100000 6311.500000 0 163.100000 6180.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 6181.000000 0 163.100000 6181.000000 0 163.100000 6316.400000 0 72.000000 6316.400000 0 72.000000 6181.000000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 6312.080000 87.320000 6302.080000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 6312.080000 93.420000 6302.080000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 6312.080000 97.510000 6302.080000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 6312.080000 101.420000 6302.080000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 6312.080000 104.170000 6302.080000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 6312.080000 110.530000 6302.080000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 6312.080000 113.270000 6302.080000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 6312.080000 116.470000 6302.080000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 6312.080000 123.480000 6302.080000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 6312.080000 129.610000 6302.080000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 6312.080000 135.090000 6302.080000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 6312.080000 140.890000 6302.080000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 6312.080000 144.820000 6302.080000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 6312.080000 150.920000 6302.080000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 6312.080000 153.670000 6302.080000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 6312.080000 156.470000 6302.080000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 6185.200000 0 168.200000 6185.200000 0 168.200000 6300.400000 0 72.000000 6300.400000 0 72.000000 6185.200000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6253.352000 79.253000 6244.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 6253.352000 86.669000 6244.352000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 6253.352000 90.215000 6244.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 6253.352000 93.077000 6244.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 6253.352000 97.406000 6244.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 6253.352000 100.853000 6244.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 6253.352000 107.324000 6244.352000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 6253.352000 112.337000 6244.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 6253.352000 115.271000 6244.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 6253.352000 118.655000 6244.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 6253.352000 126.512000 6244.352000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 6253.352000 130.805000 6244.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 6253.352000 135.881000 6244.352000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 6253.352000 139.355000 6244.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 6253.352000 147.284000 6244.352000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 6253.352000 150.074000 6244.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 6253.352000 155.897000 6244.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 6253.352000 158.750000 6244.352000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 6253.352000 161.853000 6244.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6242.852000 82.124000 6233.852000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 6242.852000 87.137000 6233.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 6242.852000 90.071000 6233.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 6242.852000 93.356000 6233.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 6242.852000 100.403000 6233.852000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 6242.852000 104.921000 6233.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 6242.852000 109.205000 6233.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 6242.852000 117.737000 6233.852000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 6242.852000 123.119000 6233.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 6242.852000 128.996000 6233.852000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 6242.852000 132.605000 6233.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 6242.852000 138.392000 6233.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 6242.852000 141.749000 6233.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 6242.852000 149.507000 6233.852000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 6242.852000 153.800000 6233.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 6242.852000 158.876000 6233.852000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 6242.852000 161.853000 6233.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6232.352000 81.764000 6223.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 6232.352000 87.596000 6223.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 6232.352000 93.356000 6223.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 6232.352000 102.050000 6223.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 6232.352000 113.822000 6223.352000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 6232.352000 122.651000 6223.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 6232.352000 134.117000 6223.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 6232.352000 138.401000 6223.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 6232.352000 147.149000 6223.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 6232.352000 158.921000 6223.352000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 6232.352000 161.853000 6223.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6221.852000 79.271000 6212.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 6221.852000 84.338000 6212.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 6221.852000 89.621000 6212.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 6221.852000 94.643000 6212.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 6221.852000 100.502000 6212.852000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 6221.852000 106.262000 6212.852000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 6221.852000 111.518000 6212.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 6221.852000 116.216000 6212.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 6221.852000 119.249000 6212.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 6221.852000 122.363000 6212.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 6221.852000 128.186000 6212.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 6221.852000 131.345000 6212.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 6221.852000 137.060000 6212.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 6221.852000 140.147000 6212.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 6221.852000 145.007000 6212.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 6221.852000 148.598000 6212.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 6221.852000 151.460000 6212.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 6221.852000 155.789000 6212.852000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 6221.852000 158.933000 6212.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6211.352000 80.702000 6202.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 6211.352000 83.573000 6202.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 6211.352000 89.396000 6202.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 6211.352000 95.156000 6202.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 6211.352000 100.547000 6202.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 6211.352000 109.052000 6202.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 6211.352000 111.959000 6202.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 6211.352000 117.251000 6202.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 6211.352000 121.904000 6202.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 6211.352000 126.503000 6202.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 6211.352000 129.338000 6202.352000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 6211.352000 134.936000 6202.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 6211.352000 143.441000 6202.352000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 6211.352000 148.796000 6202.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 6211.352000 154.574000 6202.352000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 6211.352000 158.876000 6202.352000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 6211.352000 161.853000 6202.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6200.852000 79.271000 6191.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 6200.852000 85.094000 6191.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 6200.852000 88.703000 6191.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 6200.852000 94.112000 6191.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 6200.852000 97.244000 6191.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 6200.852000 103.058000 6191.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 6200.852000 108.890000 6191.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 6200.852000 111.950000 6191.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 6200.852000 115.271000 6191.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 6200.852000 120.338000 6191.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 6200.852000 125.621000 6191.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 6200.852000 131.363000 6191.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 6200.852000 134.558000 6191.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 6200.852000 140.048000 6191.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 6200.852000 145.430000 6191.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 6200.852000 150.551000 6191.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 6200.852000 155.960000 6191.852000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 6200.852000 158.933000 6191.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6190.352000 80.009000 6181.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 6190.352000 85.364000 6181.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 6190.352000 88.271000 6181.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 6190.352000 91.169000 6181.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 6190.352000 97.955000 6181.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 6190.352000 107.765000 6181.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 6190.352000 110.672000 6181.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 6190.352000 115.964000 6181.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 6190.352000 120.617000 6181.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 6190.352000 125.216000 6181.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 6190.352000 128.051000 6181.352000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 6190.352000 134.954000 6181.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 6190.352000 146.285000 6181.352000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 6190.352000 151.667000 6181.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 6190.352000 155.906000 6181.352000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 6190.352000 159.033000 6181.352000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 6180.900000 0 72.100000 6180.900000 0 72.100000 6316.400000 0 72.000000 6316.400000 0 72.000000 6180.900000 0
+eoFillPath subpath 1 163.100000 6180.900000 0 163.200000 6180.900000 0 163.200000 6316.400000 0 163.100000 6316.400000 0 163.100000 6180.900000 0
+eoFillPath subpath 1 72.000000 6316.300000 0 163.200000 6316.300000 0 163.200000 6316.400000 0 72.000000 6316.400000 0 72.000000 6316.300000 0
+eoFillPath subpath 1 72.000000 6180.900000 0 163.200000 6180.900000 0 163.200000 6181.000000 0 72.000000 6181.000000 0 72.000000 6180.900000 0
+saveState
+eoClipPath subpath 1 96.900000 6256.200000 0 138.300000 6256.200000 0 138.300000 6300.400000 0 96.900000 6300.400000 0 96.900000 6256.200000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -546430.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 5901.400000 0 165.500000 5901.400000 0 165.500000 5906.400000 0 76.900000 5906.400000 0 76.900000 5901.400000 0
+eoFillPath subpath 1 160.500000 5906.300000 0 165.500000 5906.300000 0 165.500000 6062.600000 0 160.500000 6062.600000 0 160.500000 5906.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 5906.400000 0 121.400000 5906.400000 0 121.400000 6067.500000 0 72.000000 6067.500000 0 72.000000 5906.400000 0
+saveState
+eoClipPath subpath 1 72.000000 5906.300000 0 160.500000 5906.300000 0 160.500000 6067.400000 0 72.000000 6067.400000 0 72.000000 5906.300000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -509730.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 6063.180000 89.280000 6053.180000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 6063.180000 95.630000 6053.180000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 6063.180000 99.520000 6053.180000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 6063.180000 102.270000 6053.180000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 6063.180000 108.450000 6053.180000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 6063.180000 112.610000 6053.180000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 6063.180000 118.510000 6053.180000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 6063.180000 121.670000 6053.180000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 6063.180000 124.470000 6053.180000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 6063.180000 130.830000 6053.180000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 6063.180000 133.970000 6053.180000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 6063.180000 137.920000 6053.180000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 6063.180000 144.230000 6053.180000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 6063.180000 150.350000 6053.180000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 6063.180000 153.570000 6053.180000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 6051.480000 95.000000 6041.480000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 6051.480000 97.770000 6041.480000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 6051.480000 103.000000 6041.480000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 6051.480000 109.330000 6041.480000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 6051.480000 117.470000 6041.480000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 6051.480000 123.620000 6041.480000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 6051.480000 128.800000 6041.480000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 6051.480000 135.130000 6041.480000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 6051.480000 141.250000 6041.480000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 6051.480000 145.410000 6041.480000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6036.652000 82.961000 6027.652000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 6036.652000 87.614000 6027.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 6036.652000 93.356000 6027.652000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 6036.652000 98.612000 6027.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 6036.652000 103.733000 6027.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 6036.652000 106.568000 6027.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 6036.652000 111.959000 6027.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 6036.652000 114.866000 6027.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 6036.652000 117.665000 6027.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 6036.652000 122.768000 6027.652000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 6036.652000 125.747000 6027.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 6036.652000 131.651000 6027.652000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 6036.652000 136.907000 6027.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 6036.652000 142.307000 6027.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 6036.652000 148.049000 6027.652000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 6036.652000 150.956000 6027.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 6036.652000 156.302000 6027.652000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 6036.652000 159.253000 6027.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6026.152000 84.095000 6017.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 6026.152000 89.900000 6017.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 6026.152000 95.318000 6017.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 6026.152000 100.349000 6017.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 6026.152000 110.789000 6017.152000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 6026.152000 111.464000 6017.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 6026.152000 114.362000 6017.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 6026.152000 119.348000 6017.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 6026.152000 126.962000 6017.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 6026.152000 132.047000 6017.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 6026.152000 139.958000 6017.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 6026.152000 142.865000 6017.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 6026.152000 147.410000 6017.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 6026.152000 153.287000 6017.152000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 6026.152000 156.333000 6017.152000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6015.652000 84.095000 6006.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 6015.652000 89.468000 6006.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 6015.652000 94.121000 6006.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 6015.652000 99.899000 6006.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 6015.652000 105.218000 6006.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 6015.652000 109.502000 6006.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 6015.652000 115.649000 6006.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 6015.652000 122.327000 6006.652000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 6015.652000 127.718000 6006.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 6015.652000 132.002000 6006.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 6015.652000 138.149000 6006.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 6015.652000 145.205000 6006.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 6015.652000 150.992000 6006.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 6015.652000 156.311000 6006.652000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 6015.652000 159.253000 6006.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6005.152000 82.394000 5996.152000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 6005.152000 86.705000 5996.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 6005.152000 91.322000 5996.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 6005.152000 94.913000 5996.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 6005.152000 98.054000 5996.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 6005.152000 102.014000 5996.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 6005.152000 104.876000 5996.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 6005.152000 113.435000 5996.152000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 6005.152000 118.718000 5996.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 6005.152000 121.949000 5996.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 6005.152000 125.063000 5996.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 6005.152000 130.886000 5996.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 6005.152000 134.045000 5996.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 6005.152000 138.005000 5996.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 6005.152000 143.792000 5996.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 6005.152000 149.111000 5996.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 6005.152000 151.964000 5996.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 6005.152000 156.293000 5996.152000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 6005.152000 159.153000 5996.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5994.652000 79.271000 5985.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 5994.652000 82.169000 5985.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 5994.652000 85.526000 5985.652000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 5994.652000 90.818000 5985.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 5994.652000 94.454000 5985.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 5994.652000 99.008000 5985.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 5994.652000 104.318000 5985.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 5994.652000 110.096000 5985.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 5994.652000 115.856000 5985.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 5994.652000 119.546000 5985.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 5994.652000 124.001000 5985.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 5994.652000 129.509000 5985.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 5994.652000 133.145000 5985.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 5994.652000 139.751000 5985.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 5994.652000 145.205000 5985.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 5994.652000 148.841000 5985.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 5994.652000 152.657000 5985.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 5994.652000 156.293000 5985.652000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5994.652000 159.253000 5985.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5984.152000 84.095000 5975.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 5984.152000 88.406000 5975.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 5984.152000 93.824000 5975.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 5984.152000 99.602000 5975.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 5984.152000 105.362000 5975.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 5984.152000 108.422000 5975.152000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 5984.152000 116.747000 5975.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 5984.152000 129.275000 5975.152000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 5984.152000 135.089000 5975.152000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 5984.152000 138.698000 5975.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 5984.152000 141.560000 5975.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 5984.152000 146.906000 5975.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 5984.152000 151.190000 5975.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 5984.152000 156.266000 5975.152000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5984.152000 159.253000 5975.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5973.652000 82.196000 5964.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 5973.652000 87.560000 5964.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 5973.652000 92.213000 5964.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 5973.652000 96.551000 5964.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 5973.652000 101.708000 5964.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 5973.652000 107.216000 5964.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 5973.652000 111.653000 5964.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 5973.652000 118.961000 5964.652000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 5973.652000 124.316000 5964.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 5973.652000 128.654000 5964.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 5973.652000 133.172000 5964.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 5973.652000 138.995000 5964.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 5973.652000 143.612000 5964.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 5973.652000 148.913000 5964.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 5973.652000 153.197000 5964.652000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 5973.652000 156.333000 5964.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5963.152000 80.009000 5954.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 5963.152000 85.319000 5954.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 5963.152000 91.061000 5954.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 5963.152000 100.052000 5954.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 5963.152000 113.993000 5954.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 5963.152000 116.873000 5954.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 5963.152000 120.410000 5954.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 5963.152000 126.296000 5954.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 5963.152000 135.350000 5954.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 5963.152000 145.106000 5954.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 5963.152000 150.893000 5954.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 5963.152000 156.212000 5954.152000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5963.152000 159.253000 5954.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5952.652000 82.196000 5943.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 5952.652000 87.560000 5943.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 5952.652000 93.392000 5943.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 5952.652000 99.152000 5943.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 5952.652000 101.960000 5943.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 5952.652000 107.306000 5943.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 5952.652000 111.905000 5943.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 5952.652000 115.640000 5943.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 5952.652000 122.444000 5943.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 5952.652000 127.898000 5943.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 5952.652000 135.575000 5943.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 5952.652000 141.380000 5943.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 5952.652000 145.241000 5943.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 5952.652000 150.803000 5943.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 5952.652000 156.302000 5943.652000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5952.652000 159.253000 5943.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5942.152000 80.009000 5933.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 5942.152000 85.796000 5933.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 5942.152000 91.115000 5933.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 5942.152000 95.399000 5933.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 5942.152000 100.718000 5933.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 5942.152000 107.054000 5933.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 5942.152000 118.097000 5933.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 5942.152000 123.524000 5933.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 5942.152000 129.401000 5933.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 5942.152000 131.768000 5933.152000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 5942.152000 135.413000 5933.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 5942.152000 141.659000 5933.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 5942.152000 150.965000 5933.152000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 5942.152000 156.320000 5933.152000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5942.152000 159.253000 5933.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5931.652000 81.017000 5922.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 5931.652000 84.608000 5922.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 5931.652000 89.963000 5922.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 5931.652000 92.870000 5922.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 5931.652000 98.693000 5922.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 5931.652000 103.310000 5922.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 5931.652000 107.243000 5922.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 5931.652000 116.081000 5922.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 5931.652000 121.886000 5922.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 5931.652000 127.205000 5922.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 5931.652000 132.983000 5922.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 5931.652000 136.943000 5922.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 5931.652000 143.846000 5922.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 5931.652000 148.184000 5922.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 5931.652000 153.260000 5922.652000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 5931.652000 156.433000 5922.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5921.152000 79.271000 5912.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 5921.152000 85.094000 5912.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 5921.152000 90.854000 5912.152000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 5921.152000 93.653000 5912.152000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 5906.300000 0 72.100000 5906.300000 0 72.100000 6067.500000 0 72.000000 6067.500000 0 72.000000 5906.300000 0
+eoFillPath subpath 1 160.500000 5906.300000 0 160.600000 5906.300000 0 160.600000 6067.500000 0 160.500000 6067.500000 0 160.500000 5906.300000 0
+eoFillPath subpath 1 72.000000 6067.400000 0 160.600000 6067.400000 0 160.600000 6067.500000 0 72.000000 6067.500000 0 72.000000 6067.400000 0
+eoFillPath subpath 1 72.000000 5906.300000 0 160.600000 5906.300000 0 160.600000 5906.400000 0 72.000000 5906.400000 0 72.000000 5906.300000 0
+saveState
+eoClipPath subpath 1 108.000000 5418.900000 0 178.900000 5418.900000 0 178.900000 5475.600000 0 108.000000 5475.600000 0 108.000000 5418.900000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -462700.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 1360.600000 0 165.500000 1360.600000 0 165.500000 1365.600000 0 76.900000 1365.600000 0 76.900000 1360.600000 0
+eoFillPath subpath 1 160.500000 1365.500000 0 165.500000 1365.500000 0 165.500000 1474.300000 0 160.500000 1474.300000 0 160.500000 1365.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 1365.600000 0 160.500000 1365.600000 0 160.500000 1479.200000 0 72.000000 1479.200000 0 72.000000 1365.600000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1474.852000 83.771000 1465.852000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 1474.852000 89.594000 1465.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 1474.852000 92.465000 1465.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 1474.852000 97.568000 1465.852000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 1474.852000 100.943000 1465.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 1474.852000 106.955000 1465.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 1474.852000 110.447000 1465.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 1474.852000 114.425000 1465.852000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 1474.852000 119.717000 1465.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 1474.852000 127.493000 1465.852000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 1474.852000 130.949000 1465.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 1474.852000 136.574000 1465.852000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 1474.852000 141.920000 1465.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 1474.852000 147.365000 1465.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 1474.852000 151.703000 1465.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 1474.852000 156.320000 1465.852000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 1474.852000 159.153000 1465.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1464.352000 81.764000 1455.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 1464.352000 85.130000 1455.352000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 1464.352000 88.712000 1455.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 1464.352000 94.022000 1455.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 1464.352000 98.306000 1455.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 1464.352000 102.455000 1455.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 1464.352000 106.676000 1455.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 1464.352000 110.312000 1455.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 1464.352000 114.920000 1455.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 1464.352000 119.060000 1455.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 1464.352000 125.450000 1455.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 1464.352000 130.832000 1455.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 1464.352000 139.445000 1455.352000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 1464.352000 145.169000 1455.352000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 1464.352000 148.076000 1455.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 1464.352000 153.323000 1455.352000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 1464.352000 156.433000 1455.352000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1453.852000 80.009000 1444.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 1453.852000 82.871000 1444.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 1453.852000 88.316000 1444.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 1453.852000 94.094000 1444.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 1453.852000 96.947000 1444.852000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 1453.852000 104.948000 1444.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 1453.852000 113.705000 1444.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 1453.852000 119.492000 1444.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 1453.852000 124.811000 1444.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 1453.852000 132.848000 1444.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 1453.852000 141.605000 1444.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 1453.852000 144.467000 1444.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 1453.852000 148.103000 1444.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 1453.852000 150.965000 1444.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 1453.852000 156.311000 1444.852000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1453.852000 159.253000 1444.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1443.352000 80.999000 1434.352000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 1443.352000 90.539000 1434.352000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 1443.352000 95.318000 1434.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 1443.352000 99.602000 1434.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 1443.352000 102.473000 1434.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 1443.352000 108.260000 1434.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 1443.352000 110.762000 1434.352000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 1443.352000 115.316000 1434.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 1443.352000 122.156000 1434.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 1443.352000 132.299000 1434.352000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 1443.352000 136.970000 1434.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 1443.352000 139.877000 1434.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 1443.352000 142.775000 1434.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 1443.352000 148.022000 1434.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 1443.352000 152.720000 1434.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 1443.352000 156.311000 1434.352000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1443.352000 159.253000 1434.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1432.852000 83.006000 1423.852000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 1432.852000 88.793000 1423.852000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 1432.852000 91.664000 1423.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 1432.852000 94.562000 1423.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 1432.852000 100.349000 1423.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 1432.852000 103.157000 1423.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 1432.852000 108.980000 1423.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 1432.852000 114.740000 1423.852000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 1432.852000 119.375000 1423.852000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 1432.852000 128.033000 1423.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 1432.852000 141.479000 1423.852000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 1432.852000 146.807000 1423.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 1432.852000 152.684000 1423.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 1432.852000 156.293000 1423.852000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1432.852000 159.253000 1423.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1422.352000 79.730000 1413.352000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 1422.352000 84.005000 1413.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 1422.352000 89.423000 1413.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 1422.352000 98.036000 1413.352000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 1422.352000 121.157000 1413.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 1422.352000 145.115000 1413.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 1422.352000 151.001000 1413.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 1422.352000 156.320000 1413.352000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 1422.352000 159.253000 1413.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1411.852000 83.285000 1402.852000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 1411.852000 89.099000 1402.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 1411.852000 93.401000 1402.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 1411.852000 98.477000 1402.852000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 1411.852000 103.121000 1402.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 1411.852000 105.974000 1402.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 1411.852000 111.320000 1402.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 1411.852000 115.604000 1402.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 1411.852000 123.857000 1402.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 1411.852000 136.007000 1402.852000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 1411.852000 141.794000 1402.852000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 1411.852000 144.665000 1402.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 1411.852000 147.464000 1402.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 1411.852000 153.251000 1402.852000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 1411.852000 156.433000 1402.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1401.352000 79.271000 1392.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 1401.352000 85.094000 1392.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 1401.352000 90.854000 1392.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 1401.352000 96.146000 1392.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 1401.352000 102.302000 1392.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 1401.352000 107.711000 1392.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 1401.352000 113.048000 1392.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 1401.352000 119.204000 1392.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 1401.352000 124.991000 1392.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 1401.352000 130.310000 1392.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 1401.352000 135.647000 1392.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 1401.352000 144.755000 1392.352000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 1401.352000 153.323000 1392.352000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 1401.352000 156.333000 1392.352000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1390.852000 82.160000 1381.852000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 1390.852000 85.067000 1381.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 1390.852000 89.297000 1381.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 1390.852000 94.616000 1381.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 1390.852000 98.747000 1381.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 1390.852000 106.055000 1381.852000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 1390.852000 109.700000 1381.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 1390.852000 115.055000 1381.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 1390.852000 118.601000 1381.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 1390.852000 124.010000 1381.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 1390.852000 128.042000 1381.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 1390.852000 135.998000 1381.852000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 1390.852000 141.785000 1381.852000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 1390.852000 144.656000 1381.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 1390.852000 147.554000 1381.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 1390.852000 153.341000 1381.852000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 1390.852000 156.433000 1381.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 1380.352000 79.271000 1371.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 1380.352000 85.094000 1371.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 1380.352000 90.854000 1371.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 1380.352000 93.743000 1371.352000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 1365.500000 0 72.100000 1365.500000 0 72.100000 1479.200000 0 72.000000 1479.200000 0 72.000000 1365.500000 0
+eoFillPath subpath 1 160.500000 1365.500000 0 160.600000 1365.500000 0 160.600000 1479.200000 0 160.500000 1479.200000 0 160.500000 1365.500000 0
+eoFillPath subpath 1 72.000000 1479.100000 0 160.600000 1479.100000 0 160.600000 1479.200000 0 72.000000 1479.200000 0 72.000000 1479.100000 0
+eoFillPath subpath 1 72.000000 1365.500000 0 160.600000 1365.500000 0 160.600000 1365.600000 0 72.000000 1365.600000 0 72.000000 1365.500000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 7555.000000 0 169.600000 7555.000000 0 169.600000 7560.000000 0 76.900000 7560.000000 0 76.900000 7555.000000 0
+eoFillPath subpath 1 164.600000 7559.900000 0 169.600000 7559.900000 0 169.600000 7675.500000 0 164.600000 7675.500000 0 164.600000 7559.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 7560.000000 0 121.400000 7560.000000 0 121.400000 7680.400000 0 72.000000 7680.400000 0 72.000000 7560.000000 0
+saveState
+eoClipPath subpath 1 72.000000 7559.900000 0 164.600000 7559.900000 0 164.600000 7680.300000 0 72.000000 7680.300000 0 72.000000 7559.900000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -670970.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 7629.900000 0 93.700000 7629.900000 0 93.700000 7649.100000 0 72.000000 7649.100000 0 72.000000 7629.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 7629.900000 0 169.600000 7629.900000 0 169.600000 7649.100000 0 93.700000 7649.100000 0 93.700000 7629.900000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 7613.200000 0 93.700000 7613.200000 0 93.700000 7629.900000 0 72.000000 7629.900000 0 72.000000 7613.200000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 7613.200000 0 169.600000 7613.200000 0 169.600000 7629.900000 0 93.700000 7629.900000 0 93.700000 7613.200000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 7594.000000 0 93.700000 7594.000000 0 93.700000 7613.200000 0 72.000000 7613.200000 0 72.000000 7594.000000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 7594.000000 0 169.600000 7594.000000 0 169.600000 7613.200000 0 93.700000 7613.200000 0 93.700000 7594.000000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 7574.800000 0 93.700000 7574.800000 0 93.700000 7594.000000 0 72.000000 7594.000000 0 72.000000 7574.800000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 7574.800000 0 169.600000 7574.800000 0 169.600000 7594.000000 0 93.700000 7594.000000 0 93.700000 7574.800000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7676.052000 82.898000 7667.052000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 7676.052000 87.200000 7667.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 7676.052000 90.809000 7667.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 7676.052000 93.671000 7667.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 7676.052000 98.315000 7667.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 7676.052000 101.906000 7667.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 7676.052000 106.514000 7667.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 7676.052000 109.754000 7667.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 7676.052000 112.868000 7667.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 7676.052000 118.691000 7667.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 7676.052000 121.850000 7667.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 7676.052000 125.702000 7667.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 7676.052000 131.588000 7667.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 7676.052000 136.907000 7667.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 7676.052000 140.039000 7667.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 7676.052000 146.078000 7667.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 7676.052000 151.442000 7667.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 7676.052000 154.349000 7667.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 7676.052000 157.148000 7667.052000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 7676.052000 160.433000 7667.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7665.552000 84.095000 7656.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 7665.552000 89.468000 7656.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 7665.552000 94.580000 7656.552000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 7665.552000 97.631000 7656.552000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 7645.152000 104.443000 7636.152000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 7645.152000 109.060000 7636.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 7645.152000 113.398000 7636.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 7645.152000 119.194000 7636.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 7645.152000 124.612000 7636.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 7645.152000 127.465000 7636.152000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 7628.452000 101.176000 7619.452000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 7628.452000 104.074000 7619.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 7628.452000 109.420000 7619.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 7628.452000 114.442000 7619.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 7628.452000 120.202000 7619.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 7628.452000 123.811000 7619.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 7628.452000 129.121000 7619.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 7628.452000 134.899000 7619.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 7628.452000 139.516000 7619.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 7628.452000 143.107000 7619.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 7628.452000 148.417000 7619.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 7628.452000 151.270000 7619.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 7628.452000 157.093000 7619.452000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 7611.752000 103.048000 7602.752000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 7611.752000 108.421000 7602.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 7611.752000 113.443000 7602.752000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 7611.752000 118.852000 7602.752000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 7611.752000 124.702000 7602.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 7611.752000 130.021000 7602.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 7611.752000 135.079000 7602.752000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 7592.552000 104.407000 7583.552000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 7592.552000 109.816000 7583.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 7592.552000 115.594000 7583.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 7592.552000 121.354000 7583.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 7592.552000 125.692000 7583.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 7592.552000 128.563000 7583.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 7592.552000 133.954000 7583.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 7592.552000 139.786000 7583.552000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 7559.900000 0 72.100000 7559.900000 0 72.100000 7680.400000 0 72.000000 7680.400000 0 72.000000 7559.900000 0
+eoFillPath subpath 1 164.600000 7559.900000 0 164.700000 7559.900000 0 164.700000 7680.400000 0 164.600000 7680.400000 0 164.600000 7559.900000 0
+eoFillPath subpath 1 72.000000 7680.300000 0 164.700000 7680.300000 0 164.700000 7680.400000 0 72.000000 7680.400000 0 72.000000 7680.300000 0
+eoFillPath subpath 1 72.000000 7559.900000 0 164.700000 7559.900000 0 164.700000 7560.000000 0 72.000000 7560.000000 0 72.000000 7559.900000 0
+eoFillPath subpath 1 91.300000 7574.800000 0 93.700000 7574.800000 0 93.700000 7649.100000 0 91.300000 7649.100000 0 91.300000 7574.800000 0
+eoFillPath subpath 1 72.000000 7594.000000 0 169.600000 7594.000000 0 169.600000 7596.400000 0 72.000000 7596.400000 0 72.000000 7594.000000 0
+eoFillPath subpath 1 72.000000 7646.700000 0 169.600000 7646.700000 0 169.600000 7649.100000 0 72.000000 7649.100000 0 72.000000 7646.700000 0
+eoFillPath subpath 1 72.000000 7574.800000 0 169.600000 7574.800000 0 169.600000 7577.200000 0 72.000000 7577.200000 0 72.000000 7574.800000 0
+saveState
+eoClipPath subpath 1 108.000000 -291.200000 0 150.800000 -291.200000 0 150.800000 -247.000000 0 108.000000 -247.000000 0 108.000000 -291.200000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 108320.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 -1141.200000 0 499.600000 -1141.200000 0 499.600000 -1136.100000 0 186.800000 -1136.100000 0 186.800000 -1141.200000 0
+eoFillPath subpath 1 494.500000 -1136.200000 0 499.600000 -1136.200000 0 499.600000 -947.800000 0 494.500000 -947.800000 0 494.500000 -1136.200000 0
+saveState
+eoClipPath subpath 1 181.800000 -1136.100000 0 494.500000 -1136.100000 0 494.500000 -942.800000 0 181.800000 -942.800000 0 181.800000 -1136.100000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 -942.700000 0 494.500000 -942.700000 0 494.500000 -942.700000 0 181.700000 -942.700000 0
+eoFillPath subpath 1 181.700000 -942.700000 0 494.500000 -942.700000 0 494.500000 -943.500000 0 181.700000 -943.500000 0 181.700000 -942.700000 0
+eoFillPath subpath 1 181.700000 -943.500000 0 494.500000 -943.500000 0 494.500000 -944.200000 0 181.700000 -944.200000 0 181.700000 -943.500000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 -944.200000 0 494.500000 -944.200000 0 494.500000 -945.000000 0 181.700000 -945.000000 0 181.700000 -944.200000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 -945.000000 0 494.500000 -945.000000 0 494.500000 -945.800000 0 181.700000 -945.800000 0 181.700000 -945.000000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 -945.800000 0 494.500000 -945.800000 0 494.500000 -946.500000 0 181.700000 -946.500000 0 181.700000 -945.800000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 -946.500000 0 494.500000 -946.500000 0 494.500000 -947.300000 0 181.700000 -947.300000 0 181.700000 -946.500000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 -947.300000 0 494.500000 -947.300000 0 494.500000 -948.000000 0 181.700000 -948.000000 0 181.700000 -947.300000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 -948.000000 0 494.500000 -948.000000 0 494.500000 -948.800000 0 181.700000 -948.800000 0 181.700000 -948.000000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 -948.800000 0 494.500000 -948.800000 0 494.500000 -949.500000 0 181.700000 -949.500000 0 181.700000 -948.800000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 -949.500000 0 494.500000 -949.500000 0 494.500000 -950.300000 0 181.700000 -950.300000 0 181.700000 -949.500000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 -950.300000 0 494.500000 -950.300000 0 494.500000 -951.100000 0 181.700000 -951.100000 0 181.700000 -950.300000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 -951.100000 0 494.500000 -951.100000 0 494.500000 -951.800000 0 181.700000 -951.800000 0 181.700000 -951.100000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 -951.800000 0 494.500000 -951.800000 0 494.500000 -952.600000 0 181.700000 -952.600000 0 181.700000 -951.800000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 -952.600000 0 494.500000 -952.600000 0 494.500000 -953.300000 0 181.700000 -953.300000 0 181.700000 -952.600000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 -953.300000 0 494.500000 -953.300000 0 494.500000 -954.100000 0 181.700000 -954.100000 0 181.700000 -953.300000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 -954.100000 0 494.500000 -954.100000 0 494.500000 -954.900000 0 181.700000 -954.900000 0 181.700000 -954.100000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 -954.900000 0 494.500000 -954.900000 0 494.500000 -955.600000 0 181.700000 -955.600000 0 181.700000 -954.900000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 -955.600000 0 494.500000 -955.600000 0 494.500000 -956.400000 0 181.700000 -956.400000 0 181.700000 -955.600000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 -956.400000 0 494.500000 -956.400000 0 494.500000 -957.100000 0 181.700000 -957.100000 0 181.700000 -956.400000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 -957.100000 0 494.500000 -957.100000 0 494.500000 -957.900000 0 181.700000 -957.900000 0 181.700000 -957.100000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 -957.900000 0 494.500000 -957.900000 0 494.500000 -958.700000 0 181.700000 -958.700000 0 181.700000 -957.900000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 -958.700000 0 494.500000 -958.700000 0 494.500000 -959.400000 0 181.700000 -959.400000 0 181.700000 -958.700000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 -959.400000 0 494.500000 -959.400000 0 494.500000 -960.200000 0 181.700000 -960.200000 0 181.700000 -959.400000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 -960.200000 0 494.500000 -960.200000 0 494.500000 -960.900000 0 181.700000 -960.900000 0 181.700000 -960.200000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 -960.900000 0 494.500000 -960.900000 0 494.500000 -961.700000 0 181.700000 -961.700000 0 181.700000 -960.900000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 -961.700000 0 494.500000 -961.700000 0 494.500000 -962.400000 0 181.700000 -962.400000 0 181.700000 -961.700000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 -962.400000 0 494.500000 -962.400000 0 494.500000 -963.200000 0 181.700000 -963.200000 0 181.700000 -962.400000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 -963.200000 0 494.500000 -963.200000 0 494.500000 -964.000000 0 181.700000 -964.000000 0 181.700000 -963.200000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 -964.000000 0 494.500000 -964.000000 0 494.500000 -964.700000 0 181.700000 -964.700000 0 181.700000 -964.000000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 -964.700000 0 494.500000 -964.700000 0 494.500000 -965.500000 0 181.700000 -965.500000 0 181.700000 -964.700000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 -965.500000 0 494.500000 -965.500000 0 494.500000 -966.200000 0 181.700000 -966.200000 0 181.700000 -965.500000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 -966.200000 0 494.500000 -966.200000 0 494.500000 -967.000000 0 181.700000 -967.000000 0 181.700000 -966.200000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 -967.000000 0 494.500000 -967.000000 0 494.500000 -967.800000 0 181.700000 -967.800000 0 181.700000 -967.000000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 -967.800000 0 494.500000 -967.800000 0 494.500000 -968.500000 0 181.700000 -968.500000 0 181.700000 -967.800000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 -968.500000 0 494.500000 -968.500000 0 494.500000 -969.300000 0 181.700000 -969.300000 0 181.700000 -968.500000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 -969.300000 0 494.500000 -969.300000 0 494.500000 -970.000000 0 181.700000 -970.000000 0 181.700000 -969.300000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 -970.000000 0 494.500000 -970.000000 0 494.500000 -970.800000 0 181.700000 -970.800000 0 181.700000 -970.000000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 -970.800000 0 494.500000 -970.800000 0 494.500000 -971.600000 0 181.700000 -971.600000 0 181.700000 -970.800000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 -971.600000 0 494.500000 -971.600000 0 494.500000 -972.300000 0 181.700000 -972.300000 0 181.700000 -971.600000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 -972.300000 0 494.500000 -972.300000 0 494.500000 -973.100000 0 181.700000 -973.100000 0 181.700000 -972.300000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 -973.100000 0 494.500000 -973.100000 0 494.500000 -973.800000 0 181.700000 -973.800000 0 181.700000 -973.100000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 -973.800000 0 494.500000 -973.800000 0 494.500000 -974.600000 0 181.700000 -974.600000 0 181.700000 -973.800000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 -974.600000 0 494.500000 -974.600000 0 494.500000 -975.300000 0 181.700000 -975.300000 0 181.700000 -974.600000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 -975.300000 0 494.500000 -975.300000 0 494.500000 -976.100000 0 181.700000 -976.100000 0 181.700000 -975.300000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 -976.100000 0 494.500000 -976.100000 0 494.500000 -976.900000 0 181.700000 -976.900000 0 181.700000 -976.100000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 -976.900000 0 494.500000 -976.900000 0 494.500000 -977.600000 0 181.700000 -977.600000 0 181.700000 -976.900000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 -977.600000 0 494.500000 -977.600000 0 494.500000 -978.400000 0 181.700000 -978.400000 0 181.700000 -977.600000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 -978.400000 0 494.500000 -978.400000 0 494.500000 -979.100000 0 181.700000 -979.100000 0 181.700000 -978.400000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 -979.100000 0 494.500000 -979.100000 0 494.500000 -979.900000 0 181.700000 -979.900000 0 181.700000 -979.100000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 -979.900000 0 494.500000 -979.900000 0 494.500000 -980.700000 0 181.700000 -980.700000 0 181.700000 -979.900000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 -980.700000 0 494.500000 -980.700000 0 494.500000 -981.400000 0 181.700000 -981.400000 0 181.700000 -980.700000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 -981.400000 0 494.500000 -981.400000 0 494.500000 -982.200000 0 181.700000 -982.200000 0 181.700000 -981.400000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 -982.200000 0 494.500000 -982.200000 0 494.500000 -982.900000 0 181.700000 -982.900000 0 181.700000 -982.200000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 -982.900000 0 494.500000 -982.900000 0 494.500000 -983.700000 0 181.700000 -983.700000 0 181.700000 -982.900000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 -983.700000 0 494.500000 -983.700000 0 494.500000 -984.500000 0 181.700000 -984.500000 0 181.700000 -983.700000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 -984.500000 0 494.500000 -984.500000 0 494.500000 -985.200000 0 181.700000 -985.200000 0 181.700000 -984.500000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 -985.200000 0 494.500000 -985.200000 0 494.500000 -986.000000 0 181.700000 -986.000000 0 181.700000 -985.200000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 -986.000000 0 494.500000 -986.000000 0 494.500000 -986.700000 0 181.700000 -986.700000 0 181.700000 -986.000000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 -986.700000 0 494.500000 -986.700000 0 494.500000 -987.500000 0 181.700000 -987.500000 0 181.700000 -986.700000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 -987.500000 0 494.500000 -987.500000 0 494.500000 -988.200000 0 181.700000 -988.200000 0 181.700000 -987.500000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 -988.200000 0 494.500000 -988.200000 0 494.500000 -989.000000 0 181.700000 -989.000000 0 181.700000 -988.200000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 -989.000000 0 494.500000 -989.000000 0 494.500000 -989.800000 0 181.700000 -989.800000 0 181.700000 -989.000000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 -989.800000 0 494.500000 -989.800000 0 494.500000 -990.500000 0 181.700000 -990.500000 0 181.700000 -989.800000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 -990.500000 0 494.500000 -990.500000 0 494.500000 -991.300000 0 181.700000 -991.300000 0 181.700000 -990.500000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 -991.300000 0 494.500000 -991.300000 0 494.500000 -992.000000 0 181.700000 -992.000000 0 181.700000 -991.300000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 -992.000000 0 494.500000 -992.000000 0 494.500000 -992.800000 0 181.700000 -992.800000 0 181.700000 -992.000000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 -992.800000 0 494.500000 -992.800000 0 494.500000 -993.600000 0 181.700000 -993.600000 0 181.700000 -992.800000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 -993.600000 0 494.500000 -993.600000 0 494.500000 -994.300000 0 181.700000 -994.300000 0 181.700000 -993.600000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 -994.300000 0 494.500000 -994.300000 0 494.500000 -995.100000 0 181.700000 -995.100000 0 181.700000 -994.300000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 -995.100000 0 494.500000 -995.100000 0 494.500000 -995.800000 0 181.700000 -995.800000 0 181.700000 -995.100000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 -995.800000 0 494.500000 -995.800000 0 494.500000 -996.600000 0 181.700000 -996.600000 0 181.700000 -995.800000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 -996.600000 0 494.500000 -996.600000 0 494.500000 -997.400000 0 181.700000 -997.400000 0 181.700000 -996.600000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 -997.400000 0 494.500000 -997.400000 0 494.500000 -998.100000 0 181.700000 -998.100000 0 181.700000 -997.400000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 -998.100000 0 494.500000 -998.100000 0 494.500000 -998.900000 0 181.700000 -998.900000 0 181.700000 -998.100000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 -998.900000 0 494.500000 -998.900000 0 494.500000 -999.600000 0 181.700000 -999.600000 0 181.700000 -998.900000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 -999.600000 0 494.500000 -999.600000 0 494.500000 -1000.400000 0 181.700000 -1000.400000 0 181.700000 -999.600000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 -1000.400000 0 494.500000 -1000.400000 0 494.500000 -1001.100000 0 181.700000 -1001.100000 0 181.700000 -1000.400000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 -1001.100000 0 494.500000 -1001.100000 0 494.500000 -1001.900000 0 181.700000 -1001.900000 0 181.700000 -1001.100000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 -1001.900000 0 494.500000 -1001.900000 0 494.500000 -1002.700000 0 181.700000 -1002.700000 0 181.700000 -1001.900000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 -1002.700000 0 494.500000 -1002.700000 0 494.500000 -1003.400000 0 181.700000 -1003.400000 0 181.700000 -1002.700000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 -1003.400000 0 494.500000 -1003.400000 0 494.500000 -1004.200000 0 181.700000 -1004.200000 0 181.700000 -1003.400000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 -1004.200000 0 494.500000 -1004.200000 0 494.500000 -1004.900000 0 181.700000 -1004.900000 0 181.700000 -1004.200000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 -1004.900000 0 494.500000 -1004.900000 0 494.500000 -1005.700000 0 181.700000 -1005.700000 0 181.700000 -1004.900000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 -1005.700000 0 494.500000 -1005.700000 0 494.500000 -1006.500000 0 181.700000 -1006.500000 0 181.700000 -1005.700000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 -1006.500000 0 494.500000 -1006.500000 0 494.500000 -1007.200000 0 181.700000 -1007.200000 0 181.700000 -1006.500000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 -1007.200000 0 494.500000 -1007.200000 0 494.500000 -1008.000000 0 181.700000 -1008.000000 0 181.700000 -1007.200000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 -1008.000000 0 494.500000 -1008.000000 0 494.500000 -1008.700000 0 181.700000 -1008.700000 0 181.700000 -1008.000000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 -1008.700000 0 494.500000 -1008.700000 0 494.500000 -1009.500000 0 181.700000 -1009.500000 0 181.700000 -1008.700000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 -1009.500000 0 494.500000 -1009.500000 0 494.500000 -1010.300000 0 181.700000 -1010.300000 0 181.700000 -1009.500000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 -1010.300000 0 494.500000 -1010.300000 0 494.500000 -1011.000000 0 181.700000 -1011.000000 0 181.700000 -1010.300000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 -1011.000000 0 494.500000 -1011.000000 0 494.500000 -1011.800000 0 181.700000 -1011.800000 0 181.700000 -1011.000000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 -1011.800000 0 494.500000 -1011.800000 0 494.500000 -1012.500000 0 181.700000 -1012.500000 0 181.700000 -1011.800000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 -1012.500000 0 494.500000 -1012.500000 0 494.500000 -1013.300000 0 181.700000 -1013.300000 0 181.700000 -1012.500000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 -1013.300000 0 494.500000 -1013.300000 0 494.500000 -1014.000000 0 181.700000 -1014.000000 0 181.700000 -1013.300000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 -1014.000000 0 494.500000 -1014.000000 0 494.500000 -1014.800000 0 181.700000 -1014.800000 0 181.700000 -1014.000000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 -1014.800000 0 494.500000 -1014.800000 0 494.500000 -1015.600000 0 181.700000 -1015.600000 0 181.700000 -1014.800000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 -1015.600000 0 494.500000 -1015.600000 0 494.500000 -1016.300000 0 181.700000 -1016.300000 0 181.700000 -1015.600000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 -1016.300000 0 494.500000 -1016.300000 0 494.500000 -1017.100000 0 181.700000 -1017.100000 0 181.700000 -1016.300000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 -1017.100000 0 494.500000 -1017.100000 0 494.500000 -1017.800000 0 181.700000 -1017.800000 0 181.700000 -1017.100000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 -1017.800000 0 494.500000 -1017.800000 0 494.500000 -1018.600000 0 181.700000 -1018.600000 0 181.700000 -1017.800000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 -1018.600000 0 494.500000 -1018.600000 0 494.500000 -1019.400000 0 181.700000 -1019.400000 0 181.700000 -1018.600000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 -1019.400000 0 494.500000 -1019.400000 0 494.500000 -1020.100000 0 181.700000 -1020.100000 0 181.700000 -1019.400000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 -1020.100000 0 494.500000 -1020.100000 0 494.500000 -1020.900000 0 181.700000 -1020.900000 0 181.700000 -1020.100000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 -1020.900000 0 494.500000 -1020.900000 0 494.500000 -1021.600000 0 181.700000 -1021.600000 0 181.700000 -1020.900000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 -1021.600000 0 494.500000 -1021.600000 0 494.500000 -1022.400000 0 181.700000 -1022.400000 0 181.700000 -1021.600000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 -1022.400000 0 494.500000 -1022.400000 0 494.500000 -1023.200000 0 181.700000 -1023.200000 0 181.700000 -1022.400000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 -1023.200000 0 494.500000 -1023.200000 0 494.500000 -1023.900000 0 181.700000 -1023.900000 0 181.700000 -1023.200000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 -1023.900000 0 494.500000 -1023.900000 0 494.500000 -1024.700000 0 181.700000 -1024.700000 0 181.700000 -1023.900000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 -1024.700000 0 494.500000 -1024.700000 0 494.500000 -1025.400000 0 181.700000 -1025.400000 0 181.700000 -1024.700000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 -1025.400000 0 494.500000 -1025.400000 0 494.500000 -1026.200000 0 181.700000 -1026.200000 0 181.700000 -1025.400000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 -1026.200000 0 494.500000 -1026.200000 0 494.500000 -1026.900000 0 181.700000 -1026.900000 0 181.700000 -1026.200000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 -1026.900000 0 494.500000 -1026.900000 0 494.500000 -1027.700000 0 181.700000 -1027.700000 0 181.700000 -1026.900000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 -1027.700000 0 494.500000 -1027.700000 0 494.500000 -1028.500000 0 181.700000 -1028.500000 0 181.700000 -1027.700000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 -1028.500000 0 494.500000 -1028.500000 0 494.500000 -1029.200000 0 181.700000 -1029.200000 0 181.700000 -1028.500000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 -1029.200000 0 494.500000 -1029.200000 0 494.500000 -1030.000000 0 181.700000 -1030.000000 0 181.700000 -1029.200000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 -1030.000000 0 494.500000 -1030.000000 0 494.500000 -1030.700000 0 181.700000 -1030.700000 0 181.700000 -1030.000000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 -1030.700000 0 494.500000 -1030.700000 0 494.500000 -1031.500000 0 181.700000 -1031.500000 0 181.700000 -1030.700000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 -1031.500000 0 494.500000 -1031.500000 0 494.500000 -1032.300000 0 181.700000 -1032.300000 0 181.700000 -1031.500000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 -1032.300000 0 494.500000 -1032.300000 0 494.500000 -1033.000000 0 181.700000 -1033.000000 0 181.700000 -1032.300000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 -1033.000000 0 494.500000 -1033.000000 0 494.500000 -1033.800000 0 181.700000 -1033.800000 0 181.700000 -1033.000000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 -1033.800000 0 494.500000 -1033.800000 0 494.500000 -1034.500000 0 181.700000 -1034.500000 0 181.700000 -1033.800000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 -1034.500000 0 494.500000 -1034.500000 0 494.500000 -1035.300000 0 181.700000 -1035.300000 0 181.700000 -1034.500000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 -1035.300000 0 494.500000 -1035.300000 0 494.500000 -1036.100000 0 181.700000 -1036.100000 0 181.700000 -1035.300000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 -1036.100000 0 494.500000 -1036.100000 0 494.500000 -1036.800000 0 181.700000 -1036.800000 0 181.700000 -1036.100000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 -1036.800000 0 494.500000 -1036.800000 0 494.500000 -1037.600000 0 181.700000 -1037.600000 0 181.700000 -1036.800000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 -1037.600000 0 494.500000 -1037.600000 0 494.500000 -1038.300000 0 181.700000 -1038.300000 0 181.700000 -1037.600000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 -1038.300000 0 494.500000 -1038.300000 0 494.500000 -1039.100000 0 181.700000 -1039.100000 0 181.700000 -1038.300000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 -1039.100000 0 494.500000 -1039.100000 0 494.500000 -1039.800000 0 181.700000 -1039.800000 0 181.700000 -1039.100000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 -1039.800000 0 494.500000 -1039.800000 0 494.500000 -1040.600000 0 181.700000 -1040.600000 0 181.700000 -1039.800000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 -1040.600000 0 494.500000 -1040.600000 0 494.500000 -1041.400000 0 181.700000 -1041.400000 0 181.700000 -1040.600000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 -1041.400000 0 494.500000 -1041.400000 0 494.500000 -1042.100000 0 181.700000 -1042.100000 0 181.700000 -1041.400000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 -1042.100000 0 494.500000 -1042.100000 0 494.500000 -1042.900000 0 181.700000 -1042.900000 0 181.700000 -1042.100000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 -1042.900000 0 494.500000 -1042.900000 0 494.500000 -1043.600000 0 181.700000 -1043.600000 0 181.700000 -1042.900000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 -1043.600000 0 494.500000 -1043.600000 0 494.500000 -1044.400000 0 181.700000 -1044.400000 0 181.700000 -1043.600000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 -1044.400000 0 494.500000 -1044.400000 0 494.500000 -1045.200000 0 181.700000 -1045.200000 0 181.700000 -1044.400000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 -1045.200000 0 494.500000 -1045.200000 0 494.500000 -1045.900000 0 181.700000 -1045.900000 0 181.700000 -1045.200000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 -1045.900000 0 494.500000 -1045.900000 0 494.500000 -1046.700000 0 181.700000 -1046.700000 0 181.700000 -1045.900000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 -1046.700000 0 494.500000 -1046.700000 0 494.500000 -1047.400000 0 181.700000 -1047.400000 0 181.700000 -1046.700000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 -1047.400000 0 494.500000 -1047.400000 0 494.500000 -1048.200000 0 181.700000 -1048.200000 0 181.700000 -1047.400000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 -1048.200000 0 494.500000 -1048.200000 0 494.500000 -1049.000000 0 181.700000 -1049.000000 0 181.700000 -1048.200000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 -1049.000000 0 494.500000 -1049.000000 0 494.500000 -1049.700000 0 181.700000 -1049.700000 0 181.700000 -1049.000000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 -1049.700000 0 494.500000 -1049.700000 0 494.500000 -1050.500000 0 181.700000 -1050.500000 0 181.700000 -1049.700000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 -1050.500000 0 494.500000 -1050.500000 0 494.500000 -1051.200000 0 181.700000 -1051.200000 0 181.700000 -1050.500000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 -1051.200000 0 494.500000 -1051.200000 0 494.500000 -1052.000000 0 181.700000 -1052.000000 0 181.700000 -1051.200000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 -1052.000000 0 494.500000 -1052.000000 0 494.500000 -1052.700000 0 181.700000 -1052.700000 0 181.700000 -1052.000000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 -1052.700000 0 494.500000 -1052.700000 0 494.500000 -1053.500000 0 181.700000 -1053.500000 0 181.700000 -1052.700000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 -1053.500000 0 494.500000 -1053.500000 0 494.500000 -1054.300000 0 181.700000 -1054.300000 0 181.700000 -1053.500000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 -1054.300000 0 494.500000 -1054.300000 0 494.500000 -1055.000000 0 181.700000 -1055.000000 0 181.700000 -1054.300000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 -1055.000000 0 494.500000 -1055.000000 0 494.500000 -1055.800000 0 181.700000 -1055.800000 0 181.700000 -1055.000000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 -1055.800000 0 494.500000 -1055.800000 0 494.500000 -1056.500000 0 181.700000 -1056.500000 0 181.700000 -1055.800000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 -1056.500000 0 494.500000 -1056.500000 0 494.500000 -1057.300000 0 181.700000 -1057.300000 0 181.700000 -1056.500000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 -1057.300000 0 494.500000 -1057.300000 0 494.500000 -1058.100000 0 181.700000 -1058.100000 0 181.700000 -1057.300000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 -1058.100000 0 494.500000 -1058.100000 0 494.500000 -1058.800000 0 181.700000 -1058.800000 0 181.700000 -1058.100000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 -1058.800000 0 494.500000 -1058.800000 0 494.500000 -1059.600000 0 181.700000 -1059.600000 0 181.700000 -1058.800000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 -1059.600000 0 494.500000 -1059.600000 0 494.500000 -1060.300000 0 181.700000 -1060.300000 0 181.700000 -1059.600000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 -1060.300000 0 494.500000 -1060.300000 0 494.500000 -1061.100000 0 181.700000 -1061.100000 0 181.700000 -1060.300000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 -1061.100000 0 494.500000 -1061.100000 0 494.500000 -1061.900000 0 181.700000 -1061.900000 0 181.700000 -1061.100000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 -1061.900000 0 494.500000 -1061.900000 0 494.500000 -1062.600000 0 181.700000 -1062.600000 0 181.700000 -1061.900000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 -1062.600000 0 494.500000 -1062.600000 0 494.500000 -1063.400000 0 181.700000 -1063.400000 0 181.700000 -1062.600000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 -1063.400000 0 494.500000 -1063.400000 0 494.500000 -1064.100000 0 181.700000 -1064.100000 0 181.700000 -1063.400000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 -1064.100000 0 494.500000 -1064.100000 0 494.500000 -1064.900000 0 181.700000 -1064.900000 0 181.700000 -1064.100000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 -1064.900000 0 494.500000 -1064.900000 0 494.500000 -1065.600000 0 181.700000 -1065.600000 0 181.700000 -1064.900000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 -1065.600000 0 494.500000 -1065.600000 0 494.500000 -1066.400000 0 181.700000 -1066.400000 0 181.700000 -1065.600000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 -1066.400000 0 494.500000 -1066.400000 0 494.500000 -1067.200000 0 181.700000 -1067.200000 0 181.700000 -1066.400000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 -1067.200000 0 494.500000 -1067.200000 0 494.500000 -1067.900000 0 181.700000 -1067.900000 0 181.700000 -1067.200000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 -1067.900000 0 494.500000 -1067.900000 0 494.500000 -1068.700000 0 181.700000 -1068.700000 0 181.700000 -1067.900000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 -1068.700000 0 494.500000 -1068.700000 0 494.500000 -1069.400000 0 181.700000 -1069.400000 0 181.700000 -1068.700000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 -1069.400000 0 494.500000 -1069.400000 0 494.500000 -1070.200000 0 181.700000 -1070.200000 0 181.700000 -1069.400000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 -1070.200000 0 494.500000 -1070.200000 0 494.500000 -1071.000000 0 181.700000 -1071.000000 0 181.700000 -1070.200000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 -1071.000000 0 494.500000 -1071.000000 0 494.500000 -1071.700000 0 181.700000 -1071.700000 0 181.700000 -1071.000000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 -1071.700000 0 494.500000 -1071.700000 0 494.500000 -1072.500000 0 181.700000 -1072.500000 0 181.700000 -1071.700000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 -1072.500000 0 494.500000 -1072.500000 0 494.500000 -1073.200000 0 181.700000 -1073.200000 0 181.700000 -1072.500000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 -1073.200000 0 494.500000 -1073.200000 0 494.500000 -1074.000000 0 181.700000 -1074.000000 0 181.700000 -1073.200000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 -1074.000000 0 494.500000 -1074.000000 0 494.500000 -1074.800000 0 181.700000 -1074.800000 0 181.700000 -1074.000000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 -1074.800000 0 494.500000 -1074.800000 0 494.500000 -1075.500000 0 181.700000 -1075.500000 0 181.700000 -1074.800000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 -1075.500000 0 494.500000 -1075.500000 0 494.500000 -1076.300000 0 181.700000 -1076.300000 0 181.700000 -1075.500000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 -1076.300000 0 494.500000 -1076.300000 0 494.500000 -1077.000000 0 181.700000 -1077.000000 0 181.700000 -1076.300000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 -1077.000000 0 494.500000 -1077.000000 0 494.500000 -1077.800000 0 181.700000 -1077.800000 0 181.700000 -1077.000000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 -1077.800000 0 494.500000 -1077.800000 0 494.500000 -1078.500000 0 181.700000 -1078.500000 0 181.700000 -1077.800000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 -1078.500000 0 494.500000 -1078.500000 0 494.500000 -1079.300000 0 181.700000 -1079.300000 0 181.700000 -1078.500000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 -1079.300000 0 494.500000 -1079.300000 0 494.500000 -1080.100000 0 181.700000 -1080.100000 0 181.700000 -1079.300000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 -1080.100000 0 494.500000 -1080.100000 0 494.500000 -1080.800000 0 181.700000 -1080.800000 0 181.700000 -1080.100000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 -1080.800000 0 494.500000 -1080.800000 0 494.500000 -1081.600000 0 181.700000 -1081.600000 0 181.700000 -1080.800000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 -1081.600000 0 494.500000 -1081.600000 0 494.500000 -1082.300000 0 181.700000 -1082.300000 0 181.700000 -1081.600000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 -1082.300000 0 494.500000 -1082.300000 0 494.500000 -1083.100000 0 181.700000 -1083.100000 0 181.700000 -1082.300000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 -1083.100000 0 494.500000 -1083.100000 0 494.500000 -1083.900000 0 181.700000 -1083.900000 0 181.700000 -1083.100000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 -1083.900000 0 494.500000 -1083.900000 0 494.500000 -1084.600000 0 181.700000 -1084.600000 0 181.700000 -1083.900000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 -1084.600000 0 494.500000 -1084.600000 0 494.500000 -1085.400000 0 181.700000 -1085.400000 0 181.700000 -1084.600000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 -1085.400000 0 494.500000 -1085.400000 0 494.500000 -1086.100000 0 181.700000 -1086.100000 0 181.700000 -1085.400000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 -1086.100000 0 494.500000 -1086.100000 0 494.500000 -1086.900000 0 181.700000 -1086.900000 0 181.700000 -1086.100000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 -1086.900000 0 494.500000 -1086.900000 0 494.500000 -1087.700000 0 181.700000 -1087.700000 0 181.700000 -1086.900000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 -1087.700000 0 494.500000 -1087.700000 0 494.500000 -1088.400000 0 181.700000 -1088.400000 0 181.700000 -1087.700000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 -1088.400000 0 494.500000 -1088.400000 0 494.500000 -1089.200000 0 181.700000 -1089.200000 0 181.700000 -1088.400000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 -1089.200000 0 494.500000 -1089.200000 0 494.500000 -1089.900000 0 181.700000 -1089.900000 0 181.700000 -1089.200000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 -1089.900000 0 494.500000 -1089.900000 0 494.500000 -1090.700000 0 181.700000 -1090.700000 0 181.700000 -1089.900000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 -1090.700000 0 494.500000 -1090.700000 0 494.500000 -1091.400000 0 181.700000 -1091.400000 0 181.700000 -1090.700000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 -1091.400000 0 494.500000 -1091.400000 0 494.500000 -1092.200000 0 181.700000 -1092.200000 0 181.700000 -1091.400000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 -1092.200000 0 494.500000 -1092.200000 0 494.500000 -1093.000000 0 181.700000 -1093.000000 0 181.700000 -1092.200000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 -1093.000000 0 494.500000 -1093.000000 0 494.500000 -1093.700000 0 181.700000 -1093.700000 0 181.700000 -1093.000000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 -1093.700000 0 494.500000 -1093.700000 0 494.500000 -1094.500000 0 181.700000 -1094.500000 0 181.700000 -1093.700000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 -1094.500000 0 494.500000 -1094.500000 0 494.500000 -1095.200000 0 181.700000 -1095.200000 0 181.700000 -1094.500000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 -1095.200000 0 494.500000 -1095.200000 0 494.500000 -1096.000000 0 181.700000 -1096.000000 0 181.700000 -1095.200000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 -1096.000000 0 494.500000 -1096.000000 0 494.500000 -1096.800000 0 181.700000 -1096.800000 0 181.700000 -1096.000000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 -1096.800000 0 494.500000 -1096.800000 0 494.500000 -1097.500000 0 181.700000 -1097.500000 0 181.700000 -1096.800000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 -1097.500000 0 494.500000 -1097.500000 0 494.500000 -1098.300000 0 181.700000 -1098.300000 0 181.700000 -1097.500000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 -1098.300000 0 494.500000 -1098.300000 0 494.500000 -1099.000000 0 181.700000 -1099.000000 0 181.700000 -1098.300000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 -1099.000000 0 494.500000 -1099.000000 0 494.500000 -1099.800000 0 181.700000 -1099.800000 0 181.700000 -1099.000000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 -1099.800000 0 494.500000 -1099.800000 0 494.500000 -1100.600000 0 181.700000 -1100.600000 0 181.700000 -1099.800000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 -1100.600000 0 494.500000 -1100.600000 0 494.500000 -1101.300000 0 181.700000 -1101.300000 0 181.700000 -1100.600000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 -1101.300000 0 494.500000 -1101.300000 0 494.500000 -1102.100000 0 181.700000 -1102.100000 0 181.700000 -1101.300000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 -1102.100000 0 494.500000 -1102.100000 0 494.500000 -1102.800000 0 181.700000 -1102.800000 0 181.700000 -1102.100000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 -1102.800000 0 494.500000 -1102.800000 0 494.500000 -1103.600000 0 181.700000 -1103.600000 0 181.700000 -1102.800000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 -1103.600000 0 494.500000 -1103.600000 0 494.500000 -1104.300000 0 181.700000 -1104.300000 0 181.700000 -1103.600000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 -1104.300000 0 494.500000 -1104.300000 0 494.500000 -1105.100000 0 181.700000 -1105.100000 0 181.700000 -1104.300000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 -1105.100000 0 494.500000 -1105.100000 0 494.500000 -1105.900000 0 181.700000 -1105.900000 0 181.700000 -1105.100000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 -1105.900000 0 494.500000 -1105.900000 0 494.500000 -1106.600000 0 181.700000 -1106.600000 0 181.700000 -1105.900000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 -1106.600000 0 494.500000 -1106.600000 0 494.500000 -1107.400000 0 181.700000 -1107.400000 0 181.700000 -1106.600000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 -1107.400000 0 494.500000 -1107.400000 0 494.500000 -1108.100000 0 181.700000 -1108.100000 0 181.700000 -1107.400000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 -1108.100000 0 494.500000 -1108.100000 0 494.500000 -1108.900000 0 181.700000 -1108.900000 0 181.700000 -1108.100000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 -1108.900000 0 494.500000 -1108.900000 0 494.500000 -1109.700000 0 181.700000 -1109.700000 0 181.700000 -1108.900000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 -1109.700000 0 494.500000 -1109.700000 0 494.500000 -1110.400000 0 181.700000 -1110.400000 0 181.700000 -1109.700000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 -1110.400000 0 494.500000 -1110.400000 0 494.500000 -1111.200000 0 181.700000 -1111.200000 0 181.700000 -1110.400000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 -1111.200000 0 494.500000 -1111.200000 0 494.500000 -1111.900000 0 181.700000 -1111.900000 0 181.700000 -1111.200000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 -1111.900000 0 494.500000 -1111.900000 0 494.500000 -1112.700000 0 181.700000 -1112.700000 0 181.700000 -1111.900000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 -1112.700000 0 494.500000 -1112.700000 0 494.500000 -1113.400000 0 181.700000 -1113.400000 0 181.700000 -1112.700000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 -1113.400000 0 494.500000 -1113.400000 0 494.500000 -1114.200000 0 181.700000 -1114.200000 0 181.700000 -1113.400000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 -1114.200000 0 494.500000 -1114.200000 0 494.500000 -1115.000000 0 181.700000 -1115.000000 0 181.700000 -1114.200000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 -1115.000000 0 494.500000 -1115.000000 0 494.500000 -1115.700000 0 181.700000 -1115.700000 0 181.700000 -1115.000000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 -1115.700000 0 494.500000 -1115.700000 0 494.500000 -1116.500000 0 181.700000 -1116.500000 0 181.700000 -1115.700000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 -1116.500000 0 494.500000 -1116.500000 0 494.500000 -1117.200000 0 181.700000 -1117.200000 0 181.700000 -1116.500000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 -1117.200000 0 494.500000 -1117.200000 0 494.500000 -1118.000000 0 181.700000 -1118.000000 0 181.700000 -1117.200000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 -1118.000000 0 494.500000 -1118.000000 0 494.500000 -1118.700000 0 181.700000 -1118.700000 0 181.700000 -1118.000000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 -1118.700000 0 494.500000 -1118.700000 0 494.500000 -1119.500000 0 181.700000 -1119.500000 0 181.700000 -1118.700000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 -1119.500000 0 494.500000 -1119.500000 0 494.500000 -1120.300000 0 181.700000 -1120.300000 0 181.700000 -1119.500000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 -1120.300000 0 494.500000 -1120.300000 0 494.500000 -1121.000000 0 181.700000 -1121.000000 0 181.700000 -1120.300000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 -1121.000000 0 494.500000 -1121.000000 0 494.500000 -1121.800000 0 181.700000 -1121.800000 0 181.700000 -1121.000000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 -1121.800000 0 494.500000 -1121.800000 0 494.500000 -1122.500000 0 181.700000 -1122.500000 0 181.700000 -1121.800000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 -1122.500000 0 494.500000 -1122.500000 0 494.500000 -1123.300000 0 181.700000 -1123.300000 0 181.700000 -1122.500000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 -1123.300000 0 494.500000 -1123.300000 0 494.500000 -1124.100000 0 181.700000 -1124.100000 0 181.700000 -1123.300000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 -1124.100000 0 494.500000 -1124.100000 0 494.500000 -1124.800000 0 181.700000 -1124.800000 0 181.700000 -1124.100000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 -1124.800000 0 494.500000 -1124.800000 0 494.500000 -1125.600000 0 181.700000 -1125.600000 0 181.700000 -1124.800000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 -1125.600000 0 494.500000 -1125.600000 0 494.500000 -1126.300000 0 181.700000 -1126.300000 0 181.700000 -1125.600000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 -1126.300000 0 494.500000 -1126.300000 0 494.500000 -1127.100000 0 181.700000 -1127.100000 0 181.700000 -1126.300000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 -1127.100000 0 494.500000 -1127.100000 0 494.500000 -1127.800000 0 181.700000 -1127.800000 0 181.700000 -1127.100000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 -1127.800000 0 494.500000 -1127.800000 0 494.500000 -1128.600000 0 181.700000 -1128.600000 0 181.700000 -1127.800000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 -1128.600000 0 494.500000 -1128.600000 0 494.500000 -1129.400000 0 181.700000 -1129.400000 0 181.700000 -1128.600000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 -1129.400000 0 494.500000 -1129.400000 0 494.500000 -1130.100000 0 181.700000 -1130.100000 0 181.700000 -1129.400000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 -1130.100000 0 494.500000 -1130.100000 0 494.500000 -1130.900000 0 181.700000 -1130.900000 0 181.700000 -1130.100000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 -1130.900000 0 494.500000 -1130.900000 0 494.500000 -1131.600000 0 181.700000 -1131.600000 0 181.700000 -1130.900000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 -1131.600000 0 494.500000 -1131.600000 0 494.500000 -1132.400000 0 181.700000 -1132.400000 0 181.700000 -1131.600000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 -1132.400000 0 494.500000 -1132.400000 0 494.500000 -1133.100000 0 181.700000 -1133.100000 0 181.700000 -1132.400000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 -1133.100000 0 494.500000 -1133.100000 0 494.500000 -1133.900000 0 181.700000 -1133.900000 0 181.700000 -1133.100000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 -1133.900000 0 494.500000 -1133.900000 0 494.500000 -1134.700000 0 181.700000 -1134.700000 0 181.700000 -1133.900000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 -1134.700000 0 494.500000 -1134.700000 0 494.500000 -1135.400000 0 181.700000 -1135.400000 0 181.700000 -1134.700000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 -1135.400000 0 494.500000 -1135.400000 0 494.500000 -1136.200000 0 181.700000 -1136.200000 0 181.700000 -1135.400000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 -1136.100000 0 181.800000 -1136.100000 0 181.800000 -942.800000 0 494.400000 -942.800000 0 494.400000 -1136.100000 0 338.100000 -1136.100000 0
+strokePath subpath 1 338.100000 -1136.100000 0 181.800000 -1136.100000 0 181.800000 -942.800000 0 494.400000 -942.800000 0 494.400000 -1136.100000 0 338.100000 -1136.100000 0
+saveState
+updateCtm 11410.000000 0.000000 0.000000 -8760.000000 20530.000000 185210.000000
+drawSoftMaskedImage 1142 877 1142 877 JPEG 70955 PPM 3004618
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 -1097.076000 215.488000 -1105.076000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 -1097.076000 220.592000 -1105.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 -1097.076000 225.696000 -1105.076000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 -1097.076000 230.800000 -1105.076000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 -1104.676000 241.388000 -1112.676000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 -1104.676000 246.492000 -1112.676000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 -1104.676000 251.596000 -1112.676000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 -1104.676000 256.700000 -1112.676000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 -1112.376000 267.188000 -1120.376000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 -1112.376000 272.292000 -1120.376000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 -1112.376000 277.396000 -1120.376000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 -1112.376000 282.500000 -1120.376000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 -1119.976000 293.088000 -1127.976000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 -1119.976000 298.192000 -1127.976000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 -1119.976000 303.296000 -1127.976000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 -1119.976000 308.400000 -1127.976000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 -1082.176000 202.588000 -1090.176000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 -1062.776000 201.688000 -1070.776000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 -1043.476000 195.788000 -1051.476000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 -1043.476000 200.892000 -1051.476000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 -1024.176000 194.888000 -1032.176000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 -1024.176000 199.992000 -1032.176000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 -1004.876000 193.988000 -1012.876000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 -1004.876000 199.092000 -1012.876000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 -985.476000 193.088000 -993.476000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 -985.476000 198.192000 -993.476000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 -1113.376000 330.188000 -1121.376000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 -1113.376000 332.716000 -1121.376000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 -1113.376000 337.596000 -1121.376000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 -1113.376000 341.396000 -1121.376000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 -1113.376000 346.036000 -1121.376000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 -1113.376000 350.900000 -1121.376000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 -1113.376000 355.972000 -1121.376000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 -1113.376000 359.196000 -1121.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 -1113.376000 362.196000 -1121.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 -1113.376000 367.404000 -1121.376000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 -1113.376000 371.876000 -1121.376000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 -1113.376000 375.052000 -1121.376000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 -1093.876000 361.172000 -1101.876000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 -1093.876000 364.340000 -1101.876000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 -1093.876000 367.396000 -1101.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 -1093.876000 372.604000 -1101.876000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 -1093.876000 379.348000 -1101.876000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 -1093.876000 384.484000 -1101.876000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 -1093.876000 389.436000 -1101.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 -1093.876000 392.108000 -1101.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 -1093.876000 395.708000 -1101.876000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 -1093.876000 397.540000 -1101.876000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 -1093.876000 402.444000 -1101.876000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 -1093.876000 406.788000 -1101.876000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 -1074.376000 392.972000 -1082.376000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 -1074.376000 398.076000 -1082.376000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 -1074.376000 403.180000 -1082.376000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 -1074.376000 405.428000 -1082.376000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 -1074.376000 410.332000 -1082.376000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 -1074.376000 414.476000 -1082.376000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 -946.808000 305.808000 -960.808000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 -946.808000 314.138000 -960.808000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 -946.808000 320.788000 -960.808000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 -946.808000 328.698000 -960.808000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 -946.808000 336.972000 -960.808000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 -946.808000 344.182000 -960.808000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 -946.808000 349.810000 -960.808000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 -946.808000 354.234000 -960.808000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 -946.808000 362.718000 -960.808000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 -946.808000 367.870000 -960.808000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 -946.808000 372.322000 -960.808000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 -946.808000 382.080000 -960.808000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 -946.808000 388.772000 -960.808000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 -946.808000 397.802000 -960.808000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 -946.808000 402.254000 -960.808000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 -946.808000 407.896000 -960.808000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 -1069.700000 0 424.300000 -1069.700000 0 424.300000 -1008.900000 0 493.600000 -1008.900000 0 493.600000 -1069.700000 0 458.900000 -1069.700000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 -1018.500000 0 428.900000 -1018.500000 0 428.900000 -1012.600000 0 434.800000 -1012.600000 0 434.800000 -1018.500000 0 431.900000 -1018.500000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 -1029.600000 0 428.900000 -1029.600000 0 428.900000 -1023.600000 0 434.800000 -1023.600000 0 434.800000 -1029.600000 0 431.900000 -1029.600000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 -1040.700000 0 428.900000 -1040.700000 0 428.900000 -1034.700000 0 434.800000 -1034.700000 0 434.800000 -1040.700000 0 431.900000 -1040.700000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 -1051.800000 0 428.900000 -1051.800000 0 428.900000 -1045.800000 0 434.800000 -1045.800000 0 434.800000 -1051.800000 0 431.900000 -1051.800000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 -1062.900000 0 428.900000 -1062.900000 0 428.900000 -1056.900000 0 434.800000 -1056.900000 0 434.800000 -1062.900000 0 431.900000 -1062.900000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -1011.476000 443.288000 -1019.476000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 -1011.476000 445.816000 -1019.476000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 -1011.476000 450.600000 -1019.476000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 -1011.476000 454.496000 -1019.476000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 -1011.476000 459.136000 -1019.476000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 -1011.476000 464.000000 -1019.476000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 -1011.476000 468.976000 -1019.476000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 -1011.476000 472.304000 -1019.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 -1011.476000 475.208000 -1019.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 -1011.476000 480.520000 -1019.476000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 -1011.476000 484.992000 -1019.476000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 -1011.476000 488.168000 -1019.476000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -1022.476000 443.352000 -1030.476000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 -1022.476000 447.920000 -1030.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 -1022.476000 452.976000 -1030.476000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 -1022.476000 457.400000 -1030.476000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 -1022.476000 462.472000 -1030.476000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 -1022.476000 465.800000 -1030.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 -1022.476000 468.904000 -1030.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 -1022.476000 473.816000 -1030.476000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 -1022.476000 478.888000 -1030.476000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 -1022.476000 482.064000 -1030.476000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -1033.576000 442.872000 -1041.576000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 -1033.576000 446.040000 -1041.576000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 -1033.576000 448.992000 -1041.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 -1033.576000 454.304000 -1041.576000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 -1033.576000 461.048000 -1041.576000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 -1033.576000 466.184000 -1041.576000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 -1033.576000 471.136000 -1041.576000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 -1033.576000 473.808000 -1041.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 -1033.576000 477.408000 -1041.576000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 -1033.576000 479.240000 -1041.576000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 -1033.576000 484.144000 -1041.576000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 -1033.576000 488.488000 -1041.576000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -1044.676000 443.384000 -1052.676000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 -1044.676000 448.464000 -1052.676000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 -1044.676000 453.424000 -1052.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 -1044.676000 456.696000 -1052.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 -1044.676000 459.800000 -1052.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 -1044.676000 462.032000 -1052.676000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 -1044.676000 466.936000 -1052.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 -1044.676000 471.080000 -1052.676000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -1055.776000 443.272000 -1063.776000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 -1055.776000 448.376000 -1063.776000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 -1055.776000 453.480000 -1063.776000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 -1055.776000 455.728000 -1063.776000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 -1055.776000 460.632000 -1063.776000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 -1055.776000 464.776000 -1063.776000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -3700.800000 0 114.800000 -3700.800000 0 114.800000 -3658.000000 0 72.000000 -3658.000000 0 72.000000 -3700.800000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 449270.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 108.000000 546.200000 0 540.000000 546.200000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 546.200000 0
+eoFillPath subpath 1 108.000000 72.000000 0 540.000000 72.000000 0 540.000000 245.800000 0 108.000000 245.800000 0 108.000000 72.000000 0
+eoFillPath subpath 1 108.000000 245.800000 0 157.400000 245.800000 0 157.400000 546.200000 0 108.000000 546.200000 0 108.000000 245.800000 0
+eoFillPath subpath 1 490.500000 245.800000 0 540.000000 245.800000 0 540.000000 546.200000 0 490.500000 546.200000 0 490.500000 245.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 15740.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 108.000000 701.300000 0 540.000000 701.300000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 701.300000 0
+eoFillPath subpath 1 108.000000 76.200000 0 540.000000 76.200000 0 540.000000 90.100000 0 108.000000 90.100000 0 108.000000 76.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 108.100000 719.948000 121.892000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 121.908000 719.948000 131.364000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 131.412000 719.948000 136.484000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 136.516000 719.948000 148.532000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 148.516000 719.948000 158.292000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 158.324000 719.948000 168.452000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 168.420000 719.948000 176.740000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 176.724000 719.948000 186.564000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 186.532000 719.948000 191.604000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 191.636000 719.948000 197.396000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 197.444000 719.948000 202.516000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 202.500000 719.948000 211.700000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 210.500000 719.948000 217.076000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 217.108000 719.948000 227.236000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 227.204000 719.948000 231.636000 703.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 231.604000 719.948000 237.876000 703.948000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 672.848000 119.028000 656.848000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 118.004000 672.848000 125.892000 656.848000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.908000 672.848000 137.284000 656.848000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 137.316000 672.848000 142.788000 656.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.820000 672.848000 150.468000 656.848000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 648.336000 232.000000 636.336000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 232.000000 648.336000 239.092000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 239.104000 648.336000 245.860000 636.336000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 245.908000 648.336000 250.720000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 252.208000 648.336000 256.012000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 257.512000 648.336000 262.324000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 262.312000 648.336000 269.536000 636.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 271.108000 648.336000 274.912000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 276.412000 648.336000 281.224000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 281.212000 648.336000 288.940000 636.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 289.012000 648.336000 296.104000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 297.508000 648.336000 301.312000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 302.812000 648.336000 309.580000 636.336000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 309.616000 648.336000 316.708000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 316.720000 648.336000 324.400000 636.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 324.424000 648.336000 331.516000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 331.528000 648.336000 336.340000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 336.328000 648.336000 343.480000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 343.432000 648.336000 351.112000 636.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 351.232000 648.336000 355.060000 636.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 355.036000 648.336000 362.128000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 363.640000 648.336000 367.444000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 368.944000 648.336000 376.624000 636.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 376.648000 648.336000 383.740000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 383.752000 648.336000 391.432000 636.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 391.456000 648.336000 397.612000 636.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 399.052000 648.336000 402.856000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 404.356000 648.336000 411.508000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 411.556000 648.336000 417.292000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 417.256000 648.336000 424.348000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 425.860000 648.336000 429.664000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 431.260000 648.336000 438.412000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 439.864000 648.336000 443.668000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 445.168000 648.336000 449.608000 636.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 449.572000 648.336000 456.664000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 456.676000 648.336000 466.936000 636.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 468.472000 648.336000 472.276000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 473.872000 648.336000 479.608000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 479.572000 648.336000 486.664000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 486.676000 648.336000 494.356000 636.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 494.380000 648.336000 501.100000 636.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 501.076000 648.336000 508.804000 636.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 508.876000 648.336000 514.612000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 514.576000 648.336000 520.312000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 520.276000 648.336000 527.428000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 527.380000 648.336000 535.108000 636.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 535.084000 648.336000 539.896000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 648.336000 543.904000 636.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 634.436000 228.652000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.700000 634.436000 236.428000 622.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 236.404000 634.436000 244.084000 622.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 246.208000 634.436000 250.012000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 252.112000 634.436000 259.792000 622.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 259.816000 634.436000 263.644000 622.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 263.620000 634.436000 270.772000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 270.820000 634.436000 277.540000 622.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 277.516000 634.436000 284.776000 622.436000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 284.812000 634.436000 291.532000 622.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 291.508000 634.436000 299.236000 622.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 299.212000 634.436000 304.948000 622.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 305.008000 634.436000 310.744000 622.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 310.708000 634.436000 317.860000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 317.812000 634.436000 325.540000 622.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 325.612000 634.436000 330.424000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 332.512000 634.436000 336.316000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 338.416000 634.436000 346.096000 622.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 346.120000 634.436000 353.848000 622.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 353.824000 634.436000 359.980000 622.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 360.028000 634.436000 367.756000 622.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 367.732000 634.436000 374.824000 622.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 374.836000 634.436000 380.992000 622.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 381.040000 634.436000 384.844000 622.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.944000 634.436000 390.748000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 392.848000 634.436000 403.348000 622.436000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 403.348000 634.436000 410.440000 622.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.452000 634.436000 417.208000 622.436000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 417.256000 634.436000 422.068000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 424.156000 634.436000 427.960000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 430.060000 634.436000 434.872000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 434.860000 634.436000 442.084000 622.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 444.160000 634.436000 447.964000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 450.064000 634.436000 454.876000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 454.960000 634.436000 462.688000 622.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 462.664000 634.436000 469.756000 622.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 471.868000 634.436000 475.672000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 477.772000 634.436000 483.508000 622.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 483.472000 634.436000 491.200000 622.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 491.272000 634.436000 499.000000 622.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 498.976000 634.436000 506.656000 622.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 506.680000 634.436000 513.832000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 513.784000 634.436000 519.520000 622.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 519.580000 634.436000 527.260000 622.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 529.384000 634.436000 533.188000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 535.288000 634.436000 540.028000 622.436000 1.000000 0.000000 0.000000 1.000000 I
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 634.436000 543.904000 622.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 620.536000 229.228000 608.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 229.204000 620.536000 236.356000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 236.404000 620.536000 243.172000 608.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 243.208000 620.536000 250.300000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 251.104000 620.536000 254.908000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 255.700000 620.536000 262.852000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 262.900000 620.536000 266.728000 608.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 266.704000 620.536000 272.860000 608.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 272.908000 620.536000 280.132000 608.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 280.912000 620.536000 284.716000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 285.616000 620.536000 293.296000 608.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 293.212000 620.536000 297.040000 608.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 297.016000 620.536000 304.168000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 304.216000 620.536000 311.944000 608.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 312.016000 620.536000 316.828000 608.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 316.816000 620.536000 323.908000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 323.920000 620.536000 331.600000 608.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 332.416000 620.536000 336.220000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 337.012000 620.536000 344.164000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 340.312000 620.536000 344.116000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 351.316000 620.536000 355.120000 608.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 355.200000 620.536000 361.356000 608.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 361.404000 620.536000 366.216000 608.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 366.204000 620.536000 371.940000 608.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 371.904000 620.536000 379.056000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 379.104000 620.536000 389.364000 608.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 389.304000 620.536000 396.984000 608.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 397.008000 620.536000 404.100000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 404.112000 620.536000 409.848000 608.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 409.908000 620.536000 415.644000 608.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 415.608000 620.536000 422.376000 608.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 423.204000 620.536000 427.008000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 427.800000 620.536000 435.480000 608.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 435.504000 620.536000 442.596000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 442.608000 620.536000 450.288000 608.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 450.312000 620.536000 454.116000 608.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 454.908000 620.536000 458.712000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 459.612000 620.536000 466.332000 608.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 466.308000 620.536000 473.532000 608.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 473.508000 620.536000 480.276000 608.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 480.312000 620.536000 487.404000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 487.416000 620.536000 493.152000 608.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 493.212000 620.536000 500.304000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 500.316000 620.536000 507.996000 608.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 508.716000 620.536000 512.520000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 513.312000 620.536000 523.572000 608.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 523.608000 620.536000 527.436000 608.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 527.508000 620.536000 532.320000 608.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 532.308000 620.536000 540.036000 608.536000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 620.536000 543.904000 608.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 606.636000 229.228000 594.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 229.204000 606.636000 236.296000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.308000 606.636000 241.120000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 241.408000 606.636000 245.212000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.404000 606.636000 250.216000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 250.204000 606.636000 257.428000 594.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 257.608000 606.636000 261.412000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 261.604000 606.636000 268.864000 594.636000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 268.900000 606.636000 275.992000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 276.004000 606.636000 283.096000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 283.108000 606.636000 290.788000 594.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 291.004000 606.636000 294.808000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 295.000000 606.636000 299.812000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 299.800000 606.636000 307.528000 594.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 307.600000 606.636000 314.692000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 314.896000 606.636000 318.700000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 318.892000 606.636000 326.572000 594.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 326.488000 606.636000 330.316000 594.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 330.292000 606.636000 336.028000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 336.088000 606.636000 343.768000 594.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 343.792000 606.636000 349.948000 594.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 350.188000 606.636000 353.992000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.184000 606.636000 361.336000 594.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 361.384000 606.636000 369.112000 594.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 369.088000 606.636000 376.768000 594.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 376.888000 606.636000 380.692000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 380.992000 606.636000 384.820000 594.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 384.796000 606.636000 392.524000 594.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 392.596000 606.636000 398.752000 594.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 398.692000 606.636000 405.784000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 405.796000 606.636000 412.516000 594.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 412.492000 606.636000 417.304000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 417.388000 606.636000 423.544000 594.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 423.688000 606.636000 427.492000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 427.684000 606.636000 432.124000 594.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 432.088000 606.636000 437.824000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 437.884000 606.636000 445.108000 594.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 445.084000 606.636000 456.460000 594.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 456.688000 606.636000 460.492000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 460.684000 606.636000 466.840000 594.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 466.888000 606.636000 474.040000 594.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.992000 606.636000 485.368000 594.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 485.392000 606.636000 493.072000 594.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 493.096000 606.636000 496.924000 594.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 496.900000 606.636000 500.728000 594.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 500.704000 606.636000 508.432000 594.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 508.504000 606.636000 516.184000 594.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 516.400000 606.636000 520.204000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 520.396000 606.636000 525.208000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 525.196000 606.636000 532.924000 594.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 532.996000 606.636000 540.088000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 606.636000 543.904000 594.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 592.736000 229.180000 580.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 229.204000 592.736000 236.296000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.308000 592.736000 240.136000 580.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 240.112000 592.736000 243.940000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 244.012000 592.736000 250.732000 580.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 250.708000 592.736000 254.536000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 254.512000 592.736000 261.736000 580.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 261.712000 592.736000 269.440000 580.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 269.512000 592.736000 275.668000 580.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 276.412000 592.736000 280.216000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 281.008000 592.736000 288.688000 580.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 288.712000 592.736000 295.804000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 295.816000 592.736000 301.552000 580.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 301.612000 592.736000 307.348000 580.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 307.312000 592.736000 311.140000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 311.212000 592.736000 318.304000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 318.208000 592.736000 324.364000 580.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 324.412000 592.736000 328.216000 580.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 329.008000 592.736000 332.812000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 333.712000 592.736000 343.540000 580.736000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 343.516000 592.736000 351.244000 580.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 352.120000 592.736000 355.924000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 356.716000 592.736000 361.528000 580.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 361.516000 592.736000 369.244000 580.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 369.316000 592.736000 376.408000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 377.212000 592.736000 381.016000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 381.916000 592.736000 386.356000 580.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 386.320000 592.736000 393.472000 580.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 393.520000 592.736000 399.256000 580.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 400.024000 592.736000 403.828000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 404.620000 592.736000 411.712000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 411.724000 592.736000 419.452000 580.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 419.428000 592.736000 427.108000 580.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 427.924000 592.736000 431.728000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 432.628000 592.736000 439.852000 580.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 439.924000 592.736000 444.364000 580.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 445.120000 592.736000 448.924000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 449.716000 592.736000 454.528000 580.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 454.516000 592.736000 462.244000 580.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 462.316000 592.736000 469.408000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.212000 592.736000 474.016000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.916000 592.736000 481.684000 580.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 481.720000 592.736000 488.872000 580.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 488.824000 592.736000 494.560000 580.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 494.620000 592.736000 502.300000 580.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 503.020000 592.736000 506.824000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 507.724000 592.736000 512.536000 580.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 512.524000 592.736000 520.252000 580.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 520.324000 592.736000 527.416000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 527.428000 592.736000 533.164000 580.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 533.032000 592.736000 540.124000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.200000 592.736000 544.004000 580.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 578.836000 228.652000 566.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.700000 578.836000 234.436000 566.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 234.400000 578.836000 241.492000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 241.504000 578.836000 245.308000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.308000 578.836000 252.460000 566.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 252.508000 578.836000 256.336000 566.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 256.312000 578.836000 262.468000 566.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 262.516000 578.836000 269.740000 566.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 269.716000 578.836000 273.520000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 273.520000 578.836000 280.672000 566.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 280.720000 578.836000 284.524000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 284.524000 578.836000 288.964000 566.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 288.928000 578.836000 296.020000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 296.032000 578.836000 306.292000 566.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 306.328000 578.836000 310.132000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 310.132000 578.836000 320.392000 566.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 320.428000 578.836000 324.256000 566.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 324.232000 578.836000 328.060000 566.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 328.036000 578.836000 335.716000 566.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 335.740000 578.836000 339.544000 566.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 339.500000 578.836000 347.180000 566.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 347.204000 578.836000 351.032000 566.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 351.008000 578.836000 358.160000 566.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 358.208000 578.836000 364.928000 566.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 364.904000 578.836000 372.164000 566.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 372.200000 578.836000 379.880000 566.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 379.904000 578.836000 386.996000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 387.008000 578.836000 392.744000 566.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.708000 578.836000 398.444000 566.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 398.408000 578.836000 405.176000 566.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 405.212000 578.836000 409.016000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 409.016000 578.836000 416.696000 566.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 416.720000 578.836000 424.448000 566.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 424.424000 578.836000 430.580000 566.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 430.628000 578.836000 438.356000 566.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 438.332000 578.836000 445.424000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 445.436000 578.836000 451.592000 566.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 451.640000 578.836000 455.444000 566.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 558.936000 225.304000 546.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 228.604000 558.936000 237.268000 546.936000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 237.208000 558.936000 244.936000 546.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 246.508000 558.936000 250.312000 546.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 252.004000 558.936000 259.228000 546.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 259.204000 558.936000 265.972000 546.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 266.008000 558.936000 273.100000 546.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 273.112000 558.936000 278.848000 546.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 278.812000 558.936000 285.580000 546.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 285.616000 558.936000 289.444000 546.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 289.516000 558.936000 296.608000 546.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 296.620000 558.936000 306.880000 546.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 308.524000 558.936000 312.328000 546.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 313.924000 558.936000 321.148000 546.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 321.124000 558.936000 325.564000 546.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 327.124000 558.936000 330.928000 546.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 332.728000 558.936000 337.540000 546.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 337.528000 558.936000 345.256000 546.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 345.328000 558.936000 352.420000 546.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 353.932000 558.936000 357.736000 546.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 359.332000 558.936000 363.772000 546.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 363.736000 558.936000 369.472000 546.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 369.532000 558.936000 377.260000 546.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 377.236000 558.936000 381.064000 546.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 381.040000 558.936000 385.852000 546.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 387.544000 558.936000 391.348000 546.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 393.040000 558.936000 400.768000 546.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 400.744000 558.936000 407.896000 546.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 407.944000 558.936000 413.680000 546.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 413.644000 558.936000 420.412000 546.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 420.448000 558.936000 427.540000 546.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 427.552000 558.936000 433.708000 546.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 433.756000 558.936000 438.568000 546.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 438.556000 558.936000 444.712000 546.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 446.260000 558.936000 450.064000 546.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 451.756000 558.936000 456.196000 546.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 456.160000 558.936000 461.896000 546.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 461.860000 558.936000 469.084000 546.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 469.156000 558.936000 480.532000 546.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 482.056000 558.936000 485.860000 546.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 487.552000 558.936000 495.232000 546.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 495.256000 558.936000 500.992000 546.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 501.052000 558.936000 508.144000 546.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 508.156000 558.936000 514.924000 546.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 514.852000 558.936000 518.680000 546.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 518.656000 558.936000 525.880000 546.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 525.952000 558.936000 533.680000 546.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 533.656000 558.936000 539.812000 546.936000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 558.936000 543.904000 546.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 545.036000 228.268000 533.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 228.304000 545.036000 235.396000 533.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 235.408000 545.036000 242.560000 533.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 242.608000 545.036000 248.344000 533.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 248.308000 545.036000 254.464000 533.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 254.512000 545.036000 258.316000 533.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 258.316000 545.036000 262.996000 533.036000 1.000000 0.000000 0.000000 1.000000 (
+drawChar 263.020000 545.036000 270.700000 533.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 270.724000 545.036000 277.948000 533.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 277.924000 545.036000 285.652000 533.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 285.628000 545.036000 293.356000 533.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 293.332000 545.036000 301.012000 533.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 301.036000 545.036000 307.192000 533.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 307.240000 545.036000 311.920000 533.036000 1.000000 0.000000 0.000000 1.000000 )
+drawChar 311.944000 545.036000 315.976000 533.036000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 113 1 0 1 0 1200.000000 13600 GAAAAA+DejaVuSerif-BoldItalic
+drawChar 268.800000 503.656000 277.308000 491.656000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 277.104000 503.656000 283.416000 491.656000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 283.404000 503.656000 292.128000 491.656000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 292.104000 503.656000 296.652000 491.656000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 296.700000 503.656000 302.232000 491.656000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 113 1 0 1 0 1200.000000 0 GAAAAA+DejaVuSerif-BoldItalic
+drawChar 358.700000 503.656000 367.040000 491.656000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 367.004000 503.656000 375.344000 491.656000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 375.308000 503.656000 383.648000 491.656000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 383.612000 503.656000 391.952000 491.656000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 113 1 0 1 0 1200.000000 0 GAAAAA+DejaVuSerif-BoldItalic
+drawChar 403.000000 503.656000 411.340000 491.656000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 411.304000 503.656000 419.644000 491.656000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 419.608000 503.656000 427.948000 491.656000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 427.912000 503.656000 436.252000 491.656000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 113 1 0 1 0 1200.000000 0 GAAAAA+DejaVuSerif-BoldItalic
+drawChar 447.200000 503.656000 455.540000 491.656000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 455.504000 503.656000 463.844000 491.656000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 463.808000 503.656000 472.148000 491.656000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 472.112000 503.656000 480.452000 491.656000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 113 1 0 1 0 1200.000000 0 GAAAAA+DejaVuSerif-BoldItalic
+drawChar 491.000000 503.656000 499.340000 491.656000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 499.304000 503.656000 507.644000 491.656000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 507.608000 503.656000 515.948000 491.656000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 515.912000 503.656000 524.252000 491.656000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 219.800000 486.836000 228.608000 474.836000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 228.596000 486.836000 232.424000 474.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 232.400000 486.836000 239.552000 474.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 239.600000 486.836000 246.320000 474.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 246.296000 486.836000 253.556000 474.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 253.592000 486.836000 260.312000 474.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 260.288000 486.836000 268.016000 474.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 267.992000 486.836000 273.728000 474.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 273.692000 486.836000 279.428000 474.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 279.392000 486.836000 286.544000 474.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 286.592000 486.836000 294.320000 474.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 294.296000 486.836000 299.108000 474.836000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 377.600000 486.836000 385.232000 474.836000 1.000000 0.000000 0.000000 1.000000 6
+drawChar 385.196000 486.836000 389.000000 474.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 389.000000 486.836000 396.632000 474.836000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 421.900000 486.836000 429.532000 474.836000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 429.496000 486.836000 433.300000 474.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 433.300000 486.836000 440.932000 474.836000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 466.100000 486.836000 473.732000 474.836000 1.000000 0.000000 0.000000 1.000000 4
+drawChar 473.696000 486.836000 477.500000 474.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 477.500000 486.836000 485.132000 474.836000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 509.500000 486.836000 517.132000 474.836000 1.000000 0.000000 0.000000 1.000000 8
+drawChar 517.096000 486.836000 520.900000 474.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 520.900000 486.836000 528.532000 474.836000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 219.800000 470.036000 228.824000 458.036000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 228.800000 470.036000 235.892000 458.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 235.904000 470.036000 243.584000 458.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 243.608000 470.036000 250.328000 458.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 250.304000 470.036000 258.032000 458.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 258.008000 470.036000 263.744000 458.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 263.708000 470.036000 269.444000 458.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 269.408000 470.036000 276.560000 458.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 276.608000 470.036000 284.336000 458.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 284.312000 470.036000 289.124000 458.036000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 377.600000 470.036000 385.232000 458.036000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 385.196000 470.036000 389.000000 458.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 389.000000 470.036000 396.632000 458.036000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 421.900000 470.036000 429.532000 458.036000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 429.496000 470.036000 433.300000 458.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 433.300000 470.036000 440.932000 458.036000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 466.100000 470.036000 473.732000 458.036000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 473.696000 470.036000 477.500000 458.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 477.500000 470.036000 485.132000 458.036000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 509.500000 470.036000 517.132000 458.036000 1.000000 0.000000 0.000000 1.000000 4
+drawChar 517.096000 470.036000 520.900000 458.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 520.900000 470.036000 528.532000 458.036000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 219.800000 453.336000 228.020000 441.336000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 227.996000 453.336000 232.808000 441.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 232.796000 453.336000 238.532000 441.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 238.496000 453.336000 245.648000 441.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 245.696000 453.336000 255.956000 441.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 255.992000 453.336000 263.672000 441.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 263.696000 453.336000 270.788000 441.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 270.800000 453.336000 276.536000 441.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 276.500000 453.336000 282.236000 441.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 282.200000 453.336000 286.028000 441.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 286.004000 453.336000 293.096000 441.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 293.108000 453.336000 299.264000 441.336000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 370.000000 453.336000 377.632000 441.336000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 377.596000 453.336000 385.228000 441.336000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 385.192000 453.336000 388.996000 441.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 388.996000 453.336000 396.628000 441.336000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 421.900000 453.336000 429.532000 441.336000 1.000000 0.000000 0.000000 1.000000 6
+drawChar 429.496000 453.336000 433.300000 441.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 433.300000 453.336000 440.932000 441.336000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 466.100000 453.336000 473.732000 441.336000 1.000000 0.000000 0.000000 1.000000 6
+drawChar 473.696000 453.336000 477.500000 441.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 477.500000 453.336000 485.132000 441.336000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 509.500000 453.336000 517.132000 441.336000 1.000000 0.000000 0.000000 1.000000 8
+drawChar 517.096000 453.336000 520.900000 441.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 520.900000 453.336000 528.532000 441.336000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 219.800000 436.536000 228.980000 424.536000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 229.004000 436.536000 236.732000 424.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 236.708000 436.536000 243.800000 424.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 243.812000 436.536000 249.548000 424.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 249.512000 436.536000 255.248000 424.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 255.212000 436.536000 259.040000 424.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 259.016000 436.536000 266.108000 424.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 266.120000 436.536000 272.276000 424.536000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 377.600000 436.536000 385.232000 424.536000 1.000000 0.000000 0.000000 1.000000 6
+drawChar 385.196000 436.536000 389.000000 424.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 389.000000 436.536000 396.632000 424.536000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 421.900000 436.536000 429.532000 424.536000 1.000000 0.000000 0.000000 1.000000 6
+drawChar 429.496000 436.536000 433.300000 424.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 433.300000 436.536000 440.932000 424.536000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 466.100000 436.536000 473.732000 424.536000 1.000000 0.000000 0.000000 1.000000 6
+drawChar 473.696000 436.536000 477.500000 424.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 477.500000 436.536000 485.132000 424.536000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 509.500000 436.536000 517.132000 424.536000 1.000000 0.000000 0.000000 1.000000 6
+drawChar 517.096000 436.536000 520.900000 424.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 520.900000 436.536000 528.532000 424.536000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 219.800000 419.836000 228.464000 407.836000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 228.500000 419.836000 236.180000 407.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 236.204000 419.836000 243.884000 407.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 243.908000 419.836000 247.736000 407.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 247.712000 419.836000 254.804000 407.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 254.816000 419.836000 260.972000 407.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 370.000000 419.836000 377.632000 407.836000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 377.596000 419.836000 385.228000 407.836000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 385.192000 419.836000 388.996000 407.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 388.996000 419.836000 396.628000 407.836000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 414.300000 419.836000 421.932000 407.836000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 421.896000 419.836000 429.528000 407.836000 1.000000 0.000000 0.000000 1.000000 8
+drawChar 429.492000 419.836000 433.296000 407.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 433.296000 419.836000 440.928000 407.836000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 458.500000 419.836000 466.132000 407.836000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 466.096000 419.836000 473.728000 407.836000 1.000000 0.000000 0.000000 1.000000 8
+drawChar 473.692000 419.836000 477.496000 407.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 477.496000 419.836000 485.128000 407.836000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 501.900000 419.836000 509.532000 407.836000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 509.496000 419.836000 517.128000 407.836000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 517.092000 419.836000 520.896000 407.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 520.896000 419.836000 528.528000 407.836000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 108.100000 90.136000 116.164000 78.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 115.600000 90.136000 122.752000 78.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 122.800000 90.136000 130.480000 78.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 130.504000 90.136000 137.596000 78.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.608000 90.136000 141.412000 78.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 141.400000 90.136000 149.032000 78.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 148.996000 90.136000 156.628000 78.136000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 218.200000 488.200000 0 529.900000 488.200000 0 529.900000 488.300000 0 218.200000 488.300000 0 218.200000 488.200000 0
+eoFillPath subpath 1 353.800000 404.400000 0 353.900000 404.400000 0 353.900000 505.200000 0 353.800000 505.200000 0 353.800000 404.400000 0
+eoFillPath subpath 1 398.000000 404.400000 0 398.100000 404.400000 0 398.100000 505.200000 0 398.000000 505.200000 0 398.000000 404.400000 0
+eoFillPath subpath 1 442.200000 404.400000 0 442.300000 404.400000 0 442.300000 505.200000 0 442.200000 505.200000 0 442.200000 404.400000 0
+eoFillPath subpath 1 486.400000 404.400000 0 486.500000 404.400000 0 486.500000 505.200000 0 486.400000 505.200000 0 486.400000 404.400000 0
+eoFillPath subpath 1 218.200000 471.400000 0 529.900000 471.400000 0 529.900000 471.500000 0 218.200000 471.500000 0 218.200000 471.400000 0
+eoFillPath subpath 1 218.200000 454.700000 0 529.900000 454.700000 0 529.900000 454.800000 0 218.200000 454.800000 0 218.200000 454.700000 0
+eoFillPath subpath 1 218.200000 437.900000 0 529.900000 437.900000 0 529.900000 438.000000 0 218.200000 438.000000 0 218.200000 437.900000 0
+eoFillPath subpath 1 218.200000 421.200000 0 529.900000 421.200000 0 529.900000 421.300000 0 218.200000 421.300000 0 218.200000 421.200000 0
+eoFillPath subpath 1 218.200000 404.400000 0 218.300000 404.400000 0 218.300000 505.200000 0 218.200000 505.200000 0 218.200000 404.400000 0
+eoFillPath subpath 1 218.200000 505.100000 0 529.900000 505.100000 0 529.900000 505.200000 0 218.200000 505.200000 0 218.200000 505.100000 0
+eoFillPath subpath 1 529.800000 404.400000 0 529.900000 404.400000 0 529.900000 505.200000 0 529.800000 505.200000 0 529.800000 404.400000 0
+eoFillPath subpath 1 218.200000 404.400000 0 529.900000 404.400000 0 529.900000 404.500000 0 218.200000 404.500000 0 218.200000 404.400000 0
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 9971.200000 0 477.900000 9971.200000 0 477.900000 10281.000000 0 134.300000 10281.000000 0 134.300000 9971.200000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -917930.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 6982.200000 0 168.100000 6982.200000 0 168.100000 6987.200000 0 76.900000 6987.200000 0 76.900000 6982.200000 0
+eoFillPath subpath 1 163.100000 6987.100000 0 168.100000 6987.100000 0 168.100000 7117.700000 0 163.100000 7117.700000 0 163.100000 6987.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 6987.200000 0 163.100000 6987.200000 0 163.100000 7122.600000 0 72.000000 7122.600000 0 72.000000 6987.200000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 7118.280000 87.320000 7108.280000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 7118.280000 93.420000 7108.280000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 7118.280000 97.510000 7108.280000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 7118.280000 101.420000 7108.280000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 7118.280000 104.170000 7108.280000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 7118.280000 110.530000 7108.280000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 7118.280000 113.270000 7108.280000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 7118.280000 116.470000 7108.280000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 7118.280000 123.480000 7108.280000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 7118.280000 129.610000 7108.280000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 7118.280000 135.090000 7108.280000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 7118.280000 140.890000 7108.280000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 7118.280000 144.820000 7108.280000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 7118.280000 150.920000 7108.280000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 7118.280000 153.670000 7108.280000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 7118.280000 156.470000 7108.280000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 6991.400000 0 168.200000 6991.400000 0 168.200000 7106.600000 0 72.000000 7106.600000 0 72.000000 6991.400000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7059.552000 79.253000 7050.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 7059.552000 86.669000 7050.552000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 7059.552000 90.215000 7050.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 7059.552000 93.077000 7050.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 7059.552000 97.406000 7050.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 7059.552000 100.853000 7050.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 7059.552000 107.324000 7050.552000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 7059.552000 112.337000 7050.552000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 7059.552000 115.271000 7050.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 7059.552000 118.655000 7050.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 7059.552000 126.512000 7050.552000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 7059.552000 130.805000 7050.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 7059.552000 135.881000 7050.552000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 7059.552000 139.355000 7050.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 7059.552000 147.284000 7050.552000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 7059.552000 150.074000 7050.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 7059.552000 155.897000 7050.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 7059.552000 158.750000 7050.552000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 7059.552000 161.853000 7050.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7049.052000 82.124000 7040.052000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 7049.052000 87.137000 7040.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 7049.052000 90.071000 7040.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 7049.052000 93.356000 7040.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 7049.052000 100.403000 7040.052000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 7049.052000 104.921000 7040.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 7049.052000 109.205000 7040.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 7049.052000 117.737000 7040.052000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 7049.052000 123.119000 7040.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 7049.052000 128.996000 7040.052000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 7049.052000 132.605000 7040.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 7049.052000 138.392000 7040.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 7049.052000 141.749000 7040.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 7049.052000 149.507000 7040.052000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 7049.052000 153.800000 7040.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 7049.052000 158.876000 7040.052000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 7049.052000 161.853000 7040.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7038.552000 81.764000 7029.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 7038.552000 87.596000 7029.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 7038.552000 93.356000 7029.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 7038.552000 102.050000 7029.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 7038.552000 113.822000 7029.552000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 7038.552000 122.651000 7029.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 7038.552000 134.117000 7029.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 7038.552000 138.401000 7029.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 7038.552000 147.149000 7029.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 7038.552000 158.921000 7029.552000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 7038.552000 161.853000 7029.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7028.052000 79.271000 7019.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 7028.052000 84.338000 7019.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 7028.052000 89.621000 7019.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 7028.052000 94.643000 7019.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 7028.052000 100.502000 7019.052000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 7028.052000 106.262000 7019.052000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 7028.052000 111.518000 7019.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 7028.052000 116.216000 7019.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 7028.052000 119.249000 7019.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 7028.052000 122.363000 7019.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 7028.052000 128.186000 7019.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 7028.052000 131.345000 7019.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 7028.052000 137.060000 7019.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 7028.052000 140.147000 7019.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 7028.052000 145.007000 7019.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 7028.052000 148.598000 7019.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 7028.052000 151.460000 7019.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 7028.052000 155.789000 7019.052000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 7028.052000 158.933000 7019.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7017.552000 80.702000 7008.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 7017.552000 83.573000 7008.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 7017.552000 89.396000 7008.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 7017.552000 95.156000 7008.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 7017.552000 100.547000 7008.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 7017.552000 109.052000 7008.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 7017.552000 111.959000 7008.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 7017.552000 117.251000 7008.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 7017.552000 121.904000 7008.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 7017.552000 126.503000 7008.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 7017.552000 129.338000 7008.552000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 7017.552000 134.936000 7008.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 7017.552000 143.441000 7008.552000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 7017.552000 148.796000 7008.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 7017.552000 154.574000 7008.552000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 7017.552000 158.876000 7008.552000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 7017.552000 161.853000 7008.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7007.052000 79.271000 6998.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 7007.052000 85.094000 6998.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 7007.052000 88.703000 6998.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 7007.052000 94.112000 6998.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 7007.052000 97.244000 6998.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 7007.052000 103.058000 6998.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 7007.052000 108.890000 6998.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 7007.052000 111.950000 6998.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 7007.052000 115.271000 6998.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 7007.052000 120.338000 6998.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 7007.052000 125.621000 6998.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 7007.052000 131.363000 6998.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 7007.052000 134.558000 6998.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 7007.052000 140.048000 6998.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 7007.052000 145.430000 6998.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 7007.052000 150.551000 6998.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 7007.052000 155.960000 6998.052000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 7007.052000 158.933000 6998.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6996.552000 80.009000 6987.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 6996.552000 85.364000 6987.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 6996.552000 88.271000 6987.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 6996.552000 91.169000 6987.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 6996.552000 97.955000 6987.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 6996.552000 107.765000 6987.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 6996.552000 110.672000 6987.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 6996.552000 115.964000 6987.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 6996.552000 120.617000 6987.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 6996.552000 125.216000 6987.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 6996.552000 128.051000 6987.552000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 6996.552000 134.954000 6987.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 6996.552000 146.285000 6987.552000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 6996.552000 151.667000 6987.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 6996.552000 155.906000 6987.552000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 6996.552000 159.033000 6987.552000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 6987.100000 0 72.100000 6987.100000 0 72.100000 7122.600000 0 72.000000 7122.600000 0 72.000000 6987.100000 0
+eoFillPath subpath 1 163.100000 6987.100000 0 163.200000 6987.100000 0 163.200000 7122.600000 0 163.100000 7122.600000 0 163.100000 6987.100000 0
+eoFillPath subpath 1 72.000000 7122.500000 0 163.200000 7122.500000 0 163.200000 7122.600000 0 72.000000 7122.600000 0 72.000000 7122.500000 0
+eoFillPath subpath 1 72.000000 6987.100000 0 163.200000 6987.100000 0 163.200000 6987.200000 0 72.000000 6987.200000 0 72.000000 6987.100000 0
+saveState
+eoClipPath subpath 1 96.900000 7062.400000 0 138.300000 7062.400000 0 138.300000 7106.600000 0 96.900000 7106.600000 0 96.900000 7062.400000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -627050.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 6707.600000 0 165.500000 6707.600000 0 165.500000 6712.600000 0 76.900000 6712.600000 0 76.900000 6707.600000 0
+eoFillPath subpath 1 160.500000 6712.500000 0 165.500000 6712.500000 0 165.500000 6868.800000 0 160.500000 6868.800000 0 160.500000 6712.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 6712.600000 0 121.400000 6712.600000 0 121.400000 6873.700000 0 72.000000 6873.700000 0 72.000000 6712.600000 0
+saveState
+eoClipPath subpath 1 72.000000 6712.500000 0 160.500000 6712.500000 0 160.500000 6873.600000 0 72.000000 6873.600000 0 72.000000 6712.500000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -590350.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 6869.380000 89.280000 6859.380000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 6869.380000 95.630000 6859.380000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 6869.380000 99.520000 6859.380000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 6869.380000 102.270000 6859.380000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 6869.380000 108.450000 6859.380000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 6869.380000 112.610000 6859.380000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 6869.380000 118.510000 6859.380000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 6869.380000 121.670000 6859.380000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 6869.380000 124.470000 6859.380000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 6869.380000 130.830000 6859.380000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 6869.380000 133.970000 6859.380000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 6869.380000 137.920000 6859.380000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 6869.380000 144.230000 6859.380000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 6869.380000 150.350000 6859.380000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 6869.380000 153.570000 6859.380000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 6857.680000 95.000000 6847.680000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 6857.680000 97.770000 6847.680000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 6857.680000 103.000000 6847.680000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 6857.680000 109.330000 6847.680000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 6857.680000 117.470000 6847.680000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 6857.680000 123.620000 6847.680000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 6857.680000 128.800000 6847.680000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 6857.680000 135.130000 6847.680000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 6857.680000 141.250000 6847.680000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 6857.680000 145.410000 6847.680000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6842.852000 82.961000 6833.852000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 6842.852000 87.614000 6833.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 6842.852000 93.356000 6833.852000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 6842.852000 98.612000 6833.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 6842.852000 103.733000 6833.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 6842.852000 106.568000 6833.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 6842.852000 111.959000 6833.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 6842.852000 114.866000 6833.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 6842.852000 117.665000 6833.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 6842.852000 122.768000 6833.852000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 6842.852000 125.747000 6833.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 6842.852000 131.651000 6833.852000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 6842.852000 136.907000 6833.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 6842.852000 142.307000 6833.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 6842.852000 148.049000 6833.852000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 6842.852000 150.956000 6833.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 6842.852000 156.302000 6833.852000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 6842.852000 159.253000 6833.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6832.352000 84.095000 6823.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 6832.352000 89.900000 6823.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 6832.352000 95.318000 6823.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 6832.352000 100.349000 6823.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 6832.352000 110.789000 6823.352000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 6832.352000 111.464000 6823.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 6832.352000 114.362000 6823.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 6832.352000 119.348000 6823.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 6832.352000 126.962000 6823.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 6832.352000 132.047000 6823.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 6832.352000 139.958000 6823.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 6832.352000 142.865000 6823.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 6832.352000 147.410000 6823.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 6832.352000 153.287000 6823.352000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 6832.352000 156.333000 6823.352000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6821.852000 84.095000 6812.852000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 6821.852000 89.468000 6812.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 6821.852000 94.121000 6812.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 6821.852000 99.899000 6812.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 6821.852000 105.218000 6812.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 6821.852000 109.502000 6812.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 6821.852000 115.649000 6812.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 6821.852000 122.327000 6812.852000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 6821.852000 127.718000 6812.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 6821.852000 132.002000 6812.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 6821.852000 138.149000 6812.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 6821.852000 145.205000 6812.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 6821.852000 150.992000 6812.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 6821.852000 156.311000 6812.852000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 6821.852000 159.253000 6812.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6811.352000 82.394000 6802.352000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 6811.352000 86.705000 6802.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 6811.352000 91.322000 6802.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 6811.352000 94.913000 6802.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 6811.352000 98.054000 6802.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 6811.352000 102.014000 6802.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 6811.352000 104.876000 6802.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 6811.352000 113.435000 6802.352000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 6811.352000 118.718000 6802.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 6811.352000 121.949000 6802.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 6811.352000 125.063000 6802.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 6811.352000 130.886000 6802.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 6811.352000 134.045000 6802.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 6811.352000 138.005000 6802.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 6811.352000 143.792000 6802.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 6811.352000 149.111000 6802.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 6811.352000 151.964000 6802.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 6811.352000 156.293000 6802.352000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 6811.352000 159.153000 6802.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6800.852000 79.271000 6791.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 6800.852000 82.169000 6791.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 6800.852000 85.526000 6791.852000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 6800.852000 90.818000 6791.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 6800.852000 94.454000 6791.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 6800.852000 99.008000 6791.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 6800.852000 104.318000 6791.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 6800.852000 110.096000 6791.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 6800.852000 115.856000 6791.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 6800.852000 119.546000 6791.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 6800.852000 124.001000 6791.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 6800.852000 129.509000 6791.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 6800.852000 133.145000 6791.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 6800.852000 139.751000 6791.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 6800.852000 145.205000 6791.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 6800.852000 148.841000 6791.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 6800.852000 152.657000 6791.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 6800.852000 156.293000 6791.852000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 6800.852000 159.253000 6791.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6790.352000 84.095000 6781.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 6790.352000 88.406000 6781.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 6790.352000 93.824000 6781.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 6790.352000 99.602000 6781.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 6790.352000 105.362000 6781.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 6790.352000 108.422000 6781.352000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 6790.352000 116.747000 6781.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 6790.352000 129.275000 6781.352000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 6790.352000 135.089000 6781.352000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 6790.352000 138.698000 6781.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 6790.352000 141.560000 6781.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 6790.352000 146.906000 6781.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 6790.352000 151.190000 6781.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 6790.352000 156.266000 6781.352000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 6790.352000 159.253000 6781.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6779.852000 82.196000 6770.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 6779.852000 87.560000 6770.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 6779.852000 92.213000 6770.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 6779.852000 96.551000 6770.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 6779.852000 101.708000 6770.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 6779.852000 107.216000 6770.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 6779.852000 111.653000 6770.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 6779.852000 118.961000 6770.852000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 6779.852000 124.316000 6770.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 6779.852000 128.654000 6770.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 6779.852000 133.172000 6770.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 6779.852000 138.995000 6770.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 6779.852000 143.612000 6770.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 6779.852000 148.913000 6770.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 6779.852000 153.197000 6770.852000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 6779.852000 156.333000 6770.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6769.352000 80.009000 6760.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 6769.352000 85.319000 6760.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 6769.352000 91.061000 6760.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 6769.352000 100.052000 6760.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 6769.352000 113.993000 6760.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 6769.352000 116.873000 6760.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 6769.352000 120.410000 6760.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 6769.352000 126.296000 6760.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 6769.352000 135.350000 6760.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 6769.352000 145.106000 6760.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 6769.352000 150.893000 6760.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 6769.352000 156.212000 6760.352000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 6769.352000 159.253000 6760.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6758.852000 82.196000 6749.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 6758.852000 87.560000 6749.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 6758.852000 93.392000 6749.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 6758.852000 99.152000 6749.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 6758.852000 101.960000 6749.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 6758.852000 107.306000 6749.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 6758.852000 111.905000 6749.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 6758.852000 115.640000 6749.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 6758.852000 122.444000 6749.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 6758.852000 127.898000 6749.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 6758.852000 135.575000 6749.852000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 6758.852000 141.380000 6749.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 6758.852000 145.241000 6749.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 6758.852000 150.803000 6749.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 6758.852000 156.302000 6749.852000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 6758.852000 159.253000 6749.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6748.352000 80.009000 6739.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 6748.352000 85.796000 6739.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 6748.352000 91.115000 6739.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 6748.352000 95.399000 6739.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 6748.352000 100.718000 6739.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 6748.352000 107.054000 6739.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 6748.352000 118.097000 6739.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 6748.352000 123.524000 6739.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 6748.352000 129.401000 6739.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 6748.352000 131.768000 6739.352000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 6748.352000 135.413000 6739.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 6748.352000 141.659000 6739.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 6748.352000 150.965000 6739.352000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 6748.352000 156.320000 6739.352000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 6748.352000 159.253000 6739.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6737.852000 81.017000 6728.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 6737.852000 84.608000 6728.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 6737.852000 89.963000 6728.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 6737.852000 92.870000 6728.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 6737.852000 98.693000 6728.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 6737.852000 103.310000 6728.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 6737.852000 107.243000 6728.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 6737.852000 116.081000 6728.852000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 6737.852000 121.886000 6728.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 6737.852000 127.205000 6728.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 6737.852000 132.983000 6728.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 6737.852000 136.943000 6728.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 6737.852000 143.846000 6728.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 6737.852000 148.184000 6728.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 6737.852000 153.260000 6728.852000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 6737.852000 156.433000 6728.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6727.352000 79.271000 6718.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 6727.352000 85.094000 6718.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 6727.352000 90.854000 6718.352000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 6727.352000 93.653000 6718.352000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 6712.500000 0 72.100000 6712.500000 0 72.100000 6873.700000 0 72.000000 6873.700000 0 72.000000 6712.500000 0
+eoFillPath subpath 1 160.500000 6712.500000 0 160.600000 6712.500000 0 160.600000 6873.700000 0 160.500000 6873.700000 0 160.500000 6712.500000 0
+eoFillPath subpath 1 72.000000 6873.600000 0 160.600000 6873.600000 0 160.600000 6873.700000 0 72.000000 6873.700000 0 72.000000 6873.600000 0
+eoFillPath subpath 1 72.000000 6712.500000 0 160.600000 6712.500000 0 160.600000 6712.600000 0 72.000000 6712.600000 0 72.000000 6712.500000 0
+saveState
+eoClipPath subpath 1 108.000000 6225.100000 0 178.900000 6225.100000 0 178.900000 6281.800000 0 108.000000 6281.800000 0 108.000000 6225.100000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -543320.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 2166.800000 0 165.500000 2166.800000 0 165.500000 2171.800000 0 76.900000 2171.800000 0 76.900000 2166.800000 0
+eoFillPath subpath 1 160.500000 2171.700000 0 165.500000 2171.700000 0 165.500000 2280.500000 0 160.500000 2280.500000 0 160.500000 2171.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 2171.800000 0 160.500000 2171.800000 0 160.500000 2285.400000 0 72.000000 2285.400000 0 72.000000 2171.800000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2281.052000 83.771000 2272.052000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 2281.052000 89.594000 2272.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 2281.052000 92.465000 2272.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 2281.052000 97.568000 2272.052000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 2281.052000 100.943000 2272.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 2281.052000 106.955000 2272.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 2281.052000 110.447000 2272.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 2281.052000 114.425000 2272.052000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 2281.052000 119.717000 2272.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 2281.052000 127.493000 2272.052000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 2281.052000 130.949000 2272.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 2281.052000 136.574000 2272.052000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 2281.052000 141.920000 2272.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 2281.052000 147.365000 2272.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 2281.052000 151.703000 2272.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 2281.052000 156.320000 2272.052000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 2281.052000 159.153000 2272.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2270.552000 81.764000 2261.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 2270.552000 85.130000 2261.552000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 2270.552000 88.712000 2261.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 2270.552000 94.022000 2261.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 2270.552000 98.306000 2261.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 2270.552000 102.455000 2261.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 2270.552000 106.676000 2261.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 2270.552000 110.312000 2261.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 2270.552000 114.920000 2261.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 2270.552000 119.060000 2261.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 2270.552000 125.450000 2261.552000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 2270.552000 130.832000 2261.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 2270.552000 139.445000 2261.552000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 2270.552000 145.169000 2261.552000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 2270.552000 148.076000 2261.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 2270.552000 153.323000 2261.552000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 2270.552000 156.433000 2261.552000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2260.052000 80.009000 2251.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 2260.052000 82.871000 2251.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 2260.052000 88.316000 2251.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 2260.052000 94.094000 2251.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 2260.052000 96.947000 2251.052000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 2260.052000 104.948000 2251.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 2260.052000 113.705000 2251.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 2260.052000 119.492000 2251.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 2260.052000 124.811000 2251.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 2260.052000 132.848000 2251.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 2260.052000 141.605000 2251.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 2260.052000 144.467000 2251.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 2260.052000 148.103000 2251.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 2260.052000 150.965000 2251.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 2260.052000 156.311000 2251.052000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 2260.052000 159.253000 2251.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2249.552000 80.999000 2240.552000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 2249.552000 90.539000 2240.552000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 2249.552000 95.318000 2240.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 2249.552000 99.602000 2240.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 2249.552000 102.473000 2240.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 2249.552000 108.260000 2240.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 2249.552000 110.762000 2240.552000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 2249.552000 115.316000 2240.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 2249.552000 122.156000 2240.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 2249.552000 132.299000 2240.552000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 2249.552000 136.970000 2240.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 2249.552000 139.877000 2240.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 2249.552000 142.775000 2240.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 2249.552000 148.022000 2240.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 2249.552000 152.720000 2240.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 2249.552000 156.311000 2240.552000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 2249.552000 159.253000 2240.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2239.052000 83.006000 2230.052000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 2239.052000 88.793000 2230.052000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 2239.052000 91.664000 2230.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 2239.052000 94.562000 2230.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 2239.052000 100.349000 2230.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 2239.052000 103.157000 2230.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 2239.052000 108.980000 2230.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 2239.052000 114.740000 2230.052000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 2239.052000 119.375000 2230.052000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 2239.052000 128.033000 2230.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 2239.052000 141.479000 2230.052000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 2239.052000 146.807000 2230.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 2239.052000 152.684000 2230.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 2239.052000 156.293000 2230.052000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 2239.052000 159.253000 2230.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2228.552000 79.730000 2219.552000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 2228.552000 84.005000 2219.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 2228.552000 89.423000 2219.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 2228.552000 98.036000 2219.552000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 2228.552000 121.157000 2219.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 2228.552000 145.115000 2219.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 2228.552000 151.001000 2219.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 2228.552000 156.320000 2219.552000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 2228.552000 159.253000 2219.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2218.052000 83.285000 2209.052000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 2218.052000 89.099000 2209.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 2218.052000 93.401000 2209.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 2218.052000 98.477000 2209.052000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 2218.052000 103.121000 2209.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 2218.052000 105.974000 2209.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 2218.052000 111.320000 2209.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 2218.052000 115.604000 2209.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 2218.052000 123.857000 2209.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 2218.052000 136.007000 2209.052000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 2218.052000 141.794000 2209.052000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 2218.052000 144.665000 2209.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 2218.052000 147.464000 2209.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 2218.052000 153.251000 2209.052000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 2218.052000 156.433000 2209.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2207.552000 79.271000 2198.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 2207.552000 85.094000 2198.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 2207.552000 90.854000 2198.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 2207.552000 96.146000 2198.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 2207.552000 102.302000 2198.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 2207.552000 107.711000 2198.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 2207.552000 113.048000 2198.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 2207.552000 119.204000 2198.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 2207.552000 124.991000 2198.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 2207.552000 130.310000 2198.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 2207.552000 135.647000 2198.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 2207.552000 144.755000 2198.552000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 2207.552000 153.323000 2198.552000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 2207.552000 156.333000 2198.552000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2197.052000 82.160000 2188.052000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 2197.052000 85.067000 2188.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 2197.052000 89.297000 2188.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 2197.052000 94.616000 2188.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 2197.052000 98.747000 2188.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 2197.052000 106.055000 2188.052000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 2197.052000 109.700000 2188.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 2197.052000 115.055000 2188.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 2197.052000 118.601000 2188.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 2197.052000 124.010000 2188.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 2197.052000 128.042000 2188.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 2197.052000 135.998000 2188.052000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 2197.052000 141.785000 2188.052000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 2197.052000 144.656000 2188.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 2197.052000 147.554000 2188.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 2197.052000 153.341000 2188.052000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 2197.052000 156.433000 2188.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2186.552000 79.271000 2177.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 2186.552000 85.094000 2177.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 2186.552000 90.854000 2177.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 2186.552000 93.743000 2177.552000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 2171.700000 0 72.100000 2171.700000 0 72.100000 2285.400000 0 72.000000 2285.400000 0 72.000000 2171.700000 0
+eoFillPath subpath 1 160.500000 2171.700000 0 160.600000 2171.700000 0 160.600000 2285.400000 0 160.500000 2285.400000 0 160.500000 2171.700000 0
+eoFillPath subpath 1 72.000000 2285.300000 0 160.600000 2285.300000 0 160.600000 2285.400000 0 72.000000 2285.400000 0 72.000000 2285.300000 0
+eoFillPath subpath 1 72.000000 2171.700000 0 160.600000 2171.700000 0 160.600000 2171.800000 0 72.000000 2171.800000 0 72.000000 2171.700000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 8361.200000 0 169.600000 8361.200000 0 169.600000 8366.200000 0 76.900000 8366.200000 0 76.900000 8361.200000 0
+eoFillPath subpath 1 164.600000 8366.100000 0 169.600000 8366.100000 0 169.600000 8481.700000 0 164.600000 8481.700000 0 164.600000 8366.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 8366.200000 0 121.400000 8366.200000 0 121.400000 8486.600000 0 72.000000 8486.600000 0 72.000000 8366.200000 0
+saveState
+eoClipPath subpath 1 72.000000 8366.100000 0 164.600000 8366.100000 0 164.600000 8486.500000 0 72.000000 8486.500000 0 72.000000 8366.100000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -751590.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 8436.100000 0 93.700000 8436.100000 0 93.700000 8455.300000 0 72.000000 8455.300000 0 72.000000 8436.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 8436.100000 0 169.600000 8436.100000 0 169.600000 8455.300000 0 93.700000 8455.300000 0 93.700000 8436.100000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 8419.400000 0 93.700000 8419.400000 0 93.700000 8436.100000 0 72.000000 8436.100000 0 72.000000 8419.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 8419.400000 0 169.600000 8419.400000 0 169.600000 8436.100000 0 93.700000 8436.100000 0 93.700000 8419.400000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 8400.200000 0 93.700000 8400.200000 0 93.700000 8419.400000 0 72.000000 8419.400000 0 72.000000 8400.200000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 8400.200000 0 169.600000 8400.200000 0 169.600000 8419.400000 0 93.700000 8419.400000 0 93.700000 8400.200000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 8381.000000 0 93.700000 8381.000000 0 93.700000 8400.200000 0 72.000000 8400.200000 0 72.000000 8381.000000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 8381.000000 0 169.600000 8381.000000 0 169.600000 8400.200000 0 93.700000 8400.200000 0 93.700000 8381.000000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8482.252000 82.898000 8473.252000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 8482.252000 87.200000 8473.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 8482.252000 90.809000 8473.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 8482.252000 93.671000 8473.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 8482.252000 98.315000 8473.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 8482.252000 101.906000 8473.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 8482.252000 106.514000 8473.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 8482.252000 109.754000 8473.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 8482.252000 112.868000 8473.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 8482.252000 118.691000 8473.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 8482.252000 121.850000 8473.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 8482.252000 125.702000 8473.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 8482.252000 131.588000 8473.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 8482.252000 136.907000 8473.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 8482.252000 140.039000 8473.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 8482.252000 146.078000 8473.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 8482.252000 151.442000 8473.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 8482.252000 154.349000 8473.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 8482.252000 157.148000 8473.252000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 8482.252000 160.433000 8473.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8471.752000 84.095000 8462.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 8471.752000 89.468000 8462.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 8471.752000 94.580000 8462.752000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 8471.752000 97.631000 8462.752000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 8451.352000 104.443000 8442.352000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 8451.352000 109.060000 8442.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 8451.352000 113.398000 8442.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 8451.352000 119.194000 8442.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 8451.352000 124.612000 8442.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 8451.352000 127.465000 8442.352000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 8434.652000 101.176000 8425.652000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 8434.652000 104.074000 8425.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 8434.652000 109.420000 8425.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 8434.652000 114.442000 8425.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 8434.652000 120.202000 8425.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 8434.652000 123.811000 8425.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 8434.652000 129.121000 8425.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 8434.652000 134.899000 8425.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 8434.652000 139.516000 8425.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 8434.652000 143.107000 8425.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 8434.652000 148.417000 8425.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 8434.652000 151.270000 8425.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 8434.652000 157.093000 8425.652000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 8417.952000 103.048000 8408.952000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 8417.952000 108.421000 8408.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 8417.952000 113.443000 8408.952000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 8417.952000 118.852000 8408.952000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 8417.952000 124.702000 8408.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 8417.952000 130.021000 8408.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 8417.952000 135.079000 8408.952000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 8398.752000 104.407000 8389.752000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 8398.752000 109.816000 8389.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 8398.752000 115.594000 8389.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 8398.752000 121.354000 8389.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 8398.752000 125.692000 8389.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 8398.752000 128.563000 8389.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 8398.752000 133.954000 8389.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 8398.752000 139.786000 8389.752000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 8366.100000 0 72.100000 8366.100000 0 72.100000 8486.600000 0 72.000000 8486.600000 0 72.000000 8366.100000 0
+eoFillPath subpath 1 164.600000 8366.100000 0 164.700000 8366.100000 0 164.700000 8486.600000 0 164.600000 8486.600000 0 164.600000 8366.100000 0
+eoFillPath subpath 1 72.000000 8486.500000 0 164.700000 8486.500000 0 164.700000 8486.600000 0 72.000000 8486.600000 0 72.000000 8486.500000 0
+eoFillPath subpath 1 72.000000 8366.100000 0 164.700000 8366.100000 0 164.700000 8366.200000 0 72.000000 8366.200000 0 72.000000 8366.100000 0
+eoFillPath subpath 1 91.300000 8381.000000 0 93.700000 8381.000000 0 93.700000 8455.300000 0 91.300000 8455.300000 0 91.300000 8381.000000 0
+eoFillPath subpath 1 72.000000 8400.200000 0 169.600000 8400.200000 0 169.600000 8402.600000 0 72.000000 8402.600000 0 72.000000 8400.200000 0
+eoFillPath subpath 1 72.000000 8452.900000 0 169.600000 8452.900000 0 169.600000 8455.300000 0 72.000000 8455.300000 0 72.000000 8452.900000 0
+eoFillPath subpath 1 72.000000 8381.000000 0 169.600000 8381.000000 0 169.600000 8383.400000 0 72.000000 8383.400000 0 72.000000 8381.000000 0
+saveState
+eoClipPath subpath 1 108.000000 515.000000 0 150.800000 515.000000 0 150.800000 559.200000 0 108.000000 559.200000 0 108.000000 515.000000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 27700.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 -335.000000 0 499.600000 -335.000000 0 499.600000 -329.900000 0 186.800000 -329.900000 0 186.800000 -335.000000 0
+eoFillPath subpath 1 494.500000 -330.000000 0 499.600000 -330.000000 0 499.600000 -141.600000 0 494.500000 -141.600000 0 494.500000 -330.000000 0
+saveState
+eoClipPath subpath 1 181.800000 -329.900000 0 494.500000 -329.900000 0 494.500000 -136.600000 0 181.800000 -136.600000 0 181.800000 -329.900000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 -136.500000 0 494.500000 -136.500000 0 494.500000 -136.500000 0 181.700000 -136.500000 0
+eoFillPath subpath 1 181.700000 -136.500000 0 494.500000 -136.500000 0 494.500000 -137.300000 0 181.700000 -137.300000 0 181.700000 -136.500000 0
+eoFillPath subpath 1 181.700000 -137.300000 0 494.500000 -137.300000 0 494.500000 -138.000000 0 181.700000 -138.000000 0 181.700000 -137.300000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 -138.000000 0 494.500000 -138.000000 0 494.500000 -138.800000 0 181.700000 -138.800000 0 181.700000 -138.000000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 -138.800000 0 494.500000 -138.800000 0 494.500000 -139.600000 0 181.700000 -139.600000 0 181.700000 -138.800000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 -139.600000 0 494.500000 -139.600000 0 494.500000 -140.300000 0 181.700000 -140.300000 0 181.700000 -139.600000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 -140.300000 0 494.500000 -140.300000 0 494.500000 -141.100000 0 181.700000 -141.100000 0 181.700000 -140.300000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 -141.100000 0 494.500000 -141.100000 0 494.500000 -141.800000 0 181.700000 -141.800000 0 181.700000 -141.100000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 -141.800000 0 494.500000 -141.800000 0 494.500000 -142.600000 0 181.700000 -142.600000 0 181.700000 -141.800000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 -142.600000 0 494.500000 -142.600000 0 494.500000 -143.300000 0 181.700000 -143.300000 0 181.700000 -142.600000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 -143.300000 0 494.500000 -143.300000 0 494.500000 -144.100000 0 181.700000 -144.100000 0 181.700000 -143.300000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 -144.100000 0 494.500000 -144.100000 0 494.500000 -144.900000 0 181.700000 -144.900000 0 181.700000 -144.100000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 -144.900000 0 494.500000 -144.900000 0 494.500000 -145.600000 0 181.700000 -145.600000 0 181.700000 -144.900000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 -145.600000 0 494.500000 -145.600000 0 494.500000 -146.400000 0 181.700000 -146.400000 0 181.700000 -145.600000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 -146.400000 0 494.500000 -146.400000 0 494.500000 -147.100000 0 181.700000 -147.100000 0 181.700000 -146.400000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 -147.100000 0 494.500000 -147.100000 0 494.500000 -147.900000 0 181.700000 -147.900000 0 181.700000 -147.100000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 -147.900000 0 494.500000 -147.900000 0 494.500000 -148.700000 0 181.700000 -148.700000 0 181.700000 -147.900000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 -148.700000 0 494.500000 -148.700000 0 494.500000 -149.400000 0 181.700000 -149.400000 0 181.700000 -148.700000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 -149.400000 0 494.500000 -149.400000 0 494.500000 -150.200000 0 181.700000 -150.200000 0 181.700000 -149.400000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 -150.200000 0 494.500000 -150.200000 0 494.500000 -150.900000 0 181.700000 -150.900000 0 181.700000 -150.200000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 -150.900000 0 494.500000 -150.900000 0 494.500000 -151.700000 0 181.700000 -151.700000 0 181.700000 -150.900000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 -151.700000 0 494.500000 -151.700000 0 494.500000 -152.500000 0 181.700000 -152.500000 0 181.700000 -151.700000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 -152.500000 0 494.500000 -152.500000 0 494.500000 -153.200000 0 181.700000 -153.200000 0 181.700000 -152.500000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 -153.200000 0 494.500000 -153.200000 0 494.500000 -154.000000 0 181.700000 -154.000000 0 181.700000 -153.200000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 -154.000000 0 494.500000 -154.000000 0 494.500000 -154.700000 0 181.700000 -154.700000 0 181.700000 -154.000000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 -154.700000 0 494.500000 -154.700000 0 494.500000 -155.500000 0 181.700000 -155.500000 0 181.700000 -154.700000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 -155.500000 0 494.500000 -155.500000 0 494.500000 -156.200000 0 181.700000 -156.200000 0 181.700000 -155.500000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 -156.200000 0 494.500000 -156.200000 0 494.500000 -157.000000 0 181.700000 -157.000000 0 181.700000 -156.200000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 -157.000000 0 494.500000 -157.000000 0 494.500000 -157.800000 0 181.700000 -157.800000 0 181.700000 -157.000000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 -157.800000 0 494.500000 -157.800000 0 494.500000 -158.500000 0 181.700000 -158.500000 0 181.700000 -157.800000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 -158.500000 0 494.500000 -158.500000 0 494.500000 -159.300000 0 181.700000 -159.300000 0 181.700000 -158.500000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 -159.300000 0 494.500000 -159.300000 0 494.500000 -160.000000 0 181.700000 -160.000000 0 181.700000 -159.300000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 -160.000000 0 494.500000 -160.000000 0 494.500000 -160.800000 0 181.700000 -160.800000 0 181.700000 -160.000000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 -160.800000 0 494.500000 -160.800000 0 494.500000 -161.600000 0 181.700000 -161.600000 0 181.700000 -160.800000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 -161.600000 0 494.500000 -161.600000 0 494.500000 -162.300000 0 181.700000 -162.300000 0 181.700000 -161.600000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 -162.300000 0 494.500000 -162.300000 0 494.500000 -163.100000 0 181.700000 -163.100000 0 181.700000 -162.300000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 -163.100000 0 494.500000 -163.100000 0 494.500000 -163.800000 0 181.700000 -163.800000 0 181.700000 -163.100000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 -163.800000 0 494.500000 -163.800000 0 494.500000 -164.600000 0 181.700000 -164.600000 0 181.700000 -163.800000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 -164.600000 0 494.500000 -164.600000 0 494.500000 -165.400000 0 181.700000 -165.400000 0 181.700000 -164.600000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 -165.400000 0 494.500000 -165.400000 0 494.500000 -166.100000 0 181.700000 -166.100000 0 181.700000 -165.400000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 -166.100000 0 494.500000 -166.100000 0 494.500000 -166.900000 0 181.700000 -166.900000 0 181.700000 -166.100000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 -166.900000 0 494.500000 -166.900000 0 494.500000 -167.600000 0 181.700000 -167.600000 0 181.700000 -166.900000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 -167.600000 0 494.500000 -167.600000 0 494.500000 -168.400000 0 181.700000 -168.400000 0 181.700000 -167.600000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 -168.400000 0 494.500000 -168.400000 0 494.500000 -169.100000 0 181.700000 -169.100000 0 181.700000 -168.400000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 -169.100000 0 494.500000 -169.100000 0 494.500000 -169.900000 0 181.700000 -169.900000 0 181.700000 -169.100000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 -169.900000 0 494.500000 -169.900000 0 494.500000 -170.700000 0 181.700000 -170.700000 0 181.700000 -169.900000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 -170.700000 0 494.500000 -170.700000 0 494.500000 -171.400000 0 181.700000 -171.400000 0 181.700000 -170.700000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 -171.400000 0 494.500000 -171.400000 0 494.500000 -172.200000 0 181.700000 -172.200000 0 181.700000 -171.400000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 -172.200000 0 494.500000 -172.200000 0 494.500000 -172.900000 0 181.700000 -172.900000 0 181.700000 -172.200000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 -172.900000 0 494.500000 -172.900000 0 494.500000 -173.700000 0 181.700000 -173.700000 0 181.700000 -172.900000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 -173.700000 0 494.500000 -173.700000 0 494.500000 -174.500000 0 181.700000 -174.500000 0 181.700000 -173.700000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 -174.500000 0 494.500000 -174.500000 0 494.500000 -175.200000 0 181.700000 -175.200000 0 181.700000 -174.500000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 -175.200000 0 494.500000 -175.200000 0 494.500000 -176.000000 0 181.700000 -176.000000 0 181.700000 -175.200000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 -176.000000 0 494.500000 -176.000000 0 494.500000 -176.700000 0 181.700000 -176.700000 0 181.700000 -176.000000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 -176.700000 0 494.500000 -176.700000 0 494.500000 -177.500000 0 181.700000 -177.500000 0 181.700000 -176.700000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 -177.500000 0 494.500000 -177.500000 0 494.500000 -178.300000 0 181.700000 -178.300000 0 181.700000 -177.500000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 -178.300000 0 494.500000 -178.300000 0 494.500000 -179.000000 0 181.700000 -179.000000 0 181.700000 -178.300000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 -179.000000 0 494.500000 -179.000000 0 494.500000 -179.800000 0 181.700000 -179.800000 0 181.700000 -179.000000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 -179.800000 0 494.500000 -179.800000 0 494.500000 -180.500000 0 181.700000 -180.500000 0 181.700000 -179.800000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 -180.500000 0 494.500000 -180.500000 0 494.500000 -181.300000 0 181.700000 -181.300000 0 181.700000 -180.500000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 -181.300000 0 494.500000 -181.300000 0 494.500000 -182.000000 0 181.700000 -182.000000 0 181.700000 -181.300000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 -182.000000 0 494.500000 -182.000000 0 494.500000 -182.800000 0 181.700000 -182.800000 0 181.700000 -182.000000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 -182.800000 0 494.500000 -182.800000 0 494.500000 -183.600000 0 181.700000 -183.600000 0 181.700000 -182.800000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 -183.600000 0 494.500000 -183.600000 0 494.500000 -184.300000 0 181.700000 -184.300000 0 181.700000 -183.600000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 -184.300000 0 494.500000 -184.300000 0 494.500000 -185.100000 0 181.700000 -185.100000 0 181.700000 -184.300000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 -185.100000 0 494.500000 -185.100000 0 494.500000 -185.800000 0 181.700000 -185.800000 0 181.700000 -185.100000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 -185.800000 0 494.500000 -185.800000 0 494.500000 -186.600000 0 181.700000 -186.600000 0 181.700000 -185.800000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 -186.600000 0 494.500000 -186.600000 0 494.500000 -187.400000 0 181.700000 -187.400000 0 181.700000 -186.600000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 -187.400000 0 494.500000 -187.400000 0 494.500000 -188.100000 0 181.700000 -188.100000 0 181.700000 -187.400000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 -188.100000 0 494.500000 -188.100000 0 494.500000 -188.900000 0 181.700000 -188.900000 0 181.700000 -188.100000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 -188.900000 0 494.500000 -188.900000 0 494.500000 -189.600000 0 181.700000 -189.600000 0 181.700000 -188.900000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 -189.600000 0 494.500000 -189.600000 0 494.500000 -190.400000 0 181.700000 -190.400000 0 181.700000 -189.600000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 -190.400000 0 494.500000 -190.400000 0 494.500000 -191.200000 0 181.700000 -191.200000 0 181.700000 -190.400000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 -191.200000 0 494.500000 -191.200000 0 494.500000 -191.900000 0 181.700000 -191.900000 0 181.700000 -191.200000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 -191.900000 0 494.500000 -191.900000 0 494.500000 -192.700000 0 181.700000 -192.700000 0 181.700000 -191.900000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 -192.700000 0 494.500000 -192.700000 0 494.500000 -193.400000 0 181.700000 -193.400000 0 181.700000 -192.700000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 -193.400000 0 494.500000 -193.400000 0 494.500000 -194.200000 0 181.700000 -194.200000 0 181.700000 -193.400000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 -194.200000 0 494.500000 -194.200000 0 494.500000 -194.900000 0 181.700000 -194.900000 0 181.700000 -194.200000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 -194.900000 0 494.500000 -194.900000 0 494.500000 -195.700000 0 181.700000 -195.700000 0 181.700000 -194.900000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 -195.700000 0 494.500000 -195.700000 0 494.500000 -196.500000 0 181.700000 -196.500000 0 181.700000 -195.700000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 -196.500000 0 494.500000 -196.500000 0 494.500000 -197.200000 0 181.700000 -197.200000 0 181.700000 -196.500000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 -197.200000 0 494.500000 -197.200000 0 494.500000 -198.000000 0 181.700000 -198.000000 0 181.700000 -197.200000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 -198.000000 0 494.500000 -198.000000 0 494.500000 -198.700000 0 181.700000 -198.700000 0 181.700000 -198.000000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 -198.700000 0 494.500000 -198.700000 0 494.500000 -199.500000 0 181.700000 -199.500000 0 181.700000 -198.700000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 -199.500000 0 494.500000 -199.500000 0 494.500000 -200.300000 0 181.700000 -200.300000 0 181.700000 -199.500000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 -200.300000 0 494.500000 -200.300000 0 494.500000 -201.000000 0 181.700000 -201.000000 0 181.700000 -200.300000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 -201.000000 0 494.500000 -201.000000 0 494.500000 -201.800000 0 181.700000 -201.800000 0 181.700000 -201.000000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 -201.800000 0 494.500000 -201.800000 0 494.500000 -202.500000 0 181.700000 -202.500000 0 181.700000 -201.800000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 -202.500000 0 494.500000 -202.500000 0 494.500000 -203.300000 0 181.700000 -203.300000 0 181.700000 -202.500000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 -203.300000 0 494.500000 -203.300000 0 494.500000 -204.100000 0 181.700000 -204.100000 0 181.700000 -203.300000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 -204.100000 0 494.500000 -204.100000 0 494.500000 -204.800000 0 181.700000 -204.800000 0 181.700000 -204.100000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 -204.800000 0 494.500000 -204.800000 0 494.500000 -205.600000 0 181.700000 -205.600000 0 181.700000 -204.800000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 -205.600000 0 494.500000 -205.600000 0 494.500000 -206.300000 0 181.700000 -206.300000 0 181.700000 -205.600000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 -206.300000 0 494.500000 -206.300000 0 494.500000 -207.100000 0 181.700000 -207.100000 0 181.700000 -206.300000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 -207.100000 0 494.500000 -207.100000 0 494.500000 -207.800000 0 181.700000 -207.800000 0 181.700000 -207.100000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 -207.800000 0 494.500000 -207.800000 0 494.500000 -208.600000 0 181.700000 -208.600000 0 181.700000 -207.800000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 -208.600000 0 494.500000 -208.600000 0 494.500000 -209.400000 0 181.700000 -209.400000 0 181.700000 -208.600000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 -209.400000 0 494.500000 -209.400000 0 494.500000 -210.100000 0 181.700000 -210.100000 0 181.700000 -209.400000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 -210.100000 0 494.500000 -210.100000 0 494.500000 -210.900000 0 181.700000 -210.900000 0 181.700000 -210.100000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 -210.900000 0 494.500000 -210.900000 0 494.500000 -211.600000 0 181.700000 -211.600000 0 181.700000 -210.900000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 -211.600000 0 494.500000 -211.600000 0 494.500000 -212.400000 0 181.700000 -212.400000 0 181.700000 -211.600000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 -212.400000 0 494.500000 -212.400000 0 494.500000 -213.200000 0 181.700000 -213.200000 0 181.700000 -212.400000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 -213.200000 0 494.500000 -213.200000 0 494.500000 -213.900000 0 181.700000 -213.900000 0 181.700000 -213.200000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 -213.900000 0 494.500000 -213.900000 0 494.500000 -214.700000 0 181.700000 -214.700000 0 181.700000 -213.900000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 -214.700000 0 494.500000 -214.700000 0 494.500000 -215.400000 0 181.700000 -215.400000 0 181.700000 -214.700000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 -215.400000 0 494.500000 -215.400000 0 494.500000 -216.200000 0 181.700000 -216.200000 0 181.700000 -215.400000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 -216.200000 0 494.500000 -216.200000 0 494.500000 -217.000000 0 181.700000 -217.000000 0 181.700000 -216.200000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 -217.000000 0 494.500000 -217.000000 0 494.500000 -217.700000 0 181.700000 -217.700000 0 181.700000 -217.000000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 -217.700000 0 494.500000 -217.700000 0 494.500000 -218.500000 0 181.700000 -218.500000 0 181.700000 -217.700000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 -218.500000 0 494.500000 -218.500000 0 494.500000 -219.200000 0 181.700000 -219.200000 0 181.700000 -218.500000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 -219.200000 0 494.500000 -219.200000 0 494.500000 -220.000000 0 181.700000 -220.000000 0 181.700000 -219.200000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 -220.000000 0 494.500000 -220.000000 0 494.500000 -220.700000 0 181.700000 -220.700000 0 181.700000 -220.000000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 -220.700000 0 494.500000 -220.700000 0 494.500000 -221.500000 0 181.700000 -221.500000 0 181.700000 -220.700000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 -221.500000 0 494.500000 -221.500000 0 494.500000 -222.300000 0 181.700000 -222.300000 0 181.700000 -221.500000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 -222.300000 0 494.500000 -222.300000 0 494.500000 -223.000000 0 181.700000 -223.000000 0 181.700000 -222.300000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 -223.000000 0 494.500000 -223.000000 0 494.500000 -223.800000 0 181.700000 -223.800000 0 181.700000 -223.000000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 -223.800000 0 494.500000 -223.800000 0 494.500000 -224.500000 0 181.700000 -224.500000 0 181.700000 -223.800000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 -224.500000 0 494.500000 -224.500000 0 494.500000 -225.300000 0 181.700000 -225.300000 0 181.700000 -224.500000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 -225.300000 0 494.500000 -225.300000 0 494.500000 -226.100000 0 181.700000 -226.100000 0 181.700000 -225.300000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 -226.100000 0 494.500000 -226.100000 0 494.500000 -226.800000 0 181.700000 -226.800000 0 181.700000 -226.100000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 -226.800000 0 494.500000 -226.800000 0 494.500000 -227.600000 0 181.700000 -227.600000 0 181.700000 -226.800000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 -227.600000 0 494.500000 -227.600000 0 494.500000 -228.300000 0 181.700000 -228.300000 0 181.700000 -227.600000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 -228.300000 0 494.500000 -228.300000 0 494.500000 -229.100000 0 181.700000 -229.100000 0 181.700000 -228.300000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 -229.100000 0 494.500000 -229.100000 0 494.500000 -229.900000 0 181.700000 -229.900000 0 181.700000 -229.100000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 -229.900000 0 494.500000 -229.900000 0 494.500000 -230.600000 0 181.700000 -230.600000 0 181.700000 -229.900000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 -230.600000 0 494.500000 -230.600000 0 494.500000 -231.400000 0 181.700000 -231.400000 0 181.700000 -230.600000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 -231.400000 0 494.500000 -231.400000 0 494.500000 -232.100000 0 181.700000 -232.100000 0 181.700000 -231.400000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 -232.100000 0 494.500000 -232.100000 0 494.500000 -232.900000 0 181.700000 -232.900000 0 181.700000 -232.100000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 -232.900000 0 494.500000 -232.900000 0 494.500000 -233.600000 0 181.700000 -233.600000 0 181.700000 -232.900000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 -233.600000 0 494.500000 -233.600000 0 494.500000 -234.400000 0 181.700000 -234.400000 0 181.700000 -233.600000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 -234.400000 0 494.500000 -234.400000 0 494.500000 -235.200000 0 181.700000 -235.200000 0 181.700000 -234.400000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 -235.200000 0 494.500000 -235.200000 0 494.500000 -235.900000 0 181.700000 -235.900000 0 181.700000 -235.200000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 -235.900000 0 494.500000 -235.900000 0 494.500000 -236.700000 0 181.700000 -236.700000 0 181.700000 -235.900000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 -236.700000 0 494.500000 -236.700000 0 494.500000 -237.400000 0 181.700000 -237.400000 0 181.700000 -236.700000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 -237.400000 0 494.500000 -237.400000 0 494.500000 -238.200000 0 181.700000 -238.200000 0 181.700000 -237.400000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 -238.200000 0 494.500000 -238.200000 0 494.500000 -239.000000 0 181.700000 -239.000000 0 181.700000 -238.200000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 -239.000000 0 494.500000 -239.000000 0 494.500000 -239.700000 0 181.700000 -239.700000 0 181.700000 -239.000000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 -239.700000 0 494.500000 -239.700000 0 494.500000 -240.500000 0 181.700000 -240.500000 0 181.700000 -239.700000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 -240.500000 0 494.500000 -240.500000 0 494.500000 -241.200000 0 181.700000 -241.200000 0 181.700000 -240.500000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 -241.200000 0 494.500000 -241.200000 0 494.500000 -242.000000 0 181.700000 -242.000000 0 181.700000 -241.200000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 -242.000000 0 494.500000 -242.000000 0 494.500000 -242.800000 0 181.700000 -242.800000 0 181.700000 -242.000000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 -242.800000 0 494.500000 -242.800000 0 494.500000 -243.500000 0 181.700000 -243.500000 0 181.700000 -242.800000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 -243.500000 0 494.500000 -243.500000 0 494.500000 -244.300000 0 181.700000 -244.300000 0 181.700000 -243.500000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 -244.300000 0 494.500000 -244.300000 0 494.500000 -245.000000 0 181.700000 -245.000000 0 181.700000 -244.300000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 -245.000000 0 494.500000 -245.000000 0 494.500000 -245.800000 0 181.700000 -245.800000 0 181.700000 -245.000000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 -245.800000 0 494.500000 -245.800000 0 494.500000 -246.500000 0 181.700000 -246.500000 0 181.700000 -245.800000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 -246.500000 0 494.500000 -246.500000 0 494.500000 -247.300000 0 181.700000 -247.300000 0 181.700000 -246.500000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 -247.300000 0 494.500000 -247.300000 0 494.500000 -248.100000 0 181.700000 -248.100000 0 181.700000 -247.300000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 -248.100000 0 494.500000 -248.100000 0 494.500000 -248.800000 0 181.700000 -248.800000 0 181.700000 -248.100000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 -248.800000 0 494.500000 -248.800000 0 494.500000 -249.600000 0 181.700000 -249.600000 0 181.700000 -248.800000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 -249.600000 0 494.500000 -249.600000 0 494.500000 -250.300000 0 181.700000 -250.300000 0 181.700000 -249.600000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 -250.300000 0 494.500000 -250.300000 0 494.500000 -251.100000 0 181.700000 -251.100000 0 181.700000 -250.300000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 -251.100000 0 494.500000 -251.100000 0 494.500000 -251.900000 0 181.700000 -251.900000 0 181.700000 -251.100000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 -251.900000 0 494.500000 -251.900000 0 494.500000 -252.600000 0 181.700000 -252.600000 0 181.700000 -251.900000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 -252.600000 0 494.500000 -252.600000 0 494.500000 -253.400000 0 181.700000 -253.400000 0 181.700000 -252.600000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 -253.400000 0 494.500000 -253.400000 0 494.500000 -254.100000 0 181.700000 -254.100000 0 181.700000 -253.400000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 -254.100000 0 494.500000 -254.100000 0 494.500000 -254.900000 0 181.700000 -254.900000 0 181.700000 -254.100000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 -254.900000 0 494.500000 -254.900000 0 494.500000 -255.700000 0 181.700000 -255.700000 0 181.700000 -254.900000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 -255.700000 0 494.500000 -255.700000 0 494.500000 -256.400000 0 181.700000 -256.400000 0 181.700000 -255.700000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 -256.400000 0 494.500000 -256.400000 0 494.500000 -257.200000 0 181.700000 -257.200000 0 181.700000 -256.400000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 -257.200000 0 494.500000 -257.200000 0 494.500000 -257.900000 0 181.700000 -257.900000 0 181.700000 -257.200000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 -257.900000 0 494.500000 -257.900000 0 494.500000 -258.700000 0 181.700000 -258.700000 0 181.700000 -257.900000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 -258.700000 0 494.500000 -258.700000 0 494.500000 -259.400000 0 181.700000 -259.400000 0 181.700000 -258.700000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 -259.400000 0 494.500000 -259.400000 0 494.500000 -260.200000 0 181.700000 -260.200000 0 181.700000 -259.400000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 -260.200000 0 494.500000 -260.200000 0 494.500000 -261.000000 0 181.700000 -261.000000 0 181.700000 -260.200000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 -261.000000 0 494.500000 -261.000000 0 494.500000 -261.700000 0 181.700000 -261.700000 0 181.700000 -261.000000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 -261.700000 0 494.500000 -261.700000 0 494.500000 -262.500000 0 181.700000 -262.500000 0 181.700000 -261.700000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 -262.500000 0 494.500000 -262.500000 0 494.500000 -263.200000 0 181.700000 -263.200000 0 181.700000 -262.500000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 -263.200000 0 494.500000 -263.200000 0 494.500000 -264.000000 0 181.700000 -264.000000 0 181.700000 -263.200000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 -264.000000 0 494.500000 -264.000000 0 494.500000 -264.800000 0 181.700000 -264.800000 0 181.700000 -264.000000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 -264.800000 0 494.500000 -264.800000 0 494.500000 -265.500000 0 181.700000 -265.500000 0 181.700000 -264.800000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 -265.500000 0 494.500000 -265.500000 0 494.500000 -266.300000 0 181.700000 -266.300000 0 181.700000 -265.500000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 -266.300000 0 494.500000 -266.300000 0 494.500000 -267.000000 0 181.700000 -267.000000 0 181.700000 -266.300000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 -267.000000 0 494.500000 -267.000000 0 494.500000 -267.800000 0 181.700000 -267.800000 0 181.700000 -267.000000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 -267.800000 0 494.500000 -267.800000 0 494.500000 -268.600000 0 181.700000 -268.600000 0 181.700000 -267.800000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 -268.600000 0 494.500000 -268.600000 0 494.500000 -269.300000 0 181.700000 -269.300000 0 181.700000 -268.600000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 -269.300000 0 494.500000 -269.300000 0 494.500000 -270.100000 0 181.700000 -270.100000 0 181.700000 -269.300000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 -270.100000 0 494.500000 -270.100000 0 494.500000 -270.800000 0 181.700000 -270.800000 0 181.700000 -270.100000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 -270.800000 0 494.500000 -270.800000 0 494.500000 -271.600000 0 181.700000 -271.600000 0 181.700000 -270.800000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 -271.600000 0 494.500000 -271.600000 0 494.500000 -272.300000 0 181.700000 -272.300000 0 181.700000 -271.600000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 -272.300000 0 494.500000 -272.300000 0 494.500000 -273.100000 0 181.700000 -273.100000 0 181.700000 -272.300000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 -273.100000 0 494.500000 -273.100000 0 494.500000 -273.900000 0 181.700000 -273.900000 0 181.700000 -273.100000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 -273.900000 0 494.500000 -273.900000 0 494.500000 -274.600000 0 181.700000 -274.600000 0 181.700000 -273.900000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 -274.600000 0 494.500000 -274.600000 0 494.500000 -275.400000 0 181.700000 -275.400000 0 181.700000 -274.600000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 -275.400000 0 494.500000 -275.400000 0 494.500000 -276.100000 0 181.700000 -276.100000 0 181.700000 -275.400000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 -276.100000 0 494.500000 -276.100000 0 494.500000 -276.900000 0 181.700000 -276.900000 0 181.700000 -276.100000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 -276.900000 0 494.500000 -276.900000 0 494.500000 -277.700000 0 181.700000 -277.700000 0 181.700000 -276.900000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 -277.700000 0 494.500000 -277.700000 0 494.500000 -278.400000 0 181.700000 -278.400000 0 181.700000 -277.700000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 -278.400000 0 494.500000 -278.400000 0 494.500000 -279.200000 0 181.700000 -279.200000 0 181.700000 -278.400000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 -279.200000 0 494.500000 -279.200000 0 494.500000 -279.900000 0 181.700000 -279.900000 0 181.700000 -279.200000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 -279.900000 0 494.500000 -279.900000 0 494.500000 -280.700000 0 181.700000 -280.700000 0 181.700000 -279.900000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 -280.700000 0 494.500000 -280.700000 0 494.500000 -281.500000 0 181.700000 -281.500000 0 181.700000 -280.700000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 -281.500000 0 494.500000 -281.500000 0 494.500000 -282.200000 0 181.700000 -282.200000 0 181.700000 -281.500000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 -282.200000 0 494.500000 -282.200000 0 494.500000 -283.000000 0 181.700000 -283.000000 0 181.700000 -282.200000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 -283.000000 0 494.500000 -283.000000 0 494.500000 -283.700000 0 181.700000 -283.700000 0 181.700000 -283.000000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 -283.700000 0 494.500000 -283.700000 0 494.500000 -284.500000 0 181.700000 -284.500000 0 181.700000 -283.700000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 -284.500000 0 494.500000 -284.500000 0 494.500000 -285.200000 0 181.700000 -285.200000 0 181.700000 -284.500000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 -285.200000 0 494.500000 -285.200000 0 494.500000 -286.000000 0 181.700000 -286.000000 0 181.700000 -285.200000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 -286.000000 0 494.500000 -286.000000 0 494.500000 -286.800000 0 181.700000 -286.800000 0 181.700000 -286.000000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 -286.800000 0 494.500000 -286.800000 0 494.500000 -287.500000 0 181.700000 -287.500000 0 181.700000 -286.800000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 -287.500000 0 494.500000 -287.500000 0 494.500000 -288.300000 0 181.700000 -288.300000 0 181.700000 -287.500000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 -288.300000 0 494.500000 -288.300000 0 494.500000 -289.000000 0 181.700000 -289.000000 0 181.700000 -288.300000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 -289.000000 0 494.500000 -289.000000 0 494.500000 -289.800000 0 181.700000 -289.800000 0 181.700000 -289.000000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 -289.800000 0 494.500000 -289.800000 0 494.500000 -290.600000 0 181.700000 -290.600000 0 181.700000 -289.800000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 -290.600000 0 494.500000 -290.600000 0 494.500000 -291.300000 0 181.700000 -291.300000 0 181.700000 -290.600000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 -291.300000 0 494.500000 -291.300000 0 494.500000 -292.100000 0 181.700000 -292.100000 0 181.700000 -291.300000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 -292.100000 0 494.500000 -292.100000 0 494.500000 -292.800000 0 181.700000 -292.800000 0 181.700000 -292.100000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 -292.800000 0 494.500000 -292.800000 0 494.500000 -293.600000 0 181.700000 -293.600000 0 181.700000 -292.800000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 -293.600000 0 494.500000 -293.600000 0 494.500000 -294.300000 0 181.700000 -294.300000 0 181.700000 -293.600000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 -294.300000 0 494.500000 -294.300000 0 494.500000 -295.100000 0 181.700000 -295.100000 0 181.700000 -294.300000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 -295.100000 0 494.500000 -295.100000 0 494.500000 -295.900000 0 181.700000 -295.900000 0 181.700000 -295.100000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 -295.900000 0 494.500000 -295.900000 0 494.500000 -296.600000 0 181.700000 -296.600000 0 181.700000 -295.900000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 -296.600000 0 494.500000 -296.600000 0 494.500000 -297.400000 0 181.700000 -297.400000 0 181.700000 -296.600000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 -297.400000 0 494.500000 -297.400000 0 494.500000 -298.100000 0 181.700000 -298.100000 0 181.700000 -297.400000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 -298.100000 0 494.500000 -298.100000 0 494.500000 -298.900000 0 181.700000 -298.900000 0 181.700000 -298.100000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 -298.900000 0 494.500000 -298.900000 0 494.500000 -299.700000 0 181.700000 -299.700000 0 181.700000 -298.900000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 -299.700000 0 494.500000 -299.700000 0 494.500000 -300.400000 0 181.700000 -300.400000 0 181.700000 -299.700000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 -300.400000 0 494.500000 -300.400000 0 494.500000 -301.200000 0 181.700000 -301.200000 0 181.700000 -300.400000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 -301.200000 0 494.500000 -301.200000 0 494.500000 -301.900000 0 181.700000 -301.900000 0 181.700000 -301.200000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 -301.900000 0 494.500000 -301.900000 0 494.500000 -302.700000 0 181.700000 -302.700000 0 181.700000 -301.900000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 -302.700000 0 494.500000 -302.700000 0 494.500000 -303.400000 0 181.700000 -303.400000 0 181.700000 -302.700000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 -303.400000 0 494.500000 -303.400000 0 494.500000 -304.200000 0 181.700000 -304.200000 0 181.700000 -303.400000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 -304.200000 0 494.500000 -304.200000 0 494.500000 -305.000000 0 181.700000 -305.000000 0 181.700000 -304.200000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 -305.000000 0 494.500000 -305.000000 0 494.500000 -305.700000 0 181.700000 -305.700000 0 181.700000 -305.000000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 -305.700000 0 494.500000 -305.700000 0 494.500000 -306.500000 0 181.700000 -306.500000 0 181.700000 -305.700000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 -306.500000 0 494.500000 -306.500000 0 494.500000 -307.200000 0 181.700000 -307.200000 0 181.700000 -306.500000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 -307.200000 0 494.500000 -307.200000 0 494.500000 -308.000000 0 181.700000 -308.000000 0 181.700000 -307.200000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 -308.000000 0 494.500000 -308.000000 0 494.500000 -308.700000 0 181.700000 -308.700000 0 181.700000 -308.000000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 -308.700000 0 494.500000 -308.700000 0 494.500000 -309.500000 0 181.700000 -309.500000 0 181.700000 -308.700000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 -309.500000 0 494.500000 -309.500000 0 494.500000 -310.300000 0 181.700000 -310.300000 0 181.700000 -309.500000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 -310.300000 0 494.500000 -310.300000 0 494.500000 -311.000000 0 181.700000 -311.000000 0 181.700000 -310.300000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 -311.000000 0 494.500000 -311.000000 0 494.500000 -311.800000 0 181.700000 -311.800000 0 181.700000 -311.000000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 -311.800000 0 494.500000 -311.800000 0 494.500000 -312.500000 0 181.700000 -312.500000 0 181.700000 -311.800000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 -312.500000 0 494.500000 -312.500000 0 494.500000 -313.300000 0 181.700000 -313.300000 0 181.700000 -312.500000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 -313.300000 0 494.500000 -313.300000 0 494.500000 -314.100000 0 181.700000 -314.100000 0 181.700000 -313.300000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 -314.100000 0 494.500000 -314.100000 0 494.500000 -314.800000 0 181.700000 -314.800000 0 181.700000 -314.100000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 -314.800000 0 494.500000 -314.800000 0 494.500000 -315.600000 0 181.700000 -315.600000 0 181.700000 -314.800000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 -315.600000 0 494.500000 -315.600000 0 494.500000 -316.300000 0 181.700000 -316.300000 0 181.700000 -315.600000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 -316.300000 0 494.500000 -316.300000 0 494.500000 -317.100000 0 181.700000 -317.100000 0 181.700000 -316.300000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 -317.100000 0 494.500000 -317.100000 0 494.500000 -317.800000 0 181.700000 -317.800000 0 181.700000 -317.100000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 -317.800000 0 494.500000 -317.800000 0 494.500000 -318.600000 0 181.700000 -318.600000 0 181.700000 -317.800000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 -318.600000 0 494.500000 -318.600000 0 494.500000 -319.400000 0 181.700000 -319.400000 0 181.700000 -318.600000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 -319.400000 0 494.500000 -319.400000 0 494.500000 -320.100000 0 181.700000 -320.100000 0 181.700000 -319.400000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 -320.100000 0 494.500000 -320.100000 0 494.500000 -320.900000 0 181.700000 -320.900000 0 181.700000 -320.100000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 -320.900000 0 494.500000 -320.900000 0 494.500000 -321.600000 0 181.700000 -321.600000 0 181.700000 -320.900000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 -321.600000 0 494.500000 -321.600000 0 494.500000 -322.400000 0 181.700000 -322.400000 0 181.700000 -321.600000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 -322.400000 0 494.500000 -322.400000 0 494.500000 -323.200000 0 181.700000 -323.200000 0 181.700000 -322.400000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 -323.200000 0 494.500000 -323.200000 0 494.500000 -323.900000 0 181.700000 -323.900000 0 181.700000 -323.200000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 -323.900000 0 494.500000 -323.900000 0 494.500000 -324.700000 0 181.700000 -324.700000 0 181.700000 -323.900000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 -324.700000 0 494.500000 -324.700000 0 494.500000 -325.400000 0 181.700000 -325.400000 0 181.700000 -324.700000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 -325.400000 0 494.500000 -325.400000 0 494.500000 -326.200000 0 181.700000 -326.200000 0 181.700000 -325.400000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 -326.200000 0 494.500000 -326.200000 0 494.500000 -326.900000 0 181.700000 -326.900000 0 181.700000 -326.200000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 -326.900000 0 494.500000 -326.900000 0 494.500000 -327.700000 0 181.700000 -327.700000 0 181.700000 -326.900000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 -327.700000 0 494.500000 -327.700000 0 494.500000 -328.500000 0 181.700000 -328.500000 0 181.700000 -327.700000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 -328.500000 0 494.500000 -328.500000 0 494.500000 -329.200000 0 181.700000 -329.200000 0 181.700000 -328.500000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 -329.200000 0 494.500000 -329.200000 0 494.500000 -330.000000 0 181.700000 -330.000000 0 181.700000 -329.200000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 -329.900000 0 181.800000 -329.900000 0 181.800000 -136.600000 0 494.400000 -136.600000 0 494.400000 -329.900000 0 338.100000 -329.900000 0
+strokePath subpath 1 338.100000 -329.900000 0 181.800000 -329.900000 0 181.800000 -136.600000 0 494.400000 -136.600000 0 494.400000 -329.900000 0 338.100000 -329.900000 0
+saveState
+updateCtm 11410.000000 0.000000 0.000000 -8760.000000 20530.000000 104590.000000
+drawSoftMaskedImage 1142 877 1142 877 JPEG 70955 PPM 3004618
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 -290.876000 215.488000 -298.876000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 -290.876000 220.592000 -298.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 -290.876000 225.696000 -298.876000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 -290.876000 230.800000 -298.876000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 -298.476000 241.388000 -306.476000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 -298.476000 246.492000 -306.476000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 -298.476000 251.596000 -306.476000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 -298.476000 256.700000 -306.476000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 -306.176000 267.188000 -314.176000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 -306.176000 272.292000 -314.176000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 -306.176000 277.396000 -314.176000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 -306.176000 282.500000 -314.176000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 -313.776000 293.088000 -321.776000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 -313.776000 298.192000 -321.776000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 -313.776000 303.296000 -321.776000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 -313.776000 308.400000 -321.776000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 -275.976000 202.588000 -283.976000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 -256.576000 201.688000 -264.576000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 -237.276000 195.788000 -245.276000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 -237.276000 200.892000 -245.276000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 -217.976000 194.888000 -225.976000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 -217.976000 199.992000 -225.976000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 -198.676000 193.988000 -206.676000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 -198.676000 199.092000 -206.676000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 -179.276000 193.088000 -187.276000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 -179.276000 198.192000 -187.276000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 -307.176000 330.188000 -315.176000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 -307.176000 332.716000 -315.176000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 -307.176000 337.596000 -315.176000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 -307.176000 341.396000 -315.176000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 -307.176000 346.036000 -315.176000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 -307.176000 350.900000 -315.176000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 -307.176000 355.972000 -315.176000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 -307.176000 359.196000 -315.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 -307.176000 362.196000 -315.176000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 -307.176000 367.404000 -315.176000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 -307.176000 371.876000 -315.176000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 -307.176000 375.052000 -315.176000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 -287.676000 361.172000 -295.676000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 -287.676000 364.340000 -295.676000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 -287.676000 367.396000 -295.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 -287.676000 372.604000 -295.676000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 -287.676000 379.348000 -295.676000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 -287.676000 384.484000 -295.676000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 -287.676000 389.436000 -295.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 -287.676000 392.108000 -295.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 -287.676000 395.708000 -295.676000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 -287.676000 397.540000 -295.676000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 -287.676000 402.444000 -295.676000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 -287.676000 406.788000 -295.676000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 -268.176000 392.972000 -276.176000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 -268.176000 398.076000 -276.176000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 -268.176000 403.180000 -276.176000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 -268.176000 405.428000 -276.176000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 -268.176000 410.332000 -276.176000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 -268.176000 414.476000 -276.176000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 -140.608000 305.808000 -154.608000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 -140.608000 314.138000 -154.608000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 -140.608000 320.788000 -154.608000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 -140.608000 328.698000 -154.608000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 -140.608000 336.972000 -154.608000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 -140.608000 344.182000 -154.608000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 -140.608000 349.810000 -154.608000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 -140.608000 354.234000 -154.608000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 -140.608000 362.718000 -154.608000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 -140.608000 367.870000 -154.608000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 -140.608000 372.322000 -154.608000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 -140.608000 382.080000 -154.608000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 -140.608000 388.772000 -154.608000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 -140.608000 397.802000 -154.608000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 -140.608000 402.254000 -154.608000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 -140.608000 407.896000 -154.608000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 -263.500000 0 424.300000 -263.500000 0 424.300000 -202.700000 0 493.600000 -202.700000 0 493.600000 -263.500000 0 458.900000 -263.500000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 -212.300000 0 428.900000 -212.300000 0 428.900000 -206.400000 0 434.800000 -206.400000 0 434.800000 -212.300000 0 431.900000 -212.300000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 -223.400000 0 428.900000 -223.400000 0 428.900000 -217.400000 0 434.800000 -217.400000 0 434.800000 -223.400000 0 431.900000 -223.400000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 -234.500000 0 428.900000 -234.500000 0 428.900000 -228.500000 0 434.800000 -228.500000 0 434.800000 -234.500000 0 431.900000 -234.500000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 -245.600000 0 428.900000 -245.600000 0 428.900000 -239.600000 0 434.800000 -239.600000 0 434.800000 -245.600000 0 431.900000 -245.600000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 -256.700000 0 428.900000 -256.700000 0 428.900000 -250.700000 0 434.800000 -250.700000 0 434.800000 -256.700000 0 431.900000 -256.700000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -205.276000 443.288000 -213.276000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 -205.276000 445.816000 -213.276000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 -205.276000 450.600000 -213.276000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 -205.276000 454.496000 -213.276000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 -205.276000 459.136000 -213.276000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 -205.276000 464.000000 -213.276000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 -205.276000 468.976000 -213.276000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 -205.276000 472.304000 -213.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 -205.276000 475.208000 -213.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 -205.276000 480.520000 -213.276000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 -205.276000 484.992000 -213.276000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 -205.276000 488.168000 -213.276000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -216.276000 443.352000 -224.276000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 -216.276000 447.920000 -224.276000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 -216.276000 452.976000 -224.276000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 -216.276000 457.400000 -224.276000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 -216.276000 462.472000 -224.276000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 -216.276000 465.800000 -224.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 -216.276000 468.904000 -224.276000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 -216.276000 473.816000 -224.276000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 -216.276000 478.888000 -224.276000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 -216.276000 482.064000 -224.276000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -227.376000 442.872000 -235.376000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 -227.376000 446.040000 -235.376000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 -227.376000 448.992000 -235.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 -227.376000 454.304000 -235.376000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 -227.376000 461.048000 -235.376000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 -227.376000 466.184000 -235.376000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 -227.376000 471.136000 -235.376000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 -227.376000 473.808000 -235.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 -227.376000 477.408000 -235.376000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 -227.376000 479.240000 -235.376000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 -227.376000 484.144000 -235.376000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 -227.376000 488.488000 -235.376000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -238.476000 443.384000 -246.476000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 -238.476000 448.464000 -246.476000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 -238.476000 453.424000 -246.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 -238.476000 456.696000 -246.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 -238.476000 459.800000 -246.476000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 -238.476000 462.032000 -246.476000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 -238.476000 466.936000 -246.476000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 -238.476000 471.080000 -246.476000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 -249.576000 443.272000 -257.576000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 -249.576000 448.376000 -257.576000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 -249.576000 453.480000 -257.576000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 -249.576000 455.728000 -257.576000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 -249.576000 460.632000 -257.576000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 -249.576000 464.776000 -257.576000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -2894.600000 0 114.800000 -2894.600000 0 114.800000 -2851.800000 0 72.000000 -2851.800000 0 72.000000 -2894.600000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 368650.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 546.200000 0 504.000000 546.200000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 546.200000 0
+eoFillPath subpath 1 72.000000 72.000000 0 504.000000 72.000000 0 504.000000 245.800000 0 72.000000 245.800000 0 72.000000 72.000000 0
+eoFillPath subpath 1 72.000000 245.800000 0 121.400000 245.800000 0 121.400000 546.200000 0 72.000000 546.200000 0 72.000000 245.800000 0
+eoFillPath subpath 1 454.500000 245.800000 0 504.000000 245.800000 0 504.000000 546.200000 0 454.500000 546.200000 0 454.500000 245.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 72.000000 701.300000 0 504.000000 701.300000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 701.300000 0
+eoFillPath subpath 1 72.000000 72.200000 0 504.000000 72.200000 0 504.000000 86.100000 0 72.000000 86.100000 0 72.000000 72.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 363.000000 719.948000 376.792000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 376.808000 719.948000 386.264000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 386.312000 719.948000 391.384000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 391.416000 719.948000 403.432000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 403.416000 719.948000 413.192000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 413.224000 719.948000 423.352000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 423.320000 719.948000 431.640000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 431.624000 719.948000 441.464000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 441.432000 719.948000 446.504000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 446.536000 719.948000 452.296000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 452.344000 719.948000 457.416000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 457.400000 719.948000 462.472000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 462.504000 719.948000 472.264000 703.948000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 469.912000 719.948000 476.488000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 476.120000 719.948000 485.960000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 485.928000 719.948000 495.768000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 495.736000 719.948000 504.056000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 471.148000 77.668000 455.148000 1.000000 0.000000 0.000000 1.000000
+drawChar 77.700000 471.148000 88.612000 455.148000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 86.900000 471.148000 94.788000 455.148000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 94.804000 471.148000 105.652000 455.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.700000 471.148000 116.548000 455.148000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 116.596000 471.148000 126.116000 455.148000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 446.536000 194.308000 434.536000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 194.296000 446.536000 201.388000 434.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 201.400000 446.536000 207.556000 434.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 207.604000 446.536000 211.432000 434.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 211.408000 446.536000 219.088000 434.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 219.112000 446.536000 226.204000 434.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 226.216000 446.536000 232.372000 434.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 232.516000 446.536000 236.320000 434.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 236.416000 446.536000 241.228000 434.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 241.216000 446.536000 248.944000 434.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 249.016000 446.536000 256.108000 434.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 256.120000 446.536000 259.924000 434.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 260.116000 446.536000 267.268000 434.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 267.220000 446.536000 274.900000 434.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 274.924000 446.536000 282.148000 434.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 282.124000 446.536000 288.892000 434.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 288.928000 446.536000 296.020000 434.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 296.032000 446.536000 300.076000 434.536000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 300.136000 446.536000 311.512000 434.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 311.440000 446.536000 318.532000 434.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 318.544000 446.536000 326.272000 434.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 326.344000 446.536000 331.156000 434.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 331.144000 446.536000 334.972000 434.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 334.948000 446.536000 342.172000 434.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 342.244000 446.536000 349.972000 434.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 349.948000 446.536000 357.040000 434.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 357.052000 446.536000 364.732000 434.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 364.756000 446.536000 368.560000 434.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 368.752000 446.536000 373.192000 434.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 373.156000 446.536000 378.892000 434.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 378.952000 446.536000 386.680000 434.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 386.656000 446.536000 390.484000 434.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 390.460000 446.536000 395.272000 434.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 395.356000 446.536000 399.160000 434.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 399.352000 446.536000 404.164000 434.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 404.152000 446.536000 409.888000 434.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 409.852000 446.536000 416.944000 434.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 416.956000 446.536000 424.048000 434.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 424.060000 446.536000 430.216000 434.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 430.264000 446.536000 434.068000 434.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 434.164000 446.536000 437.968000 434.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.064000 446.536000 442.804000 434.536000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 442.768000 446.536000 446.572000 434.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 446.872000 446.536000 454.024000 434.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 453.976000 446.536000 457.804000 434.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 457.780000 446.536000 463.936000 434.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 463.984000 446.536000 471.208000 434.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 471.184000 446.536000 474.988000 434.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 475.180000 446.536000 482.908000 434.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 482.980000 446.536000 490.132000 434.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 490.084000 446.536000 496.852000 434.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 496.888000 446.536000 503.980000 434.536000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 446.536000 507.904000 434.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 432.636000 191.656000 420.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 432.636000 198.796000 420.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 198.808000 432.636000 205.576000 420.636000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 205.612000 432.636000 212.704000 420.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 212.716000 432.636000 218.452000 420.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 218.416000 432.636000 225.568000 420.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 225.616000 432.636000 229.444000 420.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 229.420000 432.636000 233.224000 420.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 233.224000 432.636000 240.448000 420.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 240.424000 432.636000 246.160000 420.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 246.124000 432.636000 253.852000 420.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 253.828000 432.636000 260.980000 420.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 261.028000 432.636000 272.404000 420.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 272.428000 432.636000 279.520000 420.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 279.532000 432.636000 287.260000 420.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 287.236000 432.636000 292.048000 420.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 292.036000 432.636000 299.188000 420.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 299.236000 432.636000 303.064000 420.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 303.040000 432.636000 306.844000 420.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 306.844000 432.636000 311.656000 420.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 311.644000 432.636000 317.380000 420.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 317.344000 432.636000 324.436000 420.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 324.448000 432.636000 331.540000 420.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 331.552000 432.636000 337.708000 420.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 337.756000 432.636000 341.560000 420.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 341.560000 432.636000 348.712000 420.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 348.760000 432.636000 356.488000 420.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 356.464000 432.636000 364.144000 420.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 364.168000 432.636000 367.972000 420.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 367.972000 432.636000 375.652000 420.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 375.676000 432.636000 379.504000 420.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 379.480000 432.636000 386.632000 420.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 386.680000 432.636000 394.408000 420.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 394.384000 432.636000 399.196000 420.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 399.184000 432.636000 405.340000 420.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 405.388000 432.636000 409.192000 420.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 409.192000 432.636000 414.004000 420.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 413.992000 432.636000 421.216000 420.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 421.192000 432.636000 424.996000 420.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 424.996000 432.636000 431.716000 420.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 431.692000 432.636000 437.428000 420.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 437.392000 432.636000 444.484000 420.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 444.496000 432.636000 451.648000 420.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 451.696000 432.636000 456.508000 420.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 456.496000 432.636000 463.588000 420.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 463.600000 432.636000 467.404000 420.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 467.404000 432.636000 474.556000 420.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 474.604000 432.636000 478.408000 420.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 478.408000 432.636000 486.088000 420.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 486.112000 432.636000 493.204000 420.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 493.216000 432.636000 499.936000 420.636000 1.000000 0.000000 0.000000 1.000000 c
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 432.636000 504.044000 420.636000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 418.736000 192.724000 406.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 192.700000 418.736000 198.436000 406.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 198.496000 418.736000 205.648000 406.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 205.600000 418.736000 210.412000 406.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 210.400000 418.736000 214.228000 406.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 214.300000 418.736000 221.068000 406.736000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 221.104000 418.736000 228.196000 406.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 228.208000 418.736000 232.036000 406.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 232.012000 418.736000 238.780000 406.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 240.412000 418.736000 244.216000 406.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.812000 418.736000 249.640000 406.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 249.616000 418.736000 256.768000 406.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 256.816000 418.736000 264.544000 406.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 264.520000 418.736000 272.200000 406.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 272.224000 418.736000 278.380000 406.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 278.428000 418.736000 285.148000 406.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 285.124000 418.736000 292.276000 406.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 292.228000 418.736000 299.908000 406.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 299.932000 418.736000 307.024000 406.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 307.036000 418.736000 314.716000 406.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 316.336000 418.736000 320.140000 406.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 321.832000 418.736000 328.600000 406.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 328.636000 418.736000 335.788000 406.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 335.740000 418.736000 341.476000 406.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 341.536000 418.736000 349.216000 406.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 349.240000 418.736000 353.044000 406.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 354.640000 418.736000 358.444000 406.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 360.040000 418.736000 368.356000 406.736000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 367.744000 418.736000 374.968000 406.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 374.944000 418.736000 378.772000 406.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 378.748000 418.736000 382.576000 406.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 382.648000 418.736000 389.872000 406.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 389.848000 418.736000 400.108000 406.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 400.144000 418.736000 403.972000 406.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 403.948000 418.736000 411.676000 406.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 411.652000 418.736000 419.332000 406.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 420.952000 418.736000 424.756000 406.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 426.448000 418.736000 433.600000 406.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 433.648000 418.736000 439.384000 406.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 439.348000 418.736000 446.440000 406.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 448.048000 418.736000 451.852000 406.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 453.448000 418.736000 459.604000 406.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 459.652000 418.736000 466.876000 406.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 466.852000 418.736000 478.228000 406.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 478.252000 418.736000 485.344000 406.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 486.952000 418.736000 490.756000 406.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 492.448000 418.736000 499.672000 406.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 499.648000 418.736000 504.088000 406.736000 1.000000 0.000000 0.000000 1.000000 f
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 418.736000 507.904000 406.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 404.836000 190.312000 392.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 404.836000 198.028000 392.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.004000 404.836000 205.096000 392.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 205.108000 404.836000 208.912000 392.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 208.912000 404.836000 213.724000 392.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 213.712000 404.836000 220.480000 392.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 220.516000 404.836000 228.196000 392.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 228.220000 404.836000 235.312000 392.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 235.324000 404.836000 241.480000 392.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 241.528000 404.836000 245.332000 392.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.332000 404.836000 252.556000 392.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 252.532000 404.836000 256.972000 392.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 256.936000 404.836000 260.740000 392.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 260.740000 404.836000 265.552000 392.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 265.540000 404.836000 271.276000 392.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 271.240000 404.836000 278.332000 392.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 278.344000 404.836000 285.436000 392.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 285.448000 404.836000 291.604000 392.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 291.652000 404.836000 295.456000 392.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 295.456000 404.836000 303.136000 392.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 303.160000 404.836000 306.988000 392.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 306.964000 404.836000 314.116000 392.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.164000 404.836000 321.892000 392.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 321.868000 404.836000 326.680000 392.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 326.668000 404.836000 333.760000 392.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 333.772000 404.836000 341.452000 392.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 341.476000 404.836000 345.280000 392.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 345.280000 404.836000 353.008000 392.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 352.984000 404.836000 360.076000 392.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 360.088000 404.836000 365.824000 392.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 365.788000 404.836000 372.880000 392.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 372.892000 404.836000 376.924000 392.836000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 113 1 0 1 0 1200.000000 0 GAAAAA+DejaVuSerif-BoldItalic
+drawChar 206.200000 384.856000 215.740000 372.856000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 215.800000 384.856000 223.792000 372.856000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 223.804000 384.856000 232.528000 372.856000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 232.504000 384.856000 237.052000 372.856000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 237.100000 384.856000 242.260000 372.856000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 242.296000 384.856000 249.928000 372.856000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 249.892000 384.856000 256.204000 372.856000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 256.192000 384.856000 264.184000 372.856000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 264.196000 384.856000 272.920000 372.856000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 272.896000 384.856000 279.640000 372.856000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 279.700000 384.856000 283.876000 372.856000 1.000000 0.000000 0.000000 1.000000
+drawChar 283.900000 384.856000 292.828000 372.856000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 292.000000 384.856000 298.312000 372.856000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 298.300000 384.856000 305.932000 372.856000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 305.896000 384.856000 313.528000 372.856000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 313.492000 384.856000 320.236000 372.856000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 113 1 0 1 0 1200.000000 0 GAAAAA+DejaVuSerif-BoldItalic
+drawChar 367.100000 384.856000 377.504000 372.856000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 377.504000 384.856000 385.136000 372.856000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 385.100000 384.856000 392.396000 372.856000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 392.396000 384.856000 396.944000 372.856000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 396.992000 384.856000 405.380000 372.856000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 405.392000 384.856000 414.116000 372.856000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 414.092000 384.856000 422.084000 372.856000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 422.096000 384.856000 430.820000 372.856000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 430.796000 384.856000 437.540000 372.856000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 437.600000 384.856000 441.776000 372.856000 1.000000 0.000000 0.000000 1.000000
+drawChar 441.800000 384.856000 450.728000 372.856000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 449.900000 384.856000 456.212000 372.856000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.200000 384.856000 463.832000 372.856000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 463.796000 384.856000 471.428000 372.856000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 471.392000 384.856000 478.136000 372.856000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.400000 370.836000 193.464000 358.836000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 193.500000 370.836000 197.328000 358.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 197.304000 370.836000 205.032000 358.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 205.008000 370.836000 212.100000 358.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 212.112000 370.836000 218.268000 358.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 342.200000 370.836000 352.028000 358.836000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 352.004000 370.836000 359.156000 358.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 359.204000 370.836000 366.464000 358.836000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.400000 356.936000 195.012000 344.936000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 195.000000 356.936000 202.224000 344.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 202.200000 356.936000 209.928000 344.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 209.904000 356.936000 217.584000 344.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 217.608000 356.936000 221.436000 344.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 221.412000 356.936000 228.564000 344.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.612000 356.936000 234.768000 344.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 234.816000 356.936000 238.620000 344.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 238.620000 356.936000 246.936000 344.936000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 246.924000 356.936000 250.752000 344.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 250.728000 356.936000 256.464000 344.936000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 342.200000 356.936000 351.380000 344.936000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 351.404000 356.936000 359.132000 344.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 359.108000 356.936000 366.200000 344.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 366.212000 356.936000 372.368000 344.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 372.416000 356.936000 377.228000 344.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 377.216000 356.936000 384.944000 344.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 384.920000 356.936000 392.648000 344.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 392.624000 356.936000 397.436000 344.936000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.400000 343.036000 193.620000 331.036000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 193.596000 343.036000 201.276000 331.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 201.300000 343.036000 207.036000 331.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 207.000000 343.036000 214.728000 331.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 214.704000 343.036000 221.424000 331.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 221.400000 343.036000 228.492000 331.036000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 342.200000 343.036000 351.008000 331.036000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 350.996000 343.036000 358.088000 331.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 358.100000 343.036000 365.192000 331.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 365.204000 343.036000 371.924000 331.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 371.900000 343.036000 379.628000 331.036000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 305.248000 85.220000 289.248000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 85.204000 305.248000 95.988000 289.248000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 96.004000 305.248000 103.892000 289.248000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 103.908000 305.248000 115.348000 289.248000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 115.412000 305.248000 126.260000 289.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 126.308000 305.248000 137.684000 289.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 137.716000 305.248000 143.284000 289.248000 1.000000 0.000000 0.000000 1.000000
+drawChar 143.316000 305.248000 154.836000 289.248000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 154.820000 305.248000 166.196000 289.248000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 166.228000 305.248000 177.076000 289.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 177.124000 305.248000 188.564000 289.248000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 280.736000 194.308000 268.736000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 194.296000 280.736000 201.388000 268.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 201.400000 280.736000 209.128000 268.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 209.104000 280.736000 212.932000 268.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 213.004000 280.736000 220.732000 268.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 220.708000 280.736000 228.388000 268.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 228.808000 280.736000 232.612000 268.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 233.008000 280.736000 237.820000 268.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 237.808000 280.736000 245.536000 268.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 245.608000 280.736000 252.700000 268.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 253.108000 280.736000 256.912000 268.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 257.308000 280.736000 264.028000 268.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 264.004000 280.736000 271.156000 268.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 271.204000 280.736000 276.940000 268.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 276.904000 280.736000 284.584000 268.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 284.608000 280.736000 291.832000 268.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 291.808000 280.736000 297.544000 268.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 297.604000 280.736000 302.416000 268.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 302.404000 280.736000 306.208000 268.736000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 306.604000 280.736000 310.408000 268.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 310.804000 280.736000 318.028000 268.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 318.004000 280.736000 325.732000 268.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 326.104000 280.736000 329.908000 268.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 330.400000 280.736000 335.212000 268.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 335.200000 280.736000 342.928000 268.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 343.000000 280.736000 350.092000 268.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 350.404000 280.736000 354.208000 268.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.604000 280.736000 358.432000 268.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 358.408000 280.736000 365.500000 268.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 365.512000 280.736000 369.952000 268.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 370.012000 280.736000 374.824000 268.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 375.208000 280.736000 379.012000 268.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 379.408000 280.736000 385.564000 268.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 385.612000 280.736000 389.440000 268.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 389.416000 280.736000 397.096000 268.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 397.120000 280.736000 404.212000 268.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 404.620000 280.736000 408.424000 268.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 408.820000 280.736000 416.044000 268.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 416.116000 280.736000 420.556000 268.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 420.916000 280.736000 424.720000 268.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 425.116000 280.736000 429.928000 268.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 429.916000 280.736000 437.644000 268.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 437.716000 280.736000 444.808000 268.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 445.216000 280.736000 449.020000 268.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 449.416000 280.736000 457.144000 268.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 457.120000 280.736000 464.344000 268.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 464.416000 280.736000 472.144000 268.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 472.120000 280.736000 478.276000 268.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 478.216000 280.736000 485.308000 268.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 485.320000 280.736000 489.124000 268.736000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 489.520000 280.736000 493.324000 268.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 493.720000 280.736000 497.548000 268.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 497.524000 280.736000 503.680000 268.736000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 280.736000 508.004000 268.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 266.836000 192.652000 254.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 193.504000 266.836000 197.308000 254.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 198.208000 266.836000 205.888000 254.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 205.912000 266.836000 213.064000 254.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 213.016000 266.836000 218.752000 254.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 218.812000 266.836000 226.492000 254.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 226.516000 266.836000 233.608000 254.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 233.620000 266.836000 241.348000 254.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 242.116000 266.836000 245.920000 254.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 246.820000 266.836000 252.976000 254.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 253.024000 266.836000 260.752000 254.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 260.728000 266.836000 267.820000 254.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 267.832000 266.836000 275.512000 254.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 275.536000 266.836000 279.340000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.132000 266.836000 283.936000 254.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 284.836000 266.836000 292.828000 254.836000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 292.840000 266.836000 300.568000 254.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 300.544000 266.836000 307.636000 254.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 308.440000 266.836000 312.244000 254.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 313.144000 266.836000 319.864000 254.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 319.840000 266.836000 326.992000 254.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 327.040000 266.836000 332.776000 254.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 332.740000 266.836000 340.420000 254.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 340.444000 266.836000 347.668000 254.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 347.644000 266.836000 353.380000 254.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 353.440000 266.836000 358.252000 254.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 359.044000 266.836000 362.848000 254.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 363.748000 266.836000 370.900000 254.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 370.948000 266.836000 378.676000 254.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 378.652000 266.836000 386.332000 254.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 387.148000 266.836000 390.952000 254.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 391.852000 266.836000 396.664000 254.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 396.652000 266.836000 404.380000 254.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 404.452000 266.836000 411.544000 254.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 412.252000 266.836000 416.056000 254.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 417.052000 266.836000 423.208000 254.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 423.256000 266.836000 430.984000 254.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 430.852000 266.836000 437.944000 254.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 437.956000 266.836000 445.636000 254.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 446.452000 266.836000 450.256000 254.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 451.156000 266.836000 458.308000 254.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 458.356000 266.836000 464.092000 254.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 464.056000 266.836000 471.148000 254.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 471.952000 266.836000 475.756000 254.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 476.656000 266.836000 484.336000 254.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 484.360000 266.836000 491.584000 254.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 491.560000 266.836000 496.372000 254.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 496.360000 266.836000 504.088000 254.836000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 266.836000 507.904000 254.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 252.936000 196.876000 240.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 196.900000 252.936000 204.052000 240.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 204.004000 252.936000 211.684000 240.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 211.708000 252.936000 218.800000 240.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 220.408000 252.936000 224.212000 240.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 225.808000 252.936000 233.032000 240.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 233.104000 252.936000 237.544000 240.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 239.104000 252.936000 242.908000 240.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 244.504000 252.936000 252.184000 240.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 252.208000 252.936000 259.360000 240.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 259.312000 252.936000 265.048000 240.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 265.108000 252.936000 272.368000 240.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 274.012000 252.936000 277.816000 240.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.412000 252.936000 289.672000 240.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 289.708000 252.936000 296.932000 240.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 296.908000 252.936000 304.132000 240.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 304.108000 252.936000 311.788000 240.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 311.812000 252.936000 315.616000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 317.212000 252.936000 321.016000 240.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 322.612000 252.936000 327.352000 240.936000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 327.316000 252.936000 332.128000 240.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 332.212000 252.936000 335.500000 240.936000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 335.512000 252.936000 341.668000 240.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 343.216000 252.936000 347.020000 240.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 348.616000 252.936000 356.296000 240.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 356.320000 252.936000 360.148000 240.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 360.220000 252.936000 367.900000 240.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 369.424000 252.936000 373.228000 240.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 374.920000 252.936000 382.012000 240.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 382.024000 252.936000 389.752000 240.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 389.728000 252.936000 396.952000 240.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 397.024000 252.936000 404.752000 240.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 404.620000 252.936000 412.300000 240.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 412.324000 252.936000 420.052000 240.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 421.624000 252.936000 425.428000 240.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 427.120000 252.936000 431.932000 240.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 431.920000 252.936000 439.144000 240.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 440.716000 252.936000 444.520000 240.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 446.116000 252.936000 452.272000 240.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 452.320000 252.936000 457.132000 240.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 457.120000 252.936000 464.344000 240.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 464.320000 252.936000 470.056000 240.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 470.020000 252.936000 477.112000 240.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 478.816000 252.936000 482.620000 240.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.216000 252.936000 489.028000 240.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.016000 252.936000 496.744000 240.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.816000 252.936000 503.908000 240.936000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 252.936000 507.904000 240.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 239.036000 190.312000 227.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 239.036000 197.524000 227.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 197.500000 239.036000 204.724000 227.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 204.700000 239.036000 208.528000 227.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 208.504000 239.036000 214.660000 227.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 214.708000 239.036000 218.512000 227.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 218.512000 239.036000 222.316000 227.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 222.400000 239.036000 230.080000 227.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 230.104000 239.036000 237.256000 227.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 237.304000 239.036000 243.040000 227.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 243.004000 239.036000 250.684000 227.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 250.708000 239.036000 257.800000 227.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 257.812000 239.036000 265.540000 227.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 265.516000 239.036000 269.320000 227.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 269.320000 239.036000 273.760000 227.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 273.724000 239.036000 281.452000 227.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 281.428000 239.036000 287.164000 227.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 287.128000 239.036000 294.856000 227.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 294.832000 239.036000 298.660000 227.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 298.636000 239.036000 303.448000 227.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 303.436000 239.036000 311.164000 227.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 311.140000 239.036000 316.876000 227.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 316.840000 239.036000 323.932000 227.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 323.944000 239.036000 327.748000 227.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 327.748000 239.036000 331.552000 227.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 331.800000 239.036000 335.628000 227.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 335.604000 239.036000 342.756000 227.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 342.804000 239.036000 353.064000 227.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 353.100000 239.036000 360.828000 227.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 360.804000 239.036000 372.180000 227.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 372.204000 239.036000 379.428000 227.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 379.404000 239.036000 389.664000 227.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 389.700000 239.036000 396.792000 227.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 396.804000 239.036000 402.540000 227.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 402.504000 239.036000 406.308000 227.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 406.308000 239.036000 413.460000 227.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 413.508000 239.036000 421.236000 227.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 421.212000 239.036000 428.892000 227.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 428.916000 239.036000 432.720000 227.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 432.700000 239.036000 440.380000 227.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 440.404000 239.036000 444.232000 227.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 444.208000 239.036000 450.928000 227.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 450.904000 239.036000 457.672000 227.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 457.708000 239.036000 464.428000 227.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 464.404000 239.036000 468.232000 227.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 468.208000 239.036000 475.300000 227.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 475.312000 239.036000 481.468000 227.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 481.516000 239.036000 485.320000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 455.600000 86.136000 463.664000 74.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 463.100000 86.136000 470.252000 74.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 470.300000 86.136000 477.980000 74.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 478.004000 86.136000 485.096000 74.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 485.108000 86.136000 488.912000 74.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 488.900000 86.136000 496.532000 74.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 496.496000 86.136000 504.128000 74.136000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 10777.400000 0 477.900000 10777.400000 0 477.900000 11087.200000 0 134.300000 11087.200000 0 134.300000 10777.400000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -998550.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 7788.400000 0 168.100000 7788.400000 0 168.100000 7793.400000 0 76.900000 7793.400000 0 76.900000 7788.400000 0
+eoFillPath subpath 1 163.100000 7793.300000 0 168.100000 7793.300000 0 168.100000 7923.900000 0 163.100000 7923.900000 0 163.100000 7793.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 7793.400000 0 163.100000 7793.400000 0 163.100000 7928.800000 0 72.000000 7928.800000 0 72.000000 7793.400000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 7924.480000 87.320000 7914.480000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 7924.480000 93.420000 7914.480000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 7924.480000 97.510000 7914.480000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 7924.480000 101.420000 7914.480000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 7924.480000 104.170000 7914.480000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 7924.480000 110.530000 7914.480000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 7924.480000 113.270000 7914.480000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 7924.480000 116.470000 7914.480000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 7924.480000 123.480000 7914.480000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 7924.480000 129.610000 7914.480000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 7924.480000 135.090000 7914.480000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 7924.480000 140.890000 7914.480000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 7924.480000 144.820000 7914.480000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 7924.480000 150.920000 7914.480000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 7924.480000 153.670000 7914.480000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 7924.480000 156.470000 7914.480000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 7797.600000 0 168.200000 7797.600000 0 168.200000 7912.800000 0 72.000000 7912.800000 0 72.000000 7797.600000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7865.752000 79.253000 7856.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 7865.752000 86.669000 7856.752000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 7865.752000 90.215000 7856.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 7865.752000 93.077000 7856.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 7865.752000 97.406000 7856.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 7865.752000 100.853000 7856.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 7865.752000 107.324000 7856.752000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 7865.752000 112.337000 7856.752000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 7865.752000 115.271000 7856.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 7865.752000 118.655000 7856.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 7865.752000 126.512000 7856.752000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 7865.752000 130.805000 7856.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 7865.752000 135.881000 7856.752000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 7865.752000 139.355000 7856.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 7865.752000 147.284000 7856.752000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 7865.752000 150.074000 7856.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 7865.752000 155.897000 7856.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 7865.752000 158.750000 7856.752000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 7865.752000 161.853000 7856.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7855.252000 82.124000 7846.252000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 7855.252000 87.137000 7846.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 7855.252000 90.071000 7846.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 7855.252000 93.356000 7846.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 7855.252000 100.403000 7846.252000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 7855.252000 104.921000 7846.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 7855.252000 109.205000 7846.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 7855.252000 117.737000 7846.252000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 7855.252000 123.119000 7846.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 7855.252000 128.996000 7846.252000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 7855.252000 132.605000 7846.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 7855.252000 138.392000 7846.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 7855.252000 141.749000 7846.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 7855.252000 149.507000 7846.252000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 7855.252000 153.800000 7846.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 7855.252000 158.876000 7846.252000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 7855.252000 161.853000 7846.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7844.752000 81.764000 7835.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 7844.752000 87.596000 7835.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 7844.752000 93.356000 7835.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 7844.752000 102.050000 7835.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 7844.752000 113.822000 7835.752000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 7844.752000 122.651000 7835.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 7844.752000 134.117000 7835.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 7844.752000 138.401000 7835.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 7844.752000 147.149000 7835.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 7844.752000 158.921000 7835.752000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 7844.752000 161.853000 7835.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7834.252000 79.271000 7825.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 7834.252000 84.338000 7825.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 7834.252000 89.621000 7825.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 7834.252000 94.643000 7825.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 7834.252000 100.502000 7825.252000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 7834.252000 106.262000 7825.252000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 7834.252000 111.518000 7825.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 7834.252000 116.216000 7825.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 7834.252000 119.249000 7825.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 7834.252000 122.363000 7825.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 7834.252000 128.186000 7825.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 7834.252000 131.345000 7825.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 7834.252000 137.060000 7825.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 7834.252000 140.147000 7825.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 7834.252000 145.007000 7825.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 7834.252000 148.598000 7825.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 7834.252000 151.460000 7825.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 7834.252000 155.789000 7825.252000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 7834.252000 158.933000 7825.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7823.752000 80.702000 7814.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 7823.752000 83.573000 7814.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 7823.752000 89.396000 7814.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 7823.752000 95.156000 7814.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 7823.752000 100.547000 7814.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 7823.752000 109.052000 7814.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 7823.752000 111.959000 7814.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 7823.752000 117.251000 7814.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 7823.752000 121.904000 7814.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 7823.752000 126.503000 7814.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 7823.752000 129.338000 7814.752000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 7823.752000 134.936000 7814.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 7823.752000 143.441000 7814.752000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 7823.752000 148.796000 7814.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 7823.752000 154.574000 7814.752000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 7823.752000 158.876000 7814.752000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 7823.752000 161.853000 7814.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7813.252000 79.271000 7804.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 7813.252000 85.094000 7804.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 7813.252000 88.703000 7804.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 7813.252000 94.112000 7804.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 7813.252000 97.244000 7804.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 7813.252000 103.058000 7804.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 7813.252000 108.890000 7804.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 7813.252000 111.950000 7804.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 7813.252000 115.271000 7804.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 7813.252000 120.338000 7804.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 7813.252000 125.621000 7804.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 7813.252000 131.363000 7804.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 7813.252000 134.558000 7804.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 7813.252000 140.048000 7804.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 7813.252000 145.430000 7804.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 7813.252000 150.551000 7804.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 7813.252000 155.960000 7804.252000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 7813.252000 158.933000 7804.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7802.752000 80.009000 7793.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 7802.752000 85.364000 7793.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 7802.752000 88.271000 7793.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 7802.752000 91.169000 7793.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 7802.752000 97.955000 7793.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 7802.752000 107.765000 7793.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 7802.752000 110.672000 7793.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 7802.752000 115.964000 7793.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 7802.752000 120.617000 7793.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 7802.752000 125.216000 7793.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 7802.752000 128.051000 7793.752000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 7802.752000 134.954000 7793.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 7802.752000 146.285000 7793.752000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 7802.752000 151.667000 7793.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 7802.752000 155.906000 7793.752000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 7802.752000 159.033000 7793.752000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 7793.300000 0 72.100000 7793.300000 0 72.100000 7928.800000 0 72.000000 7928.800000 0 72.000000 7793.300000 0
+eoFillPath subpath 1 163.100000 7793.300000 0 163.200000 7793.300000 0 163.200000 7928.800000 0 163.100000 7928.800000 0 163.100000 7793.300000 0
+eoFillPath subpath 1 72.000000 7928.700000 0 163.200000 7928.700000 0 163.200000 7928.800000 0 72.000000 7928.800000 0 72.000000 7928.700000 0
+eoFillPath subpath 1 72.000000 7793.300000 0 163.200000 7793.300000 0 163.200000 7793.400000 0 72.000000 7793.400000 0 72.000000 7793.300000 0
+saveState
+eoClipPath subpath 1 96.900000 7868.600000 0 138.300000 7868.600000 0 138.300000 7912.800000 0 96.900000 7912.800000 0 96.900000 7868.600000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -707670.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 7513.800000 0 165.500000 7513.800000 0 165.500000 7518.800000 0 76.900000 7518.800000 0 76.900000 7513.800000 0
+eoFillPath subpath 1 160.500000 7518.700000 0 165.500000 7518.700000 0 165.500000 7675.000000 0 160.500000 7675.000000 0 160.500000 7518.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 7518.800000 0 121.400000 7518.800000 0 121.400000 7679.900000 0 72.000000 7679.900000 0 72.000000 7518.800000 0
+saveState
+eoClipPath subpath 1 72.000000 7518.700000 0 160.500000 7518.700000 0 160.500000 7679.800000 0 72.000000 7679.800000 0 72.000000 7518.700000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -670970.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 7675.580000 89.280000 7665.580000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 7675.580000 95.630000 7665.580000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 7675.580000 99.520000 7665.580000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 7675.580000 102.270000 7665.580000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 7675.580000 108.450000 7665.580000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 7675.580000 112.610000 7665.580000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 7675.580000 118.510000 7665.580000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 7675.580000 121.670000 7665.580000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 7675.580000 124.470000 7665.580000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 7675.580000 130.830000 7665.580000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 7675.580000 133.970000 7665.580000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 7675.580000 137.920000 7665.580000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 7675.580000 144.230000 7665.580000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 7675.580000 150.350000 7665.580000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 7675.580000 153.570000 7665.580000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 7663.880000 95.000000 7653.880000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 7663.880000 97.770000 7653.880000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 7663.880000 103.000000 7653.880000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 7663.880000 109.330000 7653.880000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 7663.880000 117.470000 7653.880000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 7663.880000 123.620000 7653.880000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 7663.880000 128.800000 7653.880000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 7663.880000 135.130000 7653.880000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 7663.880000 141.250000 7653.880000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 7663.880000 145.410000 7653.880000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7649.052000 82.961000 7640.052000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 7649.052000 87.614000 7640.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 7649.052000 93.356000 7640.052000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 7649.052000 98.612000 7640.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 7649.052000 103.733000 7640.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 7649.052000 106.568000 7640.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 7649.052000 111.959000 7640.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 7649.052000 114.866000 7640.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 7649.052000 117.665000 7640.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 7649.052000 122.768000 7640.052000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 7649.052000 125.747000 7640.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 7649.052000 131.651000 7640.052000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 7649.052000 136.907000 7640.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 7649.052000 142.307000 7640.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 7649.052000 148.049000 7640.052000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 7649.052000 150.956000 7640.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 7649.052000 156.302000 7640.052000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7649.052000 159.253000 7640.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7638.552000 84.095000 7629.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 7638.552000 89.900000 7629.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 7638.552000 95.318000 7629.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 7638.552000 100.349000 7629.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 7638.552000 110.789000 7629.552000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 7638.552000 111.464000 7629.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 7638.552000 114.362000 7629.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 7638.552000 119.348000 7629.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 7638.552000 126.962000 7629.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 7638.552000 132.047000 7629.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 7638.552000 139.958000 7629.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 7638.552000 142.865000 7629.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 7638.552000 147.410000 7629.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 7638.552000 153.287000 7629.552000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 7638.552000 156.333000 7629.552000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7628.052000 84.095000 7619.052000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 7628.052000 89.468000 7619.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 7628.052000 94.121000 7619.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 7628.052000 99.899000 7619.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 7628.052000 105.218000 7619.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 7628.052000 109.502000 7619.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 7628.052000 115.649000 7619.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 7628.052000 122.327000 7619.052000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 7628.052000 127.718000 7619.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 7628.052000 132.002000 7619.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 7628.052000 138.149000 7619.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 7628.052000 145.205000 7619.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 7628.052000 150.992000 7619.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 7628.052000 156.311000 7619.052000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7628.052000 159.253000 7619.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7617.552000 82.394000 7608.552000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 7617.552000 86.705000 7608.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 7617.552000 91.322000 7608.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 7617.552000 94.913000 7608.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 7617.552000 98.054000 7608.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 7617.552000 102.014000 7608.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 7617.552000 104.876000 7608.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 7617.552000 113.435000 7608.552000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 7617.552000 118.718000 7608.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 7617.552000 121.949000 7608.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 7617.552000 125.063000 7608.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 7617.552000 130.886000 7608.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 7617.552000 134.045000 7608.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 7617.552000 138.005000 7608.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 7617.552000 143.792000 7608.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 7617.552000 149.111000 7608.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 7617.552000 151.964000 7608.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 7617.552000 156.293000 7608.552000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 7617.552000 159.153000 7608.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7607.052000 79.271000 7598.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 7607.052000 82.169000 7598.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 7607.052000 85.526000 7598.052000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 7607.052000 90.818000 7598.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 7607.052000 94.454000 7598.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 7607.052000 99.008000 7598.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 7607.052000 104.318000 7598.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 7607.052000 110.096000 7598.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 7607.052000 115.856000 7598.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 7607.052000 119.546000 7598.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 7607.052000 124.001000 7598.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 7607.052000 129.509000 7598.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 7607.052000 133.145000 7598.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 7607.052000 139.751000 7598.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 7607.052000 145.205000 7598.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 7607.052000 148.841000 7598.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 7607.052000 152.657000 7598.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 7607.052000 156.293000 7598.052000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7607.052000 159.253000 7598.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7596.552000 84.095000 7587.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 7596.552000 88.406000 7587.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 7596.552000 93.824000 7587.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 7596.552000 99.602000 7587.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 7596.552000 105.362000 7587.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 7596.552000 108.422000 7587.552000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 7596.552000 116.747000 7587.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 7596.552000 129.275000 7587.552000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 7596.552000 135.089000 7587.552000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 7596.552000 138.698000 7587.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 7596.552000 141.560000 7587.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 7596.552000 146.906000 7587.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 7596.552000 151.190000 7587.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 7596.552000 156.266000 7587.552000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7596.552000 159.253000 7587.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7586.052000 82.196000 7577.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 7586.052000 87.560000 7577.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 7586.052000 92.213000 7577.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 7586.052000 96.551000 7577.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 7586.052000 101.708000 7577.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 7586.052000 107.216000 7577.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 7586.052000 111.653000 7577.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 7586.052000 118.961000 7577.052000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 7586.052000 124.316000 7577.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 7586.052000 128.654000 7577.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 7586.052000 133.172000 7577.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 7586.052000 138.995000 7577.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 7586.052000 143.612000 7577.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 7586.052000 148.913000 7577.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 7586.052000 153.197000 7577.052000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 7586.052000 156.333000 7577.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7575.552000 80.009000 7566.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 7575.552000 85.319000 7566.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 7575.552000 91.061000 7566.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 7575.552000 100.052000 7566.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 7575.552000 113.993000 7566.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 7575.552000 116.873000 7566.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 7575.552000 120.410000 7566.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 7575.552000 126.296000 7566.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 7575.552000 135.350000 7566.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 7575.552000 145.106000 7566.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 7575.552000 150.893000 7566.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 7575.552000 156.212000 7566.552000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7575.552000 159.253000 7566.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7565.052000 82.196000 7556.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 7565.052000 87.560000 7556.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 7565.052000 93.392000 7556.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 7565.052000 99.152000 7556.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 7565.052000 101.960000 7556.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 7565.052000 107.306000 7556.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 7565.052000 111.905000 7556.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 7565.052000 115.640000 7556.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 7565.052000 122.444000 7556.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 7565.052000 127.898000 7556.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 7565.052000 135.575000 7556.052000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 7565.052000 141.380000 7556.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 7565.052000 145.241000 7556.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 7565.052000 150.803000 7556.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 7565.052000 156.302000 7556.052000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7565.052000 159.253000 7556.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7554.552000 80.009000 7545.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 7554.552000 85.796000 7545.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 7554.552000 91.115000 7545.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 7554.552000 95.399000 7545.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 7554.552000 100.718000 7545.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 7554.552000 107.054000 7545.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 7554.552000 118.097000 7545.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 7554.552000 123.524000 7545.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 7554.552000 129.401000 7545.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 7554.552000 131.768000 7545.552000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 7554.552000 135.413000 7545.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 7554.552000 141.659000 7545.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 7554.552000 150.965000 7545.552000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 7554.552000 156.320000 7545.552000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7554.552000 159.253000 7545.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7544.052000 81.017000 7535.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 7544.052000 84.608000 7535.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 7544.052000 89.963000 7535.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 7544.052000 92.870000 7535.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 7544.052000 98.693000 7535.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 7544.052000 103.310000 7535.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 7544.052000 107.243000 7535.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 7544.052000 116.081000 7535.052000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 7544.052000 121.886000 7535.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 7544.052000 127.205000 7535.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 7544.052000 132.983000 7535.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 7544.052000 136.943000 7535.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 7544.052000 143.846000 7535.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 7544.052000 148.184000 7535.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 7544.052000 153.260000 7535.052000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 7544.052000 156.433000 7535.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7533.552000 79.271000 7524.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 7533.552000 85.094000 7524.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 7533.552000 90.854000 7524.552000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 7533.552000 93.653000 7524.552000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 7518.700000 0 72.100000 7518.700000 0 72.100000 7679.900000 0 72.000000 7679.900000 0 72.000000 7518.700000 0
+eoFillPath subpath 1 160.500000 7518.700000 0 160.600000 7518.700000 0 160.600000 7679.900000 0 160.500000 7679.900000 0 160.500000 7518.700000 0
+eoFillPath subpath 1 72.000000 7679.800000 0 160.600000 7679.800000 0 160.600000 7679.900000 0 72.000000 7679.900000 0 72.000000 7679.800000 0
+eoFillPath subpath 1 72.000000 7518.700000 0 160.600000 7518.700000 0 160.600000 7518.800000 0 72.000000 7518.800000 0 72.000000 7518.700000 0
+saveState
+eoClipPath subpath 1 108.000000 7031.300000 0 178.900000 7031.300000 0 178.900000 7088.000000 0 108.000000 7088.000000 0 108.000000 7031.300000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -623940.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 2973.000000 0 165.500000 2973.000000 0 165.500000 2978.000000 0 76.900000 2978.000000 0 76.900000 2973.000000 0
+eoFillPath subpath 1 160.500000 2977.900000 0 165.500000 2977.900000 0 165.500000 3086.700000 0 160.500000 3086.700000 0 160.500000 2977.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 2978.000000 0 160.500000 2978.000000 0 160.500000 3091.600000 0 72.000000 3091.600000 0 72.000000 2978.000000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3087.252000 83.771000 3078.252000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 3087.252000 89.594000 3078.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 3087.252000 92.465000 3078.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 3087.252000 97.568000 3078.252000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 3087.252000 100.943000 3078.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 3087.252000 106.955000 3078.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 3087.252000 110.447000 3078.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 3087.252000 114.425000 3078.252000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 3087.252000 119.717000 3078.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 3087.252000 127.493000 3078.252000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 3087.252000 130.949000 3078.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 3087.252000 136.574000 3078.252000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 3087.252000 141.920000 3078.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 3087.252000 147.365000 3078.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 3087.252000 151.703000 3078.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 3087.252000 156.320000 3078.252000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 3087.252000 159.153000 3078.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3076.752000 81.764000 3067.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 3076.752000 85.130000 3067.752000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 3076.752000 88.712000 3067.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 3076.752000 94.022000 3067.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 3076.752000 98.306000 3067.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 3076.752000 102.455000 3067.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 3076.752000 106.676000 3067.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 3076.752000 110.312000 3067.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 3076.752000 114.920000 3067.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 3076.752000 119.060000 3067.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 3076.752000 125.450000 3067.752000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 3076.752000 130.832000 3067.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 3076.752000 139.445000 3067.752000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 3076.752000 145.169000 3067.752000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 3076.752000 148.076000 3067.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 3076.752000 153.323000 3067.752000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 3076.752000 156.433000 3067.752000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3066.252000 80.009000 3057.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 3066.252000 82.871000 3057.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 3066.252000 88.316000 3057.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 3066.252000 94.094000 3057.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 3066.252000 96.947000 3057.252000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 3066.252000 104.948000 3057.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 3066.252000 113.705000 3057.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 3066.252000 119.492000 3057.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 3066.252000 124.811000 3057.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 3066.252000 132.848000 3057.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 3066.252000 141.605000 3057.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 3066.252000 144.467000 3057.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 3066.252000 148.103000 3057.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 3066.252000 150.965000 3057.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 3066.252000 156.311000 3057.252000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3066.252000 159.253000 3057.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3055.752000 80.999000 3046.752000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 3055.752000 90.539000 3046.752000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 3055.752000 95.318000 3046.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 3055.752000 99.602000 3046.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 3055.752000 102.473000 3046.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 3055.752000 108.260000 3046.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 3055.752000 110.762000 3046.752000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 3055.752000 115.316000 3046.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 3055.752000 122.156000 3046.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 3055.752000 132.299000 3046.752000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 3055.752000 136.970000 3046.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 3055.752000 139.877000 3046.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 3055.752000 142.775000 3046.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 3055.752000 148.022000 3046.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 3055.752000 152.720000 3046.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 3055.752000 156.311000 3046.752000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3055.752000 159.253000 3046.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3045.252000 83.006000 3036.252000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 3045.252000 88.793000 3036.252000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 3045.252000 91.664000 3036.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 3045.252000 94.562000 3036.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 3045.252000 100.349000 3036.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 3045.252000 103.157000 3036.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 3045.252000 108.980000 3036.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 3045.252000 114.740000 3036.252000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 3045.252000 119.375000 3036.252000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 3045.252000 128.033000 3036.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 3045.252000 141.479000 3036.252000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 3045.252000 146.807000 3036.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 3045.252000 152.684000 3036.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 3045.252000 156.293000 3036.252000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3045.252000 159.253000 3036.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3034.752000 79.730000 3025.752000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 3034.752000 84.005000 3025.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 3034.752000 89.423000 3025.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 3034.752000 98.036000 3025.752000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 3034.752000 121.157000 3025.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 3034.752000 145.115000 3025.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 3034.752000 151.001000 3025.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 3034.752000 156.320000 3025.752000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3034.752000 159.253000 3025.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3024.252000 83.285000 3015.252000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 3024.252000 89.099000 3015.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 3024.252000 93.401000 3015.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 3024.252000 98.477000 3015.252000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 3024.252000 103.121000 3015.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 3024.252000 105.974000 3015.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 3024.252000 111.320000 3015.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 3024.252000 115.604000 3015.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 3024.252000 123.857000 3015.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 3024.252000 136.007000 3015.252000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 3024.252000 141.794000 3015.252000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 3024.252000 144.665000 3015.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 3024.252000 147.464000 3015.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 3024.252000 153.251000 3015.252000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 3024.252000 156.433000 3015.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3013.752000 79.271000 3004.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 3013.752000 85.094000 3004.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 3013.752000 90.854000 3004.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 3013.752000 96.146000 3004.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 3013.752000 102.302000 3004.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 3013.752000 107.711000 3004.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 3013.752000 113.048000 3004.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 3013.752000 119.204000 3004.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 3013.752000 124.991000 3004.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 3013.752000 130.310000 3004.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 3013.752000 135.647000 3004.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 3013.752000 144.755000 3004.752000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 3013.752000 153.323000 3004.752000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 3013.752000 156.333000 3004.752000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3003.252000 82.160000 2994.252000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 3003.252000 85.067000 2994.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 3003.252000 89.297000 2994.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 3003.252000 94.616000 2994.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 3003.252000 98.747000 2994.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 3003.252000 106.055000 2994.252000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 3003.252000 109.700000 2994.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 3003.252000 115.055000 2994.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 3003.252000 118.601000 2994.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 3003.252000 124.010000 2994.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 3003.252000 128.042000 2994.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 3003.252000 135.998000 2994.252000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 3003.252000 141.785000 2994.252000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 3003.252000 144.656000 2994.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 3003.252000 147.554000 2994.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 3003.252000 153.341000 2994.252000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 3003.252000 156.433000 2994.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 2992.752000 79.271000 2983.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 2992.752000 85.094000 2983.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 2992.752000 90.854000 2983.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 2992.752000 93.743000 2983.752000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 2977.900000 0 72.100000 2977.900000 0 72.100000 3091.600000 0 72.000000 3091.600000 0 72.000000 2977.900000 0
+eoFillPath subpath 1 160.500000 2977.900000 0 160.600000 2977.900000 0 160.600000 3091.600000 0 160.500000 3091.600000 0 160.500000 2977.900000 0
+eoFillPath subpath 1 72.000000 3091.500000 0 160.600000 3091.500000 0 160.600000 3091.600000 0 72.000000 3091.600000 0 72.000000 3091.500000 0
+eoFillPath subpath 1 72.000000 2977.900000 0 160.600000 2977.900000 0 160.600000 2978.000000 0 72.000000 2978.000000 0 72.000000 2977.900000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 9167.400000 0 169.600000 9167.400000 0 169.600000 9172.400000 0 76.900000 9172.400000 0 76.900000 9167.400000 0
+eoFillPath subpath 1 164.600000 9172.300000 0 169.600000 9172.300000 0 169.600000 9287.900000 0 164.600000 9287.900000 0 164.600000 9172.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 9172.400000 0 121.400000 9172.400000 0 121.400000 9292.800000 0 72.000000 9292.800000 0 72.000000 9172.400000 0
+saveState
+eoClipPath subpath 1 72.000000 9172.300000 0 164.600000 9172.300000 0 164.600000 9292.700000 0 72.000000 9292.700000 0 72.000000 9172.300000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -832210.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 9242.300000 0 93.700000 9242.300000 0 93.700000 9261.500000 0 72.000000 9261.500000 0 72.000000 9242.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 9242.300000 0 169.600000 9242.300000 0 169.600000 9261.500000 0 93.700000 9261.500000 0 93.700000 9242.300000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 9225.600000 0 93.700000 9225.600000 0 93.700000 9242.300000 0 72.000000 9242.300000 0 72.000000 9225.600000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 9225.600000 0 169.600000 9225.600000 0 169.600000 9242.300000 0 93.700000 9242.300000 0 93.700000 9225.600000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 9206.400000 0 93.700000 9206.400000 0 93.700000 9225.600000 0 72.000000 9225.600000 0 72.000000 9206.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 9206.400000 0 169.600000 9206.400000 0 169.600000 9225.600000 0 93.700000 9225.600000 0 93.700000 9206.400000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 9187.200000 0 93.700000 9187.200000 0 93.700000 9206.400000 0 72.000000 9206.400000 0 72.000000 9187.200000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 9187.200000 0 169.600000 9187.200000 0 169.600000 9206.400000 0 93.700000 9206.400000 0 93.700000 9187.200000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9288.452000 82.898000 9279.452000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 9288.452000 87.200000 9279.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 9288.452000 90.809000 9279.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 9288.452000 93.671000 9279.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 9288.452000 98.315000 9279.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 9288.452000 101.906000 9279.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 9288.452000 106.514000 9279.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 9288.452000 109.754000 9279.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 9288.452000 112.868000 9279.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 9288.452000 118.691000 9279.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 9288.452000 121.850000 9279.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 9288.452000 125.702000 9279.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 9288.452000 131.588000 9279.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 9288.452000 136.907000 9279.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 9288.452000 140.039000 9279.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 9288.452000 146.078000 9279.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 9288.452000 151.442000 9279.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 9288.452000 154.349000 9279.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 9288.452000 157.148000 9279.452000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 9288.452000 160.433000 9279.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9277.952000 84.095000 9268.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 9277.952000 89.468000 9268.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 9277.952000 94.580000 9268.952000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 9277.952000 97.631000 9268.952000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 9257.552000 104.443000 9248.552000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 9257.552000 109.060000 9248.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 9257.552000 113.398000 9248.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 9257.552000 119.194000 9248.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 9257.552000 124.612000 9248.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 9257.552000 127.465000 9248.552000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 9240.852000 101.176000 9231.852000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 9240.852000 104.074000 9231.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 9240.852000 109.420000 9231.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 9240.852000 114.442000 9231.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 9240.852000 120.202000 9231.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 9240.852000 123.811000 9231.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 9240.852000 129.121000 9231.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 9240.852000 134.899000 9231.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 9240.852000 139.516000 9231.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 9240.852000 143.107000 9231.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 9240.852000 148.417000 9231.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 9240.852000 151.270000 9231.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 9240.852000 157.093000 9231.852000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 9224.152000 103.048000 9215.152000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 9224.152000 108.421000 9215.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 9224.152000 113.443000 9215.152000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 9224.152000 118.852000 9215.152000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 9224.152000 124.702000 9215.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 9224.152000 130.021000 9215.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 9224.152000 135.079000 9215.152000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 9204.952000 104.407000 9195.952000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 9204.952000 109.816000 9195.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 9204.952000 115.594000 9195.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 9204.952000 121.354000 9195.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 9204.952000 125.692000 9195.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 9204.952000 128.563000 9195.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 9204.952000 133.954000 9195.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 9204.952000 139.786000 9195.952000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 9172.300000 0 72.100000 9172.300000 0 72.100000 9292.800000 0 72.000000 9292.800000 0 72.000000 9172.300000 0
+eoFillPath subpath 1 164.600000 9172.300000 0 164.700000 9172.300000 0 164.700000 9292.800000 0 164.600000 9292.800000 0 164.600000 9172.300000 0
+eoFillPath subpath 1 72.000000 9292.700000 0 164.700000 9292.700000 0 164.700000 9292.800000 0 72.000000 9292.800000 0 72.000000 9292.700000 0
+eoFillPath subpath 1 72.000000 9172.300000 0 164.700000 9172.300000 0 164.700000 9172.400000 0 72.000000 9172.400000 0 72.000000 9172.300000 0
+eoFillPath subpath 1 91.300000 9187.200000 0 93.700000 9187.200000 0 93.700000 9261.500000 0 91.300000 9261.500000 0 91.300000 9187.200000 0
+eoFillPath subpath 1 72.000000 9206.400000 0 169.600000 9206.400000 0 169.600000 9208.800000 0 72.000000 9208.800000 0 72.000000 9206.400000 0
+eoFillPath subpath 1 72.000000 9259.100000 0 169.600000 9259.100000 0 169.600000 9261.500000 0 72.000000 9261.500000 0 72.000000 9259.100000 0
+eoFillPath subpath 1 72.000000 9187.200000 0 169.600000 9187.200000 0 169.600000 9189.600000 0 72.000000 9189.600000 0 72.000000 9187.200000 0
+saveState
+eoClipPath subpath 1 108.000000 1321.200000 0 150.800000 1321.200000 0 150.800000 1365.500000 0 108.000000 1365.500000 0 108.000000 1321.200000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 -52930.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 471.200000 0 499.600000 471.200000 0 499.600000 476.300000 0 186.800000 476.300000 0 186.800000 471.200000 0
+eoFillPath subpath 1 494.500000 476.200000 0 499.600000 476.200000 0 499.600000 664.600000 0 494.500000 664.600000 0 494.500000 476.200000 0
+saveState
+eoClipPath subpath 1 181.800000 476.300000 0 494.500000 476.300000 0 494.500000 669.600000 0 181.800000 669.600000 0 181.800000 476.300000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 669.700000 0 494.500000 669.700000 0 494.500000 669.700000 0 181.700000 669.700000 0
+eoFillPath subpath 1 181.700000 669.700000 0 494.500000 669.700000 0 494.500000 668.900000 0 181.700000 668.900000 0 181.700000 669.700000 0
+eoFillPath subpath 1 181.700000 668.900000 0 494.500000 668.900000 0 494.500000 668.200000 0 181.700000 668.200000 0 181.700000 668.900000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 668.200000 0 494.500000 668.200000 0 494.500000 667.400000 0 181.700000 667.400000 0 181.700000 668.200000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 667.400000 0 494.500000 667.400000 0 494.500000 666.600000 0 181.700000 666.600000 0 181.700000 667.400000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 666.600000 0 494.500000 666.600000 0 494.500000 665.900000 0 181.700000 665.900000 0 181.700000 666.600000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 665.900000 0 494.500000 665.900000 0 494.500000 665.100000 0 181.700000 665.100000 0 181.700000 665.900000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 665.100000 0 494.500000 665.100000 0 494.500000 664.400000 0 181.700000 664.400000 0 181.700000 665.100000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 664.400000 0 494.500000 664.400000 0 494.500000 663.600000 0 181.700000 663.600000 0 181.700000 664.400000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 663.600000 0 494.500000 663.600000 0 494.500000 662.900000 0 181.700000 662.900000 0 181.700000 663.600000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 662.900000 0 494.500000 662.900000 0 494.500000 662.100000 0 181.700000 662.100000 0 181.700000 662.900000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 662.100000 0 494.500000 662.100000 0 494.500000 661.300000 0 181.700000 661.300000 0 181.700000 662.100000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 661.300000 0 494.500000 661.300000 0 494.500000 660.600000 0 181.700000 660.600000 0 181.700000 661.300000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 660.600000 0 494.500000 660.600000 0 494.500000 659.800000 0 181.700000 659.800000 0 181.700000 660.600000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 659.800000 0 494.500000 659.800000 0 494.500000 659.100000 0 181.700000 659.100000 0 181.700000 659.800000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 659.100000 0 494.500000 659.100000 0 494.500000 658.300000 0 181.700000 658.300000 0 181.700000 659.100000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 658.300000 0 494.500000 658.300000 0 494.500000 657.500000 0 181.700000 657.500000 0 181.700000 658.300000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 657.500000 0 494.500000 657.500000 0 494.500000 656.800000 0 181.700000 656.800000 0 181.700000 657.500000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 656.800000 0 494.500000 656.800000 0 494.500000 656.000000 0 181.700000 656.000000 0 181.700000 656.800000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 656.000000 0 494.500000 656.000000 0 494.500000 655.300000 0 181.700000 655.300000 0 181.700000 656.000000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 655.300000 0 494.500000 655.300000 0 494.500000 654.500000 0 181.700000 654.500000 0 181.700000 655.300000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 654.500000 0 494.500000 654.500000 0 494.500000 653.700000 0 181.700000 653.700000 0 181.700000 654.500000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 653.700000 0 494.500000 653.700000 0 494.500000 653.000000 0 181.700000 653.000000 0 181.700000 653.700000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 653.000000 0 494.500000 653.000000 0 494.500000 652.200000 0 181.700000 652.200000 0 181.700000 653.000000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 652.200000 0 494.500000 652.200000 0 494.500000 651.500000 0 181.700000 651.500000 0 181.700000 652.200000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 651.500000 0 494.500000 651.500000 0 494.500000 650.700000 0 181.700000 650.700000 0 181.700000 651.500000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 650.700000 0 494.500000 650.700000 0 494.500000 650.000000 0 181.700000 650.000000 0 181.700000 650.700000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 650.000000 0 494.500000 650.000000 0 494.500000 649.200000 0 181.700000 649.200000 0 181.700000 650.000000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 649.200000 0 494.500000 649.200000 0 494.500000 648.400000 0 181.700000 648.400000 0 181.700000 649.200000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 648.400000 0 494.500000 648.400000 0 494.500000 647.700000 0 181.700000 647.700000 0 181.700000 648.400000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 647.700000 0 494.500000 647.700000 0 494.500000 646.900000 0 181.700000 646.900000 0 181.700000 647.700000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 646.900000 0 494.500000 646.900000 0 494.500000 646.200000 0 181.700000 646.200000 0 181.700000 646.900000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 646.200000 0 494.500000 646.200000 0 494.500000 645.400000 0 181.700000 645.400000 0 181.700000 646.200000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 645.400000 0 494.500000 645.400000 0 494.500000 644.600000 0 181.700000 644.600000 0 181.700000 645.400000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 644.600000 0 494.500000 644.600000 0 494.500000 643.900000 0 181.700000 643.900000 0 181.700000 644.600000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 643.900000 0 494.500000 643.900000 0 494.500000 643.100000 0 181.700000 643.100000 0 181.700000 643.900000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 643.100000 0 494.500000 643.100000 0 494.500000 642.400000 0 181.700000 642.400000 0 181.700000 643.100000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 642.400000 0 494.500000 642.400000 0 494.500000 641.600000 0 181.700000 641.600000 0 181.700000 642.400000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 641.600000 0 494.500000 641.600000 0 494.500000 640.800000 0 181.700000 640.800000 0 181.700000 641.600000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 640.800000 0 494.500000 640.800000 0 494.500000 640.100000 0 181.700000 640.100000 0 181.700000 640.800000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 640.100000 0 494.500000 640.100000 0 494.500000 639.300000 0 181.700000 639.300000 0 181.700000 640.100000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 639.300000 0 494.500000 639.300000 0 494.500000 638.600000 0 181.700000 638.600000 0 181.700000 639.300000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 638.600000 0 494.500000 638.600000 0 494.500000 637.800000 0 181.700000 637.800000 0 181.700000 638.600000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 637.800000 0 494.500000 637.800000 0 494.500000 637.100000 0 181.700000 637.100000 0 181.700000 637.800000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 637.100000 0 494.500000 637.100000 0 494.500000 636.300000 0 181.700000 636.300000 0 181.700000 637.100000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 636.300000 0 494.500000 636.300000 0 494.500000 635.500000 0 181.700000 635.500000 0 181.700000 636.300000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 635.500000 0 494.500000 635.500000 0 494.500000 634.800000 0 181.700000 634.800000 0 181.700000 635.500000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 634.800000 0 494.500000 634.800000 0 494.500000 634.000000 0 181.700000 634.000000 0 181.700000 634.800000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 634.000000 0 494.500000 634.000000 0 494.500000 633.300000 0 181.700000 633.300000 0 181.700000 634.000000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 633.300000 0 494.500000 633.300000 0 494.500000 632.500000 0 181.700000 632.500000 0 181.700000 633.300000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 632.500000 0 494.500000 632.500000 0 494.500000 631.700000 0 181.700000 631.700000 0 181.700000 632.500000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 631.700000 0 494.500000 631.700000 0 494.500000 631.000000 0 181.700000 631.000000 0 181.700000 631.700000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 631.000000 0 494.500000 631.000000 0 494.500000 630.200000 0 181.700000 630.200000 0 181.700000 631.000000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 630.200000 0 494.500000 630.200000 0 494.500000 629.500000 0 181.700000 629.500000 0 181.700000 630.200000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 629.500000 0 494.500000 629.500000 0 494.500000 628.700000 0 181.700000 628.700000 0 181.700000 629.500000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 628.700000 0 494.500000 628.700000 0 494.500000 627.900000 0 181.700000 627.900000 0 181.700000 628.700000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 627.900000 0 494.500000 627.900000 0 494.500000 627.200000 0 181.700000 627.200000 0 181.700000 627.900000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 627.200000 0 494.500000 627.200000 0 494.500000 626.400000 0 181.700000 626.400000 0 181.700000 627.200000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 626.400000 0 494.500000 626.400000 0 494.500000 625.700000 0 181.700000 625.700000 0 181.700000 626.400000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 625.700000 0 494.500000 625.700000 0 494.500000 624.900000 0 181.700000 624.900000 0 181.700000 625.700000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 624.900000 0 494.500000 624.900000 0 494.500000 624.200000 0 181.700000 624.200000 0 181.700000 624.900000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 624.200000 0 494.500000 624.200000 0 494.500000 623.400000 0 181.700000 623.400000 0 181.700000 624.200000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 623.400000 0 494.500000 623.400000 0 494.500000 622.600000 0 181.700000 622.600000 0 181.700000 623.400000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 622.600000 0 494.500000 622.600000 0 494.500000 621.900000 0 181.700000 621.900000 0 181.700000 622.600000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 621.900000 0 494.500000 621.900000 0 494.500000 621.100000 0 181.700000 621.100000 0 181.700000 621.900000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 621.100000 0 494.500000 621.100000 0 494.500000 620.400000 0 181.700000 620.400000 0 181.700000 621.100000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 620.400000 0 494.500000 620.400000 0 494.500000 619.600000 0 181.700000 619.600000 0 181.700000 620.400000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 619.600000 0 494.500000 619.600000 0 494.500000 618.800000 0 181.700000 618.800000 0 181.700000 619.600000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 618.800000 0 494.500000 618.800000 0 494.500000 618.100000 0 181.700000 618.100000 0 181.700000 618.800000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 618.100000 0 494.500000 618.100000 0 494.500000 617.300000 0 181.700000 617.300000 0 181.700000 618.100000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 617.300000 0 494.500000 617.300000 0 494.500000 616.600000 0 181.700000 616.600000 0 181.700000 617.300000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 616.600000 0 494.500000 616.600000 0 494.500000 615.800000 0 181.700000 615.800000 0 181.700000 616.600000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 615.800000 0 494.500000 615.800000 0 494.500000 615.000000 0 181.700000 615.000000 0 181.700000 615.800000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 615.000000 0 494.500000 615.000000 0 494.500000 614.300000 0 181.700000 614.300000 0 181.700000 615.000000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 614.300000 0 494.500000 614.300000 0 494.500000 613.500000 0 181.700000 613.500000 0 181.700000 614.300000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 613.500000 0 494.500000 613.500000 0 494.500000 612.800000 0 181.700000 612.800000 0 181.700000 613.500000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 612.800000 0 494.500000 612.800000 0 494.500000 612.000000 0 181.700000 612.000000 0 181.700000 612.800000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 612.000000 0 494.500000 612.000000 0 494.500000 611.300000 0 181.700000 611.300000 0 181.700000 612.000000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 611.300000 0 494.500000 611.300000 0 494.500000 610.500000 0 181.700000 610.500000 0 181.700000 611.300000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 610.500000 0 494.500000 610.500000 0 494.500000 609.700000 0 181.700000 609.700000 0 181.700000 610.500000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 609.700000 0 494.500000 609.700000 0 494.500000 609.000000 0 181.700000 609.000000 0 181.700000 609.700000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 609.000000 0 494.500000 609.000000 0 494.500000 608.200000 0 181.700000 608.200000 0 181.700000 609.000000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 608.200000 0 494.500000 608.200000 0 494.500000 607.500000 0 181.700000 607.500000 0 181.700000 608.200000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 607.500000 0 494.500000 607.500000 0 494.500000 606.700000 0 181.700000 606.700000 0 181.700000 607.500000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 606.700000 0 494.500000 606.700000 0 494.500000 605.900000 0 181.700000 605.900000 0 181.700000 606.700000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 605.900000 0 494.500000 605.900000 0 494.500000 605.200000 0 181.700000 605.200000 0 181.700000 605.900000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 605.200000 0 494.500000 605.200000 0 494.500000 604.400000 0 181.700000 604.400000 0 181.700000 605.200000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 604.400000 0 494.500000 604.400000 0 494.500000 603.700000 0 181.700000 603.700000 0 181.700000 604.400000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 603.700000 0 494.500000 603.700000 0 494.500000 602.900000 0 181.700000 602.900000 0 181.700000 603.700000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 602.900000 0 494.500000 602.900000 0 494.500000 602.100000 0 181.700000 602.100000 0 181.700000 602.900000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 602.100000 0 494.500000 602.100000 0 494.500000 601.400000 0 181.700000 601.400000 0 181.700000 602.100000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 601.400000 0 494.500000 601.400000 0 494.500000 600.600000 0 181.700000 600.600000 0 181.700000 601.400000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 600.600000 0 494.500000 600.600000 0 494.500000 599.900000 0 181.700000 599.900000 0 181.700000 600.600000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 599.900000 0 494.500000 599.900000 0 494.500000 599.100000 0 181.700000 599.100000 0 181.700000 599.900000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 599.100000 0 494.500000 599.100000 0 494.500000 598.400000 0 181.700000 598.400000 0 181.700000 599.100000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 598.400000 0 494.500000 598.400000 0 494.500000 597.600000 0 181.700000 597.600000 0 181.700000 598.400000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 597.600000 0 494.500000 597.600000 0 494.500000 596.800000 0 181.700000 596.800000 0 181.700000 597.600000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 596.800000 0 494.500000 596.800000 0 494.500000 596.100000 0 181.700000 596.100000 0 181.700000 596.800000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 596.100000 0 494.500000 596.100000 0 494.500000 595.300000 0 181.700000 595.300000 0 181.700000 596.100000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 595.300000 0 494.500000 595.300000 0 494.500000 594.600000 0 181.700000 594.600000 0 181.700000 595.300000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 594.600000 0 494.500000 594.600000 0 494.500000 593.800000 0 181.700000 593.800000 0 181.700000 594.600000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 593.800000 0 494.500000 593.800000 0 494.500000 593.000000 0 181.700000 593.000000 0 181.700000 593.800000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 593.000000 0 494.500000 593.000000 0 494.500000 592.300000 0 181.700000 592.300000 0 181.700000 593.000000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 592.300000 0 494.500000 592.300000 0 494.500000 591.500000 0 181.700000 591.500000 0 181.700000 592.300000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 591.500000 0 494.500000 591.500000 0 494.500000 590.800000 0 181.700000 590.800000 0 181.700000 591.500000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 590.800000 0 494.500000 590.800000 0 494.500000 590.000000 0 181.700000 590.000000 0 181.700000 590.800000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 590.000000 0 494.500000 590.000000 0 494.500000 589.200000 0 181.700000 589.200000 0 181.700000 590.000000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 589.200000 0 494.500000 589.200000 0 494.500000 588.500000 0 181.700000 588.500000 0 181.700000 589.200000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 588.500000 0 494.500000 588.500000 0 494.500000 587.700000 0 181.700000 587.700000 0 181.700000 588.500000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 587.700000 0 494.500000 587.700000 0 494.500000 587.000000 0 181.700000 587.000000 0 181.700000 587.700000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 587.000000 0 494.500000 587.000000 0 494.500000 586.200000 0 181.700000 586.200000 0 181.700000 587.000000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 586.200000 0 494.500000 586.200000 0 494.500000 585.500000 0 181.700000 585.500000 0 181.700000 586.200000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 585.500000 0 494.500000 585.500000 0 494.500000 584.700000 0 181.700000 584.700000 0 181.700000 585.500000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 584.700000 0 494.500000 584.700000 0 494.500000 583.900000 0 181.700000 583.900000 0 181.700000 584.700000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 583.900000 0 494.500000 583.900000 0 494.500000 583.200000 0 181.700000 583.200000 0 181.700000 583.900000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 583.200000 0 494.500000 583.200000 0 494.500000 582.400000 0 181.700000 582.400000 0 181.700000 583.200000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 582.400000 0 494.500000 582.400000 0 494.500000 581.700000 0 181.700000 581.700000 0 181.700000 582.400000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 581.700000 0 494.500000 581.700000 0 494.500000 580.900000 0 181.700000 580.900000 0 181.700000 581.700000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 580.900000 0 494.500000 580.900000 0 494.500000 580.100000 0 181.700000 580.100000 0 181.700000 580.900000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 580.100000 0 494.500000 580.100000 0 494.500000 579.400000 0 181.700000 579.400000 0 181.700000 580.100000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 579.400000 0 494.500000 579.400000 0 494.500000 578.600000 0 181.700000 578.600000 0 181.700000 579.400000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 578.600000 0 494.500000 578.600000 0 494.500000 577.900000 0 181.700000 577.900000 0 181.700000 578.600000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 577.900000 0 494.500000 577.900000 0 494.500000 577.100000 0 181.700000 577.100000 0 181.700000 577.900000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 577.100000 0 494.500000 577.100000 0 494.500000 576.300000 0 181.700000 576.300000 0 181.700000 577.100000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 576.300000 0 494.500000 576.300000 0 494.500000 575.600000 0 181.700000 575.600000 0 181.700000 576.300000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 575.600000 0 494.500000 575.600000 0 494.500000 574.800000 0 181.700000 574.800000 0 181.700000 575.600000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 574.800000 0 494.500000 574.800000 0 494.500000 574.100000 0 181.700000 574.100000 0 181.700000 574.800000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 574.100000 0 494.500000 574.100000 0 494.500000 573.300000 0 181.700000 573.300000 0 181.700000 574.100000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 573.300000 0 494.500000 573.300000 0 494.500000 572.600000 0 181.700000 572.600000 0 181.700000 573.300000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 572.600000 0 494.500000 572.600000 0 494.500000 571.800000 0 181.700000 571.800000 0 181.700000 572.600000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 571.800000 0 494.500000 571.800000 0 494.500000 571.000000 0 181.700000 571.000000 0 181.700000 571.800000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 571.000000 0 494.500000 571.000000 0 494.500000 570.300000 0 181.700000 570.300000 0 181.700000 571.000000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 570.300000 0 494.500000 570.300000 0 494.500000 569.500000 0 181.700000 569.500000 0 181.700000 570.300000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 569.500000 0 494.500000 569.500000 0 494.500000 568.800000 0 181.700000 568.800000 0 181.700000 569.500000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 568.800000 0 494.500000 568.800000 0 494.500000 568.000000 0 181.700000 568.000000 0 181.700000 568.800000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 568.000000 0 494.500000 568.000000 0 494.500000 567.200000 0 181.700000 567.200000 0 181.700000 568.000000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 567.200000 0 494.500000 567.200000 0 494.500000 566.500000 0 181.700000 566.500000 0 181.700000 567.200000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 566.500000 0 494.500000 566.500000 0 494.500000 565.700000 0 181.700000 565.700000 0 181.700000 566.500000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 565.700000 0 494.500000 565.700000 0 494.500000 565.000000 0 181.700000 565.000000 0 181.700000 565.700000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 565.000000 0 494.500000 565.000000 0 494.500000 564.200000 0 181.700000 564.200000 0 181.700000 565.000000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 564.200000 0 494.500000 564.200000 0 494.500000 563.400000 0 181.700000 563.400000 0 181.700000 564.200000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 563.400000 0 494.500000 563.400000 0 494.500000 562.700000 0 181.700000 562.700000 0 181.700000 563.400000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 562.700000 0 494.500000 562.700000 0 494.500000 561.900000 0 181.700000 561.900000 0 181.700000 562.700000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 561.900000 0 494.500000 561.900000 0 494.500000 561.200000 0 181.700000 561.200000 0 181.700000 561.900000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 561.200000 0 494.500000 561.200000 0 494.500000 560.400000 0 181.700000 560.400000 0 181.700000 561.200000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 560.400000 0 494.500000 560.400000 0 494.500000 559.700000 0 181.700000 559.700000 0 181.700000 560.400000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 559.700000 0 494.500000 559.700000 0 494.500000 558.900000 0 181.700000 558.900000 0 181.700000 559.700000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 558.900000 0 494.500000 558.900000 0 494.500000 558.100000 0 181.700000 558.100000 0 181.700000 558.900000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 558.100000 0 494.500000 558.100000 0 494.500000 557.400000 0 181.700000 557.400000 0 181.700000 558.100000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 557.400000 0 494.500000 557.400000 0 494.500000 556.600000 0 181.700000 556.600000 0 181.700000 557.400000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 556.600000 0 494.500000 556.600000 0 494.500000 555.900000 0 181.700000 555.900000 0 181.700000 556.600000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 555.900000 0 494.500000 555.900000 0 494.500000 555.100000 0 181.700000 555.100000 0 181.700000 555.900000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 555.100000 0 494.500000 555.100000 0 494.500000 554.300000 0 181.700000 554.300000 0 181.700000 555.100000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 554.300000 0 494.500000 554.300000 0 494.500000 553.600000 0 181.700000 553.600000 0 181.700000 554.300000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 553.600000 0 494.500000 553.600000 0 494.500000 552.800000 0 181.700000 552.800000 0 181.700000 553.600000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 552.800000 0 494.500000 552.800000 0 494.500000 552.100000 0 181.700000 552.100000 0 181.700000 552.800000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 552.100000 0 494.500000 552.100000 0 494.500000 551.300000 0 181.700000 551.300000 0 181.700000 552.100000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 551.300000 0 494.500000 551.300000 0 494.500000 550.500000 0 181.700000 550.500000 0 181.700000 551.300000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 550.500000 0 494.500000 550.500000 0 494.500000 549.800000 0 181.700000 549.800000 0 181.700000 550.500000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 549.800000 0 494.500000 549.800000 0 494.500000 549.000000 0 181.700000 549.000000 0 181.700000 549.800000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 549.000000 0 494.500000 549.000000 0 494.500000 548.300000 0 181.700000 548.300000 0 181.700000 549.000000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 548.300000 0 494.500000 548.300000 0 494.500000 547.500000 0 181.700000 547.500000 0 181.700000 548.300000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 547.500000 0 494.500000 547.500000 0 494.500000 546.800000 0 181.700000 546.800000 0 181.700000 547.500000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 546.800000 0 494.500000 546.800000 0 494.500000 546.000000 0 181.700000 546.000000 0 181.700000 546.800000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 546.000000 0 494.500000 546.000000 0 494.500000 545.200000 0 181.700000 545.200000 0 181.700000 546.000000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 545.200000 0 494.500000 545.200000 0 494.500000 544.500000 0 181.700000 544.500000 0 181.700000 545.200000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 544.500000 0 494.500000 544.500000 0 494.500000 543.700000 0 181.700000 543.700000 0 181.700000 544.500000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 543.700000 0 494.500000 543.700000 0 494.500000 543.000000 0 181.700000 543.000000 0 181.700000 543.700000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 543.000000 0 494.500000 543.000000 0 494.500000 542.200000 0 181.700000 542.200000 0 181.700000 543.000000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 542.200000 0 494.500000 542.200000 0 494.500000 541.400000 0 181.700000 541.400000 0 181.700000 542.200000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 541.400000 0 494.500000 541.400000 0 494.500000 540.700000 0 181.700000 540.700000 0 181.700000 541.400000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 540.700000 0 494.500000 540.700000 0 494.500000 539.900000 0 181.700000 539.900000 0 181.700000 540.700000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 539.900000 0 494.500000 539.900000 0 494.500000 539.200000 0 181.700000 539.200000 0 181.700000 539.900000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 539.200000 0 494.500000 539.200000 0 494.500000 538.400000 0 181.700000 538.400000 0 181.700000 539.200000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 538.400000 0 494.500000 538.400000 0 494.500000 537.600000 0 181.700000 537.600000 0 181.700000 538.400000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 537.600000 0 494.500000 537.600000 0 494.500000 536.900000 0 181.700000 536.900000 0 181.700000 537.600000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 536.900000 0 494.500000 536.900000 0 494.500000 536.100000 0 181.700000 536.100000 0 181.700000 536.900000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 536.100000 0 494.500000 536.100000 0 494.500000 535.400000 0 181.700000 535.400000 0 181.700000 536.100000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 535.400000 0 494.500000 535.400000 0 494.500000 534.600000 0 181.700000 534.600000 0 181.700000 535.400000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 534.600000 0 494.500000 534.600000 0 494.500000 533.900000 0 181.700000 533.900000 0 181.700000 534.600000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 533.900000 0 494.500000 533.900000 0 494.500000 533.100000 0 181.700000 533.100000 0 181.700000 533.900000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 533.100000 0 494.500000 533.100000 0 494.500000 532.300000 0 181.700000 532.300000 0 181.700000 533.100000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 532.300000 0 494.500000 532.300000 0 494.500000 531.600000 0 181.700000 531.600000 0 181.700000 532.300000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 531.600000 0 494.500000 531.600000 0 494.500000 530.800000 0 181.700000 530.800000 0 181.700000 531.600000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 530.800000 0 494.500000 530.800000 0 494.500000 530.100000 0 181.700000 530.100000 0 181.700000 530.800000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 530.100000 0 494.500000 530.100000 0 494.500000 529.300000 0 181.700000 529.300000 0 181.700000 530.100000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 529.300000 0 494.500000 529.300000 0 494.500000 528.500000 0 181.700000 528.500000 0 181.700000 529.300000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 528.500000 0 494.500000 528.500000 0 494.500000 527.800000 0 181.700000 527.800000 0 181.700000 528.500000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 527.800000 0 494.500000 527.800000 0 494.500000 527.000000 0 181.700000 527.000000 0 181.700000 527.800000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 527.000000 0 494.500000 527.000000 0 494.500000 526.300000 0 181.700000 526.300000 0 181.700000 527.000000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 526.300000 0 494.500000 526.300000 0 494.500000 525.500000 0 181.700000 525.500000 0 181.700000 526.300000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 525.500000 0 494.500000 525.500000 0 494.500000 524.700000 0 181.700000 524.700000 0 181.700000 525.500000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 524.700000 0 494.500000 524.700000 0 494.500000 524.000000 0 181.700000 524.000000 0 181.700000 524.700000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 524.000000 0 494.500000 524.000000 0 494.500000 523.200000 0 181.700000 523.200000 0 181.700000 524.000000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 523.200000 0 494.500000 523.200000 0 494.500000 522.500000 0 181.700000 522.500000 0 181.700000 523.200000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 522.500000 0 494.500000 522.500000 0 494.500000 521.700000 0 181.700000 521.700000 0 181.700000 522.500000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 521.700000 0 494.500000 521.700000 0 494.500000 521.000000 0 181.700000 521.000000 0 181.700000 521.700000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 521.000000 0 494.500000 521.000000 0 494.500000 520.200000 0 181.700000 520.200000 0 181.700000 521.000000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 520.200000 0 494.500000 520.200000 0 494.500000 519.400000 0 181.700000 519.400000 0 181.700000 520.200000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 519.400000 0 494.500000 519.400000 0 494.500000 518.700000 0 181.700000 518.700000 0 181.700000 519.400000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 518.700000 0 494.500000 518.700000 0 494.500000 517.900000 0 181.700000 517.900000 0 181.700000 518.700000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 517.900000 0 494.500000 517.900000 0 494.500000 517.200000 0 181.700000 517.200000 0 181.700000 517.900000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 517.200000 0 494.500000 517.200000 0 494.500000 516.400000 0 181.700000 516.400000 0 181.700000 517.200000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 516.400000 0 494.500000 516.400000 0 494.500000 515.700000 0 181.700000 515.700000 0 181.700000 516.400000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 515.700000 0 494.500000 515.700000 0 494.500000 514.900000 0 181.700000 514.900000 0 181.700000 515.700000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 514.900000 0 494.500000 514.900000 0 494.500000 514.100000 0 181.700000 514.100000 0 181.700000 514.900000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 514.100000 0 494.500000 514.100000 0 494.500000 513.400000 0 181.700000 513.400000 0 181.700000 514.100000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 513.400000 0 494.500000 513.400000 0 494.500000 512.600000 0 181.700000 512.600000 0 181.700000 513.400000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 512.600000 0 494.500000 512.600000 0 494.500000 511.900000 0 181.700000 511.900000 0 181.700000 512.600000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 511.900000 0 494.500000 511.900000 0 494.500000 511.100000 0 181.700000 511.100000 0 181.700000 511.900000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 511.100000 0 494.500000 511.100000 0 494.500000 510.300000 0 181.700000 510.300000 0 181.700000 511.100000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 510.300000 0 494.500000 510.300000 0 494.500000 509.600000 0 181.700000 509.600000 0 181.700000 510.300000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 509.600000 0 494.500000 509.600000 0 494.500000 508.800000 0 181.700000 508.800000 0 181.700000 509.600000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 508.800000 0 494.500000 508.800000 0 494.500000 508.100000 0 181.700000 508.100000 0 181.700000 508.800000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 508.100000 0 494.500000 508.100000 0 494.500000 507.300000 0 181.700000 507.300000 0 181.700000 508.100000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 507.300000 0 494.500000 507.300000 0 494.500000 506.600000 0 181.700000 506.600000 0 181.700000 507.300000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 506.600000 0 494.500000 506.600000 0 494.500000 505.800000 0 181.700000 505.800000 0 181.700000 506.600000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 505.800000 0 494.500000 505.800000 0 494.500000 505.000000 0 181.700000 505.000000 0 181.700000 505.800000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 505.000000 0 494.500000 505.000000 0 494.500000 504.300000 0 181.700000 504.300000 0 181.700000 505.000000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 504.300000 0 494.500000 504.300000 0 494.500000 503.500000 0 181.700000 503.500000 0 181.700000 504.300000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 503.500000 0 494.500000 503.500000 0 494.500000 502.800000 0 181.700000 502.800000 0 181.700000 503.500000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 502.800000 0 494.500000 502.800000 0 494.500000 502.000000 0 181.700000 502.000000 0 181.700000 502.800000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 502.000000 0 494.500000 502.000000 0 494.500000 501.300000 0 181.700000 501.300000 0 181.700000 502.000000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 501.300000 0 494.500000 501.300000 0 494.500000 500.500000 0 181.700000 500.500000 0 181.700000 501.300000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 500.500000 0 494.500000 500.500000 0 494.500000 499.700000 0 181.700000 499.700000 0 181.700000 500.500000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 499.700000 0 494.500000 499.700000 0 494.500000 499.000000 0 181.700000 499.000000 0 181.700000 499.700000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 499.000000 0 494.500000 499.000000 0 494.500000 498.200000 0 181.700000 498.200000 0 181.700000 499.000000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 498.200000 0 494.500000 498.200000 0 494.500000 497.500000 0 181.700000 497.500000 0 181.700000 498.200000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 497.500000 0 494.500000 497.500000 0 494.500000 496.700000 0 181.700000 496.700000 0 181.700000 497.500000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 496.700000 0 494.500000 496.700000 0 494.500000 495.900000 0 181.700000 495.900000 0 181.700000 496.700000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 495.900000 0 494.500000 495.900000 0 494.500000 495.200000 0 181.700000 495.200000 0 181.700000 495.900000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 495.200000 0 494.500000 495.200000 0 494.500000 494.400000 0 181.700000 494.400000 0 181.700000 495.200000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 494.400000 0 494.500000 494.400000 0 494.500000 493.700000 0 181.700000 493.700000 0 181.700000 494.400000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 493.700000 0 494.500000 493.700000 0 494.500000 492.900000 0 181.700000 492.900000 0 181.700000 493.700000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 492.900000 0 494.500000 492.900000 0 494.500000 492.200000 0 181.700000 492.200000 0 181.700000 492.900000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 492.200000 0 494.500000 492.200000 0 494.500000 491.400000 0 181.700000 491.400000 0 181.700000 492.200000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 491.400000 0 494.500000 491.400000 0 494.500000 490.600000 0 181.700000 490.600000 0 181.700000 491.400000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 490.600000 0 494.500000 490.600000 0 494.500000 489.900000 0 181.700000 489.900000 0 181.700000 490.600000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 489.900000 0 494.500000 489.900000 0 494.500000 489.100000 0 181.700000 489.100000 0 181.700000 489.900000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 489.100000 0 494.500000 489.100000 0 494.500000 488.400000 0 181.700000 488.400000 0 181.700000 489.100000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 488.400000 0 494.500000 488.400000 0 494.500000 487.600000 0 181.700000 487.600000 0 181.700000 488.400000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 487.600000 0 494.500000 487.600000 0 494.500000 486.800000 0 181.700000 486.800000 0 181.700000 487.600000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 486.800000 0 494.500000 486.800000 0 494.500000 486.100000 0 181.700000 486.100000 0 181.700000 486.800000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 486.100000 0 494.500000 486.100000 0 494.500000 485.300000 0 181.700000 485.300000 0 181.700000 486.100000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 485.300000 0 494.500000 485.300000 0 494.500000 484.600000 0 181.700000 484.600000 0 181.700000 485.300000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 484.600000 0 494.500000 484.600000 0 494.500000 483.800000 0 181.700000 483.800000 0 181.700000 484.600000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 483.800000 0 494.500000 483.800000 0 494.500000 483.000000 0 181.700000 483.000000 0 181.700000 483.800000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 483.000000 0 494.500000 483.000000 0 494.500000 482.300000 0 181.700000 482.300000 0 181.700000 483.000000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 482.300000 0 494.500000 482.300000 0 494.500000 481.500000 0 181.700000 481.500000 0 181.700000 482.300000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 481.500000 0 494.500000 481.500000 0 494.500000 480.800000 0 181.700000 480.800000 0 181.700000 481.500000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 480.800000 0 494.500000 480.800000 0 494.500000 480.000000 0 181.700000 480.000000 0 181.700000 480.800000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 480.000000 0 494.500000 480.000000 0 494.500000 479.300000 0 181.700000 479.300000 0 181.700000 480.000000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 479.300000 0 494.500000 479.300000 0 494.500000 478.500000 0 181.700000 478.500000 0 181.700000 479.300000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 478.500000 0 494.500000 478.500000 0 494.500000 477.700000 0 181.700000 477.700000 0 181.700000 478.500000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 477.700000 0 494.500000 477.700000 0 494.500000 477.000000 0 181.700000 477.000000 0 181.700000 477.700000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 477.000000 0 494.500000 477.000000 0 494.500000 476.200000 0 181.700000 476.200000 0 181.700000 477.000000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 476.300000 0 181.800000 476.300000 0 181.800000 669.600000 0 494.400000 669.600000 0 494.400000 476.300000 0 338.100000 476.300000 0
+strokePath subpath 1 338.100000 476.300000 0 181.800000 476.300000 0 181.800000 669.600000 0 494.400000 669.600000 0 494.400000 476.300000 0 338.100000 476.300000 0
+saveState
+updateCtm 11410.000000 0.000000 0.000000 -8760.000000 20530.000000 23970.000000
+drawSoftMaskedImage 1142 877 1142 877 JPEG 70955 PPM 3004618
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 515.324000 215.488000 507.324000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 515.324000 220.592000 507.324000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 515.324000 225.696000 507.324000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 515.324000 230.800000 507.324000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 507.724000 241.388000 499.724000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 507.724000 246.492000 499.724000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 507.724000 251.596000 499.724000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 507.724000 256.700000 499.724000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 500.024000 267.188000 492.024000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 500.024000 272.292000 492.024000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 500.024000 277.396000 492.024000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 500.024000 282.500000 492.024000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 492.424000 293.088000 484.424000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 492.424000 298.192000 484.424000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 492.424000 303.296000 484.424000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 492.424000 308.400000 484.424000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 530.324000 202.588000 522.324000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 549.624000 201.688000 541.624000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 568.924000 195.788000 560.924000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 568.924000 200.892000 560.924000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 588.224000 194.888000 580.224000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 588.224000 199.992000 580.224000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 607.624000 193.988000 599.624000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 607.624000 199.092000 599.624000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 626.924000 193.088000 618.924000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 626.924000 198.192000 618.924000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 499.024000 330.188000 491.024000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 499.024000 332.716000 491.024000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 499.024000 337.596000 491.024000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 499.024000 341.396000 491.024000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 499.024000 346.036000 491.024000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 499.024000 350.900000 491.024000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 499.024000 355.972000 491.024000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 499.024000 359.196000 491.024000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 499.024000 362.196000 491.024000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 499.024000 367.404000 491.024000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 499.024000 371.876000 491.024000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 499.024000 375.052000 491.024000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 518.524000 361.172000 510.524000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 518.524000 364.340000 510.524000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 518.524000 367.396000 510.524000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 518.524000 372.604000 510.524000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 518.524000 379.348000 510.524000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 518.524000 384.484000 510.524000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 518.524000 389.436000 510.524000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 518.524000 392.108000 510.524000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 518.524000 395.708000 510.524000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 518.524000 397.540000 510.524000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 518.524000 402.444000 510.524000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 518.524000 406.788000 510.524000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 538.024000 392.972000 530.024000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 538.024000 398.076000 530.024000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 538.024000 403.180000 530.024000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 538.024000 405.428000 530.024000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 538.024000 410.332000 530.024000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 538.024000 414.476000 530.024000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 665.592000 305.808000 651.592000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 665.592000 314.138000 651.592000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 665.592000 320.788000 651.592000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 665.592000 328.698000 651.592000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 665.592000 336.972000 651.592000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 665.592000 344.182000 651.592000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 665.592000 349.810000 651.592000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 665.592000 354.234000 651.592000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 665.592000 362.718000 651.592000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 665.592000 367.870000 651.592000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 665.592000 372.322000 651.592000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 665.592000 382.080000 651.592000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 665.592000 388.772000 651.592000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 665.592000 397.802000 651.592000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 665.592000 402.254000 651.592000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 665.592000 407.896000 651.592000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 542.700000 0 424.300000 542.700000 0 424.300000 603.500000 0 493.600000 603.500000 0 493.600000 542.700000 0 458.900000 542.700000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 593.900000 0 428.900000 593.900000 0 428.900000 599.800000 0 434.800000 599.800000 0 434.800000 593.900000 0 431.900000 593.900000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 582.800000 0 428.900000 582.800000 0 428.900000 588.800000 0 434.800000 588.800000 0 434.800000 582.800000 0 431.900000 582.800000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 571.700000 0 428.900000 571.700000 0 428.900000 577.700000 0 434.800000 577.700000 0 434.800000 571.700000 0 431.900000 571.700000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 560.600000 0 428.900000 560.600000 0 428.900000 566.600000 0 434.800000 566.600000 0 434.800000 560.600000 0 431.900000 560.600000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 549.500000 0 428.900000 549.500000 0 428.900000 555.500000 0 434.800000 555.500000 0 434.800000 549.500000 0 431.900000 549.500000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 600.924000 443.288000 592.924000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 600.924000 445.816000 592.924000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 600.924000 450.600000 592.924000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 600.924000 454.496000 592.924000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 600.924000 459.136000 592.924000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 600.924000 464.000000 592.924000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 600.924000 468.976000 592.924000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 600.924000 472.304000 592.924000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 600.924000 475.208000 592.924000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 600.924000 480.520000 592.924000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 600.924000 484.992000 592.924000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 600.924000 488.168000 592.924000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 589.924000 443.352000 581.924000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 589.924000 447.920000 581.924000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 589.924000 452.976000 581.924000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 589.924000 457.400000 581.924000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 589.924000 462.472000 581.924000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 589.924000 465.800000 581.924000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 589.924000 468.904000 581.924000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 589.924000 473.816000 581.924000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 589.924000 478.888000 581.924000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 589.924000 482.064000 581.924000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 578.824000 442.872000 570.824000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 578.824000 446.040000 570.824000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 578.824000 448.992000 570.824000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 578.824000 454.304000 570.824000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 578.824000 461.048000 570.824000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 578.824000 466.184000 570.824000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 578.824000 471.136000 570.824000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 578.824000 473.808000 570.824000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 578.824000 477.408000 570.824000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 578.824000 479.240000 570.824000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 578.824000 484.144000 570.824000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 578.824000 488.488000 570.824000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 567.724000 443.384000 559.724000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 567.724000 448.464000 559.724000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 567.724000 453.424000 559.724000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 567.724000 456.696000 559.724000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 567.724000 459.800000 559.724000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 567.724000 462.032000 559.724000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 567.724000 466.936000 559.724000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 567.724000 471.080000 559.724000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 556.624000 443.272000 548.624000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 556.624000 448.376000 548.624000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 556.624000 453.480000 548.624000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 556.624000 455.728000 548.624000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 556.624000 460.632000 548.624000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 556.624000 464.776000 548.624000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -2088.400000 0 114.800000 -2088.400000 0 114.800000 -2045.600000 0 72.000000 -2045.600000 0 72.000000 -2088.400000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 288030.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 108.000000 546.200000 0 540.000000 546.200000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 546.200000 0
+eoFillPath subpath 1 108.000000 72.000000 0 540.000000 72.000000 0 540.000000 245.800000 0 108.000000 245.800000 0 108.000000 72.000000 0
+eoFillPath subpath 1 108.000000 245.800000 0 157.400000 245.800000 0 157.400000 546.200000 0 108.000000 546.200000 0 108.000000 245.800000 0
+eoFillPath subpath 1 490.500000 245.800000 0 540.000000 245.800000 0 540.000000 546.200000 0 490.500000 546.200000 0 490.500000 245.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 15740.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 108.000000 701.300000 0 540.000000 701.300000 0 540.000000 720.000000 0 108.000000 720.000000 0 108.000000 701.300000 0
+eoFillPath subpath 1 108.000000 76.200000 0 540.000000 76.200000 0 540.000000 90.100000 0 108.000000 90.100000 0 108.000000 76.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 108.100000 719.948000 121.892000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 121.908000 719.948000 131.364000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 131.412000 719.948000 136.484000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 136.516000 719.948000 148.532000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 148.516000 719.948000 158.292000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 158.324000 719.948000 168.452000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 168.420000 719.948000 176.740000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 176.724000 719.948000 186.564000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 186.532000 719.948000 191.604000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 191.636000 719.948000 197.396000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 197.444000 719.948000 202.516000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 202.500000 719.948000 214.884000 703.948000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 214.900000 719.948000 224.692000 703.948000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 224.708000 719.948000 231.284000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 231.012000 719.948000 241.156000 703.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 241.220000 719.948000 251.060000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 251.028000 719.948000 261.156000 703.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 261.124000 719.948000 266.196000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.228000 719.948000 276.372000 703.948000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 276.436000 719.948000 286.564000 703.948000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 286.532000 719.948000 296.372000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 296.340000 719.948000 306.484000 703.948000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1400.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 672.892000 117.648000 658.892000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 115.800000 672.892000 125.418000 658.892000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 125.404000 672.892000 135.022000 658.892000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 135.008000 672.892000 139.796000 658.892000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.810000 672.892000 148.140000 658.892000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 650.736000 230.164000 638.736000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 230.200000 650.736000 234.028000 638.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 234.004000 650.736000 237.832000 638.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 237.808000 650.736000 241.612000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 241.912000 650.736000 253.288000 638.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 253.216000 650.736000 259.984000 638.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 260.116000 650.736000 263.920000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 264.220000 650.736000 269.032000 638.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 269.020000 650.736000 276.244000 638.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 276.220000 650.736000 283.444000 638.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 283.420000 650.736000 287.248000 638.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 287.320000 650.736000 293.476000 638.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 293.416000 650.736000 297.220000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 297.412000 650.736000 304.564000 638.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 304.612000 650.736000 310.348000 638.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 310.312000 650.736000 317.404000 638.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 317.512000 650.736000 321.316000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 321.616000 650.736000 328.876000 638.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 328.816000 650.736000 335.908000 638.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 335.920000 650.736000 343.600000 638.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 343.624000 650.736000 348.436000 638.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 348.424000 650.736000 352.228000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 352.420000 650.736000 357.232000 638.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 357.220000 650.736000 364.444000 638.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 364.420000 650.736000 372.100000 638.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 372.124000 650.736000 379.216000 638.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 379.228000 650.736000 384.040000 638.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 384.124000 650.736000 391.852000 638.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 391.828000 650.736000 398.920000 638.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 398.932000 650.736000 404.668000 638.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 404.728000 650.736000 408.532000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 408.832000 650.736000 419.092000 638.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 419.032000 650.736000 422.860000 638.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 422.932000 650.736000 427.744000 638.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 427.732000 650.736000 435.460000 638.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 435.532000 650.736000 439.336000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 439.432000 650.736000 445.588000 638.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 445.636000 650.736000 457.012000 638.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 456.940000 650.736000 464.092000 638.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 464.140000 650.736000 467.968000 638.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 467.944000 650.736000 471.772000 638.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 471.940000 650.736000 475.744000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 476.044000 650.736000 483.724000 638.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 483.640000 650.736000 490.792000 638.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 490.744000 650.736000 496.480000 638.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 496.444000 650.736000 501.256000 638.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 501.340000 650.736000 507.496000 638.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 507.640000 650.736000 511.444000 638.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 511.540000 650.736000 517.696000 638.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 517.744000 650.736000 525.472000 638.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 525.448000 650.736000 532.168000 638.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 532.144000 650.736000 539.872000 638.736000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 650.736000 543.904000 638.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 636.836000 228.652000 624.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.700000 636.836000 234.856000 624.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 235.396000 636.836000 239.200000 624.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 239.200000 636.836000 246.928000 624.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 246.904000 636.836000 254.056000 624.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 254.200000 636.836000 258.028000 624.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 257.896000 636.836000 261.724000 624.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 261.892000 636.836000 268.048000 624.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 268.096000 636.836000 271.900000 624.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 272.296000 636.836000 276.100000 624.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.100000 636.836000 282.256000 624.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 282.304000 636.836000 289.024000 624.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 289.000000 636.836000 294.736000 624.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 294.700000 636.836000 301.792000 624.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 301.804000 636.836000 312.064000 624.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 312.100000 636.836000 318.256000 624.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 318.496000 636.836000 322.300000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 322.696000 636.836000 329.848000 624.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 329.896000 636.836000 337.624000 624.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 337.492000 636.836000 345.172000 624.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 345.796000 636.836000 349.600000 624.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 349.700000 636.836000 357.380000 624.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 357.404000 636.836000 364.628000 624.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 364.604000 636.836000 368.432000 624.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 368.408000 636.836000 373.220000 624.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 373.304000 636.836000 379.460000 624.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 379.700000 636.836000 383.504000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 383.804000 636.836000 387.632000 624.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 387.608000 636.836000 395.336000 624.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 395.708000 636.836000 399.512000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 399.812000 636.836000 406.964000 624.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 407.312000 636.836000 411.116000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 411.716000 636.836000 415.520000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 415.820000 636.836000 420.632000 624.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 420.620000 636.836000 427.844000 624.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 427.820000 636.836000 435.044000 624.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 435.116000 636.836000 438.944000 624.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 438.920000 636.836000 446.600000 624.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 446.624000 636.836000 453.848000 624.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 453.824000 636.836000 460.580000 624.836000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 460.628000 636.836000 464.432000 624.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.732000 636.836000 468.536000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 468.836000 636.836000 477.500000 624.836000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 477.536000 636.836000 488.912000 624.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 488.840000 636.836000 496.064000 624.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 496.136000 636.836000 503.864000 624.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 503.840000 636.836000 511.520000 624.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 511.844000 636.836000 515.648000 624.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 515.948000 636.836000 523.172000 624.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 523.148000 636.836000 527.960000 624.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 527.948000 636.836000 535.676000 624.836000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 535.900000 636.836000 539.944000 624.836000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 622.936000 228.592000 610.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 228.604000 622.936000 234.340000 610.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 237.808000 622.936000 241.612000 610.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.308000 622.936000 250.120000 610.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 250.108000 622.936000 257.836000 610.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 257.812000 622.936000 261.640000 610.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 261.616000 622.936000 269.344000 610.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 269.416000 622.936000 277.096000 610.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 277.120000 622.936000 283.276000 610.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 283.216000 622.936000 287.020000 610.936000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 290.512000 622.936000 294.316000 610.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 297.916000 622.936000 302.728000 610.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 302.812000 622.936000 310.540000 610.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 310.516000 622.936000 317.608000 610.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 321.112000 622.936000 324.916000 610.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 328.516000 622.936000 333.328000 610.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 333.316000 622.936000 340.540000 610.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 340.612000 622.936000 347.836000 610.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 347.812000 622.936000 351.640000 610.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 351.616000 622.936000 359.296000 610.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 359.320000 622.936000 366.544000 610.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 366.520000 622.936000 373.276000 610.936000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 376.816000 622.936000 380.620000 610.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 384.220000 622.936000 390.940000 610.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 390.916000 622.936000 398.140000 610.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 398.116000 622.936000 405.844000 610.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 405.916000 622.936000 410.728000 610.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 410.716000 622.936000 417.868000 610.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 417.916000 622.936000 421.744000 610.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 421.720000 622.936000 429.448000 610.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 429.424000 622.936000 435.580000 610.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 439.120000 622.936000 442.924000 610.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 446.524000 622.936000 454.204000 610.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 454.228000 622.936000 458.056000 610.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 458.032000 622.936000 464.800000 610.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 464.836000 622.936000 471.928000 610.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 471.940000 622.936000 477.676000 610.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.640000 622.936000 483.796000 610.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 483.844000 622.936000 490.936000 610.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 498.040000 622.936000 501.844000 610.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 502.000000 622.936000 509.680000 610.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 509.704000 622.936000 513.532000 610.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 513.508000 622.936000 517.336000 610.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 517.312000 622.936000 524.404000 610.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 524.416000 622.936000 530.152000 610.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 530.116000 622.936000 536.272000 610.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 536.320000 622.936000 540.124000 610.936000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.200000 622.936000 544.004000 610.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 609.036000 227.656000 597.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 609.036000 234.424000 597.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 234.508000 609.036000 240.244000 597.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 240.112000 609.036000 247.204000 597.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 247.216000 609.036000 257.476000 597.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 257.512000 609.036000 265.192000 597.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 265.312000 609.036000 271.048000 597.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 270.916000 609.036000 274.744000 597.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 274.720000 609.036000 281.488000 597.036000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 281.524000 609.036000 288.616000 597.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 288.724000 609.036000 294.460000 597.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 294.424000 609.036000 300.580000 597.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 302.128000 609.036000 305.932000 597.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 307.528000 609.036000 314.680000 597.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.728000 609.036000 322.456000 597.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 322.528000 609.036000 330.208000 597.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 333.424000 609.036000 337.228000 597.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 337.200000 609.036000 347.460000 597.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 347.496000 609.036000 353.232000 597.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 353.196000 609.036000 360.288000 597.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 360.300000 609.036000 368.028000 597.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 368.004000 609.036000 374.724000 597.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 374.808000 609.036000 382.536000 597.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 382.512000 609.036000 389.604000 597.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 389.616000 609.036000 395.772000 597.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 395.712000 609.036000 399.516000 597.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.208000 609.036000 405.012000 597.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 406.608000 609.036000 414.576000 597.036000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 414.612000 609.036000 421.764000 597.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 421.716000 609.036000 427.452000 597.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 427.512000 609.036000 435.192000 597.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 435.108000 609.036000 442.200000 597.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 442.212000 609.036000 447.948000 597.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.616000 609.036000 453.420000 597.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 455.112000 609.036000 459.924000 597.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 459.912000 609.036000 467.136000 597.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 467.112000 609.036000 474.336000 597.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 474.408000 609.036000 478.236000 597.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 478.212000 609.036000 484.368000 597.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 485.916000 609.036000 489.720000 597.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 491.412000 609.036000 497.568000 597.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 497.616000 609.036000 505.344000 597.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 505.212000 609.036000 511.932000 597.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 512.016000 609.036000 519.744000 597.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 521.316000 609.036000 525.120000 597.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 526.812000 609.036000 533.964000 597.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 534.012000 609.036000 540.168000 597.036000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 609.036000 543.904000 597.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 595.136000 227.656000 583.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 595.136000 234.856000 583.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 234.808000 595.136000 245.068000 583.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 245.104000 595.136000 251.260000 583.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 251.200000 595.136000 255.004000 583.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 255.400000 595.136000 262.624000 583.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 262.600000 595.136000 268.336000 583.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 268.396000 595.136000 272.200000 583.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 272.392000 595.136000 277.204000 583.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 277.288000 595.136000 285.016000 583.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 284.992000 595.136000 292.084000 583.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 292.396000 595.136000 296.200000 583.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 296.200000 595.136000 303.880000 583.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 303.904000 595.136000 309.640000 583.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 309.604000 595.136000 313.432000 583.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 313.504000 595.136000 317.332000 583.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 317.308000 595.136000 321.136000 583.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 321.112000 595.136000 324.916000 583.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 325.216000 595.136000 332.944000 583.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 333.016000 595.136000 340.168000 583.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 340.120000 595.136000 347.848000 583.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 347.920000 595.136000 355.600000 583.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 355.516000 595.136000 359.320000 583.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 359.620000 595.136000 366.844000 583.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 366.916000 595.136000 374.644000 583.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 374.716000 595.136000 378.520000 583.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 378.712000 595.136000 383.524000 583.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 383.512000 595.136000 391.240000 583.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 391.312000 595.136000 398.404000 583.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 398.512000 595.136000 402.316000 583.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 402.508000 595.136000 412.768000 583.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 412.804000 595.136000 419.956000 583.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 419.908000 595.136000 423.736000 583.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 423.808000 595.136000 427.636000 583.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 427.708000 595.136000 431.512000 583.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 431.704000 595.136000 438.928000 583.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 438.904000 595.136000 444.640000 583.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 444.808000 595.136000 448.612000 583.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 448.804000 595.136000 453.244000 583.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 453.208000 595.136000 458.944000 583.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.004000 595.136000 466.228000 583.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 466.204000 595.136000 477.580000 583.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 477.700000 595.136000 481.504000 583.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 481.696000 595.136000 486.508000 583.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 486.496000 595.136000 494.224000 583.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 494.296000 595.136000 501.388000 583.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 501.400000 595.136000 505.204000 583.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 505.504000 595.136000 515.764000 583.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 515.704000 595.136000 522.928000 583.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 523.000000 595.136000 528.736000 583.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 528.700000 595.136000 535.960000 583.136000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 595.136000 540.044000 583.136000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 581.236000 229.180000 569.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 229.204000 581.236000 236.296000 569.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 236.308000 581.236000 244.036000 569.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 244.012000 581.236000 250.732000 569.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 250.708000 581.236000 258.436000 569.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 258.412000 581.236000 262.216000 569.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 262.216000 581.236000 266.020000 569.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 266.020000 581.236000 272.176000 569.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 272.224000 581.236000 279.952000 569.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 279.928000 581.236000 286.648000 569.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 286.624000 581.236000 294.352000 569.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 294.328000 581.236000 298.132000 569.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 298.132000 581.236000 305.284000 569.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 305.332000 581.236000 311.488000 569.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 311.536000 581.236000 315.340000 569.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 315.340000 581.236000 320.152000 569.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 320.140000 581.236000 327.868000 569.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 327.844000 581.236000 334.936000 569.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 334.948000 581.236000 338.752000 569.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 338.800000 581.236000 346.528000 569.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 346.504000 581.236000 353.656000 569.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 353.704000 581.236000 365.080000 569.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 365.104000 581.236000 376.480000 569.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 376.504000 581.236000 383.596000 569.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 383.608000 581.236000 389.344000 569.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 389.308000 581.236000 393.112000 569.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 393.112000 581.236000 400.264000 569.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 400.312000 581.236000 408.040000 569.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 408.016000 581.236000 415.696000 569.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 415.720000 581.236000 419.524000 569.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 419.500000 581.236000 426.652000 569.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 426.700000 581.236000 433.456000 569.236000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 433.504000 581.236000 437.308000 569.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1400.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 549.392000 119.580000 535.392000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 119.594000 549.392000 129.030000 535.392000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 128.988000 549.392000 135.890000 535.392000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.890000 549.392000 145.900000 535.392000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 145.886000 549.392000 155.378000 535.392000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 155.392000 549.392000 165.346000 535.392000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 165.388000 549.392000 170.260000 535.392000 1.000000 0.000000 0.000000 1.000000
+drawChar 170.288000 549.392000 179.836000 535.392000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 177.988000 549.392000 187.606000 535.392000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 187.592000 549.392000 197.210000 535.392000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 197.196000 549.392000 201.984000 535.392000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 201.998000 549.392000 210.328000 535.392000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 527.236000 229.492000 515.236000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 229.504000 527.236000 237.232000 515.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 237.208000 527.236000 244.300000 515.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 244.312000 527.236000 248.116000 515.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 248.300000 527.236000 252.128000 515.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 252.200000 527.236000 259.352000 515.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 259.304000 527.236000 269.564000 515.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 269.600000 527.236000 277.328000 515.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 277.304000 527.236000 288.680000 515.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 288.704000 527.236000 295.928000 515.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 295.904000 527.236000 306.164000 515.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 306.200000 527.236000 313.292000 515.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 313.400000 527.236000 319.136000 515.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 317.804000 527.236000 321.608000 515.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 321.704000 527.236000 325.508000 515.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 325.400000 527.236000 333.128000 515.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 333.104000 527.236000 340.196000 515.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 340.208000 527.236000 347.888000 515.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 347.912000 527.236000 355.592000 515.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 355.616000 527.236000 362.708000 515.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 362.720000 527.236000 366.764000 515.236000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 366.716000 527.236000 373.436000 515.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 373.520000 527.236000 377.348000 515.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 377.324000 527.236000 381.152000 515.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 381.128000 527.236000 388.808000 515.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 388.832000 527.236000 396.512000 515.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 396.536000 527.236000 403.628000 515.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 403.640000 527.236000 409.376000 515.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 409.340000 527.236000 415.496000 515.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 415.544000 527.236000 419.348000 515.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 419.444000 527.236000 426.596000 515.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 426.644000 527.236000 434.372000 515.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 434.348000 527.236000 442.028000 515.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 442.244000 527.236000 446.048000 515.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 446.000000 527.236000 451.736000 515.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 451.700000 527.236000 458.852000 515.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 458.900000 527.236000 466.160000 515.236000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 466.196000 527.236000 473.288000 515.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 473.300000 527.236000 477.104000 515.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 477.200000 527.236000 484.352000 515.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 484.304000 527.236000 490.040000 515.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 490.004000 527.236000 497.096000 515.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 497.300000 527.236000 501.104000 515.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 501.296000 527.236000 509.024000 515.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 508.892000 527.236000 515.984000 515.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 515.996000 527.236000 522.716000 515.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 522.692000 527.236000 529.784000 515.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 529.796000 527.236000 535.952000 515.236000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 536.000000 527.236000 540.044000 515.236000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 513.336000 227.656000 501.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 513.336000 234.856000 501.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 234.808000 513.336000 240.544000 501.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 240.508000 513.336000 247.276000 501.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 248.308000 513.336000 252.112000 501.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 253.204000 513.336000 258.016000 501.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 258.100000 513.336000 265.324000 501.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 265.300000 513.336000 272.524000 501.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 272.500000 513.336000 276.328000 501.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 276.400000 513.336000 282.556000 501.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 283.504000 513.336000 287.308000 501.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.400000 513.336000 292.840000 501.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 292.804000 513.336000 300.028000 501.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 300.100000 513.336000 305.836000 501.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 306.796000 513.336000 310.600000 501.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 311.692000 513.336000 323.068000 501.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 323.092000 513.336000 330.244000 501.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 330.196000 513.336000 334.024000 501.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 334.096000 513.336000 341.824000 501.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 341.800000 513.336000 346.612000 501.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 346.696000 513.336000 353.848000 501.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 353.896000 513.336000 357.724000 501.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 357.700000 513.336000 365.428000 501.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 365.404000 513.336000 369.232000 501.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 369.304000 513.336000 377.032000 501.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 377.008000 513.336000 384.688000 501.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 385.612000 513.336000 389.416000 501.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 390.508000 513.336000 395.320000 501.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 395.404000 513.336000 403.132000 501.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 403.108000 513.336000 410.200000 501.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 411.208000 513.336000 415.012000 501.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 416.104000 513.336000 419.932000 501.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 419.908000 513.336000 427.060000 501.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 427.108000 513.336000 437.368000 501.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 437.404000 513.336000 445.132000 501.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 446.104000 513.336000 449.908000 501.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 451.000000 513.336000 458.152000 501.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 458.200000 513.336000 465.928000 501.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 465.904000 513.336000 473.584000 501.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 474.604000 513.336000 478.408000 501.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 479.500000 513.336000 484.312000 501.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 484.300000 513.336000 492.028000 501.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 492.100000 513.336000 499.192000 501.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 500.200000 513.336000 504.004000 501.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 505.096000 513.336000 509.908000 501.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 509.896000 513.336000 515.632000 501.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 515.692000 513.336000 522.784000 501.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 522.796000 513.336000 529.888000 501.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 529.900000 513.336000 536.056000 501.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 535.996000 513.336000 539.800000 501.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 513.336000 543.904000 501.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 499.436000 230.164000 487.436000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 231.004000 499.436000 234.808000 487.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 235.708000 499.436000 241.864000 487.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 241.912000 499.436000 253.288000 487.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 253.216000 499.436000 260.368000 487.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 260.416000 499.436000 264.244000 487.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 264.220000 499.436000 268.048000 487.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 269.716000 499.436000 273.520000 487.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 273.700000 499.436000 281.380000 487.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 281.404000 499.436000 285.232000 487.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 285.208000 499.436000 291.928000 487.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 291.904000 499.436000 299.164000 487.436000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 300.100000 499.436000 303.904000 487.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 304.696000 499.436000 311.848000 487.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 311.896000 499.436000 319.624000 487.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 319.600000 499.436000 327.280000 487.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 328.996000 499.436000 332.800000 487.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 332.800000 499.436000 338.956000 487.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 339.004000 499.436000 346.732000 487.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 346.708000 499.436000 353.932000 487.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 353.908000 499.436000 360.676000 487.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 360.712000 499.436000 367.804000 487.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 367.816000 499.436000 371.644000 487.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 372.412000 499.436000 376.216000 487.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.116000 499.436000 383.836000 487.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 383.920000 499.436000 391.144000 487.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 391.120000 499.436000 402.496000 487.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 402.520000 499.436000 410.200000 487.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 410.224000 499.436000 414.052000 487.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 414.028000 499.436000 421.120000 487.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 421.132000 499.436000 425.944000 487.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 425.932000 499.436000 433.024000 487.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 433.828000 499.436000 437.632000 487.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 438.532000 499.436000 443.344000 487.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 443.428000 499.436000 451.156000 487.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 451.132000 499.436000 458.224000 487.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 459.028000 499.436000 462.832000 487.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 463.732000 499.436000 470.452000 487.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 470.428000 499.436000 477.652000 487.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 477.628000 499.436000 481.456000 487.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 481.528000 499.436000 485.356000 487.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 485.332000 499.436000 492.424000 487.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 492.436000 499.436000 499.156000 487.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 499.132000 499.436000 503.944000 487.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 504.028000 499.436000 507.856000 487.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 507.832000 499.436000 515.056000 487.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 515.032000 499.436000 522.760000 487.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 523.636000 499.436000 527.440000 487.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 528.340000 499.436000 535.564000 487.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 535.540000 499.436000 539.980000 487.436000 1.000000 0.000000 0.000000 1.000000 f
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 499.436000 543.904000 487.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 485.536000 229.180000 473.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 229.204000 485.536000 236.356000 473.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 236.404000 485.536000 242.140000 473.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 242.104000 485.536000 249.784000 473.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 249.808000 485.536000 256.900000 473.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 256.912000 485.536000 264.640000 473.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 264.616000 485.536000 268.420000 473.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 268.420000 485.536000 273.232000 473.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 273.220000 485.536000 280.444000 473.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 280.420000 485.536000 287.644000 473.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 287.620000 485.536000 291.448000 473.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 291.424000 485.536000 297.580000 473.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 297.628000 485.536000 301.432000 473.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 301.432000 485.536000 305.236000 473.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 305.236000 485.536000 309.040000 473.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 447.748000 121.220000 431.748000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 121.204000 447.748000 129.092000 431.748000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 129.108000 447.748000 139.956000 431.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 140.004000 447.748000 150.852000 431.748000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 150.900000 447.748000 162.276000 431.748000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 162.308000 447.748000 173.684000 431.748000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 173.716000 447.748000 184.708000 431.748000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 184.724000 447.748000 196.100000 431.748000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 196.132000 447.748000 205.652000 431.748000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 205.636000 447.748000 216.484000 431.748000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 423.136000 230.164000 411.136000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 230.704000 423.136000 234.508000 411.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 235.000000 423.136000 241.156000 411.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 241.204000 423.136000 252.580000 411.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 252.508000 423.136000 259.660000 411.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 259.708000 423.136000 263.536000 411.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 263.512000 423.136000 267.340000 411.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 267.808000 423.136000 271.612000 411.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 272.308000 423.136000 279.988000 411.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 279.904000 423.136000 285.640000 411.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 285.604000 423.136000 292.696000 411.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 292.708000 423.136000 299.800000 411.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 299.812000 423.136000 307.540000 411.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 307.612000 423.136000 315.340000 411.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 315.316000 423.136000 322.540000 411.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 322.612000 423.136000 330.340000 411.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 330.316000 423.136000 336.472000 411.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 336.520000 423.136000 343.612000 411.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 344.116000 423.136000 347.920000 411.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 348.412000 423.136000 352.240000 411.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 352.216000 423.136000 358.372000 411.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 358.912000 423.136000 362.716000 411.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 363.316000 423.136000 370.468000 411.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 370.516000 423.136000 374.344000 411.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 374.320000 423.136000 380.476000 411.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 380.524000 423.136000 387.748000 411.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 388.228000 423.136000 392.032000 411.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 392.524000 423.136000 400.204000 411.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 400.120000 423.136000 407.272000 411.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 407.320000 423.136000 413.056000 411.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 413.020000 423.136000 417.832000 411.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 418.420000 423.136000 422.224000 411.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 422.824000 423.136000 430.048000 411.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 430.024000 423.136000 434.464000 411.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 434.920000 423.136000 438.724000 411.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 439.324000 423.136000 450.700000 411.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 450.628000 423.136000 457.396000 411.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 457.924000 423.136000 461.728000 411.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 462.328000 423.136000 470.008000 411.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 470.032000 423.136000 477.184000 411.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 477.136000 423.136000 482.872000 411.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 482.932000 423.136000 490.612000 411.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 490.636000 423.136000 497.728000 411.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 497.740000 423.136000 505.468000 411.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 505.444000 423.136000 509.248000 411.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.740000 423.136000 513.544000 411.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 514.036000 423.136000 522.028000 411.136000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 522.040000 423.136000 529.768000 411.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 529.744000 423.136000 533.572000 411.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 533.644000 423.136000 539.800000 411.136000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 423.136000 543.904000 411.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 409.236000 225.328000 397.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 225.304000 409.236000 231.460000 397.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 233.308000 409.236000 237.112000 397.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 239.008000 409.236000 249.268000 397.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 249.304000 409.236000 257.032000 397.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 257.008000 409.236000 264.100000 397.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 264.112000 409.236000 269.848000 397.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 269.812000 409.236000 276.904000 397.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 278.812000 409.236000 282.616000 397.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 284.512000 409.236000 289.324000 397.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 289.312000 409.236000 297.040000 397.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 297.112000 409.236000 304.204000 397.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 307.816000 409.236000 311.620000 397.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 311.700000 409.236000 316.512000 397.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 316.500000 409.236000 323.724000 397.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 323.700000 409.236000 335.076000 397.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 335.100000 409.236000 342.252000 397.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 342.300000 409.236000 347.112000 397.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 347.100000 409.236000 354.324000 397.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 354.300000 409.236000 361.392000 397.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 361.404000 409.236000 367.560000 397.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 369.408000 409.236000 373.212000 397.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 375.108000 409.236000 382.260000 397.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 382.308000 409.236000 390.036000 397.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 390.012000 409.236000 397.692000 397.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 401.412000 409.236000 405.216000 397.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 405.300000 409.236000 411.456000 397.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 411.504000 409.236000 418.596000 397.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 418.608000 409.236000 425.700000 397.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 425.712000 409.236000 433.392000 397.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 433.308000 409.236000 437.136000 397.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 437.208000 409.236000 441.036000 397.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 441.012000 409.236000 448.740000 397.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 448.716000 409.236000 456.396000 397.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 456.420000 409.236000 462.576000 397.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 464.520000 409.236000 468.324000 397.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 470.124000 409.236000 477.276000 397.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 477.324000 409.236000 483.060000 397.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 483.024000 409.236000 490.116000 397.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 492.024000 409.236000 495.828000 397.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 497.628000 409.236000 505.308000 397.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 505.332000 409.236000 511.068000 397.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 511.032000 409.236000 518.256000 397.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 518.232000 409.236000 528.492000 397.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 528.528000 409.236000 536.256000 397.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 536.232000 409.236000 540.036000 397.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 409.236000 543.904000 397.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 395.336000 229.492000 383.336000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 229.504000 395.336000 237.232000 383.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 237.208000 395.336000 244.300000 383.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 245.308000 395.336000 249.112000 383.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 250.204000 395.336000 257.884000 383.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 257.908000 395.336000 263.644000 383.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 263.704000 395.336000 270.796000 383.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 270.808000 395.336000 277.900000 383.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 277.912000 395.336000 285.640000 383.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 285.616000 395.336000 293.344000 383.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 293.416000 395.336000 300.640000 383.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 300.616000 395.336000 308.344000 383.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 308.320000 395.336000 314.476000 383.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 314.524000 395.336000 321.616000 383.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 322.624000 395.336000 326.428000 383.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 327.628000 395.336000 331.456000 383.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 331.432000 395.336000 337.588000 383.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 338.632000 395.336000 342.436000 383.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 343.528000 395.336000 350.296000 383.336000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 350.224000 395.336000 357.316000 383.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 357.328000 395.336000 363.064000 383.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 363.028000 395.336000 369.796000 383.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 371.032000 395.336000 374.836000 383.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 375.928000 395.336000 382.084000 383.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 382.132000 395.336000 393.508000 383.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 393.436000 395.336000 400.588000 383.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 400.636000 395.336000 404.464000 383.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 404.440000 395.336000 408.268000 383.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 408.340000 395.336000 412.144000 383.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 413.140000 395.336000 416.944000 383.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 418.036000 395.336000 421.756000 383.336000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 421.732000 395.336000 429.460000 383.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 429.436000 395.336000 435.592000 383.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 435.640000 395.336000 440.452000 383.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 441.544000 395.336000 445.348000 383.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 446.440000 395.336000 454.120000 383.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 454.144000 395.336000 457.972000 383.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 457.948000 395.336000 465.628000 383.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 466.648000 395.336000 470.452000 383.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 471.544000 395.336000 478.636000 383.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 478.648000 395.336000 486.376000 383.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 486.352000 395.336000 493.576000 383.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 493.648000 395.336000 501.376000 383.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 501.352000 395.336000 509.032000 383.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 509.056000 395.336000 516.784000 383.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 517.852000 395.336000 521.656000 383.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 522.748000 395.336000 527.188000 383.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 527.152000 395.336000 534.376000 383.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 534.448000 395.336000 540.184000 383.336000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 395.336000 543.904000 383.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 381.436000 228.724000 369.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 228.700000 381.436000 236.428000 369.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 236.404000 381.436000 243.496000 369.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 243.508000 381.436000 247.312000 369.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 247.312000 381.436000 254.992000 369.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 255.016000 381.436000 262.108000 369.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 262.120000 381.436000 267.856000 369.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 267.820000 381.436000 273.976000 369.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 274.024000 381.436000 281.248000 369.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 281.224000 381.436000 288.952000 369.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 288.928000 381.436000 292.732000 369.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 292.732000 381.436000 297.544000 369.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 297.532000 381.436000 304.756000 369.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 304.732000 381.436000 308.536000 369.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 308.536000 381.436000 315.628000 369.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 315.640000 381.436000 323.368000 369.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 323.344000 381.436000 328.156000 369.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 328.144000 381.436000 335.236000 369.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 335.248000 381.436000 340.984000 369.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 339.652000 381.436000 343.456000 369.436000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 343.456000 381.436000 347.260000 369.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 347.260000 381.436000 354.940000 369.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 354.964000 381.436000 362.692000 369.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 362.668000 381.436000 367.480000 369.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 367.468000 381.436000 371.272000 369.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 371.272000 381.436000 379.000000 369.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 378.976000 381.436000 386.200000 369.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 386.176000 381.436000 390.988000 369.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 390.976000 381.436000 394.780000 369.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 394.780000 381.436000 402.460000 369.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 402.484000 381.436000 406.312000 369.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 406.288000 381.436000 413.968000 369.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 413.992000 381.436000 417.796000 369.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 417.796000 381.436000 424.888000 369.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 424.900000 381.436000 432.628000 369.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 432.604000 381.436000 439.828000 369.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 439.804000 381.436000 447.532000 369.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 447.508000 381.436000 455.188000 369.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 455.212000 381.436000 462.940000 369.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 462.916000 381.436000 466.720000 369.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 466.720000 381.436000 471.532000 369.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 471.520000 381.436000 478.744000 369.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 478.720000 381.436000 482.524000 369.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 482.524000 381.436000 488.680000 369.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 488.728000 381.436000 493.540000 369.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 493.528000 381.436000 500.680000 369.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 500.728000 381.436000 508.456000 369.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 508.432000 381.436000 516.112000 369.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 516.136000 381.436000 519.940000 369.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 519.940000 381.436000 523.768000 369.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 523.744000 381.436000 531.472000 369.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 531.448000 381.436000 535.252000 369.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 108.100000 343.648000 119.028000 327.648000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 118.996000 343.648000 124.468000 327.648000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 124.500000 343.648000 135.492000 327.648000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 135.508000 343.648000 150.276000 327.648000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 150.308000 343.648000 161.156000 327.648000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 161.204000 343.648000 169.092000 327.648000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 169.108000 343.648000 178.628000 327.648000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 319.136000 230.164000 307.136000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 229.096000 319.136000 236.248000 307.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 236.200000 319.136000 241.936000 307.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 241.996000 319.136000 245.824000 307.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 245.800000 319.136000 253.024000 307.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 253.000000 319.136000 260.728000 307.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 260.704000 319.136000 266.860000 307.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 267.508000 319.136000 271.312000 307.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 271.912000 319.136000 276.724000 307.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 276.712000 319.136000 283.480000 307.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 283.516000 319.136000 291.196000 307.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 291.220000 319.136000 298.312000 307.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 298.324000 319.136000 304.480000 307.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 305.128000 319.136000 308.932000 307.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 309.532000 319.136000 316.756000 307.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 316.732000 319.136000 321.172000 307.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 321.736000 319.136000 325.540000 307.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 326.740000 319.136000 334.732000 307.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 334.240000 319.136000 341.464000 307.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 341.440000 319.136000 351.700000 307.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 351.736000 319.136000 358.828000 307.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 358.840000 319.136000 364.576000 307.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 364.540000 319.136000 370.696000 307.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 371.344000 319.136000 375.148000 307.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 375.748000 319.136000 382.900000 307.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 382.948000 319.136000 388.684000 307.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.648000 319.136000 395.740000 307.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 396.352000 319.136000 400.156000 307.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 400.756000 319.136000 408.436000 307.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 408.460000 319.136000 412.288000 307.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 412.264000 319.136000 419.416000 307.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 419.464000 319.136000 427.192000 307.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 427.168000 319.136000 431.980000 307.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 431.968000 319.136000 439.060000 307.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 439.072000 319.136000 446.752000 307.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 447.376000 319.136000 451.180000 307.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 451.780000 319.136000 455.608000 307.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 455.584000 319.136000 463.312000 307.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 463.984000 319.136000 467.788000 307.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 468.388000 319.136000 473.200000 307.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 473.188000 319.136000 480.916000 307.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 480.988000 319.136000 488.080000 307.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 488.584000 319.136000 492.388000 307.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 492.988000 319.136000 500.668000 307.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 500.692000 319.136000 507.844000 307.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 507.796000 319.136000 513.532000 307.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 513.592000 319.136000 521.272000 307.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 521.296000 319.136000 528.388000 307.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 528.400000 319.136000 536.128000 307.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 536.104000 319.136000 539.908000 307.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 319.136000 543.904000 307.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 305.236000 226.240000 293.236000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 226.204000 305.236000 233.932000 293.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 234.700000 305.236000 238.504000 293.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 239.200000 305.236000 246.292000 293.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 246.304000 305.236000 253.456000 293.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 253.504000 305.236000 260.224000 293.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 260.200000 305.236000 267.928000 293.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 268.600000 305.236000 272.404000 293.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 273.904000 305.236000 281.896000 293.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 281.200000 305.236000 288.424000 293.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 288.400000 305.236000 298.660000 293.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 298.696000 305.236000 305.788000 293.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 305.800000 305.236000 311.536000 293.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 311.500000 305.236000 319.180000 293.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 319.204000 305.236000 326.296000 293.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 326.308000 305.236000 333.988000 293.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 334.708000 305.236000 338.512000 293.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 339.208000 305.236000 343.948000 293.236000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 344.704000 305.236000 348.508000 293.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 349.300000 305.236000 357.028000 293.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 357.004000 305.236000 364.156000 293.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 364.204000 305.236000 370.972000 293.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 371.008000 305.236000 378.100000 293.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 378.712000 305.236000 382.516000 293.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 383.308000 305.236000 390.988000 293.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 390.904000 305.236000 394.732000 293.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 394.708000 305.236000 401.860000 293.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 401.908000 305.236000 409.636000 293.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 409.708000 305.236000 414.520000 293.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 414.508000 305.236000 421.600000 293.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 421.612000 305.236000 429.292000 293.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 430.012000 305.236000 433.816000 293.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 434.608000 305.236000 441.760000 293.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 441.808000 305.236000 449.536000 293.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 450.208000 305.236000 454.012000 293.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.708000 305.236000 461.860000 293.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 461.908000 305.236000 468.064000 293.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 468.004000 305.236000 474.160000 293.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 474.208000 305.236000 481.432000 293.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 481.408000 305.236000 487.144000 293.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 487.108000 305.236000 491.920000 293.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 492.004000 305.236000 503.380000 293.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 503.308000 305.236000 510.400000 293.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 510.412000 305.236000 518.140000 293.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 518.212000 305.236000 523.024000 293.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 523.708000 305.236000 527.512000 293.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 528.304000 305.236000 535.528000 293.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 535.504000 305.236000 539.944000 293.236000 1.000000 0.000000 0.000000 1.000000 f
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 305.236000 543.904000 293.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 291.336000 227.656000 279.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 227.704000 291.336000 234.796000 279.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 234.808000 291.336000 241.900000 279.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 241.912000 291.336000 249.592000 279.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 249.508000 291.336000 255.664000 279.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 257.008000 291.336000 260.812000 279.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.204000 291.336000 272.464000 279.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 272.500000 291.336000 280.228000 279.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 280.204000 291.336000 284.032000 279.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 284.008000 291.336000 290.728000 279.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 290.812000 291.336000 298.540000 279.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 299.812000 291.336000 303.616000 279.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 305.008000 291.336000 312.688000 279.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 312.712000 291.336000 316.540000 279.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 316.516000 291.336000 323.740000 279.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 323.716000 291.336000 330.940000 279.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 331.012000 291.336000 342.388000 279.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 343.708000 291.336000 347.512000 279.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 348.904000 291.336000 356.056000 279.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 356.104000 291.336000 360.916000 279.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 362.200000 291.336000 366.004000 279.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 367.396000 291.336000 375.076000 279.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 375.100000 291.336000 378.928000 279.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 378.904000 291.336000 387.424000 279.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 387.400000 291.336000 394.492000 279.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 394.504000 291.336000 400.240000 279.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 400.300000 291.336000 407.392000 279.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 407.404000 291.336000 415.132000 279.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 415.108000 291.336000 419.920000 279.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 421.204000 291.336000 425.008000 279.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 426.400000 291.336000 431.212000 279.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 431.200000 291.336000 435.028000 279.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 435.100000 291.336000 446.476000 279.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 446.404000 291.336000 453.496000 279.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.508000 291.336000 459.664000 279.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 461.008000 291.336000 464.812000 279.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 466.204000 291.336000 473.428000 279.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 473.500000 291.336000 477.940000 279.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 479.200000 291.336000 483.004000 279.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.396000 291.336000 489.208000 279.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.196000 291.336000 496.924000 279.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.996000 291.336000 504.088000 279.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 505.396000 291.336000 509.200000 279.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 510.592000 291.336000 517.360000 279.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 517.396000 291.336000 524.488000 279.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 524.500000 291.336000 531.652000 279.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 531.604000 291.336000 537.340000 279.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 536.104000 291.336000 539.908000 279.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 291.336000 543.904000 279.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 277.436000 229.492000 265.436000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 229.504000 277.436000 237.232000 265.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 237.208000 277.436000 241.036000 265.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 241.108000 277.436000 247.264000 265.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 248.308000 277.436000 252.112000 265.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 253.204000 277.436000 259.924000 265.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 260.008000 277.436000 265.744000 265.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 265.708000 277.436000 272.800000 265.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 272.812000 277.436000 279.964000 265.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 280.012000 277.436000 284.824000 265.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 284.812000 277.436000 291.904000 265.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 291.916000 277.436000 298.072000 265.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 299.116000 277.436000 302.920000 265.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 304.216000 277.436000 311.368000 265.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 312.412000 277.436000 316.216000 265.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 317.308000 277.436000 324.028000 265.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 324.004000 277.436000 331.228000 265.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 331.204000 277.436000 335.032000 265.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 335.104000 277.436000 342.328000 265.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 342.304000 277.436000 348.040000 265.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 348.004000 277.436000 352.444000 265.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 352.504000 277.436000 360.232000 265.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 360.208000 277.436000 364.036000 265.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 365.212000 277.436000 369.016000 265.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.216000 277.436000 377.368000 265.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 377.416000 277.436000 383.152000 265.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 383.116000 277.436000 388.852000 265.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.816000 277.436000 395.968000 265.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 396.016000 277.436000 403.744000 265.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 403.720000 277.436000 411.400000 265.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 411.424000 277.436000 418.516000 265.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 418.528000 277.436000 429.904000 265.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 429.928000 277.436000 437.020000 265.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 437.032000 277.436000 444.760000 265.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 444.736000 277.436000 449.548000 265.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 450.640000 277.436000 454.444000 265.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 455.536000 277.436000 462.688000 265.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 462.736000 277.436000 470.464000 265.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 470.440000 277.436000 478.120000 265.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 479.236000 277.436000 483.040000 265.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.240000 277.436000 488.068000 265.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 488.044000 277.436000 494.200000 265.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 494.248000 277.436000 498.052000 265.436000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 499.144000 277.436000 502.948000 265.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 504.040000 277.436000 507.868000 265.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 507.844000 277.436000 515.572000 265.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 516.748000 277.436000 520.552000 265.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 521.752000 277.436000 533.128000 265.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 533.152000 277.436000 539.920000 265.436000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 277.436000 543.904000 265.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 263.536000 228.724000 251.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 228.700000 263.536000 236.380000 251.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 236.404000 263.536000 240.232000 251.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 240.208000 263.536000 247.936000 251.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 248.008000 263.536000 251.836000 251.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 251.812000 263.536000 259.036000 251.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 259.012000 263.536000 266.740000 251.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 266.812000 263.536000 270.616000 251.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 270.616000 263.536000 274.420000 251.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 274.516000 263.536000 285.892000 251.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 285.916000 263.536000 293.140000 251.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 293.116000 263.536000 298.852000 251.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 298.816000 263.536000 305.908000 251.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 306.016000 263.536000 309.820000 251.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 310.012000 263.536000 317.692000 251.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 317.608000 263.536000 321.436000 251.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 321.508000 263.536000 328.600000 251.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 328.612000 263.536000 335.764000 251.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 335.716000 263.536000 341.872000 251.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 341.920000 263.536000 345.748000 251.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 345.724000 263.536000 353.452000 251.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 353.524000 263.536000 361.204000 251.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 361.120000 263.536000 364.924000 251.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 365.020000 263.536000 369.832000 251.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 369.916000 263.536000 377.140000 251.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 377.212000 263.536000 381.016000 251.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 381.208000 263.536000 386.020000 251.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 385.912000 263.536000 393.640000 251.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 393.616000 263.536000 400.708000 251.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 400.720000 263.536000 404.524000 251.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 404.716000 263.536000 411.808000 251.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 411.820000 263.536000 418.588000 251.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 418.624000 263.536000 425.716000 251.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 425.824000 263.536000 429.628000 251.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.820000 263.536000 434.632000 251.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 434.524000 263.536000 442.252000 251.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 442.228000 263.536000 449.380000 251.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 449.428000 263.536000 457.156000 251.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 457.132000 263.536000 460.936000 251.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 461.128000 263.536000 468.808000 251.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 468.832000 263.536000 472.660000 251.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 472.528000 263.536000 478.684000 251.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 478.732000 263.536000 483.544000 251.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 483.532000 263.536000 487.360000 251.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 487.432000 263.536000 495.160000 251.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 495.136000 263.536000 501.856000 251.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 501.832000 263.536000 506.644000 251.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 506.728000 263.536000 510.532000 251.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 510.628000 263.536000 516.364000 251.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 516.424000 263.536000 523.648000 251.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 523.624000 263.536000 533.884000 251.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 533.920000 263.536000 540.076000 251.536000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 263.536000 543.904000 251.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 249.636000 228.724000 237.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 228.700000 249.636000 233.140000 237.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 234.196000 249.636000 238.000000 237.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 239.092000 249.636000 246.184000 237.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 246.196000 249.636000 253.348000 237.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 253.396000 249.636000 260.116000 237.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 260.092000 249.636000 267.820000 237.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 268.792000 249.636000 272.596000 237.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 273.688000 249.636000 278.500000 237.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 278.488000 249.636000 285.256000 237.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 285.292000 249.636000 292.972000 237.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 292.996000 249.636000 300.088000 237.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 301.096000 249.636000 304.900000 237.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 305.992000 249.636000 313.216000 237.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 313.192000 249.636000 317.632000 237.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 318.688000 249.636000 322.492000 237.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 324.592000 249.636000 332.584000 237.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 331.588000 249.636000 338.812000 237.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 338.788000 249.636000 349.048000 237.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 349.084000 249.636000 356.176000 237.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 356.188000 249.636000 361.924000 237.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 360.592000 249.636000 364.396000 237.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.392000 249.636000 369.196000 237.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.288000 249.636000 378.508000 237.636000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 378.484000 249.636000 385.708000 237.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 385.684000 249.636000 397.060000 237.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 397.180000 249.636000 404.272000 237.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 405.280000 249.636000 409.084000 237.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 410.176000 249.636000 417.400000 237.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 417.376000 249.636000 421.816000 237.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 422.776000 249.636000 426.580000 237.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 427.672000 249.636000 432.484000 237.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 432.568000 249.636000 440.296000 237.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 440.272000 249.636000 447.364000 237.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 448.372000 249.636000 452.176000 237.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 454.276000 249.636000 462.268000 237.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 461.272000 249.636000 468.496000 237.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 468.472000 249.636000 478.732000 237.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 478.768000 249.636000 485.860000 237.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 485.872000 249.636000 491.608000 237.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 491.572000 249.636000 497.728000 237.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 498.772000 249.636000 502.576000 237.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 503.668000 249.636000 513.928000 237.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 513.964000 249.636000 521.692000 237.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 521.668000 249.636000 525.496000 237.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 525.472000 249.636000 532.192000 237.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 532.276000 249.636000 540.004000 237.636000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 540.100000 249.636000 543.904000 237.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 221.500000 235.736000 228.220000 223.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 228.196000 235.736000 235.348000 223.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 235.396000 235.736000 243.124000 223.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 243.100000 235.736000 246.904000 223.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 246.904000 235.736000 254.584000 223.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 254.608000 235.736000 261.700000 223.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 261.712000 235.736000 265.516000 223.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 265.516000 235.736000 269.956000 223.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 269.920000 235.736000 277.144000 223.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 277.120000 235.736000 284.848000 223.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 284.824000 235.736000 292.552000 223.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 292.528000 235.736000 300.208000 223.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 300.232000 235.736000 304.036000 223.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 304.036000 235.736000 311.764000 223.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 311.740000 235.736000 318.832000 223.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 318.844000 235.736000 324.580000 223.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 324.544000 235.736000 331.636000 223.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 331.648000 235.736000 335.452000 223.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 335.452000 235.736000 342.604000 223.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 342.652000 235.736000 348.388000 223.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 348.352000 235.736000 355.444000 223.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 355.456000 235.736000 359.488000 223.736000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 93 1 0 0 0 900.000000 0 FAAAAA+OpenSymbol
+drawChar 222.100000 212.944000 226.987000 203.944000 1.000000 0.000000 0.000000 1.000000 ✳
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 236.300000 215.836000 241.040000 203.836000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 241.004000 215.836000 246.740000 203.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 246.704000 215.836000 250.532000 203.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 250.508000 215.836000 256.664000 203.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 256.712000 215.836000 263.804000 203.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 263.816000 215.836000 269.972000 203.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 93 1 0 0 0 900.000000 0 FAAAAA+OpenSymbol
+drawChar 222.100000 193.044000 226.987000 184.044000 1.000000 0.000000 0.000000 1.000000 ✳
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 236.300000 195.936000 245.912000 183.936000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 245.900000 195.936000 253.052000 183.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 253.100000 195.936000 260.828000 183.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 260.804000 195.936000 264.632000 183.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 264.608000 195.936000 268.436000 183.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 268.412000 195.936000 275.564000 183.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 275.612000 195.936000 281.768000 183.936000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 108.100000 90.136000 116.164000 78.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 115.600000 90.136000 122.752000 78.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 122.800000 90.136000 130.480000 78.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 130.504000 90.136000 137.596000 78.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.608000 90.136000 141.412000 78.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 141.400000 90.136000 149.032000 78.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 148.996000 90.136000 156.628000 78.136000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 11583.600000 0 477.900000 11583.600000 0 477.900000 11893.400000 0 134.300000 11893.400000 0 134.300000 11583.600000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -1079170.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 8594.600000 0 168.100000 8594.600000 0 168.100000 8599.600000 0 76.900000 8599.600000 0 76.900000 8594.600000 0
+eoFillPath subpath 1 163.100000 8599.500000 0 168.100000 8599.500000 0 168.100000 8730.100000 0 163.100000 8730.100000 0 163.100000 8599.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 8599.600000 0 163.100000 8599.600000 0 163.100000 8735.000000 0 72.000000 8735.000000 0 72.000000 8599.600000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 8730.680000 87.320000 8720.680000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 8730.680000 93.420000 8720.680000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 8730.680000 97.510000 8720.680000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 8730.680000 101.420000 8720.680000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 8730.680000 104.170000 8720.680000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 8730.680000 110.530000 8720.680000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 8730.680000 113.270000 8720.680000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 8730.680000 116.470000 8720.680000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 8730.680000 123.480000 8720.680000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 8730.680000 129.610000 8720.680000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 8730.680000 135.090000 8720.680000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 8730.680000 140.890000 8720.680000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 8730.680000 144.820000 8720.680000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 8730.680000 150.920000 8720.680000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 8730.680000 153.670000 8720.680000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 8730.680000 156.470000 8720.680000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 8603.800000 0 168.200000 8603.800000 0 168.200000 8719.000000 0 72.000000 8719.000000 0 72.000000 8603.800000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8671.952000 79.253000 8662.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 8671.952000 86.669000 8662.952000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 8671.952000 90.215000 8662.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 8671.952000 93.077000 8662.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 8671.952000 97.406000 8662.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 8671.952000 100.853000 8662.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 8671.952000 107.324000 8662.952000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 8671.952000 112.337000 8662.952000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 8671.952000 115.271000 8662.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 8671.952000 118.655000 8662.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 8671.952000 126.512000 8662.952000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 8671.952000 130.805000 8662.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 8671.952000 135.881000 8662.952000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 8671.952000 139.355000 8662.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 8671.952000 147.284000 8662.952000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 8671.952000 150.074000 8662.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 8671.952000 155.897000 8662.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 8671.952000 158.750000 8662.952000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 8671.952000 161.853000 8662.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8661.452000 82.124000 8652.452000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 8661.452000 87.137000 8652.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 8661.452000 90.071000 8652.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 8661.452000 93.356000 8652.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 8661.452000 100.403000 8652.452000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 8661.452000 104.921000 8652.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 8661.452000 109.205000 8652.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 8661.452000 117.737000 8652.452000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 8661.452000 123.119000 8652.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 8661.452000 128.996000 8652.452000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 8661.452000 132.605000 8652.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 8661.452000 138.392000 8652.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 8661.452000 141.749000 8652.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 8661.452000 149.507000 8652.452000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 8661.452000 153.800000 8652.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 8661.452000 158.876000 8652.452000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 8661.452000 161.853000 8652.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8650.952000 81.764000 8641.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 8650.952000 87.596000 8641.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 8650.952000 93.356000 8641.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 8650.952000 102.050000 8641.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 8650.952000 113.822000 8641.952000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 8650.952000 122.651000 8641.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 8650.952000 134.117000 8641.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 8650.952000 138.401000 8641.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 8650.952000 147.149000 8641.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 8650.952000 158.921000 8641.952000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 8650.952000 161.853000 8641.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8640.452000 79.271000 8631.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 8640.452000 84.338000 8631.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 8640.452000 89.621000 8631.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 8640.452000 94.643000 8631.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 8640.452000 100.502000 8631.452000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 8640.452000 106.262000 8631.452000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 8640.452000 111.518000 8631.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 8640.452000 116.216000 8631.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 8640.452000 119.249000 8631.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 8640.452000 122.363000 8631.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 8640.452000 128.186000 8631.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 8640.452000 131.345000 8631.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 8640.452000 137.060000 8631.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 8640.452000 140.147000 8631.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 8640.452000 145.007000 8631.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 8640.452000 148.598000 8631.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 8640.452000 151.460000 8631.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 8640.452000 155.789000 8631.452000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 8640.452000 158.933000 8631.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8629.952000 80.702000 8620.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 8629.952000 83.573000 8620.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 8629.952000 89.396000 8620.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 8629.952000 95.156000 8620.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 8629.952000 100.547000 8620.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 8629.952000 109.052000 8620.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 8629.952000 111.959000 8620.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 8629.952000 117.251000 8620.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 8629.952000 121.904000 8620.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 8629.952000 126.503000 8620.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 8629.952000 129.338000 8620.952000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 8629.952000 134.936000 8620.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 8629.952000 143.441000 8620.952000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 8629.952000 148.796000 8620.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 8629.952000 154.574000 8620.952000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 8629.952000 158.876000 8620.952000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 8629.952000 161.853000 8620.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8619.452000 79.271000 8610.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 8619.452000 85.094000 8610.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 8619.452000 88.703000 8610.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 8619.452000 94.112000 8610.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 8619.452000 97.244000 8610.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 8619.452000 103.058000 8610.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 8619.452000 108.890000 8610.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 8619.452000 111.950000 8610.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 8619.452000 115.271000 8610.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 8619.452000 120.338000 8610.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 8619.452000 125.621000 8610.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 8619.452000 131.363000 8610.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 8619.452000 134.558000 8610.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 8619.452000 140.048000 8610.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 8619.452000 145.430000 8610.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 8619.452000 150.551000 8610.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 8619.452000 155.960000 8610.452000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 8619.452000 158.933000 8610.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8608.952000 80.009000 8599.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 8608.952000 85.364000 8599.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 8608.952000 88.271000 8599.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 8608.952000 91.169000 8599.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 8608.952000 97.955000 8599.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 8608.952000 107.765000 8599.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 8608.952000 110.672000 8599.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 8608.952000 115.964000 8599.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 8608.952000 120.617000 8599.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 8608.952000 125.216000 8599.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 8608.952000 128.051000 8599.952000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 8608.952000 134.954000 8599.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 8608.952000 146.285000 8599.952000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 8608.952000 151.667000 8599.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 8608.952000 155.906000 8599.952000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 8608.952000 159.033000 8599.952000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 8599.500000 0 72.100000 8599.500000 0 72.100000 8735.000000 0 72.000000 8735.000000 0 72.000000 8599.500000 0
+eoFillPath subpath 1 163.100000 8599.500000 0 163.200000 8599.500000 0 163.200000 8735.000000 0 163.100000 8735.000000 0 163.100000 8599.500000 0
+eoFillPath subpath 1 72.000000 8734.900000 0 163.200000 8734.900000 0 163.200000 8735.000000 0 72.000000 8735.000000 0 72.000000 8734.900000 0
+eoFillPath subpath 1 72.000000 8599.500000 0 163.200000 8599.500000 0 163.200000 8599.600000 0 72.000000 8599.600000 0 72.000000 8599.500000 0
+saveState
+eoClipPath subpath 1 96.900000 8674.800000 0 138.300000 8674.800000 0 138.300000 8719.000000 0 96.900000 8719.000000 0 96.900000 8674.800000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -788290.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 8320.000000 0 165.500000 8320.000000 0 165.500000 8325.000000 0 76.900000 8325.000000 0 76.900000 8320.000000 0
+eoFillPath subpath 1 160.500000 8324.900000 0 165.500000 8324.900000 0 165.500000 8481.200000 0 160.500000 8481.200000 0 160.500000 8324.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 8325.000000 0 121.400000 8325.000000 0 121.400000 8486.100000 0 72.000000 8486.100000 0 72.000000 8325.000000 0
+saveState
+eoClipPath subpath 1 72.000000 8324.900000 0 160.500000 8324.900000 0 160.500000 8486.000000 0 72.000000 8486.000000 0 72.000000 8324.900000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -751590.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 8481.780000 89.280000 8471.780000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 8481.780000 95.630000 8471.780000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 8481.780000 99.520000 8471.780000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 8481.780000 102.270000 8471.780000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 8481.780000 108.450000 8471.780000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 8481.780000 112.610000 8471.780000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 8481.780000 118.510000 8471.780000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 8481.780000 121.670000 8471.780000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 8481.780000 124.470000 8471.780000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 8481.780000 130.830000 8471.780000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 8481.780000 133.970000 8471.780000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 8481.780000 137.920000 8471.780000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 8481.780000 144.230000 8471.780000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 8481.780000 150.350000 8471.780000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 8481.780000 153.570000 8471.780000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 8470.080000 95.000000 8460.080000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 8470.080000 97.770000 8460.080000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 8470.080000 103.000000 8460.080000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 8470.080000 109.330000 8460.080000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 8470.080000 117.470000 8460.080000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 8470.080000 123.620000 8460.080000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 8470.080000 128.800000 8460.080000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 8470.080000 135.130000 8460.080000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 8470.080000 141.250000 8460.080000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 8470.080000 145.410000 8460.080000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8455.252000 82.961000 8446.252000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 8455.252000 87.614000 8446.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 8455.252000 93.356000 8446.252000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 8455.252000 98.612000 8446.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 8455.252000 103.733000 8446.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 8455.252000 106.568000 8446.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 8455.252000 111.959000 8446.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 8455.252000 114.866000 8446.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 8455.252000 117.665000 8446.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 8455.252000 122.768000 8446.252000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 8455.252000 125.747000 8446.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 8455.252000 131.651000 8446.252000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 8455.252000 136.907000 8446.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 8455.252000 142.307000 8446.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 8455.252000 148.049000 8446.252000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 8455.252000 150.956000 8446.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 8455.252000 156.302000 8446.252000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 8455.252000 159.253000 8446.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8444.752000 84.095000 8435.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 8444.752000 89.900000 8435.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 8444.752000 95.318000 8435.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 8444.752000 100.349000 8435.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 8444.752000 110.789000 8435.752000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 8444.752000 111.464000 8435.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 8444.752000 114.362000 8435.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 8444.752000 119.348000 8435.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 8444.752000 126.962000 8435.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 8444.752000 132.047000 8435.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 8444.752000 139.958000 8435.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 8444.752000 142.865000 8435.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 8444.752000 147.410000 8435.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 8444.752000 153.287000 8435.752000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 8444.752000 156.333000 8435.752000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8434.252000 84.095000 8425.252000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 8434.252000 89.468000 8425.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 8434.252000 94.121000 8425.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 8434.252000 99.899000 8425.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 8434.252000 105.218000 8425.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 8434.252000 109.502000 8425.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 8434.252000 115.649000 8425.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 8434.252000 122.327000 8425.252000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 8434.252000 127.718000 8425.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 8434.252000 132.002000 8425.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 8434.252000 138.149000 8425.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 8434.252000 145.205000 8425.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 8434.252000 150.992000 8425.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 8434.252000 156.311000 8425.252000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 8434.252000 159.253000 8425.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8423.752000 82.394000 8414.752000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 8423.752000 86.705000 8414.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 8423.752000 91.322000 8414.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 8423.752000 94.913000 8414.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 8423.752000 98.054000 8414.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 8423.752000 102.014000 8414.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 8423.752000 104.876000 8414.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 8423.752000 113.435000 8414.752000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 8423.752000 118.718000 8414.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 8423.752000 121.949000 8414.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 8423.752000 125.063000 8414.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 8423.752000 130.886000 8414.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 8423.752000 134.045000 8414.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 8423.752000 138.005000 8414.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 8423.752000 143.792000 8414.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 8423.752000 149.111000 8414.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 8423.752000 151.964000 8414.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 8423.752000 156.293000 8414.752000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 8423.752000 159.153000 8414.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8413.252000 79.271000 8404.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 8413.252000 82.169000 8404.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 8413.252000 85.526000 8404.252000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 8413.252000 90.818000 8404.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 8413.252000 94.454000 8404.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 8413.252000 99.008000 8404.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 8413.252000 104.318000 8404.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 8413.252000 110.096000 8404.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 8413.252000 115.856000 8404.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 8413.252000 119.546000 8404.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 8413.252000 124.001000 8404.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 8413.252000 129.509000 8404.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 8413.252000 133.145000 8404.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 8413.252000 139.751000 8404.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 8413.252000 145.205000 8404.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 8413.252000 148.841000 8404.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 8413.252000 152.657000 8404.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 8413.252000 156.293000 8404.252000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 8413.252000 159.253000 8404.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8402.752000 84.095000 8393.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 8402.752000 88.406000 8393.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 8402.752000 93.824000 8393.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 8402.752000 99.602000 8393.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 8402.752000 105.362000 8393.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 8402.752000 108.422000 8393.752000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 8402.752000 116.747000 8393.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 8402.752000 129.275000 8393.752000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 8402.752000 135.089000 8393.752000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 8402.752000 138.698000 8393.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 8402.752000 141.560000 8393.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 8402.752000 146.906000 8393.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 8402.752000 151.190000 8393.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 8402.752000 156.266000 8393.752000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 8402.752000 159.253000 8393.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8392.252000 82.196000 8383.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 8392.252000 87.560000 8383.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 8392.252000 92.213000 8383.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 8392.252000 96.551000 8383.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 8392.252000 101.708000 8383.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 8392.252000 107.216000 8383.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 8392.252000 111.653000 8383.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 8392.252000 118.961000 8383.252000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 8392.252000 124.316000 8383.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 8392.252000 128.654000 8383.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 8392.252000 133.172000 8383.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 8392.252000 138.995000 8383.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 8392.252000 143.612000 8383.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 8392.252000 148.913000 8383.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 8392.252000 153.197000 8383.252000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 8392.252000 156.333000 8383.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8381.752000 80.009000 8372.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 8381.752000 85.319000 8372.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 8381.752000 91.061000 8372.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 8381.752000 100.052000 8372.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 8381.752000 113.993000 8372.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 8381.752000 116.873000 8372.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 8381.752000 120.410000 8372.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 8381.752000 126.296000 8372.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 8381.752000 135.350000 8372.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 8381.752000 145.106000 8372.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 8381.752000 150.893000 8372.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 8381.752000 156.212000 8372.752000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 8381.752000 159.253000 8372.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8371.252000 82.196000 8362.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 8371.252000 87.560000 8362.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 8371.252000 93.392000 8362.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 8371.252000 99.152000 8362.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 8371.252000 101.960000 8362.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 8371.252000 107.306000 8362.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 8371.252000 111.905000 8362.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 8371.252000 115.640000 8362.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 8371.252000 122.444000 8362.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 8371.252000 127.898000 8362.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 8371.252000 135.575000 8362.252000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 8371.252000 141.380000 8362.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 8371.252000 145.241000 8362.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 8371.252000 150.803000 8362.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 8371.252000 156.302000 8362.252000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 8371.252000 159.253000 8362.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8360.752000 80.009000 8351.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 8360.752000 85.796000 8351.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 8360.752000 91.115000 8351.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 8360.752000 95.399000 8351.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 8360.752000 100.718000 8351.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 8360.752000 107.054000 8351.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 8360.752000 118.097000 8351.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 8360.752000 123.524000 8351.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 8360.752000 129.401000 8351.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 8360.752000 131.768000 8351.752000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 8360.752000 135.413000 8351.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 8360.752000 141.659000 8351.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 8360.752000 150.965000 8351.752000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 8360.752000 156.320000 8351.752000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 8360.752000 159.253000 8351.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8350.252000 81.017000 8341.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 8350.252000 84.608000 8341.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 8350.252000 89.963000 8341.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 8350.252000 92.870000 8341.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 8350.252000 98.693000 8341.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 8350.252000 103.310000 8341.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 8350.252000 107.243000 8341.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 8350.252000 116.081000 8341.252000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 8350.252000 121.886000 8341.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 8350.252000 127.205000 8341.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 8350.252000 132.983000 8341.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 8350.252000 136.943000 8341.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 8350.252000 143.846000 8341.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 8350.252000 148.184000 8341.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 8350.252000 153.260000 8341.252000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 8350.252000 156.433000 8341.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 8339.752000 79.271000 8330.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 8339.752000 85.094000 8330.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 8339.752000 90.854000 8330.752000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 8339.752000 93.653000 8330.752000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 8324.900000 0 72.100000 8324.900000 0 72.100000 8486.100000 0 72.000000 8486.100000 0 72.000000 8324.900000 0
+eoFillPath subpath 1 160.500000 8324.900000 0 160.600000 8324.900000 0 160.600000 8486.100000 0 160.500000 8486.100000 0 160.500000 8324.900000 0
+eoFillPath subpath 1 72.000000 8486.000000 0 160.600000 8486.000000 0 160.600000 8486.100000 0 72.000000 8486.100000 0 72.000000 8486.000000 0
+eoFillPath subpath 1 72.000000 8324.900000 0 160.600000 8324.900000 0 160.600000 8325.000000 0 72.000000 8325.000000 0 72.000000 8324.900000 0
+saveState
+eoClipPath subpath 1 108.000000 7837.500000 0 178.900000 7837.500000 0 178.900000 7894.200000 0 108.000000 7894.200000 0 108.000000 7837.500000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -704560.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 3779.200000 0 165.500000 3779.200000 0 165.500000 3784.200000 0 76.900000 3784.200000 0 76.900000 3779.200000 0
+eoFillPath subpath 1 160.500000 3784.100000 0 165.500000 3784.100000 0 165.500000 3892.900000 0 160.500000 3892.900000 0 160.500000 3784.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 3784.200000 0 160.500000 3784.200000 0 160.500000 3897.800000 0 72.000000 3897.800000 0 72.000000 3784.200000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3893.452000 83.771000 3884.452000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 3893.452000 89.594000 3884.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 3893.452000 92.465000 3884.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 3893.452000 97.568000 3884.452000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 3893.452000 100.943000 3884.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 3893.452000 106.955000 3884.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 3893.452000 110.447000 3884.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 3893.452000 114.425000 3884.452000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 3893.452000 119.717000 3884.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 3893.452000 127.493000 3884.452000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 3893.452000 130.949000 3884.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 3893.452000 136.574000 3884.452000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 3893.452000 141.920000 3884.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 3893.452000 147.365000 3884.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 3893.452000 151.703000 3884.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 3893.452000 156.320000 3884.452000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 3893.452000 159.153000 3884.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3882.952000 81.764000 3873.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 3882.952000 85.130000 3873.952000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 3882.952000 88.712000 3873.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 3882.952000 94.022000 3873.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 3882.952000 98.306000 3873.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 3882.952000 102.455000 3873.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 3882.952000 106.676000 3873.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 3882.952000 110.312000 3873.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 3882.952000 114.920000 3873.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 3882.952000 119.060000 3873.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 3882.952000 125.450000 3873.952000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 3882.952000 130.832000 3873.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 3882.952000 139.445000 3873.952000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 3882.952000 145.169000 3873.952000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 3882.952000 148.076000 3873.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 3882.952000 153.323000 3873.952000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 3882.952000 156.433000 3873.952000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3872.452000 80.009000 3863.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 3872.452000 82.871000 3863.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 3872.452000 88.316000 3863.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 3872.452000 94.094000 3863.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 3872.452000 96.947000 3863.452000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 3872.452000 104.948000 3863.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 3872.452000 113.705000 3863.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 3872.452000 119.492000 3863.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 3872.452000 124.811000 3863.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 3872.452000 132.848000 3863.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 3872.452000 141.605000 3863.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 3872.452000 144.467000 3863.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 3872.452000 148.103000 3863.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 3872.452000 150.965000 3863.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 3872.452000 156.311000 3863.452000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3872.452000 159.253000 3863.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3861.952000 80.999000 3852.952000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 3861.952000 90.539000 3852.952000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 3861.952000 95.318000 3852.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 3861.952000 99.602000 3852.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 3861.952000 102.473000 3852.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 3861.952000 108.260000 3852.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 3861.952000 110.762000 3852.952000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 3861.952000 115.316000 3852.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 3861.952000 122.156000 3852.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 3861.952000 132.299000 3852.952000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 3861.952000 136.970000 3852.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 3861.952000 139.877000 3852.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 3861.952000 142.775000 3852.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 3861.952000 148.022000 3852.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 3861.952000 152.720000 3852.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 3861.952000 156.311000 3852.952000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3861.952000 159.253000 3852.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3851.452000 83.006000 3842.452000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 3851.452000 88.793000 3842.452000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 3851.452000 91.664000 3842.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 3851.452000 94.562000 3842.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 3851.452000 100.349000 3842.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 3851.452000 103.157000 3842.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 3851.452000 108.980000 3842.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 3851.452000 114.740000 3842.452000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 3851.452000 119.375000 3842.452000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 3851.452000 128.033000 3842.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 3851.452000 141.479000 3842.452000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 3851.452000 146.807000 3842.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 3851.452000 152.684000 3842.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 3851.452000 156.293000 3842.452000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3851.452000 159.253000 3842.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3840.952000 79.730000 3831.952000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 3840.952000 84.005000 3831.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 3840.952000 89.423000 3831.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 3840.952000 98.036000 3831.952000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 3840.952000 121.157000 3831.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 3840.952000 145.115000 3831.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 3840.952000 151.001000 3831.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 3840.952000 156.320000 3831.952000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 3840.952000 159.253000 3831.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3830.452000 83.285000 3821.452000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 3830.452000 89.099000 3821.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 3830.452000 93.401000 3821.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 3830.452000 98.477000 3821.452000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 3830.452000 103.121000 3821.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 3830.452000 105.974000 3821.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 3830.452000 111.320000 3821.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 3830.452000 115.604000 3821.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 3830.452000 123.857000 3821.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 3830.452000 136.007000 3821.452000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 3830.452000 141.794000 3821.452000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 3830.452000 144.665000 3821.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 3830.452000 147.464000 3821.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 3830.452000 153.251000 3821.452000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 3830.452000 156.433000 3821.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3819.952000 79.271000 3810.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 3819.952000 85.094000 3810.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 3819.952000 90.854000 3810.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 3819.952000 96.146000 3810.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 3819.952000 102.302000 3810.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 3819.952000 107.711000 3810.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 3819.952000 113.048000 3810.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 3819.952000 119.204000 3810.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 3819.952000 124.991000 3810.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 3819.952000 130.310000 3810.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 3819.952000 135.647000 3810.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 3819.952000 144.755000 3810.952000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 3819.952000 153.323000 3810.952000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 3819.952000 156.333000 3810.952000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3809.452000 82.160000 3800.452000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 3809.452000 85.067000 3800.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 3809.452000 89.297000 3800.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 3809.452000 94.616000 3800.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 3809.452000 98.747000 3800.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 3809.452000 106.055000 3800.452000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 3809.452000 109.700000 3800.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 3809.452000 115.055000 3800.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 3809.452000 118.601000 3800.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 3809.452000 124.010000 3800.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 3809.452000 128.042000 3800.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 3809.452000 135.998000 3800.452000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 3809.452000 141.785000 3800.452000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 3809.452000 144.656000 3800.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 3809.452000 147.554000 3800.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 3809.452000 153.341000 3800.452000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 3809.452000 156.433000 3800.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 3798.952000 79.271000 3789.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 3798.952000 85.094000 3789.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 3798.952000 90.854000 3789.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 3798.952000 93.743000 3789.952000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 3784.100000 0 72.100000 3784.100000 0 72.100000 3897.800000 0 72.000000 3897.800000 0 72.000000 3784.100000 0
+eoFillPath subpath 1 160.500000 3784.100000 0 160.600000 3784.100000 0 160.600000 3897.800000 0 160.500000 3897.800000 0 160.500000 3784.100000 0
+eoFillPath subpath 1 72.000000 3897.700000 0 160.600000 3897.700000 0 160.600000 3897.800000 0 72.000000 3897.800000 0 72.000000 3897.700000 0
+eoFillPath subpath 1 72.000000 3784.100000 0 160.600000 3784.100000 0 160.600000 3784.200000 0 72.000000 3784.200000 0 72.000000 3784.100000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 9973.600000 0 169.600000 9973.600000 0 169.600000 9978.600000 0 76.900000 9978.600000 0 76.900000 9973.600000 0
+eoFillPath subpath 1 164.600000 9978.500000 0 169.600000 9978.500000 0 169.600000 10094.100000 0 164.600000 10094.100000 0 164.600000 9978.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 9978.600000 0 121.400000 9978.600000 0 121.400000 10099.000000 0 72.000000 10099.000000 0 72.000000 9978.600000 0
+saveState
+eoClipPath subpath 1 72.000000 9978.500000 0 164.600000 9978.500000 0 164.600000 10098.900000 0 72.000000 10098.900000 0 72.000000 9978.500000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -912830.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 10048.500000 0 93.700000 10048.500000 0 93.700000 10067.700000 0 72.000000 10067.700000 0 72.000000 10048.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 10048.500000 0 169.600000 10048.500000 0 169.600000 10067.700000 0 93.700000 10067.700000 0 93.700000 10048.500000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 10031.800000 0 93.700000 10031.800000 0 93.700000 10048.500000 0 72.000000 10048.500000 0 72.000000 10031.800000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 10031.800000 0 169.600000 10031.800000 0 169.600000 10048.500000 0 93.700000 10048.500000 0 93.700000 10031.800000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 10012.600000 0 93.700000 10012.600000 0 93.700000 10031.800000 0 72.000000 10031.800000 0 72.000000 10012.600000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 10012.600000 0 169.600000 10012.600000 0 169.600000 10031.800000 0 93.700000 10031.800000 0 93.700000 10012.600000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 9993.400000 0 93.700000 9993.400000 0 93.700000 10012.600000 0 72.000000 10012.600000 0 72.000000 9993.400000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 9993.400000 0 169.600000 9993.400000 0 169.600000 10012.600000 0 93.700000 10012.600000 0 93.700000 9993.400000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10094.652000 82.898000 10085.652000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 10094.652000 87.200000 10085.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 10094.652000 90.809000 10085.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 10094.652000 93.671000 10085.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 10094.652000 98.315000 10085.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 10094.652000 101.906000 10085.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 10094.652000 106.514000 10085.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 10094.652000 109.754000 10085.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 10094.652000 112.868000 10085.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 10094.652000 118.691000 10085.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 10094.652000 121.850000 10085.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 10094.652000 125.702000 10085.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 10094.652000 131.588000 10085.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 10094.652000 136.907000 10085.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 10094.652000 140.039000 10085.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 10094.652000 146.078000 10085.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 10094.652000 151.442000 10085.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 10094.652000 154.349000 10085.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 10094.652000 157.148000 10085.652000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 10094.652000 160.433000 10085.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10084.152000 84.095000 10075.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 10084.152000 89.468000 10075.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 10084.152000 94.580000 10075.152000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 10084.152000 97.631000 10075.152000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 10063.752000 104.443000 10054.752000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 10063.752000 109.060000 10054.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 10063.752000 113.398000 10054.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 10063.752000 119.194000 10054.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 10063.752000 124.612000 10054.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 10063.752000 127.465000 10054.752000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 10047.052000 101.176000 10038.052000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 10047.052000 104.074000 10038.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 10047.052000 109.420000 10038.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 10047.052000 114.442000 10038.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 10047.052000 120.202000 10038.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 10047.052000 123.811000 10038.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 10047.052000 129.121000 10038.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 10047.052000 134.899000 10038.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 10047.052000 139.516000 10038.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 10047.052000 143.107000 10038.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 10047.052000 148.417000 10038.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 10047.052000 151.270000 10038.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 10047.052000 157.093000 10038.052000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 10030.352000 103.048000 10021.352000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 10030.352000 108.421000 10021.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 10030.352000 113.443000 10021.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 10030.352000 118.852000 10021.352000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 10030.352000 124.702000 10021.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 10030.352000 130.021000 10021.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 10030.352000 135.079000 10021.352000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 10011.152000 104.407000 10002.152000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 10011.152000 109.816000 10002.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 10011.152000 115.594000 10002.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 10011.152000 121.354000 10002.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 10011.152000 125.692000 10002.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 10011.152000 128.563000 10002.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 10011.152000 133.954000 10002.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 10011.152000 139.786000 10002.152000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 9978.500000 0 72.100000 9978.500000 0 72.100000 10099.000000 0 72.000000 10099.000000 0 72.000000 9978.500000 0
+eoFillPath subpath 1 164.600000 9978.500000 0 164.700000 9978.500000 0 164.700000 10099.000000 0 164.600000 10099.000000 0 164.600000 9978.500000 0
+eoFillPath subpath 1 72.000000 10098.900000 0 164.700000 10098.900000 0 164.700000 10099.000000 0 72.000000 10099.000000 0 72.000000 10098.900000 0
+eoFillPath subpath 1 72.000000 9978.500000 0 164.700000 9978.500000 0 164.700000 9978.600000 0 72.000000 9978.600000 0 72.000000 9978.500000 0
+eoFillPath subpath 1 91.300000 9993.400000 0 93.700000 9993.400000 0 93.700000 10067.700000 0 91.300000 10067.700000 0 91.300000 9993.400000 0
+eoFillPath subpath 1 72.000000 10012.600000 0 169.600000 10012.600000 0 169.600000 10015.000000 0 72.000000 10015.000000 0 72.000000 10012.600000 0
+eoFillPath subpath 1 72.000000 10065.300000 0 169.600000 10065.300000 0 169.600000 10067.700000 0 72.000000 10067.700000 0 72.000000 10065.300000 0
+eoFillPath subpath 1 72.000000 9993.400000 0 169.600000 9993.400000 0 169.600000 9995.800000 0 72.000000 9995.800000 0 72.000000 9993.400000 0
+saveState
+eoClipPath subpath 1 108.000000 2127.400000 0 150.800000 2127.400000 0 150.800000 2171.700000 0 108.000000 2171.700000 0 108.000000 2127.400000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 -133550.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 1277.500000 0 499.600000 1277.500000 0 499.600000 1282.600000 0 186.800000 1282.600000 0 186.800000 1277.500000 0
+eoFillPath subpath 1 494.500000 1282.500000 0 499.600000 1282.500000 0 499.600000 1470.900000 0 494.500000 1470.900000 0 494.500000 1282.500000 0
+saveState
+eoClipPath subpath 1 181.800000 1282.500000 0 494.500000 1282.500000 0 494.500000 1475.800000 0 181.800000 1475.800000 0 181.800000 1282.500000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 1475.900000 0 494.500000 1475.900000 0 494.500000 1475.900000 0 181.700000 1475.900000 0
+eoFillPath subpath 1 181.700000 1475.900000 0 494.500000 1475.900000 0 494.500000 1475.100000 0 181.700000 1475.100000 0 181.700000 1475.900000 0
+eoFillPath subpath 1 181.700000 1475.100000 0 494.500000 1475.100000 0 494.500000 1474.400000 0 181.700000 1474.400000 0 181.700000 1475.100000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 1474.400000 0 494.500000 1474.400000 0 494.500000 1473.600000 0 181.700000 1473.600000 0 181.700000 1474.400000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 1473.600000 0 494.500000 1473.600000 0 494.500000 1472.800000 0 181.700000 1472.800000 0 181.700000 1473.600000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 1472.800000 0 494.500000 1472.800000 0 494.500000 1472.100000 0 181.700000 1472.100000 0 181.700000 1472.800000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 1472.100000 0 494.500000 1472.100000 0 494.500000 1471.300000 0 181.700000 1471.300000 0 181.700000 1472.100000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 1471.300000 0 494.500000 1471.300000 0 494.500000 1470.600000 0 181.700000 1470.600000 0 181.700000 1471.300000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 1470.600000 0 494.500000 1470.600000 0 494.500000 1469.800000 0 181.700000 1469.800000 0 181.700000 1470.600000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 1469.800000 0 494.500000 1469.800000 0 494.500000 1469.100000 0 181.700000 1469.100000 0 181.700000 1469.800000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 1469.100000 0 494.500000 1469.100000 0 494.500000 1468.300000 0 181.700000 1468.300000 0 181.700000 1469.100000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 1468.300000 0 494.500000 1468.300000 0 494.500000 1467.500000 0 181.700000 1467.500000 0 181.700000 1468.300000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 1467.500000 0 494.500000 1467.500000 0 494.500000 1466.800000 0 181.700000 1466.800000 0 181.700000 1467.500000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 1466.800000 0 494.500000 1466.800000 0 494.500000 1466.000000 0 181.700000 1466.000000 0 181.700000 1466.800000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 1466.000000 0 494.500000 1466.000000 0 494.500000 1465.300000 0 181.700000 1465.300000 0 181.700000 1466.000000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 1465.300000 0 494.500000 1465.300000 0 494.500000 1464.500000 0 181.700000 1464.500000 0 181.700000 1465.300000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 1464.500000 0 494.500000 1464.500000 0 494.500000 1463.700000 0 181.700000 1463.700000 0 181.700000 1464.500000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 1463.700000 0 494.500000 1463.700000 0 494.500000 1463.000000 0 181.700000 1463.000000 0 181.700000 1463.700000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 1463.000000 0 494.500000 1463.000000 0 494.500000 1462.200000 0 181.700000 1462.200000 0 181.700000 1463.000000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 1462.200000 0 494.500000 1462.200000 0 494.500000 1461.500000 0 181.700000 1461.500000 0 181.700000 1462.200000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 1461.500000 0 494.500000 1461.500000 0 494.500000 1460.700000 0 181.700000 1460.700000 0 181.700000 1461.500000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 1460.700000 0 494.500000 1460.700000 0 494.500000 1459.900000 0 181.700000 1459.900000 0 181.700000 1460.700000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 1459.900000 0 494.500000 1459.900000 0 494.500000 1459.200000 0 181.700000 1459.200000 0 181.700000 1459.900000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 1459.200000 0 494.500000 1459.200000 0 494.500000 1458.400000 0 181.700000 1458.400000 0 181.700000 1459.200000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 1458.400000 0 494.500000 1458.400000 0 494.500000 1457.700000 0 181.700000 1457.700000 0 181.700000 1458.400000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 1457.700000 0 494.500000 1457.700000 0 494.500000 1456.900000 0 181.700000 1456.900000 0 181.700000 1457.700000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 1456.900000 0 494.500000 1456.900000 0 494.500000 1456.200000 0 181.700000 1456.200000 0 181.700000 1456.900000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 1456.200000 0 494.500000 1456.200000 0 494.500000 1455.400000 0 181.700000 1455.400000 0 181.700000 1456.200000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 1455.400000 0 494.500000 1455.400000 0 494.500000 1454.600000 0 181.700000 1454.600000 0 181.700000 1455.400000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 1454.600000 0 494.500000 1454.600000 0 494.500000 1453.900000 0 181.700000 1453.900000 0 181.700000 1454.600000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 1453.900000 0 494.500000 1453.900000 0 494.500000 1453.100000 0 181.700000 1453.100000 0 181.700000 1453.900000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 1453.100000 0 494.500000 1453.100000 0 494.500000 1452.400000 0 181.700000 1452.400000 0 181.700000 1453.100000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 1452.400000 0 494.500000 1452.400000 0 494.500000 1451.600000 0 181.700000 1451.600000 0 181.700000 1452.400000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 1451.600000 0 494.500000 1451.600000 0 494.500000 1450.800000 0 181.700000 1450.800000 0 181.700000 1451.600000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 1450.800000 0 494.500000 1450.800000 0 494.500000 1450.100000 0 181.700000 1450.100000 0 181.700000 1450.800000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 1450.100000 0 494.500000 1450.100000 0 494.500000 1449.300000 0 181.700000 1449.300000 0 181.700000 1450.100000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 1449.300000 0 494.500000 1449.300000 0 494.500000 1448.600000 0 181.700000 1448.600000 0 181.700000 1449.300000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 1448.600000 0 494.500000 1448.600000 0 494.500000 1447.800000 0 181.700000 1447.800000 0 181.700000 1448.600000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 1447.800000 0 494.500000 1447.800000 0 494.500000 1447.000000 0 181.700000 1447.000000 0 181.700000 1447.800000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 1447.000000 0 494.500000 1447.000000 0 494.500000 1446.300000 0 181.700000 1446.300000 0 181.700000 1447.000000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 1446.300000 0 494.500000 1446.300000 0 494.500000 1445.500000 0 181.700000 1445.500000 0 181.700000 1446.300000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 1445.500000 0 494.500000 1445.500000 0 494.500000 1444.800000 0 181.700000 1444.800000 0 181.700000 1445.500000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 1444.800000 0 494.500000 1444.800000 0 494.500000 1444.000000 0 181.700000 1444.000000 0 181.700000 1444.800000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 1444.000000 0 494.500000 1444.000000 0 494.500000 1443.300000 0 181.700000 1443.300000 0 181.700000 1444.000000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 1443.300000 0 494.500000 1443.300000 0 494.500000 1442.500000 0 181.700000 1442.500000 0 181.700000 1443.300000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 1442.500000 0 494.500000 1442.500000 0 494.500000 1441.700000 0 181.700000 1441.700000 0 181.700000 1442.500000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 1441.700000 0 494.500000 1441.700000 0 494.500000 1441.000000 0 181.700000 1441.000000 0 181.700000 1441.700000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 1441.000000 0 494.500000 1441.000000 0 494.500000 1440.200000 0 181.700000 1440.200000 0 181.700000 1441.000000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 1440.200000 0 494.500000 1440.200000 0 494.500000 1439.500000 0 181.700000 1439.500000 0 181.700000 1440.200000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 1439.500000 0 494.500000 1439.500000 0 494.500000 1438.700000 0 181.700000 1438.700000 0 181.700000 1439.500000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 1438.700000 0 494.500000 1438.700000 0 494.500000 1437.900000 0 181.700000 1437.900000 0 181.700000 1438.700000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 1437.900000 0 494.500000 1437.900000 0 494.500000 1437.200000 0 181.700000 1437.200000 0 181.700000 1437.900000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 1437.200000 0 494.500000 1437.200000 0 494.500000 1436.400000 0 181.700000 1436.400000 0 181.700000 1437.200000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 1436.400000 0 494.500000 1436.400000 0 494.500000 1435.700000 0 181.700000 1435.700000 0 181.700000 1436.400000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 1435.700000 0 494.500000 1435.700000 0 494.500000 1434.900000 0 181.700000 1434.900000 0 181.700000 1435.700000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 1434.900000 0 494.500000 1434.900000 0 494.500000 1434.100000 0 181.700000 1434.100000 0 181.700000 1434.900000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 1434.100000 0 494.500000 1434.100000 0 494.500000 1433.400000 0 181.700000 1433.400000 0 181.700000 1434.100000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 1433.400000 0 494.500000 1433.400000 0 494.500000 1432.600000 0 181.700000 1432.600000 0 181.700000 1433.400000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 1432.600000 0 494.500000 1432.600000 0 494.500000 1431.900000 0 181.700000 1431.900000 0 181.700000 1432.600000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 1431.900000 0 494.500000 1431.900000 0 494.500000 1431.100000 0 181.700000 1431.100000 0 181.700000 1431.900000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 1431.100000 0 494.500000 1431.100000 0 494.500000 1430.400000 0 181.700000 1430.400000 0 181.700000 1431.100000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 1430.400000 0 494.500000 1430.400000 0 494.500000 1429.600000 0 181.700000 1429.600000 0 181.700000 1430.400000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 1429.600000 0 494.500000 1429.600000 0 494.500000 1428.800000 0 181.700000 1428.800000 0 181.700000 1429.600000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 1428.800000 0 494.500000 1428.800000 0 494.500000 1428.100000 0 181.700000 1428.100000 0 181.700000 1428.800000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 1428.100000 0 494.500000 1428.100000 0 494.500000 1427.300000 0 181.700000 1427.300000 0 181.700000 1428.100000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 1427.300000 0 494.500000 1427.300000 0 494.500000 1426.600000 0 181.700000 1426.600000 0 181.700000 1427.300000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 1426.600000 0 494.500000 1426.600000 0 494.500000 1425.800000 0 181.700000 1425.800000 0 181.700000 1426.600000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 1425.800000 0 494.500000 1425.800000 0 494.500000 1425.000000 0 181.700000 1425.000000 0 181.700000 1425.800000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 1425.000000 0 494.500000 1425.000000 0 494.500000 1424.300000 0 181.700000 1424.300000 0 181.700000 1425.000000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 1424.300000 0 494.500000 1424.300000 0 494.500000 1423.500000 0 181.700000 1423.500000 0 181.700000 1424.300000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 1423.500000 0 494.500000 1423.500000 0 494.500000 1422.800000 0 181.700000 1422.800000 0 181.700000 1423.500000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 1422.800000 0 494.500000 1422.800000 0 494.500000 1422.000000 0 181.700000 1422.000000 0 181.700000 1422.800000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 1422.000000 0 494.500000 1422.000000 0 494.500000 1421.200000 0 181.700000 1421.200000 0 181.700000 1422.000000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 1421.200000 0 494.500000 1421.200000 0 494.500000 1420.500000 0 181.700000 1420.500000 0 181.700000 1421.200000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 1420.500000 0 494.500000 1420.500000 0 494.500000 1419.700000 0 181.700000 1419.700000 0 181.700000 1420.500000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 1419.700000 0 494.500000 1419.700000 0 494.500000 1419.000000 0 181.700000 1419.000000 0 181.700000 1419.700000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 1419.000000 0 494.500000 1419.000000 0 494.500000 1418.200000 0 181.700000 1418.200000 0 181.700000 1419.000000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 1418.200000 0 494.500000 1418.200000 0 494.500000 1417.500000 0 181.700000 1417.500000 0 181.700000 1418.200000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 1417.500000 0 494.500000 1417.500000 0 494.500000 1416.700000 0 181.700000 1416.700000 0 181.700000 1417.500000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 1416.700000 0 494.500000 1416.700000 0 494.500000 1415.900000 0 181.700000 1415.900000 0 181.700000 1416.700000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 1415.900000 0 494.500000 1415.900000 0 494.500000 1415.200000 0 181.700000 1415.200000 0 181.700000 1415.900000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 1415.200000 0 494.500000 1415.200000 0 494.500000 1414.400000 0 181.700000 1414.400000 0 181.700000 1415.200000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 1414.400000 0 494.500000 1414.400000 0 494.500000 1413.700000 0 181.700000 1413.700000 0 181.700000 1414.400000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 1413.700000 0 494.500000 1413.700000 0 494.500000 1412.900000 0 181.700000 1412.900000 0 181.700000 1413.700000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 1412.900000 0 494.500000 1412.900000 0 494.500000 1412.100000 0 181.700000 1412.100000 0 181.700000 1412.900000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 1412.100000 0 494.500000 1412.100000 0 494.500000 1411.400000 0 181.700000 1411.400000 0 181.700000 1412.100000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 1411.400000 0 494.500000 1411.400000 0 494.500000 1410.600000 0 181.700000 1410.600000 0 181.700000 1411.400000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 1410.600000 0 494.500000 1410.600000 0 494.500000 1409.900000 0 181.700000 1409.900000 0 181.700000 1410.600000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 1409.900000 0 494.500000 1409.900000 0 494.500000 1409.100000 0 181.700000 1409.100000 0 181.700000 1409.900000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 1409.100000 0 494.500000 1409.100000 0 494.500000 1408.300000 0 181.700000 1408.300000 0 181.700000 1409.100000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 1408.300000 0 494.500000 1408.300000 0 494.500000 1407.600000 0 181.700000 1407.600000 0 181.700000 1408.300000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 1407.600000 0 494.500000 1407.600000 0 494.500000 1406.800000 0 181.700000 1406.800000 0 181.700000 1407.600000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 1406.800000 0 494.500000 1406.800000 0 494.500000 1406.100000 0 181.700000 1406.100000 0 181.700000 1406.800000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 1406.100000 0 494.500000 1406.100000 0 494.500000 1405.300000 0 181.700000 1405.300000 0 181.700000 1406.100000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 1405.300000 0 494.500000 1405.300000 0 494.500000 1404.600000 0 181.700000 1404.600000 0 181.700000 1405.300000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 1404.600000 0 494.500000 1404.600000 0 494.500000 1403.800000 0 181.700000 1403.800000 0 181.700000 1404.600000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 1403.800000 0 494.500000 1403.800000 0 494.500000 1403.000000 0 181.700000 1403.000000 0 181.700000 1403.800000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 1403.000000 0 494.500000 1403.000000 0 494.500000 1402.300000 0 181.700000 1402.300000 0 181.700000 1403.000000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 1402.300000 0 494.500000 1402.300000 0 494.500000 1401.500000 0 181.700000 1401.500000 0 181.700000 1402.300000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 1401.500000 0 494.500000 1401.500000 0 494.500000 1400.800000 0 181.700000 1400.800000 0 181.700000 1401.500000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 1400.800000 0 494.500000 1400.800000 0 494.500000 1400.000000 0 181.700000 1400.000000 0 181.700000 1400.800000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 1400.000000 0 494.500000 1400.000000 0 494.500000 1399.200000 0 181.700000 1399.200000 0 181.700000 1400.000000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 1399.200000 0 494.500000 1399.200000 0 494.500000 1398.500000 0 181.700000 1398.500000 0 181.700000 1399.200000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 1398.500000 0 494.500000 1398.500000 0 494.500000 1397.700000 0 181.700000 1397.700000 0 181.700000 1398.500000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 1397.700000 0 494.500000 1397.700000 0 494.500000 1397.000000 0 181.700000 1397.000000 0 181.700000 1397.700000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 1397.000000 0 494.500000 1397.000000 0 494.500000 1396.200000 0 181.700000 1396.200000 0 181.700000 1397.000000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 1396.200000 0 494.500000 1396.200000 0 494.500000 1395.400000 0 181.700000 1395.400000 0 181.700000 1396.200000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 1395.400000 0 494.500000 1395.400000 0 494.500000 1394.700000 0 181.700000 1394.700000 0 181.700000 1395.400000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 1394.700000 0 494.500000 1394.700000 0 494.500000 1393.900000 0 181.700000 1393.900000 0 181.700000 1394.700000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 1393.900000 0 494.500000 1393.900000 0 494.500000 1393.200000 0 181.700000 1393.200000 0 181.700000 1393.900000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 1393.200000 0 494.500000 1393.200000 0 494.500000 1392.400000 0 181.700000 1392.400000 0 181.700000 1393.200000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 1392.400000 0 494.500000 1392.400000 0 494.500000 1391.700000 0 181.700000 1391.700000 0 181.700000 1392.400000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 1391.700000 0 494.500000 1391.700000 0 494.500000 1390.900000 0 181.700000 1390.900000 0 181.700000 1391.700000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 1390.900000 0 494.500000 1390.900000 0 494.500000 1390.100000 0 181.700000 1390.100000 0 181.700000 1390.900000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 1390.100000 0 494.500000 1390.100000 0 494.500000 1389.400000 0 181.700000 1389.400000 0 181.700000 1390.100000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 1389.400000 0 494.500000 1389.400000 0 494.500000 1388.600000 0 181.700000 1388.600000 0 181.700000 1389.400000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 1388.600000 0 494.500000 1388.600000 0 494.500000 1387.900000 0 181.700000 1387.900000 0 181.700000 1388.600000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 1387.900000 0 494.500000 1387.900000 0 494.500000 1387.100000 0 181.700000 1387.100000 0 181.700000 1387.900000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 1387.100000 0 494.500000 1387.100000 0 494.500000 1386.300000 0 181.700000 1386.300000 0 181.700000 1387.100000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 1386.300000 0 494.500000 1386.300000 0 494.500000 1385.600000 0 181.700000 1385.600000 0 181.700000 1386.300000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 1385.600000 0 494.500000 1385.600000 0 494.500000 1384.800000 0 181.700000 1384.800000 0 181.700000 1385.600000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 1384.800000 0 494.500000 1384.800000 0 494.500000 1384.100000 0 181.700000 1384.100000 0 181.700000 1384.800000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 1384.100000 0 494.500000 1384.100000 0 494.500000 1383.300000 0 181.700000 1383.300000 0 181.700000 1384.100000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 1383.300000 0 494.500000 1383.300000 0 494.500000 1382.500000 0 181.700000 1382.500000 0 181.700000 1383.300000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 1382.500000 0 494.500000 1382.500000 0 494.500000 1381.800000 0 181.700000 1381.800000 0 181.700000 1382.500000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 1381.800000 0 494.500000 1381.800000 0 494.500000 1381.000000 0 181.700000 1381.000000 0 181.700000 1381.800000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 1381.000000 0 494.500000 1381.000000 0 494.500000 1380.300000 0 181.700000 1380.300000 0 181.700000 1381.000000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 1380.300000 0 494.500000 1380.300000 0 494.500000 1379.500000 0 181.700000 1379.500000 0 181.700000 1380.300000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 1379.500000 0 494.500000 1379.500000 0 494.500000 1378.800000 0 181.700000 1378.800000 0 181.700000 1379.500000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 1378.800000 0 494.500000 1378.800000 0 494.500000 1378.000000 0 181.700000 1378.000000 0 181.700000 1378.800000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 1378.000000 0 494.500000 1378.000000 0 494.500000 1377.200000 0 181.700000 1377.200000 0 181.700000 1378.000000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 1377.200000 0 494.500000 1377.200000 0 494.500000 1376.500000 0 181.700000 1376.500000 0 181.700000 1377.200000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 1376.500000 0 494.500000 1376.500000 0 494.500000 1375.700000 0 181.700000 1375.700000 0 181.700000 1376.500000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 1375.700000 0 494.500000 1375.700000 0 494.500000 1375.000000 0 181.700000 1375.000000 0 181.700000 1375.700000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 1375.000000 0 494.500000 1375.000000 0 494.500000 1374.200000 0 181.700000 1374.200000 0 181.700000 1375.000000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 1374.200000 0 494.500000 1374.200000 0 494.500000 1373.400000 0 181.700000 1373.400000 0 181.700000 1374.200000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 1373.400000 0 494.500000 1373.400000 0 494.500000 1372.700000 0 181.700000 1372.700000 0 181.700000 1373.400000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 1372.700000 0 494.500000 1372.700000 0 494.500000 1371.900000 0 181.700000 1371.900000 0 181.700000 1372.700000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 1371.900000 0 494.500000 1371.900000 0 494.500000 1371.200000 0 181.700000 1371.200000 0 181.700000 1371.900000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 1371.200000 0 494.500000 1371.200000 0 494.500000 1370.400000 0 181.700000 1370.400000 0 181.700000 1371.200000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 1370.400000 0 494.500000 1370.400000 0 494.500000 1369.600000 0 181.700000 1369.600000 0 181.700000 1370.400000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 1369.600000 0 494.500000 1369.600000 0 494.500000 1368.900000 0 181.700000 1368.900000 0 181.700000 1369.600000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 1368.900000 0 494.500000 1368.900000 0 494.500000 1368.100000 0 181.700000 1368.100000 0 181.700000 1368.900000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 1368.100000 0 494.500000 1368.100000 0 494.500000 1367.400000 0 181.700000 1367.400000 0 181.700000 1368.100000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 1367.400000 0 494.500000 1367.400000 0 494.500000 1366.600000 0 181.700000 1366.600000 0 181.700000 1367.400000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 1366.600000 0 494.500000 1366.600000 0 494.500000 1365.900000 0 181.700000 1365.900000 0 181.700000 1366.600000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 1365.900000 0 494.500000 1365.900000 0 494.500000 1365.100000 0 181.700000 1365.100000 0 181.700000 1365.900000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 1365.100000 0 494.500000 1365.100000 0 494.500000 1364.300000 0 181.700000 1364.300000 0 181.700000 1365.100000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 1364.300000 0 494.500000 1364.300000 0 494.500000 1363.600000 0 181.700000 1363.600000 0 181.700000 1364.300000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 1363.600000 0 494.500000 1363.600000 0 494.500000 1362.800000 0 181.700000 1362.800000 0 181.700000 1363.600000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 1362.800000 0 494.500000 1362.800000 0 494.500000 1362.100000 0 181.700000 1362.100000 0 181.700000 1362.800000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 1362.100000 0 494.500000 1362.100000 0 494.500000 1361.300000 0 181.700000 1361.300000 0 181.700000 1362.100000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 1361.300000 0 494.500000 1361.300000 0 494.500000 1360.500000 0 181.700000 1360.500000 0 181.700000 1361.300000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 1360.500000 0 494.500000 1360.500000 0 494.500000 1359.800000 0 181.700000 1359.800000 0 181.700000 1360.500000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 1359.800000 0 494.500000 1359.800000 0 494.500000 1359.000000 0 181.700000 1359.000000 0 181.700000 1359.800000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 1359.000000 0 494.500000 1359.000000 0 494.500000 1358.300000 0 181.700000 1358.300000 0 181.700000 1359.000000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 1358.300000 0 494.500000 1358.300000 0 494.500000 1357.500000 0 181.700000 1357.500000 0 181.700000 1358.300000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 1357.500000 0 494.500000 1357.500000 0 494.500000 1356.700000 0 181.700000 1356.700000 0 181.700000 1357.500000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 1356.700000 0 494.500000 1356.700000 0 494.500000 1356.000000 0 181.700000 1356.000000 0 181.700000 1356.700000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 1356.000000 0 494.500000 1356.000000 0 494.500000 1355.200000 0 181.700000 1355.200000 0 181.700000 1356.000000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 1355.200000 0 494.500000 1355.200000 0 494.500000 1354.500000 0 181.700000 1354.500000 0 181.700000 1355.200000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 1354.500000 0 494.500000 1354.500000 0 494.500000 1353.700000 0 181.700000 1353.700000 0 181.700000 1354.500000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 1353.700000 0 494.500000 1353.700000 0 494.500000 1353.000000 0 181.700000 1353.000000 0 181.700000 1353.700000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 1353.000000 0 494.500000 1353.000000 0 494.500000 1352.200000 0 181.700000 1352.200000 0 181.700000 1353.000000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 1352.200000 0 494.500000 1352.200000 0 494.500000 1351.400000 0 181.700000 1351.400000 0 181.700000 1352.200000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 1351.400000 0 494.500000 1351.400000 0 494.500000 1350.700000 0 181.700000 1350.700000 0 181.700000 1351.400000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 1350.700000 0 494.500000 1350.700000 0 494.500000 1349.900000 0 181.700000 1349.900000 0 181.700000 1350.700000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 1349.900000 0 494.500000 1349.900000 0 494.500000 1349.200000 0 181.700000 1349.200000 0 181.700000 1349.900000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 1349.200000 0 494.500000 1349.200000 0 494.500000 1348.400000 0 181.700000 1348.400000 0 181.700000 1349.200000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 1348.400000 0 494.500000 1348.400000 0 494.500000 1347.600000 0 181.700000 1347.600000 0 181.700000 1348.400000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 1347.600000 0 494.500000 1347.600000 0 494.500000 1346.900000 0 181.700000 1346.900000 0 181.700000 1347.600000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 1346.900000 0 494.500000 1346.900000 0 494.500000 1346.100000 0 181.700000 1346.100000 0 181.700000 1346.900000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 1346.100000 0 494.500000 1346.100000 0 494.500000 1345.400000 0 181.700000 1345.400000 0 181.700000 1346.100000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 1345.400000 0 494.500000 1345.400000 0 494.500000 1344.600000 0 181.700000 1344.600000 0 181.700000 1345.400000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 1344.600000 0 494.500000 1344.600000 0 494.500000 1343.800000 0 181.700000 1343.800000 0 181.700000 1344.600000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 1343.800000 0 494.500000 1343.800000 0 494.500000 1343.100000 0 181.700000 1343.100000 0 181.700000 1343.800000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 1343.100000 0 494.500000 1343.100000 0 494.500000 1342.300000 0 181.700000 1342.300000 0 181.700000 1343.100000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 1342.300000 0 494.500000 1342.300000 0 494.500000 1341.600000 0 181.700000 1341.600000 0 181.700000 1342.300000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 1341.600000 0 494.500000 1341.600000 0 494.500000 1340.800000 0 181.700000 1340.800000 0 181.700000 1341.600000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 1340.800000 0 494.500000 1340.800000 0 494.500000 1340.100000 0 181.700000 1340.100000 0 181.700000 1340.800000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 1340.100000 0 494.500000 1340.100000 0 494.500000 1339.300000 0 181.700000 1339.300000 0 181.700000 1340.100000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 1339.300000 0 494.500000 1339.300000 0 494.500000 1338.500000 0 181.700000 1338.500000 0 181.700000 1339.300000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 1338.500000 0 494.500000 1338.500000 0 494.500000 1337.800000 0 181.700000 1337.800000 0 181.700000 1338.500000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 1337.800000 0 494.500000 1337.800000 0 494.500000 1337.000000 0 181.700000 1337.000000 0 181.700000 1337.800000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 1337.000000 0 494.500000 1337.000000 0 494.500000 1336.300000 0 181.700000 1336.300000 0 181.700000 1337.000000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 1336.300000 0 494.500000 1336.300000 0 494.500000 1335.500000 0 181.700000 1335.500000 0 181.700000 1336.300000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 1335.500000 0 494.500000 1335.500000 0 494.500000 1334.700000 0 181.700000 1334.700000 0 181.700000 1335.500000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 1334.700000 0 494.500000 1334.700000 0 494.500000 1334.000000 0 181.700000 1334.000000 0 181.700000 1334.700000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 1334.000000 0 494.500000 1334.000000 0 494.500000 1333.200000 0 181.700000 1333.200000 0 181.700000 1334.000000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 1333.200000 0 494.500000 1333.200000 0 494.500000 1332.500000 0 181.700000 1332.500000 0 181.700000 1333.200000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 1332.500000 0 494.500000 1332.500000 0 494.500000 1331.700000 0 181.700000 1331.700000 0 181.700000 1332.500000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 1331.700000 0 494.500000 1331.700000 0 494.500000 1331.000000 0 181.700000 1331.000000 0 181.700000 1331.700000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 1331.000000 0 494.500000 1331.000000 0 494.500000 1330.200000 0 181.700000 1330.200000 0 181.700000 1331.000000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 1330.200000 0 494.500000 1330.200000 0 494.500000 1329.400000 0 181.700000 1329.400000 0 181.700000 1330.200000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 1329.400000 0 494.500000 1329.400000 0 494.500000 1328.700000 0 181.700000 1328.700000 0 181.700000 1329.400000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 1328.700000 0 494.500000 1328.700000 0 494.500000 1327.900000 0 181.700000 1327.900000 0 181.700000 1328.700000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 1327.900000 0 494.500000 1327.900000 0 494.500000 1327.200000 0 181.700000 1327.200000 0 181.700000 1327.900000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 1327.200000 0 494.500000 1327.200000 0 494.500000 1326.400000 0 181.700000 1326.400000 0 181.700000 1327.200000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 1326.400000 0 494.500000 1326.400000 0 494.500000 1325.700000 0 181.700000 1325.700000 0 181.700000 1326.400000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 1325.700000 0 494.500000 1325.700000 0 494.500000 1324.900000 0 181.700000 1324.900000 0 181.700000 1325.700000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 1324.900000 0 494.500000 1324.900000 0 494.500000 1324.100000 0 181.700000 1324.100000 0 181.700000 1324.900000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 1324.100000 0 494.500000 1324.100000 0 494.500000 1323.400000 0 181.700000 1323.400000 0 181.700000 1324.100000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 1323.400000 0 494.500000 1323.400000 0 494.500000 1322.600000 0 181.700000 1322.600000 0 181.700000 1323.400000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 1322.600000 0 494.500000 1322.600000 0 494.500000 1321.900000 0 181.700000 1321.900000 0 181.700000 1322.600000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 1321.900000 0 494.500000 1321.900000 0 494.500000 1321.100000 0 181.700000 1321.100000 0 181.700000 1321.900000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 1321.100000 0 494.500000 1321.100000 0 494.500000 1320.300000 0 181.700000 1320.300000 0 181.700000 1321.100000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 1320.300000 0 494.500000 1320.300000 0 494.500000 1319.600000 0 181.700000 1319.600000 0 181.700000 1320.300000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 1319.600000 0 494.500000 1319.600000 0 494.500000 1318.800000 0 181.700000 1318.800000 0 181.700000 1319.600000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 1318.800000 0 494.500000 1318.800000 0 494.500000 1318.100000 0 181.700000 1318.100000 0 181.700000 1318.800000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 1318.100000 0 494.500000 1318.100000 0 494.500000 1317.300000 0 181.700000 1317.300000 0 181.700000 1318.100000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 1317.300000 0 494.500000 1317.300000 0 494.500000 1316.600000 0 181.700000 1316.600000 0 181.700000 1317.300000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 1316.600000 0 494.500000 1316.600000 0 494.500000 1315.800000 0 181.700000 1315.800000 0 181.700000 1316.600000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 1315.800000 0 494.500000 1315.800000 0 494.500000 1315.000000 0 181.700000 1315.000000 0 181.700000 1315.800000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 1315.000000 0 494.500000 1315.000000 0 494.500000 1314.300000 0 181.700000 1314.300000 0 181.700000 1315.000000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 1314.300000 0 494.500000 1314.300000 0 494.500000 1313.500000 0 181.700000 1313.500000 0 181.700000 1314.300000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 1313.500000 0 494.500000 1313.500000 0 494.500000 1312.800000 0 181.700000 1312.800000 0 181.700000 1313.500000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 1312.800000 0 494.500000 1312.800000 0 494.500000 1312.000000 0 181.700000 1312.000000 0 181.700000 1312.800000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 1312.000000 0 494.500000 1312.000000 0 494.500000 1311.300000 0 181.700000 1311.300000 0 181.700000 1312.000000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 1311.300000 0 494.500000 1311.300000 0 494.500000 1310.500000 0 181.700000 1310.500000 0 181.700000 1311.300000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 1310.500000 0 494.500000 1310.500000 0 494.500000 1309.700000 0 181.700000 1309.700000 0 181.700000 1310.500000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 1309.700000 0 494.500000 1309.700000 0 494.500000 1309.000000 0 181.700000 1309.000000 0 181.700000 1309.700000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 1309.000000 0 494.500000 1309.000000 0 494.500000 1308.200000 0 181.700000 1308.200000 0 181.700000 1309.000000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 1308.200000 0 494.500000 1308.200000 0 494.500000 1307.500000 0 181.700000 1307.500000 0 181.700000 1308.200000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 1307.500000 0 494.500000 1307.500000 0 494.500000 1306.700000 0 181.700000 1306.700000 0 181.700000 1307.500000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 1306.700000 0 494.500000 1306.700000 0 494.500000 1305.900000 0 181.700000 1305.900000 0 181.700000 1306.700000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 1305.900000 0 494.500000 1305.900000 0 494.500000 1305.200000 0 181.700000 1305.200000 0 181.700000 1305.900000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 1305.200000 0 494.500000 1305.200000 0 494.500000 1304.400000 0 181.700000 1304.400000 0 181.700000 1305.200000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 1304.400000 0 494.500000 1304.400000 0 494.500000 1303.700000 0 181.700000 1303.700000 0 181.700000 1304.400000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 1303.700000 0 494.500000 1303.700000 0 494.500000 1302.900000 0 181.700000 1302.900000 0 181.700000 1303.700000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 1302.900000 0 494.500000 1302.900000 0 494.500000 1302.100000 0 181.700000 1302.100000 0 181.700000 1302.900000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 1302.100000 0 494.500000 1302.100000 0 494.500000 1301.400000 0 181.700000 1301.400000 0 181.700000 1302.100000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 1301.400000 0 494.500000 1301.400000 0 494.500000 1300.600000 0 181.700000 1300.600000 0 181.700000 1301.400000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 1300.600000 0 494.500000 1300.600000 0 494.500000 1299.900000 0 181.700000 1299.900000 0 181.700000 1300.600000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 1299.900000 0 494.500000 1299.900000 0 494.500000 1299.100000 0 181.700000 1299.100000 0 181.700000 1299.900000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 1299.100000 0 494.500000 1299.100000 0 494.500000 1298.400000 0 181.700000 1298.400000 0 181.700000 1299.100000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 1298.400000 0 494.500000 1298.400000 0 494.500000 1297.600000 0 181.700000 1297.600000 0 181.700000 1298.400000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 1297.600000 0 494.500000 1297.600000 0 494.500000 1296.800000 0 181.700000 1296.800000 0 181.700000 1297.600000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 1296.800000 0 494.500000 1296.800000 0 494.500000 1296.100000 0 181.700000 1296.100000 0 181.700000 1296.800000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 1296.100000 0 494.500000 1296.100000 0 494.500000 1295.300000 0 181.700000 1295.300000 0 181.700000 1296.100000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 1295.300000 0 494.500000 1295.300000 0 494.500000 1294.600000 0 181.700000 1294.600000 0 181.700000 1295.300000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 1294.600000 0 494.500000 1294.600000 0 494.500000 1293.800000 0 181.700000 1293.800000 0 181.700000 1294.600000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 1293.800000 0 494.500000 1293.800000 0 494.500000 1293.000000 0 181.700000 1293.000000 0 181.700000 1293.800000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 1293.000000 0 494.500000 1293.000000 0 494.500000 1292.300000 0 181.700000 1292.300000 0 181.700000 1293.000000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 1292.300000 0 494.500000 1292.300000 0 494.500000 1291.500000 0 181.700000 1291.500000 0 181.700000 1292.300000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 1291.500000 0 494.500000 1291.500000 0 494.500000 1290.800000 0 181.700000 1290.800000 0 181.700000 1291.500000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 1290.800000 0 494.500000 1290.800000 0 494.500000 1290.000000 0 181.700000 1290.000000 0 181.700000 1290.800000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 1290.000000 0 494.500000 1290.000000 0 494.500000 1289.200000 0 181.700000 1289.200000 0 181.700000 1290.000000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 1289.200000 0 494.500000 1289.200000 0 494.500000 1288.500000 0 181.700000 1288.500000 0 181.700000 1289.200000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 1288.500000 0 494.500000 1288.500000 0 494.500000 1287.700000 0 181.700000 1287.700000 0 181.700000 1288.500000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 1287.700000 0 494.500000 1287.700000 0 494.500000 1287.000000 0 181.700000 1287.000000 0 181.700000 1287.700000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 1287.000000 0 494.500000 1287.000000 0 494.500000 1286.200000 0 181.700000 1286.200000 0 181.700000 1287.000000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 1286.200000 0 494.500000 1286.200000 0 494.500000 1285.500000 0 181.700000 1285.500000 0 181.700000 1286.200000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 1285.500000 0 494.500000 1285.500000 0 494.500000 1284.700000 0 181.700000 1284.700000 0 181.700000 1285.500000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 1284.700000 0 494.500000 1284.700000 0 494.500000 1283.900000 0 181.700000 1283.900000 0 181.700000 1284.700000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 1283.900000 0 494.500000 1283.900000 0 494.500000 1283.200000 0 181.700000 1283.200000 0 181.700000 1283.900000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 1283.200000 0 494.500000 1283.200000 0 494.500000 1282.400000 0 181.700000 1282.400000 0 181.700000 1283.200000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 1282.500000 0 181.800000 1282.500000 0 181.800000 1475.800000 0 494.400000 1475.800000 0 494.400000 1282.500000 0 338.100000 1282.500000 0
+strokePath subpath 1 338.100000 1282.500000 0 181.800000 1282.500000 0 181.800000 1475.800000 0 494.400000 1475.800000 0 494.400000 1282.500000 0 338.100000 1282.500000 0
+saveState
+updateCtm 11410.000000 0.000000 0.000000 -8760.000000 20530.000000 -56650.000000
+drawSoftMaskedImage 1142 877 1142 877 JPEG 70955 PPM 3004618
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 1321.524000 215.488000 1313.524000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 1321.524000 220.592000 1313.524000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 1321.524000 225.696000 1313.524000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 1321.524000 230.800000 1313.524000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 1313.924000 241.388000 1305.924000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 1313.924000 246.492000 1305.924000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 1313.924000 251.596000 1305.924000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 1313.924000 256.700000 1305.924000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 1306.224000 267.188000 1298.224000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 1306.224000 272.292000 1298.224000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 1306.224000 277.396000 1298.224000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 1306.224000 282.500000 1298.224000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 1298.624000 293.088000 1290.624000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 1298.624000 298.192000 1290.624000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 1298.624000 303.296000 1290.624000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 1298.624000 308.400000 1290.624000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 1336.524000 202.588000 1328.524000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 1355.824000 201.688000 1347.824000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 1375.124000 195.788000 1367.124000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 1375.124000 200.892000 1367.124000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 1394.424000 194.888000 1386.424000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 1394.424000 199.992000 1386.424000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 1413.824000 193.988000 1405.824000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 1413.824000 199.092000 1405.824000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 1433.124000 193.088000 1425.124000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 1433.124000 198.192000 1425.124000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 1305.224000 330.188000 1297.224000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 1305.224000 332.716000 1297.224000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 1305.224000 337.596000 1297.224000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 1305.224000 341.396000 1297.224000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 1305.224000 346.036000 1297.224000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 1305.224000 350.900000 1297.224000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 1305.224000 355.972000 1297.224000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 1305.224000 359.196000 1297.224000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 1305.224000 362.196000 1297.224000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 1305.224000 367.404000 1297.224000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 1305.224000 371.876000 1297.224000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 1305.224000 375.052000 1297.224000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 1324.724000 361.172000 1316.724000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 1324.724000 364.340000 1316.724000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 1324.724000 367.396000 1316.724000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 1324.724000 372.604000 1316.724000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 1324.724000 379.348000 1316.724000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 1324.724000 384.484000 1316.724000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 1324.724000 389.436000 1316.724000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 1324.724000 392.108000 1316.724000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 1324.724000 395.708000 1316.724000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 1324.724000 397.540000 1316.724000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 1324.724000 402.444000 1316.724000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 1324.724000 406.788000 1316.724000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 1344.224000 392.972000 1336.224000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 1344.224000 398.076000 1336.224000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 1344.224000 403.180000 1336.224000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 1344.224000 405.428000 1336.224000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 1344.224000 410.332000 1336.224000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 1344.224000 414.476000 1336.224000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 1471.892000 305.808000 1457.892000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 1471.892000 314.138000 1457.892000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 1471.892000 320.788000 1457.892000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 1471.892000 328.698000 1457.892000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 1471.892000 336.972000 1457.892000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 1471.892000 344.182000 1457.892000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 1471.892000 349.810000 1457.892000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 1471.892000 354.234000 1457.892000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 1471.892000 362.718000 1457.892000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 1471.892000 367.870000 1457.892000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 1471.892000 372.322000 1457.892000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 1471.892000 382.080000 1457.892000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 1471.892000 388.772000 1457.892000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 1471.892000 397.802000 1457.892000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 1471.892000 402.254000 1457.892000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 1471.892000 407.896000 1457.892000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 1349.000000 0 424.300000 1349.000000 0 424.300000 1409.700000 0 493.600000 1409.700000 0 493.600000 1349.000000 0 458.900000 1349.000000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 1400.100000 0 428.900000 1400.100000 0 428.900000 1406.000000 0 434.800000 1406.000000 0 434.800000 1400.100000 0 431.900000 1400.100000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 1389.000000 0 428.900000 1389.000000 0 428.900000 1395.000000 0 434.800000 1395.000000 0 434.800000 1389.000000 0 431.900000 1389.000000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 1377.900000 0 428.900000 1377.900000 0 428.900000 1383.900000 0 434.800000 1383.900000 0 434.800000 1377.900000 0 431.900000 1377.900000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 1366.800000 0 428.900000 1366.800000 0 428.900000 1372.800000 0 434.800000 1372.800000 0 434.800000 1366.800000 0 431.900000 1366.800000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 1355.700000 0 428.900000 1355.700000 0 428.900000 1361.700000 0 434.800000 1361.700000 0 434.800000 1355.700000 0 431.900000 1355.700000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 1407.124000 443.288000 1399.124000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 1407.124000 445.816000 1399.124000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 1407.124000 450.600000 1399.124000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 1407.124000 454.496000 1399.124000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 1407.124000 459.136000 1399.124000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 1407.124000 464.000000 1399.124000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 1407.124000 468.976000 1399.124000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 1407.124000 472.304000 1399.124000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 1407.124000 475.208000 1399.124000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 1407.124000 480.520000 1399.124000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 1407.124000 484.992000 1399.124000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 1407.124000 488.168000 1399.124000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 1396.124000 443.352000 1388.124000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 1396.124000 447.920000 1388.124000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 1396.124000 452.976000 1388.124000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 1396.124000 457.400000 1388.124000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 1396.124000 462.472000 1388.124000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 1396.124000 465.800000 1388.124000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 1396.124000 468.904000 1388.124000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 1396.124000 473.816000 1388.124000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 1396.124000 478.888000 1388.124000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 1396.124000 482.064000 1388.124000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 1385.024000 442.872000 1377.024000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 1385.024000 446.040000 1377.024000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 1385.024000 448.992000 1377.024000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 1385.024000 454.304000 1377.024000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 1385.024000 461.048000 1377.024000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 1385.024000 466.184000 1377.024000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 1385.024000 471.136000 1377.024000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 1385.024000 473.808000 1377.024000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 1385.024000 477.408000 1377.024000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 1385.024000 479.240000 1377.024000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 1385.024000 484.144000 1377.024000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 1385.024000 488.488000 1377.024000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 1373.924000 443.384000 1365.924000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 1373.924000 448.464000 1365.924000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 1373.924000 453.424000 1365.924000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 1373.924000 456.696000 1365.924000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 1373.924000 459.800000 1365.924000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 1373.924000 462.032000 1365.924000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 1373.924000 466.936000 1365.924000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 1373.924000 471.080000 1365.924000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 1362.824000 443.272000 1354.824000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 1362.824000 448.376000 1354.824000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 1362.824000 453.480000 1354.824000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 1362.824000 455.728000 1354.824000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 1362.824000 460.632000 1354.824000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 1362.824000 464.776000 1354.824000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -1282.200000 0 114.800000 -1282.200000 0 114.800000 -1239.400000 0 72.000000 -1239.400000 0 72.000000 -1282.200000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 207410.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 546.200000 0 504.000000 546.200000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 546.200000 0
+eoFillPath subpath 1 72.000000 72.000000 0 504.000000 72.000000 0 504.000000 245.800000 0 72.000000 245.800000 0 72.000000 72.000000 0
+eoFillPath subpath 1 72.000000 245.800000 0 121.400000 245.800000 0 121.400000 546.200000 0 72.000000 546.200000 0 72.000000 245.800000 0
+eoFillPath subpath 1 454.500000 245.800000 0 504.000000 245.800000 0 504.000000 546.200000 0 454.500000 546.200000 0 454.500000 245.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 72.000000 701.300000 0 504.000000 701.300000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 701.300000 0
+eoFillPath subpath 1 72.000000 72.200000 0 504.000000 72.200000 0 504.000000 86.100000 0 72.000000 86.100000 0 72.000000 72.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 348.500000 719.948000 362.292000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 362.308000 719.948000 371.764000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 371.812000 719.948000 376.884000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 376.916000 719.948000 388.932000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 388.916000 719.948000 398.692000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 398.724000 719.948000 408.852000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 408.820000 719.948000 417.140000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 417.124000 719.948000 426.964000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 426.932000 719.948000 432.004000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 432.036000 719.948000 437.796000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 437.844000 719.948000 442.916000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 442.900000 719.948000 452.100000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 452.100000 719.948000 456.532000 703.948000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 456.500000 719.948000 466.276000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 466.308000 719.948000 479.380000 703.948000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 479.412000 719.948000 489.252000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 489.220000 719.948000 495.796000 703.948000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 495.828000 719.948000 504.148000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 93 1 0 0 0 900.000000 0 FAAAAA+OpenSymbol
+drawChar 186.100000 670.044000 190.987000 661.044000 1.000000 0.000000 0.000000 1.000000 ✳
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 200.300000 672.936000 209.912000 660.936000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 209.900000 672.936000 217.052000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 217.100000 672.936000 225.620000 660.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 225.596000 672.936000 232.820000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 232.796000 672.936000 240.476000 660.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 240.500000 672.936000 244.328000 660.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 244.304000 672.936000 248.132000 660.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 248.108000 672.936000 254.264000 660.936000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 93 1 0 0 0 900.000000 0 FAAAAA+OpenSymbol
+drawChar 186.100000 650.144000 190.987000 641.144000 1.000000 0.000000 0.000000 1.000000 ✳
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 200.300000 653.036000 209.324000 641.036000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 209.300000 653.036000 217.028000 641.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 217.004000 653.036000 224.228000 641.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 224.204000 653.036000 231.884000 641.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 231.908000 653.036000 239.132000 641.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 239.108000 653.036000 246.788000 641.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 246.812000 653.036000 253.904000 641.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 253.916000 653.036000 261.644000 641.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 261.620000 653.036000 269.300000 641.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 269.324000 653.036000 275.060000 641.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 275.024000 653.036000 282.248000 641.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 282.224000 653.036000 289.952000 641.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 289.928000 653.036000 296.084000 641.036000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 93 1 0 0 0 900.000000 0 FAAAAA+OpenSymbol
+drawChar 186.100000 630.244000 190.987000 621.244000 1.000000 0.000000 0.000000 1.000000 ✳
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 200.300000 633.136000 209.480000 621.136000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 209.504000 633.136000 217.232000 621.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 217.208000 633.136000 222.944000 621.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 222.908000 633.136000 229.676000 621.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 229.712000 633.136000 235.868000 621.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 235.916000 633.136000 243.068000 621.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 243.116000 633.136000 250.844000 621.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 250.820000 633.136000 255.632000 621.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 255.620000 633.136000 263.348000 621.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 263.324000 633.136000 270.416000 621.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 270.428000 633.136000 281.804000 621.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 281.828000 633.136000 289.556000 621.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 289.532000 633.136000 300.908000 621.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 300.932000 633.136000 307.088000 621.136000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 595.348000 83.684000 579.348000 1.000000 0.000000 0.000000 1.000000 Y
+drawChar 82.196000 595.348000 92.980000 579.348000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 92.996000 595.348000 100.884000 579.348000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 100.900000 595.348000 112.340000 579.348000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 570.836000 193.492000 558.836000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 193.504000 570.836000 201.232000 558.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 201.208000 570.836000 208.300000 558.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 209.212000 570.836000 213.016000 558.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 213.916000 570.836000 221.596000 558.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 221.620000 570.836000 228.772000 558.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 228.724000 570.836000 235.444000 558.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 235.528000 570.836000 242.788000 558.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 242.728000 570.836000 249.496000 558.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 249.628000 570.836000 256.780000 558.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 256.828000 570.836000 262.564000 558.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 262.432000 570.836000 270.112000 558.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 271.036000 570.836000 274.840000 558.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 275.740000 570.836000 282.964000 558.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 282.940000 570.836000 291.460000 558.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 291.544000 570.836000 298.636000 558.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 298.648000 570.836000 304.384000 558.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 304.444000 570.836000 310.600000 558.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 311.440000 570.836000 315.244000 558.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 316.144000 570.836000 323.296000 558.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 324.244000 570.836000 328.048000 558.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 328.948000 570.836000 336.628000 558.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 336.652000 570.836000 343.876000 558.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 343.852000 570.836000 351.076000 558.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 351.052000 570.836000 358.732000 558.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 359.656000 570.836000 363.460000 558.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 364.360000 570.836000 372.040000 558.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 372.064000 570.836000 379.156000 558.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 379.168000 570.836000 386.320000 558.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 386.272000 570.836000 390.100000 558.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 391.072000 570.836000 394.876000 558.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 395.776000 570.836000 403.000000 558.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 402.976000 570.836000 407.416000 558.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 408.376000 570.836000 412.180000 558.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 413.080000 570.836000 420.760000 558.836000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 420.784000 570.836000 426.520000 558.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 426.484000 570.836000 430.312000 558.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 430.384000 570.836000 437.152000 558.836000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 437.080000 570.836000 444.232000 558.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 444.280000 570.836000 451.000000 558.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 450.976000 570.836000 457.744000 558.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 458.680000 570.836000 462.484000 558.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 463.384000 570.836000 468.196000 558.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 468.184000 570.836000 475.912000 558.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 475.984000 570.836000 483.136000 558.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 483.088000 570.836000 490.816000 558.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 490.792000 570.836000 498.052000 558.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 498.088000 570.836000 504.244000 558.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 570.836000 507.904000 558.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 556.936000 190.312000 544.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 556.936000 197.524000 544.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 197.896000 556.936000 201.700000 544.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 202.192000 556.936000 207.004000 544.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 206.992000 556.936000 214.720000 544.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 214.792000 556.936000 221.884000 544.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 222.196000 556.936000 226.000000 544.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 226.396000 556.936000 231.208000 544.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 231.292000 556.936000 237.028000 544.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 236.992000 556.936000 244.084000 544.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 244.096000 556.936000 251.188000 544.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 251.200000 556.936000 257.356000 544.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 257.704000 556.936000 261.508000 544.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.000000 556.936000 265.828000 544.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 265.804000 556.936000 269.632000 544.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 269.608000 556.936000 277.336000 544.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 277.312000 556.936000 281.140000 544.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 281.212000 556.936000 288.940000 544.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 288.916000 556.936000 296.596000 544.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 297.016000 556.936000 300.820000 544.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 301.216000 556.936000 306.028000 544.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 306.112000 556.936000 313.840000 544.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 313.816000 556.936000 320.908000 544.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 321.316000 556.936000 325.120000 544.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 325.516000 556.936000 331.672000 544.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 331.720000 556.936000 335.548000 544.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 335.524000 556.936000 343.204000 544.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 343.228000 556.936000 350.320000 544.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 350.332000 556.936000 356.488000 544.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 356.836000 556.936000 360.640000 544.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 361.036000 556.936000 368.260000 544.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 368.332000 556.936000 372.772000 544.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 373.132000 556.936000 376.936000 544.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.332000 556.936000 382.144000 544.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 382.228000 556.936000 389.956000 544.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 389.932000 556.936000 397.024000 544.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 397.432000 556.936000 401.236000 544.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 401.632000 556.936000 409.312000 544.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 409.336000 556.936000 415.072000 544.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 415.036000 556.936000 422.260000 544.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 422.236000 556.936000 429.916000 544.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 429.940000 556.936000 437.032000 544.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 437.044000 556.936000 442.780000 544.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 442.840000 556.936000 447.652000 544.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 447.640000 556.936000 454.408000 544.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 452.836000 556.936000 456.640000 544.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.036000 556.936000 460.840000 544.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 461.236000 556.936000 469.900000 544.936000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 469.936000 556.936000 481.312000 544.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 481.240000 556.936000 488.464000 544.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 488.536000 556.936000 496.264000 544.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 496.240000 556.936000 503.920000 544.936000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 556.936000 507.904000 544.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 543.036000 190.312000 531.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 543.036000 198.028000 531.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 198.100000 543.036000 205.192000 531.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 205.204000 543.036000 209.008000 531.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 209.104000 543.036000 213.916000 531.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 214.000000 543.036000 219.736000 531.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 219.604000 543.036000 226.696000 531.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 226.708000 543.036000 233.800000 531.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 233.812000 543.036000 239.968000 531.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 240.112000 543.036000 243.916000 531.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 244.012000 543.036000 247.840000 531.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 247.816000 543.036000 253.972000 531.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 254.020000 543.036000 257.824000 531.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 257.920000 543.036000 265.072000 531.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 265.120000 543.036000 268.948000 531.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 268.924000 543.036000 275.080000 531.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 275.128000 543.036000 282.352000 531.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 282.424000 543.036000 286.228000 531.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 286.324000 543.036000 293.476000 531.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 293.524000 543.036000 297.328000 531.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 297.424000 543.036000 303.580000 531.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 303.520000 543.036000 314.896000 531.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 314.920000 543.036000 322.072000 531.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 322.024000 543.036000 325.852000 531.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 325.924000 543.036000 329.752000 531.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 329.920000 543.036000 333.724000 531.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 334.000000 543.036000 341.992000 531.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 342.004000 543.036000 348.160000 531.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 348.208000 543.036000 355.936000 531.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 355.912000 543.036000 359.716000 531.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 359.812000 543.036000 367.492000 531.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 367.516000 543.036000 374.740000 531.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 374.812000 543.036000 382.540000 531.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 382.408000 543.036000 390.088000 531.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 390.112000 543.036000 393.916000 531.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 394.012000 543.036000 397.816000 531.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.008000 543.036000 405.160000 531.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 405.112000 543.036000 412.840000 531.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 412.816000 543.036000 420.496000 531.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 420.520000 543.036000 424.324000 531.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 424.420000 543.036000 431.644000 531.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 431.716000 543.036000 439.444000 531.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 439.420000 543.036000 446.512000 531.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 446.524000 543.036000 450.328000 531.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 450.520000 543.036000 457.744000 531.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 457.720000 543.036000 462.160000 531.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 462.220000 543.036000 466.024000 531.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 466.120000 543.036000 477.496000 531.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 477.520000 543.036000 484.288000 531.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 484.324000 543.036000 488.128000 531.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 488.320000 543.036000 492.760000 531.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 492.724000 543.036000 499.876000 531.036000 1.000000 0.000000 0.000000 1.000000 a
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 543.036000 504.044000 531.036000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 529.136000 192.268000 517.136000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 192.304000 529.136000 199.528000 517.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 199.504000 529.136000 205.240000 517.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 205.204000 529.136000 209.032000 517.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 209.104000 529.136000 213.916000 517.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 213.904000 529.136000 220.996000 517.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 223.600000 529.136000 227.404000 517.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 230.104000 529.136000 237.784000 517.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 237.808000 529.136000 244.960000 517.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 244.912000 529.136000 251.068000 517.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 251.116000 529.136000 255.928000 517.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 255.916000 529.136000 259.744000 517.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 259.816000 529.136000 271.192000 517.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 271.120000 529.136000 278.212000 517.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 278.224000 529.136000 284.380000 517.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 287.020000 529.136000 290.824000 517.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 293.524000 529.136000 297.352000 517.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 297.328000 529.136000 303.484000 517.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 306.124000 529.136000 309.928000 517.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 312.628000 529.136000 322.888000 517.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 322.924000 529.136000 330.076000 517.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 330.028000 529.136000 334.840000 517.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 334.828000 529.136000 341.548000 517.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.632000 529.136000 349.360000 517.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 349.336000 529.136000 353.164000 517.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 353.140000 529.136000 360.868000 517.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 360.940000 529.136000 368.620000 517.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 371.236000 529.136000 375.040000 517.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 377.740000 529.136000 382.552000 517.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 382.540000 529.136000 390.268000 517.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 390.340000 529.136000 397.432000 517.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 399.940000 529.136000 403.744000 517.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 406.540000 529.136000 414.220000 517.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 414.136000 529.136000 419.872000 517.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 419.836000 529.136000 423.664000 517.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 423.736000 529.136000 431.416000 517.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 431.440000 529.136000 439.168000 517.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 439.144000 529.136000 443.956000 517.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 443.944000 529.136000 447.772000 517.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 447.748000 529.136000 454.516000 517.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 454.648000 529.136000 458.692000 517.136000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 458.752000 529.136000 465.472000 517.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 465.352000 529.136000 472.576000 517.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 472.648000 529.136000 476.476000 517.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 476.452000 529.136000 483.676000 517.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 483.748000 529.136000 489.484000 517.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 489.448000 529.136000 496.540000 517.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 496.552000 529.136000 504.232000 517.136000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 529.136000 508.004000 517.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 515.236000 193.180000 503.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 193.204000 515.236000 200.428000 503.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 200.404000 515.236000 204.232000 503.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 204.208000 515.236000 211.888000 503.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 211.912000 515.236000 219.904000 503.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 219.916000 515.236000 226.072000 503.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 226.120000 515.236000 233.848000 503.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 234.124000 515.236000 237.928000 503.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 238.324000 515.236000 245.476000 503.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 245.524000 515.236000 253.252000 503.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 253.228000 515.236000 260.908000 503.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 261.328000 515.236000 265.132000 503.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 265.528000 515.236000 272.680000 503.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 273.028000 515.236000 276.832000 503.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.228000 515.236000 281.668000 503.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 281.632000 515.236000 288.724000 503.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 288.736000 515.236000 298.996000 503.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 299.440000 515.236000 303.244000 503.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 303.640000 515.236000 309.796000 503.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 309.844000 515.236000 321.220000 503.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 321.148000 515.236000 328.300000 503.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 328.348000 515.236000 332.176000 503.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.152000 515.236000 335.980000 503.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 336.748000 515.236000 340.552000 503.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 340.600000 515.236000 345.412000 503.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 345.400000 515.236000 351.136000 503.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 351.196000 515.236000 358.288000 503.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 358.300000 515.236000 365.392000 503.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 365.404000 515.236000 369.844000 503.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 369.808000 515.236000 375.544000 503.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 375.508000 515.236000 382.732000 503.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 382.804000 515.236000 390.484000 503.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 390.400000 515.236000 396.556000 503.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 396.604000 515.236000 400.408000 503.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.708000 515.236000 404.512000 503.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 404.908000 515.236000 414.520000 503.236000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 414.604000 515.236000 418.432000 503.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 418.408000 515.236000 424.144000 503.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 424.204000 515.236000 431.296000 503.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 431.200000 515.236000 437.920000 503.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 438.004000 515.236000 442.816000 503.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 442.804000 515.236000 446.632000 503.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 446.704000 515.236000 453.472000 503.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 453.808000 515.236000 457.612000 503.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 458.008000 515.236000 461.836000 503.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 461.812000 515.236000 469.540000 503.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 469.912000 515.236000 473.716000 503.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.112000 515.236000 478.552000 503.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 478.516000 515.236000 484.252000 503.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 484.312000 515.236000 491.536000 503.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 491.512000 515.236000 499.240000 503.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 499.216000 515.236000 504.028000 503.236000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 515.236000 507.904000 503.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 501.336000 192.724000 489.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 192.700000 501.336000 197.140000 489.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 197.500000 501.336000 201.304000 489.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 201.700000 501.336000 206.512000 489.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 206.500000 501.336000 214.228000 489.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 214.300000 501.336000 221.392000 489.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 221.704000 501.336000 225.508000 489.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 226.204000 501.336000 230.008000 489.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 230.500000 501.336000 235.312000 489.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 235.300000 501.336000 242.392000 489.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 242.404000 501.336000 248.140000 489.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 248.200000 501.336000 253.936000 489.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 253.900000 501.336000 261.052000 489.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 261.100000 501.336000 267.820000 489.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 267.796000 501.336000 274.888000 489.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 275.200000 501.336000 279.004000 489.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.400000 501.336000 283.228000 489.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 283.204000 501.336000 289.360000 489.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 289.708000 501.336000 293.512000 489.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 294.004000 501.336000 298.816000 489.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 298.804000 501.336000 306.532000 489.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 306.604000 501.336000 313.696000 489.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 314.008000 501.336000 317.812000 489.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 318.208000 501.336000 322.036000 489.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 322.012000 501.336000 329.164000 489.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 329.212000 501.336000 339.472000 489.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 339.508000 501.336000 347.236000 489.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 347.512000 501.336000 351.316000 489.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 351.712000 501.336000 361.972000 489.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 362.008000 501.336000 369.736000 489.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 369.712000 501.336000 376.804000 489.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 376.816000 501.336000 382.552000 489.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 382.516000 501.336000 389.608000 489.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 390.112000 501.336000 393.916000 489.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 394.312000 501.336000 399.052000 489.336000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 399.316000 501.336000 403.120000 489.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 403.516000 501.336000 409.672000 489.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 409.720000 501.336000 416.812000 489.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 416.824000 501.336000 421.636000 489.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 422.020000 501.336000 425.824000 489.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 426.220000 501.336000 433.444000 489.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 433.516000 501.336000 441.244000 489.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 441.220000 501.336000 446.032000 489.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 446.320000 501.336000 450.124000 489.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 450.520000 501.336000 455.332000 489.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 455.416000 501.336000 463.144000 489.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 463.120000 501.336000 470.212000 489.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.620000 501.336000 474.424000 489.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.820000 501.336000 478.648000 489.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 478.624000 501.336000 485.776000 489.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 485.824000 501.336000 496.084000 489.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 496.120000 501.336000 503.848000 489.336000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 501.336000 507.904000 489.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 487.436000 189.940000 475.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 189.904000 487.436000 197.632000 475.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 197.704000 487.436000 203.440000 475.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 203.404000 487.436000 211.132000 475.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 211.108000 487.436000 214.936000 475.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 215.008000 487.436000 219.820000 475.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 219.808000 487.436000 227.536000 475.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 227.512000 487.436000 233.248000 475.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 233.308000 487.436000 240.400000 475.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 240.904000 487.436000 244.708000 475.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 245.308000 487.436000 249.136000 475.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 249.112000 487.436000 256.840000 475.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 257.416000 487.436000 261.220000 475.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 261.916000 487.436000 266.728000 475.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 266.716000 487.436000 274.444000 475.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 274.516000 487.436000 281.608000 475.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 282.016000 487.436000 285.820000 475.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 286.420000 487.436000 292.576000 475.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 292.624000 487.436000 300.352000 475.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 300.328000 487.436000 311.704000 475.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 311.728000 487.436000 323.104000 475.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 323.032000 487.436000 330.124000 475.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 330.136000 487.436000 335.872000 475.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 335.932000 487.436000 340.744000 475.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 340.732000 487.436000 344.560000 475.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 344.536000 487.436000 355.912000 475.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 355.936000 487.436000 363.028000 475.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 363.040000 487.436000 366.844000 475.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.540000 487.436000 371.344000 475.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 371.944000 487.436000 376.684000 475.436000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 377.140000 487.436000 380.944000 475.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 381.544000 487.436000 388.696000 475.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 388.744000 487.436000 392.572000 475.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 392.548000 487.436000 398.704000 475.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 398.752000 487.436000 405.976000 475.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 406.552000 487.436000 410.356000 475.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 410.956000 487.436000 418.684000 475.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 418.660000 487.436000 425.812000 475.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 425.860000 487.436000 432.628000 475.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 432.664000 487.436000 439.756000 475.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 440.260000 487.436000 444.064000 475.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 444.664000 487.436000 451.816000 475.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 452.464000 487.436000 456.268000 475.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 456.868000 487.436000 464.548000 475.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 464.464000 487.436000 470.200000 475.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 470.164000 487.436000 473.992000 475.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 474.064000 487.436000 477.892000 475.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 477.964000 487.436000 481.792000 475.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 482.260000 487.436000 486.064000 475.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 486.664000 487.436000 491.104000 475.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 491.068000 487.436000 498.292000 475.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 498.364000 487.436000 504.100000 475.436000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 487.436000 507.904000 475.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 473.536000 193.180000 461.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 193.204000 473.536000 200.356000 461.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 200.308000 473.536000 206.044000 461.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 206.104000 473.536000 213.784000 461.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 213.808000 473.536000 220.900000 461.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 220.912000 473.536000 227.632000 461.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 227.608000 473.536000 235.336000 461.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 235.312000 473.536000 242.404000 461.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 244.312000 473.536000 248.116000 461.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 250.108000 473.536000 257.788000 461.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 257.812000 473.536000 264.964000 461.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 264.916000 473.536000 270.652000 461.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 270.712000 473.536000 275.524000 461.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 275.512000 473.536000 279.340000 461.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 279.316000 473.536000 286.408000 461.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 286.420000 473.536000 292.576000 461.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 294.616000 473.536000 298.420000 461.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 300.412000 473.536000 307.564000 461.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 307.612000 473.536000 315.340000 461.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 315.316000 473.536000 322.996000 461.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 324.916000 473.536000 328.720000 461.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 330.712000 473.536000 337.864000 461.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 339.916000 473.536000 343.720000 461.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 345.712000 473.536000 352.432000 461.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 352.408000 473.536000 360.136000 461.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 360.112000 473.536000 366.268000 461.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 366.316000 473.536000 371.128000 461.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 371.116000 473.536000 378.340000 461.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 378.412000 473.536000 389.788000 461.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 389.716000 473.536000 393.760000 461.536000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 393.820000 473.536000 401.500000 461.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 401.524000 473.536000 408.616000 461.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 408.628000 473.536000 414.784000 461.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 414.724000 473.536000 418.552000 461.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 418.624000 473.536000 426.304000 461.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 426.220000 473.536000 433.948000 461.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 434.020000 473.536000 441.112000 461.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 441.124000 473.536000 448.804000 461.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 450.628000 473.536000 454.432000 461.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 456.532000 473.536000 463.756000 461.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 463.732000 473.536000 471.460000 461.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 471.532000 473.536000 476.344000 461.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 476.236000 473.536000 483.916000 461.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 483.940000 473.536000 491.164000 461.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 491.140000 473.536000 498.364000 461.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 498.340000 473.536000 504.076000 461.536000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 473.536000 508.004000 461.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 459.636000 193.492000 447.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 193.504000 459.636000 199.240000 447.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 199.204000 459.636000 206.296000 447.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 206.308000 459.636000 213.988000 447.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 214.012000 459.636000 217.840000 447.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 217.816000 459.636000 224.968000 447.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 225.016000 459.636000 231.736000 447.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 231.712000 459.636000 238.804000 447.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 238.816000 459.636000 242.620000 447.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 455.600000 86.136000 463.664000 74.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 463.100000 86.136000 470.252000 74.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 470.300000 86.136000 477.980000 74.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 478.004000 86.136000 485.096000 74.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 485.108000 86.136000 488.912000 74.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 488.900000 86.136000 496.532000 74.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 496.496000 86.136000 504.128000 74.136000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 12389.800000 0 477.900000 12389.800000 0 477.900000 12699.600000 0 134.300000 12699.600000 0 134.300000 12389.800000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -1159790.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 9400.800000 0 168.100000 9400.800000 0 168.100000 9405.800000 0 76.900000 9405.800000 0 76.900000 9400.800000 0
+eoFillPath subpath 1 163.100000 9405.700000 0 168.100000 9405.700000 0 168.100000 9536.300000 0 163.100000 9536.300000 0 163.100000 9405.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 9405.800000 0 163.100000 9405.800000 0 163.100000 9541.200000 0 72.000000 9541.200000 0 72.000000 9405.800000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 9536.880000 87.320000 9526.880000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 9536.880000 93.420000 9526.880000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 9536.880000 97.510000 9526.880000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 9536.880000 101.420000 9526.880000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 9536.880000 104.170000 9526.880000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 9536.880000 110.530000 9526.880000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 9536.880000 113.270000 9526.880000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 9536.880000 116.470000 9526.880000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 9536.880000 123.480000 9526.880000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 9536.880000 129.610000 9526.880000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 9536.880000 135.090000 9526.880000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 9536.880000 140.890000 9526.880000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 9536.880000 144.820000 9526.880000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 9536.880000 150.920000 9526.880000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 9536.880000 153.670000 9526.880000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 9536.880000 156.470000 9526.880000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 9410.000000 0 168.200000 9410.000000 0 168.200000 9525.200000 0 72.000000 9525.200000 0 72.000000 9410.000000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9478.152000 79.253000 9469.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 9478.152000 86.669000 9469.152000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 9478.152000 90.215000 9469.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 9478.152000 93.077000 9469.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 9478.152000 97.406000 9469.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 9478.152000 100.853000 9469.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 9478.152000 107.324000 9469.152000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 9478.152000 112.337000 9469.152000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 9478.152000 115.271000 9469.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 9478.152000 118.655000 9469.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 9478.152000 126.512000 9469.152000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 9478.152000 130.805000 9469.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 9478.152000 135.881000 9469.152000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 9478.152000 139.355000 9469.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 9478.152000 147.284000 9469.152000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 9478.152000 150.074000 9469.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 9478.152000 155.897000 9469.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 9478.152000 158.750000 9469.152000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 9478.152000 161.853000 9469.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9467.652000 82.124000 9458.652000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 9467.652000 87.137000 9458.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 9467.652000 90.071000 9458.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 9467.652000 93.356000 9458.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 9467.652000 100.403000 9458.652000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 9467.652000 104.921000 9458.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 9467.652000 109.205000 9458.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 9467.652000 117.737000 9458.652000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 9467.652000 123.119000 9458.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 9467.652000 128.996000 9458.652000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 9467.652000 132.605000 9458.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 9467.652000 138.392000 9458.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 9467.652000 141.749000 9458.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 9467.652000 149.507000 9458.652000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 9467.652000 153.800000 9458.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 9467.652000 158.876000 9458.652000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 9467.652000 161.853000 9458.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9457.152000 81.764000 9448.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 9457.152000 87.596000 9448.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 9457.152000 93.356000 9448.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 9457.152000 102.050000 9448.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 9457.152000 113.822000 9448.152000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 9457.152000 122.651000 9448.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 9457.152000 134.117000 9448.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 9457.152000 138.401000 9448.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 9457.152000 147.149000 9448.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 9457.152000 158.921000 9448.152000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 9457.152000 161.853000 9448.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9446.652000 79.271000 9437.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 9446.652000 84.338000 9437.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 9446.652000 89.621000 9437.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 9446.652000 94.643000 9437.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 9446.652000 100.502000 9437.652000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 9446.652000 106.262000 9437.652000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 9446.652000 111.518000 9437.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 9446.652000 116.216000 9437.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 9446.652000 119.249000 9437.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 9446.652000 122.363000 9437.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 9446.652000 128.186000 9437.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 9446.652000 131.345000 9437.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 9446.652000 137.060000 9437.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 9446.652000 140.147000 9437.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 9446.652000 145.007000 9437.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 9446.652000 148.598000 9437.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 9446.652000 151.460000 9437.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 9446.652000 155.789000 9437.652000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 9446.652000 158.933000 9437.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9436.152000 80.702000 9427.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 9436.152000 83.573000 9427.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 9436.152000 89.396000 9427.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 9436.152000 95.156000 9427.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 9436.152000 100.547000 9427.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 9436.152000 109.052000 9427.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 9436.152000 111.959000 9427.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 9436.152000 117.251000 9427.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 9436.152000 121.904000 9427.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 9436.152000 126.503000 9427.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 9436.152000 129.338000 9427.152000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 9436.152000 134.936000 9427.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 9436.152000 143.441000 9427.152000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 9436.152000 148.796000 9427.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 9436.152000 154.574000 9427.152000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 9436.152000 158.876000 9427.152000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 9436.152000 161.853000 9427.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9425.652000 79.271000 9416.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 9425.652000 85.094000 9416.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 9425.652000 88.703000 9416.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 9425.652000 94.112000 9416.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 9425.652000 97.244000 9416.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 9425.652000 103.058000 9416.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 9425.652000 108.890000 9416.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 9425.652000 111.950000 9416.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 9425.652000 115.271000 9416.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 9425.652000 120.338000 9416.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 9425.652000 125.621000 9416.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 9425.652000 131.363000 9416.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 9425.652000 134.558000 9416.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 9425.652000 140.048000 9416.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 9425.652000 145.430000 9416.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 9425.652000 150.551000 9416.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 9425.652000 155.960000 9416.652000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 9425.652000 158.933000 9416.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9415.152000 80.009000 9406.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 9415.152000 85.364000 9406.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 9415.152000 88.271000 9406.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 9415.152000 91.169000 9406.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 9415.152000 97.955000 9406.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 9415.152000 107.765000 9406.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 9415.152000 110.672000 9406.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 9415.152000 115.964000 9406.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 9415.152000 120.617000 9406.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 9415.152000 125.216000 9406.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 9415.152000 128.051000 9406.152000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 9415.152000 134.954000 9406.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 9415.152000 146.285000 9406.152000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 9415.152000 151.667000 9406.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 9415.152000 155.906000 9406.152000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 9415.152000 159.033000 9406.152000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 9405.700000 0 72.100000 9405.700000 0 72.100000 9541.200000 0 72.000000 9541.200000 0 72.000000 9405.700000 0
+eoFillPath subpath 1 163.100000 9405.700000 0 163.200000 9405.700000 0 163.200000 9541.200000 0 163.100000 9541.200000 0 163.100000 9405.700000 0
+eoFillPath subpath 1 72.000000 9541.100000 0 163.200000 9541.100000 0 163.200000 9541.200000 0 72.000000 9541.200000 0 72.000000 9541.100000 0
+eoFillPath subpath 1 72.000000 9405.700000 0 163.200000 9405.700000 0 163.200000 9405.800000 0 72.000000 9405.800000 0 72.000000 9405.700000 0
+saveState
+eoClipPath subpath 1 96.900000 9481.000000 0 138.300000 9481.000000 0 138.300000 9525.200000 0 96.900000 9525.200000 0 96.900000 9481.000000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -868910.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 9126.200000 0 165.500000 9126.200000 0 165.500000 9131.200000 0 76.900000 9131.200000 0 76.900000 9126.200000 0
+eoFillPath subpath 1 160.500000 9131.100000 0 165.500000 9131.100000 0 165.500000 9287.400000 0 160.500000 9287.400000 0 160.500000 9131.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 9131.200000 0 121.400000 9131.200000 0 121.400000 9292.300000 0 72.000000 9292.300000 0 72.000000 9131.200000 0
+saveState
+eoClipPath subpath 1 72.000000 9131.100000 0 160.500000 9131.100000 0 160.500000 9292.200000 0 72.000000 9292.200000 0 72.000000 9131.100000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -832210.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 9287.980000 89.280000 9277.980000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 9287.980000 95.630000 9277.980000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 9287.980000 99.520000 9277.980000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 9287.980000 102.270000 9277.980000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 9287.980000 108.450000 9277.980000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 9287.980000 112.610000 9277.980000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 9287.980000 118.510000 9277.980000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 9287.980000 121.670000 9277.980000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 9287.980000 124.470000 9277.980000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 9287.980000 130.830000 9277.980000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 9287.980000 133.970000 9277.980000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 9287.980000 137.920000 9277.980000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 9287.980000 144.230000 9277.980000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 9287.980000 150.350000 9277.980000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 9287.980000 153.570000 9277.980000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 9276.280000 95.000000 9266.280000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 9276.280000 97.770000 9266.280000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 9276.280000 103.000000 9266.280000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 9276.280000 109.330000 9266.280000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 9276.280000 117.470000 9266.280000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 9276.280000 123.620000 9266.280000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 9276.280000 128.800000 9266.280000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 9276.280000 135.130000 9266.280000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 9276.280000 141.250000 9266.280000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 9276.280000 145.410000 9266.280000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9261.452000 82.961000 9252.452000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 9261.452000 87.614000 9252.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 9261.452000 93.356000 9252.452000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 9261.452000 98.612000 9252.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 9261.452000 103.733000 9252.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 9261.452000 106.568000 9252.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 9261.452000 111.959000 9252.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 9261.452000 114.866000 9252.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 9261.452000 117.665000 9252.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 9261.452000 122.768000 9252.452000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 9261.452000 125.747000 9252.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 9261.452000 131.651000 9252.452000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 9261.452000 136.907000 9252.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 9261.452000 142.307000 9252.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 9261.452000 148.049000 9252.452000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 9261.452000 150.956000 9252.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 9261.452000 156.302000 9252.452000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 9261.452000 159.253000 9252.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9250.952000 84.095000 9241.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 9250.952000 89.900000 9241.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 9250.952000 95.318000 9241.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 9250.952000 100.349000 9241.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 9250.952000 110.789000 9241.952000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 9250.952000 111.464000 9241.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 9250.952000 114.362000 9241.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 9250.952000 119.348000 9241.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 9250.952000 126.962000 9241.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 9250.952000 132.047000 9241.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 9250.952000 139.958000 9241.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 9250.952000 142.865000 9241.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 9250.952000 147.410000 9241.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 9250.952000 153.287000 9241.952000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 9250.952000 156.333000 9241.952000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9240.452000 84.095000 9231.452000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 9240.452000 89.468000 9231.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 9240.452000 94.121000 9231.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 9240.452000 99.899000 9231.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 9240.452000 105.218000 9231.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 9240.452000 109.502000 9231.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 9240.452000 115.649000 9231.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 9240.452000 122.327000 9231.452000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 9240.452000 127.718000 9231.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 9240.452000 132.002000 9231.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 9240.452000 138.149000 9231.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 9240.452000 145.205000 9231.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 9240.452000 150.992000 9231.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 9240.452000 156.311000 9231.452000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 9240.452000 159.253000 9231.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9229.952000 82.394000 9220.952000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 9229.952000 86.705000 9220.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 9229.952000 91.322000 9220.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 9229.952000 94.913000 9220.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 9229.952000 98.054000 9220.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 9229.952000 102.014000 9220.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 9229.952000 104.876000 9220.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 9229.952000 113.435000 9220.952000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 9229.952000 118.718000 9220.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 9229.952000 121.949000 9220.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 9229.952000 125.063000 9220.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 9229.952000 130.886000 9220.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 9229.952000 134.045000 9220.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 9229.952000 138.005000 9220.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 9229.952000 143.792000 9220.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 9229.952000 149.111000 9220.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 9229.952000 151.964000 9220.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 9229.952000 156.293000 9220.952000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 9229.952000 159.153000 9220.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9219.452000 79.271000 9210.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 9219.452000 82.169000 9210.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 9219.452000 85.526000 9210.452000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 9219.452000 90.818000 9210.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 9219.452000 94.454000 9210.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 9219.452000 99.008000 9210.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 9219.452000 104.318000 9210.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 9219.452000 110.096000 9210.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 9219.452000 115.856000 9210.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 9219.452000 119.546000 9210.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 9219.452000 124.001000 9210.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 9219.452000 129.509000 9210.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 9219.452000 133.145000 9210.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 9219.452000 139.751000 9210.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 9219.452000 145.205000 9210.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 9219.452000 148.841000 9210.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 9219.452000 152.657000 9210.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 9219.452000 156.293000 9210.452000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 9219.452000 159.253000 9210.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9208.952000 84.095000 9199.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 9208.952000 88.406000 9199.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 9208.952000 93.824000 9199.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 9208.952000 99.602000 9199.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 9208.952000 105.362000 9199.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 9208.952000 108.422000 9199.952000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 9208.952000 116.747000 9199.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 9208.952000 129.275000 9199.952000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 9208.952000 135.089000 9199.952000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 9208.952000 138.698000 9199.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 9208.952000 141.560000 9199.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 9208.952000 146.906000 9199.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 9208.952000 151.190000 9199.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 9208.952000 156.266000 9199.952000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 9208.952000 159.253000 9199.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9198.452000 82.196000 9189.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 9198.452000 87.560000 9189.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 9198.452000 92.213000 9189.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 9198.452000 96.551000 9189.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 9198.452000 101.708000 9189.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 9198.452000 107.216000 9189.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 9198.452000 111.653000 9189.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 9198.452000 118.961000 9189.452000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 9198.452000 124.316000 9189.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 9198.452000 128.654000 9189.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 9198.452000 133.172000 9189.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 9198.452000 138.995000 9189.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 9198.452000 143.612000 9189.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 9198.452000 148.913000 9189.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 9198.452000 153.197000 9189.452000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 9198.452000 156.333000 9189.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9187.952000 80.009000 9178.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 9187.952000 85.319000 9178.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 9187.952000 91.061000 9178.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 9187.952000 100.052000 9178.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 9187.952000 113.993000 9178.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 9187.952000 116.873000 9178.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 9187.952000 120.410000 9178.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 9187.952000 126.296000 9178.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 9187.952000 135.350000 9178.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 9187.952000 145.106000 9178.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 9187.952000 150.893000 9178.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 9187.952000 156.212000 9178.952000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 9187.952000 159.253000 9178.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9177.452000 82.196000 9168.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 9177.452000 87.560000 9168.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 9177.452000 93.392000 9168.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 9177.452000 99.152000 9168.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 9177.452000 101.960000 9168.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 9177.452000 107.306000 9168.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 9177.452000 111.905000 9168.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 9177.452000 115.640000 9168.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 9177.452000 122.444000 9168.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 9177.452000 127.898000 9168.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 9177.452000 135.575000 9168.452000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 9177.452000 141.380000 9168.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 9177.452000 145.241000 9168.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 9177.452000 150.803000 9168.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 9177.452000 156.302000 9168.452000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 9177.452000 159.253000 9168.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9166.952000 80.009000 9157.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 9166.952000 85.796000 9157.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 9166.952000 91.115000 9157.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 9166.952000 95.399000 9157.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 9166.952000 100.718000 9157.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 9166.952000 107.054000 9157.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 9166.952000 118.097000 9157.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 9166.952000 123.524000 9157.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 9166.952000 129.401000 9157.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 9166.952000 131.768000 9157.952000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 9166.952000 135.413000 9157.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 9166.952000 141.659000 9157.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 9166.952000 150.965000 9157.952000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 9166.952000 156.320000 9157.952000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 9166.952000 159.253000 9157.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9156.452000 81.017000 9147.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 9156.452000 84.608000 9147.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 9156.452000 89.963000 9147.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 9156.452000 92.870000 9147.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 9156.452000 98.693000 9147.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 9156.452000 103.310000 9147.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 9156.452000 107.243000 9147.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 9156.452000 116.081000 9147.452000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 9156.452000 121.886000 9147.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 9156.452000 127.205000 9147.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 9156.452000 132.983000 9147.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 9156.452000 136.943000 9147.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 9156.452000 143.846000 9147.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 9156.452000 148.184000 9147.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 9156.452000 153.260000 9147.452000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 9156.452000 156.433000 9147.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9145.952000 79.271000 9136.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 9145.952000 85.094000 9136.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 9145.952000 90.854000 9136.952000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 9145.952000 93.653000 9136.952000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 9131.100000 0 72.100000 9131.100000 0 72.100000 9292.300000 0 72.000000 9292.300000 0 72.000000 9131.100000 0
+eoFillPath subpath 1 160.500000 9131.100000 0 160.600000 9131.100000 0 160.600000 9292.300000 0 160.500000 9292.300000 0 160.500000 9131.100000 0
+eoFillPath subpath 1 72.000000 9292.200000 0 160.600000 9292.200000 0 160.600000 9292.300000 0 72.000000 9292.300000 0 72.000000 9292.200000 0
+eoFillPath subpath 1 72.000000 9131.100000 0 160.600000 9131.100000 0 160.600000 9131.200000 0 72.000000 9131.200000 0 72.000000 9131.100000 0
+saveState
+eoClipPath subpath 1 108.000000 8643.700000 0 178.900000 8643.700000 0 178.900000 8700.400000 0 108.000000 8700.400000 0 108.000000 8643.700000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -785180.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 4585.400000 0 165.500000 4585.400000 0 165.500000 4590.400000 0 76.900000 4590.400000 0 76.900000 4585.400000 0
+eoFillPath subpath 1 160.500000 4590.300000 0 165.500000 4590.300000 0 165.500000 4699.100000 0 160.500000 4699.100000 0 160.500000 4590.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 4590.400000 0 160.500000 4590.400000 0 160.500000 4704.000000 0 72.000000 4704.000000 0 72.000000 4590.400000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4699.652000 83.771000 4690.652000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 4699.652000 89.594000 4690.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 4699.652000 92.465000 4690.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 4699.652000 97.568000 4690.652000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 4699.652000 100.943000 4690.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 4699.652000 106.955000 4690.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 4699.652000 110.447000 4690.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 4699.652000 114.425000 4690.652000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 4699.652000 119.717000 4690.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 4699.652000 127.493000 4690.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 4699.652000 130.949000 4690.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 4699.652000 136.574000 4690.652000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 4699.652000 141.920000 4690.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 4699.652000 147.365000 4690.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 4699.652000 151.703000 4690.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 4699.652000 156.320000 4690.652000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 4699.652000 159.153000 4690.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4689.152000 81.764000 4680.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 4689.152000 85.130000 4680.152000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 4689.152000 88.712000 4680.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 4689.152000 94.022000 4680.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 4689.152000 98.306000 4680.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 4689.152000 102.455000 4680.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 4689.152000 106.676000 4680.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 4689.152000 110.312000 4680.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 4689.152000 114.920000 4680.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 4689.152000 119.060000 4680.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 4689.152000 125.450000 4680.152000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 4689.152000 130.832000 4680.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 4689.152000 139.445000 4680.152000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 4689.152000 145.169000 4680.152000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 4689.152000 148.076000 4680.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 4689.152000 153.323000 4680.152000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 4689.152000 156.433000 4680.152000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4678.652000 80.009000 4669.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 4678.652000 82.871000 4669.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 4678.652000 88.316000 4669.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 4678.652000 94.094000 4669.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 4678.652000 96.947000 4669.652000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 4678.652000 104.948000 4669.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 4678.652000 113.705000 4669.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 4678.652000 119.492000 4669.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 4678.652000 124.811000 4669.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 4678.652000 132.848000 4669.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 4678.652000 141.605000 4669.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 4678.652000 144.467000 4669.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 4678.652000 148.103000 4669.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 4678.652000 150.965000 4669.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 4678.652000 156.311000 4669.652000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 4678.652000 159.253000 4669.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4668.152000 80.999000 4659.152000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 4668.152000 90.539000 4659.152000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 4668.152000 95.318000 4659.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 4668.152000 99.602000 4659.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 4668.152000 102.473000 4659.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 4668.152000 108.260000 4659.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 4668.152000 110.762000 4659.152000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 4668.152000 115.316000 4659.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 4668.152000 122.156000 4659.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 4668.152000 132.299000 4659.152000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 4668.152000 136.970000 4659.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 4668.152000 139.877000 4659.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 4668.152000 142.775000 4659.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 4668.152000 148.022000 4659.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 4668.152000 152.720000 4659.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 4668.152000 156.311000 4659.152000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 4668.152000 159.253000 4659.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4657.652000 83.006000 4648.652000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 4657.652000 88.793000 4648.652000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 4657.652000 91.664000 4648.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 4657.652000 94.562000 4648.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 4657.652000 100.349000 4648.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 4657.652000 103.157000 4648.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 4657.652000 108.980000 4648.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 4657.652000 114.740000 4648.652000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 4657.652000 119.375000 4648.652000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 4657.652000 128.033000 4648.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 4657.652000 141.479000 4648.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 4657.652000 146.807000 4648.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 4657.652000 152.684000 4648.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 4657.652000 156.293000 4648.652000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 4657.652000 159.253000 4648.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4647.152000 79.730000 4638.152000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 4647.152000 84.005000 4638.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 4647.152000 89.423000 4638.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 4647.152000 98.036000 4638.152000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 4647.152000 121.157000 4638.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 4647.152000 145.115000 4638.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 4647.152000 151.001000 4638.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 4647.152000 156.320000 4638.152000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 4647.152000 159.253000 4638.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4636.652000 83.285000 4627.652000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 4636.652000 89.099000 4627.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 4636.652000 93.401000 4627.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 4636.652000 98.477000 4627.652000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 4636.652000 103.121000 4627.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 4636.652000 105.974000 4627.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 4636.652000 111.320000 4627.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 4636.652000 115.604000 4627.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 4636.652000 123.857000 4627.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 4636.652000 136.007000 4627.652000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 4636.652000 141.794000 4627.652000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 4636.652000 144.665000 4627.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 4636.652000 147.464000 4627.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 4636.652000 153.251000 4627.652000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 4636.652000 156.433000 4627.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4626.152000 79.271000 4617.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 4626.152000 85.094000 4617.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 4626.152000 90.854000 4617.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 4626.152000 96.146000 4617.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 4626.152000 102.302000 4617.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 4626.152000 107.711000 4617.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 4626.152000 113.048000 4617.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 4626.152000 119.204000 4617.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 4626.152000 124.991000 4617.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 4626.152000 130.310000 4617.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 4626.152000 135.647000 4617.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 4626.152000 144.755000 4617.152000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 4626.152000 153.323000 4617.152000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 4626.152000 156.333000 4617.152000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4615.652000 82.160000 4606.652000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 4615.652000 85.067000 4606.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 4615.652000 89.297000 4606.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 4615.652000 94.616000 4606.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 4615.652000 98.747000 4606.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 4615.652000 106.055000 4606.652000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 4615.652000 109.700000 4606.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 4615.652000 115.055000 4606.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 4615.652000 118.601000 4606.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 4615.652000 124.010000 4606.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 4615.652000 128.042000 4606.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 4615.652000 135.998000 4606.652000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 4615.652000 141.785000 4606.652000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 4615.652000 144.656000 4606.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 4615.652000 147.554000 4606.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 4615.652000 153.341000 4606.652000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 4615.652000 156.433000 4606.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 4605.152000 79.271000 4596.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 4605.152000 85.094000 4596.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 4605.152000 90.854000 4596.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 4605.152000 93.743000 4596.152000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 4590.300000 0 72.100000 4590.300000 0 72.100000 4704.000000 0 72.000000 4704.000000 0 72.000000 4590.300000 0
+eoFillPath subpath 1 160.500000 4590.300000 0 160.600000 4590.300000 0 160.600000 4704.000000 0 160.500000 4704.000000 0 160.500000 4590.300000 0
+eoFillPath subpath 1 72.000000 4703.900000 0 160.600000 4703.900000 0 160.600000 4704.000000 0 72.000000 4704.000000 0 72.000000 4703.900000 0
+eoFillPath subpath 1 72.000000 4590.300000 0 160.600000 4590.300000 0 160.600000 4590.400000 0 72.000000 4590.400000 0 72.000000 4590.300000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 10779.800000 0 169.600000 10779.800000 0 169.600000 10784.800000 0 76.900000 10784.800000 0 76.900000 10779.800000 0
+eoFillPath subpath 1 164.600000 10784.700000 0 169.600000 10784.700000 0 169.600000 10900.300000 0 164.600000 10900.300000 0 164.600000 10784.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 10784.800000 0 121.400000 10784.800000 0 121.400000 10905.200000 0 72.000000 10905.200000 0 72.000000 10784.800000 0
+saveState
+eoClipPath subpath 1 72.000000 10784.700000 0 164.600000 10784.700000 0 164.600000 10905.100000 0 72.000000 10905.100000 0 72.000000 10784.700000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -993450.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 10854.700000 0 93.700000 10854.700000 0 93.700000 10873.900000 0 72.000000 10873.900000 0 72.000000 10854.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 10854.700000 0 169.600000 10854.700000 0 169.600000 10873.900000 0 93.700000 10873.900000 0 93.700000 10854.700000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 10838.000000 0 93.700000 10838.000000 0 93.700000 10854.700000 0 72.000000 10854.700000 0 72.000000 10838.000000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 10838.000000 0 169.600000 10838.000000 0 169.600000 10854.700000 0 93.700000 10854.700000 0 93.700000 10838.000000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 10818.800000 0 93.700000 10818.800000 0 93.700000 10838.000000 0 72.000000 10838.000000 0 72.000000 10818.800000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 10818.800000 0 169.600000 10818.800000 0 169.600000 10838.000000 0 93.700000 10838.000000 0 93.700000 10818.800000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 10799.600000 0 93.700000 10799.600000 0 93.700000 10818.800000 0 72.000000 10818.800000 0 72.000000 10799.600000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 10799.600000 0 169.600000 10799.600000 0 169.600000 10818.800000 0 93.700000 10818.800000 0 93.700000 10799.600000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10900.852000 82.898000 10891.852000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 10900.852000 87.200000 10891.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 10900.852000 90.809000 10891.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 10900.852000 93.671000 10891.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 10900.852000 98.315000 10891.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 10900.852000 101.906000 10891.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 10900.852000 106.514000 10891.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 10900.852000 109.754000 10891.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 10900.852000 112.868000 10891.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 10900.852000 118.691000 10891.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 10900.852000 121.850000 10891.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 10900.852000 125.702000 10891.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 10900.852000 131.588000 10891.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 10900.852000 136.907000 10891.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 10900.852000 140.039000 10891.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 10900.852000 146.078000 10891.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 10900.852000 151.442000 10891.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 10900.852000 154.349000 10891.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 10900.852000 157.148000 10891.852000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 10900.852000 160.433000 10891.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10890.352000 84.095000 10881.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 10890.352000 89.468000 10881.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 10890.352000 94.580000 10881.352000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 10890.352000 97.631000 10881.352000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 10869.952000 104.443000 10860.952000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 10869.952000 109.060000 10860.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 10869.952000 113.398000 10860.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 10869.952000 119.194000 10860.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 10869.952000 124.612000 10860.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 10869.952000 127.465000 10860.952000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 10853.252000 101.176000 10844.252000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 10853.252000 104.074000 10844.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 10853.252000 109.420000 10844.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 10853.252000 114.442000 10844.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 10853.252000 120.202000 10844.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 10853.252000 123.811000 10844.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 10853.252000 129.121000 10844.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 10853.252000 134.899000 10844.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 10853.252000 139.516000 10844.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 10853.252000 143.107000 10844.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 10853.252000 148.417000 10844.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 10853.252000 151.270000 10844.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 10853.252000 157.093000 10844.252000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 10836.552000 103.048000 10827.552000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 10836.552000 108.421000 10827.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 10836.552000 113.443000 10827.552000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 10836.552000 118.852000 10827.552000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 10836.552000 124.702000 10827.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 10836.552000 130.021000 10827.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 10836.552000 135.079000 10827.552000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 10817.352000 104.407000 10808.352000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 10817.352000 109.816000 10808.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 10817.352000 115.594000 10808.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 10817.352000 121.354000 10808.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 10817.352000 125.692000 10808.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 10817.352000 128.563000 10808.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 10817.352000 133.954000 10808.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 10817.352000 139.786000 10808.352000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 10784.700000 0 72.100000 10784.700000 0 72.100000 10905.200000 0 72.000000 10905.200000 0 72.000000 10784.700000 0
+eoFillPath subpath 1 164.600000 10784.700000 0 164.700000 10784.700000 0 164.700000 10905.200000 0 164.600000 10905.200000 0 164.600000 10784.700000 0
+eoFillPath subpath 1 72.000000 10905.100000 0 164.700000 10905.100000 0 164.700000 10905.200000 0 72.000000 10905.200000 0 72.000000 10905.100000 0
+eoFillPath subpath 1 72.000000 10784.700000 0 164.700000 10784.700000 0 164.700000 10784.800000 0 72.000000 10784.800000 0 72.000000 10784.700000 0
+eoFillPath subpath 1 91.300000 10799.600000 0 93.700000 10799.600000 0 93.700000 10873.900000 0 91.300000 10873.900000 0 91.300000 10799.600000 0
+eoFillPath subpath 1 72.000000 10818.800000 0 169.600000 10818.800000 0 169.600000 10821.200000 0 72.000000 10821.200000 0 72.000000 10818.800000 0
+eoFillPath subpath 1 72.000000 10871.500000 0 169.600000 10871.500000 0 169.600000 10873.900000 0 72.000000 10873.900000 0 72.000000 10871.500000 0
+eoFillPath subpath 1 72.000000 10799.600000 0 169.600000 10799.600000 0 169.600000 10802.000000 0 72.000000 10802.000000 0 72.000000 10799.600000 0
+saveState
+eoClipPath subpath 1 108.000000 2933.600000 0 150.800000 2933.600000 0 150.800000 2977.900000 0 108.000000 2977.900000 0 108.000000 2933.600000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 -214170.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 2083.700000 0 499.600000 2083.700000 0 499.600000 2088.800000 0 186.800000 2088.800000 0 186.800000 2083.700000 0
+eoFillPath subpath 1 494.500000 2088.700000 0 499.600000 2088.700000 0 499.600000 2277.100000 0 494.500000 2277.100000 0 494.500000 2088.700000 0
+saveState
+eoClipPath subpath 1 181.800000 2088.700000 0 494.500000 2088.700000 0 494.500000 2282.000000 0 181.800000 2282.000000 0 181.800000 2088.700000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 2282.100000 0 494.500000 2282.100000 0 494.500000 2282.100000 0 181.700000 2282.100000 0
+eoFillPath subpath 1 181.700000 2282.100000 0 494.500000 2282.100000 0 494.500000 2281.300000 0 181.700000 2281.300000 0 181.700000 2282.100000 0
+eoFillPath subpath 1 181.700000 2281.300000 0 494.500000 2281.300000 0 494.500000 2280.600000 0 181.700000 2280.600000 0 181.700000 2281.300000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 2280.600000 0 494.500000 2280.600000 0 494.500000 2279.800000 0 181.700000 2279.800000 0 181.700000 2280.600000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 2279.800000 0 494.500000 2279.800000 0 494.500000 2279.000000 0 181.700000 2279.000000 0 181.700000 2279.800000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 2279.000000 0 494.500000 2279.000000 0 494.500000 2278.300000 0 181.700000 2278.300000 0 181.700000 2279.000000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 2278.300000 0 494.500000 2278.300000 0 494.500000 2277.500000 0 181.700000 2277.500000 0 181.700000 2278.300000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 2277.500000 0 494.500000 2277.500000 0 494.500000 2276.800000 0 181.700000 2276.800000 0 181.700000 2277.500000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 2276.800000 0 494.500000 2276.800000 0 494.500000 2276.000000 0 181.700000 2276.000000 0 181.700000 2276.800000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 2276.000000 0 494.500000 2276.000000 0 494.500000 2275.300000 0 181.700000 2275.300000 0 181.700000 2276.000000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 2275.300000 0 494.500000 2275.300000 0 494.500000 2274.500000 0 181.700000 2274.500000 0 181.700000 2275.300000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 2274.500000 0 494.500000 2274.500000 0 494.500000 2273.700000 0 181.700000 2273.700000 0 181.700000 2274.500000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 2273.700000 0 494.500000 2273.700000 0 494.500000 2273.000000 0 181.700000 2273.000000 0 181.700000 2273.700000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 2273.000000 0 494.500000 2273.000000 0 494.500000 2272.200000 0 181.700000 2272.200000 0 181.700000 2273.000000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 2272.200000 0 494.500000 2272.200000 0 494.500000 2271.500000 0 181.700000 2271.500000 0 181.700000 2272.200000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 2271.500000 0 494.500000 2271.500000 0 494.500000 2270.700000 0 181.700000 2270.700000 0 181.700000 2271.500000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 2270.700000 0 494.500000 2270.700000 0 494.500000 2269.900000 0 181.700000 2269.900000 0 181.700000 2270.700000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 2269.900000 0 494.500000 2269.900000 0 494.500000 2269.200000 0 181.700000 2269.200000 0 181.700000 2269.900000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 2269.200000 0 494.500000 2269.200000 0 494.500000 2268.400000 0 181.700000 2268.400000 0 181.700000 2269.200000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 2268.400000 0 494.500000 2268.400000 0 494.500000 2267.700000 0 181.700000 2267.700000 0 181.700000 2268.400000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 2267.700000 0 494.500000 2267.700000 0 494.500000 2266.900000 0 181.700000 2266.900000 0 181.700000 2267.700000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 2266.900000 0 494.500000 2266.900000 0 494.500000 2266.100000 0 181.700000 2266.100000 0 181.700000 2266.900000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 2266.100000 0 494.500000 2266.100000 0 494.500000 2265.400000 0 181.700000 2265.400000 0 181.700000 2266.100000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 2265.400000 0 494.500000 2265.400000 0 494.500000 2264.600000 0 181.700000 2264.600000 0 181.700000 2265.400000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 2264.600000 0 494.500000 2264.600000 0 494.500000 2263.900000 0 181.700000 2263.900000 0 181.700000 2264.600000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 2263.900000 0 494.500000 2263.900000 0 494.500000 2263.100000 0 181.700000 2263.100000 0 181.700000 2263.900000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 2263.100000 0 494.500000 2263.100000 0 494.500000 2262.400000 0 181.700000 2262.400000 0 181.700000 2263.100000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 2262.400000 0 494.500000 2262.400000 0 494.500000 2261.600000 0 181.700000 2261.600000 0 181.700000 2262.400000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 2261.600000 0 494.500000 2261.600000 0 494.500000 2260.800000 0 181.700000 2260.800000 0 181.700000 2261.600000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 2260.800000 0 494.500000 2260.800000 0 494.500000 2260.100000 0 181.700000 2260.100000 0 181.700000 2260.800000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 2260.100000 0 494.500000 2260.100000 0 494.500000 2259.300000 0 181.700000 2259.300000 0 181.700000 2260.100000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 2259.300000 0 494.500000 2259.300000 0 494.500000 2258.600000 0 181.700000 2258.600000 0 181.700000 2259.300000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 2258.600000 0 494.500000 2258.600000 0 494.500000 2257.800000 0 181.700000 2257.800000 0 181.700000 2258.600000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 2257.800000 0 494.500000 2257.800000 0 494.500000 2257.000000 0 181.700000 2257.000000 0 181.700000 2257.800000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 2257.000000 0 494.500000 2257.000000 0 494.500000 2256.300000 0 181.700000 2256.300000 0 181.700000 2257.000000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 2256.300000 0 494.500000 2256.300000 0 494.500000 2255.500000 0 181.700000 2255.500000 0 181.700000 2256.300000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 2255.500000 0 494.500000 2255.500000 0 494.500000 2254.800000 0 181.700000 2254.800000 0 181.700000 2255.500000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 2254.800000 0 494.500000 2254.800000 0 494.500000 2254.000000 0 181.700000 2254.000000 0 181.700000 2254.800000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 2254.000000 0 494.500000 2254.000000 0 494.500000 2253.200000 0 181.700000 2253.200000 0 181.700000 2254.000000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 2253.200000 0 494.500000 2253.200000 0 494.500000 2252.500000 0 181.700000 2252.500000 0 181.700000 2253.200000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 2252.500000 0 494.500000 2252.500000 0 494.500000 2251.700000 0 181.700000 2251.700000 0 181.700000 2252.500000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 2251.700000 0 494.500000 2251.700000 0 494.500000 2251.000000 0 181.700000 2251.000000 0 181.700000 2251.700000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 2251.000000 0 494.500000 2251.000000 0 494.500000 2250.200000 0 181.700000 2250.200000 0 181.700000 2251.000000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 2250.200000 0 494.500000 2250.200000 0 494.500000 2249.500000 0 181.700000 2249.500000 0 181.700000 2250.200000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 2249.500000 0 494.500000 2249.500000 0 494.500000 2248.700000 0 181.700000 2248.700000 0 181.700000 2249.500000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 2248.700000 0 494.500000 2248.700000 0 494.500000 2247.900000 0 181.700000 2247.900000 0 181.700000 2248.700000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 2247.900000 0 494.500000 2247.900000 0 494.500000 2247.200000 0 181.700000 2247.200000 0 181.700000 2247.900000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 2247.200000 0 494.500000 2247.200000 0 494.500000 2246.400000 0 181.700000 2246.400000 0 181.700000 2247.200000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 2246.400000 0 494.500000 2246.400000 0 494.500000 2245.700000 0 181.700000 2245.700000 0 181.700000 2246.400000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 2245.700000 0 494.500000 2245.700000 0 494.500000 2244.900000 0 181.700000 2244.900000 0 181.700000 2245.700000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 2244.900000 0 494.500000 2244.900000 0 494.500000 2244.100000 0 181.700000 2244.100000 0 181.700000 2244.900000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 2244.100000 0 494.500000 2244.100000 0 494.500000 2243.400000 0 181.700000 2243.400000 0 181.700000 2244.100000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 2243.400000 0 494.500000 2243.400000 0 494.500000 2242.600000 0 181.700000 2242.600000 0 181.700000 2243.400000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 2242.600000 0 494.500000 2242.600000 0 494.500000 2241.900000 0 181.700000 2241.900000 0 181.700000 2242.600000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 2241.900000 0 494.500000 2241.900000 0 494.500000 2241.100000 0 181.700000 2241.100000 0 181.700000 2241.900000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 2241.100000 0 494.500000 2241.100000 0 494.500000 2240.300000 0 181.700000 2240.300000 0 181.700000 2241.100000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 2240.300000 0 494.500000 2240.300000 0 494.500000 2239.600000 0 181.700000 2239.600000 0 181.700000 2240.300000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 2239.600000 0 494.500000 2239.600000 0 494.500000 2238.800000 0 181.700000 2238.800000 0 181.700000 2239.600000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 2238.800000 0 494.500000 2238.800000 0 494.500000 2238.100000 0 181.700000 2238.100000 0 181.700000 2238.800000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 2238.100000 0 494.500000 2238.100000 0 494.500000 2237.300000 0 181.700000 2237.300000 0 181.700000 2238.100000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 2237.300000 0 494.500000 2237.300000 0 494.500000 2236.600000 0 181.700000 2236.600000 0 181.700000 2237.300000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 2236.600000 0 494.500000 2236.600000 0 494.500000 2235.800000 0 181.700000 2235.800000 0 181.700000 2236.600000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 2235.800000 0 494.500000 2235.800000 0 494.500000 2235.000000 0 181.700000 2235.000000 0 181.700000 2235.800000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 2235.000000 0 494.500000 2235.000000 0 494.500000 2234.300000 0 181.700000 2234.300000 0 181.700000 2235.000000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 2234.300000 0 494.500000 2234.300000 0 494.500000 2233.500000 0 181.700000 2233.500000 0 181.700000 2234.300000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 2233.500000 0 494.500000 2233.500000 0 494.500000 2232.800000 0 181.700000 2232.800000 0 181.700000 2233.500000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 2232.800000 0 494.500000 2232.800000 0 494.500000 2232.000000 0 181.700000 2232.000000 0 181.700000 2232.800000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 2232.000000 0 494.500000 2232.000000 0 494.500000 2231.200000 0 181.700000 2231.200000 0 181.700000 2232.000000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 2231.200000 0 494.500000 2231.200000 0 494.500000 2230.500000 0 181.700000 2230.500000 0 181.700000 2231.200000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 2230.500000 0 494.500000 2230.500000 0 494.500000 2229.700000 0 181.700000 2229.700000 0 181.700000 2230.500000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 2229.700000 0 494.500000 2229.700000 0 494.500000 2229.000000 0 181.700000 2229.000000 0 181.700000 2229.700000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 2229.000000 0 494.500000 2229.000000 0 494.500000 2228.200000 0 181.700000 2228.200000 0 181.700000 2229.000000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 2228.200000 0 494.500000 2228.200000 0 494.500000 2227.400000 0 181.700000 2227.400000 0 181.700000 2228.200000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 2227.400000 0 494.500000 2227.400000 0 494.500000 2226.700000 0 181.700000 2226.700000 0 181.700000 2227.400000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 2226.700000 0 494.500000 2226.700000 0 494.500000 2225.900000 0 181.700000 2225.900000 0 181.700000 2226.700000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 2225.900000 0 494.500000 2225.900000 0 494.500000 2225.200000 0 181.700000 2225.200000 0 181.700000 2225.900000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 2225.200000 0 494.500000 2225.200000 0 494.500000 2224.400000 0 181.700000 2224.400000 0 181.700000 2225.200000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 2224.400000 0 494.500000 2224.400000 0 494.500000 2223.700000 0 181.700000 2223.700000 0 181.700000 2224.400000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 2223.700000 0 494.500000 2223.700000 0 494.500000 2222.900000 0 181.700000 2222.900000 0 181.700000 2223.700000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 2222.900000 0 494.500000 2222.900000 0 494.500000 2222.100000 0 181.700000 2222.100000 0 181.700000 2222.900000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 2222.100000 0 494.500000 2222.100000 0 494.500000 2221.400000 0 181.700000 2221.400000 0 181.700000 2222.100000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 2221.400000 0 494.500000 2221.400000 0 494.500000 2220.600000 0 181.700000 2220.600000 0 181.700000 2221.400000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 2220.600000 0 494.500000 2220.600000 0 494.500000 2219.900000 0 181.700000 2219.900000 0 181.700000 2220.600000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 2219.900000 0 494.500000 2219.900000 0 494.500000 2219.100000 0 181.700000 2219.100000 0 181.700000 2219.900000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 2219.100000 0 494.500000 2219.100000 0 494.500000 2218.300000 0 181.700000 2218.300000 0 181.700000 2219.100000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 2218.300000 0 494.500000 2218.300000 0 494.500000 2217.600000 0 181.700000 2217.600000 0 181.700000 2218.300000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 2217.600000 0 494.500000 2217.600000 0 494.500000 2216.800000 0 181.700000 2216.800000 0 181.700000 2217.600000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 2216.800000 0 494.500000 2216.800000 0 494.500000 2216.100000 0 181.700000 2216.100000 0 181.700000 2216.800000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 2216.100000 0 494.500000 2216.100000 0 494.500000 2215.300000 0 181.700000 2215.300000 0 181.700000 2216.100000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 2215.300000 0 494.500000 2215.300000 0 494.500000 2214.500000 0 181.700000 2214.500000 0 181.700000 2215.300000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 2214.500000 0 494.500000 2214.500000 0 494.500000 2213.800000 0 181.700000 2213.800000 0 181.700000 2214.500000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 2213.800000 0 494.500000 2213.800000 0 494.500000 2213.000000 0 181.700000 2213.000000 0 181.700000 2213.800000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 2213.000000 0 494.500000 2213.000000 0 494.500000 2212.300000 0 181.700000 2212.300000 0 181.700000 2213.000000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 2212.300000 0 494.500000 2212.300000 0 494.500000 2211.500000 0 181.700000 2211.500000 0 181.700000 2212.300000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 2211.500000 0 494.500000 2211.500000 0 494.500000 2210.800000 0 181.700000 2210.800000 0 181.700000 2211.500000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 2210.800000 0 494.500000 2210.800000 0 494.500000 2210.000000 0 181.700000 2210.000000 0 181.700000 2210.800000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 2210.000000 0 494.500000 2210.000000 0 494.500000 2209.200000 0 181.700000 2209.200000 0 181.700000 2210.000000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 2209.200000 0 494.500000 2209.200000 0 494.500000 2208.500000 0 181.700000 2208.500000 0 181.700000 2209.200000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 2208.500000 0 494.500000 2208.500000 0 494.500000 2207.700000 0 181.700000 2207.700000 0 181.700000 2208.500000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 2207.700000 0 494.500000 2207.700000 0 494.500000 2207.000000 0 181.700000 2207.000000 0 181.700000 2207.700000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 2207.000000 0 494.500000 2207.000000 0 494.500000 2206.200000 0 181.700000 2206.200000 0 181.700000 2207.000000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 2206.200000 0 494.500000 2206.200000 0 494.500000 2205.400000 0 181.700000 2205.400000 0 181.700000 2206.200000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 2205.400000 0 494.500000 2205.400000 0 494.500000 2204.700000 0 181.700000 2204.700000 0 181.700000 2205.400000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 2204.700000 0 494.500000 2204.700000 0 494.500000 2203.900000 0 181.700000 2203.900000 0 181.700000 2204.700000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 2203.900000 0 494.500000 2203.900000 0 494.500000 2203.200000 0 181.700000 2203.200000 0 181.700000 2203.900000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 2203.200000 0 494.500000 2203.200000 0 494.500000 2202.400000 0 181.700000 2202.400000 0 181.700000 2203.200000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 2202.400000 0 494.500000 2202.400000 0 494.500000 2201.600000 0 181.700000 2201.600000 0 181.700000 2202.400000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 2201.600000 0 494.500000 2201.600000 0 494.500000 2200.900000 0 181.700000 2200.900000 0 181.700000 2201.600000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 2200.900000 0 494.500000 2200.900000 0 494.500000 2200.100000 0 181.700000 2200.100000 0 181.700000 2200.900000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 2200.100000 0 494.500000 2200.100000 0 494.500000 2199.400000 0 181.700000 2199.400000 0 181.700000 2200.100000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 2199.400000 0 494.500000 2199.400000 0 494.500000 2198.600000 0 181.700000 2198.600000 0 181.700000 2199.400000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 2198.600000 0 494.500000 2198.600000 0 494.500000 2197.900000 0 181.700000 2197.900000 0 181.700000 2198.600000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 2197.900000 0 494.500000 2197.900000 0 494.500000 2197.100000 0 181.700000 2197.100000 0 181.700000 2197.900000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 2197.100000 0 494.500000 2197.100000 0 494.500000 2196.300000 0 181.700000 2196.300000 0 181.700000 2197.100000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 2196.300000 0 494.500000 2196.300000 0 494.500000 2195.600000 0 181.700000 2195.600000 0 181.700000 2196.300000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 2195.600000 0 494.500000 2195.600000 0 494.500000 2194.800000 0 181.700000 2194.800000 0 181.700000 2195.600000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 2194.800000 0 494.500000 2194.800000 0 494.500000 2194.100000 0 181.700000 2194.100000 0 181.700000 2194.800000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 2194.100000 0 494.500000 2194.100000 0 494.500000 2193.300000 0 181.700000 2193.300000 0 181.700000 2194.100000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 2193.300000 0 494.500000 2193.300000 0 494.500000 2192.500000 0 181.700000 2192.500000 0 181.700000 2193.300000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 2192.500000 0 494.500000 2192.500000 0 494.500000 2191.800000 0 181.700000 2191.800000 0 181.700000 2192.500000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 2191.800000 0 494.500000 2191.800000 0 494.500000 2191.000000 0 181.700000 2191.000000 0 181.700000 2191.800000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 2191.000000 0 494.500000 2191.000000 0 494.500000 2190.300000 0 181.700000 2190.300000 0 181.700000 2191.000000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 2190.300000 0 494.500000 2190.300000 0 494.500000 2189.500000 0 181.700000 2189.500000 0 181.700000 2190.300000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 2189.500000 0 494.500000 2189.500000 0 494.500000 2188.700000 0 181.700000 2188.700000 0 181.700000 2189.500000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 2188.700000 0 494.500000 2188.700000 0 494.500000 2188.000000 0 181.700000 2188.000000 0 181.700000 2188.700000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 2188.000000 0 494.500000 2188.000000 0 494.500000 2187.200000 0 181.700000 2187.200000 0 181.700000 2188.000000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 2187.200000 0 494.500000 2187.200000 0 494.500000 2186.500000 0 181.700000 2186.500000 0 181.700000 2187.200000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 2186.500000 0 494.500000 2186.500000 0 494.500000 2185.700000 0 181.700000 2185.700000 0 181.700000 2186.500000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 2185.700000 0 494.500000 2185.700000 0 494.500000 2185.000000 0 181.700000 2185.000000 0 181.700000 2185.700000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 2185.000000 0 494.500000 2185.000000 0 494.500000 2184.200000 0 181.700000 2184.200000 0 181.700000 2185.000000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 2184.200000 0 494.500000 2184.200000 0 494.500000 2183.400000 0 181.700000 2183.400000 0 181.700000 2184.200000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 2183.400000 0 494.500000 2183.400000 0 494.500000 2182.700000 0 181.700000 2182.700000 0 181.700000 2183.400000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 2182.700000 0 494.500000 2182.700000 0 494.500000 2181.900000 0 181.700000 2181.900000 0 181.700000 2182.700000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 2181.900000 0 494.500000 2181.900000 0 494.500000 2181.200000 0 181.700000 2181.200000 0 181.700000 2181.900000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 2181.200000 0 494.500000 2181.200000 0 494.500000 2180.400000 0 181.700000 2180.400000 0 181.700000 2181.200000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 2180.400000 0 494.500000 2180.400000 0 494.500000 2179.600000 0 181.700000 2179.600000 0 181.700000 2180.400000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 2179.600000 0 494.500000 2179.600000 0 494.500000 2178.900000 0 181.700000 2178.900000 0 181.700000 2179.600000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 2178.900000 0 494.500000 2178.900000 0 494.500000 2178.100000 0 181.700000 2178.100000 0 181.700000 2178.900000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 2178.100000 0 494.500000 2178.100000 0 494.500000 2177.400000 0 181.700000 2177.400000 0 181.700000 2178.100000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 2177.400000 0 494.500000 2177.400000 0 494.500000 2176.600000 0 181.700000 2176.600000 0 181.700000 2177.400000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 2176.600000 0 494.500000 2176.600000 0 494.500000 2175.800000 0 181.700000 2175.800000 0 181.700000 2176.600000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 2175.800000 0 494.500000 2175.800000 0 494.500000 2175.100000 0 181.700000 2175.100000 0 181.700000 2175.800000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 2175.100000 0 494.500000 2175.100000 0 494.500000 2174.300000 0 181.700000 2174.300000 0 181.700000 2175.100000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 2174.300000 0 494.500000 2174.300000 0 494.500000 2173.600000 0 181.700000 2173.600000 0 181.700000 2174.300000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 2173.600000 0 494.500000 2173.600000 0 494.500000 2172.800000 0 181.700000 2172.800000 0 181.700000 2173.600000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 2172.800000 0 494.500000 2172.800000 0 494.500000 2172.100000 0 181.700000 2172.100000 0 181.700000 2172.800000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 2172.100000 0 494.500000 2172.100000 0 494.500000 2171.300000 0 181.700000 2171.300000 0 181.700000 2172.100000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 2171.300000 0 494.500000 2171.300000 0 494.500000 2170.500000 0 181.700000 2170.500000 0 181.700000 2171.300000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 2170.500000 0 494.500000 2170.500000 0 494.500000 2169.800000 0 181.700000 2169.800000 0 181.700000 2170.500000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 2169.800000 0 494.500000 2169.800000 0 494.500000 2169.000000 0 181.700000 2169.000000 0 181.700000 2169.800000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 2169.000000 0 494.500000 2169.000000 0 494.500000 2168.300000 0 181.700000 2168.300000 0 181.700000 2169.000000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 2168.300000 0 494.500000 2168.300000 0 494.500000 2167.500000 0 181.700000 2167.500000 0 181.700000 2168.300000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 2167.500000 0 494.500000 2167.500000 0 494.500000 2166.700000 0 181.700000 2166.700000 0 181.700000 2167.500000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 2166.700000 0 494.500000 2166.700000 0 494.500000 2166.000000 0 181.700000 2166.000000 0 181.700000 2166.700000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 2166.000000 0 494.500000 2166.000000 0 494.500000 2165.200000 0 181.700000 2165.200000 0 181.700000 2166.000000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 2165.200000 0 494.500000 2165.200000 0 494.500000 2164.500000 0 181.700000 2164.500000 0 181.700000 2165.200000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 2164.500000 0 494.500000 2164.500000 0 494.500000 2163.700000 0 181.700000 2163.700000 0 181.700000 2164.500000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 2163.700000 0 494.500000 2163.700000 0 494.500000 2162.900000 0 181.700000 2162.900000 0 181.700000 2163.700000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 2162.900000 0 494.500000 2162.900000 0 494.500000 2162.200000 0 181.700000 2162.200000 0 181.700000 2162.900000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 2162.200000 0 494.500000 2162.200000 0 494.500000 2161.400000 0 181.700000 2161.400000 0 181.700000 2162.200000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 2161.400000 0 494.500000 2161.400000 0 494.500000 2160.700000 0 181.700000 2160.700000 0 181.700000 2161.400000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 2160.700000 0 494.500000 2160.700000 0 494.500000 2159.900000 0 181.700000 2159.900000 0 181.700000 2160.700000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 2159.900000 0 494.500000 2159.900000 0 494.500000 2159.200000 0 181.700000 2159.200000 0 181.700000 2159.900000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 2159.200000 0 494.500000 2159.200000 0 494.500000 2158.400000 0 181.700000 2158.400000 0 181.700000 2159.200000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 2158.400000 0 494.500000 2158.400000 0 494.500000 2157.600000 0 181.700000 2157.600000 0 181.700000 2158.400000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 2157.600000 0 494.500000 2157.600000 0 494.500000 2156.900000 0 181.700000 2156.900000 0 181.700000 2157.600000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 2156.900000 0 494.500000 2156.900000 0 494.500000 2156.100000 0 181.700000 2156.100000 0 181.700000 2156.900000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 2156.100000 0 494.500000 2156.100000 0 494.500000 2155.400000 0 181.700000 2155.400000 0 181.700000 2156.100000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 2155.400000 0 494.500000 2155.400000 0 494.500000 2154.600000 0 181.700000 2154.600000 0 181.700000 2155.400000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 2154.600000 0 494.500000 2154.600000 0 494.500000 2153.800000 0 181.700000 2153.800000 0 181.700000 2154.600000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 2153.800000 0 494.500000 2153.800000 0 494.500000 2153.100000 0 181.700000 2153.100000 0 181.700000 2153.800000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 2153.100000 0 494.500000 2153.100000 0 494.500000 2152.300000 0 181.700000 2152.300000 0 181.700000 2153.100000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 2152.300000 0 494.500000 2152.300000 0 494.500000 2151.600000 0 181.700000 2151.600000 0 181.700000 2152.300000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 2151.600000 0 494.500000 2151.600000 0 494.500000 2150.800000 0 181.700000 2150.800000 0 181.700000 2151.600000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 2150.800000 0 494.500000 2150.800000 0 494.500000 2150.100000 0 181.700000 2150.100000 0 181.700000 2150.800000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 2150.100000 0 494.500000 2150.100000 0 494.500000 2149.300000 0 181.700000 2149.300000 0 181.700000 2150.100000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 2149.300000 0 494.500000 2149.300000 0 494.500000 2148.500000 0 181.700000 2148.500000 0 181.700000 2149.300000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 2148.500000 0 494.500000 2148.500000 0 494.500000 2147.800000 0 181.700000 2147.800000 0 181.700000 2148.500000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 2147.800000 0 494.500000 2147.800000 0 494.500000 2147.000000 0 181.700000 2147.000000 0 181.700000 2147.800000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 2147.000000 0 494.500000 2147.000000 0 494.500000 2146.300000 0 181.700000 2146.300000 0 181.700000 2147.000000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 2146.300000 0 494.500000 2146.300000 0 494.500000 2145.500000 0 181.700000 2145.500000 0 181.700000 2146.300000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 2145.500000 0 494.500000 2145.500000 0 494.500000 2144.700000 0 181.700000 2144.700000 0 181.700000 2145.500000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 2144.700000 0 494.500000 2144.700000 0 494.500000 2144.000000 0 181.700000 2144.000000 0 181.700000 2144.700000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 2144.000000 0 494.500000 2144.000000 0 494.500000 2143.200000 0 181.700000 2143.200000 0 181.700000 2144.000000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 2143.200000 0 494.500000 2143.200000 0 494.500000 2142.500000 0 181.700000 2142.500000 0 181.700000 2143.200000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 2142.500000 0 494.500000 2142.500000 0 494.500000 2141.700000 0 181.700000 2141.700000 0 181.700000 2142.500000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 2141.700000 0 494.500000 2141.700000 0 494.500000 2141.000000 0 181.700000 2141.000000 0 181.700000 2141.700000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 2141.000000 0 494.500000 2141.000000 0 494.500000 2140.200000 0 181.700000 2140.200000 0 181.700000 2141.000000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 2140.200000 0 494.500000 2140.200000 0 494.500000 2139.400000 0 181.700000 2139.400000 0 181.700000 2140.200000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 2139.400000 0 494.500000 2139.400000 0 494.500000 2138.700000 0 181.700000 2138.700000 0 181.700000 2139.400000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 2138.700000 0 494.500000 2138.700000 0 494.500000 2137.900000 0 181.700000 2137.900000 0 181.700000 2138.700000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 2137.900000 0 494.500000 2137.900000 0 494.500000 2137.200000 0 181.700000 2137.200000 0 181.700000 2137.900000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 2137.200000 0 494.500000 2137.200000 0 494.500000 2136.400000 0 181.700000 2136.400000 0 181.700000 2137.200000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 2136.400000 0 494.500000 2136.400000 0 494.500000 2135.700000 0 181.700000 2135.700000 0 181.700000 2136.400000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 2135.700000 0 494.500000 2135.700000 0 494.500000 2134.900000 0 181.700000 2134.900000 0 181.700000 2135.700000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 2134.900000 0 494.500000 2134.900000 0 494.500000 2134.100000 0 181.700000 2134.100000 0 181.700000 2134.900000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 2134.100000 0 494.500000 2134.100000 0 494.500000 2133.400000 0 181.700000 2133.400000 0 181.700000 2134.100000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 2133.400000 0 494.500000 2133.400000 0 494.500000 2132.600000 0 181.700000 2132.600000 0 181.700000 2133.400000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 2132.600000 0 494.500000 2132.600000 0 494.500000 2131.900000 0 181.700000 2131.900000 0 181.700000 2132.600000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 2131.900000 0 494.500000 2131.900000 0 494.500000 2131.100000 0 181.700000 2131.100000 0 181.700000 2131.900000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 2131.100000 0 494.500000 2131.100000 0 494.500000 2130.300000 0 181.700000 2130.300000 0 181.700000 2131.100000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 2130.300000 0 494.500000 2130.300000 0 494.500000 2129.600000 0 181.700000 2129.600000 0 181.700000 2130.300000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 2129.600000 0 494.500000 2129.600000 0 494.500000 2128.800000 0 181.700000 2128.800000 0 181.700000 2129.600000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 2128.800000 0 494.500000 2128.800000 0 494.500000 2128.100000 0 181.700000 2128.100000 0 181.700000 2128.800000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 2128.100000 0 494.500000 2128.100000 0 494.500000 2127.300000 0 181.700000 2127.300000 0 181.700000 2128.100000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 2127.300000 0 494.500000 2127.300000 0 494.500000 2126.600000 0 181.700000 2126.600000 0 181.700000 2127.300000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 2126.600000 0 494.500000 2126.600000 0 494.500000 2125.800000 0 181.700000 2125.800000 0 181.700000 2126.600000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 2125.800000 0 494.500000 2125.800000 0 494.500000 2125.000000 0 181.700000 2125.000000 0 181.700000 2125.800000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 2125.000000 0 494.500000 2125.000000 0 494.500000 2124.300000 0 181.700000 2124.300000 0 181.700000 2125.000000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 2124.300000 0 494.500000 2124.300000 0 494.500000 2123.500000 0 181.700000 2123.500000 0 181.700000 2124.300000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 2123.500000 0 494.500000 2123.500000 0 494.500000 2122.800000 0 181.700000 2122.800000 0 181.700000 2123.500000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 2122.800000 0 494.500000 2122.800000 0 494.500000 2122.000000 0 181.700000 2122.000000 0 181.700000 2122.800000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 2122.000000 0 494.500000 2122.000000 0 494.500000 2121.200000 0 181.700000 2121.200000 0 181.700000 2122.000000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 2121.200000 0 494.500000 2121.200000 0 494.500000 2120.500000 0 181.700000 2120.500000 0 181.700000 2121.200000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 2120.500000 0 494.500000 2120.500000 0 494.500000 2119.700000 0 181.700000 2119.700000 0 181.700000 2120.500000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 2119.700000 0 494.500000 2119.700000 0 494.500000 2119.000000 0 181.700000 2119.000000 0 181.700000 2119.700000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 2119.000000 0 494.500000 2119.000000 0 494.500000 2118.200000 0 181.700000 2118.200000 0 181.700000 2119.000000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 2118.200000 0 494.500000 2118.200000 0 494.500000 2117.500000 0 181.700000 2117.500000 0 181.700000 2118.200000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 2117.500000 0 494.500000 2117.500000 0 494.500000 2116.700000 0 181.700000 2116.700000 0 181.700000 2117.500000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 2116.700000 0 494.500000 2116.700000 0 494.500000 2115.900000 0 181.700000 2115.900000 0 181.700000 2116.700000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 2115.900000 0 494.500000 2115.900000 0 494.500000 2115.200000 0 181.700000 2115.200000 0 181.700000 2115.900000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 2115.200000 0 494.500000 2115.200000 0 494.500000 2114.400000 0 181.700000 2114.400000 0 181.700000 2115.200000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 2114.400000 0 494.500000 2114.400000 0 494.500000 2113.700000 0 181.700000 2113.700000 0 181.700000 2114.400000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 2113.700000 0 494.500000 2113.700000 0 494.500000 2112.900000 0 181.700000 2112.900000 0 181.700000 2113.700000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 2112.900000 0 494.500000 2112.900000 0 494.500000 2112.100000 0 181.700000 2112.100000 0 181.700000 2112.900000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 2112.100000 0 494.500000 2112.100000 0 494.500000 2111.400000 0 181.700000 2111.400000 0 181.700000 2112.100000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 2111.400000 0 494.500000 2111.400000 0 494.500000 2110.600000 0 181.700000 2110.600000 0 181.700000 2111.400000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 2110.600000 0 494.500000 2110.600000 0 494.500000 2109.900000 0 181.700000 2109.900000 0 181.700000 2110.600000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 2109.900000 0 494.500000 2109.900000 0 494.500000 2109.100000 0 181.700000 2109.100000 0 181.700000 2109.900000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 2109.100000 0 494.500000 2109.100000 0 494.500000 2108.300000 0 181.700000 2108.300000 0 181.700000 2109.100000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 2108.300000 0 494.500000 2108.300000 0 494.500000 2107.600000 0 181.700000 2107.600000 0 181.700000 2108.300000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 2107.600000 0 494.500000 2107.600000 0 494.500000 2106.800000 0 181.700000 2106.800000 0 181.700000 2107.600000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 2106.800000 0 494.500000 2106.800000 0 494.500000 2106.100000 0 181.700000 2106.100000 0 181.700000 2106.800000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 2106.100000 0 494.500000 2106.100000 0 494.500000 2105.300000 0 181.700000 2105.300000 0 181.700000 2106.100000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 2105.300000 0 494.500000 2105.300000 0 494.500000 2104.600000 0 181.700000 2104.600000 0 181.700000 2105.300000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 2104.600000 0 494.500000 2104.600000 0 494.500000 2103.800000 0 181.700000 2103.800000 0 181.700000 2104.600000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 2103.800000 0 494.500000 2103.800000 0 494.500000 2103.000000 0 181.700000 2103.000000 0 181.700000 2103.800000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 2103.000000 0 494.500000 2103.000000 0 494.500000 2102.300000 0 181.700000 2102.300000 0 181.700000 2103.000000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 2102.300000 0 494.500000 2102.300000 0 494.500000 2101.500000 0 181.700000 2101.500000 0 181.700000 2102.300000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 2101.500000 0 494.500000 2101.500000 0 494.500000 2100.800000 0 181.700000 2100.800000 0 181.700000 2101.500000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 2100.800000 0 494.500000 2100.800000 0 494.500000 2100.000000 0 181.700000 2100.000000 0 181.700000 2100.800000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 2100.000000 0 494.500000 2100.000000 0 494.500000 2099.200000 0 181.700000 2099.200000 0 181.700000 2100.000000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 2099.200000 0 494.500000 2099.200000 0 494.500000 2098.500000 0 181.700000 2098.500000 0 181.700000 2099.200000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 2098.500000 0 494.500000 2098.500000 0 494.500000 2097.700000 0 181.700000 2097.700000 0 181.700000 2098.500000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 2097.700000 0 494.500000 2097.700000 0 494.500000 2097.000000 0 181.700000 2097.000000 0 181.700000 2097.700000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 2097.000000 0 494.500000 2097.000000 0 494.500000 2096.200000 0 181.700000 2096.200000 0 181.700000 2097.000000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 2096.200000 0 494.500000 2096.200000 0 494.500000 2095.400000 0 181.700000 2095.400000 0 181.700000 2096.200000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 2095.400000 0 494.500000 2095.400000 0 494.500000 2094.700000 0 181.700000 2094.700000 0 181.700000 2095.400000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 2094.700000 0 494.500000 2094.700000 0 494.500000 2093.900000 0 181.700000 2093.900000 0 181.700000 2094.700000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 2093.900000 0 494.500000 2093.900000 0 494.500000 2093.200000 0 181.700000 2093.200000 0 181.700000 2093.900000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 2093.200000 0 494.500000 2093.200000 0 494.500000 2092.400000 0 181.700000 2092.400000 0 181.700000 2093.200000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 2092.400000 0 494.500000 2092.400000 0 494.500000 2091.700000 0 181.700000 2091.700000 0 181.700000 2092.400000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 2091.700000 0 494.500000 2091.700000 0 494.500000 2090.900000 0 181.700000 2090.900000 0 181.700000 2091.700000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 2090.900000 0 494.500000 2090.900000 0 494.500000 2090.100000 0 181.700000 2090.100000 0 181.700000 2090.900000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 2090.100000 0 494.500000 2090.100000 0 494.500000 2089.400000 0 181.700000 2089.400000 0 181.700000 2090.100000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 2089.400000 0 494.500000 2089.400000 0 494.500000 2088.600000 0 181.700000 2088.600000 0 181.700000 2089.400000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 2088.700000 0 181.800000 2088.700000 0 181.800000 2282.000000 0 494.400000 2282.000000 0 494.400000 2088.700000 0 338.100000 2088.700000 0
+strokePath subpath 1 338.100000 2088.700000 0 181.800000 2088.700000 0 181.800000 2282.000000 0 494.400000 2282.000000 0 494.400000 2088.700000 0 338.100000 2088.700000 0
+saveState
+updateCtm 11410.000000 0.000000 0.000000 -8760.000000 20530.000000 -137270.000000
+drawSoftMaskedImage 1142 877 1142 877 JPEG 70955 PPM 3004618
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 2127.724000 215.488000 2119.724000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 2127.724000 220.592000 2119.724000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 2127.724000 225.696000 2119.724000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 2127.724000 230.800000 2119.724000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 2120.124000 241.388000 2112.124000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 2120.124000 246.492000 2112.124000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 2120.124000 251.596000 2112.124000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 2120.124000 256.700000 2112.124000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 2112.424000 267.188000 2104.424000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 2112.424000 272.292000 2104.424000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 2112.424000 277.396000 2104.424000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 2112.424000 282.500000 2104.424000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 2104.824000 293.088000 2096.824000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 2104.824000 298.192000 2096.824000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 2104.824000 303.296000 2096.824000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 2104.824000 308.400000 2096.824000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 2142.724000 202.588000 2134.724000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 2162.024000 201.688000 2154.024000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 2181.324000 195.788000 2173.324000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 2181.324000 200.892000 2173.324000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 2200.724000 194.888000 2192.724000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 2200.724000 199.992000 2192.724000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 2220.024000 193.988000 2212.024000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 2220.024000 199.092000 2212.024000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 2239.324000 193.088000 2231.324000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 2239.324000 198.192000 2231.324000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 2111.424000 330.188000 2103.424000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 2111.424000 332.716000 2103.424000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 2111.424000 337.596000 2103.424000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 2111.424000 341.396000 2103.424000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 2111.424000 346.036000 2103.424000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 2111.424000 350.900000 2103.424000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 2111.424000 355.972000 2103.424000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 2111.424000 359.196000 2103.424000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 2111.424000 362.196000 2103.424000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 2111.424000 367.404000 2103.424000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 2111.424000 371.876000 2103.424000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 2111.424000 375.052000 2103.424000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 2130.924000 361.172000 2122.924000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 2130.924000 364.340000 2122.924000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 2130.924000 367.396000 2122.924000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 2130.924000 372.604000 2122.924000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 2130.924000 379.348000 2122.924000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 2130.924000 384.484000 2122.924000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 2130.924000 389.436000 2122.924000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 2130.924000 392.108000 2122.924000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 2130.924000 395.708000 2122.924000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 2130.924000 397.540000 2122.924000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 2130.924000 402.444000 2122.924000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 2130.924000 406.788000 2122.924000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 2150.424000 392.972000 2142.424000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 2150.424000 398.076000 2142.424000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 2150.424000 403.180000 2142.424000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 2150.424000 405.428000 2142.424000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 2150.424000 410.332000 2142.424000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 2150.424000 414.476000 2142.424000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 2278.092000 305.808000 2264.092000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 2278.092000 314.138000 2264.092000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 2278.092000 320.788000 2264.092000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 2278.092000 328.698000 2264.092000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 2278.092000 336.972000 2264.092000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 2278.092000 344.182000 2264.092000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 2278.092000 349.810000 2264.092000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 2278.092000 354.234000 2264.092000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 2278.092000 362.718000 2264.092000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 2278.092000 367.870000 2264.092000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 2278.092000 372.322000 2264.092000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 2278.092000 382.080000 2264.092000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 2278.092000 388.772000 2264.092000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 2278.092000 397.802000 2264.092000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 2278.092000 402.254000 2264.092000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 2278.092000 407.896000 2264.092000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 2155.200000 0 424.300000 2155.200000 0 424.300000 2215.900000 0 493.600000 2215.900000 0 493.600000 2155.200000 0 458.900000 2155.200000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 2206.300000 0 428.900000 2206.300000 0 428.900000 2212.200000 0 434.800000 2212.200000 0 434.800000 2206.300000 0 431.900000 2206.300000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 2195.200000 0 428.900000 2195.200000 0 428.900000 2201.200000 0 434.800000 2201.200000 0 434.800000 2195.200000 0 431.900000 2195.200000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 2184.100000 0 428.900000 2184.100000 0 428.900000 2190.100000 0 434.800000 2190.100000 0 434.800000 2184.100000 0 431.900000 2184.100000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 2173.000000 0 428.900000 2173.000000 0 428.900000 2179.000000 0 434.800000 2179.000000 0 434.800000 2173.000000 0 431.900000 2173.000000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 2161.900000 0 428.900000 2161.900000 0 428.900000 2167.900000 0 434.800000 2167.900000 0 434.800000 2161.900000 0 431.900000 2161.900000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 2213.324000 443.288000 2205.324000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 2213.324000 445.816000 2205.324000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 2213.324000 450.600000 2205.324000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 2213.324000 454.496000 2205.324000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 2213.324000 459.136000 2205.324000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 2213.324000 464.000000 2205.324000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 2213.324000 468.976000 2205.324000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 2213.324000 472.304000 2205.324000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 2213.324000 475.208000 2205.324000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 2213.324000 480.520000 2205.324000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 2213.324000 484.992000 2205.324000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 2213.324000 488.168000 2205.324000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 2202.324000 443.352000 2194.324000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 2202.324000 447.920000 2194.324000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 2202.324000 452.976000 2194.324000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 2202.324000 457.400000 2194.324000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 2202.324000 462.472000 2194.324000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 2202.324000 465.800000 2194.324000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 2202.324000 468.904000 2194.324000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 2202.324000 473.816000 2194.324000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 2202.324000 478.888000 2194.324000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 2202.324000 482.064000 2194.324000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 2191.224000 442.872000 2183.224000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 2191.224000 446.040000 2183.224000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 2191.224000 448.992000 2183.224000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 2191.224000 454.304000 2183.224000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 2191.224000 461.048000 2183.224000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 2191.224000 466.184000 2183.224000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 2191.224000 471.136000 2183.224000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 2191.224000 473.808000 2183.224000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 2191.224000 477.408000 2183.224000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 2191.224000 479.240000 2183.224000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 2191.224000 484.144000 2183.224000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 2191.224000 488.488000 2183.224000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 2180.124000 443.384000 2172.124000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 2180.124000 448.464000 2172.124000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 2180.124000 453.424000 2172.124000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 2180.124000 456.696000 2172.124000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 2180.124000 459.800000 2172.124000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 2180.124000 462.032000 2172.124000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 2180.124000 466.936000 2172.124000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 2180.124000 471.080000 2172.124000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 2169.024000 443.272000 2161.024000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 2169.024000 448.376000 2161.024000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 2169.024000 453.480000 2161.024000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 2169.024000 455.728000 2161.024000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 2169.024000 460.632000 2161.024000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 2169.024000 464.776000 2161.024000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 -476.000000 0 114.800000 -476.000000 0 114.800000 -433.200000 0 72.000000 -433.200000 0 72.000000 -476.000000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 126790.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 546.200000 0 504.000000 546.200000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 546.200000 0
+eoFillPath subpath 1 72.000000 72.000000 0 504.000000 72.000000 0 504.000000 245.800000 0 72.000000 245.800000 0 72.000000 72.000000 0
+eoFillPath subpath 1 72.000000 245.800000 0 121.400000 245.800000 0 121.400000 546.200000 0 72.000000 546.200000 0 72.000000 245.800000 0
+eoFillPath subpath 1 454.500000 245.800000 0 504.000000 245.800000 0 504.000000 546.200000 0 454.500000 546.200000 0 454.500000 245.800000 0
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 54620.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 72.000000 701.300000 0 504.000000 701.300000 0 504.000000 720.000000 0 72.000000 720.000000 0 72.000000 701.300000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 72.000000 654.200000 0 291.400000 654.200000 0 291.400000 672.900000 0 72.000000 672.900000 0 72.000000 654.200000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 72.000000 72.200000 0 504.000000 72.200000 0 504.000000 86.100000 0 72.000000 86.100000 0 72.000000 72.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 354.400000 719.948000 368.192000 703.948000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 368.208000 719.948000 377.664000 703.948000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 377.712000 719.948000 382.784000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 382.816000 719.948000 394.832000 703.948000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 394.816000 719.948000 404.592000 703.948000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 404.624000 719.948000 414.752000 703.948000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 414.720000 719.948000 423.040000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 423.024000 719.948000 432.864000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 432.832000 719.948000 437.904000 703.948000 1.000000 0.000000 0.000000 1.000000
+drawChar 437.936000 719.948000 443.696000 703.948000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 443.744000 719.948000 448.816000 703.948000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 448.800000 719.948000 458.000000 703.948000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 456.800000 719.948000 461.232000 703.948000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 461.200000 719.948000 467.472000 703.948000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 467.504000 719.948000 477.632000 703.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 477.600000 719.948000 487.440000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 487.408000 719.948000 495.728000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 495.712000 719.948000 504.032000 703.948000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 672.848000 83.028000 656.848000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 82.996000 672.848000 88.468000 656.848000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.500000 672.848000 96.148000 656.848000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 96.100000 672.848000 107.476000 656.848000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 107.508000 672.848000 118.356000 656.848000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 118.404000 672.848000 127.924000 656.848000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 127.908000 672.848000 137.428000 656.848000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 648.336000 194.164000 636.336000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 194.200000 648.336000 198.028000 636.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 198.004000 648.336000 202.816000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 202.804000 648.336000 210.532000 636.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 210.604000 648.336000 217.828000 636.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 217.804000 648.336000 225.532000 636.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 225.508000 648.336000 233.188000 636.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 233.212000 648.336000 240.940000 636.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 242.212000 648.336000 246.016000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 247.312000 648.336000 252.124000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 252.208000 648.336000 259.936000 636.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 259.912000 648.336000 267.004000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 268.312000 648.336000 272.116000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 273.412000 648.336000 281.092000 636.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 281.116000 648.336000 288.268000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 288.220000 648.336000 293.956000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 294.016000 648.336000 301.696000 636.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 301.720000 648.336000 308.812000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 308.824000 648.336000 316.552000 636.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 317.824000 648.336000 321.628000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 322.924000 648.336000 326.752000 636.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 326.728000 648.336000 332.884000 636.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 334.228000 648.336000 338.032000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 339.328000 648.336000 345.064000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 345.028000 648.336000 352.180000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 352.228000 648.336000 357.040000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 357.028000 648.336000 364.756000 636.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 364.732000 648.336000 371.824000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 371.836000 648.336000 377.572000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 378.940000 648.336000 382.744000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 384.040000 648.336000 387.868000 636.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 387.844000 648.336000 394.996000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 395.044000 648.336000 400.780000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 400.744000 648.336000 408.424000 636.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 408.448000 648.336000 415.540000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 415.552000 648.336000 419.356000 636.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 420.652000 648.336000 424.456000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 425.752000 648.336000 429.580000 636.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 429.556000 648.336000 434.368000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 434.452000 648.336000 437.740000 636.336000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 437.752000 648.336000 443.908000 636.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 445.252000 648.336000 449.056000 636.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 450.352000 648.336000 457.072000 636.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.048000 648.336000 464.140000 636.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 464.152000 648.336000 469.888000 636.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 469.948000 648.336000 474.760000 636.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 474.748000 648.336000 481.900000 636.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 481.852000 648.336000 485.680000 636.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 485.752000 648.336000 493.480000 636.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 493.456000 648.336000 497.284000 636.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 497.260000 648.336000 504.028000 636.336000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 648.336000 507.904000 636.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 634.436000 193.228000 622.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 193.204000 634.436000 200.428000 622.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 200.500000 634.436000 205.312000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 205.900000 634.436000 209.704000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 210.400000 634.436000 218.080000 622.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 218.104000 634.436000 221.932000 622.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 221.908000 634.436000 229.588000 622.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 230.308000 634.436000 234.112000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 234.808000 634.436000 241.900000 622.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 241.912000 634.436000 249.640000 622.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 249.616000 634.436000 256.840000 622.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 256.912000 634.436000 264.640000 622.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 264.616000 634.436000 272.296000 622.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 272.320000 634.436000 280.048000 622.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 280.624000 634.436000 284.428000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 285.124000 634.436000 289.564000 622.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 289.528000 634.436000 296.752000 622.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 296.824000 634.436000 302.560000 622.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 303.220000 634.436000 307.024000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 307.720000 634.436000 311.440000 622.436000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 311.524000 634.436000 318.748000 622.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 318.724000 634.436000 326.404000 622.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 326.428000 634.436000 334.108000 622.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 334.024000 634.436000 337.852000 622.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 337.828000 634.436000 345.556000 622.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 345.628000 634.436000 353.308000 622.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 353.224000 634.436000 357.028000 622.436000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 357.724000 634.436000 361.528000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 362.224000 634.436000 369.448000 622.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 369.424000 634.436000 375.160000 622.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 375.928000 634.436000 379.732000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 380.428000 634.436000 391.804000 622.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 391.828000 634.436000 398.980000 622.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 398.932000 634.436000 406.660000 622.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 406.732000 634.436000 413.500000 622.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 414.028000 634.436000 417.832000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 418.528000 634.436000 425.752000 622.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 425.824000 634.436000 430.636000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 430.624000 634.436000 438.352000 622.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 438.424000 634.436000 445.516000 622.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 445.528000 634.436000 451.264000 622.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 451.924000 634.436000 455.728000 622.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 456.424000 634.436000 463.648000 622.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 463.624000 634.436000 471.352000 622.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 471.424000 634.436000 476.236000 622.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 476.128000 634.436000 483.808000 622.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 483.832000 634.436000 491.056000 622.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 491.128000 634.436000 498.352000 622.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 498.328000 634.436000 504.064000 622.436000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 634.436000 507.904000 622.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 620.536000 191.656000 608.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 620.536000 199.384000 608.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 199.300000 620.536000 206.524000 608.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 206.596000 620.536000 212.332000 608.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 212.296000 620.536000 217.108000 608.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 217.096000 620.536000 223.252000 608.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 223.300000 620.536000 227.104000 608.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.200000 620.536000 231.004000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 231.196000 620.536000 240.004000 608.536000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 239.992000 620.536000 247.720000 608.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 247.696000 620.536000 252.508000 608.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 252.796000 620.536000 256.600000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 256.792000 620.536000 268.168000 608.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 268.192000 620.536000 274.960000 608.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 275.092000 620.536000 278.896000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.088000 620.536000 286.816000 608.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 286.792000 620.536000 294.016000 608.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 294.088000 620.536000 301.816000 608.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 301.684000 620.536000 307.840000 608.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 307.888000 620.536000 314.980000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 315.184000 620.536000 318.988000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 319.180000 620.536000 323.008000 608.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 322.984000 620.536000 329.140000 608.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 329.284000 620.536000 333.088000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 333.280000 620.536000 340.504000 608.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 340.576000 620.536000 348.304000 608.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 348.280000 620.536000 352.108000 608.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 352.180000 620.536000 358.948000 608.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 359.080000 620.536000 362.884000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 363.076000 620.536000 374.452000 608.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 374.476000 620.536000 378.304000 608.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 378.280000 620.536000 386.008000 608.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 385.984000 620.536000 393.712000 608.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 393.784000 620.536000 398.596000 608.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 398.584000 620.536000 405.676000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 405.688000 620.536000 411.844000 608.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 411.988000 620.536000 415.792000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 415.984000 620.536000 423.136000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 423.184000 620.536000 433.444000 608.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 433.384000 620.536000 440.536000 608.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 440.584000 620.536000 447.352000 608.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 447.484000 620.536000 451.288000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 451.684000 620.536000 456.124000 608.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 455.980000 620.536000 461.716000 608.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 461.680000 620.536000 468.904000 608.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 468.976000 620.536000 480.352000 608.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 480.280000 620.536000 484.084000 608.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 484.480000 620.536000 489.292000 608.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 489.280000 620.536000 497.008000 608.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 496.984000 620.536000 504.076000 608.536000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.200000 620.536000 508.004000 608.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 606.636000 193.228000 594.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 193.204000 606.636000 200.932000 594.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 201.004000 606.636000 212.380000 594.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 212.308000 606.636000 219.400000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 219.412000 606.636000 225.148000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 225.208000 606.636000 232.432000 594.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 232.408000 606.636000 240.136000 594.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 240.112000 606.636000 246.268000 594.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 247.108000 606.636000 250.912000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 251.704000 606.636000 258.424000 594.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 258.400000 606.636000 262.228000 594.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 262.300000 606.636000 267.112000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 267.100000 606.636000 273.868000 594.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 274.696000 606.636000 278.500000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.400000 606.636000 287.080000 594.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 287.104000 606.636000 294.256000 594.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 294.208000 606.636000 299.944000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 300.004000 606.636000 307.264000 594.636000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 307.204000 606.636000 313.360000 594.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 314.200000 606.636000 318.004000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 318.796000 606.636000 322.624000 594.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 322.600000 606.636000 330.328000 594.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 331.204000 606.636000 335.008000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 335.908000 606.636000 344.128000 594.636000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 344.104000 606.636000 351.256000 594.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 351.304000 606.636000 359.032000 594.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 359.800000 606.636000 363.604000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 364.396000 606.636000 372.712000 594.636000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 372.700000 606.636000 378.436000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 378.496000 606.636000 385.648000 594.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 385.600000 606.636000 393.328000 594.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 393.304000 606.636000 400.024000 594.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 400.108000 606.636000 403.936000 594.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 403.912000 606.636000 410.068000 594.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 410.116000 606.636000 416.836000 594.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 416.812000 606.636000 424.036000 594.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 424.012000 606.636000 427.816000 594.636000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 428.608000 606.636000 432.412000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 433.312000 606.636000 444.688000 594.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 444.712000 606.636000 451.480000 594.636000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 452.308000 606.636000 456.112000 594.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 456.904000 606.636000 461.344000 594.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 461.308000 606.636000 468.460000 594.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 468.508000 606.636000 475.276000 594.636000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 475.312000 606.636000 482.536000 594.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 482.512000 606.636000 488.248000 594.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 488.212000 606.636000 492.040000 594.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 492.112000 606.636000 496.924000 594.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 496.912000 606.636000 504.004000 594.636000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 606.636000 507.904000 594.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 592.736000 192.724000 580.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 192.700000 592.736000 197.140000 580.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 197.500000 592.736000 201.304000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 201.700000 592.736000 211.960000 580.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 211.996000 592.736000 219.724000 580.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 219.700000 592.736000 223.528000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 223.504000 592.736000 230.224000 580.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 230.308000 592.736000 238.036000 580.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 238.408000 592.736000 242.212000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 242.608000 592.736000 246.436000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 246.412000 592.736000 252.568000 580.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 252.916000 592.736000 256.720000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 257.116000 592.736000 261.928000 580.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 261.916000 592.736000 269.644000 580.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 269.716000 592.736000 276.808000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 277.516000 592.736000 281.320000 580.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 281.400000 592.736000 290.976000 580.736000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 291.000000 592.736000 298.224000 580.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 298.200000 592.736000 302.028000 580.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 302.004000 592.736000 309.684000 580.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 309.708000 592.736000 316.800000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 316.812000 592.736000 324.540000 580.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 324.912000 592.736000 328.716000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 329.112000 592.736000 338.688000 580.736000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 338.712000 592.736000 345.864000 580.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 345.816000 592.736000 350.628000 580.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 350.712000 592.736000 357.804000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 358.116000 592.736000 361.920000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 362.412000 592.736000 370.476000 580.736000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 369.912000 592.736000 377.064000 580.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 377.016000 592.736000 382.752000 580.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 382.716000 592.736000 389.976000 580.736000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 390.100000 592.736000 393.904000 580.736000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 394.204000 592.736000 398.008000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.404000 592.736000 402.232000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.208000 592.736000 409.888000 580.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 409.912000 592.736000 417.004000 580.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 417.112000 592.736000 424.264000 580.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 424.312000 592.736000 428.140000 580.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 428.416000 592.736000 432.220000 580.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 432.712000 592.736000 437.152000 580.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 437.116000 592.736000 444.340000 580.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 444.412000 592.736000 450.148000 580.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 450.808000 592.736000 454.612000 580.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 454.700000 592.736000 458.420000 580.736000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 458.396000 592.736000 465.620000 580.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 465.596000 592.736000 473.276000 580.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 473.300000 592.736000 480.980000 580.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 481.004000 592.736000 484.832000 580.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 484.808000 592.736000 492.536000 580.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 492.512000 592.736000 500.192000 580.736000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.300000 592.736000 504.104000 580.736000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 592.736000 507.904000 580.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 578.836000 191.236000 566.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 191.200000 578.836000 198.424000 566.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 198.400000 578.836000 202.228000 566.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 202.204000 578.836000 206.032000 566.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 206.008000 578.836000 213.100000 566.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 213.112000 578.836000 218.848000 566.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 218.812000 578.836000 222.856000 566.836000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 222.916000 578.836000 230.596000 566.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 230.620000 578.836000 234.448000 566.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 234.424000 578.836000 241.576000 566.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 241.624000 578.836000 249.304000 566.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 249.328000 578.836000 253.156000 566.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 253.132000 578.836000 260.860000 566.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 260.836000 578.836000 268.516000 566.836000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 268.600000 578.836000 272.404000 566.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 272.404000 578.836000 279.628000 566.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 279.604000 578.836000 285.340000 566.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 285.304000 578.836000 289.108000 566.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 289.200000 578.836000 296.880000 566.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 296.904000 578.836000 300.732000 566.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 300.708000 578.836000 307.968000 566.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 308.004000 578.836000 311.832000 566.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 311.808000 578.836000 319.536000 566.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 319.512000 578.836000 327.192000 566.836000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 327.200000 578.836000 331.004000 566.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 541.048000 83.620000 525.048000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 83.604000 541.048000 98.372000 525.048000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 98.404000 541.048000 103.876000 525.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.908000 541.048000 120.564000 525.048000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 120.612000 541.048000 137.268000 525.048000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 137.316000 541.048000 142.788000 525.048000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.820000 541.048000 154.196000 525.048000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 154.228000 541.048000 165.668000 525.048000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 165.732000 541.048000 171.300000 525.048000 1.000000 0.000000 0.000000 1.000000
+drawChar 171.332000 541.048000 183.044000 525.048000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 183.028000 541.048000 194.020000 525.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 194.036000 541.048000 205.028000 525.048000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 205.044000 541.048000 210.516000 525.048000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 516.436000 190.240000 504.436000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 190.396000 516.436000 194.200000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 194.596000 516.436000 202.324000 504.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 202.300000 516.436000 209.452000 504.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 209.404000 516.436000 216.172000 504.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 216.208000 516.436000 223.300000 504.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 223.612000 516.436000 227.416000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 227.716000 516.436000 234.868000 504.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 235.120000 516.436000 238.924000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 239.224000 516.436000 245.380000 504.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 245.428000 516.436000 256.804000 504.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 256.732000 516.436000 263.884000 504.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 263.932000 516.436000 267.760000 504.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 267.736000 516.436000 271.564000 504.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 271.636000 516.436000 275.440000 504.436000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 275.740000 516.436000 279.544000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 279.844000 516.436000 286.564000 504.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 286.540000 516.436000 293.764000 504.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 293.740000 516.436000 300.508000 504.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 300.544000 516.436000 307.636000 504.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 307.648000 516.436000 313.384000 504.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 313.444000 516.436000 320.536000 504.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 320.548000 516.436000 328.228000 504.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 328.348000 516.436000 332.152000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 332.548000 516.436000 338.704000 504.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 338.752000 516.436000 349.012000 504.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 348.952000 516.436000 352.780000 504.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 352.852000 516.436000 364.228000 504.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 364.156000 516.436000 375.532000 504.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 375.556000 516.436000 379.384000 504.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 379.456000 516.436000 387.184000 504.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 387.052000 516.436000 394.732000 504.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 395.056000 516.436000 398.860000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 399.160000 516.436000 406.840000 504.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 406.864000 516.436000 414.088000 504.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 414.160000 516.436000 421.384000 504.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 421.360000 516.436000 425.188000 504.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 425.356000 516.436000 429.160000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 429.460000 516.436000 436.684000 504.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 436.756000 516.436000 444.484000 504.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 444.760000 516.436000 448.564000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 448.864000 516.436000 460.240000 504.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 460.264000 516.436000 467.032000 504.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 467.260000 516.436000 471.064000 504.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 471.364000 516.436000 479.044000 504.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 479.068000 516.436000 484.804000 504.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 484.768000 516.436000 491.992000 504.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 491.968000 516.436000 499.648000 504.436000 1.000000 0.000000 0.000000 1.000000 p
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 516.436000 504.044000 504.436000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 502.536000 192.592000 490.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 192.604000 502.536000 198.340000 490.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 198.304000 502.536000 203.116000 490.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 203.200000 502.536000 209.968000 490.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 208.300000 502.536000 212.104000 490.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 213.400000 502.536000 217.204000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 218.404000 502.536000 223.144000 490.536000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 223.108000 502.536000 227.920000 490.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 228.004000 502.536000 231.292000 490.536000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 231.304000 502.536000 237.460000 490.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 238.600000 502.536000 242.404000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 243.700000 502.536000 250.924000 490.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 250.900000 502.536000 258.628000 490.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 258.700000 502.536000 262.528000 490.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 262.504000 502.536000 269.272000 490.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 270.508000 502.536000 274.312000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 275.512000 502.536000 282.664000 490.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 282.712000 502.536000 290.392000 490.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 290.308000 502.536000 297.532000 490.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 297.604000 502.536000 305.332000 490.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 305.308000 502.536000 310.120000 490.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 311.308000 502.536000 315.112000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 316.408000 502.536000 324.040000 490.536000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 324.004000 502.536000 331.636000 490.536000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 332.908000 502.536000 336.712000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 337.912000 502.536000 342.352000 490.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 342.316000 502.536000 347.128000 490.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 347.212000 502.536000 351.016000 490.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 352.216000 502.536000 356.020000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 357.316000 502.536000 361.144000 490.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 361.120000 502.536000 368.344000 490.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 368.416000 502.536000 376.144000 490.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 376.120000 502.536000 383.800000 490.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 383.824000 502.536000 387.628000 490.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 388.828000 502.536000 392.632000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 393.832000 502.536000 401.512000 490.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 401.536000 502.536000 409.264000 490.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 409.240000 502.536000 414.052000 490.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 415.240000 502.536000 419.044000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 420.340000 502.536000 428.068000 490.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 428.044000 502.536000 435.196000 490.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 435.244000 502.536000 441.400000 490.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 442.648000 502.536000 446.452000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 447.652000 502.536000 454.804000 490.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.852000 502.536000 462.580000 490.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 463.756000 502.536000 467.560000 490.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 468.856000 502.536000 472.684000 490.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 472.660000 502.536000 480.388000 490.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 480.460000 502.536000 485.272000 490.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 485.260000 502.536000 492.352000 490.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 492.364000 502.536000 500.044000 490.536000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.100000 502.536000 504.144000 490.536000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 488.636000 191.236000 476.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 191.200000 488.636000 198.352000 476.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 198.400000 488.636000 203.212000 476.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 203.200000 488.636000 210.292000 476.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 210.304000 488.636000 217.984000 476.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 218.008000 488.636000 221.812000 476.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 221.908000 488.636000 228.628000 476.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 228.604000 488.636000 234.340000 476.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 234.304000 488.636000 241.528000 476.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 241.504000 488.636000 247.660000 476.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 247.708000 488.636000 253.864000 476.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 253.804000 488.636000 257.848000 476.636000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 257.908000 488.636000 264.628000 476.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 264.604000 488.636000 272.332000 476.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 272.404000 488.636000 278.140000 476.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 278.008000 488.636000 283.744000 476.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 283.708000 488.636000 290.800000 476.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 290.812000 488.636000 298.540000 476.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 298.612000 488.636000 303.424000 476.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 303.412000 488.636000 307.216000 476.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 307.408000 488.636000 317.668000 476.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 317.704000 488.636000 325.432000 476.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 325.408000 488.636000 329.236000 476.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 329.212000 488.636000 335.932000 476.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 336.016000 488.636000 343.744000 476.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 343.612000 488.636000 347.416000 476.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 347.512000 488.636000 358.888000 476.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 358.816000 488.636000 365.968000 476.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.016000 488.636000 373.276000 476.636000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 373.312000 488.636000 380.404000 476.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 380.416000 488.636000 386.572000 476.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 386.512000 488.636000 390.316000 476.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 390.412000 488.636000 394.240000 476.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 394.312000 488.636000 399.124000 476.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 399.112000 488.636000 402.916000 476.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 402.916000 488.636000 410.596000 476.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 410.620000 488.636000 417.844000 476.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 417.820000 488.636000 423.976000 476.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 424.024000 488.636000 430.180000 476.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 430.120000 488.636000 433.948000 476.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 434.020000 488.636000 441.700000 476.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 441.616000 488.636000 445.444000 476.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.516000 488.636000 452.608000 476.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 452.620000 488.636000 456.424000 476.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 456.424000 488.636000 461.236000 476.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 461.320000 488.636000 468.544000 476.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 468.616000 488.636000 472.420000 476.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 472.516000 488.636000 478.672000 476.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 478.516000 488.636000 488.776000 476.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 488.812000 488.636000 492.640000 476.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 492.616000 488.636000 503.992000 476.636000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 488.636000 507.904000 476.636000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 474.736000 192.652000 462.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 192.700000 474.736000 200.428000 462.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 200.404000 474.736000 208.084000 462.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 208.108000 474.736000 211.912000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 211.912000 474.736000 219.592000 462.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 219.616000 474.736000 226.708000 462.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 226.720000 474.736000 231.532000 462.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 231.520000 474.736000 235.324000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 235.420000 474.736000 242.572000 462.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 242.524000 474.736000 246.328000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 246.424000 474.736000 254.104000 462.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 254.020000 474.736000 261.244000 462.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 261.316000 474.736000 268.540000 462.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 268.516000 474.736000 276.196000 462.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 276.220000 474.736000 280.024000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 280.120000 474.736000 290.380000 462.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 290.320000 474.736000 297.544000 462.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 297.616000 474.736000 303.352000 462.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 303.316000 474.736000 310.576000 462.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 310.612000 474.736000 317.836000 462.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 317.812000 474.736000 325.540000 462.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 325.612000 474.736000 330.424000 462.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 330.412000 474.736000 334.216000 462.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 334.216000 474.736000 338.020000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 338.020000 474.736000 346.012000 462.736000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 346.024000 474.736000 353.752000 462.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 353.728000 474.736000 360.820000 462.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 360.832000 474.736000 364.636000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 364.828000 474.736000 370.984000 462.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 371.032000 474.736000 378.712000 462.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 378.628000 474.736000 385.720000 462.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 385.732000 474.736000 392.824000 462.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 392.836000 474.736000 400.516000 462.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 400.540000 474.736000 404.344000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 404.344000 474.736000 411.568000 462.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 411.544000 474.736000 415.984000 462.736000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 416.044000 474.736000 419.848000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 419.848000 474.736000 424.660000 462.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 424.648000 474.736000 432.376000 462.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 432.448000 474.736000 439.540000 462.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 439.552000 474.736000 443.356000 462.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 443.356000 474.736000 450.076000 462.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 450.160000 474.736000 455.896000 462.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 455.860000 474.736000 463.084000 462.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 463.060000 474.736000 469.216000 462.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 469.264000 474.736000 475.420000 462.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 475.360000 474.736000 479.404000 462.736000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 479.464000 474.736000 486.184000 462.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 486.160000 474.736000 493.888000 462.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 493.864000 474.736000 499.600000 462.736000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 500.000000 474.736000 504.044000 462.736000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 460.836000 191.236000 448.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 191.200000 460.836000 198.292000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 198.304000 460.836000 206.032000 448.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 206.104000 460.836000 210.916000 448.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 211.408000 460.836000 215.212000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 215.704000 460.836000 221.860000 448.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 221.908000 460.836000 228.676000 448.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 228.604000 460.836000 234.760000 448.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 234.808000 460.836000 239.620000 448.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 239.608000 460.836000 246.700000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 246.712000 460.836000 258.088000 448.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 258.616000 460.836000 262.420000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 262.912000 460.836000 269.632000 448.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 269.608000 460.836000 276.760000 448.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 276.808000 460.836000 284.536000 448.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 285.004000 460.836000 288.808000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 289.300000 460.836000 296.980000 448.836000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 297.004000 460.836000 304.096000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 304.600000 460.836000 308.404000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 308.896000 460.836000 316.048000 448.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 316.096000 460.836000 323.776000 448.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 323.692000 460.836000 327.412000 448.836000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 327.496000 460.836000 335.224000 448.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 335.200000 460.836000 341.356000 448.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 341.296000 460.836000 346.108000 448.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 346.192000 460.836000 353.284000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 353.296000 460.836000 360.976000 448.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 361.492000 460.836000 365.296000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 365.788000 460.836000 370.600000 448.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 370.588000 460.836000 377.812000 448.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 378.292000 460.836000 382.096000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 382.696000 460.836000 390.376000 448.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 390.292000 460.836000 394.120000 448.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 394.096000 460.836000 402.616000 448.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 402.700000 460.836000 409.792000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 409.804000 460.836000 415.540000 448.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 415.504000 460.836000 422.596000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 422.608000 460.836000 430.336000 448.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 430.312000 460.836000 435.124000 448.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 435.712000 460.836000 439.516000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 440.008000 460.836000 443.836000 448.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 443.812000 460.836000 450.904000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 450.916000 460.836000 457.684000 448.836000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 457.720000 460.836000 464.812000 448.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 464.824000 460.836000 468.652000 448.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 468.724000 460.836000 474.880000 448.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 474.820000 460.836000 478.624000 448.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 479.116000 460.836000 482.920000 448.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 483.520000 460.836000 491.836000 448.836000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 491.224000 460.836000 498.448000 448.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 498.328000 460.836000 504.064000 448.836000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 460.836000 507.904000 448.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 446.936000 192.652000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 194.800000 446.936000 198.604000 434.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 198.700000 446.936000 206.380000 434.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 206.404000 446.936000 210.232000 434.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 210.208000 446.936000 216.976000 434.936000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 217.012000 446.936000 220.840000 434.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 220.816000 446.936000 228.544000 434.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 228.616000 446.936000 236.296000 434.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 237.316000 446.936000 241.120000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 242.320000 446.936000 250.000000 434.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 249.916000 446.936000 257.140000 434.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 257.212000 446.936000 264.364000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 264.412000 446.936000 270.148000 434.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 270.112000 446.936000 277.792000 434.936000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 277.600000 446.936000 281.404000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 283.600000 446.936000 288.412000 434.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 288.304000 446.936000 296.032000 434.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 296.008000 446.936000 303.232000 434.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 303.304000 446.936000 311.032000 434.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 311.008000 446.936000 318.688000 434.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 318.712000 446.936000 326.440000 434.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 326.416000 446.936000 330.220000 434.936000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 331.312000 446.936000 335.116000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 336.316000 446.936000 341.128000 434.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 341.116000 446.936000 348.844000 434.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 348.916000 446.936000 356.008000 434.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 356.920000 446.936000 360.724000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 361.816000 446.936000 369.496000 434.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 369.520000 446.936000 376.744000 434.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 376.720000 446.936000 383.944000 434.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 383.920000 446.936000 387.748000 434.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 388.924000 446.936000 392.728000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 393.820000 446.936000 397.648000 434.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.624000 446.936000 403.780000 434.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 404.824000 446.936000 408.628000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 409.720000 446.936000 417.448000 434.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 417.424000 446.936000 424.576000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 424.624000 446.936000 429.436000 434.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 429.424000 446.936000 437.152000 434.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 437.128000 446.936000 442.864000 434.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 442.924000 446.936000 450.076000 434.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.028000 446.936000 453.856000 434.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 453.928000 446.936000 457.756000 434.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 457.732000 446.936000 464.500000 434.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 465.628000 446.936000 469.432000 434.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 470.524000 446.936000 481.900000 434.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 481.924000 446.936000 489.652000 434.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 489.628000 446.936000 496.348000 434.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 496.324000 446.936000 504.052000 434.936000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 446.936000 507.904000 434.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 433.036000 190.312000 421.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 433.036000 197.524000 421.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 197.500000 433.036000 204.724000 421.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 204.700000 433.036000 208.504000 421.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 208.504000 433.036000 214.660000 421.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 214.708000 433.036000 226.084000 421.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 226.108000 433.036000 233.260000 421.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 233.308000 433.036000 237.136000 421.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 237.112000 433.036000 240.940000 421.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 240.916000 433.036000 244.720000 421.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+updateFont 103 1 0 0 0 1600.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 72.100000 395.248000 83.012000 379.248000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 80.900000 395.248000 91.748000 379.248000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.796000 395.248000 103.172000 379.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 103.204000 395.248000 114.580000 379.248000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 114.612000 395.248000 120.084000 379.248000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 120.116000 395.248000 129.636000 379.248000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 370.736000 189.304000 358.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 192.004000 370.736000 196.744000 358.736000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 198.100000 370.736000 201.904000 358.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 203.296000 370.736000 209.032000 358.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 208.996000 370.736000 216.088000 358.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 216.100000 370.736000 222.820000 358.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 222.904000 370.736000 229.996000 358.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 230.008000 370.736000 237.736000 358.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 237.712000 370.736000 242.524000 358.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 242.512000 370.736000 246.340000 358.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 246.316000 370.736000 253.084000 358.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 254.416000 370.736000 258.220000 358.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 259.612000 370.736000 266.764000 358.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 266.812000 370.736000 274.492000 358.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 274.408000 370.736000 282.088000 358.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 282.112000 370.736000 289.204000 358.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 289.216000 370.736000 296.896000 358.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 298.216000 370.736000 302.020000 358.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 303.412000 370.736000 310.564000 358.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 311.908000 370.736000 315.712000 358.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 317.104000 370.736000 321.916000 358.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 321.904000 370.736000 328.996000 358.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 329.008000 370.736000 336.736000 358.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 336.808000 370.736000 344.536000 358.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 344.512000 370.736000 348.340000 358.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 348.316000 370.736000 354.472000 358.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 355.816000 370.736000 359.620000 358.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 361.012000 370.736000 367.732000 358.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 367.708000 370.736000 374.932000 358.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 374.908000 370.736000 382.636000 358.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 382.708000 370.736000 388.444000 358.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.408000 370.736000 393.220000 358.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 394.504000 370.736000 398.308000 358.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 399.700000 370.736000 407.380000 358.736000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 407.404000 370.736000 414.496000 358.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 414.508000 370.736000 422.236000 358.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 422.212000 370.736000 426.040000 358.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 426.016000 370.736000 433.744000 358.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 433.816000 370.736000 441.496000 358.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 442.816000 370.736000 446.620000 358.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 448.012000 370.736000 452.824000 358.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 452.812000 370.736000 460.540000 358.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 460.612000 370.736000 467.704000 358.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 469.012000 370.736000 472.816000 358.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 474.208000 370.736000 481.888000 358.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 481.912000 370.736000 489.136000 358.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 489.112000 370.736000 496.336000 358.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 496.312000 370.736000 500.140000 358.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 500.212000 370.736000 504.016000 358.736000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 370.736000 507.904000 358.736000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 356.836000 195.760000 344.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 195.796000 356.836000 199.624000 344.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 199.600000 356.836000 204.412000 344.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 204.400000 356.836000 212.128000 344.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 212.704000 356.836000 216.508000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 217.000000 356.836000 221.812000 344.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 221.800000 356.836000 229.528000 344.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 229.600000 356.836000 236.692000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 237.100000 356.836000 240.904000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 241.504000 356.836000 245.332000 344.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 245.308000 356.836000 252.988000 344.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 253.108000 356.836000 260.200000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 260.212000 356.836000 267.364000 344.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 267.808000 356.836000 271.612000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 272.104000 356.836000 279.328000 344.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 279.400000 356.836000 283.840000 344.836000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 284.296000 356.836000 288.100000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 288.700000 356.836000 295.852000 344.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 295.900000 356.836000 303.580000 344.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 303.496000 356.836000 311.176000 344.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 311.200000 356.836000 315.028000 344.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 315.100000 356.836000 319.912000 344.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 319.900000 356.836000 323.728000 344.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 323.704000 356.836000 330.928000 344.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 330.904000 356.836000 338.632000 344.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 338.704000 356.836000 345.856000 344.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 345.808000 356.836000 349.636000 344.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 350.212000 356.836000 354.016000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.508000 356.836000 361.600000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 361.612000 356.836000 368.368000 344.836000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 368.416000 356.836000 375.508000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 375.520000 356.836000 381.256000 344.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 381.220000 356.836000 387.940000 344.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 387.916000 356.836000 391.744000 344.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 391.816000 356.836000 397.972000 344.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 397.912000 356.836000 405.004000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 405.508000 356.836000 409.312000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 409.912000 356.836000 413.740000 344.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 413.716000 356.836000 421.444000 344.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 422.020000 356.836000 425.824000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 426.316000 356.836000 437.692000 344.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 437.716000 356.836000 441.544000 344.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 441.520000 356.836000 449.248000 344.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 449.224000 356.836000 456.904000 344.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 456.928000 356.836000 460.732000 344.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.224000 356.836000 465.028000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 465.724000 356.836000 470.464000 344.836000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 470.920000 356.836000 474.724000 344.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 475.216000 356.836000 482.308000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 482.320000 356.836000 489.088000 344.836000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 489.124000 356.836000 496.216000 344.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 496.228000 356.836000 503.956000 344.836000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 356.836000 507.904000 344.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 342.936000 193.180000 330.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 193.204000 342.936000 200.296000 330.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 200.308000 342.936000 207.988000 330.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 208.012000 342.936000 215.164000 330.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 215.116000 342.936000 222.844000 330.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 223.720000 342.936000 227.524000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 228.616000 342.936000 233.428000 330.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 233.416000 342.936000 240.568000 330.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 240.520000 342.936000 247.780000 330.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 247.816000 342.936000 251.644000 330.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 251.620000 342.936000 259.348000 330.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 259.324000 342.936000 267.004000 330.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 268.120000 342.936000 271.924000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 272.920000 342.936000 276.748000 330.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 276.724000 342.936000 283.816000 330.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 283.828000 342.936000 289.984000 330.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 290.032000 342.936000 296.188000 330.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 296.236000 342.936000 303.460000 330.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 303.436000 342.936000 311.164000 330.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 311.140000 342.936000 317.296000 330.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 317.344000 342.936000 321.148000 330.936000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 322.048000 342.936000 325.852000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 326.848000 342.936000 330.568000 330.936000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 330.544000 342.936000 338.272000 330.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 338.248000 342.936000 344.404000 330.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.452000 342.936000 349.264000 330.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 350.248000 342.936000 354.052000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 355.048000 342.936000 359.860000 330.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 359.848000 342.936000 367.072000 330.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 368.044000 342.936000 371.848000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.844000 342.936000 380.524000 330.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 380.548000 342.936000 387.640000 330.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 387.652000 342.936000 392.464000 330.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 393.448000 342.936000 397.252000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.248000 342.936000 405.928000 330.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 405.952000 342.936000 413.176000 330.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 413.152000 342.936000 423.412000 330.936000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 423.448000 342.936000 431.176000 330.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 432.052000 342.936000 435.856000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 436.852000 342.936000 441.664000 330.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 441.652000 342.936000 449.380000 330.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 449.452000 342.936000 456.544000 330.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 457.552000 342.936000 461.356000 330.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 462.352000 342.936000 470.032000 330.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 470.056000 342.936000 477.208000 330.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 477.160000 342.936000 483.316000 330.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 483.364000 342.936000 487.192000 330.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 487.168000 342.936000 493.888000 330.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 493.972000 342.936000 500.128000 330.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 500.068000 342.936000 503.872000 330.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 342.936000 507.904000 330.936000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 329.036000 195.604000 317.036000 1.000000 0.000000 0.000000 1.000000 U
+drawChar 195.604000 329.036000 203.332000 317.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 203.308000 329.036000 207.748000 317.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 207.808000 329.036000 215.032000 317.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 215.008000 329.036000 220.744000 317.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 220.708000 329.036000 225.520000 317.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 225.604000 329.036000 233.332000 317.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 233.308000 329.036000 241.036000 317.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 241.012000 329.036000 248.164000 317.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 248.212000 329.036000 253.024000 317.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 253.012000 329.036000 260.104000 317.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 260.116000 329.036000 263.944000 317.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 263.920000 329.036000 270.688000 317.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 269.116000 329.036000 272.920000 317.036000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 273.316000 329.036000 277.120000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 277.612000 329.036000 282.352000 317.036000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 282.712000 329.036000 286.516000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 286.912000 329.036000 293.068000 317.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 293.116000 329.036000 297.928000 317.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 297.916000 329.036000 301.744000 317.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 301.720000 329.036000 305.548000 317.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 305.620000 329.036000 309.448000 317.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 309.820000 329.036000 313.624000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 314.020000 329.036000 325.396000 317.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 325.420000 329.036000 329.248000 317.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 329.224000 329.036000 335.380000 317.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 335.428000 329.036000 341.584000 317.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 342.028000 329.036000 345.832000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 346.228000 329.036000 357.604000 317.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 357.532000 329.036000 364.756000 317.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 364.828000 329.036000 370.564000 317.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 370.528000 329.036000 377.620000 317.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 378.028000 329.036000 381.832000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 382.228000 329.036000 387.040000 317.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 387.028000 329.036000 394.756000 317.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 394.828000 329.036000 401.980000 317.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 401.932000 329.036000 409.660000 317.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 410.128000 329.036000 413.932000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 414.328000 329.036000 419.068000 317.036000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 419.428000 329.036000 423.232000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 423.628000 329.036000 431.356000 317.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 431.332000 329.036000 435.160000 317.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 435.232000 329.036000 440.044000 317.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 440.032000 329.036000 443.836000 317.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.232000 329.036000 448.036000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 448.432000 329.036000 457.096000 317.036000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 457.132000 329.036000 464.860000 317.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 464.836000 329.036000 472.516000 317.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 472.936000 329.036000 476.740000 317.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 477.136000 329.036000 487.396000 317.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 487.432000 329.036000 491.260000 317.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 491.236000 329.036000 496.048000 317.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 496.036000 329.036000 503.764000 317.036000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 329.036000 507.904000 317.036000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 315.136000 196.876000 303.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 196.900000 315.136000 203.668000 303.136000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 205.300000 315.136000 209.104000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 210.700000 315.136000 215.512000 303.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 215.500000 315.136000 222.592000 303.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 222.604000 315.136000 230.332000 303.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 230.404000 315.136000 238.132000 303.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 238.108000 315.136000 241.936000 303.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 241.912000 315.136000 248.068000 303.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 249.616000 315.136000 253.420000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 255.220000 315.136000 262.312000 303.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 262.324000 315.136000 266.152000 303.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 266.128000 315.136000 273.808000 303.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 273.832000 315.136000 281.056000 303.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 281.032000 315.136000 291.292000 303.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 289.936000 315.136000 293.740000 303.136000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 295.336000 315.136000 299.140000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 300.736000 315.136000 305.476000 303.136000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 307.036000 315.136000 310.840000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 312.532000 315.136000 320.212000 303.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 320.236000 315.136000 325.972000 303.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 326.032000 315.136000 333.124000 303.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 333.136000 315.136000 337.576000 303.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 337.540000 315.136000 344.632000 303.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 344.644000 315.136000 350.380000 303.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 351.940000 315.136000 355.744000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 357.436000 315.136000 362.248000 303.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 362.236000 315.136000 369.460000 303.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 371.032000 315.136000 374.836000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 376.528000 315.136000 386.788000 303.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 386.824000 315.136000 393.976000 303.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 393.928000 315.136000 398.740000 303.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 398.728000 315.136000 405.448000 303.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 405.532000 315.136000 413.260000 303.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 414.832000 315.136000 418.636000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 420.232000 315.136000 425.044000 303.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 425.032000 315.136000 432.760000 303.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 432.832000 315.136000 439.924000 303.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 441.532000 315.136000 445.336000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 447.028000 315.136000 454.708000 303.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 454.732000 315.136000 460.468000 303.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 460.432000 315.136000 467.656000 303.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 467.632000 315.136000 475.624000 303.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 475.636000 315.136000 481.792000 303.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 483.436000 315.136000 487.240000 303.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 488.836000 315.136000 496.060000 303.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 496.036000 315.136000 503.764000 303.136000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 315.136000 507.904000 303.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 301.236000 190.312000 289.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 301.236000 197.392000 289.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 197.404000 301.236000 201.232000 289.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 201.304000 301.236000 208.396000 289.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 208.408000 301.236000 215.176000 289.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 215.104000 301.236000 218.932000 289.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 219.004000 301.236000 225.160000 289.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 225.100000 301.236000 228.928000 289.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 229.000000 301.236000 236.224000 289.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 236.200000 301.236000 243.928000 289.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 243.904000 301.236000 247.708000 289.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.100000 301.236000 252.904000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 254.404000 301.236000 264.868000 289.236000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 264.904000 301.236000 272.128000 289.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 272.008000 301.236000 282.268000 289.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 282.304000 301.236000 289.396000 289.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 289.408000 301.236000 296.176000 289.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 296.212000 301.236000 303.304000 289.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 303.316000 301.236000 309.052000 289.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 307.720000 301.236000 311.524000 289.236000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 312.916000 301.236000 316.720000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 318.112000 301.236000 321.940000 289.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 321.916000 301.236000 326.356000 289.236000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 327.820000 301.236000 331.624000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 333.016000 301.236000 337.756000 289.236000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 339.220000 301.236000 343.024000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 344.416000 301.236000 348.244000 289.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 348.220000 301.236000 359.596000 289.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 359.620000 301.236000 367.300000 289.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 367.324000 301.236000 373.060000 289.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 373.024000 301.236000 380.248000 289.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 380.320000 301.236000 387.088000 289.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 387.016000 301.236000 394.108000 289.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 395.512000 301.236000 399.316000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 400.816000 301.236000 407.908000 289.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 407.920000 301.236000 415.648000 289.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 415.624000 301.236000 422.848000 289.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 422.920000 301.236000 430.648000 289.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 430.516000 301.236000 438.196000 289.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 438.220000 301.236000 445.948000 289.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 447.316000 301.236000 451.120000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 452.620000 301.236000 457.432000 289.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 457.420000 301.236000 464.644000 289.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 466.024000 301.236000 469.828000 289.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 471.220000 301.236000 478.372000 289.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 478.420000 301.236000 485.188000 289.236000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 485.116000 301.236000 492.340000 289.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 492.412000 301.236000 496.240000 289.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 496.216000 301.236000 503.896000 289.236000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 301.236000 507.904000 289.236000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 287.336000 196.876000 275.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 196.900000 287.336000 204.052000 275.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 204.004000 287.336000 211.264000 275.336000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 211.300000 287.336000 215.128000 275.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 215.104000 287.336000 222.832000 275.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 222.904000 287.336000 230.584000 275.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 230.704000 287.336000 234.508000 275.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 234.700000 287.336000 241.852000 275.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 241.900000 287.336000 249.628000 275.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 249.700000 287.336000 253.504000 275.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 253.696000 287.336000 260.788000 275.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 260.800000 287.336000 272.176000 275.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 272.104000 287.336000 279.784000 275.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 279.808000 287.336000 286.960000 275.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 286.912000 287.336000 292.648000 275.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 292.708000 287.336000 298.444000 275.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 298.504000 287.336000 305.656000 275.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 305.704000 287.336000 311.860000 275.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 311.800000 287.336000 317.956000 275.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 318.004000 287.336000 329.380000 275.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 329.308000 287.336000 336.400000 275.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 336.508000 287.336000 344.236000 275.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 344.104000 287.336000 348.916000 275.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.108000 287.336000 352.912000 275.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 353.104000 287.336000 360.328000 275.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 360.304000 287.336000 364.744000 275.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 364.804000 287.336000 368.608000 275.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 368.908000 287.336000 380.284000 275.336000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 380.308000 287.336000 387.076000 275.336000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 387.004000 287.336000 393.160000 275.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 393.208000 287.336000 400.300000 275.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 400.312000 287.336000 404.140000 275.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 404.116000 287.336000 408.556000 275.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 408.220000 287.336000 412.024000 275.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 412.024000 287.336000 415.828000 275.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 416.020000 287.336000 420.760000 275.336000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 420.916000 287.336000 424.720000 275.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 424.912000 287.336000 435.172000 275.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 435.208000 287.336000 442.432000 275.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 442.408000 287.336000 450.136000 275.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 450.112000 287.336000 453.940000 275.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 454.012000 287.336000 461.692000 275.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 461.608000 287.336000 465.412000 275.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 465.808000 287.336000 469.636000 275.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 469.612000 287.336000 473.440000 275.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 473.416000 287.336000 480.676000 275.336000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 480.712000 287.336000 487.804000 275.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 487.912000 287.336000 491.716000 275.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 491.908000 287.336000 496.720000 275.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 496.708000 287.336000 503.932000 275.336000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 287.336000 507.904000 275.336000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 273.436000 189.328000 261.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 189.304000 273.436000 197.032000 261.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 197.104000 273.436000 203.872000 261.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 203.800000 273.436000 207.628000 261.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 207.700000 273.436000 212.512000 261.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 212.500000 273.436000 219.592000 261.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 221.500000 273.436000 225.304000 261.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 227.200000 273.436000 238.576000 261.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 238.600000 273.436000 245.368000 261.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 247.300000 273.436000 251.104000 261.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 253.000000 273.436000 260.224000 261.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 260.200000 273.436000 265.012000 261.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 265.000000 273.436000 272.728000 261.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 272.800000 273.436000 279.892000 261.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 279.904000 273.436000 285.640000 261.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 287.500000 273.436000 291.304000 261.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 293.200000 273.436000 298.012000 261.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 298.000000 273.436000 305.092000 261.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 305.104000 273.436000 312.832000 261.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 312.904000 273.436000 320.632000 261.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 320.608000 273.436000 324.436000 261.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 324.412000 273.436000 330.568000 261.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 330.616000 273.436000 334.660000 261.436000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 334.612000 273.436000 342.292000 261.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 342.316000 273.436000 346.144000 261.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 346.216000 273.436000 353.368000 261.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 353.320000 273.436000 360.088000 261.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 360.124000 273.436000 363.952000 261.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 363.928000 273.436000 371.656000 261.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.728000 273.436000 379.408000 261.436000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 381.328000 273.436000 385.132000 261.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 387.028000 273.436000 391.468000 261.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 391.432000 273.436000 397.168000 261.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 397.132000 273.436000 400.960000 261.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 400.936000 273.436000 408.028000 261.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 408.040000 273.436000 415.768000 261.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 415.840000 273.436000 423.520000 261.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 423.436000 273.436000 429.592000 261.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 431.632000 273.436000 435.436000 261.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 437.332000 273.436000 444.556000 261.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 444.532000 273.436000 451.300000 261.436000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 451.336000 273.436000 458.428000 261.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 458.440000 273.436000 464.176000 261.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 466.036000 273.436000 469.840000 261.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 471.736000 273.436000 476.176000 261.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 476.140000 273.436000 483.364000 261.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 483.436000 273.436000 489.172000 261.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 491.032000 273.436000 494.836000 261.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 496.732000 273.436000 503.884000 261.436000 1.000000 0.000000 0.000000 1.000000 a
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 273.436000 507.904000 261.436000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 259.536000 190.312000 247.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 190.300000 259.536000 197.524000 247.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 197.500000 259.536000 205.228000 247.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 205.204000 259.536000 210.940000 247.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 210.904000 259.536000 218.632000 247.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 218.608000 259.536000 225.760000 247.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 225.808000 259.536000 237.184000 247.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 237.208000 259.536000 244.300000 247.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 244.312000 259.536000 252.040000 247.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 252.016000 259.536000 256.828000 247.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 256.816000 259.536000 260.620000 247.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.620000 259.536000 264.424000 247.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 264.424000 259.536000 272.488000 247.536000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 272.524000 259.536000 276.352000 247.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 276.328000 259.536000 284.056000 247.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 284.032000 259.536000 290.188000 247.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 290.236000 259.536000 294.040000 247.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 294.040000 259.536000 297.844000 247.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 297.844000 259.536000 301.672000 247.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 301.648000 259.536000 306.460000 247.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 306.448000 259.536000 310.252000 247.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 310.252000 259.536000 320.512000 247.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 320.548000 259.536000 327.772000 247.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 327.748000 259.536000 335.476000 247.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 335.452000 259.536000 339.280000 247.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 339.256000 259.536000 346.936000 247.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 346.960000 259.536000 350.764000 247.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 350.764000 259.536000 358.444000 247.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 358.468000 259.536000 365.560000 247.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 365.572000 259.536000 369.376000 247.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 369.376000 259.536000 376.528000 247.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 376.576000 259.536000 380.380000 247.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 380.380000 259.536000 388.060000 247.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 388.084000 259.536000 393.820000 247.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 393.784000 259.536000 400.876000 247.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 400.888000 259.536000 408.040000 247.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 408.088000 259.536000 412.900000 247.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 412.888000 259.536000 416.692000 247.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 416.692000 259.536000 423.916000 247.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 423.892000 259.536000 431.572000 247.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 431.596000 259.536000 439.276000 247.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 439.300000 259.536000 446.524000 247.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 446.500000 259.536000 452.236000 247.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 452.200000 259.536000 457.012000 247.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 457.000000 259.536000 464.728000 247.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 464.704000 259.536000 472.432000 247.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 472.408000 259.536000 476.236000 247.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 476.212000 259.536000 481.024000 247.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 481.012000 259.536000 487.780000 247.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 487.816000 259.536000 491.620000 247.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 491.620000 259.536000 496.432000 247.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 496.420000 259.536000 503.644000 247.536000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 504.100000 259.536000 507.904000 247.536000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 185.500000 245.636000 191.656000 233.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 191.704000 245.636000 199.432000 233.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 199.408000 245.636000 206.632000 233.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 206.608000 245.636000 216.868000 233.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 216.904000 245.636000 220.708000 233.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 220.708000 245.636000 227.932000 233.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 227.908000 245.636000 236.428000 233.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 236.404000 245.636000 240.208000 233.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 240.208000 245.636000 245.020000 233.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 245.008000 245.636000 252.736000 233.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 252.712000 245.636000 259.804000 233.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 259.816000 245.636000 263.620000 233.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 263.620000 245.636000 271.348000 233.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 271.324000 245.636000 278.548000 233.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 278.524000 245.636000 286.252000 233.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 286.228000 245.636000 292.384000 233.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 292.432000 245.636000 299.524000 233.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 299.536000 245.636000 304.348000 233.636000 1.000000 0.000000 0.000000 1.000000 !
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 455.600000 86.136000 463.664000 74.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 463.100000 86.136000 470.252000 74.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 470.300000 86.136000 477.980000 74.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 478.004000 86.136000 485.096000 74.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 485.108000 86.136000 488.912000 74.136000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 488.900000 86.136000 496.532000 74.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 496.496000 86.136000 504.128000 74.136000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 13196.000000 0 477.900000 13196.000000 0 477.900000 13505.800000 0 134.300000 13505.800000 0 134.300000 13196.000000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -1240410.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 10207.000000 0 168.100000 10207.000000 0 168.100000 10212.000000 0 76.900000 10212.000000 0 76.900000 10207.000000 0
+eoFillPath subpath 1 163.100000 10211.900000 0 168.100000 10211.900000 0 168.100000 10342.500000 0 163.100000 10342.500000 0 163.100000 10211.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 10212.000000 0 163.100000 10212.000000 0 163.100000 10347.400000 0 72.000000 10347.400000 0 72.000000 10212.000000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 10343.080000 87.320000 10333.080000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 10343.080000 93.420000 10333.080000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 10343.080000 97.510000 10333.080000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 10343.080000 101.420000 10333.080000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 10343.080000 104.170000 10333.080000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 10343.080000 110.530000 10333.080000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 10343.080000 113.270000 10333.080000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 10343.080000 116.470000 10333.080000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 10343.080000 123.480000 10333.080000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 10343.080000 129.610000 10333.080000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 10343.080000 135.090000 10333.080000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 10343.080000 140.890000 10333.080000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 10343.080000 144.820000 10333.080000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 10343.080000 150.920000 10333.080000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 10343.080000 153.670000 10333.080000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 10343.080000 156.470000 10333.080000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 10216.200000 0 168.200000 10216.200000 0 168.200000 10331.400000 0 72.000000 10331.400000 0 72.000000 10216.200000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10284.352000 79.253000 10275.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 10284.352000 86.669000 10275.352000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 10284.352000 90.215000 10275.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 10284.352000 93.077000 10275.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 10284.352000 97.406000 10275.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 10284.352000 100.853000 10275.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 10284.352000 107.324000 10275.352000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 10284.352000 112.337000 10275.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 10284.352000 115.271000 10275.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 10284.352000 118.655000 10275.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 10284.352000 126.512000 10275.352000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 10284.352000 130.805000 10275.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 10284.352000 135.881000 10275.352000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 10284.352000 139.355000 10275.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 10284.352000 147.284000 10275.352000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 10284.352000 150.074000 10275.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 10284.352000 155.897000 10275.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 10284.352000 158.750000 10275.352000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 10284.352000 161.853000 10275.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10273.852000 82.124000 10264.852000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 10273.852000 87.137000 10264.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 10273.852000 90.071000 10264.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 10273.852000 93.356000 10264.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 10273.852000 100.403000 10264.852000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 10273.852000 104.921000 10264.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 10273.852000 109.205000 10264.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 10273.852000 117.737000 10264.852000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 10273.852000 123.119000 10264.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 10273.852000 128.996000 10264.852000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 10273.852000 132.605000 10264.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 10273.852000 138.392000 10264.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 10273.852000 141.749000 10264.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 10273.852000 149.507000 10264.852000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 10273.852000 153.800000 10264.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 10273.852000 158.876000 10264.852000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 10273.852000 161.853000 10264.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10263.352000 81.764000 10254.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 10263.352000 87.596000 10254.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 10263.352000 93.356000 10254.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 10263.352000 102.050000 10254.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 10263.352000 113.822000 10254.352000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 10263.352000 122.651000 10254.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 10263.352000 134.117000 10254.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 10263.352000 138.401000 10254.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 10263.352000 147.149000 10254.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 10263.352000 158.921000 10254.352000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 10263.352000 161.853000 10254.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10252.852000 79.271000 10243.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 10252.852000 84.338000 10243.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 10252.852000 89.621000 10243.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 10252.852000 94.643000 10243.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 10252.852000 100.502000 10243.852000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 10252.852000 106.262000 10243.852000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 10252.852000 111.518000 10243.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 10252.852000 116.216000 10243.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 10252.852000 119.249000 10243.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 10252.852000 122.363000 10243.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 10252.852000 128.186000 10243.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 10252.852000 131.345000 10243.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 10252.852000 137.060000 10243.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 10252.852000 140.147000 10243.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 10252.852000 145.007000 10243.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 10252.852000 148.598000 10243.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 10252.852000 151.460000 10243.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 10252.852000 155.789000 10243.852000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 10252.852000 158.933000 10243.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10242.352000 80.702000 10233.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 10242.352000 83.573000 10233.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 10242.352000 89.396000 10233.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 10242.352000 95.156000 10233.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 10242.352000 100.547000 10233.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 10242.352000 109.052000 10233.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 10242.352000 111.959000 10233.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 10242.352000 117.251000 10233.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 10242.352000 121.904000 10233.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 10242.352000 126.503000 10233.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 10242.352000 129.338000 10233.352000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 10242.352000 134.936000 10233.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 10242.352000 143.441000 10233.352000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 10242.352000 148.796000 10233.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 10242.352000 154.574000 10233.352000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 10242.352000 158.876000 10233.352000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 10242.352000 161.853000 10233.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10231.852000 79.271000 10222.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 10231.852000 85.094000 10222.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 10231.852000 88.703000 10222.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 10231.852000 94.112000 10222.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 10231.852000 97.244000 10222.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 10231.852000 103.058000 10222.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 10231.852000 108.890000 10222.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 10231.852000 111.950000 10222.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 10231.852000 115.271000 10222.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 10231.852000 120.338000 10222.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 10231.852000 125.621000 10222.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 10231.852000 131.363000 10222.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 10231.852000 134.558000 10222.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 10231.852000 140.048000 10222.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 10231.852000 145.430000 10222.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 10231.852000 150.551000 10222.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 10231.852000 155.960000 10222.852000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 10231.852000 158.933000 10222.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10221.352000 80.009000 10212.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 10221.352000 85.364000 10212.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 10221.352000 88.271000 10212.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 10221.352000 91.169000 10212.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 10221.352000 97.955000 10212.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 10221.352000 107.765000 10212.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 10221.352000 110.672000 10212.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 10221.352000 115.964000 10212.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 10221.352000 120.617000 10212.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 10221.352000 125.216000 10212.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 10221.352000 128.051000 10212.352000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 10221.352000 134.954000 10212.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 10221.352000 146.285000 10212.352000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 10221.352000 151.667000 10212.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 10221.352000 155.906000 10212.352000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 10221.352000 159.033000 10212.352000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 10211.900000 0 72.100000 10211.900000 0 72.100000 10347.400000 0 72.000000 10347.400000 0 72.000000 10211.900000 0
+eoFillPath subpath 1 163.100000 10211.900000 0 163.200000 10211.900000 0 163.200000 10347.400000 0 163.100000 10347.400000 0 163.100000 10211.900000 0
+eoFillPath subpath 1 72.000000 10347.300000 0 163.200000 10347.300000 0 163.200000 10347.400000 0 72.000000 10347.400000 0 72.000000 10347.300000 0
+eoFillPath subpath 1 72.000000 10211.900000 0 163.200000 10211.900000 0 163.200000 10212.000000 0 72.000000 10212.000000 0 72.000000 10211.900000 0
+saveState
+eoClipPath subpath 1 96.900000 10287.200000 0 138.300000 10287.200000 0 138.300000 10331.400000 0 96.900000 10331.400000 0 96.900000 10287.200000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -949530.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 9932.400000 0 165.500000 9932.400000 0 165.500000 9937.400000 0 76.900000 9937.400000 0 76.900000 9932.400000 0
+eoFillPath subpath 1 160.500000 9937.300000 0 165.500000 9937.300000 0 165.500000 10093.600000 0 160.500000 10093.600000 0 160.500000 9937.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 9937.400000 0 121.400000 9937.400000 0 121.400000 10098.500000 0 72.000000 10098.500000 0 72.000000 9937.400000 0
+saveState
+eoClipPath subpath 1 72.000000 9937.300000 0 160.500000 9937.300000 0 160.500000 10098.400000 0 72.000000 10098.400000 0 72.000000 9937.300000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -912830.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 10094.180000 89.280000 10084.180000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 10094.180000 95.630000 10084.180000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 10094.180000 99.520000 10084.180000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 10094.180000 102.270000 10084.180000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 10094.180000 108.450000 10084.180000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 10094.180000 112.610000 10084.180000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 10094.180000 118.510000 10084.180000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 10094.180000 121.670000 10084.180000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 10094.180000 124.470000 10084.180000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 10094.180000 130.830000 10084.180000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 10094.180000 133.970000 10084.180000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 10094.180000 137.920000 10084.180000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 10094.180000 144.230000 10084.180000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 10094.180000 150.350000 10084.180000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 10094.180000 153.570000 10084.180000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 10082.480000 95.000000 10072.480000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 10082.480000 97.770000 10072.480000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 10082.480000 103.000000 10072.480000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 10082.480000 109.330000 10072.480000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 10082.480000 117.470000 10072.480000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 10082.480000 123.620000 10072.480000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 10082.480000 128.800000 10072.480000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 10082.480000 135.130000 10072.480000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 10082.480000 141.250000 10072.480000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 10082.480000 145.410000 10072.480000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10067.652000 82.961000 10058.652000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 10067.652000 87.614000 10058.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 10067.652000 93.356000 10058.652000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 10067.652000 98.612000 10058.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 10067.652000 103.733000 10058.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 10067.652000 106.568000 10058.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 10067.652000 111.959000 10058.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 10067.652000 114.866000 10058.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 10067.652000 117.665000 10058.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 10067.652000 122.768000 10058.652000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 10067.652000 125.747000 10058.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 10067.652000 131.651000 10058.652000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 10067.652000 136.907000 10058.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 10067.652000 142.307000 10058.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 10067.652000 148.049000 10058.652000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 10067.652000 150.956000 10058.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 10067.652000 156.302000 10058.652000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 10067.652000 159.253000 10058.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10057.152000 84.095000 10048.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 10057.152000 89.900000 10048.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 10057.152000 95.318000 10048.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 10057.152000 100.349000 10048.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 10057.152000 110.789000 10048.152000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 10057.152000 111.464000 10048.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 10057.152000 114.362000 10048.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 10057.152000 119.348000 10048.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 10057.152000 126.962000 10048.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 10057.152000 132.047000 10048.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 10057.152000 139.958000 10048.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 10057.152000 142.865000 10048.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 10057.152000 147.410000 10048.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 10057.152000 153.287000 10048.152000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 10057.152000 156.333000 10048.152000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10046.652000 84.095000 10037.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 10046.652000 89.468000 10037.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 10046.652000 94.121000 10037.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 10046.652000 99.899000 10037.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 10046.652000 105.218000 10037.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 10046.652000 109.502000 10037.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 10046.652000 115.649000 10037.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 10046.652000 122.327000 10037.652000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 10046.652000 127.718000 10037.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 10046.652000 132.002000 10037.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 10046.652000 138.149000 10037.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 10046.652000 145.205000 10037.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 10046.652000 150.992000 10037.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 10046.652000 156.311000 10037.652000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 10046.652000 159.253000 10037.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10036.152000 82.394000 10027.152000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 10036.152000 86.705000 10027.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 10036.152000 91.322000 10027.152000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 10036.152000 94.913000 10027.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 10036.152000 98.054000 10027.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 10036.152000 102.014000 10027.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 10036.152000 104.876000 10027.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 10036.152000 113.435000 10027.152000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 10036.152000 118.718000 10027.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 10036.152000 121.949000 10027.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 10036.152000 125.063000 10027.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 10036.152000 130.886000 10027.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 10036.152000 134.045000 10027.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 10036.152000 138.005000 10027.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 10036.152000 143.792000 10027.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 10036.152000 149.111000 10027.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 10036.152000 151.964000 10027.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 10036.152000 156.293000 10027.152000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 10036.152000 159.153000 10027.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10025.652000 79.271000 10016.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 10025.652000 82.169000 10016.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 10025.652000 85.526000 10016.652000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 10025.652000 90.818000 10016.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 10025.652000 94.454000 10016.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 10025.652000 99.008000 10016.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 10025.652000 104.318000 10016.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 10025.652000 110.096000 10016.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 10025.652000 115.856000 10016.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 10025.652000 119.546000 10016.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 10025.652000 124.001000 10016.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 10025.652000 129.509000 10016.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 10025.652000 133.145000 10016.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 10025.652000 139.751000 10016.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 10025.652000 145.205000 10016.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 10025.652000 148.841000 10016.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 10025.652000 152.657000 10016.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 10025.652000 156.293000 10016.652000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 10025.652000 159.253000 10016.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10015.152000 84.095000 10006.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 10015.152000 88.406000 10006.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 10015.152000 93.824000 10006.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 10015.152000 99.602000 10006.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 10015.152000 105.362000 10006.152000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 10015.152000 108.422000 10006.152000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 10015.152000 116.747000 10006.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 10015.152000 129.275000 10006.152000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 10015.152000 135.089000 10006.152000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 10015.152000 138.698000 10006.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 10015.152000 141.560000 10006.152000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 10015.152000 146.906000 10006.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 10015.152000 151.190000 10006.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 10015.152000 156.266000 10006.152000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 10015.152000 159.253000 10006.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10004.652000 82.196000 9995.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 10004.652000 87.560000 9995.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 10004.652000 92.213000 9995.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 10004.652000 96.551000 9995.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 10004.652000 101.708000 9995.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 10004.652000 107.216000 9995.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 10004.652000 111.653000 9995.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 10004.652000 118.961000 9995.652000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 10004.652000 124.316000 9995.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 10004.652000 128.654000 9995.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 10004.652000 133.172000 9995.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 10004.652000 138.995000 9995.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 10004.652000 143.612000 9995.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 10004.652000 148.913000 9995.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 10004.652000 153.197000 9995.652000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 10004.652000 156.333000 9995.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9994.152000 80.009000 9985.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 9994.152000 85.319000 9985.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 9994.152000 91.061000 9985.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 9994.152000 100.052000 9985.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 9994.152000 113.993000 9985.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 9994.152000 116.873000 9985.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 9994.152000 120.410000 9985.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 9994.152000 126.296000 9985.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 9994.152000 135.350000 9985.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 9994.152000 145.106000 9985.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 9994.152000 150.893000 9985.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 9994.152000 156.212000 9985.152000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 9994.152000 159.253000 9985.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9983.652000 82.196000 9974.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 9983.652000 87.560000 9974.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 9983.652000 93.392000 9974.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 9983.652000 99.152000 9974.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 9983.652000 101.960000 9974.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 9983.652000 107.306000 9974.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 9983.652000 111.905000 9974.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 9983.652000 115.640000 9974.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 9983.652000 122.444000 9974.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 9983.652000 127.898000 9974.652000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 9983.652000 135.575000 9974.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 9983.652000 141.380000 9974.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 9983.652000 145.241000 9974.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 9983.652000 150.803000 9974.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 9983.652000 156.302000 9974.652000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 9983.652000 159.253000 9974.652000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9973.152000 80.009000 9964.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 9973.152000 85.796000 9964.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 9973.152000 91.115000 9964.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 9973.152000 95.399000 9964.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 9973.152000 100.718000 9964.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 9973.152000 107.054000 9964.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 9973.152000 118.097000 9964.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 9973.152000 123.524000 9964.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 9973.152000 129.401000 9964.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 9973.152000 131.768000 9964.152000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 9973.152000 135.413000 9964.152000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 9973.152000 141.659000 9964.152000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 9973.152000 150.965000 9964.152000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 9973.152000 156.320000 9964.152000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 9973.152000 159.253000 9964.152000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9962.652000 81.017000 9953.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 9962.652000 84.608000 9953.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 9962.652000 89.963000 9953.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 9962.652000 92.870000 9953.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 9962.652000 98.693000 9953.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 9962.652000 103.310000 9953.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 9962.652000 107.243000 9953.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 9962.652000 116.081000 9953.652000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 9962.652000 121.886000 9953.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 9962.652000 127.205000 9953.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 9962.652000 132.983000 9953.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 9962.652000 136.943000 9953.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 9962.652000 143.846000 9953.652000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 9962.652000 148.184000 9953.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 9962.652000 153.260000 9953.652000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 9962.652000 156.433000 9953.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 9952.152000 79.271000 9943.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 9952.152000 85.094000 9943.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 9952.152000 90.854000 9943.152000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 9952.152000 93.653000 9943.152000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 9937.300000 0 72.100000 9937.300000 0 72.100000 10098.500000 0 72.000000 10098.500000 0 72.000000 9937.300000 0
+eoFillPath subpath 1 160.500000 9937.300000 0 160.600000 9937.300000 0 160.600000 10098.500000 0 160.500000 10098.500000 0 160.500000 9937.300000 0
+eoFillPath subpath 1 72.000000 10098.400000 0 160.600000 10098.400000 0 160.600000 10098.500000 0 72.000000 10098.500000 0 72.000000 10098.400000 0
+eoFillPath subpath 1 72.000000 9937.300000 0 160.600000 9937.300000 0 160.600000 9937.400000 0 72.000000 9937.400000 0 72.000000 9937.300000 0
+saveState
+eoClipPath subpath 1 108.000000 9449.900000 0 178.900000 9449.900000 0 178.900000 9506.600000 0 108.000000 9506.600000 0 108.000000 9449.900000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -865800.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 5391.600000 0 165.500000 5391.600000 0 165.500000 5396.600000 0 76.900000 5396.600000 0 76.900000 5391.600000 0
+eoFillPath subpath 1 160.500000 5396.500000 0 165.500000 5396.500000 0 165.500000 5505.300000 0 160.500000 5505.300000 0 160.500000 5396.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 5396.600000 0 160.500000 5396.600000 0 160.500000 5510.200000 0 72.000000 5510.200000 0 72.000000 5396.600000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5505.852000 83.771000 5496.852000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 5505.852000 89.594000 5496.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 5505.852000 92.465000 5496.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 5505.852000 97.568000 5496.852000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 5505.852000 100.943000 5496.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 5505.852000 106.955000 5496.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 5505.852000 110.447000 5496.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 5505.852000 114.425000 5496.852000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 5505.852000 119.717000 5496.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 5505.852000 127.493000 5496.852000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 5505.852000 130.949000 5496.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 5505.852000 136.574000 5496.852000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 5505.852000 141.920000 5496.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 5505.852000 147.365000 5496.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 5505.852000 151.703000 5496.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 5505.852000 156.320000 5496.852000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 5505.852000 159.153000 5496.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5495.352000 81.764000 5486.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 5495.352000 85.130000 5486.352000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 5495.352000 88.712000 5486.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 5495.352000 94.022000 5486.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 5495.352000 98.306000 5486.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 5495.352000 102.455000 5486.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 5495.352000 106.676000 5486.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 5495.352000 110.312000 5486.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 5495.352000 114.920000 5486.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 5495.352000 119.060000 5486.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 5495.352000 125.450000 5486.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 5495.352000 130.832000 5486.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 5495.352000 139.445000 5486.352000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 5495.352000 145.169000 5486.352000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 5495.352000 148.076000 5486.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 5495.352000 153.323000 5486.352000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 5495.352000 156.433000 5486.352000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5484.852000 80.009000 5475.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 5484.852000 82.871000 5475.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 5484.852000 88.316000 5475.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 5484.852000 94.094000 5475.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 5484.852000 96.947000 5475.852000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 5484.852000 104.948000 5475.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 5484.852000 113.705000 5475.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 5484.852000 119.492000 5475.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 5484.852000 124.811000 5475.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 5484.852000 132.848000 5475.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 5484.852000 141.605000 5475.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 5484.852000 144.467000 5475.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 5484.852000 148.103000 5475.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 5484.852000 150.965000 5475.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 5484.852000 156.311000 5475.852000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5484.852000 159.253000 5475.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5474.352000 80.999000 5465.352000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 5474.352000 90.539000 5465.352000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 5474.352000 95.318000 5465.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 5474.352000 99.602000 5465.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 5474.352000 102.473000 5465.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 5474.352000 108.260000 5465.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 5474.352000 110.762000 5465.352000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 5474.352000 115.316000 5465.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 5474.352000 122.156000 5465.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 5474.352000 132.299000 5465.352000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 5474.352000 136.970000 5465.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 5474.352000 139.877000 5465.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 5474.352000 142.775000 5465.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 5474.352000 148.022000 5465.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 5474.352000 152.720000 5465.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 5474.352000 156.311000 5465.352000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5474.352000 159.253000 5465.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5463.852000 83.006000 5454.852000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 5463.852000 88.793000 5454.852000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 5463.852000 91.664000 5454.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 5463.852000 94.562000 5454.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 5463.852000 100.349000 5454.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 5463.852000 103.157000 5454.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 5463.852000 108.980000 5454.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 5463.852000 114.740000 5454.852000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 5463.852000 119.375000 5454.852000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 5463.852000 128.033000 5454.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 5463.852000 141.479000 5454.852000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 5463.852000 146.807000 5454.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 5463.852000 152.684000 5454.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 5463.852000 156.293000 5454.852000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5463.852000 159.253000 5454.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5453.352000 79.730000 5444.352000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 5453.352000 84.005000 5444.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 5453.352000 89.423000 5444.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 5453.352000 98.036000 5444.352000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 5453.352000 121.157000 5444.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 5453.352000 145.115000 5444.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 5453.352000 151.001000 5444.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 5453.352000 156.320000 5444.352000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 5453.352000 159.253000 5444.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5442.852000 83.285000 5433.852000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 5442.852000 89.099000 5433.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 5442.852000 93.401000 5433.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 5442.852000 98.477000 5433.852000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 5442.852000 103.121000 5433.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 5442.852000 105.974000 5433.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 5442.852000 111.320000 5433.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 5442.852000 115.604000 5433.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 5442.852000 123.857000 5433.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 5442.852000 136.007000 5433.852000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 5442.852000 141.794000 5433.852000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 5442.852000 144.665000 5433.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 5442.852000 147.464000 5433.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 5442.852000 153.251000 5433.852000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 5442.852000 156.433000 5433.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5432.352000 79.271000 5423.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 5432.352000 85.094000 5423.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 5432.352000 90.854000 5423.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 5432.352000 96.146000 5423.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 5432.352000 102.302000 5423.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 5432.352000 107.711000 5423.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 5432.352000 113.048000 5423.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 5432.352000 119.204000 5423.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 5432.352000 124.991000 5423.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 5432.352000 130.310000 5423.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 5432.352000 135.647000 5423.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 5432.352000 144.755000 5423.352000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 5432.352000 153.323000 5423.352000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 5432.352000 156.333000 5423.352000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5421.852000 82.160000 5412.852000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 5421.852000 85.067000 5412.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 5421.852000 89.297000 5412.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 5421.852000 94.616000 5412.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 5421.852000 98.747000 5412.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 5421.852000 106.055000 5412.852000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 5421.852000 109.700000 5412.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 5421.852000 115.055000 5412.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 5421.852000 118.601000 5412.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 5421.852000 124.010000 5412.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 5421.852000 128.042000 5412.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 5421.852000 135.998000 5412.852000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 5421.852000 141.785000 5412.852000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 5421.852000 144.656000 5412.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 5421.852000 147.554000 5412.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 5421.852000 153.341000 5412.852000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 5421.852000 156.433000 5412.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 5411.352000 79.271000 5402.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 5411.352000 85.094000 5402.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 5411.352000 90.854000 5402.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 5411.352000 93.743000 5402.352000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 5396.500000 0 72.100000 5396.500000 0 72.100000 5510.200000 0 72.000000 5510.200000 0 72.000000 5396.500000 0
+eoFillPath subpath 1 160.500000 5396.500000 0 160.600000 5396.500000 0 160.600000 5510.200000 0 160.500000 5510.200000 0 160.500000 5396.500000 0
+eoFillPath subpath 1 72.000000 5510.100000 0 160.600000 5510.100000 0 160.600000 5510.200000 0 72.000000 5510.200000 0 72.000000 5510.100000 0
+eoFillPath subpath 1 72.000000 5396.500000 0 160.600000 5396.500000 0 160.600000 5396.600000 0 72.000000 5396.600000 0 72.000000 5396.500000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 11586.000000 0 169.600000 11586.000000 0 169.600000 11591.000000 0 76.900000 11591.000000 0 76.900000 11586.000000 0
+eoFillPath subpath 1 164.600000 11590.900000 0 169.600000 11590.900000 0 169.600000 11706.500000 0 164.600000 11706.500000 0 164.600000 11590.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 11591.000000 0 121.400000 11591.000000 0 121.400000 11711.400000 0 72.000000 11711.400000 0 72.000000 11591.000000 0
+saveState
+eoClipPath subpath 1 72.000000 11590.900000 0 164.600000 11590.900000 0 164.600000 11711.300000 0 72.000000 11711.300000 0 72.000000 11590.900000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -1074070.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 11660.900000 0 93.700000 11660.900000 0 93.700000 11680.100000 0 72.000000 11680.100000 0 72.000000 11660.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 11660.900000 0 169.600000 11660.900000 0 169.600000 11680.100000 0 93.700000 11680.100000 0 93.700000 11660.900000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 11644.200000 0 93.700000 11644.200000 0 93.700000 11660.900000 0 72.000000 11660.900000 0 72.000000 11644.200000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 11644.200000 0 169.600000 11644.200000 0 169.600000 11660.900000 0 93.700000 11660.900000 0 93.700000 11644.200000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 11625.000000 0 93.700000 11625.000000 0 93.700000 11644.200000 0 72.000000 11644.200000 0 72.000000 11625.000000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 11625.000000 0 169.600000 11625.000000 0 169.600000 11644.200000 0 93.700000 11644.200000 0 93.700000 11625.000000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 11605.800000 0 93.700000 11605.800000 0 93.700000 11625.000000 0 72.000000 11625.000000 0 72.000000 11605.800000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 11605.800000 0 169.600000 11605.800000 0 169.600000 11625.000000 0 93.700000 11625.000000 0 93.700000 11605.800000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11707.052000 82.898000 11698.052000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 11707.052000 87.200000 11698.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 11707.052000 90.809000 11698.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 11707.052000 93.671000 11698.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 11707.052000 98.315000 11698.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 11707.052000 101.906000 11698.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 11707.052000 106.514000 11698.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 11707.052000 109.754000 11698.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 11707.052000 112.868000 11698.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 11707.052000 118.691000 11698.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 11707.052000 121.850000 11698.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 11707.052000 125.702000 11698.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 11707.052000 131.588000 11698.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 11707.052000 136.907000 11698.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 11707.052000 140.039000 11698.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 11707.052000 146.078000 11698.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 11707.052000 151.442000 11698.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 11707.052000 154.349000 11698.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 11707.052000 157.148000 11698.052000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 11707.052000 160.433000 11698.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11696.552000 84.095000 11687.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 11696.552000 89.468000 11687.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 11696.552000 94.580000 11687.552000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 11696.552000 97.631000 11687.552000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 11676.152000 104.443000 11667.152000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 11676.152000 109.060000 11667.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 11676.152000 113.398000 11667.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 11676.152000 119.194000 11667.152000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 11676.152000 124.612000 11667.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 11676.152000 127.465000 11667.152000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 11659.452000 101.176000 11650.452000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 11659.452000 104.074000 11650.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 11659.452000 109.420000 11650.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 11659.452000 114.442000 11650.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 11659.452000 120.202000 11650.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 11659.452000 123.811000 11650.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 11659.452000 129.121000 11650.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 11659.452000 134.899000 11650.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 11659.452000 139.516000 11650.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 11659.452000 143.107000 11650.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 11659.452000 148.417000 11650.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 11659.452000 151.270000 11650.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 11659.452000 157.093000 11650.452000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 11642.752000 103.048000 11633.752000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 11642.752000 108.421000 11633.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 11642.752000 113.443000 11633.752000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 11642.752000 118.852000 11633.752000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 11642.752000 124.702000 11633.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 11642.752000 130.021000 11633.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 11642.752000 135.079000 11633.752000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 11623.552000 104.407000 11614.552000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 11623.552000 109.816000 11614.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 11623.552000 115.594000 11614.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 11623.552000 121.354000 11614.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 11623.552000 125.692000 11614.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 11623.552000 128.563000 11614.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 11623.552000 133.954000 11614.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 11623.552000 139.786000 11614.552000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 11590.900000 0 72.100000 11590.900000 0 72.100000 11711.400000 0 72.000000 11711.400000 0 72.000000 11590.900000 0
+eoFillPath subpath 1 164.600000 11590.900000 0 164.700000 11590.900000 0 164.700000 11711.400000 0 164.600000 11711.400000 0 164.600000 11590.900000 0
+eoFillPath subpath 1 72.000000 11711.300000 0 164.700000 11711.300000 0 164.700000 11711.400000 0 72.000000 11711.400000 0 72.000000 11711.300000 0
+eoFillPath subpath 1 72.000000 11590.900000 0 164.700000 11590.900000 0 164.700000 11591.000000 0 72.000000 11591.000000 0 72.000000 11590.900000 0
+eoFillPath subpath 1 91.300000 11605.800000 0 93.700000 11605.800000 0 93.700000 11680.100000 0 91.300000 11680.100000 0 91.300000 11605.800000 0
+eoFillPath subpath 1 72.000000 11625.000000 0 169.600000 11625.000000 0 169.600000 11627.400000 0 72.000000 11627.400000 0 72.000000 11625.000000 0
+eoFillPath subpath 1 72.000000 11677.700000 0 169.600000 11677.700000 0 169.600000 11680.100000 0 72.000000 11680.100000 0 72.000000 11677.700000 0
+eoFillPath subpath 1 72.000000 11605.800000 0 169.600000 11605.800000 0 169.600000 11608.200000 0 72.000000 11608.200000 0 72.000000 11605.800000 0
+saveState
+eoClipPath subpath 1 108.000000 3739.800000 0 150.800000 3739.800000 0 150.800000 3784.100000 0 108.000000 3784.100000 0 108.000000 3739.800000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 -294790.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 2889.900000 0 499.600000 2889.900000 0 499.600000 2895.000000 0 186.800000 2895.000000 0 186.800000 2889.900000 0
+eoFillPath subpath 1 494.500000 2894.900000 0 499.600000 2894.900000 0 499.600000 3083.300000 0 494.500000 3083.300000 0 494.500000 2894.900000 0
+saveState
+eoClipPath subpath 1 181.800000 2894.900000 0 494.500000 2894.900000 0 494.500000 3088.200000 0 181.800000 3088.200000 0 181.800000 2894.900000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 3088.300000 0 494.500000 3088.300000 0 494.500000 3088.300000 0 181.700000 3088.300000 0
+eoFillPath subpath 1 181.700000 3088.300000 0 494.500000 3088.300000 0 494.500000 3087.500000 0 181.700000 3087.500000 0 181.700000 3088.300000 0
+eoFillPath subpath 1 181.700000 3087.500000 0 494.500000 3087.500000 0 494.500000 3086.800000 0 181.700000 3086.800000 0 181.700000 3087.500000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 3086.800000 0 494.500000 3086.800000 0 494.500000 3086.000000 0 181.700000 3086.000000 0 181.700000 3086.800000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 3086.000000 0 494.500000 3086.000000 0 494.500000 3085.200000 0 181.700000 3085.200000 0 181.700000 3086.000000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 3085.200000 0 494.500000 3085.200000 0 494.500000 3084.500000 0 181.700000 3084.500000 0 181.700000 3085.200000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 3084.500000 0 494.500000 3084.500000 0 494.500000 3083.700000 0 181.700000 3083.700000 0 181.700000 3084.500000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 3083.700000 0 494.500000 3083.700000 0 494.500000 3083.000000 0 181.700000 3083.000000 0 181.700000 3083.700000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 3083.000000 0 494.500000 3083.000000 0 494.500000 3082.200000 0 181.700000 3082.200000 0 181.700000 3083.000000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 3082.200000 0 494.500000 3082.200000 0 494.500000 3081.500000 0 181.700000 3081.500000 0 181.700000 3082.200000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 3081.500000 0 494.500000 3081.500000 0 494.500000 3080.700000 0 181.700000 3080.700000 0 181.700000 3081.500000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 3080.700000 0 494.500000 3080.700000 0 494.500000 3079.900000 0 181.700000 3079.900000 0 181.700000 3080.700000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 3079.900000 0 494.500000 3079.900000 0 494.500000 3079.200000 0 181.700000 3079.200000 0 181.700000 3079.900000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 3079.200000 0 494.500000 3079.200000 0 494.500000 3078.400000 0 181.700000 3078.400000 0 181.700000 3079.200000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 3078.400000 0 494.500000 3078.400000 0 494.500000 3077.700000 0 181.700000 3077.700000 0 181.700000 3078.400000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 3077.700000 0 494.500000 3077.700000 0 494.500000 3076.900000 0 181.700000 3076.900000 0 181.700000 3077.700000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 3076.900000 0 494.500000 3076.900000 0 494.500000 3076.100000 0 181.700000 3076.100000 0 181.700000 3076.900000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 3076.100000 0 494.500000 3076.100000 0 494.500000 3075.400000 0 181.700000 3075.400000 0 181.700000 3076.100000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 3075.400000 0 494.500000 3075.400000 0 494.500000 3074.600000 0 181.700000 3074.600000 0 181.700000 3075.400000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 3074.600000 0 494.500000 3074.600000 0 494.500000 3073.900000 0 181.700000 3073.900000 0 181.700000 3074.600000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 3073.900000 0 494.500000 3073.900000 0 494.500000 3073.100000 0 181.700000 3073.100000 0 181.700000 3073.900000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 3073.100000 0 494.500000 3073.100000 0 494.500000 3072.300000 0 181.700000 3072.300000 0 181.700000 3073.100000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 3072.300000 0 494.500000 3072.300000 0 494.500000 3071.600000 0 181.700000 3071.600000 0 181.700000 3072.300000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 3071.600000 0 494.500000 3071.600000 0 494.500000 3070.800000 0 181.700000 3070.800000 0 181.700000 3071.600000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 3070.800000 0 494.500000 3070.800000 0 494.500000 3070.100000 0 181.700000 3070.100000 0 181.700000 3070.800000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 3070.100000 0 494.500000 3070.100000 0 494.500000 3069.300000 0 181.700000 3069.300000 0 181.700000 3070.100000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 3069.300000 0 494.500000 3069.300000 0 494.500000 3068.600000 0 181.700000 3068.600000 0 181.700000 3069.300000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 3068.600000 0 494.500000 3068.600000 0 494.500000 3067.800000 0 181.700000 3067.800000 0 181.700000 3068.600000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 3067.800000 0 494.500000 3067.800000 0 494.500000 3067.000000 0 181.700000 3067.000000 0 181.700000 3067.800000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 3067.000000 0 494.500000 3067.000000 0 494.500000 3066.300000 0 181.700000 3066.300000 0 181.700000 3067.000000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 3066.300000 0 494.500000 3066.300000 0 494.500000 3065.500000 0 181.700000 3065.500000 0 181.700000 3066.300000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 3065.500000 0 494.500000 3065.500000 0 494.500000 3064.800000 0 181.700000 3064.800000 0 181.700000 3065.500000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 3064.800000 0 494.500000 3064.800000 0 494.500000 3064.000000 0 181.700000 3064.000000 0 181.700000 3064.800000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 3064.000000 0 494.500000 3064.000000 0 494.500000 3063.200000 0 181.700000 3063.200000 0 181.700000 3064.000000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 3063.200000 0 494.500000 3063.200000 0 494.500000 3062.500000 0 181.700000 3062.500000 0 181.700000 3063.200000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 3062.500000 0 494.500000 3062.500000 0 494.500000 3061.700000 0 181.700000 3061.700000 0 181.700000 3062.500000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 3061.700000 0 494.500000 3061.700000 0 494.500000 3061.000000 0 181.700000 3061.000000 0 181.700000 3061.700000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 3061.000000 0 494.500000 3061.000000 0 494.500000 3060.200000 0 181.700000 3060.200000 0 181.700000 3061.000000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 3060.200000 0 494.500000 3060.200000 0 494.500000 3059.400000 0 181.700000 3059.400000 0 181.700000 3060.200000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 3059.400000 0 494.500000 3059.400000 0 494.500000 3058.700000 0 181.700000 3058.700000 0 181.700000 3059.400000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 3058.700000 0 494.500000 3058.700000 0 494.500000 3057.900000 0 181.700000 3057.900000 0 181.700000 3058.700000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 3057.900000 0 494.500000 3057.900000 0 494.500000 3057.200000 0 181.700000 3057.200000 0 181.700000 3057.900000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 3057.200000 0 494.500000 3057.200000 0 494.500000 3056.400000 0 181.700000 3056.400000 0 181.700000 3057.200000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 3056.400000 0 494.500000 3056.400000 0 494.500000 3055.700000 0 181.700000 3055.700000 0 181.700000 3056.400000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 3055.700000 0 494.500000 3055.700000 0 494.500000 3054.900000 0 181.700000 3054.900000 0 181.700000 3055.700000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 3054.900000 0 494.500000 3054.900000 0 494.500000 3054.100000 0 181.700000 3054.100000 0 181.700000 3054.900000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 3054.100000 0 494.500000 3054.100000 0 494.500000 3053.400000 0 181.700000 3053.400000 0 181.700000 3054.100000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 3053.400000 0 494.500000 3053.400000 0 494.500000 3052.600000 0 181.700000 3052.600000 0 181.700000 3053.400000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 3052.600000 0 494.500000 3052.600000 0 494.500000 3051.900000 0 181.700000 3051.900000 0 181.700000 3052.600000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 3051.900000 0 494.500000 3051.900000 0 494.500000 3051.100000 0 181.700000 3051.100000 0 181.700000 3051.900000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 3051.100000 0 494.500000 3051.100000 0 494.500000 3050.300000 0 181.700000 3050.300000 0 181.700000 3051.100000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 3050.300000 0 494.500000 3050.300000 0 494.500000 3049.600000 0 181.700000 3049.600000 0 181.700000 3050.300000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 3049.600000 0 494.500000 3049.600000 0 494.500000 3048.800000 0 181.700000 3048.800000 0 181.700000 3049.600000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 3048.800000 0 494.500000 3048.800000 0 494.500000 3048.100000 0 181.700000 3048.100000 0 181.700000 3048.800000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 3048.100000 0 494.500000 3048.100000 0 494.500000 3047.300000 0 181.700000 3047.300000 0 181.700000 3048.100000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 3047.300000 0 494.500000 3047.300000 0 494.500000 3046.500000 0 181.700000 3046.500000 0 181.700000 3047.300000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 3046.500000 0 494.500000 3046.500000 0 494.500000 3045.800000 0 181.700000 3045.800000 0 181.700000 3046.500000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 3045.800000 0 494.500000 3045.800000 0 494.500000 3045.000000 0 181.700000 3045.000000 0 181.700000 3045.800000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 3045.000000 0 494.500000 3045.000000 0 494.500000 3044.300000 0 181.700000 3044.300000 0 181.700000 3045.000000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 3044.300000 0 494.500000 3044.300000 0 494.500000 3043.500000 0 181.700000 3043.500000 0 181.700000 3044.300000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 3043.500000 0 494.500000 3043.500000 0 494.500000 3042.800000 0 181.700000 3042.800000 0 181.700000 3043.500000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 3042.800000 0 494.500000 3042.800000 0 494.500000 3042.000000 0 181.700000 3042.000000 0 181.700000 3042.800000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 3042.000000 0 494.500000 3042.000000 0 494.500000 3041.200000 0 181.700000 3041.200000 0 181.700000 3042.000000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 3041.200000 0 494.500000 3041.200000 0 494.500000 3040.500000 0 181.700000 3040.500000 0 181.700000 3041.200000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 3040.500000 0 494.500000 3040.500000 0 494.500000 3039.700000 0 181.700000 3039.700000 0 181.700000 3040.500000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 3039.700000 0 494.500000 3039.700000 0 494.500000 3039.000000 0 181.700000 3039.000000 0 181.700000 3039.700000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 3039.000000 0 494.500000 3039.000000 0 494.500000 3038.200000 0 181.700000 3038.200000 0 181.700000 3039.000000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 3038.200000 0 494.500000 3038.200000 0 494.500000 3037.400000 0 181.700000 3037.400000 0 181.700000 3038.200000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 3037.400000 0 494.500000 3037.400000 0 494.500000 3036.700000 0 181.700000 3036.700000 0 181.700000 3037.400000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 3036.700000 0 494.500000 3036.700000 0 494.500000 3035.900000 0 181.700000 3035.900000 0 181.700000 3036.700000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 3035.900000 0 494.500000 3035.900000 0 494.500000 3035.200000 0 181.700000 3035.200000 0 181.700000 3035.900000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 3035.200000 0 494.500000 3035.200000 0 494.500000 3034.400000 0 181.700000 3034.400000 0 181.700000 3035.200000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 3034.400000 0 494.500000 3034.400000 0 494.500000 3033.600000 0 181.700000 3033.600000 0 181.700000 3034.400000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 3033.600000 0 494.500000 3033.600000 0 494.500000 3032.900000 0 181.700000 3032.900000 0 181.700000 3033.600000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 3032.900000 0 494.500000 3032.900000 0 494.500000 3032.100000 0 181.700000 3032.100000 0 181.700000 3032.900000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 3032.100000 0 494.500000 3032.100000 0 494.500000 3031.400000 0 181.700000 3031.400000 0 181.700000 3032.100000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 3031.400000 0 494.500000 3031.400000 0 494.500000 3030.600000 0 181.700000 3030.600000 0 181.700000 3031.400000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 3030.600000 0 494.500000 3030.600000 0 494.500000 3029.900000 0 181.700000 3029.900000 0 181.700000 3030.600000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 3029.900000 0 494.500000 3029.900000 0 494.500000 3029.100000 0 181.700000 3029.100000 0 181.700000 3029.900000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 3029.100000 0 494.500000 3029.100000 0 494.500000 3028.300000 0 181.700000 3028.300000 0 181.700000 3029.100000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 3028.300000 0 494.500000 3028.300000 0 494.500000 3027.600000 0 181.700000 3027.600000 0 181.700000 3028.300000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 3027.600000 0 494.500000 3027.600000 0 494.500000 3026.800000 0 181.700000 3026.800000 0 181.700000 3027.600000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 3026.800000 0 494.500000 3026.800000 0 494.500000 3026.100000 0 181.700000 3026.100000 0 181.700000 3026.800000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 3026.100000 0 494.500000 3026.100000 0 494.500000 3025.300000 0 181.700000 3025.300000 0 181.700000 3026.100000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 3025.300000 0 494.500000 3025.300000 0 494.500000 3024.500000 0 181.700000 3024.500000 0 181.700000 3025.300000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 3024.500000 0 494.500000 3024.500000 0 494.500000 3023.800000 0 181.700000 3023.800000 0 181.700000 3024.500000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 3023.800000 0 494.500000 3023.800000 0 494.500000 3023.000000 0 181.700000 3023.000000 0 181.700000 3023.800000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 3023.000000 0 494.500000 3023.000000 0 494.500000 3022.300000 0 181.700000 3022.300000 0 181.700000 3023.000000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 3022.300000 0 494.500000 3022.300000 0 494.500000 3021.500000 0 181.700000 3021.500000 0 181.700000 3022.300000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 3021.500000 0 494.500000 3021.500000 0 494.500000 3020.700000 0 181.700000 3020.700000 0 181.700000 3021.500000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 3020.700000 0 494.500000 3020.700000 0 494.500000 3020.000000 0 181.700000 3020.000000 0 181.700000 3020.700000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 3020.000000 0 494.500000 3020.000000 0 494.500000 3019.200000 0 181.700000 3019.200000 0 181.700000 3020.000000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 3019.200000 0 494.500000 3019.200000 0 494.500000 3018.500000 0 181.700000 3018.500000 0 181.700000 3019.200000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 3018.500000 0 494.500000 3018.500000 0 494.500000 3017.700000 0 181.700000 3017.700000 0 181.700000 3018.500000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 3017.700000 0 494.500000 3017.700000 0 494.500000 3017.000000 0 181.700000 3017.000000 0 181.700000 3017.700000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 3017.000000 0 494.500000 3017.000000 0 494.500000 3016.200000 0 181.700000 3016.200000 0 181.700000 3017.000000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 3016.200000 0 494.500000 3016.200000 0 494.500000 3015.400000 0 181.700000 3015.400000 0 181.700000 3016.200000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 3015.400000 0 494.500000 3015.400000 0 494.500000 3014.700000 0 181.700000 3014.700000 0 181.700000 3015.400000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 3014.700000 0 494.500000 3014.700000 0 494.500000 3013.900000 0 181.700000 3013.900000 0 181.700000 3014.700000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 3013.900000 0 494.500000 3013.900000 0 494.500000 3013.200000 0 181.700000 3013.200000 0 181.700000 3013.900000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 3013.200000 0 494.500000 3013.200000 0 494.500000 3012.400000 0 181.700000 3012.400000 0 181.700000 3013.200000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 3012.400000 0 494.500000 3012.400000 0 494.500000 3011.600000 0 181.700000 3011.600000 0 181.700000 3012.400000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 3011.600000 0 494.500000 3011.600000 0 494.500000 3010.900000 0 181.700000 3010.900000 0 181.700000 3011.600000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 3010.900000 0 494.500000 3010.900000 0 494.500000 3010.100000 0 181.700000 3010.100000 0 181.700000 3010.900000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 3010.100000 0 494.500000 3010.100000 0 494.500000 3009.400000 0 181.700000 3009.400000 0 181.700000 3010.100000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 3009.400000 0 494.500000 3009.400000 0 494.500000 3008.600000 0 181.700000 3008.600000 0 181.700000 3009.400000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 3008.600000 0 494.500000 3008.600000 0 494.500000 3007.800000 0 181.700000 3007.800000 0 181.700000 3008.600000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 3007.800000 0 494.500000 3007.800000 0 494.500000 3007.100000 0 181.700000 3007.100000 0 181.700000 3007.800000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 3007.100000 0 494.500000 3007.100000 0 494.500000 3006.300000 0 181.700000 3006.300000 0 181.700000 3007.100000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 3006.300000 0 494.500000 3006.300000 0 494.500000 3005.600000 0 181.700000 3005.600000 0 181.700000 3006.300000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 3005.600000 0 494.500000 3005.600000 0 494.500000 3004.800000 0 181.700000 3004.800000 0 181.700000 3005.600000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 3004.800000 0 494.500000 3004.800000 0 494.500000 3004.100000 0 181.700000 3004.100000 0 181.700000 3004.800000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 3004.100000 0 494.500000 3004.100000 0 494.500000 3003.300000 0 181.700000 3003.300000 0 181.700000 3004.100000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 3003.300000 0 494.500000 3003.300000 0 494.500000 3002.500000 0 181.700000 3002.500000 0 181.700000 3003.300000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 3002.500000 0 494.500000 3002.500000 0 494.500000 3001.800000 0 181.700000 3001.800000 0 181.700000 3002.500000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 3001.800000 0 494.500000 3001.800000 0 494.500000 3001.000000 0 181.700000 3001.000000 0 181.700000 3001.800000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 3001.000000 0 494.500000 3001.000000 0 494.500000 3000.300000 0 181.700000 3000.300000 0 181.700000 3001.000000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 3000.300000 0 494.500000 3000.300000 0 494.500000 2999.500000 0 181.700000 2999.500000 0 181.700000 3000.300000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 2999.500000 0 494.500000 2999.500000 0 494.500000 2998.700000 0 181.700000 2998.700000 0 181.700000 2999.500000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 2998.700000 0 494.500000 2998.700000 0 494.500000 2998.000000 0 181.700000 2998.000000 0 181.700000 2998.700000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 2998.000000 0 494.500000 2998.000000 0 494.500000 2997.200000 0 181.700000 2997.200000 0 181.700000 2998.000000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 2997.200000 0 494.500000 2997.200000 0 494.500000 2996.500000 0 181.700000 2996.500000 0 181.700000 2997.200000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 2996.500000 0 494.500000 2996.500000 0 494.500000 2995.700000 0 181.700000 2995.700000 0 181.700000 2996.500000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 2995.700000 0 494.500000 2995.700000 0 494.500000 2994.900000 0 181.700000 2994.900000 0 181.700000 2995.700000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 2994.900000 0 494.500000 2994.900000 0 494.500000 2994.200000 0 181.700000 2994.200000 0 181.700000 2994.900000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 2994.200000 0 494.500000 2994.200000 0 494.500000 2993.400000 0 181.700000 2993.400000 0 181.700000 2994.200000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 2993.400000 0 494.500000 2993.400000 0 494.500000 2992.700000 0 181.700000 2992.700000 0 181.700000 2993.400000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 2992.700000 0 494.500000 2992.700000 0 494.500000 2991.900000 0 181.700000 2991.900000 0 181.700000 2992.700000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 2991.900000 0 494.500000 2991.900000 0 494.500000 2991.200000 0 181.700000 2991.200000 0 181.700000 2991.900000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 2991.200000 0 494.500000 2991.200000 0 494.500000 2990.400000 0 181.700000 2990.400000 0 181.700000 2991.200000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 2990.400000 0 494.500000 2990.400000 0 494.500000 2989.600000 0 181.700000 2989.600000 0 181.700000 2990.400000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 2989.600000 0 494.500000 2989.600000 0 494.500000 2988.900000 0 181.700000 2988.900000 0 181.700000 2989.600000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 2988.900000 0 494.500000 2988.900000 0 494.500000 2988.100000 0 181.700000 2988.100000 0 181.700000 2988.900000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 2988.100000 0 494.500000 2988.100000 0 494.500000 2987.400000 0 181.700000 2987.400000 0 181.700000 2988.100000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 2987.400000 0 494.500000 2987.400000 0 494.500000 2986.600000 0 181.700000 2986.600000 0 181.700000 2987.400000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 2986.600000 0 494.500000 2986.600000 0 494.500000 2985.800000 0 181.700000 2985.800000 0 181.700000 2986.600000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 2985.800000 0 494.500000 2985.800000 0 494.500000 2985.100000 0 181.700000 2985.100000 0 181.700000 2985.800000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 2985.100000 0 494.500000 2985.100000 0 494.500000 2984.300000 0 181.700000 2984.300000 0 181.700000 2985.100000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 2984.300000 0 494.500000 2984.300000 0 494.500000 2983.600000 0 181.700000 2983.600000 0 181.700000 2984.300000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 2983.600000 0 494.500000 2983.600000 0 494.500000 2982.800000 0 181.700000 2982.800000 0 181.700000 2983.600000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 2982.800000 0 494.500000 2982.800000 0 494.500000 2982.000000 0 181.700000 2982.000000 0 181.700000 2982.800000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 2982.000000 0 494.500000 2982.000000 0 494.500000 2981.300000 0 181.700000 2981.300000 0 181.700000 2982.000000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 2981.300000 0 494.500000 2981.300000 0 494.500000 2980.500000 0 181.700000 2980.500000 0 181.700000 2981.300000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 2980.500000 0 494.500000 2980.500000 0 494.500000 2979.800000 0 181.700000 2979.800000 0 181.700000 2980.500000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 2979.800000 0 494.500000 2979.800000 0 494.500000 2979.000000 0 181.700000 2979.000000 0 181.700000 2979.800000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 2979.000000 0 494.500000 2979.000000 0 494.500000 2978.300000 0 181.700000 2978.300000 0 181.700000 2979.000000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 2978.300000 0 494.500000 2978.300000 0 494.500000 2977.500000 0 181.700000 2977.500000 0 181.700000 2978.300000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 2977.500000 0 494.500000 2977.500000 0 494.500000 2976.700000 0 181.700000 2976.700000 0 181.700000 2977.500000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 2976.700000 0 494.500000 2976.700000 0 494.500000 2976.000000 0 181.700000 2976.000000 0 181.700000 2976.700000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 2976.000000 0 494.500000 2976.000000 0 494.500000 2975.200000 0 181.700000 2975.200000 0 181.700000 2976.000000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 2975.200000 0 494.500000 2975.200000 0 494.500000 2974.500000 0 181.700000 2974.500000 0 181.700000 2975.200000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 2974.500000 0 494.500000 2974.500000 0 494.500000 2973.700000 0 181.700000 2973.700000 0 181.700000 2974.500000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 2973.700000 0 494.500000 2973.700000 0 494.500000 2972.900000 0 181.700000 2972.900000 0 181.700000 2973.700000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 2972.900000 0 494.500000 2972.900000 0 494.500000 2972.200000 0 181.700000 2972.200000 0 181.700000 2972.900000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 2972.200000 0 494.500000 2972.200000 0 494.500000 2971.400000 0 181.700000 2971.400000 0 181.700000 2972.200000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 2971.400000 0 494.500000 2971.400000 0 494.500000 2970.700000 0 181.700000 2970.700000 0 181.700000 2971.400000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 2970.700000 0 494.500000 2970.700000 0 494.500000 2969.900000 0 181.700000 2969.900000 0 181.700000 2970.700000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 2969.900000 0 494.500000 2969.900000 0 494.500000 2969.100000 0 181.700000 2969.100000 0 181.700000 2969.900000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 2969.100000 0 494.500000 2969.100000 0 494.500000 2968.400000 0 181.700000 2968.400000 0 181.700000 2969.100000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 2968.400000 0 494.500000 2968.400000 0 494.500000 2967.600000 0 181.700000 2967.600000 0 181.700000 2968.400000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 2967.600000 0 494.500000 2967.600000 0 494.500000 2966.900000 0 181.700000 2966.900000 0 181.700000 2967.600000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 2966.900000 0 494.500000 2966.900000 0 494.500000 2966.100000 0 181.700000 2966.100000 0 181.700000 2966.900000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 2966.100000 0 494.500000 2966.100000 0 494.500000 2965.400000 0 181.700000 2965.400000 0 181.700000 2966.100000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 2965.400000 0 494.500000 2965.400000 0 494.500000 2964.600000 0 181.700000 2964.600000 0 181.700000 2965.400000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 2964.600000 0 494.500000 2964.600000 0 494.500000 2963.800000 0 181.700000 2963.800000 0 181.700000 2964.600000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 2963.800000 0 494.500000 2963.800000 0 494.500000 2963.100000 0 181.700000 2963.100000 0 181.700000 2963.800000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 2963.100000 0 494.500000 2963.100000 0 494.500000 2962.300000 0 181.700000 2962.300000 0 181.700000 2963.100000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 2962.300000 0 494.500000 2962.300000 0 494.500000 2961.600000 0 181.700000 2961.600000 0 181.700000 2962.300000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 2961.600000 0 494.500000 2961.600000 0 494.500000 2960.800000 0 181.700000 2960.800000 0 181.700000 2961.600000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 2960.800000 0 494.500000 2960.800000 0 494.500000 2960.100000 0 181.700000 2960.100000 0 181.700000 2960.800000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 2960.100000 0 494.500000 2960.100000 0 494.500000 2959.300000 0 181.700000 2959.300000 0 181.700000 2960.100000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 2959.300000 0 494.500000 2959.300000 0 494.500000 2958.500000 0 181.700000 2958.500000 0 181.700000 2959.300000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 2958.500000 0 494.500000 2958.500000 0 494.500000 2957.800000 0 181.700000 2957.800000 0 181.700000 2958.500000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 2957.800000 0 494.500000 2957.800000 0 494.500000 2957.000000 0 181.700000 2957.000000 0 181.700000 2957.800000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 2957.000000 0 494.500000 2957.000000 0 494.500000 2956.300000 0 181.700000 2956.300000 0 181.700000 2957.000000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 2956.300000 0 494.500000 2956.300000 0 494.500000 2955.500000 0 181.700000 2955.500000 0 181.700000 2956.300000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 2955.500000 0 494.500000 2955.500000 0 494.500000 2954.700000 0 181.700000 2954.700000 0 181.700000 2955.500000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 2954.700000 0 494.500000 2954.700000 0 494.500000 2954.000000 0 181.700000 2954.000000 0 181.700000 2954.700000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 2954.000000 0 494.500000 2954.000000 0 494.500000 2953.200000 0 181.700000 2953.200000 0 181.700000 2954.000000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 2953.200000 0 494.500000 2953.200000 0 494.500000 2952.500000 0 181.700000 2952.500000 0 181.700000 2953.200000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 2952.500000 0 494.500000 2952.500000 0 494.500000 2951.700000 0 181.700000 2951.700000 0 181.700000 2952.500000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 2951.700000 0 494.500000 2951.700000 0 494.500000 2951.000000 0 181.700000 2951.000000 0 181.700000 2951.700000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 2951.000000 0 494.500000 2951.000000 0 494.500000 2950.200000 0 181.700000 2950.200000 0 181.700000 2951.000000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 2950.200000 0 494.500000 2950.200000 0 494.500000 2949.400000 0 181.700000 2949.400000 0 181.700000 2950.200000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 2949.400000 0 494.500000 2949.400000 0 494.500000 2948.700000 0 181.700000 2948.700000 0 181.700000 2949.400000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 2948.700000 0 494.500000 2948.700000 0 494.500000 2947.900000 0 181.700000 2947.900000 0 181.700000 2948.700000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 2947.900000 0 494.500000 2947.900000 0 494.500000 2947.200000 0 181.700000 2947.200000 0 181.700000 2947.900000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 2947.200000 0 494.500000 2947.200000 0 494.500000 2946.400000 0 181.700000 2946.400000 0 181.700000 2947.200000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 2946.400000 0 494.500000 2946.400000 0 494.500000 2945.700000 0 181.700000 2945.700000 0 181.700000 2946.400000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 2945.700000 0 494.500000 2945.700000 0 494.500000 2944.900000 0 181.700000 2944.900000 0 181.700000 2945.700000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 2944.900000 0 494.500000 2944.900000 0 494.500000 2944.100000 0 181.700000 2944.100000 0 181.700000 2944.900000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 2944.100000 0 494.500000 2944.100000 0 494.500000 2943.400000 0 181.700000 2943.400000 0 181.700000 2944.100000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 2943.400000 0 494.500000 2943.400000 0 494.500000 2942.600000 0 181.700000 2942.600000 0 181.700000 2943.400000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 2942.600000 0 494.500000 2942.600000 0 494.500000 2941.900000 0 181.700000 2941.900000 0 181.700000 2942.600000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 2941.900000 0 494.500000 2941.900000 0 494.500000 2941.100000 0 181.700000 2941.100000 0 181.700000 2941.900000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 2941.100000 0 494.500000 2941.100000 0 494.500000 2940.300000 0 181.700000 2940.300000 0 181.700000 2941.100000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 2940.300000 0 494.500000 2940.300000 0 494.500000 2939.600000 0 181.700000 2939.600000 0 181.700000 2940.300000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 2939.600000 0 494.500000 2939.600000 0 494.500000 2938.800000 0 181.700000 2938.800000 0 181.700000 2939.600000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 2938.800000 0 494.500000 2938.800000 0 494.500000 2938.100000 0 181.700000 2938.100000 0 181.700000 2938.800000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 2938.100000 0 494.500000 2938.100000 0 494.500000 2937.300000 0 181.700000 2937.300000 0 181.700000 2938.100000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 2937.300000 0 494.500000 2937.300000 0 494.500000 2936.600000 0 181.700000 2936.600000 0 181.700000 2937.300000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 2936.600000 0 494.500000 2936.600000 0 494.500000 2935.800000 0 181.700000 2935.800000 0 181.700000 2936.600000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 2935.800000 0 494.500000 2935.800000 0 494.500000 2935.000000 0 181.700000 2935.000000 0 181.700000 2935.800000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 2935.000000 0 494.500000 2935.000000 0 494.500000 2934.300000 0 181.700000 2934.300000 0 181.700000 2935.000000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 2934.300000 0 494.500000 2934.300000 0 494.500000 2933.500000 0 181.700000 2933.500000 0 181.700000 2934.300000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 2933.500000 0 494.500000 2933.500000 0 494.500000 2932.800000 0 181.700000 2932.800000 0 181.700000 2933.500000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 2932.800000 0 494.500000 2932.800000 0 494.500000 2932.000000 0 181.700000 2932.000000 0 181.700000 2932.800000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 2932.000000 0 494.500000 2932.000000 0 494.500000 2931.200000 0 181.700000 2931.200000 0 181.700000 2932.000000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 2931.200000 0 494.500000 2931.200000 0 494.500000 2930.500000 0 181.700000 2930.500000 0 181.700000 2931.200000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 2930.500000 0 494.500000 2930.500000 0 494.500000 2929.700000 0 181.700000 2929.700000 0 181.700000 2930.500000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 2929.700000 0 494.500000 2929.700000 0 494.500000 2929.000000 0 181.700000 2929.000000 0 181.700000 2929.700000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 2929.000000 0 494.500000 2929.000000 0 494.500000 2928.200000 0 181.700000 2928.200000 0 181.700000 2929.000000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 2928.200000 0 494.500000 2928.200000 0 494.500000 2927.400000 0 181.700000 2927.400000 0 181.700000 2928.200000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 2927.400000 0 494.500000 2927.400000 0 494.500000 2926.700000 0 181.700000 2926.700000 0 181.700000 2927.400000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 2926.700000 0 494.500000 2926.700000 0 494.500000 2925.900000 0 181.700000 2925.900000 0 181.700000 2926.700000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 2925.900000 0 494.500000 2925.900000 0 494.500000 2925.200000 0 181.700000 2925.200000 0 181.700000 2925.900000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 2925.200000 0 494.500000 2925.200000 0 494.500000 2924.400000 0 181.700000 2924.400000 0 181.700000 2925.200000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 2924.400000 0 494.500000 2924.400000 0 494.500000 2923.700000 0 181.700000 2923.700000 0 181.700000 2924.400000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 2923.700000 0 494.500000 2923.700000 0 494.500000 2922.900000 0 181.700000 2922.900000 0 181.700000 2923.700000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 2922.900000 0 494.500000 2922.900000 0 494.500000 2922.100000 0 181.700000 2922.100000 0 181.700000 2922.900000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 2922.100000 0 494.500000 2922.100000 0 494.500000 2921.400000 0 181.700000 2921.400000 0 181.700000 2922.100000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 2921.400000 0 494.500000 2921.400000 0 494.500000 2920.600000 0 181.700000 2920.600000 0 181.700000 2921.400000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 2920.600000 0 494.500000 2920.600000 0 494.500000 2919.900000 0 181.700000 2919.900000 0 181.700000 2920.600000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 2919.900000 0 494.500000 2919.900000 0 494.500000 2919.100000 0 181.700000 2919.100000 0 181.700000 2919.900000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 2919.100000 0 494.500000 2919.100000 0 494.500000 2918.300000 0 181.700000 2918.300000 0 181.700000 2919.100000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 2918.300000 0 494.500000 2918.300000 0 494.500000 2917.600000 0 181.700000 2917.600000 0 181.700000 2918.300000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 2917.600000 0 494.500000 2917.600000 0 494.500000 2916.800000 0 181.700000 2916.800000 0 181.700000 2917.600000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 2916.800000 0 494.500000 2916.800000 0 494.500000 2916.100000 0 181.700000 2916.100000 0 181.700000 2916.800000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 2916.100000 0 494.500000 2916.100000 0 494.500000 2915.300000 0 181.700000 2915.300000 0 181.700000 2916.100000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 2915.300000 0 494.500000 2915.300000 0 494.500000 2914.500000 0 181.700000 2914.500000 0 181.700000 2915.300000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 2914.500000 0 494.500000 2914.500000 0 494.500000 2913.800000 0 181.700000 2913.800000 0 181.700000 2914.500000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 2913.800000 0 494.500000 2913.800000 0 494.500000 2913.000000 0 181.700000 2913.000000 0 181.700000 2913.800000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 2913.000000 0 494.500000 2913.000000 0 494.500000 2912.300000 0 181.700000 2912.300000 0 181.700000 2913.000000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 2912.300000 0 494.500000 2912.300000 0 494.500000 2911.500000 0 181.700000 2911.500000 0 181.700000 2912.300000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 2911.500000 0 494.500000 2911.500000 0 494.500000 2910.800000 0 181.700000 2910.800000 0 181.700000 2911.500000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 2910.800000 0 494.500000 2910.800000 0 494.500000 2910.000000 0 181.700000 2910.000000 0 181.700000 2910.800000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 2910.000000 0 494.500000 2910.000000 0 494.500000 2909.200000 0 181.700000 2909.200000 0 181.700000 2910.000000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 2909.200000 0 494.500000 2909.200000 0 494.500000 2908.500000 0 181.700000 2908.500000 0 181.700000 2909.200000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 2908.500000 0 494.500000 2908.500000 0 494.500000 2907.700000 0 181.700000 2907.700000 0 181.700000 2908.500000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 2907.700000 0 494.500000 2907.700000 0 494.500000 2907.000000 0 181.700000 2907.000000 0 181.700000 2907.700000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 2907.000000 0 494.500000 2907.000000 0 494.500000 2906.200000 0 181.700000 2906.200000 0 181.700000 2907.000000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 2906.200000 0 494.500000 2906.200000 0 494.500000 2905.400000 0 181.700000 2905.400000 0 181.700000 2906.200000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 2905.400000 0 494.500000 2905.400000 0 494.500000 2904.700000 0 181.700000 2904.700000 0 181.700000 2905.400000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 2904.700000 0 494.500000 2904.700000 0 494.500000 2903.900000 0 181.700000 2903.900000 0 181.700000 2904.700000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 2903.900000 0 494.500000 2903.900000 0 494.500000 2903.200000 0 181.700000 2903.200000 0 181.700000 2903.900000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 2903.200000 0 494.500000 2903.200000 0 494.500000 2902.400000 0 181.700000 2902.400000 0 181.700000 2903.200000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 2902.400000 0 494.500000 2902.400000 0 494.500000 2901.600000 0 181.700000 2901.600000 0 181.700000 2902.400000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 2901.600000 0 494.500000 2901.600000 0 494.500000 2900.900000 0 181.700000 2900.900000 0 181.700000 2901.600000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 2900.900000 0 494.500000 2900.900000 0 494.500000 2900.100000 0 181.700000 2900.100000 0 181.700000 2900.900000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 2900.100000 0 494.500000 2900.100000 0 494.500000 2899.400000 0 181.700000 2899.400000 0 181.700000 2900.100000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 2899.400000 0 494.500000 2899.400000 0 494.500000 2898.600000 0 181.700000 2898.600000 0 181.700000 2899.400000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 2898.600000 0 494.500000 2898.600000 0 494.500000 2897.900000 0 181.700000 2897.900000 0 181.700000 2898.600000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 2897.900000 0 494.500000 2897.900000 0 494.500000 2897.100000 0 181.700000 2897.100000 0 181.700000 2897.900000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 2897.100000 0 494.500000 2897.100000 0 494.500000 2896.300000 0 181.700000 2896.300000 0 181.700000 2897.100000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 2896.300000 0 494.500000 2896.300000 0 494.500000 2895.600000 0 181.700000 2895.600000 0 181.700000 2896.300000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 2895.600000 0 494.500000 2895.600000 0 494.500000 2894.800000 0 181.700000 2894.800000 0 181.700000 2895.600000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 2894.900000 0 181.800000 2894.900000 0 181.800000 3088.200000 0 494.400000 3088.200000 0 494.400000 2894.900000 0 338.100000 2894.900000 0
+strokePath subpath 1 338.100000 2894.900000 0 181.800000 2894.900000 0 181.800000 3088.200000 0 494.400000 3088.200000 0 494.400000 2894.900000 0 338.100000 2894.900000 0
+saveState
+updateCtm 11410.000000 0.000000 0.000000 -8760.000000 20530.000000 -217890.000000
+drawSoftMaskedImage 1142 877 1142 877 JPEG 70955 PPM 3004618
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 2933.924000 215.488000 2925.924000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 2933.924000 220.592000 2925.924000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 2933.924000 225.696000 2925.924000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 2933.924000 230.800000 2925.924000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 2926.324000 241.388000 2918.324000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 2926.324000 246.492000 2918.324000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 2926.324000 251.596000 2918.324000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 2926.324000 256.700000 2918.324000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 2918.624000 267.188000 2910.624000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 2918.624000 272.292000 2910.624000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 2918.624000 277.396000 2910.624000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 2918.624000 282.500000 2910.624000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 2911.024000 293.088000 2903.024000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 2911.024000 298.192000 2903.024000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 2911.024000 303.296000 2903.024000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 2911.024000 308.400000 2903.024000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 2948.924000 202.588000 2940.924000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 2968.224000 201.688000 2960.224000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 2987.524000 195.788000 2979.524000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 2987.524000 200.892000 2979.524000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 3006.924000 194.888000 2998.924000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 3006.924000 199.992000 2998.924000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 3026.224000 193.988000 3018.224000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 3026.224000 199.092000 3018.224000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 3045.524000 193.088000 3037.524000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 3045.524000 198.192000 3037.524000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 2917.624000 330.188000 2909.624000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 2917.624000 332.716000 2909.624000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 2917.624000 337.596000 2909.624000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 2917.624000 341.396000 2909.624000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 2917.624000 346.036000 2909.624000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 2917.624000 350.900000 2909.624000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 2917.624000 355.972000 2909.624000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 2917.624000 359.196000 2909.624000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 2917.624000 362.196000 2909.624000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 2917.624000 367.404000 2909.624000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 2917.624000 371.876000 2909.624000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 2917.624000 375.052000 2909.624000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 2937.124000 361.172000 2929.124000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 2937.124000 364.340000 2929.124000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 2937.124000 367.396000 2929.124000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 2937.124000 372.604000 2929.124000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 2937.124000 379.348000 2929.124000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 2937.124000 384.484000 2929.124000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 2937.124000 389.436000 2929.124000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 2937.124000 392.108000 2929.124000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 2937.124000 395.708000 2929.124000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 2937.124000 397.540000 2929.124000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 2937.124000 402.444000 2929.124000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 2937.124000 406.788000 2929.124000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 2956.724000 392.972000 2948.724000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 2956.724000 398.076000 2948.724000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 2956.724000 403.180000 2948.724000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 2956.724000 405.428000 2948.724000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 2956.724000 410.332000 2948.724000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 2956.724000 414.476000 2948.724000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 3084.292000 305.808000 3070.292000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 3084.292000 314.138000 3070.292000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 3084.292000 320.788000 3070.292000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 3084.292000 328.698000 3070.292000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 3084.292000 336.972000 3070.292000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 3084.292000 344.182000 3070.292000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 3084.292000 349.810000 3070.292000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 3084.292000 354.234000 3070.292000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 3084.292000 362.718000 3070.292000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 3084.292000 367.870000 3070.292000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 3084.292000 372.322000 3070.292000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 3084.292000 382.080000 3070.292000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 3084.292000 388.772000 3070.292000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 3084.292000 397.802000 3070.292000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 3084.292000 402.254000 3070.292000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 3084.292000 407.896000 3070.292000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 2961.400000 0 424.300000 2961.400000 0 424.300000 3022.100000 0 493.600000 3022.100000 0 493.600000 2961.400000 0 458.900000 2961.400000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 3012.500000 0 428.900000 3012.500000 0 428.900000 3018.400000 0 434.800000 3018.400000 0 434.800000 3012.500000 0 431.900000 3012.500000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 3001.400000 0 428.900000 3001.400000 0 428.900000 3007.400000 0 434.800000 3007.400000 0 434.800000 3001.400000 0 431.900000 3001.400000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 2990.300000 0 428.900000 2990.300000 0 428.900000 2996.300000 0 434.800000 2996.300000 0 434.800000 2990.300000 0 431.900000 2990.300000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 2979.200000 0 428.900000 2979.200000 0 428.900000 2985.200000 0 434.800000 2985.200000 0 434.800000 2979.200000 0 431.900000 2979.200000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 2968.100000 0 428.900000 2968.100000 0 428.900000 2974.100000 0 434.800000 2974.100000 0 434.800000 2968.100000 0 431.900000 2968.100000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 3019.624000 443.288000 3011.624000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 3019.624000 445.816000 3011.624000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 3019.624000 450.600000 3011.624000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 3019.624000 454.496000 3011.624000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 3019.624000 459.136000 3011.624000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 3019.624000 464.000000 3011.624000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 3019.624000 468.976000 3011.624000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 3019.624000 472.304000 3011.624000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 3019.624000 475.208000 3011.624000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 3019.624000 480.520000 3011.624000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 3019.624000 484.992000 3011.624000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 3019.624000 488.168000 3011.624000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 3008.524000 443.352000 3000.524000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 3008.524000 447.920000 3000.524000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 3008.524000 452.976000 3000.524000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 3008.524000 457.400000 3000.524000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 3008.524000 462.472000 3000.524000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 3008.524000 465.800000 3000.524000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 3008.524000 468.904000 3000.524000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 3008.524000 473.816000 3000.524000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 3008.524000 478.888000 3000.524000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 3008.524000 482.064000 3000.524000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 2997.424000 442.872000 2989.424000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 2997.424000 446.040000 2989.424000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 2997.424000 448.992000 2989.424000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 2997.424000 454.304000 2989.424000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 2997.424000 461.048000 2989.424000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 2997.424000 466.184000 2989.424000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 2997.424000 471.136000 2989.424000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 2997.424000 473.808000 2989.424000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 2997.424000 477.408000 2989.424000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 2997.424000 479.240000 2989.424000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 2997.424000 484.144000 2989.424000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 2997.424000 488.488000 2989.424000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 2986.324000 443.384000 2978.324000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 2986.324000 448.464000 2978.324000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 2986.324000 453.424000 2978.324000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 2986.324000 456.696000 2978.324000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 2986.324000 459.800000 2978.324000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 2986.324000 462.032000 2978.324000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 2986.324000 466.936000 2978.324000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 2986.324000 471.080000 2978.324000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 2975.224000 443.272000 2967.224000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 2975.224000 448.376000 2967.224000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 2975.224000 453.480000 2967.224000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 2975.224000 455.728000 2967.224000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 2975.224000 460.632000 2967.224000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 2975.224000 464.776000 2967.224000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 330.200000 0 114.800000 330.200000 0 114.800000 373.000000 0 72.000000 373.000000 0 72.000000 330.200000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 46170.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 76.600000 701.300000 0 535.500000 701.300000 0 535.500000 720.000000 0 76.600000 720.000000 0 76.600000 701.300000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 76.600000 656.400000 0 291.900000 656.400000 0 291.900000 670.500000 0 76.600000 670.500000 0 76.600000 656.400000 0
+eoFillPath subpath 1 76.600000 572.800000 0 291.900000 572.800000 0 291.900000 586.900000 0 76.600000 586.900000 0 76.600000 572.800000 0
+eoFillPath subpath 1 76.600000 419.700000 0 291.900000 419.700000 0 291.900000 433.800000 0 76.600000 433.800000 0 76.600000 419.700000 0
+eoFillPath subpath 1 76.600000 155.400000 0 291.900000 155.400000 0 291.900000 169.500000 0 76.600000 169.500000 0 76.600000 155.400000 0
+eoFillPath subpath 1 320.200000 492.000000 0 535.500000 492.000000 0 535.500000 506.100000 0 320.200000 506.100000 0 320.200000 492.000000 0
+eoFillPath subpath 1 320.200000 450.100000 0 535.500000 450.100000 0 535.500000 464.200000 0 320.200000 464.200000 0 320.200000 450.100000 0
+eoFillPath subpath 1 320.200000 310.900000 0 535.500000 310.900000 0 535.500000 325.000000 0 320.200000 325.000000 0 320.200000 310.900000 0
+eoFillPath subpath 1 320.200000 199.500000 0 535.500000 199.500000 0 535.500000 213.600000 0 320.200000 213.600000 0 320.200000 199.500000 0
+eoFillPath subpath 1 320.200000 129.800000 0 535.500000 129.800000 0 535.500000 143.900000 0 320.200000 143.900000 0 320.200000 129.800000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 76.700000 719.948000 81.404000 703.948000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 81.404000 719.948000 91.532000 703.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 91.500000 719.948000 101.644000 703.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 101.708000 719.948000 111.548000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.308000 719.948000 120.764000 703.948000 1.000000 0.000000 0.000000 1.000000 x
+endTextObject
+restoreState
+saveState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+updateFont 103 1 0 0 0 200.000000 0 BAAAAA+DejaVuSans-Bold
+drawChar 173.800000 672.856000 175.346000 670.856000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 175.300000 672.856000 175.984000 670.856000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 176.000000 672.856000 177.430000 670.856000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 177.400000 672.856000 178.822000 670.856000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 178.800000 672.856000 180.148000 670.856000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 180.100000 672.856000 181.530000 670.856000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 181.500000 672.856000 182.856000 670.856000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 182.900000 672.856000 183.856000 670.856000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 183.900000 672.856000 184.584000 670.856000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 184.600000 672.856000 185.784000 670.856000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 185.800000 672.856000 187.148000 670.856000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 187.100000 672.856000 187.784000 670.856000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 187.800000 672.856000 188.496000 670.856000 1.000000 0.000000 0.000000 1.000000
+drawChar 188.500000 672.856000 189.244000 670.856000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 189.200000 672.856000 190.622000 670.856000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 190.600000 672.856000 192.030000 670.856000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 192.000000 672.856000 193.356000 670.856000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 193.400000 672.856000 194.690000 670.856000 1.000000 0.000000 0.000000 1.000000 x
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 670.456000 86.000000 658.456000 1.000000 0.000000 0.000000 1.000000 A
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 656.436000 85.364000 644.436000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 85.400000 656.436000 92.120000 644.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 92.096000 656.436000 98.816000 644.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 98.792000 656.436000 105.884000 644.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.896000 656.436000 112.052000 644.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.100000 656.436000 118.256000 644.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 118.304000 656.436000 125.528000 644.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 125.504000 656.436000 131.240000 644.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 131.204000 656.436000 135.032000 644.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 135.008000 656.436000 142.100000 644.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.112000 656.436000 148.268000 644.436000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 148.200000 656.436000 152.004000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.100000 656.436000 155.904000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.000000 656.436000 159.804000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 159.900000 656.436000 163.704000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 163.800000 656.436000 167.604000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 167.700000 656.436000 171.504000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 171.600000 656.436000 175.404000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.500000 656.436000 179.304000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.400000 656.436000 183.204000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.300000 656.436000 187.104000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.200000 656.436000 191.004000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.100000 656.436000 194.904000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.000000 656.436000 198.804000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.900000 656.436000 202.704000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.800000 656.436000 206.604000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.700000 656.436000 210.504000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.600000 656.436000 214.404000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.500000 656.436000 218.304000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.400000 656.436000 222.204000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.300000 656.436000 226.104000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.200000 656.436000 230.004000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.100000 656.436000 233.904000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.000000 656.436000 237.804000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.900000 656.436000 241.704000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.800000 656.436000 245.604000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.700000 656.436000 249.504000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.600000 656.436000 253.404000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.500000 656.436000 257.304000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.400000 656.436000 261.204000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.300000 656.436000 265.104000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.200000 656.436000 269.004000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.100000 656.436000 272.904000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.000000 656.436000 276.804000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.900000 656.436000 280.704000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.800000 656.436000 284.604000 644.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 656.436000 292.032000 644.436000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 642.536000 85.364000 630.536000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 85.400000 642.536000 93.080000 630.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.104000 642.536000 100.784000 630.536000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 100.808000 642.536000 104.636000 630.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 104.612000 642.536000 111.704000 630.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.716000 642.536000 115.520000 630.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.520000 642.536000 127.796000 630.536000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 127.820000 642.536000 134.972000 630.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 135.020000 642.536000 141.740000 630.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 141.716000 642.536000 145.544000 630.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 145.520000 642.536000 153.248000 630.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 153.224000 642.536000 158.036000 630.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 158.024000 642.536000 165.248000 630.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 165.224000 642.536000 171.380000 630.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 171.428000 642.536000 179.156000 630.536000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 179.000000 642.536000 182.804000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 182.900000 642.536000 186.704000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 186.800000 642.536000 190.604000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 190.700000 642.536000 194.504000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 194.600000 642.536000 198.404000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.500000 642.536000 202.304000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.400000 642.536000 206.204000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.300000 642.536000 210.104000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.200000 642.536000 214.004000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.100000 642.536000 217.904000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.000000 642.536000 221.804000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.900000 642.536000 225.704000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.800000 642.536000 229.604000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.700000 642.536000 233.504000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.600000 642.536000 237.404000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.500000 642.536000 241.304000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.400000 642.536000 245.204000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.300000 642.536000 249.104000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.200000 642.536000 253.004000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.100000 642.536000 256.904000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.000000 642.536000 260.804000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.900000 642.536000 264.704000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.800000 642.536000 268.604000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.700000 642.536000 272.504000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.600000 642.536000 276.404000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.500000 642.536000 280.304000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.400000 642.536000 284.204000 630.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 642.536000 292.032000 630.536000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 628.636000 85.364000 616.636000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 85.400000 628.636000 93.080000 616.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.104000 628.636000 100.784000 616.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 100.808000 628.636000 104.636000 616.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 104.612000 628.636000 111.704000 616.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.716000 628.636000 117.872000 616.636000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 117.700000 628.636000 121.504000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 121.600000 628.636000 125.404000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 125.500000 628.636000 129.304000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 129.400000 628.636000 133.204000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.300000 628.636000 137.104000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.200000 628.636000 141.004000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.100000 628.636000 144.904000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.000000 628.636000 148.804000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.900000 628.636000 152.704000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.800000 628.636000 156.604000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.700000 628.636000 160.504000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.600000 628.636000 164.404000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.500000 628.636000 168.304000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.400000 628.636000 172.204000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.300000 628.636000 176.104000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.200000 628.636000 180.004000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.100000 628.636000 183.904000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.000000 628.636000 187.804000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.900000 628.636000 191.704000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.800000 628.636000 195.604000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.700000 628.636000 199.504000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.600000 628.636000 203.404000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.500000 628.636000 207.304000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.400000 628.636000 211.204000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.300000 628.636000 215.104000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.200000 628.636000 219.004000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.100000 628.636000 222.904000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.000000 628.636000 226.804000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.900000 628.636000 230.704000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.800000 628.636000 234.604000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.700000 628.636000 238.504000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.600000 628.636000 242.404000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.500000 628.636000 246.304000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.400000 628.636000 250.204000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.300000 628.636000 254.104000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.200000 628.636000 258.004000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.100000 628.636000 261.904000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.000000 628.636000 265.804000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.900000 628.636000 269.704000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.800000 628.636000 273.604000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.700000 628.636000 277.504000 616.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 628.636000 284.332000 616.636000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 628.636000 291.928000 616.636000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 614.736000 85.364000 602.736000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 85.400000 614.736000 91.556000 602.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.604000 614.736000 99.284000 602.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 99.308000 614.736000 103.136000 602.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.112000 614.736000 108.848000 602.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 108.812000 614.736000 112.640000 602.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.616000 614.736000 120.344000 602.736000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 120.200000 614.736000 124.004000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 124.004000 614.736000 127.808000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 127.808000 614.736000 131.612000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 131.612000 614.736000 135.416000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 135.416000 614.736000 139.220000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 139.220000 614.736000 143.024000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 143.024000 614.736000 146.828000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 146.828000 614.736000 150.632000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 150.632000 614.736000 154.436000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.436000 614.736000 158.240000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.240000 614.736000 162.044000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.044000 614.736000 165.848000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.848000 614.736000 169.652000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.652000 614.736000 173.456000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.456000 614.736000 177.260000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.260000 614.736000 181.064000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.064000 614.736000 184.868000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.868000 614.736000 188.672000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.672000 614.736000 192.476000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.476000 614.736000 196.280000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.280000 614.736000 200.084000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.084000 614.736000 203.888000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.888000 614.736000 207.692000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.692000 614.736000 211.496000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.496000 614.736000 215.300000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.300000 614.736000 219.104000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.104000 614.736000 222.908000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.908000 614.736000 226.712000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.712000 614.736000 230.516000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.516000 614.736000 234.320000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.320000 614.736000 238.124000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.124000 614.736000 241.928000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.928000 614.736000 245.732000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.732000 614.736000 249.536000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.536000 614.736000 253.340000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.340000 614.736000 257.144000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.144000 614.736000 260.948000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.948000 614.736000 264.752000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.752000 614.736000 268.556000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.556000 614.736000 272.360000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.360000 614.736000 276.164000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.164000 614.736000 279.968000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.968000 614.736000 283.772000 602.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 614.736000 292.032000 602.736000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 600.836000 85.364000 588.836000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 85.400000 600.836000 92.156000 588.836000 1.000000 0.000000 0.000000 1.000000 x
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 92.000000 600.836000 95.804000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 95.804000 600.836000 99.608000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 99.608000 600.836000 103.412000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 103.412000 600.836000 107.216000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 107.216000 600.836000 111.020000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 111.020000 600.836000 114.824000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 114.824000 600.836000 118.628000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 118.628000 600.836000 122.432000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 122.432000 600.836000 126.236000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 126.236000 600.836000 130.040000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 130.040000 600.836000 133.844000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.844000 600.836000 137.648000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.648000 600.836000 141.452000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.452000 600.836000 145.256000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.256000 600.836000 149.060000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.060000 600.836000 152.864000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.864000 600.836000 156.668000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.668000 600.836000 160.472000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.472000 600.836000 164.276000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.276000 600.836000 168.080000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.080000 600.836000 171.884000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 171.884000 600.836000 175.688000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.688000 600.836000 179.492000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.492000 600.836000 183.296000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.296000 600.836000 187.100000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.100000 600.836000 190.904000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 190.904000 600.836000 194.708000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 194.708000 600.836000 198.512000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.512000 600.836000 202.316000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.316000 600.836000 206.120000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.120000 600.836000 209.924000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 209.924000 600.836000 213.728000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 213.728000 600.836000 217.532000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 217.532000 600.836000 221.336000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.336000 600.836000 225.140000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.140000 600.836000 228.944000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 228.944000 600.836000 232.748000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 232.748000 600.836000 236.552000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 236.552000 600.836000 240.356000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.356000 600.836000 244.160000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.160000 600.836000 247.964000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 247.964000 600.836000 251.768000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 251.768000 600.836000 255.572000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 255.572000 600.836000 259.376000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 259.376000 600.836000 263.180000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.180000 600.836000 266.984000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.984000 600.836000 270.788000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.788000 600.836000 274.592000 588.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 600.836000 284.332000 588.836000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 600.836000 291.928000 588.836000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 586.856000 86.840000 574.856000 1.000000 0.000000 0.000000 1.000000 B
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 572.836000 85.508000 560.836000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 85.496000 572.836000 92.648000 560.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 92.696000 572.836000 98.852000 560.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.900000 572.836000 102.728000 560.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 102.704000 572.836000 106.532000 560.836000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 106.400000 572.836000 110.204000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 110.300000 572.836000 114.104000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 114.200000 572.836000 118.004000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 118.100000 572.836000 121.904000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 122.000000 572.836000 125.804000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 125.900000 572.836000 129.704000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 129.800000 572.836000 133.604000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.700000 572.836000 137.504000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.600000 572.836000 141.404000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.500000 572.836000 145.304000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.400000 572.836000 149.204000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.300000 572.836000 153.104000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.200000 572.836000 157.004000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.100000 572.836000 160.904000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.000000 572.836000 164.804000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.900000 572.836000 168.704000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.800000 572.836000 172.604000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.700000 572.836000 176.504000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.600000 572.836000 180.404000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.500000 572.836000 184.304000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.400000 572.836000 188.204000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.300000 572.836000 192.104000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.200000 572.836000 196.004000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.100000 572.836000 199.904000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.000000 572.836000 203.804000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.900000 572.836000 207.704000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.800000 572.836000 211.604000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.700000 572.836000 215.504000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.600000 572.836000 219.404000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.500000 572.836000 223.304000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.400000 572.836000 227.204000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.300000 572.836000 231.104000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.200000 572.836000 235.004000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 235.100000 572.836000 238.904000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 239.000000 572.836000 242.804000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.900000 572.836000 246.704000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.800000 572.836000 250.604000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.700000 572.836000 254.504000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.600000 572.836000 258.404000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.500000 572.836000 262.304000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.400000 572.836000 266.204000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.300000 572.836000 270.104000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.200000 572.836000 274.004000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 274.100000 572.836000 277.904000 560.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 572.836000 284.332000 560.836000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 572.836000 291.928000 560.836000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 558.936000 85.508000 546.936000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 85.496000 558.936000 92.648000 546.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 92.696000 558.936000 97.508000 546.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 97.496000 558.936000 105.224000 546.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 105.200000 558.936000 109.004000 546.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.004000 558.936000 115.160000 546.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 115.208000 558.936000 122.360000 546.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 122.408000 558.936000 126.236000 546.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 126.212000 558.936000 131.024000 546.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 131.012000 558.936000 137.168000 546.936000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 137.100000 558.936000 140.904000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.000000 558.936000 144.804000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.900000 558.936000 148.704000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.800000 558.936000 152.604000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.700000 558.936000 156.504000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.600000 558.936000 160.404000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.500000 558.936000 164.304000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.400000 558.936000 168.204000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.300000 558.936000 172.104000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.200000 558.936000 176.004000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.100000 558.936000 179.904000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.000000 558.936000 183.804000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.900000 558.936000 187.704000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.800000 558.936000 191.604000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.700000 558.936000 195.504000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.600000 558.936000 199.404000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.500000 558.936000 203.304000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.400000 558.936000 207.204000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.300000 558.936000 211.104000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.200000 558.936000 215.004000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.100000 558.936000 218.904000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.000000 558.936000 222.804000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.900000 558.936000 226.704000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.800000 558.936000 230.604000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.700000 558.936000 234.504000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.600000 558.936000 238.404000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.500000 558.936000 242.304000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.400000 558.936000 246.204000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.300000 558.936000 250.104000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.200000 558.936000 254.004000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.100000 558.936000 257.904000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.000000 558.936000 261.804000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.900000 558.936000 265.704000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.800000 558.936000 269.604000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.700000 558.936000 273.504000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.600000 558.936000 277.404000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.500000 558.936000 281.304000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.400000 558.936000 285.204000 546.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 558.936000 292.032000 546.936000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 545.036000 85.508000 533.036000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 85.496000 545.036000 92.648000 533.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 92.696000 545.036000 97.508000 533.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 97.496000 545.036000 105.224000 533.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 105.200000 545.036000 109.004000 533.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.004000 545.036000 113.816000 533.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.804000 545.036000 121.028000 533.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 121.004000 545.036000 131.264000 533.036000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 131.300000 545.036000 138.392000 533.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 138.404000 545.036000 142.232000 533.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.208000 545.036000 148.364000 533.036000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 148.400000 545.036000 152.204000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.300000 545.036000 156.104000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.200000 545.036000 160.004000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.100000 545.036000 163.904000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.000000 545.036000 167.804000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 167.900000 545.036000 171.704000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 171.800000 545.036000 175.604000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.700000 545.036000 179.504000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.600000 545.036000 183.404000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.500000 545.036000 187.304000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.400000 545.036000 191.204000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.300000 545.036000 195.104000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.200000 545.036000 199.004000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.100000 545.036000 202.904000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.000000 545.036000 206.804000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.900000 545.036000 210.704000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.800000 545.036000 214.604000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.700000 545.036000 218.504000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.600000 545.036000 222.404000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.500000 545.036000 226.304000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.400000 545.036000 230.204000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.300000 545.036000 234.104000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.200000 545.036000 238.004000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.100000 545.036000 241.904000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.000000 545.036000 245.804000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.900000 545.036000 249.704000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.800000 545.036000 253.604000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.700000 545.036000 257.504000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.600000 545.036000 261.404000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.500000 545.036000 265.304000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.400000 545.036000 269.204000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.300000 545.036000 273.104000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.200000 545.036000 277.004000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.100000 545.036000 280.904000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.000000 545.036000 284.804000 533.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 545.036000 292.032000 533.036000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 531.136000 85.508000 519.136000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 85.496000 531.136000 92.588000 519.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 92.600000 531.136000 99.692000 519.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 99.704000 531.136000 106.424000 519.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 106.400000 531.136000 114.128000 519.136000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 114.100000 531.136000 117.904000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 118.000000 531.136000 121.804000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 121.900000 531.136000 125.704000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 125.800000 531.136000 129.604000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 129.700000 531.136000 133.504000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.600000 531.136000 137.404000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.500000 531.136000 141.304000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.400000 531.136000 145.204000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.300000 531.136000 149.104000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.200000 531.136000 153.004000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.100000 531.136000 156.904000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.000000 531.136000 160.804000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.900000 531.136000 164.704000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.800000 531.136000 168.604000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.700000 531.136000 172.504000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.600000 531.136000 176.404000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.500000 531.136000 180.304000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.400000 531.136000 184.204000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.300000 531.136000 188.104000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.200000 531.136000 192.004000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.100000 531.136000 195.904000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.000000 531.136000 199.804000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.900000 531.136000 203.704000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.800000 531.136000 207.604000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.700000 531.136000 211.504000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.600000 531.136000 215.404000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.500000 531.136000 219.304000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.400000 531.136000 223.204000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.300000 531.136000 227.104000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.200000 531.136000 231.004000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.100000 531.136000 234.904000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 235.000000 531.136000 238.804000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.900000 531.136000 242.704000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.800000 531.136000 246.604000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.700000 531.136000 250.504000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.600000 531.136000 254.404000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.500000 531.136000 258.304000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.400000 531.136000 262.204000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.300000 531.136000 266.104000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.200000 531.136000 270.004000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.100000 531.136000 273.904000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 274.000000 531.136000 277.804000 519.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 531.136000 284.332000 519.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 531.136000 291.928000 519.136000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 517.236000 85.508000 505.236000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 85.496000 517.236000 89.324000 505.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 89.300000 517.236000 96.020000 505.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 95.996000 517.236000 102.764000 505.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 102.800000 517.236000 109.520000 505.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 109.496000 517.236000 113.324000 505.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 113.300000 517.236000 120.392000 505.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 120.404000 517.236000 126.560000 505.236000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 126.600000 517.236000 130.404000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 130.404000 517.236000 134.208000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 134.208000 517.236000 138.012000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 138.012000 517.236000 141.816000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.816000 517.236000 145.620000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.620000 517.236000 149.424000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.424000 517.236000 153.228000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.228000 517.236000 157.032000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.032000 517.236000 160.836000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.836000 517.236000 164.640000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.640000 517.236000 168.444000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.444000 517.236000 172.248000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.248000 517.236000 176.052000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.052000 517.236000 179.856000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.856000 517.236000 183.660000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.660000 517.236000 187.464000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.464000 517.236000 191.268000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.268000 517.236000 195.072000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.072000 517.236000 198.876000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.876000 517.236000 202.680000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.680000 517.236000 206.484000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.484000 517.236000 210.288000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.288000 517.236000 214.092000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.092000 517.236000 217.896000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 217.896000 517.236000 221.700000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.700000 517.236000 225.504000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.504000 517.236000 229.308000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.308000 517.236000 233.112000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.112000 517.236000 236.916000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 236.916000 517.236000 240.720000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.720000 517.236000 244.524000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.524000 517.236000 248.328000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.328000 517.236000 252.132000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.132000 517.236000 255.936000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 255.936000 517.236000 259.740000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 259.740000 517.236000 263.544000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.544000 517.236000 267.348000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.348000 517.236000 271.152000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.152000 517.236000 274.956000 505.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 517.236000 284.332000 505.236000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 517.236000 291.928000 505.236000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 503.336000 85.508000 491.336000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 85.496000 503.336000 89.324000 491.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 89.300000 503.336000 96.560000 491.336000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 96.596000 503.336000 100.424000 491.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 100.400000 503.336000 108.128000 491.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.104000 503.336000 115.784000 491.336000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 115.800000 503.336000 119.604000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 119.604000 503.336000 123.408000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 123.408000 503.336000 127.212000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 127.212000 503.336000 131.016000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 131.016000 503.336000 134.820000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 134.820000 503.336000 138.624000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 138.624000 503.336000 142.428000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 142.428000 503.336000 146.232000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 146.232000 503.336000 150.036000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 150.036000 503.336000 153.840000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.840000 503.336000 157.644000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.644000 503.336000 161.448000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.448000 503.336000 165.252000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.252000 503.336000 169.056000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.056000 503.336000 172.860000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.860000 503.336000 176.664000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.664000 503.336000 180.468000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.468000 503.336000 184.272000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.272000 503.336000 188.076000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.076000 503.336000 191.880000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.880000 503.336000 195.684000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.684000 503.336000 199.488000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.488000 503.336000 203.292000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.292000 503.336000 207.096000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.096000 503.336000 210.900000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.900000 503.336000 214.704000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.704000 503.336000 218.508000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.508000 503.336000 222.312000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.312000 503.336000 226.116000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.116000 503.336000 229.920000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.920000 503.336000 233.724000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.724000 503.336000 237.528000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.528000 503.336000 241.332000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.332000 503.336000 245.136000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.136000 503.336000 248.940000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.940000 503.336000 252.744000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.744000 503.336000 256.548000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.548000 503.336000 260.352000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.352000 503.336000 264.156000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.156000 503.336000 267.960000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.960000 503.336000 271.764000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.764000 503.336000 275.568000 491.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 503.336000 284.332000 491.336000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 503.336000 291.928000 491.336000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 489.436000 85.508000 477.436000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 85.496000 489.436000 89.324000 477.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 89.300000 489.436000 96.452000 477.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 96.500000 489.436000 103.220000 477.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.196000 489.436000 110.456000 477.436000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 110.492000 489.436000 118.172000 477.436000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.196000 489.436000 125.288000 477.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.300000 489.436000 131.036000 477.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 131.000000 489.436000 136.736000 477.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 136.700000 489.436000 143.468000 477.436000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 143.400000 489.436000 147.204000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 147.204000 489.436000 151.008000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 151.008000 489.436000 154.812000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.812000 489.436000 158.616000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.616000 489.436000 162.420000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.420000 489.436000 166.224000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 166.224000 489.436000 170.028000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 170.028000 489.436000 173.832000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.832000 489.436000 177.636000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.636000 489.436000 181.440000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.440000 489.436000 185.244000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.244000 489.436000 189.048000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 189.048000 489.436000 192.852000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.852000 489.436000 196.656000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.656000 489.436000 200.460000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.460000 489.436000 204.264000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.264000 489.436000 208.068000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 208.068000 489.436000 211.872000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.872000 489.436000 215.676000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.676000 489.436000 219.480000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.480000 489.436000 223.284000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.284000 489.436000 227.088000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.088000 489.436000 230.892000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.892000 489.436000 234.696000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.696000 489.436000 238.500000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.500000 489.436000 242.304000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.304000 489.436000 246.108000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.108000 489.436000 249.912000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.912000 489.436000 253.716000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.716000 489.436000 257.520000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.520000 489.436000 261.324000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.324000 489.436000 265.128000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.128000 489.436000 268.932000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.932000 489.436000 272.736000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.736000 489.436000 276.540000 477.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 489.436000 284.332000 477.436000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 489.436000 291.928000 477.436000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 475.536000 85.508000 463.536000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 85.496000 475.536000 92.720000 463.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 92.696000 475.536000 96.524000 463.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 96.500000 475.536000 101.312000 463.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.300000 475.536000 107.456000 463.536000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 107.500000 475.536000 111.304000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 111.304000 475.536000 115.108000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 115.108000 475.536000 118.912000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 118.912000 475.536000 122.716000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 122.716000 475.536000 126.520000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 126.520000 475.536000 130.324000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 130.324000 475.536000 134.128000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 134.128000 475.536000 137.932000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.932000 475.536000 141.736000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.736000 475.536000 145.540000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.540000 475.536000 149.344000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.344000 475.536000 153.148000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.148000 475.536000 156.952000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.952000 475.536000 160.756000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.756000 475.536000 164.560000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.560000 475.536000 168.364000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.364000 475.536000 172.168000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.168000 475.536000 175.972000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.972000 475.536000 179.776000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.776000 475.536000 183.580000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.580000 475.536000 187.384000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.384000 475.536000 191.188000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.188000 475.536000 194.992000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 194.992000 475.536000 198.796000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.796000 475.536000 202.600000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.600000 475.536000 206.404000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.404000 475.536000 210.208000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.208000 475.536000 214.012000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.012000 475.536000 217.816000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 217.816000 475.536000 221.620000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.620000 475.536000 225.424000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.424000 475.536000 229.228000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.228000 475.536000 233.032000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.032000 475.536000 236.836000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 236.836000 475.536000 240.640000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.640000 475.536000 244.444000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.444000 475.536000 248.248000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.248000 475.536000 252.052000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.052000 475.536000 255.856000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 255.856000 475.536000 259.660000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 259.660000 475.536000 263.464000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.464000 475.536000 267.268000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.268000 475.536000 271.072000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.072000 475.536000 274.876000 463.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 475.536000 284.332000 463.536000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 475.536000 291.928000 463.536000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 461.636000 85.508000 449.636000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 85.496000 461.636000 92.720000 449.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 92.696000 461.636000 100.424000 449.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 100.400000 461.636000 107.492000 449.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.504000 461.636000 111.308000 449.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.308000 461.636000 118.028000 449.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 118.004000 461.636000 125.732000 449.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 125.708000 461.636000 129.536000 449.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 129.512000 461.636000 137.240000 449.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 137.216000 461.636000 144.368000 449.636000 1.000000 0.000000 0.000000 1.000000 a
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 144.500000 461.636000 148.304000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.400000 461.636000 152.204000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.300000 461.636000 156.104000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.200000 461.636000 160.004000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.100000 461.636000 163.904000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.000000 461.636000 167.804000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 167.900000 461.636000 171.704000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 171.800000 461.636000 175.604000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.700000 461.636000 179.504000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.600000 461.636000 183.404000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.500000 461.636000 187.304000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.400000 461.636000 191.204000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.300000 461.636000 195.104000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.200000 461.636000 199.004000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.100000 461.636000 202.904000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.000000 461.636000 206.804000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.900000 461.636000 210.704000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.800000 461.636000 214.604000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.700000 461.636000 218.504000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.600000 461.636000 222.404000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.500000 461.636000 226.304000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.400000 461.636000 230.204000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.300000 461.636000 234.104000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.200000 461.636000 238.004000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.100000 461.636000 241.904000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.000000 461.636000 245.804000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.900000 461.636000 249.704000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.800000 461.636000 253.604000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.700000 461.636000 257.504000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.600000 461.636000 261.404000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.500000 461.636000 265.304000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.400000 461.636000 269.204000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.300000 461.636000 273.104000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.200000 461.636000 277.004000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.100000 461.636000 280.904000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.000000 461.636000 284.804000 449.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 461.636000 292.032000 449.636000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 447.736000 85.508000 435.736000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 85.496000 447.736000 91.232000 435.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 91.196000 447.736000 98.420000 435.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 98.396000 447.736000 105.620000 435.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 105.596000 447.736000 112.856000 435.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 112.892000 447.736000 116.720000 435.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.696000 447.736000 123.464000 435.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 123.500000 447.736000 131.228000 435.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.204000 447.736000 135.008000 435.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 447.736000 143.816000 435.736000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 143.804000 447.736000 149.540000 435.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 149.504000 447.736000 153.332000 435.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.308000 447.736000 160.988000 435.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 161.012000 447.736000 168.692000 435.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 168.716000 447.736000 175.808000 435.736000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 175.900000 447.736000 179.704000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.800000 447.736000 183.604000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.700000 447.736000 187.504000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.600000 447.736000 191.404000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.500000 447.736000 195.304000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.400000 447.736000 199.204000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.300000 447.736000 203.104000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.200000 447.736000 207.004000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.100000 447.736000 210.904000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.000000 447.736000 214.804000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.900000 447.736000 218.704000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.800000 447.736000 222.604000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.700000 447.736000 226.504000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.600000 447.736000 230.404000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.500000 447.736000 234.304000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.400000 447.736000 238.204000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.300000 447.736000 242.104000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.200000 447.736000 246.004000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.100000 447.736000 249.904000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.000000 447.736000 253.804000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.900000 447.736000 257.704000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.800000 447.736000 261.604000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.700000 447.736000 265.504000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.600000 447.736000 269.404000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.500000 447.736000 273.304000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.400000 447.736000 277.204000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.300000 447.736000 281.104000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.200000 447.736000 285.004000 435.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 447.736000 292.032000 435.736000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 433.756000 86.240000 421.756000 1.000000 0.000000 0.000000 1.000000 C
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 419.736000 85.880000 407.736000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 419.736000 93.056000 407.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.104000 419.736000 104.480000 407.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 104.504000 419.736000 112.184000 407.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 112.208000 419.736000 119.360000 407.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 119.408000 419.736000 125.144000 407.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.108000 419.736000 128.936000 407.736000 1.000000 0.000000 0.000000 1.000000 i
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 128.700000 419.736000 132.504000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.600000 419.736000 136.404000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 136.500000 419.736000 140.304000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 140.400000 419.736000 144.204000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.300000 419.736000 148.104000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.200000 419.736000 152.004000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.100000 419.736000 155.904000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.000000 419.736000 159.804000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 159.900000 419.736000 163.704000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 163.800000 419.736000 167.604000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 167.700000 419.736000 171.504000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 171.600000 419.736000 175.404000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.500000 419.736000 179.304000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.400000 419.736000 183.204000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.300000 419.736000 187.104000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.200000 419.736000 191.004000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.100000 419.736000 194.904000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.000000 419.736000 198.804000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.900000 419.736000 202.704000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.800000 419.736000 206.604000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.700000 419.736000 210.504000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.600000 419.736000 214.404000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.500000 419.736000 218.304000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.400000 419.736000 222.204000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.300000 419.736000 226.104000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.200000 419.736000 230.004000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.100000 419.736000 233.904000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.000000 419.736000 237.804000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.900000 419.736000 241.704000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.800000 419.736000 245.604000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.700000 419.736000 249.504000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.600000 419.736000 253.404000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.500000 419.736000 257.304000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.400000 419.736000 261.204000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.300000 419.736000 265.104000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.200000 419.736000 269.004000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.100000 419.736000 272.904000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.000000 419.736000 276.804000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.900000 419.736000 280.704000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.800000 419.736000 284.604000 407.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 419.736000 292.032000 407.736000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 405.836000 85.880000 393.836000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 405.836000 93.056000 393.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.104000 405.836000 100.832000 393.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 100.808000 405.836000 108.488000 393.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.512000 405.836000 112.340000 393.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 112.316000 405.836000 119.408000 393.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.420000 405.836000 125.576000 393.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 125.400000 405.836000 129.204000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 129.300000 405.836000 133.104000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.200000 405.836000 137.004000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.100000 405.836000 140.904000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.000000 405.836000 144.804000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.900000 405.836000 148.704000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.800000 405.836000 152.604000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.700000 405.836000 156.504000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.600000 405.836000 160.404000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.500000 405.836000 164.304000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.400000 405.836000 168.204000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.300000 405.836000 172.104000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.200000 405.836000 176.004000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.100000 405.836000 179.904000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.000000 405.836000 183.804000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.900000 405.836000 187.704000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.800000 405.836000 191.604000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.700000 405.836000 195.504000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.600000 405.836000 199.404000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.500000 405.836000 203.304000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.400000 405.836000 207.204000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.300000 405.836000 211.104000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.200000 405.836000 215.004000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.100000 405.836000 218.904000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.000000 405.836000 222.804000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.900000 405.836000 226.704000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.800000 405.836000 230.604000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.700000 405.836000 234.504000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.600000 405.836000 238.404000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.500000 405.836000 242.304000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.400000 405.836000 246.204000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.300000 405.836000 250.104000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.200000 405.836000 254.004000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.100000 405.836000 257.904000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.000000 405.836000 261.804000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.900000 405.836000 265.704000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.800000 405.836000 269.604000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.700000 405.836000 273.504000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.600000 405.836000 277.404000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.500000 405.836000 281.304000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.400000 405.836000 285.204000 393.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 405.836000 292.032000 393.836000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 391.936000 85.880000 379.936000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 391.936000 93.056000 379.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.104000 391.936000 100.832000 379.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 100.808000 391.936000 108.536000 379.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.512000 391.936000 115.604000 379.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 115.616000 391.936000 123.296000 379.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 123.320000 391.936000 127.124000 379.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 127.124000 391.936000 134.804000 379.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 134.828000 391.936000 142.052000 379.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.028000 391.936000 149.252000 379.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 149.228000 391.936000 156.908000 379.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 156.932000 391.936000 163.088000 379.936000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 163.000000 391.936000 166.804000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 166.900000 391.936000 170.704000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 170.800000 391.936000 174.604000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 174.700000 391.936000 178.504000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 178.600000 391.936000 182.404000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 182.500000 391.936000 186.304000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 186.400000 391.936000 190.204000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 190.300000 391.936000 194.104000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 194.200000 391.936000 198.004000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.100000 391.936000 201.904000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.000000 391.936000 205.804000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 205.900000 391.936000 209.704000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 209.800000 391.936000 213.604000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 213.700000 391.936000 217.504000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 217.600000 391.936000 221.404000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.500000 391.936000 225.304000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.400000 391.936000 229.204000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.300000 391.936000 233.104000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.200000 391.936000 237.004000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.100000 391.936000 240.904000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.000000 391.936000 244.804000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.900000 391.936000 248.704000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.800000 391.936000 252.604000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.700000 391.936000 256.504000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.600000 391.936000 260.404000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.500000 391.936000 264.304000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.400000 391.936000 268.204000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.300000 391.936000 272.104000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.200000 391.936000 276.004000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.100000 391.936000 279.904000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.000000 391.936000 283.804000 379.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 391.936000 292.032000 379.936000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 378.036000 85.880000 366.036000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 378.036000 93.056000 366.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.104000 378.036000 100.832000 366.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 100.808000 378.036000 108.536000 366.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.512000 378.036000 115.604000 366.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 115.616000 378.036000 121.352000 366.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.316000 378.036000 128.084000 366.036000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 128.120000 378.036000 131.924000 366.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.924000 378.036000 140.948000 366.036000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 140.924000 378.036000 148.148000 366.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.124000 378.036000 158.384000 366.036000 1.000000 0.000000 0.000000 1.000000 w
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 158.400000 378.036000 162.204000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.204000 378.036000 166.008000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 166.008000 378.036000 169.812000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.812000 378.036000 173.616000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.616000 378.036000 177.420000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.420000 378.036000 181.224000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.224000 378.036000 185.028000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.028000 378.036000 188.832000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.832000 378.036000 192.636000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.636000 378.036000 196.440000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.440000 378.036000 200.244000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.244000 378.036000 204.048000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.048000 378.036000 207.852000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.852000 378.036000 211.656000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.656000 378.036000 215.460000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.460000 378.036000 219.264000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.264000 378.036000 223.068000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.068000 378.036000 226.872000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.872000 378.036000 230.676000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.676000 378.036000 234.480000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.480000 378.036000 238.284000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.284000 378.036000 242.088000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.088000 378.036000 245.892000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.892000 378.036000 249.696000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.696000 378.036000 253.500000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.500000 378.036000 257.304000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.304000 378.036000 261.108000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.108000 378.036000 264.912000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.912000 378.036000 268.716000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.716000 378.036000 272.520000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.520000 378.036000 276.324000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.324000 378.036000 280.128000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.128000 378.036000 283.932000 366.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 378.036000 292.032000 366.036000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 364.136000 85.880000 352.136000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 364.136000 92.996000 352.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 93.008000 364.136000 98.744000 352.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.708000 364.136000 105.860000 352.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 105.908000 364.136000 117.284000 352.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.308000 364.136000 121.136000 352.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 121.112000 364.136000 127.832000 352.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 127.808000 364.136000 131.612000 352.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.612000 364.136000 136.424000 352.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 136.412000 364.136000 140.240000 352.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 140.216000 364.136000 144.044000 352.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 144.020000 364.136000 151.112000 352.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 151.124000 364.136000 157.280000 352.136000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.300000 364.136000 161.104000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.104000 364.136000 164.908000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.908000 364.136000 168.712000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.712000 364.136000 172.516000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.516000 364.136000 176.320000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.320000 364.136000 180.124000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.124000 364.136000 183.928000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.928000 364.136000 187.732000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.732000 364.136000 191.536000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.536000 364.136000 195.340000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.340000 364.136000 199.144000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.144000 364.136000 202.948000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.948000 364.136000 206.752000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.752000 364.136000 210.556000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.556000 364.136000 214.360000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.360000 364.136000 218.164000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.164000 364.136000 221.968000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.968000 364.136000 225.772000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.772000 364.136000 229.576000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.576000 364.136000 233.380000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.380000 364.136000 237.184000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.184000 364.136000 240.988000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.988000 364.136000 244.792000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.792000 364.136000 248.596000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.596000 364.136000 252.400000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.400000 364.136000 256.204000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.204000 364.136000 260.008000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.008000 364.136000 263.812000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.812000 364.136000 267.616000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.616000 364.136000 271.420000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.420000 364.136000 275.224000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.224000 364.136000 279.028000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.028000 364.136000 282.832000 352.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 364.136000 292.032000 352.136000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 350.236000 85.880000 338.236000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 350.236000 92.996000 338.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 93.008000 350.236000 98.744000 338.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.708000 350.236000 105.800000 338.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.812000 350.236000 112.964000 338.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 113.012000 350.236000 116.840000 338.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.816000 350.236000 122.972000 338.236000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 122.900000 350.236000 126.704000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 126.704000 350.236000 130.508000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 130.508000 350.236000 134.312000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 134.312000 350.236000 138.116000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 138.116000 350.236000 141.920000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.920000 350.236000 145.724000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.724000 350.236000 149.528000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.528000 350.236000 153.332000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.332000 350.236000 157.136000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.136000 350.236000 160.940000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.940000 350.236000 164.744000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.744000 350.236000 168.548000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.548000 350.236000 172.352000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.352000 350.236000 176.156000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.156000 350.236000 179.960000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.960000 350.236000 183.764000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.764000 350.236000 187.568000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.568000 350.236000 191.372000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.372000 350.236000 195.176000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.176000 350.236000 198.980000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.980000 350.236000 202.784000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.784000 350.236000 206.588000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.588000 350.236000 210.392000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.392000 350.236000 214.196000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.196000 350.236000 218.000000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.000000 350.236000 221.804000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.804000 350.236000 225.608000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.608000 350.236000 229.412000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.412000 350.236000 233.216000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.216000 350.236000 237.020000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.020000 350.236000 240.824000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.824000 350.236000 244.628000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.628000 350.236000 248.432000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.432000 350.236000 252.236000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.236000 350.236000 256.040000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.040000 350.236000 259.844000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 259.844000 350.236000 263.648000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.648000 350.236000 267.452000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.452000 350.236000 271.256000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.256000 350.236000 275.060000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.060000 350.236000 278.864000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 278.864000 350.236000 282.668000 338.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 350.236000 292.032000 338.236000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 336.336000 85.880000 324.336000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 336.336000 93.632000 324.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 93.608000 336.336000 100.700000 324.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 100.712000 336.336000 106.448000 324.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 106.412000 336.336000 112.148000 324.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.112000 336.336000 115.940000 324.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.916000 336.336000 123.008000 324.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 123.020000 336.336000 129.176000 324.336000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 129.200000 336.336000 133.004000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.100000 336.336000 136.904000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.000000 336.336000 140.804000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 140.900000 336.336000 144.704000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.800000 336.336000 148.604000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.700000 336.336000 152.504000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.600000 336.336000 156.404000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.500000 336.336000 160.304000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.400000 336.336000 164.204000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.300000 336.336000 168.104000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.200000 336.336000 172.004000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.100000 336.336000 175.904000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.000000 336.336000 179.804000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.900000 336.336000 183.704000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.800000 336.336000 187.604000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.700000 336.336000 191.504000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.600000 336.336000 195.404000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.500000 336.336000 199.304000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.400000 336.336000 203.204000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.300000 336.336000 207.104000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.200000 336.336000 211.004000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.100000 336.336000 214.904000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.000000 336.336000 218.804000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.900000 336.336000 222.704000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.800000 336.336000 226.604000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.700000 336.336000 230.504000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.600000 336.336000 234.404000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.500000 336.336000 238.304000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.400000 336.336000 242.204000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.300000 336.336000 246.104000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.200000 336.336000 250.004000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.100000 336.336000 253.904000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.000000 336.336000 257.804000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.900000 336.336000 261.704000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.800000 336.336000 265.604000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.700000 336.336000 269.504000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.600000 336.336000 273.404000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.500000 336.336000 277.304000 324.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 336.336000 284.332000 324.336000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 336.336000 291.928000 324.336000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 322.436000 85.880000 310.436000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 322.436000 93.632000 310.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 93.608000 322.436000 100.700000 310.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 100.712000 322.436000 106.868000 310.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.916000 322.436000 111.728000 310.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 111.716000 322.436000 119.444000 310.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 119.420000 322.436000 127.148000 310.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 127.124000 322.436000 131.936000 310.436000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 131.900000 322.436000 135.704000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 135.704000 322.436000 139.508000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 139.508000 322.436000 143.312000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 143.312000 322.436000 147.116000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 147.116000 322.436000 150.920000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 150.920000 322.436000 154.724000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.724000 322.436000 158.528000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.528000 322.436000 162.332000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.332000 322.436000 166.136000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 166.136000 322.436000 169.940000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.940000 322.436000 173.744000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.744000 322.436000 177.548000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.548000 322.436000 181.352000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.352000 322.436000 185.156000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.156000 322.436000 188.960000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.960000 322.436000 192.764000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.764000 322.436000 196.568000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.568000 322.436000 200.372000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.372000 322.436000 204.176000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.176000 322.436000 207.980000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.980000 322.436000 211.784000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.784000 322.436000 215.588000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.588000 322.436000 219.392000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.392000 322.436000 223.196000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.196000 322.436000 227.000000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.000000 322.436000 230.804000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.804000 322.436000 234.608000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.608000 322.436000 238.412000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.412000 322.436000 242.216000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.216000 322.436000 246.020000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.020000 322.436000 249.824000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.824000 322.436000 253.628000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.628000 322.436000 257.432000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.432000 322.436000 261.236000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.236000 322.436000 265.040000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.040000 322.436000 268.844000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.844000 322.436000 272.648000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.648000 322.436000 276.452000 310.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 322.436000 284.332000 310.436000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 322.436000 291.928000 310.436000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 308.536000 85.880000 296.536000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 308.536000 93.632000 296.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 93.608000 308.536000 99.344000 296.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.308000 308.536000 103.136000 296.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.112000 308.536000 109.268000 296.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 109.316000 308.536000 114.128000 296.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 114.116000 308.536000 117.944000 296.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 117.920000 308.536000 125.012000 296.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.024000 308.536000 128.828000 296.536000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 128.828000 308.536000 132.632000 296.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 132.632000 308.536000 141.296000 296.536000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 141.332000 308.536000 149.012000 296.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 149.036000 308.536000 156.188000 296.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 156.236000 308.536000 161.048000 296.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 161.036000 308.536000 168.764000 296.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 168.740000 308.536000 175.892000 296.536000 1.000000 0.000000 0.000000 1.000000 a
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 175.800000 308.536000 179.604000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.700000 308.536000 183.504000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.600000 308.536000 187.404000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.500000 308.536000 191.304000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.400000 308.536000 195.204000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.300000 308.536000 199.104000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.200000 308.536000 203.004000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.100000 308.536000 206.904000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.000000 308.536000 210.804000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.900000 308.536000 214.704000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.800000 308.536000 218.604000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.700000 308.536000 222.504000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.600000 308.536000 226.404000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.500000 308.536000 230.304000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.400000 308.536000 234.204000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.300000 308.536000 238.104000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.200000 308.536000 242.004000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.100000 308.536000 245.904000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.000000 308.536000 249.804000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.900000 308.536000 253.704000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.800000 308.536000 257.604000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.700000 308.536000 261.504000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.600000 308.536000 265.404000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.500000 308.536000 269.304000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.400000 308.536000 273.204000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.300000 308.536000 277.104000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.200000 308.536000 281.004000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.100000 308.536000 284.904000 296.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 308.536000 292.032000 296.536000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 294.636000 85.880000 282.636000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 294.636000 93.632000 282.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 93.608000 294.636000 99.344000 282.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.308000 294.636000 103.136000 282.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.112000 294.636000 109.268000 282.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 109.316000 294.636000 114.128000 282.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 114.116000 294.636000 125.492000 282.636000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 125.516000 294.636000 132.668000 282.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 132.716000 294.636000 138.872000 282.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 138.920000 294.636000 142.724000 282.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.724000 294.636000 150.404000 282.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 150.428000 294.636000 157.520000 282.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 157.532000 294.636000 164.252000 282.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 164.228000 294.636000 171.452000 282.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 171.428000 294.636000 177.164000 282.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 177.128000 294.636000 184.280000 282.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 184.328000 294.636000 189.140000 282.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 189.128000 294.636000 192.956000 282.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 192.932000 294.636000 200.156000 282.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 200.132000 294.636000 207.860000 282.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 207.836000 294.636000 213.992000 282.636000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 214.000000 294.636000 217.804000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 217.900000 294.636000 221.704000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.800000 294.636000 225.604000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.700000 294.636000 229.504000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.600000 294.636000 233.404000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.500000 294.636000 237.304000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.400000 294.636000 241.204000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.300000 294.636000 245.104000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.200000 294.636000 249.004000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.100000 294.636000 252.904000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.000000 294.636000 256.804000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.900000 294.636000 260.704000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.800000 294.636000 264.604000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.700000 294.636000 268.504000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.600000 294.636000 272.404000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.500000 294.636000 276.304000 282.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 294.636000 284.332000 282.636000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 294.636000 291.928000 282.636000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 280.736000 85.880000 268.736000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 280.736000 93.632000 268.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 93.608000 280.736000 99.344000 268.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.308000 280.736000 106.076000 268.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 106.112000 280.736000 112.268000 268.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.316000 280.736000 119.468000 268.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 119.516000 280.736000 127.244000 268.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 127.220000 280.736000 132.032000 268.736000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.020000 280.736000 139.748000 268.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 139.724000 280.736000 146.816000 268.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.828000 280.736000 158.204000 268.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 158.228000 280.736000 165.956000 268.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 165.932000 280.736000 177.308000 268.736000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 177.332000 280.736000 183.488000 268.736000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 183.400000 280.736000 187.204000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.300000 280.736000 191.104000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.200000 280.736000 195.004000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.100000 280.736000 198.904000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.000000 280.736000 202.804000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.900000 280.736000 206.704000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.800000 280.736000 210.604000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.700000 280.736000 214.504000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.600000 280.736000 218.404000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.500000 280.736000 222.304000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.400000 280.736000 226.204000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.300000 280.736000 230.104000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.200000 280.736000 234.004000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.100000 280.736000 237.904000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.000000 280.736000 241.804000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.900000 280.736000 245.704000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.800000 280.736000 249.604000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.700000 280.736000 253.504000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.600000 280.736000 257.404000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.500000 280.736000 261.304000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.400000 280.736000 265.204000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.300000 280.736000 269.104000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.200000 280.736000 273.004000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.100000 280.736000 276.904000 268.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 280.736000 284.332000 268.736000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 280.736000 291.928000 268.736000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 266.836000 85.880000 254.836000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 266.836000 93.632000 254.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 93.608000 266.836000 99.344000 254.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.308000 266.836000 106.076000 254.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 106.112000 266.836000 112.268000 254.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.316000 266.836000 116.144000 254.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.120000 266.836000 123.212000 254.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 123.224000 266.836000 128.960000 254.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 128.924000 266.836000 132.728000 254.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 132.728000 266.836000 141.536000 254.836000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 141.524000 266.836000 149.252000 254.836000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 149.228000 266.836000 153.056000 254.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.032000 266.836000 156.860000 254.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 156.836000 266.836000 164.516000 254.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 164.540000 266.836000 168.368000 254.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 168.344000 266.836000 176.072000 254.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 176.048000 266.836000 183.728000 254.836000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 183.800000 266.836000 187.604000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.700000 266.836000 191.504000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.600000 266.836000 195.404000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.500000 266.836000 199.304000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.400000 266.836000 203.204000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.300000 266.836000 207.104000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.200000 266.836000 211.004000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.100000 266.836000 214.904000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.000000 266.836000 218.804000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.900000 266.836000 222.704000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.800000 266.836000 226.604000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.700000 266.836000 230.504000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.600000 266.836000 234.404000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.500000 266.836000 238.304000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.400000 266.836000 242.204000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.300000 266.836000 246.104000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.200000 266.836000 250.004000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.100000 266.836000 253.904000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.000000 266.836000 257.804000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.900000 266.836000 261.704000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.800000 266.836000 265.604000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.700000 266.836000 269.504000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.600000 266.836000 273.404000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.500000 266.836000 277.304000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.400000 266.836000 281.204000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.300000 266.836000 285.104000 254.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 266.836000 292.032000 254.836000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 252.936000 85.880000 240.936000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 252.936000 93.128000 240.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.104000 252.936000 100.256000 240.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 100.304000 252.936000 105.116000 240.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 105.104000 252.936000 108.908000 240.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.908000 252.936000 114.644000 240.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 114.608000 252.936000 121.760000 240.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 121.808000 252.936000 128.528000 240.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 128.504000 252.936000 135.764000 240.936000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 135.700000 252.936000 139.504000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 139.504000 252.936000 143.308000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 143.308000 252.936000 147.112000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 147.112000 252.936000 150.916000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 150.916000 252.936000 154.720000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.720000 252.936000 158.524000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.524000 252.936000 162.328000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.328000 252.936000 166.132000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 166.132000 252.936000 169.936000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.936000 252.936000 173.740000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.740000 252.936000 177.544000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.544000 252.936000 181.348000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.348000 252.936000 185.152000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.152000 252.936000 188.956000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.956000 252.936000 192.760000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.760000 252.936000 196.564000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.564000 252.936000 200.368000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.368000 252.936000 204.172000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.172000 252.936000 207.976000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.976000 252.936000 211.780000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.780000 252.936000 215.584000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.584000 252.936000 219.388000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.388000 252.936000 223.192000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.192000 252.936000 226.996000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.996000 252.936000 230.800000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.800000 252.936000 234.604000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.604000 252.936000 238.408000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.408000 252.936000 242.212000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.212000 252.936000 246.016000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.016000 252.936000 249.820000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.820000 252.936000 253.624000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.624000 252.936000 257.428000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.428000 252.936000 261.232000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.232000 252.936000 265.036000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.036000 252.936000 268.840000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.840000 252.936000 272.644000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.644000 252.936000 276.448000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.448000 252.936000 280.252000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.252000 252.936000 284.056000 240.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 252.936000 292.032000 240.936000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 239.036000 85.880000 227.036000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 239.036000 93.128000 227.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.104000 239.036000 99.824000 227.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 99.800000 239.036000 107.060000 227.036000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 107.096000 239.036000 111.908000 227.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 111.896000 239.036000 119.048000 227.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 119.096000 239.036000 122.924000 227.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.900000 239.036000 126.728000 227.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 126.704000 239.036000 132.860000 227.036000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 132.800000 239.036000 136.604000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 136.700000 239.036000 140.504000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 140.600000 239.036000 144.404000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.500000 239.036000 148.304000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.400000 239.036000 152.204000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.300000 239.036000 156.104000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.200000 239.036000 160.004000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.100000 239.036000 163.904000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.000000 239.036000 167.804000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 167.900000 239.036000 171.704000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 171.800000 239.036000 175.604000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.700000 239.036000 179.504000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.600000 239.036000 183.404000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.500000 239.036000 187.304000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.400000 239.036000 191.204000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.300000 239.036000 195.104000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.200000 239.036000 199.004000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.100000 239.036000 202.904000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.000000 239.036000 206.804000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.900000 239.036000 210.704000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.800000 239.036000 214.604000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.700000 239.036000 218.504000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.600000 239.036000 222.404000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.500000 239.036000 226.304000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.400000 239.036000 230.204000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.300000 239.036000 234.104000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.200000 239.036000 238.004000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.100000 239.036000 241.904000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.000000 239.036000 245.804000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.900000 239.036000 249.704000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.800000 239.036000 253.604000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.700000 239.036000 257.504000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.600000 239.036000 261.404000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.500000 239.036000 265.304000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.400000 239.036000 269.204000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.300000 239.036000 273.104000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.200000 239.036000 277.004000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.100000 239.036000 280.904000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.000000 239.036000 284.804000 227.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 239.036000 292.032000 227.036000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 225.136000 85.880000 213.136000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 85.904000 225.136000 93.128000 213.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.104000 225.136000 100.832000 213.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 100.808000 225.136000 104.636000 213.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.612000 225.136000 109.052000 213.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 109.016000 225.136000 116.108000 213.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 116.120000 225.136000 121.856000 213.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.820000 225.136000 129.044000 213.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.020000 225.136000 136.748000 213.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 136.724000 225.136000 142.880000 213.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 142.928000 225.136000 146.732000 213.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.732000 225.136000 151.544000 213.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 151.532000 225.136000 157.268000 213.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 157.232000 225.136000 164.324000 213.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 164.336000 225.136000 171.428000 213.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 171.440000 225.136000 177.596000 213.136000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 177.700000 225.136000 181.504000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.504000 225.136000 185.308000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.308000 225.136000 189.112000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 189.112000 225.136000 192.916000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.916000 225.136000 196.720000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.720000 225.136000 200.524000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.524000 225.136000 204.328000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.328000 225.136000 208.132000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 208.132000 225.136000 211.936000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.936000 225.136000 215.740000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.740000 225.136000 219.544000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.544000 225.136000 223.348000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.348000 225.136000 227.152000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.152000 225.136000 230.956000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.956000 225.136000 234.760000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.760000 225.136000 238.564000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.564000 225.136000 242.368000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.368000 225.136000 246.172000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.172000 225.136000 249.976000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.976000 225.136000 253.780000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.780000 225.136000 257.584000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.584000 225.136000 261.388000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.388000 225.136000 265.192000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.192000 225.136000 268.996000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.996000 225.136000 272.800000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.800000 225.136000 276.604000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.604000 225.136000 280.408000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.408000 225.136000 284.212000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 284.212000 225.136000 288.016000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 288.016000 225.136000 291.820000 213.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 211.236000 100.412000 199.236000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 100.400000 211.236000 107.624000 199.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 107.600000 211.236000 115.328000 199.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 115.304000 211.236000 122.984000 199.236000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 123.008000 211.236000 126.836000 199.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 126.812000 211.236000 133.964000 199.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 134.012000 211.236000 140.168000 199.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 140.216000 211.236000 144.020000 199.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 144.020000 211.236000 152.336000 199.236000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 152.324000 211.236000 156.152000 199.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 156.128000 211.236000 161.864000 199.236000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 161.800000 211.236000 165.604000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.604000 211.236000 169.408000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.408000 211.236000 173.212000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.212000 211.236000 177.016000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.016000 211.236000 180.820000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.820000 211.236000 184.624000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.624000 211.236000 188.428000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.428000 211.236000 192.232000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.232000 211.236000 196.036000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.036000 211.236000 199.840000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.840000 211.236000 203.644000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.644000 211.236000 207.448000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.448000 211.236000 211.252000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.252000 211.236000 215.056000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.056000 211.236000 218.860000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.860000 211.236000 222.664000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.664000 211.236000 226.468000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.468000 211.236000 230.272000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.272000 211.236000 234.076000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.076000 211.236000 237.880000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.880000 211.236000 241.684000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.684000 211.236000 245.488000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.488000 211.236000 249.292000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.292000 211.236000 253.096000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.096000 211.236000 256.900000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.900000 211.236000 260.704000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.704000 211.236000 264.508000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.508000 211.236000 268.312000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.312000 211.236000 272.116000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.116000 211.236000 275.920000 199.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 211.236000 284.332000 199.236000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 211.236000 291.928000 199.236000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 197.336000 98.864000 185.336000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 98.900000 197.336000 102.728000 185.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 102.704000 197.336000 110.432000 185.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.408000 197.336000 117.500000 185.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 117.512000 197.336000 123.668000 185.336000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 123.600000 197.336000 127.404000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 127.404000 197.336000 131.208000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 131.208000 197.336000 135.012000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 135.012000 197.336000 138.816000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 138.816000 197.336000 142.620000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 142.620000 197.336000 146.424000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 146.424000 197.336000 150.228000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 150.228000 197.336000 154.032000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.032000 197.336000 157.836000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.836000 197.336000 161.640000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.640000 197.336000 165.444000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.444000 197.336000 169.248000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.248000 197.336000 173.052000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.052000 197.336000 176.856000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.856000 197.336000 180.660000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.660000 197.336000 184.464000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.464000 197.336000 188.268000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.268000 197.336000 192.072000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.072000 197.336000 195.876000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.876000 197.336000 199.680000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.680000 197.336000 203.484000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.484000 197.336000 207.288000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.288000 197.336000 211.092000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.092000 197.336000 214.896000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.896000 197.336000 218.700000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.700000 197.336000 222.504000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.504000 197.336000 226.308000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.308000 197.336000 230.112000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.112000 197.336000 233.916000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.916000 197.336000 237.720000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.720000 197.336000 241.524000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.524000 197.336000 245.328000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.328000 197.336000 249.132000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.132000 197.336000 252.936000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.936000 197.336000 256.740000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.740000 197.336000 260.544000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.544000 197.336000 264.348000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.348000 197.336000 268.152000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.152000 197.336000 271.956000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.956000 197.336000 275.760000 185.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 197.336000 284.332000 185.336000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 197.336000 291.928000 185.336000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 183.436000 99.020000 171.436000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 98.996000 183.436000 106.676000 171.436000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 106.700000 183.436000 112.436000 171.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.400000 183.436000 120.128000 171.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 120.104000 183.436000 126.824000 171.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 126.800000 183.436000 133.892000 171.436000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 133.900000 183.436000 137.704000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.800000 183.436000 141.604000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.700000 183.436000 145.504000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.600000 183.436000 149.404000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.500000 183.436000 153.304000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.400000 183.436000 157.204000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.300000 183.436000 161.104000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.200000 183.436000 165.004000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.100000 183.436000 168.904000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.000000 183.436000 172.804000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.900000 183.436000 176.704000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.800000 183.436000 180.604000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.700000 183.436000 184.504000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.600000 183.436000 188.404000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.500000 183.436000 192.304000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.400000 183.436000 196.204000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.300000 183.436000 200.104000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.200000 183.436000 204.004000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.100000 183.436000 207.904000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 208.000000 183.436000 211.804000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.900000 183.436000 215.704000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.800000 183.436000 219.604000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.700000 183.436000 223.504000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.600000 183.436000 227.404000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.500000 183.436000 231.304000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.400000 183.436000 235.204000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 235.300000 183.436000 239.104000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 239.200000 183.436000 243.004000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 243.100000 183.436000 246.904000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 247.000000 183.436000 250.804000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.900000 183.436000 254.704000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.800000 183.436000 258.604000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.700000 183.436000 262.504000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.600000 183.436000 266.404000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.500000 183.436000 270.304000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.400000 183.436000 274.204000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 274.300000 183.436000 278.104000 171.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 183.436000 284.332000 171.436000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 183.436000 291.928000 171.436000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 169.456000 87.104000 157.456000 1.000000 0.000000 0.000000 1.000000 D
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 155.436000 86.312000 143.436000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 86.300000 155.436000 93.452000 143.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.500000 155.436000 102.020000 143.436000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 101.996000 155.436000 109.220000 143.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.196000 155.436000 116.876000 143.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.900000 155.436000 120.728000 143.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 120.704000 155.436000 124.532000 143.436000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 124.508000 155.436000 130.664000 143.436000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 130.600000 155.436000 134.404000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 134.404000 155.436000 138.208000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 138.208000 155.436000 142.012000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 142.012000 155.436000 145.816000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.816000 155.436000 149.620000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.620000 155.436000 153.424000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.424000 155.436000 157.228000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.228000 155.436000 161.032000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.032000 155.436000 164.836000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.836000 155.436000 168.640000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.640000 155.436000 172.444000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.444000 155.436000 176.248000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.248000 155.436000 180.052000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.052000 155.436000 183.856000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.856000 155.436000 187.660000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.660000 155.436000 191.464000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.464000 155.436000 195.268000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.268000 155.436000 199.072000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.072000 155.436000 202.876000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.876000 155.436000 206.680000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.680000 155.436000 210.484000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.484000 155.436000 214.288000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.288000 155.436000 218.092000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.092000 155.436000 221.896000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.896000 155.436000 225.700000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.700000 155.436000 229.504000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.504000 155.436000 233.308000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.308000 155.436000 237.112000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.112000 155.436000 240.916000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.916000 155.436000 244.720000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.720000 155.436000 248.524000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.524000 155.436000 252.328000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.328000 155.436000 256.132000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.132000 155.436000 259.936000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 259.936000 155.436000 263.740000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.740000 155.436000 267.544000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.544000 155.436000 271.348000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.348000 155.436000 275.152000 143.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 155.436000 284.332000 143.436000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 155.436000 291.928000 143.436000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 141.536000 86.312000 129.536000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 86.300000 141.536000 93.452000 129.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.500000 141.536000 101.228000 129.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 101.204000 141.536000 105.032000 129.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 105.008000 141.536000 108.836000 129.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 108.812000 141.536000 115.964000 129.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.012000 141.536000 122.168000 129.536000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 122.100000 141.536000 125.904000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 126.000000 141.536000 129.804000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 129.900000 141.536000 133.704000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.800000 141.536000 137.604000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.700000 141.536000 141.504000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.600000 141.536000 145.404000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.500000 141.536000 149.304000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.400000 141.536000 153.204000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.300000 141.536000 157.104000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.200000 141.536000 161.004000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.100000 141.536000 164.904000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.000000 141.536000 168.804000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.900000 141.536000 172.704000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.800000 141.536000 176.604000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.700000 141.536000 180.504000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.600000 141.536000 184.404000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.500000 141.536000 188.304000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.400000 141.536000 192.204000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.300000 141.536000 196.104000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.200000 141.536000 200.004000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.100000 141.536000 203.904000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.000000 141.536000 207.804000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.900000 141.536000 211.704000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.800000 141.536000 215.604000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.700000 141.536000 219.504000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.600000 141.536000 223.404000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.500000 141.536000 227.304000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.400000 141.536000 231.204000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.300000 141.536000 235.104000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 235.200000 141.536000 239.004000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 239.100000 141.536000 242.904000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 243.000000 141.536000 246.804000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.900000 141.536000 250.704000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.800000 141.536000 254.604000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.700000 141.536000 258.504000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.600000 141.536000 262.404000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.500000 141.536000 266.304000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.400000 141.536000 270.204000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.300000 141.536000 274.104000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 274.200000 141.536000 278.004000 129.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 141.536000 284.332000 129.536000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 141.536000 291.928000 129.536000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 127.636000 86.312000 115.636000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 86.300000 127.636000 93.392000 115.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 93.404000 127.636000 100.124000 115.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 100.100000 127.636000 103.928000 115.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.904000 127.636000 111.584000 115.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 111.608000 127.636000 119.336000 115.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 119.312000 127.636000 126.536000 115.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 126.512000 127.636000 134.240000 115.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 134.216000 127.636000 140.372000 115.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 140.420000 127.636000 144.224000 115.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 144.224000 127.636000 149.036000 115.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 149.024000 127.636000 154.760000 115.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 154.724000 127.636000 161.816000 115.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 161.828000 127.636000 168.920000 115.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 168.932000 127.636000 175.088000 115.636000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 175.100000 127.636000 178.904000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.000000 127.636000 182.804000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 182.900000 127.636000 186.704000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 186.800000 127.636000 190.604000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 190.700000 127.636000 194.504000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 194.600000 127.636000 198.404000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.500000 127.636000 202.304000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.400000 127.636000 206.204000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.300000 127.636000 210.104000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.200000 127.636000 214.004000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.100000 127.636000 217.904000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.000000 127.636000 221.804000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.900000 127.636000 225.704000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.800000 127.636000 229.604000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.700000 127.636000 233.504000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.600000 127.636000 237.404000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.500000 127.636000 241.304000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.400000 127.636000 245.204000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.300000 127.636000 249.104000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.200000 127.636000 253.004000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.100000 127.636000 256.904000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.000000 127.636000 260.804000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.900000 127.636000 264.704000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.800000 127.636000 268.604000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.700000 127.636000 272.504000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.600000 127.636000 276.404000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.500000 127.636000 280.304000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.400000 127.636000 284.204000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 284.300000 127.636000 288.104000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 288.200000 127.636000 292.004000 115.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 334.400000 672.936000 343.208000 660.936000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 343.196000 672.936000 350.288000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 350.300000 672.936000 357.392000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 357.404000 672.936000 364.124000 660.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 364.100000 672.936000 371.828000 660.936000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 371.800000 672.936000 375.604000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.604000 672.936000 379.408000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.408000 672.936000 383.212000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.212000 672.936000 387.016000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.016000 672.936000 390.820000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.820000 672.936000 394.624000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.624000 672.936000 398.428000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.428000 672.936000 402.232000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.232000 672.936000 406.036000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.036000 672.936000 409.840000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.840000 672.936000 413.644000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.644000 672.936000 417.448000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.448000 672.936000 421.252000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.252000 672.936000 425.056000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.056000 672.936000 428.860000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.860000 672.936000 432.664000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.664000 672.936000 436.468000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.468000 672.936000 440.272000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.272000 672.936000 444.076000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.076000 672.936000 447.880000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.880000 672.936000 451.684000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.684000 672.936000 455.488000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.488000 672.936000 459.292000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.292000 672.936000 463.096000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.096000 672.936000 466.900000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.900000 672.936000 470.704000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.704000 672.936000 474.508000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.508000 672.936000 478.312000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.312000 672.936000 482.116000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.116000 672.936000 485.920000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.920000 672.936000 489.724000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.724000 672.936000 493.528000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.528000 672.936000 497.332000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.332000 672.936000 501.136000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.136000 672.936000 504.940000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.940000 672.936000 508.744000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.744000 672.936000 512.548000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.548000 672.936000 516.352000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.352000 672.936000 520.156000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 672.936000 527.932000 660.936000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 672.936000 535.528000 660.936000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 334.400000 659.036000 343.580000 647.036000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 343.604000 659.036000 351.332000 647.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 351.308000 659.036000 358.400000 647.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 358.412000 659.036000 364.568000 647.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 364.616000 659.036000 369.428000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 369.416000 659.036000 377.144000 647.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 377.120000 659.036000 384.848000 647.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 384.824000 659.036000 389.636000 647.036000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 389.600000 659.036000 393.404000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.404000 659.036000 397.208000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.208000 659.036000 401.012000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.012000 659.036000 404.816000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.816000 659.036000 408.620000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.620000 659.036000 412.424000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.424000 659.036000 416.228000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.228000 659.036000 420.032000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.032000 659.036000 423.836000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.836000 659.036000 427.640000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.640000 659.036000 431.444000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.444000 659.036000 435.248000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.248000 659.036000 439.052000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.052000 659.036000 442.856000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.856000 659.036000 446.660000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.660000 659.036000 450.464000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.464000 659.036000 454.268000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.268000 659.036000 458.072000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.072000 659.036000 461.876000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.876000 659.036000 465.680000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.680000 659.036000 469.484000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.484000 659.036000 473.288000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.288000 659.036000 477.092000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.092000 659.036000 480.896000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.896000 659.036000 484.700000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.700000 659.036000 488.504000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.504000 659.036000 492.308000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.308000 659.036000 496.112000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.112000 659.036000 499.916000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.916000 659.036000 503.720000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.720000 659.036000 507.524000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.524000 659.036000 511.328000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.328000 659.036000 515.132000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.132000 659.036000 518.936000 647.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 659.036000 527.932000 647.036000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 659.036000 535.528000 647.036000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 334.400000 645.136000 344.228000 633.136000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 344.204000 645.136000 351.356000 633.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 351.404000 645.136000 358.664000 633.136000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 358.600000 645.136000 362.404000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.404000 645.136000 366.208000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.208000 645.136000 370.012000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.012000 645.136000 373.816000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 373.816000 645.136000 377.620000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.620000 645.136000 381.424000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.424000 645.136000 385.228000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.228000 645.136000 389.032000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.032000 645.136000 392.836000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.836000 645.136000 396.640000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.640000 645.136000 400.444000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.444000 645.136000 404.248000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.248000 645.136000 408.052000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.052000 645.136000 411.856000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.856000 645.136000 415.660000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.660000 645.136000 419.464000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.464000 645.136000 423.268000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.268000 645.136000 427.072000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.072000 645.136000 430.876000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.876000 645.136000 434.680000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.680000 645.136000 438.484000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.484000 645.136000 442.288000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.288000 645.136000 446.092000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.092000 645.136000 449.896000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.896000 645.136000 453.700000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.700000 645.136000 457.504000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.504000 645.136000 461.308000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.308000 645.136000 465.112000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.112000 645.136000 468.916000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.916000 645.136000 472.720000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.720000 645.136000 476.524000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.524000 645.136000 480.328000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.328000 645.136000 484.132000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.132000 645.136000 487.936000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 487.936000 645.136000 491.740000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 491.740000 645.136000 495.544000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.544000 645.136000 499.348000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.348000 645.136000 503.152000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.152000 645.136000 506.956000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.956000 645.136000 510.760000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 510.760000 645.136000 514.564000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.564000 645.136000 518.368000 633.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 645.136000 527.932000 633.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 645.136000 535.528000 633.136000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 631.236000 329.912000 619.236000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 329.900000 631.236000 333.728000 619.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 333.704000 631.236000 337.532000 619.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 337.508000 631.236000 341.336000 619.236000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 341.300000 631.236000 345.104000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 345.104000 631.236000 348.908000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 348.908000 631.236000 352.712000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 352.712000 631.236000 356.516000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 356.516000 631.236000 360.320000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 360.320000 631.236000 364.124000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 364.124000 631.236000 367.928000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.928000 631.236000 371.732000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.732000 631.236000 375.536000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.536000 631.236000 379.340000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.340000 631.236000 383.144000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.144000 631.236000 386.948000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.948000 631.236000 390.752000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.752000 631.236000 394.556000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.556000 631.236000 398.360000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.360000 631.236000 402.164000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.164000 631.236000 405.968000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.968000 631.236000 409.772000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.772000 631.236000 413.576000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.576000 631.236000 417.380000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.380000 631.236000 421.184000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.184000 631.236000 424.988000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.988000 631.236000 428.792000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.792000 631.236000 432.596000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.596000 631.236000 436.400000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.400000 631.236000 440.204000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.204000 631.236000 444.008000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.008000 631.236000 447.812000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.812000 631.236000 451.616000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.616000 631.236000 455.420000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.420000 631.236000 459.224000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.224000 631.236000 463.028000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.028000 631.236000 466.832000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.832000 631.236000 470.636000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.636000 631.236000 474.440000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.440000 631.236000 478.244000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.244000 631.236000 482.048000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.048000 631.236000 485.852000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.852000 631.236000 489.656000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.656000 631.236000 493.460000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.460000 631.236000 497.264000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.264000 631.236000 501.068000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.068000 631.236000 504.872000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.872000 631.236000 508.676000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.676000 631.236000 512.480000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.480000 631.236000 516.284000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.284000 631.236000 520.088000 619.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 631.236000 527.932000 619.236000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 631.236000 535.528000 619.236000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 617.336000 329.912000 605.336000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 329.900000 617.336000 333.728000 605.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 333.704000 617.336000 339.860000 605.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 339.908000 617.336000 347.636000 605.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 347.612000 617.336000 351.416000 605.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 351.416000 617.336000 356.228000 605.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 356.216000 617.336000 363.440000 605.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 363.416000 617.336000 373.676000 605.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 373.712000 617.336000 380.804000 605.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 380.816000 617.336000 384.644000 605.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 384.620000 617.336000 390.776000 605.336000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 390.800000 617.336000 394.604000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.604000 617.336000 398.408000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.408000 617.336000 402.212000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.212000 617.336000 406.016000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.016000 617.336000 409.820000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.820000 617.336000 413.624000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.624000 617.336000 417.428000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.428000 617.336000 421.232000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.232000 617.336000 425.036000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.036000 617.336000 428.840000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.840000 617.336000 432.644000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.644000 617.336000 436.448000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.448000 617.336000 440.252000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.252000 617.336000 444.056000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.056000 617.336000 447.860000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.860000 617.336000 451.664000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.664000 617.336000 455.468000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.468000 617.336000 459.272000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.272000 617.336000 463.076000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.076000 617.336000 466.880000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.880000 617.336000 470.684000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.684000 617.336000 474.488000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.488000 617.336000 478.292000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.292000 617.336000 482.096000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.096000 617.336000 485.900000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.900000 617.336000 489.704000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.704000 617.336000 493.508000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.508000 617.336000 497.312000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.312000 617.336000 501.116000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.116000 617.336000 504.920000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.920000 617.336000 508.724000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.724000 617.336000 512.528000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.528000 617.336000 516.332000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.332000 617.336000 520.136000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.136000 617.336000 523.940000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.940000 617.336000 527.744000 605.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 617.336000 535.632000 605.336000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 603.436000 329.912000 591.436000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 329.900000 603.436000 333.728000 591.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 333.704000 603.436000 339.860000 591.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 339.908000 603.436000 347.636000 591.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 347.612000 603.436000 357.872000 591.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 357.908000 603.436000 365.060000 591.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 365.108000 603.436000 371.264000 591.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 371.312000 603.436000 379.040000 591.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 379.016000 603.436000 386.108000 591.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 386.120000 603.436000 391.856000 591.436000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 391.700000 603.436000 395.504000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.600000 603.436000 399.404000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.500000 603.436000 403.304000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 403.400000 603.436000 407.204000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.300000 603.436000 411.104000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.200000 603.436000 415.004000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.100000 603.436000 418.904000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.000000 603.436000 422.804000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.900000 603.436000 426.704000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.800000 603.436000 430.604000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.700000 603.436000 434.504000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.600000 603.436000 438.404000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.500000 603.436000 442.304000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.400000 603.436000 446.204000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.300000 603.436000 450.104000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.200000 603.436000 454.004000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.100000 603.436000 457.904000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.000000 603.436000 461.804000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.900000 603.436000 465.704000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.800000 603.436000 469.604000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.700000 603.436000 473.504000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.600000 603.436000 477.404000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.500000 603.436000 481.304000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.400000 603.436000 485.204000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.300000 603.436000 489.104000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.200000 603.436000 493.004000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.100000 603.436000 496.904000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.000000 603.436000 500.804000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.900000 603.436000 504.704000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.800000 603.436000 508.604000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.700000 603.436000 512.504000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.600000 603.436000 516.404000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.500000 603.436000 520.304000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.400000 603.436000 524.204000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.300000 603.436000 528.104000 591.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 603.436000 535.632000 591.436000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 589.536000 329.912000 577.536000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 329.900000 589.536000 333.728000 577.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 333.704000 589.536000 340.472000 577.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 340.508000 589.536000 344.336000 577.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 344.312000 589.536000 352.040000 577.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 352.016000 589.536000 359.696000 577.536000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 359.720000 589.536000 363.524000 577.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 363.524000 589.536000 371.204000 577.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 371.228000 589.536000 378.452000 577.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 378.428000 589.536000 385.580000 577.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 385.628000 589.536000 391.364000 577.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 391.328000 589.536000 399.008000 577.536000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 399.000000 589.536000 402.804000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.900000 589.536000 406.704000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.800000 589.536000 410.604000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.700000 589.536000 414.504000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.600000 589.536000 418.404000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.500000 589.536000 422.304000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.400000 589.536000 426.204000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.300000 589.536000 430.104000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.200000 589.536000 434.004000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.100000 589.536000 437.904000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.000000 589.536000 441.804000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.900000 589.536000 445.704000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.800000 589.536000 449.604000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.700000 589.536000 453.504000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.600000 589.536000 457.404000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.500000 589.536000 461.304000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.400000 589.536000 465.204000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.300000 589.536000 469.104000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.200000 589.536000 473.004000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.100000 589.536000 476.904000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.000000 589.536000 480.804000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.900000 589.536000 484.704000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.800000 589.536000 488.604000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.700000 589.536000 492.504000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.600000 589.536000 496.404000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.500000 589.536000 500.304000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.400000 589.536000 504.204000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.300000 589.536000 508.104000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.200000 589.536000 512.004000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.100000 589.536000 515.904000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.000000 589.536000 519.804000 577.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 589.536000 527.932000 577.536000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 589.536000 535.528000 577.536000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 575.636000 329.912000 563.636000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 329.900000 575.636000 337.124000 563.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 337.100000 575.636000 344.828000 563.636000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 344.804000 575.636000 352.484000 563.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 352.508000 575.636000 356.336000 563.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 356.312000 575.636000 363.464000 563.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 363.512000 575.636000 369.668000 563.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 369.716000 575.636000 373.520000 563.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 373.520000 575.636000 381.836000 563.636000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 381.824000 575.636000 385.652000 563.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 385.628000 575.636000 391.364000 563.636000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 391.300000 575.636000 395.104000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.200000 575.636000 399.004000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.100000 575.636000 402.904000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 403.000000 575.636000 406.804000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.900000 575.636000 410.704000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.800000 575.636000 414.604000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.700000 575.636000 418.504000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.600000 575.636000 422.404000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.500000 575.636000 426.304000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.400000 575.636000 430.204000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.300000 575.636000 434.104000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.200000 575.636000 438.004000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.100000 575.636000 441.904000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.000000 575.636000 445.804000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.900000 575.636000 449.704000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.800000 575.636000 453.604000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.700000 575.636000 457.504000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.600000 575.636000 461.404000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.500000 575.636000 465.304000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.400000 575.636000 469.204000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.300000 575.636000 473.104000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.200000 575.636000 477.004000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.100000 575.636000 480.904000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.000000 575.636000 484.804000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.900000 575.636000 488.704000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.800000 575.636000 492.604000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.700000 575.636000 496.504000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.600000 575.636000 500.404000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.500000 575.636000 504.304000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.400000 575.636000 508.204000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.300000 575.636000 512.104000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.200000 575.636000 516.004000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.100000 575.636000 519.904000 563.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 575.636000 527.932000 563.636000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 575.636000 535.528000 563.636000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 561.736000 329.912000 549.736000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 329.900000 561.736000 335.636000 549.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 334.304000 561.736000 338.108000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 338.108000 561.736000 341.912000 549.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 341.912000 561.736000 350.132000 549.736000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 350.108000 561.736000 357.836000 549.736000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 357.812000 561.736000 364.904000 549.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 364.916000 561.736000 371.072000 549.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 371.120000 561.736000 377.276000 549.736000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 377.200000 561.736000 381.004000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.100000 561.736000 384.904000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.000000 561.736000 388.804000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.900000 561.736000 392.704000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.800000 561.736000 396.604000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.700000 561.736000 400.504000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.600000 561.736000 404.404000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.500000 561.736000 408.304000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.400000 561.736000 412.204000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.300000 561.736000 416.104000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.200000 561.736000 420.004000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.100000 561.736000 423.904000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.000000 561.736000 427.804000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.900000 561.736000 431.704000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.800000 561.736000 435.604000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.700000 561.736000 439.504000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.600000 561.736000 443.404000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.500000 561.736000 447.304000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.400000 561.736000 451.204000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.300000 561.736000 455.104000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.200000 561.736000 459.004000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.100000 561.736000 462.904000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.000000 561.736000 466.804000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.900000 561.736000 470.704000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.800000 561.736000 474.604000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.700000 561.736000 478.504000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.600000 561.736000 482.404000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.500000 561.736000 486.304000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.400000 561.736000 490.204000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.300000 561.736000 494.104000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.200000 561.736000 498.004000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.100000 561.736000 501.904000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 502.000000 561.736000 505.804000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.900000 561.736000 509.704000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.800000 561.736000 513.604000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.700000 561.736000 517.504000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.600000 561.736000 521.404000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.500000 561.736000 525.304000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 525.400000 561.736000 529.204000 549.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 561.736000 535.632000 549.736000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 547.836000 329.912000 535.836000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 329.900000 547.836000 335.636000 535.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 335.600000 547.836000 339.428000 535.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 339.404000 547.836000 343.232000 535.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 343.208000 547.836000 347.036000 535.836000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 347.100000 547.836000 350.904000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 350.904000 547.836000 354.708000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 354.708000 547.836000 358.512000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.512000 547.836000 362.316000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.316000 547.836000 366.120000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.120000 547.836000 369.924000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 369.924000 547.836000 373.728000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 373.728000 547.836000 377.532000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.532000 547.836000 381.336000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.336000 547.836000 385.140000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.140000 547.836000 388.944000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.944000 547.836000 392.748000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.748000 547.836000 396.552000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.552000 547.836000 400.356000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.356000 547.836000 404.160000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.160000 547.836000 407.964000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.964000 547.836000 411.768000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.768000 547.836000 415.572000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.572000 547.836000 419.376000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.376000 547.836000 423.180000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.180000 547.836000 426.984000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.984000 547.836000 430.788000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.788000 547.836000 434.592000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.592000 547.836000 438.396000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.396000 547.836000 442.200000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.200000 547.836000 446.004000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.004000 547.836000 449.808000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.808000 547.836000 453.612000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.612000 547.836000 457.416000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.416000 547.836000 461.220000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.220000 547.836000 465.024000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.024000 547.836000 468.828000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.828000 547.836000 472.632000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.632000 547.836000 476.436000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.436000 547.836000 480.240000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.240000 547.836000 484.044000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.044000 547.836000 487.848000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 487.848000 547.836000 491.652000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 491.652000 547.836000 495.456000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.456000 547.836000 499.260000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.260000 547.836000 503.064000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.064000 547.836000 506.868000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.868000 547.836000 510.672000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 510.672000 547.836000 514.476000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.476000 547.836000 518.280000 535.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 547.836000 527.932000 535.836000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 547.836000 535.528000 535.836000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 533.936000 329.912000 521.936000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 329.900000 533.936000 335.636000 521.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 335.600000 533.936000 342.368000 521.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 342.404000 533.936000 349.496000 521.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 349.508000 533.936000 355.244000 521.936000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 355.200000 533.936000 359.004000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 359.004000 533.936000 362.808000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.808000 533.936000 366.612000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.612000 533.936000 370.416000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.416000 533.936000 374.220000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.220000 533.936000 378.024000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.024000 533.936000 381.828000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.828000 533.936000 385.632000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.632000 533.936000 389.436000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.436000 533.936000 393.240000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.240000 533.936000 397.044000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.044000 533.936000 400.848000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.848000 533.936000 404.652000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.652000 533.936000 408.456000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.456000 533.936000 412.260000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.260000 533.936000 416.064000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.064000 533.936000 419.868000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.868000 533.936000 423.672000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.672000 533.936000 427.476000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.476000 533.936000 431.280000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.280000 533.936000 435.084000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.084000 533.936000 438.888000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.888000 533.936000 442.692000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.692000 533.936000 446.496000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.496000 533.936000 450.300000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.300000 533.936000 454.104000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.104000 533.936000 457.908000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.908000 533.936000 461.712000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.712000 533.936000 465.516000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.516000 533.936000 469.320000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.320000 533.936000 473.124000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.124000 533.936000 476.928000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.928000 533.936000 480.732000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.732000 533.936000 484.536000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.536000 533.936000 488.340000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.340000 533.936000 492.144000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.144000 533.936000 495.948000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.948000 533.936000 499.752000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.752000 533.936000 503.556000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.556000 533.936000 507.360000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.360000 533.936000 511.164000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.164000 533.936000 514.968000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.968000 533.936000 518.772000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 518.772000 533.936000 522.576000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 522.576000 533.936000 526.380000 521.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 533.936000 535.632000 521.936000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 520.036000 329.912000 508.036000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 329.900000 520.036000 337.628000 508.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 337.604000 520.036000 343.760000 508.036000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 343.808000 520.036000 348.620000 508.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 348.608000 520.036000 356.288000 508.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 356.312000 520.036000 363.464000 508.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 363.512000 520.036000 371.240000 508.036000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 371.100000 520.036000 374.904000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.904000 520.036000 378.708000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.708000 520.036000 382.512000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.512000 520.036000 386.316000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.316000 520.036000 390.120000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.120000 520.036000 393.924000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.924000 520.036000 397.728000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.728000 520.036000 401.532000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.532000 520.036000 405.336000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.336000 520.036000 409.140000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.140000 520.036000 412.944000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.944000 520.036000 416.748000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.748000 520.036000 420.552000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.552000 520.036000 424.356000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.356000 520.036000 428.160000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.160000 520.036000 431.964000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.964000 520.036000 435.768000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.768000 520.036000 439.572000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.572000 520.036000 443.376000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.376000 520.036000 447.180000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.180000 520.036000 450.984000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.984000 520.036000 454.788000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.788000 520.036000 458.592000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.592000 520.036000 462.396000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.396000 520.036000 466.200000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.200000 520.036000 470.004000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.004000 520.036000 473.808000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.808000 520.036000 477.612000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.612000 520.036000 481.416000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.416000 520.036000 485.220000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.220000 520.036000 489.024000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.024000 520.036000 492.828000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.828000 520.036000 496.632000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.632000 520.036000 500.436000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.436000 520.036000 504.240000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.240000 520.036000 508.044000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.044000 520.036000 511.848000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.848000 520.036000 515.652000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.652000 520.036000 519.456000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.456000 520.036000 523.260000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.260000 520.036000 527.064000 508.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 520.036000 535.632000 508.036000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 320.300000 506.056000 329.444000 494.056000 1.000000 0.000000 0.000000 1.000000 E
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 492.036000 329.048000 480.036000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 329.096000 492.036000 332.924000 480.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.900000 492.036000 339.992000 480.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 340.004000 492.036000 346.724000 480.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 346.700000 492.036000 351.512000 480.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 351.500000 492.036000 357.236000 480.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 357.200000 492.036000 361.028000 480.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 361.004000 492.036000 367.724000 480.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 367.700000 492.036000 371.504000 480.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 371.504000 492.036000 382.880000 480.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 382.904000 492.036000 386.732000 480.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 386.708000 492.036000 393.464000 480.036000 1.000000 0.000000 0.000000 1.000000 x
+drawChar 393.512000 492.036000 400.604000 480.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 400.616000 492.036000 406.352000 480.036000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 406.400000 492.036000 410.204000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.300000 492.036000 414.104000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.200000 492.036000 418.004000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.100000 492.036000 421.904000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.000000 492.036000 425.804000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.900000 492.036000 429.704000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.800000 492.036000 433.604000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.700000 492.036000 437.504000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.600000 492.036000 441.404000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.500000 492.036000 445.304000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.400000 492.036000 449.204000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.300000 492.036000 453.104000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.200000 492.036000 457.004000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.100000 492.036000 460.904000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.000000 492.036000 464.804000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.900000 492.036000 468.704000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.800000 492.036000 472.604000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.700000 492.036000 476.504000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.600000 492.036000 480.404000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.500000 492.036000 484.304000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.400000 492.036000 488.204000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.300000 492.036000 492.104000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.200000 492.036000 496.004000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.100000 492.036000 499.904000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.000000 492.036000 503.804000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.900000 492.036000 507.704000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.800000 492.036000 511.604000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.700000 492.036000 515.504000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.600000 492.036000 519.404000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.500000 492.036000 523.304000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.400000 492.036000 527.204000 480.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 492.036000 535.632000 480.036000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 478.136000 329.048000 466.136000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 329.096000 478.136000 336.824000 466.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 336.800000 478.136000 344.480000 466.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 344.504000 478.136000 348.332000 466.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 348.308000 478.136000 355.460000 466.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 355.508000 478.136000 363.236000 466.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 363.212000 478.136000 370.892000 466.136000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 370.800000 478.136000 374.604000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.604000 478.136000 378.408000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.408000 478.136000 382.212000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.212000 478.136000 386.016000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.016000 478.136000 389.820000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.820000 478.136000 393.624000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.624000 478.136000 397.428000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.428000 478.136000 401.232000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.232000 478.136000 405.036000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.036000 478.136000 408.840000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.840000 478.136000 412.644000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.644000 478.136000 416.448000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.448000 478.136000 420.252000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.252000 478.136000 424.056000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.056000 478.136000 427.860000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.860000 478.136000 431.664000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.664000 478.136000 435.468000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.468000 478.136000 439.272000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.272000 478.136000 443.076000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.076000 478.136000 446.880000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.880000 478.136000 450.684000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.684000 478.136000 454.488000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.488000 478.136000 458.292000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.292000 478.136000 462.096000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.096000 478.136000 465.900000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.900000 478.136000 469.704000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.704000 478.136000 473.508000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.508000 478.136000 477.312000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.312000 478.136000 481.116000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.116000 478.136000 484.920000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.920000 478.136000 488.724000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.724000 478.136000 492.528000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.528000 478.136000 496.332000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.332000 478.136000 500.136000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.136000 478.136000 503.940000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.940000 478.136000 507.744000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.744000 478.136000 511.548000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.548000 478.136000 515.352000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.352000 478.136000 519.156000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.156000 478.136000 522.960000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 522.960000 478.136000 526.764000 466.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 478.136000 535.632000 466.136000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 320.300000 464.156000 328.808000 452.156000 1.000000 0.000000 0.000000 1.000000 F
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 450.136000 328.616000 438.136000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 328.604000 450.136000 332.432000 438.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 332.408000 450.136000 338.144000 438.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 338.108000 450.136000 344.264000 438.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.312000 450.136000 349.124000 438.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.112000 450.136000 352.916000 438.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 352.916000 450.136000 360.068000 438.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 360.116000 450.136000 363.944000 438.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 363.920000 450.136000 371.600000 438.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 371.624000 450.136000 375.428000 438.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 375.428000 450.136000 382.688000 438.136000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 382.724000 450.136000 386.552000 438.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 386.528000 450.136000 391.340000 438.136000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 391.300000 450.136000 395.104000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.200000 450.136000 399.004000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.100000 450.136000 402.904000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 403.000000 450.136000 406.804000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.900000 450.136000 410.704000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.800000 450.136000 414.604000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.700000 450.136000 418.504000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.600000 450.136000 422.404000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.500000 450.136000 426.304000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.400000 450.136000 430.204000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.300000 450.136000 434.104000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.200000 450.136000 438.004000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.100000 450.136000 441.904000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.000000 450.136000 445.804000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.900000 450.136000 449.704000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.800000 450.136000 453.604000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.700000 450.136000 457.504000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.600000 450.136000 461.404000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.500000 450.136000 465.304000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.400000 450.136000 469.204000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.300000 450.136000 473.104000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.200000 450.136000 477.004000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.100000 450.136000 480.904000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.000000 450.136000 484.804000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.900000 450.136000 488.704000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.800000 450.136000 492.604000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.700000 450.136000 496.504000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.600000 450.136000 500.404000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.500000 450.136000 504.304000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.400000 450.136000 508.204000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.300000 450.136000 512.104000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.200000 450.136000 516.004000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.100000 450.136000 519.904000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.000000 450.136000 523.804000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.900000 450.136000 527.704000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 450.136000 535.632000 438.136000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 436.236000 328.616000 424.236000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 328.604000 436.236000 332.432000 424.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 332.408000 436.236000 338.564000 424.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 338.612000 436.236000 346.340000 424.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 346.316000 436.236000 350.120000 424.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 350.120000 436.236000 357.800000 424.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 357.824000 436.236000 365.048000 424.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 365.024000 436.236000 372.752000 424.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 372.728000 436.236000 380.408000 424.236000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 380.400000 436.236000 384.204000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.300000 436.236000 388.104000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.200000 436.236000 392.004000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.100000 436.236000 395.904000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.000000 436.236000 399.804000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.900000 436.236000 403.704000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 403.800000 436.236000 407.604000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.700000 436.236000 411.504000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.600000 436.236000 415.404000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.500000 436.236000 419.304000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.400000 436.236000 423.204000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.300000 436.236000 427.104000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.200000 436.236000 431.004000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.100000 436.236000 434.904000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.000000 436.236000 438.804000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.900000 436.236000 442.704000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.800000 436.236000 446.604000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.700000 436.236000 450.504000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.600000 436.236000 454.404000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.500000 436.236000 458.304000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.400000 436.236000 462.204000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.300000 436.236000 466.104000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.200000 436.236000 470.004000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.100000 436.236000 473.904000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.000000 436.236000 477.804000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.900000 436.236000 481.704000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.800000 436.236000 485.604000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.700000 436.236000 489.504000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.600000 436.236000 493.404000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.500000 436.236000 497.304000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.400000 436.236000 501.204000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.300000 436.236000 505.104000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.200000 436.236000 509.004000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.100000 436.236000 512.904000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.000000 436.236000 516.804000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.900000 436.236000 520.704000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 436.236000 527.932000 424.236000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 436.236000 535.528000 424.236000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 422.336000 328.616000 410.336000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 328.604000 422.336000 332.432000 410.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.408000 422.336000 339.632000 410.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 339.608000 422.336000 349.868000 410.336000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 349.904000 422.336000 356.996000 410.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 357.008000 422.336000 362.744000 410.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.708000 422.336000 368.864000 410.336000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 368.900000 422.336000 372.704000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 372.800000 422.336000 376.604000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 376.700000 422.336000 380.504000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.600000 422.336000 384.404000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.500000 422.336000 388.304000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.400000 422.336000 392.204000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.300000 422.336000 396.104000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.200000 422.336000 400.004000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.100000 422.336000 403.904000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.000000 422.336000 407.804000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.900000 422.336000 411.704000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.800000 422.336000 415.604000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.700000 422.336000 419.504000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.600000 422.336000 423.404000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.500000 422.336000 427.304000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.400000 422.336000 431.204000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.300000 422.336000 435.104000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.200000 422.336000 439.004000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.100000 422.336000 442.904000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.000000 422.336000 446.804000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.900000 422.336000 450.704000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.800000 422.336000 454.604000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.700000 422.336000 458.504000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.600000 422.336000 462.404000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.500000 422.336000 466.304000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.400000 422.336000 470.204000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.300000 422.336000 474.104000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.200000 422.336000 478.004000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.100000 422.336000 481.904000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.000000 422.336000 485.804000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.900000 422.336000 489.704000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.800000 422.336000 493.604000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.700000 422.336000 497.504000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.600000 422.336000 501.404000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.500000 422.336000 505.304000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.400000 422.336000 509.204000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.300000 422.336000 513.104000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.200000 422.336000 517.004000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.100000 422.336000 520.904000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.000000 422.336000 524.804000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.900000 422.336000 528.704000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 528.800000 422.336000 532.604000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 532.700000 422.336000 536.504000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 334.400000 408.436000 343.580000 396.436000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 343.604000 408.436000 351.332000 396.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 351.308000 408.436000 357.044000 396.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 357.008000 408.436000 363.776000 396.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 363.812000 408.436000 369.968000 396.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 370.016000 408.436000 377.168000 396.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 377.216000 408.436000 384.944000 396.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 384.920000 408.436000 389.732000 396.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 389.720000 408.436000 397.448000 396.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 397.424000 408.436000 404.516000 396.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 404.528000 408.436000 415.904000 396.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 415.928000 408.436000 423.656000 396.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 423.632000 408.436000 435.008000 396.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 435.032000 408.436000 441.188000 396.436000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 441.100000 408.436000 444.904000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.096000 408.436000 448.900000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.092000 408.436000 452.896000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.088000 408.436000 456.892000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.084000 408.436000 460.888000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.080000 408.436000 464.884000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.076000 408.436000 468.880000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.072000 408.436000 472.876000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.068000 408.436000 476.872000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.064000 408.436000 480.868000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.060000 408.436000 484.864000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.056000 408.436000 488.860000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.052000 408.436000 492.856000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.048000 408.436000 496.852000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.044000 408.436000 500.848000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.040000 408.436000 504.844000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.036000 408.436000 508.840000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.032000 408.436000 512.836000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.028000 408.436000 516.832000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.024000 408.436000 520.828000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 408.436000 527.932000 396.436000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 408.436000 535.528000 396.436000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 334.400000 394.536000 344.012000 382.536000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 344.000000 394.536000 351.152000 382.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 351.200000 394.536000 359.720000 382.536000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 359.696000 394.536000 366.920000 382.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 366.896000 394.536000 374.576000 382.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 374.600000 394.536000 378.428000 382.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 378.404000 394.536000 382.232000 382.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 382.208000 394.536000 388.364000 382.536000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 388.300000 394.536000 392.104000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.200000 394.536000 396.004000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.100000 394.536000 399.904000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.000000 394.536000 403.804000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 403.900000 394.536000 407.704000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.800000 394.536000 411.604000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.700000 394.536000 415.504000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.600000 394.536000 419.404000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.500000 394.536000 423.304000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.400000 394.536000 427.204000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.300000 394.536000 431.104000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.200000 394.536000 435.004000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.100000 394.536000 438.904000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.000000 394.536000 442.804000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.900000 394.536000 446.704000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.800000 394.536000 450.604000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.700000 394.536000 454.504000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.600000 394.536000 458.404000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.500000 394.536000 462.304000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.400000 394.536000 466.204000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.300000 394.536000 470.104000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.200000 394.536000 474.004000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.100000 394.536000 477.904000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.000000 394.536000 481.804000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.900000 394.536000 485.704000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.800000 394.536000 489.604000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.700000 394.536000 493.504000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.600000 394.536000 497.404000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.500000 394.536000 501.304000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.400000 394.536000 505.204000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.300000 394.536000 509.104000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.200000 394.536000 513.004000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.100000 394.536000 516.904000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.000000 394.536000 520.804000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 394.536000 527.932000 382.536000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 394.536000 535.528000 382.536000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 334.400000 380.636000 344.012000 368.636000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 344.000000 380.636000 351.152000 368.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 351.200000 380.636000 358.928000 368.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 358.904000 380.636000 362.732000 368.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 362.708000 380.636000 366.536000 368.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 366.512000 380.636000 373.664000 368.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 373.712000 380.636000 379.868000 368.636000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 379.800000 380.636000 383.604000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.700000 380.636000 387.504000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.600000 380.636000 391.404000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.500000 380.636000 395.304000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.400000 380.636000 399.204000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.300000 380.636000 403.104000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 403.200000 380.636000 407.004000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.100000 380.636000 410.904000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.000000 380.636000 414.804000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.900000 380.636000 418.704000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.800000 380.636000 422.604000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.700000 380.636000 426.504000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.600000 380.636000 430.404000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.500000 380.636000 434.304000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.400000 380.636000 438.204000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.300000 380.636000 442.104000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.200000 380.636000 446.004000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.100000 380.636000 449.904000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.000000 380.636000 453.804000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.900000 380.636000 457.704000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.800000 380.636000 461.604000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.700000 380.636000 465.504000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.600000 380.636000 469.404000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.500000 380.636000 473.304000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.400000 380.636000 477.204000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.300000 380.636000 481.104000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.200000 380.636000 485.004000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.100000 380.636000 488.904000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.000000 380.636000 492.804000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.900000 380.636000 496.704000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.800000 380.636000 500.604000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.700000 380.636000 504.504000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.600000 380.636000 508.404000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.500000 380.636000 512.304000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.400000 380.636000 516.204000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.300000 380.636000 520.104000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 380.636000 527.932000 368.636000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 380.636000 535.528000 368.636000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 334.400000 366.736000 339.140000 354.736000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 339.104000 366.736000 344.840000 354.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 344.804000 366.736000 348.632000 354.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 348.608000 366.736000 354.764000 354.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 354.812000 366.736000 361.904000 354.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 361.916000 366.736000 368.072000 354.736000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 368.000000 366.736000 371.804000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.804000 366.736000 375.608000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.608000 366.736000 379.412000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.412000 366.736000 383.216000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.216000 366.736000 387.020000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.020000 366.736000 390.824000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.824000 366.736000 394.628000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.628000 366.736000 398.432000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.432000 366.736000 402.236000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.236000 366.736000 406.040000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.040000 366.736000 409.844000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.844000 366.736000 413.648000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.648000 366.736000 417.452000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.452000 366.736000 421.256000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.256000 366.736000 425.060000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.060000 366.736000 428.864000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.864000 366.736000 432.668000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.668000 366.736000 436.472000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.472000 366.736000 440.276000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.276000 366.736000 444.080000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.080000 366.736000 447.884000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.884000 366.736000 451.688000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.688000 366.736000 455.492000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.492000 366.736000 459.296000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.296000 366.736000 463.100000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.100000 366.736000 466.904000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.904000 366.736000 470.708000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.708000 366.736000 474.512000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.512000 366.736000 478.316000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.316000 366.736000 482.120000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.120000 366.736000 485.924000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.924000 366.736000 489.728000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.728000 366.736000 493.532000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.532000 366.736000 497.336000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.336000 366.736000 501.140000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.140000 366.736000 504.944000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.944000 366.736000 508.748000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.748000 366.736000 512.552000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.552000 366.736000 516.356000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.356000 366.736000 520.160000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 366.736000 527.932000 354.736000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 366.736000 535.528000 354.736000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 334.400000 352.836000 343.424000 340.836000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 343.400000 352.836000 351.128000 340.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 351.104000 352.836000 358.328000 340.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 358.304000 352.836000 365.984000 340.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 366.008000 352.836000 373.232000 340.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 373.208000 352.836000 380.888000 340.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 380.912000 352.836000 388.004000 340.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.016000 352.836000 395.744000 340.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 395.720000 352.836000 403.400000 340.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 403.424000 352.836000 409.160000 340.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 409.124000 352.836000 416.348000 340.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 416.324000 352.836000 424.052000 340.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 424.028000 352.836000 430.184000 340.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 430.200000 352.836000 434.004000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.100000 352.836000 437.904000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.000000 352.836000 441.804000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.900000 352.836000 445.704000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.800000 352.836000 449.604000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.700000 352.836000 453.504000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.600000 352.836000 457.404000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.500000 352.836000 461.304000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.400000 352.836000 465.204000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.300000 352.836000 469.104000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.200000 352.836000 473.004000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.100000 352.836000 476.904000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.000000 352.836000 480.804000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.900000 352.836000 484.704000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.800000 352.836000 488.604000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.700000 352.836000 492.504000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.600000 352.836000 496.404000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.500000 352.836000 500.304000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.400000 352.836000 504.204000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.300000 352.836000 508.104000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.200000 352.836000 512.004000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.100000 352.836000 515.904000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.000000 352.836000 519.804000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 352.836000 527.932000 340.836000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 352.836000 535.528000 340.836000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 338.936000 328.616000 326.936000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 328.604000 338.936000 334.340000 326.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 334.304000 338.936000 341.528000 326.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 341.504000 338.936000 347.816000 326.936000 1.000000 0.000000 0.000000 1.000000 z
+drawChar 347.804000 338.936000 354.896000 326.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 354.908000 338.936000 362.636000 326.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 362.612000 338.936000 366.416000 326.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 366.416000 338.936000 377.792000 326.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 377.816000 338.936000 384.968000 326.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 385.016000 338.936000 390.752000 326.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 390.716000 338.936000 398.396000 326.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 398.420000 338.936000 405.572000 326.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 405.620000 338.936000 411.356000 326.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 411.320000 338.936000 415.148000 326.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 415.124000 338.936000 419.936000 326.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 419.924000 338.936000 427.076000 326.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 427.124000 338.936000 433.280000 326.936000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 433.300000 338.936000 437.104000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.200000 338.936000 441.004000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.100000 338.936000 444.904000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.000000 338.936000 448.804000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 448.900000 338.936000 452.704000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 452.800000 338.936000 456.604000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 456.700000 338.936000 460.504000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.600000 338.936000 464.404000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.500000 338.936000 468.304000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.400000 338.936000 472.204000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.300000 338.936000 476.104000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.200000 338.936000 480.004000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.100000 338.936000 483.904000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.000000 338.936000 487.804000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 487.900000 338.936000 491.704000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 491.800000 338.936000 495.604000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.700000 338.936000 499.504000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.600000 338.936000 503.404000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.500000 338.936000 507.304000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.400000 338.936000 511.204000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.300000 338.936000 515.104000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.200000 338.936000 519.004000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.100000 338.936000 522.904000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.000000 338.936000 526.804000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 338.936000 535.632000 326.936000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 320.300000 324.956000 330.548000 312.956000 1.000000 0.000000 0.000000 1.000000 G
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 310.936000 329.876000 298.936000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 329.900000 310.936000 337.052000 298.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.100000 310.936000 342.836000 298.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 342.800000 310.936000 350.480000 298.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 350.504000 310.936000 357.656000 298.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 357.704000 310.936000 365.384000 298.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 365.408000 310.936000 372.500000 298.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 372.512000 310.936000 376.316000 298.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 376.316000 310.936000 383.996000 298.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 384.020000 310.936000 387.848000 298.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 387.824000 310.936000 393.980000 298.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 394.028000 310.936000 401.708000 298.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 401.732000 310.936000 408.956000 298.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 408.932000 310.936000 415.088000 298.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 415.136000 310.936000 422.288000 298.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 422.336000 310.936000 426.164000 298.936000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 425.800000 310.936000 429.604000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.700000 310.936000 433.504000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.600000 310.936000 437.404000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.500000 310.936000 441.304000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.400000 310.936000 445.204000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.300000 310.936000 449.104000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.200000 310.936000 453.004000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.100000 310.936000 456.904000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.000000 310.936000 460.804000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.900000 310.936000 464.704000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.800000 310.936000 468.604000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.700000 310.936000 472.504000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.600000 310.936000 476.404000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.500000 310.936000 480.304000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.400000 310.936000 484.204000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.300000 310.936000 488.104000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.200000 310.936000 492.004000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.100000 310.936000 495.904000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.000000 310.936000 499.804000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.900000 310.936000 503.704000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.800000 310.936000 507.604000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.700000 310.936000 511.504000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.600000 310.936000 515.404000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.500000 310.936000 519.304000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.400000 310.936000 523.204000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.300000 310.936000 527.104000 298.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 310.936000 535.632000 298.936000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 297.036000 329.876000 285.036000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 329.900000 297.036000 337.052000 285.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.100000 297.036000 342.836000 285.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 342.800000 297.036000 350.480000 285.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 350.504000 297.036000 357.596000 285.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 357.608000 297.036000 365.336000 285.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 365.312000 297.036000 369.116000 285.036000 1.000000 0.000000 0.000000 1.000000
+drawChar 369.116000 297.036000 373.556000 285.036000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 373.520000 297.036000 381.248000 285.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 381.224000 297.036000 386.960000 285.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 386.924000 297.036000 394.652000 285.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 394.628000 297.036000 398.456000 285.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 398.432000 297.036000 403.244000 285.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 403.232000 297.036000 410.960000 285.036000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 410.936000 297.036000 416.672000 285.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 416.636000 297.036000 423.728000 285.036000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 423.900000 297.036000 427.704000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.800000 297.036000 431.604000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.700000 297.036000 435.504000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.600000 297.036000 439.404000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.500000 297.036000 443.304000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.400000 297.036000 447.204000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.300000 297.036000 451.104000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.200000 297.036000 455.004000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.100000 297.036000 458.904000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.000000 297.036000 462.804000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.900000 297.036000 466.704000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.800000 297.036000 470.604000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.700000 297.036000 474.504000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.600000 297.036000 478.404000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.500000 297.036000 482.304000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.400000 297.036000 486.204000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.300000 297.036000 490.104000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.200000 297.036000 494.004000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.100000 297.036000 497.904000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.000000 297.036000 501.804000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.900000 297.036000 505.704000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.800000 297.036000 509.604000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.700000 297.036000 513.504000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.600000 297.036000 517.404000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.500000 297.036000 521.304000 285.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 297.036000 527.932000 285.036000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 297.036000 535.528000 285.036000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 283.136000 329.876000 271.136000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 329.900000 283.136000 333.728000 271.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 333.704000 283.136000 341.432000 271.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 341.408000 283.136000 345.212000 271.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 345.212000 283.136000 352.364000 271.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 352.412000 283.136000 360.140000 271.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 360.116000 283.136000 367.796000 271.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 367.820000 283.136000 371.624000 271.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 371.624000 283.136000 379.616000 271.136000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 378.728000 283.136000 385.952000 271.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 385.928000 283.136000 393.656000 271.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 393.632000 283.136000 397.460000 271.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.436000 283.136000 404.156000 271.136000 1.000000 0.000000 0.000000 1.000000 c
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 404.100000 283.136000 407.904000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.000000 283.136000 411.804000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.900000 283.136000 415.704000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.800000 283.136000 419.604000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.700000 283.136000 423.504000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.600000 283.136000 427.404000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.500000 283.136000 431.304000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.400000 283.136000 435.204000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.300000 283.136000 439.104000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.200000 283.136000 443.004000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.100000 283.136000 446.904000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.000000 283.136000 450.804000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.900000 283.136000 454.704000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.800000 283.136000 458.604000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.700000 283.136000 462.504000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.600000 283.136000 466.404000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.500000 283.136000 470.304000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.400000 283.136000 474.204000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.300000 283.136000 478.104000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.200000 283.136000 482.004000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.100000 283.136000 485.904000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.000000 283.136000 489.804000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.900000 283.136000 493.704000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.800000 283.136000 497.604000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.700000 283.136000 501.504000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.600000 283.136000 505.404000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.500000 283.136000 509.304000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.400000 283.136000 513.204000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.300000 283.136000 517.104000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.200000 283.136000 521.004000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.100000 283.136000 524.904000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 525.000000 283.136000 528.804000 271.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 283.136000 535.632000 271.136000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 269.236000 329.876000 257.236000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 329.900000 269.236000 337.124000 257.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 337.100000 269.236000 340.928000 257.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 340.904000 269.236000 348.584000 257.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 348.608000 269.236000 355.700000 257.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 355.712000 269.236000 363.440000 257.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 363.416000 269.236000 367.220000 257.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 367.220000 269.236000 376.796000 257.236000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 376.820000 269.236000 383.972000 257.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 384.020000 269.236000 388.832000 257.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 388.820000 269.236000 395.912000 257.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 395.924000 269.236000 399.728000 257.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 399.728000 269.236000 407.792000 257.236000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 407.228000 269.236000 414.380000 257.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 414.428000 269.236000 420.164000 257.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 420.128000 269.236000 427.388000 257.236000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 427.400000 269.236000 431.204000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.300000 269.236000 435.104000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.200000 269.236000 439.004000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.100000 269.236000 442.904000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.000000 269.236000 446.804000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.900000 269.236000 450.704000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.800000 269.236000 454.604000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.700000 269.236000 458.504000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.600000 269.236000 462.404000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.500000 269.236000 466.304000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.400000 269.236000 470.204000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.300000 269.236000 474.104000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.200000 269.236000 478.004000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.100000 269.236000 481.904000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.000000 269.236000 485.804000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.900000 269.236000 489.704000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.800000 269.236000 493.604000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.700000 269.236000 497.504000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.600000 269.236000 501.404000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.500000 269.236000 505.304000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.400000 269.236000 509.204000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.300000 269.236000 513.104000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.200000 269.236000 517.004000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.100000 269.236000 520.904000 257.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 269.236000 527.932000 257.236000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 269.236000 535.528000 257.236000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 255.336000 329.876000 243.336000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 329.900000 255.336000 337.124000 243.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 337.100000 255.336000 340.928000 243.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 340.904000 255.336000 348.584000 243.336000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 348.608000 255.336000 356.600000 243.336000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 356.612000 255.336000 362.768000 243.336000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 362.816000 255.336000 370.544000 243.336000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 370.400000 255.336000 374.204000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.204000 255.336000 378.008000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.008000 255.336000 381.812000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.812000 255.336000 385.616000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.616000 255.336000 389.420000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.420000 255.336000 393.224000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.224000 255.336000 397.028000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.028000 255.336000 400.832000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.832000 255.336000 404.636000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.636000 255.336000 408.440000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.440000 255.336000 412.244000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.244000 255.336000 416.048000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.048000 255.336000 419.852000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.852000 255.336000 423.656000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.656000 255.336000 427.460000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.460000 255.336000 431.264000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.264000 255.336000 435.068000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.068000 255.336000 438.872000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.872000 255.336000 442.676000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.676000 255.336000 446.480000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.480000 255.336000 450.284000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.284000 255.336000 454.088000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.088000 255.336000 457.892000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.892000 255.336000 461.696000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.696000 255.336000 465.500000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.500000 255.336000 469.304000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.304000 255.336000 473.108000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.108000 255.336000 476.912000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.912000 255.336000 480.716000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.716000 255.336000 484.520000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.520000 255.336000 488.324000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.324000 255.336000 492.128000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.128000 255.336000 495.932000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.932000 255.336000 499.736000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.736000 255.336000 503.540000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.540000 255.336000 507.344000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.344000 255.336000 511.148000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.148000 255.336000 514.952000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.952000 255.336000 518.756000 243.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 255.336000 527.932000 243.336000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 255.336000 535.528000 243.336000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 241.436000 329.876000 229.436000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 329.900000 241.436000 335.636000 229.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 335.600000 241.436000 342.692000 229.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 342.704000 241.436000 350.432000 229.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 350.408000 241.436000 357.560000 229.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 357.608000 241.436000 365.288000 229.436000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 365.312000 241.436000 369.140000 229.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 369.116000 241.436000 376.844000 229.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 376.820000 241.436000 383.912000 229.436000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 383.900000 241.436000 387.704000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.800000 241.436000 391.604000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.700000 241.436000 395.504000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 395.600000 241.436000 399.404000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 399.500000 241.436000 403.304000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 403.400000 241.436000 407.204000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.300000 241.436000 411.104000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.200000 241.436000 415.004000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.100000 241.436000 418.904000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.000000 241.436000 422.804000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.900000 241.436000 426.704000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.800000 241.436000 430.604000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.700000 241.436000 434.504000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.600000 241.436000 438.404000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.500000 241.436000 442.304000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.400000 241.436000 446.204000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.300000 241.436000 450.104000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.200000 241.436000 454.004000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.100000 241.436000 457.904000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.000000 241.436000 461.804000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.900000 241.436000 465.704000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.800000 241.436000 469.604000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.700000 241.436000 473.504000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.600000 241.436000 477.404000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.500000 241.436000 481.304000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.400000 241.436000 485.204000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.300000 241.436000 489.104000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.200000 241.436000 493.004000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.100000 241.436000 496.904000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.000000 241.436000 500.804000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.900000 241.436000 504.704000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.800000 241.436000 508.604000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.700000 241.436000 512.504000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.600000 241.436000 516.404000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.500000 241.436000 520.304000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.400000 241.436000 524.204000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.300000 241.436000 528.104000 229.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 241.436000 535.632000 229.436000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 227.536000 329.876000 215.536000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 329.900000 227.536000 337.628000 215.536000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 337.604000 227.536000 344.696000 215.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 344.708000 227.536000 350.864000 215.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 350.912000 227.536000 355.724000 215.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 355.712000 227.536000 359.516000 215.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 359.516000 227.536000 365.252000 215.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 365.216000 227.536000 372.440000 215.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 372.416000 227.536000 379.640000 215.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 379.616000 227.536000 390.992000 215.536000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 391.000000 227.536000 394.804000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.804000 227.536000 398.608000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.608000 227.536000 402.412000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.412000 227.536000 406.216000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.216000 227.536000 410.020000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.020000 227.536000 413.824000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.824000 227.536000 417.628000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.628000 227.536000 421.432000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.432000 227.536000 425.236000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.236000 227.536000 429.040000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.040000 227.536000 432.844000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.844000 227.536000 436.648000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.648000 227.536000 440.452000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.452000 227.536000 444.256000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.256000 227.536000 448.060000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 448.060000 227.536000 451.864000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.864000 227.536000 455.668000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.668000 227.536000 459.472000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.472000 227.536000 463.276000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.276000 227.536000 467.080000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.080000 227.536000 470.884000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.884000 227.536000 474.688000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.688000 227.536000 478.492000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.492000 227.536000 482.296000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.296000 227.536000 486.100000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.100000 227.536000 489.904000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.904000 227.536000 493.708000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.708000 227.536000 497.512000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.512000 227.536000 501.316000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.316000 227.536000 505.120000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.120000 227.536000 508.924000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.924000 227.536000 512.728000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.728000 227.536000 516.532000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.532000 227.536000 520.336000 215.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 227.536000 527.932000 215.536000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 227.536000 535.528000 215.536000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 320.300000 213.556000 331.628000 201.556000 1.000000 0.000000 0.000000 1.000000 H
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 199.536000 330.764000 187.536000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 330.800000 199.536000 337.952000 187.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 338.000000 199.536000 349.376000 187.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 349.400000 199.536000 360.776000 187.536000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 360.800000 199.536000 367.892000 187.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 367.904000 199.536000 373.640000 187.536000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 373.400000 199.536000 377.204000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.300000 199.536000 381.104000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.200000 199.536000 385.004000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.100000 199.536000 388.904000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.000000 199.536000 392.804000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.900000 199.536000 396.704000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.800000 199.536000 400.604000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.700000 199.536000 404.504000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.600000 199.536000 408.404000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.500000 199.536000 412.304000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.400000 199.536000 416.204000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.300000 199.536000 420.104000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.200000 199.536000 424.004000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.100000 199.536000 427.904000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.000000 199.536000 431.804000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.900000 199.536000 435.704000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.800000 199.536000 439.604000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.700000 199.536000 443.504000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.600000 199.536000 447.404000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.500000 199.536000 451.304000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.400000 199.536000 455.204000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.300000 199.536000 459.104000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.200000 199.536000 463.004000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.100000 199.536000 466.904000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.000000 199.536000 470.804000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.900000 199.536000 474.704000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.800000 199.536000 478.604000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.700000 199.536000 482.504000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.600000 199.536000 486.404000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.500000 199.536000 490.304000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.400000 199.536000 494.204000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.300000 199.536000 498.104000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.200000 199.536000 502.004000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 502.100000 199.536000 505.904000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.000000 199.536000 509.804000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.900000 199.536000 513.704000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.800000 199.536000 517.604000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.700000 199.536000 521.504000 187.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 199.536000 527.932000 187.536000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 199.536000 535.528000 187.536000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 185.636000 330.764000 173.636000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 330.800000 185.636000 337.952000 173.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 338.000000 185.636000 343.736000 173.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 343.700000 185.636000 351.380000 173.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 351.404000 185.636000 361.664000 173.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 361.700000 185.636000 368.924000 173.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 368.900000 185.636000 376.124000 173.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 376.100000 185.636000 383.780000 173.636000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 383.804000 185.636000 387.608000 173.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 387.608000 185.636000 395.600000 173.636000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 395.612000 185.636000 402.836000 173.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 402.812000 185.636000 410.036000 173.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 410.012000 185.636000 415.748000 173.636000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 415.600000 185.636000 419.404000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.500000 185.636000 423.304000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.400000 185.636000 427.204000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.300000 185.636000 431.104000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.200000 185.636000 435.004000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.100000 185.636000 438.904000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.000000 185.636000 442.804000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.900000 185.636000 446.704000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.800000 185.636000 450.604000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.700000 185.636000 454.504000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.600000 185.636000 458.404000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.500000 185.636000 462.304000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.400000 185.636000 466.204000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.300000 185.636000 470.104000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.200000 185.636000 474.004000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.100000 185.636000 477.904000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.000000 185.636000 481.804000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.900000 185.636000 485.704000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.800000 185.636000 489.604000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.700000 185.636000 493.504000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.600000 185.636000 497.404000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.500000 185.636000 501.304000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.400000 185.636000 505.204000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.300000 185.636000 509.104000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.200000 185.636000 513.004000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.100000 185.636000 516.904000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.000000 185.636000 520.804000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.900000 185.636000 524.704000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.800000 185.636000 528.604000 173.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 185.636000 535.632000 173.636000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 171.736000 330.764000 159.736000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 330.800000 171.736000 337.892000 159.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.904000 171.736000 345.584000 159.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 345.608000 171.736000 353.288000 159.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 353.312000 171.736000 360.404000 159.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 360.416000 171.736000 364.460000 159.736000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 364.520000 171.736000 371.240000 159.736000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 371.216000 171.736000 375.044000 159.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 375.020000 171.736000 378.848000 159.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 378.824000 171.736000 386.504000 159.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 386.528000 171.736000 394.208000 159.736000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 394.232000 171.736000 401.324000 159.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 401.336000 171.736000 407.072000 159.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 407.036000 171.736000 413.192000 159.736000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 413.000000 171.736000 416.804000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.804000 171.736000 420.608000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.608000 171.736000 424.412000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.412000 171.736000 428.216000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.216000 171.736000 432.020000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.020000 171.736000 435.824000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.824000 171.736000 439.628000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.628000 171.736000 443.432000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.432000 171.736000 447.236000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.236000 171.736000 451.040000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.040000 171.736000 454.844000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.844000 171.736000 458.648000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.648000 171.736000 462.452000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.452000 171.736000 466.256000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.256000 171.736000 470.060000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.060000 171.736000 473.864000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.864000 171.736000 477.668000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.668000 171.736000 481.472000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.472000 171.736000 485.276000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.276000 171.736000 489.080000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.080000 171.736000 492.884000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.884000 171.736000 496.688000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.688000 171.736000 500.492000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.492000 171.736000 504.296000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.296000 171.736000 508.100000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.100000 171.736000 511.904000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.904000 171.736000 515.708000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.708000 171.736000 519.512000 159.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 171.736000 527.932000 159.736000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 171.736000 535.528000 159.736000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 157.836000 330.764000 145.836000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 330.800000 157.836000 337.892000 145.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.904000 157.836000 349.280000 145.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 349.304000 157.836000 353.132000 145.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 353.108000 157.836000 360.836000 145.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 360.812000 157.836000 368.492000 145.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 368.516000 157.836000 378.776000 145.836000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 378.812000 157.836000 385.964000 145.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 386.012000 157.836000 392.780000 145.836000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 391.208000 157.836000 395.012000 145.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 395.012000 157.836000 398.816000 145.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 398.816000 157.836000 407.564000 145.836000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 407.612000 157.836000 413.348000 145.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 413.312000 157.836000 421.040000 145.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 421.016000 157.836000 428.108000 145.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 428.120000 157.836000 434.276000 145.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 434.324000 157.836000 439.136000 145.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 439.124000 157.836000 442.928000 145.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 442.800000 157.836000 446.604000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.700000 157.836000 450.504000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.600000 157.836000 454.404000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.500000 157.836000 458.304000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.400000 157.836000 462.204000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.300000 157.836000 466.104000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.200000 157.836000 470.004000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.100000 157.836000 473.904000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.000000 157.836000 477.804000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.900000 157.836000 481.704000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.800000 157.836000 485.604000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.700000 157.836000 489.504000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.600000 157.836000 493.404000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.500000 157.836000 497.304000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.400000 157.836000 501.204000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.300000 157.836000 505.104000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.200000 157.836000 509.004000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.100000 157.836000 512.904000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.000000 157.836000 516.804000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.900000 157.836000 520.704000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.800000 157.836000 524.604000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.700000 157.836000 528.504000 145.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 157.836000 535.632000 145.836000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 320.300000 143.856000 325.904000 131.856000 1.000000 0.000000 0.000000 1.000000 I
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 129.836000 325.040000 117.836000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 325.004000 129.836000 330.740000 117.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 330.704000 129.836000 334.532000 117.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 334.508000 129.836000 340.664000 117.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 340.712000 129.836000 347.804000 117.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 347.816000 129.836000 353.972000 117.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 353.900000 129.836000 357.704000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 357.800000 129.836000 361.604000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 361.700000 129.836000 365.504000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.600000 129.836000 369.404000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 369.500000 129.836000 373.304000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 373.400000 129.836000 377.204000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.300000 129.836000 381.104000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.200000 129.836000 385.004000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.100000 129.836000 388.904000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.000000 129.836000 392.804000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.900000 129.836000 396.704000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.800000 129.836000 400.604000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.700000 129.836000 404.504000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.600000 129.836000 408.404000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.500000 129.836000 412.304000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.400000 129.836000 416.204000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.300000 129.836000 420.104000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.200000 129.836000 424.004000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.100000 129.836000 427.904000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.000000 129.836000 431.804000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.900000 129.836000 435.704000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.800000 129.836000 439.604000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.700000 129.836000 443.504000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.600000 129.836000 447.404000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.500000 129.836000 451.304000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.400000 129.836000 455.204000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.300000 129.836000 459.104000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.200000 129.836000 463.004000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.100000 129.836000 466.904000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.000000 129.836000 470.804000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.900000 129.836000 474.704000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.800000 129.836000 478.604000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.700000 129.836000 482.504000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.600000 129.836000 486.404000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.500000 129.836000 490.304000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.400000 129.836000 494.204000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.300000 129.836000 498.104000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.200000 129.836000 502.004000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 502.100000 129.836000 505.904000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.000000 129.836000 509.804000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.900000 129.836000 513.704000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.800000 129.836000 517.604000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.700000 129.836000 521.504000 117.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 129.836000 527.932000 117.836000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 129.836000 535.528000 117.836000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 306.000000 136.200000 0 306.100000 136.200000 0 306.100000 644.700000 0 306.000000 644.700000 0 306.000000 136.200000 0
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 14002.200000 0 477.900000 14002.200000 0 477.900000 14312.000000 0 134.300000 14312.000000 0 134.300000 14002.200000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -1321030.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 11013.200000 0 168.100000 11013.200000 0 168.100000 11018.200000 0 76.900000 11018.200000 0 76.900000 11013.200000 0
+eoFillPath subpath 1 163.100000 11018.100000 0 168.100000 11018.100000 0 168.100000 11148.700000 0 163.100000 11148.700000 0 163.100000 11018.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 11018.200000 0 163.100000 11018.200000 0 163.100000 11153.600000 0 72.000000 11153.600000 0 72.000000 11018.200000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 11149.280000 87.320000 11139.280000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 11149.280000 93.420000 11139.280000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 11149.280000 97.510000 11139.280000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 11149.280000 101.420000 11139.280000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 11149.280000 104.170000 11139.280000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 11149.280000 110.530000 11139.280000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 11149.280000 113.270000 11139.280000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 11149.280000 116.470000 11139.280000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 11149.280000 123.480000 11139.280000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 11149.280000 129.610000 11139.280000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 11149.280000 135.090000 11139.280000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 11149.280000 140.890000 11139.280000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 11149.280000 144.820000 11139.280000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 11149.280000 150.920000 11139.280000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 11149.280000 153.670000 11139.280000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 11149.280000 156.470000 11139.280000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 11022.400000 0 168.200000 11022.400000 0 168.200000 11137.600000 0 72.000000 11137.600000 0 72.000000 11022.400000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11090.552000 79.253000 11081.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 11090.552000 86.669000 11081.552000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 11090.552000 90.215000 11081.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 11090.552000 93.077000 11081.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 11090.552000 97.406000 11081.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 11090.552000 100.853000 11081.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 11090.552000 107.324000 11081.552000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 11090.552000 112.337000 11081.552000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 11090.552000 115.271000 11081.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 11090.552000 118.655000 11081.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 11090.552000 126.512000 11081.552000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 11090.552000 130.805000 11081.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 11090.552000 135.881000 11081.552000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 11090.552000 139.355000 11081.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 11090.552000 147.284000 11081.552000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 11090.552000 150.074000 11081.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 11090.552000 155.897000 11081.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 11090.552000 158.750000 11081.552000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 11090.552000 161.853000 11081.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11080.052000 82.124000 11071.052000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 11080.052000 87.137000 11071.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 11080.052000 90.071000 11071.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 11080.052000 93.356000 11071.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 11080.052000 100.403000 11071.052000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 11080.052000 104.921000 11071.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 11080.052000 109.205000 11071.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 11080.052000 117.737000 11071.052000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 11080.052000 123.119000 11071.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 11080.052000 128.996000 11071.052000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 11080.052000 132.605000 11071.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 11080.052000 138.392000 11071.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 11080.052000 141.749000 11071.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 11080.052000 149.507000 11071.052000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 11080.052000 153.800000 11071.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 11080.052000 158.876000 11071.052000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 11080.052000 161.853000 11071.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11069.552000 81.764000 11060.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 11069.552000 87.596000 11060.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 11069.552000 93.356000 11060.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 11069.552000 102.050000 11060.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 11069.552000 113.822000 11060.552000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 11069.552000 122.651000 11060.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 11069.552000 134.117000 11060.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 11069.552000 138.401000 11060.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 11069.552000 147.149000 11060.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 11069.552000 158.921000 11060.552000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 11069.552000 161.853000 11060.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11059.052000 79.271000 11050.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 11059.052000 84.338000 11050.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 11059.052000 89.621000 11050.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 11059.052000 94.643000 11050.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 11059.052000 100.502000 11050.052000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 11059.052000 106.262000 11050.052000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 11059.052000 111.518000 11050.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 11059.052000 116.216000 11050.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 11059.052000 119.249000 11050.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 11059.052000 122.363000 11050.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 11059.052000 128.186000 11050.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 11059.052000 131.345000 11050.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 11059.052000 137.060000 11050.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 11059.052000 140.147000 11050.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 11059.052000 145.007000 11050.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 11059.052000 148.598000 11050.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 11059.052000 151.460000 11050.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 11059.052000 155.789000 11050.052000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 11059.052000 158.933000 11050.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11048.552000 80.702000 11039.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 11048.552000 83.573000 11039.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 11048.552000 89.396000 11039.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 11048.552000 95.156000 11039.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 11048.552000 100.547000 11039.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 11048.552000 109.052000 11039.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 11048.552000 111.959000 11039.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 11048.552000 117.251000 11039.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 11048.552000 121.904000 11039.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 11048.552000 126.503000 11039.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 11048.552000 129.338000 11039.552000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 11048.552000 134.936000 11039.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 11048.552000 143.441000 11039.552000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 11048.552000 148.796000 11039.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 11048.552000 154.574000 11039.552000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 11048.552000 158.876000 11039.552000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 11048.552000 161.853000 11039.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11038.052000 79.271000 11029.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 11038.052000 85.094000 11029.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 11038.052000 88.703000 11029.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 11038.052000 94.112000 11029.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 11038.052000 97.244000 11029.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 11038.052000 103.058000 11029.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 11038.052000 108.890000 11029.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 11038.052000 111.950000 11029.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 11038.052000 115.271000 11029.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 11038.052000 120.338000 11029.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 11038.052000 125.621000 11029.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 11038.052000 131.363000 11029.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 11038.052000 134.558000 11029.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 11038.052000 140.048000 11029.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 11038.052000 145.430000 11029.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 11038.052000 150.551000 11029.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 11038.052000 155.960000 11029.052000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 11038.052000 158.933000 11029.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11027.552000 80.009000 11018.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 11027.552000 85.364000 11018.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 11027.552000 88.271000 11018.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 11027.552000 91.169000 11018.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 11027.552000 97.955000 11018.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 11027.552000 107.765000 11018.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 11027.552000 110.672000 11018.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 11027.552000 115.964000 11018.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 11027.552000 120.617000 11018.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 11027.552000 125.216000 11018.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 11027.552000 128.051000 11018.552000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 11027.552000 134.954000 11018.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 11027.552000 146.285000 11018.552000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 11027.552000 151.667000 11018.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 11027.552000 155.906000 11018.552000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 11027.552000 159.033000 11018.552000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 11018.100000 0 72.100000 11018.100000 0 72.100000 11153.600000 0 72.000000 11153.600000 0 72.000000 11018.100000 0
+eoFillPath subpath 1 163.100000 11018.100000 0 163.200000 11018.100000 0 163.200000 11153.600000 0 163.100000 11153.600000 0 163.100000 11018.100000 0
+eoFillPath subpath 1 72.000000 11153.500000 0 163.200000 11153.500000 0 163.200000 11153.600000 0 72.000000 11153.600000 0 72.000000 11153.500000 0
+eoFillPath subpath 1 72.000000 11018.100000 0 163.200000 11018.100000 0 163.200000 11018.200000 0 72.000000 11018.200000 0 72.000000 11018.100000 0
+saveState
+eoClipPath subpath 1 96.900000 11093.400000 0 138.300000 11093.400000 0 138.300000 11137.600000 0 96.900000 11137.600000 0 96.900000 11093.400000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -1030150.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 10738.600000 0 165.500000 10738.600000 0 165.500000 10743.600000 0 76.900000 10743.600000 0 76.900000 10738.600000 0
+eoFillPath subpath 1 160.500000 10743.500000 0 165.500000 10743.500000 0 165.500000 10899.800000 0 160.500000 10899.800000 0 160.500000 10743.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 10743.600000 0 121.400000 10743.600000 0 121.400000 10904.700000 0 72.000000 10904.700000 0 72.000000 10743.600000 0
+saveState
+eoClipPath subpath 1 72.000000 10743.500000 0 160.500000 10743.500000 0 160.500000 10904.600000 0 72.000000 10904.600000 0 72.000000 10743.500000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -993450.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 10900.380000 89.280000 10890.380000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 10900.380000 95.630000 10890.380000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 10900.380000 99.520000 10890.380000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 10900.380000 102.270000 10890.380000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 10900.380000 108.450000 10890.380000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 10900.380000 112.610000 10890.380000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 10900.380000 118.510000 10890.380000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 10900.380000 121.670000 10890.380000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 10900.380000 124.470000 10890.380000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 10900.380000 130.830000 10890.380000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 10900.380000 133.970000 10890.380000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 10900.380000 137.920000 10890.380000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 10900.380000 144.230000 10890.380000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 10900.380000 150.350000 10890.380000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 10900.380000 153.570000 10890.380000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 10888.680000 95.000000 10878.680000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 10888.680000 97.770000 10878.680000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 10888.680000 103.000000 10878.680000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 10888.680000 109.330000 10878.680000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 10888.680000 117.470000 10878.680000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 10888.680000 123.620000 10878.680000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 10888.680000 128.800000 10878.680000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 10888.680000 135.130000 10878.680000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 10888.680000 141.250000 10878.680000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 10888.680000 145.410000 10878.680000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10873.852000 82.961000 10864.852000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 10873.852000 87.614000 10864.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 10873.852000 93.356000 10864.852000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 10873.852000 98.612000 10864.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 10873.852000 103.733000 10864.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 10873.852000 106.568000 10864.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 10873.852000 111.959000 10864.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 10873.852000 114.866000 10864.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 10873.852000 117.665000 10864.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 10873.852000 122.768000 10864.852000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 10873.852000 125.747000 10864.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 10873.852000 131.651000 10864.852000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 10873.852000 136.907000 10864.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 10873.852000 142.307000 10864.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 10873.852000 148.049000 10864.852000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 10873.852000 150.956000 10864.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 10873.852000 156.302000 10864.852000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 10873.852000 159.253000 10864.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10863.352000 84.095000 10854.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 10863.352000 89.900000 10854.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 10863.352000 95.318000 10854.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 10863.352000 100.349000 10854.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 10863.352000 110.789000 10854.352000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 10863.352000 111.464000 10854.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 10863.352000 114.362000 10854.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 10863.352000 119.348000 10854.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 10863.352000 126.962000 10854.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 10863.352000 132.047000 10854.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 10863.352000 139.958000 10854.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 10863.352000 142.865000 10854.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 10863.352000 147.410000 10854.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 10863.352000 153.287000 10854.352000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 10863.352000 156.333000 10854.352000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10852.852000 84.095000 10843.852000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 10852.852000 89.468000 10843.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 10852.852000 94.121000 10843.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 10852.852000 99.899000 10843.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 10852.852000 105.218000 10843.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 10852.852000 109.502000 10843.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 10852.852000 115.649000 10843.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 10852.852000 122.327000 10843.852000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 10852.852000 127.718000 10843.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 10852.852000 132.002000 10843.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 10852.852000 138.149000 10843.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 10852.852000 145.205000 10843.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 10852.852000 150.992000 10843.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 10852.852000 156.311000 10843.852000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 10852.852000 159.253000 10843.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10842.352000 82.394000 10833.352000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 10842.352000 86.705000 10833.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 10842.352000 91.322000 10833.352000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 10842.352000 94.913000 10833.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 10842.352000 98.054000 10833.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 10842.352000 102.014000 10833.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 10842.352000 104.876000 10833.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 10842.352000 113.435000 10833.352000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 10842.352000 118.718000 10833.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 10842.352000 121.949000 10833.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 10842.352000 125.063000 10833.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 10842.352000 130.886000 10833.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 10842.352000 134.045000 10833.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 10842.352000 138.005000 10833.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 10842.352000 143.792000 10833.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 10842.352000 149.111000 10833.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 10842.352000 151.964000 10833.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 10842.352000 156.293000 10833.352000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 10842.352000 159.153000 10833.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10831.852000 79.271000 10822.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 10831.852000 82.169000 10822.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 10831.852000 85.526000 10822.852000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 10831.852000 90.818000 10822.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 10831.852000 94.454000 10822.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 10831.852000 99.008000 10822.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 10831.852000 104.318000 10822.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 10831.852000 110.096000 10822.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 10831.852000 115.856000 10822.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 10831.852000 119.546000 10822.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 10831.852000 124.001000 10822.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 10831.852000 129.509000 10822.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 10831.852000 133.145000 10822.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 10831.852000 139.751000 10822.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 10831.852000 145.205000 10822.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 10831.852000 148.841000 10822.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 10831.852000 152.657000 10822.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 10831.852000 156.293000 10822.852000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 10831.852000 159.253000 10822.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10821.352000 84.095000 10812.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 10821.352000 88.406000 10812.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 10821.352000 93.824000 10812.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 10821.352000 99.602000 10812.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 10821.352000 105.362000 10812.352000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 10821.352000 108.422000 10812.352000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 10821.352000 116.747000 10812.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 10821.352000 129.275000 10812.352000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 10821.352000 135.089000 10812.352000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 10821.352000 138.698000 10812.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 10821.352000 141.560000 10812.352000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 10821.352000 146.906000 10812.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 10821.352000 151.190000 10812.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 10821.352000 156.266000 10812.352000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 10821.352000 159.253000 10812.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10810.852000 82.196000 10801.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 10810.852000 87.560000 10801.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 10810.852000 92.213000 10801.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 10810.852000 96.551000 10801.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 10810.852000 101.708000 10801.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 10810.852000 107.216000 10801.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 10810.852000 111.653000 10801.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 10810.852000 118.961000 10801.852000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 10810.852000 124.316000 10801.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 10810.852000 128.654000 10801.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 10810.852000 133.172000 10801.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 10810.852000 138.995000 10801.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 10810.852000 143.612000 10801.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 10810.852000 148.913000 10801.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 10810.852000 153.197000 10801.852000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 10810.852000 156.333000 10801.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10800.352000 80.009000 10791.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 10800.352000 85.319000 10791.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 10800.352000 91.061000 10791.352000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 10800.352000 100.052000 10791.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 10800.352000 113.993000 10791.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 10800.352000 116.873000 10791.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 10800.352000 120.410000 10791.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 10800.352000 126.296000 10791.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 10800.352000 135.350000 10791.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 10800.352000 145.106000 10791.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 10800.352000 150.893000 10791.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 10800.352000 156.212000 10791.352000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 10800.352000 159.253000 10791.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10789.852000 82.196000 10780.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 10789.852000 87.560000 10780.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 10789.852000 93.392000 10780.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 10789.852000 99.152000 10780.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 10789.852000 101.960000 10780.852000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 10789.852000 107.306000 10780.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 10789.852000 111.905000 10780.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 10789.852000 115.640000 10780.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 10789.852000 122.444000 10780.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 10789.852000 127.898000 10780.852000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 10789.852000 135.575000 10780.852000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 10789.852000 141.380000 10780.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 10789.852000 145.241000 10780.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 10789.852000 150.803000 10780.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 10789.852000 156.302000 10780.852000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 10789.852000 159.253000 10780.852000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10779.352000 80.009000 10770.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 10779.352000 85.796000 10770.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 10779.352000 91.115000 10770.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 10779.352000 95.399000 10770.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 10779.352000 100.718000 10770.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 10779.352000 107.054000 10770.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 10779.352000 118.097000 10770.352000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 10779.352000 123.524000 10770.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 10779.352000 129.401000 10770.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 10779.352000 131.768000 10770.352000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 10779.352000 135.413000 10770.352000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 10779.352000 141.659000 10770.352000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 10779.352000 150.965000 10770.352000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 10779.352000 156.320000 10770.352000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 10779.352000 159.253000 10770.352000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10768.852000 81.017000 10759.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 10768.852000 84.608000 10759.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 10768.852000 89.963000 10759.852000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 10768.852000 92.870000 10759.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 10768.852000 98.693000 10759.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 10768.852000 103.310000 10759.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 10768.852000 107.243000 10759.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 10768.852000 116.081000 10759.852000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 10768.852000 121.886000 10759.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 10768.852000 127.205000 10759.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 10768.852000 132.983000 10759.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 10768.852000 136.943000 10759.852000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 10768.852000 143.846000 10759.852000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 10768.852000 148.184000 10759.852000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 10768.852000 153.260000 10759.852000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 10768.852000 156.433000 10759.852000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 10758.352000 79.271000 10749.352000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 10758.352000 85.094000 10749.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 10758.352000 90.854000 10749.352000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 10758.352000 93.653000 10749.352000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 10743.500000 0 72.100000 10743.500000 0 72.100000 10904.700000 0 72.000000 10904.700000 0 72.000000 10743.500000 0
+eoFillPath subpath 1 160.500000 10743.500000 0 160.600000 10743.500000 0 160.600000 10904.700000 0 160.500000 10904.700000 0 160.500000 10743.500000 0
+eoFillPath subpath 1 72.000000 10904.600000 0 160.600000 10904.600000 0 160.600000 10904.700000 0 72.000000 10904.700000 0 72.000000 10904.600000 0
+eoFillPath subpath 1 72.000000 10743.500000 0 160.600000 10743.500000 0 160.600000 10743.600000 0 72.000000 10743.600000 0 72.000000 10743.500000 0
+saveState
+eoClipPath subpath 1 108.000000 10256.100000 0 178.900000 10256.100000 0 178.900000 10312.800000 0 108.000000 10312.800000 0 108.000000 10256.100000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -946420.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 6197.800000 0 165.500000 6197.800000 0 165.500000 6202.800000 0 76.900000 6202.800000 0 76.900000 6197.800000 0
+eoFillPath subpath 1 160.500000 6202.700000 0 165.500000 6202.700000 0 165.500000 6311.500000 0 160.500000 6311.500000 0 160.500000 6202.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 6202.800000 0 160.500000 6202.800000 0 160.500000 6316.400000 0 72.000000 6316.400000 0 72.000000 6202.800000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6312.052000 83.771000 6303.052000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 6312.052000 89.594000 6303.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 6312.052000 92.465000 6303.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 6312.052000 97.568000 6303.052000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 6312.052000 100.943000 6303.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 6312.052000 106.955000 6303.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 6312.052000 110.447000 6303.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 6312.052000 114.425000 6303.052000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 6312.052000 119.717000 6303.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 6312.052000 127.493000 6303.052000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 6312.052000 130.949000 6303.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 6312.052000 136.574000 6303.052000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 6312.052000 141.920000 6303.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 6312.052000 147.365000 6303.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 6312.052000 151.703000 6303.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 6312.052000 156.320000 6303.052000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 6312.052000 159.153000 6303.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6301.552000 81.764000 6292.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 6301.552000 85.130000 6292.552000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 6301.552000 88.712000 6292.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 6301.552000 94.022000 6292.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 6301.552000 98.306000 6292.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 6301.552000 102.455000 6292.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 6301.552000 106.676000 6292.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 6301.552000 110.312000 6292.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 6301.552000 114.920000 6292.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 6301.552000 119.060000 6292.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 6301.552000 125.450000 6292.552000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 6301.552000 130.832000 6292.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 6301.552000 139.445000 6292.552000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 6301.552000 145.169000 6292.552000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 6301.552000 148.076000 6292.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 6301.552000 153.323000 6292.552000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 6301.552000 156.433000 6292.552000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6291.052000 80.009000 6282.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 6291.052000 82.871000 6282.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 6291.052000 88.316000 6282.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 6291.052000 94.094000 6282.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 6291.052000 96.947000 6282.052000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 6291.052000 104.948000 6282.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 6291.052000 113.705000 6282.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 6291.052000 119.492000 6282.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 6291.052000 124.811000 6282.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 6291.052000 132.848000 6282.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 6291.052000 141.605000 6282.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 6291.052000 144.467000 6282.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 6291.052000 148.103000 6282.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 6291.052000 150.965000 6282.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 6291.052000 156.311000 6282.052000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 6291.052000 159.253000 6282.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6280.552000 80.999000 6271.552000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 6280.552000 90.539000 6271.552000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 6280.552000 95.318000 6271.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 6280.552000 99.602000 6271.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 6280.552000 102.473000 6271.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 6280.552000 108.260000 6271.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 6280.552000 110.762000 6271.552000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 6280.552000 115.316000 6271.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 6280.552000 122.156000 6271.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 6280.552000 132.299000 6271.552000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 6280.552000 136.970000 6271.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 6280.552000 139.877000 6271.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 6280.552000 142.775000 6271.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 6280.552000 148.022000 6271.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 6280.552000 152.720000 6271.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 6280.552000 156.311000 6271.552000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 6280.552000 159.253000 6271.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6270.052000 83.006000 6261.052000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 6270.052000 88.793000 6261.052000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 6270.052000 91.664000 6261.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 6270.052000 94.562000 6261.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 6270.052000 100.349000 6261.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 6270.052000 103.157000 6261.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 6270.052000 108.980000 6261.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 6270.052000 114.740000 6261.052000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 6270.052000 119.375000 6261.052000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 6270.052000 128.033000 6261.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 6270.052000 141.479000 6261.052000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 6270.052000 146.807000 6261.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 6270.052000 152.684000 6261.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 6270.052000 156.293000 6261.052000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 6270.052000 159.253000 6261.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6259.552000 79.730000 6250.552000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 6259.552000 84.005000 6250.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 6259.552000 89.423000 6250.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 6259.552000 98.036000 6250.552000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 6259.552000 121.157000 6250.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 6259.552000 145.115000 6250.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 6259.552000 151.001000 6250.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 6259.552000 156.320000 6250.552000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 6259.552000 159.253000 6250.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6249.052000 83.285000 6240.052000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 6249.052000 89.099000 6240.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 6249.052000 93.401000 6240.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 6249.052000 98.477000 6240.052000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 6249.052000 103.121000 6240.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 6249.052000 105.974000 6240.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 6249.052000 111.320000 6240.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 6249.052000 115.604000 6240.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 6249.052000 123.857000 6240.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 6249.052000 136.007000 6240.052000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 6249.052000 141.794000 6240.052000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 6249.052000 144.665000 6240.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 6249.052000 147.464000 6240.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 6249.052000 153.251000 6240.052000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 6249.052000 156.433000 6240.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6238.552000 79.271000 6229.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 6238.552000 85.094000 6229.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 6238.552000 90.854000 6229.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 6238.552000 96.146000 6229.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 6238.552000 102.302000 6229.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 6238.552000 107.711000 6229.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 6238.552000 113.048000 6229.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 6238.552000 119.204000 6229.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 6238.552000 124.991000 6229.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 6238.552000 130.310000 6229.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 6238.552000 135.647000 6229.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 6238.552000 144.755000 6229.552000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 6238.552000 153.323000 6229.552000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 6238.552000 156.333000 6229.552000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6228.052000 82.160000 6219.052000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 6228.052000 85.067000 6219.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 6228.052000 89.297000 6219.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 6228.052000 94.616000 6219.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 6228.052000 98.747000 6219.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 6228.052000 106.055000 6219.052000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 6228.052000 109.700000 6219.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 6228.052000 115.055000 6219.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 6228.052000 118.601000 6219.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 6228.052000 124.010000 6219.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 6228.052000 128.042000 6219.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 6228.052000 135.998000 6219.052000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 6228.052000 141.785000 6219.052000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 6228.052000 144.656000 6219.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 6228.052000 147.554000 6219.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 6228.052000 153.341000 6219.052000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 6228.052000 156.433000 6219.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 6217.552000 79.271000 6208.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 6217.552000 85.094000 6208.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 6217.552000 90.854000 6208.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 6217.552000 93.743000 6208.552000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 6202.700000 0 72.100000 6202.700000 0 72.100000 6316.400000 0 72.000000 6316.400000 0 72.000000 6202.700000 0
+eoFillPath subpath 1 160.500000 6202.700000 0 160.600000 6202.700000 0 160.600000 6316.400000 0 160.500000 6316.400000 0 160.500000 6202.700000 0
+eoFillPath subpath 1 72.000000 6316.300000 0 160.600000 6316.300000 0 160.600000 6316.400000 0 72.000000 6316.400000 0 72.000000 6316.300000 0
+eoFillPath subpath 1 72.000000 6202.700000 0 160.600000 6202.700000 0 160.600000 6202.800000 0 72.000000 6202.800000 0 72.000000 6202.700000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 12392.200000 0 169.600000 12392.200000 0 169.600000 12397.200000 0 76.900000 12397.200000 0 76.900000 12392.200000 0
+eoFillPath subpath 1 164.600000 12397.100000 0 169.600000 12397.100000 0 169.600000 12512.700000 0 164.600000 12512.700000 0 164.600000 12397.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 12397.200000 0 121.400000 12397.200000 0 121.400000 12517.600000 0 72.000000 12517.600000 0 72.000000 12397.200000 0
+saveState
+eoClipPath subpath 1 72.000000 12397.100000 0 164.600000 12397.100000 0 164.600000 12517.500000 0 72.000000 12517.500000 0 72.000000 12397.100000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -1154690.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 12467.100000 0 93.700000 12467.100000 0 93.700000 12486.300000 0 72.000000 12486.300000 0 72.000000 12467.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 12467.100000 0 169.600000 12467.100000 0 169.600000 12486.300000 0 93.700000 12486.300000 0 93.700000 12467.100000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 12450.400000 0 93.700000 12450.400000 0 93.700000 12467.100000 0 72.000000 12467.100000 0 72.000000 12450.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 12450.400000 0 169.600000 12450.400000 0 169.600000 12467.100000 0 93.700000 12467.100000 0 93.700000 12450.400000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 12431.200000 0 93.700000 12431.200000 0 93.700000 12450.400000 0 72.000000 12450.400000 0 72.000000 12431.200000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 12431.200000 0 169.600000 12431.200000 0 169.600000 12450.400000 0 93.700000 12450.400000 0 93.700000 12431.200000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 12412.000000 0 93.700000 12412.000000 0 93.700000 12431.200000 0 72.000000 12431.200000 0 72.000000 12412.000000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 12412.000000 0 169.600000 12412.000000 0 169.600000 12431.200000 0 93.700000 12431.200000 0 93.700000 12412.000000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12513.252000 82.898000 12504.252000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 12513.252000 87.200000 12504.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 12513.252000 90.809000 12504.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 12513.252000 93.671000 12504.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 12513.252000 98.315000 12504.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 12513.252000 101.906000 12504.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 12513.252000 106.514000 12504.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 12513.252000 109.754000 12504.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 12513.252000 112.868000 12504.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 12513.252000 118.691000 12504.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 12513.252000 121.850000 12504.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 12513.252000 125.702000 12504.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 12513.252000 131.588000 12504.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 12513.252000 136.907000 12504.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 12513.252000 140.039000 12504.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 12513.252000 146.078000 12504.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 12513.252000 151.442000 12504.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 12513.252000 154.349000 12504.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 12513.252000 157.148000 12504.252000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 12513.252000 160.433000 12504.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12502.752000 84.095000 12493.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 12502.752000 89.468000 12493.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 12502.752000 94.580000 12493.752000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 12502.752000 97.631000 12493.752000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 12482.352000 104.443000 12473.352000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 12482.352000 109.060000 12473.352000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 12482.352000 113.398000 12473.352000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 12482.352000 119.194000 12473.352000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 12482.352000 124.612000 12473.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 12482.352000 127.465000 12473.352000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 12465.652000 101.176000 12456.652000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 12465.652000 104.074000 12456.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 12465.652000 109.420000 12456.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 12465.652000 114.442000 12456.652000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 12465.652000 120.202000 12456.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 12465.652000 123.811000 12456.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 12465.652000 129.121000 12456.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 12465.652000 134.899000 12456.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 12465.652000 139.516000 12456.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 12465.652000 143.107000 12456.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 12465.652000 148.417000 12456.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 12465.652000 151.270000 12456.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 12465.652000 157.093000 12456.652000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 12448.952000 103.048000 12439.952000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 12448.952000 108.421000 12439.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 12448.952000 113.443000 12439.952000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 12448.952000 118.852000 12439.952000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 12448.952000 124.702000 12439.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 12448.952000 130.021000 12439.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 12448.952000 135.079000 12439.952000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 12429.752000 104.407000 12420.752000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 12429.752000 109.816000 12420.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 12429.752000 115.594000 12420.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 12429.752000 121.354000 12420.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 12429.752000 125.692000 12420.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 12429.752000 128.563000 12420.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 12429.752000 133.954000 12420.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 12429.752000 139.786000 12420.752000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 12397.100000 0 72.100000 12397.100000 0 72.100000 12517.600000 0 72.000000 12517.600000 0 72.000000 12397.100000 0
+eoFillPath subpath 1 164.600000 12397.100000 0 164.700000 12397.100000 0 164.700000 12517.600000 0 164.600000 12517.600000 0 164.600000 12397.100000 0
+eoFillPath subpath 1 72.000000 12517.500000 0 164.700000 12517.500000 0 164.700000 12517.600000 0 72.000000 12517.600000 0 72.000000 12517.500000 0
+eoFillPath subpath 1 72.000000 12397.100000 0 164.700000 12397.100000 0 164.700000 12397.200000 0 72.000000 12397.200000 0 72.000000 12397.100000 0
+eoFillPath subpath 1 91.300000 12412.000000 0 93.700000 12412.000000 0 93.700000 12486.300000 0 91.300000 12486.300000 0 91.300000 12412.000000 0
+eoFillPath subpath 1 72.000000 12431.200000 0 169.600000 12431.200000 0 169.600000 12433.600000 0 72.000000 12433.600000 0 72.000000 12431.200000 0
+eoFillPath subpath 1 72.000000 12483.900000 0 169.600000 12483.900000 0 169.600000 12486.300000 0 72.000000 12486.300000 0 72.000000 12483.900000 0
+eoFillPath subpath 1 72.000000 12412.000000 0 169.600000 12412.000000 0 169.600000 12414.400000 0 72.000000 12414.400000 0 72.000000 12412.000000 0
+saveState
+eoClipPath subpath 1 108.000000 4546.000000 0 150.800000 4546.000000 0 150.800000 4590.300000 0 108.000000 4590.300000 0 108.000000 4546.000000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 -375410.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 3696.100000 0 499.600000 3696.100000 0 499.600000 3701.200000 0 186.800000 3701.200000 0 186.800000 3696.100000 0
+eoFillPath subpath 1 494.500000 3701.100000 0 499.600000 3701.100000 0 499.600000 3889.500000 0 494.500000 3889.500000 0 494.500000 3701.100000 0
+saveState
+eoClipPath subpath 1 181.800000 3701.100000 0 494.500000 3701.100000 0 494.500000 3894.400000 0 181.800000 3894.400000 0 181.800000 3701.100000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 3894.500000 0 494.500000 3894.500000 0 494.500000 3894.500000 0 181.700000 3894.500000 0
+eoFillPath subpath 1 181.700000 3894.500000 0 494.500000 3894.500000 0 494.500000 3893.700000 0 181.700000 3893.700000 0 181.700000 3894.500000 0
+eoFillPath subpath 1 181.700000 3893.700000 0 494.500000 3893.700000 0 494.500000 3893.000000 0 181.700000 3893.000000 0 181.700000 3893.700000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 3893.000000 0 494.500000 3893.000000 0 494.500000 3892.200000 0 181.700000 3892.200000 0 181.700000 3893.000000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 3892.200000 0 494.500000 3892.200000 0 494.500000 3891.400000 0 181.700000 3891.400000 0 181.700000 3892.200000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 3891.400000 0 494.500000 3891.400000 0 494.500000 3890.700000 0 181.700000 3890.700000 0 181.700000 3891.400000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 3890.700000 0 494.500000 3890.700000 0 494.500000 3889.900000 0 181.700000 3889.900000 0 181.700000 3890.700000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 3889.900000 0 494.500000 3889.900000 0 494.500000 3889.200000 0 181.700000 3889.200000 0 181.700000 3889.900000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 3889.200000 0 494.500000 3889.200000 0 494.500000 3888.400000 0 181.700000 3888.400000 0 181.700000 3889.200000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 3888.400000 0 494.500000 3888.400000 0 494.500000 3887.700000 0 181.700000 3887.700000 0 181.700000 3888.400000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 3887.700000 0 494.500000 3887.700000 0 494.500000 3886.900000 0 181.700000 3886.900000 0 181.700000 3887.700000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 3886.900000 0 494.500000 3886.900000 0 494.500000 3886.100000 0 181.700000 3886.100000 0 181.700000 3886.900000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 3886.100000 0 494.500000 3886.100000 0 494.500000 3885.400000 0 181.700000 3885.400000 0 181.700000 3886.100000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 3885.400000 0 494.500000 3885.400000 0 494.500000 3884.600000 0 181.700000 3884.600000 0 181.700000 3885.400000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 3884.600000 0 494.500000 3884.600000 0 494.500000 3883.900000 0 181.700000 3883.900000 0 181.700000 3884.600000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 3883.900000 0 494.500000 3883.900000 0 494.500000 3883.100000 0 181.700000 3883.100000 0 181.700000 3883.900000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 3883.100000 0 494.500000 3883.100000 0 494.500000 3882.300000 0 181.700000 3882.300000 0 181.700000 3883.100000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 3882.300000 0 494.500000 3882.300000 0 494.500000 3881.600000 0 181.700000 3881.600000 0 181.700000 3882.300000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 3881.600000 0 494.500000 3881.600000 0 494.500000 3880.800000 0 181.700000 3880.800000 0 181.700000 3881.600000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 3880.800000 0 494.500000 3880.800000 0 494.500000 3880.100000 0 181.700000 3880.100000 0 181.700000 3880.800000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 3880.100000 0 494.500000 3880.100000 0 494.500000 3879.300000 0 181.700000 3879.300000 0 181.700000 3880.100000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 3879.300000 0 494.500000 3879.300000 0 494.500000 3878.500000 0 181.700000 3878.500000 0 181.700000 3879.300000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 3878.500000 0 494.500000 3878.500000 0 494.500000 3877.800000 0 181.700000 3877.800000 0 181.700000 3878.500000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 3877.800000 0 494.500000 3877.800000 0 494.500000 3877.000000 0 181.700000 3877.000000 0 181.700000 3877.800000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 3877.000000 0 494.500000 3877.000000 0 494.500000 3876.300000 0 181.700000 3876.300000 0 181.700000 3877.000000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 3876.300000 0 494.500000 3876.300000 0 494.500000 3875.500000 0 181.700000 3875.500000 0 181.700000 3876.300000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 3875.500000 0 494.500000 3875.500000 0 494.500000 3874.800000 0 181.700000 3874.800000 0 181.700000 3875.500000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 3874.800000 0 494.500000 3874.800000 0 494.500000 3874.000000 0 181.700000 3874.000000 0 181.700000 3874.800000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 3874.000000 0 494.500000 3874.000000 0 494.500000 3873.200000 0 181.700000 3873.200000 0 181.700000 3874.000000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 3873.200000 0 494.500000 3873.200000 0 494.500000 3872.500000 0 181.700000 3872.500000 0 181.700000 3873.200000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 3872.500000 0 494.500000 3872.500000 0 494.500000 3871.700000 0 181.700000 3871.700000 0 181.700000 3872.500000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 3871.700000 0 494.500000 3871.700000 0 494.500000 3871.000000 0 181.700000 3871.000000 0 181.700000 3871.700000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 3871.000000 0 494.500000 3871.000000 0 494.500000 3870.200000 0 181.700000 3870.200000 0 181.700000 3871.000000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 3870.200000 0 494.500000 3870.200000 0 494.500000 3869.400000 0 181.700000 3869.400000 0 181.700000 3870.200000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 3869.400000 0 494.500000 3869.400000 0 494.500000 3868.700000 0 181.700000 3868.700000 0 181.700000 3869.400000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 3868.700000 0 494.500000 3868.700000 0 494.500000 3867.900000 0 181.700000 3867.900000 0 181.700000 3868.700000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 3867.900000 0 494.500000 3867.900000 0 494.500000 3867.200000 0 181.700000 3867.200000 0 181.700000 3867.900000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 3867.200000 0 494.500000 3867.200000 0 494.500000 3866.400000 0 181.700000 3866.400000 0 181.700000 3867.200000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 3866.400000 0 494.500000 3866.400000 0 494.500000 3865.600000 0 181.700000 3865.600000 0 181.700000 3866.400000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 3865.600000 0 494.500000 3865.600000 0 494.500000 3864.900000 0 181.700000 3864.900000 0 181.700000 3865.600000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 3864.900000 0 494.500000 3864.900000 0 494.500000 3864.100000 0 181.700000 3864.100000 0 181.700000 3864.900000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 3864.100000 0 494.500000 3864.100000 0 494.500000 3863.400000 0 181.700000 3863.400000 0 181.700000 3864.100000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 3863.400000 0 494.500000 3863.400000 0 494.500000 3862.600000 0 181.700000 3862.600000 0 181.700000 3863.400000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 3862.600000 0 494.500000 3862.600000 0 494.500000 3861.900000 0 181.700000 3861.900000 0 181.700000 3862.600000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 3861.900000 0 494.500000 3861.900000 0 494.500000 3861.100000 0 181.700000 3861.100000 0 181.700000 3861.900000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 3861.100000 0 494.500000 3861.100000 0 494.500000 3860.300000 0 181.700000 3860.300000 0 181.700000 3861.100000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 3860.300000 0 494.500000 3860.300000 0 494.500000 3859.600000 0 181.700000 3859.600000 0 181.700000 3860.300000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 3859.600000 0 494.500000 3859.600000 0 494.500000 3858.800000 0 181.700000 3858.800000 0 181.700000 3859.600000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 3858.800000 0 494.500000 3858.800000 0 494.500000 3858.100000 0 181.700000 3858.100000 0 181.700000 3858.800000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 3858.100000 0 494.500000 3858.100000 0 494.500000 3857.300000 0 181.700000 3857.300000 0 181.700000 3858.100000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 3857.300000 0 494.500000 3857.300000 0 494.500000 3856.500000 0 181.700000 3856.500000 0 181.700000 3857.300000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 3856.500000 0 494.500000 3856.500000 0 494.500000 3855.800000 0 181.700000 3855.800000 0 181.700000 3856.500000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 3855.800000 0 494.500000 3855.800000 0 494.500000 3855.000000 0 181.700000 3855.000000 0 181.700000 3855.800000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 3855.000000 0 494.500000 3855.000000 0 494.500000 3854.300000 0 181.700000 3854.300000 0 181.700000 3855.000000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 3854.300000 0 494.500000 3854.300000 0 494.500000 3853.500000 0 181.700000 3853.500000 0 181.700000 3854.300000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 3853.500000 0 494.500000 3853.500000 0 494.500000 3852.700000 0 181.700000 3852.700000 0 181.700000 3853.500000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 3852.700000 0 494.500000 3852.700000 0 494.500000 3852.000000 0 181.700000 3852.000000 0 181.700000 3852.700000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 3852.000000 0 494.500000 3852.000000 0 494.500000 3851.200000 0 181.700000 3851.200000 0 181.700000 3852.000000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 3851.200000 0 494.500000 3851.200000 0 494.500000 3850.500000 0 181.700000 3850.500000 0 181.700000 3851.200000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 3850.500000 0 494.500000 3850.500000 0 494.500000 3849.700000 0 181.700000 3849.700000 0 181.700000 3850.500000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 3849.700000 0 494.500000 3849.700000 0 494.500000 3849.000000 0 181.700000 3849.000000 0 181.700000 3849.700000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 3849.000000 0 494.500000 3849.000000 0 494.500000 3848.200000 0 181.700000 3848.200000 0 181.700000 3849.000000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 3848.200000 0 494.500000 3848.200000 0 494.500000 3847.400000 0 181.700000 3847.400000 0 181.700000 3848.200000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 3847.400000 0 494.500000 3847.400000 0 494.500000 3846.700000 0 181.700000 3846.700000 0 181.700000 3847.400000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 3846.700000 0 494.500000 3846.700000 0 494.500000 3845.900000 0 181.700000 3845.900000 0 181.700000 3846.700000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 3845.900000 0 494.500000 3845.900000 0 494.500000 3845.200000 0 181.700000 3845.200000 0 181.700000 3845.900000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 3845.200000 0 494.500000 3845.200000 0 494.500000 3844.400000 0 181.700000 3844.400000 0 181.700000 3845.200000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 3844.400000 0 494.500000 3844.400000 0 494.500000 3843.600000 0 181.700000 3843.600000 0 181.700000 3844.400000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 3843.600000 0 494.500000 3843.600000 0 494.500000 3842.900000 0 181.700000 3842.900000 0 181.700000 3843.600000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 3842.900000 0 494.500000 3842.900000 0 494.500000 3842.100000 0 181.700000 3842.100000 0 181.700000 3842.900000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 3842.100000 0 494.500000 3842.100000 0 494.500000 3841.400000 0 181.700000 3841.400000 0 181.700000 3842.100000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 3841.400000 0 494.500000 3841.400000 0 494.500000 3840.600000 0 181.700000 3840.600000 0 181.700000 3841.400000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 3840.600000 0 494.500000 3840.600000 0 494.500000 3839.800000 0 181.700000 3839.800000 0 181.700000 3840.600000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 3839.800000 0 494.500000 3839.800000 0 494.500000 3839.100000 0 181.700000 3839.100000 0 181.700000 3839.800000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 3839.100000 0 494.500000 3839.100000 0 494.500000 3838.300000 0 181.700000 3838.300000 0 181.700000 3839.100000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 3838.300000 0 494.500000 3838.300000 0 494.500000 3837.600000 0 181.700000 3837.600000 0 181.700000 3838.300000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 3837.600000 0 494.500000 3837.600000 0 494.500000 3836.800000 0 181.700000 3836.800000 0 181.700000 3837.600000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 3836.800000 0 494.500000 3836.800000 0 494.500000 3836.100000 0 181.700000 3836.100000 0 181.700000 3836.800000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 3836.100000 0 494.500000 3836.100000 0 494.500000 3835.300000 0 181.700000 3835.300000 0 181.700000 3836.100000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 3835.300000 0 494.500000 3835.300000 0 494.500000 3834.500000 0 181.700000 3834.500000 0 181.700000 3835.300000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 3834.500000 0 494.500000 3834.500000 0 494.500000 3833.800000 0 181.700000 3833.800000 0 181.700000 3834.500000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 3833.800000 0 494.500000 3833.800000 0 494.500000 3833.000000 0 181.700000 3833.000000 0 181.700000 3833.800000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 3833.000000 0 494.500000 3833.000000 0 494.500000 3832.300000 0 181.700000 3832.300000 0 181.700000 3833.000000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 3832.300000 0 494.500000 3832.300000 0 494.500000 3831.500000 0 181.700000 3831.500000 0 181.700000 3832.300000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 3831.500000 0 494.500000 3831.500000 0 494.500000 3830.700000 0 181.700000 3830.700000 0 181.700000 3831.500000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 3830.700000 0 494.500000 3830.700000 0 494.500000 3830.000000 0 181.700000 3830.000000 0 181.700000 3830.700000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 3830.000000 0 494.500000 3830.000000 0 494.500000 3829.200000 0 181.700000 3829.200000 0 181.700000 3830.000000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 3829.200000 0 494.500000 3829.200000 0 494.500000 3828.500000 0 181.700000 3828.500000 0 181.700000 3829.200000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 3828.500000 0 494.500000 3828.500000 0 494.500000 3827.700000 0 181.700000 3827.700000 0 181.700000 3828.500000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 3827.700000 0 494.500000 3827.700000 0 494.500000 3826.900000 0 181.700000 3826.900000 0 181.700000 3827.700000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 3826.900000 0 494.500000 3826.900000 0 494.500000 3826.200000 0 181.700000 3826.200000 0 181.700000 3826.900000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 3826.200000 0 494.500000 3826.200000 0 494.500000 3825.400000 0 181.700000 3825.400000 0 181.700000 3826.200000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 3825.400000 0 494.500000 3825.400000 0 494.500000 3824.700000 0 181.700000 3824.700000 0 181.700000 3825.400000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 3824.700000 0 494.500000 3824.700000 0 494.500000 3823.900000 0 181.700000 3823.900000 0 181.700000 3824.700000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 3823.900000 0 494.500000 3823.900000 0 494.500000 3823.200000 0 181.700000 3823.200000 0 181.700000 3823.900000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 3823.200000 0 494.500000 3823.200000 0 494.500000 3822.400000 0 181.700000 3822.400000 0 181.700000 3823.200000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 3822.400000 0 494.500000 3822.400000 0 494.500000 3821.600000 0 181.700000 3821.600000 0 181.700000 3822.400000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 3821.600000 0 494.500000 3821.600000 0 494.500000 3820.900000 0 181.700000 3820.900000 0 181.700000 3821.600000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 3820.900000 0 494.500000 3820.900000 0 494.500000 3820.100000 0 181.700000 3820.100000 0 181.700000 3820.900000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 3820.100000 0 494.500000 3820.100000 0 494.500000 3819.400000 0 181.700000 3819.400000 0 181.700000 3820.100000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 3819.400000 0 494.500000 3819.400000 0 494.500000 3818.600000 0 181.700000 3818.600000 0 181.700000 3819.400000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 3818.600000 0 494.500000 3818.600000 0 494.500000 3817.800000 0 181.700000 3817.800000 0 181.700000 3818.600000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 3817.800000 0 494.500000 3817.800000 0 494.500000 3817.100000 0 181.700000 3817.100000 0 181.700000 3817.800000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 3817.100000 0 494.500000 3817.100000 0 494.500000 3816.300000 0 181.700000 3816.300000 0 181.700000 3817.100000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 3816.300000 0 494.500000 3816.300000 0 494.500000 3815.600000 0 181.700000 3815.600000 0 181.700000 3816.300000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 3815.600000 0 494.500000 3815.600000 0 494.500000 3814.800000 0 181.700000 3814.800000 0 181.700000 3815.600000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 3814.800000 0 494.500000 3814.800000 0 494.500000 3814.000000 0 181.700000 3814.000000 0 181.700000 3814.800000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 3814.000000 0 494.500000 3814.000000 0 494.500000 3813.300000 0 181.700000 3813.300000 0 181.700000 3814.000000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 3813.300000 0 494.500000 3813.300000 0 494.500000 3812.500000 0 181.700000 3812.500000 0 181.700000 3813.300000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 3812.500000 0 494.500000 3812.500000 0 494.500000 3811.800000 0 181.700000 3811.800000 0 181.700000 3812.500000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 3811.800000 0 494.500000 3811.800000 0 494.500000 3811.000000 0 181.700000 3811.000000 0 181.700000 3811.800000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 3811.000000 0 494.500000 3811.000000 0 494.500000 3810.300000 0 181.700000 3810.300000 0 181.700000 3811.000000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 3810.300000 0 494.500000 3810.300000 0 494.500000 3809.500000 0 181.700000 3809.500000 0 181.700000 3810.300000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 3809.500000 0 494.500000 3809.500000 0 494.500000 3808.700000 0 181.700000 3808.700000 0 181.700000 3809.500000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 3808.700000 0 494.500000 3808.700000 0 494.500000 3808.000000 0 181.700000 3808.000000 0 181.700000 3808.700000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 3808.000000 0 494.500000 3808.000000 0 494.500000 3807.200000 0 181.700000 3807.200000 0 181.700000 3808.000000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 3807.200000 0 494.500000 3807.200000 0 494.500000 3806.500000 0 181.700000 3806.500000 0 181.700000 3807.200000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 3806.500000 0 494.500000 3806.500000 0 494.500000 3805.700000 0 181.700000 3805.700000 0 181.700000 3806.500000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 3805.700000 0 494.500000 3805.700000 0 494.500000 3804.900000 0 181.700000 3804.900000 0 181.700000 3805.700000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 3804.900000 0 494.500000 3804.900000 0 494.500000 3804.200000 0 181.700000 3804.200000 0 181.700000 3804.900000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 3804.200000 0 494.500000 3804.200000 0 494.500000 3803.400000 0 181.700000 3803.400000 0 181.700000 3804.200000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 3803.400000 0 494.500000 3803.400000 0 494.500000 3802.700000 0 181.700000 3802.700000 0 181.700000 3803.400000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 3802.700000 0 494.500000 3802.700000 0 494.500000 3801.900000 0 181.700000 3801.900000 0 181.700000 3802.700000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 3801.900000 0 494.500000 3801.900000 0 494.500000 3801.100000 0 181.700000 3801.100000 0 181.700000 3801.900000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 3801.100000 0 494.500000 3801.100000 0 494.500000 3800.400000 0 181.700000 3800.400000 0 181.700000 3801.100000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 3800.400000 0 494.500000 3800.400000 0 494.500000 3799.600000 0 181.700000 3799.600000 0 181.700000 3800.400000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 3799.600000 0 494.500000 3799.600000 0 494.500000 3798.900000 0 181.700000 3798.900000 0 181.700000 3799.600000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 3798.900000 0 494.500000 3798.900000 0 494.500000 3798.100000 0 181.700000 3798.100000 0 181.700000 3798.900000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 3798.100000 0 494.500000 3798.100000 0 494.500000 3797.400000 0 181.700000 3797.400000 0 181.700000 3798.100000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 3797.400000 0 494.500000 3797.400000 0 494.500000 3796.600000 0 181.700000 3796.600000 0 181.700000 3797.400000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 3796.600000 0 494.500000 3796.600000 0 494.500000 3795.800000 0 181.700000 3795.800000 0 181.700000 3796.600000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 3795.800000 0 494.500000 3795.800000 0 494.500000 3795.100000 0 181.700000 3795.100000 0 181.700000 3795.800000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 3795.100000 0 494.500000 3795.100000 0 494.500000 3794.300000 0 181.700000 3794.300000 0 181.700000 3795.100000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 3794.300000 0 494.500000 3794.300000 0 494.500000 3793.600000 0 181.700000 3793.600000 0 181.700000 3794.300000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 3793.600000 0 494.500000 3793.600000 0 494.500000 3792.800000 0 181.700000 3792.800000 0 181.700000 3793.600000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 3792.800000 0 494.500000 3792.800000 0 494.500000 3792.000000 0 181.700000 3792.000000 0 181.700000 3792.800000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 3792.000000 0 494.500000 3792.000000 0 494.500000 3791.300000 0 181.700000 3791.300000 0 181.700000 3792.000000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 3791.300000 0 494.500000 3791.300000 0 494.500000 3790.500000 0 181.700000 3790.500000 0 181.700000 3791.300000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 3790.500000 0 494.500000 3790.500000 0 494.500000 3789.800000 0 181.700000 3789.800000 0 181.700000 3790.500000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 3789.800000 0 494.500000 3789.800000 0 494.500000 3789.000000 0 181.700000 3789.000000 0 181.700000 3789.800000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 3789.000000 0 494.500000 3789.000000 0 494.500000 3788.200000 0 181.700000 3788.200000 0 181.700000 3789.000000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 3788.200000 0 494.500000 3788.200000 0 494.500000 3787.500000 0 181.700000 3787.500000 0 181.700000 3788.200000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 3787.500000 0 494.500000 3787.500000 0 494.500000 3786.700000 0 181.700000 3786.700000 0 181.700000 3787.500000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 3786.700000 0 494.500000 3786.700000 0 494.500000 3786.000000 0 181.700000 3786.000000 0 181.700000 3786.700000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 3786.000000 0 494.500000 3786.000000 0 494.500000 3785.200000 0 181.700000 3785.200000 0 181.700000 3786.000000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 3785.200000 0 494.500000 3785.200000 0 494.500000 3784.500000 0 181.700000 3784.500000 0 181.700000 3785.200000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 3784.500000 0 494.500000 3784.500000 0 494.500000 3783.700000 0 181.700000 3783.700000 0 181.700000 3784.500000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 3783.700000 0 494.500000 3783.700000 0 494.500000 3782.900000 0 181.700000 3782.900000 0 181.700000 3783.700000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 3782.900000 0 494.500000 3782.900000 0 494.500000 3782.200000 0 181.700000 3782.200000 0 181.700000 3782.900000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 3782.200000 0 494.500000 3782.200000 0 494.500000 3781.400000 0 181.700000 3781.400000 0 181.700000 3782.200000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 3781.400000 0 494.500000 3781.400000 0 494.500000 3780.700000 0 181.700000 3780.700000 0 181.700000 3781.400000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 3780.700000 0 494.500000 3780.700000 0 494.500000 3779.900000 0 181.700000 3779.900000 0 181.700000 3780.700000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 3779.900000 0 494.500000 3779.900000 0 494.500000 3779.100000 0 181.700000 3779.100000 0 181.700000 3779.900000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 3779.100000 0 494.500000 3779.100000 0 494.500000 3778.400000 0 181.700000 3778.400000 0 181.700000 3779.100000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 3778.400000 0 494.500000 3778.400000 0 494.500000 3777.600000 0 181.700000 3777.600000 0 181.700000 3778.400000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 3777.600000 0 494.500000 3777.600000 0 494.500000 3776.900000 0 181.700000 3776.900000 0 181.700000 3777.600000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 3776.900000 0 494.500000 3776.900000 0 494.500000 3776.100000 0 181.700000 3776.100000 0 181.700000 3776.900000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 3776.100000 0 494.500000 3776.100000 0 494.500000 3775.400000 0 181.700000 3775.400000 0 181.700000 3776.100000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 3775.400000 0 494.500000 3775.400000 0 494.500000 3774.600000 0 181.700000 3774.600000 0 181.700000 3775.400000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 3774.600000 0 494.500000 3774.600000 0 494.500000 3773.800000 0 181.700000 3773.800000 0 181.700000 3774.600000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 3773.800000 0 494.500000 3773.800000 0 494.500000 3773.100000 0 181.700000 3773.100000 0 181.700000 3773.800000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 3773.100000 0 494.500000 3773.100000 0 494.500000 3772.300000 0 181.700000 3772.300000 0 181.700000 3773.100000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 3772.300000 0 494.500000 3772.300000 0 494.500000 3771.600000 0 181.700000 3771.600000 0 181.700000 3772.300000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 3771.600000 0 494.500000 3771.600000 0 494.500000 3770.800000 0 181.700000 3770.800000 0 181.700000 3771.600000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 3770.800000 0 494.500000 3770.800000 0 494.500000 3770.100000 0 181.700000 3770.100000 0 181.700000 3770.800000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 3770.100000 0 494.500000 3770.100000 0 494.500000 3769.300000 0 181.700000 3769.300000 0 181.700000 3770.100000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 3769.300000 0 494.500000 3769.300000 0 494.500000 3768.500000 0 181.700000 3768.500000 0 181.700000 3769.300000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 3768.500000 0 494.500000 3768.500000 0 494.500000 3767.800000 0 181.700000 3767.800000 0 181.700000 3768.500000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 3767.800000 0 494.500000 3767.800000 0 494.500000 3767.000000 0 181.700000 3767.000000 0 181.700000 3767.800000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 3767.000000 0 494.500000 3767.000000 0 494.500000 3766.300000 0 181.700000 3766.300000 0 181.700000 3767.000000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 3766.300000 0 494.500000 3766.300000 0 494.500000 3765.500000 0 181.700000 3765.500000 0 181.700000 3766.300000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 3765.500000 0 494.500000 3765.500000 0 494.500000 3764.700000 0 181.700000 3764.700000 0 181.700000 3765.500000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 3764.700000 0 494.500000 3764.700000 0 494.500000 3764.000000 0 181.700000 3764.000000 0 181.700000 3764.700000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 3764.000000 0 494.500000 3764.000000 0 494.500000 3763.200000 0 181.700000 3763.200000 0 181.700000 3764.000000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 3763.200000 0 494.500000 3763.200000 0 494.500000 3762.500000 0 181.700000 3762.500000 0 181.700000 3763.200000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 3762.500000 0 494.500000 3762.500000 0 494.500000 3761.700000 0 181.700000 3761.700000 0 181.700000 3762.500000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 3761.700000 0 494.500000 3761.700000 0 494.500000 3761.000000 0 181.700000 3761.000000 0 181.700000 3761.700000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 3761.000000 0 494.500000 3761.000000 0 494.500000 3760.200000 0 181.700000 3760.200000 0 181.700000 3761.000000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 3760.200000 0 494.500000 3760.200000 0 494.500000 3759.400000 0 181.700000 3759.400000 0 181.700000 3760.200000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 3759.400000 0 494.500000 3759.400000 0 494.500000 3758.700000 0 181.700000 3758.700000 0 181.700000 3759.400000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 3758.700000 0 494.500000 3758.700000 0 494.500000 3757.900000 0 181.700000 3757.900000 0 181.700000 3758.700000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 3757.900000 0 494.500000 3757.900000 0 494.500000 3757.200000 0 181.700000 3757.200000 0 181.700000 3757.900000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 3757.200000 0 494.500000 3757.200000 0 494.500000 3756.400000 0 181.700000 3756.400000 0 181.700000 3757.200000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 3756.400000 0 494.500000 3756.400000 0 494.500000 3755.700000 0 181.700000 3755.700000 0 181.700000 3756.400000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 3755.700000 0 494.500000 3755.700000 0 494.500000 3754.900000 0 181.700000 3754.900000 0 181.700000 3755.700000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 3754.900000 0 494.500000 3754.900000 0 494.500000 3754.100000 0 181.700000 3754.100000 0 181.700000 3754.900000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 3754.100000 0 494.500000 3754.100000 0 494.500000 3753.400000 0 181.700000 3753.400000 0 181.700000 3754.100000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 3753.400000 0 494.500000 3753.400000 0 494.500000 3752.600000 0 181.700000 3752.600000 0 181.700000 3753.400000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 3752.600000 0 494.500000 3752.600000 0 494.500000 3751.900000 0 181.700000 3751.900000 0 181.700000 3752.600000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 3751.900000 0 494.500000 3751.900000 0 494.500000 3751.100000 0 181.700000 3751.100000 0 181.700000 3751.900000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 3751.100000 0 494.500000 3751.100000 0 494.500000 3750.300000 0 181.700000 3750.300000 0 181.700000 3751.100000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 3750.300000 0 494.500000 3750.300000 0 494.500000 3749.600000 0 181.700000 3749.600000 0 181.700000 3750.300000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 3749.600000 0 494.500000 3749.600000 0 494.500000 3748.800000 0 181.700000 3748.800000 0 181.700000 3749.600000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 3748.800000 0 494.500000 3748.800000 0 494.500000 3748.100000 0 181.700000 3748.100000 0 181.700000 3748.800000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 3748.100000 0 494.500000 3748.100000 0 494.500000 3747.300000 0 181.700000 3747.300000 0 181.700000 3748.100000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 3747.300000 0 494.500000 3747.300000 0 494.500000 3746.500000 0 181.700000 3746.500000 0 181.700000 3747.300000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 3746.500000 0 494.500000 3746.500000 0 494.500000 3745.800000 0 181.700000 3745.800000 0 181.700000 3746.500000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 3745.800000 0 494.500000 3745.800000 0 494.500000 3745.000000 0 181.700000 3745.000000 0 181.700000 3745.800000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 3745.000000 0 494.500000 3745.000000 0 494.500000 3744.300000 0 181.700000 3744.300000 0 181.700000 3745.000000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 3744.300000 0 494.500000 3744.300000 0 494.500000 3743.500000 0 181.700000 3743.500000 0 181.700000 3744.300000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 3743.500000 0 494.500000 3743.500000 0 494.500000 3742.800000 0 181.700000 3742.800000 0 181.700000 3743.500000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 3742.800000 0 494.500000 3742.800000 0 494.500000 3742.000000 0 181.700000 3742.000000 0 181.700000 3742.800000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 3742.000000 0 494.500000 3742.000000 0 494.500000 3741.200000 0 181.700000 3741.200000 0 181.700000 3742.000000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 3741.200000 0 494.500000 3741.200000 0 494.500000 3740.500000 0 181.700000 3740.500000 0 181.700000 3741.200000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 3740.500000 0 494.500000 3740.500000 0 494.500000 3739.700000 0 181.700000 3739.700000 0 181.700000 3740.500000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 3739.700000 0 494.500000 3739.700000 0 494.500000 3739.000000 0 181.700000 3739.000000 0 181.700000 3739.700000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 3739.000000 0 494.500000 3739.000000 0 494.500000 3738.200000 0 181.700000 3738.200000 0 181.700000 3739.000000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 3738.200000 0 494.500000 3738.200000 0 494.500000 3737.400000 0 181.700000 3737.400000 0 181.700000 3738.200000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 3737.400000 0 494.500000 3737.400000 0 494.500000 3736.700000 0 181.700000 3736.700000 0 181.700000 3737.400000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 3736.700000 0 494.500000 3736.700000 0 494.500000 3735.900000 0 181.700000 3735.900000 0 181.700000 3736.700000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 3735.900000 0 494.500000 3735.900000 0 494.500000 3735.200000 0 181.700000 3735.200000 0 181.700000 3735.900000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 3735.200000 0 494.500000 3735.200000 0 494.500000 3734.400000 0 181.700000 3734.400000 0 181.700000 3735.200000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 3734.400000 0 494.500000 3734.400000 0 494.500000 3733.600000 0 181.700000 3733.600000 0 181.700000 3734.400000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 3733.600000 0 494.500000 3733.600000 0 494.500000 3732.900000 0 181.700000 3732.900000 0 181.700000 3733.600000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 3732.900000 0 494.500000 3732.900000 0 494.500000 3732.100000 0 181.700000 3732.100000 0 181.700000 3732.900000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 3732.100000 0 494.500000 3732.100000 0 494.500000 3731.400000 0 181.700000 3731.400000 0 181.700000 3732.100000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 3731.400000 0 494.500000 3731.400000 0 494.500000 3730.600000 0 181.700000 3730.600000 0 181.700000 3731.400000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 3730.600000 0 494.500000 3730.600000 0 494.500000 3729.900000 0 181.700000 3729.900000 0 181.700000 3730.600000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 3729.900000 0 494.500000 3729.900000 0 494.500000 3729.100000 0 181.700000 3729.100000 0 181.700000 3729.900000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 3729.100000 0 494.500000 3729.100000 0 494.500000 3728.300000 0 181.700000 3728.300000 0 181.700000 3729.100000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 3728.300000 0 494.500000 3728.300000 0 494.500000 3727.600000 0 181.700000 3727.600000 0 181.700000 3728.300000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 3727.600000 0 494.500000 3727.600000 0 494.500000 3726.800000 0 181.700000 3726.800000 0 181.700000 3727.600000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 3726.800000 0 494.500000 3726.800000 0 494.500000 3726.100000 0 181.700000 3726.100000 0 181.700000 3726.800000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 3726.100000 0 494.500000 3726.100000 0 494.500000 3725.300000 0 181.700000 3725.300000 0 181.700000 3726.100000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 3725.300000 0 494.500000 3725.300000 0 494.500000 3724.500000 0 181.700000 3724.500000 0 181.700000 3725.300000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 3724.500000 0 494.500000 3724.500000 0 494.500000 3723.800000 0 181.700000 3723.800000 0 181.700000 3724.500000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 3723.800000 0 494.500000 3723.800000 0 494.500000 3723.000000 0 181.700000 3723.000000 0 181.700000 3723.800000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 3723.000000 0 494.500000 3723.000000 0 494.500000 3722.300000 0 181.700000 3722.300000 0 181.700000 3723.000000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 3722.300000 0 494.500000 3722.300000 0 494.500000 3721.500000 0 181.700000 3721.500000 0 181.700000 3722.300000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 3721.500000 0 494.500000 3721.500000 0 494.500000 3720.700000 0 181.700000 3720.700000 0 181.700000 3721.500000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 3720.700000 0 494.500000 3720.700000 0 494.500000 3720.000000 0 181.700000 3720.000000 0 181.700000 3720.700000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 3720.000000 0 494.500000 3720.000000 0 494.500000 3719.200000 0 181.700000 3719.200000 0 181.700000 3720.000000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 3719.200000 0 494.500000 3719.200000 0 494.500000 3718.500000 0 181.700000 3718.500000 0 181.700000 3719.200000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 3718.500000 0 494.500000 3718.500000 0 494.500000 3717.700000 0 181.700000 3717.700000 0 181.700000 3718.500000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 3717.700000 0 494.500000 3717.700000 0 494.500000 3717.000000 0 181.700000 3717.000000 0 181.700000 3717.700000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 3717.000000 0 494.500000 3717.000000 0 494.500000 3716.200000 0 181.700000 3716.200000 0 181.700000 3717.000000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 3716.200000 0 494.500000 3716.200000 0 494.500000 3715.400000 0 181.700000 3715.400000 0 181.700000 3716.200000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 3715.400000 0 494.500000 3715.400000 0 494.500000 3714.700000 0 181.700000 3714.700000 0 181.700000 3715.400000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 3714.700000 0 494.500000 3714.700000 0 494.500000 3713.900000 0 181.700000 3713.900000 0 181.700000 3714.700000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 3713.900000 0 494.500000 3713.900000 0 494.500000 3713.200000 0 181.700000 3713.200000 0 181.700000 3713.900000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 3713.200000 0 494.500000 3713.200000 0 494.500000 3712.400000 0 181.700000 3712.400000 0 181.700000 3713.200000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 3712.400000 0 494.500000 3712.400000 0 494.500000 3711.600000 0 181.700000 3711.600000 0 181.700000 3712.400000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 3711.600000 0 494.500000 3711.600000 0 494.500000 3710.900000 0 181.700000 3710.900000 0 181.700000 3711.600000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 3710.900000 0 494.500000 3710.900000 0 494.500000 3710.100000 0 181.700000 3710.100000 0 181.700000 3710.900000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 3710.100000 0 494.500000 3710.100000 0 494.500000 3709.400000 0 181.700000 3709.400000 0 181.700000 3710.100000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 3709.400000 0 494.500000 3709.400000 0 494.500000 3708.600000 0 181.700000 3708.600000 0 181.700000 3709.400000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 3708.600000 0 494.500000 3708.600000 0 494.500000 3707.800000 0 181.700000 3707.800000 0 181.700000 3708.600000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 3707.800000 0 494.500000 3707.800000 0 494.500000 3707.100000 0 181.700000 3707.100000 0 181.700000 3707.800000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 3707.100000 0 494.500000 3707.100000 0 494.500000 3706.300000 0 181.700000 3706.300000 0 181.700000 3707.100000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 3706.300000 0 494.500000 3706.300000 0 494.500000 3705.600000 0 181.700000 3705.600000 0 181.700000 3706.300000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 3705.600000 0 494.500000 3705.600000 0 494.500000 3704.800000 0 181.700000 3704.800000 0 181.700000 3705.600000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 3704.800000 0 494.500000 3704.800000 0 494.500000 3704.100000 0 181.700000 3704.100000 0 181.700000 3704.800000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 3704.100000 0 494.500000 3704.100000 0 494.500000 3703.300000 0 181.700000 3703.300000 0 181.700000 3704.100000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 3703.300000 0 494.500000 3703.300000 0 494.500000 3702.500000 0 181.700000 3702.500000 0 181.700000 3703.300000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 3702.500000 0 494.500000 3702.500000 0 494.500000 3701.800000 0 181.700000 3701.800000 0 181.700000 3702.500000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 3701.800000 0 494.500000 3701.800000 0 494.500000 3701.000000 0 181.700000 3701.000000 0 181.700000 3701.800000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 3701.100000 0 181.800000 3701.100000 0 181.800000 3894.400000 0 494.400000 3894.400000 0 494.400000 3701.100000 0 338.100000 3701.100000 0
+strokePath subpath 1 338.100000 3701.100000 0 181.800000 3701.100000 0 181.800000 3894.400000 0 494.400000 3894.400000 0 494.400000 3701.100000 0 338.100000 3701.100000 0
+saveState
+updateCtm 11410.000000 0.000000 0.000000 -8760.000000 20530.000000 -298510.000000
+drawSoftMaskedImage 1142 877 1142 877 JPEG 70955 PPM 3004618
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 3740.124000 215.488000 3732.124000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 3740.124000 220.592000 3732.124000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 3740.124000 225.696000 3732.124000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 3740.124000 230.800000 3732.124000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 3732.524000 241.388000 3724.524000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 3732.524000 246.492000 3724.524000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 3732.524000 251.596000 3724.524000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 3732.524000 256.700000 3724.524000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 3724.824000 267.188000 3716.824000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 3724.824000 272.292000 3716.824000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 3724.824000 277.396000 3716.824000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 3724.824000 282.500000 3716.824000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 3717.224000 293.088000 3709.224000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 3717.224000 298.192000 3709.224000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 3717.224000 303.296000 3709.224000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 3717.224000 308.400000 3709.224000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 3755.124000 202.588000 3747.124000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 3774.424000 201.688000 3766.424000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 3793.724000 195.788000 3785.724000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 3793.724000 200.892000 3785.724000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 3813.124000 194.888000 3805.124000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 3813.124000 199.992000 3805.124000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 3832.424000 193.988000 3824.424000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 3832.424000 199.092000 3824.424000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 3851.724000 193.088000 3843.724000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 3851.724000 198.192000 3843.724000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 3723.824000 330.188000 3715.824000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 3723.824000 332.716000 3715.824000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 3723.824000 337.596000 3715.824000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 3723.824000 341.396000 3715.824000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 3723.824000 346.036000 3715.824000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 3723.824000 350.900000 3715.824000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 3723.824000 355.972000 3715.824000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 3723.824000 359.196000 3715.824000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 3723.824000 362.196000 3715.824000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 3723.824000 367.404000 3715.824000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 3723.824000 371.876000 3715.824000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 3723.824000 375.052000 3715.824000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 3743.324000 361.172000 3735.324000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 3743.324000 364.340000 3735.324000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 3743.324000 367.396000 3735.324000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 3743.324000 372.604000 3735.324000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 3743.324000 379.348000 3735.324000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 3743.324000 384.484000 3735.324000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 3743.324000 389.436000 3735.324000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 3743.324000 392.108000 3735.324000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 3743.324000 395.708000 3735.324000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 3743.324000 397.540000 3735.324000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 3743.324000 402.444000 3735.324000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 3743.324000 406.788000 3735.324000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 3762.924000 392.972000 3754.924000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 3762.924000 398.076000 3754.924000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 3762.924000 403.180000 3754.924000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 3762.924000 405.428000 3754.924000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 3762.924000 410.332000 3754.924000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 3762.924000 414.476000 3754.924000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 3890.492000 305.808000 3876.492000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 3890.492000 314.138000 3876.492000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 3890.492000 320.788000 3876.492000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 3890.492000 328.698000 3876.492000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 3890.492000 336.972000 3876.492000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 3890.492000 344.182000 3876.492000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 3890.492000 349.810000 3876.492000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 3890.492000 354.234000 3876.492000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 3890.492000 362.718000 3876.492000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 3890.492000 367.870000 3876.492000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 3890.492000 372.322000 3876.492000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 3890.492000 382.080000 3876.492000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 3890.492000 388.772000 3876.492000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 3890.492000 397.802000 3876.492000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 3890.492000 402.254000 3876.492000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 3890.492000 407.896000 3876.492000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 3767.600000 0 424.300000 3767.600000 0 424.300000 3828.300000 0 493.600000 3828.300000 0 493.600000 3767.600000 0 458.900000 3767.600000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 3818.700000 0 428.900000 3818.700000 0 428.900000 3824.600000 0 434.800000 3824.600000 0 434.800000 3818.700000 0 431.900000 3818.700000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 3807.600000 0 428.900000 3807.600000 0 428.900000 3813.600000 0 434.800000 3813.600000 0 434.800000 3807.600000 0 431.900000 3807.600000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 3796.500000 0 428.900000 3796.500000 0 428.900000 3802.500000 0 434.800000 3802.500000 0 434.800000 3796.500000 0 431.900000 3796.500000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 3785.400000 0 428.900000 3785.400000 0 428.900000 3791.400000 0 434.800000 3791.400000 0 434.800000 3785.400000 0 431.900000 3785.400000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 3774.300000 0 428.900000 3774.300000 0 428.900000 3780.300000 0 434.800000 3780.300000 0 434.800000 3774.300000 0 431.900000 3774.300000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 3825.824000 443.288000 3817.824000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 3825.824000 445.816000 3817.824000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 3825.824000 450.600000 3817.824000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 3825.824000 454.496000 3817.824000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 3825.824000 459.136000 3817.824000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 3825.824000 464.000000 3817.824000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 3825.824000 468.976000 3817.824000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 3825.824000 472.304000 3817.824000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 3825.824000 475.208000 3817.824000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 3825.824000 480.520000 3817.824000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 3825.824000 484.992000 3817.824000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 3825.824000 488.168000 3817.824000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 3814.724000 443.352000 3806.724000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 3814.724000 447.920000 3806.724000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 3814.724000 452.976000 3806.724000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 3814.724000 457.400000 3806.724000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 3814.724000 462.472000 3806.724000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 3814.724000 465.800000 3806.724000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 3814.724000 468.904000 3806.724000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 3814.724000 473.816000 3806.724000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 3814.724000 478.888000 3806.724000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 3814.724000 482.064000 3806.724000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 3803.624000 442.872000 3795.624000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 3803.624000 446.040000 3795.624000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 3803.624000 448.992000 3795.624000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 3803.624000 454.304000 3795.624000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 3803.624000 461.048000 3795.624000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 3803.624000 466.184000 3795.624000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 3803.624000 471.136000 3795.624000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 3803.624000 473.808000 3795.624000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 3803.624000 477.408000 3795.624000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 3803.624000 479.240000 3795.624000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 3803.624000 484.144000 3795.624000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 3803.624000 488.488000 3795.624000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 3792.524000 443.384000 3784.524000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 3792.524000 448.464000 3784.524000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 3792.524000 453.424000 3784.524000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 3792.524000 456.696000 3784.524000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 3792.524000 459.800000 3784.524000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 3792.524000 462.032000 3784.524000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 3792.524000 466.936000 3784.524000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 3792.524000 471.080000 3784.524000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 3781.424000 443.272000 3773.424000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 3781.424000 448.376000 3773.424000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 3781.424000 453.480000 3773.424000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 3781.424000 455.728000 3773.424000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 3781.424000 460.632000 3773.424000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 3781.424000 464.776000 3773.424000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 1136.500000 0 114.800000 1136.500000 0 114.800000 1179.300000 0 72.000000 1179.300000 0 72.000000 1136.500000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 -34460.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 76.600000 701.300000 0 535.500000 701.300000 0 535.500000 720.000000 0 76.600000 720.000000 0 76.600000 701.300000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 76.600000 644.900000 0 291.900000 644.900000 0 291.900000 659.000000 0 76.600000 659.000000 0 76.600000 644.900000 0
+eoFillPath subpath 1 76.600000 575.200000 0 291.900000 575.200000 0 291.900000 589.300000 0 76.600000 589.300000 0 76.600000 575.200000 0
+eoFillPath subpath 1 76.600000 547.200000 0 291.900000 547.200000 0 291.900000 561.300000 0 76.600000 561.300000 0 76.600000 547.200000 0
+eoFillPath subpath 1 76.600000 505.300000 0 291.900000 505.300000 0 291.900000 519.400000 0 76.600000 519.400000 0 76.600000 505.300000 0
+eoFillPath subpath 1 76.600000 449.500000 0 291.900000 449.500000 0 291.900000 463.600000 0 76.600000 463.600000 0 76.600000 449.500000 0
+eoFillPath subpath 1 76.600000 393.700000 0 291.900000 393.700000 0 291.900000 407.800000 0 76.600000 407.800000 0 76.600000 393.700000 0
+eoFillPath subpath 1 76.600000 310.100000 0 291.900000 310.100000 0 291.900000 324.200000 0 76.600000 324.200000 0 76.600000 310.100000 0
+eoFillPath subpath 1 76.600000 143.100000 0 291.900000 143.100000 0 291.900000 157.200000 0 76.600000 157.200000 0 76.600000 143.100000 0
+eoFillPath subpath 1 320.200000 658.800000 0 535.500000 658.800000 0 535.500000 672.900000 0 320.200000 672.900000 0 320.200000 658.800000 0
+eoFillPath subpath 1 320.200000 547.400000 0 535.500000 547.400000 0 535.500000 561.500000 0 320.200000 561.500000 0 320.200000 547.400000 0
+eoFillPath subpath 1 320.200000 213.600000 0 535.500000 213.600000 0 535.500000 227.700000 0 320.200000 227.700000 0 320.200000 213.600000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 76.700000 719.948000 81.404000 703.948000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 81.404000 719.948000 91.532000 703.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 91.500000 719.948000 101.644000 703.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 101.708000 719.948000 111.548000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.308000 719.948000 120.764000 703.948000 1.000000 0.000000 0.000000 1.000000 x
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 672.936000 81.440000 660.936000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 81.404000 672.936000 87.140000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.104000 672.936000 94.328000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.304000 672.936000 102.032000 660.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 102.008000 672.936000 105.836000 660.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 105.812000 672.936000 113.540000 660.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 113.516000 672.936000 121.196000 660.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 121.220000 672.936000 125.024000 660.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.024000 672.936000 132.704000 660.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 132.728000 672.936000 139.952000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 139.928000 672.936000 147.080000 660.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.128000 672.936000 152.864000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 152.828000 672.936000 160.508000 660.936000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 160.600000 672.936000 164.404000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.500000 672.936000 168.304000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.400000 672.936000 172.204000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.300000 672.936000 176.104000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.200000 672.936000 180.004000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.100000 672.936000 183.904000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.000000 672.936000 187.804000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.900000 672.936000 191.704000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.800000 672.936000 195.604000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.700000 672.936000 199.504000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.600000 672.936000 203.404000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.500000 672.936000 207.304000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.400000 672.936000 211.204000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.300000 672.936000 215.104000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.200000 672.936000 219.004000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.100000 672.936000 222.904000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.000000 672.936000 226.804000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.900000 672.936000 230.704000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.800000 672.936000 234.604000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.700000 672.936000 238.504000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.600000 672.936000 242.404000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.500000 672.936000 246.304000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.400000 672.936000 250.204000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.300000 672.936000 254.104000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.200000 672.936000 258.004000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.100000 672.936000 261.904000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.000000 672.936000 265.804000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.900000 672.936000 269.704000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.800000 672.936000 273.604000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.700000 672.936000 277.504000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.600000 672.936000 281.404000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.500000 672.936000 285.304000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 672.936000 292.032000 660.936000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 658.956000 82.376000 646.956000 1.000000 0.000000 0.000000 1.000000 J
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 644.936000 81.500000 632.936000 1.000000 0.000000 0.000000 1.000000 J
+drawChar 81.500000 644.936000 88.652000 632.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 88.700000 644.936000 100.076000 632.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 100.100000 644.936000 106.256000 632.936000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 106.100000 644.936000 109.904000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 110.000000 644.936000 113.804000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 113.900000 644.936000 117.704000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 117.800000 644.936000 121.604000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 121.700000 644.936000 125.504000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 125.600000 644.936000 129.404000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 129.500000 644.936000 133.304000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.400000 644.936000 137.204000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.300000 644.936000 141.104000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.200000 644.936000 145.004000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.100000 644.936000 148.904000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.000000 644.936000 152.804000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.900000 644.936000 156.704000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.800000 644.936000 160.604000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.700000 644.936000 164.504000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.600000 644.936000 168.404000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.500000 644.936000 172.304000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.400000 644.936000 176.204000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.300000 644.936000 180.104000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.200000 644.936000 184.004000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.100000 644.936000 187.904000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.000000 644.936000 191.804000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.900000 644.936000 195.704000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.800000 644.936000 199.604000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.700000 644.936000 203.504000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.600000 644.936000 207.404000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.500000 644.936000 211.304000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.400000 644.936000 215.204000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.300000 644.936000 219.104000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.200000 644.936000 223.004000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.100000 644.936000 226.904000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.000000 644.936000 230.804000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.900000 644.936000 234.704000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.800000 644.936000 238.604000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.700000 644.936000 242.504000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.600000 644.936000 246.404000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.500000 644.936000 250.304000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.400000 644.936000 254.204000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.300000 644.936000 258.104000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.200000 644.936000 262.004000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.100000 644.936000 265.904000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.000000 644.936000 269.804000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.900000 644.936000 273.704000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.800000 644.936000 277.604000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.700000 644.936000 281.504000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.600000 644.936000 285.404000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 644.936000 292.032000 632.936000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 631.036000 81.500000 619.036000 1.000000 0.000000 0.000000 1.000000 J
+drawChar 81.500000 631.036000 88.592000 619.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 88.604000 631.036000 92.432000 619.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.408000 631.036000 96.236000 619.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 96.212000 631.036000 100.040000 619.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 100.016000 631.036000 107.108000 619.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.120000 631.036000 113.276000 619.036000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 113.300000 631.036000 117.104000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 117.104000 631.036000 120.908000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 120.908000 631.036000 124.712000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 124.712000 631.036000 128.516000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 128.516000 631.036000 132.320000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.320000 631.036000 136.124000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 136.124000 631.036000 139.928000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 139.928000 631.036000 143.732000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 143.732000 631.036000 147.536000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 147.536000 631.036000 151.340000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 151.340000 631.036000 155.144000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 155.144000 631.036000 158.948000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.948000 631.036000 162.752000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.752000 631.036000 166.556000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 166.556000 631.036000 170.360000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 170.360000 631.036000 174.164000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 174.164000 631.036000 177.968000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.968000 631.036000 181.772000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.772000 631.036000 185.576000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.576000 631.036000 189.380000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 189.380000 631.036000 193.184000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 193.184000 631.036000 196.988000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.988000 631.036000 200.792000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.792000 631.036000 204.596000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.596000 631.036000 208.400000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 208.400000 631.036000 212.204000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 212.204000 631.036000 216.008000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 216.008000 631.036000 219.812000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.812000 631.036000 223.616000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.616000 631.036000 227.420000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.420000 631.036000 231.224000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.224000 631.036000 235.028000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 235.028000 631.036000 238.832000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.832000 631.036000 242.636000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.636000 631.036000 246.440000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.440000 631.036000 250.244000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.244000 631.036000 254.048000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.048000 631.036000 257.852000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.852000 631.036000 261.656000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.656000 631.036000 265.460000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.460000 631.036000 269.264000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.264000 631.036000 273.068000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.068000 631.036000 276.872000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.872000 631.036000 280.676000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.676000 631.036000 284.480000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 631.036000 292.032000 619.036000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 617.136000 81.500000 605.136000 1.000000 0.000000 0.000000 1.000000 J
+drawChar 81.500000 617.136000 88.724000 605.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.700000 617.136000 96.380000 605.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 96.404000 617.136000 104.084000 605.136000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 104.108000 617.136000 107.936000 605.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 107.912000 617.136000 115.640000 605.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.616000 617.136000 123.296000 605.136000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 123.200000 617.136000 127.004000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 127.004000 617.136000 130.808000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 130.808000 617.136000 134.612000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 134.612000 617.136000 138.416000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 138.416000 617.136000 142.220000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 142.220000 617.136000 146.024000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 146.024000 617.136000 149.828000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.828000 617.136000 153.632000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.632000 617.136000 157.436000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.436000 617.136000 161.240000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.240000 617.136000 165.044000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.044000 617.136000 168.848000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.848000 617.136000 172.652000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.652000 617.136000 176.456000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.456000 617.136000 180.260000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.260000 617.136000 184.064000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.064000 617.136000 187.868000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.868000 617.136000 191.672000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.672000 617.136000 195.476000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.476000 617.136000 199.280000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.280000 617.136000 203.084000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.084000 617.136000 206.888000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.888000 617.136000 210.692000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.692000 617.136000 214.496000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.496000 617.136000 218.300000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.300000 617.136000 222.104000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.104000 617.136000 225.908000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.908000 617.136000 229.712000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.712000 617.136000 233.516000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.516000 617.136000 237.320000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.320000 617.136000 241.124000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.124000 617.136000 244.928000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.928000 617.136000 248.732000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.732000 617.136000 252.536000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.536000 617.136000 256.340000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.340000 617.136000 260.144000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.144000 617.136000 263.948000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.948000 617.136000 267.752000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.752000 617.136000 271.556000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.556000 617.136000 275.360000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 617.136000 284.332000 605.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 617.136000 291.928000 605.136000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 603.236000 81.500000 591.236000 1.000000 0.000000 0.000000 1.000000 J
+drawChar 81.500000 603.236000 89.228000 591.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 89.204000 603.236000 96.464000 591.236000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 96.500000 603.236000 103.592000 591.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 103.604000 603.236000 111.284000 591.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 111.308000 603.236000 118.532000 591.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 118.508000 603.236000 125.264000 591.236000 1.000000 0.000000 0.000000 1.000000 x
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 125.200000 603.236000 129.004000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 129.100000 603.236000 132.904000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.000000 603.236000 136.804000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 136.900000 603.236000 140.704000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 140.800000 603.236000 144.604000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.700000 603.236000 148.504000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.600000 603.236000 152.404000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.500000 603.236000 156.304000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.400000 603.236000 160.204000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.300000 603.236000 164.104000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.200000 603.236000 168.004000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.100000 603.236000 171.904000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.000000 603.236000 175.804000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.900000 603.236000 179.704000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.800000 603.236000 183.604000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.700000 603.236000 187.504000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.600000 603.236000 191.404000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.500000 603.236000 195.304000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.400000 603.236000 199.204000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.300000 603.236000 203.104000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.200000 603.236000 207.004000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.100000 603.236000 210.904000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.000000 603.236000 214.804000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.900000 603.236000 218.704000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.800000 603.236000 222.604000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.700000 603.236000 226.504000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.600000 603.236000 230.404000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.500000 603.236000 234.304000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.400000 603.236000 238.204000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.300000 603.236000 242.104000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.200000 603.236000 246.004000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.100000 603.236000 249.904000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.000000 603.236000 253.804000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.900000 603.236000 257.704000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.800000 603.236000 261.604000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.700000 603.236000 265.504000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.600000 603.236000 269.404000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.500000 603.236000 273.304000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.400000 603.236000 277.204000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.300000 603.236000 281.104000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.200000 603.236000 285.004000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 603.236000 292.032000 591.236000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 589.256000 87.128000 577.256000 1.000000 0.000000 0.000000 1.000000 K
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 575.236000 85.664000 563.236000 1.000000 0.000000 0.000000 1.000000 K
+drawChar 85.700000 575.236000 89.528000 563.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 89.504000 575.236000 96.596000 563.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 96.608000 575.236000 103.700000 563.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 103.712000 575.236000 111.440000 563.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 111.416000 575.236000 118.508000 563.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 118.520000 575.236000 125.276000 563.236000 1.000000 0.000000 0.000000 1.000000 x
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 125.200000 575.236000 129.004000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 129.100000 575.236000 132.904000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.000000 575.236000 136.804000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 136.900000 575.236000 140.704000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 140.800000 575.236000 144.604000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.700000 575.236000 148.504000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.600000 575.236000 152.404000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.500000 575.236000 156.304000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.400000 575.236000 160.204000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.300000 575.236000 164.104000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.200000 575.236000 168.004000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.100000 575.236000 171.904000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.000000 575.236000 175.804000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.900000 575.236000 179.704000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.800000 575.236000 183.604000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.700000 575.236000 187.504000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.600000 575.236000 191.404000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.500000 575.236000 195.304000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.400000 575.236000 199.204000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.300000 575.236000 203.104000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.200000 575.236000 207.004000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.100000 575.236000 210.904000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.000000 575.236000 214.804000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.900000 575.236000 218.704000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.800000 575.236000 222.604000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.700000 575.236000 226.504000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.600000 575.236000 230.404000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.500000 575.236000 234.304000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.400000 575.236000 238.204000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.300000 575.236000 242.104000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.200000 575.236000 246.004000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.100000 575.236000 249.904000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.000000 575.236000 253.804000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.900000 575.236000 257.704000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.800000 575.236000 261.604000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.700000 575.236000 265.504000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.600000 575.236000 269.404000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.500000 575.236000 273.304000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.400000 575.236000 277.204000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.300000 575.236000 281.104000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.200000 575.236000 285.004000 563.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 575.236000 292.032000 563.236000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 561.256000 85.136000 549.256000 1.000000 0.000000 0.000000 1.000000 L
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 547.236000 84.668000 535.236000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 84.704000 547.236000 91.856000 535.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 91.904000 547.236000 102.164000 535.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 102.200000 547.236000 109.928000 535.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.904000 547.236000 121.280000 535.236000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 121.304000 547.236000 128.528000 535.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 128.504000 547.236000 138.764000 535.236000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 138.800000 547.236000 145.892000 535.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 145.904000 547.236000 151.640000 535.236000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 151.400000 547.236000 155.204000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 155.300000 547.236000 159.104000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 159.200000 547.236000 163.004000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 163.100000 547.236000 166.904000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 167.000000 547.236000 170.804000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 170.900000 547.236000 174.704000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 174.800000 547.236000 178.604000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 178.700000 547.236000 182.504000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 182.600000 547.236000 186.404000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 186.500000 547.236000 190.304000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 190.400000 547.236000 194.204000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 194.300000 547.236000 198.104000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.200000 547.236000 202.004000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.100000 547.236000 205.904000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.000000 547.236000 209.804000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 209.900000 547.236000 213.704000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 213.800000 547.236000 217.604000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 217.700000 547.236000 221.504000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.600000 547.236000 225.404000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.500000 547.236000 229.304000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.400000 547.236000 233.204000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.300000 547.236000 237.104000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.200000 547.236000 241.004000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.100000 547.236000 244.904000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.000000 547.236000 248.804000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.900000 547.236000 252.704000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.800000 547.236000 256.604000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.700000 547.236000 260.504000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.600000 547.236000 264.404000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.500000 547.236000 268.304000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.400000 547.236000 272.204000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.300000 547.236000 276.104000 535.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 547.236000 284.332000 535.236000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 547.236000 291.928000 535.236000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 533.336000 84.668000 521.336000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 84.704000 533.336000 92.432000 521.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 92.408000 533.336000 100.088000 521.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 100.112000 533.336000 107.792000 521.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.816000 533.336000 114.968000 521.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 115.016000 533.336000 122.696000 521.336000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 122.720000 533.336000 129.812000 521.336000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 129.600000 533.336000 133.404000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.500000 533.336000 137.304000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.400000 533.336000 141.204000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.300000 533.336000 145.104000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.200000 533.336000 149.004000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.100000 533.336000 152.904000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.000000 533.336000 156.804000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.900000 533.336000 160.704000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.800000 533.336000 164.604000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.700000 533.336000 168.504000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.600000 533.336000 172.404000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.500000 533.336000 176.304000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.400000 533.336000 180.204000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.300000 533.336000 184.104000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.200000 533.336000 188.004000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.100000 533.336000 191.904000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.000000 533.336000 195.804000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.900000 533.336000 199.704000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.800000 533.336000 203.604000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.700000 533.336000 207.504000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.600000 533.336000 211.404000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.500000 533.336000 215.304000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.400000 533.336000 219.204000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.300000 533.336000 223.104000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.200000 533.336000 227.004000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.100000 533.336000 230.904000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.000000 533.336000 234.804000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.900000 533.336000 238.704000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.800000 533.336000 242.604000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.700000 533.336000 246.504000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.600000 533.336000 250.404000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.500000 533.336000 254.304000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.400000 533.336000 258.204000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.300000 533.336000 262.104000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.200000 533.336000 266.004000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.100000 533.336000 269.904000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.000000 533.336000 273.804000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.900000 533.336000 277.704000 521.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 533.336000 284.332000 521.336000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 533.336000 291.928000 521.336000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 519.356000 89.972000 507.356000 1.000000 0.000000 0.000000 1.000000 M
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 505.336000 88.976000 493.336000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 89.000000 505.336000 96.152000 493.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 96.200000 505.336000 101.936000 493.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 101.900000 505.336000 109.580000 493.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 109.604000 505.336000 113.432000 493.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 113.408000 505.336000 120.500000 493.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 120.512000 505.336000 124.316000 493.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 124.316000 505.336000 129.128000 493.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 129.116000 505.336000 132.944000 493.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 132.920000 505.336000 136.748000 493.336000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 136.724000 505.336000 143.816000 493.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 143.828000 505.336000 149.984000 493.336000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 150.000000 505.336000 153.804000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.804000 505.336000 157.608000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.608000 505.336000 161.412000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.412000 505.336000 165.216000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.216000 505.336000 169.020000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.020000 505.336000 172.824000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.824000 505.336000 176.628000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.628000 505.336000 180.432000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.432000 505.336000 184.236000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.236000 505.336000 188.040000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.040000 505.336000 191.844000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.844000 505.336000 195.648000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.648000 505.336000 199.452000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.452000 505.336000 203.256000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.256000 505.336000 207.060000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.060000 505.336000 210.864000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.864000 505.336000 214.668000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.668000 505.336000 218.472000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.472000 505.336000 222.276000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.276000 505.336000 226.080000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.080000 505.336000 229.884000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.884000 505.336000 233.688000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.688000 505.336000 237.492000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.492000 505.336000 241.296000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.296000 505.336000 245.100000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.100000 505.336000 248.904000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.904000 505.336000 252.708000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.708000 505.336000 256.512000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.512000 505.336000 260.316000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.316000 505.336000 264.120000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.120000 505.336000 267.924000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.924000 505.336000 271.728000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.728000 505.336000 275.532000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.532000 505.336000 279.336000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.336000 505.336000 283.140000 493.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 505.336000 292.032000 493.336000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 491.436000 88.976000 479.436000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 89.000000 491.436000 96.152000 479.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 96.200000 491.436000 101.936000 479.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 101.900000 491.436000 106.712000 479.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 106.700000 491.436000 110.528000 479.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 110.504000 491.436000 118.232000 479.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.208000 491.436000 122.036000 479.436000 1.000000 0.000000 0.000000 1.000000 i
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 122.000000 491.436000 125.804000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 125.900000 491.436000 129.704000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 129.800000 491.436000 133.604000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.700000 491.436000 137.504000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.600000 491.436000 141.404000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.500000 491.436000 145.304000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.400000 491.436000 149.204000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.300000 491.436000 153.104000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.200000 491.436000 157.004000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.100000 491.436000 160.904000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.000000 491.436000 164.804000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.900000 491.436000 168.704000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.800000 491.436000 172.604000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.700000 491.436000 176.504000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.600000 491.436000 180.404000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.500000 491.436000 184.304000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.400000 491.436000 188.204000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.300000 491.436000 192.104000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.200000 491.436000 196.004000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.100000 491.436000 199.904000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.000000 491.436000 203.804000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.900000 491.436000 207.704000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.800000 491.436000 211.604000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.700000 491.436000 215.504000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.600000 491.436000 219.404000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.500000 491.436000 223.304000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.400000 491.436000 227.204000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.300000 491.436000 231.104000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.200000 491.436000 235.004000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 235.100000 491.436000 238.904000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 239.000000 491.436000 242.804000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.900000 491.436000 246.704000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.800000 491.436000 250.604000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.700000 491.436000 254.504000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.600000 491.436000 258.404000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.500000 491.436000 262.304000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.400000 491.436000 266.204000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.300000 491.436000 270.104000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.200000 491.436000 274.004000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 274.100000 491.436000 277.904000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 278.000000 491.436000 281.804000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.900000 491.436000 285.704000 479.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 491.436000 292.032000 479.436000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 477.536000 88.976000 465.536000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 89.000000 477.536000 96.224000 465.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 96.200000 477.536000 103.928000 465.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 103.904000 477.536000 108.716000 465.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 108.704000 477.536000 115.796000 465.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 115.808000 477.536000 121.544000 465.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.508000 477.536000 128.600000 465.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 128.612000 477.536000 135.380000 465.536000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 135.400000 477.536000 139.204000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 139.204000 477.536000 143.008000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 143.008000 477.536000 146.812000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 146.812000 477.536000 150.616000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 150.616000 477.536000 154.420000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.420000 477.536000 158.224000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.224000 477.536000 162.028000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.028000 477.536000 165.832000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.832000 477.536000 169.636000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.636000 477.536000 173.440000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.440000 477.536000 177.244000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.244000 477.536000 181.048000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.048000 477.536000 184.852000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.852000 477.536000 188.656000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.656000 477.536000 192.460000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.460000 477.536000 196.264000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.264000 477.536000 200.068000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.068000 477.536000 203.872000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.872000 477.536000 207.676000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.676000 477.536000 211.480000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.480000 477.536000 215.284000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.284000 477.536000 219.088000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.088000 477.536000 222.892000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.892000 477.536000 226.696000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.696000 477.536000 230.500000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.500000 477.536000 234.304000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.304000 477.536000 238.108000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.108000 477.536000 241.912000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.912000 477.536000 245.716000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.716000 477.536000 249.520000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.520000 477.536000 253.324000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.324000 477.536000 257.128000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.128000 477.536000 260.932000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.932000 477.536000 264.736000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.736000 477.536000 268.540000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.540000 477.536000 272.344000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.344000 477.536000 276.148000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.148000 477.536000 279.952000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.952000 477.536000 283.756000 465.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 477.536000 292.032000 465.536000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 463.556000 87.668000 451.556000 1.000000 0.000000 0.000000 1.000000 N
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 449.536000 87.200000 437.536000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 87.200000 449.536000 94.352000 437.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 94.400000 449.536000 98.228000 437.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 98.204000 449.536000 102.032000 437.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.008000 449.536000 108.164000 437.536000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 108.100000 449.536000 111.904000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 111.904000 449.536000 115.708000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 115.708000 449.536000 119.512000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 119.512000 449.536000 123.316000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 123.316000 449.536000 127.120000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 127.120000 449.536000 130.924000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 130.924000 449.536000 134.728000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 134.728000 449.536000 138.532000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 138.532000 449.536000 142.336000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 142.336000 449.536000 146.140000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 146.140000 449.536000 149.944000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.944000 449.536000 153.748000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.748000 449.536000 157.552000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.552000 449.536000 161.356000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.356000 449.536000 165.160000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.160000 449.536000 168.964000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.964000 449.536000 172.768000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.768000 449.536000 176.572000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.572000 449.536000 180.376000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.376000 449.536000 184.180000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.180000 449.536000 187.984000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.984000 449.536000 191.788000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.788000 449.536000 195.592000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.592000 449.536000 199.396000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.396000 449.536000 203.200000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.200000 449.536000 207.004000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.004000 449.536000 210.808000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.808000 449.536000 214.612000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.612000 449.536000 218.416000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.416000 449.536000 222.220000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.220000 449.536000 226.024000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.024000 449.536000 229.828000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.828000 449.536000 233.632000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.632000 449.536000 237.436000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.436000 449.536000 241.240000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.240000 449.536000 245.044000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.044000 449.536000 248.848000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.848000 449.536000 252.652000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.652000 449.536000 256.456000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.456000 449.536000 260.260000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.260000 449.536000 264.064000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.064000 449.536000 267.868000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.868000 449.536000 271.672000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.672000 449.536000 275.476000 437.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 449.536000 284.332000 437.536000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 449.536000 291.928000 437.536000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 435.636000 87.200000 423.636000 1.000000 0.000000 0.000000 1.000000 N
+drawChar 87.200000 435.636000 94.292000 423.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.304000 435.636000 104.564000 423.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 104.600000 435.636000 108.404000 423.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.404000 435.636000 116.324000 423.636000 1.000000 0.000000 0.000000 1.000000 Y
+drawChar 115.304000 435.636000 122.528000 423.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 122.504000 435.636000 128.240000 423.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 128.204000 435.636000 135.464000 423.636000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 135.400000 435.636000 139.204000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 139.204000 435.636000 143.008000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 143.008000 435.636000 146.812000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 146.812000 435.636000 150.616000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 150.616000 435.636000 154.420000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.420000 435.636000 158.224000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.224000 435.636000 162.028000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.028000 435.636000 165.832000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.832000 435.636000 169.636000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.636000 435.636000 173.440000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.440000 435.636000 177.244000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.244000 435.636000 181.048000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.048000 435.636000 184.852000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.852000 435.636000 188.656000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.656000 435.636000 192.460000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.460000 435.636000 196.264000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.264000 435.636000 200.068000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.068000 435.636000 203.872000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.872000 435.636000 207.676000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.676000 435.636000 211.480000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.480000 435.636000 215.284000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.284000 435.636000 219.088000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.088000 435.636000 222.892000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.892000 435.636000 226.696000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.696000 435.636000 230.500000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.500000 435.636000 234.304000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.304000 435.636000 238.108000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.108000 435.636000 241.912000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.912000 435.636000 245.716000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.716000 435.636000 249.520000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.520000 435.636000 253.324000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.324000 435.636000 257.128000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.128000 435.636000 260.932000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.932000 435.636000 264.736000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.736000 435.636000 268.540000 423.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 269.100000 435.636000 276.732000 423.636000 1.000000 0.000000 0.000000 1.000000 6
+drawChar 276.696000 435.636000 280.500000 423.636000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 280.500000 435.636000 284.304000 423.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 284.304000 435.636000 291.936000 423.636000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 421.736000 99.608000 409.736000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 99.596000 421.736000 105.332000 409.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 105.296000 421.736000 112.520000 409.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 112.496000 421.736000 119.720000 409.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 119.696000 421.736000 126.956000 409.736000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 126.992000 421.736000 130.820000 409.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 130.796000 421.736000 137.564000 409.736000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 137.600000 421.736000 145.328000 409.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 145.304000 421.736000 149.108000 409.736000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.108000 421.736000 157.916000 409.736000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 157.904000 421.736000 163.640000 409.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 163.604000 421.736000 167.432000 409.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 167.408000 421.736000 175.088000 409.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 175.112000 421.736000 182.792000 409.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 182.816000 421.736000 189.908000 409.736000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 190.000000 421.736000 193.804000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 193.900000 421.736000 197.704000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 197.800000 421.736000 201.604000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 201.700000 421.736000 205.504000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 205.600000 421.736000 209.404000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 209.500000 421.736000 213.304000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 213.400000 421.736000 217.204000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 217.300000 421.736000 221.104000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.200000 421.736000 225.004000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.100000 421.736000 228.904000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.000000 421.736000 232.804000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 232.900000 421.736000 236.704000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 236.800000 421.736000 240.604000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.700000 421.736000 244.504000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.600000 421.736000 248.404000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.500000 421.736000 252.304000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.400000 421.736000 256.204000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.300000 421.736000 260.104000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.200000 421.736000 264.004000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.100000 421.736000 267.904000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.000000 421.736000 271.804000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.900000 421.736000 275.704000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.800000 421.736000 279.604000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.700000 421.736000 283.504000 409.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 421.736000 292.032000 409.736000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 407.756000 87.152000 395.756000 1.000000 0.000000 0.000000 1.000000 O
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 393.736000 86.528000 381.736000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 86.504000 393.736000 93.656000 381.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.704000 393.736000 100.964000 381.736000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 100.900000 393.736000 104.704000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 104.704000 393.736000 108.508000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 108.508000 393.736000 112.312000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 112.312000 393.736000 116.116000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 116.116000 393.736000 119.920000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 119.920000 393.736000 123.724000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 123.724000 393.736000 127.528000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 127.528000 393.736000 131.332000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 131.332000 393.736000 135.136000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 135.136000 393.736000 138.940000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 138.940000 393.736000 142.744000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 142.744000 393.736000 146.548000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 146.548000 393.736000 150.352000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 150.352000 393.736000 154.156000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.156000 393.736000 157.960000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.960000 393.736000 161.764000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.764000 393.736000 165.568000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.568000 393.736000 169.372000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.372000 393.736000 173.176000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.176000 393.736000 176.980000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.980000 393.736000 180.784000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.784000 393.736000 184.588000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.588000 393.736000 188.392000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.392000 393.736000 192.196000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.196000 393.736000 196.000000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.000000 393.736000 199.804000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.804000 393.736000 203.608000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.608000 393.736000 207.412000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.412000 393.736000 211.216000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.216000 393.736000 215.020000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.020000 393.736000 218.824000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.824000 393.736000 222.628000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.628000 393.736000 226.432000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.432000 393.736000 230.236000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.236000 393.736000 234.040000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.040000 393.736000 237.844000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.844000 393.736000 241.648000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.648000 393.736000 245.452000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.452000 393.736000 249.256000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.256000 393.736000 253.060000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.060000 393.736000 256.864000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.864000 393.736000 260.668000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.668000 393.736000 264.472000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.472000 393.736000 268.276000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.276000 393.736000 272.080000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.080000 393.736000 275.884000 381.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 393.736000 284.332000 381.736000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 393.736000 291.928000 381.736000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 379.836000 86.528000 367.836000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 86.504000 379.836000 90.332000 367.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.308000 379.836000 97.988000 367.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 98.012000 379.836000 102.056000 367.836000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 102.116000 379.836000 106.928000 367.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 106.916000 379.836000 110.744000 367.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 110.720000 379.836000 122.096000 367.836000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 122.120000 379.836000 129.212000 367.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.224000 379.836000 134.960000 367.836000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 134.900000 379.836000 138.704000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 138.704000 379.836000 142.508000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 142.508000 379.836000 146.312000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 146.312000 379.836000 150.116000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 150.116000 379.836000 153.920000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.920000 379.836000 157.724000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.724000 379.836000 161.528000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.528000 379.836000 165.332000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.332000 379.836000 169.136000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.136000 379.836000 172.940000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.940000 379.836000 176.744000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.744000 379.836000 180.548000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.548000 379.836000 184.352000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.352000 379.836000 188.156000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.156000 379.836000 191.960000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.960000 379.836000 195.764000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.764000 379.836000 199.568000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.568000 379.836000 203.372000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.372000 379.836000 207.176000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.176000 379.836000 210.980000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.980000 379.836000 214.784000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.784000 379.836000 218.588000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.588000 379.836000 222.392000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.392000 379.836000 226.196000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.196000 379.836000 230.000000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.000000 379.836000 233.804000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.804000 379.836000 237.608000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.608000 379.836000 241.412000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.412000 379.836000 245.216000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.216000 379.836000 249.020000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.020000 379.836000 252.824000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.824000 379.836000 256.628000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.628000 379.836000 260.432000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.432000 379.836000 264.236000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.236000 379.836000 268.040000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.040000 379.836000 271.844000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.844000 379.836000 275.648000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.648000 379.836000 279.452000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.452000 379.836000 283.256000 367.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 379.836000 292.032000 367.836000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 365.936000 86.528000 353.936000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 86.504000 365.936000 94.232000 353.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.208000 365.936000 98.036000 353.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 98.012000 365.936000 105.236000 353.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 105.212000 365.936000 112.940000 353.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 112.916000 365.936000 119.072000 353.936000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 119.100000 365.936000 122.904000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 122.904000 365.936000 126.708000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 126.708000 365.936000 130.512000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 130.512000 365.936000 134.316000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 134.316000 365.936000 138.120000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 138.120000 365.936000 141.924000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.924000 365.936000 145.728000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.728000 365.936000 149.532000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.532000 365.936000 153.336000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.336000 365.936000 157.140000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.140000 365.936000 160.944000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.944000 365.936000 164.748000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.748000 365.936000 168.552000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.552000 365.936000 172.356000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.356000 365.936000 176.160000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.160000 365.936000 179.964000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.964000 365.936000 183.768000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.768000 365.936000 187.572000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.572000 365.936000 191.376000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.376000 365.936000 195.180000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.180000 365.936000 198.984000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.984000 365.936000 202.788000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.788000 365.936000 206.592000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.592000 365.936000 210.396000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.396000 365.936000 214.200000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.200000 365.936000 218.004000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.004000 365.936000 221.808000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.808000 365.936000 225.612000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.612000 365.936000 229.416000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.416000 365.936000 233.220000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.220000 365.936000 237.024000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.024000 365.936000 240.828000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.828000 365.936000 244.632000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.632000 365.936000 248.436000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.436000 365.936000 252.240000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.240000 365.936000 256.044000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.044000 365.936000 259.848000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 259.848000 365.936000 263.652000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.652000 365.936000 267.456000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.456000 365.936000 271.260000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.260000 365.936000 275.064000 353.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 365.936000 284.332000 353.936000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 365.936000 291.928000 353.936000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 352.036000 86.528000 340.036000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 86.504000 352.036000 92.240000 340.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 92.204000 352.036000 99.296000 340.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 99.308000 352.036000 106.988000 340.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.012000 352.036000 114.164000 340.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.212000 352.036000 121.940000 340.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 121.916000 352.036000 129.140000 340.036000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 129.100000 352.036000 132.904000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.000000 352.036000 136.804000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 136.900000 352.036000 140.704000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 140.800000 352.036000 144.604000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.700000 352.036000 148.504000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.600000 352.036000 152.404000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.500000 352.036000 156.304000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.400000 352.036000 160.204000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.300000 352.036000 164.104000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.200000 352.036000 168.004000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.100000 352.036000 171.904000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.000000 352.036000 175.804000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.900000 352.036000 179.704000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.800000 352.036000 183.604000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.700000 352.036000 187.504000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.600000 352.036000 191.404000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.500000 352.036000 195.304000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.400000 352.036000 199.204000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.300000 352.036000 203.104000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.200000 352.036000 207.004000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.100000 352.036000 210.904000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.000000 352.036000 214.804000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.900000 352.036000 218.704000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.800000 352.036000 222.604000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.700000 352.036000 226.504000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.600000 352.036000 230.404000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.500000 352.036000 234.304000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.400000 352.036000 238.204000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.300000 352.036000 242.104000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.200000 352.036000 246.004000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.100000 352.036000 249.904000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.000000 352.036000 253.804000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.900000 352.036000 257.704000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.800000 352.036000 261.604000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.700000 352.036000 265.504000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.600000 352.036000 269.404000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.500000 352.036000 273.304000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.400000 352.036000 277.204000 340.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 352.036000 284.332000 340.036000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 352.036000 291.928000 340.036000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 338.136000 86.528000 326.136000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 86.504000 338.136000 92.240000 326.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 92.204000 338.136000 96.032000 326.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 96.008000 338.136000 103.100000 326.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 103.112000 338.136000 110.840000 326.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.816000 338.136000 115.628000 326.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 115.616000 338.136000 122.768000 326.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 122.816000 338.136000 126.644000 326.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 126.620000 338.136000 130.424000 326.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.424000 338.136000 137.144000 326.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 137.120000 338.136000 144.272000 326.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 144.320000 338.136000 150.056000 326.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 150.020000 338.136000 157.700000 326.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 157.724000 338.136000 164.816000 326.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 164.828000 338.136000 169.640000 326.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 169.628000 338.136000 175.784000 326.136000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 175.800000 338.136000 179.604000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.700000 338.136000 183.504000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.600000 338.136000 187.404000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.500000 338.136000 191.304000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.400000 338.136000 195.204000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.300000 338.136000 199.104000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.200000 338.136000 203.004000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.100000 338.136000 206.904000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.000000 338.136000 210.804000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.900000 338.136000 214.704000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.800000 338.136000 218.604000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.700000 338.136000 222.504000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.600000 338.136000 226.404000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.500000 338.136000 230.304000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.400000 338.136000 234.204000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.300000 338.136000 238.104000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.200000 338.136000 242.004000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.100000 338.136000 245.904000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.000000 338.136000 249.804000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.900000 338.136000 253.704000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.800000 338.136000 257.604000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.700000 338.136000 261.504000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.600000 338.136000 265.404000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.500000 338.136000 269.304000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.400000 338.136000 273.204000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.300000 338.136000 277.104000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.200000 338.136000 281.004000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.100000 338.136000 284.904000 326.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 338.136000 292.032000 326.136000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 324.156000 85.712000 312.156000 1.000000 0.000000 0.000000 1.000000 P
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 310.136000 84.764000 298.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 84.200000 310.136000 91.352000 298.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 91.400000 310.136000 99.128000 298.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.104000 310.136000 106.328000 298.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 106.304000 310.136000 112.040000 298.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.004000 310.136000 119.156000 298.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 119.204000 310.136000 130.580000 298.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 130.604000 310.136000 137.756000 298.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.804000 310.136000 141.608000 298.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.608000 310.136000 151.868000 298.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 151.904000 310.136000 155.732000 298.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 155.708000 310.136000 163.436000 298.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 163.412000 310.136000 171.092000 298.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 171.116000 310.136000 178.340000 298.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 178.316000 310.136000 188.576000 298.136000 1.000000 0.000000 0.000000 1.000000 w
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 188.500000 310.136000 192.304000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.304000 310.136000 196.108000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.108000 310.136000 199.912000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.912000 310.136000 203.716000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.716000 310.136000 207.520000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.520000 310.136000 211.324000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.324000 310.136000 215.128000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.128000 310.136000 218.932000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.932000 310.136000 222.736000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.736000 310.136000 226.540000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.540000 310.136000 230.344000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.344000 310.136000 234.148000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.148000 310.136000 237.952000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.952000 310.136000 241.756000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.756000 310.136000 245.560000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.560000 310.136000 249.364000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.364000 310.136000 253.168000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.168000 310.136000 256.972000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.972000 310.136000 260.776000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.776000 310.136000 264.580000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.580000 310.136000 268.384000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.384000 310.136000 272.188000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.188000 310.136000 275.992000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.992000 310.136000 279.796000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.796000 310.136000 283.600000 298.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 310.136000 292.032000 298.136000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 296.236000 84.764000 284.236000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 84.200000 296.236000 91.352000 284.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 91.400000 296.236000 97.556000 284.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 97.604000 296.236000 102.416000 284.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.404000 296.236000 109.556000 284.236000 1.000000 0.000000 0.000000 1.000000 a
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 109.400000 296.236000 113.204000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 113.204000 296.236000 117.008000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 117.008000 296.236000 120.812000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 120.812000 296.236000 124.616000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 124.616000 296.236000 128.420000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 128.420000 296.236000 132.224000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.224000 296.236000 136.028000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 136.028000 296.236000 139.832000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 139.832000 296.236000 143.636000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 143.636000 296.236000 147.440000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 147.440000 296.236000 151.244000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 151.244000 296.236000 155.048000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 155.048000 296.236000 158.852000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.852000 296.236000 162.656000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.656000 296.236000 166.460000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 166.460000 296.236000 170.264000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 170.264000 296.236000 174.068000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 174.068000 296.236000 177.872000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.872000 296.236000 181.676000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.676000 296.236000 185.480000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.480000 296.236000 189.284000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 189.284000 296.236000 193.088000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 193.088000 296.236000 196.892000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.892000 296.236000 200.696000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.696000 296.236000 204.500000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.500000 296.236000 208.304000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 208.304000 296.236000 212.108000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 212.108000 296.236000 215.912000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.912000 296.236000 219.716000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.716000 296.236000 223.520000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.520000 296.236000 227.324000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.324000 296.236000 231.128000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.128000 296.236000 234.932000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.932000 296.236000 238.736000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.736000 296.236000 242.540000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.540000 296.236000 246.344000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.344000 296.236000 250.148000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.148000 296.236000 253.952000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.952000 296.236000 257.756000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.756000 296.236000 261.560000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.560000 296.236000 265.364000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.364000 296.236000 269.168000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.168000 296.236000 272.972000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.972000 296.236000 276.776000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.776000 296.236000 280.580000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.580000 296.236000 284.384000 284.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 296.236000 292.032000 284.236000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 282.336000 84.764000 270.336000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 84.800000 282.336000 93.980000 270.336000 1.000000 0.000000 0.000000 1.000000 C
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 93.900000 282.336000 97.704000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 97.704000 282.336000 101.508000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 101.508000 282.336000 105.312000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 105.312000 282.336000 109.116000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 109.116000 282.336000 112.920000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 112.920000 282.336000 116.724000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 116.724000 282.336000 120.528000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 120.528000 282.336000 124.332000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 124.332000 282.336000 128.136000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 128.136000 282.336000 131.940000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 131.940000 282.336000 135.744000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 135.744000 282.336000 139.548000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 139.548000 282.336000 143.352000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 143.352000 282.336000 147.156000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 147.156000 282.336000 150.960000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 150.960000 282.336000 154.764000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.764000 282.336000 158.568000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.568000 282.336000 162.372000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.372000 282.336000 166.176000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 166.176000 282.336000 169.980000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.980000 282.336000 173.784000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.784000 282.336000 177.588000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.588000 282.336000 181.392000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.392000 282.336000 185.196000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.196000 282.336000 189.000000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 189.000000 282.336000 192.804000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.804000 282.336000 196.608000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.608000 282.336000 200.412000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.412000 282.336000 204.216000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.216000 282.336000 208.020000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 208.020000 282.336000 211.824000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.824000 282.336000 215.628000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.628000 282.336000 219.432000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.432000 282.336000 223.236000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.236000 282.336000 227.040000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.040000 282.336000 230.844000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.844000 282.336000 234.648000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.648000 282.336000 238.452000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.452000 282.336000 242.256000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.256000 282.336000 246.060000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.060000 282.336000 249.864000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.864000 282.336000 253.668000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.668000 282.336000 257.472000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.472000 282.336000 261.276000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.276000 282.336000 265.080000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.080000 282.336000 268.884000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.884000 282.336000 272.688000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.688000 282.336000 276.492000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.492000 282.336000 280.296000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.296000 282.336000 284.100000 270.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 282.336000 292.032000 270.336000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 268.436000 84.764000 256.436000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 84.200000 268.436000 91.292000 256.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.304000 268.436000 98.456000 256.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 98.504000 268.436000 104.240000 256.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 104.204000 268.436000 110.360000 256.436000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 110.300000 268.436000 114.104000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 114.200000 268.436000 118.004000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 118.100000 268.436000 121.904000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 122.000000 268.436000 125.804000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 125.900000 268.436000 129.704000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 129.800000 268.436000 133.604000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.700000 268.436000 137.504000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.600000 268.436000 141.404000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.500000 268.436000 145.304000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.400000 268.436000 149.204000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.300000 268.436000 153.104000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.200000 268.436000 157.004000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.100000 268.436000 160.904000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.000000 268.436000 164.804000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.900000 268.436000 168.704000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.800000 268.436000 172.604000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.700000 268.436000 176.504000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.600000 268.436000 180.404000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.500000 268.436000 184.304000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.400000 268.436000 188.204000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.300000 268.436000 192.104000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.200000 268.436000 196.004000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.100000 268.436000 199.904000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.000000 268.436000 203.804000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.900000 268.436000 207.704000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.800000 268.436000 211.604000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.700000 268.436000 215.504000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.600000 268.436000 219.404000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.500000 268.436000 223.304000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.400000 268.436000 227.204000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.300000 268.436000 231.104000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.200000 268.436000 235.004000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 235.100000 268.436000 238.904000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 239.000000 268.436000 242.804000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.900000 268.436000 246.704000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.800000 268.436000 250.604000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.700000 268.436000 254.504000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.600000 268.436000 258.404000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.500000 268.436000 262.304000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.400000 268.436000 266.204000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.300000 268.436000 270.104000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.200000 268.436000 274.004000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 274.100000 268.436000 277.904000 256.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 268.436000 284.332000 256.436000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 268.436000 291.928000 256.436000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 254.536000 84.764000 242.536000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 84.800000 254.536000 88.628000 242.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.604000 254.536000 95.324000 242.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 95.300000 254.536000 102.560000 242.536000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 102.500000 254.536000 106.304000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 106.400000 254.536000 110.204000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 110.300000 254.536000 114.104000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 114.200000 254.536000 118.004000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 118.100000 254.536000 121.904000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 122.000000 254.536000 125.804000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 125.900000 254.536000 129.704000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 129.800000 254.536000 133.604000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.700000 254.536000 137.504000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.600000 254.536000 141.404000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.500000 254.536000 145.304000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.400000 254.536000 149.204000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.300000 254.536000 153.104000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.200000 254.536000 157.004000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.100000 254.536000 160.904000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.000000 254.536000 164.804000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.900000 254.536000 168.704000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.800000 254.536000 172.604000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.700000 254.536000 176.504000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.600000 254.536000 180.404000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.500000 254.536000 184.304000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.400000 254.536000 188.204000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.300000 254.536000 192.104000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.200000 254.536000 196.004000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.100000 254.536000 199.904000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.000000 254.536000 203.804000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.900000 254.536000 207.704000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.800000 254.536000 211.604000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.700000 254.536000 215.504000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.600000 254.536000 219.404000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.500000 254.536000 223.304000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.400000 254.536000 227.204000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.300000 254.536000 231.104000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.200000 254.536000 235.004000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 235.100000 254.536000 238.904000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 239.000000 254.536000 242.804000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.900000 254.536000 246.704000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.800000 254.536000 250.604000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.700000 254.536000 254.504000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.600000 254.536000 258.404000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.500000 254.536000 262.304000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.400000 254.536000 266.204000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.300000 254.536000 270.104000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.200000 254.536000 274.004000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 274.100000 254.536000 277.904000 242.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 254.536000 284.332000 242.536000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 254.536000 291.928000 242.536000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 240.636000 84.764000 228.636000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 84.800000 240.636000 88.628000 228.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.604000 240.636000 96.332000 228.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 96.308000 240.636000 103.400000 228.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 103.412000 240.636000 109.568000 228.636000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 109.500000 240.636000 113.304000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 113.400000 240.636000 117.204000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 117.300000 240.636000 121.104000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 121.200000 240.636000 125.004000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 125.100000 240.636000 128.904000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 129.000000 240.636000 132.804000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.900000 240.636000 136.704000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 136.800000 240.636000 140.604000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 140.700000 240.636000 144.504000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.600000 240.636000 148.404000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.500000 240.636000 152.304000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.400000 240.636000 156.204000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.300000 240.636000 160.104000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.200000 240.636000 164.004000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.100000 240.636000 167.904000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.000000 240.636000 171.804000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 171.900000 240.636000 175.704000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.800000 240.636000 179.604000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.700000 240.636000 183.504000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.600000 240.636000 187.404000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.500000 240.636000 191.304000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.400000 240.636000 195.204000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.300000 240.636000 199.104000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.200000 240.636000 203.004000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.100000 240.636000 206.904000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.000000 240.636000 210.804000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.900000 240.636000 214.704000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.800000 240.636000 218.604000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.700000 240.636000 222.504000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.600000 240.636000 226.404000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.500000 240.636000 230.304000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.400000 240.636000 234.204000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.300000 240.636000 238.104000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.200000 240.636000 242.004000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.100000 240.636000 245.904000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.000000 240.636000 249.804000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.900000 240.636000 253.704000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.800000 240.636000 257.604000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.700000 240.636000 261.504000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.600000 240.636000 265.404000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.500000 240.636000 269.304000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.400000 240.636000 273.204000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.300000 240.636000 277.104000 228.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 240.636000 284.332000 228.636000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 240.636000 291.928000 228.636000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 226.736000 84.764000 214.736000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 84.800000 226.736000 88.628000 214.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 88.604000 226.736000 92.432000 214.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.408000 226.736000 99.500000 214.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 99.512000 226.736000 105.248000 214.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 105.212000 226.736000 111.368000 214.736000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 111.300000 226.736000 115.104000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 115.104000 226.736000 118.908000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 118.908000 226.736000 122.712000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 122.712000 226.736000 126.516000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 126.516000 226.736000 130.320000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 130.320000 226.736000 134.124000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 134.124000 226.736000 137.928000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.928000 226.736000 141.732000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.732000 226.736000 145.536000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.536000 226.736000 149.340000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.340000 226.736000 153.144000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.144000 226.736000 156.948000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.948000 226.736000 160.752000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.752000 226.736000 164.556000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.556000 226.736000 168.360000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.360000 226.736000 172.164000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.164000 226.736000 175.968000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.968000 226.736000 179.772000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.772000 226.736000 183.576000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.576000 226.736000 187.380000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.380000 226.736000 191.184000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.184000 226.736000 194.988000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 194.988000 226.736000 198.792000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.792000 226.736000 202.596000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.596000 226.736000 206.400000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.400000 226.736000 210.204000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.204000 226.736000 214.008000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.008000 226.736000 217.812000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 217.812000 226.736000 221.616000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.616000 226.736000 225.420000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.420000 226.736000 229.224000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.224000 226.736000 233.028000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.028000 226.736000 236.832000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 236.832000 226.736000 240.636000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.636000 226.736000 244.440000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.440000 226.736000 248.244000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.244000 226.736000 252.048000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.048000 226.736000 255.852000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 255.852000 226.736000 259.656000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 259.656000 226.736000 263.460000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.460000 226.736000 267.264000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.264000 226.736000 271.068000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.068000 226.736000 274.872000 214.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 226.736000 284.332000 214.736000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 226.736000 291.928000 214.736000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 212.836000 84.764000 200.836000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 84.296000 212.836000 91.520000 200.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 91.496000 212.836000 98.588000 200.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.600000 212.836000 102.404000 200.836000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.404000 212.836000 106.208000 200.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.208000 212.836000 114.956000 200.836000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 115.004000 212.836000 122.684000 200.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.708000 212.836000 130.388000 200.836000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 130.412000 212.836000 137.564000 200.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.612000 212.836000 143.348000 200.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 143.312000 212.836000 147.116000 200.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 147.116000 212.836000 155.780000 200.836000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 155.816000 212.836000 159.644000 200.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 159.620000 212.836000 163.448000 200.836000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 163.424000 212.836000 170.516000 200.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 170.528000 212.836000 178.256000 200.836000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 178.232000 212.836000 182.036000 200.836000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 182.000000 212.836000 185.804000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.900000 212.836000 189.704000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 189.800000 212.836000 193.604000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 193.700000 212.836000 197.504000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 197.600000 212.836000 201.404000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 201.500000 212.836000 205.304000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 205.400000 212.836000 209.204000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 209.300000 212.836000 213.104000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 213.200000 212.836000 217.004000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 217.100000 212.836000 220.904000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.000000 212.836000 224.804000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 224.900000 212.836000 228.704000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 228.800000 212.836000 232.604000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 232.700000 212.836000 236.504000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 236.600000 212.836000 240.404000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.500000 212.836000 244.304000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.400000 212.836000 248.204000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.300000 212.836000 252.104000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.200000 212.836000 256.004000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.100000 212.836000 259.904000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.000000 212.836000 263.804000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.900000 212.836000 267.704000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.800000 212.836000 271.604000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.700000 212.836000 275.504000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.600000 212.836000 279.404000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.500000 212.836000 283.304000 200.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 212.836000 292.032000 200.836000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 198.936000 84.764000 186.936000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 84.296000 198.936000 91.520000 186.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 91.496000 198.936000 98.720000 186.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 98.696000 198.936000 102.524000 186.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 198.936000 106.304000 186.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.304000 198.936000 111.116000 186.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 111.104000 198.936000 118.256000 186.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 118.304000 198.936000 125.984000 186.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 126.008000 198.936000 129.836000 186.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 129.812000 198.936000 136.904000 186.936000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 136.900000 198.936000 140.704000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 140.800000 198.936000 144.604000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.700000 198.936000 148.504000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.600000 198.936000 152.404000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.500000 198.936000 156.304000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.400000 198.936000 160.204000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.300000 198.936000 164.104000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.200000 198.936000 168.004000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.100000 198.936000 171.904000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.000000 198.936000 175.804000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.900000 198.936000 179.704000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.800000 198.936000 183.604000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.700000 198.936000 187.504000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.600000 198.936000 191.404000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.500000 198.936000 195.304000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.400000 198.936000 199.204000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.300000 198.936000 203.104000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.200000 198.936000 207.004000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.100000 198.936000 210.904000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.000000 198.936000 214.804000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.900000 198.936000 218.704000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.800000 198.936000 222.604000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.700000 198.936000 226.504000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.600000 198.936000 230.404000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.500000 198.936000 234.304000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.400000 198.936000 238.204000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.300000 198.936000 242.104000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.200000 198.936000 246.004000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.100000 198.936000 249.904000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.000000 198.936000 253.804000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.900000 198.936000 257.704000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.800000 198.936000 261.604000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.700000 198.936000 265.504000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.600000 198.936000 269.404000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.500000 198.936000 273.304000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.400000 198.936000 277.204000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.300000 198.936000 281.104000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.200000 198.936000 285.004000 186.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 198.936000 292.032000 186.936000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 185.036000 84.764000 173.036000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 84.296000 185.036000 91.520000 173.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 91.496000 185.036000 97.232000 173.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.196000 185.036000 103.916000 173.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.892000 185.036000 110.984000 173.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 110.996000 185.036000 114.824000 173.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.800000 185.036000 121.952000 173.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 122.000000 185.036000 125.828000 173.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.804000 185.036000 133.532000 173.036000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 133.500000 185.036000 137.304000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.400000 185.036000 141.204000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.300000 185.036000 145.104000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.200000 185.036000 149.004000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.100000 185.036000 152.904000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.000000 185.036000 156.804000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.900000 185.036000 160.704000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.800000 185.036000 164.604000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.700000 185.036000 168.504000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.600000 185.036000 172.404000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.500000 185.036000 176.304000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.400000 185.036000 180.204000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.300000 185.036000 184.104000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.200000 185.036000 188.004000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.100000 185.036000 191.904000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.000000 185.036000 195.804000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.900000 185.036000 199.704000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.800000 185.036000 203.604000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.700000 185.036000 207.504000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.600000 185.036000 211.404000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.500000 185.036000 215.304000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.400000 185.036000 219.204000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.300000 185.036000 223.104000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.200000 185.036000 227.004000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.100000 185.036000 230.904000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.000000 185.036000 234.804000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.900000 185.036000 238.704000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.800000 185.036000 242.604000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.700000 185.036000 246.504000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.600000 185.036000 250.404000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.500000 185.036000 254.304000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.400000 185.036000 258.204000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.300000 185.036000 262.104000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.200000 185.036000 266.004000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.100000 185.036000 269.904000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.000000 185.036000 273.804000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.900000 185.036000 277.704000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.800000 185.036000 281.604000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.700000 185.036000 285.504000 173.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 185.036000 292.032000 173.036000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 171.136000 84.764000 159.136000 1.000000 0.000000 0.000000 1.000000 P
+drawChar 84.296000 171.136000 91.520000 159.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 91.496000 171.136000 96.308000 159.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 96.296000 171.136000 103.448000 159.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.496000 171.136000 108.308000 159.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 108.296000 171.136000 115.520000 159.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 115.496000 171.136000 122.588000 159.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 122.600000 171.136000 128.756000 159.136000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 128.700000 171.136000 132.504000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.600000 171.136000 136.404000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 136.500000 171.136000 140.304000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 140.400000 171.136000 144.204000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.300000 171.136000 148.104000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.200000 171.136000 152.004000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.100000 171.136000 155.904000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.000000 171.136000 159.804000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 159.900000 171.136000 163.704000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 163.800000 171.136000 167.604000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 167.700000 171.136000 171.504000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 171.600000 171.136000 175.404000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.500000 171.136000 179.304000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.400000 171.136000 183.204000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.300000 171.136000 187.104000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.200000 171.136000 191.004000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.100000 171.136000 194.904000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.000000 171.136000 198.804000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.900000 171.136000 202.704000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.800000 171.136000 206.604000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.700000 171.136000 210.504000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.600000 171.136000 214.404000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.500000 171.136000 218.304000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.400000 171.136000 222.204000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.300000 171.136000 226.104000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.200000 171.136000 230.004000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.100000 171.136000 233.904000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.000000 171.136000 237.804000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.900000 171.136000 241.704000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.800000 171.136000 245.604000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.700000 171.136000 249.504000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.600000 171.136000 253.404000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.500000 171.136000 257.304000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.400000 171.136000 261.204000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.300000 171.136000 265.104000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.200000 171.136000 269.004000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.100000 171.136000 272.904000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.000000 171.136000 276.804000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.900000 171.136000 280.704000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.800000 171.136000 284.604000 159.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 171.136000 292.032000 159.136000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 157.156000 87.152000 145.156000 1.000000 0.000000 0.000000 1.000000 Q
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 143.136000 86.528000 131.136000 1.000000 0.000000 0.000000 1.000000 Q
+drawChar 86.504000 143.136000 94.232000 131.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 94.208000 143.136000 101.360000 131.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 101.408000 143.136000 107.144000 131.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 107.108000 143.136000 111.920000 131.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 111.908000 143.136000 118.220000 131.136000 1.000000 0.000000 0.000000 1.000000 z
+drawChar 118.208000 143.136000 122.012000 131.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.012000 143.136000 128.732000 131.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 128.708000 143.136000 132.536000 131.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 132.512000 143.136000 139.736000 131.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 139.712000 143.136000 146.432000 131.136000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 146.408000 143.136000 153.668000 131.136000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.800000 143.136000 157.604000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.604000 143.136000 161.408000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.408000 143.136000 165.212000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.212000 143.136000 169.016000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.016000 143.136000 172.820000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.820000 143.136000 176.624000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.624000 143.136000 180.428000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.428000 143.136000 184.232000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.232000 143.136000 188.036000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.036000 143.136000 191.840000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.840000 143.136000 195.644000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.644000 143.136000 199.448000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.448000 143.136000 203.252000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.252000 143.136000 207.056000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.056000 143.136000 210.860000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.860000 143.136000 214.664000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.664000 143.136000 218.468000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.468000 143.136000 222.272000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.272000 143.136000 226.076000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.076000 143.136000 229.880000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.880000 143.136000 233.684000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.684000 143.136000 237.488000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.488000 143.136000 241.292000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.292000 143.136000 245.096000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.096000 143.136000 248.900000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.900000 143.136000 252.704000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.704000 143.136000 256.508000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.508000 143.136000 260.312000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.312000 143.136000 264.116000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.116000 143.136000 267.920000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.920000 143.136000 271.724000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.724000 143.136000 275.528000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.528000 143.136000 279.332000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.332000 143.136000 283.136000 131.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 143.136000 292.032000 131.136000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 129.236000 86.528000 117.236000 1.000000 0.000000 0.000000 1.000000 Q
+drawChar 86.504000 129.236000 94.232000 117.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 94.208000 129.236000 101.300000 117.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 101.312000 129.236000 108.404000 117.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.416000 129.236000 116.144000 117.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 116.120000 129.236000 120.164000 117.236000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 120.224000 129.236000 126.380000 117.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.428000 129.236000 130.256000 117.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 130.232000 129.236000 136.544000 117.236000 1.000000 0.000000 0.000000 1.000000 z
+drawChar 136.532000 129.236000 143.624000 117.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 143.636000 129.236000 147.440000 117.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 147.440000 129.236000 155.120000 117.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 155.144000 129.236000 162.236000 117.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 162.248000 129.236000 169.928000 117.236000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 169.900000 129.236000 173.704000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.704000 129.236000 177.508000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.508000 129.236000 181.312000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.312000 129.236000 185.116000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.116000 129.236000 188.920000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.920000 129.236000 192.724000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.724000 129.236000 196.528000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.528000 129.236000 200.332000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.332000 129.236000 204.136000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.136000 129.236000 207.940000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.940000 129.236000 211.744000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.744000 129.236000 215.548000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.548000 129.236000 219.352000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.352000 129.236000 223.156000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.156000 129.236000 226.960000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.960000 129.236000 230.764000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.764000 129.236000 234.568000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.568000 129.236000 238.372000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.372000 129.236000 242.176000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.176000 129.236000 245.980000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.980000 129.236000 249.784000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.784000 129.236000 253.588000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.588000 129.236000 257.392000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.392000 129.236000 261.196000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.196000 129.236000 265.000000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.000000 129.236000 268.804000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.804000 129.236000 272.608000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.608000 129.236000 276.412000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.412000 129.236000 280.216000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.216000 129.236000 284.020000 117.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 129.236000 292.032000 117.236000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 320.300000 672.856000 330.272000 660.856000 1.000000 0.000000 0.000000 1.000000 R
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 658.836000 329.324000 646.836000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 329.600000 658.836000 336.752000 646.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 336.800000 658.836000 344.480000 646.836000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 344.504000 658.836000 348.332000 646.836000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 348.308000 658.836000 354.464000 646.836000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 354.512000 658.836000 362.240000 646.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 362.216000 658.836000 369.308000 646.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 369.320000 658.836000 375.476000 646.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 375.300000 658.836000 379.104000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.104000 658.836000 382.908000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.908000 658.836000 386.712000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.712000 658.836000 390.516000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.516000 658.836000 394.320000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.320000 658.836000 398.124000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.124000 658.836000 401.928000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.928000 658.836000 405.732000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.732000 658.836000 409.536000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.536000 658.836000 413.340000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.340000 658.836000 417.144000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.144000 658.836000 420.948000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.948000 658.836000 424.752000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.752000 658.836000 428.556000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.556000 658.836000 432.360000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.360000 658.836000 436.164000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.164000 658.836000 439.968000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.968000 658.836000 443.772000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.772000 658.836000 447.576000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.576000 658.836000 451.380000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.380000 658.836000 455.184000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.184000 658.836000 458.988000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.988000 658.836000 462.792000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.792000 658.836000 466.596000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.596000 658.836000 470.400000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.400000 658.836000 474.204000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.204000 658.836000 478.008000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.008000 658.836000 481.812000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.812000 658.836000 485.616000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.616000 658.836000 489.420000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.420000 658.836000 493.224000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.224000 658.836000 497.028000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.028000 658.836000 500.832000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.832000 658.836000 504.636000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.636000 658.836000 508.440000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.440000 658.836000 512.244000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.244000 658.836000 516.048000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.048000 658.836000 519.852000 646.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 658.836000 527.932000 646.836000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 658.836000 535.528000 646.836000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 644.936000 329.324000 632.936000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 329.600000 644.936000 336.752000 632.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 336.800000 644.936000 344.060000 632.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 344.096000 644.936000 351.188000 632.936000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 351.000000 644.936000 354.804000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 354.804000 644.936000 358.608000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.608000 644.936000 362.412000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.412000 644.936000 366.216000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.216000 644.936000 370.020000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.020000 644.936000 373.824000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 373.824000 644.936000 377.628000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.628000 644.936000 381.432000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.432000 644.936000 385.236000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.236000 644.936000 389.040000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.040000 644.936000 392.844000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.844000 644.936000 396.648000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.648000 644.936000 400.452000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.452000 644.936000 404.256000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.256000 644.936000 408.060000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.060000 644.936000 411.864000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.864000 644.936000 415.668000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.668000 644.936000 419.472000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.472000 644.936000 423.276000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.276000 644.936000 427.080000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.080000 644.936000 430.884000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.884000 644.936000 434.688000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.688000 644.936000 438.492000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.492000 644.936000 442.296000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.296000 644.936000 446.100000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.100000 644.936000 449.904000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.904000 644.936000 453.708000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.708000 644.936000 457.512000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.512000 644.936000 461.316000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.316000 644.936000 465.120000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.120000 644.936000 468.924000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.924000 644.936000 472.728000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.728000 644.936000 476.532000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.532000 644.936000 480.336000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.336000 644.936000 484.140000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.140000 644.936000 487.944000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 487.944000 644.936000 491.748000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 491.748000 644.936000 495.552000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.552000 644.936000 499.356000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.356000 644.936000 503.160000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.160000 644.936000 506.964000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.964000 644.936000 510.768000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 510.768000 644.936000 514.572000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.572000 644.936000 518.376000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 644.936000 527.932000 632.936000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 644.936000 535.528000 632.936000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 631.036000 329.324000 619.036000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 329.300000 631.036000 337.028000 619.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 337.004000 631.036000 344.228000 619.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 344.204000 631.036000 351.884000 619.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 351.908000 631.036000 359.132000 619.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 359.108000 631.036000 366.788000 619.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 366.812000 631.036000 373.904000 619.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 373.916000 631.036000 381.644000 619.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 381.620000 631.036000 389.300000 619.036000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 389.324000 631.036000 395.060000 619.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.024000 631.036000 402.248000 619.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 402.224000 631.036000 409.952000 619.036000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 409.928000 631.036000 416.084000 619.036000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 416.100000 631.036000 419.904000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.000000 631.036000 423.804000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.900000 631.036000 427.704000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.800000 631.036000 431.604000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.700000 631.036000 435.504000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.600000 631.036000 439.404000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.500000 631.036000 443.304000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.400000 631.036000 447.204000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.300000 631.036000 451.104000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.200000 631.036000 455.004000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.100000 631.036000 458.904000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.000000 631.036000 462.804000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.900000 631.036000 466.704000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.800000 631.036000 470.604000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.700000 631.036000 474.504000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.600000 631.036000 478.404000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.500000 631.036000 482.304000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.400000 631.036000 486.204000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.300000 631.036000 490.104000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.200000 631.036000 494.004000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.100000 631.036000 497.904000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.000000 631.036000 501.804000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.900000 631.036000 505.704000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.800000 631.036000 509.604000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.700000 631.036000 513.504000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.600000 631.036000 517.404000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.500000 631.036000 521.304000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 631.036000 527.932000 619.036000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 631.036000 535.528000 619.036000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 617.136000 329.324000 605.136000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 329.300000 617.136000 337.028000 605.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 337.004000 617.136000 344.732000 605.136000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 344.708000 617.136000 352.388000 605.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 352.412000 617.136000 359.564000 605.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 359.612000 617.136000 365.348000 605.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 365.312000 617.136000 372.992000 605.136000 1.000000 0.000000 0.000000 1.000000 b
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 372.900000 617.136000 376.704000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 376.800000 617.136000 380.604000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.700000 617.136000 384.504000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.600000 617.136000 388.404000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.500000 617.136000 392.304000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.400000 617.136000 396.204000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.300000 617.136000 400.104000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.200000 617.136000 404.004000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.100000 617.136000 407.904000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.000000 617.136000 411.804000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.900000 617.136000 415.704000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.800000 617.136000 419.604000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.700000 617.136000 423.504000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.600000 617.136000 427.404000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.500000 617.136000 431.304000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.400000 617.136000 435.204000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.300000 617.136000 439.104000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.200000 617.136000 443.004000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.100000 617.136000 446.904000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.000000 617.136000 450.804000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.900000 617.136000 454.704000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.800000 617.136000 458.604000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.700000 617.136000 462.504000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.600000 617.136000 466.404000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.500000 617.136000 470.304000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.400000 617.136000 474.204000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.300000 617.136000 478.104000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.200000 617.136000 482.004000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.100000 617.136000 485.904000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.000000 617.136000 489.804000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.900000 617.136000 493.704000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.800000 617.136000 497.604000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.700000 617.136000 501.504000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.600000 617.136000 505.404000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.500000 617.136000 509.304000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.400000 617.136000 513.204000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.300000 617.136000 517.104000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.200000 617.136000 521.004000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 617.136000 527.932000 605.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 617.136000 535.528000 605.136000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 603.236000 329.324000 591.236000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 329.300000 603.236000 336.524000 591.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 336.500000 603.236000 340.328000 591.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 340.304000 603.236000 344.132000 591.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 344.108000 603.236000 351.200000 591.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 351.212000 603.236000 356.948000 591.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 356.912000 603.236000 360.956000 591.236000 1.000000 0.000000 0.000000 1.000000 -
+drawChar 361.016000 603.236000 368.696000 591.236000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 368.720000 603.236000 372.548000 591.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 372.524000 603.236000 379.676000 591.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 379.724000 603.236000 387.404000 591.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 387.428000 603.236000 391.256000 591.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 391.232000 603.236000 398.960000 591.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 398.936000 603.236000 406.616000 591.236000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 406.600000 603.236000 410.404000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.500000 603.236000 414.304000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.400000 603.236000 418.204000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.300000 603.236000 422.104000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.200000 603.236000 426.004000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.100000 603.236000 429.904000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.000000 603.236000 433.804000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.900000 603.236000 437.704000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.800000 603.236000 441.604000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.700000 603.236000 445.504000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.600000 603.236000 449.404000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.500000 603.236000 453.304000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.400000 603.236000 457.204000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.300000 603.236000 461.104000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.200000 603.236000 465.004000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.100000 603.236000 468.904000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.000000 603.236000 472.804000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.900000 603.236000 476.704000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.800000 603.236000 480.604000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.700000 603.236000 484.504000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.600000 603.236000 488.404000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.500000 603.236000 492.304000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.400000 603.236000 496.204000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.300000 603.236000 500.104000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.200000 603.236000 504.004000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.100000 603.236000 507.904000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.000000 603.236000 511.804000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.900000 603.236000 515.704000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.800000 603.236000 519.604000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 603.236000 527.932000 591.236000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 603.236000 535.528000 591.236000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 589.336000 329.324000 577.336000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 329.300000 589.336000 336.524000 577.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 336.500000 589.336000 343.724000 577.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 343.700000 589.336000 355.076000 577.336000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 355.100000 589.336000 358.904000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.904000 589.336000 362.708000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.708000 589.336000 366.512000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.512000 589.336000 370.316000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.316000 589.336000 374.120000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.120000 589.336000 377.924000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.924000 589.336000 381.728000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.728000 589.336000 385.532000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.532000 589.336000 389.336000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.336000 589.336000 393.140000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.140000 589.336000 396.944000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.944000 589.336000 400.748000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.748000 589.336000 404.552000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.552000 589.336000 408.356000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.356000 589.336000 412.160000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.160000 589.336000 415.964000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.964000 589.336000 419.768000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.768000 589.336000 423.572000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.572000 589.336000 427.376000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.376000 589.336000 431.180000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.180000 589.336000 434.984000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.984000 589.336000 438.788000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.788000 589.336000 442.592000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.592000 589.336000 446.396000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.396000 589.336000 450.200000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.200000 589.336000 454.004000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.004000 589.336000 457.808000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.808000 589.336000 461.612000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.612000 589.336000 465.416000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.416000 589.336000 469.220000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.220000 589.336000 473.024000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.024000 589.336000 476.828000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.828000 589.336000 480.632000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.632000 589.336000 484.436000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.436000 589.336000 488.240000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.240000 589.336000 492.044000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.044000 589.336000 495.848000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.848000 589.336000 499.652000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.652000 589.336000 503.456000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.456000 589.336000 507.260000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.260000 589.336000 511.064000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.064000 589.336000 514.868000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.868000 589.336000 518.672000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 518.672000 589.336000 522.476000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 522.476000 589.336000 526.280000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 589.336000 535.632000 577.336000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 575.436000 329.324000 563.436000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 329.300000 575.436000 336.524000 563.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 336.500000 575.436000 342.656000 563.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 342.704000 575.436000 349.796000 563.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 349.808000 575.436000 361.184000 563.436000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 361.208000 575.436000 368.360000 563.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 368.408000 575.436000 374.144000 563.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 374.108000 575.436000 380.876000 563.436000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 380.800000 575.436000 384.604000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.700000 575.436000 388.504000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.600000 575.436000 392.404000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.500000 575.436000 396.304000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.400000 575.436000 400.204000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.300000 575.436000 404.104000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.200000 575.436000 408.004000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.100000 575.436000 411.904000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.000000 575.436000 415.804000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.900000 575.436000 419.704000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.800000 575.436000 423.604000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.700000 575.436000 427.504000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.600000 575.436000 431.404000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.500000 575.436000 435.304000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.400000 575.436000 439.204000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.300000 575.436000 443.104000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.200000 575.436000 447.004000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.100000 575.436000 450.904000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.000000 575.436000 454.804000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.900000 575.436000 458.704000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.800000 575.436000 462.604000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.700000 575.436000 466.504000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.600000 575.436000 470.404000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.500000 575.436000 474.304000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.400000 575.436000 478.204000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.300000 575.436000 482.104000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.200000 575.436000 486.004000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.100000 575.436000 489.904000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.000000 575.436000 493.804000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.900000 575.436000 497.704000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.800000 575.436000 501.604000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.700000 575.436000 505.504000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.600000 575.436000 509.404000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.500000 575.436000 513.304000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.400000 575.436000 517.204000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.300000 575.436000 521.104000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 575.436000 527.932000 563.436000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 575.436000 535.528000 563.436000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 320.300000 561.456000 328.964000 549.456000 1.000000 0.000000 0.000000 1.000000 S
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 547.436000 328.520000 535.436000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 547.436000 335.648000 535.436000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 335.696000 547.436000 345.956000 535.436000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 345.992000 547.436000 352.148000 535.436000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 352.000000 547.436000 355.804000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 355.804000 547.436000 359.608000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 359.608000 547.436000 363.412000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 363.412000 547.436000 367.216000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.216000 547.436000 371.020000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.020000 547.436000 374.824000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.824000 547.436000 378.628000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.628000 547.436000 382.432000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.432000 547.436000 386.236000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.236000 547.436000 390.040000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.040000 547.436000 393.844000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.844000 547.436000 397.648000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.648000 547.436000 401.452000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.452000 547.436000 405.256000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.256000 547.436000 409.060000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.060000 547.436000 412.864000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.864000 547.436000 416.668000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.668000 547.436000 420.472000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.472000 547.436000 424.276000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.276000 547.436000 428.080000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.080000 547.436000 431.884000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.884000 547.436000 435.688000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.688000 547.436000 439.492000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.492000 547.436000 443.296000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.296000 547.436000 447.100000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.100000 547.436000 450.904000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.904000 547.436000 454.708000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.708000 547.436000 458.512000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.512000 547.436000 462.316000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.316000 547.436000 466.120000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.120000 547.436000 469.924000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.924000 547.436000 473.728000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.728000 547.436000 477.532000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.532000 547.436000 481.336000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.336000 547.436000 485.140000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.140000 547.436000 488.944000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.944000 547.436000 492.748000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.748000 547.436000 496.552000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.552000 547.436000 500.356000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.356000 547.436000 504.160000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.160000 547.436000 507.964000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.964000 547.436000 511.768000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.768000 547.436000 515.572000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.572000 547.436000 519.376000 535.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 547.436000 527.932000 535.436000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 547.436000 535.528000 535.436000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 533.536000 328.520000 521.536000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 533.536000 335.216000 521.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 335.192000 533.536000 340.928000 521.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 340.892000 533.536000 347.984000 521.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 347.996000 533.536000 358.256000 521.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 358.292000 533.536000 365.972000 521.536000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 365.996000 533.536000 371.732000 521.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 371.696000 533.536000 375.524000 521.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 375.500000 533.536000 382.268000 521.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 382.304000 533.536000 389.396000 521.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 389.408000 533.536000 395.144000 521.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.108000 533.536000 401.264000 521.536000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 401.300000 533.536000 405.104000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.104000 533.536000 408.908000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.908000 533.536000 412.712000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.712000 533.536000 416.516000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.516000 533.536000 420.320000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.320000 533.536000 424.124000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.124000 533.536000 427.928000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.928000 533.536000 431.732000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.732000 533.536000 435.536000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.536000 533.536000 439.340000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.340000 533.536000 443.144000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.144000 533.536000 446.948000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.948000 533.536000 450.752000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.752000 533.536000 454.556000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.556000 533.536000 458.360000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.360000 533.536000 462.164000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.164000 533.536000 465.968000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.968000 533.536000 469.772000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.772000 533.536000 473.576000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.576000 533.536000 477.380000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.380000 533.536000 481.184000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.184000 533.536000 484.988000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.988000 533.536000 488.792000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.792000 533.536000 492.596000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.596000 533.536000 496.400000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.400000 533.536000 500.204000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.204000 533.536000 504.008000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.008000 533.536000 507.812000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.812000 533.536000 511.616000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.616000 533.536000 515.420000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.420000 533.536000 519.224000 521.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 533.536000 527.932000 521.536000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 533.536000 535.528000 521.536000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 519.636000 328.520000 507.636000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 519.636000 335.216000 507.636000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 335.192000 519.636000 340.928000 507.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 340.892000 519.636000 347.984000 507.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 347.996000 519.636000 358.256000 507.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 358.292000 519.636000 364.448000 507.636000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 364.400000 519.636000 368.204000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 368.204000 519.636000 372.008000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 372.008000 519.636000 375.812000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.812000 519.636000 379.616000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.616000 519.636000 383.420000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.420000 519.636000 387.224000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.224000 519.636000 391.028000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 391.028000 519.636000 394.832000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.832000 519.636000 398.636000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.636000 519.636000 402.440000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.440000 519.636000 406.244000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.244000 519.636000 410.048000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.048000 519.636000 413.852000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.852000 519.636000 417.656000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.656000 519.636000 421.460000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.460000 519.636000 425.264000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.264000 519.636000 429.068000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 429.068000 519.636000 432.872000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.872000 519.636000 436.676000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.676000 519.636000 440.480000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.480000 519.636000 444.284000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.284000 519.636000 448.088000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 448.088000 519.636000 451.892000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.892000 519.636000 455.696000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.696000 519.636000 459.500000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.500000 519.636000 463.304000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.304000 519.636000 467.108000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.108000 519.636000 470.912000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.912000 519.636000 474.716000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.716000 519.636000 478.520000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.520000 519.636000 482.324000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.324000 519.636000 486.128000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.128000 519.636000 489.932000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.932000 519.636000 493.736000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.736000 519.636000 497.540000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.540000 519.636000 501.344000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.344000 519.636000 505.148000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.148000 519.636000 508.952000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.952000 519.636000 512.756000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.756000 519.636000 516.560000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.560000 519.636000 520.364000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 519.636000 527.932000 507.636000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 519.636000 535.528000 507.636000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 505.736000 328.520000 493.736000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 505.736000 335.588000 493.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 335.600000 505.736000 342.692000 493.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 342.704000 505.736000 350.384000 493.736000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 350.408000 505.736000 354.236000 493.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 354.212000 505.736000 358.040000 493.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 358.016000 505.736000 365.744000 493.736000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 365.720000 505.736000 373.400000 493.736000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 373.424000 505.736000 379.580000 493.736000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 379.500000 505.736000 383.304000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.304000 505.736000 387.108000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.108000 505.736000 390.912000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.912000 505.736000 394.716000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.716000 505.736000 398.520000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.520000 505.736000 402.324000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.324000 505.736000 406.128000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.128000 505.736000 409.932000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.932000 505.736000 413.736000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.736000 505.736000 417.540000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.540000 505.736000 421.344000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.344000 505.736000 425.148000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.148000 505.736000 428.952000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.952000 505.736000 432.756000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.756000 505.736000 436.560000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.560000 505.736000 440.364000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.364000 505.736000 444.168000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.168000 505.736000 447.972000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.972000 505.736000 451.776000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.776000 505.736000 455.580000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.580000 505.736000 459.384000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.384000 505.736000 463.188000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.188000 505.736000 466.992000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.992000 505.736000 470.796000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.796000 505.736000 474.600000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.600000 505.736000 478.404000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.404000 505.736000 482.208000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.208000 505.736000 486.012000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.012000 505.736000 489.816000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.816000 505.736000 493.620000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.620000 505.736000 497.424000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.424000 505.736000 501.228000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.228000 505.736000 505.032000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.032000 505.736000 508.836000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.836000 505.736000 512.640000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.640000 505.736000 516.444000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.444000 505.736000 520.248000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 505.736000 527.932000 493.736000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 505.736000 535.528000 493.736000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 491.836000 328.520000 479.836000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 491.836000 336.224000 479.836000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 336.200000 491.836000 343.352000 479.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 343.400000 491.836000 350.660000 479.836000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 350.696000 491.836000 357.788000 479.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 357.800000 491.836000 363.536000 479.836000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 363.400000 491.836000 367.204000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.204000 491.836000 371.008000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.008000 491.836000 374.812000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.812000 491.836000 378.616000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.616000 491.836000 382.420000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.420000 491.836000 386.224000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.224000 491.836000 390.028000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.028000 491.836000 393.832000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.832000 491.836000 397.636000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.636000 491.836000 401.440000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.440000 491.836000 405.244000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.244000 491.836000 409.048000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.048000 491.836000 412.852000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.852000 491.836000 416.656000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.656000 491.836000 420.460000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.460000 491.836000 424.264000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.264000 491.836000 428.068000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.068000 491.836000 431.872000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.872000 491.836000 435.676000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.676000 491.836000 439.480000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.480000 491.836000 443.284000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.284000 491.836000 447.088000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.088000 491.836000 450.892000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.892000 491.836000 454.696000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.696000 491.836000 458.500000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.500000 491.836000 462.304000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.304000 491.836000 466.108000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.108000 491.836000 469.912000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.912000 491.836000 473.716000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.716000 491.836000 477.520000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.520000 491.836000 481.324000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.324000 491.836000 485.128000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.128000 491.836000 488.932000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.932000 491.836000 492.736000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.736000 491.836000 496.540000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.540000 491.836000 500.344000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.344000 491.836000 504.148000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.148000 491.836000 507.952000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.952000 491.836000 511.756000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.756000 491.836000 515.560000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.560000 491.836000 519.364000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.364000 491.836000 523.168000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.168000 491.836000 526.972000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 491.836000 535.632000 479.836000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 477.936000 328.520000 465.936000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 477.936000 336.224000 465.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 336.200000 477.936000 343.352000 465.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 343.400000 477.936000 350.660000 465.936000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 350.696000 477.936000 357.788000 465.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 357.800000 477.936000 363.956000 465.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 364.004000 477.936000 371.684000 465.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 371.708000 477.936000 378.800000 465.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 378.812000 477.936000 385.964000 465.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 386.012000 477.936000 391.748000 465.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 391.712000 477.936000 398.804000 465.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 398.816000 477.936000 402.620000 465.936000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 402.620000 477.936000 406.424000 465.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 406.424000 477.936000 418.748000 465.936000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 418.520000 477.936000 422.348000 465.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 422.324000 477.936000 426.152000 465.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 426.128000 477.936000 429.956000 465.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 429.932000 477.936000 433.760000 465.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 433.736000 477.936000 440.888000 465.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 440.936000 477.936000 452.312000 465.936000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 452.200000 477.936000 456.004000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 456.196000 477.936000 460.000000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 460.192000 477.936000 463.996000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 464.188000 477.936000 467.992000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 468.184000 477.936000 471.988000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.180000 477.936000 475.984000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.176000 477.936000 479.980000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.172000 477.936000 483.976000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.168000 477.936000 487.972000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.164000 477.936000 491.968000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.160000 477.936000 495.964000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.156000 477.936000 499.960000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.152000 477.936000 503.956000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.148000 477.936000 507.952000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.144000 477.936000 511.948000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.140000 477.936000 515.944000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.136000 477.936000 519.940000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.132000 477.936000 523.936000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.128000 477.936000 527.932000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 477.936000 535.632000 465.936000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 464.036000 328.520000 452.036000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 464.036000 336.224000 452.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 336.200000 464.036000 343.352000 452.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 343.400000 464.036000 354.776000 452.036000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 354.800000 464.036000 362.480000 452.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 362.504000 464.036000 369.728000 452.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 369.704000 464.036000 376.928000 452.036000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 376.800000 464.036000 380.604000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.700000 464.036000 384.504000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.600000 464.036000 388.404000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.500000 464.036000 392.304000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.400000 464.036000 396.204000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.300000 464.036000 400.104000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.200000 464.036000 404.004000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.100000 464.036000 407.904000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.000000 464.036000 411.804000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.900000 464.036000 415.704000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.800000 464.036000 419.604000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.700000 464.036000 423.504000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.600000 464.036000 427.404000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.500000 464.036000 431.304000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.400000 464.036000 435.204000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.300000 464.036000 439.104000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.200000 464.036000 443.004000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.100000 464.036000 446.904000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.000000 464.036000 450.804000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.900000 464.036000 454.704000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.800000 464.036000 458.604000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.700000 464.036000 462.504000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.600000 464.036000 466.404000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.500000 464.036000 470.304000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.400000 464.036000 474.204000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.300000 464.036000 478.104000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.200000 464.036000 482.004000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.100000 464.036000 485.904000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.000000 464.036000 489.804000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.900000 464.036000 493.704000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.800000 464.036000 497.604000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.700000 464.036000 501.504000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.600000 464.036000 505.404000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.500000 464.036000 509.304000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.400000 464.036000 513.204000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.300000 464.036000 517.104000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.200000 464.036000 521.004000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.100000 464.036000 524.904000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 525.000000 464.036000 528.804000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 464.036000 535.632000 452.036000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 450.136000 328.520000 438.136000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 450.136000 336.224000 438.136000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 336.200000 450.136000 343.292000 438.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 343.304000 450.136000 350.396000 438.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 350.408000 450.136000 355.220000 438.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 355.208000 450.136000 361.364000 438.136000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 361.300000 450.136000 365.104000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.200000 450.136000 369.004000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 369.100000 450.136000 372.904000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 373.000000 450.136000 376.804000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 376.900000 450.136000 380.704000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.800000 450.136000 384.604000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.700000 450.136000 388.504000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.600000 450.136000 392.404000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.500000 450.136000 396.304000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.400000 450.136000 400.204000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.300000 450.136000 404.104000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.200000 450.136000 408.004000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.100000 450.136000 411.904000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.000000 450.136000 415.804000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.900000 450.136000 419.704000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.800000 450.136000 423.604000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.700000 450.136000 427.504000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.600000 450.136000 431.404000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.500000 450.136000 435.304000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.400000 450.136000 439.204000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.300000 450.136000 443.104000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.200000 450.136000 447.004000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.100000 450.136000 450.904000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.000000 450.136000 454.804000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.900000 450.136000 458.704000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.800000 450.136000 462.604000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.700000 450.136000 466.504000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.600000 450.136000 470.404000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.500000 450.136000 474.304000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.400000 450.136000 478.204000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.300000 450.136000 482.104000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.200000 450.136000 486.004000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.100000 450.136000 489.904000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.000000 450.136000 493.804000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.900000 450.136000 497.704000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.800000 450.136000 501.604000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.700000 450.136000 505.504000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.600000 450.136000 509.404000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.500000 450.136000 513.304000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.400000 450.136000 517.204000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.300000 450.136000 521.104000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.200000 450.136000 525.004000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 525.100000 450.136000 528.904000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 529.000000 450.136000 532.804000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 532.900000 450.136000 536.704000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 334.400000 436.236000 342.716000 424.236000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 342.704000 436.236000 346.532000 424.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 346.508000 436.236000 353.660000 424.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 353.708000 436.236000 361.436000 424.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 361.412000 436.236000 369.140000 424.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 369.116000 436.236000 376.208000 424.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 376.220000 436.236000 380.048000 424.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 380.024000 436.236000 383.828000 424.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 383.828000 436.236000 392.048000 424.236000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 392.024000 436.236000 399.752000 424.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 399.728000 436.236000 406.820000 424.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 406.832000 436.236000 413.924000 424.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 413.936000 436.236000 418.748000 424.236000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 418.736000 436.236000 424.892000 424.236000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 425.000000 436.236000 428.804000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.804000 436.236000 432.608000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.608000 436.236000 436.412000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.412000 436.236000 440.216000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.216000 436.236000 444.020000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.020000 436.236000 447.824000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.824000 436.236000 451.628000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.628000 436.236000 455.432000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.432000 436.236000 459.236000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.236000 436.236000 463.040000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.040000 436.236000 466.844000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.844000 436.236000 470.648000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.648000 436.236000 474.452000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.452000 436.236000 478.256000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.256000 436.236000 482.060000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.060000 436.236000 485.864000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.864000 436.236000 489.668000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.668000 436.236000 493.472000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.472000 436.236000 497.276000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.276000 436.236000 501.080000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.080000 436.236000 504.884000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.884000 436.236000 508.688000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.688000 436.236000 512.492000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.492000 436.236000 516.296000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.296000 436.236000 520.100000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.100000 436.236000 523.904000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.904000 436.236000 527.708000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 436.236000 535.632000 424.236000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 334.400000 422.336000 342.620000 410.336000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 342.596000 422.336000 349.748000 410.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 349.796000 422.336000 354.608000 410.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 354.596000 422.336000 358.424000 410.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 358.400000 422.336000 366.128000 410.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 366.104000 422.336000 369.908000 410.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 369.908000 422.336000 378.128000 410.336000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 378.104000 422.336000 385.832000 410.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 385.808000 422.336000 392.900000 410.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 392.912000 422.336000 400.004000 410.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 400.016000 422.336000 404.828000 410.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 404.816000 422.336000 410.972000 410.336000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 411.000000 422.336000 414.804000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.900000 422.336000 418.704000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.800000 422.336000 422.604000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.700000 422.336000 426.504000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.600000 422.336000 430.404000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.500000 422.336000 434.304000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.400000 422.336000 438.204000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.300000 422.336000 442.104000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.200000 422.336000 446.004000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.100000 422.336000 449.904000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.000000 422.336000 453.804000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.900000 422.336000 457.704000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.800000 422.336000 461.604000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.700000 422.336000 465.504000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.600000 422.336000 469.404000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.500000 422.336000 473.304000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.400000 422.336000 477.204000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.300000 422.336000 481.104000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.200000 422.336000 485.004000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.100000 422.336000 488.904000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.000000 422.336000 492.804000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.900000 422.336000 496.704000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.800000 422.336000 500.604000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.700000 422.336000 504.504000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.600000 422.336000 508.404000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.500000 422.336000 512.304000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.400000 422.336000 516.204000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.300000 422.336000 520.104000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.200000 422.336000 524.004000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.100000 422.336000 527.904000 410.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 422.336000 535.632000 410.336000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 408.436000 328.520000 396.436000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 408.436000 336.224000 396.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 336.200000 408.436000 343.424000 396.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 343.400000 408.436000 350.492000 396.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 350.504000 408.436000 356.660000 396.436000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 356.600000 408.436000 360.404000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 360.404000 408.436000 364.208000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 364.208000 408.436000 368.012000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 368.012000 408.436000 371.816000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.816000 408.436000 375.620000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.620000 408.436000 379.424000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 379.424000 408.436000 383.228000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 383.228000 408.436000 387.032000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 387.032000 408.436000 390.836000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.836000 408.436000 394.640000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.640000 408.436000 398.444000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.444000 408.436000 402.248000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.248000 408.436000 406.052000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.052000 408.436000 409.856000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.856000 408.436000 413.660000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.660000 408.436000 417.464000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.464000 408.436000 421.268000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.268000 408.436000 425.072000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.072000 408.436000 428.876000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.876000 408.436000 432.680000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.680000 408.436000 436.484000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.484000 408.436000 440.288000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.288000 408.436000 444.092000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.092000 408.436000 447.896000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.896000 408.436000 451.700000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.700000 408.436000 455.504000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.504000 408.436000 459.308000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.308000 408.436000 463.112000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.112000 408.436000 466.916000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.916000 408.436000 470.720000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.720000 408.436000 474.524000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.524000 408.436000 478.328000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.328000 408.436000 482.132000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.132000 408.436000 485.936000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.936000 408.436000 489.740000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.740000 408.436000 493.544000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.544000 408.436000 497.348000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.348000 408.436000 501.152000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.152000 408.436000 504.956000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.956000 408.436000 508.760000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.760000 408.436000 512.564000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.564000 408.436000 516.368000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.368000 408.436000 520.172000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.172000 408.436000 523.976000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.976000 408.436000 527.780000 396.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 408.436000 535.632000 396.436000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 394.536000 328.520000 382.536000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 394.536000 336.224000 382.536000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 336.200000 394.536000 343.424000 382.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 343.400000 394.536000 350.168000 382.536000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 350.204000 394.536000 357.296000 382.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 357.308000 394.536000 361.136000 382.536000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 361.100000 394.536000 364.904000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.000000 394.536000 368.804000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 368.900000 394.536000 372.704000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 372.800000 394.536000 376.604000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 376.700000 394.536000 380.504000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.600000 394.536000 384.404000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.500000 394.536000 388.304000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.400000 394.536000 392.204000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.300000 394.536000 396.104000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.200000 394.536000 400.004000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.100000 394.536000 403.904000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.000000 394.536000 407.804000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 407.900000 394.536000 411.704000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.800000 394.536000 415.604000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.700000 394.536000 419.504000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.600000 394.536000 423.404000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.500000 394.536000 427.304000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.400000 394.536000 431.204000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.300000 394.536000 435.104000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.200000 394.536000 439.004000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.100000 394.536000 442.904000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.000000 394.536000 446.804000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.900000 394.536000 450.704000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.800000 394.536000 454.604000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.700000 394.536000 458.504000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.600000 394.536000 462.404000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.500000 394.536000 466.304000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.400000 394.536000 470.204000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.300000 394.536000 474.104000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.200000 394.536000 478.004000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.100000 394.536000 481.904000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.000000 394.536000 485.804000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.900000 394.536000 489.704000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.800000 394.536000 493.604000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.700000 394.536000 497.504000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.600000 394.536000 501.404000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.500000 394.536000 505.304000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.400000 394.536000 509.204000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.300000 394.536000 513.104000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.200000 394.536000 517.004000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.100000 394.536000 520.904000 382.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 394.536000 527.932000 382.536000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 394.536000 535.528000 382.536000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 380.636000 328.520000 368.636000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 380.636000 336.224000 368.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 336.200000 380.636000 343.424000 368.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 343.400000 380.636000 353.660000 368.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 353.696000 380.636000 360.788000 368.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 360.800000 380.636000 366.536000 368.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 366.500000 380.636000 370.304000 368.636000 1.000000 0.000000 0.000000 1.000000
+drawChar 370.304000 380.636000 377.984000 368.636000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 378.008000 380.636000 385.100000 368.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 385.112000 380.636000 388.940000 368.636000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 388.900000 380.636000 392.704000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.800000 380.636000 396.604000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.700000 380.636000 400.504000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.600000 380.636000 404.404000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.500000 380.636000 408.304000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.400000 380.636000 412.204000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.300000 380.636000 416.104000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.200000 380.636000 420.004000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.100000 380.636000 423.904000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.000000 380.636000 427.804000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.900000 380.636000 431.704000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.800000 380.636000 435.604000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.700000 380.636000 439.504000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.600000 380.636000 443.404000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.500000 380.636000 447.304000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.400000 380.636000 451.204000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.300000 380.636000 455.104000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.200000 380.636000 459.004000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.100000 380.636000 462.904000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.000000 380.636000 466.804000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.900000 380.636000 470.704000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.800000 380.636000 474.604000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.700000 380.636000 478.504000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.600000 380.636000 482.404000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.500000 380.636000 486.304000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.400000 380.636000 490.204000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.300000 380.636000 494.104000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.200000 380.636000 498.004000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.100000 380.636000 501.904000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 502.000000 380.636000 505.804000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.900000 380.636000 509.704000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.800000 380.636000 513.604000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.700000 380.636000 517.504000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.600000 380.636000 521.404000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.500000 380.636000 525.304000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 525.400000 380.636000 529.204000 368.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 380.636000 535.632000 368.636000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 366.736000 328.520000 354.736000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 366.736000 332.324000 354.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 332.300000 366.736000 336.128000 354.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 336.104000 366.736000 342.872000 354.736000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 342.908000 366.736000 350.000000 354.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 350.012000 366.736000 355.748000 354.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 355.712000 366.736000 365.972000 354.736000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 366.008000 366.736000 373.160000 354.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 373.208000 366.736000 378.944000 354.736000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 378.908000 366.736000 386.000000 354.736000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 386.000000 366.736000 389.804000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.804000 366.736000 393.608000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.608000 366.736000 397.412000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.412000 366.736000 401.216000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.216000 366.736000 405.020000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.020000 366.736000 408.824000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.824000 366.736000 412.628000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.628000 366.736000 416.432000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.432000 366.736000 420.236000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.236000 366.736000 424.040000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.040000 366.736000 427.844000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.844000 366.736000 431.648000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.648000 366.736000 435.452000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.452000 366.736000 439.256000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.256000 366.736000 443.060000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.060000 366.736000 446.864000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.864000 366.736000 450.668000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.668000 366.736000 454.472000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.472000 366.736000 458.276000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.276000 366.736000 462.080000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.080000 366.736000 465.884000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.884000 366.736000 469.688000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.688000 366.736000 473.492000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.492000 366.736000 477.296000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.296000 366.736000 481.100000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.100000 366.736000 484.904000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.904000 366.736000 488.708000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.708000 366.736000 492.512000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.512000 366.736000 496.316000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.316000 366.736000 500.120000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.120000 366.736000 503.924000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.924000 366.736000 507.728000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.728000 366.736000 511.532000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.532000 366.736000 515.336000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.336000 366.736000 519.140000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.140000 366.736000 522.944000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 522.944000 366.736000 526.748000 354.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 366.736000 535.632000 354.736000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 352.836000 328.520000 340.836000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 352.836000 335.720000 340.836000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 335.696000 352.836000 342.848000 340.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 342.896000 352.836000 350.576000 340.836000 1.000000 0.000000 0.000000 1.000000 p
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 350.500000 352.836000 354.304000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 354.400000 352.836000 358.204000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.300000 352.836000 362.104000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 362.200000 352.836000 366.004000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 366.100000 352.836000 369.904000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.000000 352.836000 373.804000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 373.900000 352.836000 377.704000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.800000 352.836000 381.604000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.700000 352.836000 385.504000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.600000 352.836000 389.404000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.500000 352.836000 393.304000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.400000 352.836000 397.204000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.300000 352.836000 401.104000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.200000 352.836000 405.004000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.100000 352.836000 408.904000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.000000 352.836000 412.804000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.900000 352.836000 416.704000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.800000 352.836000 420.604000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.700000 352.836000 424.504000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.600000 352.836000 428.404000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.500000 352.836000 432.304000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.400000 352.836000 436.204000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.300000 352.836000 440.104000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.200000 352.836000 444.004000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.100000 352.836000 447.904000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 448.000000 352.836000 451.804000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.900000 352.836000 455.704000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.800000 352.836000 459.604000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.700000 352.836000 463.504000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.600000 352.836000 467.404000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.500000 352.836000 471.304000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.400000 352.836000 475.204000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 475.300000 352.836000 479.104000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 479.200000 352.836000 483.004000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 483.100000 352.836000 486.904000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 487.000000 352.836000 490.804000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.900000 352.836000 494.704000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.800000 352.836000 498.604000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.700000 352.836000 502.504000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 502.600000 352.836000 506.404000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.500000 352.836000 510.304000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 510.400000 352.836000 514.204000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.300000 352.836000 518.104000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 518.200000 352.836000 522.004000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 522.100000 352.836000 525.904000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 526.000000 352.836000 529.804000 340.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 352.836000 535.632000 340.836000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 338.936000 328.520000 326.936000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 338.936000 335.720000 326.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 335.696000 338.936000 343.376000 326.936000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 343.400000 338.936000 350.552000 326.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 350.600000 338.936000 354.404000 326.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.404000 338.936000 360.560000 326.936000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 360.608000 338.936000 364.436000 326.936000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 364.412000 338.936000 372.092000 326.936000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 372.116000 338.936000 379.844000 326.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 379.820000 338.936000 387.044000 326.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 387.020000 338.936000 394.748000 326.936000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 394.700000 338.936000 398.504000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.504000 338.936000 402.308000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 402.308000 338.936000 406.112000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 406.112000 338.936000 409.916000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.916000 338.936000 413.720000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.720000 338.936000 417.524000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.524000 338.936000 421.328000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 421.328000 338.936000 425.132000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 425.132000 338.936000 428.936000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.936000 338.936000 432.740000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.740000 338.936000 436.544000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.544000 338.936000 440.348000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 440.348000 338.936000 444.152000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 444.152000 338.936000 447.956000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.956000 338.936000 451.760000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.760000 338.936000 455.564000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.564000 338.936000 459.368000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.368000 338.936000 463.172000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.172000 338.936000 466.976000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.976000 338.936000 470.780000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.780000 338.936000 474.584000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.584000 338.936000 478.388000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.388000 338.936000 482.192000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.192000 338.936000 485.996000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.996000 338.936000 489.800000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.800000 338.936000 493.604000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.604000 338.936000 497.408000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.408000 338.936000 501.212000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.212000 338.936000 505.016000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.016000 338.936000 508.820000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.820000 338.936000 512.624000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.624000 338.936000 516.428000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.428000 338.936000 520.232000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 520.232000 338.936000 524.036000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 524.036000 338.936000 527.840000 326.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 338.936000 535.632000 326.936000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 325.036000 328.520000 313.036000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 325.036000 336.176000 313.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 336.200000 325.036000 340.028000 313.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 340.004000 325.036000 346.724000 313.036000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 346.700000 325.036000 353.792000 313.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 353.804000 325.036000 359.960000 313.036000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 359.900000 325.036000 363.704000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 363.704000 325.036000 367.508000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.508000 325.036000 371.312000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.312000 325.036000 375.116000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 375.116000 325.036000 378.920000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.920000 325.036000 382.724000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.724000 325.036000 386.528000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.528000 325.036000 390.332000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.332000 325.036000 394.136000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.136000 325.036000 397.940000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.940000 325.036000 401.744000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.744000 325.036000 405.548000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.548000 325.036000 409.352000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.352000 325.036000 413.156000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.156000 325.036000 416.960000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.960000 325.036000 420.764000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.764000 325.036000 424.568000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.568000 325.036000 428.372000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.372000 325.036000 432.176000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.176000 325.036000 435.980000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.980000 325.036000 439.784000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.784000 325.036000 443.588000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.588000 325.036000 447.392000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.392000 325.036000 451.196000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.196000 325.036000 455.000000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.000000 325.036000 458.804000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.804000 325.036000 462.608000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.608000 325.036000 466.412000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.412000 325.036000 470.216000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.216000 325.036000 474.020000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.020000 325.036000 477.824000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.824000 325.036000 481.628000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.628000 325.036000 485.432000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.432000 325.036000 489.236000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.236000 325.036000 493.040000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.040000 325.036000 496.844000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.844000 325.036000 500.648000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.648000 325.036000 504.452000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.452000 325.036000 508.256000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.256000 325.036000 512.060000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.060000 325.036000 515.864000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.864000 325.036000 519.668000 313.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 325.036000 527.932000 313.036000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 325.036000 535.528000 313.036000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 311.136000 328.520000 299.136000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 311.136000 336.176000 299.136000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 336.200000 311.136000 340.028000 299.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 340.004000 311.136000 345.740000 299.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 345.704000 311.136000 352.856000 299.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 352.904000 311.136000 356.732000 299.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 356.708000 311.136000 360.512000 299.136000 1.000000 0.000000 0.000000 1.000000
+drawChar 360.512000 311.136000 368.192000 299.136000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 368.216000 311.136000 375.368000 299.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 375.416000 311.136000 383.144000 299.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 383.120000 311.136000 386.948000 299.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 386.924000 311.136000 393.080000 299.136000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 393.128000 311.136000 397.940000 299.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 397.928000 311.136000 405.020000 299.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 405.032000 311.136000 410.768000 299.136000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 410.700000 311.136000 414.504000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.600000 311.136000 418.404000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.500000 311.136000 422.304000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.400000 311.136000 426.204000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.300000 311.136000 430.104000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.200000 311.136000 434.004000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 434.100000 311.136000 437.904000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.000000 311.136000 441.804000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.900000 311.136000 445.704000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.800000 311.136000 449.604000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.700000 311.136000 453.504000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.600000 311.136000 457.404000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.500000 311.136000 461.304000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.400000 311.136000 465.204000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.300000 311.136000 469.104000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.200000 311.136000 473.004000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.100000 311.136000 476.904000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.000000 311.136000 480.804000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.900000 311.136000 484.704000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.800000 311.136000 488.604000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.700000 311.136000 492.504000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.600000 311.136000 496.404000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.500000 311.136000 500.304000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.400000 311.136000 504.204000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.300000 311.136000 508.104000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.200000 311.136000 512.004000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.100000 311.136000 515.904000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 516.000000 311.136000 519.804000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.900000 311.136000 523.704000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.800000 311.136000 527.604000 299.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 311.136000 535.632000 299.136000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 297.236000 328.520000 285.236000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 297.236000 336.176000 285.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 336.200000 297.236000 341.936000 285.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 341.900000 297.236000 349.628000 285.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 349.604000 297.236000 356.324000 285.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 356.300000 297.236000 363.392000 285.236000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 363.400000 297.236000 367.204000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 367.204000 297.236000 371.008000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 371.008000 297.236000 374.812000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.812000 297.236000 378.616000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.616000 297.236000 382.420000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.420000 297.236000 386.224000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.224000 297.236000 390.028000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.028000 297.236000 393.832000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.832000 297.236000 397.636000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.636000 297.236000 401.440000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.440000 297.236000 405.244000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.244000 297.236000 409.048000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.048000 297.236000 412.852000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.852000 297.236000 416.656000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.656000 297.236000 420.460000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.460000 297.236000 424.264000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.264000 297.236000 428.068000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.068000 297.236000 431.872000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.872000 297.236000 435.676000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.676000 297.236000 439.480000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.480000 297.236000 443.284000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.284000 297.236000 447.088000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.088000 297.236000 450.892000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.892000 297.236000 454.696000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.696000 297.236000 458.500000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.500000 297.236000 462.304000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.304000 297.236000 466.108000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.108000 297.236000 469.912000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.912000 297.236000 473.716000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.716000 297.236000 477.520000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.520000 297.236000 481.324000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.324000 297.236000 485.128000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.128000 297.236000 488.932000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.932000 297.236000 492.736000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.736000 297.236000 496.540000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.540000 297.236000 500.344000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.344000 297.236000 504.148000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.148000 297.236000 507.952000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.952000 297.236000 511.756000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.756000 297.236000 515.560000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.560000 297.236000 519.364000 285.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 297.236000 527.932000 285.236000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 297.236000 535.528000 285.236000 1.000000 0.000000 0.000000 1.000000 2
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 283.336000 328.520000 271.336000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 283.336000 333.308000 271.336000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 333.296000 283.336000 340.388000 271.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 340.400000 283.336000 344.228000 271.336000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 344.204000 283.336000 351.932000 271.336000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 351.908000 283.336000 359.588000 271.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 359.612000 283.336000 366.704000 271.336000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 366.716000 283.336000 373.436000 271.336000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 373.412000 283.336000 380.672000 271.336000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 380.708000 283.336000 384.512000 271.336000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 384.512000 283.336000 388.316000 271.336000 1.000000 0.000000 0.000000 1.000000
+drawChar 388.316000 283.336000 393.116000 271.336000 1.000000 0.000000 0.000000 1.000000 J
+drawChar 393.116000 283.336000 400.340000 271.336000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 400.316000 283.336000 408.044000 271.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 408.020000 283.336000 415.748000 271.336000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 415.800000 283.336000 419.604000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.700000 283.336000 423.504000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.600000 283.336000 427.404000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.500000 283.336000 431.304000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.400000 283.336000 435.204000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.300000 283.336000 439.104000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.200000 283.336000 443.004000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.100000 283.336000 446.904000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.000000 283.336000 450.804000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.900000 283.336000 454.704000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.800000 283.336000 458.604000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.700000 283.336000 462.504000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.600000 283.336000 466.404000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.500000 283.336000 470.304000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.400000 283.336000 474.204000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.300000 283.336000 478.104000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.200000 283.336000 482.004000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.100000 283.336000 485.904000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.000000 283.336000 489.804000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.900000 283.336000 493.704000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.800000 283.336000 497.604000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.700000 283.336000 501.504000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.600000 283.336000 505.404000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.500000 283.336000 509.304000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.400000 283.336000 513.204000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.300000 283.336000 517.104000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.200000 283.336000 521.004000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.100000 283.336000 524.904000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 525.000000 283.336000 528.804000 271.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 283.336000 535.632000 271.336000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 269.436000 328.520000 257.436000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 269.436000 333.308000 257.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 333.296000 269.436000 340.388000 257.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 340.400000 269.436000 346.136000 257.436000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 346.100000 269.436000 353.192000 257.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 353.204000 269.436000 360.428000 257.436000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 360.404000 269.436000 364.208000 257.436000 1.000000 0.000000 0.000000 1.000000
+drawChar 364.208000 269.436000 370.364000 257.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 370.412000 269.436000 377.180000 257.436000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 377.216000 269.436000 383.372000 257.436000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 383.420000 269.436000 388.232000 257.436000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 388.220000 269.436000 395.312000 257.436000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 395.324000 269.436000 406.700000 257.436000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 406.600000 269.436000 410.404000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 410.500000 269.436000 414.304000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 414.400000 269.436000 418.204000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 418.300000 269.436000 422.104000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 422.200000 269.436000 426.004000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 426.100000 269.436000 429.904000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 430.000000 269.436000 433.804000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 433.900000 269.436000 437.704000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 437.800000 269.436000 441.604000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 441.700000 269.436000 445.504000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 445.600000 269.436000 449.404000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 449.500000 269.436000 453.304000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 453.400000 269.436000 457.204000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.300000 269.436000 461.104000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.200000 269.436000 465.004000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.100000 269.436000 468.904000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.000000 269.436000 472.804000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 472.900000 269.436000 476.704000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.800000 269.436000 480.604000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.700000 269.436000 484.504000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.600000 269.436000 488.404000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.500000 269.436000 492.304000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.400000 269.436000 496.204000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.300000 269.436000 500.104000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.200000 269.436000 504.004000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.100000 269.436000 507.904000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.000000 269.436000 511.804000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.900000 269.436000 515.704000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.800000 269.436000 519.604000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.700000 269.436000 523.504000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.600000 269.436000 527.404000 257.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 269.436000 535.632000 257.436000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 255.536000 328.520000 243.536000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 255.536000 333.308000 243.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 333.296000 255.536000 339.032000 243.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 338.996000 255.536000 346.148000 243.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 346.196000 255.536000 356.456000 243.536000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 356.492000 255.536000 364.172000 243.536000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 364.196000 255.536000 371.288000 243.536000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 371.300000 255.536000 377.036000 243.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 377.000000 255.536000 382.736000 243.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 382.700000 255.536000 389.468000 243.536000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 389.400000 255.536000 393.204000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.204000 255.536000 397.008000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.008000 255.536000 400.812000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.812000 255.536000 404.616000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.616000 255.536000 408.420000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.420000 255.536000 412.224000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.224000 255.536000 416.028000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.028000 255.536000 419.832000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.832000 255.536000 423.636000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.636000 255.536000 427.440000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.440000 255.536000 431.244000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.244000 255.536000 435.048000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.048000 255.536000 438.852000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 438.852000 255.536000 442.656000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.656000 255.536000 446.460000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.460000 255.536000 450.264000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.264000 255.536000 454.068000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.068000 255.536000 457.872000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 457.872000 255.536000 461.676000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.676000 255.536000 465.480000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.480000 255.536000 469.284000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.284000 255.536000 473.088000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.088000 255.536000 476.892000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 476.892000 255.536000 480.696000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.696000 255.536000 484.500000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.500000 255.536000 488.304000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.304000 255.536000 492.108000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.108000 255.536000 495.912000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 495.912000 255.536000 499.716000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.716000 255.536000 503.520000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.520000 255.536000 507.324000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.324000 255.536000 511.128000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.128000 255.536000 514.932000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.932000 255.536000 518.736000 243.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 255.536000 527.932000 243.536000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 255.536000 535.528000 243.536000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 241.636000 328.520000 229.636000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 328.496000 241.636000 338.756000 229.636000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 338.792000 241.636000 345.884000 229.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 345.896000 241.636000 353.048000 229.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 353.096000 241.636000 357.908000 229.636000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 357.896000 241.636000 364.988000 229.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 365.000000 241.636000 370.736000 229.636000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 370.700000 241.636000 376.856000 229.636000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 376.800000 241.636000 380.604000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.700000 241.636000 384.504000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.600000 241.636000 388.404000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.500000 241.636000 392.304000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.400000 241.636000 396.204000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.300000 241.636000 400.104000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.200000 241.636000 404.004000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.100000 241.636000 407.904000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.000000 241.636000 411.804000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.900000 241.636000 415.704000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.800000 241.636000 419.604000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.700000 241.636000 423.504000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.600000 241.636000 427.404000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.500000 241.636000 431.304000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.400000 241.636000 435.204000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.300000 241.636000 439.104000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.200000 241.636000 443.004000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.100000 241.636000 446.904000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.000000 241.636000 450.804000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.900000 241.636000 454.704000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.800000 241.636000 458.604000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.700000 241.636000 462.504000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.600000 241.636000 466.404000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.500000 241.636000 470.304000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.400000 241.636000 474.204000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.300000 241.636000 478.104000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.200000 241.636000 482.004000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.100000 241.636000 485.904000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.000000 241.636000 489.804000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.900000 241.636000 493.704000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.800000 241.636000 497.604000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.700000 241.636000 501.504000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.600000 241.636000 505.404000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.500000 241.636000 509.304000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.400000 241.636000 513.204000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.300000 241.636000 517.104000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.200000 241.636000 521.004000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.100000 241.636000 524.904000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 525.000000 241.636000 528.804000 229.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 241.636000 535.632000 229.636000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 320.300000 227.656000 329.228000 215.656000 1.000000 0.000000 0.000000 1.000000 T
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 213.636000 328.292000 201.636000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 327.404000 213.636000 334.496000 201.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 334.508000 213.636000 338.336000 201.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 338.312000 213.636000 345.404000 201.636000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 345.416000 213.636000 353.096000 201.636000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 353.120000 213.636000 360.848000 201.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 360.824000 213.636000 368.048000 201.636000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 368.024000 213.636000 375.752000 201.636000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 375.728000 213.636000 382.820000 201.636000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 382.800000 213.636000 386.604000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 386.604000 213.636000 390.408000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 390.408000 213.636000 394.212000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 394.212000 213.636000 398.016000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 398.016000 213.636000 401.820000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.820000 213.636000 405.624000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 405.624000 213.636000 409.428000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 409.428000 213.636000 413.232000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 413.232000 213.636000 417.036000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 417.036000 213.636000 420.840000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.840000 213.636000 424.644000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.644000 213.636000 428.448000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.448000 213.636000 432.252000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.252000 213.636000 436.056000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.056000 213.636000 439.860000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.860000 213.636000 443.664000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.664000 213.636000 447.468000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.468000 213.636000 451.272000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.272000 213.636000 455.076000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.076000 213.636000 458.880000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.880000 213.636000 462.684000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.684000 213.636000 466.488000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.488000 213.636000 470.292000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.292000 213.636000 474.096000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.096000 213.636000 477.900000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.900000 213.636000 481.704000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.704000 213.636000 485.508000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.508000 213.636000 489.312000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.312000 213.636000 493.116000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.116000 213.636000 496.920000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.920000 213.636000 500.724000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.724000 213.636000 504.528000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.528000 213.636000 508.332000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 508.332000 213.636000 512.136000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 512.136000 213.636000 515.940000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.940000 213.636000 519.744000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.744000 213.636000 523.548000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.548000 213.636000 527.352000 201.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 213.636000 535.632000 201.636000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 199.736000 328.292000 187.736000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 327.404000 199.736000 334.496000 187.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 334.508000 199.736000 338.336000 187.736000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 338.312000 199.736000 345.404000 187.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 345.416000 199.736000 352.184000 187.736000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 352.220000 199.736000 356.048000 187.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 356.024000 199.736000 362.180000 187.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 362.228000 199.736000 366.056000 187.736000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 366.032000 199.736000 373.256000 187.736000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 373.232000 199.736000 380.960000 187.736000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 380.900000 199.736000 384.704000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.800000 199.736000 388.604000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.700000 199.736000 392.504000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.600000 199.736000 396.404000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.500000 199.736000 400.304000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.400000 199.736000 404.204000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.300000 199.736000 408.104000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.200000 199.736000 412.004000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.100000 199.736000 415.904000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.000000 199.736000 419.804000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.900000 199.736000 423.704000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.800000 199.736000 427.604000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.700000 199.736000 431.504000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.600000 199.736000 435.404000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.500000 199.736000 439.304000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.400000 199.736000 443.204000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.300000 199.736000 447.104000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.200000 199.736000 451.004000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.100000 199.736000 454.904000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.000000 199.736000 458.804000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.900000 199.736000 462.704000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.800000 199.736000 466.604000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.700000 199.736000 470.504000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.600000 199.736000 474.404000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.500000 199.736000 478.304000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.400000 199.736000 482.204000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.300000 199.736000 486.104000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.200000 199.736000 490.004000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.100000 199.736000 493.904000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.000000 199.736000 497.804000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.900000 199.736000 501.704000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.800000 199.736000 505.604000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.700000 199.736000 509.504000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.600000 199.736000 513.404000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.500000 199.736000 517.304000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.400000 199.736000 521.204000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.300000 199.736000 525.104000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 525.200000 199.736000 529.004000 187.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 199.736000 535.632000 187.736000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 185.836000 328.292000 173.836000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 327.404000 185.836000 334.496000 173.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 334.508000 185.836000 340.244000 173.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 340.208000 185.836000 345.944000 173.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 345.908000 185.836000 353.060000 173.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 353.108000 185.836000 359.828000 173.836000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 359.804000 185.836000 366.896000 173.836000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 366.800000 185.836000 370.604000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 370.604000 185.836000 374.408000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 374.408000 185.836000 378.212000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 378.212000 185.836000 382.016000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.016000 185.836000 385.820000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.820000 185.836000 389.624000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.624000 185.836000 393.428000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.428000 185.836000 397.232000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.232000 185.836000 401.036000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.036000 185.836000 404.840000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.840000 185.836000 408.644000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.644000 185.836000 412.448000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.448000 185.836000 416.252000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.252000 185.836000 420.056000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.056000 185.836000 423.860000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.860000 185.836000 427.664000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.664000 185.836000 431.468000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.468000 185.836000 435.272000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.272000 185.836000 439.076000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.076000 185.836000 442.880000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.880000 185.836000 446.684000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.684000 185.836000 450.488000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.488000 185.836000 454.292000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.292000 185.836000 458.096000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.096000 185.836000 461.900000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.900000 185.836000 465.704000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.704000 185.836000 469.508000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.508000 185.836000 473.312000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.312000 185.836000 477.116000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.116000 185.836000 480.920000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 480.920000 185.836000 484.724000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.724000 185.836000 488.528000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.528000 185.836000 492.332000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.332000 185.836000 496.136000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.136000 185.836000 499.940000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 499.940000 185.836000 503.744000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.744000 185.836000 507.548000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.548000 185.836000 511.352000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.352000 185.836000 515.156000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.156000 185.836000 518.960000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 518.960000 185.836000 522.764000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 522.764000 185.836000 526.568000 173.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 185.836000 535.632000 173.836000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 171.936000 328.292000 159.936000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 328.304000 171.936000 336.032000 159.936000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 336.008000 171.936000 342.776000 159.936000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 342.812000 171.936000 354.188000 159.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 354.212000 171.936000 361.304000 159.936000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 361.200000 171.936000 365.004000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.100000 171.936000 368.904000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 369.000000 171.936000 372.804000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 372.900000 171.936000 376.704000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 376.800000 171.936000 380.604000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 380.700000 171.936000 384.504000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 384.600000 171.936000 388.404000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 388.500000 171.936000 392.304000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 392.400000 171.936000 396.204000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 396.300000 171.936000 400.104000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.200000 171.936000 404.004000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.100000 171.936000 407.904000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.000000 171.936000 411.804000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 411.900000 171.936000 415.704000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 415.800000 171.936000 419.604000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 419.700000 171.936000 423.504000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.600000 171.936000 427.404000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.500000 171.936000 431.304000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.400000 171.936000 435.204000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.300000 171.936000 439.104000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.200000 171.936000 443.004000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.100000 171.936000 446.904000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.000000 171.936000 450.804000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.900000 171.936000 454.704000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.800000 171.936000 458.604000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.700000 171.936000 462.504000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.600000 171.936000 466.404000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.500000 171.936000 470.304000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 470.400000 171.936000 474.204000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 474.300000 171.936000 478.104000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.200000 171.936000 482.004000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.100000 171.936000 485.904000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.000000 171.936000 489.804000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 489.900000 171.936000 493.704000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 493.800000 171.936000 497.604000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 497.700000 171.936000 501.504000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 501.600000 171.936000 505.404000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 505.500000 171.936000 509.304000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 509.400000 171.936000 513.204000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 513.300000 171.936000 517.104000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.200000 171.936000 521.004000 159.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 171.936000 527.932000 159.936000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 171.936000 535.528000 159.936000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 158.036000 328.292000 146.036000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 327.404000 158.036000 334.628000 146.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 334.604000 158.036000 338.432000 146.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 338.408000 158.036000 342.236000 146.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 342.212000 158.036000 349.304000 146.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 349.316000 158.036000 354.128000 146.036000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 354.100000 158.036000 357.904000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 358.000000 158.036000 361.804000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 361.900000 158.036000 365.704000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 365.800000 158.036000 369.604000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 369.700000 158.036000 373.504000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 373.600000 158.036000 377.404000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 377.500000 158.036000 381.304000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 381.400000 158.036000 385.204000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.300000 158.036000 389.104000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.200000 158.036000 393.004000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.100000 158.036000 396.904000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.000000 158.036000 400.804000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 400.900000 158.036000 404.704000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.800000 158.036000 408.604000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.700000 158.036000 412.504000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.600000 158.036000 416.404000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.500000 158.036000 420.304000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.400000 158.036000 424.204000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.300000 158.036000 428.104000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.200000 158.036000 432.004000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 432.100000 158.036000 435.904000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 436.000000 158.036000 439.804000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.900000 158.036000 443.704000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.800000 158.036000 447.604000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.700000 158.036000 451.504000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 451.600000 158.036000 455.404000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 455.500000 158.036000 459.304000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 459.400000 158.036000 463.204000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 463.300000 158.036000 467.104000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 467.200000 158.036000 471.004000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 471.100000 158.036000 474.904000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 475.000000 158.036000 478.804000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 478.900000 158.036000 482.704000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 482.800000 158.036000 486.604000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 486.700000 158.036000 490.504000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 490.600000 158.036000 494.404000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 494.500000 158.036000 498.304000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 498.400000 158.036000 502.204000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 502.300000 158.036000 506.104000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 506.200000 158.036000 510.004000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 510.100000 158.036000 513.904000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 514.000000 158.036000 517.804000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 517.900000 158.036000 521.704000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 521.800000 158.036000 525.604000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 525.700000 158.036000 529.504000 146.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 158.036000 535.632000 146.036000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 144.136000 328.292000 132.136000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 327.404000 144.136000 334.628000 132.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 334.604000 144.136000 345.980000 132.136000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 346.004000 144.136000 353.156000 132.136000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 353.204000 144.136000 358.016000 132.136000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 358.004000 144.136000 365.228000 132.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 365.204000 144.136000 372.296000 132.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 372.308000 144.136000 378.464000 132.136000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 378.300000 144.136000 382.104000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 382.104000 144.136000 385.908000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 385.908000 144.136000 389.712000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 389.712000 144.136000 393.516000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 393.516000 144.136000 397.320000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 397.320000 144.136000 401.124000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 401.124000 144.136000 404.928000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 404.928000 144.136000 408.732000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 408.732000 144.136000 412.536000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.536000 144.136000 416.340000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.340000 144.136000 420.144000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.144000 144.136000 423.948000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 423.948000 144.136000 427.752000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 427.752000 144.136000 431.556000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.556000 144.136000 435.360000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.360000 144.136000 439.164000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.164000 144.136000 442.968000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 442.968000 144.136000 446.772000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 446.772000 144.136000 450.576000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.576000 144.136000 454.380000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.380000 144.136000 458.184000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.184000 144.136000 461.988000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 461.988000 144.136000 465.792000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 465.792000 144.136000 469.596000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.596000 144.136000 473.400000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.400000 144.136000 477.204000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.204000 144.136000 481.008000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.008000 144.136000 484.812000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 484.812000 144.136000 488.616000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.616000 144.136000 492.420000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.420000 144.136000 496.224000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.224000 144.136000 500.028000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.028000 144.136000 503.832000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 503.832000 144.136000 507.636000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.636000 144.136000 511.440000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.440000 144.136000 515.244000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.244000 144.136000 519.048000 132.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 520.300000 144.136000 527.932000 132.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 527.896000 144.136000 535.528000 132.136000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 320.300000 130.236000 328.292000 118.236000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 328.304000 130.236000 334.040000 118.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 334.004000 130.236000 341.156000 118.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 341.204000 130.236000 348.884000 118.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 348.908000 130.236000 356.000000 118.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 356.012000 130.236000 359.816000 118.236000 1.000000 0.000000 0.000000 1.000000
+drawChar 359.816000 130.236000 363.536000 118.236000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 363.512000 130.236000 370.736000 118.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 370.712000 130.236000 378.440000 118.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 378.416000 130.236000 384.152000 118.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 384.116000 130.236000 391.844000 118.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 391.820000 130.236000 398.972000 118.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 399.020000 130.236000 402.848000 118.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 402.824000 130.236000 408.980000 118.236000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 409.000000 130.236000 412.804000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 412.804000 130.236000 416.608000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 416.608000 130.236000 420.412000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 420.412000 130.236000 424.216000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 424.216000 130.236000 428.020000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 428.020000 130.236000 431.824000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 431.824000 130.236000 435.628000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 435.628000 130.236000 439.432000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 439.432000 130.236000 443.236000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 443.236000 130.236000 447.040000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 447.040000 130.236000 450.844000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 450.844000 130.236000 454.648000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 454.648000 130.236000 458.452000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 458.452000 130.236000 462.256000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 462.256000 130.236000 466.060000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 466.060000 130.236000 469.864000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 469.864000 130.236000 473.668000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 473.668000 130.236000 477.472000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 477.472000 130.236000 481.276000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 481.276000 130.236000 485.080000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 485.080000 130.236000 488.884000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 488.884000 130.236000 492.688000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 492.688000 130.236000 496.492000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 496.492000 130.236000 500.296000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 500.296000 130.236000 504.100000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 504.100000 130.236000 507.904000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 507.904000 130.236000 511.708000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 511.708000 130.236000 515.512000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 515.512000 130.236000 519.316000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 519.316000 130.236000 523.120000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 523.120000 130.236000 526.924000 118.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 528.000000 130.236000 535.632000 118.236000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 306.000000 136.200000 0 306.100000 136.200000 0 306.100000 644.700000 0 306.000000 644.700000 0 306.000000 136.200000 0
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 14808.400000 0 477.900000 14808.400000 0 477.900000 15118.200000 0 134.300000 15118.200000 0 134.300000 14808.400000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -1401650.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 11819.400000 0 168.100000 11819.400000 0 168.100000 11824.400000 0 76.900000 11824.400000 0 76.900000 11819.400000 0
+eoFillPath subpath 1 163.100000 11824.300000 0 168.100000 11824.300000 0 168.100000 11954.900000 0 163.100000 11954.900000 0 163.100000 11824.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 11824.400000 0 163.100000 11824.400000 0 163.100000 11959.800000 0 72.000000 11959.800000 0 72.000000 11824.400000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 11955.480000 87.320000 11945.480000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 11955.480000 93.420000 11945.480000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 11955.480000 97.510000 11945.480000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 11955.480000 101.420000 11945.480000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 11955.480000 104.170000 11945.480000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 11955.480000 110.530000 11945.480000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 11955.480000 113.270000 11945.480000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 11955.480000 116.470000 11945.480000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 11955.480000 123.480000 11945.480000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 11955.480000 129.610000 11945.480000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 11955.480000 135.090000 11945.480000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 11955.480000 140.890000 11945.480000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 11955.480000 144.820000 11945.480000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 11955.480000 150.920000 11945.480000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 11955.480000 153.670000 11945.480000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 11955.480000 156.470000 11945.480000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 11828.600000 0 168.200000 11828.600000 0 168.200000 11943.800000 0 72.000000 11943.800000 0 72.000000 11828.600000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11896.752000 79.253000 11887.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 11896.752000 86.669000 11887.752000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 11896.752000 90.215000 11887.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 11896.752000 93.077000 11887.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 11896.752000 97.406000 11887.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 11896.752000 100.853000 11887.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 11896.752000 107.324000 11887.752000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 11896.752000 112.337000 11887.752000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 11896.752000 115.271000 11887.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 11896.752000 118.655000 11887.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 11896.752000 126.512000 11887.752000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 11896.752000 130.805000 11887.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 11896.752000 135.881000 11887.752000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 11896.752000 139.355000 11887.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 11896.752000 147.284000 11887.752000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 11896.752000 150.074000 11887.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 11896.752000 155.897000 11887.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 11896.752000 158.750000 11887.752000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 11896.752000 161.853000 11887.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11886.252000 82.124000 11877.252000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 11886.252000 87.137000 11877.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 11886.252000 90.071000 11877.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 11886.252000 93.356000 11877.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 11886.252000 100.403000 11877.252000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 11886.252000 104.921000 11877.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 11886.252000 109.205000 11877.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 11886.252000 117.737000 11877.252000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 11886.252000 123.119000 11877.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 11886.252000 128.996000 11877.252000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 11886.252000 132.605000 11877.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 11886.252000 138.392000 11877.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 11886.252000 141.749000 11877.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 11886.252000 149.507000 11877.252000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 11886.252000 153.800000 11877.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 11886.252000 158.876000 11877.252000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 11886.252000 161.853000 11877.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11875.752000 81.764000 11866.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 11875.752000 87.596000 11866.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 11875.752000 93.356000 11866.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 11875.752000 102.050000 11866.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 11875.752000 113.822000 11866.752000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 11875.752000 122.651000 11866.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 11875.752000 134.117000 11866.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 11875.752000 138.401000 11866.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 11875.752000 147.149000 11866.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 11875.752000 158.921000 11866.752000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 11875.752000 161.853000 11866.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11865.252000 79.271000 11856.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 11865.252000 84.338000 11856.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 11865.252000 89.621000 11856.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 11865.252000 94.643000 11856.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 11865.252000 100.502000 11856.252000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 11865.252000 106.262000 11856.252000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 11865.252000 111.518000 11856.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 11865.252000 116.216000 11856.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 11865.252000 119.249000 11856.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 11865.252000 122.363000 11856.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 11865.252000 128.186000 11856.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 11865.252000 131.345000 11856.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 11865.252000 137.060000 11856.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 11865.252000 140.147000 11856.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 11865.252000 145.007000 11856.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 11865.252000 148.598000 11856.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 11865.252000 151.460000 11856.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 11865.252000 155.789000 11856.252000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 11865.252000 158.933000 11856.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11854.752000 80.702000 11845.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 11854.752000 83.573000 11845.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 11854.752000 89.396000 11845.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 11854.752000 95.156000 11845.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 11854.752000 100.547000 11845.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 11854.752000 109.052000 11845.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 11854.752000 111.959000 11845.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 11854.752000 117.251000 11845.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 11854.752000 121.904000 11845.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 11854.752000 126.503000 11845.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 11854.752000 129.338000 11845.752000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 11854.752000 134.936000 11845.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 11854.752000 143.441000 11845.752000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 11854.752000 148.796000 11845.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 11854.752000 154.574000 11845.752000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 11854.752000 158.876000 11845.752000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 11854.752000 161.853000 11845.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11844.252000 79.271000 11835.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 11844.252000 85.094000 11835.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 11844.252000 88.703000 11835.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 11844.252000 94.112000 11835.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 11844.252000 97.244000 11835.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 11844.252000 103.058000 11835.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 11844.252000 108.890000 11835.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 11844.252000 111.950000 11835.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 11844.252000 115.271000 11835.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 11844.252000 120.338000 11835.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 11844.252000 125.621000 11835.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 11844.252000 131.363000 11835.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 11844.252000 134.558000 11835.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 11844.252000 140.048000 11835.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 11844.252000 145.430000 11835.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 11844.252000 150.551000 11835.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 11844.252000 155.960000 11835.252000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 11844.252000 158.933000 11835.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11833.752000 80.009000 11824.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 11833.752000 85.364000 11824.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 11833.752000 88.271000 11824.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 11833.752000 91.169000 11824.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 11833.752000 97.955000 11824.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 11833.752000 107.765000 11824.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 11833.752000 110.672000 11824.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 11833.752000 115.964000 11824.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 11833.752000 120.617000 11824.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 11833.752000 125.216000 11824.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 11833.752000 128.051000 11824.752000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 11833.752000 134.954000 11824.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 11833.752000 146.285000 11824.752000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 11833.752000 151.667000 11824.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 11833.752000 155.906000 11824.752000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 11833.752000 159.033000 11824.752000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 11824.300000 0 72.100000 11824.300000 0 72.100000 11959.800000 0 72.000000 11959.800000 0 72.000000 11824.300000 0
+eoFillPath subpath 1 163.100000 11824.300000 0 163.200000 11824.300000 0 163.200000 11959.800000 0 163.100000 11959.800000 0 163.100000 11824.300000 0
+eoFillPath subpath 1 72.000000 11959.700000 0 163.200000 11959.700000 0 163.200000 11959.800000 0 72.000000 11959.800000 0 72.000000 11959.700000 0
+eoFillPath subpath 1 72.000000 11824.300000 0 163.200000 11824.300000 0 163.200000 11824.400000 0 72.000000 11824.400000 0 72.000000 11824.300000 0
+saveState
+eoClipPath subpath 1 96.900000 11899.600000 0 138.300000 11899.600000 0 138.300000 11943.800000 0 96.900000 11943.800000 0 96.900000 11899.600000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -1110770.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 11544.800000 0 165.500000 11544.800000 0 165.500000 11549.800000 0 76.900000 11549.800000 0 76.900000 11544.800000 0
+eoFillPath subpath 1 160.500000 11549.700000 0 165.500000 11549.700000 0 165.500000 11706.000000 0 160.500000 11706.000000 0 160.500000 11549.700000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 11549.800000 0 121.400000 11549.800000 0 121.400000 11710.900000 0 72.000000 11710.900000 0 72.000000 11549.800000 0
+saveState
+eoClipPath subpath 1 72.000000 11549.700000 0 160.500000 11549.700000 0 160.500000 11710.800000 0 72.000000 11710.800000 0 72.000000 11549.700000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -1074070.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 11706.580000 89.280000 11696.580000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 11706.580000 95.630000 11696.580000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 11706.580000 99.520000 11696.580000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 11706.580000 102.270000 11696.580000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 11706.580000 108.450000 11696.580000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 11706.580000 112.610000 11696.580000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 11706.580000 118.510000 11696.580000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 11706.580000 121.670000 11696.580000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 11706.580000 124.470000 11696.580000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 11706.580000 130.830000 11696.580000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 11706.580000 133.970000 11696.580000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 11706.580000 137.920000 11696.580000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 11706.580000 144.230000 11696.580000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 11706.580000 150.350000 11696.580000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 11706.580000 153.570000 11696.580000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 11694.880000 95.000000 11684.880000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 11694.880000 97.770000 11684.880000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 11694.880000 103.000000 11684.880000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 11694.880000 109.330000 11684.880000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 11694.880000 117.470000 11684.880000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 11694.880000 123.620000 11684.880000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 11694.880000 128.800000 11684.880000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 11694.880000 135.130000 11684.880000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 11694.880000 141.250000 11684.880000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 11694.880000 145.410000 11684.880000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11680.052000 82.961000 11671.052000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 11680.052000 87.614000 11671.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 11680.052000 93.356000 11671.052000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 11680.052000 98.612000 11671.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 11680.052000 103.733000 11671.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 11680.052000 106.568000 11671.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 11680.052000 111.959000 11671.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 11680.052000 114.866000 11671.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 11680.052000 117.665000 11671.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 11680.052000 122.768000 11671.052000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 11680.052000 125.747000 11671.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 11680.052000 131.651000 11671.052000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 11680.052000 136.907000 11671.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 11680.052000 142.307000 11671.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 11680.052000 148.049000 11671.052000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 11680.052000 150.956000 11671.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 11680.052000 156.302000 11671.052000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 11680.052000 159.253000 11671.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11669.552000 84.095000 11660.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 11669.552000 89.900000 11660.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 11669.552000 95.318000 11660.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 11669.552000 100.349000 11660.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 11669.552000 110.789000 11660.552000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 11669.552000 111.464000 11660.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 11669.552000 114.362000 11660.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 11669.552000 119.348000 11660.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 11669.552000 126.962000 11660.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 11669.552000 132.047000 11660.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 11669.552000 139.958000 11660.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 11669.552000 142.865000 11660.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 11669.552000 147.410000 11660.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 11669.552000 153.287000 11660.552000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 11669.552000 156.333000 11660.552000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11659.052000 84.095000 11650.052000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 11659.052000 89.468000 11650.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 11659.052000 94.121000 11650.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 11659.052000 99.899000 11650.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 11659.052000 105.218000 11650.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 11659.052000 109.502000 11650.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 11659.052000 115.649000 11650.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 11659.052000 122.327000 11650.052000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 11659.052000 127.718000 11650.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 11659.052000 132.002000 11650.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 11659.052000 138.149000 11650.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 11659.052000 145.205000 11650.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 11659.052000 150.992000 11650.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 11659.052000 156.311000 11650.052000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 11659.052000 159.253000 11650.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11648.552000 82.394000 11639.552000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 11648.552000 86.705000 11639.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 11648.552000 91.322000 11639.552000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 11648.552000 94.913000 11639.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 11648.552000 98.054000 11639.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 11648.552000 102.014000 11639.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 11648.552000 104.876000 11639.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 11648.552000 113.435000 11639.552000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 11648.552000 118.718000 11639.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 11648.552000 121.949000 11639.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 11648.552000 125.063000 11639.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 11648.552000 130.886000 11639.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 11648.552000 134.045000 11639.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 11648.552000 138.005000 11639.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 11648.552000 143.792000 11639.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 11648.552000 149.111000 11639.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 11648.552000 151.964000 11639.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 11648.552000 156.293000 11639.552000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 11648.552000 159.153000 11639.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11638.052000 79.271000 11629.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 11638.052000 82.169000 11629.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 11638.052000 85.526000 11629.052000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 11638.052000 90.818000 11629.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 11638.052000 94.454000 11629.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 11638.052000 99.008000 11629.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 11638.052000 104.318000 11629.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 11638.052000 110.096000 11629.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 11638.052000 115.856000 11629.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 11638.052000 119.546000 11629.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 11638.052000 124.001000 11629.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 11638.052000 129.509000 11629.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 11638.052000 133.145000 11629.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 11638.052000 139.751000 11629.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 11638.052000 145.205000 11629.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 11638.052000 148.841000 11629.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 11638.052000 152.657000 11629.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 11638.052000 156.293000 11629.052000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 11638.052000 159.253000 11629.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11627.552000 84.095000 11618.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 11627.552000 88.406000 11618.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 11627.552000 93.824000 11618.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 11627.552000 99.602000 11618.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 11627.552000 105.362000 11618.552000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 11627.552000 108.422000 11618.552000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 11627.552000 116.747000 11618.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 11627.552000 129.275000 11618.552000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 11627.552000 135.089000 11618.552000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 11627.552000 138.698000 11618.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 11627.552000 141.560000 11618.552000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 11627.552000 146.906000 11618.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 11627.552000 151.190000 11618.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 11627.552000 156.266000 11618.552000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 11627.552000 159.253000 11618.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11617.052000 82.196000 11608.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 11617.052000 87.560000 11608.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 11617.052000 92.213000 11608.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 11617.052000 96.551000 11608.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 11617.052000 101.708000 11608.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 11617.052000 107.216000 11608.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 11617.052000 111.653000 11608.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 11617.052000 118.961000 11608.052000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 11617.052000 124.316000 11608.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 11617.052000 128.654000 11608.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 11617.052000 133.172000 11608.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 11617.052000 138.995000 11608.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 11617.052000 143.612000 11608.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 11617.052000 148.913000 11608.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 11617.052000 153.197000 11608.052000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 11617.052000 156.333000 11608.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11606.552000 80.009000 11597.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 11606.552000 85.319000 11597.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 11606.552000 91.061000 11597.552000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 11606.552000 100.052000 11597.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 11606.552000 113.993000 11597.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 11606.552000 116.873000 11597.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 11606.552000 120.410000 11597.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 11606.552000 126.296000 11597.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 11606.552000 135.350000 11597.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 11606.552000 145.106000 11597.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 11606.552000 150.893000 11597.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 11606.552000 156.212000 11597.552000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 11606.552000 159.253000 11597.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11596.052000 82.196000 11587.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 11596.052000 87.560000 11587.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 11596.052000 93.392000 11587.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 11596.052000 99.152000 11587.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 11596.052000 101.960000 11587.052000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 11596.052000 107.306000 11587.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 11596.052000 111.905000 11587.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 11596.052000 115.640000 11587.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 11596.052000 122.444000 11587.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 11596.052000 127.898000 11587.052000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 11596.052000 135.575000 11587.052000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 11596.052000 141.380000 11587.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 11596.052000 145.241000 11587.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 11596.052000 150.803000 11587.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 11596.052000 156.302000 11587.052000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 11596.052000 159.253000 11587.052000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11585.552000 80.009000 11576.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 11585.552000 85.796000 11576.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 11585.552000 91.115000 11576.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 11585.552000 95.399000 11576.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 11585.552000 100.718000 11576.552000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 11585.552000 107.054000 11576.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 11585.552000 118.097000 11576.552000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 11585.552000 123.524000 11576.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 11585.552000 129.401000 11576.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 11585.552000 131.768000 11576.552000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 11585.552000 135.413000 11576.552000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 11585.552000 141.659000 11576.552000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 11585.552000 150.965000 11576.552000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 11585.552000 156.320000 11576.552000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 11585.552000 159.253000 11576.552000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11575.052000 81.017000 11566.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 11575.052000 84.608000 11566.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 11575.052000 89.963000 11566.052000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 11575.052000 92.870000 11566.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 11575.052000 98.693000 11566.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 11575.052000 103.310000 11566.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 11575.052000 107.243000 11566.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 11575.052000 116.081000 11566.052000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 11575.052000 121.886000 11566.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 11575.052000 127.205000 11566.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 11575.052000 132.983000 11566.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 11575.052000 136.943000 11566.052000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 11575.052000 143.846000 11566.052000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 11575.052000 148.184000 11566.052000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 11575.052000 153.260000 11566.052000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 11575.052000 156.433000 11566.052000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 11564.552000 79.271000 11555.552000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 11564.552000 85.094000 11555.552000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 11564.552000 90.854000 11555.552000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 11564.552000 93.653000 11555.552000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 11549.700000 0 72.100000 11549.700000 0 72.100000 11710.900000 0 72.000000 11710.900000 0 72.000000 11549.700000 0
+eoFillPath subpath 1 160.500000 11549.700000 0 160.600000 11549.700000 0 160.600000 11710.900000 0 160.500000 11710.900000 0 160.500000 11549.700000 0
+eoFillPath subpath 1 72.000000 11710.800000 0 160.600000 11710.800000 0 160.600000 11710.900000 0 72.000000 11710.900000 0 72.000000 11710.800000 0
+eoFillPath subpath 1 72.000000 11549.700000 0 160.600000 11549.700000 0 160.600000 11549.800000 0 72.000000 11549.800000 0 72.000000 11549.700000 0
+saveState
+eoClipPath subpath 1 108.000000 11062.300000 0 178.900000 11062.300000 0 178.900000 11119.000000 0 108.000000 11119.000000 0 108.000000 11062.300000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -1027040.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 7004.000000 0 165.500000 7004.000000 0 165.500000 7009.000000 0 76.900000 7009.000000 0 76.900000 7004.000000 0
+eoFillPath subpath 1 160.500000 7008.900000 0 165.500000 7008.900000 0 165.500000 7117.700000 0 160.500000 7117.700000 0 160.500000 7008.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 7009.000000 0 160.500000 7009.000000 0 160.500000 7122.600000 0 72.000000 7122.600000 0 72.000000 7009.000000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7118.252000 83.771000 7109.252000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 7118.252000 89.594000 7109.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 7118.252000 92.465000 7109.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 7118.252000 97.568000 7109.252000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 7118.252000 100.943000 7109.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 7118.252000 106.955000 7109.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 7118.252000 110.447000 7109.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 7118.252000 114.425000 7109.252000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 7118.252000 119.717000 7109.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 7118.252000 127.493000 7109.252000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 7118.252000 130.949000 7109.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 7118.252000 136.574000 7109.252000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 7118.252000 141.920000 7109.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 7118.252000 147.365000 7109.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 7118.252000 151.703000 7109.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 7118.252000 156.320000 7109.252000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 7118.252000 159.153000 7109.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7107.752000 81.764000 7098.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 7107.752000 85.130000 7098.752000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 7107.752000 88.712000 7098.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 7107.752000 94.022000 7098.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 7107.752000 98.306000 7098.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 7107.752000 102.455000 7098.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 7107.752000 106.676000 7098.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 7107.752000 110.312000 7098.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 7107.752000 114.920000 7098.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 7107.752000 119.060000 7098.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 7107.752000 125.450000 7098.752000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 7107.752000 130.832000 7098.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 7107.752000 139.445000 7098.752000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 7107.752000 145.169000 7098.752000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 7107.752000 148.076000 7098.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 7107.752000 153.323000 7098.752000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 7107.752000 156.433000 7098.752000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7097.252000 80.009000 7088.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 7097.252000 82.871000 7088.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 7097.252000 88.316000 7088.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 7097.252000 94.094000 7088.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 7097.252000 96.947000 7088.252000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 7097.252000 104.948000 7088.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 7097.252000 113.705000 7088.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 7097.252000 119.492000 7088.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 7097.252000 124.811000 7088.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 7097.252000 132.848000 7088.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 7097.252000 141.605000 7088.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 7097.252000 144.467000 7088.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 7097.252000 148.103000 7088.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 7097.252000 150.965000 7088.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 7097.252000 156.311000 7088.252000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7097.252000 159.253000 7088.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7086.752000 80.999000 7077.752000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 7086.752000 90.539000 7077.752000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 7086.752000 95.318000 7077.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 7086.752000 99.602000 7077.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 7086.752000 102.473000 7077.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 7086.752000 108.260000 7077.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 7086.752000 110.762000 7077.752000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 7086.752000 115.316000 7077.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 7086.752000 122.156000 7077.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 7086.752000 132.299000 7077.752000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 7086.752000 136.970000 7077.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 7086.752000 139.877000 7077.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 7086.752000 142.775000 7077.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 7086.752000 148.022000 7077.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 7086.752000 152.720000 7077.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 7086.752000 156.311000 7077.752000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7086.752000 159.253000 7077.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7076.252000 83.006000 7067.252000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 7076.252000 88.793000 7067.252000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 7076.252000 91.664000 7067.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 7076.252000 94.562000 7067.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 7076.252000 100.349000 7067.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 7076.252000 103.157000 7067.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 7076.252000 108.980000 7067.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 7076.252000 114.740000 7067.252000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 7076.252000 119.375000 7067.252000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 7076.252000 128.033000 7067.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 7076.252000 141.479000 7067.252000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 7076.252000 146.807000 7067.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 7076.252000 152.684000 7067.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 7076.252000 156.293000 7067.252000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7076.252000 159.253000 7067.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7065.752000 79.730000 7056.752000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 7065.752000 84.005000 7056.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 7065.752000 89.423000 7056.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 7065.752000 98.036000 7056.752000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 7065.752000 121.157000 7056.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 7065.752000 145.115000 7056.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 7065.752000 151.001000 7056.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 7065.752000 156.320000 7056.752000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7065.752000 159.253000 7056.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7055.252000 83.285000 7046.252000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 7055.252000 89.099000 7046.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 7055.252000 93.401000 7046.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 7055.252000 98.477000 7046.252000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 7055.252000 103.121000 7046.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 7055.252000 105.974000 7046.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 7055.252000 111.320000 7046.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 7055.252000 115.604000 7046.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 7055.252000 123.857000 7046.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 7055.252000 136.007000 7046.252000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 7055.252000 141.794000 7046.252000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 7055.252000 144.665000 7046.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 7055.252000 147.464000 7046.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 7055.252000 153.251000 7046.252000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 7055.252000 156.433000 7046.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7044.752000 79.271000 7035.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 7044.752000 85.094000 7035.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 7044.752000 90.854000 7035.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 7044.752000 96.146000 7035.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 7044.752000 102.302000 7035.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 7044.752000 107.711000 7035.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 7044.752000 113.048000 7035.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 7044.752000 119.204000 7035.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 7044.752000 124.991000 7035.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 7044.752000 130.310000 7035.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 7044.752000 135.647000 7035.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 7044.752000 144.755000 7035.752000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 7044.752000 153.323000 7035.752000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 7044.752000 156.333000 7035.752000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7034.252000 82.160000 7025.252000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 7034.252000 85.067000 7025.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 7034.252000 89.297000 7025.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 7034.252000 94.616000 7025.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 7034.252000 98.747000 7025.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 7034.252000 106.055000 7025.252000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 7034.252000 109.700000 7025.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 7034.252000 115.055000 7025.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 7034.252000 118.601000 7025.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 7034.252000 124.010000 7025.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 7034.252000 128.042000 7025.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 7034.252000 135.998000 7025.252000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 7034.252000 141.785000 7025.252000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 7034.252000 144.656000 7025.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 7034.252000 147.554000 7025.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 7034.252000 153.341000 7025.252000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 7034.252000 156.433000 7025.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7023.752000 79.271000 7014.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 7023.752000 85.094000 7014.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 7023.752000 90.854000 7014.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 7023.752000 93.743000 7014.752000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 7008.900000 0 72.100000 7008.900000 0 72.100000 7122.600000 0 72.000000 7122.600000 0 72.000000 7008.900000 0
+eoFillPath subpath 1 160.500000 7008.900000 0 160.600000 7008.900000 0 160.600000 7122.600000 0 160.500000 7122.600000 0 160.500000 7008.900000 0
+eoFillPath subpath 1 72.000000 7122.500000 0 160.600000 7122.500000 0 160.600000 7122.600000 0 72.000000 7122.600000 0 72.000000 7122.500000 0
+eoFillPath subpath 1 72.000000 7008.900000 0 160.600000 7008.900000 0 160.600000 7009.000000 0 72.000000 7009.000000 0 72.000000 7008.900000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 13198.400000 0 169.600000 13198.400000 0 169.600000 13203.400000 0 76.900000 13203.400000 0 76.900000 13198.400000 0
+eoFillPath subpath 1 164.600000 13203.300000 0 169.600000 13203.300000 0 169.600000 13318.900000 0 164.600000 13318.900000 0 164.600000 13203.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 13203.400000 0 121.400000 13203.400000 0 121.400000 13323.800000 0 72.000000 13323.800000 0 72.000000 13203.400000 0
+saveState
+eoClipPath subpath 1 72.000000 13203.300000 0 164.600000 13203.300000 0 164.600000 13323.700000 0 72.000000 13323.700000 0 72.000000 13203.300000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -1235310.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 13273.300000 0 93.700000 13273.300000 0 93.700000 13292.500000 0 72.000000 13292.500000 0 72.000000 13273.300000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 13273.300000 0 169.600000 13273.300000 0 169.600000 13292.500000 0 93.700000 13292.500000 0 93.700000 13273.300000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 13256.600000 0 93.700000 13256.600000 0 93.700000 13273.300000 0 72.000000 13273.300000 0 72.000000 13256.600000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 13256.600000 0 169.600000 13256.600000 0 169.600000 13273.300000 0 93.700000 13273.300000 0 93.700000 13256.600000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 13237.400000 0 93.700000 13237.400000 0 93.700000 13256.600000 0 72.000000 13256.600000 0 72.000000 13237.400000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 13237.400000 0 169.600000 13237.400000 0 169.600000 13256.600000 0 93.700000 13256.600000 0 93.700000 13237.400000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 13218.200000 0 93.700000 13218.200000 0 93.700000 13237.400000 0 72.000000 13237.400000 0 72.000000 13218.200000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 13218.200000 0 169.600000 13218.200000 0 169.600000 13237.400000 0 93.700000 13237.400000 0 93.700000 13218.200000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 13319.452000 82.898000 13310.452000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 13319.452000 87.200000 13310.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 13319.452000 90.809000 13310.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 13319.452000 93.671000 13310.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 13319.452000 98.315000 13310.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 13319.452000 101.906000 13310.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 13319.452000 106.514000 13310.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 13319.452000 109.754000 13310.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 13319.452000 112.868000 13310.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 13319.452000 118.691000 13310.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 13319.452000 121.850000 13310.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 13319.452000 125.702000 13310.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 13319.452000 131.588000 13310.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 13319.452000 136.907000 13310.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 13319.452000 140.039000 13310.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 13319.452000 146.078000 13310.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 13319.452000 151.442000 13310.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 13319.452000 154.349000 13310.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 13319.452000 157.148000 13310.452000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 13319.452000 160.433000 13310.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 13308.952000 84.095000 13299.952000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 13308.952000 89.468000 13299.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 13308.952000 94.580000 13299.952000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 13308.952000 97.631000 13299.952000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 13288.552000 104.443000 13279.552000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 13288.552000 109.060000 13279.552000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 13288.552000 113.398000 13279.552000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 13288.552000 119.194000 13279.552000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 13288.552000 124.612000 13279.552000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 13288.552000 127.465000 13279.552000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 13271.852000 101.176000 13262.852000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 13271.852000 104.074000 13262.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 13271.852000 109.420000 13262.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 13271.852000 114.442000 13262.852000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 13271.852000 120.202000 13262.852000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 13271.852000 123.811000 13262.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 13271.852000 129.121000 13262.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 13271.852000 134.899000 13262.852000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 13271.852000 139.516000 13262.852000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 13271.852000 143.107000 13262.852000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 13271.852000 148.417000 13262.852000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 13271.852000 151.270000 13262.852000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 13271.852000 157.093000 13262.852000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 13255.152000 103.048000 13246.152000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 13255.152000 108.421000 13246.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 13255.152000 113.443000 13246.152000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 13255.152000 118.852000 13246.152000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 13255.152000 124.702000 13246.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 13255.152000 130.021000 13246.152000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 13255.152000 135.079000 13246.152000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 13235.952000 104.407000 13226.952000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 13235.952000 109.816000 13226.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 13235.952000 115.594000 13226.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 13235.952000 121.354000 13226.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 13235.952000 125.692000 13226.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 13235.952000 128.563000 13226.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 13235.952000 133.954000 13226.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 13235.952000 139.786000 13226.952000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 13203.300000 0 72.100000 13203.300000 0 72.100000 13323.800000 0 72.000000 13323.800000 0 72.000000 13203.300000 0
+eoFillPath subpath 1 164.600000 13203.300000 0 164.700000 13203.300000 0 164.700000 13323.800000 0 164.600000 13323.800000 0 164.600000 13203.300000 0
+eoFillPath subpath 1 72.000000 13323.700000 0 164.700000 13323.700000 0 164.700000 13323.800000 0 72.000000 13323.800000 0 72.000000 13323.700000 0
+eoFillPath subpath 1 72.000000 13203.300000 0 164.700000 13203.300000 0 164.700000 13203.400000 0 72.000000 13203.400000 0 72.000000 13203.300000 0
+eoFillPath subpath 1 91.300000 13218.200000 0 93.700000 13218.200000 0 93.700000 13292.500000 0 91.300000 13292.500000 0 91.300000 13218.200000 0
+eoFillPath subpath 1 72.000000 13237.400000 0 169.600000 13237.400000 0 169.600000 13239.800000 0 72.000000 13239.800000 0 72.000000 13237.400000 0
+eoFillPath subpath 1 72.000000 13290.100000 0 169.600000 13290.100000 0 169.600000 13292.500000 0 72.000000 13292.500000 0 72.000000 13290.100000 0
+eoFillPath subpath 1 72.000000 13218.200000 0 169.600000 13218.200000 0 169.600000 13220.600000 0 72.000000 13220.600000 0 72.000000 13218.200000 0
+saveState
+eoClipPath subpath 1 108.000000 5352.200000 0 150.800000 5352.200000 0 150.800000 5396.500000 0 108.000000 5396.500000 0 108.000000 5352.200000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 -456030.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 4502.300000 0 499.600000 4502.300000 0 499.600000 4507.400000 0 186.800000 4507.400000 0 186.800000 4502.300000 0
+eoFillPath subpath 1 494.500000 4507.300000 0 499.600000 4507.300000 0 499.600000 4695.700000 0 494.500000 4695.700000 0 494.500000 4507.300000 0
+saveState
+eoClipPath subpath 1 181.800000 4507.300000 0 494.500000 4507.300000 0 494.500000 4700.600000 0 181.800000 4700.600000 0 181.800000 4507.300000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 4700.700000 0 494.500000 4700.700000 0 494.500000 4700.700000 0 181.700000 4700.700000 0
+eoFillPath subpath 1 181.700000 4700.700000 0 494.500000 4700.700000 0 494.500000 4699.900000 0 181.700000 4699.900000 0 181.700000 4700.700000 0
+eoFillPath subpath 1 181.700000 4699.900000 0 494.500000 4699.900000 0 494.500000 4699.200000 0 181.700000 4699.200000 0 181.700000 4699.900000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 4699.200000 0 494.500000 4699.200000 0 494.500000 4698.400000 0 181.700000 4698.400000 0 181.700000 4699.200000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 4698.400000 0 494.500000 4698.400000 0 494.500000 4697.600000 0 181.700000 4697.600000 0 181.700000 4698.400000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 4697.600000 0 494.500000 4697.600000 0 494.500000 4696.900000 0 181.700000 4696.900000 0 181.700000 4697.600000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 4696.900000 0 494.500000 4696.900000 0 494.500000 4696.100000 0 181.700000 4696.100000 0 181.700000 4696.900000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 4696.100000 0 494.500000 4696.100000 0 494.500000 4695.400000 0 181.700000 4695.400000 0 181.700000 4696.100000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 4695.400000 0 494.500000 4695.400000 0 494.500000 4694.600000 0 181.700000 4694.600000 0 181.700000 4695.400000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 4694.600000 0 494.500000 4694.600000 0 494.500000 4693.900000 0 181.700000 4693.900000 0 181.700000 4694.600000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 4693.900000 0 494.500000 4693.900000 0 494.500000 4693.100000 0 181.700000 4693.100000 0 181.700000 4693.900000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 4693.100000 0 494.500000 4693.100000 0 494.500000 4692.300000 0 181.700000 4692.300000 0 181.700000 4693.100000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 4692.300000 0 494.500000 4692.300000 0 494.500000 4691.600000 0 181.700000 4691.600000 0 181.700000 4692.300000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 4691.600000 0 494.500000 4691.600000 0 494.500000 4690.800000 0 181.700000 4690.800000 0 181.700000 4691.600000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 4690.800000 0 494.500000 4690.800000 0 494.500000 4690.100000 0 181.700000 4690.100000 0 181.700000 4690.800000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 4690.100000 0 494.500000 4690.100000 0 494.500000 4689.300000 0 181.700000 4689.300000 0 181.700000 4690.100000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 4689.300000 0 494.500000 4689.300000 0 494.500000 4688.500000 0 181.700000 4688.500000 0 181.700000 4689.300000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 4688.500000 0 494.500000 4688.500000 0 494.500000 4687.800000 0 181.700000 4687.800000 0 181.700000 4688.500000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 4687.800000 0 494.500000 4687.800000 0 494.500000 4687.000000 0 181.700000 4687.000000 0 181.700000 4687.800000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 4687.000000 0 494.500000 4687.000000 0 494.500000 4686.300000 0 181.700000 4686.300000 0 181.700000 4687.000000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 4686.300000 0 494.500000 4686.300000 0 494.500000 4685.500000 0 181.700000 4685.500000 0 181.700000 4686.300000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 4685.500000 0 494.500000 4685.500000 0 494.500000 4684.700000 0 181.700000 4684.700000 0 181.700000 4685.500000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 4684.700000 0 494.500000 4684.700000 0 494.500000 4684.000000 0 181.700000 4684.000000 0 181.700000 4684.700000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 4684.000000 0 494.500000 4684.000000 0 494.500000 4683.200000 0 181.700000 4683.200000 0 181.700000 4684.000000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 4683.200000 0 494.500000 4683.200000 0 494.500000 4682.500000 0 181.700000 4682.500000 0 181.700000 4683.200000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 4682.500000 0 494.500000 4682.500000 0 494.500000 4681.700000 0 181.700000 4681.700000 0 181.700000 4682.500000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 4681.700000 0 494.500000 4681.700000 0 494.500000 4681.000000 0 181.700000 4681.000000 0 181.700000 4681.700000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 4681.000000 0 494.500000 4681.000000 0 494.500000 4680.200000 0 181.700000 4680.200000 0 181.700000 4681.000000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 4680.200000 0 494.500000 4680.200000 0 494.500000 4679.400000 0 181.700000 4679.400000 0 181.700000 4680.200000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 4679.400000 0 494.500000 4679.400000 0 494.500000 4678.700000 0 181.700000 4678.700000 0 181.700000 4679.400000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 4678.700000 0 494.500000 4678.700000 0 494.500000 4677.900000 0 181.700000 4677.900000 0 181.700000 4678.700000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 4677.900000 0 494.500000 4677.900000 0 494.500000 4677.200000 0 181.700000 4677.200000 0 181.700000 4677.900000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 4677.200000 0 494.500000 4677.200000 0 494.500000 4676.400000 0 181.700000 4676.400000 0 181.700000 4677.200000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 4676.400000 0 494.500000 4676.400000 0 494.500000 4675.600000 0 181.700000 4675.600000 0 181.700000 4676.400000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 4675.600000 0 494.500000 4675.600000 0 494.500000 4674.900000 0 181.700000 4674.900000 0 181.700000 4675.600000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 4674.900000 0 494.500000 4674.900000 0 494.500000 4674.100000 0 181.700000 4674.100000 0 181.700000 4674.900000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 4674.100000 0 494.500000 4674.100000 0 494.500000 4673.400000 0 181.700000 4673.400000 0 181.700000 4674.100000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 4673.400000 0 494.500000 4673.400000 0 494.500000 4672.600000 0 181.700000 4672.600000 0 181.700000 4673.400000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 4672.600000 0 494.500000 4672.600000 0 494.500000 4671.800000 0 181.700000 4671.800000 0 181.700000 4672.600000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 4671.800000 0 494.500000 4671.800000 0 494.500000 4671.100000 0 181.700000 4671.100000 0 181.700000 4671.800000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 4671.100000 0 494.500000 4671.100000 0 494.500000 4670.300000 0 181.700000 4670.300000 0 181.700000 4671.100000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 4670.300000 0 494.500000 4670.300000 0 494.500000 4669.600000 0 181.700000 4669.600000 0 181.700000 4670.300000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 4669.600000 0 494.500000 4669.600000 0 494.500000 4668.800000 0 181.700000 4668.800000 0 181.700000 4669.600000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 4668.800000 0 494.500000 4668.800000 0 494.500000 4668.100000 0 181.700000 4668.100000 0 181.700000 4668.800000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 4668.100000 0 494.500000 4668.100000 0 494.500000 4667.300000 0 181.700000 4667.300000 0 181.700000 4668.100000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 4667.300000 0 494.500000 4667.300000 0 494.500000 4666.500000 0 181.700000 4666.500000 0 181.700000 4667.300000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 4666.500000 0 494.500000 4666.500000 0 494.500000 4665.800000 0 181.700000 4665.800000 0 181.700000 4666.500000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 4665.800000 0 494.500000 4665.800000 0 494.500000 4665.000000 0 181.700000 4665.000000 0 181.700000 4665.800000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 4665.000000 0 494.500000 4665.000000 0 494.500000 4664.300000 0 181.700000 4664.300000 0 181.700000 4665.000000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 4664.300000 0 494.500000 4664.300000 0 494.500000 4663.500000 0 181.700000 4663.500000 0 181.700000 4664.300000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 4663.500000 0 494.500000 4663.500000 0 494.500000 4662.700000 0 181.700000 4662.700000 0 181.700000 4663.500000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 4662.700000 0 494.500000 4662.700000 0 494.500000 4662.000000 0 181.700000 4662.000000 0 181.700000 4662.700000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 4662.000000 0 494.500000 4662.000000 0 494.500000 4661.200000 0 181.700000 4661.200000 0 181.700000 4662.000000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 4661.200000 0 494.500000 4661.200000 0 494.500000 4660.500000 0 181.700000 4660.500000 0 181.700000 4661.200000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 4660.500000 0 494.500000 4660.500000 0 494.500000 4659.700000 0 181.700000 4659.700000 0 181.700000 4660.500000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 4659.700000 0 494.500000 4659.700000 0 494.500000 4658.900000 0 181.700000 4658.900000 0 181.700000 4659.700000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 4658.900000 0 494.500000 4658.900000 0 494.500000 4658.200000 0 181.700000 4658.200000 0 181.700000 4658.900000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 4658.200000 0 494.500000 4658.200000 0 494.500000 4657.400000 0 181.700000 4657.400000 0 181.700000 4658.200000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 4657.400000 0 494.500000 4657.400000 0 494.500000 4656.700000 0 181.700000 4656.700000 0 181.700000 4657.400000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 4656.700000 0 494.500000 4656.700000 0 494.500000 4655.900000 0 181.700000 4655.900000 0 181.700000 4656.700000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 4655.900000 0 494.500000 4655.900000 0 494.500000 4655.200000 0 181.700000 4655.200000 0 181.700000 4655.900000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 4655.200000 0 494.500000 4655.200000 0 494.500000 4654.400000 0 181.700000 4654.400000 0 181.700000 4655.200000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 4654.400000 0 494.500000 4654.400000 0 494.500000 4653.600000 0 181.700000 4653.600000 0 181.700000 4654.400000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 4653.600000 0 494.500000 4653.600000 0 494.500000 4652.900000 0 181.700000 4652.900000 0 181.700000 4653.600000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 4652.900000 0 494.500000 4652.900000 0 494.500000 4652.100000 0 181.700000 4652.100000 0 181.700000 4652.900000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 4652.100000 0 494.500000 4652.100000 0 494.500000 4651.400000 0 181.700000 4651.400000 0 181.700000 4652.100000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 4651.400000 0 494.500000 4651.400000 0 494.500000 4650.600000 0 181.700000 4650.600000 0 181.700000 4651.400000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 4650.600000 0 494.500000 4650.600000 0 494.500000 4649.800000 0 181.700000 4649.800000 0 181.700000 4650.600000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 4649.800000 0 494.500000 4649.800000 0 494.500000 4649.100000 0 181.700000 4649.100000 0 181.700000 4649.800000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 4649.100000 0 494.500000 4649.100000 0 494.500000 4648.300000 0 181.700000 4648.300000 0 181.700000 4649.100000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 4648.300000 0 494.500000 4648.300000 0 494.500000 4647.600000 0 181.700000 4647.600000 0 181.700000 4648.300000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 4647.600000 0 494.500000 4647.600000 0 494.500000 4646.800000 0 181.700000 4646.800000 0 181.700000 4647.600000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 4646.800000 0 494.500000 4646.800000 0 494.500000 4646.000000 0 181.700000 4646.000000 0 181.700000 4646.800000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 4646.000000 0 494.500000 4646.000000 0 494.500000 4645.300000 0 181.700000 4645.300000 0 181.700000 4646.000000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 4645.300000 0 494.500000 4645.300000 0 494.500000 4644.500000 0 181.700000 4644.500000 0 181.700000 4645.300000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 4644.500000 0 494.500000 4644.500000 0 494.500000 4643.800000 0 181.700000 4643.800000 0 181.700000 4644.500000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 4643.800000 0 494.500000 4643.800000 0 494.500000 4643.000000 0 181.700000 4643.000000 0 181.700000 4643.800000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 4643.000000 0 494.500000 4643.000000 0 494.500000 4642.300000 0 181.700000 4642.300000 0 181.700000 4643.000000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 4642.300000 0 494.500000 4642.300000 0 494.500000 4641.500000 0 181.700000 4641.500000 0 181.700000 4642.300000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 4641.500000 0 494.500000 4641.500000 0 494.500000 4640.700000 0 181.700000 4640.700000 0 181.700000 4641.500000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 4640.700000 0 494.500000 4640.700000 0 494.500000 4640.000000 0 181.700000 4640.000000 0 181.700000 4640.700000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 4640.000000 0 494.500000 4640.000000 0 494.500000 4639.200000 0 181.700000 4639.200000 0 181.700000 4640.000000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 4639.200000 0 494.500000 4639.200000 0 494.500000 4638.500000 0 181.700000 4638.500000 0 181.700000 4639.200000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 4638.500000 0 494.500000 4638.500000 0 494.500000 4637.700000 0 181.700000 4637.700000 0 181.700000 4638.500000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 4637.700000 0 494.500000 4637.700000 0 494.500000 4636.900000 0 181.700000 4636.900000 0 181.700000 4637.700000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 4636.900000 0 494.500000 4636.900000 0 494.500000 4636.200000 0 181.700000 4636.200000 0 181.700000 4636.900000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 4636.200000 0 494.500000 4636.200000 0 494.500000 4635.400000 0 181.700000 4635.400000 0 181.700000 4636.200000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 4635.400000 0 494.500000 4635.400000 0 494.500000 4634.700000 0 181.700000 4634.700000 0 181.700000 4635.400000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 4634.700000 0 494.500000 4634.700000 0 494.500000 4633.900000 0 181.700000 4633.900000 0 181.700000 4634.700000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 4633.900000 0 494.500000 4633.900000 0 494.500000 4633.100000 0 181.700000 4633.100000 0 181.700000 4633.900000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 4633.100000 0 494.500000 4633.100000 0 494.500000 4632.400000 0 181.700000 4632.400000 0 181.700000 4633.100000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 4632.400000 0 494.500000 4632.400000 0 494.500000 4631.600000 0 181.700000 4631.600000 0 181.700000 4632.400000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 4631.600000 0 494.500000 4631.600000 0 494.500000 4630.900000 0 181.700000 4630.900000 0 181.700000 4631.600000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 4630.900000 0 494.500000 4630.900000 0 494.500000 4630.100000 0 181.700000 4630.100000 0 181.700000 4630.900000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 4630.100000 0 494.500000 4630.100000 0 494.500000 4629.400000 0 181.700000 4629.400000 0 181.700000 4630.100000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 4629.400000 0 494.500000 4629.400000 0 494.500000 4628.600000 0 181.700000 4628.600000 0 181.700000 4629.400000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 4628.600000 0 494.500000 4628.600000 0 494.500000 4627.800000 0 181.700000 4627.800000 0 181.700000 4628.600000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 4627.800000 0 494.500000 4627.800000 0 494.500000 4627.100000 0 181.700000 4627.100000 0 181.700000 4627.800000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 4627.100000 0 494.500000 4627.100000 0 494.500000 4626.300000 0 181.700000 4626.300000 0 181.700000 4627.100000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 4626.300000 0 494.500000 4626.300000 0 494.500000 4625.600000 0 181.700000 4625.600000 0 181.700000 4626.300000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 4625.600000 0 494.500000 4625.600000 0 494.500000 4624.800000 0 181.700000 4624.800000 0 181.700000 4625.600000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 4624.800000 0 494.500000 4624.800000 0 494.500000 4624.000000 0 181.700000 4624.000000 0 181.700000 4624.800000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 4624.000000 0 494.500000 4624.000000 0 494.500000 4623.300000 0 181.700000 4623.300000 0 181.700000 4624.000000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 4623.300000 0 494.500000 4623.300000 0 494.500000 4622.500000 0 181.700000 4622.500000 0 181.700000 4623.300000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 4622.500000 0 494.500000 4622.500000 0 494.500000 4621.800000 0 181.700000 4621.800000 0 181.700000 4622.500000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 4621.800000 0 494.500000 4621.800000 0 494.500000 4621.000000 0 181.700000 4621.000000 0 181.700000 4621.800000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 4621.000000 0 494.500000 4621.000000 0 494.500000 4620.200000 0 181.700000 4620.200000 0 181.700000 4621.000000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 4620.200000 0 494.500000 4620.200000 0 494.500000 4619.500000 0 181.700000 4619.500000 0 181.700000 4620.200000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 4619.500000 0 494.500000 4619.500000 0 494.500000 4618.700000 0 181.700000 4618.700000 0 181.700000 4619.500000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 4618.700000 0 494.500000 4618.700000 0 494.500000 4618.000000 0 181.700000 4618.000000 0 181.700000 4618.700000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 4618.000000 0 494.500000 4618.000000 0 494.500000 4617.200000 0 181.700000 4617.200000 0 181.700000 4618.000000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 4617.200000 0 494.500000 4617.200000 0 494.500000 4616.500000 0 181.700000 4616.500000 0 181.700000 4617.200000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 4616.500000 0 494.500000 4616.500000 0 494.500000 4615.700000 0 181.700000 4615.700000 0 181.700000 4616.500000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 4615.700000 0 494.500000 4615.700000 0 494.500000 4614.900000 0 181.700000 4614.900000 0 181.700000 4615.700000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 4614.900000 0 494.500000 4614.900000 0 494.500000 4614.200000 0 181.700000 4614.200000 0 181.700000 4614.900000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 4614.200000 0 494.500000 4614.200000 0 494.500000 4613.400000 0 181.700000 4613.400000 0 181.700000 4614.200000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 4613.400000 0 494.500000 4613.400000 0 494.500000 4612.700000 0 181.700000 4612.700000 0 181.700000 4613.400000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 4612.700000 0 494.500000 4612.700000 0 494.500000 4611.900000 0 181.700000 4611.900000 0 181.700000 4612.700000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 4611.900000 0 494.500000 4611.900000 0 494.500000 4611.100000 0 181.700000 4611.100000 0 181.700000 4611.900000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 4611.100000 0 494.500000 4611.100000 0 494.500000 4610.400000 0 181.700000 4610.400000 0 181.700000 4611.100000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 4610.400000 0 494.500000 4610.400000 0 494.500000 4609.600000 0 181.700000 4609.600000 0 181.700000 4610.400000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 4609.600000 0 494.500000 4609.600000 0 494.500000 4608.900000 0 181.700000 4608.900000 0 181.700000 4609.600000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 4608.900000 0 494.500000 4608.900000 0 494.500000 4608.100000 0 181.700000 4608.100000 0 181.700000 4608.900000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 4608.100000 0 494.500000 4608.100000 0 494.500000 4607.300000 0 181.700000 4607.300000 0 181.700000 4608.100000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 4607.300000 0 494.500000 4607.300000 0 494.500000 4606.600000 0 181.700000 4606.600000 0 181.700000 4607.300000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 4606.600000 0 494.500000 4606.600000 0 494.500000 4605.800000 0 181.700000 4605.800000 0 181.700000 4606.600000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 4605.800000 0 494.500000 4605.800000 0 494.500000 4605.100000 0 181.700000 4605.100000 0 181.700000 4605.800000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 4605.100000 0 494.500000 4605.100000 0 494.500000 4604.300000 0 181.700000 4604.300000 0 181.700000 4605.100000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 4604.300000 0 494.500000 4604.300000 0 494.500000 4603.600000 0 181.700000 4603.600000 0 181.700000 4604.300000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 4603.600000 0 494.500000 4603.600000 0 494.500000 4602.800000 0 181.700000 4602.800000 0 181.700000 4603.600000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 4602.800000 0 494.500000 4602.800000 0 494.500000 4602.000000 0 181.700000 4602.000000 0 181.700000 4602.800000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 4602.000000 0 494.500000 4602.000000 0 494.500000 4601.300000 0 181.700000 4601.300000 0 181.700000 4602.000000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 4601.300000 0 494.500000 4601.300000 0 494.500000 4600.500000 0 181.700000 4600.500000 0 181.700000 4601.300000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 4600.500000 0 494.500000 4600.500000 0 494.500000 4599.800000 0 181.700000 4599.800000 0 181.700000 4600.500000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 4599.800000 0 494.500000 4599.800000 0 494.500000 4599.000000 0 181.700000 4599.000000 0 181.700000 4599.800000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 4599.000000 0 494.500000 4599.000000 0 494.500000 4598.200000 0 181.700000 4598.200000 0 181.700000 4599.000000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 4598.200000 0 494.500000 4598.200000 0 494.500000 4597.500000 0 181.700000 4597.500000 0 181.700000 4598.200000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 4597.500000 0 494.500000 4597.500000 0 494.500000 4596.700000 0 181.700000 4596.700000 0 181.700000 4597.500000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 4596.700000 0 494.500000 4596.700000 0 494.500000 4596.000000 0 181.700000 4596.000000 0 181.700000 4596.700000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 4596.000000 0 494.500000 4596.000000 0 494.500000 4595.200000 0 181.700000 4595.200000 0 181.700000 4596.000000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 4595.200000 0 494.500000 4595.200000 0 494.500000 4594.500000 0 181.700000 4594.500000 0 181.700000 4595.200000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 4594.500000 0 494.500000 4594.500000 0 494.500000 4593.700000 0 181.700000 4593.700000 0 181.700000 4594.500000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 4593.700000 0 494.500000 4593.700000 0 494.500000 4592.900000 0 181.700000 4592.900000 0 181.700000 4593.700000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 4592.900000 0 494.500000 4592.900000 0 494.500000 4592.200000 0 181.700000 4592.200000 0 181.700000 4592.900000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 4592.200000 0 494.500000 4592.200000 0 494.500000 4591.400000 0 181.700000 4591.400000 0 181.700000 4592.200000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 4591.400000 0 494.500000 4591.400000 0 494.500000 4590.700000 0 181.700000 4590.700000 0 181.700000 4591.400000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 4590.700000 0 494.500000 4590.700000 0 494.500000 4589.900000 0 181.700000 4589.900000 0 181.700000 4590.700000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 4589.900000 0 494.500000 4589.900000 0 494.500000 4589.100000 0 181.700000 4589.100000 0 181.700000 4589.900000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 4589.100000 0 494.500000 4589.100000 0 494.500000 4588.400000 0 181.700000 4588.400000 0 181.700000 4589.100000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 4588.400000 0 494.500000 4588.400000 0 494.500000 4587.600000 0 181.700000 4587.600000 0 181.700000 4588.400000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 4587.600000 0 494.500000 4587.600000 0 494.500000 4586.900000 0 181.700000 4586.900000 0 181.700000 4587.600000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 4586.900000 0 494.500000 4586.900000 0 494.500000 4586.100000 0 181.700000 4586.100000 0 181.700000 4586.900000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 4586.100000 0 494.500000 4586.100000 0 494.500000 4585.400000 0 181.700000 4585.400000 0 181.700000 4586.100000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 4585.400000 0 494.500000 4585.400000 0 494.500000 4584.600000 0 181.700000 4584.600000 0 181.700000 4585.400000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 4584.600000 0 494.500000 4584.600000 0 494.500000 4583.800000 0 181.700000 4583.800000 0 181.700000 4584.600000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 4583.800000 0 494.500000 4583.800000 0 494.500000 4583.100000 0 181.700000 4583.100000 0 181.700000 4583.800000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 4583.100000 0 494.500000 4583.100000 0 494.500000 4582.300000 0 181.700000 4582.300000 0 181.700000 4583.100000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 4582.300000 0 494.500000 4582.300000 0 494.500000 4581.600000 0 181.700000 4581.600000 0 181.700000 4582.300000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 4581.600000 0 494.500000 4581.600000 0 494.500000 4580.800000 0 181.700000 4580.800000 0 181.700000 4581.600000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 4580.800000 0 494.500000 4580.800000 0 494.500000 4580.100000 0 181.700000 4580.100000 0 181.700000 4580.800000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 4580.100000 0 494.500000 4580.100000 0 494.500000 4579.300000 0 181.700000 4579.300000 0 181.700000 4580.100000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 4579.300000 0 494.500000 4579.300000 0 494.500000 4578.500000 0 181.700000 4578.500000 0 181.700000 4579.300000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 4578.500000 0 494.500000 4578.500000 0 494.500000 4577.800000 0 181.700000 4577.800000 0 181.700000 4578.500000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 4577.800000 0 494.500000 4577.800000 0 494.500000 4577.000000 0 181.700000 4577.000000 0 181.700000 4577.800000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 4577.000000 0 494.500000 4577.000000 0 494.500000 4576.300000 0 181.700000 4576.300000 0 181.700000 4577.000000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 4576.300000 0 494.500000 4576.300000 0 494.500000 4575.500000 0 181.700000 4575.500000 0 181.700000 4576.300000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 4575.500000 0 494.500000 4575.500000 0 494.500000 4574.700000 0 181.700000 4574.700000 0 181.700000 4575.500000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 4574.700000 0 494.500000 4574.700000 0 494.500000 4574.000000 0 181.700000 4574.000000 0 181.700000 4574.700000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 4574.000000 0 494.500000 4574.000000 0 494.500000 4573.200000 0 181.700000 4573.200000 0 181.700000 4574.000000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 4573.200000 0 494.500000 4573.200000 0 494.500000 4572.500000 0 181.700000 4572.500000 0 181.700000 4573.200000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 4572.500000 0 494.500000 4572.500000 0 494.500000 4571.700000 0 181.700000 4571.700000 0 181.700000 4572.500000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 4571.700000 0 494.500000 4571.700000 0 494.500000 4571.000000 0 181.700000 4571.000000 0 181.700000 4571.700000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 4571.000000 0 494.500000 4571.000000 0 494.500000 4570.200000 0 181.700000 4570.200000 0 181.700000 4571.000000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 4570.200000 0 494.500000 4570.200000 0 494.500000 4569.400000 0 181.700000 4569.400000 0 181.700000 4570.200000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 4569.400000 0 494.500000 4569.400000 0 494.500000 4568.700000 0 181.700000 4568.700000 0 181.700000 4569.400000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 4568.700000 0 494.500000 4568.700000 0 494.500000 4567.900000 0 181.700000 4567.900000 0 181.700000 4568.700000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 4567.900000 0 494.500000 4567.900000 0 494.500000 4567.200000 0 181.700000 4567.200000 0 181.700000 4567.900000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 4567.200000 0 494.500000 4567.200000 0 494.500000 4566.400000 0 181.700000 4566.400000 0 181.700000 4567.200000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 4566.400000 0 494.500000 4566.400000 0 494.500000 4565.600000 0 181.700000 4565.600000 0 181.700000 4566.400000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 4565.600000 0 494.500000 4565.600000 0 494.500000 4564.900000 0 181.700000 4564.900000 0 181.700000 4565.600000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 4564.900000 0 494.500000 4564.900000 0 494.500000 4564.100000 0 181.700000 4564.100000 0 181.700000 4564.900000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 4564.100000 0 494.500000 4564.100000 0 494.500000 4563.400000 0 181.700000 4563.400000 0 181.700000 4564.100000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 4563.400000 0 494.500000 4563.400000 0 494.500000 4562.600000 0 181.700000 4562.600000 0 181.700000 4563.400000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 4562.600000 0 494.500000 4562.600000 0 494.500000 4561.900000 0 181.700000 4561.900000 0 181.700000 4562.600000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 4561.900000 0 494.500000 4561.900000 0 494.500000 4561.100000 0 181.700000 4561.100000 0 181.700000 4561.900000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 4561.100000 0 494.500000 4561.100000 0 494.500000 4560.300000 0 181.700000 4560.300000 0 181.700000 4561.100000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 4560.300000 0 494.500000 4560.300000 0 494.500000 4559.600000 0 181.700000 4559.600000 0 181.700000 4560.300000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 4559.600000 0 494.500000 4559.600000 0 494.500000 4558.800000 0 181.700000 4558.800000 0 181.700000 4559.600000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 4558.800000 0 494.500000 4558.800000 0 494.500000 4558.100000 0 181.700000 4558.100000 0 181.700000 4558.800000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 4558.100000 0 494.500000 4558.100000 0 494.500000 4557.300000 0 181.700000 4557.300000 0 181.700000 4558.100000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 4557.300000 0 494.500000 4557.300000 0 494.500000 4556.500000 0 181.700000 4556.500000 0 181.700000 4557.300000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 4556.500000 0 494.500000 4556.500000 0 494.500000 4555.800000 0 181.700000 4555.800000 0 181.700000 4556.500000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 4555.800000 0 494.500000 4555.800000 0 494.500000 4555.000000 0 181.700000 4555.000000 0 181.700000 4555.800000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 4555.000000 0 494.500000 4555.000000 0 494.500000 4554.300000 0 181.700000 4554.300000 0 181.700000 4555.000000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 4554.300000 0 494.500000 4554.300000 0 494.500000 4553.500000 0 181.700000 4553.500000 0 181.700000 4554.300000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 4553.500000 0 494.500000 4553.500000 0 494.500000 4552.700000 0 181.700000 4552.700000 0 181.700000 4553.500000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 4552.700000 0 494.500000 4552.700000 0 494.500000 4552.000000 0 181.700000 4552.000000 0 181.700000 4552.700000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 4552.000000 0 494.500000 4552.000000 0 494.500000 4551.200000 0 181.700000 4551.200000 0 181.700000 4552.000000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 4551.200000 0 494.500000 4551.200000 0 494.500000 4550.500000 0 181.700000 4550.500000 0 181.700000 4551.200000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 4550.500000 0 494.500000 4550.500000 0 494.500000 4549.700000 0 181.700000 4549.700000 0 181.700000 4550.500000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 4549.700000 0 494.500000 4549.700000 0 494.500000 4549.000000 0 181.700000 4549.000000 0 181.700000 4549.700000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 4549.000000 0 494.500000 4549.000000 0 494.500000 4548.200000 0 181.700000 4548.200000 0 181.700000 4549.000000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 4548.200000 0 494.500000 4548.200000 0 494.500000 4547.400000 0 181.700000 4547.400000 0 181.700000 4548.200000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 4547.400000 0 494.500000 4547.400000 0 494.500000 4546.700000 0 181.700000 4546.700000 0 181.700000 4547.400000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 4546.700000 0 494.500000 4546.700000 0 494.500000 4545.900000 0 181.700000 4545.900000 0 181.700000 4546.700000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 4545.900000 0 494.500000 4545.900000 0 494.500000 4545.200000 0 181.700000 4545.200000 0 181.700000 4545.900000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 4545.200000 0 494.500000 4545.200000 0 494.500000 4544.400000 0 181.700000 4544.400000 0 181.700000 4545.200000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 4544.400000 0 494.500000 4544.400000 0 494.500000 4543.600000 0 181.700000 4543.600000 0 181.700000 4544.400000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 4543.600000 0 494.500000 4543.600000 0 494.500000 4542.900000 0 181.700000 4542.900000 0 181.700000 4543.600000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 4542.900000 0 494.500000 4542.900000 0 494.500000 4542.100000 0 181.700000 4542.100000 0 181.700000 4542.900000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 4542.100000 0 494.500000 4542.100000 0 494.500000 4541.400000 0 181.700000 4541.400000 0 181.700000 4542.100000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 4541.400000 0 494.500000 4541.400000 0 494.500000 4540.600000 0 181.700000 4540.600000 0 181.700000 4541.400000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 4540.600000 0 494.500000 4540.600000 0 494.500000 4539.800000 0 181.700000 4539.800000 0 181.700000 4540.600000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 4539.800000 0 494.500000 4539.800000 0 494.500000 4539.100000 0 181.700000 4539.100000 0 181.700000 4539.800000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 4539.100000 0 494.500000 4539.100000 0 494.500000 4538.300000 0 181.700000 4538.300000 0 181.700000 4539.100000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 4538.300000 0 494.500000 4538.300000 0 494.500000 4537.600000 0 181.700000 4537.600000 0 181.700000 4538.300000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 4537.600000 0 494.500000 4537.600000 0 494.500000 4536.800000 0 181.700000 4536.800000 0 181.700000 4537.600000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 4536.800000 0 494.500000 4536.800000 0 494.500000 4536.100000 0 181.700000 4536.100000 0 181.700000 4536.800000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 4536.100000 0 494.500000 4536.100000 0 494.500000 4535.300000 0 181.700000 4535.300000 0 181.700000 4536.100000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 4535.300000 0 494.500000 4535.300000 0 494.500000 4534.500000 0 181.700000 4534.500000 0 181.700000 4535.300000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 4534.500000 0 494.500000 4534.500000 0 494.500000 4533.800000 0 181.700000 4533.800000 0 181.700000 4534.500000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 4533.800000 0 494.500000 4533.800000 0 494.500000 4533.000000 0 181.700000 4533.000000 0 181.700000 4533.800000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 4533.000000 0 494.500000 4533.000000 0 494.500000 4532.300000 0 181.700000 4532.300000 0 181.700000 4533.000000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 4532.300000 0 494.500000 4532.300000 0 494.500000 4531.500000 0 181.700000 4531.500000 0 181.700000 4532.300000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 4531.500000 0 494.500000 4531.500000 0 494.500000 4530.700000 0 181.700000 4530.700000 0 181.700000 4531.500000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 4530.700000 0 494.500000 4530.700000 0 494.500000 4530.000000 0 181.700000 4530.000000 0 181.700000 4530.700000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 4530.000000 0 494.500000 4530.000000 0 494.500000 4529.200000 0 181.700000 4529.200000 0 181.700000 4530.000000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 4529.200000 0 494.500000 4529.200000 0 494.500000 4528.500000 0 181.700000 4528.500000 0 181.700000 4529.200000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 4528.500000 0 494.500000 4528.500000 0 494.500000 4527.700000 0 181.700000 4527.700000 0 181.700000 4528.500000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 4527.700000 0 494.500000 4527.700000 0 494.500000 4526.900000 0 181.700000 4526.900000 0 181.700000 4527.700000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 4526.900000 0 494.500000 4526.900000 0 494.500000 4526.200000 0 181.700000 4526.200000 0 181.700000 4526.900000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 4526.200000 0 494.500000 4526.200000 0 494.500000 4525.400000 0 181.700000 4525.400000 0 181.700000 4526.200000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 4525.400000 0 494.500000 4525.400000 0 494.500000 4524.700000 0 181.700000 4524.700000 0 181.700000 4525.400000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 4524.700000 0 494.500000 4524.700000 0 494.500000 4523.900000 0 181.700000 4523.900000 0 181.700000 4524.700000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 4523.900000 0 494.500000 4523.900000 0 494.500000 4523.200000 0 181.700000 4523.200000 0 181.700000 4523.900000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 4523.200000 0 494.500000 4523.200000 0 494.500000 4522.400000 0 181.700000 4522.400000 0 181.700000 4523.200000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 4522.400000 0 494.500000 4522.400000 0 494.500000 4521.600000 0 181.700000 4521.600000 0 181.700000 4522.400000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 4521.600000 0 494.500000 4521.600000 0 494.500000 4520.900000 0 181.700000 4520.900000 0 181.700000 4521.600000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 4520.900000 0 494.500000 4520.900000 0 494.500000 4520.100000 0 181.700000 4520.100000 0 181.700000 4520.900000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 4520.100000 0 494.500000 4520.100000 0 494.500000 4519.400000 0 181.700000 4519.400000 0 181.700000 4520.100000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 4519.400000 0 494.500000 4519.400000 0 494.500000 4518.600000 0 181.700000 4518.600000 0 181.700000 4519.400000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 4518.600000 0 494.500000 4518.600000 0 494.500000 4517.800000 0 181.700000 4517.800000 0 181.700000 4518.600000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 4517.800000 0 494.500000 4517.800000 0 494.500000 4517.100000 0 181.700000 4517.100000 0 181.700000 4517.800000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 4517.100000 0 494.500000 4517.100000 0 494.500000 4516.300000 0 181.700000 4516.300000 0 181.700000 4517.100000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 4516.300000 0 494.500000 4516.300000 0 494.500000 4515.600000 0 181.700000 4515.600000 0 181.700000 4516.300000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 4515.600000 0 494.500000 4515.600000 0 494.500000 4514.800000 0 181.700000 4514.800000 0 181.700000 4515.600000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 4514.800000 0 494.500000 4514.800000 0 494.500000 4514.000000 0 181.700000 4514.000000 0 181.700000 4514.800000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 4514.000000 0 494.500000 4514.000000 0 494.500000 4513.300000 0 181.700000 4513.300000 0 181.700000 4514.000000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 4513.300000 0 494.500000 4513.300000 0 494.500000 4512.500000 0 181.700000 4512.500000 0 181.700000 4513.300000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 4512.500000 0 494.500000 4512.500000 0 494.500000 4511.800000 0 181.700000 4511.800000 0 181.700000 4512.500000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 4511.800000 0 494.500000 4511.800000 0 494.500000 4511.000000 0 181.700000 4511.000000 0 181.700000 4511.800000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 4511.000000 0 494.500000 4511.000000 0 494.500000 4510.300000 0 181.700000 4510.300000 0 181.700000 4511.000000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 4510.300000 0 494.500000 4510.300000 0 494.500000 4509.500000 0 181.700000 4509.500000 0 181.700000 4510.300000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 4509.500000 0 494.500000 4509.500000 0 494.500000 4508.700000 0 181.700000 4508.700000 0 181.700000 4509.500000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 4508.700000 0 494.500000 4508.700000 0 494.500000 4508.000000 0 181.700000 4508.000000 0 181.700000 4508.700000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 4508.000000 0 494.500000 4508.000000 0 494.500000 4507.200000 0 181.700000 4507.200000 0 181.700000 4508.000000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 4507.300000 0 181.800000 4507.300000 0 181.800000 4700.600000 0 494.400000 4700.600000 0 494.400000 4507.300000 0 338.100000 4507.300000 0
+strokePath subpath 1 338.100000 4507.300000 0 181.800000 4507.300000 0 181.800000 4700.600000 0 494.400000 4700.600000 0 494.400000 4507.300000 0 338.100000 4507.300000 0
+saveState
+updateCtm 11410.000000 0.000000 0.000000 -8760.000000 20530.000000 -379130.000000
+drawSoftMaskedImage 1142 877 1142 877 JPEG 70955 PPM 3004618
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 4546.324000 215.488000 4538.324000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 4546.324000 220.592000 4538.324000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 4546.324000 225.696000 4538.324000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 4546.324000 230.800000 4538.324000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 4538.724000 241.388000 4530.724000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 4538.724000 246.492000 4530.724000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 4538.724000 251.596000 4530.724000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 4538.724000 256.700000 4530.724000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 4531.024000 267.188000 4523.024000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 4531.024000 272.292000 4523.024000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 4531.024000 277.396000 4523.024000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 4531.024000 282.500000 4523.024000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 4523.424000 293.088000 4515.424000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 4523.424000 298.192000 4515.424000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 4523.424000 303.296000 4515.424000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 4523.424000 308.400000 4515.424000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 4561.324000 202.588000 4553.324000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 4580.624000 201.688000 4572.624000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 4599.924000 195.788000 4591.924000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 4599.924000 200.892000 4591.924000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 4619.324000 194.888000 4611.324000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 4619.324000 199.992000 4611.324000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 4638.624000 193.988000 4630.624000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 4638.624000 199.092000 4630.624000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 4657.924000 193.088000 4649.924000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 4657.924000 198.192000 4649.924000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 4530.024000 330.188000 4522.024000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 4530.024000 332.716000 4522.024000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 4530.024000 337.596000 4522.024000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 4530.024000 341.396000 4522.024000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 4530.024000 346.036000 4522.024000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 4530.024000 350.900000 4522.024000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 4530.024000 355.972000 4522.024000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 4530.024000 359.196000 4522.024000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 4530.024000 362.196000 4522.024000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 4530.024000 367.404000 4522.024000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 4530.024000 371.876000 4522.024000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 4530.024000 375.052000 4522.024000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 4549.524000 361.172000 4541.524000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 4549.524000 364.340000 4541.524000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 4549.524000 367.396000 4541.524000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 4549.524000 372.604000 4541.524000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 4549.524000 379.348000 4541.524000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 4549.524000 384.484000 4541.524000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 4549.524000 389.436000 4541.524000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 4549.524000 392.108000 4541.524000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 4549.524000 395.708000 4541.524000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 4549.524000 397.540000 4541.524000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 4549.524000 402.444000 4541.524000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 4549.524000 406.788000 4541.524000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 4569.124000 392.972000 4561.124000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 4569.124000 398.076000 4561.124000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 4569.124000 403.180000 4561.124000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 4569.124000 405.428000 4561.124000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 4569.124000 410.332000 4561.124000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 4569.124000 414.476000 4561.124000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 4696.692000 305.808000 4682.692000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 4696.692000 314.138000 4682.692000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 4696.692000 320.788000 4682.692000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 4696.692000 328.698000 4682.692000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 4696.692000 336.972000 4682.692000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 4696.692000 344.182000 4682.692000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 4696.692000 349.810000 4682.692000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 4696.692000 354.234000 4682.692000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 4696.692000 362.718000 4682.692000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 4696.692000 367.870000 4682.692000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 4696.692000 372.322000 4682.692000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 4696.692000 382.080000 4682.692000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 4696.692000 388.772000 4682.692000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 4696.692000 397.802000 4682.692000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 4696.692000 402.254000 4682.692000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 4696.692000 407.896000 4682.692000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 4573.800000 0 424.300000 4573.800000 0 424.300000 4634.500000 0 493.600000 4634.500000 0 493.600000 4573.800000 0 458.900000 4573.800000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 4624.900000 0 428.900000 4624.900000 0 428.900000 4630.800000 0 434.800000 4630.800000 0 434.800000 4624.900000 0 431.900000 4624.900000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 4613.800000 0 428.900000 4613.800000 0 428.900000 4619.800000 0 434.800000 4619.800000 0 434.800000 4613.800000 0 431.900000 4613.800000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 4602.700000 0 428.900000 4602.700000 0 428.900000 4608.700000 0 434.800000 4608.700000 0 434.800000 4602.700000 0 431.900000 4602.700000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 4591.600000 0 428.900000 4591.600000 0 428.900000 4597.600000 0 434.800000 4597.600000 0 434.800000 4591.600000 0 431.900000 4591.600000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 4580.500000 0 428.900000 4580.500000 0 428.900000 4586.500000 0 434.800000 4586.500000 0 434.800000 4580.500000 0 431.900000 4580.500000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 4632.024000 443.288000 4624.024000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 4632.024000 445.816000 4624.024000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 4632.024000 450.600000 4624.024000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 4632.024000 454.496000 4624.024000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 4632.024000 459.136000 4624.024000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 4632.024000 464.000000 4624.024000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 4632.024000 468.976000 4624.024000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 4632.024000 472.304000 4624.024000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 4632.024000 475.208000 4624.024000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 4632.024000 480.520000 4624.024000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 4632.024000 484.992000 4624.024000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 4632.024000 488.168000 4624.024000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 4620.924000 443.352000 4612.924000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 4620.924000 447.920000 4612.924000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 4620.924000 452.976000 4612.924000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 4620.924000 457.400000 4612.924000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 4620.924000 462.472000 4612.924000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 4620.924000 465.800000 4612.924000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 4620.924000 468.904000 4612.924000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 4620.924000 473.816000 4612.924000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 4620.924000 478.888000 4612.924000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 4620.924000 482.064000 4612.924000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 4609.824000 442.872000 4601.824000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 4609.824000 446.040000 4601.824000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 4609.824000 448.992000 4601.824000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 4609.824000 454.304000 4601.824000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 4609.824000 461.048000 4601.824000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 4609.824000 466.184000 4601.824000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 4609.824000 471.136000 4601.824000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 4609.824000 473.808000 4601.824000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 4609.824000 477.408000 4601.824000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 4609.824000 479.240000 4601.824000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 4609.824000 484.144000 4601.824000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 4609.824000 488.488000 4601.824000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 4598.724000 443.384000 4590.724000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 4598.724000 448.464000 4590.724000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 4598.724000 453.424000 4590.724000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 4598.724000 456.696000 4590.724000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 4598.724000 459.800000 4590.724000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 4598.724000 462.032000 4590.724000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 4598.724000 466.936000 4590.724000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 4598.724000 471.080000 4590.724000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 4587.624000 443.272000 4579.624000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 4587.624000 448.376000 4579.624000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 4587.624000 453.480000 4579.624000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 4587.624000 455.728000 4579.624000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 4587.624000 460.632000 4579.624000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 4587.624000 464.776000 4579.624000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 1942.700000 0 114.800000 1942.700000 0 114.800000 1985.500000 0 72.000000 1985.500000 0 72.000000 1942.700000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 -115080.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
+startPage 61200.000000 79200.000000
+updateCtm 100.000000 0.000000 0.000000 -100.000000 0.000000 79200.000000
+updateLineDash
+updateFlatness 1
+updateLineJoin 0
+updateLineCap 0
+updateMiterLimit 10.000000
+updateLineWidth 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+clipPath subpath 1 0.000000 0.000000 0 612.000000 0.000000 0 612.000000 792.000000 0 0.000000 792.000000 0 0.000000 0.000000 0
+saveState
+updateLineWidth 0.100000
+saveState
+eoClipPath subpath 1 0.000000 -0.100000 0 612.100000 -0.100000 0 612.100000 792.000000 0 0.000000 792.000000 0 0.000000 -0.100000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 76.600000 701.300000 0 535.500000 701.300000 0 535.500000 720.000000 0 76.600000 720.000000 0 76.600000 701.300000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 76.600000 644.900000 0 291.900000 644.900000 0 291.900000 659.000000 0 76.600000 659.000000 0 76.600000 644.900000 0
+eoFillPath subpath 1 76.600000 519.600000 0 291.900000 519.600000 0 291.900000 533.700000 0 76.600000 533.700000 0 76.600000 519.600000 0
+eoFillPath subpath 1 76.600000 408.200000 0 291.900000 408.200000 0 291.900000 422.300000 0 76.600000 422.300000 0 76.600000 408.200000 0
+eoFillPath subpath 1 76.600000 380.200000 0 291.900000 380.200000 0 291.900000 394.300000 0 76.600000 394.300000 0 76.600000 380.200000 0
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 108 1 0 0 0 1600.000000 0 CAAAAA+DejaVuSans
+drawChar 76.700000 719.948000 81.404000 703.948000 1.000000 0.000000 0.000000 1.000000 I
+drawChar 81.404000 719.948000 91.532000 703.948000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 91.500000 719.948000 101.644000 703.948000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 101.708000 719.948000 111.548000 703.948000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.308000 719.948000 120.764000 703.948000 1.000000 0.000000 0.000000 1.000000 x
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 672.936000 84.692000 660.936000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 84.704000 672.936000 90.440000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 90.404000 672.936000 97.496000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 97.508000 672.936000 104.600000 660.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.612000 672.936000 109.052000 660.936000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 109.016000 672.936000 114.752000 660.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 114.716000 672.936000 121.940000 660.936000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 121.916000 672.936000 129.596000 660.936000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 129.620000 672.936000 135.776000 660.936000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 135.800000 672.936000 139.604000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 139.604000 672.936000 143.408000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 143.408000 672.936000 147.212000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 147.212000 672.936000 151.016000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 151.016000 672.936000 154.820000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.820000 672.936000 158.624000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.624000 672.936000 162.428000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.428000 672.936000 166.232000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 166.232000 672.936000 170.036000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 170.036000 672.936000 173.840000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.840000 672.936000 177.644000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.644000 672.936000 181.448000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.448000 672.936000 185.252000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.252000 672.936000 189.056000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 189.056000 672.936000 192.860000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.860000 672.936000 196.664000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.664000 672.936000 200.468000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.468000 672.936000 204.272000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.272000 672.936000 208.076000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 208.076000 672.936000 211.880000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.880000 672.936000 215.684000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.684000 672.936000 219.488000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.488000 672.936000 223.292000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.292000 672.936000 227.096000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.096000 672.936000 230.900000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.900000 672.936000 234.704000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.704000 672.936000 238.508000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.508000 672.936000 242.312000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.312000 672.936000 246.116000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.116000 672.936000 249.920000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.920000 672.936000 253.724000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.724000 672.936000 257.528000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.528000 672.936000 261.332000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.332000 672.936000 265.136000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.136000 672.936000 268.940000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.940000 672.936000 272.744000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.744000 672.936000 276.548000 660.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 672.936000 284.332000 660.936000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 672.936000 291.928000 660.936000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 658.956000 86.000000 646.956000 1.000000 0.000000 0.000000 1.000000 V
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 644.936000 85.364000 632.936000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 84.296000 644.936000 91.448000 632.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 91.496000 644.936000 98.216000 632.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 98.192000 644.936000 105.920000 632.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 105.896000 644.936000 113.624000 632.936000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 113.600000 644.936000 124.976000 632.936000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 125.000000 644.936000 128.804000 632.936000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.804000 644.936000 135.524000 632.936000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.500000 644.936000 139.328000 632.936000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.304000 644.936000 146.396000 632.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.408000 644.936000 153.560000 632.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 153.608000 644.936000 161.336000 632.936000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 161.312000 644.936000 168.404000 632.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 168.416000 644.936000 174.152000 632.936000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 174.100000 644.936000 177.904000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.904000 644.936000 181.708000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.708000 644.936000 185.512000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.512000 644.936000 189.316000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 189.316000 644.936000 193.120000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 193.120000 644.936000 196.924000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.924000 644.936000 200.728000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.728000 644.936000 204.532000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.532000 644.936000 208.336000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 208.336000 644.936000 212.140000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 212.140000 644.936000 215.944000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.944000 644.936000 219.748000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.748000 644.936000 223.552000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.552000 644.936000 227.356000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.356000 644.936000 231.160000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.160000 644.936000 234.964000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.964000 644.936000 238.768000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.768000 644.936000 242.572000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.572000 644.936000 246.376000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.376000 644.936000 250.180000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.180000 644.936000 253.984000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.984000 644.936000 257.788000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.788000 644.936000 261.592000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.592000 644.936000 265.396000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.396000 644.936000 269.200000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.200000 644.936000 273.004000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.004000 644.936000 276.808000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.808000 644.936000 280.612000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.612000 644.936000 284.416000 632.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 644.936000 292.032000 632.936000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 631.036000 85.364000 619.036000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 84.296000 631.036000 91.388000 619.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.400000 631.036000 99.080000 619.036000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 99.104000 631.036000 106.196000 619.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 106.208000 631.036000 111.020000 619.036000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 111.008000 631.036000 118.160000 619.036000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 118.208000 631.036000 125.888000 619.036000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 125.912000 631.036000 129.740000 619.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 129.716000 631.036000 136.808000 619.036000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.820000 631.036000 142.976000 619.036000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 142.800000 631.036000 146.604000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 146.604000 631.036000 150.408000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 150.408000 631.036000 154.212000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.212000 631.036000 158.016000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.016000 631.036000 161.820000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.820000 631.036000 165.624000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.624000 631.036000 169.428000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.428000 631.036000 173.232000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.232000 631.036000 177.036000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.036000 631.036000 180.840000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.840000 631.036000 184.644000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.644000 631.036000 188.448000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.448000 631.036000 192.252000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.252000 631.036000 196.056000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.056000 631.036000 199.860000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.860000 631.036000 203.664000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.664000 631.036000 207.468000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.468000 631.036000 211.272000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.272000 631.036000 215.076000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.076000 631.036000 218.880000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.880000 631.036000 222.684000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.684000 631.036000 226.488000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.488000 631.036000 230.292000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.292000 631.036000 234.096000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.096000 631.036000 237.900000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.900000 631.036000 241.704000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.704000 631.036000 245.508000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.508000 631.036000 249.312000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.312000 631.036000 253.116000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.116000 631.036000 256.920000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.920000 631.036000 260.724000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.724000 631.036000 264.528000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.528000 631.036000 268.332000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.332000 631.036000 272.136000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.136000 631.036000 275.940000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.940000 631.036000 279.744000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.744000 631.036000 283.548000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 283.548000 631.036000 287.352000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 287.352000 631.036000 291.156000 619.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 617.136000 100.628000 605.136000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 100.604000 617.136000 108.332000 605.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.308000 617.136000 112.136000 605.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.112000 617.136000 119.336000 605.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 119.312000 617.136000 127.040000 605.136000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 127.016000 617.136000 133.172000 605.136000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 133.200000 617.136000 137.004000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.100000 617.136000 140.904000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.000000 617.136000 144.804000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.900000 617.136000 148.704000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.800000 617.136000 152.604000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.700000 617.136000 156.504000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.600000 617.136000 160.404000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.500000 617.136000 164.304000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.400000 617.136000 168.204000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.300000 617.136000 172.104000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.200000 617.136000 176.004000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.100000 617.136000 179.904000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.000000 617.136000 183.804000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.900000 617.136000 187.704000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.800000 617.136000 191.604000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.700000 617.136000 195.504000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.600000 617.136000 199.404000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.500000 617.136000 203.304000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.400000 617.136000 207.204000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.300000 617.136000 211.104000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.200000 617.136000 215.004000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.100000 617.136000 218.904000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.000000 617.136000 222.804000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.900000 617.136000 226.704000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.800000 617.136000 230.604000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.700000 617.136000 234.504000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.600000 617.136000 238.404000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.500000 617.136000 242.304000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.400000 617.136000 246.204000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.300000 617.136000 250.104000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.200000 617.136000 254.004000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.100000 617.136000 257.904000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.000000 617.136000 261.804000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.900000 617.136000 265.704000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.800000 617.136000 269.604000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.700000 617.136000 273.504000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.600000 617.136000 277.404000 605.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 617.136000 284.332000 605.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 617.136000 291.928000 605.136000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 603.236000 99.824000 591.236000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 100.100000 603.236000 107.252000 591.236000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.300000 603.236000 114.980000 591.236000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 115.004000 603.236000 118.832000 591.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 118.808000 603.236000 124.964000 591.236000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.012000 603.236000 132.740000 591.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.716000 603.236000 139.808000 591.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 139.820000 603.236000 145.976000 591.236000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 145.800000 603.236000 149.604000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.604000 603.236000 153.408000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.408000 603.236000 157.212000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.212000 603.236000 161.016000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.016000 603.236000 164.820000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.820000 603.236000 168.624000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.624000 603.236000 172.428000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.428000 603.236000 176.232000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.232000 603.236000 180.036000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.036000 603.236000 183.840000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.840000 603.236000 187.644000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.644000 603.236000 191.448000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.448000 603.236000 195.252000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.252000 603.236000 199.056000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.056000 603.236000 202.860000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.860000 603.236000 206.664000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.664000 603.236000 210.468000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.468000 603.236000 214.272000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.272000 603.236000 218.076000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.076000 603.236000 221.880000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.880000 603.236000 225.684000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.684000 603.236000 229.488000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.488000 603.236000 233.292000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.292000 603.236000 237.096000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.096000 603.236000 240.900000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.900000 603.236000 244.704000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.704000 603.236000 248.508000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.508000 603.236000 252.312000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.312000 603.236000 256.116000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.116000 603.236000 259.920000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 259.920000 603.236000 263.724000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.724000 603.236000 267.528000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.528000 603.236000 271.332000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.332000 603.236000 275.136000 591.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 603.236000 284.332000 591.236000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 603.236000 291.928000 591.236000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 589.336000 99.824000 577.336000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 99.800000 589.336000 107.528000 577.336000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 107.504000 589.336000 115.232000 577.336000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 115.208000 589.336000 122.888000 577.336000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 122.912000 589.336000 130.064000 577.336000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 130.112000 589.336000 135.848000 577.336000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.812000 589.336000 143.492000 577.336000 1.000000 0.000000 0.000000 1.000000 b
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 143.400000 589.336000 147.204000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 147.204000 589.336000 151.008000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 151.008000 589.336000 154.812000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.812000 589.336000 158.616000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.616000 589.336000 162.420000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.420000 589.336000 166.224000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 166.224000 589.336000 170.028000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 170.028000 589.336000 173.832000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.832000 589.336000 177.636000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.636000 589.336000 181.440000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.440000 589.336000 185.244000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.244000 589.336000 189.048000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 189.048000 589.336000 192.852000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.852000 589.336000 196.656000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.656000 589.336000 200.460000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.460000 589.336000 204.264000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.264000 589.336000 208.068000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 208.068000 589.336000 211.872000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.872000 589.336000 215.676000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.676000 589.336000 219.480000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.480000 589.336000 223.284000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.284000 589.336000 227.088000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.088000 589.336000 230.892000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.892000 589.336000 234.696000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.696000 589.336000 238.500000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.500000 589.336000 242.304000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.304000 589.336000 246.108000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.108000 589.336000 249.912000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.912000 589.336000 253.716000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.716000 589.336000 257.520000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.520000 589.336000 261.324000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.324000 589.336000 265.128000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.128000 589.336000 268.932000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.932000 589.336000 272.736000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.736000 589.336000 276.540000 577.336000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 589.336000 284.332000 577.336000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 589.336000 291.928000 577.336000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 575.436000 99.128000 563.436000 1.000000 0.000000 0.000000 1.000000 Z
+drawChar 99.104000 575.436000 106.832000 563.436000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 106.808000 575.436000 113.528000 563.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.504000 575.436000 120.224000 563.436000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.200000 575.436000 127.928000 563.436000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 127.904000 575.436000 131.732000 563.436000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 131.708000 575.436000 139.436000 563.436000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 139.412000 575.436000 143.240000 563.436000 1.000000 0.000000 0.000000 1.000000 i
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 143.300000 575.436000 147.104000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 147.104000 575.436000 150.908000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 150.908000 575.436000 154.712000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.712000 575.436000 158.516000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.516000 575.436000 162.320000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.320000 575.436000 166.124000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 166.124000 575.436000 169.928000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.928000 575.436000 173.732000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.732000 575.436000 177.536000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.536000 575.436000 181.340000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.340000 575.436000 185.144000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.144000 575.436000 188.948000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.948000 575.436000 192.752000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.752000 575.436000 196.556000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.556000 575.436000 200.360000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.360000 575.436000 204.164000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.164000 575.436000 207.968000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.968000 575.436000 211.772000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.772000 575.436000 215.576000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.576000 575.436000 219.380000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.380000 575.436000 223.184000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.184000 575.436000 226.988000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.988000 575.436000 230.792000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.792000 575.436000 234.596000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.596000 575.436000 238.400000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.400000 575.436000 242.204000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.204000 575.436000 246.008000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.008000 575.436000 249.812000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.812000 575.436000 253.616000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.616000 575.436000 257.420000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.420000 575.436000 261.224000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.224000 575.436000 265.028000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.028000 575.436000 268.832000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.832000 575.436000 272.636000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.636000 575.436000 276.440000 563.436000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 575.436000 284.332000 563.436000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 575.436000 291.928000 563.436000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 561.536000 85.364000 549.536000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 85.196000 561.536000 89.024000 549.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 89.000000 561.536000 95.720000 549.536000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 95.696000 561.536000 100.508000 549.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 100.496000 561.536000 107.720000 549.536000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 107.696000 561.536000 113.432000 549.536000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.396000 561.536000 117.224000 549.536000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 117.200000 561.536000 124.352000 549.536000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 124.400000 561.536000 132.128000 549.536000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 132.104000 561.536000 135.908000 549.536000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.908000 561.536000 142.064000 549.536000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 142.112000 561.536000 146.924000 549.536000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 146.912000 561.536000 153.680000 549.536000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 153.716000 561.536000 157.544000 549.536000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 157.520000 561.536000 164.612000 549.536000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 164.600000 561.536000 168.404000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.500000 561.536000 172.304000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.400000 561.536000 176.204000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.300000 561.536000 180.104000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.200000 561.536000 184.004000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.100000 561.536000 187.904000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.000000 561.536000 191.804000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.900000 561.536000 195.704000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.800000 561.536000 199.604000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.700000 561.536000 203.504000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.600000 561.536000 207.404000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.500000 561.536000 211.304000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.400000 561.536000 215.204000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.300000 561.536000 219.104000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.200000 561.536000 223.004000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.100000 561.536000 226.904000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.000000 561.536000 230.804000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.900000 561.536000 234.704000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.800000 561.536000 238.604000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.700000 561.536000 242.504000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.600000 561.536000 246.404000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.500000 561.536000 250.304000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.400000 561.536000 254.204000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.300000 561.536000 258.104000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.200000 561.536000 262.004000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.100000 561.536000 265.904000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.000000 561.536000 269.804000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.900000 561.536000 273.704000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.800000 561.536000 277.604000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.700000 561.536000 281.504000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.600000 561.536000 285.404000 549.536000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 561.536000 292.032000 549.536000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 547.636000 85.364000 535.636000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 85.196000 547.636000 89.024000 535.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 89.000000 547.636000 92.828000 535.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.804000 547.636000 96.632000 535.636000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 96.608000 547.636000 103.760000 535.636000 1.000000 0.000000 0.000000 1.000000 a
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 103.700000 547.636000 107.504000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 107.504000 547.636000 111.308000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 111.308000 547.636000 115.112000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 115.112000 547.636000 118.916000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 118.916000 547.636000 122.720000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 122.720000 547.636000 126.524000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 126.524000 547.636000 130.328000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 130.328000 547.636000 134.132000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 134.132000 547.636000 137.936000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.936000 547.636000 141.740000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.740000 547.636000 145.544000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.544000 547.636000 149.348000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.348000 547.636000 153.152000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.152000 547.636000 156.956000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.956000 547.636000 160.760000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.760000 547.636000 164.564000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.564000 547.636000 168.368000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.368000 547.636000 172.172000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.172000 547.636000 175.976000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.976000 547.636000 179.780000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.780000 547.636000 183.584000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.584000 547.636000 187.388000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.388000 547.636000 191.192000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.192000 547.636000 194.996000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 194.996000 547.636000 198.800000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.800000 547.636000 202.604000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.604000 547.636000 206.408000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.408000 547.636000 210.212000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.212000 547.636000 214.016000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.016000 547.636000 217.820000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 217.820000 547.636000 221.624000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.624000 547.636000 225.428000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.428000 547.636000 229.232000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.232000 547.636000 233.036000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.036000 547.636000 236.840000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 236.840000 547.636000 240.644000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 240.644000 547.636000 244.448000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.448000 547.636000 248.252000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.252000 547.636000 252.056000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.056000 547.636000 255.860000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 255.860000 547.636000 259.664000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 259.664000 547.636000 263.468000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.468000 547.636000 267.272000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.272000 547.636000 271.076000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.076000 547.636000 274.880000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 274.880000 547.636000 278.684000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 278.684000 547.636000 282.488000 535.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 547.636000 292.032000 535.636000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 533.656000 90.176000 521.656000 1.000000 0.000000 0.000000 1.000000 W
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 519.636000 89.024000 507.636000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 88.004000 519.636000 95.156000 507.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 95.204000 519.636000 101.360000 507.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 101.408000 519.636000 109.136000 507.636000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.112000 519.636000 116.792000 507.636000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 116.816000 519.636000 123.968000 507.636000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 124.016000 519.636000 130.172000 507.636000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 130.220000 519.636000 134.048000 507.636000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 134.024000 519.636000 141.752000 507.636000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 141.500000 519.636000 145.304000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.400000 519.636000 149.204000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.300000 519.636000 153.104000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.200000 519.636000 157.004000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.100000 519.636000 160.904000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.000000 519.636000 164.804000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.900000 519.636000 168.704000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.800000 519.636000 172.604000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.700000 519.636000 176.504000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.600000 519.636000 180.404000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.500000 519.636000 184.304000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.400000 519.636000 188.204000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.300000 519.636000 192.104000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.200000 519.636000 196.004000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.100000 519.636000 199.904000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.000000 519.636000 203.804000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.900000 519.636000 207.704000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.800000 519.636000 211.604000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.700000 519.636000 215.504000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.600000 519.636000 219.404000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.500000 519.636000 223.304000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.400000 519.636000 227.204000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.300000 519.636000 231.104000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.200000 519.636000 235.004000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 235.100000 519.636000 238.904000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 239.000000 519.636000 242.804000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.900000 519.636000 246.704000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.800000 519.636000 250.604000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.700000 519.636000 254.504000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.600000 519.636000 258.404000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.500000 519.636000 262.304000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.400000 519.636000 266.204000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.300000 519.636000 270.104000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.200000 519.636000 274.004000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 274.100000 519.636000 277.904000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 278.000000 519.636000 281.804000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.900000 519.636000 285.704000 507.636000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 519.636000 292.032000 507.636000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 505.736000 89.024000 493.736000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 88.004000 505.736000 95.156000 493.736000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 95.204000 505.736000 101.360000 493.736000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 101.408000 505.736000 109.136000 493.736000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.112000 505.736000 116.204000 493.736000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 116.216000 505.736000 121.952000 493.736000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 121.800000 505.736000 125.604000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 125.700000 505.736000 129.504000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 129.600000 505.736000 133.404000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.500000 505.736000 137.304000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.400000 505.736000 141.204000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 141.300000 505.736000 145.104000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.200000 505.736000 149.004000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.100000 505.736000 152.904000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.000000 505.736000 156.804000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.900000 505.736000 160.704000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.800000 505.736000 164.604000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.700000 505.736000 168.504000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.600000 505.736000 172.404000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.500000 505.736000 176.304000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.400000 505.736000 180.204000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.300000 505.736000 184.104000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.200000 505.736000 188.004000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.100000 505.736000 191.904000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.000000 505.736000 195.804000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.900000 505.736000 199.704000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.800000 505.736000 203.604000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.700000 505.736000 207.504000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.600000 505.736000 211.404000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.500000 505.736000 215.304000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.400000 505.736000 219.204000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.300000 505.736000 223.104000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.200000 505.736000 227.004000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.100000 505.736000 230.904000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.000000 505.736000 234.804000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.900000 505.736000 238.704000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.800000 505.736000 242.604000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.700000 505.736000 246.504000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.600000 505.736000 250.404000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.500000 505.736000 254.304000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.400000 505.736000 258.204000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 258.300000 505.736000 262.104000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 262.200000 505.736000 266.004000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 266.100000 505.736000 269.904000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 270.000000 505.736000 273.804000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.900000 505.736000 277.704000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 277.800000 505.736000 281.604000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 281.700000 505.736000 285.504000 493.736000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 505.736000 292.032000 493.736000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 491.836000 89.024000 479.836000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 88.004000 491.836000 95.156000 479.836000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 95.204000 491.836000 100.016000 479.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 100.004000 491.836000 107.096000 479.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.108000 491.836000 112.844000 479.836000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.808000 491.836000 116.612000 479.836000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.612000 491.836000 120.332000 479.836000 1.000000 0.000000 0.000000 1.000000 j
+drawChar 120.308000 491.836000 127.400000 479.836000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.412000 491.836000 132.224000 479.836000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.212000 491.836000 138.368000 479.836000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 138.300000 491.836000 142.104000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 142.104000 491.836000 145.908000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 145.908000 491.836000 149.712000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 149.712000 491.836000 153.516000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 153.516000 491.836000 157.320000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 157.320000 491.836000 161.124000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.124000 491.836000 164.928000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.928000 491.836000 168.732000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.732000 491.836000 172.536000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.536000 491.836000 176.340000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.340000 491.836000 180.144000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.144000 491.836000 183.948000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.948000 491.836000 187.752000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.752000 491.836000 191.556000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.556000 491.836000 195.360000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.360000 491.836000 199.164000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.164000 491.836000 202.968000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.968000 491.836000 206.772000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.772000 491.836000 210.576000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.576000 491.836000 214.380000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.380000 491.836000 218.184000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.184000 491.836000 221.988000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 221.988000 491.836000 225.792000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 225.792000 491.836000 229.596000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 229.596000 491.836000 233.400000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 233.400000 491.836000 237.204000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.204000 491.836000 241.008000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.008000 491.836000 244.812000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 244.812000 491.836000 248.616000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 248.616000 491.836000 252.420000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 252.420000 491.836000 256.224000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.224000 491.836000 260.028000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.028000 491.836000 263.832000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 263.832000 491.836000 267.636000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 267.636000 491.836000 271.440000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 271.440000 491.836000 275.244000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.244000 491.836000 279.048000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.048000 491.836000 282.852000 479.836000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 491.836000 292.032000 479.836000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 477.936000 89.024000 465.936000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 88.004000 477.936000 95.156000 465.936000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 95.204000 477.936000 100.016000 465.936000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 100.004000 477.936000 107.096000 465.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.108000 477.936000 112.844000 465.936000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.808000 477.936000 120.488000 465.936000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 120.512000 477.936000 127.604000 465.936000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.616000 477.936000 135.296000 465.936000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 135.200000 477.936000 139.004000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 139.004000 477.936000 142.808000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 142.808000 477.936000 146.612000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 146.612000 477.936000 150.416000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 150.416000 477.936000 154.220000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 154.220000 477.936000 158.024000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.024000 477.936000 161.828000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 161.828000 477.936000 165.632000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 165.632000 477.936000 169.436000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 169.436000 477.936000 173.240000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 173.240000 477.936000 177.044000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.044000 477.936000 180.848000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 180.848000 477.936000 184.652000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 184.652000 477.936000 188.456000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 188.456000 477.936000 192.260000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 192.260000 477.936000 196.064000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.064000 477.936000 199.868000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.868000 477.936000 203.672000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.672000 477.936000 207.476000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.476000 477.936000 211.280000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.280000 477.936000 215.084000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.084000 477.936000 218.888000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.888000 477.936000 222.692000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.692000 477.936000 226.496000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.496000 477.936000 230.300000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.300000 477.936000 234.104000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.104000 477.936000 237.908000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.908000 477.936000 241.712000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.712000 477.936000 245.516000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.516000 477.936000 249.320000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.320000 477.936000 253.124000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.124000 477.936000 256.928000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 256.928000 477.936000 260.732000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 260.732000 477.936000 264.536000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 264.536000 477.936000 268.340000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 268.340000 477.936000 272.144000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.144000 477.936000 275.948000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 275.948000 477.936000 279.752000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 279.752000 477.936000 283.556000 465.936000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 477.936000 292.032000 465.936000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 464.036000 89.024000 452.036000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.000000 464.036000 96.728000 452.036000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 96.704000 464.036000 100.532000 452.036000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 100.508000 464.036000 106.244000 452.036000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 106.208000 464.036000 110.036000 452.036000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.012000 464.036000 117.692000 452.036000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 117.716000 464.036000 124.940000 452.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.916000 464.036000 132.140000 452.036000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 132.116000 464.036000 135.944000 452.036000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 136.000000 464.036000 139.804000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 139.804000 464.036000 143.608000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 143.608000 464.036000 147.412000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 147.412000 464.036000 151.216000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 151.216000 464.036000 155.020000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 155.020000 464.036000 158.824000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 158.824000 464.036000 162.628000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 162.628000 464.036000 166.432000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 166.432000 464.036000 170.236000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 170.236000 464.036000 174.040000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 174.040000 464.036000 177.844000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 177.844000 464.036000 181.648000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 181.648000 464.036000 185.452000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 185.452000 464.036000 189.256000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 189.256000 464.036000 193.060000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 193.060000 464.036000 196.864000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 196.864000 464.036000 200.668000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 200.668000 464.036000 204.472000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 204.472000 464.036000 208.276000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 208.276000 464.036000 212.080000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 212.080000 464.036000 215.884000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.884000 464.036000 219.688000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 219.688000 464.036000 223.492000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 223.492000 464.036000 227.296000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 227.296000 464.036000 231.100000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 231.100000 464.036000 234.904000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.904000 464.036000 238.708000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.708000 464.036000 242.512000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.512000 464.036000 246.316000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.316000 464.036000 250.120000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.120000 464.036000 253.924000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.924000 464.036000 257.728000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.728000 464.036000 261.532000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.532000 464.036000 265.336000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.336000 464.036000 269.140000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.140000 464.036000 272.944000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 272.944000 464.036000 276.748000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.748000 464.036000 280.552000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.552000 464.036000 284.356000 452.036000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 464.036000 292.032000 452.036000 1.000000 0.000000 0.000000 1.000000 9
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 450.136000 89.024000 438.136000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 88.796000 450.136000 92.624000 438.136000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.600000 450.136000 96.428000 438.136000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 96.404000 450.136000 104.084000 438.136000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 104.108000 450.136000 112.100000 438.136000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 112.112000 450.136000 119.336000 438.136000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 119.312000 450.136000 129.572000 438.136000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 129.608000 450.136000 136.700000 438.136000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.712000 450.136000 142.448000 438.136000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 142.412000 450.136000 148.568000 438.136000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 148.600000 450.136000 152.404000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.500000 450.136000 156.304000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.400000 450.136000 160.204000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.300000 450.136000 164.104000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.200000 450.136000 168.004000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.100000 450.136000 171.904000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.000000 450.136000 175.804000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.900000 450.136000 179.704000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.800000 450.136000 183.604000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.700000 450.136000 187.504000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.600000 450.136000 191.404000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.500000 450.136000 195.304000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.400000 450.136000 199.204000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.300000 450.136000 203.104000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.200000 450.136000 207.004000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.100000 450.136000 210.904000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.000000 450.136000 214.804000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.900000 450.136000 218.704000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.800000 450.136000 222.604000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.700000 450.136000 226.504000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.600000 450.136000 230.404000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.500000 450.136000 234.304000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.400000 450.136000 238.204000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.300000 450.136000 242.104000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.200000 450.136000 246.004000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.100000 450.136000 249.904000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.000000 450.136000 253.804000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.900000 450.136000 257.704000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.800000 450.136000 261.604000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.700000 450.136000 265.504000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.600000 450.136000 269.404000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.500000 450.136000 273.304000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.400000 450.136000 277.204000 438.136000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 450.136000 284.332000 438.136000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 450.136000 291.928000 438.136000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 436.236000 89.024000 424.236000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 88.496000 436.236000 94.232000 424.236000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 94.196000 436.236000 101.288000 424.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 101.300000 436.236000 109.028000 424.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.004000 436.236000 115.724000 424.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 115.700000 436.236000 123.428000 424.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 123.404000 436.236000 130.496000 424.236000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.508000 436.236000 136.664000 424.236000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 136.700000 436.236000 140.504000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 140.600000 436.236000 144.404000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.500000 436.236000 148.304000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.400000 436.236000 152.204000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.300000 436.236000 156.104000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.200000 436.236000 160.004000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.100000 436.236000 163.904000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.000000 436.236000 167.804000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 167.900000 436.236000 171.704000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 171.800000 436.236000 175.604000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.700000 436.236000 179.504000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.600000 436.236000 183.404000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.500000 436.236000 187.304000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.400000 436.236000 191.204000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.300000 436.236000 195.104000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.200000 436.236000 199.004000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.100000 436.236000 202.904000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.000000 436.236000 206.804000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.900000 436.236000 210.704000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.800000 436.236000 214.604000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.700000 436.236000 218.504000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.600000 436.236000 222.404000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.500000 436.236000 226.304000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.400000 436.236000 230.204000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.300000 436.236000 234.104000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.200000 436.236000 238.004000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.100000 436.236000 241.904000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.000000 436.236000 245.804000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.900000 436.236000 249.704000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.800000 436.236000 253.604000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.700000 436.236000 257.504000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.600000 436.236000 261.404000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.500000 436.236000 265.304000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.400000 436.236000 269.204000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.300000 436.236000 273.104000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.200000 436.236000 277.004000 424.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 436.236000 284.332000 424.236000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 436.236000 291.928000 424.236000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 422.256000 86.000000 410.256000 1.000000 0.000000 0.000000 1.000000 X
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 408.236000 85.232000 396.236000 1.000000 0.000000 0.000000 1.000000 X
+drawChar 85.196000 408.236000 91.964000 396.236000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 92.000000 408.236000 95.828000 396.236000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.804000 408.236000 103.028000 396.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 103.004000 408.236000 110.684000 396.236000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 110.708000 408.236000 118.436000 396.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 118.412000 408.236000 125.636000 396.236000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 125.612000 408.236000 133.340000 396.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 133.316000 408.236000 140.408000 396.236000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 140.400000 408.236000 144.204000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.300000 408.236000 148.104000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.200000 408.236000 152.004000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.100000 408.236000 155.904000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.000000 408.236000 159.804000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 159.900000 408.236000 163.704000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 163.800000 408.236000 167.604000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 167.700000 408.236000 171.504000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 171.600000 408.236000 175.404000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 175.500000 408.236000 179.304000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.400000 408.236000 183.204000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.300000 408.236000 187.104000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.200000 408.236000 191.004000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.100000 408.236000 194.904000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.000000 408.236000 198.804000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 198.900000 408.236000 202.704000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 202.800000 408.236000 206.604000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 206.700000 408.236000 210.504000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 210.600000 408.236000 214.404000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 214.500000 408.236000 218.304000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.400000 408.236000 222.204000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.300000 408.236000 226.104000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.200000 408.236000 230.004000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.100000 408.236000 233.904000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.000000 408.236000 237.804000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 237.900000 408.236000 241.704000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 241.800000 408.236000 245.604000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 245.700000 408.236000 249.504000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 249.600000 408.236000 253.404000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 253.500000 408.236000 257.304000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.400000 408.236000 261.204000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.300000 408.236000 265.104000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.200000 408.236000 269.004000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.100000 408.236000 272.904000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.000000 408.236000 276.804000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 276.900000 408.236000 280.704000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 280.800000 408.236000 284.604000 396.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 284.400000 408.236000 292.032000 396.236000 1.000000 0.000000 0.000000 1.000000 4
+endTextObject
+restoreState
+saveState
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+updateFont 88 1 0 0 0 1200.000000 0 EAAAAA+DejaVuSerif-Bold
+drawChar 76.700000 394.256000 85.448000 382.256000 1.000000 0.000000 0.000000 1.000000 Z
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.700000 380.236000 85.028000 368.236000 1.000000 0.000000 0.000000 1.000000 Z
+drawChar 85.004000 380.236000 92.732000 368.236000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 92.708000 380.236000 99.428000 368.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 99.404000 380.236000 106.124000 368.236000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 106.100000 380.236000 113.828000 368.236000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 113.804000 380.236000 117.632000 368.236000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 117.608000 380.236000 125.336000 368.236000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 125.312000 380.236000 129.140000 368.236000 1.000000 0.000000 0.000000 1.000000 i
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 129.200000 380.236000 133.004000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 133.100000 380.236000 136.904000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 137.000000 380.236000 140.804000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 140.900000 380.236000 144.704000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 144.800000 380.236000 148.604000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 148.700000 380.236000 152.504000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 152.600000 380.236000 156.404000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 156.500000 380.236000 160.304000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 160.400000 380.236000 164.204000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 164.300000 380.236000 168.104000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 168.200000 380.236000 172.004000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 172.100000 380.236000 175.904000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 176.000000 380.236000 179.804000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 179.900000 380.236000 183.704000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 183.800000 380.236000 187.604000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 187.700000 380.236000 191.504000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 191.600000 380.236000 195.404000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 195.500000 380.236000 199.304000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 199.400000 380.236000 203.204000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 203.300000 380.236000 207.104000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 207.200000 380.236000 211.004000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 211.100000 380.236000 214.904000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 215.000000 380.236000 218.804000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 218.900000 380.236000 222.704000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 222.800000 380.236000 226.604000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 226.700000 380.236000 230.504000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 230.600000 380.236000 234.404000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 234.500000 380.236000 238.304000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 238.400000 380.236000 242.204000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 242.300000 380.236000 246.104000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 246.200000 380.236000 250.004000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 250.100000 380.236000 253.904000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 254.000000 380.236000 257.804000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 257.900000 380.236000 261.704000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 261.800000 380.236000 265.604000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 265.700000 380.236000 269.504000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 269.600000 380.236000 273.404000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 273.500000 380.236000 277.304000 368.236000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 1200.000000 0 DAAAAA+DejaVuSerif
+drawChar 276.700000 380.236000 284.332000 368.236000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 284.296000 380.236000 291.928000 368.236000 1.000000 0.000000 0.000000 1.000000 1
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 306.000000 136.200000 0 306.100000 136.200000 0 306.100000 644.700000 0 306.000000 644.700000 0 306.000000 136.200000 0
+restoreState
+saveState
+eoClipPath subpath 1 134.300000 15614.600000 0 477.900000 15614.600000 0 477.900000 15924.400000 0 134.300000 15924.400000 0 134.300000 15614.600000 0
+saveState
+updateCtm 34350.000000 0.000000 0.000000 -30980.000000 13430.000000 -1482270.000000
+drawSoftMaskedImage 458 413 458 413 JPEG 27507 PPM 567477
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 12625.600000 0 168.100000 12625.600000 0 168.100000 12630.600000 0 76.900000 12630.600000 0 76.900000 12625.600000 0
+eoFillPath subpath 1 163.100000 12630.500000 0 168.100000 12630.500000 0 168.100000 12761.100000 0 163.100000 12761.100000 0 163.100000 12630.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 12630.600000 0 163.100000 12630.600000 0 163.100000 12766.000000 0 72.000000 12766.000000 0 72.000000 12630.600000 0
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 78.700000 12761.680000 87.320000 12751.680000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 87.300000 12761.680000 93.420000 12751.680000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 93.400000 12761.680000 97.510000 12751.680000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 97.500000 12761.680000 101.420000 12751.680000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.400000 12761.680000 104.170000 12751.680000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.200000 12761.680000 110.530000 12751.680000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.500000 12761.680000 113.270000 12751.680000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 113.300000 12761.680000 116.470000 12751.680000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.500000 12761.680000 123.480000 12751.680000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 123.500000 12761.680000 129.610000 12751.680000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 129.600000 12761.680000 135.090000 12751.680000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 135.100000 12761.680000 140.890000 12751.680000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 140.900000 12761.680000 144.820000 12751.680000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 144.800000 12761.680000 150.920000 12751.680000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 150.900000 12761.680000 153.670000 12751.680000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 153.700000 12761.680000 156.470000 12751.680000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 12634.800000 0 168.200000 12634.800000 0 168.200000 12750.000000 0 72.000000 12750.000000 0 72.000000 12634.800000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12702.952000 79.253000 12693.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 80.504000 12702.952000 86.669000 12693.952000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 86.606000 12702.952000 90.215000 12693.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.206000 12702.952000 93.077000 12693.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.104000 12702.952000 97.406000 12693.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 98.000000 12702.952000 100.853000 12693.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.600000 12702.952000 107.324000 12693.952000 1.000000 0.000000 0.000000 1.000000 5
+drawChar 107.297000 12702.952000 112.337000 12693.952000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 112.400000 12702.952000 115.271000 12693.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 115.802000 12702.952000 118.655000 12693.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.303000 12702.952000 126.512000 12693.952000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 126.503000 12702.952000 130.805000 12693.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 130.805000 12702.952000 135.881000 12693.952000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.502000 12702.952000 139.355000 12693.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.102000 12702.952000 147.284000 12693.952000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 147.203000 12702.952000 150.074000 12693.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 150.101000 12702.952000 155.897000 12693.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 155.897000 12702.952000 158.750000 12693.952000 1.000000 0.000000 0.000000 1.000000 ,
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 12702.952000 161.853000 12693.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12692.452000 82.124000 12683.452000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 82.097000 12692.452000 87.137000 12683.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 87.200000 12692.452000 90.071000 12683.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 90.503000 12692.452000 93.356000 12683.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 93.905000 12692.452000 100.403000 12683.452000 1.000000 0.000000 0.000000 1.000000 V
+drawChar 99.602000 12692.452000 104.921000 12683.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.903000 12692.452000 109.205000 12683.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 109.205000 12692.452000 117.737000 12683.452000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 117.701000 12692.452000 123.119000 12683.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.200000 12692.452000 128.996000 12683.452000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 128.996000 12692.452000 132.605000 12683.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 132.596000 12692.452000 138.392000 12683.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 138.896000 12692.452000 141.749000 12683.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 142.298000 12692.452000 149.507000 12683.452000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 149.498000 12692.452000 153.800000 12683.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 153.800000 12692.452000 158.876000 12683.452000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 12692.452000 161.853000 12683.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12681.952000 81.764000 12672.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 12681.952000 87.596000 12672.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 87.596000 12681.952000 93.356000 12672.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.197000 12681.952000 102.050000 12672.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.098000 12681.952000 113.822000 12672.952000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 119.798000 12681.952000 122.651000 12672.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 128.699000 12681.952000 134.117000 12672.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 134.099000 12681.952000 138.401000 12672.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 144.296000 12681.952000 147.149000 12672.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 153.197000 12681.952000 158.921000 12672.952000 1.000000 0.000000 0.000000 1.000000 3
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 12681.952000 161.853000 12672.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12671.452000 79.271000 12662.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 12671.452000 84.338000 12662.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 84.302000 12671.452000 89.621000 12662.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 89.603000 12671.452000 94.643000 12662.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 94.706000 12671.452000 100.502000 12662.452000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 100.502000 12671.452000 106.262000 12662.452000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 106.199000 12671.452000 111.518000 12662.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.599000 12671.452000 116.216000 12662.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.396000 12671.452000 119.249000 12662.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 119.492000 12671.452000 122.363000 12662.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 122.390000 12671.452000 128.186000 12662.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 128.492000 12671.452000 131.345000 12662.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.696000 12671.452000 137.060000 12662.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.294000 12671.452000 140.147000 12662.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.390000 12671.452000 145.007000 12662.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 144.989000 12671.452000 148.598000 12662.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.589000 12671.452000 151.460000 12662.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.487000 12671.452000 155.789000 12662.452000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 12671.452000 158.933000 12662.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12660.952000 80.702000 12651.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 80.702000 12660.952000 83.573000 12651.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 83.600000 12660.952000 89.396000 12651.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.396000 12660.952000 95.156000 12651.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 97.694000 12660.952000 100.547000 12651.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.292000 12660.952000 109.052000 12651.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 109.088000 12660.952000 111.959000 12651.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.887000 12660.952000 117.251000 12651.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 117.287000 12660.952000 121.904000 12651.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 121.886000 12660.952000 126.503000 12651.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 126.485000 12660.952000 129.338000 12651.952000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 132.083000 12660.952000 134.936000 12651.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.681000 12660.952000 143.441000 12651.952000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 143.378000 12660.952000 148.796000 12651.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 148.778000 12660.952000 154.574000 12651.952000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 154.574000 12660.952000 158.876000 12651.952000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 159.000000 12660.952000 161.853000 12651.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12650.452000 79.271000 12641.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 12650.452000 85.094000 12641.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 12650.452000 88.703000 12641.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.694000 12650.452000 94.112000 12641.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 94.391000 12650.452000 97.244000 12641.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 97.694000 12650.452000 103.058000 12641.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 103.094000 12650.452000 108.890000 12641.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 109.097000 12650.452000 111.950000 12641.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 112.400000 12650.452000 115.271000 12641.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 115.298000 12650.452000 120.338000 12641.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 120.302000 12650.452000 125.621000 12641.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.603000 12650.452000 131.363000 12641.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 131.705000 12650.452000 134.558000 12641.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 135.008000 12650.452000 140.048000 12641.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 140.012000 12650.452000 145.430000 12641.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.511000 12650.452000 150.551000 12641.452000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 150.515000 12650.452000 155.960000 12641.452000 1.000000 0.000000 0.000000 1.000000 k
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 155.900000 12650.452000 158.933000 12641.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12639.952000 80.009000 12630.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 12639.952000 85.364000 12630.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 85.400000 12639.952000 88.271000 12630.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 88.298000 12639.952000 91.169000 12630.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 95.102000 12639.952000 97.955000 12630.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 102.005000 12639.952000 107.765000 12630.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 107.801000 12639.952000 110.672000 12630.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 110.600000 12639.952000 115.964000 12630.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 116.000000 12639.952000 120.617000 12630.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 120.599000 12639.952000 125.216000 12630.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 125.198000 12639.952000 128.051000 12630.952000 1.000000 0.000000 0.000000 1.000000 .
+drawChar 132.101000 12639.952000 134.954000 12630.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 139.103000 12639.952000 146.285000 12630.952000 1.000000 0.000000 0.000000 1.000000 G
+drawChar 146.303000 12639.952000 151.667000 12630.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.604000 12639.952000 155.906000 12630.952000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.000000 12639.952000 159.033000 12630.952000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 12630.500000 0 72.100000 12630.500000 0 72.100000 12766.000000 0 72.000000 12766.000000 0 72.000000 12630.500000 0
+eoFillPath subpath 1 163.100000 12630.500000 0 163.200000 12630.500000 0 163.200000 12766.000000 0 163.100000 12766.000000 0 163.100000 12630.500000 0
+eoFillPath subpath 1 72.000000 12765.900000 0 163.200000 12765.900000 0 163.200000 12766.000000 0 72.000000 12766.000000 0 72.000000 12765.900000 0
+eoFillPath subpath 1 72.000000 12630.500000 0 163.200000 12630.500000 0 163.200000 12630.600000 0 72.000000 12630.600000 0 72.000000 12630.500000 0
+saveState
+eoClipPath subpath 1 96.900000 12705.800000 0 138.300000 12705.800000 0 138.300000 12750.000000 0 96.900000 12750.000000 0 96.900000 12705.800000 0
+saveState
+updateCtm 4140.000000 0.000000 0.000000 -4410.000000 9690.000000 -1191390.000000
+drawSoftMaskedImage 55 59 55 59 JPEG 2053 PPM 9748
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 12351.000000 0 165.500000 12351.000000 0 165.500000 12356.000000 0 76.900000 12356.000000 0 76.900000 12351.000000 0
+eoFillPath subpath 1 160.500000 12355.900000 0 165.500000 12355.900000 0 165.500000 12512.200000 0 160.500000 12512.200000 0 160.500000 12355.900000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 12356.000000 0 121.400000 12356.000000 0 121.400000 12517.100000 0 72.000000 12517.100000 0 72.000000 12356.000000 0
+saveState
+eoClipPath subpath 1 72.000000 12355.900000 0 160.500000 12355.900000 0 160.500000 12517.000000 0 72.000000 12517.000000 0 72.000000 12355.900000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -1154690.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 82.300000 12512.780000 89.280000 12502.780000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 89.300000 12512.780000 95.630000 12502.780000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 95.600000 12512.780000 99.520000 12502.780000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 99.500000 12512.780000 102.270000 12502.780000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.300000 12512.780000 108.450000 12502.780000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 108.500000 12512.780000 112.610000 12502.780000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.600000 12512.780000 118.510000 12502.780000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 118.500000 12512.780000 121.670000 12502.780000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.700000 12512.780000 124.470000 12502.780000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 124.500000 12512.780000 130.830000 12502.780000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 130.800000 12512.780000 133.970000 12502.780000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.000000 12512.780000 137.920000 12502.780000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.900000 12512.780000 144.230000 12502.780000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 144.200000 12512.780000 150.350000 12502.780000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 150.400000 12512.780000 153.570000 12502.780000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+updateFont 108 1 0 0 0 1000.000000 0 CAAAAA+DejaVuSans
+drawChar 87.300000 12501.080000 95.000000 12491.080000 1.000000 0.000000 0.000000 1.000000 D
+drawChar 95.000000 12501.080000 97.770000 12491.080000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 97.800000 12501.080000 103.000000 12491.080000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.000000 12501.080000 109.330000 12491.080000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 109.300000 12501.080000 117.470000 12491.080000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 117.500000 12501.080000 123.620000 12491.080000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 123.600000 12501.080000 128.800000 12491.080000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 128.800000 12501.080000 135.130000 12491.080000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 135.100000 12501.080000 141.250000 12491.080000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 141.300000 12501.080000 145.410000 12491.080000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12486.252000 82.961000 12477.252000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 82.997000 12486.252000 87.614000 12477.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 87.596000 12486.252000 93.356000 12477.252000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 93.293000 12486.252000 98.612000 12477.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 98.693000 12486.252000 103.733000 12477.252000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 103.697000 12486.252000 106.568000 12477.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.595000 12486.252000 111.959000 12477.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 111.995000 12486.252000 114.866000 12477.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 114.794000 12486.252000 117.665000 12477.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 117.692000 12486.252000 122.768000 12477.252000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 122.894000 12486.252000 125.747000 12477.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 125.891000 12486.252000 131.651000 12477.252000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 131.588000 12486.252000 136.907000 12477.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 136.889000 12486.252000 142.307000 12477.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 142.289000 12486.252000 148.049000 12477.252000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 148.085000 12486.252000 150.956000 12477.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.983000 12486.252000 156.302000 12477.252000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 12486.252000 159.253000 12477.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12475.752000 84.095000 12466.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 12475.752000 89.900000 12466.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.900000 12475.752000 95.318000 12466.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 97.496000 12475.752000 100.349000 12466.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 104.795000 12475.752000 110.789000 12466.752000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 108.593000 12475.752000 111.464000 12466.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 111.491000 12475.752000 114.362000 12466.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 116.495000 12475.752000 119.348000 12466.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 121.598000 12475.752000 126.962000 12466.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 129.194000 12475.752000 132.047000 12466.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.198000 12475.752000 139.958000 12466.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.994000 12475.752000 142.865000 12466.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 142.793000 12475.752000 147.410000 12466.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 147.491000 12475.752000 153.287000 12466.752000 1.000000 0.000000 0.000000 1.000000 h
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 12475.752000 156.333000 12466.752000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12465.252000 84.095000 12456.252000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 12465.252000 89.468000 12456.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 12465.252000 94.121000 12456.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 94.103000 12465.252000 99.899000 12456.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 99.899000 12465.252000 105.218000 12456.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 105.200000 12465.252000 109.502000 12456.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 112.796000 12465.252000 115.649000 12456.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 118.997000 12465.252000 122.327000 12456.252000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 122.300000 12465.252000 127.718000 12456.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.700000 12465.252000 132.002000 12456.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 135.296000 12465.252000 138.149000 12456.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.596000 12465.252000 145.205000 12456.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.196000 12465.252000 150.992000 12456.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.992000 12465.252000 156.311000 12456.252000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 12465.252000 159.253000 12456.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12454.752000 82.394000 12445.752000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 82.403000 12454.752000 86.705000 12445.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 86.705000 12454.752000 91.322000 12445.752000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 91.304000 12454.752000 94.913000 12445.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 95.201000 12454.752000 98.054000 12445.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.405000 12454.752000 102.014000 12445.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.005000 12454.752000 104.876000 12445.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.903000 12454.752000 113.435000 12445.752000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 113.399000 12454.752000 118.718000 12445.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.096000 12454.752000 121.949000 12445.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.192000 12454.752000 125.063000 12445.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 125.090000 12454.752000 130.886000 12445.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 131.192000 12454.752000 134.045000 12445.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 134.396000 12454.752000 138.005000 12445.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 137.996000 12454.752000 143.792000 12445.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 143.792000 12454.752000 149.111000 12445.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 149.093000 12454.752000 151.964000 12445.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.991000 12454.752000 156.293000 12445.752000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 12454.752000 159.153000 12445.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12444.252000 79.271000 12435.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 79.298000 12444.252000 82.169000 12435.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.196000 12444.252000 85.526000 12435.252000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.499000 12444.252000 90.818000 12435.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.601000 12444.252000 94.454000 12435.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 95.399000 12444.252000 99.008000 12435.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 98.999000 12444.252000 104.318000 12435.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.300000 12444.252000 110.096000 12435.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 110.096000 12444.252000 115.856000 12435.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 116.693000 12444.252000 119.546000 12435.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.392000 12444.252000 124.001000 12435.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 124.091000 12444.252000 129.509000 12435.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.292000 12444.252000 133.145000 12435.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.991000 12444.252000 139.751000 12435.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 139.787000 12444.252000 145.205000 12435.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 145.988000 12444.252000 148.841000 12435.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 149.786000 12444.252000 152.657000 12435.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 152.684000 12444.252000 156.293000 12435.252000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 12444.252000 159.253000 12435.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12433.752000 84.095000 12424.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 12433.752000 88.406000 12424.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 88.406000 12433.752000 93.824000 12424.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 93.806000 12433.752000 99.602000 12424.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 99.602000 12433.752000 105.362000 12424.752000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 105.398000 12433.752000 108.422000 12424.752000 1.000000 0.000000 0.000000 1.000000 :
+drawChar 113.894000 12433.752000 116.747000 12424.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.390000 12433.752000 129.275000 12424.752000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 129.293000 12433.752000 135.089000 12424.752000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 135.089000 12433.752000 138.698000 12424.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.689000 12433.752000 141.560000 12424.752000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 141.587000 12433.752000 146.906000 12424.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 12433.752000 151.190000 12424.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.190000 12433.752000 156.266000 12424.752000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 12433.752000 159.253000 12424.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12423.252000 82.196000 12414.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 12423.252000 87.560000 12414.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 12423.252000 92.213000 12414.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 93.698000 12423.252000 96.551000 12414.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.099000 12423.252000 101.708000 12414.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.798000 12423.252000 107.216000 12414.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.800000 12423.252000 111.653000 12414.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 113.201000 12423.252000 118.961000 12414.252000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 118.997000 12423.252000 124.316000 12414.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.801000 12423.252000 128.654000 12414.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 130.301000 12423.252000 133.172000 12414.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 133.199000 12423.252000 138.995000 12414.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 138.995000 12423.252000 143.612000 12414.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 143.594000 12423.252000 148.913000 12414.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.895000 12423.252000 153.197000 12414.252000 1.000000 0.000000 0.000000 1.000000 r
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 12423.252000 156.333000 12414.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12412.752000 80.009000 12403.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 12412.752000 85.319000 12403.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 85.301000 12412.752000 91.061000 12403.752000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 97.199000 12412.752000 100.052000 12403.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 106.298000 12412.752000 113.993000 12403.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 114.002000 12412.752000 116.873000 12403.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 116.801000 12412.752000 120.410000 12403.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 120.500000 12412.752000 126.296000 12403.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 132.497000 12412.752000 135.350000 12403.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.497000 12412.752000 145.106000 12403.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.097000 12412.752000 150.893000 12403.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 150.893000 12412.752000 156.212000 12403.752000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 12412.752000 159.253000 12403.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12402.252000 82.196000 12393.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 82.196000 12402.252000 87.560000 12393.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 87.596000 12402.252000 93.392000 12393.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 93.392000 12402.252000 99.152000 12393.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 99.089000 12402.252000 101.960000 12393.252000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 101.987000 12402.252000 107.306000 12393.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 107.288000 12402.252000 111.905000 12393.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 112.787000 12402.252000 115.640000 12393.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 116.684000 12402.252000 122.444000 12393.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 122.480000 12402.252000 127.898000 12393.252000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 127.880000 12402.252000 135.575000 12393.252000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 135.584000 12402.252000 141.380000 12393.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 142.388000 12402.252000 145.241000 12393.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 146.186000 12402.252000 150.803000 12393.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 150.884000 12402.252000 156.302000 12393.252000 1.000000 0.000000 0.000000 1.000000 o
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 12402.252000 159.253000 12393.252000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12391.752000 80.009000 12382.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 12391.752000 85.796000 12382.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 85.796000 12391.752000 91.115000 12382.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 91.097000 12391.752000 95.399000 12382.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 95.399000 12391.752000 100.718000 12382.752000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 104.201000 12391.752000 107.054000 12382.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.402000 12391.752000 118.097000 12382.752000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 118.106000 12391.752000 123.524000 12382.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 123.605000 12391.752000 129.401000 12382.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 129.302000 12391.752000 131.768000 12382.752000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 131.804000 12391.752000 135.413000 12382.752000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 138.806000 12391.752000 141.659000 12382.752000 1.000000 0.000000 0.000000 1.000000
+drawChar 145.205000 12391.752000 150.965000 12382.752000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 151.001000 12391.752000 156.320000 12382.752000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 12391.752000 159.253000 12382.752000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12381.252000 81.017000 12372.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 80.999000 12381.252000 84.608000 12372.252000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 84.599000 12381.252000 89.963000 12372.252000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.999000 12381.252000 92.870000 12372.252000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 92.897000 12381.252000 98.693000 12372.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 98.693000 12381.252000 103.310000 12372.252000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 104.390000 12381.252000 107.243000 12372.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 108.386000 12381.252000 116.081000 12372.252000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 116.090000 12381.252000 121.886000 12372.252000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 121.886000 12381.252000 127.205000 12372.252000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 127.187000 12381.252000 132.983000 12372.252000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.090000 12381.252000 136.943000 12372.252000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.086000 12381.252000 143.846000 12372.252000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 143.882000 12381.252000 148.184000 12372.252000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 148.184000 12381.252000 153.260000 12372.252000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 12381.252000 156.433000 12372.252000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 12370.752000 79.271000 12361.752000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 12370.752000 85.094000 12361.752000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 12370.752000 90.854000 12361.752000 1.000000 0.000000 0.000000 1.000000 g
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 90.800000 12370.752000 93.653000 12361.752000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 12355.900000 0 72.100000 12355.900000 0 72.100000 12517.100000 0 72.000000 12517.100000 0 72.000000 12355.900000 0
+eoFillPath subpath 1 160.500000 12355.900000 0 160.600000 12355.900000 0 160.600000 12517.100000 0 160.500000 12517.100000 0 160.500000 12355.900000 0
+eoFillPath subpath 1 72.000000 12517.000000 0 160.600000 12517.000000 0 160.600000 12517.100000 0 72.000000 12517.100000 0 72.000000 12517.000000 0
+eoFillPath subpath 1 72.000000 12355.900000 0 160.600000 12355.900000 0 160.600000 12356.000000 0 72.000000 12356.000000 0 72.000000 12355.900000 0
+saveState
+eoClipPath subpath 1 108.000000 11868.500000 0 178.900000 11868.500000 0 178.900000 11925.200000 0 108.000000 11925.200000 0 108.000000 11868.500000 0
+saveState
+updateCtm 7080.000000 0.000000 0.000000 -5660.000000 10800.000000 -1107660.000000
+drawSoftMaskedImage 75 59 75 59 JPEG 3139 PPM 13288
+restoreState
+restoreState
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 7810.200000 0 165.500000 7810.200000 0 165.500000 7815.200000 0 76.900000 7815.200000 0 76.900000 7810.200000 0
+eoFillPath subpath 1 160.500000 7815.100000 0 165.500000 7815.100000 0 165.500000 7923.900000 0 160.500000 7923.900000 0 160.500000 7815.100000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 7815.200000 0 160.500000 7815.200000 0 160.500000 7928.800000 0 72.000000 7928.800000 0 72.000000 7815.200000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7924.452000 83.771000 7915.452000 1.000000 0.000000 0.000000 1.000000 O
+drawChar 83.798000 7924.452000 89.594000 7915.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 89.594000 7924.452000 92.465000 7915.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 92.492000 7924.452000 97.568000 7915.452000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.090000 7924.452000 100.943000 7915.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 101.591000 7924.452000 106.955000 7915.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 107.594000 7924.452000 110.447000 7915.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 111.095000 7924.452000 114.425000 7915.452000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 114.398000 7924.452000 119.717000 7915.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 119.798000 7924.452000 127.493000 7915.452000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 128.096000 7924.452000 130.949000 7915.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 131.498000 7924.452000 136.574000 7915.452000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 136.601000 7924.452000 141.920000 7915.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 142.001000 7924.452000 147.365000 7915.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 147.401000 7924.452000 151.703000 7915.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 151.703000 7924.452000 156.320000 7915.452000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.300000 7924.452000 159.153000 7915.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7913.952000 81.764000 7904.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 81.800000 7913.952000 85.130000 7904.952000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 85.103000 7913.952000 88.712000 7904.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 88.703000 7913.952000 94.022000 7904.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 94.004000 7913.952000 98.306000 7904.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 7913.952000 102.455000 7904.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 103.805000 7913.952000 106.676000 7904.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 106.703000 7913.952000 110.312000 7904.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 110.303000 7913.952000 114.920000 7904.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 116.207000 7913.952000 119.060000 7904.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 120.410000 7913.952000 125.450000 7904.952000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 125.414000 7913.952000 130.832000 7904.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 130.913000 7913.952000 139.445000 7904.952000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 139.409000 7913.952000 145.169000 7904.952000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 145.205000 7913.952000 148.076000 7904.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 148.004000 7913.952000 153.323000 7904.952000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 7913.952000 156.433000 7904.952000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7903.452000 80.009000 7894.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 80.000000 7903.452000 82.871000 7894.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 82.898000 7903.452000 88.316000 7894.452000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 88.298000 7903.452000 94.094000 7894.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 94.094000 7903.452000 96.947000 7894.452000 1.000000 0.000000 0.000000 1.000000 ,
+drawChar 102.095000 7903.452000 104.948000 7894.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 110.096000 7903.452000 113.705000 7894.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 113.696000 7903.452000 119.492000 7894.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.492000 7903.452000 124.811000 7894.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.995000 7903.452000 132.848000 7894.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 137.996000 7903.452000 141.605000 7894.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 141.596000 7903.452000 144.467000 7894.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.494000 7903.452000 148.103000 7894.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 148.094000 7903.452000 150.965000 7894.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 150.992000 7903.452000 156.311000 7894.452000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7903.452000 159.253000 7894.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7892.952000 80.999000 7883.952000 1.000000 0.000000 0.000000 1.000000 “
+drawChar 81.296000 7892.952000 90.539000 7883.952000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 89.900000 7892.952000 95.318000 7883.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 95.300000 7892.952000 99.602000 7883.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 99.602000 7892.952000 102.473000 7883.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 102.500000 7892.952000 108.260000 7883.952000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 108.296000 7892.952000 110.762000 7883.952000 1.000000 0.000000 0.000000 1.000000 '
+drawChar 110.699000 7892.952000 115.316000 7883.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 119.303000 7892.952000 122.156000 7883.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 126.305000 7892.952000 132.299000 7883.952000 1.000000 0.000000 0.000000 1.000000 T
+drawChar 131.606000 7892.952000 136.970000 7883.952000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 137.006000 7892.952000 139.877000 7883.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 139.904000 7892.952000 142.775000 7883.952000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 142.703000 7892.952000 148.022000 7883.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.103000 7892.952000 152.720000 7883.952000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 152.702000 7892.952000 156.311000 7883.952000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7892.952000 159.253000 7883.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7882.452000 83.006000 7873.452000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 82.997000 7882.452000 88.793000 7873.452000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 88.793000 7882.452000 91.664000 7873.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 91.691000 7882.452000 94.562000 7873.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 94.589000 7882.452000 100.349000 7873.452000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 100.286000 7882.452000 103.157000 7873.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 103.184000 7882.452000 108.980000 7873.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 108.980000 7882.452000 114.740000 7873.452000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 114.776000 7882.452000 119.375000 7873.452000 1.000000 0.000000 0.000000 1.000000 â€
+drawChar 125.180000 7882.452000 128.033000 7873.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 133.784000 7882.452000 141.479000 7873.452000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 141.488000 7882.452000 146.807000 7873.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 146.888000 7882.452000 152.684000 7873.452000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 152.684000 7882.452000 156.293000 7873.452000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7882.452000 159.253000 7873.452000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7871.952000 79.730000 7862.952000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 79.703000 7871.952000 84.005000 7862.952000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 84.005000 7871.952000 89.423000 7862.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 89.504000 7871.952000 98.036000 7862.952000 1.000000 0.000000 0.000000 1.000000 m
+drawChar 118.304000 7871.952000 121.157000 7862.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 141.506000 7871.952000 145.115000 7862.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 145.205000 7871.952000 151.001000 7862.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 151.001000 7871.952000 156.320000 7862.952000 1.000000 0.000000 0.000000 1.000000 e
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 156.400000 7871.952000 159.253000 7862.952000 1.000000 0.000000 0.000000 1.000000
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7861.452000 83.285000 7852.452000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 83.303000 7861.452000 89.099000 7852.452000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 89.099000 7861.452000 93.401000 7852.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 93.401000 7861.452000 98.477000 7852.452000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 98.504000 7861.452000 103.121000 7852.452000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 103.103000 7861.452000 105.974000 7852.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 106.001000 7861.452000 111.320000 7852.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 111.302000 7861.452000 115.604000 7852.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 121.004000 7861.452000 123.857000 7852.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.401000 7861.452000 136.007000 7852.452000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.998000 7861.452000 141.794000 7852.452000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.794000 7861.452000 144.665000 7852.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.593000 7861.452000 147.464000 7852.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.491000 7861.452000 153.251000 7852.452000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 7861.452000 156.433000 7852.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7850.952000 79.271000 7841.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 7850.952000 85.094000 7841.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 7850.952000 90.854000 7841.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 93.293000 7850.952000 96.146000 7841.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 98.693000 7850.952000 102.302000 7841.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 102.293000 7850.952000 107.711000 7841.952000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 110.195000 7850.952000 113.048000 7841.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 115.595000 7850.952000 119.204000 7841.952000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 119.195000 7850.952000 124.991000 7841.952000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 124.991000 7850.952000 130.310000 7841.952000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 132.794000 7850.952000 135.647000 7841.952000 1.000000 0.000000 0.000000 1.000000
+drawChar 138.194000 7850.952000 144.755000 7841.952000 1.000000 0.000000 0.000000 1.000000 E
+drawChar 144.791000 7850.952000 153.323000 7841.952000 1.000000 0.000000 0.000000 1.000000 m
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.300000 7850.952000 156.333000 7841.952000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7840.452000 82.160000 7831.452000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 82.196000 7840.452000 85.067000 7831.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 84.995000 7840.452000 89.297000 7831.452000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 89.297000 7840.452000 94.616000 7831.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 95.894000 7840.452000 98.747000 7831.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 99.890000 7840.452000 106.055000 7831.452000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 106.091000 7840.452000 109.700000 7831.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 109.691000 7840.452000 115.055000 7831.452000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 114.992000 7840.452000 118.601000 7831.452000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 118.691000 7840.452000 124.010000 7831.452000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 125.189000 7840.452000 128.042000 7831.452000 1.000000 0.000000 0.000000 1.000000
+drawChar 129.392000 7840.452000 135.998000 7831.452000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 135.989000 7840.452000 141.785000 7831.452000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 141.785000 7840.452000 144.656000 7831.452000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 144.683000 7840.452000 147.554000 7831.452000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 147.581000 7840.452000 153.341000 7831.452000 1.000000 0.000000 0.000000 1.000000 d
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 153.400000 7840.452000 156.433000 7831.452000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 7829.952000 79.271000 7820.952000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 79.298000 7829.952000 85.094000 7820.952000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 85.094000 7829.952000 90.854000 7820.952000 1.000000 0.000000 0.000000 1.000000 g
+drawChar 90.890000 7829.952000 93.743000 7820.952000 1.000000 0.000000 0.000000 1.000000 .
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 7815.100000 0 72.100000 7815.100000 0 72.100000 7928.800000 0 72.000000 7928.800000 0 72.000000 7815.100000 0
+eoFillPath subpath 1 160.500000 7815.100000 0 160.600000 7815.100000 0 160.600000 7928.800000 0 160.500000 7928.800000 0 160.500000 7815.100000 0
+eoFillPath subpath 1 72.000000 7928.700000 0 160.600000 7928.700000 0 160.600000 7928.800000 0 72.000000 7928.800000 0 72.000000 7928.700000 0
+eoFillPath subpath 1 72.000000 7815.100000 0 160.600000 7815.100000 0 160.600000 7815.200000 0 72.000000 7815.200000 0 72.000000 7815.100000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 76.900000 14004.600000 0 169.600000 14004.600000 0 169.600000 14009.600000 0 76.900000 14009.600000 0 76.900000 14004.600000 0
+eoFillPath subpath 1 164.600000 14009.500000 0 169.600000 14009.500000 0 169.600000 14125.100000 0 164.600000 14125.100000 0 164.600000 14009.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 14009.600000 0 121.400000 14009.600000 0 121.400000 14130.000000 0 72.000000 14130.000000 0 72.000000 14009.600000 0
+saveState
+eoClipPath subpath 1 72.000000 14009.500000 0 164.600000 14009.500000 0 164.600000 14129.900000 0 72.000000 14129.900000 0 72.000000 14009.500000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+saveState
+updateCtm 33310.000000 0.000000 0.000000 -30040.000000 12140.000000 -1315930.000000
+drawImage 458 413 0 JPEG 8655
+restoreState
+restoreState
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 14079.500000 0 93.700000 14079.500000 0 93.700000 14098.700000 0 72.000000 14098.700000 0 72.000000 14079.500000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 14079.500000 0 169.600000 14079.500000 0 169.600000 14098.700000 0 93.700000 14098.700000 0 93.700000 14079.500000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 14062.800000 0 93.700000 14062.800000 0 93.700000 14079.500000 0 72.000000 14079.500000 0 72.000000 14062.800000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 14062.800000 0 169.600000 14062.800000 0 169.600000 14079.500000 0 93.700000 14079.500000 0 93.700000 14062.800000 0
+updateFillColor 0.000000 0.000000 1.000000 1.000000
+eoFillPath subpath 1 72.000000 14043.600000 0 93.700000 14043.600000 0 93.700000 14062.800000 0 72.000000 14062.800000 0 72.000000 14043.600000 0
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+eoFillPath subpath 1 93.700000 14043.600000 0 169.600000 14043.600000 0 169.600000 14062.800000 0 93.700000 14062.800000 0 93.700000 14043.600000 0
+updateFillColor 1.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 14024.400000 0 93.700000 14024.400000 0 93.700000 14043.600000 0 72.000000 14043.600000 0 72.000000 14024.400000 0
+updateFillColor 1.000000 1.000000 0.000000 1.000000
+eoFillPath subpath 1 93.700000 14024.400000 0 169.600000 14024.400000 0 169.600000 14043.600000 0 93.700000 14043.600000 0 93.700000 14024.400000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 14125.652000 82.898000 14116.652000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 82.898000 14125.652000 87.200000 14116.652000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 87.200000 14125.652000 90.809000 14116.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 90.800000 14125.652000 93.671000 14116.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 93.698000 14125.652000 98.315000 14116.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 98.297000 14125.652000 101.906000 14116.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 101.897000 14125.652000 106.514000 14116.652000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 106.901000 14125.652000 109.754000 14116.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 109.997000 14125.652000 112.868000 14116.652000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 112.895000 14125.652000 118.691000 14116.652000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 118.997000 14125.652000 121.850000 14116.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 122.093000 14125.652000 125.702000 14116.652000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 125.792000 14125.652000 131.588000 14116.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 131.588000 14125.652000 136.907000 14116.652000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 137.186000 14125.652000 140.039000 14116.652000 1.000000 0.000000 0.000000 1.000000
+drawChar 140.282000 14125.652000 146.078000 14116.652000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 146.078000 14125.652000 151.442000 14116.652000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 151.478000 14125.652000 154.349000 14116.652000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 154.277000 14125.652000 157.148000 14116.652000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 157.400000 14125.652000 160.433000 14116.652000 1.000000 0.000000 0.000000 1.000000 -
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 76.400000 14115.152000 84.095000 14106.152000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 84.104000 14115.152000 89.468000 14106.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 89.504000 14115.152000 94.580000 14106.152000 1.000000 0.000000 0.000000 1.000000 y
+drawChar 94.607000 14115.152000 97.631000 14106.152000 1.000000 0.000000 0.000000 1.000000 :
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 14094.752000 104.443000 14085.752000 1.000000 0.000000 0.000000 1.000000 W
+drawChar 103.696000 14094.752000 109.060000 14085.752000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 109.096000 14094.752000 113.398000 14085.752000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 113.398000 14094.752000 119.194000 14085.752000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 119.194000 14094.752000 124.612000 14085.752000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 124.594000 14094.752000 127.465000 14085.752000 1.000000 0.000000 0.000000 1.000000 l
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 14078.052000 101.176000 14069.052000 1.000000 0.000000 0.000000 1.000000 L
+drawChar 101.203000 14078.052000 104.074000 14069.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 104.101000 14078.052000 109.420000 14069.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 109.402000 14078.052000 114.442000 14069.052000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 114.406000 14078.052000 120.202000 14069.052000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 120.202000 14078.052000 123.811000 14069.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 123.802000 14078.052000 129.121000 14069.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 129.103000 14078.052000 134.899000 14069.052000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 134.899000 14078.052000 139.516000 14069.052000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 139.498000 14078.052000 143.107000 14069.052000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 143.098000 14078.052000 148.417000 14069.052000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 148.399000 14078.052000 151.270000 14069.052000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 151.297000 14078.052000 157.093000 14069.052000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 14061.352000 103.048000 14052.352000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 103.003000 14061.352000 108.421000 14052.352000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 108.403000 14061.352000 113.443000 14052.352000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 113.407000 14061.352000 118.852000 14052.352000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 118.906000 14061.352000 124.702000 14052.352000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 124.702000 14061.352000 130.021000 14052.352000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 130.003000 14061.352000 135.079000 14052.352000 1.000000 0.000000 0.000000 1.000000 y
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 98 1 0 0 0 900.000000 0 DAAAAA+DejaVuSerif
+drawChar 95.200000 14042.152000 104.407000 14033.152000 1.000000 0.000000 0.000000 1.000000 M
+drawChar 104.398000 14042.152000 109.816000 14033.152000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 109.798000 14042.152000 115.594000 14033.152000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 115.594000 14042.152000 121.354000 14033.152000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 121.390000 14042.152000 125.692000 14033.152000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 125.692000 14042.152000 128.563000 14033.152000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 128.590000 14042.152000 133.954000 14033.152000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 133.990000 14042.152000 139.786000 14033.152000 1.000000 0.000000 0.000000 1.000000 n
+endTextObject
+restoreState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 72.000000 14009.500000 0 72.100000 14009.500000 0 72.100000 14130.000000 0 72.000000 14130.000000 0 72.000000 14009.500000 0
+eoFillPath subpath 1 164.600000 14009.500000 0 164.700000 14009.500000 0 164.700000 14130.000000 0 164.600000 14130.000000 0 164.600000 14009.500000 0
+eoFillPath subpath 1 72.000000 14129.900000 0 164.700000 14129.900000 0 164.700000 14130.000000 0 72.000000 14130.000000 0 72.000000 14129.900000 0
+eoFillPath subpath 1 72.000000 14009.500000 0 164.700000 14009.500000 0 164.700000 14009.600000 0 72.000000 14009.600000 0 72.000000 14009.500000 0
+eoFillPath subpath 1 91.300000 14024.400000 0 93.700000 14024.400000 0 93.700000 14098.700000 0 91.300000 14098.700000 0 91.300000 14024.400000 0
+eoFillPath subpath 1 72.000000 14043.600000 0 169.600000 14043.600000 0 169.600000 14046.000000 0 72.000000 14046.000000 0 72.000000 14043.600000 0
+eoFillPath subpath 1 72.000000 14096.300000 0 169.600000 14096.300000 0 169.600000 14098.700000 0 72.000000 14098.700000 0 72.000000 14096.300000 0
+eoFillPath subpath 1 72.000000 14024.400000 0 169.600000 14024.400000 0 169.600000 14026.800000 0 72.000000 14026.800000 0 72.000000 14024.400000 0
+saveState
+eoClipPath subpath 1 108.000000 6158.400000 0 150.800000 6158.400000 0 150.800000 6202.700000 0 108.000000 6202.700000 0 108.000000 6158.400000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4420.000000 10800.000000 -536650.000000
+drawSoftMaskedImage 57 59 57 59 JPEG 2757 PPM 10102
+restoreState
+restoreState
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 186.800000 5308.500000 0 499.600000 5308.500000 0 499.600000 5313.600000 0 186.800000 5313.600000 0 186.800000 5308.500000 0
+eoFillPath subpath 1 494.500000 5313.500000 0 499.600000 5313.500000 0 499.600000 5501.900000 0 494.500000 5501.900000 0 494.500000 5313.500000 0
+saveState
+eoClipPath subpath 1 181.800000 5313.500000 0 494.500000 5313.500000 0 494.500000 5506.800000 0 181.800000 5506.800000 0 181.800000 5313.500000 0
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+eoFillPath subpath 1 181.700000 5506.900000 0 494.500000 5506.900000 0 494.500000 5506.900000 0 181.700000 5506.900000 0
+eoFillPath subpath 1 181.700000 5506.900000 0 494.500000 5506.900000 0 494.500000 5506.100000 0 181.700000 5506.100000 0 181.700000 5506.900000 0
+eoFillPath subpath 1 181.700000 5506.100000 0 494.500000 5506.100000 0 494.500000 5505.400000 0 181.700000 5505.400000 0 181.700000 5506.100000 0
+updateFillColor 0.003906 0.003906 0.003906 1.000000
+eoFillPath subpath 1 181.700000 5505.400000 0 494.500000 5505.400000 0 494.500000 5504.600000 0 181.700000 5504.600000 0 181.700000 5505.400000 0
+updateFillColor 0.007828 0.007828 0.007828 1.000000
+eoFillPath subpath 1 181.700000 5504.600000 0 494.500000 5504.600000 0 494.500000 5503.800000 0 181.700000 5503.800000 0 181.700000 5504.600000 0
+updateFillColor 0.011749 0.011749 0.011749 1.000000
+eoFillPath subpath 1 181.700000 5503.800000 0 494.500000 5503.800000 0 494.500000 5503.100000 0 181.700000 5503.100000 0 181.700000 5503.800000 0
+updateFillColor 0.015671 0.015671 0.015671 1.000000
+eoFillPath subpath 1 181.700000 5503.100000 0 494.500000 5503.100000 0 494.500000 5502.300000 0 181.700000 5502.300000 0 181.700000 5503.100000 0
+updateFillColor 0.019592 0.019592 0.019592 1.000000
+eoFillPath subpath 1 181.700000 5502.300000 0 494.500000 5502.300000 0 494.500000 5501.600000 0 181.700000 5501.600000 0 181.700000 5502.300000 0
+updateFillColor 0.023514 0.023514 0.023514 1.000000
+eoFillPath subpath 1 181.700000 5501.600000 0 494.500000 5501.600000 0 494.500000 5500.800000 0 181.700000 5500.800000 0 181.700000 5501.600000 0
+updateFillColor 0.027435 0.027435 0.027435 1.000000
+eoFillPath subpath 1 181.700000 5500.800000 0 494.500000 5500.800000 0 494.500000 5500.100000 0 181.700000 5500.100000 0 181.700000 5500.800000 0
+updateFillColor 0.031357 0.031357 0.031357 1.000000
+eoFillPath subpath 1 181.700000 5500.100000 0 494.500000 5500.100000 0 494.500000 5499.300000 0 181.700000 5499.300000 0 181.700000 5500.100000 0
+updateFillColor 0.035278 0.035278 0.035278 1.000000
+eoFillPath subpath 1 181.700000 5499.300000 0 494.500000 5499.300000 0 494.500000 5498.500000 0 181.700000 5498.500000 0 181.700000 5499.300000 0
+updateFillColor 0.039200 0.039200 0.039200 1.000000
+eoFillPath subpath 1 181.700000 5498.500000 0 494.500000 5498.500000 0 494.500000 5497.800000 0 181.700000 5497.800000 0 181.700000 5498.500000 0
+updateFillColor 0.043121 0.043121 0.043121 1.000000
+eoFillPath subpath 1 181.700000 5497.800000 0 494.500000 5497.800000 0 494.500000 5497.000000 0 181.700000 5497.000000 0 181.700000 5497.800000 0
+updateFillColor 0.047043 0.047043 0.047043 1.000000
+eoFillPath subpath 1 181.700000 5497.000000 0 494.500000 5497.000000 0 494.500000 5496.300000 0 181.700000 5496.300000 0 181.700000 5497.000000 0
+updateFillColor 0.050980 0.050980 0.050980 1.000000
+eoFillPath subpath 1 181.700000 5496.300000 0 494.500000 5496.300000 0 494.500000 5495.500000 0 181.700000 5495.500000 0 181.700000 5496.300000 0
+updateFillColor 0.054886 0.054886 0.054886 1.000000
+eoFillPath subpath 1 181.700000 5495.500000 0 494.500000 5495.500000 0 494.500000 5494.700000 0 181.700000 5494.700000 0 181.700000 5495.500000 0
+updateFillColor 0.058807 0.058807 0.058807 1.000000
+eoFillPath subpath 1 181.700000 5494.700000 0 494.500000 5494.700000 0 494.500000 5494.000000 0 181.700000 5494.000000 0 181.700000 5494.700000 0
+updateFillColor 0.062729 0.062729 0.062729 1.000000
+eoFillPath subpath 1 181.700000 5494.000000 0 494.500000 5494.000000 0 494.500000 5493.200000 0 181.700000 5493.200000 0 181.700000 5494.000000 0
+updateFillColor 0.066650 0.066650 0.066650 1.000000
+eoFillPath subpath 1 181.700000 5493.200000 0 494.500000 5493.200000 0 494.500000 5492.500000 0 181.700000 5492.500000 0 181.700000 5493.200000 0
+updateFillColor 0.070572 0.070572 0.070572 1.000000
+eoFillPath subpath 1 181.700000 5492.500000 0 494.500000 5492.500000 0 494.500000 5491.700000 0 181.700000 5491.700000 0 181.700000 5492.500000 0
+updateFillColor 0.074493 0.074493 0.074493 1.000000
+eoFillPath subpath 1 181.700000 5491.700000 0 494.500000 5491.700000 0 494.500000 5490.900000 0 181.700000 5490.900000 0 181.700000 5491.700000 0
+updateFillColor 0.078415 0.078415 0.078415 1.000000
+eoFillPath subpath 1 181.700000 5490.900000 0 494.500000 5490.900000 0 494.500000 5490.200000 0 181.700000 5490.200000 0 181.700000 5490.900000 0
+updateFillColor 0.082336 0.082336 0.082336 1.000000
+eoFillPath subpath 1 181.700000 5490.200000 0 494.500000 5490.200000 0 494.500000 5489.400000 0 181.700000 5489.400000 0 181.700000 5490.200000 0
+updateFillColor 0.086258 0.086258 0.086258 1.000000
+eoFillPath subpath 1 181.700000 5489.400000 0 494.500000 5489.400000 0 494.500000 5488.700000 0 181.700000 5488.700000 0 181.700000 5489.400000 0
+updateFillColor 0.090179 0.090179 0.090179 1.000000
+eoFillPath subpath 1 181.700000 5488.700000 0 494.500000 5488.700000 0 494.500000 5487.900000 0 181.700000 5487.900000 0 181.700000 5488.700000 0
+updateFillColor 0.094101 0.094101 0.094101 1.000000
+eoFillPath subpath 1 181.700000 5487.900000 0 494.500000 5487.900000 0 494.500000 5487.200000 0 181.700000 5487.200000 0 181.700000 5487.900000 0
+updateFillColor 0.098022 0.098022 0.098022 1.000000
+eoFillPath subpath 1 181.700000 5487.200000 0 494.500000 5487.200000 0 494.500000 5486.400000 0 181.700000 5486.400000 0 181.700000 5487.200000 0
+updateFillColor 0.101959 0.101959 0.101959 1.000000
+eoFillPath subpath 1 181.700000 5486.400000 0 494.500000 5486.400000 0 494.500000 5485.600000 0 181.700000 5485.600000 0 181.700000 5486.400000 0
+updateFillColor 0.105865 0.105865 0.105865 1.000000
+eoFillPath subpath 1 181.700000 5485.600000 0 494.500000 5485.600000 0 494.500000 5484.900000 0 181.700000 5484.900000 0 181.700000 5485.600000 0
+updateFillColor 0.109787 0.109787 0.109787 1.000000
+eoFillPath subpath 1 181.700000 5484.900000 0 494.500000 5484.900000 0 494.500000 5484.100000 0 181.700000 5484.100000 0 181.700000 5484.900000 0
+updateFillColor 0.113708 0.113708 0.113708 1.000000
+eoFillPath subpath 1 181.700000 5484.100000 0 494.500000 5484.100000 0 494.500000 5483.400000 0 181.700000 5483.400000 0 181.700000 5484.100000 0
+updateFillColor 0.117630 0.117630 0.117630 1.000000
+eoFillPath subpath 1 181.700000 5483.400000 0 494.500000 5483.400000 0 494.500000 5482.600000 0 181.700000 5482.600000 0 181.700000 5483.400000 0
+updateFillColor 0.121552 0.121552 0.121552 1.000000
+eoFillPath subpath 1 181.700000 5482.600000 0 494.500000 5482.600000 0 494.500000 5481.800000 0 181.700000 5481.800000 0 181.700000 5482.600000 0
+updateFillColor 0.125488 0.125488 0.125488 1.000000
+eoFillPath subpath 1 181.700000 5481.800000 0 494.500000 5481.800000 0 494.500000 5481.100000 0 181.700000 5481.100000 0 181.700000 5481.800000 0
+updateFillColor 0.129410 0.129410 0.129410 1.000000
+eoFillPath subpath 1 181.700000 5481.100000 0 494.500000 5481.100000 0 494.500000 5480.300000 0 181.700000 5480.300000 0 181.700000 5481.100000 0
+updateFillColor 0.133316 0.133316 0.133316 1.000000
+eoFillPath subpath 1 181.700000 5480.300000 0 494.500000 5480.300000 0 494.500000 5479.600000 0 181.700000 5479.600000 0 181.700000 5480.300000 0
+updateFillColor 0.137238 0.137238 0.137238 1.000000
+eoFillPath subpath 1 181.700000 5479.600000 0 494.500000 5479.600000 0 494.500000 5478.800000 0 181.700000 5478.800000 0 181.700000 5479.600000 0
+updateFillColor 0.141159 0.141159 0.141159 1.000000
+eoFillPath subpath 1 181.700000 5478.800000 0 494.500000 5478.800000 0 494.500000 5478.000000 0 181.700000 5478.000000 0 181.700000 5478.800000 0
+updateFillColor 0.145081 0.145081 0.145081 1.000000
+eoFillPath subpath 1 181.700000 5478.000000 0 494.500000 5478.000000 0 494.500000 5477.300000 0 181.700000 5477.300000 0 181.700000 5478.000000 0
+updateFillColor 0.149002 0.149002 0.149002 1.000000
+eoFillPath subpath 1 181.700000 5477.300000 0 494.500000 5477.300000 0 494.500000 5476.500000 0 181.700000 5476.500000 0 181.700000 5477.300000 0
+updateFillColor 0.152939 0.152939 0.152939 1.000000
+eoFillPath subpath 1 181.700000 5476.500000 0 494.500000 5476.500000 0 494.500000 5475.800000 0 181.700000 5475.800000 0 181.700000 5476.500000 0
+updateFillColor 0.156845 0.156845 0.156845 1.000000
+eoFillPath subpath 1 181.700000 5475.800000 0 494.500000 5475.800000 0 494.500000 5475.000000 0 181.700000 5475.000000 0 181.700000 5475.800000 0
+updateFillColor 0.160767 0.160767 0.160767 1.000000
+eoFillPath subpath 1 181.700000 5475.000000 0 494.500000 5475.000000 0 494.500000 5474.300000 0 181.700000 5474.300000 0 181.700000 5475.000000 0
+updateFillColor 0.164688 0.164688 0.164688 1.000000
+eoFillPath subpath 1 181.700000 5474.300000 0 494.500000 5474.300000 0 494.500000 5473.500000 0 181.700000 5473.500000 0 181.700000 5474.300000 0
+updateFillColor 0.168610 0.168610 0.168610 1.000000
+eoFillPath subpath 1 181.700000 5473.500000 0 494.500000 5473.500000 0 494.500000 5472.700000 0 181.700000 5472.700000 0 181.700000 5473.500000 0
+updateFillColor 0.172531 0.172531 0.172531 1.000000
+eoFillPath subpath 1 181.700000 5472.700000 0 494.500000 5472.700000 0 494.500000 5472.000000 0 181.700000 5472.000000 0 181.700000 5472.700000 0
+updateFillColor 0.176468 0.176468 0.176468 1.000000
+eoFillPath subpath 1 181.700000 5472.000000 0 494.500000 5472.000000 0 494.500000 5471.200000 0 181.700000 5471.200000 0 181.700000 5472.000000 0
+updateFillColor 0.180389 0.180389 0.180389 1.000000
+eoFillPath subpath 1 181.700000 5471.200000 0 494.500000 5471.200000 0 494.500000 5470.500000 0 181.700000 5470.500000 0 181.700000 5471.200000 0
+updateFillColor 0.184296 0.184296 0.184296 1.000000
+eoFillPath subpath 1 181.700000 5470.500000 0 494.500000 5470.500000 0 494.500000 5469.700000 0 181.700000 5469.700000 0 181.700000 5470.500000 0
+updateFillColor 0.188217 0.188217 0.188217 1.000000
+eoFillPath subpath 1 181.700000 5469.700000 0 494.500000 5469.700000 0 494.500000 5468.900000 0 181.700000 5468.900000 0 181.700000 5469.700000 0
+updateFillColor 0.192139 0.192139 0.192139 1.000000
+eoFillPath subpath 1 181.700000 5468.900000 0 494.500000 5468.900000 0 494.500000 5468.200000 0 181.700000 5468.200000 0 181.700000 5468.900000 0
+updateFillColor 0.196060 0.196060 0.196060 1.000000
+eoFillPath subpath 1 181.700000 5468.200000 0 494.500000 5468.200000 0 494.500000 5467.400000 0 181.700000 5467.400000 0 181.700000 5468.200000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 181.700000 5467.400000 0 494.500000 5467.400000 0 494.500000 5466.700000 0 181.700000 5466.700000 0 181.700000 5467.400000 0
+updateFillColor 0.203918 0.203918 0.203918 1.000000
+eoFillPath subpath 1 181.700000 5466.700000 0 494.500000 5466.700000 0 494.500000 5465.900000 0 181.700000 5465.900000 0 181.700000 5466.700000 0
+updateFillColor 0.207840 0.207840 0.207840 1.000000
+eoFillPath subpath 1 181.700000 5465.900000 0 494.500000 5465.900000 0 494.500000 5465.100000 0 181.700000 5465.100000 0 181.700000 5465.900000 0
+updateFillColor 0.211746 0.211746 0.211746 1.000000
+eoFillPath subpath 1 181.700000 5465.100000 0 494.500000 5465.100000 0 494.500000 5464.400000 0 181.700000 5464.400000 0 181.700000 5465.100000 0
+updateFillColor 0.215668 0.215668 0.215668 1.000000
+eoFillPath subpath 1 181.700000 5464.400000 0 494.500000 5464.400000 0 494.500000 5463.600000 0 181.700000 5463.600000 0 181.700000 5464.400000 0
+updateFillColor 0.219589 0.219589 0.219589 1.000000
+eoFillPath subpath 1 181.700000 5463.600000 0 494.500000 5463.600000 0 494.500000 5462.900000 0 181.700000 5462.900000 0 181.700000 5463.600000 0
+updateFillColor 0.223511 0.223511 0.223511 1.000000
+eoFillPath subpath 1 181.700000 5462.900000 0 494.500000 5462.900000 0 494.500000 5462.100000 0 181.700000 5462.100000 0 181.700000 5462.900000 0
+updateFillColor 0.227448 0.227448 0.227448 1.000000
+eoFillPath subpath 1 181.700000 5462.100000 0 494.500000 5462.100000 0 494.500000 5461.400000 0 181.700000 5461.400000 0 181.700000 5462.100000 0
+updateFillColor 0.231369 0.231369 0.231369 1.000000
+eoFillPath subpath 1 181.700000 5461.400000 0 494.500000 5461.400000 0 494.500000 5460.600000 0 181.700000 5460.600000 0 181.700000 5461.400000 0
+updateFillColor 0.235275 0.235275 0.235275 1.000000
+eoFillPath subpath 1 181.700000 5460.600000 0 494.500000 5460.600000 0 494.500000 5459.800000 0 181.700000 5459.800000 0 181.700000 5460.600000 0
+updateFillColor 0.239197 0.239197 0.239197 1.000000
+eoFillPath subpath 1 181.700000 5459.800000 0 494.500000 5459.800000 0 494.500000 5459.100000 0 181.700000 5459.100000 0 181.700000 5459.800000 0
+updateFillColor 0.243118 0.243118 0.243118 1.000000
+eoFillPath subpath 1 181.700000 5459.100000 0 494.500000 5459.100000 0 494.500000 5458.300000 0 181.700000 5458.300000 0 181.700000 5459.100000 0
+updateFillColor 0.247040 0.247040 0.247040 1.000000
+eoFillPath subpath 1 181.700000 5458.300000 0 494.500000 5458.300000 0 494.500000 5457.600000 0 181.700000 5457.600000 0 181.700000 5458.300000 0
+updateFillColor 0.250977 0.250977 0.250977 1.000000
+eoFillPath subpath 1 181.700000 5457.600000 0 494.500000 5457.600000 0 494.500000 5456.800000 0 181.700000 5456.800000 0 181.700000 5457.600000 0
+updateFillColor 0.254898 0.254898 0.254898 1.000000
+eoFillPath subpath 1 181.700000 5456.800000 0 494.500000 5456.800000 0 494.500000 5456.000000 0 181.700000 5456.000000 0 181.700000 5456.800000 0
+updateFillColor 0.258820 0.258820 0.258820 1.000000
+eoFillPath subpath 1 181.700000 5456.000000 0 494.500000 5456.000000 0 494.500000 5455.300000 0 181.700000 5455.300000 0 181.700000 5456.000000 0
+updateFillColor 0.262726 0.262726 0.262726 1.000000
+eoFillPath subpath 1 181.700000 5455.300000 0 494.500000 5455.300000 0 494.500000 5454.500000 0 181.700000 5454.500000 0 181.700000 5455.300000 0
+updateFillColor 0.266647 0.266647 0.266647 1.000000
+eoFillPath subpath 1 181.700000 5454.500000 0 494.500000 5454.500000 0 494.500000 5453.800000 0 181.700000 5453.800000 0 181.700000 5454.500000 0
+updateFillColor 0.270569 0.270569 0.270569 1.000000
+eoFillPath subpath 1 181.700000 5453.800000 0 494.500000 5453.800000 0 494.500000 5453.000000 0 181.700000 5453.000000 0 181.700000 5453.800000 0
+updateFillColor 0.274490 0.274490 0.274490 1.000000
+eoFillPath subpath 1 181.700000 5453.000000 0 494.500000 5453.000000 0 494.500000 5452.200000 0 181.700000 5452.200000 0 181.700000 5453.000000 0
+updateFillColor 0.278427 0.278427 0.278427 1.000000
+eoFillPath subpath 1 181.700000 5452.200000 0 494.500000 5452.200000 0 494.500000 5451.500000 0 181.700000 5451.500000 0 181.700000 5452.200000 0
+updateFillColor 0.282349 0.282349 0.282349 1.000000
+eoFillPath subpath 1 181.700000 5451.500000 0 494.500000 5451.500000 0 494.500000 5450.700000 0 181.700000 5450.700000 0 181.700000 5451.500000 0
+updateFillColor 0.286255 0.286255 0.286255 1.000000
+eoFillPath subpath 1 181.700000 5450.700000 0 494.500000 5450.700000 0 494.500000 5450.000000 0 181.700000 5450.000000 0 181.700000 5450.700000 0
+updateFillColor 0.290176 0.290176 0.290176 1.000000
+eoFillPath subpath 1 181.700000 5450.000000 0 494.500000 5450.000000 0 494.500000 5449.200000 0 181.700000 5449.200000 0 181.700000 5450.000000 0
+updateFillColor 0.294098 0.294098 0.294098 1.000000
+eoFillPath subpath 1 181.700000 5449.200000 0 494.500000 5449.200000 0 494.500000 5448.500000 0 181.700000 5448.500000 0 181.700000 5449.200000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 181.700000 5448.500000 0 494.500000 5448.500000 0 494.500000 5447.700000 0 181.700000 5447.700000 0 181.700000 5448.500000 0
+updateFillColor 0.301956 0.301956 0.301956 1.000000
+eoFillPath subpath 1 181.700000 5447.700000 0 494.500000 5447.700000 0 494.500000 5446.900000 0 181.700000 5446.900000 0 181.700000 5447.700000 0
+updateFillColor 0.305878 0.305878 0.305878 1.000000
+eoFillPath subpath 1 181.700000 5446.900000 0 494.500000 5446.900000 0 494.500000 5446.200000 0 181.700000 5446.200000 0 181.700000 5446.900000 0
+updateFillColor 0.309799 0.309799 0.309799 1.000000
+eoFillPath subpath 1 181.700000 5446.200000 0 494.500000 5446.200000 0 494.500000 5445.400000 0 181.700000 5445.400000 0 181.700000 5446.200000 0
+updateFillColor 0.313705 0.313705 0.313705 1.000000
+eoFillPath subpath 1 181.700000 5445.400000 0 494.500000 5445.400000 0 494.500000 5444.700000 0 181.700000 5444.700000 0 181.700000 5445.400000 0
+updateFillColor 0.317627 0.317627 0.317627 1.000000
+eoFillPath subpath 1 181.700000 5444.700000 0 494.500000 5444.700000 0 494.500000 5443.900000 0 181.700000 5443.900000 0 181.700000 5444.700000 0
+updateFillColor 0.321548 0.321548 0.321548 1.000000
+eoFillPath subpath 1 181.700000 5443.900000 0 494.500000 5443.900000 0 494.500000 5443.100000 0 181.700000 5443.100000 0 181.700000 5443.900000 0
+updateFillColor 0.325485 0.325485 0.325485 1.000000
+eoFillPath subpath 1 181.700000 5443.100000 0 494.500000 5443.100000 0 494.500000 5442.400000 0 181.700000 5442.400000 0 181.700000 5443.100000 0
+updateFillColor 0.329407 0.329407 0.329407 1.000000
+eoFillPath subpath 1 181.700000 5442.400000 0 494.500000 5442.400000 0 494.500000 5441.600000 0 181.700000 5441.600000 0 181.700000 5442.400000 0
+updateFillColor 0.333328 0.333328 0.333328 1.000000
+eoFillPath subpath 1 181.700000 5441.600000 0 494.500000 5441.600000 0 494.500000 5440.900000 0 181.700000 5440.900000 0 181.700000 5441.600000 0
+updateFillColor 0.337250 0.337250 0.337250 1.000000
+eoFillPath subpath 1 181.700000 5440.900000 0 494.500000 5440.900000 0 494.500000 5440.100000 0 181.700000 5440.100000 0 181.700000 5440.900000 0
+updateFillColor 0.341156 0.341156 0.341156 1.000000
+eoFillPath subpath 1 181.700000 5440.100000 0 494.500000 5440.100000 0 494.500000 5439.300000 0 181.700000 5439.300000 0 181.700000 5440.100000 0
+updateFillColor 0.345078 0.345078 0.345078 1.000000
+eoFillPath subpath 1 181.700000 5439.300000 0 494.500000 5439.300000 0 494.500000 5438.600000 0 181.700000 5438.600000 0 181.700000 5439.300000 0
+updateFillColor 0.348999 0.348999 0.348999 1.000000
+eoFillPath subpath 1 181.700000 5438.600000 0 494.500000 5438.600000 0 494.500000 5437.800000 0 181.700000 5437.800000 0 181.700000 5438.600000 0
+updateFillColor 0.352936 0.352936 0.352936 1.000000
+eoFillPath subpath 1 181.700000 5437.800000 0 494.500000 5437.800000 0 494.500000 5437.100000 0 181.700000 5437.100000 0 181.700000 5437.800000 0
+updateFillColor 0.356857 0.356857 0.356857 1.000000
+eoFillPath subpath 1 181.700000 5437.100000 0 494.500000 5437.100000 0 494.500000 5436.300000 0 181.700000 5436.300000 0 181.700000 5437.100000 0
+updateFillColor 0.360779 0.360779 0.360779 1.000000
+eoFillPath subpath 1 181.700000 5436.300000 0 494.500000 5436.300000 0 494.500000 5435.600000 0 181.700000 5435.600000 0 181.700000 5436.300000 0
+updateFillColor 0.364685 0.364685 0.364685 1.000000
+eoFillPath subpath 1 181.700000 5435.600000 0 494.500000 5435.600000 0 494.500000 5434.800000 0 181.700000 5434.800000 0 181.700000 5435.600000 0
+updateFillColor 0.368607 0.368607 0.368607 1.000000
+eoFillPath subpath 1 181.700000 5434.800000 0 494.500000 5434.800000 0 494.500000 5434.000000 0 181.700000 5434.000000 0 181.700000 5434.800000 0
+updateFillColor 0.372528 0.372528 0.372528 1.000000
+eoFillPath subpath 1 181.700000 5434.000000 0 494.500000 5434.000000 0 494.500000 5433.300000 0 181.700000 5433.300000 0 181.700000 5434.000000 0
+updateFillColor 0.376465 0.376465 0.376465 1.000000
+eoFillPath subpath 1 181.700000 5433.300000 0 494.500000 5433.300000 0 494.500000 5432.500000 0 181.700000 5432.500000 0 181.700000 5433.300000 0
+updateFillColor 0.380386 0.380386 0.380386 1.000000
+eoFillPath subpath 1 181.700000 5432.500000 0 494.500000 5432.500000 0 494.500000 5431.800000 0 181.700000 5431.800000 0 181.700000 5432.500000 0
+updateFillColor 0.384308 0.384308 0.384308 1.000000
+eoFillPath subpath 1 181.700000 5431.800000 0 494.500000 5431.800000 0 494.500000 5431.000000 0 181.700000 5431.000000 0 181.700000 5431.800000 0
+updateFillColor 0.388229 0.388229 0.388229 1.000000
+eoFillPath subpath 1 181.700000 5431.000000 0 494.500000 5431.000000 0 494.500000 5430.200000 0 181.700000 5430.200000 0 181.700000 5431.000000 0
+updateFillColor 0.392136 0.392136 0.392136 1.000000
+eoFillPath subpath 1 181.700000 5430.200000 0 494.500000 5430.200000 0 494.500000 5429.500000 0 181.700000 5429.500000 0 181.700000 5430.200000 0
+updateFillColor 0.396057 0.396057 0.396057 1.000000
+eoFillPath subpath 1 181.700000 5429.500000 0 494.500000 5429.500000 0 494.500000 5428.700000 0 181.700000 5428.700000 0 181.700000 5429.500000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 181.700000 5428.700000 0 494.500000 5428.700000 0 494.500000 5428.000000 0 181.700000 5428.000000 0 181.700000 5428.700000 0
+updateFillColor 0.403915 0.403915 0.403915 1.000000
+eoFillPath subpath 1 181.700000 5428.000000 0 494.500000 5428.000000 0 494.500000 5427.200000 0 181.700000 5427.200000 0 181.700000 5428.000000 0
+updateFillColor 0.407837 0.407837 0.407837 1.000000
+eoFillPath subpath 1 181.700000 5427.200000 0 494.500000 5427.200000 0 494.500000 5426.400000 0 181.700000 5426.400000 0 181.700000 5427.200000 0
+updateFillColor 0.411758 0.411758 0.411758 1.000000
+eoFillPath subpath 1 181.700000 5426.400000 0 494.500000 5426.400000 0 494.500000 5425.700000 0 181.700000 5425.700000 0 181.700000 5426.400000 0
+updateFillColor 0.415680 0.415680 0.415680 1.000000
+eoFillPath subpath 1 181.700000 5425.700000 0 494.500000 5425.700000 0 494.500000 5424.900000 0 181.700000 5424.900000 0 181.700000 5425.700000 0
+updateFillColor 0.419586 0.419586 0.419586 1.000000
+eoFillPath subpath 1 181.700000 5424.900000 0 494.500000 5424.900000 0 494.500000 5424.200000 0 181.700000 5424.200000 0 181.700000 5424.900000 0
+updateFillColor 0.423508 0.423508 0.423508 1.000000
+eoFillPath subpath 1 181.700000 5424.200000 0 494.500000 5424.200000 0 494.500000 5423.400000 0 181.700000 5423.400000 0 181.700000 5424.200000 0
+updateFillColor 0.427444 0.427444 0.427444 1.000000
+eoFillPath subpath 1 181.700000 5423.400000 0 494.500000 5423.400000 0 494.500000 5422.700000 0 181.700000 5422.700000 0 181.700000 5423.400000 0
+updateFillColor 0.431366 0.431366 0.431366 1.000000
+eoFillPath subpath 1 181.700000 5422.700000 0 494.500000 5422.700000 0 494.500000 5421.900000 0 181.700000 5421.900000 0 181.700000 5422.700000 0
+updateFillColor 0.435287 0.435287 0.435287 1.000000
+eoFillPath subpath 1 181.700000 5421.900000 0 494.500000 5421.900000 0 494.500000 5421.100000 0 181.700000 5421.100000 0 181.700000 5421.900000 0
+updateFillColor 0.439209 0.439209 0.439209 1.000000
+eoFillPath subpath 1 181.700000 5421.100000 0 494.500000 5421.100000 0 494.500000 5420.400000 0 181.700000 5420.400000 0 181.700000 5421.100000 0
+updateFillColor 0.443115 0.443115 0.443115 1.000000
+eoFillPath subpath 1 181.700000 5420.400000 0 494.500000 5420.400000 0 494.500000 5419.600000 0 181.700000 5419.600000 0 181.700000 5420.400000 0
+updateFillColor 0.447037 0.447037 0.447037 1.000000
+eoFillPath subpath 1 181.700000 5419.600000 0 494.500000 5419.600000 0 494.500000 5418.900000 0 181.700000 5418.900000 0 181.700000 5419.600000 0
+updateFillColor 0.450974 0.450974 0.450974 1.000000
+eoFillPath subpath 1 181.700000 5418.900000 0 494.500000 5418.900000 0 494.500000 5418.100000 0 181.700000 5418.100000 0 181.700000 5418.900000 0
+updateFillColor 0.454895 0.454895 0.454895 1.000000
+eoFillPath subpath 1 181.700000 5418.100000 0 494.500000 5418.100000 0 494.500000 5417.300000 0 181.700000 5417.300000 0 181.700000 5418.100000 0
+updateFillColor 0.458817 0.458817 0.458817 1.000000
+eoFillPath subpath 1 181.700000 5417.300000 0 494.500000 5417.300000 0 494.500000 5416.600000 0 181.700000 5416.600000 0 181.700000 5417.300000 0
+updateFillColor 0.462738 0.462738 0.462738 1.000000
+eoFillPath subpath 1 181.700000 5416.600000 0 494.500000 5416.600000 0 494.500000 5415.800000 0 181.700000 5415.800000 0 181.700000 5416.600000 0
+updateFillColor 0.466660 0.466660 0.466660 1.000000
+eoFillPath subpath 1 181.700000 5415.800000 0 494.500000 5415.800000 0 494.500000 5415.100000 0 181.700000 5415.100000 0 181.700000 5415.800000 0
+updateFillColor 0.470566 0.470566 0.470566 1.000000
+eoFillPath subpath 1 181.700000 5415.100000 0 494.500000 5415.100000 0 494.500000 5414.300000 0 181.700000 5414.300000 0 181.700000 5415.100000 0
+updateFillColor 0.474487 0.474487 0.474487 1.000000
+eoFillPath subpath 1 181.700000 5414.300000 0 494.500000 5414.300000 0 494.500000 5413.500000 0 181.700000 5413.500000 0 181.700000 5414.300000 0
+updateFillColor 0.478424 0.478424 0.478424 1.000000
+eoFillPath subpath 1 181.700000 5413.500000 0 494.500000 5413.500000 0 494.500000 5412.800000 0 181.700000 5412.800000 0 181.700000 5413.500000 0
+updateFillColor 0.482346 0.482346 0.482346 1.000000
+eoFillPath subpath 1 181.700000 5412.800000 0 494.500000 5412.800000 0 494.500000 5412.000000 0 181.700000 5412.000000 0 181.700000 5412.800000 0
+updateFillColor 0.486267 0.486267 0.486267 1.000000
+eoFillPath subpath 1 181.700000 5412.000000 0 494.500000 5412.000000 0 494.500000 5411.300000 0 181.700000 5411.300000 0 181.700000 5412.000000 0
+updateFillColor 0.490189 0.490189 0.490189 1.000000
+eoFillPath subpath 1 181.700000 5411.300000 0 494.500000 5411.300000 0 494.500000 5410.500000 0 181.700000 5410.500000 0 181.700000 5411.300000 0
+updateFillColor 0.494095 0.494095 0.494095 1.000000
+eoFillPath subpath 1 181.700000 5410.500000 0 494.500000 5410.500000 0 494.500000 5409.800000 0 181.700000 5409.800000 0 181.700000 5410.500000 0
+updateFillColor 0.498016 0.498016 0.498016 1.000000
+eoFillPath subpath 1 181.700000 5409.800000 0 494.500000 5409.800000 0 494.500000 5409.000000 0 181.700000 5409.000000 0 181.700000 5409.800000 0
+updateFillColor 0.501953 0.501953 0.501953 1.000000
+eoFillPath subpath 1 181.700000 5409.000000 0 494.500000 5409.000000 0 494.500000 5408.200000 0 181.700000 5408.200000 0 181.700000 5409.000000 0
+updateFillColor 0.505875 0.505875 0.505875 1.000000
+eoFillPath subpath 1 181.700000 5408.200000 0 494.500000 5408.200000 0 494.500000 5407.500000 0 181.700000 5407.500000 0 181.700000 5408.200000 0
+updateFillColor 0.509796 0.509796 0.509796 1.000000
+eoFillPath subpath 1 181.700000 5407.500000 0 494.500000 5407.500000 0 494.500000 5406.700000 0 181.700000 5406.700000 0 181.700000 5407.500000 0
+updateFillColor 0.513718 0.513718 0.513718 1.000000
+eoFillPath subpath 1 181.700000 5406.700000 0 494.500000 5406.700000 0 494.500000 5406.000000 0 181.700000 5406.000000 0 181.700000 5406.700000 0
+updateFillColor 0.517639 0.517639 0.517639 1.000000
+eoFillPath subpath 1 181.700000 5406.000000 0 494.500000 5406.000000 0 494.500000 5405.200000 0 181.700000 5405.200000 0 181.700000 5406.000000 0
+updateFillColor 0.521545 0.521545 0.521545 1.000000
+eoFillPath subpath 1 181.700000 5405.200000 0 494.500000 5405.200000 0 494.500000 5404.500000 0 181.700000 5404.500000 0 181.700000 5405.200000 0
+updateFillColor 0.525482 0.525482 0.525482 1.000000
+eoFillPath subpath 1 181.700000 5404.500000 0 494.500000 5404.500000 0 494.500000 5403.700000 0 181.700000 5403.700000 0 181.700000 5404.500000 0
+updateFillColor 0.529404 0.529404 0.529404 1.000000
+eoFillPath subpath 1 181.700000 5403.700000 0 494.500000 5403.700000 0 494.500000 5402.900000 0 181.700000 5402.900000 0 181.700000 5403.700000 0
+updateFillColor 0.533325 0.533325 0.533325 1.000000
+eoFillPath subpath 1 181.700000 5402.900000 0 494.500000 5402.900000 0 494.500000 5402.200000 0 181.700000 5402.200000 0 181.700000 5402.900000 0
+updateFillColor 0.537247 0.537247 0.537247 1.000000
+eoFillPath subpath 1 181.700000 5402.200000 0 494.500000 5402.200000 0 494.500000 5401.400000 0 181.700000 5401.400000 0 181.700000 5402.200000 0
+updateFillColor 0.541168 0.541168 0.541168 1.000000
+eoFillPath subpath 1 181.700000 5401.400000 0 494.500000 5401.400000 0 494.500000 5400.700000 0 181.700000 5400.700000 0 181.700000 5401.400000 0
+updateFillColor 0.545090 0.545090 0.545090 1.000000
+eoFillPath subpath 1 181.700000 5400.700000 0 494.500000 5400.700000 0 494.500000 5399.900000 0 181.700000 5399.900000 0 181.700000 5400.700000 0
+updateFillColor 0.548996 0.548996 0.548996 1.000000
+eoFillPath subpath 1 181.700000 5399.900000 0 494.500000 5399.900000 0 494.500000 5399.100000 0 181.700000 5399.100000 0 181.700000 5399.900000 0
+updateFillColor 0.552933 0.552933 0.552933 1.000000
+eoFillPath subpath 1 181.700000 5399.100000 0 494.500000 5399.100000 0 494.500000 5398.400000 0 181.700000 5398.400000 0 181.700000 5399.100000 0
+updateFillColor 0.556854 0.556854 0.556854 1.000000
+eoFillPath subpath 1 181.700000 5398.400000 0 494.500000 5398.400000 0 494.500000 5397.600000 0 181.700000 5397.600000 0 181.700000 5398.400000 0
+updateFillColor 0.560776 0.560776 0.560776 1.000000
+eoFillPath subpath 1 181.700000 5397.600000 0 494.500000 5397.600000 0 494.500000 5396.900000 0 181.700000 5396.900000 0 181.700000 5397.600000 0
+updateFillColor 0.564697 0.564697 0.564697 1.000000
+eoFillPath subpath 1 181.700000 5396.900000 0 494.500000 5396.900000 0 494.500000 5396.100000 0 181.700000 5396.100000 0 181.700000 5396.900000 0
+updateFillColor 0.568619 0.568619 0.568619 1.000000
+eoFillPath subpath 1 181.700000 5396.100000 0 494.500000 5396.100000 0 494.500000 5395.400000 0 181.700000 5395.400000 0 181.700000 5396.100000 0
+updateFillColor 0.572525 0.572525 0.572525 1.000000
+eoFillPath subpath 1 181.700000 5395.400000 0 494.500000 5395.400000 0 494.500000 5394.600000 0 181.700000 5394.600000 0 181.700000 5395.400000 0
+updateFillColor 0.576462 0.576462 0.576462 1.000000
+eoFillPath subpath 1 181.700000 5394.600000 0 494.500000 5394.600000 0 494.500000 5393.800000 0 181.700000 5393.800000 0 181.700000 5394.600000 0
+updateFillColor 0.580383 0.580383 0.580383 1.000000
+eoFillPath subpath 1 181.700000 5393.800000 0 494.500000 5393.800000 0 494.500000 5393.100000 0 181.700000 5393.100000 0 181.700000 5393.800000 0
+updateFillColor 0.584305 0.584305 0.584305 1.000000
+eoFillPath subpath 1 181.700000 5393.100000 0 494.500000 5393.100000 0 494.500000 5392.300000 0 181.700000 5392.300000 0 181.700000 5393.100000 0
+updateFillColor 0.588226 0.588226 0.588226 1.000000
+eoFillPath subpath 1 181.700000 5392.300000 0 494.500000 5392.300000 0 494.500000 5391.600000 0 181.700000 5391.600000 0 181.700000 5392.300000 0
+updateFillColor 0.592148 0.592148 0.592148 1.000000
+eoFillPath subpath 1 181.700000 5391.600000 0 494.500000 5391.600000 0 494.500000 5390.800000 0 181.700000 5390.800000 0 181.700000 5391.600000 0
+updateFillColor 0.596069 0.596069 0.596069 1.000000
+eoFillPath subpath 1 181.700000 5390.800000 0 494.500000 5390.800000 0 494.500000 5390.100000 0 181.700000 5390.100000 0 181.700000 5390.800000 0
+updateFillColor 0.599991 0.599991 0.599991 1.000000
+eoFillPath subpath 1 181.700000 5390.100000 0 494.500000 5390.100000 0 494.500000 5389.300000 0 181.700000 5389.300000 0 181.700000 5390.100000 0
+updateFillColor 0.603912 0.603912 0.603912 1.000000
+eoFillPath subpath 1 181.700000 5389.300000 0 494.500000 5389.300000 0 494.500000 5388.500000 0 181.700000 5388.500000 0 181.700000 5389.300000 0
+updateFillColor 0.607834 0.607834 0.607834 1.000000
+eoFillPath subpath 1 181.700000 5388.500000 0 494.500000 5388.500000 0 494.500000 5387.800000 0 181.700000 5387.800000 0 181.700000 5388.500000 0
+updateFillColor 0.611755 0.611755 0.611755 1.000000
+eoFillPath subpath 1 181.700000 5387.800000 0 494.500000 5387.800000 0 494.500000 5387.000000 0 181.700000 5387.000000 0 181.700000 5387.800000 0
+updateFillColor 0.615677 0.615677 0.615677 1.000000
+eoFillPath subpath 1 181.700000 5387.000000 0 494.500000 5387.000000 0 494.500000 5386.300000 0 181.700000 5386.300000 0 181.700000 5387.000000 0
+updateFillColor 0.619598 0.619598 0.619598 1.000000
+eoFillPath subpath 1 181.700000 5386.300000 0 494.500000 5386.300000 0 494.500000 5385.500000 0 181.700000 5385.500000 0 181.700000 5386.300000 0
+updateFillColor 0.623520 0.623520 0.623520 1.000000
+eoFillPath subpath 1 181.700000 5385.500000 0 494.500000 5385.500000 0 494.500000 5384.700000 0 181.700000 5384.700000 0 181.700000 5385.500000 0
+updateFillColor 0.627441 0.627441 0.627441 1.000000
+eoFillPath subpath 1 181.700000 5384.700000 0 494.500000 5384.700000 0 494.500000 5384.000000 0 181.700000 5384.000000 0 181.700000 5384.700000 0
+updateFillColor 0.631363 0.631363 0.631363 1.000000
+eoFillPath subpath 1 181.700000 5384.000000 0 494.500000 5384.000000 0 494.500000 5383.200000 0 181.700000 5383.200000 0 181.700000 5384.000000 0
+updateFillColor 0.635284 0.635284 0.635284 1.000000
+eoFillPath subpath 1 181.700000 5383.200000 0 494.500000 5383.200000 0 494.500000 5382.500000 0 181.700000 5382.500000 0 181.700000 5383.200000 0
+updateFillColor 0.639206 0.639206 0.639206 1.000000
+eoFillPath subpath 1 181.700000 5382.500000 0 494.500000 5382.500000 0 494.500000 5381.700000 0 181.700000 5381.700000 0 181.700000 5382.500000 0
+updateFillColor 0.643127 0.643127 0.643127 1.000000
+eoFillPath subpath 1 181.700000 5381.700000 0 494.500000 5381.700000 0 494.500000 5381.000000 0 181.700000 5381.000000 0 181.700000 5381.700000 0
+updateFillColor 0.647049 0.647049 0.647049 1.000000
+eoFillPath subpath 1 181.700000 5381.000000 0 494.500000 5381.000000 0 494.500000 5380.200000 0 181.700000 5380.200000 0 181.700000 5381.000000 0
+updateFillColor 0.650970 0.650970 0.650970 1.000000
+eoFillPath subpath 1 181.700000 5380.200000 0 494.500000 5380.200000 0 494.500000 5379.400000 0 181.700000 5379.400000 0 181.700000 5380.200000 0
+updateFillColor 0.654892 0.654892 0.654892 1.000000
+eoFillPath subpath 1 181.700000 5379.400000 0 494.500000 5379.400000 0 494.500000 5378.700000 0 181.700000 5378.700000 0 181.700000 5379.400000 0
+updateFillColor 0.658813 0.658813 0.658813 1.000000
+eoFillPath subpath 1 181.700000 5378.700000 0 494.500000 5378.700000 0 494.500000 5377.900000 0 181.700000 5377.900000 0 181.700000 5378.700000 0
+updateFillColor 0.662735 0.662735 0.662735 1.000000
+eoFillPath subpath 1 181.700000 5377.900000 0 494.500000 5377.900000 0 494.500000 5377.200000 0 181.700000 5377.200000 0 181.700000 5377.900000 0
+updateFillColor 0.666656 0.666656 0.666656 1.000000
+eoFillPath subpath 1 181.700000 5377.200000 0 494.500000 5377.200000 0 494.500000 5376.400000 0 181.700000 5376.400000 0 181.700000 5377.200000 0
+updateFillColor 0.670578 0.670578 0.670578 1.000000
+eoFillPath subpath 1 181.700000 5376.400000 0 494.500000 5376.400000 0 494.500000 5375.600000 0 181.700000 5375.600000 0 181.700000 5376.400000 0
+updateFillColor 0.674500 0.674500 0.674500 1.000000
+eoFillPath subpath 1 181.700000 5375.600000 0 494.500000 5375.600000 0 494.500000 5374.900000 0 181.700000 5374.900000 0 181.700000 5375.600000 0
+updateFillColor 0.678421 0.678421 0.678421 1.000000
+eoFillPath subpath 1 181.700000 5374.900000 0 494.500000 5374.900000 0 494.500000 5374.100000 0 181.700000 5374.100000 0 181.700000 5374.900000 0
+updateFillColor 0.682343 0.682343 0.682343 1.000000
+eoFillPath subpath 1 181.700000 5374.100000 0 494.500000 5374.100000 0 494.500000 5373.400000 0 181.700000 5373.400000 0 181.700000 5374.100000 0
+updateFillColor 0.686264 0.686264 0.686264 1.000000
+eoFillPath subpath 1 181.700000 5373.400000 0 494.500000 5373.400000 0 494.500000 5372.600000 0 181.700000 5372.600000 0 181.700000 5373.400000 0
+updateFillColor 0.690186 0.690186 0.690186 1.000000
+eoFillPath subpath 1 181.700000 5372.600000 0 494.500000 5372.600000 0 494.500000 5371.800000 0 181.700000 5371.800000 0 181.700000 5372.600000 0
+updateFillColor 0.694107 0.694107 0.694107 1.000000
+eoFillPath subpath 1 181.700000 5371.800000 0 494.500000 5371.800000 0 494.500000 5371.100000 0 181.700000 5371.100000 0 181.700000 5371.800000 0
+updateFillColor 0.698029 0.698029 0.698029 1.000000
+eoFillPath subpath 1 181.700000 5371.100000 0 494.500000 5371.100000 0 494.500000 5370.300000 0 181.700000 5370.300000 0 181.700000 5371.100000 0
+updateFillColor 0.701950 0.701950 0.701950 1.000000
+eoFillPath subpath 1 181.700000 5370.300000 0 494.500000 5370.300000 0 494.500000 5369.600000 0 181.700000 5369.600000 0 181.700000 5370.300000 0
+updateFillColor 0.705872 0.705872 0.705872 1.000000
+eoFillPath subpath 1 181.700000 5369.600000 0 494.500000 5369.600000 0 494.500000 5368.800000 0 181.700000 5368.800000 0 181.700000 5369.600000 0
+updateFillColor 0.709793 0.709793 0.709793 1.000000
+eoFillPath subpath 1 181.700000 5368.800000 0 494.500000 5368.800000 0 494.500000 5368.100000 0 181.700000 5368.100000 0 181.700000 5368.800000 0
+updateFillColor 0.713715 0.713715 0.713715 1.000000
+eoFillPath subpath 1 181.700000 5368.100000 0 494.500000 5368.100000 0 494.500000 5367.300000 0 181.700000 5367.300000 0 181.700000 5368.100000 0
+updateFillColor 0.717636 0.717636 0.717636 1.000000
+eoFillPath subpath 1 181.700000 5367.300000 0 494.500000 5367.300000 0 494.500000 5366.500000 0 181.700000 5366.500000 0 181.700000 5367.300000 0
+updateFillColor 0.721558 0.721558 0.721558 1.000000
+eoFillPath subpath 1 181.700000 5366.500000 0 494.500000 5366.500000 0 494.500000 5365.800000 0 181.700000 5365.800000 0 181.700000 5366.500000 0
+updateFillColor 0.725479 0.725479 0.725479 1.000000
+eoFillPath subpath 1 181.700000 5365.800000 0 494.500000 5365.800000 0 494.500000 5365.000000 0 181.700000 5365.000000 0 181.700000 5365.800000 0
+updateFillColor 0.729401 0.729401 0.729401 1.000000
+eoFillPath subpath 1 181.700000 5365.000000 0 494.500000 5365.000000 0 494.500000 5364.300000 0 181.700000 5364.300000 0 181.700000 5365.000000 0
+updateFillColor 0.733322 0.733322 0.733322 1.000000
+eoFillPath subpath 1 181.700000 5364.300000 0 494.500000 5364.300000 0 494.500000 5363.500000 0 181.700000 5363.500000 0 181.700000 5364.300000 0
+updateFillColor 0.737244 0.737244 0.737244 1.000000
+eoFillPath subpath 1 181.700000 5363.500000 0 494.500000 5363.500000 0 494.500000 5362.700000 0 181.700000 5362.700000 0 181.700000 5363.500000 0
+updateFillColor 0.741165 0.741165 0.741165 1.000000
+eoFillPath subpath 1 181.700000 5362.700000 0 494.500000 5362.700000 0 494.500000 5362.000000 0 181.700000 5362.000000 0 181.700000 5362.700000 0
+updateFillColor 0.745087 0.745087 0.745087 1.000000
+eoFillPath subpath 1 181.700000 5362.000000 0 494.500000 5362.000000 0 494.500000 5361.200000 0 181.700000 5361.200000 0 181.700000 5362.000000 0
+updateFillColor 0.749008 0.749008 0.749008 1.000000
+eoFillPath subpath 1 181.700000 5361.200000 0 494.500000 5361.200000 0 494.500000 5360.500000 0 181.700000 5360.500000 0 181.700000 5361.200000 0
+updateFillColor 0.752930 0.752930 0.752930 1.000000
+eoFillPath subpath 1 181.700000 5360.500000 0 494.500000 5360.500000 0 494.500000 5359.700000 0 181.700000 5359.700000 0 181.700000 5360.500000 0
+updateFillColor 0.756851 0.756851 0.756851 1.000000
+eoFillPath subpath 1 181.700000 5359.700000 0 494.500000 5359.700000 0 494.500000 5358.900000 0 181.700000 5358.900000 0 181.700000 5359.700000 0
+updateFillColor 0.760773 0.760773 0.760773 1.000000
+eoFillPath subpath 1 181.700000 5358.900000 0 494.500000 5358.900000 0 494.500000 5358.200000 0 181.700000 5358.200000 0 181.700000 5358.900000 0
+updateFillColor 0.764694 0.764694 0.764694 1.000000
+eoFillPath subpath 1 181.700000 5358.200000 0 494.500000 5358.200000 0 494.500000 5357.400000 0 181.700000 5357.400000 0 181.700000 5358.200000 0
+updateFillColor 0.768616 0.768616 0.768616 1.000000
+eoFillPath subpath 1 181.700000 5357.400000 0 494.500000 5357.400000 0 494.500000 5356.700000 0 181.700000 5356.700000 0 181.700000 5357.400000 0
+updateFillColor 0.772537 0.772537 0.772537 1.000000
+eoFillPath subpath 1 181.700000 5356.700000 0 494.500000 5356.700000 0 494.500000 5355.900000 0 181.700000 5355.900000 0 181.700000 5356.700000 0
+updateFillColor 0.776459 0.776459 0.776459 1.000000
+eoFillPath subpath 1 181.700000 5355.900000 0 494.500000 5355.900000 0 494.500000 5355.200000 0 181.700000 5355.200000 0 181.700000 5355.900000 0
+updateFillColor 0.780380 0.780380 0.780380 1.000000
+eoFillPath subpath 1 181.700000 5355.200000 0 494.500000 5355.200000 0 494.500000 5354.400000 0 181.700000 5354.400000 0 181.700000 5355.200000 0
+updateFillColor 0.784302 0.784302 0.784302 1.000000
+eoFillPath subpath 1 181.700000 5354.400000 0 494.500000 5354.400000 0 494.500000 5353.600000 0 181.700000 5353.600000 0 181.700000 5354.400000 0
+updateFillColor 0.788223 0.788223 0.788223 1.000000
+eoFillPath subpath 1 181.700000 5353.600000 0 494.500000 5353.600000 0 494.500000 5352.900000 0 181.700000 5352.900000 0 181.700000 5353.600000 0
+updateFillColor 0.792145 0.792145 0.792145 1.000000
+eoFillPath subpath 1 181.700000 5352.900000 0 494.500000 5352.900000 0 494.500000 5352.100000 0 181.700000 5352.100000 0 181.700000 5352.900000 0
+updateFillColor 0.796066 0.796066 0.796066 1.000000
+eoFillPath subpath 1 181.700000 5352.100000 0 494.500000 5352.100000 0 494.500000 5351.400000 0 181.700000 5351.400000 0 181.700000 5352.100000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 181.700000 5351.400000 0 494.500000 5351.400000 0 494.500000 5350.600000 0 181.700000 5350.600000 0 181.700000 5351.400000 0
+updateFillColor 0.803909 0.803909 0.803909 1.000000
+eoFillPath subpath 1 181.700000 5350.600000 0 494.500000 5350.600000 0 494.500000 5349.800000 0 181.700000 5349.800000 0 181.700000 5350.600000 0
+updateFillColor 0.807831 0.807831 0.807831 1.000000
+eoFillPath subpath 1 181.700000 5349.800000 0 494.500000 5349.800000 0 494.500000 5349.100000 0 181.700000 5349.100000 0 181.700000 5349.800000 0
+updateFillColor 0.811752 0.811752 0.811752 1.000000
+eoFillPath subpath 1 181.700000 5349.100000 0 494.500000 5349.100000 0 494.500000 5348.300000 0 181.700000 5348.300000 0 181.700000 5349.100000 0
+updateFillColor 0.815674 0.815674 0.815674 1.000000
+eoFillPath subpath 1 181.700000 5348.300000 0 494.500000 5348.300000 0 494.500000 5347.600000 0 181.700000 5347.600000 0 181.700000 5348.300000 0
+updateFillColor 0.819595 0.819595 0.819595 1.000000
+eoFillPath subpath 1 181.700000 5347.600000 0 494.500000 5347.600000 0 494.500000 5346.800000 0 181.700000 5346.800000 0 181.700000 5347.600000 0
+updateFillColor 0.823517 0.823517 0.823517 1.000000
+eoFillPath subpath 1 181.700000 5346.800000 0 494.500000 5346.800000 0 494.500000 5346.000000 0 181.700000 5346.000000 0 181.700000 5346.800000 0
+updateFillColor 0.827438 0.827438 0.827438 1.000000
+eoFillPath subpath 1 181.700000 5346.000000 0 494.500000 5346.000000 0 494.500000 5345.300000 0 181.700000 5345.300000 0 181.700000 5346.000000 0
+updateFillColor 0.831360 0.831360 0.831360 1.000000
+eoFillPath subpath 1 181.700000 5345.300000 0 494.500000 5345.300000 0 494.500000 5344.500000 0 181.700000 5344.500000 0 181.700000 5345.300000 0
+updateFillColor 0.835281 0.835281 0.835281 1.000000
+eoFillPath subpath 1 181.700000 5344.500000 0 494.500000 5344.500000 0 494.500000 5343.800000 0 181.700000 5343.800000 0 181.700000 5344.500000 0
+updateFillColor 0.839203 0.839203 0.839203 1.000000
+eoFillPath subpath 1 181.700000 5343.800000 0 494.500000 5343.800000 0 494.500000 5343.000000 0 181.700000 5343.000000 0 181.700000 5343.800000 0
+updateFillColor 0.843124 0.843124 0.843124 1.000000
+eoFillPath subpath 1 181.700000 5343.000000 0 494.500000 5343.000000 0 494.500000 5342.300000 0 181.700000 5342.300000 0 181.700000 5343.000000 0
+updateFillColor 0.847046 0.847046 0.847046 1.000000
+eoFillPath subpath 1 181.700000 5342.300000 0 494.500000 5342.300000 0 494.500000 5341.500000 0 181.700000 5341.500000 0 181.700000 5342.300000 0
+updateFillColor 0.850967 0.850967 0.850967 1.000000
+eoFillPath subpath 1 181.700000 5341.500000 0 494.500000 5341.500000 0 494.500000 5340.700000 0 181.700000 5340.700000 0 181.700000 5341.500000 0
+updateFillColor 0.854889 0.854889 0.854889 1.000000
+eoFillPath subpath 1 181.700000 5340.700000 0 494.500000 5340.700000 0 494.500000 5340.000000 0 181.700000 5340.000000 0 181.700000 5340.700000 0
+updateFillColor 0.858810 0.858810 0.858810 1.000000
+eoFillPath subpath 1 181.700000 5340.000000 0 494.500000 5340.000000 0 494.500000 5339.200000 0 181.700000 5339.200000 0 181.700000 5340.000000 0
+updateFillColor 0.862732 0.862732 0.862732 1.000000
+eoFillPath subpath 1 181.700000 5339.200000 0 494.500000 5339.200000 0 494.500000 5338.500000 0 181.700000 5338.500000 0 181.700000 5339.200000 0
+updateFillColor 0.866653 0.866653 0.866653 1.000000
+eoFillPath subpath 1 181.700000 5338.500000 0 494.500000 5338.500000 0 494.500000 5337.700000 0 181.700000 5337.700000 0 181.700000 5338.500000 0
+updateFillColor 0.870575 0.870575 0.870575 1.000000
+eoFillPath subpath 1 181.700000 5337.700000 0 494.500000 5337.700000 0 494.500000 5336.900000 0 181.700000 5336.900000 0 181.700000 5337.700000 0
+updateFillColor 0.874496 0.874496 0.874496 1.000000
+eoFillPath subpath 1 181.700000 5336.900000 0 494.500000 5336.900000 0 494.500000 5336.200000 0 181.700000 5336.200000 0 181.700000 5336.900000 0
+updateFillColor 0.878418 0.878418 0.878418 1.000000
+eoFillPath subpath 1 181.700000 5336.200000 0 494.500000 5336.200000 0 494.500000 5335.400000 0 181.700000 5335.400000 0 181.700000 5336.200000 0
+updateFillColor 0.882339 0.882339 0.882339 1.000000
+eoFillPath subpath 1 181.700000 5335.400000 0 494.500000 5335.400000 0 494.500000 5334.700000 0 181.700000 5334.700000 0 181.700000 5335.400000 0
+updateFillColor 0.886261 0.886261 0.886261 1.000000
+eoFillPath subpath 1 181.700000 5334.700000 0 494.500000 5334.700000 0 494.500000 5333.900000 0 181.700000 5333.900000 0 181.700000 5334.700000 0
+updateFillColor 0.890182 0.890182 0.890182 1.000000
+eoFillPath subpath 1 181.700000 5333.900000 0 494.500000 5333.900000 0 494.500000 5333.100000 0 181.700000 5333.100000 0 181.700000 5333.900000 0
+updateFillColor 0.894104 0.894104 0.894104 1.000000
+eoFillPath subpath 1 181.700000 5333.100000 0 494.500000 5333.100000 0 494.500000 5332.400000 0 181.700000 5332.400000 0 181.700000 5333.100000 0
+updateFillColor 0.898026 0.898026 0.898026 1.000000
+eoFillPath subpath 1 181.700000 5332.400000 0 494.500000 5332.400000 0 494.500000 5331.600000 0 181.700000 5331.600000 0 181.700000 5332.400000 0
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 181.700000 5331.600000 0 494.500000 5331.600000 0 494.500000 5330.900000 0 181.700000 5330.900000 0 181.700000 5331.600000 0
+updateFillColor 0.905869 0.905869 0.905869 1.000000
+eoFillPath subpath 1 181.700000 5330.900000 0 494.500000 5330.900000 0 494.500000 5330.100000 0 181.700000 5330.100000 0 181.700000 5330.900000 0
+updateFillColor 0.909790 0.909790 0.909790 1.000000
+eoFillPath subpath 1 181.700000 5330.100000 0 494.500000 5330.100000 0 494.500000 5329.400000 0 181.700000 5329.400000 0 181.700000 5330.100000 0
+updateFillColor 0.913712 0.913712 0.913712 1.000000
+eoFillPath subpath 1 181.700000 5329.400000 0 494.500000 5329.400000 0 494.500000 5328.600000 0 181.700000 5328.600000 0 181.700000 5329.400000 0
+updateFillColor 0.917633 0.917633 0.917633 1.000000
+eoFillPath subpath 1 181.700000 5328.600000 0 494.500000 5328.600000 0 494.500000 5327.800000 0 181.700000 5327.800000 0 181.700000 5328.600000 0
+updateFillColor 0.921555 0.921555 0.921555 1.000000
+eoFillPath subpath 1 181.700000 5327.800000 0 494.500000 5327.800000 0 494.500000 5327.100000 0 181.700000 5327.100000 0 181.700000 5327.800000 0
+updateFillColor 0.925476 0.925476 0.925476 1.000000
+eoFillPath subpath 1 181.700000 5327.100000 0 494.500000 5327.100000 0 494.500000 5326.300000 0 181.700000 5326.300000 0 181.700000 5327.100000 0
+updateFillColor 0.929398 0.929398 0.929398 1.000000
+eoFillPath subpath 1 181.700000 5326.300000 0 494.500000 5326.300000 0 494.500000 5325.600000 0 181.700000 5325.600000 0 181.700000 5326.300000 0
+updateFillColor 0.933319 0.933319 0.933319 1.000000
+eoFillPath subpath 1 181.700000 5325.600000 0 494.500000 5325.600000 0 494.500000 5324.800000 0 181.700000 5324.800000 0 181.700000 5325.600000 0
+updateFillColor 0.937241 0.937241 0.937241 1.000000
+eoFillPath subpath 1 181.700000 5324.800000 0 494.500000 5324.800000 0 494.500000 5324.000000 0 181.700000 5324.000000 0 181.700000 5324.800000 0
+updateFillColor 0.941162 0.941162 0.941162 1.000000
+eoFillPath subpath 1 181.700000 5324.000000 0 494.500000 5324.000000 0 494.500000 5323.300000 0 181.700000 5323.300000 0 181.700000 5324.000000 0
+updateFillColor 0.945084 0.945084 0.945084 1.000000
+eoFillPath subpath 1 181.700000 5323.300000 0 494.500000 5323.300000 0 494.500000 5322.500000 0 181.700000 5322.500000 0 181.700000 5323.300000 0
+updateFillColor 0.949005 0.949005 0.949005 1.000000
+eoFillPath subpath 1 181.700000 5322.500000 0 494.500000 5322.500000 0 494.500000 5321.800000 0 181.700000 5321.800000 0 181.700000 5322.500000 0
+updateFillColor 0.952927 0.952927 0.952927 1.000000
+eoFillPath subpath 1 181.700000 5321.800000 0 494.500000 5321.800000 0 494.500000 5321.000000 0 181.700000 5321.000000 0 181.700000 5321.800000 0
+updateFillColor 0.956848 0.956848 0.956848 1.000000
+eoFillPath subpath 1 181.700000 5321.000000 0 494.500000 5321.000000 0 494.500000 5320.200000 0 181.700000 5320.200000 0 181.700000 5321.000000 0
+updateFillColor 0.960770 0.960770 0.960770 1.000000
+eoFillPath subpath 1 181.700000 5320.200000 0 494.500000 5320.200000 0 494.500000 5319.500000 0 181.700000 5319.500000 0 181.700000 5320.200000 0
+updateFillColor 0.964691 0.964691 0.964691 1.000000
+eoFillPath subpath 1 181.700000 5319.500000 0 494.500000 5319.500000 0 494.500000 5318.700000 0 181.700000 5318.700000 0 181.700000 5319.500000 0
+updateFillColor 0.968613 0.968613 0.968613 1.000000
+eoFillPath subpath 1 181.700000 5318.700000 0 494.500000 5318.700000 0 494.500000 5318.000000 0 181.700000 5318.000000 0 181.700000 5318.700000 0
+updateFillColor 0.972534 0.972534 0.972534 1.000000
+eoFillPath subpath 1 181.700000 5318.000000 0 494.500000 5318.000000 0 494.500000 5317.200000 0 181.700000 5317.200000 0 181.700000 5318.000000 0
+updateFillColor 0.976456 0.976456 0.976456 1.000000
+eoFillPath subpath 1 181.700000 5317.200000 0 494.500000 5317.200000 0 494.500000 5316.500000 0 181.700000 5316.500000 0 181.700000 5317.200000 0
+updateFillColor 0.980377 0.980377 0.980377 1.000000
+eoFillPath subpath 1 181.700000 5316.500000 0 494.500000 5316.500000 0 494.500000 5315.700000 0 181.700000 5315.700000 0 181.700000 5316.500000 0
+updateFillColor 0.984299 0.984299 0.984299 1.000000
+eoFillPath subpath 1 181.700000 5315.700000 0 494.500000 5315.700000 0 494.500000 5314.900000 0 181.700000 5314.900000 0 181.700000 5315.700000 0
+updateFillColor 0.988220 0.988220 0.988220 1.000000
+eoFillPath subpath 1 181.700000 5314.900000 0 494.500000 5314.900000 0 494.500000 5314.200000 0 181.700000 5314.200000 0 181.700000 5314.900000 0
+updateFillColor 0.992142 0.992142 0.992142 1.000000
+eoFillPath subpath 1 181.700000 5314.200000 0 494.500000 5314.200000 0 494.500000 5313.400000 0 181.700000 5313.400000 0 181.700000 5314.200000 0
+updateStrokeColor 0.000000 0.000000 0.000000 1.000000
+strokePath subpath 1 338.100000 5313.500000 0 181.800000 5313.500000 0 181.800000 5506.800000 0 494.400000 5506.800000 0 494.400000 5313.500000 0 338.100000 5313.500000 0
+strokePath subpath 1 338.100000 5313.500000 0 181.800000 5313.500000 0 181.800000 5506.800000 0 494.400000 5506.800000 0 494.400000 5313.500000 0 338.100000 5313.500000 0
+saveState
+updateCtm 11420.000000 0.000000 0.000000 -8760.000000 20530.000000 -459750.000000
+drawSoftMaskedImage 1143 877 1143 877 JPEG 71324 PPM 3007249
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 210.400000 5352.524000 215.488000 5344.524000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 215.504000 5352.524000 220.592000 5344.524000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 220.608000 5352.524000 225.696000 5344.524000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 225.712000 5352.524000 230.800000 5344.524000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 236.300000 5344.924000 241.388000 5336.924000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 241.404000 5344.924000 246.492000 5336.924000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 246.508000 5344.924000 251.596000 5336.924000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 251.612000 5344.924000 256.700000 5336.924000 1.000000 0.000000 0.000000 1.000000 6
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 262.100000 5337.224000 267.188000 5329.224000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 267.204000 5337.224000 272.292000 5329.224000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 272.308000 5337.224000 277.396000 5329.224000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 277.412000 5337.224000 282.500000 5329.224000 1.000000 0.000000 0.000000 1.000000 7
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 288.000000 5329.624000 293.088000 5321.624000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 293.104000 5329.624000 298.192000 5321.624000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 298.208000 5329.624000 303.296000 5321.624000 1.000000 0.000000 0.000000 1.000000 9
+drawChar 303.312000 5329.624000 308.400000 5321.624000 1.000000 0.000000 0.000000 1.000000 8
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 197.500000 5367.524000 202.588000 5359.524000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 196.600000 5386.824000 201.688000 5378.824000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 190.700000 5406.124000 195.788000 5398.124000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 195.804000 5406.124000 200.892000 5398.124000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 189.800000 5425.524000 194.888000 5417.524000 1.000000 0.000000 0.000000 1.000000 1
+drawChar 194.904000 5425.524000 199.992000 5417.524000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.900000 5444.824000 193.988000 5436.824000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 194.004000 5444.824000 199.092000 5436.824000 1.000000 0.000000 0.000000 1.000000 0
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 188.000000 5464.124000 193.088000 5456.124000 1.000000 0.000000 0.000000 1.000000 2
+drawChar 193.104000 5464.124000 198.192000 5456.124000 1.000000 0.000000 0.000000 1.000000 5
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 324.700000 5336.224000 330.188000 5328.224000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 330.500000 5336.224000 332.716000 5328.224000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 332.700000 5336.224000 337.596000 5328.224000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 337.004000 5336.224000 341.396000 5328.224000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 341.404000 5336.224000 346.036000 5328.224000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 346.508000 5336.224000 350.900000 5328.224000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 350.908000 5336.224000 355.972000 5328.224000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 355.908000 5336.224000 359.196000 5328.224000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 358.908000 5336.224000 362.196000 5328.224000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 362.508000 5336.224000 367.404000 5328.224000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 366.812000 5336.224000 371.876000 5328.224000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 371.916000 5336.224000 375.052000 5328.224000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 356.100000 5355.724000 361.172000 5347.724000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 361.204000 5355.724000 364.340000 5347.724000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 364.108000 5355.724000 367.396000 5347.724000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 367.708000 5355.724000 372.604000 5347.724000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 372.812000 5355.724000 379.348000 5347.724000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 379.412000 5355.724000 384.484000 5347.724000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 384.516000 5355.724000 389.436000 5347.724000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 388.820000 5355.724000 392.108000 5347.724000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 392.420000 5355.724000 395.708000 5347.724000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 395.324000 5355.724000 397.540000 5347.724000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 397.524000 5355.724000 402.444000 5347.724000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 402.628000 5355.724000 406.788000 5347.724000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 387.500000 5375.324000 392.972000 5367.324000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 393.004000 5375.324000 398.076000 5367.324000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 398.108000 5375.324000 403.180000 5367.324000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 403.212000 5375.324000 405.428000 5367.324000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 405.412000 5375.324000 410.332000 5367.324000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 410.316000 5375.324000 414.476000 5367.324000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 1.000000 1.000000 1.000000 1.000000
+updateFont 98 1 0 0 0 1400.000000 0 DAAAAA+DejaVuSerif
+drawChar 293.600000 5502.892000 305.808000 5488.892000 1.000000 0.000000 0.000000 1.000000 H
+drawChar 305.794000 5502.892000 314.138000 5488.892000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 314.096000 5502.892000 320.788000 5488.892000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 320.802000 5502.892000 328.698000 5488.892000 1.000000 0.000000 0.000000 1.000000 v
+drawChar 328.698000 5502.892000 336.972000 5488.892000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 337.000000 5502.892000 344.182000 5488.892000 1.000000 0.000000 0.000000 1.000000 s
+drawChar 344.196000 5502.892000 349.810000 5488.892000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 349.796000 5502.892000 354.234000 5488.892000 1.000000 0.000000 0.000000 1.000000
+drawChar 354.290000 5502.892000 362.718000 5488.892000 1.000000 0.000000 0.000000 1.000000 o
+drawChar 362.690000 5502.892000 367.870000 5488.892000 1.000000 0.000000 0.000000 1.000000 f
+drawChar 367.884000 5502.892000 372.322000 5488.892000 1.000000 0.000000 0.000000 1.000000
+drawChar 372.378000 5502.892000 382.080000 5488.892000 1.000000 0.000000 0.000000 1.000000 F
+drawChar 382.080000 5502.892000 388.772000 5488.892000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 388.786000 5502.892000 397.802000 5488.892000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 397.788000 5502.892000 402.254000 5488.892000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 402.282000 5502.892000 407.896000 5488.892000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateLineWidth 0.000000
+updateLineCap 0
+updateLineJoin 1
+strokePath subpath 1 458.900000 5380.000000 0 424.300000 5380.000000 0 424.300000 5440.700000 0 493.600000 5440.700000 0 493.600000 5380.000000 0 458.900000 5380.000000 0
+restoreState
+updateFillColor 0.901947 0.901947 0.901947 1.000000
+eoFillPath subpath 1 431.900000 5431.100000 0 428.900000 5431.100000 0 428.900000 5437.000000 0 434.800000 5437.000000 0 434.800000 5431.100000 0 431.900000 5431.100000 0
+updateFillColor 0.298019 0.298019 0.298019 1.000000
+eoFillPath subpath 1 431.900000 5420.000000 0 428.900000 5420.000000 0 428.900000 5426.000000 0 434.800000 5426.000000 0 434.800000 5420.000000 0 431.900000 5420.000000 0
+updateFillColor 0.399994 0.399994 0.399994 1.000000
+eoFillPath subpath 1 431.900000 5408.900000 0 428.900000 5408.900000 0 428.900000 5414.900000 0 434.800000 5414.900000 0 434.800000 5408.900000 0 431.900000 5408.900000 0
+updateFillColor 0.799988 0.799988 0.799988 1.000000
+eoFillPath subpath 1 431.900000 5397.800000 0 428.900000 5397.800000 0 428.900000 5403.800000 0 434.800000 5403.800000 0 434.800000 5397.800000 0 431.900000 5397.800000 0
+updateFillColor 0.199997 0.199997 0.199997 1.000000
+eoFillPath subpath 1 431.900000 5386.700000 0 428.900000 5386.700000 0 428.900000 5392.700000 0 434.800000 5392.700000 0 434.800000 5386.700000 0 431.900000 5386.700000 0
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 5438.224000 443.288000 5430.224000 1.000000 0.000000 0.000000 1.000000 B
+drawChar 443.600000 5438.224000 445.816000 5430.224000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 445.704000 5438.224000 450.600000 5430.224000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 450.104000 5438.224000 454.496000 5430.224000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 454.504000 5438.224000 459.136000 5430.224000 1.000000 0.000000 0.000000 1.000000 k
+drawChar 459.608000 5438.224000 464.000000 5430.224000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 463.912000 5438.224000 468.976000 5430.224000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 469.016000 5438.224000 472.304000 5430.224000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 471.920000 5438.224000 475.208000 5430.224000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 475.624000 5438.224000 480.520000 5430.224000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 479.928000 5438.224000 484.992000 5430.224000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 485.032000 5438.224000 488.168000 5430.224000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 5427.124000 443.352000 5419.124000 1.000000 0.000000 0.000000 1.000000 R
+drawChar 443.000000 5427.124000 447.920000 5419.124000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 447.904000 5427.124000 452.976000 5419.124000 1.000000 0.000000 0.000000 1.000000 d
+drawChar 453.008000 5427.124000 457.400000 5419.124000 1.000000 0.000000 0.000000 1.000000 c
+drawChar 457.408000 5427.124000 462.472000 5419.124000 1.000000 0.000000 0.000000 1.000000 u
+drawChar 462.512000 5427.124000 465.800000 5419.124000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 465.616000 5427.124000 468.904000 5419.124000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 468.920000 5427.124000 473.816000 5419.124000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 473.824000 5427.124000 478.888000 5419.124000 1.000000 0.000000 0.000000 1.000000 n
+drawChar 478.928000 5427.124000 482.064000 5419.124000 1.000000 0.000000 0.000000 1.000000 t
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 5416.024000 442.872000 5408.024000 1.000000 0.000000 0.000000 1.000000 S
+drawChar 442.904000 5416.024000 446.040000 5408.024000 1.000000 0.000000 0.000000 1.000000 t
+drawChar 445.704000 5416.024000 448.992000 5408.024000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 449.408000 5416.024000 454.304000 5408.024000 1.000000 0.000000 0.000000 1.000000 a
+drawChar 454.512000 5416.024000 461.048000 5408.024000 1.000000 0.000000 0.000000 1.000000 w
+drawChar 461.112000 5416.024000 466.184000 5408.024000 1.000000 0.000000 0.000000 1.000000 b
+drawChar 466.216000 5416.024000 471.136000 5408.024000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 470.520000 5416.024000 473.808000 5408.024000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 474.120000 5416.024000 477.408000 5408.024000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 477.024000 5416.024000 479.240000 5408.024000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 479.224000 5416.024000 484.144000 5408.024000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 484.328000 5416.024000 488.488000 5408.024000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 5404.924000 443.384000 5396.924000 1.000000 0.000000 0.000000 1.000000 C
+drawChar 443.400000 5404.924000 448.464000 5396.924000 1.000000 0.000000 0.000000 1.000000 h
+drawChar 448.504000 5404.924000 453.424000 5396.924000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 453.408000 5404.924000 456.696000 5396.924000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 456.512000 5404.924000 459.800000 5396.924000 1.000000 0.000000 0.000000 1.000000 r
+drawChar 459.816000 5404.924000 462.032000 5396.924000 1.000000 0.000000 0.000000 1.000000 i
+drawChar 462.016000 5404.924000 466.936000 5396.924000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 466.920000 5404.924000 471.080000 5396.924000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+saveState
+updateFillColor 0.000000 0.000000 0.000000 1.000000
+updateFont 108 1 0 0 0 800.000000 0 CAAAAA+DejaVuSans
+drawChar 437.800000 5393.824000 443.272000 5385.824000 1.000000 0.000000 0.000000 1.000000 A
+drawChar 443.304000 5393.824000 448.376000 5385.824000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 448.408000 5393.824000 453.480000 5385.824000 1.000000 0.000000 0.000000 1.000000 p
+drawChar 453.512000 5393.824000 455.728000 5385.824000 1.000000 0.000000 0.000000 1.000000 l
+drawChar 455.712000 5393.824000 460.632000 5385.824000 1.000000 0.000000 0.000000 1.000000 e
+drawChar 460.616000 5393.824000 464.776000 5385.824000 1.000000 0.000000 0.000000 1.000000 s
+endTextObject
+restoreState
+restoreState
+saveState
+eoClipPath subpath 1 72.000000 2748.900000 0 114.800000 2748.900000 0 114.800000 2791.700000 0 72.000000 2791.700000 0 72.000000 2748.900000 0
+saveState
+updateCtm 4280.000000 0.000000 0.000000 -4270.000000 7200.000000 -195700.000000
+drawSoftMaskedImage 57 57 57 57 JPEG 3113 PPM 9760
+restoreState
+restoreState
+restoreState
+endPage
diff --git a/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx
new file mode 100644
index 000000000..3ad139b65
--- /dev/null
+++ b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx
@@ -0,0 +1,1168 @@
+/* -*- 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 "pdfioutdev_gpl.hxx"
+#include "pnghelper.hxx"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <math.h>
+
+#include <memory>
+#include <vector>
+
+// sigh, UTF8.h was removed in poppler-0.21.0 and put back in 0.21.1, then renamed to UnicodeMapFuncs.h in 0.62.0
+// FIXME: we can't use #if POPPLER_CHECK_VERSION(0, 21, 0) && !POPPLER_CHECK_VERSION(0, 21, 1)
+// because the internal poppler does not provide poppler-version.h and the macro always returns 0
+#if POPPLER_CHECK_VERSION(0, 62, 0)
+#include <UnicodeMapFuncs.h>
+#elif POPPLER_CHECK_VERSION(0, 21, 1)
+#include <UTF8.h>
+#elif POPPLER_CHECK_VERSION(0, 21, 0)
+#include "UTF.h"
+#else
+#include "UTF8.h"
+#endif
+
+#ifdef _WIN32
+# define snprintf _snprintf
+
+#if defined __GNUC__
+#pragma GCC diagnostic warning "-Wformat"
+#pragma GCC diagnostic warning "-Wformat-extra-args"
+#endif
+#endif
+
+/* SYNC STREAMS
+ ============
+
+ We stream human-readable tokens to stdout, and binary data (fonts,
+ bitmaps) to g_binary_out. Another process reads from those pipes, and
+ there lies the rub: things can deadlock, if the two involved
+ processes access the pipes in different order. At any point in
+ time, both processes must access the same pipe. To ensure this,
+ data must be flushed to the OS before writing to a different pipe,
+ otherwise not-yet-written data will leave the reading process
+ waiting on the wrong pipe.
+ */
+
+namespace pdfi
+{
+
+/// cut off very small numbers & clamp value to zero
+static double normalize( double val )
+{
+ return fabs(val) < 0.0000001 ? 0.0 : val;
+}
+
+namespace
+{
+
+/** Escapes line-ending characters (\n and \r) in input string.
+ */
+std::vector<char> lcl_escapeLineFeeds(const char* const i_pStr)
+{
+ size_t nLength(strlen(i_pStr));
+ std::vector<char> aBuffer;
+ aBuffer.reserve(2*nLength+1);
+
+ const char* pRead = i_pStr;
+ while( nLength-- )
+ {
+ if( *pRead == '\r' )
+ {
+ aBuffer.push_back('\\');
+ aBuffer.push_back('r');
+ }
+ else if( *pRead == '\n' )
+ {
+ aBuffer.push_back('\\');
+ aBuffer.push_back('n');
+ }
+ else if( *pRead == '\\' )
+ {
+ aBuffer.push_back('\\');
+ aBuffer.push_back('\\');
+ }
+ else
+ aBuffer.push_back(*pRead);
+ pRead++;
+ }
+ aBuffer.push_back(0);
+
+ return aBuffer;
+}
+
+}
+
+/// for the temp char buffer the header gets snprintfed in
+#define WRITE_BUFFER_SIZE 1024
+
+/// for the initial std::vector capacity when copying stream from xpdf
+#define WRITE_BUFFER_INITIAL_CAPACITY (1024*100)
+
+static void initBuf(OutputBuffer& io_rBuffer)
+{
+ io_rBuffer.reserve(WRITE_BUFFER_INITIAL_CAPACITY);
+}
+
+static void writeBinaryBuffer( const OutputBuffer& rBuffer )
+{
+ // ---sync point--- see SYNC STREAMS above
+ fflush(stdout);
+
+ // put buffer to stderr
+ if( !rBuffer.empty() )
+ if( fwrite(rBuffer.data(), sizeof(char),
+ rBuffer.size(), g_binary_out) != static_cast<size_t>(rBuffer.size()) )
+ exit(1); // error
+
+ // ---sync point--- see SYNC STREAMS above
+ fflush(g_binary_out);
+}
+
+static bool ExtractJpegData(Stream* str, OutputBuffer& outBuf)
+{
+ int bytesToMarker = 0;
+ int bytesToLen = -1;
+ bool collectBytes = false;
+ int startOfScan = 0;
+ int b1 = -1;
+ for (; ; )
+ {
+ const int b2 = b1;
+ b1 = str->getChar();
+
+ if (b1 == -1)
+ return false;
+
+ if (collectBytes)
+ {
+ outBuf.push_back(static_cast<Output_t>(b1));
+
+ bytesToMarker--;
+ bytesToLen--;
+ }
+
+ if (bytesToMarker == 0)
+ {
+ if (startOfScan == 1)
+ {
+ bytesToMarker = -1;
+ startOfScan = 2;
+ }
+ else if (b2 == 0xFF)
+ {
+ if (b1 == 0xD8)
+ {
+ collectBytes = true;
+ bytesToMarker = 2;
+
+ outBuf.push_back(Output_t(0xFF));
+ outBuf.push_back(Output_t(0xD8));
+ }
+ else
+ {
+ bytesToLen = 2;
+ }
+ if (b1 == 0xDA)
+ {
+ startOfScan = 1;
+ }
+ }
+ else if (collectBytes)
+ {
+ return false;
+ }
+ }
+
+ if (bytesToLen == 0)
+ {
+ bytesToMarker = b2 * 256 + b1;
+ }
+
+ if (startOfScan == 2)
+ if ((b2 == 0xFF) && (b1 == 0xD9))
+ return true;
+ }
+}
+
+static void writeJpeg_( OutputBuffer& o_rOutputBuf, Stream* str )
+{
+ // dump JPEG file as-is
+#if POPPLER_CHECK_VERSION(0, 17, 3)
+ str = str->getNextStream();
+#else
+ str = ((DCTStream *)str)->getRawStream();
+#endif
+ str->reset();
+
+ o_rOutputBuf.clear();
+ ExtractJpegData(str, o_rOutputBuf);
+
+ printf( " JPEG %d", static_cast<int>(o_rOutputBuf.size()) );
+ printf("\n");
+
+ str->close();
+}
+
+static void writePbm_(OutputBuffer& o_rOutputBuf, Stream* str, int width, int height, bool bInvert )
+{
+ // write as PBM (char by char, to avoid stdlib lineend messing)
+ o_rOutputBuf.clear();
+ o_rOutputBuf.resize(WRITE_BUFFER_SIZE);
+ o_rOutputBuf[0] = 'P';
+ o_rOutputBuf[1] = '4';
+ o_rOutputBuf[2] = 0x0A;
+ char *pAsCharPtr = reinterpret_cast<char *>(&o_rOutputBuf[3]);
+ int nOutLen = snprintf(pAsCharPtr, WRITE_BUFFER_SIZE-10, "%d %d", width, height);
+ if( nOutLen < 0 )
+ nOutLen = WRITE_BUFFER_SIZE-10;
+ o_rOutputBuf[3+nOutLen] =0x0A;
+ o_rOutputBuf[3+nOutLen+1]=0;
+
+ const int header_size = 3+nOutLen+1;
+ const int size = height * ((width + 7) / 8);
+
+ printf( " PBM %d", size + header_size );
+ printf("\n");
+
+ // trim buffer to exact header length
+ o_rOutputBuf.resize(header_size);
+
+ // initialize stream
+ str->reset();
+
+ // copy the raw stream
+ if( bInvert )
+ {
+ for( int i=0; i<size; ++i)
+ o_rOutputBuf.push_back(static_cast<char>(str->getChar() ^ 0xff));
+ }
+ else
+ {
+ for( int i=0; i<size; ++i)
+ o_rOutputBuf.push_back(static_cast<char>(str->getChar()));
+ }
+
+ str->close();
+}
+
+static void writePpm_( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width,
+ int height,
+ GfxImageColorMap* colorMap )
+{
+ // write as PPM (char by char, to avoid stdlib lineend messing)
+ o_rOutputBuf.clear();
+ o_rOutputBuf.resize(WRITE_BUFFER_SIZE);
+ o_rOutputBuf[0] = 'P';
+ o_rOutputBuf[1] = '6';
+ o_rOutputBuf[2] = '\n';
+ char *pAsCharPtr = reinterpret_cast<char *>(&o_rOutputBuf[3]);
+ int nOutLen = snprintf(pAsCharPtr, WRITE_BUFFER_SIZE-10, "%d %d", width, height);
+ if( nOutLen < 0 )
+ nOutLen = WRITE_BUFFER_SIZE-10;
+ o_rOutputBuf[3+nOutLen] ='\n';
+ o_rOutputBuf[3+nOutLen+1]='2';
+ o_rOutputBuf[3+nOutLen+2]='5';
+ o_rOutputBuf[3+nOutLen+3]='5';
+ o_rOutputBuf[3+nOutLen+4]='\n';
+ o_rOutputBuf[3+nOutLen+5]=0;
+
+ const int header_size = 3+nOutLen+5;
+ const int size = width*height*3 + header_size;
+
+ printf( " PPM %d", size );
+ printf("\n");
+
+ // trim buffer to exact header size
+ o_rOutputBuf.resize(header_size);
+
+ // initialize stream
+ unsigned char *p;
+ GfxRGB rgb;
+ std::unique_ptr<ImageStream> imgStr(
+ new ImageStream(str,
+ width,
+ colorMap->getNumPixelComps(),
+ colorMap->getBits()));
+ imgStr->reset();
+
+ for( int y=0; y<height; ++y)
+ {
+ p = imgStr->getLine();
+ for( int x=0; x<width; ++x)
+ {
+ colorMap->getRGB(p, &rgb);
+ o_rOutputBuf.push_back(colToByte(rgb.r));
+ o_rOutputBuf.push_back(colToByte(rgb.g));
+ o_rOutputBuf.push_back(colToByte(rgb.b));
+
+ p +=colorMap->getNumPixelComps();
+ }
+ }
+}
+
+// call this only for 1 bit image streams !
+static void writePng_( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width,
+ int height,
+ GfxRGB const & zeroColor,
+ GfxRGB const & oneColor,
+ bool bIsMask )
+{
+ o_rOutputBuf.clear();
+
+ // get png image
+ PngHelper::createPng( o_rOutputBuf, str, width, height, zeroColor, oneColor, bIsMask );
+
+ printf( " PNG %d", static_cast<int>(o_rOutputBuf.size()) );
+ printf("\n");
+}
+
+static void writePng_( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width, int height, GfxImageColorMap* colorMap,
+ Stream* maskStr,
+ int maskWidth, int maskHeight, GfxImageColorMap* maskColorMap )
+{
+ o_rOutputBuf.clear();
+
+ // get png image
+ PngHelper::createPng( o_rOutputBuf, str, width, height, colorMap, maskStr, maskWidth, maskHeight, maskColorMap );
+
+ printf( " PNG %d", static_cast<int>(o_rOutputBuf.size()) );
+ printf("\n");
+}
+
+static void writePng_( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width, int height, GfxImageColorMap* colorMap,
+ Stream* maskStr,
+ int maskWidth, int maskHeight, bool maskInvert )
+{
+ o_rOutputBuf.clear();
+
+ // get png image
+ PngHelper::createPng( o_rOutputBuf, str, width, height, colorMap, maskStr, maskWidth, maskHeight, maskInvert );
+
+ printf( " PNG %d", static_cast<int>(o_rOutputBuf.size()) );
+ printf("\n");
+}
+
+// stolen from ImageOutputDev.cc
+static void writeMask_( OutputBuffer& o_rOutputBuf, Stream* str, int width, int height, bool bInvert )
+{
+ if( str->getKind() == strDCT )
+ writeJpeg_(o_rOutputBuf, str);
+ else
+ writePbm_(o_rOutputBuf, str, width, height, bInvert );
+}
+
+static void writeImage_( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width,
+ int height,
+ GfxImageColorMap* colorMap )
+{
+ // dump JPEG file
+ if( str->getKind() == strDCT &&
+ (colorMap->getNumPixelComps() == 1 ||
+ colorMap->getNumPixelComps() == 3) )
+ {
+ writeJpeg_(o_rOutputBuf, str);
+ }
+ else if (colorMap->getNumPixelComps() == 1 &&
+ colorMap->getBits() == 1)
+ {
+ // this is a two color bitmap, write a png
+ // provide default colors
+ GfxRGB zeroColor = { 0, 0, 0 },
+ oneColor = { byteToCol( 0xff ), byteToCol( 0xff ), byteToCol( 0xff ) };
+ if( colorMap->getColorSpace()->getMode() == csIndexed || colorMap->getColorSpace()->getMode() == csDeviceGray )
+ {
+ unsigned char nIndex = 0;
+ colorMap->getRGB( &nIndex, &zeroColor );
+ nIndex = 1;
+ colorMap->getRGB( &nIndex, &oneColor );
+ }
+ writePng_( o_rOutputBuf, str, width, height, zeroColor, oneColor, false);
+ }
+ else
+ writePpm_( o_rOutputBuf, str, width, height, colorMap );
+}
+
+// forwarders
+
+
+static void writeImageLF( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width,
+ int height,
+ GfxImageColorMap* colorMap ) { writeImage_(o_rOutputBuf,str,width,height,colorMap); }
+static void writeMaskLF( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width,
+ int height,
+ bool bInvert ) { writeMask_(o_rOutputBuf,str,width,height,bInvert); }
+
+
+int PDFOutDev::parseFont( long long nNewId, GfxFont* gfxFont, const GfxState* state ) const
+{
+ FontAttributes aNewFont;
+ int nSize = 0;
+
+#if POPPLER_CHECK_VERSION(20, 12, 0)
+ std::string familyName = gfxFont->getNameWithoutSubsetTag();
+#else
+#if POPPLER_CHECK_VERSION(0, 71, 0) // GooString::toStr()
+ std::string familyName = gfxFont->getName()->toStr();
+#else
+ const GooString* gooString = gfxFont->getName();
+ std::string familyName = std::string(gooString->getCString(), gooString->getLength());
+#endif
+ if (familyName.length() > 7 && familyName.at(6) == '+')
+ {
+ familyName = familyName.substr(7);
+ }
+#endif
+ if( familyName != "" )
+ {
+ aNewFont.familyName.clear();
+#if POPPLER_CHECK_VERSION(0, 83, 0) // GooString::append(const std::string&)
+ aNewFont.familyName.append( familyName );
+#else
+ aNewFont.familyName.append( familyName.c_str() );
+#endif
+ }
+ else
+ {
+ aNewFont.familyName.clear();
+ aNewFont.familyName.append( "Arial" );
+ }
+
+ aNewFont.maFontWeight = gfxFont->getWeight();
+ aNewFont.isItalic = gfxFont->isItalic();
+#if POPPLER_CHECK_VERSION(0, 83, 0) // const added to getTransformedFontSize
+ aNewFont.size = state->getTransformedFontSize();
+#else
+ aNewFont.size = const_cast<GfxState*>(state)->getTransformedFontSize();
+#endif
+ aNewFont.isUnderline = false;
+
+ if( gfxFont->getType() == fontTrueType || gfxFont->getType() == fontType1 )
+ {
+ // TODO(P3): Unfortunately, need to read stream twice, since
+ // we must write byte count to stdout before
+#if POPPLER_CHECK_VERSION(22, 6, 0)
+ std::optional<std::vector<unsigned char>> pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef() );
+ if ( pBuf )
+ {
+ aNewFont.isEmbedded = true;
+ nSize = pBuf->size();
+ }
+#else
+ char* pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef(), &nSize );
+ if( pBuf )
+ {
+ aNewFont.isEmbedded = true;
+ gfree(pBuf);
+ }
+#endif
+ }
+
+ m_aFontMap[ nNewId ] = aNewFont;
+ return nSize;
+}
+
+void PDFOutDev::writeFontFile( GfxFont* gfxFont ) const
+{
+ if( gfxFont->getType() != fontTrueType && gfxFont->getType() != fontType1 )
+ return;
+
+ int nSize = 0;
+#if POPPLER_CHECK_VERSION(22, 6, 0)
+ std::optional<std::vector<unsigned char>> pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef() );
+ if ( pBuf )
+ nSize = pBuf->size();
+ if ( nSize == 0 )
+ return;
+#else
+ char* pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef(), &nSize );
+ if( !pBuf )
+ return;
+#endif
+
+ // ---sync point--- see SYNC STREAMS above
+ fflush(stdout);
+
+#if POPPLER_CHECK_VERSION(22, 6, 0)
+ if( fwrite(pBuf->data(), sizeof(*pBuf->data()), nSize, g_binary_out) != static_cast<size_t>(nSize) )
+ {
+ exit(1); // error
+ }
+ // ---sync point--- see SYNC STREAMS above
+ fflush(g_binary_out);
+#else
+ if( fwrite(pBuf, sizeof(char), nSize, g_binary_out) != static_cast<size_t>(nSize) )
+ {
+ gfree(pBuf);
+ exit(1); // error
+ }
+ // ---sync point--- see SYNC STREAMS above
+ fflush(g_binary_out);
+ gfree(pBuf);
+#endif
+}
+
+#if POPPLER_CHECK_VERSION(0, 83, 0)
+void PDFOutDev::printPath( const GfxPath* pPath )
+#else
+void PDFOutDev::printPath( GfxPath* pPath )
+#endif
+{
+ int nSubPaths = pPath ? pPath->getNumSubpaths() : 0;
+ for( int i=0; i<nSubPaths; i++ )
+ {
+#if POPPLER_CHECK_VERSION(0, 83, 0)
+ const
+#endif
+ GfxSubpath* pSub = pPath->getSubpath( i );
+ const int nPoints = pSub->getNumPoints();
+
+ printf( " subpath %d", pSub->isClosed() );
+
+ for( int n=0; n<nPoints; ++n )
+ {
+ printf( " %f %f %d",
+ normalize(pSub->getX(n)),
+ normalize(pSub->getY(n)),
+ pSub->getCurve(n) );
+ }
+ }
+}
+
+PDFOutDev::PDFOutDev( PDFDoc* pDoc ) :
+ m_pDoc( pDoc ),
+ m_pUtf8Map( new UnicodeMap("UTF-8", true, &mapUTF8) ),
+ m_bSkipImages(false)
+{
+}
+PDFOutDev::~PDFOutDev()
+{
+}
+
+void PDFOutDev::startPage(int /*pageNum*/, GfxState* state
+#if POPPLER_CHECK_VERSION(0, 23, 0) || POPPLER_CHECK_VERSION(0, 24, 0)
+ , XRef* /*xref*/
+#endif
+)
+{
+ assert(state);
+ printf("startPage %f %f\n",
+ normalize(state->getPageWidth()),
+ normalize(state->getPageHeight()));
+}
+
+void PDFOutDev::endPage()
+{
+ printf("endPage\n");
+}
+
+#if POPPLER_CHECK_VERSION(0, 19, 0)
+void PDFOutDev::processLink(AnnotLink *link)
+#elif POPPLER_CHECK_VERSION(0, 17, 0)
+void PDFOutDev::processLink(AnnotLink *link, Catalog *)
+#else
+void PDFOutDev::processLink(Link* link, Catalog*)
+#endif
+{
+ assert(link);
+
+ double x1,x2,y1,y2;
+ link->getRect( &x1, &y1, &x2, &y2 );
+
+ LinkAction* pAction = link->getAction();
+ if (!(pAction && pAction->getKind() == actionURI))
+ return;
+
+#if POPPLER_CHECK_VERSION(0, 86, 0)
+ const char* pURI = static_cast<LinkURI*>(pAction)->getURI().c_str();
+#elif POPPLER_CHECK_VERSION(0, 72, 0)
+ const char* pURI = static_cast<LinkURI*>(pAction)->getURI()->c_str();
+#else
+ const char* pURI = static_cast<LinkURI*>(pAction)->getURI()->getCString();
+#endif
+
+ std::vector<char> aEsc( lcl_escapeLineFeeds(pURI) );
+
+ printf( "drawLink %f %f %f %f %s\n",
+ normalize(x1),
+ normalize(y1),
+ normalize(x2),
+ normalize(y2),
+ aEsc.data() );
+}
+
+void PDFOutDev::saveState(GfxState*)
+{
+ printf( "saveState\n" );
+}
+
+void PDFOutDev::restoreState(GfxState*)
+{
+ printf( "restoreState\n" );
+}
+
+#if POPPLER_CHECK_VERSION(0, 71, 0)
+void PDFOutDev::setDefaultCTM(const double *pMat)
+#else
+void PDFOutDev::setDefaultCTM(double *pMat)
+#endif
+{
+ assert(pMat);
+
+ OutputDev::setDefaultCTM(pMat);
+
+ printf( "updateCtm %f %f %f %f %f %f\n",
+ normalize(pMat[0]),
+ normalize(pMat[1]),
+ normalize(pMat[2]),
+ normalize(pMat[3]),
+ normalize(pMat[4]),
+ normalize(pMat[5]) );
+}
+
+void PDFOutDev::updateCTM(GfxState* state,
+ double, double,
+ double, double,
+ double, double)
+{
+ assert(state);
+
+ const double* const pMat = state->getCTM();
+ assert(pMat);
+
+ printf( "updateCtm %f %f %f %f %f %f\n",
+ normalize(pMat[0]),
+ normalize(pMat[1]),
+ normalize(pMat[2]),
+ normalize(pMat[3]),
+ normalize(pMat[4]),
+ normalize(pMat[5]) );
+}
+
+void PDFOutDev::updateLineDash(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ assert(state);
+
+ int arrayLen; double startOffset;
+#if POPPLER_CHECK_VERSION(22, 9, 0)
+ const std::vector<double> &dash = state->getLineDash(&startOffset);
+ const double* dashArray = dash.data();
+ arrayLen = dash.size();
+#else
+ double* dashArray;
+ state->getLineDash(&dashArray, &arrayLen, &startOffset);
+#endif
+
+ printf( "updateLineDash" );
+ if( arrayLen && dashArray )
+ {
+ printf( " %f %d", normalize(startOffset), arrayLen );
+ for( int i=0; i<arrayLen; ++i )
+ printf( " %f", normalize(*dashArray++) );
+ }
+ printf( "\n" );
+}
+
+void PDFOutDev::updateFlatness(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ assert(state);
+ printf( "updateFlatness %d\n", state->getFlatness() );
+}
+
+void PDFOutDev::updateLineJoin(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ assert(state);
+ printf( "updateLineJoin %d\n", state->getLineJoin() );
+}
+
+void PDFOutDev::updateLineCap(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ assert(state);
+ printf( "updateLineCap %d\n", state->getLineCap() );
+}
+
+void PDFOutDev::updateMiterLimit(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ assert(state);
+ printf( "updateMiterLimit %f\n", normalize(state->getMiterLimit()) );
+}
+
+void PDFOutDev::updateLineWidth(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ assert(state);
+ printf( "updateLineWidth %f\n", normalize(state->getLineWidth()) );
+}
+
+void PDFOutDev::updateFillColor(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ assert(state);
+
+ GfxRGB aRGB;
+ state->getFillRGB( &aRGB );
+
+ printf( "updateFillColor %f %f %f %f\n",
+ normalize(colToDbl(aRGB.r)),
+ normalize(colToDbl(aRGB.g)),
+ normalize(colToDbl(aRGB.b)),
+ normalize(state->getFillOpacity()) );
+}
+
+void PDFOutDev::updateStrokeColor(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ assert(state);
+
+ GfxRGB aRGB;
+ state->getStrokeRGB( &aRGB );
+
+ printf( "updateStrokeColor %f %f %f %f\n",
+ normalize(colToDbl(aRGB.r)),
+ normalize(colToDbl(aRGB.g)),
+ normalize(colToDbl(aRGB.b)),
+ normalize(state->getFillOpacity()) );
+}
+
+void PDFOutDev::updateFillOpacity(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ updateFillColor(state);
+}
+
+void PDFOutDev::updateStrokeOpacity(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ updateStrokeColor(state);
+}
+
+void PDFOutDev::updateBlendMode(GfxState*)
+{
+}
+
+void PDFOutDev::updateFont(GfxState *state)
+{
+ assert(state);
+
+#if POPPLER_CHECK_VERSION(22, 6, 0)
+ GfxFont *gfxFont = state->getFont().get();
+#else
+ GfxFont *gfxFont = state->getFont();
+#endif
+ if( !gfxFont )
+ return;
+
+ FontAttributes aFont;
+ int nEmbedSize=0;
+
+#if POPPLER_CHECK_VERSION(0, 64, 0)
+ const
+#endif
+ Ref* pID = gfxFont->getID();
+ // TODO(Q3): Portability problem
+ long long fontID = static_cast<long long>(pID->gen) << 32 | static_cast<long long>(pID->num);
+ std::unordered_map< long long, FontAttributes >::const_iterator it =
+ m_aFontMap.find( fontID );
+ if( it == m_aFontMap.end() )
+ {
+ nEmbedSize = parseFont( fontID, gfxFont, state );
+ it = m_aFontMap.find( fontID );
+ }
+
+ printf( "updateFont" );
+ if( it != m_aFontMap.end() )
+ {
+ // conflating this with printf below crashes under Windoze
+ printf( " %lld", fontID );
+
+ aFont = it->second;
+
+#if POPPLER_CHECK_VERSION(0, 72, 0)
+ std::vector<char> aEsc( lcl_escapeLineFeeds(aFont.familyName.c_str()) );
+#else
+ std::vector<char> aEsc( lcl_escapeLineFeeds(aFont.familyName.getCString()) );
+#endif
+ printf( " %d %d %d %d %f %d %s",
+ aFont.isEmbedded,
+ aFont.maFontWeight,
+ aFont.isItalic,
+ aFont.isUnderline,
+ normalize(state->getTransformedFontSize()),
+ nEmbedSize,
+ aEsc.data() );
+ }
+ printf( "\n" );
+
+ if (nEmbedSize)
+ {
+ writeFontFile(gfxFont);
+ }
+}
+
+void PDFOutDev::updateRender(GfxState *state)
+{
+ assert(state);
+
+ printf( "setTextRenderMode %d\n", state->getRender() );
+}
+
+void PDFOutDev::stroke(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ assert(state);
+
+ printf( "strokePath" );
+ printPath( state->getPath() );
+ printf( "\n" );
+}
+
+void PDFOutDev::fill(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ assert(state);
+
+ printf( "fillPath" );
+ printPath( state->getPath() );
+ printf( "\n" );
+}
+
+void PDFOutDev::eoFill(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ assert(state);
+
+ printf( "eoFillPath" );
+ printPath( state->getPath() );
+ printf( "\n" );
+}
+
+void PDFOutDev::clip(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ assert(state);
+
+ printf( "clipPath" );
+ printPath( state->getPath() );
+ printf( "\n" );
+}
+
+void PDFOutDev::eoClip(GfxState *state)
+{
+ if (m_bSkipImages)
+ return;
+ assert(state);
+
+ printf( "eoClipPath" );
+ printPath( state->getPath() );
+ printf( "\n" );
+}
+
+/** Output one glyph
+
+
+ @param dx
+ horizontal skip for character (already scaled with font size) +
+ inter-char space: cursor is shifted by this amount for next char
+
+ @param dy
+ vertical skip for character (zero for horizontal writing mode):
+ cursor is shifted by this amount for next char
+
+ @param originX
+ local offset of character (zero for horizontal writing mode). not
+ taken into account for output pos updates. Used for vertical writing.
+
+ @param originY
+ local offset of character (zero for horizontal writing mode). not
+ taken into account for output pos updates. Used for vertical writing.
+ */
+
+#if POPPLER_CHECK_VERSION(0, 82, 0)
+void PDFOutDev::drawChar(GfxState *state, double x, double y,
+ double dx, double dy,
+ double originX, double originY,
+ CharCode, int /*nBytes*/, const Unicode *u, int uLen)
+{
+#else
+void PDFOutDev::drawChar(GfxState *state, double x, double y,
+ double dx, double dy,
+ double originX, double originY,
+ CharCode, int /*nBytes*/, Unicode *u, int uLen)
+{
+#endif
+ assert(state);
+
+ if( u == nullptr )
+ return;
+
+ // Fix for tdf#96080
+ if (uLen == 4 && u[0] == '\t' && u[1] == '\r' && u[2] == ' ' && u[3] == 0xA0)
+ {
+ u += 2;
+ uLen = 1;
+ }
+
+ double csdx = 0.0;
+ double csdy = 0.0;
+ if (state->getFont()->getWMode())
+ {
+ csdy = state->getCharSpace();
+ if (*u == ' ')
+ csdy += state->getWordSpace();
+ }
+ else
+ {
+ csdx = state->getCharSpace();
+ if (*u == ' ')
+ csdx += state->getWordSpace();
+ csdx *= state->getHorizScaling();
+ }
+
+ double cstdx = 0.0;
+ double cstdy = 0.0;
+ state->textTransformDelta(csdx, csdy, &cstdx, &cstdy);
+
+ const double fontSize = state->getFontSize();
+
+ const double aPositionX(x-originX);
+ const double aPositionY(y-originY);
+
+ const double* pTextMat=state->getTextMat();
+ printf( "drawChar %f %f %f %f %f %f %f %f %f ",
+ normalize(aPositionX),
+ normalize(aPositionY),
+ normalize(aPositionX + dx - cstdx),
+ normalize(aPositionY + dy - cstdy),
+ normalize(pTextMat[0]),
+ normalize(pTextMat[2]),
+ normalize(pTextMat[1]),
+ normalize(pTextMat[3]),
+ normalize(fontSize)
+ );
+
+ // silence spurious warning
+#if POPPLER_CHECK_VERSION(0, 62, 0)
+ (void)&mapUTF16;
+#else
+ (void)&mapUCS2;
+#endif
+
+ char buf[9];
+ for( int i=0; i<uLen; ++i )
+ {
+ buf[ m_pUtf8Map->mapUnicode(u[i], buf, sizeof(buf)-1) ] = 0;
+ std::vector<char> aEsc( lcl_escapeLineFeeds(buf) );
+ printf( "%s", aEsc.data() );
+ }
+
+ printf( "\n" );
+}
+
+#if POPPLER_CHECK_VERSION(0, 64, 0)
+void PDFOutDev::drawString(GfxState*, const GooString* /*s*/)
+#else
+void PDFOutDev::drawString(GfxState*, GooString* /*s*/)
+#endif
+{
+ // TODO(F3): NYI
+}
+
+void PDFOutDev::endTextObject(GfxState*)
+{
+ printf( "endTextObject\n" );
+}
+
+void PDFOutDev::drawImageMask(GfxState* pState, Object*, Stream* str,
+ int width, int height, poppler_bool invert,
+ poppler_bool /*interpolate*/,
+ poppler_bool /*inlineImg*/ )
+{
+ if (m_bSkipImages)
+ return;
+ OutputBuffer aBuf; initBuf(aBuf);
+
+ printf( "drawMask %d %d %d", width, height, invert );
+
+ int bitsPerComponent = 1;
+ StreamColorSpaceMode csMode = streamCSNone;
+ str->getImageParams( &bitsPerComponent, &csMode );
+ if( bitsPerComponent == 1 && (csMode == streamCSNone || csMode == streamCSDeviceGray) )
+ {
+ GfxRGB oneColor = { dblToCol( 1.0 ), dblToCol( 1.0 ), dblToCol( 1.0 ) };
+ GfxRGB zeroColor = { dblToCol( 0.0 ), dblToCol( 0.0 ), dblToCol( 0.0 ) };
+ pState->getFillColorSpace()->getRGB( pState->getFillColor(), &zeroColor );
+ if( invert )
+ writePng_( aBuf, str, width, height, oneColor, zeroColor, true );
+ else
+ writePng_( aBuf, str, width, height, zeroColor, oneColor, true );
+ }
+ else
+ writeMaskLF(aBuf, str, width, height, invert);
+ writeBinaryBuffer(aBuf);
+}
+
+#if POPPLER_CHECK_VERSION(0, 82, 0)
+void PDFOutDev::drawImage(GfxState*, Object*, Stream* str,
+ int width, int height, GfxImageColorMap* colorMap,
+ poppler_bool /*interpolate*/,
+ const int* maskColors, poppler_bool /*inlineImg*/ )
+{
+#else
+void PDFOutDev::drawImage(GfxState*, Object*, Stream* str,
+ int width, int height, GfxImageColorMap* colorMap,
+ poppler_bool /*interpolate*/,
+ int* maskColors, poppler_bool /*inlineImg*/ )
+{
+#endif
+ if (m_bSkipImages)
+ return;
+ OutputBuffer aBuf; initBuf(aBuf);
+ OutputBuffer aMaskBuf;
+
+ printf( "drawImage %d %d", width, height );
+
+ if( maskColors )
+ {
+ // write mask colors. nBytes must be even - first half is
+ // lower bound values, second half upper bound values
+ if( colorMap->getColorSpace()->getMode() == csIndexed )
+ {
+ aMaskBuf.push_back( static_cast<char>(maskColors[0]) );
+ aMaskBuf.push_back( static_cast<char>(maskColors[gfxColorMaxComps]) );
+ }
+ else
+ {
+ GfxRGB aMinRGB;
+ colorMap->getColorSpace()->getRGB(
+#if POPPLER_CHECK_VERSION(0, 82, 0)
+ reinterpret_cast<const GfxColor*>(maskColors),
+#else
+ reinterpret_cast<GfxColor*>(maskColors),
+#endif
+ &aMinRGB );
+
+ GfxRGB aMaxRGB;
+ colorMap->getColorSpace()->getRGB(
+#if POPPLER_CHECK_VERSION(0, 82, 0)
+ reinterpret_cast<const GfxColor*>(maskColors)+gfxColorMaxComps,
+#else
+ reinterpret_cast<GfxColor*>(maskColors)+gfxColorMaxComps,
+#endif
+ &aMaxRGB );
+
+ aMaskBuf.push_back( colToByte(aMinRGB.r) );
+ aMaskBuf.push_back( colToByte(aMinRGB.g) );
+ aMaskBuf.push_back( colToByte(aMinRGB.b) );
+ aMaskBuf.push_back( colToByte(aMaxRGB.r) );
+ aMaskBuf.push_back( colToByte(aMaxRGB.g) );
+ aMaskBuf.push_back( colToByte(aMaxRGB.b) );
+ }
+ }
+
+ printf( " %d", static_cast<int>(aMaskBuf.size()) );
+ writeImageLF( aBuf, str, width, height, colorMap );
+ writeBinaryBuffer(aBuf);
+ writeBinaryBuffer(aMaskBuf);
+}
+
+void PDFOutDev::drawMaskedImage(GfxState*, Object*, Stream* str,
+ int width, int height,
+ GfxImageColorMap* colorMap,
+ poppler_bool /*interpolate*/,
+ Stream* maskStr,
+ int maskWidth, int maskHeight,
+ poppler_bool maskInvert, poppler_bool /*maskInterpolate*/
+ )
+{
+ if (m_bSkipImages)
+ return;
+ OutputBuffer aBuf; initBuf(aBuf);
+ printf( "drawImage %d %d 0", width, height );
+ writePng_( aBuf, str, width, height, colorMap, maskStr, maskWidth, maskHeight, maskInvert );
+ writeBinaryBuffer( aBuf );
+}
+
+void PDFOutDev::drawSoftMaskedImage(GfxState*, Object*, Stream* str,
+ int width, int height,
+ GfxImageColorMap* colorMap,
+ poppler_bool /*interpolate*/,
+ Stream* maskStr,
+ int maskWidth, int maskHeight,
+ GfxImageColorMap* maskColorMap
+ , poppler_bool /*maskInterpolate*/
+ )
+{
+ if (m_bSkipImages)
+ return;
+ OutputBuffer aBuf; initBuf(aBuf);
+ printf( "drawImage %d %d 0", width, height );
+ writePng_( aBuf, str, width, height, colorMap, maskStr, maskWidth, maskHeight, maskColorMap );
+ writeBinaryBuffer( aBuf );
+}
+
+void PDFOutDev::setPageNum( int nNumPages )
+{
+ // TODO(F3): printf might format int locale-dependent!
+ printf("setPageNum %d\n", nNumPages);
+}
+
+void PDFOutDev::setSkipImages( bool bSkipImages )
+{
+ m_bSkipImages = bSkipImages;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx
new file mode 100644
index 000000000..b34fad1ba
--- /dev/null
+++ b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx
@@ -0,0 +1,302 @@
+/* -*- 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_SDEXT_SOURCE_PDFIMPORT_XPDFWRAPPER_PDFIOUTDEV_GPL_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_XPDFWRAPPER_PDFIOUTDEV_GPL_HXX
+
+#include <sal/types.h>
+#include <config_poppler.h>
+
+#if defined __GNUC__ || defined __clang__
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wundef"
+# pragma GCC diagnostic ignored "-Wunused-parameter"
+#elif defined _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4100) // unreferenced formal parameter
+#pragma warning(disable : 4310) // cast truncates constant value
+#endif
+
+#include <GfxState.h>
+#include <GfxFont.h>
+#include <UnicodeMap.h>
+#include <Link.h>
+#include <Object.h>
+#include <OutputDev.h>
+#include <GlobalParams.h>
+#include <PDFDoc.h>
+
+#if defined __GNUC__ || defined __clang__
+# pragma GCC diagnostic pop
+#elif defined _MSC_VER
+#pragma warning(pop)
+#endif
+
+#include <unordered_map>
+#include <vector>
+#include <memory>
+
+class GfxPath;
+class GfxFont;
+class PDFDoc;
+#include <cpp/poppler-version.h>
+#define POPPLER_CHECK_VERSION(major,minor,micro) \
+ (POPPLER_VERSION_MAJOR > (major) || \
+ (POPPLER_VERSION_MAJOR == (major) && POPPLER_VERSION_MINOR > (minor)) || \
+ (POPPLER_VERSION_MAJOR == (major) && POPPLER_VERSION_MINOR == (minor) && POPPLER_VERSION_MICRO >= (micro)))
+
+namespace pdfi
+{
+ struct FontAttributes
+ {
+ FontAttributes() :
+ familyName(),
+ isEmbedded(false),
+ maFontWeight(GfxFont::W400),
+ isItalic(false),
+ isUnderline(false),
+ size(0.0)
+ {}
+
+ // xpdf goo stuff is so totally borked...
+ // ...need to hand-code assignment
+ FontAttributes( const FontAttributes& rSrc ) :
+ familyName(),
+ isEmbedded(rSrc.isEmbedded),
+ maFontWeight(rSrc.maFontWeight),
+ isItalic(rSrc.isItalic),
+ isUnderline(rSrc.isUnderline),
+ size(rSrc.size)
+ {
+ familyName.append(&rSrc.getFamilyName());
+ }
+
+ FontAttributes& operator=( const FontAttributes& rSrc )
+ {
+ familyName.clear();
+ familyName.append(&rSrc.getFamilyName());
+
+ isEmbedded = rSrc.isEmbedded;
+ maFontWeight= rSrc.maFontWeight;
+ isItalic = rSrc.isItalic;
+ isUnderline = rSrc.isUnderline;
+ size = rSrc.size;
+
+ return *this;
+ }
+
+ bool operator==(const FontAttributes& rFont) const
+ {
+ return getFamilyName().cmp(&rFont.getFamilyName())==0 &&
+ isEmbedded == rFont.isEmbedded &&
+ maFontWeight == rFont.maFontWeight &&
+ isItalic == rFont.isItalic &&
+ isUnderline == rFont.isUnderline &&
+ size == rFont.size;
+ }
+
+ GooString familyName;
+ bool isEmbedded;
+ GfxFont::Weight maFontWeight;
+ bool isItalic;
+ bool isUnderline;
+ double size;
+
+ private:
+ // Work around const-ness issues in the GooString API:
+ GooString & getFamilyName() const
+ { return const_cast<GooString &>(familyName); }
+ };
+
+ // Versions before 0.15 defined GBool as int; 0.15 redefined it as bool; 0.71 dropped GBool
+#if POPPLER_VERSION_MAJOR == 0 && POPPLER_VERSION_MINOR < 71
+ typedef GBool poppler_bool;
+#else
+ typedef bool poppler_bool;
+#endif
+
+ class PDFOutDev : public OutputDev
+ {
+ // not owned by this class
+ PDFDoc* m_pDoc;
+ mutable std::unordered_map< long long,
+ FontAttributes > m_aFontMap;
+ std::unique_ptr<UnicodeMap> m_pUtf8Map;
+ bool m_bSkipImages;
+
+ int parseFont( long long nNewId, GfxFont* pFont, const GfxState* state ) const;
+ void writeFontFile( GfxFont* gfxFont ) const;
+#if POPPLER_CHECK_VERSION(0, 83, 0)
+ static void printPath( const GfxPath* pPath );
+#else
+ static void printPath( GfxPath* pPath );
+#endif
+
+ public:
+ explicit PDFOutDev( PDFDoc* pDoc );
+ virtual ~PDFOutDev() override;
+
+ //----- get info about output device
+
+ // Does this device use upside-down coordinates?
+ // (Upside-down means (0,0) is the top left corner of the page.)
+ virtual poppler_bool upsideDown() override { return true; }
+
+ // Does this device use drawChar() or drawString()?
+ virtual poppler_bool useDrawChar() override { return true; }
+
+ // Does this device use beginType3Char/endType3Char? Otherwise,
+ // text in Type 3 fonts will be drawn with drawChar/drawString.
+ virtual poppler_bool interpretType3Chars() override { return false; }
+
+ // Does this device need non-text content?
+ virtual poppler_bool needNonText() override { return true; }
+
+ //----- initialization and control
+
+ // Set default transform matrix.
+#if POPPLER_CHECK_VERSION(0, 71, 0)
+ virtual void setDefaultCTM(const double *ctm) override;
+#else
+ virtual void setDefaultCTM(double *ctm) override;
+#endif
+
+ // Start a page.
+ virtual void startPage(int pageNum, GfxState *state
+#if POPPLER_CHECK_VERSION(0, 23, 0) || POPPLER_CHECK_VERSION(0, 24, 0)
+ , XRef *xref
+#endif
+ ) override;
+
+ // End a page.
+ virtual void endPage() override;
+
+ //----- link borders
+ #if POPPLER_CHECK_VERSION(0, 19, 0)
+ virtual void processLink(AnnotLink *link) override;
+ #elif POPPLER_CHECK_VERSION(0, 17, 0)
+ virtual void processLink(AnnotLink *link, Catalog *catalog) override;
+ #else
+ virtual void processLink(Link *link, Catalog *catalog) override;
+ #endif
+
+ //----- save/restore graphics state
+ virtual void saveState(GfxState *state) override;
+ virtual void restoreState(GfxState *state) override;
+
+ //----- update graphics state
+ virtual void updateCTM(GfxState *state, double m11, double m12,
+ double m21, double m22, double m31, double m32) override;
+ virtual void updateLineDash(GfxState *state) override;
+ virtual void updateFlatness(GfxState *state) override;
+ virtual void updateLineJoin(GfxState *state) override;
+ virtual void updateLineCap(GfxState *state) override;
+ virtual void updateMiterLimit(GfxState *state) override;
+ virtual void updateLineWidth(GfxState *state) override;
+ virtual void updateFillColor(GfxState *state) override;
+ virtual void updateStrokeColor(GfxState *state) override;
+ virtual void updateFillOpacity(GfxState *state) override;
+ virtual void updateStrokeOpacity(GfxState *state) override;
+ virtual void updateBlendMode(GfxState *state) override;
+
+ //----- update text state
+ virtual void updateFont(GfxState *state) override;
+ virtual void updateRender(GfxState *state) override;
+
+ //----- path painting
+ virtual void stroke(GfxState *state) override;
+ virtual void fill(GfxState *state) override;
+ virtual void eoFill(GfxState *state) override;
+
+ //----- path clipping
+ virtual void clip(GfxState *state) override;
+ virtual void eoClip(GfxState *state) override;
+
+ //----- text drawing
+#if POPPLER_CHECK_VERSION(0, 82, 0)
+ virtual void drawChar(GfxState *state, double x, double y,
+ double dx, double dy,
+ double originX, double originY,
+ CharCode code, int nBytes, const Unicode *u, int uLen) override;
+#else
+ virtual void drawChar(GfxState *state, double x, double y,
+ double dx, double dy,
+ double originX, double originY,
+ CharCode code, int nBytes, Unicode *u, int uLen) override;
+#endif
+#if POPPLER_CHECK_VERSION(0, 64, 0)
+ virtual void drawString(GfxState *state, const GooString *s) override;
+#else
+ virtual void drawString(GfxState *state, GooString *s) override;
+#endif
+ virtual void endTextObject(GfxState *state) override;
+
+ //----- image drawing
+ virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
+ int width, int height, poppler_bool invert,
+ poppler_bool interpolate,
+ poppler_bool inlineImg) override;
+#if POPPLER_CHECK_VERSION(0, 82, 0)
+ virtual void drawImage(GfxState *state, Object *ref, Stream *str,
+ int width, int height, GfxImageColorMap *colorMap,
+ poppler_bool interpolate,
+ const int* maskColors, poppler_bool inlineImg) override;
+#else
+ virtual void drawImage(GfxState *state, Object *ref, Stream *str,
+ int width, int height, GfxImageColorMap *colorMap,
+ poppler_bool interpolate,
+ int* maskColors, poppler_bool inlineImg) override;
+#endif
+ virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str,
+ int width, int height,
+ GfxImageColorMap *colorMap,
+ poppler_bool interpolate,
+ Stream *maskStr, int maskWidth, int maskHeight,
+ poppler_bool maskInvert,
+ poppler_bool maskInterpolate
+ ) override;
+ virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
+ int width, int height,
+ GfxImageColorMap *colorMap,
+ poppler_bool interpolate,
+ Stream *maskStr,
+ int maskWidth, int maskHeight,
+ GfxImageColorMap *maskColorMap
+ , poppler_bool maskInterpolate
+ ) override;
+
+ static void setPageNum( int nNumPages );
+ void setSkipImages ( bool bSkipImages );
+ };
+}
+
+extern FILE* g_binary_out;
+
+// note: if you ever change Output_t, please keep in mind that the current code
+// relies on it being of 8 bit size
+typedef unsigned char Output_t;
+typedef std::vector< Output_t > OutputBuffer;
+
+#if !POPPLER_CHECK_VERSION(0, 73, 0)
+static_assert(std::is_same_v<Guchar, unsigned char>, "unexpected typedef");
+#endif
+
+#endif // INCLUDED_SDEXT_SOURCE_PDFIMPORT_XPDFWRAPPER_PDFIOUTDEV_GPL_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/xpdfwrapper/pnghelper.cxx b/sdext/source/pdfimport/xpdfwrapper/pnghelper.cxx
new file mode 100644
index 000000000..798555fe2
--- /dev/null
+++ b/sdext/source/pdfimport/xpdfwrapper/pnghelper.cxx
@@ -0,0 +1,404 @@
+/* -*- 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 "pnghelper.hxx"
+#include <sal/macros.h>
+
+#include <zlib.h>
+
+using namespace pdfi;
+
+// checksum helpers, courtesy of libpng.org
+
+/* Table of CRCs of all 8-bit messages. */
+sal_uInt32 PngHelper::crc_table[256];
+
+/* Flag: has the table been computed? Initially false. */
+bool PngHelper::bCRCTableInit = true;
+
+/* Make the table for a fast CRC. */
+void PngHelper::initCRCTable()
+{
+ for (sal_uInt32 n = 0; n < 256; n++)
+ {
+ sal_uInt32 c = n;
+ for (int k = 0; k < 8; k++)
+ {
+ if (c & 1)
+ c = 0xedb88320L ^ (c >> 1);
+ else
+ c = c >> 1;
+ }
+ crc_table[n] = c;
+ }
+ bCRCTableInit = false;
+}
+
+/* Update a running CRC with the bytes buf[0..len-1]--the CRC
+ should be initialized to all 1's, and the transmitted value
+ is the 1's complement of the final running CRC (see the
+ crc() routine below)). */
+
+void PngHelper::updateCRC( sal_uInt32& io_rCRC, const sal_uInt8* i_pBuf, size_t i_nLen )
+{
+ if( bCRCTableInit )
+ initCRCTable();
+
+ sal_uInt32 nCRC = io_rCRC;
+ for( size_t n = 0; n < i_nLen; n++ )
+ nCRC = crc_table[(nCRC ^ i_pBuf[n]) & 0xff] ^ (nCRC >> 8);
+ io_rCRC = nCRC;
+}
+
+sal_uInt32 PngHelper::getCRC( const sal_uInt8* i_pBuf, size_t i_nLen )
+{
+ sal_uInt32 nCRC = 0xffffffff;
+ updateCRC( nCRC, i_pBuf, i_nLen );
+ return nCRC ^ 0xffffffff;
+}
+
+sal_uInt32 PngHelper::deflateBuffer( const Output_t* i_pBuf, size_t i_nLen, OutputBuffer& o_rOut )
+{
+ size_t nOrigSize = o_rOut.size();
+
+ // prepare z stream
+ z_stream aStream;
+ aStream.zalloc = Z_NULL;
+ aStream.zfree = Z_NULL;
+ aStream.opaque = Z_NULL;
+ aStream.total_out = aStream.total_in = 0;
+ if (Z_OK != deflateInit(&aStream, Z_BEST_COMPRESSION))
+ return 0;
+ aStream.avail_in = uInt(i_nLen);
+ aStream.next_in = i_pBuf;
+
+ sal_uInt8 aOutBuf[ 32768 ];
+ do
+ {
+ aStream.avail_out = sizeof( aOutBuf );
+ aStream.next_out = aOutBuf;
+
+ if( deflate( &aStream, Z_FINISH ) == Z_STREAM_ERROR )
+ {
+ deflateEnd( &aStream );
+ // scrap the data of this broken stream
+ o_rOut.resize( nOrigSize );
+ return 0;
+ }
+
+ // append compressed bytes
+ sal_uInt32 nCompressedBytes = sizeof( aOutBuf ) - aStream.avail_out;
+ if( nCompressedBytes )
+ o_rOut.insert( o_rOut.end(), aOutBuf, aOutBuf+nCompressedBytes );
+
+ } while( aStream.avail_out == 0 );
+
+ // cleanup
+ deflateEnd( &aStream );
+
+ return sal_uInt32( o_rOut.size() - nOrigSize );
+}
+
+void PngHelper::appendFileHeader( OutputBuffer& o_rOutputBuf )
+{
+ static const unsigned char aHeader[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a };
+
+ o_rOutputBuf.insert( o_rOutputBuf.end(), aHeader, aHeader + SAL_N_ELEMENTS(aHeader) );
+}
+
+size_t PngHelper::startChunk( const char* pChunkName, OutputBuffer& o_rOutputBuf )
+{
+ size_t nIndex = sal_uInt32( o_rOutputBuf.size() );
+ o_rOutputBuf.insert( o_rOutputBuf.end(), 4, Output_t(0) );
+ o_rOutputBuf.push_back( pChunkName[0] );
+ o_rOutputBuf.push_back( pChunkName[1] );
+ o_rOutputBuf.push_back( pChunkName[2] );
+ o_rOutputBuf.push_back( pChunkName[3] );
+ return nIndex;
+}
+
+void PngHelper::set( sal_uInt32 i_nValue, OutputBuffer& o_rOutputBuf, size_t i_nIndex )
+{
+ o_rOutputBuf[ i_nIndex ] = (i_nValue & 0xff000000) >> 24;
+ o_rOutputBuf[ i_nIndex+1 ] = (i_nValue & 0x00ff0000) >> 16;
+ o_rOutputBuf[ i_nIndex+2 ] = (i_nValue & 0x0000ff00) >> 8;
+ o_rOutputBuf[ i_nIndex+3 ] = (i_nValue & 0x000000ff);
+}
+
+void PngHelper::endChunk( size_t nStart, OutputBuffer& o_rOutputBuf )
+{
+ if( nStart+8 > o_rOutputBuf.size() )
+ return; // something broken is going on
+
+ // update chunk length
+ size_t nLen = o_rOutputBuf.size() - nStart;
+ sal_uInt32 nDataLen = sal_uInt32(nLen)-8;
+ set( nDataLen, o_rOutputBuf, nStart );
+
+ // append chunk crc
+ sal_uInt32 nChunkCRC = getCRC( reinterpret_cast<sal_uInt8*>(&o_rOutputBuf[nStart+4]), nLen-4 );
+ append( nChunkCRC, o_rOutputBuf );
+}
+
+void PngHelper::appendIHDR( OutputBuffer& o_rOutputBuf, int width, int height, int depth, int colortype )
+{
+ size_t nStart = startChunk( "IHDR", o_rOutputBuf );
+ append( width, o_rOutputBuf );
+ append( height, o_rOutputBuf );
+ o_rOutputBuf.push_back( Output_t(depth) );
+ o_rOutputBuf.push_back( Output_t(colortype) );
+ o_rOutputBuf.push_back( 0 ); // compression method deflate
+ o_rOutputBuf.push_back( 0 ); // filtering method 0 (default)
+ o_rOutputBuf.push_back( 0 ); // no interlacing
+ endChunk( nStart, o_rOutputBuf );
+}
+
+void PngHelper::appendIEND( OutputBuffer& o_rOutputBuf )
+{
+ size_t nStart = startChunk( "IEND", o_rOutputBuf );
+ endChunk( nStart, o_rOutputBuf );
+}
+
+void PngHelper::createPng( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width,
+ int height,
+ GfxRGB const & zeroColor,
+ GfxRGB const & oneColor,
+ bool bIsMask
+ )
+{
+ appendFileHeader( o_rOutputBuf );
+ appendIHDR( o_rOutputBuf, width, height, 1, 3 );
+
+ // write palette
+ size_t nIdx = startChunk( "PLTE", o_rOutputBuf );
+ // write colors 0 and 1
+ o_rOutputBuf.push_back(colToByte(zeroColor.r));
+ o_rOutputBuf.push_back(colToByte(zeroColor.g));
+ o_rOutputBuf.push_back(colToByte(zeroColor.b));
+ o_rOutputBuf.push_back(colToByte(oneColor.r));
+ o_rOutputBuf.push_back(colToByte(oneColor.g));
+ o_rOutputBuf.push_back(colToByte(oneColor.b));
+ // end PLTE chunk
+ endChunk( nIdx, o_rOutputBuf );
+
+ if( bIsMask )
+ {
+ // write tRNS chunk
+ nIdx = startChunk( "tRNS", o_rOutputBuf );
+ o_rOutputBuf.push_back( 0xff );
+ o_rOutputBuf.push_back( 0 );
+ // end tRNS chunk
+ endChunk( nIdx, o_rOutputBuf );
+ }
+
+ // create scan line data buffer
+ OutputBuffer aScanlines;
+ int nLineSize = (width + 7)/8;
+ aScanlines.reserve( nLineSize * height + height );
+
+ str->reset();
+ for( int y = 0; y < height; y++ )
+ {
+ // determine filter type (none) for this scanline
+ aScanlines.push_back( 0 );
+ for( int x = 0; x < nLineSize; x++ )
+ aScanlines.push_back( str->getChar() );
+ }
+
+ // begin IDAT chunk for scanline data
+ nIdx = startChunk( "IDAT", o_rOutputBuf );
+ // compress scanlines
+ deflateBuffer( aScanlines.data(), aScanlines.size(), o_rOutputBuf );
+ // end IDAT chunk
+ endChunk( nIdx, o_rOutputBuf );
+
+ // output IEND
+ appendIEND( o_rOutputBuf );
+}
+
+void PngHelper::createPng( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width, int height, GfxImageColorMap* colorMap,
+ Stream* maskStr,
+ int maskWidth, int maskHeight, GfxImageColorMap* maskColorMap )
+{
+ appendFileHeader( o_rOutputBuf );
+ appendIHDR( o_rOutputBuf, width, height, 8, 6 ); // RGBA image
+
+ // initialize stream
+ unsigned char *p, *pm;
+ GfxRGB rgb;
+ GfxGray alpha;
+ std::unique_ptr<ImageStream> imgStr(
+ new ImageStream(str,
+ width,
+ colorMap->getNumPixelComps(),
+ colorMap->getBits()));
+ imgStr->reset();
+
+ // create scan line data buffer
+ OutputBuffer aScanlines;
+ aScanlines.reserve( width*height*4 + height );
+
+ for( int y=0; y<height; ++y)
+ {
+ aScanlines.push_back( 0 );
+ p = imgStr->getLine();
+ for( int x=0; x<width; ++x)
+ {
+ colorMap->getRGB(p, &rgb);
+ aScanlines.push_back(colToByte(rgb.r));
+ aScanlines.push_back(colToByte(rgb.g));
+ aScanlines.push_back(colToByte(rgb.b));
+ aScanlines.push_back( 0xff );
+
+ p +=colorMap->getNumPixelComps();
+ }
+ }
+
+
+ // now fill in the mask data
+
+ // CAUTION: originally this was done in one single loop
+ // it caused merry chaos; the reason is that maskStr and str are
+ // not independent streams, it happens that reading one advances
+ // the other, too. Hence the two passes are imperative !
+
+ // initialize mask stream
+ std::unique_ptr<ImageStream> imgStrMask(
+ new ImageStream(maskStr,
+ maskWidth,
+ maskColorMap->getNumPixelComps(),
+ maskColorMap->getBits()));
+
+ imgStrMask->reset();
+ for( int y = 0; y < maskHeight; ++y )
+ {
+ pm = imgStrMask->getLine();
+ for( int x = 0; x < maskWidth; ++x )
+ {
+ maskColorMap->getGray(pm,&alpha);
+ pm += maskColorMap->getNumPixelComps();
+ int nIndex = (y*height/maskHeight) * (width*4+1) + // mapped line
+ (x*width/maskWidth)*4 + 1 + 3 // mapped column
+ ;
+ aScanlines[ nIndex ] = colToByte(alpha);
+ }
+ }
+
+ imgStr.reset();
+ imgStrMask.reset();
+
+ // begind IDAT chunk for scanline data
+ size_t nIdx = startChunk( "IDAT", o_rOutputBuf );
+ // compress scanlines
+ deflateBuffer( aScanlines.data(), aScanlines.size(), o_rOutputBuf );
+ // end IDAT chunk
+ endChunk( nIdx, o_rOutputBuf );
+ // output IEND
+ appendIEND( o_rOutputBuf );
+}
+
+// one bit mask; 0 bits opaque
+void PngHelper::createPng( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width, int height, GfxImageColorMap* colorMap,
+ Stream* maskStr,
+ int maskWidth, int maskHeight,
+ bool maskInvert
+ )
+{
+ appendFileHeader( o_rOutputBuf );
+ appendIHDR( o_rOutputBuf, width, height, 8, 6 ); // RGBA image
+
+ // initialize stream
+ unsigned char *p;
+ GfxRGB rgb;
+ std::unique_ptr<ImageStream> imgStr(
+ new ImageStream(str,
+ width,
+ colorMap->getNumPixelComps(),
+ colorMap->getBits()));
+ imgStr->reset();
+
+ // create scan line data buffer
+ OutputBuffer aScanlines;
+ aScanlines.reserve( width*height*4 + height );
+
+ for( int y=0; y<height; ++y)
+ {
+ aScanlines.push_back( 0 );
+ p = imgStr->getLine();
+ for( int x=0; x<width; ++x)
+ {
+ colorMap->getRGB(p, &rgb);
+ aScanlines.push_back(colToByte(rgb.r));
+ aScanlines.push_back(colToByte(rgb.g));
+ aScanlines.push_back(colToByte(rgb.b));
+ aScanlines.push_back( 0xff );
+
+ p +=colorMap->getNumPixelComps();
+ }
+ }
+
+
+ // now fill in the mask data
+
+ // CAUTION: originally this was done in one single loop
+ // it caused merry chaos; the reason is that maskStr and str are
+ // not independent streams, it happens that reading one advances
+ // the other, too. Hence the two passes are imperative !
+
+ // initialize mask stream
+ std::unique_ptr<ImageStream> imgStrMask(
+ new ImageStream(maskStr, maskWidth, 1, 1));
+
+ imgStrMask->reset();
+ for( int y = 0; y < maskHeight; ++y )
+ {
+ for( int x = 0; x < maskWidth; ++x )
+ {
+ unsigned char aPixel = 0;
+ imgStrMask->getPixel( &aPixel );
+ int nIndex = (y*height/maskHeight) * (width*4+1) + // mapped line
+ (x*width/maskWidth)*4 + 1 + 3 // mapped column
+ ;
+ if( maskInvert )
+ aScanlines[ nIndex ] = aPixel ? 0xff : 0x00;
+ else
+ aScanlines[ nIndex ] = aPixel ? 0x00 : 0xff;
+ }
+ }
+
+ imgStr.reset();
+ imgStrMask.reset();
+
+ // begind IDAT chunk for scanline data
+ size_t nIdx = startChunk( "IDAT", o_rOutputBuf );
+ // compress scanlines
+ deflateBuffer( aScanlines.data(), aScanlines.size(), o_rOutputBuf );
+ // end IDAT chunk
+ endChunk( nIdx, o_rOutputBuf );
+ // output IEND
+ appendIEND( o_rOutputBuf );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/xpdfwrapper/pnghelper.hxx b/sdext/source/pdfimport/xpdfwrapper/pnghelper.hxx
new file mode 100644
index 000000000..e0f2ea98b
--- /dev/null
+++ b/sdext/source/pdfimport/xpdfwrapper/pnghelper.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/.
+ *
+ * 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_SDEXT_SOURCE_PDFIMPORT_XPDFWRAPPER_PNGHELPER_HXX
+#define INCLUDED_SDEXT_SOURCE_PDFIMPORT_XPDFWRAPPER_PNGHELPER_HXX
+
+#include <sal/types.h>
+#include "pdfioutdev_gpl.hxx"
+
+
+namespace pdfi
+{
+ class PngHelper
+ {
+ static sal_uInt32 crc_table[ 256 ];
+ static bool bCRCTableInit;
+
+ static void initCRCTable();
+ static void appendFileHeader( OutputBuffer& o_rOutputBuf );
+ static size_t startChunk( const char* pChunkName, OutputBuffer& o_rOut );
+ static void endChunk( size_t nStart, OutputBuffer& o_rOut );
+
+ static void set( sal_uInt32 i_nValue, OutputBuffer& o_rOutputBuf, size_t i_nIndex );
+ static void append( sal_uInt32 i_nValue, OutputBuffer& o_rOutputBuf )
+ {
+ size_t nCur = o_rOutputBuf.size();
+ o_rOutputBuf.insert( o_rOutputBuf.end(), 4, Output_t(0) );
+ set( i_nValue, o_rOutputBuf, nCur );
+ }
+
+ static void appendIHDR( OutputBuffer& o_rOutputBuf, int width, int height, int depth, int colortype );
+ static void appendIEND( OutputBuffer& o_rOutputBuf );
+
+ public:
+ static void updateCRC( sal_uInt32& io_rCRC, const sal_uInt8* i_pBuf, size_t i_nLen );
+ static sal_uInt32 getCRC( const sal_uInt8* i_pBuf, size_t i_nLen );
+
+ // deflates the passed buff i_pBuf and appends it to the output vector
+ // returns the number of bytes added to the output
+ static sal_uInt32 deflateBuffer( const Output_t* i_pBuf, size_t i_nLen, OutputBuffer& o_rOut );
+
+ static void createPng( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width,
+ int height,
+ GfxRGB const & zeroColor,
+ GfxRGB const & oneColor,
+ bool bIsMask
+ );
+ static void createPng( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width, int height, GfxImageColorMap* colorMap,
+ Stream* maskStr,
+ int maskWidth, int maskHeight, GfxImageColorMap* maskColorMap );
+
+ // for one bit masks
+ static void createPng( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width, int height, GfxImageColorMap* colorMap,
+ Stream* maskStr,
+ int maskWidth, int maskHeight, bool maskInvert );
+
+ };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/xpdfwrapper/wrapper_gpl.cxx b/sdext/source/pdfimport/xpdfwrapper/wrapper_gpl.cxx
new file mode 100644
index 000000000..e924547e9
--- /dev/null
+++ b/sdext/source/pdfimport/xpdfwrapper/wrapper_gpl.cxx
@@ -0,0 +1,188 @@
+/* -*- 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 "pdfioutdev_gpl.hxx"
+#ifdef _WIN32
+# include <io.h>
+# include <fcntl.h> /*_O_BINARY*/
+#endif
+#ifndef SYSTEM_POPPLER
+#include <string> // std::string
+#include <cstddef> // std::size_t
+#include <config_folders.h> //LIBO_SHARE_FOLDER
+#endif
+
+FILE* g_binary_out=stderr;
+
+static const char *ownerPassword = "\001";
+static const char *userPassword = "\001";
+static const char *outputFile = "\001";
+static const char *options = "\001";
+
+int main(int argc, char **argv)
+{
+ int k = 0;
+ while (k < argc)
+ {
+ if (!strcmp(argv[k], "-f"))
+ {
+ outputFile = argv[k+1];
+ argc -= 2;
+ for (int j = k; j < argc; ++j)
+ argv[j] = argv[j+2];
+ }
+ else if (!strcmp(argv[k], "-o"))
+ {
+ options = argv[k+1];
+ argc -= 2;
+ for (int j = k; j < argc; ++j)
+ argv[j] = argv[j+2];
+ }
+
+ else if (!strcmp(argv[k], "-opw"))
+ {
+ ownerPassword = argv[k+1];
+ argc -= 2;
+ for (int j = k; j < argc; ++j)
+ argv[j] = argv[j+2];
+ }
+ else if (!strcmp(argv[k], "-upw"))
+ {
+ userPassword = argv[k+1];
+ argc -= 2;
+ for (int j = k; j < argc; ++j)
+ argv[j] = argv[j+2];
+ }
+ ++k;
+ }
+
+ /* Get data directory location */
+#ifdef SYSTEM_POPPLER
+ const char* datadir = nullptr;
+#else
+ /* Creates an absolute path to the poppler_data directory, by taking the path
+ * to the xpdfimport executable (provided in argv[0], and concatenating a
+ * relative path to the poppler_data directory from the program directory. */
+ const std::string execPath = argv[0];
+ const std::size_t filenameStartPos = execPath.find_last_of("/\\")+1;
+ const std::string programPath = execPath.substr(0,filenameStartPos);
+ const std::string popplerDataPath = programPath + "../" LIBO_SHARE_FOLDER "/xpdfimport/poppler_data";
+ const char* datadir = popplerDataPath.c_str();
+#endif
+
+ // read config file
+#if POPPLER_CHECK_VERSION(0, 83, 0)
+ globalParams = std::make_unique<GlobalParams>(datadir);
+#else
+ globalParams = new GlobalParams(datadir);
+#endif
+ globalParams->setErrQuiet(true);
+#if defined(_MSC_VER)
+ globalParams->setupBaseFonts(nullptr);
+#endif
+
+ // try to read a possible open password from stdin
+ char aPwBuf[129];
+ aPwBuf[128] = 0;
+ if( ! fgets( aPwBuf, sizeof(aPwBuf)-1, stdin ) )
+ aPwBuf[0] = 0; // mark as empty
+ else
+ {
+ for( size_t i = 0; i < sizeof(aPwBuf); i++ )
+ {
+ if( aPwBuf[i] == '\n' )
+ {
+ aPwBuf[i] = 0;
+ break;
+ }
+ }
+ }
+
+ // PDFDoc takes over ownership for all strings below
+ GooString* pFileName = new GooString(argv[1]);
+ GooString* pErrFileName = new GooString(argv[2]);
+
+ // check for password string(s)
+ GooString* pOwnerPasswordStr( aPwBuf[0] != 0
+ ? new GooString( aPwBuf )
+ : (ownerPassword[0] != '\001'
+ ? new GooString(ownerPassword)
+ : nullptr ) );
+ GooString* pUserPasswordStr( aPwBuf[0] != 0
+ ? new GooString( aPwBuf )
+ : (userPassword[0] != '\001'
+ ? new GooString(userPassword)
+ : nullptr ) );
+ if( outputFile[0] != '\001' )
+ g_binary_out = fopen(outputFile,"wb");
+
+#ifdef _WIN32
+ // Win actually modifies output for O_TEXT file mode, so need to
+ // revert to binary here
+ _setmode( _fileno( g_binary_out ), _O_BINARY );
+#endif
+
+#if POPPLER_CHECK_VERSION(22, 6, 0)
+ PDFDoc aDoc( std::make_unique<GooString>(pFileName),
+ std::optional<GooString>(pOwnerPasswordStr),
+ std::optional<GooString>(pUserPasswordStr) );
+
+ PDFDoc aErrDoc( std::make_unique<GooString>(pErrFileName),
+ std::optional<GooString>(pOwnerPasswordStr),
+ std::optional<GooString>(pUserPasswordStr) );
+#else
+ PDFDoc aDoc( pFileName,
+ pOwnerPasswordStr,
+ pUserPasswordStr );
+
+ PDFDoc aErrDoc( pErrFileName,
+ pOwnerPasswordStr,
+ pUserPasswordStr );
+#endif
+
+ // Check various permissions for aDoc.
+ PDFDoc &rDoc = aDoc.isOk()? aDoc: aErrDoc;
+
+ pdfi::PDFOutDev aOutDev(&rDoc);
+ if (!strcmp(options, "SkipImages")) {
+ aOutDev.setSkipImages(true);
+ }
+
+ // tell the receiver early - needed for proper progress calculation
+ const int nPages = rDoc.isOk()? rDoc.getNumPages(): 0;
+ pdfi::PDFOutDev::setPageNum(nPages);
+
+ // virtual resolution of the PDF OutputDev in dpi
+ static const int PDFI_OUTDEV_RESOLUTION = 7200;
+
+ // do the conversion
+ for (int i = 1; i <= nPages; ++i)
+ {
+ rDoc.displayPage(&aOutDev,
+ i,
+ PDFI_OUTDEV_RESOLUTION,
+ PDFI_OUTDEV_RESOLUTION,
+ 0, true, true, true);
+ rDoc.processLinks(&aOutDev, i);
+ }
+
+ return 0;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterAccessibility.cxx b/sdext/source/presenter/PresenterAccessibility.cxx
new file mode 100644
index 000000000..e3f49ed1d
--- /dev/null
+++ b/sdext/source/presenter/PresenterAccessibility.cxx
@@ -0,0 +1,1849 @@
+/* -*- 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 "PresenterAccessibility.hxx"
+#include "PresenterTextView.hxx"
+#include "PresenterConfigurationAccess.hxx"
+#include "PresenterNotesView.hxx"
+#include "PresenterPaneBase.hxx"
+#include "PresenterPaneContainer.hxx"
+#include "PresenterPaneFactory.hxx"
+
+#include <com/sun/star/accessibility/AccessibleEventId.hpp>
+#include <com/sun/star/accessibility/AccessibleRelationType.hpp>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/accessibility/AccessibleScrollType.hpp>
+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
+#include <com/sun/star/accessibility/XAccessibleComponent.hpp>
+#include <com/sun/star/accessibility/XAccessibleContext.hpp>
+#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
+#include <com/sun/star/accessibility/XAccessibleText.hpp>
+#include <com/sun/star/awt/XWindow2.hpp>
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/implbase.hxx>
+#include <o3tl/safeint.hxx>
+#include <sal/log.hxx>
+
+#include <algorithm>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::accessibility;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+//===== PresenterAccessibleObject =============================================
+
+namespace sdext::presenter {
+
+namespace {
+ typedef ::cppu::WeakComponentImplHelper <
+ css::accessibility::XAccessible,
+ css::accessibility::XAccessibleContext,
+ css::accessibility::XAccessibleComponent,
+ css::accessibility::XAccessibleEventBroadcaster,
+ css::awt::XWindowListener
+ > PresenterAccessibleObjectInterfaceBase;
+}
+
+class PresenterAccessible::AccessibleObject
+ : public ::cppu::BaseMutex,
+ public PresenterAccessibleObjectInterfaceBase
+{
+public:
+ AccessibleObject (
+ const css::lang::Locale& rLocale,
+ const sal_Int16 nRole,
+ const OUString& rsName);
+ void LateInitialization();
+
+ virtual void SetWindow (
+ const css::uno::Reference<css::awt::XWindow>& rxContentWindow,
+ const css::uno::Reference<css::awt::XWindow>& rxBorderWindow);
+ void SetAccessibleParent (const css::uno::Reference<css::accessibility::XAccessible>& rxAccessibleParent);
+
+ virtual void SAL_CALL disposing() override;
+
+ void AddChild (const ::rtl::Reference<AccessibleObject>& rpChild);
+ void RemoveChild (const ::rtl::Reference<AccessibleObject>& rpChild);
+
+ void SetIsFocused (const bool bIsFocused);
+ void SetAccessibleName (const OUString& rsName);
+
+ void FireAccessibleEvent (
+ const sal_Int16 nEventId,
+ const css::uno::Any& rOldValue,
+ const css::uno::Any& rNewValue);
+
+ void UpdateStateSet();
+
+ //----- XAccessible -------------------------------------------------------
+
+ virtual css::uno::Reference<css::accessibility::XAccessibleContext> SAL_CALL
+ getAccessibleContext() override;
+
+ //----- XAccessibleContext ----------------------------------------------
+
+ virtual sal_Int32 SAL_CALL getAccessibleChildCount() override;
+
+ virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL
+ getAccessibleChild (sal_Int32 nIndex) override;
+
+ virtual css::uno::Reference< css::accessibility::XAccessible> SAL_CALL getAccessibleParent() override;
+
+ virtual sal_Int32 SAL_CALL getAccessibleIndexInParent() override;
+
+ virtual sal_Int16 SAL_CALL getAccessibleRole() override;
+
+ virtual OUString SAL_CALL getAccessibleDescription() override;
+
+ virtual OUString SAL_CALL getAccessibleName() override;
+
+ virtual css::uno::Reference<css::accessibility::XAccessibleRelationSet> SAL_CALL
+ getAccessibleRelationSet() override;
+
+ virtual css::uno::Reference<css::accessibility::XAccessibleStateSet> SAL_CALL
+ getAccessibleStateSet() override;
+
+ virtual css::lang::Locale SAL_CALL getLocale() override;
+
+ //----- XAccessibleComponent --------------------------------------------
+
+ virtual sal_Bool SAL_CALL containsPoint (
+ const css::awt::Point& aPoint) override;
+
+ virtual css::uno::Reference<css::accessibility::XAccessible> SAL_CALL
+ getAccessibleAtPoint (
+ const css::awt::Point& aPoint) override;
+
+ virtual css::awt::Rectangle SAL_CALL getBounds() override;
+
+ virtual css::awt::Point SAL_CALL getLocation() override;
+
+ virtual css::awt::Point SAL_CALL getLocationOnScreen() override;
+
+ virtual css::awt::Size SAL_CALL getSize() override;
+
+ virtual void SAL_CALL grabFocus() override;
+
+ virtual sal_Int32 SAL_CALL getForeground() override;
+
+ virtual sal_Int32 SAL_CALL getBackground() override;
+
+ //----- XAccessibleEventBroadcaster --------------------------------------
+
+ virtual void SAL_CALL addAccessibleEventListener (
+ const css::uno::Reference<css::accessibility::XAccessibleEventListener>& rxListener) override;
+
+ virtual void SAL_CALL removeAccessibleEventListener (
+ const css::uno::Reference<css::accessibility::XAccessibleEventListener>& rxListener) override;
+
+ //----- XWindowListener ---------------------------------------------------
+
+ virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override;
+
+ //----- XEventListener ----------------------------------------------------
+
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+
+protected:
+ OUString msName;
+ css::uno::Reference<css::awt::XWindow2> mxContentWindow;
+ css::uno::Reference<css::awt::XWindow2> mxBorderWindow;
+ const css::lang::Locale maLocale;
+ const sal_Int16 mnRole;
+ sal_uInt32 mnStateSet;
+ bool mbIsFocused;
+ css::uno::Reference<css::accessibility::XAccessible> mxParentAccessible;
+ ::std::vector<rtl::Reference<AccessibleObject> > maChildren;
+ ::std::vector<Reference<XAccessibleEventListener> > maListeners;
+
+ virtual awt::Point GetRelativeLocation();
+ virtual awt::Size GetSize();
+ virtual awt::Point GetAbsoluteParentLocation();
+
+ virtual bool GetWindowState (const sal_Int16 nType) const;
+
+ void UpdateState (const sal_Int16 aState, const bool bValue);
+
+ /// @throws css::lang::DisposedException
+ void ThrowIfDisposed() const;
+};
+
+//===== AccessibleStateSet ====================================================
+
+namespace {
+typedef ::cppu::WeakComponentImplHelper <
+ css::accessibility::XAccessibleStateSet
+ > AccessibleStateSetInterfaceBase;
+
+class AccessibleStateSet
+ : public ::cppu::BaseMutex,
+ public AccessibleStateSetInterfaceBase
+{
+public:
+ explicit AccessibleStateSet (const sal_Int32 nStateSet);
+
+ static sal_uInt32 GetStateMask (const sal_Int16 nType);
+
+ //----- XAccessibleStateSet -----------------------------------------------
+
+ virtual sal_Bool SAL_CALL isEmpty() override;
+
+ virtual sal_Bool SAL_CALL contains (sal_Int16 nState) override;
+
+ virtual sal_Bool SAL_CALL containsAll (const css::uno::Sequence<sal_Int16>& rStateSet) override;
+
+ virtual css::uno::Sequence<sal_Int16> SAL_CALL getStates() override;
+
+private:
+ const sal_Int32 mnStateSet;
+};
+
+//===== AccessibleRelationSet =================================================
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::accessibility::XAccessibleRelationSet
+ > AccessibleRelationSetInterfaceBase;
+
+class AccessibleRelationSet
+ : public ::cppu::BaseMutex,
+ public AccessibleRelationSetInterfaceBase
+{
+public:
+ AccessibleRelationSet();
+
+ void AddRelation (
+ const sal_Int16 nRelationType,
+ const Reference<XInterface>& rxObject);
+
+ //----- XAccessibleRelationSet --------------------------------------------
+
+ virtual sal_Int32 SAL_CALL getRelationCount() override;
+
+ virtual AccessibleRelation SAL_CALL getRelation (sal_Int32 nIndex) override;
+
+ virtual sal_Bool SAL_CALL containsRelation (sal_Int16 nRelationType) override;
+
+ virtual AccessibleRelation SAL_CALL getRelationByType (sal_Int16 nRelationType) override;
+
+private:
+ ::std::vector<AccessibleRelation> maRelations;
+};
+
+//===== PresenterAccessibleParagraph ==========================================
+
+typedef ::cppu::ImplInheritanceHelper <
+ PresenterAccessible::AccessibleObject,
+ css::accessibility::XAccessibleText
+ > PresenterAccessibleParagraphInterfaceBase;
+}
+
+class PresenterAccessible::AccessibleParagraph
+ : public PresenterAccessibleParagraphInterfaceBase
+{
+public:
+ AccessibleParagraph (
+ const css::lang::Locale& rLocale,
+ const OUString& rsName,
+ const SharedPresenterTextParagraph& rpParagraph,
+ const sal_Int32 nParagraphIndex);
+
+ //----- XAccessibleContext ------------------------------------------------
+
+ virtual css::uno::Reference<css::accessibility::XAccessibleRelationSet> SAL_CALL
+ getAccessibleRelationSet() override;
+
+ //----- XAccessibleText ---------------------------------------------------
+
+ virtual sal_Int32 SAL_CALL getCaretPosition() override;
+
+ virtual sal_Bool SAL_CALL setCaretPosition (sal_Int32 nIndex) override;
+
+ virtual sal_Unicode SAL_CALL getCharacter (sal_Int32 nIndex) override;
+
+ virtual css::uno::Sequence<css::beans::PropertyValue> SAL_CALL
+ getCharacterAttributes (
+ ::sal_Int32 nIndex,
+ const css::uno::Sequence<OUString>& rRequestedAttributes) override;
+
+ virtual css::awt::Rectangle SAL_CALL getCharacterBounds (sal_Int32 nIndex) override;
+
+ virtual sal_Int32 SAL_CALL getCharacterCount() override;
+
+ virtual sal_Int32 SAL_CALL getIndexAtPoint (const css::awt::Point& rPoint) override;
+
+ virtual OUString SAL_CALL getSelectedText() override;
+
+ virtual sal_Int32 SAL_CALL getSelectionStart() override;
+
+ virtual sal_Int32 SAL_CALL getSelectionEnd() override;
+
+ virtual sal_Bool SAL_CALL setSelection (sal_Int32 nStartIndex, sal_Int32 nEndIndex) override;
+
+ virtual OUString SAL_CALL getText() override;
+
+ virtual OUString SAL_CALL getTextRange (
+ sal_Int32 nStartIndex,
+ sal_Int32 nEndIndex) override;
+
+ virtual css::accessibility::TextSegment SAL_CALL getTextAtIndex (
+ sal_Int32 nIndex,
+ sal_Int16 nTextType) override;
+
+ virtual css::accessibility::TextSegment SAL_CALL getTextBeforeIndex (
+ sal_Int32 nIndex,
+ sal_Int16 nTextType) override;
+
+ virtual css::accessibility::TextSegment SAL_CALL getTextBehindIndex (
+ sal_Int32 nIndex,
+ sal_Int16 nTextType) override;
+
+ virtual sal_Bool SAL_CALL copyText (sal_Int32 nStartIndex, sal_Int32 nEndIndex) override;
+
+ virtual sal_Bool SAL_CALL scrollSubstringTo(
+ sal_Int32 nStartIndex,
+ sal_Int32 nEndIndex,
+ css::accessibility::AccessibleScrollType aScrollType) override;
+
+protected:
+ virtual awt::Point GetRelativeLocation() override;
+ virtual awt::Size GetSize() override;
+ virtual awt::Point GetAbsoluteParentLocation() override;
+ virtual bool GetWindowState (const sal_Int16 nType) const override;
+
+private:
+ SharedPresenterTextParagraph mpParagraph;
+ const sal_Int32 mnParagraphIndex;
+};
+
+//===== AccessibleConsole =====================================================
+
+namespace {
+
+class AccessibleConsole
+{
+public:
+ static rtl::Reference<PresenterAccessible::AccessibleObject> Create (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const lang::Locale& rLocale)
+ {
+ OUString sName ("Presenter Console");
+ PresenterConfigurationAccess aConfiguration (
+ rxContext,
+ "/org.openoffice.Office.PresenterScreen/",
+ PresenterConfigurationAccess::READ_ONLY);
+ aConfiguration.GetConfigurationNode("Presenter/Accessibility/Console/String")
+ >>= sName;
+
+ rtl::Reference<PresenterAccessible::AccessibleObject> pObject (
+ new PresenterAccessible::AccessibleObject(
+ rLocale, AccessibleRole::PANEL, sName));
+ pObject->LateInitialization();
+ pObject->UpdateStateSet();
+
+ return pObject;
+ }
+};
+
+//===== AccessiblePreview =====================================================
+
+class AccessiblePreview
+{
+public:
+ static rtl::Reference<PresenterAccessible::AccessibleObject> Create (
+ const Reference<css::uno::XComponentContext>& rxContext,
+ const lang::Locale& rLocale,
+ const Reference<awt::XWindow>& rxContentWindow,
+ const Reference<awt::XWindow>& rxBorderWindow)
+ {
+ OUString sName ("Presenter Notes Window");
+ {
+ PresenterConfigurationAccess aConfiguration (
+ rxContext,
+ "/org.openoffice.Office.PresenterScreen/",
+ PresenterConfigurationAccess::READ_ONLY);
+ aConfiguration.GetConfigurationNode("Presenter/Accessibility/Preview/String")
+ >>= sName;
+ }
+
+ rtl::Reference<PresenterAccessible::AccessibleObject> pObject (
+ new PresenterAccessible::AccessibleObject(
+ rLocale,
+ AccessibleRole::LABEL,
+ sName));
+ pObject->LateInitialization();
+ pObject->UpdateStateSet();
+ pObject->SetWindow(rxContentWindow, rxBorderWindow);
+
+ return pObject;
+ }
+};
+
+//===== AccessibleNotes =======================================================
+
+class AccessibleNotes : public PresenterAccessible::AccessibleObject
+{
+public:
+ AccessibleNotes (
+ const css::lang::Locale& rLocale,
+ const OUString& rsName);
+
+ static rtl::Reference<PresenterAccessible::AccessibleObject> Create (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const lang::Locale& rLocale,
+ const Reference<awt::XWindow>& rxContentWindow,
+ const Reference<awt::XWindow>& rxBorderWindow,
+ const std::shared_ptr<PresenterTextView>& rpTextView);
+
+ void SetTextView (const std::shared_ptr<PresenterTextView>& rpTextView);
+
+ virtual void SetWindow (
+ const css::uno::Reference<css::awt::XWindow>& rxContentWindow,
+ const css::uno::Reference<css::awt::XWindow>& rxBorderWindow) override;
+
+private:
+ std::shared_ptr<PresenterTextView> mpTextView;
+
+ void NotifyCaretChange (
+ const sal_Int32 nOldParagraphIndex,
+ const sal_Int32 nOldCharacterIndex,
+ const sal_Int32 nNewParagraphIndex,
+ const sal_Int32 nNewCharacterIndex);
+};
+
+//===== AccessibleFocusManager ================================================
+
+/** A singleton class that makes sure that only one accessibility object in
+ the PresenterConsole hierarchy has the focus.
+*/
+class AccessibleFocusManager
+{
+public:
+ static std::shared_ptr<AccessibleFocusManager> const & Instance();
+
+ void AddFocusableObject (const ::rtl::Reference<PresenterAccessible::AccessibleObject>& rpObject);
+ void RemoveFocusableObject (const ::rtl::Reference<PresenterAccessible::AccessibleObject>& rpObject);
+
+ void FocusObject (const ::rtl::Reference<PresenterAccessible::AccessibleObject>& rpObject);
+
+ ~AccessibleFocusManager();
+
+private:
+ static std::shared_ptr<AccessibleFocusManager> mpInstance;
+ ::std::vector<rtl::Reference<PresenterAccessible::AccessibleObject> > maFocusableObjects;
+ bool m_isInDtor = false;
+
+ AccessibleFocusManager();
+};
+
+}
+
+//===== PresenterAccessible ===================================================
+
+PresenterAccessible::PresenterAccessible (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController,
+ const Reference<drawing::framework::XPane>& rxMainPane)
+ : PresenterAccessibleInterfaceBase(m_aMutex),
+ mxComponentContext(rxContext),
+ mpPresenterController(rpPresenterController),
+ mxMainPane(rxMainPane, UNO_QUERY)
+{
+ if (mxMainPane.is())
+ mxMainPane->setAccessible(this);
+}
+
+PresenterAccessible::~PresenterAccessible()
+{
+}
+
+PresenterPaneContainer::SharedPaneDescriptor PresenterAccessible::GetPreviewPane() const
+{
+ PresenterPaneContainer::SharedPaneDescriptor pPreviewPane;
+
+ if ( ! mpPresenterController.is())
+ return pPreviewPane;
+
+ rtl::Reference<PresenterPaneContainer> pContainer (mpPresenterController->GetPaneContainer());
+ if ( ! pContainer.is())
+ return pPreviewPane;
+
+ pPreviewPane = pContainer->FindPaneURL(PresenterPaneFactory::msCurrentSlidePreviewPaneURL);
+ Reference<drawing::framework::XPane> xPreviewPane;
+ if (pPreviewPane)
+ xPreviewPane = pPreviewPane->mxPane.get();
+ if ( ! xPreviewPane.is())
+ {
+ pPreviewPane = pContainer->FindPaneURL(PresenterPaneFactory::msSlideSorterPaneURL);
+ }
+ return pPreviewPane;
+}
+
+void PresenterAccessible::UpdateAccessibilityHierarchy()
+{
+ if ( ! mpPresenterController.is())
+ return;
+
+ Reference<drawing::framework::XConfigurationController> xConfigurationController(
+ mpPresenterController->GetConfigurationController());
+ if ( ! xConfigurationController.is())
+ return;
+
+ rtl::Reference<PresenterPaneContainer> pPaneContainer (
+ mpPresenterController->GetPaneContainer());
+ if ( ! pPaneContainer.is())
+ return;
+
+ if ( ! mpAccessibleConsole.is())
+ return;
+
+ // Get the preview pane (standard or notes view) or the slide overview
+ // pane.
+ PresenterPaneContainer::SharedPaneDescriptor pPreviewPane(GetPreviewPane());
+ Reference<drawing::framework::XPane> xPreviewPane;
+ if (pPreviewPane)
+ xPreviewPane = pPreviewPane->mxPane.get();
+
+ // Get the notes pane.
+ PresenterPaneContainer::SharedPaneDescriptor pNotesPane(
+ pPaneContainer->FindPaneURL(PresenterPaneFactory::msNotesPaneURL));
+ Reference<drawing::framework::XPane> xNotesPane;
+ if (pNotesPane)
+ xNotesPane = pNotesPane->mxPane.get();
+
+ // Get the notes view.
+ Reference<drawing::framework::XView> xNotesView;
+ if (pNotesPane)
+ xNotesView = pNotesPane->mxView;
+ rtl::Reference<PresenterNotesView> pNotesView (
+ dynamic_cast<PresenterNotesView*>(xNotesView.get()));
+
+ UpdateAccessibilityHierarchy(
+ pPreviewPane ? pPreviewPane->mxContentWindow : Reference<awt::XWindow>(),
+ pPreviewPane ? pPreviewPane->mxBorderWindow : Reference<awt::XWindow>(),
+ (pPreviewPane&&pPreviewPane->mxPane.is()) ? pPreviewPane->mxPane->GetTitle() : OUString(),
+ pNotesPane ? pNotesPane->mxContentWindow : Reference<awt::XWindow>(),
+ pNotesPane ? pNotesPane->mxBorderWindow : Reference<awt::XWindow>(),
+ pNotesView.is()
+ ? pNotesView->GetTextView()
+ : std::shared_ptr<PresenterTextView>());
+}
+
+void PresenterAccessible::UpdateAccessibilityHierarchy (
+ const Reference<awt::XWindow>& rxPreviewContentWindow,
+ const Reference<awt::XWindow>& rxPreviewBorderWindow,
+ const OUString& rsTitle,
+ const Reference<awt::XWindow>& rxNotesContentWindow,
+ const Reference<awt::XWindow>& rxNotesBorderWindow,
+ const std::shared_ptr<PresenterTextView>& rpNotesTextView)
+{
+ if ( ! mpAccessibleConsole.is())
+ return;
+
+ if (mxPreviewContentWindow != rxPreviewContentWindow)
+ {
+ if (mpAccessiblePreview.is())
+ {
+ mpAccessibleConsole->RemoveChild(mpAccessiblePreview);
+ mpAccessiblePreview = nullptr;
+ }
+
+ mxPreviewContentWindow = rxPreviewContentWindow;
+ mxPreviewBorderWindow = rxPreviewBorderWindow;
+
+ if (mxPreviewContentWindow.is())
+ {
+ mpAccessiblePreview = AccessiblePreview::Create(
+ mxComponentContext,
+ lang::Locale(),
+ mxPreviewContentWindow,
+ mxPreviewBorderWindow);
+ mpAccessibleConsole->AddChild(mpAccessiblePreview);
+ mpAccessiblePreview->SetAccessibleName(rsTitle);
+ }
+ }
+
+ if (mxNotesContentWindow == rxNotesContentWindow)
+ return;
+
+ if (mpAccessibleNotes.is())
+ {
+ mpAccessibleConsole->RemoveChild(mpAccessibleNotes);
+ mpAccessibleNotes = nullptr;
+ }
+
+ mxNotesContentWindow = rxNotesContentWindow;
+ mxNotesBorderWindow = rxNotesBorderWindow;
+
+ if (mxNotesContentWindow.is())
+ {
+ mpAccessibleNotes = AccessibleNotes::Create(
+ mxComponentContext,
+ lang::Locale(),
+ mxNotesContentWindow,
+ mxNotesBorderWindow,
+ rpNotesTextView);
+ mpAccessibleConsole->AddChild(mpAccessibleNotes);
+ }
+}
+
+void PresenterAccessible::NotifyCurrentSlideChange ()
+{
+ if (mpAccessiblePreview.is())
+ {
+ PresenterPaneContainer::SharedPaneDescriptor pPreviewPane (GetPreviewPane());
+ mpAccessiblePreview->SetAccessibleName(
+ pPreviewPane&&pPreviewPane->mxPane.is()
+ ? pPreviewPane->mxPane->GetTitle()
+ : OUString());
+ }
+
+ // Play some focus ping-pong to trigger AT tools.
+ //AccessibleFocusManager::Instance()->FocusObject(mpAccessibleConsole);
+ AccessibleFocusManager::Instance()->FocusObject(mpAccessiblePreview);
+}
+
+void SAL_CALL PresenterAccessible::disposing()
+{
+ UpdateAccessibilityHierarchy(
+ nullptr,
+ nullptr,
+ OUString(),
+ nullptr,
+ nullptr,
+ std::shared_ptr<PresenterTextView>());
+
+ if (mxMainWindow.is())
+ {
+ mxMainWindow->removeFocusListener(this);
+
+ if (mxMainPane.is())
+ mxMainPane->setAccessible(nullptr);
+ }
+
+ mpAccessiblePreview = nullptr;
+ mpAccessibleNotes = nullptr;
+ mpAccessibleConsole = nullptr;
+}
+
+//----- XAccessible -----------------------------------------------------------
+
+Reference<XAccessibleContext> SAL_CALL PresenterAccessible::getAccessibleContext()
+{
+ if ( ! mpAccessibleConsole.is())
+ {
+ Reference<XPane> xMainPane (mxMainPane, UNO_QUERY);
+ if (xMainPane.is())
+ {
+ mxMainWindow = xMainPane->getWindow();
+ mxMainWindow->addFocusListener(this);
+ }
+ mpAccessibleConsole = AccessibleConsole::Create(
+ mxComponentContext, css::lang::Locale());
+ mpAccessibleConsole->SetWindow(mxMainWindow, nullptr);
+ mpAccessibleConsole->SetAccessibleParent(mxAccessibleParent);
+ UpdateAccessibilityHierarchy();
+ if (mpPresenterController.is())
+ mpPresenterController->SetAccessibilityActiveState(true);
+ }
+ return mpAccessibleConsole->getAccessibleContext();
+}
+
+//----- XFocusListener ----------------------------------------------------
+
+void SAL_CALL PresenterAccessible::focusGained (const css::awt::FocusEvent&)
+{
+ SAL_INFO("sdext.presenter", __func__ << ": PresenterAccessible::focusGained at " << this
+ << " and window " << mxMainWindow.get());
+ AccessibleFocusManager::Instance()->FocusObject(mpAccessibleConsole);
+}
+
+void SAL_CALL PresenterAccessible::focusLost (const css::awt::FocusEvent&)
+{
+ SAL_INFO("sdext.presenter", __func__ << ": PresenterAccessible::focusLost at " << this);
+ AccessibleFocusManager::Instance()->FocusObject(nullptr);
+}
+
+//----- XEventListener ----------------------------------------------------
+
+void SAL_CALL PresenterAccessible::disposing (const css::lang::EventObject& rEvent)
+{
+ if (rEvent.Source == mxMainWindow)
+ mxMainWindow = nullptr;
+}
+
+//----- XInitialize -----------------------------------------------------------
+
+void SAL_CALL PresenterAccessible::initialize (const css::uno::Sequence<css::uno::Any>& rArguments)
+{
+ if (rArguments.hasElements())
+ {
+ mxAccessibleParent.set(rArguments[0], UNO_QUERY);
+ if (mpAccessibleConsole.is())
+ mpAccessibleConsole->SetAccessibleParent(mxAccessibleParent);
+ }
+}
+
+//===== PresenterAccessible::AccessibleObject =========================================
+
+PresenterAccessible::AccessibleObject::AccessibleObject (
+ const lang::Locale& rLocale,
+ const sal_Int16 nRole,
+ const OUString& rsName)
+ : PresenterAccessibleObjectInterfaceBase(m_aMutex),
+ msName(rsName),
+ maLocale(rLocale),
+ mnRole(nRole),
+ mnStateSet(0),
+ mbIsFocused(false)
+{
+}
+
+void PresenterAccessible::AccessibleObject::LateInitialization()
+{
+ AccessibleFocusManager::Instance()->AddFocusableObject(this);
+}
+
+void PresenterAccessible::AccessibleObject::SetWindow (
+ const Reference<awt::XWindow>& rxContentWindow,
+ const Reference<awt::XWindow>& rxBorderWindow)
+{
+ Reference<awt::XWindow2> xContentWindow (rxContentWindow, UNO_QUERY);
+
+ if (mxContentWindow.get() == xContentWindow.get())
+ return;
+
+ if (mxContentWindow.is())
+ {
+ mxContentWindow->removeWindowListener(this);
+ }
+
+ mxContentWindow = xContentWindow;
+ mxBorderWindow.set(rxBorderWindow, UNO_QUERY);
+
+ if (mxContentWindow.is())
+ {
+ mxContentWindow->addWindowListener(this);
+ }
+
+ UpdateStateSet();
+}
+
+void PresenterAccessible::AccessibleObject::SetAccessibleParent (
+ const Reference<XAccessible>& rxAccessibleParent)
+{
+ mxParentAccessible = rxAccessibleParent;
+}
+
+void SAL_CALL PresenterAccessible::AccessibleObject::disposing()
+{
+ AccessibleFocusManager::Instance()->RemoveFocusableObject(this);
+ SetWindow(nullptr, nullptr);
+}
+
+//----- XAccessible -------------------------------------------------------
+
+Reference<XAccessibleContext> SAL_CALL
+ PresenterAccessible::AccessibleObject::getAccessibleContext()
+{
+ ThrowIfDisposed();
+
+ return this;
+}
+
+//----- XAccessibleContext ----------------------------------------------
+
+sal_Int32 SAL_CALL PresenterAccessible::AccessibleObject::getAccessibleChildCount()
+{
+ ThrowIfDisposed();
+
+ const sal_Int32 nChildCount (maChildren.size());
+
+ return nChildCount;
+}
+
+Reference<XAccessible> SAL_CALL
+ PresenterAccessible::AccessibleObject::getAccessibleChild (sal_Int32 nIndex)
+{
+ ThrowIfDisposed();
+
+ if (nIndex<0 || o3tl::make_unsigned(nIndex)>=maChildren.size())
+ throw lang::IndexOutOfBoundsException("invalid child index", static_cast<uno::XWeak*>(this));
+
+ return maChildren[nIndex];
+}
+
+Reference<XAccessible> SAL_CALL
+ PresenterAccessible::AccessibleObject::getAccessibleParent()
+{
+ ThrowIfDisposed();
+
+ return mxParentAccessible;
+}
+
+sal_Int32 SAL_CALL
+ PresenterAccessible::AccessibleObject::getAccessibleIndexInParent()
+{
+ ThrowIfDisposed();
+
+ const Reference<XAccessible> xThis (this);
+ if (mxParentAccessible.is())
+ {
+ const Reference<XAccessibleContext> xContext (mxParentAccessible->getAccessibleContext());
+ for (sal_Int32 nIndex=0,nCount=xContext->getAccessibleChildCount();
+ nIndex<nCount;
+ ++nIndex)
+ {
+ if (xContext->getAccessibleChild(nIndex) == xThis)
+ return nIndex;
+ }
+ }
+
+ return 0;
+}
+
+sal_Int16 SAL_CALL
+ PresenterAccessible::AccessibleObject::getAccessibleRole()
+{
+ ThrowIfDisposed();
+
+ return mnRole;
+}
+
+OUString SAL_CALL
+ PresenterAccessible::AccessibleObject::getAccessibleDescription()
+{
+ ThrowIfDisposed();
+
+ return msName;
+}
+
+OUString SAL_CALL
+ PresenterAccessible::AccessibleObject::getAccessibleName()
+{
+ ThrowIfDisposed();
+
+ return msName;
+}
+
+Reference<XAccessibleRelationSet> SAL_CALL
+ PresenterAccessible::AccessibleObject::getAccessibleRelationSet()
+{
+ ThrowIfDisposed();
+
+ return nullptr;
+}
+
+Reference<XAccessibleStateSet> SAL_CALL
+ PresenterAccessible::AccessibleObject::getAccessibleStateSet()
+{
+ ThrowIfDisposed();
+
+ return Reference<XAccessibleStateSet>(new AccessibleStateSet(mnStateSet));
+}
+
+lang::Locale SAL_CALL
+ PresenterAccessible::AccessibleObject::getLocale()
+{
+ ThrowIfDisposed();
+
+ if (mxParentAccessible.is())
+ {
+ Reference<XAccessibleContext> xParentContext (mxParentAccessible->getAccessibleContext());
+ if (xParentContext.is())
+ return xParentContext->getLocale();
+ }
+ return maLocale;
+}
+
+//----- XAccessibleComponent ------------------------------------------------
+
+sal_Bool SAL_CALL PresenterAccessible::AccessibleObject::containsPoint (
+ const awt::Point& rPoint)
+{
+ ThrowIfDisposed();
+
+ if (mxContentWindow.is())
+ {
+ const awt::Rectangle aBox (getBounds());
+ return rPoint.X>=aBox.X
+ && rPoint.Y>=aBox.Y
+ && rPoint.X<aBox.X+aBox.Width
+ && rPoint.Y<aBox.Y+aBox.Height;
+ }
+ else
+ return false;
+}
+
+Reference<XAccessible> SAL_CALL
+ PresenterAccessible::AccessibleObject::getAccessibleAtPoint (const awt::Point&)
+{
+ ThrowIfDisposed();
+
+ return Reference<XAccessible>();
+}
+
+awt::Rectangle SAL_CALL PresenterAccessible::AccessibleObject::getBounds()
+{
+ ThrowIfDisposed();
+
+ const awt::Point aLocation (GetRelativeLocation());
+ const awt::Size aSize (GetSize());
+
+ return awt::Rectangle (aLocation.X, aLocation.Y, aSize.Width, aSize.Height);
+}
+
+awt::Point SAL_CALL PresenterAccessible::AccessibleObject::getLocation()
+{
+ ThrowIfDisposed();
+
+ const awt::Point aLocation (GetRelativeLocation());
+
+ return aLocation;
+}
+
+awt::Point SAL_CALL PresenterAccessible::AccessibleObject::getLocationOnScreen()
+{
+ ThrowIfDisposed();
+
+ awt::Point aRelativeLocation (GetRelativeLocation());
+ awt::Point aParentLocationOnScreen (GetAbsoluteParentLocation());
+
+ return awt::Point(
+ aRelativeLocation.X + aParentLocationOnScreen.X,
+ aRelativeLocation.Y + aParentLocationOnScreen.Y);
+}
+
+awt::Size SAL_CALL PresenterAccessible::AccessibleObject::getSize()
+{
+ ThrowIfDisposed();
+
+ const awt::Size aSize (GetSize());
+
+ return aSize;
+}
+
+void SAL_CALL PresenterAccessible::AccessibleObject::grabFocus()
+{
+ ThrowIfDisposed();
+ if (mxBorderWindow.is())
+ mxBorderWindow->setFocus();
+ else if (mxContentWindow.is())
+ mxContentWindow->setFocus();
+}
+
+sal_Int32 SAL_CALL PresenterAccessible::AccessibleObject::getForeground()
+{
+ ThrowIfDisposed();
+
+ return 0x00ffffff;
+}
+
+sal_Int32 SAL_CALL PresenterAccessible::AccessibleObject::getBackground()
+{
+ ThrowIfDisposed();
+
+ return 0x00000000;
+}
+
+//----- XAccessibleEventBroadcaster -------------------------------------------
+
+void SAL_CALL PresenterAccessible::AccessibleObject::addAccessibleEventListener (
+ const Reference<XAccessibleEventListener>& rxListener)
+{
+ if (!rxListener.is())
+ return;
+
+ const osl::MutexGuard aGuard(m_aMutex);
+
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ uno::Reference<uno::XInterface> xThis (static_cast<XWeak*>(this), UNO_QUERY);
+ rxListener->disposing (lang::EventObject(xThis));
+ }
+ else
+ {
+ maListeners.push_back(rxListener);
+ }
+}
+
+void SAL_CALL PresenterAccessible::AccessibleObject::removeAccessibleEventListener (
+ const Reference<XAccessibleEventListener>& rxListener)
+{
+ ThrowIfDisposed();
+ if (rxListener.is())
+ {
+ const osl::MutexGuard aGuard(m_aMutex);
+
+ auto const it(std::remove(maListeners.begin(), maListeners.end(), rxListener));
+ if (it != maListeners.end())
+ {
+ maListeners.erase(it);
+ }
+ }
+}
+
+//----- XWindowListener ---------------------------------------------------
+
+void SAL_CALL PresenterAccessible::AccessibleObject::windowResized (
+ const css::awt::WindowEvent&)
+{
+ FireAccessibleEvent(AccessibleEventId::BOUNDRECT_CHANGED, Any(), Any());
+}
+
+void SAL_CALL PresenterAccessible::AccessibleObject::windowMoved (
+ const css::awt::WindowEvent&)
+{
+ FireAccessibleEvent(AccessibleEventId::BOUNDRECT_CHANGED, Any(), Any());
+}
+
+void SAL_CALL PresenterAccessible::AccessibleObject::windowShown (
+ const css::lang::EventObject&)
+{
+ UpdateStateSet();
+}
+
+void SAL_CALL PresenterAccessible::AccessibleObject::windowHidden (
+ const css::lang::EventObject&)
+{
+ UpdateStateSet();
+}
+
+//----- XEventListener --------------------------------------------------------
+
+void SAL_CALL PresenterAccessible::AccessibleObject::disposing (const css::lang::EventObject& rEvent)
+{
+ if (rEvent.Source == mxContentWindow)
+ {
+ mxContentWindow = nullptr;
+ mxBorderWindow = nullptr;
+ }
+ else
+ {
+ SetWindow(nullptr, nullptr);
+ }
+}
+
+//----- private ---------------------------------------------------------------
+
+bool PresenterAccessible::AccessibleObject::GetWindowState (const sal_Int16 nType) const
+{
+ switch (nType)
+ {
+ case AccessibleStateType::ENABLED:
+ return mxContentWindow.is() && mxContentWindow->isEnabled();
+
+ case AccessibleStateType::FOCUSABLE:
+ return true;
+
+ case AccessibleStateType::FOCUSED:
+ return mbIsFocused;
+
+ case AccessibleStateType::SHOWING:
+ return mxContentWindow.is() && mxContentWindow->isVisible();
+
+ default:
+ return false;
+ }
+}
+
+void PresenterAccessible::AccessibleObject::UpdateStateSet()
+{
+ UpdateState(AccessibleStateType::FOCUSABLE, true);
+ UpdateState(AccessibleStateType::VISIBLE, true);
+ UpdateState(AccessibleStateType::ENABLED, true);
+ UpdateState(AccessibleStateType::MULTI_LINE, true);
+ UpdateState(AccessibleStateType::SENSITIVE, true);
+
+ UpdateState(AccessibleStateType::ENABLED, GetWindowState(AccessibleStateType::ENABLED));
+ UpdateState(AccessibleStateType::FOCUSED, GetWindowState(AccessibleStateType::FOCUSED));
+ UpdateState(AccessibleStateType::SHOWING, GetWindowState(AccessibleStateType::SHOWING));
+ // UpdateState(AccessibleStateType::ACTIVE, GetWindowState(AccessibleStateType::ACTIVE));
+}
+
+void PresenterAccessible::AccessibleObject::UpdateState(
+ const sal_Int16 nState,
+ const bool bValue)
+{
+ const sal_uInt32 nStateMask (AccessibleStateSet::GetStateMask(nState));
+ if (((mnStateSet & nStateMask) != 0) == bValue)
+ return;
+ if (bValue)
+ {
+ mnStateSet |= nStateMask;
+ FireAccessibleEvent(AccessibleEventId::STATE_CHANGED, Any(), Any(nState));
+ }
+ else
+ {
+ mnStateSet &= ~nStateMask;
+ FireAccessibleEvent(AccessibleEventId::STATE_CHANGED, Any(nState), Any());
+ }
+}
+
+void PresenterAccessible::AccessibleObject::AddChild (
+ const ::rtl::Reference<AccessibleObject>& rpChild)
+{
+ maChildren.push_back(rpChild);
+ rpChild->SetAccessibleParent(this);
+ FireAccessibleEvent(AccessibleEventId::INVALIDATE_ALL_CHILDREN, Any(), Any());
+}
+
+void PresenterAccessible::AccessibleObject::RemoveChild (
+ const ::rtl::Reference<AccessibleObject>& rpChild)
+{
+ rpChild->SetAccessibleParent(Reference<XAccessible>());
+ maChildren.erase(::std::find(maChildren.begin(), maChildren.end(), rpChild));
+ FireAccessibleEvent(AccessibleEventId::INVALIDATE_ALL_CHILDREN, Any(), Any());
+}
+
+void PresenterAccessible::AccessibleObject::SetIsFocused (const bool bIsFocused)
+{
+ if (mbIsFocused != bIsFocused)
+ {
+ mbIsFocused = bIsFocused;
+ UpdateStateSet();
+ }
+}
+
+void PresenterAccessible::AccessibleObject::SetAccessibleName (const OUString& rsName)
+{
+ if (msName != rsName)
+ {
+ const OUString sOldName(msName);
+ msName = rsName;
+ FireAccessibleEvent(AccessibleEventId::NAME_CHANGED, Any(sOldName), Any(msName));
+ }
+}
+
+void PresenterAccessible::AccessibleObject::FireAccessibleEvent (
+ const sal_Int16 nEventId,
+ const uno::Any& rOldValue,
+ const uno::Any& rNewValue )
+{
+ AccessibleEventObject aEventObject;
+
+ aEventObject.Source = Reference<XWeak>(this);
+ aEventObject.EventId = nEventId;
+ aEventObject.NewValue = rNewValue;
+ aEventObject.OldValue = rOldValue;
+
+ ::std::vector<Reference<XAccessibleEventListener> > aListenerCopy(maListeners);
+ for (const auto& rxListener : aListenerCopy)
+ {
+ try
+ {
+ rxListener->notifyEvent(aEventObject);
+ }
+ catch (const lang::DisposedException&)
+ {
+ // Listener has been disposed and should have been removed
+ // already.
+ removeAccessibleEventListener(rxListener);
+ }
+ catch (const Exception&)
+ {
+ // Ignore all other exceptions and assume that they are
+ // caused by a temporary problem.
+ }
+ }
+}
+
+awt::Point PresenterAccessible::AccessibleObject::GetRelativeLocation()
+{
+ awt::Point aLocation;
+ if (mxContentWindow.is())
+ {
+ const awt::Rectangle aContentBox (mxContentWindow->getPosSize());
+ aLocation.X = aContentBox.X;
+ aLocation.Y = aContentBox.Y;
+ if (mxBorderWindow.is())
+ {
+ const awt::Rectangle aBorderBox (mxBorderWindow->getPosSize());
+ aLocation.X += aBorderBox.X;
+ aLocation.Y += aBorderBox.Y;
+ }
+ }
+ return aLocation;
+}
+
+awt::Size PresenterAccessible::AccessibleObject::GetSize()
+{
+ if (mxContentWindow.is())
+ {
+ const awt::Rectangle aBox (mxContentWindow->getPosSize());
+ return awt::Size(aBox.Width, aBox.Height);
+ }
+ else
+ return awt::Size();
+}
+
+awt::Point PresenterAccessible::AccessibleObject::GetAbsoluteParentLocation()
+{
+ Reference<XAccessibleComponent> xParentComponent;
+ if (mxParentAccessible.is())
+ xParentComponent.set( mxParentAccessible->getAccessibleContext(), UNO_QUERY);
+ if (xParentComponent.is())
+ return xParentComponent->getLocationOnScreen();
+ else
+ return awt::Point();
+}
+
+void PresenterAccessible::AccessibleObject::ThrowIfDisposed() const
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ throw lang::DisposedException("object has already been disposed", uno::Reference<uno::XInterface>(const_cast<uno::XWeak*>(static_cast<uno::XWeak const *>(this))));
+}
+
+//===== AccessibleStateSet ====================================================
+
+AccessibleStateSet::AccessibleStateSet (const sal_Int32 nStateSet)
+ : AccessibleStateSetInterfaceBase(m_aMutex),
+ mnStateSet (nStateSet)
+{
+}
+
+sal_uInt32 AccessibleStateSet::GetStateMask (const sal_Int16 nState)
+{
+ if (nState<0 || o3tl::make_unsigned(nState)>=sizeof(sal_uInt32)*8)
+ {
+ throw RuntimeException("AccessibleStateSet::GetStateMask: invalid state");
+ }
+
+ return 1<<nState;
+}
+
+//----- XAccessibleStateSet ---------------------------------------------------
+
+sal_Bool SAL_CALL AccessibleStateSet::isEmpty()
+{
+ return mnStateSet==0;
+}
+
+sal_Bool SAL_CALL AccessibleStateSet::contains (sal_Int16 nState)
+{
+ return (mnStateSet & GetStateMask(nState)) != 0;
+}
+
+sal_Bool SAL_CALL AccessibleStateSet::containsAll (const css::uno::Sequence<sal_Int16>& rStateSet)
+{
+ return std::none_of(rStateSet.begin(), rStateSet.end(),
+ [this](const sal_Int16 nState) { return (mnStateSet & GetStateMask(nState)) == 0; });
+}
+
+css::uno::Sequence<sal_Int16> SAL_CALL AccessibleStateSet::getStates()
+{
+ ::std::vector<sal_Int16> aStates;
+ aStates.reserve(sizeof(mnStateSet)*8);
+ for (sal_uInt16 nIndex=0; nIndex<sizeof(mnStateSet)*8; ++nIndex)
+ if ((mnStateSet & GetStateMask(nIndex)) != 0)
+ aStates.push_back(nIndex);
+ return Sequence<sal_Int16>(aStates.data(), aStates.size());
+}
+
+//===== AccessibleRelationSet =================================================
+
+AccessibleRelationSet::AccessibleRelationSet()
+ : AccessibleRelationSetInterfaceBase(m_aMutex)
+{
+}
+
+void AccessibleRelationSet::AddRelation (
+ const sal_Int16 nRelationType,
+ const Reference<XInterface>& rxObject)
+{
+ maRelations.emplace_back();
+ maRelations.back().RelationType = nRelationType;
+ maRelations.back().TargetSet = { rxObject };
+}
+
+//----- XAccessibleRelationSet ------------------------------------------------
+
+sal_Int32 SAL_CALL AccessibleRelationSet::getRelationCount()
+{
+ return maRelations.size();
+}
+
+AccessibleRelation SAL_CALL AccessibleRelationSet::getRelation (sal_Int32 nIndex)
+{
+ if (nIndex<0 && o3tl::make_unsigned(nIndex)>=maRelations.size())
+ return AccessibleRelation();
+ else
+ return maRelations[nIndex];
+}
+
+sal_Bool SAL_CALL AccessibleRelationSet::containsRelation (sal_Int16 nRelationType)
+{
+ return std::any_of(maRelations.begin(), maRelations.end(),
+ [nRelationType](const AccessibleRelation& rRelation) { return rRelation.RelationType == nRelationType; });
+}
+
+AccessibleRelation SAL_CALL AccessibleRelationSet::getRelationByType (sal_Int16 nRelationType)
+{
+ auto iRelation = std::find_if(maRelations.begin(), maRelations.end(),
+ [nRelationType](const AccessibleRelation& rRelation) { return rRelation.RelationType == nRelationType; });
+ if (iRelation != maRelations.end())
+ return *iRelation;
+ return AccessibleRelation();
+}
+
+//===== PresenterAccessible::AccessibleParagraph ==============================
+
+PresenterAccessible::AccessibleParagraph::AccessibleParagraph (
+ const lang::Locale& rLocale,
+ const OUString& rsName,
+ const SharedPresenterTextParagraph& rpParagraph,
+ const sal_Int32 nParagraphIndex)
+ : PresenterAccessibleParagraphInterfaceBase(rLocale, AccessibleRole::PARAGRAPH, rsName),
+ mpParagraph(rpParagraph),
+ mnParagraphIndex(nParagraphIndex)
+{
+}
+
+//----- XAccessibleContext ----------------------------------------------------
+
+Reference<XAccessibleRelationSet> SAL_CALL
+ PresenterAccessible::AccessibleParagraph::getAccessibleRelationSet()
+{
+ ThrowIfDisposed();
+
+ rtl::Reference<AccessibleRelationSet> pSet (new AccessibleRelationSet);
+
+ if (mxParentAccessible.is())
+ {
+ Reference<XAccessibleContext> xParentContext (mxParentAccessible->getAccessibleContext());
+ if (xParentContext.is())
+ {
+ if (mnParagraphIndex>0)
+ pSet->AddRelation(
+ AccessibleRelationType::CONTENT_FLOWS_FROM,
+ xParentContext->getAccessibleChild(mnParagraphIndex-1));
+
+ if (mnParagraphIndex<xParentContext->getAccessibleChildCount()-1)
+ pSet->AddRelation(
+ AccessibleRelationType::CONTENT_FLOWS_TO,
+ xParentContext->getAccessibleChild(mnParagraphIndex+1));
+ }
+ }
+
+ return pSet;
+}
+
+//----- XAccessibleText -------------------------------------------------------
+
+sal_Int32 SAL_CALL PresenterAccessible::AccessibleParagraph::getCaretPosition()
+{
+ ThrowIfDisposed();
+
+ sal_Int32 nPosition (-1);
+ if (mpParagraph)
+ nPosition = mpParagraph->GetCaretPosition();
+
+ return nPosition;
+}
+
+sal_Bool SAL_CALL PresenterAccessible::AccessibleParagraph::setCaretPosition (sal_Int32 nIndex)
+{
+ ThrowIfDisposed();
+
+ if (mpParagraph)
+ {
+ mpParagraph->SetCaretPosition(nIndex);
+ return true;
+ }
+ else
+ return false;
+}
+
+sal_Unicode SAL_CALL PresenterAccessible::AccessibleParagraph::getCharacter (sal_Int32 nIndex)
+{
+ ThrowIfDisposed();
+
+ if (!mpParagraph)
+ throw lang::IndexOutOfBoundsException("no text support in current mode", static_cast<uno::XWeak*>(this));
+ return mpParagraph->GetCharacter(nIndex);
+}
+
+Sequence<css::beans::PropertyValue> SAL_CALL
+ PresenterAccessible::AccessibleParagraph::getCharacterAttributes (
+ ::sal_Int32 nIndex,
+ const css::uno::Sequence<OUString>& rRequestedAttributes)
+{
+ ThrowIfDisposed();
+
+#if OSL_DEBUG_LEVEL > 0
+ SAL_INFO( "sdext.presenter", __func__ << " at " << this << ", " << nIndex << " returns empty set" );
+ for (sal_Int32 nAttributeIndex(0), nAttributeCount(rRequestedAttributes.getLength());
+ nAttributeIndex < nAttributeCount;
+ ++nAttributeIndex)
+ {
+ SAL_INFO( "sdext.presenter",
+ " requested attribute " << nAttributeIndex << " is " << rRequestedAttributes[nAttributeIndex] );
+ }
+#else
+ (void)nIndex;
+ (void)rRequestedAttributes;
+#endif
+
+ // Character properties are not supported.
+ return Sequence<css::beans::PropertyValue>();
+}
+
+awt::Rectangle SAL_CALL PresenterAccessible::AccessibleParagraph::getCharacterBounds (
+ sal_Int32 nIndex)
+{
+ ThrowIfDisposed();
+
+ awt::Rectangle aCharacterBox;
+ if (nIndex < 0)
+ {
+ throw lang::IndexOutOfBoundsException("invalid text index", static_cast<uno::XWeak*>(this));
+ }
+ else if (mpParagraph)
+ {
+ aCharacterBox = mpParagraph->GetCharacterBounds(nIndex, false);
+ // Convert coordinates relative to the window origin into absolute
+ // screen coordinates.
+ const awt::Point aWindowLocationOnScreen (getLocationOnScreen());
+ aCharacterBox.X += aWindowLocationOnScreen.X;
+ aCharacterBox.Y += aWindowLocationOnScreen.Y;
+ }
+ else
+ {
+ throw lang::IndexOutOfBoundsException("no text support in current mode", static_cast<uno::XWeak*>(this));
+ }
+
+ return aCharacterBox;
+}
+
+sal_Int32 SAL_CALL PresenterAccessible::AccessibleParagraph::getCharacterCount()
+{
+ ThrowIfDisposed();
+
+ sal_Int32 nCount (0);
+ if (mpParagraph)
+ nCount = mpParagraph->GetCharacterCount();
+
+ return nCount;
+}
+
+sal_Int32 SAL_CALL PresenterAccessible::AccessibleParagraph::getIndexAtPoint (
+ const css::awt::Point& )
+{
+ ThrowIfDisposed();
+ return -1;
+}
+
+OUString SAL_CALL PresenterAccessible::AccessibleParagraph::getSelectedText()
+{
+ ThrowIfDisposed();
+
+ return getTextRange(getSelectionStart(), getSelectionEnd());
+}
+
+sal_Int32 SAL_CALL PresenterAccessible::AccessibleParagraph::getSelectionStart()
+{
+ ThrowIfDisposed();
+
+ return getCaretPosition();
+}
+
+sal_Int32 SAL_CALL PresenterAccessible::AccessibleParagraph::getSelectionEnd()
+{
+ ThrowIfDisposed();
+
+ return getCaretPosition();
+}
+
+sal_Bool SAL_CALL PresenterAccessible::AccessibleParagraph::setSelection (
+ sal_Int32 nStartIndex,
+ sal_Int32)
+{
+ ThrowIfDisposed();
+
+ return setCaretPosition(nStartIndex);
+}
+
+OUString SAL_CALL PresenterAccessible::AccessibleParagraph::getText()
+{
+ ThrowIfDisposed();
+
+ OUString sText;
+ if (mpParagraph)
+ sText = mpParagraph->GetText();
+
+ return sText;
+}
+
+OUString SAL_CALL PresenterAccessible::AccessibleParagraph::getTextRange (
+ sal_Int32 nLocalStartIndex,
+ sal_Int32 nLocalEndIndex)
+{
+ ThrowIfDisposed();
+
+ OUString sText;
+ if (mpParagraph)
+ {
+ const TextSegment aSegment (
+ mpParagraph->CreateTextSegment(nLocalStartIndex, nLocalEndIndex));
+ sText = aSegment.SegmentText;
+ }
+
+ return sText;
+}
+
+TextSegment SAL_CALL PresenterAccessible::AccessibleParagraph::getTextAtIndex (
+ sal_Int32 nLocalCharacterIndex,
+ sal_Int16 nTextType)
+{
+ ThrowIfDisposed();
+
+ TextSegment aSegment;
+ if (mpParagraph)
+ aSegment = mpParagraph->GetTextSegment(0, nLocalCharacterIndex, nTextType);
+
+ return aSegment;
+}
+
+TextSegment SAL_CALL PresenterAccessible::AccessibleParagraph::getTextBeforeIndex (
+ sal_Int32 nLocalCharacterIndex,
+ sal_Int16 nTextType)
+{
+ ThrowIfDisposed();
+
+ TextSegment aSegment;
+ if (mpParagraph)
+ aSegment = mpParagraph->GetTextSegment(-1, nLocalCharacterIndex, nTextType);
+
+ return aSegment;
+}
+
+TextSegment SAL_CALL PresenterAccessible::AccessibleParagraph::getTextBehindIndex (
+ sal_Int32 nLocalCharacterIndex,
+ sal_Int16 nTextType)
+{
+ ThrowIfDisposed();
+
+ TextSegment aSegment;
+ if (mpParagraph)
+ aSegment = mpParagraph->GetTextSegment(+1, nLocalCharacterIndex, nTextType);
+
+ return aSegment;
+}
+
+sal_Bool SAL_CALL PresenterAccessible::AccessibleParagraph::copyText (
+ sal_Int32,
+ sal_Int32)
+{
+ ThrowIfDisposed();
+
+ // Return false because copying to clipboard is not supported.
+ // It IS supported in the notes view. There is no need to duplicate
+ // this here.
+ return false;
+}
+
+sal_Bool SAL_CALL PresenterAccessible::AccessibleParagraph::scrollSubstringTo(
+ sal_Int32,
+ sal_Int32,
+ AccessibleScrollType)
+{
+ return false;
+}
+
+//----- protected -------------------------------------------------------------
+
+awt::Point PresenterAccessible::AccessibleParagraph::GetRelativeLocation()
+{
+ awt::Point aLocation (AccessibleObject::GetRelativeLocation());
+ if (mpParagraph)
+ {
+ const awt::Point aParagraphLocation (mpParagraph->GetRelativeLocation());
+ aLocation.X += aParagraphLocation.X;
+ aLocation.Y += aParagraphLocation.Y;
+ }
+
+ return aLocation;
+}
+
+awt::Size PresenterAccessible::AccessibleParagraph::GetSize()
+{
+ if (mpParagraph)
+ return mpParagraph->GetSize();
+ else
+ return AccessibleObject::GetSize();
+}
+
+awt::Point PresenterAccessible::AccessibleParagraph::GetAbsoluteParentLocation()
+{
+ if (mxParentAccessible.is())
+ {
+ Reference<XAccessibleContext> xParentContext =
+ mxParentAccessible->getAccessibleContext();
+ if (xParentContext.is())
+ {
+ Reference<XAccessibleComponent> xGrandParentComponent(
+ xParentContext->getAccessibleParent(), UNO_QUERY);
+ if (xGrandParentComponent.is())
+ return xGrandParentComponent->getLocationOnScreen();
+ }
+ }
+
+ return awt::Point();
+}
+
+bool PresenterAccessible::AccessibleParagraph::GetWindowState (const sal_Int16 nType) const
+{
+ switch (nType)
+ {
+ case AccessibleStateType::EDITABLE:
+ return bool(mpParagraph);
+
+ case AccessibleStateType::ACTIVE:
+ return true;
+
+ default:
+ return AccessibleObject::GetWindowState(nType);
+ }
+}
+
+//===== AccessibleNotes =======================================================
+
+AccessibleNotes::AccessibleNotes (
+ const css::lang::Locale& rLocale,
+ const OUString& rsName)
+ : AccessibleObject(rLocale,AccessibleRole::PANEL,rsName)
+{
+}
+
+rtl::Reference<PresenterAccessible::AccessibleObject> AccessibleNotes::Create (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const lang::Locale& rLocale,
+ const Reference<awt::XWindow>& rxContentWindow,
+ const Reference<awt::XWindow>& rxBorderWindow,
+ const std::shared_ptr<PresenterTextView>& rpTextView)
+{
+ OUString sName ("Presenter Notes Text");
+ {
+ PresenterConfigurationAccess aConfiguration (
+ rxContext,
+ "/org.openoffice.Office.PresenterScreen/",
+ PresenterConfigurationAccess::READ_ONLY);
+ aConfiguration.GetConfigurationNode("Presenter/Accessibility/Notes/String")
+ >>= sName;
+ }
+
+ rtl::Reference<AccessibleNotes> pObject (
+ new AccessibleNotes(
+ rLocale,
+ sName));
+ pObject->LateInitialization();
+ pObject->SetTextView(rpTextView);
+ pObject->UpdateStateSet();
+ pObject->SetWindow(rxContentWindow, rxBorderWindow);
+
+ return pObject;
+}
+
+void AccessibleNotes::SetTextView (
+ const std::shared_ptr<PresenterTextView>& rpTextView)
+{
+ ::std::vector<rtl::Reference<PresenterAccessible::AccessibleObject> > aChildren;
+
+ // Release any listeners to the current text view.
+ if (mpTextView)
+ {
+ mpTextView->GetCaret()->SetCaretMotionBroadcaster(
+ ::std::function<void (sal_Int32,sal_Int32,sal_Int32,sal_Int32)>());
+ mpTextView->SetTextChangeBroadcaster(
+ ::std::function<void ()>());
+ }
+
+ mpTextView = rpTextView;
+
+ if (!mpTextView)
+ return;
+
+ // Create a new set of children, one for each paragraph.
+ const sal_Int32 nParagraphCount (mpTextView->GetParagraphCount());
+ for (sal_Int32 nIndex=0; nIndex<nParagraphCount; ++nIndex)
+ {
+ rtl::Reference<PresenterAccessible::AccessibleParagraph> pParagraph (
+ new PresenterAccessible::AccessibleParagraph(
+ css::lang::Locale(),
+ "Paragraph"+OUString::number(nIndex),
+ rpTextView->GetParagraph(nIndex),
+ nIndex));
+ pParagraph->LateInitialization();
+ pParagraph->SetWindow(mxContentWindow, mxBorderWindow);
+ pParagraph->SetAccessibleParent(this);
+ aChildren.emplace_back(pParagraph.get());
+ }
+ maChildren.swap(aChildren);
+ FireAccessibleEvent(AccessibleEventId::INVALIDATE_ALL_CHILDREN, Any(), Any());
+
+ // Dispose the old children. (This will remove them from the focus
+ // manager).
+ for (const auto& rxChild : aChildren)
+ {
+ Reference<lang::XComponent> xComponent = rxChild;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ // This class acts as a controller of who broadcasts caret motion
+ // events and handles text changes. Register the corresponding
+ // listeners here.
+ mpTextView->GetCaret()->SetCaretMotionBroadcaster(
+ [this](sal_Int32 a, sal_Int32 b, sal_Int32 c, sal_Int32 d)
+ { return this->NotifyCaretChange(a, b, c, d); });
+ mpTextView->SetTextChangeBroadcaster(
+ [this]() { return SetTextView(mpTextView); });
+}
+
+void AccessibleNotes::SetWindow (
+ const css::uno::Reference<css::awt::XWindow>& rxContentWindow,
+ const css::uno::Reference<css::awt::XWindow>& rxBorderWindow)
+{
+ AccessibleObject::SetWindow(rxContentWindow, rxBorderWindow);
+
+ // Set the windows at the children as well, so that every paragraph can
+ // setup its geometry.
+ for (auto& rxChild : maChildren)
+ {
+ rxChild->SetWindow(rxContentWindow, rxBorderWindow);
+ }
+}
+
+void AccessibleNotes::NotifyCaretChange (
+ const sal_Int32 nOldParagraphIndex,
+ const sal_Int32 nOldCharacterIndex,
+ const sal_Int32 nNewParagraphIndex,
+ const sal_Int32 nNewCharacterIndex)
+{
+ AccessibleFocusManager::Instance()->FocusObject(
+ nNewParagraphIndex >= 0
+ ? maChildren[nNewParagraphIndex]
+ : this);
+
+ if (nOldParagraphIndex != nNewParagraphIndex)
+ {
+ // Moved caret from one paragraph to another (or showed or
+ // hid the caret). Move focus from one accessible
+ // paragraph to another.
+ if (nOldParagraphIndex >= 0)
+ {
+ maChildren[nOldParagraphIndex]->FireAccessibleEvent(
+ AccessibleEventId::CARET_CHANGED,
+ Any(nOldCharacterIndex),
+ Any(sal_Int32(-1)));
+ }
+ if (nNewParagraphIndex >= 0)
+ {
+ maChildren[nNewParagraphIndex]->FireAccessibleEvent(
+ AccessibleEventId::CARET_CHANGED,
+ Any(sal_Int32(-1)),
+ Any(nNewCharacterIndex));
+ }
+ }
+ else if (nNewParagraphIndex >= 0)
+ {
+ // Caret moved inside one paragraph.
+ maChildren[nNewParagraphIndex]->FireAccessibleEvent(
+ AccessibleEventId::CARET_CHANGED,
+ Any(nOldCharacterIndex),
+ Any(nNewCharacterIndex));
+ }
+}
+
+
+//===== AccessibleFocusManager ================================================
+
+std::shared_ptr<AccessibleFocusManager> AccessibleFocusManager::mpInstance;
+
+std::shared_ptr<AccessibleFocusManager> const & AccessibleFocusManager::Instance()
+{
+ if ( ! mpInstance)
+ {
+ mpInstance.reset(new AccessibleFocusManager());
+ }
+ return mpInstance;
+}
+
+AccessibleFocusManager::AccessibleFocusManager()
+{
+}
+
+AccessibleFocusManager::~AccessibleFocusManager()
+{
+ // copy member to stack, then drop it - otherwise will get use-after-free
+ // from AccessibleObject::disposing(), it will call ~Reference *twice*
+ auto const temp(std::move(maFocusableObjects));
+ (void) temp;
+ m_isInDtor = true;
+}
+
+void AccessibleFocusManager::AddFocusableObject (
+ const ::rtl::Reference<PresenterAccessible::AccessibleObject>& rpObject)
+{
+ OSL_ASSERT(rpObject.is());
+ OSL_ASSERT(::std::find(maFocusableObjects.begin(),maFocusableObjects.end(), rpObject)==maFocusableObjects.end());
+
+ maFocusableObjects.push_back(rpObject);
+}
+
+void AccessibleFocusManager::RemoveFocusableObject (
+ const ::rtl::Reference<PresenterAccessible::AccessibleObject>& rpObject)
+{
+ ::std::vector<rtl::Reference<PresenterAccessible::AccessibleObject> >::iterator iObject (
+ ::std::find(maFocusableObjects.begin(),maFocusableObjects.end(), rpObject));
+
+ if (iObject != maFocusableObjects.end())
+ maFocusableObjects.erase(iObject);
+ else
+ {
+ OSL_ASSERT(m_isInDtor); // in dtor, was removed already
+ }
+}
+
+void AccessibleFocusManager::FocusObject (
+ const ::rtl::Reference<PresenterAccessible::AccessibleObject>& rpObject)
+{
+ // Remove the focus of any of the other focusable objects.
+ for (auto& rxObject : maFocusableObjects)
+ {
+ if (rxObject!=rpObject)
+ rxObject->SetIsFocused(false);
+ }
+
+ if (rpObject.is())
+ rpObject->SetIsFocused(true);
+}
+
+} // end of namespace ::sd::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterAccessibility.hxx b/sdext/source/presenter/PresenterAccessibility.hxx
new file mode 100644
index 000000000..9789db525
--- /dev/null
+++ b/sdext/source/presenter/PresenterAccessibility.hxx
@@ -0,0 +1,115 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERACCESSIBILITY_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERACCESSIBILITY_HXX
+
+#include "PresenterPaneContainer.hxx"
+
+#include <com/sun/star/accessibility/XAccessible.hpp>
+#include <com/sun/star/awt/XFocusListener.hpp>
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/drawing/framework/XPane2.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+#include <rtl/ref.hxx>
+#include <memory>
+
+
+namespace sdext::presenter {
+
+class PresenterController;
+class PresenterTextView;
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::accessibility::XAccessible,
+ css::lang::XInitialization,
+ css::awt::XFocusListener
+> PresenterAccessibleInterfaceBase;
+
+class PresenterAccessible
+ : public ::cppu::BaseMutex,
+ public PresenterAccessibleInterfaceBase
+{
+public:
+ PresenterAccessible (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController,
+ const css::uno::Reference<css::drawing::framework::XPane>& rxMainPane);
+ virtual ~PresenterAccessible() override;
+
+ void UpdateAccessibilityHierarchy();
+
+ void NotifyCurrentSlideChange ();
+
+ virtual void SAL_CALL disposing() override;
+
+ //----- XAccessible -------------------------------------------------------
+
+ virtual css::uno::Reference<css::accessibility::XAccessibleContext> SAL_CALL
+ getAccessibleContext() override;
+
+ //----- XFocusListener ----------------------------------------------------
+
+ virtual void SAL_CALL focusGained (const css::awt::FocusEvent& rEvent) override;
+
+ virtual void SAL_CALL focusLost (const css::awt::FocusEvent& rEvent) override;
+
+ //----- XEventListener ----------------------------------------------------
+
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+
+ //----- XInitialization ---------------------------------------------------
+
+ virtual void SAL_CALL initialize (const css::uno::Sequence<css::uno::Any>& rArguments) override;
+
+ class AccessibleObject;
+ class AccessibleParagraph;
+
+private:
+ const css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ css::uno::Reference<css::drawing::framework::XPane2> mxMainPane;
+ css::uno::Reference<css::awt::XWindow> mxMainWindow;
+ css::uno::Reference<css::awt::XWindow> mxPreviewContentWindow;
+ css::uno::Reference<css::awt::XWindow> mxPreviewBorderWindow;
+ css::uno::Reference<css::awt::XWindow> mxNotesContentWindow;
+ css::uno::Reference<css::awt::XWindow> mxNotesBorderWindow;
+ ::rtl::Reference<AccessibleObject> mpAccessibleConsole;
+ ::rtl::Reference<AccessibleObject> mpAccessiblePreview;
+ ::rtl::Reference<AccessibleObject> mpAccessibleNotes;
+ css::uno::Reference<css::accessibility::XAccessible> mxAccessibleParent;
+
+ void UpdateAccessibilityHierarchy (
+ const css::uno::Reference<css::awt::XWindow>& rxPreviewContentWindow,
+ const css::uno::Reference<css::awt::XWindow>& rxPreviewBorderWindow,
+ const OUString& rsTitle,
+ const css::uno::Reference<css::awt::XWindow>& rxNotesContentWindow,
+ const css::uno::Reference<css::awt::XWindow>& rxNotesBorderWindow,
+ const std::shared_ptr<PresenterTextView>& rpNotesTextView);
+ PresenterPaneContainer::SharedPaneDescriptor GetPreviewPane() const;
+};
+
+} // end of namespace ::sd::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterBitmapContainer.cxx b/sdext/source/presenter/PresenterBitmapContainer.cxx
new file mode 100644
index 000000000..17609da85
--- /dev/null
+++ b/sdext/source/presenter/PresenterBitmapContainer.cxx
@@ -0,0 +1,399 @@
+/* -*- 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 "PresenterBitmapContainer.hxx"
+#include "PresenterConfigurationAccess.hxx"
+
+#include <com/sun/star/drawing/XPresenterHelper.hpp>
+#include <com/sun/star/lang/XMultiComponentFactory.hpp>
+#include <osl/diagnose.h>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::std;
+
+namespace sdext::presenter {
+
+//===== PresenterBitmapContainer ==============================================
+
+PresenterBitmapContainer::PresenterBitmapContainer (
+ const OUString& rsConfigurationBase,
+ const std::shared_ptr<PresenterBitmapContainer>& rpParentContainer,
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper)
+ : mpParentContainer(rpParentContainer),
+ mxCanvas(rxCanvas),
+ mxPresenterHelper(rxPresenterHelper)
+{
+ Initialize(rxComponentContext);
+
+ // Get access to the configuration.
+ PresenterConfigurationAccess aConfiguration (
+ rxComponentContext,
+ "org.openoffice.Office.PresenterScreen",
+ PresenterConfigurationAccess::READ_ONLY);
+ Reference<container::XNameAccess> xBitmapList (
+ aConfiguration.GetConfigurationNode(rsConfigurationBase),
+ UNO_QUERY_THROW);
+
+ LoadBitmaps(xBitmapList);
+}
+
+PresenterBitmapContainer::PresenterBitmapContainer (
+ const css::uno::Reference<css::container::XNameAccess>& rxRootNode,
+ const std::shared_ptr<PresenterBitmapContainer>& rpParentContainer,
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper)
+ : mpParentContainer(rpParentContainer),
+ mxCanvas(rxCanvas),
+ mxPresenterHelper(rxPresenterHelper)
+{
+ Initialize(rxComponentContext);
+
+ LoadBitmaps(rxRootNode);
+}
+
+void PresenterBitmapContainer::Initialize (
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext)
+{
+ if ( mxPresenterHelper.is())
+ return;
+
+ // Create an object that is able to load the bitmaps in a format that is
+ // supported by the canvas.
+ Reference<lang::XMultiComponentFactory> xFactory =
+ rxComponentContext->getServiceManager();
+ if ( ! xFactory.is())
+ return;
+ mxPresenterHelper.set(
+ xFactory->createInstanceWithContext(
+ "com.sun.star.drawing.PresenterHelper",
+ rxComponentContext),
+ UNO_QUERY_THROW);
+}
+
+PresenterBitmapContainer::~PresenterBitmapContainer()
+{
+ maIconContainer.clear();
+}
+
+std::shared_ptr<PresenterBitmapContainer::BitmapDescriptor> PresenterBitmapContainer::GetBitmap (
+ const OUString& rsName) const
+{
+ BitmapContainer::const_iterator iSet (maIconContainer.find(rsName));
+ if (iSet != maIconContainer.end())
+ return iSet->second;
+ else if (mpParentContainer != nullptr)
+ return mpParentContainer->GetBitmap(rsName);
+ else
+ return SharedBitmapDescriptor();
+}
+
+void PresenterBitmapContainer::LoadBitmaps (
+ const css::uno::Reference<css::container::XNameAccess>& rxBitmapList)
+{
+ if ( ! mxCanvas.is())
+ return;
+
+ if ( ! rxBitmapList.is())
+ return;
+
+ try
+ {
+ // Load all button bitmaps.
+ if (rxBitmapList.is())
+ {
+ PresenterConfigurationAccess::ForAll(
+ rxBitmapList,
+ [this](OUString const& rKey, Reference<beans::XPropertySet> const& xProps)
+ {
+ this->ProcessBitmap(rKey, xProps);
+ });
+ }
+ }
+ catch (Exception&)
+ {
+ OSL_ASSERT(false);
+ }
+}
+
+std::shared_ptr<PresenterBitmapContainer::BitmapDescriptor> PresenterBitmapContainer::LoadBitmap (
+ const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode,
+ const OUString& rsPath,
+ const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const std::shared_ptr<BitmapDescriptor>& rpDefault)
+{
+ SharedBitmapDescriptor pBitmap;
+
+ if (rxNode.is())
+ {
+ try
+ {
+ Reference<beans::XPropertySet> xBitmapProperties (
+ PresenterConfigurationAccess::GetConfigurationNode(rxNode, rsPath),
+ UNO_QUERY);
+ if (xBitmapProperties.is())
+ pBitmap = LoadBitmap(
+ xBitmapProperties,
+ rxPresenterHelper,
+ rxCanvas,
+ rpDefault);
+ }
+ catch (Exception&)
+ {
+ OSL_ASSERT(false);
+ }
+ }
+
+ return pBitmap;
+}
+
+void PresenterBitmapContainer::ProcessBitmap (
+ const OUString& rsKey,
+ const Reference<beans::XPropertySet>& rxProperties)
+{
+ OUString sName;
+ if ( ! (PresenterConfigurationAccess::GetProperty(rxProperties, "Name") >>= sName))
+ sName = rsKey;
+
+ maIconContainer[sName] = LoadBitmap(
+ rxProperties,
+ mxPresenterHelper,
+ mxCanvas,
+ SharedBitmapDescriptor());
+}
+
+std::shared_ptr<PresenterBitmapContainer::BitmapDescriptor> PresenterBitmapContainer::LoadBitmap (
+ const Reference<beans::XPropertySet>& rxProperties,
+ const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const std::shared_ptr<BitmapDescriptor>& rpDefault)
+{
+ OSL_ASSERT(rxCanvas.is());
+ OSL_ASSERT(rxPresenterHelper.is());
+
+ SharedBitmapDescriptor pBitmap = std::make_shared<BitmapDescriptor>(rpDefault);
+
+ if ( ! rxProperties.is())
+ return pBitmap;
+
+ OUString sFileName;
+
+ // Load bitmaps.
+ if (PresenterConfigurationAccess::GetProperty(rxProperties, "NormalFileName") >>= sFileName)
+ try
+ {
+ pBitmap->SetBitmap(
+ BitmapDescriptor::Normal,
+ rxPresenterHelper->loadBitmap(sFileName, rxCanvas));
+ }
+ catch (Exception&)
+ {}
+ if (PresenterConfigurationAccess::GetProperty(rxProperties, "MouseOverFileName") >>= sFileName)
+ try
+ {
+ pBitmap->SetBitmap(
+ BitmapDescriptor::MouseOver,
+ rxPresenterHelper->loadBitmap(sFileName, rxCanvas));
+ }
+ catch (Exception&)
+ {}
+ if (PresenterConfigurationAccess::GetProperty(rxProperties, "ButtonDownFileName") >>= sFileName)
+ try
+ {
+ pBitmap->SetBitmap(
+ BitmapDescriptor::ButtonDown,
+ rxPresenterHelper->loadBitmap(sFileName, rxCanvas));
+ }
+ catch (Exception&)
+ {}
+ if (PresenterConfigurationAccess::GetProperty(rxProperties, "DisabledFileName") >>= sFileName)
+ try
+ {
+ pBitmap->SetBitmap(
+ BitmapDescriptor::Disabled,
+ rxPresenterHelper->loadBitmap(sFileName, rxCanvas));
+ }
+ catch (Exception&)
+ {}
+ if (PresenterConfigurationAccess::GetProperty(rxProperties, "MaskFileName") >>= sFileName)
+ try
+ {
+ pBitmap->SetBitmap(
+ BitmapDescriptor::Mask,
+ rxPresenterHelper->loadBitmap(sFileName, rxCanvas));
+ }
+ catch (Exception&)
+ {}
+
+ PresenterConfigurationAccess::GetProperty(rxProperties, "XOffset") >>= pBitmap->mnXOffset;
+ PresenterConfigurationAccess::GetProperty(rxProperties, "YOffset") >>= pBitmap->mnYOffset;
+
+ PresenterConfigurationAccess::GetProperty(rxProperties, "XHotSpot") >>= pBitmap->mnXHotSpot;
+ PresenterConfigurationAccess::GetProperty(rxProperties, "YHotSpot") >>= pBitmap->mnYHotSpot;
+
+ PresenterConfigurationAccess::GetProperty(rxProperties, "ReplacementColor") >>= pBitmap->maReplacementColor;
+
+ OUString sTexturingMode;
+ if (PresenterConfigurationAccess::GetProperty(rxProperties, "HorizontalTexturingMode") >>= sTexturingMode)
+ pBitmap->meHorizontalTexturingMode = StringToTexturingMode(sTexturingMode);
+ if (PresenterConfigurationAccess::GetProperty(rxProperties, "VerticalTexturingMode") >>= sTexturingMode)
+ pBitmap->meVerticalTexturingMode = StringToTexturingMode(sTexturingMode);
+
+ return pBitmap;
+}
+
+PresenterBitmapContainer::BitmapDescriptor::TexturingMode
+ PresenterBitmapContainer::StringToTexturingMode (std::u16string_view rsTexturingMode)
+{
+ if (rsTexturingMode == u"Once")
+ return PresenterBitmapContainer::BitmapDescriptor::Once;
+ else if (rsTexturingMode == u"Repeat")
+ return PresenterBitmapContainer::BitmapDescriptor::Repeat;
+ else if (rsTexturingMode == u"Stretch")
+ return PresenterBitmapContainer::BitmapDescriptor::Stretch;
+ else
+ return PresenterBitmapContainer::BitmapDescriptor::Once;
+}
+
+//===== PresenterBitmapContainer::BitmapSet ===================================
+
+PresenterBitmapContainer::BitmapDescriptor::BitmapDescriptor()
+ : mnWidth(0),
+ mnHeight(0),
+ mnXOffset(0),
+ mnYOffset(0),
+ mnXHotSpot(0),
+ mnYHotSpot(0),
+ maReplacementColor(0x00000000),
+ meHorizontalTexturingMode(Once),
+ meVerticalTexturingMode(Once)
+{
+}
+
+PresenterBitmapContainer::BitmapDescriptor::BitmapDescriptor (
+ const std::shared_ptr<PresenterBitmapContainer::BitmapDescriptor>& rpDefault)
+ : mnWidth(0),
+ mnHeight(0),
+ mnXOffset(0),
+ mnYOffset(0),
+ mnXHotSpot(0),
+ mnYHotSpot(0),
+ maReplacementColor(0x00000000),
+ meHorizontalTexturingMode(Once),
+ meVerticalTexturingMode(Once)
+{
+ if (rpDefault == nullptr)
+ return;
+
+ mnWidth = rpDefault->mnWidth;
+ mnHeight = rpDefault->mnHeight;
+ mnXOffset = rpDefault->mnXOffset;
+ mnYOffset = rpDefault->mnYOffset;
+ mnXHotSpot = rpDefault->mnXHotSpot;
+ mnYHotSpot = rpDefault->mnYHotSpot;
+ maReplacementColor = rpDefault->maReplacementColor;
+ meHorizontalTexturingMode = rpDefault->meHorizontalTexturingMode;
+ meVerticalTexturingMode = rpDefault->meVerticalTexturingMode;
+ mxNormalBitmap = rpDefault->mxNormalBitmap;
+ mxMouseOverBitmap = rpDefault->mxMouseOverBitmap;
+ mxButtonDownBitmap = rpDefault->mxButtonDownBitmap;
+ mxDisabledBitmap = rpDefault->mxDisabledBitmap;
+ mxMaskBitmap = rpDefault->mxMaskBitmap;
+}
+
+const css::uno::Reference<css::rendering::XBitmap>&
+ PresenterBitmapContainer::BitmapDescriptor::GetNormalBitmap() const
+{
+ return mxNormalBitmap;
+}
+
+css::uno::Reference<css::rendering::XBitmap> const &
+ PresenterBitmapContainer::BitmapDescriptor::GetBitmap(const Mode eMode) const
+{
+ switch (eMode)
+ {
+ case Normal:
+ default:
+ return mxNormalBitmap;
+
+ case MouseOver:
+ if (mxMouseOverBitmap.is())
+ return mxMouseOverBitmap;
+ else
+ return mxNormalBitmap;
+
+ case ButtonDown:
+ if (mxButtonDownBitmap.is())
+ return mxButtonDownBitmap;
+ else
+ return mxNormalBitmap;
+
+ case Disabled:
+ if (mxDisabledBitmap.is())
+ return mxDisabledBitmap;
+ else
+ return mxNormalBitmap;
+
+ case Mask:
+ return mxMaskBitmap;
+ }
+}
+
+void PresenterBitmapContainer::BitmapDescriptor::SetBitmap (
+ const Mode eMode,
+ const css::uno::Reference<css::rendering::XBitmap>& rxBitmap)
+{
+ switch (eMode)
+ {
+ case Normal:
+ default:
+ mxNormalBitmap = rxBitmap;
+ if (mxNormalBitmap.is())
+ {
+ const geometry::IntegerSize2D aSize (mxNormalBitmap->getSize());
+ mnWidth = aSize.Width;
+ mnHeight = aSize.Height;
+ }
+ break;
+
+ case MouseOver:
+ mxMouseOverBitmap = rxBitmap;
+ break;
+
+ case ButtonDown:
+ mxButtonDownBitmap = rxBitmap;
+ break;
+
+ case Disabled:
+ mxDisabledBitmap = rxBitmap;
+ break;
+
+ case Mask:
+ mxMaskBitmap = rxBitmap;
+ break;
+ }
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterBitmapContainer.hxx b/sdext/source/presenter/PresenterBitmapContainer.hxx
new file mode 100644
index 000000000..65f385b2b
--- /dev/null
+++ b/sdext/source/presenter/PresenterBitmapContainer.hxx
@@ -0,0 +1,146 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERBITMAPCONTAINER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERBITMAPCONTAINER_HXX
+
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/drawing/XPresenterHelper.hpp>
+#include <com/sun/star/rendering/XBitmap.hpp>
+#include <com/sun/star/rendering/XCanvas.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/util/Color.hpp>
+#include <map>
+#include <memory>
+
+namespace sdext::presenter {
+
+/** Manage a set of bitmap groups as they are used for buttons: three
+ bitmaps, one for the normal state, one for a mouse over effect and one
+ to show that the button has been pressed.
+ A bitmap group is defined by some entries in the configuration.
+*/
+class PresenterBitmapContainer
+{
+public:
+ /** There is one bitmap for the normal state, one for a mouse over effect and one
+ to show that a button has been pressed.
+ */
+ class BitmapDescriptor
+ {
+ public:
+ BitmapDescriptor();
+ explicit BitmapDescriptor (const std::shared_ptr<BitmapDescriptor>& rpDefault);
+
+ enum Mode {Normal, MouseOver, ButtonDown, Disabled, Mask};
+ const css::uno::Reference<css::rendering::XBitmap>& GetNormalBitmap() const;
+ css::uno::Reference<css::rendering::XBitmap> const & GetBitmap(const Mode eMode) const;
+ void SetBitmap (
+ const Mode eMode,
+ const css::uno::Reference<css::rendering::XBitmap>& rxBitmap);
+
+ sal_Int32 mnWidth;
+ sal_Int32 mnHeight;
+ sal_Int32 mnXOffset;
+ sal_Int32 mnYOffset;
+ sal_Int32 mnXHotSpot;
+ sal_Int32 mnYHotSpot;
+ css::util::Color maReplacementColor;
+ enum TexturingMode { Once, Repeat, Stretch };
+ TexturingMode meHorizontalTexturingMode;
+ TexturingMode meVerticalTexturingMode;
+
+ private:
+ css::uno::Reference<css::rendering::XBitmap> mxNormalBitmap;
+ css::uno::Reference<css::rendering::XBitmap> mxMouseOverBitmap;
+ css::uno::Reference<css::rendering::XBitmap> mxButtonDownBitmap;
+ css::uno::Reference<css::rendering::XBitmap> mxDisabledBitmap;
+ css::uno::Reference<css::rendering::XBitmap> mxMaskBitmap;
+ };
+
+ /** Create a new bitmap container from a section of the configuration.
+ @param rxComponentContext
+ The component context is used to create new API objects.
+ @param rxCanvas
+ Bitmaps are created specifically for this canvas.
+ @param rsConfigurationBase
+ The name of a configuration node whose sub-tree defines the
+ bitmap sets.
+ */
+ PresenterBitmapContainer (
+ const OUString& rsConfigurationBase,
+ const std::shared_ptr<PresenterBitmapContainer>& rpParentContainer,
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper = nullptr);
+ PresenterBitmapContainer (
+ const css::uno::Reference<css::container::XNameAccess>& rsRootNode,
+ const std::shared_ptr<PresenterBitmapContainer>& rpParentContainer,
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper = nullptr);
+ ~PresenterBitmapContainer();
+ PresenterBitmapContainer(const PresenterBitmapContainer&) = delete;
+ PresenterBitmapContainer& operator=(const PresenterBitmapContainer&) = delete;
+
+ void Initialize (
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext);
+
+ /** Return the bitmap set that is associated with the given name.
+ */
+ std::shared_ptr<BitmapDescriptor> GetBitmap (const OUString& rsName) const;
+
+ static std::shared_ptr<BitmapDescriptor> LoadBitmap (
+ const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode,
+ const OUString& rsPathToBitmapNode,
+ const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const std::shared_ptr<BitmapDescriptor>& rpDefaultBitmap);
+
+private:
+ std::shared_ptr<PresenterBitmapContainer> mpParentContainer;
+ typedef ::std::map<OUString, std::shared_ptr<BitmapDescriptor> > BitmapContainer;
+ BitmapContainer maIconContainer;
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+ css::uno::Reference<css::drawing::XPresenterHelper> mxPresenterHelper;
+
+ void LoadBitmaps (
+ const css::uno::Reference<css::container::XNameAccess>& rsRootNode);
+ void ProcessBitmap (
+ const OUString& rsKey,
+ const css::uno::Reference<css::beans::XPropertySet>& rProperties);
+ static std::shared_ptr<BitmapDescriptor> LoadBitmap (
+ const css::uno::Reference<css::beans::XPropertySet>& rxProperties,
+ const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const std::shared_ptr<PresenterBitmapContainer::BitmapDescriptor>& rpDefault);
+ static BitmapDescriptor::TexturingMode
+ StringToTexturingMode (std::u16string_view rsTexturingMode);
+};
+
+typedef PresenterBitmapContainer::BitmapDescriptor PresenterBitmapDescriptor;
+typedef std::shared_ptr<PresenterBitmapContainer::BitmapDescriptor> SharedBitmapDescriptor;
+
+} // end of namespace ::sdext::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterButton.cxx b/sdext/source/presenter/PresenterButton.cxx
new file mode 100644
index 000000000..61de170c0
--- /dev/null
+++ b/sdext/source/presenter/PresenterButton.cxx
@@ -0,0 +1,447 @@
+/* -*- 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 "PresenterButton.hxx"
+#include "PresenterCanvasHelper.hxx"
+#include "PresenterController.hxx"
+#include "PresenterGeometryHelper.hxx"
+#include "PresenterPaintManager.hxx"
+#include "PresenterUIPainter.hxx"
+#include <com/sun/star/awt/PosSize.hpp>
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/drawing/XPresenterHelper.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <com/sun/star/rendering/TextDirection.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sdext::presenter {
+
+const double gnHorizontalBorder (15);
+const double gnVerticalBorder (5);
+
+::rtl::Reference<PresenterButton> PresenterButton::Create (
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController,
+ const std::shared_ptr<PresenterTheme>& rpTheme,
+ const css::uno::Reference<css::awt::XWindow>& rxParentWindow,
+ const css::uno::Reference<css::rendering::XCanvas>& rxParentCanvas,
+ const OUString& rsConfigurationName)
+{
+ Reference<beans::XPropertySet> xProperties (GetConfigurationProperties(
+ rxComponentContext,
+ rsConfigurationName));
+ if (xProperties.is())
+ {
+ OUString sText;
+ OUString sAction;
+ PresenterConfigurationAccess::GetProperty(xProperties, "Text") >>= sText;
+ PresenterConfigurationAccess::GetProperty(xProperties, "Action") >>= sAction;
+
+ PresenterTheme::SharedFontDescriptor pFont;
+ if (rpTheme != nullptr)
+ pFont = rpTheme->GetFont("ButtonFont");
+
+ PresenterTheme::SharedFontDescriptor pMouseOverFont;
+ if (rpTheme != nullptr)
+ pMouseOverFont = rpTheme->GetFont("ButtonMouseOverFont");
+
+ rtl::Reference<PresenterButton> pButton (
+ new PresenterButton(
+ rxComponentContext,
+ rpPresenterController,
+ rpTheme,
+ rxParentWindow,
+ pFont,
+ pMouseOverFont,
+ sText,
+ sAction));
+ pButton->SetCanvas(rxParentCanvas, rxParentWindow);
+ return pButton;
+ }
+ else
+ return nullptr;
+}
+
+PresenterButton::PresenterButton (
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController,
+ const std::shared_ptr<PresenterTheme>& rpTheme,
+ const css::uno::Reference<css::awt::XWindow>& rxParentWindow,
+ const PresenterTheme::SharedFontDescriptor& rpFont,
+ const PresenterTheme::SharedFontDescriptor& rpMouseOverFont,
+ const OUString& rsText,
+ const OUString& rsAction)
+ : PresenterButtonInterfaceBase(m_aMutex),
+ mpPresenterController(rpPresenterController),
+ mpTheme(rpTheme),
+ msText(rsText),
+ mpFont(rpFont),
+ mpMouseOverFont(rpMouseOverFont),
+ msAction(rsAction),
+ maButtonSize(-1,-1),
+ meState(PresenterBitmapDescriptor::Normal)
+{
+ try
+ {
+ Reference<lang::XMultiComponentFactory> xFactory (rxComponentContext->getServiceManager());
+ if ( ! xFactory.is())
+ throw RuntimeException();
+
+ mxPresenterHelper.set(
+ xFactory->createInstanceWithContext(
+ "com.sun.star.comp.Draw.PresenterHelper",
+ rxComponentContext),
+ UNO_QUERY_THROW);
+
+ if (mxPresenterHelper.is())
+ mxWindow = mxPresenterHelper->createWindow(rxParentWindow,
+ false,
+ false,
+ false,
+ false);
+
+ // Make the background transparent.
+ Reference<awt::XWindowPeer> xPeer (mxWindow, UNO_QUERY_THROW);
+ xPeer->setBackground(0xff000000);
+
+ mxWindow->setVisible(true);
+ mxWindow->addPaintListener(this);
+ mxWindow->addMouseListener(this);
+ }
+ catch (RuntimeException&)
+ {
+ }
+}
+
+PresenterButton::~PresenterButton()
+{
+}
+
+void SAL_CALL PresenterButton::disposing()
+{
+ if (mxCanvas.is())
+ {
+ Reference<lang::XComponent> xComponent (mxCanvas, UNO_QUERY);
+ mxCanvas = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ if (mxWindow.is())
+ {
+ mxWindow->removePaintListener(this);
+ mxWindow->removeMouseListener(this);
+ Reference<lang::XComponent> xComponent = mxWindow;
+ mxWindow = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+}
+
+void PresenterButton::SetCenter (const css::geometry::RealPoint2D& rLocation)
+{
+ if (mxCanvas.is())
+ {
+ Invalidate();
+
+ maCenter = rLocation;
+ mxWindow->setPosSize(
+ sal_Int32(0.5 + maCenter.X - maButtonSize.Width/2),
+ sal_Int32(0.5 + maCenter.Y - maButtonSize.Height/2),
+ maButtonSize.Width,
+ maButtonSize.Height,
+ awt::PosSize::POSSIZE);
+
+ Invalidate();
+ }
+ else
+ {
+ // The button can not be painted but we can at least store the new center.
+ maCenter = rLocation;
+ }
+}
+
+void PresenterButton::SetCanvas (
+ const css::uno::Reference<css::rendering::XCanvas>& rxParentCanvas,
+ const css::uno::Reference<css::awt::XWindow>& rxParentWindow)
+{
+ if (mxCanvas.is())
+ {
+ Reference<lang::XComponent> xComponent (mxCanvas, UNO_QUERY);
+ mxCanvas = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ if (!(mxPresenterHelper.is() && rxParentCanvas.is() && rxParentWindow.is()))
+ return;
+
+ mxCanvas = mxPresenterHelper->createSharedCanvas (
+ Reference<rendering::XSpriteCanvas>(rxParentCanvas, UNO_QUERY),
+ rxParentWindow,
+ rxParentCanvas,
+ rxParentWindow,
+ mxWindow);
+ if (mxCanvas.is())
+ {
+ SetupButtonBitmaps();
+ SetCenter(maCenter);
+ }
+}
+
+css::geometry::IntegerSize2D const & PresenterButton::GetSize()
+{
+ if (maButtonSize.Width < 0)
+ CalculateButtonSize();
+ return maButtonSize;
+}
+
+//----- XPaintListener --------------------------------------------------------
+
+void SAL_CALL PresenterButton::windowPaint (const css::awt::PaintEvent& rEvent)
+{
+ ThrowIfDisposed();
+ if (!(mxWindow.is() && mxCanvas.is()))
+ return;
+
+ Reference<rendering::XBitmap> xBitmap;
+ if (meState == PresenterBitmapDescriptor::MouseOver)
+ xBitmap = mxMouseOverBitmap;
+ else
+ xBitmap = mxNormalBitmap;
+ if ( ! xBitmap.is())
+ return;
+
+ rendering::ViewState aViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr);
+ rendering::RenderState aRenderState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ PresenterGeometryHelper::CreatePolygon(rEvent.UpdateRect, mxCanvas->getDevice()),
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+
+ mxCanvas->drawBitmap(xBitmap, aViewState, aRenderState);
+
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ xSpriteCanvas->updateScreen(false);
+}
+
+//----- XMouseListener --------------------------------------------------------
+
+void SAL_CALL PresenterButton::mousePressed (const css::awt::MouseEvent&)
+{
+ ThrowIfDisposed();
+ meState = PresenterBitmapDescriptor::ButtonDown;
+}
+
+void SAL_CALL PresenterButton::mouseReleased (const css::awt::MouseEvent&)
+{
+ ThrowIfDisposed();
+
+ if (meState == PresenterBitmapDescriptor::ButtonDown)
+ {
+ OSL_ASSERT(mpPresenterController);
+ mpPresenterController->DispatchUnoCommand(msAction);
+
+ meState = PresenterBitmapDescriptor::Normal;
+ Invalidate();
+ }
+}
+
+void SAL_CALL PresenterButton::mouseEntered (const css::awt::MouseEvent&)
+{
+ ThrowIfDisposed();
+ meState = PresenterBitmapDescriptor::MouseOver;
+ Invalidate();
+}
+
+void SAL_CALL PresenterButton::mouseExited (const css::awt::MouseEvent&)
+{
+ ThrowIfDisposed();
+ meState = PresenterBitmapDescriptor::Normal;
+ Invalidate();
+}
+
+//----- lang::XEventListener --------------------------------------------------
+
+void SAL_CALL PresenterButton::disposing (const css::lang::EventObject& rEvent)
+{
+ if (rEvent.Source == mxWindow)
+ mxWindow = nullptr;
+}
+
+
+css::geometry::IntegerSize2D PresenterButton::CalculateButtonSize()
+{
+ if (mpFont && !mpFont->mxFont.is() && mxCanvas.is())
+ mpFont->PrepareFont(mxCanvas);
+ if (!mpFont || !mpFont->mxFont.is())
+ return geometry::IntegerSize2D(-1,-1);
+
+ geometry::RealSize2D aTextSize (PresenterCanvasHelper::GetTextSize(mpFont->mxFont,msText));
+
+ return geometry::IntegerSize2D (
+ sal_Int32(0.5 + aTextSize.Width + 2*gnHorizontalBorder),
+ sal_Int32(0.5 + aTextSize.Height + 2*gnVerticalBorder));
+}
+
+void PresenterButton::RenderButton (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const geometry::IntegerSize2D& rSize,
+ const PresenterTheme::SharedFontDescriptor& rpFont,
+ const PresenterBitmapDescriptor::Mode eMode,
+ const SharedBitmapDescriptor& rpLeft,
+ const SharedBitmapDescriptor& rpCenter,
+ const SharedBitmapDescriptor& rpRight)
+{
+ if ( ! rxCanvas.is())
+ return;
+
+ const awt::Rectangle aBox(0,0, rSize.Width, rSize.Height);
+
+ PresenterUIPainter::PaintHorizontalBitmapComposite (
+ rxCanvas,
+ aBox,
+ aBox,
+ GetBitmap(rpLeft, eMode),
+ GetBitmap(rpCenter, eMode),
+ GetBitmap(rpRight, eMode));
+
+ if (!rpFont || ! rpFont->mxFont.is())
+ return;
+
+ const rendering::StringContext aContext (msText, 0, msText.getLength());
+ const Reference<rendering::XTextLayout> xLayout (
+ rpFont->mxFont->createTextLayout(aContext,rendering::TextDirection::WEAK_LEFT_TO_RIGHT,0));
+ const geometry::RealRectangle2D aTextBBox (xLayout->queryTextBounds());
+
+ rendering::RenderState aRenderState (geometry::AffineMatrix2D(1,0,0, 0,1,0), nullptr,
+ Sequence<double>(4), rendering::CompositeOperation::SOURCE);
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, rpFont->mnColor);
+
+ aRenderState.AffineTransform.m02 = (rSize.Width - aTextBBox.X2 + aTextBBox.X1)/2;
+ aRenderState.AffineTransform.m12 = (rSize.Height - aTextBBox.Y2 + aTextBBox.Y1)/2 - aTextBBox.Y1;
+
+ /// this is responsible of the close button
+ rxCanvas->drawTextLayout(
+ xLayout,
+ rendering::ViewState(geometry::AffineMatrix2D(1,0,0, 0,1,0), nullptr),
+ aRenderState);
+}
+
+void PresenterButton::Invalidate()
+{
+ mpPresenterController->GetPaintManager()->Invalidate(mxWindow);
+}
+
+Reference<rendering::XBitmap> PresenterButton::GetBitmap (
+ const SharedBitmapDescriptor& mpIcon,
+ const PresenterBitmapDescriptor::Mode eMode)
+{
+ if (mpIcon)
+ return mpIcon->GetBitmap(eMode);
+ else
+ {
+ OSL_ASSERT(mpIcon);
+ return nullptr;
+ }
+}
+
+void PresenterButton::SetupButtonBitmaps()
+{
+ if ( ! mxCanvas.is())
+ return;
+ if ( ! mxCanvas->getDevice().is())
+ return;
+
+ // Get the bitmaps for the button border.
+ SharedBitmapDescriptor pLeftBitmap (mpTheme->GetBitmap("ButtonFrameLeft"));
+ SharedBitmapDescriptor pCenterBitmap(mpTheme->GetBitmap("ButtonFrameCenter"));
+ SharedBitmapDescriptor pRightBitmap(mpTheme->GetBitmap("ButtonFrameRight"));
+
+ maButtonSize = CalculateButtonSize();
+
+ if (maButtonSize.Height<=0 && maButtonSize.Width<= 0)
+ return;
+
+ mxNormalBitmap = mxCanvas->getDevice()->createCompatibleAlphaBitmap(maButtonSize);
+ Reference<rendering::XCanvas> xCanvas (mxNormalBitmap, UNO_QUERY);
+ if (xCanvas.is())
+ RenderButton(
+ xCanvas,
+ maButtonSize,
+ mpFont,
+ PresenterBitmapDescriptor::Normal,
+ pLeftBitmap,
+ pCenterBitmap,
+ pRightBitmap);
+
+ mxMouseOverBitmap = mxCanvas->getDevice()->createCompatibleAlphaBitmap(maButtonSize);
+ xCanvas.set(mxMouseOverBitmap, UNO_QUERY);
+ if (mpMouseOverFont && !mpMouseOverFont->mxFont.is() && mxCanvas.is())
+ mpMouseOverFont->PrepareFont(mxCanvas);
+ if (xCanvas.is())
+ RenderButton(
+ xCanvas,
+ maButtonSize,
+ mpMouseOverFont,
+ PresenterBitmapDescriptor::MouseOver,
+ pLeftBitmap,
+ pCenterBitmap,
+ pRightBitmap);
+}
+
+Reference<beans::XPropertySet> PresenterButton::GetConfigurationProperties (
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const OUString& rsConfigurationName)
+{
+ PresenterConfigurationAccess aConfiguration (
+ rxComponentContext,
+ PresenterConfigurationAccess::msPresenterScreenRootName,
+ PresenterConfigurationAccess::READ_ONLY);
+ return Reference<beans::XPropertySet>(
+ PresenterConfigurationAccess::Find (
+ Reference<container::XNameAccess>(
+ aConfiguration.GetConfigurationNode("PresenterScreenSettings/Buttons"),
+ UNO_QUERY),
+ [&rsConfigurationName](OUString const&, uno::Reference<beans::XPropertySet> const& xProps) -> bool
+ {
+ return PresenterConfigurationAccess::IsStringPropertyEqual(
+ rsConfigurationName, "Name", xProps);
+ }),
+ UNO_QUERY);
+}
+
+void PresenterButton::ThrowIfDisposed() const
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterButton object has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+} // end of namespace sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterButton.hxx b/sdext/source/presenter/PresenterButton.hxx
new file mode 100644
index 000000000..f722e7da1
--- /dev/null
+++ b/sdext/source/presenter/PresenterButton.hxx
@@ -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/.
+ *
+ * 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_SDEXT_SOURCE_PRESENTER_PRESENTERBUTTON_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERBUTTON_HXX
+
+#include "PresenterBitmapContainer.hxx"
+#include "PresenterTheme.hxx"
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/awt/XPaintListener.hpp>
+#include <com/sun/star/awt/XMouseListener.hpp>
+#include <com/sun/star/rendering/XCanvas.hpp>
+#include <com/sun/star/rendering/XBitmap.hpp>
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <rtl/ref.hxx>
+
+namespace sdext::presenter {
+
+class PresenterController;
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::awt::XPaintListener,
+ css::awt::XMouseListener
+> PresenterButtonInterfaceBase;
+
+/** Button for the presenter screen. It displays a text surrounded by a
+ frame.
+*/
+class PresenterButton
+ : private ::cppu::BaseMutex,
+ public PresenterButtonInterfaceBase
+{
+public:
+ static ::rtl::Reference<PresenterButton> Create (
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController,
+ const std::shared_ptr<PresenterTheme>& rpTheme,
+ const css::uno::Reference<css::awt::XWindow>& rxParentWindow,
+ const css::uno::Reference<css::rendering::XCanvas>& rxParentCanvas,
+ const OUString& rsConfigurationName);
+ virtual ~PresenterButton() override;
+ PresenterButton(const PresenterButton&) = delete;
+ PresenterButton& operator=(const PresenterButton&) = delete;
+
+ virtual void SAL_CALL disposing() override;
+
+ void SetCenter (const css::geometry::RealPoint2D& rLocation);
+ void SetCanvas (
+ const css::uno::Reference<css::rendering::XCanvas>& rxParentCanvas,
+ const css::uno::Reference<css::awt::XWindow>& rxParentWindow);
+ css::geometry::IntegerSize2D const & GetSize();
+
+ // XPaintListener
+
+ virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override;
+
+ // XMouseListener
+
+ virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) override;
+
+ // lang::XEventListener
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+
+private:
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ std::shared_ptr<PresenterTheme> mpTheme;
+ css::uno::Reference<css::awt::XWindow> mxWindow;
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+ css::uno::Reference<css::drawing::XPresenterHelper> mxPresenterHelper;
+ const OUString msText;
+ const PresenterTheme::SharedFontDescriptor mpFont;
+ const PresenterTheme::SharedFontDescriptor mpMouseOverFont;
+ const OUString msAction;
+ css::geometry::RealPoint2D maCenter;
+ css::geometry::IntegerSize2D maButtonSize;
+ PresenterBitmapDescriptor::Mode meState;
+ css::uno::Reference<css::rendering::XBitmap> mxNormalBitmap;
+ css::uno::Reference<css::rendering::XBitmap> mxMouseOverBitmap;
+
+ PresenterButton (
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController,
+ const std::shared_ptr<PresenterTheme>& rpTheme,
+ const css::uno::Reference<css::awt::XWindow>& rxParentWindow,
+ const PresenterTheme::SharedFontDescriptor& rFont,
+ const PresenterTheme::SharedFontDescriptor& rMouseOverFont,
+ const OUString& rxText,
+ const OUString& rxAction);
+ void RenderButton (
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::geometry::IntegerSize2D& rSize,
+ const PresenterTheme::SharedFontDescriptor& rFont,
+ const PresenterBitmapDescriptor::Mode eMode,
+ const SharedBitmapDescriptor& rpLeft,
+ const SharedBitmapDescriptor& rpCenter,
+ const SharedBitmapDescriptor& rpRight);
+ css::geometry::IntegerSize2D CalculateButtonSize();
+ void Invalidate();
+ static css::uno::Reference<css::rendering::XBitmap> GetBitmap (
+ const SharedBitmapDescriptor& mpIcon,
+ const PresenterBitmapDescriptor::Mode eMode);
+ void SetupButtonBitmaps();
+ static css::uno::Reference<css::beans::XPropertySet> GetConfigurationProperties (
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const OUString& rsConfigurationName);
+
+ /// @throws css::lang::DisposedException
+ void ThrowIfDisposed() const;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterCanvasHelper.cxx b/sdext/source/presenter/PresenterCanvasHelper.cxx
new file mode 100644
index 000000000..4ff103958
--- /dev/null
+++ b/sdext/source/presenter/PresenterCanvasHelper.cxx
@@ -0,0 +1,289 @@
+/* -*- 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 "PresenterCanvasHelper.hxx"
+
+#include "PresenterGeometryHelper.hxx"
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <osl/diagnose.h>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sdext::presenter {
+
+PresenterCanvasHelper::PresenterCanvasHelper()
+ : maDefaultViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr),
+ maDefaultRenderState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE)
+{
+}
+
+PresenterCanvasHelper::~PresenterCanvasHelper()
+{
+}
+
+void PresenterCanvasHelper::Paint (
+ const SharedBitmapDescriptor& rpBitmap,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox,
+ const css::awt::Rectangle& rOuterBoundingBox,
+ const css::awt::Rectangle& rContentBoundingBox) const
+{
+ PaintRectangle(rpBitmap,rxCanvas,rRepaintBox,rOuterBoundingBox,rContentBoundingBox,
+ maDefaultViewState, maDefaultRenderState);
+}
+
+void PresenterCanvasHelper::PaintRectangle (
+ const SharedBitmapDescriptor& rpBitmap,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox,
+ const css::awt::Rectangle& rOuterBoundingBox,
+ const css::awt::Rectangle& rContentBoundingBox,
+ const css::rendering::ViewState& rDefaultViewState,
+ const css::rendering::RenderState& rDefaultRenderState)
+{
+ if (!rpBitmap)
+ return;
+
+ if ( ! rxCanvas.is() || ! rxCanvas->getDevice().is())
+ return;
+
+ // Create a clip polypolygon that has the content box as hole.
+ ::std::vector<awt::Rectangle> aRectangles;
+ aRectangles.reserve(2);
+ aRectangles.push_back(
+ PresenterGeometryHelper::Intersection(rRepaintBox, rOuterBoundingBox));
+ if (rContentBoundingBox.Width > 0 && rContentBoundingBox.Height > 0)
+ aRectangles.push_back(
+ PresenterGeometryHelper::Intersection(rRepaintBox, rContentBoundingBox));
+ Reference<rendering::XPolyPolygon2D> xPolyPolygon (
+ PresenterGeometryHelper::CreatePolygon(
+ aRectangles,
+ rxCanvas->getDevice()));
+ if ( ! xPolyPolygon.is())
+ return;
+ xPolyPolygon->setFillRule(rendering::FillRule_EVEN_ODD);
+
+ if (rpBitmap->GetNormalBitmap().is())
+ {
+ if (rpBitmap->meHorizontalTexturingMode == PresenterBitmapDescriptor::Repeat
+ || rpBitmap->meVerticalTexturingMode == PresenterBitmapDescriptor::Repeat)
+ {
+ PaintTiledBitmap(
+ rpBitmap->GetNormalBitmap(),
+ rxCanvas,
+ rRepaintBox,
+ xPolyPolygon,
+ rContentBoundingBox,
+ rDefaultViewState,
+ rDefaultRenderState);
+ }
+ else
+ {
+ PaintBitmap(
+ rpBitmap->GetNormalBitmap(),
+ awt::Point(rOuterBoundingBox.X, rOuterBoundingBox.Y),
+ rxCanvas,
+ rRepaintBox,
+ xPolyPolygon,
+ rDefaultViewState,
+ rDefaultRenderState);
+ }
+ }
+ else
+ {
+ PaintColor(
+ rpBitmap->maReplacementColor,
+ rxCanvas,
+ rRepaintBox,
+ xPolyPolygon,
+ rDefaultViewState,
+ rDefaultRenderState);
+ }
+}
+
+void PresenterCanvasHelper::PaintTiledBitmap (
+ const css::uno::Reference<css::rendering::XBitmap>& rxTexture,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox,
+ const css::uno::Reference<css::rendering::XPolyPolygon2D>& rxPolygon,
+ const css::awt::Rectangle& rHole,
+ const css::rendering::ViewState& rDefaultViewState,
+ const css::rendering::RenderState& rDefaultRenderState)
+{
+ if ( ! rxCanvas.is() || ! rxCanvas->getDevice().is())
+ return;
+
+ if ( ! rxTexture.is())
+ return;
+
+ if ( ! rxPolygon.is())
+ return;
+
+ rendering::ViewState aViewState (rDefaultViewState);
+ aViewState.Clip = rxPolygon;
+
+ // Create a local render state at which the location of the bitmap is
+ // set.
+ rendering::RenderState aRenderState (rDefaultRenderState);
+
+ // Tile the bitmap over the repaint box.
+ const geometry::IntegerSize2D aBitmapSize (rxTexture->getSize());
+ if( aBitmapSize.Width < 1 || aBitmapSize.Height < 1)
+ return;
+
+ const sal_Int32 nLeft = (rRepaintBox.X / aBitmapSize.Width) * aBitmapSize.Width;
+ const sal_Int32 nTop = (rRepaintBox.Y / aBitmapSize.Height) * aBitmapSize.Height;
+ const sal_Int32 nRight = ((rRepaintBox.X + rRepaintBox.Width - 1 + aBitmapSize.Width - 1)
+ / aBitmapSize.Width) * aBitmapSize.Width;
+ const sal_Int32 nBottom = ((rRepaintBox.Y + rRepaintBox.Height - 1 + aBitmapSize.Height - 1)
+ / aBitmapSize.Height) * aBitmapSize.Height;
+
+ for (sal_Int32 nY=nTop; nY<=nBottom; nY+=aBitmapSize.Height)
+ for (sal_Int32 nX=nLeft; nX<=nRight; nX+=aBitmapSize.Width)
+ {
+ if (PresenterGeometryHelper::IsInside(
+ awt::Rectangle(nX,nY,aBitmapSize.Width,aBitmapSize.Height),
+ rHole))
+ {
+ continue;
+ }
+ aRenderState.AffineTransform.m02 = nX;
+ aRenderState.AffineTransform.m12 = nY;
+ rxCanvas->drawBitmap(
+ rxTexture,
+ aViewState,
+ aRenderState);
+ }
+}
+
+void PresenterCanvasHelper::PaintBitmap (
+ const css::uno::Reference<css::rendering::XBitmap>& rxBitmap,
+ const awt::Point& rLocation,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox,
+ const css::uno::Reference<css::rendering::XPolyPolygon2D>& rxPolygon,
+ const css::rendering::ViewState& rDefaultViewState,
+ const css::rendering::RenderState& rDefaultRenderState)
+{
+ if ( ! rxCanvas.is() || ! rxCanvas->getDevice().is())
+ return;
+
+ if ( ! rxBitmap.is())
+ return;
+
+ if ( ! rxPolygon.is())
+ return;
+
+ // Set the repaint box as clip rectangle at the view state.
+ rendering::ViewState aViewState (rDefaultViewState);
+ aViewState.Clip = PresenterGeometryHelper::CreatePolygon(rRepaintBox, rxCanvas->getDevice());
+
+ // Setup the rendering state so that the bitmap is painted top left in
+ // the polygon bounding box.
+ rendering::RenderState aRenderState (rDefaultRenderState);
+ aRenderState.AffineTransform = geometry::AffineMatrix2D(1,0, rLocation.X, 0,1,rLocation.Y);
+ aRenderState.Clip = rxPolygon;
+
+ rxCanvas->drawBitmap(
+ rxBitmap,
+ aViewState,
+ aRenderState);
+}
+
+void PresenterCanvasHelper::PaintColor (
+ const css::util::Color nColor,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox,
+ const css::uno::Reference<css::rendering::XPolyPolygon2D>& rxPolygon,
+ const css::rendering::ViewState& rDefaultViewState,
+ const css::rendering::RenderState& rDefaultRenderState)
+{
+ if ( ! rxCanvas.is() || ! rxCanvas->getDevice().is())
+ return;
+
+ if ( ! rxPolygon.is())
+ return;
+
+ // Set the repaint box as clip rectangle at the view state.
+ rendering::ViewState aViewState (rDefaultViewState);
+ aViewState.Clip = PresenterGeometryHelper::CreatePolygon(rRepaintBox, rxCanvas->getDevice());
+
+ // Setup the rendering state to use the given color.
+ rendering::RenderState aRenderState (rDefaultRenderState);
+ SetDeviceColor(aRenderState, nColor);
+
+ rxCanvas->fillPolyPolygon(
+ rxPolygon,
+ aViewState,
+ aRenderState);
+}
+
+void PresenterCanvasHelper::SetDeviceColor(
+ rendering::RenderState& rRenderState,
+ const util::Color aColor)
+{
+ // Other component counts then 4 (RGBA) are not accepted (anymore).
+
+ OSL_ASSERT(rRenderState.DeviceColor.getLength() == 4);
+ if (rRenderState.DeviceColor.getLength() == 4)
+ {
+ auto pDeviceColor = rRenderState.DeviceColor.getArray();
+ pDeviceColor[0] = ((aColor >> 16) & 0x0ff) / 255.0;
+ pDeviceColor[1] = ((aColor >> 8) & 0x0ff) / 255.0;
+ pDeviceColor[2] = ((aColor >> 0) & 0x0ff) / 255.0;
+ pDeviceColor[3] = 1.0 - ((aColor >> 24) & 0x0ff) / 255.0;
+ }
+}
+
+css::geometry::RealRectangle2D PresenterCanvasHelper::GetTextBoundingBox (
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const OUString& rsText,
+ const sal_Int8 nTextDirection)
+{
+ if (rxFont.is() && !rsText.isEmpty())
+ {
+ rendering::StringContext aContext (rsText, 0, rsText.getLength());
+ Reference<rendering::XTextLayout> xLayout (
+ rxFont->createTextLayout(aContext, nTextDirection, 0));
+ return xLayout->queryTextBounds();
+ }
+ else
+ {
+ return geometry::RealRectangle2D(0,0,0,0);
+ }
+}
+
+css::geometry::RealSize2D PresenterCanvasHelper::GetTextSize (
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const OUString& rsText)
+{
+ const geometry::RealRectangle2D aTextBBox (GetTextBoundingBox(rxFont, rsText));
+ return css::geometry::RealSize2D(aTextBBox.X2 - aTextBBox.X1, aTextBBox.Y2 - aTextBBox.Y1);
+}
+
+} // end of namespace sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterCanvasHelper.hxx b/sdext/source/presenter/PresenterCanvasHelper.hxx
new file mode 100644
index 000000000..8902a9712
--- /dev/null
+++ b/sdext/source/presenter/PresenterCanvasHelper.hxx
@@ -0,0 +1,107 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERCANVASHELPER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERCANVASHELPER_HXX
+
+#include "PresenterBitmapContainer.hxx"
+#include <com/sun/star/awt/Point.hpp>
+#include <com/sun/star/awt/Rectangle.hpp>
+#include <com/sun/star/rendering/TextDirection.hpp>
+#include <com/sun/star/rendering/XCanvas.hpp>
+#include <com/sun/star/rendering/XCanvasFont.hpp>
+#include <com/sun/star/rendering/XPolyPolygon2D.hpp>
+
+namespace sdext::presenter {
+
+/** Collection of functions to ease the life of a canvas user.
+*/
+class PresenterCanvasHelper
+{
+public:
+ PresenterCanvasHelper();
+ ~PresenterCanvasHelper();
+ PresenterCanvasHelper(const PresenterCanvasHelper&) = delete;
+ PresenterCanvasHelper& operator=(const PresenterCanvasHelper&) = delete;
+
+ void Paint (
+ const SharedBitmapDescriptor& rpBitmap,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox,
+ const css::awt::Rectangle& rBackgroundBoundingBox,
+ const css::awt::Rectangle& rContentBoundingBox) const;
+
+ static void PaintRectangle (
+ const SharedBitmapDescriptor& rpBitmap,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox,
+ const css::awt::Rectangle& rBackgroundBoundingBox,
+ const css::awt::Rectangle& rContentBoundingBox,
+ const css::rendering::ViewState& rDefaultViewState,
+ const css::rendering::RenderState& rDefaultRenderState);
+
+ static void SetDeviceColor(
+ css::rendering::RenderState& rRenderState,
+ const css::util::Color aColor);
+
+ static css::geometry::RealRectangle2D GetTextBoundingBox (
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const OUString& rsText,
+ const sal_Int8 = css::rendering::TextDirection::WEAK_LEFT_TO_RIGHT);
+
+ static css::geometry::RealSize2D GetTextSize (
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const OUString& rsText );
+
+private:
+ const css::rendering::ViewState maDefaultViewState;
+ const css::rendering::RenderState maDefaultRenderState;
+
+ static void PaintTiledBitmap (
+ const css::uno::Reference<css::rendering::XBitmap>& rxTexture,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox,
+ const css::uno::Reference<css::rendering::XPolyPolygon2D>& rxPolygon,
+ const css::awt::Rectangle& rHole,
+ const css::rendering::ViewState& rDefaultViewState,
+ const css::rendering::RenderState& rDefaultRenderState);
+
+ static void PaintBitmap (
+ const css::uno::Reference<css::rendering::XBitmap>& rxBitmap,
+ const css::awt::Point& rLocation,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox,
+ const css::uno::Reference<css::rendering::XPolyPolygon2D>& rxPolygon,
+ const css::rendering::ViewState& rDefaultViewState,
+ const css::rendering::RenderState& rDefaultRenderState);
+
+ static void PaintColor (
+ const css::util::Color nColor,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox,
+ const css::uno::Reference<css::rendering::XPolyPolygon2D>& rxPolygon,
+ const css::rendering::ViewState& rDefaultViewState,
+ const css::rendering::RenderState& rDefaultRenderState);
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterConfigurationAccess.cxx b/sdext/source/presenter/PresenterConfigurationAccess.cxx
new file mode 100644
index 000000000..e7bd4524a
--- /dev/null
+++ b/sdext/source/presenter/PresenterConfigurationAccess.cxx
@@ -0,0 +1,274 @@
+/* -*- 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 "PresenterConfigurationAccess.hxx"
+
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/configuration/theDefaultProvider.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+#include <comphelper/propertysequence.hxx>
+#include <osl/diagnose.h>
+#include <tools/diagnose_ex.h>
+#include <sal/log.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sdext::presenter {
+
+PresenterConfigurationAccess::PresenterConfigurationAccess (
+ const Reference<XComponentContext>& rxContext,
+ const OUString& rsRootName,
+ WriteMode eMode)
+{
+ try
+ {
+ if (rxContext.is())
+ {
+ uno::Sequence<uno::Any> aCreationArguments(comphelper::InitAnyPropertySequence(
+ {
+ {"nodepath", uno::Any(rsRootName)},
+ {"depth", uno::Any(sal_Int32(-1))}
+ }));
+
+ OUString sAccessService;
+ if (eMode == READ_ONLY)
+ sAccessService = "com.sun.star.configuration.ConfigurationAccess";
+ else
+ sAccessService = "com.sun.star.configuration.ConfigurationUpdateAccess";
+
+ Reference<lang::XMultiServiceFactory> xProvider =
+ configuration::theDefaultProvider::get( rxContext );
+ mxRoot = xProvider->createInstanceWithArguments(
+ sAccessService, aCreationArguments);
+ maNode <<= mxRoot;
+ }
+ }
+ catch (const Exception&)
+ {
+ DBG_UNHANDLED_EXCEPTION("sdext.presenter", "caught exception while opening configuration");
+ }
+}
+
+PresenterConfigurationAccess::~PresenterConfigurationAccess()
+{
+}
+
+bool PresenterConfigurationAccess::IsValid() const
+{
+ return mxRoot.is();
+}
+
+Any PresenterConfigurationAccess::GetConfigurationNode (const OUString& sPathToNode)
+{
+ return GetConfigurationNode(
+ Reference<container::XHierarchicalNameAccess>(mxRoot, UNO_QUERY),
+ sPathToNode);
+}
+
+bool PresenterConfigurationAccess::GoToChild (const OUString& rsPathToNode)
+{
+ if ( ! IsValid())
+ return false;
+
+ Reference<container::XHierarchicalNameAccess> xNode (maNode, UNO_QUERY);
+ if (xNode.is())
+ {
+ maNode = GetConfigurationNode(
+ Reference<container::XHierarchicalNameAccess>(maNode, UNO_QUERY),
+ rsPathToNode);
+ if (Reference<XInterface>(maNode, UNO_QUERY).is())
+ return true;
+ }
+
+ mxRoot = nullptr;
+ return false;
+}
+
+bool PresenterConfigurationAccess::GoToChild (const Predicate& rPredicate)
+{
+ if ( ! IsValid())
+ return false;
+
+ maNode = Find(Reference<container::XNameAccess>(maNode,UNO_QUERY), rPredicate);
+ if (Reference<XInterface>(maNode, UNO_QUERY).is())
+ return true;
+
+ mxRoot = nullptr;
+ return false;
+}
+
+bool PresenterConfigurationAccess::SetProperty (
+ const OUString& rsPropertyName,
+ const Any& rValue)
+{
+ Reference<beans::XPropertySet> xProperties (maNode, UNO_QUERY);
+ if (xProperties.is())
+ {
+ xProperties->setPropertyValue(rsPropertyName, rValue);
+ return true;
+ }
+ else
+ return false;
+}
+
+Any PresenterConfigurationAccess::GetConfigurationNode (
+ const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode,
+ const OUString& sPathToNode)
+{
+ if (sPathToNode.isEmpty())
+ return Any(rxNode);
+
+ try
+ {
+ if (rxNode.is())
+ {
+ return rxNode->getByHierarchicalName(sPathToNode);
+ }
+ }
+ catch (const Exception&)
+ {
+ TOOLS_WARN_EXCEPTION("sdext.presenter", "caught exception while getting configuration node " << sPathToNode);
+ }
+
+ return Any();
+}
+
+Reference<beans::XPropertySet> PresenterConfigurationAccess::GetNodeProperties (
+ const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode,
+ const OUString& rsPathToNode)
+{
+ return Reference<beans::XPropertySet>(GetConfigurationNode(rxNode, rsPathToNode), UNO_QUERY);
+}
+
+void PresenterConfigurationAccess::CommitChanges()
+{
+ Reference<util::XChangesBatch> xConfiguration (mxRoot, UNO_QUERY);
+ if (xConfiguration.is())
+ xConfiguration->commitChanges();
+}
+
+void PresenterConfigurationAccess::ForAll (
+ const Reference<container::XNameAccess>& rxContainer,
+ const ::std::vector<OUString>& rArguments,
+ const ItemProcessor& rProcessor)
+{
+ if (!rxContainer.is())
+ return;
+
+ ::std::vector<Any> aValues(rArguments.size());
+ const Sequence<OUString> aKeys (rxContainer->getElementNames());
+ for (const OUString& rsKey : aKeys)
+ {
+ bool bHasAllValues (true);
+ Reference<container::XNameAccess> xSetItem (rxContainer->getByName(rsKey), UNO_QUERY);
+ Reference<beans::XPropertySet> xSet (xSetItem, UNO_QUERY);
+ OSL_ASSERT(xSet.is());
+ if (xSetItem.is())
+ {
+ // Get from the current item of the container the children
+ // that match the names in the rArguments list.
+ for (size_t nValueIndex=0; nValueIndex<aValues.size(); ++nValueIndex)
+ {
+ if ( ! xSetItem->hasByName(rArguments[nValueIndex]))
+ bHasAllValues = false;
+ else
+ aValues[nValueIndex] = xSetItem->getByName(rArguments[nValueIndex]);
+ }
+ }
+ else
+ bHasAllValues = false;
+ if (bHasAllValues)
+ rProcessor(aValues);
+ }
+}
+
+void PresenterConfigurationAccess::ForAll (
+ const Reference<container::XNameAccess>& rxContainer,
+ const PropertySetProcessor& rProcessor)
+{
+ if (rxContainer.is())
+ {
+ const Sequence<OUString> aKeys (rxContainer->getElementNames());
+ for (const OUString& rsKey : aKeys)
+ {
+ Reference<beans::XPropertySet> xSet (rxContainer->getByName(rsKey), UNO_QUERY);
+ if (xSet.is())
+ rProcessor(rsKey, xSet);
+ }
+ }
+}
+
+Any PresenterConfigurationAccess::Find (
+ const Reference<container::XNameAccess>& rxContainer,
+ const Predicate& rPredicate)
+{
+ if (rxContainer.is())
+ {
+ const Sequence<OUString> aKeys (rxContainer->getElementNames());
+ for (const auto& rKey : aKeys)
+ {
+ Reference<beans::XPropertySet> xProperties (
+ rxContainer->getByName(rKey),
+ UNO_QUERY);
+ if (xProperties.is())
+ if (rPredicate(rKey, xProperties))
+ return Any(xProperties);
+ }
+ }
+ return Any();
+}
+
+bool PresenterConfigurationAccess::IsStringPropertyEqual (
+ std::u16string_view rsValue,
+ const OUString& rsPropertyName,
+ const css::uno::Reference<css::beans::XPropertySet>& rxNode)
+{
+ OUString sValue;
+ if (GetProperty(rxNode, rsPropertyName) >>= sValue)
+ return sValue == rsValue;
+ else
+ return false;
+}
+
+Any PresenterConfigurationAccess::GetProperty (
+ const Reference<beans::XPropertySet>& rxProperties,
+ const OUString& rsKey)
+{
+ OSL_ASSERT(rxProperties.is());
+ if ( ! rxProperties.is())
+ return Any();
+ try
+ {
+ Reference<beans::XPropertySetInfo> xInfo (rxProperties->getPropertySetInfo());
+ if (xInfo.is())
+ if ( ! xInfo->hasPropertyByName(rsKey))
+ return Any();
+ return rxProperties->getPropertyValue(rsKey);
+ }
+ catch (beans::UnknownPropertyException&)
+ {
+ }
+ return Any();
+}
+
+} // end of namespace sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterConfigurationAccess.hxx b/sdext/source/presenter/PresenterConfigurationAccess.hxx
new file mode 100644
index 000000000..afd1b9aa4
--- /dev/null
+++ b/sdext/source/presenter/PresenterConfigurationAccess.hxx
@@ -0,0 +1,178 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERCONFIGURATIONACCESS_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERCONFIGURATIONACCESS_HXX
+
+#include <rtl/ustring.hxx>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <vector>
+#include <functional>
+
+namespace sdext::presenter {
+
+/** This class gives access to the configuration. Create an object of this
+ class for one node of the configuration. This will be the root node.
+ From this one you can use this class in two ways.
+
+ <p>In a stateless mode (with exception of the root node) you can use static
+ methods for obtaining child nodes, get values from properties at leaf
+ nodes and iterate over children of inner nodes.</p>
+
+ <p>In a stateful mode use non-static methods like GoToChild() to
+ navigate to children.</p>
+
+ <p>Note to call CommitChanges() after making changes to
+ PresenterConfigurationAccess object that was opened in READ_WRITE mode.</p>
+*/
+class PresenterConfigurationAccess
+{
+public:
+ enum WriteMode { READ_WRITE, READ_ONLY };
+ typedef ::std::function<bool (
+ const OUString&,
+ const css::uno::Reference<css::beans::XPropertySet>&)> Predicate;
+ static constexpr OUStringLiteral msPresenterScreenRootName =
+ u"/org.openoffice.Office.PresenterScreen/";
+
+ /** Create a new object to access the configuration entries below the
+ given root.
+ @param rsRootName
+ Name of the root. You can use msPresenterScreenRootName to
+ access the configuration of the presenter screen.
+ @param eMode
+ This flag specifies whether to give read-write or read-only
+ access.
+ */
+ PresenterConfigurationAccess(
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const OUString& rsRootName,
+ WriteMode eMode);
+
+ ~PresenterConfigurationAccess();
+
+ /** Return a configuration node below the root of the called object.
+ @param rsPathToNode
+ The relative path from the root (as given the constructor) to the node.
+ */
+ css::uno::Any GetConfigurationNode (
+ const OUString& rsPathToNode);
+
+ /** Return <TRUE/> when opening the configuration (via creating a new
+ PresenterConfigurationAccess object) or previous calls to
+ GoToChild() left the called PresenterConfigurationAccess object in a
+ valid state.
+ */
+ bool IsValid() const;
+
+ /** Move the focused node to the (possibly indirect) child specified by the given path.
+ */
+ bool GoToChild (const OUString& rsPathToNode);
+
+ /** Move the focused node to the first direct child that fulfills the given predicate.
+ */
+ bool GoToChild (const Predicate& rPredicate);
+
+ /** Modify the property child of the currently focused node. Keep in
+ mind to call CommitChanges() to write the change back to the
+ configuration.
+ */
+ bool SetProperty (const OUString& rsPropertyName, const css::uno::Any& rValue);
+
+ /** Return a configuration node below the given node.
+ @param rxNode
+ The node that acts as root to the given relative path.
+ @param rsPathToNode
+ The relative path from the given node to the requested node.
+ When this string is empty then rxNode is returned.
+ @return
+ The type of the returned node varies with the requested node.
+ It is empty when the node was not found.
+ */
+ static css::uno::Any GetConfigurationNode (
+ const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode,
+ const OUString& rsPathToNode);
+
+ static css::uno::Reference<css::beans::XPropertySet> GetNodeProperties (
+ const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode,
+ const OUString& rsPathToNode);
+
+ /** Write any changes that have been made back to the configuration.
+ This call is ignored when the called ConfigurationAccess object was
+ not create with read-write mode.
+ */
+ void CommitChanges();
+
+ typedef ::std::function<void (
+ const ::std::vector<css::uno::Any>&) > ItemProcessor;
+ typedef ::std::function<void (
+ const OUString&,
+ const css::uno::Reference<css::beans::XPropertySet>&) > PropertySetProcessor;
+
+ /** Execute a functor for all elements of the given container.
+ @param rxContainer
+ The container is a XNameAccess to a list of the configuration.
+ This can be a node returned by GetConfigurationNode().
+ @param rArguments
+ The functor is called with arguments that are children of each
+ element of the container. The set of children is specified this
+ list.
+ @param rFunctor
+ The functor to be executed for some or all of the elements in
+ the given container.
+ */
+ static void ForAll (
+ const css::uno::Reference<css::container::XNameAccess>& rxContainer,
+ const ::std::vector<OUString>& rArguments,
+ const ItemProcessor& rProcessor);
+ static void ForAll (
+ const css::uno::Reference<css::container::XNameAccess>& rxContainer,
+ const PropertySetProcessor& rProcessor);
+
+ static css::uno::Any Find (
+ const css::uno::Reference<css::container::XNameAccess>& rxContainer,
+ const Predicate& rPredicate);
+
+ static bool IsStringPropertyEqual (
+ std::u16string_view rsValue,
+ const OUString& rsPropertyName,
+ const css::uno::Reference<css::beans::XPropertySet>& rxNode);
+
+ /** This method wraps a call to getPropertyValue() and returns an empty
+ Any instead of throwing an exception when the property does not
+ exist.
+ */
+ static css::uno::Any GetProperty (
+ const css::uno::Reference<css::beans::XPropertySet>& rxProperties,
+ const OUString& rsKey);
+
+private:
+ css::uno::Reference<css::uno::XInterface> mxRoot;
+ css::uno::Any maNode;
+};
+
+} // end of namespace sdext::tools
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterController.cxx b/sdext/source/presenter/PresenterController.cxx
new file mode 100644
index 000000000..1062d892d
--- /dev/null
+++ b/sdext/source/presenter/PresenterController.cxx
@@ -0,0 +1,1185 @@
+/* -*- 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 "PresenterController.hxx"
+
+#include "PresenterAccessibility.hxx"
+#include "PresenterCanvasHelper.hxx"
+#include "PresenterCurrentSlideObserver.hxx"
+#include "PresenterScreen.hxx"
+#include "PresenterPaintManager.hxx"
+#include "PresenterPaneBase.hxx"
+#include "PresenterPaneContainer.hxx"
+#include "PresenterPaneBorderPainter.hxx"
+#include "PresenterTheme.hxx"
+#include "PresenterViewFactory.hxx"
+#include "PresenterWindowManager.hxx"
+
+#include <com/sun/star/awt/Key.hpp>
+#include <com/sun/star/awt/KeyModifier.hpp>
+#include <com/sun/star/awt/MouseButton.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/framework/ResourceActivationMode.hpp>
+#include <com/sun/star/drawing/framework/ResourceId.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/frame/FrameSearchFlag.hpp>
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/presentation/AnimationEffect.hpp>
+#include <com/sun/star/presentation/XPresentation.hpp>
+#include <com/sun/star/presentation/XPresentationSupplier.hpp>
+#include <com/sun/star/rendering/TextDirection.hpp>
+#include <com/sun/star/util/URLTransformer.hpp>
+
+#include <rtl/ustrbuf.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::presentation;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace {
+ const sal_Int32 ResourceActivationEventType = 0;
+ const sal_Int32 ResourceDeactivationEventType = 1;
+ const sal_Int32 ConfigurationUpdateEndEventType = 2;
+}
+
+namespace sdext::presenter {
+
+IPresentationTime::~IPresentationTime()
+{
+}
+
+PresenterController::InstanceContainer PresenterController::maInstances;
+
+::rtl::Reference<PresenterController> PresenterController::Instance (
+ const css::uno::Reference<css::frame::XFrame>& rxFrame)
+{
+ InstanceContainer::const_iterator iInstance (maInstances.find(rxFrame));
+ if (iInstance != maInstances.end())
+ return iInstance->second;
+ else
+ return ::rtl::Reference<PresenterController>();
+}
+
+PresenterController::PresenterController (
+ const css::uno::WeakReference<css::lang::XEventListener> &rxScreen,
+ const Reference<XComponentContext>& rxContext,
+ const Reference<frame::XController>& rxController,
+ const Reference<presentation::XSlideShowController>& rxSlideShowController,
+ const rtl::Reference<PresenterPaneContainer>& rpPaneContainer,
+ const Reference<XResourceId>& rxMainPaneId)
+ : PresenterControllerInterfaceBase(m_aMutex),
+ mxScreen(rxScreen),
+ mxComponentContext(rxContext),
+ mxController(rxController),
+ mxSlideShowController(rxSlideShowController),
+ mxMainPaneId(rxMainPaneId),
+ mpPaneContainer(rpPaneContainer),
+ mnCurrentSlideIndex(-1),
+ mpWindowManager(new PresenterWindowManager(rxContext,mpPaneContainer,this)),
+ mpCanvasHelper(std::make_shared<PresenterCanvasHelper>()),
+ mnPendingSlideNumber(-1),
+ mbIsAccessibilityActive(false)
+{
+ OSL_ASSERT(mxController.is());
+
+ if ( ! mxSlideShowController.is())
+ throw lang::IllegalArgumentException(
+ "missing slide show controller",
+ static_cast<XWeak*>(this),
+ 2);
+
+ new PresenterCurrentSlideObserver(this,rxSlideShowController);
+
+ // Listen for configuration changes.
+ Reference<XControllerManager> xCM (mxController, UNO_QUERY_THROW);
+ mxConfigurationController = xCM->getConfigurationController();
+ if (mxConfigurationController.is())
+ {
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ "ResourceActivation",
+ Any(ResourceActivationEventType));
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ "ResourceDeactivation",
+ Any(ResourceDeactivationEventType));
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ "ConfigurationUpdateEnd",
+ Any(ConfigurationUpdateEndEventType));
+ }
+
+ // Listen for the frame being activated.
+ Reference<frame::XFrame> xFrame (mxController->getFrame());
+ if (xFrame.is())
+ xFrame->addFrameActionListener(this);
+
+ // Create the border painter.
+ mpPaneBorderPainter = new PresenterPaneBorderPainter(rxContext);
+ mpWindowManager->SetPaneBorderPainter(mpPaneBorderPainter);
+
+ // Create an object that is able to load the bitmaps in a format that is
+ // supported by the canvas.
+ Reference<lang::XMultiComponentFactory> xFactory =
+ rxContext->getServiceManager();
+ if ( ! xFactory.is())
+ return;
+ mxPresenterHelper.set(
+ xFactory->createInstanceWithContext(
+ "com.sun.star.drawing.PresenterHelper",
+ rxContext),
+ UNO_QUERY_THROW);
+
+ if (mxSlideShowController.is())
+ {
+ mxSlideShowController->activate();
+ Reference<beans::XPropertySet> xProperties (mxSlideShowController, UNO_QUERY);
+ if (xProperties.is())
+ {
+ Reference<awt::XWindow> xWindow (
+ xProperties->getPropertyValue("ParentWindow"), UNO_QUERY);
+ if (xWindow.is())
+ xWindow->addKeyListener(this);
+ }
+ }
+
+ UpdateCurrentSlide(0);
+
+ maInstances[mxController->getFrame()] = this;
+
+ // Create a URLTransformer.
+ if (xFactory.is())
+ {
+ mxUrlTransformer.set(util::URLTransformer::create(mxComponentContext));
+ }
+}
+
+PresenterController::~PresenterController()
+{
+}
+
+void PresenterController::disposing()
+{
+ maInstances.erase(mxController->getFrame());
+
+ if (mxMainWindow.is())
+ {
+ mxMainWindow->removeKeyListener(this);
+ mxMainWindow->removeMouseListener(this);
+ mxMainWindow = nullptr;
+ }
+ if (mxConfigurationController.is())
+ mxConfigurationController->removeConfigurationChangeListener(this);
+
+ if (mxController.is())
+ {
+ Reference<frame::XFrame> xFrame (mxController->getFrame());
+ if (xFrame.is())
+ xFrame->removeFrameActionListener(this);
+ mxController = nullptr;
+ }
+
+ Reference<XComponent> xWindowManagerComponent = mpWindowManager;
+ mpWindowManager = nullptr;
+ if (xWindowManagerComponent.is())
+ xWindowManagerComponent->dispose();
+
+ mxComponentContext = nullptr;
+ mxConfigurationController = nullptr;
+ mxSlideShowController = nullptr;
+ mxMainPaneId = nullptr;
+ mpPaneContainer = nullptr;
+ mnCurrentSlideIndex = -1;
+ mxCurrentSlide = nullptr;
+ mxNextSlide = nullptr;
+ mpTheme.reset();
+ {
+ Reference<lang::XComponent> xComponent = mpPaneBorderPainter;
+ mpPaneBorderPainter = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ mpCanvasHelper.reset();
+ {
+ Reference<lang::XComponent> xComponent (mxPresenterHelper, UNO_QUERY);
+ mxPresenterHelper = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ mpPaintManager.reset();
+ mnPendingSlideNumber = -1;
+ {
+ Reference<lang::XComponent> xComponent (mxUrlTransformer, UNO_QUERY);
+ mxUrlTransformer = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+}
+
+void PresenterController::UpdateCurrentSlide (const sal_Int32 nOffset)
+{
+ // std::cerr << "Updating current Slide to " << nOffset << std::endl;
+ GetSlides(nOffset);
+ UpdatePaneTitles();
+ UpdateViews();
+
+ // Update the accessibility object.
+ if (IsAccessibilityActive())
+ {
+ mpAccessibleObject->NotifyCurrentSlideChange();
+ }
+}
+
+void PresenterController::GetSlides (const sal_Int32 nOffset)
+{
+ if ( ! mxSlideShowController.is())
+ return;
+
+ // Get the current slide from the slide show controller.
+ mxCurrentSlide = nullptr;
+ Reference<container::XIndexAccess> xIndexAccess(mxSlideShowController, UNO_QUERY);
+ try
+ {
+ sal_Int32 nSlideIndex = mxSlideShowController->getCurrentSlideIndex() + nOffset;
+ if (mxSlideShowController->isPaused())
+ nSlideIndex = -1;
+
+ if (xIndexAccess.is() && nSlideIndex>=0)
+ {
+ if (nSlideIndex < xIndexAccess->getCount())
+ {
+ mnCurrentSlideIndex = nSlideIndex;
+ mxCurrentSlide.set( xIndexAccess->getByIndex(nSlideIndex), UNO_QUERY);
+ }
+ }
+ }
+ catch (RuntimeException&)
+ {
+ }
+
+ // Get the next slide.
+ mxNextSlide = nullptr;
+ try
+ {
+ const sal_Int32 nNextSlideIndex (mxSlideShowController->getNextSlideIndex()+nOffset);
+ if (nNextSlideIndex >= 0)
+ {
+ if (xIndexAccess.is())
+ {
+ if (nNextSlideIndex < xIndexAccess->getCount())
+ mxNextSlide.set( xIndexAccess->getByIndex(nNextSlideIndex), UNO_QUERY);
+ }
+ }
+ }
+ catch (RuntimeException&)
+ {
+ }
+}
+
+void PresenterController::UpdatePaneTitles()
+{
+ if ( ! mxSlideShowController.is())
+ return;
+
+ // Get placeholders and their values.
+ static const OUStringLiteral sCurrentSlideNumberPlaceholder (u"CURRENT_SLIDE_NUMBER");
+ static const OUStringLiteral sCurrentSlideNamePlaceholder (u"CURRENT_SLIDE_NAME");
+ static const OUStringLiteral sSlideCountPlaceholder (u"SLIDE_COUNT");
+
+ // Get string for slide count.
+ OUString sSlideCount ("---");
+ Reference<container::XIndexAccess> xIndexAccess(mxSlideShowController, UNO_QUERY);
+ if (xIndexAccess.is())
+ sSlideCount = OUString::number(xIndexAccess->getCount());
+
+ // Get string for current slide index.
+ OUString sCurrentSlideNumber (OUString::number(mnCurrentSlideIndex + 1));
+
+ // Get name of the current slide.
+ OUString sCurrentSlideName;
+ Reference<container::XNamed> xNamedSlide (mxCurrentSlide, UNO_QUERY);
+ if (xNamedSlide.is())
+ sCurrentSlideName = xNamedSlide->getName();
+ Reference<beans::XPropertySet> xSlideProperties (mxCurrentSlide, UNO_QUERY);
+ if (xSlideProperties.is())
+ {
+ try
+ {
+ OUString sName;
+ if (xSlideProperties->getPropertyValue("LinkDisplayName") >>= sName)
+ {
+ // Find out whether the name of the current slide has been
+ // automatically created or has been set by the user.
+ if (sName != sCurrentSlideName)
+ sCurrentSlideName = sName;
+ }
+ }
+ catch (const beans::UnknownPropertyException&)
+ {
+ }
+ }
+
+ // Replace the placeholders with their current values.
+ for (auto& rxPane : mpPaneContainer->maPanes)
+ {
+ OSL_ASSERT(rxPane != nullptr);
+
+ OUString sTemplate (IsAccessibilityActive()
+ ? rxPane->msAccessibleTitleTemplate
+ : rxPane->msTitleTemplate);
+ if (sTemplate.isEmpty())
+ continue;
+
+ OUStringBuffer sResult;
+ sResult.ensureCapacity(sTemplate.getLength());
+
+ sal_Int32 nIndex (0);
+ while (true)
+ {
+ sal_Int32 nStartIndex = sTemplate.indexOf('%', nIndex);
+ if (nStartIndex < 0)
+ {
+ // Add the remaining part of the string.
+ sResult.append(sTemplate.subView(nIndex));
+ break;
+ }
+ else
+ {
+ // Add the part preceding the next %.
+ sResult.append(sTemplate.subView(nIndex, nStartIndex-nIndex));
+
+ // Get the placeholder
+ ++nStartIndex;
+ const sal_Int32 nEndIndex (sTemplate.indexOf('%', nStartIndex+1));
+ const std::u16string_view sPlaceholder (sTemplate.subView(nStartIndex, nEndIndex-nStartIndex));
+ nIndex = nEndIndex+1;
+
+ // Replace the placeholder with its current value.
+ if (sPlaceholder == sCurrentSlideNumberPlaceholder)
+ sResult.append(sCurrentSlideNumber);
+ else if (sPlaceholder == sCurrentSlideNamePlaceholder)
+ sResult.append(sCurrentSlideName);
+ else if (sPlaceholder == sSlideCountPlaceholder)
+ sResult.append(sSlideCount);
+ }
+ }
+
+ rxPane->msTitle = sResult.makeStringAndClear();
+ if (rxPane->mxPane.is())
+ rxPane->mxPane->SetTitle(rxPane->msTitle);
+ }
+}
+
+void PresenterController::UpdateViews()
+{
+ // Tell all views about the slides they should display.
+ for (const auto& rxPane : mpPaneContainer->maPanes)
+ {
+ Reference<drawing::XDrawView> xDrawView (rxPane->mxView, UNO_QUERY);
+ if (xDrawView.is())
+ xDrawView->setCurrentPage(mxCurrentSlide);
+ }
+}
+
+SharedBitmapDescriptor
+ PresenterController::GetViewBackground (const OUString& rsViewURL) const
+{
+ if (mpTheme != nullptr)
+ {
+ const OUString sStyleName (mpTheme->GetStyleName(rsViewURL));
+ return mpTheme->GetBitmap(sStyleName, "Background");
+ }
+ return SharedBitmapDescriptor();
+}
+
+PresenterTheme::SharedFontDescriptor
+ PresenterController::GetViewFont (const OUString& rsViewURL) const
+{
+ if (mpTheme != nullptr)
+ {
+ const OUString sStyleName (mpTheme->GetStyleName(rsViewURL));
+ return mpTheme->GetFont(sStyleName);
+ }
+ return PresenterTheme::SharedFontDescriptor();
+}
+
+const std::shared_ptr<PresenterTheme>& PresenterController::GetTheme() const
+{
+ return mpTheme;
+}
+
+const ::rtl::Reference<PresenterWindowManager>& PresenterController::GetWindowManager() const
+{
+ return mpWindowManager;
+}
+
+const Reference<presentation::XSlideShowController>&
+ PresenterController::GetSlideShowController() const
+{
+ return mxSlideShowController;
+}
+
+const rtl::Reference<PresenterPaneContainer>& PresenterController::GetPaneContainer() const
+{
+ return mpPaneContainer;
+}
+
+const ::rtl::Reference<PresenterPaneBorderPainter>& PresenterController::GetPaneBorderPainter() const
+{
+ return mpPaneBorderPainter;
+}
+
+const std::shared_ptr<PresenterCanvasHelper>& PresenterController::GetCanvasHelper() const
+{
+ return mpCanvasHelper;
+}
+
+const Reference<drawing::XPresenterHelper>& PresenterController::GetPresenterHelper() const
+{
+ return mxPresenterHelper;
+}
+
+const std::shared_ptr<PresenterPaintManager>& PresenterController::GetPaintManager() const
+{
+ return mpPaintManager;
+}
+
+void PresenterController::ShowView (const OUString& rsViewURL)
+{
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
+ mpPaneContainer->FindViewURL(rsViewURL));
+ if (!pDescriptor)
+ return;
+
+ pDescriptor->mbIsActive = true;
+ mxConfigurationController->requestResourceActivation(
+ pDescriptor->mxPaneId,
+ ResourceActivationMode_ADD);
+ mxConfigurationController->requestResourceActivation(
+ ResourceId::createWithAnchor(
+ mxComponentContext,
+ rsViewURL,
+ pDescriptor->mxPaneId),
+ ResourceActivationMode_REPLACE);
+}
+
+void PresenterController::HideView (const OUString& rsViewURL)
+{
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
+ mpPaneContainer->FindViewURL(rsViewURL));
+ if (pDescriptor)
+ {
+ mxConfigurationController->requestResourceDeactivation(
+ ResourceId::createWithAnchor(
+ mxComponentContext,
+ rsViewURL,
+ pDescriptor->mxPaneId));
+ }
+}
+
+void PresenterController::DispatchUnoCommand (const OUString& rsCommand) const
+{
+ if ( ! mxUrlTransformer.is())
+ return;
+
+ util::URL aURL;
+ aURL.Complete = rsCommand;
+ mxUrlTransformer->parseStrict(aURL);
+
+ Reference<frame::XDispatch> xDispatch (GetDispatch(aURL));
+ if ( ! xDispatch.is())
+ return;
+
+ xDispatch->dispatch(aURL, Sequence<beans::PropertyValue>());
+}
+
+Reference<css::frame::XDispatch> PresenterController::GetDispatch (const util::URL& rURL) const
+{
+ if ( ! mxController.is())
+ return nullptr;
+
+ Reference<frame::XDispatchProvider> xDispatchProvider (mxController->getFrame(), UNO_QUERY);
+ if ( ! xDispatchProvider.is())
+ return nullptr;
+
+ return xDispatchProvider->queryDispatch(
+ rURL,
+ OUString(),
+ frame::FrameSearchFlag::SELF);
+}
+
+util::URL PresenterController::CreateURLFromString (const OUString& rsURL) const
+{
+ util::URL aURL;
+
+ if (mxUrlTransformer.is())
+ {
+ aURL.Complete = rsURL;
+ mxUrlTransformer->parseStrict(aURL);
+ }
+
+ return aURL;
+}
+
+const Reference<drawing::framework::XConfigurationController>&
+ PresenterController::GetConfigurationController() const
+{
+ return mxConfigurationController;
+}
+
+const Reference<drawing::XDrawPage>& PresenterController::GetCurrentSlide() const
+{
+ return mxCurrentSlide;
+}
+
+bool PresenterController::HasTransition (Reference<drawing::XDrawPage> const & rxPage)
+{
+ bool bTransition = false;
+ if( rxPage.is() )
+ {
+ Reference<beans::XPropertySet> xSlidePropertySet (rxPage, UNO_QUERY);
+ try
+ {
+ sal_uInt16 aTransitionType = 0;
+ xSlidePropertySet->getPropertyValue("TransitionType") >>= aTransitionType;
+ if (aTransitionType > 0)
+ {
+ bTransition = true;
+ }
+ }
+ catch (const beans::UnknownPropertyException&)
+ {
+ }
+ }
+ return bTransition;
+}
+
+bool PresenterController::HasCustomAnimation (Reference<drawing::XDrawPage> const & rxPage)
+{
+ bool bCustomAnimation = false;
+ if( rxPage.is() )
+ {
+ sal_uInt32 i, nCount = rxPage->getCount();
+ for ( i = 0; i < nCount; i++ )
+ {
+ Reference<drawing::XShape> xShape(rxPage->getByIndex(i), UNO_QUERY);
+ Reference<beans::XPropertySet> xShapePropertySet(xShape, UNO_QUERY);
+ presentation::AnimationEffect aEffect = presentation::AnimationEffect_NONE;
+ presentation::AnimationEffect aTextEffect = presentation::AnimationEffect_NONE;
+ try
+ {
+ xShapePropertySet->getPropertyValue("Effect") >>= aEffect;
+ xShapePropertySet->getPropertyValue("TextEffect") >>= aTextEffect;
+ }
+ catch (const beans::UnknownPropertyException&)
+ {
+ }
+ if( aEffect != presentation::AnimationEffect_NONE ||
+ aTextEffect != presentation::AnimationEffect_NONE )
+ {
+ bCustomAnimation = true;
+ break;
+ }
+ }
+ }
+ return bCustomAnimation;
+}
+
+void PresenterController::SetAccessibilityActiveState (const bool bIsActive)
+{
+ if ( mbIsAccessibilityActive != bIsActive)
+ {
+ mbIsAccessibilityActive = bIsActive;
+ UpdatePaneTitles();
+ }
+}
+
+
+void PresenterController::HandleMouseClick (const awt::MouseEvent& rEvent)
+{
+ if (!mxSlideShowController.is())
+ return;
+
+ switch (rEvent.Buttons)
+ {
+ case awt::MouseButton::LEFT:
+ if (rEvent.Modifiers == awt::KeyModifier::MOD2)
+ mxSlideShowController->gotoNextSlide();
+ else
+ mxSlideShowController->gotoNextEffect();
+ break;
+
+ case awt::MouseButton::RIGHT:
+ mxSlideShowController->gotoPreviousSlide();
+ break;
+
+ default:
+ // Other or multiple buttons.
+ break;
+ }
+}
+
+void PresenterController::RequestViews (
+ const bool bIsSlideSorterActive,
+ const bool bIsNotesViewActive,
+ const bool bIsHelpViewActive)
+{
+ for (const auto& rxPane : mpPaneContainer->maPanes)
+ {
+ bool bActivate (true);
+ const OUString sViewURL (rxPane->msViewURL);
+ if (sViewURL == PresenterViewFactory::msNotesViewURL)
+ {
+ bActivate = bIsNotesViewActive && !bIsSlideSorterActive && !bIsHelpViewActive;
+ }
+ else if (sViewURL == PresenterViewFactory::msSlideSorterURL)
+ {
+ bActivate = bIsSlideSorterActive;
+ }
+ else if (sViewURL == PresenterViewFactory::msCurrentSlidePreviewViewURL
+ || sViewURL == PresenterViewFactory::msNextSlidePreviewViewURL)
+ {
+ bActivate = !bIsSlideSorterActive && ! bIsHelpViewActive;
+ }
+ else if (sViewURL == PresenterViewFactory::msToolBarViewURL)
+ {
+ bActivate = true;
+ }
+ else if (sViewURL == PresenterViewFactory::msHelpViewURL)
+ {
+ bActivate = bIsHelpViewActive;
+ }
+
+ if (bActivate)
+ ShowView(sViewURL);
+ else
+ HideView(sViewURL);
+ }
+}
+
+void PresenterController::SetPresentationTime(IPresentationTime* pPresentationTime)
+{
+ mpPresentationTime = pPresentationTime;
+}
+
+IPresentationTime* PresenterController::GetPresentationTime()
+{
+ return mpPresentationTime;
+}
+
+//----- XConfigurationChangeListener ------------------------------------------
+
+void SAL_CALL PresenterController::notifyConfigurationChange (
+ const ConfigurationChangeEvent& rEvent)
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterController object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+
+ sal_Int32 nType (0);
+ if ( ! (rEvent.UserData >>= nType))
+ return;
+
+ switch (nType)
+ {
+ case ResourceActivationEventType:
+ if (rEvent.ResourceId->compareTo(mxMainPaneId) == 0)
+ {
+ InitializeMainPane(Reference<XPane>(rEvent.ResourceObject,UNO_QUERY));
+ }
+ else if (rEvent.ResourceId->isBoundTo(mxMainPaneId,AnchorBindingMode_DIRECT))
+ {
+ // A pane bound to the main pane has been created and is
+ // stored in the pane container.
+ Reference<XPane> xPane (rEvent.ResourceObject,UNO_QUERY);
+ if (xPane.is())
+ {
+ mpPaneContainer->FindPaneId(xPane->getResourceId());
+ }
+ }
+ else if (rEvent.ResourceId->isBoundTo(mxMainPaneId,AnchorBindingMode_INDIRECT))
+ {
+ // A view bound to one of the panes has been created and is
+ // stored in the pane container along with its pane.
+ Reference<XView> xView (rEvent.ResourceObject,UNO_QUERY);
+ if (xView.is())
+ {
+ mpPaneContainer->StoreView(xView);
+ UpdateViews();
+ mpWindowManager->NotifyViewCreation(xView);
+ }
+ }
+ break;
+
+ case ResourceDeactivationEventType:
+ if (rEvent.ResourceId->isBoundTo(mxMainPaneId,AnchorBindingMode_INDIRECT))
+ {
+ // If this is a view then remove it from the pane container.
+ Reference<XView> xView (rEvent.ResourceObject,UNO_QUERY);
+ if (xView.is())
+ {
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor(
+ mpPaneContainer->RemoveView(xView));
+
+ // A possibly opaque view has been removed. Update()
+ // updates the clip polygon.
+ mpWindowManager->Update();
+ // Request the repainting of the area previously
+ // occupied by the view.
+ if (pDescriptor)
+ GetPaintManager()->Invalidate(pDescriptor->mxBorderWindow);
+ }
+ }
+ break;
+
+ case ConfigurationUpdateEndEventType:
+ if (IsAccessibilityActive())
+ {
+ mpAccessibleObject->UpdateAccessibilityHierarchy();
+ UpdateCurrentSlide(0);
+ }
+ break;
+ }
+}
+
+//----- XEventListener --------------------------------------------------------
+
+void SAL_CALL PresenterController::disposing (
+ const lang::EventObject& rEvent)
+{
+ if (rEvent.Source == mxController)
+ mxController = nullptr;
+ else if (rEvent.Source == mxConfigurationController)
+ mxConfigurationController = nullptr;
+ else if (rEvent.Source == mxSlideShowController)
+ mxSlideShowController = nullptr;
+ else if (rEvent.Source == mxMainWindow)
+ mxMainWindow = nullptr;
+}
+
+//----- XFrameActionListener --------------------------------------------------
+
+void SAL_CALL PresenterController::frameAction (
+ const frame::FrameActionEvent& rEvent)
+{
+ if (rEvent.Action == frame::FrameAction_FRAME_ACTIVATED)
+ {
+ if (mxSlideShowController.is())
+ mxSlideShowController->activate();
+ }
+}
+
+//----- XKeyListener ----------------------------------------------------------
+
+void SAL_CALL PresenterController::keyPressed (const awt::KeyEvent& rEvent)
+{
+ // Tell all views about the unhandled key event.
+ for (const auto& rxPane : mpPaneContainer->maPanes)
+ {
+ if ( ! rxPane->mbIsActive)
+ continue;
+
+ Reference<awt::XKeyListener> xKeyListener (rxPane->mxView, UNO_QUERY);
+ if (xKeyListener.is())
+ xKeyListener->keyPressed(rEvent);
+ }
+}
+
+void SAL_CALL PresenterController::keyReleased (const awt::KeyEvent& rEvent)
+{
+ if (rEvent.Source != mxMainWindow)
+ return;
+
+ switch (rEvent.KeyCode)
+ {
+ case awt::Key::ESCAPE:
+ case awt::Key::SUBTRACT:
+ {
+ if( mxController.is() )
+ {
+ Reference< XPresentationSupplier > xPS( mxController->getModel(), UNO_QUERY );
+ if( xPS.is() )
+ {
+ Reference< XPresentation > xP( xPS->getPresentation() );
+ if( xP.is() )
+ xP->end();
+ }
+ }
+ }
+ break;
+
+ case awt::Key::PAGEDOWN:
+ if (mxSlideShowController.is())
+ {
+ if (rEvent.Modifiers == awt::KeyModifier::MOD2)
+ mxSlideShowController->gotoNextSlide();
+ else
+ mxSlideShowController->gotoNextEffect();
+ }
+ break;
+
+ case awt::Key::RIGHT:
+ case awt::Key::SPACE:
+ case awt::Key::DOWN:
+ if (mxSlideShowController.is())
+ {
+ mxSlideShowController->gotoNextEffect();
+ }
+ break;
+
+ case awt::Key::PAGEUP:
+ if (mxSlideShowController.is())
+ {
+ if (rEvent.Modifiers == awt::KeyModifier::MOD2)
+ mxSlideShowController->gotoPreviousSlide();
+ else
+ mxSlideShowController->gotoPreviousEffect();
+ }
+ break;
+
+ case awt::Key::LEFT:
+ case awt::Key::UP:
+ case awt::Key::BACKSPACE:
+ if (mxSlideShowController.is())
+ {
+ mxSlideShowController->gotoPreviousEffect();
+ }
+ break;
+
+ case awt::Key::P:
+ if (mxSlideShowController.is())
+ {
+ bool bPenEnabled = mxSlideShowController->getUsePen();
+ mxSlideShowController->setUsePen( !bPenEnabled );
+ }
+ break;
+
+ // tdf#149351 Ctrl+A disables pointer as pen mode
+ case awt::Key::A:
+ if (mxSlideShowController.is())
+ {
+ if (rEvent.Modifiers == awt::KeyModifier::MOD1)
+ {
+ mxSlideShowController->setUsePen( false );
+ }
+ }
+ break;
+
+ case awt::Key::E:
+ if (mxSlideShowController.is())
+ {
+ mxSlideShowController->setEraseAllInk( true );
+ }
+ break;
+
+ case awt::Key::HOME:
+ if (mxSlideShowController.is())
+ {
+ mxSlideShowController->gotoFirstSlide();
+ }
+ break;
+
+ case awt::Key::END:
+ if (mxSlideShowController.is())
+ {
+ mxSlideShowController->gotoLastSlide();
+ }
+ break;
+
+ case awt::Key::W:
+ case awt::Key::COMMA:
+ if (mxSlideShowController.is())
+ {
+ if (mxSlideShowController->isPaused())
+ mxSlideShowController->resume();
+ else
+ mxSlideShowController->blankScreen(0x00ffffff);
+ }
+ break;
+
+ case awt::Key::B:
+ case awt::Key::POINT:
+ if (mxSlideShowController.is())
+ {
+ if (mxSlideShowController->isPaused())
+ mxSlideShowController->resume();
+ else
+ mxSlideShowController->blankScreen(0x00000000);
+ }
+ break;
+
+ case awt::Key::NUM0:
+ case awt::Key::NUM1:
+ case awt::Key::NUM2:
+ case awt::Key::NUM3:
+ case awt::Key::NUM4:
+ case awt::Key::NUM5:
+ case awt::Key::NUM6:
+ case awt::Key::NUM7:
+ case awt::Key::NUM8:
+ case awt::Key::NUM9:
+ HandleNumericKeyPress(rEvent.KeyCode-awt::Key::NUM0, rEvent.Modifiers);
+ break;
+
+ case awt::Key::RETURN:
+ if (mnPendingSlideNumber > 0)
+ {
+ if (mxSlideShowController.is())
+ mxSlideShowController->gotoSlideIndex(mnPendingSlideNumber - 1);
+ mnPendingSlideNumber = -1;
+ }
+ else
+ {
+ if (mxSlideShowController.is())
+ mxSlideShowController->gotoNextEffect();
+ }
+
+ break;
+
+ case awt::Key::F1:
+ // Toggle the help view.
+ if (mpWindowManager)
+ {
+ if (mpWindowManager->GetViewMode() != PresenterWindowManager::VM_Help)
+ mpWindowManager->SetViewMode(PresenterWindowManager::VM_Help);
+ else
+ mpWindowManager->SetHelpViewState(false);
+ }
+
+ break;
+
+ default:
+ // Tell all views about the unhandled key event.
+ for (const auto& rxPane : mpPaneContainer->maPanes)
+ {
+ if ( ! rxPane->mbIsActive)
+ continue;
+
+ Reference<awt::XKeyListener> xKeyListener (rxPane->mxView, UNO_QUERY);
+ if (xKeyListener.is())
+ xKeyListener->keyReleased(rEvent);
+ }
+ break;
+ }
+}
+
+void PresenterController::HandleNumericKeyPress (
+ const sal_Int32 nKey,
+ const sal_Int32 nModifiers)
+{
+ switch (nModifiers)
+ {
+ case 0:
+ if (mnPendingSlideNumber == -1)
+ mnPendingSlideNumber = 0;
+ UpdatePendingSlideNumber(mnPendingSlideNumber * 10 + nKey);
+ break;
+
+ case awt::KeyModifier::MOD1:
+ // Ctrl-1, Ctrl-2, and Ctrl-3 are used to switch between views
+ // (slide view, notes view, normal). Ctrl-4 switches monitors
+ mnPendingSlideNumber = -1;
+ if (!mpWindowManager)
+ return;
+ switch(nKey)
+ {
+ case 1:
+ mpWindowManager->SetViewMode(PresenterWindowManager::VM_Standard);
+ break;
+ case 2:
+ mpWindowManager->SetViewMode(PresenterWindowManager::VM_Notes);
+ break;
+ case 3:
+ mpWindowManager->SetViewMode(PresenterWindowManager::VM_SlideOverview);
+ break;
+ case 4:
+ SwitchMonitors();
+ break;
+ default:
+ // Ignore unsupported key.
+ break;
+ }
+ break;
+
+ default:
+ // Ignore unsupported modifiers.
+ break;
+ }
+}
+
+//----- XMouseListener --------------------------------------------------------
+
+void SAL_CALL PresenterController::mousePressed (const css::awt::MouseEvent&)
+{
+ if (mxMainWindow.is())
+ mxMainWindow->setFocus();
+}
+
+void SAL_CALL PresenterController::mouseReleased (const css::awt::MouseEvent&) {}
+
+void SAL_CALL PresenterController::mouseEntered (const css::awt::MouseEvent&) {}
+
+void SAL_CALL PresenterController::mouseExited (const css::awt::MouseEvent&) {}
+
+void PresenterController::InitializeMainPane (const Reference<XPane>& rxPane)
+{
+ if ( ! rxPane.is())
+ return;
+
+ mpAccessibleObject = new PresenterAccessible(
+ mxComponentContext,
+ this,
+ rxPane);
+
+ LoadTheme(rxPane);
+
+ // Main pane has been created and is now observed by the window
+ // manager.
+ mpWindowManager->SetParentPane(rxPane);
+ mpWindowManager->SetTheme(mpTheme);
+
+ if (mpPaneBorderPainter)
+ mpPaneBorderPainter->SetTheme(mpTheme);
+
+ // Add key listener
+ mxMainWindow = rxPane->getWindow();
+ if (mxMainWindow.is())
+ {
+ mxMainWindow->addKeyListener(this);
+ mxMainWindow->addMouseListener(this);
+ }
+ Reference<XPane2> xPane2 (rxPane, UNO_QUERY);
+ if (xPane2.is())
+ xPane2->setVisible(true);
+
+ mpPaintManager = std::make_shared<PresenterPaintManager>(mxMainWindow, mxPresenterHelper, mpPaneContainer);
+
+ mxCanvas.set(rxPane->getCanvas(), UNO_QUERY);
+
+ if (mxSlideShowController.is())
+ mxSlideShowController->activate();
+
+ UpdateCurrentSlide(0);
+}
+
+void PresenterController::LoadTheme (const Reference<XPane>& rxPane)
+{
+ // Create (load) the current theme.
+ if (rxPane.is())
+ mpTheme = std::make_shared<PresenterTheme>(mxComponentContext, rxPane->getCanvas());
+}
+
+double PresenterController::GetSlideAspectRatio() const
+{
+ double nSlideAspectRatio (28.0/21.0);
+
+ try
+ {
+ if (mxController.is())
+ {
+ Reference<drawing::XDrawPagesSupplier> xSlideSupplier (
+ mxController->getModel(), UNO_QUERY_THROW);
+ Reference<drawing::XDrawPages> xSlides (xSlideSupplier->getDrawPages());
+ if (xSlides.is() && xSlides->getCount()>0)
+ {
+ Reference<beans::XPropertySet> xProperties(xSlides->getByIndex(0),UNO_QUERY_THROW);
+ sal_Int32 nWidth (28000);
+ sal_Int32 nHeight (21000);
+ if ((xProperties->getPropertyValue("Width") >>= nWidth)
+ && (xProperties->getPropertyValue("Height") >>= nHeight)
+ && nHeight > 0)
+ {
+ nSlideAspectRatio = double(nWidth) / double(nHeight);
+ }
+ }
+ }
+ }
+ catch (RuntimeException&)
+ {
+ OSL_ASSERT(false);
+ }
+
+ return nSlideAspectRatio;
+}
+
+void PresenterController::UpdatePendingSlideNumber (const sal_Int32 nPendingSlideNumber)
+{
+ mnPendingSlideNumber = nPendingSlideNumber;
+
+ if (mpTheme == nullptr)
+ return;
+
+ if ( ! mxMainWindow.is())
+ return;
+
+ PresenterTheme::SharedFontDescriptor pFont (
+ mpTheme->GetFont("PendingSlideNumberFont"));
+ if (!pFont)
+ return;
+
+ pFont->PrepareFont(mxCanvas);
+ if ( ! pFont->mxFont.is())
+ return;
+
+ const OUString sText (OUString::number(mnPendingSlideNumber));
+ rendering::StringContext aContext (sText, 0, sText.getLength());
+ pFont->mxFont->createTextLayout(
+ aContext,
+ rendering::TextDirection::WEAK_LEFT_TO_RIGHT,
+ 0);
+}
+
+void PresenterController::SwitchMonitors()
+{
+ Reference<lang::XEventListener> xScreen( mxScreen );
+ if (!xScreen.is())
+ return;
+
+ PresenterScreen *pScreen = dynamic_cast<PresenterScreen *>(xScreen.get());
+ if (!pScreen)
+ return;
+
+ pScreen->SwitchMonitors();
+}
+
+void PresenterController::ExitPresenter()
+{
+ if( mxController.is() )
+ {
+ Reference< XPresentationSupplier > xPS( mxController->getModel(), UNO_QUERY );
+ if( xPS.is() )
+ {
+ Reference< XPresentation > xP( xPS->getPresentation() );
+ if( xP.is() )
+ xP->end();
+ }
+ }
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterController.hxx b/sdext/source/presenter/PresenterController.hxx
new file mode 100644
index 000000000..1a9d8a1aa
--- /dev/null
+++ b/sdext/source/presenter/PresenterController.hxx
@@ -0,0 +1,222 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERCONTROLLER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERCONTROLLER_HXX
+
+#include "PresenterAccessibility.hxx"
+#include "PresenterPaneContainer.hxx"
+#include "PresenterTheme.hxx"
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+#include <com/sun/star/awt/XKeyListener.hpp>
+#include <com/sun/star/awt/XMouseListener.hpp>
+#include <com/sun/star/drawing/XPresenterHelper.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/frame/XDispatch.hpp>
+#include <com/sun/star/presentation/XSlideShowController.hpp>
+#include <com/sun/star/frame/XFrameActionListener.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/util/XURLTransformer.hpp>
+#include <rtl/ref.hxx>
+#include <map>
+#include <memory>
+
+namespace sdext::presenter {
+
+class PresenterCanvasHelper;
+class PresenterPaintManager;
+class PresenterPaneAnimator;
+class PresenterPaneContainer;
+class PresenterPaneBorderPainter;
+class PresenterTheme;
+class PresenterWindowManager;
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::drawing::framework::XConfigurationChangeListener,
+ css::frame::XFrameActionListener,
+ css::awt::XKeyListener,
+ css::awt::XMouseListener
+> PresenterControllerInterfaceBase;
+
+/// Represents an element in the toolbar that shows the time elapsed since the presentation started.
+class IPresentationTime
+{
+public:
+ virtual void restart() = 0;
+ virtual bool isPaused() = 0;
+ virtual void setPauseStatus(const bool pauseStatus) = 0;
+ virtual ~IPresentationTime();
+};
+
+/** The controller of the presenter screen is responsible for telling the
+ individual views which slides to show. Additionally it provides access
+ to frequently used values of the current theme.
+*/
+class PresenterController
+ : protected ::cppu::BaseMutex,
+ public PresenterControllerInterfaceBase
+{
+public:
+ static ::rtl::Reference<PresenterController> Instance (
+ const css::uno::Reference<css::frame::XFrame>& rxFrame);
+
+ PresenterController (
+ const css::uno::WeakReference<css::lang::XEventListener> &rxScreen,
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const css::uno::Reference<css::presentation::XSlideShowController>& rxSlideShowController,
+ const rtl::Reference<PresenterPaneContainer>& rpPaneContainer,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxMainPaneId);
+ virtual ~PresenterController() override;
+
+ virtual void SAL_CALL disposing() override;
+
+ void UpdateCurrentSlide (const sal_Int32 nOffset);
+
+ SharedBitmapDescriptor
+ GetViewBackground (const OUString& rsViewURL) const;
+ PresenterTheme::SharedFontDescriptor
+ GetViewFont (const OUString& rsViewURL) const;
+ const std::shared_ptr<PresenterTheme>& GetTheme() const;
+ const ::rtl::Reference<PresenterWindowManager>& GetWindowManager() const;
+ const css::uno::Reference<css::presentation::XSlideShowController>&
+ GetSlideShowController() const;
+ const rtl::Reference<PresenterPaneContainer>& GetPaneContainer() const;
+ const ::rtl::Reference<PresenterPaneBorderPainter>& GetPaneBorderPainter() const;
+ const std::shared_ptr<PresenterCanvasHelper>& GetCanvasHelper() const;
+ const css::uno::Reference<css::drawing::XPresenterHelper>& GetPresenterHelper() const;
+ const std::shared_ptr<PresenterPaintManager>& GetPaintManager() const;
+ double GetSlideAspectRatio() const;
+ void ShowView (const OUString& rsViewURL);
+ void HideView (const OUString& rsViewURL);
+ void SwitchMonitors();
+ void ExitPresenter();
+ void DispatchUnoCommand (const OUString& rsCommand) const;
+ css::uno::Reference<css::frame::XDispatch> GetDispatch (
+ const css::util::URL& rURL) const;
+ css::util::URL CreateURLFromString (const OUString& rsURL) const;
+ const css::uno::Reference<css::drawing::framework::XConfigurationController>&
+ GetConfigurationController() const;
+ const css::uno::Reference<css::drawing::XDrawPage>& GetCurrentSlide() const;
+ static bool HasTransition (css::uno::Reference<css::drawing::XDrawPage> const & rxPage);
+ static bool HasCustomAnimation (css::uno::Reference<css::drawing::XDrawPage> const & rxPage);
+ void SetAccessibilityActiveState (const bool bIsActive);
+ bool IsAccessibilityActive() const { return mbIsAccessibilityActive;}
+
+ void HandleMouseClick (const css::awt::MouseEvent& rEvent);
+ void UpdatePaneTitles();
+
+ /** Request activation or deactivation of (some of) the views according
+ to the given parameters.
+ */
+ void RequestViews (
+ const bool bIsSlideSorterActive,
+ const bool bIsNotesViewActive,
+ const bool bIsHelpViewActive);
+
+ void SetPresentationTime(IPresentationTime* pPresentationTime);
+ IPresentationTime* GetPresentationTime();
+
+ // XConfigurationChangeListener
+
+ virtual void SAL_CALL notifyConfigurationChange (
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent) override;
+
+ // XEventListener
+
+ virtual void SAL_CALL disposing (
+ const css::lang::EventObject& rEvent) override;
+
+ // XFrameActionListener
+
+ virtual void SAL_CALL frameAction (
+ const css::frame::FrameActionEvent& rEvent) override;
+
+ // XKeyListener
+
+ virtual void SAL_CALL keyPressed (const css::awt::KeyEvent& rEvent) override;
+ virtual void SAL_CALL keyReleased (const css::awt::KeyEvent& rEvent) override;
+
+ // XMouseListener
+
+ virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) override;
+
+private:
+ typedef ::std::map<css::uno::Reference<css::frame::XFrame>,rtl::Reference<PresenterController> > InstanceContainer;
+ static InstanceContainer maInstances;
+
+ css::uno::WeakReference<css::lang::XEventListener> mxScreen;
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+ css::uno::Reference<css::rendering::XSpriteCanvas> mxCanvas;
+ css::uno::Reference<css::frame::XController> mxController;
+ css::uno::Reference<css::drawing::framework::XConfigurationController>
+ mxConfigurationController;
+ css::uno::Reference<css::presentation::XSlideShowController> mxSlideShowController;
+ css::uno::Reference<css::drawing::framework::XResourceId> mxMainPaneId;
+ rtl::Reference<PresenterPaneContainer> mpPaneContainer;
+ sal_Int32 mnCurrentSlideIndex;
+ css::uno::Reference<css::drawing::XDrawPage> mxCurrentSlide;
+ css::uno::Reference<css::drawing::XDrawPage> mxNextSlide;
+ ::rtl::Reference<PresenterWindowManager> mpWindowManager;
+ std::shared_ptr<PresenterTheme> mpTheme;
+ css::uno::Reference<css::awt::XWindow> mxMainWindow;
+ ::rtl::Reference<PresenterPaneBorderPainter> mpPaneBorderPainter;
+ std::shared_ptr<PresenterCanvasHelper> mpCanvasHelper;
+ css::uno::Reference<css::drawing::XPresenterHelper> mxPresenterHelper;
+ std::shared_ptr<PresenterPaintManager> mpPaintManager;
+ sal_Int32 mnPendingSlideNumber;
+ css::uno::Reference<css::util::XURLTransformer> mxUrlTransformer;
+ ::rtl::Reference<PresenterAccessible> mpAccessibleObject;
+ bool mbIsAccessibilityActive;
+ IPresentationTime* mpPresentationTime;
+
+ void GetSlides (const sal_Int32 nOffset);
+ void UpdateViews();
+ void InitializeMainPane (const css::uno::Reference<css::drawing::framework::XPane>& rxPane);
+ void LoadTheme (const css::uno::Reference<css::drawing::framework::XPane>& rxPane);
+ void UpdatePendingSlideNumber (const sal_Int32 nPendingSlideNumber);
+
+ /** This method is called when the user pressed one of the numerical
+ keys. Depending on the modifier, numeric keys switch to another
+ slide (no modifier), or change to another view (Ctrl modifier).
+ @param nKey
+ Numeric value that is printed on the pressed key. For example
+ pressing the key '4' will result in the value 4, not the ASCII
+ code (0x34?).
+ @param nModifiers
+ The modifier bit field as provided by the key up event.
+ */
+ void HandleNumericKeyPress (const sal_Int32 nKey, const sal_Int32 nModifiers);
+};
+
+} // end of namespace ::sdext::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterCurrentSlideObserver.cxx b/sdext/source/presenter/PresenterCurrentSlideObserver.cxx
new file mode 100644
index 000000000..0cd33d9c0
--- /dev/null
+++ b/sdext/source/presenter/PresenterCurrentSlideObserver.cxx
@@ -0,0 +1,130 @@
+/* -*- 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 "PresenterCurrentSlideObserver.hxx"
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sdext::presenter {
+
+//===== PresenterCurrentSlideObserver =========================================
+
+PresenterCurrentSlideObserver::PresenterCurrentSlideObserver (
+ const ::rtl::Reference<PresenterController>& rxPresenterController,
+ const Reference<presentation::XSlideShowController>& rxSlideShowController)
+ : PresenterCurrentSlideObserverInterfaceBase(m_aMutex),
+ mpPresenterController(rxPresenterController),
+ mxSlideShowController(rxSlideShowController)
+{
+ if( mpPresenterController.is() )
+ {
+ mpPresenterController->addEventListener(this);
+ }
+
+ if( mxSlideShowController.is() )
+ {
+ // Listen for events from the slide show controller.
+ mxSlideShowController->addSlideShowListener(static_cast<XSlideShowListener*>(this));
+ }
+}
+
+PresenterCurrentSlideObserver::~PresenterCurrentSlideObserver()
+{
+}
+
+void SAL_CALL PresenterCurrentSlideObserver::disposing()
+{
+ // Disconnect form the slide show controller.
+ if(mxSlideShowController.is())
+ {
+ mxSlideShowController->removeSlideShowListener(static_cast<XSlideShowListener*>(this));
+ mxSlideShowController = nullptr;
+ }
+
+ if (mpPresenterController.is())
+ mpPresenterController->removeEventListener(this);
+}
+
+//----- XSlideShowListener ----------------------------------------------------
+
+void SAL_CALL PresenterCurrentSlideObserver::beginEvent (
+ const Reference<animations::XAnimationNode>&)
+{}
+
+void SAL_CALL PresenterCurrentSlideObserver::endEvent (
+ const Reference<animations::XAnimationNode>&)
+{}
+
+void SAL_CALL PresenterCurrentSlideObserver::repeat (
+ const css::uno::Reference<css::animations::XAnimationNode>&,
+ sal_Int32)
+{}
+
+void SAL_CALL PresenterCurrentSlideObserver::paused()
+{
+}
+
+void SAL_CALL PresenterCurrentSlideObserver::resumed()
+{
+}
+
+void SAL_CALL PresenterCurrentSlideObserver::slideEnded (sal_Bool bReverse)
+{
+ // Determine whether the new current slide (the one after the one that
+ // just ended) is the slide past the last slide in the presentation,
+ // i.e. the one that says something like "click to end presentation...".
+ if (mxSlideShowController.is() && !bReverse)
+ if (mxSlideShowController->getNextSlideIndex() < 0)
+ if( mpPresenterController.is() )
+ mpPresenterController->UpdateCurrentSlide(+1);
+}
+
+void SAL_CALL PresenterCurrentSlideObserver::hyperLinkClicked (const OUString &)
+{
+}
+
+void SAL_CALL PresenterCurrentSlideObserver::slideTransitionStarted()
+{
+ if( mpPresenterController.is() )
+ mpPresenterController->UpdateCurrentSlide(0);
+}
+
+void SAL_CALL PresenterCurrentSlideObserver::slideTransitionEnded()
+{
+}
+
+void SAL_CALL PresenterCurrentSlideObserver::slideAnimationsEnded()
+{
+}
+
+//----- XEventListener --------------------------------------------------------
+
+void SAL_CALL PresenterCurrentSlideObserver::disposing (
+ const lang::EventObject& rEvent)
+{
+ if (rEvent.Source == Reference<XInterface>(static_cast<XWeak*>(mpPresenterController.get())))
+ dispose();
+ else if (rEvent.Source == mxSlideShowController)
+ mxSlideShowController = nullptr;
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterCurrentSlideObserver.hxx b/sdext/source/presenter/PresenterCurrentSlideObserver.hxx
new file mode 100644
index 000000000..786744bfb
--- /dev/null
+++ b/sdext/source/presenter/PresenterCurrentSlideObserver.hxx
@@ -0,0 +1,81 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERCURRENTSLIDEOBSERVER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERCURRENTSLIDEOBSERVER_HXX
+
+#include "PresenterController.hxx"
+#include <com/sun/star/presentation/XSlideShowController.hpp>
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+#include <rtl/ref.hxx>
+
+namespace sdext::presenter {
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::presentation::XSlideShowListener
+> PresenterCurrentSlideObserverInterfaceBase;
+
+/** Check periodically the slide show controller and the
+ frame::XController whether the current slide has changed. If so,
+ then inform the presenter controller about it.
+
+ Objects of this class have their own lifetime control and destroy
+ themselves when the presenter controller is disposed.
+*/
+class PresenterCurrentSlideObserver
+ : protected ::cppu::BaseMutex,
+ public PresenterCurrentSlideObserverInterfaceBase
+{
+public:
+ PresenterCurrentSlideObserver (
+ const ::rtl::Reference<PresenterController>& rxPresenterController,
+ const css::uno::Reference<css::presentation::XSlideShowController>& rxSlideShowController);
+ virtual ~PresenterCurrentSlideObserver() override;
+
+ virtual void SAL_CALL disposing() override;
+
+ // XSlideShowListener
+ virtual void SAL_CALL paused( ) override;
+ virtual void SAL_CALL resumed( ) override;
+ virtual void SAL_CALL slideTransitionStarted( ) override;
+ virtual void SAL_CALL slideTransitionEnded( ) override;
+ virtual void SAL_CALL slideAnimationsEnded( ) override;
+ virtual void SAL_CALL slideEnded(sal_Bool bReverse) override;
+ virtual void SAL_CALL hyperLinkClicked( const OUString& hyperLink ) override;
+
+ // XAnimationListener
+ virtual void SAL_CALL beginEvent( const css::uno::Reference< css::animations::XAnimationNode >& Node ) override;
+ virtual void SAL_CALL endEvent( const css::uno::Reference< css::animations::XAnimationNode >& Node ) override;
+ virtual void SAL_CALL repeat( const css::uno::Reference< css::animations::XAnimationNode >& Node, ::sal_Int32 Repeat ) override;
+
+ // XEventListener
+ virtual void SAL_CALL disposing (
+ const css::lang::EventObject& rEvent) override;
+
+private:
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ css::uno::Reference<css::presentation::XSlideShowController> mxSlideShowController;
+};
+
+} // end of namespace ::sdext::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterFrameworkObserver.cxx b/sdext/source/presenter/PresenterFrameworkObserver.cxx
new file mode 100644
index 000000000..0f56da0b0
--- /dev/null
+++ b/sdext/source/presenter/PresenterFrameworkObserver.cxx
@@ -0,0 +1,109 @@
+/* -*- 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 "PresenterFrameworkObserver.hxx"
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+
+namespace sdext::presenter {
+
+PresenterFrameworkObserver::PresenterFrameworkObserver (
+ const css::uno::Reference<css::drawing::framework::XConfigurationController>&rxController,
+ const Action& rAction)
+ : PresenterFrameworkObserverInterfaceBase(m_aMutex),
+ mxConfigurationController(rxController),
+ maAction(rAction)
+{
+ if ( ! mxConfigurationController.is())
+ throw lang::IllegalArgumentException();
+
+ if (mxConfigurationController->hasPendingRequests())
+ {
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ "ConfigurationUpdateEnd",
+ Any());
+ }
+ else
+ {
+ rAction(true);
+ }
+}
+
+PresenterFrameworkObserver::~PresenterFrameworkObserver()
+{
+}
+
+void PresenterFrameworkObserver::RunOnUpdateEnd (
+ const css::uno::Reference<css::drawing::framework::XConfigurationController>&rxController,
+ const Action& rAction)
+{
+ new PresenterFrameworkObserver(
+ rxController,
+ rAction);
+}
+
+void SAL_CALL PresenterFrameworkObserver::disposing()
+{
+ if (maAction)
+ maAction(false);
+ Shutdown();
+}
+
+void PresenterFrameworkObserver::Shutdown()
+{
+ maAction = Action();
+ if (mxConfigurationController != nullptr)
+ {
+ mxConfigurationController->removeConfigurationChangeListener(this);
+ mxConfigurationController = nullptr;
+ }
+}
+
+void SAL_CALL PresenterFrameworkObserver::disposing (const lang::EventObject& rEvent)
+{
+ if ( ! rEvent.Source.is())
+ return;
+
+ if (rEvent.Source == mxConfigurationController)
+ {
+ mxConfigurationController = nullptr;
+ if (maAction)
+ maAction(false);
+ }
+}
+
+void SAL_CALL PresenterFrameworkObserver::notifyConfigurationChange (
+ const ConfigurationChangeEvent& /*rEvent*/)
+{
+ Action aAction(maAction);
+ Shutdown();
+ aAction(true);
+
+ maAction = nullptr;
+ dispose();
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterFrameworkObserver.hxx b/sdext/source/presenter/PresenterFrameworkObserver.hxx
new file mode 100644
index 000000000..bc4b4bda1
--- /dev/null
+++ b/sdext/source/presenter/PresenterFrameworkObserver.hxx
@@ -0,0 +1,81 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERFRAMEWORKOBSERVER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERFRAMEWORKOBSERVER_HXX
+
+#include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+
+#include <functional>
+
+namespace sdext::presenter {
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::drawing::framework::XConfigurationChangeListener
+ > PresenterFrameworkObserverInterfaceBase;
+
+/** Watch the drawing framework for changes and run callbacks when a certain
+ change takes place.
+*/
+class PresenterFrameworkObserver
+ : private ::cppu::BaseMutex,
+ public PresenterFrameworkObserverInterfaceBase
+{
+public:
+ typedef ::std::function<void (bool)> Action;
+
+ PresenterFrameworkObserver(const PresenterFrameworkObserver&) = delete;
+ PresenterFrameworkObserver& operator=(const PresenterFrameworkObserver&) = delete;
+
+ static void RunOnUpdateEnd (
+ const css::uno::Reference<css::drawing::framework::XConfigurationController>&rxController,
+ const Action& rAction);
+
+ virtual void SAL_CALL disposing() override;
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+ virtual void SAL_CALL notifyConfigurationChange (
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent) override;
+
+private:
+ css::uno::Reference<css::drawing::framework::XConfigurationController> mxConfigurationController;
+ Action maAction;
+
+ /** Create a new PresenterFrameworkObserver object.
+ @param rPredicate
+ This functor tests whether the action is to be executed or not.
+ @param rAction
+ The functor to execute when the predicate returns true,
+ e.g. when some resource has been created.
+ */
+ PresenterFrameworkObserver (
+ const css::uno::Reference<css::drawing::framework::XConfigurationController>&rxController,
+ const Action& rAction);
+ virtual ~PresenterFrameworkObserver() override;
+
+ void Shutdown();
+};
+
+} // end of namespace ::sdext::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterGeometryHelper.cxx b/sdext/source/presenter/PresenterGeometryHelper.cxx
new file mode 100644
index 000000000..b2ad35c63
--- /dev/null
+++ b/sdext/source/presenter/PresenterGeometryHelper.cxx
@@ -0,0 +1,262 @@
+/* -*- 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 "PresenterGeometryHelper.hxx"
+
+#include <math.h>
+#include <algorithm>
+#include <o3tl/safeint.hxx>
+
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace {
+
+sal_Int32 Right (const awt::Rectangle& rBox)
+{
+ return rBox.X + rBox.Width - 1;
+}
+
+sal_Int32 Bottom (const awt::Rectangle& rBox)
+{
+ return rBox.Y + rBox.Height - 1;
+}
+
+sal_Int32 Width (const sal_Int32 nLeft, const sal_Int32 nRight)
+{
+ return nRight - nLeft + 1;
+}
+
+sal_Int32 Height (const sal_Int32 nTop, const sal_Int32 nBottom)
+{
+ return nBottom - nTop + 1;
+}
+
+} // end of anonymous namespace
+
+namespace sdext::presenter {
+
+sal_Int32 PresenterGeometryHelper::Floor (const double nValue)
+{
+ return sal::static_int_cast<sal_Int32>(floor(nValue));
+}
+
+sal_Int32 PresenterGeometryHelper::Ceil (const double nValue)
+{
+ return sal::static_int_cast<sal_Int32>(ceil(nValue));
+}
+
+sal_Int32 PresenterGeometryHelper::Round (const double nValue)
+{
+ return sal::static_int_cast<sal_Int32>(floor(0.5 + nValue));
+}
+
+awt::Rectangle PresenterGeometryHelper::ConvertRectangle (
+ const geometry::RealRectangle2D& rBox)
+{
+ const sal_Int32 nLeft (Floor(rBox.X1));
+ const sal_Int32 nTop (Floor(rBox.Y1));
+ const sal_Int32 nRight (Ceil(rBox.X2));
+ const sal_Int32 nBottom (Ceil(rBox.Y2));
+ return awt::Rectangle (nLeft,nTop,nRight-nLeft,nBottom-nTop);
+}
+
+awt::Rectangle PresenterGeometryHelper::ConvertRectangleWithConstantSize (
+ const geometry::RealRectangle2D& rBox)
+{
+ return awt::Rectangle (
+ Round(rBox.X1),
+ Round(rBox.Y1),
+ Round(rBox.X2 - rBox.X1),
+ Round(rBox.Y2 - rBox.Y1));
+}
+
+geometry::RealRectangle2D PresenterGeometryHelper::ConvertRectangle (
+ const css::awt::Rectangle& rBox)
+{
+ return geometry::RealRectangle2D(
+ rBox.X,
+ rBox.Y,
+ rBox.X + rBox.Width,
+ rBox.Y + rBox.Height);
+}
+
+awt::Rectangle PresenterGeometryHelper::TranslateRectangle (
+ const css::awt::Rectangle& rBox,
+ const sal_Int32 nXOffset,
+ const sal_Int32 nYOffset)
+{
+ return awt::Rectangle(rBox.X + nXOffset, rBox.Y + nYOffset, rBox.Width, rBox.Height);
+}
+
+awt::Rectangle PresenterGeometryHelper::Intersection (
+ const css::awt::Rectangle& rBox1,
+ const css::awt::Rectangle& rBox2)
+{
+ const sal_Int32 nLeft (::std::max(rBox1.X, rBox2.X));
+ const sal_Int32 nTop (::std::max(rBox1.Y, rBox2.Y));
+ const sal_Int32 nRight (::std::min(Right(rBox1), Right(rBox2)));
+ const sal_Int32 nBottom (::std::min(Bottom(rBox1), Bottom(rBox2)));
+ if (nLeft >= nRight || nTop >= nBottom)
+ return awt::Rectangle();
+ else
+ return awt::Rectangle(nLeft,nTop, Width(nLeft,nRight), Height(nTop,nBottom));
+}
+
+geometry::RealRectangle2D PresenterGeometryHelper::Intersection (
+ const geometry::RealRectangle2D& rBox1,
+ const geometry::RealRectangle2D& rBox2)
+{
+ const double nLeft (::std::max(rBox1.X1, rBox2.X1));
+ const double nTop (::std::max(rBox1.Y1, rBox2.Y1));
+ const double nRight (::std::min(rBox1.X2, rBox2.X2));
+ const double nBottom (::std::min(rBox1.Y2, rBox2.Y2));
+ if (nLeft >= nRight || nTop >= nBottom)
+ return geometry::RealRectangle2D(0,0,0,0);
+ else
+ return geometry::RealRectangle2D(nLeft,nTop, nRight, nBottom);
+}
+
+bool PresenterGeometryHelper::IsInside (
+ const css::geometry::RealRectangle2D& rBox,
+ const css::geometry::RealPoint2D& rPoint)
+{
+ return rBox.X1 <= rPoint.X
+ && rBox.Y1 <= rPoint.Y
+ && rBox.X2 >= rPoint.X
+ && rBox.Y2 >= rPoint.Y;
+}
+
+bool PresenterGeometryHelper::IsInside (
+ const css::awt::Rectangle& rBox1,
+ const css::awt::Rectangle& rBox2)
+{
+ return rBox1.X >= rBox2.X
+ && rBox1.Y >= rBox2.Y
+ && rBox1.X+rBox1.Width <= rBox2.X+rBox2.Width
+ && rBox1.Y+rBox1.Height <= rBox2.Y+rBox2.Height;
+}
+
+geometry::RealRectangle2D PresenterGeometryHelper::Union (
+ const geometry::RealRectangle2D& rBox1,
+ const geometry::RealRectangle2D& rBox2)
+{
+ const double nLeft (::std::min(rBox1.X1, rBox2.X1));
+ const double nTop (::std::min(rBox1.Y1, rBox2.Y1));
+ const double nRight (::std::max(rBox1.X2, rBox2.X2));
+ const double nBottom (::std::max(rBox1.Y2, rBox2.Y2));
+ if (nLeft >= nRight || nTop >= nBottom)
+ return geometry::RealRectangle2D(0,0,0,0);
+ else
+ return geometry::RealRectangle2D(nLeft,nTop, nRight, nBottom);
+}
+
+bool PresenterGeometryHelper::AreRectanglesDisjoint (
+ const css::awt::Rectangle& rBox1,
+ const css::awt::Rectangle& rBox2)
+{
+ return rBox1.X+rBox1.Width <= rBox2.X
+ || rBox1.Y+rBox1.Height <= rBox2.Y
+ || rBox1.X >= rBox2.X+rBox2.Width
+ || rBox1.Y >= rBox2.Y+rBox2.Height;
+}
+
+Reference<rendering::XPolyPolygon2D> PresenterGeometryHelper::CreatePolygon(
+ const awt::Rectangle& rBox,
+ const Reference<rendering::XGraphicDevice>& rxDevice)
+{
+ if ( ! rxDevice.is())
+ return nullptr;
+
+ Sequence<Sequence<geometry::RealPoint2D> > aPoints
+ {
+ {
+ { o3tl::narrowing<double>(rBox.X), o3tl::narrowing<double>(rBox.Y) },
+ { o3tl::narrowing<double>(rBox.X), o3tl::narrowing<double>(rBox.Y+rBox.Height) },
+ { o3tl::narrowing<double>(rBox.X+rBox.Width), o3tl::narrowing<double>(rBox.Y+rBox.Height) },
+ { o3tl::narrowing<double>(rBox.X+rBox.Width), o3tl::narrowing<double>(rBox.Y) }
+ }
+ };
+ Reference<rendering::XLinePolyPolygon2D> xPolygon (
+ rxDevice->createCompatibleLinePolyPolygon(aPoints));
+ if (xPolygon.is())
+ xPolygon->setClosed(0, true);
+
+ return xPolygon;
+}
+
+Reference<rendering::XPolyPolygon2D> PresenterGeometryHelper::CreatePolygon(
+ const geometry::RealRectangle2D& rBox,
+ const Reference<rendering::XGraphicDevice>& rxDevice)
+{
+ if ( ! rxDevice.is())
+ return nullptr;
+
+ Sequence<Sequence<geometry::RealPoint2D> > aPoints
+ {
+ {
+ { rBox.X1, rBox.Y1 },
+ { rBox.X1, rBox.Y2 },
+ { rBox.X2, rBox.Y2 },
+ { rBox.X2, rBox.Y1 }
+ }
+ };
+ Reference<rendering::XLinePolyPolygon2D> xPolygon (
+ rxDevice->createCompatibleLinePolyPolygon(aPoints));
+ if (xPolygon.is())
+ xPolygon->setClosed(0, true);
+
+ return xPolygon;
+}
+
+Reference<rendering::XPolyPolygon2D> PresenterGeometryHelper::CreatePolygon(
+ const ::std::vector<css::awt::Rectangle>& rBoxes,
+ const Reference<rendering::XGraphicDevice>& rxDevice)
+{
+ if ( ! rxDevice.is())
+ return nullptr;
+
+ const sal_Int32 nCount (rBoxes.size());
+ Sequence<Sequence<geometry::RealPoint2D> > aPoints(nCount);
+ auto aPointsRange = asNonConstRange(aPoints);
+ for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
+ {
+ const awt::Rectangle& rBox (rBoxes[nIndex]);
+ aPointsRange[nIndex] = Sequence<geometry::RealPoint2D>
+ {
+ { o3tl::narrowing<double>(rBox.X), o3tl::narrowing<double>(rBox.Y) },
+ { o3tl::narrowing<double>(rBox.X), o3tl::narrowing<double>(rBox.Y+rBox.Height) },
+ { o3tl::narrowing<double>(rBox.X+rBox.Width), o3tl::narrowing<double>(rBox.Y+rBox.Height) },
+ { o3tl::narrowing<double>(rBox.X+rBox.Width), o3tl::narrowing<double>(rBox.Y) }
+ };
+ }
+
+ Reference<rendering::XLinePolyPolygon2D> xPolygon (
+ rxDevice->createCompatibleLinePolyPolygon(aPoints));
+ if (xPolygon.is())
+ for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
+ xPolygon->setClosed(nIndex, true);
+
+ return xPolygon;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterGeometryHelper.hxx b/sdext/source/presenter/PresenterGeometryHelper.hxx
new file mode 100644
index 000000000..c2f55757e
--- /dev/null
+++ b/sdext/source/presenter/PresenterGeometryHelper.hxx
@@ -0,0 +1,117 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERGEOMETRYHELPER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERGEOMETRYHELPER_HXX
+
+#include <com/sun/star/awt/Rectangle.hpp>
+#include <com/sun/star/rendering/XGraphicDevice.hpp>
+#include <com/sun/star/rendering/XPolyPolygon2D.hpp>
+#include <com/sun/star/geometry/RealRectangle2D.hpp>
+#include <vector>
+
+namespace sdext::presenter {
+
+/** Collection of geometry related convenience functions.
+*/
+class PresenterGeometryHelper
+{
+public:
+ static sal_Int32 Round (const double nValue);
+ static sal_Int32 Floor (const double nValue);
+ static sal_Int32 Ceil (const double nValue);
+
+ /** Return the bounding box with integer coordinates of the given
+ rectangle. Note that due to different rounding of the left/top and
+ the right/bottom border the width of the resulting rectangle may
+ differ for different positions but constant width and height.
+ */
+ static css::awt::Rectangle ConvertRectangle (
+ const css::geometry::RealRectangle2D& rBox);
+
+ /** Convert the given rectangle to integer coordinates so that width and
+ height remain constant when only the position changes.
+ */
+ static css::awt::Rectangle ConvertRectangleWithConstantSize (
+ const css::geometry::RealRectangle2D& rBox);
+
+ static css::geometry::RealRectangle2D ConvertRectangle (
+ const css::awt::Rectangle& rBox);
+
+ // static css::awt::Size ConvertSize (
+ // const css::geometry::RealSize2D& rSize);
+
+ static css::awt::Rectangle TranslateRectangle (
+ const css::awt::Rectangle& rBox,
+ const sal_Int32 nXOffset,
+ const sal_Int32 nYOffset);
+
+ static css::awt::Rectangle Intersection (
+ const css::awt::Rectangle& rBox1,
+ const css::awt::Rectangle& rBox2);
+
+ static css::geometry::RealRectangle2D Intersection (
+ const css::geometry::RealRectangle2D& rBox1,
+ const css::geometry::RealRectangle2D& rBox2);
+
+ static bool IsInside (
+ const css::geometry::RealRectangle2D& rBox,
+ const css::geometry::RealPoint2D& rPoint);
+
+ /** Return whether rBox1 is completely inside rBox2.
+ */
+ static bool IsInside (
+ const css::awt::Rectangle& rBox1,
+ const css::awt::Rectangle& rBox2);
+
+ static css::geometry::RealRectangle2D Union (
+ const css::geometry::RealRectangle2D& rBox1,
+ const css::geometry::RealRectangle2D& rBox2);
+
+ static bool AreRectanglesDisjoint (
+ const css::awt::Rectangle& rBox1,
+ const css::awt::Rectangle& rBox2);
+
+ static css::uno::Reference<css::rendering::XPolyPolygon2D> CreatePolygon(
+ const css::awt::Rectangle& rBox,
+ const css::uno::Reference<css::rendering::XGraphicDevice>& rxDevice);
+
+ static css::uno::Reference<css::rendering::XPolyPolygon2D> CreatePolygon(
+ const css::geometry::RealRectangle2D& rBox,
+ const css::uno::Reference<css::rendering::XGraphicDevice>& rxDevice);
+
+ static css::uno::Reference<css::rendering::XPolyPolygon2D> CreatePolygon(
+ const ::std::vector<css::awt::Rectangle>& rBoxes,
+ const css::uno::Reference<css::rendering::XGraphicDevice>& rxDevice);
+
+ /** Create a polygon for a rounded rectangle.
+ */
+ /* static css::uno::Reference<css::rendering::XPolyPolygon2D> CreatePolygon(
+ const css::awt::Rectangle& rBox,
+ const double nRadius,
+ const css::uno::Reference<css::rendering::XGraphicDevice>&
+ rxDevice);
+ */
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterHelpView.cxx b/sdext/source/presenter/PresenterHelpView.cxx
new file mode 100644
index 000000000..74adeedd1
--- /dev/null
+++ b/sdext/source/presenter/PresenterHelpView.cxx
@@ -0,0 +1,747 @@
+/* -*- 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 <vcl/settings.hxx>
+#include "PresenterHelpView.hxx"
+#include "PresenterButton.hxx"
+#include "PresenterCanvasHelper.hxx"
+#include "PresenterGeometryHelper.hxx"
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <com/sun/star/rendering/TextDirection.hpp>
+#include <com/sun/star/util/Color.hpp>
+#include <algorithm>
+#include <numeric>
+#include <string_view>
+#include <vector>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+using ::std::vector;
+
+namespace sdext::presenter {
+
+namespace {
+ const sal_Int32 gnHorizontalGap (20);
+ const sal_Int32 gnVerticalBorder (30);
+ const sal_Int32 gnVerticalButtonPadding (12);
+
+ class LineDescriptor
+ {
+ public:
+ LineDescriptor();
+ void AddPart (
+ std::u16string_view rsLine,
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont);
+ bool IsEmpty() const;
+
+ OUString msLine;
+ geometry::RealSize2D maSize;
+ double mnVerticalOffset;
+
+ void CalculateSize (const css::uno::Reference<css::rendering::XCanvasFont>& rxFont);
+ };
+
+ class LineDescriptorList
+ {
+ public:
+ LineDescriptorList (
+ const OUString& rsText,
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const sal_Int32 nMaximalWidth);
+
+ void Update (
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const sal_Int32 nMaximalWidth);
+
+ double Paint(
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const geometry::RealRectangle2D& rBBox,
+ const bool bFlushLeft,
+ const rendering::ViewState& rViewState,
+ rendering::RenderState& rRenderState,
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont) const;
+ double GetHeight() const;
+
+ private:
+ const OUString msText;
+ std::shared_ptr<vector<LineDescriptor> > mpLineDescriptors;
+
+ static void SplitText (const OUString& rsText, vector<OUString>& rTextParts);
+ void FormatText (
+ const vector<OUString>& rTextParts,
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const sal_Int32 nMaximalWidth);
+ };
+
+ class Block
+ {
+ public:
+ Block (
+ const OUString& rsLeftText,
+ const OUString& rsRightText,
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const sal_Int32 nMaximalWidth);
+ Block(const Block&) = delete;
+ Block& operator=(const Block&) = delete;
+ void Update (
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const sal_Int32 nMaximalWidth);
+
+ LineDescriptorList maLeft;
+ LineDescriptorList maRight;
+ };
+} // end of anonymous namespace
+
+class PresenterHelpView::TextContainer : public vector<std::shared_ptr<Block> >
+{
+};
+
+PresenterHelpView::PresenterHelpView (
+ const Reference<uno::XComponentContext>& rxContext,
+ const Reference<XResourceId>& rxViewId,
+ const Reference<frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterHelpViewInterfaceBase(m_aMutex),
+ mxComponentContext(rxContext),
+ mxViewId(rxViewId),
+ mpPresenterController(rpPresenterController),
+ mnSeparatorY(0),
+ mnMaximalWidth(0)
+{
+ try
+ {
+ // Get the content window via the pane anchor.
+ Reference<XControllerManager> xCM (rxController, UNO_QUERY_THROW);
+ Reference<XConfigurationController> xCC (
+ xCM->getConfigurationController(), UNO_SET_THROW);
+ mxPane.set(xCC->getResource(rxViewId->getAnchor()), UNO_QUERY_THROW);
+
+ mxWindow = mxPane->getWindow();
+ ProvideCanvas();
+
+ mxWindow->addWindowListener(this);
+ mxWindow->addPaintListener(this);
+ Reference<awt::XWindowPeer> xPeer (mxWindow, UNO_QUERY);
+ if (xPeer.is())
+ xPeer->setBackground(util::Color(0xff000000));
+ mxWindow->setVisible(true);
+
+ if (mpPresenterController.is())
+ {
+ mpFont = mpPresenterController->GetViewFont(mxViewId->getResourceURL());
+ if (mpFont)
+ {
+ mpFont->PrepareFont(mxCanvas);
+ }
+ }
+
+ // Create the close button.
+ mpCloseButton = PresenterButton::Create(
+ mxComponentContext,
+ mpPresenterController,
+ mpPresenterController->GetTheme(),
+ mxWindow,
+ mxCanvas,
+ "HelpViewCloser");
+
+ ReadHelpStrings();
+ Resize();
+ }
+ catch (RuntimeException&)
+ {
+ mxViewId = nullptr;
+ mxWindow = nullptr;
+ throw;
+ }
+}
+
+PresenterHelpView::~PresenterHelpView()
+{
+}
+
+void SAL_CALL PresenterHelpView::disposing()
+{
+ mxViewId = nullptr;
+
+ if (mpCloseButton.is())
+ {
+ Reference<lang::XComponent> xComponent = mpCloseButton;
+ mpCloseButton = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ if (mxWindow.is())
+ {
+ mxWindow->removeWindowListener(this);
+ mxWindow->removePaintListener(this);
+ }
+}
+
+//----- lang::XEventListener --------------------------------------------------
+
+void SAL_CALL PresenterHelpView::disposing (const lang::EventObject& rEventObject)
+{
+ if (rEventObject.Source == mxCanvas)
+ {
+ mxCanvas = nullptr;
+ }
+ else if (rEventObject.Source == mxWindow)
+ {
+ mxWindow = nullptr;
+ dispose();
+ }
+}
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL PresenterHelpView::windowResized (const awt::WindowEvent&)
+{
+ ThrowIfDisposed();
+ Resize();
+}
+
+void SAL_CALL PresenterHelpView::windowMoved (const awt::WindowEvent&)
+{
+ ThrowIfDisposed();
+}
+
+void SAL_CALL PresenterHelpView::windowShown (const lang::EventObject&)
+{
+ ThrowIfDisposed();
+ Resize();
+}
+
+void SAL_CALL PresenterHelpView::windowHidden (const lang::EventObject&)
+{
+ ThrowIfDisposed();
+}
+
+//----- XPaintListener --------------------------------------------------------
+
+void SAL_CALL PresenterHelpView::windowPaint (const css::awt::PaintEvent& rEvent)
+{
+ Paint(rEvent.UpdateRect);
+}
+
+void PresenterHelpView::Paint (const awt::Rectangle& rUpdateBox)
+{
+ ProvideCanvas();
+ if ( ! mxCanvas.is())
+ return;
+
+ // Clear background.
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ mpPresenterController->GetCanvasHelper()->Paint(
+ mpPresenterController->GetViewBackground(mxViewId->getResourceURL()),
+ mxCanvas,
+ rUpdateBox,
+ awt::Rectangle(0,0,aWindowBox.Width,aWindowBox.Height),
+ awt::Rectangle());
+
+ // Paint vertical divider.
+
+ rendering::ViewState aViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ PresenterGeometryHelper::CreatePolygon(rUpdateBox, mxCanvas->getDevice()));
+
+ rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, mpFont->mnColor);
+
+ mxCanvas->drawLine(
+ geometry::RealPoint2D((aWindowBox.Width/2.0), gnVerticalBorder),
+ geometry::RealPoint2D((aWindowBox.Width/2.0), mnSeparatorY - gnVerticalBorder),
+ aViewState,
+ aRenderState);
+
+ // Paint the horizontal separator.
+ mxCanvas->drawLine(
+ geometry::RealPoint2D(0, mnSeparatorY),
+ geometry::RealPoint2D(aWindowBox.Width, mnSeparatorY),
+ aViewState,
+ aRenderState);
+
+ // Paint text.
+ double nY (gnVerticalBorder);
+ for (const auto& rxBlock : *mpTextContainer)
+ {
+ sal_Int32 LeftX1 = gnHorizontalGap;
+ sal_Int32 LeftX2 = aWindowBox.Width/2 - gnHorizontalGap;
+ sal_Int32 RightX1 = aWindowBox.Width/2 + gnHorizontalGap;
+ sal_Int32 RightX2 = aWindowBox.Width - gnHorizontalGap;
+ /* check whether RTL interface or not
+ then replace the windowbox position */
+ if(AllSettings::GetLayoutRTL())
+ {
+ LeftX1 = aWindowBox.Width/2 + gnHorizontalGap;
+ LeftX2 = aWindowBox.Width - gnHorizontalGap;
+ RightX1 = gnHorizontalGap;
+ RightX2 = aWindowBox.Width/2 - gnHorizontalGap;
+ }
+ const double nLeftHeight (
+ rxBlock->maLeft.Paint(mxCanvas,
+ geometry::RealRectangle2D(
+ LeftX1,
+ nY,
+ LeftX2,
+ aWindowBox.Height - gnVerticalBorder),
+ false,
+ aViewState,
+ aRenderState,
+ mpFont->mxFont));
+ const double nRightHeight (
+ rxBlock->maRight.Paint(mxCanvas,
+ geometry::RealRectangle2D(
+ RightX1,
+ nY,
+ RightX2,
+ aWindowBox.Height - gnVerticalBorder),
+ true,
+ aViewState,
+ aRenderState,
+ mpFont->mxFont));
+
+ nY += ::std::max(nLeftHeight,nRightHeight);
+ }
+
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ xSpriteCanvas->updateScreen(false);
+}
+
+void PresenterHelpView::ReadHelpStrings()
+{
+ mpTextContainer.reset(new TextContainer);
+ PresenterConfigurationAccess aConfiguration (
+ mxComponentContext,
+ "/org.openoffice.Office.PresenterScreen/",
+ PresenterConfigurationAccess::READ_ONLY);
+ Reference<container::XNameAccess> xStrings (
+ aConfiguration.GetConfigurationNode("PresenterScreenSettings/HelpView/HelpStrings"),
+ UNO_QUERY);
+ PresenterConfigurationAccess::ForAll(
+ xStrings,
+ [this](OUString const&, uno::Reference<beans::XPropertySet> const& xProps)
+ {
+ return this->ProcessString(xProps);
+ });
+}
+
+void PresenterHelpView::ProcessString (
+ const Reference<beans::XPropertySet>& rsProperties)
+{
+ if ( ! rsProperties.is())
+ return;
+
+ OUString sLeftText;
+ PresenterConfigurationAccess::GetProperty(rsProperties, "Left") >>= sLeftText;
+ OUString sRightText;
+ PresenterConfigurationAccess::GetProperty(rsProperties, "Right") >>= sRightText;
+ mpTextContainer->push_back(
+ std::make_shared<Block>(
+ sLeftText, sRightText, mpFont->mxFont, mnMaximalWidth));
+}
+
+void PresenterHelpView::CheckFontSize()
+{
+ if (!mpFont)
+ return;
+
+ sal_Int32 nBestSize (6);
+
+ // Scaling down and then reformatting can cause the text to be too large
+ // still. So do this again and again until the text size is
+ // small enough. Restrict the number of loops.
+ for (int nLoopCount=0; nLoopCount<5; ++nLoopCount)
+ {
+ double nY = std::accumulate(mpTextContainer->begin(), mpTextContainer->end(), double(0),
+ [](const double& sum, const std::shared_ptr<Block>& rxBlock) {
+ return sum + std::max(
+ rxBlock->maLeft.GetHeight(),
+ rxBlock->maRight.GetHeight());
+ });
+
+ const double nHeightDifference (nY - (mnSeparatorY-gnVerticalBorder));
+ if (nHeightDifference <= 0 && nHeightDifference > -50)
+ {
+ // We have found a good font size that is large and leaves not
+ // too much space below the help text.
+ return;
+ }
+
+ // Use a simple linear transformation to calculate initial guess of
+ // a size that lets all help text be shown inside the window.
+ const double nScale (double(mnSeparatorY-gnVerticalBorder) / nY);
+ if (nScale > 1.0 && nScale < 1.05)
+ break;
+
+ sal_Int32 nFontSizeGuess (sal_Int32(mpFont->mnSize * nScale));
+ if (nHeightDifference<=0 && mpFont->mnSize>nBestSize)
+ nBestSize = mpFont->mnSize;
+ mpFont->mnSize = nFontSizeGuess;
+ mpFont->mxFont = nullptr;
+ mpFont->PrepareFont(mxCanvas);
+
+ // Reformat blocks.
+ for (auto& rxBlock : *mpTextContainer)
+ rxBlock->Update(mpFont->mxFont, mnMaximalWidth);
+ }
+
+ if (nBestSize != mpFont->mnSize)
+ {
+ mpFont->mnSize = nBestSize;
+ mpFont->mxFont = nullptr;
+ mpFont->PrepareFont(mxCanvas);
+
+ // Reformat blocks.
+ for (auto& rxBlock : *mpTextContainer)
+ {
+ rxBlock->Update(mpFont->mxFont, mnMaximalWidth);
+ }
+ }
+}
+
+//----- XResourceId -----------------------------------------------------------
+
+Reference<XResourceId> SAL_CALL PresenterHelpView::getResourceId()
+{
+ ThrowIfDisposed();
+ return mxViewId;
+}
+
+sal_Bool SAL_CALL PresenterHelpView::isAnchorOnly()
+{
+ return false;
+}
+
+
+void PresenterHelpView::ProvideCanvas()
+{
+ if ( ! mxCanvas.is() && mxPane.is())
+ {
+ mxCanvas = mxPane->getCanvas();
+ if ( ! mxCanvas.is())
+ return;
+ Reference<lang::XComponent> xComponent (mxCanvas, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->addEventListener(static_cast<awt::XPaintListener*>(this));
+
+ if (mpCloseButton.is())
+ mpCloseButton->SetCanvas(mxCanvas, mxWindow);
+ }
+}
+
+void PresenterHelpView::Resize()
+{
+ if (!(mpCloseButton && mxWindow.is()))
+ return;
+
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ mnMaximalWidth = (mxWindow->getPosSize().Width - 4*gnHorizontalGap) / 2;
+
+ // Place vertical separator.
+ mnSeparatorY = aWindowBox.Height
+ - mpCloseButton->GetSize().Height - gnVerticalButtonPadding;
+
+ mpCloseButton->SetCenter(geometry::RealPoint2D(
+ aWindowBox.Width/2.0,
+ aWindowBox.Height - mpCloseButton->GetSize().Height/2.0));
+
+ CheckFontSize();
+}
+
+void PresenterHelpView::ThrowIfDisposed()
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterHelpView has been already disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+//===== LineDescriptor =========================================================
+
+namespace {
+
+LineDescriptor::LineDescriptor()
+ : maSize(0,0),
+ mnVerticalOffset(0)
+{
+}
+
+void LineDescriptor::AddPart (
+ std::u16string_view rsLine,
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont)
+{
+ msLine += rsLine;
+
+ CalculateSize(rxFont);
+}
+
+bool LineDescriptor::IsEmpty() const
+{
+ return msLine.isEmpty();
+}
+
+void LineDescriptor::CalculateSize (
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont)
+{
+ OSL_ASSERT(rxFont.is());
+
+ rendering::StringContext aContext (msLine, 0, msLine.getLength());
+ Reference<rendering::XTextLayout> xLayout (
+ rxFont->createTextLayout(aContext, rendering::TextDirection::WEAK_LEFT_TO_RIGHT, 0));
+ const geometry::RealRectangle2D aTextBBox (xLayout->queryTextBounds());
+ maSize = css::geometry::RealSize2D(aTextBBox.X2 - aTextBBox.X1, aTextBBox.Y2 - aTextBBox.Y1);
+ mnVerticalOffset = aTextBBox.Y2;
+}
+
+} // end of anonymous namespace
+
+//===== LineDescriptorList ====================================================
+
+namespace {
+
+LineDescriptorList::LineDescriptorList (
+ const OUString& rsText,
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const sal_Int32 nMaximalWidth)
+ : msText(rsText)
+{
+ Update(rxFont, nMaximalWidth);
+}
+
+double LineDescriptorList::Paint(
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const geometry::RealRectangle2D& rBBox,
+ const bool bFlushLeft,
+ const rendering::ViewState& rViewState,
+ rendering::RenderState& rRenderState,
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont) const
+{
+ if ( ! rxCanvas.is())
+ return 0;
+
+ double nY (rBBox.Y1);
+ for (const auto& rLine : *mpLineDescriptors)
+ {
+ double nX;
+ /// check whether RTL interface or not
+ if(!AllSettings::GetLayoutRTL())
+ {
+ nX = rBBox.X1;
+ if ( ! bFlushLeft)
+ nX = rBBox.X2 - rLine.maSize.Width;
+ }
+ else
+ {
+ nX=rBBox.X2 - rLine.maSize.Width;
+ if ( ! bFlushLeft)
+ nX = rBBox.X1;
+ }
+ rRenderState.AffineTransform.m02 = nX;
+ rRenderState.AffineTransform.m12 = nY + rLine.maSize.Height - rLine.mnVerticalOffset;
+
+ const rendering::StringContext aContext (rLine.msLine, 0, rLine.msLine.getLength());
+ Reference<rendering::XTextLayout> xLayout (
+ rxFont->createTextLayout(aContext, rendering::TextDirection::WEAK_LEFT_TO_RIGHT, 0));
+ rxCanvas->drawTextLayout (
+ xLayout,
+ rViewState,
+ rRenderState);
+
+ nY += rLine.maSize.Height * 1.2;
+ }
+
+ return nY - rBBox.Y1;
+}
+
+double LineDescriptorList::GetHeight() const
+{
+ return std::accumulate(mpLineDescriptors->begin(), mpLineDescriptors->end(), double(0),
+ [](const double& nHeight, const LineDescriptor& rLine) {
+ return nHeight + rLine.maSize.Height * 1.2;
+ });
+}
+
+void LineDescriptorList::Update (
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const sal_Int32 nMaximalWidth)
+{
+ vector<OUString> aTextParts;
+ SplitText(msText, aTextParts);
+ FormatText(aTextParts, rxFont, nMaximalWidth);
+}
+
+void LineDescriptorList::SplitText (
+ const OUString& rsText,
+ vector<OUString>& rTextParts)
+{
+ const char cQuote ('\'');
+ const char cSeparator (',');
+
+ sal_Int32 nIndex (0);
+ sal_Int32 nStart (0);
+ sal_Int32 nLength (rsText.getLength());
+ bool bIsQuoted (false);
+ while (nIndex < nLength)
+ {
+ const sal_Int32 nQuoteIndex (rsText.indexOf(cQuote, nIndex));
+ const sal_Int32 nSeparatorIndex (rsText.indexOf(cSeparator, nIndex));
+ if (nQuoteIndex>=0 && (nSeparatorIndex==-1 || nQuoteIndex<nSeparatorIndex))
+ {
+ bIsQuoted = !bIsQuoted;
+ nIndex = nQuoteIndex+1;
+ continue;
+ }
+
+ const sal_Int32 nNextIndex = nSeparatorIndex;
+ if (nNextIndex < 0)
+ {
+ break;
+ }
+ else if ( ! bIsQuoted)
+ {
+ rTextParts.push_back(rsText.copy(nStart, nNextIndex-nStart));
+ nStart = nNextIndex + 1;
+ }
+ nIndex = nNextIndex+1;
+ }
+ if (nStart < nLength)
+ rTextParts.push_back(rsText.copy(nStart, nLength-nStart));
+}
+
+void LineDescriptorList::FormatText (
+ const vector<OUString>& rTextParts,
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const sal_Int32 nMaximalWidth)
+{
+ LineDescriptor aLineDescriptor;
+
+ mpLineDescriptors = std::make_shared<vector<LineDescriptor>>();
+
+ vector<OUString>::const_iterator iPart (rTextParts.begin());
+ vector<OUString>::const_iterator iEnd (rTextParts.end());
+ while (iPart!=iEnd)
+ {
+ if (aLineDescriptor.IsEmpty())
+ {
+ // Avoid empty lines.
+ if (PresenterCanvasHelper::GetTextSize(
+ rxFont, *iPart).Width > nMaximalWidth)
+ {
+ const char cSpace (' ');
+
+ sal_Int32 nIndex (0);
+ sal_Int32 nStart (0);
+ sal_Int32 nLength (iPart->getLength());
+ while (nIndex < nLength)
+ {
+ sal_Int32 nSpaceIndex (iPart->indexOf(cSpace, nIndex));
+ while (nSpaceIndex >= 0 && PresenterCanvasHelper::GetTextSize(
+ rxFont, iPart->copy(nStart, nSpaceIndex-nStart)).Width <= nMaximalWidth)
+ {
+ nIndex = nSpaceIndex;
+ nSpaceIndex = iPart->indexOf(cSpace, nIndex+1);
+ }
+
+ if (nSpaceIndex < 0 && PresenterCanvasHelper::GetTextSize(
+ rxFont, iPart->copy(nStart, nLength-nStart)).Width <= nMaximalWidth)
+ {
+ nIndex = nLength;
+ }
+
+ if (nIndex == nStart)
+ {
+ nIndex = nLength;
+ }
+
+ aLineDescriptor.AddPart(iPart->subView(nStart, nIndex-nStart), rxFont);
+ if (nIndex != nLength)
+ {
+ mpLineDescriptors->push_back(aLineDescriptor);
+ aLineDescriptor = LineDescriptor();
+ }
+ nStart = nIndex;
+ }
+ }
+ else
+ {
+ aLineDescriptor.AddPart(*iPart, rxFont);
+ }
+ }
+ else if (PresenterCanvasHelper::GetTextSize(
+ rxFont, aLineDescriptor.msLine+", "+*iPart).Width > nMaximalWidth)
+ {
+ aLineDescriptor.AddPart(u",", rxFont);
+ mpLineDescriptors->push_back(aLineDescriptor);
+ aLineDescriptor = LineDescriptor();
+ continue;
+ }
+ else
+ {
+ aLineDescriptor.AddPart(OUStringConcatenation(", "+*iPart), rxFont);
+ }
+ ++iPart;
+ }
+ if ( ! aLineDescriptor.IsEmpty())
+ {
+ mpLineDescriptors->push_back(aLineDescriptor);
+ }
+}
+
+} // end of anonymous namespace
+
+//===== Block =================================================================
+
+namespace {
+
+Block::Block (
+ const OUString& rsLeftText,
+ const OUString& rsRightText,
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const sal_Int32 nMaximalWidth)
+ : maLeft(rsLeftText, rxFont, nMaximalWidth),
+ maRight(rsRightText, rxFont, nMaximalWidth)
+{
+}
+
+void Block::Update (
+ const css::uno::Reference<css::rendering::XCanvasFont>& rxFont,
+ const sal_Int32 nMaximalWidth)
+{
+ maLeft.Update(rxFont, nMaximalWidth);
+ maRight.Update(rxFont, nMaximalWidth);
+}
+
+} // end of anonymous namespace
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterHelpView.hxx b/sdext/source/presenter/PresenterHelpView.hxx
new file mode 100644
index 000000000..58f629a36
--- /dev/null
+++ b/sdext/source/presenter/PresenterHelpView.hxx
@@ -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 .
+ */
+
+#ifndef INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERHELPVIEW_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERHELPVIEW_HXX
+
+#include "PresenterController.hxx"
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <com/sun/star/awt/XPaintListener.hpp>
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <com/sun/star/drawing/framework/XResourceId.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <memory>
+
+namespace sdext::presenter {
+
+class PresenterButton;
+
+typedef cppu::WeakComponentImplHelper<
+ css::drawing::framework::XView,
+ css::awt::XWindowListener,
+ css::awt::XPaintListener
+ > PresenterHelpViewInterfaceBase;
+
+/** Show help text that describes the defined keys.
+*/
+class PresenterHelpView
+ : private ::cppu::BaseMutex,
+ public PresenterHelpViewInterfaceBase
+{
+public:
+ explicit PresenterHelpView (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ virtual ~PresenterHelpView() override;
+
+ virtual void SAL_CALL disposing() override;
+
+ // lang::XEventListener
+
+ virtual void SAL_CALL
+ disposing (const css::lang::EventObject& rEventObject) override;
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override;
+
+ // XPaintListener
+
+ virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override;
+
+ // XResourceId
+
+ virtual css::uno::Reference<css::drawing::framework::XResourceId> SAL_CALL getResourceId() override;
+
+ virtual sal_Bool SAL_CALL isAnchorOnly() override;
+
+private:
+ class TextContainer;
+
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+ css::uno::Reference<css::drawing::framework::XResourceId> mxViewId;
+ css::uno::Reference<css::drawing::framework::XPane> mxPane;
+ css::uno::Reference<css::awt::XWindow> mxWindow;
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ PresenterTheme::SharedFontDescriptor mpFont;
+ std::unique_ptr<TextContainer> mpTextContainer;
+ ::rtl::Reference<PresenterButton> mpCloseButton;
+ sal_Int32 mnSeparatorY;
+ sal_Int32 mnMaximalWidth;
+
+ void ProvideCanvas();
+ void Resize();
+ void Paint (const css::awt::Rectangle& rRedrawArea);
+ void ReadHelpStrings();
+ void ProcessString (
+ const css::uno::Reference<css::beans::XPropertySet>& rsProperties);
+
+ /** Find a font size, so that all text can be displayed at the same
+ time.
+ */
+ void CheckFontSize();
+
+ /** @throws css::lang::DisposedException when the object has already been
+ disposed.
+ */
+ void ThrowIfDisposed();
+};
+
+} // end of namespace ::sdext::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterHelper.cxx b/sdext/source/presenter/PresenterHelper.cxx
new file mode 100644
index 000000000..76bec0ece
--- /dev/null
+++ b/sdext/source/presenter/PresenterHelper.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/.
+ *
+ * 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 "PresenterHelper.hxx"
+
+#include <com/sun/star/presentation/XPresentationSupplier.hpp>
+#include <com/sun/star/presentation/XPresentation2.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::presentation;
+
+namespace sdext::presenter {
+
+constexpr OUStringLiteral msPaneURLPrefix( u"private:resource/pane/");
+const OUString PresenterHelper::msFullScreenPaneURL( msPaneURLPrefix + "FullScreenPane");
+
+Reference<presentation::XSlideShowController> PresenterHelper::GetSlideShowController (
+ const Reference<frame::XController>& rxController)
+{
+ Reference<presentation::XSlideShowController> xSlideShowController;
+
+ if( rxController.is() ) try
+ {
+ Reference<XPresentationSupplier> xPS ( rxController->getModel(), UNO_QUERY_THROW);
+
+ Reference<XPresentation2> xPresentation(xPS->getPresentation(), UNO_QUERY_THROW);
+
+ xSlideShowController = xPresentation->getController();
+ }
+ catch(RuntimeException&)
+ {
+ }
+
+ return xSlideShowController;
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterHelper.hxx b/sdext/source/presenter/PresenterHelper.hxx
new file mode 100644
index 000000000..69fc57333
--- /dev/null
+++ b/sdext/source/presenter/PresenterHelper.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/.
+ *
+ * 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_SDEXT_SOURCE_PRESENTER_PRESENTERHELPER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERHELPER_HXX
+
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/presentation/XSlideShowController.hpp>
+
+namespace sdext::presenter
+{
+/** Collection of helper functions that do not fit in anywhere else.
+ Provide access to frequently used strings of the drawing framework.
+*/
+namespace PresenterHelper
+{
+extern const OUString msFullScreenPaneURL;
+
+/** Return the slide show controller of a running presentation that has
+ the same document as the given framework controller.
+ @return
+ When no presentation is running this method returns an empty reference.
+*/
+css::uno::Reference<css::presentation::XSlideShowController>
+GetSlideShowController(const css::uno::Reference<css::frame::XController>& rxController);
+}
+
+} // end of namespace presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterNotesView.cxx b/sdext/source/presenter/PresenterNotesView.cxx
new file mode 100644
index 000000000..457be1f61
--- /dev/null
+++ b/sdext/source/presenter/PresenterNotesView.cxx
@@ -0,0 +1,650 @@
+/* -*- 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 <vcl/settings.hxx>
+#include "PresenterNotesView.hxx"
+#include "PresenterButton.hxx"
+#include "PresenterCanvasHelper.hxx"
+#include "PresenterGeometryHelper.hxx"
+#include "PresenterPaintManager.hxx"
+#include "PresenterScrollBar.hxx"
+#include "PresenterTextView.hxx"
+#include <com/sun/star/accessibility/AccessibleTextType.hpp>
+#include <com/sun/star/awt/Key.hpp>
+#include <com/sun/star/awt/KeyModifier.hpp>
+#include <com/sun/star/awt/PosSize.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/lang/XServiceName.hpp>
+#include <com/sun/star/presentation/XPresentationPage.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <com/sun/star/rendering/XSpriteCanvas.hpp>
+#include <com/sun/star/text/XTextRange.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+const sal_Int32 gnSpaceBelowSeparator (10);
+const sal_Int32 gnSpaceAboveSeparator (10);
+const double gnLineScrollFactor (1.2);
+
+namespace sdext::presenter {
+
+//===== PresenterNotesView ====================================================
+
+PresenterNotesView::PresenterNotesView (
+ const Reference<XComponentContext>& rxComponentContext,
+ const Reference<XResourceId>& rxViewId,
+ const Reference<frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterNotesViewInterfaceBase(m_aMutex),
+ mxViewId(rxViewId),
+ mpPresenterController(rpPresenterController),
+ maSeparatorColor(0xffffff),
+ mnSeparatorYLocation(0),
+ mnTop(0)
+{
+ try
+ {
+ Reference<XControllerManager> xCM (rxController, UNO_QUERY_THROW);
+ Reference<XConfigurationController> xCC (xCM->getConfigurationController(), UNO_SET_THROW);
+ Reference<XPane> xPane (xCC->getResource(rxViewId->getAnchor()), UNO_QUERY_THROW);
+
+ mxParentWindow = xPane->getWindow();
+ mxCanvas = xPane->getCanvas();
+ mpTextView = std::make_shared<PresenterTextView>(
+ rxComponentContext,
+ mxCanvas,
+ mpPresenterController->GetPaintManager()->GetInvalidator(mxParentWindow));
+
+ const OUString sResourceURL (mxViewId->getResourceURL());
+ mpFont = std::make_shared<PresenterTheme::FontDescriptor>(
+ rpPresenterController->GetViewFont(sResourceURL));
+ maSeparatorColor = mpFont->mnColor;
+ mpTextView->SetFont(mpFont);
+
+ CreateToolBar(rxComponentContext, rpPresenterController);
+
+ mpCloseButton = PresenterButton::Create(
+ rxComponentContext,
+ mpPresenterController,
+ mpPresenterController->GetTheme(),
+ mxParentWindow,
+ mxCanvas,
+ "NotesViewCloser");
+
+ if (mxParentWindow.is())
+ {
+ mxParentWindow->addWindowListener(this);
+ mxParentWindow->addPaintListener(this);
+ mxParentWindow->addKeyListener(this);
+ mxParentWindow->setVisible(true);
+ }
+
+ mpScrollBar = new PresenterVerticalScrollBar(
+ rxComponentContext,
+ mxParentWindow,
+ mpPresenterController->GetPaintManager(),
+ [this](double f) { return this->SetTop(f); });
+ mpScrollBar->SetBackground(
+ mpPresenterController->GetViewBackground(mxViewId->getResourceURL()));
+
+ mpScrollBar->SetCanvas(mxCanvas);
+
+ Layout();
+ }
+ catch (RuntimeException&)
+ {
+ PresenterNotesView::disposing();
+ throw;
+ }
+}
+
+PresenterNotesView::~PresenterNotesView()
+{
+}
+
+void SAL_CALL PresenterNotesView::disposing()
+{
+ if (mxParentWindow.is())
+ {
+ mxParentWindow->removeWindowListener(this);
+ mxParentWindow->removePaintListener(this);
+ mxParentWindow->removeKeyListener(this);
+ mxParentWindow = nullptr;
+ }
+
+ // Dispose tool bar.
+ {
+ Reference<XComponent> xComponent = mpToolBar;
+ mpToolBar = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ {
+ Reference<XComponent> xComponent (mxToolBarCanvas, UNO_QUERY);
+ mxToolBarCanvas = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ {
+ Reference<XComponent> xComponent = mxToolBarWindow;
+ mxToolBarWindow = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ // Dispose close button
+ {
+ Reference<XComponent> xComponent = mpCloseButton;
+ mpCloseButton = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ // Create the tool bar.
+
+ mpScrollBar = nullptr;
+
+ mxViewId = nullptr;
+}
+
+void PresenterNotesView::CreateToolBar (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+{
+ if (!rpPresenterController)
+ return;
+
+ Reference<drawing::XPresenterHelper> xPresenterHelper (
+ rpPresenterController->GetPresenterHelper());
+ if ( ! xPresenterHelper.is())
+ return;
+
+ // Create a new window as container of the tool bar.
+ mxToolBarWindow = xPresenterHelper->createWindow(
+ mxParentWindow,
+ false,
+ true,
+ false,
+ false);
+ mxToolBarCanvas = xPresenterHelper->createSharedCanvas (
+ Reference<rendering::XSpriteCanvas>(mxCanvas, UNO_QUERY),
+ mxParentWindow,
+ mxCanvas,
+ mxParentWindow,
+ mxToolBarWindow);
+
+ // Create the tool bar.
+ mpToolBar = new PresenterToolBar(
+ rxContext,
+ mxToolBarWindow,
+ mxToolBarCanvas,
+ rpPresenterController,
+ PresenterToolBar::Left);
+ mpToolBar->Initialize(
+ "PresenterScreenSettings/ToolBars/NotesToolBar");
+}
+
+void PresenterNotesView::SetSlide (const Reference<drawing::XDrawPage>& rxNotesPage)
+{
+ static constexpr OUStringLiteral sNotesShapeName (
+ u"com.sun.star.presentation.NotesShape");
+ static constexpr OUStringLiteral sTextShapeName (
+ u"com.sun.star.drawing.TextShape");
+
+ if (!rxNotesPage.is())
+ return;
+
+ // Iterate over all shapes and find the one that holds the text.
+ sal_Int32 nCount (rxNotesPage->getCount());
+ for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
+ {
+
+ Reference<lang::XServiceName> xServiceName (
+ rxNotesPage->getByIndex(nIndex), UNO_QUERY);
+ if (xServiceName.is()
+ && xServiceName->getServiceName() == sNotesShapeName)
+ {
+ }
+ else
+ {
+ Reference<drawing::XShapeDescriptor> xShapeDescriptor (
+ rxNotesPage->getByIndex(nIndex), UNO_QUERY);
+ if (xShapeDescriptor.is())
+ {
+ OUString sType (xShapeDescriptor->getShapeType());
+ if (sType == sNotesShapeName || sType == sTextShapeName)
+ {
+ Reference<text::XTextRange> xText (
+ rxNotesPage->getByIndex(nIndex), UNO_QUERY);
+ if (xText.is())
+ {
+ mpTextView->SetText(Reference<text::XText>(xText, UNO_QUERY));
+ }
+ }
+ }
+ }
+ }
+
+ Layout();
+
+ if (mpScrollBar)
+ {
+ mpScrollBar->SetThumbPosition(0, false);
+ UpdateScrollBar();
+ }
+
+ Invalidate();
+}
+
+//----- lang::XEventListener -------------------------------------------------
+
+void SAL_CALL PresenterNotesView::disposing (const lang::EventObject& rEventObject)
+{
+ if (rEventObject.Source == mxParentWindow)
+ mxParentWindow = nullptr;
+}
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL PresenterNotesView::windowResized (const awt::WindowEvent&)
+{
+ Layout();
+}
+
+void SAL_CALL PresenterNotesView::windowMoved (const awt::WindowEvent&) {}
+
+void SAL_CALL PresenterNotesView::windowShown (const lang::EventObject&) {}
+
+void SAL_CALL PresenterNotesView::windowHidden (const lang::EventObject&) {}
+
+//----- XPaintListener --------------------------------------------------------
+
+void SAL_CALL PresenterNotesView::windowPaint (const awt::PaintEvent& rEvent)
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterNotesView object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+
+ if ( ! mbIsPresenterViewActive)
+ return;
+
+ ::osl::MutexGuard aSolarGuard (::osl::Mutex::getGlobalMutex());
+ Paint(rEvent.UpdateRect);
+}
+
+//----- XResourceId -----------------------------------------------------------
+
+Reference<XResourceId> SAL_CALL PresenterNotesView::getResourceId()
+{
+ return mxViewId;
+}
+
+sal_Bool SAL_CALL PresenterNotesView::isAnchorOnly()
+{
+ return false;
+}
+
+//----- XDrawView -------------------------------------------------------------
+
+void SAL_CALL PresenterNotesView::setCurrentPage (const Reference<drawing::XDrawPage>& rxSlide)
+{
+ // Get the associated notes page.
+ mxCurrentNotesPage = nullptr;
+ try
+ {
+ Reference<presentation::XPresentationPage> xPresentationPage(rxSlide, UNO_QUERY);
+ if (xPresentationPage.is())
+ mxCurrentNotesPage = xPresentationPage->getNotesPage();
+ }
+ catch (RuntimeException&)
+ {
+ }
+
+ SetSlide(mxCurrentNotesPage);
+}
+
+Reference<drawing::XDrawPage> SAL_CALL PresenterNotesView::getCurrentPage()
+{
+ return nullptr;
+}
+
+//----- XKeyListener ----------------------------------------------------------
+
+void SAL_CALL PresenterNotesView::keyPressed (const awt::KeyEvent& rEvent)
+{
+ switch (rEvent.KeyCode)
+ {
+ case awt::Key::A:
+ Scroll(-gnLineScrollFactor * mpFont->mnSize);
+ break;
+
+ case awt::Key::Y:
+ case awt::Key::Z:
+ Scroll(+gnLineScrollFactor * mpFont->mnSize);
+ break;
+
+ case awt::Key::S:
+ ChangeFontSize(-1);
+ break;
+
+ case awt::Key::G:
+ ChangeFontSize(+1);
+ break;
+
+ case awt::Key::H:
+ if (mpTextView)
+ mpTextView->MoveCaret(
+ -1,
+ (rEvent.Modifiers == awt::KeyModifier::SHIFT)
+ ? css::accessibility::AccessibleTextType::CHARACTER
+ : css::accessibility::AccessibleTextType::WORD);
+ break;
+
+ case awt::Key::L:
+ if (mpTextView)
+ mpTextView->MoveCaret(
+ +1,
+ (rEvent.Modifiers == awt::KeyModifier::SHIFT)
+ ? css::accessibility::AccessibleTextType::CHARACTER
+ : css::accessibility::AccessibleTextType::WORD);
+ break;
+ }
+}
+
+void SAL_CALL PresenterNotesView::keyReleased (const awt::KeyEvent&) {}
+
+
+void PresenterNotesView::Layout()
+{
+ if ( ! mxParentWindow.is())
+ return;
+ awt::Rectangle aWindowBox (mxParentWindow->getPosSize());
+ geometry::RealRectangle2D aNewTextBoundingBox (0,0,aWindowBox.Width, aWindowBox.Height);
+ // Size the tool bar and the horizontal separator above it.
+ if (mxToolBarWindow.is())
+ {
+ const geometry::RealSize2D aToolBarSize (mpToolBar->GetMinimalSize());
+ const sal_Int32 nToolBarHeight = sal_Int32(aToolBarSize.Height + 0.5);
+ mxToolBarWindow->setPosSize(0, aWindowBox.Height - nToolBarHeight,
+ sal_Int32(aToolBarSize.Width + 0.5), nToolBarHeight,
+ awt::PosSize::POSSIZE);
+ mnSeparatorYLocation = aWindowBox.Height - nToolBarHeight - gnSpaceBelowSeparator;
+ aNewTextBoundingBox.Y2 = mnSeparatorYLocation - gnSpaceAboveSeparator;
+ // Place the close button.
+ if (mpCloseButton)
+ mpCloseButton->SetCenter(geometry::RealPoint2D(
+ (aWindowBox.Width + aToolBarSize.Width) / 2,
+ aWindowBox.Height - aToolBarSize.Height/2));
+ }
+ // Check whether the vertical scroll bar is necessary.
+ if (mpScrollBar)
+ {
+ bool bShowVerticalScrollbar (false);
+ try
+ {
+ const double nTextBoxHeight (aNewTextBoundingBox.Y2 - aNewTextBoundingBox.Y1);
+ const double nHeight (mpTextView->GetTotalTextHeight());
+ if (nHeight > nTextBoxHeight)
+ {
+ bShowVerticalScrollbar = true;
+ if(!AllSettings::GetLayoutRTL())
+ aNewTextBoundingBox.X2 -= mpScrollBar->GetSize();
+ else
+ aNewTextBoundingBox.X1 += mpScrollBar->GetSize();
+ }
+ mpScrollBar->SetTotalSize(nHeight);
+ }
+ catch(beans::UnknownPropertyException&)
+ {
+ OSL_ASSERT(false);
+ }
+ if(AllSettings::GetLayoutRTL())
+ {
+ mpScrollBar->SetVisible(bShowVerticalScrollbar);
+ mpScrollBar->SetPosSize(
+ geometry::RealRectangle2D(
+ aNewTextBoundingBox.X1 - mpScrollBar->GetSize(),
+ aNewTextBoundingBox.Y1,
+ aNewTextBoundingBox.X1,
+ aNewTextBoundingBox.Y2));
+ if( ! bShowVerticalScrollbar)
+ mpScrollBar->SetThumbPosition(0, false);
+ UpdateScrollBar();
+ }
+ else
+ {
+ mpScrollBar->SetVisible(bShowVerticalScrollbar);
+ mpScrollBar->SetPosSize(
+ geometry::RealRectangle2D(
+ aWindowBox.Width - mpScrollBar->GetSize(),
+ aNewTextBoundingBox.Y1,
+ aNewTextBoundingBox.X2 + mpScrollBar->GetSize(),
+ aNewTextBoundingBox.Y2));
+ if( ! bShowVerticalScrollbar)
+ mpScrollBar->SetThumbPosition(0, false);
+ UpdateScrollBar();
+ }
+ }
+ // Has the text area has changed it position or size?
+ if (aNewTextBoundingBox.X1 != maTextBoundingBox.X1
+ || aNewTextBoundingBox.Y1 != maTextBoundingBox.Y1
+ || aNewTextBoundingBox.X2 != maTextBoundingBox.X2
+ || aNewTextBoundingBox.Y2 != maTextBoundingBox.Y2)
+ {
+ maTextBoundingBox = aNewTextBoundingBox;
+ mpTextView->SetLocation(
+ geometry::RealPoint2D(
+ aNewTextBoundingBox.X1,
+ aNewTextBoundingBox.Y1));
+ mpTextView->SetSize(
+ geometry::RealSize2D(
+ aNewTextBoundingBox.X2 - aNewTextBoundingBox.X1,
+ aNewTextBoundingBox.Y2 - aNewTextBoundingBox.Y1));
+ }
+}
+
+void PresenterNotesView::Paint (const awt::Rectangle& rUpdateBox)
+{
+ if ( ! mxParentWindow.is())
+ return;
+ if ( ! mxCanvas.is())
+ return;
+
+ if (!mpBackground)
+ mpBackground = mpPresenterController->GetViewBackground(mxViewId->getResourceURL());
+
+ if (rUpdateBox.Y < maTextBoundingBox.Y2
+ && rUpdateBox.X < maTextBoundingBox.X2)
+ {
+ PaintText(rUpdateBox);
+ }
+
+ mpTextView->Paint(rUpdateBox);
+
+ if (rUpdateBox.Y + rUpdateBox.Height > maTextBoundingBox.Y2)
+ {
+ PaintToolBar(rUpdateBox);
+ }
+}
+
+void PresenterNotesView::PaintToolBar (const awt::Rectangle& rUpdateBox)
+{
+ awt::Rectangle aWindowBox (mxParentWindow->getPosSize());
+
+ rendering::ViewState aViewState (
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr);
+ rendering::RenderState aRenderState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+
+ if (mpBackground)
+ {
+ // Paint the background.
+ mpPresenterController->GetCanvasHelper()->Paint(
+ mpBackground,
+ mxCanvas,
+ rUpdateBox,
+ awt::Rectangle(0,sal_Int32(maTextBoundingBox.Y2),aWindowBox.Width,aWindowBox.Height),
+ awt::Rectangle());
+ }
+
+ // Paint the horizontal separator.
+ OSL_ASSERT(mxViewId.is());
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, maSeparatorColor);
+
+ mxCanvas->drawLine(
+ geometry::RealPoint2D(0,mnSeparatorYLocation),
+ geometry::RealPoint2D(aWindowBox.Width,mnSeparatorYLocation),
+ aViewState,
+ aRenderState);
+}
+
+void PresenterNotesView::PaintText (const awt::Rectangle& rUpdateBox)
+{
+ const awt::Rectangle aBox (PresenterGeometryHelper::Intersection(rUpdateBox,
+ PresenterGeometryHelper::ConvertRectangle(maTextBoundingBox)));
+
+ if (aBox.Width <= 0 || aBox.Height <= 0)
+ return;
+
+ if (mpBackground)
+ {
+ // Paint the background.
+ mpPresenterController->GetCanvasHelper()->Paint(
+ mpBackground,
+ mxCanvas,
+ rUpdateBox,
+ aBox,
+ awt::Rectangle());
+ }
+
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ xSpriteCanvas->updateScreen(false);
+}
+
+void PresenterNotesView::Invalidate()
+{
+ mpPresenterController->GetPaintManager()->Invalidate(
+ mxParentWindow,
+ PresenterGeometryHelper::ConvertRectangle(maTextBoundingBox));
+}
+
+void PresenterNotesView::Scroll (const double rnDistance)
+{
+ try
+ {
+ mnTop += rnDistance;
+ mpTextView->SetOffset(0, mnTop);
+
+ UpdateScrollBar();
+ Invalidate();
+ }
+ catch (beans::UnknownPropertyException&)
+ {}
+}
+
+void PresenterNotesView::SetTop (const double nTop)
+{
+ try
+ {
+ mnTop = nTop;
+ mpTextView->SetOffset(0, mnTop);
+
+ UpdateScrollBar();
+ Invalidate();
+ }
+ catch (beans::UnknownPropertyException&)
+ {}
+}
+
+void PresenterNotesView::ChangeFontSize (const sal_Int32 nSizeChange)
+{
+ const sal_Int32 nNewSize (mpFont->mnSize + nSizeChange);
+ if (nNewSize <= 5)
+ return;
+
+ mpFont->mnSize = nNewSize;
+ mpFont->mxFont = nullptr;
+ mpTextView->SetFont(mpFont);
+
+ Layout();
+ UpdateScrollBar();
+ Invalidate();
+
+ // Write the new font size to the configuration to make it persistent.
+ try
+ {
+ const OUString sStyleName (mpPresenterController->GetTheme()->GetStyleName(
+ mxViewId->getResourceURL()));
+ std::shared_ptr<PresenterConfigurationAccess> pConfiguration (
+ mpPresenterController->GetTheme()->GetNodeForViewStyle(
+ sStyleName));
+ if (pConfiguration == nullptr || !pConfiguration->IsValid())
+ return;
+
+ pConfiguration->GoToChild("Font");
+ pConfiguration->SetProperty("Size", Any(static_cast<sal_Int32>(nNewSize+0.5)));
+ pConfiguration->CommitChanges();
+ }
+ catch (Exception&)
+ {
+ OSL_ASSERT(false);
+ }
+}
+
+const std::shared_ptr<PresenterTextView>& PresenterNotesView::GetTextView() const
+{
+ return mpTextView;
+}
+
+void PresenterNotesView::UpdateScrollBar()
+{
+ if (!mpScrollBar)
+ return;
+
+ try
+ {
+ mpScrollBar->SetTotalSize(mpTextView->GetTotalTextHeight());
+ }
+ catch(beans::UnknownPropertyException&)
+ {
+ OSL_ASSERT(false);
+ }
+
+ mpScrollBar->SetLineHeight(mpFont->mnSize*1.2);
+ mpScrollBar->SetThumbPosition(mnTop, false);
+
+ mpScrollBar->SetThumbSize(maTextBoundingBox.Y2 - maTextBoundingBox.Y1);
+ mpScrollBar->CheckValues();
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterNotesView.hxx b/sdext/source/presenter/PresenterNotesView.hxx
new file mode 100644
index 000000000..1af3f241f
--- /dev/null
+++ b/sdext/source/presenter/PresenterNotesView.hxx
@@ -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/.
+ *
+ * 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_SDEXT_SOURCE_PRESENTER_PRESENTERNOTESVIEW_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERNOTESVIEW_HXX
+
+#include "PresenterController.hxx"
+#include "PresenterToolBar.hxx"
+#include "PresenterViewFactory.hxx"
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <com/sun/star/drawing/framework/XResourceId.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <rtl/ref.hxx>
+#include <memory>
+
+namespace sdext::presenter {
+
+class PresenterButton;
+class PresenterScrollBar;
+class PresenterTextView;
+
+typedef cppu::WeakComponentImplHelper<
+ css::awt::XWindowListener,
+ css::awt::XPaintListener,
+ css::drawing::framework::XView,
+ css::drawing::XDrawView,
+ css::awt::XKeyListener
+ > PresenterNotesViewInterfaceBase;
+
+/** A drawing framework view of the notes of a slide. At the moment this is
+ a simple text view that does not show the original formatting of the
+ notes text.
+*/
+class PresenterNotesView
+ : private ::cppu::BaseMutex,
+ public PresenterNotesViewInterfaceBase,
+ public CachablePresenterView
+{
+public:
+ explicit PresenterNotesView (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ virtual ~PresenterNotesView() override;
+
+ virtual void SAL_CALL disposing() override;
+
+ /** Typically called from setCurrentSlide() with the notes page that is
+ associated with the slide given to setCurrentSlide().
+
+ Iterates over all text shapes on the given notes page and displays
+ the concatenated text of these.
+ */
+ void SetSlide (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxNotesPage);
+
+ void ChangeFontSize (const sal_Int32 nSizeChange);
+
+ const std::shared_ptr<PresenterTextView>& GetTextView() const;
+
+ // lang::XEventListener
+
+ virtual void SAL_CALL
+ disposing (const css::lang::EventObject& rEventObject) override;
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override;
+
+ // XPaintListener
+
+ virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override;
+
+ // XResourceId
+
+ virtual css::uno::Reference<css::drawing::framework::XResourceId> SAL_CALL getResourceId() override;
+
+ virtual sal_Bool SAL_CALL isAnchorOnly() override;
+
+ // XDrawView
+
+ virtual void SAL_CALL setCurrentPage (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxSlide) override;
+
+ virtual css::uno::Reference<css::drawing::XDrawPage> SAL_CALL getCurrentPage() override;
+
+ // XKeyListener
+
+ virtual void SAL_CALL keyPressed (const css::awt::KeyEvent& rEvent) override;
+ virtual void SAL_CALL keyReleased (const css::awt::KeyEvent& rEvent) override;
+
+private:
+ css::uno::Reference<css::drawing::framework::XResourceId> mxViewId;
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ css::uno::Reference<css::awt::XWindow> mxParentWindow;
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+ css::uno::Reference<css::drawing::XDrawPage> mxCurrentNotesPage;
+ ::rtl::Reference<PresenterScrollBar> mpScrollBar;
+ css::uno::Reference<css::awt::XWindow> mxToolBarWindow;
+ css::uno::Reference<css::rendering::XCanvas> mxToolBarCanvas;
+ ::rtl::Reference<PresenterToolBar> mpToolBar;
+ ::rtl::Reference<PresenterButton> mpCloseButton;
+ css::util::Color maSeparatorColor;
+ sal_Int32 mnSeparatorYLocation;
+ css::geometry::RealRectangle2D maTextBoundingBox;
+ SharedBitmapDescriptor mpBackground;
+ double mnTop;
+ PresenterTheme::SharedFontDescriptor mpFont;
+ std::shared_ptr<PresenterTextView> mpTextView;
+
+ void CreateToolBar (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ void Layout();
+ void Paint (const css::awt::Rectangle& rUpdateBox);
+ void PaintToolBar (const css::awt::Rectangle& rUpdateBox);
+ void PaintText (const css::awt::Rectangle& rUpdateBox);
+ void Invalidate();
+ void Scroll (const double nDistance);
+ void SetTop (const double nTop);
+ void UpdateScrollBar();
+};
+
+} // end of namespace ::sdext::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterPaintManager.cxx b/sdext/source/presenter/PresenterPaintManager.cxx
new file mode 100644
index 000000000..ba1bc48de
--- /dev/null
+++ b/sdext/source/presenter/PresenterPaintManager.cxx
@@ -0,0 +1,141 @@
+/* -*- 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 "PresenterPaintManager.hxx"
+
+#include "PresenterPaneContainer.hxx"
+#include <com/sun/star/awt/InvalidateStyle.hpp>
+#include <com/sun/star/awt/XWindowPeer.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sdext::presenter {
+
+PresenterPaintManager::PresenterPaintManager (
+ const css::uno::Reference<css::awt::XWindow>& rxParentWindow,
+ const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper,
+ const rtl::Reference<PresenterPaneContainer>& rpPaneContainer)
+ : mxParentWindow(rxParentWindow),
+ mxParentWindowPeer(rxParentWindow, UNO_QUERY),
+ mxPresenterHelper(rxPresenterHelper),
+ mpPaneContainer(rpPaneContainer)
+{
+}
+
+::std::function<void (const css::awt::Rectangle& rRepaintBox)>
+ PresenterPaintManager::GetInvalidator (
+ const css::uno::Reference<css::awt::XWindow>& rxWindow)
+{
+ return [this, rxWindow] (css::awt::Rectangle const& rRepaintBox)
+ {
+ return this->Invalidate(rxWindow, rRepaintBox /* , bSynchronous=false */);
+ };
+}
+
+void PresenterPaintManager::Invalidate (
+ const css::uno::Reference<css::awt::XWindow>& rxWindow)
+{
+ sal_Int16 nInvalidateMode (awt::InvalidateStyle::CHILDREN);
+
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor(
+ mpPaneContainer->FindContentWindow(rxWindow));
+ if (!pDescriptor || ! pDescriptor->mbIsOpaque)
+ nInvalidateMode |= awt::InvalidateStyle::TRANSPARENT;
+ else
+ nInvalidateMode |= awt::InvalidateStyle::NOTRANSPARENT;
+
+ Invalidate(rxWindow, nInvalidateMode);
+}
+
+void PresenterPaintManager::Invalidate (
+ const css::uno::Reference<css::awt::XWindow>& rxWindow,
+ const sal_Int16 nInvalidateFlags)
+{
+ if ((nInvalidateFlags & awt::InvalidateStyle::TRANSPARENT) != 0)
+ {
+ // Window is transparent and parent window(s) have to be painted as
+ // well. Invalidate the parent explicitly.
+ if (mxPresenterHelper.is() && mxParentWindowPeer.is())
+ {
+ const awt::Rectangle aBBox (
+ mxPresenterHelper->getWindowExtentsRelative(rxWindow, mxParentWindow));
+ mxParentWindowPeer->invalidateRect(aBBox, nInvalidateFlags);
+ }
+ }
+ else
+ {
+ Reference<awt::XWindowPeer> xPeer (rxWindow, UNO_QUERY);
+ if (xPeer.is())
+ xPeer->invalidate(nInvalidateFlags);
+ }
+}
+
+void PresenterPaintManager::Invalidate (
+ const css::uno::Reference<css::awt::XWindow>& rxWindow,
+ const css::awt::Rectangle& rRepaintBox,
+ const bool bSynchronous)
+{
+ sal_Int16 nInvalidateMode (awt::InvalidateStyle::CHILDREN);
+ if (bSynchronous)
+ nInvalidateMode |= awt::InvalidateStyle::UPDATE;
+
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor(
+ mpPaneContainer->FindContentWindow(rxWindow));
+ if (!pDescriptor || ! pDescriptor->mbIsOpaque)
+ nInvalidateMode |= awt::InvalidateStyle::TRANSPARENT;
+ else
+ nInvalidateMode |= awt::InvalidateStyle::NOTRANSPARENT;
+
+ Invalidate(rxWindow, rRepaintBox, nInvalidateMode);
+}
+
+void PresenterPaintManager::Invalidate (
+ const css::uno::Reference<css::awt::XWindow>& rxWindow,
+ const css::awt::Rectangle& rRepaintBox,
+ const sal_Int16 nInvalidateFlags)
+{
+ if ((nInvalidateFlags & awt::InvalidateStyle::TRANSPARENT) != 0)
+ {
+ // Window is transparent and parent window(s) have to be painted as
+ // well. Invalidate the parent explicitly.
+ if (mxPresenterHelper.is() && mxParentWindowPeer.is())
+ {
+ const awt::Rectangle aBBox (
+ mxPresenterHelper->getWindowExtentsRelative(rxWindow, mxParentWindow));
+ mxParentWindowPeer->invalidateRect(
+ awt::Rectangle(
+ rRepaintBox.X + aBBox.X,
+ rRepaintBox.Y + aBBox.Y,
+ rRepaintBox.Width,
+ rRepaintBox.Height),
+ nInvalidateFlags);
+ }
+ }
+ else
+ {
+ Reference<awt::XWindowPeer> xPeer (rxWindow, UNO_QUERY);
+ if (xPeer.is())
+ xPeer->invalidateRect(rRepaintBox, nInvalidateFlags);
+ }
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterPaintManager.hxx b/sdext/source/presenter/PresenterPaintManager.hxx
new file mode 100644
index 000000000..d3013209a
--- /dev/null
+++ b/sdext/source/presenter/PresenterPaintManager.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/.
+ *
+ * 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_SDEXT_SOURCE_PRESENTER_PRESENTERPAINTMANAGER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPAINTMANAGER_HXX
+
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/drawing/XPresenterHelper.hpp>
+#include <rtl/ref.hxx>
+
+#include <functional>
+
+#include "PresenterPaneContainer.hxx"
+
+namespace sdext::presenter {
+
+class PresenterPaneContainer;
+
+/** Synchronize painting of windows and canvases. At the moment there is
+ just some processing of invalidate calls.
+ This could be extended to process incoming windowPaint() calls.
+*/
+class PresenterPaintManager
+{
+public:
+ /** Create paint manager with the window that is the top node in the
+ local window hierarchy.
+ */
+ PresenterPaintManager (
+ const css::uno::Reference<css::awt::XWindow>& rxParentWindow,
+ const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper,
+ const rtl::Reference<PresenterPaneContainer>& rpPaneContainer);
+
+ ::std::function<void (const css::awt::Rectangle& rRepaintBox)>
+ GetInvalidator (
+ const css::uno::Reference<css::awt::XWindow>& rxWindow);
+
+ /** Request a repaint of the whole window.
+ @param rxWindow
+ May be the parent window or one of its descendents.
+ */
+ void Invalidate (
+ const css::uno::Reference<css::awt::XWindow>& rxWindow);
+ void Invalidate (
+ const css::uno::Reference<css::awt::XWindow>& rxWindow,
+ const sal_Int16 nInvalidateFlags);
+
+ /** Request a repaint of a part of a window.
+ @param rxWindow
+ May be the parent window or one of its descendents.
+ */
+ void Invalidate (
+ const css::uno::Reference<css::awt::XWindow>& rxWindow,
+ const css::awt::Rectangle& rRepaintBox,
+ const bool bSynchronous = false);
+ void Invalidate (
+ const css::uno::Reference<css::awt::XWindow>& rxWindow,
+ const css::awt::Rectangle& rRepaintBox,
+ const sal_Int16 nInvalidateFlags);
+
+private:
+ css::uno::Reference<css::awt::XWindow> mxParentWindow;
+ css::uno::Reference<css::awt::XWindowPeer> mxParentWindowPeer;
+ css::uno::Reference<css::drawing::XPresenterHelper> mxPresenterHelper;
+ ::rtl::Reference<PresenterPaneContainer> mpPaneContainer;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterPane.cxx b/sdext/source/presenter/PresenterPane.cxx
new file mode 100644
index 000000000..ad3531543
--- /dev/null
+++ b/sdext/source/presenter/PresenterPane.cxx
@@ -0,0 +1,169 @@
+/* -*- 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 "PresenterPane.hxx"
+#include "PresenterController.hxx"
+#include "PresenterPaintManager.hxx"
+#include <com/sun/star/lang/XMultiComponentFactory.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sdext::presenter {
+
+//===== PresenterPane =========================================================
+
+PresenterPane::PresenterPane (
+ const Reference<XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterPaneBase(rxContext, rpPresenterController)
+{
+ Reference<lang::XMultiComponentFactory> xFactory (
+ mxComponentContext->getServiceManager(), UNO_SET_THROW);
+ mxPresenterHelper.set(
+ xFactory->createInstanceWithContext(
+ "com.sun.star.comp.Draw.PresenterHelper",
+ mxComponentContext),
+ UNO_QUERY_THROW);
+}
+
+PresenterPane::~PresenterPane()
+{
+}
+
+//----- XPane -----------------------------------------------------------------
+
+Reference<awt::XWindow> SAL_CALL PresenterPane::getWindow()
+{
+ ThrowIfDisposed();
+ return mxContentWindow;
+}
+
+Reference<rendering::XCanvas> SAL_CALL PresenterPane::getCanvas()
+{
+ ThrowIfDisposed();
+ return mxContentCanvas;
+}
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL PresenterPane::windowResized (const awt::WindowEvent& rEvent)
+{
+ PresenterPaneBase::windowResized(rEvent);
+
+ Invalidate(maBoundingBox);
+
+ LayoutContextWindow();
+ ToTop();
+
+ UpdateBoundingBox();
+ Invalidate(maBoundingBox);
+}
+
+void SAL_CALL PresenterPane::windowMoved (const awt::WindowEvent& rEvent)
+{
+ PresenterPaneBase::windowMoved(rEvent);
+
+ Invalidate(maBoundingBox);
+
+ ToTop();
+
+ UpdateBoundingBox();
+ Invalidate(maBoundingBox);
+}
+
+void SAL_CALL PresenterPane::windowShown (const lang::EventObject& rEvent)
+{
+ PresenterPaneBase::windowShown(rEvent);
+
+ ToTop();
+
+ if (mxContentWindow.is())
+ {
+ LayoutContextWindow();
+ mxContentWindow->setVisible(true);
+ }
+
+ UpdateBoundingBox();
+ Invalidate(maBoundingBox);
+}
+
+void SAL_CALL PresenterPane::windowHidden (const lang::EventObject& rEvent)
+{
+ PresenterPaneBase::windowHidden(rEvent);
+
+ if (mxContentWindow.is())
+ mxContentWindow->setVisible(false);
+}
+
+//----- XPaintListener --------------------------------------------------------
+
+void SAL_CALL PresenterPane::windowPaint (const awt::PaintEvent& rEvent)
+{
+ ThrowIfDisposed();
+
+ PaintBorder(rEvent.UpdateRect);
+}
+
+
+void PresenterPane::CreateCanvases (
+ const Reference<rendering::XSpriteCanvas>& rxParentCanvas)
+{
+ if ( ! mxPresenterHelper.is())
+ return;
+ if ( ! mxParentWindow.is())
+ return;
+ if ( ! rxParentCanvas.is())
+ return;
+
+ mxBorderCanvas = mxPresenterHelper->createSharedCanvas(
+ rxParentCanvas,
+ mxParentWindow,
+ rxParentCanvas,
+ mxParentWindow,
+ mxBorderWindow);
+ mxContentCanvas = mxPresenterHelper->createSharedCanvas(
+ rxParentCanvas,
+ mxParentWindow,
+ rxParentCanvas,
+ mxParentWindow,
+ mxContentWindow);
+
+ PaintBorder(mxBorderWindow->getPosSize());
+}
+
+void PresenterPane::Invalidate (const css::awt::Rectangle& rRepaintBox)
+{
+ // Invalidate the parent window to be able to invalidate an area outside
+ // the current window area.
+ mpPresenterController->GetPaintManager()->Invalidate(mxParentWindow, rRepaintBox);
+}
+
+void PresenterPane::UpdateBoundingBox()
+{
+ if (mxBorderWindow.is() && IsVisible())
+ maBoundingBox = mxBorderWindow->getPosSize();
+ else
+ maBoundingBox = awt::Rectangle();
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterPane.hxx b/sdext/source/presenter/PresenterPane.hxx
new file mode 100644
index 000000000..2a057229f
--- /dev/null
+++ b/sdext/source/presenter/PresenterPane.hxx
@@ -0,0 +1,80 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERPANE_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANE_HXX
+
+#include "PresenterPaneBase.hxx"
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/rendering/XCanvas.hpp>
+#include <rtl/ref.hxx>
+
+namespace sdext::presenter
+{
+/** Pane used by the presenter screen. Pane objects are stored in the
+ PresenterPaneContainer. Sizes and positions are controlled
+ by the PresenterWindowManager. Interactive positioning and resizing is
+ managed by the PresenterPaneBorderManager. Borders around panes are
+ painted by the PresenterPaneBorderPainter.
+*/
+class PresenterPane : public PresenterPaneBase
+{
+public:
+ PresenterPane(const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ virtual ~PresenterPane() override;
+
+ // XPane
+
+ css::uno::Reference<css::awt::XWindow> SAL_CALL getWindow() override;
+
+ css::uno::Reference<css::rendering::XCanvas> SAL_CALL getCanvas() override;
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized(const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved(const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown(const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden(const css::lang::EventObject& rEvent) override;
+
+ // XPaintListener
+
+ virtual void SAL_CALL windowPaint(const css::awt::PaintEvent& rEvent) override;
+
+private:
+ /** Store the bounding box so that when the window is resized or moved
+ we still know the old position and size.
+ */
+ css::awt::Rectangle maBoundingBox;
+
+ virtual void CreateCanvases(
+ const css::uno::Reference<css::rendering::XSpriteCanvas>& rxParentCanvas) override;
+
+ void Invalidate(const css::awt::Rectangle& rRepaintBox);
+ void UpdateBoundingBox();
+};
+
+} // end of namespace ::sd::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterPaneBase.cxx b/sdext/source/presenter/PresenterPaneBase.cxx
new file mode 100644
index 000000000..aac8d082a
--- /dev/null
+++ b/sdext/source/presenter/PresenterPaneBase.cxx
@@ -0,0 +1,342 @@
+/* -*- 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 "PresenterPaneBase.hxx"
+#include "PresenterController.hxx"
+#include "PresenterPaintManager.hxx"
+#include <com/sun/star/awt/PosSize.hpp>
+#include <com/sun/star/awt/XWindow2.hpp>
+
+using namespace css;
+using namespace css::uno;
+using namespace css::drawing::framework;
+
+namespace sdext::presenter {
+
+//===== PresenterPaneBase =====================================================
+
+PresenterPaneBase::PresenterPaneBase (
+ const Reference<XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterPaneBaseInterfaceBase(m_aMutex),
+ mpPresenterController(rpPresenterController),
+ mxComponentContext(rxContext)
+{
+ if (mpPresenterController)
+ mxPresenterHelper = mpPresenterController->GetPresenterHelper();
+}
+
+PresenterPaneBase::~PresenterPaneBase()
+{
+}
+
+void PresenterPaneBase::disposing()
+{
+ if (mxBorderWindow.is())
+ {
+ mxBorderWindow->removeWindowListener(this);
+ mxBorderWindow->removePaintListener(this);
+ }
+
+ {
+ Reference<XComponent> xComponent (mxContentCanvas, UNO_QUERY);
+ mxContentCanvas = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ {
+ Reference<XComponent> xComponent = mxContentWindow;
+ mxContentWindow = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ {
+ Reference<XComponent> xComponent (mxBorderCanvas, UNO_QUERY);
+ mxBorderCanvas = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ {
+ Reference<XComponent> xComponent = mxBorderWindow;
+ mxBorderWindow = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ mxComponentContext = nullptr;
+}
+
+void PresenterPaneBase::SetTitle (const OUString& rsTitle)
+{
+ msTitle = rsTitle;
+
+ OSL_ASSERT(mpPresenterController);
+ OSL_ASSERT(mpPresenterController->GetPaintManager() != nullptr);
+
+ mpPresenterController->GetPaintManager()->Invalidate(mxBorderWindow);
+}
+
+const OUString& PresenterPaneBase::GetTitle() const
+{
+ return msTitle;
+}
+
+const Reference<drawing::framework::XPaneBorderPainter>&
+ PresenterPaneBase::GetPaneBorderPainter() const
+{
+ return mxBorderPainter;
+}
+
+//----- XInitialization -------------------------------------------------------
+
+void SAL_CALL PresenterPaneBase::initialize (const Sequence<Any>& rArguments)
+{
+ ThrowIfDisposed();
+
+ if ( ! mxComponentContext.is())
+ {
+ throw RuntimeException(
+ "PresenterSpritePane: missing component context",
+ static_cast<XWeak*>(this));
+ }
+
+ if (rArguments.getLength() != 5 && rArguments.getLength() != 6)
+ {
+ throw RuntimeException(
+ "PresenterSpritePane: invalid number of arguments",
+ static_cast<XWeak*>(this));
+ }
+
+ try
+ {
+ // Get the resource id from the first argument.
+ if ( ! (rArguments[0] >>= mxPaneId))
+ {
+ throw lang::IllegalArgumentException(
+ "PresenterPane: invalid pane id",
+ static_cast<XWeak*>(this),
+ 0);
+ }
+
+ if ( ! (rArguments[1] >>= mxParentWindow))
+ {
+ throw lang::IllegalArgumentException(
+ "PresenterPane: invalid parent window",
+ static_cast<XWeak*>(this),
+ 1);
+ }
+
+ Reference<rendering::XSpriteCanvas> xParentCanvas;
+ if ( ! (rArguments[2] >>= xParentCanvas))
+ {
+ throw lang::IllegalArgumentException(
+ "PresenterPane: invalid parent canvas",
+ static_cast<XWeak*>(this),
+ 2);
+ }
+
+ if ( ! (rArguments[3] >>= msTitle))
+ {
+ throw lang::IllegalArgumentException(
+ "PresenterPane: invalid title",
+ static_cast<XWeak*>(this),
+ 3);
+ }
+
+ if ( ! (rArguments[4] >>= mxBorderPainter))
+ {
+ throw lang::IllegalArgumentException(
+ "PresenterPane: invalid border painter",
+ static_cast<XWeak*>(this),
+ 4);
+ }
+
+ bool bIsWindowVisibleOnCreation (true);
+ if (rArguments.getLength()>5 && ! (rArguments[5] >>= bIsWindowVisibleOnCreation))
+ {
+ throw lang::IllegalArgumentException(
+ "PresenterPane: invalid window visibility flag",
+ static_cast<XWeak*>(this),
+ 5);
+ }
+
+ CreateWindows(bIsWindowVisibleOnCreation);
+
+ if (mxBorderWindow.is())
+ {
+ mxBorderWindow->addWindowListener(this);
+ mxBorderWindow->addPaintListener(this);
+ }
+
+ CreateCanvases(xParentCanvas);
+
+ // Raise new windows.
+ ToTop();
+ }
+ catch (Exception&)
+ {
+ mxContentWindow = nullptr;
+ mxComponentContext = nullptr;
+ throw;
+ }
+}
+
+//----- XResourceId -----------------------------------------------------------
+
+Reference<XResourceId> SAL_CALL PresenterPaneBase::getResourceId()
+{
+ ThrowIfDisposed();
+ return mxPaneId;
+}
+
+sal_Bool SAL_CALL PresenterPaneBase::isAnchorOnly()
+{
+ return true;
+}
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL PresenterPaneBase::windowResized (const awt::WindowEvent&)
+{
+ ThrowIfDisposed();
+}
+
+void SAL_CALL PresenterPaneBase::windowMoved (const awt::WindowEvent&)
+{
+ ThrowIfDisposed();
+}
+
+void SAL_CALL PresenterPaneBase::windowShown (const lang::EventObject&)
+{
+ ThrowIfDisposed();
+}
+
+void SAL_CALL PresenterPaneBase::windowHidden (const lang::EventObject&)
+{
+ ThrowIfDisposed();
+}
+
+//----- lang::XEventListener --------------------------------------------------
+
+void SAL_CALL PresenterPaneBase::disposing (const lang::EventObject& rEvent)
+{
+ if (rEvent.Source == mxBorderWindow)
+ {
+ mxBorderWindow = nullptr;
+ }
+}
+
+
+void PresenterPaneBase::CreateWindows (
+ const bool bIsWindowVisibleOnCreation)
+{
+ if (!(mxPresenterHelper.is() && mxParentWindow.is()))
+ return;
+
+ mxBorderWindow = mxPresenterHelper->createWindow(
+ mxParentWindow,
+ false,
+ bIsWindowVisibleOnCreation,
+ false,
+ false);
+ mxContentWindow = mxPresenterHelper->createWindow(
+ mxBorderWindow,
+ false,
+ bIsWindowVisibleOnCreation,
+ false,
+ false);
+}
+
+const Reference<awt::XWindow>& PresenterPaneBase::GetBorderWindow() const
+{
+ return mxBorderWindow;
+}
+
+void PresenterPaneBase::ToTop()
+{
+ if (mxPresenterHelper.is())
+ mxPresenterHelper->toTop(mxContentWindow);
+}
+
+void PresenterPaneBase::PaintBorder (const awt::Rectangle& rUpdateBox)
+{
+ OSL_ASSERT(mxPaneId.is());
+
+ if (!(mxBorderPainter.is() && mxBorderWindow.is() && mxBorderCanvas.is()))
+ return;
+
+ awt::Rectangle aBorderBox (mxBorderWindow->getPosSize());
+ awt::Rectangle aLocalBorderBox (0,0, aBorderBox.Width, aBorderBox.Height);
+
+ //TODO: paint border background?
+
+ mxBorderPainter->paintBorder(
+ mxPaneId->getResourceURL(),
+ mxBorderCanvas,
+ aLocalBorderBox,
+ rUpdateBox,
+ msTitle);
+}
+
+void PresenterPaneBase::LayoutContextWindow()
+{
+ OSL_ASSERT(mxPaneId.is());
+ OSL_ASSERT(mxBorderWindow.is());
+ OSL_ASSERT(mxContentWindow.is());
+ if (!(mxBorderPainter.is() && mxPaneId.is() && mxBorderWindow.is() && mxContentWindow.is()))
+ return;
+
+ const awt::Rectangle aBorderBox (mxBorderWindow->getPosSize());
+ const awt::Rectangle aInnerBox (mxBorderPainter->removeBorder(
+ mxPaneId->getResourceURL(),
+ aBorderBox,
+ drawing::framework::BorderType_TOTAL_BORDER));
+ mxContentWindow->setPosSize(
+ aInnerBox.X - aBorderBox.X,
+ aInnerBox.Y - aBorderBox.Y,
+ aInnerBox.Width,
+ aInnerBox.Height,
+ awt::PosSize::POSSIZE);
+}
+
+bool PresenterPaneBase::IsVisible() const
+{
+ Reference<awt::XWindow2> xWindow2 (mxBorderPainter, UNO_QUERY);
+ if (xWindow2.is())
+ return xWindow2->isVisible();
+
+ return false;
+}
+
+void PresenterPaneBase::ThrowIfDisposed()
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterPane object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterPaneBase.hxx b/sdext/source/presenter/PresenterPaneBase.hxx
new file mode 100644
index 000000000..6df93af3e
--- /dev/null
+++ b/sdext/source/presenter/PresenterPaneBase.hxx
@@ -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/.
+ *
+ * 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_SDEXT_SOURCE_PRESENTER_PRESENTERPANEBASE_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANEBASE_HXX
+
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/drawing/XPresenterHelper.hpp>
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/drawing/framework/XPaneBorderPainter.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/rendering/XCanvas.hpp>
+#include <rtl/ref.hxx>
+
+
+namespace sdext::presenter {
+
+class PresenterController;
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::drawing::framework::XPane,
+ css::lang::XInitialization,
+ css::awt::XWindowListener,
+ css::awt::XPaintListener
+> PresenterPaneBaseInterfaceBase;
+
+/** Base class of the panes used by the presenter screen. Pane objects are
+ stored in the PresenterPaneContainer. Sizes and positions are
+ controlled by the PresenterWindowManager. Interactive positioning and
+ resizing is managed by the PresenterPaneBorderManager. Borders around
+ panes are painted by the PresenterPaneBorderPainter.
+*/
+class PresenterPaneBase
+ : protected ::cppu::BaseMutex,
+ public PresenterPaneBaseInterfaceBase
+{
+public:
+ PresenterPaneBase (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ virtual ~PresenterPaneBase() override;
+ PresenterPaneBase(const PresenterPaneBase&) = delete;
+ PresenterPaneBase& operator=(const PresenterPaneBase&) = delete;
+
+ virtual void SAL_CALL disposing() override;
+
+ const css::uno::Reference<css::awt::XWindow>& GetBorderWindow() const;
+ void SetTitle (const OUString& rsTitle);
+ const OUString& GetTitle() const;
+ const css::uno::Reference<css::drawing::framework::XPaneBorderPainter>& GetPaneBorderPainter() const;
+
+ // XInitialization
+
+ virtual void SAL_CALL initialize (const css::uno::Sequence<css::uno::Any>& rArguments) override;
+
+ // XResourceId
+
+ virtual css::uno::Reference<css::drawing::framework::XResourceId> SAL_CALL getResourceId() override;
+
+ virtual sal_Bool SAL_CALL isAnchorOnly() override;
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override;
+
+ // lang::XEventListener
+
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+
+protected:
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ css::uno::Reference<css::awt::XWindow> mxParentWindow;
+ css::uno::Reference<css::awt::XWindow> mxBorderWindow;
+ css::uno::Reference<css::rendering::XCanvas> mxBorderCanvas;
+ css::uno::Reference<css::awt::XWindow> mxContentWindow;
+ css::uno::Reference<css::rendering::XCanvas> mxContentCanvas;
+ css::uno::Reference<css::drawing::framework::XResourceId> mxPaneId;
+ css::uno::Reference<css::drawing::framework::XPaneBorderPainter> mxBorderPainter;
+ css::uno::Reference<css::drawing::XPresenterHelper> mxPresenterHelper;
+ OUString msTitle;
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+
+ virtual void CreateCanvases (
+ const css::uno::Reference<css::rendering::XSpriteCanvas>& rxParentCanvas) = 0;
+
+ void CreateWindows (
+ const bool bIsWindowVisibleOnCreation);
+ void PaintBorder (const css::awt::Rectangle& rUpdateRectangle);
+ void ToTop();
+ void LayoutContextWindow();
+ bool IsVisible() const;
+
+ /** @throws css::lang::DisposedException when the object has already been
+ disposed.
+ */
+ void ThrowIfDisposed();
+};
+
+} // end of namespace ::sd::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterPaneBorderPainter.cxx b/sdext/source/presenter/PresenterPaneBorderPainter.cxx
new file mode 100644
index 000000000..6c0198c7e
--- /dev/null
+++ b/sdext/source/presenter/PresenterPaneBorderPainter.cxx
@@ -0,0 +1,882 @@
+/* -*- 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 "PresenterPaneBorderPainter.hxx"
+#include "PresenterCanvasHelper.hxx"
+#include "PresenterGeometryHelper.hxx"
+#include "PresenterTheme.hxx"
+#include <com/sun/star/awt/Point.hpp>
+#include <com/sun/star/awt/Rectangle.hpp>
+#include <com/sun/star/drawing/XPresenterHelper.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <com/sun/star/rendering/FillRule.hpp>
+#include <com/sun/star/rendering/TextDirection.hpp>
+#include <com/sun/star/rendering/XSpriteCanvas.hpp>
+#include <map>
+#include <memory>
+#include <vector>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sdext::presenter {
+
+namespace {
+ class BorderSize
+ {
+ public:
+ BorderSize();
+ sal_Int32 mnLeft;
+ sal_Int32 mnTop;
+ sal_Int32 mnRight;
+ sal_Int32 mnBottom;
+ };
+
+ class RendererPaneStyle
+ {
+ public:
+ RendererPaneStyle (
+ const std::shared_ptr<PresenterTheme>& rpTheme,
+ const OUString& rsStyleName);
+
+ awt::Rectangle AddBorder (
+ const awt::Rectangle& rBox,
+ drawing::framework::BorderType eBorderType) const;
+ awt::Rectangle RemoveBorder (
+ const awt::Rectangle& rBox,
+ drawing::framework::BorderType eBorderType) const;
+ Reference<rendering::XCanvasFont> GetFont (
+ const Reference<rendering::XCanvas>& rxCanvas) const;
+
+ SharedBitmapDescriptor mpTopLeft;
+ SharedBitmapDescriptor mpTop;
+ SharedBitmapDescriptor mpTopRight;
+ SharedBitmapDescriptor mpLeft;
+ SharedBitmapDescriptor mpRight;
+ SharedBitmapDescriptor mpBottomLeft;
+ SharedBitmapDescriptor mpBottom;
+ SharedBitmapDescriptor mpBottomRight;
+ SharedBitmapDescriptor mpBottomCallout;
+ SharedBitmapDescriptor mpEmpty;
+ PresenterTheme::SharedFontDescriptor mpFont;
+ sal_Int32 mnFontXOffset;
+ sal_Int32 mnFontYOffset;
+ enum class Anchor { Left, Right, Center };
+ Anchor meFontAnchor;
+ BorderSize maInnerBorderSize;
+ BorderSize maOuterBorderSize;
+ BorderSize maTotalBorderSize;
+ private:
+ void UpdateBorderSizes();
+ SharedBitmapDescriptor GetBitmap(
+ const std::shared_ptr<PresenterTheme>& rpTheme,
+ const OUString& rsStyleName,
+ const OUString& rsBitmapName);
+ };
+}
+
+class PresenterPaneBorderPainter::Renderer
+{
+public:
+ Renderer (
+ const Reference<XComponentContext>& rxContext,
+ const std::shared_ptr<PresenterTheme>& rpTheme);
+
+ void SetCanvas (const Reference<rendering::XCanvas>& rxCanvas);
+ void PaintBorder (
+ const OUString& rsTitle,
+ const awt::Rectangle& rBBox,
+ const awt::Rectangle& rUpdateBox,
+ const OUString& rsPaneURL);
+ void PaintTitle (
+ const OUString& rsTitle,
+ const std::shared_ptr<RendererPaneStyle>& rpStyle,
+ const awt::Rectangle& rUpdateBox,
+ const awt::Rectangle& rOuterBox,
+ const awt::Rectangle& rInnerBox);
+ void SetupClipping (
+ const awt::Rectangle& rUpdateBox,
+ const awt::Rectangle& rOuterBox,
+ const OUString& rsPaneStyleName);
+ std::shared_ptr<RendererPaneStyle> GetRendererPaneStyle (const OUString& rsResourceURL);
+ void SetCalloutAnchor (
+ const awt::Point& rCalloutAnchor);
+
+private:
+ std::shared_ptr<PresenterTheme> mpTheme;
+ typedef ::std::map<OUString, std::shared_ptr<RendererPaneStyle> > RendererPaneStyleContainer;
+ RendererPaneStyleContainer maRendererPaneStyles;
+ Reference<rendering::XCanvas> mxCanvas;
+ Reference<drawing::XPresenterHelper> mxPresenterHelper;
+ css::rendering::ViewState maViewState;
+ Reference<rendering::XPolyPolygon2D> mxViewStateClip;
+ bool mbHasCallout;
+ awt::Point maCalloutAnchor;
+
+ void PaintBitmap(
+ const awt::Rectangle& rBox,
+ const awt::Rectangle& rUpdateBox,
+ const sal_Int32 nXPosition,
+ const sal_Int32 nYPosition,
+ const sal_Int32 nStartOffset,
+ const sal_Int32 nEndOffset,
+ const bool bExpand,
+ const SharedBitmapDescriptor& rpBitmap);
+};
+
+// ===== PresenterPaneBorderPainter ===========================================
+
+PresenterPaneBorderPainter::PresenterPaneBorderPainter (
+ const Reference<XComponentContext>& rxContext)
+ : PresenterPaneBorderPainterInterfaceBase(m_aMutex),
+ mxContext(rxContext)
+{
+}
+
+PresenterPaneBorderPainter::~PresenterPaneBorderPainter()
+{
+}
+
+//----- XPaneBorderPainter ----------------------------------------------------
+
+awt::Rectangle SAL_CALL PresenterPaneBorderPainter::addBorder (
+ const OUString& rsPaneBorderStyleName,
+ const css::awt::Rectangle& rRectangle,
+ drawing::framework::BorderType eBorderType)
+{
+ ThrowIfDisposed();
+
+ ProvideTheme();
+
+ return AddBorder(rsPaneBorderStyleName, rRectangle, eBorderType);
+}
+
+awt::Rectangle SAL_CALL PresenterPaneBorderPainter::removeBorder (
+ const OUString& rsPaneBorderStyleName,
+ const css::awt::Rectangle& rRectangle,
+ drawing::framework::BorderType eBorderType)
+{
+ ThrowIfDisposed();
+
+ ProvideTheme();
+
+ return RemoveBorder(rsPaneBorderStyleName, rRectangle, eBorderType);
+}
+
+void SAL_CALL PresenterPaneBorderPainter::paintBorder (
+ const OUString& rsPaneBorderStyleName,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rOuterBorderRectangle,
+ const css::awt::Rectangle& rRepaintArea,
+ const OUString& rsTitle)
+{
+ ThrowIfDisposed();
+
+ // Early reject paints completely outside the repaint area.
+ if (rRepaintArea.X >= rOuterBorderRectangle.X+rOuterBorderRectangle.Width
+ || rRepaintArea.Y >= rOuterBorderRectangle.Y+rOuterBorderRectangle.Height
+ || rRepaintArea.X+rRepaintArea.Width <= rOuterBorderRectangle.X
+ || rRepaintArea.Y+rRepaintArea.Height <= rOuterBorderRectangle.Y)
+ {
+ return;
+ }
+ ProvideTheme(rxCanvas);
+
+ if (mpRenderer == nullptr)
+ return;
+
+ mpRenderer->SetCanvas(rxCanvas);
+ mpRenderer->SetupClipping(
+ rRepaintArea,
+ rOuterBorderRectangle,
+ rsPaneBorderStyleName);
+ mpRenderer->PaintBorder(
+ rsTitle,
+ rOuterBorderRectangle,
+ rRepaintArea,
+ rsPaneBorderStyleName);
+}
+
+void SAL_CALL PresenterPaneBorderPainter::paintBorderWithCallout (
+ const OUString& rsPaneBorderStyleName,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rOuterBorderRectangle,
+ const css::awt::Rectangle& rRepaintArea,
+ const OUString& rsTitle,
+ const css::awt::Point& rCalloutAnchor)
+{
+ ThrowIfDisposed();
+
+ // Early reject paints completely outside the repaint area.
+ if (rRepaintArea.X >= rOuterBorderRectangle.X+rOuterBorderRectangle.Width
+ || rRepaintArea.Y >= rOuterBorderRectangle.Y+rOuterBorderRectangle.Height
+ || rRepaintArea.X+rRepaintArea.Width <= rOuterBorderRectangle.X
+ || rRepaintArea.Y+rRepaintArea.Height <= rOuterBorderRectangle.Y)
+ {
+ return;
+ }
+ ProvideTheme(rxCanvas);
+
+ if (mpRenderer == nullptr)
+ return;
+
+ mpRenderer->SetCanvas(rxCanvas);
+ mpRenderer->SetupClipping(
+ rRepaintArea,
+ rOuterBorderRectangle,
+ rsPaneBorderStyleName);
+ mpRenderer->SetCalloutAnchor(rCalloutAnchor);
+ mpRenderer->PaintBorder(
+ rsTitle,
+ rOuterBorderRectangle,
+ rRepaintArea,
+ rsPaneBorderStyleName);
+}
+
+awt::Point SAL_CALL PresenterPaneBorderPainter::getCalloutOffset (
+ const OUString& rsPaneBorderStyleName)
+{
+ ThrowIfDisposed();
+ ProvideTheme();
+ if (mpRenderer != nullptr)
+ {
+ const std::shared_ptr<RendererPaneStyle> pRendererPaneStyle(
+ mpRenderer->GetRendererPaneStyle(rsPaneBorderStyleName));
+ if (pRendererPaneStyle != nullptr && pRendererPaneStyle->mpBottomCallout)
+ {
+ return awt::Point (
+ 0,
+ pRendererPaneStyle->mpBottomCallout->mnHeight
+ - pRendererPaneStyle->mpBottomCallout->mnYHotSpot);
+ }
+ }
+
+ return awt::Point(0,0);
+}
+
+
+bool PresenterPaneBorderPainter::ProvideTheme (const Reference<rendering::XCanvas>& rxCanvas)
+{
+ bool bModified (false);
+
+ if ( ! mxContext.is())
+ return false;
+
+ if (mpTheme != nullptr)
+ {
+ // Check if the theme already has a canvas.
+ if ( ! mpTheme->HasCanvas())
+ {
+ mpTheme->ProvideCanvas(rxCanvas);
+ bModified = true;
+ }
+ }
+ else
+ {
+ mpTheme = std::make_shared<PresenterTheme>(mxContext, rxCanvas);
+ bModified = true;
+ }
+
+ if (bModified)
+ {
+ if (mpRenderer == nullptr)
+ mpRenderer.reset(new Renderer(mxContext, mpTheme));
+ else
+ mpRenderer->SetCanvas(rxCanvas);
+ }
+
+ return bModified;
+}
+
+void PresenterPaneBorderPainter::ProvideTheme()
+{
+ if (mpTheme == nullptr)
+ {
+ // Create a theme without bitmaps (no canvas => no bitmaps).
+ ProvideTheme(nullptr);
+ }
+ // When there already is a theme then without a canvas we can not
+ // add anything new.
+}
+
+void PresenterPaneBorderPainter::SetTheme (const std::shared_ptr<PresenterTheme>& rpTheme)
+{
+ mpTheme = rpTheme;
+ if (mpRenderer == nullptr)
+ mpRenderer.reset(new Renderer(mxContext, mpTheme));
+}
+
+awt::Rectangle PresenterPaneBorderPainter::AddBorder (
+ const OUString& rsPaneURL,
+ const awt::Rectangle& rInnerBox,
+ const css::drawing::framework::BorderType eBorderType) const
+{
+ if (mpRenderer != nullptr)
+ {
+ const std::shared_ptr<RendererPaneStyle> pRendererPaneStyle(mpRenderer->GetRendererPaneStyle(rsPaneURL));
+ if (pRendererPaneStyle != nullptr)
+ return pRendererPaneStyle->AddBorder(rInnerBox, eBorderType);
+ }
+ return rInnerBox;
+}
+
+awt::Rectangle PresenterPaneBorderPainter::RemoveBorder (
+ const OUString& rsPaneURL,
+ const css::awt::Rectangle& rOuterBox,
+ const css::drawing::framework::BorderType eBorderType) const
+{
+ if (mpRenderer != nullptr)
+ {
+ const std::shared_ptr<RendererPaneStyle> pRendererPaneStyle(mpRenderer->GetRendererPaneStyle(rsPaneURL));
+ if (pRendererPaneStyle != nullptr)
+ return pRendererPaneStyle->RemoveBorder(rOuterBox, eBorderType);
+ }
+ return rOuterBox;
+}
+
+void PresenterPaneBorderPainter::ThrowIfDisposed() const
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterPaneBorderPainter object has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+//===== PresenterPaneBorderPainter::Renderer =====================================
+
+PresenterPaneBorderPainter::Renderer::Renderer (
+ const Reference<XComponentContext>& rxContext,
+ const std::shared_ptr<PresenterTheme>& rpTheme)
+ : mpTheme(rpTheme),
+ maViewState(geometry::AffineMatrix2D(1,0,0, 0,1,0), nullptr),
+ mbHasCallout(false)
+{
+ Reference<lang::XMultiComponentFactory> xFactory (rxContext->getServiceManager());
+ if (xFactory.is())
+ {
+ mxPresenterHelper.set(
+ xFactory->createInstanceWithContext(
+ "com.sun.star.comp.Draw.PresenterHelper",
+ rxContext),
+ UNO_QUERY_THROW);
+ }
+}
+
+void PresenterPaneBorderPainter::Renderer::SetCanvas (const Reference<rendering::XCanvas>& rxCanvas)
+{
+ if (mxCanvas != rxCanvas)
+ {
+ mxCanvas = rxCanvas;
+ }
+}
+
+void PresenterPaneBorderPainter::Renderer::PaintBorder (
+ const OUString& rsTitle,
+ const awt::Rectangle& rBBox,
+ const awt::Rectangle& rUpdateBox,
+ const OUString& rsPaneURL)
+{
+ if ( ! mxCanvas.is())
+ return;
+
+ // Create the outer and inner border of the, ahm, border.
+ std::shared_ptr<RendererPaneStyle> pStyle (GetRendererPaneStyle(rsPaneURL));
+ if (pStyle == nullptr)
+ return;
+
+ awt::Rectangle aOuterBox (rBBox);
+ awt::Rectangle aCenterBox (
+ pStyle->RemoveBorder(aOuterBox, drawing::framework::BorderType_OUTER_BORDER));
+ awt::Rectangle aInnerBox (
+ pStyle->RemoveBorder(aOuterBox, drawing::framework::BorderType_TOTAL_BORDER));
+
+ // Prepare references for all used bitmaps.
+ SharedBitmapDescriptor pTop (pStyle->mpTop);
+ SharedBitmapDescriptor pTopLeft (pStyle->mpTopLeft);
+ SharedBitmapDescriptor pTopRight (pStyle->mpTopRight);
+ SharedBitmapDescriptor pLeft (pStyle->mpLeft);
+ SharedBitmapDescriptor pRight (pStyle->mpRight);
+ SharedBitmapDescriptor pBottomLeft (pStyle->mpBottomLeft);
+ SharedBitmapDescriptor pBottomRight (pStyle->mpBottomRight);
+ SharedBitmapDescriptor pBottom (pStyle->mpBottom);
+
+ // Paint the sides.
+ PaintBitmap(aCenterBox, rUpdateBox, 0,-1,
+ pTopLeft->mnXOffset, pTopRight->mnXOffset, true, pTop);
+ PaintBitmap(aCenterBox, rUpdateBox, -1,0,
+ pTopLeft->mnYOffset, pBottomLeft->mnYOffset, true, pLeft);
+ PaintBitmap(aCenterBox, rUpdateBox, +1,0,
+ pTopRight->mnYOffset, pBottomRight->mnYOffset, true, pRight);
+ if (mbHasCallout && pStyle->mpBottomCallout->GetNormalBitmap().is())
+ {
+ const sal_Int32 nCalloutWidth (pStyle->mpBottomCallout->mnWidth);
+ sal_Int32 nCalloutX (maCalloutAnchor.X - pStyle->mpBottomCallout->mnXHotSpot
+ - (aCenterBox.X - aOuterBox.X));
+ if (nCalloutX < pBottomLeft->mnXOffset + aCenterBox.X)
+ nCalloutX = pBottomLeft->mnXOffset + aCenterBox.X;
+ if (nCalloutX > pBottomRight->mnXOffset + aCenterBox.X + aCenterBox.Width)
+ nCalloutX = pBottomRight->mnXOffset + aCenterBox.X + aCenterBox.Width;
+ // Paint bottom callout.
+ PaintBitmap(aCenterBox, rUpdateBox, 0,+1, nCalloutX,0, false, pStyle->mpBottomCallout);
+ // Paint regular bottom bitmap left and right.
+ PaintBitmap(aCenterBox, rUpdateBox, 0,+1,
+ pBottomLeft->mnXOffset, nCalloutX-aCenterBox.Width, true, pBottom);
+ PaintBitmap(aCenterBox, rUpdateBox, 0,+1,
+ nCalloutX+nCalloutWidth, pBottomRight->mnXOffset, true, pBottom);
+ }
+ else
+ {
+ // Stretch the bottom bitmap over the full width.
+ PaintBitmap(aCenterBox, rUpdateBox, 0,+1,
+ pBottomLeft->mnXOffset, pBottomRight->mnXOffset, true, pBottom);
+ }
+
+ // Paint the corners.
+ PaintBitmap(aCenterBox, rUpdateBox, -1,-1, 0,0, false, pTopLeft);
+ PaintBitmap(aCenterBox, rUpdateBox, +1,-1, 0,0, false, pTopRight);
+ PaintBitmap(aCenterBox, rUpdateBox, -1,+1, 0,0, false, pBottomLeft);
+ PaintBitmap(aCenterBox, rUpdateBox, +1,+1, 0,0, false, pBottomRight);
+
+ // Paint the title.
+ PaintTitle(rsTitle, pStyle, rUpdateBox, aOuterBox, aInnerBox);
+
+ // In a double buffering environment request to make the changes visible.
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ xSpriteCanvas->updateScreen(false);
+}
+
+void PresenterPaneBorderPainter::Renderer::PaintTitle (
+ const OUString& rsTitle,
+ const std::shared_ptr<RendererPaneStyle>& rpStyle,
+ const awt::Rectangle& rUpdateBox,
+ const awt::Rectangle& rOuterBox,
+ const awt::Rectangle& rInnerBox)
+{
+ if ( ! mxCanvas.is())
+ return;
+
+ if (rsTitle.isEmpty())
+ return;
+
+ Reference<rendering::XCanvasFont> xFont (rpStyle->GetFont(mxCanvas));
+ if ( ! xFont.is())
+ return;
+
+ rendering::StringContext aContext (
+ rsTitle,
+ 0,
+ rsTitle.getLength());
+ Reference<rendering::XTextLayout> xLayout (xFont->createTextLayout(
+ aContext,
+ rendering::TextDirection::WEAK_LEFT_TO_RIGHT,
+ 0));
+ if ( ! xLayout.is())
+ return;
+
+ /// this is responsible of the texts above the slide windows
+ geometry::RealRectangle2D aBox (xLayout->queryTextBounds());
+ const double nTextHeight = aBox.Y2 - aBox.Y1;
+ const double nTextWidth = aBox.X1 + aBox.X2;
+ const sal_Int32 nTitleBarHeight = rInnerBox.Y - rOuterBox.Y - 1;
+ double nY = rOuterBox.Y + (nTitleBarHeight - nTextHeight) / 2 - aBox.Y1;
+ if (nY >= rInnerBox.Y)
+ nY = rInnerBox.Y - 1;
+ double nX;
+ switch (rpStyle->meFontAnchor)
+ {
+ case RendererPaneStyle::Anchor::Left:
+ nX = rInnerBox.X;
+ break;
+ case RendererPaneStyle::Anchor::Right:
+ nX = rInnerBox.X + rInnerBox.Width - nTextWidth;
+ break;
+ default: // RendererPaneStyle::Anchor::Center
+ nX = rInnerBox.X + (rInnerBox.Width - nTextWidth)/2;
+ break;
+ }
+ nX += rpStyle->mnFontXOffset;
+ nY += rpStyle->mnFontYOffset;
+
+ if (rUpdateBox.X >= nX+nTextWidth
+ || rUpdateBox.Y >= nY+nTextHeight
+ || rUpdateBox.X+rUpdateBox.Width <= nX
+ || rUpdateBox.Y+rUpdateBox.Height <= nY)
+ {
+ return;
+ }
+
+ rendering::RenderState aRenderState(
+ geometry::AffineMatrix2D(1,0,nX, 0,1,nY),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+
+ PresenterCanvasHelper::SetDeviceColor(
+ aRenderState,
+ rpStyle->mpFont->mnColor);
+
+ mxCanvas->drawTextLayout (
+ xLayout,
+ maViewState,
+ aRenderState);
+}
+
+std::shared_ptr<RendererPaneStyle>
+ PresenterPaneBorderPainter::Renderer::GetRendererPaneStyle (const OUString& rsResourceURL)
+{
+ OSL_ASSERT(mpTheme != nullptr);
+
+ RendererPaneStyleContainer::const_iterator iStyle (maRendererPaneStyles.find(rsResourceURL));
+ if (iStyle == maRendererPaneStyles.end())
+ {
+ OUString sPaneStyleName ("DefaultRendererPaneStyle");
+
+ // Get pane layout name for resource URL.
+ const OUString sStyleName (mpTheme->GetStyleName(rsResourceURL));
+ if (!sStyleName.isEmpty())
+ sPaneStyleName = sStyleName;
+
+ // Create a new pane style object and initialize it with bitmaps.
+ auto pStyle = std::make_shared<RendererPaneStyle>(mpTheme,sPaneStyleName);
+ iStyle = maRendererPaneStyles.emplace(rsResourceURL, pStyle).first;
+ }
+ if (iStyle != maRendererPaneStyles.end())
+ return iStyle->second;
+ else
+ return std::shared_ptr<RendererPaneStyle>();
+}
+
+void PresenterPaneBorderPainter::Renderer::SetCalloutAnchor (
+ const awt::Point& rCalloutAnchor)
+{
+ mbHasCallout = true;
+ maCalloutAnchor = rCalloutAnchor;
+}
+
+void PresenterPaneBorderPainter::Renderer::PaintBitmap(
+ const awt::Rectangle& rBox,
+ const awt::Rectangle& rUpdateBox,
+ const sal_Int32 nXPosition,
+ const sal_Int32 nYPosition,
+ const sal_Int32 nStartOffset,
+ const sal_Int32 nEndOffset,
+ const bool bExpand,
+ const SharedBitmapDescriptor& rpBitmap)
+{
+ bool bUseCanvas (mxCanvas.is());
+ if ( ! bUseCanvas)
+ return;
+
+ if (rpBitmap->mnWidth<=0 || rpBitmap->mnHeight<=0)
+ return;
+
+ Reference<rendering::XBitmap> xBitmap = rpBitmap->GetNormalBitmap();
+ if ( ! xBitmap.is())
+ return;
+
+ // Calculate position, and for side bitmaps, the size.
+ sal_Int32 nX = 0;
+ sal_Int32 nY = 0;
+ sal_Int32 nW = rpBitmap->mnWidth;
+ sal_Int32 nH = rpBitmap->mnHeight;
+ if (nXPosition < 0)
+ {
+ nX = rBox.X - rpBitmap->mnWidth + rpBitmap->mnXOffset;
+ }
+ else if (nXPosition > 0)
+ {
+ nX = rBox.X + rBox.Width + rpBitmap->mnXOffset;
+ }
+ else
+ {
+ nX = rBox.X + nStartOffset;
+ if (bExpand)
+ nW = rBox.Width - nStartOffset + nEndOffset;
+ }
+
+ if (nYPosition < 0)
+ {
+ nY = rBox.Y - rpBitmap->mnHeight + rpBitmap->mnYOffset;
+ }
+ else if (nYPosition > 0)
+ {
+ nY = rBox.Y + rBox.Height + rpBitmap->mnYOffset;
+ }
+ else
+ {
+ nY = rBox.Y + nStartOffset;
+ if (bExpand)
+ nH = rBox.Height - nStartOffset + nEndOffset;
+ }
+
+ // Do not paint when bitmap area does not intersect with update box.
+ if (nX >= rUpdateBox.X + rUpdateBox.Width
+ || nX+nW <= rUpdateBox.X
+ || nY >= rUpdateBox.Y + rUpdateBox.Height
+ || nY+nH <= rUpdateBox.Y)
+ {
+ return;
+ }
+
+ /*
+ Reference<rendering::XBitmap> xMaskedBitmap (
+ PresenterBitmapHelper::FillMaskedWithColor (
+ mxCanvas,
+ Reference<rendering::XIntegerBitmap>(xBitmap, UNO_QUERY),
+ rBitmap.mxMaskBitmap,
+ 0x00ff0000,
+ rBackgroundBitmap.maReplacementColor));
+ if (xMaskedBitmap.is())
+ xBitmap = xMaskedBitmap;
+ else if (rBitmap.mxMaskBitmap.is() && mxPresenterHelper.is())
+ {
+ const static sal_Int32 nOutsideMaskColor (0x00ff0000);
+ Reference<rendering::XIntegerBitmap> xMask (
+ mxPresenterHelper->createMask(
+ mxCanvas,
+ rBitmap.mxMaskBitmap,
+ nOutsideMaskColor,
+ false));
+ xBitmap = mxPresenterHelper->applyBitmapMaskWithColor(
+ mxCanvas,
+ Reference<rendering::XIntegerBitmap>(xBitmap, UNO_QUERY),
+ xMask,
+ rBackgroundBitmap.maReplacementColor);
+ }
+ */
+ rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(
+ double(nW)/rpBitmap->mnWidth, 0, nX,
+ 0, double(nH)/rpBitmap->mnHeight, nY),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::OVER);
+
+ if (xBitmap.is())
+ mxCanvas->drawBitmap(
+ xBitmap,
+ maViewState,
+ aRenderState);
+}
+
+void PresenterPaneBorderPainter::Renderer::SetupClipping (
+ const awt::Rectangle& rUpdateBox,
+ const awt::Rectangle& rOuterBox,
+ const OUString& rsPaneStyleName)
+{
+ mxViewStateClip = nullptr;
+ maViewState.Clip = nullptr;
+
+ if ( ! mxCanvas.is())
+ return;
+
+ std::shared_ptr<RendererPaneStyle> pStyle (GetRendererPaneStyle(rsPaneStyleName));
+ if (pStyle == nullptr)
+ {
+ mxViewStateClip = PresenterGeometryHelper::CreatePolygon(
+ rUpdateBox,
+ mxCanvas->getDevice());
+ }
+ else
+ {
+ awt::Rectangle aInnerBox (
+ pStyle->RemoveBorder(rOuterBox, drawing::framework::BorderType_TOTAL_BORDER));
+ ::std::vector<awt::Rectangle> aRectangles
+ {
+ PresenterGeometryHelper::Intersection(rUpdateBox, rOuterBox),
+ PresenterGeometryHelper::Intersection(rUpdateBox, aInnerBox)
+ };
+ mxViewStateClip = PresenterGeometryHelper::CreatePolygon(
+ aRectangles,
+ mxCanvas->getDevice());
+ if (mxViewStateClip.is())
+ mxViewStateClip->setFillRule(rendering::FillRule_EVEN_ODD);
+ }
+ maViewState.Clip = mxViewStateClip;
+}
+
+namespace {
+
+//===== BorderSize ============================================================
+
+BorderSize::BorderSize()
+ : mnLeft(0),
+ mnTop(0),
+ mnRight(0),
+ mnBottom(0)
+{
+}
+
+//===== RendererPaneStyle ============================================================
+
+RendererPaneStyle::RendererPaneStyle (
+ const std::shared_ptr<PresenterTheme>& rpTheme,
+ const OUString& rsStyleName)
+ : mpEmpty(std::make_shared<PresenterBitmapDescriptor>()),
+ mnFontXOffset(0),
+ mnFontYOffset(0),
+ meFontAnchor(Anchor::Center)
+{
+ if (rpTheme == nullptr)
+ return;
+
+ mpTopLeft = GetBitmap(rpTheme, rsStyleName, "TopLeft");
+ mpTop = GetBitmap(rpTheme, rsStyleName, "Top");
+ mpTopRight = GetBitmap(rpTheme, rsStyleName, "TopRight");
+ mpLeft = GetBitmap(rpTheme, rsStyleName,"Left");
+ mpRight = GetBitmap(rpTheme, rsStyleName, "Right");
+ mpBottomLeft = GetBitmap(rpTheme, rsStyleName, "BottomLeft");
+ mpBottom = GetBitmap(rpTheme, rsStyleName, "Bottom");
+ mpBottomRight = GetBitmap(rpTheme, rsStyleName, "BottomRight");
+ mpBottomCallout = GetBitmap(rpTheme, rsStyleName, "BottomCallout");
+
+ // Get font description.
+ mpFont = rpTheme->GetFont(rsStyleName);
+
+ OUString sAnchor ("Left");
+ if (mpFont)
+ {
+ sAnchor = mpFont->msAnchor;
+ mnFontXOffset = mpFont->mnXOffset;
+ mnFontYOffset = mpFont->mnYOffset;
+ }
+
+ if ( sAnchor == "Left" )
+ meFontAnchor = Anchor::Left;
+ else if ( sAnchor == "Right" )
+ meFontAnchor = Anchor::Right;
+ else
+ meFontAnchor = Anchor::Center;
+
+ // Get border sizes.
+ try
+ {
+ ::std::vector<sal_Int32> aInnerBorder (rpTheme->GetBorderSize(rsStyleName, false));
+ OSL_ASSERT(aInnerBorder.size()==4);
+ maInnerBorderSize.mnLeft = aInnerBorder[0];
+ maInnerBorderSize.mnTop = aInnerBorder[1];
+ maInnerBorderSize.mnRight = aInnerBorder[2];
+ maInnerBorderSize.mnBottom = aInnerBorder[3];
+
+ ::std::vector<sal_Int32> aOuterBorder (rpTheme->GetBorderSize(rsStyleName, true));
+ OSL_ASSERT(aOuterBorder.size()==4);
+ maOuterBorderSize.mnLeft = aOuterBorder[0];
+ maOuterBorderSize.mnTop = aOuterBorder[1];
+ maOuterBorderSize.mnRight = aOuterBorder[2];
+ maOuterBorderSize.mnBottom = aOuterBorder[3];
+ }
+ catch(beans::UnknownPropertyException&)
+ {
+ OSL_ASSERT(false);
+ }
+
+ UpdateBorderSizes();
+}
+
+awt::Rectangle RendererPaneStyle::AddBorder (
+ const awt::Rectangle& rBox,
+ const drawing::framework::BorderType eBorderType) const
+{
+ const BorderSize* pBorderSize = nullptr;
+ switch (eBorderType)
+ {
+ case drawing::framework::BorderType_INNER_BORDER:
+ pBorderSize = &maInnerBorderSize;
+ break;
+ case drawing::framework::BorderType_OUTER_BORDER:
+ pBorderSize = &maOuterBorderSize;
+ break;
+ case drawing::framework::BorderType_TOTAL_BORDER:
+ pBorderSize = &maTotalBorderSize;
+ break;
+ default:
+ return rBox;
+ }
+ return awt::Rectangle (
+ rBox.X - pBorderSize->mnLeft,
+ rBox.Y - pBorderSize->mnTop,
+ rBox.Width + pBorderSize->mnLeft + pBorderSize->mnRight,
+ rBox.Height + pBorderSize->mnTop + pBorderSize->mnBottom);
+}
+
+awt::Rectangle RendererPaneStyle::RemoveBorder (
+ const awt::Rectangle& rBox,
+ const css::drawing::framework::BorderType eBorderType) const
+{
+ const BorderSize* pBorderSize = nullptr;
+ switch (eBorderType)
+ {
+ case drawing::framework::BorderType_INNER_BORDER:
+ pBorderSize = &maInnerBorderSize;
+ break;
+ case drawing::framework::BorderType_OUTER_BORDER:
+ pBorderSize = &maOuterBorderSize;
+ break;
+ case drawing::framework::BorderType_TOTAL_BORDER:
+ pBorderSize = &maTotalBorderSize;
+ break;
+ default:
+ return rBox;
+ }
+ return awt::Rectangle (
+ rBox.X + pBorderSize->mnLeft,
+ rBox.Y + pBorderSize->mnTop,
+ rBox.Width - pBorderSize->mnLeft - pBorderSize->mnRight,
+ rBox.Height - pBorderSize->mnTop - pBorderSize->mnBottom);
+}
+
+Reference<rendering::XCanvasFont> RendererPaneStyle::GetFont (
+ const Reference<rendering::XCanvas>& rxCanvas) const
+{
+ if (mpFont)
+ {
+ mpFont->PrepareFont(rxCanvas);
+ return mpFont->mxFont;
+ }
+ return Reference<rendering::XCanvasFont>();
+}
+
+void RendererPaneStyle::UpdateBorderSizes()
+{
+ maTotalBorderSize.mnLeft = maInnerBorderSize.mnLeft + maOuterBorderSize.mnLeft;
+ maTotalBorderSize.mnTop = maInnerBorderSize.mnTop + maOuterBorderSize.mnTop;
+ maTotalBorderSize.mnRight = maInnerBorderSize.mnRight + maOuterBorderSize.mnRight;
+ maTotalBorderSize.mnBottom = maInnerBorderSize.mnBottom + maOuterBorderSize.mnBottom;
+}
+
+SharedBitmapDescriptor RendererPaneStyle::GetBitmap(
+ const std::shared_ptr<PresenterTheme>& rpTheme,
+ const OUString& rsStyleName,
+ const OUString& rsBitmapName)
+{
+ SharedBitmapDescriptor pDescriptor (rpTheme->GetBitmap(rsStyleName, rsBitmapName));
+ if (pDescriptor)
+ return pDescriptor;
+ else
+ return mpEmpty;
+}
+
+} // end of anonymous namespace
+
+} // end of namespace ::sd::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterPaneBorderPainter.hxx b/sdext/source/presenter/PresenterPaneBorderPainter.hxx
new file mode 100644
index 000000000..b7b9c0de1
--- /dev/null
+++ b/sdext/source/presenter/PresenterPaneBorderPainter.hxx
@@ -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/.
+ *
+ * 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_SDEXT_SOURCE_PRESENTER_PRESENTERPANEBORDERPAINTER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANEBORDERPAINTER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/awt/Rectangle.hpp>
+#include <com/sun/star/drawing/framework/XPaneBorderPainter.hpp>
+#include <com/sun/star/rendering/XCanvas.hpp>
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <memory>
+
+namespace sdext::presenter {
+
+class PresenterPane;
+class PresenterTheme;
+
+typedef ::cppu::WeakComponentImplHelper<
+ css::drawing::framework::XPaneBorderPainter
+> PresenterPaneBorderPainterInterfaceBase;
+
+/** This class is responsible for painting window borders of PresenterPane
+ objects.
+*/
+class PresenterPaneBorderPainter
+ : protected ::cppu::BaseMutex,
+ public PresenterPaneBorderPainterInterfaceBase
+{
+public:
+ explicit PresenterPaneBorderPainter (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext);
+ virtual ~PresenterPaneBorderPainter() override;
+ PresenterPaneBorderPainter(const PresenterPaneBorderPainter&) = delete;
+ PresenterPaneBorderPainter& operator=(const PresenterPaneBorderPainter&) = delete;
+
+ /** Transform the bounding box of the window content to the outer
+ bounding box of the border that is painted around it.
+ @param rsPaneURL
+ Specifies the pane style that is used to determine the border sizes.
+ @param rInnerBox
+ The rectangle of the inner window content.
+ */
+ css::awt::Rectangle AddBorder (
+ const OUString& rsPaneURL,
+ const css::awt::Rectangle& rInnerBox,
+ const css::drawing::framework::BorderType eBorderType) const;
+
+ /** Transform the outer bounding box of a window to the bounding box of
+ the inner content area.
+ @param rsPaneURL
+ Specifies the pane style that is used to determine the border sizes.
+ @param rOuterBox
+ The bounding box of the rectangle around the window.
+ @param bIsTitleVisible
+ This flag controls whether the upper part of the frame is
+ supposed to contain the window title.
+ */
+ css::awt::Rectangle RemoveBorder (
+ const OUString& rsPaneURL,
+ const css::awt::Rectangle& rOuterBox,
+ const css::drawing::framework::BorderType eBorderType) const;
+
+ void SetTheme (const std::shared_ptr<PresenterTheme>& rpTheme);
+
+ class Renderer;
+
+ // XPaneBorderPainter
+
+ virtual css::awt::Rectangle SAL_CALL addBorder (
+ const OUString& rsPaneBorderStyleName,
+ const css::awt::Rectangle& rRectangle,
+ css::drawing::framework::BorderType eBorderType) override;
+
+ virtual css::awt::Rectangle SAL_CALL removeBorder (
+ const OUString& rsPaneBorderStyleName,
+ const css::awt::Rectangle& rRectangle,
+ css::drawing::framework::BorderType eBorderType) override;
+
+ virtual void SAL_CALL paintBorder (
+ const OUString& rsPaneBorderStyleName,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rOuterBorderRectangle,
+ const css::awt::Rectangle& rRepaintArea,
+ const OUString& rsTitle) override;
+
+ virtual void SAL_CALL paintBorderWithCallout (
+ const OUString& rsPaneBorderStyleName,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rOuterBorderRectangle,
+ const css::awt::Rectangle& rRepaintArea,
+ const OUString& rsTitle,
+ const css::awt::Point& rCalloutAnchor) override;
+
+ virtual css::awt::Point SAL_CALL getCalloutOffset (
+ const OUString& rsPaneBorderStyleName) override;
+
+private:
+ css::uno::Reference<css::uno::XComponentContext> mxContext;
+ std::shared_ptr<PresenterTheme> mpTheme;
+ std::unique_ptr<Renderer> mpRenderer;
+
+ /** When the theme for the border has not yet been loaded then try again
+ when this method is called.
+ @return
+ Returns <TRUE/> only one time when the theme is loaded and/or the
+ renderer is initialized.
+ */
+ bool ProvideTheme (
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas);
+ void ProvideTheme();
+
+ /// @throws css::lang::DisposedException
+ void ThrowIfDisposed() const;
+};
+
+} // end of namespace ::sd::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterPaneContainer.cxx b/sdext/source/presenter/PresenterPaneContainer.cxx
new file mode 100644
index 000000000..b28f36a39
--- /dev/null
+++ b/sdext/source/presenter/PresenterPaneContainer.cxx
@@ -0,0 +1,331 @@
+/* -*- 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 "PresenterPaneContainer.hxx"
+#include "PresenterPaneBase.hxx"
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sdext::presenter {
+
+PresenterPaneContainer::PresenterPaneContainer (
+ const Reference<XComponentContext>& rxContext)
+ : PresenterPaneContainerInterfaceBase(m_aMutex)
+{
+ Reference<lang::XMultiComponentFactory> xFactory (rxContext->getServiceManager());
+ if (xFactory.is())
+ {
+ mxPresenterHelper.set(
+ xFactory->createInstanceWithContext(
+ "com.sun.star.comp.Draw.PresenterHelper",
+ rxContext),
+ UNO_QUERY_THROW);
+ }
+}
+
+PresenterPaneContainer::~PresenterPaneContainer()
+{
+}
+
+void PresenterPaneContainer::PreparePane (
+ const Reference<XResourceId>& rxPaneId,
+ const OUString& rsViewURL,
+ const OUString& rsTitle,
+ const OUString& rsAccessibleTitle,
+ const bool bIsOpaque,
+ const ViewInitializationFunction& rViewInitialization)
+{
+ if ( ! rxPaneId.is())
+ return;
+
+ SharedPaneDescriptor pPane (FindPaneURL(rxPaneId->getResourceURL()));
+ if (pPane)
+ return;
+
+ // No entry found for the given pane id. Create a new one.
+ SharedPaneDescriptor pDescriptor = std::make_shared<PaneDescriptor>();
+ pDescriptor->mxPaneId = rxPaneId;
+ pDescriptor->msViewURL = rsViewURL;
+ pDescriptor->mxPane = nullptr;
+ if (rsTitle.indexOf('%') < 0)
+ {
+ pDescriptor->msTitle = rsTitle;
+ pDescriptor->msTitleTemplate.clear();
+ }
+ else
+ {
+ pDescriptor->msTitleTemplate = rsTitle;
+ pDescriptor->msTitle.clear();
+ }
+ pDescriptor->msAccessibleTitleTemplate = rsAccessibleTitle;
+ pDescriptor->maViewInitialization = rViewInitialization;
+ pDescriptor->mbIsActive = true;
+ pDescriptor->mbIsOpaque = bIsOpaque;
+ pDescriptor->mbIsSprite = false;
+
+ maPanes.push_back(pDescriptor);
+}
+
+void SAL_CALL PresenterPaneContainer::disposing()
+{
+ for (const auto& rxPane : maPanes)
+ if (rxPane->mxPaneId.is())
+ RemovePane(rxPane->mxPaneId);
+}
+
+PresenterPaneContainer::SharedPaneDescriptor
+ PresenterPaneContainer::StorePane (const rtl::Reference<PresenterPaneBase>& rxPane)
+{
+ SharedPaneDescriptor pDescriptor;
+
+ if (rxPane.is())
+ {
+ OUString sPaneURL;
+ Reference<XResourceId> xPaneId (rxPane->getResourceId());
+ if (xPaneId.is())
+ sPaneURL = xPaneId->getResourceURL();
+
+ pDescriptor = FindPaneURL(sPaneURL);
+ if (!pDescriptor)
+ PreparePane(xPaneId, OUString(), OUString(), OUString(),
+ false, ViewInitializationFunction());
+ pDescriptor = FindPaneURL(sPaneURL);
+ if (pDescriptor)
+ {
+ Reference<awt::XWindow> xWindow (rxPane->getWindow());
+ pDescriptor->mxContentWindow = xWindow;
+ pDescriptor->mxPaneId = xPaneId;
+ pDescriptor->mxPane = rxPane;
+ pDescriptor->mxPane->SetTitle(pDescriptor->msTitle);
+
+ if (xWindow.is())
+ xWindow->addEventListener(this);
+ }
+ }
+
+ return pDescriptor;
+}
+
+PresenterPaneContainer::SharedPaneDescriptor
+ PresenterPaneContainer::StoreBorderWindow(
+ const Reference<XResourceId>& rxPaneId,
+ const Reference<awt::XWindow>& rxBorderWindow)
+{
+ // The content window may not be present. Use the resource URL of the
+ // pane id as key.
+ OUString sPaneURL;
+ if (rxPaneId.is())
+ sPaneURL = rxPaneId->getResourceURL();
+
+ SharedPaneDescriptor pDescriptor (FindPaneURL(sPaneURL));
+ if (pDescriptor)
+ {
+ pDescriptor->mxBorderWindow = rxBorderWindow;
+ return pDescriptor;
+ }
+ else
+ return SharedPaneDescriptor();
+}
+
+PresenterPaneContainer::SharedPaneDescriptor
+ PresenterPaneContainer::StoreView (
+ const Reference<XView>& rxView)
+{
+ SharedPaneDescriptor pDescriptor;
+
+ if (rxView.is())
+ {
+ OUString sPaneURL;
+ Reference<XResourceId> xViewId (rxView->getResourceId());
+ if (xViewId.is())
+ {
+ Reference<XResourceId> xPaneId (xViewId->getAnchor());
+ if (xPaneId.is())
+ sPaneURL = xPaneId->getResourceURL();
+ }
+
+ pDescriptor = FindPaneURL(sPaneURL);
+ if (pDescriptor)
+ {
+ pDescriptor->mxView = rxView;
+ try
+ {
+ if (pDescriptor->maViewInitialization)
+ pDescriptor->maViewInitialization(rxView);
+ }
+ catch (RuntimeException&)
+ {
+ OSL_ASSERT(false);
+ }
+ }
+ }
+
+ return pDescriptor;
+}
+
+PresenterPaneContainer::SharedPaneDescriptor
+ PresenterPaneContainer::RemovePane (const Reference<XResourceId>& rxPaneId)
+{
+ SharedPaneDescriptor pDescriptor (FindPaneId(rxPaneId));
+ if (pDescriptor)
+ {
+ if (pDescriptor->mxContentWindow.is())
+ pDescriptor->mxContentWindow->removeEventListener(this);
+ pDescriptor->mxContentWindow = nullptr;
+ pDescriptor->mxBorderWindow = nullptr;
+ pDescriptor->mxPane = nullptr;
+ pDescriptor->mxView = nullptr;
+ pDescriptor->mbIsActive = false;
+ }
+ return pDescriptor;
+}
+
+PresenterPaneContainer::SharedPaneDescriptor
+ PresenterPaneContainer::RemoveView (const Reference<XView>& rxView)
+{
+ SharedPaneDescriptor pDescriptor;
+
+ if (rxView.is())
+ {
+ OUString sPaneURL;
+ Reference<XResourceId> xViewId (rxView->getResourceId());
+ if (xViewId.is())
+ {
+ Reference<XResourceId> xPaneId (xViewId->getAnchor());
+ if (xPaneId.is())
+ sPaneURL = xPaneId->getResourceURL();
+ }
+
+ pDescriptor = FindPaneURL(sPaneURL);
+ if (pDescriptor)
+ {
+ pDescriptor->mxView = nullptr;
+ }
+ }
+
+ return pDescriptor;
+}
+
+PresenterPaneContainer::SharedPaneDescriptor PresenterPaneContainer::FindBorderWindow (
+ const Reference<awt::XWindow>& rxBorderWindow)
+{
+ auto iPane = std::find_if(maPanes.begin(), maPanes.end(),
+ [&rxBorderWindow](const SharedPaneDescriptor& rxPane) { return rxPane->mxBorderWindow == rxBorderWindow; });
+ if (iPane != maPanes.end())
+ return *iPane;
+ return SharedPaneDescriptor();
+}
+
+PresenterPaneContainer::SharedPaneDescriptor PresenterPaneContainer::FindContentWindow (
+ const Reference<awt::XWindow>& rxContentWindow)
+{
+ auto iPane = std::find_if(maPanes.begin(), maPanes.end(),
+ [&rxContentWindow](const SharedPaneDescriptor& rxPane) { return rxPane->mxContentWindow == rxContentWindow; });
+ if (iPane != maPanes.end())
+ return *iPane;
+ return SharedPaneDescriptor();
+}
+
+PresenterPaneContainer::SharedPaneDescriptor PresenterPaneContainer::FindPaneURL (
+ const OUString& rsPaneURL)
+{
+ auto iPane = std::find_if(maPanes.begin(), maPanes.end(),
+ [&rsPaneURL](const SharedPaneDescriptor& rxPane) { return rxPane->mxPaneId->getResourceURL() == rsPaneURL; });
+ if (iPane != maPanes.end())
+ return *iPane;
+ return SharedPaneDescriptor();
+}
+
+PresenterPaneContainer::SharedPaneDescriptor PresenterPaneContainer::FindPaneId (
+ const Reference<XResourceId>& rxPaneId)
+{
+ if ( ! rxPaneId.is())
+ return SharedPaneDescriptor();
+
+ auto iPane = std::find_if(maPanes.begin(), maPanes.end(),
+ [&rxPaneId](const SharedPaneDescriptor& rxPane) { return rxPaneId->compareTo(rxPane->mxPaneId) == 0; });
+ if (iPane != maPanes.end())
+ return *iPane;
+ return SharedPaneDescriptor();
+}
+
+PresenterPaneContainer::SharedPaneDescriptor PresenterPaneContainer::FindViewURL (
+ const OUString& rsViewURL)
+{
+ auto iPane = std::find_if(maPanes.begin(), maPanes.end(),
+ [&rsViewURL](const SharedPaneDescriptor& rxPane) { return rsViewURL == rxPane->msViewURL; });
+ if (iPane != maPanes.end())
+ return *iPane;
+ return SharedPaneDescriptor();
+}
+
+OUString PresenterPaneContainer::GetPaneURLForViewURL (const OUString& rsViewURL)
+{
+ SharedPaneDescriptor pDescriptor (FindViewURL(rsViewURL));
+ if (pDescriptor)
+ if (pDescriptor->mxPaneId.is())
+ return pDescriptor->mxPaneId->getResourceURL();
+ return OUString();
+}
+
+void PresenterPaneContainer::ToTop (const SharedPaneDescriptor& rpDescriptor)
+{
+ if (!rpDescriptor)
+ return;
+
+ // Find iterator for pDescriptor.
+ PaneList::iterator iEnd (maPanes.end());
+ auto iPane = std::find_if(maPanes.begin(), iEnd,
+ [&rpDescriptor](SharedPaneDescriptor& rxPane) { return rxPane.get() == rpDescriptor.get(); });
+ OSL_ASSERT(iPane!=iEnd);
+ if (iPane == iEnd)
+ return;
+
+ if (mxPresenterHelper.is())
+ mxPresenterHelper->toTop(rpDescriptor->mxBorderWindow);
+
+ maPanes.erase(iPane);
+ maPanes.push_back(rpDescriptor);
+}
+
+//----- XEventListener --------------------------------------------------------
+
+void SAL_CALL PresenterPaneContainer::disposing (
+ const css::lang::EventObject& rEvent)
+{
+ SharedPaneDescriptor pDescriptor (
+ FindContentWindow(Reference<awt::XWindow>(rEvent.Source, UNO_QUERY)));
+ if (pDescriptor)
+ {
+ RemovePane(pDescriptor->mxPaneId);
+ }
+}
+
+//===== PresenterPaneContainer::PaneDescriptor ================================
+
+void PresenterPaneContainer::PaneDescriptor::SetActivationState (const bool bIsActive)
+{
+ mbIsActive = bIsActive;
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterPaneContainer.hxx b/sdext/source/presenter/PresenterPaneContainer.hxx
new file mode 100644
index 000000000..136c25690
--- /dev/null
+++ b/sdext/source/presenter/PresenterPaneContainer.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/.
+ *
+ * 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_SDEXT_SOURCE_PRESENTER_PRESENTERPANECONTAINER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANECONTAINER_HXX
+
+#include "PresenterPaneBase.hxx"
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/drawing/XPresenterHelper.hpp>
+#include <com/sun/star/drawing/framework/XResourceId.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <rtl/ref.hxx>
+
+#include <functional>
+#include <memory>
+#include <vector>
+
+namespace sdext::presenter {
+
+class PresenterPaneBase;
+class PresenterSprite;
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::lang::XEventListener
+> PresenterPaneContainerInterfaceBase;
+
+/** This class could also be called PresenterPaneAndViewContainer because it
+ stores not only references to all panes that belong to the presenter
+ screen but stores the views displayed in these panes as well.
+*/
+class PresenterPaneContainer
+ : private ::cppu::BaseMutex,
+ public PresenterPaneContainerInterfaceBase
+{
+public:
+ explicit PresenterPaneContainer (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext);
+ virtual ~PresenterPaneContainer() override;
+ PresenterPaneContainer(const PresenterPaneContainer&) = delete;
+ PresenterPaneContainer& operator=(const PresenterPaneContainer&) = delete;
+
+ virtual void SAL_CALL disposing() override;
+
+ typedef ::std::function<void (const css::uno::Reference<css::drawing::framework::XView>&)>
+ ViewInitializationFunction;
+
+ /** Each pane descriptor holds references to one pane and the view
+ displayed in this pane as well as the other information that is used
+ to manage the pane window like an XWindow reference, the title, and
+ the coordinates.
+
+ A initialization function for the view is stored as well. This
+ function is executed as soon as a view is created.
+ */
+ class PaneDescriptor
+ {
+ public:
+ css::uno::Reference<css::drawing::framework::XResourceId> mxPaneId;
+ OUString msViewURL;
+ ::rtl::Reference<PresenterPaneBase> mxPane;
+ css::uno::Reference<css::drawing::framework::XView> mxView;
+ css::uno::Reference<css::awt::XWindow> mxContentWindow;
+ css::uno::Reference<css::awt::XWindow> mxBorderWindow;
+ OUString msTitleTemplate;
+ OUString msAccessibleTitleTemplate;
+ OUString msTitle;
+ ViewInitializationFunction maViewInitialization;
+ bool mbIsActive;
+ bool mbIsOpaque;
+ bool mbIsSprite;
+
+ void SetActivationState (const bool bIsActive);
+ };
+ typedef std::shared_ptr<PaneDescriptor> SharedPaneDescriptor;
+ typedef ::std::vector<SharedPaneDescriptor> PaneList;
+ PaneList maPanes;
+
+ void PreparePane (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
+ const OUString& rsViewURL,
+ const OUString& rsTitle,
+ const OUString& rsAccessibleTitle,
+ const bool bIsOpaque,
+ const ViewInitializationFunction& rViewInitialization);
+
+ SharedPaneDescriptor StorePane (
+ const rtl::Reference<PresenterPaneBase>& rxPane);
+
+ SharedPaneDescriptor StoreBorderWindow(
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
+ const css::uno::Reference<css::awt::XWindow>& rxBorderWindow);
+
+ SharedPaneDescriptor StoreView (
+ const css::uno::Reference<css::drawing::framework::XView>& rxView);
+
+ SharedPaneDescriptor RemovePane (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId);
+
+ SharedPaneDescriptor RemoveView (
+ const css::uno::Reference<css::drawing::framework::XView>& rxView);
+
+ /** Find the pane whose border window is identical to the given border
+ window.
+ */
+ SharedPaneDescriptor FindBorderWindow (
+ const css::uno::Reference<css::awt::XWindow>& rxBorderWindow);
+
+ /** Find the pane whose border window is identical to the given content
+ window.
+ */
+ SharedPaneDescriptor FindContentWindow (
+ const css::uno::Reference<css::awt::XWindow>& rxBorderWindow);
+
+ /** Find the pane whose pane URL is identical to the given URL string.
+ */
+ SharedPaneDescriptor FindPaneURL (const OUString& rsPaneURL);
+
+ /** Find the pane whose resource id is identical to the given one.
+ */
+ SharedPaneDescriptor FindPaneId (const css::uno::Reference<
+ css::drawing::framework::XResourceId>& rxPaneId);
+
+ SharedPaneDescriptor FindViewURL (const OUString& rsViewURL);
+
+ OUString GetPaneURLForViewURL (const OUString& rsViewURL);
+
+ void ToTop (const SharedPaneDescriptor& rpDescriptor);
+
+ // XEventListener
+
+ virtual void SAL_CALL disposing (
+ const css::lang::EventObject& rEvent) override;
+
+private:
+ css::uno::Reference<css::drawing::XPresenterHelper> mxPresenterHelper;
+};
+
+} // end of namespace ::sdext::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterPaneFactory.cxx b/sdext/source/presenter/PresenterPaneFactory.cxx
new file mode 100644
index 000000000..b4aadc771
--- /dev/null
+++ b/sdext/source/presenter/PresenterPaneFactory.cxx
@@ -0,0 +1,283 @@
+/* -*- 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 "PresenterPaneFactory.hxx"
+#include "PresenterController.hxx"
+#include "PresenterPane.hxx"
+#include "PresenterPaneBorderPainter.hxx"
+#include "PresenterPaneContainer.hxx"
+#include "PresenterSpritePane.hxx"
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sdext::presenter {
+
+//===== PresenterPaneFactory ==================================================
+
+Reference<drawing::framework::XResourceFactory> PresenterPaneFactory::Create (
+ const Reference<uno::XComponentContext>& rxContext,
+ const Reference<frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+{
+ rtl::Reference<PresenterPaneFactory> pFactory (
+ new PresenterPaneFactory(rxContext,rpPresenterController));
+ pFactory->Register(rxController);
+ return Reference<drawing::framework::XResourceFactory>(pFactory);
+}
+
+PresenterPaneFactory::PresenterPaneFactory (
+ const Reference<uno::XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterPaneFactoryInterfaceBase(m_aMutex),
+ mxComponentContextWeak(rxContext),
+ mpPresenterController(rpPresenterController)
+{
+}
+
+void PresenterPaneFactory::Register (const Reference<frame::XController>& rxController)
+{
+ Reference<XConfigurationController> xCC;
+ try
+ {
+ // Get the configuration controller.
+ Reference<XControllerManager> xCM (rxController, UNO_QUERY_THROW);
+ xCC.set(xCM->getConfigurationController());
+ mxConfigurationControllerWeak = xCC;
+ if ( ! xCC.is())
+ {
+ throw RuntimeException();
+ }
+ xCC->addResourceFactory(
+ "private:resource/pane/Presenter/*",
+ this);
+ }
+ catch (RuntimeException&)
+ {
+ OSL_ASSERT(false);
+ if (xCC.is())
+ xCC->removeResourceFactoryForReference(this);
+ mxConfigurationControllerWeak = WeakReference<XConfigurationController>();
+
+ throw;
+ }
+}
+
+PresenterPaneFactory::~PresenterPaneFactory()
+{
+}
+
+void SAL_CALL PresenterPaneFactory::disposing()
+{
+ Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
+ if (xCC.is())
+ xCC->removeResourceFactoryForReference(this);
+ mxConfigurationControllerWeak = WeakReference<XConfigurationController>();
+
+ // Dispose the panes in the cache.
+ if (mpResourceCache != nullptr)
+ {
+ for (const auto& rxPane : *mpResourceCache)
+ {
+ Reference<lang::XComponent> xPaneComponent (rxPane.second, UNO_QUERY);
+ if (xPaneComponent.is())
+ xPaneComponent->dispose();
+ }
+ mpResourceCache.reset();
+ }
+}
+
+//----- XPaneFactory ----------------------------------------------------------
+
+Reference<XResource> SAL_CALL PresenterPaneFactory::createResource (
+ const Reference<XResourceId>& rxPaneId)
+{
+ ThrowIfDisposed();
+
+ if ( ! rxPaneId.is())
+ return nullptr;
+
+ const OUString sPaneURL (rxPaneId->getResourceURL());
+ if (sPaneURL.isEmpty())
+ return nullptr;
+
+ if (mpResourceCache != nullptr)
+ {
+ // Has the requested resource already been created?
+ ResourceContainer::const_iterator iResource (mpResourceCache->find(sPaneURL));
+ if (iResource != mpResourceCache->end())
+ {
+ // Yes. Mark it as active.
+ rtl::Reference<PresenterPaneContainer> pPaneContainer(
+ mpPresenterController->GetPaneContainer());
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
+ pPaneContainer->FindPaneURL(sPaneURL));
+ if (pDescriptor)
+ {
+ pDescriptor->SetActivationState(true);
+ if (pDescriptor->mxBorderWindow.is())
+ pDescriptor->mxBorderWindow->setVisible(true);
+ pPaneContainer->StorePane(pDescriptor->mxPane);
+ }
+
+ return iResource->second;
+ }
+ }
+
+ // No. Create a new one.
+ Reference<XResource> xResource = CreatePane(rxPaneId);
+ return xResource;
+}
+
+void SAL_CALL PresenterPaneFactory::releaseResource (const Reference<XResource>& rxResource)
+{
+ ThrowIfDisposed();
+
+ if ( ! rxResource.is())
+ throw lang::IllegalArgumentException();
+
+ // Mark the pane as inactive.
+ rtl::Reference<PresenterPaneContainer> pPaneContainer(
+ mpPresenterController->GetPaneContainer());
+ const OUString sPaneURL (rxResource->getResourceId()->getResourceURL());
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
+ pPaneContainer->FindPaneURL(sPaneURL));
+ if (!pDescriptor)
+ return;
+
+ pDescriptor->SetActivationState(false);
+ if (pDescriptor->mxBorderWindow.is())
+ pDescriptor->mxBorderWindow->setVisible(false);
+
+ if (mpResourceCache != nullptr)
+ {
+ // Store the pane in the cache.
+ (*mpResourceCache)[sPaneURL] = rxResource;
+ }
+ else
+ {
+ // Dispose the pane.
+ Reference<lang::XComponent> xPaneComponent (rxResource, UNO_QUERY);
+ if (xPaneComponent.is())
+ xPaneComponent->dispose();
+ }
+}
+
+
+Reference<XResource> PresenterPaneFactory::CreatePane (
+ const Reference<XResourceId>& rxPaneId)
+{
+ if ( ! rxPaneId.is())
+ return nullptr;
+
+ Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
+ if ( ! xCC.is())
+ return nullptr;
+
+ Reference<XComponentContext> xContext (mxComponentContextWeak);
+ if ( ! xContext.is())
+ return nullptr;
+
+ Reference<XPane> xParentPane (xCC->getResource(rxPaneId->getAnchor()), UNO_QUERY);
+ if ( ! xParentPane.is())
+ return nullptr;
+
+ try
+ {
+ return CreatePane(
+ rxPaneId,
+ xParentPane,
+ rxPaneId->getFullResourceURL().Arguments == "Sprite=1");
+ }
+ catch (Exception&)
+ {
+ OSL_ASSERT(false);
+ }
+
+ return nullptr;
+}
+
+Reference<XResource> PresenterPaneFactory::CreatePane (
+ const Reference<XResourceId>& rxPaneId,
+ const Reference<drawing::framework::XPane>& rxParentPane,
+ const bool bIsSpritePane)
+{
+ Reference<XComponentContext> xContext (mxComponentContextWeak);
+ Reference<lang::XMultiComponentFactory> xFactory (
+ xContext->getServiceManager(), UNO_SET_THROW);
+
+ // Create a border window and canvas and store it in the pane
+ // container.
+
+ // Create the pane.
+ ::rtl::Reference<PresenterPaneBase> xPane;
+ if (bIsSpritePane)
+ {
+ xPane.set( new PresenterSpritePane(xContext, mpPresenterController));
+ }
+ else
+ {
+ xPane.set( new PresenterPane(xContext, mpPresenterController));
+ }
+
+ // Supply arguments.
+ Sequence<Any> aArguments{ Any(rxPaneId),
+ Any(rxParentPane->getWindow()),
+ Any(rxParentPane->getCanvas()),
+ Any(OUString()),
+ Any(Reference<drawing::framework::XPaneBorderPainter>(
+ mpPresenterController->GetPaneBorderPainter())),
+ Any(!bIsSpritePane) };
+ xPane->initialize(aArguments);
+
+ // Store pane and canvases and windows in container.
+ ::rtl::Reference<PresenterPaneContainer> pContainer (
+ mpPresenterController->GetPaneContainer());
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor(
+ pContainer->StoreBorderWindow(rxPaneId, xPane->GetBorderWindow()));
+ pContainer->StorePane(xPane);
+ if (pDescriptor)
+ {
+ pDescriptor->mbIsSprite = bIsSpritePane;
+
+ // Get the window of the frame and make that visible.
+ Reference<awt::XWindow> xWindow (pDescriptor->mxBorderWindow, UNO_SET_THROW);
+ xWindow->setVisible(true);
+ }
+
+ return Reference<XResource>(static_cast<XWeak*>(xPane.get()), UNO_QUERY_THROW);
+}
+
+void PresenterPaneFactory::ThrowIfDisposed() const
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterPaneFactory object has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+} // end of namespace sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterPaneFactory.hxx b/sdext/source/presenter/PresenterPaneFactory.hxx
new file mode 100644
index 000000000..45f9541c6
--- /dev/null
+++ b/sdext/source/presenter/PresenterPaneFactory.hxx
@@ -0,0 +1,117 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERPANEFACTORY_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPANEFACTORY_HXX
+
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/drawing/framework/XResourceFactory.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <rtl/ref.hxx>
+#include <map>
+#include <memory>
+
+namespace sdext::presenter {
+
+class PresenterController;
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::drawing::framework::XResourceFactory
+> PresenterPaneFactoryInterfaceBase;
+
+/** The PresenterPaneFactory provides a fixed set of panes.
+
+ In order to make the presenter screen more easily extendable in the
+ future the set of supported panes could be made extendable on demand.
+*/
+class PresenterPaneFactory
+ : public ::cppu::BaseMutex,
+ public PresenterPaneFactoryInterfaceBase
+{
+public:
+ static constexpr OUStringLiteral msCurrentSlidePreviewPaneURL
+ = u"private:resource/pane/Presenter/Pane1";
+ static constexpr OUStringLiteral msNextSlidePreviewPaneURL
+ = u"private:resource/pane/Presenter/Pane2";
+ static constexpr OUStringLiteral msNotesPaneURL = u"private:resource/pane/Presenter/Pane3";
+ static constexpr OUStringLiteral msToolBarPaneURL = u"private:resource/pane/Presenter/Pane4";
+ static constexpr OUStringLiteral msSlideSorterPaneURL
+ = u"private:resource/pane/Presenter/Pane5";
+
+ /** Create a new instance of this class and register it as resource
+ factory in the drawing framework of the given controller.
+ This registration keeps it alive. When the drawing framework is
+ shut down and releases its reference to the factory then the factory
+ is destroyed.
+ */
+ static css::uno::Reference<css::drawing::framework::XResourceFactory> Create (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ virtual ~PresenterPaneFactory() override;
+
+ virtual void SAL_CALL disposing() override;
+
+ // XResourceFactory
+
+ virtual css::uno::Reference<css::drawing::framework::XResource>
+ SAL_CALL createResource (
+ const css::uno::Reference<
+ css::drawing::framework::XResourceId>& rxPaneId) override;
+
+ virtual void SAL_CALL
+ releaseResource (
+ const css::uno::Reference<css::drawing::framework::XResource>&
+ rxPane) override;
+
+private:
+ css::uno::WeakReference<css::uno::XComponentContext> mxComponentContextWeak;
+ css::uno::WeakReference<css::drawing::framework::XConfigurationController>
+ mxConfigurationControllerWeak;
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ typedef ::std::map<OUString, css::uno::Reference<css::drawing::framework::XResource> >
+ ResourceContainer;
+ std::unique_ptr<ResourceContainer> mpResourceCache;
+
+ PresenterPaneFactory (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+
+ void Register (const css::uno::Reference<css::frame::XController>& rxController);
+
+ css::uno::Reference<css::drawing::framework::XResource> CreatePane (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId);
+ css::uno::Reference<css::drawing::framework::XResource> CreatePane (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxPaneId,
+ const css::uno::Reference<css::drawing::framework::XPane>& rxParentPane,
+ const bool bIsSpritePane);
+
+ /// @throws css::lang::DisposedException
+ void ThrowIfDisposed() const;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterProtocolHandler.cxx b/sdext/source/presenter/PresenterProtocolHandler.cxx
new file mode 100644
index 000000000..efd572ee9
--- /dev/null
+++ b/sdext/source/presenter/PresenterProtocolHandler.cxx
@@ -0,0 +1,829 @@
+/* -*- 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 <memory>
+#include "PresenterProtocolHandler.hxx"
+#include "PresenterController.hxx"
+#include "PresenterNotesView.hxx"
+#include "PresenterPaneContainer.hxx"
+#include "PresenterViewFactory.hxx"
+#include "PresenterWindowManager.hxx"
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <algorithm>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sdext::presenter {
+
+namespace {
+ class Command
+ {
+ public:
+ virtual ~Command() {}
+ virtual void Execute() = 0;
+ virtual bool IsEnabled() const { return true; }
+ virtual Any GetState() const { return Any(false); }
+ };
+
+ class GotoPreviousSlideCommand : public Command
+ {
+ public:
+ explicit GotoPreviousSlideCommand (
+ const rtl::Reference<PresenterController>& rpPresenterController);
+ virtual void Execute() override;
+ virtual bool IsEnabled() const override;
+ private:
+ rtl::Reference<PresenterController> mpPresenterController;
+ };
+
+ class GotoNextSlideCommand : public Command
+ {
+ public:
+ explicit GotoNextSlideCommand (
+ const rtl::Reference<PresenterController>& rpPresenterController);
+ virtual void Execute() override;
+ // The next slide command is always enabled, even when the current slide
+ // is the last slide: from the last slide it goes to the pause slide,
+ // and from there it ends the slide show.
+ virtual bool IsEnabled() const override { return true; }
+ private:
+ rtl::Reference<PresenterController> mpPresenterController;
+ };
+
+ class GotoNextEffectCommand : public Command
+ {
+ public:
+ explicit GotoNextEffectCommand (
+ const rtl::Reference<PresenterController>& rpPresenterController);
+ virtual void Execute() override;
+ virtual bool IsEnabled() const override;
+ private:
+ rtl::Reference<PresenterController> mpPresenterController;
+ };
+
+ class SwitchMonitorCommand : public Command
+ {
+ public:
+ explicit SwitchMonitorCommand (
+ const rtl::Reference<PresenterController>& rpPresenterController);
+ virtual void Execute() override;
+ private:
+ rtl::Reference<PresenterController> mpPresenterController;
+ };
+
+ class PauseResumeCommand : public Command
+ {
+ public:
+ explicit PauseResumeCommand(const rtl::Reference<PresenterController>& rpPresenterController);
+ virtual void Execute() override;
+ virtual Any GetState() const override;
+ private:
+ rtl::Reference<PresenterController> mpPresenterController;
+ };
+
+ /// This command restarts the presentation timer.
+ class RestartTimerCommand : public Command
+ {
+ public:
+ explicit RestartTimerCommand(const rtl::Reference<PresenterController>& rpPresenterController);
+ virtual void Execute() override;
+ private:
+ rtl::Reference<PresenterController> mpPresenterController;
+ };
+
+ class SetNotesViewCommand : public Command
+ {
+ public:
+ SetNotesViewCommand (
+ const bool bOn,
+ const rtl::Reference<PresenterController>& rpPresenterController);
+ virtual void Execute() override;
+ virtual Any GetState() const override;
+ private:
+ bool mbOn;
+ rtl::Reference<PresenterController> mpPresenterController;
+ };
+
+ class SetSlideSorterCommand : public Command
+ {
+ public:
+ SetSlideSorterCommand (
+ const bool bOn,
+ const rtl::Reference<PresenterController>& rpPresenterController);
+ virtual void Execute() override;
+ virtual Any GetState() const override;
+ private:
+ bool mbOn;
+ rtl::Reference<PresenterController> mpPresenterController;
+ };
+
+ class SetHelpViewCommand : public Command
+ {
+ public:
+ SetHelpViewCommand (
+ const bool bOn,
+ const rtl::Reference<PresenterController>& rpPresenterController);
+ virtual void Execute() override;
+ virtual Any GetState() const override;
+ private:
+ bool mbOn;
+ rtl::Reference<PresenterController> mpPresenterController;
+ };
+
+ class NotesFontSizeCommand : public Command
+ {
+ public:
+ NotesFontSizeCommand(
+ const rtl::Reference<PresenterController>& rpPresenterController,
+ const sal_Int32 nSizeChange);
+ virtual void Execute() override;
+ virtual Any GetState() const override;
+ protected:
+ ::rtl::Reference<PresenterNotesView> GetNotesView() const;
+ private:
+ rtl::Reference<PresenterController> mpPresenterController;
+ const sal_Int32 mnSizeChange;
+ };
+
+ class ExitPresenterCommand : public Command
+ {
+ public:
+ explicit ExitPresenterCommand(const rtl::Reference<PresenterController>& rpPresenterController);
+ virtual void Execute() override;
+ private:
+ rtl::Reference<PresenterController> mpPresenterController;
+ };
+
+} // end of anonymous namespace
+
+namespace {
+ typedef ::cppu::WeakComponentImplHelper <
+ css::frame::XDispatch,
+ css::document::XEventListener
+ > PresenterDispatchInterfaceBase;
+}
+
+class PresenterProtocolHandler::Dispatch
+ : protected ::cppu::BaseMutex,
+ public PresenterDispatchInterfaceBase
+{
+public:
+ /** Create a new Dispatch object. When the given command name
+ (rsURLPath) is not known then an empty reference is returned.
+ */
+ static Reference<frame::XDispatch> Create (
+ const OUString& rsURLPath,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+
+ void SAL_CALL disposing() override;
+ static Command* CreateCommand (
+ const OUString& rsURLPath,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+
+ // XDispatch
+ virtual void SAL_CALL dispatch(
+ const css::util::URL& aURL,
+ const css::uno::Sequence<css::beans::PropertyValue>& rArguments) override;
+
+ virtual void SAL_CALL addStatusListener(
+ const css::uno::Reference<css::frame::XStatusListener>& rxListener,
+ const css::util::URL& rURL) override;
+
+ virtual void SAL_CALL removeStatusListener (
+ const css::uno::Reference<css::frame::XStatusListener>& rxListener,
+ const css::util::URL& rURL) override;
+
+ // document::XEventListener
+
+ virtual void SAL_CALL notifyEvent (const css::document::EventObject& rEvent) override;
+
+ // lang::XEventListener
+
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+
+private:
+ OUString msURLPath;
+ std::unique_ptr<Command> mpCommand;
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ typedef ::std::vector<Reference<frame::XStatusListener> > StatusListenerContainer;
+ StatusListenerContainer maStatusListenerContainer;
+ bool mbIsListeningToWindowManager;
+
+ Dispatch (
+ const OUString& rsURLPath,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ virtual ~Dispatch() override;
+};
+
+
+//===== PresenterProtocolHandler =========================================================
+
+PresenterProtocolHandler::PresenterProtocolHandler ()
+ : PresenterProtocolHandlerInterfaceBase(m_aMutex)
+{
+}
+
+PresenterProtocolHandler::~PresenterProtocolHandler()
+{
+}
+
+void SAL_CALL PresenterProtocolHandler::disposing()
+{
+}
+
+//----- XInitialize -----------------------------------------------------------
+
+void SAL_CALL PresenterProtocolHandler::initialize (const Sequence<Any>& aArguments)
+{
+ ThrowIfDisposed();
+ if (aArguments.getLength() <= 0)
+ return;
+
+ try
+ {
+ Reference<frame::XFrame> xFrame;
+ if (aArguments[0] >>= xFrame)
+ {
+ mpPresenterController = PresenterController::Instance(xFrame);
+ }
+ }
+ catch (RuntimeException&)
+ {
+ OSL_ASSERT(false);
+ }
+}
+
+OUString PresenterProtocolHandler::getImplementationName()
+{
+ return "org.libreoffice.comp.PresenterScreenProtocolHandler";
+}
+
+sal_Bool PresenterProtocolHandler::supportsService(OUString const & ServiceName)
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+css::uno::Sequence<OUString>
+PresenterProtocolHandler::getSupportedServiceNames()
+{
+ return { "com.sun.star.frame.ProtocolHandler" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+sdext_PresenterProtocolHandler_get_implementation(
+ css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any> const&)
+{
+ return cppu::acquire(new PresenterProtocolHandler());
+}
+
+//----- XDispatchProvider -----------------------------------------------------
+
+Reference<frame::XDispatch> SAL_CALL PresenterProtocolHandler::queryDispatch (
+ const css::util::URL& rURL,
+ const OUString&,
+ sal_Int32)
+{
+ ThrowIfDisposed();
+
+ Reference<frame::XDispatch> xDispatch;
+
+ // tdf#154546 skip dispatch when presenter controller is not set
+ // mpPresenterController is sometimes unset and this will cause a
+ // crash when pressing the presenter console's Exchange button.
+ if (rURL.Protocol == "vnd.org.libreoffice.presenterscreen:" && mpPresenterController.is())
+ {
+ xDispatch.set(Dispatch::Create(rURL.Path, mpPresenterController));
+ }
+
+ return xDispatch;
+}
+
+Sequence<Reference<frame::XDispatch> > SAL_CALL PresenterProtocolHandler::queryDispatches(
+ const Sequence<frame::DispatchDescriptor>&)
+{
+ ThrowIfDisposed();
+ return Sequence<Reference<frame::XDispatch> >();
+}
+
+
+void PresenterProtocolHandler::ThrowIfDisposed() const
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterProtocolHandler object has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+//===== PresenterProtocolHandler::Dispatch ====================================
+
+Reference<frame::XDispatch> PresenterProtocolHandler::Dispatch::Create (
+ const OUString& rsURLPath,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+{
+ ::rtl::Reference<Dispatch> pDispatch (new Dispatch (rsURLPath, rpPresenterController));
+ if (pDispatch->mpCommand != nullptr)
+ return pDispatch;
+ else
+ return nullptr;
+}
+
+PresenterProtocolHandler::Dispatch::Dispatch (
+ const OUString& rsURLPath,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterDispatchInterfaceBase(m_aMutex),
+ msURLPath(rsURLPath),
+ mpCommand(CreateCommand(rsURLPath, rpPresenterController)),
+ mpPresenterController(rpPresenterController),
+ mbIsListeningToWindowManager(false)
+{
+ if (mpCommand != nullptr)
+ {
+ mpPresenterController->GetWindowManager()->AddLayoutListener(this);
+ mbIsListeningToWindowManager = true;
+ }
+}
+
+Command* PresenterProtocolHandler::Dispatch::CreateCommand (
+ const OUString& rsURLPath,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+{
+ if (rsURLPath.getLength() <= 5)
+ return nullptr;
+
+ if (rsURLPath == "CloseNotes")
+ return new SetNotesViewCommand(false, rpPresenterController);
+ if (rsURLPath == "CloseSlideSorter")
+ return new SetSlideSorterCommand(false, rpPresenterController);
+ if (rsURLPath == "CloseHelp")
+ return new SetHelpViewCommand(false, rpPresenterController);
+ if (rsURLPath == "GrowNotesFont")
+ return new NotesFontSizeCommand(rpPresenterController, +1);
+ if (rsURLPath == "NextEffect")
+ return new GotoNextEffectCommand(rpPresenterController);
+ if (rsURLPath == "NextSlide")
+ return new GotoNextSlideCommand(rpPresenterController);
+ if (rsURLPath == "PrevSlide")
+ return new GotoPreviousSlideCommand(rpPresenterController);
+ if (rsURLPath == "SwitchMonitor")
+ return new SwitchMonitorCommand(rpPresenterController);
+ if (rsURLPath == "PauseResumeTimer")
+ return new PauseResumeCommand(rpPresenterController);
+ if (rsURLPath == "RestartTimer")
+ return new RestartTimerCommand(rpPresenterController);
+ if (rsURLPath == "ShowNotes")
+ return new SetNotesViewCommand(true, rpPresenterController);
+ if (rsURLPath == "ShowSlideSorter")
+ return new SetSlideSorterCommand(true, rpPresenterController);
+ if (rsURLPath == "ShowHelp")
+ return new SetHelpViewCommand(true, rpPresenterController);
+ if (rsURLPath == "ShrinkNotesFont")
+ return new NotesFontSizeCommand(rpPresenterController, -1);
+ if (rsURLPath == "ExitPresenter")
+ return new ExitPresenterCommand(rpPresenterController);
+
+ return nullptr;
+}
+
+PresenterProtocolHandler::Dispatch::~Dispatch()
+{
+}
+
+void PresenterProtocolHandler::Dispatch::disposing()
+{
+ if (mbIsListeningToWindowManager)
+ {
+ if (mpPresenterController)
+ mpPresenterController->GetWindowManager()->RemoveLayoutListener(this);
+ mbIsListeningToWindowManager = false;
+ }
+
+ msURLPath.clear();
+ mpCommand.reset();
+}
+
+//----- XDispatch -------------------------------------------------------------
+
+void SAL_CALL PresenterProtocolHandler::Dispatch::dispatch(
+ const css::util::URL& rURL,
+ const css::uno::Sequence<css::beans::PropertyValue>& /*rArguments*/)
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterProtocolHandler::Dispatch object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+
+ if (rURL.Protocol != "vnd.org.libreoffice.presenterscreen:"
+ || rURL.Path != msURLPath)
+ {
+ // We can not throw an IllegalArgumentException
+ throw RuntimeException();
+ }
+
+ if (mpCommand != nullptr)
+ mpCommand->Execute();
+}
+
+void SAL_CALL PresenterProtocolHandler::Dispatch::addStatusListener(
+ const css::uno::Reference<css::frame::XStatusListener>& rxListener,
+ const css::util::URL& rURL)
+{
+ if (rURL.Path != msURLPath)
+ throw RuntimeException();
+
+ maStatusListenerContainer.push_back(rxListener);
+
+ frame::FeatureStateEvent aEvent;
+ aEvent.FeatureURL = rURL;
+ aEvent.IsEnabled = mpCommand->IsEnabled();
+ aEvent.Requery = false;
+ aEvent.State = mpCommand->GetState();
+ rxListener->statusChanged(aEvent);
+}
+
+void SAL_CALL PresenterProtocolHandler::Dispatch::removeStatusListener (
+ const css::uno::Reference<css::frame::XStatusListener>& rxListener,
+ const css::util::URL& rURL)
+{
+ if (rURL.Path != msURLPath)
+ throw RuntimeException();
+
+ StatusListenerContainer::iterator iListener (
+ ::std::find(
+ maStatusListenerContainer.begin(),
+ maStatusListenerContainer.end(),
+ rxListener));
+ if (iListener != maStatusListenerContainer.end())
+ maStatusListenerContainer.erase(iListener);
+}
+
+//----- document::XEventListener ----------------------------------------------
+
+void SAL_CALL PresenterProtocolHandler::Dispatch::notifyEvent (
+ const css::document::EventObject&)
+{
+ mpCommand->GetState();
+}
+
+//----- lang::XEventListener --------------------------------------------------
+
+void SAL_CALL PresenterProtocolHandler::Dispatch::disposing (const css::lang::EventObject&)
+{
+ mbIsListeningToWindowManager = false;
+}
+
+//===== GotoPreviousSlideCommand ==============================================
+
+GotoPreviousSlideCommand::GotoPreviousSlideCommand (
+ const rtl::Reference<PresenterController>& rpPresenterController)
+ : mpPresenterController(rpPresenterController)
+{
+}
+
+void GotoPreviousSlideCommand::Execute()
+{
+ if ( ! mpPresenterController.is())
+ return;
+
+ if ( ! mpPresenterController->GetSlideShowController().is())
+ return;
+
+ mpPresenterController->GetSlideShowController()->gotoPreviousSlide();
+}
+
+bool GotoPreviousSlideCommand::IsEnabled() const
+{
+ if ( ! mpPresenterController.is())
+ return false;
+
+ if ( ! mpPresenterController->GetSlideShowController().is())
+ return false;
+
+ return mpPresenterController->GetSlideShowController()->getCurrentSlideIndex()>0;
+}
+
+//===== GotoNextEffect ========================================================
+
+GotoNextEffectCommand::GotoNextEffectCommand (
+ const rtl::Reference<PresenterController>& rpPresenterController)
+ : mpPresenterController(rpPresenterController)
+{
+}
+
+void GotoNextEffectCommand::Execute()
+{
+ if ( ! mpPresenterController.is())
+ return;
+
+ if ( ! mpPresenterController->GetSlideShowController().is())
+ return;
+
+ mpPresenterController->GetSlideShowController()->gotoNextEffect();
+}
+
+bool GotoNextEffectCommand::IsEnabled() const
+{
+ if ( ! mpPresenterController.is())
+ return false;
+
+ if ( ! mpPresenterController->GetSlideShowController().is())
+ return false;
+
+ return ( mpPresenterController->GetSlideShowController()->getNextSlideIndex() < mpPresenterController->GetSlideShowController()->getSlideCount() );
+
+}
+
+//===== GotoNextSlide =========================================================
+
+GotoNextSlideCommand::GotoNextSlideCommand (
+ const rtl::Reference<PresenterController>& rpPresenterController)
+ : mpPresenterController(rpPresenterController)
+{
+}
+
+void GotoNextSlideCommand::Execute()
+{
+ if ( ! mpPresenterController.is())
+ return;
+
+ if ( ! mpPresenterController->GetSlideShowController().is())
+ return;
+
+ mpPresenterController->GetSlideShowController()->gotoNextSlide();
+}
+
+//===== SwitchMonitorCommand ==============================================
+
+SwitchMonitorCommand::SwitchMonitorCommand (
+ const rtl::Reference<PresenterController>& rpPresenterController)
+ : mpPresenterController(rpPresenterController)
+{
+}
+
+void SwitchMonitorCommand::Execute()
+{
+ mpPresenterController->SwitchMonitors();
+}
+
+//===== PauseResumeCommand ==============================================
+
+PauseResumeCommand::PauseResumeCommand (const rtl::Reference<PresenterController>& rpPresenterController)
+: mpPresenterController(rpPresenterController)
+{
+}
+
+void PauseResumeCommand::Execute()
+{
+ if ( ! mpPresenterController.is())
+ return;
+
+ ::rtl::Reference<PresenterWindowManager> pWindowManager (
+ mpPresenterController->GetWindowManager());
+ if ( ! pWindowManager.is())
+ return;
+
+ IPresentationTime* pPresentationTime = mpPresenterController->GetPresentationTime();
+ if (!pPresentationTime)
+ return;
+
+ if(pPresentationTime->isPaused())
+ {
+ pPresentationTime->setPauseStatus(false);
+ pWindowManager->SetPauseState(false);
+ }
+ else
+ {
+ pPresentationTime->setPauseStatus(true);
+ pWindowManager->SetPauseState(true);
+ }
+}
+
+Any PauseResumeCommand::GetState() const
+{
+ if ( ! mpPresenterController.is())
+ return Any(false);
+
+ ::rtl::Reference<PresenterWindowManager> pWindowManager (
+ mpPresenterController->GetWindowManager());
+ if ( ! pWindowManager.is())
+ return Any(false);
+
+ if (IPresentationTime* pPresentationTime = mpPresenterController->GetPresentationTime())
+ {
+ return Any(pPresentationTime->isPaused());
+ }
+ else
+ return Any(false);
+}
+
+RestartTimerCommand::RestartTimerCommand (const rtl::Reference<PresenterController>& rpPresenterController)
+: mpPresenterController(rpPresenterController)
+{
+}
+
+void RestartTimerCommand::Execute()
+{
+ if ( ! mpPresenterController.is())
+ return;
+
+ ::rtl::Reference<PresenterWindowManager> pWindowManager (
+ mpPresenterController->GetWindowManager());
+ if ( ! pWindowManager.is())
+ return;
+
+ if (IPresentationTime* pPresentationTime = mpPresenterController->GetPresentationTime())
+ {
+ //Resets the pause status and restarts the timer
+ pPresentationTime->setPauseStatus(false);
+ pWindowManager->SetPauseState(false);
+ pPresentationTime->restart();
+ }
+}
+
+//===== SetNotesViewCommand ===================================================
+
+SetNotesViewCommand::SetNotesViewCommand (
+ const bool bOn,
+ const rtl::Reference<PresenterController>& rpPresenterController)
+ : mbOn(bOn),
+ mpPresenterController(rpPresenterController)
+{
+}
+
+void SetNotesViewCommand::Execute()
+{
+ if ( ! mpPresenterController.is())
+ return;
+
+ ::rtl::Reference<PresenterWindowManager> pWindowManager (
+ mpPresenterController->GetWindowManager());
+ if ( ! pWindowManager.is())
+ return;
+
+ if (mbOn)
+ pWindowManager->SetViewMode(PresenterWindowManager::VM_Notes);
+ else
+ pWindowManager->SetViewMode(PresenterWindowManager::VM_Standard);
+}
+
+Any SetNotesViewCommand::GetState() const
+{
+ if ( ! mpPresenterController.is())
+ return Any(false);
+
+ ::rtl::Reference<PresenterWindowManager> pWindowManager (
+ mpPresenterController->GetWindowManager());
+ if ( ! pWindowManager.is())
+ return Any(false);
+
+ return Any(pWindowManager->GetViewMode() == PresenterWindowManager::VM_Notes);
+}
+
+//===== SetSlideSorterCommand =================================================
+
+SetSlideSorterCommand::SetSlideSorterCommand (
+ const bool bOn,
+ const rtl::Reference<PresenterController>& rpPresenterController)
+ : mbOn(bOn),
+ mpPresenterController(rpPresenterController)
+{
+}
+
+void SetSlideSorterCommand::Execute()
+{
+ if ( ! mpPresenterController.is())
+ return;
+
+ ::rtl::Reference<PresenterWindowManager> pWindowManager (
+ mpPresenterController->GetWindowManager());
+ if ( ! pWindowManager.is())
+ return;
+
+ pWindowManager->SetSlideSorterState(mbOn);
+}
+
+Any SetSlideSorterCommand::GetState() const
+{
+ if ( ! mpPresenterController.is())
+ return Any(false);
+
+ ::rtl::Reference<PresenterWindowManager> pWindowManager (
+ mpPresenterController->GetWindowManager());
+ if ( ! pWindowManager.is())
+ return Any(false);
+
+ return Any(pWindowManager->GetViewMode()==PresenterWindowManager::VM_SlideOverview);
+}
+
+//===== SetHelpViewCommand ===================================================
+
+SetHelpViewCommand::SetHelpViewCommand (
+ const bool bOn,
+ const rtl::Reference<PresenterController>& rpPresenterController)
+ : mbOn(bOn),
+ mpPresenterController(rpPresenterController)
+{
+}
+
+void SetHelpViewCommand::Execute()
+{
+ if ( ! mpPresenterController.is())
+ return;
+
+ ::rtl::Reference<PresenterWindowManager> pWindowManager (
+ mpPresenterController->GetWindowManager());
+ if ( ! pWindowManager.is())
+ return;
+
+ pWindowManager->SetHelpViewState(mbOn);
+}
+
+Any SetHelpViewCommand::GetState() const
+{
+ if ( ! mpPresenterController.is())
+ return Any(false);
+
+ ::rtl::Reference<PresenterWindowManager> pWindowManager (
+ mpPresenterController->GetWindowManager());
+ if ( ! pWindowManager.is())
+ return Any(false);
+
+ return Any(pWindowManager->GetViewMode()==PresenterWindowManager::VM_Help);
+}
+
+//===== NotesFontSizeCommand ==================================================
+
+NotesFontSizeCommand::NotesFontSizeCommand(
+ const rtl::Reference<PresenterController>& rpPresenterController,
+ const sal_Int32 nSizeChange)
+ : mpPresenterController(rpPresenterController),
+ mnSizeChange(nSizeChange)
+{
+}
+
+::rtl::Reference<PresenterNotesView> NotesFontSizeCommand::GetNotesView() const
+{
+ if (!mpPresenterController)
+ return nullptr;
+
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
+ mpPresenterController->GetPaneContainer()->FindViewURL(
+ PresenterViewFactory::msNotesViewURL));
+ if (!pDescriptor)
+ return nullptr;
+
+ return dynamic_cast<PresenterNotesView*>(pDescriptor->mxView.get());
+}
+
+void NotesFontSizeCommand::Execute()
+{
+ ::rtl::Reference<PresenterNotesView> pView (GetNotesView());
+ if (pView.is())
+ pView->ChangeFontSize(mnSizeChange);
+}
+
+Any NotesFontSizeCommand::GetState() const
+{
+ return Any();
+}
+
+//===== ExitPresenterCommand ==================================================
+
+ExitPresenterCommand::ExitPresenterCommand (const rtl::Reference<PresenterController>& rpPresenterController)
+: mpPresenterController(rpPresenterController)
+{
+}
+
+void ExitPresenterCommand::Execute()
+{
+ if ( ! mpPresenterController.is())
+ return;
+
+ mpPresenterController->ExitPresenter();
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterProtocolHandler.hxx b/sdext/source/presenter/PresenterProtocolHandler.hxx
new file mode 100644
index 000000000..217fb2658
--- /dev/null
+++ b/sdext/source/presenter/PresenterProtocolHandler.hxx
@@ -0,0 +1,91 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERPROTOCOLHANDLER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERPROTOCOLHANDLER_HXX
+
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+#include <com/sun/star/frame/XDispatchProvider.hpp>
+#include <com/sun/star/frame/XDispatch.hpp>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/util/XCacheInfo.hpp>
+#include <rtl/ref.hxx>
+
+namespace sdext::presenter {
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::lang::XInitialization,
+ css::lang::XServiceInfo,
+ css::util::XCacheInfo,
+ css::frame::XDispatchProvider
+> PresenterProtocolHandlerInterfaceBase;
+
+class PresenterController;
+
+class PresenterProtocolHandler
+ : protected ::cppu::BaseMutex,
+ public PresenterProtocolHandlerInterfaceBase
+{
+public:
+ PresenterProtocolHandler ();
+ virtual ~PresenterProtocolHandler() override;
+
+ void SAL_CALL disposing() override;
+
+ // XInitialization
+
+ virtual void SAL_CALL initialize(
+ const css::uno::Sequence<css::uno::Any>& aArguments) override;
+
+ OUString SAL_CALL getImplementationName() override;
+
+ sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override;
+
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+ // XDispatchProvider
+
+ virtual css::uno::Reference<css::frame::XDispatch > SAL_CALL
+ queryDispatch (
+ const css::util::URL& aURL,
+ const OUString& aTargetFrameName,
+ sal_Int32 nSearchFlags ) override;
+
+ virtual css::uno::Sequence<css::uno::Reference<css::frame::XDispatch> > SAL_CALL
+ queryDispatches(
+ const css::uno::Sequence< css::frame::DispatchDescriptor>& rDescriptors) override;
+
+ /// See XCacheInfo::IsCachingAllowed().
+ sal_Bool SAL_CALL isCachingAllowed() override { return false; }
+
+private:
+ class Dispatch;
+ ::rtl::Reference<PresenterController> mpPresenterController;
+
+ /// @throws css::lang::DisposedException
+ void ThrowIfDisposed() const;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterScreen.cxx b/sdext/source/presenter/PresenterScreen.cxx
new file mode 100644
index 000000000..a53f28e86
--- /dev/null
+++ b/sdext/source/presenter/PresenterScreen.cxx
@@ -0,0 +1,801 @@
+/* -*- 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 "PresenterScreen.hxx"
+#include "PresenterConfigurationAccess.hxx"
+#include "PresenterController.hxx"
+#include "PresenterFrameworkObserver.hxx"
+#include "PresenterHelper.hxx"
+#include "PresenterPaneContainer.hxx"
+#include "PresenterPaneFactory.hxx"
+#include "PresenterViewFactory.hxx"
+#include "PresenterWindowManager.hxx"
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/ResourceId.hpp>
+#include <com/sun/star/drawing/framework/ResourceActivationMode.hpp>
+#include <com/sun/star/presentation/XPresentation2.hpp>
+#include <com/sun/star/presentation/XPresentationSupplier.hpp>
+#include <com/sun/star/document/XEventBroadcaster.hpp>
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/supportsservice.hxx>
+
+#include <vcl/svapp.hxx>
+#include <sal/log.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::presentation;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sdext::presenter {
+
+namespace {
+ typedef ::cppu::WeakComponentImplHelper <
+ css::document::XEventListener
+ > PresenterScreenListenerInterfaceBase;
+
+ /** One instance of a PresenterScreenListener is registered per Impress
+ document and waits for the full screen slide show to start and to
+ end.
+ */
+ class PresenterScreenListener
+ : private ::cppu::BaseMutex,
+ public PresenterScreenListenerInterfaceBase
+ {
+ public:
+ PresenterScreenListener (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::frame::XModel2>& rxModel);
+ PresenterScreenListener(const PresenterScreenListener&) = delete;
+ PresenterScreenListener& operator=(const PresenterScreenListener&) = delete;
+
+ void Initialize();
+ virtual void SAL_CALL disposing() override;
+
+ // document::XEventListener
+
+ virtual void SAL_CALL notifyEvent( const css::document::EventObject& Event ) override;
+
+ // XEventListener
+
+ virtual void SAL_CALL disposing ( const css::lang::EventObject& rEvent) override;
+
+ private:
+ css::uno::Reference<css::frame::XModel2 > mxModel;
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+ rtl::Reference<PresenterScreen> mpPresenterScreen;
+ };
+}
+
+//----- XServiceInfo ---------------------------------------------------------------
+
+Sequence< OUString > SAL_CALL PresenterScreenJob::getSupportedServiceNames()
+{
+ return { };
+}
+
+OUString SAL_CALL PresenterScreenJob::getImplementationName()
+{
+ return "org.libreoffice.comp.PresenterScreenJob";
+}
+
+sal_Bool SAL_CALL PresenterScreenJob::supportsService(const OUString& aServiceName)
+{
+ return cppu::supportsService(this, aServiceName);
+}
+
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
+sdext_PresenterScreenJob_get_implementation(
+ css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any> const&)
+{
+ return cppu::acquire(new PresenterScreenJob(context));
+}
+
+
+//===== PresenterScreenJob ====================================================
+
+PresenterScreenJob::PresenterScreenJob (const Reference<XComponentContext>& rxContext)
+ : PresenterScreenJobInterfaceBase(m_aMutex),
+ mxComponentContext(rxContext)
+{
+}
+
+PresenterScreenJob::~PresenterScreenJob()
+{
+}
+
+void SAL_CALL PresenterScreenJob::disposing()
+{
+ mxComponentContext = nullptr;
+}
+
+//----- XJob -----------------------------------------------------------
+
+Any SAL_CALL PresenterScreenJob::execute(
+ const Sequence< beans::NamedValue >& Arguments )
+{
+ Sequence< beans::NamedValue > lEnv;
+ auto pArg = std::find_if(Arguments.begin(), Arguments.end(),
+ [](const beans::NamedValue& rArg) { return rArg.Name == "Environment"; });
+ if (pArg != Arguments.end())
+ pArg->Value >>= lEnv;
+
+ Reference<frame::XModel2> xModel;
+ auto pProp = std::find_if(std::cbegin(lEnv), std::cend(lEnv),
+ [](const beans::NamedValue& rProp) { return rProp.Name == "Model"; });
+ if (pProp != std::cend(lEnv))
+ pProp->Value >>= xModel;
+
+ Reference< XServiceInfo > xInfo( xModel, UNO_QUERY );
+ if( xInfo.is() && xInfo->supportsService("com.sun.star.presentation.PresentationDocument") )
+ {
+ // Create a new listener that waits for the full screen presentation
+ // to start and to end. It takes care of its own lifetime.
+ ::rtl::Reference<PresenterScreenListener> pListener (
+ new PresenterScreenListener(mxComponentContext, xModel));
+ pListener->Initialize();
+ }
+
+ return Any();
+}
+
+//===== PresenterScreenListener ===============================================
+
+namespace {
+
+PresenterScreenListener::PresenterScreenListener (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::frame::XModel2>& rxModel)
+ : PresenterScreenListenerInterfaceBase(m_aMutex),
+ mxModel(rxModel),
+ mxComponentContext(rxContext)
+{
+}
+
+void PresenterScreenListener::Initialize()
+{
+ Reference< document::XEventListener > xDocListener(this);
+ Reference< document::XEventBroadcaster > xDocBroadcaster( mxModel, UNO_QUERY );
+ if( xDocBroadcaster.is() )
+ xDocBroadcaster->addEventListener(xDocListener);
+}
+
+void SAL_CALL PresenterScreenListener::disposing()
+{
+ Reference< document::XEventBroadcaster > xDocBroadcaster( mxModel, UNO_QUERY );
+ if( xDocBroadcaster.is() )
+ xDocBroadcaster->removeEventListener(
+ Reference<document::XEventListener>(this) );
+
+ if (mpPresenterScreen.is())
+ {
+ mpPresenterScreen->RequestShutdownPresenterScreen();
+ mpPresenterScreen = nullptr;
+ }
+}
+
+// document::XEventListener
+
+void SAL_CALL PresenterScreenListener::notifyEvent( const css::document::EventObject& Event )
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterScreenListener object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+
+ if ( Event.EventName == "OnStartPresentation" )
+ {
+ mpPresenterScreen = new PresenterScreen(mxComponentContext, mxModel);
+ if(PresenterScreen::isPresenterScreenEnabled(mxComponentContext))
+ mpPresenterScreen->InitializePresenterScreen();
+ }
+ else if ( Event.EventName == "OnEndPresentation" )
+ {
+ if (mpPresenterScreen.is())
+ {
+ mpPresenterScreen->RequestShutdownPresenterScreen();
+ mpPresenterScreen = nullptr;
+ }
+ }
+}
+
+// XEventListener
+
+void SAL_CALL PresenterScreenListener::disposing (const css::lang::EventObject&)
+{
+ if (mpPresenterScreen.is())
+ {
+ mpPresenterScreen->RequestShutdownPresenterScreen();
+ mpPresenterScreen = nullptr;
+ }
+}
+
+} // end of anonymous namespace
+
+//===== PresenterScreen =======================================================
+
+PresenterScreen::PresenterScreen (
+ const Reference<XComponentContext>& rxContext,
+ const css::uno::Reference<css::frame::XModel2>& rxModel)
+ : PresenterScreenInterfaceBase(m_aMutex),
+ mxModel(rxModel),
+ mxContextWeak(rxContext)
+{
+}
+
+PresenterScreen::~PresenterScreen()
+{
+}
+
+bool PresenterScreen::isPresenterScreenEnabled(const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+{
+ bool dEnablePresenterScreen=true;
+ PresenterConfigurationAccess aConfiguration (
+ rxContext,
+ "/org.openoffice.Office.Impress/",
+ PresenterConfigurationAccess::READ_ONLY);
+ aConfiguration.GetConfigurationNode("Misc/Start/EnablePresenterScreen")
+ >>= dEnablePresenterScreen;
+ return dEnablePresenterScreen;
+}
+void SAL_CALL PresenterScreen::disposing()
+{
+ Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
+ if (xCC.is() && mxSavedConfiguration.is())
+ {
+ xCC->restoreConfiguration(mxSavedConfiguration);
+ }
+ mxConfigurationControllerWeak = Reference<XConfigurationController>(nullptr);
+
+ Reference<lang::XComponent> xViewFactoryComponent (mxViewFactory, UNO_QUERY);
+ if (xViewFactoryComponent.is())
+ xViewFactoryComponent->dispose();
+ Reference<lang::XComponent> xPaneFactoryComponent (mxPaneFactory, UNO_QUERY);
+ if (xPaneFactoryComponent.is())
+ xPaneFactoryComponent->dispose();
+
+ mxModel = nullptr;
+}
+
+//----- XEventListener --------------------------------------------------------
+
+void SAL_CALL PresenterScreen::disposing (const lang::EventObject& /*rEvent*/)
+{
+ RequestShutdownPresenterScreen();
+}
+
+
+void PresenterScreen::InitializePresenterScreen()
+{
+ try
+ {
+ Reference<XComponentContext> xContext (mxContextWeak);
+ mpPaneContainer = new PresenterPaneContainer(xContext);
+
+ Reference<XPresentationSupplier> xPS ( mxModel, UNO_QUERY_THROW);
+ Reference<XPresentation2> xPresentation(xPS->getPresentation(), UNO_QUERY_THROW);
+ Reference<presentation::XSlideShowController> xSlideShowController( xPresentation->getController() );
+
+ if( !xSlideShowController.is() || !xSlideShowController->isFullScreen() )
+ return;
+
+ // find first controller that is not the current controller (the one with the slideshow
+ mxController = mxModel->getCurrentController();
+ Reference< container::XEnumeration > xEnum( mxModel->getControllers() );
+ if( xEnum.is() )
+ {
+ while( xEnum->hasMoreElements() )
+ {
+ Reference< frame::XController > xC( xEnum->nextElement(), UNO_QUERY );
+ if( xC.is() && (xC != mxController) )
+ {
+ mxController = xC;
+ break;
+ }
+ }
+ }
+ // Get the XController from the first argument.
+ Reference<XControllerManager> xCM(mxController, UNO_QUERY_THROW);
+
+ Reference<XConfigurationController> xCC( xCM->getConfigurationController());
+ mxConfigurationControllerWeak = xCC;
+
+ Reference<drawing::framework::XResourceId> xMainPaneId(
+ GetMainPaneId(xPresentation));
+ // An empty reference means that the presenter screen can
+ // not or must not be displayed.
+ if ( ! xMainPaneId.is())
+ return;
+
+ if (xCC.is() && xContext.is())
+ {
+ // Store the current configuration so that we can restore it when
+ // the presenter view is deactivated.
+ mxSavedConfiguration = xCC->getRequestedConfiguration();
+ xCC->lock();
+
+ try
+ {
+ // At the moment the presenter controller is displayed in its
+ // own full screen window that is controlled by the same
+ // configuration controller as the Impress document from
+ // which the presentation was started. Therefore the main
+ // pane is activated additionally to the already existing
+ // panes and does not replace them.
+ xCC->requestResourceActivation(
+ xMainPaneId,
+ ResourceActivationMode_ADD);
+ SetupConfiguration(xContext, xMainPaneId);
+
+ mpPresenterController = new PresenterController(
+ css::uno::WeakReference<css::lang::XEventListener>(this),
+ xContext,
+ mxController,
+ xSlideShowController,
+ mpPaneContainer,
+ xMainPaneId);
+
+ // Create pane and view factories and integrate them into the
+ // drawing framework.
+ SetupPaneFactory(xContext);
+ SetupViewFactory(xContext);
+
+ mpPresenterController->GetWindowManager()->RestoreViewMode();
+ }
+ catch (const RuntimeException&)
+ {
+ xCC->restoreConfiguration(mxSavedConfiguration);
+ }
+ xCC->unlock();
+ }
+ }
+ catch (const Exception&)
+ {
+ }
+}
+
+void PresenterScreen::SwitchMonitors()
+{
+ try {
+ Reference<XPresentationSupplier> xPS ( mxModel, UNO_QUERY_THROW);
+ Reference<XPresentation2> xPresentation(xPS->getPresentation(), UNO_QUERY_THROW);
+
+ // Get the existing presenter console screen, we want to switch the
+ // presentation to use that instead.
+ sal_Int32 nNewScreen = GetPresenterScreenNumber (xPresentation);
+ if (nNewScreen < 0)
+ return;
+
+ // Adapt that display number to be the 'default' setting of 0 if it matches
+ sal_Int32 nExternalDisplay = Application::GetDisplayExternalScreen();
+
+ if (nNewScreen == nExternalDisplay)
+ nNewScreen = 0; // screen zero is best == the primary display
+ else
+ nNewScreen++; // otherwise we store screens offset by one.
+
+ // Set the new presentation display
+ Reference<beans::XPropertySet> xProperties (xPresentation, UNO_QUERY_THROW);
+ xProperties->setPropertyValue("Display", Any(nNewScreen));
+ } catch (const uno::Exception &) {
+ }
+}
+
+/**
+ * Return the real VCL screen number to show the presenter console
+ * on or -1 to not show anything.
+ */
+sal_Int32 PresenterScreen::GetPresenterScreenNumber (
+ const Reference<presentation::XPresentation2>& rxPresentation) const
+{
+ sal_Int32 nScreenNumber (0);
+ try
+ {
+ if ( ! rxPresentation.is())
+ return -1;
+
+ // Determine the screen on which the full screen presentation is being
+ // displayed.
+ sal_Int32 nDisplayNumber (-1);
+ if ( ! (rxPresentation->getPropertyValue("Display") >>= nDisplayNumber))
+ return -1;
+ if (nDisplayNumber == -1)
+ {
+ // The special value -1 indicates that the slide show
+ // spans all available displays. That leaves no room for
+ // the presenter screen.
+ return -1;
+ }
+
+ SAL_INFO("sdext.presenter", "Display number is " << nDisplayNumber);
+
+ if (nDisplayNumber > 0)
+ {
+ nScreenNumber = nDisplayNumber - 1;
+ }
+ else if (nDisplayNumber == 0)
+ {
+ // A display number value of 0 indicates the primary screen.
+ // Find out which screen number that is.
+ nScreenNumber = Application::GetDisplayExternalScreen();
+ }
+
+ // We still have to determine the number of screens to decide
+ // whether the presenter screen may be shown at all.
+ sal_Int32 nScreenCount = Application::GetScreenCount();
+
+ if (nScreenCount < 2 || nDisplayNumber > nScreenCount)
+ {
+ // There is either only one screen or the full screen
+ // presentation spans all available screens. The presenter
+ // screen is shown only when a special flag in the configuration
+ // is set.
+ Reference<XComponentContext> xContext (mxContextWeak);
+ PresenterConfigurationAccess aConfiguration (
+ xContext,
+ "/org.openoffice.Office.PresenterScreen/",
+ PresenterConfigurationAccess::READ_ONLY);
+ bool bStartAlways (false);
+ if (aConfiguration.GetConfigurationNode(
+ "Presenter/StartAlways") >>= bStartAlways)
+ {
+ if (bStartAlways)
+ return GetPresenterScreenFromScreen(nScreenNumber);
+ }
+ return -1;
+ }
+ }
+ catch (const beans::UnknownPropertyException&)
+ {
+ OSL_ASSERT(false);
+ // For some reason we can not access the screen number. Use
+ // the default instead.
+ }
+ SAL_INFO("sdext.presenter", "Get presenter screen for screen " << nScreenNumber);
+ return GetPresenterScreenFromScreen(nScreenNumber);
+}
+
+sal_Int32 PresenterScreen::GetPresenterScreenFromScreen( sal_Int32 nPresentationScreen )
+{
+ // Setup the resource id of the full screen background pane so that
+ // it is displayed on another screen than the presentation.
+ sal_Int32 nPresenterScreenNumber (1);
+ switch (nPresentationScreen)
+ {
+ case 0:
+ nPresenterScreenNumber = 1;
+ break;
+
+ case 1:
+ nPresenterScreenNumber = 0;
+ break;
+
+ default:
+ SAL_INFO("sdext.presenter", "Warning unexpected, out of bound screen "
+ "mapped to 0" << nPresentationScreen);
+ // When the full screen presentation is displayed on a screen
+ // other than 0 or 1 then place the presenter on the first
+ // available screen.
+ nPresenterScreenNumber = 0;
+ break;
+ }
+ return nPresenterScreenNumber;
+}
+
+Reference<drawing::framework::XResourceId> PresenterScreen::GetMainPaneId (
+ const Reference<presentation::XPresentation2>& rxPresentation) const
+{
+ // A negative value means that the presentation spans all available
+ // displays. That leaves no room for the presenter.
+ const sal_Int32 nScreen(GetPresenterScreenNumber(rxPresentation));
+ if (nScreen < 0)
+ return nullptr;
+
+ return ResourceId::create(
+ Reference<XComponentContext>(mxContextWeak),
+ PresenterHelper::msFullScreenPaneURL
+ + "?FullScreen=true&ScreenNumber="
+ + OUString::number(nScreen));
+}
+
+void PresenterScreen::RequestShutdownPresenterScreen()
+{
+ // Restore the configuration that was active before the presenter screen
+ // has been activated. Now, that the presenter screen is displayed in
+ // its own top level window this probably not necessary, but one never knows.
+ Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
+ if (xCC.is() && mxSavedConfiguration.is())
+ {
+ xCC->restoreConfiguration(mxSavedConfiguration);
+ mxSavedConfiguration = nullptr;
+ }
+
+ if (xCC.is())
+ {
+ // The actual restoration of the configuration takes place
+ // asynchronously. The view and pane factories can only by disposed
+ // after that. Therefore, set up a listener and wait for the
+ // restoration.
+ rtl::Reference<PresenterScreen> pSelf (this);
+ PresenterFrameworkObserver::RunOnUpdateEnd(
+ xCC,
+ [pSelf](bool){ return pSelf->ShutdownPresenterScreen(); });
+ xCC->update();
+ }
+}
+
+void PresenterScreen::ShutdownPresenterScreen()
+{
+ Reference<lang::XComponent> xViewFactoryComponent (mxViewFactory, UNO_QUERY);
+ if (xViewFactoryComponent.is())
+ xViewFactoryComponent->dispose();
+ mxViewFactory = nullptr;
+
+ Reference<lang::XComponent> xPaneFactoryComponent (mxPaneFactory, UNO_QUERY);
+ if (xPaneFactoryComponent.is())
+ xPaneFactoryComponent->dispose();
+ mxPaneFactory = nullptr;
+
+ if (mpPresenterController)
+ {
+ mpPresenterController->dispose();
+ mpPresenterController.clear();
+ }
+ mpPaneContainer = new PresenterPaneContainer(Reference<XComponentContext>(mxContextWeak));
+}
+
+void PresenterScreen::SetupPaneFactory (const Reference<XComponentContext>& rxContext)
+{
+ try
+ {
+ if ( ! mxPaneFactory.is())
+ mxPaneFactory = PresenterPaneFactory::Create(
+ rxContext,
+ mxController,
+ mpPresenterController);
+ }
+ catch (const RuntimeException&)
+ {
+ OSL_ASSERT(false);
+ }
+}
+
+void PresenterScreen::SetupViewFactory (const Reference<XComponentContext>& rxContext)
+{
+ try
+ {
+ if ( ! mxViewFactory.is())
+ mxViewFactory = PresenterViewFactory::Create(
+ rxContext,
+ mxController,
+ mpPresenterController);
+ }
+ catch (const RuntimeException&)
+ {
+ OSL_ASSERT(false);
+ }
+}
+
+void PresenterScreen::SetupConfiguration (
+ const Reference<XComponentContext>& rxContext,
+ const Reference<XResourceId>& rxAnchorId)
+{
+ try
+ {
+ PresenterConfigurationAccess aConfiguration (
+ rxContext,
+ "org.openoffice.Office.PresenterScreen",
+ PresenterConfigurationAccess::READ_ONLY);
+ maViewDescriptors.clear();
+ ProcessViewDescriptions(aConfiguration);
+ OUString sLayoutName ("DefaultLayout");
+ aConfiguration.GetConfigurationNode(
+ "Presenter/CurrentLayout") >>= sLayoutName;
+ ProcessLayout(aConfiguration, sLayoutName, rxContext, rxAnchorId);
+ }
+ catch (const RuntimeException&)
+ {
+ }
+}
+
+void PresenterScreen::ProcessLayout (
+ PresenterConfigurationAccess& rConfiguration,
+ std::u16string_view rsLayoutName,
+ const Reference<XComponentContext>& rxContext,
+ const Reference<XResourceId>& rxAnchorId)
+{
+ try
+ {
+ Reference<container::XHierarchicalNameAccess> xLayoutNode (
+ rConfiguration.GetConfigurationNode(
+ OUString::Concat("Presenter/Layouts/")+rsLayoutName),
+ UNO_QUERY_THROW);
+
+ // Read the parent layout first, if one is referenced.
+ OUString sParentLayout;
+ PresenterConfigurationAccess::GetConfigurationNode(
+ xLayoutNode,
+ "ParentLayout") >>= sParentLayout;
+ if (!sParentLayout.isEmpty())
+ {
+ // Prevent infinite recursion.
+ if (rsLayoutName != sParentLayout)
+ ProcessLayout(rConfiguration, sParentLayout, rxContext, rxAnchorId);
+ }
+
+ // Process the actual layout list.
+ Reference<container::XNameAccess> xList (
+ PresenterConfigurationAccess::GetConfigurationNode(
+ xLayoutNode,
+ "Layout"),
+ UNO_QUERY_THROW);
+
+ ::std::vector<OUString> aProperties
+ {
+ "PaneURL",
+ "ViewURL",
+ "RelativeX",
+ "RelativeY",
+ "RelativeWidth",
+ "RelativeHeight"
+ };
+ PresenterConfigurationAccess::ForAll(
+ xList,
+ aProperties,
+ [this, rxContext, rxAnchorId](std::vector<uno::Any> const& rArgs)
+ {
+ this->ProcessComponent(rArgs, rxContext, rxAnchorId);
+ });
+ }
+ catch (const RuntimeException&)
+ {
+ }
+}
+
+void PresenterScreen::ProcessViewDescriptions (
+ PresenterConfigurationAccess& rConfiguration)
+{
+ try
+ {
+ Reference<container::XNameAccess> xViewDescriptionsNode (
+ rConfiguration.GetConfigurationNode("Presenter/Views"),
+ UNO_QUERY_THROW);
+
+ ::std::vector<OUString> aProperties
+ {
+ "ViewURL",
+ "Title",
+ "AccessibleTitle",
+ "IsOpaque"
+ };
+ PresenterConfigurationAccess::ForAll(
+ xViewDescriptionsNode,
+ aProperties,
+ [this](std::vector<uno::Any> const& rArgs)
+ {
+ return this->ProcessViewDescription(rArgs);
+ });
+ }
+ catch (const RuntimeException&)
+ {
+ OSL_ASSERT(false);
+ }
+}
+
+void PresenterScreen::ProcessComponent (
+ const ::std::vector<Any>& rValues,
+ const Reference<XComponentContext>& rxContext,
+ const Reference<XResourceId>& rxAnchorId)
+{
+ if (rValues.size() != 6)
+ return;
+
+ try
+ {
+ OUString sPaneURL;
+ OUString sViewURL;
+ double nX = 0;
+ double nY = 0;
+ double nWidth = 0;
+ double nHeight = 0;
+ rValues[0] >>= sPaneURL;
+ rValues[1] >>= sViewURL;
+ rValues[2] >>= nX;
+ rValues[3] >>= nY;
+ rValues[4] >>= nWidth;
+ rValues[5] >>= nHeight;
+
+ if (nX>=0 && nY>=0 && nWidth>0 && nHeight>0)
+ {
+ SetupView(
+ rxContext,
+ rxAnchorId,
+ sPaneURL,
+ sViewURL,
+ PresenterPaneContainer::ViewInitializationFunction());
+ }
+ }
+ catch (const Exception&)
+ {
+ OSL_ASSERT(false);
+ }
+}
+
+void PresenterScreen::ProcessViewDescription (
+ const ::std::vector<Any>& rValues)
+{
+ if (rValues.size() != 4)
+ return;
+
+ try
+ {
+ ViewDescriptor aViewDescriptor;
+ OUString sViewURL;
+ rValues[0] >>= sViewURL;
+ rValues[1] >>= aViewDescriptor.msTitle;
+ rValues[2] >>= aViewDescriptor.msAccessibleTitle;
+ rValues[3] >>= aViewDescriptor.mbIsOpaque;
+ if (aViewDescriptor.msAccessibleTitle.isEmpty())
+ aViewDescriptor.msAccessibleTitle = aViewDescriptor.msTitle;
+ maViewDescriptors[sViewURL] = aViewDescriptor;
+ }
+ catch (const Exception&)
+ {
+ OSL_ASSERT(false);
+ }
+}
+
+void PresenterScreen::SetupView(
+ const Reference<XComponentContext>& rxContext,
+ const Reference<XResourceId>& rxAnchorId,
+ const OUString& rsPaneURL,
+ const OUString& rsViewURL,
+ const PresenterPaneContainer::ViewInitializationFunction& rViewInitialization)
+{
+ Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
+ if (!xCC.is())
+ return;
+
+ Reference<XResourceId> xPaneId (ResourceId::createWithAnchor(rxContext,rsPaneURL,rxAnchorId));
+ // Look up the view descriptor.
+ ViewDescriptor aViewDescriptor;
+ ViewDescriptorContainer::const_iterator iDescriptor (maViewDescriptors.find(rsViewURL));
+ if (iDescriptor != maViewDescriptors.end())
+ aViewDescriptor = iDescriptor->second;
+
+ // Prepare the pane.
+ OSL_ASSERT(mpPaneContainer);
+ mpPaneContainer->PreparePane(
+ xPaneId,
+ rsViewURL,
+ aViewDescriptor.msTitle,
+ aViewDescriptor.msAccessibleTitle,
+ aViewDescriptor.mbIsOpaque,
+ rViewInitialization);
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterScreen.hxx b/sdext/source/presenter/PresenterScreen.hxx
new file mode 100644
index 000000000..e696c0dc6
--- /dev/null
+++ b/sdext/source/presenter/PresenterScreen.hxx
@@ -0,0 +1,227 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERSCREEN_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSCREEN_HXX
+
+#include "PresenterConfigurationAccess.hxx"
+#include "PresenterPaneContainer.hxx"
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/frame/XModel2.hpp>
+#include <com/sun/star/task/XJob.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/presentation/XPresentation2.hpp>
+#include <rtl/ref.hxx>
+
+#include <map>
+#include <string_view>
+
+namespace sdext::presenter {
+
+class PresenterController;
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::task::XJob, css::lang::XServiceInfo
+ > PresenterScreenJobInterfaceBase;
+
+/** The PresenterScreenJob service is instantiated every time a document is
+ created or loaded. In its execute() method it then filters out all
+ non-Impress documents and creates and registers a new PresenterScreen
+ object.
+*/
+class PresenterScreenJob
+ : private ::cppu::BaseMutex,
+ public PresenterScreenJobInterfaceBase
+{
+public:
+ PresenterScreenJob(const PresenterScreenJob&) = delete;
+ PresenterScreenJob& operator=(const PresenterScreenJob&) = delete;
+
+ virtual void SAL_CALL disposing() 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;
+
+ // XJob
+ virtual css::uno::Any SAL_CALL execute(
+ const css::uno::Sequence<css::beans::NamedValue >& Arguments) override;
+
+ explicit PresenterScreenJob (const css::uno::Reference<css::uno::XComponentContext>& rxContext);
+ virtual ~PresenterScreenJob() override;
+
+private:
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+};
+
+/** This is the bootstrap class of the presenter screen. It is registered
+ as drawing framework startup service. That means that every drawing
+ framework instance creates an instance of this class.
+
+ <p>A PresenterScreen object registers itself as listener for drawing
+ framework configuration changes. It waits for the full screen marker (a
+ top level resource) to appear in the current configuration. When that
+ happens the actual presenter screen is initialized. A new
+ PresenterController is created and takes over the task of controlling
+ the presenter screen.</p>
+*/
+typedef ::cppu::WeakComponentImplHelper <
+ css::lang::XEventListener
+ > PresenterScreenInterfaceBase;
+class PresenterScreen
+ : private ::cppu::BaseMutex,
+ public PresenterScreenInterfaceBase
+{
+public:
+ PresenterScreen (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::frame::XModel2>& rxModel);
+ virtual ~PresenterScreen() override;
+ PresenterScreen(const PresenterScreen&) = delete;
+ PresenterScreen& operator=(const PresenterScreen&) = delete;
+
+ virtual void SAL_CALL disposing() override;
+
+ static bool isPresenterScreenEnabled(
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext);
+ /** Make the presenter screen visible.
+ */
+ void InitializePresenterScreen();
+
+ /** Do not call ShutdownPresenterScreen() directly. Call
+ RequestShutdownPresenterScreen() instead. It will issue an
+ asynchronous call to ShutdownPresenterScreen() when that is safe.
+ */
+ void RequestShutdownPresenterScreen();
+
+ /** Switch / converse monitors between presenter view and slide output
+ */
+ void SwitchMonitors();
+
+ // XEventListener
+
+ virtual void SAL_CALL disposing ( const css::lang::EventObject& rEvent) override;
+
+private:
+ css::uno::Reference<css::frame::XModel2 > mxModel;
+ css::uno::Reference<css::frame::XController> mxController;
+ css::uno::WeakReference<css::drawing::framework::XConfigurationController>
+ mxConfigurationControllerWeak;
+ css::uno::WeakReference<css::uno::XComponentContext> mxContextWeak;
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ css::uno::Reference<css::drawing::framework::XConfiguration> mxSavedConfiguration;
+ ::rtl::Reference<PresenterPaneContainer> mpPaneContainer;
+ css::uno::Reference<css::drawing::framework::XResourceFactory> mxPaneFactory;
+ css::uno::Reference<css::drawing::framework::XResourceFactory> mxViewFactory;
+
+ class ViewDescriptor
+ {
+ public:
+ OUString msTitle;
+ OUString msAccessibleTitle;
+ bool mbIsOpaque;
+ ViewDescriptor()
+ : mbIsOpaque(false)
+ {
+ }
+ };
+ typedef ::std::map<OUString,ViewDescriptor> ViewDescriptorContainer;
+ ViewDescriptorContainer maViewDescriptors;
+
+ void ShutdownPresenterScreen();
+
+ /** Create and initialize the factory for presenter view specific panes.
+ */
+ void SetupPaneFactory (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext);
+
+ /** Create and initialize the factory for presenter view specific views.
+ */
+ void SetupViewFactory (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext);
+
+ /** Read the current layout from the configuration and call
+ ProcessLayout to bring it on to the screen.
+ */
+ void SetupConfiguration (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxAnchorId);
+
+ /** Read one layout from the configuration and make resource activation
+ requests to bring it on to the screen. When one layout references a
+ parent layout then this method calls itself recursively.
+ */
+ void ProcessLayout (
+ PresenterConfigurationAccess& rConfiguration,
+ std::u16string_view rsLayoutName,
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxAnchorId);
+
+ /** Called by ProcessLayout for a single entry of a Layouts
+ configuration list.
+ */
+ void ProcessComponent (
+ const ::std::vector<css::uno::Any>& rValues,
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxAnchorId);
+
+ /** Read the view descriptions from the configuration.
+ */
+ void ProcessViewDescriptions (
+ PresenterConfigurationAccess& rConfiguration);
+
+ /** Called by ProcessViewDescriptions for a single entry.
+ */
+ void ProcessViewDescription (
+ const ::std::vector<css::uno::Any>& rValues);
+
+ void SetupView (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxAnchorId,
+ const OUString& rsPaneURL,
+ const OUString& rsViewURL,
+ const PresenterPaneContainer::ViewInitializationFunction& rViewInitialization);
+
+ /** Return the built-in screen number on the presentation will normally
+ display the presenter console.
+ @return
+ Returns -1 when the presenter screen can or shall not be
+ displayed.
+ */
+ sal_Int32 GetPresenterScreenNumber (
+ const css::uno::Reference<css::presentation::XPresentation2>& rxPresentation) const;
+
+ static sal_Int32 GetPresenterScreenFromScreen( sal_Int32 nPresentationScreen );
+
+ /** Create a resource id for the full screen background pane so that it
+ is displayed on another screen than the full screen presentation.
+ */
+ css::uno::Reference<css::drawing::framework::XResourceId> GetMainPaneId (
+ const css::uno::Reference<css::presentation::XPresentation2>& rxPresentation) const;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterScrollBar.cxx b/sdext/source/presenter/PresenterScrollBar.cxx
new file mode 100644
index 000000000..a4db80277
--- /dev/null
+++ b/sdext/source/presenter/PresenterScrollBar.cxx
@@ -0,0 +1,824 @@
+/* -*- 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 "PresenterScrollBar.hxx"
+#include "PresenterBitmapContainer.hxx"
+#include "PresenterCanvasHelper.hxx"
+#include "PresenterGeometryHelper.hxx"
+#include "PresenterPaintManager.hxx"
+#include "PresenterTimer.hxx"
+#include "PresenterUIPainter.hxx"
+#include <com/sun/star/awt/PosSize.hpp>
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <com/sun/star/rendering/XPolyPolygon2D.hpp>
+
+#include <algorithm>
+#include <memory>
+#include <math.h>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+const double gnScrollBarGap (10);
+
+namespace sdext::presenter {
+
+//===== PresenterScrollBar::MousePressRepeater ================================
+
+class PresenterScrollBar::MousePressRepeater
+ : public std::enable_shared_from_this<MousePressRepeater>
+{
+public:
+ explicit MousePressRepeater (const ::rtl::Reference<PresenterScrollBar>& rpScrollBar);
+ void Dispose();
+ void Start (const PresenterScrollBar::Area& reArea);
+ void Stop();
+ void SetMouseArea (const PresenterScrollBar::Area& reArea);
+
+private:
+ void Callback ();
+ void Execute();
+
+ sal_Int32 mnMousePressRepeaterTaskId;
+ ::rtl::Reference<PresenterScrollBar> mpScrollBar;
+ PresenterScrollBar::Area meMouseArea;
+};
+
+//===== PresenterScrollBar ====================================================
+
+std::weak_ptr<PresenterBitmapContainer> PresenterScrollBar::mpSharedBitmaps;
+
+PresenterScrollBar::PresenterScrollBar (
+ const Reference<XComponentContext>& rxComponentContext,
+ const Reference<awt::XWindow>& rxParentWindow,
+ const std::shared_ptr<PresenterPaintManager>& rpPaintManager,
+ const ::std::function<void (double)>& rThumbMotionListener)
+ : PresenterScrollBarInterfaceBase(m_aMutex),
+ mxComponentContext(rxComponentContext),
+ mpPaintManager(rpPaintManager),
+ mnThumbPosition(0),
+ mnTotalSize(0),
+ mnThumbSize(0),
+ mnLineHeight(10),
+ maDragAnchor(-1,-1),
+ maThumbMotionListener(rThumbMotionListener),
+ meButtonDownArea(None),
+ meMouseMoveArea(None),
+ mbIsNotificationActive(false),
+ mpMousePressRepeater(std::make_shared<MousePressRepeater>(this)),
+ mpCanvasHelper(new PresenterCanvasHelper())
+{
+ try
+ {
+ Reference<lang::XMultiComponentFactory> xFactory (rxComponentContext->getServiceManager());
+ if ( ! xFactory.is())
+ throw RuntimeException();
+
+ mxPresenterHelper.set(
+ xFactory->createInstanceWithContext(
+ "com.sun.star.comp.Draw.PresenterHelper",
+ rxComponentContext),
+ UNO_QUERY_THROW);
+
+ if (mxPresenterHelper.is())
+ mxWindow = mxPresenterHelper->createWindow(rxParentWindow,
+ false,
+ false,
+ false,
+ false);
+
+ // Make the background transparent. The slide show paints its own background.
+ Reference<awt::XWindowPeer> xPeer (mxWindow, UNO_QUERY_THROW);
+ xPeer->setBackground(0xff000000);
+
+ mxWindow->setVisible(true);
+ mxWindow->addWindowListener(this);
+ mxWindow->addPaintListener(this);
+ mxWindow->addMouseListener(this);
+ mxWindow->addMouseMotionListener(this);
+ }
+ catch (RuntimeException&)
+ {
+ }
+}
+
+PresenterScrollBar::~PresenterScrollBar()
+{
+}
+
+void SAL_CALL PresenterScrollBar::disposing()
+{
+ mpMousePressRepeater->Dispose();
+
+ if (mxWindow.is())
+ {
+ mxWindow->removeWindowListener(this);
+ mxWindow->removePaintListener(this);
+ mxWindow->removeMouseListener(this);
+ mxWindow->removeMouseMotionListener(this);
+
+ Reference<lang::XComponent> xComponent = mxWindow;
+ mxWindow = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ mpBitmaps.reset();
+}
+
+void PresenterScrollBar::SetVisible (const bool bIsVisible)
+{
+ if (mxWindow.is())
+ mxWindow->setVisible(bIsVisible);
+}
+
+void PresenterScrollBar::SetPosSize (const css::geometry::RealRectangle2D& rBox)
+{
+ if (mxWindow.is())
+ {
+ mxWindow->setPosSize(
+ sal_Int32(floor(rBox.X1)),
+ sal_Int32(ceil(rBox.Y1)),
+ sal_Int32(ceil(rBox.X2-rBox.X1)),
+ sal_Int32(floor(rBox.Y2-rBox.Y1)),
+ awt::PosSize::POSSIZE);
+ UpdateBorders();
+ }
+}
+
+void PresenterScrollBar::SetThumbPosition (
+ double nPosition,
+ const bool bAsynchronousUpdate)
+{
+ nPosition = ValidateThumbPosition(nPosition);
+
+ if (nPosition == mnThumbPosition || mbIsNotificationActive)
+ return;
+
+ mnThumbPosition = nPosition;
+
+ UpdateBorders();
+ Repaint(GetRectangle(Total), bAsynchronousUpdate);
+
+ mbIsNotificationActive = true;
+ try
+ {
+ maThumbMotionListener(mnThumbPosition);
+ }
+ catch (Exception&)
+ {
+ }
+ mbIsNotificationActive = false;
+}
+
+
+void PresenterScrollBar::SetTotalSize (const double nTotalSize)
+{
+ if (mnTotalSize != nTotalSize)
+ {
+ mnTotalSize = nTotalSize + 1;
+ UpdateBorders();
+ Repaint(GetRectangle(Total), false);
+ }
+}
+
+void PresenterScrollBar::SetThumbSize (const double nThumbSize)
+{
+ OSL_ASSERT(nThumbSize>=0);
+ if (mnThumbSize != nThumbSize)
+ {
+ mnThumbSize = nThumbSize;
+ UpdateBorders();
+ Repaint(GetRectangle(Total), false);
+ }
+}
+
+
+void PresenterScrollBar::SetLineHeight (const double nLineHeight)
+{
+ mnLineHeight = nLineHeight;
+}
+
+
+void PresenterScrollBar::SetCanvas (const Reference<css::rendering::XCanvas>& rxCanvas)
+{
+ if (mxCanvas == rxCanvas)
+ return;
+
+ mxCanvas = rxCanvas;
+ if (!mxCanvas.is())
+ return;
+
+ if (mpBitmaps == nullptr)
+ {
+ mpBitmaps = mpSharedBitmaps.lock();
+ if (!mpBitmaps)
+ {
+ try
+ {
+ mpBitmaps = std::make_shared<PresenterBitmapContainer>(
+ "PresenterScreenSettings/ScrollBar/Bitmaps",
+ std::shared_ptr<PresenterBitmapContainer>(),
+ mxComponentContext,
+ mxCanvas);
+ mpSharedBitmaps = mpBitmaps;
+ }
+ catch(Exception&)
+ {
+ OSL_ASSERT(false);
+ }
+ }
+ UpdateBitmaps();
+ UpdateBorders();
+ }
+
+ Repaint(GetRectangle(Total), false);
+}
+
+void PresenterScrollBar::SetBackground (const SharedBitmapDescriptor& rpBackgroundBitmap)
+{
+ mpBackgroundBitmap = rpBackgroundBitmap;
+}
+
+void PresenterScrollBar::CheckValues()
+{
+ mnThumbPosition = ValidateThumbPosition(mnThumbPosition);
+}
+
+double PresenterScrollBar::ValidateThumbPosition (double nPosition)
+{
+ if (nPosition + mnThumbSize > mnTotalSize)
+ nPosition = mnTotalSize - mnThumbSize;
+ if (nPosition < 0)
+ nPosition = 0;
+ return nPosition;
+}
+
+void PresenterScrollBar::Paint (
+ const awt::Rectangle& rUpdateBox)
+{
+ if ( ! mxCanvas.is() || ! mxWindow.is())
+ {
+ OSL_ASSERT(mxCanvas.is());
+ OSL_ASSERT(mxWindow.is());
+ return;
+ }
+
+ if (PresenterGeometryHelper::AreRectanglesDisjoint (rUpdateBox, mxWindow->getPosSize()))
+ return;
+
+ PaintBackground(rUpdateBox);
+ PaintComposite(rUpdateBox, PagerUp,
+ mpPagerStartDescriptor, mpPagerCenterDescriptor, SharedBitmapDescriptor());
+ PaintComposite(rUpdateBox, PagerDown,
+ SharedBitmapDescriptor(), mpPagerCenterDescriptor, mpPagerEndDescriptor);
+ PaintComposite(rUpdateBox, Thumb,
+ mpThumbStartDescriptor, mpThumbCenterDescriptor, mpThumbEndDescriptor);
+ PaintBitmap(rUpdateBox, PrevButton, mpPrevButtonDescriptor);
+ PaintBitmap(rUpdateBox, NextButton, mpNextButtonDescriptor);
+
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ xSpriteCanvas->updateScreen(false);
+}
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL PresenterScrollBar::windowResized (const css::awt::WindowEvent&) {}
+
+void SAL_CALL PresenterScrollBar::windowMoved (const css::awt::WindowEvent&) {}
+
+void SAL_CALL PresenterScrollBar::windowShown (const css::lang::EventObject&) {}
+
+void SAL_CALL PresenterScrollBar::windowHidden (const css::lang::EventObject&) {}
+
+//----- XPaintListener --------------------------------------------------------
+
+void SAL_CALL PresenterScrollBar::windowPaint (const css::awt::PaintEvent& rEvent)
+{
+ if (mxWindow.is())
+ {
+ awt::Rectangle aRepaintBox (rEvent.UpdateRect);
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ aRepaintBox.X += aWindowBox.X;
+ aRepaintBox.Y += aWindowBox.Y;
+ Paint(aRepaintBox);
+
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ xSpriteCanvas->updateScreen(false);
+ }
+}
+
+//----- XMouseListener --------------------------------------------------------
+
+void SAL_CALL PresenterScrollBar::mousePressed (const css::awt::MouseEvent& rEvent)
+{
+ maDragAnchor.X = rEvent.X;
+ maDragAnchor.Y = rEvent.Y;
+ meButtonDownArea = GetArea(rEvent.X, rEvent.Y);
+
+ mpMousePressRepeater->Start(meButtonDownArea);
+}
+
+void SAL_CALL PresenterScrollBar::mouseReleased (const css::awt::MouseEvent&)
+{
+ mpMousePressRepeater->Stop();
+
+ if (mxPresenterHelper.is())
+ mxPresenterHelper->releaseMouse(mxWindow);
+}
+
+void SAL_CALL PresenterScrollBar::mouseEntered (const css::awt::MouseEvent&) {}
+
+void SAL_CALL PresenterScrollBar::mouseExited (const css::awt::MouseEvent&)
+{
+ if (meMouseMoveArea != None)
+ {
+ const Area eOldMouseMoveArea (meMouseMoveArea);
+ meMouseMoveArea = None;
+ Repaint(GetRectangle(eOldMouseMoveArea), true);
+ }
+ meButtonDownArea = None;
+ meMouseMoveArea = None;
+
+ mpMousePressRepeater->Stop();
+}
+
+//----- XMouseMotionListener --------------------------------------------------
+
+void SAL_CALL PresenterScrollBar::mouseMoved (const css::awt::MouseEvent& rEvent)
+{
+ const Area eArea (GetArea(rEvent.X, rEvent.Y));
+ if (eArea != meMouseMoveArea)
+ {
+ const Area eOldMouseMoveArea (meMouseMoveArea);
+ meMouseMoveArea = eArea;
+ if (eOldMouseMoveArea != None)
+ Repaint(GetRectangle(eOldMouseMoveArea), meMouseMoveArea==None);
+ if (meMouseMoveArea != None)
+ Repaint(GetRectangle(meMouseMoveArea), true);
+ }
+ mpMousePressRepeater->SetMouseArea(eArea);
+}
+
+void SAL_CALL PresenterScrollBar::mouseDragged (const css::awt::MouseEvent& rEvent)
+{
+ if (meButtonDownArea != Thumb)
+ return;
+
+ mpMousePressRepeater->Stop();
+
+ if (mxPresenterHelper.is())
+ mxPresenterHelper->captureMouse(mxWindow);
+
+ const double nDragDistance (GetDragDistance(rEvent.X,rEvent.Y));
+ UpdateDragAnchor(nDragDistance);
+ if (nDragDistance != 0)
+ {
+ SetThumbPosition(mnThumbPosition + nDragDistance, false);
+ }
+}
+
+//----- lang::XEventListener --------------------------------------------------
+
+void SAL_CALL PresenterScrollBar::disposing (const css::lang::EventObject& rEvent)
+{
+ if (rEvent.Source == mxWindow)
+ mxWindow = nullptr;
+}
+
+
+geometry::RealRectangle2D const & PresenterScrollBar::GetRectangle (const Area eArea) const
+{
+ OSL_ASSERT(eArea>=0 && eArea<AreaCount);
+
+ return maBox[eArea];
+}
+
+void PresenterScrollBar::Repaint (
+ const geometry::RealRectangle2D& rBox,
+ const bool bAsynchronousUpdate)
+{
+ if (mpPaintManager != nullptr)
+ mpPaintManager->Invalidate(
+ mxWindow,
+ PresenterGeometryHelper::ConvertRectangle(rBox),
+ bAsynchronousUpdate);
+}
+
+void PresenterScrollBar::PaintBackground(
+ const css::awt::Rectangle& rUpdateBox)
+{
+ if (!mpBackgroundBitmap)
+ return;
+
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ mpCanvasHelper->Paint(
+ mpBackgroundBitmap,
+ mxCanvas,
+ rUpdateBox,
+ aWindowBox,
+ awt::Rectangle());
+}
+
+void PresenterScrollBar::PaintBitmap(
+ const css::awt::Rectangle& rUpdateBox,
+ const Area eArea,
+ const SharedBitmapDescriptor& rpBitmaps)
+{
+ const geometry::RealRectangle2D aLocalBox (GetRectangle(eArea));
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ geometry::RealRectangle2D aBox (aLocalBox);
+ aBox.X1 += aWindowBox.X;
+ aBox.Y1 += aWindowBox.Y;
+ aBox.X2 += aWindowBox.X;
+ aBox.Y2 += aWindowBox.Y;
+
+ Reference<rendering::XBitmap> xBitmap (GetBitmap(eArea,rpBitmaps));
+
+ if (!xBitmap.is())
+ return;
+
+ Reference<rendering::XPolyPolygon2D> xClipPolygon (
+ PresenterGeometryHelper::CreatePolygon(
+ PresenterGeometryHelper::Intersection(rUpdateBox,
+ PresenterGeometryHelper::ConvertRectangle(aBox)),
+ mxCanvas->getDevice()));
+
+ const rendering::ViewState aViewState (
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ xClipPolygon);
+
+ const geometry::IntegerSize2D aBitmapSize (xBitmap->getSize());
+ rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(
+ 1,0,aBox.X1 + (aBox.X2-aBox.X1 - aBitmapSize.Width)/2,
+ 0,1,aBox.Y1 + (aBox.Y2-aBox.Y1 - aBitmapSize.Height)/2),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+
+ mxCanvas->drawBitmap(
+ xBitmap,
+ aViewState,
+ aRenderState);
+}
+
+PresenterScrollBar::Area PresenterScrollBar::GetArea (const double nX, const double nY) const
+{
+ const geometry::RealPoint2D aPoint(nX, nY);
+
+ if (PresenterGeometryHelper::IsInside(GetRectangle(Pager), aPoint))
+ {
+ if (PresenterGeometryHelper::IsInside(GetRectangle(Thumb), aPoint))
+ return Thumb;
+ else if (PresenterGeometryHelper::IsInside(GetRectangle(PagerUp), aPoint))
+ return PagerUp;
+ else if (PresenterGeometryHelper::IsInside(GetRectangle(PagerDown), aPoint))
+ return PagerDown;
+ }
+ else if (PresenterGeometryHelper::IsInside(GetRectangle(PrevButton), aPoint))
+ return PrevButton;
+ else if (PresenterGeometryHelper::IsInside(GetRectangle(NextButton), aPoint))
+ return NextButton;
+
+ return None;
+}
+
+void PresenterScrollBar::UpdateWidthOrHeight (
+ sal_Int32& rSize,
+ const SharedBitmapDescriptor& rpDescriptor)
+{
+ if (rpDescriptor)
+ {
+ Reference<rendering::XBitmap> xBitmap (rpDescriptor->GetNormalBitmap());
+ if (xBitmap.is())
+ {
+ const geometry::IntegerSize2D aBitmapSize (xBitmap->getSize());
+ const sal_Int32 nBitmapSize = static_cast<sal_Int32>(GetMinor(aBitmapSize.Width, aBitmapSize.Height));
+ if (nBitmapSize > rSize)
+ rSize = nBitmapSize;
+ }
+ }
+}
+
+css::uno::Reference<css::rendering::XBitmap> PresenterScrollBar::GetBitmap (
+ const Area eArea,
+ const SharedBitmapDescriptor& rpBitmaps) const
+{
+ if (!rpBitmaps)
+ return nullptr;
+ else
+ return rpBitmaps->GetBitmap(GetBitmapMode(eArea));
+}
+
+PresenterBitmapContainer::BitmapDescriptor::Mode PresenterScrollBar::GetBitmapMode (
+ const Area eArea) const
+{
+ if (IsDisabled(eArea))
+ return PresenterBitmapContainer::BitmapDescriptor::Disabled;
+ else if (eArea == meMouseMoveArea)
+ return PresenterBitmapContainer::BitmapDescriptor::MouseOver;
+ else
+ return PresenterBitmapContainer::BitmapDescriptor::Normal;
+}
+
+bool PresenterScrollBar::IsDisabled (const Area eArea) const
+{
+ OSL_ASSERT(eArea>=0 && eArea<AreaCount);
+
+ return ! maEnabledState[eArea];
+}
+
+//===== PresenterVerticalScrollBar ============================================
+
+PresenterVerticalScrollBar::PresenterVerticalScrollBar (
+ const Reference<XComponentContext>& rxComponentContext,
+ const Reference<awt::XWindow>& rxParentWindow,
+ const std::shared_ptr<PresenterPaintManager>& rpPaintManager,
+ const ::std::function<void (double)>& rThumbMotionListener)
+ : PresenterScrollBar(rxComponentContext, rxParentWindow, rpPaintManager, rThumbMotionListener),
+ mnScrollBarWidth(0)
+{
+}
+
+PresenterVerticalScrollBar::~PresenterVerticalScrollBar()
+{
+}
+
+double PresenterVerticalScrollBar::GetDragDistance (const sal_Int32, const sal_Int32 nY) const
+{
+ const double nDistance (nY - maDragAnchor.Y);
+ if (nDistance == 0)
+ return 0;
+ else
+ {
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ const double nBarWidth (aWindowBox.Width);
+ const double nPagerHeight (aWindowBox.Height - 2*nBarWidth);
+ const double nDragDistance (mnTotalSize / nPagerHeight * nDistance);
+ if (nDragDistance + mnThumbPosition < 0)
+ return -mnThumbPosition;
+ else if (mnThumbPosition + nDragDistance > mnTotalSize-mnThumbSize)
+ return mnTotalSize-mnThumbSize-mnThumbPosition;
+ else
+ return nDragDistance;
+ }
+}
+
+void PresenterVerticalScrollBar::UpdateDragAnchor (const double nDragDistance)
+{
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ const double nBarWidth (aWindowBox.Width);
+ const double nPagerHeight (aWindowBox.Height - 2*nBarWidth);
+ maDragAnchor.Y += nDragDistance * nPagerHeight / mnTotalSize;
+}
+
+sal_Int32 PresenterVerticalScrollBar::GetSize() const
+{
+ return mnScrollBarWidth;
+}
+
+double PresenterVerticalScrollBar::GetMinor (const double nX, const double) const
+{
+ return nX;
+}
+
+void PresenterVerticalScrollBar::UpdateBorders()
+{
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ double nBottom = aWindowBox.Height;
+
+ if (mpNextButtonDescriptor)
+ {
+ Reference<rendering::XBitmap> xBitmap (mpNextButtonDescriptor->GetNormalBitmap());
+ if (xBitmap.is())
+ {
+ geometry::IntegerSize2D aSize (xBitmap->getSize());
+ maBox[NextButton] = geometry::RealRectangle2D(
+ 0, nBottom - aSize.Height, aWindowBox.Width, nBottom);
+ nBottom -= aSize.Height + gnScrollBarGap;
+ }
+ }
+ if (mpPrevButtonDescriptor)
+ {
+ Reference<rendering::XBitmap> xBitmap (mpPrevButtonDescriptor->GetNormalBitmap());
+ if (xBitmap.is())
+ {
+ geometry::IntegerSize2D aSize (xBitmap->getSize());
+ maBox[PrevButton] = geometry::RealRectangle2D(
+ 0, nBottom - aSize.Height, aWindowBox.Width, nBottom);
+ nBottom -= aSize.Height + gnScrollBarGap;
+ }
+ }
+ const double nPagerHeight (nBottom);
+ maBox[Pager] = geometry::RealRectangle2D(
+ 0,0, aWindowBox.Width, nBottom);
+ if (mnTotalSize < 1)
+ {
+ maBox[Thumb] = maBox[Pager];
+
+ // Set up the enabled/disabled states.
+ maEnabledState[PrevButton] = false;
+ maEnabledState[PagerUp] = false;
+ maEnabledState[NextButton] = false;
+ maEnabledState[PagerDown] = false;
+ maEnabledState[Thumb] = false;
+ }
+ else
+ {
+ const double nThumbSize = ::std::min(mnThumbSize,mnTotalSize);
+ const double nThumbPosition = ::std::clamp(mnThumbPosition, 0.0, mnTotalSize - nThumbSize);
+ maBox[Thumb] = geometry::RealRectangle2D(
+ 0, nThumbPosition / mnTotalSize * nPagerHeight,
+ aWindowBox.Width,
+ (nThumbPosition+nThumbSize) / mnTotalSize * nPagerHeight);
+
+ // Set up the enabled/disabled states.
+ maEnabledState[PrevButton] = nThumbPosition>0;
+ maEnabledState[PagerUp] = nThumbPosition>0;
+ maEnabledState[NextButton] = nThumbPosition+nThumbSize < mnTotalSize;
+ maEnabledState[PagerDown] = nThumbPosition+nThumbSize < mnTotalSize;
+ maEnabledState[Thumb] = nThumbSize < mnTotalSize;
+ }
+ maBox[PagerUp] = geometry::RealRectangle2D(
+ maBox[Pager].X1, maBox[Pager].Y1, maBox[Pager].X2, maBox[Thumb].Y1-1);
+ maBox[PagerDown] = geometry::RealRectangle2D(
+ maBox[Pager].X1, maBox[Thumb].Y2+1, maBox[Pager].X2, maBox[Pager].Y2);
+ maBox[Total] = PresenterGeometryHelper::Union(
+ PresenterGeometryHelper::Union(maBox[PrevButton], maBox[NextButton]),
+ maBox[Pager]);
+}
+
+void PresenterVerticalScrollBar::UpdateBitmaps()
+{
+ if (mpBitmaps == nullptr)
+ return;
+
+ mpPrevButtonDescriptor = mpBitmaps->GetBitmap("Up");
+ mpNextButtonDescriptor = mpBitmaps->GetBitmap("Down");
+ mpPagerStartDescriptor = mpBitmaps->GetBitmap("PagerTop");
+ mpPagerCenterDescriptor = mpBitmaps->GetBitmap("PagerVertical");
+ mpPagerEndDescriptor = mpBitmaps->GetBitmap("PagerBottom");
+ mpThumbStartDescriptor = mpBitmaps->GetBitmap("ThumbTop");
+ mpThumbCenterDescriptor = mpBitmaps->GetBitmap("ThumbVertical");
+ mpThumbEndDescriptor = mpBitmaps->GetBitmap("ThumbBottom");
+
+ mnScrollBarWidth = 0;
+ UpdateWidthOrHeight(mnScrollBarWidth, mpPrevButtonDescriptor);
+ UpdateWidthOrHeight(mnScrollBarWidth, mpNextButtonDescriptor);
+ UpdateWidthOrHeight(mnScrollBarWidth, mpPagerStartDescriptor);
+ UpdateWidthOrHeight(mnScrollBarWidth, mpPagerCenterDescriptor);
+ UpdateWidthOrHeight(mnScrollBarWidth, mpPagerEndDescriptor);
+ UpdateWidthOrHeight(mnScrollBarWidth, mpThumbStartDescriptor);
+ UpdateWidthOrHeight(mnScrollBarWidth, mpThumbCenterDescriptor);
+ UpdateWidthOrHeight(mnScrollBarWidth, mpThumbEndDescriptor);
+ if (mnScrollBarWidth == 0)
+ mnScrollBarWidth = 20;
+}
+
+void PresenterVerticalScrollBar::PaintComposite(
+ const css::awt::Rectangle& rUpdateBox,
+ const Area eArea,
+ const SharedBitmapDescriptor& rpStartBitmaps,
+ const SharedBitmapDescriptor& rpCenterBitmaps,
+ const SharedBitmapDescriptor& rpEndBitmaps)
+{
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ geometry::RealRectangle2D aBox (GetRectangle(eArea));
+ aBox.X1 += aWindowBox.X;
+ aBox.Y1 += aWindowBox.Y;
+ aBox.X2 += aWindowBox.X;
+ aBox.Y2 += aWindowBox.Y;
+
+ // Get bitmaps and sizes.
+
+ PresenterUIPainter::PaintVerticalBitmapComposite(
+ mxCanvas,
+ rUpdateBox,
+ (eArea == Thumb
+ ? PresenterGeometryHelper::ConvertRectangleWithConstantSize(aBox)
+ : PresenterGeometryHelper::ConvertRectangle(aBox)),
+ GetBitmap(eArea, rpStartBitmaps),
+ GetBitmap(eArea, rpCenterBitmaps),
+ GetBitmap(eArea, rpEndBitmaps));
+}
+
+//===== PresenterScrollBar::MousePressRepeater ================================
+
+PresenterScrollBar::MousePressRepeater::MousePressRepeater (
+ const ::rtl::Reference<PresenterScrollBar>& rpScrollBar)
+ : mnMousePressRepeaterTaskId(PresenterTimer::NotAValidTaskId),
+ mpScrollBar(rpScrollBar),
+ meMouseArea(PresenterScrollBar::None)
+{
+}
+
+void PresenterScrollBar::MousePressRepeater::Dispose()
+{
+ Stop();
+ mpScrollBar = nullptr;
+}
+
+void PresenterScrollBar::MousePressRepeater::Start (const PresenterScrollBar::Area& reArea)
+{
+ meMouseArea = reArea;
+
+ if (mnMousePressRepeaterTaskId == PresenterTimer::NotAValidTaskId)
+ {
+ // Execute key press operation at least this one time.
+ Execute();
+
+ // Schedule repeated executions.
+ auto pThis(shared_from_this());
+ mnMousePressRepeaterTaskId = PresenterTimer::ScheduleRepeatedTask (
+ mpScrollBar->GetComponentContext(),
+ [pThis] (TimeValue const&) { return pThis->Callback(); },
+ 500000000,
+ 250000000);
+ }
+ else
+ {
+ // There is already an active repeating task.
+ }
+}
+
+void PresenterScrollBar::MousePressRepeater::Stop()
+{
+ if (mnMousePressRepeaterTaskId != PresenterTimer::NotAValidTaskId)
+ {
+ const sal_Int32 nTaskId (mnMousePressRepeaterTaskId);
+ mnMousePressRepeaterTaskId = PresenterTimer::NotAValidTaskId;
+ PresenterTimer::CancelTask(nTaskId);
+ }
+}
+
+void PresenterScrollBar::MousePressRepeater::SetMouseArea(const PresenterScrollBar::Area& reArea)
+{
+ if (meMouseArea != reArea)
+ {
+ if (mnMousePressRepeaterTaskId != PresenterTimer::NotAValidTaskId)
+ {
+ Stop();
+ }
+ }
+}
+
+void PresenterScrollBar::MousePressRepeater::Callback ()
+{
+ if (!mpScrollBar)
+ {
+ Stop();
+ return;
+ }
+
+ Execute();
+}
+
+void PresenterScrollBar::MousePressRepeater::Execute()
+{
+ const double nThumbPosition (mpScrollBar->GetThumbPosition());
+ switch (meMouseArea)
+ {
+ case PrevButton:
+ mpScrollBar->SetThumbPosition(nThumbPosition - mpScrollBar->GetLineHeight(), true);
+ break;
+
+ case NextButton:
+ mpScrollBar->SetThumbPosition(nThumbPosition + mpScrollBar->GetLineHeight(), true);
+ break;
+
+ case PagerUp:
+ mpScrollBar->SetThumbPosition(nThumbPosition - mpScrollBar->GetThumbSize()*0.8, true);
+ break;
+
+ case PagerDown:
+ mpScrollBar->SetThumbPosition(nThumbPosition + mpScrollBar->GetThumbSize()*0.8, true);
+ break;
+
+ default:
+ break;
+ }
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterScrollBar.hxx b/sdext/source/presenter/PresenterScrollBar.hxx
new file mode 100644
index 000000000..b131c8a43
--- /dev/null
+++ b/sdext/source/presenter/PresenterScrollBar.hxx
@@ -0,0 +1,257 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERSCROLLBAR_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSCROLLBAR_HXX
+
+#include "PresenterBitmapContainer.hxx"
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/drawing/XPresenterHelper.hpp>
+#include <com/sun/star/rendering/XCanvas.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+
+#include <functional>
+#include <memory>
+
+namespace sdext::presenter {
+
+class PresenterCanvasHelper;
+class PresenterPaintManager;
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::awt::XWindowListener,
+ css::awt::XPaintListener,
+ css::awt::XMouseListener,
+ css::awt::XMouseMotionListener
+> PresenterScrollBarInterfaceBase;
+
+/** Base class of horizontal and vertical scroll bars.
+*/
+class PresenterScrollBar
+ : private ::cppu::BaseMutex,
+ public PresenterScrollBarInterfaceBase
+{
+public:
+ virtual ~PresenterScrollBar() override;
+ PresenterScrollBar(const PresenterScrollBar&) = delete;
+ PresenterScrollBar& operator=(const PresenterScrollBar&) = delete;
+
+ virtual void SAL_CALL disposing() override;
+
+ css::uno::Reference<css::uno::XComponentContext> const&
+ GetComponentContext() const { return mxComponentContext; }
+
+ void SetVisible (const bool bIsVisible);
+
+ /** Set the bounding box of the scroll bar.
+ */
+ void SetPosSize (const css::geometry::RealRectangle2D& rBox);
+
+ /** Set the position of the movable thumb.
+ @param nPosition
+ A value between 0 and the last value given to SetTotalSize()
+ minus the last value given to SetThumbSize().
+ */
+ void SetThumbPosition (
+ double nPosition,
+ const bool bAsynchronousRepaint);
+
+ double GetThumbPosition() const { return mnThumbPosition;}
+
+ /** Set the upper border of the slider range.
+ */
+ void SetTotalSize (const double nTotalSize);
+
+ /** Set the size of the movable thumb.
+ @param nThumbSize
+ A value not larger than the last value given to SetTotalSize().
+ */
+ void SetThumbSize (const double nThumbSize);
+ double GetThumbSize() const { return mnThumbSize;}
+
+ void SetLineHeight (const double nLineHeight);
+ double GetLineHeight() const { return mnLineHeight;}
+
+ /** Set the canvas that is used for painting the scroll bar.
+ */
+ void SetCanvas (const css::uno::Reference<css::rendering::XCanvas>& rxCanvas);
+
+ void SetBackground (const SharedBitmapDescriptor& rpBackgroundBitmap);
+
+ /** Call this after changing total size or thumb position or size to
+ move the thumb to a valid position.
+ */
+ void CheckValues();
+
+ /** On some occasions it is necessary to trigger the painting of a
+ scrollbar from the outside.
+ */
+ void Paint (
+ const css::awt::Rectangle& rUpdateBox);
+
+ virtual sal_Int32 GetSize() const = 0;
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override;
+
+ // XPaintListener
+
+ virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override;
+
+ // XMouseListener
+
+ virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) override;
+
+ // XMouseMotionListener
+
+ virtual void SAL_CALL mouseMoved (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseDragged (const css::awt::MouseEvent& rEvent) override;
+
+ // lang::XEventListener
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+
+ enum Area { Total, Pager, Thumb, PagerUp, PagerDown, PrevButton, NextButton, None,
+ AreaCount = None };
+
+protected:
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+ css::uno::Reference<css::awt::XWindow> mxWindow;
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+ css::uno::Reference<css::drawing::XPresenterHelper> mxPresenterHelper;
+ std::shared_ptr<PresenterPaintManager> mpPaintManager;
+ double mnThumbPosition;
+ double mnTotalSize;
+ double mnThumbSize;
+ double mnLineHeight;
+ css::geometry::RealPoint2D maDragAnchor;
+ ::std::function<void (double)> maThumbMotionListener;
+ Area meButtonDownArea;
+ Area meMouseMoveArea;
+ css::geometry::RealRectangle2D maBox[AreaCount];
+ bool mbIsNotificationActive;
+ static std::weak_ptr<PresenterBitmapContainer> mpSharedBitmaps;
+ std::shared_ptr<PresenterBitmapContainer> mpBitmaps;
+ SharedBitmapDescriptor mpPrevButtonDescriptor;
+ SharedBitmapDescriptor mpNextButtonDescriptor;
+ SharedBitmapDescriptor mpPagerStartDescriptor;
+ SharedBitmapDescriptor mpPagerCenterDescriptor;
+ SharedBitmapDescriptor mpPagerEndDescriptor;
+ SharedBitmapDescriptor mpThumbStartDescriptor;
+ SharedBitmapDescriptor mpThumbCenterDescriptor;
+ SharedBitmapDescriptor mpThumbEndDescriptor;
+ bool maEnabledState[AreaCount];
+
+ css::geometry::RealRectangle2D const & GetRectangle (const Area eArea) const;
+ virtual double GetDragDistance (const sal_Int32 nX, const sal_Int32 nY) const = 0;
+ virtual void UpdateDragAnchor (const double nDragDistance) = 0;
+ virtual double GetMinor (const double nX, const double nY) const = 0;
+ virtual void UpdateBorders() = 0;
+ virtual void UpdateBitmaps() = 0;
+ virtual void PaintComposite(
+ const css::awt::Rectangle& rRepaintBox,
+ const Area eArea,
+ const SharedBitmapDescriptor& rpStartBitmaps,
+ const SharedBitmapDescriptor& rpCenterBitmaps,
+ const SharedBitmapDescriptor& rpEndBitmaps) = 0;
+
+ PresenterScrollBar (
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const css::uno::Reference<css::awt::XWindow>& rxParentWindow,
+ const std::shared_ptr<PresenterPaintManager>& rpPaintManager,
+ const ::std::function<void (double)>& rThumbMotionListener);
+
+ void Repaint (
+ const css::geometry::RealRectangle2D& rBox,
+ const bool bAsynchronous);
+ void PaintBackground (
+ const css::awt::Rectangle& rRepaintBox);
+ void PaintBitmap(
+ const css::awt::Rectangle& rRepaintBox,
+ const Area eArea,
+ const SharedBitmapDescriptor& rpBitmaps);
+ void UpdateWidthOrHeight (sal_Int32& rSize,
+ const SharedBitmapDescriptor& rpDescriptor);
+ css::uno::Reference<css::rendering::XBitmap> GetBitmap (
+ const Area eArea,
+ const SharedBitmapDescriptor& rpBitmaps) const;
+ PresenterBitmapContainer::BitmapDescriptor::Mode GetBitmapMode (
+ const Area eArea) const;
+ bool IsDisabled (const Area eArea) const;
+ double ValidateThumbPosition (double nPosition);
+
+private:
+ class MousePressRepeater;
+ std::shared_ptr<MousePressRepeater> mpMousePressRepeater;
+ SharedBitmapDescriptor mpBackgroundBitmap;
+ std::unique_ptr<PresenterCanvasHelper> mpCanvasHelper;
+
+ Area GetArea (const double nX, const double nY) const;
+};
+
+/** A vertical scroll bar.
+*/
+class PresenterVerticalScrollBar : public PresenterScrollBar
+{
+public:
+ PresenterVerticalScrollBar (
+ const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext,
+ const css::uno::Reference<css::awt::XWindow>& rxParentWindow,
+ const std::shared_ptr<PresenterPaintManager>& rpPaintManager,
+ const ::std::function<void (double)>& rThumbMotionListener);
+ virtual ~PresenterVerticalScrollBar() override;
+ virtual sal_Int32 GetSize() const override;
+
+protected:
+ virtual double GetDragDistance (const sal_Int32 nX, const sal_Int32 nY) const override;
+ virtual void UpdateDragAnchor (const double nDragDistance) override;
+ virtual double GetMinor (const double nX, const double nY) const override;
+ virtual void UpdateBorders() override;
+ virtual void UpdateBitmaps() override;
+ virtual void PaintComposite(
+ const css::awt::Rectangle& rRepaintBox,
+ const Area eArea,
+ const SharedBitmapDescriptor& rpStartBitmaps,
+ const SharedBitmapDescriptor& rpCenterBitmaps,
+ const SharedBitmapDescriptor& rpEndBitmaps) override;
+
+private:
+ sal_Int32 mnScrollBarWidth;
+};
+
+} // end of namespace ::sdext::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterSlidePreview.cxx b/sdext/source/presenter/PresenterSlidePreview.cxx
new file mode 100644
index 000000000..9de4c8820
--- /dev/null
+++ b/sdext/source/presenter/PresenterSlidePreview.cxx
@@ -0,0 +1,352 @@
+/* -*- 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 "PresenterSlidePreview.hxx"
+#include "PresenterCanvasHelper.hxx"
+#include "PresenterGeometryHelper.hxx"
+#include "PresenterPaintManager.hxx"
+#include "PresenterBitmapContainer.hxx"
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace
+{
+ // Use a super sample factor greater than 1 to achieve a poor mans
+ // antialiasing effect for slide previews.
+ const sal_Int16 gnSuperSampleFactor = 2;
+}
+
+namespace sdext::presenter {
+
+//===== PresenterSlidePreview =================================================
+
+PresenterSlidePreview::PresenterSlidePreview (
+ const Reference<XComponentContext>& rxContext,
+ const Reference<XResourceId>& rxViewId,
+ const Reference<XPane>& rxAnchorPane,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterSlidePreviewInterfaceBase(m_aMutex),
+ mpPresenterController(rpPresenterController),
+ mxViewId(rxViewId),
+ mnSlideAspectRatio(28.0 / 21.0)
+{
+ if ( ! rxContext.is()
+ || ! rxViewId.is()
+ || ! rxAnchorPane.is()
+ || ! rpPresenterController.is())
+ {
+ throw RuntimeException(
+ "PresenterSlidePreview can not be constructed due to empty argument",
+ static_cast<XWeak*>(this));
+ }
+
+ mxWindow = rxAnchorPane->getWindow();
+ mxCanvas = rxAnchorPane->getCanvas();
+
+ if (mxWindow.is())
+ {
+ mxWindow->addWindowListener(this);
+ mxWindow->addPaintListener(this);
+
+ Reference<awt::XWindowPeer> xPeer (mxWindow, UNO_QUERY);
+ if (xPeer.is())
+ xPeer->setBackground(util::Color(0xff000000));
+
+ mxWindow->setVisible(true);
+ }
+
+ if (mpPresenterController)
+ mnSlideAspectRatio = mpPresenterController->GetSlideAspectRatio();
+
+ Reference<lang::XMultiComponentFactory> xFactory = rxContext->getServiceManager();
+ if (xFactory.is())
+ mxPreviewRenderer.set(
+ xFactory->createInstanceWithContext(
+ "com.sun.star.drawing.SlideRenderer",
+ rxContext),
+ UNO_QUERY);
+ mpBitmaps = std::make_shared<PresenterBitmapContainer>(
+ "PresenterScreenSettings/ScrollBar/Bitmaps",
+ std::shared_ptr<PresenterBitmapContainer>(),
+ rxContext,
+ mxCanvas);
+ Resize();
+}
+
+PresenterSlidePreview::~PresenterSlidePreview()
+{
+}
+
+void SAL_CALL PresenterSlidePreview::disposing()
+{
+ if (mxWindow.is())
+ {
+ mxWindow->removeWindowListener(this);
+ mxWindow->removePaintListener(this);
+ mxWindow = nullptr;
+ mxCanvas = nullptr;
+ }
+
+ Reference<lang::XComponent> xComponent (mxPreviewRenderer, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+}
+
+//----- XResourceId -----------------------------------------------------------
+
+Reference<XResourceId> SAL_CALL PresenterSlidePreview::getResourceId()
+{
+ return mxViewId;
+}
+
+sal_Bool SAL_CALL PresenterSlidePreview::isAnchorOnly()
+{
+ return false;
+}
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL PresenterSlidePreview::windowResized (const awt::WindowEvent&)
+{
+ ThrowIfDisposed();
+ ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
+ Resize();
+}
+
+void SAL_CALL PresenterSlidePreview::windowMoved (const awt::WindowEvent&) {}
+
+void SAL_CALL PresenterSlidePreview::windowShown (const lang::EventObject&)
+{
+ ThrowIfDisposed();
+ ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
+ Resize();
+}
+
+void SAL_CALL PresenterSlidePreview::windowHidden (const lang::EventObject&) {}
+
+//----- XPaintListener --------------------------------------------------------
+
+void SAL_CALL PresenterSlidePreview::windowPaint (const awt::PaintEvent& rEvent)
+{
+ ThrowIfDisposed();
+
+ ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
+ if (mxWindow.is())
+ Paint(awt::Rectangle(
+ rEvent.UpdateRect.X,
+ rEvent.UpdateRect.Y,
+ rEvent.UpdateRect.Width,
+ rEvent.UpdateRect.Height));
+}
+
+//----- lang::XEventListener --------------------------------------------------
+
+void SAL_CALL PresenterSlidePreview::disposing (const lang::EventObject& rEvent)
+{
+ if (rEvent.Source == mxWindow)
+ {
+ mxWindow = nullptr;
+ mxCanvas = nullptr;
+ mxPreview = nullptr;
+ }
+}
+
+//----- XDrawView -------------------------------------------------------------
+
+void SAL_CALL PresenterSlidePreview::setCurrentPage (const Reference<drawing::XDrawPage>& rxSlide)
+{
+ ThrowIfDisposed();
+ ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
+ SetSlide(rxSlide);
+}
+
+Reference<drawing::XDrawPage> SAL_CALL PresenterSlidePreview::getCurrentPage()
+{
+ ThrowIfDisposed();
+ return nullptr;
+}
+
+
+void PresenterSlidePreview::SetSlide (const Reference<drawing::XDrawPage>& rxPage)
+{
+ mxCurrentSlide = rxPage;
+ mxPreview = nullptr;
+
+ // The preview is not transparent, therefore only this window, not its
+ // parent, has to be invalidated.
+ mpPresenterController->GetPaintManager()->Invalidate(mxWindow);
+}
+
+void PresenterSlidePreview::Paint (const awt::Rectangle& rBoundingBox)
+{
+ if ( ! mxWindow.is())
+ return;
+ if ( ! mxCanvas.is())
+ return;
+ if ( ! mxPreviewRenderer.is())
+ return;
+
+ // Make sure that a preview in the correct size exists.
+ awt::Rectangle aWindowBox (mxWindow->getPosSize());
+
+ bool bCustomAnimation = false;
+ bool bTransition = false;
+ if( mxCurrentSlide.is() )
+ {
+ bCustomAnimation = PresenterController::HasCustomAnimation(mxCurrentSlide);
+ bTransition = PresenterController::HasTransition(mxCurrentSlide);
+ }
+
+ if ( ! mxPreview.is() && mxCurrentSlide.is())
+ {
+ // Create a new preview bitmap.
+ mxPreview = mxPreviewRenderer->createPreviewForCanvas(
+ mxCurrentSlide,
+ awt::Size(aWindowBox.Width, aWindowBox.Height),
+ gnSuperSampleFactor,
+ mxCanvas);
+ }
+
+ // Determine the bounding box of the preview.
+ awt::Rectangle aPreviewBox;
+ if (mxPreview.is())
+ {
+ const geometry::IntegerSize2D aPreviewSize (mxPreview->getSize());
+ aPreviewBox = awt::Rectangle(
+ (aWindowBox.Width - aPreviewSize.Width)/2,
+ (aWindowBox.Height - aPreviewSize.Height)/2,
+ aPreviewSize.Width,
+ aPreviewSize.Height);
+ }
+ else
+ {
+ if (mnSlideAspectRatio > 0)
+ {
+ const awt::Size aPreviewSize (mxPreviewRenderer->calculatePreviewSize(
+ mnSlideAspectRatio,awt::Size(aWindowBox.Width, aWindowBox.Height)));
+ aPreviewBox = awt::Rectangle(
+ (aWindowBox.Width - aPreviewSize.Width)/2,
+ (aWindowBox.Height - aPreviewSize.Height)/2,
+ aPreviewSize.Width,
+ aPreviewSize.Height);
+ }
+ }
+
+ // Paint the background.
+ mpPresenterController->GetCanvasHelper()->Paint(
+ mpPresenterController->GetViewBackground(mxViewId->getResourceURL()),
+ mxCanvas,
+ rBoundingBox,
+ awt::Rectangle(0,0,aWindowBox.Width,aWindowBox.Height),
+ aPreviewBox);
+
+ // Paint the preview.
+ const rendering::ViewState aViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr);
+
+ Sequence<double> aBackgroundColor(4);
+ rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(1, 0, aPreviewBox.X, 0, 1, aPreviewBox.Y),
+ nullptr,
+ aBackgroundColor,
+ rendering::CompositeOperation::SOURCE);
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, 0x00000000);
+ if (mxPreview.is())
+ {
+ mxCanvas->drawBitmap(mxPreview, aViewState, aRenderState);
+ if( bTransition )
+ {
+ const awt::Rectangle aTransitionPreviewBox(5, aWindowBox.Height-20, 0, 0);
+ SharedBitmapDescriptor aTransitionDescriptor = mpBitmaps->GetBitmap("Transition");
+ Reference<rendering::XBitmap> xTransitionIcon (aTransitionDescriptor->GetNormalBitmap());
+ rendering::RenderState aTransitionRenderState (
+ geometry::AffineMatrix2D(1, 0, aTransitionPreviewBox.X, 0, 1, aTransitionPreviewBox.Y),
+ nullptr,
+ aBackgroundColor,
+ rendering::CompositeOperation::SOURCE);
+ mxCanvas->drawBitmap(xTransitionIcon, aViewState, aTransitionRenderState);
+ }
+ if( bCustomAnimation )
+ {
+ const awt::Rectangle aAnimationPreviewBox(5, aWindowBox.Height-40, 0, 0);
+ SharedBitmapDescriptor aAnimationDescriptor = mpBitmaps->GetBitmap("Animation");
+ Reference<rendering::XBitmap> xAnimationIcon (aAnimationDescriptor->GetNormalBitmap());
+ rendering::RenderState aAnimationRenderState (
+ geometry::AffineMatrix2D(1, 0, aAnimationPreviewBox.X, 0, 1, aAnimationPreviewBox.Y),
+ nullptr,
+ aBackgroundColor,
+ rendering::CompositeOperation::SOURCE);
+ mxCanvas->drawBitmap(xAnimationIcon, aViewState, aAnimationRenderState);
+ }
+ }
+ else
+ {
+ if (mnSlideAspectRatio > 0)
+ {
+ Reference<rendering::XPolyPolygon2D> xPolygon (
+ PresenterGeometryHelper::CreatePolygon(aPreviewBox, mxCanvas->getDevice()));
+ if (xPolygon.is())
+ mxCanvas->fillPolyPolygon(xPolygon, aViewState, aRenderState);
+ }
+ }
+
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ xSpriteCanvas->updateScreen(false);
+}
+
+void PresenterSlidePreview::Resize()
+{
+ if (mxPreviewRenderer.is() && mxPreview.is())
+ {
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ const awt::Size aNewPreviewSize (mxPreviewRenderer->calculatePreviewSize(
+ mnSlideAspectRatio,
+ awt::Size(aWindowBox.Width, aWindowBox.Height)));
+ const geometry::IntegerSize2D aPreviewSize (mxPreview->getSize());
+ if (aNewPreviewSize.Width==aPreviewSize.Width
+ && aNewPreviewSize.Height==aPreviewSize.Height)
+ {
+ // The size of the window may have changed but the preview would
+ // be painted in the same size (but not necessarily at the same
+ // position.)
+ return;
+ }
+ }
+ SetSlide(mxCurrentSlide);
+}
+
+void PresenterSlidePreview::ThrowIfDisposed()
+{
+ if (PresenterSlidePreviewInterfaceBase::rBHelper.bDisposed || PresenterSlidePreviewInterfaceBase::rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterSlidePreview object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterSlidePreview.hxx b/sdext/source/presenter/PresenterSlidePreview.hxx
new file mode 100644
index 000000000..85107693a
--- /dev/null
+++ b/sdext/source/presenter/PresenterSlidePreview.hxx
@@ -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/.
+ *
+ * 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_SDEXT_SOURCE_PRESENTER_PRESENTERSLIDEPREVIEW_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSLIDEPREVIEW_HXX
+
+#include "PresenterController.hxx"
+
+#include <com/sun/star/awt/XPaintListener.hpp>
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/drawing/XSlideRenderer.hpp>
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <rtl/ref.hxx>
+
+namespace sdext::presenter {
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::drawing::framework::XView,
+ css::drawing::XDrawView,
+ css::awt::XPaintListener,
+ css::awt::XWindowListener
+> PresenterSlidePreviewInterfaceBase;
+
+/** Static preview of a slide. Typically used for the preview of the next
+ slide.
+ This implementation shows a preview of the slide given to the
+ setCurrentSlide. For showing the next slide the PresenterViewFactory
+ uses a derived class that overrides the setCurrentSlide() method.
+*/
+class PresenterSlidePreview
+ : private ::cppu::BaseMutex,
+ public PresenterSlidePreviewInterfaceBase
+{
+public:
+ PresenterSlidePreview (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ const css::uno::Reference<css::drawing::framework::XPane>& rxAnchorPane,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ virtual ~PresenterSlidePreview() override;
+ PresenterSlidePreview(const PresenterSlidePreview&) = delete;
+ PresenterSlidePreview& operator=(const PresenterSlidePreview&) = delete;
+ virtual void SAL_CALL disposing() override;
+
+ // XResourceId
+
+ virtual css::uno::Reference<css::drawing::framework::XResourceId> SAL_CALL getResourceId() override;
+
+ virtual sal_Bool SAL_CALL isAnchorOnly() override;
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override;
+
+ // XPaintListener
+
+ virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override;
+
+ // lang::XEventListener
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+
+ // XDrawView
+
+ virtual void SAL_CALL setCurrentPage (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxSlide) override;
+
+ virtual css::uno::Reference<css::drawing::XDrawPage> SAL_CALL getCurrentPage() override;
+
+protected:
+ ::rtl::Reference<PresenterController> mpPresenterController;
+
+private:
+ css::uno::Reference<css::drawing::framework::XResourceId> mxViewId;
+ css::uno::Reference<css::drawing::XSlideRenderer> mxPreviewRenderer;
+
+ /** This Image holds the preview of the current slide. After resize
+ requests the image may be empty. This results eventually in a call
+ to ProvideSlide() in order to created a preview in the correct new
+ size.
+ */
+ css::uno::Reference<css::rendering::XBitmap> mxPreview;
+ std::shared_ptr<PresenterBitmapContainer> mpBitmaps;
+
+ /** The current slide for which a preview is displayed. This may or
+ may not be the same as the current slide of the PresenterView.
+ */
+ css::uno::Reference<css::drawing::XDrawPage> mxCurrentSlide;
+ double mnSlideAspectRatio;
+
+ css::uno::Reference<css::awt::XWindow> mxWindow;
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+
+ /** Set the given slide as the current slide of the called PresenterSlidePreview
+ object.
+ */
+ void SetSlide (const css::uno::Reference<css::drawing::XDrawPage>& rxPage);
+
+ /** Paint the preview of the current slide centered in the window of the
+ anchor pane.
+ */
+ void Paint (const css::awt::Rectangle& rBoundingBox);
+
+ /** React to a resize of the anchor pane.
+ */
+ void Resize();
+
+ /** @throws css::lang::DisposedException when the object has already been
+ disposed.
+ */
+ void ThrowIfDisposed();
+};
+
+} // end of namespace ::sd::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterSlideShowView.cxx b/sdext/source/presenter/PresenterSlideShowView.cxx
new file mode 100644
index 000000000..5ca0ee630
--- /dev/null
+++ b/sdext/source/presenter/PresenterSlideShowView.cxx
@@ -0,0 +1,953 @@
+
+/* -*- 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 "PresenterSlideShowView.hxx"
+#include "PresenterCanvasHelper.hxx"
+#include "PresenterGeometryHelper.hxx"
+#include "PresenterHelper.hxx"
+#include "PresenterPaneContainer.hxx"
+#include <com/sun/star/awt/InvalidateStyle.hpp>
+#include <com/sun/star/awt/PosSize.hpp>
+#include <com/sun/star/awt/Pointer.hpp>
+#include <com/sun/star/awt/Toolkit.hpp>
+#include <com/sun/star/awt/WindowAttribute.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/drawing/XPresenterHelper.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <com/sun/star/rendering/TextDirection.hpp>
+#include <com/sun/star/rendering/TexturingMode.hpp>
+#include <osl/mutex.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sdext::presenter {
+
+//===== PresenterSlideShowView ================================================
+
+PresenterSlideShowView::PresenterSlideShowView (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterSlideShowViewInterfaceBase(m_aMutex),
+ mxComponentContext(rxContext),
+ mpPresenterController(rpPresenterController),
+ mxViewId(rxViewId),
+ mxController(rxController),
+ mxSlideShowController(PresenterHelper::GetSlideShowController(rxController)),
+ mbIsViewAdded(false),
+ mnPageAspectRatio(28.0/21.0),
+ maBroadcaster(m_aMutex),
+ mbIsForcedPaintPending(false),
+ mbIsPaintPending(true),
+ mbIsEndSlideVisible(false)
+{
+ if (mpPresenterController)
+ {
+ mnPageAspectRatio = mpPresenterController->GetSlideAspectRatio();
+ mpBackground = mpPresenterController->GetViewBackground(mxViewId->getResourceURL());
+ }
+}
+
+void PresenterSlideShowView::LateInit()
+{
+ mxSlideShow.set( mxSlideShowController->getSlideShow(), UNO_SET_THROW);
+ Reference<lang::XComponent> xSlideShowComponent (mxSlideShow, UNO_QUERY);
+ xSlideShowComponent->addEventListener(static_cast<awt::XWindowListener*>(this));
+
+ Reference<lang::XMultiComponentFactory> xFactory (
+ mxComponentContext->getServiceManager(), UNO_SET_THROW);
+ mxPresenterHelper.set (xFactory->createInstanceWithContext(
+ "com.sun.star.comp.Draw.PresenterHelper",
+ mxComponentContext),
+ UNO_QUERY_THROW);
+
+ // Use view id and controller to retrieve window and canvas from
+ // configuration controller.
+ Reference<XControllerManager> xCM (mxController, UNO_QUERY_THROW);
+ Reference<XConfigurationController> xCC (xCM->getConfigurationController());
+
+ if (xCC.is())
+ {
+ mxTopPane.set(xCC->getResource(mxViewId->getAnchor()->getAnchor()), UNO_QUERY);
+
+ Reference<XPane> xPane (xCC->getResource(mxViewId->getAnchor()), UNO_QUERY_THROW);
+
+ mxWindow = xPane->getWindow();
+ mxCanvas = xPane->getCanvas();
+
+ if (mxWindow.is())
+ {
+ mxWindow->addPaintListener(this);
+ mxWindow->addWindowListener(this);
+ }
+
+ // The window does not have to paint a background. We do
+ // that ourself.
+ Reference<awt::XWindowPeer> xPeer (mxWindow, UNO_QUERY);
+ if (xPeer.is())
+ xPeer->setBackground(util::Color(0xff000000));
+ }
+
+ // Create a window for the actual slide show view. It is places
+ // centered and with maximal size inside the pane.
+ mxViewWindow = CreateViewWindow(mxWindow);
+
+ mxViewCanvas = CreateViewCanvas(mxViewWindow);
+
+ if (mxViewWindow.is())
+ {
+ // Register listeners at window.
+ mxViewWindow->addPaintListener(this);
+ mxViewWindow->addMouseListener(this);
+ mxViewWindow->addMouseMotionListener(this);
+ }
+
+ if (mxViewWindow.is())
+ Resize();
+
+ if (mxWindow.is())
+ mxWindow->setVisible(true);
+
+ // Add the new slide show view to the slide show.
+ if (mxSlideShow.is() && ! mbIsViewAdded)
+ {
+ impl_addAndConfigureView();
+ mbIsViewAdded = true;
+ }
+
+ // Read text for one past last slide.
+ PresenterConfigurationAccess aConfiguration (
+ mxComponentContext,
+ PresenterConfigurationAccess::msPresenterScreenRootName,
+ PresenterConfigurationAccess::READ_ONLY);
+ aConfiguration.GetConfigurationNode(
+ "Presenter/Views/CurrentSlidePreview/"
+ "Strings/ClickToExitPresentationText/String")
+ >>= msClickToExitPresentationText;
+ aConfiguration.GetConfigurationNode(
+ "Presenter/Views/CurrentSlidePreview/"
+ "Strings/ClickToExitPresentationTitle/String")
+ >>= msClickToExitPresentationTitle;
+}
+
+PresenterSlideShowView::~PresenterSlideShowView()
+{
+}
+
+void PresenterSlideShowView::disposing()
+{
+ // Tell all listeners that we are disposed.
+ lang::EventObject aEvent;
+ aEvent.Source = static_cast<XWeak*>(this);
+
+ ::cppu::OInterfaceContainerHelper* pIterator
+ = maBroadcaster.getContainer(cppu::UnoType<lang::XEventListener>::get());
+ if (pIterator != nullptr)
+ pIterator->disposeAndClear(aEvent);
+
+ // Do this for
+ // XPaintListener, XModifyListener,XMouseListener,XMouseMotionListener,XWindowListener?
+
+ if (mxWindow.is())
+ {
+ mxWindow->removePaintListener(this);
+ mxWindow->removeMouseListener(this);
+ mxWindow->removeMouseMotionListener(this);
+ mxWindow->removeWindowListener(this);
+ mxWindow = nullptr;
+ }
+ mxSlideShowController = nullptr;
+ mxSlideShow = nullptr;
+ if (mxViewCanvas.is())
+ {
+ Reference<XComponent> xComponent (mxViewCanvas, UNO_QUERY);
+ mxViewCanvas = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ if (mxViewWindow.is())
+ {
+ Reference<XComponent> xComponent = mxViewWindow;
+ mxViewWindow = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ if (mxPointer.is())
+ {
+ Reference<XComponent> xComponent (mxPointer, UNO_QUERY);
+ mxPointer = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ if (mxBackgroundPolygon1.is())
+ {
+ Reference<XComponent> xComponent (mxBackgroundPolygon1, UNO_QUERY);
+ mxBackgroundPolygon1 = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ if (mxBackgroundPolygon2.is())
+ {
+ Reference<XComponent> xComponent (mxBackgroundPolygon2, UNO_QUERY);
+ mxBackgroundPolygon2 = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ mxComponentContext = nullptr;
+ mpPresenterController = nullptr;
+ mxViewId = nullptr;
+ mxController = nullptr;
+ mxCanvas = nullptr;
+ mpBackground.reset();
+ msClickToExitPresentationText.clear();
+ msClickToExitPresentationTitle.clear();
+ msTitleTemplate.clear();
+ mxCurrentSlide = nullptr;
+}
+
+//----- XDrawView -------------------------------------------------------------
+
+void SAL_CALL PresenterSlideShowView::setCurrentPage (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxSlide)
+{
+ mxCurrentSlide = rxSlide;
+ if (mpPresenterController
+ && mxSlideShowController.is()
+ && ! mpPresenterController->GetCurrentSlide().is()
+ && ! mxSlideShowController->isPaused())
+ {
+ mbIsEndSlideVisible = true;
+ Reference<awt::XWindowPeer> xPeer (mxViewWindow, UNO_QUERY);
+ if (xPeer.is())
+ xPeer->invalidate(awt::InvalidateStyle::NOTRANSPARENT);
+
+ // For the end slide we use a special title, without the (n of m)
+ // part. Save the title template for the case that the user goes
+ // backwards.
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
+ mpPresenterController->GetPaneContainer()->FindViewURL(mxViewId->getResourceURL()));
+ if (pDescriptor)
+ {
+ msTitleTemplate = pDescriptor->msTitleTemplate;
+ pDescriptor->msTitleTemplate = msClickToExitPresentationTitle;
+ mpPresenterController->UpdatePaneTitles();
+ }
+ }
+ else if (mbIsEndSlideVisible)
+ {
+ mbIsEndSlideVisible = false;
+
+ // Restore the title template.
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
+ mpPresenterController->GetPaneContainer()->FindViewURL(mxViewId->getResourceURL()));
+ if (pDescriptor)
+ {
+ pDescriptor->msTitleTemplate = msTitleTemplate;
+ pDescriptor->msTitle.clear();
+ mpPresenterController->UpdatePaneTitles();
+ }
+ }
+}
+
+css::uno::Reference<css::drawing::XDrawPage> SAL_CALL PresenterSlideShowView::getCurrentPage()
+{
+ return mxCurrentSlide;
+}
+
+//----- CachablePresenterView -------------------------------------------------
+
+void PresenterSlideShowView::ReleaseView()
+{
+ if (mxSlideShow.is() && mbIsViewAdded)
+ {
+ mxSlideShow->removeView(this);
+ mbIsViewAdded = false;
+ }
+}
+
+//----- XSlideShowView --------------------------------------------------------
+
+Reference<rendering::XSpriteCanvas> SAL_CALL PresenterSlideShowView::getCanvas()
+{
+ ThrowIfDisposed();
+
+ return Reference<rendering::XSpriteCanvas>(mxViewCanvas, UNO_QUERY);
+}
+
+void SAL_CALL PresenterSlideShowView::clear()
+{
+ ThrowIfDisposed();
+ mbIsForcedPaintPending = false;
+ mbIsPaintPending = false;
+
+ if (!(mxViewCanvas.is() && mxViewWindow.is()))
+ return;
+
+ // Create a polygon for the window outline.
+ awt::Rectangle aViewWindowBox (mxViewWindow->getPosSize());
+ Reference<rendering::XPolyPolygon2D> xPolygon (PresenterGeometryHelper::CreatePolygon(
+ awt::Rectangle(0,0, aViewWindowBox.Width,aViewWindowBox.Height),
+ mxViewCanvas->getDevice()));
+
+ rendering::ViewState aViewState (
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr);
+ double const aColor[4] = {0,0,0,0};
+ rendering::RenderState aRenderState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr,
+ Sequence<double>(aColor,4),
+ rendering::CompositeOperation::SOURCE);
+ mxViewCanvas->fillPolyPolygon(xPolygon, aViewState, aRenderState);
+}
+
+geometry::AffineMatrix2D SAL_CALL PresenterSlideShowView::getTransformation()
+{
+ ThrowIfDisposed();
+
+ if (mxViewWindow.is())
+ {
+ // When the mbIsInModifyNotification is set then a slightly modified
+ // version of the transformation is returned in order to get past
+ // optimizations the avoid updates when the transformation is
+ // unchanged (when the window size changes then due to the constant
+ // aspect ratio the size of the preview may remain the same while
+ // the position changes. The position, however, is represented by
+ // the position of the view window. This transformation is given
+ // relative to the view window and therefore does not contain the
+ // position.)
+ const awt::Rectangle aWindowBox = mxViewWindow->getPosSize();
+ return geometry::AffineMatrix2D(
+ aWindowBox.Width-1, 0, 0,
+ 0, aWindowBox.Height-1, 0);
+ }
+ else
+ {
+ return geometry::AffineMatrix2D(1,0,0, 0,1,0);
+ }
+}
+
+geometry::IntegerSize2D SAL_CALL PresenterSlideShowView::getTranslationOffset()
+{
+ ThrowIfDisposed();
+ return geometry::IntegerSize2D(0,0);
+}
+
+void SAL_CALL PresenterSlideShowView::addTransformationChangedListener(
+ const Reference<util::XModifyListener>& rxListener)
+{
+ ThrowIfDisposed();
+ maBroadcaster.addListener(
+ cppu::UnoType<util::XModifyListener>::get(),
+ rxListener);
+}
+
+void SAL_CALL PresenterSlideShowView::removeTransformationChangedListener(
+ const Reference<util::XModifyListener>& rxListener)
+{
+ ThrowIfDisposed();
+ maBroadcaster.removeListener(
+ cppu::UnoType<util::XModifyListener>::get(),
+ rxListener);
+}
+
+void SAL_CALL PresenterSlideShowView::addPaintListener(
+ const Reference<awt::XPaintListener>& rxListener)
+{
+ ThrowIfDisposed();
+ maBroadcaster.addListener(
+ cppu::UnoType<awt::XPaintListener>::get(),
+ rxListener);
+}
+
+void SAL_CALL PresenterSlideShowView::removePaintListener(
+ const Reference<awt::XPaintListener>& rxListener)
+{
+ ThrowIfDisposed();
+ maBroadcaster.removeListener(
+ cppu::UnoType<awt::XPaintListener>::get(),
+ rxListener);
+}
+
+void SAL_CALL PresenterSlideShowView::addMouseListener(
+ const Reference<awt::XMouseListener>& rxListener)
+{
+ ThrowIfDisposed();
+ maBroadcaster.addListener(
+ cppu::UnoType<awt::XMouseListener>::get(),
+ rxListener);
+}
+
+void SAL_CALL PresenterSlideShowView::removeMouseListener(
+ const Reference<awt::XMouseListener>& rxListener)
+{
+ ThrowIfDisposed();
+ maBroadcaster.removeListener(
+ cppu::UnoType<awt::XMouseListener>::get(),
+ rxListener);
+}
+
+void SAL_CALL PresenterSlideShowView::addMouseMotionListener(
+ const Reference<awt::XMouseMotionListener>& rxListener)
+{
+ ThrowIfDisposed();
+ maBroadcaster.addListener(
+ cppu::UnoType<awt::XMouseMotionListener>::get(),
+ rxListener);
+}
+
+void SAL_CALL PresenterSlideShowView::removeMouseMotionListener(
+ const Reference<awt::XMouseMotionListener>& rxListener)
+{
+ ThrowIfDisposed();
+ maBroadcaster.removeListener(
+ cppu::UnoType<awt::XMouseMotionListener>::get(),
+ rxListener);
+}
+
+void SAL_CALL PresenterSlideShowView::setMouseCursor(::sal_Int16 nPointerShape)
+{
+ ThrowIfDisposed();
+
+ // Create a pointer when it does not yet exist.
+ if ( ! mxPointer.is())
+ {
+ mxPointer = awt::Pointer::create(mxComponentContext);
+ }
+
+ // Set the pointer to the given shape and the window(peer) to the
+ // pointer.
+ Reference<awt::XWindowPeer> xPeer (mxViewWindow, UNO_QUERY);
+ if (mxPointer.is() && xPeer.is())
+ {
+ mxPointer->setType(nPointerShape);
+ xPeer->setPointer(mxPointer);
+ }
+}
+
+awt::Rectangle SAL_CALL PresenterSlideShowView::getCanvasArea( )
+{
+ if( mxViewWindow.is() && mxTopPane.is() )
+ return mxPresenterHelper->getWindowExtentsRelative( mxViewWindow, mxTopPane->getWindow() );
+
+ awt::Rectangle aRectangle;
+
+ aRectangle.X = aRectangle.Y = aRectangle.Width = aRectangle.Height = 0;
+
+ return aRectangle;
+}
+
+//----- lang::XEventListener --------------------------------------------------
+
+void SAL_CALL PresenterSlideShowView::disposing (const lang::EventObject& rEvent)
+{
+ if (rEvent.Source == mxViewWindow)
+ mxViewWindow = nullptr;
+ else if (rEvent.Source == mxSlideShow)
+ mxSlideShow = nullptr;
+}
+
+//----- XPaintListener --------------------------------------------------------
+
+void SAL_CALL PresenterSlideShowView::windowPaint (const awt::PaintEvent& rEvent)
+{
+ // Deactivated views must not be painted.
+ if ( ! mbIsPresenterViewActive)
+ return;
+
+ awt::Rectangle aViewWindowBox (mxViewWindow->getPosSize());
+ if (aViewWindowBox.Width <= 0 || aViewWindowBox.Height <= 0)
+ return;
+
+ if (rEvent.Source == mxWindow)
+ PaintOuterWindow(rEvent.UpdateRect);
+ else if (mbIsEndSlideVisible)
+ PaintEndSlide(rEvent.UpdateRect);
+ else
+ PaintInnerWindow(rEvent);
+}
+
+//----- XMouseListener --------------------------------------------------------
+
+void SAL_CALL PresenterSlideShowView::mousePressed (const awt::MouseEvent& rEvent)
+{
+ awt::MouseEvent aEvent (rEvent);
+ aEvent.Source = static_cast<XWeak*>(this);
+ ::cppu::OInterfaceContainerHelper* pIterator
+ = maBroadcaster.getContainer(cppu::UnoType<awt::XMouseListener>::get());
+ if (pIterator != nullptr)
+ {
+ pIterator->notifyEach(&awt::XMouseListener::mousePressed, aEvent);
+ }
+
+ // Only when the end slide is displayed we forward the mouse event to
+ // the PresenterController so that it switches to the next slide and
+ // ends the presentation.
+ if (mbIsEndSlideVisible)
+ if (mpPresenterController)
+ mpPresenterController->HandleMouseClick(rEvent);
+}
+
+void SAL_CALL PresenterSlideShowView::mouseReleased (const awt::MouseEvent& rEvent)
+{
+ awt::MouseEvent aEvent (rEvent);
+ aEvent.Source = static_cast<XWeak*>(this);
+ ::cppu::OInterfaceContainerHelper* pIterator
+ = maBroadcaster.getContainer(cppu::UnoType<awt::XMouseListener>::get());
+ if (pIterator != nullptr)
+ {
+ pIterator->notifyEach(&awt::XMouseListener::mouseReleased, aEvent);
+ }
+}
+
+void SAL_CALL PresenterSlideShowView::mouseEntered (const awt::MouseEvent& rEvent)
+{
+ awt::MouseEvent aEvent (rEvent);
+ aEvent.Source = static_cast<XWeak*>(this);
+ ::cppu::OInterfaceContainerHelper* pIterator
+ = maBroadcaster.getContainer(cppu::UnoType<awt::XMouseListener>::get());
+ if (pIterator != nullptr)
+ {
+ pIterator->notifyEach(&awt::XMouseListener::mouseEntered, aEvent);
+ }
+}
+
+void SAL_CALL PresenterSlideShowView::mouseExited (const awt::MouseEvent& rEvent)
+{
+ awt::MouseEvent aEvent (rEvent);
+ aEvent.Source = static_cast<XWeak*>(this);
+ ::cppu::OInterfaceContainerHelper* pIterator
+ = maBroadcaster.getContainer(cppu::UnoType<awt::XMouseListener>::get());
+ if (pIterator != nullptr)
+ {
+ pIterator->notifyEach(&awt::XMouseListener::mouseExited, aEvent);
+ }
+}
+
+//----- XMouseMotionListener --------------------------------------------------
+
+void SAL_CALL PresenterSlideShowView::mouseDragged (const awt::MouseEvent& rEvent)
+{
+ awt::MouseEvent aEvent (rEvent);
+ aEvent.Source = static_cast<XWeak*>(this);
+ ::cppu::OInterfaceContainerHelper* pIterator
+ = maBroadcaster.getContainer(cppu::UnoType<awt::XMouseMotionListener>::get());
+ if (pIterator != nullptr)
+ {
+ pIterator->notifyEach(&awt::XMouseMotionListener::mouseDragged, aEvent);
+ }
+}
+
+void SAL_CALL PresenterSlideShowView::mouseMoved (const awt::MouseEvent& rEvent)
+{
+ awt::MouseEvent aEvent (rEvent);
+ aEvent.Source = static_cast<XWeak*>(this);
+ ::cppu::OInterfaceContainerHelper* pIterator
+ = maBroadcaster.getContainer(cppu::UnoType<awt::XMouseMotionListener>::get());
+ if (pIterator != nullptr)
+ {
+ pIterator->notifyEach(&awt::XMouseMotionListener::mouseMoved, aEvent);
+ }
+}
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL PresenterSlideShowView::windowResized (const awt::WindowEvent&)
+{
+ ThrowIfDisposed();
+ ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
+
+ Resize();
+}
+
+void SAL_CALL PresenterSlideShowView::windowMoved (const awt::WindowEvent&)
+{
+ if ( ! mbIsPaintPending)
+ mbIsForcedPaintPending = true;
+}
+
+void SAL_CALL PresenterSlideShowView::windowShown (const lang::EventObject&)
+{
+ Resize();
+}
+
+void SAL_CALL PresenterSlideShowView::windowHidden (const lang::EventObject&) {}
+
+//----- XView -----------------------------------------------------------------
+
+Reference<XResourceId> SAL_CALL PresenterSlideShowView::getResourceId()
+{
+ return mxViewId;
+}
+
+sal_Bool SAL_CALL PresenterSlideShowView::isAnchorOnly()
+{
+ return false;
+}
+
+//----- CachablePresenterView -------------------------------------------------
+
+void PresenterSlideShowView::ActivatePresenterView()
+{
+ if (mxSlideShow.is() && ! mbIsViewAdded)
+ {
+ impl_addAndConfigureView();
+ mbIsViewAdded = true;
+ }
+}
+
+void PresenterSlideShowView::DeactivatePresenterView()
+{
+ if (mxSlideShow.is() && mbIsViewAdded)
+ {
+ mxSlideShow->removeView(this);
+ mbIsViewAdded = false;
+ }
+}
+
+
+void PresenterSlideShowView::PaintOuterWindow (const awt::Rectangle& rRepaintBox)
+{
+ if ( ! mxCanvas.is())
+ return;
+
+ if (!mpBackground)
+ return;
+
+ const rendering::ViewState aViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ PresenterGeometryHelper::CreatePolygon(rRepaintBox, mxCanvas->getDevice()));
+
+ rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+
+ Reference<rendering::XBitmap> xBackgroundBitmap (mpBackground->GetNormalBitmap());
+ if (xBackgroundBitmap.is())
+ {
+ const geometry::IntegerSize2D aBitmapSize(xBackgroundBitmap->getSize());
+ Sequence<rendering::Texture> aTextures
+ {
+ {
+ geometry::AffineMatrix2D( aBitmapSize.Width,0,0, 0,aBitmapSize.Height,0),
+ 1,
+ 0,
+ xBackgroundBitmap,
+ nullptr,
+ nullptr,
+ rendering::StrokeAttributes(),
+ rendering::TexturingMode::REPEAT,
+ rendering::TexturingMode::REPEAT
+ }
+ };
+
+ if (mxBackgroundPolygon1.is())
+ mxCanvas->fillTexturedPolyPolygon(
+ mxBackgroundPolygon1,
+ aViewState,
+ aRenderState,
+ aTextures);
+ if (mxBackgroundPolygon2.is())
+ mxCanvas->fillTexturedPolyPolygon(
+ mxBackgroundPolygon2,
+ aViewState,
+ aRenderState,
+ aTextures);
+ }
+ else
+ {
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, mpBackground->maReplacementColor);
+
+ if (mxBackgroundPolygon1.is())
+ mxCanvas->fillPolyPolygon(mxBackgroundPolygon1, aViewState, aRenderState);
+ if (mxBackgroundPolygon2.is())
+ mxCanvas->fillPolyPolygon(mxBackgroundPolygon2, aViewState, aRenderState);
+ }
+}
+
+void PresenterSlideShowView::PaintEndSlide (const awt::Rectangle& rRepaintBox)
+{
+ if ( ! mxCanvas.is())
+ return;
+
+ const rendering::ViewState aViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ PresenterGeometryHelper::CreatePolygon(rRepaintBox, mxCanvas->getDevice()));
+
+ rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, util::Color(0x00000000));
+ mxCanvas->fillPolyPolygon(
+ PresenterGeometryHelper::CreatePolygon(mxViewWindow->getPosSize(), mxCanvas->getDevice()),
+ aViewState,
+ aRenderState);
+
+ do
+ {
+ if (!mpPresenterController)
+ break;
+ std::shared_ptr<PresenterTheme> pTheme (mpPresenterController->GetTheme());
+ if (pTheme == nullptr)
+ break;
+
+ const OUString sViewStyle (pTheme->GetStyleName(mxViewId->getResourceURL()));
+ PresenterTheme::SharedFontDescriptor pFont (pTheme->GetFont(sViewStyle));
+ if (!pFont)
+ break;
+
+ /// this is responsible of the " presentation exit " text inside the slide windows
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, util::Color(0x00ffffff));
+ aRenderState.AffineTransform.m02 = 20;
+ aRenderState.AffineTransform.m12 = 40;
+ const rendering::StringContext aContext (
+ msClickToExitPresentationText, 0, msClickToExitPresentationText.getLength());
+ pFont->PrepareFont(mxCanvas);
+ const Reference<rendering::XTextLayout> xLayout (
+ pFont->mxFont->createTextLayout(aContext,rendering::TextDirection::WEAK_LEFT_TO_RIGHT,0));
+ mxCanvas->drawTextLayout(
+ xLayout,
+ aViewState,
+ aRenderState);
+ }
+ while (false);
+
+ // Finally, in double buffered environments, request the changes to be
+ // made visible.
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ xSpriteCanvas->updateScreen(true);
+}
+
+void PresenterSlideShowView::PaintInnerWindow (const awt::PaintEvent& rEvent)
+{
+ // Forward window paint to listeners.
+ awt::PaintEvent aEvent (rEvent);
+ aEvent.Source = static_cast<XWeak*>(this);
+ ::cppu::OInterfaceContainerHelper* pIterator
+ = maBroadcaster.getContainer(cppu::UnoType<awt::XPaintListener>::get());
+ if (pIterator != nullptr)
+ {
+ pIterator->notifyEach(&awt::XPaintListener::windowPaint, aEvent);
+ }
+
+ /** The slide show relies on the back buffer of the canvas not being
+ modified. With a shared canvas there are times when that can not be
+ guaranteed.
+ */
+ if (mbIsForcedPaintPending && mxSlideShow.is() && mbIsViewAdded)
+ {
+ mxSlideShow->removeView(this);
+ impl_addAndConfigureView();
+ }
+
+ // Finally, in double buffered environments, request the changes to be
+ // made visible.
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ xSpriteCanvas->updateScreen(true);
+}
+
+Reference<awt::XWindow> PresenterSlideShowView::CreateViewWindow (
+ const Reference<awt::XWindow>& rxParentWindow) const
+{
+ Reference<awt::XWindow> xViewWindow;
+ try
+ {
+ Reference<lang::XMultiComponentFactory> xFactory (mxComponentContext->getServiceManager());
+ if ( ! xFactory.is())
+ return xViewWindow;
+
+ Reference<awt::XToolkit2> xToolkit = awt::Toolkit::create(mxComponentContext);
+ awt::WindowDescriptor aWindowDescriptor (
+ awt::WindowClass_CONTAINER,
+ OUString(),
+ Reference<awt::XWindowPeer>(rxParentWindow,UNO_QUERY_THROW),
+ -1, // parent index not available
+ awt::Rectangle(0,0,10,10),
+ awt::WindowAttribute::SIZEABLE
+ | awt::WindowAttribute::MOVEABLE
+ | awt::WindowAttribute::NODECORATION);
+ xViewWindow.set( xToolkit->createWindow(aWindowDescriptor),UNO_QUERY_THROW);
+
+ // Make the background transparent. The slide show paints its own background.
+ Reference<awt::XWindowPeer> xPeer (xViewWindow, UNO_QUERY_THROW);
+ xPeer->setBackground(0xff000000);
+
+ xViewWindow->setVisible(true);
+ }
+ catch (RuntimeException&)
+ {
+ }
+ return xViewWindow;
+}
+
+Reference<rendering::XCanvas> PresenterSlideShowView::CreateViewCanvas (
+ const Reference<awt::XWindow>& rxViewWindow) const
+{
+ // Create a canvas for the view window.
+ return mxPresenterHelper->createSharedCanvas(
+ Reference<rendering::XSpriteCanvas>(mxTopPane->getCanvas(), UNO_QUERY),
+ mxTopPane->getWindow(),
+ mxTopPane->getCanvas(),
+ mxTopPane->getWindow(),
+ rxViewWindow);
+}
+
+void PresenterSlideShowView::Resize()
+{
+ if ( ! mxWindow.is() || ! mxViewWindow.is())
+ return;
+
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ if (aWindowBox.Height > 0)
+ {
+ awt::Rectangle aViewWindowBox;
+ const double nWindowAspectRatio (
+ double(aWindowBox.Width) / double(aWindowBox.Height));
+ if (nWindowAspectRatio > mnPageAspectRatio)
+ {
+ // Slides will be painted with the full parent window height.
+ aViewWindowBox.Width = sal_Int32(aWindowBox.Height * mnPageAspectRatio + 0.5);
+ aViewWindowBox.Height = aWindowBox.Height;
+ aViewWindowBox.X = (aWindowBox.Width - aViewWindowBox.Width) / 2;
+ aViewWindowBox.Y = 0;
+ }
+ else
+ {
+ // Slides will be painted with the full parent window width.
+ aViewWindowBox.Width = aWindowBox.Width;
+ aViewWindowBox.Height = sal_Int32(aWindowBox.Width / mnPageAspectRatio + 0.5);
+ aViewWindowBox.X = 0;
+ aViewWindowBox.Y = (aWindowBox.Height - aViewWindowBox.Height) / 2;
+ }
+ mxViewWindow->setPosSize(
+ aViewWindowBox.X,
+ aViewWindowBox.Y,
+ aViewWindowBox.Width,
+ aViewWindowBox.Height,
+ awt::PosSize::POSSIZE);
+ }
+
+ // Clear the background polygon so that on the next paint it is created
+ // for the new size.
+ CreateBackgroundPolygons();
+
+ // Notify listeners that the transformation that maps the view into the
+ // window has changed.
+ lang::EventObject aEvent (static_cast<XWeak*>(this));
+ ::cppu::OInterfaceContainerHelper* pIterator
+ = maBroadcaster.getContainer(cppu::UnoType<util::XModifyListener>::get());
+ if (pIterator != nullptr)
+ {
+ pIterator->notifyEach(&util::XModifyListener::modified, aEvent);
+ }
+
+ // Due to constant aspect ratio resizing may lead a preview that changes
+ // its position but not its size. This invalidates the back buffer and
+ // we have to enforce a complete repaint.
+ if ( ! mbIsPaintPending)
+ mbIsForcedPaintPending = true;
+}
+
+void PresenterSlideShowView::CreateBackgroundPolygons()
+{
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ const awt::Rectangle aViewWindowBox (mxViewWindow->getPosSize());
+ if (aWindowBox.Height == aViewWindowBox.Height && aWindowBox.Width == aViewWindowBox.Width)
+ {
+ mxBackgroundPolygon1 = nullptr;
+ mxBackgroundPolygon2 = nullptr;
+ }
+ else if (aWindowBox.Height == aViewWindowBox.Height)
+ {
+ // Paint two boxes to the left and right of the view window.
+ mxBackgroundPolygon1 = PresenterGeometryHelper::CreatePolygon(
+ awt::Rectangle(
+ 0,
+ 0,
+ aViewWindowBox.X,
+ aWindowBox.Height),
+ mxCanvas->getDevice());
+ mxBackgroundPolygon2 = PresenterGeometryHelper::CreatePolygon(
+ awt::Rectangle(
+ aViewWindowBox.X + aViewWindowBox.Width,
+ 0,
+ aWindowBox.Width - aViewWindowBox.X - aViewWindowBox.Width,
+ aWindowBox.Height),
+ mxCanvas->getDevice());
+ }
+ else
+ {
+ // Paint two boxes above and below the view window.
+ mxBackgroundPolygon1 = PresenterGeometryHelper::CreatePolygon(
+ awt::Rectangle(
+ 0,
+ 0,
+ aWindowBox.Width,
+ aViewWindowBox.Y),
+ mxCanvas->getDevice());
+ mxBackgroundPolygon2 = PresenterGeometryHelper::CreatePolygon(
+ awt::Rectangle(
+ 0,
+ aViewWindowBox.Y + aViewWindowBox.Height,
+ aWindowBox.Width,
+ aWindowBox.Height - aViewWindowBox.Y - aViewWindowBox.Height),
+ mxCanvas->getDevice());
+ }
+}
+
+void PresenterSlideShowView::ThrowIfDisposed()
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterSlideShowView object has already been disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+void PresenterSlideShowView::impl_addAndConfigureView()
+{
+ Reference<presentation::XSlideShowView> xView (this);
+ mxSlideShow->addView(xView);
+ // Prevent embedded sounds being played twice at the same time by
+ // disabling sound for the new slide show view.
+ beans::PropertyValue aProperty;
+ aProperty.Name = "IsSoundEnabled";
+ Sequence<Any> aValues{ Any(xView), Any(false) };
+ aProperty.Value <<= aValues;
+ mxSlideShow->setProperty(aProperty);
+}
+
+} // end of namespace ::sd::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterSlideShowView.hxx b/sdext/source/presenter/PresenterSlideShowView.hxx
new file mode 100644
index 000000000..d009888f9
--- /dev/null
+++ b/sdext/source/presenter/PresenterSlideShowView.hxx
@@ -0,0 +1,241 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERSLIDESHOWVIEW_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSLIDESHOWVIEW_HXX
+
+#include "PresenterViewFactory.hxx"
+#include <com/sun/star/presentation/XSlideShowView.hpp>
+#include <com/sun/star/awt/XPaintListener.hpp>
+#include <com/sun/star/awt/XMouseListener.hpp>
+#include <com/sun/star/awt/XMouseMotionListener.hpp>
+#include <com/sun/star/awt/XPointer.hpp>
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/drawing/framework/XResourceId.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/presentation/XSlideShowController.hpp>
+#include <com/sun/star/rendering/XPolyPolygon2D.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+
+namespace sdext::presenter {
+
+typedef cppu::WeakComponentImplHelper<
+ css::presentation::XSlideShowView,
+ css::awt::XPaintListener,
+ css::awt::XMouseListener,
+ css::awt::XMouseMotionListener,
+ css::awt::XWindowListener,
+ css::drawing::framework::XView,
+ css::drawing::XDrawView
+ > PresenterSlideShowViewInterfaceBase;
+
+/** Life view in a secondary window of a full screen slide show.
+*/
+class PresenterSlideShowView
+ : protected ::cppu::BaseMutex,
+ public PresenterSlideShowViewInterfaceBase,
+ public CachablePresenterView
+{
+public:
+ PresenterSlideShowView (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ virtual ~PresenterSlideShowView() override;
+ PresenterSlideShowView(const PresenterSlideShowView&) = delete;
+ PresenterSlideShowView& operator=(const PresenterSlideShowView&) = delete;
+
+ void LateInit();
+ virtual void SAL_CALL disposing() override;
+
+ // CachablePresenterView
+
+ virtual void ReleaseView() override;
+
+ // XSlideShowView
+
+ virtual css::uno::Reference<
+ css::rendering::XSpriteCanvas > SAL_CALL getCanvas() override;
+
+ virtual void SAL_CALL clear() override;
+
+ virtual css::geometry::AffineMatrix2D SAL_CALL getTransformation() override;
+
+ virtual css::geometry::IntegerSize2D SAL_CALL getTranslationOffset() override;
+
+ virtual void SAL_CALL addTransformationChangedListener(
+ const css::uno::Reference<
+ css::util::XModifyListener >& xListener) override;
+
+ virtual void SAL_CALL removeTransformationChangedListener(
+ const css::uno::Reference<
+ css::util::XModifyListener >& xListener) override;
+
+ virtual void SAL_CALL addPaintListener(
+ const css::uno::Reference<
+ css::awt::XPaintListener >& xListener) override;
+
+ virtual void SAL_CALL removePaintListener(
+ const css::uno::Reference<
+ css::awt::XPaintListener >& xListener) override;
+
+ virtual void SAL_CALL addMouseListener(
+ const css::uno::Reference<
+ css::awt::XMouseListener >& xListener) override;
+
+ virtual void SAL_CALL removeMouseListener(
+ const css::uno::Reference<
+ css::awt::XMouseListener >& xListener) override;
+
+ virtual void SAL_CALL addMouseMotionListener(
+ const css::uno::Reference<
+ css::awt::XMouseMotionListener >& xListener) override;
+
+ virtual void SAL_CALL removeMouseMotionListener(
+ const css::uno::Reference<
+ css::awt::XMouseMotionListener >& xListener) override;
+
+ virtual void SAL_CALL setMouseCursor(::sal_Int16 nPointerShape) override;
+
+ virtual css::awt::Rectangle SAL_CALL getCanvasArea( ) override;
+
+ // lang::XEventListener
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+
+ // XPaintListener
+ virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override;
+
+ // XMouseListener
+ virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) override;
+
+ // XMouseMotionListener
+
+ virtual void SAL_CALL mouseDragged (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseMoved (const css::awt::MouseEvent& rEvent) override;
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override;
+
+ // XView
+
+ virtual css::uno::Reference<css::drawing::framework::XResourceId> SAL_CALL
+ getResourceId() override;
+
+ virtual sal_Bool SAL_CALL isAnchorOnly() override;
+
+ // XDrawView
+
+ virtual void SAL_CALL setCurrentPage (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxSlide) override;
+
+ virtual css::uno::Reference<css::drawing::XDrawPage> SAL_CALL getCurrentPage() override;
+
+ // CachablePresenterView
+
+ virtual void ActivatePresenterView() override;
+
+ virtual void DeactivatePresenterView() override;
+
+private:
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ css::uno::Reference<css::drawing::framework::XResourceId> mxViewId;
+ css::uno::Reference<css::frame::XController> mxController;
+ css::uno::Reference<css::presentation::XSlideShowController> mxSlideShowController;
+ css::uno::Reference<css::presentation::XSlideShow> mxSlideShow;
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+ css::uno::Reference<css::rendering::XCanvas> mxViewCanvas;
+ css::uno::Reference<css::awt::XPointer> mxPointer;
+ css::uno::Reference<css::awt::XWindow> mxWindow;
+ css::uno::Reference<css::awt::XWindow> mxViewWindow;
+ css::uno::Reference<css::drawing::framework::XPane> mxTopPane;
+ css::uno::Reference<css::drawing::XPresenterHelper> mxPresenterHelper;
+ css::uno::Reference<css::rendering::XPolyPolygon2D> mxBackgroundPolygon1;
+ css::uno::Reference<css::rendering::XPolyPolygon2D> mxBackgroundPolygon2;
+ bool mbIsViewAdded;
+
+ /** Aspect ratio of the current slide.
+ */
+ double mnPageAspectRatio;
+
+ /** This broadcast helper is used to notify listeners registered to a
+ SlideShowView object.
+ */
+ ::cppu::OBroadcastHelper maBroadcaster;
+
+ SharedBitmapDescriptor mpBackground;
+
+ bool mbIsForcedPaintPending;
+ bool mbIsPaintPending;
+ OUString msClickToExitPresentationText;
+ OUString msClickToExitPresentationTitle;
+ OUString msTitleTemplate;
+ bool mbIsEndSlideVisible;
+ css::uno::Reference<css::drawing::XDrawPage> mxCurrentSlide;
+
+ /** Create the window into which the slide show will render its
+ content. This window has the correct aspect ratio and is displayed centered
+ and as large as possible in its parent window.
+ */
+ css::uno::Reference<css::awt::XWindow> CreateViewWindow (
+ const css::uno::Reference<css::awt::XWindow>& rxParentWindow) const;
+ css::uno::Reference<css::rendering::XCanvas> CreateViewCanvas (
+ const css::uno::Reference<css::awt::XWindow>& rxWindow) const;
+
+ void Resize();
+
+ void PaintOuterWindow (const css::awt::Rectangle& rRepaintBox);
+ void PaintInnerWindow (const css::awt::PaintEvent& rEvent);
+ void PaintEndSlide (const css::awt::Rectangle& rRepaintBox);
+
+ void CreateBackgroundPolygons();
+
+ /** @throws css::lang::DisposedException when the object has already been
+ disposed.
+ */
+ void ThrowIfDisposed();
+
+ void impl_addAndConfigureView();
+};
+
+} // end of namespace ::sd::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterSlideSorter.cxx b/sdext/source/presenter/PresenterSlideSorter.cxx
new file mode 100644
index 000000000..f89061ef6
--- /dev/null
+++ b/sdext/source/presenter/PresenterSlideSorter.cxx
@@ -0,0 +1,1929 @@
+/* -*- 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 <vcl/settings.hxx>
+
+#include "PresenterSlideSorter.hxx"
+#include "PresenterButton.hxx"
+#include "PresenterCanvasHelper.hxx"
+#include "PresenterGeometryHelper.hxx"
+#include "PresenterPaintManager.hxx"
+#include "PresenterPaneBase.hxx"
+#include "PresenterScrollBar.hxx"
+#include "PresenterUIPainter.hxx"
+#include "PresenterWindowManager.hxx"
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/rendering/XBitmapCanvas.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <com/sun/star/rendering/TextDirection.hpp>
+#include <algorithm>
+#include <math.h>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace {
+ const sal_Int32 gnVerticalGap (10);
+ const sal_Int32 gnVerticalBorder (10);
+ const sal_Int32 gnHorizontalGap (10);
+ const sal_Int32 gnHorizontalBorder (10);
+
+ const double gnMinimalPreviewWidth (200);
+ const double gnPreferredPreviewWidth (300);
+ const double gnMaximalPreviewWidth (400);
+ const sal_Int32 gnPreferredColumnCount (6);
+ const double gnMinimalHorizontalPreviewGap(15);
+ const double gnPreferredHorizontalPreviewGap(25);
+ const double gnMaximalHorizontalPreviewGap(50);
+ const double gnPreferredVerticalPreviewGap(25);
+
+ const sal_Int32 gnHorizontalLabelBorder (3);
+ const sal_Int32 gnHorizontalLabelPadding (5);
+
+ const sal_Int32 gnVerticalButtonPadding (gnVerticalGap);
+}
+
+namespace sdext::presenter {
+
+namespace {
+ sal_Int32 round (const double nValue) { return sal::static_int_cast<sal_Int32>(0.5 + nValue); }
+ sal_Int32 floor (const double nValue) { return sal::static_int_cast<sal_Int32>(nValue); }
+}
+
+//===== PresenterSlideSorter::Layout ==========================================
+
+class PresenterSlideSorter::Layout
+{
+public:
+ explicit Layout (const ::rtl::Reference<PresenterScrollBar>& rpVerticalScrollBar);
+
+ void Update (const geometry::RealRectangle2D& rBoundingBox, const double nSlideAspectRatio);
+ void SetupVisibleArea();
+ void UpdateScrollBars();
+ bool IsScrollBarNeeded (const sal_Int32 nSlideCount);
+ geometry::RealPoint2D GetLocalPosition (const geometry::RealPoint2D& rWindowPoint) const;
+ geometry::RealPoint2D GetWindowPosition(const geometry::RealPoint2D& rLocalPoint) const;
+ sal_Int32 GetColumn (const geometry::RealPoint2D& rLocalPoint) const;
+ sal_Int32 GetRow (const geometry::RealPoint2D& rLocalPoint,
+ const bool bReturnInvalidValue = false) const;
+ sal_Int32 GetSlideIndexForPosition (const css::geometry::RealPoint2D& rPoint) const;
+ css::geometry::RealPoint2D GetPoint (
+ const sal_Int32 nSlideIndex,
+ const sal_Int32 nRelativeHorizontalPosition,
+ const sal_Int32 nRelativeVerticalPosition) const;
+ css::awt::Rectangle GetBoundingBox (const sal_Int32 nSlideIndex) const;
+ void ForAllVisibleSlides (const ::std::function<void (sal_Int32)>& rAction);
+ sal_Int32 GetFirstVisibleSlideIndex() const;
+ sal_Int32 GetLastVisibleSlideIndex() const;
+ bool SetHorizontalOffset (const double nOffset);
+ bool SetVerticalOffset (const double nOffset);
+
+ css::geometry::RealRectangle2D maBoundingBox;
+ css::geometry::IntegerSize2D maPreviewSize;
+ sal_Int32 mnHorizontalOffset;
+ sal_Int32 mnVerticalOffset;
+ sal_Int32 mnHorizontalGap;
+ sal_Int32 mnVerticalGap;
+ sal_Int32 mnHorizontalBorder;
+ sal_Int32 mnVerticalBorder;
+ sal_Int32 mnRowCount;
+ sal_Int32 mnColumnCount;
+ sal_Int32 mnSlideCount;
+ sal_Int32 mnFirstVisibleColumn;
+ sal_Int32 mnLastVisibleColumn;
+ sal_Int32 mnFirstVisibleRow;
+ sal_Int32 mnLastVisibleRow;
+
+private:
+ ::rtl::Reference<PresenterScrollBar> mpVerticalScrollBar;
+
+ sal_Int32 GetIndex (const sal_Int32 nRow, const sal_Int32 nColumn) const;
+ sal_Int32 GetRow (const sal_Int32 nSlideIndex) const;
+ sal_Int32 GetColumn (const sal_Int32 nSlideIndex) const;
+};
+
+//==== PresenterSlideSorter::MouseOverManager =================================
+
+class PresenterSlideSorter::MouseOverManager
+{
+public:
+ MouseOverManager (
+ const Reference<container::XIndexAccess>& rxSlides,
+ const std::shared_ptr<PresenterTheme>& rpTheme,
+ const Reference<awt::XWindow>& rxInvalidateTarget,
+ const std::shared_ptr<PresenterPaintManager>& rpPaintManager);
+ MouseOverManager(const MouseOverManager&) = delete;
+ MouseOverManager& operator=(const MouseOverManager&) = delete;
+
+ void Paint (
+ const sal_Int32 nSlideIndex,
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const Reference<rendering::XPolyPolygon2D>& rxClip);
+
+ void SetSlide (
+ const sal_Int32 nSlideIndex,
+ const awt::Rectangle& rBox);
+
+private:
+ Reference<rendering::XCanvas> mxCanvas;
+ const Reference<container::XIndexAccess> mxSlides;
+ SharedBitmapDescriptor mpLeftLabelBitmap;
+ SharedBitmapDescriptor mpCenterLabelBitmap;
+ SharedBitmapDescriptor mpRightLabelBitmap;
+ PresenterTheme::SharedFontDescriptor mpFont;
+ sal_Int32 mnSlideIndex;
+ awt::Rectangle maSlideBoundingBox;
+ OUString msText;
+ Reference<rendering::XBitmap> mxBitmap;
+ Reference<awt::XWindow> mxInvalidateTarget;
+ std::shared_ptr<PresenterPaintManager> mpPaintManager;
+
+ void SetCanvas (
+ const Reference<rendering::XCanvas>& rxCanvas);
+ /** Create a bitmap that shows the given text and is not wider than the
+ given maximal width.
+ */
+ Reference<rendering::XBitmap> CreateBitmap (
+ const OUString& rsText,
+ const sal_Int32 nMaximalWidth) const;
+ void Invalidate();
+ geometry::IntegerSize2D CalculateLabelSize (
+ const OUString& rsText) const;
+ OUString GetFittingText (const OUString& rsText, const double nMaximalWidth) const;
+ void PaintButtonBackground (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const geometry::IntegerSize2D& rSize) const;
+};
+
+//==== PresenterSlideSorter::CurrentSlideFrameRenderer ========================
+
+class PresenterSlideSorter::CurrentSlideFrameRenderer
+{
+public:
+ CurrentSlideFrameRenderer (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas);
+
+ void PaintCurrentSlideFrame (
+ const awt::Rectangle& rSlideBoundingBox,
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const geometry::RealRectangle2D& rClipBox);
+
+ /** Enlarge the given rectangle to include the current slide indicator.
+ */
+ awt::Rectangle GetBoundingBox (
+ const awt::Rectangle& rSlideBoundingBox);
+
+private:
+ SharedBitmapDescriptor mpTopLeft;
+ SharedBitmapDescriptor mpTop;
+ SharedBitmapDescriptor mpTopRight;
+ SharedBitmapDescriptor mpLeft;
+ SharedBitmapDescriptor mpRight;
+ SharedBitmapDescriptor mpBottomLeft;
+ SharedBitmapDescriptor mpBottom;
+ SharedBitmapDescriptor mpBottomRight;
+ sal_Int32 mnTopFrameSize;
+ sal_Int32 mnLeftFrameSize;
+ sal_Int32 mnRightFrameSize;
+ sal_Int32 mnBottomFrameSize;
+
+ static void PaintBitmapOnce(
+ const css::uno::Reference<css::rendering::XBitmap>& rxBitmap,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const Reference<rendering::XPolyPolygon2D>& rxClip,
+ const double nX,
+ const double nY);
+ static void PaintBitmapTiled(
+ const css::uno::Reference<css::rendering::XBitmap>& rxBitmap,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const geometry::RealRectangle2D& rClipBox,
+ const double nX,
+ const double nY,
+ const double nWidth,
+ const double nHeight);
+};
+
+//===== PresenterSlideSorter ==================================================
+
+PresenterSlideSorter::PresenterSlideSorter (
+ const Reference<uno::XComponentContext>& rxContext,
+ const Reference<XResourceId>& rxViewId,
+ const Reference<frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterSlideSorterInterfaceBase(m_aMutex),
+ mxComponentContext(rxContext),
+ mxViewId(rxViewId),
+ mpPresenterController(rpPresenterController),
+ mxSlideShowController(mpPresenterController->GetSlideShowController()),
+ mbIsLayoutPending(true),
+ mnSlideIndexMousePressed(-1),
+ mnCurrentSlideIndex(-1),
+ mnSeparatorY(0),
+ maSeparatorColor(0x00ffffff)
+{
+ if ( ! rxContext.is()
+ || ! rxViewId.is()
+ || ! rxController.is()
+ || ! rpPresenterController)
+ {
+ throw lang::IllegalArgumentException();
+ }
+
+ if ( ! mxSlideShowController.is())
+ throw RuntimeException();
+
+ try
+ {
+ // Get pane and window.
+ Reference<XControllerManager> xCM (rxController, UNO_QUERY_THROW);
+ Reference<XConfigurationController> xCC (
+ xCM->getConfigurationController(), UNO_SET_THROW);
+ Reference<lang::XMultiComponentFactory> xFactory (
+ mxComponentContext->getServiceManager(), UNO_SET_THROW);
+
+ mxPane.set(xCC->getResource(rxViewId->getAnchor()), UNO_QUERY_THROW);
+ mxWindow = mxPane->getWindow();
+
+ // Add window listener.
+ mxWindow->addWindowListener(this);
+ mxWindow->addPaintListener(this);
+ mxWindow->addMouseListener(this);
+ mxWindow->addMouseMotionListener(this);
+ mxWindow->setVisible(true);
+
+ // Remember the current slide.
+ mnCurrentSlideIndex = mxSlideShowController->getCurrentSlideIndex();
+
+ // Create the scroll bar.
+ mpVerticalScrollBar.set(
+ new PresenterVerticalScrollBar(
+ rxContext,
+ mxWindow,
+ mpPresenterController->GetPaintManager(),
+ [this] (double const offset) { return this->SetVerticalOffset(offset); }));
+
+ mpCloseButton = PresenterButton::Create(
+ rxContext,
+ mpPresenterController,
+ mpPresenterController->GetTheme(),
+ mxWindow,
+ mxCanvas,
+ "SlideSorterCloser");
+
+ if (mpPresenterController->GetTheme() != nullptr)
+ {
+ PresenterTheme::SharedFontDescriptor pFont (
+ mpPresenterController->GetTheme()->GetFont("ButtonFont"));
+ if (pFont)
+ maSeparatorColor = pFont->mnColor;
+ }
+
+ // Create the layout.
+ mpLayout = std::make_shared<Layout>(mpVerticalScrollBar);
+
+ // Create the preview cache.
+ mxPreviewCache.set(
+ xFactory->createInstanceWithContext(
+ "com.sun.star.drawing.PresenterPreviewCache",
+ mxComponentContext),
+ UNO_QUERY_THROW);
+ Reference<container::XIndexAccess> xSlides (mxSlideShowController, UNO_QUERY);
+ mxPreviewCache->setDocumentSlides(xSlides, rxController->getModel());
+ mxPreviewCache->addPreviewCreationNotifyListener(this);
+ if (xSlides.is())
+ {
+ mpLayout->mnSlideCount = xSlides->getCount();
+ }
+
+ // Create the mouse over manager.
+ mpMouseOverManager.reset(new MouseOverManager(
+ Reference<container::XIndexAccess>(mxSlideShowController, UNO_QUERY),
+ mpPresenterController->GetTheme(),
+ mxWindow,
+ mpPresenterController->GetPaintManager()));
+
+ // Listen for changes of the current slide.
+ Reference<beans::XPropertySet> xControllerProperties (rxController, UNO_QUERY_THROW);
+ xControllerProperties->addPropertyChangeListener(
+ "CurrentPage",
+ this);
+
+ // Move the current slide in the center of the window.
+ const awt::Rectangle aCurrentSlideBBox (mpLayout->GetBoundingBox(mnCurrentSlideIndex));
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ SetHorizontalOffset(aCurrentSlideBBox.X - aWindowBox.Width/2.0);
+ }
+ catch (RuntimeException&)
+ {
+ disposing();
+ throw;
+ }
+}
+
+PresenterSlideSorter::~PresenterSlideSorter()
+{
+}
+
+void SAL_CALL PresenterSlideSorter::disposing()
+{
+ mxComponentContext = nullptr;
+ mxViewId = nullptr;
+ mxPane = nullptr;
+
+ if (mpVerticalScrollBar.is())
+ {
+ Reference<lang::XComponent> xComponent = mpVerticalScrollBar;
+ mpVerticalScrollBar = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ if (mpCloseButton.is())
+ {
+ Reference<lang::XComponent> xComponent = mpCloseButton;
+ mpCloseButton = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ if (mxCanvas.is())
+ {
+ Reference<lang::XComponent> xComponent (mxCanvas, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->removeEventListener(static_cast<awt::XWindowListener*>(this));
+ mxCanvas = nullptr;
+ }
+ mpPresenterController = nullptr;
+ mxSlideShowController = nullptr;
+ mpLayout.reset();
+ mpMouseOverManager.reset();
+
+ if (mxPreviewCache.is())
+ {
+ mxPreviewCache->removePreviewCreationNotifyListener(this);
+
+ Reference<XComponent> xComponent (mxPreviewCache, UNO_QUERY);
+ mxPreviewCache = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+
+ if (mxWindow.is())
+ {
+ mxWindow->removeWindowListener(this);
+ mxWindow->removePaintListener(this);
+ mxWindow->removeMouseListener(this);
+ mxWindow->removeMouseMotionListener(this);
+ }
+}
+
+//----- lang::XEventListener --------------------------------------------------
+
+void SAL_CALL PresenterSlideSorter::disposing (const lang::EventObject& rEventObject)
+{
+ if (rEventObject.Source == mxWindow)
+ {
+ mxWindow = nullptr;
+ dispose();
+ }
+ else if (rEventObject.Source == mxPreviewCache)
+ {
+ mxPreviewCache = nullptr;
+ dispose();
+ }
+ else if (rEventObject.Source == mxCanvas)
+ {
+ mxCanvas = nullptr;
+ mbIsLayoutPending = true;
+
+ mpPresenterController->GetPaintManager()->Invalidate(mxWindow);
+ }
+}
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL PresenterSlideSorter::windowResized (const awt::WindowEvent&)
+{
+ ThrowIfDisposed();
+ mbIsLayoutPending = true;
+ mpPresenterController->GetPaintManager()->Invalidate(mxWindow);
+}
+
+void SAL_CALL PresenterSlideSorter::windowMoved (const awt::WindowEvent&)
+{
+ ThrowIfDisposed();
+}
+
+void SAL_CALL PresenterSlideSorter::windowShown (const lang::EventObject&)
+{
+ ThrowIfDisposed();
+ mbIsLayoutPending = true;
+ mpPresenterController->GetPaintManager()->Invalidate(mxWindow);
+}
+
+void SAL_CALL PresenterSlideSorter::windowHidden (const lang::EventObject&)
+{
+ ThrowIfDisposed();
+}
+
+//----- XPaintListener --------------------------------------------------------
+
+void SAL_CALL PresenterSlideSorter::windowPaint (const css::awt::PaintEvent& rEvent)
+{
+ // Deactivated views must not be painted.
+ if ( ! mbIsPresenterViewActive)
+ return;
+
+ Paint(rEvent.UpdateRect);
+
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ xSpriteCanvas->updateScreen(false);
+}
+
+//----- XMouseListener --------------------------------------------------------
+
+void SAL_CALL PresenterSlideSorter::mousePressed (const css::awt::MouseEvent& rEvent)
+{
+ css::awt::MouseEvent rTemp =rEvent;
+ /// check whether RTL interface or not
+ if(AllSettings::GetLayoutRTL()){
+ awt::Rectangle aBox = mxWindow->getPosSize();
+ rTemp.X=aBox.Width-rEvent.X;
+ }
+ const geometry::RealPoint2D aPosition(rTemp.X, rEvent.Y);
+ mnSlideIndexMousePressed = mpLayout->GetSlideIndexForPosition(aPosition);
+}
+
+void SAL_CALL PresenterSlideSorter::mouseReleased (const css::awt::MouseEvent& rEvent)
+{
+ css::awt::MouseEvent rTemp =rEvent;
+ /// check whether RTL interface or not
+ if(AllSettings::GetLayoutRTL()){
+ awt::Rectangle aBox = mxWindow->getPosSize();
+ rTemp.X=aBox.Width-rEvent.X;
+ }
+ const geometry::RealPoint2D aPosition(rTemp.X, rEvent.Y);
+ const sal_Int32 nSlideIndex (mpLayout->GetSlideIndexForPosition(aPosition));
+
+ if (nSlideIndex != mnSlideIndexMousePressed || mnSlideIndexMousePressed < 0)
+ return;
+
+ switch (rEvent.ClickCount)
+ {
+ case 1:
+ default:
+ GotoSlide(nSlideIndex);
+ break;
+
+ case 2:
+ OSL_ASSERT(mpPresenterController);
+ OSL_ASSERT(mpPresenterController->GetWindowManager());
+ mpPresenterController->GetWindowManager()->SetSlideSorterState(false);
+ GotoSlide(nSlideIndex);
+ break;
+ }
+}
+
+void SAL_CALL PresenterSlideSorter::mouseEntered (const css::awt::MouseEvent&) {}
+
+void SAL_CALL PresenterSlideSorter::mouseExited (const css::awt::MouseEvent&)
+{
+ mnSlideIndexMousePressed = -1;
+ if (mpMouseOverManager != nullptr)
+ mpMouseOverManager->SetSlide(mnSlideIndexMousePressed, awt::Rectangle(0,0,0,0));
+}
+
+//----- XMouseMotionListener --------------------------------------------------
+
+void SAL_CALL PresenterSlideSorter::mouseMoved (const css::awt::MouseEvent& rEvent)
+{
+ if (mpMouseOverManager == nullptr)
+ return;
+
+ css::awt::MouseEvent rTemp =rEvent;
+ /// check whether RTL interface or not
+ if(AllSettings::GetLayoutRTL()){
+ awt::Rectangle aBox = mxWindow->getPosSize();
+ rTemp.X=aBox.Width-rEvent.X;
+ }
+ const geometry::RealPoint2D aPosition(rTemp.X, rEvent.Y);
+ sal_Int32 nSlideIndex (mpLayout->GetSlideIndexForPosition(aPosition));
+
+ if (nSlideIndex < 0)
+ {
+ mnSlideIndexMousePressed = -1;
+ mpMouseOverManager->SetSlide(nSlideIndex, awt::Rectangle(0,0,0,0));
+ }
+ else
+ {
+ mpMouseOverManager->SetSlide(
+ nSlideIndex,
+ mpLayout->GetBoundingBox(nSlideIndex));
+ }
+}
+
+void SAL_CALL PresenterSlideSorter::mouseDragged (const css::awt::MouseEvent&) {}
+
+//----- XResourceId -----------------------------------------------------------
+
+Reference<XResourceId> SAL_CALL PresenterSlideSorter::getResourceId()
+{
+ ThrowIfDisposed();
+ return mxViewId;
+}
+
+sal_Bool SAL_CALL PresenterSlideSorter::isAnchorOnly()
+{
+ return false;
+}
+
+//----- XPropertyChangeListener -----------------------------------------------
+
+void SAL_CALL PresenterSlideSorter::propertyChange (
+ const css::beans::PropertyChangeEvent&)
+{}
+
+//----- XSlidePreviewCacheListener --------------------------------------------
+
+void SAL_CALL PresenterSlideSorter::notifyPreviewCreation (
+ sal_Int32 nSlideIndex)
+{
+ OSL_ASSERT(mpLayout != nullptr);
+
+ awt::Rectangle aBBox (mpLayout->GetBoundingBox(nSlideIndex));
+ mpPresenterController->GetPaintManager()->Invalidate(mxWindow, aBBox, true);
+}
+
+//----- XDrawView -------------------------------------------------------------
+
+void SAL_CALL PresenterSlideSorter::setCurrentPage (const Reference<drawing::XDrawPage>&)
+{
+ ThrowIfDisposed();
+ ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
+
+ if (!mxSlideShowController.is())
+ return;
+
+ const sal_Int32 nNewCurrentSlideIndex (mxSlideShowController->getCurrentSlideIndex());
+ if (nNewCurrentSlideIndex == mnCurrentSlideIndex)
+ return;
+
+ mnCurrentSlideIndex = nNewCurrentSlideIndex;
+
+ // Request a repaint of the previous current slide to hide its
+ // current slide indicator.
+ mpPresenterController->GetPaintManager()->Invalidate(
+ mxWindow,
+ maCurrentSlideFrameBoundingBox);
+
+ // Request a repaint of the new current slide to show its
+ // current slide indicator.
+ maCurrentSlideFrameBoundingBox = mpCurrentSlideFrameRenderer->GetBoundingBox(
+ mpLayout->GetBoundingBox(mnCurrentSlideIndex));
+ mpPresenterController->GetPaintManager()->Invalidate(
+ mxWindow,
+ maCurrentSlideFrameBoundingBox);
+}
+
+Reference<drawing::XDrawPage> SAL_CALL PresenterSlideSorter::getCurrentPage()
+{
+ ThrowIfDisposed();
+ return nullptr;
+}
+
+
+void PresenterSlideSorter::UpdateLayout()
+{
+ if ( ! mxWindow.is())
+ return;
+
+ mbIsLayoutPending = false;
+
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ sal_Int32 nLeftBorderWidth (aWindowBox.X);
+
+ // Get border width.
+ PresenterPaneContainer::SharedPaneDescriptor pPane (
+ mpPresenterController->GetPaneContainer()->FindViewURL(
+ mxViewId->getResourceURL()));
+ do
+ {
+ if (!pPane)
+ break;
+ if ( ! pPane->mxPane.is())
+ break;
+
+ Reference<drawing::framework::XPaneBorderPainter> xBorderPainter (
+ pPane->mxPane->GetPaneBorderPainter());
+ if ( ! xBorderPainter.is())
+ break;
+ xBorderPainter->addBorder (
+ mxViewId->getAnchor()->getResourceURL(),
+ awt::Rectangle(0, 0, aWindowBox.Width, aWindowBox.Height),
+ drawing::framework::BorderType_INNER_BORDER);
+ }
+ while(false);
+
+ // Place vertical separator.
+ mnSeparatorY = aWindowBox.Height - mpCloseButton->GetSize().Height - gnVerticalButtonPadding;
+
+ PlaceCloseButton(pPane, aWindowBox, nLeftBorderWidth);
+
+ geometry::RealRectangle2D aUpperBox(
+ gnHorizontalBorder,
+ gnVerticalBorder,
+ aWindowBox.Width - 2*gnHorizontalBorder,
+ mnSeparatorY - gnVerticalGap);
+
+ // Determine whether the scroll bar has to be displayed.
+ aUpperBox = PlaceScrollBars(aUpperBox);
+
+ mpLayout->Update(aUpperBox, GetSlideAspectRatio());
+ mpLayout->SetupVisibleArea();
+ mpLayout->UpdateScrollBars();
+
+ // Tell the preview cache about some of the values.
+ mxPreviewCache->setPreviewSize(mpLayout->maPreviewSize);
+ mxPreviewCache->setVisibleRange(
+ mpLayout->GetFirstVisibleSlideIndex(),
+ mpLayout->GetLastVisibleSlideIndex());
+
+ // Clear the frame polygon so that it is re-created on the next paint.
+ mxPreviewFrame = nullptr;
+}
+
+geometry::RealRectangle2D PresenterSlideSorter::PlaceScrollBars (
+ const geometry::RealRectangle2D& rUpperBox)
+{
+ mpLayout->Update(rUpperBox, GetSlideAspectRatio());
+ bool bIsScrollBarNeeded (false);
+ Reference<container::XIndexAccess> xSlides (mxSlideShowController, UNO_QUERY_THROW);
+ bIsScrollBarNeeded = mpLayout->IsScrollBarNeeded(xSlides->getCount());
+ if (mpVerticalScrollBar)
+ {
+ if (bIsScrollBarNeeded)
+ {
+ if(AllSettings::GetLayoutRTL())
+ {
+ mpVerticalScrollBar->SetPosSize(geometry::RealRectangle2D(
+ rUpperBox.X1,
+ rUpperBox.Y1,
+ rUpperBox.X1 + mpVerticalScrollBar->GetSize(),
+ rUpperBox.Y2));
+ mpVerticalScrollBar->SetVisible(true);
+ // Reduce area covered by the scroll bar from the available
+ // space.
+ return geometry::RealRectangle2D(
+ rUpperBox.X1 + gnHorizontalGap + mpVerticalScrollBar->GetSize(),
+ rUpperBox.Y1,
+ rUpperBox.X2,
+ rUpperBox.Y2);
+ }
+ else
+ {
+ // if it's not RTL place vertical scroll bar at right border.
+ mpVerticalScrollBar->SetPosSize(geometry::RealRectangle2D(
+ rUpperBox.X2 - mpVerticalScrollBar->GetSize(),
+ rUpperBox.Y1,
+ rUpperBox.X2,
+ rUpperBox.Y2));
+ mpVerticalScrollBar->SetVisible(true);
+ // Reduce area covered by the scroll bar from the available
+ // space.
+ return geometry::RealRectangle2D(
+ rUpperBox.X1,
+ rUpperBox.Y1,
+ rUpperBox.X2 - mpVerticalScrollBar->GetSize() - gnHorizontalGap,
+ rUpperBox.Y2);
+ }
+ }
+ else
+ mpVerticalScrollBar->SetVisible(false);
+ }
+ return rUpperBox;
+}
+
+void PresenterSlideSorter::PlaceCloseButton (
+ const PresenterPaneContainer::SharedPaneDescriptor& rpPane,
+ const awt::Rectangle& rCenterBox,
+ const sal_Int32 nLeftBorderWidth)
+{
+ // Place button. When the callout is near the center then the button is
+ // centered over the callout. Otherwise it is centered with respect to
+ // the whole window.
+ sal_Int32 nCloseButtonCenter (rCenterBox.Width/2);
+ if (rpPane && rpPane->mxPane.is())
+ {
+ const sal_Int32 nCalloutCenter (-nLeftBorderWidth);
+ const sal_Int32 nDistanceFromWindowCenter (abs(nCalloutCenter - rCenterBox.Width/2));
+ const sal_Int32 nButtonWidth (mpCloseButton->GetSize().Width);
+ const static sal_Int32 nMaxDistanceForCalloutCentering (nButtonWidth * 2);
+ if (nDistanceFromWindowCenter < nMaxDistanceForCalloutCentering)
+ {
+ if (nCalloutCenter < nButtonWidth/2)
+ nCloseButtonCenter = nButtonWidth/2;
+ else if (nCalloutCenter > rCenterBox.Width-nButtonWidth/2)
+ nCloseButtonCenter = rCenterBox.Width-nButtonWidth/2;
+ else
+ nCloseButtonCenter = nCalloutCenter;
+ }
+ }
+ mpCloseButton->SetCenter(geometry::RealPoint2D(
+ nCloseButtonCenter,
+ rCenterBox.Height - mpCloseButton->GetSize().Height/ 2));
+}
+
+void PresenterSlideSorter::ClearBackground (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const awt::Rectangle& rUpdateBox)
+{
+ OSL_ASSERT(rxCanvas.is());
+
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ mpPresenterController->GetCanvasHelper()->Paint(
+ mpPresenterController->GetViewBackground(mxViewId->getResourceURL()),
+ rxCanvas,
+ rUpdateBox,
+ awt::Rectangle(0,0,aWindowBox.Width,aWindowBox.Height),
+ awt::Rectangle());
+}
+
+double PresenterSlideSorter::GetSlideAspectRatio() const
+{
+ double nSlideAspectRatio (28.0/21.0);
+
+ try
+ {
+ Reference<container::XIndexAccess> xSlides(mxSlideShowController, UNO_QUERY_THROW);
+ if (mxSlideShowController.is() && xSlides->getCount()>0)
+ {
+ Reference<beans::XPropertySet> xProperties(xSlides->getByIndex(0),UNO_QUERY_THROW);
+ sal_Int32 nWidth (28000);
+ sal_Int32 nHeight (21000);
+ if ((xProperties->getPropertyValue("Width") >>= nWidth)
+ && (xProperties->getPropertyValue("Height") >>= nHeight)
+ && nHeight > 0)
+ {
+ nSlideAspectRatio = double(nWidth) / double(nHeight);
+ }
+ }
+ }
+ catch (RuntimeException&)
+ {
+ OSL_ASSERT(false);
+ }
+
+ return nSlideAspectRatio;
+}
+
+Reference<rendering::XBitmap> PresenterSlideSorter::GetPreview (const sal_Int32 nSlideIndex)
+{
+ if (nSlideIndex < 0 || nSlideIndex>=mpLayout->mnSlideCount)
+ return nullptr;
+ else if (mxPane.is())
+ return mxPreviewCache->getSlidePreview(nSlideIndex, mxPane->getCanvas());
+ else
+ return nullptr;
+}
+
+void PresenterSlideSorter::PaintPreview (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rUpdateBox,
+ const sal_Int32 nSlideIndex)
+{
+ OSL_ASSERT(rxCanvas.is());
+
+ geometry::IntegerSize2D aSize (mpLayout->maPreviewSize);
+
+ if (PresenterGeometryHelper::AreRectanglesDisjoint(
+ rUpdateBox,
+ mpLayout->GetBoundingBox(nSlideIndex)))
+ {
+ return;
+ }
+
+ Reference<rendering::XBitmap> xPreview (GetPreview(nSlideIndex));
+ bool isRTL = AllSettings::GetLayoutRTL();
+
+ const geometry::RealPoint2D aTopLeft (
+ mpLayout->GetWindowPosition(
+ mpLayout->GetPoint(nSlideIndex, isRTL?1:-1, -1)));
+
+ PresenterBitmapContainer aContainer (
+ "PresenterScreenSettings/ScrollBar/Bitmaps",
+ std::shared_ptr<PresenterBitmapContainer>(),
+ mxComponentContext,
+ rxCanvas);
+ Reference<container::XIndexAccess> xIndexAccess(mxSlideShowController, UNO_QUERY);
+ Reference<drawing::XDrawPage> xPage( xIndexAccess->getByIndex(nSlideIndex), UNO_QUERY);
+ bool bTransition = PresenterController::HasTransition(xPage);
+ bool bCustomAnimation = PresenterController::HasCustomAnimation(xPage);
+
+ // Create clip rectangle as intersection of the current update area and
+ // the bounding box of all previews.
+ geometry::RealRectangle2D aBoundingBox (mpLayout->maBoundingBox);
+ aBoundingBox.Y2 += 1;
+ const geometry::RealRectangle2D aClipBox (
+ PresenterGeometryHelper::Intersection(
+ PresenterGeometryHelper::ConvertRectangle(rUpdateBox),
+ aBoundingBox));
+ Reference<rendering::XPolyPolygon2D> xClip (
+ PresenterGeometryHelper::CreatePolygon(aClipBox, rxCanvas->getDevice()));
+
+ const rendering::ViewState aViewState (geometry::AffineMatrix2D(1,0,0, 0,1,0), xClip);
+
+ rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(
+ 1, 0, aTopLeft.X,
+ 0, 1, aTopLeft.Y),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+
+ // Emphasize the current slide.
+ if (nSlideIndex == mnCurrentSlideIndex)
+ {
+ if (mpCurrentSlideFrameRenderer != nullptr)
+ {
+ const awt::Rectangle aSlideBoundingBox(
+ sal::static_int_cast<sal_Int32>(0.5 + aTopLeft.X),
+ sal::static_int_cast<sal_Int32>(0.5 + aTopLeft.Y),
+ aSize.Width,
+ aSize.Height);
+ maCurrentSlideFrameBoundingBox
+ = mpCurrentSlideFrameRenderer->GetBoundingBox(aSlideBoundingBox);
+ mpCurrentSlideFrameRenderer->PaintCurrentSlideFrame (
+ aSlideBoundingBox,
+ mxCanvas,
+ aClipBox);
+ }
+ }
+
+ // Paint the preview.
+ if (xPreview.is())
+ {
+ aSize = xPreview->getSize();
+ if (aSize.Width > 0 && aSize.Height > 0)
+ {
+ rxCanvas->drawBitmap(xPreview, aViewState, aRenderState);
+ if( bCustomAnimation )
+ {
+ const awt::Rectangle aAnimationPreviewBox(aTopLeft.X+3, aTopLeft.Y+aSize.Height-40, 0, 0);
+ SharedBitmapDescriptor aAnimationDescriptor = aContainer.GetBitmap("Animation");
+ Reference<rendering::XBitmap> xAnimationIcon (aAnimationDescriptor->GetNormalBitmap());
+ rendering::RenderState aAnimationRenderState (
+ geometry::AffineMatrix2D(
+ 1, 0, aAnimationPreviewBox.X,
+ 0, 1, aAnimationPreviewBox.Y),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+ rxCanvas->drawBitmap(xAnimationIcon, aViewState, aAnimationRenderState);
+ }
+ if( bTransition )
+ {
+ const awt::Rectangle aTransitionPreviewBox(aTopLeft.X+3, aTopLeft.Y+aSize.Height-20, 0, 0);
+ SharedBitmapDescriptor aTransitionDescriptor = aContainer.GetBitmap("Transition");
+ Reference<rendering::XBitmap> xTransitionIcon (aTransitionDescriptor->GetNormalBitmap());
+ rendering::RenderState aTransitionRenderState (
+ geometry::AffineMatrix2D(
+ 1, 0, aTransitionPreviewBox.X,
+ 0, 1, aTransitionPreviewBox.Y),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+ rxCanvas->drawBitmap(xTransitionIcon, aViewState, aTransitionRenderState);
+ }
+ }
+ }
+
+ // Create a polygon that is used to paint a frame around previews. Its
+ // coordinates are chosen in the local coordinate system of a preview.
+ if ( ! mxPreviewFrame.is())
+ mxPreviewFrame = PresenterGeometryHelper::CreatePolygon(
+ awt::Rectangle(-1, -1, aSize.Width+2, aSize.Height+2),
+ rxCanvas->getDevice());
+
+ // Paint a border around the preview.
+ if (mxPreviewFrame.is())
+ {
+ const util::Color aFrameColor (0x00000000);
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, aFrameColor);
+ rxCanvas->drawPolyPolygon(mxPreviewFrame, aViewState, aRenderState);
+ }
+
+ // Paint mouse over effect.
+ mpMouseOverManager->Paint(nSlideIndex, mxCanvas, xClip);
+}
+
+void PresenterSlideSorter::Paint (const awt::Rectangle& rUpdateBox)
+{
+ const bool bCanvasChanged ( ! mxCanvas.is());
+ if ( ! ProvideCanvas())
+ return;
+
+ if (mpLayout->mnRowCount<=0 || mpLayout->mnColumnCount<=0)
+ {
+ OSL_ASSERT(mpLayout->mnRowCount>0 || mpLayout->mnColumnCount>0);
+ return;
+ }
+
+ ClearBackground(mxCanvas, rUpdateBox);
+
+ // Give the canvas to the controls.
+ if (bCanvasChanged)
+ {
+ if (mpVerticalScrollBar.is())
+ mpVerticalScrollBar->SetCanvas(mxCanvas);
+ if (mpCloseButton.is())
+ mpCloseButton->SetCanvas(mxCanvas, mxWindow);
+ }
+
+ // Now that the controls have a canvas we can do the layouting.
+ if (mbIsLayoutPending)
+ UpdateLayout();
+
+ // Paint the horizontal separator.
+ rendering::RenderState aRenderState (geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr, Sequence<double>(4), rendering::CompositeOperation::SOURCE);
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, maSeparatorColor);
+ mxCanvas->drawLine(
+ geometry::RealPoint2D(0, mnSeparatorY),
+ geometry::RealPoint2D(mxWindow->getPosSize().Width, mnSeparatorY),
+ rendering::ViewState(geometry::AffineMatrix2D(1,0,0, 0,1,0), nullptr),
+ aRenderState);
+
+ // Paint the slides.
+ if ( ! PresenterGeometryHelper::AreRectanglesDisjoint(
+ rUpdateBox,
+ PresenterGeometryHelper::ConvertRectangle(mpLayout->maBoundingBox)))
+ {
+ mpLayout->ForAllVisibleSlides(
+ [this, &rUpdateBox] (sal_Int32 const nIndex) {
+ return this->PaintPreview(this->mxCanvas, rUpdateBox, nIndex);
+ });
+ }
+
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ xSpriteCanvas->updateScreen(false);
+}
+
+void PresenterSlideSorter::SetHorizontalOffset (const double nXOffset)
+{
+ if (mpLayout->SetHorizontalOffset(nXOffset))
+ {
+ mxPreviewCache->setVisibleRange(
+ mpLayout->GetFirstVisibleSlideIndex(),
+ mpLayout->GetLastVisibleSlideIndex());
+
+ mpPresenterController->GetPaintManager()->Invalidate(mxWindow);
+ }
+}
+
+void PresenterSlideSorter::SetVerticalOffset (const double nYOffset)
+{
+ if (mpLayout->SetVerticalOffset(nYOffset))
+ {
+ mxPreviewCache->setVisibleRange(
+ mpLayout->GetFirstVisibleSlideIndex(),
+ mpLayout->GetLastVisibleSlideIndex());
+
+ mpPresenterController->GetPaintManager()->Invalidate(mxWindow);
+ }
+}
+
+void PresenterSlideSorter::GotoSlide (const sal_Int32 nSlideIndex)
+{
+ mxSlideShowController->gotoSlideIndex(nSlideIndex);
+}
+
+bool PresenterSlideSorter::ProvideCanvas()
+{
+ if ( ! mxCanvas.is())
+ {
+ if (mxPane.is())
+ mxCanvas = mxPane->getCanvas();
+
+ // Register as event listener so that we are informed when the
+ // canvas is disposed (and we have to fetch another one).
+ Reference<lang::XComponent> xComponent (mxCanvas, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->addEventListener(static_cast<awt::XWindowListener*>(this));
+
+ mpCurrentSlideFrameRenderer =
+ std::make_shared<CurrentSlideFrameRenderer>(mxComponentContext, mxCanvas);
+ }
+ return mxCanvas.is();
+}
+
+void PresenterSlideSorter::ThrowIfDisposed()
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterSlideSorter has been already disposed",
+ static_cast<uno::XWeak*>(this));
+ }
+}
+
+//===== PresenterSlideSorter::Layout ==========================================
+
+PresenterSlideSorter::Layout::Layout (
+ const ::rtl::Reference<PresenterScrollBar>& rpVerticalScrollBar)
+ : mnHorizontalOffset(0),
+ mnVerticalOffset(0),
+ mnHorizontalGap(0),
+ mnVerticalGap(0),
+ mnHorizontalBorder(0),
+ mnVerticalBorder(0),
+ mnRowCount(1),
+ mnColumnCount(1),
+ mnSlideCount(0),
+ mnFirstVisibleColumn(-1),
+ mnLastVisibleColumn(-1),
+ mnFirstVisibleRow(-1),
+ mnLastVisibleRow(-1),
+ mpVerticalScrollBar(rpVerticalScrollBar)
+{
+}
+
+void PresenterSlideSorter::Layout::Update (
+ const geometry::RealRectangle2D& rBoundingBox,
+ const double nSlideAspectRatio)
+{
+ maBoundingBox = rBoundingBox;
+
+ mnHorizontalBorder = gnHorizontalBorder;
+ mnVerticalBorder = gnVerticalBorder;
+
+ const double nWidth (rBoundingBox.X2 - rBoundingBox.X1 - 2*mnHorizontalBorder);
+ const double nHeight (rBoundingBox.Y2 - rBoundingBox.Y1 - 2*mnVerticalBorder);
+ if (nWidth<=0 || nHeight<=0)
+ return;
+
+ double nPreviewWidth;
+
+ // Determine column count, preview width, and horizontal gap (borders
+ // are half the gap). Try to use the preferred values. Try more to
+ // stay in the valid intervals. This last constraint may be not
+ // fulfilled in some cases.
+ const double nElementWidth = nWidth / gnPreferredColumnCount;
+ if (nElementWidth < gnMinimalPreviewWidth + gnMinimalHorizontalPreviewGap)
+ {
+ // The preferred column count is too large.
+ // Can we use the preferred preview width?
+ if (nWidth - gnMinimalHorizontalPreviewGap >= gnPreferredPreviewWidth)
+ {
+ // Yes.
+ nPreviewWidth = gnPreferredPreviewWidth;
+ mnColumnCount = floor((nWidth+gnPreferredHorizontalPreviewGap)
+ / (nPreviewWidth+gnPreferredHorizontalPreviewGap));
+ mnHorizontalGap = round((nWidth - mnColumnCount*nPreviewWidth) / mnColumnCount);
+ }
+ else
+ {
+ // No. Set the column count to 1 and adapt preview width and
+ // gap.
+ mnColumnCount = 1;
+ mnHorizontalGap = floor(gnMinimalHorizontalPreviewGap);
+ if (nWidth - gnMinimalHorizontalPreviewGap >= gnPreferredPreviewWidth)
+ nPreviewWidth = nWidth - gnMinimalHorizontalPreviewGap;
+ else
+ nPreviewWidth = ::std::max(gnMinimalPreviewWidth, nWidth-mnHorizontalGap);
+ }
+ }
+ else if (nElementWidth > gnMaximalPreviewWidth + gnMaximalHorizontalPreviewGap)
+ {
+ // The preferred column count is too small.
+ nPreviewWidth = gnPreferredPreviewWidth;
+ mnColumnCount = floor((nWidth+gnPreferredHorizontalPreviewGap)
+ / (nPreviewWidth+gnPreferredHorizontalPreviewGap));
+ mnHorizontalGap = round((nWidth - mnColumnCount*nPreviewWidth) / mnColumnCount);
+ }
+ else
+ {
+ // The preferred column count is possible. Determine gap and
+ // preview width.
+ mnColumnCount = gnPreferredColumnCount;
+ if (nElementWidth - gnPreferredPreviewWidth < gnMinimalHorizontalPreviewGap)
+ {
+ // Use the minimal gap and adapt the preview width.
+ mnHorizontalGap = floor(gnMinimalHorizontalPreviewGap);
+ nPreviewWidth = (nWidth - mnColumnCount*mnHorizontalGap) / mnColumnCount;
+ }
+ else if (nElementWidth - gnPreferredPreviewWidth <= gnMaximalHorizontalPreviewGap)
+ {
+ // Use the maximal gap and adapt the preview width.
+ mnHorizontalGap = round(gnMaximalHorizontalPreviewGap);
+ nPreviewWidth = (nWidth - mnColumnCount*mnHorizontalGap) / mnColumnCount;
+ }
+ else
+ {
+ // Use the preferred preview width and adapt the gap.
+ nPreviewWidth = gnPreferredPreviewWidth;
+ mnHorizontalGap = round((nWidth - mnColumnCount*nPreviewWidth) / mnColumnCount);
+ }
+ }
+
+ // Now determine the row count, preview height, and vertical gap.
+ const double nPreviewHeight = nPreviewWidth / nSlideAspectRatio;
+ mnRowCount = ::std::max(
+ sal_Int32(1),
+ sal_Int32(ceil((nHeight+gnPreferredVerticalPreviewGap)
+ / (nPreviewHeight + gnPreferredVerticalPreviewGap))));
+ mnVerticalGap = round(gnPreferredVerticalPreviewGap);
+
+ maPreviewSize = geometry::IntegerSize2D(floor(nPreviewWidth), floor(nPreviewHeight));
+
+ // Reset the offset.
+ mnVerticalOffset = 0;
+ mnHorizontalOffset = round(-(nWidth
+ - mnColumnCount*maPreviewSize.Width
+ - (mnColumnCount-1)*mnHorizontalGap)
+ / 2);
+}
+
+void PresenterSlideSorter::Layout::SetupVisibleArea()
+{
+ geometry::RealPoint2D aPoint (GetLocalPosition(
+ geometry::RealPoint2D(maBoundingBox.X1, maBoundingBox.Y1)));
+ mnFirstVisibleColumn = 0;
+ mnFirstVisibleRow = ::std::max(sal_Int32(0), GetRow(aPoint));
+
+ aPoint = GetLocalPosition(geometry::RealPoint2D( maBoundingBox.X2, maBoundingBox.Y2));
+ mnLastVisibleColumn = mnColumnCount - 1;
+ mnLastVisibleRow = GetRow(aPoint, true);
+}
+
+bool PresenterSlideSorter::Layout::IsScrollBarNeeded (const sal_Int32 nSlideCount)
+{
+ geometry::RealPoint2D aBottomRight = GetPoint(
+ mnColumnCount * (GetRow(nSlideCount)+1) - 1, +1, +1);
+ return aBottomRight.X > maBoundingBox.X2-maBoundingBox.X1
+ || aBottomRight.Y > maBoundingBox.Y2-maBoundingBox.Y1;
+}
+
+geometry::RealPoint2D PresenterSlideSorter::Layout::GetLocalPosition(
+ const geometry::RealPoint2D& rWindowPoint) const
+{
+ if(AllSettings::GetLayoutRTL())
+ {
+ return css::geometry::RealPoint2D(
+ -rWindowPoint.X + maBoundingBox.X2 + mnHorizontalOffset,
+ rWindowPoint.Y - maBoundingBox.Y1 + mnVerticalOffset);
+ }
+ else
+ {
+ return css::geometry::RealPoint2D(
+ rWindowPoint.X - maBoundingBox.X1 + mnHorizontalOffset,
+ rWindowPoint.Y - maBoundingBox.Y1 + mnVerticalOffset);
+ }
+}
+
+geometry::RealPoint2D PresenterSlideSorter::Layout::GetWindowPosition(
+ const geometry::RealPoint2D& rLocalPoint) const
+{
+ if(AllSettings::GetLayoutRTL())
+ {
+ return css::geometry::RealPoint2D(
+ -rLocalPoint.X + mnHorizontalOffset + maBoundingBox.X2,
+ rLocalPoint.Y - mnVerticalOffset + maBoundingBox.Y1);
+ }
+ else
+ {
+ return css::geometry::RealPoint2D(
+ rLocalPoint.X - mnHorizontalOffset + maBoundingBox.X1,
+ rLocalPoint.Y - mnVerticalOffset + maBoundingBox.Y1);
+ }
+}
+
+sal_Int32 PresenterSlideSorter::Layout::GetColumn (
+ const css::geometry::RealPoint2D& rLocalPoint) const
+{
+ const sal_Int32 nColumn(floor(
+ (rLocalPoint.X + mnHorizontalGap/2.0) / (maPreviewSize.Width+mnHorizontalGap)));
+ if (nColumn>=mnFirstVisibleColumn && nColumn<=mnLastVisibleColumn)
+ {
+ return nColumn;
+ }
+ else
+ return -1;
+}
+
+sal_Int32 PresenterSlideSorter::Layout::GetRow (
+ const css::geometry::RealPoint2D& rLocalPoint,
+ const bool bReturnInvalidValue) const
+{
+ const sal_Int32 nRow (floor(
+ (rLocalPoint.Y + mnVerticalGap/2.0) / (maPreviewSize.Height+mnVerticalGap)));
+ if (bReturnInvalidValue
+ || (nRow>=mnFirstVisibleRow && nRow<=mnLastVisibleRow))
+ {
+ return nRow;
+ }
+ else
+ return -1;
+}
+
+sal_Int32 PresenterSlideSorter::Layout::GetSlideIndexForPosition (
+ const css::geometry::RealPoint2D& rWindowPoint) const
+{
+ if ( ! PresenterGeometryHelper::IsInside(maBoundingBox, rWindowPoint))
+ return -1;
+
+ const css::geometry::RealPoint2D aLocalPosition (GetLocalPosition(rWindowPoint));
+ const sal_Int32 nColumn (GetColumn(aLocalPosition));
+ const sal_Int32 nRow (GetRow(aLocalPosition));
+
+ if (nColumn < 0 || nRow < 0)
+ return -1;
+ else
+ {
+ sal_Int32 nIndex (GetIndex(nRow, nColumn));
+ if (nIndex >= mnSlideCount)
+ return -1;
+ else
+ return nIndex;
+ }
+}
+
+geometry::RealPoint2D PresenterSlideSorter::Layout::GetPoint (
+ const sal_Int32 nSlideIndex,
+ const sal_Int32 nRelativeHorizontalPosition,
+ const sal_Int32 nRelativeVerticalPosition) const
+{
+ sal_Int32 nColumn (GetColumn(nSlideIndex));
+ sal_Int32 nRow (GetRow(nSlideIndex));
+
+ geometry::RealPoint2D aPosition (
+ mnHorizontalBorder + nColumn*(maPreviewSize.Width+mnHorizontalGap),
+ mnVerticalBorder + nRow*(maPreviewSize.Height+mnVerticalGap));
+
+ if (nRelativeHorizontalPosition >= 0)
+ {
+ if (nRelativeHorizontalPosition > 0)
+ aPosition.X += maPreviewSize.Width;
+ else
+ aPosition.X += maPreviewSize.Width / 2.0;
+ }
+ if (nRelativeVerticalPosition >= 0)
+ {
+ if (nRelativeVerticalPosition > 0)
+ aPosition.Y += maPreviewSize.Height;
+ else
+ aPosition.Y += maPreviewSize.Height / 2.0;
+ }
+
+ return aPosition;
+}
+
+awt::Rectangle PresenterSlideSorter::Layout::GetBoundingBox (const sal_Int32 nSlideIndex) const
+{
+ bool isRTL = AllSettings::GetLayoutRTL();
+ const geometry::RealPoint2D aWindowPosition(GetWindowPosition(GetPoint(nSlideIndex, isRTL?1:-1, -1)));
+ return PresenterGeometryHelper::ConvertRectangle(
+ geometry::RealRectangle2D(
+ aWindowPosition.X,
+ aWindowPosition.Y,
+ aWindowPosition.X + maPreviewSize.Width,
+ aWindowPosition.Y + maPreviewSize.Height));
+}
+
+void PresenterSlideSorter::Layout::ForAllVisibleSlides(
+ const ::std::function<void (sal_Int32)>& rAction)
+{
+ for (sal_Int32 nRow=mnFirstVisibleRow; nRow<=mnLastVisibleRow; ++nRow)
+ {
+ for (sal_Int32 nColumn=mnFirstVisibleColumn; nColumn<=mnLastVisibleColumn; ++nColumn)
+ {
+ const sal_Int32 nSlideIndex (GetIndex(nRow, nColumn));
+ if (nSlideIndex >= mnSlideCount)
+ return;
+ rAction(nSlideIndex);
+ }
+ }
+}
+
+sal_Int32 PresenterSlideSorter::Layout::GetFirstVisibleSlideIndex() const
+{
+ return GetIndex(mnFirstVisibleRow, mnFirstVisibleColumn);
+}
+
+sal_Int32 PresenterSlideSorter::Layout::GetLastVisibleSlideIndex() const
+{
+ return ::std::min(
+ GetIndex(mnLastVisibleRow, mnLastVisibleColumn),
+ mnSlideCount);
+}
+
+bool PresenterSlideSorter::Layout::SetHorizontalOffset (const double nOffset)
+{
+ if (mnHorizontalOffset != nOffset)
+ {
+ mnHorizontalOffset = round(nOffset);
+ SetupVisibleArea();
+ UpdateScrollBars();
+ return true;
+ }
+ else
+ return false;
+}
+
+bool PresenterSlideSorter::Layout::SetVerticalOffset (const double nOffset)
+{
+ if (mnVerticalOffset != nOffset)
+ {
+ mnVerticalOffset = round(nOffset);
+ SetupVisibleArea();
+ UpdateScrollBars();
+ return true;
+ }
+ else
+ return false;
+}
+
+void PresenterSlideSorter::Layout::UpdateScrollBars()
+{
+ sal_Int32 nTotalRowCount = sal_Int32(ceil(double(mnSlideCount) / double(mnColumnCount)));
+
+ if (mpVerticalScrollBar)
+ {
+ mpVerticalScrollBar->SetTotalSize(
+ nTotalRowCount * maPreviewSize.Height
+ + (nTotalRowCount-1) * mnVerticalGap
+ + 2*mnVerticalGap);
+ mpVerticalScrollBar->SetThumbPosition(mnVerticalOffset, false);
+ mpVerticalScrollBar->SetThumbSize(maBoundingBox.Y2 - maBoundingBox.Y1 + 1);
+ mpVerticalScrollBar->SetLineHeight(maPreviewSize.Height);
+ }
+
+ // No place yet for the vertical scroll bar.
+}
+
+sal_Int32 PresenterSlideSorter::Layout::GetIndex (
+ const sal_Int32 nRow,
+ const sal_Int32 nColumn) const
+{
+ return nRow * mnColumnCount + nColumn;
+}
+
+sal_Int32 PresenterSlideSorter::Layout::GetRow (const sal_Int32 nSlideIndex) const
+{
+ return nSlideIndex / mnColumnCount;
+}
+
+sal_Int32 PresenterSlideSorter::Layout::GetColumn (const sal_Int32 nSlideIndex) const
+{
+ return nSlideIndex % mnColumnCount;
+}
+
+//===== PresenterSlideSorter::MouseOverManager ================================
+
+PresenterSlideSorter::MouseOverManager::MouseOverManager (
+ const Reference<container::XIndexAccess>& rxSlides,
+ const std::shared_ptr<PresenterTheme>& rpTheme,
+ const Reference<awt::XWindow>& rxInvalidateTarget,
+ const std::shared_ptr<PresenterPaintManager>& rpPaintManager)
+ : mxSlides(rxSlides),
+ mnSlideIndex(-1),
+ mxInvalidateTarget(rxInvalidateTarget),
+ mpPaintManager(rpPaintManager)
+{
+ if (rpTheme != nullptr)
+ {
+ std::shared_ptr<PresenterBitmapContainer> pBitmaps (rpTheme->GetBitmapContainer());
+ if (pBitmaps != nullptr)
+ {
+ mpLeftLabelBitmap = pBitmaps->GetBitmap("LabelLeft");
+ mpCenterLabelBitmap = pBitmaps->GetBitmap("LabelCenter");
+ mpRightLabelBitmap = pBitmaps->GetBitmap("LabelRight");
+ }
+
+ mpFont = rpTheme->GetFont("SlideSorterLabelFont");
+ }
+}
+
+void PresenterSlideSorter::MouseOverManager::Paint (
+ const sal_Int32 nSlideIndex,
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const Reference<rendering::XPolyPolygon2D>& rxClip)
+{
+ if (nSlideIndex != mnSlideIndex)
+ return;
+
+ if (mxCanvas != rxCanvas)
+ SetCanvas(rxCanvas);
+ if (rxCanvas == nullptr)
+ return;
+
+ if ( ! mxBitmap.is())
+ mxBitmap = CreateBitmap(msText, maSlideBoundingBox.Width);
+ if (!mxBitmap.is())
+ return;
+
+ geometry::IntegerSize2D aSize (mxBitmap->getSize());
+ const double nXOffset (maSlideBoundingBox.X
+ + (maSlideBoundingBox.Width - aSize.Width) / 2.0);
+ const double nYOffset (maSlideBoundingBox.Y
+ + (maSlideBoundingBox.Height - aSize.Height) / 2.0);
+ rxCanvas->drawBitmap(
+ mxBitmap,
+ rendering::ViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ rxClip),
+ rendering::RenderState(
+ geometry::AffineMatrix2D(1,0,nXOffset, 0,1,nYOffset),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE));
+}
+
+void PresenterSlideSorter::MouseOverManager::SetCanvas (
+ const Reference<rendering::XCanvas>& rxCanvas)
+{
+ mxCanvas = rxCanvas;
+ if (mpFont)
+ mpFont->PrepareFont(mxCanvas);
+}
+
+void PresenterSlideSorter::MouseOverManager::SetSlide (
+ const sal_Int32 nSlideIndex,
+ const awt::Rectangle& rBox)
+{
+ if (mnSlideIndex == nSlideIndex)
+ return;
+
+ mnSlideIndex = -1;
+ Invalidate();
+
+ maSlideBoundingBox = rBox;
+ mnSlideIndex = nSlideIndex;
+
+ if (nSlideIndex >= 0)
+ {
+ if (mxSlides)
+ {
+ msText.clear();
+
+ Reference<beans::XPropertySet> xSlideProperties(mxSlides->getByIndex(nSlideIndex), UNO_QUERY);
+ if (xSlideProperties.is())
+ xSlideProperties->getPropertyValue("LinkDisplayName") >>= msText;
+
+ if (msText.isEmpty())
+ msText = "Slide " + OUString::number(nSlideIndex + 1);
+ }
+ }
+ else
+ {
+ msText.clear();
+ }
+ mxBitmap = nullptr;
+
+ Invalidate();
+}
+
+Reference<rendering::XBitmap> PresenterSlideSorter::MouseOverManager::CreateBitmap (
+ const OUString& rsText,
+ const sal_Int32 nMaximalWidth) const
+{
+ if ( ! mxCanvas.is())
+ return nullptr;
+
+ if (!mpFont || !mpFont->mxFont.is())
+ return nullptr;
+
+ // Long text has to be shortened.
+ const OUString sText (GetFittingText(rsText, nMaximalWidth
+ - 2*gnHorizontalLabelBorder
+ - 2*gnHorizontalLabelPadding));
+
+ // Determine the size of the label. Its height is defined by the
+ // bitmaps that are used to paints its background. The width is defined
+ // by the text.
+ geometry::IntegerSize2D aLabelSize (CalculateLabelSize(sText));
+
+ // Create a new bitmap that will contain the complete label.
+ Reference<rendering::XBitmap> xBitmap (
+ mxCanvas->getDevice()->createCompatibleAlphaBitmap(aLabelSize));
+
+ if ( ! xBitmap.is())
+ return nullptr;
+
+ Reference<rendering::XBitmapCanvas> xBitmapCanvas (xBitmap, UNO_QUERY);
+ if ( ! xBitmapCanvas.is())
+ return nullptr;
+
+ // Paint the background.
+ PaintButtonBackground(xBitmapCanvas, aLabelSize);
+
+ // Paint the text.
+ if (!sText.isEmpty())
+ {
+
+ const rendering::StringContext aContext (sText, 0, sText.getLength());
+ const Reference<rendering::XTextLayout> xLayout (mpFont->mxFont->createTextLayout(
+ aContext, rendering::TextDirection::WEAK_LEFT_TO_RIGHT,0));
+ const geometry::RealRectangle2D aTextBBox (xLayout->queryTextBounds());
+
+ const double nXOffset = (aLabelSize.Width - aTextBBox.X2 + aTextBBox.X1) / 2;
+ const double nYOffset = aLabelSize.Height
+ - (aLabelSize.Height - aTextBBox.Y2 + aTextBBox.Y1)/2 - aTextBBox.Y2;
+
+ const rendering::ViewState aViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr);
+
+ rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(1,0,nXOffset, 0,1,nYOffset),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, mpFont->mnColor);
+
+ xBitmapCanvas->drawTextLayout (
+ xLayout,
+ aViewState,
+ aRenderState);
+ }
+
+ return xBitmap;
+}
+
+OUString PresenterSlideSorter::MouseOverManager::GetFittingText (
+ const OUString& rsText,
+ const double nMaximalWidth) const
+{
+ const double nTextWidth (
+ PresenterCanvasHelper::GetTextSize(mpFont->mxFont, rsText).Width);
+ if (nTextWidth > nMaximalWidth)
+ {
+ // Text is too wide. Shorten it by removing characters from the end
+ // and replacing them by ellipses.
+
+ // Guess a start value of the final string length.
+ double nBestWidth (0);
+ OUString sBestCandidate;
+ sal_Int32 nLength (round(rsText.getLength() * nMaximalWidth / nTextWidth));
+ static const OUStringLiteral sEllipses (u"...");
+ while (true)
+ {
+ const OUString sCandidate (rsText.subView(0,nLength) + sEllipses);
+ const double nWidth (
+ PresenterCanvasHelper::GetTextSize(mpFont->mxFont, sCandidate).Width);
+ if (nWidth > nMaximalWidth)
+ {
+ // Candidate still too wide, shorten it.
+ nLength -= 1;
+ if (nLength <= 0)
+ break;
+ }
+ else if (nWidth < nMaximalWidth)
+ {
+ // Candidate short enough.
+ if (nWidth > nBestWidth)
+ {
+ // Best length so far.
+ sBestCandidate = sCandidate;
+ nBestWidth = nWidth;
+ nLength += 1;
+ if (nLength >= rsText.getLength())
+ break;
+ }
+ else
+ break;
+ }
+ else
+ {
+ // Candidate is exactly as long as it may be. Use it
+ // without looking any further.
+ sBestCandidate = sCandidate;
+ break;
+ }
+ }
+ return sBestCandidate;
+ }
+ else
+ return rsText;
+}
+
+geometry::IntegerSize2D PresenterSlideSorter::MouseOverManager::CalculateLabelSize (
+ const OUString& rsText) const
+{
+ // Height is specified by the label bitmaps.
+ sal_Int32 nHeight (32);
+ if (mpCenterLabelBitmap)
+ {
+ Reference<rendering::XBitmap> xBitmap (mpCenterLabelBitmap->GetNormalBitmap());
+ if (xBitmap.is())
+ nHeight = xBitmap->getSize().Height;
+ }
+
+ // Width is specified by text width and maximal width.
+ const geometry::RealSize2D aTextSize (
+ PresenterCanvasHelper::GetTextSize(mpFont->mxFont, rsText));
+
+ const sal_Int32 nWidth (round(aTextSize.Width + 2*gnHorizontalLabelPadding));
+
+ return geometry::IntegerSize2D(nWidth, nHeight);
+}
+
+void PresenterSlideSorter::MouseOverManager::PaintButtonBackground (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const geometry::IntegerSize2D& rSize) const
+{
+ // Get the bitmaps for painting the label background.
+ Reference<rendering::XBitmap> xLeftLabelBitmap;
+ if (mpLeftLabelBitmap)
+ xLeftLabelBitmap = mpLeftLabelBitmap->GetNormalBitmap();
+
+ Reference<rendering::XBitmap> xCenterLabelBitmap;
+ if (mpCenterLabelBitmap)
+ xCenterLabelBitmap = mpCenterLabelBitmap->GetNormalBitmap();
+
+ Reference<rendering::XBitmap> xRightLabelBitmap;
+ if (mpRightLabelBitmap)
+ xRightLabelBitmap = mpRightLabelBitmap->GetNormalBitmap();
+
+ PresenterUIPainter::PaintHorizontalBitmapComposite (
+ rxCanvas,
+ awt::Rectangle(0,0, rSize.Width,rSize.Height),
+ awt::Rectangle(0,0, rSize.Width,rSize.Height),
+ xLeftLabelBitmap,
+ xCenterLabelBitmap,
+ xRightLabelBitmap);
+}
+
+void PresenterSlideSorter::MouseOverManager::Invalidate()
+{
+ if (mpPaintManager != nullptr)
+ mpPaintManager->Invalidate(mxInvalidateTarget, maSlideBoundingBox, true);
+}
+
+//===== PresenterSlideSorter::CurrentSlideFrameRenderer =======================
+
+PresenterSlideSorter::CurrentSlideFrameRenderer::CurrentSlideFrameRenderer (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas)
+ : mnTopFrameSize(0),
+ mnLeftFrameSize(0),
+ mnRightFrameSize(0),
+ mnBottomFrameSize(0)
+{
+ PresenterConfigurationAccess aConfiguration (
+ rxContext,
+ "/org.openoffice.Office.PresenterScreen/",
+ PresenterConfigurationAccess::READ_ONLY);
+ Reference<container::XHierarchicalNameAccess> xBitmaps (
+ aConfiguration.GetConfigurationNode(
+ "PresenterScreenSettings/SlideSorter/CurrentSlideBorderBitmaps"),
+ UNO_QUERY);
+ if ( ! xBitmaps.is())
+ return;
+
+ PresenterBitmapContainer aContainer (
+ "PresenterScreenSettings/SlideSorter/CurrentSlideBorderBitmaps",
+ std::shared_ptr<PresenterBitmapContainer>(),
+ rxContext,
+ rxCanvas);
+
+ mpTopLeft = aContainer.GetBitmap("TopLeft");
+ mpTop = aContainer.GetBitmap("Top");
+ mpTopRight = aContainer.GetBitmap("TopRight");
+ mpLeft = aContainer.GetBitmap("Left");
+ mpRight = aContainer.GetBitmap("Right");
+ mpBottomLeft = aContainer.GetBitmap("BottomLeft");
+ mpBottom = aContainer.GetBitmap("Bottom");
+ mpBottomRight = aContainer.GetBitmap("BottomRight");
+
+ // Determine size of frame.
+ if (mpTop)
+ mnTopFrameSize = mpTop->mnHeight;
+ if (mpLeft)
+ mnLeftFrameSize = mpLeft->mnWidth;
+ if (mpRight)
+ mnRightFrameSize = mpRight->mnWidth;
+ if (mpBottom)
+ mnBottomFrameSize = mpBottom->mnHeight;
+
+ if (mpTopLeft)
+ {
+ mnTopFrameSize = ::std::max(mnTopFrameSize, mpTopLeft->mnHeight);
+ mnLeftFrameSize = ::std::max(mnLeftFrameSize, mpTopLeft->mnWidth);
+ }
+ if (mpTopRight)
+ {
+ mnTopFrameSize = ::std::max(mnTopFrameSize, mpTopRight->mnHeight);
+ mnRightFrameSize = ::std::max(mnRightFrameSize, mpTopRight->mnWidth);
+ }
+ if (mpBottomLeft)
+ {
+ mnLeftFrameSize = ::std::max(mnLeftFrameSize, mpBottomLeft->mnWidth);
+ mnBottomFrameSize = ::std::max(mnBottomFrameSize, mpBottomLeft->mnHeight);
+ }
+ if (mpBottomRight)
+ {
+ mnRightFrameSize = ::std::max(mnRightFrameSize, mpBottomRight->mnWidth);
+ mnBottomFrameSize = ::std::max(mnBottomFrameSize, mpBottomRight->mnHeight);
+ }
+}
+
+void PresenterSlideSorter::CurrentSlideFrameRenderer::PaintCurrentSlideFrame (
+ const awt::Rectangle& rSlideBoundingBox,
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const geometry::RealRectangle2D& rClipBox)
+{
+ if ( ! rxCanvas.is())
+ return;
+
+ const Reference<rendering::XPolyPolygon2D> xClip (
+ PresenterGeometryHelper::CreatePolygon(rClipBox, rxCanvas->getDevice()));
+
+ if (mpTop)
+ {
+ PaintBitmapTiled(
+ mpTop->GetNormalBitmap(),
+ rxCanvas,
+ rClipBox,
+ rSlideBoundingBox.X,
+ rSlideBoundingBox.Y - mpTop->mnHeight,
+ rSlideBoundingBox.Width,
+ mpTop->mnHeight);
+ }
+ if (mpLeft)
+ {
+ PaintBitmapTiled(
+ mpLeft->GetNormalBitmap(),
+ rxCanvas,
+ rClipBox,
+ rSlideBoundingBox.X - mpLeft->mnWidth,
+ rSlideBoundingBox.Y,
+ mpLeft->mnWidth,
+ rSlideBoundingBox.Height);
+ }
+ if (mpRight)
+ {
+ PaintBitmapTiled(
+ mpRight->GetNormalBitmap(),
+ rxCanvas,
+ rClipBox,
+ rSlideBoundingBox.X + rSlideBoundingBox.Width,
+ rSlideBoundingBox.Y,
+ mpRight->mnWidth,
+ rSlideBoundingBox.Height);
+ }
+ if (mpBottom)
+ {
+ PaintBitmapTiled(
+ mpBottom->GetNormalBitmap(),
+ rxCanvas,
+ rClipBox,
+ rSlideBoundingBox.X,
+ rSlideBoundingBox.Y + rSlideBoundingBox.Height,
+ rSlideBoundingBox.Width,
+ mpBottom->mnHeight);
+ }
+ if (mpTopLeft)
+ {
+ PaintBitmapOnce(
+ mpTopLeft->GetNormalBitmap(),
+ rxCanvas,
+ xClip,
+ rSlideBoundingBox.X - mpTopLeft->mnWidth,
+ rSlideBoundingBox.Y - mpTopLeft->mnHeight);
+ }
+ if (mpTopRight)
+ {
+ PaintBitmapOnce(
+ mpTopRight->GetNormalBitmap(),
+ rxCanvas,
+ xClip,
+ rSlideBoundingBox.X + rSlideBoundingBox.Width,
+ rSlideBoundingBox.Y - mpTopLeft->mnHeight);
+ }
+ if (mpBottomLeft)
+ {
+ PaintBitmapOnce(
+ mpBottomLeft->GetNormalBitmap(),
+ rxCanvas,
+ xClip,
+ rSlideBoundingBox.X - mpBottomLeft->mnWidth,
+ rSlideBoundingBox.Y + rSlideBoundingBox.Height);
+ }
+ if (mpBottomRight)
+ {
+ PaintBitmapOnce(
+ mpBottomRight->GetNormalBitmap(),
+ rxCanvas,
+ xClip,
+ rSlideBoundingBox.X + rSlideBoundingBox.Width,
+ rSlideBoundingBox.Y + rSlideBoundingBox.Height);
+ }
+}
+
+awt::Rectangle PresenterSlideSorter::CurrentSlideFrameRenderer::GetBoundingBox (
+ const awt::Rectangle& rSlideBoundingBox)
+{
+ return awt::Rectangle(
+ rSlideBoundingBox.X - mnLeftFrameSize,
+ rSlideBoundingBox.Y - mnTopFrameSize,
+ rSlideBoundingBox.Width + mnLeftFrameSize + mnRightFrameSize,
+ rSlideBoundingBox.Height + mnTopFrameSize + mnBottomFrameSize);
+}
+
+void PresenterSlideSorter::CurrentSlideFrameRenderer::PaintBitmapOnce(
+ const css::uno::Reference<css::rendering::XBitmap>& rxBitmap,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const Reference<rendering::XPolyPolygon2D>& rxClip,
+ const double nX,
+ const double nY)
+{
+ OSL_ASSERT(rxCanvas.is());
+ if ( ! rxBitmap.is())
+ return;
+
+ const rendering::ViewState aViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ rxClip);
+
+ const rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(
+ 1, 0, nX,
+ 0, 1, nY),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+
+ rxCanvas->drawBitmap(
+ rxBitmap,
+ aViewState,
+ aRenderState);
+}
+
+void PresenterSlideSorter::CurrentSlideFrameRenderer::PaintBitmapTiled(
+ const css::uno::Reference<css::rendering::XBitmap>& rxBitmap,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const geometry::RealRectangle2D& rClipBox,
+ const double nX0,
+ const double nY0,
+ const double nWidth,
+ const double nHeight)
+{
+ OSL_ASSERT(rxCanvas.is());
+ if ( ! rxBitmap.is())
+ return;
+
+ geometry::IntegerSize2D aSize (rxBitmap->getSize());
+
+ const rendering::ViewState aViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ PresenterGeometryHelper::CreatePolygon(
+ PresenterGeometryHelper::Intersection(
+ rClipBox,
+ geometry::RealRectangle2D(nX0,nY0,nX0+nWidth,nY0+nHeight)),
+ rxCanvas->getDevice()));
+
+ rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(
+ 1, 0, nX0,
+ 0, 1, nY0),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+
+ const double nX1 = nX0 + nWidth;
+ const double nY1 = nY0 + nHeight;
+ for (double nY=nY0; nY<nY1; nY+=aSize.Height)
+ for (double nX=nX0; nX<nX1; nX+=aSize.Width)
+ {
+ aRenderState.AffineTransform.m02 = nX;
+ aRenderState.AffineTransform.m12 = nY;
+ rxCanvas->drawBitmap(
+ rxBitmap,
+ aViewState,
+ aRenderState);
+ }
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterSlideSorter.hxx b/sdext/source/presenter/PresenterSlideSorter.hxx
new file mode 100644
index 000000000..807bc4399
--- /dev/null
+++ b/sdext/source/presenter/PresenterSlideSorter.hxx
@@ -0,0 +1,189 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERSLIDESORTER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSLIDESORTER_HXX
+
+#include <memory>
+#include "PresenterController.hxx"
+#include "PresenterPaneContainer.hxx"
+#include "PresenterViewFactory.hxx"
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <com/sun/star/awt/XPaintListener.hpp>
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/beans/XPropertyChangeListener.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/drawing/XSlidePreviewCache.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <com/sun/star/drawing/framework/XResourceId.hpp>
+#include <com/sun/star/frame/XController.hpp>
+#include <com/sun/star/geometry/RealRectangle2D.hpp>
+#include <com/sun/star/rendering/XPolyPolygon2D.hpp>
+
+namespace sdext::presenter {
+
+class PresenterButton;
+class PresenterScrollBar;
+
+typedef cppu::WeakComponentImplHelper<
+ css::drawing::framework::XView,
+ css::awt::XWindowListener,
+ css::awt::XPaintListener,
+ css::beans::XPropertyChangeListener,
+ css::drawing::XSlidePreviewCacheListener,
+ css::awt::XMouseListener,
+ css::awt::XMouseMotionListener,
+ css::drawing::XDrawView
+ > PresenterSlideSorterInterfaceBase;
+
+/** A simple slide sorter for the presenter screen. It uses a preview cache
+ to create the slide previews. Painting is done via a canvas.
+*/
+class PresenterSlideSorter
+ : private ::cppu::BaseMutex,
+ public PresenterSlideSorterInterfaceBase,
+ public CachablePresenterView
+{
+public:
+ PresenterSlideSorter (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ virtual ~PresenterSlideSorter() override;
+
+ virtual void SAL_CALL disposing() override;
+
+ // lang::XEventListener
+
+ virtual void SAL_CALL
+ disposing (const css::lang::EventObject& rEventObject) override;
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override;
+
+ // XPaintListener
+
+ virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override;
+
+ // XMouseListener
+
+ virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) override;
+
+ // XMouseMotionListener
+
+ virtual void SAL_CALL mouseMoved (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseDragged (const css::awt::MouseEvent& rEvent) override;
+
+ // XResourceId
+
+ virtual css::uno::Reference<css::drawing::framework::XResourceId> SAL_CALL getResourceId() override;
+
+ virtual sal_Bool SAL_CALL isAnchorOnly() override;
+
+ // XPropertyChangeListener
+
+ virtual void SAL_CALL propertyChange (
+ const css::beans::PropertyChangeEvent& rEvent) override;
+
+ // XSlidePreviewCacheListener
+
+ virtual void SAL_CALL notifyPreviewCreation (
+ sal_Int32 nSlideIndex) override;
+
+ // XDrawView
+
+ virtual void SAL_CALL setCurrentPage (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxSlide) override;
+
+ virtual css::uno::Reference<css::drawing::XDrawPage> SAL_CALL getCurrentPage() override;
+
+private:
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+ css::uno::Reference<css::drawing::framework::XResourceId> mxViewId;
+ css::uno::Reference<css::drawing::framework::XPane> mxPane;
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+ css::uno::Reference<css::awt::XWindow> mxWindow;
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ css::uno::Reference<css::presentation::XSlideShowController> mxSlideShowController;
+ css::uno::Reference<css::drawing::XSlidePreviewCache> mxPreviewCache;
+ bool mbIsLayoutPending;
+ class Layout;
+ std::shared_ptr<Layout> mpLayout;
+ ::rtl::Reference<PresenterScrollBar> mpVerticalScrollBar;
+ ::rtl::Reference<PresenterButton> mpCloseButton;
+ class MouseOverManager;
+ std::unique_ptr<MouseOverManager> mpMouseOverManager;
+ sal_Int32 mnSlideIndexMousePressed;
+ sal_Int32 mnCurrentSlideIndex;
+ sal_Int32 mnSeparatorY;
+ css::util::Color maSeparatorColor;
+ css::awt::Rectangle maCurrentSlideFrameBoundingBox;
+ class CurrentSlideFrameRenderer;
+ std::shared_ptr<CurrentSlideFrameRenderer> mpCurrentSlideFrameRenderer;
+ css::uno::Reference<css::rendering::XPolyPolygon2D> mxPreviewFrame;
+
+ void UpdateLayout();
+ css::geometry::RealRectangle2D PlaceScrollBars (
+ const css::geometry::RealRectangle2D& rUpperBox);
+ void PlaceCloseButton (
+ const PresenterPaneContainer::SharedPaneDescriptor& rpPane,
+ const css::awt::Rectangle& rCenterBox,
+ const sal_Int32 nLeftFrameWidth);
+ void ClearBackground (
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRedrawArea);
+ double GetSlideAspectRatio() const;
+ css::uno::Reference<css::rendering::XBitmap> GetPreview (const sal_Int32 nSlideIndex);
+ void PaintPreview (
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rUpdateBox,
+ const sal_Int32 nSlideIndex);
+ void Paint (const css::awt::Rectangle& rUpdateBox);
+ void SetHorizontalOffset (const double nXOffset);
+ void SetVerticalOffset (const double nYOffset);
+ void GotoSlide (const sal_Int32 nSlideIndex);
+ bool ProvideCanvas();
+
+ /** @throws css::lang::DisposedException when the object has already been
+ disposed.
+ */
+ void ThrowIfDisposed();
+};
+
+} // end of namespace ::sdext::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterSprite.cxx b/sdext/source/presenter/PresenterSprite.cxx
new file mode 100644
index 000000000..0f7c8f829
--- /dev/null
+++ b/sdext/source/presenter/PresenterSprite.cxx
@@ -0,0 +1,163 @@
+/* -*- 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 "PresenterSprite.hxx"
+
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <com/sun/star/rendering/RenderState.hpp>
+#include <com/sun/star/rendering/ViewState.hpp>
+
+using namespace ::com::sun::star;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::UNO_QUERY;
+
+namespace sdext::presenter {
+
+PresenterSprite::PresenterSprite()
+ : maSize(0,0),
+ maLocation(0,0),
+ mbIsVisible(false)
+{
+}
+
+PresenterSprite::~PresenterSprite()
+{
+ if (mxSprite.is())
+ {
+ mxSprite->hide();
+ Reference<lang::XComponent> xComponent (mxSprite, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+ mxSprite = nullptr;
+ }
+}
+
+void PresenterSprite::SetFactory (
+ const css::uno::Reference<css::rendering::XSpriteCanvas>& rxSpriteFactory)
+{
+ if (mxSpriteFactory != rxSpriteFactory)
+ {
+ DisposeSprite();
+ mxSpriteFactory = rxSpriteFactory;
+ if (mbIsVisible)
+ ProvideSprite();
+ }
+}
+
+css::uno::Reference<css::rendering::XCanvas> PresenterSprite::GetCanvas()
+{
+ ProvideSprite();
+ if (mxSprite.is())
+ return mxSprite->getContentCanvas();
+ else
+ return nullptr;
+}
+
+void PresenterSprite::Show()
+{
+ mbIsVisible = true;
+ if (mxSprite.is())
+ mxSprite->show();
+ else
+ ProvideSprite();
+}
+
+void PresenterSprite::Hide()
+{
+ mbIsVisible = false;
+ if (mxSprite.is())
+ mxSprite->hide();
+}
+
+void PresenterSprite::Resize (const css::geometry::RealSize2D& rSize)
+{
+ maSize = rSize;
+ if (mxSprite.is())
+ DisposeSprite();
+ if (mbIsVisible)
+ ProvideSprite();
+}
+
+void PresenterSprite::MoveTo (const css::geometry::RealPoint2D& rLocation)
+{
+ maLocation = rLocation;
+ if (mxSprite.is())
+ mxSprite->move(
+ maLocation,
+ rendering::ViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr),
+ rendering::RenderState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr,
+ uno::Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE)
+ );
+}
+
+void PresenterSprite::Update()
+{
+ if (mxSpriteFactory.is())
+ mxSpriteFactory->updateScreen(false);
+}
+
+void PresenterSprite::ProvideSprite()
+{
+ if ( !(! mxSprite.is()
+ && mxSpriteFactory.is()
+ && maSize.Width>0
+ && maSize.Height>0))
+ return;
+
+ mxSprite = mxSpriteFactory->createCustomSprite(maSize);
+ if (!mxSprite.is())
+ return;
+
+ mxSprite->move(maLocation,
+ rendering::ViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr),
+ rendering::RenderState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr,
+ uno::Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE)
+ );
+ mxSprite->setAlpha(1.0);
+ mxSprite->setPriority(0);
+ if (mbIsVisible)
+ mxSprite->show();
+}
+
+void PresenterSprite::DisposeSprite()
+{
+ if (mxSprite.is())
+ {
+ mxSprite->hide();
+ Reference<lang::XComponent> xComponent (mxSprite, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+ mxSprite = nullptr;
+ }
+}
+
+} //end of namespace sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterSprite.hxx b/sdext/source/presenter/PresenterSprite.hxx
new file mode 100644
index 000000000..b550ec0a8
--- /dev/null
+++ b/sdext/source/presenter/PresenterSprite.hxx
@@ -0,0 +1,73 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERSPRITE_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERSPRITE_HXX
+
+#include <com/sun/star/rendering/XCustomSprite.hpp>
+#include <com/sun/star/rendering/XSpriteCanvas.hpp>
+
+namespace sdext::presenter
+{
+/** A wrapper around a css::rendering::XCustomSprite that allows
+ not only setting values like size, location, and transformation but also
+ provides read access to them.
+ It also handles the showing and hiding of a sprite. This includes not
+ to show the sprite when its size is not yet defined (results in a crash)
+ and hiding a sprite before disposing it (results in zombie sprites.)
+*/
+class PresenterSprite final
+{
+public:
+ PresenterSprite();
+ ~PresenterSprite();
+ PresenterSprite(const PresenterSprite&) = delete;
+ PresenterSprite& operator=(const PresenterSprite&) = delete;
+
+ /** The given sprite canvas is used as factory to create the sprite that
+ is wrapped by objects of this class.
+ It is also used to call updateScreen() at (wrapped by the Update() method).
+ */
+ void SetFactory(const css::uno::Reference<css::rendering::XSpriteCanvas>& rxSpriteFactory);
+
+ css::uno::Reference<css::rendering::XCanvas> GetCanvas();
+
+ void Show();
+ void Hide();
+
+ void Resize(const css::geometry::RealSize2D& rSize);
+ void MoveTo(const css::geometry::RealPoint2D& rLocation);
+
+ void Update();
+
+private:
+ css::uno::Reference<css::rendering::XSpriteCanvas> mxSpriteFactory;
+ css::uno::Reference<css::rendering::XCustomSprite> mxSprite;
+ css::geometry::RealSize2D maSize;
+ css::geometry::RealPoint2D maLocation;
+ bool mbIsVisible;
+
+ void ProvideSprite();
+ void DisposeSprite();
+};
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterSpritePane.cxx b/sdext/source/presenter/PresenterSpritePane.cxx
new file mode 100644
index 000000000..452e633a2
--- /dev/null
+++ b/sdext/source/presenter/PresenterSpritePane.cxx
@@ -0,0 +1,172 @@
+/* -*- 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 "PresenterSpritePane.hxx"
+#include <com/sun/star/lang/XMultiComponentFactory.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sdext::presenter {
+
+//===== PresenterSpritePane =========================================================
+
+PresenterSpritePane::PresenterSpritePane (const Reference<XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterPaneBase(rxContext, rpPresenterController),
+ mpSprite(std::make_shared<PresenterSprite>())
+{
+ Reference<lang::XMultiComponentFactory> xFactory (
+ mxComponentContext->getServiceManager(), UNO_SET_THROW);
+ mxPresenterHelper.set(
+ xFactory->createInstanceWithContext(
+ "com.sun.star.comp.Draw.PresenterHelper",
+ mxComponentContext),
+ UNO_QUERY_THROW);
+}
+
+PresenterSpritePane::~PresenterSpritePane()
+{
+}
+
+void PresenterSpritePane::disposing()
+{
+ mpSprite->SetFactory(nullptr);
+ mxParentCanvas = nullptr;
+ PresenterPaneBase::disposing();
+}
+
+//----- XPane -----------------------------------------------------------------
+
+Reference<awt::XWindow> SAL_CALL PresenterSpritePane::getWindow()
+{
+ ThrowIfDisposed();
+ return mxContentWindow;
+}
+
+Reference<rendering::XCanvas> SAL_CALL PresenterSpritePane::getCanvas()
+{
+ ThrowIfDisposed();
+
+ if ( ! mxContentCanvas.is())
+ UpdateCanvases();
+
+ return mxContentCanvas;
+}
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL PresenterSpritePane::windowResized (const awt::WindowEvent& rEvent)
+{
+ PresenterPaneBase::windowResized(rEvent);
+
+ mpSprite->Resize(geometry::RealSize2D(rEvent.Width, rEvent.Height));
+ LayoutContextWindow();
+ UpdateCanvases();
+}
+
+void SAL_CALL PresenterSpritePane::windowMoved (const awt::WindowEvent& rEvent)
+{
+ PresenterPaneBase::windowMoved(rEvent);
+
+ awt::Rectangle aBox (
+ mxPresenterHelper->getWindowExtentsRelative(mxBorderWindow, mxParentWindow));
+ mpSprite->MoveTo(geometry::RealPoint2D(aBox.X, aBox.Y));
+ mpSprite->Update();
+}
+
+void SAL_CALL PresenterSpritePane::windowShown (const lang::EventObject& rEvent)
+{
+ PresenterPaneBase::windowShown(rEvent);
+
+ mpSprite->Show();
+ ToTop();
+
+ if (mxContentWindow.is())
+ {
+ LayoutContextWindow();
+ mxContentWindow->setVisible(true);
+ }
+}
+
+void SAL_CALL PresenterSpritePane::windowHidden (const lang::EventObject& rEvent)
+{
+ PresenterPaneBase::windowHidden(rEvent);
+
+ mpSprite->Hide();
+ if (mxContentWindow.is())
+ mxContentWindow->setVisible(false);
+}
+
+//----- XPaintListener --------------------------------------------------------
+
+void SAL_CALL PresenterSpritePane::windowPaint (const awt::PaintEvent&)
+{
+ ThrowIfDisposed();
+
+ /*
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxParentCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ xSpriteCanvas->updateScreen(sal_False);
+ */
+}
+
+
+void PresenterSpritePane::UpdateCanvases()
+{
+ Reference<XComponent> xContentCanvasComponent (mxContentCanvas, UNO_QUERY);
+ if (xContentCanvasComponent.is())
+ xContentCanvasComponent->dispose();
+
+ // The border canvas is the content canvas of the sprite.
+ mxBorderCanvas = mpSprite->GetCanvas();
+
+ // The content canvas is a wrapper of the border canvas.
+ if (mxBorderCanvas.is())
+ mxContentCanvas = mxPresenterHelper->createSharedCanvas(
+ mxParentCanvas,
+ mxParentWindow,
+ mxBorderCanvas,
+ mxBorderWindow,
+ mxContentWindow);
+
+ const awt::Rectangle aWindowBox (mxBorderWindow->getPosSize());
+ PaintBorder(awt::Rectangle(0,0,aWindowBox.Width,aWindowBox.Height));
+}
+
+void PresenterSpritePane::CreateCanvases (
+ const css::uno::Reference<css::rendering::XSpriteCanvas>& rxParentCanvas)
+{
+ OSL_ASSERT(!mxParentCanvas.is() || mxParentCanvas==rxParentCanvas);
+ mxParentCanvas = rxParentCanvas;
+
+ mpSprite->SetFactory(mxParentCanvas);
+ if (mxBorderWindow.is())
+ {
+ const awt::Rectangle aBorderBox (mxBorderWindow->getPosSize());
+ mpSprite->Resize(geometry::RealSize2D(aBorderBox.Width, aBorderBox.Height));
+ }
+
+ UpdateCanvases();
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterSpritePane.hxx b/sdext/source/presenter/PresenterSpritePane.hxx
new file mode 100644
index 000000000..1c2c923b9
--- /dev/null
+++ b/sdext/source/presenter/PresenterSpritePane.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/.
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "PresenterPaneBase.hxx"
+#include "PresenterSprite.hxx"
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/rendering/XCanvas.hpp>
+#include <com/sun/star/rendering/XSpriteCanvas.hpp>
+#include <rtl/ref.hxx>
+#include <memory>
+
+namespace sdext::presenter
+{
+/** Use a sprite to display the contents and the border of a pane. Windows
+ are still used to define the locations and sizes of both the border and
+ the pane content. Note that every resize results in a disposed canvas.
+ Therefore call getCanvas in every repaint or at least after every resize.
+*/
+class PresenterSpritePane : public PresenterPaneBase
+{
+public:
+ PresenterSpritePane(const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ virtual ~PresenterSpritePane() override;
+
+ virtual void SAL_CALL disposing() override;
+
+ using PresenterPaneBase::disposing;
+
+ // XPane
+
+ virtual css::uno::Reference<css::awt::XWindow> SAL_CALL getWindow() override;
+
+ virtual css::uno::Reference<css::rendering::XCanvas> SAL_CALL getCanvas() override;
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized(const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved(const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown(const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden(const css::lang::EventObject& rEvent) override;
+
+ // XPaintListener
+
+ virtual void SAL_CALL windowPaint(const css::awt::PaintEvent& rEvent) override;
+
+private:
+ css::uno::Reference<css::rendering::XSpriteCanvas> mxParentCanvas;
+ std::shared_ptr<PresenterSprite> mpSprite;
+
+ virtual void CreateCanvases(
+ const css::uno::Reference<css::rendering::XSpriteCanvas>& rxParentCanvas) override;
+ void UpdateCanvases();
+};
+
+} // end of namespace ::sd::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterTextView.cxx b/sdext/source/presenter/PresenterTextView.cxx
new file mode 100644
index 000000000..d83229b88
--- /dev/null
+++ b/sdext/source/presenter/PresenterTextView.cxx
@@ -0,0 +1,1192 @@
+/* -*- 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 "PresenterTextView.hxx"
+#include "PresenterCanvasHelper.hxx"
+#include "PresenterGeometryHelper.hxx"
+#include "PresenterTimer.hxx"
+
+#include <algorithm>
+#include <cmath>
+#include <numeric>
+
+#include <com/sun/star/accessibility/AccessibleTextType.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/i18n/BreakIterator.hpp>
+#include <com/sun/star/i18n/CharacterIteratorMode.hpp>
+#include <com/sun/star/i18n/ScriptDirection.hpp>
+#include <com/sun/star/i18n/WordType.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <com/sun/star/rendering/TextDirection.hpp>
+#include <com/sun/star/text/WritingMode2.hpp>
+#include <o3tl/safeint.hxx>
+#include <tools/diagnose_ex.h>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::accessibility;
+using namespace ::com::sun::star::uno;
+
+const sal_Int64 CaretBlinkInterval = 500 * 1000 * 1000;
+
+//#define SHOW_CHARACTER_BOXES
+
+namespace {
+ sal_Int32 Signum (const sal_Int32 nValue)
+ {
+ if (nValue < 0)
+ return -1;
+ else if (nValue > 0)
+ return +1;
+ else
+ return 0;
+ }
+}
+
+namespace sdext::presenter {
+
+//===== PresenterTextView =====================================================
+
+PresenterTextView::PresenterTextView (
+ const Reference<XComponentContext>& rxContext,
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const ::std::function<void (const css::awt::Rectangle&)>& rInvalidator)
+ : mxCanvas(rxCanvas),
+ maLocation(0,0),
+ maSize(0,0),
+ mpCaret(std::make_shared<PresenterTextCaret>(
+ rxContext,
+ [this] (sal_Int32 const nParagraphIndex, sal_Int32 const nCharacterIndex)
+ { return this->GetCaretBounds(nParagraphIndex, nCharacterIndex); },
+ rInvalidator)),
+ mnLeftOffset(0),
+ mnTopOffset(0),
+ mbIsFormatPending(false)
+{
+ Reference<lang::XMultiComponentFactory> xFactory =
+ rxContext->getServiceManager();
+ if ( ! xFactory.is())
+ return;
+
+ // Create the break iterator that we use to break text into lines.
+ mxBreakIterator = i18n::BreakIterator::create(rxContext);
+
+ // Create the script type detector that is used to split paragraphs into
+ // portions of the same text direction.
+ mxScriptTypeDetector.set(
+ xFactory->createInstanceWithContext(
+ "com.sun.star.i18n.ScriptTypeDetector",
+ rxContext),
+ UNO_QUERY_THROW);
+}
+
+void PresenterTextView::SetText (const Reference<text::XText>& rxText)
+{
+ maParagraphs.clear();
+
+ Reference<container::XEnumerationAccess> xParagraphAccess (rxText, UNO_QUERY);
+ if ( ! xParagraphAccess.is())
+ return;
+
+ Reference<container::XEnumeration> xParagraphs =
+ xParagraphAccess->createEnumeration();
+ if ( ! xParagraphs.is())
+ return;
+
+ if ( ! mpFont || ! mpFont->PrepareFont(mxCanvas))
+ return;
+
+ sal_Int32 nCharacterCount (0);
+ while (xParagraphs->hasMoreElements())
+ {
+ SharedPresenterTextParagraph pParagraph = std::make_shared<PresenterTextParagraph>(
+ maParagraphs.size(),
+ mxBreakIterator,
+ mxScriptTypeDetector,
+ Reference<text::XTextRange>(xParagraphs->nextElement(), UNO_QUERY),
+ mpCaret);
+ pParagraph->SetupCellArray(mpFont);
+ pParagraph->SetCharacterOffset(nCharacterCount);
+ nCharacterCount += pParagraph->GetCharacterCount();
+ maParagraphs.push_back(pParagraph);
+ }
+
+ if (mpCaret)
+ mpCaret->HideCaret();
+
+ RequestFormat();
+}
+
+void PresenterTextView::SetTextChangeBroadcaster (
+ const ::std::function<void ()>& rBroadcaster)
+{
+ maTextChangeBroadcaster = rBroadcaster;
+}
+
+void PresenterTextView::SetLocation (const css::geometry::RealPoint2D& rLocation)
+{
+ maLocation = rLocation;
+
+ for (auto& rxParagraph : maParagraphs)
+ {
+ rxParagraph->SetOrigin(
+ maLocation.X - mnLeftOffset,
+ maLocation.Y - mnTopOffset);
+ }
+}
+
+void PresenterTextView::SetSize (const css::geometry::RealSize2D& rSize)
+{
+ maSize = rSize;
+ RequestFormat();
+}
+
+double PresenterTextView::GetTotalTextHeight()
+{
+ if (mbIsFormatPending)
+ {
+ if ( ! mpFont->PrepareFont(mxCanvas))
+ return 0;
+ Format();
+ }
+
+ return std::accumulate(maParagraphs.begin(), maParagraphs.end(), double(0),
+ [](const double& nTotalHeight, const SharedPresenterTextParagraph& rxParagraph) {
+ return nTotalHeight + rxParagraph->GetTotalTextHeight();
+ });
+}
+
+void PresenterTextView::SetFont (const PresenterTheme::SharedFontDescriptor& rpFont)
+{
+ mpFont = rpFont;
+ RequestFormat();
+}
+
+void PresenterTextView::SetOffset(
+ const double nLeft,
+ const double nTop)
+{
+ mnLeftOffset = nLeft;
+ mnTopOffset = nTop;
+
+ // Trigger an update of the text origin stored at the individual paragraphs.
+ SetLocation(maLocation);
+}
+
+void PresenterTextView::MoveCaret (
+ const sal_Int32 nDistance,
+ const sal_Int16 nTextType)
+{
+ if ( ! mpCaret)
+ return;
+
+ // When the caret has not been visible yet then move it to the beginning
+ // of the text.
+ if (mpCaret->GetParagraphIndex() < 0)
+ {
+ mpCaret->SetPosition(0,0);
+ return;
+ }
+
+ sal_Int32 nParagraphIndex (mpCaret->GetParagraphIndex());
+ sal_Int32 nCharacterIndex (mpCaret->GetCharacterIndex());
+ switch (nTextType)
+ {
+ default:
+ case AccessibleTextType::CHARACTER:
+ nCharacterIndex += nDistance;
+ break;
+
+ case AccessibleTextType::WORD:
+ {
+ sal_Int32 nRemainingDistance (nDistance);
+ while (nRemainingDistance != 0)
+ {
+ SharedPresenterTextParagraph pParagraph (GetParagraph(nParagraphIndex));
+ if (pParagraph)
+ {
+ const sal_Int32 nDelta (Signum(nDistance));
+ nCharacterIndex = pParagraph->GetWordBoundary(nCharacterIndex, nDelta);
+ if (nCharacterIndex < 0)
+ {
+ // Go to previous or next paragraph.
+ nParagraphIndex += nDelta;
+ if (nParagraphIndex < 0)
+ {
+ nParagraphIndex = 0;
+ nCharacterIndex = 0;
+ nRemainingDistance = 0;
+ }
+ else if (o3tl::make_unsigned(nParagraphIndex) >= maParagraphs.size())
+ {
+ nParagraphIndex = maParagraphs.size()-1;
+ pParagraph = GetParagraph(nParagraphIndex);
+ if (pParagraph)
+ nCharacterIndex = pParagraph->GetCharacterCount();
+ nRemainingDistance = 0;
+ }
+ else
+ {
+ nRemainingDistance -= nDelta;
+
+ // Move caret one character to the end of
+ // the previous or the start of the next paragraph.
+ pParagraph = GetParagraph(nParagraphIndex);
+ if (pParagraph)
+ {
+ if (nDistance<0)
+ nCharacterIndex = pParagraph->GetCharacterCount();
+ else
+ nCharacterIndex = 0;
+ }
+ }
+ }
+ else
+ nRemainingDistance -= nDelta;
+ }
+ else
+ break;
+ }
+ break;
+ }
+ }
+
+ // Move the caret to the new position.
+ mpCaret->SetPosition(nParagraphIndex, nCharacterIndex);
+}
+
+void PresenterTextView::Paint (
+ const css::awt::Rectangle& rUpdateBox)
+{
+ if ( ! mxCanvas.is())
+ return;
+ if ( ! mpFont->PrepareFont(mxCanvas))
+ return;
+
+ if (mbIsFormatPending)
+ Format();
+
+ // Setup the clipping rectangle. Horizontally we make it a little
+ // larger to allow characters (and the caret) to stick out of their
+ // bounding boxes. This can happen on some characters (like the
+ // uppercase J) for typographical reasons.
+ const sal_Int32 nAdditionalLeftBorder (10);
+ const sal_Int32 nAdditionalRightBorder (5);
+ double nX (maLocation.X - mnLeftOffset);
+ double nY (maLocation.Y - mnTopOffset);
+ const sal_Int32 nClipLeft (::std::max(
+ PresenterGeometryHelper::Round(maLocation.X)-nAdditionalLeftBorder, rUpdateBox.X));
+ const sal_Int32 nClipTop (::std::max(
+ PresenterGeometryHelper::Round(maLocation.Y), rUpdateBox.Y));
+ const sal_Int32 nClipRight (::std::min(
+ PresenterGeometryHelper::Round(maLocation.X+maSize.Width)+nAdditionalRightBorder, rUpdateBox.X+rUpdateBox.Width));
+ const sal_Int32 nClipBottom (::std::min(
+ PresenterGeometryHelper::Round(maLocation.Y+maSize.Height), rUpdateBox.Y+rUpdateBox.Height));
+ if (nClipLeft>=nClipRight || nClipTop>=nClipBottom)
+ return;
+
+ const awt::Rectangle aClipBox(
+ nClipLeft,
+ nClipTop,
+ nClipRight - nClipLeft,
+ nClipBottom - nClipTop);
+ Reference<rendering::XPolyPolygon2D> xClipPolygon (
+ PresenterGeometryHelper::CreatePolygon(aClipBox, mxCanvas->getDevice()));
+
+ const rendering::ViewState aViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ xClipPolygon);
+
+ rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(1,0,nX, 0,1,nY),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, mpFont->mnColor);
+
+ for (const auto& rxParagraph : maParagraphs)
+ {
+ rxParagraph->Paint(
+ mxCanvas,
+ maSize,
+ mpFont,
+ aViewState,
+ aRenderState,
+ mnTopOffset,
+ nClipTop,
+ nClipBottom);
+ }
+
+ aRenderState.AffineTransform.m02 = 0;
+ aRenderState.AffineTransform.m12 = 0;
+
+#ifdef SHOW_CHARACTER_BOXES
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, 0x00808080);
+ for (sal_Int32 nParagraphIndex(0), nParagraphCount(GetParagraphCount());
+ nParagraphIndex<nParagraphCount;
+ ++nParagraphIndex)
+ {
+ const SharedPresenterTextParagraph pParagraph (GetParagraph(nParagraphIndex));
+ if ( ! pParagraph)
+ continue;
+ for (sal_Int32 nCharacterIndex(0),nCharacterCount(pParagraph->GetCharacterCount());
+ nCharacterIndex<nCharacterCount; ++nCharacterIndex)
+ {
+ const awt::Rectangle aBox (pParagraph->GetCharacterBounds(nCharacterIndex, false));
+ mxCanvas->drawPolyPolygon (
+ PresenterGeometryHelper::CreatePolygon(
+ aBox,
+ mxCanvas->getDevice()),
+ aViewState,
+ aRenderState);
+ }
+ }
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, mpFont->mnColor);
+#endif
+
+ if (mpCaret && mpCaret->IsVisible())
+ {
+ mxCanvas->fillPolyPolygon (
+ PresenterGeometryHelper::CreatePolygon(
+ mpCaret->GetBounds(),
+ mxCanvas->getDevice()),
+ aViewState,
+ aRenderState);
+ }
+}
+
+const SharedPresenterTextCaret& PresenterTextView::GetCaret() const
+{
+ return mpCaret;
+}
+
+awt::Rectangle PresenterTextView::GetCaretBounds (
+ sal_Int32 nParagraphIndex,
+ const sal_Int32 nCharacterIndex) const
+{
+ SharedPresenterTextParagraph pParagraph (GetParagraph(nParagraphIndex));
+
+ if (pParagraph)
+ return pParagraph->GetCharacterBounds(nCharacterIndex, true);
+ else
+ return awt::Rectangle(0,0,0,0);
+}
+
+//----- private ---------------------------------------------------------------
+
+void PresenterTextView::RequestFormat()
+{
+ mbIsFormatPending = true;
+}
+
+void PresenterTextView::Format()
+{
+ mbIsFormatPending = false;
+
+ double nY (0);
+ for (const auto& rxParagraph : maParagraphs)
+ {
+ rxParagraph->Format(nY, maSize.Width, mpFont);
+ nY += rxParagraph->GetTotalTextHeight();
+ }
+
+ if (maTextChangeBroadcaster)
+ maTextChangeBroadcaster();
+}
+
+sal_Int32 PresenterTextView::GetParagraphCount() const
+{
+ return maParagraphs.size();
+}
+
+SharedPresenterTextParagraph PresenterTextView::GetParagraph (
+ const sal_Int32 nParagraphIndex) const
+{
+ if (nParagraphIndex < 0)
+ return SharedPresenterTextParagraph();
+ else if (o3tl::make_unsigned(nParagraphIndex)>=maParagraphs.size())
+ return SharedPresenterTextParagraph();
+ else
+ return maParagraphs[nParagraphIndex];
+}
+
+//===== PresenterTextParagraph ================================================
+
+PresenterTextParagraph::PresenterTextParagraph (
+ const sal_Int32 nParagraphIndex,
+ const Reference<i18n::XBreakIterator>& rxBreakIterator,
+ const Reference<i18n::XScriptTypeDetector>& rxScriptTypeDetector,
+ const Reference<text::XTextRange>& rxTextRange,
+ const SharedPresenterTextCaret& rpCaret)
+ : mnParagraphIndex(nParagraphIndex),
+ mpCaret(rpCaret),
+ mxBreakIterator(rxBreakIterator),
+ mxScriptTypeDetector(rxScriptTypeDetector),
+ mnVerticalOffset(0),
+ mnXOrigin(0),
+ mnYOrigin(0),
+ mnWidth(0),
+ mnAscent(0),
+ mnDescent(0),
+ mnLineHeight(-1),
+ mnWritingMode (text::WritingMode2::LR_TB),
+ mnCharacterOffset(0)
+{
+ if (!rxTextRange.is())
+ return;
+
+ Reference<beans::XPropertySet> xProperties (rxTextRange, UNO_QUERY);
+ try
+ {
+ xProperties->getPropertyValue("WritingMode") >>= mnWritingMode;
+ }
+ catch(beans::UnknownPropertyException&)
+ {
+ // Ignore the exception. Use the default value.
+ }
+
+ msParagraphText = rxTextRange->getString();
+}
+
+void PresenterTextParagraph::Paint (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const geometry::RealSize2D& rSize,
+ const PresenterTheme::SharedFontDescriptor& rpFont,
+ const rendering::ViewState& rViewState,
+ rendering::RenderState& rRenderState,
+ const double nTopOffset,
+ const double nClipTop,
+ const double nClipBottom)
+{
+ if (mnLineHeight <= 0)
+ return;
+
+ sal_Int8 nTextDirection (GetTextDirection());
+
+ const double nSavedM12 (rRenderState.AffineTransform.m12);
+
+ if ( ! IsTextReferencePointLeft())
+ rRenderState.AffineTransform.m02 += rSize.Width;
+
+#ifdef SHOW_CHARACTER_BOXES
+ for (sal_Int32 nIndex=0,nCount=maLines.size();
+ nIndex<nCount;
+ ++nIndex)
+ {
+ Line& rLine (maLines[nIndex]);
+ rLine.ProvideLayoutedLine(msParagraphText, rpFont, nTextDirection);
+ }
+#endif
+
+ for (sal_Int32 nIndex=0,nCount=maLines.size();
+ nIndex<nCount;
+ ++nIndex, rRenderState.AffineTransform.m12 += mnLineHeight)
+ {
+ Line& rLine (maLines[nIndex]);
+
+ // Paint only visible lines.
+ const double nLineTop = rLine.mnBaseLine - mnAscent - nTopOffset;
+ if (nLineTop + mnLineHeight< nClipTop)
+ continue;
+ else if (nLineTop > nClipBottom)
+ break;
+ rLine.ProvideLayoutedLine(msParagraphText, rpFont, nTextDirection);
+
+ rRenderState.AffineTransform.m12 = nSavedM12 + rLine.mnBaseLine;
+
+ rxCanvas->drawTextLayout (
+ rLine.mxLayoutedLine,
+ rViewState,
+ rRenderState);
+ }
+ rRenderState.AffineTransform.m12 = nSavedM12;
+
+ if ( ! IsTextReferencePointLeft())
+ rRenderState.AffineTransform.m02 -= rSize.Width;
+}
+
+void PresenterTextParagraph::Format (
+ const double nY,
+ const double nWidth,
+ const PresenterTheme::SharedFontDescriptor& rpFont)
+{
+ // Make sure that the text view is in a valid and sane state.
+ if ( ! mxBreakIterator.is() || ! mxScriptTypeDetector.is())
+ return;
+ if (nWidth<=0)
+ return;
+ if ( ! rpFont || ! rpFont->mxFont.is())
+ return;
+
+ sal_Int32 nPosition (0);
+
+ mnWidth = nWidth;
+ maLines.clear();
+ mnLineHeight = 0;
+ mnAscent = 0;
+ mnDescent = 0;
+ mnVerticalOffset = nY;
+ maWordBoundaries.clear();
+ maWordBoundaries.push_back(0);
+
+ const rendering::FontMetrics aMetrics (rpFont->mxFont->getFontMetrics());
+ mnAscent = aMetrics.Ascent;
+ mnDescent = aMetrics.Descent;
+ mnLineHeight = aMetrics.Ascent + aMetrics.Descent + aMetrics.ExternalLeading;
+ nPosition = 0;
+ i18n::Boundary aCurrentLine(0,0);
+ while (true)
+ {
+ const i18n::Boundary aWordBoundary = mxBreakIterator->nextWord(
+ msParagraphText,
+ nPosition,
+ lang::Locale(),
+ i18n::WordType::ANYWORD_IGNOREWHITESPACES);
+ AddWord(nWidth, aCurrentLine, aWordBoundary.startPos, rpFont);
+
+ // Remember the new word boundary for caret travelling by words.
+ // Prevent duplicates.
+ if (aWordBoundary.startPos > maWordBoundaries.back())
+ maWordBoundaries.push_back(aWordBoundary.startPos);
+
+ if (aWordBoundary.endPos>aWordBoundary.startPos)
+ AddWord(nWidth, aCurrentLine, aWordBoundary.endPos, rpFont);
+
+ if (aWordBoundary.startPos<0 || aWordBoundary.endPos<0)
+ break;
+ if (nPosition >= aWordBoundary.endPos)
+ break;
+ nPosition = aWordBoundary.endPos;
+ }
+
+ if (aCurrentLine.endPos>aCurrentLine.startPos)
+ AddLine(aCurrentLine);
+
+}
+
+sal_Int32 PresenterTextParagraph::GetWordBoundary(
+ const sal_Int32 nLocalCharacterIndex,
+ const sal_Int32 nDistance)
+{
+ OSL_ASSERT(nDistance==-1 || nDistance==+1);
+
+ if (nLocalCharacterIndex < 0)
+ {
+ // The caller asked for the start or end position of the paragraph.
+ if (nDistance < 0)
+ return 0;
+ else
+ return GetCharacterCount();
+ }
+
+ sal_Int32 nIndex (0);
+ for (sal_Int32 nCount (maWordBoundaries.size()); nIndex<nCount; ++nIndex)
+ {
+ if (maWordBoundaries[nIndex] >= nLocalCharacterIndex)
+ {
+ // When inside the word (not at its start or end) then
+ // first move to the start or end before going the previous or
+ // next word.
+ if (maWordBoundaries[nIndex] > nLocalCharacterIndex)
+ if (nDistance > 0)
+ --nIndex;
+ break;
+ }
+ }
+
+ nIndex += nDistance;
+
+ if (nIndex < 0)
+ return -1;
+ else if (o3tl::make_unsigned(nIndex)>=maWordBoundaries.size())
+ return -1;
+ else
+ return maWordBoundaries[nIndex];
+}
+
+sal_Int32 PresenterTextParagraph::GetCaretPosition() const
+{
+ if (mpCaret && mpCaret->GetParagraphIndex()==mnParagraphIndex)
+ return mpCaret->GetCharacterIndex();
+ else
+ return -1;
+}
+
+void PresenterTextParagraph::SetCaretPosition (const sal_Int32 nPosition) const
+{
+ if (mpCaret && mpCaret->GetParagraphIndex()==mnParagraphIndex)
+ return mpCaret->SetPosition(mnParagraphIndex, nPosition);
+}
+
+void PresenterTextParagraph::SetOrigin (const double nXOrigin, const double nYOrigin)
+{
+ mnXOrigin = nXOrigin;
+ mnYOrigin = nYOrigin;
+}
+
+awt::Point PresenterTextParagraph::GetRelativeLocation() const
+{
+ return awt::Point(
+ sal_Int32(mnXOrigin),
+ sal_Int32(mnYOrigin + mnVerticalOffset));
+}
+
+awt::Size PresenterTextParagraph::GetSize() const
+{
+ return awt::Size(
+ sal_Int32(mnWidth),
+ sal_Int32(GetTotalTextHeight()));
+}
+
+void PresenterTextParagraph::AddWord (
+ const double nWidth,
+ i18n::Boundary& rCurrentLine,
+ const sal_Int32 nWordBoundary,
+ const PresenterTheme::SharedFontDescriptor& rpFont)
+{
+ sal_Int32 nLineStart (0);
+ if ( ! maLines.empty())
+ nLineStart = rCurrentLine.startPos;
+
+ const OUString sLineCandidate (
+ msParagraphText.copy(nLineStart, nWordBoundary-nLineStart));
+
+ css::geometry::RealRectangle2D aLineBox (
+ PresenterCanvasHelper::GetTextBoundingBox (
+ rpFont->mxFont,
+ sLineCandidate,
+ mnWritingMode));
+ const double nLineWidth (aLineBox.X2 - aLineBox.X1);
+
+ if (nLineWidth >= nWidth)
+ {
+ // Add new line with a single word (so far).
+ AddLine(rCurrentLine);
+ }
+ rCurrentLine.endPos = nWordBoundary;
+}
+
+void PresenterTextParagraph::AddLine (
+ i18n::Boundary& rCurrentLine)
+{
+ Line aLine (rCurrentLine.startPos, rCurrentLine.endPos);
+
+ // Find the start and end of the line with respect to cells.
+ if (!maLines.empty())
+ {
+ aLine.mnLineStartCellIndex = maLines.back().mnLineEndCellIndex;
+ aLine.mnBaseLine = maLines.back().mnBaseLine + mnLineHeight;
+ }
+ else
+ {
+ aLine.mnLineStartCellIndex = 0;
+ aLine.mnBaseLine = mnVerticalOffset + mnAscent;
+ }
+ sal_Int32 nCellIndex (aLine.mnLineStartCellIndex);
+ double nWidth (0);
+ for ( ; nCellIndex<sal_Int32(maCells.size()); ++nCellIndex)
+ {
+ const Cell& rCell (maCells[nCellIndex]);
+ if (rCell.mnCharacterIndex+rCell.mnCharacterCount > aLine.mnLineEndCharacterIndex)
+ break;
+ nWidth += rCell.mnCellWidth;
+ }
+ aLine.mnLineEndCellIndex = nCellIndex;
+ aLine.mnWidth = nWidth;
+
+ maLines.push_back(aLine);
+
+ rCurrentLine.startPos = rCurrentLine.endPos;
+}
+
+double PresenterTextParagraph::GetTotalTextHeight() const
+{
+ return maLines.size() * mnLineHeight;
+}
+
+void PresenterTextParagraph::SetCharacterOffset (const sal_Int32 nCharacterOffset)
+{
+ mnCharacterOffset = nCharacterOffset;
+}
+
+sal_Int32 PresenterTextParagraph::GetCharacterCount() const
+{
+ return msParagraphText.getLength();
+}
+
+sal_Unicode PresenterTextParagraph::GetCharacter (
+ const sal_Int32 nGlobalCharacterIndex) const
+{
+ if (nGlobalCharacterIndex<mnCharacterOffset
+ || nGlobalCharacterIndex>=mnCharacterOffset+msParagraphText.getLength())
+ {
+ return sal_Unicode();
+ }
+ else
+ {
+ return msParagraphText[nGlobalCharacterIndex - mnCharacterOffset];
+ }
+}
+
+const OUString& PresenterTextParagraph::GetText() const
+{
+ return msParagraphText;
+}
+
+TextSegment PresenterTextParagraph::GetTextSegment (
+ const sal_Int32 nOffset,
+ const sal_Int32 nIndex,
+ const sal_Int16 nTextType) const
+{
+ switch(nTextType)
+ {
+ case AccessibleTextType::PARAGRAPH:
+ return TextSegment(
+ msParagraphText,
+ mnCharacterOffset,
+ mnCharacterOffset+msParagraphText.getLength());
+
+ case AccessibleTextType::SENTENCE:
+ if (mxBreakIterator.is())
+ {
+ const sal_Int32 nStart (mxBreakIterator->beginOfSentence(
+ msParagraphText, nIndex-mnCharacterOffset, lang::Locale()));
+ const sal_Int32 nEnd (mxBreakIterator->endOfSentence(
+ msParagraphText, nIndex-mnCharacterOffset, lang::Locale()));
+ if (nStart < nEnd)
+ return TextSegment(
+ msParagraphText.copy(nStart, nEnd-nStart),
+ nStart+mnCharacterOffset,
+ nEnd+mnCharacterOffset);
+ }
+ break;
+
+ case AccessibleTextType::WORD:
+ if (mxBreakIterator.is())
+ return GetWordTextSegment(nOffset, nIndex);
+ break;
+
+ case AccessibleTextType::LINE:
+ {
+ auto iLine = std::find_if(maLines.begin(), maLines.end(),
+ [nIndex](const Line& rLine) { return nIndex < rLine.mnLineEndCharacterIndex; });
+ if (iLine != maLines.end())
+ {
+ return TextSegment(
+ msParagraphText.copy(
+ iLine->mnLineStartCharacterIndex,
+ iLine->mnLineEndCharacterIndex - iLine->mnLineStartCharacterIndex),
+ iLine->mnLineStartCharacterIndex,
+ iLine->mnLineEndCharacterIndex);
+ }
+ }
+ break;
+
+ // Handle GLYPH and ATTRIBUTE_RUN like CHARACTER because we can not
+ // do better at the moment.
+ case AccessibleTextType::CHARACTER:
+ case AccessibleTextType::GLYPH:
+ case AccessibleTextType::ATTRIBUTE_RUN:
+ return CreateTextSegment(nIndex+nOffset, nIndex+nOffset+1);
+ }
+
+ return TextSegment(OUString(), 0,0);
+}
+
+TextSegment PresenterTextParagraph::GetWordTextSegment (
+ const sal_Int32 nOffset,
+ const sal_Int32 nIndex) const
+{
+ sal_Int32 nCurrentOffset (nOffset);
+ sal_Int32 nCurrentIndex (nIndex);
+
+ i18n::Boundary aWordBoundary;
+ if (nCurrentOffset == 0)
+ aWordBoundary = mxBreakIterator->getWordBoundary(
+ msParagraphText,
+ nIndex,
+ lang::Locale(),
+ i18n::WordType::ANYWORD_IGNOREWHITESPACES,
+ true);
+ else if (nCurrentOffset < 0)
+ {
+ while (nCurrentOffset<0 && nCurrentIndex>0)
+ {
+ aWordBoundary = mxBreakIterator->previousWord(
+ msParagraphText,
+ nCurrentIndex,
+ lang::Locale(),
+ i18n::WordType::ANYWORD_IGNOREWHITESPACES);
+ nCurrentIndex = aWordBoundary.startPos;
+ ++nCurrentOffset;
+ }
+ }
+ else
+ {
+ while (nCurrentOffset>0 && nCurrentIndex<=GetCharacterCount())
+ {
+ aWordBoundary = mxBreakIterator->nextWord(
+ msParagraphText,
+ nCurrentIndex,
+ lang::Locale(),
+ i18n::WordType::ANYWORD_IGNOREWHITESPACES);
+ nCurrentIndex = aWordBoundary.endPos;
+ --nCurrentOffset;
+ }
+ }
+
+ return CreateTextSegment(aWordBoundary.startPos, aWordBoundary.endPos);
+}
+
+TextSegment PresenterTextParagraph::CreateTextSegment (
+ sal_Int32 nStartIndex,
+ sal_Int32 nEndIndex) const
+{
+ if (nEndIndex <= nStartIndex)
+ return TextSegment(
+ OUString(),
+ nStartIndex,
+ nEndIndex);
+ else
+ return TextSegment(
+ msParagraphText.copy(nStartIndex, nEndIndex-nStartIndex),
+ nStartIndex,
+ nEndIndex);
+}
+
+awt::Rectangle PresenterTextParagraph::GetCharacterBounds (
+ sal_Int32 nGlobalCharacterIndex,
+ const bool bCaretBox)
+{
+ // Find the line that contains the requested character and accumulate
+ // the previous line heights.
+ double nX (mnXOrigin);
+ double nY (mnYOrigin + mnVerticalOffset + mnAscent);
+ const sal_Int8 nTextDirection (GetTextDirection());
+ for (sal_Int32 nLineIndex=0,nLineCount=maLines.size();
+ nLineIndex<nLineCount;
+ ++nLineIndex, nY+=mnLineHeight)
+ {
+ Line& rLine (maLines[nLineIndex]);
+ // Skip lines before the indexed character.
+ if (nGlobalCharacterIndex >= rLine.mnLineEndCharacterIndex)
+ // When in the last line then allow the index past the last char.
+ if (nLineIndex<nLineCount-1)
+ continue;
+
+ rLine.ProvideCellBoxes();
+
+ const sal_Int32 nCellIndex (nGlobalCharacterIndex - rLine.mnLineStartCharacterIndex);
+
+ // The cell bounding box is defined relative to the origin of
+ // the current line. Therefore we have to add the absolute
+ // position of the line.
+ geometry::RealRectangle2D rCellBox (rLine.maCellBoxes[
+ ::std::min(nCellIndex, rLine.maCellBoxes.getLength()-1)]);
+
+ double nLeft = nX + rCellBox.X1;
+ double nRight = nX + rCellBox.X2;
+ if (nTextDirection == rendering::TextDirection::WEAK_RIGHT_TO_LEFT)
+ {
+ const double nOldRight (nRight);
+ nRight = rLine.mnWidth - nLeft;
+ nLeft = rLine.mnWidth - nOldRight;
+ }
+ double nTop = nY - mnAscent;
+ double nBottom;
+ if (bCaretBox)
+ {
+ nBottom = nTop + mnLineHeight;
+ if (nCellIndex >= rLine.maCellBoxes.getLength())
+ nLeft = nRight-2;
+ if (nLeft < nX)
+ nLeft = nX;
+ nRight = nLeft+2;
+ }
+ else
+ {
+ nBottom = nTop + mnAscent + mnDescent;
+ }
+ const sal_Int32 nX1 = sal_Int32(floor(nLeft));
+ const sal_Int32 nY1 = sal_Int32(floor(nTop));
+ const sal_Int32 nX2 = sal_Int32(ceil(nRight));
+ const sal_Int32 nY2 = sal_Int32(ceil(nBottom));
+
+ return awt::Rectangle(nX1,nY1,nX2-nX1+1,nY2-nY1+1);
+ }
+
+ // We are still here. That means that the given index lies past the
+ // last character in the paragraph.
+ // Return an empty box that lies past the last character. Better than nothing.
+ return awt::Rectangle(sal_Int32(nX+0.5), sal_Int32(nY+0.5), 0, 0);
+}
+
+sal_Int8 PresenterTextParagraph::GetTextDirection() const
+{
+ // Find first portion that has a non-neutral text direction.
+ sal_Int32 nPosition (0);
+ sal_Int32 nTextLength (msParagraphText.getLength());
+ while (nPosition < nTextLength)
+ {
+ const sal_Int16 nScriptDirection (
+ mxScriptTypeDetector->getScriptDirection(
+ msParagraphText, nPosition, i18n::ScriptDirection::NEUTRAL));
+ switch (nScriptDirection)
+ {
+ case i18n::ScriptDirection::NEUTRAL:
+ // continue looping.
+ break;
+ case i18n::ScriptDirection::LEFT_TO_RIGHT:
+ return rendering::TextDirection::WEAK_LEFT_TO_RIGHT;
+
+ case i18n::ScriptDirection::RIGHT_TO_LEFT:
+ return rendering::TextDirection::WEAK_RIGHT_TO_LEFT;
+ }
+
+ nPosition = mxScriptTypeDetector->endOfScriptDirection(
+ msParagraphText, nPosition, nScriptDirection);
+ }
+
+ // All text in paragraph is neutral. Fall back on writing mode taken
+ // from the XText (which may not be properly initialized.)
+ sal_Int8 nTextDirection(rendering::TextDirection::WEAK_LEFT_TO_RIGHT);
+ switch(mnWritingMode)
+ {
+ case text::WritingMode2::LR_TB:
+ nTextDirection = rendering::TextDirection::WEAK_LEFT_TO_RIGHT;
+ break;
+
+ case text::WritingMode2::RL_TB:
+ nTextDirection = rendering::TextDirection::WEAK_RIGHT_TO_LEFT;
+ break;
+
+ default:
+ case text::WritingMode2::TB_RL:
+ case text::WritingMode2::TB_LR:
+ // Can not handle this. Use default and hope for the best.
+ break;
+ }
+ return nTextDirection;
+}
+
+bool PresenterTextParagraph::IsTextReferencePointLeft() const
+{
+ return mnWritingMode != text::WritingMode2::RL_TB;
+}
+
+void PresenterTextParagraph::SetupCellArray (
+ const PresenterTheme::SharedFontDescriptor& rpFont)
+{
+ maCells.clear();
+
+ if ( ! rpFont || ! rpFont->mxFont.is())
+ return;
+
+ sal_Int32 nPosition (0);
+ sal_Int32 nIndex (0);
+ const sal_Int32 nTextLength (msParagraphText.getLength());
+ const sal_Int8 nTextDirection (GetTextDirection());
+ while (nPosition < nTextLength)
+ {
+ const sal_Int32 nNewPosition (mxBreakIterator->nextCharacters(
+ msParagraphText,
+ nPosition,
+ lang::Locale(),
+ i18n::CharacterIteratorMode::SKIPCELL,
+ 1,
+ nIndex));
+
+ rendering::StringContext aContext (msParagraphText, nPosition, nNewPosition-nPosition);
+ Reference<rendering::XTextLayout> xLayout (
+ rpFont->mxFont->createTextLayout(aContext, nTextDirection, 0));
+ css::geometry::RealRectangle2D aCharacterBox (xLayout->queryTextBounds());
+
+ maCells.emplace_back(
+ nPosition,
+ nNewPosition-nPosition,
+ aCharacterBox.X2-aCharacterBox.X1);
+
+ nPosition = nNewPosition;
+ }
+}
+
+//===== PresenterTextCaret ================================================----
+
+PresenterTextCaret::PresenterTextCaret (
+ uno::Reference<uno::XComponentContext> const& xContext,
+ const ::std::function<css::awt::Rectangle (const sal_Int32,const sal_Int32)>& rCharacterBoundsAccess,
+ const ::std::function<void (const css::awt::Rectangle&)>& rInvalidator)
+ : m_xContext(xContext)
+ , mnParagraphIndex(-1),
+ mnCharacterIndex(-1),
+ mnCaretBlinkTaskId(0),
+ mbIsCaretVisible(false),
+ maCharacterBoundsAccess(rCharacterBoundsAccess),
+ maInvalidator(rInvalidator)
+{
+}
+
+PresenterTextCaret::~PresenterTextCaret()
+{
+ try
+ {
+ HideCaret();
+ }
+ catch (uno::Exception const&)
+ {
+ TOOLS_WARN_EXCEPTION("sdext.presenter", "unexpected exception in ~PresenterTextCaret");
+ }
+}
+
+void PresenterTextCaret::ShowCaret()
+{
+ if (mnCaretBlinkTaskId == 0)
+ {
+ mnCaretBlinkTaskId = PresenterTimer::ScheduleRepeatedTask (
+ m_xContext,
+ [this] (TimeValue const&) { return this->InvertCaret(); },
+ CaretBlinkInterval,
+ CaretBlinkInterval);
+ }
+ mbIsCaretVisible = true;
+}
+
+void PresenterTextCaret::HideCaret()
+{
+ if (mnCaretBlinkTaskId != 0)
+ {
+ PresenterTimer::CancelTask(mnCaretBlinkTaskId);
+ mnCaretBlinkTaskId = 0;
+ }
+ mbIsCaretVisible = false;
+ // Reset the caret position.
+ mnParagraphIndex = -1;
+ mnCharacterIndex = -1;
+}
+
+
+void PresenterTextCaret::SetPosition (
+ const sal_Int32 nParagraphIndex,
+ const sal_Int32 nCharacterIndex)
+{
+ if (mnParagraphIndex == nParagraphIndex
+ && mnCharacterIndex == nCharacterIndex)
+ return;
+
+ if (mnParagraphIndex >= 0)
+ maInvalidator(maCaretBounds);
+
+ const sal_Int32 nOldParagraphIndex (mnParagraphIndex);
+ const sal_Int32 nOldCharacterIndex (mnCharacterIndex);
+ mnParagraphIndex = nParagraphIndex;
+ mnCharacterIndex = nCharacterIndex;
+ maCaretBounds = maCharacterBoundsAccess(mnParagraphIndex, mnCharacterIndex);
+ if (mnParagraphIndex >= 0)
+ ShowCaret();
+ else
+ HideCaret();
+
+ if (mnParagraphIndex >= 0)
+ maInvalidator(maCaretBounds);
+
+ if (maBroadcaster)
+ maBroadcaster(
+ nOldParagraphIndex,
+ nOldCharacterIndex,
+ mnParagraphIndex,
+ mnCharacterIndex);
+}
+
+
+void PresenterTextCaret::SetCaretMotionBroadcaster (
+ const ::std::function<void (sal_Int32,sal_Int32,sal_Int32,sal_Int32)>& rBroadcaster)
+{
+ maBroadcaster = rBroadcaster;
+}
+
+const css::awt::Rectangle& PresenterTextCaret::GetBounds() const
+{
+ return maCaretBounds;
+}
+
+void PresenterTextCaret::InvertCaret()
+{
+ mbIsCaretVisible = !mbIsCaretVisible;
+ if (mnParagraphIndex >= 0)
+ maInvalidator(maCaretBounds);
+}
+
+//===== PresenterTextParagraph::Cell ==========================================
+
+PresenterTextParagraph::Cell::Cell (
+ const sal_Int32 nCharacterIndex,
+ const sal_Int32 nCharacterCount,
+ const double nCellWidth)
+ : mnCharacterIndex(nCharacterIndex),
+ mnCharacterCount(nCharacterCount),
+ mnCellWidth(nCellWidth)
+{
+}
+
+//===== PresenterTextParagraph::Line ==========================================
+
+PresenterTextParagraph::Line::Line (
+ const sal_Int32 nLineStartCharacterIndex,
+ const sal_Int32 nLineEndCharacterIndex)
+ : mnLineStartCharacterIndex(nLineStartCharacterIndex),
+ mnLineEndCharacterIndex(nLineEndCharacterIndex),
+ mnLineStartCellIndex(-1), mnLineEndCellIndex(-1),
+ mnBaseLine(0), mnWidth(0)
+{
+}
+
+void PresenterTextParagraph::Line::ProvideCellBoxes()
+{
+ if ( mnLineStartCharacterIndex < mnLineEndCharacterIndex && !maCellBoxes.hasElements() )
+ {
+ if (mxLayoutedLine.is())
+ maCellBoxes = mxLayoutedLine->queryInkMeasures();
+ else
+ {
+ OSL_ASSERT(mxLayoutedLine.is());
+ }
+ }
+}
+
+void PresenterTextParagraph::Line::ProvideLayoutedLine (
+ const OUString& rsParagraphText,
+ const PresenterTheme::SharedFontDescriptor& rpFont,
+ const sal_Int8 nTextDirection)
+{
+ if ( ! mxLayoutedLine.is())
+ {
+ const rendering::StringContext aContext (
+ rsParagraphText,
+ mnLineStartCharacterIndex,
+ mnLineEndCharacterIndex - mnLineStartCharacterIndex);
+
+ mxLayoutedLine = rpFont->mxFont->createTextLayout(
+ aContext,
+ nTextDirection,
+ 0);
+ }
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterTextView.hxx b/sdext/source/presenter/PresenterTextView.hxx
new file mode 100644
index 000000000..a732978e6
--- /dev/null
+++ b/sdext/source/presenter/PresenterTextView.hxx
@@ -0,0 +1,279 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERTEXTVIEW_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERTEXTVIEW_HXX
+
+#include "PresenterTheme.hxx"
+#include <com/sun/star/accessibility/TextSegment.hpp>
+#include <com/sun/star/awt/Point.hpp>
+#include <com/sun/star/awt/Size.hpp>
+#include <com/sun/star/geometry/RealPoint2D.hpp>
+#include <com/sun/star/geometry/RealSize2D.hpp>
+#include <com/sun/star/i18n/XBreakIterator.hpp>
+#include <com/sun/star/i18n/XScriptTypeDetector.hpp>
+#include <com/sun/star/rendering/XCanvas.hpp>
+#include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include <functional>
+
+namespace sdext::presenter {
+
+class PresenterTextCaret
+{
+public:
+ PresenterTextCaret (
+ css::uno::Reference<css::uno::XComponentContext> const& xContext,
+ const ::std::function<css::awt::Rectangle (const sal_Int32,const sal_Int32)>&
+ rCharacterBoundsAccess,
+ const ::std::function<void (const css::awt::Rectangle&)>&
+ rInvalidator);
+ ~PresenterTextCaret();
+
+ void ShowCaret();
+ void HideCaret();
+
+ sal_Int32 GetParagraphIndex() const { return mnParagraphIndex;}
+ sal_Int32 GetCharacterIndex() const { return mnCharacterIndex;}
+ void SetPosition (
+ const sal_Int32 nParagraphIndex,
+ const sal_Int32 nCharacterIndex);
+
+ bool IsVisible() const { return mbIsCaretVisible;}
+
+ /** Set a (possibly empty) functor that broadcasts changes of the caret
+ position. This is used when a PresenterTextView object is set at
+ the accessibility object so that accessibility events can be sent
+ when the caret changes position.
+ */
+ void SetCaretMotionBroadcaster (
+ const ::std::function<void (sal_Int32,sal_Int32,sal_Int32,sal_Int32)>& rBroadcaster);
+
+ const css::awt::Rectangle& GetBounds() const;
+
+private:
+ css::uno::Reference<css::uno::XComponentContext> const& m_xContext;
+ sal_Int32 mnParagraphIndex;
+ sal_Int32 mnCharacterIndex;
+ sal_Int32 mnCaretBlinkTaskId;
+ bool mbIsCaretVisible;
+ const ::std::function<css::awt::Rectangle (const sal_Int32,const sal_Int32)> maCharacterBoundsAccess;
+ const ::std::function<void (const css::awt::Rectangle&)> maInvalidator;
+ ::std::function<void (sal_Int32,sal_Int32,sal_Int32,sal_Int32)> maBroadcaster;
+ css::awt::Rectangle maCaretBounds;
+
+ void InvertCaret();
+};
+typedef std::shared_ptr<PresenterTextCaret> SharedPresenterTextCaret;
+
+//===== PresenterTextParagraph ================================================
+
+class PresenterTextParagraph
+{
+public:
+ PresenterTextParagraph (
+ const sal_Int32 nParagraphIndex,
+ const css::uno::Reference<css::i18n::XBreakIterator>& rxBreakIterator,
+ const css::uno::Reference<css::i18n::XScriptTypeDetector>& rxScriptTypeDetector,
+ const css::uno::Reference<css::text::XTextRange>& rxTextRange,
+ const SharedPresenterTextCaret& rpCaret);
+
+ void Paint (
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::geometry::RealSize2D& rSize,
+ const PresenterTheme::SharedFontDescriptor& rpFont,
+ const css::rendering::ViewState& rViewState,
+ css::rendering::RenderState& rRenderState,
+ const double nTopOffset,
+ const double nClipTop,
+ const double nClipBottom);
+
+ double GetTotalTextHeight() const;
+
+ void SetCharacterOffset (const sal_Int32 nCharacterOffset);
+ sal_Int32 GetCharacterCount() const;
+ sal_Unicode GetCharacter (const sal_Int32 nGlobalCharacterIndex) const;
+ const OUString& GetText() const;
+ css::accessibility::TextSegment GetTextSegment (
+ const sal_Int32 nOffset,
+ const sal_Int32 nGlobalCharacterIndex,
+ const sal_Int16 nTextType) const;
+ css::accessibility::TextSegment GetWordTextSegment (
+ const sal_Int32 nOffset,
+ const sal_Int32 nIndex) const;
+ css::accessibility::TextSegment CreateTextSegment (
+ sal_Int32 nStartIndex,
+ sal_Int32 nEndIndex) const;
+ css::awt::Rectangle GetCharacterBounds (
+ sal_Int32 nGlobalCharacterIndex,
+ const bool bCaretBox);
+ void SetupCellArray (
+ const PresenterTheme::SharedFontDescriptor& rpFont);
+ void Format (
+ const double nY,
+ const double nWidth,
+ const PresenterTheme::SharedFontDescriptor& rpFont);
+ sal_Int32 GetWordBoundary(
+ const sal_Int32 nLocalCharacterIndex,
+ const sal_Int32 nDistance);
+ sal_Int32 GetCaretPosition() const;
+ void SetCaretPosition (const sal_Int32 nPosition) const;
+ void SetOrigin (const double nXOrigin, const double nYOrigin);
+ css::awt::Point GetRelativeLocation() const;
+ css::awt::Size GetSize() const;
+
+private:
+ OUString msParagraphText;
+ const sal_Int32 mnParagraphIndex;
+ SharedPresenterTextCaret mpCaret;
+
+ /** A portion of a string that encodes one unicode cell. It describes
+ number of characters in the unicode string that make up the cell and its
+ width in pixel (with respect to some configuration that is stored
+ externally or implicitly).
+ */
+ class Cell
+ {
+ public:
+ Cell (const sal_Int32 nCharacterIndex, const sal_Int32 nCharacterCount, const double nCellWidth);
+ sal_Int32 mnCharacterIndex;
+ sal_Int32 mnCharacterCount;
+ double mnCellWidth;
+ };
+
+ class Line
+ {
+ public:
+ Line (const sal_Int32 nLineStartCharacterIndex, const sal_Int32 nLineEndCharacterIndex);
+ sal_Int32 mnLineStartCharacterIndex;
+ sal_Int32 mnLineEndCharacterIndex;
+ sal_Int32 mnLineStartCellIndex;
+ sal_Int32 mnLineEndCellIndex;
+ css::uno::Reference<css::rendering::XTextLayout> mxLayoutedLine;
+ double mnBaseLine;
+ double mnWidth;
+ css::uno::Sequence<css::geometry::RealRectangle2D> maCellBoxes;
+
+ void ProvideLayoutedLine (
+ const OUString& rsParagraphText,
+ const PresenterTheme::SharedFontDescriptor& rpFont,
+ const sal_Int8 nTextDirection);
+ void ProvideCellBoxes();
+ };
+
+ css::uno::Reference<css::i18n::XBreakIterator> mxBreakIterator;
+ css::uno::Reference<css::i18n::XScriptTypeDetector> mxScriptTypeDetector;
+ ::std::vector<Line> maLines;
+ ::std::vector<sal_Int32> maWordBoundaries;
+ // Offset of the top of the paragraph with respect to the origin of the
+ // whole text (specified by mnXOrigin and mnYOrigin).
+ double mnVerticalOffset;
+ double mnXOrigin;
+ double mnYOrigin;
+ double mnWidth;
+ double mnAscent;
+ double mnDescent;
+ double mnLineHeight;
+ sal_Int8 mnWritingMode;
+ /// The index of the first character in this paragraph with respect to
+ /// the whole text.
+ sal_Int32 mnCharacterOffset;
+ ::std::vector<Cell> maCells;
+
+ void AddWord (
+ const double nWidth,
+ css::i18n::Boundary& rCurrentLine,
+ const sal_Int32 nWordBoundary,
+ const PresenterTheme::SharedFontDescriptor& rpFont);
+ void AddLine (
+ css::i18n::Boundary& rCurrentLine);
+ sal_Int8 GetTextDirection() const;
+ bool IsTextReferencePointLeft() const;
+};
+typedef std::shared_ptr<PresenterTextParagraph> SharedPresenterTextParagraph;
+
+/** A simple text view that paints text onto a given canvas.
+*/
+class PresenterTextView
+{
+public:
+
+ PresenterTextView (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const ::std::function<void (const css::awt::Rectangle&)>& rInvalidator);
+ void SetText (const css::uno::Reference<css::text::XText>& rxText);
+ void SetTextChangeBroadcaster(const ::std::function<void ()>& rBroadcaster);
+
+ void SetLocation (const css::geometry::RealPoint2D& rLocation);
+ void SetSize (const css::geometry::RealSize2D& rSize);
+ double GetTotalTextHeight();
+
+ void SetFont (const PresenterTheme::SharedFontDescriptor& rpFont);
+
+ void SetOffset (
+ const double nLeft,
+ const double nTop);
+
+ /** Move the caret forward or backward by character or by word.
+ @param nDistance
+ Should be either -1 or +1 to move caret backwards or forwards,
+ respectively.
+ @param nTextType
+ Valid values are the
+ css::accessibility::AccessibleTextType constants.
+ */
+ void MoveCaret (
+ const sal_Int32 nDistance,
+ const sal_Int16 nTextType);
+
+ void Paint (const css::awt::Rectangle& rUpdateBox);
+
+ const SharedPresenterTextCaret& GetCaret() const;
+
+ sal_Int32 GetParagraphCount() const;
+ SharedPresenterTextParagraph GetParagraph (const sal_Int32 nParagraphIndex) const;
+
+private:
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+ css::uno::Reference<css::i18n::XBreakIterator> mxBreakIterator;
+ css::uno::Reference<css::i18n::XScriptTypeDetector> mxScriptTypeDetector;
+ css::geometry::RealPoint2D maLocation;
+ css::geometry::RealSize2D maSize;
+ PresenterTheme::SharedFontDescriptor mpFont;
+ ::std::vector<SharedPresenterTextParagraph> maParagraphs;
+ SharedPresenterTextCaret mpCaret;
+ double mnLeftOffset;
+ double mnTopOffset;
+ bool mbIsFormatPending;
+ ::std::function<void ()> maTextChangeBroadcaster;
+
+ void RequestFormat();
+ void Format();
+ css::awt::Rectangle GetCaretBounds (
+ const sal_Int32 nParagraphIndex,
+ const sal_Int32 nCharacterIndex) const;
+};
+
+} // end of namespace ::sdext::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterTheme.cxx b/sdext/source/presenter/PresenterTheme.cxx
new file mode 100644
index 000000000..c84747d0f
--- /dev/null
+++ b/sdext/source/presenter/PresenterTheme.cxx
@@ -0,0 +1,1060 @@
+/* -*- 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 "PresenterTheme.hxx"
+#include "PresenterBitmapContainer.hxx"
+#include "PresenterCanvasHelper.hxx"
+#include "PresenterConfigurationAccess.hxx"
+#include <com/sun/star/drawing/XPresenterHelper.hpp>
+#include <com/sun/star/rendering/PanoseWeight.hpp>
+#include <osl/diagnose.h>
+#include <map>
+#include <numeric>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::std;
+
+namespace sdext::presenter {
+
+namespace {
+
+class BorderSize
+{
+public:
+ const static sal_Int32 mnInvalidValue = -10000;
+
+ BorderSize() : mnLeft(mnInvalidValue),
+ mnTop(mnInvalidValue),
+ mnRight(mnInvalidValue),
+ mnBottom(mnInvalidValue) {}
+
+ sal_Int32 mnLeft;
+ sal_Int32 mnTop;
+ sal_Int32 mnRight;
+ sal_Int32 mnBottom;
+
+ vector<sal_Int32> ToVector()
+ {
+ return
+ {
+ mnLeft == mnInvalidValue ? 0 : mnLeft,
+ mnTop == mnInvalidValue ? 0 : mnTop,
+ mnRight == mnInvalidValue ? 0 : mnRight,
+ mnBottom == mnInvalidValue ? 0 : mnBottom
+ };
+ };
+
+ void Merge (const BorderSize& rBorderSize)
+ {
+ if (mnLeft == mnInvalidValue)
+ mnLeft = rBorderSize.mnLeft;
+ if (mnTop == mnInvalidValue)
+ mnTop = rBorderSize.mnTop;
+ if (mnRight == mnInvalidValue)
+ mnRight = rBorderSize.mnRight;
+ if (mnBottom == mnInvalidValue)
+ mnBottom = rBorderSize.mnBottom;
+ }
+};
+
+/** Reading a theme from the configurations is done in various classes. The
+ ReadContext gives access to frequently used objects and functions to make
+ the configuration handling easier.
+*/
+class ReadContext
+{
+public:
+ Reference<XComponentContext> mxComponentContext;
+ Reference<rendering::XCanvas> mxCanvas;
+ Reference<drawing::XPresenterHelper> mxPresenterHelper;
+
+ ReadContext (
+ const Reference<XComponentContext>& rxContext,
+ const Reference<rendering::XCanvas>& rxCanvas);
+
+ /** Read data describing a font from the node that can be reached from
+ the given root via the given path.
+ @param rsFontPath
+ May be empty.
+ */
+ static PresenterTheme::SharedFontDescriptor ReadFont (
+ const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxTheme,
+ const PresenterTheme::SharedFontDescriptor& rpDefault);
+ static PresenterTheme::SharedFontDescriptor ReadFont (
+ const Reference<beans::XPropertySet>& rxFontProperties,
+ const PresenterTheme::SharedFontDescriptor& rpDefault);
+
+ std::shared_ptr<PresenterTheme::Theme> ReadTheme (
+ PresenterConfigurationAccess& rConfiguration,
+ const OUString& rsThemeName);
+
+ static BorderSize ReadBorderSize (const Reference<container::XNameAccess>& rxNode);
+
+private:
+ static Any GetByName (
+ const Reference<container::XNameAccess>& rxNode,
+ const OUString& rsName);
+};
+
+/** A PaneStyle describes how a pane is rendered.
+*/
+class PaneStyle
+{
+public:
+ PaneStyle();
+
+ SharedBitmapDescriptor GetBitmap (const OUString& sBitmapName) const;
+
+ OUString msStyleName;
+ std::shared_ptr<PaneStyle> mpParentStyle;
+ PresenterTheme::SharedFontDescriptor mpFont;
+ BorderSize maInnerBorderSize;
+ BorderSize maOuterBorderSize;
+ std::shared_ptr<PresenterBitmapContainer> mpBitmaps;
+
+ PresenterTheme::SharedFontDescriptor GetFont() const;
+};
+
+typedef std::shared_ptr<PaneStyle> SharedPaneStyle;
+
+class PaneStyleContainer
+{
+private:
+ ::std::vector<SharedPaneStyle> mStyles;
+
+public:
+ void Read (
+ const ReadContext& rReadContext,
+ const Reference<container::XHierarchicalNameAccess>& rThemeRoot);
+
+ SharedPaneStyle GetPaneStyle (const OUString& rsStyleName) const;
+
+private:
+ void ProcessPaneStyle (
+ ReadContext const & rReadContext,
+ const ::std::vector<css::uno::Any>& rValues);
+};
+
+/** A ViewStyle describes how a view is displayed.
+*/
+class ViewStyle
+{
+public:
+ ViewStyle();
+
+ SharedBitmapDescriptor GetBitmap (std::u16string_view sBitmapName) const;
+
+ PresenterTheme::SharedFontDescriptor GetFont() const;
+
+ OUString msStyleName;
+ std::shared_ptr<ViewStyle> mpParentStyle;
+ PresenterTheme::SharedFontDescriptor mpFont;
+ SharedBitmapDescriptor mpBackground;
+};
+
+typedef std::shared_ptr<ViewStyle> SharedViewStyle;
+
+class ViewStyleContainer
+{
+private:
+ ::std::vector<SharedViewStyle> mStyles;
+
+public:
+ void Read (
+ const ReadContext& rReadContext,
+ const Reference<container::XHierarchicalNameAccess>& rThemeRoot);
+
+ SharedViewStyle GetViewStyle (const OUString& rsStyleName) const;
+
+private:
+ void ProcessViewStyle(
+ ReadContext const & rReadContext,
+ const Reference<beans::XPropertySet>& rxProperties);
+};
+
+class StyleAssociationContainer
+{
+public:
+ void Read (
+ const Reference<container::XHierarchicalNameAccess>& rThemeRoot);
+
+ OUString GetStyleName (const OUString& rsResourceName) const;
+
+private:
+ typedef map<OUString, OUString> StyleAssociations;
+ StyleAssociations maStyleAssociations;
+
+ void ProcessStyleAssociation(
+ const ::std::vector<css::uno::Any>& rValues);
+};
+
+} // end of anonymous namespace
+
+class PresenterTheme::Theme
+{
+public:
+ Theme (
+ const Reference<container::XHierarchicalNameAccess>& rThemeRoot,
+ const OUString& rsNodeName);
+
+ void Read (
+ PresenterConfigurationAccess& rConfiguration,
+ ReadContext& rReadContext);
+
+ OUString msConfigurationNodeName;
+ std::shared_ptr<Theme> mpParentTheme;
+ SharedBitmapDescriptor mpBackground;
+ PaneStyleContainer maPaneStyles;
+ ViewStyleContainer maViewStyles;
+ StyleAssociationContainer maStyleAssociations;
+ Reference<container::XHierarchicalNameAccess> mxThemeRoot;
+ std::shared_ptr<PresenterBitmapContainer> mpIconContainer;
+ typedef map<OUString,SharedFontDescriptor> FontContainer;
+ FontContainer maFontContainer;
+
+ SharedPaneStyle GetPaneStyle (const OUString& rsStyleName) const;
+ SharedViewStyle GetViewStyle (const OUString& rsStyleName) const;
+
+private:
+ void ProcessFont(
+ const OUString& rsKey,
+ const Reference<beans::XPropertySet>& rxProperties);
+};
+
+//===== PresenterTheme ========================================================
+
+PresenterTheme::PresenterTheme (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas)
+ : mxContext(rxContext),
+ mxCanvas(rxCanvas)
+{
+ mpTheme = ReadTheme();
+}
+
+PresenterTheme::~PresenterTheme()
+{
+}
+
+std::shared_ptr<PresenterTheme::Theme> PresenterTheme::ReadTheme()
+{
+ ReadContext aReadContext(mxContext, mxCanvas);
+
+ PresenterConfigurationAccess aConfiguration (
+ mxContext,
+ "/org.openoffice.Office.PresenterScreen/",
+ PresenterConfigurationAccess::READ_ONLY);
+
+ return aReadContext.ReadTheme(aConfiguration, OUString());
+}
+
+bool PresenterTheme::HasCanvas() const
+{
+ return mxCanvas.is();
+}
+
+void PresenterTheme::ProvideCanvas (const Reference<rendering::XCanvas>& rxCanvas)
+{
+ if ( ! mxCanvas.is() && rxCanvas.is())
+ {
+ mxCanvas = rxCanvas;
+ ReadTheme();
+ }
+}
+
+OUString PresenterTheme::GetStyleName (const OUString& rsResourceURL) const
+{
+ OUString sStyleName;
+ std::shared_ptr<Theme> pTheme (mpTheme);
+ while (sStyleName.isEmpty() && pTheme != nullptr)
+ {
+ sStyleName = pTheme->maStyleAssociations.GetStyleName(rsResourceURL);
+ pTheme = pTheme->mpParentTheme;
+ }
+ return sStyleName;
+}
+
+::std::vector<sal_Int32> PresenterTheme::GetBorderSize (
+ const OUString& rsStyleName,
+ const bool bOuter) const
+{
+ OSL_ASSERT(mpTheme != nullptr);
+
+ SharedPaneStyle pPaneStyle (mpTheme->GetPaneStyle(rsStyleName));
+ if (pPaneStyle)
+ if (bOuter)
+ return pPaneStyle->maOuterBorderSize.ToVector();
+ else
+ return pPaneStyle->maInnerBorderSize.ToVector();
+ else
+ {
+ return ::std::vector<sal_Int32>(4,0);
+ }
+}
+
+PresenterTheme::SharedFontDescriptor PresenterTheme::ReadFont (
+ const Reference<container::XHierarchicalNameAccess>& rxNode,
+ const PresenterTheme::SharedFontDescriptor& rpDefault)
+{
+ return ReadContext::ReadFont(rxNode, rpDefault);
+}
+
+bool PresenterTheme::ConvertToColor (
+ const Any& rColorSequence,
+ sal_uInt32& rColor)
+{
+ Sequence<sal_Int8> aByteSequence;
+ if (rColorSequence >>= aByteSequence)
+ {
+ rColor = std::accumulate(std::cbegin(aByteSequence), std::cend(aByteSequence), sal_uInt32(0),
+ [](const sal_uInt32 nRes, const sal_uInt8 nByte) { return (nRes << 8) | nByte; });
+ return true;
+ }
+ else
+ return false;
+}
+
+std::shared_ptr<PresenterConfigurationAccess> PresenterTheme::GetNodeForViewStyle (
+ const OUString& rsStyleName) const
+{
+ if (mpTheme == nullptr)
+ return std::shared_ptr<PresenterConfigurationAccess>();
+
+ // Open configuration for writing.
+ auto pConfiguration = std::make_shared<PresenterConfigurationAccess>(
+ mxContext,
+ "/org.openoffice.Office.PresenterScreen/",
+ PresenterConfigurationAccess::READ_WRITE);
+
+ // Get configuration node for the view style container of the current
+ // theme.
+ if (pConfiguration->GoToChild( OUString(
+ "Presenter/Themes/" + mpTheme->msConfigurationNodeName + "/ViewStyles")))
+ {
+ pConfiguration->GoToChild(
+ [&rsStyleName] (OUString const&, uno::Reference<beans::XPropertySet> const& xProps)
+ {
+ return PresenterConfigurationAccess::IsStringPropertyEqual(
+ rsStyleName, "StyleName", xProps);
+ });
+ }
+ return pConfiguration;
+}
+
+SharedBitmapDescriptor PresenterTheme::GetBitmap (
+ const OUString& rsStyleName,
+ const OUString& rsBitmapName) const
+{
+ if (mpTheme != nullptr)
+ {
+ if (rsStyleName.isEmpty())
+ {
+ if (rsBitmapName == "Background")
+ {
+ std::shared_ptr<Theme> pTheme (mpTheme);
+ while (pTheme != nullptr && !pTheme->mpBackground)
+ pTheme = pTheme->mpParentTheme;
+ if (pTheme != nullptr)
+ return pTheme->mpBackground;
+ else
+ return SharedBitmapDescriptor();
+ }
+ }
+ else
+ {
+ SharedPaneStyle pPaneStyle (mpTheme->GetPaneStyle(rsStyleName));
+ if (pPaneStyle)
+ {
+ SharedBitmapDescriptor pBitmap (pPaneStyle->GetBitmap(rsBitmapName));
+ if (pBitmap)
+ return pBitmap;
+ }
+
+ SharedViewStyle pViewStyle (mpTheme->GetViewStyle(rsStyleName));
+ if (pViewStyle)
+ {
+ SharedBitmapDescriptor pBitmap (pViewStyle->GetBitmap(rsBitmapName));
+ if (pBitmap)
+ return pBitmap;
+ }
+ }
+ }
+
+ return SharedBitmapDescriptor();
+}
+
+SharedBitmapDescriptor PresenterTheme::GetBitmap (
+ const OUString& rsBitmapName) const
+{
+ if (mpTheme != nullptr)
+ {
+ if (rsBitmapName == "Background")
+ {
+ std::shared_ptr<Theme> pTheme (mpTheme);
+ while (pTheme != nullptr && !pTheme->mpBackground)
+ pTheme = pTheme->mpParentTheme;
+ if (pTheme != nullptr)
+ return pTheme->mpBackground;
+ else
+ return SharedBitmapDescriptor();
+ }
+ else
+ {
+ if (mpTheme->mpIconContainer != nullptr)
+ return mpTheme->mpIconContainer->GetBitmap(rsBitmapName);
+ }
+ }
+
+ return SharedBitmapDescriptor();
+}
+
+std::shared_ptr<PresenterBitmapContainer> PresenterTheme::GetBitmapContainer() const
+{
+ if (mpTheme != nullptr)
+ return mpTheme->mpIconContainer;
+ else
+ return std::shared_ptr<PresenterBitmapContainer>();
+}
+
+PresenterTheme::SharedFontDescriptor PresenterTheme::GetFont (
+ const OUString& rsStyleName) const
+{
+ if (mpTheme != nullptr)
+ {
+ SharedPaneStyle pPaneStyle (mpTheme->GetPaneStyle(rsStyleName));
+ if (pPaneStyle)
+ return pPaneStyle->GetFont();
+
+ SharedViewStyle pViewStyle (mpTheme->GetViewStyle(rsStyleName));
+ if (pViewStyle)
+ return pViewStyle->GetFont();
+
+ std::shared_ptr<Theme> pTheme (mpTheme);
+ while (pTheme != nullptr)
+ {
+ Theme::FontContainer::const_iterator iFont (pTheme->maFontContainer.find(rsStyleName));
+ if (iFont != pTheme->maFontContainer.end())
+ return iFont->second;
+
+ pTheme = pTheme->mpParentTheme;
+ }
+ }
+
+ return SharedFontDescriptor();
+}
+
+//===== FontDescriptor ========================================================
+
+PresenterTheme::FontDescriptor::FontDescriptor (
+ const std::shared_ptr<FontDescriptor>& rpDescriptor)
+ : mnSize(12),
+ mnColor(0x00000000),
+ msAnchor(OUString("Left")),
+ mnXOffset(0),
+ mnYOffset(0)
+{
+ if (rpDescriptor != nullptr)
+ {
+ msFamilyName = rpDescriptor->msFamilyName;
+ msStyleName = rpDescriptor->msStyleName;
+ mnSize = rpDescriptor->mnSize;
+ mnColor = rpDescriptor->mnColor;
+ msAnchor = rpDescriptor->msAnchor;
+ mnXOffset = rpDescriptor->mnXOffset;
+ mnYOffset = rpDescriptor->mnYOffset;
+ }
+}
+
+bool PresenterTheme::FontDescriptor::PrepareFont (
+ const Reference<rendering::XCanvas>& rxCanvas)
+{
+ if (mxFont.is())
+ return true;
+
+ if ( ! rxCanvas.is())
+ return false;
+
+ const double nCellSize (GetCellSizeForDesignSize(rxCanvas, mnSize));
+ mxFont = CreateFont(rxCanvas, nCellSize);
+
+ return mxFont.is();
+}
+
+Reference<rendering::XCanvasFont> PresenterTheme::FontDescriptor::CreateFont (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const double nCellSize) const
+{
+ rendering::FontRequest aFontRequest;
+ aFontRequest.FontDescription.FamilyName = msFamilyName;
+ if (msFamilyName.isEmpty())
+ aFontRequest.FontDescription.FamilyName = "Tahoma";
+ aFontRequest.FontDescription.StyleName = msStyleName;
+ aFontRequest.CellSize = nCellSize;
+
+ // Make an attempt at translating the style name(s)into a corresponding
+ // font description.
+ if (msStyleName == "Bold")
+ aFontRequest.FontDescription.FontDescription.Weight = rendering::PanoseWeight::HEAVY;
+
+ return rxCanvas->createFont(
+ aFontRequest,
+ Sequence<beans::PropertyValue>(),
+ geometry::Matrix2D(1,0,0,1));
+}
+
+double PresenterTheme::FontDescriptor::GetCellSizeForDesignSize (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const double nDesignSize) const
+{
+ // Use the given design size as initial value in calculating the cell
+ // size.
+ double nCellSize (nDesignSize);
+
+ if ( ! rxCanvas.is())
+ {
+ // We need the canvas to do the conversion. Return the design size,
+ // it is the our best guess in this circumstance.
+ return nDesignSize;
+ }
+
+ Reference<rendering::XCanvasFont> xFont (CreateFont(rxCanvas, nCellSize));
+ if ( ! xFont.is())
+ return nDesignSize;
+
+ geometry::RealRectangle2D aBox (PresenterCanvasHelper::GetTextBoundingBox (xFont, "X"));
+
+ const double nAscent (-aBox.Y1);
+ //tdf#112408
+ if (nAscent == 0)
+ return nDesignSize;
+ const double nDescent (aBox.Y2);
+ const double nScale = (nAscent+nDescent) / nAscent;
+ return nDesignSize * nScale;
+}
+
+//===== Theme =================================================================
+
+PresenterTheme::Theme::Theme (
+ const Reference<container::XHierarchicalNameAccess>& rxThemeRoot,
+ const OUString& rsNodeName)
+ : msConfigurationNodeName(rsNodeName),
+ maPaneStyles(),
+ maViewStyles(),
+ maStyleAssociations(),
+ mxThemeRoot(rxThemeRoot)
+{
+}
+
+void PresenterTheme::Theme::Read (
+ PresenterConfigurationAccess& rConfiguration,
+ ReadContext& rReadContext)
+{
+ // Parent theme name.
+ OUString sParentThemeName;
+ if ((PresenterConfigurationAccess::GetConfigurationNode(mxThemeRoot, "ParentTheme")
+ >>= sParentThemeName)
+ && !sParentThemeName.isEmpty())
+ {
+ mpParentTheme = rReadContext.ReadTheme(rConfiguration, sParentThemeName);
+ }
+
+ // Background.
+ mpBackground = PresenterBitmapContainer::LoadBitmap(
+ mxThemeRoot,
+ "Background",
+ rReadContext.mxPresenterHelper,
+ rReadContext.mxCanvas,
+ SharedBitmapDescriptor());
+
+ // Style associations.
+ maStyleAssociations.Read(mxThemeRoot);
+
+ // Pane styles.
+ maPaneStyles.Read(rReadContext, mxThemeRoot);
+
+ // View styles.
+ maViewStyles.Read(rReadContext, mxThemeRoot);
+
+ // Read bitmaps.
+ mpIconContainer = std::make_shared<PresenterBitmapContainer>(
+ Reference<container::XNameAccess>(
+ PresenterConfigurationAccess::GetConfigurationNode(mxThemeRoot, "Bitmaps"), UNO_QUERY),
+ mpParentTheme != nullptr ? mpParentTheme->mpIconContainer
+ : std::shared_ptr<PresenterBitmapContainer>(),
+ rReadContext.mxComponentContext, rReadContext.mxCanvas);
+
+ // Read fonts.
+ Reference<container::XNameAccess> xFontNode(
+ PresenterConfigurationAccess::GetConfigurationNode(mxThemeRoot, "Fonts"),
+ UNO_QUERY);
+ PresenterConfigurationAccess::ForAll(
+ xFontNode,
+ [this] (OUString const& rKey, uno::Reference<beans::XPropertySet> const& xProps)
+ {
+ return this->ProcessFont(rKey, xProps);
+ });
+}
+
+SharedPaneStyle PresenterTheme::Theme::GetPaneStyle (const OUString& rsStyleName) const
+{
+ SharedPaneStyle pPaneStyle (maPaneStyles.GetPaneStyle(rsStyleName));
+ if (pPaneStyle)
+ return pPaneStyle;
+ else if (mpParentTheme != nullptr)
+ return mpParentTheme->GetPaneStyle(rsStyleName);
+ else
+ return SharedPaneStyle();
+}
+
+SharedViewStyle PresenterTheme::Theme::GetViewStyle (const OUString& rsStyleName) const
+{
+ SharedViewStyle pViewStyle (maViewStyles.GetViewStyle(rsStyleName));
+ if (pViewStyle)
+ return pViewStyle;
+ else if (mpParentTheme != nullptr)
+ return mpParentTheme->GetViewStyle(rsStyleName);
+ else
+ return SharedViewStyle();
+}
+
+void PresenterTheme::Theme::ProcessFont(
+ const OUString& rsKey,
+ const Reference<beans::XPropertySet>& rxProperties)
+{
+ maFontContainer[rsKey] = ReadContext::ReadFont(rxProperties, SharedFontDescriptor());
+}
+
+namespace {
+
+//===== ReadContext ===========================================================
+
+ReadContext::ReadContext (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const Reference<rendering::XCanvas>& rxCanvas)
+ : mxComponentContext(rxContext),
+ mxCanvas(rxCanvas)
+{
+ Reference<lang::XMultiComponentFactory> xFactory (rxContext->getServiceManager());
+ if (xFactory.is())
+ {
+ mxPresenterHelper.set(
+ xFactory->createInstanceWithContext(
+ "com.sun.star.comp.Draw.PresenterHelper",
+ rxContext),
+ UNO_QUERY_THROW);
+ }
+}
+
+PresenterTheme::SharedFontDescriptor ReadContext::ReadFont (
+ const Reference<container::XHierarchicalNameAccess>& rxNode,
+ const PresenterTheme::SharedFontDescriptor& rpDefault)
+{
+ if ( ! rxNode.is())
+ return PresenterTheme::SharedFontDescriptor();
+
+ try
+ {
+ Reference<container::XHierarchicalNameAccess> xFont (
+ PresenterConfigurationAccess::GetConfigurationNode(
+ rxNode,
+ /*rsFontPath*/""),
+ UNO_QUERY_THROW);
+
+ Reference<beans::XPropertySet> xProperties (xFont, UNO_QUERY_THROW);
+ return ReadFont(xProperties, rpDefault);
+ }
+ catch (Exception&)
+ {
+ OSL_ASSERT(false);
+ }
+
+ return PresenterTheme::SharedFontDescriptor();
+}
+
+PresenterTheme::SharedFontDescriptor ReadContext::ReadFont (
+ const Reference<beans::XPropertySet>& rxProperties,
+ const PresenterTheme::SharedFontDescriptor& rpDefault)
+{
+ auto pDescriptor = std::make_shared<PresenterTheme::FontDescriptor>(rpDefault);
+
+ PresenterConfigurationAccess::GetProperty(rxProperties, "FamilyName") >>= pDescriptor->msFamilyName;
+ PresenterConfigurationAccess::GetProperty(rxProperties, "Style") >>= pDescriptor->msStyleName;
+ PresenterConfigurationAccess::GetProperty(rxProperties, "Size") >>= pDescriptor->mnSize;
+ PresenterTheme::ConvertToColor(
+ PresenterConfigurationAccess::GetProperty(rxProperties, "Color"),
+ pDescriptor->mnColor);
+ PresenterConfigurationAccess::GetProperty(rxProperties, "Anchor") >>= pDescriptor->msAnchor;
+ PresenterConfigurationAccess::GetProperty(rxProperties, "XOffset") >>= pDescriptor->mnXOffset;
+ PresenterConfigurationAccess::GetProperty(rxProperties, "YOffset") >>= pDescriptor->mnYOffset;
+
+ return pDescriptor;
+}
+
+Any ReadContext::GetByName (
+ const Reference<container::XNameAccess>& rxNode,
+ const OUString& rsName)
+{
+ OSL_ASSERT(rxNode.is());
+ if (rxNode->hasByName(rsName))
+ return rxNode->getByName(rsName);
+ else
+ return Any();
+}
+
+std::shared_ptr<PresenterTheme::Theme> ReadContext::ReadTheme (
+ PresenterConfigurationAccess& rConfiguration,
+ const OUString& rsThemeName)
+{
+ std::shared_ptr<PresenterTheme::Theme> pTheme;
+
+ OUString sCurrentThemeName (rsThemeName);
+ if (sCurrentThemeName.isEmpty())
+ {
+ // No theme name given. Look up the CurrentTheme property.
+ rConfiguration.GetConfigurationNode("Presenter/CurrentTheme") >>= sCurrentThemeName;
+ if (sCurrentThemeName.isEmpty())
+ {
+ // Still no name. Use "DefaultTheme".
+ sCurrentThemeName = "DefaultTheme";
+ }
+ }
+
+ Reference<container::XNameAccess> xThemes (
+ rConfiguration.GetConfigurationNode("Presenter/Themes"),
+ UNO_QUERY);
+ if (xThemes.is())
+ {
+ // Iterate over all themes and search the one with the given name.
+ const Sequence<OUString> aKeys (xThemes->getElementNames());
+ for (const OUString& rsKey : aKeys)
+ {
+ Reference<container::XHierarchicalNameAccess> xTheme (
+ xThemes->getByName(rsKey), UNO_QUERY);
+ if (xTheme.is())
+ {
+ OUString sThemeName;
+ PresenterConfigurationAccess::GetConfigurationNode(xTheme, "ThemeName")
+ >>= sThemeName;
+ if (sThemeName == sCurrentThemeName)
+ {
+ pTheme = std::make_shared<PresenterTheme::Theme>(xTheme,rsKey);
+ break;
+ }
+ }
+ }
+ }
+
+ if (pTheme != nullptr)
+ {
+ pTheme->Read(rConfiguration, *this);
+ }
+
+ return pTheme;
+}
+
+BorderSize ReadContext::ReadBorderSize (const Reference<container::XNameAccess>& rxNode)
+{
+ BorderSize aBorderSize;
+
+ if (rxNode.is())
+ {
+ GetByName(rxNode, "Left") >>= aBorderSize.mnLeft;
+ GetByName(rxNode, "Top") >>= aBorderSize.mnTop;
+ GetByName(rxNode, "Right") >>= aBorderSize.mnRight;
+ GetByName(rxNode, "Bottom") >>= aBorderSize.mnBottom;
+ }
+
+ return aBorderSize;
+}
+
+//===== PaneStyleContainer ====================================================
+
+void PaneStyleContainer::Read (
+ const ReadContext& rReadContext,
+ const Reference<container::XHierarchicalNameAccess>& rxThemeRoot)
+{
+ Reference<container::XNameAccess> xPaneStyleList (
+ PresenterConfigurationAccess::GetConfigurationNode(
+ rxThemeRoot,
+ "PaneStyles"),
+ UNO_QUERY);
+ if (!xPaneStyleList.is())
+ return;
+
+ ::std::vector<OUString> aProperties;
+ aProperties.reserve(6);
+ aProperties.emplace_back("StyleName");
+ aProperties.emplace_back("ParentStyle");
+ aProperties.emplace_back("TitleFont");
+ aProperties.emplace_back("InnerBorderSize");
+ aProperties.emplace_back("OuterBorderSize");
+ aProperties.emplace_back("BorderBitmapList");
+ PresenterConfigurationAccess::ForAll(
+ xPaneStyleList,
+ aProperties,
+ [this, &rReadContext] (std::vector<uno::Any> const& rValues)
+ {
+ return this->ProcessPaneStyle(rReadContext, rValues);
+ });
+}
+
+void PaneStyleContainer::ProcessPaneStyle(
+ ReadContext const & rReadContext,
+ const ::std::vector<Any>& rValues)
+{
+ if (rValues.size() != 6)
+ return;
+
+ auto pStyle = std::make_shared<PaneStyle>();
+
+ rValues[0] >>= pStyle->msStyleName;
+
+ OUString sParentStyleName;
+ if (rValues[1] >>= sParentStyleName)
+ {
+ // Find parent style.
+ auto iStyle = std::find_if(mStyles.begin(), mStyles.end(),
+ [&sParentStyleName](const SharedPaneStyle& rxStyle) { return rxStyle->msStyleName == sParentStyleName; });
+ if (iStyle != mStyles.end())
+ pStyle->mpParentStyle = *iStyle;
+ }
+
+ Reference<container::XHierarchicalNameAccess> xFontNode (rValues[2], UNO_QUERY);
+ pStyle->mpFont = ReadContext::ReadFont(
+ xFontNode, PresenterTheme::SharedFontDescriptor());
+
+ Reference<container::XNameAccess> xInnerBorderSizeNode (rValues[3], UNO_QUERY);
+ pStyle->maInnerBorderSize = ReadContext::ReadBorderSize(xInnerBorderSizeNode);
+ Reference<container::XNameAccess> xOuterBorderSizeNode (rValues[4], UNO_QUERY);
+ pStyle->maOuterBorderSize = ReadContext::ReadBorderSize(xOuterBorderSizeNode);
+
+ if (pStyle->mpParentStyle != nullptr)
+ {
+ pStyle->maInnerBorderSize.Merge(pStyle->mpParentStyle->maInnerBorderSize);
+ pStyle->maOuterBorderSize.Merge(pStyle->mpParentStyle->maOuterBorderSize);
+ }
+
+ if (rReadContext.mxCanvas.is())
+ {
+ Reference<container::XNameAccess> xBitmapsNode (rValues[5], UNO_QUERY);
+ pStyle->mpBitmaps = std::make_shared<PresenterBitmapContainer>(
+ xBitmapsNode,
+ pStyle->mpParentStyle != nullptr ? pStyle->mpParentStyle->mpBitmaps
+ : std::shared_ptr<PresenterBitmapContainer>(),
+ rReadContext.mxComponentContext, rReadContext.mxCanvas,
+ rReadContext.mxPresenterHelper);
+ }
+
+ mStyles.push_back(pStyle);
+}
+
+SharedPaneStyle PaneStyleContainer::GetPaneStyle (const OUString& rsStyleName) const
+{
+ auto iStyle = std::find_if(mStyles.begin(), mStyles.end(),
+ [&rsStyleName](const SharedPaneStyle& rxStyle) { return rxStyle->msStyleName == rsStyleName; });
+ if (iStyle != mStyles.end())
+ return *iStyle;
+ return SharedPaneStyle();
+}
+
+//===== PaneStyle =============================================================
+
+PaneStyle::PaneStyle()
+{
+}
+
+SharedBitmapDescriptor PaneStyle::GetBitmap (const OUString& rsBitmapName) const
+{
+ if (mpBitmaps != nullptr)
+ {
+ SharedBitmapDescriptor pBitmap = mpBitmaps->GetBitmap(rsBitmapName);
+ if (pBitmap)
+ return pBitmap;
+ }
+
+ if (mpParentStyle != nullptr)
+ return mpParentStyle->GetBitmap(rsBitmapName);
+ else
+ return SharedBitmapDescriptor();
+}
+
+PresenterTheme::SharedFontDescriptor PaneStyle::GetFont() const
+{
+ if (mpFont)
+ return mpFont;
+ else if (mpParentStyle != nullptr)
+ return mpParentStyle->GetFont();
+ else
+ return PresenterTheme::SharedFontDescriptor();
+}
+
+//===== ViewStyleContainer ====================================================
+
+void ViewStyleContainer::Read (
+ const ReadContext& rReadContext,
+ const Reference<container::XHierarchicalNameAccess>& rxThemeRoot)
+{
+ Reference<container::XNameAccess> xViewStyleList (
+ PresenterConfigurationAccess::GetConfigurationNode(
+ rxThemeRoot,
+ "ViewStyles"),
+ UNO_QUERY);
+ if (xViewStyleList.is())
+ {
+ PresenterConfigurationAccess::ForAll(
+ xViewStyleList,
+ [this, &rReadContext] (OUString const&, uno::Reference<beans::XPropertySet> const& xProps)
+ {
+ return this->ProcessViewStyle(rReadContext, xProps);
+ });
+ }
+}
+
+void ViewStyleContainer::ProcessViewStyle(
+ ReadContext const & rReadContext,
+ const Reference<beans::XPropertySet>& rxProperties)
+{
+ auto pStyle = std::make_shared<ViewStyle>();
+
+ PresenterConfigurationAccess::GetProperty(rxProperties, "StyleName")
+ >>= pStyle->msStyleName;
+
+ OUString sParentStyleName;
+ if (PresenterConfigurationAccess::GetProperty(rxProperties, "ParentStyle")
+ >>= sParentStyleName)
+ {
+ // Find parent style.
+ auto iStyle = std::find_if(mStyles.begin(), mStyles.end(),
+ [&sParentStyleName](const SharedViewStyle& rxStyle) { return rxStyle->msStyleName == sParentStyleName; });
+ if (iStyle != mStyles.end())
+ {
+ pStyle->mpParentStyle = *iStyle;
+ pStyle->mpFont = (*iStyle)->mpFont;
+ pStyle->mpBackground = (*iStyle)->mpBackground;
+ }
+ }
+
+ Reference<container::XHierarchicalNameAccess> xFontNode (
+ PresenterConfigurationAccess::GetProperty(rxProperties, "Font"), UNO_QUERY);
+ PresenterTheme::SharedFontDescriptor pFont (
+ ReadContext::ReadFont(xFontNode, PresenterTheme::SharedFontDescriptor()));
+ if (pFont)
+ pStyle->mpFont = pFont;
+
+ Reference<container::XHierarchicalNameAccess> xBackgroundNode (
+ PresenterConfigurationAccess::GetProperty(rxProperties, "Background"),
+ UNO_QUERY);
+ SharedBitmapDescriptor pBackground (PresenterBitmapContainer::LoadBitmap(
+ xBackgroundNode,
+ OUString(),
+ rReadContext.mxPresenterHelper,
+ rReadContext.mxCanvas,
+ SharedBitmapDescriptor()));
+ if (pBackground && pBackground->GetNormalBitmap().is())
+ pStyle->mpBackground = pBackground;
+
+ mStyles.push_back(pStyle);
+}
+
+SharedViewStyle ViewStyleContainer::GetViewStyle (const OUString& rsStyleName) const
+{
+ auto iStyle = std::find_if(mStyles.begin(), mStyles.end(),
+ [&rsStyleName](const SharedViewStyle& rxStyle) { return rxStyle->msStyleName == rsStyleName; });
+ if (iStyle != mStyles.end())
+ return *iStyle;
+ return SharedViewStyle();
+}
+
+//===== ViewStyle =============================================================
+
+ViewStyle::ViewStyle()
+{
+}
+
+SharedBitmapDescriptor ViewStyle::GetBitmap (std::u16string_view rsBitmapName) const
+{
+ if (rsBitmapName == u"Background")
+ return mpBackground;
+ else
+ return SharedBitmapDescriptor();
+}
+
+PresenterTheme::SharedFontDescriptor ViewStyle::GetFont() const
+{
+ if (mpFont)
+ return mpFont;
+ else if (mpParentStyle != nullptr)
+ return mpParentStyle->GetFont();
+ else
+ return PresenterTheme::SharedFontDescriptor();
+}
+
+//===== StyleAssociationContainer =============================================
+
+void StyleAssociationContainer::Read (
+ const Reference<container::XHierarchicalNameAccess>& rxThemeRoot)
+{
+ Reference<container::XNameAccess> xStyleAssociationList (
+ PresenterConfigurationAccess::GetConfigurationNode(
+ rxThemeRoot,
+ "StyleAssociations"),
+ UNO_QUERY);
+ if (!xStyleAssociationList.is())
+ return;
+
+ ::std::vector<OUString> aProperties { "ResourceURL", "StyleName" };
+ PresenterConfigurationAccess::ForAll(
+ xStyleAssociationList,
+ aProperties,
+ [this] (std::vector<uno::Any> const& rValues)
+ {
+ return this->ProcessStyleAssociation(rValues);
+ });
+}
+
+OUString StyleAssociationContainer::GetStyleName (const OUString& rsResourceName) const
+{
+ StyleAssociations::const_iterator iAssociation (maStyleAssociations.find(rsResourceName));
+ if (iAssociation != maStyleAssociations.end())
+ return iAssociation->second;
+ else
+ return OUString();
+}
+
+void StyleAssociationContainer::ProcessStyleAssociation(
+ const ::std::vector<Any>& rValues)
+{
+ if (rValues.size() != 2)
+ return;
+
+ OUString sResourceURL;
+ OUString sStyleName;
+ if ((rValues[0] >>= sResourceURL)
+ && (rValues[1] >>= sStyleName))
+ {
+ maStyleAssociations[sResourceURL] = sStyleName;
+ }
+}
+
+} // end of anonymous namespace
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterTheme.hxx b/sdext/source/presenter/PresenterTheme.hxx
new file mode 100644
index 000000000..97fff4842
--- /dev/null
+++ b/sdext/source/presenter/PresenterTheme.hxx
@@ -0,0 +1,134 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERTHEME_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERTHEME_HXX
+
+#include "PresenterBitmapContainer.hxx"
+#include "PresenterConfigurationAccess.hxx"
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/rendering/XCanvas.hpp>
+#include <com/sun/star/rendering/XCanvasFont.hpp>
+#include <memory>
+
+namespace sdext::presenter {
+
+/** A theme is a set of properties describing fonts, colors, and bitmaps to be used to draw
+ background, pane borders, and view content.
+
+ At the moment the properties can be accessed via the getPropertyValue() method.
+
+ For a resource URL of a pane or a view you get the name of the
+ associated PaneStyle or ViewStyle.
+
+ For the name of pane or view style suffixed with and underscore and the
+ name of configuration property, and maybe additionally suffixed by
+ another underscore and sub property name you get the associated
+ property.
+
+ Example: you want to access the top left bitmap of a pane border
+ (simplified code):
+
+ OUString sStyleName = getPropertyValue("private:resource/pane/Presenter/Pane1");
+ XBitmap xBitmap = getPropertyValue(sStyleName + "_TopLeftBitmap");
+
+ For the offset of the bitmap you can call
+ Point aOffset = getPropertyValue(sStyleName + "_TopLeftOffset");
+
+ This is work in progress.
+*/
+class PresenterTheme
+{
+public:
+ PresenterTheme (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas);
+ ~PresenterTheme();
+
+ bool HasCanvas() const;
+ void ProvideCanvas (const css::uno::Reference<css::rendering::XCanvas>& rxCanvas);
+
+ OUString GetStyleName (const OUString& rsResourceURL) const;
+ ::std::vector<sal_Int32> GetBorderSize (
+ const OUString& rsStyleName,
+ const bool bOuter) const;
+
+ class Theme;
+ class FontDescriptor
+ {
+ public:
+ explicit FontDescriptor (const std::shared_ptr<FontDescriptor>& rpDescriptor);
+
+ OUString msFamilyName;
+ OUString msStyleName;
+ sal_Int32 mnSize;
+ sal_uInt32 mnColor;
+ OUString msAnchor;
+ sal_Int32 mnXOffset;
+ sal_Int32 mnYOffset;
+ css::uno::Reference<css::rendering::XCanvasFont> mxFont;
+
+ bool PrepareFont (const css::uno::Reference<css::rendering::XCanvas>& rxCanvas);
+
+ private:
+ css::uno::Reference<css::rendering::XCanvasFont> CreateFont (
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const double nCellSize) const;
+ double GetCellSizeForDesignSize (
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const double nDesignSize) const;
+ };
+ typedef std::shared_ptr<FontDescriptor> SharedFontDescriptor;
+
+ SharedBitmapDescriptor GetBitmap (
+ const OUString& rsStyleName,
+ const OUString& rsBitmapName) const;
+
+ SharedBitmapDescriptor GetBitmap (
+ const OUString& rsBitmapName) const;
+
+ std::shared_ptr<PresenterBitmapContainer> GetBitmapContainer() const;
+
+ SharedFontDescriptor GetFont (
+ const OUString& rsStyleName) const;
+
+ static SharedFontDescriptor ReadFont (
+ const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode,
+ const SharedFontDescriptor& rDefaultFount);
+
+ static bool ConvertToColor (
+ const css::uno::Any& rColorSequence,
+ sal_uInt32& rColor);
+
+ std::shared_ptr<PresenterConfigurationAccess> GetNodeForViewStyle (
+ const OUString& rsStyleName) const;
+
+private:
+ css::uno::Reference<css::uno::XComponentContext> mxContext;
+ std::shared_ptr<Theme> mpTheme;
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+
+ std::shared_ptr<Theme> ReadTheme();
+};
+
+} // end of namespace ::sd::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterTimer.cxx b/sdext/source/presenter/PresenterTimer.cxx
new file mode 100644
index 000000000..b03df035c
--- /dev/null
+++ b/sdext/source/presenter/PresenterTimer.cxx
@@ -0,0 +1,571 @@
+/* -*- 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 "PresenterTimer.hxx"
+
+#include <com/sun/star/lang/XMultiComponentFactory.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/frame/XTerminateListener.hpp>
+
+#include <osl/thread.hxx>
+#include <osl/conditn.hxx>
+
+#include <algorithm>
+#include <memory>
+#include <mutex>
+#include <set>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sdext::presenter {
+
+namespace {
+class TimerTask
+{
+public:
+ TimerTask (
+ const PresenterTimer::Task& rTask,
+ const TimeValue& rDueTime,
+ const sal_Int64 nRepeatInterval,
+ const sal_Int32 nTaskId);
+
+ PresenterTimer::Task maTask;
+ TimeValue maDueTime;
+ const sal_Int64 mnRepeatInterval;
+ const sal_Int32 mnTaskId;
+ bool mbIsCanceled;
+};
+
+typedef std::shared_ptr<TimerTask> SharedTimerTask;
+
+class TimerTaskComparator
+{
+public:
+ bool operator() (const SharedTimerTask& rpTask1, const SharedTimerTask& rpTask2) const
+ {
+ return rpTask1->maDueTime.Seconds < rpTask2->maDueTime.Seconds
+ || (rpTask1->maDueTime.Seconds == rpTask2->maDueTime.Seconds
+ && rpTask1->maDueTime.Nanosec < rpTask2->maDueTime.Nanosec);
+ }
+};
+
+/** Queue all scheduled tasks and process them when their time has come.
+*/
+class TimerScheduler
+ : public std::enable_shared_from_this<TimerScheduler>,
+ public ::osl::Thread
+{
+public:
+ static std::shared_ptr<TimerScheduler> Instance(
+ uno::Reference<uno::XComponentContext> const& xContext);
+ static SharedTimerTask CreateTimerTask (
+ const PresenterTimer::Task& rTask,
+ const TimeValue& rDueTime,
+ const sal_Int64 nRepeatInterval);
+
+ void ScheduleTask (const SharedTimerTask& rpTask);
+ void CancelTask (const sal_Int32 nTaskId);
+
+ static bool GetCurrentTime (TimeValue& rCurrentTime);
+ static sal_Int64 GetTimeDifference (
+ const TimeValue& rTargetTime,
+ const TimeValue& rCurrentTime);
+ static void ConvertToTimeValue (
+ TimeValue& rTimeValue,
+ const sal_Int64 nTimeDifference);
+ static sal_Int64 ConvertFromTimeValue (
+ const TimeValue& rTimeValue);
+
+ static void NotifyTermination();
+#if !defined NDEBUG
+ static bool HasInstance() { return mpInstance != nullptr; }
+#endif
+
+private:
+ static std::shared_ptr<TimerScheduler> mpInstance;
+ static std::mutex maInstanceMutex;
+ std::shared_ptr<TimerScheduler> mpLateDestroy; // for clean exit
+ static sal_Int32 mnTaskId;
+
+ std::mutex maTaskContainerMutex;
+ typedef ::std::set<SharedTimerTask,TimerTaskComparator> TaskContainer;
+ TaskContainer maScheduledTasks;
+ std::mutex maCurrentTaskMutex;
+ SharedTimerTask mpCurrentTask;
+ ::osl::Condition m_Shutdown;
+
+ TimerScheduler(
+ uno::Reference<uno::XComponentContext> const& xContext);
+public:
+ virtual void SAL_CALL run() override;
+ virtual void SAL_CALL onTerminated() override { mpLateDestroy.reset(); }
+};
+
+class TerminateListener
+ : public ::cppu::WeakImplHelper<frame::XTerminateListener>
+{
+ virtual ~TerminateListener() override
+ {
+ assert(!TimerScheduler::HasInstance());
+ }
+
+ virtual void SAL_CALL disposing(lang::EventObject const&) override
+ {
+ }
+
+ virtual void SAL_CALL queryTermination(lang::EventObject const&) override
+ {
+ }
+
+ virtual void SAL_CALL notifyTermination(lang::EventObject const&) override
+ {
+ TimerScheduler::NotifyTermination();
+ }
+};
+
+} // end of anonymous namespace
+
+//===== PresenterTimer ========================================================
+
+sal_Int32 PresenterTimer::ScheduleRepeatedTask (
+ const uno::Reference<uno::XComponentContext>& xContext,
+ const Task& rTask,
+ const sal_Int64 nDelay,
+ const sal_Int64 nInterval)
+{
+ assert(xContext.is());
+ TimeValue aCurrentTime;
+ if (TimerScheduler::GetCurrentTime(aCurrentTime))
+ {
+ TimeValue aDueTime;
+ TimerScheduler::ConvertToTimeValue(
+ aDueTime,
+ TimerScheduler::ConvertFromTimeValue (aCurrentTime) + nDelay);
+ SharedTimerTask pTask (TimerScheduler::CreateTimerTask(rTask, aDueTime, nInterval));
+ TimerScheduler::Instance(xContext)->ScheduleTask(pTask);
+ return pTask->mnTaskId;
+ }
+
+ return NotAValidTaskId;
+}
+
+void PresenterTimer::CancelTask (const sal_Int32 nTaskId)
+{
+ auto const pInstance(TimerScheduler::Instance(nullptr));
+ if (pInstance)
+ {
+ pInstance->CancelTask(nTaskId);
+ }
+}
+
+//===== TimerScheduler ========================================================
+
+std::shared_ptr<TimerScheduler> TimerScheduler::mpInstance;
+std::mutex TimerScheduler::maInstanceMutex;
+sal_Int32 TimerScheduler::mnTaskId = PresenterTimer::NotAValidTaskId;
+
+std::shared_ptr<TimerScheduler> TimerScheduler::Instance(
+ uno::Reference<uno::XComponentContext> const& xContext)
+{
+ std::scoped_lock aGuard (maInstanceMutex);
+ if (mpInstance == nullptr)
+ {
+ if (!xContext.is())
+ return nullptr;
+ mpInstance.reset(new TimerScheduler(xContext));
+ mpInstance->create();
+ }
+ return mpInstance;
+}
+
+TimerScheduler::TimerScheduler(
+ uno::Reference<uno::XComponentContext> const& xContext)
+{
+ uno::Reference<frame::XDesktop> const xDesktop(
+ frame::Desktop::create(xContext));
+ uno::Reference<frame::XTerminateListener> const xListener(
+ new TerminateListener);
+ // assuming the desktop can take ownership
+ xDesktop->addTerminateListener(xListener);
+}
+
+SharedTimerTask TimerScheduler::CreateTimerTask (
+ const PresenterTimer::Task& rTask,
+ const TimeValue& rDueTime,
+ const sal_Int64 nRepeatInterval)
+{
+ return std::make_shared<TimerTask>(rTask, rDueTime, nRepeatInterval, ++mnTaskId);
+}
+
+void TimerScheduler::ScheduleTask (const SharedTimerTask& rpTask)
+{
+ if (!rpTask)
+ return;
+ if (rpTask->mbIsCanceled)
+ return;
+
+ {
+ std::scoped_lock aTaskGuard (maTaskContainerMutex);
+ maScheduledTasks.insert(rpTask);
+ }
+}
+
+void TimerScheduler::CancelTask (const sal_Int32 nTaskId)
+{
+ // Set of scheduled tasks is sorted after their due times, not their
+ // task ids. Therefore we have to do a linear search for the task to
+ // cancel.
+ {
+ std::scoped_lock aGuard (maTaskContainerMutex);
+ auto iTask = std::find_if(maScheduledTasks.begin(), maScheduledTasks.end(),
+ [nTaskId](const SharedTimerTask& rxTask) { return rxTask->mnTaskId == nTaskId; });
+ if (iTask != maScheduledTasks.end())
+ maScheduledTasks.erase(iTask);
+ }
+
+ // The task that is to be canceled may be currently about to be
+ // processed. Mark it with a flag that a) prevents a repeating task
+ // from being scheduled again and b) tries to prevent its execution.
+ {
+ std::scoped_lock aGuard (maCurrentTaskMutex);
+ if (mpCurrentTask
+ && mpCurrentTask->mnTaskId == nTaskId)
+ mpCurrentTask->mbIsCanceled = true;
+ }
+
+ // Let the main-loop cleanup in its own time
+}
+
+void TimerScheduler::NotifyTermination()
+{
+ std::shared_ptr<TimerScheduler> const pInstance(TimerScheduler::mpInstance);
+ if (!pInstance)
+ {
+ return;
+ }
+
+ {
+ std::scoped_lock aGuard(pInstance->maTaskContainerMutex);
+ pInstance->maScheduledTasks.clear();
+ }
+
+ {
+ std::scoped_lock aGuard(pInstance->maCurrentTaskMutex);
+ if (pInstance->mpCurrentTask)
+ {
+ pInstance->mpCurrentTask->mbIsCanceled = true;
+ }
+ }
+
+ pInstance->m_Shutdown.set();
+
+ // rhbz#1425304 join thread before shutdown
+ pInstance->join();
+}
+
+void SAL_CALL TimerScheduler::run()
+{
+ osl_setThreadName("sdext::presenter::TimerScheduler");
+
+ while (true)
+ {
+ // Get the current time.
+ TimeValue aCurrentTime;
+ if ( ! GetCurrentTime(aCurrentTime))
+ {
+ // We can not get the current time and thus can not schedule anything.
+ break;
+ }
+
+ // Restrict access to the maScheduledTasks member to one, mutex
+ // guarded, block.
+ SharedTimerTask pTask;
+ sal_Int64 nDifference = 0;
+ {
+ std::scoped_lock aGuard (maTaskContainerMutex);
+
+ // There are no more scheduled task. Leave this loop, function and
+ // live of the TimerScheduler.
+ if (maScheduledTasks.empty())
+ break;
+
+ nDifference = GetTimeDifference(
+ (*maScheduledTasks.begin())->maDueTime,
+ aCurrentTime);
+ if (nDifference <= 0)
+ {
+ pTask = *maScheduledTasks.begin();
+ maScheduledTasks.erase(maScheduledTasks.begin());
+ }
+ }
+
+ // Acquire a reference to the current task.
+ {
+ std::scoped_lock aGuard (maCurrentTaskMutex);
+ mpCurrentTask = pTask;
+ }
+
+ if (!pTask)
+ {
+ // Wait until the first task becomes due.
+ TimeValue aTimeValue;
+ ConvertToTimeValue(aTimeValue, nDifference);
+ // wait on condition variable, so the thread can be stopped
+ m_Shutdown.wait(&aTimeValue);
+ }
+ else
+ {
+ // Execute task.
+ if (pTask->maTask && !pTask->mbIsCanceled)
+ {
+ pTask->maTask(aCurrentTime);
+
+ // Re-schedule repeating tasks.
+ if (pTask->mnRepeatInterval > 0)
+ {
+ ConvertToTimeValue(
+ pTask->maDueTime,
+ ConvertFromTimeValue(pTask->maDueTime)
+ + pTask->mnRepeatInterval);
+ ScheduleTask(pTask);
+ }
+ }
+
+ }
+
+ // Release reference to the current task.
+ {
+ std::scoped_lock aGuard (maCurrentTaskMutex);
+ mpCurrentTask.reset();
+ }
+ }
+
+ // While holding maInstanceMutex
+ std::scoped_lock aInstance( maInstanceMutex );
+ mpLateDestroy = mpInstance;
+ mpInstance.reset();
+}
+
+bool TimerScheduler::GetCurrentTime (TimeValue& rCurrentTime)
+{
+ TimeValue aSystemTime;
+ if (osl_getSystemTime(&aSystemTime))
+ return osl_getLocalTimeFromSystemTime(&aSystemTime, &rCurrentTime);
+ return false;
+}
+
+sal_Int64 TimerScheduler::GetTimeDifference (
+ const TimeValue& rTargetTime,
+ const TimeValue& rCurrentTime)
+{
+ return ConvertFromTimeValue(rTargetTime) - ConvertFromTimeValue(rCurrentTime);
+}
+
+void TimerScheduler::ConvertToTimeValue (
+ TimeValue& rTimeValue,
+ const sal_Int64 nTimeDifference)
+{
+ rTimeValue.Seconds = sal::static_int_cast<sal_Int32>(nTimeDifference / 1000000000L);
+ rTimeValue.Nanosec = sal::static_int_cast<sal_Int32>(nTimeDifference % 1000000000L);
+}
+
+sal_Int64 TimerScheduler::ConvertFromTimeValue (
+ const TimeValue& rTimeValue)
+{
+ return sal_Int64(rTimeValue.Seconds) * 1000000000L + rTimeValue.Nanosec;
+}
+
+//===== TimerTask =============================================================
+
+namespace {
+
+TimerTask::TimerTask (
+ const PresenterTimer::Task& rTask,
+ const TimeValue& rDueTime,
+ const sal_Int64 nRepeatInterval,
+ const sal_Int32 nTaskId)
+ : maTask(rTask),
+ maDueTime(rDueTime),
+ mnRepeatInterval(nRepeatInterval),
+ mnTaskId(nTaskId),
+ mbIsCanceled(false)
+{
+}
+
+} // end of anonymous namespace
+
+//===== PresenterTimer ========================================================
+
+::rtl::Reference<PresenterClockTimer> PresenterClockTimer::mpInstance;
+
+::rtl::Reference<PresenterClockTimer> PresenterClockTimer::Instance (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext)
+{
+ ::osl::MutexGuard aSolarGuard (::osl::Mutex::getGlobalMutex());
+
+ ::rtl::Reference<PresenterClockTimer> pTimer;
+ if (mpInstance.is())
+ {
+ pTimer = mpInstance;
+ }
+ if ( ! pTimer.is())
+ {
+ pTimer.set(new PresenterClockTimer(rxContext));
+ mpInstance = pTimer;
+ }
+ return pTimer;
+}
+
+PresenterClockTimer::PresenterClockTimer (const Reference<XComponentContext>& rxContext)
+ : PresenterClockTimerInterfaceBase(m_aMutex),
+ maDateTime(),
+ mnTimerTaskId(PresenterTimer::NotAValidTaskId),
+ mbIsCallbackPending(false),
+ m_xContext(rxContext)
+{
+ assert(m_xContext.is());
+ Reference<lang::XMultiComponentFactory> xFactory =
+ rxContext->getServiceManager();
+ if (xFactory.is())
+ mxRequestCallback.set(
+ xFactory->createInstanceWithContext(
+ "com.sun.star.awt.AsyncCallback",
+ rxContext),
+ UNO_QUERY_THROW);
+}
+
+PresenterClockTimer::~PresenterClockTimer()
+{
+ if (mnTimerTaskId != PresenterTimer::NotAValidTaskId)
+ {
+ PresenterTimer::CancelTask(mnTimerTaskId);
+ mnTimerTaskId = PresenterTimer::NotAValidTaskId;
+ }
+
+ Reference<lang::XComponent> xComponent (mxRequestCallback, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+ mxRequestCallback = nullptr;
+}
+
+void PresenterClockTimer::AddListener (const SharedListener& rListener)
+{
+ osl::MutexGuard aGuard (maMutex);
+
+ maListeners.push_back(rListener);
+
+ // Create a timer task when the first listener is added.
+ if (mnTimerTaskId==PresenterTimer::NotAValidTaskId)
+ {
+ mnTimerTaskId = PresenterTimer::ScheduleRepeatedTask(
+ m_xContext,
+ [this] (TimeValue const& rTime) { return this->CheckCurrentTime(rTime); },
+ 0,
+ 250000000 /*ns*/);
+ }
+}
+
+void PresenterClockTimer::RemoveListener (const SharedListener& rListener)
+{
+ osl::MutexGuard aGuard (maMutex);
+
+ ListenerContainer::iterator iListener (::std::find(
+ maListeners.begin(),
+ maListeners.end(),
+ rListener));
+ if (iListener != maListeners.end())
+ maListeners.erase(iListener);
+ if (maListeners.empty())
+ {
+ // We have no more clients and therefore are not interested in time changes.
+ if (mnTimerTaskId != PresenterTimer::NotAValidTaskId)
+ {
+ PresenterTimer::CancelTask(mnTimerTaskId);
+ mnTimerTaskId = PresenterTimer::NotAValidTaskId;
+ }
+ mpInstance = nullptr;
+ }
+}
+
+oslDateTime PresenterClockTimer::GetCurrentTime()
+{
+ TimeValue aCurrentTime;
+ TimerScheduler::GetCurrentTime(aCurrentTime);
+ oslDateTime aDateTime;
+ osl_getDateTimeFromTimeValue(&aCurrentTime, &aDateTime);
+ return aDateTime;
+}
+
+void PresenterClockTimer::CheckCurrentTime (const TimeValue& rCurrentTime)
+{
+ css::uno::Reference<css::awt::XRequestCallback> xRequestCallback;
+ css::uno::Reference<css::awt::XCallback> xCallback;
+ {
+ osl::MutexGuard aGuard (maMutex);
+
+ TimeValue aCurrentTime (rCurrentTime);
+ oslDateTime aDateTime;
+ if (osl_getDateTimeFromTimeValue(&aCurrentTime, &aDateTime))
+ {
+ if (aDateTime.Seconds != maDateTime.Seconds
+ || aDateTime.Minutes != maDateTime.Minutes
+ || aDateTime.Hours != maDateTime.Hours)
+ {
+ // The displayed part of the current time has changed.
+ // Prepare to call the listeners.
+ maDateTime = aDateTime;
+
+ // Schedule notification of listeners.
+ if (mxRequestCallback.is() && ! mbIsCallbackPending)
+ {
+ mbIsCallbackPending = true;
+ xRequestCallback = mxRequestCallback;
+ xCallback = this;
+ }
+ }
+ }
+ }
+ if (xRequestCallback.is() && xCallback.is())
+ xRequestCallback->addCallback(xCallback, Any());
+}
+
+//----- XCallback -------------------------------------------------------------
+
+void SAL_CALL PresenterClockTimer::notify (const css::uno::Any&)
+{
+ ListenerContainer aListenerCopy;
+
+ {
+ osl::MutexGuard aGuard (maMutex);
+
+ mbIsCallbackPending = false;
+
+ aListenerCopy = maListeners;
+ }
+
+ for (const auto& rxListener : aListenerCopy)
+ {
+ rxListener->TimeHasChanged(maDateTime);
+ }
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterTimer.hxx b/sdext/source/presenter/PresenterTimer.hxx
new file mode 100644
index 000000000..1c2b6530b
--- /dev/null
+++ b/sdext/source/presenter/PresenterTimer.hxx
@@ -0,0 +1,122 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERTIMER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERTIMER_HXX
+
+#include <com/sun/star/awt/XCallback.hpp>
+#include <com/sun/star/awt/XRequestCallback.hpp>
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <osl/mutex.hxx>
+#include <osl/time.h>
+#include <rtl/ref.hxx>
+#include <sal/types.h>
+
+#include <functional>
+#include <memory>
+#include <vector>
+
+namespace com::sun::star::uno { class XComponentContext; }
+
+namespace sdext::presenter {
+
+/** The timer allows tasks to be scheduled for execution at a specified time
+ in the future.
+*/
+class PresenterTimer
+{
+public:
+ /** A task is called with the current time.
+ */
+ typedef ::std::function<void (const TimeValue&)> Task;
+
+ static const sal_Int32 NotAValidTaskId = 0;
+
+ /** Schedule a task to be executed repeatedly. The task is executed the
+ first time after nFirst nano-seconds (1000000000 corresponds to one
+ second). After that task is executed in intervals that are
+ nInterval ns long until CancelTask is called.
+ */
+ static sal_Int32 ScheduleRepeatedTask (
+ const css::uno::Reference<css::uno::XComponentContext>& xContext,
+ const Task& rTask,
+ const sal_Int64 nFirst,
+ const sal_Int64 nInterval);
+
+ static void CancelTask (const sal_Int32 nTaskId);
+};
+
+typedef cppu::WeakComponentImplHelper<
+ css::awt::XCallback
+ > PresenterClockTimerInterfaceBase;
+
+/** A timer that calls its listeners, typically clocks, every second to
+ update their current time value.
+*/
+class PresenterClockTimer
+ : protected ::cppu::BaseMutex,
+ public PresenterClockTimerInterfaceBase
+{
+public:
+ class Listener {
+ public:
+ virtual void TimeHasChanged (const oslDateTime& rCurrentTime) = 0;
+
+ protected:
+ ~Listener() {}
+ };
+ typedef std::shared_ptr<Listener> SharedListener;
+
+ static ::rtl::Reference<PresenterClockTimer> Instance (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext);
+
+ void AddListener (const SharedListener& rListener);
+ void RemoveListener (const SharedListener& rListener);
+
+ static oslDateTime GetCurrentTime();
+
+ // XCallback
+
+ virtual void SAL_CALL notify (const css::uno::Any& rUserData) override;
+
+private:
+ static ::rtl::Reference<PresenterClockTimer> mpInstance;
+
+ ::osl::Mutex maMutex;
+ typedef ::std::vector<SharedListener> ListenerContainer;
+ ListenerContainer maListeners;
+ oslDateTime maDateTime;
+ sal_Int32 mnTimerTaskId;
+ bool mbIsCallbackPending;
+ css::uno::Reference<css::awt::XRequestCallback> mxRequestCallback;
+ const css::uno::Reference<css::uno::XComponentContext> m_xContext;
+
+ PresenterClockTimer (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext);
+ virtual ~PresenterClockTimer() override;
+
+ void CheckCurrentTime (const TimeValue& rCurrentTime);
+};
+
+} // end of namespace ::sdext::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterToolBar.cxx b/sdext/source/presenter/PresenterToolBar.cxx
new file mode 100644
index 000000000..75a4b7500
--- /dev/null
+++ b/sdext/source/presenter/PresenterToolBar.cxx
@@ -0,0 +1,2015 @@
+/* -*- 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 <vcl/settings.hxx>
+#include "PresenterToolBar.hxx"
+
+#include "PresenterBitmapContainer.hxx"
+#include "PresenterCanvasHelper.hxx"
+#include "PresenterGeometryHelper.hxx"
+#include "PresenterPaintManager.hxx"
+#include "PresenterTimer.hxx"
+#include "PresenterWindowManager.hxx"
+
+#include <cppuhelper/compbase.hxx>
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/geometry/AffineMatrix2D.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <com/sun/star/rendering/RenderState.hpp>
+#include <com/sun/star/rendering/TextDirection.hpp>
+#include <com/sun/star/rendering/ViewState.hpp>
+#include <com/sun/star/rendering/XSpriteCanvas.hpp>
+#include <com/sun/star/util/Color.hpp>
+#include <rtl/ustrbuf.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sdext::presenter {
+
+const sal_Int32 gnGapSize (20);
+
+namespace {
+
+ class Text
+ {
+ public:
+ Text();
+ Text (
+ const OUString& rsText,
+ const PresenterTheme::SharedFontDescriptor& rpFont);
+
+ void SetText (const OUString& rsText);
+ const OUString& GetText() const;
+ const PresenterTheme::SharedFontDescriptor& GetFont() const;
+
+ void Paint (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const rendering::ViewState& rViewState,
+ const awt::Rectangle& rBoundingBox);
+
+ geometry::RealRectangle2D GetBoundingBox (
+ const Reference<rendering::XCanvas>& rxCanvas);
+
+ private:
+ OUString msText;
+ PresenterTheme::SharedFontDescriptor mpFont;
+ };
+
+ class ElementMode
+ {
+ public:
+ ElementMode();
+ ElementMode(const ElementMode&) = delete;
+ ElementMode& operator=(const ElementMode&) = delete;
+
+ SharedBitmapDescriptor mpIcon;
+ OUString msAction;
+ Text maText;
+
+ void ReadElementMode (
+ const Reference<beans::XPropertySet>& rxProperties,
+ const OUString& rsModeName,
+ std::shared_ptr<ElementMode> const & rpDefaultMode,
+ ::sdext::presenter::PresenterToolBar::Context const & rContext);
+ };
+ typedef std::shared_ptr<ElementMode> SharedElementMode;
+
+} // end of anonymous namespace
+
+class PresenterToolBar::Context
+{
+public:
+ Context() = default;
+ Context(const Context&) = delete;
+ Context& operator=(const Context&) = delete;
+ Reference<drawing::XPresenterHelper> mxPresenterHelper;
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+};
+
+//===== PresenterToolBar::Element =============================================
+
+namespace {
+ typedef cppu::WeakComponentImplHelper<
+ css::document::XEventListener,
+ css::frame::XStatusListener
+ > ElementInterfaceBase;
+
+ class Element
+ : private ::cppu::BaseMutex,
+ public ElementInterfaceBase
+ {
+ public:
+ explicit Element (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
+ Element(const Element&) = delete;
+ Element& operator=(const Element&) = delete;
+
+ virtual void SAL_CALL disposing() override;
+
+ virtual void SetModes (
+ const SharedElementMode& rpNormalMode,
+ const SharedElementMode& rpMouseOverMode,
+ const SharedElementMode& rpSelectedMode,
+ const SharedElementMode& rpDisabledMode,
+ const SharedElementMode& rpMouseOverSelectedMode);
+ void CurrentSlideHasChanged();
+ void SetLocation (const awt::Point& rLocation);
+ void SetSize (const geometry::RealSize2D& rSize);
+ virtual void Paint (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const rendering::ViewState& rViewState) = 0;
+ awt::Size const & GetBoundingSize (
+ const Reference<rendering::XCanvas>& rxCanvas);
+ awt::Rectangle GetBoundingBox() const;
+ virtual bool SetState (const bool bIsOver, const bool bIsPressed);
+ void Invalidate (const bool bSynchronous);
+ bool IsOutside (const awt::Rectangle& rBox);
+ virtual bool IsFilling() const;
+ void UpdateState();
+
+ // lang::XEventListener
+
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+
+ // document::XEventListener
+
+ virtual void SAL_CALL notifyEvent (const css::document::EventObject& rEvent) override;
+
+ // frame::XStatusListener
+
+ virtual void SAL_CALL statusChanged (const css::frame::FeatureStateEvent& rEvent) override;
+
+ protected:
+ ::rtl::Reference<PresenterToolBar> mpToolBar;
+ awt::Point maLocation;
+ awt::Size maSize;
+ SharedElementMode mpNormal;
+ SharedElementMode mpMouseOver;
+ SharedElementMode mpSelected;
+ SharedElementMode mpDisabled;
+ SharedElementMode mpMouseOverSelected;
+ SharedElementMode mpMode;
+ bool mbIsOver;
+ bool mbIsPressed;
+ bool mbIsSelected;
+
+ virtual awt::Size CreateBoundingSize (
+ const Reference<rendering::XCanvas>& rxCanvas) = 0;
+
+ bool IsEnabled() const { return mbIsEnabled;}
+ private:
+ bool mbIsEnabled;
+ };
+
+} // end of anonymous namespace
+
+class PresenterToolBar::ElementContainerPart
+ : public ::std::vector<rtl::Reference<Element> >
+{
+};
+
+//===== Button ================================================================
+
+namespace {
+
+ class Button : public Element
+ {
+ public:
+ static ::rtl::Reference<Element> Create (
+ const ::rtl::Reference<PresenterToolBar>& rpToolBar);
+
+ virtual void SAL_CALL disposing() override;
+
+ virtual void Paint (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const rendering::ViewState& rViewState) override;
+
+ // lang::XEventListener
+
+ virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent) override;
+
+ protected:
+ virtual awt::Size CreateBoundingSize (
+ const Reference<rendering::XCanvas>& rxCanvas) override;
+
+ private:
+ bool mbIsListenerRegistered;
+
+ Button (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
+ void Initialize();
+ void PaintIcon (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const sal_Int32 nTextHeight,
+ const rendering::ViewState& rViewState);
+ PresenterBitmapDescriptor::Mode GetMode() const;
+ };
+
+//===== Label =================================================================
+
+ class Label : public Element
+ {
+ public:
+ explicit Label (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
+
+ void SetText (const OUString& rsText);
+ virtual void Paint (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const rendering::ViewState& rViewState) override;
+ virtual bool SetState (const bool bIsOver, const bool bIsPressed) override;
+
+ protected:
+ virtual awt::Size CreateBoundingSize (
+ const Reference<rendering::XCanvas>& rxCanvas) override;
+ };
+
+// Some specialized controls.
+
+ class TimeFormatter
+ {
+ public:
+ static OUString FormatTime (const oslDateTime& rTime);
+ };
+
+ class TimeLabel : public Label
+ {
+ public:
+ void ConnectToTimer();
+ virtual void TimeHasChanged (const oslDateTime& rCurrentTime) = 0;
+ protected:
+ explicit TimeLabel(const ::rtl::Reference<PresenterToolBar>& rpToolBar);
+ using Element::disposing;
+ virtual void SAL_CALL disposing() override;
+ private:
+ class Listener : public PresenterClockTimer::Listener
+ {
+ public:
+ explicit Listener (const ::rtl::Reference<TimeLabel>& rxLabel)
+ : mxLabel(rxLabel) {}
+ virtual ~Listener() {}
+ virtual void TimeHasChanged (const oslDateTime& rCurrentTime) override
+ { if (mxLabel.is()) mxLabel->TimeHasChanged(rCurrentTime); }
+ private:
+ ::rtl::Reference<TimeLabel> mxLabel;
+ };
+ std::shared_ptr<PresenterClockTimer::Listener> mpListener;
+ };
+
+ class CurrentTimeLabel : public TimeLabel
+ {
+ public:
+ static ::rtl::Reference<Element> Create (
+ const ::rtl::Reference<PresenterToolBar>& rpToolBar);
+ virtual void SetModes (
+ const SharedElementMode& rpNormalMode,
+ const SharedElementMode& rpMouseOverMode,
+ const SharedElementMode& rpSelectedMode,
+ const SharedElementMode& rpDisabledMode,
+ const SharedElementMode& rpMouseOverSelectedMode) override;
+ private:
+ CurrentTimeLabel (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
+ virtual ~CurrentTimeLabel() override;
+ virtual void TimeHasChanged (const oslDateTime& rCurrentTime) override;
+ };
+
+ class PresentationTimeLabel : public TimeLabel, public IPresentationTime
+ {
+ public:
+ static ::rtl::Reference<Element> Create (
+ const ::rtl::Reference<PresenterToolBar>& rpToolBar);
+ virtual void SetModes (
+ const SharedElementMode& rpNormalMode,
+ const SharedElementMode& rpMouseOverMode,
+ const SharedElementMode& rpSelectedMode,
+ const SharedElementMode& rpDisabledMode,
+ const SharedElementMode& rpMouseOverSelectedMode) override;
+ virtual void restart() override;
+ virtual bool isPaused() override;
+ virtual void setPauseStatus(const bool pauseStatus) override;
+ const TimeValue& getPauseTimeValue() const;
+ void setPauseTimeValue(const TimeValue pauseTime);
+ private:
+ TimeValue maStartTimeValue;
+ TimeValue pauseTimeValue;
+ PresentationTimeLabel (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
+ bool paused;
+ virtual ~PresentationTimeLabel() override;
+ virtual void TimeHasChanged (const oslDateTime& rCurrentTime) override;
+ };
+
+ class VerticalSeparator : public Element
+ {
+ public:
+ explicit VerticalSeparator (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
+ virtual void Paint (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const rendering::ViewState& rViewState) override;
+ virtual bool IsFilling() const override;
+
+ protected:
+ virtual awt::Size CreateBoundingSize (
+ const Reference<rendering::XCanvas>& rxCanvas) override;
+ };
+
+ class HorizontalSeparator : public Element
+ {
+ public:
+ explicit HorizontalSeparator (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
+ virtual void Paint (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const rendering::ViewState& rViewState) override;
+ virtual bool IsFilling() const override;
+
+ protected:
+ virtual awt::Size CreateBoundingSize (
+ const Reference<rendering::XCanvas>& rxCanvas) override;
+ };
+} // end of anonymous namespace
+
+//===== PresenterToolBar ======================================================
+
+PresenterToolBar::PresenterToolBar (
+ const Reference<XComponentContext>& rxContext,
+ const css::uno::Reference<css::awt::XWindow>& rxWindow,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const ::rtl::Reference<PresenterController>& rpPresenterController,
+ const Anchor eAnchor)
+ : PresenterToolBarInterfaceBase(m_aMutex),
+ mxComponentContext(rxContext),
+ mxWindow(rxWindow),
+ mxCanvas(rxCanvas),
+ mpPresenterController(rpPresenterController),
+ mbIsLayoutPending(false),
+ meAnchor(eAnchor)
+{
+}
+
+void PresenterToolBar::Initialize (
+ const OUString& rsConfigurationPath)
+{
+ try
+ {
+ CreateControls(rsConfigurationPath);
+
+ if (mxWindow.is())
+ {
+ mxWindow->addWindowListener(this);
+ mxWindow->addPaintListener(this);
+ mxWindow->addMouseListener(this);
+ mxWindow->addMouseMotionListener(this);
+
+ Reference<awt::XWindowPeer> xPeer (mxWindow, UNO_QUERY);
+ if (xPeer.is())
+ xPeer->setBackground(util::Color(0xff000000));
+
+ mxWindow->setVisible(true);
+ }
+
+ mxSlideShowController = mpPresenterController->GetSlideShowController();
+ UpdateSlideNumber();
+ mbIsLayoutPending = true;
+ }
+ catch (RuntimeException&)
+ {
+ mpCurrentContainerPart.reset();
+ maElementContainer.clear();
+ throw;
+ }
+}
+
+PresenterToolBar::~PresenterToolBar()
+{
+}
+
+void SAL_CALL PresenterToolBar::disposing()
+{
+ if (mxWindow.is())
+ {
+ mxWindow->removeWindowListener(this);
+ mxWindow->removePaintListener(this);
+ mxWindow->removeMouseListener(this);
+ mxWindow->removeMouseMotionListener(this);
+ mxWindow = nullptr;
+ }
+
+ // Dispose tool bar elements.
+ for (const auto& rxPart : maElementContainer)
+ {
+ OSL_ASSERT(rxPart != nullptr);
+ for (const rtl::Reference<Element>& pElement : *rxPart)
+ {
+ if (pElement)
+ {
+ Reference<lang::XComponent> xComponent = pElement;
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ }
+ }
+
+ mpCurrentContainerPart.reset();
+ maElementContainer.clear();
+}
+
+void PresenterToolBar::InvalidateArea (
+ const awt::Rectangle& rRepaintBox,
+ const bool bSynchronous)
+{
+ std::shared_ptr<PresenterPaintManager> xManager(mpPresenterController->GetPaintManager());
+ if (!xManager)
+ return;
+ xManager->Invalidate(
+ mxWindow,
+ rRepaintBox,
+ bSynchronous);
+}
+
+void PresenterToolBar::RequestLayout()
+{
+ mbIsLayoutPending = true;
+
+ std::shared_ptr<PresenterPaintManager> xManager(mpPresenterController->GetPaintManager());
+ if (!xManager)
+ return;
+
+ xManager->Invalidate(mxWindow);
+}
+
+geometry::RealSize2D const & PresenterToolBar::GetMinimalSize()
+{
+ if (mbIsLayoutPending)
+ Layout(mxCanvas);
+ return maMinimalSize;
+}
+
+const ::rtl::Reference<PresenterController>& PresenterToolBar::GetPresenterController() const
+{
+ return mpPresenterController;
+}
+
+const Reference<XComponentContext>& PresenterToolBar::GetComponentContext() const
+{
+ return mxComponentContext;
+}
+
+//----- lang::XEventListener -------------------------------------------------
+
+void SAL_CALL PresenterToolBar::disposing (const lang::EventObject& rEventObject)
+{
+ if (rEventObject.Source == mxWindow)
+ mxWindow = nullptr;
+}
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL PresenterToolBar::windowResized (const awt::WindowEvent&)
+{
+ mbIsLayoutPending = true;
+}
+
+void SAL_CALL PresenterToolBar::windowMoved (const awt::WindowEvent&) {}
+
+void SAL_CALL PresenterToolBar::windowShown (const lang::EventObject&)
+{
+ mbIsLayoutPending = true;
+}
+
+void SAL_CALL PresenterToolBar::windowHidden (const lang::EventObject&) {}
+
+//----- XPaintListener --------------------------------------------------------
+void SAL_CALL PresenterToolBar::windowPaint (const css::awt::PaintEvent& rEvent)
+{
+ if ( ! mxCanvas.is())
+ return;
+
+ if ( ! mbIsPresenterViewActive)
+ return;
+
+ const rendering::ViewState aViewState (
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ PresenterGeometryHelper::CreatePolygon(rEvent.UpdateRect, mxCanvas->getDevice()));
+
+ if (mbIsLayoutPending)
+ Layout(mxCanvas);
+
+ Paint(rEvent.UpdateRect, aViewState);
+
+ // Make the back buffer visible.
+ Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxCanvas, UNO_QUERY);
+ if (xSpriteCanvas.is())
+ xSpriteCanvas->updateScreen(false);
+}
+
+//----- XMouseListener --------------------------------------------------------
+void SAL_CALL PresenterToolBar::mousePressed (const css::awt::MouseEvent& rEvent)
+{
+ ThrowIfDisposed();
+ CheckMouseOver(rEvent, true, true);
+}
+
+void SAL_CALL PresenterToolBar::mouseReleased (const css::awt::MouseEvent& rEvent)
+{
+ ThrowIfDisposed();
+ CheckMouseOver(rEvent, true);
+}
+
+void SAL_CALL PresenterToolBar::mouseEntered (const css::awt::MouseEvent& rEvent)
+{
+ ThrowIfDisposed();
+ CheckMouseOver(rEvent, true);
+}
+
+void SAL_CALL PresenterToolBar::mouseExited (const css::awt::MouseEvent& rEvent)
+{
+ ThrowIfDisposed();
+ CheckMouseOver(rEvent, false);
+ }
+
+//----- XMouseMotionListener --------------------------------------------------
+
+void SAL_CALL PresenterToolBar::mouseMoved (const css::awt::MouseEvent& rEvent)
+{
+ ThrowIfDisposed();
+ CheckMouseOver(rEvent, true);
+ }
+
+void SAL_CALL PresenterToolBar::mouseDragged (const css::awt::MouseEvent&)
+{
+ ThrowIfDisposed();
+}
+
+//----- XDrawView -------------------------------------------------------------
+
+void SAL_CALL PresenterToolBar::setCurrentPage (const Reference<drawing::XDrawPage>& rxSlide)
+{
+ if (rxSlide != mxCurrentSlide)
+ {
+ mxCurrentSlide = rxSlide;
+ UpdateSlideNumber();
+ }
+}
+
+Reference<drawing::XDrawPage> SAL_CALL PresenterToolBar::getCurrentPage()
+{
+ return mxCurrentSlide;
+}
+
+
+void PresenterToolBar::CreateControls (
+ const OUString& rsConfigurationPath)
+{
+ if ( ! mxWindow.is())
+ return;
+
+ // Expand the macro in the bitmap file names.
+ PresenterConfigurationAccess aConfiguration (
+ mxComponentContext,
+ "/org.openoffice.Office.PresenterScreen/",
+ PresenterConfigurationAccess::READ_ONLY);
+
+ mpCurrentContainerPart = std::make_shared<ElementContainerPart>();
+ maElementContainer.clear();
+ maElementContainer.push_back(mpCurrentContainerPart);
+
+ Reference<container::XHierarchicalNameAccess> xToolBarNode (
+ aConfiguration.GetConfigurationNode(rsConfigurationPath),
+ UNO_QUERY);
+ if (!xToolBarNode.is())
+ return;
+
+ Reference<container::XNameAccess> xEntries (
+ PresenterConfigurationAccess::GetConfigurationNode(xToolBarNode, "Entries"),
+ UNO_QUERY);
+ Context aContext;
+ aContext.mxPresenterHelper = mpPresenterController->GetPresenterHelper();
+ aContext.mxCanvas = mxCanvas;
+ if (xEntries.is()
+ && aContext.mxPresenterHelper.is()
+ && aContext.mxCanvas.is())
+ {
+ PresenterConfigurationAccess::ForAll(
+ xEntries,
+ [this, &aContext] (OUString const&, uno::Reference<beans::XPropertySet> const& xProps)
+ {
+ return this->ProcessEntry(xProps, aContext);
+ });
+ }
+}
+
+void PresenterToolBar::ProcessEntry (
+ const Reference<beans::XPropertySet>& rxProperties,
+ Context const & rContext)
+{
+ if ( ! rxProperties.is())
+ return;
+
+ // Type has to be present.
+ OUString sType;
+ if ( ! (PresenterConfigurationAccess::GetProperty(rxProperties, "Type") >>= sType))
+ return;
+
+ // Read mode specific values.
+ SharedElementMode pNormalMode = std::make_shared<ElementMode>();
+ SharedElementMode pMouseOverMode = std::make_shared<ElementMode>();
+ SharedElementMode pSelectedMode = std::make_shared<ElementMode>();
+ SharedElementMode pDisabledMode = std::make_shared<ElementMode>();
+ SharedElementMode pMouseOverSelectedMode = std::make_shared<ElementMode>();
+ pNormalMode->ReadElementMode(rxProperties, "Normal", pNormalMode, rContext);
+ pMouseOverMode->ReadElementMode(rxProperties, "MouseOver", pNormalMode, rContext);
+ pSelectedMode->ReadElementMode(rxProperties, "Selected", pNormalMode, rContext);
+ pDisabledMode->ReadElementMode(rxProperties, "Disabled", pNormalMode, rContext);
+ pMouseOverSelectedMode->ReadElementMode(rxProperties, "MouseOverSelected", pSelectedMode, rContext);
+
+ // Create new element.
+ ::rtl::Reference<Element> pElement;
+ if ( sType == "Button" )
+ pElement = Button::Create(this);
+ else if ( sType == "CurrentTimeLabel" )
+ pElement = CurrentTimeLabel::Create(this);
+ else if ( sType == "PresentationTimeLabel" )
+ pElement = PresentationTimeLabel::Create(this);
+ else if ( sType == "VerticalSeparator" )
+ pElement.set(new VerticalSeparator(this));
+ else if ( sType == "HorizontalSeparator" )
+ pElement.set(new HorizontalSeparator(this));
+ else if ( sType == "Label" )
+ pElement.set(new Label(this));
+ else if ( sType == "ChangeOrientation" )
+ {
+ mpCurrentContainerPart = std::make_shared<ElementContainerPart>();
+ maElementContainer.push_back(mpCurrentContainerPart);
+ return;
+ }
+ if (pElement.is())
+ {
+ pElement->SetModes( pNormalMode, pMouseOverMode, pSelectedMode, pDisabledMode, pMouseOverSelectedMode);
+ pElement->UpdateState();
+ if (mpCurrentContainerPart)
+ mpCurrentContainerPart->push_back(pElement);
+ }
+}
+
+void PresenterToolBar::Layout (
+ const Reference<rendering::XCanvas>& rxCanvas)
+{
+ if (maElementContainer.empty())
+ return;
+
+ mbIsLayoutPending = false;
+
+ const awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ ::std::vector<geometry::RealSize2D> aPartSizes (maElementContainer.size());
+ geometry::RealSize2D aTotalSize (0,0);
+ bool bIsHorizontal (true);
+ sal_Int32 nIndex (0);
+ double nTotalHorizontalGap (0);
+ sal_Int32 nGapCount (0);
+ for (const auto& rxPart : maElementContainer)
+ {
+ geometry::RealSize2D aSize (CalculatePartSize(rxCanvas, rxPart, bIsHorizontal));
+
+ // Remember the size of each part for later.
+ aPartSizes[nIndex] = aSize;
+
+ // Add gaps between elements.
+ if (rxPart->size()>1 && bIsHorizontal)
+ {
+ nTotalHorizontalGap += (rxPart->size() - 1) * gnGapSize;
+ nGapCount += rxPart->size() - 1;
+ }
+
+ // Orientation changes for each part.
+ bIsHorizontal = !bIsHorizontal;
+ // Width is accumulated.
+ aTotalSize.Width += aSize.Width;
+ // Height is the maximum height of all parts.
+ aTotalSize.Height = ::std::max(aTotalSize.Height, aSize.Height);
+ ++nIndex;
+ }
+ // Add gaps between parts.
+ if (maElementContainer.size() > 1)
+ {
+ nTotalHorizontalGap += (maElementContainer.size() - 1) * gnGapSize;
+ nGapCount += maElementContainer.size()-1;
+ }
+
+ // Done to introduce gap between the end of the toolbar and the last button
+ aTotalSize.Width += gnGapSize/2;
+
+ // Calculate the minimal size so that the window size of the tool bar
+ // can be adapted accordingly.
+ maMinimalSize = aTotalSize;
+ maMinimalSize.Width += nTotalHorizontalGap;
+
+ // Calculate the gaps between elements.
+ double nGapWidth (0);
+ if (nGapCount > 0)
+ {
+ if (aTotalSize.Width + nTotalHorizontalGap > aWindowBox.Width)
+ nTotalHorizontalGap = aWindowBox.Width - aTotalSize.Width;
+ nGapWidth = nTotalHorizontalGap / nGapCount;
+ }
+
+ // Determine the location of the left edge.
+ double nX (0);
+ switch (meAnchor)
+ {
+ case Left : nX = 0; break;
+ case Center: nX = (aWindowBox.Width - aTotalSize.Width - nTotalHorizontalGap) / 2; break;
+ }
+
+ // Place the parts.
+ double nY ((aWindowBox.Height - aTotalSize.Height) / 2);
+ bIsHorizontal = true;
+
+ /* push front or back ? ... */
+ /// check whether RTL interface or not
+ if(!AllSettings::GetLayoutRTL()){
+ nIndex = 0;
+ for (const auto& rxPart : maElementContainer)
+ {
+ geometry::RealRectangle2D aBoundingBox(
+ nX, nY,
+ nX+aPartSizes[nIndex].Width, nY+aTotalSize.Height);
+
+ // Add space for gaps between elements.
+ if (rxPart->size() > 1 && bIsHorizontal)
+ aBoundingBox.X2 += (rxPart->size() - 1) * nGapWidth;
+
+ LayoutPart(rxCanvas, rxPart, aBoundingBox, aPartSizes[nIndex], bIsHorizontal);
+ bIsHorizontal = !bIsHorizontal;
+ nX += aBoundingBox.X2 - aBoundingBox.X1 + nGapWidth;
+ ++nIndex;
+ }
+ }
+ else {
+ ElementContainer::iterator iPart;
+ ElementContainer::iterator iBegin (maElementContainer.begin());
+ for (iPart=maElementContainer.end()-1, nIndex=2; iPart!=iBegin-1; --iPart, --nIndex)
+ {
+ geometry::RealRectangle2D aBoundingBox(
+ nX, nY,
+ nX+aPartSizes[nIndex].Width, nY+aTotalSize.Height);
+
+ // Add space for gaps between elements.
+ if ((*iPart)->size() > 1)
+ if (bIsHorizontal)
+ aBoundingBox.X2 += ((*iPart)->size()-1) * nGapWidth;
+
+ LayoutPart(rxCanvas, *iPart, aBoundingBox, aPartSizes[nIndex], bIsHorizontal);
+ bIsHorizontal = !bIsHorizontal;
+ nX += aBoundingBox.X2 - aBoundingBox.X1 + nGapWidth;
+ }
+ }
+
+ // The whole window has to be repainted.
+ std::shared_ptr<PresenterPaintManager> xManager(mpPresenterController->GetPaintManager());
+ if (!xManager)
+ return;
+ xManager->Invalidate(mxWindow);
+}
+
+geometry::RealSize2D PresenterToolBar::CalculatePartSize (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const SharedElementContainerPart& rpPart,
+ const bool bIsHorizontal)
+{
+ geometry::RealSize2D aTotalSize (0,0);
+
+ if (mxWindow.is())
+ {
+ // Calculate the summed width of all elements.
+ for (const auto& rxElement : *rpPart)
+ {
+ if (!rxElement)
+ continue;
+
+ const awt::Size aBSize (rxElement->GetBoundingSize(rxCanvas));
+ if (bIsHorizontal)
+ {
+ aTotalSize.Width += aBSize.Width;
+ if (aBSize.Height > aTotalSize.Height)
+ aTotalSize.Height = aBSize.Height;
+ }
+ else
+ {
+ aTotalSize.Height += aBSize.Height;
+ if (aBSize.Width > aTotalSize.Width)
+ aTotalSize.Width = aBSize.Width;
+ }
+ }
+ }
+ return aTotalSize;
+}
+
+void PresenterToolBar::LayoutPart (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const SharedElementContainerPart& rpPart,
+ const geometry::RealRectangle2D& rBoundingBox,
+ const geometry::RealSize2D& rPartSize,
+ const bool bIsHorizontal)
+{
+ double nGap (0);
+ if (rpPart->size() > 1)
+ {
+ if (bIsHorizontal)
+ nGap = (rBoundingBox.X2 - rBoundingBox.X1 - rPartSize.Width) / (rpPart->size()-1);
+ else
+ nGap = (rBoundingBox.Y2 - rBoundingBox.Y1 - rPartSize.Height) / (rpPart->size()-1);
+ }
+
+ // Place the elements.
+ double nX (rBoundingBox.X1);
+ double nY (rBoundingBox.Y1);
+
+ /// check whether RTL interface or not
+ if(!AllSettings::GetLayoutRTL()){
+ for (auto& rxElement : *rpPart)
+ {
+ if (!rxElement)
+ continue;
+
+ const awt::Size aElementSize (rxElement->GetBoundingSize(rxCanvas));
+ if (bIsHorizontal)
+ {
+ if (rxElement->IsFilling())
+ {
+ nY = rBoundingBox.Y1;
+ rxElement->SetSize(geometry::RealSize2D(aElementSize.Width, rBoundingBox.Y2 - rBoundingBox.Y1));
+ }
+ else
+ nY = rBoundingBox.Y1 + (rBoundingBox.Y2-rBoundingBox.Y1 - aElementSize.Height) / 2;
+ rxElement->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY)));
+ nX += aElementSize.Width + nGap;
+ }
+ else
+ {
+ if (rxElement->IsFilling())
+ {
+ nX = rBoundingBox.X1;
+ rxElement->SetSize(geometry::RealSize2D(rBoundingBox.X2 - rBoundingBox.X1, aElementSize.Height));
+ }
+ else
+ nX = rBoundingBox.X1 + (rBoundingBox.X2-rBoundingBox.X1 - aElementSize.Width) / 2;
+ rxElement->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY)));
+ nY += aElementSize.Height + nGap;
+ }
+ }
+ }
+ else {
+ ElementContainerPart::const_iterator iElement;
+ ElementContainerPart::const_iterator iBegin (rpPart->begin());
+
+ for (iElement=rpPart->end()-1; iElement!=iBegin-1; --iElement)
+ {
+ if (iElement->get() == nullptr)
+ continue;
+
+ const awt::Size aElementSize ((*iElement)->GetBoundingSize(rxCanvas));
+ if (bIsHorizontal)
+ {
+ if ((*iElement)->IsFilling())
+ {
+ nY = rBoundingBox.Y1;
+ (*iElement)->SetSize(geometry::RealSize2D(aElementSize.Width, rBoundingBox.Y2 - rBoundingBox.Y1));
+ }
+ else
+ nY = rBoundingBox.Y1 + (rBoundingBox.Y2-rBoundingBox.Y1 - aElementSize.Height) / 2;
+ (*iElement)->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY)));
+ nX += aElementSize.Width + nGap;
+ }
+ else
+ {
+ // reverse presentation time with current time
+ if (iElement==iBegin){
+ iElement=iBegin+2;
+ }
+ else if (iElement==iBegin+2){
+ iElement=iBegin;
+ }
+ const awt::Size aNewElementSize ((*iElement)->GetBoundingSize(rxCanvas));
+ if ((*iElement)->IsFilling())
+ {
+ nX = rBoundingBox.X1;
+ (*iElement)->SetSize(geometry::RealSize2D(rBoundingBox.X2 - rBoundingBox.X1, aNewElementSize.Height));
+ }
+ else
+ nX = rBoundingBox.X1 + (rBoundingBox.X2-rBoundingBox.X1 - aNewElementSize.Width) / 2;
+ (*iElement)->SetLocation(awt::Point(sal_Int32(0.5 + nX), sal_Int32(0.5 + nY)));
+ nY += aNewElementSize.Height + nGap;
+
+ // return the index as it was before the reversing
+ if (iElement==iBegin)
+ iElement=iBegin+2;
+ else if (iElement==iBegin+2)
+ iElement=iBegin;
+ }
+ }
+ }
+}
+
+void PresenterToolBar::Paint (
+ const awt::Rectangle& rUpdateBox,
+ const rendering::ViewState& rViewState)
+{
+ OSL_ASSERT(mxCanvas.is());
+
+ for (const auto& rxPart : maElementContainer)
+ {
+ for (auto& rxElement : *rxPart)
+ {
+ if (rxElement)
+ {
+ if ( ! rxElement->IsOutside(rUpdateBox))
+ rxElement->Paint(mxCanvas, rViewState);
+ }
+ }
+ }
+}
+
+void PresenterToolBar::UpdateSlideNumber()
+{
+ if( mxSlideShowController.is() )
+ {
+ for (const auto& rxPart : maElementContainer)
+ {
+ for (auto& rxElement : *rxPart)
+ {
+ if (rxElement)
+ rxElement->CurrentSlideHasChanged();
+ }
+ }
+ }
+}
+
+void PresenterToolBar::CheckMouseOver (
+ const css::awt::MouseEvent& rEvent,
+ const bool bOverWindow,
+ const bool bMouseDown)
+{
+ css::awt::MouseEvent rTemp =rEvent;
+ if(AllSettings::GetLayoutRTL()){
+ awt::Rectangle aWindowBox = mxWindow->getPosSize();
+ rTemp.X=aWindowBox.Width-rTemp.X;
+ }
+ for (const auto& rxPart : maElementContainer)
+ {
+ for (auto& rxElement : *rxPart)
+ {
+ if (!rxElement)
+ continue;
+
+ awt::Rectangle aBox (rxElement->GetBoundingBox());
+ const bool bIsOver = bOverWindow
+ && aBox.X <= rTemp.X
+ && aBox.Width+aBox.X-1 >= rTemp.X
+ && aBox.Y <= rTemp.Y
+ && aBox.Height+aBox.Y-1 >= rTemp.Y;
+ rxElement->SetState(
+ bIsOver,
+ bIsOver && rTemp.Buttons!=0 && bMouseDown && rTemp.ClickCount>0);
+ }
+ }
+}
+
+void PresenterToolBar::ThrowIfDisposed() const
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterToolBar has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+//===== PresenterToolBarView ==================================================
+
+PresenterToolBarView::PresenterToolBarView (
+ const Reference<XComponentContext>& rxContext,
+ const Reference<XResourceId>& rxViewId,
+ const Reference<frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterToolBarViewInterfaceBase(m_aMutex),
+ mxViewId(rxViewId),
+ mpPresenterController(rpPresenterController)
+{
+ try
+ {
+ Reference<XControllerManager> xCM (rxController, UNO_QUERY_THROW);
+ Reference<XConfigurationController> xCC(xCM->getConfigurationController(),UNO_SET_THROW);
+ mxPane.set(xCC->getResource(rxViewId->getAnchor()), UNO_QUERY_THROW);
+
+ mxWindow = mxPane->getWindow();
+ mxCanvas = mxPane->getCanvas();
+
+ mpToolBar = new PresenterToolBar(
+ rxContext,
+ mxWindow,
+ mxCanvas,
+ rpPresenterController,
+ PresenterToolBar::Center);
+ mpToolBar->Initialize("PresenterScreenSettings/ToolBars/ToolBar");
+
+ if (mxWindow.is())
+ {
+ mxWindow->addPaintListener(this);
+
+ Reference<awt::XWindowPeer> xPeer (mxWindow, UNO_QUERY);
+ if (xPeer.is())
+ xPeer->setBackground(util::Color(0xff000000));
+
+ mxWindow->setVisible(true);
+ }
+ }
+ catch (RuntimeException&)
+ {
+ mxViewId = nullptr;
+ throw;
+ }
+}
+
+PresenterToolBarView::~PresenterToolBarView()
+{
+}
+
+void SAL_CALL PresenterToolBarView::disposing()
+{
+ Reference<lang::XComponent> xComponent = mpToolBar;
+ mpToolBar = nullptr;
+ if (xComponent.is())
+ xComponent->dispose();
+
+ if (mxWindow.is())
+ {
+ mxWindow->removePaintListener(this);
+ mxWindow = nullptr;
+ }
+ mxCanvas = nullptr;
+ mxViewId = nullptr;
+ mxPane = nullptr;
+ mpPresenterController = nullptr;
+}
+
+const ::rtl::Reference<PresenterToolBar>& PresenterToolBarView::GetPresenterToolBar() const
+{
+ return mpToolBar;
+}
+
+//----- XPaintListener --------------------------------------------------------
+
+void SAL_CALL PresenterToolBarView::windowPaint (const css::awt::PaintEvent& rEvent)
+{
+ awt::Rectangle aWindowBox (mxWindow->getPosSize());
+ mpPresenterController->GetCanvasHelper()->Paint(
+ mpPresenterController->GetViewBackground(mxViewId->getResourceURL()),
+ mxCanvas,
+ rEvent.UpdateRect,
+ awt::Rectangle(0,0,aWindowBox.Width, aWindowBox.Height),
+ awt::Rectangle());
+}
+
+//----- lang::XEventListener -------------------------------------------------
+
+void SAL_CALL PresenterToolBarView::disposing (const lang::EventObject& rEventObject)
+{
+ if (rEventObject.Source == mxWindow)
+ mxWindow = nullptr;
+}
+
+//----- XResourceId -----------------------------------------------------------
+
+Reference<XResourceId> SAL_CALL PresenterToolBarView::getResourceId()
+{
+ return mxViewId;
+}
+
+sal_Bool SAL_CALL PresenterToolBarView::isAnchorOnly()
+{
+ return false;
+}
+
+//----- XDrawView -------------------------------------------------------------
+
+void SAL_CALL PresenterToolBarView::setCurrentPage (const Reference<drawing::XDrawPage>& rxSlide)
+{
+ Reference<drawing::XDrawView> xToolBar = mpToolBar;
+ if (xToolBar.is())
+ xToolBar->setCurrentPage(rxSlide);
+}
+
+Reference<drawing::XDrawPage> SAL_CALL PresenterToolBarView::getCurrentPage()
+{
+ return nullptr;
+}
+
+//===== PresenterToolBar::Element =============================================
+
+namespace {
+
+Element::Element (
+ const ::rtl::Reference<PresenterToolBar>& rpToolBar)
+ : ElementInterfaceBase(m_aMutex),
+ mpToolBar(rpToolBar),
+ mbIsOver(false),
+ mbIsPressed(false),
+ mbIsSelected(false),
+ mbIsEnabled(true)
+{
+ if (mpToolBar)
+ {
+ OSL_ASSERT(mpToolBar->GetPresenterController().is());
+ OSL_ASSERT(mpToolBar->GetPresenterController()->GetWindowManager().is());
+ }
+}
+
+void Element::SetModes (
+ const SharedElementMode& rpNormalMode,
+ const SharedElementMode& rpMouseOverMode,
+ const SharedElementMode& rpSelectedMode,
+ const SharedElementMode& rpDisabledMode,
+ const SharedElementMode& rpMouseOverSelectedMode)
+{
+ mpNormal = rpNormalMode;
+ mpMouseOver = rpMouseOverMode;
+ mpSelected = rpSelectedMode;
+ mpDisabled = rpDisabledMode;
+ mpMouseOverSelected = rpMouseOverSelectedMode;
+ mpMode = rpNormalMode;
+}
+
+void Element::disposing()
+{
+}
+
+awt::Size const & Element::GetBoundingSize (
+ const Reference<rendering::XCanvas>& rxCanvas)
+{
+ maSize = CreateBoundingSize(rxCanvas);
+ return maSize;
+}
+
+awt::Rectangle Element::GetBoundingBox() const
+{
+ return awt::Rectangle(maLocation.X,maLocation.Y, maSize.Width, maSize.Height);
+}
+
+void Element::CurrentSlideHasChanged()
+{
+ UpdateState();
+}
+
+void Element::SetLocation (const awt::Point& rLocation)
+{
+ maLocation = rLocation;
+}
+
+void Element::SetSize (const geometry::RealSize2D& rSize)
+{
+ maSize = awt::Size(sal_Int32(0.5+rSize.Width), sal_Int32(0.5+rSize.Height));
+}
+
+bool Element::SetState (
+ const bool bIsOver,
+ const bool bIsPressed)
+{
+ bool bModified (mbIsOver != bIsOver || mbIsPressed != bIsPressed);
+ bool bClicked (mbIsPressed && bIsOver && ! bIsPressed);
+
+ mbIsOver = bIsOver;
+ mbIsPressed = bIsPressed;
+
+ // When the element is disabled then ignore mouse over or selection.
+ // When the element is selected then ignore mouse over.
+ if ( ! mbIsEnabled)
+ mpMode = mpDisabled;
+ else if (mbIsSelected && mbIsOver)
+ mpMode = mpMouseOverSelected;
+ else if (mbIsSelected)
+ mpMode = mpSelected;
+ else if (mbIsOver)
+ mpMode = mpMouseOver;
+ else
+ mpMode = mpNormal;
+
+ if (bClicked && mbIsEnabled)
+ {
+ if (mpMode)
+ {
+ do
+ {
+ if (mpMode->msAction.isEmpty())
+ break;
+
+ if (!mpToolBar)
+ break;
+
+ if (!mpToolBar->GetPresenterController())
+ break;
+
+ mpToolBar->GetPresenterController()->DispatchUnoCommand(mpMode->msAction);
+ mpToolBar->RequestLayout();
+ }
+ while (false);
+ }
+
+ }
+ else if (bModified)
+ {
+ Invalidate(true);
+ }
+
+ return bModified;
+}
+
+void Element::Invalidate (const bool bSynchronous)
+{
+ OSL_ASSERT(mpToolBar.is());
+ mpToolBar->InvalidateArea(GetBoundingBox(), bSynchronous);
+}
+
+bool Element::IsOutside (const awt::Rectangle& rBox)
+{
+ if (rBox.X >= maLocation.X+maSize.Width)
+ return true;
+ else if (rBox.Y >= maLocation.Y+maSize.Height)
+ return true;
+ else if (maLocation.X >= rBox.X+rBox.Width)
+ return true;
+ else if (maLocation.Y >= rBox.Y+rBox.Height)
+ return true;
+ else
+ return false;
+}
+
+
+bool Element::IsFilling() const
+{
+ return false;
+}
+
+void Element::UpdateState()
+{
+ OSL_ASSERT(mpToolBar);
+ OSL_ASSERT(mpToolBar->GetPresenterController());
+
+ if (!mpMode)
+ return;
+
+ util::URL aURL (mpToolBar->GetPresenterController()->CreateURLFromString(mpMode->msAction));
+ Reference<frame::XDispatch> xDispatch (mpToolBar->GetPresenterController()->GetDispatch(aURL));
+ if (xDispatch.is())
+ {
+ xDispatch->addStatusListener(this, aURL);
+ xDispatch->removeStatusListener(this, aURL);
+ }
+}
+
+//----- lang::XEventListener --------------------------------------------------
+
+void SAL_CALL Element::disposing (const css::lang::EventObject&) {}
+
+//----- document::XEventListener ----------------------------------------------
+
+void SAL_CALL Element::notifyEvent (const css::document::EventObject&)
+{
+ UpdateState();
+}
+
+//----- frame::XStatusListener ------------------------------------------------
+
+void SAL_CALL Element::statusChanged (const css::frame::FeatureStateEvent& rEvent)
+{
+ bool bIsSelected (mbIsSelected);
+ bool bIsEnabled (rEvent.IsEnabled);
+ rEvent.State >>= bIsSelected;
+
+ if (bIsSelected != mbIsSelected || bIsEnabled != mbIsEnabled)
+ {
+ mbIsEnabled = bIsEnabled;
+ mbIsSelected = bIsSelected;
+ SetState(mbIsOver, mbIsPressed);
+ mpToolBar->RequestLayout();
+ }
+}
+
+} // end of anonymous namespace
+
+//===== ElementMode ===========================================================
+
+namespace {
+
+ElementMode::ElementMode()
+{
+}
+
+void ElementMode::ReadElementMode (
+ const Reference<beans::XPropertySet>& rxElementProperties,
+ const OUString& rsModeName,
+ std::shared_ptr<ElementMode> const & rpDefaultMode,
+ ::sdext::presenter::PresenterToolBar::Context const & rContext)
+{
+ try
+ {
+ Reference<container::XHierarchicalNameAccess> xNode (
+ PresenterConfigurationAccess::GetProperty(rxElementProperties, rsModeName),
+ UNO_QUERY);
+ Reference<beans::XPropertySet> xProperties (
+ PresenterConfigurationAccess::GetNodeProperties(xNode, OUString()));
+ if (!xProperties.is() && rpDefaultMode != nullptr)
+ {
+ // The mode is not specified. Use the given, possibly empty,
+ // default mode instead.
+ mpIcon = rpDefaultMode->mpIcon;
+ msAction = rpDefaultMode->msAction;
+ maText = rpDefaultMode->maText;
+ }
+
+ // Read action.
+ if ( ! (PresenterConfigurationAccess::GetProperty(xProperties, "Action") >>= msAction))
+ if (rpDefaultMode != nullptr)
+ msAction = rpDefaultMode->msAction;
+
+ // Read text and font
+ OUString sText(rpDefaultMode != nullptr ? rpDefaultMode->maText.GetText() : OUString());
+ PresenterConfigurationAccess::GetProperty(xProperties, "Text") >>= sText;
+ Reference<container::XHierarchicalNameAccess> xFontNode (
+ PresenterConfigurationAccess::GetProperty(xProperties, "Font"), UNO_QUERY);
+ PresenterTheme::SharedFontDescriptor pFont(PresenterTheme::ReadFont(
+ xFontNode, rpDefaultMode != nullptr ? rpDefaultMode->maText.GetFont()
+ : PresenterTheme::SharedFontDescriptor()));
+ maText = Text(sText,pFont);
+
+ // Read bitmaps to display as icons.
+ Reference<container::XHierarchicalNameAccess> xIconNode (
+ PresenterConfigurationAccess::GetProperty(xProperties, "Icon"), UNO_QUERY);
+ mpIcon = PresenterBitmapContainer::LoadBitmap(
+ xIconNode, "", rContext.mxPresenterHelper, rContext.mxCanvas,
+ rpDefaultMode != nullptr ? rpDefaultMode->mpIcon : SharedBitmapDescriptor());
+ }
+ catch(Exception&)
+ {
+ OSL_ASSERT(false);
+ }
+}
+
+} // end of anonymous namespace
+
+//===== Button ================================================================
+
+namespace {
+
+::rtl::Reference<Element> Button::Create (
+ const ::rtl::Reference<PresenterToolBar>& rpToolBar)
+{
+ ::rtl::Reference<Button> pElement (new Button(rpToolBar));
+ pElement->Initialize();
+ return pElement;
+}
+
+Button::Button (
+ const ::rtl::Reference<PresenterToolBar>& rpToolBar)
+ : Element(rpToolBar),
+ mbIsListenerRegistered(false)
+{
+ OSL_ASSERT(mpToolBar);
+ OSL_ASSERT(mpToolBar->GetPresenterController().is());
+ OSL_ASSERT(mpToolBar->GetPresenterController()->GetWindowManager().is());
+}
+
+void Button::Initialize()
+{
+ mpToolBar->GetPresenterController()->GetWindowManager()->AddLayoutListener(this);
+ mbIsListenerRegistered = true;
+}
+
+void Button::disposing()
+{
+ OSL_ASSERT(mpToolBar);
+ if (mpToolBar && mbIsListenerRegistered)
+ {
+ OSL_ASSERT(mpToolBar->GetPresenterController().is());
+ OSL_ASSERT(mpToolBar->GetPresenterController()->GetWindowManager().is());
+
+ mbIsListenerRegistered = false;
+ mpToolBar->GetPresenterController()->GetWindowManager()->RemoveLayoutListener(this);
+ }
+ Element::disposing();
+}
+
+void Button::Paint (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const rendering::ViewState& rViewState)
+{
+ OSL_ASSERT(rxCanvas.is());
+
+ if (!mpMode)
+ return;
+
+ if (!mpMode->mpIcon)
+ return;
+
+ geometry::RealRectangle2D aTextBBox (mpMode->maText.GetBoundingBox(rxCanvas));
+ sal_Int32 nTextHeight (sal::static_int_cast<sal_Int32>(0.5 + aTextBBox.Y2 - aTextBBox.Y1));
+
+ PaintIcon(rxCanvas, nTextHeight, rViewState);
+ mpMode->maText.Paint(rxCanvas, rViewState, GetBoundingBox());
+}
+
+awt::Size Button::CreateBoundingSize (
+ const Reference<rendering::XCanvas>& rxCanvas)
+{
+ if (!mpMode)
+ return awt::Size();
+
+ geometry::RealRectangle2D aTextBBox (mpMode->maText.GetBoundingBox(rxCanvas));
+
+ // tdf#128964 This ensures that if the text of a button changes due to a change in
+ // the state of the button the other buttons of the toolbar do not move. The button is
+ // allotted the maximum size so that it doesn't resize during a change of state.
+ geometry::RealRectangle2D aTextBBoxNormal (mpNormal->maText.GetBoundingBox(rxCanvas));
+ geometry::RealRectangle2D aTextBBoxMouseOver (mpMouseOver->maText.GetBoundingBox(rxCanvas));
+ geometry::RealRectangle2D aTextBBoxSelected (mpSelected->maText.GetBoundingBox(rxCanvas));
+ geometry::RealRectangle2D aTextBBoxDisabled (mpDisabled->maText.GetBoundingBox(rxCanvas));
+ geometry::RealRectangle2D aTextBBoxMouseOverSelected (mpMouseOverSelected->maText.GetBoundingBox(rxCanvas));
+ std::vector<sal_Int32> widths
+ {
+ sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxNormal.X2 - aTextBBoxNormal.X1),
+ sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxMouseOver.X2 - aTextBBoxMouseOver.X1),
+ sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxSelected.X2 - aTextBBoxSelected.X1),
+ sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxDisabled.X2 - aTextBBoxDisabled.X1),
+ sal::static_int_cast<sal_Int32>(0.5 + aTextBBoxMouseOverSelected.X2 - aTextBBoxMouseOverSelected.X1)
+ };
+
+ sal_Int32 nTextHeight (sal::static_int_cast<sal_Int32>(0.5 + aTextBBox.Y2 - aTextBBox.Y1));
+ Reference<rendering::XBitmap> xBitmap;
+ if (mpMode->mpIcon)
+ xBitmap = mpMode->mpIcon->GetNormalBitmap();
+ if (xBitmap.is())
+ {
+ const sal_Int32 nGap (5);
+ geometry::IntegerSize2D aSize (xBitmap->getSize());
+ return awt::Size(
+ ::std::max(aSize.Width, *std::max_element(widths.begin(), widths.end())),
+ aSize.Height + nGap + nTextHeight);
+ }
+ else
+ {
+ return awt::Size(*std::max_element(widths.begin(), widths.end()), nTextHeight);
+ }
+}
+
+void Button::PaintIcon (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const sal_Int32 nTextHeight,
+ const rendering::ViewState& rViewState)
+{
+ if (!mpMode)
+ return;
+
+ Reference<rendering::XBitmap> xBitmap (mpMode->mpIcon->GetBitmap(GetMode()));
+ if (!xBitmap.is())
+ return;
+
+ /// check whether RTL interface or not
+ if(!AllSettings::GetLayoutRTL()){
+ const sal_Int32 nX (maLocation.X
+ + (maSize.Width-xBitmap->getSize().Width) / 2);
+ const sal_Int32 nY (maLocation.Y
+ + (maSize.Height - nTextHeight - xBitmap->getSize().Height) / 2);
+ const rendering::RenderState aRenderState(
+ geometry::AffineMatrix2D(1,0,nX, 0,1,nY),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::OVER);
+ rxCanvas->drawBitmap(xBitmap, rViewState, aRenderState);
+ }
+ else {
+ const sal_Int32 nX (maLocation.X
+ + (maSize.Width+xBitmap->getSize().Width) / 2);
+ const sal_Int32 nY (maLocation.Y
+ + (maSize.Height - nTextHeight - xBitmap->getSize().Height) / 2);
+ const rendering::RenderState aRenderState(
+ geometry::AffineMatrix2D(-1,0,nX, 0,1,nY),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::OVER);
+ rxCanvas->drawBitmap(xBitmap, rViewState, aRenderState);
+ }
+}
+
+PresenterBitmapDescriptor::Mode Button::GetMode() const
+{
+ if ( ! IsEnabled())
+ return PresenterBitmapDescriptor::Disabled;
+ else if (mbIsPressed)
+ return PresenterBitmapDescriptor::ButtonDown;
+ else if (mbIsOver)
+ return PresenterBitmapDescriptor::MouseOver;
+ else
+ return PresenterBitmapDescriptor::Normal;
+}
+
+//----- lang::XEventListener --------------------------------------------------
+
+void SAL_CALL Button::disposing (const css::lang::EventObject& rEvent)
+{
+ mbIsListenerRegistered = false;
+ Element::disposing(rEvent);
+}
+
+} // end of anonymous namespace
+
+//===== PresenterToolBar::Label ===============================================
+
+namespace {
+
+Label::Label (const ::rtl::Reference<PresenterToolBar>& rpToolBar)
+ : Element(rpToolBar)
+{
+}
+
+awt::Size Label::CreateBoundingSize (
+ const Reference<rendering::XCanvas>& rxCanvas)
+{
+ if (!mpMode)
+ return awt::Size(0,0);
+
+ geometry::RealRectangle2D aTextBBox (mpMode->maText.GetBoundingBox(rxCanvas));
+ return awt::Size(
+ sal::static_int_cast<sal_Int32>(0.5 + aTextBBox.X2 - aTextBBox.X1),
+ sal::static_int_cast<sal_Int32>(0.5 + aTextBBox.Y2 - aTextBBox.Y1));
+}
+
+void Label::SetText (const OUString& rsText)
+{
+ OSL_ASSERT(mpToolBar);
+ if (!mpMode)
+ return;
+
+ const bool bRequestLayout (mpMode->maText.GetText().getLength() != rsText.getLength());
+
+ mpMode->maText.SetText(rsText);
+ // Just use the character count for determining whether a layout is
+ // necessary. This is an optimization to avoid layouts every time a new
+ // time value is set on some labels.
+ if (bRequestLayout)
+ mpToolBar->RequestLayout();
+ else
+ Invalidate(false);
+}
+
+void Label::Paint (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const rendering::ViewState& rViewState)
+{
+ OSL_ASSERT(rxCanvas.is());
+ if (!mpMode)
+ return;
+
+ mpMode->maText.Paint(rxCanvas, rViewState, GetBoundingBox());
+}
+
+bool Label::SetState (const bool, const bool)
+{
+ // For labels there is no mouse over effect.
+ return Element::SetState(false, false);
+}
+
+} // end of anonymous namespace
+
+//===== Text ==================================================================
+
+namespace {
+
+Text::Text()
+{
+}
+
+Text::Text (
+ const OUString& rsText,
+ const PresenterTheme::SharedFontDescriptor& rpFont)
+ : msText(rsText),
+ mpFont(rpFont)
+{
+}
+
+void Text::SetText (const OUString& rsText)
+{
+ msText = rsText;
+}
+
+const OUString& Text::GetText() const
+{
+ return msText;
+}
+
+const PresenterTheme::SharedFontDescriptor& Text::GetFont() const
+{
+ return mpFont;
+}
+
+void Text::Paint (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const rendering::ViewState& rViewState,
+ const awt::Rectangle& rBoundingBox)
+{
+ OSL_ASSERT(rxCanvas.is());
+
+ if (msText.isEmpty())
+ return;
+ if (!mpFont)
+ return;
+
+ if ( ! mpFont->mxFont.is())
+ mpFont->PrepareFont(rxCanvas);
+ if ( ! mpFont->mxFont.is())
+ return;
+
+ rendering::StringContext aContext (msText, 0, msText.getLength());
+
+ Reference<rendering::XTextLayout> xLayout (
+ mpFont->mxFont->createTextLayout(
+ aContext,
+ rendering::TextDirection::WEAK_LEFT_TO_RIGHT,
+ 0));
+ geometry::RealRectangle2D aBox (xLayout->queryTextBounds());
+ const double nTextWidth = aBox.X2 - aBox.X1;
+ const double nY = rBoundingBox.Y + rBoundingBox.Height - aBox.Y2;
+ const double nX = rBoundingBox.X + (rBoundingBox.Width - nTextWidth)/2;
+
+ rendering::RenderState aRenderState(
+ geometry::AffineMatrix2D(1,0,nX, 0,1,nY),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, mpFont->mnColor);
+ rxCanvas->drawTextLayout(
+ xLayout,
+ rViewState,
+ aRenderState);
+}
+
+geometry::RealRectangle2D Text::GetBoundingBox (const Reference<rendering::XCanvas>& rxCanvas)
+{
+ if (mpFont && !msText.isEmpty())
+ {
+ if ( ! mpFont->mxFont.is())
+ mpFont->PrepareFont(rxCanvas);
+ if (mpFont->mxFont.is())
+ {
+ rendering::StringContext aContext (msText, 0, msText.getLength());
+ Reference<rendering::XTextLayout> xLayout (
+ mpFont->mxFont->createTextLayout(
+ aContext,
+ rendering::TextDirection::WEAK_LEFT_TO_RIGHT,
+ 0));
+ return xLayout->queryTextBounds();
+ }
+ }
+ return geometry::RealRectangle2D(0,0,0,0);
+}
+
+//===== TimeFormatter =========================================================
+
+OUString TimeFormatter::FormatTime (const oslDateTime& rTime)
+{
+ OUStringBuffer sText;
+
+ const sal_Int32 nHours (sal::static_int_cast<sal_Int32>(rTime.Hours));
+ const sal_Int32 nMinutes (sal::static_int_cast<sal_Int32>(rTime.Minutes));
+ const sal_Int32 nSeconds(sal::static_int_cast<sal_Int32>(rTime.Seconds));
+ // Hours
+ sText.append(nHours);
+
+ sText.append(":");
+
+ // Minutes
+ const OUString sMinutes (OUString::number(nMinutes));
+ if (sMinutes.getLength() == 1)
+ sText.append("0");
+ sText.append(sMinutes);
+
+ // Seconds
+ sText.append(":");
+ const OUString sSeconds (OUString::number(nSeconds));
+ if (sSeconds.getLength() == 1)
+ sText.append("0");
+ sText.append(sSeconds);
+ return sText.makeStringAndClear();
+}
+
+//===== TimeLabel =============================================================
+
+TimeLabel::TimeLabel (const ::rtl::Reference<PresenterToolBar>& rpToolBar)
+ : Label(rpToolBar)
+{
+}
+
+void SAL_CALL TimeLabel::disposing()
+{
+ PresenterClockTimer::Instance(mpToolBar->GetComponentContext())->RemoveListener(mpListener);
+ mpListener.reset();
+}
+
+void TimeLabel::ConnectToTimer()
+{
+ mpListener = std::make_shared<Listener>(this);
+ PresenterClockTimer::Instance(mpToolBar->GetComponentContext())->AddListener(mpListener);
+}
+
+//===== CurrentTimeLabel ======================================================
+
+::rtl::Reference<Element> CurrentTimeLabel::Create (
+ const ::rtl::Reference<PresenterToolBar>& rpToolBar)
+{
+ ::rtl::Reference<TimeLabel> pElement(new CurrentTimeLabel(rpToolBar));
+ pElement->ConnectToTimer();
+ return pElement;
+}
+
+CurrentTimeLabel::~CurrentTimeLabel()
+{
+}
+
+CurrentTimeLabel::CurrentTimeLabel (
+ const ::rtl::Reference<PresenterToolBar>& rpToolBar)
+ : TimeLabel(rpToolBar)
+{
+}
+
+void CurrentTimeLabel::TimeHasChanged (const oslDateTime& rCurrentTime)
+{
+ SetText(TimeFormatter::FormatTime(rCurrentTime));
+ Invalidate(false);
+}
+
+void CurrentTimeLabel::SetModes (
+ const SharedElementMode& rpNormalMode,
+ const SharedElementMode& rpMouseOverMode,
+ const SharedElementMode& rpSelectedMode,
+ const SharedElementMode& rpDisabledMode,
+ const SharedElementMode& rpMouseOverSelectedMode)
+{
+ TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode, rpMouseOverSelectedMode);
+ SetText(TimeFormatter::FormatTime(PresenterClockTimer::GetCurrentTime()));
+}
+
+//===== PresentationTimeLabel =================================================
+
+::rtl::Reference<Element> PresentationTimeLabel::Create (
+ const ::rtl::Reference<PresenterToolBar>& rpToolBar)
+{
+ ::rtl::Reference<TimeLabel> pElement(new PresentationTimeLabel(rpToolBar));
+ pElement->ConnectToTimer();
+ return pElement;
+}
+
+PresentationTimeLabel::~PresentationTimeLabel()
+{
+ mpToolBar->GetPresenterController()->SetPresentationTime(nullptr);
+}
+
+PresentationTimeLabel::PresentationTimeLabel (
+ const ::rtl::Reference<PresenterToolBar>& rpToolBar)
+ : TimeLabel(rpToolBar),
+ maStartTimeValue()
+{
+ restart();
+ setPauseStatus(false);
+ TimeValue pauseTime(0,0);
+ setPauseTimeValue(pauseTime);
+ mpToolBar->GetPresenterController()->SetPresentationTime(this);
+}
+
+void PresentationTimeLabel::restart()
+{
+ TimeValue pauseTime(0, 0);
+ setPauseTimeValue(pauseTime);
+ maStartTimeValue.Seconds = 0;
+ maStartTimeValue.Nanosec = 0;
+}
+
+bool PresentationTimeLabel::isPaused()
+{
+ return paused;
+}
+
+void PresentationTimeLabel::setPauseStatus(const bool pauseStatus)
+{
+ paused = pauseStatus;
+}
+
+const TimeValue& PresentationTimeLabel::getPauseTimeValue() const
+{
+ return pauseTimeValue;
+}
+
+void PresentationTimeLabel::setPauseTimeValue(const TimeValue pauseTime)
+{
+ //store the time at which the presentation was paused
+ pauseTimeValue = pauseTime;
+}
+
+void PresentationTimeLabel::TimeHasChanged (const oslDateTime& rCurrentTime)
+{
+ TimeValue aCurrentTimeValue;
+ if (!osl_getTimeValueFromDateTime(&rCurrentTime, &aCurrentTimeValue))
+ return;
+
+ if (maStartTimeValue.Seconds==0 && maStartTimeValue.Nanosec==0)
+ {
+ // This method is called for the first time. Initialize the
+ // start time. The start time is rounded to nearest second to
+ // keep the time updates synchronized with the current time label.
+ maStartTimeValue = aCurrentTimeValue;
+ if (maStartTimeValue.Nanosec >= 500000000)
+ maStartTimeValue.Seconds += 1;
+ maStartTimeValue.Nanosec = 0;
+ }
+
+ //The start time value is incremented by the amount of time
+ //the presentation was paused for in order to continue the
+ //timer from the same position
+ if(!isPaused())
+ {
+ TimeValue pauseTime = getPauseTimeValue();
+ if(pauseTime.Seconds != 0 || pauseTime.Nanosec != 0)
+ {
+ TimeValue incrementValue(0, 0);
+ incrementValue.Seconds = aCurrentTimeValue.Seconds - pauseTime.Seconds;
+ if(pauseTime.Nanosec > aCurrentTimeValue.Nanosec)
+ {
+ incrementValue.Nanosec = 1000000000 + aCurrentTimeValue.Nanosec - pauseTime.Nanosec;
+ }
+ else
+ {
+ incrementValue.Nanosec = aCurrentTimeValue.Nanosec - pauseTime.Nanosec;
+ }
+
+ maStartTimeValue.Seconds += incrementValue.Seconds;
+ maStartTimeValue.Nanosec += incrementValue.Nanosec;
+ if(maStartTimeValue.Nanosec >= 1000000000)
+ {
+ maStartTimeValue.Seconds += 1;
+ maStartTimeValue.Nanosec -= 1000000000;
+ }
+
+ TimeValue pauseTime_(0, 0);
+ setPauseTimeValue(pauseTime_);
+ }
+ }
+ else
+ {
+ TimeValue pauseTime = getPauseTimeValue();
+ if(pauseTime.Seconds == 0 && pauseTime.Nanosec == 0)
+ {
+ setPauseTimeValue(aCurrentTimeValue);
+ }
+ }
+
+ TimeValue aElapsedTimeValue;
+ aElapsedTimeValue.Seconds = aCurrentTimeValue.Seconds - maStartTimeValue.Seconds;
+ aElapsedTimeValue.Nanosec = aCurrentTimeValue.Nanosec - maStartTimeValue.Nanosec;
+
+ oslDateTime aElapsedDateTime;
+ if (osl_getDateTimeFromTimeValue(&aElapsedTimeValue, &aElapsedDateTime) && !isPaused())
+ {
+ SetText(TimeFormatter::FormatTime(aElapsedDateTime));
+ Invalidate(false);
+ }
+}
+
+void PresentationTimeLabel::SetModes (
+ const SharedElementMode& rpNormalMode,
+ const SharedElementMode& rpMouseOverMode,
+ const SharedElementMode& rpSelectedMode,
+ const SharedElementMode& rpDisabledMode,
+ const SharedElementMode& rpMouseOverSelectedMode)
+{
+ TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode, rpMouseOverSelectedMode);
+
+ oslDateTime aStartDateTime;
+ if (osl_getDateTimeFromTimeValue(&maStartTimeValue, &aStartDateTime))
+ {
+ SetText(TimeFormatter::FormatTime(aStartDateTime));
+ }
+}
+
+//===== VerticalSeparator =====================================================
+
+VerticalSeparator::VerticalSeparator (
+ const ::rtl::Reference<PresenterToolBar>& rpToolBar)
+ : Element(rpToolBar)
+{
+}
+
+void VerticalSeparator::Paint (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const rendering::ViewState& rViewState)
+{
+ OSL_ASSERT(rxCanvas.is());
+
+ awt::Rectangle aBBox (GetBoundingBox());
+
+ rendering::RenderState aRenderState(
+ geometry::AffineMatrix2D(1,0,aBBox.X, 0,1,aBBox.Y),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::OVER);
+ if (mpMode)
+ {
+ PresenterTheme::SharedFontDescriptor pFont (mpMode->maText.GetFont());
+ if (pFont)
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, pFont->mnColor);
+ }
+
+ Reference<rendering::XBitmap> xBitmap(mpToolBar->GetPresenterController()->GetPresenterHelper()->loadBitmap("bitmaps/Separator.png", rxCanvas));
+ if (!xBitmap.is())
+ return;
+
+ rxCanvas->drawBitmap(
+ xBitmap,
+ rViewState,
+ aRenderState);
+}
+
+awt::Size VerticalSeparator::CreateBoundingSize (
+ const Reference<rendering::XCanvas>&)
+{
+ return awt::Size(1,20);
+}
+
+bool VerticalSeparator::IsFilling() const
+{
+ return true;
+}
+
+//===== HorizontalSeparator ===================================================
+
+HorizontalSeparator::HorizontalSeparator (
+ const ::rtl::Reference<PresenterToolBar>& rpToolBar)
+ : Element(rpToolBar)
+{
+}
+
+void HorizontalSeparator::Paint (
+ const Reference<rendering::XCanvas>& rxCanvas,
+ const rendering::ViewState& rViewState)
+{
+ OSL_ASSERT(rxCanvas.is());
+
+ awt::Rectangle aBBox (GetBoundingBox());
+
+ rendering::RenderState aRenderState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::OVER);
+ if (mpMode)
+ {
+ PresenterTheme::SharedFontDescriptor pFont (mpMode->maText.GetFont());
+ if (pFont)
+ PresenterCanvasHelper::SetDeviceColor(aRenderState, pFont->mnColor);
+ }
+
+ rxCanvas->fillPolyPolygon(
+ PresenterGeometryHelper::CreatePolygon(aBBox, rxCanvas->getDevice()),
+ rViewState,
+ aRenderState);
+}
+
+awt::Size HorizontalSeparator::CreateBoundingSize (
+ const Reference<rendering::XCanvas>&)
+{
+ return awt::Size(20,1);
+}
+
+bool HorizontalSeparator::IsFilling() const
+{
+ return true;
+}
+
+} // end of anonymous namespace
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterToolBar.hxx b/sdext/source/presenter/PresenterToolBar.hxx
new file mode 100644
index 000000000..90931df31
--- /dev/null
+++ b/sdext/source/presenter/PresenterToolBar.hxx
@@ -0,0 +1,250 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERTOOLBAR_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERTOOLBAR_HXX
+
+#include "PresenterController.hxx"
+#include "PresenterViewFactory.hxx"
+
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <com/sun/star/awt/XMouseListener.hpp>
+#include <com/sun/star/awt/XMouseMotionListener.hpp>
+#include <com/sun/star/awt/XPaintListener.hpp>
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/drawing/XDrawView.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <com/sun/star/drawing/framework/XResourceId.hpp>
+#include <com/sun/star/frame/XController.hpp>
+
+#include <functional>
+
+namespace sdext::presenter {
+
+typedef cppu::WeakComponentImplHelper<
+ css::awt::XWindowListener,
+ css::awt::XPaintListener,
+ css::awt::XMouseListener,
+ css::awt::XMouseMotionListener,
+ css::drawing::XDrawView
+ > PresenterToolBarInterfaceBase;
+
+typedef cppu::WeakComponentImplHelper<
+ css::awt::XPaintListener,
+ css::drawing::framework::XView,
+ css::drawing::XDrawView
+ > PresenterToolBarViewInterfaceBase;
+
+/** A simple tool bar that can display bitmapped buttons and labels. At the
+ moment there are buttons for moving to the next and previous slide and
+ to the next effect. A label displays the index of the current slide
+ and the total number of slides.
+*/
+class PresenterToolBar
+ : private ::cppu::BaseMutex,
+ public PresenterToolBarInterfaceBase,
+ public CachablePresenterView
+{
+public:
+ typedef ::std::function<void ()> Action;
+
+ enum Anchor { Left, Center };
+
+ PresenterToolBar (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::awt::XWindow>& rxWindow,
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const ::rtl::Reference<PresenterController>& rpPresenterController,
+ const Anchor eAnchor);
+ virtual ~PresenterToolBar() override;
+ PresenterToolBar(const PresenterToolBar&) = delete;
+ PresenterToolBar& operator=(const PresenterToolBar&) = delete;
+
+ void Initialize (
+ const OUString& rsConfigurationPath);
+
+ virtual void SAL_CALL disposing() override;
+
+ void InvalidateArea (
+ const css::awt::Rectangle& rRepaintBox,
+ const bool bSynchronous);
+
+ void RequestLayout();
+ css::geometry::RealSize2D const & GetMinimalSize();
+ const ::rtl::Reference<PresenterController>& GetPresenterController() const;
+ const css::uno::Reference<css::uno::XComponentContext>& GetComponentContext() const;
+
+ // lang::XEventListener
+
+ virtual void SAL_CALL
+ disposing (const css::lang::EventObject& rEventObject) override;
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override;
+
+ // XPaintListener
+
+ virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override;
+
+ // XMouseListener
+
+ virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) override;
+
+ // XMouseMotionListener
+
+ virtual void SAL_CALL mouseMoved (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseDragged (const css::awt::MouseEvent& rEvent) override;
+
+ // XDrawView
+
+ virtual void SAL_CALL setCurrentPage (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxSlide) override;
+
+ virtual css::uno::Reference<css::drawing::XDrawPage> SAL_CALL getCurrentPage() override;
+
+ class Context;
+
+private:
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+
+ class ElementContainerPart;
+ typedef std::shared_ptr<ElementContainerPart> SharedElementContainerPart;
+ typedef ::std::vector<SharedElementContainerPart> ElementContainer;
+ ElementContainer maElementContainer;
+ SharedElementContainerPart mpCurrentContainerPart;
+ css::uno::Reference<css::awt::XWindow> mxWindow;
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+ css::uno::Reference<css::presentation::XSlideShowController> mxSlideShowController;
+ css::uno::Reference<css::drawing::XDrawPage> mxCurrentSlide;
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ bool mbIsLayoutPending;
+ const Anchor meAnchor;
+ /** The minimal size that is necessary to display all elements without
+ overlap and with minimal gaps between them.
+ */
+ css::geometry::RealSize2D maMinimalSize;
+
+ void CreateControls (
+ const OUString& rsConfigurationPath);
+ void Layout (const css::uno::Reference<css::rendering::XCanvas>& rxCanvas);
+ css::geometry::RealSize2D CalculatePartSize (
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const SharedElementContainerPart& rpPart,
+ const bool bIsHorizontal);
+ static void LayoutPart (
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const SharedElementContainerPart& rpPart,
+ const css::geometry::RealRectangle2D& rBoundingBox,
+ const css::geometry::RealSize2D& rPartSize,
+ const bool bIsHorizontal);
+ void Paint (
+ const css::awt::Rectangle& rUpdateBox,
+ const css::rendering::ViewState& rViewState);
+
+ void UpdateSlideNumber();
+
+ void CheckMouseOver (
+ const css::awt::MouseEvent& rEvent,
+ const bool bOverWindow,
+ const bool bMouseDown=false);
+
+ void ProcessEntry (
+ const css::uno::Reference<css::beans::XPropertySet>& rProperties,
+ Context const & rContext);
+
+ /** @throws css::lang::DisposedException when the object has already been
+ disposed.
+ */
+ void ThrowIfDisposed() const;
+};
+
+/** View for the PresenterToolBar.
+*/
+class PresenterToolBarView
+ : private ::cppu::BaseMutex,
+ public PresenterToolBarViewInterfaceBase
+{
+public:
+ explicit PresenterToolBarView (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ virtual ~PresenterToolBarView() override;
+ PresenterToolBarView(const PresenterToolBarView&) = delete;
+ PresenterToolBarView& operator=(const PresenterToolBarView&) = delete;
+
+ virtual void SAL_CALL disposing() override;
+
+ const ::rtl::Reference<PresenterToolBar>& GetPresenterToolBar() const;
+
+ // XPaintListener
+
+ virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override;
+
+ // lang::XEventListener
+
+ virtual void SAL_CALL
+ disposing (const css::lang::EventObject& rEventObject) override;
+
+ // XResourceId
+
+ virtual css::uno::Reference<css::drawing::framework::XResourceId> SAL_CALL getResourceId() override;
+
+ virtual sal_Bool SAL_CALL isAnchorOnly() override;
+
+ // XDrawView
+
+ virtual void SAL_CALL setCurrentPage (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxSlide) override;
+
+ virtual css::uno::Reference<css::drawing::XDrawPage> SAL_CALL getCurrentPage() override;
+
+private:
+ // css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+ css::uno::Reference<css::drawing::framework::XPane> mxPane;
+ css::uno::Reference<css::drawing::framework::XResourceId> mxViewId;
+ css::uno::Reference<css::awt::XWindow> mxWindow;
+ css::uno::Reference<css::rendering::XCanvas> mxCanvas;
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ ::rtl::Reference<PresenterToolBar> mpToolBar;
+
+};
+
+} // end of namespace ::sdext::presenter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterUIPainter.cxx b/sdext/source/presenter/PresenterUIPainter.cxx
new file mode 100644
index 000000000..7b37736ff
--- /dev/null
+++ b/sdext/source/presenter/PresenterUIPainter.cxx
@@ -0,0 +1,241 @@
+/* -*- 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 <algorithm>
+
+#include "PresenterUIPainter.hxx"
+
+#include "PresenterGeometryHelper.hxx"
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace sdext::presenter {
+
+void PresenterUIPainter::PaintHorizontalBitmapComposite (
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox,
+ const css::awt::Rectangle& rBoundingBox,
+ const css::uno::Reference<css::rendering::XBitmap>& rxLeftBitmap,
+ const css::uno::Reference<css::rendering::XBitmap>& rxRepeatableCenterBitmap,
+ const css::uno::Reference<css::rendering::XBitmap>& rxRightBitmap)
+{
+ if (PresenterGeometryHelper::AreRectanglesDisjoint(rRepaintBox, rBoundingBox))
+ {
+ // The bounding box lies completely outside the repaint area.
+ // Nothing has to be repainted.
+ return;
+ }
+
+ // Get bitmap sizes.
+ geometry::IntegerSize2D aLeftBitmapSize;
+ if (rxLeftBitmap.is())
+ aLeftBitmapSize = rxLeftBitmap->getSize();
+ geometry::IntegerSize2D aCenterBitmapSize;
+ if (rxRepeatableCenterBitmap.is())
+ aCenterBitmapSize = rxRepeatableCenterBitmap->getSize();
+ geometry::IntegerSize2D aRightBitmapSize;
+ if (rxRightBitmap.is())
+ aRightBitmapSize = rxRightBitmap->getSize();
+
+ // Prepare painting.
+ rendering::ViewState aViewState (
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr);
+
+ rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+
+ // Paint the left bitmap once.
+ if (rxLeftBitmap.is())
+ {
+ const awt::Rectangle aLeftBoundingBox (
+ rBoundingBox.X,
+ rBoundingBox.Y,
+ ::std::min(aLeftBitmapSize.Width, rBoundingBox.Width),
+ rBoundingBox.Height);
+ aViewState.Clip.set(
+ PresenterGeometryHelper::CreatePolygon(
+ PresenterGeometryHelper::Intersection(rRepaintBox, aLeftBoundingBox),
+ rxCanvas->getDevice()));
+ aRenderState.AffineTransform.m02 = aLeftBoundingBox.X;
+ aRenderState.AffineTransform.m12
+ = aLeftBoundingBox.Y + (aLeftBoundingBox.Height - aLeftBitmapSize.Height) / 2;
+ rxCanvas->drawBitmap(rxLeftBitmap, aViewState, aRenderState);
+ }
+
+ // Paint the right bitmap once.
+ if (rxRightBitmap.is())
+ {
+ const awt::Rectangle aRightBoundingBox (
+ rBoundingBox.X + rBoundingBox.Width - aRightBitmapSize.Width,
+ rBoundingBox.Y,
+ ::std::min(aRightBitmapSize.Width, rBoundingBox.Width),
+ rBoundingBox.Height);
+ aViewState.Clip.set(
+ PresenterGeometryHelper::CreatePolygon(
+ PresenterGeometryHelper::Intersection(rRepaintBox, aRightBoundingBox),
+ rxCanvas->getDevice()));
+ aRenderState.AffineTransform.m02
+ = aRightBoundingBox.X + aRightBoundingBox.Width - aRightBitmapSize.Width;
+ aRenderState.AffineTransform.m12
+ = aRightBoundingBox.Y + (aRightBoundingBox.Height - aRightBitmapSize.Height) / 2;
+ rxCanvas->drawBitmap(rxRightBitmap, aViewState, aRenderState);
+ }
+
+ // Paint the center bitmap to fill the remaining space.
+ if (!rxRepeatableCenterBitmap.is())
+ return;
+
+ const awt::Rectangle aCenterBoundingBox (
+ rBoundingBox.X + aLeftBitmapSize.Width,
+ rBoundingBox.Y,
+ rBoundingBox.Width - aLeftBitmapSize.Width - aRightBitmapSize.Width,
+ rBoundingBox.Height);
+ if (aCenterBoundingBox.Width <= 0)
+ return;
+
+ aViewState.Clip.set(
+ PresenterGeometryHelper::CreatePolygon(
+ PresenterGeometryHelper::Intersection(rRepaintBox, aCenterBoundingBox),
+ rxCanvas->getDevice()));
+ sal_Int32 nX (aCenterBoundingBox.X);
+ const sal_Int32 nRight (aCenterBoundingBox.X + aCenterBoundingBox.Width - 1);
+ aRenderState.AffineTransform.m12
+ = aCenterBoundingBox.Y + (aCenterBoundingBox.Height-aCenterBitmapSize.Height) / 2;
+ while(nX <= nRight)
+ {
+ aRenderState.AffineTransform.m02 = nX;
+ rxCanvas->drawBitmap(rxRepeatableCenterBitmap, aViewState, aRenderState);
+ nX += aCenterBitmapSize.Width;
+ }
+}
+
+void PresenterUIPainter::PaintVerticalBitmapComposite (
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox,
+ const css::awt::Rectangle& rBoundingBox,
+ const css::uno::Reference<css::rendering::XBitmap>& rxTopBitmap,
+ const css::uno::Reference<css::rendering::XBitmap>& rxRepeatableCenterBitmap,
+ const css::uno::Reference<css::rendering::XBitmap>& rxBottomBitmap)
+{
+ if (PresenterGeometryHelper::AreRectanglesDisjoint(rRepaintBox, rBoundingBox))
+ {
+ // The bounding box lies completely outside the repaint area.
+ // Nothing has to be repainted.
+ return;
+ }
+
+ // Get bitmap sizes.
+ geometry::IntegerSize2D aTopBitmapSize;
+ if (rxTopBitmap.is())
+ aTopBitmapSize = rxTopBitmap->getSize();
+ geometry::IntegerSize2D aCenterBitmapSize;
+ if (rxRepeatableCenterBitmap.is())
+ aCenterBitmapSize = rxRepeatableCenterBitmap->getSize();
+ geometry::IntegerSize2D aBottomBitmapSize;
+ if (rxBottomBitmap.is())
+ aBottomBitmapSize = rxBottomBitmap->getSize();
+
+ // Prepare painting.
+ rendering::ViewState aViewState (
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr);
+
+ rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ nullptr,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+
+ // Paint the top bitmap once.
+ if (rxTopBitmap.is())
+ {
+ const awt::Rectangle aTopBoundingBox (
+ rBoundingBox.X,
+ rBoundingBox.Y,
+ rBoundingBox.Width,
+ ::std::min(aTopBitmapSize.Height, rBoundingBox.Height));
+ aViewState.Clip.set(
+ PresenterGeometryHelper::CreatePolygon(
+ PresenterGeometryHelper::Intersection(rRepaintBox, aTopBoundingBox),
+ rxCanvas->getDevice()));
+ aRenderState.AffineTransform.m02
+ = aTopBoundingBox.X + (aTopBoundingBox.Width - aTopBitmapSize.Width) / 2;
+ aRenderState.AffineTransform.m12 = aTopBoundingBox.Y;
+ rxCanvas->drawBitmap(rxTopBitmap, aViewState, aRenderState);
+ }
+
+ // Paint the bottom bitmap once.
+ if (rxBottomBitmap.is())
+ {
+ const sal_Int32 nBBoxHeight (::std::min(aBottomBitmapSize.Height, rBoundingBox.Height));
+ const awt::Rectangle aBottomBoundingBox (
+ rBoundingBox.X,
+ rBoundingBox.Y + rBoundingBox.Height - nBBoxHeight,
+ rBoundingBox.Width,
+ nBBoxHeight);
+ aViewState.Clip.set(
+ PresenterGeometryHelper::CreatePolygon(
+ PresenterGeometryHelper::Intersection(rRepaintBox, aBottomBoundingBox),
+ rxCanvas->getDevice()));
+ aRenderState.AffineTransform.m02
+ = aBottomBoundingBox.X + (aBottomBoundingBox.Width - aBottomBitmapSize.Width) / 2;
+ aRenderState.AffineTransform.m12
+ = aBottomBoundingBox.Y + aBottomBoundingBox.Height - aBottomBitmapSize.Height;
+ rxCanvas->drawBitmap(rxBottomBitmap, aViewState, aRenderState);
+ }
+
+ // Paint the center bitmap to fill the remaining space.
+ if (!rxRepeatableCenterBitmap.is())
+ return;
+
+ const awt::Rectangle aCenterBoundingBox (
+ rBoundingBox.X,
+ rBoundingBox.Y + aTopBitmapSize.Height,
+ rBoundingBox.Width,
+ rBoundingBox.Height - aTopBitmapSize.Height - aBottomBitmapSize.Height);
+ if (aCenterBoundingBox.Height <= 0)
+ return;
+
+ aViewState.Clip.set(
+ PresenterGeometryHelper::CreatePolygon(
+ PresenterGeometryHelper::Intersection(rRepaintBox, aCenterBoundingBox),
+ rxCanvas->getDevice()));
+ sal_Int32 nY (aCenterBoundingBox.Y);
+ const sal_Int32 nBottom (aCenterBoundingBox.Y + aCenterBoundingBox.Height - 1);
+ aRenderState.AffineTransform.m02
+ = aCenterBoundingBox.X + (aCenterBoundingBox.Width-aCenterBitmapSize.Width) / 2;
+ while(nY <= nBottom)
+ {
+ aRenderState.AffineTransform.m12 = nY;
+ rxCanvas->drawBitmap(rxRepeatableCenterBitmap, aViewState, aRenderState);
+ nY += aCenterBitmapSize.Height;
+ }
+}
+
+} // end of namespace sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterUIPainter.hxx b/sdext/source/presenter/PresenterUIPainter.hxx
new file mode 100644
index 000000000..f21ca291a
--- /dev/null
+++ b/sdext/source/presenter/PresenterUIPainter.hxx
@@ -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/.
+ *
+ * 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_SDEXT_SOURCE_PRESENTER_PRESENTERUIPAINTER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERUIPAINTER_HXX
+
+#include <com/sun/star/awt/Rectangle.hpp>
+#include <com/sun/star/rendering/XCanvas.hpp>
+#include <com/sun/star/rendering/XBitmap.hpp>
+
+namespace sdext::presenter
+{
+/** Functions for painting UI elements.
+*/
+class PresenterUIPainter
+{
+public:
+ PresenterUIPainter() = delete;
+ PresenterUIPainter(const PresenterUIPainter&) = delete;
+ PresenterUIPainter& operator=(const PresenterUIPainter&) = delete;
+
+ static void PaintHorizontalBitmapComposite(
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox, const css::awt::Rectangle& rBoundingBox,
+ const css::uno::Reference<css::rendering::XBitmap>& rxLeftBitmap,
+ const css::uno::Reference<css::rendering::XBitmap>& rxRepeatableCenterBitmap,
+ const css::uno::Reference<css::rendering::XBitmap>& rxRightBitmap);
+
+ static void PaintVerticalBitmapComposite(
+ const css::uno::Reference<css::rendering::XCanvas>& rxCanvas,
+ const css::awt::Rectangle& rRepaintBox, const css::awt::Rectangle& rBoundingBox,
+ const css::uno::Reference<css::rendering::XBitmap>& rxTopBitmap,
+ const css::uno::Reference<css::rendering::XBitmap>& rxRepeatableCenterBitmap,
+ const css::uno::Reference<css::rendering::XBitmap>& rxBottomBitmap);
+};
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterViewFactory.cxx b/sdext/source/presenter/PresenterViewFactory.cxx
new file mode 100644
index 000000000..7c7f8c98b
--- /dev/null
+++ b/sdext/source/presenter/PresenterViewFactory.cxx
@@ -0,0 +1,503 @@
+/* -*- 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 "PresenterViewFactory.hxx"
+#include "PresenterPaneContainer.hxx"
+#include "PresenterHelpView.hxx"
+#include "PresenterNotesView.hxx"
+#include "PresenterSlideShowView.hxx"
+#include "PresenterSlidePreview.hxx"
+#include "PresenterSlideSorter.hxx"
+#include "PresenterToolBar.hxx"
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sdext::presenter {
+
+namespace {
+
+/** By default the PresenterSlidePreview shows the preview of the current
+ slide. This adapter class makes it display the preview of the next
+ slide.
+*/
+class NextSlidePreview : public PresenterSlidePreview
+{
+public:
+ NextSlidePreview (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ const css::uno::Reference<css::drawing::framework::XPane>& rxAnchorPane,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterSlidePreview(rxContext, rxViewId, rxAnchorPane, rpPresenterController)
+ {
+ }
+
+ virtual void SAL_CALL setCurrentPage (
+ const css::uno::Reference<css::drawing::XDrawPage>& rxSlide) override
+ {
+ Reference<presentation::XSlideShowController> xSlideShowController (
+ mpPresenterController->GetSlideShowController());
+ Reference<drawing::XDrawPage> xSlide;
+ if (xSlideShowController.is())
+ {
+ const sal_Int32 nCount (xSlideShowController->getSlideCount());
+ sal_Int32 nNextSlideIndex (-1);
+ if (xSlideShowController->getCurrentSlide() == rxSlide)
+ {
+ nNextSlideIndex = xSlideShowController->getNextSlideIndex();
+ }
+ else
+ {
+ for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
+ {
+ if (rxSlide == xSlideShowController->getSlideByIndex(nIndex))
+ {
+ nNextSlideIndex = nIndex + 1;
+ }
+ }
+ }
+ if (nNextSlideIndex >= 0)
+ {
+ if (nNextSlideIndex < nCount)
+ {
+ xSlide = xSlideShowController->getSlideByIndex(nNextSlideIndex);
+ }
+ }
+ }
+ PresenterSlidePreview::setCurrentPage(xSlide);
+ }
+};
+
+} // end of anonymous namespace
+
+//===== PresenterViewFactory ==============================================
+
+PresenterViewFactory::PresenterViewFactory (
+ const Reference<uno::XComponentContext>& rxContext,
+ const Reference<frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterViewFactoryInterfaceBase(m_aMutex),
+ mxComponentContext(rxContext),
+ mxControllerWeak(rxController),
+ mpPresenterController(rpPresenterController)
+{
+}
+
+Reference<drawing::framework::XResourceFactory> PresenterViewFactory::Create (
+ const Reference<uno::XComponentContext>& rxContext,
+ const Reference<frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+{
+ rtl::Reference<PresenterViewFactory> pFactory (
+ new PresenterViewFactory(rxContext,rxController,rpPresenterController));
+ pFactory->Register(rxController);
+ return Reference<drawing::framework::XResourceFactory>(pFactory);
+}
+
+void PresenterViewFactory::Register (const Reference<frame::XController>& rxController)
+{
+ try
+ {
+ // Get the configuration controller.
+ Reference<XControllerManager> xCM (rxController, UNO_QUERY_THROW);
+ mxConfigurationController = xCM->getConfigurationController();
+ if ( ! mxConfigurationController.is())
+ {
+ throw RuntimeException();
+ }
+ mxConfigurationController->addResourceFactory(msCurrentSlidePreviewViewURL, this);
+ mxConfigurationController->addResourceFactory(msNextSlidePreviewViewURL, this);
+ mxConfigurationController->addResourceFactory(msNotesViewURL, this);
+ mxConfigurationController->addResourceFactory(msToolBarViewURL, this);
+ mxConfigurationController->addResourceFactory(msSlideSorterURL, this);
+ mxConfigurationController->addResourceFactory(msHelpViewURL, this);
+ }
+ catch (RuntimeException&)
+ {
+ OSL_ASSERT(false);
+ if (mxConfigurationController.is())
+ mxConfigurationController->removeResourceFactoryForReference(this);
+ mxConfigurationController = nullptr;
+
+ throw;
+ }
+}
+
+PresenterViewFactory::~PresenterViewFactory()
+{
+}
+
+void SAL_CALL PresenterViewFactory::disposing()
+{
+ if (mxConfigurationController.is())
+ mxConfigurationController->removeResourceFactoryForReference(this);
+ mxConfigurationController = nullptr;
+
+ if (mpResourceCache == nullptr)
+ return;
+
+ // Dispose all views in the cache.
+ for (const auto& rView : *mpResourceCache)
+ {
+ try
+ {
+ Reference<lang::XComponent> xComponent (rView.second.first, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ catch (lang::DisposedException&)
+ {
+ }
+ }
+ mpResourceCache.reset();
+}
+
+//----- XViewFactory ----------------------------------------------------------
+
+Reference<XResource> SAL_CALL PresenterViewFactory::createResource (
+ const Reference<XResourceId>& rxViewId)
+{
+ ThrowIfDisposed();
+
+ Reference<XResource> xView;
+
+ if (rxViewId.is())
+ {
+ Reference<XPane> xAnchorPane (
+ mxConfigurationController->getResource(rxViewId->getAnchor()),
+ UNO_QUERY_THROW);
+ xView = GetViewFromCache(rxViewId, xAnchorPane);
+ if (xView == nullptr)
+ xView = CreateView(rxViewId, xAnchorPane);
+
+ // Activate the view.
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
+ mpPresenterController->GetPaneContainer()->FindPaneId(rxViewId->getAnchor()));
+ if (pDescriptor)
+ pDescriptor->SetActivationState(true);
+ }
+
+ return xView;
+}
+
+void SAL_CALL PresenterViewFactory::releaseResource (const Reference<XResource>& rxView)
+{
+ ThrowIfDisposed();
+
+ if ( ! rxView.is())
+ return;
+
+ // Deactivate the view.
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
+ mpPresenterController->GetPaneContainer()->FindPaneId(
+ rxView->getResourceId()->getAnchor()));
+ if (pDescriptor)
+ pDescriptor->SetActivationState(false);
+
+ // Dispose only views that we can not put into the cache.
+ CachablePresenterView* pView = dynamic_cast<CachablePresenterView*>(rxView.get());
+ if (pView == nullptr || mpResourceCache == nullptr)
+ {
+ try
+ {
+ if (pView != nullptr)
+ pView->ReleaseView();
+ Reference<lang::XComponent> xComponent (rxView, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+ }
+ catch (lang::DisposedException&)
+ {
+ // Do not let disposed exceptions get out. It might be interpreted
+ // as coming from the factory, which would then be removed from the
+ // drawing framework.
+ }
+ }
+ else
+ {
+ // Put cacheable views in the cache.
+ Reference<XResourceId> xViewId (rxView->getResourceId());
+ if (xViewId.is())
+ {
+ Reference<XPane> xAnchorPane (
+ mxConfigurationController->getResource(xViewId->getAnchor()),
+ UNO_QUERY_THROW);
+ (*mpResourceCache)[xViewId->getResourceURL()]
+ = ViewResourceDescriptor(Reference<XView>(rxView, UNO_QUERY), xAnchorPane);
+ pView->DeactivatePresenterView();
+ }
+ }
+}
+
+
+Reference<XResource> PresenterViewFactory::GetViewFromCache(
+ const Reference<XResourceId>& rxViewId,
+ const Reference<XPane>& rxAnchorPane) const
+{
+ if (mpResourceCache == nullptr)
+ return nullptr;
+
+ try
+ {
+ const OUString sResourceURL (rxViewId->getResourceURL());
+
+ // Can we use a view from the cache?
+ ResourceContainer::const_iterator iView (mpResourceCache->find(sResourceURL));
+ if (iView != mpResourceCache->end())
+ {
+ // The view is in the container but it can only be used if
+ // the anchor pane is the same now as it was at creation of
+ // the view.
+ if (iView->second.second == rxAnchorPane)
+ {
+ CachablePresenterView* pView
+ = dynamic_cast<CachablePresenterView*>(iView->second.first.get());
+ if (pView != nullptr)
+ pView->ActivatePresenterView();
+ return iView->second.first;
+ }
+
+ // Right view, wrong pane. Create a new view.
+ }
+ }
+ catch (RuntimeException&)
+ {
+ }
+ return nullptr;
+}
+
+Reference<XResource> PresenterViewFactory::CreateView(
+ const Reference<XResourceId>& rxViewId,
+ const Reference<XPane>& rxAnchorPane)
+{
+ Reference<XView> xView;
+
+ try
+ {
+ const OUString sResourceURL (rxViewId->getResourceURL());
+
+ if (sResourceURL == msCurrentSlidePreviewViewURL)
+ {
+ xView = CreateSlideShowView(rxViewId);
+ }
+ else if (sResourceURL == msNotesViewURL)
+ {
+ xView = CreateNotesView(rxViewId);
+ }
+ else if (sResourceURL == msNextSlidePreviewViewURL)
+ {
+ xView = CreateSlidePreviewView(rxViewId, rxAnchorPane);
+ }
+ else if (sResourceURL == msToolBarViewURL)
+ {
+ xView = CreateToolBarView(rxViewId);
+ }
+ else if (sResourceURL == msSlideSorterURL)
+ {
+ xView = CreateSlideSorterView(rxViewId);
+ }
+ else if (sResourceURL == msHelpViewURL)
+ {
+ xView = CreateHelpView(rxViewId);
+ }
+
+ // Activate it.
+ CachablePresenterView* pView = dynamic_cast<CachablePresenterView*>(xView.get());
+ if (pView != nullptr)
+ pView->ActivatePresenterView();
+ }
+ catch (RuntimeException&)
+ {
+ xView = nullptr;
+ }
+
+ return xView;
+}
+
+Reference<XView> PresenterViewFactory::CreateSlideShowView(
+ const Reference<XResourceId>& rxViewId) const
+{
+ Reference<XView> xView;
+
+ if ( ! mxConfigurationController.is())
+ return xView;
+ if ( ! mxComponentContext.is())
+ return xView;
+
+ try
+ {
+ rtl::Reference<PresenterSlideShowView> pShowView (
+ new PresenterSlideShowView(
+ mxComponentContext,
+ rxViewId,
+ Reference<frame::XController>(mxControllerWeak),
+ mpPresenterController));
+ pShowView->LateInit();
+ xView = pShowView;
+ }
+ catch (RuntimeException&)
+ {
+ xView = nullptr;
+ }
+
+ return xView;
+}
+
+Reference<XView> PresenterViewFactory::CreateSlidePreviewView(
+ const Reference<XResourceId>& rxViewId,
+ const Reference<XPane>& rxAnchorPane) const
+{
+ Reference<XView> xView;
+
+ if ( ! mxConfigurationController.is())
+ return xView;
+ if ( ! mxComponentContext.is())
+ return xView;
+
+ try
+ {
+ xView.set(
+ static_cast<XWeak*>(new NextSlidePreview(
+ mxComponentContext,
+ rxViewId,
+ rxAnchorPane,
+ mpPresenterController)),
+ UNO_QUERY_THROW);
+ }
+ catch (RuntimeException&)
+ {
+ xView = nullptr;
+ }
+
+ return xView;
+}
+
+Reference<XView> PresenterViewFactory::CreateToolBarView(
+ const Reference<XResourceId>& rxViewId) const
+{
+ return new PresenterToolBarView(
+ mxComponentContext,
+ rxViewId,
+ Reference<frame::XController>(mxControllerWeak),
+ mpPresenterController);
+}
+
+Reference<XView> PresenterViewFactory::CreateNotesView(
+ const Reference<XResourceId>& rxViewId) const
+{
+ Reference<XView> xView;
+
+ if ( ! mxConfigurationController.is())
+ return xView;
+ if ( ! mxComponentContext.is())
+ return xView;
+
+ try
+ {
+ xView.set(static_cast<XWeak*>(
+ new PresenterNotesView(
+ mxComponentContext,
+ rxViewId,
+ Reference<frame::XController>(mxControllerWeak),
+ mpPresenterController)),
+ UNO_QUERY_THROW);
+ }
+ catch (RuntimeException&)
+ {
+ xView = nullptr;
+ }
+
+ return xView;
+}
+
+Reference<XView> PresenterViewFactory::CreateSlideSorterView(
+ const Reference<XResourceId>& rxViewId) const
+{
+ Reference<XView> xView;
+
+ if ( ! mxConfigurationController.is())
+ return xView;
+ if ( ! mxComponentContext.is())
+ return xView;
+
+ try
+ {
+ rtl::Reference<PresenterSlideSorter> pView (
+ new PresenterSlideSorter(
+ mxComponentContext,
+ rxViewId,
+ Reference<frame::XController>(mxControllerWeak),
+ mpPresenterController));
+ xView = pView.get();
+ }
+ catch (RuntimeException&)
+ {
+ xView = nullptr;
+ }
+
+ return xView;
+}
+
+Reference<XView> PresenterViewFactory::CreateHelpView(
+ const Reference<XResourceId>& rxViewId) const
+{
+ return Reference<XView>(new PresenterHelpView(
+ mxComponentContext,
+ rxViewId,
+ Reference<frame::XController>(mxControllerWeak),
+ mpPresenterController));
+}
+
+void PresenterViewFactory::ThrowIfDisposed() const
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterViewFactory object has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+//===== CachablePresenterView =================================================
+
+CachablePresenterView::CachablePresenterView()
+ : mbIsPresenterViewActive(true)
+{
+}
+
+void CachablePresenterView::ActivatePresenterView()
+{
+ mbIsPresenterViewActive = true;
+}
+
+void CachablePresenterView::DeactivatePresenterView()
+{
+ mbIsPresenterViewActive = false;
+}
+
+void CachablePresenterView::ReleaseView()
+{
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterViewFactory.hxx b/sdext/source/presenter/PresenterViewFactory.hxx
new file mode 100644
index 000000000..30d488cfc
--- /dev/null
+++ b/sdext/source/presenter/PresenterViewFactory.hxx
@@ -0,0 +1,164 @@
+/* -*- 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_SDEXT_SOURCE_PRESENTER_PRESENTERVIEWFACTORY_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERVIEWFACTORY_HXX
+
+#include "PresenterController.hxx"
+#include <cppuhelper/compbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+#include <com/sun/star/drawing/framework/XConfigurationController.hpp>
+#include <com/sun/star/drawing/framework/XResourceFactory.hpp>
+#include <com/sun/star/drawing/framework/XView.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <rtl/ref.hxx>
+#include <memory>
+
+namespace sdext::presenter {
+
+typedef ::cppu::WeakComponentImplHelper <
+ css::drawing::framework::XResourceFactory
+> PresenterViewFactoryInterfaceBase;
+
+/** Base class for presenter views that allows the view factory to store
+ them in a cache and reuse deactivated views.
+*/
+class CachablePresenterView
+{
+public:
+ virtual void ActivatePresenterView();
+
+ /** Called when the view is put into a cache. The view must not paint
+ itself while being deactivated.
+ */
+ virtual void DeactivatePresenterView();
+
+ /** Called before the view is disposed. This gives the view the
+ opportunity to trigger actions that may lead to (synchronous)
+ callbacks that do not result in DisposedExceptions.
+ */
+ virtual void ReleaseView();
+
+protected:
+ bool mbIsPresenterViewActive;
+
+ CachablePresenterView();
+
+ ~CachablePresenterView() {}
+};
+
+/** Factory of the presenter screen specific views. The supported set of
+ views includes:
+ a life view of the current slide,
+ a static preview of the next slide,
+ the notes of the current slide,
+ a tool bar
+*/
+class PresenterViewFactory
+ : public ::cppu::BaseMutex,
+ public PresenterViewFactoryInterfaceBase
+{
+public:
+ static constexpr OUStringLiteral msCurrentSlidePreviewViewURL
+ = u"private:resource/view/Presenter/CurrentSlidePreview";
+ static constexpr OUStringLiteral msNextSlidePreviewViewURL
+ = u"private:resource/view/Presenter/NextSlidePreview";
+ static constexpr OUStringLiteral msNotesViewURL = u"private:resource/view/Presenter/Notes";
+ static constexpr OUStringLiteral msToolBarViewURL = u"private:resource/view/Presenter/ToolBar";
+ static constexpr OUStringLiteral msSlideSorterURL
+ = u"private:resource/view/Presenter/SlideSorter";
+ static constexpr OUStringLiteral msHelpViewURL = u"private:resource/view/Presenter/Help";
+
+ /** Create a new instance of this class and register it as resource
+ factory in the drawing framework of the given controller.
+ This registration keeps it alive. When the drawing framework is
+ shut down and releases its reference to the factory then the factory
+ is destroyed.
+ */
+ static css::uno::Reference<css::drawing::framework::XResourceFactory> Create (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ virtual ~PresenterViewFactory() override;
+
+ virtual void SAL_CALL disposing() override;
+
+ // XResourceFactory
+
+ virtual css::uno::Reference<css::drawing::framework::XResource>
+ SAL_CALL createResource (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId) override;
+
+ virtual void SAL_CALL
+ releaseResource (
+ const css::uno::Reference<css::drawing::framework::XResource>& rxPane) override;
+
+private:
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+ css::uno::Reference<css::drawing::framework::XConfigurationController>
+ mxConfigurationController;
+ css::uno::WeakReference<css::frame::XController> mxControllerWeak;
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ typedef ::std::pair<css::uno::Reference<css::drawing::framework::XView>,
+ css::uno::Reference<css::drawing::framework::XPane> > ViewResourceDescriptor;
+ typedef ::std::map<OUString, ViewResourceDescriptor> ResourceContainer;
+ std::unique_ptr<ResourceContainer> mpResourceCache;
+
+ PresenterViewFactory (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+
+ void Register (const css::uno::Reference<css::frame::XController>& rxController);
+
+ css::uno::Reference<css::drawing::framework::XView> CreateSlideShowView(
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId) const;
+
+ css::uno::Reference<css::drawing::framework::XView> CreateSlidePreviewView(
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ const css::uno::Reference<css::drawing::framework::XPane>& rxPane) const;
+
+ css::uno::Reference<css::drawing::framework::XView> CreateToolBarView(
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId) const;
+
+ css::uno::Reference<css::drawing::framework::XView> CreateNotesView(
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId) const;
+
+ css::uno::Reference<css::drawing::framework::XView> CreateSlideSorterView(
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId) const;
+
+ css::uno::Reference<css::drawing::framework::XView> CreateHelpView(
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId) const;
+
+ css::uno::Reference<css::drawing::framework::XResource> GetViewFromCache (
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ const css::uno::Reference<css::drawing::framework::XPane>& rxAnchorPane) const;
+ css::uno::Reference<css::drawing::framework::XResource> CreateView(
+ const css::uno::Reference<css::drawing::framework::XResourceId>& rxViewId,
+ const css::uno::Reference<css::drawing::framework::XPane>& rxAnchorPane);
+
+ /// @throws css::lang::DisposedException
+ void ThrowIfDisposed() const;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterWindowManager.cxx b/sdext/source/presenter/PresenterWindowManager.cxx
new file mode 100644
index 000000000..d1ccaadc7
--- /dev/null
+++ b/sdext/source/presenter/PresenterWindowManager.cxx
@@ -0,0 +1,1043 @@
+/* -*- 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 <vcl/settings.hxx>
+#include "PresenterWindowManager.hxx"
+#include "PresenterController.hxx"
+#include "PresenterGeometryHelper.hxx"
+#include "PresenterPaintManager.hxx"
+#include "PresenterPaneBorderPainter.hxx"
+#include "PresenterPaneContainer.hxx"
+#include "PresenterPaneFactory.hxx"
+#include "PresenterToolBar.hxx"
+#include "PresenterViewFactory.hxx"
+#include "PresenterTheme.hxx"
+#include <com/sun/star/awt/InvalidateStyle.hpp>
+#include <com/sun/star/awt/PosSize.hpp>
+#include <com/sun/star/awt/XWindow2.hpp>
+#include <com/sun/star/awt/XWindowPeer.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+#include <com/sun/star/rendering/FillRule.hpp>
+#include <com/sun/star/rendering/Texture.hpp>
+#include <com/sun/star/rendering/TexturingMode.hpp>
+#include <math.h>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::drawing::framework;
+
+namespace sdext::presenter {
+
+//===== PresenterWindowManager ================================================
+
+PresenterWindowManager::PresenterWindowManager (
+ const Reference<XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterPaneContainer>& rpPaneContainer,
+ const ::rtl::Reference<PresenterController>& rpPresenterController)
+ : PresenterWindowManagerInterfaceBase(m_aMutex),
+ mxComponentContext(rxContext),
+ mpPresenterController(rpPresenterController),
+ mpPaneContainer(rpPaneContainer),
+ mbIsLayoutPending(true),
+ mbIsLayouting(false),
+ meLayoutMode(LM_Generic),
+ mbIsSlideSorterActive(false),
+ mbIsHelpViewActive(false),
+ mbisPaused(false),
+ mbIsMouseClickPending(false)
+{
+
+}
+
+PresenterWindowManager::~PresenterWindowManager()
+{
+}
+
+void SAL_CALL PresenterWindowManager::disposing()
+{
+ NotifyDisposing();
+
+ SetParentPane(nullptr);
+
+ Reference<lang::XComponent> xComponent (mxPaneBorderManager, UNO_QUERY);
+ if (xComponent.is())
+ xComponent->dispose();
+ mxPaneBorderManager = nullptr;
+
+ for (const auto& rxPane : mpPaneContainer->maPanes)
+ {
+ if (rxPane->mxBorderWindow.is())
+ {
+ rxPane->mxBorderWindow->removeWindowListener(this);
+ rxPane->mxBorderWindow->removeFocusListener(this);
+ rxPane->mxBorderWindow->removeMouseListener(this);
+ }
+ }
+}
+
+void PresenterWindowManager::SetParentPane (
+ const Reference<drawing::framework::XPane>& rxPane)
+{
+ if (mxParentWindow.is())
+ {
+ mxParentWindow->removeWindowListener(this);
+ mxParentWindow->removePaintListener(this);
+ mxParentWindow->removeMouseListener(this);
+ mxParentWindow->removeFocusListener(this);
+ }
+ mxParentWindow = nullptr;
+ mxParentCanvas = nullptr;
+
+ if (rxPane.is())
+ {
+ mxParentWindow = rxPane->getWindow();
+ mxParentCanvas = rxPane->getCanvas();
+ }
+ else
+ {
+ mxParentWindow = nullptr;
+ }
+
+ if (mxParentWindow.is())
+ {
+ mxParentWindow->addWindowListener(this);
+ mxParentWindow->addPaintListener(this);
+ mxParentWindow->addMouseListener(this);
+ mxParentWindow->addFocusListener(this);
+
+ // We paint our own background, make that of the parent window transparent.
+ Reference<awt::XWindowPeer> xPeer (mxParentWindow, UNO_QUERY);
+ if (xPeer.is())
+ xPeer->setBackground(util::Color(0xff000000));
+ }
+}
+
+void PresenterWindowManager::SetTheme (const std::shared_ptr<PresenterTheme>& rpTheme)
+{
+ mpTheme = rpTheme;
+
+ // Get background bitmap or background color from the theme.
+
+ if (mpTheme != nullptr)
+ {
+ mpBackgroundBitmap = mpTheme->GetBitmap(OUString(), "Background");
+ }
+}
+
+void PresenterWindowManager::NotifyViewCreation (const Reference<XView>& rxView)
+{
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
+ mpPaneContainer->FindPaneId(rxView->getResourceId()->getAnchor()));
+ OSL_ASSERT(pDescriptor);
+ if (pDescriptor)
+ {
+ Layout();
+
+ mpPresenterController->GetPaintManager()->Invalidate(
+ pDescriptor->mxContentWindow,
+ sal_Int16(awt::InvalidateStyle::TRANSPARENT
+ | awt::InvalidateStyle::CHILDREN));
+ }
+}
+
+void PresenterWindowManager::SetPanePosSizeAbsolute (
+ const OUString& rsPaneURL,
+ const double nX,
+ const double nY,
+ const double nWidth,
+ const double nHeight)
+{
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
+ mpPaneContainer->FindPaneURL(rsPaneURL));
+ if (pDescriptor)
+ {
+ if (pDescriptor->mxBorderWindow.is())
+ pDescriptor->mxBorderWindow->setPosSize(
+ ::sal::static_int_cast<sal_Int32>(nX),
+ ::sal::static_int_cast<sal_Int32>(nY),
+ ::sal::static_int_cast<sal_Int32>(nWidth),
+ ::sal::static_int_cast<sal_Int32>(nHeight),
+ awt::PosSize::POSSIZE);
+ }
+}
+
+void PresenterWindowManager::SetPaneBorderPainter (
+ const ::rtl::Reference<PresenterPaneBorderPainter>& rPainter)
+{
+ mpPaneBorderPainter = rPainter;
+}
+
+//----- XWindowListener -------------------------------------------------------
+
+void SAL_CALL PresenterWindowManager::windowResized (const awt::WindowEvent& rEvent)
+{
+ ThrowIfDisposed();
+ if (rEvent.Source == mxParentWindow)
+ {
+ Layout();
+ }
+ else
+ {
+ Reference<awt::XWindow> xWindow (rEvent.Source,UNO_QUERY);
+ if (xWindow.is())
+ {
+ UpdateWindowSize(xWindow);
+
+ // Make sure the background of a transparent window is painted.
+ mpPresenterController->GetPaintManager()->Invalidate(mxParentWindow);
+ }
+ }
+}
+
+void SAL_CALL PresenterWindowManager::windowMoved (const awt::WindowEvent& rEvent)
+{
+ ThrowIfDisposed();
+ if (rEvent.Source != mxParentWindow)
+ {
+ Reference<awt::XWindow> xWindow (rEvent.Source,UNO_QUERY);
+ UpdateWindowSize(xWindow);
+
+ // Make sure the background of a transparent window is painted.
+ mpPresenterController->GetPaintManager()->Invalidate(xWindow);
+ }
+}
+
+void SAL_CALL PresenterWindowManager::windowShown (const lang::EventObject&) {}
+
+void SAL_CALL PresenterWindowManager::windowHidden (const lang::EventObject&) {}
+
+//----- XPaintListener --------------------------------------------------------
+
+void SAL_CALL PresenterWindowManager::windowPaint (const awt::PaintEvent& rEvent)
+{
+ ThrowIfDisposed();
+
+ if ( ! mxParentWindow.is())
+ return;
+ if ( ! mxParentCanvas.is())
+ return;
+
+ if (mpTheme == nullptr)
+ return;
+
+ try
+ {
+ if (mbIsLayoutPending)
+ Layout();
+ PaintBackground(rEvent.UpdateRect);
+ PaintChildren(rEvent);
+ }
+ catch (RuntimeException&)
+ {
+ OSL_FAIL("paint failed!");
+ }
+}
+
+//----- XMouseListener --------------------------------------------------------
+
+void SAL_CALL PresenterWindowManager::mousePressed (const css::awt::MouseEvent&)
+{
+ if (!mbIsSlideSorterActive) // tdf#127921
+ mbIsMouseClickPending = true;
+}
+
+void SAL_CALL PresenterWindowManager::mouseReleased (const css::awt::MouseEvent& rEvent)
+{
+ if (mbIsMouseClickPending)
+ {
+ mbIsMouseClickPending = false;
+ mpPresenterController->HandleMouseClick(rEvent);
+ }
+}
+
+void SAL_CALL PresenterWindowManager::mouseEntered (const css::awt::MouseEvent&)
+{
+ mbIsMouseClickPending = false;
+}
+
+void SAL_CALL PresenterWindowManager::mouseExited (const css::awt::MouseEvent&)
+{
+ mbIsMouseClickPending = false;
+}
+
+//----- XFocusListener --------------------------------------------------------
+
+void SAL_CALL PresenterWindowManager::focusGained (const css::awt::FocusEvent& /*rEvent*/)
+{
+ ThrowIfDisposed();
+}
+
+void SAL_CALL PresenterWindowManager::focusLost (const css::awt::FocusEvent&)
+{
+ ThrowIfDisposed();
+}
+
+//----- XEventListener --------------------------------------------------------
+
+void SAL_CALL PresenterWindowManager::disposing (const lang::EventObject& rEvent)
+{
+ if (rEvent.Source == mxParentWindow)
+ mxParentWindow = nullptr;
+}
+
+
+void PresenterWindowManager::PaintChildren (const awt::PaintEvent& rEvent) const
+{
+ // Call windowPaint on all children that lie in or touch the
+ // update rectangle.
+ for (const auto& rxPane : mpPaneContainer->maPanes)
+ {
+ try
+ {
+ // Make sure that the pane shall and can be painted.
+ if ( ! rxPane->mbIsActive)
+ continue;
+ if (rxPane->mbIsSprite)
+ continue;
+ if ( ! rxPane->mxPane.is())
+ continue;
+ if ( ! rxPane->mxBorderWindow.is())
+ continue;
+ Reference<awt::XWindow> xBorderWindow (rxPane->mxBorderWindow);
+ if ( ! xBorderWindow.is())
+ continue;
+
+ // Get the area in which the border of the pane has to be painted.
+ const awt::Rectangle aBorderBox (xBorderWindow->getPosSize());
+ const awt::Rectangle aBorderUpdateBox(
+ PresenterGeometryHelper::Intersection(
+ rEvent.UpdateRect,
+ aBorderBox));
+ if (aBorderUpdateBox.Width<=0 || aBorderUpdateBox.Height<=0)
+ continue;
+
+ const awt::Rectangle aLocalBorderUpdateBox(
+ PresenterGeometryHelper::TranslateRectangle(
+ aBorderUpdateBox,
+ -aBorderBox.X,
+ -aBorderBox.Y));
+
+ // Invalidate the area of the content window.
+ mpPresenterController->GetPaintManager()->Invalidate(
+ xBorderWindow,
+ aLocalBorderUpdateBox,
+ sal_Int16(awt::InvalidateStyle::CHILDREN
+ | awt::InvalidateStyle::NOTRANSPARENT));
+ }
+ catch (RuntimeException&)
+ {
+ OSL_FAIL("paint children failed!");
+ }
+ }
+}
+
+void PresenterWindowManager::SetLayoutMode (const LayoutMode eMode)
+{
+ OSL_ASSERT(mpPresenterController);
+
+ if (meLayoutMode == eMode
+ && !mbIsSlideSorterActive
+ && !mbIsHelpViewActive)
+ return;
+
+ meLayoutMode = eMode;
+ mbIsSlideSorterActive = false;
+ mbIsHelpViewActive = false;
+
+ mpPresenterController->RequestViews(
+ mbIsSlideSorterActive,
+ meLayoutMode==LM_Notes,
+ mbIsHelpViewActive);
+ Layout();
+ NotifyLayoutModeChange();
+}
+
+void PresenterWindowManager::SetSlideSorterState (bool bIsActive)
+{
+ if (mbIsSlideSorterActive == bIsActive)
+ return;
+
+ mbIsSlideSorterActive = bIsActive;
+ if (mbIsSlideSorterActive)
+ mbIsHelpViewActive = false;
+ StoreViewMode(GetViewMode());
+
+ mpPresenterController->RequestViews(
+ mbIsSlideSorterActive,
+ meLayoutMode==LM_Notes,
+ mbIsHelpViewActive);
+ Layout();
+ NotifyLayoutModeChange();
+}
+
+void PresenterWindowManager::SetHelpViewState (bool bIsActive)
+{
+ if (mbIsHelpViewActive == bIsActive)
+ return;
+
+ mbIsHelpViewActive = bIsActive;
+ if (mbIsHelpViewActive)
+ mbIsSlideSorterActive = false;
+ StoreViewMode(GetViewMode());
+
+ mpPresenterController->RequestViews(
+ mbIsSlideSorterActive,
+ meLayoutMode==LM_Notes,
+ mbIsHelpViewActive);
+ Layout();
+ NotifyLayoutModeChange();
+}
+
+void PresenterWindowManager::SetPauseState (bool bIsPaused)
+{
+ if (mbisPaused == bIsPaused)
+ return;
+
+ mbisPaused = bIsPaused;
+
+ NotifyLayoutModeChange();
+}
+
+void PresenterWindowManager::SetViewMode (const ViewMode eMode)
+{
+ switch (eMode)
+ {
+ case VM_Standard:
+ SetSlideSorterState(false);
+ SetHelpViewState(false);
+ SetLayoutMode(LM_Standard);
+ break;
+
+ case VM_Notes:
+ SetSlideSorterState(false);
+ SetHelpViewState(false);
+ SetLayoutMode(LM_Notes);
+ break;
+
+ case VM_SlideOverview:
+ SetHelpViewState(false);
+ SetSlideSorterState(true);
+ break;
+
+ case VM_Help:
+ SetHelpViewState(true);
+ SetSlideSorterState(false);
+ break;
+ }
+
+ StoreViewMode(eMode);
+}
+
+PresenterWindowManager::ViewMode PresenterWindowManager::GetViewMode() const
+{
+ if (mbIsHelpViewActive)
+ return VM_Help;
+ else if (mbIsSlideSorterActive)
+ return VM_SlideOverview;
+ else if (meLayoutMode == LM_Notes)
+ return VM_Notes;
+ else
+ return VM_Standard;
+}
+
+void PresenterWindowManager::RestoreViewMode()
+{
+ sal_Int32 nMode (0);
+ PresenterConfigurationAccess aConfiguration (
+ mxComponentContext,
+ "/org.openoffice.Office.PresenterScreen/",
+ PresenterConfigurationAccess::READ_ONLY);
+ aConfiguration.GetConfigurationNode("Presenter/InitialViewMode") >>= nMode;
+ switch (nMode)
+ {
+ default:
+ case 0:
+ SetViewMode(VM_Standard);
+ break;
+
+ case 1:
+ SetViewMode(VM_Notes);
+ break;
+
+ case 2:
+ SetViewMode(VM_SlideOverview);
+ break;
+ }
+}
+
+void PresenterWindowManager::StoreViewMode (const ViewMode eViewMode)
+{
+ try
+ {
+ PresenterConfigurationAccess aConfiguration (
+ mxComponentContext,
+ "/org.openoffice.Office.PresenterScreen/",
+ PresenterConfigurationAccess::READ_WRITE);
+ aConfiguration.GoToChild("Presenter");
+ Any aValue;
+ switch (eViewMode)
+ {
+ default:
+ case VM_Standard:
+ aValue <<= sal_Int32(0);
+ break;
+
+ case VM_Notes:
+ aValue <<= sal_Int32(1);
+ break;
+
+ case VM_SlideOverview:
+ aValue <<= sal_Int32(2);
+ break;
+ }
+
+ aConfiguration.SetProperty ("InitialViewMode", aValue);
+ aConfiguration.CommitChanges();
+ }
+ catch (Exception&)
+ {
+ }
+}
+
+void PresenterWindowManager::AddLayoutListener (
+ const Reference<document::XEventListener>& rxListener)
+{
+ maLayoutListeners.push_back(rxListener);
+}
+
+void PresenterWindowManager::RemoveLayoutListener (
+ const Reference<document::XEventListener>& rxListener)
+{
+ // Assume that there are no multiple entries.
+ auto iListener = std::find(maLayoutListeners.begin(), maLayoutListeners.end(), rxListener);
+ if (iListener != maLayoutListeners.end())
+ maLayoutListeners.erase(iListener);
+}
+
+void PresenterWindowManager::Layout()
+{
+ if (!mxParentWindow.is() || mbIsLayouting)
+ return;
+
+ mbIsLayoutPending = false;
+ mbIsLayouting = true;
+ mxScaledBackgroundBitmap = nullptr;
+ mxClipPolygon = nullptr;
+
+ try
+ {
+ if (mbIsSlideSorterActive)
+ LayoutSlideSorterMode();
+ else if (mbIsHelpViewActive)
+ LayoutHelpMode();
+ else
+ switch (meLayoutMode)
+ {
+ case LM_Standard:
+ default:
+ LayoutStandardMode();
+ break;
+
+ case LM_Notes:
+ LayoutNotesMode();
+ break;
+ }
+ }
+ catch (Exception&)
+ {
+ OSL_ASSERT(false);
+ throw;
+ }
+
+ mbIsLayouting = false;
+}
+
+void PresenterWindowManager::LayoutStandardMode()
+{
+ awt::Rectangle aBox = mxParentWindow->getPosSize();
+
+ const double nGoldenRatio ((1 + sqrt(5.0)) / 2);
+ const double nGap (20);
+ const double nHorizontalSlideDivide (aBox.Width / nGoldenRatio);
+ double nSlidePreviewTop (0);
+
+
+ // For the current slide view calculate the outer height from the outer
+ // width. This takes into account the slide aspect ratio and thus has to
+ // go over the inner pane size.
+ PresenterPaneContainer::SharedPaneDescriptor pPane (
+ mpPaneContainer->FindPaneURL(PresenterPaneFactory::msCurrentSlidePreviewPaneURL));
+ if (pPane)
+ {
+ const awt::Size aCurrentSlideOuterBox(CalculatePaneSize(
+ nHorizontalSlideDivide - 1.5*nGap,
+ PresenterPaneFactory::msCurrentSlidePreviewPaneURL));
+ nSlidePreviewTop = (aBox.Height - aCurrentSlideOuterBox.Height) / 2;
+ double Temp=nGap;
+ /// check whether RTL interface or not
+ if(AllSettings::GetLayoutRTL())
+ Temp=aBox.Width - aCurrentSlideOuterBox.Width - nGap;
+ SetPanePosSizeAbsolute (
+ PresenterPaneFactory::msCurrentSlidePreviewPaneURL,
+ Temp,
+ nSlidePreviewTop,
+ aCurrentSlideOuterBox.Width,
+ aCurrentSlideOuterBox.Height);
+ }
+
+ // For the next slide view calculate the outer height from the outer
+ // width. This takes into account the slide aspect ratio and thus has to
+ // go over the inner pane size.
+ pPane = mpPaneContainer->FindPaneURL(PresenterPaneFactory::msNextSlidePreviewPaneURL);
+ if (pPane)
+ {
+ const awt::Size aNextSlideOuterBox (CalculatePaneSize(
+ aBox.Width - nHorizontalSlideDivide - 1.5*nGap,
+ PresenterPaneFactory::msNextSlidePreviewPaneURL));
+ double Temp=aBox.Width - aNextSlideOuterBox.Width - nGap;
+ /// check whether RTL interface or not
+ if(AllSettings::GetLayoutRTL())
+ Temp=nGap;
+ SetPanePosSizeAbsolute (
+ PresenterPaneFactory::msNextSlidePreviewPaneURL,
+ Temp,
+ nSlidePreviewTop,
+ aNextSlideOuterBox.Width,
+ aNextSlideOuterBox.Height);
+ }
+
+ LayoutToolBar();
+}
+
+void PresenterWindowManager::LayoutNotesMode()
+{
+ awt::Rectangle aBox = mxParentWindow->getPosSize();
+
+ const geometry::RealRectangle2D aToolBarBox (LayoutToolBar());
+
+ const double nGoldenRatio ((1 + sqrt(5.0)) / 2);
+ const double nGap (20);
+ const double nPrimaryWidth (aBox.Width / nGoldenRatio);
+ const double nSecondaryWidth (aBox.Width - nPrimaryWidth);
+ const double nTertiaryWidth (nSecondaryWidth / nGoldenRatio);
+ double nSlidePreviewTop (0);
+ double nNotesViewBottom (aToolBarBox.Y1 - nGap);
+ /// check whether RTL interface or not
+
+
+ // The notes view has no fixed aspect ratio.
+ PresenterPaneContainer::SharedPaneDescriptor pPane (
+ mpPaneContainer->FindPaneURL(PresenterPaneFactory::msNotesPaneURL));
+ if (pPane)
+ {
+ const geometry::RealSize2D aNotesViewOuterSize(
+ nPrimaryWidth - 1.5*nGap + 0.5,
+ nNotesViewBottom);
+ nSlidePreviewTop = (aBox.Height
+ - aToolBarBox.Y2 + aToolBarBox.Y1 - aNotesViewOuterSize.Height) / 2;
+ /// check whether RTL interface or not
+ double Temp=aBox.Width - aNotesViewOuterSize.Width - nGap;
+ if(AllSettings::GetLayoutRTL())
+ Temp=nGap;
+ SetPanePosSizeAbsolute (
+ PresenterPaneFactory::msNotesPaneURL,
+ Temp,
+ nSlidePreviewTop,
+ aNotesViewOuterSize.Width,
+ aNotesViewOuterSize.Height);
+ nNotesViewBottom = nSlidePreviewTop + aNotesViewOuterSize.Height;
+ }
+
+ // For the current slide view calculate the outer height from the outer
+ // width. This takes into account the slide aspect ratio and thus has to
+ // go over the inner pane size.
+ pPane = mpPaneContainer->FindPaneURL(PresenterPaneFactory::msCurrentSlidePreviewPaneURL);
+ if (pPane)
+ {
+ const awt::Size aCurrentSlideOuterBox(CalculatePaneSize(
+ nSecondaryWidth - 1.5*nGap,
+ PresenterPaneFactory::msCurrentSlidePreviewPaneURL));
+ /// check whether RTL interface or not
+ double Temp=nGap;
+ if(AllSettings::GetLayoutRTL())
+ Temp=aBox.Width - aCurrentSlideOuterBox.Width - nGap;
+ SetPanePosSizeAbsolute (
+ PresenterPaneFactory::msCurrentSlidePreviewPaneURL,
+ Temp,
+ nSlidePreviewTop,
+ aCurrentSlideOuterBox.Width,
+ aCurrentSlideOuterBox.Height);
+ }
+
+ // For the next slide view calculate the outer height from the outer
+ // width. This takes into account the slide aspect ratio and thus has to
+ // go over the inner pane size.
+ pPane = mpPaneContainer->FindPaneURL(PresenterPaneFactory::msNextSlidePreviewPaneURL);
+ if (!pPane)
+ return;
+
+ const awt::Size aNextSlideOuterBox (CalculatePaneSize(
+ nTertiaryWidth,
+ PresenterPaneFactory::msNextSlidePreviewPaneURL));
+ /// check whether RTL interface or not
+ double Temp=nGap;
+ if(AllSettings::GetLayoutRTL())
+ Temp=aBox.Width - aNextSlideOuterBox.Width - nGap;
+ SetPanePosSizeAbsolute (
+ PresenterPaneFactory::msNextSlidePreviewPaneURL,
+ Temp,
+ nNotesViewBottom - aNextSlideOuterBox.Height,
+ aNextSlideOuterBox.Width,
+ aNextSlideOuterBox.Height);
+
+
+}
+
+void PresenterWindowManager::LayoutSlideSorterMode()
+{
+ const geometry::RealRectangle2D aToolBarBox (LayoutToolBar());
+
+ awt::Rectangle aWindowBox = mxParentWindow->getPosSize();
+ const double nGap (20);
+ SetPanePosSizeAbsolute(
+ mpPaneContainer->GetPaneURLForViewURL(PresenterViewFactory::msSlideSorterURL),
+ nGap,
+ nGap,
+ aWindowBox.Width - 2*nGap,
+ aToolBarBox.Y1 - 2*nGap);
+}
+
+void PresenterWindowManager::LayoutHelpMode()
+{
+ const geometry::RealRectangle2D aToolBarBox (LayoutToolBar());
+
+ awt::Rectangle aWindowBox = mxParentWindow->getPosSize();
+ const double nGap (20);
+ const double nGoldenRatio ((1 + sqrt(5.0)) / 2);
+ const double nWidth = ::std::min(aWindowBox.Width - 2*nGap, aWindowBox.Width/nGoldenRatio);
+ SetPanePosSizeAbsolute(
+ mpPaneContainer->GetPaneURLForViewURL(PresenterViewFactory::msHelpViewURL),
+ (aWindowBox.Width - nWidth)/2,
+ nGap,
+ nWidth,
+ aToolBarBox.Y1 - 2*nGap);
+}
+
+geometry::RealRectangle2D PresenterWindowManager::LayoutToolBar()
+{
+ double nToolBarWidth (400);
+ double nToolBarHeight (80);
+
+ // Get access to the tool bar.
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor(
+ mpPaneContainer->FindPaneURL(PresenterPaneFactory::msToolBarPaneURL));
+ if (pDescriptor)
+ {
+ PresenterToolBarView* pToolBarView
+ = dynamic_cast<PresenterToolBarView*>(pDescriptor->mxView.get());
+ if (pToolBarView != nullptr && pToolBarView->GetPresenterToolBar().is())
+ {
+ geometry::RealSize2D aSize (pToolBarView->GetPresenterToolBar()->GetMinimalSize());
+
+ if (mpPaneBorderPainter.is())
+ {
+ const awt::Rectangle aBox (mpPaneBorderPainter->addBorder (
+ PresenterPaneFactory::msToolBarPaneURL,
+ awt::Rectangle(
+ 0,
+ 0,
+ PresenterGeometryHelper::Round(aSize.Width),
+ PresenterGeometryHelper::Round(aSize.Height)),
+ css::drawing::framework::BorderType_TOTAL_BORDER));
+
+ nToolBarWidth = aBox.Width;
+ nToolBarHeight = aBox.Height;
+ }
+ else
+ {
+ nToolBarWidth = aSize.Width + 20;
+ nToolBarHeight = aSize.Height + 10;
+ }
+ }
+ }
+
+ const awt::Rectangle aBox = mxParentWindow->getPosSize();
+ const double nToolBarX ((aBox.Width - nToolBarWidth) / 2);
+ const double nToolBarY (aBox.Height - nToolBarHeight);
+ SetPanePosSizeAbsolute(
+ PresenterPaneFactory::msToolBarPaneURL,
+ nToolBarX,
+ nToolBarY,
+ nToolBarWidth,
+ nToolBarHeight);
+
+ return geometry::RealRectangle2D(
+ nToolBarX,
+ nToolBarY,
+ nToolBarX + nToolBarWidth - 1,
+ nToolBarY + nToolBarHeight - 1);
+}
+
+awt::Size PresenterWindowManager::CalculatePaneSize (
+ const double nOuterWidth,
+ const OUString& rsPaneURL)
+{
+ // Calculate the inner width by removing the pane border.
+ awt::Rectangle aInnerBox (mpPaneBorderPainter->RemoveBorder (
+ rsPaneURL,
+ awt::Rectangle(0,0,
+ sal_Int32(nOuterWidth+0.5),sal_Int32(nOuterWidth)),
+ drawing::framework::BorderType_TOTAL_BORDER));
+
+ // Calculate the inner height with the help of the slide aspect ratio.
+ const double nCurrentSlideInnerHeight (
+ aInnerBox.Width / mpPresenterController->GetSlideAspectRatio());
+
+ // Add the pane border to get the outer box.
+ awt::Rectangle aOuterBox (mpPaneBorderPainter->AddBorder (
+ rsPaneURL,
+ awt::Rectangle(0,0,
+ aInnerBox.Width,sal_Int32(nCurrentSlideInnerHeight+0.5)),
+ drawing::framework::BorderType_TOTAL_BORDER));
+
+ return awt::Size(aOuterBox.Width, aOuterBox.Height);
+}
+
+void PresenterWindowManager::NotifyLayoutModeChange()
+{
+ document::EventObject aEvent;
+ aEvent.Source = Reference<XInterface>(static_cast<XWeak*>(this));
+
+ LayoutListenerContainer aContainerCopy (maLayoutListeners);
+ for (const auto& rxListener : aContainerCopy)
+ {
+ if (rxListener.is())
+ {
+ try
+ {
+ rxListener->notifyEvent(aEvent);
+ }
+ catch (lang::DisposedException&)
+ {
+ RemoveLayoutListener(rxListener);
+ }
+ catch (RuntimeException&)
+ {
+ }
+ }
+ }
+}
+
+void PresenterWindowManager::NotifyDisposing()
+{
+ lang::EventObject aEvent;
+ aEvent.Source = static_cast<XWeak*>(this);
+
+ LayoutListenerContainer aContainer;
+ aContainer.swap(maLayoutListeners);
+ for (auto& rxListener : aContainer)
+ {
+ if (rxListener.is())
+ {
+ try
+ {
+ rxListener->disposing(aEvent);
+ }
+ catch (lang::DisposedException&)
+ {
+ }
+ catch (RuntimeException&)
+ {
+ }
+ }
+ }
+}
+
+void PresenterWindowManager::UpdateWindowSize (const Reference<awt::XWindow>& rxBorderWindow)
+{
+ PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
+ mpPaneContainer->FindBorderWindow(rxBorderWindow));
+ if (pDescriptor)
+ {
+ mxClipPolygon = nullptr;
+
+ // ToTop is called last because it may invalidate the iterator.
+ if ( ! mbIsLayouting)
+ mpPaneContainer->ToTop(pDescriptor);
+ }
+}
+
+void PresenterWindowManager::PaintBackground (const awt::Rectangle& rUpdateBox)
+{
+ if ( ! mxParentWindow.is())
+ return;
+
+ Reference<rendering::XGraphicDevice> xDevice (mxParentCanvas->getDevice());
+ if ( ! xDevice.is())
+ return;
+
+ // Create a polygon for the background and for clipping.
+ Reference<rendering::XPolyPolygon2D> xBackgroundPolygon (
+ PresenterGeometryHelper::CreatePolygon(mxParentWindow->getPosSize(), xDevice));
+ if ( ! mxClipPolygon.is())
+ mxClipPolygon = CreateClipPolyPolygon();
+
+ // Create View- and RenderState structs.
+ const rendering::ViewState aViewState(
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ PresenterGeometryHelper::CreatePolygon(rUpdateBox, xDevice));
+ rendering::RenderState aRenderState (
+ geometry::AffineMatrix2D(1,0,0, 0,1,0),
+ mxClipPolygon,
+ Sequence<double>(4),
+ rendering::CompositeOperation::SOURCE);
+
+ // Paint the background.
+ if (!mpBackgroundBitmap)
+ return;
+
+ ProvideBackgroundBitmap();
+
+ if (mxScaledBackgroundBitmap.is())
+ {
+ const geometry::IntegerSize2D aBitmapSize(mxScaledBackgroundBitmap->getSize());
+ Sequence<rendering::Texture> aTextures
+ {
+ {
+ geometry::AffineMatrix2D( aBitmapSize.Width,0,0, 0,aBitmapSize.Height,0),
+ 1,
+ 0,
+ mxScaledBackgroundBitmap,
+ nullptr,
+ nullptr,
+ rendering::StrokeAttributes(),
+ rendering::TexturingMode::REPEAT,
+ rendering::TexturingMode::REPEAT
+ }
+ };
+
+ mxParentCanvas->fillTexturedPolyPolygon(
+ xBackgroundPolygon,
+ aViewState,
+ aRenderState,
+ aTextures);
+ }
+ else
+ {
+ const util::Color aBackgroundColor (mpBackgroundBitmap->maReplacementColor);
+ auto pDeviceColor = aRenderState.DeviceColor.getArray();
+ pDeviceColor[0] = ((aBackgroundColor >> 16) & 0x0ff) / 255.0;
+ pDeviceColor[1] = ((aBackgroundColor >> 8) & 0x0ff) / 255.0;
+ pDeviceColor[2] = ((aBackgroundColor >> 0) & 0x0ff) / 255.0;
+ pDeviceColor[3] = ((aBackgroundColor >> 24) & 0x0ff) / 255.0;
+ mxParentCanvas->fillPolyPolygon(
+ xBackgroundPolygon,
+ aViewState,
+ aRenderState);
+ }
+}
+
+void PresenterWindowManager::ProvideBackgroundBitmap()
+{
+ if ( mxScaledBackgroundBitmap.is())
+ return;
+
+ Reference<rendering::XBitmap> xBitmap (mpBackgroundBitmap->GetNormalBitmap());
+ if (!xBitmap.is())
+ return;
+
+ const bool bStretchVertical (mpBackgroundBitmap->meVerticalTexturingMode
+ == PresenterBitmapDescriptor::Stretch);
+ const bool bStretchHorizontal (mpBackgroundBitmap->meHorizontalTexturingMode
+ == PresenterBitmapDescriptor::Stretch);
+ if (bStretchHorizontal || bStretchVertical)
+ {
+ geometry::RealSize2D aSize;
+ if (bStretchVertical)
+ aSize.Height = mxParentWindow->getPosSize().Height;
+ else
+ aSize.Height = xBitmap->getSize().Height;
+ if (bStretchHorizontal)
+ aSize.Width = mxParentWindow->getPosSize().Width;
+ else
+ aSize.Width = xBitmap->getSize().Width;
+ mxScaledBackgroundBitmap = xBitmap->getScaledBitmap(aSize, false);
+ }
+ else
+ {
+ mxScaledBackgroundBitmap = xBitmap;
+ }
+}
+
+Reference<rendering::XPolyPolygon2D> PresenterWindowManager::CreateClipPolyPolygon() const
+{
+ // Create a clip polygon that includes the whole update area but has the
+ // content windows as holes.
+ const sal_Int32 nPaneCount (mpPaneContainer->maPanes.size());
+ ::std::vector<awt::Rectangle> aRectangles;
+ aRectangles.reserve(1+nPaneCount);
+ aRectangles.push_back(mxParentWindow->getPosSize());
+ for (const auto& pDescriptor : mpPaneContainer->maPanes)
+ {
+ if ( ! pDescriptor->mbIsActive)
+ continue;
+ if ( ! pDescriptor->mbIsOpaque)
+ continue;
+ if ( ! pDescriptor->mxBorderWindow.is() || ! pDescriptor->mxContentWindow.is())
+ continue;
+ Reference<awt::XWindow2> xWindow (pDescriptor->mxBorderWindow, UNO_QUERY);
+ if (xWindow.is() && ! xWindow->isVisible())
+ continue;
+
+ const awt::Rectangle aOuterBorderBox (pDescriptor->mxBorderWindow->getPosSize());
+ awt::Rectangle aInnerBorderBox (pDescriptor->mxContentWindow->getPosSize());
+ aInnerBorderBox.X += aOuterBorderBox.X;
+ aInnerBorderBox.Y += aOuterBorderBox.Y;
+ aRectangles.push_back(aInnerBorderBox);
+ }
+ Reference<rendering::XPolyPolygon2D> xPolyPolygon (
+ PresenterGeometryHelper::CreatePolygon(
+ aRectangles,
+ mxParentCanvas->getDevice()));
+ if (xPolyPolygon.is())
+ xPolyPolygon->setFillRule(rendering::FillRule_EVEN_ODD);
+ return xPolyPolygon;
+}
+
+void PresenterWindowManager::Update()
+{
+ mxClipPolygon = nullptr;
+ mbIsLayoutPending = true;
+
+ mpPresenterController->GetPaintManager()->Invalidate(mxParentWindow);
+}
+
+void PresenterWindowManager::ThrowIfDisposed() const
+{
+ if (rBHelper.bDisposed || rBHelper.bInDispose)
+ {
+ throw lang::DisposedException (
+ "PresenterWindowManager has already been disposed",
+ const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
+ }
+}
+
+} // end of namespace ::sdext::presenter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/PresenterWindowManager.hxx b/sdext/source/presenter/PresenterWindowManager.hxx
new file mode 100644
index 000000000..9c032e6df
--- /dev/null
+++ b/sdext/source/presenter/PresenterWindowManager.hxx
@@ -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/.
+ *
+ * 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_SDEXT_SOURCE_PRESENTER_PRESENTERWINDOWMANAGER_HXX
+#define INCLUDED_SDEXT_SOURCE_PRESENTER_PRESENTERWINDOWMANAGER_HXX
+
+#include "PresenterPaneContainer.hxx"
+#include "PresenterTheme.hxx"
+#include <com/sun/star/awt/Size.hpp>
+#include <com/sun/star/awt/XFocusListener.hpp>
+#include <com/sun/star/awt/XPaintListener.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/document/XEventListener.hpp>
+#include <com/sun/star/drawing/framework/XPane.hpp>
+#include <com/sun/star/rendering/XBitmap.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
+#include <rtl/ref.hxx>
+#include <memory>
+
+namespace sdext::presenter {
+
+class PresenterController;
+class PresenterPaneBorderPainter;
+class PresenterTheme;
+
+typedef ::cppu::WeakComponentImplHelper<
+ css::awt::XWindowListener,
+ css::awt::XPaintListener,
+ css::awt::XMouseListener,
+ css::awt::XFocusListener
+> PresenterWindowManagerInterfaceBase;
+
+/** A simple manager of the positions of the panes of the presenter screen.
+ Uses relative coordinates of the four sides of each pane. Allows panes
+ to be moved or resized with the mouse.
+*/
+class PresenterWindowManager
+ : protected ::cppu::BaseMutex,
+ public PresenterWindowManagerInterfaceBase
+{
+public:
+ PresenterWindowManager (
+ const css::uno::Reference<css::uno::XComponentContext>& rxContext,
+ const ::rtl::Reference<PresenterPaneContainer>& rpPaneContainer,
+ const ::rtl::Reference<PresenterController>& rpPresenterController);
+ virtual ~PresenterWindowManager() override;
+ PresenterWindowManager(const PresenterWindowManager&) = delete;
+ PresenterWindowManager& operator=(const PresenterWindowManager&) = delete;
+
+ void SAL_CALL disposing() override;
+
+ void SetParentPane (const css::uno::Reference<css::drawing::framework::XPane>& rxPane);
+ void SetTheme (const std::shared_ptr<PresenterTheme>& rpTheme);
+ void NotifyViewCreation (const css::uno::Reference<css::drawing::framework::XView>& rxView);
+ void SetPanePosSizeAbsolute (
+ const OUString& rsPaneURL,
+ const double nX,
+ const double nY,
+ const double nWidth,
+ const double nHeight);
+ void SetPaneBorderPainter (const ::rtl::Reference<PresenterPaneBorderPainter>& rPainter);
+ void Update();
+ void Layout();
+
+ void SetSlideSorterState (bool bIsActive);
+ void SetHelpViewState (bool bIsActive);
+ void SetPauseState (bool bIsPaused);
+
+ enum LayoutMode { LM_Standard, LM_Notes, LM_Generic };
+private:
+ void SetLayoutMode (const LayoutMode eMode);
+
+public:
+ enum ViewMode { VM_Standard, VM_Notes, VM_SlideOverview, VM_Help };
+ /** The high-level method to switch the view mode. Use this instead of
+ SetLayoutMode and Set(Help|SlideSorter)State when possible.
+ */
+ void SetViewMode (const ViewMode eMode);
+
+ ViewMode GetViewMode() const;
+
+ /** Restore the layout mode (or slide sorter state) from the
+ configuration.
+ */
+ void RestoreViewMode();
+
+ void AddLayoutListener (
+ const css::uno::Reference<css::document::XEventListener>& rxListener);
+ void RemoveLayoutListener (
+ const css::uno::Reference<css::document::XEventListener>& rxListener);
+
+ // XWindowListener
+
+ virtual void SAL_CALL windowResized (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowMoved (const css::awt::WindowEvent& rEvent) override;
+
+ virtual void SAL_CALL windowShown (const css::lang::EventObject& rEvent) override;
+
+ virtual void SAL_CALL windowHidden (const css::lang::EventObject& rEvent) override;
+
+ // XPaintListener
+
+ virtual void SAL_CALL windowPaint (const css::awt::PaintEvent& rEvent) override;
+
+ // XMouseListener
+
+ virtual void SAL_CALL mousePressed (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseReleased (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseEntered (const css::awt::MouseEvent& rEvent) override;
+
+ virtual void SAL_CALL mouseExited (const css::awt::MouseEvent& rEvent) override;
+
+ // XFocusListener
+
+ virtual void SAL_CALL focusGained (const css::awt::FocusEvent& rEvent) override;
+
+ virtual void SAL_CALL focusLost (const css::awt::FocusEvent& rEvent) override;
+
+ // XEventListener
+
+ virtual void SAL_CALL disposing (
+ const css::lang::EventObject& rEvent) override;
+
+private:
+ css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
+ ::rtl::Reference<PresenterController> mpPresenterController;
+ css::uno::Reference<css::awt::XWindow> mxParentWindow;
+ css::uno::Reference<css::rendering::XCanvas> mxParentCanvas;
+ css::uno::Reference<css::uno::XInterface> mxPaneBorderManager;
+ ::rtl::Reference<PresenterPaneBorderPainter> mpPaneBorderPainter;
+ ::rtl::Reference<PresenterPaneContainer> mpPaneContainer;
+ bool mbIsLayoutPending;
+ /** This flag is set to <TRUE/> while the Layout() method is being
+ executed. Prevents windowMoved() and windowResized() from changing
+ the window sizes.
+ */
+ bool mbIsLayouting;
+ std::shared_ptr<PresenterTheme> mpTheme;
+ SharedBitmapDescriptor mpBackgroundBitmap;
+ css::uno::Reference<css::rendering::XBitmap> mxScaledBackgroundBitmap;
+ css::uno::Reference<css::rendering::XPolyPolygon2D> mxClipPolygon;
+ LayoutMode meLayoutMode;
+ bool mbIsSlideSorterActive;
+ bool mbIsHelpViewActive;
+ bool mbisPaused;
+ typedef ::std::vector<css::uno::Reference<css::document::XEventListener> >
+ LayoutListenerContainer;
+ LayoutListenerContainer maLayoutListeners;
+ bool mbIsMouseClickPending;
+
+ void PaintChildren (const css::awt::PaintEvent& rEvent) const;
+ void UpdateWindowSize (const css::uno::Reference<css::awt::XWindow>& rxBorderWindow);
+ void PaintBackground (const css::awt::Rectangle& rUpdateBox);
+ void ProvideBackgroundBitmap();
+ css::uno::Reference<css::rendering::XPolyPolygon2D> CreateClipPolyPolygon() const;
+
+ void StoreViewMode (const ViewMode eViewMode);
+
+ void LayoutStandardMode();
+ void LayoutNotesMode();
+ void LayoutSlideSorterMode();
+ void LayoutHelpMode();
+
+ /** Layout the tool bar and return its outer bounding box.
+ */
+ css::geometry::RealRectangle2D LayoutToolBar();
+
+ css::awt::Size CalculatePaneSize (
+ const double nOuterWidth,
+ const OUString& rsPaneURL);
+
+ /** Notify changes of the layout mode and of the slide sorter state.
+ */
+ void NotifyLayoutModeChange();
+
+ void NotifyDisposing();
+
+ /// @throws css::lang::DisposedException
+ void ThrowIfDisposed() const;
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/presenter/presenter.component b/sdext/source/presenter/presenter.component
new file mode 100644
index 000000000..01e18b38e
--- /dev/null
+++ b/sdext/source/presenter/presenter.component
@@ -0,0 +1,18 @@
+<?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.PresenterScreenJob"
+ constructor="sdext_PresenterScreenJob_get_implementation" />
+ <implementation name="org.libreoffice.comp.PresenterScreenProtocolHandler"
+ constructor="sdext_PresenterProtocolHandler_get_implementation">
+ <service name="com.sun.star.frame.ProtocolHandler"/>
+ </implementation>
+</component>